From 08aa4418c30cfc18ccc69a0f0f9cb9e17be6c196 Mon Sep 17 00:00:00 2001
From: Pierre Schmitz <pierre@archlinux.de>
Date: Mon, 12 Aug 2013 09:28:15 +0200
Subject: Update to MediaWiki 1.21.1

---
 maintenance/mssql/tables.sql | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

(limited to 'maintenance/mssql/tables.sql')

diff --git a/maintenance/mssql/tables.sql b/maintenance/mssql/tables.sql
index a0c3d17b..ad996175 100644
--- a/maintenance/mssql/tables.sql
+++ b/maintenance/mssql/tables.sql
@@ -76,10 +76,10 @@ CREATE TABLE /*$wgDBprefix*/user_newtalk (
 CREATE INDEX /*$wgDBprefix*/user_group_id ON /*$wgDBprefix*/user_newtalk([user_id]);
 CREATE INDEX /*$wgDBprefix*/user_ip       ON /*$wgDBprefix*/user_newtalk(user_ip);
 
--- 
+--
 -- User preferences and other fun stuff
 -- replaces old user.user_options BLOB
--- 
+--
 CREATE TABLE /*$wgDBprefix*/user_properties (
 	up_user INT NOT NULL,
 	up_property NVARCHAR(32) NOT NULL,
@@ -157,7 +157,7 @@ CREATE TABLE /*$wgDBprefix*/text (
 -- The fields generally correspond to the page, revision, and text
 -- fields, with several caveats.
 -- Cannot reasonably create views on this table, due to the presence of TEXT
--- columns. 
+-- columns.
 CREATE TABLE /*$wgDBprefix*/archive (
    ar_namespace SMALLINT NOT NULL DEFAULT 0,
    ar_title NVARCHAR(255) NOT NULL DEFAULT '',
@@ -234,7 +234,7 @@ CREATE INDEX /*$wgDBprefix*/cl_sortkey   ON /*$wgDBprefix*/categorylinks(cl_to,c
 CREATE INDEX /*$wgDBprefix*/cl_timestamp ON /*$wgDBprefix*/categorylinks(cl_to,cl_timestamp);
 --;
 
--- 
+--
 -- Track all existing categories.  Something is a category if 1) it has an en-
 -- try somewhere in categorylinks, or 2) it once did.  Categories might not
 -- have corresponding pages, so they need to be tracked separately.
@@ -279,16 +279,16 @@ CREATE TABLE /*$wgDBprefix*/valid_tag (
   vt_tag varchar(255) NOT NULL PRIMARY KEY
 );
 
--- 
+--
 -- Table for storing localisation data
--- 
+--
 CREATE TABLE /*$wgDBprefix*/l10n_cache (
 	-- language code
 	lc_lang NVARCHAR(32) NOT NULL,
-	
+
 	-- cache key
 	lc_key NVARCHAR(255) NOT NULL,
-	
+
 	-- Value
 	lc_value TEXT NOT NULL DEFAULT '',
 );
@@ -305,9 +305,9 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
 -- Maximum key length ON SQL Server is 900 bytes
 CREATE INDEX /*$wgDBprefix*/externallinks_index   ON /*$wgDBprefix*/externallinks(el_index);
 
--- 
+--
 -- Track external user accounts, if ExternalAuth is used
--- 
+--
 CREATE TABLE /*$wgDBprefix*/external_user (
 	-- Foreign key to user_id
 	eu_local_id INT NOT NULL PRIMARY KEY,
@@ -327,16 +327,16 @@ CREATE TABLE /*$wgDBprefix*/langlinks (
 );
 CREATE UNIQUE INDEX /*$wgDBprefix*/langlinks_reverse_key ON /*$wgDBprefix*/langlinks(ll_lang,ll_title);
 
--- 
+--
 -- Track inline interwiki links
--- 
+--
 CREATE TABLE /*$wgDBprefix*/iwlinks (
 	-- page_id of the referring page
 	iwl_from INT NOT NULL DEFAULT 0,
-	
+
 	-- Interwiki prefix code of the target
 	iwl_prefix NVARCHAR(20) NOT NULL DEFAULT '',
-	
+
 	-- Title of the target, including namespace
 	iwl_title NVARCHAR(255) NOT NULL DEFAULT '',
 );
@@ -728,7 +728,7 @@ CREATE TABLE /*$wgDBprefix*/updatelog (
   PRIMARY KEY (ul_key)
 );
 
--- NOTE To enable full text indexing on SQL 2008 you need to create an account FDH$MSSQLSERVER 
+-- NOTE To enable full text indexing on SQL 2008 you need to create an account FDH$MSSQLSERVER
 -- AND assign a password for the FDHOST process to run under
 -- Once you have assigned a password to that account, you need to run the following stored procedure
 -- replacing XXXXX with the password you used.
-- 
cgit v1.2.3-54-g00ecf


From 4ac9fa081a7c045f6a9f1cfc529d82423f485b2e Mon Sep 17 00:00:00 2001
From: Pierre Schmitz <pierre@archlinux.de>
Date: Sun, 8 Dec 2013 09:55:49 +0100
Subject: Update to MediaWiki 1.22.0

---
 .gitreview                                         |    2 +-
 .jshintignore                                      |    8 +-
 .jshintrc                                          |   34 +-
 COPYING                                            |   38 +
 CREDITS                                            |   18 +-
 HISTORY                                            |  335 +-
 README                                             |  143 +-
 README.mediawiki                                   |  123 +-
 RELEASE-NOTES-1.21                                 |  443 -
 RELEASE-NOTES-1.22                                 |  610 ++
 UPGRADE                                            |   15 -
 api.php                                            |   12 +-
 composer-example.json                              |   11 +
 composer.json                                      |   30 -
 docs/hooks.txt                                     |  190 +-
 docs/maintenance.txt                               |    4 +-
 docs/php-memcached/Documentation                   |    2 +-
 docs/scripts.txt                                   |   10 -
 docs/skin.txt                                      |   68 +-
 docs/title.txt                                     |    8 +-
 docs/uidesign/child-selector-emu.html              |    3 +-
 docs/uidesign/design.html                          |    7 +-
 docs/uidesign/mediawiki.action.history.diff.html   |    7 +-
 docs/uidesign/monospace.html                       |    5 +-
 docs/uidesign/table-layout.html                    |    3 +-
 docs/upload.txt                                    |    2 -
 extensions/Cite/.jshintignore                      |    1 +
 extensions/Cite/.jshintrc                          |   34 +
 extensions/Cite/Cite.i18n.php                      | 1281 +--
 extensions/Cite/Cite.php                           |   44 +-
 extensions/Cite/Cite_body.php                      |   27 +-
 extensions/Cite/SpecialCite.alias.php              |   13 +-
 extensions/Cite/SpecialCite.i18n.php               |  584 +-
 extensions/Cite/SpecialCite.php                    |    6 +-
 extensions/Cite/citeCatTreeParserTests.txt         |   27 -
 extensions/Cite/citeParserTests.txt                |   36 +-
 extensions/Cite/modules/ext.cite.css               |   16 +
 extensions/Cite/modules/ext.cite.js                |   38 +
 extensions/Cite/modules/ext.cite.popups.js         |   13 +
 extensions/Cite/modules/ext.cite/ext.cite.js       |   12 -
 extensions/Cite/modules/ext.rtlcite.css            |    6 +
 .../Cite/modules/ext.rtlcite/ext.rtlcite.css       |    6 -
 extensions/Cite/modules/ext.specialcite.css        |   14 +
 .../modules/ext.specialcite/ext.specialcite.css    |   14 -
 extensions/ConfirmEdit/ApiFancyCaptchaReload.php   |    2 +-
 extensions/ConfirmEdit/Asirra.class.php            |    2 +-
 extensions/ConfirmEdit/Asirra.i18n.php             |  315 +-
 extensions/ConfirmEdit/Captcha.php                 |   88 +-
 extensions/ConfirmEdit/ConfirmEdit.alias.php       |    8 +-
 extensions/ConfirmEdit/ConfirmEdit.i18n.php        |  440 +-
 extensions/ConfirmEdit/FancyCaptcha.i18n.php       |  932 +-
 extensions/ConfirmEdit/FancyCaptcha.php            |   11 +
 extensions/ConfirmEdit/MathCaptcha.class.php       |    2 +-
 extensions/ConfirmEdit/QuestyCaptcha.i18n.php      |  634 +-
 extensions/ConfirmEdit/ReCaptcha.i18n.php          |  422 +-
 extensions/ConfirmEdit/blacklist                   |   40 +
 extensions/ConfirmEdit/captcha.py                  |   14 +-
 .../resources/ext.confirmEdit.asirra.js            |    7 +-
 extensions/FluxBBAuthPlugin.php                    |    7 +-
 extensions/Gadgets/ApiQueryGadgets.php             |    4 +
 extensions/Gadgets/GadgetHooks.php                 |  257 +
 extensions/Gadgets/Gadgets.alias.php               |   13 +-
 extensions/Gadgets/Gadgets.i18n.php                |  348 +-
 extensions/Gadgets/Gadgets.php                     |    4 +-
 extensions/Gadgets/Gadgets_body.php                |  264 +-
 extensions/Gadgets/README                          |    2 +-
 extensions/ImageMap/ImageMap.i18n.php              |   65 +-
 extensions/ImageMap/ImageMap.php                   |   16 +
 extensions/ImageMap/ImageMap_body.php              |    6 +-
 extensions/InputBox/InputBox.i18n.php              |   88 +-
 extensions/Interwiki/Interwiki.alias.php           |   11 +
 extensions/Interwiki/Interwiki.i18n.php            |  355 +-
 extensions/Interwiki/Interwiki.php                 |   13 +-
 extensions/Interwiki/Interwiki_body.php            |   90 +-
 .../LocalisationUpdate.class.php                   |   16 +-
 .../LocalisationUpdate/LocalisationUpdate.i18n.php |   13 +-
 .../LocalisationUpdate/LocalisationUpdate.php      |    6 +-
 extensions/Nuke/Nuke.alias.php                     |    8 +-
 extensions/Nuke/Nuke.i18n.php                      |  308 +-
 .../ParserFunctions/ParserFunctions.i18n.magic.php |  190 +-
 .../ParserFunctions/ParserFunctions.i18n.php       |  131 +-
 .../ParserFunctions/ParserFunctions_body.php       |    6 +-
 extensions/PdfHandler/PdfHandler.i18n.php          |   53 +-
 extensions/PdfHandler/PdfHandler_body.php          |    2 +-
 extensions/Poem/Poem.i18n.php                      |   14 +-
 extensions/README                                  |    2 +-
 extensions/Renameuser/README                       |    2 +-
 extensions/Renameuser/Renameuser.alias.php         |   17 +-
 extensions/Renameuser/Renameuser.i18n.php          |  275 +-
 extensions/Renameuser/RenameuserSQL.php            |    2 +-
 extensions/SimpleAntiSpam/SimpleAntiSpam.i18n.php  |   37 +-
 extensions/SpamBlacklist/README                    |   31 +-
 extensions/SpamBlacklist/SpamBlacklist.i18n.php    |  670 +-
 extensions/SpamBlacklist/SpamBlacklist.php         |   33 +-
 extensions/SpamBlacklist/SpamBlacklistHooks.php    |  125 +-
 extensions/SpamBlacklist/SpamBlacklist_body.php    |   90 +-
 .../SyntaxHighlight_GeSHi.class.php                |   48 +-
 .../SyntaxHighlight_GeSHi.i18n.php                 |   35 +-
 .../SyntaxHighlight_GeSHi.php                      |    5 +-
 extensions/SyntaxHighlight_GeSHi/geshi/geshi.php   |    2 +-
 .../SyntaxHighlight_GeSHi/geshi/geshi/haskell.php  |   10 +-
 extensions/TitleBlacklist/TitleBlacklist.i18n.php  |  137 +-
 extensions/TitleBlacklist/TitleBlacklist.list.php  |   20 +-
 extensions/TitleBlacklist/TitleBlacklist.php       |    4 +
 .../tests/ApiQueryTitleBlacklistTest.php           |   22 +
 extensions/TitleBlacklist/tests/testSource         |    1 +
 extensions/Vector/.gitreview                       |    5 -
 extensions/Vector/README                           |   17 -
 extensions/Vector/Vector.hooks.php                 |  174 -
 extensions/Vector/Vector.i18n.php                  | 2467 -----
 extensions/Vector/Vector.php                       |  129 -
 .../Vector/modules/ext.vector.collapsibleNav.css   |   92 -
 .../Vector/modules/ext.vector.collapsibleNav.js    |  253 -
 .../Vector/modules/ext.vector.collapsibleTabs.js   |   29 -
 .../Vector/modules/ext.vector.expandableSearch.css |   11 -
 .../Vector/modules/ext.vector.expandableSearch.js  |   72 -
 .../Vector/modules/ext.vector.footerCleanup.css    |   72 -
 .../Vector/modules/ext.vector.footerCleanup.js     |   31 -
 .../Vector/modules/ext.vector.sectionEditLinks.css |   19 -
 .../Vector/modules/ext.vector.sectionEditLinks.js  |   66 -
 extensions/Vector/modules/images/closed-ltr.png    |  Bin 143 -> 0 bytes
 extensions/Vector/modules/images/closed-rtl.png    |  Bin 145 -> 0 bytes
 extensions/Vector/modules/images/edit-faded.png    |  Bin 425 -> 0 bytes
 extensions/Vector/modules/images/edit.png          |  Bin 428 -> 0 bytes
 extensions/Vector/modules/images/open.png          |  Bin 145 -> 0 bytes
 extensions/Vector/modules/images/portal-break.png  |  Bin 203 -> 0 bytes
 .../Vector/modules/jquery.collapsibleTabs.js       |  206 -
 .../Vector/modules/jquery.footerCollapsibleList.js |   44 -
 extensions/Vector/switchExperimentPrefs.php        |   63 -
 extensions/WikiEditor/.jshintignore                |    2 +
 extensions/WikiEditor/.jshintrc                    |   32 +-
 extensions/WikiEditor/WikiEditor.hooks.php         |    8 +-
 extensions/WikiEditor/WikiEditor.i18n.php          | 2031 +++--
 extensions/WikiEditor/WikiEditor.php               |    1 +
 extensions/WikiEditor/modules/ext.wikiEditor.css   |    9 +-
 .../WikiEditor/modules/ext.wikiEditor.dialogs.js   |    7 +-
 .../WikiEditor/modules/ext.wikiEditor.highlight.js |    3 +-
 extensions/WikiEditor/modules/ext.wikiEditor.js    |    3 +-
 .../WikiEditor/modules/ext.wikiEditor.preview.js   |    3 +-
 .../modules/ext.wikiEditor.previewDialog.js        |    3 +-
 .../WikiEditor/modules/ext.wikiEditor.publish.js   |    3 +-
 .../modules/ext.wikiEditor.templateEditor.js       |   19 +-
 .../WikiEditor/modules/ext.wikiEditor.templates.js |   19 +-
 .../modules/ext.wikiEditor.tests.toolbar.js        |   16 +-
 .../WikiEditor/modules/ext.wikiEditor.toc.js       |    3 +-
 .../modules/ext.wikiEditor.toolbar.hideSig.js      |    4 +-
 .../WikiEditor/modules/ext.wikiEditor.toolbar.js   |    3 +-
 .../images/dialogs/insert-disambiguation.png       |  Bin 0 -> 831 bytes
 .../WikiEditor/modules/jquery.wikiEditor.css       |    3 -
 .../modules/jquery.wikiEditor.dialogs.config.css   |    8 +-
 .../modules/jquery.wikiEditor.dialogs.config.js    |  124 +-
 .../modules/jquery.wikiEditor.dialogs.js           |   34 +-
 .../modules/jquery.wikiEditor.highlight.js         |   41 +-
 .../WikiEditor/modules/jquery.wikiEditor.iframe.js |  202 +-
 extensions/WikiEditor/modules/jquery.wikiEditor.js |   44 +-
 .../modules/jquery.wikiEditor.preview.js           |   15 +-
 .../modules/jquery.wikiEditor.previewDialog.js     |   15 +-
 .../modules/jquery.wikiEditor.publish.js           |   13 +-
 .../modules/jquery.wikiEditor.templateEditor.js    |  137 +-
 .../modules/jquery.wikiEditor.templates.js         |   51 +-
 .../WikiEditor/modules/jquery.wikiEditor.toc.js    |  136 +-
 .../modules/jquery.wikiEditor.toolbar.config.js    |   10 +-
 .../modules/jquery.wikiEditor.toolbar.js           |   98 +-
 img_auth.php                                       |    8 +-
 includes/Action.php                                |   57 +-
 includes/AjaxDispatcher.php                        |   10 +-
 includes/AjaxResponse.php                          |    2 +-
 includes/ArrayUtils.php                            |    2 +-
 includes/Article.php                               |  147 +-
 includes/AuthPlugin.php                            |   13 +
 includes/AutoLoader.php                            |  147 +-
 includes/Autopromote.php                           |    5 +-
 includes/Block.php                                 |  308 +-
 includes/CallableUpdate.php                        |   30 +
 includes/Category.php                              |    3 +-
 includes/CategoryPage.php                          |    8 +-
 includes/CategoryViewer.php                        |   60 +-
 includes/Cdb.php                                   |    4 +-
 includes/Cdb_PHP.php                               |   16 +-
 includes/ChangeTags.php                            |   75 +-
 includes/ChangesFeed.php                           |   37 +-
 includes/ChangesList.php                           | 1304 ---
 includes/Collation.php                             |   22 +-
 includes/ConfEditor.php                            |   55 +-
 includes/Cookie.php                                |    7 +-
 includes/CryptRand.php                             |  497 -
 includes/DataUpdate.php                            |    4 +-
 includes/DefaultSettings.php                       | 1309 ++-
 includes/DeferredUpdates.php                       |   12 +-
 includes/Defines.php                               |   11 +-
 includes/EditPage.php                              |  290 +-
 includes/Exception.php                             |  275 +-
 includes/Export.php                                |   33 +-
 includes/ExternalEdit.php                          |  132 -
 includes/ExternalUser.php                          |  309 -
 includes/Fallback.php                              |   28 +-
 includes/Feed.php                                  |   26 +-
 includes/FeedUtils.php                             |   27 +-
 includes/FileDeleteForm.php                        |   36 +-
 includes/ForkController.php                        |    4 +-
 includes/FormOptions.php                           |  163 +-
 includes/GitInfo.php                               |   39 +-
 includes/GlobalFunctions.php                       |  675 +-
 includes/HTMLForm.php                              |  541 +-
 includes/HashRing.php                              |  142 +
 includes/HistoryBlob.php                           |   35 +-
 includes/Hooks.php                                 |  282 +-
 includes/Html.php                                  |  179 +-
 includes/HtmlFormatter.php                         |  356 +
 includes/HttpFunctions.php                         |  118 +-
 includes/IP.php                                    |   32 +-
 includes/ImageGallery.php                          |  416 -
 includes/ImagePage.php                             |   49 +-
 includes/ImageQueryPage.php                        |   25 +-
 includes/Import.php                                |  135 +-
 includes/Init.php                                  |  150 +-
 includes/Licenses.php                              |    2 +-
 includes/LinkFilter.php                            |    4 +-
 includes/Linker.php                                |  103 +-
 includes/LinksUpdate.php                           |  154 +-
 includes/MWCryptRand.php                           |  497 +
 includes/MWFunction.php                            |   34 +-
 includes/MagicWord.php                             |   23 +-
 includes/MappedIterator.php                        |   88 +-
 includes/Message.php                               |  212 +-
 includes/Metadata.php                              |   28 +-
 includes/MimeMagic.php                             |   88 +-
 includes/Namespace.php                             |    6 +-
 includes/OutputHandler.php                         |   80 +-
 includes/OutputPage.php                            |  476 +-
 includes/PHPVersionError.php                       |   12 +-
 includes/PageQueryPage.php                         |    5 +-
 includes/Pager.php                                 |  140 +-
 includes/PathRouter.php                            |   10 +-
 includes/PoolCounter.php                           |  221 +-
 includes/Preferences.php                           |  541 +-
 includes/PrefixSearch.php                          |   40 +-
 includes/ProtectionForm.php                        |  110 +-
 includes/ProxyTools.php                            |   40 -
 includes/QueryPage.php                             |   92 +-
 includes/RecentChange.php                          |  840 --
 includes/Revision.php                              |  265 +-
 includes/RevisionList.php                          |    5 +-
 includes/Sanitizer.php                             |  361 +-
 includes/ScopedCallback.php                        |   41 +-
 includes/SeleniumWebSettings.php                   |  221 -
 includes/Setup.php                                 |  153 +-
 includes/SiteConfiguration.php                     |   58 +-
 includes/SiteStats.php                             |  126 +-
 includes/Skin.php                                  |  202 +-
 includes/SkinLegacy.php                            |  882 --
 includes/SkinTemplate.php                          |  346 +-
 includes/SpecialPage.php                           |  160 +-
 includes/SpecialPageFactory.php                    |   15 +-
 includes/SqlDataUpdate.php                         |    2 +-
 includes/StatCounter.php                           |  150 +
 includes/Status.php                                |   91 +-
 includes/StreamFile.php                            |    1 +
 includes/StringUtils.php                           |  135 +-
 includes/StubObject.php                            |   25 +-
 includes/Timestamp.php                             |  267 +-
 includes/Title.php                                 |  528 +-
 includes/UIDGenerator.php                          |   35 +-
 includes/User.php                                  | 1151 ++-
 includes/UserArray.php                             |    2 +-
 includes/UserMailer.php                            |   53 +-
 includes/UserRightsProxy.php                       |   10 +-
 includes/WatchedItem.php                           |   65 +-
 includes/WebRequest.php                            |  187 +-
 includes/WebResponse.php                           |  121 +-
 includes/WebStart.php                              |   52 +-
 includes/Wiki.php                                  |  145 +-
 includes/WikiError.php                             |    2 +-
 includes/WikiFilePage.php                          |    4 +
 includes/WikiMap.php                               |   20 +-
 includes/WikiPage.php                              |  632 +-
 includes/Xml.php                                   |  221 +-
 includes/XmlTypeCheck.php                          |   86 +-
 includes/ZhClient.php                              |    6 +-
 includes/ZipDirectoryReader.php                    |    2 +-
 includes/actions/CreditsAction.php                 |   15 +-
 includes/actions/EditAction.php                    |   14 +-
 includes/actions/HistoryAction.php                 |   51 +-
 includes/actions/InfoAction.php                    |   69 +-
 includes/actions/PurgeAction.php                   |    4 +-
 includes/actions/RawAction.php                     |   29 +-
 includes/actions/WatchAction.php                   |   62 +-
 includes/api/ApiBase.php                           |  119 +-
 includes/api/ApiBlock.php                          |    2 +-
 includes/api/ApiComparePages.php                   |    8 +-
 includes/api/ApiCreateAccount.php                  |   52 +-
 includes/api/ApiDelete.php                         |    3 +-
 includes/api/ApiEditPage.php                       |   59 +-
 includes/api/ApiExpandTemplates.php                |    4 +-
 includes/api/ApiFeedContributions.php              |   15 +-
 includes/api/ApiFeedWatchlist.php                  |   90 +-
 includes/api/ApiFormatBase.php                     |    8 +-
 includes/api/ApiFormatJson.php                     |   24 +-
 includes/api/ApiFormatWddx.php                     |   75 +-
 includes/api/ApiFormatXml.php                      |  137 +-
 includes/api/ApiImageRotate.php                    |   32 +-
 includes/api/ApiImport.php                         |    6 +-
 includes/api/ApiMain.php                           |   36 +-
 includes/api/ApiMove.php                           |    4 +-
 includes/api/ApiOpenSearch.php                     |   21 +-
 includes/api/ApiOptions.php                        |    8 +-
 includes/api/ApiPageSet.php                        |   18 +-
 includes/api/ApiParamInfo.php                      |    6 +-
 includes/api/ApiParse.php                          |  157 +-
 includes/api/ApiPatrol.php                         |   46 +-
 includes/api/ApiProtect.php                        |    3 +-
 includes/api/ApiPurge.php                          |   29 +-
 includes/api/ApiQuery.php                          |   10 +-
 includes/api/ApiQueryAllCategories.php             |    4 +-
 includes/api/ApiQueryAllImages.php                 |    4 +-
 includes/api/ApiQueryAllLinks.php                  |  116 +-
 includes/api/ApiQueryAllMessages.php               |    2 +-
 includes/api/ApiQueryAllPages.php                  |    7 +-
 includes/api/ApiQueryAllUsers.php                  |    4 +-
 includes/api/ApiQueryBacklinks.php                 |   15 +-
 includes/api/ApiQueryBase.php                      |    4 +-
 includes/api/ApiQueryBlocks.php                    |   61 +-
 includes/api/ApiQueryCategories.php                |    5 +-
 includes/api/ApiQueryCategoryMembers.php           |    6 +-
 includes/api/ApiQueryDeletedrevs.php               |    6 +-
 includes/api/ApiQueryDuplicateFiles.php            |   23 +-
 includes/api/ApiQueryExtLinksUsage.php             |    6 +-
 includes/api/ApiQueryExternalLinks.php             |    8 +-
 includes/api/ApiQueryFileRepoInfo.php              |  115 +
 includes/api/ApiQueryFilearchive.php               |    8 +-
 includes/api/ApiQueryIWBacklinks.php               |    4 +
 includes/api/ApiQueryIWLinks.php                   |   13 +-
 includes/api/ApiQueryImageInfo.php                 |   80 +-
 includes/api/ApiQueryInfo.php                      |   20 +-
 includes/api/ApiQueryLangBacklinks.php             |    9 +-
 includes/api/ApiQueryLangLinks.php                 |   17 +-
 includes/api/ApiQueryLogEvents.php                 |   24 +-
 includes/api/ApiQueryORM.php                       |    4 +-
 includes/api/ApiQueryPagesWithProp.php             |    2 +-
 includes/api/ApiQueryProtectedTitles.php           |    2 +-
 includes/api/ApiQueryQueryPage.php                 |   19 +-
 includes/api/ApiQueryRandom.php                    |    4 +
 includes/api/ApiQueryRecentChanges.php             |   43 +-
 includes/api/ApiQueryRevisions.php                 |   29 +-
 includes/api/ApiQuerySearch.php                    |   39 +-
 includes/api/ApiQuerySiteinfo.php                  |   62 +-
 includes/api/ApiQueryTags.php                      |    7 +-
 includes/api/ApiQueryUserContributions.php         |   21 +-
 includes/api/ApiQueryUserInfo.php                  |   20 +-
 includes/api/ApiQueryUsers.php                     |    6 +-
 includes/api/ApiQueryWatchlist.php                 |   95 +-
 includes/api/ApiQueryWatchlistRaw.php              |    4 +
 includes/api/ApiRsd.php                            |    2 +-
 includes/api/ApiSetNotificationTimestamp.php       |    7 +-
 includes/api/ApiUpload.php                         |   84 +-
 includes/api/ApiUserrights.php                     |    7 +-
 includes/api/ApiWatch.php                          |   11 +-
 includes/cache/BacklinkCache.php                   |  134 +-
 includes/cache/CacheDependency.php                 |    2 +-
 includes/cache/FileCacheBase.php                   |    6 +-
 includes/cache/GenderCache.php                     |   14 +-
 includes/cache/HTMLCacheUpdate.php                 |   11 +-
 includes/cache/HTMLFileCache.php                   |    4 +-
 includes/cache/LinkBatch.php                       |    4 +-
 includes/cache/LinkCache.php                       |   68 +-
 includes/cache/LocalisationCache.php               |   96 +-
 includes/cache/MessageCache.php                    |  729 +-
 includes/cache/ResourceFileCache.php               |    2 +-
 includes/cache/SquidUpdate.php                     |  197 +-
 includes/cache/UserCache.php                       |   13 +
 includes/changes/ChangesList.php                   |  552 ++
 includes/changes/EnhancedChangesList.php           |  662 ++
 includes/changes/OldChangesList.php                |  130 +
 includes/changes/RCCacheEntry.php                  |   35 +
 includes/changes/RecentChange.php                  |  846 ++
 includes/clientpool/RedisConnectionPool.php        |   90 +-
 includes/content/Content.php                       |   14 +-
 includes/content/ContentHandler.php                |   19 +-
 includes/content/CssContent.php                    |    2 +-
 includes/content/JavaScriptContent.php             |    2 +-
 includes/content/TextContent.php                   |    2 +-
 includes/content/WikitextContent.php               |    3 +-
 includes/content/WikitextContentHandler.php        |   19 +-
 includes/context/ContextSource.php                 |    2 +-
 includes/context/DerivativeContext.php             |   25 +-
 includes/context/IContextSource.php                |    2 +-
 includes/context/RequestContext.php                |   19 +-
 includes/db/ChronologyProtector.php                |  106 +
 includes/db/CloneDatabase.php                      |   18 +-
 includes/db/Database.php                           |  517 +-
 includes/db/DatabaseError.php                      |  202 +-
 includes/db/DatabaseMssql.php                      |  190 +-
 includes/db/DatabaseMysql.php                      |  933 +-
 includes/db/DatabaseMysqlBase.php                  | 1154 +++
 includes/db/DatabaseMysqli.php                     |  194 +
 includes/db/DatabaseOracle.php                     |   92 +-
 includes/db/DatabasePostgres.php                   |   98 +-
 includes/db/DatabaseSqlite.php                     |   49 +-
 includes/db/DatabaseUtility.php                    |    3 +-
 includes/db/IORMRow.php                            |   24 +-
 includes/db/LBFactory.php                          |   94 +-
 includes/db/LBFactory_Multi.php                    |    6 +-
 includes/db/LoadBalancer.php                       |  104 +-
 includes/db/LoadMonitor.php                        |   27 +-
 includes/db/ORMRow.php                             |  182 +-
 includes/db/ORMTable.php                           |  211 +-
 includes/debug/Debug.php                           |   74 +-
 includes/diff/DairikiDiff.php                      |   40 +-
 includes/diff/DifferenceEngine.php                 |  205 +-
 includes/extauth/Hardcoded.php                     |   84 -
 includes/extauth/MediaWiki.php                     |  168 -
 includes/extauth/vB.php                            |  146 -
 includes/externalstore/ExternalStore.php           |   57 +-
 includes/externalstore/ExternalStoreDB.php         |  142 +-
 includes/externalstore/ExternalStoreMedium.php     |   19 +
 includes/externalstore/ExternalStoreMwstore.php    |   23 +
 includes/filebackend/FSFile.php                    |   29 +-
 includes/filebackend/FSFileBackend.php             |  117 +-
 includes/filebackend/FileBackend.php               |  143 +-
 includes/filebackend/FileBackendGroup.php          |   28 +-
 includes/filebackend/FileBackendMultiWrite.php     |  179 +-
 includes/filebackend/FileBackendStore.php          |  576 +-
 includes/filebackend/FileOp.php                    |  193 +-
 includes/filebackend/FileOpBatch.php               |    6 +-
 includes/filebackend/README                        |    2 +-
 includes/filebackend/SwiftFileBackend.php          |  262 +-
 includes/filebackend/TempFSFile.php                |    6 +-
 includes/filebackend/filejournal/DBFileJournal.php |   10 +-
 includes/filebackend/lockmanager/DBLockManager.php |   37 +-
 includes/filebackend/lockmanager/LockManager.php   |  125 +-
 .../filebackend/lockmanager/LockManagerGroup.php   |    4 +-
 .../filebackend/lockmanager/MemcLockManager.php    |   41 +-
 .../filebackend/lockmanager/QuorumLockManager.php  |  140 +-
 .../filebackend/lockmanager/RedisLockManager.php   |  288 +
 includes/filebackend/lockmanager/ScopedLock.php    |   44 +-
 includes/filerepo/FSRepo.php                       |   14 +-
 includes/filerepo/FileRepo.php                     |  108 +-
 includes/filerepo/ForeignAPIRepo.php               |  226 +-
 includes/filerepo/ForeignDBRepo.php                |    5 +-
 includes/filerepo/LocalRepo.php                    |   42 +-
 includes/filerepo/RepoGroup.php                    |   12 +-
 includes/filerepo/file/ArchivedFile.php            |   23 +-
 includes/filerepo/file/File.php                    |   37 +-
 includes/filerepo/file/ForeignAPIFile.php          |   49 +-
 includes/filerepo/file/ForeignDBFile.php           |    5 +-
 includes/filerepo/file/LocalFile.php               |  234 +-
 includes/filerepo/file/OldLocalFile.php            |    3 +-
 includes/gallery/ImageGalleryBase.php              |  331 +
 includes/gallery/NolinesImageGallery.php           |   38 +
 includes/gallery/PackedImageGallery.php            |  105 +
 includes/gallery/PackedOverlayImageGallery.php     |   60 +
 includes/gallery/TraditionalImageGallery.php       |  328 +
 includes/installer/CliInstaller.php                |    9 +-
 includes/installer/DatabaseInstaller.php           |   64 +-
 includes/installer/DatabaseUpdater.php             |  156 +-
 includes/installer/InstallDocFormatter.php         |   12 +-
 includes/installer/Installer.i18n.php              | 1959 ++--
 includes/installer/Installer.php                   |  298 +-
 includes/installer/LocalSettingsGenerator.php      |   59 +-
 includes/installer/MysqlInstaller.php              |  135 +-
 includes/installer/MysqlUpdater.php                |  516 +-
 includes/installer/OracleInstaller.php             |   61 +-
 includes/installer/OracleUpdater.php               |   72 +-
 includes/installer/PhpBugTests.php                 |    2 +
 includes/installer/PostgresInstaller.php           |   62 +-
 includes/installer/PostgresUpdater.php             |  575 +-
 includes/installer/SqliteInstaller.php             |   38 +-
 includes/installer/SqliteUpdater.php               |  121 +-
 includes/installer/WebInstaller.php                |  208 +-
 includes/installer/WebInstallerOutput.php          |  112 +-
 includes/installer/WebInstallerPage.php            |  259 +-
 includes/job/Job.php                               |   56 +-
 includes/job/JobQueue.php                          |  355 +-
 includes/job/JobQueueAggregator.php                |  139 -
 includes/job/JobQueueAggregatorMemc.php            |  117 -
 includes/job/JobQueueAggregatorRedis.php           |  165 -
 includes/job/JobQueueDB.php                        |  688 +-
 includes/job/JobQueueFederated.php                 |  473 +
 includes/job/JobQueueGroup.php                     |   90 +-
 includes/job/JobQueueRedis.php                     |  856 ++
 includes/job/aggregator/JobQueueAggregator.php     |  156 +
 includes/job/aggregator/JobQueueAggregatorMemc.php |  124 +
 .../job/aggregator/JobQueueAggregatorRedis.php     |  193 +
 includes/job/jobs/AssembleUploadChunksJob.php      |   19 +-
 includes/job/jobs/DoubleRedirectJob.php            |   29 +-
 includes/job/jobs/DuplicateJob.php                 |    2 +-
 includes/job/jobs/EnotifNotifyJob.php              |    2 +-
 includes/job/jobs/HTMLCacheUpdateJob.php           |   25 +-
 includes/job/jobs/NullJob.php                      |   16 +
 includes/job/jobs/PublishStashedFileJob.php        |   22 +-
 includes/job/jobs/RefreshLinksJob.php              |   28 +-
 includes/job/jobs/UploadFromUrlJob.php             |    7 +-
 includes/json/FormatJson.php                       |  217 +-
 includes/json/Services_JSON.php                    |  882 --
 includes/libs/CSSJanus.php                         |   72 +-
 includes/libs/CSSMin.php                           |   47 +-
 includes/libs/HttpStatus.php                       |    2 +-
 includes/libs/lessc.inc.php                        | 3742 ++++++++
 includes/limit.sh                                  |    9 +-
 includes/logging/DeleteLogFormatter.php            |  196 +
 includes/logging/LogEntry.php                      |   55 +-
 includes/logging/LogEventsList.php                 |   82 +-
 includes/logging/LogFormatter.php                  |  412 +-
 includes/logging/LogPage.php                       |   62 +-
 includes/logging/LogPager.php                      |   77 +-
 includes/logging/MoveLogFormatter.php              |   82 +
 includes/logging/NewUsersLogFormatter.php          |   65 +
 includes/logging/PatrolLog.php                     |    7 +
 includes/logging/PatrolLogFormatter.php            |   63 +
 includes/logging/RightsLogFormatter.php            |  112 +
 includes/media/BMP.php                             |    6 +-
 includes/media/Bitmap.php                          |   47 +-
 includes/media/BitmapMetadataHandler.php           |   24 +-
 includes/media/DjVu.php                            |   21 +-
 includes/media/DjVuImage.php                       |   44 +-
 includes/media/Exif.php                            |   76 +-
 includes/media/ExifBitmap.php                      |    8 +-
 includes/media/FormatMetadata.php                  |  101 +-
 includes/media/GIF.php                             |    8 +-
 includes/media/GIFMetadataExtractor.php            |   46 +-
 includes/media/IPTC.php                            |    8 +-
 includes/media/ImageHandler.php                    |   23 +-
 includes/media/Jpeg.php                            |   20 +-
 includes/media/JpegMetadataExtractor.php           |   22 +-
 includes/media/MediaHandler.php                    |  149 +-
 includes/media/MediaTransformOutput.php            |   53 +-
 includes/media/PNG.php                             |   13 +-
 includes/media/PNGMetadataExtractor.php            |   30 +-
 includes/media/SVG.php                             |   92 +-
 includes/media/SVGMetadataExtractor.php            |   64 +-
 includes/media/Tiff.php                            |    2 +-
 includes/media/XCF.php                             |    6 +-
 includes/media/XMP.php                             |   26 +-
 includes/media/XMPInfo.php                         |    6 +-
 includes/media/XMPValidate.php                     |   12 +-
 includes/mime.info                                 |    4 +
 includes/mime.types                                |    5 +
 includes/normal/README                             |   10 +-
 includes/normal/RandomTest.php                     |    6 +-
 includes/normal/UtfNormal.php                      |    4 +-
 includes/normal/UtfNormalTest.php                  |    8 +-
 includes/normal/UtfNormalTest2.php                 |    2 +-
 includes/normal/UtfNormalUtil.php                  |    8 +-
 includes/objectcache/BagOStuff.php                 |    8 +-
 includes/objectcache/MemcachedBagOStuff.php        |    2 +-
 includes/objectcache/MemcachedClient.php           |   24 +-
 includes/objectcache/MemcachedPeclBagOStuff.php    |   14 +-
 includes/objectcache/MultiWriteBagOStuff.php       |    2 +-
 includes/objectcache/ObjectCache.php               |   14 +-
 includes/objectcache/ObjectCacheSessionHandler.php |    2 +-
 includes/objectcache/RedisBagOStuff.php            |   40 +-
 includes/objectcache/SqlBagOStuff.php              |   22 +-
 includes/parser/CacheTime.php                      |    2 +-
 includes/parser/CoreLinkFunctions.php              |   92 -
 includes/parser/CoreParserFunctions.php            |  197 +-
 includes/parser/CoreTagHooks.php                   |    2 +-
 includes/parser/DateFormatter.php                  |   24 +-
 includes/parser/LinkHolderArray.php                |  216 +-
 includes/parser/Parser.php                         |  848 +-
 includes/parser/ParserCache.php                    |   20 +-
 includes/parser/ParserOptions.php                  |   21 +-
 includes/parser/ParserOutput.php                   |  111 +-
 includes/parser/Parser_DiffTest.php                |    2 +-
 includes/parser/Parser_LinkHooks.php               |  326 -
 includes/parser/Preprocessor_DOM.php               |   99 +-
 includes/parser/Preprocessor_Hash.php              |   61 +-
 includes/parser/Tidy.php                           |   11 +-
 includes/profiler/Profiler.php                     |  264 +-
 includes/profiler/ProfilerSimple.php               |    5 +-
 includes/profiler/ProfilerSimpleText.php           |   12 +-
 includes/profiler/ProfilerSimpleTrace.php          |    2 +
 includes/profiler/ProfilerSimpleUDP.php            |   12 +-
 includes/profiler/ProfilerStub.php                 |    2 +
 includes/rcfeed/IRCColourfulRCFeedFormatter.php    |   99 +
 includes/rcfeed/JSONRCFeedFormatter.php            |   90 +
 includes/rcfeed/RCFeedEngine.php                   |   12 +
 includes/rcfeed/RCFeedFormatter.php                |   13 +
 includes/rcfeed/RedisPubSubFeedEngine.php          |   41 +
 includes/rcfeed/UDPRCFeedEngine.php                |   10 +
 includes/resourceloader/ResourceLoader.php         |  181 +-
 includes/resourceloader/ResourceLoaderContext.php  |    2 +-
 .../resourceloader/ResourceLoaderFileModule.php    |  176 +-
 .../resourceloader/ResourceLoaderLESSFunctions.php |   67 +
 .../ResourceLoaderLanguageDataModule.php           |   31 +-
 includes/resourceloader/ResourceLoaderModule.php   |  102 +-
 .../resourceloader/ResourceLoaderSiteModule.php    |   23 +-
 .../resourceloader/ResourceLoaderStartUpModule.php |   10 +-
 .../ResourceLoaderUserCSSPrefsModule.php           |   67 +-
 .../ResourceLoaderUserGroupsModule.php             |   15 +-
 .../resourceloader/ResourceLoaderUserModule.php    |   21 +-
 .../ResourceLoaderUserOptionsModule.php            |    4 +-
 .../ResourceLoaderUserTokensModule.php             |    9 +-
 .../resourceloader/ResourceLoaderWikiModule.php    |    4 +-
 includes/revisiondelete/RevisionDelete.php         |   86 +-
 .../revisiondelete/RevisionDeleteAbstracts.php     |   50 +-
 includes/revisiondelete/RevisionDeleteUser.php     |    2 +-
 includes/revisiondelete/RevisionDeleter.php        |  149 +-
 includes/search/SearchEngine.php                   |  169 +-
 includes/search/SearchMssql.php                    |    6 +-
 includes/search/SearchMySQL.php                    |   66 +-
 includes/search/SearchOracle.php                   |   86 +-
 includes/search/SearchPostgres.php                 |   43 +-
 includes/search/SearchSqlite.php                   |   39 +-
 includes/search/SearchUpdate.php                   |  123 +-
 includes/site/MediaWikiSite.php                    |    8 +-
 includes/site/SiteSQLStore.php                     |   52 +-
 includes/specials/SpecialActiveusers.php           |   74 +-
 includes/specials/SpecialAllmessages.php           |  143 +-
 includes/specials/SpecialAllpages.php              |  174 +-
 includes/specials/SpecialAncientpages.php          |   22 +-
 includes/specials/SpecialBlankpage.php             |    1 +
 includes/specials/SpecialBlock.php                 |   49 +-
 includes/specials/SpecialBlockList.php             |   52 +-
 includes/specials/SpecialBlockme.php               |   66 -
 includes/specials/SpecialBooksources.php           |   49 +-
 includes/specials/SpecialBrokenRedirects.php       |   12 +-
 includes/specials/SpecialCachedPage.php            |    1 -
 includes/specials/SpecialCategories.php            |   38 +-
 includes/specials/SpecialChangeEmail.php           |   67 +-
 includes/specials/SpecialChangePassword.php        |  134 +-
 includes/specials/SpecialComparePages.php          |   11 +-
 includes/specials/SpecialConfirmemail.php          |  101 +-
 includes/specials/SpecialContributions.php         |  380 +-
 includes/specials/SpecialDeadendpages.php          |   25 +-
 includes/specials/SpecialDeletedContributions.php  |  179 +-
 includes/specials/SpecialDisambiguations.php       |  165 -
 includes/specials/SpecialDoubleRedirects.php       |   31 +-
 includes/specials/SpecialEditWatchlist.php         |  174 +-
 includes/specials/SpecialEmailuser.php             |   82 +-
 includes/specials/SpecialExport.php                |  143 +-
 includes/specials/SpecialFewestrevisions.php       |   53 +-
 includes/specials/SpecialFileDuplicateSearch.php   |   51 +-
 includes/specials/SpecialFilepath.php              |   62 +-
 includes/specials/SpecialImport.php                |  245 +-
 includes/specials/SpecialJavaScriptTest.php        |   56 +-
 includes/specials/SpecialLinkSearch.php            |   71 +-
 includes/specials/SpecialListfiles.php             |  301 +-
 includes/specials/SpecialListgrouprights.php       |   51 +-
 includes/specials/SpecialListredirects.php         |   34 +-
 includes/specials/SpecialListusers.php             |  113 +-
 includes/specials/SpecialLog.php                   |   79 +-
 includes/specials/SpecialLonelypages.php           |   48 +-
 includes/specials/SpecialLongpages.php             |    1 -
 includes/specials/SpecialMIMEsearch.php            |   97 +-
 includes/specials/SpecialMergeHistory.php          |  118 +-
 includes/specials/SpecialMostcategories.php        |   48 +-
 includes/specials/SpecialMostimages.php            |   19 +-
 includes/specials/SpecialMostinterwikis.php        |   32 +-
 includes/specials/SpecialMostlinked.php            |   69 +-
 includes/specials/SpecialMostlinkedcategories.php  |   32 +-
 includes/specials/SpecialMostlinkedtemplates.php   |   39 +-
 includes/specials/SpecialMovepage.php              |  263 +-
 includes/specials/SpecialNewimages.php             |   40 +-
 includes/specials/SpecialNewpages.php              |  156 +-
 includes/specials/SpecialPagesWithProp.php         |   32 +-
 includes/specials/SpecialPasswordReset.php         |   94 +-
 includes/specials/SpecialPopularpages.php          |   34 +-
 includes/specials/SpecialPreferences.php           |   26 +-
 includes/specials/SpecialPrefixindex.php           |  147 +-
 includes/specials/SpecialProtectedpages.php        |  169 +-
 includes/specials/SpecialProtectedtitles.php       |   80 +-
 includes/specials/SpecialRandomInCategory.php      |  291 +
 includes/specials/SpecialRandompage.php            |   31 +-
 includes/specials/SpecialRandomredirect.php        |    1 -
 includes/specials/SpecialRecentchanges.php         |  410 +-
 includes/specials/SpecialRecentchangeslinked.php   |   63 +-
 includes/specials/SpecialRedirect.php              |  235 +
 includes/specials/SpecialResetTokens.php           |  145 +
 includes/specials/SpecialRevisiondelete.php        |  170 +-
 includes/specials/SpecialSearch.php                |  198 +-
 includes/specials/SpecialShortpages.php            |   18 +-
 includes/specials/SpecialSpecialpages.php          |   17 +-
 includes/specials/SpecialStatistics.php            |   37 +-
 includes/specials/SpecialTags.php                  |   69 +-
 includes/specials/SpecialUnblock.php               |   22 +-
 .../specials/SpecialUncategorizedcategories.php    |    6 +-
 includes/specials/SpecialUncategorizedimages.php   |    2 +-
 includes/specials/SpecialUncategorizedpages.php    |   13 +-
 includes/specials/SpecialUndelete.php              |  680 +-
 includes/specials/SpecialUnusedcategories.php      |   15 +-
 includes/specials/SpecialUnusedimages.php          |   16 +-
 includes/specials/SpecialUnusedtemplates.php       |   16 +-
 includes/specials/SpecialUnwatchedpages.php        |   16 +-
 includes/specials/SpecialUpload.php                |  126 +-
 includes/specials/SpecialUploadStash.php           |   29 +-
 includes/specials/SpecialUserlogin.php             |  369 +-
 includes/specials/SpecialUserrights.php            |  162 +-
 includes/specials/SpecialVersion.php               |  203 +-
 includes/specials/SpecialWantedcategories.php      |   18 +-
 includes/specials/SpecialWantedfiles.php           |   16 +-
 includes/specials/SpecialWantedtemplates.php       |   14 +-
 includes/specials/SpecialWatchlist.php             |  192 +-
 includes/specials/SpecialWhatlinkshere.php         |   69 +-
 includes/specials/SpecialWithoutinterwiki.php      |   28 +-
 includes/templates/NoLocalSettings.php             |   14 +-
 includes/templates/Usercreate.php                  |  445 +-
 includes/templates/Userlogin.php                   |  278 +-
 includes/tidy.conf                                 |    2 +-
 includes/upload/UploadBase.php                     |  202 +-
 includes/upload/UploadFromChunks.php               |   26 +-
 includes/upload/UploadFromFile.php                 |    2 +-
 includes/upload/UploadFromStash.php                |    6 +-
 includes/upload/UploadFromUrl.php                  |   49 +-
 includes/upload/UploadStash.php                    |   29 +-
 index.php                                          |   16 +-
 languages/Language.php                             |  500 +-
 languages/LanguageConverter.php                    |   84 +-
 languages/Names.php                                |   46 +-
 languages/classes/LanguageAz.php                   |    2 +-
 languages/classes/LanguageBe_tarask.php            |   12 +-
 languages/classes/LanguageCu.php                   |   27 +-
 languages/classes/LanguageEo.php                   |   70 +-
 languages/classes/LanguageEs.php                   |   42 +
 languages/classes/LanguageFi.php                   |    6 +-
 languages/classes/LanguageGa.php                   |   21 +-
 languages/classes/LanguageGan.php                  |   47 +-
 languages/classes/LanguageGv.php                   |    4 +-
 languages/classes/LanguageHi.php                   |   44 -
 languages/classes/LanguageHr.php                   |    8 +-
 languages/classes/LanguageHy.php                   |   12 +-
 languages/classes/LanguageIu.php                   |   20 +-
 languages/classes/LanguageKaa.php                  |    6 +-
 languages/classes/LanguageKk.php                   |   52 +-
 languages/classes/LanguageKk_cyrl.php              |   62 +-
 languages/classes/LanguageKsh.php                  |   20 +-
 languages/classes/LanguageKu.php                   |   64 +-
 languages/classes/LanguageLa.php                   |   90 +-
 languages/classes/LanguageMg.php                   |   44 -
 languages/classes/LanguageMk.php                   |   49 -
 languages/classes/LanguageMt.php                   |   48 -
 languages/classes/LanguageNso.php                  |   44 -
 languages/classes/LanguageOs.php                   |   38 +-
 languages/classes/LanguagePl.php                   |   25 -
 languages/classes/LanguageSh.php                   |   58 -
 languages/classes/LanguageShi.php                  |   36 +-
 languages/classes/LanguageSk.php                   |   49 -
 languages/classes/LanguageSl.php                   |   27 +-
 languages/classes/LanguageSr.php                   |   40 +-
 languages/classes/LanguageSr_ec.php                |    8 +-
 languages/classes/LanguageSr_el.php                |    8 +-
 languages/classes/LanguageTg.php                   |    4 +-
 languages/classes/LanguageTi.php                   |   44 -
 languages/classes/LanguageTl.php                   |   44 -
 languages/classes/LanguageTr.php                   |    4 +-
 languages/classes/LanguageTyv.php                  |    2 +-
 languages/classes/LanguageUk.php                   |   37 +-
 languages/classes/LanguageUz.php                   |   10 +-
 languages/classes/LanguageWa.php                   |   42 +-
 languages/classes/LanguageZh.php                   |   58 +-
 languages/classes/LanguageZh_hans.php              |    2 +
 languages/data/plurals-mediawiki.xml               |    7 +
 languages/data/plurals.xml                         |    2 +-
 languages/messages/MessagesAce.php                 |   49 +-
 languages/messages/MessagesAeb.php                 |   26 +-
 languages/messages/MessagesAf.php                  |  234 +-
 languages/messages/MessagesAln.php                 |   43 +-
 languages/messages/MessagesAm.php                  |   66 +-
 languages/messages/MessagesAn.php                  |   86 +-
 languages/messages/MessagesAng.php                 |   51 +-
 languages/messages/MessagesAr.php                  |  260 +-
 languages/messages/MessagesArc.php                 |   48 +-
 languages/messages/MessagesArn.php                 |   10 +-
 languages/messages/MessagesAry.php                 |   62 +-
 languages/messages/MessagesArz.php                 |   81 +-
 languages/messages/MessagesAs.php                  |  171 +-
 languages/messages/MessagesAst.php                 |  288 +-
 languages/messages/MessagesAvk.php                 |   49 +-
 languages/messages/MessagesAy.php                  |    1 +
 languages/messages/MessagesAz.php                  |   83 +-
 languages/messages/MessagesAzb.php                 |  173 +-
 languages/messages/MessagesBa.php                  |  260 +-
 languages/messages/MessagesBar.php                 |   36 +-
 languages/messages/MessagesBbc.php                 |   12 +
 languages/messages/MessagesBbc_latn.php            |  734 ++
 languages/messages/MessagesBcc.php                 |   64 +-
 languages/messages/MessagesBcl.php                 |  250 +-
 languages/messages/MessagesBe.php                  |   98 +-
 languages/messages/MessagesBe_tarask.php           |  268 +-
 languages/messages/MessagesBg.php                  |  184 +-
 languages/messages/MessagesBho.php                 |   86 +-
 languages/messages/MessagesBi.php                  |   23 +-
 languages/messages/MessagesBjn.php                 |   64 +-
 languages/messages/MessagesBn.php                  |  255 +-
 languages/messages/MessagesBo.php                  |    5 +-
 languages/messages/MessagesBpy.php                 |   42 +-
 languages/messages/MessagesBqi.php                 |    2 -
 languages/messages/MessagesBr.php                  |  239 +-
 languages/messages/MessagesBrh.php                 |    2 -
 languages/messages/MessagesBs.php                  |  211 +-
 languages/messages/MessagesBug.php                 |    3 -
 languages/messages/MessagesBxr.php                 |   72 +
 languages/messages/MessagesCa.php                  |  257 +-
 languages/messages/MessagesCbk_zam.php             |    2 +-
 languages/messages/MessagesCdo.php                 |   71 +-
 languages/messages/MessagesCe.php                  |  266 +-
 languages/messages/MessagesCeb.php                 |   29 +-
 languages/messages/MessagesCh.php                  |   16 +-
 languages/messages/MessagesChr.php                 |    1 +
 languages/messages/MessagesCkb.php                 |  150 +-
 languages/messages/MessagesCo.php                  |    5 +-
 languages/messages/MessagesCps.php                 |   19 +-
 languages/messages/MessagesCrh_cyrl.php            |   49 +-
 languages/messages/MessagesCrh_latn.php            |   49 +-
 languages/messages/MessagesCs.php                  |  269 +-
 languages/messages/MessagesCsb.php                 |   17 +-
 languages/messages/MessagesCu.php                  |   57 +-
 languages/messages/MessagesCv.php                  |   35 +-
 languages/messages/MessagesCy.php                  |  269 +-
 languages/messages/MessagesDa.php                  |  306 +-
 languages/messages/MessagesDe.php                  |  278 +-
 languages/messages/MessagesDe_at.php               |   12 +-
 languages/messages/MessagesDe_ch.php               |   72 +-
 languages/messages/MessagesDe_formal.php           |   73 +-
 languages/messages/MessagesDiq.php                 |  384 +-
 languages/messages/MessagesDsb.php                 |   91 +-
 languages/messages/MessagesDtp.php                 |   35 +-
 languages/messages/MessagesDv.php                  |   86 +-
 languages/messages/MessagesEe.php                  |    3 -
 languages/messages/MessagesEgl.php                 |   14 +-
 languages/messages/MessagesEl.php                  |  238 +-
 languages/messages/MessagesEml.php                 |    6 +-
 languages/messages/MessagesEn.php                  |  690 +-
 languages/messages/MessagesEn_ca.php               |   33 +-
 languages/messages/MessagesEn_gb.php               |   56 +-
 languages/messages/MessagesEo.php                  |  184 +-
 languages/messages/MessagesEs.php                  |  278 +-
 languages/messages/MessagesEt.php                  |  270 +-
 languages/messages/MessagesEu.php                  |  147 +-
 languages/messages/MessagesExt.php                 |   55 +-
 languages/messages/MessagesFa.php                  |  262 +-
 languages/messages/MessagesFi.php                  |  261 +-
 languages/messages/MessagesFit.php                 |    1 -
 languages/messages/MessagesFj.php                  |    2 +-
 languages/messages/MessagesFo.php                  |  199 +-
 languages/messages/MessagesFr.php                  |  274 +-
 languages/messages/MessagesFrc.php                 |    2 -
 languages/messages/MessagesFrp.php                 |  145 +-
 languages/messages/MessagesFrr.php                 |  239 +-
 languages/messages/MessagesFur.php                 |   34 +-
 languages/messages/MessagesFy.php                  |   49 +-
 languages/messages/MessagesGa.php                  |   62 +-
 languages/messages/MessagesGag.php                 |   10 +-
 languages/messages/MessagesGan_hans.php            |   53 +-
 languages/messages/MessagesGan_hant.php            |   53 +-
 languages/messages/MessagesGd.php                  |   47 +-
 languages/messages/MessagesGl.php                  |  275 +-
 languages/messages/MessagesGn.php                  |    5 -
 languages/messages/MessagesGrc.php                 |   51 +-
 languages/messages/MessagesGsw.php                 |   70 +-
 languages/messages/MessagesGu.php                  |  221 +-
 languages/messages/MessagesGv.php                  |   21 +-
 languages/messages/MessagesHa.php                  |    2 -
 languages/messages/MessagesHak.php                 |   98 +-
 languages/messages/MessagesHaw.php                 |    9 +-
 languages/messages/MessagesHe.php                  |  275 +-
 languages/messages/MessagesHi.php                  |  222 +-
 languages/messages/MessagesHif_latn.php            |  196 +-
 languages/messages/MessagesHil.php                 |   43 +-
 languages/messages/MessagesHr.php                  |  171 +-
 languages/messages/MessagesHsb.php                 |  176 +-
 languages/messages/MessagesHt.php                  |   25 +-
 languages/messages/MessagesHu.php                  |  170 +-
 languages/messages/MessagesHy.php                  |  103 +-
 languages/messages/MessagesIa.php                  |  283 +-
 languages/messages/MessagesId.php                  |  269 +-
 languages/messages/MessagesIe.php                  |   22 +-
 languages/messages/MessagesIg.php                  |   29 +-
 languages/messages/MessagesIk.php                  |   21 +-
 languages/messages/MessagesIke_cans.php            |    4 +-
 languages/messages/MessagesIke_latn.php            |    4 +-
 languages/messages/MessagesIlo.php                 |  252 +-
 languages/messages/MessagesInh.php                 |   22 +-
 languages/messages/MessagesIo.php                  |   20 +-
 languages/messages/MessagesIs.php                  |  152 +-
 languages/messages/MessagesIt.php                  |  264 +-
 languages/messages/MessagesJa.php                  |  278 +-
 languages/messages/MessagesJam.php                 |   20 +-
 languages/messages/MessagesJut.php                 |    5 -
 languages/messages/MessagesJv.php                  |   82 +-
 languages/messages/MessagesKa.php                  |  214 +-
 languages/messages/MessagesKaa.php                 |   45 +-
 languages/messages/MessagesKab.php                 |   73 +-
 languages/messages/MessagesKbd_cyrl.php            |   22 +-
 languages/messages/MessagesKg.php                  |   13 +
 languages/messages/MessagesKhw.php                 |   27 +-
 languages/messages/MessagesKiu.php                 |   43 +-
 languages/messages/MessagesKk_arab.php             |   71 +-
 languages/messages/MessagesKk_cyrl.php             |  189 +-
 languages/messages/MessagesKk_latn.php             |   71 +-
 languages/messages/MessagesKm.php                  |  190 +-
 languages/messages/MessagesKn.php                  |   70 +-
 languages/messages/MessagesKo.php                  |  291 +-
 languages/messages/MessagesKoi.php                 |    5 +-
 languages/messages/MessagesKrc.php                 |  196 +-
 languages/messages/MessagesKrj.php                 |   11 +-
 languages/messages/MessagesKs.php                  |   49 +-
 languages/messages/MessagesKs_arab.php             |    8 -
 languages/messages/MessagesKs_deva.php             |    7 -
 languages/messages/MessagesKsh.php                 |  217 +-
 languages/messages/MessagesKu_latn.php             |   59 +-
 languages/messages/MessagesKw.php                  |  164 +-
 languages/messages/MessagesKy.php                  |   80 +-
 languages/messages/MessagesLa.php                  |  242 +-
 languages/messages/MessagesLad.php                 |   24 +-
 languages/messages/MessagesLb.php                  |  253 +-
 languages/messages/MessagesLbe.php                 |    2 +-
 languages/messages/MessagesLez.php                 |   52 +-
 languages/messages/MessagesLfn.php                 |   24 +-
 languages/messages/MessagesLg.php                  |   28 +-
 languages/messages/MessagesLi.php                  |   71 +-
 languages/messages/MessagesLij.php                 |   50 +-
 languages/messages/MessagesLiv.php                 |    6 +-
 languages/messages/MessagesLmo.php                 |   12 +-
 languages/messages/MessagesLn.php                  |    5 +-
 languages/messages/MessagesLo.php                  |   22 +-
 languages/messages/MessagesLoz.php                 |   17 +-
 languages/messages/MessagesLt.php                  |  172 +-
 languages/messages/MessagesLtg.php                 |   10 +-
 languages/messages/MessagesLus.php                 |   37 +-
 languages/messages/MessagesLv.php                  |  166 +-
 languages/messages/MessagesLzh.php                 |  108 +-
 languages/messages/MessagesMai.php                 |   70 +-
 languages/messages/MessagesMap_bms.php             |  120 +-
 languages/messages/MessagesMdf.php                 |   58 +-
 languages/messages/MessagesMg.php                  |  201 +-
 languages/messages/MessagesMhr.php                 |   22 +-
 languages/messages/MessagesMin.php                 |  211 +-
 languages/messages/MessagesMk.php                  |  282 +-
 languages/messages/MessagesMl.php                  |  264 +-
 languages/messages/MessagesMn.php                  |   66 +-
 languages/messages/MessagesMr.php                  |  258 +-
 languages/messages/MessagesMrj.php                 |    2 -
 languages/messages/MessagesMs.php                  |  269 +-
 languages/messages/MessagesMt.php                  |  133 +-
 languages/messages/MessagesMwl.php                 |   22 +-
 languages/messages/MessagesMy.php                  |   41 +-
 languages/messages/MessagesMyv.php                 |   40 +-
 languages/messages/MessagesMzn.php                 |   28 +-
 languages/messages/MessagesNa.php                  |    2 +-
 languages/messages/MessagesNah.php                 |   21 +-
 languages/messages/MessagesNan.php                 |   30 +-
 languages/messages/MessagesNap.php                 |   36 +-
 languages/messages/MessagesNb.php                  |  249 +-
 languages/messages/MessagesNds.php                 |   61 +-
 languages/messages/MessagesNds_nl.php              |  264 +-
 languages/messages/MessagesNe.php                  |  186 +-
 languages/messages/MessagesNew.php                 |    9 +-
 languages/messages/MessagesNiu.php                 |    3 +
 languages/messages/MessagesNl.php                  |  286 +-
 languages/messages/MessagesNl_informal.php         |  361 +-
 languages/messages/MessagesNn.php                  |  212 +-
 languages/messages/MessagesNov.php                 |    2 +-
 languages/messages/MessagesNso.php                 |   14 +-
 languages/messages/MessagesNv.php                  |    2 +-
 languages/messages/MessagesNy.php                  |   12 +-
 languages/messages/MessagesOc.php                  |  250 +-
 languages/messages/MessagesOr.php                  |  122 +-
 languages/messages/MessagesOs.php                  |   79 +-
 languages/messages/MessagesPa.php                  |  181 +-
 languages/messages/MessagesPag.php                 |    7 +-
 languages/messages/MessagesPam.php                 |   53 +-
 languages/messages/MessagesPap.php                 |    9 +-
 languages/messages/MessagesPcd.php                 |   12 +-
 languages/messages/MessagesPdc.php                 |   15 +-
 languages/messages/MessagesPdt.php                 |   10 -
 languages/messages/MessagesPfl.php                 |   56 +-
 languages/messages/MessagesPi.php                  |   95 +-
 languages/messages/MessagesPl.php                  |  273 +-
 languages/messages/MessagesPms.php                 |  268 +-
 languages/messages/MessagesPnb.php                 |   67 +-
 languages/messages/MessagesPnt.php                 |   20 +-
 languages/messages/MessagesPrg.php                 |   61 +-
 languages/messages/MessagesPs.php                  |  102 +-
 languages/messages/MessagesPt.php                  |  239 +-
 languages/messages/MessagesPt_br.php               |  263 +-
 languages/messages/MessagesQqq.php                 |  660 +-
 languages/messages/MessagesQu.php                  |  243 +-
 languages/messages/MessagesQug.php                 |    7 +-
 languages/messages/MessagesRgn.php                 |    2 -
 languages/messages/MessagesRm.php                  |   68 +-
 languages/messages/MessagesRo.php                  |  269 +-
 languages/messages/MessagesRoa_tara.php            |  261 +-
 languages/messages/MessagesRu.php                  |  300 +-
 languages/messages/MessagesRue.php                 |  234 +-
 languages/messages/MessagesRup.php                 |  123 +-
 languages/messages/MessagesSa.php                  |   84 +-
 languages/messages/MessagesSah.php                 |  219 +-
 languages/messages/MessagesSat.php                 |   35 +-
 languages/messages/MessagesSc.php                  |   35 +-
 languages/messages/MessagesScn.php                 |  110 +-
 languages/messages/MessagesSco.php                 |   25 +-
 languages/messages/MessagesSd.php                  |    9 +-
 languages/messages/MessagesSdc.php                 |   49 +-
 languages/messages/MessagesSe.php                  |   56 +-
 languages/messages/MessagesSei.php                 |   27 +-
 languages/messages/MessagesSg.php                  |    1 +
 languages/messages/MessagesSgs.php                 |   31 +-
 languages/messages/MessagesSh.php                  |  177 +-
 languages/messages/MessagesShi.php                 |   33 +-
 languages/messages/MessagesSi.php                  |  125 +-
 languages/messages/MessagesSk.php                  |  223 +-
 languages/messages/MessagesSl.php                  |  255 +-
 languages/messages/MessagesSli.php                 |   46 +-
 languages/messages/MessagesSm.php                  |    2 +-
 languages/messages/MessagesSma.php                 |    2 +-
 languages/messages/MessagesSn.php                  |    3 +
 languages/messages/MessagesSo.php                  |   52 +-
 languages/messages/MessagesSq.php                  |  100 +-
 languages/messages/MessagesSr_ec.php               |  208 +-
 languages/messages/MessagesSr_el.php               |  152 +-
 languages/messages/MessagesSrn.php                 |   18 +-
 languages/messages/MessagesSt.php                  |    2 +-
 languages/messages/MessagesStq.php                 |   64 +-
 languages/messages/MessagesSu.php                  |   59 +-
 languages/messages/MessagesSv.php                  |  278 +-
 languages/messages/MessagesSw.php                  |   84 +-
 languages/messages/MessagesSzl.php                 |   58 +-
 languages/messages/MessagesTa.php                  |  148 +-
 languages/messages/MessagesTcy.php                 |   10 +-
 languages/messages/MessagesTe.php                  |  135 +-
 languages/messages/MessagesTet.php                 |   12 +-
 languages/messages/MessagesTg_cyrl.php             |   57 +-
 languages/messages/MessagesTg_latn.php             |   52 +-
 languages/messages/MessagesTh.php                  |  237 +-
 languages/messages/MessagesTk.php                  |   65 +-
 languages/messages/MessagesTl.php                  |  113 +-
 languages/messages/MessagesTly.php                 |   13 +-
 languages/messages/MessagesTn.php                  |    3 +
 languages/messages/MessagesTo.php                  |   16 +-
 languages/messages/MessagesTpi.php                 |   17 +-
 languages/messages/MessagesTr.php                  |  225 +-
 languages/messages/MessagesTru.php                 |   12 +-
 languages/messages/MessagesTs.php                  |   20 +-
 languages/messages/MessagesTt_cyrl.php             |   85 +-
 languages/messages/MessagesTt_latn.php             |   52 +-
 languages/messages/MessagesTyv.php                 |  120 +-
 languages/messages/MessagesUdm.php                 |   20 +-
 languages/messages/MessagesUg_arab.php             |  109 +-
 languages/messages/MessagesUk.php                  |  278 +-
 languages/messages/MessagesUr.php                  |  100 +-
 languages/messages/MessagesUz.php                  |   71 +-
 languages/messages/MessagesVe.php                  |   10 +-
 languages/messages/MessagesVec.php                 |  166 +-
 languages/messages/MessagesVep.php                 |   51 +-
 languages/messages/MessagesVi.php                  |  326 +-
 languages/messages/MessagesVls.php                 |    6 +-
 languages/messages/MessagesVmf.php                 |  111 +-
 languages/messages/MessagesVo.php                  |  107 +-
 languages/messages/MessagesVot.php                 |   16 +-
 languages/messages/MessagesVro.php                 |   53 +-
 languages/messages/MessagesWa.php                  |   52 +-
 languages/messages/MessagesWar.php                 |  156 +-
 languages/messages/MessagesWo.php                  |   56 +-
 languages/messages/MessagesWuu.php                 |  118 +-
 languages/messages/MessagesXal.php                 |   32 +-
 languages/messages/MessagesXh.php                  |    3 +
 languages/messages/MessagesXmf.php                 |    9 +-
 languages/messages/MessagesYi.php                  |  248 +-
 languages/messages/MessagesYo.php                  |  127 +-
 languages/messages/MessagesYue.php                 |   95 +-
 languages/messages/MessagesZea.php                 |   33 +-
 languages/messages/MessagesZh_hans.php             |  269 +-
 languages/messages/MessagesZh_hant.php             |  283 +-
 languages/messages/MessagesZh_tw.php               |    7 +-
 languages/messages/MessagesZu.php                  |   47 +-
 languages/utils/CLDRPluralRuleEvaluator.php        |   10 +-
 load.php                                           |    8 +-
 maintenance/Doxyfile                               |   15 +-
 maintenance/Maintenance.php                        |   70 +-
 maintenance/archives/patch-archive-ar_id.sql       |    8 +
 maintenance/archives/patch-change_tag.sql          |   17 -
 maintenance/archives/patch-eu_local_id.sql         |    3 -
 maintenance/archives/patch-external_user.sql       |    9 -
 maintenance/archives/patch-externallinks-el_id.sql |    8 +
 .../patch-iwl_prefix_title_from-non-unique.sql     |    5 +
 .../archives/patch-iwlinks-from-title-index.sql    |    4 +
 maintenance/archives/patch-kill-iwl_pft.sql        |    7 -
 maintenance/archives/patch-tag_summary.sql         |   12 +
 maintenance/archives/patch-valid_tag.sql           |    4 +
 maintenance/archives/upgradeLogging.php            |    2 +-
 maintenance/attachLatest.php                       |    4 +-
 maintenance/backup.inc                             |   40 +-
 maintenance/backupPrefetch.inc                     |    8 +-
 maintenance/backupTextPass.inc                     |   68 +-
 maintenance/benchmarks/Benchmarker.php             |   10 +-
 maintenance/benchmarks/README                      |    7 +
 maintenance/benchmarks/bench_HTTP_HTTPS.php        |    4 +-
 maintenance/benchmarks/bench_delete_truncate.php   |    4 +-
 maintenance/benchmarks/bench_if_switch.php         |    4 +-
 maintenance/benchmarks/bench_strtr_str_replace.php |    4 +-
 maintenance/benchmarks/bench_utf8_title_check.php  |    6 +-
 maintenance/benchmarks/bench_wfBaseConvert.php     |    4 +-
 maintenance/benchmarks/bench_wfIsWindows.php       |    4 +-
 maintenance/benchmarks/benchmarkHooks.php          |    4 +-
 maintenance/benchmarks/benchmarkPurge.php          |    4 +-
 maintenance/cdb.php                                |   16 +-
 maintenance/changePassword.php                     |    4 +-
 maintenance/checkBadRedirects.php                  |    4 +-
 maintenance/checkImages.php                        |    4 +-
 maintenance/checkLess.php                          |   72 +
 maintenance/checkSyntax.php                        |   15 +-
 maintenance/checkUsernames.php                     |   34 +-
 maintenance/cleanupAncientTables.php               |   12 +-
 maintenance/cleanupCaps.php                        |    4 +-
 maintenance/cleanupImages.php                      |    4 +-
 maintenance/cleanupPreferences.php                 |    6 +-
 maintenance/cleanupRemovedModules.php              |   10 +-
 maintenance/cleanupSpam.php                        |    4 +-
 maintenance/cleanupTable.inc                       |   20 +-
 maintenance/cleanupTitles.php                      |   57 +-
 maintenance/cleanupUploadStash.php                 |   18 +-
 maintenance/cleanupWatchlist.php                   |    8 +-
 maintenance/clearCacheStats.php                    |    4 +-
 maintenance/clearInterwikiCache.php                |    4 +-
 maintenance/commandLine.inc                        |    4 +-
 maintenance/compareParsers.php                     |   11 +-
 maintenance/convertLinks.php                       |   15 +-
 maintenance/convertUserOptions.php                 |    4 +-
 maintenance/copyFileBackend.php                    |  221 +-
 maintenance/copyJobQueue.php                       |   99 +
 maintenance/createAndPromote.php                   |   20 +-
 maintenance/deleteArchivedFiles.inc                |    2 +-
 maintenance/deleteArchivedFiles.php                |    6 +-
 maintenance/deleteArchivedRevisions.php            |    6 +-
 maintenance/deleteBatch.php                        |    4 +-
 maintenance/deleteDefaultMessages.php              |    6 +-
 maintenance/deleteEqualMessages.php                |   15 +-
 maintenance/deleteImageMemcached.php               |   10 +-
 maintenance/deleteOldRevisions.php                 |    4 +-
 maintenance/deleteOrphanedRevisions.php            |   10 +-
 maintenance/deleteRevision.php                     |    4 +-
 maintenance/deleteSelfExternals.php                |    8 +-
 maintenance/dev/includes/router.php                |   16 +-
 maintenance/dictionary/mediawiki.dic               | 4556 ++++++++++
 maintenance/doMaintenance.php                      |   45 +-
 maintenance/dumpBackup.php                         |   12 +-
 maintenance/dumpIterator.php                       |   28 +-
 maintenance/dumpLinks.php                          |   11 +-
 maintenance/dumpSisterSites.php                    |   11 +-
 maintenance/dumpTextPass.php                       |    4 +-
 maintenance/dumpUploads.php                        |    4 +-
 maintenance/edit.php                               |    7 +-
 maintenance/eraseArchivedFile.php                  |  119 +
 maintenance/eval.php                               |    2 +-
 maintenance/fetchText.php                          |   10 +-
 maintenance/fileOpPerfTest.php                     |   26 +-
 maintenance/findHooks.php                          |    4 +-
 maintenance/fixDoubleRedirects.php                 |    4 +-
 maintenance/fixExtLinksProtocolRelative.php        |    4 +-
 maintenance/fixSlaveDesync.php                     |   12 +-
 maintenance/fixTimestamps.php                      |    4 +-
 maintenance/fixUserRegistration.php                |    4 +-
 maintenance/formatInstallDoc.php                   |    4 +-
 maintenance/fuzz-tester.php                        |   47 +-
 maintenance/generateSitemap.php                    |   40 +-
 maintenance/getConfiguration.php                   |  143 +-
 maintenance/getLagTimes.php                        |    6 +-
 maintenance/getSlaveServer.php                     |    4 +-
 maintenance/getText.php                            |    4 +-
 maintenance/hiphop/compiler.conf                   |    5 -
 maintenance/hiphop/extra-files                     |   34 -
 maintenance/hiphop/make                            |  311 -
 maintenance/hiphop/run-server                      |   61 +-
 maintenance/hiphop/server.conf                     |    4 +-
 maintenance/importDump.php                         |   26 +-
 maintenance/importImages.inc                       |    4 +-
 maintenance/importImages.php                       |   81 +-
 maintenance/importSiteScripts.php                  |    4 +-
 maintenance/importTextFile.php                     |   22 +-
 maintenance/initEditCount.php                      |    4 +-
 maintenance/initSiteStats.php                      |    6 +-
 maintenance/install.php                            |   12 +-
 maintenance/jsduck/MetaTags.rb                     |   16 +
 maintenance/jsduck/categories.json                 |   25 +-
 maintenance/jsduck/config.json                     |   15 +-
 maintenance/jsduck/eg-iframe.html                  |   86 +-
 maintenance/jsduck/external.js                     |   18 +
 maintenance/jsparse.php                            |   12 +-
 maintenance/lag.php                                |    4 +-
 maintenance/language/StatOutputs.php               |   12 +-
 maintenance/language/alltrans.php                  |    4 +-
 maintenance/language/checkDupeMessages.php         |   34 +-
 maintenance/language/checkExtensions.php           |    8 +-
 maintenance/language/checkLanguage.inc             |  210 +-
 maintenance/language/checkLanguage.php             |    6 +-
 maintenance/language/countMessages.php             |    6 +-
 maintenance/language/date-formats.php              |    4 +-
 maintenance/language/digit2html.php                |    6 +-
 maintenance/language/dumpMessages.php              |    4 +-
 maintenance/language/generateCollationData.php     |    8 +-
 maintenance/language/generateNormalizerData.php    |    6 +-
 maintenance/language/langmemusage.php              |    9 +-
 maintenance/language/languages.inc                 |   34 +-
 maintenance/language/messageTypes.inc              |   41 +-
 maintenance/language/messages.inc                  |  289 +-
 maintenance/language/rebuildLanguage.php           |   12 +-
 maintenance/language/transstat.php                 |    8 +-
 maintenance/language/validate.php                  |    6 +-
 maintenance/language/writeMessagesArray.inc        |   67 +-
 maintenance/mcc.php                                |    8 +-
 maintenance/mctest.php                             |   21 +-
 maintenance/mergeMessageFileList.php               |   86 +-
 maintenance/migrateUserGroup.php                   |    4 +-
 maintenance/minify.php                             |    4 +-
 maintenance/moveBatch.php                          |    4 +-
 maintenance/mssql/tables.sql                       |   15 +-
 maintenance/mwdoc-filter.php                       |    2 +-
 maintenance/mwdocgen.php                           |  320 +-
 maintenance/mwjsduck-gen                           |   23 +-
 maintenance/namespaceDupes.php                     |   16 +-
 maintenance/nextJobDB.php                          |    4 +-
 maintenance/nukeNS.php                             |    8 +-
 maintenance/nukePage.php                           |    6 +-
 maintenance/oracle/alterSharedConstraints.php      |   16 +-
 .../oracle/archives/patch-archive-ar_id.sql        |    6 +
 .../oracle/archives/patch-externallinks-el_id.sql  |    4 +
 maintenance/oracle/tables.sql                      |   24 +-
 maintenance/orphans.php                            |    8 +-
 maintenance/parse.php                              |   12 +-
 maintenance/patchSql.php                           |    4 +-
 maintenance/populateCategory.php                   |    4 +-
 maintenance/populateFilearchiveSha1.php            |    8 +-
 maintenance/populateImageSha1.php                  |    4 +-
 maintenance/populateLogSearch.php                  |   25 +-
 maintenance/populateLogUsertext.php                |    4 +-
 maintenance/populateParentId.php                   |    7 +-
 maintenance/populateRevisionLength.php             |   24 +-
 maintenance/populateRevisionSha1.php               |   10 +-
 .../postgres/archives/patch-external_user.sql      |    6 -
 .../postgres/archives/patch-kill-iwl_pft.sql       |    7 -
 maintenance/postgres/archives/patch-profiling.sql  |    3 +-
 .../postgres/archives/patch-rename-iwl_prefix.sql  |    2 +-
 maintenance/postgres/tables.sql                    |   20 +-
 maintenance/preprocessDump.php                     |    9 +-
 maintenance/preprocessorFuzzTest.php               |    4 +-
 maintenance/protect.php                            |    6 +-
 maintenance/proxyCheck.php                         |   70 -
 maintenance/pruneFileCache.php                     |    4 +-
 maintenance/purgeChangedFiles.php                  |  255 +
 maintenance/purgeChangedPages.php                  |  191 +
 maintenance/purgeDeletedFiles.php                  |   96 -
 maintenance/purgeList.php                          |   16 +-
 maintenance/purgeOldText.inc                       |   18 +-
 maintenance/purgeOldText.php                       |    4 +-
 maintenance/purgeParserCache.php                   |    4 +-
 maintenance/reassignEdits.php                      |    6 +-
 maintenance/rebuildFileCache.php                   |    7 +-
 maintenance/rebuildImages.php                      |    4 +-
 maintenance/rebuildLocalisationCache.php           |   22 +-
 maintenance/rebuildall.php                         |    8 +-
 maintenance/rebuildmessages.php                    |    7 +-
 maintenance/rebuildrecentchanges.php               |   22 +-
 maintenance/rebuildtextindex.php                   |    9 +-
 maintenance/refreshFileHeaders.php                 |    4 +-
 maintenance/refreshImageMetadata.php               |   14 +-
 maintenance/refreshLinks.php                       |   19 +-
 maintenance/removeUnusedAccounts.php               |    9 +-
 maintenance/renameDbPrefix.php                     |    4 +-
 maintenance/renderDump.php                         |   18 +-
 maintenance/resetUserTokens.php                    |   70 +-
 maintenance/rollbackEdits.php                      |    4 +-
 maintenance/runBatchedQuery.php                    |    7 +-
 maintenance/runJobs.php                            |   54 +-
 maintenance/showCacheStats.php                     |    4 +-
 maintenance/showJobs.php                           |   26 +-
 maintenance/showSiteStats.php                      |    7 +-
 maintenance/sql.php                                |   46 +-
 maintenance/sqlite.inc                             |   11 +-
 maintenance/sqlite.php                             |    4 +-
 maintenance/sqlite/archives/initial-indexes.sql    |   49 +
 .../sqlite/archives/patch-archive-ar_id.sql        |   39 +
 .../sqlite/archives/patch-externallinks-el_id.sql  |   19 +
 maintenance/sqlite/archives/patch-kill-iwl_pft.sql |    7 -
 .../sqlite/archives/patch-rename-iwl_prefix.sql    |    2 +-
 maintenance/storage/checkStorage.php               |   18 +-
 maintenance/storage/compressOld.php                |   35 +-
 maintenance/storage/dumpRev.php                    |    6 +-
 maintenance/storage/fixBug20757.php                |    4 +-
 maintenance/storage/moveToExternal.php             |    6 +-
 maintenance/storage/orphanStats.php                |    4 +-
 maintenance/storage/recompressTracked.php          |    4 +-
 maintenance/storage/resolveStubs.php               |    2 +-
 maintenance/storage/storageTypeStats.php           |    4 +-
 maintenance/storage/testCompression.php            |    2 +-
 maintenance/storage/trackBlobs.php                 |    2 +-
 maintenance/syncFileBackend.php                    |   13 +-
 maintenance/tables.sql                             |   35 +-
 maintenance/tidyUpBug37714.php                     |   49 +
 maintenance/undelete.php                           |    4 +-
 maintenance/update.php                             |   29 +-
 maintenance/updateArticleCount.php                 |    4 +-
 maintenance/updateCollation.php                    |    8 +-
 maintenance/updateDoubleWidthSearch.php            |    4 +-
 maintenance/updateRestrictions.php                 |    4 +-
 maintenance/updateSearchIndex.php                  |   11 +-
 maintenance/updateSpecialPages.php                 |   77 +-
 maintenance/userDupes.inc                          |   67 +-
 maintenance/userOptions.inc                        |   28 +-
 maintenance/userOptions.php                        |    2 +-
 maintenance/waitForSlave.php                       |    4 +-
 mw-config/index.php                                |    6 +-
 opensearch_desc.php                                |    2 +-
 profileinfo.php                                    |    9 +-
 redirect.php                                       |   36 -
 redirect.php5                                      |   24 -
 redirect.phtml                                     |    3 -
 resources/Resources.php                            |  220 +-
 resources/Resources.php.orig                       |  968 --
 resources/jquery.chosen/LICENSE                    |   24 +
 resources/jquery.chosen/chosen-sprite.png          |  Bin 0 -> 646 bytes
 resources/jquery.chosen/chosen-sprite@2x.png       |  Bin 0 -> 871 bytes
 resources/jquery.chosen/chosen.css                 |  440 +
 resources/jquery.chosen/chosen.jquery.js           | 1103 +++
 resources/jquery.tipsy/images/tipsy.png            |  Bin 175 -> 133 bytes
 .../default/images/ui-bg_flat_0_aaaaaa_40x100.png  |  Bin 180 -> 87 bytes
 .../default/images/ui-bg_flat_75_ffffff_40x100.png |  Bin 178 -> 87 bytes
 .../default/images/ui-bg_glass_55_fbf9ee_1x400.png |  Bin 120 -> 115 bytes
 .../default/images/ui-bg_glass_65_ffffff_1x400.png |  Bin 105 -> 99 bytes
 .../default/images/ui-bg_glass_75_dadada_1x400.png |  Bin 111 -> 111 bytes
 .../ui-bg_highlight-soft_75_cccccc_1x100.png       |  Bin 101 -> 86 bytes
 .../default/images/ui-icons_222222_256x240.png     |  Bin 4369 -> 3702 bytes
 .../default/images/ui-icons_2e83ff_256x240.png     |  Bin 4369 -> 3702 bytes
 .../default/images/ui-icons_454545_256x240.png     |  Bin 4369 -> 3702 bytes
 .../default/images/ui-icons_888888_256x240.png     |  Bin 4369 -> 3702 bytes
 .../default/images/ui-icons_cd0a0a_256x240.png     |  Bin 4369 -> 3702 bytes
 .../vector/images/button-blue-hover-large.png      |  Bin 260 -> 0 bytes
 .../themes/vector/images/button-blue-hover.png     |  Bin 175 -> 0 bytes
 .../themes/vector/images/button-blue-large.png     |  Bin 265 -> 0 bytes
 .../jquery.ui/themes/vector/images/button-blue.png |  Bin 175 -> 0 bytes
 .../themes/vector/images/button-disabled-blue.png  |  Bin 84 -> 0 bytes
 .../themes/vector/images/button-disabled-green.png |  Bin 149 -> 0 bytes
 .../themes/vector/images/button-disabled-red.png   |  Bin 84 -> 0 bytes
 .../themes/vector/images/button-disabled.png       |  Bin 84 -> 0 bytes
 .../themes/vector/images/button-down-blue.png      |  Bin 130 -> 0 bytes
 .../themes/vector/images/button-down-green.png     |  Bin 141 -> 0 bytes
 .../themes/vector/images/button-down-red.png       |  Bin 130 -> 0 bytes
 .../jquery.ui/themes/vector/images/button-down.png |  Bin 130 -> 0 bytes
 .../vector/images/button-green-hover-large.png     |  Bin 265 -> 0 bytes
 .../themes/vector/images/button-green-hover.png    |  Bin 175 -> 0 bytes
 .../themes/vector/images/button-green-large.png    |  Bin 265 -> 0 bytes
 .../themes/vector/images/button-green.png          |  Bin 175 -> 0 bytes
 .../vector/images/button-large-disabled-green.png  |  Bin 277 -> 0 bytes
 .../vector/images/button-large-off-green.png       |  Bin 282 -> 0 bytes
 .../themes/vector/images/button-off-blue.png       |  Bin 175 -> 0 bytes
 .../themes/vector/images/button-off-green.png      |  Bin 149 -> 0 bytes
 .../themes/vector/images/button-off-red.png        |  Bin 175 -> 0 bytes
 .../jquery.ui/themes/vector/images/button-off.png  |  Bin 152 -> 0 bytes
 .../vector/images/button-orange-hover-large.png    |  Bin 265 -> 0 bytes
 .../themes/vector/images/button-orange-hover.png   |  Bin 175 -> 0 bytes
 .../themes/vector/images/button-orange-large.png   |  Bin 265 -> 0 bytes
 .../themes/vector/images/button-orange.png         |  Bin 175 -> 0 bytes
 .../themes/vector/images/button-over-blue.png      |  Bin 175 -> 0 bytes
 .../themes/vector/images/button-over-green.png     |  Bin 149 -> 0 bytes
 .../themes/vector/images/button-over-red.png       |  Bin 174 -> 0 bytes
 .../jquery.ui/themes/vector/images/button-over.png |  Bin 155 -> 0 bytes
 .../vector/images/button-red-hover-large.png       |  Bin 260 -> 0 bytes
 .../themes/vector/images/button-red-hover.png      |  Bin 175 -> 0 bytes
 .../themes/vector/images/button-red-large.png      |  Bin 265 -> 0 bytes
 .../jquery.ui/themes/vector/images/button-red.png  |  Bin 175 -> 0 bytes
 .../themes/vector/images/titlebar-fade.png         |  Bin 188 -> 81 bytes
 .../jquery.ui/themes/vector/jquery.ui.button.css   |  368 +-
 .../images/jquery.arrowSteps.divider-ltr.png       |  Bin 135 -> 126 bytes
 .../images/jquery.arrowSteps.divider-rtl.png       |  Bin 139 -> 127 bytes
 .../jquery/images/jquery.arrowSteps.head-ltr.png   |  Bin 390 -> 303 bytes
 .../jquery/images/jquery.arrowSteps.head-rtl.png   |  Bin 365 -> 311 bytes
 .../jquery/images/jquery.arrowSteps.tail-ltr.png   |  Bin 223 -> 222 bytes
 resources/jquery/images/marker.png                 |  Bin 652 -> 472 bytes
 resources/jquery/images/mask.png                   |  Bin 2020 -> 1795 bytes
 resources/jquery/jquery.badge.css                  |    9 +-
 resources/jquery/jquery.byteLength.js              |   12 +
 resources/jquery/jquery.byteLimit.js               |    3 +-
 resources/jquery/jquery.checkboxShiftClick.js      |   16 +-
 resources/jquery/jquery.client.js                  |  100 +-
 resources/jquery/jquery.makeCollapsible.js         |  231 +-
 resources/jquery/jquery.placeholder.js             |    9 +-
 resources/jquery/jquery.spinner.css                |    2 +-
 resources/jquery/jquery.spinner.js                 |   47 +-
 resources/jquery/jquery.suggestions.js             |    4 +-
 resources/jquery/jquery.tablesorter.js             |  180 +-
 resources/jquery/jquery.textSelection.js           |    4 +-
 .../mediawiki.action/images/green-checkmark.png    |  Bin 0 -> 681 bytes
 .../mediawiki.action.edit.collapsibleFooter.css    |   17 +
 .../mediawiki.action.edit.collapsibleFooter.js     |   54 +
 .../mediawiki.action.edit.editWarning.js           |   56 +
 .../mediawiki.action/mediawiki.action.edit.js      |  167 +-
 .../mediawiki.action.edit.preview.js               |   53 +-
 .../mediawiki.action.edit.styles.css               |   44 +
 .../mediawiki.action/mediawiki.action.history.js   |    2 +-
 .../mediawiki.action.view.postEdit.css             |   77 +
 .../mediawiki.action.view.postEdit.js              |   75 +-
 .../mediawiki.action.view.rightClickEdit.js        |    4 +-
 resources/mediawiki.api/mediawiki.api.category.js  |   35 +-
 resources/mediawiki.api/mediawiki.api.edit.js      |   65 +-
 resources/mediawiki.api/mediawiki.api.js           |   88 +-
 resources/mediawiki.api/mediawiki.api.login.js     |   54 +
 resources/mediawiki.api/mediawiki.api.parse.js     |   12 +-
 resources/mediawiki.api/mediawiki.api.watch.js     |   12 +-
 resources/mediawiki.language/mediawiki.language.js |   23 +
 .../mediawiki.language.months.js                   |   54 +
 resources/mediawiki.less/mediawiki.mixins.less     |   46 +
 .../mediawiki.libs/mediawiki.libs.jpegmeta.js      |    2 +-
 resources/mediawiki.page/mediawiki.page.gallery.js |  248 +
 .../mediawiki.page.image.pagination.js             |   51 +
 .../mediawiki.page/mediawiki.page.patrol.ajax.js   |    2 +-
 resources/mediawiki.page/mediawiki.page.ready.js   |   38 +-
 resources/mediawiki.page/mediawiki.page.startup.js |   23 +-
 .../mediawiki.page/mediawiki.page.watch.ajax.js    |    6 +-
 .../images/arrow-collapsed-ltr.png                 |  Bin 206 -> 0 bytes
 .../images/arrow-collapsed-rtl.png                 |  Bin 205 -> 0 bytes
 .../mediawiki.special/images/arrow-expanded.png    |  Bin 205 -> 0 bytes
 .../images/glyph-people-large.png                  |  Bin 0 -> 1663 bytes
 .../mediawiki.special/images/icon-contributors.png |  Bin 0 -> 1169 bytes
 resources/mediawiki.special/images/icon-edits.png  |  Bin 0 -> 780 bytes
 resources/mediawiki.special/images/icon-lock.png   |  Bin 0 -> 172 bytes
 resources/mediawiki.special/images/icon-pages.png  |  Bin 0 -> 528 bytes
 .../mediawiki.special/mediawiki.special.block.js   |    2 +-
 .../mediawiki.special.changeemail.js               |    2 +-
 .../mediawiki.special.changeslist.css              |   57 -
 .../mediawiki.special.changeslist.enhanced.css     |   66 +
 .../mediawiki.special.createAccount.css            |   89 +
 .../mediawiki.special.createAccount.js             |  112 +
 .../mediawiki.special.movePage.js                  |    2 +-
 .../mediawiki.special.pagesWithProp.css            |    4 +
 .../mediawiki.special.preferences.js               |    2 +-
 .../mediawiki.special.recentchanges.js             |    2 +-
 .../mediawiki.special/mediawiki.special.search.js  |    2 +-
 .../mediawiki.special.undelete.js                  |    2 +-
 .../mediawiki.special/mediawiki.special.upload.js  |    4 +-
 .../mediawiki.special.userLogin.css                |   39 +
 .../mediawiki.special.userLogin.signup.js          |   10 -
 .../mediawiki.special/mediawiki.special.vforms.css |   46 +
 resources/mediawiki.ui/mediawiki.ui.default.css    |  272 +
 resources/mediawiki.ui/mediawiki.ui.vector.css     |  414 +
 resources/mediawiki.ui/sourcefiles/Makefile        |   24 +
 resources/mediawiki.ui/sourcefiles/config.rb       |   27 +
 .../sourcefiles/scss/components/_default.scss      |    3 +
 .../sourcefiles/scss/components/_utilities.scss    |   17 +
 .../sourcefiles/scss/components/_vector.scss       |    4 +
 .../scss/components/default/_buttons.scss          |   69 +
 .../scss/components/default/_forms.scss            |  114 +
 .../scss/components/vector/_buttons.scss           |   19 +
 .../scss/components/vector/_containers.scss        |    5 +
 .../sourcefiles/scss/components/vector/_forms.scss |    7 +
 .../sourcefiles/scss/mediawiki.ui.default.scss     |   16 +
 .../sourcefiles/scss/mediawiki.ui.vector.scss      |   15 +
 .../mediawiki.ui/sourcefiles/scss/mixins/_all.scss |    4 +
 .../sourcefiles/scss/mixins/_effects.scss          |   62 +
 .../sourcefiles/scss/mixins/_forms.scss            |   66 +
 .../sourcefiles/scss/mixins/_type.scss             |    6 +
 .../sourcefiles/scss/mixins/_utilities.scss        |   19 +
 .../sourcefiles/scss/settings/_all.scss            |    2 +
 .../sourcefiles/scss/settings/_colors.scss         |   17 +
 .../sourcefiles/scss/settings/_typography.scss     |    5 +
 resources/mediawiki/images/arrow-collapsed-ltr.png |  Bin 0 -> 133 bytes
 resources/mediawiki/images/arrow-collapsed-rtl.png |  Bin 0 -> 136 bytes
 resources/mediawiki/images/arrow-expanded.png      |  Bin 0 -> 134 bytes
 resources/mediawiki/mediawiki.Title.js             |  574 +-
 resources/mediawiki/mediawiki.Uri.js               |    4 +-
 resources/mediawiki/mediawiki.debug.js             |    2 +-
 resources/mediawiki/mediawiki.htmlform.js          |   70 +-
 resources/mediawiki/mediawiki.icon.css             |   15 +
 resources/mediawiki/mediawiki.inspect.js           |  204 +
 resources/mediawiki/mediawiki.jqueryMsg.js         |  335 +-
 resources/mediawiki/mediawiki.js                   |  496 +-
 resources/mediawiki/mediawiki.log.js               |   65 +-
 resources/mediawiki/mediawiki.notification.css     |   16 +-
 resources/mediawiki/mediawiki.notification.js      |   25 +-
 resources/mediawiki/mediawiki.notify.js            |   13 +-
 resources/mediawiki/mediawiki.searchSuggest.js     |   48 +-
 resources/mediawiki/mediawiki.user.js              |  253 +-
 resources/mediawiki/mediawiki.util.js              |  204 +-
 resources/startup.js                               |   42 +-
 serialized/serialize.php                           |    4 +-
 skins/ArchLinux.php                                |  120 +-
 skins/Chick.php                                    |   47 -
 skins/CologneBlue.php                              |   47 +-
 skins/Modern.php                                   |   55 +-
 skins/MonoBook.php                                 |  120 +-
 skins/MySkin.php                                   |   35 -
 skins/Nostalgia.php                                |  147 -
 skins/Simple.php                                   |   58 -
 skins/Standard.php                                 |  294 -
 skins/Vector.php                                   |  194 +-
 skins/archlinux/IE60Fixes.css                      |    9 -
 skins/archlinux/Opera6Fixes.css                    |   20 -
 skins/archlinux/Opera7Fixes.css                    |   21 -
 skins/archlinux/Opera9Fixes.css                    |   11 -
 skins/archlinux/external-ltr.png                   |  Bin 143 -> 141 bytes
 skins/archlinux/external-rtl.png                   |  Bin 141 -> 141 bytes
 skins/archlinux/main.css                           |   26 +-
 skins/archlinux/wiki-indexed.png                   |  Bin 8008 -> 8007 bytes
 skins/chick/IE60Fixes.css                          |   79 -
 skins/chick/main.css                               |  368 -
 skins/cologneblue/print.css                        |    6 +
 skins/cologneblue/screen.css                       |   19 +-
 skins/common/IEFixes.js                            |   82 +-
 skins/common/ajax.js                               |  121 +-
 skins/common/commonContent.css                     |   49 +-
 skins/common/commonElements.css                    |   26 +-
 skins/common/commonPrint.css                       |    7 +-
 skins/common/config.css                            |    8 +-
 skins/common/config.js                             |   14 +-
 skins/common/images/Arr_u.png                      |  Bin 207 -> 207 bytes
 skins/common/images/ar/button_headline.png         |  Bin 487 -> 484 bytes
 skins/common/images/ar/button_nowiki.png           |  Bin 875 -> 874 bytes
 skins/common/images/arrow_disabled_left_25.png     |  Bin 301 -> 301 bytes
 skins/common/images/arrow_disabled_right_25.png    |  Bin 307 -> 307 bytes
 skins/common/images/arrow_right_25.png             |  Bin 341 -> 337 bytes
 skins/common/images/button_hr.png                  |  Bin 222 -> 200 bytes
 skins/common/images/button_nowiki.png              |  Bin 322 -> 322 bytes
 skins/common/images/button_sig.png                 |  Bin 926 -> 920 bytes
 skins/common/images/button_template.png            |  Bin 188 -> 178 bytes
 skins/common/images/critical-32.png                |  Bin 1763 -> 1758 bytes
 skins/common/images/fa/button_nowiki.png           |  Bin 875 -> 874 bytes
 skins/common/images/feed-icon.png                  |  Bin 557 -> 542 bytes
 skins/common/images/icons/fileicon-psd.png         |  Bin 10376 -> 7756 bytes
 skins/common/images/magnify-clip-rtl.png           |  Bin 208 -> 149 bytes
 skins/common/images/question-small.png             |  Bin 0 -> 316 bytes
 skins/common/images/question.svg                   |   12 +
 skins/common/images/tick-32.png                    |  Bin 1137 -> 1103 bytes
 skins/common/images/warning-32.png                 |  Bin 1301 -> 1299 bytes
 skins/common/oldshared.css                         |   42 +-
 skins/common/protect.js                            |  236 +-
 skins/common/shared.css                            |  196 +-
 skins/common/upload.js                             |  322 +-
 skins/common/wikibits.js                           |  745 +-
 skins/common/wikiprintable.css                     |   59 -
 skins/modern/external.png                          |  Bin 143 -> 141 bytes
 skins/modern/main.css                              |   43 +-
 skins/modern/print.css                             |    2 +-
 skins/monobook/IE60Fixes.css                       |    9 -
 skins/monobook/Opera6Fixes.css                     |   20 -
 skins/monobook/Opera7Fixes.css                     |   21 -
 skins/monobook/Opera9Fixes.css                     |   11 -
 skins/monobook/external-ltr.png                    |  Bin 143 -> 141 bytes
 skins/monobook/external-rtl.png                    |  Bin 141 -> 141 bytes
 skins/monobook/main.css                            |   26 +-
 skins/monobook/wiki-indexed.png                    |  Bin 8008 -> 8007 bytes
 skins/myskin/main.css                              |    1 -
 skins/nostalgia/screen.css                         |   56 -
 skins/simple/discussionitem_icon.gif               |  Bin 549 -> 0 bytes
 skins/simple/external.png                          |  Bin 143 -> 0 bytes
 skins/simple/file_icon.gif                         |  Bin 323 -> 0 bytes
 skins/simple/link_icon.gif                         |  Bin 342 -> 0 bytes
 skins/simple/lock_icon.gif                         |  Bin 321 -> 0 bytes
 skins/simple/mail_icon.gif                         |  Bin 321 -> 0 bytes
 skins/simple/main.css                              |  427 -
 skins/standard/main.css                            |  188 -
 skins/vector/beta/screen.less                      |   75 +
 skins/vector/beta/variables.less                   |   37 +
 skins/vector/collapsibleNav.js                     |  121 +
 skins/vector/collapsibleNav.less                   |   91 +
 skins/vector/collapsibleTabs.js                    |  210 +
 skins/vector/externalLinks.less                    |   75 +
 skins/vector/images/arrow-collapsed-ltr.png        |  Bin 0 -> 143 bytes
 skins/vector/images/arrow-collapsed-ltr.svg        |   37 +
 skins/vector/images/arrow-collapsed-rtl.png        |  Bin 0 -> 145 bytes
 skins/vector/images/arrow-collapsed-rtl.svg        |   37 +
 skins/vector/images/arrow-down-focus-icon.svg      |   37 +
 skins/vector/images/arrow-down-icon.svg            |   37 +
 skins/vector/images/arrow-expanded.png             |  Bin 0 -> 145 bytes
 skins/vector/images/arrow-expanded.svg             |   37 +
 skins/vector/images/edit-icon.png                  |  Bin 277 -> 276 bytes
 skins/vector/images/external-link-ltr-icon.png     |  Bin 143 -> 141 bytes
 skins/vector/images/external-link-rtl-icon.png     |  Bin 141 -> 141 bytes
 skins/vector/images/mail-icon.png                  |  Bin 197 -> 197 bytes
 skins/vector/images/news-icon.png                  |  Bin 180 -> 180 bytes
 skins/vector/images/page-fade.png                  |  Bin 115 -> 115 bytes
 skins/vector/images/portal-break-ltr.png           |  Bin 169 -> 168 bytes
 skins/vector/images/preferences-break.png          |  Bin 205 -> 103 bytes
 skins/vector/images/tab-break.png                  |  Bin 125 -> 125 bytes
 skins/vector/images/talk-icon.png                  |  Bin 173 -> 173 bytes
 skins/vector/images/user-icon.svg                  |  424 +
 skins/vector/images/video-icon.png                 |  Bin 162 -> 162 bytes
 skins/vector/screen-hd.css                         |   28 -
 skins/vector/screen-hd.less                        |   28 +
 skins/vector/screen.css                            |  915 --
 skins/vector/screen.less                           |  791 ++
 skins/vector/styles-beta.less                      |   13 +
 skins/vector/styles.less                           |   11 +
 skins/vector/variables.less                        |   37 +
 skins/vector/vector.js                             |   52 +-
 tests/RunSeleniumTests.php                         |  258 -
 tests/TestsAutoLoader.php                          |   30 +-
 tests/parser/ParserTestResult.php                  |   42 +
 tests/parser/parserTest.inc                        |  274 +-
 tests/parser/parserTests.txt                       | 9493 +++++++++++++++-----
 .../parser/preprocess/All_system_messages.expected |   21 -
 tests/parser/preprocess/All_system_messages.txt    |   21 -
 tests/parserTests.php                              |    8 +-
 tests/phpunit/AutoLoaderTest.php                   |   51 -
 tests/phpunit/MediaWikiLangTestCase.php            |    4 +
 tests/phpunit/MediaWikiPHPUnitCommand.php          |   22 +-
 tests/phpunit/MediaWikiPHPUnitTestListener.php     |  114 +
 tests/phpunit/MediaWikiTestCase.php                |   32 +-
 tests/phpunit/StructureTest.php                    |   63 -
 tests/phpunit/bootstrap.php                        |   19 +-
 tests/phpunit/data/db/sqlite/tables-1.16.sql       |    5 -
 tests/phpunit/data/db/sqlite/tables-1.17.sql       |    5 -
 tests/phpunit/data/db/sqlite/tables-1.18.sql       |    5 -
 .../data/less/common/test.common.mixins.less       |    5 +
 tests/phpunit/data/less/module/dependency.less     |    3 +
 tests/phpunit/data/less/module/styles.css          |    6 +
 tests/phpunit/data/less/module/styles.less         |    6 +
 tests/phpunit/data/xmp/7.result.php                |   18 +-
 tests/phpunit/includes/ArticleTablesTest.php       |    7 +-
 tests/phpunit/includes/ArticleTest.php             |   12 +-
 tests/phpunit/includes/BlockTest.php               |  143 +-
 tests/phpunit/includes/CdbTest.php                 |    2 +-
 tests/phpunit/includes/CollationTest.php           |    8 +-
 tests/phpunit/includes/DiffHistoryBlobTest.php     |    9 +-
 tests/phpunit/includes/EditPageTest.php            |   93 +-
 tests/phpunit/includes/ExternalStoreTest.php       |    2 +-
 tests/phpunit/includes/ExtraParserTest.php         |   27 +-
 tests/phpunit/includes/FallbackTest.php            |   73 +
 tests/phpunit/includes/FauxRequestTest.php         |   15 +
 tests/phpunit/includes/FauxResponseTest.php        |    9 +-
 .../includes/FormOptionsInitializationTest.php     |    1 -
 .../includes/GlobalFunctions/GlobalTest.php        |  201 +-
 .../includes/GlobalFunctions/GlobalWithDBTest.php  |    6 +-
 .../includes/GlobalFunctions/wfAssembleUrlTest.php |    7 +-
 .../includes/GlobalFunctions/wfBCP47Test.php       |   20 +-
 .../includes/GlobalFunctions/wfBaseConvertTest.php |    3 +-
 .../includes/GlobalFunctions/wfBaseNameTest.php    |    6 +-
 .../includes/GlobalFunctions/wfExpandUrlTest.php   |   20 +-
 .../includes/GlobalFunctions/wfGetCallerTest.php   |   15 +-
 .../includes/GlobalFunctions/wfParseUrlTest.php    |    9 +-
 .../GlobalFunctions/wfRemoveDotSegmentsTest.php    |    6 +-
 .../GlobalFunctions/wfShorthandToIntegerTest.php   |    8 +-
 .../includes/GlobalFunctions/wfTimestampTest.php   |   19 +-
 .../includes/GlobalFunctions/wfUrlencodeTest.php   |   11 +-
 tests/phpunit/includes/HTMLCheckMatrixTest.php     |  102 +
 tests/phpunit/includes/HashRingTest.php            |   53 +
 tests/phpunit/includes/HooksTest.php               |  171 +-
 tests/phpunit/includes/HtmlFormatterTest.php       |   81 +
 tests/phpunit/includes/HtmlTest.php                |   65 +-
 tests/phpunit/includes/HttpTest.php                |   11 +-
 tests/phpunit/includes/IPTest.php                  |   78 +-
 tests/phpunit/includes/JsonTest.php                |   27 -
 tests/phpunit/includes/LanguageConverterTest.php   |   35 +-
 tests/phpunit/includes/LicensesTest.php            |    2 +-
 tests/phpunit/includes/LinkerTest.php              |    4 +-
 tests/phpunit/includes/LinksUpdateTest.php         |   23 +-
 tests/phpunit/includes/LocalFileTest.php           |   22 +-
 tests/phpunit/includes/MWExceptionHandlerTest.php  |   73 +
 tests/phpunit/includes/MWFunctionTest.php          |   47 +-
 tests/phpunit/includes/MWNamespaceTest.php         |   21 +-
 tests/phpunit/includes/MessageTest.php             |   78 +-
 tests/phpunit/includes/OutputPageTest.php          |   73 +-
 tests/phpunit/includes/PathRouterTest.php          |   36 +-
 tests/phpunit/includes/PreferencesTest.php         |   23 +-
 tests/phpunit/includes/Providers.php               |   44 -
 tests/phpunit/includes/RecentChangeTest.php        |   34 +-
 tests/phpunit/includes/RequestContextTest.php      |    8 +-
 tests/phpunit/includes/ResourceLoaderTest.php      |   62 +-
 tests/phpunit/includes/RevisionStorageTest.php     |   16 +-
 .../RevisionStorageTest_ContentHandlerUseDB.php    |   20 +-
 tests/phpunit/includes/RevisionTest.php            |   78 +-
 tests/phpunit/includes/SampleTest.php              |    4 +-
 tests/phpunit/includes/SanitizerTest.php           |  114 +-
 .../includes/SanitizerValidateEmailTest.php        |   35 +-
 .../phpunit/includes/SeleniumConfigurationTest.php |  222 -
 tests/phpunit/includes/SiteConfigurationTest.php   |   39 +-
 tests/phpunit/includes/StringUtilsTest.php         |  166 +-
 tests/phpunit/includes/TemplateCategoriesTest.php  |   24 +-
 tests/phpunit/includes/TestUser.php                |    7 +-
 tests/phpunit/includes/TimeAdjustTest.php          |   40 +-
 tests/phpunit/includes/TimestampTest.php           |  264 +-
 tests/phpunit/includes/TitleMethodsTest.php        |   20 +-
 tests/phpunit/includes/TitlePermissionTest.php     |  142 +-
 tests/phpunit/includes/TitleTest.php               |  194 +-
 tests/phpunit/includes/UIDGeneratorTest.php        |   22 +
 tests/phpunit/includes/UserMailerTest.php          |   14 +
 tests/phpunit/includes/UserTest.php                |   20 +
 tests/phpunit/includes/WebRequestTest.php          |  114 +-
 tests/phpunit/includes/WikiPageTest.php            |   68 +-
 .../includes/WikiPageTest_ContentHandlerUseDB.php  |   25 +-
 tests/phpunit/includes/XmlJsTest.php               |   25 +-
 tests/phpunit/includes/XmlSelectTest.php           |   39 +-
 tests/phpunit/includes/XmlTest.php                 |  132 +-
 tests/phpunit/includes/XmlTypeCheckTest.php        |   30 +
 tests/phpunit/includes/ZipDirectoryReaderTest.php  |   27 +-
 .../includes/api/ApiAccountCreationTest.php        |   56 +-
 tests/phpunit/includes/api/ApiBlockTest.php        |   21 +-
 tests/phpunit/includes/api/ApiEditPageTest.php     |  107 +-
 tests/phpunit/includes/api/ApiOptionsTest.php      |   38 +-
 tests/phpunit/includes/api/ApiParseTest.php        |    5 +-
 tests/phpunit/includes/api/ApiPurgeTest.php        |    3 +-
 tests/phpunit/includes/api/ApiTest.php             |   47 +-
 tests/phpunit/includes/api/ApiTestCase.php         |   40 +-
 tests/phpunit/includes/api/ApiTestCaseUpload.php   |    4 +-
 tests/phpunit/includes/api/ApiUploadTest.php       |   42 +-
 tests/phpunit/includes/api/ApiWatchTest.php        |   55 +-
 .../phpunit/includes/api/RandomImageGenerator.php  |   13 +-
 .../includes/api/format/ApiFormatPhpTest.php       |    4 +-
 .../phpunit/includes/api/generateRandomImages.php  |    6 +-
 .../includes/api/query/ApiQueryBasicTest.php       |   77 +-
 .../includes/api/query/ApiQueryContinue2Test.php   |   14 +-
 .../includes/api/query/ApiQueryContinueTest.php    |  198 +-
 .../api/query/ApiQueryContinueTestBase.php         |   62 +-
 .../includes/api/query/ApiQueryRevisionsTest.php   |    2 +-
 tests/phpunit/includes/api/query/ApiQueryTest.php  |    7 +-
 .../includes/api/query/ApiQueryTestBase.php        |   15 +-
 tests/phpunit/includes/cache/GenderCacheTest.php   |    9 +-
 tests/phpunit/includes/cache/MessageCacheTest.php  |  128 +
 .../phpunit/includes/cache/ProcessCacheLRUTest.php |   24 +-
 .../includes/content/ContentHandlerTest.php        |   99 +-
 tests/phpunit/includes/content/CssContentTest.php  |    8 +-
 .../includes/content/JavaScriptContentTest.php     |   20 +-
 tests/phpunit/includes/content/TextContentTest.php |   43 +-
 .../content/WikitextContentHandlerTest.php         |   44 +-
 .../includes/content/WikitextContentTest.php       |   24 +-
 .../phpunit/includes/db/DatabaseMysqlBaseTest.php  |  209 +
 tests/phpunit/includes/db/DatabaseSQLTest.php      |  633 +-
 tests/phpunit/includes/db/DatabaseSqliteTest.php   |   46 +-
 tests/phpunit/includes/db/DatabaseTest.php         |   62 +-
 tests/phpunit/includes/db/DatabaseTestHelper.php   |  166 +
 tests/phpunit/includes/db/ORMRowTest.php           |    1 +
 tests/phpunit/includes/db/ORMTableTest.php         |    2 +-
 tests/phpunit/includes/db/TestORMRowTest.php       |   52 +-
 tests/phpunit/includes/debug/MWDebugTest.php       |    8 +-
 .../includes/filebackend/FileBackendTest.php       |  251 +-
 tests/phpunit/includes/filerepo/FileRepoTest.php   |   25 +-
 tests/phpunit/includes/filerepo/StoreBatchTest.php |   13 +-
 .../includes/installer/InstallDocFormatterTest.php |    7 +-
 .../includes/installer/OracleInstallerTest.php     |   48 +
 tests/phpunit/includes/jobqueue/JobQueueTest.php   |  129 +-
 tests/phpunit/includes/json/FormatJsonTest.php     |  161 +
 tests/phpunit/includes/json/ServicesJsonTest.php   |   93 -
 tests/phpunit/includes/libs/CSSJanusTest.php       |   72 +-
 tests/phpunit/includes/libs/CSSMinTest.php         |   12 +-
 .../includes/libs/GenericArrayObjectTest.php       |    3 +-
 tests/phpunit/includes/libs/IEUrlExtensionTest.php |   30 +-
 .../includes/libs/JavaScriptMinifierTest.php       |    8 +-
 .../includes/media/BitmapMetadataHandlerTest.php   |   29 +-
 tests/phpunit/includes/media/BitmapScalingTest.php |   47 +-
 tests/phpunit/includes/media/ExifBitmapTest.php    |   53 +-
 tests/phpunit/includes/media/ExifRotationTest.php  |   49 +-
 tests/phpunit/includes/media/ExifTest.php          |   12 +-
 tests/phpunit/includes/media/FakeDimensionFile.php |   28 +
 .../phpunit/includes/media/FormatMetadataTest.php  |   11 +-
 .../includes/media/GIFMetadataExtractorTest.php    |    1 +
 tests/phpunit/includes/media/GIFTest.php           |   16 +
 tests/phpunit/includes/media/IPTCTest.php          |   31 +-
 .../includes/media/JpegMetadataExtractorTest.php   |    5 +-
 tests/phpunit/includes/media/JpegTest.php          |   10 +-
 tests/phpunit/includes/media/MediaHandlerTest.php  |    7 +-
 .../includes/media/PNGMetadataExtractorTest.php    |   32 +-
 tests/phpunit/includes/media/PNGTest.php           |   16 +
 .../includes/media/SVGMetadataExtractorTest.php    |    9 +-
 tests/phpunit/includes/media/TiffTest.php          |   20 +-
 tests/phpunit/includes/media/XMPTest.php           |   17 +-
 tests/phpunit/includes/media/XMPValidateTest.php   |    5 +-
 tests/phpunit/includes/normal/CleanUpTest.php      |   32 +-
 .../phpunit/includes/objectcache/BagOStuffTest.php |   13 +-
 .../phpunit/includes/parser/MagicVariableTest.php  |  107 +-
 .../includes/parser/MediaWikiParserTest.php        |  108 +-
 tests/phpunit/includes/parser/NewParserTest.php    |  347 +-
 .../phpunit/includes/parser/ParserMethodsTest.php  |   48 +-
 tests/phpunit/includes/parser/ParserOutputTest.php |   12 +-
 .../phpunit/includes/parser/ParserPreloadTest.php  |   18 +-
 tests/phpunit/includes/parser/PreprocessorTest.php |   38 +-
 tests/phpunit/includes/parser/TagHooksTest.php     |    8 +-
 tests/phpunit/includes/parser/TidyTest.php         |   44 +
 tests/phpunit/includes/search/SearchEngineTest.php |   14 +-
 tests/phpunit/includes/search/SearchUpdateTest.php |   15 +-
 tests/phpunit/includes/site/MediaWikiSiteTest.php  |    5 +-
 tests/phpunit/includes/site/SiteListTest.php       |    9 +-
 tests/phpunit/includes/site/SiteSQLStoreTest.php   |   13 +-
 tests/phpunit/includes/site/SiteTest.php           |   33 +-
 tests/phpunit/includes/site/TestSites.php          |    1 -
 .../includes/specials/QueryAllSpecialPagesTest.php |    2 +-
 .../includes/specials/SpecialPreferencesTest.php   |   60 +
 .../includes/specials/SpecialRecentchangesTest.php |    2 -
 .../includes/specials/SpecialSearchTest.php        |    9 +-
 tests/phpunit/includes/upload/UploadBaseTest.php   |  147 +
 .../phpunit/includes/upload/UploadFromUrlTest.php  |   18 +-
 tests/phpunit/includes/upload/UploadStashTest.php  |    3 +-
 tests/phpunit/includes/upload/UploadTest.php       |  144 -
 tests/phpunit/install-phpunit.sh                   |    2 +-
 tests/phpunit/languages/LanguageAmTest.php         |   18 +-
 tests/phpunit/languages/LanguageArTest.php         |   29 +-
 tests/phpunit/languages/LanguageBeTest.php         |   18 +-
 tests/phpunit/languages/LanguageBe_taraskTest.php  |   59 +-
 tests/phpunit/languages/LanguageBhoTest.php        |   19 +-
 tests/phpunit/languages/LanguageBsTest.php         |   19 +-
 .../phpunit/languages/LanguageClassesTestCase.php  |   58 +-
 tests/phpunit/languages/LanguageCsTest.php         |   19 +-
 tests/phpunit/languages/LanguageCuTest.php         |   31 +-
 tests/phpunit/languages/LanguageCyTest.php         |   19 +-
 tests/phpunit/languages/LanguageDsbTest.php        |   19 +-
 tests/phpunit/languages/LanguageFrTest.php         |   19 +-
 tests/phpunit/languages/LanguageGaTest.php         |   19 +-
 tests/phpunit/languages/LanguageGdTest.php         |   39 +-
 tests/phpunit/languages/LanguageGvTest.php         |   21 +-
 tests/phpunit/languages/LanguageHeTest.php         |  119 +-
 tests/phpunit/languages/LanguageHiTest.php         |   19 +-
 tests/phpunit/languages/LanguageHrTest.php         |   19 +-
 tests/phpunit/languages/LanguageHsbTest.php        |   19 +-
 tests/phpunit/languages/LanguageHuTest.php         |   19 +-
 tests/phpunit/languages/LanguageHyTest.php         |   20 +-
 tests/phpunit/languages/LanguageKshTest.php        |   19 +-
 tests/phpunit/languages/LanguageLnTest.php         |   19 +-
 tests/phpunit/languages/LanguageLtTest.php         |   38 +-
 tests/phpunit/languages/LanguageLvTest.php         |   19 +-
 tests/phpunit/languages/LanguageMgTest.php         |   19 +-
 tests/phpunit/languages/LanguageMkTest.php         |   21 +-
 tests/phpunit/languages/LanguageMlTest.php         |   11 +-
 tests/phpunit/languages/LanguageMoTest.php         |   18 +-
 tests/phpunit/languages/LanguageMtTest.php         |   59 +-
 tests/phpunit/languages/LanguageNlTest.php         |    6 +-
 tests/phpunit/languages/LanguageNsoTest.php        |   22 +-
 tests/phpunit/languages/LanguagePlTest.php         |   59 +-
 tests/phpunit/languages/LanguageRoTest.php         |   18 +-
 tests/phpunit/languages/LanguageRuTest.php         |   44 +-
 tests/phpunit/languages/LanguageSeTest.php         |   27 +-
 tests/phpunit/languages/LanguageSgsTest.php        |   27 +-
 tests/phpunit/languages/LanguageShTest.php         |   30 +-
 tests/phpunit/languages/LanguageSkTest.php         |   18 +-
 tests/phpunit/languages/LanguageSlTest.php         |   22 +-
 tests/phpunit/languages/LanguageSmaTest.php        |   27 +-
 tests/phpunit/languages/LanguageSrTest.php         |   84 +-
 tests/phpunit/languages/LanguageTest.php           |  311 +-
 tests/phpunit/languages/LanguageTiTest.php         |   22 +-
 tests/phpunit/languages/LanguageTlTest.php         |   22 +-
 tests/phpunit/languages/LanguageTrTest.php         |    5 +-
 tests/phpunit/languages/LanguageUkTest.php         |   35 +-
 tests/phpunit/languages/LanguageUzTest.php         |   28 +-
 tests/phpunit/languages/LanguageWaTest.php         |   22 +-
 .../utils/CLDRPluralRuleEvaluatorTest.php          |    2 +-
 tests/phpunit/maintenance/DumpTestCase.php         |   26 +-
 tests/phpunit/maintenance/MaintenanceTest.php      |    6 +-
 tests/phpunit/maintenance/backupPrefetchTest.php   |    3 -
 tests/phpunit/maintenance/backupTextPassTest.php   |    7 +-
 tests/phpunit/maintenance/backup_LogTest.php       |    4 +-
 tests/phpunit/maintenance/backup_PageTest.php      |    6 +-
 tests/phpunit/maintenance/fetchTextTest.php        |    2 -
 tests/phpunit/maintenance/getSlaveServerTest.php   |    2 -
 tests/phpunit/mocks/filebackend/MockFSFile.php     |   69 +
 .../phpunit/mocks/filebackend/MockFileBackend.php  |  122 +
 tests/phpunit/mocks/media/MockBitmapHandler.php    |   92 +
 tests/phpunit/phpunit.php                          |   24 +-
 tests/phpunit/resources/ResourcesTest.php          |  128 -
 tests/phpunit/skins/SideBarTest.php                |   75 +-
 tests/phpunit/structure/AutoLoaderTest.php         |   56 +
 tests/phpunit/structure/ResourcesTest.php          |  131 +
 tests/phpunit/structure/StructureTest.php          |   63 +
 tests/phpunit/suite.xml                            |   27 +-
 tests/phpunit/suites/ExtensionsParserTestSuite.php |    8 +
 tests/phpunit/suites/UploadFromUrlTestSuite.php    |   13 +-
 tests/qunit/QUnitTestResources.php                 |    4 +-
 tests/qunit/data/generateJqueryMsgData.php         |    4 +-
 tests/qunit/data/load.mock.php                     |    3 +-
 tests/qunit/data/testrunner.js                     |   29 +-
 .../resources/jquery/jquery.byteLength.test.js     |   24 +-
 .../resources/jquery/jquery.byteLimit.test.js      |  120 +-
 .../suites/resources/jquery/jquery.client.test.js  |  283 +-
 .../resources/jquery/jquery.localize.test.js       |   10 +-
 .../jquery/jquery.makeCollapsible.test.js          |  287 +
 .../resources/jquery/jquery.tablesorter.test.js    |  166 +-
 .../resources/jquery/jquery.textSelection.test.js  |    7 -
 .../mediawiki.special.recentchanges.test.js        |    2 +-
 .../resources/mediawiki/mediawiki.Title.test.js    |  268 +-
 .../mediawiki/mediawiki.jqueryMsg.test.js          |  337 +-
 .../suites/resources/mediawiki/mediawiki.test.js   |  171 +-
 .../resources/mediawiki/mediawiki.user.test.js     |    6 +-
 .../resources/mediawiki/mediawiki.util.test.js     |   91 +-
 tests/qunit/suites/resources/startup.test.js       |  129 +
 tests/selenium/Selenium.php                        |  191 -
 tests/selenium/SeleniumConfig.php                  |   80 -
 tests/selenium/SeleniumLoader.php                  |    9 -
 tests/selenium/SeleniumServerManager.php           |  252 -
 tests/selenium/SeleniumTestCase.php                |  127 -
 tests/selenium/SeleniumTestConsoleLogger.php       |   25 -
 tests/selenium/SeleniumTestConstants.php           |   24 -
 tests/selenium/SeleniumTestHTMLLogger.php          |   36 -
 tests/selenium/SeleniumTestListener.php            |   65 -
 tests/selenium/SeleniumTestSuite.php               |   57 -
 tests/selenium/data/SimpleSeleniumTestDB.sql       | 1453 ---
 tests/selenium/data/SimpleSeleniumTestImages.zip   |  Bin 21993 -> 0 bytes
 tests/selenium/data/Wikipedia-logo-v2-de.png       |  Bin 21479 -> 0 bytes
 .../data/mediawiki118_fresh_installation.sql       | 1543 ----
 .../MediaWikiButtonsAvailabilityTestCase.php       |   90 -
 .../MediaWikiDifferentDatabaseAccountTestCase.php  |   73 -
 .../MediaWikiDifferntDatabasePrefixTestCase.php    |   88 -
 ...ediaWikiErrorsConnectToDatabasePageTestCase.php |  131 -
 .../installer/MediaWikiErrorsNamepageTestCase.php  |  119 -
 .../installer/MediaWikiHelpFieldHintTestCase.php   |  128 -
 .../MediaWikiInstallationCommonFunction.php        |  259 -
 .../installer/MediaWikiInstallationConfig.php      |   45 -
 .../installer/MediaWikiInstallationMessage.php     |   53 -
 .../installer/MediaWikiInstallationVariables.php   |   73 -
 .../installer/MediaWikiInstallerTestSuite.php      |   49 -
 .../installer/MediaWikiMySQLDataBaseTestCase.php   |   71 -
 .../MediaWikiMySQLiteDataBaseTestCase.php          |   73 -
 .../MediaWikiOnAlreadyInstalledTestCase.php        |   65 -
 .../MediaWikiRestartInstallationTestCase.php       |  104 -
 .../MediaWikiRightFrameworkLinksTestCase.php       |   83 -
 .../MediaWikiUpgradeExistingDatabaseTestCase.php   |  111 -
 .../installer/MediaWikiUserInterfaceTestCase.php   |  494 -
 tests/selenium/installer/README.txt                |   32 -
 tests/selenium/selenium_settings.ini.sample        |   32 -
 tests/selenium/selenium_settings_grid.ini.sample   |   16 -
 .../suites/AddContentToNewPageTestCase.php         |  173 -
 tests/selenium/suites/AddNewPageTestCase.php       |   59 -
 tests/selenium/suites/CreateAccountTestCase.php    |  109 -
 tests/selenium/suites/DeletePageAdminTestCase.php  |   82 -
 tests/selenium/suites/EmailPasswordTestCase.php    |   74 -
 tests/selenium/suites/MediaWikiEditorConfig.php    |   41 -
 tests/selenium/suites/MediaWikiEditorTestSuite.php |   19 -
 tests/selenium/suites/MediaWikiExtraTestSuite.php  |   21 -
 .../selenium/suites/MediawikiCoreSmokeTestCase.php |   70 -
 .../suites/MediawikiCoreSmokeTestSuite.php         |   19 -
 tests/selenium/suites/MovePageTestCase.php         |  111 -
 tests/selenium/suites/MyContributionsTestCase.php  |   59 -
 tests/selenium/suites/MyWatchListTestCase.php      |   51 -
 tests/selenium/suites/PageDeleteTestSuite.php      |   15 -
 tests/selenium/suites/PageSearchTestCase.php       |   98 -
 tests/selenium/suites/PreviewPageTestCase.php      |   48 -
 tests/selenium/suites/SavePageTestCase.php         |   53 -
 tests/selenium/suites/SimpleSeleniumConfig.php     |   30 -
 tests/selenium/suites/SimpleSeleniumTestCase.php   |   39 -
 tests/selenium/suites/SimpleSeleniumTestSuite.php  |   26 -
 tests/selenium/suites/UserPreferencesTestCase.php  |  170 -
 tests/testHelpers.inc                              |   33 +-
 thumb.php                                          |  198 +-
 thumb_handler.php                                  |    2 +-
 wiki.phtml                                         |    2 +-
 1928 files changed, 103628 insertions(+), 71618 deletions(-)
 mode change 100644 => 120000 README.mediawiki
 delete mode 100644 RELEASE-NOTES-1.21
 create mode 100644 RELEASE-NOTES-1.22
 create mode 100644 composer-example.json
 delete mode 100644 composer.json
 delete mode 100644 docs/upload.txt
 create mode 100644 extensions/Cite/.jshintignore
 create mode 100644 extensions/Cite/.jshintrc
 delete mode 100644 extensions/Cite/citeCatTreeParserTests.txt
 create mode 100644 extensions/Cite/modules/ext.cite.css
 create mode 100644 extensions/Cite/modules/ext.cite.js
 create mode 100644 extensions/Cite/modules/ext.cite.popups.js
 delete mode 100644 extensions/Cite/modules/ext.cite/ext.cite.js
 create mode 100644 extensions/Cite/modules/ext.rtlcite.css
 delete mode 100644 extensions/Cite/modules/ext.rtlcite/ext.rtlcite.css
 create mode 100644 extensions/Cite/modules/ext.specialcite.css
 delete mode 100644 extensions/Cite/modules/ext.specialcite/ext.specialcite.css
 create mode 100644 extensions/ConfirmEdit/blacklist
 create mode 100644 extensions/Gadgets/GadgetHooks.php
 delete mode 100644 extensions/Vector/.gitreview
 delete mode 100644 extensions/Vector/README
 delete mode 100644 extensions/Vector/Vector.hooks.php
 delete mode 100644 extensions/Vector/Vector.i18n.php
 delete mode 100644 extensions/Vector/Vector.php
 delete mode 100644 extensions/Vector/modules/ext.vector.collapsibleNav.css
 delete mode 100644 extensions/Vector/modules/ext.vector.collapsibleNav.js
 delete mode 100644 extensions/Vector/modules/ext.vector.collapsibleTabs.js
 delete mode 100644 extensions/Vector/modules/ext.vector.expandableSearch.css
 delete mode 100644 extensions/Vector/modules/ext.vector.expandableSearch.js
 delete mode 100644 extensions/Vector/modules/ext.vector.footerCleanup.css
 delete mode 100644 extensions/Vector/modules/ext.vector.footerCleanup.js
 delete mode 100644 extensions/Vector/modules/ext.vector.sectionEditLinks.css
 delete mode 100644 extensions/Vector/modules/ext.vector.sectionEditLinks.js
 delete mode 100644 extensions/Vector/modules/images/closed-ltr.png
 delete mode 100644 extensions/Vector/modules/images/closed-rtl.png
 delete mode 100644 extensions/Vector/modules/images/edit-faded.png
 delete mode 100644 extensions/Vector/modules/images/edit.png
 delete mode 100644 extensions/Vector/modules/images/open.png
 delete mode 100644 extensions/Vector/modules/images/portal-break.png
 delete mode 100644 extensions/Vector/modules/jquery.collapsibleTabs.js
 delete mode 100644 extensions/Vector/modules/jquery.footerCollapsibleList.js
 delete mode 100644 extensions/Vector/switchExperimentPrefs.php
 create mode 100644 extensions/WikiEditor/modules/images/dialogs/insert-disambiguation.png
 create mode 100644 includes/CallableUpdate.php
 delete mode 100644 includes/ChangesList.php
 delete mode 100644 includes/CryptRand.php
 delete mode 100644 includes/ExternalEdit.php
 delete mode 100644 includes/ExternalUser.php
 create mode 100644 includes/HashRing.php
 create mode 100644 includes/HtmlFormatter.php
 delete mode 100644 includes/ImageGallery.php
 create mode 100644 includes/MWCryptRand.php
 delete mode 100644 includes/RecentChange.php
 delete mode 100644 includes/SeleniumWebSettings.php
 delete mode 100644 includes/SkinLegacy.php
 create mode 100644 includes/StatCounter.php
 create mode 100644 includes/api/ApiQueryFileRepoInfo.php
 create mode 100644 includes/changes/ChangesList.php
 create mode 100644 includes/changes/EnhancedChangesList.php
 create mode 100644 includes/changes/OldChangesList.php
 create mode 100644 includes/changes/RCCacheEntry.php
 create mode 100644 includes/changes/RecentChange.php
 create mode 100644 includes/db/ChronologyProtector.php
 create mode 100644 includes/db/DatabaseMysqlBase.php
 create mode 100644 includes/db/DatabaseMysqli.php
 delete mode 100644 includes/extauth/Hardcoded.php
 delete mode 100644 includes/extauth/MediaWiki.php
 delete mode 100644 includes/extauth/vB.php
 create mode 100644 includes/filebackend/lockmanager/RedisLockManager.php
 create mode 100644 includes/gallery/ImageGalleryBase.php
 create mode 100644 includes/gallery/NolinesImageGallery.php
 create mode 100644 includes/gallery/PackedImageGallery.php
 create mode 100644 includes/gallery/PackedOverlayImageGallery.php
 create mode 100644 includes/gallery/TraditionalImageGallery.php
 delete mode 100644 includes/job/JobQueueAggregator.php
 delete mode 100644 includes/job/JobQueueAggregatorMemc.php
 delete mode 100644 includes/job/JobQueueAggregatorRedis.php
 create mode 100644 includes/job/JobQueueFederated.php
 create mode 100644 includes/job/JobQueueRedis.php
 create mode 100644 includes/job/aggregator/JobQueueAggregator.php
 create mode 100644 includes/job/aggregator/JobQueueAggregatorMemc.php
 create mode 100644 includes/job/aggregator/JobQueueAggregatorRedis.php
 delete mode 100644 includes/json/Services_JSON.php
 create mode 100644 includes/libs/lessc.inc.php
 create mode 100644 includes/logging/DeleteLogFormatter.php
 create mode 100644 includes/logging/MoveLogFormatter.php
 create mode 100644 includes/logging/NewUsersLogFormatter.php
 create mode 100644 includes/logging/PatrolLogFormatter.php
 create mode 100644 includes/logging/RightsLogFormatter.php
 delete mode 100644 includes/parser/CoreLinkFunctions.php
 delete mode 100644 includes/parser/Parser_LinkHooks.php
 create mode 100644 includes/rcfeed/IRCColourfulRCFeedFormatter.php
 create mode 100644 includes/rcfeed/JSONRCFeedFormatter.php
 create mode 100644 includes/rcfeed/RCFeedEngine.php
 create mode 100644 includes/rcfeed/RCFeedFormatter.php
 create mode 100644 includes/rcfeed/RedisPubSubFeedEngine.php
 create mode 100644 includes/rcfeed/UDPRCFeedEngine.php
 create mode 100644 includes/resourceloader/ResourceLoaderLESSFunctions.php
 delete mode 100644 includes/specials/SpecialBlockme.php
 delete mode 100644 includes/specials/SpecialDisambiguations.php
 create mode 100644 includes/specials/SpecialRandomInCategory.php
 create mode 100644 includes/specials/SpecialRedirect.php
 create mode 100644 includes/specials/SpecialResetTokens.php
 create mode 100644 languages/classes/LanguageEs.php
 delete mode 100644 languages/classes/LanguageHi.php
 delete mode 100644 languages/classes/LanguageMg.php
 delete mode 100644 languages/classes/LanguageMk.php
 delete mode 100644 languages/classes/LanguageMt.php
 delete mode 100644 languages/classes/LanguageNso.php
 delete mode 100644 languages/classes/LanguageSh.php
 delete mode 100644 languages/classes/LanguageSk.php
 delete mode 100644 languages/classes/LanguageTi.php
 delete mode 100644 languages/classes/LanguageTl.php
 create mode 100644 languages/messages/MessagesBbc.php
 create mode 100644 languages/messages/MessagesBbc_latn.php
 create mode 100644 languages/messages/MessagesBxr.php
 create mode 100644 maintenance/archives/patch-archive-ar_id.sql
 delete mode 100644 maintenance/archives/patch-eu_local_id.sql
 delete mode 100644 maintenance/archives/patch-external_user.sql
 create mode 100644 maintenance/archives/patch-externallinks-el_id.sql
 create mode 100644 maintenance/archives/patch-iwl_prefix_title_from-non-unique.sql
 create mode 100644 maintenance/archives/patch-iwlinks-from-title-index.sql
 delete mode 100644 maintenance/archives/patch-kill-iwl_pft.sql
 create mode 100644 maintenance/archives/patch-tag_summary.sql
 create mode 100644 maintenance/archives/patch-valid_tag.sql
 create mode 100644 maintenance/benchmarks/README
 create mode 100644 maintenance/checkLess.php
 create mode 100644 maintenance/copyJobQueue.php
 create mode 100644 maintenance/dictionary/mediawiki.dic
 create mode 100644 maintenance/eraseArchivedFile.php
 delete mode 100644 maintenance/hiphop/compiler.conf
 delete mode 100644 maintenance/hiphop/extra-files
 delete mode 100644 maintenance/hiphop/make
 create mode 100644 maintenance/oracle/archives/patch-archive-ar_id.sql
 create mode 100644 maintenance/oracle/archives/patch-externallinks-el_id.sql
 delete mode 100644 maintenance/postgres/archives/patch-external_user.sql
 delete mode 100644 maintenance/postgres/archives/patch-kill-iwl_pft.sql
 delete mode 100644 maintenance/proxyCheck.php
 create mode 100644 maintenance/purgeChangedFiles.php
 create mode 100644 maintenance/purgeChangedPages.php
 delete mode 100644 maintenance/purgeDeletedFiles.php
 create mode 100644 maintenance/sqlite/archives/patch-archive-ar_id.sql
 create mode 100644 maintenance/sqlite/archives/patch-externallinks-el_id.sql
 delete mode 100644 maintenance/sqlite/archives/patch-kill-iwl_pft.sql
 create mode 100644 maintenance/tidyUpBug37714.php
 delete mode 100644 redirect.php
 delete mode 100644 redirect.php5
 delete mode 100644 redirect.phtml
 delete mode 100644 resources/Resources.php.orig
 create mode 100644 resources/jquery.chosen/LICENSE
 create mode 100644 resources/jquery.chosen/chosen-sprite.png
 create mode 100644 resources/jquery.chosen/chosen-sprite@2x.png
 create mode 100644 resources/jquery.chosen/chosen.css
 create mode 100644 resources/jquery.chosen/chosen.jquery.js
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-blue-hover-large.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-blue-hover.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-blue-large.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-blue.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-disabled-blue.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-disabled-green.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-disabled-red.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-disabled.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-down-blue.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-down-green.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-down-red.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-down.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-green-hover-large.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-green-hover.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-green-large.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-green.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-large-disabled-green.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-large-off-green.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-off-blue.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-off-green.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-off-red.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-off.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-orange-hover-large.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-orange-hover.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-orange-large.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-orange.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-over-blue.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-over-green.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-over-red.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-over.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-red-hover-large.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-red-hover.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-red-large.png
 delete mode 100644 resources/jquery.ui/themes/vector/images/button-red.png
 create mode 100644 resources/mediawiki.action/images/green-checkmark.png
 create mode 100644 resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css
 create mode 100644 resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js
 create mode 100644 resources/mediawiki.action/mediawiki.action.edit.editWarning.js
 create mode 100644 resources/mediawiki.action/mediawiki.action.edit.styles.css
 create mode 100644 resources/mediawiki.action/mediawiki.action.view.postEdit.css
 create mode 100644 resources/mediawiki.api/mediawiki.api.login.js
 create mode 100644 resources/mediawiki.language/mediawiki.language.months.js
 create mode 100644 resources/mediawiki.less/mediawiki.mixins.less
 create mode 100644 resources/mediawiki.page/mediawiki.page.gallery.js
 create mode 100644 resources/mediawiki.page/mediawiki.page.image.pagination.js
 delete mode 100644 resources/mediawiki.special/images/arrow-collapsed-ltr.png
 delete mode 100644 resources/mediawiki.special/images/arrow-collapsed-rtl.png
 delete mode 100644 resources/mediawiki.special/images/arrow-expanded.png
 create mode 100644 resources/mediawiki.special/images/glyph-people-large.png
 create mode 100644 resources/mediawiki.special/images/icon-contributors.png
 create mode 100644 resources/mediawiki.special/images/icon-edits.png
 create mode 100644 resources/mediawiki.special/images/icon-lock.png
 create mode 100644 resources/mediawiki.special/images/icon-pages.png
 create mode 100644 resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css
 create mode 100644 resources/mediawiki.special/mediawiki.special.createAccount.css
 create mode 100644 resources/mediawiki.special/mediawiki.special.createAccount.js
 create mode 100644 resources/mediawiki.special/mediawiki.special.pagesWithProp.css
 create mode 100644 resources/mediawiki.special/mediawiki.special.userLogin.css
 delete mode 100644 resources/mediawiki.special/mediawiki.special.userLogin.signup.js
 create mode 100644 resources/mediawiki.special/mediawiki.special.vforms.css
 create mode 100644 resources/mediawiki.ui/mediawiki.ui.default.css
 create mode 100644 resources/mediawiki.ui/mediawiki.ui.vector.css
 create mode 100644 resources/mediawiki.ui/sourcefiles/Makefile
 create mode 100644 resources/mediawiki.ui/sourcefiles/config.rb
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/components/_default.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss
 create mode 100644 resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss
 create mode 100644 resources/mediawiki/images/arrow-collapsed-ltr.png
 create mode 100644 resources/mediawiki/images/arrow-collapsed-rtl.png
 create mode 100644 resources/mediawiki/images/arrow-expanded.png
 create mode 100644 resources/mediawiki/mediawiki.icon.css
 create mode 100644 resources/mediawiki/mediawiki.inspect.js
 delete mode 100644 skins/Chick.php
 delete mode 100644 skins/MySkin.php
 delete mode 100644 skins/Nostalgia.php
 delete mode 100644 skins/Simple.php
 delete mode 100644 skins/Standard.php
 delete mode 100644 skins/archlinux/Opera6Fixes.css
 delete mode 100644 skins/archlinux/Opera7Fixes.css
 delete mode 100644 skins/archlinux/Opera9Fixes.css
 delete mode 100644 skins/chick/IE60Fixes.css
 delete mode 100644 skins/chick/main.css
 create mode 100644 skins/cologneblue/print.css
 create mode 100644 skins/common/images/question-small.png
 create mode 100644 skins/common/images/question.svg
 delete mode 100644 skins/common/wikiprintable.css
 delete mode 100644 skins/monobook/Opera6Fixes.css
 delete mode 100644 skins/monobook/Opera7Fixes.css
 delete mode 100644 skins/monobook/Opera9Fixes.css
 delete mode 100644 skins/myskin/main.css
 delete mode 100644 skins/nostalgia/screen.css
 delete mode 100644 skins/simple/discussionitem_icon.gif
 delete mode 100644 skins/simple/external.png
 delete mode 100644 skins/simple/file_icon.gif
 delete mode 100644 skins/simple/link_icon.gif
 delete mode 100644 skins/simple/lock_icon.gif
 delete mode 100644 skins/simple/mail_icon.gif
 delete mode 100644 skins/simple/main.css
 delete mode 100644 skins/standard/main.css
 create mode 100644 skins/vector/beta/screen.less
 create mode 100644 skins/vector/beta/variables.less
 create mode 100644 skins/vector/collapsibleNav.js
 create mode 100644 skins/vector/collapsibleNav.less
 create mode 100644 skins/vector/collapsibleTabs.js
 create mode 100644 skins/vector/externalLinks.less
 create mode 100644 skins/vector/images/arrow-collapsed-ltr.png
 create mode 100644 skins/vector/images/arrow-collapsed-ltr.svg
 create mode 100644 skins/vector/images/arrow-collapsed-rtl.png
 create mode 100644 skins/vector/images/arrow-collapsed-rtl.svg
 create mode 100644 skins/vector/images/arrow-down-focus-icon.svg
 create mode 100644 skins/vector/images/arrow-down-icon.svg
 create mode 100644 skins/vector/images/arrow-expanded.png
 create mode 100644 skins/vector/images/arrow-expanded.svg
 create mode 100644 skins/vector/images/user-icon.svg
 delete mode 100644 skins/vector/screen-hd.css
 create mode 100644 skins/vector/screen-hd.less
 delete mode 100644 skins/vector/screen.css
 create mode 100644 skins/vector/screen.less
 create mode 100644 skins/vector/styles-beta.less
 create mode 100644 skins/vector/styles.less
 create mode 100644 skins/vector/variables.less
 delete mode 100644 tests/RunSeleniumTests.php
 create mode 100644 tests/parser/ParserTestResult.php
 delete mode 100644 tests/phpunit/AutoLoaderTest.php
 create mode 100644 tests/phpunit/MediaWikiPHPUnitTestListener.php
 delete mode 100644 tests/phpunit/StructureTest.php
 create mode 100644 tests/phpunit/data/less/common/test.common.mixins.less
 create mode 100644 tests/phpunit/data/less/module/dependency.less
 create mode 100644 tests/phpunit/data/less/module/styles.css
 create mode 100644 tests/phpunit/data/less/module/styles.less
 create mode 100644 tests/phpunit/includes/FallbackTest.php
 create mode 100644 tests/phpunit/includes/FauxRequestTest.php
 create mode 100644 tests/phpunit/includes/HTMLCheckMatrixTest.php
 create mode 100644 tests/phpunit/includes/HashRingTest.php
 create mode 100644 tests/phpunit/includes/HtmlFormatterTest.php
 delete mode 100644 tests/phpunit/includes/JsonTest.php
 create mode 100644 tests/phpunit/includes/MWExceptionHandlerTest.php
 delete mode 100644 tests/phpunit/includes/Providers.php
 delete mode 100644 tests/phpunit/includes/SeleniumConfigurationTest.php
 create mode 100644 tests/phpunit/includes/UserMailerTest.php
 create mode 100644 tests/phpunit/includes/XmlTypeCheckTest.php
 create mode 100644 tests/phpunit/includes/cache/MessageCacheTest.php
 create mode 100644 tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
 create mode 100644 tests/phpunit/includes/db/DatabaseTestHelper.php
 create mode 100644 tests/phpunit/includes/installer/OracleInstallerTest.php
 create mode 100644 tests/phpunit/includes/json/FormatJsonTest.php
 delete mode 100644 tests/phpunit/includes/json/ServicesJsonTest.php
 create mode 100644 tests/phpunit/includes/media/FakeDimensionFile.php
 create mode 100644 tests/phpunit/includes/parser/TidyTest.php
 create mode 100644 tests/phpunit/includes/specials/SpecialPreferencesTest.php
 create mode 100644 tests/phpunit/includes/upload/UploadBaseTest.php
 delete mode 100644 tests/phpunit/includes/upload/UploadTest.php
 create mode 100644 tests/phpunit/mocks/filebackend/MockFSFile.php
 create mode 100644 tests/phpunit/mocks/filebackend/MockFileBackend.php
 create mode 100644 tests/phpunit/mocks/media/MockBitmapHandler.php
 delete mode 100644 tests/phpunit/resources/ResourcesTest.php
 create mode 100644 tests/phpunit/structure/AutoLoaderTest.php
 create mode 100644 tests/phpunit/structure/ResourcesTest.php
 create mode 100644 tests/phpunit/structure/StructureTest.php
 create mode 100644 tests/phpunit/suites/ExtensionsParserTestSuite.php
 create mode 100644 tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
 create mode 100644 tests/qunit/suites/resources/startup.test.js
 delete mode 100644 tests/selenium/Selenium.php
 delete mode 100644 tests/selenium/SeleniumConfig.php
 delete mode 100644 tests/selenium/SeleniumLoader.php
 delete mode 100644 tests/selenium/SeleniumServerManager.php
 delete mode 100644 tests/selenium/SeleniumTestCase.php
 delete mode 100644 tests/selenium/SeleniumTestConsoleLogger.php
 delete mode 100644 tests/selenium/SeleniumTestConstants.php
 delete mode 100644 tests/selenium/SeleniumTestHTMLLogger.php
 delete mode 100644 tests/selenium/SeleniumTestListener.php
 delete mode 100644 tests/selenium/SeleniumTestSuite.php
 delete mode 100644 tests/selenium/data/SimpleSeleniumTestDB.sql
 delete mode 100644 tests/selenium/data/SimpleSeleniumTestImages.zip
 delete mode 100644 tests/selenium/data/Wikipedia-logo-v2-de.png
 delete mode 100644 tests/selenium/data/mediawiki118_fresh_installation.sql
 delete mode 100644 tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php
 delete mode 100644 tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php
 delete mode 100644 tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php
 delete mode 100644 tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php
 delete mode 100644 tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php
 delete mode 100644 tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php
 delete mode 100644 tests/selenium/installer/MediaWikiInstallationCommonFunction.php
 delete mode 100644 tests/selenium/installer/MediaWikiInstallationConfig.php
 delete mode 100644 tests/selenium/installer/MediaWikiInstallationMessage.php
 delete mode 100644 tests/selenium/installer/MediaWikiInstallationVariables.php
 delete mode 100644 tests/selenium/installer/MediaWikiInstallerTestSuite.php
 delete mode 100644 tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php
 delete mode 100644 tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php
 delete mode 100644 tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php
 delete mode 100644 tests/selenium/installer/MediaWikiRestartInstallationTestCase.php
 delete mode 100644 tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php
 delete mode 100644 tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php
 delete mode 100644 tests/selenium/installer/MediaWikiUserInterfaceTestCase.php
 delete mode 100644 tests/selenium/installer/README.txt
 delete mode 100644 tests/selenium/selenium_settings.ini.sample
 delete mode 100644 tests/selenium/selenium_settings_grid.ini.sample
 delete mode 100644 tests/selenium/suites/AddContentToNewPageTestCase.php
 delete mode 100644 tests/selenium/suites/AddNewPageTestCase.php
 delete mode 100644 tests/selenium/suites/CreateAccountTestCase.php
 delete mode 100644 tests/selenium/suites/DeletePageAdminTestCase.php
 delete mode 100644 tests/selenium/suites/EmailPasswordTestCase.php
 delete mode 100644 tests/selenium/suites/MediaWikiEditorConfig.php
 delete mode 100644 tests/selenium/suites/MediaWikiEditorTestSuite.php
 delete mode 100644 tests/selenium/suites/MediaWikiExtraTestSuite.php
 delete mode 100644 tests/selenium/suites/MediawikiCoreSmokeTestCase.php
 delete mode 100644 tests/selenium/suites/MediawikiCoreSmokeTestSuite.php
 delete mode 100644 tests/selenium/suites/MovePageTestCase.php
 delete mode 100644 tests/selenium/suites/MyContributionsTestCase.php
 delete mode 100644 tests/selenium/suites/MyWatchListTestCase.php
 delete mode 100644 tests/selenium/suites/PageDeleteTestSuite.php
 delete mode 100644 tests/selenium/suites/PageSearchTestCase.php
 delete mode 100644 tests/selenium/suites/PreviewPageTestCase.php
 delete mode 100644 tests/selenium/suites/SavePageTestCase.php
 delete mode 100644 tests/selenium/suites/SimpleSeleniumConfig.php
 delete mode 100644 tests/selenium/suites/SimpleSeleniumTestCase.php
 delete mode 100644 tests/selenium/suites/SimpleSeleniumTestSuite.php
 delete mode 100644 tests/selenium/suites/UserPreferencesTestCase.php

(limited to 'maintenance/mssql/tables.sql')

diff --git a/.gitreview b/.gitreview
index 65dbc270..0ec44b83 100644
--- a/.gitreview
+++ b/.gitreview
@@ -2,5 +2,5 @@
 host=gerrit.wikimedia.org
 port=29418
 project=mediawiki/core.git
-defaultbranch=REL1_21
+defaultbranch=master
 defaultrebase=0
diff --git a/.jshintignore b/.jshintignore
index 3869deb9..f740f137 100644
--- a/.jshintignore
+++ b/.jshintignore
@@ -1,3 +1,7 @@
+# Generated documentation
+docs/html/
+docs/js/
+
 # third-party libs
 extensions/
 node_modules/
@@ -19,9 +23,7 @@ resources/jquery.effects/
 resources/jquery.tipsy/
 resources/jquery.ui/
 resources/mediawiki.libs/
-
-# legacy scripts
-skins/common/
+resources/jquery.chosen/chosen.jquery.js
 
 # github.com/jshint/jshint/issues/729
 tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
diff --git a/.jshintrc b/.jshintrc
index 7fa138d4..c4e265a4 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -1,15 +1,10 @@
 {
-	"predef": [
-		"mediaWiki",
-		"jQuery",
-		"QUnit"
-	],
+	/* Common */
 
-	"bitwise": true,
+	// Enforcing
 	"camelcase": true,
 	"curly": true,
 	"eqeqeq": true,
-	"forin": false,
 	"immed": true,
 	"latedef": true,
 	"newcap": true,
@@ -17,18 +12,31 @@
 	"noempty": true,
 	"nonew": true,
 	"quotmark": "single",
-	"regexp": false,
+	"trailing": true,
 	"undef": true,
 	"unused": true,
-	"strict": false,
-	"trailing": true,
+	// Legacy
+	"onevar": true,
+
+	/* Local */
 
+	// Enforcing
+	"bitwise": true,
+	"forin": false,
+	"regexp": false,
+	"strict": false,
+	// Relaxing
 	"laxbreak": true,
 	"smarttabs": true,
 	"multistr": true,
-
+	// Environment
 	"browser": true,
-
+	// Legacy
 	"nomen": true,
-	"onevar": true
+
+	"predef": [
+		"mediaWiki",
+		"jQuery",
+		"QUnit"
+	]
 }
diff --git a/COPYING b/COPYING
index 019694a9..c3bed284 100644
--- a/COPYING
+++ b/COPYING
@@ -1,3 +1,41 @@
+== License and copyright information ==
+
+=== License ===
+
+MediaWiki is licensed under the terms of the GNU General Public License,
+version 2 or later. Derivative works and later versions of the code must be
+free software licensed under the same or a compatible license. This includes
+"extensions" that use MediaWiki functions or variables; see
+http://www.gnu.org/licenses/gpl-faq.html#GPLAndPlugins for details.
+
+For the full text of version 2 of the license, see
+https://www.gnu.org/licenses/gpl-2.0.html or '''GNU General Public License'''
+below.
+
+=== Copyright owners ===
+
+MediaWiki contributors, including those listed in the CREDITS file, hold the
+copyright to this work.
+
+=== Additional license information ===
+
+Some components of MediaWiki imported from other projects may be under other
+Free and Open Source, or Free Culture, licenses. Specific details of their
+licensing information can be found in those components.
+
+Sections of code written exclusively by Lee Crocker or Erik Moeller are also
+released into the public domain, which does not impair the obligations of users
+under the GPL for use of the whole code or other sections thereof.
+
+MediaWiki uses the following Creative Commons icons to illustrate links to the
+CC licenses:
+
+* skins/common/images/cc-by-nc-sa.png
+* skins/common/images/cc-by-sa.png
+
+These icons are trademarked, and used subject to the CC trademark license,
+available at http://creativecommons.org/policies#trademark
+
 == GNU GENERAL PUBLIC LICENSE ==
 
 Version 2, June 1991
diff --git a/CREDITS b/CREDITS
index 9c49a9b4..54aca716 100644
--- a/CREDITS
+++ b/CREDITS
@@ -1,4 +1,4 @@
-MediaWiki 1.21 is a collaborative project released under the
+MediaWiki 1.22 is a collaborative project released under the
 GNU General Public License v2. We would like to recognize the
 following names for their contribution to the product.
 
@@ -22,6 +22,7 @@ following names for their contribution to the product.
 * church of emacs
 * Daniel Friesen
 * Daniel Kinzler
+* Daniel Renfro
 * Danny B.
 * David McCabe
 * Derk-Jan Hartman
@@ -80,7 +81,7 @@ following names for their contribution to the product.
 * Thomas Bleher
 * Tim Starling
 * Timo Tijhof
-* Tom Gries
+* Thomas Gries
 * Trevor Parscal
 * Victor Vasiliev
 * Yesid Carrillo
@@ -122,6 +123,7 @@ following names for their contribution to the product.
 * David Baumgarten
 * Denny Vrandecic
 * Dévai Tamás
+* Ebrahim Byagowi
 * Edward Z. Yang
 * Elvis Stansvik
 * Erwin Dokter
@@ -143,6 +145,7 @@ following names for their contribution to the product.
 * Jimmy Xu
 * Jonathan Wiltshire
 * John N
+* JuneHyeon Bae
 * Jure Kajzer
 * Karun Dambiec
 * Katie Filbert
@@ -159,7 +162,7 @@ following names for their contribution to the product.
 * Manuel Menal
 * Marcin Cieślak
 * Marcus Buck
-* Mark A. Pelletier
+* Marc-André Pelletier
 * Mark Hershberger
 * Mark Holmquist
 * Marooned
@@ -234,10 +237,5 @@ following names for their contribution to the product.
 * Zachary Hauri
 
 == Translators ==
-* Anders Wegge Jakobsen
-* Hk kng
-* Hojjat
-* Meno25
-* Rotem Liss
-* Shinjiman
-* [https://translatewiki.net/wiki/Special:ListUsers/translator Translatewiki.net Translators]
+
+* [https://translatewiki.net/wiki/Translating:MediaWiki/Credits Translators on translatewiki.net and others]
diff --git a/HISTORY b/HISTORY
index 02ba8d89..45eab2e9 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,4 +1,337 @@
-Change notes from older releases. For current info see RELEASE-NOTES-1.21.
+Change notes from older releases. For current info see RELEASE-NOTES-1.22.
+
+== MediaWiki 1.21 ==
+
+MediaWiki 1.21 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.21 ===
+* (bug 29374) $wgVectorUseSimpleSearch is now enabled by default.
+* Deprecated $wgAllowRealName is removed. Use $wgHiddenPrefs[] = 'realname'
+  instead.
+* (bug 39957) Added $wgUnwatchedPageThreshold, specifying minimum count
+  of page watchers required for the number to be accessible to users
+  without the unwatchedpages permission.
+* $wgBug34832TransitionalRollback has been removed.
+* (bug 29472) $wgUseDynamicDates has been removed and its functionality
+  disabled.
+
+=== New features in 1.21 ===
+* (bug 38110) Schema changes (adding or dropping tables, indices and
+  fields) can be now be done separately from from other changes that
+  update.php makes.  This is useful in environments that use database
+  permissions to restrict schema changes but allow the DB user that
+  MediaWiki normally runs as to perform other changes that update.php
+  makes.  Schema changes can be run separately.  See the file UPGRADE
+  for more information.
+* (bug 34876) jquery.makeCollapsible has been improved in performance.
+* Added ContentHandler facility to allow extensions to support other content
+  than wikitext. See docs/contenthandler.txt for details.
+* New feature was developed for showing high-DPI thumbnails for high-DPI mobile
+  and desktop displays (configurable with $wgResponsiveImages).
+* Added new backend to represent and store information about sites and site
+  specific configuration.
+* jQuery upgraded from 1.8.2 to 1.8.3.
+* jQuery UI upgraded from 1.8.23 to 1.8.24.
+* Added separate fa_sha1 field to filearchive table. This allows sha1
+  searches with the api in miser mode for deleted files.
+* Add initial and programmatic sorting for tablesorter.
+* Add the event "sortEnd.tablesorter", triggered after sorting has completed.
+* The Job system was refactored to allow for different backing stores for
+  queues as well as cross-wiki access to queues, among other things. The schema
+  for the DB queue was changed to support better concurrency and reduce
+  deadlock errors.
+* Added ApiQueryORM class to facilitate creation of query API modules based on
+  tables that have a corresponding ORMTable class.
+* (bug 40876) Icon for PSD (Adobe Photoshop) file types.
+* (bug 40641) Implemented Special:Version/Credits with a list of contributors.
+* (bug 7851) Implemented one-click AJAX patrolling.
+* The <data>, <time>, <meta>, and <link> elements are allowed within WikiText
+  for use with Microdata.
+* The HTML5 <mark> tag has been whitelisted.
+* Added ParserCloned hook for when the Parser object is cloned.
+* Added AlternateEditPreview hook to allow extensions to replace the page
+  preview from the edit page.
+* Added EditPage::showStandardInputs:options hook to allow extensions to add
+  new fields to the "editOptions" area of the edit form.
+* Upload stash DB schema altered to improve upload performance.
+* The following global functions are now reporting deprecated warnings in
+  debug mode: wfMsg, wfMsgNoTrans, wfMsgForContent, wfMsgForContentNoTrans,
+  wfMsgReal, wfMsgGetKey, wfMsgHtml, wfMsgWikiHtml, wfMsgExt, wfEmptyMsg. Use
+  the Message class, or the global method wfMessage.
+* Added $wgEnableCanonicalServerLink, off by default. If enabled, a
+  <link rel=canonical> tag is added to every page indicating the correct server
+  to use.
+* Debug message emitted by wfDebugLog() will now be prefixed with the group
+  name when its logged to the default log file. That is the case whenever the
+  group has no key in wgDebugLogGroups, that will help triage the default log.
+* (bug 24620) Add types to LogFormatter.
+* jQuery JSON upgraded from 2.3 to 2.4.0.
+* Added GetDoubleUnderscoreIDs hook, for modifying the list of magic words.
+* DatabaseUpdater class has two new methods to ease extensions schema changes:
+  dropExtensionIndex and renameExtensionIndex.
+* New preference type - 'api'. Preferences of this type are not shown on
+  Special:Preferences, but are still available via the action=options API.
+* (bug 39397) Hide rollback link if a user is the only contributor of the page.
+* $wgPageInfoTransclusionLimit limits the list size of transcluded articles
+  on the info action. Default is 50.
+* Added action=createaccount to allow user account creation.
+* (bug 40124) action=options API also allows for setting of arbitrary
+  preferences, provided that their names are prefixed with 'userjs-'. This
+  officially reenables the feature that was undocumented and defective
+  in MW 1.20 (saving preferences using Special:Preferences cleared any
+  additional fields) and which has been disabled in 1.20.1 as a part of
+  a security fix (bug 42202).
+* Added option to specify "others" as author in extension credits using
+  "..." as author name.
+* Added the ability to limit the wall clock time used by shell processes,
+  as well as the CPU time. Configurable with $wgMaxShellWallClockTime.
+* Allow memory of shell subprocesses to be limited using Linux cgroups
+  instead of ulimit -v, which tends to cause deadlocks in recent versions
+  of ImageMagick. Configurable with $wgShellCgroup.
+* Added $wgWhitelistReadRegexp for regex whitelisting.
+* (bug 5346) Categories that are redirects will be displayed italic in
+  the category links section at the bottom of a page.
+* (bug 43915) New maintenance script deleteEqualMessages.php.
+* You can now create checkbox option matrices through the HTMLCheckMatrix
+  subclass in HTMLForm.
+* WikiText now permits the use of WAI-ARIA's role="presentation" inside of
+  html elements and tables. This allows presentational markup, especially
+  tables. To be marked up as such.
+* maintenance/sql.php learned the --cluster option. Let you run the script
+  on some external cluster instead of the primary cluster for a given wiki.
+* (bug 20281) test the parsing of inline URLs.
+* Added Special:PagesWithProp, which lists pages using a particular page property.
+* Implemented language-specific collations for category sorting for 67 languages
+  based in latin, greek and cyrillic alphabets. This allows one to *finally* get
+  articles to be correctly sorted on category pages. They are named
+  'uca-<langcode>', where <langcode> is one of: af, ast, az, be, bg, br, bs, ca,
+  co, cs, cy, da, de, dsb, el, en, eo, es, et, eu, fi, fo, fr, fur, fy, ga, gd,
+  gl, hr, hsb, hu, is, it, kk, kl, ku, ky, la, lb, lt, lv, mk, mo, mt, nl, no,
+  oc, pl, pt, rm, ro, ru, rup, sco, sk, sl, smn, sq, sr, sv, tk, tl, tr, tt, uk,
+  uz, vi.
+* Added 'CategoryAfterPageAdded' and 'CategoryAfterPageRemoved' hooks.
+* Added 'HistoryRevisionTools' and 'DiffRevisionTools' hooks.
+* Added 'SpecialSearchResultsPrepend' and 'SpecialSearchResultsAppend' hooks.
+* (bug 33186) Add image rotation api "imagerotate"
+* (bug 34040) Add "User rights management" link on user page toolbox.
+* (bug 45526) Add QUnit assertion helper "QUnit.assert.htmlEqual" for asserting
+  structual equality of HTML (ignoring insignificant differences like
+  quotmarks, order and whitespace in the attribute list).
+* (bug 23393) HTML <hN> headings containing line breaks are now handled
+  correctly.
+* (bug 45803) Whitespace within == Headline == syntax and within <hN> headings
+  is now non-significant and not preserved in the HTML output.
+
+=== Bug fixes in 1.21 ===
+* (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
+* (bug 40352) fixDoubleRedirects.php should support interwiki redirects.
+* (bug 9237) SpecialBrokenRedirect should not list interwiki redirects.
+* (bug 34960) Drop unused fields rc_moved_to_ns and rc_moved_to_title from
+  recentchanges table.
+* (bug 32951) Do not register internal externals with absolute protocol,
+  when server has relative protocol.
+* (bug 39005) When purging proxies listed in $wgSquidServers using HTTP PURGE
+  method requests, we now send a Host header by default, for Varnish
+  compatibility. This also works with Squid in reverse-proxy mode. If you wish
+  to support Squid configured in forward-proxy mode, set
+  $wgSquidPurgeUseHostHeader to false.
+* (bug 37020) sql.php with readline eats semicolon.
+* (bug 11748) Properly handle optionally-closed HTML tags when Tidy is
+  disabled, and don't wrap HTML-syntax definition lists in paragraphs.
+* (bug 41409) Diffs while editing an old revision should again diff against the
+  current revision.
+* (bug 41494) Honor $wgLogExceptionBacktrace when logging non-API exceptions
+  caught during API execution.
+* (bug 37963) Fixed loading process for user options.
+* (bug 26995) Update filename field on Upload page after having sanitized it.
+* (bug 41793) Contribution links to users with 0 edits on Special:ListUsers
+  didn't show up red.
+* (bug 41899) A PHP notice no longer occurs when using the "rvcontinue" API
+  parameter.
+* (bug 42036) Account creation emails now contain canonical (not
+  protocol-relative) URLs.
+* (bug 41990) Fix regression: API edit with redirect=true and lacking
+  starttimestamp and basetimestamp should not cause an edit conflict.
+* (bug 41706) EditPage: Preloaded page should be converted if possible and
+  needed.
+* (bug 41886) Rowspans are no longer exploded by tablesorter until the table is
+  actually sorted.
+* (bug 2865)  User interface HTML elements don't use lang attribute.
+  (completed the fix by adding the lang attribute to firstHeading).
+* (bug 42173) Removed namespace prefixes on Special:UncategorizedCategories.
+* (bug 36053) Log in "returnto" feature forgets query parameters if no
+  title parameter was specified.
+* (bug 42410) API action=edit now returns correct timestamp for the new edit.
+* (bug 14901) Email notification mistakes log action for new page creation.
+  Enotif no longer sends "page has been created" notifications for some log
+  actions. The following events now have a correct message: page creation,
+  deletion, move, restore (undeletion), change (edit). Parameter
+  $CHANGEDORCREATED is deprecated in 'enotif_body' and scheduled for removal in
+  MediaWiki 1.23.
+* (bug 457) In the sidebar of Vector, CologneBlue, Monobook, and Monobook-based
+  skins, the heading levels have been changed from (variously per skin)
+  <h4>, <h5> or <h6> to only <h3>s, with a <h2> hidden heading above them.
+  If you are styling or scripting the headings in a custom way, this change
+  will require updates to your site's CSS or JS.
+* (bug 41342) jquery.suggestions should cancel any active (async) fetches
+  before it triggers another fetch.
+* (bug 42184) $wgUploadSizeWarning missing second variable.
+* (bug 34581) removeUnusedAccounts.php maintenance script now ignores newuser
+  log when determining whether an account is used.
+* (bug 43379) Gracefully fail if rev_len is unavailable for a revision on the
+  History page.
+* (bug 42949) API no longer assumes all exceptions are MWException.
+* (bug 41733) Hide "New user message" (.usermessage) element from printable view.
+* (bug 39062) Special:Contributions will display changes that don't have
+  a parent id instead of just an empty bullet item.
+* (bug 37209) "LinkCache doesn't currently know about this title" error fixed.
+* wfMerge() now works if $wgDiff3 contains spaces
+* (bug 43052) mediawiki.action.view.dblClickEdit.dblClickEdit should trigger
+  ca-edit click instead opening URL directly.
+* (bug 43964) Invalid value of "link" parameter in <gallery> no longer produces
+  a fatal error.
+* (bug 44775) The username field is not pre-filled when creating an account.
+* (bug 45069) wfParseUrl() no longer produces a PHP notice if passed a "mailto:"
+  URL without address
+* (bug 45012) Creating an account by e-mail can no longer show a
+  "password mismatch" error.
+* (bug 44599) On Special:Version, HEADs for submodule checkouts (e.g. for
+  extensions) performed using Git 1.7.8+ should now appear.
+* (bug 42184) $wgUploadSizeWarning missing second variable
+* (bug 40326) Check if files exist with a different extension during uploading
+* (bug 34798) Updated CSS for Atom/RSS recent changes feeds to match on-wiki diffs.
+* (bug 42430) Calling numRows on MySQL no longer propagates unrelated errors.
+* (bug 44719) Removed mention of non-existing maintenance/migrateCurStubs.php
+  script in includes/DefaultSettings.php
+* (bug 45143) jquery.badge: Treat non-Latin variants of zero as zero as well.
+* (bug 46151) mwdocgen.php should not ignore exit code of doxygen command.
+* (bug 41889) Fix $.tablesorter rowspan exploding for complex cases.
+
+=== API changes in 1.21 ===
+* prop=revisions can now report the contentmodel and contentformat.
+  See docs/contenthandler.txt.
+* action=edit and action=parse now support contentmodel and contentformat
+  parameters to control the interpretation of page content.
+  See docs/contenthandler.txt for details.
+* (bug 35693) ApiQueryImageInfo now suppresses errors when unserializing metadata.
+* (bug 40111) Disable minor edit for page/section creation by API.
+* (bug 41042) Revert change to action=parse&page=... behavior when the page
+  does not exist.
+* (bug 27202) Add timestamp sort to list=allimages.
+* (bug 43137) Don't return the sha1 of revisions through the API if the content is
+  revision-deleted.
+* ApiQueryImageInfo now also returns imageinfo for redirects.
+* list=alltransclusions added to enumerate every instance of page embedding
+* list=alllinks & alltransclusions now allow both 'from' and 'continue' in
+  the same query. When both are present, 'from' is simply ignored.
+* list=alllinks & alltransclusions now allow 'unique' in generators, to yield
+  a list of all link/template target pages instead of source pages.
+* BREAKING CHANGE: list=logevents output format changed for details of some log
+  types. Specifically, details that were formerly reported under a key like
+  "4::foo" will now be reported under a key of simply "foo".
+* BREAKING CHANGE: '??_badcontinue' error code was changed to '??badcontinue'
+  for all query modules.
+* ApiQueryBase adds 'badcontinue' error code if module has 'continue' parameter.
+* (bug 35885) Removed version parameter and all getVersion() methods.
+* action=options now takes a "resetkinds" option, which allows only resetting
+  certain types of preferences when the "reset" option is set.
+* (bug 36751) ApiQueryImageInfo now returns imageinfo for the redirect target
+  when queried with &redirects=.
+* (bug 31849) ApiQueryImageInfo no longer gets confused when asked for info on
+  a redirect and its target.
+* (bug 43849) ApiQueryImageInfo no longer throws exceptions with ForeignDBRepo
+  redirects.
+* On error, any warnings generated before that error will be shown in the result.
+* action=help supports generalized submodules (modules=query+value), querymodules obsolete
+* ApiQueryImageInfo continuation is more reliable. The only major change is
+  that the imagerepository property will no longer be set on page objects not
+  processed in the current query (i.e. non-images or those skipped due to
+  iicontinue).
+* Add supports for all pageset capabilities - generators, redirects, converttitles to
+  action=purge and action=setnotificationtimestamp.
+* (bug 43251) prop=pageprops&ppprop= now accepts multiple props to query.
+* ApiQueryImageInfo will now limit the number of calls to File::transform made
+  in any one query. If there are too many, iicontinue will be returned.
+* action=query&meta=siteinfo&siprop=general will now return the regexes used for
+  link trails and link prefixes. Added for Parsoid support.
+* Added an API query module list=pageswithprop, which lists pages using a
+  particular page property.
+* Added an API query module list=pagepropnames, which lists all page prop names
+  currently in use on the wiki.
+* (bug 44921) ApiMain::execute() will now return after the CORS check for an
+  HTTP OPTIONS request.
+* (bug 44923) action=upload works correctly if the entire file is uploaded in
+  the first chunk.
+* Added 'continue=' parameter to streamline client iteration over complex query results
+* (bug 44909) API parameters may now be marked as type "upload", which is now
+  used for action=upload's 'file' and 'chunk' parameters. This type will raise
+  an error during parameter validation if the parameter is given but not
+  recognized as an uploaded file.
+* (bug 44244) prop=info may now return the number of people watching each page.
+* (bug 33304) list=allpages will no longer return duplicate entries when
+  querying protection.
+* (bug 33304) list=allpages will now find really old indefinite protections.
+* (bug 45937) meta=allmessages will report a syntactically invalid lang as a
+  proper error instead of as an uncaught exception.
+* (bug 25325) added support for wlshow filtering (bots/anon/minor/patrolled)
+  to action=feedwatchlist
+* WDDX formatted output will actually be formatted (and normal output will no
+  longer be), and will no longer choke on booleans.
+
+=== API internal changes in 1.21 ===
+* For debugging only, a new global $wgDebugAPI removes many API restrictions when true.
+  Never use on the production servers, as this flag introduces security holes.
+  Whenever enabled, a warning will also be added to all output.
+* ApiModuleManager now handles all submodules (actions,props,lists) and instantiation
+* Query stores prop/list/meta as submodules
+* ApiPageSet can now be used in any action to process titles/pageids/revids or any generator.
+* BREAKING CHANGE: ApiPageSet constructor now has two params instead of three, with only the
+  first one keeping its meaning. ApiPageSet is now derived from ApiBase.
+* BREAKING CHANGE: ApiQuery::newGenerator() and executeGeneratorModule() were deleted.
+* ApiQueryGeneratorBase::setGeneratorMode() now requires a pageset param.
+* $wgAPIGeneratorModules is now obsolete and will be ignored.
+* Added flags ApiResult::OVERRIDE and ADD_ON_TOP to setElement() and addValue()
+* Internal API calls will now include <warnings> in case of unused parameters
+
+=== Languages updated in 1.21 ===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+* South Azerbaijani (azb) added.
+* (bug 30040) Autonym for nds-nl is now 'Nedersaksies' (was 'Nedersaksisch').
+* (bug 45436) Autonym for pi (Pali) is now 'पालि' (was ''पाळि').
+* (bug 34977) Now formatted numbers in Spanish use space as separator
+  for thousands, as mandated by the Real Academia Española.
+* (bug 35031) Kurdish formatted numbers now use period and comma
+  as separators for thousands and decimals respectively.
+
+=== Other changes in 1.21 ===
+* BREAKING CHANGE: (bug 44385) Removed the jquery.collapsibleTabs module and
+  moved it to the Vector extension. It was entirely Vector-extension-specific,
+  deeply interconnected with the extension, and this functionality really
+  belongs to the extension instead of the skin anyway. In the unlikely case you
+  were using it, you have to either copy it to your extension, or install the
+  Vector extension (and possibly disable its features using config settings if
+  you don't want them).
+* Experimental IBM DB2 support was removed due to lack of interest and maintainership
+* BREAKING CHANGE: Filenames of maintenance scripts were standardized into
+  lowerCamelCase format, and made more explicit:
+  - clear_stats.php -> clearCacheStats.php
+  - clear_interwiki_cache.php -> clearInterwikiCache.php
+  - initStats.php -> initSiteStats.php
+  - proxy_check.php -> proxyCheck.php
+  - stats.php -> showCacheStats.php
+  - showStats.php -> showSiteStats.php.
+  Class names were renamed accordingly:
+  - clear_stats -> ClearCacheStats
+  - InitStats -> InitSiteStats
+  - CacheStats -> ShowCacheStats
+  - ShowStats -> ShowSiteStats.
+* BREAKING CHANGE: (bug 38244) Removed the mediawiki.api.titleblacklist module
+  and moved it to the TitleBlacklist extension.
 
 == MediaWiki 1.20 ==
 
diff --git a/README b/README
index c9ce5db4..a4185ba0 100644
--- a/README
+++ b/README
@@ -1,122 +1,33 @@
-For system requirements, installation and upgrade details, see the files
-RELEASE-NOTES, INSTALL, and UPGRADE.
-
 == MediaWiki ==
 
-MediaWiki is the software used for Wikipedia [http://www.wikipedia.org/] and the
-other Wikimedia Foundation websites. Compared to other wikis, it has an
-excellent range of features and support for high-traffic websites using
-multiple servers (Wikimedia sites peak in the 100K+ requests per second range
-as of January 2012).
-
-While quite usable on smaller sites, you may find you have to "roll your own"
-local documentation, and some aspects of configuration may seem overcomplicated
-because MediaWiki is primarily targeted as an in-house tool.
-
-The MediaWiki software was written by:
-* Lee Daniel Crocker
-* Magnus Manske
-* Jan Hidders
-* Brion Vibber
-* Axel Boldt
-* Geoffrey T. Dairiki
-* Tomasz Wegrzanowski
-* Erik Moeller
-* Tim Starling
-* Gabriel Wicke
-* Antoine Musso
-* Evan Prodromou
-* Ævar Arnfjörð Bjarmason
-* Niklas Laxström
-* Domas Mituzas
-* Rob Church
-* Jens Frank
-* Yuri Astrakhan
-* Aryeh Gregor
-* Aaron Schulz
-* Andrew Garrett
-* Raimond Spekking
-* Alexandre Emsenhuber
-* Siebrand Mazeland
-* Chad Horohoe
-* Roan Kattouw
-* Trevor Pascal
-* Bryan Tong Minh
-* Sam Reed
-* Victor Vasiliev
-* Rotem Liss
-* Platonides
-* Many others (view CREDITS for a more complete list)
-
-The contributors hold the copyright to this work, and it is licensed under the
-terms of the GNU General Public License, version 2 or later (see
-http://www.fsf.org/licensing/licenses/gpl.html). Derivative works and later
-versions of the code must be free software licensed under the same or a
-compatible license. This includes "extensions" that use MediaWiki functions or
-variables; see http://www.gnu.org/licenses/gpl-faq.html#GPLAndPlugins for
-details.
-
-The Wikimedia Foundation currently has no legal rights to the software.
-
-Sections of code written exclusively by Lee Crocker or Erik Moeller are also
-released into the public domain, which does not impair the obligations of users
-under the GPL for use of the whole code or other sections thereof.
-
-MediaWiki makes use of the Sajax Toolkit by modernmethod,
-http://www.modernmethod.com/sajax/ which has the following license:
-
-	'This work is licensed under the Creative Commons Attribution
-	License. To view a copy of this license, visit
-	http://creativecommons.org/licenses/by/2.0/ or send a letter
-	to Creative Commons, 559 Nathan Abbott Way,
-	Stanford, California 94305, USA.'
-
-MediaWiki use Creative Commons license marks to points to their online
-licenses. This content is trademarked and used under a specific license
-available at http://creativecommons.org/policies#trademark
-The restricted content is:
-
-* skins/common/images/cc-by-nc-sa.png
-* skins/common/images/cc-by-sa.png
-
-Many thanks to the Wikimedia regulars for testing and suggestions.
-
-The official website for MediaWiki is located at:
+MediaWiki is a popular and free, open-source wiki software package written in
+PHP. It serves as the platform for Wikipedia and the other projects of the Wikimedia
+Foundation, which deliver content in over 280 languages to more than half a billion
+people each month. MediaWiki's reliability and robust feature set have earned it a
+large and vibrant community of third-party users and developers.
 
-	http://www.mediawiki.org/
+MediaWiki is:
 
-The code is currently maintained in a Git repository at
-gerrit.wikimedia.org. See http://www.mediawiki.org/wiki/Git for details.
+* feature-rich and extensible, both on-wiki and with over 2,000 extensions;
+* scalable and suitable for both small and large sites;
+* available in your language; and
+* simple to install, working on most hardware/software combinations.
 
-Please report bugs and make feature requests in our Bugzilla system:
-
-* https://bugzilla.wikimedia.org/
-
-Documentation and discussion on new features may be found at:
-
-* http://www.mediawiki.org/wiki/Manual:FAQ
-* http://www.mediawiki.org/wiki/Documentation
-* http://www.mediawiki.org/wiki/Development
-
-Extensions are listed at:
-
-* http://www.mediawiki.org/wiki/Category:Extensions
-
-If you are setting up your own wiki based on this software, it is highly
-recommended that you subscribe to mediawiki-announce:
-
-* https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
-
-The mailing list is very low volume, and is intended primarily for announcements
-of new versions, bug fixes, and security issues.
-
-A higher volume support mailing list can be found at:
-
-* https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
-
-Developer discussion takes place at:
-
-* https://lists.wikimedia.org/mailman/listinfo/wikitech-l
+For system requirements, installation, and upgrade details, see the files
+RELEASE-NOTES, INSTALL, and UPGRADE.
 
-There is also a development and support channel #mediawiki on irc.freenode.net,
-and an unoffical support forum at www.mwusers.com.
+* Ready to get started?
+** https://www.mediawiki.org/wiki/Download
+* Looking for the technical manual?
+** https://www.mediawiki.org/wiki/Manual:Contents
+* Seeking help from a person?
+** https://www.mediawiki.org/wiki/Communication
+* Looking to file a bug report or a feature request?
+** https://bugs.mediawiki.org/
+* Interested in helping out?
+** https://www.mediawiki.org/wiki/How_to_contribute
+
+MediaWiki is the result of global collaboration and cooperation. The CREDITS
+file lists technical contributors to the project. The COPYING file explains
+MediaWiki's copyright and license (GNU General Public License, version 2 or
+later). Many thanks to the Wikimedia community for testing and suggestions.
diff --git a/README.mediawiki b/README.mediawiki
deleted file mode 100644
index c9ce5db4..00000000
--- a/README.mediawiki
+++ /dev/null
@@ -1,122 +0,0 @@
-For system requirements, installation and upgrade details, see the files
-RELEASE-NOTES, INSTALL, and UPGRADE.
-
-== MediaWiki ==
-
-MediaWiki is the software used for Wikipedia [http://www.wikipedia.org/] and the
-other Wikimedia Foundation websites. Compared to other wikis, it has an
-excellent range of features and support for high-traffic websites using
-multiple servers (Wikimedia sites peak in the 100K+ requests per second range
-as of January 2012).
-
-While quite usable on smaller sites, you may find you have to "roll your own"
-local documentation, and some aspects of configuration may seem overcomplicated
-because MediaWiki is primarily targeted as an in-house tool.
-
-The MediaWiki software was written by:
-* Lee Daniel Crocker
-* Magnus Manske
-* Jan Hidders
-* Brion Vibber
-* Axel Boldt
-* Geoffrey T. Dairiki
-* Tomasz Wegrzanowski
-* Erik Moeller
-* Tim Starling
-* Gabriel Wicke
-* Antoine Musso
-* Evan Prodromou
-* Ævar Arnfjörð Bjarmason
-* Niklas Laxström
-* Domas Mituzas
-* Rob Church
-* Jens Frank
-* Yuri Astrakhan
-* Aryeh Gregor
-* Aaron Schulz
-* Andrew Garrett
-* Raimond Spekking
-* Alexandre Emsenhuber
-* Siebrand Mazeland
-* Chad Horohoe
-* Roan Kattouw
-* Trevor Pascal
-* Bryan Tong Minh
-* Sam Reed
-* Victor Vasiliev
-* Rotem Liss
-* Platonides
-* Many others (view CREDITS for a more complete list)
-
-The contributors hold the copyright to this work, and it is licensed under the
-terms of the GNU General Public License, version 2 or later (see
-http://www.fsf.org/licensing/licenses/gpl.html). Derivative works and later
-versions of the code must be free software licensed under the same or a
-compatible license. This includes "extensions" that use MediaWiki functions or
-variables; see http://www.gnu.org/licenses/gpl-faq.html#GPLAndPlugins for
-details.
-
-The Wikimedia Foundation currently has no legal rights to the software.
-
-Sections of code written exclusively by Lee Crocker or Erik Moeller are also
-released into the public domain, which does not impair the obligations of users
-under the GPL for use of the whole code or other sections thereof.
-
-MediaWiki makes use of the Sajax Toolkit by modernmethod,
-http://www.modernmethod.com/sajax/ which has the following license:
-
-	'This work is licensed under the Creative Commons Attribution
-	License. To view a copy of this license, visit
-	http://creativecommons.org/licenses/by/2.0/ or send a letter
-	to Creative Commons, 559 Nathan Abbott Way,
-	Stanford, California 94305, USA.'
-
-MediaWiki use Creative Commons license marks to points to their online
-licenses. This content is trademarked and used under a specific license
-available at http://creativecommons.org/policies#trademark
-The restricted content is:
-
-* skins/common/images/cc-by-nc-sa.png
-* skins/common/images/cc-by-sa.png
-
-Many thanks to the Wikimedia regulars for testing and suggestions.
-
-The official website for MediaWiki is located at:
-
-	http://www.mediawiki.org/
-
-The code is currently maintained in a Git repository at
-gerrit.wikimedia.org. See http://www.mediawiki.org/wiki/Git for details.
-
-Please report bugs and make feature requests in our Bugzilla system:
-
-* https://bugzilla.wikimedia.org/
-
-Documentation and discussion on new features may be found at:
-
-* http://www.mediawiki.org/wiki/Manual:FAQ
-* http://www.mediawiki.org/wiki/Documentation
-* http://www.mediawiki.org/wiki/Development
-
-Extensions are listed at:
-
-* http://www.mediawiki.org/wiki/Category:Extensions
-
-If you are setting up your own wiki based on this software, it is highly
-recommended that you subscribe to mediawiki-announce:
-
-* https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
-
-The mailing list is very low volume, and is intended primarily for announcements
-of new versions, bug fixes, and security issues.
-
-A higher volume support mailing list can be found at:
-
-* https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
-
-Developer discussion takes place at:
-
-* https://lists.wikimedia.org/mailman/listinfo/wikitech-l
-
-There is also a development and support channel #mediawiki on irc.freenode.net,
-and an unoffical support forum at www.mwusers.com.
diff --git a/README.mediawiki b/README.mediawiki
new file mode 120000
index 00000000..100b9382
--- /dev/null
+++ b/README.mediawiki
@@ -0,0 +1 @@
+README
\ No newline at end of file
diff --git a/RELEASE-NOTES-1.21 b/RELEASE-NOTES-1.21
deleted file mode 100644
index c0c956c6..00000000
--- a/RELEASE-NOTES-1.21
+++ /dev/null
@@ -1,443 +0,0 @@
-= MediaWiki release notes =
-
-Security reminder: MediaWiki does not require PHP's register_globals. If you
-have it on, turn it '''off''' if you can.
-
-== MediaWiki 1.21.3 ==
-
-This is a security adn maintenance release of the MediaWiki 1.21 branch.
-
-=== Changes since 1.21.2 ===
-
-* (bug 53032) SECURITY: Don't cache when a call could autocreate
-* (bug 55332) SECURITY: Improve css javascript detection
-* (bug 49717) Fix behaviour $wgVerifyMimeType = false; in Upload
-* Fix comma errors in various js files
-* Translations
-
-== MediaWiki 1.21.2 ==
-
-This is a security adn maintenance release of the MediaWiki 1.21 branch.
-
-=== Changes since 1.21.1 ===
-
-* SECURITY: Fix extension detection with 2 .'s
-* SECURITY: Support for the 'gettoken' parameter to action=block and action=unblock,
-  deprecated since 1.20, has been removed.
-* SECURITY: Sanitize ResourceLoader exception messages
-* Purge upstream caches when deleting file assets.
-* Unit test suite now runs the AutoLoader tests. Also fixed the autoloading
-  entry for the PageORMTableForTesting class though it had no impact.
-
-== MediaWiki 1.21.1 ==
-
-This is a maintenance release of the 1.21 branch.
-
-MediaWiki 1.21 is a stable branch, and is recommended for use in production.
-
-=== Changes since 1.21.0 ===
-
-* An incorrect version number was used for 1.21.0.  1.21.1 has the correct number.
-* A problem with the Oracle SQL table creation was fixed.
-* (PdfHandler extension) Fix warning if pdfinfo fails but pdftext succeeds.
-
-=== Configuration changes in 1.21 ===
-* (bug 48306) $wgAllowChunkedUploads has been added and is false by default.
-* (bug 29374) $wgVectorUseSimpleSearch is now enabled by default.
-* Deprecated $wgAllowRealName is removed. Use $wgHiddenPrefs[] = 'realname'
-  instead.
-* (bug 39957) Added $wgUnwatchedPageThreshold, specifying minimum count
-  of page watchers required for the number to be accessible to users
-  without the unwatchedpages permission.
-* $wgBug34832TransitionalRollback has been removed.
-* (bug 29472) $wgUseDynamicDates has been removed and its functionality
-  disabled.
-
-=== New features in 1.21 ===
-* (bug 41769) Add parser method to call parser functions.
-* (bug 38110) Schema changes (adding or dropping tables, indices and
-  fields) can be now be done separately from from other changes that
-  update.php makes.  This is useful in environments that use database
-  permissions to restrict schema changes but allow the DB user that
-  MediaWiki normally runs as to perform other changes that update.php
-  makes.  Schema changes can be run separately.  See the file UPGRADE
-  for more information.
-* (bug 34876) jquery.makeCollapsible has been improved in performance.
-* Added ContentHandler facility to allow extensions to support other content
-  than wikitext. See docs/contenthandler.txt for details.
-* New feature was developed for showing high-DPI thumbnails for high-DPI mobile
-  and desktop displays (configurable with $wgResponsiveImages).
-* Added new backend to represent and store information about sites and site
-  specific configuration.
-* jQuery upgraded from 1.8.2 to 1.8.3.
-* jQuery UI upgraded from 1.8.23 to 1.8.24.
-* Added separate fa_sha1 field to filearchive table. This allows sha1
-  searches with the api in miser mode for deleted files.
-* Add initial and programmatic sorting for tablesorter.
-* Add the event "sortEnd.tablesorter", triggered after sorting has completed.
-* The Job system was refactored to allow for different backing stores for
-  queues as well as cross-wiki access to queues, among other things. The schema
-  for the DB queue was changed to support better concurrency and reduce
-  deadlock errors.
-* Added ApiQueryORM class to facilitate creation of query API modules based on
-  tables that have a corresponding ORMTable class.
-* (bug 40876) Icon for PSD (Adobe Photoshop) file types.
-* (bug 40641) Implemented Special:Version/Credits with a list of contributors.
-* (bug 7851) Implemented one-click AJAX patrolling.
-* The <data>, <time>, <meta>, and <link> elements are allowed within WikiText
-  for use with Microdata.
-* The HTML5 <mark> tag has been whitelisted.
-* Added ParserCloned hook for when the Parser object is cloned.
-* Added AlternateEditPreview hook to allow extensions to replace the page
-  preview from the edit page.
-* Added EditPage::showStandardInputs:options hook to allow extensions to add
-  new fields to the "editOptions" area of the edit form.
-* Upload stash DB schema altered to improve upload performance.
-* The following global functions are now reporting deprecated warnings in
-  debug mode: wfMsg, wfMsgNoTrans, wfMsgForContent, wfMsgForContentNoTrans,
-  wfMsgReal, wfMsgGetKey, wfMsgHtml, wfMsgWikiHtml, wfMsgExt, wfEmptyMsg. Use
-  the Message class, or the global method wfMessage.
-* Added $wgEnableCanonicalServerLink, off by default. If enabled, a
-  <link rel=canonical> tag is added to every page indicating the correct server
-  to use.
-* Debug message emitted by wfDebugLog() will now be prefixed with the group
-  name when its logged to the default log file. That is the case whenever the
-  group has no key in wgDebugLogGroups, that will help triage the default log.
-* (bug 24620) Add types to LogFormatter.
-* jQuery JSON upgraded from 2.3 to 2.4.0.
-* Added GetDoubleUnderscoreIDs hook, for modifying the list of magic words.
-* DatabaseUpdater class has two new methods to ease extensions schema changes:
-  dropExtensionIndex and renameExtensionIndex.
-* New preference type - 'api'. Preferences of this type are not shown on
-  Special:Preferences, but are still available via the action=options API.
-* (bug 39397) Hide rollback link if a user is the only contributor of the page.
-* $wgPageInfoTransclusionLimit limits the list size of transcluded articles
-  on the info action. Default is 50.
-* Added action=createaccount to allow user account creation.
-* (bug 40124) action=options API also allows for setting of arbitrary
-  preferences, provided that their names are prefixed with 'userjs-'. This
-  officially reenables the feature that was undocumented and defective
-  in MW 1.20 (saving preferences using Special:Preferences cleared any
-  additional fields) and which has been disabled in 1.20.1 as a part of
-  a security fix (bug 42202).
-* Added option to specify "others" as author in extension credits using
-  "..." as author name.
-* Added the ability to limit the wall clock time used by shell processes,
-  as well as the CPU time. Configurable with $wgMaxShellWallClockTime.
-* Allow memory of shell subprocesses to be limited using Linux cgroups
-  instead of ulimit -v, which tends to cause deadlocks in recent versions
-  of ImageMagick. Configurable with $wgShellCgroup.
-* Added $wgWhitelistReadRegexp for regex whitelisting.
-* (bug 5346) Categories that are redirects will be displayed italic in
-  the category links section at the bottom of a page.
-* (bug 43915) New maintenance script deleteEqualMessages.php.
-* You can now create checkbox option matrices through the HTMLCheckMatrix
-  subclass in HTMLForm.
-* WikiText now permits the use of WAI-ARIA's role="presentation" inside of
-  html elements and tables. This allows presentational markup, especially
-  tables. To be marked up as such.
-* maintenance/sql.php learned the --cluster option. Let you run the script
-  on some external cluster instead of the primary cluster for a given wiki.
-* (bug 20281) test the parsing of inline URLs.
-* Added Special:PagesWithProp, which lists pages using a particular page property.
-* Implemented language-specific collations for category sorting for 67 languages
-  based in latin, greek and cyrillic alphabets. This allows one to *finally* get
-  articles to be correctly sorted on category pages. They are named
-  'uca-<langcode>', where <langcode> is one of: af, ast, az, be, bg, br, bs, ca,
-  co, cs, cy, da, de, dsb, el, en, eo, es, et, eu, fi, fo, fr, fur, fy, ga, gd,
-  gl, hr, hsb, hu, is, it, kk, kl, ku, ky, la, lb, lt, lv, mk, mo, mt, nl, no,
-  oc, pl, pt, rm, ro, ru, rup, sco, sk, sl, smn, sq, sr, sv, tk, tl, tr, tt, uk,
-  uz, vi.
-* Added 'CategoryAfterPageAdded' and 'CategoryAfterPageRemoved' hooks.
-* Added 'HistoryRevisionTools' and 'DiffRevisionTools' hooks.
-* Added 'SpecialSearchResultsPrepend' and 'SpecialSearchResultsAppend' hooks.
-* (bug 33186) Add image rotation api "imagerotate"
-* (bug 34040) Add "User rights management" link on user page toolbox.
-* (bug 45526) Add QUnit assertion helper "QUnit.assert.htmlEqual" for asserting
-  structual equality of HTML (ignoring insignificant differences like
-  quotmarks, order and whitespace in the attribute list).
-
-=== Bug fixes in 1.21 ===
-* (bug 48306) Chunked uploads allow arbitrary data to be dropped on the server
-* (bug 47271) $wgContentHandlerUseDB should be set to false during the upgrade
-* (bug 46084) Sanitize $limitReport before outputting.
-* (bug 46859) Disable external entities in XMLReader.
-* (bug 47251) Disable external entities in Import.
-* (bug 42649) PHP Fatal error: Call to a member function isLocal() on a
-  non-object in Title.php.
-* (bug 46493) Special:ProtectedPages results in whitepage when a bad title is protected.
-* (bug 40617) Installer can now customize the logo in LocalSettings.php.
-* (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
-* (bug 40352) fixDoubleRedirects.php should support interwiki redirects.
-* (bug 9237) SpecialBrokenRedirect should not list interwiki redirects.
-* (bug 34960) Drop unused fields rc_moved_to_ns and rc_moved_to_title from
-  recentchanges table.
-* (bug 32951) Do not register internal externals with absolute protocol,
-  when server has relative protocol.
-* (bug 39005) When purging proxies listed in $wgSquidServers using HTTP PURGE
-  method requests, we now send a Host header by default, for Varnish
-  compatibility. This also works with Squid in reverse-proxy mode. If you wish
-  to support Squid configured in forward-proxy mode, set
-  $wgSquidPurgeUseHostHeader to false.
-* (bug 37020) sql.php with readline eats semicolon.
-* (bug 11748) Properly handle optionally-closed HTML tags when Tidy is
-  disabled, and don't wrap HTML-syntax definition lists in paragraphs.
-* (bug 41409) Diffs while editing an old revision should again diff against the
-  current revision.
-* (bug 41494) Honor $wgLogExceptionBacktrace when logging non-API exceptions
-  caught during API execution.
-* (bug 37963) Fixed loading process for user options.
-* (bug 26995) Update filename field on Upload page after having sanitized it.
-* (bug 41793) Contribution links to users with 0 edits on Special:ListUsers
-  didn't show up red.
-* (bug 41899) A PHP notice no longer occurs when using the "rvcontinue" API
-  parameter.
-* (bug 42036) Account creation emails now contain canonical (not
-  protocol-relative) URLs.
-* (bug 41990) Fix regression: API edit with redirect=true and lacking
-  starttimestamp and basetimestamp should not cause an edit conflict.
-* (bug 41706) EditPage: Preloaded page should be converted if possible and
-  needed.
-* (bug 41886) Rowspans are no longer exploded by tablesorter until the table is
-  actually sorted.
-* (bug 2865)  User interface HTML elements don't use lang attribute.
-  (completed the fix by adding the lang attribute to firstHeading).
-* (bug 42173) Removed namespace prefixes on Special:UncategorizedCategories.
-* (bug 36053) Log in "returnto" feature forgets query parameters if no
-  title parameter was specified.
-* (bug 42410) API action=edit now returns correct timestamp for the new edit.
-* (bug 14901) Email notification mistakes log action for new page creation.
-  Enotif no longer sends "page has been created" notifications for some log
-  actions. The following events now have a correct message: page creation,
-  deletion, move, restore (undeletion), change (edit). Parameter
-  $CHANGEDORCREATED is deprecated in 'enotif_body' and scheduled for removal in
-  MediaWiki 1.23.
-* (bug 457) In the sidebar of Vector, CologneBlue, Monobook, and Monobook-based
-  skins, the heading levels have been changed from (variously per skin)
-  <h4>, <h5> or <h6> to only <h3>s, with a <h2> hidden heading above them.
-  If you are styling or scripting the headings in a custom way, this change
-  will require updates to your site's CSS or JS.
-* (bug 41342) jquery.suggestions should cancel any active (async) fetches
-  before it triggers another fetch.
-* (bug 42184) $wgUploadSizeWarning missing second variable.
-* (bug 34581) removeUnusedAccounts.php maintenance script now ignores newuser
-  log when determining whether an account is used.
-* (bug 43379) Gracefully fail if rev_len is unavailable for a revision on the
-  History page.
-* (bug 42949) API no longer assumes all exceptions are MWException.
-* (bug 41733) Hide "New user message" (.usermessage) element from printable view.
-* (bug 39062) Special:Contributions will display changes that don't have
-  a parent id instead of just an empty bullet item.
-* (bug 37209) "LinkCache doesn't currently know about this title" error fixed.
-* wfMerge() now works if $wgDiff3 contains spaces
-* (bug 43052) mediawiki.action.view.dblClickEdit.dblClickEdit should trigger
-  ca-edit click instead opening URL directly.
-* (bug 43964) Invalid value of "link" parameter in <gallery> no longer produces
-  a fatal error.
-* (bug 44775) The username field is not pre-filled when creating an account.
-* (bug 45069) wfParseUrl() no longer produces a PHP notice if passed a "mailto:"
-  URL without address
-* (bug 45012) Creating an account by e-mail can no longer show a
-  "password mismatch" error.
-* (bug 44599) On Special:Version, HEADs for submodule checkouts (e.g. for
-  extensions) performed using Git 1.7.8+ should now appear.
-* (bug 42184) $wgUploadSizeWarning missing second variable
-* (bug 40326) Check if files exist with a different extension during uploading
-* (bug 34798) Updated CSS for Atom/RSS recent changes feeds to match on-wiki diffs.
-* (bug 42430) Calling numRows on MySQL no longer propagates unrelated errors.
-* (bug 44719) Removed mention of non-existing maintenance/migrateCurStubs.php
-  script in includes/DefaultSettings.php
-* (bug 45143) jquery.badge: Treat non-Latin variants of zero as zero as well.
-* (bug 46151) mwdocgen.php should not ignore exit code of doxygen command.
-* (bug 41889) Fix $.tablesorter rowspan exploding for complex cases.
-* (bug 47489) Installer now automatically selects the next-best database type if
-  the PHP mysql extension is not loaded, preventing fatal errors in some cases.
-* (bug 47202) wikibits: FF2Fixes.css should not be loaded in Firefox 20.
-
-=== API changes in 1.21 ===
-* BREAKING CHANGE: Chunked uploads are now disabled by default.  You can re-enable
-  them by setting $wgAllowChunkedUploads=true
-* BREAKING CHANGE: list=logevents output format changed for details of some log
-  types. Specifically, details that were formerly reported under a key like
-  "4::foo" will now be reported under a key of simply "foo".
-* BREAKING CHANGE: '??_badcontinue' error code was changed to '??badcontinue'
-  for all query modules.
-* prop=revisions can now report the contentmodel and contentformat.
-  See docs/contenthandler.txt.
-* action=edit and action=parse now support contentmodel and contentformat
-  parameters to control the interpretation of page content.
-  See docs/contenthandler.txt for details.
-* (bug 35693) ApiQueryImageInfo now suppresses errors when unserializing metadata.
-* (bug 40111) Disable minor edit for page/section creation by API.
-* (bug 41042) Revert change to action=parse&page=... behavior when the page
-  does not exist.
-* (bug 27202) Add timestamp sort to list=allimages.
-* (bug 43137) Don't return the sha1 of revisions through the API if the content is
-  revision-deleted.
-* ApiQueryImageInfo now also returns imageinfo for redirects.
-* list=alltransclusions added to enumerate every instance of page embedding
-* list=alllinks & alltransclusions now allow both 'from' and 'continue' in
-  the same query. When both are present, 'from' is simply ignored.
-* list=alllinks & alltransclusions now allow 'unique' in generators, to yield
-  a list of all link/template target pages instead of source pages.
-* ApiQueryBase adds 'badcontinue' error code if module has 'continue' parameter.
-* (bug 35885) Removed version parameter and all getVersion() methods.
-* action=options now takes a "resetkinds" option, which allows only resetting
-  certain types of preferences when the "reset" option is set.
-* (bug 36751) ApiQueryImageInfo now returns imageinfo for the redirect target
-  when queried with &redirects=.
-* (bug 31849) ApiQueryImageInfo no longer gets confused when asked for info on
-  a redirect and its target.
-* (bug 43849) ApiQueryImageInfo no longer throws exceptions with ForeignDBRepo
-  redirects.
-* On error, any warnings generated before that error will be shown in the result.
-* action=help supports generalized submodules (modules=query+value), querymodules obsolete
-* ApiQueryImageInfo continuation is more reliable. The only major change is
-  that the imagerepository property will no longer be set on page objects not
-  processed in the current query (i.e. non-images or those skipped due to
-  iicontinue).
-* Add supports for all pageset capabilities - generators, redirects, converttitles to
-  action=purge and action=setnotificationtimestamp.
-* (bug 43251) prop=pageprops&ppprop= now accepts multiple props to query.
-* ApiQueryImageInfo will now limit the number of calls to File::transform made
-  in any one query. If there are too many, iicontinue will be returned.
-* action=query&meta=siteinfo&siprop=general will now return the regexes used for
-  link trails and link prefixes. Added for Parsoid support.
-* Added an API query module list=pageswithprop, which lists pages using a
-  particular page property.
-* Added an API query module list=pagepropnames, which lists all page prop names
-  currently in use on the wiki.
-* (bug 44921) ApiMain::execute() will now return after the CORS check for an
-  HTTP OPTIONS request.
-* (bug 44923) action=upload works correctly if the entire file is uploaded in
-  the first chunk.
-* Added 'continue=' parameter to streamline client iteration over complex query results
-* (bug 44909) API parameters may now be marked as type "upload", which is now
-  used for action=upload's 'file' and 'chunk' parameters. This type will raise
-  an error during parameter validation if the parameter is given but not
-  recognized as an uploaded file.
-* (bug 44244) prop=info may now return the number of people watching each page.
-* (bug 33304) list=allpages will no longer return duplicate entries when
-  querying protection.
-* (bug 33304) list=allpages will now find really old indefinite protections.
-* (bug 45937) meta=allmessages will report a syntactically invalid lang as a
-  proper error instead of as an uncaught exception.
-* (bug 48542) SpecialStatistics::getOtherStats() now uses the user language.
-
-=== API internal changes in 1.21 ===
-* BREAKING CHANGE: ApiPageSet constructor now has two params instead of three, with only the
-  first one keeping its meaning. ApiPageSet is now derived from ApiBase.
-* BREAKING CHANGE: ApiQuery::newGenerator() and executeGeneratorModule() were deleted.
-* For debugging only, a new global $wgDebugAPI removes many API restrictions when true.
-  Never use on the production servers, as this flag introduces security holes.
-  Whenever enabled, a warning will also be added to all output.
-* ApiModuleManager now handles all submodules (actions,props,lists) and instantiation
-* Query stores prop/list/meta as submodules
-* ApiPageSet can now be used in any action to process titles/pageids/revids or any generator.
-* ApiQueryGeneratorBase::setGeneratorMode() now requires a pageset param.
-* $wgAPIGeneratorModules is now obsolete and will be ignored.
-* Added flags ApiResult::OVERRIDE and ADD_ON_TOP to setElement() and addValue()
-* Internal API calls will now include <warnings> in case of unused parameters
-
-=== Languages updated in 1.21 ===
-
-MediaWiki supports over 350 languages. Many localisations are updated
-regularly. Below only new and removed languages are listed, as well as
-changes to languages because of Bugzilla reports.
-
-* South Azerbaijani (azb) added.
-* (bug 30040) Autonym for nds-nl is now 'Nedersaksies' (was 'Nedersaksisch').
-* (bug 45436) Autonym for pi (Pali) is now 'पालि' (was ''पाळि').
-* (bug 34977) Now formatted numbers in Spanish use space as separator
-  for thousands, as mandated by the Real Academia Española.
-* (bug 35031) Kurdish formatted numbers now use period and comma
-  as separators for thousands and decimals respectively.
-
-=== Other changes in 1.21 ===
-* BREAKING CHANGE: (bug 44385) Removed the jquery.collapsibleTabs module and
-  moved it to the Vector extension. It was entirely Vector-extension-specific,
-  deeply interconnected with the extension, and this functionality really
-  belongs to the extension instead of the skin anyway. In the unlikely case you
-  were using it, you have to either copy it to your extension, or install the
-  Vector extension (and possibly disable its features using config settings if
-  you don't want them).
-* BREAKING CHANGE: Filenames of maintenance scripts were standardized into
-  lowerCamelCase format, and made more explicit:
-  - clear_stats.php -> clearCacheStats.php
-  - clear_interwiki_cache.php -> clearInterwikiCache.php
-  - initStats.php -> initSiteStats.php
-  - proxy_check.php -> proxyCheck.php
-  - stats.php -> showCacheStats.php
-  - showStats.php -> showSiteStats.php.
-  Class names were renamed accordingly:
-  - clear_stats -> ClearCacheStats
-  - InitStats -> InitSiteStats
-  - CacheStats -> ShowCacheStats
-  - ShowStats -> ShowSiteStats.
-* BREAKING CHANGE: (bug 38244) Removed the mediawiki.api.titleblacklist module
-  and moved it to the TitleBlacklist extension.
-* Experimental IBM DB2 support was removed due to lack of interest and maintainership.
-
-== Compatibility ==
-
-MediaWiki 1.21 requires PHP 5.3.2 or later.
-
-MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
-support for them is somewhat less mature. There is experimental support for
-Oracle.
-
-The supported versions are:
-
-* MySQL 5.0.2 or later
-* PostgreSQL 8.3 or later
-* SQLite 3.3.7 or later
-* Oracle 9.0.1 or later
-
-== Upgrading ==
-
-1.21 has several database changes since 1.20, and will not work without schema
-updates. Note that due to changes to some very large tables like the revision
-table, the schema update may take quite long (minutes on a medium sized site,
-many hours on a large site).
-
-If upgrading from before 1.11, and you are using a wiki as a commons
-repository, make sure that it is updated as well. Otherwise, errors may arise
-due to database schema changes.
-
-If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
-new database fields are filled with data.
-
-If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
-1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
-with MediaWiki 1.21.
-
-Don't forget to always back up your database before upgrading!
-
-See the file UPGRADE for more detailed upgrade instructions.
-
-For notes on 1.19.x and older releases, see HISTORY.
-
-== Online documentation ==
-
-Documentation for both end-users and site administrators is available on
-MediaWiki.org, and is covered under the GNU Free Documentation License (except
-for pages that explicitly state that their contents are in the public domain):
-
-	https://www.mediawiki.org/wiki/Documentation
-
-== Mailing list ==
-
-A mailing list is available for MediaWiki user support and discussion:
-
-	https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
-
-A low-traffic announcements-only list is also available:
-
-	https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
-
-It's highly recommended that you sign up for one of these lists if you're
-going to run a public MediaWiki, so you can be notified of security fixes.
-
-== IRC help ==
-
-There's usually someone online in #mediawiki on irc.freenode.net.
diff --git a/RELEASE-NOTES-1.22 b/RELEASE-NOTES-1.22
new file mode 100644
index 00000000..dad24388
--- /dev/null
+++ b/RELEASE-NOTES-1.22
@@ -0,0 +1,610 @@
+Security reminder: MediaWiki does not require PHP's register_globals. If you
+have it on, turn it '''off''' if you can.
+
+== MediaWiki 1.22 ==
+
+THIS IS NOT A RELEASE YET
+
+MediaWiki 1.22 is an alpha-quality branch and is not recommended for use in
+production.
+
+* Breaking Changes in 1.22
+* New features in 1.22
+* Configuration changes in 1.22
+* Bug fixes in 1.22
+* API changes in 1.22
+* Languages updated in 1.22
+* Other changes in 1.22
+
+=== Breaking Changes in 1.22 ===
+* BREAKING CHANGE: (bug 41729) Display editsection links next to headings. Also
+  change their class name from .editsection to .mw-editsection and place them at
+  the end of the heading element instead of the beginning. Client-side code and
+  screen-scrapers will have to be adjusted to handle both cases (old HTML will
+  still be visible on cached page renders until they are purged); extensions
+  using the DoEditSectionLink or EditSectionLink hooks might need adjustments as
+  well.
+* (bug 55818) BREAKING CHANGE: Removed undocumented 'Debug' hook in wfDebug.
+  This resolves an infinite loop when using $wgDebugFunctionEntry = true.
+* BREAKING CHANGE: action=parse no longer returns all langlinks for the page
+  with prop=langlinks by default. The new effectivelanglinks parameter will
+  request that the LanguageLinks hook be called to determine the effective
+  language links.
+* BREAKING CHANGE: list=allpages, list=langbacklinks, and prop=langlinks do not
+  apply the new LanguageLinks hook, and thus only consider language links
+  stored in the database.
+* BREAKING CHANGE: Implementation of MediaWiki's JS and JSON value encoding
+  has changed:
+** MediaWiki no longer supports PHP installations in which the native JSON
+   extension is missing or disabled.
+** XmlJsCode objects can no longer be nested inside objects or arrays.
+   (For Xml::encodeJsCall(), this individually applies to each argument.)
+** The sets of characters escaped by default, along with the precise escape
+   sequences used, have changed (except for the Xml::escapeJsString()
+   function, which is now deprecated).
+* BREAKING CHANGE: The Services_JSON class has been removed. If necessary,
+  be sure to upgrade affected extensions at the same time (e.g. Collection).
+* BREAKING CHANGE: Legacy skins Simple, MySkin, Chick, Standard and Nostalgia
+  were all removed. (Nostalgia was moved to an extension.) The SkinLegacy and
+  LegacyTemplate classes that supported them were removed as well and are now a
+  part of the Nostalgia extension.
+* BREAKING CHANGE: The "ExternalAuth" authentication subsystem was removed, along
+  with its associated globals of $wgExternalAuthType, $wgExternalAuthConf,
+  $wgAutocreatePolicy and $wgAllowPrefChange. Affected users are encouraged to
+  use AuthPlugin for external authentication/authorization needs.
+* BREAKING CHANGE: mw.util.tooltipAccessKeyRegexp: The match group for the
+  accesskey character is now $6 instead of $5.
+* BREAKING CHANGE: meta keywords are no longer supported. A <meta name="keywords"
+  will no longer be output and OutputPage::addKeyword no longer exists.
+* BREAKING CHANGE: The EditSectionLink hook was removed after being
+  deprecated since MediaWiki 1.14. Use DoEditSectionLink instead.
+* (bug 50310) BREAKING CHANGE: wikibits: Drop support for mwCustomEditButtons.
+  It defaults to an empty array and emits mw.log.warn when accessed.
+* BREAKING CHANGE: Special:Disambiguations has been removed from MediaWiki core.
+  Functions related to disambiguation pages are now handled by the Disambiguator
+  extension (https://www.mediawiki.org/wiki/Extension:Disambiguator) (bug
+  35981).
+* BREAKING CHANGE: The 'mediawiki.legacy.wikiprintable' module has been removed.
+  The skins/common/wikiprintable.css file no longer exists. Return value of
+  Skin#commonPrintStylesheet is ignored. Please use the 'mediawiki.legacy.commonPrint'
+  module instead or base your skin on SkinTemplate.
+* BREAKING CHANGE: The module 'mediawiki.legacy.IEFixes' has been removed as it was
+  unused. The file skins/common/IEFixes.js remains but is only used by wikibits.
+  The file never contained any re-usable components. To use it in a skin, load
+  'mediawiki.legacy.wikibits' (which IEFixes depends on) and that will import
+  IEFixes automatically if user agent conditions are met.
+
+=== New features in 1.22 ===
+* You can now install extensions using Composer.
+  See https://www.mediawiki.org/wiki/Composer
+* (bug 44525) mediawiki.jqueryMsg can now parse (whitelisted) HTML elements and attributes.
+* (bug 33454) Language::sprintfDate now has a timezone parameter, and supports
+  the "eIOPTZ" formatting characters.
+* EditWarning: A warning is shown when an editor leaves the edit form without
+  saving (enabled by default, users can opt-out via the 'useeditwarning'
+  preference). This feature was moved from the Vector extension, and is now part
+  of core for all skins. Take care when upgrading that you don't use an older
+  version of the Vector extension as this feature may conflict.
+* New 'mediawiki.ui' CSS module providing mw-ui-* styles for buttons and a
+  compact vertical form layout.
+* HTMLForm supports a new display format 'vform' which applies this compact vertical
+  layout and button styling. Special:PasswordReset uses this format.
+* New versions of login (Special:UserLogin) and create account
+  (Special:UserLogin/signup) forms using the "vform" compact vertical form layout.
+  These forms use new messages that assume a "Help logging in" link, see
+  https://www.mediawiki.org/wiki/Manual:Page_customizations;
+  https://www.mediawiki.org/wiki/Account_creation_user_experience/Strings lists the
+  message key changes.
+* (bug 23343) Implemented ability to apply IP blocks to the contents of X-Forwarded-For headers
+  by adding a new configuration variable $wgApplyIpBlocksToXff (disabled by default).
+* The new hook 'APIGetPossibleErrors' to modify the list of possible errors was
+  added.
+* (bug 25592) LogEventsList::showLogExtract() will now ignore various
+  Pager-related WebRequest parameters by default, as this is overwhelmingly
+  likely to be what was intended by users of the method. If any caller wishes
+  to use these parameters, the new param 'useRequestParams' may be set to true.
+* mw.util.addPortletLink: Tooltip is no longer required to be plain (without
+  an accesskey in it already). As such it now rountrips. Creating a link with a
+  message as tooltip, grabbing the title attribute and using it to create
+  another portlet will work as expected.
+* (bug 6747) {{ROOTPAGENAME}} introduced, contains the name of the topmost
+  page without namespace.
+* (bug 45535) introduced the new 'LanguageLinks' hook for manipulating the
+  language links associated with a page before display.
+* Chosen (http://harvesthq.github.io/chosen/) was added as module 'jquery.chosen'
+* HTMLForm will turn multiselect checkboxes into a Chosen interface when setting cssclass 'mw-chosen'
+* rebuildLocalisationCache learned --lang option. Let you rebuild l10n caches
+  of the specified languages instead of all of them.
+* New GetNewMessagesAlert hook allowing extensions to disable or modify the new
+  messages alert
+* New wgUserNewMsgRevisionId JS global for logged in users. This will be null
+  if the user has no new talk page messages. Otherwise it will be set to the
+  revision ID of the oldest new talk page message. This will allow gadgets and
+  extensions to create their own new message alerts on the client side.
+* mediawiki.log: Added log.warn wrapper (uses console.warn and console.trace).
+* mediawiki.log: Implemented log.deprecate. This method defines a property and
+  uses ES5 getter/setter to emit a warning when they are used.
+* $wgCascadingRestrictionLevels was added, allowing one to specify restriction levels
+  which can be cascading (previously 'sysop' was hard-coded as the only one).
+* XHTML5 support has been improved. If you set $wgMimeType = 'application/xhtml+xml'
+  MediaWiki will try outputting markup acording to XHTML5 rules.
+* Altered hook 'ProtectionForm::save', adding the reason page protection is
+  changed as third parameter.
+* New hook 'TitleSquidURLs' for manipulating the list of URLs to be purged from
+  HTTP caches when a page is changed.
+* Changed the patrolling system to always show the link for patrolling in case the
+  current revision is patrollable. This also removed the usage of the rcid URI parameters.
+* Oracle DB backend now supports Database Resident Connection Pooling (DRCP).
+  Can be enabled by setting $wgDBOracleDRCP=true.
+  Requires Oracle DB 11gR1 or above, enabled DRCP inside the DB itself and a
+  propper connect string.
+  More about DRCP can be found at:
+  http://www.oracle-base.com/articles/11g/database-resident-connection-pool-11gr1.php
+* Add a new parameter $patrolFooterShown to hook ArticleViewFooter so the hook
+  handlers can take further action based on the status of the patrol footer
+* A new hook TitleQuickPermissions was added to allow overriding of quick
+  permissions in the Title class.
+* LinkCache singleton can now be altered or cleared, letting one to specify
+  another instance that does not rely on a database backend.
+* MediaWiki's PHPUnit tests can now use PHPUnit installed using composer --dev.
+* (bug 43689) The lists of templates used on the page and hidden categories it
+  is a member of, shown below the edit form, are now collapsible (and collapsed
+  by default).
+* Parser profiling data, formerly only available in the "NewPP limit report"
+  HTML comment, is now also displayed at the bottom of page previews.
+* Added ParserLimitReportPrepare and ParserLimitReportFormat hooks, deprecated
+  ParserLimitReport hook.
+* New user rights have been added to increase granularity in rights management
+  for extensions such as OAuth:
+** editmyusercss controls whether a user may edit their own CSS subpages.
+** editmyuserjs controls whether a user may edit their own JS subpages.
+** viewmywatchlist controls whether a user may view their watchlist.
+** editmywatchlist controls whether a user may edit their watchlist.
+** viewmyprivateinfo controls whether a user may access their private
+   information (e.g. registered email address, real name).
+** editmyprivateinfo controls whether a user may change their private
+   information.
+** editmyoptions controls whether a user may change their preferences.
+* Add new hook AbortTalkPageEmailNotification, this will be used to determine
+  whether to send the regular talk page email notification
+* Action classes registered in $wgActions are now also supported in the form of
+  a callback (which returns an instance of Action) instead of providing the name
+  of a subclass of Action.
+* (bug 46513) Vector: Add the collapsibleTabs script from the Vector extension.
+* Added $wgRecentChangesFlags for defining new flags for RecentChanges and
+  watchlists.
+* (bug 40518) mw.toolbar: Implemented mw.toolbar.addButtons for adding multiple
+ button objects in one call.
+* Rights used for the default protection levels ('sysop' and 'autoconfirmed')
+  are now used just for that purpose, instead of overloading other rights. This
+  allows easy granting of the ability to edit sysop-protected pages without
+  also granting the ability to protect and unprotect.
+* (bug 48256) Make brackets in section edit links accessible to CSS.
+  They are now wrapped in <span class="mw-editsection-bracket" />.
+* (bug 8480) Allow handler specific parameters in galleries (like page number)
+* jquery.client: Add detection for Opera 15 and Internet Explorer 11.
+* Change tags (used by the AbuseFilter extension) are now shown on diff pages.
+* Change tag lists (shown on recent changes, watchlist, user contributions,
+  history pages, diff pages) now include a link to Special:Tags to distinguish
+  them from edit summaries.
+* Added a new method and hook, User::isEveryoneAllowed() and
+  UserIsEveryoneAllowed, for use in situations where a "does everyone have this
+  right?" check is used to avoid more expensive checks.
+* (bug 14431) Display "(No difference)" instead of an empty diff (when comparing
+  revisions in the history or when previewing changes while editing).
+* New hook 'IsUploadAllowedFromUrl' is added which can be used to intercept uploads by
+  URL, useful for blacklisting specific URLs
+* (bug 21912) Watchlist token implementation has been refactored and
+  Special:ResetTokens was added to allow users to reset their tokens
+  instead of presenting them in Preferences.
+* Special:PrefixIndex now lets you strip the searched prefix from the displayed
+  titles. Given a list of articles named Bug1, Bug2, you can now transclude the
+  list of bug numbers using: {{Special:PrefixIndex/Bug|stripprefix=1}}.
+  The special page form received a new checkbox matching that option.
+* (bug 23580) Implement javascript callback interface "mw.hook".
+* (bug 30713) New mw.hook "wikipage.content".
+* (bug 40430) jquery.placeholder gets a new parameter to set the attribute value
+  to be used.
+* $wgHTCPMulticastRouting renamed $wgHTCPRouting since it accepts unicast.
+* $wgHTCPRouting rules can now be passed an array of hosts/ports to send purge
+  too. Can be used whenever several multicast group could be interested by a
+  specific purge.
+* (bug 25931) Add Special:RandomInCategory.
+* mediawiki.util: addPortletLink now supports passing a jQuery object as nextnode.
+* <wbr> can now be used inside WikiText.
+* WebResponse::setcookie is much more featureful. Callers using PHP's
+  setcookie() or setrawcookie() should begin using this instead.
+* New hook WebResponseSetCookie, called from WebResponse::setcookie().
+* New hook ResetSessionID, called when the session id is reset.
+* Add a mode parameter to <gallery> tag with potential options of "traditional",
+  "nolines", "packed", "packed-overlay", or "packed-hover".
+* (bug 47399) A success message is now displayed after changing the password.
+* Make thumb.php give HTTP redirects for file redirects
+* (bug 30607) Special:ListFiles can now show old versions of files. Additionally
+  Special:AllMyUploads was introduced so the user can get a list of all things
+  they have ever uploaded, even if it was subsequently overriden.
+* Introduced Special:MyFiles and Special:AllMyFiles as an alias for Special:MyUploads
+  and Special:AllMyUploads respectively.
+* IPv6 addresses in X-Forwarded-For headers are now normalised before checking
+  against allowed proxy lists.
+* Add deferrable update support for callback/closure.
+* Add TitleMove hook before page renames.
+* Revision deletion backend code is moved out of SpecialRevisiondelete
+* Added {{REVISIONSIZE}} variable to get the current size of a revision.
+* Add support for the LESS stylesheet language to ResourceLoader. LESS is a
+  stylesheet language that compiles into CSS. ResourceLoader file modules may
+  include LESS style files; ResourceLoader will compile these files into CSS
+  before sending them to the client.
+** The $wgResourceLoaderLESSVars configuration variable is an associative array
+   mapping variable names to string CSS values. These variables are considered
+   declared for all LESS files. Additional variables may be registered by
+   adding keys to the array.
+** $wgResourceLoaderLESSFunctions is an associative array of custom LESS
+   function names to PHP callables. See <http://leafo.net/lessphp/docs/#custom_functions>
+   for more details regarding custom functions.
+** $wgResourceLoaderLESSImportPaths is an array of file system paths. Files
+   referenced in LESS '@import' statements are looked up here first.
+* ResourceLoader supports hashes as module cache invalidation trigger (instead
+  of or in addition to timestamps).
+* Added $wgExtensionEntryPointListFiles for use in mergeMessageFileList.php.
+* Added a hook, APIQuerySiteInfoStatisticsInfo, to allow extensions to modify
+  the output of the API query meta=siteinfo&siprop=statistics
+* Primary keys have been added to both the archive table and the externallinks
+  tables.
+* Added $wgEnableParserLimitReporting to control whether the NewPP limit report is
+  output in a HTML comment.
+* The 'UnwatchArticle' and 'WatchArticle' hooks now support a Status object
+  instead of just a boolean return value to abort the hook.
+* Added a hook, SpecialWatchlistGetNonRevisionTypes, to allow extensions
+  with custom recentchanges entries to hook into the Watchlist without
+  clobbering each other.
+* A hidden, empty input field was added to the edit form, and any edit that fills
+  it in will be rejected. This prevents against the simplest form of spambots.
+  Previously in the "SimpleAntiSpam" extension by Ryan Schmidt.
+* populateRevisionLength.php maintenance script updated to also populate
+  archive.ar_len field.
+* (bug 43571) DatabaseMySQLBase learned to list views, optionally filtered by a
+  prefix. Also fixed PHPUnit test suite when using a MySQL backend containing
+  views.
+
+=== Configuration changes in 1.22 ===
+* $wgRedirectScript was removed. It was unused.
+* Removed $wgLocalMessageCacheSerialized, it is now always true.
+* $wgVectorUseIconWatch is now enabled by default.
+* $wgCascadingRestrictionLevels was added.
+* ftps, ssh, sftp, xmpp, sip, sips, tel, sms, bitcoin, magnet, urn, and geo
+  have been whitelisted inside of $wgUrlProtocols.
+* $wgDocType and $wgDTD have been removed and are no longer used for the DOCTYPE.
+* $wgHtml5 is no longer used by core. Setting it to false will no longer disable HTML5.
+  It is still set to true for extension compatibility but doing so in extensions is deprecated.
+* $wgXhtmlDefaultNamespace is no longer used by core. Setting it will no longer change the
+  xmlns used by MediaWiki. Reliance on this variable by extensions is deprecated.
+* $wgHandheldStyle was removed.
+* $wgHandheldForIPhone was removed.
+* $wgJsMimeType is no longer used by core. Most usage has been removed since
+  HTML output is now exclusively HTML5.
+* $wgDBOracleDRCP added. True enables persistent connection with DRCP on Oracle.
+* $wgLogAutopatrol added to allow disabling logging of autopatrol edits in the logging table.
+  default for $wgLogAutopatrol is true.
+* The 'edit' right no longer allows for editing a user's own CSS and JS.
+* New rights 'editmyusercss', 'editmyuserjs', 'viewmywatchlist',
+  'editmywatchlist', 'viewmyprivateinfo', 'editmyprivateinfo', and
+  'editmyoptions' restrict actions that were formerly allowed by default. They
+  have been added to the default for $wgGroupPermissions['*'].
+* The 'editprotected' right no longer allows bypassing of all page protection
+  restrictions. Any group using it for this purpose will now need to have all
+  the individual rights listed in $wgRestrictionTypes for the same effect.
+* The 'protect' and 'autoconfirmed' rights are no longer used for the default
+  page protection levels. The rights 'editprotected' and 'editsemiprotected'
+  are now used for this purpose instead.
+* (bug 40866) wgOldChangeTagsIndex removed.
+* $wgNoFollowDomainExceptions now only matches entire domains. For example,
+  an entry for 'bar.com' will still match 'foo.bar.com' but not 'foobar.com'.
+* $wgCopyUploadTimeout and $wgCopyUploadAsyncTimeout added to change the timeout times for
+  fetching the file during upload by url.
+* New key added to $wgGalleryOptions - $wgGalleryOptions['mode'] to set
+  default gallery mode.
+* New hook 'GalleryGetModes' to allow extensions to make new gallery modes.
+* The checkbox for staying in HTTPS displayed on the login form when $wgSecureLogin is
+  enabled has been removed. Instead, whether the user stays in HTTPS will be determined
+  based on the user's preferences, and whether they came from HTTPS or not.
+* $wgRC2UDPAddress, $wgRC2UDPInterwikiPrefix, $wgRC2UDPOmitBots, $wgRC2UDPPort,
+  and $wgRC2UDPPrefix configuration options have been deprecated in favor of a
+  $wgRCFeeds configuration array. $wgRCFeeds makes both the format and
+  destination of recent change notifications customizable, and allows for
+  multiple destinations to be specified.
+* (bug 53862) portal-url, currentevents-url and helppage have been removed from the
+  default Sidebar.
+* The 'vector-simplesearch' preference is now enabled by default. Previously
+  it was only enabled if the Vector extension was installed.
+* The precise format of metric datagrams produced by the UDP profiler and stats counter
+  may now be specified as $wgUDPProfilerFormatString and $wgStatsFormatString,
+  respectively.
+* (bug 54597) $wgBlockOpenProxies, $wgProxyPorts, $wgProxyScriptPath, and
+  $wgProxyMemcExpiry have been removed, along with the open proxy scanner
+  script they were added for.
+* Default value of $wgMaxShellMemory has been tripled (it's now 300 MB).
+
+=== Bug fixes in 1.22 ===
+* (bug 47271) $wgContentHandlerUseDB should be set to false during the upgrade
+* Disable Special:PasswordReset when $wgEnableEmail is false. Previously one
+  could still navigate to the page by entering the URL directly.
+* (bug 47138) Fixed a fatal error when a blocked user tries to automatically
+  create an account on login due external authentication in some circumstances.
+* (bug 23393) HTML <hN> headings containing line breaks are now handled
+  correctly.
+* (bug 45803) Whitespace within == Headline == syntax and within <hN> headings
+  is now non-significant and not preserved in the HTML output.
+* (bug 47218) Special:BlockList now handles correctly user names with spaces
+  when passed as subpage.
+* Pager's properly validate which fields are allowed to be sorted on.
+* mw.util.tooltipAccessKeyRegexp: The regex now matches "option-" as well.
+  Support for Mac "option" was added in 1.16, but the regex was never updated.
+* (bug 46768) Usernames of blocking users now display correctly, even if numeric.
+* (bug 39590) Self-transclusions now show the most up to date result always
+  after save instead of being a revision behind.
+* A bias in wfRandomString() toward digits 1-7 has been corrected. Generated
+  strings will now start with digits 0 and 8-f as often as they should.
+* (bug 45371) Removed Parser_LinkHooks and CoreLinkFunctions classes.
+* (bug 41545) Allow <kbd>, <samp>, and <var> to be nested like allowed in html.
+* PLURAL magic word no longer causes a PHP notice when no matching form exists.
+* (bug 36641) Patrol page links no longer show on non-existent revisions.
+* (bug 35810) Pages not linked from Special:RecentChanges or Special:NewPages
+  are patrollable now.
+* (bug 30213) JavaScript for search suggestions is now disabled when the API
+  is disabled, and AJAX patrolling and watching are now disabled when use of
+  the write API is not allowed.
+* (bug 48294) API: Fix chunk upload async mode.
+* (bug 46749) Broken files tracking category removed from pages if an image
+  with that name is uploaded.
+* (bug 14176) System messages that are empty were previously incorrectly treated
+  as non-existent, causing a fallback to the default. This stopped users from
+  overriding system messages to make them blank.
+* (bug 48319) action=parse no longer returns an error if passed none of 'oldid',
+  'pageid', 'page', 'title', and 'text' (e.g. if only passed 'summary'). A
+  warning will instead be issued if 'title' is non-default, unless no props are
+  requested.
+* Special:Recentchangeslinked will now include upload log entries
+* (bug 41281) Fixed ugly output if file size could not be extracted for multi-page media.
+* (bug 50315) list=logevents API module will now output log entries by anonymous users.
+* (bug 38911) Handle headers with rowspan in jquery.tablesorter
+* (bug 658) Converted the table of contents on wiki pages from <table> to <div>
+  and adjusted skin CSS accordingly. The CSS was carefully crafted to be
+  backwards-compatible in all reasonable cases (uses of the __TOC__ magic word,
+  the #toc CSS id and the .toc CSS class). However, particularly bad abuse of
+  the id or the class can possibly break.
+* CSSJanus now supports rgb, hsl, rgba, and hsla color syntaxes.
+* Special:Listfiles can no longer be sorted by image name when filtering
+  by user in miser mode.
+* (bug 49074) CSSJanus: Handle values of border-radius correctly.
+* Handle relative inclusions ({{../name}}) in main namespace with subpages
+  enabled correctly (previously MediaWiki tried to include Template:Parent/name
+  instead of just Parent/name).
+* Added $wgAPIUselessQueryPages to allow extensions to flag their query pages
+  for non-inclusion in ApiQueryQueryPages.
+* (bug 50870) mediawiki.notification: Notification area should remain visible
+  when scrolled down.
+* (bug 13438) Special:MIMESearch no longer an expensive special page.
+* (bug 48342) Fixed a fatal error when $wgValidateAllHtml is set to true and
+  the function apache_request_headers() function is not available.
+* (bug 33399) LivePreview: Re-run wikipage content handlers
+  (jquery.makeCollapsible, jquery.tablesorter) after preview content is loaded.
+* (bug 51891) Fixed PHP notice on Special:PagesWithProp when no properties
+  are defined.
+* (bug 52006) Corrected documentation of $wgTranscludeCacheExpiry.
+* (bug 52077) The APIEditBeforeSave hook is giving the content of the whole
+  revision as second argument now, rather than just the current section.
+* (bug 49694) $wgSpamRegex is now also applied on the new section headline text
+  adding a new topic on a page
+* (bug 41756) Improve treatment of multiple comments on a blank line.
+* (bug 51064) Purge upstream caches when deleting file assets.
+* (bug 39012) File types with a mime that we do not know the extension for
+  can no longer be uploaded as an extension that we do know the mime type
+  for.
+* (bug 51742) Add data-sort-value for better sorting of hitcounts Special:Tags
+* (bug 26811) On DB error pages, server hostnames are now hidden when both
+  $wgShowHostnames and $wgShowSQLErrors are false.
+* (bug 6200) line breaks in <blockquote> are handled like they are in <div>
+* (bug 14931) Default character set now set to 'utf8' when a new MySQL
+  database is created.
+* (bug 47191) Fixed "Column 'si_title' cannot be part of FULLTEXT index"
+  MySQL error when installing using the binary character set option.
+* (bug 45288) Support mysqli PHP extension
+* (bug 56707) Correct tooltip of "Next n results" on query special pages.
+* (bug 56770) mw.util.addPortletLink: Check length before access array index.
+
+=== API changes in 1.22 ===
+* (bug 25553) The JSON output formatter now leaves forward slashes unescaped
+  to improve human readability of URLs and similar strings. Also, a "utf8"
+  option is now provided to use UTF-8 encoding instead of hex escape codes
+  for most non-ASCII characters.
+* (bug 46626) xmldoublequote parameter was removed. Because of a bug, the
+  parameter has had no effect since MediaWiki 1.16, and so its removal is
+  unlikely to impact existing clients.
+* (bug 47216) action=query&meta=siteinfo&siprop=skins will now indicate which
+  skin is the default and which are unusable (e.g. listed in $wgSkipSkins).
+* (bug 25325) Added support for wlshow filtering (bots/anon/minor/patrolled)
+  to action=feedwatchlist.
+* WDDX formatted output will actually be formatted (and normal output will no
+  longer be), and will no longer choke on booleans.
+* action=opensearch no longer silently ignores the format parameter.
+* action=opensearch now supports format=jsonfm.
+* list=usercontribs&ucprop=ids will now include the parent revision id.
+* (bug 47219) Allow specifying change type of Wikipedia feed items
+* prop=imageinfo now allows setting iiurlheight without setting iiurlwidth
+* prop=info now adds the content model and page language of the title.
+* New upload log entries will now contain information on the relevant
+  image (sha1 and timestamp).
+* (bug 49239) action=parse now can parse in preview and section preview modes.
+* (bug 49259) action=patrol now accepts revision ids.
+* (bug 48129) list=blocks&bkip= now correctly handles IPv6 CIDR ranges and
+  honors $wgBlockCIDRLimit. Note any clients passing invalid values to bkip
+  will now receive an error, rather than the previous behavior listing all
+  user blocks.
+* (bug 48201) action=parse&text=foo now assumes wikitext if no title is given,
+  rather than using the content model of the page "API".
+* action=watch no longer silently ignores hook abort.
+* (bug 50785) action=purge with forcelinkupdate=1 no longer queues refreshLinks
+  jobs in the job queue for link table updates of pages that use the given page
+  as a template. Instead, forcerecursivelinkupdate=1 is introduced and should
+  be used if that behaviour is desirable.
+* The 'debugLog' property (enabled by $wgDebugToolbar) no longer sets the log
+  entry values through ApiResult::content but directly. This changes the JSON
+  output from an array of objects with content in '*' to an array of strings
+  with the content.
+* (bug 51342) prop=imageinfo iicontinue now contains the dbkey, not the text
+  version of the title.
+* (bug 52538) action=edit will now use empty text instead of the contents
+  of section 0 when passed prependtext or appendtext with section=new.
+* Support for the 'gettoken' parameter to action=block and action=unblock,
+  deprecated since 1.20, has been removed.
+* (bug 49090) Token-getting functions will fail when using jsonp callbacks.
+* (bug 52699) action=upload returns normalized file name on warning
+  "exists-normalized" instead of filename to be uploaded to.
+* (bug 53884) action=edit will now return an error when the specified section
+  does not exist in the page.
+* Added meta=filerepoinfo API module for getting information about foreign
+  file repositories, and related ForeignAPIRepo methods getInfo and getApiUrl.
+* The new query module list=allfileusages to enumerate file usages was added.
+
+=== Languages updated in 1.22 ===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+* Batak Toba (bbc-latn) added.
+* (bug 46751) Made Buryat (Russia) (буряад) (bxr) fallback to Russian.
+
+=== Other changes in 1.22 ===
+* redirect.php was removed. It was unused.
+* ClickTracking integration was dropped from the mediaWiki.user.bucket
+  JavaScript function. The 'tracked' option is now ignored.
+* Event namespace used by jquery.makeCollapsible has been changed from
+  'mw-collapse' to 'mw-collapsible' for consistency with the module name.
+* The Quickbar feature of the legacy skin model and the last remnants of it
+  throughout the code base have been removed.
+* Externaledit/externaldiff preference was removed. Very few users used this
+  feature, and improper configuration can actually prevent a user from editing
+* Calling Linker methods using a skin will now output deprecation warnings.
+* (bug 46680) "Return to" links are no longer tagged with rel="next".
+* HipHop compiler (hphpc) support was removed. HipHop VM support (hhvm) was
+  added.
+* A new Special:Redirect page was added, providing lookup by revision ID,
+  user ID, or file name.  The old Special:Filepath page was reimplemented
+  to redirect through Special:Redirect.
+* Monobook: Removed the old conditional stylesheets for Opera 6, 7 and 9.
+* Support for XHTML 1.0 has been removed. MediaWiki now only outputs (X)HTML5.
+* wikibits: User-agent related globals have been deprecated. The following
+  properties now default to false and emit mw.log.warn: is_gecko, is_chrome_mac,
+  is_chrome, webkit_version, is_safari_win, is_safari, webkit_match, is_ff2,
+  ff2_bugs, is_ff2_win, is_ff2_x11, opera95_bugs, opera7_bugs, opera6_bugs,
+  is_opera_95, is_opera_preseven, is_opera, and ie6_bugs.
+* (bug 48276) MediaWiki will now flash a confirmation message upon successfully
+  editing a page.
+* (bug 40785) mediawiki.legacy.ajax has been marked as deprecated. The following
+  properties now emit mw.log.warn when accessed: sajax_debug, sajax_init_object,
+  sajax_do_call and wfSupportsAjax.
+* Methods Title::userCanEditCssSubpage and Title::userCanEditJsSubpage,
+  deprecated since 1.19, have been removed.
+* (bug 50134) Hook functions are no longer required to return a value. When a
+  hook function does not return a value (or when it returns an explicit null),
+  processing continues. To abort the hook, a hook function must return an
+  explicit, boolean false or a string error message. Other falsey values are
+  tantamount to a 'return true' in earlier versions of MediaWiki.
+* (bug 48256) The 'editsection-brackets' optional message was removed.
+  Section edit links' brackets can now be customized using CSS by
+  styling span.mw-editsection-bracket.
+* The usePatrol function in ChangesList has been marked as deprecated.
+* (bug 50785) A "null edit", that is, a save action in which no changes to the
+  page text are made and no revision recorded, will no longer send refreshLinks
+  jobs to the job table to update pages which use the edited page as a template.
+* The LivePreviewPrepare and LivePreviewDone events triggered on "jQuery( mw )"
+  have been deprecated in favour of using mw.hook.
+* The 'showjumplinks' user preference has been removed, jump links are now
+  always included.
+* Methods RecentChange::notifyRC2UDP, RecentChange::sendToUDP, and
+  RecentChange::cleanupForIRC have been deprecated, as it is now the
+  responsibility of classes implementing the RCFeedFormatter and RCFeedEngine
+  interfaces to implement the formatting and delivery for recent change
+  notifications.
+* SpecialPrefixindex methods namespacePrefixForm() and showPrefixChunk() have
+  been made protected. They were accepting form variance arguments, this is now
+  using properties in the SpecialPrefixindex class.
+* (bug 49629) The hook ExtractThumbParamaters has been deprecated in favour
+  of media handler overriding MediaHandler::parseParamString.
+* (bug 46512) The collapsibleNav feature from the Vector extension has been moved
+  to the Vector skin in core.
+* SpecialRecentChanges::addRecentChangesJS() function has been renamed
+  to addModules() and made protected.
+* Methods WatchAction::doWatch and WatchAction::doUnwatch now return a Status
+  object instead of a boolean.
+* Information boxes (CSS classes errorbox, warningbox, successbox) have been
+  made more subtle.
+* Code specific to the Math extension was marked as deprecated.
+* mediawiki.util: mw.util.wikiGetlink has been renamed to getUrl. (The old name
+  still works, but is deprecated.)
+
+== Compatibility ==
+
+MediaWiki 1.22 requires PHP 5.3.2 or later.
+
+MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
+support for them is somewhat less mature. There is experimental support for
+Oracle.
+
+The supported versions are:
+
+* MySQL 5.0.2 or later
+* PostgreSQL 8.3 or later
+* SQLite 3.3.7 or later
+* Oracle 9.0.1 or later
+
+== Upgrading ==
+
+1.22 has several database changes since 1.21, and will not work without schema
+updates. Note that due to changes to some very large tables like the revision
+table, the schema update may take quite long (minutes on a medium sized site,
+many hours on a large site).
+
+If upgrading from before 1.11, and you are using a wiki as a commons
+repository, make sure that it is updated as well. Otherwise, errors may arise
+due to database schema changes.
+
+If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
+new database fields are filled with data.
+
+If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
+1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
+with MediaWiki 1.21.
+
+Don't forget to always back up your database before upgrading!
+
+See the file UPGRADE for more detailed upgrade instructions.
+
+For notes on 1.21.x and older releases, see HISTORY.
+
+== Online documentation ==
+
+Documentation for both end-users and site administrators is available on
+MediaWiki.org, and is covered under the GNU Free Documentation License (except
+for pages that explicitly state that their contents are in the public domain):
+
+	https://www.mediawiki.org/wiki/Documentation
+
+== Mailing list ==
+
+A mailing list is available for MediaWiki user support and discussion:
+
+	https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+
+A low-traffic announcements-only list is also available:
+
+	https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
+
+It's highly recommended that you sign up for one of these lists if you're
+going to run a public MediaWiki, so you can be notified of security fixes.
+
+== IRC help ==
+
+There's usually someone online in #mediawiki on irc.freenode.net.
diff --git a/UPGRADE b/UPGRADE
index 7987b221..96b58361 100644
--- a/UPGRADE
+++ b/UPGRADE
@@ -296,18 +296,3 @@ If you have a very old database (earlier than organized MediaWiki releases
 in late August 2003) you may need to manually run some of the update SQL
 scripts in maintenance/archives before the installer is able to pick up
 with remaining updates.
-
-
-== Upgrading from UseModWiki or old "phase 2" Wikipedia code ==
-
-There is a semi-maintained UseModWiki to MediaWiki conversion script at
-maintenance/importUseModWiki.php; it may require tweaking and customization
-to work for you.
-
-Install a new MediaWiki first, then use the conversion script which will
-output SQL statements; direct these to a file and then run that into your
-database.
-
-You will have to rebuild the links tables etc after importing.
-
-
diff --git a/api.php b/api.php
index bc902297..8fab878c 100644
--- a/api.php
+++ b/api.php
@@ -36,16 +36,12 @@ define( 'MW_API', true );
 // Bail if PHP is too low
 if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
 	// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
-	require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
+	require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
 	wfPHPVersionError( 'api.php' );
 }
 
 // Initialise common code.
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-	require ( 'core/includes/WebStart.php' );
-} else {
-	require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
 
 wfProfileIn( 'api.php' );
 $starttime = microtime( true );
@@ -58,8 +54,8 @@ if ( !$wgRequest->checkUrlExtension() ) {
 // Verify that the API has not been disabled
 if ( !$wgEnableAPI ) {
 	header( $_SERVER['SERVER_PROTOCOL'] . ' 500 MediaWiki configuration Error', true, 500 );
-	echo( 'MediaWiki API is not enabled for this site. Add the following line to your LocalSettings.php'
-		. '<pre><b>$wgEnableAPI=true;</b></pre>' );
+	echo 'MediaWiki API is not enabled for this site. Add the following line to your LocalSettings.php'
+		. '<pre><b>$wgEnableAPI=true;</b></pre>';
 	die( 1 );
 }
 
diff --git a/composer-example.json b/composer-example.json
new file mode 100644
index 00000000..6c4d37f5
--- /dev/null
+++ b/composer-example.json
@@ -0,0 +1,11 @@
+{
+	"require": {
+		"php": ">=5.3.2"
+	},
+	"suggest": {
+		"ext-fileinfo": "*",
+		"ext-mbstring": "*",
+		"ext-wikidiff2": "*",
+		"ext-apc": "*"
+	}
+}
diff --git a/composer.json b/composer.json
deleted file mode 100644
index ded33652..00000000
--- a/composer.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-	"name": "mediawiki/core",
-	"description": "Free software wiki application developed by the Wikimedia Foundation and others",
-	"keywords": ["mediawiki", "wiki"],
-	"homepage": "https://www.mediawiki.org/",
-	"authors": [
-		{
-			"name": "MediaWiki Community",
-			"homepage": "https://www.mediawiki.org/wiki/Special:Version/Credits"
-		}
-	],
-	"license": "GPL-2.0",
-	"support": {
-		"issues": "https://bugzilla.wikimedia.org/",
-		"irc": "irc://irc.freenode.net/mediawiki",
-		"wiki": "https://www.mediawiki.org/"
-	},
-	"require": {
-		"php": ">=5.3.2"
-	},
-	"require-dev": {
-		"phpunit/phpunit": "*"
-	},
-	"suggest": {
-		"ext-fileinfo": "*",
-		"ext-mbstring": "*",
-		"ext-wikidiff2": "*",
-		"ext-apc": "*"
-	}
-}
diff --git a/docs/hooks.txt b/docs/hooks.txt
index d4a1c909..5aaf5961 100644
--- a/docs/hooks.txt
+++ b/docs/hooks.txt
@@ -120,7 +120,7 @@ If the code is well enough isolated, it can even be excluded when not used --
 making for some slight savings in memory and load-up performance at runtime.
 Admins who want to have all the reversed titles can add:
 
-	require_once('extensions/ReverseTitle.php');
+	require_once 'extensions/ReverseTitle.php';
 
 ...to their LocalSettings.php file; those of us who don't want or need it can
 just leave it out.
@@ -270,6 +270,10 @@ $reason: the reason for the move (added in 1.13)
 $user: the User object about to be created (read-only, incomplete)
 &$msg: out parameter: HTML to display on abort
 
+'AbortTalkPageEmailNotification': Return false to cancel talk page email notification
+$targetUser: the user whom to send talk page email notification
+$title: the page title
+
 'AbortChangePassword': Return false to cancel password change.
 $user: the User object to which the password change is occuring
 $mOldpass: the old password provided by the user
@@ -377,6 +381,11 @@ result.
 &$module: ApiBase Module object
 &$properties: Array of properties
 
+'APIGetPossibleErrors': Use this hook to modify the module's list of possible
+errors.
+$module: ApiBase Module object
+&$possibleErrors: Array of possible errors
+
 'APIQueryAfterExecute': After calling the execute() method of an
 action=query submodule. Use this to extend core API modules.
 &$module: Module object
@@ -423,6 +432,10 @@ sites general information.
 $module: the current ApiQuerySiteInfo module
 &$results: array of results, add things here
 
+'APIQuerySiteInfoStatisticsInfo': Use this hook to add extra information to the
+sites statistics information.
+&$results: array of results, add things here
+
 'APIQueryUsersTokens': Use this hook to add custom token to list=users. Every
 token has an action, which will be used in the ustoken parameter and in the
 output (actiontoken="..."), and a callback function which should return the
@@ -488,7 +501,8 @@ $logEntry: the ManualLogEntry used to record the deletion
 
 'ArticleEditUpdateNewTalk': Before updating user_newtalk when a user talk page
 was changed.
-$wikiPage: WikiPage (object) of the user talk page
+&$wikiPage: WikiPage (object) of the user talk page
+$recipient: User (object) who's talk page was edited
 
 'ArticleEditUpdates': When edit updates (mainly link tracking) are made when an
 article has been changed.
@@ -609,6 +623,7 @@ the user is redirected back to the page.
 
 'ArticleViewFooter': After showing the footer section of an ordinary page view
 $article: Article object
+$patrolFooterShown: boolean whether patrol footer is shown
 
 'ArticleViewHeader': Before the parser cache is about to be tried for article
 viewing.
@@ -747,8 +762,22 @@ $user: the user who did the block (not the one being blocked)
 $isbn: ISBN to show information for
 $output: OutputPage object in use
 
+'CanIPUseHTTPS': Determine whether the client at a given source IP is likely
+to be able to access the wiki via HTTPS.
+$ip: The IP address in human-readable form
+&$canDo: This reference should be set to false if the client may not be able 
+to use HTTPS
+
 'CanonicalNamespaces': For extensions adding their own namespaces or altering
 the defaults.
+Note that if you need to specify namespace protection or content model for
+a namespace that is added in a CanonicalNamespaces hook handler, you
+should do so by altering $wgNamespaceProtection and
+$wgNamespaceContentModels outside the handler, in top-level scope. The
+point at which the CanonicalNamespaces hook fires is too late for altering
+these variables. This applies even if the namespace addition is
+conditional; it is permissible to declare a content model and protection
+for a namespace and then decline to actually register it.
 &$namespaces: Array of namespace numbers with corresponding canonical names
 
 'CategoryAfterPageAdded': After a page is added to a category.
@@ -837,10 +866,6 @@ etc.
 'DatabaseOraclePostInit': Called after initialising an Oracle database
 &$db: the DatabaseOracle object
 
-'Debug': Called when outputting a debug log line via wfDebug() or wfDebugLog()
-$text: plaintext string to be output
-$group: null or a string naming a logging group (as defined in $wgDebugLogGroups)
-
 'NewDifferenceEngine': Called when a new DifferenceEngine object is made
 $title: the diff page title (nullable)
 &$oldId: the actual old Id to use in the diff
@@ -1008,14 +1033,6 @@ notice.
 $title: title of page being edited
 &$msg: localization message name, overridable. Default is 'editpage-tos-summary'
 
-'EditSectionLink': Do not use, use DoEditSectionLink instead.
-$skin: Skin rendering the UI
-$title: Title being linked to
-$section: Section to link to
-$link: Default link
-&$result: Result (alter this to override the generated links)
-$lang: The language code to use for the link in the wfMessage function
-
 'EmailConfirmed': When checking that the user's email address is "confirmed".
 $user: User being checked
 $confirmed: Whether or not the email address is confirmed
@@ -1060,6 +1077,7 @@ change the tables headers.
 
 'ExtractThumbParameters': Called when extracting thumbnail parameters from a
 thumbnail file name.
+DEPRECATED: Media handler should override MediaHandler::parseParamString instead.
 $thumbname: the base name of the thumbnail file
 &$params: the currently extracted params (has source name, temp or archived zone)
 
@@ -1106,6 +1124,12 @@ $reason: reason
  $title: An optional title object used to links to sections. Can be null.
  $local: Boolean indicating whether section links should refer to local page.
 
+'GalleryGetModes': Get list of classes that can render different modes of a
+ gallery
+$modeArray: An associative array mapping mode names to classes that implement
+ that mode. It is expected all registered classes are a subclass of
+ ImageGalleryBase.
+
 'GetAutoPromoteGroups': When determining which autopromote groups a user is
 entitled to be in.
 &$user: user to promote.
@@ -1138,6 +1162,15 @@ $title: Title object of page
 $url: string value as output (out parameter, can modify)
 $query: query options passed to Title::getFullURL()
 
+'GetHumanTimestamp': Pre-emptively override the human-readable timestamp generated
+by MWTimestamp::getHumanTimestamp(). Return false in this hook to use the custom
+output.
+&$output: string for the output timestamp
+$timestamp: MWTimestamp object of the current (user-adjusted) timestamp
+$relativeTo: MWTimestamp object of the relative (user-adjusted) timestamp
+$user: User whose preferences are being used to make timestamp
+$lang: Language that will be used to render the timestamp
+
 'GetInternalURL': Modify fully-qualified URLs used for squid cache purging.
 $title: Title object of page
 $url: string value as output (out parameter, can modify)
@@ -1178,10 +1211,28 @@ to do this unless they broke backwards compatibility with a previous version of
 the media handler metadata output.
 &$version: Array of version strings
 
+'GetNewMessagesAlert': Disable or modify the new messages alert
+&$newMessagesAlert: An empty string by default. If the user has new talk page
+messages, this should be populated with an alert message to that effect
+$newtalks: An empty array if the user has no new messages or an array containing
+links and revisions if there are new messages (See User::getNewMessageLinks)
+$user: The user object of the user who is loading the page
+$out: OutputPage object (to check what type of page the user is on)
+
 'GetPreferences': Modify user preferences.
 $user: User whose preferences are being modified.
 &$preferences: Preferences description array, to be fed to an HTMLForm object
 
+'GetRelativeTimestamp': Pre-emptively override the relative timestamp generated
+by MWTimestamp::getRelativeTimestamp(). Return false in this hook to use the custom
+output.
+&$output: string for the output timestamp
+&$diff: DateInterval representing the difference between the timestamps
+$timestamp: MWTimestamp object of the current (user-adjusted) timestamp
+$relativeTo: MWTimestamp object of the relative (user-adjusted) timestamp
+$user: User whose preferences are being used to make timestamp
+$lang: Language that will be used to render the timestamp
+
 'getUserPermissionsErrors': Add a permissions error when permissions errors are
 checked for. Use instead of userCan for most cases. Return false if the user
 can't do it, and populate $result with the reason in the form of
@@ -1340,6 +1391,10 @@ $article: article (object) being checked
 $ip: IP being check
 $result: Change this value to override the result of wfIsTrustedProxy()
 
+'IsUploadAllowedFromUrl': Override the result of UploadFromUrl::isAllowedUrl()
+$url: URL used to upload from
+&$allowed: Boolean indicating if uploading is allowed for given URL
+
 'isValidEmailAddr': Override the result of User::isValidEmailAddr(), for
 instance to return false if the domain name doesn't match your organization.
 $addr: The e-mail address entered by the user
@@ -1375,6 +1430,16 @@ $lang: language code (string)
 &$names: array of language code => language name
 $code language of the preferred translations
 
+'LanguageLinks': Manipulate a page's language links. This is called
+in various places to allow extensions to define the effective language
+links for a page.
+$title: The page's Title.
+&$links: Associative array mapping language codes to prefixed links of the
+  form "language:title".
+&$linkFlags: Associative array mapping prefixed links to arrays of flags.
+  Currently unused, but planned to provide support for marking individual
+  language links in the UI, e.g. for featured articles.
+
 'LinkBegin': Used when generating internal and interwiki links in
 Linker::link(), before processing starts.  Return false to skip default
 processing and return $ret. See documentation for Linker::link() for details on
@@ -1760,10 +1825,29 @@ cache or return false to not use it.
 $parser: Parser object
 $varCache: variable cache (array)
 
-'ParserLimitReport': Called at the end of Parser:parse() when the parser will
+'ParserLimitReport': DEPRECATED, use ParserLimitReportPrepare and
+ParserLimitReportFormat instead.
+Called at the end of Parser:parse() when the parser will
 include comments about size of the text parsed.
 $parser: Parser object
-$limitReport: text that will be included (without comment tags)
+&$limitReport: text that will be included (without comment tags)
+
+'ParserLimitReportFormat': Called for each row in the parser limit report that
+needs formatting. If nothing handles this hook, the default is to use "$key" to
+get the label, and "$key-value" or "$key-value-text"/"$key-value-html" to
+format the value.
+$key: Key for the limit report item (string)
+$value: Value of the limit report item
+&$report: String onto which to append the data
+$isHTML: If true, $report is an HTML table with two columns; if false, it's
+	text intended for display in a monospaced font.
+$localize: If false, $report should be output in English.
+
+'ParserLimitReportPrepare': Called at the end of Parser:parse() when the parser will
+include comments about size of the text parsed. Hooks should use
+$output->setLimitReportData() to populate data.
+$parser: Parser object
+$output: ParserOutput object
 
 'ParserMakeImageParams': Called before the parser make an image link, use this
 to modify the parameters of the image.
@@ -1783,7 +1867,7 @@ $section: the section number, zero-based, but section 0 is usually empty
 $showEditLinks: boolean describing whether this section has an edit link
 
 'ParserTestParser': Called when creating a new instance of Parser in
-maintenance/parserTests.inc.
+tests/parser/parserTest.inc.
 $parser: Parser object created
 
 'ParserTestGlobals': Allows to define globals for parser tests.
@@ -1806,6 +1890,7 @@ $action : Action being performed
 &$result : Whether or not the action should be prevented
 Change $result and return false to give a definitive answer, otherwise
 the built-in rate limiting checks are used, if enabled.
+$incrBy: Amount to increment counter by
 
 'PlaceNewSection': Override placement of new sections. Return false and put the
 merged text into $text to override the default behavior.
@@ -1843,9 +1928,10 @@ $article: the title being (un)protected
 $output: a string of the form HTML so far
 
 'ProtectionForm::save': Called when a protection form is submitted.
-$article: the title being (un)protected
-$errorMsg: an html message string of an error or an array of message name and
+$article: the Page being (un)protected
+&$errorMsg: an html message string of an error or an array of message name and
   its parameters
+$reasonstr: a string describing the reason page protection level is altered
 
 'ProtectionForm::showLogExtract': Called after the protection log extract is
 shown.
@@ -1871,6 +1957,10 @@ IContextSource $context: The RequestContext the skin is being created for.
 &$skin: A variable reference you may set a Skin instance or string key on to
   override the skin that will be used for the context.
 
+'ResetSessionID': Called from wfResetSessionID
+$oldSessionID: old session id
+$newSessionID: new session id
+
 'ResourceLoaderGetConfigVars': Called at the end of
 ResourceLoaderStartUpModule::getConfig(). Use this to export static
 configuration variables to JavaScript. Things that depend on the current page
@@ -1911,12 +2001,6 @@ $data: the data stored in old_text.  The meaning depends on $flags: if external
 $flags: a comma-delimited list of strings representing the options used.  May
   include: utf8 (this will always be set for new revisions); gzip; external.
 
-'SearchUpdate': Prior to search update completion.
-$id : Page id
-$namespace : Page namespace
-$title : Page title
-$text : Current text being indexed
-
 'SearchGetNearMatchBefore': Perform exact-title-matches in "go" searches before
 the normal operations.
 $allSearchTerms : Array of the search terms in all content languages
@@ -1952,8 +2036,6 @@ $title : Current Title object being displayed in search results.
 'SearchableNamespaces': An option to modify which namespaces are searchable.
 &$arr : Array of namespaces ($nsId => $name) which will be used.
 
-'SeleniumSettings': TODO
-
 'SetupAfterCache': Called in Setup.php, after cache objects are set
 
 'ShowMissingArticle': Called when generating the output for a non-existent page.
@@ -2078,8 +2160,6 @@ $checkEdit: Whether or not the action=edit query should be added if appropriate.
 &$text: Link text.
 &$result: Complete assoc. array if you want to return true.
 
-'SkinTemplateTabs': TODO
-
 'SkinTemplateToolboxEnd': Called by SkinTemplate skins after toolbox links have
 been rendered (useful for adding more).
 $sk: The QuickTemplate based skin template running the hook.
@@ -2191,6 +2271,11 @@ $opts: FormOptions for this request
 &$query_options: array of options for the database request
 &$select: Array of columns to select
 
+'SpecialResetTokensTokens': Called when building token list for
+SpecialResetTokens.
+&$tokens: array of token information arrays in the format of
+  array( 'preference' => '<preference-name>', 'label-message' => '<message-key>' )
+
 'SpecialSearchCreateLink': Called when making the message to create a page or
 go to the existing page.
 $t: title object searched for
@@ -2280,6 +2365,11 @@ $special: the special page object
 &$fields: array of query fields
 $values: array of variables with watchlist options
 
+'SpecialWatchlistGetNonRevisionTypes': Called when building sql query for
+SpecialWatchlist. Allows extensions to register custom values they have 
+inserted to rc_type so they can be returned as part of the watchlist.
+&$nonRevisionTypes: array of values in the rc_type field of recentchanges table
+
 'TestCanonicalRedirect': Called when about to force a redirect to a canonical
 URL for a title when we have no other parameters on the URL. Gives a chance for
 extensions that alter page view behavior radically to abort that redirect or
@@ -2299,6 +2389,20 @@ database result.
 &$titleArray: set this to an object to override the default object returned
 $res: database result used to create the object
 
+'TitleQuickPermissions': Called from Title::checkQuickPermissions to add to
+or override the quick permissions check.
+$title: The Title object being accessed
+$user: The User performing the action
+$action: Action being performed
+&$errors: Array of errors
+$doExpensiveQueries: Whether to do expensive DB queries
+$short: Whether to return immediately on first error
+
+'TitleGetEditNotices': Allows extensions to add edit notices
+$title: The Title object for the page the edit notices are for
+$oldid: Revision ID that the edit notices are for (or 0 for latest)
+&$notices: Array of notices. Keys are i18n message keys, values are parseAsBlock()ed messages.
+
 'TitleGetRestrictionTypes': Allows extensions to modify the types of protection
 that can be applied.
 $title: The title in question.
@@ -2332,6 +2436,11 @@ $result: Boolean; whether MediaWiki currently thinks this is a wikitext page.
   Hooks may change this value to override the return value of
   Title::isWikitextPage()
 
+'TitleMove': Before moving an article (title).
+$old: old title
+$nt: new title
+$user: user who does the move
+
 'TitleMoveComplete': After moving an article (title).
 $old: old title
 $nt: new title
@@ -2346,6 +2455,10 @@ $title: Title object being checked against
 $user: Current user object
 &$whitelisted: Boolean value of whether this title is whitelisted
 
+'TitleSquidURLs': Called to determine which URLs to purge from HTTP caches.
+$this: Title object to purge
+&$urls: An array of URLs to purge from the caches, to be manipulated.
+
 'UndeleteForm::showHistory': Called in UndeleteForm::showHistory, after a
 PageArchive object has been created but before any further processing is done.
 &$archive: PageArchive object
@@ -2378,6 +2491,7 @@ $article: article "acted on"
 'UnwatchArticle': Before a watch is removed from an article.
 $user: user watching
 $page: WikiPage object to be removed
+&$status: Status object to be returned if the hook returns false
 
 'UnwatchArticleComplete': After a watch is removed from an article.
 $user: user that watched
@@ -2538,6 +2652,10 @@ $title: Title of the page in question
 $ip: User's IP address
 &$blocked: Whether the user is blocked, to be modified by the hook
 
+'UserIsEveryoneAllowed': Check if all users are allowed some user right; return
+false if a UserGetRights hook might remove the named right.
+$right: The user right being checked
+
 'UserLoadAfterLoadFromSession': Called to authenticate users on external or
 environmental means; occurs after session is loaded.
 $user: user object being loaded
@@ -2586,6 +2704,12 @@ $user  : User object that was changed
 $add   : Array of strings corresponding to groups added
 $remove: Array of strings corresponding to groups removed
 
+'UserRequiresHTTPS': Called to determine whether a user needs
+to be switched to HTTPS.
+$user: User in question.
+&$https: Boolean whether $user should be switched to HTTPS.
+
+
 'UserRetrieveNewTalks': Called when retrieving "You have new messages!"
 message(s).
 $user: user retrieving new talks messages
@@ -2627,6 +2751,7 @@ used to alter the SQL query which gets the list of wanted pages.
 'WatchArticle': Before a watch is added to an article.
 $user: user that will watch
 $page: WikiPage object to be watched
+&$status: Status object to be returned if the hook returns false
 
 'WatchArticleComplete': After a watch is added to an article.
 $user: user that watched
@@ -2643,6 +2768,13 @@ $skin: Skin object
 REQUEST_URI.
 $router: The PathRouter instance
 
+'WebResponseSetCookie': when setting a cookie in WebResponse::setcookie().
+Return false to prevent setting of the cookie.
+&$name: Cookie name passed to WebResponse::setcookie()
+&$value: Cookie value passed to WebResponse::setcookie()
+&$expire: Cookie expiration, as for PHP's setcookie()
+$options: Options passed to WebResponse::setcookie()
+
 'WikiExporter::dumpStableQuery': Get the SELECT query for "stable" revisions
 dumps. One, and only one hook should set this, and return false.
 &$tables: Database tables to use in the SELECT query
diff --git a/docs/maintenance.txt b/docs/maintenance.txt
index 27619c86..87a32a80 100644
--- a/docs/maintenance.txt
+++ b/docs/maintenance.txt
@@ -34,7 +34,7 @@ In it, write the following:
 
 <?php
 
-require_once( "Maintenance.php" );
+require_once 'Maintenance.php';
 
 class DemoMaint extends Maintenance {
 
@@ -47,7 +47,7 @@ class DemoMaint extends Maintenance {
 }
 
 $maintClass = "DemoMaint";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
 
 ==END==
 
diff --git a/docs/php-memcached/Documentation b/docs/php-memcached/Documentation
index c9056053..32e340ac 100644
--- a/docs/php-memcached/Documentation
+++ b/docs/php-memcached/Documentation
@@ -163,7 +163,7 @@ MemCacheClient::set_compression($setting)
 
 EXAMPLE:
 <?php
-require("MemCachedClient.inc.php");
+require 'MemCachedClient.inc.php';
 
 // set the servers, with the last one having an integer weight value of 3
 $options["servers"] = array("10.0.0.15:11000","10.0.0.16:11001",array("10.0.0.17:11002", 3));
diff --git a/docs/scripts.txt b/docs/scripts.txt
index 4af2a2b4..0b8ee8f6 100644
--- a/docs/scripts.txt
+++ b/docs/scripts.txt
@@ -42,21 +42,11 @@ Primary scripts:
     and $wgDBadminpassword in your LocalSettings.php, as well as $wgEnableProfileInfo 
     See also http://www.mediawiki.org/wiki/How_to_debug#Profiling.
 
-  redirect.php
-    Script that only redirect to the article passed in the wpDropdown parameter
-    of the request. Used by the nostalgia skin to access special pages with the
-    dropdown box at the top of the page.
-
   thumb.php
     Script used to resize images if it is configured to be done when the web
     browser requests the image and not when generating the page. This script can
     be used as a 404 handler to generate image thumbs when they don't exist.
 
-  trackback.php
-    Allow to add a new trackback to the database. This script returns XML
-    and require a POST request to work, thus it should only be accessed by some
-    specific programs and won't work with normal web browsers.
-
 There is also a file with a .php5 extension for each script. They can be used if
 the web server needs a .php5 to run the file with the PHP 5 engine and runs .php
 scripts with PHP 4. To use these files, you have to modify $wgScriptExtension to
diff --git a/docs/skin.txt b/docs/skin.txt
index fab27b87..1459d7af 100644
--- a/docs/skin.txt
+++ b/docs/skin.txt
@@ -1,57 +1,59 @@
 skin.txt
 
-MediaWiki's default skin is called Vector. Vector was introduced in
-the 1.16 release (2010) and has been set as the default in MediaWiki since
-the 1.17 release (2011). This replaced the popular skin, Monobook which
-had been been the default since MediaWiki 1.3 (2004). Vector is now the
-default skin on Wikimedia Projects.
+MediaWiki includes four core skins:
 
-There are three legacy skins which were introduced before MediaWiki 1.3:
+* Vector: The default skin. Introduced in the 1.16 release (2010), it has been
+  set as the default in MediaWiki since the 1.17 release (2011), replacing
+  Monobook.
 
-* Standard (a.k.a. Classic): The old default skin written by Lee Crocker 
-during the phase 3 rewrite, in 2002.
+* Monobook: Named after the black-and-white photo of a book in the page
+  background. Introduced in the 2004 release of 1.3, it had been been the
+  default skin since then, before being replaced by Vector.
 
-* Nostalgia: A skin which looks like Wikipedia did in its first year (2001). 
-This skin is now used for the old Wikipedia snapshot at
-http://nostalgia.wikipedia.org/
+* Modern: An attractive blue/grey theme with sidebar and top bar. Derived from
+  Monobook.
 
-* Cologne Blue: A nicer-looking alternative to Standard.
+* Cologne Blue: A lightweight skin with minimal formatting. The oldest of the
+  currently bundled skins, largely rewritten in 2012 while keeping its
+  appearance.
 
-The other skin that is widely used (and is the MediaWiki default before 1.17)
-is Monobook.
 
-* Monobook: Named after the black-and-white photo of a book, in the page background.
-This was introduced in the 2004 release of 1.3
+Several legacy skins were removed in the 1.22 release, as the burden of
+supporting them became too heavy to bear. Those were:
 
-And there are four Monobook-derived skins which have been introduced since 1.3:
+* Standard (a.k.a. Classic): The old default skin written by Lee Crocker during
+  the phase 3 rewrite, in 2002.
 
-* MySkin: Monobook without the CSS. The idea is that you customise it using user
-or site CSS (see below)
+* Nostalgia: A skin which looks like Wikipedia did in its first year (2001).
+  This skin is now used for the old Wikipedia snapshot at
+  http://nostalgia.wikipedia.org/
 
-* Chick: A lightweight Monobook skin with no sidebar, the sidebar links are
-given at the bottom of the page instead, as in the unstyled MySkin.
+* Chick: A lightweight Monobook skin with no sidebar. The sidebar links were
+  given at the bottom of the page instead.
 
-* Simple: A lightweight skin with a simple white-background sidebar and no
-top bar.
+* Simple: A lightweight skin with a simple white-background sidebar and no top
+  bar.
+
+* MySkin: Essentially Monobook without the CSS. The idea was that it could be
+  customised using user-specific or site-wide CSS (see below).
 
-* Modern: An attractive blue/grey theme with sidebar and top bar.
 
 == Custom CSS/JS ==
 
 It is possible to customise the site CSS and JavaScript without editing any
-source files. This is done by editing some pages on the wiki:
+server-side source files. This is done by editing some pages on the wiki:
 
 * [[MediaWiki:Common.css]] -- for skin-independent CSS
-* [[MediaWiki:Monobook.css]], [[MediaWiki:Simple.css]], etc. -- for
-skin-dependent CSS
-* [[MediaWiki:Common.js]], [[MediaWiki:Monobook.js]], etc. -- for custom
-site JavaScript
+* [[MediaWiki:Common.js]] -- for skin-independent JavaScript
+* [[MediaWiki:Vector.css]], [[MediaWiki:Monobook.css]], etc. -- for
+  skin-dependent CSS
+* [[MediaWiki:Vector.js]], [[MediaWiki:Monobook.js]], etc. -- for
+  skin-dependent JavaScript
 
 These can also be customised on a per-user basis, by editing
-[[User:<name>/monobook.css]], [[User:<name>/monobook.js]], etc.
+[[User:<name>/vector.css]], [[User:<name>/vector.js]], etc.
 
-This feature has led to a wide variety of "user styles" becoming available,
-which change the appearance of Monobook or MySkin:
+This feature has led to a wide variety of "user styles" becoming available:
 
 http://www.mediawiki.org/wiki/Manual:Gallery_of_user_styles
 
@@ -72,7 +74,7 @@ $wgSkipSkins[] = '<name>';
 
 This technique is used by the more ambitious MediaWiki site operators, to 
 create complex custom skins for their wikis. It should be preferred over 
-editing the core Monobook skin directly. 
+editing the core Monobook skin directly.
 
 See http://www.mediawiki.org/wiki/Manual:Skinning for more information.
 
diff --git a/docs/title.txt b/docs/title.txt
index d2d91c9c..454711dc 100644
--- a/docs/title.txt
+++ b/docs/title.txt
@@ -8,7 +8,7 @@ and can be queried for the others, and for other attributes of the title. This
 is intended to be an immutable "value" class, so there are no mutator functions.
 
 To get a new instance, call Title::newFromText(). Once instantiated, the
-non-static accessor methods can be used, such as getText(), getDBKey(),
+non-static accessor methods can be used, such as getText(), getDBkey(),
 getNamespace(), etc. Note that Title::newFromText() may return false if the text
 is illegal according to the rules below.
 
@@ -36,11 +36,11 @@ An initial colon in a title listed in wiki text may however suppress special
 handling for interlanguage links, image links, and category links. It is also
 used to indicate the main namespace in template inclusions.
 
-Once prefixes have been stripped, the rest of the title processed this way: 
+Once prefixes have been stripped, the rest of the title processed this way:
 
 * Spaces and underscores are treated as equivalent and each  is converted to the
   other in the appropriate context (underscore in URL and database keys, spaces
-  in plain text). 
+  in plain text).
 * Multiple consecutive spaces are converted to a single space.
 * Leading or trailing space is removed.
 * If $wgCapitalLinks is enabled (the default), the first letter is  capitalised,
@@ -58,7 +58,7 @@ UTF-8, because that is the size of the database field. Special page titles may
 be up to 512 bytes.
 
 Note that Unicode Normal Form C (NFC) is enforced by MediaWiki's user interface
-input functions, and so titles will typically be in this form. 
+input functions, and so titles will typically be in this form.
 
 getArticleID() needs some explanation: for "internal" articles, it should return
 the "page_id" field if the article exists, else it returns 0. For all external
diff --git a/docs/uidesign/child-selector-emu.html b/docs/uidesign/child-selector-emu.html
index 8294b6d7..dedb3a67 100644
--- a/docs/uidesign/child-selector-emu.html
+++ b/docs/uidesign/child-selector-emu.html
@@ -2,7 +2,7 @@
 <html>
 <head>
 	<title>CSS Child selector emulation for IE 6</title>
-	<style type="text/css">
+	<style>
 		/** Common rules **/
 		body  { background-color: #CCC; }
 		table { border:1px black solid; }
@@ -98,4 +98,3 @@ With child selector we could limit the wikitable styling to the direct childs of
 </tr>
 </table>
 <p><strong>NOTE:</strong>The nested caption keep the green background. The nested table keep the black border. This is because those declarations are global so we did not reset them.</p>
-
diff --git a/docs/uidesign/design.html b/docs/uidesign/design.html
index 7062a826..a285a5b2 100644
--- a/docs/uidesign/design.html
+++ b/docs/uidesign/design.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
-<html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
+<html lang="en" dir="ltr">
 <head>
-	<link rel="stylesheet" href="../../skins/common/shared.css" />
+	<link rel="stylesheet" href="../../skins/common/shared.css">
 </head>
 <body style="font-size: small;">
 
@@ -31,4 +31,5 @@
 		<tr><td>line with hover</td><td>line with hover</td></tr>
 	</table>
 
-</body></html>
+</body>
+</html>
diff --git a/docs/uidesign/mediawiki.action.history.diff.html b/docs/uidesign/mediawiki.action.history.diff.html
index 7b8eb2a0..5edcfb86 100644
--- a/docs/uidesign/mediawiki.action.history.diff.html
+++ b/docs/uidesign/mediawiki.action.history.diff.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
-<html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
+<html lang="en" dir="ltr">
 <head>
-	<link rel="stylesheet" href="../../resources/mediawiki.action/mediawiki.action.history.diff.css" />
+	<link rel="stylesheet" href="../../resources/mediawiki.action/mediawiki.action.history.diff.css">
 </head>
 <body style="background-color: #C0C0C0;">
 <p>
@@ -54,4 +54,5 @@ Below are some basic lines being applied one or two classes. Mainly for debuggin
 	</td></tr>
 </table>
 
-</body></html>
+</body>
+</html>
diff --git a/docs/uidesign/monospace.html b/docs/uidesign/monospace.html
index 84ec13a4..f2b988e2 100644
--- a/docs/uidesign/monospace.html
+++ b/docs/uidesign/monospace.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
-<html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
+<html lang="en" dir="ltr">
 <head>
-	<style type="text/css">
+	<style>
 		pre {
 			border: 1px dashed #AAA;
 			background-color: #E0E0E0;
@@ -75,4 +75,3 @@ font-family: monospace, Verdana;
 font-family: monospace, DOESNOTEXISTREALLY;'>
 font-family: monospace, DOESNOTEXISTREALLY;
 </pre>
-
diff --git a/docs/uidesign/table-layout.html b/docs/uidesign/table-layout.html
index 6f538258..2c268199 100644
--- a/docs/uidesign/table-layout.html
+++ b/docs/uidesign/table-layout.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html>
 <head>
-	<style type="text/css">
+	<style>
 		/** This is just for coloring: */
 		table { border: 1px solid #CC0; }
 		td { border: 1px solid  #CCC; }
@@ -57,4 +57,3 @@ On a perfect browser, both tables should look the same</p>
 	</tr>
 </table>
 </div>
-
diff --git a/docs/upload.txt b/docs/upload.txt
deleted file mode 100644
index a0f0a594..00000000
--- a/docs/upload.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-This document describes how the current uploading system is build up and how
-custom backends can be built. (At least someday it will).
diff --git a/extensions/Cite/.jshintignore b/extensions/Cite/.jshintignore
new file mode 100644
index 00000000..df46ab97
--- /dev/null
+++ b/extensions/Cite/.jshintignore
@@ -0,0 +1 @@
+modules/jquery.tooltip/jquery.tooltip.js
diff --git a/extensions/Cite/.jshintrc b/extensions/Cite/.jshintrc
new file mode 100644
index 00000000..4b356f81
--- /dev/null
+++ b/extensions/Cite/.jshintrc
@@ -0,0 +1,34 @@
+{
+	"camelcase": true,
+	"curly": true,
+	"eqeqeq": true,
+	"immed": true,
+	"latedef": true,
+	"newcap": true,
+	"supernew": true,
+	"shadow": true,
+	"noarg": true,
+	"noempty": true,
+	"nonew": true,
+	"quotmark": false, // sometimes double quotes make sense, e.g. "foo's" is better readable than 'foo\'s'
+	"trailing": true,
+	"undef": true,
+	"unused": "vars", // we want to allow unused function parameters
+	"laxbreak": true,
+	"laxcomma": false,
+	"onevar": false,
+	"bitwise": false,
+	"forin": false,
+	"regexp": false,
+	"strict": true,
+	"scripturl": true,
+
+	// Environment
+	"browser": true,
+
+	// Globals
+	"predef": [
+		"jQuery",
+		"mediaWiki"
+	]
+}
diff --git a/extensions/Cite/Cite.i18n.php b/extensions/Cite/Cite.i18n.php
index 34dc86cd..2dc51f42 100644
--- a/extensions/Cite/Cite.i18n.php
+++ b/extensions/Cite/Cite.i18n.php
@@ -13,16 +13,6 @@ $messages['en'] = array(
 	/*
 		Debug and errors
 	*/
-	# Internal errors
-	'cite_croak'                     => 'Cite died; $1: $2',
-	'cite_error_key_str_invalid'     => 'Internal error;
-invalid $str and/or $key.
-This should never occur.',
-	'cite_error_stack_invalid_input' => 'Internal error;
-invalid stack key.
-This should never occur.',
-
-	# User errors
 	'cite_error'                                     => 'Cite error: $1',
 	'cite_error_ref_numeric_key'                     => 'Invalid <code>&lt;ref&gt;</code> tag;
 name cannot be a simple integer. Use a descriptive title',
@@ -46,7 +36,7 @@ Define more in the <nowiki>[[MediaWiki:$2]]</nowiki> message.',
 no text was provided for refs named <code>$1</code>',
 	'cite_error_included_ref'                        => 'Closing <code>&lt;/ref&gt;</code> missing for <code>&lt;ref&gt;</code> tag',
 	'cite_error_refs_without_references'             => '<code>&lt;ref&gt;</code> tags exist, but no <code>&lt;references/&gt;</code> tag was found',
-	'cite_error_group_refs_without_references'       => '<code>&lt;ref&gt;</code> tags exist for a group named "$1", but no corresponding <code>&lt;references group="$1"/&gt;</code> tag was found',
+	'cite_error_group_refs_without_references'       => '<code>&lt;ref&gt;</code> tags exist for a group named "$1", but no corresponding <code>&lt;references group="$1"/&gt;</code> tag was found, or a closing <code>&lt;/ref&gt;</code> is missing',
 	'cite_error_references_group_mismatch'           => '<code>&lt;ref&gt;</code> tag in <code>&lt;references&gt;</code> has conflicting group attribute "$1".',
 	'cite_error_references_missing_group'            => '<code>&lt;ref&gt;</code> tag defined in <code>&lt;references&gt;</code> has group attribute "$1" which does not appear in prior text.',
 	'cite_error_references_missing_key'              => '<code>&lt;ref&gt;</code> tag with name "$1" defined in <code>&lt;references&gt;</code> is not used in prior text.',
@@ -73,6 +63,8 @@ no text was provided for refs named <code>$1</code>',
 	'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
 	'cite_references_link_many_sep'                    => "&#32;",
 	'cite_references_link_many_and'                    => "&#32;",
+	'cite_references_link_accessibility_label'         => 'Jump up',
+	'cite_references_link_many_accessibility_label'    => 'Jump up to:',
 
 	# Although I could just use # instead of <li> above and nothing here that
 	# will break on input that contains linebreaks
@@ -96,29 +88,28 @@ no text was provided for refs named <code>$1</code>',
  */
 $messages['qqq'] = array(
 	'cite-desc' => '{{desc|name=Cite|url=http://www.mediawiki.org/wiki/Extension:Cite}}',
-	'cite_croak' => 'Used as an error message. Parameters:
-* $1 - error message. any one of the following messages:
-** {{msg-mw|Cite_error_key_str_invalid}}
-** {{msg-mw|Cite_error_stack_invalid_input}}
-* $2 - serialized error data',
-	'cite_error_key_str_invalid' => 'Used as <code>$1</code> in {{msg-mw|Cite croak}}.
-
-<code>$str</code> and <code>$key</code> are literals, and refer to who knows which variables the code uses.',
-	'cite_error_stack_invalid_input' => 'Used as <code>$1</code> in {{msg-mw|Cite croak}}.',
-	'cite_error' => 'Cite extension. This is used when there are errors in ref or references tags. The parameter $1 is an error message.',
-	'cite_error_ref_numeric_key' => 'Cite extension. Error message shown if the name of a ref tag only contains digits. Examples that cause this error are <code>&lt;ref name="123" /&gt;</code> or <code>&lt;ref name="456"&gt;input&lt;/ref&gt;</code>',
-	'cite_error_ref_no_key' => 'Cite extension. Error message shown when ref tags without any content (that is <code>&lt;ref/&gt;</code>) are used without a name.',
-	'cite_error_ref_too_many_keys' => 'Cite extension. Error message shown when ref tags has parameters other than name and group. Examples that cause this error are <code>&lt;ref name="name" notname="value" /&gt;</code> or <code>&lt;ref notname="value" &gt;input&lt;ref&gt;</code>',
-	'cite_error_ref_no_input' => 'Cite extension. Error message shown when ref tags without names have no content. An example that cause this error is <code>&lt;ref&gt;&lt;/ref&gt;</code>',
-	'cite_error_references_invalid_parameters' => 'Cite extension. Error message shown when parmeters are used in the references tag. An example that cause this error is <code>&lt;references someparameter="value" /&gt;</code>',
+	'cite_error' => 'Cite extension.
+
+Used when there are errors in ref or references tags.
+
+Parameters:
+* $1 - an error message',
+	'cite_error_ref_numeric_key' => 'Cite extension. Error message shown if the name of a ref tag only contains digits. Examples that cause this error are <code><nowiki><ref name="123" /></nowiki></code> or <code><nowiki><ref name="456">input</ref></nowiki></code>',
+	'cite_error_ref_no_key' => 'Cite extension. Error message shown when ref tags without any content (that is <code><nowiki><ref /></nowiki></code>) are used without a name.',
+	'cite_error_ref_too_many_keys' => 'Cite extension. Error message shown when ref tags has parameters other than name and group. Examples that cause this error are <code><nowiki><ref name="name" notname="value" /></nowiki></code> or <code><nowiki><ref notname="value" >input<ref></nowiki></code>',
+	'cite_error_ref_no_input' => 'Cite extension. Error message shown when ref tags without names have no content. An example that cause this error is <code><nowiki><ref></ref></nowiki></code>',
+	'cite_error_references_invalid_parameters' => 'Cite extension. Error message shown when parmeters are used in the references tag. An example that cause this error is <code><nowiki><references someparameter="value" /></nowiki></code>',
 	'cite_error_references_invalid_parameters_group' => 'Cite extension. Error message shown when unknown parameters are used in the references tag. An example that cause this error is <samp><nowiki><references someparameter="value" /></nowiki></samp>',
 	'cite_error_references_no_backlink_label' => 'Cite extension. Error message shown in the references tag when the same name is used for too many ref tags. Too many in this case is more than there are backlink labels defined in [[MediaWiki:Cite references link many format backlink labels]].
 
 It is not possible to make a clickable link to this message. "nowiki" is mandatory around [[MediaWiki:Cite references link many format backlink labels]].',
 	'cite_error_no_link_label_group' => "*'''$1''' is the name of a reference group.
 *'''$2''' is <code>cite_link_label_group-<i>groupname</i></code>.",
-	'cite_error_references_no_text' => 'Cite extension. This error occurs when the tag <code>&lt;ref name="something" /&gt;</code> is used with the name-option specified and no other tag specifies a cite-text for this name.',
-	'cite_error_included_ref' => 'Error message shown if the <code>&lt;ref&gt;</code> tag is unbalanced, that means a <code>&lt;ref&gt;</code> is not followed by a <code>&lt;/ref&gt;</code>',
+	'cite_error_references_no_text' => 'Cite extension. This error occurs when the tag <code><nowiki><ref name="something" /></nowiki></code> is used with the name-option specified and no other tag specifies a cite-text for this name.
+
+Parameters:
+* $1 - key of the ref',
+	'cite_error_included_ref' => 'Error message shown if the <code><nowiki><ref></nowiki></code> tag is unbalanced, that means a <code><nowiki><ref></nowiki></code> is not followed by a <code><nowiki></ref></nowiki></code>',
 	'cite_error_refs_without_references' => 'See also:
 * {{msg-mw|Cite error group refs without references}}',
 	'cite_error_group_refs_without_references' => 'Parameters:
@@ -127,59 +118,88 @@ It is not possible to make a clickable link to this message. "nowiki" is mandato
 If the group $1 is default group, instead of this message, the following message will be used:
 * {{msg-mw|Cite error refs without references}}',
 	'cite_error_references_group_mismatch' => 'Error message shown when doing something like
-
 <pre>
 <references group="foo">
 <ref group="bar">...</ref>
 </references>
 </pre>
-
-The <code>$1</code> is the value of the <code>group</code> attribute on the inner <code>&lt;ref&gt;</code> (in the example above, “bar”).',
+Parameters:
+* $1 - the value of the <code>group</code> attribute on the inner <code><nowiki><ref></nowiki></code> (in the example above, “bar”)',
 	'cite_error_references_missing_group' => 'Error message shown when doing something like
-
 <pre>
 <references group="foo">
 <ref>...</ref>
 </references>
 </pre>
+and there are no <code><nowiki><ref></nowiki></code> tags in the page text which would use <code>group="foo"</code>.
 
-and there are no <code>&lt;ref&gt;</code> tags in the page text which would use <code>group="foo"</code>.
-
-The <code>$1</code> is the name of the unused <code>group</code> (in the example above, “foo”).',
+Parameters:
+* $1 - the name of the unused <code>group</code> (in the example above, “foo”)',
 	'cite_error_references_missing_key' => 'Error message shown when using something like
-
 <pre>
 <references>
 <ref name="refname">...</ref>
 </references>
 </pre>
+and the reference <code><nowiki><ref name="refname" /></nowiki></code> is not used anywhere in the page text.
 
-and the reference <code>&lt;ref name="refname" /&gt;</code> is not used anywhere in the page text.
-
-The <code>$1</code> parameter contains the name of the unused reference (in the example above, “refname”).',
-	'cite_error_references_no_key' => 'Error message shown when a <code>&lt;ref&gt;</code> inside <code>&lt;references&gt;</code> does not have a <code>name</code> attribute.',
-	'cite_error_empty_references_define' => 'Error message shown when there is a <code><ref></code> inside <code><references></code>, but it does not have any content, e.g.
-
+Parameters:
+* $1 - the name of the unused reference (in the example above, “refname”)',
+	'cite_error_references_no_key' => 'Error message shown when a <code><nowiki><ref></nowiki></code> inside <code><nowiki><references></nowiki></code> does not have a <code>name</code> attribute.',
+	'cite_error_empty_references_define' => 'Error message shown when there is a <code><nowiki><ref></nowiki></code> inside <code><nowiki><references></nowiki></code>, but it does not have any content, e.g.
 <pre>
 <references>
 <ref name="foo" />
 </references>
 </pre>
 
-<code>$1</code> contains the <code>name</code> of the erroneous <code>&lt;ref&gt;</code> (in the above example, “foo”).',
-	'cite_reference_link_key_with_num' => '{{optional}}',
+Parameters:
+* $1 - the <code><nowiki>name</nowiki></code> of the erroneous <code><nowiki><ref></nowiki></code> (in the above example, “foo”)',
+	'cite_reference_link_key_with_num' => '{{optional}}
+Parameters:
+* $1 - the key
+* $2 - the number of the key',
 	'cite_reference_link_prefix' => '{{optional}}',
 	'cite_reference_link_suffix' => '{{optional}}',
 	'cite_references_link_prefix' => '{{optional}}',
 	'cite_references_link_suffix' => '{{optional}}',
-	'cite_reference_link' => '{{optional}}',
-	'cite_references_no_link' => '{{notranslate}}',
-	'cite_references_link_one' => '{{optional}}',
-	'cite_references_link_many' => '{{optional}}',
-	'cite_references_link_many_format' => '{{optional}}',
+	'cite_reference_link' => '{{optional}}
+Parameters:
+* $1 - ref key
+* $2 - references key
+* $3 - link label',
+	'cite_references_no_link' => '{{notranslate}}
+Parameters:
+* $1 - references key
+* $2 - reference text',
+	'cite_references_link_one' => '{{optional}}
+Parameters:
+* $1 - references key
+* $2 - ref key
+* $3 - reference text',
+	'cite_references_link_many' => '{{optional}}
+Parameters:
+* $1 - references key
+* $2 - list of links
+* $3 - reference text',
+	'cite_references_link_many_format' => '{{optional}}
+Parameters:
+* $1 - ref key
+* $2 - ...
+* $3 - (Unused)...',
 	'cite_references_link_many_format_backlink_labels' => '{{Optional}}',
 	'cite_references_link_many_sep' => '{{optional}}',
 	'cite_references_link_many_and' => '{{optional}}',
+	'cite_references_link_accessibility_label' => 'Text for screen readers to describe the jump to citation link ("↑").
+
+See also:
+* {{msg-mw|Cite references link many accessibility label}} - if the citation is used multiple times',
+	'cite_references_link_many_accessibility_label' => 'Text for screen readers to describe the jump to citation links (a b c ...) for citations which are used in multiple places.
+
+This is going to be prepended to the first link, the following ones will just be read by screen readers as they are visible.
+
+See also:
+* {{msg-mw|Cite references link accessibility label}} - if the citation is used one time',
 	'cite_references_prefix' => '{{notranslate}}',
 	'cite_references_suffix' => '{{notranslate}}',
 );
@@ -189,13 +209,6 @@ The <code>$1</code> parameter contains the name of the unused reference (in the
  */
 $messages['af'] = array(
 	'cite-desc' => 'Maak <nowiki><ref[ name=id]></nowiki> en <nowiki><references/></nowiki> etikette beskikbaar vir sitasie.',
-	'cite_croak' => 'Probleem met Cite; $1: $2',
-	'cite_error_key_str_invalid' => 'Interne fout;
-ongeldige $str en/of $key.
-Dit behoort nie te gebeur nie.',
-	'cite_error_stack_invalid_input' => 'Interne fout;
-ongeldige "stack key".
-Dit behoort nie te gebeur nie.',
 	'cite_error' => 'Citefout: $1',
 	'cite_error_ref_numeric_key' => "Ongeldige etiket <code>&lt;ref&gt;</code>;
 die naam kan nie 'n eenvoudige heelgetal wees nie.
@@ -211,9 +224,6 @@ ongeldige name, byvoorbeeld te veel',
  */
 $messages['an'] = array(
 	'cite-desc' => 'Adibe as etiquetas <nowiki><ref[ name=id]></nowiki> y <nowiki><references/></nowiki> ta fer citas',
-	'cite_croak' => 'Cita corrompita; $1: $2',
-	'cite_error_key_str_invalid' => 'Error interna; $str y/u $key no conforme(s). Isto no habría d\'escaicer nunca.',
-	'cite_error_stack_invalid_input' => "Error interna; clau de pila no conforme. Isto no habría d'escaicer nunca.",
 	'cite_error' => 'Error en a cita: $1',
 	'cite_error_ref_numeric_key' => "Etiqueta <code>&lt;ref&gt;</code> incorreuta; o nombre d'a etiqueta no puede estar un numero entero, faiga servir un títol descriptivo",
 	'cite_error_ref_no_key' => 'Etiqueta <code>&lt;ref&gt;</code> incorreuta; as referencias sin de conteniu han de tener un nombre',
@@ -229,7 +239,7 @@ Defina-ne mas en o mensache <nowiki>[[MediaWiki:$2]]</nowiki>.',
 	'cite_error_references_no_text' => "Etiqueta <code>&lt;ref&gt;</code> incorreuta; no ha escrito garra testo t'as referencias nombratas <code>$1</code>",
 	'cite_error_included_ref' => 'Zarrando <code>&lt;/ref&gt;</code> falta una etiqueta <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code>, pero no se trobó garra etiqueta <code>&lt;references /&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code> ta un grupo clamau "$1", pero no se trobó garra etiqueta <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code> ta un grupo clamau "$1", pero no se trobó garra etiqueta <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
 	'cite_error_references_group_mismatch' => 'O tag <code>&lt;ref&gt;</code> en <code>&lt;references&gt;</code> presienta l\'atributo de grupo en conflicto "$1".',
 	'cite_error_references_missing_group' => 'O tag <code>&lt;ref&gt;</code> definiu en <code>&lt;references&gt;</code> incluye l\'atributo "$1" no declarau en o texto precedente.',
 	'cite_error_references_missing_key' => 'O tag <code>&lt;ref&gt;</code> con nombre "$1" definiu en <code>&lt;references&gt;</code> no s\'emplega en o texto precedente.',
@@ -241,16 +251,10 @@ Defina-ne mas en o mensache <nowiki>[[MediaWiki:$2]]</nowiki>.',
  * @author Aiman titi
  * @author Meno25
  * @author OsamaK
+ * @author زكريا
  */
 $messages['ar'] = array(
 	'cite-desc' => 'يضيف وسوم <nowiki><ref[ name=id]></nowiki> و <nowiki><references/></nowiki> ، للاستشهادات',
-	'cite_croak' => 'الاستشهاد مات؛ $1: $2',
-	'cite_error_key_str_invalid' => 'خطأ داخلي؛
-$str و/أو $key غير صحيح.
-هذا لا يجب أن يحدث أبدا.',
-	'cite_error_stack_invalid_input' => 'خطأ داخلي؛
-مفتاح ستاك غير صحيح.
-هذا لا يجب أن يحدث أبدا.',
 	'cite_error' => 'خطأ استشهاد: $1',
 	'cite_error_ref_numeric_key' => 'وسم <code>&lt;ref&gt;</code> غير صحيح؛
 الاسم لا يمكن أن يكون عددا صحيحا بسيطا. استخدم عنوانا وصفيا',
@@ -275,12 +279,13 @@ $str و/أو $key غير صحيح.
 لا نص تم توفيره للمراجع المسماة <code>$1</code>',
 	'cite_error_included_ref' => 'إغلاق <code>&lt;/ref&gt;</code> مفقود لوسم <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'وسم <code>&lt;ref&gt;</code> موجود، لكن لا وسم <code>&lt;references/&gt;</code> تم العثور عليه',
-	'cite_error_group_refs_without_references' => 'وسوم <code>&lt;ref&gt;</code> موجودة لمجموعة اسمها "$1"، لكن لا وسم <code>&lt;references group="$1"/&gt;</code> مماثل تم العثور عليه',
+	'cite_error_group_refs_without_references' => 'وسوم <code>&lt;ref&gt;</code> موجودة لمجموعة اسمها "$1"، لكن لا وسم <code>&lt;references group="$1"/&gt;</code> مماثل تم العثور عليه', # Fuzzy
 	'cite_error_references_group_mismatch' => 'الوسم <code>&lt;ref&gt;</code> في <code>&lt;references&gt;</code> فيه خاصية group متضاربة "$1".',
 	'cite_error_references_missing_group' => 'الوسم <code>&lt;ref&gt;</code> المُعرّف في <code>&lt;references&gt;</code> فيه خاصية group "$1" التي لا تظهر في النص السابق.',
 	'cite_error_references_missing_key' => 'الوسم <code>&lt;ref&gt;</code> ذو الاسم "$1" المُعرّف في <code>&lt;references&gt;</code> غير مستخدم في النص السابق.',
 	'cite_error_references_no_key' => 'الوسم <code>&lt;ref&gt;</code> المعرف في <code>&lt;references&gt;</code> ليس له خاصة اسم.',
 	'cite_error_empty_references_define' => 'الوسم <code>&lt;ref&gt;</code> المُعرّف في <code>&lt;references&gt;</code> بالاسم "$1" ليس له محتوى.',
+	'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink"><b>^</b> $2</span> $3</li>',
 	'cite_references_link_many_format_backlink_labels' => 'أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي أأ أب أت أث أج أح أخ أد أذ أر أز أس أش أص أض أط أظ أع أغ أف أق أك أل أم أن أه أو أي بأ بب بت بث بج بح بخ بد بذ بر بز بس بش بص بض بط بظ بع بغ بف بق بك بل بم بن به بو بي تأ تب تت تث تج تح تخ تد تذ تر تز تس تش تص تض تط تظ تع تغ تف تق تك تل تم تن ته تو تي ثأ ثب ثت ثث ثج ثح ثخ ثد ثذ ثر ثز ثس ثش ثص ثض ثط ثظ ثع ثغ ثف ثق ثك ثل ثم ثن ثه ثو ثي جأ جب جت جث جج جح جخ جد جذ جر جز جس جش جص جض جط جظ جع جغ جف جق جك جل جم جن جه جو جي حأ حب حت حث حج حح حخ حد حذ حر حز حس حش حص حض حط حظ حع حغ حف حق حك حل حم حن حه حو حي خأ خب خت خث خج خح خخ خد خذ خر خز خس خش خص خض خط خظ خع خغ خف خق خك خل خم خن خه خو خي دأ دب دت دث دج دح دخ دد دذ در دز دس دش دص دض دط دظ دع دغ دف دق دك دل دم دن ده دو دي ذأ ذب ذت ذث ذج ذح ذخ ذد ذذ ذر ذز ذس ذش ذص ذض ذط ذظ ذع ذغ ذف ذق ذك ذل ذم ذن ذه ذو ذي رأ رب رت رث رج رح رخ رد رذ رر رز رس رش رص رض رط رظ رع رغ رف رق رك رل رم رن ره رو ري زأ زب زت زث زج زح زخ زد زذ زر زز زس زش زص زض زط زظ زع زغ زف زق زك زل زم زن زه زو زي سأ سب ست سث سج سح سخ سد سذ سر سز سس سش سص سض سط سظ سع سغ سف سق سك سل سم سن سه سو سي شأ شب شت شث شج شح شخ شد شذ شر شز شس شش شص شض شط شظ شع شغ شف شق شك شل شم شن شه شو شي صأ صب صت صث صج صح صخ صد صذ صر صز صس صش صص صض صط صظ صع صغ صف صق صك صل صم صن صه صو صي ضأ ضب ضت ضث ضج ضح ضخ ضد ضذ ضر ضز ضس ضش ضص ضض ضط ضظ ضع ضغ ضف ضق ضك ضل ضم ضن ضه ضو ضي طأ طب طت طث طج طح طخ طد طذ طر طز طس طش طص طض طط طظ طع طغ طف طق طك طل طم طن طه طو طي ظأ ظب ظت ظث ظج ظح ظخ ظد ظذ ظر ظز ظس ظش ظص ظض ظط ظظ ظع ظغ ظف ظق ظك ظل ظم ظن ظه ظو ظي عأ عب عت عث عج عح عخ عد عذ عر عز عس عش عص عض عط عظ عع عغ عف عق عك عل عم عن عه عو عي غأ غب غت غث غج غح غخ غد غذ غر غز غس غش غص غض غط غظ غع غغ غف غق غك غل غم غن غه غو غي فأ فب فت فث فج فح فخ فد فذ فر فز فس فش فص فض فط فظ فع فغ فف فق فك فل فم فن فه فو في قأ قب قت قث قج قح قخ قد قذ قر قز قس قش قص قض قط قظ قع قغ قف قق قك قل قم قن قه قو قي كأ كب كت كث كج كح كخ كد كذ كر كز كس كش كص كض كط كظ كع كغ كف كق كك كل كم كن كه كو كي لأ لب لت لث لج لح لخ لد لذ لر لز لس لش لص لض لط لظ لع لغ لف لق لك لل لم لن له لو لي مأ مب مت مث مج مح مخ مد مذ مر مز مس مش مص مض مط مظ مع مغ مف مق مك مل مم من مه مو مي نأ نب نت نث نج نح نخ ند نذ نر نز نس نش نص نض نط نظ نع نغ نف نق نك نل نم نن نه نو ني هأ هب هت هث هج هح هخ هد هذ هر هز هس هش هص هض هط هظ هع هغ هف هق هك هل هم هن هه هو هي وأ وب وت وث وج وح وخ ود وذ ور وز وس وش وص وض وط وظ وع وغ وف وق وك ول وم ون وه وو وي يأ يب يت يث يج يح يخ يد يذ ير يز يس يش يص يض يط يظ يع يغ يف يق يك يل يم ين يه يو يي',
 );
 
@@ -298,13 +303,6 @@ $messages['arc'] = array(
  */
 $messages['arz'] = array(
 	'cite-desc' => 'بيضيف التاجز <nowiki><ref[ name=id]></nowiki> و <nowiki><references/></nowiki> ، للاستشهاد',
-	'cite_croak' => 'المرجع مات; $1: $2',
-	'cite_error_key_str_invalid' => 'غلط داخلى؛
-$str و/أو $key غلط.
-ده لازم مايحصلش ابدا.',
-	'cite_error_stack_invalid_input' => 'غلط داخلى؛
-مفتاح ستاك مش صحيح.
-ده لازم مايحصلش ابدا',
 	'cite_error' => 'المرجع غلط: $1',
 	'cite_error_ref_numeric_key' => 'التاج <code>&lt;ref&gt;</code> مش صحيح؛
 الاسم ماينفعش يكون عدد صحيح بسيط. استخدم عنوان بيوصف',
@@ -326,24 +324,17 @@ $str و/أو $key غلط.
 مافيش نص متوافر فى المراجع اللى اسمها<code>$1</code>',
 	'cite_error_included_ref' => 'إغلاق <code>&lt;/ref&gt;</code> مفقود لوسم <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> التاجز موجوده, بس مافيش <code>&lt;references/&gt;</code> تاجز اتلقت',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> فى تاجز موجوده لمجموعه اسمها "$1", بس مافيش مقابلها تاجز <code>&lt;references group="$1"/&gt;</code> اتلقت',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> فى تاجز موجوده لمجموعه اسمها "$1", بس مافيش مقابلها تاجز <code>&lt;references group="$1"/&gt;</code> اتلقت', # Fuzzy
 	'cite_references_link_many_format_backlink_labels' => 'أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ى أأ أب أت أث أج أح أخ أد أذ أر أز أس أش أص أض أط أظ أع أغ أف أق أك أل أم أن أه أو أى بأ بب بت بث بج بح بخ بد بذ بر بز بس بش بص بض بط بظ بع بغ بف بق بك بل بم بن به بو بى تأ تب تت تث تج تح تخ تد تذ تر تز تس تش تص تض تط تظ تع تغ تف تق تك تل تم تن ته تو تى ثأ ثب ثت ثث ثج ثح ثخ ثد ثذ ثر ثز ثس ثش ثص ثض ثط ثظ ثع ثغ ثف ثق ثك ثل ثم ثن ثه ثو ثى جأ جب جت جث جج جح جخ جد جذ جر جز جس جش جص جض جط جظ جع جغ جف جق جك جل جم جن جه جو جى حأ حب حت حث حج حح حخ حد حذ حر حز حس حش حص حض حط حظ حع حغ حف حق حك حل حم حن حه حو حى خأ خب خت خث خج خح خخ خد خذ خر خز خس خش خص خض خط خظ خع خغ خف خق خك خل خم خن خه خو خى دأ دب دت دث دج دح دخ دد دذ در دز دس دش دص دض دط دظ دع دغ دف دق دك دل دم دن ده دو دى ذأ ذب ذت ذث ذج ذح ذخ ذد ذذ ذر ذز ذس ذش ذص ذض ذط ذظ ذع ذغ ذف ذق ذك ذل ذم ذن ذه ذو ذى رأ رب رت رث رج رح رخ رد رذ رر رز رس رش رص رض رط رظ رع رغ رف رق رك رل رم رن ره رو رى زأ زب زت زث زج زح زخ زد زذ زر زز زس زش زص زض زط زظ زع زغ زف زق زك زل زم زن زه زو زى سأ سب ست سث سج سح سخ سد سذ سر سز سس سش سص سض سط سظ سع سغ سف سق سك سل سم سن سه سو سى شأ شب شت شث شج شح شخ شد شذ شر شز شس شش شص شض شط شظ شع شغ شف شق شك شل شم شن شه شو شى صأ صب صت صث صج صح صخ صد صذ صر صز صس صش صص صض صط صظ صع صغ صف صق صك صل صم صن صه صو صى ضأ ضب ضت ضث ضج ضح ضخ ضد ضذ ضر ضز ضس ضش ضص ضض ضط ضظ ضع ضغ ضف ضق ضك ضل ضم ضن ضه ضو ضى طأ طب طت طث طج طح طخ طد طذ طر طز طس طش طص طض طط طظ طع طغ طف طق طك طل طم طن طه طو طى ظأ ظب ظت ظث ظج ظح ظخ ظد ظذ ظر ظز ظس ظش ظص ظض ظط ظظ ظع ظغ ظف ظق ظك ظل ظم ظن ظه ظو ظى عأ عب عت عث عج عح عخ عد عذ عر عز عس عش عص عض عط عظ عع عغ عف عق عك عل عم عن عه عو عى غأ غب غت غث غج غح غخ غد غذ غر غز غس غش غص غض غط غظ غع غغ غف غق غك غل غم غن غه غو غى فأ فب فت فث فج فح فخ فد فذ فر فز فس فش فص فض فط فظ فع فغ فف فق فك فل فم فن فه فو فى قأ قب قت قث قج قح قخ قد قذ قر قز قس قش قص قض قط قظ قع قغ قف قق قك قل قم قن قه قو قى كأ كب كت كث كج كح كخ كد كذ كر كز كس كش كص كض كط كظ كع كغ كف كق كك كل كم كن كه كو كى لأ لب لت لث لج لح لخ لد لذ لر لز لس لش لص لض لط لظ لع لغ لف لق لك لل لم لن له لو لى مأ مب مت مث مج مح مخ مد مذ مر مز مس مش مص مض مط مظ مع مغ مف مق مك مل مم من مه مو مى نأ نب نت نث نج نح نخ ند نذ نر نز نس نش نص نض نط نظ نع نغ نف نق نك نل نم نن نه نو نى هأ هب هت هث هج هح هخ هد هذ هر هز هس هش هص هض هط هظ هع هغ هف هق هك هل هم هن هه هو هى وأ وب وت وث وج وح وخ ود وذ ور وز وس وش وص وض وط وظ وع وغ وف وق وك ول وم ون وه وو وى يأ يب يت يث يج يح يخ يد يذ ير يز يس يش يص يض يط يظ يع يغ يف يق يك يل يم ين يه يو يى',
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Bishnu Saikia
  * @author Gitartha.bordoloi
  * @author Reedy
  */
 $messages['as'] = array(
 	'cite-desc' => 'উদ্ধৃতিৰ বাবে <nowiki><ref[ name=id]></nowiki> আৰু <nowiki><references/></nowiki> টেগ্‌সমূহ যোগ কৰে',
-	'cite_croak' => 'উদ্ধৃতিৰ অন্ত পৰিছে; $1: $2',
-	'cite_error_key_str_invalid' => 'আভ্যন্তৰীণ ত্ৰুটি;
-অবৈধ $str আৰু/বা $key।
-এইটো কেতিয়াও হোৱা উচিত নহয়।',
-	'cite_error_stack_invalid_input' => 'আভ্যন্তৰীণ ত্ৰুটি;
-অবৈধ ষ্টেক কী।
-এইটো কেতিয়াও হোৱা উচিত নহয়।',
 	'cite_error' => 'উদ্ধৃতি ত্ৰুটি: $1',
 	'cite_error_ref_numeric_key' => "অবৈধ <code>&lt;ref&gt;</code> টেগ;
 নাম কোনো সৰল পূৰ্ণসংখ্যা হ'ব নোৱাৰে। এটা বৰ্ণনামূলক শিৰোনাম ব্যৱহাৰ কৰক।",
@@ -367,7 +358,7 @@ $messages['as'] = array(
 <code>$1</code> নামৰ refৰ বাবে কোনো পাঠ্য প্ৰদান কৰা হোৱা নাই',
 	'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> বন্ধ কৰা হৈছে; <code>&lt;ref&gt;</code> টেগৰ বাবে পোৱা নাই',
 	'cite_error_refs_without_references' => "<code>&lt;ref&gt;</code> টেগ্‌সমূহ আছে, কিন্তু কোনো <code>&lt;references/&gt;</code> বা <code>&#123;&#123;Reflist&#125;&#125;</code> টেগ্‌ পোৱা নগ'ল। অনুগ্ৰহ কৰি প্ৰবন্ধৰ শেষ অংশত ওপৰোক্ত টেগ্‌ যোগ দিয়ক।",
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> টেগ্‌সমূহ "$1" নামৰ এটা গোটৰ বাবে আছে, কিন্তু তাৰ <code>&lt;references group="$1"/&gt;</code> টেগ্‌ পোৱা নগ\'ল',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> টেগ্‌সমূহ "$1" নামৰ এটা গোটৰ বাবে আছে, কিন্তু তাৰ <code>&lt;references group="$1"/&gt;</code> টেগ্‌ পোৱা নগ\'ল', # Fuzzy
 	'cite_error_references_group_mismatch' => '"$1" গোটৰ ক্ষেত্ৰত <code>&lt;references&gt;</code>ৰ <code>&lt;ref&gt;</code> টেগ্‌ ব্যৱহাৰত সমস্যা হৈছে।',
 	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>ত দিয়া <code>&lt;ref&gt;</code> টেগৰ "$1" গোট এট্ট্ৰিবিউট আছে, যিটো পূৰ্বৰ পাঠ্যত ওলোৱা নাই।',
 	'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>ত দিয়া "$1" নামৰ <code>&lt;ref&gt;</code> টেগ্‌টো পূৰ্বৰ পাঠ্যত ব্যৱহাৰ কৰা নাই।',
@@ -381,13 +372,6 @@ $messages['as'] = array(
  */
 $messages['ast'] = array(
 	'cite-desc' => 'Añade les etiquetes <nowiki><ref[ name=id]></nowiki> y <nowiki><references/></nowiki> pa les cites',
-	'cite_croak' => 'Cita corrompida; $1: $2',
-	'cite_error_key_str_invalid' => 'Error internu;
-$str y/o $key inválidos.
-Esto nun tendría d\'asoceder nunca.',
-	'cite_error_stack_invalid_input' => "Error internu;
-clave de pila inválida.
-Esto nun tendría d'asoceder nunca.",
 	'cite_error' => 'Error de cita: $1',
 	'cite_error_ref_numeric_key' => 'Etiqueta <code>&lt;ref&gt;</code> non válida; el nome nun pue ser un enteru simple, usa un títulu descriptivu',
 	'cite_error_ref_no_key' => 'Etiqueta <code>&lt;ref&gt;</code> non válida; les referencies ensin conteníu han tener un nome',
@@ -404,12 +388,14 @@ Define más nel mensaxe <nowiki>[[MediaWiki:$2]]</nowiki>.',
 	'cite_error_references_no_text' => 'Etiqueta <code>&lt;ref&gt;</code> non válida; nun se conseñó testu pa les referencies nomaes <code>$1</code>',
 	'cite_error_included_ref' => 'Falta <code>&lt;/ref&gt;</code> pa la etiqueta <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => "Les etiquetes <code>&lt;ref&gt;</code> esisten, pero nun s'alcontró denguna etiqueta <code>&lt;references/&gt;</code>",
-	'cite_error_group_refs_without_references' => 'Les etiquetes <code>&lt;ref&gt;</code> esisten pa un grupu llamáu "$1", pero nun s\'alcontró la etiqueta <code>&lt;references group="$1"/&gt;</code> correspondiente',
+	'cite_error_group_refs_without_references' => 'Les etiquetes <code>&lt;ref&gt;</code> esisten pa un grupu llamáu "$1", pero nun s\'alcontró la etiqueta <code>&lt;references group="$1"/&gt;</code> correspondiente, o falta un cierre <code>&lt;/ref&gt;</code>',
 	'cite_error_references_group_mismatch' => 'La etiqueta <code>&lt;ref&gt;</code> en <code>&lt;references&gt;</code> tien un conflictu col atributu de grupu "$1".',
 	'cite_error_references_missing_group' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> tien l\'atributu de grupu "$1" que nun apaez nel testu anterior.',
 	'cite_error_references_missing_key' => 'La etiqueta <code>&lt;ref&gt;</code> col nome "$1" definida en <code>&lt;references&gt;</code> nun s\'utiliza nel testu anterior.',
 	'cite_error_references_no_key' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> nun tien dengún atributu de nome.',
 	'cite_error_empty_references_define' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> col nome "$1" nun tien conteníu.',
+	'cite_references_link_accessibility_label' => 'Saltar arriba',
+	'cite_references_link_many_accessibility_label' => 'Saltar a:',
 );
 
 /** Azerbaijani (azərbaycanca)
@@ -430,13 +416,6 @@ $messages['az'] = array(
  */
 $messages['azb'] = array(
 	'cite-desc' => 'گؤتورمه‌لر اوچون، <nowiki><ref[ name=id]></nowiki> ve <nowiki><references/></nowiki> ائلئمئنت‌لری‌نین علاوه‌لر',
-	'cite_croak' => 'سیتات کایبئدیلدی؛ $1: $2',
-	'cite_error_key_str_invalid' => 'داخی‌لی ختا؛
-اعتبارسیز $ کوچ و / یا دا $ کئی.
-بو اصلا اولماما‌لی.',
-	'cite_error_stack_invalid_input' => 'داخی‌لی ختا؛
-اعتبارسیز ایستاجک آچاری.
-بو اصلا اولماما‌لی.',
 	'cite_error' => 'قایناق خطاسی $1',
 );
 
@@ -445,13 +424,6 @@ $messages['azb'] = array(
  */
 $messages['ba'] = array(
 	'cite-desc' => 'Төшөрмәләр өсөн <nowiki><ref[ name=id]></nowiki> һәм <nowiki><references/></nowiki> билдәләрен өҫтәй',
-	'cite_croak' => 'Өҙөмтә юғалған; $1: $2',
-	'cite_error_key_str_invalid' => 'Эске хата;
-$str һәм/йәки $key дөрөҫ түгел.
-Был бер ҡасан да булырға тейеш түгел.',
-	'cite_error_stack_invalid_input' => 'Эске хата;
-Стек асҡысы дөрөҫ түгел.
-Был бер ҡасан да булырға тейеш түгел.',
 	'cite_error' => 'Өҙөмтә хатаһы: $1',
 	'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> билдәһе дөрөҫ түгел;
 исем бөтөн һан була алмай. Тасуирларлыҡ исем ҡулланығыҙ.',
@@ -475,7 +447,7 @@ $str һәм/йәки $key дөрөҫ түгел.
 <code>$1</code> төшөрмәләре өсөн текст юҡ',
 	'cite_error_included_ref' => '<code>&lt;ref&gt;</code> билдәһе өсөн <code>&lt;/ref&gt;</code> ябыу билдәһе юҡ',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> билдәһе бар, әммә <code>&lt;references/&gt;</code> билдәһе юҡ',
-	'cite_error_group_refs_without_references' => '"$1" төркөмө өсөн <code>&lt;ref&gt;</code> билдәһе бар, әммә <code>&lt;references group="$1"/&gt;</code> билдәһе юҡ',
+	'cite_error_group_refs_without_references' => '"$1" төркөмө өсөн <code>&lt;ref&gt;</code> билдәһе бар, әммә <code>&lt;references group="$1"/&gt;</code> билдәһе юҡ', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> билдәһенең <code>&lt;ref&gt;</code> билдәһендә "$1" төркөмө атрибуты ҡаршылыҡтар тыуҙыра.',
 	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> билдәһенең <code>&lt;ref&gt;</code> билдәһендә "$1" төркөмө атрибуты үрҙәге текста осрамай.',
 	'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> билдәһенең "$1" исемле <code>&lt;ref&gt;</code> билдәһе үрҙәге текста ҡулланылмай.',
@@ -488,13 +460,6 @@ $str һәм/йәки $key дөрөҫ түгел.
  */
 $messages['bcc'] = array(
 	'cite-desc' => 'اضفافه کنت<nowiki><ref[ name=id]></nowiki> و <nowiki><references/></nowiki> تگ, په ارجاع دهگ',
-	'cite_croak' => 'ذکر منبع چه بن رپت; $1: $2',
-	'cite_error_key_str_invalid' => 'حطا درونی ;
-نامعتبرین $str و/یا  $key.
-شی نباید هچ وهد پیش کیت',
-	'cite_error_stack_invalid_input' => 'درونی حطا;
-نامعتربین دسته کلیت.
-شی نبایدن هچ وهد پیش کیت.',
 	'cite_error' => 'حطا ارجاع: $1',
 	'cite_error_ref_numeric_key' => 'نامعتبر <code>&lt;ref&gt;</code>تگ;
 نام یک سادگین هوری نه نه بیت. یک توضیحی عنوانی استفاده کنیت',
@@ -521,20 +486,43 @@ $messages['bcc'] = array(
 	'cite_references_link_many_and' => 'و',
 );
 
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+	'cite-desc' => 'Minadugang nin <nowiki><ref[ name=id]></nowiki> asin <nowiki><references/></nowiki> na mga tatak, para sa mga toltolan',
+	'cite_error' => 'Sambiton an kasalaan: $1',
+	'cite_error_ref_numeric_key' => 'Imbalido an <code>&lt;ref&gt;</code> tatak; an pangaran dae puwede na magin sarong simplehon na bilog na numero. Maggamit nin sarong deskriptibong titulo',
+	'cite_error_ref_no_key' => 'Imbalido an <code>&lt;ref&gt;</code> tatak; an mga toltolan na mayong kalamnan dapat magkaigwa nin pangaran',
+	'cite_error_ref_too_many_keys' => 'Imbalido an <code>&lt;ref&gt;</code> tatak; imbalidong mga pangaran, e.g. grabe kadakol',
+	'cite_error_ref_no_input' => 'Imbalido an <code>&lt;ref&gt;</code> tatak; an mga toltolan na mayong pangaran dapat magkaigwa nin kalamnan',
+	'cite_error_references_invalid_parameters' => 'Imbalido an <code>&lt;references&gt;</code> tatak; mayong mga parametro an pinagtutugot. Maggamit nin <code>&lt;mga toltolan /&gt;</code>',
+	'cite_error_references_invalid_parameters_group' => 'Imbalido an <code>&lt;references&gt;</code> tatak; an parametrong "grupo" sana an pinagtutugot. Maggamit nin <code>&lt;mga toltolan /&gt;</code>, o <code>&lt;mga toltolang grupo="..." /&gt;</code>',
+	'cite_error_references_no_backlink_label' => 'Naubusan nin pankostumbreng sugpon-panlikod na kamarkahan.
+Pakahulugan nin dagdag tabi an <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> mensahe.',
+	'cite_error_no_link_label_group' => 'Naubusan nin pankostumbreng sugpon nin mga kamarkahan para sa grupo "$1".
+Pakahulugan nin dagdag tabi an <nowiki>[[MediaWiki:$2]]</nowiki> mensahe.',
+	'cite_error_references_no_text' => 'Imbalidong <code>&lt;ref&gt;</code> tatak; mayong teksto na ipinagtao para sa reperensiya na pinagngaranan na <code>$1</code>',
+	'cite_error_included_ref' => 'Ipinagsasara <code>&lt;/ref&gt;</code> nawawara para sa <code>&lt;ref&gt;</code> na tatak',
+	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> mga tatak eksistido na, alagad mayo nin <code>&lt;references/&gt;</code> na tatak an nanagboan',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> mga tatak na eksistido para sa sarong grupo na pinagngaranan na "$1", alagad mayong kinasungkoan na <code>&lt;mga pinapanungdanan na grupo="$1"/&gt;</code>na tatak an nanagboan, o sarong panarado <code>&lt;/ref&gt;</code> an nawawara',
+	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> tatak sa laog na <code>&lt;references&gt;</code> igwa nin pangrupong kumplikto sa hitsurahon na "$1".',
+	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> tatak na pinagkahulugan sa <code>&lt;references&gt;</code> igwa nin pangrupong hitsurahon na "$1" na dae ipinapahiling sa nakaaging teksto.',
+	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> tatak na igwang pangaran na "$1" na pinagkahulugan sa <code>&lt;references&gt;</code> na dae pinaggagamit sa nakaaging teksto.',
+	'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> tatak na pinagkahulugan sa <code>&lt;references&gt;</code> na mayo nin hitsurahon sa pangaran.',
+	'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> tatak na pinagkahulugan sa <code>&lt;references&gt;</code> na igwang pangaran na "$1" na mayo tabing kalamnan.',
+	'cite_references_link_accessibility_label' => 'Lukso paitaas',
+	'cite_references_link_many_accessibility_label' => 'Lukso paitaas paduman sa:',
+);
+
 /** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  * @author EugeneZelenko
  * @author Jim-by
  * @author Red Winged Duck
+ * @author Wizardist
  */
 $messages['be-tarask'] = array(
 	'cite-desc' => 'Дадае тэгі <nowiki><ref[ name=id]></nowiki> і <nowiki><references/></nowiki> для зносак',
-	'cite_croak' => 'Няўдалае цытаваньне; $1: $2',
-	'cite_error_key_str_invalid' => 'Унутраная памылка;
-няслушны $str і/ці $key.
-Гэтага ніколі не павінна быць.',
-	'cite_error_stack_invalid_input' => 'Унутраная памылка;
-няслушны ключ стэку.
-Гэтага ніколі не павінна быць.',
 	'cite_error' => 'Памылка цытаваньня: $1',
 	'cite_error_ref_numeric_key' => 'Няслушны тэг <code>&lt;ref&gt;</code>;
 назва ня можа быць проста лікам, ужывайце апісальную назву',
@@ -558,12 +546,14 @@ $messages['be-tarask'] = array(
 няма тэксту ў назьве зносак <code>$1</code>',
 	'cite_error_included_ref' => 'Няма закрываючага тэга  <code>&lt;/ref&gt;</code> пасьля адкрытага тэга <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Тэг <code>&lt;ref&gt;</code> існуе, але ня знойдзена тэга <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Тэг <code>&lt;ref&gt;</code> існуе для групы «$1», але адпаведнага тэга <code>&lt;references group="$1"/&gt;</code> ня знойдзена',
+	'cite_error_group_refs_without_references' => 'Тэг <code>&lt;ref&gt;</code> існуе для групы «$1», але адпаведнага тэга <code>&lt;references group="$1"/&gt;</code> ня знойдзена. Магчыма, адсутнічае фінальны тэг <code>&lt;/ref&gt;</code>',
 	'cite_error_references_group_mismatch' => 'Тэг <code>&lt;ref&gt;</code> у <code>&lt;references&gt;</code> утрымлівае канфліктуючы атрыбут групы «$1».',
 	'cite_error_references_missing_group' => 'Тэг <code>&lt;ref&gt;</code> вызначаны ў <code>&lt;references&gt;</code> утрымлівае атрыбут групы «$1», які раней не выкарыстоўваўся ў тэксьце.',
 	'cite_error_references_missing_key' => 'Тэг <code>&lt;ref&gt;</code> з назвай «$1» вызначаны ў <code>&lt;references&gt;</code> не выкарыстоўваўся ў папярэднім тэксьце.',
 	'cite_error_references_no_key' => 'Тэг <code>&lt;ref&gt;</code> вызначаны ў <code>&lt;references&gt;</code> ня мае атрыбуту назвы.',
 	'cite_error_empty_references_define' => 'Тэг <code>&lt;ref&gt;</code> вызначаны ў <code>&lt;references&gt;</code> з назвай «$1» ня мае зьместу.',
+	'cite_references_link_accessibility_label' => 'Угару',
+	'cite_references_link_many_accessibility_label' => 'Угару да:',
 );
 
 /** Bulgarian (български)
@@ -573,9 +563,6 @@ $messages['be-tarask'] = array(
  */
 $messages['bg'] = array(
 	'cite-desc' => 'Добавя етикетите <nowiki><ref[ name=id]></nowiki> и <nowiki><references/></nowiki>, подходящи за цитиране',
-	'cite_croak' => 'Цитиращата система се срути; $1: $2',
-	'cite_error_key_str_invalid' => 'Вътрешна грешка: невалиден параметър $str и/или $key.  Това не би трябвало да се случва никога.',
-	'cite_error_stack_invalid_input' => "'''Вътрешна грешка:''' невалиден ключ на стека. Това не би трябвало да се случва никога.",
 	'cite_error' => 'Грешка при цитиране: $1',
 	'cite_error_ref_numeric_key' => "'''Грешка в етикет <code>&lt;ref&gt;</code>:''' името не може да бъде число, използва се описателно име",
 	'cite_error_ref_no_key' => "'''Грешка в етикет <code>&lt;ref&gt;</code>:''' етикетите без съдържание трябва да имат име",
@@ -590,24 +577,22 @@ $messages['bg'] = array(
 	'cite_error_references_no_text' => "'''Грешка в етикет <code>&lt;ref&gt;</code>:''' не е подаден текст за бележките на име <code>$1</code>",
 	'cite_error_included_ref' => 'Липсва затварящ етикет <code>&lt;/ref&gt;</code> след отварящия етикет <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Присъстват етикети <code>&lt;ref&gt;</code>; липсва етикет <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Присъстват етикети <code>&lt;ref&gt;</code> за групата "$1"; но липсва съответният етикет <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'Присъстват етикети <code>&lt;ref&gt;</code> за групата "$1"; но липсва съответният етикет <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
 );
 
 /** Bengali (বাংলা)
+ * @author Aftab1995
  * @author Bellayet
  * @author Nasir8891
  * @author Zaheen
  */
 $messages['bn'] = array(
-	'cite-desc' => 'উদ্ধৃতির জন্য <nowiki><ref[ name=id]></nowiki> এবং <nowiki><references/></nowiki> ট্যাগসমূহ যোগ করুন',
-	'cite_croak' => 'উদ্ধৃতি ক্রোক করা হয়েছে; $1: $2',
-	'cite_error_key_str_invalid' => 'আভ্যন্তরীন ত্রুটি; অবৈধ $str এবং/অথবা $key। এটা কখনই ঘটা উচিত নয়।',
-	'cite_error_stack_invalid_input' => 'আভ্যন্তরীন ত্রুটি; অবৈধ স্ট্যাক কি। এটা কখনই ঘটা উচিত নয়।',
+	'cite-desc' => 'উদ্ধৃতির জন্য, <nowiki><ref[ name=id]></nowiki> এবং <nowiki><references/></nowiki> ট্যাগসমূহ যোগ করুন',
 	'cite_error' => 'উদ্ধৃতি ত্রুটি: $1',
 	'cite_error_ref_numeric_key' => 'অবৈধ <code>&lt;ref&gt;</code> ট্যাগ; নাম কোন সরল পূর্ণসংখ্যা হতে পারবেনা, একটি বিবরণমূলক শিরোনাম ব্যবহার করুন',
-	'cite_error_ref_no_key' => 'অবৈধ <code>&lt;ref&gt;</code> ট্যাগ; বিষয়বস্তুহীন refসমূহের অবশ্যই নাম থাকতে হবে',
+	'cite_error_ref_no_key' => 'অবৈধ <code>&lt;ref&gt;</code> ট্যাগ; বিষয়বস্তুহীন ref সমূহের অবশ্যই নাম থাকতে হবে',
 	'cite_error_ref_too_many_keys' => 'অবৈধ <code>&lt;ref&gt;</code> ট্যাগ; অবৈধ নাম (যেমন- সংখ্যাতিরিক্ত)',
-	'cite_error_ref_no_input' => 'অবৈধ <code>&lt;ref&gt;</code> ট্যাগ; নামবিহীন refসমূহের অবশ্যই বিষয়বস্তু থাকতে হবে',
+	'cite_error_ref_no_input' => 'অবৈধ <code>&lt;ref&gt;</code> ট্যাগ; নামবিহীন ref সমূহের অবশ্যই বিষয়বস্তু থাকতে হবে',
 	'cite_error_references_invalid_parameters' => 'অবৈধ <code>&lt;ref&gt;</code> ট্যাগ; কোন প্যারামিটার অনুমোদিত নয়, <code>&lt;references /&gt;</code> ব্যবহার করুন',
 	'cite_error_references_invalid_parameters_group' => 'ত্রুটিপূর্ণ <code>&lt;references&gt;</code> ট্যাগ;
 কেবলমাত্র "group" প্যারামিটার ব্যবহার কর যাবে।
@@ -616,25 +601,19 @@ $messages['bn'] = array(
 <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> বার্তায় আরও সংজ্ঞায়িত করুন',
 	'cite_error_no_link_label_group' => 'গ্রুপ "$1" এর জন্য কাস্টম লিংক ব্যবহারের সীমানা পেরিয়েছে।
 <nowiki>[[MediaWiki:$2]]</nowiki> বার্তায় আরও সজ্ঞায়িত করুন।',
-	'cite_error_references_no_text' => 'অবৈধ <code>&lt;ref&gt;</code> ট্যাগ; <code>$1</code> নামের refগুলির জন্য কোন টেক্সট প্রদান করা হয়নি',
+	'cite_error_references_no_text' => 'অবৈধ <code>&lt;ref&gt;</code> ট্যাগ; <code>$1</code> নামের ref গুলির জন্য কোন টেক্সট প্রদান করা হয়নি',
 	'cite_error_included_ref' => '<code>&lt;ref&gt;</code> ট্যাগের ক্ষেত্রে <code>&lt;/ref&gt;</code> ট্যাগ যোগ করা হয়নি',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ট্যাগ রয়েছে, কিন্তু কোনো <code>&lt;references/&gt;</code> ট্যাগ নেই',
-	'cite_error_group_refs_without_references' => '"$1" নামের গ্রুপের <code>&lt;ref&gt;</code> ট্যাগ রয়েছে, কিন্তু এর জন্য <code>&lt;references group="$1"/&gt;</code> ট্যাগ দেয়া হয়নি',
+	'cite_error_group_refs_without_references' => '"$1" নামের গ্রুপের <code>&lt;ref&gt;</code> ট্যাগ রয়েছে, কিন্তু এর জন্য <code>&lt;references group="$1"/&gt;</code> ট্যাগ দেয়া হয়নি', # Fuzzy
 	'cite_error_references_group_mismatch' => '"$1" গ্রুপের ক্ষেত্রে <code>&lt;ref&gt;</code> ট্যাগ <code>&lt;references&gt;</code> ট্যাগের অংশে ব্যবহারে সমস্যা সৃষ্টি হয়েছে।',
 );
 
 /** Breton (brezhoneg)
+ * @author Fohanno
  * @author Fulup
  */
 $messages['br'] = array(
 	'cite-desc' => 'Ouzhpennañ a ra ar balizennoù <nowiki><ref[ name=id]></nowiki> ha <nowiki><references/></nowiki>, evit an arroudoù.',
-	'cite_croak' => 'Arroud breinet ; $1 : $2',
-	'cite_error_key_str_invalid' => 'Fazi diabarzh ;
-$str ha/pe key$ direizh.
-Ne zlefe ket c\'hoarvezout gwezh ebet.',
-	'cite_error_stack_invalid_input' => "Fazi diabarzh ;
-alc'hwez pil direizh.
-Ne zlefe ket c'hoarvezout gwezh ebet.",
 	'cite_error' => 'Fazi arroud : $1',
 	'cite_error_ref_numeric_key' => "Fazi implijout ar valizenn <code>&lt;ref&gt;</code> ;
 n'hall ket an anv bezañ un niver anterin. Grit gant un titl deskrivus",
@@ -658,12 +637,14 @@ Termenit re all e kemennadenn <nowiki>[[MediaWiki:$2]]</nowiki>.',
 ne oa bet lakaet tamm testenn ebet evit ar valizenn <code>$1</code>',
 	'cite_error_included_ref' => 'Kod digeriñ <code>&lt;/ref&gt;</code> hep kod serriñ <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => "<code>&lt;ref&gt;</code> balizennoù zo, met n'eus bet kavet balizenn <code>&lt;references/&gt;</code> ebet",
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> balizennoù zo evit ur strollad anvet "$1", met n\'eus bet kavet balizenn <code>&lt;references group="$1"/&gt;</code> ebet o klotañ',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> balizennoù zo evit ur strollad anvet "$1", met n\'eus bet kavet balizenn <code>&lt;references group="$1"/&gt;</code> ebet o klotañ', # Fuzzy
 	'cite_error_references_group_mismatch' => 'Gant ar valizenn <code>&lt;ref&gt;</code> e <code>&lt;references&gt;</code> emañ an dezverk strollad trubuilhus "$1".',
 	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> ar valizenn termenet e <code>&lt;references&gt;</code> eo dezhi un dezverk strollad "$1" na gaver ket en destenn a-raok.',
 	'cite_error_references_missing_key' => 'N\'eo ket bet implijet en destenn gent ar <code>&lt;ref&gt;</code> valizenn hec\'h anv "$1" termenet e <code>&lt;references&gt;</code>.',
 	'cite_error_references_no_key' => "<code>&lt;ref&gt;</code> ar valizenn termenet e <code>&lt;references&gt;</code> n'he deus dezverk anv ebet.",
 	'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> ar valiezenn termenet e <code>&lt;references&gt;</code> dezhi an anv a "$1" zo goullo.',
+	'cite_references_link_accessibility_label' => 'Lammat',
+	'cite_references_link_many_accessibility_label' => 'Lammat da :',
 );
 
 /** Bosnian (bosanski)
@@ -672,13 +653,6 @@ ne oa bet lakaet tamm testenn ebet evit ar valizenn <code>$1</code>',
  */
 $messages['bs'] = array(
 	'cite-desc' => 'Dodaje oznake <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki> za citiranje',
-	'cite_croak' => 'Citiranje neuspješno; $1: $2',
-	'cite_error_key_str_invalid' => 'Unutrašnja greška;
-nevaljan $str i/ili $key.
-Ovo se ne bi trebalo dešavati.',
-	'cite_error_stack_invalid_input' => 'Unutrašnja greška;
-nepoznat "stack" ključ.
-Ovo se ne bi smjelo događati.',
 	'cite_error' => 'Greška kod citiranja: $1',
 	'cite_error_ref_numeric_key' => 'Nevaljana oznaka <code>&lt;ref&gt;</code>;
 naslov ne može biti jednostavni cijeli broj. Koristite opisni naslov',
@@ -702,7 +676,7 @@ Definišite više putem poruke <nowiki>[[MediaWiki:$2]]</nowiki>.',
 nije naveden tekst za reference sa imenom <code>$1</code>',
 	'cite_error_included_ref' => 'Nedostaje oznaka za zatvaranje <code>&lt;/ref&gt;</code> nakon <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> oznake postoje, ali oznaka <code>&lt;references/&gt;</code> nije pronađena',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> oznake postoje za grupu pod imenom "$1", ali nije pronađena pripadajuća oznaka <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> oznake postoje za grupu pod imenom "$1", ali nije pronađena pripadajuća oznaka <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> oznaka u <code>&lt;references&gt;</code> ima atribut grupe konflikta "$1".',
 	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> oznaka definisana u <code>&lt;references&gt;</code> ima atribut grupe "$1" koji se ne pojavljuje u ranijem tekstu.',
 	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> oznaka sa imenom "$1" definisana u <code>&lt;references&gt;</code> nije korištena u ranijem tekstu.',
@@ -718,13 +692,6 @@ nije naveden tekst za reference sa imenom <code>$1</code>',
  */
 $messages['ca'] = array(
 	'cite-desc' => 'Afegeix les etiquetes <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki>, per a cites',
-	'cite_croak' => 'Cita corrompuda; $1: $2',
-	'cite_error_key_str_invalid' => 'Error intern;
-els valors $str i/o $key no valen.
-Aquesta situació no s\'hauria de donar mai.',
-	'cite_error_stack_invalid_input' => "Error intern;
-el valor d'emmagatzematge no és vàlid.
-Aquesta situació no s'hauria de donar mai.",
 	'cite_error' => 'Error de citació: $1',
 	'cite_error_ref_numeric_key' => 'Etiqueta <code>&lt;ref&gt;</code> no vàlida;
 el nom no pot ser un nombre. Empreu una paraula o un títol descriptiu',
@@ -748,7 +715,7 @@ Defineix més al missatge <nowiki>[[MediaWiki:$2]]</nowiki>.',
 no s'ha proporcionat text per les refs amb l'etiqueta <code>$1</code>",
 	'cite_error_included_ref' => 'Es tanca el <code>&lt;/ref&gt;</code> que manca per una etiqueta <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Hi ha etiquetes <code>&lt;ref&gt;</code> però no cap etiqueta <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Existeixen etiquetes <code>&lt;ref&gt;</code> pel grup «$1» però no l\'etiqueta <code>&lt;references group="$1"/&gt;</code> corresponent',
+	'cite_error_group_refs_without_references' => 'Existeixen etiquetes <code>&lt;ref&gt;</code> pel grup «$1» però no l\'etiqueta <code>&lt;references group="$1"/&gt;</code> corresponent', # Fuzzy
 	'cite_error_references_group_mismatch' => 'L\'etiqueta <code>&lt;ref&gt;</code> a <code>&lt;references&gt;</code> té un conflicte amb l\'atribut de grup "$1".',
 	'cite_error_references_missing_group' => 'L\'etiqueta <code>&lt;ref&gt;</code> definida a <code>&lt;references&gt;</code> té l\'atribut de grup "$1" que no apareix en el text anterior.',
 	'cite_error_references_missing_key' => 'L\'etiqueta <code>&lt;ref&gt;</code> amb el nom "$1" definida a <code>&lt;references&gt;</code> no s\'utilitza en el text anterior.',
@@ -756,19 +723,29 @@ no s'ha proporcionat text per les refs amb l'etiqueta <code>$1</code>",
 	'cite_error_empty_references_define' => 'L\'etiqueta <code>&lt;ref&gt;</code> definida a <code>&lt;references&gt;</code> amb el nom "$1" no té contingut.',
 );
 
+/** Chechen (нохчийн)
+ * @author Умар
+ */
+$messages['ce'] = array(
+	'cite_error' => 'ГӀалат дешнаш далорна $1',
+	'cite_error_references_no_text' => 'Тег <code>&lt;ref&gt;</code> нийса яц; тIетовжаран <code>$1</code> йоза яздина дац',
+	'cite_error_refs_without_references' => 'Йолуш йолу тегаца <code>&lt;ref&gt;</code> йогӀуш йолу тег <code>&lt;references/&gt;</code> ца карийна',
+	'cite_error_group_refs_without_references' => 'Группан «$1» йолуш йолу тегашца <code>&lt;ref&gt;</code> йогӀуш йолу тег <code>&lt;references group="$1"/&gt;</code> ца карийна', # Fuzzy
+	'cite_references_link_accessibility_label' => 'Дехьа гӀо',
+	'cite_references_link_many_accessibility_label' => 'Дехьа гӀо:',
+);
+
 /** Czech (česky)
  * @author Danny B.
  * @author Li-sung
+ * @author Littledogboy
  * @author Matěj Grabovský
  * @author Mormegil
  * @author Sp5uhe
  */
 $messages['cs'] = array(
 	'cite-desc' => 'Přidává značky <nowiki><ref[ name="id"]></nowiki> a&nbsp;<nowiki><references /></nowiki> na označení citací',
-	'cite_croak' => 'Nefunkční citace; $1: $2',
-	'cite_error_key_str_invalid' => 'Vnitřní chyba; neplatný $str nebo $key. Toto by nikdy nemělo nastat.',
-	'cite_error_stack_invalid_input' => 'Vnitřní chyba; neplatný klíč zásobníku',
-	'cite_error' => 'Chybná citace $1',
+	'cite_error' => 'Chybná citace: $1',
 	'cite_error_ref_numeric_key' => 'Chyba v tagu <code>&lt;ref&gt;</code>; názvem nesmí být prosté číslo, použijte popisné označení',
 	'cite_error_ref_no_key' => 'Chyba v tagu <code>&lt;ref&gt;</code>; prázdné citace musí obsahovat název',
 	'cite_error_ref_too_many_keys' => 'Chyba v tagu <code>&lt;ref&gt;</code>; chybné názvy, např. je jich příliš mnoho',
@@ -783,12 +760,14 @@ Zvyšte jejich počet ve zprávě <nowiki>[[MediaWiki:$2]]</nowiki>.',
 	'cite_error_references_no_text' => 'Chyba v tagu <code>&lt;ref&gt;</code>; citaci označené <code>$1</code> není určen žádný text',
 	'cite_error_included_ref' => 'Chybí ukončovací <code>&lt;/ref&gt;</code> k&nbsp;tagu <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Nalezena značka <code>&lt;ref&gt;</code> bez příslušné značky <code>&lt;references/&gt;</code>.',
-	'cite_error_group_refs_without_references' => 'Nalezena značka <code>&lt;ref&gt;</code> pro skupinu „$1“ bez příslušné značky <code>&lt;references group="$1"/&gt;</code>.',
+	'cite_error_group_refs_without_references' => 'Nalezena značka <code>&lt;ref&gt;</code> pro skupinu „$1“, ale neexistuje příslušná značka <code>&lt;references group="$1"/&gt;</code> nebo chybí zavírací <code>&lt;/ref&gt;</code>.',
 	'cite_error_references_group_mismatch' => 'Značka <code>&lt;ref&gt;</code> uvnitř <code>&lt;references&gt;</code> má definovánu jinou skupinu „$1“.',
 	'cite_error_references_missing_group' => 'Značka <code>&lt;ref&gt;</code> uvnitř <code>&lt;references&gt;</code> používá skupinu „$1“, která se v předchozím textu neobjevuje.',
 	'cite_error_references_missing_key' => 'Na <code>&lt;ref&gt;</code> se jménem „$1“ definovaný uvnitř <code>&lt;references&gt;</code> nejsou v předchozím textu žádné odkazy.',
 	'cite_error_references_no_key' => 'U značky <code>&lt;ref&gt;</code> definované uvnitř <code>&lt;references&gt;</code> chybí atribut <code>name</code>.',
 	'cite_error_empty_references_define' => 'U značky <code>&lt;ref&gt;</code> s názvem „$1“ definované uvnitř <code>&lt;references&gt;</code> chybí obsah.',
+	'cite_references_link_accessibility_label' => 'Skočit nahoru',
+	'cite_references_link_many_accessibility_label' => 'Skočit nahoru k:',
 );
 
 /** Church Slavic (словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ)
@@ -804,13 +783,6 @@ $messages['cu'] = array(
  */
 $messages['cy'] = array(
 	'cite-desc' => 'Yn ychwanegu tagiau <nowiki><ref[ name=id]></nowiki> a <nowiki><references/></nowiki>, ar gyfer cyfeiriadau',
-	'cite_croak' => 'Cyfeirio at farwolaeth; $1: $2',
-	'cite_error_key_str_invalid' => 'Gwall mewnol;
-$str a/neu $key annilys.
-Ni ddylai hyn fyth ddigwydd.',
-	'cite_error_stack_invalid_input' => 'Gwall mewnol;
-Allwedd pentwr annilys.
-Ni ddylai hyn fyth ddigwydd.',
 	'cite_error' => 'Gwall cyfeirio: $1',
 	'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> annilys;
 ni all enw fod yn rif yn unig. Defnyddiwch deitl disgrifiadol.',
@@ -834,25 +806,25 @@ Gallwch ddiffinio rhagor ohonynt yn y neges <nowiki>[[MediaWiki:$2]]</nowiki>.',
 ni osodwyd unrhyw destun ar gyfer y 'ref' <code>$1</code>",
 	'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> clo yn eisiau ar gyfer y tag <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Mae tagiau <code>&lt;ref&gt;</code> yn bresennol, ond dim tag <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Mae tagiau <code>&lt;ref&gt;</code> yn bresennol ar gyfer y grwp "$1", ond ni chafwyd tag <code>&lt;references/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'Mae tagiau <code>&lt;ref&gt;</code> yn bresennol ar gyfer y grwp "$1", ond ni chafwyd tag <code>&lt;references/&gt;</code>, ynteu roedd <code>&lt;/ref&gt;</code> terfynol yn eisiau.',
 	'cite_error_references_group_mismatch' => 'Mae gan y tag <code>&lt;ref&gt;</code> oddi mewn i <code>&lt;references&gt;</code> briodoledd grŵp anghyson "$1".',
 	'cite_error_references_missing_group' => 'Mae gan y tag <code>&lt;ref&gt;</code> a ddiffinir yn <code>&lt;references&gt;</code> briodoledd grŵp "$1" nag ydyw\'n cael ei ddefnyddio yn y testun cynt.',
 	'cite_error_references_missing_key' => 'Ni ddefnyddir y tag <code>&lt;ref&gt;</code> o\'r enw "$1", a ddiffinir yn <code>&lt;references&gt;</code>, yn y testun blaenorol.',
 	'cite_error_references_no_key' => 'Nid oes dim priodoledd o enw gan y tag <code>&lt;ref&gt;</code> a ddiffinir yn <code>&lt;references&gt;</code>',
 	'cite_error_empty_references_define' => 'Does dim byd yn y tag <code>&lt;ref&gt;</code> a\'r enw "$1" arno, sydd wedi ei ddiffinio oddi mewn i dagiau <code>&lt;references&gt;</code>.',
+	'cite_references_link_accessibility_label' => 'Neidio am lan',
+	'cite_references_link_many_accessibility_label' => 'Neidio lan i:',
 );
 
 /** Danish (dansk)
  * @author Byrial
+ * @author Christian List
  * @author Emilkris33
  * @author Morten LJ
  * @author Peter Alberti
  */
 $messages['da'] = array(
 	'cite-desc' => 'Tilføjer <nowiki><ref[ name=id]></nowiki> og <nowiki><references/></nowiki>-elementer til referencer.',
-	'cite_croak' => 'Fejl i fodnotesystemet; $1: $2',
-	'cite_error_key_str_invalid' => 'Intern fejl: Ugyldig $str og/eller $key. Dette burde aldrig forekomme.',
-	'cite_error_stack_invalid_input' => 'Intern fejl: Ugyldig staknøgle. Dette burde aldrig forekomme.',
 	'cite_error' => 'Fodnotefejl: $1',
 	'cite_error_ref_numeric_key' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag; "name" kan ikke være et simpelt heltal, brug en beskrivende titel',
 	'cite_error_ref_no_key' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag: Et <code>&lt;ref&gt;</code>-tag uden indhold skal have et navn',
@@ -868,12 +840,14 @@ Definer flere i beskeden <nowiki>[[MediaWiki:$2]]</nowiki>.',
 	'cite_error_references_no_text' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag: Der er ikke specificeret nogen fodnotetekst til navnet <code>$1</code>',
 	'cite_error_included_ref' => 'Afsluttende <code>&lt;/ref&gt;</code> mangler for <code>&lt;ref&gt;</code>-tag',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-tags findes, men ingen <code>&lt;references/&gt;</code>-tag blev fundet',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-tags eksisterer for en gruppe betegnet "$1", men der blev ikke fundet et tilsvarende <code>&lt;references group="$1"/&gt;</code>-tag',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-tags eksisterer for en gruppe betegnet "$1", men der blev ikke fundet et tilsvarende <code>&lt;references group="$1"/&gt;</code>-tag, eller et afsluttende <code>&lt;/ref&gt;</code>-tag mangler',
 	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code>-tag inden i <code>&lt;references&gt;</code> har modstridende gruppe-attribut "$1".',
 	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code>-tag defineret inden i <code>&lt;references&gt;</code> har gruppe-attributten "$1", som ikke anvendes i den ovenstående tekst.',
 	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code>-tag med navn "$1" defineret inden i <code>&lt;references&gt;</code> anvendes ikke i den ovenstående tekst.',
 	'cite_error_references_no_key' => '<code>&lt;ref&gt;</code>-tag defineret inden i <code>&lt;references&gt;</code> har ikke en navne-attribut.',
 	'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code>-tag defineret inden i <code>&lt;references&gt;</code> med navnet "$1" har ikke noget indhold.',
+	'cite_references_link_accessibility_label' => 'Hoppe op',
+	'cite_references_link_many_accessibility_label' => 'Hoppe op til:',
 );
 
 /** German (Deutsch)
@@ -885,9 +859,6 @@ Definer flere i beskeden <nowiki>[[MediaWiki:$2]]</nowiki>.',
  */
 $messages['de'] = array(
 	'cite-desc' => 'Ergänzt die Tags <code><nowiki><ref[&nbsp;name=id]></nowiki></code> und <code><nowiki><references&nbsp;/></nowiki></code> für die Referenzierung von Wikiseiten',
-	'cite_croak' => 'Fehler im Referenzsystem. $1: $2',
-	'cite_error_key_str_invalid' => 'Interner Fehler: ungültiger $str und/oder $key. Dies sollte nicht passieren.',
-	'cite_error_stack_invalid_input' => 'Interner Fehler: ungültiger Schlüssel für den Stack. Dies sollte nicht passieren.',
 	'cite_error' => 'Referenzfehler: $1',
 	'cite_error_ref_numeric_key' => 'Ungültige Verwendung von <code>&lt;ref&gt;</code>: Der Parameter „name“ darf kein reiner Zahlenwert sein. Benutze einen beschreibenden Namen.',
 	'cite_error_ref_no_key' => 'Ungültige Verwendung von <code>&lt;ref&gt;</code>: Der Parameter „ref“ ohne Inhalt muss einen Namen haben.',
@@ -901,12 +872,14 @@ Ein Administrator muss weitere mit der Systemnachricht <nowiki>[[MediaWiki:$2]]<
 	'cite_error_references_no_text' => 'Es ist ein ungültiger <code>&lt;ref&gt;</code>-Tag vorhanden: Für die Referenz namens <code>$1</code> wurde kein Text angegeben.',
 	'cite_error_included_ref' => 'Für ein <code>&lt;ref&gt;</code>-Tag fehlt ein schließendes <code>&lt;/ref&gt;</code>-Tag.',
 	'cite_error_refs_without_references' => 'Es sind <code>&lt;ref&gt;</code>-Tags vorhanden, jedoch wurde kein <code>&lt;references /&gt;</code>-Tag gefunden.',
-	'cite_error_group_refs_without_references' => 'Es sind <code>&lt;ref&gt;</code>-Tags für die Gruppe „$1“ vorhanden, jedoch wurde kein dazugehöriges <code>&lt;references group="$1" /&gt;</code>-Tag gefunden.',
+	'cite_error_group_refs_without_references' => 'Es sind <code>&lt;ref&gt;</code>-Tags für die Gruppe „$1“ vorhanden, jedoch wurde kein dazugehöriges <code>&lt;references group="$1" /&gt;</code>-Tag gefunden oder ein schließendes <code>&lt;/ref&gt;</code> fehlt.',
 	'cite_error_references_group_mismatch' => 'Das <code>&lt;ref&gt;</code>-Tag in <code>&lt;references&gt;</code> enthält das kollidierende Attribut „$1“.',
 	'cite_error_references_missing_group' => 'Das in <code>&lt;references&gt;</code> definierte <code>&lt;ref&gt;</code>-Tag hat das Gruppenattribut „$1“, das nicht im vorausgehenden Text verwendet wird.',
 	'cite_error_references_missing_key' => 'Das in <code>&lt;references&gt;</code> definierte <code>&lt;ref&gt;</code>-Tag mit dem Namen „$1“ wird im vorausgehenden Text nicht verwendet.',
 	'cite_error_references_no_key' => 'Das in <code>&lt;references&gt;</code> definierte <code>&lt;ref&gt;</code>-Tag hat kein Namensattribut.',
 	'cite_error_empty_references_define' => 'Das in <code>&lt;references&gt;</code> definierte <code>&lt;ref&gt;</code>-Tag mit dem Namen „$1“ weist keinen Inhalt auf.',
+	'cite_references_link_accessibility_label' => 'Hochspringen',
+	'cite_references_link_many_accessibility_label' => 'Hochspringen nach:',
 );
 
 /** Swiss High German (Schweizer Hochdeutsch)
@@ -931,17 +904,11 @@ $messages['de-formal'] = array(
 /** Zazaki (Zazaki)
  * @author Aspar
  * @author Erdemaslancan
+ * @author Gorizon
  * @author Xoser
  */
 $messages['diq'] = array(
 	'cite-desc' => 'Qe çime mucnayîşî, etiketanê <nowiki><ref[ name=id]></nowiki> u <nowiki><references/></nowiki> de keno',
-	'cite_croak' => 'Çime nihebitiyeno; $1: $2',
-	'cite_error_key_str_invalid' => 'Ğeletê dehilî
-$str raşt niyo u/ya zi $key.
-Ena gani nibi.',
-	'cite_error_stack_invalid_input' => 'Ğeletê dehilî
-Stack key raşt niyo.
-Ena gani nibi.',
 	'cite_error' => 'Ğeletê çime mucnayîşî: $1',
 	'cite_error_ref_numeric_key' => 'Etiket <code>&lt;ref&gt;</code> ke raşt niyo;
 Name nieşkeno biyo yew rekam. Çekuyan binuse',
@@ -965,7 +932,7 @@ Zerre mesajê <nowiki>[[MediaWiki:$2]]</nowiki> de zafyer qise bike.',
 qe refs yew nuşte nidayiyo <code>$1</code>',
 	'cite_error_included_ref' => '<code>&lt;ref&gt;</code>Qandê etiketi <code>&lt;/ref&gt;</code> racnayış kemiyo',
 	'cite_error_refs_without_references' => 'etiketê <code>&lt;ref&gt;</code>î niesto, feqat  etiketê <code>&lt;references/&gt;</code>î nidiyo',
-	'cite_error_group_refs_without_references' => 'etiketê <code>&lt;ref&gt;</code>î niesto ser grupê $1î, feqat  etiketê <code>&lt;references/&gt;</code>î nidiyo',
+	'cite_error_group_refs_without_references' => 'etiketé <code>&lt;ref&gt;</code>i niesto ser grubé $1\'i, feqat  etiketé <code>&lt;references/&gt;</code>dé "$1"/&gt;nidiyo',
 	'cite_error_references_group_mismatch' => 'etiketê <code>&lt;ref&gt;</code>î, zerre <code>&lt;references/&gt;</code> de ser grupê "$1"î konflikt keno.',
 	'cite_error_references_missing_group' => 'etiketê <code>&lt;ref&gt;</code>î, zerre <code>&lt;references/&gt;</code> de tevsir biyo ke ser grupê "$1"î ke verni de nieseno.',
 	'cite_error_references_missing_key' => 'etiketê <code>&lt;ref&gt;</code>î, zerre <code>&lt;references/&gt;</code> de tevisr biyo ser name "$1"î verni de niesto.',
@@ -981,6 +948,8 @@ qe refs yew nuşte nidayiyo <code>$1</code>',
 	'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
 	'cite_references_link_many_sep' => '&#32;',
 	'cite_references_link_many_and' => '&#32;',
+	'cite_references_link_accessibility_label' => 'Ser çek',
+	'cite_references_link_many_accessibility_label' => 'Ser çek:',
 );
 
 /** Lower Sorbian (dolnoserbski)
@@ -988,9 +957,6 @@ qe refs yew nuşte nidayiyo <code>$1</code>',
  */
 $messages['dsb'] = array(
 	'cite-desc' => 'Pśidawa toflicce <nowiki><ref[ name=id]></nowiki> a <nowiki><references/></nowiki> za pódaśa zrědłow',
-	'cite_croak' => 'Zmólka w referencnem systemje. $1: $2',
-	'cite_error_key_str_invalid' => 'Interna zmólka: njpłaśiwy $str a/abo $key. To njaměło se staś.',
-	'cite_error_stack_invalid_input' => 'Interna zmólka: njepłaśiwy stackowy kluc. To njaměło se staś.',
 	'cite_error' => 'Referencna zmólka: $1',
 	'cite_error_ref_numeric_key' => 'Njepłaśiwa toflicka <code>&lt;ref&gt;</code>;
 mě njamóžo jadnora licba byś. Wužyj wugroniwy titel',
@@ -1014,58 +980,54 @@ Definěruj dalšne w powěsći <nowiki>[[MediaWiki:$2]]</nowiki>.',
 za ref z mjenim <code>$1</code> njejo se tekst pódał',
 	'cite_error_included_ref' => 'Kóńceca toflicka <code>&lt;/ref&gt;</code> felujo za toflicku <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Toflicki <code>&lt;ref&gt;</code> eksistěruju, ale toflicka <code>&lt;references/&gt;</code> njejo se namakała',
-	'cite_error_group_refs_without_references' => 'Toflicki <code>&lt;ref&gt;</code> eksistěruju za kupku z mjenim "$1", ale wótpowědujuca toflicka <code>&lt;references group="$1"/&gt;</code> njejo se namakała',
+	'cite_error_group_refs_without_references' => 'Toflicki <code>&lt;ref&gt;</code> eksistěruju za kupku z mjenim "$1", ale wótpowědujuca toflicka <code>&lt;references group="$1"/&gt;</code> njejo se namakała abo zacynjacy <code>&lt;/ref&gt;</code> felujo',
 	'cite_error_references_group_mismatch' => 'Toflicka <code>&lt;ref&gt;</code> w <code>&lt;references&gt;</code> jo ze kupkowym atributom "$1" w konflikśe.',
 	'cite_error_references_missing_group' => 'Toflicka <code>&lt;ref&gt;</code>, kótaraž jo w <code>&lt;references&gt;</code> definěrowana, ma kupkowy atribut "$1", kótaryž njepokazujo se w pjerwjejšnem teksće.',
 	'cite_error_references_missing_key' => 'Toflicka <code>&lt;ref&gt;</code> z mjenim "$1", kótaraž jo w <code>&lt;references&gt;</code> definěrowana, njewužywa se w pjerwjejšnem teksće.',
 	'cite_error_references_no_key' => 'Toflicka <code>&lt;ref&gt;</code>, kótaraž jo w <code>&lt;references&gt;</code> definěrowana, njama mjenjowy atribut.',
 	'cite_error_empty_references_define' => 'Toflicka <code>&lt;ref&gt;</code>, kótaraž jo w <code>&lt;references&gt;</code> z mjenim "$1" definěrowana, njama wopśimjeśe.',
+	'cite_references_link_accessibility_label' => 'Górjej skócyś',
+	'cite_references_link_many_accessibility_label' => 'Górjej skócys do:',
 );
 
 /** Greek (Ελληνικά)
  * @author Consta
  * @author Omnipaedista
+ * @author Protnet
  * @author ZaDiak
  * @author Απεργός
  */
 $messages['el'] = array(
-	'cite-desc' => 'Προσθέτει τα <ref[ name="id"]> και <references/> για τις παραπομπές.',
-	'cite_croak' => 'Η παραπομπή οδηγεί σε αδιέξοδο; $1: $2',
-	'cite_error_key_str_invalid' => 'Εσωτερικό σφάλμα·
-μη έγκυρο $str και/ή $key.
-Αυτό δεν θα έπρεπε να συμβαίνει.',
-	'cite_error_stack_invalid_input' => 'Εσωτερικό σφάλμα·
-μη έγκυρο κλειδί στοίβας.
-Αυτό δεν θα έπρεπε να συμβαίνει.',
-	'cite_error' => 'Σφάλμα αναφοράς: $1',
-	'cite_error_ref_numeric_key' => 'Μη έγκυρη <code>&lt;ref&gt;</code> ετικέτα·
-το όνομα δεν μπορεί να είναι ένας απλός ακέραιος. Χρησιμοποιήστε έναν περιγραφικό τίτλο',
-	'cite_error_ref_no_key' => 'Άκυρη <code>&lt;ref&gt;</code> ετικέτα·
-παραπομπές χωρίς περιεχομένο πρέπει να έχουν ένα όνομα',
-	'cite_error_ref_too_many_keys' => 'Μη έγκυρη <code>&lt;ref&gt;</code> ετικέτα;
+	'cite-desc' => 'Προσθέτει τις ετικέτες <nowiki><ref[ name=id]></nowiki> και <nowiki><references/></nowiki>, για παραπομπές.',
+	'cite_error' => 'Σφάλμα παραπομπής: $1',
+	'cite_error_ref_numeric_key' => 'Μη έγκυρη ετικέτα <code>&lt;ref&gt;</code>·
+το όνομα δεν μπορεί να είναι απλός ακέραιος. Χρησιμοποιήστε έναν περιγραφικό τίτλο',
+	'cite_error_ref_no_key' => 'Μη έγκυρη ετικέτα <code>&lt;ref&gt;</code>·
+παραπομπές χωρίς περιεχόμενο πρέπει να έχουν όνομα',
+	'cite_error_ref_too_many_keys' => 'Μη έγκυρη ετικέτα <code>&lt;ref&gt;</code>·
 μη έγκυρα ονόματα, π.χ. πάρα πολλά',
-	'cite_error_ref_no_input' => 'Μη έγκυρη <code>&lt;ref&gt;</code> ετικέτα;
+	'cite_error_ref_no_input' => 'Μη έγκυρη ετικέτα <code>&lt;ref&gt;</code>·
 οι παραπομπές χωρίς όνομα πρέπει να έχουν περιεχόμενο',
-	'cite_error_references_invalid_parameters' => 'Μη έγκυρη <code>&lt;references&gt;</code> ετικέτα;
+	'cite_error_references_invalid_parameters' => 'Μη έγκυρη ετικέτα <code>&lt;references&gt;</code>·
 δεν επιτρέπονται παράμετροι.
-Χρησιμοποιήστε το <code>&lt;references /&gt;</code>',
-	'cite_error_references_invalid_parameters_group' => 'Μη έγκυρη <code>&lt;references&gt;</code> ετικέτα;
-μόνο η παράμετρος "group" επιτρέπεται.
-Χρησιμοποιείστε το <code>&lt;references /&gt;</code>, ή το <code>&lt;references group="..." /&gt;</code>',
+Χρησιμοποιήστε <code>&lt;references /&gt;</code>',
+	'cite_error_references_invalid_parameters_group' => 'Μη έγκυρη ετικέτα <code>&lt;references&gt;</code>·
+μόνο η παράμετρος «group» επιτρέπεται.
+Χρησιμοποιείστε <code>&lt;references /&gt;</code>, ή <code>&lt;references group="..." /&gt;</code>',
 	'cite_error_references_no_backlink_label' => 'Εξαντλήθηκαν οι ειδικές ετικέτες συνδέσμων προς το κείμενο.
-Καθορισμός περισσότερων στο μήνυμα <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+Καθορισμός περισσότερων στο μήνυμα <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>.',
 	'cite_error_no_link_label_group' => 'Εξαντλήθηκαν οι ειδικές ετικέτες συνδέσμων για την ομάδα «$1».
-Καθορισμός περισσότερων στο μήνυμα <nowiki>[[MediaWiki:$2]]</nowiki>',
-	'cite_error_references_no_text' => 'Άκυρο <code>&lt;ref&gt;</code> tag.
-Δεν δίνεται κείμενο για αναφορές με το όνομα <code>$1</code>',
-	'cite_error_included_ref' => 'Υπολείπεται η κατάληξη <code>&lt;/ref&gt;</code> για την ετικέτα <code>&lt;ref&gt;</code>',
-	'cite_error_refs_without_references' => 'Υπάρχουν ετικέτες <code>&lt;ref&gt;</code>, αλλά καμία ετικέτα <code>&lt;references/&gt;</code> δεν βρέθηκε.',
-	'cite_error_group_refs_without_references' => 'Υπάρχουν ετικέτες <code>&lt;ref&gt;</code> για μία ομάδα με το όνομα «$1», αλλά καμία αντίστοιχη ετικέτα <code>&lt;references group="$1"/&gt;</code> δεν βρέθηκε.',
-	'cite_error_references_group_mismatch' => 'Η ετικέτα <code>&lt;ref&gt;</code> στο <code>&lt;references&gt;</code> έρχεται σε σύγκρουση με το κατηγορούμενο "$1".',
-	'cite_error_references_missing_group' => 'Η <code>&lt;ref&gt;</code> ετικέτα που ορίζεται στο <code>&lt;references&gt;</code> έχει κατηγορούμενο ομάδας "$1" που δεν εμφανίζεται σε προηγούμενο κείμενο.',
-	'cite_error_references_missing_key' => 'Η <code>&lt;ref&gt;</code> ετικέτα με το όνομα "$1" που ορίζεται στο <code>&lt;references&gt;</code> δεν χρησιμοποιείται στο προηγούμενο κείμενο.',
-	'cite_error_references_no_key' => 'Η <code>&lt;ref&gt;</code> ετικέτα που ορίζεται στο <code>&lt;references&gt;</code> δεν έχει κατηγορούμενο ονόματος.',
-	'cite_error_empty_references_define' => 'Η <code>&lt;ref&gt;</code> ετικέτα που ορίζεται στο <code>&lt;references&gt;</code> με το όνομα "$1" δεν έχει καθόλου περιεχόμενο.',
+Καθορισμός περισσότερων στο μήνυμα <nowiki>[[MediaWiki:$2]]</nowiki>.',
+	'cite_error_references_no_text' => 'Μη έγκυρη ετικέτα <code>&lt;ref&gt;</code>·
+δεν δίνεται κείμενο για παραπομπές με όνομα <code>$1</code>',
+	'cite_error_included_ref' => 'Λείπει η ετικέτα κλεισίματος <code>&lt;/ref&gt;</code> για την ετικέτα <code>&lt;ref&gt;</code>',
+	'cite_error_refs_without_references' => 'Υπάρχουν ετικέτες <code>&lt;ref&gt;</code>, αλλά δεν βρέθηκε ετικέτα <code>&lt;references/&gt;</code>.',
+	'cite_error_group_refs_without_references' => 'Υπάρχουν ετικέτες <code>&lt;ref&gt;</code> για μία ομάδα με το όνομα «$1», αλλά καμία αντίστοιχη ετικέτα <code>&lt;references group="$1"/&gt;</code> δεν βρέθηκε.', # Fuzzy
+	'cite_error_references_group_mismatch' => 'Η ετικέτα <code>&lt;ref&gt;</code> μέσα στο <code>&lt;references&gt;</code> έρχεται σε σύγκρουση με το χαρακτηριστικό ομαδοποίησης «$1».',
+	'cite_error_references_missing_group' => 'Η ετικέτα <code>&lt;ref&gt;</code> που ορίζεται μέσα στο <code>&lt;references&gt;</code> έχει χαρακτηριστικό ομαδοποίησης «$1» που δεν εμφανίζεται σε προηγούμενο κείμενο.',
+	'cite_error_references_missing_key' => 'Η ετικέτα <code>&lt;ref&gt;</code> με όνομα «$1» που ορίζεται μέσα στο <code>&lt;references&gt;</code> δεν χρησιμοποιείται σε προηγούμενο κείμενο.',
+	'cite_error_references_no_key' => 'Η ετικέτα <code>&lt;ref&gt;</code> που ορίζεται μέσα στο <code>&lt;references&gt;</code> δεν έχει χαρακτηριστικό ονόματος.',
+	'cite_error_empty_references_define' => 'Η ετικέτα <code>&lt;ref&gt;</code> που ορίζεται μέσα στο <code>&lt;references&gt;</code> με όνομα «$1» δεν έχει καθόλου περιεχόμενο.',
 );
 
 /** Esperanto (Esperanto)
@@ -1075,13 +1037,6 @@ $messages['el'] = array(
  */
 $messages['eo'] = array(
 	'cite-desc' => 'Aldonas etikedojn <nowiki><ref[ name=id]></nowiki> kaj <nowiki><references/></nowiki> por citaĵoj',
-	'cite_croak' => 'Cito mortis; $1: $2',
-	'cite_error_key_str_invalid' => 'Interna eraro;
-malvalida $str kaj/aŭ $key.
-Ĉi tio neniam okazos.',
-	'cite_error_stack_invalid_input' => 'Interna eraro;
-malvalida staka ŝlosilo.
-Ĉi tio verŝajne neniam okazus.',
 	'cite_error' => 'Citaĵa eraro: $1',
 	'cite_error_ref_numeric_key' => 'Malvalida etikedo <code>&lt;ref&gt;</code>;
 nomo ne povas esti simpla entjero. Uzu priskriban titolon.',
@@ -1103,7 +1058,7 @@ Difinu pliajn en la <nowiki>[[MediaWiki:$2]]</nowiki> mesaĝo.',
 neniu teksto estis donita por ref-oj nomataj <code>$1</code>',
 	'cite_error_included_ref' => 'Ferma <code>&lt;/ref&gt;</code> mankas por <code>&lt;ref&gt;</code>-etikedo',
 	'cite_error_refs_without_references' => 'Etikedoj <code>&lt;ref&gt;</code> ekzistas, sed neniu etikedo <code>&lt;references/&gt;</code> estis trovita',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> etikedoj ekzistas por grupo nomita "$1", sed ne koresponda <code>&lt;references group="$1"/&gt;</code> etikedo estis trovita',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> etikedoj ekzistas por grupo nomita "$1", sed ne koresponda <code>&lt;references group="$1"/&gt;</code> etikedo estis trovita', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> etikedo en <code>&lt;references&gt;</code> havas konflikan grupatributon "$1".',
 	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> etikedo difinita en <code>&lt;references&gt;</code> havas grupatributon "$1" kiu ne aperas en antaŭa teksto.',
 	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> etikedo kun la nomo "$1" difinita en <code>&lt;references&gt;</code> ne estas uzata en antaŭa teksto.',
@@ -1117,7 +1072,9 @@ neniu teksto estis donita por ref-oj nomataj <code>$1</code>',
  * @author Crazymadlover
  * @author Drini
  * @author Erdemaslancan
+ * @author Fitoschido
  * @author Gustronico
+ * @author Ihojose
  * @author Locos epraix
  * @author Manuelt15
  * @author McDutchie
@@ -1128,13 +1085,6 @@ neniu teksto estis donita por ref-oj nomataj <code>$1</code>',
  */
 $messages['es'] = array(
 	'cite-desc' => 'Añade las etiquietas <nowiki><ref[ name=id]> y <references /></nowiki> para utilizar notas al pie.',
-	'cite_croak' => "La extensión ''Cite'' se murió; $1: $2",
-	'cite_error_key_str_invalid' => 'Error interno;
-$str o $key no válidos.
-Esto no debería ocurrir.',
-	'cite_error_stack_invalid_input' => 'Error interno;
-la clave de la pila no es válida.
-Esto nunca debe ocurrir.',
 	'cite_error' => 'Error en la cita: $1',
 	'cite_error_ref_numeric_key' => 'Etiqueta <code>&lt;ref&gt;</code> no válida;
 el nombre no puede ser un número entero. Use un título descriptivo',
@@ -1158,13 +1108,15 @@ Define más en el mensaje <nowiki>[[MediaWiki:$2]]</nowiki>.',
 no se ha definido el contenido de las referencias llamadas <code>$1</code>',
 	'cite_error_included_ref' => 'Etiqueta de apertura <code>&lt;ref&gt;</code> sin su correspondiente cierre <code>&lt;/ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code>, pero no se encontró una etiqueta <code>&lt;references /&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code> para un grupo llamado "$1", pero no se encontró una etiqueta <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'Existen etiquetas <code>&lt;ref&gt;</code> para un grupo llamado «$1», pero no se encontró la etiqueta <code>&lt;references group="$1"/&gt;</code> correspondiente, o falta la etiqueta <code>&lt;/ref&gt;</code> de cierre',
 	'cite_error_references_group_mismatch' => 'La etiqueta <code>&lt;ref&gt;</code> en <code>&lt;references&gt;</code> presenta el atributo de grupo "$1" en conflicto.',
 	'cite_error_references_missing_group' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> pertenece al grupo "$1" no declarado en el texto precedente.',
 	'cite_error_references_missing_key' => 'La etiqueta <code>&lt;ref&gt;</code> con nombre "$1" definida en <code>&lt;references&gt;</code> no se utiliza en el texto precedente.',
 	'cite_error_references_no_key' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> no tiene atributo de nombre.',
 	'cite_error_empty_references_define' => 'La etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> con nombre "$1" no tiene contenido.',
 	'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+	'cite_references_link_accessibility_label' => 'Ir a',
+	'cite_references_link_many_accessibility_label' => 'Ir a:',
 );
 
 /** Estonian (eesti)
@@ -1172,13 +1124,6 @@ no se ha definido el contenido de las referencias llamadas <code>$1</code>',
  */
 $messages['et'] = array(
 	'cite-desc' => 'Lisab viitamiseks sildid <nowiki><ref[ name=id]></nowiki> ja <nowiki><references/></nowiki>.',
-	'cite_croak' => 'Viide ütles üles; $1: $2',
-	'cite_error_key_str_invalid' => 'Sisetõrge;
-vigane $str ja/või $key.
-Seda ei tohiks esineda.',
-	'cite_error_stack_invalid_input' => 'Sisetõrge;
-vigane pinuvõti.
-Seda ei tohiks esineda.',
 	'cite_error' => 'Viitamistõrge: $1',
 	'cite_error_ref_numeric_key' => 'Vigane <code>&lt;ref&gt;</code>-silt.
 Nimi ei või olla numbriline. Kasuta kirjeldavat nime.',
@@ -1202,7 +1147,7 @@ Lisa neid sõnumisse <nowiki>[[MediaWiki:$2]]</nowiki>.',
 Viite nimega <code>$1</code> tekst puudub.',
 	'cite_error_included_ref' => 'Sulgemissilt <code>&lt;/ref&gt;</code> puudub.',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-sildid on olemas, aga <code>&lt;references/&gt;</code>-silt puudub.',
-	'cite_error_group_refs_without_references' => 'Olemas on <code>&lt;ref&gt;</code>-silt rühma "$1" jaoks, aga vastav <code>&lt;references group="$1"/&gt;</code>-silt puudub.',
+	'cite_error_group_refs_without_references' => 'Olemas on <code>&lt;ref&gt;</code>-silt rühma "$1" jaoks, aga puudub vastav silt <code>&lt;references group="$1"/&gt;</code> või lõpusilt <code>&lt;/ref&gt;</code>.',
 	'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>-siltide vahel oleval <code>&lt;ref&gt;</code>-sildil on vastukäiv parameetri "group" väärtus "$1".',
 	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>-sildis kirjeldatud <code>&lt;ref&gt;</code>-sildil on rühmatunnus "$1", mis puudub eelnevas tekstis.',
 	'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>-siltide vahel olevat <code>&lt;ref&gt;</code>-silti nimega "$1" ei kasutata eelnevas tekstis.',
@@ -1215,7 +1160,6 @@ Viite nimega <code>$1</code> tekst puudub.',
  */
 $messages['eu'] = array(
 	'cite-desc' => '<nowiki><ref[ name=id]></nowiki> eta <nowiki><references/></nowiki> etiketak gehitzen ditu, aipuentzako',
-	'cite_croak' => 'Hildako aipua; $1: $2',
 	'cite_error' => 'Aipamen errorea: $1',
 );
 
@@ -1227,25 +1171,22 @@ $messages['eu'] = array(
  */
 $messages['fa'] = array(
 	'cite-desc' => 'برچسب‌های <nowiki><ref[ name=id]></nowiki> و <nowiki><references/></nowiki> را برای یادکرد اضافه می‌کند',
-	'cite_croak' => 'یادکرد خراب شد؛ $1: $2',
-	'cite_error_key_str_invalid' => 'خطای داخلی؛ $str و/یا $key غیر مجاز. این خطا نباید هرگز رخ دهد.',
-	'cite_error_stack_invalid_input' => 'خطای داخلی؛ کلید پشته غیرمجاز.  این خطا نباید هرگز رخ دهد.',
 	'cite_error' => 'خطای یادکرد: $1',
-	'cite_error_ref_numeric_key' => 'برچسب <code><ref></code> غیرمجاز؛ نام نمی‌تواند یک عدد باشد. عنوان واضح‌تری را برگزینید',
-	'cite_error_ref_no_key' => 'برچسب <code><ref></code> غیرمجاز؛ یادکردهای بدون محتوا باید نام داشته باشند',
-	'cite_error_ref_too_many_keys' => 'برچسب <code><ref></code> غیرمجاز؛ نام‌های غیرمجاز یا بیش از اندازه',
-	'cite_error_ref_no_input' => 'برچسب <code><ref></code> غیرمجاز؛ یادکردهای بدون نام باید محتوا داشته باشند',
-	'cite_error_references_invalid_parameters' => 'برچسب <code><references></code> غیرمجاز؛ استفاده از پارامتر مجاز است. از <code><references /></code> استفاده کنید',
-	'cite_error_references_invalid_parameters_group' => 'برچسب <code>&lt;references&gt;</code> غیر مجاز؛ تنها پارامتر «group» قابل استفاده است.
+	'cite_error_ref_numeric_key' => 'برچسب <code><ref></code> نامجاز؛ نام نمی‌تواند یک عدد باشد. عنوان واضح‌تری را برگزینید',
+	'cite_error_ref_no_key' => 'برچسب <code><ref></code> نامجاز؛ یادکردهای بدون محتوا باید نام داشته باشند',
+	'cite_error_ref_too_many_keys' => 'برچسب <code><ref></code> نامجاز؛ نام‌های نامجاز یا بیش از اندازه',
+	'cite_error_ref_no_input' => 'برچسب <code><ref></code> نامجاز؛ یادکردهای بدون نام باید محتوا داشته باشند',
+	'cite_error_references_invalid_parameters' => 'برچسب <code><references></code> نامجاز؛ استفاده از پارامتر مجاز است. از <code><references /></code> استفاده کنید',
+	'cite_error_references_invalid_parameters_group' => 'برچسب <code>&lt;references&gt;</code> نامجاز؛ تنها پارامتر «group» قابل استفاده است.
 از <code>&lt;references /&gt;</code> یا <code>&lt;references group="..." /&gt;</code> استفاده کنید',
 	'cite_error_references_no_backlink_label' => 'برچسب‌های پیوند به انتها رسید.
 موارد جدیدی را در پیغام <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> تعریف کنید',
 	'cite_error_no_link_label_group' => 'از برچسب‌های پیوند سفارشی برای گروه «$1» خارج شد.
 در پیغام <nowiki>[[MediaWiki:$2]]</nowiki> بیشتر تعریف کنید.',
-	'cite_error_references_no_text' => 'برچسب <code><ref></code> غیرمجاز؛ متنی برای یادکردهای با نام <code>$1</code> وارد نشده‌است',
+	'cite_error_references_no_text' => 'برچسب <code><ref></code> نامجاز؛ متنی برای یادکردهای با نام <code>$1</code> وارد نشده‌است',
 	'cite_error_included_ref' => 'برچسب تمام کنندهٔ <code>&lt;/ref&gt;</code> بدون برچسب <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'برچسب <code>&lt;ref&gt;</code> وجود دارد اما برچسب <code>&lt;references/&gt;</code> پیدا نشد',
-	'cite_error_group_refs_without_references' => 'برچسب <code>&lt;ref&gt;</code> برای گروهی به نام «$1» وجود دارد، اما برچسب <code>&lt;references group="$1"/&gt;</code> متناظر پیدا نشد',
+	'cite_error_group_refs_without_references' => 'برچسب <code>&lt;ref&gt;</code> برای گروهی به نام «$1» وجود دارد، اما برچسب متناظر با <code>&lt;references group="$1"/&gt;</code> یافت نشد یا <code>&lt;/ref&gt;</code> بسته جا گذاشته شده‌است.',
 	'cite_error_references_group_mismatch' => 'برچسپ <code>&lt;ref&gt;</code> درون <code>&lt;references&gt;</code> در تضاد با ویژگی‌های گروه «$1» است.',
 	'cite_error_references_missing_group' => 'برچسپ <code>&lt;ref&gt;</code> در <code>&lt;references&gt;</code> تعریف شده، ویژگی‌های گروهی «$1» را دارد که درون متن قبل از آن ظاهر نمی‌شود.',
 	'cite_error_references_missing_key' => 'پرچسپ <code>&lt;ref&gt;</code> که با نام «$1» درون <code>&lt;references&gt;</code> تعریف شده، در متن قبل از آن استفاده نشده‌است.',
@@ -1253,6 +1194,8 @@ $messages['fa'] = array(
 	'cite_error_empty_references_define' => 'برچسپ <code>&lt;ref&gt;</code> تعریف شده درون <code>&lt;references&gt;</code> با نام «$1» محتوایی ندارد.',
 	'cite_reference_link_key_with_num' => '$1_$2',
 	'cite_reference_link_prefix' => 'cite_ref-',
+	'cite_references_link_accessibility_label' => 'پرش به بالا',
+	'cite_references_link_many_accessibility_label' => 'پرش به بالا به:',
 );
 
 /** Finnish (suomi)
@@ -1266,9 +1209,6 @@ $messages['fa'] = array(
  */
 $messages['fi'] = array(
 	'cite-desc' => 'Tarjoaa <nowiki><ref[ name=id]></nowiki>- ja <nowiki><references/></nowiki>-elementit viittauksien tekemiseen.',
-	'cite_croak' => 'Virhe viittausjärjestelmässä: $1: $2',
-	'cite_error_key_str_invalid' => 'Sisäinen virhe: kelpaamaton $str ja/tai $key.',
-	'cite_error_stack_invalid_input' => 'Sisäinen virhe: kelpaamaton pinoavain.',
 	'cite_error' => 'Viittausvirhe: $1',
 	'cite_error_ref_numeric_key' => 'Kelpaamaton <code>&lt;ref&gt;</code>-elementti: nimi ei voi olla numero – käytä kuvaavampaa nimeä.',
 	'cite_error_ref_no_key' => 'Kelpaamaton <code>&lt;ref&gt;</code>-elementti: sisällöttömille refeille pitää määrittää nimi.',
@@ -1284,7 +1224,7 @@ Määritä niitä lisää viestissä <nowiki>[[MediaWiki:$2]]</nowiki>.',
 viitettä <code>$1</code> ei löytynyt',
 	'cite_error_included_ref' => '<code>&lt;ref&gt;</code>-elementin sulkeva <code>&lt;/ref&gt;</code>-elementti puuttuu',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-elementti löytyy, mutta <code>&lt;references/&gt;</code>-elementtiä ei löydy',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-elementit löytyivät ryhmälle nimeltä ”$1”, mutta vastaavaa <code>&lt;references group="$1"/&gt;</code>-elementtiä ei löytynyt',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-elementit löytyivät ryhmälle nimeltä ”$1”, mutta vastaavaa <code>&lt;references group="$1"/&gt;</code>-elementtiä ei löytynyt', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code>-elementti <code>&lt;references&gt;</code>-elementin sisällä sisältää ristiriitaisen ryhmämääritteen ”$1”.',
 	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>-elementissä määritetty <code>&lt;ref&gt;</code>-elementti sisältää ryhmämääritteen ”$1”, jota ei mainita aiemmassa tekstissä.',
 	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code>-elementin nimeä ”$1”, johon viitataan elementissä <code>&lt;references&gt;</code> ei käytetä edeltävässä tekstissä.',
@@ -1298,12 +1238,13 @@ viitettä <code>$1</code> ei löytynyt',
 $messages['fo'] = array(
 	'cite-desc' => 'Leggur afturat <nowiki><ref[ name=id]></nowiki> og <nowiki><references/></nowiki> lyklaorð, fyri ávísingar',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> lyklaorð eru til, men onki <code>&lt;references/&gt;</code> lyklaorð (tag) varð funnið',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> lyklaorð (tags) eru til fyri ein bólk sum eitur "$1", men onki tilsvarandi <code>&lt;references group="$1"/&gt;</code> lyklaorð varð funnið',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> lyklaorð (tags) eru til fyri ein bólk sum eitur "$1", men onki tilsvarandi <code>&lt;references group="$1"/&gt;</code> lyklaorð varð funnið, ella manglar ein lukkandi <code>&lt;/ref&gt;</code>',
 );
 
 /** French (français)
  * @author Cedric31
  * @author Crochet.david
+ * @author Gomoko
  * @author Grondin
  * @author IAlex
  * @author Kropotkine 113
@@ -1311,17 +1252,11 @@ $messages['fo'] = array(
  * @author Sherbrooke
  * @author The Evil IP address
  * @author Trizek
+ * @author Urhixidur
  * @author Verdy p
  */
 $messages['fr'] = array(
 	'cite-desc' => 'Ajoute les balises <nowiki><ref[ name="id"]></nowiki> et <nowiki><references/></nowiki> pour les références et notes de bas de page.',
-	'cite_croak' => 'Référence en impasse ; $1 : $2',
-	'cite_error_key_str_invalid' => 'Erreur interne ;
-$str ou $key invalides.
-Ceci ne devrait jamais se produire.',
-	'cite_error_stack_invalid_input' => 'Erreur interne ;
-clé de pile invalide.
-Ceci ne devrait jamais se produire.',
 	'cite_error' => 'Erreur de référence : $1',
 	'cite_error_ref_numeric_key' => 'Balise <code>&lt;ref&gt;</code> incorrecte ;
 le nom ne peut être un entier simple. Utilisez un titre descriptif.',
@@ -1345,14 +1280,16 @@ Définissez-en plus dans le message <nowiki>[[MediaWiki:$2]]</nowiki>.',
 aucun texte n’a été fourni pour les références nommées <code>$1</code>.',
 	'cite_error_included_ref' => 'Clôture <code>&lt;/ref&gt;</code> manquante pour la balise <code>&lt;ref&gt;</code>.',
 	'cite_error_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> existent, mais aucune balise <code>&lt;references/&gt;</code> n’a été trouvée.',
-	'cite_error_group_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> existent pour un groupe nommé « $1 », mais aucune balise <code>&lt;references group="$1"/&gt;</code> correspondante n’a été trouvée.',
+	'cite_error_group_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> existent pour un groupe nommé « $1 », mais aucune balise <code>&lt;references group="$1"/&gt;</code> correspondante n’a été trouvée, ou bien une valise fermante <code>&lt;/ref&gt;</code> manque.',
 	'cite_error_references_group_mismatch' => 'La balise <code>&lt;ref&gt;</code> dans <code>&lt;references&gt;</code> a l’attribut de groupe « $1 » qui entre en conflit avec celui de <code>&lt;references&gt;</code>.',
 	'cite_error_references_missing_group' => 'La balise <code>&lt;ref&gt;</code> définie dans <code>&lt;references&gt;</code> a un groupe attribué « $1 » qui ne figure pas dans le texte précédent.',
 	'cite_error_references_missing_key' => 'La balise <code>&lt;ref&gt;</code> avec le nom « $1 » définie dans <code>&lt;references&gt;</code> n’est pas utilisé dans le texte précédent.',
-	'cite_error_references_no_key' => "La balise <code>&lt;ref&gt;</code> définie dans <code>&lt;references&gt;</code> n’a pas d'attribut de nom.",
+	'cite_error_references_no_key' => 'La balise <code>&lt;ref&gt;</code> définie dans <code>&lt;references&gt;</code> n’a pas d’attribut de nom.',
 	'cite_error_empty_references_define' => 'La balise <code>&lt;ref&gt;</code> défini dans <code>&lt;references&gt;</code> avec le nom « $1 » n’a pas de contenu.',
 	'cite_references_link_many_sep' => ',&#32;',
 	'cite_references_link_many_and' => '&#32;et&#32;',
+	'cite_references_link_accessibility_label' => 'Aller',
+	'cite_references_link_many_accessibility_label' => 'Aller à :',
 );
 
 /** Franco-Provençal (arpetan)
@@ -1360,9 +1297,6 @@ aucun texte n’a été fourni pour les références nommées <code>$1</code>.',
  */
 $messages['frp'] = array(
 	'cite-desc' => 'Apond les balises <nowiki><ref[ name=id]></nowiki> et <nowiki><references/></nowiki>, por les citacions.',
-	'cite_croak' => 'Citacion corrompua ; $1 : $2',
-	'cite_error_key_str_invalid' => 'Èrror de dedens ; $str atendua.',
-	'cite_error_stack_invalid_input' => 'Èrror de dedens ; cllâf de pila envalida.',
 	'cite_error' => 'Èrror de citacion $1',
 	'cite_error_ref_numeric_key' => 'Apèl envalido ; cllâf pas entègrâla atendua.',
 	'cite_error_ref_no_key' => 'Balisa <code>&lt;ref&gt;</code> fôssa ;
@@ -1382,7 +1316,7 @@ Dèfenésséd-nen més dens lo mèssâjo <nowiki>[[MediaWiki:$2]]</nowiki>.',
 nion tèxto at étâ balyê por les refèrences apelâs <code>$1</code>.',
 	'cite_error_included_ref' => 'Cllotura <code>&lt;/ref&gt;</code> manquenta por la balisa <code>&lt;ref&gt;</code>.',
 	'cite_error_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> ègzistont, mas niona balisa <code>&lt;references/&gt;</code> at étâ trovâ.',
-	'cite_error_group_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> ègzistont por una tropa apelâ « $1 », mas niona balisa <code>&lt;references group="$1"/&gt;</code> que corrèspond at étâ trovâ.',
+	'cite_error_group_refs_without_references' => 'Des balises <code>&lt;ref&gt;</code> ègzistont por una tropa apelâ « $1 », mas niona balisa <code>&lt;references group="$1"/&gt;</code> que corrèspond at étâ trovâ.', # Fuzzy
 	'cite_error_references_group_mismatch' => 'La balisa <code>&lt;ref&gt;</code> dens <code>&lt;references&gt;</code> at l’atribut de tropa « $1 » qu’entre en conflit avouéc celi de <code>&lt;references&gt;</code>.',
 	'cite_error_references_missing_group' => 'La balisa <code>&lt;ref&gt;</code> dèfenia dens <code>&lt;references&gt;</code> at l’atribut de tropa « $1 » que figure pas dens cél tèxto.',
 	'cite_error_references_missing_key' => 'La balisa <code>&lt;ref&gt;</code> avouéc lo nom « $1 » dèfenia dens <code>&lt;references&gt;</code> est pas utilisâ dens cél tèxto.',
@@ -1413,9 +1347,6 @@ $messages['gag'] = array(
  */
 $messages['gl'] = array(
 	'cite-desc' => 'Engade as etiquetas <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> para as citas',
-	'cite_croak' => 'Cita morta; $1: $2',
-	'cite_error_key_str_invalid' => 'Erro interno; $str e/ou $key inválidos. Isto non debera ocorrer.',
-	'cite_error_stack_invalid_input' => 'Erro interno; stack key inválido. Isto non debera ocorrer.',
 	'cite_error' => 'Erro no código da cita: $1',
 	'cite_error_ref_numeric_key' => 'Etiqueta <code>&lt;ref&gt;</code> non válida;
 o nome non pode ser un simple número enteiro. Use un título descritivo',
@@ -1439,12 +1370,14 @@ Defina máis na mensaxe <nowiki>[[MediaWiki:$2]]</nowiki>.',
 non se forneceu texto para as referencias de nome <code>$1</code>',
 	'cite_error_included_ref' => 'Peche a etiqueta <code>&lt;/ref&gt;</code> que lle falta á outra etiqueta <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'As etiquetas <code>&lt;ref&gt;</code> existen, pero non se atopou ningunha etiqueta <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'As etiquetas <code>&lt;ref&gt;</code> existen para un grupo chamado "$1", pero non se atopou a etiqueta <code>&lt;references group="$1"/&gt;</code> correspondente',
+	'cite_error_group_refs_without_references' => 'As etiquetas <code>&lt;ref&gt;</code> existen para un grupo chamado "$1", pero non se atopou a etiqueta <code>&lt;references group="$1"/&gt;</code> correspondente ou falta unha etiqueta <code>&lt;/ref&gt;</code> de peche',
 	'cite_error_references_group_mismatch' => 'A etiqueta <code>&lt;ref&gt;</code> en <code>&lt;references&gt;</code> ten un atributo de grupo conflitivo "$1".',
 	'cite_error_references_missing_group' => 'A etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> ten un atributo de grupo "$1" que non aparece no texto anterior.',
 	'cite_error_references_missing_key' => 'A etiqueta <code>&lt;ref&gt;</code> co nome "$1" definida en <code>&lt;references&gt;</code> non se utiliza no texto anterior.',
 	'cite_error_references_no_key' => 'A etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> non ten nome de atributo.',
 	'cite_error_empty_references_define' => 'A etiqueta <code>&lt;ref&gt;</code> definida en <code>&lt;references&gt;</code> co nome "$1" non ten contido.',
+	'cite_references_link_accessibility_label' => 'Saltar a',
+	'cite_references_link_many_accessibility_label' => 'Saltar a:',
 );
 
 /** Ancient Greek (Ἀρχαία ἑλληνικὴ)
@@ -1460,9 +1393,6 @@ $messages['grc'] = array(
  */
 $messages['gsw'] = array(
 	'cite-desc' => 'Ergänzt d <nowiki><ref[ name=id]></nowiki> un d <nowiki><references /></nowiki>-Tag fir Quällenochwyys',
-	'cite_croak' => 'Fähler im Referenz-Syschtem. $1: $2',
-	'cite_error_key_str_invalid' => 'Intärne Fähler: uugiltige $str un/oder $key. Des sott eigetli gar nit chenne gschäh.',
-	'cite_error_stack_invalid_input' => 'Intärne Fähler: uugiltige „name“-stack. Des sott eigetli gar nit chenne gschäh.',
 	'cite_error' => 'Referänz-Fähler: $1',
 	'cite_error_ref_numeric_key' => 'Uugiltigi <tt>&lt;ref&gt;</tt>-Verwändig: „name“ derf kei reine Zahlewärt syy, verwänd e Name wu bschrybt.',
 	'cite_error_ref_no_key' => 'Uugiltigi <tt>&lt;ref&gt;</tt>-Verwändig: „ref“ ohni Inhalt muess e Name haa.',
@@ -1476,7 +1406,7 @@ Definier meh unter Systemnochricht <nowiki>[[MediaWiki:$2]]</nowiki>.',
 	'cite_error_references_no_text' => 'Uugiltige <tt>&lt;ref&gt;</tt>-Tag; s isch kei Täxt fir s Ref mit em Name <tt>$1</tt> aagee wore.',
 	'cite_error_included_ref' => 'S fählt s schließend <code>&lt;/ref&gt;</code>',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-Tag git s, aber s isch kei <code>&lt;references/&gt;</code>-Tag gfunde wore.',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tag git s fir d Grupp „$1“, aber s isch kei dezue gherig <code>&lt;references group=„$1“/&gt;</code>-Tag gfunde wore',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tag git s fir d Grupp „$1“, aber s isch kei dezue gherig <code>&lt;references group=„$1“/&gt;</code>-Tag gfunde wore', # Fuzzy
 	'cite_error_references_group_mismatch' => 'Im <code>&lt;ref&gt;</code>-Tag in <code>&lt;references&gt;</code> het s e problematischi Gruppe-Eigeschaft  „$1“.',
 	'cite_error_references_missing_group' => 'Im <code>&lt;ref&gt;</code>-Tag, wu definiert isch in <code>&lt;references&gt;</code>, het s e Gruppe-Eigeschaft „$1“, wu im obere Text nit vorchunnt.',
 	'cite_error_references_missing_key' => 'S <code>&lt;ref&gt;</code>-Tag mit em Name „$1“, wu definiert isch in <code>&lt;references&gt;</code> wird nit verwändet im obere Text.',
@@ -1492,13 +1422,6 @@ Definier meh unter Systemnochricht <nowiki>[[MediaWiki:$2]]</nowiki>.',
  */
 $messages['gu'] = array(
 	'cite-desc' => 'અવતરણો માટે <nowiki><ref[ name=id]></nowiki> અને <nowiki><references/></nowiki> ટેગ ઉમેરે છે',
-	'cite_croak' => 'અવતરણ ભાંગી ગયું; $1: $2',
-	'cite_error_key_str_invalid' => 'આંતરિક ક્ષતિ;
-અયોગ્ય $str અને/અથવા $key.
-આ ક્યારેય થવું ન જોઈએ.',
-	'cite_error_stack_invalid_input' => 'આંતરિક ક્ષતિ;
-અયોગ્ય સ્ટેક કળ.
-આ ક્યારેય થવું ન જોઈએ.',
 	'cite_error' => 'સંદર્ભ ત્રુટિ: $1',
 	'cite_error_ref_numeric_key' => 'અમાન્ય <code>&lt;ref&gt;</code> ટેગ;
 નામ માત્ર સરળ રાશિ ન હોઈ શકે, વિસ્તૃત શીર્ષક આપો',
@@ -1522,7 +1445,7 @@ $messages['gu'] = array(
 <code>$1</code>નામના સંદર્ભ માટે કોઈ પણ લેખન અપાયું નથી',
 	'cite_error_included_ref' => '<code>&lt;ref&gt;</code> ટેગને બંધ કરતું <code>&lt;/ref&gt;</code> ખૂટે છે',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ટેગ અસ્તિત્વમાં છે, પણ <code>&lt;references/&gt;</code> ઍવો કોઈ ટેગ ન મળ્યો.',
-	'cite_error_group_refs_without_references' => ' "$1" નામના સમૂહમાં <code>&lt;ref&gt;</code> ટેગ વિહરમાન છે, પણ તેને અનુરૂપ <code>&lt;references group="$1"/&gt;</code> ટેગ ન મળ્યો.',
+	'cite_error_group_refs_without_references' => ' "$1" નામના સમૂહમાં <code>&lt;ref&gt;</code> ટેગ વિહરમાન છે, પણ તેને અનુરૂપ <code>&lt;references group="$1"/&gt;</code> ટેગ ન મળ્યો.', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> ટેગને  <code>&lt;references&gt;</code> માં આ વિરોધાભાસી લક્ષણ છે : "$1".',
 	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>માં વ્યાખ્યાયીત <code>&lt;ref&gt;</code> ટેગનો સમૂહ ગુણ "$1" છે જે પહેલાંની પહેલાંના લેખનમાં નથી.',
 	'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> માં વ્યાખ્યાયિત  $1" નામ સાથેનું <code>&lt;ref&gt;</code> ટેગ આગળના લેખનમાં વપરાયો નથી.',
@@ -1539,13 +1462,6 @@ $messages['gu'] = array(
  */
 $messages['he'] = array(
 	'cite-desc' => 'הוספת תגי <span dir="ltr"><nowiki><ref[ name=id]></nowiki></span> ו־<span dir="ltr"><nowiki><references/></nowiki></span> עבור הערות שוליים',
-	'cite_croak' => 'ההרחבה Cite קרסה; $1: $2',
-	'cite_error_key_str_invalid' => 'שגיאה פנימית;
-ערך לא תקין של <span dir="ltr">$str</span> ו/או <span dir="ltr">$key</span>.
-זה לא אמור לקרות לעולם.',
-	'cite_error_stack_invalid_input' => 'שגיאה פנימית;
-מפתח מחסנית לא תקין.
-זה לא אמור לקרות לעולם.',
 	'cite_error' => 'שגיאת ציטוט: $1',
 	'cite_error_ref_numeric_key' => 'תג <code>&lt;ref&gt;</code> לא תקין;
 שם (name) לא יכול להיות מספר שלם פשוט. יש להשתמש בכותרת תיאורית',
@@ -1568,13 +1484,15 @@ $messages['he'] = array(
 	'cite_error_references_no_text' => 'תג <code>&lt;ref&gt;</code> לא תקין;
 לא נכתב טקסט עבור הערות השוליים בשם <code>$1</code>',
 	'cite_error_included_ref' => 'חסר תג <code>&lt;/ref&gt;</code> סוגר שמתאים לתג <code>&lt;ref&gt;</code>',
-	'cite_error_refs_without_references' => 'קיימים תגי <code>&lt;ref&gt;</code>, אך לא נמצא תג <code dir="ltr">&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'קיימים תגי <code>&lt;ref&gt;</code> עבור קבוצה בשם "$1", אך לא נמצא תג <code dir="ltr">&lt;references group="$1"/&gt;</code> מתאים',
+	'cite_error_refs_without_references' => 'קיימים תגי <code>&lt;ref&gt;</code>, אך לא נמצא תג <code dir="ltr">&lt;/references&gt;</code>',
+	'cite_error_group_refs_without_references' => 'קיימים תגי <code>&lt;ref&gt;</code> עבור קבוצה בשם "$1", אך לא נמצא תג <code dir="ltr">&lt;references group="$1"/&gt;</code> מתאים, או שחסר <code dir="ltr">&lt;/ref&gt;</code> סוגר',
 	'cite_error_references_group_mismatch' => 'לתג <code>&lt;ref&gt;</code> המוגדר בתוך <code>&lt;references&gt;</code> יש מאפיין קבוצה (group) סותר, "$1".',
 	'cite_error_references_missing_group' => 'לתג <code>&lt;ref&gt;</code> המוגדר בתוך <code>&lt;references&gt;</code> יש מאפיין קבוצה (group) בעל הערך "$1", שאינו מופיע בטקסט שלפניו.',
 	'cite_error_references_missing_key' => 'התג <code>&lt;ref&gt;</code> בשם "$1" המוגדר בתוך <code>&lt;references&gt;</code> אינו נמצא בשימוש בטקסט שלפניו.',
 	'cite_error_references_no_key' => 'לתג <code>&lt;ref&gt;</code> המוגדר בתוך <code>&lt;references&gt;</code> אין מאפיין שם (name).',
 	'cite_error_empty_references_define' => 'התג <code>&lt;ref&gt;</code> בעל השם "$1" המוגדר בתוך <code>&lt;references&gt;</code> אינו מכיל תוכן.',
+	'cite_references_link_accessibility_label' => 'לקפוץ מעלה',
+	'cite_references_link_many_accessibility_label' => 'לקפוץ מעלה אל:',
 );
 
 /** Hindi (हिन्दी)
@@ -1584,32 +1502,37 @@ $messages['he'] = array(
  */
 $messages['hi'] = array(
 	'cite-desc' => '<nowiki><ref[ name=id]></nowiki> और <nowiki><references/></nowiki> टैग जोड़ता है, उद्धरणों के लिये।',
-	'cite_croak' => 'संदर्भ दे नहीं पाये; $1: $2',
-	'cite_error_key_str_invalid' => 'आंतर्गत गलती;
-गलत $str या/और $key।
-ऐसा होना नहीं चाहियें।',
-	'cite_error_stack_invalid_input' => 'आंतर्गत गलती; गलत स्टॅक की। ऐसा होना नहीं चाहियें।',
-	'cite_error' => 'गलती उद्घृत करें: $1',
-	'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> गलत कोड; नाम यह पूर्णांकी संख्या नहीं हो सकता, कृपया माहितीपूर्ण शीर्षक दें',
-	'cite_error_ref_no_key' => '<code>&lt;ref&gt;</code> गलत कोड; खाली संदर्भोंको नाम होना आवश्यक हैं',
-	'cite_error_ref_too_many_keys' => '<code>&lt;ref&gt;</code> गलत कोड; गलत नाम, उदा. ढेर सारी',
+	'cite_error' => 'सन्दर्भ त्रुटि: $1',
+	'cite_error_ref_numeric_key' => 'अमान्य <code>&lt;ref&gt;</code> टैग;
+नाम साधारण संख्या (integer) नहीं हो सकता, कृपया विस्तृत शीर्षक दें।',
+	'cite_error_ref_no_key' => 'अमान्य <code>&lt;ref&gt;</code> टैग;
+खाली संदर्भों का नाम होना आवश्यक है',
+	'cite_error_ref_too_many_keys' => 'अमान्य <code>&lt;ref&gt;</code> टैग;
+(संभवतः कई) अमान्य नाम',
 	'cite_error_ref_no_input' => 'अमान्य <code>&lt;ref&gt;</code> टैग;
 नाम रहित संदर्भों में जानकारी देना आवश्यक है',
-	'cite_error_references_invalid_parameters' => '<code>&lt;references&gt;</code> चुकीचा कोड; पॅरॅमीटर्स नहीं दे सकते, <code>&lt;references /&gt;</code> का इस्तेमाल करें',
-	'cite_error_references_invalid_parameters_group' => '<code>&lt;references&gt;</code> गलत कोड; सिर्फ पॅरॅमीटर का "ग्रुप" इस्तेमाल में लाया जा सकता हैं, <code>&lt;references /&gt;</code> या फिर <code>&lt;references group="..." /&gt;</code> का इस्तेमाल करें',
-	'cite_error_references_no_backlink_label' => 'तैयार किये हुए पीछे की कड़ियां देनेवाले नाम खतम हुए हैं, अधिक नाम <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> इस संदेश में बढायें',
-	'cite_error_no_link_label_group' => '"$1" संदर्भ समूह के लिये विशिष्ट लिंक लेबल कम पड़ गए।
-<nowiki>[[MediaWiki:$2]]</nowiki> सन्देश में और लेबल परिभाषित करें।',
+	'cite_error_references_invalid_parameters' => 'अमान्य <code>&lt;references&gt;</code> टैग;
+प्राचल (पैरामीटर) स्वीकृत नहीं हैं।
+<code>&lt;references /&gt;</code> का प्रयोग करें।',
+	'cite_error_references_invalid_parameters_group' => 'अमान्य <code>&lt;references&gt;</code> टैग;
+सिर्फ़ "group" प्राचल (पैरामीटर) स्वीकृत है।
+<code>&lt;references /&gt;</code> या <code>&lt;references group="..." /&gt;</code> का प्रयोग करें।',
+	'cite_error_references_no_backlink_label' => 'पृष्ठ पाठ की कड़ियाँ देने वाले विशिष्ट नाम खतम हो गये।
+अधिक नाम <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> संदेश में जोड़ें।',
+	'cite_error_no_link_label_group' => '"$1" संदर्भ समूह के लिये कड़ियों के विशिष्ट नाम कम पड़ गए।
+<nowiki>[[MediaWiki:$2]]</nowiki> सन्देश में और नाम परिभाषित करें।',
 	'cite_error_references_no_text' => 'अमान्य <code>&lt;ref&gt;</code> टैग;
 <code>$1</code> नामक संदर्भ की जानकारी नहीं है',
-	'cite_error_included_ref' => 'समाप्ती <code>&lt;/ref&gt;</code> <code>&lt;ref&gt;</code> टैग लापता',
-	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>टैग मौजूद हैं, किन्तु कोई <code>&lt;references/&gt;</code>टैग नहीं मिला',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> टैग मौजूद है एक दल के लिए इस नाम "$1" से, कीनतु कोई अनुरूप <code>&lt;references group="$1"/&gt;</code> टैग नहीं मिला',
-	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> टैग इन <code>&lt;references&gt;</code> दल की विशेषता में संघर्ष "$1"।',
-	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> टैग परिभाषित <code>&lt;references&gt;</code> में दलकी विशेषता है "$1" जो पूर्व लेख में दिखाई नहीं दिया ।',
-	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> टैग इस नाम "$1" सहित परिभाषित <code>&lt;references&gt;</code> पूर्व लेख में उपयोग नहीं हुई ।',
-	'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> टैग में परिभाषित <code>&lt;references&gt;</code> कोई नाम विशेषता नहीं ।',
-	'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> टैग में परिभाषित <code>&lt;references&gt;</code> नाम सहित "$1" कोई सामग्री नहीं ।',
+	'cite_error_included_ref' => '<code>&lt;ref&gt;</code> टैग के लिए समाप्ति <code>&lt;/ref&gt;</code> टैग नहीं मिला',
+	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> टैग मौजूद हैं, किन्तु कोई <code>&lt;references/&gt;</code> टैग नहीं मिला',
+	'cite_error_group_refs_without_references' => '"$1" नामक सन्दर्भ-समूह के लिए <code>&lt;ref&gt;</code> टैग मौजूद हैं, परन्तु समूह के लिए कोई <code>&lt;references group="$1"/&gt;</code> टैग नहीं मिला। यह भी संभव है कि कोई समाप्ति <code>&lt;/ref&gt;</code> टैग गायब है।',
+	'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> में <code>&lt;ref&gt;</code> टैग के लिए group प्राचल (पैरामीटर) में अंतर्विरोधी जानकारी "$1" मौजूद है।',
+	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> में परिभाषित <code>&lt;ref&gt;</code> टैग में group प्राचल (पैरामीटर) "$1" दिया है जो उससे पहले पृष्ठ के पाठ में मौजूद नहीं है।',
+	'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> में "$1" नाम के साथ परिभाषित <code>&lt;ref&gt;</code> टैग उससे पहले के पाठ में प्रयुक्त नहीं है।',
+	'cite_error_references_no_key' => '<code>&lt;references&gt;</code> टैग में परिभाषित <code>&lt;ref&gt;</code> टैग का कोई नाम नहीं है।',
+	'cite_error_empty_references_define' => '<code>&lt;references&gt;</code> टैग में परिभाषित "$1" नामक <code>&lt;ref&gt;</code> टैग में कोई सामग्री नहीं है।',
+	'cite_references_link_accessibility_label' => 'वापिस ऊपर जायें',
+	'cite_references_link_many_accessibility_label' => 'इस तक वापिस ऊपर जायें:',
 );
 
 /** Croatian (hrvatski)
@@ -1620,9 +1543,6 @@ $messages['hi'] = array(
  */
 $messages['hr'] = array(
 	'cite-desc' => 'Dodaje <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki> oznake, za citiranje',
-	'cite_croak' => 'Nevaljan citat; $1: $2',
-	'cite_error_key_str_invalid' => 'Unutarnja pogrješka: loš $str i/ili $key. Ovo se nikada ne bi smjelo dogoditi.',
-	'cite_error_stack_invalid_input' => 'Unutarnja pogrješka; loš ključ stacka.  Ovo se nikada ne bi smjelo dogoditi.',
 	'cite_error' => 'Pogrješka u citiranju: $1',
 	'cite_error_ref_numeric_key' => 'Loša <code>&lt;ref&gt;</code> oznaka; naziv ne smije biti jednostavni broj, koristite opisni naziv',
 	'cite_error_ref_no_key' => 'Loša <code>&lt;ref&gt;</code> oznaka; ref-ovi bez sadržaja moraju imati naziv',
@@ -1638,7 +1558,7 @@ Definirajte više putem poruke <nowiki>[[MediaWiki:$2]]</nowiki>.',
 	'cite_error_references_no_text' => 'Nije zadan tekst za izvor <code>$1</code>',
 	'cite_error_included_ref' => 'Nedostaje zatvarajući <code>&lt;/ref&gt;</code> za <code>&lt;ref&gt;</code> oznaku',
 	'cite_error_refs_without_references' => 'oznake <code>&lt;ref&gt;</code> postoje, ali oznaka <code>&lt;references/&gt;</code> nije pronađena',
-	'cite_error_group_refs_without_references' => 'oznake <code>&lt;ref&gt;</code> postoje za skupinu imenovanom "$1", ali nema pripadajuće oznake <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'oznake <code>&lt;ref&gt;</code> postoje za skupinu imenovanom "$1", ali nema pripadajuće oznake <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> oznaka u <code>&lt;references&gt;</code> ima konfliktni grupni atribut  "$1".',
 	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> oznaka definirana u <code>&lt;references&gt;</code> ima grupni atribut "$1" koji se ne pojavljuje u ranijem tekstu.',
 	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> oznaka s imenom "$1" definirana u <code>&lt;references&gt;</code> nije prethodno rabljena u tekstu.',
@@ -1651,9 +1571,6 @@ Definirajte više putem poruke <nowiki>[[MediaWiki:$2]]</nowiki>.',
  */
 $messages['hsb'] = array(
 	'cite-desc' => 'Přidawa taflički <nowiki><ref[ name=id]></nowiki> a <nowiki><references /></nowiki> za žórłowe podaća',
-	'cite_croak' => 'Zmylk w referencnym systemje; $1: $2',
-	'cite_error_key_str_invalid' => 'Interny zmylk: njepłaćiwy $str a/abo $key. To njeměło ženje wustupić.',
-	'cite_error_stack_invalid_input' => 'Interny zmylk; njepłaćiwy kluč staploweho składa. To njeměło ženje wustupić.',
 	'cite_error' => 'Referencny zmylk: $1',
 	'cite_error_ref_numeric_key' => 'Njepłaćiwe wužiwanje taflički <code>&lt;ref&gt;</code>; "name" njesmě jednora hódnota integer być, wužij wopisowace mjeno.',
 	'cite_error_ref_no_key' => 'Njepłaćiwe wužiwanje taflički <code>&lt;ref&gt;</code>; "ref" bjez wobsaha dyrbi mjeno měć.',
@@ -1670,12 +1587,14 @@ Definuj dalše w zdźělence <nowiki>[[MediaWiki:$2]]</nowiki>.',
 	'cite_error_references_no_text' => 'Njepłaćiwa referenca formy <code>&lt;ref&gt;</code>; žadyn tekst za referency z mjenom  <code>$1</code> podaty.',
 	'cite_error_included_ref' => 'Kónčny <code>&lt;/ref&gt;</code> za tafličku <code>&lt;ref&gt;</code> faluje',
 	'cite_error_refs_without_references' => 'Taflički <code>&lt;ref&gt;</code> ekistuja, ale žana taflička code>&lt;references/&gt;</code> je so namakała',
-	'cite_error_group_refs_without_references' => 'Taflički <code>&lt;ref&gt;</code> eksistuja za skupinu z mjenom "$1", ale njeje so wotpowědowaca taflička <code>&lt;references group="$1"/&gt;</code> namakała',
+	'cite_error_group_refs_without_references' => 'Taflički <code>&lt;ref&gt;</code> eksistuja za skupinu z mjenom "$1", ale njeje so wotpowědowaca taflička <code>&lt;references group="$1"/&gt;</code> namakała abo začinjacy <code>&lt;/ref&gt;</code> faluje',
 	'cite_error_references_group_mismatch' => 'Taflička <code>&lt;ref&gt;</code> w <code>&lt;references&gt;</code> je ze skupinskim atributom "$1" w konflikće.',
 	'cite_error_references_missing_group' => 'Taflička <code>&lt;ref&gt;</code>, kotraž je w <code>&lt;references&gt;</code> definowana, ma skupinski atribut "$1", kotryž so w prjedawšim teksće njejewi.',
 	'cite_error_references_missing_key' => 'Taflička <code>&lt;ref&gt;</code> z mjenom "$1", kotraž je w <code>&lt;references&gt;</code> definowana, so w prjedawšim teksće njewužiwa.',
 	'cite_error_references_no_key' => 'Taflička <code>&lt;ref&gt;</code>, kotraž je w <code>&lt;references&gt;</code> definowana, mjenowy atribut nima.',
 	'cite_error_empty_references_define' => 'Taflička <code>&lt;ref&gt;</code>, kotraž je w <code>&lt;references&gt;</code> z mjenom "$1" definowana, wobsah nima.',
+	'cite_references_link_accessibility_label' => 'Horje skočić',
+	'cite_references_link_many_accessibility_label' => 'Horje skočić do:',
 );
 
 /** Haitian (Kreyòl ayisyen)
@@ -1684,13 +1603,6 @@ Definuj dalše w zdźělence <nowiki>[[MediaWiki:$2]]</nowiki>.',
  */
 $messages['ht'] = array(
 	'cite-desc' => 'Ajoute baliz sa yo <nowiki><ref[ name=id]></nowiki> epi <nowiki><referans/></nowiki>, pou sitasyon yo.',
-	'cite_croak' => 'Sitasyon sa pa bon ; $1 : $2',
-	'cite_error_key_str_invalid' => 'Erè nan sistèm an;
-$str epi/oubyen $key pa valab.
-Erè sa pa ta janm dwe rive.',
-	'cite_error_stack_invalid_input' => 'Erè nan sistèm an ; 
-kle pil an pa valab.
-Sa pa ta janm dwe rive.',
 	'cite_error' => 'Erè nan sitasyon : $1',
 	'cite_error_ref_numeric_key' => 'Etikèt <code>&lt;ref&gt;</code> pa valab;
 non pa kapab yon nimewo.  Itilize yon tit ki dekri bagay la.',
@@ -1719,9 +1631,6 @@ Nou pa bay pyès tèks pou referans ki rele <code>$1</code>',
  */
 $messages['hu'] = array(
 	'cite-desc' => 'Lehetővé teszi idézések létrehozását <nowiki><ref[ name=id]></nowiki> és <nowiki><references/></nowiki> tagek segítségével',
-	'cite_croak' => 'Sikertelen forráshivatkozás; $1: $2',
-	'cite_error_key_str_invalid' => 'Belső hiba; érvénytelen $str és/vagy $key. Ennek soha nem kellene előfordulnia.',
-	'cite_error_stack_invalid_input' => 'Belső hiba; érvénytelen kulcs. Ennek soha nem kellene előfordulnia.',
 	'cite_error' => 'Forráshivatkozás-hiba: $1',
 	'cite_error_ref_numeric_key' => 'Érvénytelen <code>&lt;ref&gt;</code> tag; a name értéke nem lehet csupán egy szám, használj leíró címeket',
 	'cite_error_ref_no_key' => 'Érvénytelen <code>&lt;ref&gt;</code> tag; a tartalom nélküli ref-eknek kötelező nevet (name) adni',
@@ -1735,7 +1644,7 @@ Adj meg többet a <nowiki>[[MediaWiki:$2]]</nowiki> lapon.',
 	'cite_error_references_no_text' => 'Érvénytelen <code>&lt;ref&gt;</code> tag; nincs megadva szöveg a(z) <code>$1</code> nevű ref-eknek',
 	'cite_error_included_ref' => 'Egy <code>&lt;ref&gt;</code> tag lezáró <code>&lt;/ref&gt;</code> része hiányzik',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-ek vannak a lapon, de nincsen <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-ek léteznek a(z) „$1” csoporthoz, de nincs hozzá <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-ek léteznek a(z) „$1” csoporthoz, de nincs hozzá <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
 	'cite_error_references_group_mismatch' => 'A <code>&lt;references&gt;</code> és a benne található <code>&lt;ref&gt;</code> tag csoport-attribútuma („$1”) nem egyezik meg.',
 	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> tag lett lett definiálva egy olyan <code>&lt;references&gt;</code> tagben, amely csoport-attribútuma („$1”) nem szerepel a szöveg korábbi részében.',
 	'cite_error_references_missing_key' => 'a <code>&lt;references&gt;</code> tagben definiált „$1” nevű <code>&lt;ref&gt;</code> tag nem szerepel a szöveg korábbi részében.',
@@ -1749,13 +1658,6 @@ Adj meg többet a <nowiki>[[MediaWiki:$2]]</nowiki> lapon.',
  */
 $messages['ia'] = array(
 	'cite-desc' => 'Adde etiquettas <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki>, pro citationes',
-	'cite_croak' => 'Citation corrumpite; $1: $2',
-	'cite_error_key_str_invalid' => 'Error interne;
-clave $str e/o $key invalide.
-Isto non deberea jammais occurrer.',
-	'cite_error_stack_invalid_input' => 'Error interne;
-clave de pila invalide.
-Isto non deberea jammais occurrer.',
 	'cite_error' => 'Error de citation: $1',
 	'cite_error_ref_numeric_key' => 'Etiquetta <code>&lt;ref&gt;</code> invalide;
 le nomine non pote esser un numero integre. Usa un titulo descriptive',
@@ -1779,12 +1681,14 @@ Defini plus de istes in le message <nowiki>[[MediaWiki:$2]]</nowiki>.',
 nulle texto esseva fornite pro le refs nominate <code>$1</code>',
 	'cite_error_included_ref' => 'Le clausura <code>&lt;/ref&gt;</code> manca pro le etiquetta <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Il existe etiquettas <code>&lt;ref&gt;</code>, ma nulle etiquetta <code>&lt;references/&gt;</code> ha essite trovate',
-	'cite_error_group_refs_without_references' => 'Il existe etiquettas <code>&lt;ref&gt;</code> pro un gruppo nominate "$1", ma nulle etiquetta <code>&lt;references group="$1"/&gt;</code> correspondente ha essite trovate',
+	'cite_error_group_refs_without_references' => 'Il existe etiquettas <code>&lt;ref&gt;</code>  pro un gruppo con nomine "$1", ma nulle etiquetta <code>&lt;references group="$1"/&gt;</code> correspondente ha essite trovate, o un etiquetta de termination <code>&lt;/ref&gt;</code> manca.',
 	'cite_error_references_group_mismatch' => 'Le etiquetta <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> ha un attributo de gruppo "$1" confligente.',
 	'cite_error_references_missing_group' => 'Le etiquetta <code>&lt;ref&gt;</code> definite in <code>&lt;references&gt;</code> ha un attributo de gruppo "$1" que non appare in le texto precedente.',
 	'cite_error_references_missing_key' => 'Le etiquetta <code>&lt;ref&gt;</code> con nomine "$1" definite in <code>&lt;references&gt;</code> non es usate in le texto precedente.',
 	'cite_error_references_no_key' => 'Le etiquetta <code>&lt;ref&gt;</code> definite in <code>&lt;references&gt;</code> non ha un attributo de nomine.',
 	'cite_error_empty_references_define' => 'Le etiquetta <code>&lt;ref&gt;</code> definite in <code>&lt;references&gt;</code> con nomine "$1" ha nulle contento.',
+	'cite_references_link_accessibility_label' => 'Retornar',
+	'cite_references_link_many_accessibility_label' => 'Retornar a:',
 );
 
 /** Indonesian (Bahasa Indonesia)
@@ -1796,13 +1700,6 @@ nulle texto esseva fornite pro le refs nominate <code>$1</code>',
  */
 $messages['id'] = array(
 	'cite-desc' => 'Menambahkan tag <nowiki><ref[ name=id]></nowiki> dan <nowiki><references/></nowiki> untuk kutipan',
-	'cite_croak' => 'Kegagalan pengutipan; $1: $2',
-	'cite_error_key_str_invalid' => 'Kesalahan internal;
-$str dan/atau $key tidak sah.
-Kesalahan ini seharusnya tidak terjadi.',
-	'cite_error_stack_invalid_input' => "Kesalahan internal; 
-kunci ''stack'' tak sah.
-Kesalahan ini seharusnya tidak terjadi.",
 	'cite_error' => 'Kesalahan pengutipan: $1',
 	'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> tidak sah; 
 nama tidak boleh intejer sederhana.
@@ -1827,7 +1724,7 @@ Tambahkan ketentuan dalam pesan <nowiki> [[MediaWiki:$2]] </nowiki> .',
 tidak ditemukan teks untuk ref bernama <code>$1</code>',
 	'cite_error_included_ref' => 'Tag <code>&lt;ref&gt;</code> harus ditutup oleh <code>&lt;/ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ditemukan, tapi tag <code>&lt;references/&gt;</code> tidak ditemukan',
-	'cite_error_group_refs_without_references' => 'Ditemukan tag <code>&lt;ref&gt;</code> untuk kelompok bernama "$1", tapi tidak ditemukan tag <code>&lt;references group="$1"/&gt;</code> yang berkaitan',
+	'cite_error_group_refs_without_references' => 'Ditemukan tag <code>&lt;ref&gt;</code> untuk kelompok bernama "$1", tapi tidak ditemukan tag <code>&lt;references group="$1"/&gt;</code> yang berkaitan', # Fuzzy
 	'cite_error_references_group_mismatch' => 'Tag <code>&lt;ref&gt;</code> di <code>&lt;references&gt;</code> ada atribut kelompok "$1" yang konflik.',
 	'cite_error_references_missing_group' => 'Tag <code>&lt;ref&gt;</code> yang didefinisikan di <code>&lt;references&gt;</code> memiliki atribut kelompok "$1" yang tidak ditampilkan di teks sebelumnya.',
 	'cite_error_references_missing_key' => 'Tag <code>&lt;ref&gt;</code> dengan nama "$1" yang didefinisikan di <code>&lt;references&gt;</code> tidak digunakan pada teks sebelumnya.',
@@ -1841,57 +1738,50 @@ tidak ditemukan teks untuk ref bernama <code>$1</code>',
  */
 $messages['ig'] = array(
 	'cite-desc' => 'Tikwá <nowiki><ref[ áhà=id]></nowiki> and <nowiki><references/></nowiki> ndö, maka ntabi okwu',
-	'cite_croak' => 'Nchápụ nwụrụ; $1: $2',
 );
 
 /** Iloko (Ilokano)
  * @author Lam-ang
  */
 $messages['ilo'] = array(
-	'cite-desc' => 'Agnayon ti <nowiki><ref[ name=id]></nowiki> ken <nowiki><references/></nowiki> nga etiketa, para kadagiti pagdakamat',
-	'cite_croak' => 'Natay ti dakamat; $1: $2',
-	'cite_error_key_str_invalid' => 'Akin-uneg a biddut;
-imbalido $str ken/ wenno $tulbek.
-Daytoy ket saan kuman a napasamak.',
-	'cite_error_stack_invalid_input' => 'Akin-uneg a biddut;
-imbalido a tuon a tulbek.
-Daytoy ket saan kuman a napasamak.',
+	'cite-desc' => 'Aginayon kadagiti etiketa ti <nowiki><ref[ name=id]></nowiki> ken <nowiki><references/></nowiki>, para kadagiti panagdakamat',
 	'cite_error' => 'Biddut ti dakamat: $1',
-	'cite_error_ref_numeric_key' => 'Imbalido a <code>&lt;ref&gt;</code> nga etiketa;
-ti nagan ket saan a mabalin a nalaka a sibubukel. Agusar ti agipalpalawag a titulo',
-	'cite_error_ref_no_key' => 'Imbalido a  <code>&lt;ref&gt;</code> nga etiketa;
-dagita ref nga awan nagyan na ket masapul a managanan',
-	'cite_error_ref_too_many_keys' => 'Imbalido a  <code>&lt;ref&gt;</code> nga etiketa;
+	'cite_error_ref_numeric_key' => 'Imbalido ti etiketa ti <code>&lt;ref&gt;</code>;
+ti nagan ket saan a mabalin a nalaka a sibubukel. Agusar ti makaipalawag a titulo',
+	'cite_error_ref_no_key' => 'Imbalido nga etiketa ti  <code>&lt;ref&gt;</code> ;
+dagita ref nga awan nagyanna ket masapul nga adda naganna',
+	'cite_error_ref_too_many_keys' => 'Imbalido nga etiketa ti <code>&lt;ref&gt;</code> ;
 imbalido a nag-nagan, a kas adu unay',
-	'cite_error_ref_no_input' => 'Imbalido a <code>&lt;ref&gt;</code> nga etiketa;
-dagiti ref nga awan ti nagan na ket masapul nga addaan ti nagyan',
-	'cite_error_references_invalid_parameters' => 'Imbalido a <code>&lt;references&gt;</code> nga etiketa
-awan dagiti parametro a maipalubos.
+	'cite_error_ref_no_input' => 'Imbalido nga etiketa ti <code>&lt;ref&gt;</code> ;
+dagiti ref nga awan ti naganna ket masapul nga addaan ti nagyan',
+	'cite_error_references_invalid_parameters' => 'Imbalido nga etiketa ti <code>&lt;references&gt;</code>;
+saan a maipalubos dagiti parametro.
 Usaren ti <code>&lt;references /&gt;</code>',
-	'cite_error_references_invalid_parameters_group' => 'Imbalido a <code>&lt;references&gt;</code> nga etiketa;
-parametro a "bunggoy" ket ti maipalubos laeng.
+	'cite_error_references_invalid_parameters_group' => 'Imbalido nga etiketa ti <code>&lt;references&gt;</code> ;
+maipalubos laeng ti parametro ti "grupo" .
 Usaren ti <code>&lt;references /&gt;</code> , wenno<code>&lt;references group="..." /&gt;</code>',
-	'cite_error_references_no_backlink_label' => 'Naibusan kadagiti nagrunaan a likud ti panilpo nga etiketa.
-Ipalawag pay ti adu idiay <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki> a mensahe',
-	'cite_error_no_link_label_group' => 'Naibusan ti nangruna a panilpo nga etiketa para iti bunggoy ti "$1".
-Ipalawag pay ti adu idiay <nowiki>[[MediaWiki:$2]]</nowiki> a mensahe.',
-	'cite_error_references_no_text' => 'Imbalido a <code>&lt;ref&gt;</code> nga etiketa;
-awan ti testo a naited para dagiti ref a nanaganan <code>$1</code>',
-	'cite_error_included_ref' => 'Irikrikep ti <code>&lt;/ref&gt;</code> napukaw para iti <code>&lt;ref&gt;</code> nga etiketa',
-	'cite_error_refs_without_references' => 'Ti <code>&lt;ref&gt;</code> nga etiketa ket addaan, ngem awan ti <code>&lt;references/&gt;</code> nga etiketa a nabirukan',
-	'cite_error_group_refs_without_references' => 'Ti <code>&lt;ref&gt;</code> nga etiketa para iti bunggoy a nainaganan "$1", ngem awan ti kapadpada a <code>&lt;references group="$1"/&gt;</code> nga etiketa a nabirukan',
-	'cite_error_references_group_mismatch' => 'Ti <code>&lt;ref&gt;</code> nga etiketa iday <code>&lt;references&gt;</code> ket addan ti nagsungat a gupit ti bunggoy "$1".',
-	'cite_error_references_missing_group' => 'Ti <code>&lt;ref&gt;</code> nga etiketa a naipalawag idiay <code>&lt;references&gt;</code> ket addaan ti gupit ti bunggoy "$1" a saan nga agparang iti napalabas a testo.',
-	'cite_error_references_missing_key' => 'Ti <code>&lt;ref&gt;</code> nga etiketa nga addaan ti nagan "$1" a naipalawag idiay <code>&lt;references&gt;</code> ket saan a nausar iti napalabas a testo.',
-	'cite_error_references_no_key' => 'Ti <code>&lt;ref&gt;</code> nga etiketa a naipalawag idiay <code>&lt;references&gt;</code> ket awan ti nainagan a gupit.',
-	'cite_error_empty_references_define' => 'Ti <code>&lt;ref&gt;</code> nga etiketa a naipalawag idiay <code>&lt;references&gt;</code> nga addaan ti nagan a "$1" ket awan ti nagyan na.',
+	'cite_error_references_no_backlink_label' => 'Naibusan kadagiti etiketa ti naisangayan a silpo ti likud.
+Ipalawag pay ti adu idiay mensahe ti <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
+	'cite_error_no_link_label_group' => 'Naibusan kadagiti etiketa ti nangruna a silpo para iti grupo ti "$1".
+Ipalawag pay ti adu idiay mensahe ti <nowiki>[[MediaWiki:$2]]</nowiki> .',
+	'cite_error_references_no_text' => 'Imbalido nga etiketa ti <code>&lt;ref&gt;</code> ;
+awan ti testo a naited para kadagiti ref a nanaganan <code>$1</code>',
+	'cite_error_included_ref' => 'Irikepen ti <code>&lt;/ref&gt;</code> napukaw para iti etiketa ti <code>&lt;ref&gt;</code>',
+	'cite_error_refs_without_references' => 'Ti etiketa ti <code>&lt;ref&gt;</code> ket addan, ngem awan ti etiketa ti <code>&lt;references/&gt;</code> a nabirukan',
+	'cite_error_group_refs_without_references' => 'Adda dagiti etiketa ti <code>&lt;ref&gt;</code> para iti grupo a nanaganan ti "$1", ngem awan ti kapada nga etiketa ti <code>&lt;references group="$1"/&gt;</code> a nabirukan, wenno awan ti pangrikep ti <code>&lt;/ref&gt;</code>',
+	'cite_error_references_group_mismatch' => 'Ti etiketa ti <code>&lt;ref&gt;</code> iday <code>&lt;references&gt;</code> ket addan ti kasinnungat a gupit ti grupo ti "$1".',
+	'cite_error_references_missing_group' => 'Ti etiketa ti <code>&lt;ref&gt;</code> a naipalawag idiay <code>&lt;references&gt;</code> ket addaan ti gupit ti grupo ti "$1" a saan nga agparang iti napalabas a testo.',
+	'cite_error_references_missing_key' => 'Ti etiketa ti <code>&lt;ref&gt;</code> nga addaan ti nagan ti "$1" a naipalawag idiay <code>&lt;references&gt;</code> ket saan a nausar iti napalabas a testo.',
+	'cite_error_references_no_key' => 'Ti etiketa ti <code>&lt;ref&gt;</code> a naipalawag idiay <code>&lt;references&gt;</code> ket awan ti nainagan a gupit.',
+	'cite_error_empty_references_define' => 'Ti etiketa ti <code>&lt;ref&gt;</code> a naipalawag idiay <code>&lt;references&gt;</code> nga addaan ti nagan a "$1" ket awan ti nagyanna.',
+	'cite_references_link_accessibility_label' => 'Mapan iti ngato',
+	'cite_references_link_many_accessibility_label' => 'Mapan aginggana iti:',
 );
 
 /** Ido (Ido)
  * @author Malafaya
  */
 $messages['io'] = array(
-	'cite_croak' => 'Cite mortis; $1: $2',
 	'cite_error' => 'Citala eroro: $1',
 );
 
@@ -1899,12 +1789,6 @@ $messages['io'] = array(
  * @author Snævar
  */
 $messages['is'] = array(
-	'cite_error_key_str_invalid' => 'Innri villa;
-ógild $str og/eða $key.
-Þetta ætti aldrei að gerast.',
-	'cite_error_stack_invalid_input' => 'Innri villa;
-ógildur stafla lykill.
-Þetta ætti aldrei að gerast.',
 	'cite_error' => 'Tilvísunar villa: $1',
 	'cite_error_ref_numeric_key' => 'Villa í <code>&lt;ref&gt;</code> tag;
 nafn tilvísunar má ekki vera heil tala. Notaðu lýsandi titil',
@@ -1924,7 +1808,7 @@ Notaðu <code>&lt;references /&gt;</code> eða <code>&lt;references group="..."
 tilgreindu texta fyrir tilvísun með nafnið <code>$1</code>',
 	'cite_error_included_ref' => 'Loka þarf tilvísunni með <code>&lt;/ref&gt;</code> tagi',
 	'cite_error_refs_without_references' => 'Bæta þarf <code>&lt;references/&gt;</code> við',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> tag er til fyrir hóp tilvísana undir nafninu "$1", en ekkert sambærilegt <code>&lt;references group="$1"/&gt;</code> tag fannst',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> tag er til fyrir hóp tilvísana undir nafninu "$1", en ekkert sambærilegt <code>&lt;references group="$1"/&gt;</code> tag fannst', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> tag í <code>&lt;references&gt;</code> stangast á við hópa eigindið "$1".',
 	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> tag skilgreint í <code>&lt;references&gt;</code> hefur hópa eigindið "$1" sem birtist ekki í textanum á undan.',
 	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> tag með nafnið "$1" og er skilgreint í <code>&lt;references&gt;</code> er ekki notað í textanum á undan.',
@@ -1937,17 +1821,11 @@ tilgreindu texta fyrir tilvísun með nafnið <code>$1</code>',
  * @author BrokenArrow
  * @author Darth Kule
  * @author Erdemaslancan
+ * @author Gianfranco
  * @author Pietrodn
  */
 $messages['it'] = array(
 	'cite-desc' => 'Aggiunge i tag <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> per gestire le citazioni',
-	'cite_croak' => 'Errore nella citazione: $1: $2',
-	'cite_error_key_str_invalid' => 'Errore interno;
-$str e/o $key errati.
-Non dovrebbe mai verificarsi.',
-	'cite_error_stack_invalid_input' => 'Errore interno: 
-chiave di stack errata.
-Non dovrebbe mai verificarsi.',
 	'cite_error' => 'Errore nella funzione Cite: $1',
 	'cite_error_ref_numeric_key' => "Errore nell'uso del marcatore <code>&lt;ref&gt;</code>: il nome non può essere un numero intero. Usare un titolo esteso",
 	'cite_error_ref_no_key' => "Errore nell'uso del marcatore <code>&lt;ref&gt;</code>: i ref vuoti non possono essere privi di nome",
@@ -1962,12 +1840,14 @@ Usare <code>&lt;references /&gt;</code> oppure <code>&lt;references group="..."
 	'cite_error_references_no_text' => 'Marcatore <code>&lt;ref&gt;</code> non valido; non è stato indicato alcun testo per il marcatore <code>$1</code>',
 	'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> di chiusura mancante per il marcatore <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Sono presenti dei marcatori <code>&lt;ref&gt;</code> ma non è stato trovato alcun marcatore <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Sono presenti dei marcatori <code>&lt;ref&gt;</code> per un gruppo chiamato "$1" ma non è stato trovato alcun marcatore <code>&lt;references group="$1"/&gt;</code> corrispondente',
+	'cite_error_group_refs_without_references' => 'Sono presenti dei marcatori <code>&lt;ref&gt;</code> per un gruppo chiamato "$1" ma non è stato trovato alcun marcatore <code>&lt;references group="$1"/&gt;</code> corrispondente, o manca la chiusura <code>&lt;/ref&gt;</code>',
 	'cite_error_references_group_mismatch' => 'Il tag <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> ha attributo gruppo "$1" in conflitto.',
 	'cite_error_references_missing_group' => 'Il tag <code>&lt;ref&gt;</code> definito in <code>&lt;references&gt;</code> ha un attributo gruppo "$1" che non compare nel testo precedente.',
 	'cite_error_references_missing_key' => 'Il tag <code>&lt;ref&gt;</code> con nome "$1" definito in <code>&lt;references&gt;</code> non è usato nel testo precedente.',
 	'cite_error_references_no_key' => 'Il tag <code>&lt;ref&gt;</code> definito in <code>&lt;references&gt;</code> non ha un attributo nome.',
 	'cite_error_empty_references_define' => 'Il tag <code>&lt;ref&gt;</code> definito in <code>&lt;references&gt;</code> con nome "$1" non ha alcun contenuto.',
+	'cite_references_link_accessibility_label' => 'Salta',
+	'cite_references_link_many_accessibility_label' => 'Salta a:',
 );
 
 /** Japanese (日本語)
@@ -1979,13 +1859,6 @@ Usare <code>&lt;references /&gt;</code> oppure <code>&lt;references group="..."
  */
 $messages['ja'] = array(
 	'cite-desc' => '引用のためのタグ <nowiki><ref[ name=id]></nowiki> および <nowiki><references/></nowiki> を追加する',
-	'cite_croak' => '引用機能のエラー。$1: $2',
-	'cite_error_key_str_invalid' => '内部エラーです。
-$str と $key の両方または一方が無効です。
-これはソフトウェアのバグです。',
-	'cite_error_stack_invalid_input' => '内部エラーです。
-スタック キーが無効です。
-これはソフトウェアのバグです。',
 	'cite_error' => '引用エラー: $1',
 	'cite_error_ref_numeric_key' => '無効な <code>&lt;ref&gt;</code> タグです。
 名前 (name 属性) に単なる整数は使用できません。説明的なものにしてください',
@@ -2009,21 +1882,20 @@ $str と $key の両方または一方が無効です。
 「<code>$1</code>」という名前の引用句に対するテキストが指定されていません',
 	'cite_error_included_ref' => '<code>&lt;ref&gt;</code> タグに対応する <code>&lt;/ref&gt;</code> タグが不足しています',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> タグがありますが、<code>&lt;references/&gt;</code> タグが見つかりません',
-	'cite_error_group_refs_without_references' => '「$1」という名前のグループの <code>&lt;ref&gt;</code> タグがありますが、対応する <code>&lt;references group="$1"/&gt;</code> タグが見つかりません',
+	'cite_error_group_refs_without_references' => '「$1」という名前のグループの <code>&lt;ref&gt;</code> タグがありますが、対応する <code>&lt;references group="$1"/&gt;</code> タグが見つからない、または閉じる <code>&lt;/ref&gt;</code> タグがありません',
 	'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> の <code>&lt;ref&gt;</code> タグで、group 属性「$1」が重複しています。',
 	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> で定義されている <code>&lt;ref&gt;</code> タグに、先行するテキスト内で使用されていない group 属性「$1」があります。',
 	'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> で定義されている <code>&lt;ref&gt;</code> タグ (name="$1") は、先行するテキスト内で使用されていません。',
 	'cite_error_references_no_key' => '<code>&lt;references&gt;</code> で定義されている <code>&lt;ref&gt;</code> タグに name 属性がありません。',
 	'cite_error_empty_references_define' => '<code>&lt;references&gt;</code> で定義されている <code>&lt;ref&gt;</code> タグ (name="$1") に内容がありません。',
+	'cite_references_link_accessibility_label' => '元の位置に戻る',
+	'cite_references_link_many_accessibility_label' => '以下の位置に戻る:',
 );
 
 /** Jutish (jysk)
  * @author Huslåke
  */
 $messages['jut'] = array(
-	'cite_croak' => 'Æ fodnåt døde; $1: $2',
-	'cite_error_key_str_invalid' => 'Intern fejl: Ugyldeg $str og/æller $key. Dette burde aldreg førekåm.',
-	'cite_error_stack_invalid_input' => 'Intern fejl: Ugyldeg staknøgle. Dette burde aldreg førekåm.',
 	'cite_error' => 'Fodnåtfejl: $1',
 	'cite_error_ref_numeric_key' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag; "name" kan ikke være et simpelt heltal, brug en beskrivende titel',
 	'cite_error_ref_no_key' => 'Ugyldigt <code>&lt;ref&gt;</code>-tag: Et <code>&lt;ref&gt;</code>-tag uden indhold skal have et navn',
@@ -2042,13 +1914,6 @@ $messages['jut'] = array(
  */
 $messages['jv'] = array(
 	'cite-desc' => 'Nambahaké tag <nowiki><ref[ name=id]></nowiki> lan <nowiki><references/></nowiki> kanggo kutipan (sitat)',
-	'cite_croak' => 'Sitaté (pangutipané) gagal; $1: $2',
-	'cite_error_key_str_invalid' => 'Kaluputan jero;
-$str lan/utawa $key ora absah.
-Iki sajatiné ora tau olèh kadadéyan.',
-	'cite_error_stack_invalid_input' => 'Kaluputan internal;
-stack key ora absah.
-Iki samesthine ora kadadéan.',
 	'cite_error' => 'Kaluputan sitat (pangutipan) $1',
 	'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> ora absah;
 jenengé ora bisa namung angka integer waé. Gunakna irah-irahan (judhul) dèskriptif',
@@ -2072,7 +1937,7 @@ Tambahaké katemton nèng layang <nowiki>[[MediaWiki:$2]]</nowiki>.',
 ora ditemokaké tèks kanggo ref mawa jeneng <code>$1</code>',
 	'cite_error_included_ref' => 'Panutupan <code>&lt;/ref&gt;</code> kélangan tag <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ditemokaké, nanging tag <code>&lt;references/&gt;</code> ora ditemokaké',
-	'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ditemokaké kanggo paguyuban ajeneng "$1", nanging tag <code>&lt;references group="$1"/&gt;</code> sing ana kaitané ora ditemokaké',
+	'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ditemokaké kanggo paguyuban ajeneng "$1", nanging tag <code>&lt;references group="$1"/&gt;</code> sing ana kaitané ora ditemokaké', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> tandha <code>&lt;references&gt;</code> nduwèni atribut klompok sing marai konflik "$1".',
 	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> tag sing didhèfinisikaké <code>&lt;references&gt;</code> nduwèni atribut klompok "$1" sing ora njedhul sing tèks sakdurungé.',
 	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> tag sing didhefinisikaké mawa jeneng "$1" <code>&lt;references&gt;</code> ora dianggo nèng tèks sakdurungé.',
@@ -2091,20 +1956,14 @@ ora ditemokaké tèks kanggo ref mawa jeneng <code>$1</code>',
 /** Georgian (ქართული)
  * @author David1010
  * @author Dawid Deutschland
+ * @author Nodar Kherkheulidze
  * @author გიორგიმელა
  */
 $messages['ka'] = array(
 	'cite-desc' => 'ამატებს <nowiki><ref[ name=id]></nowiki> და <nowiki><references/></nowiki> ტეგებს სქოლიოსთვის',
-	'cite_croak' => 'ციტატა მოკვადა; $1: $2',
-	'cite_error_key_str_invalid' => 'შიდა შეცდომა
-არასწორი $str და/ან $key
-ასეთი არასდროს არ უნდა განმეორდეს',
-	'cite_error_stack_invalid_input' => 'შიდა შეცდომა.
-სტეკის არასწორი გასაღები.
-ეს არ უნდა განმეორდეს.',
 	'cite_error' => 'ციტირების შეცდომა $1',
-	'cite_error_ref_numeric_key' => 'არასწორი ტეგი <code>&lt;ref&gt;</code> tag;
-სახელმიარ უნდა შეიცავდეს ციფრებს.',
+	'cite_error_ref_numeric_key' => 'არასწორი <code>&lt;ref&gt;</code> ტეგი;
+სახელი არ უნდა შეიცავდეს ციფრებს. გამოიყენეთ აღწერილობითი სახელწოდება.',
 	'cite_error_ref_no_key' => 'არასწორი ტეგი <code>&lt;ref&gt;</code>;
 ელემენტი უნდა შეიცავდეს სახელს.',
 	'cite_error_ref_too_many_keys' => 'არასწორი ტეგი <code>&lt;ref&gt;</code>;
@@ -2124,7 +1983,7 @@ $messages['ka'] = array(
 სქოლიოსათვის <code>$1</code> არ არის მითითებული ტექსტი',
 	'cite_error_included_ref' => 'დამხურავი ტეგი <code>&lt;/ref&gt;</code> დაკარგულია',
 	'cite_error_refs_without_references' => 'არსებული ტეგისათვის <code>&lt;ref&gt;</code> ვერ მოიძებნა შესაბამისი ტეგი <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'ჯგუფი „$1“ არსებული ტეგებისათვის <code>&lt;ref&gt;</code> ვერ მოიძებნა შესაბამისი ტეგი <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'ჯგუფი „$1“ არსებული ტეგებისათვის <code>&lt;ref&gt;</code> ვერ მოიძებნა შესაბამისი ტეგი <code>&lt;references group="$1"/&gt;</code>, ან გამოტოვებულია დამხურავი ტეგი <code>&lt;/ref&gt;</code>',
 	'cite_error_references_group_mismatch' => 'ტეგს <code>&lt;ref&gt;</code> <code>&lt;references&gt;</code>-ში გააჩნია ატრიბუტთა კონფლიქტური ჯგუფები „$1“.',
 	'cite_error_references_missing_group' => 'ტეგს <code>&lt;ref&gt;</code>, განმარტებულს <code>&lt;references&gt;</code>-ში, გააჩნია ჯგუფის ატრიბუტი „$1“, რომელიც ადრეულ ტექსტში არ მოიხსენიება.',
 	'cite_error_references_missing_key' => 'ტეგი <code>&lt;ref&gt;</code> სახელად „$1“, გარკვეული <code>&lt;references&gt;</code>-ში, არ გამოიყენება წინა ტექსტში.',
@@ -2142,9 +2001,6 @@ $messages['ka'] = array(
 /** Kazakh (Arabic script) (قازاقشا (تٴوتە)‏)
  */
 $messages['kk-arab'] = array(
-	'cite_croak' => 'دٵيەكسٶز الۋ سٵتسٸز بٸتتٸ; $1: $2',
-	'cite_error_key_str_invalid' => 'ٸشكٸ قاتە; جارامسىز $str', # Fuzzy
-	'cite_error_stack_invalid_input' => 'ٸشكٸ قاتە; جارامسىز ستەك كٸلتٸ',
 	'cite_error' => 'دٵيەكسٶز الۋ $1 قاتەسٸ',
 	'cite_error_ref_numeric_key' => 'جارامسىز <code>&lt;ref&gt;</code> بەلگٸشەسٸ; اتاۋ كٵدٸمگٸ بٷتٸن سان بولۋى مٷمكٸن ەمەس, سيپپاتاۋىش اتاۋ قولدانىڭىز',
 	'cite_error_ref_no_key' => 'جارامسىز <code>&lt;ref&gt;</code> بەلگٸشەسٸ; ماعلۇماتسىز تٷسٸنٸكتەمەلەردە اتاۋ بولۋى قاجەت',
@@ -2158,9 +2014,6 @@ $messages['kk-arab'] = array(
  * @author Kaztrans
  */
 $messages['kk-cyrl'] = array(
-	'cite_croak' => 'Дәйексөз алу сәтсіз бітті; $1: $2',
-	'cite_error_key_str_invalid' => 'Ішкі қате; жарамсыз $str', # Fuzzy
-	'cite_error_stack_invalid_input' => 'Ішкі қате; жарамсыз стек кілті',
 	'cite_error' => 'Дәйексөз алу $1 қатесі',
 	'cite_error_ref_numeric_key' => 'Жарамсыз <code>&lt;ref&gt;</code> белгішесі; атау кәдімгі бүтін сан болуы мүмкін емес, сиппатауыш атау қолданыңыз',
 	'cite_error_ref_no_key' => 'Жарамсыз <code>&lt;ref&gt;</code> белгішесі; мағлұматсыз түсініктемелерде атау болуы қажет',
@@ -2175,9 +2028,6 @@ $messages['kk-cyrl'] = array(
 /** Kazakh (Latin script) (qazaqşa (latın)‎)
  */
 $messages['kk-latn'] = array(
-	'cite_croak' => 'Däýeksöz alw sätsiz bitti; $1: $2',
-	'cite_error_key_str_invalid' => 'İşki qate; jaramsız $str', # Fuzzy
-	'cite_error_stack_invalid_input' => 'İşki qate; jaramsız stek kilti',
 	'cite_error' => 'Däýeksöz alw $1 qatesi',
 	'cite_error_ref_numeric_key' => 'Jaramsız <code>&lt;ref&gt;</code> belgişesi; ataw kädimgi bütin san bolwı mümkin emes, sïppatawış ataw qoldanıñız',
 	'cite_error_ref_no_key' => 'Jaramsız <code>&lt;ref&gt;</code> belgişesi; mağlumatsız tüsiniktemelerde ataw bolwı qajet',
@@ -2200,45 +2050,42 @@ $messages['km'] = array(
  * @author Ilovesabbath
  * @author Kwj2772
  * @author ToePeu
+ * @author 아라
  */
 $messages['ko'] = array(
-	'cite-desc' => '인용에 쓰이는 <nowiki><ref[ name=id]></nowiki>와 <nowiki><references/></nowiki>태그를 더합니다.',
-	'cite_croak' => '인용 오류; $1: $2',
-	'cite_error_key_str_invalid' => '내부 오류;
-$str 혹은 $key가 잘못되었습니다.
-이 오류는 발생하지 않아야 합니다.',
-	'cite_error_stack_invalid_input' => '내부 오류; 스택 키가 잘못되었습니다.
-이 오류는 발생하지 말아야 합니다.',
+	'cite-desc' => '인용에 쓰이는 <nowiki><ref[ name=id]></nowiki>와 <nowiki><references/></nowiki> 태그를 추가합니다',
 	'cite_error' => '인용 오류: $1',
 	'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> 태그가 잘못되었습니다;
-이름은 숫자가 될 수 없습니다. 설명적인 이름을 사용하십시오.',
+이름은 숫자가 될 수 없습니다. 설명적인 이름을 사용하세요',
 	'cite_error_ref_no_key' => '<code>&lt;ref&gt;</code> 태그가 잘못되었습니다;
-내용이 없는 주석은 이름이 있어야 합니다.',
-	'cite_error_ref_too_many_keys' => '잘못된 <code>&lt;ref&gt;</code> 태그 사용;
-예컨대 잘못된 주석 이름이 너무 많습니다.',
+내용이 없는 주석은 이름이 있어야 합니다',
+	'cite_error_ref_too_many_keys' => '<code>&lt;ref&gt;</code> 태그가 잘못되었습니다;
+잘못된 이름입니다, 너무 많은 등',
 	'cite_error_ref_no_input' => '<code>&lt;ref&gt;</code> 태그가 잘못되었습니다;
-이름이 없는 ref 태그는 반드시 내용이 있어야 합니다.',
+이름이 없는 ref 태그는 반드시 내용이 있어야 합니다',
 	'cite_error_references_invalid_parameters' => '<code>&lt;references&gt;</code> 태그가 잘못되었습니다;
-변수를 넣어서는 안 됩니다.
-<code>&lt;references /&gt;</code>를 이용하십시오.',
+변수를 넣으면 안됩니다.
+<code>&lt;references /&gt;</code>를 사용하세요',
 	'cite_error_references_invalid_parameters_group' => '<code>&lt;references&gt;</code> 태그가 잘못되었습니다;
 "group" 변수만 사용할 수 있습니다.
-<code>&lt;references /&gt;</code>나 <code>&lt;references group="..." /&gt;</code>만 이용하십시오.',
-	'cite_error_references_no_backlink_label' => '역링크 라벨이 부족합니다.
-<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>에 더 많은 라벨을 추가하십시오.',
-	'cite_error_no_link_label_group' => '그룹 "$1"에 대해 링크 레이블이 모두 떨어졌습니다.
-<nowiki>[[MediaWiki:$2]]</nowiki> 메시지에 더 많은 레이블을 정의해주십시오.',
-	'cite_error_references_no_text' => '<code>&lt;ref&gt;</code> 태그가 잘못되었습니다.
-<code>$1</code>라는 이름을 가진 주석에 대한 내용이 없습니다.',
-	'cite_error_included_ref' => '<code>&lt;ref&gt;</code> 태그를 닫는 <code>&lt;/ref&gt;</code> 태그가 없습니다.',
-	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> 태그가 존재하지만, <code>&lt;references/&gt;</code> 태그가 없습니다.',
-	'cite_error_group_refs_without_references' => '"$1"이라는 이름을 가진 그룹에 대한 <code>&lt;ref&gt;</code> 태그가 존재하지만, 이에 대응하는 <code>&lt;references group="$1" /&gt;</code> 태그가 없습니다.',
-	'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> 안에 있는 <code>&lt;ref&gt;</code> 태그의 그룹 속성 "$1"이 충돌됩니다.',
-	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> 안의 <code>&lt;ref&gt;</code> 태그가 이전에 존재하지 않는 그룹 속성 "$1"을 갖고 있습니다.',
+<code>&lt;references /&gt;</code>나 <code>&lt;references group="..." /&gt;</code>를 사용하세요',
+	'cite_error_references_no_backlink_label' => '사용자 지정 백링크 라벨이 바닥이 났습니다.
+<nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>메시지에 더 정의하세요.',
+	'cite_error_no_link_label_group' => '"$1" 그룹에 대해 사용자 지정 링크 레이블이 바닥이 났습니다.
+<nowiki>[[MediaWiki:$2]]</nowiki> 메시지에 더 정의하세요.',
+	'cite_error_references_no_text' => '<code>&lt;ref&gt;</code> 태그가 잘못되었습니다;
+<code>$1</code>라는 이름을 가진 주석에 제공한 텍스트가 없습니다',
+	'cite_error_included_ref' => '<code>&lt;ref&gt;</code> 태그를 닫는 <code>&lt;/ref&gt;</code> 태그가 없습니다',
+	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> 태그가 존재하지만, <code>&lt;references/&gt;</code> 태그가 없습니다',
+	'cite_error_group_refs_without_references' => '"$1"이라는 이름을 가진 그룹에 대한 <code>&lt;ref&gt;</code> 태그가 존재하지만, 이에 대응하는 <code>&lt;references group="$1" /&gt;</code> 태그가 없거나, 태그를 닫는 <code>&lt;/ref&gt;</code> 태그가 없습니다',
+	'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> 안에 있는 <code>&lt;ref&gt;</code> 태그에서 "$1" 그룹 특성이 충돌됩니다.',
+	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> 안에 정의된 <code>&lt;ref&gt;</code> 태그에 이전 텍스트에 없는 "$1" 그룹 특성이 있습니다.',
 	'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> 안에 정의된 "$1"이라는 이름을 가진 <code>&lt;ref&gt;</code> 태그가 위에서 사용되고 있지 않습니다.',
-	'cite_error_references_no_key' => '<code>&lt;references&gt;</code> 안의 <code>&lt;ref&gt;</code> 태그에 이름이 없습니다.',
+	'cite_error_references_no_key' => '<code>&lt;references&gt;</code> 안에 정의된 <code>&lt;ref&gt;</code> 태그에 이름 특성이 없습니다.',
 	'cite_error_empty_references_define' => '<code>&lt;references&gt;</code> 태그 안에 정의된 "$1"이라는 이름을 가진 <code>&lt;ref&gt;</code> 태그에 내용이 없습니다.',
 	'cite_references_link_many_format_backlink_labels' => '가 나 다 라 마 바 사 아 자 차 카 타 파 하 거 너 더 러 머 버 서 어 저 처 커 터 퍼 허 고 노 도 로 모 보 소 오 조 초 코 토 포 호 구 누 두 루 무 부 수 우 주 추 쿠 투 푸 후 그 느 드 르 므 브 스 으 즈 츠 크 트 프 흐 기 니 디 리 미 비 시 이 지 치 키 티 피 히',
+	'cite_references_link_accessibility_label' => '이동',
+	'cite_references_link_many_accessibility_label' => '이동:',
 );
 
 /** Colognian (Ripoarisch)
@@ -2247,13 +2094,6 @@ $str 혹은 $key가 잘못되었습니다.
  */
 $messages['ksh'] = array(
 	'cite-desc' => 'Erlaub Quelle un Referenze met <nowiki><ref[ name="id"]></nowiki> un <nowiki><references /></nowiki> aanzejevve.',
-	'cite_croak' => 'Fääler met Refenenze. $1: $2',
-	'cite_error_key_str_invalid' => 'Interne Fähler in <i lang="en">cite</i>:
-<code>$str</code> udder <code>$key</code> stemme nit.
-Dat sull nie optredde.',
-	'cite_error_stack_invalid_input' => 'Interne Fähler in <i lang="en">cite</i>:
-Der <i lang="en">stack</i>-Schlößel stemmp nit.
-Dat sull nie optredde.',
 	'cite_error' => 'Fähler in <i lang="en">cite</i> met Referenze: $1',
 	'cite_error_ref_numeric_key' => 'Fähler en <i lang="en">cite</i>:
 Ene <code>&lt;ref&gt;</code>-Name kann kei Zahl sin.
@@ -2282,7 +2122,7 @@ Et wohr keine Tex aanjejovve för de
 <code>&lt;ref&gt;</code>s met dämm Name „<code>$1</code>“.',
 	'cite_error_included_ref' => 'Hee för dat <code>&lt;ref&gt;</code> ham_mer kei zopaß <code>&lt;/ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Et sinn_er <code>&lt;ref&gt;</code>-Befähle en dä Sigg, ävver mer han keine <code>&lt;references/&gt;</code>-Befähl jefunge.',
-	'cite_error_group_refs_without_references' => 'Et sinn_er <code>&lt;ref&gt;</code>-Befähle för de jrop „$1“ en hee dä Sigg, ävver mer han keine <code>&lt;references group="$1"/&gt;</code>-Befähl jefunge.',
+	'cite_error_group_refs_without_references' => 'Et sinn_er <code>&lt;ref&gt;</code>-Befähle för de jrop „$1“ en hee dä Sigg, ävver mer han keine <code>&lt;references group="$1"/&gt;</code>-Befähl jefunge.', # Fuzzy
 	'cite_error_references_group_mismatch' => 'Dä <code>&lt;ref&gt;</code> Befähl en <code>&lt;references&gt;</code> hät en widerschpröschlesche Jroppe-Eijeschaff „$1“.',
 	'cite_error_references_missing_group' => 'Dä <code>&lt;ref&gt;</code> Befähl, aanjejoove em Befähl <code>&lt;references&gt;</code>, hät en Jroppe-Eijeschaff „$1“, di ävver em Täx doför nit vörjekumme es.',
 	'cite_error_references_missing_key' => 'Dä <code>&lt;ref&gt;</code> Befähl mem Naame „$1“, aanjejoove em Befähl <code>&lt;references&gt;</code>, es em Täx doför nit vörjekumme.',
@@ -2296,10 +2136,11 @@ Et wohr keine Tex aanjejovve för de
 
 /** Cornish (kernowek)
  * @author Kernoweger
+ * @author Nrowe
  */
 $messages['kw'] = array(
 	'cite_error' => 'Gwall devynna: $1',
-	'cite_error_refs_without_references' => 'Yma tagys <code>&lt;ref&gt;</code>, mes ny veu kevys tag <code>&lt;references/&gt;</code>',
+	'cite_error_refs_without_references' => 'Yma tagys <code>&lt;ref&gt;</code>, mes ny gavas tag <code>&lt;references/&gt;</code>',
 );
 
 /** Luxembourgish (Lëtzebuergesch)
@@ -2308,13 +2149,6 @@ $messages['kw'] = array(
  */
 $messages['lb'] = array(
 	'cite-desc' => 'Setzt <nowiki><ref[ name=id]></nowiki> an <nowiki><references/></nowiki> Taggen derbäi, fir Zitatiounen.',
-	'cite_croak' => 'Feeler am Referenz-System. $1 : $2',
-	'cite_error_key_str_invalid' => 'Interne Feeler;
-net valabele $str an/oder $key.
-Dëst sollt eigentlech ni geschéien.',
-	'cite_error_stack_invalid_input' => "Interne Feeler;
-ongëltege ''stack''-Schlëssel.
-Dës sollt eigentlech guer net geschéien.",
 	'cite_error' => 'Zitéierfeeler: $1',
 	'cite_error_ref_numeric_key' => 'Ongëltegen <code>&lt;ref&gt;</code> Tag;
 Den Numm ka keng einfach ganz Zuel sinn. Benotzt w.e.g. een Titel den eng Beschreiwung gëtt',
@@ -2334,12 +2168,14 @@ Benotzt <code>&lt;references /&gt;</code>, oder <code>&lt;references group="..."
 et gouf keen Text ugi fir d'Referenze mam Numm <code>$1</code>",
 	'cite_error_included_ref' => 'Den Tag <code>&lt;/ref&gt;</code> feelt fir den Tag <code>&lt;ref&gt;</code> zouzemaachen',
 	'cite_error_refs_without_references' => "D'Markéierung <code>&lt;ref&gt;</code> gëtt et, awer d'Markéierung <code>&lt;references/&gt;</code> gouf net fonnt",
-	'cite_error_group_refs_without_references' => 'D\'Markéierung <code>&lt;ref&gt;</code> gëtt et fir d\'Grupp "$1", awer d\'entspriechend Markéierung <code>&lt;references group="$1"/&gt;</code> gouf net fonnt',
+	'cite_error_group_refs_without_references' => 'D\'Markéierung <code>&lt;ref&gt;</code> gëtt et fir d\'Grupp "$1", awer d\'entspriechend Markéierung <code>&lt;references group="$1"/&gt;</code> gouf net fonnt oder een <code>&lt;/ref&gt;</code> feelt',
 	'cite_error_references_group_mismatch' => 'Den <code>&lt;ref&gt;</code>-Tag an <code>&lt;references&gt;</code> huet den Attribut "$1" deen am Konflikt mat deem am <code>&lt;references&gt;</code> steet.',
 	'cite_error_references_missing_group' => 'Deen am <code>&lt;references&gt;</code> definéierten <code>&lt;ref&gt;</code>-Tag huet en Attribut "$1" deen am Text virdrun net dran ass.',
 	'cite_error_references_missing_key' => 'Deen am <code>&lt;references&gt;</code> definéierten <code>&lt;ref&gt;</code>-Tag mam Numm "$1" gëtt am Text virdrun net benotzt.',
 	'cite_error_references_no_key' => "D'Markéierung <code>&lt;ref&gt;</code> déi an <code>&lt;references&gt;</code> definéiert ass huet keng Nummeegeschaft.",
 	'cite_error_empty_references_define' => "D'Markéierung <code>&lt;ref&gt;</code> déi am <code>&lt;references&gt;</code> mat dem Numm  « $1 » definéiert ass, ass eidel.",
+	'cite_references_link_accessibility_label' => 'No uewe sprangen',
+	'cite_references_link_many_accessibility_label' => 'Eropsprangen op:',
 );
 
 /** Limburgish (Limburgs)
@@ -2348,9 +2184,6 @@ et gouf keen Text ugi fir d'Referenze mam Numm <code>$1</code>",
  */
 $messages['li'] = array(
 	'cite-desc' => 'Voeg <nowiki><ref[ name=id]></nowiki> en <nowiki><references/></nowiki> tags toe veur citate',
-	'cite_croak' => 'Perbleem mit Citere; $1: $2',
-	'cite_error_key_str_invalid' => 'Interne fout; ónzjuuste $str en/of $key.  Dit zów noeaits mótte veurkómme.',
-	'cite_error_stack_invalid_input' => 'Interne fout; ónzjuuste stacksleutel.  Dit zów noeaits mótte veurkómme.',
 	'cite_error' => 'Citeerfout: $1',
 	'cite_error_ref_numeric_key' => "Ónzjuuste tag <code>&lt;ref&gt;</code>; de naam kin gein simpele integer zeen, gebroek 'ne besjrievendje titel",
 	'cite_error_ref_no_key' => "Ónzjuuste tag <code>&lt;ref&gt;</code>; refs zónger inhoud mótte 'ne naam höbbe",
@@ -2366,7 +2199,7 @@ Doe kans d\'r mier insjtelle in \'t sysyeemberich <nowiki>[[MediaWiki:$2]]</nowi
 	'cite_error_references_no_text' => "Ónzjuuste tag <code>&lt;ref&gt;</code>; d'r is gein teks opgegaeve veur refs mit de naam <code>$1</code>",
 	'cite_error_included_ref' => 'Gein sjloetteike <code>&lt;/ref&gt;</code> veur de tag <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'De tag <code>&lt;ref&gt;</code> besteit al, meh de tag <code>&lt;references/&gt;</code> is neet aangetróffe',
-	'cite_error_group_refs_without_references' => 'd\'r Besteit \'ne tag <code>&lt;ref&gt;</code> veure groep "$1", meh d\'r is geine bebehuuerendje tag <code>&lt;references group="$1"/&gt;</code> gevónje',
+	'cite_error_group_refs_without_references' => 'd\'r Besteit \'ne tag <code>&lt;ref&gt;</code> veure groep "$1", meh d\'r is geine bebehuuerendje tag <code>&lt;references group="$1"/&gt;</code> gevónje', # Fuzzy
 	'cite_error_references_group_mismatch' => 'De tag <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> conflicteert mit groepseigesjap "$1".',
 	'cite_error_references_missing_group' => 'De tag <code>&lt;ref&gt;</code> dae is gedefinieerd in <code>&lt;references&gt;</code> haet de groepseigesjap "$1" neet ierder in de tekst veurkump.',
 	'cite_error_references_missing_key' => 'De tag <code>&lt;ref&gt;</code> mit de naam "$1" gedefiniteerd in <code>&lt;references&gt;</code> weurt neet ierder in de teks gebroek.',
@@ -2374,6 +2207,15 @@ Doe kans d\'r mier insjtelle in \'t sysyeemberich <nowiki>[[MediaWiki:$2]]</nowi
 	'cite_error_empty_references_define' => 'De tag <code>&lt;ref&gt;</code> dae is gedefinieerd in <code>&lt;references&gt;</code> mit de naam "$1" haet geinen inhawd.',
 );
 
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+	'cite_error' => 'خطا جاگه:$1',
+	'cite_references_link_accessibility_label' => 'بالا پرسن',
+	'cite_references_link_many_accessibility_label' => 'پرستن د',
+);
+
 /** Lithuanian (lietuvių)
  * @author Garas
  * @author Homo
@@ -2381,9 +2223,6 @@ Doe kans d\'r mier insjtelle in \'t sysyeemberich <nowiki>[[MediaWiki:$2]]</nowi
  */
 $messages['lt'] = array(
 	'cite-desc' => 'Prideda <nowiki><ref[ name=id]></nowiki> ir <nowiki><references/></nowiki> žymes citavimui',
-	'cite_croak' => 'Cituoti nepavyko; $1: $2',
-	'cite_error_key_str_invalid' => 'Vidinė klaida; neleistinas $str',
-	'cite_error_stack_invalid_input' => 'Vidinė klaida; neleistinas steko raktas',
 	'cite_error' => 'Citavimo klaida $1',
 	'cite_error_ref_numeric_key' => 'Neleistina <code>&lt;ref&gt;</code> gairė; vardas negali būti tiesiog skaičius, naudokite tekstinį pavadinimą',
 	'cite_error_ref_no_key' => 'Neleistina <code>&lt;ref&gt;</code> gairė; nuorodos be turinio turi turėti vardą',
@@ -2412,13 +2251,6 @@ $messages['lv'] = array(
  */
 $messages['mg'] = array(
 	'cite-desc' => 'Mamnpy ny balizy <tt><nowiki><ref[ name="id"]></nowiki></tt> et <tt><nowiki><references/></nowiki></tt> ho an\'ny tsiahy.',
-	'cite_croak' => 'Tsiahy tsy miafana ; $1 : $2',
-	'cite_error_key_str_invalid' => 'Tsy fetezana ety anaty;
-Tsy mety $str na $key.
-Tokony tsy hitranga mihintsy ity tsy fetezana ity.',
-	'cite_error_stack_invalid_input' => 'Tsy fetezana ety anaty ;
-tsy mety ny stack key.
-Tokony tsy hitranga mihitsy ity tsy fetezana ity.',
 );
 
 /** Minangkabau (Baso Minangkabau)
@@ -2426,13 +2258,6 @@ Tokony tsy hitranga mihitsy ity tsy fetezana ity.',
  */
 $messages['min'] = array(
 	'cite-desc' => 'Manambahkan tag <nowiki><ref[ name=id]></nowiki> jo <nowiki><references/></nowiki> untuak kutipan',
-	'cite_croak' => 'Pautan mati; $1: $2',
-	'cite_error_key_str_invalid' => 'Kasalahan internal;
-$str jo/atau $key indak sah.
-Kasalahan ko sabananyo indak buliah tajadi.',
-	'cite_error_stack_invalid_input' => 'Kasalahan internal;
-kunci "stack" indak sah.
-Kasalahan ko sabananyo indak buliah tajadi.',
 	'cite_error' => 'Kutipan rusak: $1',
 	'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> indak sah;
 parameter indak buliah angko atau/hurup sadarano.
@@ -2457,7 +2282,7 @@ Tantukan labiah lanjuik dalam <nowiki>[[MediaWiki:$2]]</nowiki>.',
 indak ado teks untuak ref banamo <code>$1</code>',
 	'cite_error_included_ref' => 'Tag <code>&lt;ref&gt;</code> harus ditutuik jo <code>&lt;/ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ado, tapi <code>&lt;references/&gt;</code> indak ado',
-	'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ado untuak grup banamo "$1", tapi indak ado <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ado untuak grup banamo "$1", tapi indak ado <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
 	'cite_error_references_group_mismatch' => 'Tag <code>&lt;ref&gt;</code> pado <code>&lt;references&gt;</code> ado namo grup "$1" nan konflik.',
 	'cite_error_references_missing_group' => 'Tag <code>&lt;ref&gt;</code> pado <code>&lt;references&gt;</code> indak ado namo grup "$1".',
 	'cite_error_references_missing_key' => 'Tag <code>&lt;ref&gt;</code> jo namo "$1" pado <code>&lt;references&gt;</code> indak ado.',
@@ -2481,13 +2306,6 @@ indak ado teks untuak ref banamo <code>$1</code>',
  */
 $messages['mk'] = array(
 	'cite-desc' => 'Додава ознаки <nowiki><ref[ name=id]></nowiki> и <nowiki><references/></nowiki>, за цитирања',
-	'cite_croak' => 'Наводот се урна; $1: $2',
-	'cite_error_key_str_invalid' => 'Внатрешна грешка;
-погрешна вредност на $str и/или $key.
-Ова никогаш не треба да се случува.',
-	'cite_error_stack_invalid_input' => 'Внатрешна грешка;
-погрешен клуч за купот.
-Ова никогаш не треба да се случува.',
 	'cite_error' => 'Грешка во наводот: $1.',
 	'cite_error_ref_numeric_key' => 'Погрешна ознака <code>&lt;ref&gt;</code>;
 името не може да биде број. Употребете описен наслов',
@@ -2511,12 +2329,14 @@ $messages['mk'] = array(
 нема зададено текст за наводите по име <code>$1</code>',
 	'cite_error_included_ref' => 'На ознаката <code>&lt;ref&gt;</code> ѝ недостасува ознака за затворање &lt;/ref&gt',
 	'cite_error_refs_without_references' => 'Статијата има ознаки <code>&lt;ref&gt;</code>, но не ја најдов потребната ознака <code>&#123;&#123;наводи&#125;&#125;</code> (или <code>&lt;references/&gt;</code>)',
-	'cite_error_group_refs_without_references' => 'Има ознаки <code>&lt;ref&gt;</code> за група именувана како „$1“, но нема соодветна ознака <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'Има ознаки <code>&lt;ref&gt;</code> за група именувана како „$1“, но нема соодветна ознака <code>&lt;references group="$1"/&gt;</code>, или пак недостасува завршно <code>&lt;/ref&gt;</code>',
 	'cite_error_references_group_mismatch' => 'Ознаката <code>&lt;ref&gt;</code> во <code>&lt;references&gt;</code> има спротиставен групен атрибут „$1“.',
 	'cite_error_references_missing_group' => 'Ознаката <code>&lt;ref&gt;</code> определена во <code>&lt;references&gt;</code> има групен атрибут „$1“ кој не се јавува во претходен текст.',
 	'cite_error_references_missing_key' => 'Ознаката <code>&lt;ref&gt;</code> со име „$1“ определена во <code>&lt;references&gt;</code> не се користи во претходен текст.',
 	'cite_error_references_no_key' => 'Ознаката <code>&lt;ref&gt;</code> определена во <code>&lt;referencesgt;</code> нема именски атрибут.',
 	'cite_error_empty_references_define' => 'Ознаката <code>&lt;ref&gt;</code> определена во <code>&lt;references&gt;</code> со име „$1“ нема содржина.',
+	'cite_references_link_accessibility_label' => 'Следно',
+	'cite_references_link_many_accessibility_label' => 'Отиди кај:',
 );
 
 /** Malayalam (മലയാളം)
@@ -2525,11 +2345,6 @@ $messages['mk'] = array(
  */
 $messages['ml'] = array(
 	'cite-desc' => 'അവലംബം ചേർക്കുവാൻ ഉപയോഗിക്കാനുള്ള <nowiki><ref[ name=id]></nowiki>, <nowiki><references/></nowiki> എന്നീ ടാഗുകൾ ചേർക്കുന്നു',
-	'cite_croak' => 'സൈറ്റ് ലഭ്യമല്ല; $1: $2',
-	'cite_error_key_str_invalid' => 'ആന്തരിക പിഴവ്; 
-അസാധുവായ $str അല്ലെങ്കിൽ $key.
-ഇതു ഒരിക്കലും സംഭവിക്കാൻ പാടില്ലായിരുന്നു.',
-	'cite_error_stack_invalid_input' => 'ആന്തരിക പിഴവ്; അസാധുവായ സ്റ്റാക് കീ. ഇതു ഒരിക്കലും സംഭവിക്കാൻ പാടില്ലായിരുന്നു.',
 	'cite_error' => 'ഉദ്ധരിച്ചതിൽ പിഴവ്: $1',
 	'cite_error_ref_numeric_key' => 'അസാധുവായ <code>&lt;ref&gt;</code> ടാഗ്;
 നാമത്തിൽ സംഖ്യ മാത്രമായി അനുവദനീയമല്ല. എന്തെങ്കിലും ലഘുവിവരണം ഉപയോഗിക്കുക.',
@@ -2551,7 +2366,7 @@ $messages['ml'] = array(
 <code>$1</code> എന്ന അവലംബങ്ങൾക്ക് ടെക്സ്റ്റ് ഒന്നും കൊടുത്തിട്ടില്ല.',
 	'cite_error_included_ref' => '<code>&lt;ref&gt;</code> റ്റാഗിനു <code>&lt;/ref&gt;</code> എന്ന അന്ത്യറ്റാഗ് നൽകിയിട്ടില്ല',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> റ്റാഗുകൾ നൽകിയിട്ടുണ്ട്, പക്ഷേ <code>&lt;references/&gt;</code> റ്റാഗ് കണ്ടെത്താനായില്ല.',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> റ്റാഗുകൾ "$1" സംഘത്തിൽ ഉണ്ട്, പക്ഷേ ബന്ധപ്പെട്ട <code>&lt;references group="$1"/&gt;</code> റ്റാഗ് കണ്ടെത്താനായില്ല',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> റ്റാഗുകൾ "$1" സംഘത്തിൽ ഉണ്ട്, പക്ഷേ ബന്ധപ്പെട്ട <code>&lt;references group="$1"/&gt;</code> റ്റാഗ് കണ്ടെത്താനായില്ല അല്ലെങ്കിൽ അടയ്ക്കാനുള്ള <code>&lt;/ref&gt;</code> നൽകിയിട്ടില്ല',
 	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> റ്റാഗിലേയും <code>&lt;references&gt;</code> എന്നതിലേയും സംഘ ഘടകമായ "$1" ഒത്തുപോകുന്നില്ല.',
 	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> റ്റാഗ് നിർവചിച്ചിട്ടുണ്ടെങ്കിലും <code>&lt;references&gt;</code> എന്നതിലുള്ള സംഘ ഘടകം "$1" ആദ്യ എഴുത്തിൽ കാണുന്നില്ല.',
 	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> റ്റാഗ് "$1" എന്ന പേരോടെ <code>&lt;references&gt;</code> എന്നതിൽ നിർവചിച്ചിട്ടുണ്ടെങ്കിലും ആദ്യ എഴുത്തിൽ ഉപയോഗിക്കുന്നില്ല.',
@@ -2559,6 +2374,8 @@ $messages['ml'] = array(
 	'cite_error_empty_references_define' => ' <code>&lt;references&gt;</code> ആവശ്യത്തിനായി "$1" എന്ന പേരിൽ നിർ‌വചിക്കപ്പെട്ട <code>&lt;ref&gt;</code> റ്റാഗിന് ഉള്ളടക്കമൊന്നുമില്ല.',
 	'cite_reference_link_prefix' => 'ഉദ്ധരിണി_അവലംബം-',
 	'cite_references_link_prefix' => 'ഉദ്ധരിണി_കുറിപ്പ്-',
+	'cite_references_link_accessibility_label' => 'മുകളിലേയ്ക്ക്',
+	'cite_references_link_many_accessibility_label' => 'മുകളിൽ ഇവിടേയ്ക്ക്:',
 );
 
 /** Mongolian (монгол)
@@ -2573,12 +2390,10 @@ $messages['mn'] = array(
  * @author Kaustubh
  * @author Mahitgar
  * @author Rahuldeshmukh101
+ * @author V.narsikar
  */
 $messages['mr'] = array(
-	'cite-desc' => '<nowiki><ref[ name=id]></nowiki> व <nowiki><references/></nowiki> हे दोन संदर्भ देण्यासाठी वापरण्यात येणारे शब्द वाढविले जातील.',
-	'cite_croak' => 'संदर्भ देता आला नाही; $1: $2',
-	'cite_error_key_str_invalid' => 'अंतर्गत त्रुटी; चुकीचे $str आणि/किंवा $key. असे कधीही घडायला नको.',
-	'cite_error_stack_invalid_input' => 'अंतर्गत त्रुटी; चुकीची स्टॅक चावी. असे कधीही घडले नाही पाहिजे.',
+	'cite-desc' => '<nowiki><ref[ name=id]></nowiki> व <nowiki><references/></nowiki> हे दोन संदर्भ देण्यासाठी वापरण्यात येणारे शब्द जोडल्या जातील.',
 	'cite_error' => 'त्रूटी उधृत करा: $1',
 	'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> चुकीचा कोड; नाव हे पूर्णांकी संख्या असू शकत नाही, कृपया माहितीपूर्ण शीर्षक द्या',
 	'cite_error_ref_no_key' => '<code>&lt;ref&gt;</code> चुकीचा कोड; रिकाम्या संदर्भांना नाव असणे गरजेचे आहे',
@@ -2591,14 +2406,17 @@ $messages['mr'] = array(
 	'cite_error_no_link_label_group' => '"$1" करिता नमूदकेलेल्या कस्टम लिंक खूणा संपल्या .
 <nowiki>[[MediaWiki:$2]]</nowiki> संदेशात अधिक खूणा नमूद करा',
 	'cite_error_references_no_text' => '<code>&lt;ref&gt;</code> चुकीचा कोड; <code>$1</code> नावाने दिलेल्या संदर्भांमध्ये काहीही माहिती नाही',
-	'cite_error_included_ref' => '<code>&lt;ref&gt;</code> ला बंद करणारी <code>&lt;/ref&gt;</code> ही खूण गायब आहे.',
-	'cite_error_refs_without_references' => 'पानामधे <code>&lt;ref&gt;</code> (संदर्भ) आहे, परंतु <code>&lt;references/&gt;</code> (<nowiki>{{संदर्भयादी}}<nowiki />) सापडले नाही. <nowiki>{{संदर्भयादी}}<nowiki /> असल्याशिवाय पानाच्या तळाशी संदर्भांचे तपशील दिसणार नाहीत.',
-	'cite_error_group_refs_without_references' => '"$1" नावाच्या गटाकरिता <code>&lt;ref&gt;</code>  चिन्हे उपलब्ध आहेत, पण संबंधीत <code>&lt;references group="$1"/&gt;</code>  खूण मिळाली नाही.',
-	'cite_error_references_group_mismatch' => 'tag in <code>&lt;references&gt;</code>मधील <code>&lt;ref&gt;</code>  खूणांना खटका उडणारे  group attribute "$1" आहे.',
-	'cite_error_references_missing_group' => 'गट "$1" मधील <code>&lt;ref&gt;</code> ट्याग   <code>&lt;references&gt;</code> ह्या पूर्वी वापल्या गेलेले नाही',
-	'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> ह्या मध्ये सांगितलेला  <code>&lt;ref&gt;</code>  "$1" ह्या नावाचा  ट्याग ह्या पूर्वी वापरण्यात आलेला नाही.',
-	'cite_error_references_no_key' => '<code>&lt;ref&gt;</code> ट्याग मध्ये विशारद गोष्टींना <code>&lt;references&gt;</code> ला नाम गुणधर्म नाहीत',
-	'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code> ट्याग मध्ये विशारद गोष्टीं <code>&lt;references&gt;</code> ज्या  "$1" ह्या नावाने संबोधल्या आहेत त्यात माहिती नाही',
+	'cite_error_included_ref' => '<code>&lt;ref&gt;</code> ला बंद करणारी <code>&lt;/ref&gt;</code> ही खूणपताका गायब आहे.',
+	'cite_error_refs_without_references' => "या पानामधे \"<code>&lt;ref&gt;</code>\" ही खूणपताका(संदर्भटॅग) आहे, परंतु <code>&lt;references/&gt;</code> अथवा <code> <nowiki>{{</nowiki>
+</code>संदर्भयादी<code><nowiki>}}</nowiki></code>या  पैकी एकही  लावण्यात आलेले नाही.''' या पानात \"<code><nowiki>{{</nowiki></code>संदर्भयादी<code><nowiki>}}</nowiki></code>\" हा साचा कॉपीपेस्ट करावा''' ''कारण,त्याशिवाय पानाच्या तळाशी संदर्भांचे तपशील दिसणार नाहीत.''",
+	'cite_error_group_refs_without_references' => '"$1" नावाच्या गटाकरिता <code>&lt;ref&gt;</code>खूणपताका उपलब्ध आहेत, पण संबंधीत <code>&lt;references group="$1"/&gt;</code>  खूण मिळाली नाही.',
+	'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>मधील खूणपताकेस<code>&lt;ref&gt;</code> खूणांशी विसंवाद असणारे  group attribute "$1" आहे.',
+	'cite_error_references_missing_group' => 'गट "$1" मधील <code>&lt;ref&gt;</code> खूणपताका <code>&lt;references&gt;</code> ह्या पूर्वी वापल्या गेलेल्या नाहीत.',
+	'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> ह्या मध्ये टाकलेला <code>&lt;ref&gt;</code>  "$1" ह्या नावाची खूणपताका  ह्या पूर्वी वापरण्यात आलेली नाही.',
+	'cite_error_references_no_key' => '<code>&lt;ref&gt;</code>खूणपताकेत नमूद गोष्टींना <code>&lt;references&gt;</code> ला नाम-गुणधर्म नाहीत.',
+	'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code>खूणपताकेत नमूद गोष्टींना, <code>&lt;references&gt;</code> ज्या  "$1" ह्या नावाने संबोधल्या आहेत, त्यात माहिती नाही.',
+	'cite_references_link_accessibility_label' => 'वर उडी मारा',
+	'cite_references_link_many_accessibility_label' => 'ला वर उडी मारा:',
 );
 
 /** Malay (Bahasa Melayu)
@@ -2608,9 +2426,6 @@ $messages['mr'] = array(
  */
 $messages['ms'] = array(
 	'cite-desc' => 'Menambah tag <nowiki><ref[ name=id]></nowiki> dan <nowiki><references/></nowiki> untuk pemetikan',
-	'cite_croak' => 'Ralat maut petik; $1: $2',
-	'cite_error_key_str_invalid' => 'Ralat dalaman; str dan/atau $key tidak sah.',
-	'cite_error_stack_invalid_input' => 'Ralat dalaman; kunci tindanan tidak sah.',
 	'cite_error' => 'Ralat petik: $1',
 	'cite_error_ref_numeric_key' => 'Tag <code>&lt;ref&gt;</code> tidak sah; nombor ringkas tidak dibenarkan, sila masukkan tajuk yang lebih terperinci',
 	'cite_error_ref_no_key' => 'Tag <code>&lt;ref&gt;</code> tidak sah; rujukan tanpa kandungan mestilah mempunyai nama',
@@ -2625,7 +2440,7 @@ Tentukan lagi dalam mesej <nowiki>[[MediaWiki:$2]]</nowiki>.',
 	'cite_error_references_no_text' => 'Tag <code>&lt;ref&gt;</code> tidak sah; teks bagi rujukan <code>$1</code> tidak disediakan',
 	'cite_error_included_ref' => 'Tag <code>&lt;ref&gt;</code> tidak ditutup dengan <code>&lt;/ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> ada tetapi tag <code>&lt;references/&gt;</code> tidak disertakan',
-	'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> untuk kumpulan "$1" ada tetapi tag <code>&lt;references group="$1"/&gt;</code> yang sepadan tidak disertakan',
+	'cite_error_group_refs_without_references' => 'Tag <code>&lt;ref&gt;</code> untuk kumpulan "$1" ada tetapi tag <code>&lt;references group="$1"/&gt;</code> yang sepadan tidak disertakan', # Fuzzy
 	'cite_error_references_group_mismatch' => 'Tag <code>&lt;ref&gt;</code> dalam <code>&lt;references&gt;</code> mempunyai atribut kumpulan yang bercanggah, "$1".',
 	'cite_error_references_missing_group' => 'Tag <code>&lt;ref&gt;</code> yang ditentukan dalam <code>&lt;references&gt;</code> mempunyai atribut kumpulan "$1" yang tiada dalam teks sebelumnya.',
 	'cite_error_references_missing_key' => 'Tag <code>&lt;ref&gt;</code> dengan nama "$1" yang ditentukan dalam <code>&lt;references&gt;</code> tidak digunakan dalam teks sebelumnya.',
@@ -2638,13 +2453,6 @@ Tentukan lagi dalam mesej <nowiki>[[MediaWiki:$2]]</nowiki>.',
  */
 $messages['mt'] = array(
 	'cite-desc' => 'Iżżid it-tikketti <nowiki><ref[ name=id]></nowiki> u <nowiki><references/></nowiki> għaċ-ċitazzjonijiet',
-	'cite_croak' => 'Żball fiċ-ċitazzjoni; $1: $2',
-	'cite_error_key_str_invalid' => 'Żball intern;
-$str u/jew $key invalidi.
-Dan qatt m\'għandu jseħħ.',
-	'cite_error_stack_invalid_input' => "Żball intern;
-''stack key'' invalida.
-Dan qatt m'għandu jseħħ.",
 	'cite_error' => 'Żball fiċ-ċitazzjoni: $1',
 	'cite_error_ref_numeric_key' => 'Tikketta <code>&lt;ref&gt;</code> invalida;
 l-isem ma jistax ikun numru sħiħ sempliċi. Uża titlu deskrittiv',
@@ -2661,7 +2469,7 @@ Uża <code>&lt;references /&gt;</code> jew <code>&lt;references group="..." /&gt
 l-ebda test ma ngħata għar-refs bl-isem <code>$1</code>',
 	'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> tal-għeluq hija nieqsa għat-tikketta <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'It-tikketti <code>&lt;ref&gt;</code> jeżistu, imma l-ebda tikketta <code>&lt;references/&gt;</code> ma nstabet',
-	'cite_error_group_refs_without_references' => 'It-tikketti <code>&lt;ref&gt;</code> jeżistu għal grupp bl-isem "$1" imma l-ebda tikketta <code>&lt;references group="$1"/&gt;</code> rispettiva ma nstabet',
+	'cite_error_group_refs_without_references' => 'It-tikketti <code>&lt;ref&gt;</code> jeżistu għal grupp bl-isem "$1" imma l-ebda tikketta <code>&lt;references group="$1"/&gt;</code> rispettiva ma nstabet', # Fuzzy
 	'cite_error_references_group_mismatch' => 'It-tikketta <code>&lt;ref&gt;</code> f\'<code>&lt;references&gt;</code> għandha l-attribut tal-grupp "$1" f\'kunflitt.',
 	'cite_error_references_missing_group' => 'It-tikketta <code>&lt;ref&gt;</code> definita f\'<code>&lt;references&gt;</code> għandha l-attribut tal-grupp "$1" li ma jidhirx fit-test preċedenti.',
 	'cite_error_references_missing_key' => 'It-tikketta <code>&lt;ref&gt;</code> bl-isem "$1" definita f\'<code>&lt;references&gt;</code> mhix użata fit-test preċedenti.',
@@ -2669,15 +2477,13 @@ l-ebda test ma ngħata għar-refs bl-isem <code>$1</code>',
 	'cite_error_empty_references_define' => 'It-tikketta <code>&lt;ref&gt;</code> definita f\'<code>&lt;references&gt;</code> bl-isem "$1" m\'għandha l-ebda kontenut.',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Audun
+ * @author Danmichaelo
  * @author Laaknor
  */
 $messages['nb'] = array(
 	'cite-desc' => 'Legger til <nowiki><ref[ name=id]></nowiki> og <nowiki><references/></nowiki>-tagger for referanser',
-	'cite_croak' => 'Sitering døde; $1: $2',
-	'cite_error_key_str_invalid' => 'Intern feil: Ugyldig $str og/eller $key. Dette burde aldri forekomme.',
-	'cite_error_stack_invalid_input' => 'Intern feil; ugyldig stakknøkkel. Dette burde aldri forekomme.',
 	'cite_error' => 'Siteringsfeil: $1',
 	'cite_error_ref_numeric_key' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; navnet kan ikke være et enkelt heltall, bruk en beskrivende tittel',
 	'cite_error_ref_no_key' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; referanser uten innhold må inneholde navn',
@@ -2692,7 +2498,7 @@ Definér fler i <nowiki>[[MediaWiki:$2]]</nowiki>-beskjeden.',
 	'cite_error_references_no_text' => 'Ugyldig <code>&lt;ref&gt;</code>-tagg; ingen tekst ble oppgitt for referansen ved navn <code>$1</code>',
 	'cite_error_included_ref' => 'Avsluttende <code>&lt;/ref&gt;</code>-tagg mangler for <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-merker finnes, men ingen <code>&lt;references/&gt;</code>-merke funnet',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-merke finnes for gruppenavnet «$1», men ingen <code>&lt;references group="$1"/&gt;</code>-merking ble funnet',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-merker finnes for gruppenavnet «$1», men ingen <code>&lt;references group="$1"/&gt;</code>-merking ble funnet, eller det mangler et avsluttende <code>&lt;/ref&gt;</code>-merke.',
 	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code>-tagg i <code>&lt;references&gt;</code> har motstridig attributt «$1».',
 	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code>-tagg definert i <code>&lt;references&gt;</code> har gruppeattributtet «$1» som ikke forekommer i teksten.',
 	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code>-taggen med navnet «$1» definert i <code>&lt;references&gt;</code> brukes ikke i teksten.',
@@ -2706,9 +2512,6 @@ Definér fler i <nowiki>[[MediaWiki:$2]]</nowiki>-beskjeden.',
  */
 $messages['nds'] = array(
 	'cite-desc' => 'Föögt <nowiki><ref[ name=id]></nowiki> un <nowiki><references/></nowiki> Tags för Zitaten to',
-	'cite_croak' => 'Fehler bi de Referenzen. $1: $2',
-	'cite_error_key_str_invalid' => 'Internen Fehler: ungülligen $str un/oder $key. Dat schull egentlich nie vörkamen.',
-	'cite_error_stack_invalid_input' => 'Internen Fehler: ungülligen Stack-Slötel. Dat schull egentlich nie vörkamen.',
 	'cite_error' => 'Zitat-Fehler: $1',
 	'cite_error_ref_numeric_key' => 'Ungülligen Tag <tt>&lt;ref&gt;</tt>: de Naam dröff keen reine Tall wesen, bruuk en Naam, de de Saak beschrifft.',
 	'cite_error_ref_no_key' => 'Ungülligen Tag <tt>&lt;ref&gt;</tt>: „ref“ ahn Inholt mutt en Naam hebben.',
@@ -2720,31 +2523,24 @@ $messages['nds'] = array(
 	'cite_error_references_no_text' => 'Ungülligen Tag <tt>&lt;ref&gt;</tt>; is keen Text för Refs mit den Naam <tt>$1</tt> angeven.',
 	'cite_error_included_ref' => 'Dor fehlt en tosluten <code>&lt;/ref&gt;</code>',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags gifft dat, is aver keen <code>&lt;references/&gt;</code>-Tag funnen worrn.',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags för de Grupp „$1“ gifft dat, is aver keen <code>&lt;references group=„$1“/&gt;</code>-Tag funnen worrn',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags för de Grupp „$1“ gifft dat, is aver keen <code>&lt;references group=„$1“/&gt;</code>-Tag funnen worrn', # Fuzzy
 );
 
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
  * @author Servien
  */
 $messages['nds-nl'] = array(
-	'cite_croak' => 'Fout in t referentiesysteem; $1: $2',
 	'cite_error' => 'Siteerfout: $1',
 );
 
 /** Dutch (Nederlands)
+ * @author Flightmare
  * @author Niels
  * @author Romaine
  * @author Siebrand
  */
 $messages['nl'] = array(
 	'cite-desc' => 'Voegt <nowiki><ref[ name=id]></nowiki> en <nowiki><references/></nowiki> tags toe voor citaten',
-	'cite_croak' => 'Probleem met Cite; $1: $2',
-	'cite_error_key_str_invalid' => 'Interne fout;
-onjuiste $str and/of $key.
-Dit zou niet voor moeten komen.',
-	'cite_error_stack_invalid_input' => 'Interne fout;
-onjuiste stacksleutel.
-Dit zou niet voor moeten komen.',
 	'cite_error' => 'Citefout: $1',
 	'cite_error_ref_numeric_key' => 'Onjuiste tag <code>&lt;ref&gt;</code>;
 de naam kan geen eenvoudige integer zijn.
@@ -2769,24 +2565,23 @@ U kunt er meer instellen in het systeembericht <nowiki>[[MediaWiki:$2]]</nowiki>
 er is geen tekst opgegeven voor refs met de naam <code>$1</code>',
 	'cite_error_included_ref' => 'Na het label <code>&lt;ref&gt;</code> ontbreekt het afsluitende label <code>&lt;/ref&gt;</code>',
 	'cite_error_refs_without_references' => 'De tag <code>&lt;ref&gt;</code> bestaat, maar de tag <code>&lt;references/&gt;</code> is niet aangetroffen',
-	'cite_error_group_refs_without_references' => 'Er bestaat een tag <code>&lt;ref&gt;</code> voor de groep "$1", maar er is geen bijbehorende tag <code>&lt;references group="$1"/&gt;</code> aangetroffen',
+	'cite_error_group_refs_without_references' => 'Er bestaat een tag <code>&lt;ref&gt;</code> voor de groep "$1", maar er is geen bijbehorende tag <code>&lt;references group="$1"/&gt;</code>  aangetroffen of een afsluitende  <code>&lt;/ref&gt;</code> is niet aanwezig.',
 	'cite_error_references_group_mismatch' => 'De tag <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> conflicteert met groepseigenschap "$1".',
 	'cite_error_references_missing_group' => 'De tag <code>&lt;ref&gt;</code> die is gedefinieerd in <code>&lt;references&gt;</code> heeft de groepseigenschap "$1" niet niet eerder in te tekst voorkomt.',
 	'cite_error_references_missing_key' => 'De tag <code>&lt;ref&gt;</code> met de naam "$1" gedefinieerd in <code>&lt;references&gt;</code> wordt niet eerder in de tekst gebruikt.',
 	'cite_error_references_no_key' => 'De tag <code>&lt;ref&gt;</code> die is gedefinieerd in <code>&lt;references&gt;</code> heeft geen eigenschapsnaam.',
 	'cite_error_empty_references_define' => 'De tag <code>&lt;ref&gt;</code> die is gedefinieerd in <code>&lt;references&gt;</code> met de naam "$1" heeft geen inhoud.',
+	'cite_references_link_accessibility_label' => 'Omhoog',
+	'cite_references_link_many_accessibility_label' => 'Omhoog naar:',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Frokor
  * @author Harald Khan
  * @author Njardarlogar
  */
 $messages['nn'] = array(
 	'cite-desc' => 'Legg til <nowiki><ref[ name=id]></nowiki> og <nowiki><references/></nowiki>-merke for referansar',
-	'cite_croak' => 'Feil i fotnotesystemet; $1: $2',
-	'cite_error_key_str_invalid' => 'Intern feil: Ugyldig $str og/eller $key. Dette burde aldri skjedd.',
-	'cite_error_stack_invalid_input' => 'Intern feil; ugyldig stakknøkkel. Dette burde aldri skjedd.',
 	'cite_error' => 'Referansefeil: $1',
 	'cite_error_ref_numeric_key' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; namnet kan ikkje vere eit enkelt heiltal, bruk ein skildrande tittel',
 	'cite_error_ref_no_key' => 'Ugyldig <code>&lt;ref&gt;</code>-kode; referansar utan innhald må innehalde namn',
@@ -2799,7 +2594,7 @@ Definer fleire i meldinga <nowiki>[[MediaWiki:Cite references link many format b
 	'cite_error_references_no_text' => 'Ugyldig <code>&lt;ref&gt;</code>-merke; ingen tekst vart gjeven for referansen med namnet <code>$1</code>',
 	'cite_error_included_ref' => 'Avsluttande <code>&lt;/ref&gt;</code>-tagg manglar for <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-merke finst, men eit <code>&lt;references/&gt;</code>-merke finst ikkje',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-merke finst for gruppenamnet «$1», men inkje samsvarande <code>&lt;references group="$1"/&gt;</code>-merke vart funne',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-merke finst for gruppenamnet «$1», men inkje samsvarande <code>&lt;references group="$1"/&gt;</code>-merke vart funne', # Fuzzy
 );
 
 /** Occitan (occitan)
@@ -2807,11 +2602,6 @@ Definer fleire i meldinga <nowiki>[[MediaWiki:Cite references link many format b
  */
 $messages['oc'] = array(
 	'cite-desc' => 'Apond las balisas <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki>, per las citacions.',
-	'cite_croak' => 'Citacion corrompuda ; $1 : $2',
-	'cite_error_key_str_invalid' => 'Error intèrna ; 
-$str o $key incorrèctes.
-Aquò se deuriá pas jamai produsir.',
-	'cite_error_stack_invalid_input' => 'Error intèrna ; clau de pila invalida',
 	'cite_error' => 'Error de citacion : $1',
 	'cite_error_ref_numeric_key' => 'Ampèl invalid ; clau non-integrala esperada',
 	'cite_error_ref_no_key' => 'Ampèl invalid ; cap de clau pas especificada',
@@ -2829,26 +2619,21 @@ Utilizatz <code>&lt;references /&gt;</code>, o alara <code>&lt;references group=
 pas de tèxte per las referéncias nomenadas <code>$1</code>.',
 	'cite_error_included_ref' => 'Clausura <code>&lt;/ref&gt;</code> omesa per la balisa <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'La balisa <code>&lt;ref&gt;</code> existís, mas cap de balisa <code>&lt;references/&gt;</code> pas trobada.',
-	'cite_error_group_refs_without_references' => 'La balisa <code>&lt;ref&gt;</code> existís per un grop nomenat « $1 », mas cap de balisa <code>&lt;references group="$1"/&gt;</code> correspondenta pas trobada',
+	'cite_error_group_refs_without_references' => 'De balisas <code>&lt;ref&gt;</code> existisson per un grop nomenat « $1 », mas cap de balisa <code>&lt;references group="$1"/&gt;</code> correspondenta es pas estada trobada, o alara una valisa tampanta <code>&lt;/ref&gt;</code> manca.',
 	'cite_error_references_group_mismatch' => "La balisa <code>&lt;ref&gt;</code> dins <code>&lt;references&gt;</code> a l'atribut de grop « $1 » que dintra en conflicte amb lo de <code>&lt;references&gt;</code>.",
 	'cite_error_references_missing_group' => 'La balisa <code>&lt;ref&gt;</code> definida dins <code>&lt;references&gt;</code> a un gropat atribuit « $1 » que figura pas dins lo tèxte precedent.',
 	'cite_error_references_missing_key' => 'La balisa <code>&lt;ref&gt;</code> amb lo nom « $1 » definida dins <code>&lt;references&gt;</code> es pas utilizada dins lo tèxte precedent.',
 	'cite_error_references_no_key' => 'La balisa <code>&lt;ref&gt;</code> definida dins <code>&lt;references&gt;</code> a pas de nom d’atribut.',
 	'cite_error_empty_references_define' => 'La balisa <code>&lt;ref&gt;</code> definida dins <code>&lt;references&gt;</code> amb lo nom « $1 » a pas de contengut.',
+	'cite_references_link_accessibility_label' => 'Anar',
+	'cite_references_link_many_accessibility_label' => 'Anar a :',
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Psubhashish
  */
 $messages['or'] = array(
 	'cite-desc' => '<nowiki><ref[ name=id]></nowiki> ଓ <nowiki><references/></nowiki> ଟାଗସବୁ ଆଧାର ନିମନ୍ତେ ଏଠାରେ ଯୋଡ଼ିଥାଏ ।',
-	'cite_croak' => 'ଆଧାରଟି ଏବେ ଅଚଳ; $1: $2',
-	'cite_error_key_str_invalid' => 'ଭିତରର ଅସୁବିଧା;
-ଅବୈଧ $str ତଥା/କିମ୍ବା $key ।
-ଏହା ଆଉ କେବେ ଘଟିବ ଅନୁଚିତ ।',
-	'cite_error_stack_invalid_input' => 'ଭିତରର ଅସୁବିଧା;
-ଅବୈଧ କି (key) ଗଦା ।
-ଏହା ଆଉ କେବେ ଘଟିବ ଅନୁଚିତ ।',
 	'cite_error' => 'ଆଧାର ଭୁଲ: $1',
 	'cite_error_ref_numeric_key' => 'ଅବୈଧ <code>&lt;ref&gt;</code> tag;
 ନାମାଟି କେବେ ହେଲେଁ ଏକ ସଂଖ୍ୟା ହୋଇପାରିବ ନାହିଁ । ଏକ ବର୍ଣ୍ଣନାମୂଳକ ନାମ ଦିଅନ୍ତୁ ।',
@@ -2872,7 +2657,7 @@ $messages['or'] = array(
 <code>$1</code> ନାମରେ ଥିବା ଆଧାର ଭିତରେ କିଛି ଲେଖା ନାହିଁ ।',
 	'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> କୁ ବନ୍ଦ କରୁଅଛୁ; <code>&lt;ref&gt;</code> ନାହିଁ; ଚିହ୍ନ',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ଚିହ୍ନ ରହିଅଛି, କିନ୍ତୁ <code>&lt;references/&gt;</code> ଚିହ୍ନଟି ମିଳିଲା ନାହିଁ',
-	'cite_error_group_refs_without_references' => '"$1" ଗୋଠ ପାଇଁ <code>&lt;ref&gt;</code> ଚିହ୍ନ ସବୁ ରହିଅଛି, କିନ୍ତୁ କୌଣସି ବି <code>&lt;references group="$1"/&gt;</code> ଚିହ୍ନ ମିଳିଲା ନାହିଁ',
+	'cite_error_group_refs_without_references' => '"$1" ଗୋଠ ପାଇଁ <code>&lt;ref&gt;</code> ଚିହ୍ନ ସବୁ ରହିଅଛି, କିନ୍ତୁ କୌଣସି ବି <code>&lt;references group="$1"/&gt;</code> ଚିହ୍ନ ମିଳିଲା ନାହିଁ', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;references&gt ରେ <code>&lt;ref&gt;</code> ଚିହ୍ନ;</code> ର ଅସୁବିଧାଜନକ ଗୋଠ ବିଶେଷତା "$1" ।',
 	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>ରେ ଦିଆଯାଇଥିବା <code>&lt;ref&gt;</code> ଚିହ୍ନରେ "$1" ଗୋଠ ପାଇଁ ଚିହ୍ନ ଅଛି ଯାହାକି ଦରକାରୀ ଲେଖାରେ ଆସୁନାହିଁ ।',
 	'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>ରେ ଦିଆଯାଇଥିବା "$1" ନାମ ସହ ଥିବା <code>&lt;ref&gt;</code> ଚିହ୍ନ ଦରକାରୀ ଲେଖାରେ ବ୍ୟବହାର ହୋଇନାହିଁ ।',
@@ -2891,14 +2676,10 @@ $messages['pag'] = array(
  * @author Holek
  * @author Leinad
  * @author Sp5uhe
+ * @author Woytecr
  */
 $messages['pl'] = array(
 	'cite-desc' => 'Dodaje znaczniki <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki> ułatwiające podawanie źródeł cytatów',
-	'cite_croak' => 'Cytowanie nieudane; $1: $2',
-	'cite_error_key_str_invalid' => 'Błąd wewnętrzny;
-nieprawidłowy $str i/lub $key.
-To nigdy nie powinno się zdarzyć.',
-	'cite_error_stack_invalid_input' => 'Błąd wewnętrzny – nieprawidłowy klucz sterty. To nigdy nie powinno się zdarzyć.',
 	'cite_error' => "Błąd rozszerzenia ''cite'': $1",
 	'cite_error_ref_numeric_key' => 'Nieprawidłowy znacznik <code>&lt;ref&gt;</code>. Nazwa nie może być liczbą, użyj nazwy opisowej.',
 	'cite_error_ref_no_key' => 'Nieprawidłowy znacznik <code>&lt;ref&gt;</code>. Odnośnik ref z zawartością musi mieć nazwę.',
@@ -2915,12 +2696,14 @@ Zdefiniuj ich większą liczbę w komunikacie <nowiki>[[MediaWiki:$2]]</nowiki>.
 	'cite_error_references_no_text' => 'Błąd w składni elementu <code>&lt;ref&gt;</code>. Brak tekstu w przypisie o nazwie <code>$1</code>',
 	'cite_error_included_ref' => 'Brak znacznika zamykającego <code>&lt;/ref&gt;</code> po otwartym znaczniku <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Istnieje znacznik <code>&lt;ref&gt;</code>, ale nie odnaleziono znacznika <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Istnieje znacznik <code>&lt;ref&gt;</code> dla grupy o nazwie „$1”, ale nie odnaleziono odpowiedniego znacznika <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'Istnieje znacznik <code>&lt;ref&gt;</code> dla grupy o nazwie „$1”, ale nie odnaleziono odpowiedniego znacznika <code>&lt;references group="$1"/&gt;</code>, lub brakuje znacznika zamykającego <code>&lt;/ref&gt;</code>',
 	'cite_error_references_group_mismatch' => 'Znacznik <code>&lt;ref&gt;</code> w <code>&lt;references&gt;</code> nie może mieć atrybutu grupy „$1”.',
 	'cite_error_references_missing_group' => 'Znacznik <code>&lt;ref&gt;</code> zdefiniowany w <code>&lt;references&gt;</code> ma atrybut grupowania „$1”, który nie występuje wcześniej w treści.',
 	'cite_error_references_missing_key' => 'Znacznik <code>&lt;ref&gt;</code> o nazwie „$1”, zdefiniowany w <code>&lt;references&gt;</code>, nie był użyty wcześniej w treści.',
 	'cite_error_references_no_key' => 'Znacznik <code>&lt;ref&gt;</code> zdefiniowany w <code>&lt;references&gt;</code> nie ma atrybutu <code>name</code>.',
 	'cite_error_empty_references_define' => 'Znacznik <code>&lt;ref&gt;</code> zdefiniowany w <code>&lt;references&gt;</code> o nazwie „$1” nie ma treści.',
+	'cite_references_link_accessibility_label' => 'Skocz do góry',
+	'cite_references_link_many_accessibility_label' => 'Skocz do:',
 );
 
 /** Piedmontese (Piemontèis)
@@ -2929,13 +2712,6 @@ Zdefiniuj ich większą liczbę w komunikacie <nowiki>[[MediaWiki:$2]]</nowiki>.
  */
 $messages['pms'] = array(
 	'cite-desc' => 'A gionta le tichëtte <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki>, për sitassion',
-	'cite_croak' => 'Sitassion mòrta; $1: $2',
-	'cite_error_key_str_invalid' => 'Eror antern;
-$str e/o $key sbalià.
-Sòn a dovrìa mai capité.',
-	'cite_error_stack_invalid_input' => "Eror antern;
-ciav d'ambaronament pa bon-a.
-Sòn a dovrìa mai capité.",
 	'cite_error' => 'Eror ëd sitassion: $1',
 	'cite_error_ref_numeric_key' => "Tichëtta <code>&lt;ref&gt;</code> pa bon-a;
 ël nòm a peul pa esse n'antregh sempi. Deuvra un tìtol descritiv.",
@@ -2959,12 +2735,14 @@ Definissne ëd pi ant ël mëssagi <nowiki>[[MediaWiki:$2]]</nowiki>.',
 pa gnun test a l'é stàit dàit për l'arferiment ciamà <code>$1</code>",
 	'cite_error_included_ref' => 'Saradura <code>&lt;/ref&gt;</code> mancanta për la tichëtta <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => "la tichëtta <code>&lt;ref&gt;</code> a esist, ma gnun-a tichëtta <code>&lt;references/&gt;</code> a l'é stàita trovà",
-	'cite_error_group_refs_without_references' => 'Dle tichëtte <code>&lt;ref&gt;</code> a esisto për na partìa ciamà "$1", ma gnun-a tichëtta corëspondenta <code>&lt;references group="$1"/&gt;</code> a l\'é stàita trovà',
+	'cite_error_group_refs_without_references' => 'Dle tichëtte <code>&lt;ref&gt;</code> a esisto për na partìa ciamà «$1», ma gnun-a tichëtta corëspondenta <code>&lt;references group="$1"/&gt;</code> a l\'é stàita trovà opura a-i manca un delimitator final <code>&lt;/ref&gt;</code>',
 	'cite_error_references_group_mismatch' => 'La tichëtta <code>&lt;ref&gt;</code> an <code>&lt;references&gt;</code> a l\'ha n\'atribut ëd partìa "$1" an conflit.',
 	'cite_error_references_missing_group' => 'La tichëtta <code>&lt;ref&gt;</code> definìa an <code>&lt;references&gt;</code> a l\'ha n\'atribut ëd partìa "$1" che a l\'era pa ant ël test prima.',
 	'cite_error_references_missing_key' => 'La tichëtta <code>&lt;ref&gt;</code> con nòm "$1" definìa an <code>&lt;references&gt;</code> a l\'é pa dovrà ant ël test prima.',
 	'cite_error_references_no_key' => "La tichëtta <code>&lt;ref&gt;</code> definìa an <code>&lt;references&gt;</code> a l'ha pa gnun atribut ëd nòm.",
 	'cite_error_empty_references_define' => 'La tichëtta <code>&lt;ref&gt;</code> definìa an <code>&lt;references&gt;</code> con nòm "$1" a l\'ha pa gnun contnù.',
+	'cite_references_link_accessibility_label' => 'Andé',
+	'cite_references_link_many_accessibility_label' => 'Sauté a:',
 );
 
 /** Western Punjabi (پنجابی)
@@ -2972,13 +2750,6 @@ pa gnun test a l'é stàit dàit për l'arferiment ciamà <code>$1</code>",
  */
 $messages['pnb'] = array(
 	'cite-desc' => 'جوڑو <nowiki><ref[ name=id]></nowiki> تے <nowiki><references/></nowiki> ٹیگ اتے پتے لئی۔',
-	'cite_croak' => 'سائیٹ ڈائیڈ؛ $1: $2',
-	'cite_error_key_str_invalid' => 'اندرونی غلطی:
-ناں منی جان والی $وٹد تے/یا $چابی۔
-اے کدے نئیں ہونا چآغیدا۔',
-	'cite_error_stack_invalid_input' => 'اندرلی غلطی؛
-ناں منی جان والی سٹیک چابی۔
-اے کدے نئیں ہونا چائیدا',
 	'cite_error' => 'سائیٹ غلطی:$1',
 	'cite_error_ref_numeric_key' => 'ناں منیا جان والا <code>&lt;ref&gt;</code> ٹیگ؛
 ناں اک سادہ انٹیجر نئیں ہوسکدا۔ کوئی ہور دسن والا سرناواں دسو۔',
@@ -3002,7 +2773,7 @@ $messages['pnb'] = array(
 کوئی لکھت نئیں دتی گئی اتے پتے <code>$1</code> لئی۔',
 	'cite_error_included_ref' => 'بند کردا &lt;/ref&gt ؛ &lt;ref&gt دا کعاٹا ٹیک', # Fuzzy
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ٹیگ ہیگے نیں، پر کوئی <code>&lt;references/&gt;</code> ٹیگ ناں لبیا۔',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> ٹیگ اک ٹولی جیدا ناں "$1" اے ہیگے نیں، پر کوئی <code>&lt;references group="$1"/&gt;</code> ٹیگ ناں لبیا۔',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> ٹیگ اک ٹولی جیدا ناں "$1" اے ہیگے نیں، پر کوئی <code>&lt;references group="$1"/&gt;</code> ٹیگ ناں لبیا۔', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> ٹیگ ان  <code>&lt;references&gt;</code> دے رپھڑی اٹریبیوٹ "$1"۔',
 	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> ٹیگ دسیا گیا <code>&lt;references&gt;</code> دے ٹولی اٹریبیوٹ "$1" جیہڑے  پہلی لکھت چ ناں دسے۔',
 	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> ٹیگ ناں نال "$1" <code>&lt;references&gt;</code> چ دسیا گیا پہلی کسے لکھت چ نئیں ورتیا گیا۔',
@@ -3028,11 +2799,6 @@ $messages['ps'] = array(
  */
 $messages['pt'] = array(
 	'cite-desc' => 'Adiciona elementos <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> para uso em citações',
-	'cite_croak' => 'Citação com problemas; $1: $2',
-	'cite_error_key_str_invalid' => 'Erro interno;
-$str e/ou $key inválido.
-Isto nunca deveria acontecer.',
-	'cite_error_stack_invalid_input' => 'Erro interno; chave fixa inválida',
 	'cite_error' => 'Erro de citação: $1',
 	'cite_error_ref_numeric_key' => 'Código <code>&lt;ref&gt;</code> inválido; o nome não pode ser um número. Utilize um nome descritivo',
 	'cite_error_ref_no_key' => 'Código <code>&lt;ref&gt;</code> inválido; refs sem conteúdo devem ter um parâmetro de nome',
@@ -3049,7 +2815,7 @@ Defina mais na mensagem <nowiki>[[MediaWiki:$2]]</nowiki>.',
 	'cite_error_references_no_text' => 'Tag <code>&lt;ref&gt;</code> inválida; não foi fornecido texto para as refs chamadas <code>$1</code>',
 	'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> de fecho em falta, para o elemento <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'existem tags <code>&lt;ref&gt;</code>, mas nenhuma tag <code>&lt;references/&gt;</code> foi encontrada',
-	'cite_error_group_refs_without_references' => 'existem tags <code>&lt;ref&gt;</code> para um grupo chamado "$1", mas nenhuma tag <code>&lt;references group="$1"/&gt;</code> correspondente foi encontrada',
+	'cite_error_group_refs_without_references' => 'existem tags <code>&lt;ref&gt;</code> para um grupo chamado "$1", mas nenhuma tag <code>&lt;references group="$1"/&gt;</code> correspondente foi encontrada', # Fuzzy
 	'cite_error_references_group_mismatch' => 'O elemento <code>&lt;ref&gt;</code> em <code>&lt;references&gt;</code> tem o atributo de grupo "$1", que está em conflito com o de <code>&lt;references&gt;</code>.',
 	'cite_error_references_missing_group' => 'O elemento <code>&lt;ref&gt;</code> definido em <code>&lt;references&gt;</code> tem o atributo de grupo "$1", que não aparece no texto anterior.',
 	'cite_error_references_missing_key' => 'A etiqueta <code>&lt;ref&gt;</code> com nome "$1" definida em <code>&lt;references&gt;</code> não é utilizada no texto acima.',
@@ -3058,19 +2824,13 @@ Defina mais na mensagem <nowiki>[[MediaWiki:$2]]</nowiki>.',
 );
 
 /** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
  * @author Eduardo.mps
  * @author Giro720
  * @author 555
  */
 $messages['pt-br'] = array(
 	'cite-desc' => 'Adiciona marcas <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> para citações',
-	'cite_croak' => 'Citação com problemas; $1: $2',
-	'cite_error_key_str_invalid' => 'Erro interno;
-$str e/ou $key inválido.
-Isto nunca deveria acontecer.',
-	'cite_error_stack_invalid_input' => 'Erro interno;
-chave fixa inválida.
-Isto nunca deveria ocorrer.',
 	'cite_error' => 'Erro de citação: $1',
 	'cite_error_ref_numeric_key' => 'Marca <code>&lt;ref&gt;</code> inválida; 
 o nome não pode ser um número. Utilize um título descritivo',
@@ -3088,18 +2848,20 @@ só o parâmetro "group" é permitido.
 Utilize <code>&lt;references /&gt;</code>, ou <code>&lt;references group="..." /&gt;</code>',
 	'cite_error_references_no_backlink_label' => 'Etiquetas de backlink esgotadas. 
 Defina mais na mensagem <nowiki>[[MediaWiki:Cite references link many format backlink labels]]</nowiki>',
-	'cite_error_no_link_label_group' => 'Esgotamento das legendas personalizadas para links, no grupo "$1".
+	'cite_error_no_link_label_group' => 'Etiquetas personalizadas para links, no grupo "$1", esgotadas.
 Defina mais na mensagem <nowiki>[[MediaWiki:$2]]</nowiki>.',
 	'cite_error_references_no_text' => 'Marca <code>&lt;ref&gt;</code> inválida; 
 não foi fornecido texto para as refs chamadas <code>$1</code>',
 	'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> de fechamento ausente para para a marca <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'existem marcas <code>&lt;ref&gt;</code>, mas nenhuma marca <code>&lt;references/&gt;</code> foi encontrada',
-	'cite_error_group_refs_without_references' => 'existem marcas <code>&lt;ref&gt;</code> para um grupo chamado "$1", mas nenhuma marca <code>&lt;references group="$1"/&gt;</code> correspondente foi encontrada',
-	'cite_error_references_group_mismatch' => 'marca <code>&lt;ref&gt;</code> em <code>&lt;references&gt;</code> tem o atributo grupo "$1" conflitante.',
-	'cite_error_references_missing_group' => 'marca <code>&lt;ref&gt;</code> definida em <code>&lt;references&gt;</code> tem atributo grupo "$1" que não aparece no texto anterior.',
-	'cite_error_references_missing_key' => 'marca <code>&lt;ref&gt;</code> com nome "$1" definida em <code>&lt;references&gt;</code> não foi utilizada no texto anterior.',
-	'cite_error_references_no_key' => 'marca <code>&lt;ref&gt;</code> definida em <code>&lt;references&gt;</code> não tem atributo nome.',
-	'cite_error_empty_references_define' => 'marca <code>&lt;ref&gt;</code> definida em <code>&lt;references&gt;</code> com nome "$1" não tem nenhum conteúdo.',
+	'cite_error_group_refs_without_references' => 'existem marcas <code>&lt;ref&gt;</code> para um grupo chamado "$1", mas nenhuma marca <code>&lt;references group="$1"/&gt;</code> correspondente foi encontrada (ou uma marca de fechamento <code>&lt;/ref&gt;</code> está faltando)',
+	'cite_error_references_group_mismatch' => 'marca <code>&lt;ref&gt;</code> em <code>&lt;references&gt;</code> está com o atributo de grupo "$1" conflitante.',
+	'cite_error_references_missing_group' => 'marca <code>&lt;ref&gt;</code> definida em <code>&lt;references&gt;</code> está com atributo de grupo "$1" que não aparece no texto anterior.',
+	'cite_error_references_missing_key' => 'marca <code>&lt;ref&gt;</code> com nome "$1", definida em <code>&lt;references&gt;</code>, não foi utilizada no texto anterior.',
+	'cite_error_references_no_key' => 'marca <code>&lt;ref&gt;</code>, definida em <code>&lt;references&gt;</code>, não tem atributo de nome.',
+	'cite_error_empty_references_define' => 'marca <code>&lt;ref&gt;</code>, definida em <code>&lt;references&gt;</code>, com nome "$1", não tem nenhum conteúdo.',
+	'cite_references_link_accessibility_label' => 'Ir para cima',
+	'cite_references_link_many_accessibility_label' => 'Ir para:',
 );
 
 /** Quechua (Runa Simi)
@@ -3107,13 +2869,6 @@ não foi fornecido texto para as refs chamadas <code>$1</code>',
  */
 $messages['qu'] = array(
 	'cite-desc' => 'Pukyumanta willanapaq <nowiki><ref[ name=id]></nowiki> , <nowiki><references/></nowiki> unanchachakunatam yapan',
-	'cite_croak' => "''Cite'' nisqa mast'arinaqa manañam kanchu; $1: $2",
-	'cite_error_key_str_invalid' => 'Ukhu pantasqa;
-mana allin $str wan/icha $key.
-Kayqa ama hayk\'appas tukukunchu.',
-	'cite_error_stack_invalid_input' => "Ukhu pantasqa;
-tawqa llawiqa manam allinchu.
-Kayqa ama hayk'appas tukukunchu.",
 	'cite_error' => 'Pukyumanta willaypi pantasqa: $1',
 	'cite_error_ref_numeric_key' => "<code>&lt;ref&gt;</code> unanchachaqa manam allinchu;
 sutinqa ama yupaylla kachunchu. Ch'uyanchaq sutinta llamk'achiy",
@@ -3133,7 +2888,9 @@ Astawan sut'ichay <nowiki>[[MediaWiki:Cite references link many format backlink
 <code>$1</code> nisqapaq pukyu qillqa manam kanchu',
 	'cite_error_included_ref' => "Kichaq <code>&lt;ref&gt;</code> unanchachapaq wichq'aq <code>&lt;/ref&gt;</code> unanchachaqa manam kanchu",
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> unanchacham kachkan, ichataq manam <code>&lt;references/&gt;</code> unanchachachu',
-	'cite_error_group_refs_without_references' => '"$1" sutiyuq huñupaq <code>&lt;ref&gt;</code> unanchacham kachkan, ichataq manam chay huñupaq qillqasqa <code>&lt;references/&gt;</code> unanchachachu',
+	'cite_error_group_refs_without_references' => '"$1" sutiyuq huñupaq <code>&lt;ref&gt;</code> unanchacham kachkan, ichataq manam chay huñupaq qillqasqa <code>&lt;references group="$1"/&gt;</code> unanchacha manam tarisqachu, icha wichq\'aq <code>&lt;/ref&gt;</code> unanchacha manam kanchu',
+	'cite_references_link_accessibility_label' => "Hawaman t'iskuy",
+	'cite_references_link_many_accessibility_label' => "Hawaman t'iskuspa kayman riy:",
 );
 
 /** Romanian (română)
@@ -3144,13 +2901,6 @@ Astawan sut'ichay <nowiki>[[MediaWiki:Cite references link many format backlink
  */
 $messages['ro'] = array(
 	'cite-desc' => 'Adaugă etichete <nowiki><ref[ name=id]></nowiki> și <nowiki><references/></nowiki>, pentru citări',
-	'cite_croak' => 'Citare coruptă; $1 : $2',
-	'cite_error_key_str_invalid' => 'Eroare internă;
-$str invalid sau/și $key.
-Acestea nu ar trebui să se întâmple.',
-	'cite_error_stack_invalid_input' => 'Eroare internă;
-stivă cheie invalidă.
-Acestea nu ar trebui să se întâmple.',
 	'cite_error' => 'Eroare la citare: $1',
 	'cite_error_ref_numeric_key' => 'Etichetă <code>&lt;ref&gt;</code> invalidă;
 numele nu poate fi un număr. Folosește un titlu descriptiv',
@@ -3170,7 +2920,7 @@ Folosește eticheta <code>&lt;references /&gt;</code>, sau <code>&lt;references
 niciun text nu a fost furnizat pentru ref-urile numite <code>$1</code>',
 	'cite_error_included_ref' => 'Eticheta de închidere <code>&lt;/ref&gt;</code> lipsește pentru eticheta <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Etichete <code>&lt;ref&gt;</code> există, dar nu s-a găsit nicio etichetă <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Etichete <code>&lt;ref&gt;</code> există pentru un grup numit „$1”, dar nu și o etichetă <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'Etichete <code>&lt;ref&gt;</code> există pentru un grup numit „$1”, dar nu și o etichetă <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
 	'cite_error_references_group_mismatch' => 'Eticheta <code>&lt;ref&gt;</code> din <code>&lt;references&gt;</code> are atributul de grup „$1” care a intrat în conflict.',
 	'cite_error_references_missing_group' => 'Eticheta <code>&lt;ref&gt;</code> definită în <code>&lt;references&gt;</code> are atributul de grup „$1” care nu apare în textul anterior.',
 	'cite_error_references_missing_key' => 'Eticheta <code>&lt;ref&gt;</code> cu numele „$1” definită în <code>&lt;references&gt;</code> nu este utilizată în textul anterior.',
@@ -3183,13 +2933,6 @@ niciun text nu a fost furnizat pentru ref-urile numite <code>$1</code>',
  */
 $messages['roa-tara'] = array(
 	'cite-desc' => 'Aggiunge le tag <nowiki><ref[ name=id]></nowiki> and <nowiki><references/></nowiki> pe le citaziune',
-	'cite_croak' => 'Cite muerte; $1: $2',
-	'cite_error_key_str_invalid' => 'Errore inderne;
-invalide $str e/o $key.
-Quiste non g\'avessa succedere.',
-	'cite_error_stack_invalid_input' => "Errore inderne;
-stack key invalide.
-Quiste non g'avessa succedere.",
 	'cite_error' => 'Cite errore: $1',
 	'cite_error_ref_numeric_key' => "Tag <code>&lt;ref&gt;</code> invalide;
 'u nome non ge pò essere sole 'n'indere. Ause 'nu titele descrittive",
@@ -3213,12 +2956,14 @@ Definiscene otre jndr\'à \'u messàgge <nowiki>[[MediaWiki:$2]]</nowiki>.',
 nisciune teste ere previste pe le referimende nnomenate <code>$1</code>',
 	'cite_error_included_ref' => "Stè 'u tag <code>&lt;/ref&gt;</code> ma manghe <code>&lt;ref&gt;</code>",
 	'cite_error_refs_without_references' => "'u tag <code>&lt;ref&gt;</code> esiste, ma non g'esiste 'u tag <code>&lt;references/&gt;</code>",
-	'cite_error_group_refs_without_references' => '\'U tag <code>&lt;ref&gt;</code> esiste pu gruppe nomenate "$1", ma non ge corresponne a \'u tag acchiate <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => '\'U tag <code>&lt;ref&gt;</code> esiste pu gruppe nomenate "$1", ma non ge corresponne a \'u tag acchiate <code>&lt;references group="$1"/&gt;</code>, o \'nu tag de chiusure <code>&lt;/ref&gt;</code> manghe',
 	'cite_error_references_group_mismatch' => "'U tag <code>&lt;ref&gt;</code> tag jndr'à <code>&lt;references&gt;</code> tène conflitte cu l'attribbute d'u gruppe \"\$1\".",
 	'cite_error_references_missing_group' => "'U tag <code>&lt;ref&gt;</code> definite jndr'à <code>&lt;references&gt;</code> ave attribbute de gruppe \"\$1\" 'u quale non ge jesse jndr'à 'u teste prengepàle.",
 	'cite_error_references_missing_key' => "'U tag <code>&lt;ref&gt;</code> cu 'u nome \"\$1\" definite jndr'à <code>&lt;references&gt;</code> non g'avene ausate jndr'à 'u teste prengepàle.",
 	'cite_error_references_no_key' => "'U tag <code>&lt;ref&gt;</code> definite jndr'à <code>&lt;references&gt;</code> non ge tène 'nu nome d'attrebbute.",
 	'cite_error_empty_references_define' => '\'U tag <code>&lt;ref&gt;</code> definite jndr\'à <code>&lt;references&gt;</code> cu \'u nome "$1" non ge tène condenute.',
+	'cite_references_link_accessibility_label' => 'Zumbe sus',
+	'cite_references_link_many_accessibility_label' => 'Zumbe sus a:',
 );
 
 /** Russian (русский)
@@ -3228,17 +2973,11 @@ nisciune teste ere previste pe le referimende nnomenate <code>$1</code>',
  * @author KPu3uC B Poccuu
  * @author Kaganer
  * @author Kalan
+ * @author Okras
  * @author Александр Сигачёв
  */
 $messages['ru'] = array(
 	'cite-desc' => 'Добавляет теги <nowiki><ref[ name=id]></nowiki> и <nowiki><references/></nowiki> для сносок',
-	'cite_croak' => 'Цитата умерла; $1: $2',
-	'cite_error_key_str_invalid' => "Внутренняя ошибка;
-ошибочное значение '''\$str''' или '''\$key'''.
-Подобное не должно происходить.",
-	'cite_error_stack_invalid_input' => 'Внутренняя ошибка.
-Неверный ключ стека.
-Подобное не должно происходить.',
 	'cite_error' => 'Ошибка цитирования $1',
 	'cite_error_ref_numeric_key' => 'Неправильный тег <code>&lt;ref&gt;</code>;
 имя не может быть целым числом. Используйте описательное название',
@@ -3261,7 +3000,7 @@ $messages['ru'] = array(
 	'cite_error_references_no_text' => 'Неверный тег <code>&lt;ref&gt;</code>; для сносок <code>$1</code> не указан текст',
 	'cite_error_included_ref' => 'Отсутствует закрывающий тег <code>&lt;/ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Для существующего тега <code>&lt;ref&gt;</code> не найдено соответствующего тега <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Для существующих тегов <code>&lt;ref&gt;</code> группы «$1» не найдено соответствующего тега <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'Для существующих тегов <code>&lt;ref&gt;</code> группы «$1» не найдено соответствующего тега <code>&lt;references group="$1"/&gt;</code> или пропущен закрывающий тег <code>&lt;/ref&gt;</code>',
 	'cite_error_references_group_mismatch' => 'Тег <code>&lt;ref&gt;</code> в <code>&lt;references&gt;</code> имеет конфликтующие группы атрибутов «$1».',
 	'cite_error_references_missing_group' => 'Тег <code>&lt;ref&gt;</code>, определённый в <code>&lt;references&gt;</code>, имеет атрибут группы «$1», который не упоминается в тексте ранее.',
 	'cite_error_references_missing_key' => 'Тег <code>&lt;ref&gt;</code> с именем «$1», определённый в <code>&lt;references&gt;</code>, не используется в предшествующем тексте.',
@@ -3275,6 +3014,8 @@ $messages['ru'] = array(
 	'cite_references_link_many_format_backlink_labels' => 'а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я аа аб ав аг ад ае ё аж аз аи ай ак ал ам ан ао ап ар ас ат ау аф ах ац ач аш ащ аъ аы аь аэ аю ая ба бб бв бг бд бе бж бз би бй бк бл бм бн бо бп бр бс бт бу бф бх бц бч бш бщ бъ бы бь бэ бю бя ва вб вв вг вд ве вж вз ви вй вк вл вм вн во вп вр вс вт ву вф вх вц вч вш вщ въ вы вь вэ вю вя га гб гв гг гд ге гж гз ги гй гк гл гм гн го гп гр гс гт гу гф гх гц гч гш гщ гъ гы гь гэ гю гя да дб дв дг дд де дж дз ди дй дк дл дм дн до дп др дс дт ду дф дх дц дч дш дщ дъ ды дь дэ дю дя еа еб ев ег ед ее еж ез еи ей ек ел ем ен ео еп ер ес ет еу еф ех ец еч еш ещ еъ еы еь еэ ею ея жа жб жв жг жд же жж жз жи жй жк жл жм жн жо жп жр жс жт жу жф жх жц жч жш жщ жъ жы жь жэ жю жя за зб зв зг зд зе зж зз зи зй зк зл зм зн зо зп зр зс зт зу зф зх зц зч зш зщ зъ зы зь зэ зю зя иа иб ив иг ид ие иж из ии ий ик ил им ин ио ип ир ис ит иу иф их иц ич иш ищ иъ иы иь иэ ию ия йа йб йв йг йд йе йж йз йи йй йк йл йм йн йо йп йр йс йт йу йф йх йц йч йш йщ йъ йы йь йэ йю йя ка кб кв кг кд ке кж кз ки кй кк кл км кн ко кп кр кс кт ку кф кх кц кч кш кщ къ кы кь кэ кю кя ла лб лв лг лд ле лж лз ли лй лк лл лм лн ло лп лр лс лт лу лф лх лц лч лш лщ лъ лы ль лэ лю ля ма мб мв мг мд ме мж мз ми мй мк мл мм мн мо мп мр мс мт му мф мх мц мч мш мщ мъ мы мь мэ мю мя на нб нв нг нд не нж нз ни нй нк нл нм нн но нп нр нс нт ну нф нх нц нч нш нщ нъ ны нь нэ ню ня оа об ов ог од ое ож оз ои ой ок ол ом он оо оп ор ос от оу оф ох оц оч ош ощ оъ оы оь оэ ою оя па пб пв пг пд пе пж пз пи пй пк пл пм пн по пп пр пс пт пу пф пх пц пч пш пщ пъ пы пь пэ пю пя ра рб рв рг рд ре рж рз ри рй рк рл рм рн ро рп рр рс рт ру рф рх рц рч рш рщ ръ ры рь рэ рю ря са сб св сг сд се сж сз си сй ск сл см сн со сп ср сс ст су сф сх сц сч сш сщ съ сы сь сэ сю ся та тб тв тг тд те тж тз ти тй тк тл тм тн то тп тр тс тт ту тф тх тц тч тш тщ тъ ты ть тэ тю тя уа уб ув уг уд уе уж уз уи уй ук ул ум ун уо уп ур ус ут уу уф ух уц уч уш ущ уъ уы уь уэ ую уя фа фб фв фг фд фе фж фз фи фй фк фл фм фн фо фп фр фс фт фу фф фх фц фч фш фщ фъ фы фь фэ фю фя ха хб хв хг хд хе хж хз хи хй хк хл хм хн хо хп хр хс хт ху хф хх хц хч хш хщ хъ хы хь хэ хю хя ца цб цв цг цд це цж цз ци цй цк цл цм цн цо цп цр цс цт цу цф цх цц цч цш цщ цъ цы ць цэ цю ця ча чб чв чг чд че чж чз чи чй чк чл чм чн чо чп чр чс чт чу чф чх чц чч чш чщ чъ чы чь чэ чю чя ша шб шв шг шд ше шж шз ши шй шк шл шм шн шо шп шр шс шт шу шф шх шц шч шш шщ шъ шы шь шэ шю шя ща щб щв щг щд ще щж щз щи щй щк щл щм щн що щп щр щс щт щу щф щх щц щч щш щщ щъ щы щь щэ щю щя ъа ъб ъв ъг ъд ъе ъж ъз ъи ъй ък ъл ъм ън ъо ъп ър ъс ът ъу ъф ъх ъц ъч ъш ъщ ъъ ъы ъь ъэ ъю ъя ыа ыб ыв ыг ыд ые ыж ыз ыи ый ык ыл ым ын ыо ып ыр ыс ыт ыу ыф ых ыц ыч ыш ыщ ыъ ыы ыь ыэ ыю ыя ьа ьб ьв ьг ьд ье ьж ьз ьи ьй ьк ьл ьм ьн ьо ьп ьр ьс ьт ьу ьф ьх ьц ьч ьш ьщ ьъ ьы ьь ьэ ью ья эа эб эв эг эд эе эж эз эи эй эк эл эм эн эо эп эр эс эт эу эф эх эц эч эш эщ эъ эы эь ээ эю эя юа юб юв юг юд юе юж юз юи юй юк юл юм юн юо юп юр юс ют юу юф юх юц юч юш ющ юъ юы юь юэ юю юя яа яб яв яг яд яе яж яз яи яй як ял ям ян яо яп яр яс ят яу яф ях яц яч яш ящ яъ яы яь яэ яю яя',
 	'cite_references_link_many_sep' => '&#32;',
 	'cite_references_link_many_and' => '&#32;',
+	'cite_references_link_accessibility_label' => 'Перейти',
+	'cite_references_link_many_accessibility_label' => 'Перейти к:',
 );
 
 /** Rusyn (русиньскый)
@@ -3282,13 +3023,6 @@ $messages['ru'] = array(
  */
 $messages['rue'] = array(
 	'cite-desc' => 'Придасть таґы <nowiki><ref[ name="id"]></nowiki> і&nbsp;<nowiki><references /></nowiki> на означіня цітацій',
-	'cite_croak' => 'Нефункчна цітація; $1: $2',
-	'cite_error_key_str_invalid' => 'Внутрїшня хыба; 
-неплатный $str або $key. 
-Тото бы не мало ниґда настати.',
-	'cite_error_stack_invalid_input' => 'Внутрїшня хыба; 
-неплатный ключ стека. 
-Тото бы не мало ниґда настати.',
 	'cite_error' => 'Хыбна цітація: $1',
 	'cite_error_ref_numeric_key' => 'Хыба в таґу <code>&lt;ref&gt;</code>; назвов не сміє быти просте чісло, хоснуйте пописове означіня',
 	'cite_error_ref_no_key' => 'Хыба в таґу <code>&lt;ref&gt;</code>; порожнї едітації мусять обсяговати назву',
@@ -3304,7 +3038,7 @@ $messages['rue'] = array(
 	'cite_error_references_no_text' => 'Хыба в таґу <code>&lt;ref&gt;</code>; цітації означеной <code>$1</code> не є доданый жаден текст',
 	'cite_error_included_ref' => 'Хыбить закінчіня <code>&lt;/ref&gt;</code> k&nbsp;таґу <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Найджена значка <code>&lt;ref&gt;</code> без одповідной значкы <code>&lt;references/&gt;</code>.',
-	'cite_error_group_refs_without_references' => 'Найджена значка <code>&lt;ref&gt;</code> про ґрупу „$1“ без одповідной значкы <code>&lt;references group="$1"/&gt;</code>.',
+	'cite_error_group_refs_without_references' => 'Найдена значка <code>&lt;ref&gt;</code> про ґрупу „$1“, але не існує приналежна значка <code>&lt;references group="$1"/&gt;</code> або хыбить заперачій <code>&lt;/ref&gt;</code>.',
 	'cite_error_references_group_mismatch' => 'Значка <code>&lt;ref&gt;</code> внутрї <code>&lt;references&gt;</code> має дефіновану іншу ґрупу „$1“.',
 	'cite_error_references_missing_group' => 'Значка <code>&lt;ref&gt;</code> внутрї <code>&lt;references&gt;</code> хоснує ґрупу „$1“, котра ся в попереднїм текстї не обявує.',
 	'cite_error_references_missing_key' => 'На <code>&lt;ref&gt;</code> з іменом „$1“ дефінованый внутрї <code>&lt;references&gt;</code> не суть в попереднїм текстї жадны одказы.',
@@ -3318,13 +3052,6 @@ $messages['rue'] = array(
 $messages['sa'] = array(
 	'cite-desc' => '
 Adds<nowiki><ref[ name=id]></nowiki> तथा<nowiki><references/></nowiki> उद्धरणानां कृते सम्पर्कतन्तवः',
-	'cite_croak' => 'उद्धरणं निरस्तम्; $1: $2',
-	'cite_error_key_str_invalid' => 'आन्तरिकदोषः;
-अमान्यम् $str तथा/अथवा $key।
-एवं कदापि न भवेत् ।',
-	'cite_error_stack_invalid_input' => 'आन्तरिकदोषः ;
-अमान्या राशिकुञ्चिका ।
-एवं कदापि न भवेत् ।',
 	'cite_error' => 'उद्धरणे दोषः : $1',
 	'cite_error_ref_numeric_key' => '<code>&lt;ref&gt;</code> अमान्यशृङ्खला;
 नाम पूर्णाङ्कसङ्ख्या भवितुं नार्हति । विविरणयुक्तं शिरोनाम उपयुज्यताम् ।',
@@ -3346,7 +3073,7 @@ Adds<nowiki><ref[ name=id]></nowiki> तथा<nowiki><references/></nowiki> उ
 <code>$1</code> इत्यस्य आधारः अज्ञातः',
 	'cite_error_included_ref' => 'समाप्तिः <code>&lt;/ref&gt;</code> <code>&lt;ref&gt;</code> शृङ्खला लुप्ता',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>शृङ्खला विद्यते, किन्तु <code>&lt;references/&gt;</code> शृङ्खला न प्राप्ता',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> "$1" नामकस्य गणस्य अङ्कनं विद्यते, कीन्तु किमपि अनुरूपं <code>&lt;references group="$1"/&gt;</code> अङ्कनं न प्राप्तम्',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code> "$1" नामकस्य गणस्य अङ्कनं विद्यते, कीन्तु किमपि अनुरूपं <code>&lt;references group="$1"/&gt;</code> अङ्कनं न प्राप्तम्', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> टैग इन <code>&lt;references&gt;</code>सङ्घर्षगणलक्षणं "$1" विद्यते ।',
 	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> अङ्कनपरिभाषिते <code>&lt;references&gt;</code> एतस्मिन् गणस्य विशेषः "$1" यश्च पूर्वलेखे न दृष्टम् ।',
 	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> अङ्कनं "$1" नाम्ना सह परिभाषितम् <code>&lt;references&gt;</code> पूर्वलेखे उपयोगाय न जातम् ।',
@@ -3359,9 +3086,6 @@ Adds<nowiki><ref[ name=id]></nowiki> तथा<nowiki><references/></nowiki> उ
  */
 $messages['sah'] = array(
 	'cite-desc' => 'Хос быһаарыы <nowiki><ref[ name=id]></nowiki> уонна <nowiki><references/></nowiki> тиэктэрин эбэр',
-	'cite_croak' => 'Быһа тардыы суох буолбут (Цитата сдохла); $1: $2',
-	'cite_error_key_str_invalid' => 'Иһинээҕи сыыһа: $str уонна/эбэтэр $key сыыһалар.',
-	'cite_error_stack_invalid_input' => 'Иһинээҕи сыыһа: stack key сыыһалаах',
 	'cite_error' => 'Цитата сыыһата: $1',
 	'cite_error_ref_numeric_key' => 'Неправильный вызов: ожидался нечисловой ключ',
 	'cite_error_ref_no_key' => '<code>&lt;ref&gt;</code> тиэк алҕаһа (Неправильный вызов): аата (күлүүһэ) ыйыллыбатах',
@@ -3379,7 +3103,7 @@ $messages['sah'] = array(
 <code>$1</code> диэн хос быһаарыыларга аналлаах тиэкис суох',
 	'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> диэн сабар тиэк суох эбит',
 	'cite_error_refs_without_references' => 'Баар <code>&lt;ref&gt;</code> тиэккэ сөп түбэһэр <code>&lt;references/&gt;</code> тиэк көстүбэтэ',
-	'cite_error_group_refs_without_references' => '"$1" бөлөх <code>&lt;ref&gt;</code> тиэгигэр сөп түбэһэр <code>&lt;references group="$1"/&gt;</code> тиэк көстүбэтэ',
+	'cite_error_group_refs_without_references' => '"$1" бөлөх <code>&lt;ref&gt;</code> тиэгигэр сөп түбэһэр <code>&lt;references group="$1"/&gt;</code> тиэк көстүбэтэ', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> туттуллар <code>&lt;ref&gt;</code> тиэк бэйэ бэйэлэрин кытта сөпсөспөт "$1" атрибуттаах бөлөхтөрдөөх',
 	'cite_error_references_missing_group' => 'Бу <code>&lt;references&gt;</code> туттар маннык <code>&lt;ref&gt;</code> тиэгэ бөлөх тиэкиһигэр урут көрсүллүбэтэх "$1" атрибуттаах.',
 	'cite_error_references_missing_key' => 'Бу <code>&lt;references&gt;</code> туттар маннык <code>&lt;ref&gt;</code> "$1" диэн тиэгэ бу иннинээҕи тиэкискэ туттуллубат эбит.',
@@ -3388,14 +3112,12 @@ $messages['sah'] = array(
 );
 
 /** Sicilian (sicilianu)
+ * @author Markos90
  * @author Melos
  * @author Santu
  */
 $messages['scn'] = array(
 	'cite-desc' => 'Junci li tag <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> pi gistiri li citazzioni',
-	'cite_croak' => 'Sbàgghiu nnâ citazzioni: $1: $2',
-	'cite_error_key_str_invalid' => 'Sbàgghiu nternu: $str sbagghiatu',
-	'cite_error_stack_invalid_input' => 'Sbàgghiu nternu: chiavi di stack sbagghiata',
 	'cite_error' => 'Sbàgghiu nnâ funzioni Cite $1',
 	'cite_error_ref_numeric_key' => "Sbàgghiu ni l'usu dû marcaturi <code>&lt;ref&gt;</code>: lu nomu pò èssiri nu nùmmiru sanu. Usari nu tìtulu discrittivu",
 	'cite_error_ref_no_key' => "Sbàgghiu ni l'usu dû marcaturi <code>&lt;ref&gt;</code>: li ref vacanti non ponnu èssiri senza nomu.",
@@ -3409,7 +3131,7 @@ Usari <code>&lt;references /&gt;</code> oppuru <code>&lt;references group="..."
 	'cite_error_references_no_text' => 'Marcaturi <code>&lt;ref&gt;</code> non vàlidu; non vinni nnicatu nuddu testu pô marcaturi <code>$1</code>',
 	'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> di chiusura mancanti pô marcaturi <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Sù prisenti dê marcatura <code>&lt;ref&gt;</code> ma nun fu attruvatu nissunu marcaturi <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Sù prisenti dê marcatura <code>&lt;ref&gt;</code> pi nu gruppu chiamatu "$1" ma nun fu truvatu nissunu marcaturi <code>&lt;references group="$1"/&gt;</code> currispunnenti',
+	'cite_error_group_refs_without_references' => 'Sù prisenti dê marcatura <code>&lt;ref&gt;</code> pi nu gruppu chiamatu "$1" ma nun fu truvatu nissunu marcaturi <code>&lt;references group="$1"/&gt;</code> currispunnenti', # Fuzzy
 	'cite_error_references_group_mismatch' => 'Lu tag <code>&lt;ref&gt;</code> n <code>&lt;references&gt;</code> havi attribuiutu lu gruppu "$1" n conflittu.',
 	'cite_error_references_missing_group' => 'Lu tag <code>&lt;ref&gt;</code> difinutu n <code>&lt;references&gt;</code> havi n\'attributu gruppu "$1" ca nun cumpari ni lu testu pricidenti.',
 	'cite_error_references_missing_key' => 'Lu tag <code>&lt;ref&gt;</code> cu nomu "$1" difinutu n <code>&lt;references&gt;</code> nun è usatu nô testu pricidenti.',
@@ -3417,6 +3139,10 @@ Usari <code>&lt;references /&gt;</code> oppuru <code>&lt;references group="..."
 	'cite_error_empty_references_define' => 'Lu tag <code>&lt;ref&gt;</code> difinutu n <code>&lt;references&gt;</code> cu lu nomu "$1" nun havi alcun cuntinutu.',
 	'cite_reference_link_prefix' => 'muntuari ref',
 	'cite_references_link_prefix' => 'muntuari annutazzioni',
+	'cite_references_link_one' => "<li id=\"\$1\">[[#\$2|'''^''']] \$3</li>",
+	'cite_references_link_many' => "<li id=\"\$1\">'''^''' \$2 \$3</li>",
+	'cite_references_link_many_format' => "<sup>''[[#$1|$3]]''</sup>", # Fuzzy
+	'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
 );
 
 /** Sinhala (සිංහල)
@@ -3426,13 +3152,6 @@ Usari <code>&lt;references /&gt;</code> oppuru <code>&lt;references group="..."
  */
 $messages['si'] = array(
 	'cite-desc' => 'උපහරණයන් සඳහා, <nowiki><ref[ name=id]></nowiki> සහ <nowiki><references/></nowiki> ටැගයන්, එකතු කරයි',
-	'cite_croak' => 'උපන්‍යාසය නිරුද්ධවිය; $1: $2',
-	'cite_error_key_str_invalid' => 'අභ්‍යන්තර දෝෂය;
-අනීතික  $str සහ/හෝ $key.
-මෙය කිසිදින සිදුනොවිය යුතුය.',
-	'cite_error_stack_invalid_input' => 'අභ්‍යන්තර දෝෂය;
-අනීතික ඇසිරුම්  යතුර.
-මෙය කිසිදින සිදුනොවිය යුතුය.',
 	'cite_error' => 'උපන්‍යාස දෝෂය: $1',
 	'cite_error_ref_numeric_key' => 'අනීතික <code>&lt;ref&gt;</code> ටැගය;
 නම සරල  පූර්ණාංකයක් විය නොහැක. විස්තරශීලි ශිර්ෂයක් භාවිතා කරන්න',
@@ -3456,7 +3175,7 @@ $messages['si'] = array(
 <code>$1</code> නමැති ආශ්‍රේයන් සඳහා කිසිදු පෙළක් සපයා නොතිබුණි',
 	'cite_error_included_ref' => '<code>&lt;ref&gt;</code> ටැගය සොයාගත නොහැකි බැවින් <code>&lt;/ref&gt;</code> වසා දමමින්',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> ටැග පැවතුණත්, <code>&lt;references/&gt;</code> ටැග සොයාගත නොහැකි විය.',
-	'cite_error_group_refs_without_references' => '"$1" නම් කණ්ඩායම සඳහා <code>&lt;ref&gt;</code> ටැග පැවතුණත්, ඊට අදාළ <code>&lt;references group="$1"/&gt;</code> ටැග සොයාගත නොහැකි විය.',
+	'cite_error_group_refs_without_references' => '"$1" නම් කණ්ඩායම සඳහා <code>&lt;ref&gt;</code> ටැග පැවතුණත්, ඊට අදාළ <code>&lt;references group="$1"/&gt;</code> ටැග සොයාගත නොහැකි විය.', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code> හි <code>&lt;ref&gt;</code> නම් ටැගය "$1" යන පරස්පර සමූහ ගුණාංග දරයි.',
 	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code> හි <code>&lt;ref&gt;</code> ටැගය පෙර පෙළෙහි නොතිබූ "$1" නම් සමූහ ගුණාංගයක් දරයි.',
 	'cite_error_references_missing_key' => '<code>&lt;references&gt;</code> හි "$1" නමැති <code>&lt;ref&gt;</code> ටැගය පෙර පෙළෙහි භාවිතා වූයේ නැත.',
@@ -3471,11 +3190,6 @@ $messages['si'] = array(
  */
 $messages['sk'] = array(
 	'cite-desc' => 'Pridáva značky <nowiki><ref[ name=id]></nowiki> a <nowiki><references/></nowiki> pre citácie',
-	'cite_croak' => 'Citát je už neaktuálny; $1: $2',
-	'cite_error_key_str_invalid' => 'Vnútorná chyba;
-neplatný $str a/alebo $key.
-Toto by sa nemalo nikdy stať.',
-	'cite_error_stack_invalid_input' => 'Vnútorná chyba; neplatný kľúč zásobníka',
 	'cite_error' => 'Chyba citácie $1',
 	'cite_error_ref_numeric_key' => 'Neplatné volanie; očakáva sa neceločíselný typ kľúča',
 	'cite_error_ref_no_key' => 'Neplatné volanie; nebol špecifikovaný kľúč',
@@ -3491,7 +3205,7 @@ Definujte ďalšie v správe <nowiki>[[MediaWiki:$2]]</nowiki>.',
 	'cite_error_references_no_text' => 'Neplatná značka <code>&lt;ref&gt;</code>; nebol zadaný text pre referencie s názvom <code>$1</code>',
 	'cite_error_included_ref' => 'Chýba zakončenie značky <code>&lt;ref&gt;</code> (<code>&lt;/ref&gt;</code>)',
 	'cite_error_refs_without_references' => 'Značky <code>&lt;ref&gt;</code> sú prítomné, ale nebola nájdená žiadna značka <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Značky <code>&lt;ref&gt;</code> pre skupinu „$1“ sú prítomné, ale nebola nájdená zodpovedajúca značka  <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'Značky <code>&lt;ref&gt;</code> pre skupinu „$1“ sú prítomné, ale nebola nájdená zodpovedajúca značka  <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
 	'cite_error_references_group_mismatch' => 'Značka <code>&lt;ref&gt;</code> v <code>&lt;references&gt;</code> má konfliktný atribút skupiny „$1“.',
 	'cite_error_references_missing_group' => 'Značka <code>&lt;ref&gt;</code> v <code>&lt;references&gt;</code> má atribút skupiny „$1“, ktorý sa v predošlom texte nevyskytuje.',
 	'cite_error_references_missing_key' => 'Značka <code>&lt;ref&gt;</code> s názvom „$1“ definovaná v <code>&lt;references&gt;</code> sa v predošlom texte nevyskytuje.',
@@ -3504,13 +3218,6 @@ Definujte ďalšie v správe <nowiki>[[MediaWiki:$2]]</nowiki>.',
  */
 $messages['sl'] = array(
 	'cite-desc' => 'Doda etiketi <nowiki><ref[ name=id]></nowiki> in <nowiki><references/></nowiki> za navajanje',
-	'cite_croak' => 'Hreščeča navedba; $1: $2',
-	'cite_error_key_str_invalid' => 'Notranja napaka;
-neveljaven $str in/ali $key.
-To se ne bi nikoli smelo zgoditi.',
-	'cite_error_stack_invalid_input' => 'Notranja napaka;
-neveljavni skladovni ključ.
-To se ne bi nikoli smelo zgoditi.',
 	'cite_error' => 'Napaka pri navajanju: $1',
 	'cite_error_ref_numeric_key' => 'Neveljavna oznaka <code>&lt;ref&gt;</code>;
 ime ne more biti samo število. Uporabite opisni naslov',
@@ -3534,7 +3241,7 @@ Določite jih več v sporočilu <nowiki>[[MediaWiki:$2]]</nowiki>.',
 sklici imenovani <code>$1</code> nimajo določenega besedila',
 	'cite_error_included_ref' => 'Zaključek <code>&lt;/ref&gt;</code> manjka za etiketo <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Obstajajo etikete <code>&lt;ref&gt;</code>, vendar etikete <code>&lt;references/&gt;</code> ni bilo mogoče najti',
-	'cite_error_group_refs_without_references' => 'Obstajajo etikete <code>&lt;ref&gt;</code> za skupino, imenovano »$1«, vendar ustrezne etikete <code>&lt;references group="$1"/&gt;</code> ni bilo mogoče najti',
+	'cite_error_group_refs_without_references' => 'Obstajajo etikete <code>&lt;ref&gt;</code> za skupino, imenovano »$1«, vendar ustrezne etikete <code>&lt;references group="$1"/&gt;</code> ni bilo mogoče najti ali pa manjka zaključni <code>&lt;/ref&gt;</code>',
 	'cite_error_references_group_mismatch' => 'Oznaka <code>&lt;ref&gt;</code> v <code>&lt;references&gt;</code> ima atribut nasprotujoče si skupine »$1«.',
 	'cite_error_references_missing_group' => 'Oznaka <code>&lt;ref&gt;</code>, opredeljena v <code>&lt;references&gt;</code>, ima atribut skupine »$1«, ki se ne pojavi v predhodnem besedilu.',
 	'cite_error_references_missing_key' => 'Oznaka <code>&lt;ref&gt;</code> z imenom »$1«, opredeljena v <code>&lt;references&gt;</code>, ni uporabljena v predhodnem besedilu.',
@@ -3543,6 +3250,8 @@ sklici imenovani <code>$1</code> nimajo določenega besedila',
 	'cite_references_link_one' => '<li id="$1"><span class="mw-cite-backlink">\'\'\'[[#$2|^]]\'\'\'</span> $3</li>',
 	'cite_references_link_many' => '<li id="$1"><span class="mw-cite-backlink">^ $2</span> $3</li>',
 	'cite_references_link_many_format_backlink_labels' => 'a b c č d e f g h i j k l m n o p r s š t u v z ž a aa ab ac ač ad ae af ag ah ai aj ak al am an ao ap ar as aš at au av az až b ba bb bc bč bd be bf bg bh bi bj bk bl bm bn bo bp br bs bš bt bu bv bz bž c ca cb cc cč cd ce cf cg ch ci cj ck cl cm cn co cp cr cs cš ct cu cv cz cž č ča čb čc čč čd če čf čg čh či čj čk čl čm čn čo čp čr čs čš čt ču čv čz čž d da db dc dč dd de df dg dh di dj dk dl dm dn do dp dr ds dš dt du dv dz dž e ea eb ec eč ed ee ef eg eh ei ej ek el em en eo ep er es eš et eu ev ez ež f fa fb fc fč fd fe ff fg fh fi fj fk fl fm fn fo fp fr fs fš ft fu fv fz fž g ga gb gc gč gd ge gf gg gh gi gj gk gl gm gn go gp gr gs gš gt gu gv gz gž h ha hb hc hč hd he hf hg hh hi hj hk hl hm hn ho hp hr hs hš ht hu hv hz hž i ia ib ic ič id ie if ig ih ii ij ik il im in io ip ir is iš it iu iv iz iž j ja jb jc jč jd je jf jg jh ji jj jk jl jm jn jo jp jr js jš jt ju jv jz jž k ka kb kc kč kd ke kf kg kh ki kj kk kl km kn ko kp kr ks kš kt ku kv kz kž l la lb lc lč ld le lf lg lh li lj lk ll lm ln lo lp lr ls lš lt lu lv lz lž m ma mb mc mč md me mf mg mh mi mj mk ml mm mn mo mp mr ms mš mt mu mv mz mž n na nb nc nč nd ne nf ng nh ni nj nk nl nm nn no np nr ns nš nt nu nv nz nž o oa ob oc oč od oe of og oh oi oj ok ol om on oo op or os oš ot ou ov oz ož p pa pb pc pč pd pe pf pg ph pi pj pk pl pm pn po pp pr ps pš pt pu pv pz pž r ra rb rc rč rd re rf rg rh ri rj rk rl rm rn ro rp rr rs rš rt ru rv rz rž s sa sb sc sč sd se sf sg sh si sj sk sl sm sn so sp sr ss sš st su sv sz sž š ša šb šc šč šd še šf šg šh ši šj šk šl šm šn šo šp šr šs šš št šu šv šz šž t ta tb tc tč td te tf tg th ti tj tk tl tm tn to tp tr ts tš tt tu tv tz tž u ua ub uc uč ud ue uf ug uh ui uj uk ul um un uo up ur us uš ut uu uv uz už v va vb vc vč vd ve vf vg vh vi vj vk vl vm vn vo vp vr vs vš vt vu vv vz vž z za zb zc zč zd ze zf zg zh zi zj zk zl zm zn zo zp zr zs zš zt zu zv zz zž ž ža žb žc žč žd že žf žg žh ži žj žk žl žm žn žo žp žr žs žš žt žu žv žz žž',
+	'cite_references_link_accessibility_label' => 'Skoči gor',
+	'cite_references_link_many_accessibility_label' => 'Skoči gor na:',
 );
 
 /** Albanian (shqip)
@@ -3551,13 +3260,6 @@ sklici imenovani <code>$1</code> nimajo določenega besedila',
  */
 $messages['sq'] = array(
 	'cite-desc' => 'Shton etiketa <nowiki><ref[ name=id]></nowiki> dhe <nowiki><references/></nowiki> për citime',
-	'cite_croak' => 'Gabim në sistem; $1: $2',
-	'cite_error_key_str_invalid' => 'Gabim i brendshëm;
-$str dhe/ose $key i pavlefshëm
-Kjo nuk duhet të ndodhë kurrë.',
-	'cite_error_stack_invalid_input' => 'Gabim i brendshëm;
-stack key i pavlefshëm
-Kjo nuk duhet të ndodhë kurrë.',
 	'cite_error' => 'Gabim referencash: $1',
 	'cite_error_ref_numeric_key' => 'Etiketë <code>&lt;ref&gt;</code> e pavlefshme;
 emri nuk mund të jetë një numër i plotë i thjeshtë. Përdorni një titull përshkrues',
@@ -3581,7 +3283,7 @@ Percaktoni më shumë në <nowiki> [[MediaWiki:$2]] </nowiki> mesazh.',
 asnjë tekst nuk u dha për refs e quajtura <code>$1</code>',
 	'cite_error_included_ref' => 'Duke mbyllur <code>&lt;/ref&gt;</code> mungon për etiketën <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Etiketat <code>&lt;ref&gt;</code> ekzistojnë, por nuk u gjet etiketa <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Etiketat <code>&lt;ref&gt;</code> ekzistojnë për një grup të quajtur "$1", por nuk u gjet etiketa korresponduese <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'Etiketat <code>&lt;ref&gt;</code> ekzistojnë për një grup të quajtur "$1", por nuk u gjet etiketa korresponduese <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code> tag in <code>&lt;references&gt;</code> has conflicting group attribute "$1".',
 	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code> etiketa e përcaktuar në <code>&lt;referenca&gt;</code> ka atribut grup "$1" që nuk duket në tekstin paraprak.',
 	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> etiketa me emrin "$1" e percaktuar ne <code>&lt;referenca&gt;</code> nuk është përdorur në tekst paraprak.',
@@ -3596,9 +3298,6 @@ asnjë tekst nuk u dha për refs e quajtura <code>$1</code>',
  */
 $messages['sr-ec'] = array(
 	'cite-desc' => 'Додаје <nowiki><ref[ name=id]></nowiki> и <nowiki><references/></nowiki> ознаке за цитирање.',
-	'cite_croak' => 'Додатак за цитирање је неисправан; $1: $2.',
-	'cite_error_key_str_invalid' => 'Унутрашња грешка; лош $str и/или $key. Ово не би требало никад да се деси.',
-	'cite_error_stack_invalid_input' => 'Унутрашња грешка; лош кључ стека. Ово не би требало никад да се деси.',
 	'cite_error' => 'Грешка цитата: $1',
 	'cite_error_ref_numeric_key' => 'Лоша ознака <code>&lt;ref&gt;</code>; име не може бити једноставни интеџер. Користи описни наслов.',
 	'cite_error_ref_no_key' => 'Лоша ознака <code>&lt;ref&gt;</code>; ref-ови без садржаја морају имати име.',
@@ -3610,7 +3309,7 @@ $messages['sr-ec'] = array(
 	'cite_error_references_no_text' => 'Лоша ознака <code>&lt;ref&gt;</code>; нема текста за ref-ове под именом <code>$1</code>.',
 	'cite_error_included_ref' => 'Затвара <code>&lt;/ref&gt;</code> који недостаје <code>&lt;ref&gt;</code> тагу',
 	'cite_error_refs_without_references' => 'Чланак има ознаке <code>&lt;ref&gt;</code>, али није пронађена потребна ознака <code>&#123;&#123;наводи&#125;&#125;</code> (или <code>&lt;references/&gt;</code>)',
-	'cite_error_group_refs_without_references' => 'Постоје ознаке <code>&lt;ref&gt;</code> за групу с именом „$1“, али нема одговарајуће ознаке <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'Постоје ознаке <code>&lt;ref&gt;</code> за групу с именом „$1“, али нема одговарајуће ознаке <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
 	'cite_reference_link_key_with_num' => '$1_$2',
 	'cite_reference_link_prefix' => 'cite_ref-',
 	'cite_references_link_prefix' => 'cite_note-',
@@ -3628,9 +3327,6 @@ $messages['sr-ec'] = array(
  */
 $messages['sr-el'] = array(
 	'cite-desc' => 'Dodaje <nowiki><ref[ name=id]></nowiki> i <nowiki><references/></nowiki> oznake za citiranje.',
-	'cite_croak' => 'Dodatak za citiranje je umro; $1: $2.',
-	'cite_error_key_str_invalid' => 'Unutrašnja greška; loš $str i/ili $key. Ovo ne bi trebalo nikad da se desi.',
-	'cite_error_stack_invalid_input' => 'Unutrašnja greška; loš ključ steka. Ovo ne bi trebalo nikad da se desi.',
 	'cite_error' => 'Greška citata: $1',
 	'cite_error_ref_numeric_key' => 'Loša oznaka <code>&amp;lt;ref&amp;gt;</code>; ime ne može biti jednostavni intedžer. Koristi opisni naslov.',
 	'cite_error_ref_no_key' => 'Loša oznaka <code>&amp;lt;ref&amp;gt;</code>; ref-ovi bez sadržaja moraju imati ime.',
@@ -3642,7 +3338,7 @@ $messages['sr-el'] = array(
 	'cite_error_references_no_text' => 'Loša oznaka <code>&amp;lt;ref&amp;gt;</code>; nema teksta za ref-ove pod imenom <code>$1</code>.',
 	'cite_error_included_ref' => 'Zatvara <code>&lt;/ref&gt;</code> koji nedostaje <code>&lt;ref&gt;</code> tagu',
 	'cite_error_refs_without_references' => '<code>&amp;lt;ref&amp;gt;</code> tag postoji, ali odgovarajući <code>&amp;lt;references/&amp;gt;</code> tag nije nađen',
-	'cite_error_group_refs_without_references' => '<code><ref></code> tagovi postoje za grupu pod imenom "$1", ali nije nađen odgovarajući <code><references group="$1"/></code> tag',
+	'cite_error_group_refs_without_references' => '<code><ref></code> tagovi postoje za grupu pod imenom "$1", ali nije nađen odgovarajući <code><references group="$1"/></code> tag', # Fuzzy
 	'cite_reference_link_key_with_num' => '$1_$2',
 	'cite_reference_link_prefix' => 'cite_ref-',
 	'cite_references_link_prefix' => 'cite_note-',
@@ -3660,9 +3356,6 @@ $messages['sr-el'] = array(
  */
 $messages['stq'] = array(
 	'cite-desc' => 'Föiget foar Wällenätterwiese do <nowiki><ref[ name=id]></nowiki> un <nowiki><references/></nowiki> Tags tou',
-	'cite_croak' => 'Failer in dät Referenz-System. $1: $2',
-	'cite_error_key_str_invalid' => 'Internen Failer: uungultigen $str un/of $key. Dit skuul eegentelk goar nit passierje konne.',
-	'cite_error_stack_invalid_input' => 'Internen Failer: uungultigen „name“-stack. Dit skuul eegentelk goarnit passierje konne.',
 	'cite_error' => 'Referenz-Failer $1',
 	'cite_error_ref_numeric_key' => 'Uungultige <code><nowiki><ref></nowiki></code>-Ferweendenge: „name“ duur naan skeenen Taalenwäid weese, benutsje n beskrieuwenden Noome.',
 	'cite_error_ref_no_key' => 'Uungultige <code><nowiki><ref></nowiki></code>-Ferweendenge: „ref“ sunner Inhoold mout n Noome hääbe.',
@@ -3674,7 +3367,7 @@ $messages['stq'] = array(
 	'cite_error_references_no_text' => 'Uungultigen <code>&lt;ref&gt;</code>-Tag; der wuude naan Text foar dät Ref mäd dän Noome <code>$1</code> anroat.',
 	'cite_error_included_ref' => 'Der failt n sluutend <code>&lt;/ref&gt;</code>',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags existierje, daach neen <code>&lt;references/&gt;</code>-Tag wuud fuunen.',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags existierje foar ju Gruppe „$1“, man neen deertou heerend <code>&lt;references group=„$1“/&gt;</code>-Tag wuud fuunen',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-Tags existierje foar ju Gruppe „$1“, man neen deertou heerend <code>&lt;references group=„$1“/&gt;</code>-Tag wuud fuunen', # Fuzzy
 	'cite_error_references_group_mismatch' => 'Dät <code>&lt;ref&gt;</code>-Tag in <code>&lt;references&gt;</code> häd dät Konfliktgruppenattribut „$1“.',
 	'cite_error_references_missing_group' => 'Dät <code>&lt;ref&gt;</code> Tag, as definierd in <code>&lt;references&gt;</code> häd dät Gruppenattribut "$1", dät nit in dän foaruutgungende Text foarkumt.',
 	'cite_error_references_missing_key' => 'Dät in <code>&lt;references&gt;</code> definierde <code>&lt;ref&gt;</code>-Tag mäd dän Noome „$1“ wäd in dän foaruutgungende Text nit ferwoand.',
@@ -3687,21 +3380,19 @@ $messages['stq'] = array(
  */
 $messages['su'] = array(
 	'cite-desc' => 'Nambahkeun tag <nowiki><ref[ name=id]></nowiki> jeung <nowiki><references/></nowiki>, pikeun cutatan',
-	'cite_error_key_str_invalid' => 'Kasalahan internal; salah $str jeung/atawa $key. Kuduna mah teu kieu.',
 );
 
 /** Swedish (svenska)
  * @author Boivie
  * @author Fluff
+ * @author Jopparn
  * @author Lejonel
  * @author M.M.S.
  * @author Najami
+ * @author Skalman
  */
 $messages['sv'] = array(
 	'cite-desc' => 'Lägger till taggarna <nowiki><ref[ name=id]></nowiki> och <nowiki><references/></nowiki> för referenser till källor',
-	'cite_croak' => 'Fel i fotnotssystemet; $1: $2',
-	'cite_error_key_str_invalid' => 'Internt fel; $str eller $key är ogiltiga.  Det här borde aldrig hända.',
-	'cite_error_stack_invalid_input' => 'Internt fel; ogiltig nyckel i stacken.  Det här borde aldrig hända.',
 	'cite_error' => 'Referensfel: $1',
 	'cite_error_ref_numeric_key' => "Ogiltig <code>&lt;ref&gt;</code>-tag; parametern 'name' kan inte vara ett tal, använd ett beskrivande namn",
 	'cite_error_ref_no_key' => 'Ogiltig <code>&lt;ref&gt;</code>-tag; referenser utan innehåll måste ha ett namn',
@@ -3718,27 +3409,27 @@ Definera fler i <nowiki>[[MediaWiki:$2]]</nowiki>-meddelandet.',
 	'cite_error_references_no_text' => 'Ogiltig <code>&lt;ref&gt;</code>-tag; ingen text har angivits för referensen med namnet <code>$1</code>',
 	'cite_error_included_ref' => 'Avslutande <code>&lt;/ref&gt;</code> saknas för <code>&lt;ref&gt;</code>-tagg',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>-taggar finns, men ingen <code>&lt;references/&gt;</code>-tagg hittades',
-	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-taggar finns för gruppnamnet "$1", men ingen motsvarande <code>&lt;references group="$1"/&gt;</code>-tagg hittades',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>-taggar finns för gruppnamnet "$1", men ingen motsvarande <code>&lt;references group="$1"/&gt;</code>-tagg hittades, eller så saknas en avslutande <code>&lt;/ref&gt;</code>',
 	'cite_error_references_group_mismatch' => '<code>&lt;ref&gt;</code>-tagg i <code>&lt;references&gt;</code> har ett motstridigt group-attribut "$1".',
 	'cite_error_references_missing_group' => '<code>&lt;ref&gt;</code>-tagg definierad i  <code>&lt;references&gt;</code> har ett group-attribut "$1" som inte används innan i texten.',
 	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code>-tagg med namnet "$1", definierad i <code>&lt;references&gt;</code> används inte innan i texten.',
 	'cite_error_references_no_key' => '<code>&lt;ref&gt;</code>-tagg definierad i <code>&lt;references&gt;</code> saknar name-attribut.',
 	'cite_error_empty_references_define' => '<code>&lt;ref&gt;</code>-tagg definierad i <code>&lt;ref&gt;</code> med namnet "$1" har inget innehåll.',
+	'cite_references_link_accessibility_label' => 'Hoppa upp',
+	'cite_references_link_many_accessibility_label' => 'Hoppa upp till:',
 );
 
 /** Tamil (தமிழ்)
+ * @author Jayarathina
  * @author Shanmugamp7
  * @author செல்வா
  */
 $messages['ta'] = array(
 	'cite-desc' => 'சேர்க்கிறது <nowiki><ref[ name=id]></nowiki>மற்றும் <nowiki><references/></nowiki> குறிச்சொற்கள், மேற்கோள்களுக்காக',
-	'cite_error_key_str_invalid' => 'உள் பிழை;
- செல்லாத $ எழுத்துச்சரம் மற்றும்/அல்லது $  விசை.
-இது  ஒருபோதும் ஏற்பட கூடாது..',
-	'cite_error_stack_invalid_input' => 'உள் பிழை;
-செல்லாத அடுக்கு விசை.
-இது  ஒருபோதும் ஏற்பட கூடாது..',
 	'cite_error' => 'பிழை காட்டு: $1',
+	'cite_error_references_no_text' => 'செல்லாத <code>&lt;ref&gt;</code> குறிச்சொல்;
+<code>$1</code> என்னும் பெயரில் உள்ள ref குறிச்சொல்லுக்கு உரையேதும் வழங்கப்படவில்லை',
+	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> குறிச்சொல் உள்ளது, ஆனால் <code>&lt;references/&gt;</code> குறிச்சொல் காணப்படவில்லை',
 );
 
 /** Telugu (తెలుగు)
@@ -3747,9 +3438,6 @@ $messages['ta'] = array(
  */
 $messages['te'] = array(
 	'cite-desc' => 'ఉదహరింపులకు <nowiki><ref[ name=id]></nowiki> మరియు <nowiki><references/></nowiki> టాగులను చేర్చుతుంది',
-	'cite_croak' => 'ఉదహరింపు చచ్చింది; $1: $2',
-	'cite_error_key_str_invalid' => 'అంతర్గత పొరపాటు: తప్పుడు $str మరియు/లేదా $key. ఇది ఎప్పుడూ జరగకూడదు.',
-	'cite_error_stack_invalid_input' => 'అంతర్గత పొరపాటు: తప్పుడు స్టాక్ కీ. ఇది ఎప్పుడూ జరగకూడదు.',
 	'cite_error' => 'ఉదహరింపు పొరపాటు: $1',
 	'cite_error_ref_numeric_key' => 'తప్పుడు <code>&lt;ref&gt;</code> టాగు; పేరు సరళ సంఖ్య అయివుండకూడదు, వివరమైన శీర్షిక వాడండి',
 	'cite_error_ref_no_key' => 'సరైన <code>&lt;ref&gt;</code> ట్యాగు కాదు; విషయం లేని ref లకు తప్పనిసరిగా పేరొకటుండాలి',
@@ -3765,9 +3453,6 @@ $messages['te'] = array(
  */
 $messages['tg-cyrl'] = array(
 	'cite-desc' => 'Барчасбҳои <nowiki><ref[ name=id]></nowiki> ва <nowiki><references/></nowiki>  барои ёд кардан, изофа мекунад',
-	'cite_croak' => 'Ёд кардан хароб шуд; $1: $2',
-	'cite_error_key_str_invalid' => 'Хатои дохилӣ; $str ва/ё $key ғайримиҷоз.  Ин хато набояд ҳаргиз рух диҳад.',
-	'cite_error_stack_invalid_input' => 'Хатои дохилӣ; клиди пушта ғайримиҷоз.  Ин хато набояд ҳаргиз рух диҳад.',
 	'cite_error' => 'Хатои ёдкард: $1',
 	'cite_error_ref_numeric_key' => 'Барчасби <code>&lt;ref&gt;</code> ғайримиҷоз; ном наметавонад як адад бошад, унвони возеҳтареро истифода кунед',
 	'cite_error_ref_no_key' => 'Барчасби <code>&lt;ref&gt;</code> ғайримиҷоз; ёдкардҳо бидуни мӯҳтаво бояд ном дошта бошанд',
@@ -3786,9 +3471,6 @@ $messages['tg-cyrl'] = array(
  */
 $messages['tg-latn'] = array(
 	'cite-desc' => 'Barcasbhoi <nowiki><ref[ name=id]></nowiki> va <nowiki><references/></nowiki>  baroi jod kardan, izofa mekunad',
-	'cite_croak' => 'Jod kardan xarob şud; $1: $2',
-	'cite_error_key_str_invalid' => 'Xatoi doxilī; $str va/jo $key ƣajrimiçoz.  In xato nabojad hargiz rux dihad.',
-	'cite_error_stack_invalid_input' => 'Xatoi doxilī; klidi puşta ƣajrimiçoz.  In xato nabojad hargiz rux dihad.',
 	'cite_error' => 'Xatoi jodkard: $1',
 	'cite_error_ref_numeric_key' => 'Barcasbi <code>&lt;ref&gt;</code> ƣajrimiçoz; nom nametavonad jak adad boşad, unvoni vozehtarero istifoda kuned',
 	'cite_error_ref_no_key' => 'Barcasbi <code>&lt;ref&gt;</code> ƣajrimiçoz; jodkardho biduni mūhtavo bojad nom doşta boşand',
@@ -3808,13 +3490,6 @@ Barcasbi <code>&lt;references /&gt;</code> jo <code>&lt;references group="..." /
  */
 $messages['th'] = array(
 	'cite-desc' => 'ใส่ <nowiki><ref[ name=id]></nowiki> และ <nowiki><references /></nowiki> สำหรับการอ้างอิง',
-	'cite_croak' => 'แหล่งอ้างอิงเสีย; $1: $2',
-	'cite_error_key_str_invalid' => 'ข้อผิดพลาดภายใน
-$str และ/หรือ $key ไม่ถูกต้อง
-ซึ่งไม่ควรเกิดขึ้น',
-	'cite_error_stack_invalid_input' => 'ข้อผิดพลาดภายใน
-กุญแจกองซ้อนไม่ถูกต้อง
-ซึ่งไม่ควรเกิดขึ้น',
 	'cite_error' => 'อ้างอิงผิดพลาด: $1',
 	'cite_error_ref_numeric_key' => 'ป้ายระบุ <code>&lt;ref&gt;</code> ไม่ถูกต้อง
 ชื่อไม่สามารถเป็นจำนวนเต็มอย่างง่าย ใช้ชื่อเรื่องที่พรรณนา',
@@ -3834,7 +3509,7 @@ $str และ/หรือ $key ไม่ถูกต้อง
 ไม่มีข้อความใดให้ไว้สำหรับอ้างอิงชื่อ <code>$1</code>',
 	'cite_error_included_ref' => 'ไม่มีการปิด <code>&lt;/ref&gt;</code> สำหรับ <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'มีป้ายระบุ <code>&lt;ref&gt;</code> อยู่ แต่ไม่พบป้ายระบุ <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'มีป้ายระบุ <code>&lt;ref&gt;</code> สำหรับกลุ่มชื่อ "$1" แต่ไม่พบป้ายระบุ <code>&lt;references group="$1"/&gt;</code> ที่สอดคล้องกัน',
+	'cite_error_group_refs_without_references' => 'มีป้ายระบุ <code>&lt;ref&gt;</code> สำหรับกลุ่มชื่อ "$1" แต่ไม่พบป้ายระบุ <code>&lt;references group="$1"/&gt;</code> ที่สอดคล้องกัน', # Fuzzy
 	'cite_error_references_missing_key' => 'ป้ายระบุ <code>&lt;ref&gt;</code> ชื่อ "$1" มีนิยามใน  <code>&lt;references&gt;</code> แต่ไม่ถูกใช้ในข้อความก่อนหน้านี้',
 	'cite_error_empty_references_define' => 'ป้ายระบุ <code>&lt;ref&gt;</code> ที่นิยามใน <code>&lt;references&gt;</code> ด้วยชื่อ "$1" ไม่มีเนื้อหา',
 );
@@ -3843,13 +3518,6 @@ $str และ/หรือ $key ไม่ถูกต้อง
  * @author Hanberke
  */
 $messages['tk'] = array(
-	'cite_croak' => 'Sita ýitirildi; $1: $2',
-	'cite_error_key_str_invalid' => 'Içerki säwlik;
-nädogry $str we/ýa-da $key.
-Bu asla bolmaly däl.',
-	'cite_error_stack_invalid_input' => 'Içerki säwlik;
-nädogry stek açary.
-Bu asla bolmaly däl.',
 	'cite_error' => 'Sitirleme säwligi: $1',
 	'cite_error_ref_numeric_key' => 'Nädogry <code>&lt;ref&gt;</code> tegi;
 at ýönekeý bir bitin san bolup bilmeýär. Düşündirişli at ulanyň',
@@ -3866,7 +3534,7 @@ hiç hili parametre rugsat berilmeýär.
 <code>$1</code> atly refler üçin tekst görkezilmändir',
 	'cite_error_included_ref' => '<code>&lt;ref&gt;</code> tegi üçin <code>&lt;/ref&gt;</code> ýapylyşy kem',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> tegleri bar, emma <code>&lt;references/&gt;</code> tegi tapylmady',
-	'cite_error_group_refs_without_references' => '"$1" atly topar üçin <code>&lt;ref&gt;</code> tegleri bar, emma degişli code>&lt;references group="$1"/&gt;</code> tegi tapylmady',
+	'cite_error_group_refs_without_references' => '"$1" atly topar üçin <code>&lt;ref&gt;</code> tegleri bar, emma degişli code>&lt;references group="$1"/&gt;</code> tegi tapylmady', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>-daky <code>&lt;ref&gt;</code> teginiň çaknyşýan "$1" topar aýratynlygy bar.',
 	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>-da kesgitlenen <code>&lt;ref&gt;</code> teginiň öňki tekstde ýok "$1" topar aýratynlygy bar.',
 	'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>-da kesgitlenen "$1" atly <code>&lt;ref&gt;</code> tegi öňki tekstde ulanylmaýar.',
@@ -3879,13 +3547,6 @@ hiç hili parametre rugsat berilmeýär.
  */
 $messages['tl'] = array(
 	'cite-desc' => 'Nagdaragdag ng mga tatak na <nowiki><ref[ name=id]></nowiki> at <nowiki><references/></nowiki>, para sa mga pagtukoy',
-	'cite_croak' => 'Nawalan ng buhay ang pagtukoy; $1: $2',
-	'cite_error_key_str_invalid' => 'Panloob na kamalian;
-hindi tanggap na $str at/o $key.
-Hindi ito dapat mangyari.',
-	'cite_error_stack_invalid_input' => 'Panloob na kamalian;
-hindi tanggap na susi ng salansan.
-Hindi ito dapat mangyari.',
 	'cite_error' => 'Kamalian sa pagtukoy: $1',
 	'cite_error_ref_numeric_key' => "Hindi tanggap ang tatak na <code>&lt;ref&gt;</code>;
 hindi maaaring isang payak na buumbilang (''integer'') ang pangalan.  Gumamit ng isang mapaglarawang pamagat",
@@ -3909,7 +3570,7 @@ Magbigay ng marami pang kahulugan sa loob ng mensaheng <nowiki>[[MediaWiki:$2]]<
 walang tekstong ibinigay para sa mga sangguniang (''ref'') pinangalanang <code>$1</code>",
 	'cite_error_included_ref' => 'Naawawala ang pansarang <code>&lt;/ref&gt;</code> na para sa tatak na <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Umiiral na ang mga tatak na <code>&lt;ref&gt;</code>, subalit walang natagpuang tatak na <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Umiiral na ang tatak na <code>&lt;ref&gt;</code> para sa pangkat na pinangalanang "$1", subalit walang natagpuang katumbas na tatak na <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'Umiiral na ang tatak na <code>&lt;ref&gt;</code> para sa pangkat na pinangalanang "$1", subalit walang natagpuang katumbas na tatak na <code>&lt;references group="$1"/&gt;</code>', # Fuzzy
 	'cite_error_references_group_mismatch' => 'May hindi nagbabanggaang katangiang pampangkat na "$1" ang <code>&lt;ref&gt;</code> tatak na nasa <code>&lt;references&gt;</code>.',
 	'cite_error_references_missing_group' => 'Ang tatak na <code>&lt;ref&gt;</code> na binigyang kahulugan sa <code>&lt;references&gt;</code> ay may katangiang pampangkat na "$1" na hindi lumilitawa sa naunang teksto.',
 	'cite_error_references_missing_key' => 'Ang tatak na <code>&lt;ref&gt;</code> na may pangalang "$1" na binigyang kahulugan sa <code>&lt;references&gt;</code> ay hindi ginamit sa naunang teksto.',
@@ -3943,13 +3604,6 @@ $messages['tly'] = array(
  */
 $messages['tr'] = array(
 	'cite-desc' => 'Alıntılar için, <nowiki><ref[ name=id]></nowiki> ve <nowiki><references/></nowiki> etiketlerini ekler',
-	'cite_croak' => 'Alıntı kaybedildi; $1: $2',
-	'cite_error_key_str_invalid' => 'Dahili hata;
-geçersiz $str ve/ya da $key.
-Bu asla olmamalı.',
-	'cite_error_stack_invalid_input' => 'Dahili hata;
-geçersiz stack anahtarı.
-Bu asla olmamalı.',
 	'cite_error' => 'Kaynak hatası $1',
 	'cite_error_ref_numeric_key' => 'Geçersiz <code>&lt;ref&gt;</code> etiketi;
 isim basit bir tamsayı olamaz. Tanımlayıcı bir başlık kullanın',
@@ -3973,7 +3627,7 @@ sadece "group" parametresine izin verilir.
 <code>$1</code> isimli refler için metin temin edilmemiş',
 	'cite_error_included_ref' => '<code>&lt;ref&gt;</code> etiketi için <code>&lt;/ref&gt;</code> kapanışı eksik',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code> etiketleri var, ama <code>&lt;references/&gt;</code> etiketi bulunamadı',
-	'cite_error_group_refs_without_references' => '"$1" isimli grup için <code>&lt;ref&gt;</code> etiketleri mevcut, ancak karşılık gelen <code>&lt;references group="$1"/&gt;</code> etiketi bulunamadı',
+	'cite_error_group_refs_without_references' => '"$1" isimli grup için <code>&lt;ref&gt;</code> etiketleri mevcut, ancak karşılık gelen <code>&lt;references group="$1"/&gt;</code> etiketi bulunamadı', # Fuzzy
 	'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>\'daki <code>&lt;ref&gt;</code> etiketinin çelişen "$1" grup özniteliği var.',
 	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>\'da tanımlanan <code>&lt;ref&gt;</code> etiketinin önceki metinde olmayan "$1" grup özniteliği var.',
 	'cite_error_references_missing_key' => '<code>&lt;references&gt;</code>\'da tanımlanan "$1" adındaki <code>&lt;ref&gt;</code> etiketi önceki metinde kullanılmıyor.',
@@ -4015,18 +3669,16 @@ $messages['ug-arab'] = array(
 /** Ukrainian (українська)
  * @author AS
  * @author Ahonc
+ * @author Andriykopanytsia
  * @author Dim Grits
  * @author DixonD
  * @author NickK
  * @author Prima klasy4na
  * @author Ytsukeng Fyvaprol
+ * @author Ата
  */
 $messages['uk'] = array(
 	'cite-desc' => 'Додає теги <nowiki><ref[ name=id]></nowiki> і <nowiki><references/></nowiki> для виносок',
-	'cite_croak' => 'Цитата померла; $1: $2',
-	'cite_error_key_str_invalid' => 'Внутрішня помилка:
-неправильний $str і/або $key.',
-	'cite_error_stack_invalid_input' => 'Внутрішня помилка: неправильний ключ стека.',
 	'cite_error' => 'Помилка цитування: $1',
 	'cite_error_ref_numeric_key' => 'Неправильний виклик <code>&lt;ref&gt;</code>:
 назва не може містити тільки цифри.',
@@ -4049,7 +3701,7 @@ $messages['uk'] = array(
 для виносок <code>$1</code> не вказаний текст',
 	'cite_error_included_ref' => 'Відсутній тег <code>&lt;/ref&gt;</code> за наявності тега <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => "<span style='color: red'>Для наявного тегу <code>&lt;ref&gt;</code> не знайдено відповідного тегу <code>&lt;references/&gt;</code></span>",
-	'cite_error_group_refs_without_references' => 'Для існуючих тегів <code>&lt;ref&gt;</code> групи під назвою "$1" не знайдено відповідного тегу <code>&lt;references group="$1"/&gt;</code>',
+	'cite_error_group_refs_without_references' => 'Теги <code>&lt;ref&gt;</code> існують для групи під назвою «$1», але не знайдено відповідного тегу <code>&lt;references group="$1"/&gt;</code>, або ж бракує закриваючого <code>&lt;/ref&gt;</code>',
 	'cite_error_references_group_mismatch' => 'Тег <code>&lt;ref&gt;</code> в <code>&lt;references&gt;</code> має конфліктуючий атрибут групи "$1".',
 	'cite_error_references_missing_group' => 'Тег <code>&lt;ref&gt;</code>, заданий в <code>&lt;references&gt;</code>, має атрибут групи "$1", який не фігурує в попередньому тексті.',
 	'cite_error_references_missing_key' => 'Тег <code>&lt;ref&gt;</code> з назвою "$1", визначений у <code>&lt;references&gt;</code>, не використовується в попередньому тексті.',
@@ -4064,6 +3716,8 @@ $messages['uk'] = array(
 	'cite_references_link_many_format_backlink_labels' => 'а б в г д е ж и к л м н п р с т у ф х ц ш щ ю я аа аб ав аг ад ае аж аи ак ал ам ан ап ар ас ат ау аф ах ац аш ащ аю ая ба бб бв бг бд бе бж би бк бл бм бн бп бр бс бт бу бф бх бц бш бщ бю бя ва вб вв вг вд ве вж ви вк вл вм вн вп вр вс вт ву вф вх вц вш вщ вю вя га гб гв гг гд ге гж ги гк гл гм гн гп гр гс гт гу гф гх гц гш гщ гю гя да дб дв дг дд де дж ди дк дл дм дн дп др дс дт ду дф дх дц дш дщ дю дя еа еб ев ег ед ее еж еи ек ел ем ен еп ер ес ет еу еф ех ец еш ещ ею ея жа жб жв жг жд же жж жи жк жл жм жн жп жр жс жт жу жф жх жц жш жщ жю жя иа иб ив иг ид ие иж ии ик ил им ин ип ир ис ит иу иф их иц иш ищ ию ия ка кб кв кг кд ке кж ки кк кл км кн кп кр кс кт ку кф кх кц кш кщ кю кя ла лб лв лг лд ле лж ли лк лл лм лн лп лр лс лт лу лф лх лц лш лщ лю ля ма мб мв мг мд ме мж ми мк мл мм мн мп мр мс мт му мф мх мц мш мщ мю мя на нб нв нг нд не нж ни нк нл нм нн нп нр нс нт ну нф нх нц нш нщ ню ня па пб пв пг пд пе пж пи пк пл пм пн пп пр пс пт пу пф пх пц пш пщ пю пя ра рб рв рг рд ре рж ри рк рл рм рн рп рр рс рт ру рф рх рц рш рщ рю ря са сб св сг сд се сж си ск сл см сн сп ср сс ст су сф сх сц сш сщ сю ся та тб тв тг тд те тж ти тк тл тм тн тп тр тс тт ту тф тх тц тш тщ тю тя уа уб ув уг уд уе уж уи ук ул ум ун уп ур ус ут уу уф ух уц уш ущ ую уя фа фб фв фг фд фе фж фи фк фл фм фн фп фр фс фт фу фф фх фц фш фщ фю фя ха хб хв хг хд хе хж хи хк хл хм хн хп хр хс хт ху хф хх хц хш хщ хю хя ца цб цв цг цд це цж ци цк цл цм цн цп цр цс цт цу цф цх цц цш цщ цю ця ша шб шв шг шд ше шж ши шк шл шм шн шп шр шс шт шу шф шх шц шш шщ шю шя ща щб щв щг щд ще щж щи щк щл щм щн щп щр щс щт щу щф щх щц щш щщ щю щя юа юб юв юг юд юе юж юи юк юл юм юн юп юр юс ют юу юф юх юц юш ющ юю юя яа яб яв яг яд яе яж яи як ял ям ян яп яр яс ят яу яф ях яц яш ящ яю яя',
 	'cite_references_link_many_sep' => '&#32;',
 	'cite_references_link_many_and' => '&#32;',
+	'cite_references_link_accessibility_label' => 'Вгору',
+	'cite_references_link_many_accessibility_label' => 'Перейти до:',
 );
 
 /** vèneto (vèneto)
@@ -4071,11 +3725,6 @@ $messages['uk'] = array(
  */
 $messages['vec'] = array(
 	'cite-desc' => 'Zonta i tag <nowiki><ref[ name=id]></nowiki> e <nowiki><references/></nowiki> par gestir le citazion',
-	'cite_croak' => 'Eror ne la citazion: $1: $2',
-	'cite_error_key_str_invalid' => 'Eror interno: $str e/o $key sbaglià. Sta roba qua no la dovarìa mai capitar.',
-	'cite_error_stack_invalid_input' => 'Eror interno;
-ciave de stack sbaglià.
-Sta roba no la dovarìa mai capitar.',
 	'cite_error' => 'Eror ne la funsion Cite $1',
 	'cite_error_ref_numeric_key' => "Eror ne l'uso del marcator <code>&lt;ref&gt;</code>: el nome no'l pode mìa èssar un nùmaro intiero. Dòpara un titolo esteso",
 	'cite_error_ref_no_key' => "Eror ne l'uso del marcator <code>&lt;ref&gt;</code>: i ref vodi no i pol no verghe un nome",
@@ -4090,7 +3739,7 @@ Dòpara <code>&lt;references /&gt;</code>, o <code>&lt;references group="..." /&
 	'cite_error_references_no_text' => 'Marcator <code>&lt;ref&gt;</code> mìa valido; no xe stà indicà nissun testo par el marcator <code>$1</code>',
 	'cite_error_included_ref' => '<code>&lt;/ref&gt;</code> de chiusura mancante par el marcador <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Ghe xe un tag <code>&lt;ref&gt;</code>, ma no xe stà catà nissun tag <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Ghe xe un tag <code>&lt;ref&gt;</code> par un grupo che se ciama "$1", ma no xe stà catà nissun tag <code>&lt;references group="$1"/&gt;</code> che corisponda.',
+	'cite_error_group_refs_without_references' => 'Ghe xe un tag <code>&lt;ref&gt;</code> par un grupo che se ciama "$1", ma no xe stà catà nissun tag <code>&lt;references group="$1"/&gt;</code> che corisponda.', # Fuzzy
 	'cite_error_references_group_mismatch' => 'El tag <code>&lt;ref&gt;</code> in <code>&lt;references&gt;</code> el gà l\'atributo de grupo "$1" in conflito.',
 	'cite_error_references_missing_group' => 'El tag <code>&lt;ref&gt;</code> definìo in <code>&lt;references&gt;</code> el gà un atributo de grupo "$1" che no conpare mia nel testo precedente.',
 	'cite_error_references_missing_key' => 'El tag <code>&lt;ref&gt;</code> con nome "$1" definìo in <code>&lt;references&gt;</code> no\'l xe doparà nel testo precedente.',
@@ -4111,9 +3760,6 @@ $messages['vep'] = array(
  */
 $messages['vi'] = array(
 	'cite-desc' => 'Thêm các thẻ <nowiki><ref[ name=id]></nowiki> và <nowiki><references/></nowiki> để ghi chú thích hoặc nguồn tham khảo',
-	'cite_croak' => 'Chú thích bị hỏng; $1: $2',
-	'cite_error_key_str_invalid' => 'Lỗi nội bộ; $str và/hoặc $key không hợp lệ. Điều này không bao giờ nên xảy ra.',
-	'cite_error_stack_invalid_input' => 'Lỗi nội bộ; khóa xác định chồng bị sai.  Đáng ra không bao giờ xảy ra điều này.',
 	'cite_error' => 'Lỗi chú thích: $1',
 	'cite_error_ref_numeric_key' => 'Thẻ <code>&lt;ref&gt;</code> sai; tên không thể chỉ là số nguyên, hãy dùng tựa đề có tính miêu tả',
 	'cite_error_ref_no_key' => 'Thẻ <code>&lt;ref&gt;</code> sai; thẻ ref không có nội dung thì phải có tên',
@@ -4129,22 +3775,21 @@ Hãy định nghĩa thêm ở thông điệp <nowiki>[[MediaWiki:Cite references
 	'cite_error_references_no_text' => 'Thẻ <code>&lt;ref&gt;</code> sai; không có nội dung trong thẻ ref có tên <code>$1</code>',
 	'cite_error_included_ref' => 'Không có <code>&lt;/ref&gt;</code> để đóng thẻ <code>&lt;ref&gt;</code>',
 	'cite_error_refs_without_references' => 'Tồn tại thẻ <code>&lt;ref&gt;</code>, nhưng không tìm thấy thẻ <code>&lt;references/&gt;</code>',
-	'cite_error_group_refs_without_references' => 'Tồn tại thẻ <code>&lt;ref&gt;</code> với tên nhóm “$1”, nhưng không tìm thấy thẻ <code>&lt;references group="$1"/&gt;</code> tương ứng',
+	'cite_error_group_refs_without_references' => 'Đã tìm thấy thẻ <code>&lt;ref&gt;</code> với tên nhóm “$1”, nhưng không tìm thấy thẻ tương ứng <code>&lt;references group="$1"/&gt;</code> tương ứng, hoặc thẻ đóng <code>&lt;/ref&gt;</code> bị thiếu',
 	'cite_error_references_group_mismatch' => 'Thẻ <code>&lt;ref&gt;</code> trong <code>&lt;references&gt;</code> có thuộc tính nhóm mâu thuẫn “$1”.',
 	'cite_error_references_missing_group' => 'Thẻ <code>&lt;ref&gt;</code> được định nghĩa trong <code>&lt;references&gt;</code> có thuộc tính nhóm  “$1” không thấy xuất hiện trong văn bản phía trên.',
 	'cite_error_references_missing_key' => 'Thẻ <code>&lt;ref&gt;</code> có tên  “$1” được định nghĩa trong <code>&lt;references&gt;</code> không được đoạn văn bản trên sử dụng.',
 	'cite_error_references_no_key' => ' Thẻ <code>&lt;ref&gt;</code> được định nghĩa trong <code>&lt;references&gt;</code> không có thuộc tính name.',
 	'cite_error_empty_references_define' => 'Thẻ <code>&lt;ref&gt;</code> được định nghĩa trong <code>&lt;references&gt;</code> có tên “$1” không có nội dung.',
 	'cite_references_link_many_format_backlink_labels' => 'a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf pg ph pi pj pk pl pm pn po pp pq pr ps pt pu pv pw px py pz qa qb qc qd qe qf qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz za zb zc zd ze zf zg zh zi zj zk zl zm zn zo zp zq zr zs zt zu zv zw zx zy zz',
+	'cite_references_link_accessibility_label' => 'Nhảy lên',
+	'cite_references_link_many_accessibility_label' => 'Nhảy lên tới:',
 );
 
 /** Volapük (Volapük)
  * @author Smeira
  */
 $messages['vo'] = array(
-	'cite_croak' => 'Saitot dädik; $1: $2',
-	'cite_error_key_str_invalid' => 'Pöl ninik: $str e/u $key no lonöföl(s). Atos no sötonöv jenön.',
-	'cite_error_stack_invalid_input' => 'Pöl ninik; kumakik no lonöföl. Atos neai sötonöv jenön.',
 	'cite_error' => 'Saitamapöl: $1',
 	'cite_error_ref_numeric_key' => 'Nem ela <code>&lt;ref&gt;</code> no lonöföl. Nem no kanon binädön te me numats; gebolös bepenami.',
 	'cite_error_ref_no_key' => 'Geb no lonöföl ela <code>&lt;ref&gt;</code>: els ref nen ninäd mutons labön nemi',
@@ -4159,13 +3804,6 @@ $messages['vo'] = array(
  */
 $messages['yi'] = array(
 	'cite-desc' => 'לייגט צו <nowiki><ref[ name=id]></nowiki> און <nowiki><references/></nowiki> טאַגן, פֿאר ציטירונגען (אין הערות)',
-	'cite_croak' => 'טעות אין ציטירונג; $1: $2',
-	'cite_error_key_str_invalid' => 'אינערלעכער גרייז;
-אומגילטיקער $str און/אדער $key.
-דאס זאל נישט פאסירן.',
-	'cite_error_stack_invalid_input' => 'אינערלעכער גרייז;
-אומגילטיקער סטאַק.
-דאס דארף קיינמאל נישט פאסירן.',
 	'cite_error' => 'ציטירן גרײַז: $1',
 	'cite_error_ref_numeric_key' => 'גרײַזיגער <code>&lt;ref&gt;</code> טאַג;
 נאמען טאר נישט זײַן קיין פשוטער נומער. ניצט א באשרײַבדיק קעפל',
@@ -4177,11 +3815,14 @@ $messages['yi'] = array(
 א רעפֿערענץ אָן א נאמען דארף האבן תוכן',
 	'cite_error_references_invalid_parameters' => 'אומגילטיגער <code>&lt;references&gt;</code> טאַג;
 קיין פאראמעטערס נישט ערלויבט. ניצט <code>&lt;references /&gt;</code>',
+	'cite_error_references_invalid_parameters_group' => 'אומגילטיקער <code>&lt;references&gt;</code> טאג;
+נאר דער פאראמעטער "group" איז ערלויבט.
+ניצט <code>&lt;references /&gt;</code>, אדער <code>&lt;references group="..." /&gt;</code>',
 	'cite_error_references_no_text' => 'אומגילטיגער <code>&lt;ref&gt;</code> טאַג;
 קיין טעקסט נישט געשריבן פֿאַר רעפֿערענצן מיטן נאָמען <code>$1</code>',
 	'cite_error_included_ref' => 'פֿעלט א שליסנדיגער <code>&lt;/ref&gt;</code> פֿאַר <code>&lt;ref&gt;</code> טאַג',
-	'cite_error_refs_without_references' => "ס'זענען דא <code>&lt;ref&gt;</code> טאַגן, אבער מ'האט נישט געטראפֿן קיין <code>&lt;references/&gt;</code> טאַג.",
-	'cite_error_group_refs_without_references' => 'ס\'זענען דא <code>&lt;ref&gt;</code> טאַגן פֿאַר א גרופע וואס הייסט "$1", אבער מ\'האט נישט געטראפֿן קיין אַנטקעגענעם  <code>&lt;references group="$1"/&gt;</code> טאַג.',
+	'cite_error_refs_without_references' => "ס'זענען דא <code>&lt;ref&gt;</code> טאַגן, אבער מ'האט נישט געטראפֿן קיין <code>&#123;&#123;רעפליסטע&#125;&#125;</code> מוסטער און נישט קיין <code>&lt;references/&gt;</code> טאַג.",
+	'cite_error_group_refs_without_references' => 'ס\'זענען דא <code>&lt;ref&gt;</code> טאַגן פֿאַר א גרופע וואס הייסט "$1", אבער מ\'האט נישט געטראפֿן קיין אַנטקעגענעם  <code>&lt;references group="$1"/&gt;</code> טאַג, אדער א שליסנדיקער <code>&lt;/ref&gt;</code> פֿעלט.',
 	'cite_error_references_group_mismatch' => 'דער <code>&lt;ref&gt;</code> טאג אין <code>&lt;references&gt;</code> האט א גרופע אייגנקייט וואס איז סותר "$1".',
 	'cite_error_references_missing_group' => 'דער <code>&lt;ref&gt;</code> טאג דעפינעירט אין <code>&lt;references&gt;</code> האט גרופע אייגנקייט "$1" וואס באווייזט זיך נישט אין פריערדיקן טעקסט.',
 	'cite_error_references_missing_key' => '<code>&lt;ref&gt;</code> טאַג מיטן נאָמען "$1" דעפֿינירט אין<code>&lt;references&gt;</code> נישט געניצט אין פֿריערדיקן טעקסט.',
@@ -4193,9 +3834,6 @@ $messages['yi'] = array(
  */
 $messages['yue'] = array(
 	'cite-desc' => '加 <nowiki><ref[ name=id]></nowiki> 同 <nowiki><references/></nowiki> 標籤用響引用度',
-	'cite_croak' => '引用阻塞咗; $1: $2',
-	'cite_error_key_str_invalid' => '內部錯誤; 無效嘅 $str', # Fuzzy
-	'cite_error_stack_invalid_input' => '內部錯誤; 無效嘅堆疊匙',
 	'cite_error' => '引用錯誤 $1',
 	'cite_error_ref_numeric_key' => '無效嘅呼叫; 需要一個非整數嘅匙',
 	'cite_error_ref_no_key' => '無效嘅呼叫; 未指定匙',
@@ -4215,13 +3853,12 @@ $messages['yue'] = array(
  * @author Liangent
  * @author PhiLiP
  * @author Philip
+ * @author TianyinLee
+ * @author Zhuyifei1999
  * @author 乌拉跨氪
  */
 $messages['zh-hans'] = array(
 	'cite-desc' => '增加用于引用的<nowiki><ref[ name=id]></nowiki>和<nowiki><references/></nowiki>标签',
-	'cite_croak' => '引用失效；$1：$2',
-	'cite_error_key_str_invalid' => '内部错误；不应出现的非法$str和／或$key。',
-	'cite_error_stack_invalid_input' => '内部错误；不应出现的非法堆栈键值。',
 	'cite_error' => '引用错误：$1',
 	'cite_error_ref_numeric_key' => '无效<code>&lt;ref&gt;</code>标签；name属性不能是单一的数字，请使用可辨识的标题',
 	'cite_error_ref_no_key' => '无效<code>&lt;ref&gt;</code>标签；未填内容的引用必须填写name属性',
@@ -4234,25 +3871,25 @@ $messages['zh-hans'] = array(
 	'cite_error_references_no_text' => '无效<code>&lt;ref&gt;</code>标签；未给name属性为<code>$1</code>的引用提供文字',
 	'cite_error_included_ref' => '没有找到与<code>&lt;/ref&gt;</code>对应的<code>&lt;ref&gt;</code>标签',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>标签存在，但没有找到<code>&lt;references/&gt;</code>标签',
-	'cite_error_group_refs_without_references' => '组名为“$1”的<code>&lt;ref&gt;</code>标签存在，但没有找到相应的<code>&lt;references group="$1"/&gt;</code>标签',
+	'cite_error_group_refs_without_references' => '组名为“$1”的<code>&lt;ref&gt;</code>标签存在，但没有找到相应的<code>&lt;references group="$1"/&gt;</code>标签，或结尾的<code>&lt;/ref&gt;</code>标签丢失',
 	'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>的<code>&lt;ref&gt;</code>标记带有冲突的组（group）属性“$1”。',
 	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>中定义的<code>&lt;ref&gt;</code>标记带有未在前文中出现的组（group）属性“$1”。',
 	'cite_error_references_missing_key' => '在<code>&lt;references&gt;</code>中以“$1”名字定义的<code>&lt;ref&gt;</code>标签没有在先前的文字中使用。',
 	'cite_error_references_no_key' => '<code>&lt;references&gt;</code>中定义的<code>&lt;ref&gt;</code>没有给出名称（name）属性。',
 	'cite_error_empty_references_define' => '<code>&lt;references&gt;</code>中定义的<code>&lt;ref&gt;</code>的名称（name）“$1”为空。',
+	'cite_references_link_accessibility_label' => '跳转',
+	'cite_references_link_many_accessibility_label' => '跳转到：',
 );
 
 /** Traditional Chinese (中文（繁體）‎)
  * @author Liangent
+ * @author Liuxinyu970226
  * @author Mark85296341
  * @author Philip
  * @author 乌拉跨氪
  */
 $messages['zh-hant'] = array(
 	'cite-desc' => '增加用於引用的<nowiki><ref[ name=id]></nowiki>和<nowiki><references/></nowiki>標籤',
-	'cite_croak' => '引用失效；$1：$2',
-	'cite_error_key_str_invalid' => '內部錯誤；不應出現的非法$str和／或$key。',
-	'cite_error_stack_invalid_input' => '內部錯誤；不應出現的非法堆疊鍵值。',
 	'cite_error' => '引用錯誤：$1',
 	'cite_error_ref_numeric_key' => '無效<code>&lt;ref&gt;</code>標籤；name屬性不能是單一的數字，請使用可辨識的標題',
 	'cite_error_ref_no_key' => '無效<code>&lt;ref&gt;</code>標籤；未填內容的引用必須填寫name屬性',
@@ -4265,10 +3902,12 @@ $messages['zh-hant'] = array(
 	'cite_error_references_no_text' => '無效<code>&lt;ref&gt;</code>標籤；未給name屬性為<code>$1</code>的引用提供文字',
 	'cite_error_included_ref' => '沒有找到與<code>&lt;/ref&gt;</code>對應的<code>&lt;ref&gt;</code>標籤',
 	'cite_error_refs_without_references' => '<code>&lt;ref&gt;</code>標籤存在，但沒有找到<code>&lt;references/&gt;</code>標籤',
-	'cite_error_group_refs_without_references' => '組名為「$1」的<code>&lt;ref&gt;</code>標籤存在，但沒有找到相應的<code>&lt;references group="$1"/&gt;</code>標籤',
+	'cite_error_group_refs_without_references' => '<code>&lt;ref&gt;</code>標籤命名之一「$1」已存在，但未能找到對應標籤<code>&lt;references group="$1"/&gt;</code>，或者關閉<code>&lt;/ref&gt;</code>後丟失',
 	'cite_error_references_group_mismatch' => '<code>&lt;references&gt;</code>的<code>&lt;ref&gt;</code>標記帶有衝突的群組（group）屬性「$1」。',
 	'cite_error_references_missing_group' => '<code>&lt;references&gt;</code>中定義的<code>&lt;ref&gt;</code>標記帶有未在前文中出現的群組（group）屬性「$1」。',
 	'cite_error_references_missing_key' => '在<code>&lt;references&gt;</code>中以“$1”名字定義的<code>&lt;ref&gt;</code>標籤沒有在先前的文字中使用。',
 	'cite_error_references_no_key' => '<code>&lt;references&gt;</code>中定義的<code>&lt;ref&gt;</code>沒有給出名稱（name）屬性。',
 	'cite_error_empty_references_define' => '<code>&lt;references&gt;</code>中定義的<code>&lt;ref&gt;</code>的名稱（name）「$1」為空。',
+	'cite_references_link_accessibility_label' => '跳轉',
+	'cite_references_link_many_accessibility_label' => '跳轉至：',
 );
diff --git a/extensions/Cite/Cite.php b/extensions/Cite/Cite.php
index 0f957659..045bb8cc 100644
--- a/extensions/Cite/Cite.php
+++ b/extensions/Cite/Cite.php
@@ -18,20 +18,17 @@ if ( ! defined( 'MEDIAWIKI' ) )
  */
 
 $wgHooks['ParserFirstCallInit'][] = 'wfCite';
-$wgHooks['BeforePageDisplay'][] = 'wfCiteBeforePageDisplay';
-
 
 $wgExtensionCredits['parserhook'][] = array(
 	'path' => __FILE__,
 	'name' => 'Cite',
-	'author' => 'Ævar Arnfjörð Bjarmason',
+	'author' => array( 'Ævar Arnfjörð Bjarmason', 'Marius Hoch' ),
 	'descriptionmsg' => 'cite-desc',
 	'url' => 'https://www.mediawiki.org/wiki/Extension:Cite/Cite.php'
 );
-$wgParserTestFiles[] = dirname( __FILE__ ) . "/citeParserTests.txt";
-$wgParserTestFiles[] = dirname( __FILE__ ) . "/citeCatTreeParserTests.txt";
-$wgExtensionMessagesFiles['Cite'] = dirname( __FILE__ ) . "/Cite.i18n.php";
-$wgAutoloadClasses['Cite'] = dirname( __FILE__ ) . "/Cite_body.php";
+$wgParserTestFiles[] = __DIR__ . "/citeParserTests.txt";
+$wgExtensionMessagesFiles['Cite'] = __DIR__ . "/Cite.i18n.php";
+$wgAutoloadClasses['Cite'] = __DIR__ . "/Cite_body.php";
 $wgSpecialPageGroups['Cite'] = 'pagetools';
 
 define( 'CITE_DEFAULT_GROUP', '' );
@@ -66,13 +63,21 @@ function wfCite( $parser ) {
 
 // Resources
 $citeResourceTemplate = array(
-	'localBasePath' => dirname(__FILE__) . '/modules',
+	'localBasePath' => __DIR__ . '/modules',
 	'remoteExtPath' => 'Cite/modules'
 );
 
 $wgResourceModules['ext.cite'] = $citeResourceTemplate + array(
-	'styles' => array(),
-	'scripts' => 'ext.cite/ext.cite.js',
+	'scripts' => 'ext.cite.js',
+	'styles' => 'ext.cite.css',
+	'messages' => array(
+		'cite_references_link_accessibility_label',
+		'cite_references_link_many_accessibility_label',
+	),
+);
+
+$wgResourceModules['ext.cite.popups'] = $citeResourceTemplate + array(
+	'scripts' => 'ext.cite.popups.js',
 	'position' => 'bottom',
 	'dependencies' => array(
 		'jquery.tooltip',
@@ -87,25 +92,8 @@ $wgResourceModules['jquery.tooltip'] = $citeResourceTemplate + array(
 
 /* Add RTL fix for the cite <sup> elements */
 $wgResourceModules['ext.rtlcite'] = $citeResourceTemplate + array(
-	'styles' => 'ext.rtlcite/ext.rtlcite.css',
+	'styles' => 'ext.rtlcite.css',
 	'position' => 'top',
 );
 
-/**
- * @param $out OutputPage
- * @param $sk Skin
- * @return bool
- */
-function wfCiteBeforePageDisplay( $out, &$sk ) {
-	global $wgCiteEnablePopups;
-
-	if ( $wgCiteEnablePopups ) {
-		$out->addModules( 'ext.cite' );
-	}
-
-	/* RTL support quick-fix module */
-	$out->addModuleStyles( 'ext.rtlcite' );
-	return true;
-}
-
 /**#@-*/
diff --git a/extensions/Cite/Cite_body.php b/extensions/Cite/Cite_body.php
index 488bacbb..08c60722 100644
--- a/extensions/Cite/Cite_body.php
+++ b/extensions/Cite/Cite_body.php
@@ -155,6 +155,7 @@ class Cite {
 	 * @return string
 	 */
 	function ref( $str, $argv, $parser ) {
+		global $wgCiteEnablePopups;
 		if ( $this->mInCite ) {
 			return htmlspecialchars( "<ref>$str</ref>" );
 		} else {
@@ -162,6 +163,12 @@ class Cite {
 			$this->mInCite = true;
 			$ret = $this->guardedRef( $str, $argv, $parser );
 			$this->mInCite = false;
+			$parserOutput = $parser->getOutput();
+			$parserOutput->addModules( 'ext.cite' );
+			if ( $wgCiteEnablePopups ) {
+				$parserOutput->addModules( 'ext.cite.popups' );
+			}
+			$parserOutput->addModuleStyles( 'ext.rtlcite' );
 			return $ret;
 		}
 	}
@@ -289,7 +296,7 @@ class Cite {
 
 		# Not clear how we could get here, but something is probably
 		# wrong with the types.  Let's fail fast.
-		$this->croak( 'cite_error_key_str_invalid', serialize( "$str; $key" ) );
+		throw new MWException( 'Invalid $str and/or $key: ' . serialize( array( $str, $key ) ) );
 	}
 
 	/**
@@ -443,7 +450,7 @@ class Cite {
 					);
 			}
 		} else {
-			$this->croak( 'cite_error_stack_invalid_input', serialize( array( $key, $str ) ) );
+			throw new MWException( 'Invalid stack key: ' . serialize( $key ) );
 		}
 	}
 
@@ -1172,8 +1179,8 @@ class Cite {
 		# We rely on the fact that PHP is okay with passing unused argu-
 		# ments to functions.  If $1 is not used in the message, wfMessage will
 		# just ignore the extra parameter.
-		$ret = '<strong class="error">' .
-			wfMessage( 'cite_error', wfMessage( $key, $param )->plain() )->plain() .
+		$ret = '<strong class="error mw-ext-cite-error">' .
+			wfMessage( 'cite_error', wfMessage( $key, $param )->inContentLanguage()->plain() )->inContentLanguage()->plain() .
 			'</strong>';
 		if ( $parse == 'parse' ) {
 			$ret = $this->parse( $ret );
@@ -1181,17 +1188,5 @@ class Cite {
 		return $ret;
 	}
 
-	/**
-	 * Die with a backtrace if something happens in the code which
-	 * shouldn't have
-	 *
-	 * @param int $error  ID for the error
-	 * @param string $data Serialized error data
-	 */
-	function croak( $error, $data ) {
-		wfDebugDieBacktrace( wfMessage( 'cite_croak', $this->error( $error ), $data )
-			->inContentLanguage()->text() );
-	}
-
 	/**#@-*/
 }
diff --git a/extensions/Cite/SpecialCite.alias.php b/extensions/Cite/SpecialCite.alias.php
index 6b64b1d0..cbcdafbb 100644
--- a/extensions/Cite/SpecialCite.alias.php
+++ b/extensions/Cite/SpecialCite.alias.php
@@ -5,6 +5,7 @@
  * @file
  * @ingroup Extensions
  */
+// @codingStandardsIgnoreFile
 
 $specialPageAliases = array();
 
@@ -63,7 +64,17 @@ $specialPageAliases['ca'] = array(
 	'Cite' => array( 'Citau', 'Citeu' ),
 );
 
-/** Czech (česky) */
+/** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄) */
+$specialPageAliases['cdo'] = array(
+	'Cite' => array( '註' ),
+);
+
+/** Chechen (нохчийн) */
+$specialPageAliases['ce'] = array(
+	'Cite' => array( 'Дош' ),
+);
+
+/** Czech (čeština) */
 $specialPageAliases['cs'] = array(
 	'Cite' => array( 'Citovat' ),
 );
diff --git a/extensions/Cite/SpecialCite.i18n.php b/extensions/Cite/SpecialCite.i18n.php
index 7f847613..013fbe63 100644
--- a/extensions/Cite/SpecialCite.i18n.php
+++ b/extensions/Cite/SpecialCite.i18n.php
@@ -82,6 +82,7 @@ When using the [[LaTeX]] package url (<code>\usepackage{url}</code> somewhere in
  * @author Jon Harald Søby
  * @author Lloffiwr
  * @author Shirayuki
+ * @author Siddhartha Ghai
  * @author Siebrand
  * @author Tgr
  * @author Umherirrender
@@ -110,6 +111,13 @@ See also:
 	'cite-summary' => '{{notranslate}}',
 	'cite_page' => '{{Identical|Page}}',
 	'cite_submit' => '{{Identical|Cite}}',
+	'cite_text' => 'Refers to {{msg-mw|Sitesubtitle}}.
+
+* This message is the entire text for the page Special:Cite
+* Any wikilinks in this message point to pages on the wiki, so they may be translated.
+* Do not translate magic words like CURRENTYEAR, SITENAME etc.
+* Do not translate the parameter names (author, title etc.) for BibTeX entries.
+* Do not translate the div class plainlinks mw-specialcite-styles.',
 );
 
 /** Achinese (Acèh)
@@ -382,7 +390,7 @@ $messages['arz'] = array(
 </div> <!--closing div for \"plainlinks\"-->", # Fuzzy
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Bishnu Saikia
  * @author Gitartha.bordoloi
  */
@@ -653,12 +661,61 @@ $messages['bcc'] = array(
 
 /** Bikol Central (Bikol Central)
  * @author Filipinayzd
+ * @author Geopoet
  */
 $messages['bcl'] = array(
-	'cite_article_link' => 'Sambiton an artikulong ini', # Fuzzy
+	'cite_article_desc' => 'Nagdudugang nin sarong [[Special:Cite|citation]] espesyal na pahina asin kasugpunan sa palindông kahon',
+	'cite_article_link' => 'Isambit ining pahina',
+	'tooltip-cite-article' => 'Impormasyon kun paanuhon na sambiton ining pahina',
 	'cite' => 'Sambiton',
 	'cite_page' => 'Pahina:',
 	'cite_submit' => 'Sambiton',
+	'cite_text' => "__NOTOC__ 
+<div class=\"mw-specialcite-bibliographic\"> 
+
+== Bibliograpikong mga detalye para sa {{FULLPAGENAME}} == 
+* Pangaran kan pahina: {{FULLPAGENAME}} 
+* Awtor: {{SITENAME}} mga paraambag 
+* Publikador: ''{{SITENAME}}, {{int:sitesubtitle}}''. 
+* Petsa kan huring pagliwat: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC 
+* Petsa kan pagbawi: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation> 
+* Permanenteng URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} 
+* ID kan Bersyon kan Pahina: {{REVISIONID}} 
+
+</div> 
+<div class=\"plainlinks mw-specialcite-styles\"> 
+
+== Pagsambit na mga istilo para sa {{FULLPAGENAME}} == 
+
+=== [[Istilong APA]] === 
+
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Pinagbawi <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> gikan sa {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}. 
+
+=== [[An MLA Manwal na Istilo|Istilong MLA]] === \"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;. 
+
+=== [[MHRA Giya sa Istilo|Istilo sa MHRA]] === 
+{{SITENAME}} mga paraambag, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>] 
+
+=== [[An Chicago Manwal na Istilo|Istilo sa Chicago]] === 
+{{SITENAME}} mga paraambag, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>). 
+
+=== [[Konseho kan mga Paraliwat sa Siyensiya|CBE/CSE style]] === 
+{{SITENAME}} mga paraambag. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Yaon gikan sa : {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}. 
+
+=== [[Librong Asul|Istilo sa Librong Asul]] === 
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>). 
+
+=== [[BibTeX]] entrada === 
+
+@misc{ wiki:xxx, awtor = \"{{SITENAME}}\", titulo = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\", taon = \"{{CURRENTYEAR}}\", url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\", tandai = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\" }
+
+Kunsoarin na ginagamit an [[Latex]] pampaketeng url (<code>\\usepackage{url}</code> yason sa parte kan prayambulo) na tantong minatao nin mas marhayon na kadagdagan sa pormat kan mga estada sa web, an minasunod mapupuwedeng pagpipilian: 
+
+@misc{ wiki:xxx, 
+awtor = \"{{SITENAME}}\", titulo = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\", taon = \"{{CURRENTYEAR}}\", url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\", tandaan = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\" 
+} 
+
+</div> <!--closing div for \"plainlinks\"-->",
 );
 
 /** Belarusian (беларуская)
@@ -943,12 +1000,13 @@ Si empreu el paquet url per a [[LaTeX]] (<code>\\usepackage{url}</code> en algun
 );
 
 /** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄)
+ * @author Yejianfei
  */
 $messages['cdo'] = array(
-	'cite_article_link' => 'Īng-ê̤ṳng cī piĕng ùng-ciŏng',
-	'cite' => 'Īng-ê̤ṳng',
-	'cite_page' => 'Hiĕk-miêng:',
-	'cite_submit' => 'Īng-ê̤ṳng',
+	'cite_article_link' => '標記茲蜀頁',
+	'cite' => '標記',
+	'cite_page' => '頁面',
+	'cite_submit' => '標記',
 );
 
 /** Chechen (нохчийн)
@@ -957,7 +1015,10 @@ $messages['cdo'] = array(
  */
 $messages['ce'] = array(
 	'cite_article_link' => 'АгӀонах лаьцна дешнаш дало',
+	'tooltip-cite-article' => 'ХӀара бу хаам агӀонах лаьцна дешнаш муха дало деза гойтуш',
 	'cite' => 'Далийнадош',
+	'cite_page' => 'АгӀо:',
+	'cite_submit' => 'Даладе дош',
 );
 
 /** Cebuano (Cebuano)
@@ -1087,6 +1148,65 @@ $messages['cy'] = array(
 	'cite' => 'Cyfeirio at erthygl',
 	'cite_page' => 'Tudalen:',
 	'cite_submit' => 'Cyfeirio',
+	'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Manylion am {{FULLPAGENAME}} at ddiben llyfryddiaeth ==
+
+* Enw'r dudalen: {{FULLPAGENAME}}
+* Awdur: {{SITENAME}} contributors
+* Cyhoeddwr: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Dyddiad y diwygiad diweddaraf: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Dyddiad adalw: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Yr URL parhaol: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* ID Diwygiad y Dudalen: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Arddulliau cyfeirio ar gyfer {{FULLPAGENAME}} ==
+
+=== [[APA Style|Arddull APA]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Adalwyd <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> o {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|Arddull MLA]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|Arddull MHRA]] ===
+Cyfranwyr i {{SITENAME}}, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [adalwyd <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Arddull Chicago]] ===
+Cyfranwyr i {{SITENAME}}, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|Arddull CBE/CSE]] ===
+Cyfranwyr i {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cyfeiriwyd ato am <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Ar gael o:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Arddull Bluebook]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (adalwyd ddiwethaf am <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== Cofnod [[BibTeX]] ===
+
+  @misc{ wiki:xxx,
+    author = \"{{SITENAME}}\",
+    title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+    year = \"{{CURRENTYEAR}}\",
+    url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+    note = \"[Online; cyrchwyd <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+  }
+
+Wrth ddefnyddio url y pecyn [[LaTeX]] (<code>\\usepackage{url}</code> rhywle yn y rhaglith), sydd fel arfer yn dangos cyfeiriadau gwe ar fformat del iawn, gallwch ddefnyddio'r arddull canlynol:
+
+  @misc{ wiki:xxx,
+    author = \"{{SITENAME}}\",
+    title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+    year = \"{{CURRENTYEAR}}\",
+    url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+    note = \"[Arlein; cyrchwyd <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+  }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
 );
 
 /** Danish (dansk)
@@ -1330,9 +1450,10 @@ $messages['ee'] = array(
  * @author Consta
  * @author Glavkos
  * @author Omnipaedista
+ * @author Protnet
  */
 $messages['el'] = array(
-	'cite_article_desc' => 'Προσθέτει μία ειδική σελίδα [[Special:Cite|παραθέσεων]] καί έναν σύνδεσμο προς την εργαλειοθήκη',
+	'cite_article_desc' => 'Προσθέτει μία ειδική σελίδα [[Special:Cite|παραθέσεων]] και έναν σύνδεσμο προς την εργαλειοθήκη',
 	'cite_article_link' => 'Παραθέστε αυτή τη σελίδα',
 	'tooltip-cite-article' => 'Πληροφορίες για το πως να παραπέμψετε σε αυτήν την σελίδα',
 	'cite' => 'Αναφορά',
@@ -1767,11 +1888,11 @@ $messages['fr'] = array(
 
 == Détails bibliographiques pour {{FULLPAGENAME}} ==
 
-* Nom de la page : {{FULLPAGENAME}} 
+* Nom de la page : {{FULLPAGENAME}}
 * Auteur : contributeurs de {{SITENAME}}
-* Éditeur : ''{{SITENAME}}, {{int:sitesubtitle}}''. 
-* Dernière modification : {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
-* Récupéré : <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Éditeur : ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Dernière modification : {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} TUC
+* Récupéré : <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} TUC</citation>
 * URL permanente : {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
 * Identifiant de cette version : {{REVISIONID}}
 
@@ -1784,20 +1905,19 @@ $messages['fr'] = array(
 {{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> depuis {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
 
 === [[Style MLA]] ===
-\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+«&nbsp;{{FULLPAGENAME}}&nbsp;» ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
 
 === [[Style MHRA]] ===
-{{SITENAME}} contributors, '{{FULLPAGENAME}}',  ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accédé le <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accédé le <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
 
 === [[Style Chicago]] ===
-Contributeurs de {{SITENAME}}, \"{{FULLPAGENAME}},\"  ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+Contributeurs de {{SITENAME}}, «&nbsp;{{FULLPAGENAME}}&nbsp;», ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accédé le <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
 
 === [[Style CBE/CSE]] ===
-{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet].  {{SITENAME}}, {{int:sitesubtitle}};  {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}},   {{CURRENTTIME}} UTC [cité le <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>].  Disponible sur : 
-{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+Contributeurs de {{SITENAME}}. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}&nbsp;; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} TUC [cité le <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Disponible sur&nbsp;: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
 
 === [[Style Bluebook]] ===
-{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (visité le <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accédé le <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
 
 === Entrée [[BibTeX]] ===
 
@@ -1835,6 +1955,77 @@ $messages['frp'] = array(
 	'cite_submit' => 'Citar',
 );
 
+/** Northern Frisian (Nordfriisk)
+ * @author Murma174
+ */
+$messages['frr'] = array(
+	'cite_article_desc' => 'Diar komt en nei [[Special:Cite|spezial-sidj]] tu, am sitiarin ianfacher tu maagin, an uk en ferwisang bi a werktjüügen',
+	'cite_article_link' => 'Detdiar sidj sitiare',
+	'tooltip-cite-article' => 'Hü detdiar sidj sitiaret wurd koon',
+	'cite' => 'Sitiare',
+	'cite_page' => 'Sidj:',
+	'cite_submit' => 'Sitiare',
+	'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliograafisk dooten för {{FULLPAGENAME}} ==
+
+* Sidj: {{FULLPAGENAME}}
+* Skriiwer: {{SITENAME}} contributors
+* Ütjden faan: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Leetst feranrang: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Ufrepen: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Permanent URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Sidjenwerjuun ID: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Sitiarmuudin för {{FULLPAGENAME}} ==
+
+=== [[APA muude]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Ufrepen <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> faan {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[MLA muude]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA muude]] ===
+{{SITENAME}} bewerkern, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[Chicago muude]] ===
+{{SITENAME}} bewerkern, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (ufrepen <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[CBE/CSE muude]] ===
+{{SITENAME}} bewerkern. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [sitiaret <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Tu fun faan:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook muude]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (ufrepen <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] iindrach ===
+
+  @misc{ wiki:xxx,
+    author = \"{{SITENAME}}\",
+    title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+    year = \"{{CURRENTYEAR}}\",
+    url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+    note = \"[Online; ufrepen <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+  }
+
+Wan det [[LaTeX]]-moduul (<code>\\usepackage{url}</code> uun't iinfeerang) mä en smoker wääb-adres brükt woort, as det ferlicht neter so:
+
+  @misc{ wiki:xxx,
+    author = \"{{SITENAME}}\",
+    title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+    year = \"{{CURRENTYEAR}}\",
+    url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+    note = \"[Online; ufrepen <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+  }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
+);
+
 /** Friulian (furlan)
  * @author Klenje
  * @author MF-Warburg
@@ -2141,14 +2332,73 @@ $messages['he'] = array(
 /** Hindi (हिन्दी)
  * @author Ansumang
  * @author Kaustubh
+ * @author Siddhartha Ghai
  */
 $messages['hi'] = array(
-	'cite_article_desc' => 'एक विशेष [[Special:Cite|बाह्यकड़ियां]] देनेवाला पन्ना और टूलबॉक्सका लिंक बनाईयें',
-	'cite_article_link' => 'इस पन्ने को उद्घृत करें',
-	'tooltip-cite-article' => 'तथ्य कैसे इस पृष्ठ में संदर्भ जोड़ें',
-	'cite' => 'उद्घॄत करें',
-	'cite_page' => 'पन्ना:',
-	'cite_submit' => 'उद्घृत करें',
+	'cite_article_desc' => '[[Special:Cite|सन्दर्भ]] देने वाला एक विशेष पृष्ठ और टूलबॉक्स कड़ी जोड़ता है',
+	'cite_article_link' => 'इस पन्ने को उद्धृत करें',
+	'tooltip-cite-article' => 'इस पृष्ठ को उद्धृत करने के लिये जानकारी',
+	'cite' => 'उद्धृत करें',
+	'cite_page' => 'पृष्ठ:',
+	'cite_submit' => 'उद्धृत करें',
+	'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== {{FULLPAGENAME}} के लिए उद्धरण जानकारी ==
+
+* पृष्ठ नाम: {{FULLPAGENAME}}
+* लेखक: {{SITENAME}} योगदानकर्ता
+* प्रकाशक: ''{{SITENAME}}, {{int:sitesubtitle}}''।
+* अंतिम संशोधन तिथि: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} यू॰टी॰सी
+* अभिगमन तिथि: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* स्थायी यू॰आर॰एल: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* पृष्ठ अवतरण आई॰डी: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== {{FULLPAGENAME}} के लिए उद्धरण प्रकार ==
+
+=== APA प्रकार ===
+{{FULLPAGENAME}}। ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}})। ''{{SITENAME}}, {{int:sitesubtitle}}''। {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} से अभिगमन <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> को।
+
+=== MLA प्रकार ===
+\"{{FULLPAGENAME}}।\" ''{{SITENAME}}, {{int:sitesubtitle}}''। {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} यू॰टी॰सी। <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;।
+
+=== MHRA प्रकार ===
+{{SITENAME}} योगदानकर्ता, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} यू॰टी॰सी, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [अभिगमन <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation> को]
+
+=== शिकागो प्रकार ===
+{{SITENAME}} योगदानकर्ता, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (अभिगमन <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> को)।
+
+=== CBE/CSE प्रकार ===
+{{SITENAME}} योगदानकर्ता। {{FULLPAGENAME}} [इन्टरनेट]। {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} यू॰टी॰सी [<citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation> उद्धृत]। {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} से उपलब्ध।
+
+=== ब्लूबुक प्रकार ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (अभिगमन तिथि: <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== बिबटेक्स प्रकार ===
+
+  @misc{ wiki:xxx,
+    author = \"{{SITENAME}}\",
+    title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+    year = \"{{CURRENTYEAR}}\",
+    url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+    note = \"[ऑनलाइन; अभिगमन तिथि: <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+  }
+
+यदि LaTeX पैकेज यू॰आर॰एल का प्रयोग किया जा रहा हो(<code>\\usepackage{url}</code> प्रियेम्बल में कहीं प्रयुक्त हो) तो बेहतर स्वरूपण वाले यू॰आर॰एल के लिए निम्न का प्रयोग किया जा सकता है:
+
+  @misc{ wiki:xxx,
+    author = \"{{SITENAME}}\",
+    title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+    year = \"{{CURRENTYEAR}}\",
+    url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+    note = \"[ऑनलाइन; अभिगमन तिथि: <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+  }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
 );
 
 /** Fiji Hindi (Latin script) (Fiji Hindi)
@@ -2342,6 +2592,7 @@ Az <code>url</code> nevű [[LaTeX]] csomag használata esetén (<code>\\usepacka
 );
 
 /** Armenian (Հայերեն)
+ * @author Chaojoker
  * @author Teak
  */
 $messages['hy'] = array(
@@ -2349,6 +2600,65 @@ $messages['hy'] = array(
 	'cite' => 'Քաղվածում',
 	'cite_page' => 'Էջ.',
 	'cite_submit' => 'Քաղվածել',
+	'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== {{FULLPAGENAME}} էջի մատենագրական մանրամասներ ==
+
+* Էջանուն՝ {{FULLPAGENAME}}
+* Հեղինակ՝ {{SITENAME}} contributors
+* Հրատարակիչ՝ ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Վերջինն վերանայման թիվ՝ {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} ՀԿԺ
+* Վերստացման թիվ՝ <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} ՀԿԺ</citation>
+* Մշտական հասցե՝ {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Էջի վարկածի թիվ՝ {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== {{FULLPAGENAME}} էջի մեջբերման ոճեր ==
+
+=== [[APA style]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}})։ ''{{SITENAME}}, {{int:sitesubtitle}}''։ Վերստացված է՝ <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}} թվին՝</citation> {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}-ից։
+
+=== [[The MLA style manual|MLA style]] ===
+\"{{FULLPAGENAME}}։\" ''{{SITENAME}}, {{int:sitesubtitle}}''։ {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} ՀԿԺ։ <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;։
+
+=== [[MHRA Style Guide|MHRA style]] ===
+{{SITENAME}} կայքի ներդնողներ, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} ՀԿԺ, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [վերստացված է՝ <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Chicago style]] ===
+{{SITENAME}} կայքի ներդնողներ, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (վերստացված է՝ <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>)։
+
+=== [[Council of Science Editors|CBE/CSE style]] ===
+{{SITENAME}} կայքի ներդնողներ։ {{FULLPAGENAME}} [Համացանց]։ {{SITENAME}}, {{int:sitesubtitle}}․ {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} ՀԿԺ [մեջբերած՝ <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]։ Հասանելի է՝
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}։
+
+=== [[Bluebook|Bluebook style]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (վերջին այցելություն՝ <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>)։
+
+=== [[BibTeX]] entry ===
+
+  @misc{ wiki:xxx,
+   author = \"{{SITENAME}}\",
+   title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+   year = \"{{CURRENTYEAR}}\",
+   url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+   note = \"[Առցանց․ վերստացված է՝ <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+  }
+
+[[ԼաՏեԽ]] փաթեթային հասցեն (<code>\\usepackage{url}</code> օգտագործելիս, որը շատ ավելի գեղեցկորեն ոճավորված է ցուցադրում կայքերի հասցեները, կարելի է հետևյալը նախընտրել՝
+
+  @misc{ wiki:xxx,
+   author = \"{{SITENAME}}\",
+   title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+   year = \"{{CURRENTYEAR}}\",
+   url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+   note = \"[Առցանց․ վերստացված է՝ <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+  }
+
+
+</div> <!--closing div for \"plainlinks\"-->", # Fuzzy
 );
 
 /** Interlingua (interlingua)
@@ -2547,7 +2857,65 @@ $messages['is'] = array(
 	'cite' => 'Vitna í síðu',
 	'cite_page' => 'Síða:',
 	'cite_submit' => 'Vitna í',
-	'cite_text' => '*** [[ignored messages]]', # Fuzzy
+	'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliographic details for {{FULLPAGENAME}} ==
+
+* Page name: {{FULLPAGENAME}}
+* Author: {{SITENAME}} contributors
+* Publisher: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Date of last revision: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Date retrieved: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Permanent URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Page Version ID: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Citation styles for {{FULLPAGENAME}} ==
+
+=== [[APA style]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|MLA style]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA style]] ===
+{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Chicago style]] ===
+{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE style]] ===
+{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook style]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]] entry ===
+
+  @misc{ wiki:xxx,
+    author = \"{{SITENAME}}\",
+    title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+    year = \"{{CURRENTYEAR}}\",
+    url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+    note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+  }
+
+When using the [[LaTeX]] package url (<code>\\usepackage{url}</code> somewhere in the preamble) which tends to give much more nicely formatted web addresses, the following may be preferred:
+
+  @misc{ wiki:xxx,
+    author = \"{{SITENAME}}\",
+    title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+    year = \"{{CURRENTYEAR}}\",
+    url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+    note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+  }
+
+
+</div> <!--closing div for \"plainlinks\"-->", # Fuzzy
 );
 
 /** Italian (italiano)
@@ -3110,7 +3478,7 @@ $messages['kn'] = array(
  * @author 아라
  */
 $messages['ko'] = array(
-	'cite_article_desc' => '[[Special:Cite|인용]] 특수 문서와 도구모음 링크를 추가함',
+	'cite_article_desc' => '[[Special:Cite|인용]] 특수 문서와 도구모음 링크를 추가합니다',
 	'cite_article_link' => '이 문서 인용하기',
 	'tooltip-cite-article' => '이 문서를 인용하는 방법에 대한 정보',
 	'cite' => '인용',
@@ -3121,56 +3489,56 @@ $messages['ko'] = array(
 
 == {{FULLPAGENAME}}의 출처 정보 ==
 
-* 문서 제목: {{FULLPAGENAME}}
-* 저자: {{SITENAME}} contributors
-* 출판사: ''{{SITENAME}}, {{int:sitesubtitle}}''.
-* 최신 버전의 날짜: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
-* 확인한 날짜: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
-* URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
-* 페이지 버전 ID: {{REVISIONID}}
+* 문서 이름: {{FULLPAGENAME}}
+* 저자: {{SITENAME}} 기여자
+* 발행처: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* 최신 판의 날짜: {{CURRENTYEAR}}년 {{CURRENTMONTHNAME}} {{CURRENTDAY}}일 {{CURRENTTIME}} UTC
+* 확인한 날짜: <citation>{{CURRENTYEAR}}년 {{CURRENTMONTHNAME}} {{CURRENTDAY}}일 {{CURRENTTIME}} UTC</citation>
+* 고유 URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* 문서 판 ID: {{REVISIONID}}
 
 </div>
 <div class=\"plainlinks mw-specialcite-styles\">
 
-== {{FULLPAGENAME}}의 인용 스타일 ==
+== {{FULLPAGENAME}}의 인용 양식 ==
 
-=== [[APA 스타일]] ===
-{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Retrieved <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> from {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+=== [[APA 양식]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}년 {{CURRENTMONTHNAME}} {{CURRENTDAY}}일). ''{{SITENAME}}, {{int:sitesubtitle}}''. <citation>{{CURRENTYEAR}}년 {{CURRENTMONTHNAME}} {{CURRENTDAY}}일, {{CURRENTTIME}}</citation>에 확인 {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} 에서 찾아볼 수 있음.
 
-=== [[MLA 스타일]] ===
+=== [[MLA 양식]] ===
 \"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
 
-=== [[MHRA 스타일]] ===
-{{SITENAME}} contributors, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [accessed <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+=== [[MHRA 양식]] ===
+{{SITENAME}} 기여자, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTYEAR}}년 {{CURRENTMONTHNAME}} {{CURRENTDAY}}일, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [<citation>{{CURRENTYEAR}}년 {{CURRENTMONTHNAME}} {{CURRENTDAY}}일</citation>에 접근]
 
-=== [[시카고 스타일|시카고 스타일]] ===
-{{SITENAME}} contributors, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (accessed <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+=== [[시카고 양식]] ===
+{{SITENAME}} 기여자, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (<citation>{{CURRENTYEAR}}년 {{CURRENTMONTHNAME}} {{CURRENTDAY}}일</citation>에 접근).
 
-=== [[Council of Science Editors|CBE/CSE 스타일]] ===
-{{SITENAME}} contributors. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [cited <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Available from:
+=== [[Council of Science Editors|CBE/CSE 양식]] ===
+{{SITENAME}} 기여자. {{FULLPAGENAME}} [인터넷]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [<citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>에 인용]. 다음에서 찾아볼 수 있음:
 {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
 
-=== [[블루북|블루북 스타일]] ===
-{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (last visited <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+=== [[블루북|블루북 양식]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (<citation>{{CURRENTYEAR}}년 {{CURRENTMONTHNAME}} {{CURRENTDAY}}일</citation>에 마지막으로 방문함).
 
-=== [[BibTeX]] 양식 ===
+=== [[BibTeX]] 기록 ===
 
   @misc{ wiki:xxx,
-   author = \"{{SITENAME}}\",
-   title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
-   year = \"{{CURRENTYEAR}}\",
-   url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
-   note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+    author = \"{{SITENAME}}\",
+    title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+    year = \"{{CURRENTYEAR}}\",
+    url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+    note = \"[온라인; 접근한 날짜 <citation>{{CURRENTYEAR}}년-{{CURRENTMONTHNAME}}-{{CURRENTDAY}}일</citation>]\"
   }
 
-[[LaTeX]] 패키지 URL (<code>\\usepackage{url}</code> somewhere in the preamble)을 사용하면 더 정돈된 형식의 웹 주소를 얻을 수 있습니다. 다음과 같은 방법을 선호합니다:
+[[LaTeX]] 패키지 URL (프리앰블의 어딘가에 <code>\\usepackage{url}</code>)을 사용하면 더 정돈된 형식의 웹 주소를 얻을 수 있습니다. 다음과 같은 방법을 선호합니다:
 
   @misc{ wiki:xxx,
-   author = \"{{SITENAME}}\",
-   title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
-   year = \"{{CURRENTYEAR}}\",
-   url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
-   note = \"[Online; accessed <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+    author = \"{{SITENAME}}\",
+    title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+    year = \"{{CURRENTYEAR}}\",
+    url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+    note = \"[온라인; 접근한 날짜 <citation>{{CURRENTYEAR}}년-{{CURRENTMONTHNAME}}-{{CURRENTDAY}}일</citation>]\"
   }
 
 
@@ -3182,6 +3550,7 @@ $messages['ko'] = array(
  */
 $messages['krc'] = array(
 	'cite_article_link' => 'Бетни цитата эт',
+	'tooltip-cite-article' => 'Бу бетни къалай цитата этерге керек болгъаныны юсюнден информация',
 	'cite' => 'Цитата этиу',
 );
 
@@ -3276,16 +3645,18 @@ $messages['ku-latn'] = array(
 /** Cornish (kernowek)
  * @author Kernoweger
  * @author Kw-Moon
+ * @author Nrowe
  */
 $messages['kw'] = array(
 	'cite_article_link' => 'Devynna an erthygel-ma',
-	'tooltip-cite-article' => 'Kedhlow war fatel devynna an folen-ma',
+	'tooltip-cite-article' => 'Kedhlow war fatel dhevynnir an folen-ma',
 	'cite' => 'Devynna',
 	'cite_page' => 'Folen:',
 	'cite_submit' => 'Devynna',
 );
 
 /** Latin (Latina)
+ * @author Autokrator
  * @author MissPetticoats
  * @author SPQRobin
  * @author UV
@@ -3293,6 +3664,7 @@ $messages['kw'] = array(
 $messages['la'] = array(
 	'cite_article_desc' => ' Addet [[Special:Cite|citation]] specialem paginam et arcam instrumenti', # Fuzzy
 	'cite_article_link' => 'Hanc paginam citare',
+	'tooltip-cite-article' => 'Institutiones de hanc pagina citanda',
 	'cite' => 'Paginam citare',
 	'cite_page' => 'Pagina:',
 	'cite_submit' => 'Citare',
@@ -3301,9 +3673,10 @@ $messages['la'] = array(
 /** Luxembourgish (Lëtzebuergesch)
  * @author Kaffi
  * @author Robby
+ * @author Soued031
  */
 $messages['lb'] = array(
-	'cite_article_desc' => "Setzt eng [[Special:Cite|Zitatioun op dëser Spezialsäit]] bäi an e Link an d'Geschiirkëscht",
+	'cite_article_desc' => "Setzt eng [[Special:Cite|Zitatioun op dëser Spezialsäit]] bei an e Link an d'Geschiirkëscht",
 	'cite_article_link' => 'Dës Säit zitéieren',
 	'tooltip-cite-article' => 'Informatioune wéi een dës Säit zitéiere kann',
 	'cite' => 'Zitéierhëllef',
@@ -3426,6 +3799,16 @@ $messages['lo'] = array(
 	'cite_page' => 'ໜ້າ:',
 );
 
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+	'cite_article_link' => 'جاگه ای بلگه',
+	'cite' => 'جاگه',
+	'cite_page' => 'بلگه',
+	'cite_submit' => 'جاگه',
+);
+
 /** Lithuanian (lietuvių)
  * @author Garas
  */
@@ -3526,6 +3909,13 @@ $messages['lzh'] = array(
 	'cite' => '引文',
 );
 
+/** Malagasy (Malagasy)
+ * @author Jagwar
+ */
+$messages['mg'] = array(
+	'cite_article_link' => 'Hitanisa ity pejy ity',
+);
+
 /** Eastern Mari (олык марий)
  * @author Сай
  */
@@ -3773,7 +4163,7 @@ $messages['mn'] = array(
  * @author V.narsikar
  */
 $messages['mr'] = array(
-	'cite_article_desc' => 'एक विशेष [[Special:Cite|बाह्यदुवे]] देणारे पान व टूलबॉक्सची लिंक तयार करा',
+	'cite_article_desc' => 'एक  [[Special:Cite|बाह्यदुवे]] देणारे विशेषपान व साधनपेटीचा दुवा जोडते',
 	'cite_article_link' => 'हे पान उधृत करा',
 	'tooltip-cite-article' => 'हे पृष्ठ बघण्यासाठीची माहिती',
 	'cite' => 'उधृत करा',
@@ -3968,7 +4358,7 @@ $messages['nan'] = array(
 	'cite_submit' => 'Ín-iōng',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Nghtwlkr
  */
 $messages['nb'] = array(
@@ -4065,7 +4455,7 @@ $messages['nds'] = array(
 	'cite_submit' => 'Ziteren',
 );
 
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
  * @author Servien
  */
 $messages['nds-nl'] = array(
@@ -4075,6 +4465,65 @@ $messages['nds-nl'] = array(
 	'cite' => 'Siteerhulpe',
 	'cite_page' => 'Zied:',
 	'cite_submit' => 'Siteren',
+	'cite_text' => "__NOTOC__
+<div class=\"mw-specialcite-bibliographic\">
+
+== Bibliografiese gegevens veur {{FULLPAGENAME}} ==
+
+* Ziednaam: {{FULLPAGENAME}}
+* Auteur: {{SITENAME}}-biedragers
+* Uutgever: ''{{SITENAME}}, {{int:sitesubtitle}}''.
+* Tiedstip leste versie: {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC
+* Tiedstip eraodpleegd: <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} {{CURRENTTIME}} UTC</citation>
+* Permanente URL: {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}
+* Ziedversienummer: {{REVISIONID}}
+
+</div>
+<div class=\"plainlinks mw-specialcite-styles\">
+
+== Sitaotstielen veur {{FULLPAGENAME}} ==
+
+=== [[APA-stiel]] ===
+{{FULLPAGENAME}}. ({{CURRENTYEAR}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}). ''{{SITENAME}}, {{int:sitesubtitle}}''. Eraodpleegd op <citation>{{CURRENTTIME}}, {{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation> van {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[The MLA style manual|MLA-stiel]] ===
+\"{{FULLPAGENAME}}.\" ''{{SITENAME}}, {{int:sitesubtitle}}''. {{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC. <citation>{{CURRENTDAY}} {{CURRENTMONTHABBREV}} {{CURRENTYEAR}}, {{CURRENTTIME}}</citation> &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt;.
+
+=== [[MHRA Style Guide|MHRA-stiel]] ===
+{{SITENAME}}-biedragers, '{{FULLPAGENAME}}', ''{{SITENAME}}, {{int:sitesubtitle}},'' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, {{CURRENTTIME}} UTC, &lt;{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}&gt; [eraodpleegd <citation>{{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}</citation>]
+
+=== [[The Chicago Manual of Style|Chicago-stiel]] ===
+{{SITENAME}}-biedragers, \"{{FULLPAGENAME}},\" ''{{SITENAME}}, {{int:sitesubtitle}},'' {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (eraodpleegd <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[Council of Science Editors|CBE/CSE-stiel]] ===
+{{SITENAME}}-biedragers. {{FULLPAGENAME}} [Internet]. {{SITENAME}}, {{int:sitesubtitle}}; {{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}, {{CURRENTTIME}} UTC [sitaot van <citation>{{CURRENTYEAR}} {{CURRENTMONTHABBREV}} {{CURRENTDAY}}</citation>]. Beschikbaor op:
+{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}.
+
+=== [[Bluebook|Bluebook-stiel]] ===
+{{FULLPAGENAME}}, {{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}} (eraodpleegd op <citation>{{CURRENTMONTHNAME}} {{CURRENTDAY}}, {{CURRENTYEAR}}</citation>).
+
+=== [[BibTeX]]-gegevens ===
+
+  @misc{ wiki:xxx,
+    author = \"{{SITENAME}}\",
+    title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+    year = \"{{CURRENTYEAR}}\",
+    url = \"{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}\",
+    note = \"[Online; geraadpleegd <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+  }
+
+t Volgende kan de veurkeur hebben as de [[LaTeX]]-module \"url\" gebruukt wörden (<code>\\usepackage{url}</code> argens in de inleiding), die webadressen mooier opmaakt:
+
+  @misc{ wiki:xxx,
+    author = \"{{SITENAME}}\",
+    title = \"{{FULLPAGENAME}} --- {{SITENAME}}{,} {{int:sitesubtitle}}\",
+    year = \"{{CURRENTYEAR}}\",
+    url = \"'''\\url{'''{{canonicalurl:{{FULLPAGENAME}}|oldid={{REVISIONID}}}}'''}'''\",
+    note = \"[Online; eraodpleegd <citation>{{CURRENTDAY}}-{{CURRENTMONTHNAME}}-{{CURRENTYEAR}}</citation>]\"
+  }
+
+
+</div> <!--closing div for \"plainlinks\"-->",
 );
 
 /** Nepali (नेपाली)
@@ -4165,7 +4614,7 @@ Het volgende kan de voorkeur hebben als de [[LaTeX]]-module \"url\" wordt gebrui
 </div> <!--closing div for \"plainlinks\"-->",
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Gunnernett
  * @author Harald Khan
  * @author Jon Harald Søby
@@ -4199,7 +4648,7 @@ $messages['nso'] = array(
  * @author Cedric31
  */
 $messages['oc'] = array(
-	'cite_article_desc' => "Apond una pagina especiala [[Special:Cite|citacion]] e un ligam dins la bóstia d'espleches",
+	'cite_article_desc' => "Apond una pagina especiala [[Special:Cite|citacion]] e un ligam dins la bóstia d'aisinas",
 	'cite_article_link' => 'Citar aqueste article',
 	'tooltip-cite-article' => 'Informacions sus cossí citar aquesta pagina',
 	'cite' => 'Citacion',
@@ -4265,7 +4714,7 @@ Se utilizatz lo package URL dins [[LaTeX]] (<code>\\usepackage{url}</code> endac
 </div> <!--closing div for \"plainlinks\"-->",
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Jnanaranjan Sahu
  * @author Psubhashish
  */
@@ -4498,7 +4947,7 @@ $messages['ps'] = array(
 	'tooltip-cite-article' => 'د دې مخ د درک لګولو مالومات',
 	'cite' => 'درک',
 	'cite_page' => 'مخ:',
-	'cite_submit' => 'درک لګول',
+	'cite_submit' => 'درک لگول',
 	'cite_text' => "__NOTOC__
 <div class=\"mw-specialcite-bibliographic\">
 
@@ -5226,11 +5675,12 @@ $messages['sr-ec'] = array(
 /** Serbian (Latin script) (srpski (latinica)‎)
  * @author Liangent
  * @author Michaello
+ * @author Milicevic01
  * @author Жељко Тодоровић
  */
 $messages['sr-el'] = array(
 	'cite_article_desc' => 'Dodaje specijalnu stranu za [[Special:Cite|citiranje]] i vezu ka oruđima.',
-	'cite_article_link' => 'citiranje ove strane',
+	'cite_article_link' => 'Bibliografski podaci',
 	'tooltip-cite-article' => 'Informacije o tome kako citirati ovu stranu',
 	'cite' => 'citat',
 	'cite_page' => 'Stranica:',
@@ -5994,7 +6444,7 @@ $messages['yue'] = array(
  * @author Xiaomingyan
  */
 $messages['zh-hans'] = array(
-	'cite_article_desc' => '增加[[Special:Cite|引用]]特殊页面以及工具箱链接',
+	'cite_article_desc' => '添加[[Special:Cite|引用]]特殊页面和工具箱链接',
 	'cite_article_link' => '引用本页',
 	'tooltip-cite-article' => '关于如何引用本页的信息',
 	'cite' => '引用页面',
diff --git a/extensions/Cite/SpecialCite.php b/extensions/Cite/SpecialCite.php
index 6d9b8138..5990f548 100644
--- a/extensions/Cite/SpecialCite.php
+++ b/extensions/Cite/SpecialCite.php
@@ -22,7 +22,7 @@ $wgExtensionCredits['specialpage'][] = array(
 	'url' => 'https://www.mediawiki.org/wiki/Extension:Cite/Special:Cite.php'
 );
 
-$dir = dirname( __FILE__ ) . '/';
+$dir = __DIR__ . '/';
 # Internationalisation file
 $wgExtensionMessagesFiles['SpecialCite'] = $dir . 'SpecialCite.i18n.php';
 $wgExtensionMessagesFiles['SpecialCiteAliases'] = $dir . 'SpecialCite.alias.php';
@@ -35,12 +35,12 @@ $wgAutoloadClasses['SpecialCite'] = $dir . 'SpecialCite_body.php';
 
 // Resources
 $citeResourceTemplate = array(
-	'localBasePath' => dirname(__FILE__) . '/modules',
+	'localBasePath' => __DIR__ . '/modules',
 	'remoteExtPath' => 'Cite/modules'
 );
 
 $wgResourceModules['ext.specialcite'] = $citeResourceTemplate + array(
-	'styles' => 'ext.specialcite/ext.specialcite.css',
+	'styles' => 'ext.specialcite.css',
 	'scripts' => array(),
 	'position' => 'bottom',
 );
diff --git a/extensions/Cite/citeCatTreeParserTests.txt b/extensions/Cite/citeCatTreeParserTests.txt
deleted file mode 100644
index 41362e62..00000000
--- a/extensions/Cite/citeCatTreeParserTests.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-# Force the test runner to ensure the extension is loaded
-!! hooks
-ref
-references
-categorytree
-!! endhooks
-
-!! test 
-Bug 20748 - <references /> doesn't work after category tree in some cases
-!! input
-<ref>ref</ref>
-
-<categorytree showcount=on>Articles tagged for deletion and rescue</categorytree>
-<references />
-!! result
-<p><sup id="cite_ref-0" class="reference"><a href="#cite_note-0">[1]</a></sup>
-</p>
-<div class="CategoryTreeTag" data-ct-mode="0" data-ct-options="{&quot;mode&quot;:0,&quot;hideprefix&quot;:20,&quot;showcount&quot;:true,&quot;namespaces&quot;:false}"><div class="CategoryTreeSection"><div class="CategoryTreeItem"><span class="CategoryTreeEmptyBullet">[<b>×</b>] </span> <a class="CategoryTreeLabel  CategoryTreeLabelNs14 new CategoryTreeLabelCategory" href="/index.php?title=Category:Articles_tagged_for_deletion_and_rescue&amp;action=edit&amp;redlink=1">Articles tagged for deletion and rescue</a>‎ <span title="Contains 0 subcategories, 0 pages, and 0 files" dir="ltr">(empty)</span></div>
-		<div class="CategoryTreeChildren" style="display:block"><i class="CategoryTreeNotice">no subcategories</i></div></div>
-		</div>
-<ol class="references">
-<li id="cite_note-0"><span class="mw-cite-backlink"><a href="#cite_ref-0">↑</a></span> <span class="reference-text">ref</span>
-</li>
-</ol>
-
-!! end
-
diff --git a/extensions/Cite/citeParserTests.txt b/extensions/Cite/citeParserTests.txt
index ded8cc19..052cd56a 100644
--- a/extensions/Cite/citeParserTests.txt
+++ b/extensions/Cite/citeParserTests.txt
@@ -10,7 +10,7 @@ Simple <ref>, no <references/>
 Wikipedia rocks!<ref>Proceeds of Rockology, vol. XXI</ref>
 !! result
 <p>Wikipedia rocks!<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
-<br /><strong class="error">Cite error: <code>&lt;ref&gt;</code> tags exist, but no <code>&lt;references/&gt;</code> tag was found</strong>
+<br /><strong class="error mw-ext-cite-error">Cite error: <code>&lt;ref&gt;</code> tags exist, but no <code>&lt;references/&gt;</code> tag was found</strong>
 </p>
 !! end
 
@@ -122,7 +122,7 @@ Templating<ref>Text<!--comment--></ref>
 !! result
 <p><sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
 </p>
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
 			<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
 			<div class="gallerytext">
@@ -142,7 +142,7 @@ Templating<ref>Text<!--comment--></ref>
 {{REVISIONID}}<ref>elite</ref>
 !! result
 <p>1337<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
-<br /><strong class="error">Cite error: <code>&lt;ref&gt;</code> tags exist, but no <code>&lt;references/&gt;</code> tag was found</strong>
+<br /><strong class="error mw-ext-cite-error">Cite error: <code>&lt;ref&gt;</code> tags exist, but no <code>&lt;references/&gt;</code> tag was found</strong>
 </p>
 !! end
 
@@ -253,23 +253,23 @@ Erroneous refs
 
 <references />
 !! result
-<p><strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+<p><strong class="error mw-ext-cite-error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
 name cannot be a simple integer. Use a descriptive title</strong>
 </p><p><sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>
-</p><p><strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+</p><p><strong class="error mw-ext-cite-error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
 refs with no content must have a name</strong>
 </p><p><sup id="cite_ref-bar_2-0" class="reference"><a href="#cite_note-bar-2">[2]</a></sup>
 </p><p><sup id="cite_ref-blankwithnoreference_3-0" class="reference"><a href="#cite_note-blankwithnoreference-3">[3]</a></sup>
-</p><p><strong class="error">Cite error: Invalid <code>&lt;references&gt;</code> tag;
+</p><p><strong class="error mw-ext-cite-error">Cite error: Invalid <code>&lt;references&gt;</code> tag;
 parameter "group" is allowed only.
 Use <code>&lt;references /&gt;</code>, or <code>&lt;references group="..." /&gt;</code></strong>
 </p>
 <ol class="references">
 <li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">Also zero, but differently! (Normal ref)</span>
 </li>
-<li id="cite_note-bar"><span class="mw-cite-backlink"><a href="#cite_ref-bar_0">↑</a></span> <strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+<li id="cite_note-bar"><span class="mw-cite-backlink"><a href="#cite_ref-bar_0">↑</a></span> <strong class="error mw-ext-cite-error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
 no text was provided for refs named <code>bar</code></strong></li>
-<li id="cite_note-blankwithnoreference"><span class="mw-cite-backlink"><a href="#cite_ref-blankwithnoreference_0">↑</a></span> <strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+<li id="cite_note-blankwithnoreference"><span class="mw-cite-backlink"><a href="#cite_ref-blankwithnoreference_0">↑</a></span> <strong class="error mw-ext-cite-error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
 no text was provided for refs named <code>blankwithnoreference</code></strong></li>
 </ol>
 
@@ -311,16 +311,20 @@ AAA<ref group="参">ref a</ref>BBB<ref group="注">note b</ref>CCC<ref group="
 !! result
 <p>AAA<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[参 1]</a></sup>BBB<sup id="cite_ref-2" class="reference"><a href="#cite_note-2">[注 1]</a></sup>CCC<sup id="cite_ref-3" class="reference"><a href="#cite_note-3">[参 2]</a></sup>
 </p>
-<dl><dt>refs
-</dt></dl>
+<dl>
+<dt>refs
+</dt>
+</dl>
 <ol class="references">
 <li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">ref a</span>
 </li>
 <li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text">ref c</span>
 </li>
 </ol>
-<dl><dt>notes
-</dt></dl>
+<dl>
+<dt>notes
+</dt>
+</dl>
 <ol class="references">
 <li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text">note b</span>
 </li>
@@ -379,12 +383,12 @@ AAA<ref group="参">ref a</ref>BBB<ref group="注">note b</ref>CCC<ref group="
 <p><sup id="cite_ref-foo_1-0" class="reference"><a href="#cite_note-foo-1">[2 1]</a></sup>
 </p>
 <ol class="references">
-<li id="cite_note-foo"><span class="mw-cite-backlink"><a href="#cite_ref-foo_0">↑</a></span> <strong class="error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
+<li id="cite_note-foo"><span class="mw-cite-backlink"><a href="#cite_ref-foo_0">↑</a></span> <strong class="error mw-ext-cite-error">Cite error: Invalid <code>&lt;ref&gt;</code> tag;
 no text was provided for refs named <code>foo</code></strong></li>
 </ol>
-<p><strong class="error">Cite error: <code>&lt;ref&gt;</code> tag with name "unused" defined in <code>&lt;references&gt;</code> is not used in prior text.</strong><br />
-<strong class="error">Cite error: <code>&lt;ref&gt;</code> tag in <code>&lt;references&gt;</code> has conflicting group attribute "1".</strong><br />
-<strong class="error">Cite error: <code>&lt;ref&gt;</code> tag defined in <code>&lt;references&gt;</code> has no name attribute.</strong>
+<p><strong class="error mw-ext-cite-error">Cite error: <code>&lt;ref&gt;</code> tag with name "unused" defined in <code>&lt;references&gt;</code> is not used in prior text.</strong><br />
+<strong class="error mw-ext-cite-error">Cite error: <code>&lt;ref&gt;</code> tag in <code>&lt;references&gt;</code> has conflicting group attribute "1".</strong><br />
+<strong class="error mw-ext-cite-error">Cite error: <code>&lt;ref&gt;</code> tag defined in <code>&lt;references&gt;</code> has no name attribute.</strong>
 </p>
 !! end
 
diff --git a/extensions/Cite/modules/ext.cite.css b/extensions/Cite/modules/ext.cite.css
new file mode 100644
index 00000000..4ea7a814
--- /dev/null
+++ b/extensions/Cite/modules/ext.cite.css
@@ -0,0 +1,16 @@
+/**
+ * Per http://developer.yahoo.com/blogs/ydn/clip-hidden-content-better-accessibility-53456.html
+ * and https://en.wikipedia.org/w/index.php?oldid=572888139#Scrolling_past_the_bottom_of_the_page...
+ */
+.cite-accessibility-label {
+	position: absolute !important;
+	/* Workaround a Webkit/Blink bug about positioning within columns as many wikis format references with several columns */
+	top: -99999px;
+	clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
+	clip: rect(1px, 1px, 1px, 1px);
+	padding: 0 !important;
+	border: 0 !important;
+	height: 1px !important;
+	width: 1px !important;
+	overflow: hidden;
+}
diff --git a/extensions/Cite/modules/ext.cite.js b/extensions/Cite/modules/ext.cite.js
new file mode 100644
index 00000000..fbec1f32
--- /dev/null
+++ b/extensions/Cite/modules/ext.cite.js
@@ -0,0 +1,38 @@
+/**
+ * Main JavaScript for the Cite extension. The main purpose of this file
+ * is to add accessibility attributes to the citation links as that can
+ * hardly be done server side (bug 38141).
+ *
+ * @author Marius Hoch <hoo@online.de>
+ */
+( function ( mw, $ ) {
+	'use strict';
+
+	mw.hook( 'wikipage.content' ).add( function ( $content ) {
+		var accessibilityLabelOne = mw.msg( 'cite_references_link_accessibility_label' ),
+			accessibilityLabelMany = mw.msg( 'cite_references_link_many_accessibility_label' );
+
+		$content.find( '.mw-cite-backlink' ).each( function () {
+			var $links = $( this ).find( 'a' ),
+				label;
+
+			if ( $links.length > 1 ) {
+				// This citation is used multiple times. Let's only set the accessibility label on the first link, the
+				// following ones should then be self-explaining. This is needed to make sure this isn't getting
+				// too wordy.
+				label = accessibilityLabelMany;
+			} else {
+				label = accessibilityLabelOne;
+			}
+
+			// We can't use aria-label over here as that's not supported consistently across all screen reader / browser
+			// combinations. We have to use visually hidden spans for the accessibility labels instead.
+			$links.eq( 0 ).prepend(
+				$( '<span>' )
+					.addClass( 'cite-accessibility-label' )
+					// Also make sure we have at least one space between the accessibility label and the visual one
+					.text( label + ' ' )
+			);
+		} );
+	} );
+} )( mediaWiki, jQuery );
diff --git a/extensions/Cite/modules/ext.cite.popups.js b/extensions/Cite/modules/ext.cite.popups.js
new file mode 100644
index 00000000..eb1e5079
--- /dev/null
+++ b/extensions/Cite/modules/ext.cite.popups.js
@@ -0,0 +1,13 @@
+( function ( mw, $ ) {
+	'use strict';
+
+	mw.hook( 'wikipage.content' ).add( function ( $content ) {
+		$content.find( '.biblio-cite-link,sup.reference a' ).tooltip( {
+			bodyHandler: function () {
+				return $content.find( '#' + this.hash.substr( 1 ) + ' > .reference-text' )
+					.html();
+			},
+			showURL: false
+		} );
+	} );
+} )( mediaWiki, jQuery );
diff --git a/extensions/Cite/modules/ext.cite/ext.cite.js b/extensions/Cite/modules/ext.cite/ext.cite.js
deleted file mode 100644
index dc7328b4..00000000
--- a/extensions/Cite/modules/ext.cite/ext.cite.js
+++ /dev/null
@@ -1,12 +0,0 @@
-( function($) {
-	$( function() {
-		$('.biblio-cite-link,sup.reference a').tooltip({
-				bodyHandler: function() {
-					return $( '#' + this.hash.substr(1) + ' > .reference-text' )
-						.html();
-				},
-				showURL : false
-			} );
-	} );
-	
-} )( jQuery );
diff --git a/extensions/Cite/modules/ext.rtlcite.css b/extensions/Cite/modules/ext.rtlcite.css
new file mode 100644
index 00000000..9b88d531
--- /dev/null
+++ b/extensions/Cite/modules/ext.rtlcite.css
@@ -0,0 +1,6 @@
+/* Isolation to fix references in case of RTL words at the end of a reference */
+sup.reference {
+	unicode-bidi: -moz-isolate;
+	unicode-bidi: -webkit-isolate;
+	unicode-bidi: isolate;
+}
diff --git a/extensions/Cite/modules/ext.rtlcite/ext.rtlcite.css b/extensions/Cite/modules/ext.rtlcite/ext.rtlcite.css
deleted file mode 100644
index 9b88d531..00000000
--- a/extensions/Cite/modules/ext.rtlcite/ext.rtlcite.css
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Isolation to fix references in case of RTL words at the end of a reference */
-sup.reference {
-	unicode-bidi: -moz-isolate;
-	unicode-bidi: -webkit-isolate;
-	unicode-bidi: isolate;
-}
diff --git a/extensions/Cite/modules/ext.specialcite.css b/extensions/Cite/modules/ext.specialcite.css
new file mode 100644
index 00000000..65a4e40e
--- /dev/null
+++ b/extensions/Cite/modules/ext.specialcite.css
@@ -0,0 +1,14 @@
+.mw-specialcite-bibliographic {
+	border: 1px solid grey; 
+	background: #E6E8FA; 
+	width: 90%; 
+	padding: 15px 30px 15px 30px; 
+	margin: 10px auto;
+}
+.mw-specialcite-styles {
+	border: 1px solid grey; 
+	width: 90%; 
+	padding: 15px 30px 15px 30px;
+	margin: 10px auto;
+}
+
diff --git a/extensions/Cite/modules/ext.specialcite/ext.specialcite.css b/extensions/Cite/modules/ext.specialcite/ext.specialcite.css
deleted file mode 100644
index 65a4e40e..00000000
--- a/extensions/Cite/modules/ext.specialcite/ext.specialcite.css
+++ /dev/null
@@ -1,14 +0,0 @@
-.mw-specialcite-bibliographic {
-	border: 1px solid grey; 
-	background: #E6E8FA; 
-	width: 90%; 
-	padding: 15px 30px 15px 30px; 
-	margin: 10px auto;
-}
-.mw-specialcite-styles {
-	border: 1px solid grey; 
-	width: 90%; 
-	padding: 15px 30px 15px 30px;
-	margin: 10px auto;
-}
-
diff --git a/extensions/ConfirmEdit/ApiFancyCaptchaReload.php b/extensions/ConfirmEdit/ApiFancyCaptchaReload.php
index 1de1947d..9b918d85 100644
--- a/extensions/ConfirmEdit/ApiFancyCaptchaReload.php
+++ b/extensions/ConfirmEdit/ApiFancyCaptchaReload.php
@@ -1,4 +1,4 @@
-<?
+<?php
 /**
  * Api module to reload FancyCaptcha
  *
diff --git a/extensions/ConfirmEdit/Asirra.class.php b/extensions/ConfirmEdit/Asirra.class.php
index bd58eb3a..ae1178a1 100644
--- a/extensions/ConfirmEdit/Asirra.class.php
+++ b/extensions/ConfirmEdit/Asirra.class.php
@@ -5,7 +5,7 @@
  */
 
 class Asirra extends SimpleCaptcha {
-	public $asirra_clientscript = 'http://challenge.asirra.com/js/AsirraClientSide.js';
+	public $asirra_clientscript = '//challenge.asirra.com/js/AsirraClientSide.js';
 
 	// As we don't have to store anything but some other things to do,
 	// we're going to replace that constructor completely.
diff --git a/extensions/ConfirmEdit/Asirra.i18n.php b/extensions/ConfirmEdit/Asirra.i18n.php
index 75f33a76..45811ce3 100644
--- a/extensions/ConfirmEdit/Asirra.i18n.php
+++ b/extensions/ConfirmEdit/Asirra.i18n.php
@@ -11,12 +11,12 @@ $messages = array();
 
 $messages['en'] = array(
 	'asirra-desc' => 'Asirra module for ConfirmEdit',
-	'asirra-edit' => 'To help protect against automated edit spam, please select just the cat photos in the box below:', 
-	'asirra-addurl' => 'Your edit includes new external links. To help protect against automated spam, please select just the cat photos in the box below:',
-	'asirra-badpass' => 'To help protect against automated password cracking, please select just the cat photos in the box below:',
-	'asirra-createaccount' => 'To help protect against automated account creation, please select just the cat photos in the box below:',
+	'asirra-edit' => 'To protect the wiki against automated edit spam, we kindly ask you to select just the cat photos in the box below:',
+	'asirra-addurl' => 'Your edit includes new external links. To protect the wiki against automated edit spam, we kindly ask you to select just the cat photos in the box below:',
+	'asirra-badlogin' => 'To protect the wiki against automated password cracking, we kindly ask you to select just the cat photos in the box below:',
+	'asirra-createaccount' => 'To protect the wiki against automated account creation, we kindly ask you to select just the cat photos in the box below:',
 	'asirra-createaccount-fail' => "Please correctly identify the cats.",
-	'asirra-create' => 'To help protect against automated page creation, please select just the cat photos in the box below:', 
+	'asirra-create' => 'To protect the wiki against automated page creation, we kindly ask you to select just the cat photos in the box below:',
 	'asirra-nojs' => '\'\'\'Please enable JavaScript and resubmit the page.\'\'\'',
 	'asirra-failed' => 'Please identify all cat images',
 );
@@ -24,13 +24,14 @@ $messages['en'] = array(
 /** Message documentation (Message documentation)
  * @author 2nd-player
  * @author Beta16
+ * @author Raymond
  * @author Shirayuki
  */
 $messages['qqq'] = array(
 	'asirra-desc' => '{{desc|name=Asirra|url=http://www.mediawiki.org/wiki/Extension:Asirra}}',
 	'asirra-edit' => '{{Related|ConfirmEdit-edit}}',
 	'asirra-addurl' => '{{Related|ConfirmEdit-addurl}}',
-	'asirra-badpass' => '{{Related|ConfirmEdit-badlogin}}',
+	'asirra-badlogin' => '{{Related|ConfirmEdit-badlogin}}',
 	'asirra-createaccount' => '{{Related|ConfirmEdit-createaccount}}',
 	'asirra-createaccount-fail' => 'Used as failure message in JavaScript code.
 {{Related|ConfirmEdit-createaccount-fail}}',
@@ -44,12 +45,12 @@ $messages['qqq'] = array(
  */
 $messages['ast'] = array(
 	'asirra-desc' => 'Módulu Asirra pa ConfirmEdit',
-	'asirra-edit' => "P'ayudanos a protexenos escontra el spam d'edición automática, esbille namái les fotos de gatos nel cuadru d'abaxo:",
-	'asirra-addurl' => "La so edición incluye enllaces esternos nuevos. P'ayudar a protexenos escontra'l spam automáticu, esbille namái les fotos de gatos nel cuadru d'abaxo:",
-	'asirra-badpass' => "P'ayudar a protexenos escontra'l frayamientu de claves automáticu, esbille namái les fotos de gatos nel cuadru d'abaxo:",
-	'asirra-createaccount' => "P'ayudar a protexenos escontra la creación de cuentes automática, esbille namái les fotos de gatos nel cuadru d'abaxo:",
+	'asirra-edit' => "Pa protexer la wiki escontra'l spam d'edición automáticu, pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
+	'asirra-addurl' => "La so edición incluye enllaces esternos nuevos. Pa protexer la wiki escontra'l spam automáticu,  pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
+	'asirra-badlogin' => "Pa protexer la wiki escontra'l frayamientu de claves automáticu, pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
+	'asirra-createaccount' => "Pa protexer la wiki escontra la creación de cuentes automática, pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
 	'asirra-createaccount-fail' => 'Identifique correutamente los gatos.',
-	'asirra-create' => "P'ayudar a protexenos escontra la creación de páxines automática, esbille namái les fotos de gatos nel cuadru d'abaxo:",
+	'asirra-create' => "Pa protexer la wiki escontra la creación de páxines automática, pidimos-y qu'esbille namái les fotos de gatos del cuadru d'abaxo:",
 	'asirra-nojs' => "'''Por favor active JavaScript y vuelva a unviar la páxina.'''",
 	'asirra-failed' => 'Identifique toles imaxes de gatos',
 );
@@ -61,16 +62,23 @@ $messages['ast'] = array(
  */
 $messages['be-tarask'] = array(
 	'asirra-desc' => 'Модуль Asirra для ConfirmEdit',
-	'asirra-edit' => 'Для абароны супраць спаму, калі ласка, выберыце толькі фота з катом ў полі ніжэй:',
-	'asirra-addurl' => 'Вашае рэдагаваньне ўтрымлівае новыя вонкавыя спасылкі. Для абароны супраць спаму, калі ласка, выберыце толькі фота з катом ў полі ніжэй:',
-	'asirra-badpass' => 'Для абароны супраць аўтаматычнага падбору паролю, калі ласка, выберыце толькі фота з катом ў полі ніжэй:',
-	'asirra-createaccount' => 'Для абароны супраць аўтаматычнага стварэньня рахункаў, калі ласка, выберыце толькі фота з катом ў полі ніжэй:',
+	'asirra-edit' => 'Для абароны супраць спаму, калі ласка, выберыце толькі фота з катом ў полі ніжэй:', # Fuzzy
+	'asirra-addurl' => 'Вашае рэдагаваньне ўтрымлівае новыя вонкавыя спасылкі. Для абароны супраць спаму, калі ласка, выберыце толькі фота з катом ў полі ніжэй:', # Fuzzy
+	'asirra-badlogin' => 'Для абароны супраць аўтаматычнага падбору паролю, калі ласка, выберыце толькі фота з катом ў полі ніжэй:', # Fuzzy
+	'asirra-createaccount' => 'Для абароны супраць аўтаматычнага стварэньня рахункаў, калі ласка, выберыце толькі фота з катом ў полі ніжэй:', # Fuzzy
 	'asirra-createaccount-fail' => 'Калі ласка, слушна выберыце катоў.',
-	'asirra-create' => 'Для абароны супраць аўтаматычнага стварэньня старонак, калі ласка, выберыце толькі фота з катом ў полі ніжэй:',
+	'asirra-create' => 'Для абароны супраць аўтаматычнага стварэньня старонак, калі ласка, выберыце толькі фота з катом ў полі ніжэй:', # Fuzzy
 	'asirra-nojs' => "'''Калі ласка, дазвольце JavaScript і дашліце старонку зноў.'''",
 	'asirra-failed' => 'Калі ласка, вызначце ўсе выявы з катамі',
 );
 
+/** Breton (brezhoneg)
+ * @author Fohanno
+ */
+$messages['br'] = array(
+	'asirra-nojs' => "'''Gweredekait JavaScript, mar plij, hag adkasit ar bajenn.'''",
+);
+
 /** Czech (česky)
  * @author Vks
  */
@@ -80,15 +88,16 @@ $messages['cs'] = array(
 
 /** German (Deutsch)
  * @author Kghbln
+ * @author Metalhead64
  */
 $messages['de'] = array(
 	'asirra-desc' => 'Ermöglicht die Nutzung des Anti-Spam-Moduls Asirra',
-	'asirra-edit' => 'Zum Schutz vor automatisiertem Spam bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
-	'asirra-addurl' => 'Deine Bearbeitung enthält neue externe Links. Zum Schutz vor automatisiertem Spam bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
-	'asirra-badpass' => 'Zum Schutz gegen automatisiertes Knacken von Passwörtern bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
-	'asirra-createaccount' => 'Zum Schutz gegen automatisiertes Erstellen von Benutzerkonten bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
+	'asirra-edit' => 'Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
+	'asirra-addurl' => 'Deine Bearbeitung enthält neue externe Links. Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
+	'asirra-badlogin' => 'Zum Schutz des Wikis gegen automatisiertes Knacken von Passwörtern bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
+	'asirra-createaccount' => 'Zum Schutz des Wikis gegen automatisiertes Erstellen von Benutzerkonten bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
 	'asirra-createaccount-fail' => 'Bitte wähle nur die Fotos mit Katzen aus.',
-	'asirra-create' => 'Zum Schutz gegen automatisiertes Erstellen von Seiten bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
+	'asirra-create' => 'Zum Schutz des Wikis gegen automatisiertes Erstellen von Seiten bitten wir dich, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
 	'asirra-nojs' => "'''Bitte JavaScript aktivieren und die Seiten nochmals Speichern.'''",
 	'asirra-failed' => 'Bitte wähle nur die Fotos mit Katzen aus.',
 );
@@ -97,11 +106,11 @@ $messages['de'] = array(
  * @author Kghbln
  */
 $messages['de-formal'] = array(
-	'asirra-addurl' => 'Ihre Bearbeitung enthält neue externe Links. Zum Schutz vor automatisiertem Spam bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
-	'asirra-badpass' => 'Zum Schutz gegen automatisiertes Knacken von Passwörtern bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
-	'asirra-createaccount' => 'Zum Schutz gegen automatisiertes Erstellen von Benutzerkonten bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
+	'asirra-addurl' => 'Ihre Bearbeitung enthält neue externe Links. Zum Schutz vor automatisiertem Spam bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:', # Fuzzy
+	'asirra-badlogin' => 'Zum Schutz gegen automatisiertes Knacken von Passwörtern bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:', # Fuzzy
+	'asirra-createaccount' => 'Zum Schutz gegen automatisiertes Erstellen von Benutzerkonten bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:', # Fuzzy
 	'asirra-createaccount-fail' => 'Bitte wählen Sie nur die Fotos mit Katzen aus.',
-	'asirra-create' => 'Zum Schutz gegen automatisiertes Erstellen von Seiten bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:',
+	'asirra-create' => 'Zum Schutz gegen automatisiertes Erstellen von Seiten bitten wir Sie, nur die Fotos mit Katzen im untenstehenden Feld auszuwählen:', # Fuzzy
 	'asirra-failed' => 'Bitte wählen Sie nur die Fotos mit Katzen aus.',
 );
 
@@ -117,12 +126,12 @@ $messages['diq'] = array(
  */
 $messages['es'] = array(
 	'asirra-desc' => 'Módulo de Asirra para ConfirmEdit',
-	'asirra-edit' => 'Para ayudar a protegernos contra el spam de edición automática, seleccione sólo las fotos de gatos en el cuadro siguiente:',
-	'asirra-addurl' => 'Su edición incluye nuevos enlaces externos. Para ayudar a protegernos contra el spam automatizado, por favor, seleccione solo las fotos de gato en el cuadro siguiente:',
-	'asirra-badpass' => 'Para ayudar a protegernos del robo automatizado de contraseñas, seleccione sólo las fotos de gatos en el cuadro siguiente:',
-	'asirra-createaccount' => 'Para ayudar a protegernos contra la creación automatizada de cuentas, seleccione sólo las fotos de gato en el cuadro siguiente:',
+	'asirra-edit' => 'Para ayudar a protegernos contra el spam de edición automática, seleccione sólo las fotos de gatos en el cuadro siguiente:', # Fuzzy
+	'asirra-addurl' => 'Su edición incluye nuevos enlaces externos. Para ayudar a protegernos contra el spam automatizado, por favor, seleccione solo las fotos de gato en el cuadro siguiente:', # Fuzzy
+	'asirra-badlogin' => 'Para ayudar a protegernos del robo automatizado de contraseñas, seleccione sólo las fotos de gatos en el cuadro siguiente:', # Fuzzy
+	'asirra-createaccount' => 'Para ayudar a protegernos contra la creación automatizada de cuentas, seleccione sólo las fotos de gato en el cuadro siguiente:', # Fuzzy
 	'asirra-createaccount-fail' => 'Identifique correctamente los gatos.',
-	'asirra-create' => 'Para ayudar a protegernos contra la creación automática de páginas, seleccione sólo las fotos de gato en el cuadro siguiente:',
+	'asirra-create' => 'Para ayudar a protegernos contra la creación automática de páginas, seleccione sólo las fotos de gato en el cuadro siguiente:', # Fuzzy
 	'asirra-nojs' => "'''Por favor active JavaScript y vuelva a la página.'''",
 	'asirra-failed' => 'Identifique todas las imágenes de gatos',
 );
@@ -132,12 +141,12 @@ $messages['es'] = array(
  */
 $messages['fi'] = array(
 	'asirra-desc' => 'Asirra-moduuli muokkauksen varmennukseen',
-	'asirra-edit' => 'Suojana automaattisia roskamuokkauksia vastaan sinun on valittava kissan kuvat laatikosta alla:',
-	'asirra-addurl' => 'Muokkauksesi sisältää uusia ulkoisia linkkejä. Suojana automaattista roskapostia vastaan sinun on valittava kissan kuvat laatikosta alla:',
-	'asirra-badpass' => 'Suojana automaattisia salasanamurtoja vastaan sinun on valittava kissan kuvat laatikosta alla:',
-	'asirra-createaccount' => 'Suojana automaattista tunnusten luontia vastaan sinun on valittava kissan kuvat laatikosta alla:',
+	'asirra-edit' => 'Suojana automaattisia roskamuokkauksia vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
+	'asirra-addurl' => 'Muokkauksesi sisältää uusia ulkoisia linkkejä. Suojana automaattista roskapostia vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
+	'asirra-badlogin' => 'Suojana automaattisia salasanamurtoja vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
+	'asirra-createaccount' => 'Suojana automaattista tunnusten luontia vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
 	'asirra-createaccount-fail' => 'Tunnista kissat.',
-	'asirra-create' => 'Suojana automaattista sivujen luontia vastaan sinun on valittava kissan kuvat laatikosta alla:',
+	'asirra-create' => 'Suojana automaattista sivujen luontia vastaan sinun on valittava kissan kuvat laatikosta alla:', # Fuzzy
 	'asirra-nojs' => "'''Salli JavaScript ja lähetä uudelleen.'''",
 	'asirra-failed' => 'Tunnista kaikki kissan kuvat',
 );
@@ -149,12 +158,12 @@ $messages['fi'] = array(
  */
 $messages['fr'] = array(
 	'asirra-desc' => 'Module Asirra pour ConfirmEdit',
-	'asirra-edit' => "Pour aider à nous protéger contre le spam d’édition automatique, veuillez sélectionner '''uniquement les photos de chats''' dans la boîte ci-dessous :",
-	'asirra-addurl' => 'Votre édition contient des liens externes. Pour nous aider à nous protéger contre le spam automatique, veuillez sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
-	'asirra-badpass' => 'Pour nous aider à nous protéger des essais automatiques de cassage de mot de passe, veuillez sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
-	'asirra-createaccount' => "Pour nous aider à nous protéger contre la création automatique de comptes, veuillez sélectionner '''uniquement les photos de chats''' dans la boîte ci-dessous :",
+	'asirra-edit' => 'Pour protéger le wiki contre le spam d’édition automatique, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
+	'asirra-addurl' => 'Votre édition contient des liens externes. Pour protéger le wiki contre le spam de modification automatique, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
+	'asirra-badlogin' => 'Pour protéger le wiki des essais automatiques de cassage de mot de passe, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
+	'asirra-createaccount' => 'Pour protéger le wiki contre la création automatique de comptes, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
 	'asirra-createaccount-fail' => 'Veuillez identifier correctement les chats.',
-	'asirra-create' => 'Pour nous aider à nous protéger contre la création automatique de pages, veuillez sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
+	'asirra-create' => 'Pour protéger le wiki contre la création automatique de pages, nous vous demandons de bien vouloir sélectionner uniquement les photos de chats dans la boîte ci-dessous :',
 	'asirra-nojs' => "'''Veuillez activer le JavaScript et re-soumettre la page.'''",
 	'asirra-failed' => 'Veuillez identifier toutes les images de chat',
 );
@@ -164,12 +173,12 @@ $messages['fr'] = array(
  */
 $messages['gl'] = array(
 	'asirra-desc' => 'Módulo Asirra para ConfirmEdit',
-	'asirra-edit' => 'Para axudarnos á protección contra o spam, seleccione só as fotos de gatos na caixa:',
-	'asirra-addurl' => 'A súa edición inclúe novas ligazóns externas. Para axudar na protección contra o spam automático, seleccione só as fotos de gatos na caixa:',
-	'asirra-badpass' => 'Para axudarnos á protección contra o roubo de contrasinais, seleccione só as fotos de gatos na caixa:',
-	'asirra-createaccount' => 'Para axudarnos á protección contra a creación automática de contas, seleccione só as fotos de gatos na caixa:',
+	'asirra-edit' => 'Para protexer o wiki contra o spam automático, seleccione só as fotos de gatos na caixa:',
+	'asirra-addurl' => 'A súa edición inclúe novas ligazóns externas. Para protexer o wiki contra o spam automático, seleccione só as fotos de gatos na caixa:',
+	'asirra-badlogin' => 'Para protexer o wiki contra o roubo de contrasinais, seleccione só as fotos de gatos na caixa:',
+	'asirra-createaccount' => 'Para protexer o wiki contra a creación automática de contas, seleccione só as fotos de gatos na caixa:',
 	'asirra-createaccount-fail' => 'Identifique correctamente os gatos.',
-	'asirra-create' => 'Para axudarnos á protección contra a creación automática de páxinas, seleccione só as fotos de gatos na caixa:',
+	'asirra-create' => 'Para protexer o wiki contra a creación automática de páxinas, seleccione só as fotos de gatos na caixa:',
 	'asirra-nojs' => "'''Active o JavaScript e volva enviar a páxina.'''",
 	'asirra-failed' => 'Identifique todas as fotos de gatos',
 );
@@ -179,12 +188,12 @@ $messages['gl'] = array(
  */
 $messages['hsb'] = array(
 	'asirra-desc' => 'Modul Asirra za ConfirmEdit',
-	'asirra-edit' => 'Za škit přećiwo awtomatizowanemu spamej, prošu wubjer jenož fota kóčkow w slědowacym polu:',
-	'asirra-addurl' => 'Twoja změna wobsahuje nowe eksterne wotkazy. Za škit přećiwo awtomatizowanemu spamej, prošu wubjer jenož fota kóčkow w slědowacym polu:',
-	'asirra-badpass' => 'Za škit přećiwo awtomatizowanemu złamanju hesłow, prošu wubjer jenož fota kóčkow w slědowacym polu:',
-	'asirra-createaccount' => 'Za škit přećiwo awtomatiskemu wutworjenju konta, prošu wubjer jenož fota kóčkow w slědowacym polu:',
+	'asirra-edit' => 'Za škit přećiwo awtomatizowanemu spamej, prošu wubjer jenož fota kóčkow w slědowacym polu:', # Fuzzy
+	'asirra-addurl' => 'Twoja změna wobsahuje nowe eksterne wotkazy. Za škit přećiwo awtomatizowanemu spamej, prošu wubjer jenož fota kóčkow w slědowacym polu:', # Fuzzy
+	'asirra-badlogin' => 'Za škit přećiwo awtomatizowanemu złamanju hesłow, prošu wubjer jenož fota kóčkow w slědowacym polu:', # Fuzzy
+	'asirra-createaccount' => 'Za škit přećiwo awtomatiskemu wutworjenju konta, prošu wubjer jenož fota kóčkow w slědowacym polu:', # Fuzzy
 	'asirra-createaccount-fail' => 'Prošu identifikuj kóčki.',
-	'asirra-create' => 'Za škit přećiwo awtomatiskemu wutworjenju strony, prošu wubjer jenož fota kóčkow w slědowacym polu:',
+	'asirra-create' => 'Za škit přećiwo awtomatiskemu wutworjenju strony, prošu wubjer jenož fota kóčkow w slědowacym polu:', # Fuzzy
 	'asirra-nojs' => "'''Prošu zmóžń JavaScript a składuj stronu hišće raz.'''",
 	'asirra-failed' => 'Prošu identifikuj wšě wobrazy z kóčkami',
 );
@@ -194,12 +203,12 @@ $messages['hsb'] = array(
  */
 $messages['ia'] = array(
 	'asirra-desc' => 'Modulo de Asirra pro ConfirmEdit',
-	'asirra-edit' => 'Pro adjutar a proteger nos contra le spam automatisate, per favor selige solmente le photos de cattos in le quadro sequente:',
-	'asirra-addurl' => 'Iste modification include nove ligamines externe. Pro adjutar a proteger nos contra le spam automatisate, per favor selige solmente le photos de cattos in le quadro sequente:',
-	'asirra-badpass' => 'Pro adjutar a proteger nos contra le furto automatisate de contrasignos, per favor selige solmente le photos de catto in le quadro sequente:',
-	'asirra-createaccount' => 'Pro adjutar a proteger nos contra le creation automatisate de contos, per favor selige solmente le photos de cattos in le quadro sequente:',
+	'asirra-edit' => 'Pro adjutar a proteger le wiki contra le spam automatisate, per favor selige solmente le photos de cattos in le quadro sequente:',
+	'asirra-addurl' => 'Iste modification include nove ligamines externe. Pro adjutar a proteger le wiki contra le spam automatisate, per favor selige solmente le photos de cattos in le quadro sequente:',
+	'asirra-badlogin' => 'Pro adjutar a proteger le wiki contra le furto automatisate de contrasignos, per favor selige solmente le photos de cattos in le quadro sequente:',
+	'asirra-createaccount' => 'Pro adjutar a proteger le wiki contra le creation automatisate de contos, per favor selige solmente le photos de cattos in le quadro sequente:',
 	'asirra-createaccount-fail' => 'Per favor identifica correctemente le cattos.',
-	'asirra-create' => 'Pro adjutar a proteger nos contra le creation automatisate de paginas, per favor selige solmente le photos de cattos in le quadro sequente:',
+	'asirra-create' => 'Pro adjutar a proteger le wiki contra le creation automatisate de paginas, per favor selige solmente le photos de cattos in le quadro sequente:',
 	'asirra-nojs' => "'''Per favor activa JavaScript e resubmitte le pagina.'''",
 	'asirra-failed' => 'Per favor identifica tote le imagines de cattos',
 );
@@ -209,12 +218,12 @@ $messages['ia'] = array(
  */
 $messages['it'] = array(
 	'asirra-desc' => 'Modulo ASIRRA per ConfirmEdit',
-	'asirra-edit' => 'Per aiutarci a proteggerci dalle modifiche automatiche che aggiungono spam, seleziona solo le foto di gatti nel riquadro sottostante:',
-	'asirra-addurl' => 'La tua modifica aggiunge qualche nuovo collegamento esterno. Per aiutarci a proteggerci dallo spam automatico, seleziona solo le foto di gatti nel riquadro sottostante:',
-	'asirra-badpass' => 'Per aiutarci a proteggerci dalla forzatura automatica delle password, seleziona solo le foto di gatti nel riquadro sottostante:',
-	'asirra-createaccount' => 'Per aiutarci a proteggerci dalla creazione automatica di nuovi accessi, seleziona solo le foto di gatti nel riquadro sottostante:',
+	'asirra-edit' => 'Per proteggere il wiki dalle modifiche automatiche che aggiungono spam, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
+	'asirra-addurl' => 'La tua modifica aggiunge qualche nuovo collegamento esterno. Per proteggere il wiki dallo spam automatico, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
+	'asirra-badlogin' => 'Per proteggere il wiki dalla forzatura automatica delle password, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
+	'asirra-createaccount' => 'Per proteggere il wiki dalla creazione automatica di nuovi accessi, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
 	'asirra-createaccount-fail' => 'Identifica correttamente i gatti.',
-	'asirra-create' => 'Per aiutarci a proteggerci dalla creazione automatica di pagine, seleziona solo le foto di gatti nel riquadro sottostante:',
+	'asirra-create' => 'Per proteggere il wiki dalla creazione automatica di pagine, ti chiediamo gentilmente di selezionare solo le foto di gatti nel riquadro sottostante:',
 	'asirra-nojs' => "'''Attiva JavaScript ed invia di nuovo la pagina.'''",
 	'asirra-failed' => 'Identifica tutte le immagini di gatti',
 );
@@ -225,27 +234,28 @@ $messages['it'] = array(
  */
 $messages['ja'] = array(
 	'asirra-desc' => 'ConfirmEdit 用 Asirra モジュール',
-	'asirra-edit' => '自動編集のスパム攻撃を防ぐため、猫が写っている画像を以下から選択してください:',
-	'asirra-addurl' => 'あなたは新しい外部リンクを追加しようとしています。自動でのスパム攻撃を防ぐため、猫が写っている画像を以下から選択してください:',
-	'asirra-badpass' => '自動でのパスワードクラック攻撃を防ぐため、猫が写っている画像を以下から選択してください:',
-	'asirra-createaccount' => 'アカウントの自動登録を防ぐため、猫が写っている画像を以下から選択してください:',
+	'asirra-edit' => 'ウィキでの自動編集のスパム攻撃を防ぐため、お手数をおかけしますが猫が写っている画像を以下から選択してください:',
+	'asirra-addurl' => 'あなたは新しい外部リンクを追加しようとしています。ウィキへの自動スパム攻撃を防ぐため、お手数をおかけしますが猫が写っている画像を以下から選択してください:',
+	'asirra-badlogin' => 'ウィキへの自動パスワードクラック攻撃を防ぐため、お手数をおかけしますが猫が写っている画像を以下から選択してください:',
+	'asirra-createaccount' => 'ウィキでのアカウント自動作成を防ぐため、お手数をおかけしますが猫が写っている画像を以下から選択してください:',
 	'asirra-createaccount-fail' => '猫を正しく選択してください。',
-	'asirra-create' => 'ページの自動作成を防ぐため、猫が写っている画像を以下から選択してください:',
+	'asirra-create' => 'ウィキでのページ自動作成を防ぐため、お手数をおかけしますが猫が写っている画像を以下から選択してください:',
 	'asirra-nojs' => "'''JavaScript を有効にしてページを再読込してください。'''",
 	'asirra-failed' => '猫が写っている画像をすべて選択してください',
 );
 
 /** Korean (한국어)
+ * @author Hym411
  * @author 아라
  */
 $messages['ko'] = array(
 	'asirra-desc' => 'ConfirmEdit에 대한 Asirra 모듈',
 	'asirra-edit' => '자동화된 편집 스팸으로부터 보호하기 위해, 아래 상자에 있는 고양이 사진을 선택하세요:',
 	'asirra-addurl' => '편집에 새로운 바깥 링크가 포함되어 있습니다. 자동화된 스팸으로부터 보호하기 위해, 아래 상자에 있는 고양이 사진을 선택하세요:',
-	'asirra-badpass' => '비밀번호 깨기로부터 보호하기 위해, 아래 상자에 있는 고양이 사진을 선택하세요:',
-	'asirra-createaccount' => '자동화된 계정 만들기로부터 보호하기 위해, 아래 상자에 있는 고양이 사진을 선택하세요:',
+	'asirra-badlogin' => '자동화된 비밀번호 크래킹으로부터 보호하기 위해, 아래 상자에 있는 고양이 사진을 선택하세요:',
+	'asirra-createaccount' => '자동화된 계정 만들기로부터 위키를 보호하기 위해, 아래 상자에 있는 고양이 사진을 선택하세요:',
 	'asirra-createaccount-fail' => '고양이를 올바르게 선택하세요.',
-	'asirra-create' => '자동화된 문서 만들기로부터 보호하기 위해, 아래 상자에 있는 고양이 사진을 선택하세요:',
+	'asirra-create' => '자동화된 문서 만들기로부터 위키를 보호하기 위해, 아래 상자에 있는 고양이 사진을 선택하세요:',
 	'asirra-nojs' => "'''자바스크립트를 활성화하고 문서를 다시 제출하세요.'''",
 	'asirra-failed' => '고양이 그림을 모두 선택하세요',
 );
@@ -255,12 +265,12 @@ $messages['ko'] = array(
  */
 $messages['ksh'] = array(
 	'asirra-desc' => 'Dä Zohsaz <i lang="en">Asirra</i> för et Zohsazprojramm <i lang="en">ConfirmEdit</i>.',
-	'asirra-edit' => 'Heh dat Wiki well sesch jääje <i lang="en">SPAM</i> schöze. Dröm moß mer beim Ändere noch en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:',
-	'asirra-addurl' => 'Heh dat Wiki well sesch jääje <i lang="en">SPAM</i> schöze. Dröm moß mer, wam_mer lengks noh ußerhallef enfööje well, noch en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:',
-	'asirra-badpass' => 'Heh dat Wiki well sesch jääje et automattesche Paßwoot_Knacke schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:',
-	'asirra-createaccount' => 'Heh dat Wiki well sesch jääje automattesch aanjelaate „Metmaacher“ schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:',
+	'asirra-edit' => 'Heh dat Wiki well sesch jääje <i lang="en">SPAM</i> schöze. Dröm moß mer beim Ändere noch en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
+	'asirra-addurl' => 'Heh dat Wiki well sesch jääje <i lang="en">SPAM</i> schöze. Dröm moß mer, wam_mer lengks noh ußerhallef enfööje well, noch en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
+	'asirra-badlogin' => 'Heh dat Wiki well sesch jääje et automattesche Paßwoot_Knacke schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
+	'asirra-createaccount' => 'Heh dat Wiki well sesch jääje automattesch aanjelaate „Metmaacher“ schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
 	'asirra-createaccount-fail' => 'Bes esu jood un don de Kazebelder ußwähle.',
-	'asirra-create' => 'Heh dat Wiki well sesch jääje automattesch neu aanjelaate Sigge schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:',
+	'asirra-create' => 'Heh dat Wiki well sesch jääje automattesch neu aanjelaate Sigge schöze. Dröm moß mer heh nor_en Prööfong aflääje, dat mer ene Minsch un kei Projramm es. Söhk bloß de Katzebelder em Kaßte us:', # Fuzzy
 	'asirra-nojs' => "'''Bes esu jood un donn JavaSkrep en Dingem Brauser aanschallde un scheck heh di Sigg norr_ens af.'''",
 	'asirra-failed' => 'Bes esu jood un don all de Kazebelder ußwähle.',
 );
@@ -270,7 +280,8 @@ $messages['ksh'] = array(
  */
 $messages['lb'] = array(
 	'asirra-desc' => 'Asirra-Modul fir ConfirmEdit',
-	'asirra-addurl' => "An Ärer Ännerung sinn nei extern Linken. Fir ze hëllefe géint automatiséierte Spam virzegoen, sicht w.e.g. d'Kategorie vun de Fotoen an der Këscht ënnendrënner eraus:",
+	'asirra-edit' => "Fir d'Wiki géint automatiséierte Spam ze schützen froe mir Iech just d'Fotoe mat Kazen, déi Dir an der Këscht ënnendrënner gesitt, erauszesichen:",
+	'asirra-addurl' => "An Ärer Ännerung sinn nei extern Linken. Fir d'Wiki géint automatiséierte Spam ze schützen, froe mir Iech d'Kategorie vun de Fotoen an der Këscht ënnendrënner erauszesichen:",
 	'asirra-createaccount-fail' => "Identifizéiert d'Kaze w.e.g. richteg.",
 	'asirra-nojs' => "'''Aktivéiert w.e.g. JavaScript a schéckt d'Säit nachemol.'''",
 	'asirra-failed' => 'Identifizéiert w.e.g. all Biller wou Kazen drop sinn',
@@ -281,12 +292,12 @@ $messages['lb'] = array(
  */
 $messages['mk'] = array(
 	'asirra-desc' => 'Asirra-модул за ПотврдиУредување',
-	'asirra-edit' => 'Како заштитна мерка против автоматизиран спам, изберете ги само сликите со мачка прикажани во полето:',
-	'asirra-addurl' => 'Во вашите измени има нови надворешни врски. Како заштитна мерка против автоматизиран спам, изберете ги само сликите со мачка прикажани во полето:',
-	'asirra-badpass' => 'Како заштитна мерка против автоматизирано провалување на лозинки, изберете ги само сликите со мачка прикажани во полето:',
-	'asirra-createaccount' => 'Како заштитна мерка против автоматизирано создавање на сметки, изберете ги само сликите со мачка прикажани во полето:',
+	'asirra-edit' => 'Како заштитна мерка против автоматизиран спам, би ве замолиле да ги изберете само сликите со мачка прикажани во полето:',
+	'asirra-addurl' => 'Во вашите измени има нови надворешни врски. Како заштитна мерка против автоматизиран спам, би ве замолиле да ги изберете само сликите со мачка прикажани во полето:',
+	'asirra-badlogin' => 'Како заштитна мерка против автоматизирано провалување на лозинки, би ве замолиле да ги изберете само сликите со мачка прикажани во полето:',
+	'asirra-createaccount' => 'Како заштитна мерка против автоматизирано создавање на сметки, би ве замолиле да ги изберете само сликите со мачка прикажани во полето:',
 	'asirra-createaccount-fail' => 'Посочете кои од следниве се мачки.',
-	'asirra-create' => 'Како заштитна мерка против автоматизирано создавање на страници, изберете ги само сликите со мачка прикажани во полето:',
+	'asirra-create' => 'Како заштитна мерка против автоматизирано создавање на страници, би ве замолиле да ги изберете само сликите со мачка прикажани во полето:',
 	'asirra-nojs' => "'''Овозможете JavaScript и поднесете ја страницата повторно.'''",
 	'asirra-failed' => 'Изберете ги сликите што имаат мачка',
 );
@@ -296,12 +307,12 @@ $messages['mk'] = array(
  */
 $messages['ms'] = array(
 	'asirra-desc' => 'Modul Asirra untuk ConfirmEdit',
-	'asirra-edit' => 'Untuk mencegah suntingan spam automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
-	'asirra-addurl' => 'Suntingan anda mengandungi pautan luar yang baru. Untuk mencegah spam janaan automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
-	'asirra-badpass' => 'Untuk mencegah pemecahan kata laluan automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
-	'asirra-createaccount' => 'Untuk mencegah pembukaan akaun automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
+	'asirra-edit' => 'Untuk mencegah suntingan spam automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
+	'asirra-addurl' => 'Suntingan anda mengandungi pautan luar yang baru. Untuk mencegah spam janaan automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
+	'asirra-badlogin' => 'Untuk mencegah pemecahan kata laluan automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
+	'asirra-createaccount' => 'Untuk mencegah pembukaan akaun automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
 	'asirra-createaccount-fail' => 'Sila kenal pasti kucing-kucing dengan betul.',
-	'asirra-create' => 'Untuk mencegah pembukaan halaman automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:',
+	'asirra-create' => 'Untuk mencegah pembukaan halaman automatik, sila pilih gambar-gambar kucing sahaja dalam petak di bawah:', # Fuzzy
 	'asirra-nojs' => "'''Sila hidupkan JavaScript dan hantar semula halaman ini.'''",
 	'asirra-failed' => 'Sila kenal pasti semua gambar kucing',
 );
@@ -311,43 +322,44 @@ $messages['ms'] = array(
  */
 $messages['mt'] = array(
 	'asirra-desc' => 'Modulu ASIRRA għal ConfirmEdit',
-	'asirra-edit' => "Sabiex tgħinna nipproteġu kontra l-modifiki li jżidu spam, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:",
-	'asirra-addurl' => "Il-modifika tiegħek tinkludi ħoloq esterni ġodda. Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:",
-	'asirra-badpass' => "Sabiex tgħinna nipproteġu kontra l-infurzar awtomatiku tal-passwords, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:",
-	'asirra-createaccount' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' kontijiet ġodda, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:",
+	'asirra-edit' => "Sabiex tgħinna nipproteġu kontra l-modifiki li jżidu spam, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
+	'asirra-addurl' => "Il-modifika tiegħek tinkludi ħoloq esterni ġodda. Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
+	'asirra-badlogin' => "Sabiex tgħinna nipproteġu kontra l-infurzar awtomatiku tal-passwords, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
+	'asirra-createaccount' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' kontijiet ġodda, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
 	'asirra-createaccount-fail' => 'Sib il-qtates.',
-	'asirra-create' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' paġni, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:",
+	'asirra-create' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' paġni, jekk jogħġbok agħżel ir-ritratti tal-qtates fil-kaxxa t'hawn taħt:", # Fuzzy
 	'asirra-nojs' => "'''Jekk jogħġbok attiva l-JavaScript u erġa' ibgħat din il-paġna.'''",
 	'asirra-failed' => 'Sib l-istampi kollha tal-qtates',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Event
  */
 $messages['nb'] = array(
 	'asirra-desc' => 'Assirra-modulen for ConfirmEdit',
-	'asirra-edit' => 'Som beskyttelse mot automatisk redigert spam, vennligst velg kun kattebildene i boksen under:',
-	'asirra-addurl' => 'Din redigering inneholder nye eksterne lenker. Som beskyttelse mot automatisk redigert spam, vennligst velg kun kattebildene i boksen under:',
-	'asirra-badpass' => 'Som beskyttelse mot automatisk passordknekking, vennligst velg kun kattebildene i boksen under:',
-	'asirra-createaccount' => 'Som beskyttelse mot automatisk opprettelse av brukerkonto, vennligst velg kun kattebildene i boksen under:',
+	'asirra-edit' => 'Som beskyttelse mot automatisk redigert spam, vennligst velg kun kattebildene i boksen under:', # Fuzzy
+	'asirra-addurl' => 'Din redigering inneholder nye eksterne lenker. Som beskyttelse mot automatisk redigert spam, vennligst velg kun kattebildene i boksen under:', # Fuzzy
+	'asirra-badlogin' => 'Som beskyttelse mot automatisk passordknekking, vennligst velg kun kattebildene i boksen under:', # Fuzzy
+	'asirra-createaccount' => 'Som beskyttelse mot automatisk opprettelse av brukerkonto, vennligst velg kun kattebildene i boksen under:', # Fuzzy
 	'asirra-createaccount-fail' => 'Vennligst angi hva som er katter.',
-	'asirra-create' => 'Som beskyttelse mot automatisk opprettelse av sider, vennligst velg kun kattebildene i boksen under:',
+	'asirra-create' => 'Som beskyttelse mot automatisk opprettelse av sider, vennligst velg kun kattebildene i boksen under:', # Fuzzy
 	'asirra-nojs' => "'''Vennligst åpne for JavaScript og lagre siden en gang til.'''",
 	'asirra-failed' => 'Vennligst merk alle kattebilder',
 );
 
 /** Dutch (Nederlands)
+ * @author HanV
  * @author SPQRobin
  * @author Siebrand
  */
 $messages['nl'] = array(
 	'asirra-desc' => 'Asirra-module voor ConfirmEdit',
 	'asirra-edit' => 'Kies ter bescherming tegen geautomatiseerde spam de afbeeldingen met een poes in het onderstaande venster:',
-	'asirra-addurl' => "Uw bewerking bevat nieuwe externe koppelingen. Selecteer de foto's van katten in het vak hieronder om te helpen beschermen tegen geautomatiseerde spam:",
-	'asirra-badpass' => 'Kies ter bescherming tegen het automatisch kraken van wachtwoorden de afbeeldingen met een poes in het onderstaande venster:',
+	'asirra-addurl' => "Uw bewerking bevat nieuwe externe koppelingen. Selecteer de foto's van katten in het vak hieronder om de wiki te beschermen tegen geautomatiseerde spam:",
+	'asirra-badlogin' => 'Kies ter bescherming tegen het automatisch kraken van wachtwoorden de afbeeldingen met een poes in het onderstaande venster:',
 	'asirra-createaccount' => 'Kies om het automatisch aanmaken van gebruikers tegen te gaan de afbeeldingen met een poes in het onderstaande venster:',
 	'asirra-createaccount-fail' => 'Identificeer de katten juist.',
-	'asirra-create' => "Kies om het automatisch aanmaken van pagina's tegen te gaan de afbeeldingen met een poes in het onderstaande venster:",
+	'asirra-create' => 'Kies om het automatisch aanmaken van een pagina tegen te gaan de afbeeldingen met een poes in het onderstaande venster:',
 	'asirra-nojs' => "'''Schakel JavaScript in en probeer de pagina opnieuw op te slaan.'''",
 	'asirra-failed' => 'Identificeer alle afbeeldingen van katten.',
 );
@@ -356,7 +368,7 @@ $messages['nl'] = array(
  * @author Siebrand
  */
 $messages['nl-informal'] = array(
-	'asirra-addurl' => "Je bewerking bevat nieuwe externe koppelingen. Selecteer de foto's van katten in het vak hieronder om te helpen beschermen tegen geautomatiseerde spam:",
+	'asirra-addurl' => "Je bewerking bevat nieuwe externe koppelingen. Selecteer de foto's van katten in het vak hieronder om te helpen beschermen tegen geautomatiseerde spam:", # Fuzzy
 );
 
 /** Polish (polski)
@@ -364,12 +376,12 @@ $messages['nl-informal'] = array(
  */
 $messages['pl'] = array(
 	'asirra-desc' => 'Moduł Asirra dla ConfirmEdit',
-	'asirra-edit' => 'Aby uchronić się przed automatami wprowadzającymi spam, proszę wybrać tylko zdjęcia kotów w poniższym polu:',
-	'asirra-addurl' => 'Wprowadzony przez ciebie tekst zawiera linki zewnętrzne. Aby uchronić nas przed automatycznym spamem, proszę wskazać tylko zdjęcia kotów w poniższym polu:',
-	'asirra-badpass' => 'Aby uchronić się przed zautomatyzowanym łamaniem haseł, proszę wybrać tylko zdjęcia kotów w poniższym polu:',
-	'asirra-createaccount' => 'Aby uchronić się przed automatycznym tworzeniem kont, proszę wybrać tylko zdjęcia kotów w poniższym polu:',
+	'asirra-edit' => 'Aby uchronić się przed automatami wprowadzającymi spam, proszę wybrać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
+	'asirra-addurl' => 'Wprowadzony przez ciebie tekst zawiera linki zewnętrzne. Aby uchronić nas przed automatycznym spamem, proszę wskazać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
+	'asirra-badlogin' => 'Aby uchronić się przed zautomatyzowanym łamaniem haseł, proszę wybrać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
+	'asirra-createaccount' => 'Aby uchronić się przed automatycznym tworzeniem kont, proszę wybrać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
 	'asirra-createaccount-fail' => 'Prosimy prawidłowo zidentyfikować koty.',
-	'asirra-create' => 'Aby uchronić się przed automatycznym tworzeniem stron, proszę wybrać tylko zdjęcia kotów w poniższym polu:',
+	'asirra-create' => 'Aby uchronić się przed automatycznym tworzeniem stron, proszę wybrać tylko zdjęcia kotów w poniższym polu:', # Fuzzy
 	'asirra-nojs' => "'''Prosimy włączyć obsługę języka JavaScript i ponowne przesłanie strony.'''",
 	'asirra-failed' => 'Prosimy wskazać wszystkie obrazy kotów',
 );
@@ -380,27 +392,28 @@ $messages['pl'] = array(
  */
 $messages['pms'] = array(
 	'asirra-desc' => 'Mòdul Asirra për ConfirmEdit',
-	'asirra-edit' => "Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:",
-	'asirra-addurl' => "Soa modìfica a conten dle liure esterne neuve. Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:",
-	'asirra-badpass' => "Për giuté a protege contra la forsadura automatisà ëd le ciav, për piasì ch'a selession-a mach la fòto dël gat ant ël quàder sì-sota:",
-	'asirra-createaccount' => "Për giuté a protege contra la creassion automatisà ëd cont, për piasì ch'a selession-a mach la fòto dël gat ant ël quàder sì-sota:",
+	'asirra-edit' => "Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:", # Fuzzy
+	'asirra-addurl' => "Soa modìfica a conten dle liure esterne neuve. Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:", # Fuzzy
+	'asirra-badlogin' => "Për giuté a protege contra la forsadura automatisà ëd le ciav, për piasì ch'a selession-a mach la fòto dël gat ant ël quàder sì-sota:", # Fuzzy
+	'asirra-createaccount' => "Për giuté a protege contra la creassion automatisà ëd cont, për piasì ch'a selession-a mach la fòto dël gat ant ël quàder sì-sota:", # Fuzzy
 	'asirra-createaccount-fail' => 'Për piasì identifica coretament ij gat.',
-	'asirra-create' => "Për giuté a protege contra la creassion automatisà ëd pàgine, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:",
+	'asirra-create' => "Për giuté a protege contra la creassion automatisà ëd pàgine, për piasì ch'a selession-a mach le fòto ëd gat ant ël quàder sì-sota:", # Fuzzy
 	'asirra-nojs' => "'''Për piasì, ch'a abìlita JavaScript e ch'a spedissa torna la pàgina.'''",
 	'asirra-failed' => 'Për piasì identìfica tute le figure ëd gat',
 );
 
 /** Portuguese (português)
  * @author Hamilton Abreu
+ * @author Luckas
  */
 $messages['pt'] = array(
 	'asirra-desc' => 'Módulo Asirra para o ConfirmEdit',
-	'asirra-edit' => "Como prevenção contra sistemas automatizados de inserção de ''spam'', seleccione só as fotografias de gatos na caixa abaixo:",
-	'asirra-addurl' => "A sua edição contém links externos novos. Como prevenção contra sistemas automatizados de inserção de ''spam'', seleccione só as fotografias de gatos na caixa abaixo:",
-	'asirra-badpass' => 'Como prevenção com sistemas automatizados de descoberta de palavras-chave, seleccione só as fotografias de gatos na caixa abaixo:',
-	'asirra-createaccount' => 'Como prevenção contra sistemas automatizados de criação de contas, seleccione só as fotografias de gatos na caixa abaixo:',
-	'asirra-createaccount-fail' => 'Identifique correctamente os gatos, por favor.',
-	'asirra-create' => 'Como prevenção contra sistemas automatizados de criação de páginas, seleccione só as fotografias de gatos na caixa abaixo:',
+	'asirra-edit' => "Como prevenção contra sistemas automatizados de inserção de ''spam'', selecione só as fotografias de gatos na caixa abaixo:", # Fuzzy
+	'asirra-addurl' => "A sua edição contém links externos novos. Como prevenção contra sistemas automatizados de inserção de ''spam'', selecione só as fotografias de gatos na caixa abaixo:", # Fuzzy
+	'asirra-badlogin' => 'Como prevenção com sistemas automatizados de descoberta de palavras-chave, selecione só as fotografias de gatos na caixa abaixo:', # Fuzzy
+	'asirra-createaccount' => 'Como prevenção contra sistemas automatizados de criação de contas, selecione só as fotografias de gatos na caixa abaixo:', # Fuzzy
+	'asirra-createaccount-fail' => 'Identifique corretamente os gatos, por favor.',
+	'asirra-create' => 'Como prevenção contra sistemas automatizados de criação de páginas, selecione só as fotografias de gatos na caixa abaixo:', # Fuzzy
 	'asirra-nojs' => "'''Possibilite o uso de JavaScript e reenvie a página, por favor.'''",
 );
 
@@ -409,21 +422,29 @@ $messages['pt'] = array(
  */
 $messages['roa-tara'] = array(
 	'asirra-desc' => 'Module Asirra pe confermà le cangiaminde',
+	'asirra-edit' => "Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scacchie ìa categorije de le fote jndr'à buatte aqquà sotte:", # Fuzzy
+	'asirra-addurl' => "Le cangiaminde tune 'ngludone collegaminde de fore nuève. Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scacchie 'a categorije d'a fote 'ndruche jndr'à buatte aqquà sotte:", # Fuzzy
+	'asirra-badlogin' => "Pe darne 'na màne a proteggere condre le futteminde automatece de le passuord, pe piacere scacchie 'a categorije de le fote jndr'à buatte aqquà sotte:", # Fuzzy
+	'asirra-createaccount' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le cunde, pe piacere scacchie 'a categorije de le fote jndr'à buatte aqquà sotte:", # Fuzzy
 	'asirra-createaccount-fail' => 'Pe piacere idendifiche correttamende le categorije.',
+	'asirra-create' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le pàggene, pe piacere scacchie 'a categorije de le fote jndr'à buatte aqquà sotte:", # Fuzzy
+	'asirra-nojs' => "'''Pe piacere abbilite JavaScript e conferme arrete 'a pàgene.'''",
 	'asirra-failed' => 'Pe piacere idendifiche tutte le categorije de le immaggine',
 );
 
 /** Russian (русский)
  * @author DCamer
+ * @author Lockal
+ * @author Okras
  */
 $messages['ru'] = array(
 	'asirra-desc' => 'Модуль Asirra для ConfirmEdit',
-	'asirra-edit' => 'В целях защиты от автоматического спама в правках, пожалуйста, выберите фотографии кота, которые вы видите ниже:',
-	'asirra-addurl' => 'Ваша правка содержит новые внешние ссылки. В целях защиты от автоматического спама, пожалуйста, выберите фотографии кота, которые вы видите ниже:',
-	'asirra-badpass' => 'В целях защиты от автоматического подбора пароля, пожалуйста, выберите фотографии кота, которые вы видите ниже:',
-	'asirra-createaccount' => 'В целях защиты от автоматического создания учётных записей, пожалуйста, выберите фотографии кота, которые вы видите ниже:',
+	'asirra-edit' => 'В целях защиты проекта от автоматического спама в правках, просим вас выбрать среди нижеприведённых изображений только фотографии кошек:',
+	'asirra-addurl' => 'Ваша правка содержит новые внешние ссылки. В целях защиты проекта от автоматического спама в правках просим вас выбрать среди нижеприведённых изображений только фотографии кошек:',
+	'asirra-badlogin' => 'В целях защиты от автоматического подбора пароля просим вас выбрать среди нижеприведённых изображений только фотографии кошек:',
+	'asirra-createaccount' => 'В целях защиты от автоматического создания учётных записей просим вас выбрать среди нижеприведённых изображений только фотографии кошек:',
 	'asirra-createaccount-fail' => 'Пожалуйста правильно идентифицируйте котов.',
-	'asirra-create' => 'В целях защиты от автоматического создания страниц, пожалуйста, выберите фотографии кота, которые вы видите ниже:',
+	'asirra-create' => 'В целях защиты от автоматического создания страниц просим вас выбрать среди нижеприведённых изображений только фотографии кошек:',
 	'asirra-nojs' => "'''Пожалуйста, включите JavaScript и обновите страницу.'''",
 	'asirra-failed' => 'Пожалуйста, идентифицируйте все фотографии кота',
 );
@@ -437,9 +458,17 @@ $messages['si'] = array(
 );
 
 /** Swedish (svenska)
+ * @author Jopparn
+ * @author Rotsee
  * @author WikiPhoenix
  */
 $messages['sv'] = array(
+	'asirra-edit' => 'För att skydda wikin mot spam ber vi dig att markera de fotografier som föreställer katter i rutan nedan:',
+	'asirra-addurl' => 'Din redigering innehåller nya externa länkar. För att skydda wikin mot automatiserat redigerings-spam ber vi dig att endast markera fotografierna på katter i rutan nedan:',
+	'asirra-badlogin' => 'För att skydda wikin mot automatiserade försök att knäcka lösenord ber vi dig att endast markera fotografierna på katter i rutan nedan:',
+	'asirra-createaccount' => 'För att skydda wikin mot automatiserat kontoskapande ber vi dig att endast markera fotografierna på katter i rutan nedan:',
+	'asirra-create' => 'För att skydda wikin mot automatiserat sidskapande ber vi dig att endast markera fotografierna på katter i rutan nedan:',
+	'asirra-nojs' => "'''Var god aktivera JavaScript och hämta sidan igen.'''",
 	'asirra-failed' => 'Var god identifiera alla kattbilder',
 );
 
@@ -448,27 +477,28 @@ $messages['sv'] = array(
  */
 $messages['tl'] = array(
 	'asirra-desc' => 'Modyul ng Asirra para sa ConfirmEdit',
-	'asirra-edit' => 'Upang makatulong sa pagprutekta laban sa kusang basurang pamamatnugot, paki piliin iyong mga litrato lamang ng pusa na nasa loob ng kahong nasa ibaba:',
-	'asirra-addurl' => 'Ang pagbabago mo ay nagsasama ng bagong panlabas na mga kawing.  Upang makatulong sa pagprutekta laban sa kusang paglusob ng basurang-liham, paki piliin  iyong mga litrato lamang ng pusa na nasa loob ng kahong nasa ibaba:',
-	'asirra-badpass' => 'Upang makatulong sa pagprutekta laban sa kusang pag-alam ng hudyat, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:',
-	'asirra-createaccount' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng akawnt, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:',
+	'asirra-edit' => 'Upang makatulong sa pagprutekta laban sa kusang basurang pamamatnugot, paki piliin iyong mga litrato lamang ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
+	'asirra-addurl' => 'Ang pagbabago mo ay nagsasama ng bagong panlabas na mga kawing.  Upang makatulong sa pagprutekta laban sa kusang paglusob ng basurang-liham, paki piliin  iyong mga litrato lamang ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
+	'asirra-badlogin' => 'Upang makatulong sa pagprutekta laban sa kusang pag-alam ng hudyat, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
+	'asirra-createaccount' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng akawnt, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
 	'asirra-createaccount-fail' => 'Paki kilalanin ng tama ang mga pusa.',
-	'asirra-create' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng pahina, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:',
+	'asirra-create' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng pahina, paki piliin lamang iyong mga litrato ng pusa na nasa loob ng kahong nasa ibaba:', # Fuzzy
 	'asirra-nojs' => "'''Paki paganahin ang JavaScript at muling ipasa ang pahina.'''",
 	'asirra-failed' => 'Paki kilalanin ang lahat ng mga imahe ng pusa',
 );
 
 /** Ukrainian (українська)
+ * @author Andriykopanytsia
  * @author Base
  */
 $messages['uk'] = array(
 	'asirra-desc' => 'Модуль Asirra для ConfirmEdit',
-	'asirra-edit' => 'З метою захисту проти автоматичного спаму у статтях, будь ласка оберіть фотографії кота, у блоці нижче:',
-	'asirra-addurl' => 'Ваше повідомлення включає нові зовнішні посилання. З метою захисту проти автоматичного спаму у статтях, будь ласка оберіть фотографії кота, у блоці нижче:',
-	'asirra-badpass' => 'З метою захисту проти автоматичного підбору паролю, будь ласка оберіть фотографії кота, у блоці нижче:',
-	'asirra-createaccount' => 'З метою захисту проти автоматичного створення облікових записів, будь ласка оберіть фотографії кота, у блоці нижче:',
+	'asirra-edit' => 'З метою захисту вікі від автоматичного спаму у статтях, просимо вас обрати фотографії кота, у блоці нижче:',
+	'asirra-addurl' => 'Ваше повідомлення включає нові зовнішні посилання. З метою захисту вікі проти автоматичного спаму у статтях, просимо вас обрати фотографії кота, у блоці нижче:',
+	'asirra-badlogin' => 'З метою захисту вікі проти автоматичного підбору паролю, просимо вас обрати фотографії кота у блоці нижче:',
+	'asirra-createaccount' => 'З метою захисту вікі проти автоматичного створення облікових записів просимо вас обрати фотографії кота у блоці нижче:',
 	'asirra-createaccount-fail' => 'Будь ласка, правильно ідентифікуйте котів.',
-	'asirra-create' => 'З метою захисту проти автоматичного створення статей, будь ласка оберіть фотографії кота, у блоці нижче:',
+	'asirra-create' => 'З метою захисту вікі проти автоматичного створення статей просимо вас обрати фотографії кота у блоці нижче:',
 	'asirra-nojs' => "'''Будь ласка увімкніть JavaScript і оновіть сторінку.'''",
 	'asirra-failed' => 'Будь ласка, ідентифікуйте усі фотографії кота',
 );
@@ -478,25 +508,26 @@ $messages['uk'] = array(
  */
 $messages['wa'] = array(
 	'asirra-desc' => "Module Asirra pol passete d' acertinaedje des candjmints (ConfirmEdit)",
-	'asirra-edit' => "Po s' mete a houte des des robots di spam, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:",
+	'asirra-edit' => "Po s' mete a houte des des robots di spam, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
 	'asirra-addurl' => "Dins vos candjmints i gn a des dfoûtrinnès hårdêyes (URL).
-Po s' mete a houte des des robots di spam, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:",
-	'asirra-badpass' => "Po s' mete a houte des des robots ki sayèt d' adviner les screts, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:",
-	'asirra-createaccount' => "Po s' mete a houte des des robots k' ahivèt des contes otomaticmint, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:",
+Po s' mete a houte des des robots di spam, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
+	'asirra-badlogin' => "Po s' mete a houte des des robots ki sayèt d' adviner les screts, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
+	'asirra-createaccount' => "Po s' mete a houte des des robots k' ahivèt des contes otomaticmint, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
 	'asirra-createaccount-fail' => 'Tchoezixhoz comifåt les tchets (les biesses ki gnawèt).',
-	'asirra-create' => "Po s' mete a houte des des robots k' ahivèt des pådjes otomaticmint, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:",
+	'asirra-create' => "Po s' mete a houte des des robots k' ahivèt des pådjes otomaticmint, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tchoezixhoz seulmint les imådjes avou des tchets e l' boesse chal pa dzo:", # Fuzzy
 	'asirra-nojs' => "'''Metoz s' i vs plait en alaedje li JavaScrit et s' revoyî l' pådje.'''",
 	'asirra-failed' => 'Idintifyî totes les imådjes avou des tchets',
 );
 
 /** Simplified Chinese (中文（简体）‎)
+ * @author Fantasticfears
  * @author Hzy980512
  */
 $messages['zh-hans'] = array(
 	'asirra-desc' => 'ConfirmEdit的Asirra模块',
 	'asirra-edit' => '为了防止垃圾编辑攻击，请在下面的方框中选出猫的图片：',
-	'asirra-addurl' => '您的编辑包含新的外部链接。为了帮助防止自动垃圾邮件，请在下面的方框中选出猫的图片：',
-	'asirra-badpass' => '为防止自动程序破解密码，请在下面的方框中选出猫的图片：',
+	'asirra-addurl' => '您的编辑包含新的外部链接。为了帮助防止垃圾编辑攻击，请在下面的方框中选出猫的图片：',
+	'asirra-badlogin' => '为防止自动程序破解密码，请在下面的方框中选出猫的图片：',
 	'asirra-createaccount' => '为了防止自动程序创建帐户，请在下面的方框中选出猫的图片：',
 	'asirra-createaccount-fail' => '请正确辨认出猫的图片。',
 	'asirra-create' => '为了防止自动程序创建页面，请在下面的方框中选出猫的图片：',
@@ -508,12 +539,12 @@ $messages['zh-hans'] = array(
  */
 $messages['zh-hant'] = array(
 	'asirra-desc' => 'ConfirmEdit的Asirra模塊',
-	'asirra-edit' => '為了防止垃圾編輯攻擊，請在下面的方框中選出貓的圖片：',
-	'asirra-addurl' => '您的編輯包含新的外部鏈接。為了幫助防止自動垃圾郵件，請在下面的方框中選出貓的圖片：',
-	'asirra-badpass' => '為防止自動程序破解密碼，請在下面的方框中選出貓的圖片：',
-	'asirra-createaccount' => '為了防止自動程序創建帳戶，請在下面的方框中選出貓的圖片：',
+	'asirra-edit' => '為了防止垃圾編輯攻擊，請在下面的方框中選出貓的圖片：', # Fuzzy
+	'asirra-addurl' => '您的編輯包含新的外部鏈接。為了幫助防止自動垃圾郵件，請在下面的方框中選出貓的圖片：', # Fuzzy
+	'asirra-badlogin' => '為防止自動程序破解密碼，請在下面的方框中選出貓的圖片：', # Fuzzy
+	'asirra-createaccount' => '為了防止自動程序創建帳戶，請在下面的方框中選出貓的圖片：', # Fuzzy
 	'asirra-createaccount-fail' => '請正確辨認出貓的圖片。',
-	'asirra-create' => '為了防止自動程序創建頁面，請在下面的方框中選出貓的圖片：',
+	'asirra-create' => '為了防止自動程序創建頁面，請在下面的方框中選出貓的圖片：', # Fuzzy
 	'asirra-nojs' => "'''請啟動JavaScript後再提交頁面。'''",
 	'asirra-failed' => '請選出所有貓的圖片',
 );
diff --git a/extensions/ConfirmEdit/Captcha.php b/extensions/ConfirmEdit/Captcha.php
index 9967dd47..b15de61f 100644
--- a/extensions/ConfirmEdit/Captcha.php
+++ b/extensions/ConfirmEdit/Captcha.php
@@ -42,6 +42,7 @@ class SimpleCaptcha {
 			Xml::element( 'input', array(
 				'name' => 'wpCaptchaWord',
 				'id'   => 'wpCaptchaWord',
+				'size'  => 5,
 				'autocomplete' => 'off',
 				'tabindex' => 1 ) ) . // tab in before the edit textarea
 			"</p>\n" .
@@ -354,26 +355,38 @@ class SimpleCaptcha {
 	 */
 	function filterLink( $url ) {
 		global $wgCaptchaWhitelist;
-		$source = wfMessage( 'captcha-addurl-whitelist' )->inContentLanguage()->text();
+		static $regexes = null;
 
-		$whitelist = wfMessage( 'captcha-addurl-whitelist', $source )->isDisabled()
-			? false
-			: $this->buildRegexes( explode( "\n", $source ) );
+		if ( $regexes === null ) {
+			$source = wfMessage( 'captcha-addurl-whitelist' )->inContentLanguage();
 
-		$cwl = $wgCaptchaWhitelist !== false ? preg_match( $wgCaptchaWhitelist, $url ) : false;
-		$wl  = $whitelist          !== false ? preg_match( $whitelist, $url )          : false;
+			$regexes = $source->isDisabled()
+				? array()
+				: $this->buildRegexes( explode( "\n", $source->plain() ) );
 
-		return !( $cwl || $wl );
+			if ( $wgCaptchaWhitelist !== false ) {
+				array_unshift( $regexes, $wgCaptchaWhitelist );
+			}
+		}
+
+		foreach ( $regexes as $regex ) {
+			if ( preg_match( $regex, $url ) ) {
+				return false;
+			}
+		}
+
+		return true;
 	}
 
 	/**
 	 * Build regex from whitelist
 	 * @param $lines string from [[MediaWiki:Captcha-addurl-whitelist]]
-	 * @return string Regex or bool false if whitelist is empty
+	 * @return array Regexes
 	 * @access private
 	 */
 	function buildRegexes( $lines ) {
 		# Code duplicated from the SpamBlacklist extension (r19197)
+		# and later modified.
 
 		# Strip comments and whitespace, then remove blanks
 		$lines = array_filter( array_map( 'trim', preg_replace( '/#.*$/', '', $lines ) ) );
@@ -381,34 +394,59 @@ class SimpleCaptcha {
 		# No lines, don't make a regex which will match everything
 		if ( count( $lines ) == 0 ) {
 			wfDebug( "No lines\n" );
-			return false;
+			return array();
 		} else {
 			# Make regex
 			# It's faster using the S modifier even though it will usually only be run once
 			// $regex = 'http://+[a-z0-9_\-.]*(' . implode( '|', $lines ) . ')';
 			// return '/' . str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $regex) ) . '/Si';
-			$regexes = '';
-			$regexStart = '/^https?:\/\/+[a-z0-9_\-.]*(';
-			$regexEnd = ')/Si';
+			$regexes = array();
+			$regexStart = array(
+				'normal' => '/^https?:\/\/+[a-z0-9_\-.]*(?:',
+				'noprotocol' => '/^(?:',
+			);
+			$regexEnd = array(
+				'normal' => ')/Si',
+				'noprotocol' => ')/Si',
+			);
 			$regexMax = 4096;
-			$build = false;
+			$build = array();
 			foreach ( $lines as $line ) {
+				# Extract flags from the line
+				$options = array();
+				if ( preg_match( '/^(.*?)\s*<([^<>]*)>$/', $line, $matches ) ) {
+					if ( $matches[1] === '' ) {
+						wfDebug( "Line with empty regex\n" );
+						continue;
+					}
+					$line = $matches[1];
+					$opts = preg_split( '/\s*\|\s*/', trim( $matches[2] ) );
+					foreach ( $opts as $opt ) {
+						$opt = strtolower( $opt );
+						if ( $opt == 'noprotocol' ) {
+							$options['noprotocol'] = true;
+						}
+					}
+				}
+
+				$key = isset( $options['noprotocol'] ) ? 'noprotocol' : 'normal';
+
 				// FIXME: not very robust size check, but should work. :)
-				if ( $build === false ) {
-					$build = $line;
-				} elseif ( strlen( $build ) + strlen( $line ) > $regexMax ) {
-					$regexes .= $regexStart .
-						str_replace( '/', '\/', preg_replace( '|\\\*/|', '/', $build ) ) .
-						$regexEnd;
-					$build = $line;
+				if ( !isset( $build[$key] ) ) {
+					$build[$key] = $line;
+				} elseif ( strlen( $build[$key] ) + strlen( $line ) > $regexMax ) {
+					$regexes[] = $regexStart[$key] .
+						str_replace( '/', '\/', preg_replace( '|\\\*/|', '/', $build[$key] ) ) .
+						$regexEnd[$key];
+					$build[$key] = $line;
 				} else {
-					$build .= '|' . $line;
+					$build[$key] .= '|' . $line;
 				}
 			}
-			if ( $build !== false ) {
-				$regexes .= $regexStart .
-					str_replace( '/', '\/', preg_replace( '|\\\*/|', '/', $build ) ) .
-					$regexEnd;
+			foreach ( $build as $key => $value ) {
+				$regexes[] = $regexStart[$key] .
+					str_replace( '/', '\/', preg_replace( '|\\\*/|', '/', $build[$key] ) ) .
+					$regexEnd[$key];
 			}
 			return $regexes;
 		}
diff --git a/extensions/ConfirmEdit/ConfirmEdit.alias.php b/extensions/ConfirmEdit/ConfirmEdit.alias.php
index 763d75c6..a9d1288c 100644
--- a/extensions/ConfirmEdit/ConfirmEdit.alias.php
+++ b/extensions/ConfirmEdit/ConfirmEdit.alias.php
@@ -5,6 +5,7 @@
  * @file
  * @ingroup Extensions
  */
+// @codingStandardsIgnoreFile
 
 $specialPageAliases = array();
 
@@ -23,9 +24,14 @@ $specialPageAliases['arz'] = array(
 	'Captcha' => array( 'كابتشا' ),
 );
 
+/** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄) */
+$specialPageAliases['cdo'] = array(
+	'Captcha' => array( '驗證碼' ),
+);
+
 /** Zazaki (Zazaki) */
 $specialPageAliases['diq'] = array(
-	'Captcha' => array( 'Qodaİtimadi' ),
+	'Captcha' => array( 'Kodaİtimadi' ),
 );
 
 /** Esperanto (Esperanto) */
diff --git a/extensions/ConfirmEdit/ConfirmEdit.i18n.php b/extensions/ConfirmEdit/ConfirmEdit.i18n.php
index 1c6421f0..f9f82efc 100644
--- a/extensions/ConfirmEdit/ConfirmEdit.i18n.php
+++ b/extensions/ConfirmEdit/ConfirmEdit.i18n.php
@@ -20,7 +20,7 @@ To protect the wiki against automated spam, we kindly ask you to solve the simpl
 	'captcha-create'             => 'To create the page, please solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
 	'captcha-sendemail'          => 'To protect the wiki against automated spamming, we kindly ask you to solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
 	'captcha-sendemail-fail'     => 'Incorrect or missing confirmation code.',
-	'captcha-disabledinapi'      => 'This action requires a captcha, so it cannot be performed through the API.',
+	'captcha-disabledinapi'      => 'This action requires a CAPTCHA, so it cannot be performed through the API.',
 	'captchahelp-title'          => 'CAPTCHA help',
 	'captchahelp-cookies-needed' => 'You will need to have cookies enabled in your browser for this to work.',
 	'captchahelp-text'           => "Web sites that accept postings from the public, like this wiki, are often abused by spammers who use automated tools to post their links to many sites.
@@ -31,7 +31,7 @@ Since this is a task that's hard to automate, it will allow most real humans to
 
 Unfortunately this may inconvenience users with limited vision or using text-based or speech-based browsers.
 At the moment we do not have an audio alternative available.
-Please contact the  [[{{MediaWiki:Grouppage-sysop}}|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate actions.
+Please contact the [[Special:ListAdmins|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate actions.
 
 Hit the \"back\" button in your browser to return to the page editor.",
 	'captcha-addurl-whitelist'   => ' #<!-- leave this line exactly as it is --> <pre>
@@ -84,7 +84,13 @@ See also:
 This message follows the following help message:
 * {{msg-mw|Captchahelp-text}}.',
 	'captchahelp-text' => 'This is the help text shown on [[Special:Captcha/help]].',
-	'captcha-addurl-whitelist' => "See also: [[MediaWiki:Spam-blacklist]] and [[MediaWiki:Spam-whitelist]]. Leave all the wiki markup, including the spaces, as is. You can translate the text, including 'Leave this line exactly as it is'. The first line of this messages has one (1) leading space.",
+	'captcha-addurl-whitelist' => 'See also: [[MediaWiki:Spam-blacklist]] and [[MediaWiki:Spam-whitelist]].
+
+Leave all the wiki markup, including the spaces, as is.
+You can translate the text, including \'Leave this line exactly as it is\'.
+The first line of this messages has one (1) leading space.
+
+"regex" stands for "regular expression".',
 	'right-skipcaptcha' => '{{doc-right|skipcaptcha}}',
 );
 
@@ -111,7 +117,7 @@ As beskerming teen outomatiese gemorsbydraes, sal u die woorde wat onder verskyn
 
 In party gevalle, veral as u skakels by 'n blad voeg, sal die wiki dalk 'n beeld met verwronge teks vertoon en vra dat u die woorde daarin intik. Omdat hierdie taak moeilik geoutomatiseer word, laat dit meeste regte mense toe om bydraes te maak terwyl dit meeste kwaaddoeners stop.
 
-Hierdie kan ongelukkig lastig wees vir mense met beperkte sig, of diegene wat teks- of spraakgebaseerde blaaiers gebruik. Tans is daar nog nie 'n klankalternatief beskikbaar nie. Kontak asseblief die [[{{MediaWiki:Grouppage-sysop}}|werfadministrateurs]] vir hulp as hierdie u onverwags belemmer om legitieme bydraes te maak.
+Hierdie kan ongelukkig lastig wees vir mense met beperkte sig, of diegene wat teks- of spraakgebaseerde blaaiers gebruik. Tans is daar nog nie 'n klankalternatief beskikbaar nie. Kontak asseblief die [[Special:ListAdmins|werfadministrateurs]] vir hulp as hierdie u onverwags belemmer om legitieme bydraes te maak.
 
 Gebruik die \"terug\"-knoppie van u blaaier om na die vorige blad terug te keer.",
 	'right-skipcaptcha' => 'Captcha-handelinge uitvoer sonder om die captcha te hoef oplos',
@@ -178,7 +184,7 @@ $messages['an'] = array(
 
 Bellas vegadas, especialment quan se mire de adhibir nuevos vinclos a una pachina, o wiki talment le amuestre una imachen con testo en color y distorsionato, y le pregunte quáls son as parolas amostratas. Como ista ye una fayena de mal automatizar, premitirá a os usuarios humanos fer as suyas edicions de vez que aturará a muitos spammers y atacants automaticos.
 
-Manimenos, isto puede estar un barrache ta usuarios con visión limitata u que faigan ser navegadors basatos en texto u en a voz. Por l'inte no tenemos garra alternativa de audio. Por favor, contacte con os [[{{MediaWiki:Grouppage-sysop}}|administradors]] d'o wiki ta demandar aduya si isto le ye privando de fer as suyas edicions lechitimas.
+Manimenos, isto puede estar un barrache ta usuarios con visión limitata u que faigan ser navegadors basatos en texto u en a voz. Por l'inte no tenemos garra alternativa de audio. Por favor, contacte con os [[Special:ListAdmins|administradors]] d'o wiki ta demandar aduya si isto le ye privando de fer as suyas edicions lechitimas.
 
 Punche o botón 'enta zaga' d'o suyo navegador ta tornar ta l'editor de pachinas.",
 	'captcha-addurl-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
@@ -223,7 +229,7 @@ $messages['ar'] = array(
 
 للأسف سيكون هذا صعبا بالنسبة لمستخدمي المتصفحات المحدودة أو التي تعتمد على النصوص فقط أو قراءة النصوص.
 في الوقت الحالي لا يوجد لدينا بديل سمعي.
-من فضلك راسل [[{{MediaWiki:Grouppage-sysop}}|إداريي الموقع]] للمساعدة إذا كان هذا الأمر يمنعك من التعديل ووضع وصلات قانونية.
+من فضلك راسل [[Special:ListAdmins|إداريي الموقع]] للمساعدة إذا كان هذا الأمر يمنعك من التعديل ووضع وصلات قانونية.
 
 إذا كنت تحرر صفحة معينة: اضغط زر 'العودة' في متصفحك للعودة إلى التحرير.",
 	'captcha-addurl-whitelist' => ' #<!-- اترك هذا السطر تماما كما هو --> <pre>
@@ -258,7 +264,7 @@ $messages['arz'] = array(
 
 للاسف،دا ممكن يسبب ازعاج لليوزرو اللى نظرهم ضعيف او اللى بيستعملو براوز معتمد على الكلام او النصوص.
 فى الوقت الحالى احنا ما عندناش اى بديل سمعى متوافر.
-لو سمحت تتصل [[{{MediaWiki:Grouppage-sysop}}|بلاداريين]] بتوع الموقع علشان يساعدوك لو دا منعك بشكل مش متوقع من انك تشارك بشكل قانونى.
+لو سمحت تتصل [[Special:ListAdmins|بلاداريين]] بتوع الموقع علشان يساعدوك لو دا منعك بشكل مش متوقع من انك تشارك بشكل قانونى.
 
 دوس على زرار 'back'اللى فى البراوزر بتاعك علشان ترجع لتحرير الصفحة.",
 	'captcha-addurl-whitelist' => ' #<!-- سيب السطر دا زى ما هو كدا بالظبط--> <pre>
@@ -269,7 +275,7 @@ $messages['arz'] = array(
 	'right-skipcaptcha' => 'عمل حاجات بتنشط الكابتشا من غير ما تضطر تمر بالكابتشا',
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Bishnu Saikia
  * @author Chaipau
  * @author Gitartha.bordoloi
@@ -302,7 +308,7 @@ $messages['as'] = array(
 
 দুৰ্ভাগ্যক্ৰমে, সীমিত দৃষ্টিশক্তি থকা ব্যক্তিসকলে, বা পাঠ্য-আধাৰিত অথবা ধ্বনি-আধাৰিত ব্ৰাউজাৰ ব্যৱহাৰ কৰা ব্যক্তিসকলে ইয়াৰ পৰা অসুবিধা পাব পাৰে।
 এই সময়ত ইয়াৰ কোনো ধ্বনি-আধাৰিত বিকল্প আমাৰ হাতত নাই।
-ইয়াৰ বাবে যদি আপুনি যুক্তিসন্মত পাঠ্য ভৰাবলৈ অসুবিধা পাইছে, তেনেহলে [[{{MediaWiki:Grouppage-sysop}}|চাইট প্ৰশাসকৰ]] লগত যোগাযোগ কৰক।
+ইয়াৰ বাবে যদি আপুনি যুক্তিসন্মত পাঠ্য ভৰাবলৈ অসুবিধা পাইছে, তেনেহলে [[Special:ListAdmins|চাইট প্ৰশাসকৰ]] লগত যোগাযোগ কৰক।
 
 পৃষ্ঠা সম্পাদনালৈ ঘূৰি যাবলৈ আপোনাৰ ব্ৰাউজাৰৰ 'back' বুটামত টিপা মাৰক।",
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -337,7 +343,7 @@ Mientres qu'estos enllaces de puxarra puen desaniciase, son enforma cafiantes.
 Dacuando, especialmente al amestar nuevos enllaces web nuna páxina, la wiki pue amosate una imaxe de testu coloreáu o distorsionáu y va pidite qu'escribas les pallabres que s'amuesen.
 Yá qu'esti ye un llabor difícil d'automatizar, permitirá a les más de les persones reales unviar los sos testos, al empar que llenden los más de los spammers y otros atacantes automáticos.
 
-Por desgracia, esto pue ser un inconveniente pa los usuarios con visión llimitada o qu'usen navegadores de testu o voz. De momentu nun tenemos disponible una alternativa de soníu. Por favor, ponte'n contautu colos [[{{MediaWiki:Grouppage-sysop}}|alministradores del sitiu]] pa pidir ayuda si esto te torgare facer ediciones llexítimes.
+Por desgracia, esto pue ser un inconveniente pa los usuarios con visión llimitada o qu'usen navegadores de testu o voz. De momentu nun tenemos disponible una alternativa de soníu. Por favor, ponte'n contautu colos [[Special:ListAdmins|alministradores del sitiu]] pa pidir ayuda si esto te torgare facer ediciones llexítimes.
 
 Calca nel botón 'atrás' del to navegador pa volver a la páxina d'edición.",
 	'captcha-addurl-whitelist' => ' #<!-- dexa esta llinia exautamente como ta --> <pre>
@@ -364,15 +370,16 @@ $messages['azb'] = array(
 
 /** Bashkir (башҡортса)
  * @author Assele
+ * @author Рустам Нурыев
  * @author ҒатаУлла
  */
 $messages['ba'] = array(
 	'captcha-edit' => 'Был битте мөхәррирләү өсөн, зинһар, ябай мәсьәләне сисегеҙ һәм яуабын түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
-	'captcha-desc' => 'Спамдан һәм паролде яратыуҙан һаҡлау өсөн CAPTCHA ысулдары менән тәьмин итә',
+	'captcha-desc' => 'Спамдан һәм серһүҙҙе һайлып алыуҙан һаҡланыу өсөн CAPTCHA ысулдары менән тәьмин итә',
 	'captcha-label' => 'CAPTCHA',
 	'captcha-addurl' => 'Һеҙҙең текстығыҙҙа яңы тышҡы һылтанмалар бар.
 Автоматик спамдан һаҡлау маҡсатында, зинһар, ябай мәсьәләне сисегеҙ һәм яуабын түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
-	'captcha-badlogin' => 'Паролде автоматик ватыуҙан һаҡлау маҡсатында, зинһар, ябай мәсьәләне сисегеҙ һәм яуабын түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
+	'captcha-badlogin' => 'Серһүҙҙе автоматик ватыуҙан һаҡлау маҡсатында, зинһар, ябай мәсьәләне сисегеҙ һәм яуабын түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
 	'captcha-createaccount' => 'Иҫәп яҙмаларын автоматик булдырыуҙан һаҡлау маҡсатында, зинһар, ябай мәсьәләне сисегеҙ һәм яуабын түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
 	'captcha-createaccount-fail' => 'Раҫлау коды керетелмәгән йәки дөрөҫ түгел.',
 	'captcha-create' => 'Яңы бит булдырыу өсөн, зинһар, ябай мәсьәләне сисегеҙ һәм яуабын түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
@@ -388,7 +395,7 @@ $messages['ba'] = array(
 
 Үкенескә ҡаршы, бындай һаҡлыҡ саралары күҙҙәре насар күреүсе кешеләргә йәки текстлы йәки уҡыусы браузерҙар ҡулланған кешеләргә уңайһыҙлыҡ килтереүе мөмкин.
 Әлеге ваҡытта беҙҙең бындай тикшереүҙе тауыш менән алыштырыу мөмкинлеге юҡ.
-Зинһар, әгәр бындай тикшереү һеҙгә сайтта намыҫ менән эшләргә ҡамасаулаһа, [[{{MediaWiki:Grouppage-sysop}}|хәкимдәргә]] мөрәжәғәт итегеҙ.
+Зинһар, әгәр бындай тикшереү һеҙгә сайтта намыҫ менән эшләргә ҡамасаулаһа, [[Special:ListAdmins|хәкимдәргә]] мөрәжәғәт итегеҙ.
 
 Мөхәррирләүгә кире ҡайтыу өсөн, браузерығыҙҙа кире ҡайтыу төймәһенә баҫығыҙ.',
 	'captcha-addurl-whitelist' => '#<!-- leave this line exactly as it is --> <pre>
@@ -433,10 +440,38 @@ $messages['bcc'] = array(
 
 /** Bikol Central (Bikol Central)
  * @author Filipinayzd
+ * @author Geopoet
  */
 $messages['bcl'] = array(
-	'captcha-create' => 'Tangarig maggibo an pahina, paki simbagan an simpleng suma sa ibaba asin ikaag an simbag sa laog kan kahon ([[Special:Captcha/help|more info]]):',
+	'captcha-edit' => 'Sa pagliwat kaining pahina, pakisimbag an simplehong sumada sa ibaba asin pakikaag an simbag sa laog nin kahon ([[Special:Captcha/help|more info]]):',
+	'captcha-desc' => 'Minatao nin mga tekniko para sa CAPTCHA tanganing protektaran kontra sa espam asin pagtutuod kan pasa-taramon',
+	'captcha-label' => 'CAPTCHA',
+	'captcha-addurl' => 'An saimong pagliwat minabale nin baguhong panluwas na mga kasugpunan.
+Tanganing protektaran an wiki kontra sa awtomatikong espam, kami tabi minahagad saimo na simbagan an simplehong suma sa ibaba asin pakikaag an simbag sa laog nin kahon tanganing itagama an saimong pagliwat ([[Special:Captcha/help|more info]]):',
+	'captcha-badlogin' => 'Tanganing protektaran an wiki kontra sa awtomatikong pagbaak kan pasa-taramon, kami tabi minahagad saimo na simbagan an simplehong suma sa ibaba asin pakikaag an simbag sa laog nin kahon ([[Special:Captcha/help|more info]]):',
+	'captcha-createaccount' => 'Tanganing protektaran an wiki kontra sa awtomatikong pagmumukna nin panindog, kami tabi minahagad saimon na simbagan an simplehong suma sa ibaba asin pakikaag an simbag sa laog nin kahon ([[Special:Captcha/help|more info]]):',
+	'captcha-createaccount-fail' => 'Bakong tama o nawawara an koda sa kumpirmasyon.',
+	'captcha-create' => 'Tanganing makamukna nin pahina, pakisimbagan tabi an simpleng suma sa ibaba asin ikaag an simbag sa laog kan kahon ([[Special:Captcha/help|more info]]):',
+	'captcha-sendemail' => 'Tanganing protektaran an wiki kontra sa awtomatikong pag-eespam, kami tabi minahagad saimo na simbagan an simplehong suma sa ibaba asin pakikaag an simbag sa laog nin kahon ([[Special:Captcha/help|more info]]):',
+	'captcha-sendemail-fail' => 'Bakong tama o nawawara an koda sa kumpirmasyon.',
+	'captcha-disabledinapi' => 'Ining aksyon minahagad nin sarong captcha, kaya ini dae magigibo sa paagi kan API.',
 	'captchahelp-title' => 'Tabang sa Captcha',
+	'captchahelp-cookies-needed' => 'Kinakaipuhan mong paganahon an mga kokies sa saimong kilyawan para ini mapadalagan.',
+	'captchahelp-text' => 'An mga websityo na nag-aakseptar nin mga paskil gikan sa publiko, arog kaining wiki, paminsan pinag-aabuso nin mga para-espam na minagamit nin awtomatikong mga palindong tanganing maipaskil an saindang mga sugpon sa kadakulon na mga sityo. Mantang ining mga sugpon kan espam mapuwedeng pagtangkason, sinda baya sarong signipikanteng mga pasawayon.
+
+Paminsan, espesyalmente kunsoarin magdudugang nin baguhong mga sugpon sa web sa sarong pahina, an wiki mapatanaw saimo nin sarong imahe na may kolor o distortadong teksto asin maghagad saimo na itipa an mga tataramon na ipinatanaw. Mantang ini sarong gibohon na masakiton na i-awtomatiko, ini minatuggot sa kadakling mga tunay na tawo na himoon an saindang mga pamaskil mantang pinagpupundo an kadakling mga para-espam asin iba pang robotikong mga para-atake.
+
+Sa kademalasan ini makakapagtao nin inkombeniyensya sa mga paragamit na igwang limitadong paghilingon o naggagamit nin base sa teksto o base sa pagtaram na mga kilyawan.
+Sa momentong ini kami mayo nin pandangog na alternatibong makukua.
+Paki-kontak tabi an [[Special:ListAdmins|mga administrador kan sityo]] para sa katabangan kun ini dae pinag-aasahan na makapagpugol saimo sa paghihimo nin lehitimong mga aksyon.
+
+Pinduta an "pabalik" na pindutan sa saimong kilyawan tanganing makabalik sa pahina nin paraliwat.',
+	'captcha-addurl-whitelist' => '#<!-- pabayae ining linya na eksaktong siring sana  --> <pre> 
+# An sintaks iyo an mga minasunod: 
+# * Gabos na bagay gikan sa sarong "#" na karakter sagkod sa tapos kaining linya iyo an sarong komento  
+# * An lambang linya na bakong blangko iyo an sarong pragmentong regex na magtatampad sana nin mga parabunsod sa laog kan mga URLs 
+#</pre> <!-- pabayae ining linya na eksaktong siring sana -->',
+	'right-skipcaptcha' => 'Himoon an kiblitong aksyon nin CAPTCHA na dae minaagi sa paagi kan CAPTCHA',
 );
 
 /** Belarusian (беларуская)
@@ -487,7 +522,7 @@ $messages['be-tarask'] = array(
 
 На жаль, гэта можа выклікаць нязручнасьці для ўдзельнікаў з абмежаваньнямі па зроку і для тых, хто ўжывае тэкставыя ці моўныя браўзэры.
 На гэты момант мы ня маем аўдыё-альтэрнатывы гэтай праверцы.
-Калі ласка, зьвяжыцеся з [[{{MediaWiki:Grouppage-sysop}}|адміністратарамі]], калі гэтая праверка перашкаджае Вам рабіць слушныя запісы.
+Калі ласка, зьвяжыцеся з [[Special:ListAdmins|адміністратарамі]], калі гэтая праверка перашкаджае Вам рабіць слушныя запісы.
 
 Націсьніце кнопку «назад» у Вашым браўзэры, каб вярнуцца да рэдагаваньня старонкі.',
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -519,7 +554,7 @@ $messages['bg'] = array(
 
 Понякога, особено когато се добавят нови препратки към страниците, е възможно уикито да покаже картинка с текст, който трябва да бъде въведен в посоченото поле. Тъй като това е стъпка, която е трудно да бъде прескочена при автоматизирано редактиране, тя затруднява и спира повечето спамъри и роботи, но допуска истинските потребителите да правят редакции.
 
-За съжаление тази стъпка може да затрудни незрящи потребители или потребители, които използват текстови или речеви браузъри. За момента системата не разполага с възможност за гласова алтернатива. Обърнете се за помощ към [[{{MediaWiki:Grouppage-sysop}}|администратор на сайта]], ако това изискване на системата ви затруднява да допринасяте легитимно.
+За съжаление тази стъпка може да затрудни незрящи потребители или потребители, които използват текстови или речеви браузъри. За момента системата не разполага с възможност за гласова алтернатива. Обърнете се за помощ към [[Special:ListAdmins|администратор на сайта]], ако това изискване на системата ви затруднява да допринасяте легитимно.
 
 Натиснете бутона 'back' на вашия браузър, за да се върнете към редактора на страници.",
 );
@@ -538,11 +573,12 @@ $messages['bn'] = array(
 	'captcha-label' => 'ক্যাপচা',
 	'captcha-addurl' => 'আপনার সম্পাদনায় নতুন বহিঃসংযোগ বিদ্যমান।
 স্বয়ংক্রিয় স্প্যামের বিরুদ্ধে সুরক্ষার খাতিরে অনুগ্রহ নিচের যোগটি সমাহদান করুন এবং উত্তরটি বাক্সে প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):',
-	'captcha-badlogin' => 'স্বয়ংক্রিয় শব্দচাবি ক্র‌্যাকিং-এর বিরুদ্ধে সুরক্ষার খাতিরে অনুগ্রহ করে নিচের যোগটি সমাধান করুন এবং উত্তরটি বাক্সে প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):', # Fuzzy
-	'captcha-createaccount' => 'স্বয়ংক্রিয় অ্যাকাউন্ট সৃষ্টি রোধ করার খাতিরে অনুগ্রহ করে নিচের যোগটি সমাধান করুন এবং উত্তরটি বাক্সে প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):', # Fuzzy
+	'captcha-badlogin' => 'স্বয়ংক্রিয় শব্দচাবি ক্র‌্যাকিং-এর বিরুদ্ধে সুরক্ষার খাতিরে অনুগ্রহ করে নিচের যোগটি সমাধান করুন এবং উত্তরটি বাক্সে প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):',
+	'captcha-createaccount' => 'স্বয়ংক্রিয় অ্যাকাউন্ট সৃষ্টি রোধ করার জন্য অনুগ্রহ করে নিচের যোগটি সমাধান করুন এবং উত্তরটি বাক্সে প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):',
 	'captcha-createaccount-fail' => 'ভুল অথবা হারিয়ে যাওয়া নিশ্চিতকরণ সংকেত',
 	'captcha-create' => 'পাতাটি সৃষ্টি করতে চাইলে অনুগ্রহ করে নিচের যোগটি সমাধান করুন এবং উত্তরটি বাক্সে প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):',
-	'captcha-sendemail' => 'স্বয়ংক্রিয় স্প্যাম থেকে রক্ষা পেতে, অনুগ্রহ করে সাধারন অংকটি সমাধান করুন এবং উত্তরপ্রদান বক্সে লিখুন ([[Special:Captcha/help|আরও তথ্য]]):', # Fuzzy
+	'captcha-sendemail' => 'স্বয়ংক্রিয় স্প্যাম থেকে রক্ষা পেতে, অনুগ্রহ করে সাধারন অংকটি সমাধান করুন এবং উত্তর প্রদান বক্সে লিখুন
+([[Special:Captcha/help|আরও তথ্য]]):',
 	'captcha-sendemail-fail' => 'নিশ্চিতকরণ কোডটি ভুল বা দেয়া হয়নি',
 	'captcha-disabledinapi' => 'এই কাজটি করার জন্য একটি ক্যাপচা প্রয়োজন, তাই এটি এপিআই দ্বারা করা যাবে না।',
 	'captchahelp-title' => 'ক্যাপচা সাহায্য',
@@ -551,7 +587,7 @@ $messages['bn'] = array(
 
 কখনো কখনো, বিশেষ করে কোন পাতায় নতুন ওয়েব সংযোগ যোগ করার সময়, উইকিটি আপনাকে রঙিন বা বিকৃত টেক্সটবিশিষ্ট ছবি দেখিয়ে আপনাকে শব্দটি টাইপ করতে বলতে পারে। যেহেতু এই কাজটি স্বয়ংক্রিয়ভাবে সম্পাদন করা দুরূহ, তাই এই ব্যবস্থার ফলে প্রকৃত মানুষেরা পোস্ট করতে পারবেন কিন্তু বেশির ভাগ স্প্যামার বা রোবটভিত্তিক আক্রমণ বাধাপ্রাপ্ত হবে।
 
-যারা চোখে কম দেখতে পান কিংবা টেক্সটভিত্তিক বা উক্তিভিত্তিক ব্রাউজার ব্যবহার করছেন, দুর্ভাগ্যবশত এই ব্যবস্থাটি তাদের জন্য সমস্যার সৃষ্টি করবে। এই মুহূর্তে আমাদের কাছে এই ব্যবস্থাটির কোন অডিও বিকল্প নেই। যদি ব্যবস্থাটি আপনাকে বৈধ পোস্ট করতে অযাচিত বাধা দেয়, অনুগ্রহ করে [[{{MediaWiki:Grouppage-sysop}}|সাইটের প্রশাসকদের]] কাছে সাহায্য চান।
+যারা চোখে কম দেখতে পান কিংবা টেক্সটভিত্তিক বা উক্তিভিত্তিক ব্রাউজার ব্যবহার করছেন, দুর্ভাগ্যবশত এই ব্যবস্থাটি তাদের জন্য সমস্যার সৃষ্টি করবে। এই মুহূর্তে আমাদের কাছে এই ব্যবস্থাটির কোন অডিও বিকল্প নেই। যদি ব্যবস্থাটি আপনাকে বৈধ পোস্ট করতে অযাচিত বাধা দেয়, অনুগ্রহ করে [[Special:ListAdmins|সাইটের প্রশাসকদের]] কাছে সাহায্য চান।
 
 আপনি এখন ব্রাউজারের ব্যাক বোতাম চেপে পাতা সম্পাদকে ফেরত যেতে পারেন।',
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -589,7 +625,7 @@ A-wezhioù, dreist-holl pa vez ouzhpennet liammoù Web nevez war ur bajenn, e c'
 Un trevell start da emgefrekaat eo hemañ. Gant se e c'hallo an implijerien wirion postañ ar pezh a fell dezho tra ma vo lakaet un harz d'an darn vrasañ eus ar stroberien pe d'an dagerien robotek all. 
 
 Koulskoude e c'hallo an implijerien berr o gweled pe ar re a implij merdeerioù diazezet war ar skrid pe war ar vouezh bezañ strafuilhet gant se. N'omp ket evit kinnig un diskoulm dre glevet evit c'hoazh. 
-Kit e darempred gant [[{{MediaWiki:Grouppage-sysop}}|merourien al lec'hienn]] m'hoc'h eus diaesterioù evit kemer perzh abalamour d'an teknik-se. 
+Kit e darempred gant [[Special:ListAdmins|merourien al lec'hienn]] m'hoc'h eus diaesterioù evit kemer perzh abalamour d'an teknik-se. 
 
 Pouezit war bouton 'kent' ho merdeer evit distreiñ d'ar bajenn gemmañ.",
 	'captcha-addurl-whitelist' => " #<!-- laoskit al linenn-mañ tre evel m'emañ --> <pre>
@@ -628,7 +664,7 @@ Pošto je teško automatizovati ovakav zadatak, on omogućuje svim pravim ljudim
 
 Nažalost, ovo može da bude nepovoljno za korisnike sa ograničenim vidom i za one koji koriste preglednike bazirane na tekstu ili govoru.
 U ovom trenutku, audio alternativa nije dostupna.
-Molimo Vas da kontaktirate [[{{MediaWiki:Grouppage-sysop}}|administratore sajta]] radi pomoći ako Vas ovo neočekivano ometa u pravljenju dobrih izmjena.
+Molimo Vas da kontaktirate [[Special:ListAdmins|administratore sajta]] radi pomoći ako Vas ovo neočekivano ometa u pravljenju dobrih izmjena.
 
 Kliknite 'nazad' ('back') dugme vašeg preglednika da se vratite na polje za unos teksta.",
 	'captcha-addurl-whitelist' => ' #<!-- ostavite ovaj red onakav kakav je --> <pre>
@@ -665,7 +701,7 @@ $messages['ca'] = array(
 
 Quan creeu nous comptes d'usuari o afegiu enllaços a una pàgina se us demanarà que respongueu una pregunta fàcil, una suma o que teclegeu el text que apareix en una imatge distorsionada. És difícil programar un robot per aquest tipus de tasques, i gràcies a açò, es poden aturar la majoria d'atacants robots.
 
-Malauradament, aquest sistema pot suposar un inconvenient per a usuaris amb problemes de visió o que utilitzin navegadors de text simple o de veu. Actualment no disposem de cap alternativa auditiva disponible. Contacteu els [[{{MediaWiki:Grouppage-sysop}}|administradors del web]] si aquest sistema us impedeix de fer edicions legítimes.
+Malauradament, aquest sistema pot suposar un inconvenient per a usuaris amb problemes de visió o que utilitzin navegadors de text simple o de veu. Actualment no disposem de cap alternativa auditiva disponible. Contacteu els [[Special:ListAdmins|administradors del web]] si aquest sistema us impedeix de fer edicions legítimes.
 
 Necessitareu tenir les galetes (''cookies'') activades al vostre navegador per a realitzar aquestes accions.
 
@@ -679,10 +715,11 @@ Cliqueu el botó de retrocedir del vostre navegador per a tornar al formulari.",
 );
 
 /** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄)
+ * @author Yejianfei
  */
 $messages['cdo'] = array(
 	'captcha-edit' => "Nṳ̄ gă-tiĕng lāu sĭng gì nguôi-buô lièng-giék. Ôi lāu ê̤ṳ-huòng ô tiàng-sê̤ṳ cê̤ṳ-dông huák-buó bóng-só̤ séng-sék (''spam''), kī-dâe̤ng nṳ̄ gié-sáung â-dā̤ gāng-dăng gì gă-huák, gái ciŏng dák-áng siā diē gáh-gáh diē-sié ([[Special:Captcha/help|gáing sâ̤ séng-sék]]):",
-	'captchahelp-title' => 'Captcha bŏng-cô',
+	'captchahelp-title' => '驗證碼幫助',
 	'captchahelp-text' => "Chiông wiki dēng kăi-huóng gì uōng-câng sèu-sèu ké̤ṳk bóng-só̤ séng-sék huák-buó-nè̤ng (\\'\\'spammer\\'\\') páh-chā: ĭ-gáuk-nè̤ng kĕk cê̤ṳ-dông-huá gì gă-sĭ táik bóng-só̤ guōng-gó̤ lièng gáu ĭ gì uōng-câng. Chŭi-iòng cī piĕ bóng-só̤ séng-sék â̤ dù lâi gì, dáng-sê iâ cêng-go̤ tō̤-iéng.
 
 Ô sèng-hâiu, dĕk-biék sê găk nṳ̄ gă-tiĕng sĭng gì nguôi-buô lièng-giék gáu wiki gì sèng-hâiu, wiki â̤ hiēng-sê sáik-ké gáuk-iông hĕ̤k-ciā sê hìng-câung ô gāi-biéng gì ùng-cê dù-chiông, giéu nṳ̄ páh diē nṳ̄ sū káng giéng gì cê hĕ̤k sṳ̀ (hô̤ lō̤ \"captcha\"). Ĭng-ôi gĭ-ké-nè̤ng mâ̤ chiàng ciā êng-ô, gó-chṳ̄ cêu â̤ huòng-cī duâi-buô-hông iù gĭ-ké-nè̤ng huák-buó bóng-só̤ séng-sék (bók-guó, cĭng nè̤ng huák-buó  bóng-só̤ séng-sék, ciā huŏng-huák huòng mâ̤ lì).
@@ -694,6 +731,20 @@ Cĭng mì-hâng, dó̤i hī piĕ mĕ̤k-ciŭ mâ̤ hō̤, hĕ̤k-ciā sê sāi-
 Buóh diōng kó̤ piĕng-cĭk hiĕk-miêng, áik \"diōng kó̤ sèng 1 hiĕk\" (\\'\\'back\\'\\').", # Fuzzy
 );
 
+/** Chechen (нохчийн)
+ * @author Умар
+ */
+$messages['ce'] = array(
+	'right-skipcaptcha' => 'CAPTCHA-хьажар кхочушдар, CAPTCHA чекхдалар доцуш',
+);
+
+/** Sorani Kurdish (کوردی)
+ * @author Calak
+ */
+$messages['ckb'] = array(
+	'right-skipcaptcha' => 'جێبەجێکردنی کردەوەکانی پێویست بە کاپچا بەبێ بەکارھێنانی کاپچا',
+);
+
 /** Czech (česky)
  * @author Danny B.
  * @author Li-sung
@@ -719,7 +770,7 @@ V zájmu ochrany této wiki před automatickým spamováním vás prosíme o vy
 
 Někdy, zvláště při přidávání nových webových odkazů, vám může wiki ukázat obrázek barevného či pokrouceného textu a požádat vás o opsání zobrazených znaků. Jelikož takovou úlohu lze jen těžko automatizovat, skuteční lidé mohou dále přispívat, zatímco většinu spammerů a jiných robotických útočníků to zastaví.
 
-Bohužel to však může představovat nepříjemný problém pro uživatele se zrakovým postižením či uživatele používající textové prohlížeče či hlasové čtečky. V současné době nemáme alternativní zvukovou verzi. Kontaktujte laskavě [[{{MediaWiki:Grouppage-sysop}}|správce serveru]], pokud vám to brání v užitečných příspěvcích a potřebujete pomoc.
+Bohužel to však může představovat nepříjemný problém pro uživatele se zrakovým postižením či uživatele používající textové prohlížeče či hlasové čtečky. V současné době nemáme alternativní zvukovou verzi. Kontaktujte laskavě [[Special:ListAdmins|správce serveru]], pokud vám to brání v užitečných příspěvcích a potřebujete pomoc.
 
 Pro návrat na předchozí stránku stiskněte ve svém prohlížeči tlačítko „zpět“.',
 	'captcha-addurl-whitelist' => ' #<!-- Nechte tento řádek přesně tak jak je --> <pre>
@@ -754,7 +805,7 @@ O dro i dro, yn enwedig wrth ychwanegu dolenni at safleoedd gwe eraill, fe fydd
 
 Yn anffodus, mae hyn yn creu trafferthion i'r rhai sydd yn defnyddio porwyr testun neu borwyr sain, neu sydd yn colli eu golwg.
 Ar hyn o bryd nid oes fersiwn sain ar gael.
-Cysylltwch â [[{{MediaWiki:Grouppage-sysop}}|gweinyddwyr y safle]] os ydi'r nodwedd hon yn eich rhwystro rhag ychwanegu golygiadau dilys.
+Cysylltwch â [[Special:ListAdmins|gweinyddwyr y safle]] os ydi'r nodwedd hon yn eich rhwystro rhag ychwanegu golygiadau dilys.
 
 Gwasgwch botwm 'nôl' eich porwr er mwyn dychwelyd at y dudalen golygu.",
 	'captcha-addurl-whitelist' => '#<!-- leave this line exactly as it is --> <pre>
@@ -771,6 +822,7 @@ Gwasgwch botwm 'nôl' eich porwr er mwyn dychwelyd at y dudalen golygu.",
 /** Danish (dansk)
  * @author Aputtu
  * @author Byrial
+ * @author Christian List
  * @author Hylle
  * @author Kaare
  * @author Peter Alberti
@@ -783,7 +835,7 @@ $messages['da'] = array(
 Som beskyttelse af wikien mod automatiseret spam, skal du løse det enkle regnestykke nedenfor og skrive resultatet i boksen, for at kunne gemme din redigering ([[Special:Captcha/help|flere oplysninger]]):',
 	'captcha-badlogin' => 'For at beskytte wikien mod automatiseret adgangskodegætning, skal du løse det enkle regnestykke nedenfor og skrive resultatet i boksen ([[Special:Captcha/help|flere oplysninger]]):',
 	'captcha-createaccount' => 'For at beskytte wikien mod automatisk oprettelse af brugernavne, skal du løse det enkle regnestykke nedenfor og skrive resultatet i boksen ([[Special:Captcha/help|flere oplysninger]]):',
-	'captcha-createaccount-fail' => 'Forkert eller manglende kodeord.',
+	'captcha-createaccount-fail' => 'Forkert eller manglende bekræftelseskode.',
 	'captcha-create' => 'For at oprette en ny side, skal du give svaret på regnestyket nedenfor, og angive resultatet i feltet under det. ([[Special:Captcha/help|mere information]]):',
 	'captcha-sendemail' => 'For at beskytte wikien mod automatisk spamning, skal du løse det enkle regnestykke nedenfor og skrive resultatet i boksen ([[Special:Captcha/help|flere oplysninger]]):',
 	'captcha-sendemail-fail' => 'Forkert eller manglende bekræftelseskode.',
@@ -794,7 +846,7 @@ Som beskyttelse af wikien mod automatiseret spam, skal du løse det enkle regnes
 
 I visse tilfælde, specielt når der tilføjes nye links til denne wiki, vil softwaren vise dig et billede af et stykke forvredet og sløret tekst. Du skal indtaste det ord, der vises, før du kan gennemføre handlingen. Formålet er at skelne mellem mennesker og automatiserede værktøjer, da de sidste har meget svært ved at genkende ordene.
 
-Desværre kan dette medføre problemer for svagtseende brugere, og brugere der bruger software der oplæser indholdet af siden. For øjeblikket findes der ikke et lydbaseret alternativ. Kontakt venligst en [[{{MediaWiki:Grouppage-sysop}}|administrator]] med henblik på at få hjælp, hvis dette forhindrer tilføjelsen af godartet materiale.
+Desværre kan dette medføre problemer for svagtseende brugere, og brugere der bruger software der oplæser indholdet af siden. For øjeblikket findes der ikke et lydbaseret alternativ. Kontakt venligst en [[Special:ListAdmins|administrator]] med henblik på at få hjælp, hvis dette forhindrer tilføjelsen af godartet materiale.
 
 Tryk på 'tilbage'-knappen i din browser for at returnere til redigeringssiden.",
 	'captcha-addurl-whitelist' => ' #<!-- Undlad at rette denne linie --> <pre>
@@ -829,14 +881,14 @@ Um das Wiki vor automatisiertem Spam zu schützen, bitten wir dich die untensteh
 	'captcha-disabledinapi' => 'Diese Aktion benötigt ein CAPTCHA. Sie kann nicht über die API ausgeführt werden.',
 	'captchahelp-title' => 'CAPTCHA-Hilfe',
 	'captchahelp-cookies-needed' => "'''Wichtiger Hinweis:''' Es müssen Cookies im Browser erlaubt sein.",
-	'captchahelp-text' => 'Internetangebote, die für Beiträge von praktisch jedem offen sind — so wie dieses Wiki — werden oft von Spammern missbraucht, die ihre Links automatisch auf vielen Webseiten platzieren. Diese Spam-Links können wieder entfernt werden, sie sind aber ein erhebliches Ärgernis.
+	'captchahelp-text' => 'Internetangebote, die für Beiträge von praktisch jedem offen sind – so wie dieses Wiki – werden oft von Spammern missbraucht, die ihre Links automatisch auf vielen Webseiten platzieren. Diese Spam-Links können wieder entfernt werden, sie sind aber ein erhebliches Ärgernis.
 
 In manchen Fällen, insbesondere beim Hinzufügen von neuen Weblinks zu einer Seite, kann es vorkommen, dass dieses Wiki ein Bild mit einem farbigen und verzerrten Text anzeigt und dazu auffordert, die angezeigten Wörter einzutippen.
 Da eine solche Aufgabe nur schwer automatisch erledigt werden kann, werden dadurch die meisten Spammer, die mit automatischen Werkzeugen arbeiten, gestoppt, wogegen menschliche Benutzer ihren Beitrag absenden können.
 
 Leider kann dies zu Schwierigkeiten für Personen führen, die über eine eingeschränkte Sehfähigkeit verfügen oder text- oder sprachbasierte Browser verwenden. Aktuell sind keine Audio-CAPTCHAs verfügbar.
 
-Bitte kontaktiere einen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] für weitere Hilfe, wenn dies es unmöglich macht, erwünschte Bearbeitungen vorzunehmen.
+Bitte kontaktiere einen [[Special:ListAdmins|Administrator]] für weitere Hilfe, wenn dies es unmöglich macht, erwünschte Bearbeitungen vorzunehmen.
 
 Der „Zurück“-Knopf des Browsers führt zurück zum Bearbeitungsfenster.',
 	'captcha-addurl-whitelist' => ' #<!-- Diese Zeile darf nicht verändert werden! --> <pre>
@@ -868,7 +920,7 @@ Da eine solche Aufgabe nur schwer automatisch erledigt werden kann, werden dadur
 
 Leider kann dies zu Schwierigkeiten für Personen führen, die über eine eingeschränkte Sehfähigkeit verfügen oder text- oder sprachbasierte Browser verwenden. Aktuell sind keine Audio-Captchas verfügbar.
 
-Bitte kontaktieren Sie einen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] für weitere Hilfe, wenn dies es unmöglich macht, erwünschte Bearbeitungen vorzunehmen.
+Bitte kontaktieren Sie einen [[Special:ListAdmins|Administratoren]] für weitere Hilfe, wenn dies es unmöglich macht, erwünschte Bearbeitungen vorzunehmen.
 
 Der „Zurück“-Knopf des Browsers führt zurück zum Bearbeitungsfenster.',
 );
@@ -904,7 +956,7 @@ Eka ena process otomatik nibeno, ena process otomatik spam kerogan vinderneno fe
 
 Ma ef bikeri ena process belki ti ra zehmeti. belki cim tu ra şcekuyan hewl niesno. 
 Nika ma da sistemê vengî cinoke ti ra vaci resim da kamci cekuyan esto. 
-Ma rica keno ti yew [[{{MediaWiki:Grouppage-sysop}}|idarekar]] ra yew mesaj bişavî u o ra yardim bivaci eka ti yew linkê hewlî darnone.
+Ma rica keno ti yew [[Special:ListAdmins|idarekar]] ra yew mesaj bişavî u o ra yardim bivaci eka ti yew linkê hewlî darnone.
 
 Browser xo de goceke 'back' rê klik bike şo pela editorî.",
 	'captcha-addurl-whitelist' => '  #<!-- leave this line exactly as it is --> <pre>
@@ -941,7 +993,7 @@ Dokulaž to jo nadawk, kótaryž dajo se śěžko awtomatizěrowaś, dówolujo t
 
 Bóžko to móžo kazyś wužywarjow z wobgraniwoneju zamóžnosću wiźenja pśi wužywanju wobglědowakow, kótarež bazěruju na teksće abo rěcnem wudaśu.
 Tuchylu njamamy awdioalternatiwu.
-Staj se pšosym z [[{{MediaWiki:Grouppage-sysop}}|administratorami sedła]] z pšosbu wó pomoc do zwiska, jolic to śi njewócakane  zawobarujo słanje legitimnych pśinoskow.
+Staj se pšosym z [[Special:ListAdmins|administratorami sedła]] z pšosbu wó pomoc do zwiska, jolic to śi njewócakane  zawobarujo słanje legitimnych pśinoskow.
 
 Klikni na tłocašk "Slědk" we swójom wobglědowaku, aby wróśił k bokowemu editoroju.',
 	'captcha-addurl-whitelist' => ' #<!-- wóstaj toś tu smužku rowno ako jo --> <pre>
@@ -989,7 +1041,7 @@ $messages['el'] = array(
 
 Μερικές φορές, ειδικά κατά την προσθήκη νέων συνδέσμων σε μια σελίδα, το wiki μπορεί να σας παρουσιάσει μια εικόνα με χρωματισμένο ή διαστρεβλωμένο κείμενο και να σας ζητήσει να πληκτρολογήσετε τις λέξεις που διακρίνετε. Δεδομένου ότι αυτή η εργασία είναι δύσκολο να αυτοματοποιηθεί, θα επιτρέψει στους περισσότερους πραγματικούς ανθρώπους να κάνουν τις δημοσιεύσεις τους, σταματώντας όμως spammers και άλλους ρομποτικά επιτιθέμενους.
 
-Δυστυχώς αυτό μπορεί να προκαλέσει δυσχέρεια σε χρήστες με προβλήματα όρασης τους ή όσους χρησιμοποιούν περιηγητές αποκλειστικά κειμένου ή περιηγητές με ομιλία. Προς το παρόν δεν έχουμε κάποια ηχητική εναλλακτική λύση διαθέσιμη. Παρακαλώ επικοινωνήστε με τους [[{{MediaWiki:Grouppage-sysop}}|διαχειριστές]] του ιστότοπου για βοήθεια, εάν αυτό για κάποιο λόγο σας αποτρέπει να εκτελέσετε θεμιτές ενέργειες.
+Δυστυχώς αυτό μπορεί να προκαλέσει δυσχέρεια σε χρήστες με προβλήματα όρασης τους ή όσους χρησιμοποιούν περιηγητές αποκλειστικά κειμένου ή περιηγητές με ομιλία. Προς το παρόν δεν έχουμε κάποια ηχητική εναλλακτική λύση διαθέσιμη. Παρακαλώ επικοινωνήστε με τους [[Special:ListAdmins|διαχειριστές]] του ιστότοπου για βοήθεια, εάν αυτό για κάποιο λόγο σας αποτρέπει να εκτελέσετε θεμιτές ενέργειες.
 
 Πατήστε το κουμπί «πίσω» στον περιηγητή σας για να επιστρέψετε στον επεξεργαστή σελίδων.',
 	'captcha-addurl-whitelist' => '  #<!-- αφήστε αυτή την γραμμή ακριβώς όπως είναι --> <pre>
@@ -1012,7 +1064,7 @@ Since this is a task that's hard to automate, it will allow most real humans to
 
 Unfortunately this may inconvenience users with limited vision or using text-based or speech-based browsers.
 At the moment we do not have an audio alternative available.
-Please contact the  [[{{MediaWiki:Grouppage-sysop}}|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate posts.
+Please contact the  [[Special:ListAdmins|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate posts.
 
 Hit the 'back' button in your browser to return to the page editor.",
 );
@@ -1029,7 +1081,7 @@ Since this is a task that's hard to automate, it will allow most real humans to
 
 Unfortunately this may inconvenience users with limited vision or using text-based or speech-based browsers.
 At the moment we do not have an audio alternative available.
-Please contact the  [[{{MediaWiki:Grouppage-sysop}}|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate posts.
+Please contact the  [[Special:ListAdmins|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate posts.
 
 Hit the 'back' button in your browser to return to the page editor.",
 );
@@ -1045,12 +1097,12 @@ $messages['eo'] = array(
 	'captcha-label' => 'CAPTCHA',
 	'captcha-addurl' => 'Via redakto entenas novajn eksterajn ligilojn.
 Por protekti la vikion kontraux aŭtomata spamado, bonvolu solvi la simplan problemon sube kaj entajpu la respondon en la kesto por konservi vian redakton ([[Special:Captcha/help|pli da informo]]):',
-	'captcha-badlogin' => 'Helpi protekti kontraŭ aŭtomata divenado de pasvortoj, bonvolu solvi la simplan sumon kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):', # Fuzzy
-	'captcha-createaccount' => 'Helpi protekti kontraŭ aŭtomata konto-kreado, bonvolu solvi la simplan sumon suben
-kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):', # Fuzzy
+	'captcha-badlogin' => 'Por protekti kontraŭ aŭtomata divenado de pasvortoj, bonvolu solvi la simplan sumon kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):',
+	'captcha-createaccount' => 'Por protekti kontraŭ aŭtomata konto-kreado, bonvolu solvi la simplan sumon suben
+kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):',
 	'captcha-createaccount-fail' => 'Malĝusta aŭ mankanta konfirma kodo.',
 	'captcha-create' => 'Por krei la paĝon, bonvolu solvi la simplan sumon jenan kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):',
-	'captcha-sendemail' => 'Por helpi protekti kontraŭ aŭtomata spamado, bonvolu solvi la simplan sumon kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):', # Fuzzy
+	'captcha-sendemail' => 'Por helpi protekti kontraŭ aŭtomata spamado, bonvolu solvi la simplan sumon kaj enigi la respondon en la skatolo ([[Special:Captcha/help|plua informo]]):',
 	'captcha-sendemail-fail' => 'Malĝusta aŭ mankanta konfirma kodo.',
 	'captcha-disabledinapi' => 'Ĉi tiu ago bezonas captcha, tial ĝi ne estas farebla per API.',
 	'captchahelp-title' => 'Helpo pri captcha',
@@ -1063,7 +1115,7 @@ Tial ĉi tiu tasko estas malfacila por fari aŭtomate, ebligos al realaj homoj f
 
 Bedaŭrinde, ĉi tio eble ĝenetos uzantojn kun malbona vidkapablo kiu utiligas tekstajn aŭ voĉajn retumilojn.
 Ĉi-momente, neniu aŭda alternativo estas havebla.
-Bonvolu kontakti la [[{{MediaWiki:Grouppage-sysop}}|administrantojn de la retejo]] por helpo se ĉi tio malebligas al vi fari bonan aldonon.
+Bonvolu kontakti la [[Special:ListAdmins|administrantojn de la retejo]] por helpo se ĉi tio malebligas al vi fari bonan aldonon.
 
 Klaku la 'reiru' butonon en via retumilo por reiri al la paĝo-redaktilo.",
 	'captcha-addurl-whitelist' => ' #<!-- ne ŝanĝu ĉi tiun linion iel ajn --> <pre>
@@ -1107,7 +1159,7 @@ En ocasiones, especialmente cuando añada nuevos enlaces a una página, la wiki
 
 Desafortunadamente esto puede ser un inconveniente para usuarios con visión limitada o para navegadores basados en texto o en voz.
 En este momento no tenemos una alternativa de audio disponible.
-Por favor contacte a los  [[{{MediaWiki:Grouppage-sysop}}|administradores del sitio]] para asistencia si esto está impidiendiendo inesperadamente que hagas mensajes legítimos.
+Por favor contacte a los  [[Special:ListAdmins|administradores del sitio]] para asistencia si esto está impidiendiendo inesperadamente que hagas mensajes legítimos.
 
 Presione el botón 'atrás' en su navegador para retornar al editor de página.",
 	'captcha-addurl-whitelist' => ' #<!-- deje esta línea exactamente como está --> <pre>
@@ -1144,7 +1196,7 @@ Palun lahenda allpool lihtne tehe ja sisesta vastus kasti, et saaksid muudatuse
 Kasutajakontot registreerides või mõnele lehele uusi internetiaadresse postitades näidatakse moonutatud tekstiga pilti ja palutakse sisestada seal kuvatud sõnad. Kuna selliselt pildilt on arvutil raske teksti välja lugeda, on see efektiivseks kaitseks rämpspostirobotite vastu ja lubab samas tavakasutajatel rahus muudatusi teha.
 
 Kahjuks võib see tekitada ebamugavusi nägemisraskustega inimestele või neile, kes kasutavad tehiskõneseadet või tekstipõhist veebilehitsejat. Hetkel pole meil helipõhist alternatiivi.
-Kui sul tekib raskusi muudatuste tegemisel, võta palun ühendust selle võrgukoha [[{{MediaWiki:Grouppage-sysop}}|administraatoritega]].
+Kui sul tekib raskusi muudatuste tegemisel, võta palun ühendust selle võrgukoha [[Special:ListAdmins|administraatoritega]].
 
 Konto registreerimise lehele või redigeerimisaknasse tagasi jõudmiseks klõpsa veebilehitseja tagasi-nuppu.',
 	'captcha-addurl-whitelist' => '  #<!-- Jäta see rida muutmata kujule. --> <pre>
@@ -1175,7 +1227,7 @@ Lotura horiek ezabatu egin daitezkeen arren, traba dira.
 
 Batzuetan, eta bereziki webgune berri bateko loturak gehitzen dituzunean, hitz batzuk dituen irudi bat agertuko zaizu, eta bertan ageri den testua idazteko eskatuko zaizu. Lan hori automatizatzeko zaila da, eta pertsonei ezer kostatzen ez zaigunez, spam testuak saihesteko lagungarria da.
 
-Zoritxarrez, ikusmen mugatua edo testu bidezko nabigatzaileak erabiltzen dituzten erabiltzeek arazoak izan ditzakete. Horrelako zerbait gertatzen bazaizu, mesedez, jarri [[{{MediaWiki:Grouppage-sysop}}|administratzaileekin]] harremanetan.
+Zoritxarrez, ikusmen mugatua edo testu bidezko nabigatzaileak erabiltzen dituzten erabiltzeek arazoak izan ditzakete. Horrelako zerbait gertatzen bazaizu, mesedez, jarri [[Special:ListAdmins|administratzaileekin]] harremanetan.
 
 Zure nabigatzaileko 'atzera' lotura erabili aldaketen orrialdera itzultzeko.",
 );
@@ -1193,7 +1245,7 @@ $messages['fa'] = array(
 	'captcha-label' => 'کپچا',
 	'captcha-addurl' => 'ویرایش شما شامل پیوندهای تازه‌ای به بیرون است.
 برای کمک به جلوگیری از ارسال خودکار هرزنامه‌ها، لطفاً حاصل جمع زیر را حساب کنید و نتیجه را در جعبه وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
-	'captcha-badlogin' => 'برای کمک به جلوگیری از سرقت خودکار کلمه عبور، لطفاً حاصل جمع زیر را حساب کنید و نتیجه را در جعبه وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+	'captcha-badlogin' => 'برای کمک به جلوگیری از شکستن خودکار گذرواژه، لطفاً حاصل جمع زیر را حساب کنید و نتیجه را وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
 	'captcha-createaccount' => 'برای جلوگیری از ایجاد خودکار حساب کاربری، لطفاً حاصل جمع زیر را حساب کنید و نتیجه را در جعبه وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
 	'captcha-createaccount-fail' => 'کد تأییدی وجود ندارد یا نادرست است.',
 	'captcha-create' => 'برای ایجاد صفحه لطفاً حاصل جمع زیر را حساب کنید و نتیجه را در جعبه وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
@@ -1209,7 +1261,7 @@ $messages['fa'] = array(
 از آنجا که خودکارسازی این کار دشوار است، انسانهای واقعی می‌توانند پیوندهاشان را وارد کنند ولی برنامه‌های خودکار تبلیغاتی از خرابکاری باز خواهند ماند.
 
 متأسفانه این امر ممکن است باعث مزاحمت برای کاربرانی شود که چشمشان ضعیف است یا از مرورگرهای متنی یا گفتاری استفاده می‌کنند.
-در حال حاضر ما جایگزین صوتی‌ای برای این کار نداریم. لطفاً اگر برای واردساختن پیوندهای مشروع دچار مشکل شده‌اید با [[{{MediaWiki:Grouppage-sysop}}|مدیران این تارنما]] تماس بگیرید.
+در حال حاضر ما جایگزین صوتی‌ای برای این کار نداریم. لطفاً اگر برای واردساختن پیوندهای مشروع دچار مشکل شده‌اید با [[Special:ListAdmins|مدیران این تارنما]] تماس بگیرید.
 
 دکمهٔ «بازگشت» را در مرورگر خود فشار دهید تا به صفحهٔ ویرایش بازگردید.',
 	'captcha-addurl-whitelist' => ' #<!-- این سطر را همان‌گونه که هست رها کنید --> <pre>
@@ -1227,6 +1279,7 @@ $messages['fa'] = array(
  * @author Linnea
  * @author Nedergard
  * @author Nike
+ * @author Stryn
  * @author Varusmies
  */
 $messages['fi'] = array(
@@ -1239,7 +1292,7 @@ Automatisoitujen roskamuokkausten välttämiseksi ratkaise alla oleva summa ja k
 	'captcha-createaccount' => 'Automaattisen käyttäjätunnusten luonnin estämiseksi ratkaise alla oleva summa ja kirjoita se kenttään ([[Special:Captcha/help|lisätietoja]]):',
 	'captcha-createaccount-fail' => 'Väärä tai puuttuva varmistuskoodi.',
 	'captcha-create' => 'Ratkaise alla oleva summa jatkaaksesi ([[Special:Captcha/help|lisätietoja]]):',
-	'captcha-sendemail' => 'Jotta auttaisit suojautumaan automaattiselta roskapostitukselta, ratkaise alla oleva yksinkertainen yhteenlasku ja kirjoita vastaus laatikkoon ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
+	'captcha-sendemail' => 'Jotta auttaisit wikiä suojautumaan automaattiselta roskapostitukselta, pyydämme sinua ystävällisesti ratkaisemaan alla olevan yksinkertaisen yhteenlaskun ja kirjoittamaan vastauksen laatikkoon ([[Special:Captcha/help|lisätietoja]]):',
 	'captcha-sendemail-fail' => 'Virheellinen tai puuttuva vahvistuskoodi',
 	'captcha-disabledinapi' => 'Tämä toiminto vaatii kuvavarmennusta, joten et voi suorittaa sitä APIn kautta.',
 	'captchahelp-title' => 'Captcha-ohje',
@@ -1248,7 +1301,7 @@ Automatisoitujen roskamuokkausten välttämiseksi ratkaise alla oleva summa ja k
 
 Joskus, erityisesti kun lisäät uusia linkkejä, saatat nähdä kuvan, jossa on värillistä ja vääristynyttä tekstiä, ja sinua pyydetään kirjoittamaan sen sisältämät sanat. Koska tätä tehtävää on vaikea automatisoida, se sallii melkein kaikkien oikeiden ihmisten tehdä muutoksensa, mutta estää automaattiset lisäykset.
 
-Valitettavasti tämä saattaa estää käyttäjiä, joilla on rajoittunut näkökyky tai käyttäjiä, jotka käyttävät teksti- tai puhepohjaisia selaimia. Ota yhteyttä sivuston [[{{MediaWiki:Grouppage-sysop}}|sivuston ylläpitäjiin]], jos et pysty tekemään kunnollisia muutoksia.
+Valitettavasti tämä saattaa estää käyttäjiä, joilla on rajoittunut näkökyky tai käyttäjiä, jotka käyttävät teksti- tai puhepohjaisia selaimia. Ota yhteyttä [[Special:ListAdmins|sivuston ylläpitäjiin]], jos et pysty tekemään kunnollisia muutoksia.
 
 Varmistus ei toimi, jos evästeet eivät ole käytössä.
 
@@ -1269,10 +1322,11 @@ $messages['fo'] = array(
 	'captcha-edit' => 'Fyri at rætta hesa síðu, vinarliga  loys tað einfalda roknistykki niðanfyri og skriva svarið í teigin ([[Special:Captcha/help|meira kunning]]):',
 	'captcha-desc' => 'Gevur CAPTCHA teknikkir fyri at verja ímóti spamming og ímóti giting av loyniorði',
 	'captcha-label' => 'CAPTCHA',
-	'captcha-createaccount' => 'Sum ein vernd ímóti sjálvvirknum spam, er neyðugt hjá tær at skriva inn tey orð, sum koma fyri á myndini fyri at stovna eina kontu: <br />([[Special:Captcha/help|Hvat er hetta?]])', # Fuzzy
+	'captcha-createaccount' => 'Fyri at verja wikiina ímóti sjálvvirkandi spam kontoupprættan, vilja vit vinarliga heita á teg um at loysa ta einføldu rokniuppgávuna niðanfyri og skriva svarið í teigin
+([[Special:Captcha/help|meira kunning]]):',
 	'captcha-createaccount-fail' => 'Skeiv ella manglandi váttanar loyniorð.',
 	'captcha-create' => 'Fyri at upprætta síðuna, vinarliga loys tað einfalda roknistykki niðanfyri og skriva svarið í teigin ([[Special:Captcha/help|meira kunning]]):',
-	'captcha-sendemail' => 'Fyri at hjálpa okkum at sleppa undan sjálvvirkandi upprættan av brúkaranavni (spamm), so verður tú vinarliga biðin um at loysa tað einfalda roknistykki og skriva svarið í teigin ([[Special:Captcha/help|meira kunning]]):', # Fuzzy
+	'captcha-sendemail' => 'Fyri at hjálpa okkum at sleppa undan sjálvvirkandi upprættan av brúkaranavni (spamm), so verður tú vinarliga biðin um at loysa tað einfalda roknistykki og skriva svarið í teigin ([[Special:Captcha/help|meira kunning]]):',
 	'captcha-sendemail-fail' => 'Skeiv ella manglandi váttanar loyniorð.',
 	'captcha-disabledinapi' => "Henda handling krevur ein captcha, so tað kann ikki verða framt við API'inum.",
 	'captchahelp-title' => 'Captcha hjálp',
@@ -1316,7 +1370,7 @@ Parfois, particulièrement lors de l’ajout de nouveaux liens externes dans une
 Cette tâche étant difficile à accomplir de façon automatisée, cela permet à la plupart des humains de réaliser leurs contributions tout en stoppant la plupart des spammeurs et autres attaquants robotisés.
 
 Malheureusement, cette solution peut gêner les utilisateurs malvoyants ou qui utilisent un navigateur en texte seul ou vocal. Nous ne disposons pas d’alternative audio pour l’instant.
-Veuillez contacter [[{{MediaWiki:Grouppage-sysop}}|les administrateurs du site]] si cela vous empêche de façon inattendue de faire des contributions légitimes.
+Veuillez contacter [[Special:ListAdmins|les administrateurs du site]] si cela vous empêche de façon inattendue de faire des contributions légitimes.
 
 Cliquez sur le bouton « Précédent » de votre navigateur pour revenir à la page de modification.',
 	'captcha-addurl-whitelist' => ' #<!-- laissez cette ligne exactement telle quelle --><pre>
@@ -1353,7 +1407,7 @@ Mâlésiê a fâre de façon ôtomatisâ cél travâly, cen pèrmèt a la plepâ
 
 Mâlherosament, ceta solucion pôt gênar los usanciérs mâl-veyents ou qu’utilisont un navigator en tèxto solèt ou ben vocal.
 Por lo moment, nos avens gins d’altèrnativa ôdiô.
-Vos volyéd veriér vers los [[{{MediaWiki:Grouppage-sysop}}|administrators du seto]] se cen vos empache de façon emprèvua de fâre des contribucions lèg·itimes.
+Vos volyéd veriér vers los [[Special:ListAdmins|administrators du seto]] se cen vos empache de façon emprèvua de fâre des contribucions lèg·itimes.
 
 Clicâd sur lo boton « Devant » de voutron navigator por tornar a la bouèta d’èdicion.',
 	'captcha-addurl-whitelist' => ' #<!-- lèssiéd ceta legne justo d’ense --> <pre>
@@ -1416,12 +1470,12 @@ $messages['gl'] = array(
 	'captcha-desc' => 'Proporciona CAPTCHA como protección fronte ao spam e ao descubrimento de contrasinais',
 	'captcha-label' => 'CAPTCHA',
 	'captcha-addurl' => 'A súa edición inclúe novas ligazóns externas.
-Para contribuír na protección contra as ferramentas de publicación automática de ligazóns publicitarias, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
-	'captcha-badlogin' => 'Para contribuír a que non se descubran os contrasinais por medios automáticos, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
-	'captcha-createaccount' => 'Para contribuír contra a creación automatizada de contas, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
+Para protexer o wiki contra o spam automático, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
+	'captcha-badlogin' => 'Para protexer o wiki contra o roubo de contrasinais, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
+	'captcha-createaccount' => 'Para protexer o wiki contra a creación automática de contas, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
 	'captcha-createaccount-fail' => 'Falta o código de confirmación ou é incorrecto.',
 	'captcha-create' => 'Para crear a páxina, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
-	'captcha-sendemail' => 'Para contribuír na protección contra as ferramentas de publicación automática de ligazóns publicitarias, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
+	'captcha-sendemail' => 'Para protexer o wiki contra o spam automático, resolva a suma que aparece a continuación e introduza a resposta na caixa ([[Special:Captcha/help|máis información]]):',
 	'captcha-sendemail-fail' => 'Falta o código de confirmación ou é incorrecto.',
 	'captcha-disabledinapi' => 'Esta acción necesita o captcha, polo que non se pode realizar a través da API.',
 	'captchahelp-title' => 'Axuda acerca do CAPTCHA',
@@ -1434,14 +1488,14 @@ Como esta tarefa é difícil de automatizar, permite distinguir entre persoas e
 
 Por desgraza, isto é un inconveniente para aqueles usuarios con dificultades de visión ou que utilicen navegadores de texto ou navegadores baseados en sistemas de voz.
 Polo de agora non dispoñemos dunha alternativa de son.
-Por favor, póñase en contacto cun [[{{MediaWiki:Grouppage-sysop}}|administrador do sitio]] para solicitar axuda se o sistema lle impide rexistrarse para facer contribucións lexítimas.
+Por favor, póñase en contacto cun [[Special:ListAdmins|administrador do sitio]] para solicitar axuda se o sistema lle impide rexistrarse para facer contribucións lexítimas.
 
 Prema no botón "Atrás" do seu navegador para volver á páxina de edición.',
 	'captcha-addurl-whitelist' => ' #<!-- Deixe esta liña tal e como está --> <pre>
 # A sintaxe é a seguinte:
 #   * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
 #   * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos URL
-  #</pre> <!-- Deixe esta liña tal e como está -->',
+ #</pre> <!-- Deixe esta liña tal e como está -->',
 	'right-skipcaptcha' => 'Levar a cabo as accións que requiren CAPTCHA sen ter que introducilo',
 );
 
@@ -1478,7 +1532,7 @@ In e Teil Fäll, v. a. wänn neiji Link in e Syte dryygfiegt wäre, cha s syy, a
 
 Leider cha des derzue fiere, ass Lyt Probläm iberchemme, wu ne yygschränkti Sähfähigkeit oder e Browser bruche, wu täxt- oder sprochbasiert isch.
 Im Momänt hän mir kei Audioalternative z Verfiegig.
-Bitte nimm Kontakt uf zum [[{{MediaWiki:Grouppage-sysop}}|Syteadministrator]] fir Unterstitzig wänn des Di uuerwartet abhaltet vu berächtigte Byyträg.
+Bitte nimm Kontakt uf zum [[Special:ListAdmins|Syteadministrator]] fir Unterstitzig wänn des Di uuerwartet abhaltet vu berächtigte Byyträg.
 
 Ins Bearbeitigsfänschter chunnt mer derno eifach wider mit em „Zruck“-Chnopf.',
 	'captcha-addurl-whitelist' => ' #<!-- Die Zyyle derf nit gänderet wäre! --> <pre>
@@ -1509,13 +1563,13 @@ $messages['gu'] = array(
 	'captcha-disabledinapi' => 'આ ક્રિયા માટે કેપ્ચાની જરૂર છે, માટે તે API દ્વારા પાર પાડી શકાય તેમ નથી.',
 	'captchahelp-title' => 'કેપ્ટ્ચા/કેપ્ચા (Captcha) મદદ',
 	'captchahelp-cookies-needed' => 'આ વ્યવસ્થિત રીતે જોઇ શકાય તે માટે તમારા બ્રાઉઝરમાં કુકીઝ એનેબલ કરેલી હોવી જોઇશે.',
-	'captchahelp-text' => "આપણી વિકિ જેવી વૅબ સાઇટો કે જે લોકોને યોગદાન કરવાની પરવાનગી આપે છે, તેમનો સ્પામરો દ્વારા દુરૂપયોગ થતો આવ્યો છે. આવા સ્પામરો તેમની કડીઓ એક સાથે અનેક વૅબ સાઇટો પર મુકવા માટે સ્વચાલિત સાધનો વાપરે છે. આવી કડીઓ ખરેખર એક દૂષણ છે અને તેને દૂર કરવાના ઉપાય કરવા જોઇએ.
+	'captchahelp-text' => 'આપણી વિકિ જેવી વૅબ સાઇટો કે જે લોકોને યોગદાન કરવાની પરવાનગી આપે છે, તેમનો સ્પામરો દ્વારા દુરૂપયોગ થતો આવ્યો છે. આવા સ્પામરો તેમની કડીઓ એક સાથે અનેક વૅબ સાઇટો પર મુકવા માટે સ્વચાલિત સાધનો વાપરે છે. આવી કડીઓ ખરેખર એક દૂષણ છે અને તેને દૂર કરવાના ઉપાય કરવા જોઇએ.
 
 ક્યારેક, ખાસ કરીને જ્યારે તમે તમારા લેખમાં બાહ્ય કડી ઉમેરતા હોવ ત્યારે, વિકિ તમને એક રંગીન કે તુટેલા-ફુટેલા અક્ષરો કે શબ્દોનું ચિત્ર બતાવે અને તેમા વંચાતા શબ્દો બાજુનાં ખાનામાં લખવા માટે પુછે એવું બને. આનું કારણ એ છે કે આ એક એવી પદ્ધતિ છે જે સ્વચાલિત રીતે કરવી લગભગ અશક્ય છે, અને ફક્ત વ્યક્તિગત રીતે જ થઇ શકે છે, જે સ્પામરો અને અન્ય ઘુસણખોરો ના હુમલાને ખાળે છે.
 
-કમભાગ્યે આ પદ્ધતિ, એવા લોકોને તકલિફ આપે તેમ છે જેઓની દૃષ્ટિ નબળી છે અથવાતો જેઓ વાચા આધારીત કે સાદા બ્રાઉઝરનો ઉપયોગ કરે છે. હાલમા અમારી પાસે આવા ચિત્રોની વાચા આધારિત વ્યવસ્થા નથી. જો આ કારણે આપ કોઇ લેખમાં પ્રદાન ન કરી શકતા હોવ તો વધુ સહાય માટે કૃપા કરી [[{{MediaWiki:Grouppage-sysop}}|site administrators]] નો સંપર્ક સાધો.
+કમભાગ્યે આ પદ્ધતિ, એવા લોકોને તકલીફ આપે તેમ છે જેઓની દ્રષ્ટિ નબળી છે અથવા તો જેઓ વાચા આધારીત કે સાદા બ્રાઉઝરનો ઉપયોગ કરે છે. હાલમાં અમારી પાસે આવા ચિત્રોની વાચા આધારિત વ્યવસ્થા નથી. જો આ કારણે આપ કોઇ લેખમાં પ્રદાન ન કરી શકતા હોવ તો વધુ સહાય માટે કૃપા કરી [[Special:ListAdmins|site administrators]] નો સંપર્ક સાધો.
 
-લેખમા ફેરફાર કરવાના પાના ઉપર પાછા ફરવા માટે આપના બ્રાઉઝરના 'બેક' બટન ઉપર ક્લિક કરો.",
+લેખમા ફેરફાર કરવાના પાના ઉપર પાછા ફરવા માટે આપના બ્રાઉઝરના "પાછા જાવ" બટન ઉપર ક્લિક કરો.',
 	'captcha-addurl-whitelist' => ' #<!-- આ લીટીને જેમ છે તેમ જ રહેવા દો --> <pre>
 # સીન્ટેક્સ (Syntax) આ પ્રમાણે છે :
 #  * "#" સંજ્ઞાથી શરૂ કરીને લીટીના અંત સુધીનું વર્ણન એક ટીપ્પણી છે
@@ -1526,13 +1580,14 @@ $messages['gu'] = array(
 
 /** Hebrew (עברית)
  * @author Amire80
+ * @author Guycn2
  * @author Rotem Liss
  * @author Rotemliss
  * @author YaronSh
  */
 $messages['he'] = array(
 	'captcha-edit' => 'כדי לערוך את הדף, אנא פתרו את תרגיל החיבור הפשוט שלהלן והקלידו את התשובה בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
-	'captcha-desc' => 'מתן טכניקות CAPTCHA להגנה נגד זיבול וניחוש ססמאות',
+	'captcha-desc' => 'מתן טכניקות CAPTCHA להגנה נגד ספאם וניחוש סיסמאות',
 	'captcha-label' => 'CAPTCHA',
 	'captcha-addurl' => 'עריכתכם כוללת קישורים חיצוניים חדשים.
 לשם הגנה מפני ספאם אוטומטי, אנא פתרו את תרגיל החיבור הפשוט שלהלן והקלידו את התשובה בתיבה כדי לשמור את עריכתכם ([[Special:Captcha/help|מידע נוסף]]):',
@@ -1553,7 +1608,7 @@ $messages['he'] = array(
 
 לרוע המזל, הדבר עשוי לגרום לאי נוחות למשתמשים עם דפדפן בגרסה מוגבלת, או שמשתמשים בדפדפנים מבוססי טקסט או דיבור.
 כרגע, אין לנו חלופה קולית זמינה.
-אנא צרו קשר עם [[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] כדי לקבל עזרה אם המערכת מונעת מכם באופן בלתי צפוי לבצע עריכות לגיטימיות.
+אנא צרו קשר עם [[Special:ListAdmins|מפעילי המערכת]] כדי לקבל עזרה אם המערכת מונעת מכם באופן בלתי צפוי לבצע עריכות לגיטימיות.
 
 לחצו על הכפתור \'חזור\' בדפדפן שלכם כדי לחזור לדף העריכה.',
 	'captcha-addurl-whitelist' => ' #<!-- יש להשאיר שורה זו בדיוק כפי שהיא כתובה --> <pre>
@@ -1593,7 +1648,7 @@ $messages['hi'] = array(
 
 दुर्भाग्यवश इससे सीमित चक्षु-दृष्टि वाले सदस्यों या पाठ-आधारित या वाचन-आधारित विचरकों का प्रयोग करने वाले  सदस्यों को समस्या आती है।
 इस समय हमारे पास इसका श्रव्य विकल्प उपलब्ध नहीं है।
-यदि इसकी वजह से आपको वैध लेख लिखने में अवरोध आ रहा हो तो कृपया सहायता के लिए [[{{MediaWiki:Grouppage-sysop}}|स्थल प्रबंधकों]] से संपर्क करें।
+यदि इसकी वजह से आपको वैध लेख लिखने में अवरोध आ रहा हो तो कृपया सहायता के लिए [[Special:ListAdmins|स्थल प्रबंधकों]] से संपर्क करें।
 
 पन्ना संपादन पर वापस जाने के लिए अपने विचरक पर 'एक पृष्ठ पीछे जाएँ' वाली कुंजी का प्रयोग करें।",
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -1633,7 +1688,7 @@ Ponekad, a naročito kad se dodaje web poveznica na stranicu, wiki može prikaza
 Budući da je takvu radnju teško automatizirati, to će omogućiti pravim suradnicima njihov nastavak u pridonošenju, dok će zaustaviti većinu spamera i robotskih napadača.
 
 Na žalost, ovo može biti nepristupačno za suradnike koji koriste tekstualne klijene ili one glasovno bazirane. Trenutačno nemamo glasovnu podršku za ovo.
-Molimo obratite se [[{{MediaWiki:Grouppage-sysop}}|administratorima]] za pomoć, ukoliko Vas ovo ometa pri dodavanju važećih sadržaja.
+Molimo obratite se [[Special:ListAdmins|administratorima]] za pomoć, ukoliko Vas ovo ometa pri dodavanju važećih sadržaja.
 
 Pritisnite u svom pregledniku 'nazad' kako bi se vratili na uređivač stranice.",
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -1668,7 +1723,7 @@ Dokelž to je nadawk, kotryž hodźi so jenož ćežko awtomatizować, dowoluje
 
 Bohužel móže to k wobćežnosćam za tutych wužiwarjow wjesć, kotrychž kmanosć widźenja je wobmjezowana abo kotřiž wobhladowaki wužiwaja, kotrež na tekst abo rěčne wudawanje bazěruja.
 Tuchwilu njedisponujemy wo awdioalternatiwje.
-Prošu staj so z [[{{MediaWiki:Grouppage-sysop}}|administratorami sydła]] z prostwu wo pomoc do zwiska, jeli to će haći legitimne powěsće pósłać.
+Prošu staj so z [[Special:ListAdmins|administratorami sydła]] z prostwu wo pomoc do zwiska, jeli to će haći legitimne powěsće pósłać.
 
 Klikń na tłócatko "Wróćo" w swojim wobhladowaku, zo by so k editorej wróćił.',
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -1715,7 +1770,7 @@ $messages['hu'] = array(
 
 Az ilyen linkek kézi eltávolítása rengeteg energiát emésztene fel, ezért néha, különösen ha egy külső linket teszel egy cikkbe, a wiki egy valamilyen módon eltorzított szöveget (captcha-t) jelenít meg, és arra kér, hogy gépeld be azt. Mivel ezt automatikusan nagyon nehéz megtenni, a valódi szerkesztők így könnyen megkülönböztethetőek a spammerek robotjaitól.
 
-Sajnos ez komoly kényelmetlenséget jelenthet azoknak a felhasználóknak, akik gyengén látnak, vagy szöveges/hang-alapú böngészőt használnak. Jelenleg nem tudunk hang-alapú alternatívával szolgálni; ha a captcha megakadályoz abban, hogy szerkeszd a wikit, vedd fel a kapcsolatot az [[{{MediaWiki:Grouppage-sysop}}|adminisztrátorokkal]].
+Sajnos ez komoly kényelmetlenséget jelenthet azoknak a felhasználóknak, akik gyengén látnak, vagy szöveges/hang-alapú böngészőt használnak. Jelenleg nem tudunk hang-alapú alternatívával szolgálni; ha a captcha megakadályoz abban, hogy szerkeszd a wikit, vedd fel a kapcsolatot az [[Special:ListAdmins|adminisztrátorokkal]].
 
 Ha a captcha megoldása helyett inkább visszatérnél a szöveg szerkesztéséhez, használd a böngésződ „vissza” gombját.',
 	'captcha-addurl-whitelist' => ' #<!-- ezt a sort hagyd pontosan így --> <pre>
@@ -1742,12 +1797,12 @@ $messages['ia'] = array(
 	'captcha-desc' => 'Forni technicas CAPTCHA de protection contra spam e discoperta de contrasignos',
 	'captcha-label' => 'CAPTCHA',
 	'captcha-addurl' => 'Tu modification include nove ligamines externe.
-Como protection contra le spam automatic, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):', # Fuzzy
-	'captcha-badlogin' => 'Como protection contra le piratage automatic de contrasignos, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):', # Fuzzy
-	'captcha-createaccount' => 'Como protection contra le creation automatic de contos, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):', # Fuzzy
+Pro proteger le wiki contra le spam automatisate, per favor resolve le simple summa hic infra e entra le resultato in le quadro a fin de salveguardar tu modification ([[Special:Captcha/help|plus info]]):',
+	'captcha-badlogin' => 'Pro proteger le wiki contra le furto automatisate de contrasignos, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):',
+	'captcha-createaccount' => 'Pro proteger le wiki contra le creation automatisate de contos, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):',
 	'captcha-createaccount-fail' => 'Codice de confirmation incorrecte o mancante.',
 	'captcha-create' => 'Pro crear le pagina, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):',
-	'captcha-sendemail' => 'Como protection contra le spam automatic, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):', # Fuzzy
+	'captcha-sendemail' => 'Pro proteger le wiki contra le spam automatisate, per favor resolve le simple summa hic infra e entra le resultato in le quadro ([[Special:Captcha/help|plus info]]):',
 	'captcha-sendemail-fail' => 'Codice de confirmation incorrecte o mancante.',
 	'captcha-disabledinapi' => 'Iste action require un captcha, dunque illo non pote esser exequite per medio del API.',
 	'captchahelp-title' => 'Adjuta super le captcha',
@@ -1760,7 +1815,7 @@ Post que isto es un carga difficile de automatisar, isto permittera al major par
 
 Infelicemente isto pote incommodar le usatores con vision limitate o usante navigatores a base de texto o synthese vocal.
 Al momento nos non dispone de un alternativa audio.
-Per favor contacta le [[{{MediaWiki:Grouppage-sysop}}|administratores del sito]] pro assistentia si isto insperatemente te impedi de facer contributiones legitime.
+Per favor contacta le [[Special:ListAdmins|administratores del sito]] pro assistentia si isto insperatemente te impedi de facer contributiones legitime.
 
 Clicca le button 'retro' in tu navigator pro retornar al pagina de modification.",
 	'captcha-addurl-whitelist' => ' #<!-- non modificar in alcun modo iste linea --> <pre>
@@ -1774,26 +1829,29 @@ Clicca le button 'retro' in tu navigator pro retornar al pagina de modification.
 /** Indonesian (Bahasa Indonesia)
  * @author Borgx
  * @author Farras
+ * @author Ilham151096
  * @author IvanLanin
  * @author Iwan Novirion
+ * @author Kenrick95
  * @author Rex
  */
 $messages['id'] = array(
 	'captcha-edit' => 'Untuk menyunting halaman ini, harap pecahkan penjumlahan sederhana di bawah ini dan masukkan jawaban di kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
 	'captcha-desc' => 'Menyediakan teknik captcha untuk melindungi terhadap spam dan penebakan sandi',
 	'captcha-label' => 'CAPTCHA',
-	'captcha-addurl' => "Suntingan Anda menyertakan pranala luar baru. Sebagai pelindungan terhadap ''spam'' otomatis, Anda harus mengetikkan kata atau hasil perhitungan yang tertera berikut ini:<br />
-([[Special:Captcha/help|info lengkap]])", # Fuzzy
-	'captcha-badlogin' => 'Untuk membantu pelindungan terhadap perengkahan kunci sandi otomatis, tolong masukkan kata atau hasil perhitungan sederhana berikut dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):', # Fuzzy
-	'captcha-createaccount' => 'Sebagai pelindungan terhadap spam, Anda diharuskan untuk mengetikkan kata atau hasil perhitungan di bawah ini di kotak yang tersedia untuk dapat mendaftarkan pengguna baru:<br />
-([[Special:Captcha/help|info lengkap]])', # Fuzzy
+	'captcha-addurl' => "Suntingan Anda menyertakan pranala luar baru.
+Sebagai pelindungan terhadap ''spam'' otomatis, Anda harus mengetikkan hasil perhitungan sederhana berikut ini 
+([[Special:Captcha/help|info lengkap]]):",
+	'captcha-badlogin' => 'Untuk melindungi wiki ini dari perengkahan kunci sandi otomatis, harap masukkan hasil perhitungan sederhana berikut dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
+	'captcha-createaccount' => 'Untuk melindungi wiki ini dari pembuatan akun otomatis, kami meminta Anda untuk mengetikkan hasil perhitungan sederhana di bawah ini dalam kotak yang tersedia 
+([[Special:Captcha/help|info lengkap]]):',
 	'captcha-createaccount-fail' => 'Kode konfirmasi salah atau belum diisi.',
 	'captcha-create' => 'Untuk menyunting halaman ini, silakan pecahkan penjumlahan sederhana di bawah ini dan masukkan jawaban di kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
-	'captcha-sendemail' => 'Sebagai pelindungan terhadap spam, silakan pecahkan penjumlahan sederhana di bawah ini dan masukkan jawaban di kotak yang tersedia ([[Special:Captcha/help|more info]]):', # Fuzzy
+	'captcha-sendemail' => 'Untuk melindungi wiki ini dari spam otomatis, kami meminta Anda untuk memecahkan penjumlahan sederhana di bawah ini dan masukkan jawaban di kotak yang tersedia ([[Special:Captcha/help|more info]]):',
 	'captcha-sendemail-fail' => 'Kode konfirmasi salah atau belum diisi.',
 	'captcha-disabledinapi' => 'Tindakan ini membutuhkan captcha, sehingga tidak dapat dilakukan melalui API.',
 	'captchahelp-title' => 'Mengenai Captcha',
-	'captchahelp-cookies-needed' => 'Anda perlu mengaktifkan cookie pada penjelajah web Anda untuk menggunakan fitur ini.',
+	'captchahelp-cookies-needed' => 'Anda perlu mengaktifkan kuki pada peramban web Anda untuk menggunakan fitur ini.',
 	'captchahelp-text' => "Situs-situs web yang menerima tulisan dari publik, seperti wiki ini, kerapkali disalahgunakan oleh pengguna-pengguna yang tidak bertanggungjawab untuk mengirimkan spam dengan menggunakan program-program otomatis.
 Walaupun pranala-pranala spam tersebut dapat dibuang, tetapi tetap saja menimbulkan gangguan berarti.
 
@@ -1802,7 +1860,7 @@ Karena ini merupakan suatu pekerjaan yang sulit diotomatisasi, pembatasan ini ak
 
 Sayangnya, hal ini dapat menimbulkan kesulitan bagi pengguna dengan keterbatasan penglihatan atau pengguna yang menggunakan penjelajah web berbasis-teks atau berbasis-suara.
 Saat ini, kami belum memiliki suatu alternatif suara untuk hal ini.
-Silakan hubungi [[{{MediaWiki:Grouppage-sysop}}|pengurus]] untuk meminta bantuan jika hal ini menghambat Anda untuk mengirimkan suntingan yang layak.
+Silakan hubungi [[Special:ListAdmins|pengurus]] untuk meminta bantuan jika hal ini menghambat Anda untuk mengirimkan suntingan yang layak.
 
 Tekan tombol 'back' di penjelajah web Anda untuk kembali ke halaman penyuntingan.",
 	'captcha-addurl-whitelist' => ' #<!-- biarkan baris ini sebagaimana adanya --> <pre>
@@ -1839,7 +1897,7 @@ Yantangay daytoy ket obra a narigat a ma-automatiko, agpalubos kadagiti agpayso
 
 Daksangasat a padaksan na dagiti agar-aramat a marigatan nga agkita wenno agus-usar ti naibasta ti teksto wenno naibasta ti bitla a pagbasabasa.
 Awan pay tatta ti mangeg a pagpilian a mabalin a gun-oden.
-Pangngaasi a kontaken ti [[{{MediaWiki:Grouppage-sysop}}|administrador ti pagsaadan]] para iti tulong no daytoy ket saan a napadpadaanan a mangpawil ti lehitimado a panagtiynaymo.
+Pangngaasi a kontaken ti [[Special:ListAdmins|administrador ti pagsaadan]] para iti tulong no daytoy ket saan a napadpadaanan a mangpawil ti lehitimado a panagtiynaymo.
 
 Peslen ti 'agsubli' a buton dita pagbasabasam (browser) ti agsubli idiay panid ti panag-urnos.",
 	'captcha-addurl-whitelist' => ' #<!-- baybayam nga kasta daytoy nga linia --> <pre>
@@ -1873,7 +1931,7 @@ auglýsingarusli, vinsamlegast finndu summuna að neðan og skrifaðu svarið í
 Stundum þegar þú breytir síðum, sérstaklega ef breytingin felur í sér nýja tengla á aðra vefi, getur gerst að þú sért beðin(n) um að skrifa inn orð sem birtast á lituðum eða óskýrum myndum. Fyrir flesta mannlega notendur er þetta lítið mál en sjálfvirk tól ráða ekki við þetta.
 
 Því miður kann þetta að valda notendum óþægindum sem hafa skerta sjón eða notast við talmálsvafra. Enn sem komið er eru ekki til aðrir valkostir fyrir þau tilvik. 
-Vinsamlegast hafðu samband við [[{{MediaWiki:Grouppage-sysop}}|stjórnanda síðunnar]] til að fá aðstoð ef þetta kemur í veg fyrir lögmætar breytingar af þinni hálfu.
+Vinsamlegast hafðu samband við [[Special:ListAdmins|stjórnanda síðunnar]] til að fá aðstoð ef þetta kemur í veg fyrir lögmætar breytingar af þinni hálfu.
 
 Notaðu „til-baka“-hnapp vafrans til að breyta síðunni.',
 	'right-skipcaptcha' => 'Geta gert aðgerðir án þess að nota kæfuvörn',
@@ -1892,7 +1950,7 @@ $messages['it'] = array(
 	'captcha-label' => 'CAPTCHA',
 	'captcha-addurl' => "La modifica richiesta aggiunge dei nuovi collegamenti esterni alla pagina; come misura precauzionale contro l'inserimento automatico di spam, si prega di risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|come funziona?]]):",
 	'captcha-badlogin' => 'Come misura precauzionale contro i tentativi di forzatura automatica della password, si prega di risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|come funziona?]]):',
-	'captcha-createaccount' => 'Come misura precauzionale contro i tentativi di creazione automatica degli account, si prega di risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|come funziona?]]):',
+	'captcha-createaccount' => 'Come misura precauzionale contro i tentativi di registrazione automatica, si prega di risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella ([[Special:Captcha/help|come funziona?]]):',
 	'captcha-createaccount-fail' => 'Codice di verifica errato o mancante.',
 	'captcha-create' => 'Per creare la pagina è necessario risolvere il semplice calcolo presentato di seguito e inserire il risultato nella casella:<br />
 ([[Special:Captcha/help|maggiori informazioni]]):',
@@ -1905,7 +1963,7 @@ $messages['it'] = array(
 
 In alcuni casi, ad esempio quando si tenta di aggiungere nuovi collegamenti web in una pagina, il software wiki può mostrare una immagine con un breve testo colorato e/o distorto chiedendo di riscriverlo in un'apposita finestrella. Poiché si tratta di un'azione difficile da replicare da parte di un computer, questo meccanismo consente a (quasi tutti) gli utenti reali di completare l'inserimento desiderato, impedendo l'accesso alla maggior parte degli spammer e degli altri attacchi automatizzati.
 
-Sfortunatamente, queste misure di sicurezza possono mettere in difficoltà gli utenti con problemi visivi o coloro che utilizzano browser testuali o basati sulla sintesi vocale. Purtroppo al momento non è disponibile un meccanismo alternativo basato su messaggi audio; se queste procedure impediscono l'inserimento informazioni che si ritengono legittime, si prega di contattare gli [[{{MediaWiki:Grouppage-sysop}}|amministratori del sito]] e chiedere loro assistenza.
+Sfortunatamente, queste misure di sicurezza possono mettere in difficoltà gli utenti con problemi visivi o coloro che utilizzano browser testuali o basati sulla sintesi vocale. Purtroppo al momento non è disponibile un meccanismo alternativo basato su messaggi audio; se queste procedure impediscono l'inserimento informazioni che si ritengono legittime, si prega di contattare gli [[Special:ListAdmins|amministratori del sito]] e chiedere loro assistenza.
 
 Fare clic sul pulsante \"indietro\" del browser per tornare alla pagina di modifica.",
 	'captcha-addurl-whitelist' => ' #<!-- non modificare in alcun modo questa riga --> <pre>
@@ -1947,7 +2005,7 @@ $messages['ja'] = array(
 
 しかし、残念なことに、この方法により、視力が低い利用者や、テキストベースあるいは音声ベースのブラウザーを使用している利用者にご不便をおかけする場合があります。
 現時点では、音声による代替方法はありません。
-正当な操作をするにあたって本機能が障害となっている場合、[[{{MediaWiki:Grouppage-sysop}}|サイト管理者]]に連絡して協力を求めてください。
+正当な操作をするにあたって本機能が障害となっている場合、[[Special:ListAdmins|サイト管理者]]に連絡して協力を求めてください。
 
 ページの編集に戻るには、ブラウザーの「戻る」ボタンを押してください。',
 	'captcha-addurl-whitelist' => ' #<!-- この行は変更しないでください --> <pre>
@@ -1959,6 +2017,7 @@ $messages['ja'] = array(
 );
 
 /** Jutish (jysk)
+ * @author Christian List
  * @author Huslåke
  * @author Ælsån
  */
@@ -1966,9 +2025,9 @@ $messages['jut'] = array(
 	'captcha-edit' => 'For at redigere denne side, skal du give svaret på regnestyket nedenfor, og angive resultatet i feltet under det. ([[Special:Captcha/help|mere information]]):',
 	'captcha-desc' => 'Semple captcha implementåsje', # Fuzzy
 	'captcha-addurl' => 'Din redigering tilføjer nye eksterne henvisninger til artiklen. Som beskyttelse mod automatiseret spam, skal du give svaret på regnestyket nedenfor, og angive resultatet i feltet under det. ([[Special:Captcha/help|mere information]]):', # Fuzzy
-	'captcha-badlogin' => 'For at beskytte mod automatiserede gæt på kodeord, skal du give svaret på regnestyket nedenfor, og angive resultatet i feltet under det. ([[Special:Captcha/help|mere information]]):', # Fuzzy
+	'captcha-badlogin' => 'For at beskytte mod automatiske forsøg på at gætte adgangskoden, skal du give svaret på regnestykket nedenfor, og angive resultatet i feltet under det. ([[Special:Captcha/help|mere information]]):',
 	'captcha-createaccount' => 'For at beskytte mod automatisk oprettelse af brugernavne, skal du give svaret på regnestyket nedenfor, og angive resultatet i feltet under det. ([[Special:Captcha/help|mere information]]):', # Fuzzy
-	'captcha-createaccount-fail' => 'Forkert eller manglende kodeord.',
+	'captcha-createaccount-fail' => 'Forkert eller manglende bekræftelseskode.',
 	'captcha-create' => 'For at oprette en ny side, skal du give svaret på regnestyket nedenfor, og angive resultatet i feltet under det. ([[Special:Captcha/help|mere information]]):',
 	'captchahelp-title' => 'Captcha-hjælp',
 	'captchahelp-cookies-needed' => 'Din browser skal understøtte cookies, før dette kan gennemføres.',
@@ -2009,7 +2068,7 @@ Kanggo ngéwangi ngreksa lawan ''spam'' otomatis, tulung pecahna itung-itungan i
 Kadhangkala, utamané yèn mènèhi pranala wèb anyar ing sawijinig kaca, wiki iki bisa nuduhaké gambar sawijining gambar tulisan sing ana wernané utawa sing rusak lan njaluk panjenengan ngetik ulang tembung sing ana gambar iki.
 Amerga pagawéyan iki angèl diotomatisasi, pawatesan iki bisa ngidinaké mèh kabèh wong asli mbanjuraké sumbangsihé ngirim suntingan nanging menggak para pangirim spam lan robot otomatis.
 
-Émané, perkara iki bisa nggawé sawetara panganggo kangélan nyunting kaca iki, utamané sing daya pandelengané kurang utawa para panganggo sing nganggo panjlajah tèks adhedhasar tèks utawa swara. Saiki iki awaké dhéwé ora duwé alternatif audio kanggo iki. Mangga nyuwun pitulung karo [[{{MediaWiki:Grouppage-sysop}}|para pangurus]] yèn perkara iki menggak panjenengan ngirimaké suntingan sing layak.
+Émané, perkara iki bisa nggawé sawetara panganggo kangélan nyunting kaca iki, utamané sing daya pandelengané kurang utawa para panganggo sing nganggo panjlajah tèks adhedhasar tèks utawa swara. Saiki iki awaké dhéwé ora duwé alternatif audio kanggo iki. Mangga nyuwun pitulung karo [[Special:ListAdmins|para pangurus]] yèn perkara iki menggak panjenengan ngirimaké suntingan sing layak.
 
 Pencèten tombol 'back' ing panjlajah wèb panjenengan kanggo bali menyang kaca panyuntingan.",
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -2047,7 +2106,7 @@ $messages['ka'] = array(
 
 სამწუხაროდ, მსგავსმა დაცვამ შეიძლება დისკომფორტი შეუქმნას სუსტი მხედველობის მქონე ადამიანებს, ან მათ ვინც იყენებს ტექსტურ ან კითხვად ბრაუზერებს.
 ამჟამად ჩვენ არ გვაქვს ამ შემოწმების ხმოვანი ალტერნატივა.
-გთხოვთ, თუ მსგავსი შემოწმება ხელს გიშლით საიტზე კეთილსინდისიერ მუშაობაში, დახმარებისათვის მიმართეთ [[{{MediaWiki:Grouppage-sysop}}|ადმინისტრატორებს]].
+გთხოვთ, თუ მსგავსი შემოწმება ხელს გიშლით საიტზე კეთილსინდისიერ მუშაობაში, დახმარებისათვის მიმართეთ [[Special:ListAdmins|ადმინისტრატორებს]].
 
 თქვენ ბრაუზერში დააჭირეთ ღილაკს „უკან“, რათა დაუბრუნდეთ რედაქტირებას.',
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -2154,9 +2213,9 @@ Bet öñdewine qaýtw barw üşin «Artqa» degen tüýmesin basıñız.', # Fuz
 $messages['km'] = array(
 	'captcha-edit' => 'ដើម្បីកែប្រែ​ទំព័រនេះ សូមដោះស្រាយ​ប្រមាណវិធីបូក​ខាងក្រោម​នេះរួច​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិន([[Special:Captcha/help|ព័ត៌មាន​បន្ថែម]])៖',
 	'captcha-desc' => 'ផ្ដល់បច្ចេកទេស CAPTCHA ដើម្បីការពារពីស្ប៉ាមនិងការការទាយពាក្យសំងាត់',
-	'captcha-addurl' => 'កំណែ​របស់អ្នក​មាន​តំណភ្ជាប់ក្រៅ​ថ្មី។ ដើម្បី​ជួយបង្ការ​ស្ប៉ាម​ស្វ័យប្រវត្តិ សូមដោះស្រាយ​ប្រមាណវិធីបូក​ខាងក្រោម​នេះរួច​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិន([[Special:Captcha/help|ព័ត៌មាន​បន្ថែម]])៖', # Fuzzy
-	'captcha-badlogin' => 'ដើម្បីការពារការបំបែកពាក្យសំងាត់ដោយស្វ័យប្រវត្តិ សូមដោះស្រាយផលបូកខាងក្រោមរួចបញ្ជូលចម្លើយទៅក្នុងប្រអប់ ([[Special:Captcha/help|ព័ត៌មានបន្ថែម]])៖', # Fuzzy
-	'captcha-createaccount' => 'ដើម្បី​បង្ការការបង្កើត​គណនី​ស្វ័យប្រវត្តិ សូមដោះស្រាយ​ប្រមាណវិធីបូក​ខាងក្រោម​នេះរួច​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិន([[Special:Captcha/help|ព័ត៌មាន​បន្ថែម]])៖', # Fuzzy
+	'captcha-addurl' => 'កំណែ​របស់អ្នក​មាន​តំណភ្ជាប់ក្រៅ​ថ្មី។ ដើម្បី​ជួយបង្ការ​ស្ប៉ាម​ស្វ័យប្រវត្តិ សូមដោះស្រាយ​ប្រមាណវិធីបូក​ខាងក្រោម​នេះរួច​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិនមុនពេលរក្សាទុកកំណែរបស់អ្នក([[Special:Captcha/help|ព័ត៌មាន​បន្ថែម]])៖',
+	'captcha-badlogin' => 'ដើម្បីការពារការបំបែកពាក្យសម្ងាត់ដោយស្វ័យប្រវត្តិ សូមដោះស្រាយផលបូកខាងក្រោមរួចបញ្ជូលចម្លើយទៅក្នុងប្រអប់ ([[Special:Captcha/help|ព័ត៌មានបន្ថែម]])៖',
+	'captcha-createaccount' => 'ដើម្បី​បង្ការការបង្កើត​គណនី​ស្វ័យប្រវត្តិ សូមដោះស្រាយ​ប្រមាណវិធីបូក​ខាងក្រោម​នេះរួច​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិន([[Special:Captcha/help|ព័ត៌មាន​បន្ថែម]])៖',
 	'captcha-createaccount-fail' => 'កូដផ្ទៀងផ្ទាត់បាត់បង់ឬមិនត្រឹមត្រូវ។',
 	'captcha-create' => 'ដើម្បី​បង្កើត​ទំព័រ សូមដោះស្រាយ​ប្រមាណវិធីបូក​ខាងក្រោម​នេះរួច​បញ្ជូលចម្លើយ​ទៅក្នុង​ប្រអប់សិន([[Special:Captcha/help|ព័ត៌មាន​បន្ថែម]])៖',
 	'captchahelp-title' => 'ជំនួយអំពី Captcha',
@@ -2192,13 +2251,13 @@ $messages['ko'] = array(
 
 웹 브라우저에서 그림을 완벽하게 표시할 수 없거나, 그림이 나오지 않는 텍스트 방식이나 음성 합성 방식 웹 브라우저를 사용하는 경우에는 이러한 입력이 불가능합니다.
 아직까지는 이런 경우에 대한 대안이 없습니다.
-예기치않게 정당한 행동을 하지 못하도록 막는다면 [[{{MediaWiki:Grouppage-sysop}}|사이트 관리자]]에게 도움을 요청해 주세요.
+예기치않게 정당한 행동을 하지 못하도록 막는다면 [[Special:ListAdmins|사이트 관리자]]에게 도움을 요청해 주세요.
 
 이전 화면으로 돌아가려면 웹 브라우저의 "뒤로" 버튼을 누르세요.',
 	'captcha-addurl-whitelist' => ' #<!-- 이 줄은 그대로 두십시오 --> <pre>
 # 문법은 다음과 같습니다:
-#  * "#"로 시작하는 줄은 주석입니다.
-#  * 빈 줄이 아닌 줄은 정규식으로, URL의 호스트만을 검사합니다.
+#   * "#" 문자에서 줄의 끝까지는 주석입니다
+#   * 빈 줄이 아닌 줄은 정규식으로, URL의 호스트만을 검사합니다
  #</pre> <!-- 이 줄은 그대로 두십시오 -->',
 	'right-skipcaptcha' => '캡차 과정을 거치지 않고 캡차 과정을 거친 것으로 간주',
 );
@@ -2242,7 +2301,7 @@ Dat es e beßßje läßtish för der Minsch, ävver de Robbotter hälld et unß
 
 Wann De Dich ens fordeis, es och nit schlimm, De wees norr_enß jefrooch. Wat De jetipp häs, kütt nit fott.
 
-Schaad es, mer hann noch keine Wääsh, dat met Shprooch odder sönswi ze maache, su dat Lück met Shprooch_Ußßjaave, Braille, un met nur Tex em Brauser oohne Bellder, em Räähn shtonn künnte. Dooht Ühr Zeush eets enß oohne Lengk speischere, un saat dä [[{{MediaWiki:Grouppage-sysop}}|Wikki_Köbesse]],
+Schaad es, mer hann noch keine Wääsh, dat met Shprooch odder sönswi ze maache, su dat Lück met Shprooch_Ußßjaave, Braille, un met nur Tex em Brauser oohne Bellder, em Räähn shtonn künnte. Dooht Ühr Zeush eets enß oohne Lengk speischere, un saat dä [[Special:ListAdmins|Wikki_Köbesse]],
 wann Ühr Probbleme hatt. Do weed_Üch jehollfe weede.
 
 Jetz kanns De met Dingem Brauser singem „Zeröck“-Knopp wigger maache, wo De fürher woohß.',
@@ -2256,13 +2315,14 @@ Jetz kanns De met Dingem Brauser singem „Zeröck“-Knopp wigger maache, wo De
 
 /** Cornish (kernowek)
  * @author Kernoweger
+ * @author Nrowe
  */
 $messages['kw'] = array(
-	'captcha-createaccount-fail' => 'Coden afydhya camm po gwag.',
-	'captcha-sendemail-fail' => 'Coden afydhya camm po gwag.',
+	'captcha-createaccount-fail' => 'Koden afydhya kamm po gwag.',
+	'captcha-sendemail-fail' => 'Koden afydhya kamm po gwag.',
 );
 
-/** Kirghiz (Кыргызча)
+/** Kyrgyz (Кыргызча)
  * @author Chorobek
  */
 $messages['ky'] = array(
@@ -2286,6 +2346,7 @@ $messages['la'] = array(
 /** Luxembourgish (Lëtzebuergesch)
  * @author Les Meloures
  * @author Robby
+ * @author Soued031
  */
 $messages['lb'] = array(
 	'captcha-edit' => "Fir dës Säit z'änneren, léist w.e.g. dës Rechenaufgab a gitt d'Resultat an d'Këscht ënnendrënner an ([[Special:Captcha/help|méi Informatiounen]]):",
@@ -2301,20 +2362,20 @@ Fir dës Wiki virun automatiséiertem Spam ze schütze froe mir Iech fir déi fo
 	'captcha-sendemail-fail' => 'Falschen oder kee Confirmatiouns-Code.',
 	'captcha-disabledinapi' => 'Dës Aktioun brauch e Captcha, dofir ka se net mat enger API gemaach ginn.',
 	'captchahelp-title' => 'Captcha-Hëllef',
-	'captchahelp-cookies-needed' => 'Dir musst Cookieën an ärem Browser erlaben fir dat dëst fonktionéiert.',
-	'captchahelp-text' => "Websäiten, déi et jiddwerengem erlaben Ännerunge virzehuelen, sou wéi op dëser Wiki, ginn dacks vu sougenannte Spammer mëssbraucht, déi automatiséiert hir Linken op vill Internetsäite setzen. Esou Spam-Linke kënne wuel geläscht ginn, mä se sinn trotzdem eng grouss Plo.
+	'captchahelp-cookies-needed' => 'Dir musst Cookien an Ärem Browser erlabe fir dat dëst funktionéiert.',
+	'captchahelp-text' => "Websäiten, déi et jiddwerengem erlaben Ännerunge virzehuelen, sou wéi op dëser Wiki, ginn dacks vu sougenannte Spammer mëssbraucht, déi automatiséiert hir Linken op vill Internetsäite setzen. Sou Spam-Linke kënne wuel geläscht ginn, mä se sinn trotzdem eng grouss Plo.
 
-Heiandsdo, besonnesch wann nei Internet-Linken op eng Säit derbäigesat ginn, weist dës Wiki Iech e Bild mat faarwegem oder verzerrtem Text a freet Iech fir déi gewise Wierder anzetipppen. Well dëst eng Aufgab ass déi schwéier ze automatiséieren ass, erlaabt dëst, datt Mënschen hir Ännerunge kënnen agi wärend déi meescht Spammer an aner Roboter-Attacke kënnen ofgewiert ginn.
+Heiansdo, besonnesch wann nei Internet-Linken op eng Säit derbäigesat ginn, weist dës Wiki Iech e Bild mat faarwegem oder verzerrtem Text a freet Iech fir déi gewise Wierder anzetipppen. Well dëst eng Aufgab ass déi schwéier ze automatiséieren ass, erlaabt dëst, datt Mënschen hir Ännerunge kënnen agi während déi meescht Spammer an aner Roboter-Attacke kënnen ofgewiert ginn.
 
-Leider kann dat zu Schwierigkeete féiere fir Persounen déi net esou gutt gesinn oder déi text-baséiert oder sprooch-baséiert Browser benotzen.
+Leider kann dat zu Schwierigkeete féiere fir Persounen déi net sou gutt gesinn oder déi text-baséiert oder sprooch-baséiert Browser benotzen.
 Zu dësem Zäitpunkt hu mir leider keng audio-Alternativ zu eiser Verfügung.
-Kontaktéiert w.e.g. [[{{MediaWiki:Grouppage-sysop}}|een Administrateur]] fir Hëllef wann dëst iech onerwaarter Wäis vu legitimen Editen ofhält.
+Kontaktéiert w.e.g. [[Special:ListAdmins|een Administrateur]] fir Hëllef wann dëst iech onerwaarter Weis vu legitimen Editen ofhält.
 
 Dréckt op den 'Zréck' Knäppche vun ärem Browser fir an d'Beaarbechtungsfënster zréckzekommen.",
 	'captcha-addurl-whitelist' => '  #<!-- Dës Linn onverännert loossen --> <pre>
 #  Syntax:
 #  * Alles vun engem #-Zeechen u bis zum Enn vun där Zeil ass eng Bemierkung
-#  * All Zeil déi net eidel ass, ass ee Regex-Fragment, dat nëmme mat Hosten bannent URLë fonctionnéiert
+#  * All Zeil déi net eidel ass, ass ee Regex-Fragment, dat nëmme mat Hosten bannent URLe funktionéiert
    #</pre> <!-- Dës Linn onverännert loossen -->',
 	'right-skipcaptcha' => 'Aktiounen déi eng Captcha-Aktioun verlaangen ausféieren, ouni dës maachen ze mussen',
 );
@@ -2341,7 +2402,7 @@ $messages['li'] = array(
 
 Soms, en in het bijzonder bij het toevoegen van externe links op pagina's, krijgt u een afbeelding te zien met gekleurde of vervormde tekst en wordt u gevraagd de weergegeven tekst in te voeren. Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat dit proces succesvol te doorlopen en worden hiermee spammers en andere geautomatiseerde aanvallen geweerd.
 
-Helaas levert deze bevestiging voor gebruikers met een visuele handicap of een tekst- of spraakgebaseerde browser problemen op. Op het moment is er geen alternatief met geluid beschikbaar. Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
+Helaas levert deze bevestiging voor gebruikers met een visuele handicap of een tekst- of spraakgebaseerde browser problemen op. Op het moment is er geen alternatief met geluid beschikbaar. Vraag assistentie van de [[Special:ListAdmins|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
 
 Klik óppe 'trök'-knoep in uw browser om terug te gaan naar het tekstbewerkingsscherm.",
 	'captcha-addurl-whitelist' => ' #<!-- laot deze regel --> <pre>
@@ -2362,6 +2423,14 @@ $messages['lo'] = array(
 	'captcha-create' => 'ກະລຸນາ ແກ້ເລກບວກງ່າຍໆລຸ່ມນີ້ ແລະ ພິມຜົນບວກໃສ່ໃນກັບ ເພື່ອ ສ້າງໜ້ານີ້ ([[Special:Captcha/help|ຂໍ້ມູນເພີ່ມເຕີມ]]):',
 );
 
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+	'captcha-label' => 'كپچا',
+	'captchahelp-title' => 'هومياری كپچا',
+);
+
 /** Lithuanian (lietuvių)
  * @author Eitvys200
  * @author Garas
@@ -2394,7 +2463,7 @@ Kaut arī šīs saites var viegli dzēst, tomēr tās ir nozīmīgs traucēklis.
 
 Reizēm, jo īpaši pievienojot jaunas interneta saites, wiki programmatūra var parādīt Tev attēlu, kurā ir krāsains vai sagrozīts teksts. Šis teksts ir jāpārraksta un to ir ļoti grūti izdarīt automātiski, tā apgrūtinot lielāko daļu mēstuļotāju, savukārt gandrīz visi parastie lietotāji to var izdarīt bez grūtībām.
 
-Diemžēl tas var apgrūtināt lietotājus, kuriem ir redzes traucējumi vai kuri izmanto teksta pārlūkus vai dzirdes pārlūkus. Šobrīd nav pieejama audio alternatīva, bet sazinies ar [[{{MediaWiki:Grouppage-sysop}}|wiki administratoriem]], ja tas liedz Tev veikt labi domātus papildinājumus.
+Diemžēl tas var apgrūtināt lietotājus, kuriem ir redzes traucējumi vai kuri izmanto teksta pārlūkus vai dzirdes pārlūkus. Šobrīd nav pieejama audio alternatīva, bet sazinies ar [[Special:ListAdmins|wiki administratoriem]], ja tas liedz Tev veikt labi domātus papildinājumus.
 
 Spied pārlūka pogu \"Atpakaļ\" (''Back''), lai atgrieztos iepriekšējā lapā.",
 );
@@ -2418,7 +2487,7 @@ Dek iko marupoan suatu karajo nan sulik untuak dibuek sacaro otomatis, pakaro ko
 
 Sayangnyo, hal iko mambuek sarik bagi pangguno nan tabateh panglihatannyo atau dek pangguno nan manggunoan paramban web babasis-teks ataupun babasis-suaro.
 Kini ko, kami alun dapek alternatip lain untuak manggunoan suaro buek pakaro ko.
-Silakan hubuangi [[{{MediaWiki:Grouppage-sysop}}|panguruih]] untuak mintak bantuan koq pakaro ko manghambaik Sanak untuak mambuek suntiangan nan layak.
+Silakan hubuangi [[Special:ListAdmins|panguruih]] untuak mintak bantuan koq pakaro ko manghambaik Sanak untuak mambuek suntiangan nan layak.
 
 Takan tombol "back" di paramban web Sanak untuak baliak ka laman panyuntiangan.',
 	'right-skipcaptcha' => 'Mamicu CAPTCHA tanpa malaluinyo',
@@ -2450,7 +2519,7 @@ $messages['mk'] = array(
 
 Нажалост ова може да е проблем за корисници со лош вид, или оние кои користат прелистувачи на основа на текст или гласовни наредби.
 Во моментов немаме аудио-алтернатива за ова.
-Контактирајте ги [[{{MediaWiki:Grouppage-sysop}}|администраторите на страната]] за помош доколку ова неочекувано ве спречува во правењето на искрени придонеси. 
+Контактирајте ги [[Special:ListAdmins|администраторите на страната]] за помош доколку ова неочекувано ве спречува во правењето на искрени придонеси. 
 
 Кликнете на копчето „назад“ во вашиот прелисувач за да се вратите на уредувањето на страницата.',
 	'captcha-addurl-whitelist' => '  #<!-- leave this line exactly as it is --> <pre>
@@ -2481,15 +2550,15 @@ $messages['ml'] = array(
 	'captchahelp-title' => 'കാപ്ച്ച സഹായം',
 	'captchahelp-cookies-needed' => 'ഇതു പ്രവർത്തിക്കണമെങ്കിൽ താങ്കളുടെ ബ്രൗസറിൽ കുക്കികൾ സജ്ജീകരിച്ചിരിക്കണം.',
 	'captchahelp-text' => "ഈ വിക്കിപോലെ പൊതുജനങ്ങളിൽ നിന്നും പ്രസിദ്ധപ്പെടുത്തലുകൾ സ്വീകരിക്കുന്ന വെബ്‌‌സൈറ്റുകൾ, സ്വയം പ്രവർത്തിക്കുന്ന ഉപകരണങ്ങൾ ഉപയോഗിച്ച് കണ്ണികളും മറ്റും പ്രസിദ്ധപ്പെടുത്തുന്ന സ്പാമർമാർ സാധാരണ ദുരുപയോഗം ചെയ്യാറുണ്ട്.
-ഇത്തരത്തിലുള്ള സ്പാം കണ്ണികൾ നീക്കംചെയ്യപ്പെട്ടുപോകുമെങ്കിലും, അവ ശരിക്കും ശല്യമാണ്.
+ഇത്തരത്തിലുള്ള പാഴെഴുത്ത് കണ്ണികൾ നീക്കംചെയ്യപ്പെട്ടുപോകുമെങ്കിലും, അവ ശരിക്കും ശല്യമാണ്.
 
-ചിലപ്പോൾ, പ്രത്യേകിച്ച് ഒരു വെബ് കണ്ണി താളിൽ കൂട്ടിച്ചേർക്കുമ്പോൾ, നിറങ്ങൾ ചേർത്തതോ വികലമാക്കിയതോ ആയ എഴുത്തുകൾ താങ്കളെ കാണിച്ച് അവ താങ്കളോട് ടെപ്പ് ചെയ്യാൻ വിക്കി ആവശ്യപ്പെടാം.
-ഇത് മനുഷ്യസഹായമില്ലാതെ ചെയ്യാൻ ബുദ്ധിമുട്ടാണ്, അതുകൊണ്ട് ശരിക്കും മനുഷ്യരായിട്ടുള്ളവർക്ക് അവരുടെ പ്രസിദ്ധപ്പെടുത്തലുകൾ ചേർക്കാനും അതേസമയം ബഹുഭൂരിപക്ഷം സ്പാമർമാരേയും യന്ത്രങ്ങളുപയോഗിച്ച് ആക്രമിക്കുന്നവരേയും തടയാനും കഴിയുന്നതാണ്.
+ചിലപ്പോൾ, പ്രത്യേകിച്ച് ഒരു വെബ് കണ്ണി താളിൽ കൂട്ടിച്ചേർക്കുമ്പോൾ, നിറങ്ങൾ ചേർത്തതോ വികലമാക്കിയതോ ആയ എഴുത്തുകൾ താങ്കളെ കാണിച്ച് അവ  ടൈപ്പ് ചെയ്യാൻ താങ്കളോട് ആവശ്യപ്പെട്ടേക്കാം.
+ഇത് മനുഷ്യസഹായമില്ലാതെ ചെയ്യാൻ ബുദ്ധിമുട്ടായതിനാൽ, ശരിക്കും മനുഷ്യരായിട്ടുള്ളവർക്ക് തങ്ങളുദ്ദേശിക്കുന്നത് ചേർക്കാനും അതേസമയം ബഹുഭൂരിപക്ഷം സ്പാമർമാരേയും യന്ത്രങ്ങളുപയോഗിച്ച് ആക്രമിക്കുന്നവരേയും തടയാനും കഴിയുന്നതാണ്.
 
-ദൗർഭാഗ്യകരമെന്നു പറയട്ടെ ഇത് ചിലപ്പോൾ ദൃഷ്ടിവൈകല്യം കൊണ്ടോ മറ്റോ എഴുത്തുകൾ മാത്രമനുവദിക്കുന്ന ബ്രൗസറുകൾ ഉപയോഗിക്കുന്നവർ, ശബ്ദം കേട്ട് മനസ്സിലാക്കുന്നവർ തുടങ്ങിയവർക്ക് ബുദ്ധിമുട്ടായേക്കാം.
+ദൗർഭാഗ്യകരമെന്നു പറയട്ടെ ഇത് ചിലപ്പോൾ ദൃഷ്ടിവൈകല്യം കൊണ്ടോ മറ്റോ, എഴുത്തുകൾ മാത്രമനുവദിക്കുന്ന ബ്രൗസറുകൾ ഉപയോഗിക്കുന്നവർ, ശബ്ദം കേട്ട് മനസ്സിലാക്കുന്നവർ തുടങ്ങിയവർക്ക് ബുദ്ധിമുട്ടായേക്കാം.
 ഇപ്പോൾ ഞങ്ങൾക്ക് ഇതിനു പകരം ശബ്ദം നൽകുന്ന സംവിധാനമില്ല.
 
-ഇത് ന്യായമായ പ്രസിദ്ധപ്പെടുത്തലുകൾ ഇടുന്നതിൽ നിന്നും അപ്രതീക്ഷിതമായി താങ്കളെ തടയുന്നുവെങ്കിൽ ദയവായി [[{{MediaWiki:Grouppage-sysop}}|സൈറ്റിന്റെ കാര്യനിർവാഹകരെ]] ബന്ധപ്പെടുക.
+ഇത് ന്യായമായ പ്രസിദ്ധപ്പെടുത്തലുകൾ ഇടുന്നതിൽ നിന്നും അപ്രതീക്ഷിതമായി താങ്കളെ തടയുന്നുവെങ്കിൽ ദയവായി [[Special:ListAdmins|സൈറ്റിന്റെ കാര്യനിർവാഹകരെ]] ബന്ധപ്പെടുക.
 
 ബ്രൗസറിലെ 'ബാക്ക്' ബട്ടൺ ഞെക്കിയാൽ താങ്കൾക്ക് താൾ തിരുത്തുവാനുള്ള സംവിധാനത്തിലേയ്ക്ക് മടങ്ങിപ്പോകാവുന്നതാണ്.",
 	'captcha-addurl-whitelist' => ' #<!-- ഈ വരി ഇതുപോലെ തന്നെ നിലനിർത്തുക --> <pre>
@@ -2517,7 +2586,7 @@ $messages['mn'] = array(
 
 Харамсалтай нь хараа муутай буюу бичигт эсвэл ярианд тулгуурласан вэб хөтөч ашигладаг хэрэглэгчдэд хүндрэл учирна.
 Одоогийн байдлаар дуун сонголт алга байна.
-Таньд бодит засвар хийхэд хүндрэл учирч байвал [[{{MediaWiki:Grouppage-sysop}}|сайтын администраторуудаас]] тусламж авч холбогдоно уу.
+Таньд бодит засвар хийхэд хүндрэл учирч байвал [[Special:ListAdmins|сайтын администраторуудаас]] тусламж авч холбогдоно уу.
 
 Хуудасны засварлагч руу буцахын тулд вэб хөтөчийнхөө "буцаах" товч дээр дарна уу.',
 );
@@ -2548,7 +2617,7 @@ $messages['mr'] = array(
 
 पण खेदाची गोष्ट अशी की ह्यामुळे अर्धांध व्यक्ती तसेच ज्या व्यक्ती फक्त मजकूर दाखविणारा न्याहाळक वापरतात, अशांना असुविधा होऊ शकते.
 सध्या आमच्याकडे आवाज ऐकण्याची सुविधा नाही.
-कृपया [[{{MediaWiki:Grouppage-sysop}}|संस्थळ प्रचालकांशी]]  या बाबतीत संपर्क करावा.
+कृपया [[Special:ListAdmins|संस्थळ प्रचालकांशी]]  या बाबतीत संपर्क करावा.
 
 पृष्ठ संपादनाकडे परत जाण्यासाठी आपल्या ब्राउझरची ’Back' ही कळ दाबा.",
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -2586,7 +2655,7 @@ Kadangkala, terutamanya apabila menambah pautan baharu pada sesebuah laman, wiki
 Oleh sebab tugas tersebut sukar dilakukan secara automatik, ia membolehkan manusia sebenar mengirim seperti biasa, manakala penghantar spam dan penyerang robot terhalang.
 
 Malangnya perkara ini boleh menyukarkan pengguna yang mengalami masalah penglihatan atau sedang menggunakan pelayar web teks atau tuturan. Pada masa ini kami tidak mempunyai alternatif audio.
-Sila hubungi [[{{MediaWiki:Grouppage-sysop}}|pentadbir tapak]] untuk mendapatkan bantuan sekiranya perkara ini menghalang anda daripada membuat sumbangan yang sah.
+Sila hubungi [[Special:ListAdmins|pentadbir tapak]] untuk mendapatkan bantuan sekiranya perkara ini menghalang anda daripada membuat sumbangan yang sah.
 
 Sila tekan butang 'back' di pelayar web anda untuk kembali ke laman suntingan.",
 	'captcha-addurl-whitelist' => ' #<!-- jangan ubah baris ini --> <pre>
@@ -2638,7 +2707,7 @@ $messages['nan'] = array(
 	'captcha-createaccount-fail' => 'Khak-jīn-bé chhò-gō· iah-sī làu-kau.',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Audun
  * @author Danmichaelo
  * @author Laaknor
@@ -2662,7 +2731,7 @@ $messages['nb'] = array(
 
 Noen ganger, særlig hvis du vil legge til nye internettlenker til en side, kan wikien vise deg et bilde av en farge eller ujevn tekst og be deg skrive inn ordene som vises. Siden det er vanskelig å automatisere denne oppgaven, vil funksjonen slippe de fleste virkelige mennesker igjennom, men stoppe spammere.
 
-Dessverre finnes det i øyeblikket ikke noe audioalternativ for brukere med begrenset syn som som bruker tekst- eller talebaserte nettlesere. Vennligst kontakt [[{{MediaWiki:Grouppage-sysop}}|administratorene]] hvis denne funksjonen forhindrer deg i å foreta legitime endringer.
+Dessverre finnes det i øyeblikket ikke noe audioalternativ for brukere med begrenset syn som som bruker tekst- eller talebaserte nettlesere. Vennligst kontakt [[Special:ListAdmins|administratorene]] hvis denne funksjonen forhindrer deg i å foreta legitime endringer.
 
 Trykk på 'tilbake'-knappen for å komme tilbake til redigeringssiden.",
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -2711,17 +2780,17 @@ Mit den „Trüch“-Knopp vun dien Browser kummst du trüch na dat Ännerfinste
 	'right-skipcaptcha' => 'Överspringen vun Captchas',
 );
 
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
  * @author Servien
  */
 $messages['nds-nl'] = array(
 	'captcha-edit' => "Um disse zied te bewarken, mu'j eerst t antwoord op disse eenvoudige somme invullen ([[Special:Captcha/help|meer informasie]]):",
-	'captcha-desc' => 'Biejt CAPTCHA-technieken um bescharming te biejen tegen moekpost en t raojen van wachtwoorden',
-	'captcha-addurl' => 'Joew bewarking bevat nieje uutgaonde verwiezingen.
-Voer ter de bescharming tegen ongewunste reklame de somme in die hieronder steet:<br />
-([[Special:Captcha/help|Hulpe?]])', # Fuzzy
-	'captcha-badlogin' => 'Los disse eenvoudige rekensomme op en voer t antwoord in bie t invoervienster in ter bescharming tegen t automaties kraken van wachtwoorden ([[Special:Captcha/help|meer informasie]]):', # Fuzzy
-	'captcha-createaccount' => 'Voer ter bescharming tegen automatiese ongewunste reklame t antwoord op disse eenvoudige rekensomme in bie invoervienster ([[Special:Captcha/help|meer informatie]]):', # Fuzzy
+	'captcha-desc' => 'Biedt CAPTCHA-technieken um bescharming te biejen tegen spam en t raojen van wachtwoorden',
+	'captcha-addurl' => 'In joew bewarking staon nieje uutgaonde verwiezingen.
+Vul ter de bescharming van disse wiki tegen automatiese moekbiedragen t antwoord op de somme in, in t invoerveld dat hieronder steet, um joew bewarking op te slaon:<br />
+([[Special:Captcha/help|meer informasie]])',
+	'captcha-badlogin' => 'Vul ter de bescharming van disse wiki tegen t automaties kraken van wachtwoorden t antwoord op de somme in, in t invoerveld ([[Special:Captcha/help|meer informasie]]):',
+	'captcha-createaccount' => 'Vul ter bescharming van disse wiki tegen t automaties anmaken van gebrukers t antwoord op de somme in, in t invoerveld ([[Special:Captcha/help|meer informasie]]):',
 	'captcha-createaccount-fail' => 'Verkeerde of ontbrekende bevestigingskode.',
 	'captcha-create' => 'Je bin n nieje zied an t maken.
 Voer t antwoord van disse eenvoudige rekensomme in bie t invoervienster
@@ -2734,7 +2803,7 @@ Soms a'j nieje verwiezingen bie n zied derop zetten, wö'j evreugen um iets over
 
 Spietig genog levert disse bevestiging veur gebrukers mit n visuele beparking of n tekst- of spraakebaseerden webkieker problemen op.
 Op t moment is der gien alternatief mit geluud beschikbaor.
-Vraag um hulpe van de [[{{MediaWiki:Grouppage-sysop}}|websteebeheerders]] as dit proses joe in de weg steet n nuttige biedrage te leveren.
+Vraag um hulpe van de [[Special:ListAdmins|websteebeheerders]] as dit proses joe in de weg steet n nuttige biedrage te leveren.
 
 (Klik op de knoppe 'terug' in joew webkieker, um weerumme te gaon naor t tekstbewarkingscharm.)",
 	'captcha-addurl-whitelist' => ' #<!-- laot disse regel zo as t is --> <pre>
@@ -2773,7 +2842,7 @@ Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat
 
 Helaas levert deze bevestiging voor gebruikers met een visuele handicap of een tekst- of spraakgebaseerde browser problemen op.
 Op het moment is er geen alternatief met geluid beschikbaar.
-Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
+Vraag assistentie van de [[Special:ListAdmins|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
 
 Klik op de knop 'terug' in uw browser om terug te gaan naar het tekstbewerkingsscherm.",
 	'captcha-addurl-whitelist' => ' #<!-- laat deze regel zoals hij is --> <pre>
@@ -2799,12 +2868,12 @@ Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat
 
 Helaas levert deze bevestiging voor gebruikers met een visuele handicap of een tekst- of spraakgebaseerde browser problemen op.
 Op het moment is er geen alternatief met geluid beschikbaar.
-Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als dit proces je verhindert een nuttige bijdrage te leveren.
+Vraag assistentie van de [[Special:ListAdmins|sitebeheerders]] als dit proces je verhindert een nuttige bijdrage te leveren.
 
 Klik op de knop 'terug' in je browser om terug te gaan naar het tekstbewerkingsscherm.",
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Eirik
  * @author Frokor
  * @author Harald Khan
@@ -2831,7 +2900,7 @@ Nokre gonger, særleg viss du vil leggje til nye internettlenkjer til ei side, k
 Sidan det er vanskeleg å automatisere denne oppgåva, vil funksjonen sleppe dei fleste verkelege menneska gjennom, men stoppe reklamerobotar.
 
 Diverre finst det i augeblikket ikkje noko lydalternativ for brukarar med nedsett syn som brukar tekst- eller talebaserte nettlesarar.
-Ver venleg å kontakte [[{{MediaWiki:Grouppage-sysop}}|administratorane]] viss denne funksjonen hindrar deg i å gjere skikkelege endringar.
+Ver venleg å kontakte [[Special:ListAdmins|administratorane]] viss denne funksjonen hindrar deg i å gjere skikkelege endringar.
 Trykk på «attende»-knappen for å kome tilbake til endringssida.',
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
 # Syntaksen er slik:
@@ -2846,9 +2915,10 @@ Trykk på «attende»-knappen for å kome tilbake til endringssida.',
  */
 $messages['oc'] = array(
 	'captcha-edit' => "Per modificar aquesta pagina, vos cal efectuar lo calcul çaijós e n'inscriure lo resultat dins lo camp ([[Special:Captcha/help|Mai d’entresenhas]]) :",
-	'captcha-desc' => 'Implementacion captcha simpla', # Fuzzy
+	'captcha-desc' => 'Ofèrta de tecnicas CAPTCHA per protegir contra lo spam e la descobèrta dels senhals per ensages multiples',
 	'captcha-label' => 'CAPTCHA',
-	'captcha-addurl' => "Vòstra modificacion inclutz de ligams URL novèla ; per empachar las connexions automatizadas, vos cal picar los mots que s’afichan dins l’imatge que seguís : <br />([[Special:Captcha/help|Qu'es aquò?]])", # Fuzzy
+	'captcha-addurl' => "Vòstra modificacion inclutz de ligams extèrnes.
+Per nos ajudar dins la proteccion contra lo corrièr indesirable automatizat, calculatz l'operacion simpla çaijós e inscrivissètz-ne lo resultat dins lo camp ([[Special:Captcha/help|mai d'informacions]]) :",
 	'captcha-badlogin' => "Per ensajar de contornar las temptativas de cracatge de senhals automatizadas per de robòts, recopiatz lo tèxte çaijós dins la bóstia de tèxte plaçada al dejós d'aqueste. ([[Special:Captcha/help|Mai d’entresenhas]])", # Fuzzy
 	'captcha-createaccount' => 'Coma proteccion contra las creacions de compte abusivas, entratz lo resultat de l’addicion dins la bóstia çaijós:<br />
 ([[Special:Captcha/help|mai d’entresenhas]])', # Fuzzy
@@ -2856,7 +2926,7 @@ $messages['oc'] = array(
 	'captcha-create' => "Per modificar la pagina, vos cal de resòldre l'operacion çaijós e n'inscriure lo resultat dins lo camp ([[Special:Captcha/help|Mai d'infòs]]) :",
 	'captchahelp-title' => 'Ajuda suls Captcha',
 	'captchahelp-cookies-needed' => "Vos cal aver los cookies activats dins vòstre navigador per qu'aquò foncione.",
-	'captchahelp-text' => "Los sites webs qu'accèptan de contribucions del public, coma aqueste wiki, sovent son atacats per de spammers qu'utilizan d'espleches automatizats per plaçar de ligams nombroses cap a de sites.
+	'captchahelp-text' => "Los sites webs qu'accèptan de contribucions del public, coma aqueste wiki, sovent son atacats per de spammers qu'utilizan d'aisinas automatizadas per plaçar de ligams nombroses cap a de sites.
 Quitament se son de bon suprimir, demòran una noisença significativa.
 
 De còps, particularament quora apondètz de ligams extèrnes dins una pagina, lo wiki vos pòt mostrar un imatge amb un tèxte coloriat, desformat o torçut e vos demandar de picar los mots indicats.
@@ -2864,14 +2934,14 @@ Aquesta tasca es complicada d'automatizar, çò que permet de diferenciar un uma
 
 Malurosament, aquesta solucion pòt geinar d'utilizaires malvesents o qu'utilizan un navigador textual o vocal.
 Dispausam pas d’alternativa àudio pel moment.
-Contactatz [[{{MediaWiki:Grouppage-sysop}}|los administrators del site]] se aquò vos empacha d'un biais imprevist de postar de contribucions legitimas.
+Contactatz [[Special:ListAdmins|los administrators del site]] se aquò vos empacha d'un biais imprevist de postar de contribucions legitimas.
 
 Clicatz sul boton « Precedent » de vòstre navigador per tornar a la pagina de modificacion.",
 	'captcha-addurl-whitelist' => '#<!-- daissatz aquesta linha exactament tala coma es --> <pre> # La sintaxi es la seguenta: # * Tot caractèr seguissent "#" fins a la fin de la linha serà interpretat coma un comentari # * Tota linha non voida es un còde regex que serà utilizat unicament a l\'interior dels ligams hypertext. #</pre> <!-- daissatz aquesta linha exactament tala coma es -->',
 	'right-skipcaptcha' => "Acomplís lo desenclavament de las accions de captcha sens dever passar per l'intermediari aqueste darrièr",
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Jnanaranjan Sahu
  * @author Psubhashish
  * @author Shisir 1945
@@ -2899,7 +2969,7 @@ $messages['or'] = array(
 
 ଅପରାପକ୍ଷେ ଏହା ସୀମିତ ଦୃଷ୍ଟିଥିବା ବା ଲେଖା କିମ୍ବା କଥା କୁହ ବ୍ରାଉଜର ବ୍ୟବହାର କରୁଥିବା ସଭ୍ୟମାନଙ୍କୁ ଅସୁବିଧାରେ ପକାଇଥାଏ ।
 ଅଧୁନା ଏଠାରେ ଧ୍ୱନିଚଳିତ ବିକଳ୍ପଟିଏ ଦେଇନାହୁଁ ।
-ଆପଣଙ୍କୁ ଉପଯୁକ୍ତ ଲେଖା ଦେବାରେ ସହଯୋଗ କରିବା ନିମନ୍ତେ ଦୟାକରି [[{{MediaWiki:Grouppage-sysop}}|ସାଇଟ ପରିଛା]]ମାନଙ୍କୁ ଯୋହଗାଯୋଗ କରନ୍ତୁ ।
+ଆପଣଙ୍କୁ ଉପଯୁକ୍ତ ଲେଖା ଦେବାରେ ସହଯୋଗ କରିବା ନିମନ୍ତେ ଦୟାକରି [[Special:ListAdmins|ସାଇଟ ପରିଛା]]ମାନଙ୍କୁ ଯୋହଗାଯୋଗ କରନ୍ତୁ ।
 
 ଆପଣଙ୍କ ବ୍ରାଉଜରରେ ଥିବା  'back' ଚିପି ପୃଷ୍ଠା ସମ୍ପାଦକକୁ ଲେଉଟିଯାନ୍ତୁ ।",
 	'captcha-addurl-whitelist' => ' #<!—ଏହି ଧାଡ଼ିଟି ଯେମିତି ଅଛି ସେମିତି ଛାଡ଼ି ଦିଅନ୍ତୁ --> <pre>
@@ -2963,7 +3033,7 @@ Ponieważ są to zadania trudne do zautomatyzowania, takie zabezpieczenia umożl
 
 Niestety, może być to niewygodne dla użytkowników z wadą wzroku lub używających przeglądarek tekstowych lub głosowych.
 Obecnie nie mamy alternatywnego rozwiązania audio.
-Skontaktuj się z [[{{MediaWiki:Grouppage-sysop}}|administratorami strony]] by uzyskać pomoc, jeśli nie możesz z tego powodu dokonywać uprawnionych edycji.
+Skontaktuj się z [[Special:ListAdmins|administratorami strony]] by uzyskać pomoc, jeśli nie możesz z tego powodu dokonywać uprawnionych edycji.
 
 Wciśnij przycisk „wstecz” w przeglądarce by powrócić do edycji strony.',
 	'captcha-addurl-whitelist' => ' #<!-- nie modyfikuj tej linii --> <pre>
@@ -2996,13 +3066,13 @@ ant ël quadrèt ([[Special:Captcha/help|për savejne dë pì]]):",
 	'captcha-disabledinapi' => "St'assion-sì a ciama na captcha, parèj a peul pa esse fàita con na API.",
 	'captchahelp-title' => 'Còs é-lo mai ës captcha?',
 	'captchahelp-cookies-needed' => "Për podej dovré sossì a l'ha da manca che sò navigator (browser) a pija ij cookies.",
-	'captchahelp-text' => "Soèns a-i riva che ij sit dla Ragnà che la gent a peul dovré për ëscrive chèich-còs, coma sta wiki-sì, a resto ambërlifà ëd reclam da màchine che a carìo soa ròba dadsà e dadlà n'aotomàtich. Për tant che sta reclam un a peula peuj gavela, a resta sempe un gran fastudi.
+	'captchahelp-text' => "Soèns a-i riva che ij sit dla Ragnà che la gent a peul dovré për ëscrive chèich-còs, coma sta wiki-sì, a resto ambërlifà d'areclam da 'd màchine che a cario soa ròba dadsà e dadlà n'aotomàtich. Për tant che sti areclam un a peula peuj gavela, a resta sempe un gran fastudi.
 
-Dle vire, dzortut quand un a caria dj'anliure esterne neuve ansime a na pàgina, la wiki a peul ësmon-je na figurin-a con dël test colora ò pura tut ëstòrt e ciameje d'arbate lòn ch'a-i é scrit andrinta. Da già ch'a l'é grama scrive un programa ch'a lo fasa, a ven che la pì gran part dla gent a-i la fa a scrive, ma la ói part dle màchine a-i la fa pa.
+Dle vire, dzortut quand un a caria dj'anliure esterne neuve ansime a na pàgina, la wiki a peul ësmon-je na figurin-a con dël test colora ò pura tut ëstòrt e ciameje d'arbate lòn ch'a-i é scrit andrinta. Da già ch'a l'é grama scrive un programa ch'a lo fasa, a ven che la pì gran part dla gent a-i la fa a scrive, ma la pi part dle màchine a-i la fa pa.
 
-Për maleur sossì a peul fastudié j'uetnt ch'a ës-ciàiro nen tant bin, col ch'a dòvro dij navigator mach a test ò pura dij navigator vocaj. Për adess i l'oma nen n'altërnativa disponibila ch'a fasa lese ël test a vos. Për piasì, ch'a contata j'[[{{MediaWiki:Grouppage-sysop}}|aministrator dël sit]] se sossì a dovèissa mai nen lasseje carié dël test ch'a sia legitim (visadì, nen dla reclam).
+Për maleur sossì a peul fastudié j'utent ch'a s-ciàiro nen tant bin, coj ch'a deuvro dij navigator mach a test ò pura dij navigator vocaj. Për adess i l'oma nen n'alternativa disponìbil ch'a fasa lese ël test a vos. Për piasì, ch'a contata j'[[Special:ListAdmins|aministrator dël sit]] se sossì a dovèissa mai nen lasseje carié dël test ch'a sia legìtim (visadì, nen dj'areclam).
 
-Ch'a-i bata ansima al boton 'andré' ant sò navigator për torné andré a l'editor dla pàgina.",
+Ch'a-i bata ansima al boton «andré» ant sò navigator për torné andré a l'editor dla pàgina.",
 	'captcha-addurl-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
 # La sintassi a l'é costa:
 #  * tut lòn ch'a-i ven dapress a un caràter \"#\" (fin-a a la fin dla riga) a l'é mach ëd coment
@@ -3034,7 +3104,7 @@ $messages['pnb'] = array(
 اے کم ایسا اے جیہڑا چلانا اوکھا اے، اے چوکھے سارے لوکاں نوں اپنی ڈاک پیجن دیوے گا تے سپامراں نوں روک دیوے گا،
 
 بدقسمستی نال اے تھوڑی سوچ رکھن والے ورتنوالیاں  یا لکھت ورتن والے یا گل بات والے براؤزر نوں چنگا ناں لگے۔
-ایس ویلے ساڈے کول ایدے تھاں تے ورتیا جان والا آڈیو نئیں۔ مہربانی کرکے  [[{{MediaWiki:Grouppage-sysop}}|site administrators]] نال ملو مدد لئی اگ ایہ اچانک تواڈی ٹھیک ڈاک نوں روکدا اے۔
+ایس ویلے ساڈے کول ایدے تھاں تے ورتیا جان والا آڈیو نئیں۔ مہربانی کرکے  [[Special:ListAdmins|site administrators]] نال ملو مدد لئی اگ ایہ اچانک تواڈی ٹھیک ڈاک نوں روکدا اے۔
 بیک بٹن نوں دباؤ اپنے براؤزر چ صفہ لکھاری تک اپڑن لئی۔',
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
 # Syntax is as follows:
@@ -3051,30 +3121,31 @@ $messages['ps'] = array(
 	'captcha-create' => 'ددې لپاره چې نوی ليکنه ترسره کړی، لطفاً د همدغه ساده شمېرو ځواب په ورکړ شوي چوکاټ کې وليکی ([[Special:Captcha/help|نور مالومات]]):',
 	'captchahelp-title' => 'CAPTCHA لارښود',
 	'captchahelp-cookies-needed' => 'ددې کړنې د ترسره کېدلو لپاره تاسو ته پکار ده چې د خپل کتنمل (browser) کوکيز (cookies) چارن کړی.',
-	'captchahelp-text' => "هغه وېبځايونه چې د ټولو وګړو پر لور د ليکنو د ليکلو لپاره پرانيستي دي، لکه همدا ويکي، ډېر ځل د سپمرګرو لخوا چې اتوماتيک اوزارونه د خپلو د تړنو او وېبپاڼو د خبرتياو په خپرولو کې کاروي، په ناوړه توګه کارېږي. تر هغه وخت پورې چې همدا سپمونه او هماغه تړنې راموندل کېږي او ليرې کېږي، نو تر هغه وخته پورې همدا سپمونه ډېر سرخوږی جوړوي.
+	'captchahelp-text' => "هغه وېبځايونه چې د ټولو وگړو پر لور د ليکنو د ليکلو لپاره پرانيستي دي، لکه همدا ويکي، ډېر ځل د سپمرگرو لخوا چې اتوماتيک اوزارونه د خپلو د تړنو او وېبپاڼو د خبرتياو په خپرولو کې کاروي، په ناوړه توگه کارېږي. تر هغه وخت پورې چې همدا سپمونه او هماغه تړنې راموندل کېږي او ليرې کېږي، نو تر هغه وخته پورې همدا سپمونه ډېر سرخوږی جوړوي.
 
-په ځانګړي توګه په يوه مخ کې د يوه وېبځي د تړنې د ورګډولو په وخت کې به ويکي يو ډول ګډوډ رنګين متن ښکاره کړي او له کارن نه به د هماغه متن د ټاپلو غوښتنه شوې وي. 
+په ځانگړي توگه په يوه مخ کې د يوه وېبځي د تړنې د ورگډولو په وخت کې به ويکي يو ډول گډوډ رنگين متن ښکاره کړي او له کارن نه به د هماغه متن د ټاپلو غوښتنه شوې وي. 
 
-څرنګه چې جوته ده چې اصلي وګړي کولی شي چې په دې کار کې بريالي شي، خو دې ته ناورته سپامګر ماشينونه او روبوټونه دا ډول کار په خپلکاره توګه نه شي ترسره کولی او پدې توګه د سپامګرو او روبوټونو د غورځنګ مخ نيول کېږي.
+څرنگه چې جوته ده چې اصلي وگړي کولی شي چې په دې کار کې بريالي شي، خو دې ته ناورته سپامگر ماشينونه او روبوټونه دا ډول کار په خپلکاره توگه نه شي ترسره کولی او پدې توگه د سپامگرو او روبوټونو د غورځنگ مخ نيول کېږي.
 
-بدبختانه چې دا کار د کارنانو لپاره ستونزه جوړولای شي او هغه څوک چې د سترګو نظر يې کمزوری دی او يا هم د متن پر بنسټ او يا هم د غږ پر بنسټ جوړ شوي کتنملونه کاروي نه شي کولی په آسانۍ سره خپلې سمونې او خپرونې ترسره کړي.
+بدبختانه چې دا کار د کارنانو لپاره ستونزه جوړولای شي او هغه څوک چې د سترگو نظر يې کمزوری دی او يا هم د متن پر بنسټ او يا هم د غږ پر بنسټ جوړ شوي کتنملونه کاروي نه شي کولی په آسانۍ سره خپلې سمونې او خپرونې ترسره کړي.
 
 دم مهال موږ د داسې متنونو غږيز انډول نه لرو.
 
-که چېرته دا کار تاسې له سمونو او ليکنو خپرولو پاتې راولي نو لطفاً د مرستې لپاره د [[{{MediaWiki:Grouppage-sysop}}|پازوالانو]] سره اړيکه ټينګه کړۍ.
+که چېرته دا کار تاسې له سمونو او ليکنو خپرولو پاتې راولي نو لطفاً د مرستې لپاره د [[Special:ListAdmins|پازوالانو]] سره اړيکه ټينگه کړۍ.
 
-په خپل کتنمل کې د 'شاکېدلو' تڼۍ کېښکاږۍ چې بېرته پخواني مخ ته وګرځۍ.",
+په خپل کتنمل کې د 'شاکېدلو' تڼۍ کېښکاږۍ چې بېرته پخواني مخ ته وگرځۍ.",
 );
 
 /** Portuguese (português)
  * @author Hamilton Abreu
  * @author Helder.wiki
+ * @author Luckas
  * @author Malafaya
  * @author 555
  */
 $messages['pt'] = array(
 	'captcha-edit' => 'Para editar esta página, por favor, resolva a soma simples apresentada abaixo e introduza a resposta na caixa ([[Special:Captcha/help|mais informações]]):',
-	'captcha-desc' => 'Fornece técnicas CAPTCHA para protecção contra spam e tentativas de adivinhar a palavra-chave',
+	'captcha-desc' => 'Fornece técnicas CAPTCHA para proteção contra spam e tentativas de adivinhar a palavra-chave',
 	'captcha-label' => 'CAPTCHA',
 	'captcha-addurl' => "A sua edição introduziu links externos novos.
 Como prevenção contra sistemas automatizados de inserção de ''spam'', resolva a soma simples apresentada abaixo e introduza a resposta na caixa ([[Special:Captcha/help|mais informações]]):", # Fuzzy
@@ -3083,7 +3154,7 @@ Como prevenção contra sistemas automatizados de inserção de ''spam'', resolv
 	'captcha-createaccount-fail' => 'Código incorreto ou não preenchido.',
 	'captcha-create' => 'Para criar a página, resolva a soma simples apresentada abaixo e introduza a resposta na caixa ([[Special:Captcha/help|mais informações]]):',
 	'captcha-sendemail' => "Como prevenção contra sistemas automatizados de inserção de ''spam'', resolva a soma simples apresentada abaixo e introduza a resposta na caixa ([[Special:Captcha/help|mais informações]]):", # Fuzzy
-	'captcha-sendemail-fail' => 'Código de confirmação incorrecto ou não preenchido.',
+	'captcha-sendemail-fail' => 'Código de confirmação incorreto ou não preenchido.',
 	'captcha-disabledinapi' => 'Esta operação necessita de captcha, por isso não pode ser realizada através da API.',
 	'captchahelp-title' => 'Ajuda sobre o CAPTCHA',
 	'captchahelp-cookies-needed' => "É necessário possibilitar o uso de ''cookies'' no seu browser para que o ''captcha'' funcione.",
@@ -3095,7 +3166,7 @@ Porque a interpretação do texto apresentado nas imagens é uma tarefa difícil
 
 Infelizmente, esta funcionalidade pode revelar-se um inconveniente para utilizadores com limitações visuais ou que utilizam browsers baseados em texto ou voz.
 Neste momento, não temos disponível uma alternativa em áudio.
-Por favor, contacte os [[{{MediaWiki:Grouppage-sysop}}|administradores]] para assistência, caso a funcionalidade esteja a impedi-lo de fazer edições legítimas.
+Por favor, contacte os [[Special:ListAdmins|administradores]] para assistência, caso a funcionalidade esteja a impedi-lo de fazer edições legítimas.
 
 Clique o botão 'voltar' do seu browser para voltar à página de edição.",
 	'captcha-addurl-whitelist' => ' #<!-- deixe esta linha exactamente como está --> <pre>
@@ -3136,7 +3207,7 @@ Uma vez que essa é uma tarefa um tanto difícil de ser automatizada, ela possib
 
 Infelizmente, isso pode ser um inconveniente para usuários com limitações visuais ou que naveguem através de mecanismos baseados em texto ou baseados em voz.
 No momento, não está disponível uma alternativa em áudio.
-Por favor, contate os [[{{MediaWiki:Grouppage-sysop}}|administradores do sítio]] em casos que seja necessária a assistência de alguém para que você possa fazer as suas inserções legítimas.
+Por favor, contate os [[Special:ListAdmins|administradores do sítio]] em casos que seja necessária a assistência de alguém para que você possa fazer as suas inserções legítimas.
 
 Pressione o botão 'voltar' de seu navegador para retornar à página de edição.",
 	'captcha-addurl-whitelist' => ' #<!-- deixe este linha exatamente como está --> <pre>
@@ -3151,6 +3222,7 @@ Pressione o botão 'voltar' de seu navegador para retornar à página de ediçã
  * @author AlimanRuna
  */
 $messages['qu'] = array(
+	'captcha-badlogin' => 'Wikita kikinmanta millay ruraq yaykuna rima chamqaymanta amachanapaqqa, kay qatiq yapayta ruraspa yapasqata kahachapi yaykuchiy ([[Special:Captcha/help|astawan yachay]]):',
 	'captchahelp-title' => 'Captcha nisqamanta yanapay',
 );
 
@@ -3183,7 +3255,7 @@ Uneori, mai ales la adăugarea de noi legături web într-o pagină, situl wiki
 Întrucât rezolvarea acestei cerințe este dificil de automatizat, ea permite majorității persoanelor reale să-și trimită contribuțiile și va opri majoritatea atacatorilor.
 
 Din nefericire, această metodă îi poate deranja pe utilizatorii cu probleme vizuale sau care folosesc navigatoare bazate pe text sau sunet. În acest moment nu avem o alternativă audio disponibilă.
-În cazul în care această practică vă împiedică în mod neașteptat să faceți contribuții legitime, vă rugăm să contactați [[{{MediaWiki:Grouppage-sysop}}|administratorii sitului]].
+În cazul în care această practică vă împiedică în mod neașteptat să faceți contribuții legitime, vă rugăm să contactați [[Special:ListAdmins|administratorii sitului]].
 
 Apăsați butonul „Înapoi” al navigatorului pentru a vă reîntoarce la pagina de editare.',
 	'captcha-addurl-whitelist' => ' #<!-- lăsați această linie așa cum este --> <pre>
@@ -3220,7 +3292,7 @@ Certe vote, specialmende quanne aggiunge collegaminde nuève sus a a'na pàgene,
 Quiste jè 'nu combite difficile da automatizzà, ce sò le umane a scettà merde invece de le attacche robbot riuscime a bloccà cchiù facilmende.
 
 Sfortunatamende stu fatte pò da inconveniende a le utinde cu visiune limitate o ca ausane le browser de sole teste o ca parlane. Jndr'à stu mumende non ge tenime 'n'alternative audie.
-Pe piacere condatte le [[{{MediaWiki:Grouppage-sysop}}|amministrature d'u site]] pe assistenze ce quiste jè condre a le leggittime aziune tune.
+Pe piacere condatte le [[Special:ListAdmins|amministrature d'u site]] pe assistenze ce quiste jè condre a le leggittime aziune tune.
 
 Cazze 'u buttonne \"rrete\" (back) sus a 'u browser tune pe turnà a 'u cangiamende d'a pàgene.",
 	'captcha-addurl-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
@@ -3263,7 +3335,7 @@ $messages['ru'] = array(
 
 К сожалению, подобная защита может причинить неудобства людям с ограничениями по зрению или тем, кто использует текстовые или читающие браузеры.
 В настоящее время у нас нет звуковой альтернативы данной проверке.
-Пожалуйста, обратитесь за помощью к [[{{MediaWiki:Grouppage-sysop}}|администраторам]], если подобная проверка мешает вам добросовестно работать с сайтом.
+Пожалуйста, обратитесь за помощью к [[Special:ListAdmins|администраторам]], если подобная проверка мешает вам добросовестно работать с сайтом.
 
 Нажмите кнопку «Назад» в вашем браузере, чтобы вернуться к редактированию.',
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -3295,7 +3367,7 @@ $messages['rue'] = array(
 
 Даколи, окремо почас придаваня новых вебовых одказів, вам може вікі указати образок фаребного ці поскручаного тексту і пожадати вас о описаня зображеных знаків. Кідьже таку задачу не годен легко автоматізовати, реалны люде можуть дале приспівати, але векшыну спамерів і іншых роботічных атакерів тото заставить.
 
-На жаль тото може представляти неприємный проблем про хоснователїв постиженых зраково ці голосовы чітачкы. В сучасній добі не маєме алтернатівни звукову верзію. Просиме, контактуйте [[{{MediaWiki:Grouppage-sysop}}|адміністратора сервера]], кідь вам то боронить в хосновным вкладї і треба вам поміч.
+На жаль тото може представляти неприємный проблем про хоснователїв постиженых зраково ці голосовы чітачкы. В сучасній добі не маєме алтернатівни звукову верзію. Просиме, контактуйте [[Special:ListAdmins|адміністратора сервера]], кідь вам то боронить в хосновным вкладї і треба вам поміч.
 
 Про навернутя на попередню сторінку стиснийте у своїм переглядачі клапку „назад“.',
 	'captcha-addurl-whitelist' => ' #<!-- зохабте тот рядок точно так як є --> <pre>
@@ -3334,7 +3406,7 @@ $messages['sa'] = array(
 इदं कार्यं स्वचालितरूपेण कर्तुं न शक्यते, मानवैः एव करणीयम् इत्यतः अनिष्टसन्देशप्रेषकाः यन्त्रचालितकार्याणि अवरुद्धानि भवन्ति ।
 दुरदृष्टवशात् एतेन परिमितसंस्करणयुक्तानां योजकानां क्लेशः भवेत् अथवा पाठाधारितानां भाषणाधारितानां जालगवेषकप्रयोक्तॄणामपि कष्टाय भवेत् ।
 सम्प्रति श्रव्यविकल्पः अस्मत्सविधे न उपलभ्यते ।
-योग्यलेखानाम् उत्पूरणे अनिरीक्षितक्लेशाः यदि भवन्ति तर्हि साहाय्यार्थम् एतेषां साहाय्यं प्राप्नुवन्तु  [[{{MediaWiki:Grouppage-sysop}}|क्षेत्रनिर्वाहकाः]] ।
+योग्यलेखानाम् उत्पूरणे अनिरीक्षितक्लेशाः यदि भवन्ति तर्हि साहाय्यार्थम् एतेषां साहाय्यं प्राप्नुवन्तु  [[Special:ListAdmins|क्षेत्रनिर्वाहकाः]] ।
 पृष्ठसम्पादकं प्रति गमनाय भवतः जालगवेषके 'पूर्वतनम्' इत्येतं पिञ्जं नुदतु ।",
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
 # अस्य प्रारूपम् एवमस्ति:
@@ -3371,9 +3443,9 @@ $messages['sah'] = array(
 
 Ол гынан баран маннык көмүскэл сорох дьоҥҥо (көрбөт эбэтэр ааҕар браузердары туһанар дьоҥҥо) моһоллору үөскэтиэн сөп.
 Билигин бу моһолу суох оҥорор кыах суох.
-Оннук мэһэй таҕыстаҕына бука диэн баалама, биир эмит [[{{MediaWiki:Grouppage-sysop}}|дьаһабылга (администраатарга)]]  этээр, көмөлөһүө.
+Оннук мэһэй таҕыстаҕына бука диэн баалама, биир эмит [[Special:ListAdmins|дьаһабылга (администраатарга)]]  этээр, көмөлөһүө.
 
-Көннөрүүгэ төттөрү тиийэргэ браузерыҥ «Назад» тимэҕин баттаа.',
+Көннөрүүгэ төттөрү тиийэргэ браузерыҥ «Назад» тимэҕин баттаа.', # Fuzzy
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
 # Синтаксиһын быһаарыыта:
 #  * "#" бэлиэттэн строка бүтүөр дылы барыта хос быһаарыы курдук ааҕыллар
@@ -3402,7 +3474,7 @@ $messages['scn'] = array(
 
 Nni tanti casi, p'asèmpiu quannu si voli jùnciri novi lijami Web nti na pàggina, lu software wiki pò ammustrari na mmàggini cu nu testu nicu acculuratu e/o difurmatu addumannannu di scrivìrilu nni na finistredda. Siccomu si tratta di na cosa difficili di fari pi nu computer, stu miccanìsimu pirmetti a (quasi tutti) l'utenti riali di cumplitari lu nzirimentu disiatu, mpidennu la trasuta a li chiossai di li spammer e di l'àutri attacchi autumatizzati.
 
-Pi sfurtuna, stu strataggemma pò mèttiri 'n difficultati a l'utenti ca hannu prubremi di vista o a chiddi ca ùsanu browser testuali o basati supr'a la sìntesi vucali. Purtroppu aoggi non ci sunnu àutri miccanìsimi abbasati supr'a missaggi sunori; si sti pruciduri mpidìsciunu lu nzirimentu di nfurmazzioni ca si pènzanu ca sù liggìttimi, siti prigati di cuntattari [[{{MediaWiki:Grouppage-sysop}}|l'amministraturi dû situ]] e addumannàrini l'assistenza.
+Pi sfurtuna, stu strataggemma pò mèttiri 'n difficultati a l'utenti ca hannu prubremi di vista o a chiddi ca ùsanu browser testuali o basati supr'a la sìntesi vucali. Purtroppu aoggi non ci sunnu àutri miccanìsimi abbasati supr'a missaggi sunori; si sti pruciduri mpidìsciunu lu nzirimentu di nfurmazzioni ca si pènzanu ca sù liggìttimi, siti prigati di cuntattari [[Special:ListAdmins|l'amministraturi dû situ]] e addumannàrini l'assistenza.
 
 Fari clic supra ô buttuni 'back' dû browser pi turnari a la pàggina di mudìfica.",
 	'captcha-addurl-whitelist' => " #<!-- non mudificari 'n nuddu modu sta riga --> <pre>
@@ -3449,7 +3521,7 @@ $messages['si'] = array(
 නමුත් අවාසනාවකට මෙය නිසා දෘෂ්ඨි දෝෂ සහිත හෝ පෙළ-පාදක හෝ කථන-පාදක වෙබ් පිරික්සක භාවිතා කරන පරිශීලකයන් අපහසුතාවට පත් වනු ඇත.
 මේ වන විට අප සතුව ශ්‍රව්‍ය විකල්පයක් නොමැත.
 
-මෙය නිසා ඔබට ලිපි ලිවීම දැඩි ලෙස කරදරකාරී වී ඇත්නම් කරුණාකර සහය සඳහා [[{{MediaWiki:Grouppage-sysop}}|අඩවි පරිපාලකයන්]] සම්බන්ධ කරගන්න.
+මෙය නිසා ඔබට ලිපි ලිවීම දැඩි ලෙස කරදරකාරී වී ඇත්නම් කරුණාකර සහය සඳහා [[Special:ListAdmins|අඩවි පරිපාලකයන්]] සම්බන්ධ කරගන්න.
 
 පිටු සකසනයට ආපසු යාම සඳහා ඔබේ වෙබ් පිරික්සකයේ "පසුපසට" බොත්තම තද කරන්න.',
 	'captcha-addurl-whitelist' => '#<!-- මෙම පේළිය මෙලෙසින්ම තිබීමට ඉඩ හරින්න --> <pre>
@@ -3482,7 +3554,7 @@ $messages['sk'] = array(
 
 Niekedy, obzvlášť keď pridávate webové odkazy k článkom, wiki vám môže zobraziť obrázok so zafarbeným alebo pokriveným textom a požiadať vás o prepísanie zobrazených slov. Keďže takúto úlohu je ťažké zautomatizovať a umožní skutočným ľuďom poslať svoje príspevky, zastaví to väčšinu spammerov a iných robotických útočníkov.
 
-Nanešťastie, môže to byť prekážkou pre používateľov so zrakovým postihnutím alebo tých, ktorí používajú textové alebo hovoriace prehliadače. Momentálne nemáme dostupnú audio zvukovú alternatívu. Kontaktujte prosím [[{{MediaWiki:Grouppage-sysop}}|správcov stránok]] ak vám to neočakávane komplikuje umiestňovanie oprávnených príspevkov.
+Nanešťastie, môže to byť prekážkou pre používateľov so zrakovým postihnutím alebo tých, ktorí používajú textové alebo hovoriace prehliadače. Momentálne nemáme dostupnú audio zvukovú alternatívu. Kontaktujte prosím [[Special:ListAdmins|správcov stránok]] ak vám to neočakávane komplikuje umiestňovanie oprávnených príspevkov.
 
 Stlačením tlačidla „späť“ vo vašom prehliadači sa vrátite do editora stránky.',
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -3520,7 +3592,7 @@ Ker je to opravilo težko avtomatizirati, bo s tem večini ljudi objavljanje dov
 
 Žal lahko to povzroči nevšečnosti uporabnikom s slabim vidom in tistim, ki uporabljajo besedilne ali govorne brskalnike.
 Glasovna možnost trenutno še ni na razpolago.
-Če vam to nepričakovano preprečuje legitimno objavo, prosimo, da se obrnete na [[{{MediaWiki:Grouppage-sysop}}|administratorje spletišča]].
+Če vam to nepričakovano preprečuje legitimno objavo, prosimo, da se obrnete na [[Special:ListAdmins|administratorje spletišča]].
 
 Za vrnitev v urejevalnik izberite gumb »nazaj« v vašem brskalniku.',
 	'captcha-addurl-whitelist' => ' #<!-- pustite to vrstico takšno, kot je --> <pre>
@@ -3555,9 +3627,9 @@ $messages['sq'] = array(
 
 Ndonjëherë, sidomos kur po hapni një llogari të re apo kur po shtoni lidhje të reja nëpërmjet redaktimit tuaj, sistemi mund t\'ju shfaqi një figurë që përmban fjalë me gërma ose numra të shtrembruara ose me ngjyra të ndryshme të cilat ju duhet të shtypni para se të mund të kryeni veprimin në fjalë. Kjo bëhet pasi është shumë e vështirë për një robot ose mjet automatik të kryejë të njëjtën punë. Kështu mund të dallohet nëse jeni me të vërtetë një njeri apo një robot. Ky lloj sistemi s\'mund të ndalojë tërë abuzimet por ndalon një pjesë të mirë të tyre, sidomos ato që janë automatike dhe të shumta në numër.
 
-Fatkeqësisht ky lloj sistemi mund të bezdisi përdoruesit me pamje të kufizuar ose ata që përdorin mjete teksti ose shfletues leximi me zë. Tani për tani nuk kemi mundësi për të ofruar një sistem me zë në vend të figurave. Ju lutem lidhuni me [[{{MediaWiki:Grouppage-sysop}}|administruesit]] nëse ky sistem po ju ndalon të jepni kontribute të vlefshme.
+Fatkeqësisht ky lloj sistemi mund të bezdisi përdoruesit me pamje të kufizuar ose ata që përdorin mjete teksti ose shfletues leximi me zë. Tani për tani nuk kemi mundësi për të ofruar një sistem me zë në vend të figurave. Ju lutem lidhuni me [[Special:ListAdmins|administruesit]] nëse ky sistem po ju ndalon të jepni kontribute të vlefshme.
 
-Shtypni butonin "prapa" ("back") të shfletuesit tuaj për tu kthyer tek faqja e mëparshme.',
+Shtypni butonin "prapa" ("back") të shfletuesit tuaj për tu kthyer tek faqja e mëparshme.', # Fuzzy
 	'captcha-addurl-whitelist' => ' #<!-- lëreni këtë rresht siç është --> <pre>
 # Sintaksa është si më poshtë:
 #  * Çdo gjë nga simboli "#" deri në fund të rreshtit është koment
@@ -3623,7 +3695,7 @@ Klik dan fonnäien ap „Siede spiekerje“ [[Special:Captcha/help|(Froagen of P
 In fuul Falle, besunners bie dät Bietouföigjen fon näie Webferbiendengen tou ne Siede, kon dät foarkuume, dät dit Wiki ne Bielde mäd n faawigen un fertroalden Text anwiest un deertou apfoardert, do anwiesde Woude ientoutippen. Deer sun Apgoawe man stuur automatisk ouhonneld wäide kon, wäide deertruch do maaste Spammere, do der mäd automatiske Reewen oarbaidje, stopped, wierjuun moanskelke Benutsere hieren Biedraach ouseende konnen.
 
 Spietelk genouch kon dät tou Meelasje foar Persoone fiere, do der minner goud sjo konnen of text- of sproakbasierde Browsere ferweende. Apstuuns hääbe wie neen Audio-Alternative ferföigboar.
-Kontaktier do [[{{MediaWiki:Grouppage-sysop}}|Site-Administratore]] foar Hälpe, wan dit jou Moite rakt bie dät Hoochleeden fon Biedraage.
+Kontaktier do [[Special:ListAdmins|Site-Administratore]] foar Hälpe, wan dit jou Moite rakt bie dät Hoochleeden fon Biedraage.
 
 Klik ap dän 'Tourääch'-Knoop in jou Browser uum ätter dän Sieden-Editor touräächtougungen.",
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -3668,11 +3740,12 @@ Hit the 'back' button in your browser to return to the page editor.", # Fuzzy
  * @author MagnusA
  * @author Martinwiss
  * @author Per
+ * @author Rotsee
  */
 $messages['sv'] = array(
 	'captcha-edit' => 'För att redigera den här sidan måste du först skriva svaret på följande
 räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
-	'captcha-desc' => 'Ger CAPTCHA tekniker för att skydda mot skräppost och lösenordsgissning',
+	'captcha-desc' => '”Captcha”-metoder för att skydda mot skräppost och lösenordsgissning',
 	'captcha-label' => 'CAPTCHA',
 	'captcha-addurl' => 'Din ändring innebär nya externa länkar i texten. För att skydda wikin mot automatisk spam måste du skriva svaret på följande räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
 	'captcha-badlogin' => 'För att skydda mot wikin mot försök att knäcka lösenord på automatisk väg, måste du skriva svaret på följande räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
@@ -3680,7 +3753,7 @@ räkneuppgift i rutan ([[Special:Captcha/help|mer information]]):',
 	'captcha-createaccount-fail' => 'Bekräftelsekoden är felaktig eller saknas.',
 	'captcha-create' => 'För att skapa den här sidan måste du skriva svaret på följande räkneuppgift
 i rutan ([[Special:Captcha/help|mer information]]):',
-	'captcha-sendemail' => 'För att skydda wikin mot automatiska skräpinlägg, ber vi dig att lösa den enkla matematiska ekvationen här nedanför och skriva in svaret i rutan ([[Special:Captcha/help|mer information]]):',
+	'captcha-sendemail' => 'För att skydda wikin mot spam, ber vi dig att lösa den här enkla räkneuppgiften, och skriva in svaret i rutan ([[Special:Captcha/help|mer information]]):',
 	'captcha-sendemail-fail' => 'Felaktig eller saknad bekräftelsekod.',
 	'captcha-disabledinapi' => 'Denna åtgärd kräver en captcha, så den kan inte utföras genom APIet.',
 	'captchahelp-title' => 'Captchahjälp',
@@ -3693,7 +3766,7 @@ Eftersom den uppgiften är svår att automatisera, låter den de flesta riktiga
 
 Tyvärr kan det här orsaka problem för användare med nedsatt syn eller som använder text- eller talbaserade webbläsare.
 För tillfället finns inga ljudbaserade alternativ tillgängliga.
-Kontakta [[{{MediaWiki:Grouppage-sysop}}|webbplatsens administratörer]] för hjälp om det här hindrar dig från att göra legitima ändringar.
+Kontakta [[Special:ListAdmins|webbplatsens administratörer]] för hjälp om det här hindrar dig från att göra legitima ändringar.
 
 Tryck på bakåtknappen i din webbläsare för att gå tillbaks till sidredigeringsläget.',
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -3738,7 +3811,7 @@ $messages['ta'] = array(
 
 பார்வைக் குறைபாடு உடையோர், முதியோர் மற்றும் வெறும் வார்த்தைகள் அல்லது ஒலி அடிப்படையிலான உலாவிகளைப் பயன்படுத்துவோருக்கு இது துரதிஷ்டவசமாகத் தொல்லையளிக்கக் கூடும். 
 
-இச்சமயத்தில் எழுத்துகளுக்கான ஒலி மாற்று எங்களிடம் இல்லை. உங்களுக்கு ஏதேனும் உதவி தேவைப்பட்டால் [[{{MediaWiki:Grouppage-sysop}}|site administrators]] ஐத் தொடர்பு கொள்ளவும். 
+இச்சமயத்தில் எழுத்துகளுக்கான ஒலி மாற்று எங்களிடம் இல்லை. உங்களுக்கு ஏதேனும் உதவி தேவைப்பட்டால் [[Special:ListAdmins|site administrators]] ஐத் தொடர்பு கொள்ளவும். 
 
 தொகுத்தல் பக்கத்திற்குச் செல்ல உங்கள் உலாவியில் “பின்செல்” பொத்தானை அழுத்தவும்.',
 );
@@ -3764,9 +3837,9 @@ $messages['te'] = array(
 కొన్నిసార్లు, ముఖ్యంగా ఏదైనా పేజీ నుండి బయటకు లింకులు ఇచ్చేటపుడు, వంకర్లు తిరిగిపోయి ఉన్న పదాల బొమ్మను చూపించి ఆ పదాన్ని టైపు చెయ్యమని వికీ మిమ్మల్ని అడగవచ్చు. దీన్ని ఆటోమాటిక్ టూల్సుతో చెయ్యడం చాలా కష్టం కాబట్టి, స్పాము జిత్తులు చెల్లవు; మనుష్యులు మాత్రం మామూలుగానే చెయ్యగలరు.
 
 దురదృష్టవశాత్తూ, చూపు సరిగా లేనివారికి, టెక్స్టు బ్రౌజర్లు మాత్రమే వాడేవారికి ఇది అసౌకర్యం కలిగిస్తుంది. ప్రస్తుతానికి శబ్దం వినిపించే వెసులుబాటు మాకు లేదు. మీరు రచనలు చెయ్యకుండా ఇది అడ్డుపడుతుంటే, సహాయం కోసం సైటు నిర్వాహకుణ్ణి సంప్రదించండి.
-మీరు చెసే విలువయిన, సమ్మతమయిన వ్యాస మార్పులు భద్రపరచటము కుదరకపొతె, దయచేసి [[{{MediaWiki:Grouppage-sysop}}|సైటు నిర్వహణాధికారి]]కి లేఖ రాయండి.
+మీరు చెసే విలువయిన, సమ్మతమయిన వ్యాస మార్పులు భద్రపరచటము కుదరకపొతె, దయచేసి [[Special:ListAdmins|సైటు నిర్వహణాధికారి]]కి లేఖ రాయండి.
 
-మీ బ్రౌజర్లోని బ్యాక్(back) మీటను నొక్కి ఇంతకు ముందరి పేజీకి వెళ్ళండి.',
+మీ బ్రౌజర్లోని బ్యాక్(back) మీటను నొక్కి ఇంతకు ముందరి పేజీకి వెళ్ళండి.', # Fuzzy
 	'captcha-addurl-whitelist' => ' #<!-- ఈ పంక్తిని ఉన్నదున్నట్లు ఇలాగే వదిలివేయండి --> <pre>
 # ఇక్కడ రాయాల్సిన విధానం ఇదీ:
 #  * "#" అనే అక్షరం నుండి ఆ పంక్తి చివరివరకూ వ్యాఖ్యానం
@@ -3890,7 +3963,7 @@ Dahil sa isa itong gawaing mahirap na gawing kusa, napapahintulutan nito ang hal
 
 Sa kasawiang palad maaaring hindi makaginhawa ito sa mga tagagamit na may malabong paningin o gumagamit ng pangteksto o pangpagsasalitang mga pantingin-tingin.
 Sa ngayon wala pa kaming pamalit na isang pangpandinig.
-Makipag-ugnayan lamang sa [[{{MediaWiki:Grouppage-sysop}}|mga tagapangasiwa ng sityo]] para humingi ng tulong kapag hindi inaasahang mapigilan ka sa pagsasagawa ng mga tunay na pagpapaskil.
+Makipag-ugnayan lamang sa [[Special:ListAdmins|mga tagapangasiwa ng sityo]] para humingi ng tulong kapag hindi inaasahang mapigilan ka sa pagsasagawa ng mga tunay na pagpapaskil.
 
 Pindutin ang pindutang 'bumalik' sa iyong pantingin-tingin upang makabalik sa pahinang pampatnugot.",
 	'captcha-addurl-whitelist' => " #<!-- leave this line exactly as it is --> <pre>
@@ -3925,7 +3998,7 @@ Otomatik spamdan korunmak için lütfen aşağıdaki basit soruyu yanıtlayın v
 
 Bazen, özellikle bir başka internet sitesine bağlantı eklerken, bozulmuş ve renklendirilmiş harflerden oluşan bir resim gösterilebilir ve sizden bu harfleri kutucuğa girmenizi istenir. Bu, otomatizasyonu oldukça zor bir iş olduğu için, gerçek insanlar bu işlemi yerine getirebilirken, spam yapmaya yarayan araçlar bunu yapmakta zorlanacaklardır.
 
-Ne var ki bu durum, görme sorunları yaşayan kişiler ve salt yazı-tabanlı ya da salt ses tabanlı internet tarayıcı programları kullanan kimseler için rahatsızlık yaratmaktadır. Ne yazık ki, şu an için sesli bir alternatifimiz bulunmamaktadır. Eğer bu, sizin geçerli gönderiler yapmanıza beklenmedik bir şekilde engel oluyorsa, lütfen destek için [[{{MediaWiki:Grouppage-sysop}}|site yöneticileriyle]] irtibata geçin.
+Ne var ki bu durum, görme sorunları yaşayan kişiler ve salt yazı-tabanlı ya da salt ses tabanlı internet tarayıcı programları kullanan kimseler için rahatsızlık yaratmaktadır. Ne yazık ki, şu an için sesli bir alternatifimiz bulunmamaktadır. Eğer bu, sizin geçerli gönderiler yapmanıza beklenmedik bir şekilde engel oluyorsa, lütfen destek için [[Special:ListAdmins|site yöneticileriyle]] irtibata geçin.
 
 Sayfa düzenleyiciye dönmek için tarayıcınızın 'geri' tuşuna basınız.",
 	'captcha-addurl-whitelist' => ' #<!-- bu satırı olduğu gibi bırakın --> <pre>
@@ -3973,7 +4046,7 @@ $messages['uk'] = array(
 Іноді, наприклад при додаванні на сторінку нового веб-посилання, вікі може показати вам картинку з кольоровим або спотвореним текстом і запропонувати ввести текст, який ви бачите.
 Оскільки подібну задачу важко автоматизувати, це дає можливість більшості людей робити свої зміни, в той час як більшість спамерських і вандальних програм не можуть цього зробити.
 
-На жаль, подібний захист може спричинити незручності для людей із вадами зору. Зараз у нас нема звукової альтернативи для такої перевірки. Будь ласка, зверніться по допомогу до [[{{MediaWiki:Grouppage-sysop}}|адміністраторів]], якщо подібна перевірка заважає вам добросовісно працювати з сайтом.
+На жаль, подібний захист може спричинити незручності для людей із вадами зору. Зараз у нас нема звукової альтернативи для такої перевірки. Будь ласка, зверніться по допомогу до [[Special:ListAdmins|адміністраторів]], якщо подібна перевірка заважає вам добросовісно працювати з сайтом.
 
 Натисніть кнопку «Назад» у вашому браузері, щоб повернутися до редагування.',
 	'captcha-addurl-whitelist' => '#<!-- leave this line exactly as it is --> <pre>
@@ -4007,7 +4080,7 @@ $messages['vec'] = array(
 
 In çerti casi, par esenpio quando se çerca de zontar novi colegamenti web in te na pagina, el software wiki el pol mostrar na imagine con un breve testo colorà e/o distorto, domandàndoghe a l'utente de riscrìvarlo drento na casela fata aposta. Sicome i computer no i xe mìa boni de replicar a la perfezion sta azion, sto mecanismo el ghe consente a (quasi tuti) i utenti reali de conpletar l'inserimento che i volea, inpedéndoghe l'acesso a la magior parte dei spammer e dei altri atachi automatizà.
 
-Sfortunatamente, ste misure de sicureza le pole métar in dificoltà i utenti che gà problemi de vista o quei che dòpara browser testuali o basà su la sintesi vocale. Purtropo al momento no xe disponibile nissun mecanismo alternativo basà su messagio audio; se ste procedure le inpedisse l'inserimento de informazion che se ritien legìtime, se prega de contatar i [[{{MediaWiki:Grouppage-sysop}}|aministradori del sito]] e domandarghe assistensa.
+Sfortunatamente, ste misure de sicureza le pole métar in dificoltà i utenti che gà problemi de vista o quei che dòpara browser testuali o basà su la sintesi vocale. Purtropo al momento no xe disponibile nissun mecanismo alternativo basà su messagio audio; se ste procedure le inpedisse l'inserimento de informazion che se ritien legìtime, se prega de contatar i [[Special:ListAdmins|aministradori del sito]] e domandarghe assistensa.
 
 Struca el boton \"Indrìo\" del to browser par tornar a la pagina de modifica.",
 	'captcha-addurl-whitelist' => ' #<!-- no sta modificar in alcun modo sta riga --> <pre>
@@ -4045,7 +4118,7 @@ Do các phần mềm tự động khó đọc những hình này, nên mọi ng
 
 Tuy vậy, tính năng này có thể bất tiện đối với những độc giả có thị giác yếu hay đang sử dụng trình duyệt bằng văn bản thuần hay trình duyệt bằng tiếng nói.
 Hiện tại chúng tôi chưa có chức năng phát âm thay thế.
-Xin hãy liên lạc với [[{{MediaWiki:Grouppage-sysop}}|người quản trị trang web]] để được trợ giúp nếu điều này vô tình ngăn cản bạn đóng góp nội dung tốt.
+Xin hãy liên lạc với [[Special:ListAdmins|người quản trị trang web]] để được trợ giúp nếu điều này vô tình ngăn cản bạn đóng góp nội dung tốt.
 
 Nhấn chuột vào nút “Back” của trình duyệt để trở lại trang soạn thảo.',
 	'captcha-addurl-whitelist' => ' #<!-- xin để dòng này đừng thay đổi --> <pre>
@@ -4062,7 +4135,8 @@ Nhấn chuột vào nút “Back” của trình duyệt để trở lại trang
  */
 $messages['vo'] = array(
 	'captcha-edit' => 'Ad redakön yegedi at, dunolös, begö! saedami dono e penolös saedoti in bokil ([[Special:Captcha/help|nüns pluik]]):',
-	'captcha-addurl' => 'Redakam olik keninükon yümis plödik nulik. Ad jelön siti ta peneds itjäfidik, dunolös, begö! saedami sököl, e penolös saedoti in bokil ([[Special:Captcha/help|nüns pluik]]):', # Fuzzy
+	'captcha-addurl' => 'Redakam olik keninükon yümis plödik nulik.
+Ad jelön siti ta peneds badik itjäfidik, dunolös, begö! saedami balugik sököl, e penolös saedoti in bokil ad dakipön redakam ola ([[Special:Captcha/help|nüns pluik]]):',
 	'captcha-badlogin' => 'Ad jelön siti ta daget itjäfidik letavödas, dunolös, begö! saedami sököl e penolös saedoti in bokil ([[Special:Captcha/help|nüns pluik]]):', # Fuzzy
 	'captcha-createaccount' => 'Ad jelön siti ta kalijafam itjäfidik, dunolös, begö! saedami sököl e penolös saedoti in bokil ([[Special:Captcha/help|nüns pluik]]):', # Fuzzy
 	'captcha-createaccount-fail' => 'Kot fümükama paneveräton u paseleton.',
@@ -4100,7 +4174,7 @@ Bén seur, on pout todi les disfacer al mwin, mins c' est on soyant ovraedje.
 Adon, pa côps, copurade cwand vos radjoutez des hårdêyes a ene pådje, ou å moumint d' ahiver on novea conte sol wiki, on eployrè ene passete d' acertinaedje, dj' ô bén k' on vos mostere ene imådje avou on tecse kitoirdou eyet vs dimander di taper les mots so l' imådje. Come li ricnoxhance di ç' tecse la est målåjheye a fé otomaticmint pa on robot, çoula permete di leyî les vraiyès djins fé leus candjmints tot arestant l' plupårt des spameus et des sfwaitès atakes pa robot.
 
 Målureuzmint çoula apoite eto des målåjhminces po les cis k' ont des problinmes po vey, ou k' eployèt des betchteus e môde tecse ou båzés sol vwès. Pol moumint, nos n' avans nén ene alternative odio.
-S' i vs plait contactez les [[{{MediaWiki:Grouppage-sysop}}|manaedjeus do site]] po d' l' aidance si çoula vos espaitche di fé vos candjmints ledjitimes.
+S' i vs plait contactez les [[Special:ListAdmins|manaedjeus do site]] po d' l' aidance si çoula vos espaitche di fé vos candjmints ledjitimes.
 
 Clitchîz sol boton «En erî» di vosse betchteu waibe po rivni al pådje di dvant.",
 	'captcha-addurl-whitelist' => " #<!-- leyîz cisse roye chal come elle est (oyi, i gn a-st on vude al comince) --><pre>
@@ -4184,7 +4258,7 @@ $messages['zh-hans'] = array(
 
 有时，特别是当给一个页面添加新的网页链接时，本站会让你看一幅有颜色的或者有变形文字的图像，并且要你输入所显示的文字。因为这是难以自动完成的一项任务，它将允许人保存他们的编辑，同时阻止大多数发送垃圾邮件者和其他机器人的攻击。
 
-令人遗憾是，这会使得视力不好的人，或者使用基於文本或者基於声音的浏览器的用户感到不便。而目前我们还没有提供的音频的选择。如果这正好阻止你进行正常的编辑，请和[[{{MediaWiki:Grouppage-sysop}}|站点管理员]]联系获得帮助。
+令人遗憾是，这会使得视力不好的人，或者使用基於文本或者基於声音的浏览器的用户感到不便。而目前我们还没有提供的音频的选择。如果这正好阻止你进行正常的编辑，请和[[Special:ListAdmins|站点管理员]]联系获得帮助。
 
 点击浏览器中的“后退”按钮返回你所编辑的页面。',
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
@@ -4221,7 +4295,7 @@ $messages['zh-hant'] = array(
 
 有時，特別是當給一個頁面添加新的網頁連結時，本站會讓你看一幅有顏色的或者有變形文字的圖像，並且要你輸入所顯示的文字。因為這是難以自動完成的一項任務，它將允許人儲存他們的編輯，同時阻止大多數發送垃圾郵件者和其他機器人的攻擊。
 
-令人遺憾是，這會使得視力不好的人，或者使用基於文字或者基於聲音的瀏覽器的使用者感到不便。而目前我們還沒有提供的音訊的選擇。如果這正好阻止你進行正常的編輯，請和[[{{MediaWiki:Grouppage-sysop}}|站點管理員]]聯繫取得幫助。
+令人遺憾是，這會使得視力不好的人，或者使用基於文字或者基於聲音的瀏覽器的使用者感到不便。而目前我們還沒有提供的音訊的選擇。如果這正好阻止你進行正常的編輯，請和[[Special:ListAdmins|站點管理員]]聯繫取得幫助。
 
 點擊瀏覽器中的「後退」按鈕返回你所編輯的頁面。',
 	'captcha-addurl-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
diff --git a/extensions/ConfirmEdit/FancyCaptcha.i18n.php b/extensions/ConfirmEdit/FancyCaptcha.i18n.php
index f251377d..2ac1c973 100644
--- a/extensions/ConfirmEdit/FancyCaptcha.i18n.php
+++ b/extensions/ConfirmEdit/FancyCaptcha.i18n.php
@@ -13,12 +13,12 @@ $messages = array();
 $messages['en'] = array(
 	'fancycaptcha-desc'          => 'Fancy CAPTCHA generator for Confirm Edit',
 	'fancycaptcha-addurl'        => 'Your edit includes new external links.
-To help protect against automated spam, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
-	'fancycaptcha-badlogin'      => 'To help protect against automated password cracking, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
-	'fancycaptcha-createaccount' => 'To help protect against automated account creation, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
+To protect the wiki against automated spam, we kindly ask you to enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
+	'fancycaptcha-badlogin'      => 'To protect the wiki against automated password cracking, we kindly ask you to enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
+	'fancycaptcha-createaccount' => 'To protect the wiki against automated account creation, we kindly ask you to enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
 	'fancycaptcha-create'        => 'To create the page, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
 	'fancycaptcha-edit'          => 'To edit this page, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
-	'fancycaptcha-sendemail'     => 'To help protect against automated spamming, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
+	'fancycaptcha-sendemail'     => 'To protect the wiki against automated spamming, we kindly ask you to enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
 	'fancycaptcha-reload-text'   => 'Refresh',
 );
 
@@ -37,26 +37,27 @@ $messages['qqq'] = array(
 	'fancycaptcha-create' => '{{Related|ConfirmEdit-create}}',
 	'fancycaptcha-edit' => '{{Related|ConfirmEdit-edit}}',
 	'fancycaptcha-sendemail' => '{{Related|ConfirmEdit-sendemail}}',
-	'fancycaptcha-reload-text' => 'Prompts a click to get a new FancyCaptcha image.',
+	'fancycaptcha-reload-text' => 'Prompts a click to get a new FancyCaptcha image.
+{{Identical|Refresh}}',
 );
 
 /** Gheg Albanian (Gegë)
  * @author Mdupont
  */
 $messages['aln'] = array(
-	'fancycaptcha-addurl' => 'Your redakto përfshin të jashtme lidhje të reja. Për të ndihmuar në mbrojtjen kundër spam automatizuar, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):',
-	'fancycaptcha-badlogin' => 'Për të ndihmuar në mbrojtjen kundër fjalëkalimin automatizuar plasaritje, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):',
-	'fancycaptcha-createaccount' => 'Për të ndihmuar në mbrojtjen kundër krijimit llogari e automatizuar, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):',
+	'fancycaptcha-addurl' => 'Your redakto përfshin të jashtme lidhje të reja. Për të ndihmuar në mbrojtjen kundër spam automatizuar, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Për të ndihmuar në mbrojtjen kundër fjalëkalimin automatizuar plasaritje, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Për të ndihmuar në mbrojtjen kundër krijimit llogari e automatizuar, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
 	'fancycaptcha-create' => 'Për të krijuar një faqe, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):',
 	'fancycaptcha-edit' => 'Për të redaktuar këtë faqe, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):',
-	'fancycaptcha-sendemail' => 'Për të ndihmuar në mbrojtjen kundër spamming automatizuar, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):',
+	'fancycaptcha-sendemail' => 'Për të ndihmuar në mbrojtjen kundër spamming automatizuar, ju lutem shkruani fjalët që shfaqen poshtë në kuti ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
 );
 
 /** Amharic (አማርኛ)
  * @author Codex Sinaiticus
  */
 $messages['am'] = array(
-	'fancycaptcha-createaccount' => 'ያልተፈለገ የመኪናነት አባልነት ለመከላከል፥ አባል ለመሆን በዚህ ምስል የታዩት እንግሊዝኛ ቃላት ወይም ቁጥር መልስ በትክክል መጻፍ ግዴታ ነው። ([[Special:Captcha/help|ይህ ምንድነው?]]) (To help protect against automated spam, you must type in the words or correct number answer exactly as seen beneath here before registering your account:)<br />',
+	'fancycaptcha-createaccount' => 'ያልተፈለገ የመኪናነት አባልነት ለመከላከል፥ አባል ለመሆን በዚህ ምስል የታዩት እንግሊዝኛ ቃላት ወይም ቁጥር መልስ በትክክል መጻፍ ግዴታ ነው። ([[Special:Captcha/help|ይህ ምንድነው?]]) (To help protect against automated spam, you must type in the words or correct number answer exactly as seen beneath here before registering your account:)<br />', # Fuzzy
 );
 
 /** Aragonese (aragonés)
@@ -64,14 +65,14 @@ $messages['am'] = array(
  */
 $messages['an'] = array(
 	'fancycaptcha-desc' => 'Chenerador chocant de CAPTCHAs ta Confirmar Edicions.',
-	'fancycaptcha-addurl' => "Ha encluyito vinclos esternos en a suya edición. Ta aduyar a protecher contra o spam automatico, escriba por favor as parolas que amaneixen en a caixa d'o cobaixo ([[Special:Captcha/help|más información]]):",
-	'fancycaptcha-badlogin' => "Ta aduyar-nos en a protección contra o trenque automatico de claus d'acceso, escriba por favor as parolas que amaneixen en a caixa d'o cobaixo ([[Special:Captcha/help|más información]]):",
-	'fancycaptcha-createaccount' => 'Ta aduyar a protecher contra a creyación automatica de cuentas, escriba por favor en o quatrón as parolas que amaneixen debaixo ([[Special:Captcha/help|más información]]):',
+	'fancycaptcha-addurl' => "Ha encluyito vinclos esternos en a suya edición. Ta aduyar a protecher contra o spam automatico, escriba por favor as parolas que amaneixen en a caixa d'o cobaixo ([[Special:Captcha/help|más información]]):", # Fuzzy
+	'fancycaptcha-badlogin' => "Ta aduyar-nos en a protección contra o trenque automatico de claus d'acceso, escriba por favor as parolas que amaneixen en a caixa d'o cobaixo ([[Special:Captcha/help|más información]]):", # Fuzzy
+	'fancycaptcha-createaccount' => 'Ta aduyar a protecher contra a creyación automatica de cuentas, escriba por favor en o quatrón as parolas que amaneixen debaixo ([[Special:Captcha/help|más información]]):', # Fuzzy
 	'fancycaptcha-create' => "Ta creyar a pachina, escriba por favor as parolas que amaneixen en a caixa d'o cobaixo
 ([[Special:Captcha/help|más información]]):",
 	'fancycaptcha-edit' => "Ta editar ista pachina, escriba por favor as parolas que amaneixen en a caixa d'o cobaixo
 ([[Special:Captcha/help|más información]]):",
-	'fancycaptcha-sendemail' => 'Ta protecher-nos contra o spam automatizau por favor escriba as parolas que amaneixen en o siguient quadro ([[Special:Captcha/help|mas información]]):',
+	'fancycaptcha-sendemail' => 'Ta protecher-nos contra o spam automatizau por favor escriba as parolas que amaneixen en o siguient quadro ([[Special:Captcha/help|mas información]]):', # Fuzzy
 );
 
 /** Arabic (العربية)
@@ -81,14 +82,14 @@ $messages['an'] = array(
 $messages['ar'] = array(
 	'fancycaptcha-desc' => 'مولد فانسي كابتشا لConfirm Edit',
 	'fancycaptcha-addurl' => 'تعديلك يتضمن وصلات خارجية جديدة.
-للحماية من السبام الأوتوماتيكي، من فضلك أدخل الكلمات التي تظهر بالأسفل في الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):',
-	'fancycaptcha-badlogin' => 'للمساعدة في الحماية ضد سرقة كلمات السر، من فضلك أدخل الكلمات التي تظهر بالأسفل في الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):',
-	'fancycaptcha-createaccount' => 'للمساعدة في منع إنشاء حسابات بطريقة أوتوماتيكية، قم من فضلك بإدخال الكلمات التي تظهر أدناه في الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):',
+للحماية من السبام الأوتوماتيكي، من فضلك أدخل الكلمات التي تظهر بالأسفل في الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'للمساعدة في الحماية ضد سرقة كلمات السر، من فضلك أدخل الكلمات التي تظهر بالأسفل في الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'للمساعدة في منع إنشاء حسابات بطريقة أوتوماتيكية، قم من فضلك بإدخال الكلمات التي تظهر أدناه في الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
 	'fancycaptcha-create' => 'لإنشاء الصفحة، من فضلك أدخل الكلمات التي تظهر بالأسفل في الصندوق
 ([[Special:Captcha/help|مزيد من المعلومات]]):',
 	'fancycaptcha-edit' => 'لتعديل هذه الصفحة، من فضلك أدخل الكلمات التي تظهر بالأسفل في الصندوق
 ([[Special:Captcha/help|مزيد من المعلومات]]):',
-	'fancycaptcha-sendemail' => 'للمساعدة في منع إنشاء حسابات بطريقة أوتوماتيكية، قم من فضلك بإدخال الكلمات التي تظهر أدناه في الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):',
+	'fancycaptcha-sendemail' => 'للمساعدة في منع إنشاء حسابات بطريقة أوتوماتيكية، قم من فضلك بإدخال الكلمات التي تظهر أدناه في الصندوق ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
 );
 
 /** Egyptian Spoken Arabic (مصرى)
@@ -97,28 +98,28 @@ $messages['ar'] = array(
  */
 $messages['arz'] = array(
 	'fancycaptcha-addurl' => 'تعديلك فيه لينكات خارجية جديدة
-علشان تساعد فى الحماية من السبام الاوتوماتيكى، لو سمحت تكتب الكلمات اللى باينة تحت فى الصندوء ([[Special:Captcha/help|معلومات زيادة]]):',
-	'fancycaptcha-badlogin' => 'علشان تساعد فى الحماية من السرقة الاتوماتيكية للباسورد، لو سمحت تدخل الكلمات اللى باينة تحت فى الصندوء ([[Special:Captcha/help|معلومات زيادة]]):',
-	'fancycaptcha-createaccount' => 'علشان تساعد فى الحماية من الفتح الاوتوماتيكى للحسابات،لو سمحت تدخل الكلمات اللى باينة تحت فى الصندوء ([[Special:Captcha/help|معلومات زيادة]]):',
+علشان تساعد فى الحماية من السبام الاوتوماتيكى، لو سمحت تكتب الكلمات اللى باينة تحت فى الصندوء ([[Special:Captcha/help|معلومات زيادة]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'علشان تساعد فى الحماية من السرقة الاتوماتيكية للباسورد، لو سمحت تدخل الكلمات اللى باينة تحت فى الصندوء ([[Special:Captcha/help|معلومات زيادة]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'علشان تساعد فى الحماية من الفتح الاوتوماتيكى للحسابات،لو سمحت تدخل الكلمات اللى باينة تحت فى الصندوء ([[Special:Captcha/help|معلومات زيادة]]):', # Fuzzy
 	'fancycaptcha-create' => 'علشان تبتدى صفحة جديدة، لو سمحت تدخل الكلمات اللى ظاهرة تحت فى الصندوق
 ([[Special:Captcha/help|معلومات زيادة]]):',
 	'fancycaptcha-edit' => 'علشان تعدل فى الصفحة دى،لو سمحت تكتب الكلمات اللى باينة تحت فى الصندوء  ([[Special:Captcha/help|معلومات زيادة]]):',
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Chaipau
  * @author Gitartha.bordoloi
  * @author Rajuonline
  */
 $messages['as'] = array(
 	'fancycaptcha-addurl' => 'আপোনাৰ সম্পাদনাত বাহ্যিক সংযোগ আছে।
-স্বয়ংক্ৰীয় সম্পাদনাৰ পৰা হাত সাৰিবলৈ, তলত দেখিবলৈ পোৱা শব্দটো বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথ্য]]):',
+স্বয়ংক্ৰীয় সম্পাদনাৰ পৰা হাত সাৰিবলৈ, তলত দেখিবলৈ পোৱা শব্দটো বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথ্য]]):', # Fuzzy
 	'fancycaptcha-badlogin' => 'স্বয়ংক্ৰীয় গুপ্তশব্দ চুৰিৰ পৰা হাত সাৰিবলৈ,
-তলত দেখিবলৈ পোৱা শব্দটো বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথ্য]]):',
-	'fancycaptcha-createaccount' => 'স্বয়ংক্ৰীয় নতুন সদস্যভুক্তিৰ পৰা হাত সাৰিবলৈ, তলত দেখিবলৈ পোৱা শব্দটো বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথ্য]]):',
+তলত দেখিবলৈ পোৱা শব্দটো বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথ্য]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'স্বয়ংক্ৰীয় নতুন সদস্যভুক্তিৰ পৰা হাত সাৰিবলৈ, তলত দেখিবলৈ পোৱা শব্দটো বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথ্য]]):', # Fuzzy
 	'fancycaptcha-create' => 'পৃষ্ঠাটো বনাবলৈ, তলত দেখিবলৈ পোৱা শব্দটো বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথ্য]]):',
 	'fancycaptcha-edit' => 'এই পৃষ্ঠাটো সম্পাদনা কৰিবলৈ, তলত দেখিবলৈ পোৱা শব্দটো বাকচৰ ভিতৰত লিখক। ([[Special:Captcha/help|অধিক তথ্য]]):',
-	'fancycaptcha-sendemail' => 'স্বয়ংক্ৰিয় স্পেমিঙৰ পৰা বাচিবলৈ অনুগ্ৰহ কৰি তলৰ বাকছটোৰ তলত ওলোৱা আখৰকেইটা লিখক ([[Special:Captcha/help|অধিক তথ্য]]):',
+	'fancycaptcha-sendemail' => 'স্বয়ংক্ৰিয় স্পেমিঙৰ পৰা বাচিবলৈ অনুগ্ৰহ কৰি তলৰ বাকছটোৰ তলত ওলোৱা আখৰকেইটা লিখক ([[Special:Captcha/help|অধিক তথ্য]]):', # Fuzzy
 );
 
 /** Asturian (asturianu)
@@ -126,39 +127,54 @@ $messages['as'] = array(
  * @author Xuacu
  */
 $messages['ast'] = array(
-	'fancycaptcha-addurl' => "La to edición inclúi nuevos enllaces esternos. P'aidar a protexer escontra'l spam automatizáu, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
-	'fancycaptcha-badlogin' => "P'ayudar a protexer escontra'l descifráu automáticu de claves, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
-	'fancycaptcha-createaccount' => "P'ayudar a protexer escontra la creación automática de cuentes, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
+	'fancycaptcha-addurl' => "La so edición incluye nuevos enllaces esternos. Pa protexer la wiki escontra'l spam automatizáu, pidimos-y qu'escriba nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
+	'fancycaptcha-badlogin' => "Pa protexer la wiki escontra'l descifráu automáticu de claves, pidimos-y qu'escriba nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
+	'fancycaptcha-createaccount' => "Pa protexer la wiki escontra la creación automática de cuentes, pidimos-y qu'escriba nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
 	'fancycaptcha-create' => "Pa crear la páxina, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
 	'fancycaptcha-edit' => "Pa editar la páxina, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
-	'fancycaptcha-sendemail' => "P'ayudar a protexer escontra'l corréu puxarra automáticu, por favor escribi nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
+	'fancycaptcha-sendemail' => "Pa protexer la wiki escontra'l corréu puxarra automáticu, pidimos-y qu'escriba nel caxellu les pallabres qu'apaecen embaxo ([[Special:Captcha/help|más información]]):",
 	'fancycaptcha-reload-text' => 'Refrescar',
 );
 
 /** Bashkir (башҡортса)
  * @author Assele
+ * @author Рустам Нурыев
  */
 $messages['ba'] = array(
 	'fancycaptcha-addurl' => 'Һеҙҙең текстығыҙҙа яңы тышҡы һылтанмалар бар.
-Автоматик спамдан һаҡлау маҡсатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
-	'fancycaptcha-badlogin' => 'Паролде автоматик ватыуҙан һаҡлау маҡсатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
-	'fancycaptcha-createaccount' => 'Иҫәп яҙмаларын автоматик булдырыуҙан һаҡлау маҡсатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
+Автоматик спамдан һаҡлау маҡсатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Серһүҙҙе автоматик ватыуҙан һаҡлау маҡсатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Иҫәп яҙмаларын автоматик булдырыуҙан һаҡлау маҡсатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
 	'fancycaptcha-create' => 'Яңы бит булдырыу өсөн, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
 	'fancycaptcha-edit' => 'Был битте мөхәррирләү өсөн, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
-	'fancycaptcha-sendemail' => 'Автоматик спамдан һаҡлау маҡсатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
+	'fancycaptcha-sendemail' => 'Автоматик спамдан һаҡлау маҡсатында, зинһар, күрһәтелгән һүҙҙәрҙе түбәндәге юлға керетегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
 );
 
 /** Southern Balochi (بلوچی مکرانی)
  * @author Mostafadaneshvar
  */
 $messages['bcc'] = array(
-	'fancycaptcha-addurl' => '‎بست',
-	'fancycaptcha-badlogin' => 'په کمک په محافظت چه اتوماتیکی پروشگ کلمه رمز، لطفا کلماتی که ته جهلگی جعبه ظاهر انت واردش کنیت  ([[Special:Captcha/help|گیشترین اطلاعات]]):',
-	'fancycaptcha-createaccount' => 'په کمک په محافظت چه اتوماتیکی شرکتن حساب، لطفا کلماتی که ته جهلگی جعبه ظاهر انت واردش کنیت  ([[Special:Captcha/help|گیشترین اطلاعات]]):',
+	'fancycaptcha-addurl' => '‎بست', # Fuzzy
+	'fancycaptcha-badlogin' => 'په کمک په محافظت چه اتوماتیکی پروشگ کلمه رمز، لطفا کلماتی که ته جهلگی جعبه ظاهر انت واردش کنیت  ([[Special:Captcha/help|گیشترین اطلاعات]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'په کمک په محافظت چه اتوماتیکی شرکتن حساب، لطفا کلماتی که ته جهلگی جعبه ظاهر انت واردش کنیت  ([[Special:Captcha/help|گیشترین اطلاعات]]):', # Fuzzy
 	'fancycaptcha-create' => 'په شرکتن صفحه، لطفا کلماتی که ته جهلگی جعبه ظاهراند واردش کنیت ([[Special:Captcha/help|گیشتر اطلاعات]]):',
 	'fancycaptcha-edit' => 'په اصلاح کتن ای صفحه، لطفا کلماتی که ته جهلگی جعبه ظاهراند واردش کنیت ([[Special:Captcha/help|گیشتر اطلاعات]]):',
 );
 
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+	'fancycaptcha-addurl' => 'An saimong pagliwat minabale nin baguhong mga panluwas na sugpon.
+Tanganing makatabang na protektaran kontra sa awtomatikong espam, pakikaag an mga tataramon na ipinapahiling sa ibaba sa laog nin kahon ([[Special:Captcha/help|kadagdagang impormasyon]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Tanganing makatabang na magprotekta kontra sa awtomatikong pagbaak kan pasa-taramon, pakikaag an mga tataramon na ipinapahiling sa ibaba sa laog nin kahon ([[Special:Captcha/help|kadagdagang impormasyon]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Tanganing makatabang na magprotekta kontra sa awtomatikong pagmumukna nin panindog, pakikaag an mga tataramon na ipinapahiling sa ibaba sa laog nin kahon ([[Special:Captcha/help|kadagdagang impormasyon]]):', # Fuzzy
+	'fancycaptcha-create' => 'Tanganing makapagmukna nin pahina, pakikaag kan mga tataramon na ipinapahiling sa ibaba sa laog nin kahon ([[Special:Captcha/help|kadagdagang impormasyon]]):',
+	'fancycaptcha-edit' => 'Tanganing makapagliwat kaining pahina, pakikaag an mga tataramon na ipinapahiling sa ibaba sa laog nin kahon ([[Special:Captcha/help|kadagdagang impormasyon]]):',
+	'fancycaptcha-sendemail' => 'Tanganing makatabang na magprotekta kontra sa awtomatikong pag-eespam, pakikaag an mga tataramon na ipinapahiling sa ibaba sa laog nin kahon ([[Special:Captcha/help|kadagdagang impormasyon]]):', # Fuzzy
+	'fancycaptcha-reload-text' => 'Preskohon otro',
+);
+
 /** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  * @author EugeneZelenko
  * @author Jim-by
@@ -167,12 +183,12 @@ $messages['bcc'] = array(
  */
 $messages['be-tarask'] = array(
 	'fancycaptcha-addurl' => 'Вашае рэдагаваньне ўтрымлівае новыя вонкавыя спасылкі.
-У мэтах абароны ад спаму, калі ласка, увядзіце словы, якія паказаныя ў выяве ([[Special:Captcha/help|болей інфармацыі]]):',
-	'fancycaptcha-badlogin' => 'У мэтах абароны ад аўтаматычнага злому пароляў, калі ласка, увядзіце словы, якія паказаныя ў выяве ([[Special:Captcha/help|болей інфармацыі]]):',
-	'fancycaptcha-createaccount' => 'У мэтах абароны ад аўтаматычнага стварэньня рахункаў, калі ласка, увядзіце словы, якія паказаныя ў выяве ([[Special:Captcha/help|болей інфармацыі]]):',
+У мэтах абароны ад спаму, калі ласка, увядзіце словы, якія паказаныя ў выяве ([[Special:Captcha/help|болей інфармацыі]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'У мэтах абароны ад аўтаматычнага злому пароляў, калі ласка, увядзіце словы, якія паказаныя ў выяве ([[Special:Captcha/help|болей інфармацыі]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'У мэтах абароны ад аўтаматычнага стварэньня рахункаў, калі ласка, увядзіце словы, якія паказаныя ў выяве ([[Special:Captcha/help|болей інфармацыі]]):', # Fuzzy
 	'fancycaptcha-create' => 'Для стварэньня старонкі, калі ласка, увядзіце словы, якія паказаныя ў выяве ([[Special:Captcha/help|болей інфармацыі]]):',
 	'fancycaptcha-edit' => 'Для рэдагаваньня гэтай старонкі, калі ласка, увядзіце словы, якія паказаныя ў выяве ([[Special:Captcha/help|болей інфармацыі]]):',
-	'fancycaptcha-sendemail' => 'У мэтах абароны супраць аўтаматычнага спаму, калі ласка, увядзіце словы паказаныя ніжэй у полі ([[Special:Captcha/help|дадатковая інфармацыя]]):',
+	'fancycaptcha-sendemail' => 'У мэтах абароны супраць аўтаматычнага спаму, калі ласка, увядзіце словы паказаныя ніжэй у полі ([[Special:Captcha/help|дадатковая інфармацыя]]):', # Fuzzy
 	'fancycaptcha-reload-text' => 'Абнавіць',
 );
 
@@ -181,12 +197,12 @@ $messages['be-tarask'] = array(
  * @author DCLXVI
  */
 $messages['bg'] = array(
-	'fancycaptcha-addurl' => 'Текущата редакция включва нови външни препратки. Като защита от автоматизиран спам, системата изисква от потребителите да въведат думите, показани по-долу в текстовата кутия ([[Special:Captcha/help|повече информация]]):',
-	'fancycaptcha-badlogin' => 'Като защита срещу опити за налучкване на паролата ви, моля, въведете буквите, които виждате на картинката ([[Special:Captcha/help|повече информация]]):',
-	'fancycaptcha-createaccount' => 'Системата за защита от автоматично създаване на потребителски сметки изисква да въведете това, което виждате в кутията по-долу ([[Special:Captcha/help|повече информация]]):',
+	'fancycaptcha-addurl' => 'Текущата редакция включва нови външни препратки. Като защита от автоматизиран спам, системата изисква от потребителите да въведат думите, показани по-долу в текстовата кутия ([[Special:Captcha/help|повече информация]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Като защита срещу опити за налучкване на паролата ви, моля, въведете буквите, които виждате на картинката ([[Special:Captcha/help|повече информация]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Системата за защита от автоматично създаване на потребителски сметки изисква да въведете това, което виждате в кутията по-долу ([[Special:Captcha/help|повече информация]]):', # Fuzzy
 	'fancycaptcha-create' => 'За създаване на страницата е необходимо да се въведат думите от картинката в полето по-долу ([[Special:Captcha/help|повече информация]]):',
 	'fancycaptcha-edit' => 'За редактиране на страницата е необходимо да се въведат думите от картинката в полето по-долу ([[Special:Captcha/help|повече информация]]):',
-	'fancycaptcha-sendemail' => 'Като защита срещу автоматизиран спам, въведете в кутията думите, които са показани по-долу ([[Special:Captcha/help|повече информация]]):',
+	'fancycaptcha-sendemail' => 'Като защита срещу автоматизиран спам, въведете в кутията думите, които са показани по-долу ([[Special:Captcha/help|повече информация]]):', # Fuzzy
 );
 
 /** Bengali (বাংলা)
@@ -194,39 +210,43 @@ $messages['bg'] = array(
  * @author Zaheen
  */
 $messages['bn'] = array(
-	'fancycaptcha-addurl' => 'আপনার সম্পাদনাটিতে নতুন বহিঃসংযোগ আছে। স্বয়ংক্রিয় স্প্যামের বিরুদ্ধে সুরক্ষার খাতিরে অনুগ্রহ করে নিচের বাক্সে দেখানো শব্দগুলি প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):',
-	'fancycaptcha-badlogin' => 'স্বয়ংক্রিয় শব্দচাবি ক্র্যাকিং-এর বিরুদ্ধে সুরক্ষার খাতিরে অনুগ্রহ করে নিচের বাক্সে দেখানো শব্দগুলি প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):',
-	'fancycaptcha-createaccount' => 'স্বয়ংক্রিয় অ্যাকাউন্ট সৃষ্টির বিরুদ্ধে সুরক্ষার জন্য অনুগ্রহ করে নিচের বাক্সে দেখানো শব্দগুলি প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):',
+	'fancycaptcha-addurl' => 'আপনার সম্পাদনাটিতে নতুন বহিঃসংযোগ আছে। স্বয়ংক্রিয় স্প্যামের বিরুদ্ধে সুরক্ষার খাতিরে অনুগ্রহ করে নিচের বাক্সে দেখানো শব্দগুলি প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'স্বয়ংক্রিয় শব্দচাবি ক্র্যাকিং-এর বিরুদ্ধে সুরক্ষার খাতিরে অনুগ্রহ করে নিচের বাক্সে দেখানো শব্দগুলি প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'স্বয়ংক্রিয় অ্যাকাউন্ট সৃষ্টির বিরুদ্ধে সুরক্ষার জন্য অনুগ্রহ করে নিচের বাক্সে দেখানো শব্দগুলি প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):', # Fuzzy
 	'fancycaptcha-create' => 'পাতাটি সৃষ্টি করতে চাইলে অনুগ্রহ করে নিচের বাক্সে দেখানো শব্দগুলি প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):',
 	'fancycaptcha-edit' => 'পাতাটি সম্পাদনা করতে চাইলে অনুগ্রহ করে নিচের বাক্সে দেখানো শব্দগুলি প্রবেশ করান
 ([[Special:Captcha/help|আরও তথ্য]]):',
-	'fancycaptcha-sendemail' => 'স্বয়ংক্রিয় স্প্যামিং এর বিরুদ্ধে সুরক্ষার খাতিরে অনুগ্রহ করে নিচের বাক্সে দেখানো শব্দগুলি প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):',
+	'fancycaptcha-sendemail' => 'স্বয়ংক্রিয় স্প্যামিং এর বিরুদ্ধে সুরক্ষার খাতিরে অনুগ্রহ করে নিচের বাক্সে দেখানো শব্দগুলি প্রবেশ করান ([[Special:Captcha/help|আরও তথ্য]]):', # Fuzzy
 );
 
 /** Breton (brezhoneg)
+ * @author Fohanno
  * @author Fulup
  */
 $messages['br'] = array(
-	'fancycaptcha-addurl' => "Liammoù diavaez nevez zo bet degaset ganeoc'h. Evit stourm a-enep d'ar strob emgefre, skrivit ar gerioù a zeu war wel er voest a-is ([[Special:Captcha/help|gouzout hiroc'h]]):",
-	'fancycaptcha-badlogin' => "A-benn talañ ouzh ar preizhañ kontoù dre c'herioù-tremen emgefre, skrivit er vaezienn ar gerioù merket dindan ([[Special:Captcha/help|Petra eo se?]]):",
+	'fancycaptcha-addurl' => "Liammoù diavaez nevez zo bet degaset ganeoc'h. Evit stourm a-enep d'ar strob emgefre, skrivit ar gerioù a zeu war wel er voest a-is ([[Special:Captcha/help|gouzout hiroc'h]]):", # Fuzzy
+	'fancycaptcha-badlogin' => "A-benn talañ ouzh ar preizhañ kontoù dre c'herioù-tremen emgefre, skrivit er vaezienn ar gerioù merket dindan ([[Special:Captcha/help|Petra eo se?]]):", # Fuzzy
 	'fancycaptcha-createaccount' => "Evit stourm a-enep d'ar c'hontoù  krouet ent emgefre, skrivit ar gerioù
-a zeu war wel er voest a-is ([[Special:Captcha/help|gouzout hiroc'h]]):",
+a zeu war wel er voest a-is ([[Special:Captcha/help|gouzout hiroc'h]]):", # Fuzzy
 	'fancycaptcha-create' => "Liammoù diavaez nevez zo bet degaset ganeoc'h. Evit stourm a-enep d'ar strob emgefre, skrivit ar gerioù a zeu war wel er voest a-is ([[Special:Captcha/help|gouzout hiroc'h]]):",
 	'fancycaptcha-edit' => "Liammoù diavaez nevez zo bet degaset ganeoc'h. Evit stourm a-enep d'ar strob emgefre, skrivit ar gerioù a zeu war wel er voest a-is ([[Special:Captcha/help|gouzout hiroc'h]]):",
-	'fancycaptcha-sendemail' => "Evit hor skoazellañ da zizarbenn ar strob emgefre, adskrivit ar gerioù a welit er voest dindan ([[Special:Captcha/help|gouzout hiroc'h]]):",
+	'fancycaptcha-sendemail' => "Evit hor skoazellañ da zizarbenn ar strob emgefre, adskrivit ar gerioù a welit er voest dindan ([[Special:Captcha/help|gouzout hiroc'h]]):", # Fuzzy
+	'fancycaptcha-reload-text' => 'Freskaat',
 );
 
 /** Bosnian (bosanski)
  * @author CERminator
+ * @author DzWiki
  */
 $messages['bs'] = array(
 	'fancycaptcha-addurl' => 'Vaša izmjena uključuje nove vanjske linkove.
-Da bi se zaštitili od automatskog spama, molimo da unesete riječi koje su prikazane u kutiji ([[Special:Captcha/help|više informacija]]):',
-	'fancycaptcha-badlogin' => 'Da bi pomogli u sprječavanju protiv automatskog probijanja šifre, molimo Vas da unesete riječi koje su prikazane ispod u kutiji ([[Special:Captcha/help|više informacija]]):',
-	'fancycaptcha-createaccount' => 'Da bi pomogli u sprječavanju automatskog pravljenja računa, molimo Vas da unesete riječi koje su prikazane u kutiji ispod ([[Special:Captcha/help|više informacija]]):',
+Da bi se zaštitili od automatskog spama, molimo da unesete riječi koje su prikazane u kutiji ([[Special:Captcha/help|više informacija]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Da bi pomogli u sprječavanju protiv automatskog probijanja šifre, molimo Vas da unesete riječi koje su prikazane ispod u kutiji ([[Special:Captcha/help|više informacija]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Da bi pomogli u sprječavanju automatskog pravljenja računa, molimo Vas da unesete riječi koje su prikazane u kutiji ispod ([[Special:Captcha/help|više informacija]]):', # Fuzzy
 	'fancycaptcha-create' => 'Da bi ste napravili stranicu, molimo Vas unesite riječi koje su prikazane u kutiji ispod ([[Special:Captcha/help|više informacija]]):',
 	'fancycaptcha-edit' => 'Da bi ste uređivali ovu stranicu, molimo Vas unesite riječi koje su prikazane u kutiji ispod ([[Special:Captcha/help|više informacija]]):',
-	'fancycaptcha-sendemail' => 'Da bi pomogli u sprječavanju protiv automatskog spamovanja, molimo Vas da unesete riječi koje su prikazane ispod u kutiji ([[Special:Captcha/help|više informacija]]):',
+	'fancycaptcha-sendemail' => 'Da bi pomogli u sprječavanju protiv automatskog spamovanja, molimo Vas da unesete riječi koje su prikazane ispod u kutiji ([[Special:Captcha/help|više informacija]]):', # Fuzzy
+	'fancycaptcha-reload-text' => 'Osvježi',
 );
 
 /** Catalan (català)
@@ -235,38 +255,47 @@ Da bi se zaštitili od automatskog spama, molimo da unesete riječi koje su prik
  * @author Ssola
  */
 $messages['ca'] = array(
-	'fancycaptcha-addurl' => "La vostra modificació inclou nous enllaços externs. Com a protecció contra la propaganda automatitzada heu d'escriure en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):",
-	'fancycaptcha-badlogin' => "Com a protecció contra l'obtenció automatitzada de contrasenyes cal que escriviu en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):",
-	'fancycaptcha-createaccount' => 'Com a protecció contra la creació automatitzada de nous comptes cal que escriviu en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):',
+	'fancycaptcha-addurl' => "La vostra modificació inclou nous enllaços externs. Com a protecció contra la propaganda automatitzada heu d'escriure en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):", # Fuzzy
+	'fancycaptcha-badlogin' => "Com a protecció contra l'obtenció automatitzada de contrasenyes cal que escriviu en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):", # Fuzzy
+	'fancycaptcha-createaccount' => 'Com a protecció contra la creació automatitzada de nous comptes cal que escriviu en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):', # Fuzzy
 	'fancycaptcha-create' => "Per a poder crear la pàgina heu d'escriure en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):",
 	'fancycaptcha-edit' => "Per a poder modificar la pàgina heu d'escriure en la caixa les paraules que apareixen a continuació ([[Special:Captcha/help|més informació]]):",
-	'fancycaptcha-sendemail' => 'Per ajudar a protegir contra el correu brossa automatitzat, si us plau, introduïu les paraules que apareixen a sota la caixa ([[Special:Captcha/help|més informació]]):',
+	'fancycaptcha-sendemail' => 'Per ajudar a protegir contra el correu brossa automatitzat, si us plau, introduïu les paraules que apareixen a sota la caixa ([[Special:Captcha/help|més informació]]):', # Fuzzy
 );
 
 /** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄)
  */
 $messages['cdo'] = array(
-	'fancycaptcha-badlogin' => 'Ôi-lāu huòng-cī tiàng-sê̤ṳ cê̤ṳ-dông puái-gāi mĭk-mā, chiāng nṳ̄ sṳ̆-ĭk â-dā̤ bēng-bēng diē-lié gì sṳ̀ ([[Special:Captcha/help|gáing sâ̤ séng-sék]]):',
+	'fancycaptcha-badlogin' => 'Ôi-lāu huòng-cī tiàng-sê̤ṳ cê̤ṳ-dông puái-gāi mĭk-mā, chiāng nṳ̄ sṳ̆-ĭk â-dā̤ bēng-bēng diē-lié gì sṳ̀ ([[Special:Captcha/help|gáing sâ̤ séng-sék]]):', # Fuzzy
+);
+
+/** Chechen (нохчийн)
+ * @author Умар
+ */
+$messages['ce'] = array(
+	'fancycaptcha-addurl' => 'Хьан нисдар чохь керла арахьара хьажорагаш ю. Спамах лардала дехар до лахахь гура чохь гайтан дешнаш язъе ([[Special:Captcha/help|ма-дарра…]]):',
 );
 
 /** Sorani Kurdish (کوردی)
  * @author Asoxor
  */
 $messages['ckb'] = array(
-	'fancycaptcha-createaccount' => 'بۆ یارمەتیدانی بەرگری لە دروستکردنی خۆکاری ھەژمار، تکایە ئەو وشانە لە خوارەوەدا دیارن لە بۆکسەکەدا بنووسە ([[Special:Captcha/help|زانیاریی زۆرتر]]):',
+	'fancycaptcha-createaccount' => 'بۆ یارمەتیدانی بەرگری لە دروستکردنی خۆکاری ھەژمار، تکایە ئەو وشانە لە خوارەوەدا دیارن لە بۆکسەکەدا بنووسە ([[Special:Captcha/help|زانیاریی زۆرتر]]):', # Fuzzy
 );
 
-/** Czech (česky)
+/** Czech (čeština)
  * @author Mormegil
+ * @author Tchoř
  */
 $messages['cs'] = array(
 	'fancycaptcha-desc' => 'Pokročilý generátor captcha pro rozšíření „Confirm Edit“',
-	'fancycaptcha-addurl' => 'Vaše editace obsahuje nové odkazy formou URL; v zájmu ochrany před automatickým spamováním musíte opsat text z následujícího obrázku: ([[Special:Captcha/help|Co tohle znamená?]])',
-	'fancycaptcha-badlogin' => 'V rámci ochrany proti automatickým pokusům uhodnout heslo musíte opsat text z následujícího obrázku. ([[Special:Captcha/help|Co tohle znamená?]])',
-	'fancycaptcha-createaccount' => 'V rámci ochrany před automatickým zakládáním účtů musíte pro provedení registrace opsat text z následujícího obrázku: ([[Special:Captcha/help|Co tohle znamená?]])',
+	'fancycaptcha-addurl' => 'Vaše editace obsahuje nové odkazy formou URL.
+Abychom wiki ochránili před automatizovaným spamováním, žádáme vás o opsání textu z následujícího obrázku ([[Special:Captcha/help|více informací]]):',
+	'fancycaptcha-badlogin' => 'Abychom wiki ochránili proti automatizovaným pokusům uhodnout heslo, žádáme vás o opsání textu z následujícího obrázku ([[Special:Captcha/help|více informací]]):',
+	'fancycaptcha-createaccount' => 'Abychom wiki ochránili proti automatizovanému zakládání účtů, žádáme vás o opsání textu z následujícího obrázku ([[Special:Captcha/help|více informací]]):',
 	'fancycaptcha-create' => 'Abyste mohli založit stránku, musíte opsat text z následujícího obrázku: ([[Special:Captcha/help|Co tohle znamená?]])',
 	'fancycaptcha-edit' => 'Abyste mohli editovat tuto stránku, musíte opsat text z následujícího obrázku: ([[Special:Captcha/help|Co tohle znamená?]])',
-	'fancycaptcha-sendemail' => 'V rámci ochrany proti automatickému spamování musíte opsat níže zobrazená slova ([[Special:Captcha/help|více informací]]):',
+	'fancycaptcha-sendemail' => 'Abychom wiki ochránili proti automatizovanému spamování, žádáme vás o opsání textu z následujícího obrázku ([[Special:Captcha/help|více informací]]):',
 	'fancycaptcha-reload-text' => 'Vygenerovat nový kód',
 );
 
@@ -274,7 +303,7 @@ $messages['cs'] = array(
  * @author ОйЛ
  */
 $messages['cu'] = array(
-	'fancycaptcha-createaccount' => 'блюдєниꙗ дѣл҄ьма на аѵтоматьно мѣстоꙁиданиѥ · авлѥнъ слова обраꙁъ нижьшиѥмь окънѣ напиши ⁙ ([[Special:Captcha/help|испльнѧщѧ вѣсти]]) :',
+	'fancycaptcha-createaccount' => 'блюдєниꙗ дѣл҄ьма на аѵтоматьно мѣстоꙁиданиѥ · авлѥнъ слова обраꙁъ нижьшиѥмь окънѣ напиши ⁙ ([[Special:Captcha/help|испльнѧщѧ вѣсти]]) :', # Fuzzy
 );
 
 /** Welsh (Cymraeg)
@@ -282,12 +311,12 @@ $messages['cu'] = array(
  */
 $messages['cy'] = array(
 	'fancycaptcha-addurl' => "Mae eich golygiad yn cynnwys cyswllt allanol newydd.
-Er mwyn ceisio rhwystro peiriannau sbam, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
-	'fancycaptcha-badlogin' => "Er mwyn ceisio rhwystro peiriannau datrys cyfrineiriau, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
-	'fancycaptcha-createaccount' => "Er mwyn ceisio rhwystro peiriannau creu cyfrifon, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
+Er mwyn arbed y wici rhag peiriannau sbam, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
+	'fancycaptcha-badlogin' => "Er mwyn arbed y wici rhag peiriannau datrys cyfrineiriau, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
+	'fancycaptcha-createaccount' => "Er mwyn arbed y wici rhag peiriannau creu cyfrifon, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
 	'fancycaptcha-create' => "Er mwyn creu'r dudalen, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
 	'fancycaptcha-edit' => "Er mwyn gallu golygu'r dudalen hon, byddwch gystal â theipio'r geiriau a welwch isod yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
-	'fancycaptcha-sendemail' => "Er mwyn cyfrannu at ddiogelu rhag sbamio awtomatig, byddwch gystal â gwneud y swm isod ac ysgrifennu'r ateb yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
+	'fancycaptcha-sendemail' => "Er mwyn arbed y wici rhag sbamio awtomatig, byddwch gystal â gwneud y swm isod ac ysgrifennu'r ateb yn y blwch ([[Special:Captcha/help|rhagor o wybodaeth]]):",
 	'fancycaptcha-reload-text' => 'Adnewyddu',
 );
 
@@ -298,12 +327,13 @@ Er mwyn ceisio rhwystro peiriannau sbam, byddwch gystal â theipio'r geiriau a w
  * @author Peter Alberti
  */
 $messages['da'] = array(
-	'fancycaptcha-addurl' => 'Din ændring tilføjer nye eksterne henvisninger. For at beskytte mod automatiseret spam, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
-	'fancycaptcha-badlogin' => 'For at beskytte mod automatiske forsøg på at gætte kodeord, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
-	'fancycaptcha-createaccount' => 'For at beskytte mod automatisk oprettelse af brugernavne, der bruges til spam, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
+	'fancycaptcha-addurl' => 'Din ændring tilføjer nye eksterne henvisninger.
+For at beskytte mod automatiseret spam, skal du indtaste ordene som vises i feltet nedenfor. ([[Special:Captcha/help|mere information]]):',
+	'fancycaptcha-badlogin' => 'For at beskytte mod automatiske forsøg på at gætte adgangskoden, skal du indtaste ordene som vises i feltet nedenfor. ([[Special:Captcha/help|mere information]]):',
+	'fancycaptcha-createaccount' => 'For at beskytte mod automatisk oprettelse af brugerkonti, der bruges til spam, skal du indtaste ordet som vises i feltet nedenfor. ([[Special:Captcha/help|mere information]]):',
 	'fancycaptcha-create' => 'For at oprette en ny side, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
 	'fancycaptcha-edit' => 'For at redigere denne side, indtast da venligst ordene, der står i feltet nedenfor ([[Special:Captcha/help|mere information]]):',
-	'fancycaptcha-sendemail' => 'For at beskytte mod automatisk spam, bedes du skrive ordene der ses herunder i boksen ([[Special:Captcha/help|mere information]]):',
+	'fancycaptcha-sendemail' => 'For at beskytte mod automatisk spam, skal du skrive ordene der vises i feltet herunder ([[Special:Captcha/help|mere information]]):',
 	'fancycaptcha-reload-text' => 'Opdater',
 );
 
@@ -315,12 +345,12 @@ $messages['da'] = array(
 $messages['de'] = array(
 	'fancycaptcha-desc' => 'Fancy-CAPTCHA-Generator für die Erweiterung „Confirm Edit“',
 	'fancycaptcha-addurl' => 'Deine Bearbeitung enthält neue externe Links.
-Zum Schutz vor automatisiertem Spamming gib das folgende Wort in das Feld unten ein. Klicke dann erneut auf „Seite speichern“ ([[Special:Captcha/help|Fragen oder Probleme?]]).',
-	'fancycaptcha-badlogin' => 'Zum Schutz vor einer Kompromittierung deines Benutzerkontos gib das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]]:',
-	'fancycaptcha-createaccount' => 'Zum Schutz vor automatisierter Anlage von Benutzerkonten gib bitte das folgende Wort in das Feld unten ein ([[Special:Captcha/help|Fragen oder Probleme?]]):',
+Zum Schutz des Wikis vor automatisiertem Spamming bitten wir dich, das folgende Wort in das Feld unten einzugeben. Klicke dann erneut auf „Seite speichern“ ([[Special:Captcha/help|Fragen oder Probleme?]]).',
+	'fancycaptcha-badlogin' => 'Zum Schutz des Wikis vor einer Kompromittierung deines Benutzerkontos bitten wir dich, das folgende Wort in das Feld unten einzugeben [[Special:Captcha/help|(Fragen oder Probleme?)]]:',
+	'fancycaptcha-createaccount' => 'Zum Schutz des Wikis vor automatisierter Anlage von Benutzerkonten bitten wir dich, das folgende Wort in das Feld unten einzugeben ([[Special:Captcha/help|Fragen oder Probleme?]]):',
 	'fancycaptcha-create' => 'Zur Erstellung der Seite gib das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
 	'fancycaptcha-edit' => 'Zur Bearbeitung der Seite gib das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
-	'fancycaptcha-sendemail' => 'Um gegen automatischen Spam vorzugehen, gib bitte die Wörter unten in das Feld ein ([[Special:Captcha/help|mehr Informationen]]):',
+	'fancycaptcha-sendemail' => 'Zum Schutz des Wikis vor automatischem Spamming bitten wir dich, die Wörter unten in das Feld einzugeben ([[Special:Captcha/help|mehr Informationen]]):',
 	'fancycaptcha-reload-text' => 'Aktualisieren',
 );
 
@@ -331,12 +361,12 @@ Zum Schutz vor automatisiertem Spamming gib das folgende Wort in das Feld unten
  */
 $messages['de-formal'] = array(
 	'fancycaptcha-addurl' => 'Ihre Bearbeitung enthält neue externe Links.
-Zum Schutz vor automatisiertem Spamming geben Sie das folgende Wort in das Feld unten ein. Klicken Sie dann erneut auf „Seite speichern“ ([[Special:Captcha/help|Fragen oder Probleme?]]).',
-	'fancycaptcha-badlogin' => 'Zum Schutz vor einer Kompromittierung Ihres Benutzerkontos geben Sie bitte das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Haben Sie Fragen oder Probleme?)]]:',
-	'fancycaptcha-createaccount' => 'Zum Schutz vor automatisierter Anlage von Benutzerkonten geben Sie bitte das folgende Wort in das Feld unten ein ([[Special:Captcha/help|Fragen oder Probleme?]]):',
+Zum Schutz vor automatisiertem Spamming geben Sie das folgende Wort in das Feld unten ein. Klicken Sie dann erneut auf „Seite speichern“ ([[Special:Captcha/help|Fragen oder Probleme?]]).', # Fuzzy
+	'fancycaptcha-badlogin' => 'Zum Schutz vor einer Kompromittierung Ihres Benutzerkontos geben Sie bitte das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Haben Sie Fragen oder Probleme?)]]:', # Fuzzy
+	'fancycaptcha-createaccount' => 'Zum Schutz vor automatisierter Anlage von Benutzerkonten geben Sie bitte das folgende Wort in das Feld unten ein ([[Special:Captcha/help|Fragen oder Probleme?]]):', # Fuzzy
 	'fancycaptcha-create' => 'Zur Erstellung der Seite geben Sie das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
 	'fancycaptcha-edit' => 'Zur Bearbeitung der Seite geben Sie das folgende Wort in das Feld unten ein [[Special:Captcha/help|(Fragen oder Probleme?)]].',
-	'fancycaptcha-sendemail' => 'Um gegen automatischen Spam vorzugehen, geben Sie bitte die Wörter unten in das Feld ein ([[Special:Captcha/help|mehr Informationen]]):',
+	'fancycaptcha-sendemail' => 'Um gegen automatischen Spam vorzugehen, geben Sie bitte die Wörter unten in das Feld ein ([[Special:Captcha/help|mehr Informationen]]):', # Fuzzy
 );
 
 /** Zazaki (Zazaki)
@@ -344,14 +374,14 @@ Zum Schutz vor automatisiertem Spamming geben Sie das folgende Wort in das Feld
  * @author Xoser
  */
 $messages['diq'] = array(
-	'fancycaptcha-addurl' => 'Vurnayîşanê tu de linkanê harîcîyê newe esto. 
-Qe otomatik spamî ra pawitîş, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
-	'fancycaptcha-badlogin' => 'Qe otomatik parola crack kerdişî ra pawitîş, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
-	'fancycaptcha-createaccount' => 'Qe otomatik hesab viraştişî ra pawitîş, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
+	'fancycaptcha-addurl' => 'Vırnayışané tod linkané hariciyé newe esto. 
+Qe otomatik spami ra pawıtış, ma rica keno çekuyané ke qutiya cor de inan binuse ([[Special:Captcha/help|enformasyoné bini]]):',
+	'fancycaptcha-badlogin' => 'Qe otomatik parola crack kerdişî ra pawitîş, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Qe otomatik hesab viraştişî ra pawitîş, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):', # Fuzzy
 	'fancycaptcha-create' => 'Qe pel viraştîşî, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
 	'fancycaptcha-edit' => 'Qe pel vurnayîşî, ma rica keno çekuyanê ke qutiya cor de înan binuse ([[Special:Captcha/help|enformasyonê bînî]]):',
 	'fancycaptcha-sendemail' => 'Qe spamê otomayoni ra pawitîşi, ma rica keno çekuyanê ke qutiya cor de înan binuse 
-([[Special:Captcha/help|enformasyonê bînî]]):',
+([[Special:Captcha/help|enformasyonê bînî]]):', # Fuzzy
 	'fancycaptcha-reload-text' => 'Newe ke',
 );
 
@@ -360,12 +390,12 @@ Qe otomatik spamî ra pawitîş, ma rica keno çekuyanê ke qutiya cor de înan
  */
 $messages['dsb'] = array(
 	'fancycaptcha-addurl' => 'Twója změna wopśimujo nowe eksterne wótkaze.
-Za šćit pśeśiwo awtomatiskemu spamowanjeju, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku  ([[Special:Captcha/help|dalšne informacije]]):',
-	'fancycaptcha-badlogin' => 'Za šćit pśeśiwo awtomatiskemu wugódanjeju gronidła, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):',
-	'fancycaptcha-createaccount' => 'Za šćit pśeśiwo awtomatiskemu załoženjeju kontow, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):',
+Za šćit pśeśiwo awtomatiskemu spamowanjeju, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku  ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Za šćit pśeśiwo awtomatiskemu wugódanjeju gronidła, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Za šćit pśeśiwo awtomatiskemu załoženjeju kontow, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
 	'fancycaptcha-create' => 'Aby bok napórał, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):',
 	'fancycaptcha-edit' => 'Aby toś ten bok wobźěłał, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):',
-	'fancycaptcha-sendemail' => 'Za šćit pśeśiwo awtomatiskemu spamowanjeju, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):',
+	'fancycaptcha-sendemail' => 'Za šćit pśeśiwo awtomatiskemu spamowanjeju, zapódaj pšosym słowa, kótarež pokazuju se dołojce w kašćiku ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
 );
 
 /** Greek (Ελληνικά)
@@ -377,14 +407,14 @@ Za šćit pśeśiwo awtomatiskemu spamowanjeju, zapódaj pšosym słowa, kótare
  */
 $messages['el'] = array(
 	'fancycaptcha-addurl' => 'Η επεξεργασία σας περιλαμβάνει νέους εξωτερικούς σύνδεσμους.
-Ως βοήθεια για την προστασία από αυτόματα spam, παρακαλούμε γράψτε τις λέξεις που εμφανίζονται παρακάτω στο πλαίσιο ([[Special:Captcha/help|περισσότερες πληροφορίες]]):',
-	'fancycaptcha-badlogin' => 'Ως βοήθεια για την προστασία από αυτόματα προγράμματα σπασίματος κωδικών, παρακαλούμε γράψτε τις λέξεις που εμφανίζονται παρακάτω στο πλαίσιο ([[Special:Captcha/help|περισσότερες πληροφορίες]]):',
-	'fancycaptcha-createaccount' => 'Για να βοηθήσετε στην προστασία κατά των αυτόματα δημιουργούμενων λογαριασμών, παρακαλούμε πληκτρολογήστε στο πλαίσιο τις λέξεις που εμφανίζονται πιο κάτω ([[Special:Captcha/help|περισσότερες πληροφορίες]]):',
+Ως βοήθεια για την προστασία από αυτόματα spam, παρακαλούμε γράψτε τις λέξεις που εμφανίζονται παρακάτω στο πλαίσιο ([[Special:Captcha/help|περισσότερες πληροφορίες]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Ως βοήθεια για την προστασία από αυτόματα προγράμματα σπασίματος κωδικών, παρακαλούμε γράψτε τις λέξεις που εμφανίζονται παρακάτω στο πλαίσιο ([[Special:Captcha/help|περισσότερες πληροφορίες]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Για να βοηθήσετε στην προστασία κατά των αυτόματα δημιουργούμενων λογαριασμών, παρακαλούμε πληκτρολογήστε στο πλαίσιο τις λέξεις που εμφανίζονται πιο κάτω ([[Special:Captcha/help|περισσότερες πληροφορίες]]):', # Fuzzy
 	'fancycaptcha-create' => 'Για να δημιουργήσετε αυτήν την σελίδα, παρακαλώ εισάγετε τις λέξεις που εμφανίζονται παρακάτω μέσα στο κουτί
 ([[Special:Captcha/help|περισσότερες πληροφορίες]]):',
 	'fancycaptcha-edit' => 'Για να επεξεργαστείτε αυτήν την σελίδα, παρακαλώ εισάγετε τις λέξεις που εμφανίζονται παρακάτω μέσα στο κουτί
 ([[Special:Captcha/help|περισσότερες πληροφορίες]]):',
-	'fancycaptcha-sendemail' => 'Ως βοήθεια για την προστασία από αυτόματα προγράμματα σπασίματος κωδικών, παρακαλούμε γράψτε τις λέξεις που εμφανίζονται παρακάτω στο πλαίσιο ([[Special:Captcha/help|περισσότερες πληροφορίες]]):',
+	'fancycaptcha-sendemail' => 'Ως βοήθεια για την προστασία από αυτόματα προγράμματα σπασίματος κωδικών, παρακαλούμε γράψτε τις λέξεις που εμφανίζονται παρακάτω στο πλαίσιο ([[Special:Captcha/help|περισσότερες πληροφορίες]]):', # Fuzzy
 );
 
 /** Esperanto (Esperanto)
@@ -392,12 +422,13 @@ $messages['el'] = array(
  */
 $messages['eo'] = array(
 	'fancycaptcha-addurl' => 'Via redakto inkluzivas novajn eksterajn ligilojn.
-Por preventi aŭtomatan spamon, bonvolu enigi la jenajn vortojn en la skatolo ([[Special:Captcha/help|plua informo]]):',
-	'fancycaptcha-badlogin' => 'Helpi protekti kontraŭ aŭtomata divenado de pasvortoj, bonvolu enigi la jenajn vortojn en la skatolo ([[Special:Captcha/help|plua informo]]):',
-	'fancycaptcha-createaccount' => 'Helpi protekti kontraŭ aŭtomata kreado de kontoj, bonvolu enigi la jenajn vortojn en la skatolo ([[Special:Captcha/help|plua informo]]):',
+Por preventi aŭtomatan spamon, bonvolu enigi la jenajn vortojn en la skatolo ([[Special:Captcha/help|plia informo]]):',
+	'fancycaptcha-badlogin' => 'Por protekti kontraŭ aŭtomata divenado de pasvortoj, bonvolu enigi la jenajn vortojn en la skatolo ([[Special:Captcha/help|plua informo]]):',
+	'fancycaptcha-createaccount' => 'Por protekti kontraŭ aŭtomata kreado de kontoj, bonvolu enigi la jenajn vortojn en la skatolo ([[Special:Captcha/help|plia informo]]):',
 	'fancycaptcha-create' => 'Por krei la paĝon, bonvolu enigi la vortojn montritajn en la jena skatolo ([[Special:Captcha/help|plua informo]]):',
 	'fancycaptcha-edit' => 'Por redakti ĉi tiun paĝon, bonvolu enigi la vortojn jenajn en la kesto ([[Special:Captcha/help|plua informo]]):',
-	'fancycaptcha-sendemail' => 'Por helpi protekti kontraŭ aŭtomata spamado, bonvolu enigi la jenajn vortojn de la skatolo ([[Special:Captcha/help|plua informo]]):',
+	'fancycaptcha-sendemail' => 'Por helpi protekti kontraŭ aŭtomata spamado, bonvolu enigi la jenajn vortojn de la skatolo ([[Special:Captcha/help|plia informo]]):',
+	'fancycaptcha-reload-text' => 'Refreŝigi',
 );
 
 /** Spanish (español)
@@ -407,12 +438,12 @@ Por preventi aŭtomatan spamon, bonvolu enigi la jenajn vortojn en la skatolo ([
  * @author Sanbec
  */
 $messages['es'] = array(
-	'fancycaptcha-addurl' => 'Tu edición incluye nuevos enlaces externos. Para protegernos contra el spam automatizado, por favor introduce en el recuadro las palabras que aparecen debajo ([[Special:Captcha/help|más información]]):',
-	'fancycaptcha-badlogin' => 'Para ayudarnos en la protección contra el descifrado automático de contraseñas, por favor, introduce las palabras que aparecen abajo en la caja ([[Special:Captcha/help|más información]]):',
-	'fancycaptcha-createaccount' => 'Para evitar la creación automatizada de cuentas, introduce por favor en el recuadro las palabras que aparecen debajo ([[Special:Captcha/help|más información]]):',
+	'fancycaptcha-addurl' => 'Tu edición incluye nuevos enlaces externos. Para protegernos contra el spam automatizado, por favor introduce en el recuadro las palabras que aparecen debajo ([[Special:Captcha/help|más información]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Para ayudarnos en la protección contra el descifrado automático de contraseñas, por favor, introduce las palabras que aparecen abajo en la caja ([[Special:Captcha/help|más información]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Para evitar la creación automatizada de cuentas, introduce por favor en el recuadro las palabras que aparecen debajo ([[Special:Captcha/help|más información]]):', # Fuzzy
 	'fancycaptcha-create' => 'Para crear la página, por favor introduce en el recuadro las palabras que aparecen debajo ([[Special:Captcha/help|más información]]):',
 	'fancycaptcha-edit' => 'Para editar esta página, por favor introduce en el recuadro las palabras que aparecen debajo ([[Special:Captcha/help|más información]]):',
-	'fancycaptcha-sendemail' => 'Para protegernos contra el spam automatizado por favor ingrese las palabras que aparecen en el siguiente cuadro ([[Special:Captcha/help|más información]]):',
+	'fancycaptcha-sendemail' => 'Para protegernos contra el spam automatizado por favor ingrese las palabras que aparecen en el siguiente cuadro ([[Special:Captcha/help|más información]]):', # Fuzzy
 	'fancycaptcha-reload-text' => 'Actualizar',
 );
 
@@ -435,12 +466,12 @@ Palun sisesta allpool olevas kastis kuvatud sõnad. Abinõu on kaitseks automaad
  * @author An13sa
  */
 $messages['eu'] = array(
-	'fancycaptcha-addurl' => 'Zure aldaketak kanpo lotura berriak ditu. Spam automatikoa saihestu ahal izateko, beheko koadroan ageri diren hitzak idatzi ([[Special:Captcha/help|informazio gehigarria]]):',
-	'fancycaptcha-badlogin' => 'Pasahitzen cracking automatikoa saihestu asmoz, beheko koadroan ageri diren hitzak idazteko eskatzen dizugu ([[Special:Captcha/help|informazio gehigarria]]):',
-	'fancycaptcha-createaccount' => 'Erabiltzaile kontuak automatikoki sortzea saihestu asmoz, beheko koadroan ageri diren hitzak idazteko eskatzen dizugu ([[Special:Captcha/help|informazio gehigarria]]):',
+	'fancycaptcha-addurl' => 'Zure aldaketak kanpo lotura berriak ditu. Spam automatikoa saihestu ahal izateko, beheko koadroan ageri diren hitzak idatzi ([[Special:Captcha/help|informazio gehigarria]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Pasahitzen cracking automatikoa saihestu asmoz, beheko koadroan ageri diren hitzak idazteko eskatzen dizugu ([[Special:Captcha/help|informazio gehigarria]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Erabiltzaile kontuak automatikoki sortzea saihestu asmoz, beheko koadroan ageri diren hitzak idazteko eskatzen dizugu ([[Special:Captcha/help|informazio gehigarria]]):', # Fuzzy
 	'fancycaptcha-create' => 'Orrialde sortu ahal izateko, beheko koadroan ageri hitzak idatzi ([[Special:Captcha/help|informazio gehigarria]]):',
 	'fancycaptcha-edit' => 'Orrialde hau aldatu ahal izateko, beheko koadroan ageri diren hitzak idatzi ([[Special:Captcha/help|informazio gehigarria]]):',
-	'fancycaptcha-sendemail' => 'Zabor-posta automatizatuaz babesteko, idatzi azpiko kutxako hitzak ([[Special:Captcha/help|informazio gehiago]]):',
+	'fancycaptcha-sendemail' => 'Zabor-posta automatizatuaz babesteko, idatzi azpiko kutxako hitzak ([[Special:Captcha/help|informazio gehiago]]):', # Fuzzy
 );
 
 /** Persian (فارسی)
@@ -448,16 +479,18 @@ $messages['eu'] = array(
  * @author Huji
  * @author Ladsgroup
  * @author Meisam
+ * @author Reza1615
  * @author Wayiran
  */
 $messages['fa'] = array(
 	'fancycaptcha-addurl' => 'ویرایش شما حاوی پیوند به بیرون جدیدی است.
-برای کمک به جلوگیری از هرزنگاری خودکار، لطفاً واژه‌ای را که در تصویر می‌بینید در جعبه وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
-	'fancycaptcha-badlogin' => 'برای کمک به جلوگیری از سرقت خودکار کلمه عبور، لطفاً واژه‌ای را که در تصویر می‌بینید وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
-	'fancycaptcha-createaccount' => 'برای کمک به جلوگیری از ایجاد خودکار حساب کاربری، لطفاً واژه‌ای را که در تصویر می‌بینید وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+برای جلوگیری از هرزنگاری خودکار ویکی، ما با احترام از شما می‌خواهیم واژه‌ای را که در تصویر می‌بینید در جعبهٔ زیر وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+	'fancycaptcha-badlogin' => 'برای کمک به جلوگیری از شکستن خودکار گذرواژه، لطفاً واژه‌ای را که در تصویر می‌بینید را وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+	'fancycaptcha-createaccount' => 'برای کمک به جلوگیری از ایجاد خودکار حساب کاربری، ما با احترام از شما می‌خواهید واژه‌ای را که در تصویر می‌بینید را در جعبهٔ زیر وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
 	'fancycaptcha-create' => 'برای ایجاد این صفحه، لطفاً واژه‌ای را که در تصویر می‌بینید وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
 	'fancycaptcha-edit' => 'برای ویرایش این صفحه، لطفاً واژه‌ای را که در تصویر می‌بینید وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
-	'fancycaptcha-sendemail' => 'برای کمک به محافظت در برابر هرزه‌نگاری خودکار، لطفاً واژه‌هایی را که در جعبهٔ زیر نمایش داده می‌شوند وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+	'fancycaptcha-sendemail' => 'برای کمک به محافظت در برابر هرزه‌نگاری خودکار، ما با احترام از شما می‌خواهیم واژه‌هایی را که در جعبهٔ زیر نمایش داده می‌شوند وارد کنید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+	'fancycaptcha-reload-text' => 'تازه‌کردن',
 );
 
 /** Finnish (suomi)
@@ -465,20 +498,23 @@ $messages['fa'] = array(
  * @author Nike
  */
 $messages['fi'] = array(
-	'fancycaptcha-addurl' => 'Muokkauksesi sisältää uusia linkkejä muille sivuille. Kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):',
-	'fancycaptcha-badlogin' => 'Automatisoidun salasanan murtamisen vaikeuttamiseksi kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):',
-	'fancycaptcha-createaccount' => 'Kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):',
+	'fancycaptcha-addurl' => 'Muokkauksesi sisältää uusia linkkejä muille sivuille. Kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Automatisoidun salasanan murtamisen vaikeuttamiseksi kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
 	'fancycaptcha-create' => 'Muokkauksesi sisältää uusia linkkejä muille sivuille. Kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):',
 	'fancycaptcha-edit' => 'Muokkauksesi sisältää uusia linkkejä muille sivuille. Kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):',
-	'fancycaptcha-sendemail' => 'Automatisoidun roskapostin lähettämisen vaikeuttamiseksi kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):',
+	'fancycaptcha-sendemail' => 'Automatisoidun roskapostin lähettämisen vaikeuttamiseksi kirjoita kuvan sisältämät sanat alla olevaan tekstikenttään ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
 );
 
 /** Faroese (føroyskt)
+ * @author EileenSanda
  * @author Spacebirdy
  */
 $messages['fo'] = array(
-	'fancycaptcha-addurl' => 'Sum ein vernd ímóti sjálvvirknum konto gerð, er neyðugt hjá tær at skriva inn tey orð, sum koma fyri á myndini fyri at stovna eina kontu: <br />([[Special:Captcha/help|Hvat er hetta?]])',
-	'fancycaptcha-createaccount' => 'Sum ein vernd ímóti sjálvvirknum konto gerð, er neyðugt hjá tær at skriva inn tey orð, sum koma fyri á myndini fyri at stovna eina kontu: <br />([[Special:Captcha/help|Hvat er hetta?]]):',
+	'fancycaptcha-addurl' => 'Tín rætting inniheldur nýggjar uttanhýsis slóðir.
+Fyri at verja wikiina ímóti sjálvvirkandi kontoupprættan, vilja vit vinarliga biðja teg um at skriva inn tey orð, sum koma fyri í teiginum niðanfyri, til tess at stovna eina konto: <br />([[Special:Captcha/help|meira kunning]]):',
+	'fancycaptcha-createaccount' => 'Fyri at verja wikiina ímóti sjálvvirkandi kontoupprættan, vilja vit vinarliga biðja teg um at skriva inn tey orð, sum koma fyri í teiginum niðanfyri, so at tú kanst stovna eina konto:
+([[Special:Captcha/help|meira kunning]]):',
 );
 
 /** French (français)
@@ -493,12 +529,12 @@ $messages['fo'] = array(
 $messages['fr'] = array(
 	'fancycaptcha-desc' => "Générateur d’images ''captcha'' anti-robots demandant une confirmation humaine des modifications.",
 	'fancycaptcha-addurl' => 'Votre modification inclut de nouveaux liens externes.
-Pour vérifier qu’il ne s’agit pas de pourriels automatisés, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
-	'fancycaptcha-badlogin' => 'Afin de nous aider à prévenir le cassage des mots de passe par des automates, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
-	'fancycaptcha-createaccount' => 'Afin de nous aider à lutter contre les créations automatiques de comptes, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+Pour protéger le wiki contre les pourriels automatisés, nous vous demandons de bien vouloir entrer les mots qui apparaissent dans la boîte ([[Special:Captcha/help|plus d’informations]]) :',
+	'fancycaptcha-badlogin' => 'Pour protéger le wiki contre le cassage des mots de passe par des automates, nous vous demandons de bien vouloir entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+	'fancycaptcha-createaccount' => 'Pour protéger le wiki contre les créations automatiques de comptes, nous vous demandons de bien vouloir entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
 	'fancycaptcha-create' => 'Pour créer la page, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha|plus d’informations]]) :',
 	'fancycaptcha-edit' => 'Pour modifier cette page, veuillez saisir les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’information]]) :',
-	'fancycaptcha-sendemail' => 'Afin de nous aider à prévenir le pollupostage automatisé, veuillez entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+	'fancycaptcha-sendemail' => 'Pour protéger le wiki contre l’envoi automatisé de pourriels, nous vous demandons de bien vouloir entrer les mots qui apparaissent dans la boîte ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
 	'fancycaptcha-reload-text' => 'Actualiser',
 );
 
@@ -508,25 +544,25 @@ Pour vérifier qu’il ne s’agit pas de pourriels automatisés, veuillez entre
 $messages['frp'] = array(
 	'fancycaptcha-desc' => "G·ènèrator d’émâges ''captch·a'' anti-robots que demande una confirmacion d’homo des changements.",
 	'fancycaptcha-addurl' => 'Voutron changement encllut de lims de defôr novéls.
-Por nos édiér a combatre contre lo spame ôtomatisâ, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :',
-	'fancycaptcha-badlogin' => 'Por nos édiér a combatre contre lo cassâjo ôtomatisâ de contresegnos, volyéd buchiér los mots qu’aparèssont dedens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :',
-	'fancycaptcha-createaccount' => 'Por nos édiér a combatre contre les crèacions ôtomatisâs de comptos, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :',
+Por nos édiér a combatre contre lo spame ôtomatisâ, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :', # Fuzzy
+	'fancycaptcha-badlogin' => 'Por nos édiér a combatre contre lo cassâjo ôtomatisâ de contresegnos, volyéd buchiér los mots qu’aparèssont dedens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :', # Fuzzy
+	'fancycaptcha-createaccount' => 'Por nos édiér a combatre contre les crèacions ôtomatisâs de comptos, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :', # Fuzzy
 	'fancycaptcha-create' => 'Por fâre ceta pâge, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :',
 	'fancycaptcha-edit' => 'Por changiér ceta pâge, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :',
-	'fancycaptcha-sendemail' => 'Por nos édiér a combatre contre lo spame ôtomatisâ, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :',
+	'fancycaptcha-sendemail' => 'Por nos édiér a combatre contre lo spame ôtomatisâ, volyéd buchiér los mots qu’aparèssont dens la bouèta ce-desot ([[Special:Captcha/help|més d’enformacions]]) :', # Fuzzy
 );
 
 /** Western Frisian (Frysk)
  * @author Snakesteuben
  */
 $messages['fy'] = array(
-	'fancycaptcha-badlogin' => 'As ekstra beskerming tsjin automatysk ûntsiferjen fan wachtwurden wurdt jo frege de ûndersteande letters oer te tikken. ([[Special:Captcha/help|mear ynformaasje]]).',
+	'fancycaptcha-badlogin' => 'As ekstra beskerming tsjin automatysk ûntsiferjen fan wachtwurden wurdt jo frege de ûndersteande letters oer te tikken. ([[Special:Captcha/help|mear ynformaasje]]).', # Fuzzy
 );
 
 /** Irish (Gaeilge)
  */
 $messages['ga'] = array(
-	'fancycaptcha-createaccount' => 'Mar chosaint in éadan cuntais a chruthaítear go huathoibríoch, ionchuir na focail a thaispeántar san íomhá seo thíos: <br />([[Special:Captcha/help|tuilleadh eolais]])',
+	'fancycaptcha-createaccount' => 'Mar chosaint in éadan cuntais a chruthaítear go huathoibríoch, ionchuir na focail a thaispeántar san íomhá seo thíos: <br />([[Special:Captcha/help|tuilleadh eolais]])', # Fuzzy
 );
 
 /** Galician (galego)
@@ -535,13 +571,13 @@ $messages['ga'] = array(
  */
 $messages['gl'] = array(
 	'fancycaptcha-desc' => 'Xerador de imaxes CAPTCHA para Confirm Edit',
-	'fancycaptcha-addurl' => 'A súa edición inclúe ligazóns externas novas.
-Para contribuír na protección contra o spam automatizado, introduza as palabras que aparecen na caixa de embaixo ([[Special:Captcha/help|máis información]]):',
-	'fancycaptcha-badlogin' => 'Para contribuír a que non se descubran os contrasinais por medios automáticos, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
-	'fancycaptcha-createaccount' => 'Para contribuír contra a creación automatizada de contas, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
-	'fancycaptcha-create' => 'Para crear a páxina, introduza as palabras que aparecen na caixa de embaixo ([[Special:Captcha/help|máis información]]):',
-	'fancycaptcha-edit' => 'Para editar esta páxina, introduza as palabras que aparecen na caixa de embaixo ([[Special:Captcha/help|máis información]]):',
-	'fancycaptcha-sendemail' => 'Para contribuír na protección contra o spam automatizado, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
+	'fancycaptcha-addurl' => 'A súa edición inclúe novas ligazóns externas.
+Para protexer o wiki contra o spam automático, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
+	'fancycaptcha-badlogin' => 'Para protexer o wiki contra o roubo de contrasinais, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
+	'fancycaptcha-createaccount' => 'Para protexer o wiki contra a creación automática de contas, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
+	'fancycaptcha-create' => 'Para crear a páxina, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
+	'fancycaptcha-edit' => 'Para editar esta páxina, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
+	'fancycaptcha-sendemail' => 'Para protexer o wiki contra o spam automático, introduza as palabras que aparecen na caixa ([[Special:Captcha/help|máis información]]):',
 	'fancycaptcha-reload-text' => 'Refrescar',
 );
 
@@ -552,27 +588,28 @@ Para contribuír na protección contra o spam automatizado, introduza as palabra
  */
 $messages['gsw'] = array(
 	'fancycaptcha-addurl' => 'In Dyynere Bearbeitig het s neiji externi Link.
-Zum Schutz vor automatisiertem Spamming gib des Wort in s Fäld unten yy. Druck derno nomol uf „Syte spychere“. [[Special:Captcha/help|(Frogen oder Probläm?)]]',
-	'fancycaptcha-badlogin' => 'Zum Schutz vor ere Kompromittierig vu Dyynm Benutzerkonto gib des Wort in s Fäld unten yy [[Special:Captcha/help|(Frogen oder Probläm?)]]:',
-	'fancycaptcha-createaccount' => 'Zum Schutz vor ere automatisierte Aalag vu Benutzerkonte gib bitte des Wort in s Fäld unten yy ([[Special:Captcha/help|Frogen oder Probläm?]]):',
+Zum Schutz vor automatisiertem Spamming gib des Wort in s Fäld unten yy. Druck derno nomol uf „Syte spychere“. [[Special:Captcha/help|(Frogen oder Probläm?)]]', # Fuzzy
+	'fancycaptcha-badlogin' => 'Zum Schutz vor ere Kompromittierig vu Dyynm Benutzerkonto gib des Wort in s Fäld unten yy [[Special:Captcha/help|(Frogen oder Probläm?)]]:', # Fuzzy
+	'fancycaptcha-createaccount' => 'Zum Schutz vor ere automatisierte Aalag vu Benutzerkonte gib bitte des Wort in s Fäld unten yy ([[Special:Captcha/help|Frogen oder Probläm?]]):', # Fuzzy
 	'fancycaptcha-create' => 'Zum d Syten aalege gib des Wort in s Fäld unten yy. [[Special:Captcha/help|(Frogen oder Probläm?)]]',
 	'fancycaptcha-edit' => 'Zum d Syte bearbeite gib des Wort in s Fäld unten yy. [[Special:Captcha/help|(Frogen oder Probläm?)]]',
-	'fancycaptcha-sendemail' => 'As Schutz gege e automatischs Spamming, gib bitte des Wort in s Fäld unten yy ([[Special:Captcha/help|meh Informatione]]):',
+	'fancycaptcha-sendemail' => 'As Schutz gege e automatischs Spamming, gib bitte des Wort in s Fäld unten yy ([[Special:Captcha/help|meh Informatione]]):', # Fuzzy
 );
 
 /** Gujarati (ગુજરાતી)
+ * @author Ashok modhvadia
  * @author Dsvyas
  * @author Sushant savla
  */
 $messages['gu'] = array(
-	'fancycaptcha-addurl' => 'તમારા ફેરફારમાં નવી બાહ્ય કડીઓ શામિલ છે.
-તમે કરેલા ફેરફારોમાં નવી બાહ્ય કડીઓ સામેલ છે. સ્વચાલિત સ્પેમ/સ્પામ(spam) થી બચવા માટે નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજુના ખાનામાં લખો
-([[Special:Captcha/help|more info]]):',
-	'fancycaptcha-badlogin' => 'આપોઆપ થતી ગુપ્તસંજ્ઞાની ચોરી (password cracking)થી બચાવવા માટે નીચે આપેલા શબ્દ તેની બાજુના ખાનામાં લખો ([[Special:Captcha/help|more info]]):',
-	'fancycaptcha-createaccount' => 'આપોઆપ નવા ખાતા ખુલતા રોકવા માટે નીચે દેખાતા શબ્દો ખાનામાં લખો ([[Special:Captcha/help|વધુ માહિતી]]):',
+	'fancycaptcha-addurl' => 'તમે કરેલા ફેરફારોમાં નવી બાહ્ય કડીઓ સામેલ છે. 
+વિકિને સ્વચાલિત સ્પેમ/સ્પામ(spam)થી બચાવવા માટે અમે તમને જણાવીએ છીએ કે કૃપયા નીચે આપેલા સરળ દાખલાનો જવાબ તેની બાજુના ખાનામાં લખો.
+([[Special:Captcha/help|વધુ વિગત]]):',
+	'fancycaptcha-badlogin' => 'આપોઆપ થતી ગુપ્તસંજ્ઞાની ચોરી (password cracking)થી વિકિને બચાવવા માટે અમે તમને જણાવીએ છીએ કે કૃપયા નીચે આપેલા શબ્દ તેની બાજુના ખાનામાં લખો. ([[Special:Captcha/help|વધુ વિગત]]):',
+	'fancycaptcha-createaccount' => 'આપોઆપ નવા ખાતા ખુલતા રોકવા અને વિકીને તેનાથી બચાવવા માટે. અમે તમને જણાવીએ છીએ કે કૃપયા નીચે દેખાતા શબ્દો ખાનામાં લખો. ([[Special:Captcha/help|વધુ માહિતી]]):',
 	'fancycaptcha-create' => 'પાનું બનાવવા માટે નીચે દેખાતા શબ્દો ખાનામાં ટાઈપ કરો ([[Special:Captcha/help|વધુ માહિતી]]):',
 	'fancycaptcha-edit' => 'આ પાનામાં ફેરફાર કરવા માટે નીચે દેખાતા શબ્દો ખાનામાં ટાઈપ કરો ([[Special:Captcha/help|વધુ માહિતી]]):',
-	'fancycaptcha-sendemail' => 'આપોઆપ થતી સ્પૅમીંગથી બચાવવા માટે નીચે આપેલા શબ્દ તેની બાજુના ખાનામાં લખો ([[Special:Captcha/help|more info]]):',
+	'fancycaptcha-sendemail' => 'વિકિને આપોઆપ થતી સ્પૅમીંગથી બચાવવા માટે. અમે તમને જણાવીએ છીએ કે કૃપયા નીચે આપેલા શબ્દ તેની બાજુના ખાનામાં લખો ([[Special:Captcha/help|વધુ માહિતી]]):',
 );
 
 /** Hebrew (עברית)
@@ -582,7 +619,7 @@ $messages['gu'] = array(
 $messages['he'] = array(
 	'fancycaptcha-desc' => 'מחולל תמונות CAPTCHA מגניבות בשביל ההרבחבה Confirm Edit',
 	'fancycaptcha-addurl' => 'עריכתכם כוללת קישורים חיצוניים חדשים.
-כהגנה מפני ספאם אוטומטי, אנא הקלידו את המילים המופיעות להלן בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
+כהגנה מפני זיבול אוטומטי, אנא הקלידו את המילים המופיעות להלן בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
 	'fancycaptcha-badlogin' => 'כהגנה מפני פריצת סיסמאות אוטומטית, אנא הקלידו את המילים המופיעות להלן בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
 	'fancycaptcha-createaccount' => 'כהגנה מפני יצירת חשבונות אוטומטית, אנא הקלידו את המילים המופיעות להלן בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
 	'fancycaptcha-create' => 'כדי ליצור את הדף, אנא הקלידו את המילים המופיעות להלן בתיבה ([[Special:Captcha/help|מידע נוסף]]):',
@@ -597,9 +634,9 @@ $messages['he'] = array(
  */
 $messages['hi'] = array(
 	'fancycaptcha-addurl' => 'आपके सम्पादन में नई बाहरी कड़ियाँ हैं।
-स्वचालित स्पॅम से बचाव में सहायता के लिये नीचे दिये हुए शब्द बक्से में लिखें ([[Special:Captcha/help|अधिक जानकारी]]):',
-	'fancycaptcha-badlogin' => 'स्वचालित कूटशब्द चोरी से बचाव में सहायता के लिये नीचे दिये हुए शब्द बक्से में लिखें ([[Special:Captcha/help|अधिक जानकारी]]):',
-	'fancycaptcha-createaccount' => 'स्वचालित सदस्य पंजीकरण से बचाव में सहायता के लिये नीचे दिये शब्द बक्से में लिखें ([[Special:Captcha/help|अधिक जानकारी]]):',
+स्वचालित स्पॅम से बचाव में सहायता के लिये नीचे दिये हुए शब्द बक्से में लिखें ([[Special:Captcha/help|अधिक जानकारी]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'स्वचालित कूटशब्द चोरी से बचाव में सहायता के लिये नीचे दिये हुए शब्द बक्से में लिखें ([[Special:Captcha/help|अधिक जानकारी]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'स्वचालित सदस्य पंजीकरण से बचाव में सहायता के लिये नीचे दिये शब्द बक्से में लिखें ([[Special:Captcha/help|अधिक जानकारी]]):', # Fuzzy
 	'fancycaptcha-create' => 'यह पृष्ठ बनाने के लिये कृपया नीचे दिये शब्द बक्से में लिखें ([[Special:Captcha/help|अधिक जानकारी]]):',
 	'fancycaptcha-edit' => 'यह पृष्ठ बदलने के लिये, नीचे दिखने वाले अक्षर टेक्स्ट बक्सेमें लिखें ([[Special:Captcha/help|अधिक जानकारी]]):',
 );
@@ -609,27 +646,27 @@ $messages['hi'] = array(
  */
 $messages['hr'] = array(
 	'fancycaptcha-addurl' => 'Vaše uređivanje sadrži nove vanjske poveznice. Kao zaštitu od automatskog spama,
-molimo unesite slova koja vidite na slici dolje: ([[Special:Captcha/help|Pomoć]])',
+molimo unesite slova koja vidite na slici dolje: ([[Special:Captcha/help|Pomoć]])', # Fuzzy
 	'fancycaptcha-badlogin' => 'Da se spriječi automatiziranje pogađanja lozinki, molimo unesite
-slova koja vidite na slici dolje: <br />([[Special:Captcha/help|Pomoć]])',
+slova koja vidite na slici dolje: <br />([[Special:Captcha/help|Pomoć]])', # Fuzzy
 	'fancycaptcha-createaccount' => 'Kao zaštitu od automatskog otvaranja računa, pri otvaranju računa trebate
-unijeti slova koja vidite na slici: <br />([[Special:Captcha/help|Pomoć]])',
+unijeti slova koja vidite na slici: <br />([[Special:Captcha/help|Pomoć]])', # Fuzzy
 	'fancycaptcha-create' => 'Da bi stvorili novu stranicu, molimo unesite
 slova koja vidite na slici dolje: <br />([[Special:Captcha/help|Pomoć]])',
 	'fancycaptcha-edit' => 'Da bi uređivali ovu stranicu, molimo unesite slova koja vidite na slici dolje: <br />([[Special:Captcha/help|Pomoć]])',
-	'fancycaptcha-sendemail' => 'Da bi ste nam pomogli protiv automatskog spama, molimo unesite riječi koje su prikazane ispod u okvir ([[Special:Captcha/help|više informacija]]):',
+	'fancycaptcha-sendemail' => 'Da bi ste nam pomogli protiv automatskog spama, molimo unesite riječi koje su prikazane ispod u okvir ([[Special:Captcha/help|više informacija]]):', # Fuzzy
 );
 
 /** Upper Sorbian (hornjoserbsce)
  * @author Michawiki
  */
 $messages['hsb'] = array(
-	'fancycaptcha-addurl' => 'W twojej změnje su nowe eksterne wotkazy. Jako škitna naprawa přećiwo awtomatiskemu spamej zapodaj prošu sćěhowace znamješka do kašćika ([[Special:Captcha/help|čehodla?]]).',
-	'fancycaptcha-badlogin' => 'Jako škitna naprawa přećiwo awtomatiskemu zadobywanju do wužiwarskich kontow zapodaj prošu sćěhowace znamješka do kašćika ([[Special:Captcha/help|čehodla?]]):',
-	'fancycaptcha-createaccount' => 'Jako škitna naprawa přećiwo awtomatiskemu wutworjenju wužiwarskich kontow zapodaj prošu sćěhowace znamješka do kašćika ([[Special:Captcha/help|čehodla?]]):',
+	'fancycaptcha-addurl' => 'W twojej změnje su nowe eksterne wotkazy. Jako škitna naprawa přećiwo awtomatiskemu spamej zapodaj prošu sćěhowace znamješka do kašćika ([[Special:Captcha/help|čehodla?]]).', # Fuzzy
+	'fancycaptcha-badlogin' => 'Jako škitna naprawa přećiwo awtomatiskemu zadobywanju do wužiwarskich kontow zapodaj prošu sćěhowace znamješka do kašćika ([[Special:Captcha/help|čehodla?]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Jako škitna naprawa přećiwo awtomatiskemu wutworjenju wužiwarskich kontow zapodaj prošu sćěhowace znamješka do kašćika ([[Special:Captcha/help|čehodla?]]):', # Fuzzy
 	'fancycaptcha-create' => 'Zo by stronu wutworić móhł zapodaj prošu sćěhowace znamješka do kašćika ([[Special:Captcha/help|čehodla?]]):',
 	'fancycaptcha-edit' => 'Zo by stronu wobdźěłować móhł zapodaj prošu sćěhowace znamješka do kašćika ([[Special:Captcha/help|čehodla?]]):',
-	'fancycaptcha-sendemail' => 'Za škit přećiwo awtomatiskemu spamowanju, zapodaj prošu słowa, kotrež so deleka w kašćiku jewi ([[Special:Captcha/help|dalše informacije]]):',
+	'fancycaptcha-sendemail' => 'Za škit přećiwo awtomatiskemu spamowanju, zapodaj prošu słowa, kotrež so deleka w kašćiku jewi ([[Special:Captcha/help|dalše informacije]]):', # Fuzzy
 );
 
 /** Hungarian (magyar)
@@ -638,12 +675,12 @@ $messages['hsb'] = array(
  * @author Glanthor Reviol
  */
 $messages['hu'] = array(
-	'fancycaptcha-addurl' => 'A szerkesztésed új külső hivatkozásokat tartalmaz. Az automatizált spamek megelőzése miatt kérjük, hogy add meg a lenti keretben olvasható szavakat ([[Special:Captcha/help|további segítség]]):',
-	'fancycaptcha-badlogin' => 'Hogy az automatizált jelszópróbálkozásokat megelőzzük, kérjük, hogy add meg a lenti keretben olvasható szavakat ([[Special:Captcha/help|további segítség]]):',
-	'fancycaptcha-createaccount' => 'A felhasználói fiókok automatizált létrehozásának elkerülésére, kérlek, írd be az alább megjelenő szót a szövegdobozba ([[Special:Captcha/help|segítség]]):',
+	'fancycaptcha-addurl' => 'A szerkesztésed új külső hivatkozásokat tartalmaz. Az automatizált spamek megelőzése miatt kérjük, hogy add meg a lenti keretben olvasható szavakat ([[Special:Captcha/help|további segítség]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Hogy az automatizált jelszópróbálkozásokat megelőzzük, kérjük, hogy add meg a lenti keretben olvasható szavakat ([[Special:Captcha/help|további segítség]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'A felhasználói fiókok automatizált létrehozásának elkerülésére, kérlek, írd be az alább megjelenő szót a szövegdobozba ([[Special:Captcha/help|segítség]]):', # Fuzzy
 	'fancycaptcha-create' => 'A lap létrehozásához kérjük, hogy add meg a lenti keretben olvasható szavakat ([[Special:Captcha/help|további segítség]]):',
 	'fancycaptcha-edit' => 'A szerkesztésed új külső linkeket tartalmaz. A spam-robotok elleni védekezés elősegítésére kérlek írd be az alább megjelenő szót a szövegdobozba ([[Special:Captcha/help|segítség]]):',
-	'fancycaptcha-sendemail' => 'Hogy segíts az automatikus spammelés elleni védekezésben, kérünk írd be az alábbi szavakat a szövegdobozba ([[Special:Captcha/help|segítség]]):',
+	'fancycaptcha-sendemail' => 'Hogy segíts az automatikus spammelés elleni védekezésben, kérünk írd be az alábbi szavakat a szövegdobozba ([[Special:Captcha/help|segítség]]):', # Fuzzy
 );
 
 /** Interlingua (interlingua)
@@ -651,12 +688,13 @@ $messages['hu'] = array(
  */
 $messages['ia'] = array(
 	'fancycaptcha-addurl' => 'Tu modification include nove ligamines externe.
-Como protection contra le spam automatic, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
-	'fancycaptcha-badlogin' => 'Como protection contra le piratage automatic de contrasignos, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
-	'fancycaptcha-createaccount' => 'Como protection contra le creation automatic de contos, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
+Pro adjutar a proteger le wiki contra le spam automatisate, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
+	'fancycaptcha-badlogin' => 'Pro adjutar a proteger le wiki contra le furto automatisate de contrasignos, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
+	'fancycaptcha-createaccount' => 'Pro adjutar a proteger le wiki contra le creation automatisate de contos, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
 	'fancycaptcha-create' => 'Pro crear le pagina, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
 	'fancycaptcha-edit' => 'Pro modificar iste pagina, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
-	'fancycaptcha-sendemail' => 'Pro adjutar nos in le protection contra le spam automatic, per favor entra le parolas que appare hic infra in le quadro ([[Special:Captcha/help|plus info]]):',
+	'fancycaptcha-sendemail' => 'Pro adjutar a proteger le wiki contra le spam automatisate, per favor entra le parolas que appare infra in le quadro ([[Special:Captcha/help|plus info]]):',
+	'fancycaptcha-reload-text' => 'Refrescar',
 );
 
 /** Indonesian (Bahasa Indonesia)
@@ -665,25 +703,26 @@ Como protection contra le spam automatic, per favor entra le parolas que appare
  * @author Iwan Novirion
  */
 $messages['id'] = array(
-	'fancycaptcha-addurl' => 'Suntingan Anda mencantumkan pranala luar baru. Untuk pelindungan terhadap spam otomatis, harap masukkan kata di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
-	'fancycaptcha-badlogin' => 'Sebagai pelindungan terhadap pemecah kata kunci otomatis, harap masukkan kata di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
-	'fancycaptcha-createaccount' => 'Untuk pelindungan terhadap pembuatan akun otomatis, tolong masukkan kata di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
+	'fancycaptcha-addurl' => 'Suntingan Anda mencantumkan pranala luar baru. Untuk pelindungan terhadap spam otomatis, harap masukkan kata di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Sebagai pelindungan terhadap pemecah kata kunci otomatis, harap masukkan kata di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Untuk pelindungan terhadap pembuatan akun otomatis, tolong masukkan kata di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):', # Fuzzy
 	'fancycaptcha-create' => 'Untuk membuat halaman, silahkan masukkan kata-kata yang muncul di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
 	'fancycaptcha-edit' => 'Untuk menyunting halaman ini, silahkan masukkan kata-kata yang muncul di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
-	'fancycaptcha-sendemail' => 'Sebagai pelindungan terhadap spam otomatis, silahkan masukkan kata-kata yang muncul di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):',
+	'fancycaptcha-sendemail' => 'Sebagai pelindungan terhadap spam otomatis, silahkan masukkan kata-kata yang muncul di bawah ini ke dalam kotak yang tersedia ([[Special:Captcha/help|info lengkap]]):', # Fuzzy
 );
 
 /** Iloko (Ilokano)
  * @author Lam-ang
  */
 $messages['ilo'] = array(
-	'fancycaptcha-addurl' => 'Ti inurnos mo ket adda nagyan na a baro a panilpo ti ruar.
-Tapno  masalakniban kadagiti automatiko a spam, pangaasim nga ikabil ti balikas nga agparang dita baba a kahon. ([[Special:Captcha/help|adu pay a pakaammo]]):',
-	'fancycaptcha-badlogin' => 'Tapno  masalakniban kadagiti automatiko a pinagsulbar ti kontrasenias, pangaasim nga ikabil ti balikas nga agparang dita baba a kahon. ([[Special:Captcha/help|adu pay a pakaammo]]):',
-	'fancycaptcha-createaccount' => 'Tapno  makasalaknib kadagiti automatiko a pinagaramid ti pakabilangan, pangaasim nga ikabil ti balikas nga agparang dita baba a kahon. ([[Special:Captcha/help|adu pay a pakaammo]]):',
+	'fancycaptcha-addurl' => 'Dagiti inurnosmo ket aglaon kadagiti baro a silpo ti ruar.
+Tapno masalakniban ti wiki kadagiti automatiko nga spam, naemmakami nga agdawat nga ikabilmo dagiti balikas nga agparang dita baba iti kahon ([[Special:Captcha/help|adu pay a pakaammo]]):',
+	'fancycaptcha-badlogin' => 'Tapno masalakniban kadagiti automatiko a panagsulbar ti kontrasenias, naemmakami nga agdawat nga ikabilmo dagiti balikas nga agparang dita baba iti kahon ([[Special:Captcha/help|adu pay a pakaammo]]):',
+	'fancycaptcha-createaccount' => 'Tapno makasalakniban ti wiki kadagiti automatiko a panagpartuat ti pakabilangan, naemmakami nga agdawat nga ikabilmo dagiti balikas nga agparang dita baba iti kahon ([[Special:Captcha/help|adu pay a pakaammo]]):',
 	'fancycaptcha-create' => 'Tapno makaaramid ti panid, pangaasim nga ikabil ti balikas nga agparang dita baba a kahon. ([[Special:Captcha/help|adu pay a pakaammo]]):',
 	'fancycaptcha-edit' => 'Tapno makaurnos daytoy a panid, pangaasim nga ikabil ti balikas nga agparang dita baba a kahon. ([[Special:Captcha/help|adu pay a pakaammo]]):',
-	'fancycaptcha-sendemail' => 'Tapno  makasalaknib kadagiti automatiko a pinagspam, pangaasim nga ikabil ti balikas nga agparang dita baba a kahon. ([[Special:Captcha/help|adu pay a pakaammo]]):',
+	'fancycaptcha-sendemail' => 'Tapno makasalakniban ti wiki kadagiti automatiko a panag-spam, naemmakami nga agdawat nga ikabilmo dagiti balikas nga agparang dita baba iti kahon ([[Special:Captcha/help|adu pay a pakaammo]]):',
+	'fancycaptcha-reload-text' => 'Pasadiwaen',
 );
 
 /** Icelandic (íslenska)
@@ -691,12 +730,12 @@ Tapno  masalakniban kadagiti automatiko a spam, pangaasim nga ikabil ti balikas
  */
 $messages['is'] = array(
 	'fancycaptcha-addurl' => 'Breytingin þín inniheldur viðbætta ytri tengla.
-Til þess að hjálpa okkur verjast sjálfvirku auglýsingarusli, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
-	'fancycaptcha-badlogin' => 'Til þess að hjálpa okkur að verjast gegn sjálfvirkum leyniorðaárásum, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
-	'fancycaptcha-createaccount' => 'Til þess að hjálpa okkur að verjast sjálfvirkri stofnun aðganga, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
+Til þess að hjálpa okkur verjast sjálfvirku auglýsingarusli, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Til þess að hjálpa okkur að verjast gegn sjálfvirkum leyniorðaárásum, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Til þess að hjálpa okkur að verjast sjálfvirkri stofnun aðganga, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):', # Fuzzy
 	'fancycaptcha-create' => 'Til þess að búa til þessa síðu, vinsamlegast sláðu inn orðin sem birtast hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
 	'fancycaptcha-edit' => 'Til þess að breyta þessari síðu, vinsamlegast sláðu inn orðin að neðan í reitinn ([[Special:Captcha/help|frekari upplýsingar]]):',
-	'fancycaptcha-sendemail' => 'Til þess að hjálpa okkur að verjast sjálfvirkum auglýsingapósti, vinsamlegast sláðu inn orðin hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsinngar]]):',
+	'fancycaptcha-sendemail' => 'Til þess að hjálpa okkur að verjast sjálfvirkum auglýsingapósti, vinsamlegast sláðu inn orðin hér fyrir neðan í reitinn ([[Special:Captcha/help|frekari upplýsinngar]]):', # Fuzzy
 	'fancycaptcha-reload-text' => 'Endurhlaða',
 );
 
@@ -704,14 +743,15 @@ Til þess að hjálpa okkur verjast sjálfvirku auglýsingarusli, vinsamlegast s
  * @author Beta16
  * @author BrokenArrow
  * @author Darth Kule
+ * @author Nemo bis
  */
 $messages['it'] = array(
-	'fancycaptcha-addurl' => "La modifica richiesta aggiunge dei collegamenti esterni alla pagina; come misura precauzionale contro l'inserimento automatico di spam, si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):",
-	'fancycaptcha-badlogin' => 'Come misura precauzionale contro i tentativi di forzatura automatica della password, si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
-	'fancycaptcha-createaccount' => 'Come misura precauzionale contro i tentativi di creazione automatica degli account, si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
+	'fancycaptcha-addurl' => "La modifica richiesta aggiunge dei collegamenti esterni alla pagina; come misura precauzionale contro l'inserimento automatico di spam, ti chiediamo gentilmente di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):",
+	'fancycaptcha-badlogin' => 'Come misura precauzionale contro i tentativi di forzatura automatica della password, ti chiediamo gentilmente di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
+	'fancycaptcha-createaccount' => 'Come misura precauzionale contro i tentativi di registrazione automatica, ti chiediamo gentilmente di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
 	'fancycaptcha-create' => 'Per creare la pagina si prega di inserire nella casella sottostante le parole che compaiono nella casella di seguito ([[Special:Captcha/help|come funziona?]]):',
 	'fancycaptcha-edit' => 'Per modificare questa pagina si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
-	'fancycaptcha-sendemail' => 'Come misura precauzionale nei confronti dei messaggi di spam automatici, si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
+	'fancycaptcha-sendemail' => 'Come misura precauzionale nei confronti dei messaggi di spam automatici, ti chiediamo gentilmente di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
 	'fancycaptcha-reload-text' => 'Aggiorna',
 );
 
@@ -724,22 +764,23 @@ $messages['it'] = array(
 $messages['ja'] = array(
 	'fancycaptcha-desc' => 'Confirm Edit 用の装飾的な CAPTCHA ジェネレーター',
 	'fancycaptcha-addurl' => 'あなたは新しい外部リンクを追加しようとしています。
-自動でのスパム攻撃を防ぐため、下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
-	'fancycaptcha-badlogin' => '自動でのパスワードクラック攻撃を防ぐため、下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
-	'fancycaptcha-createaccount' => 'アカウントの自動登録を防ぐため、下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
+ウィキへの自動スパム攻撃を防ぐため、お手数をおかけしますが下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
+	'fancycaptcha-badlogin' => 'ウィキへの自動パスワードクラック攻撃を防ぐため、お手数をおかけしますが下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
+	'fancycaptcha-createaccount' => 'ウィキでのアカウント自動作成を防ぐため、お手数をおかけしますが下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
 	'fancycaptcha-create' => 'ページを新規作成するには、下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
 	'fancycaptcha-edit' => 'このページを編集するには、下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
-	'fancycaptcha-sendemail' => '自動でのスパム攻撃を防ぐため、下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
+	'fancycaptcha-sendemail' => 'ウィキへの自動スパム攻撃を防ぐため、お手数をおかけしますが下記の確認用の文字列を欄に入力してください ([[Special:Captcha/help|詳細]]):',
 	'fancycaptcha-reload-text' => '更新',
 );
 
 /** Jutish (jysk)
+ * @author Christian List
  * @author Huslåke
  */
 $messages['jut'] = array(
-	'fancycaptcha-addurl' => 'Din ændring tilføjer nye eksterne henvisninger. For at beskytte mod automatiseret spam, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
-	'fancycaptcha-badlogin' => 'For at beskytte mod automatiske forsøg på at gætte kodeord, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
-	'fancycaptcha-createaccount' => 'For at beskytte mod automatisk oprettelse af brugernavne, der bruges til spam, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
+	'fancycaptcha-addurl' => 'Din ændring tilføjer nye eksterne henvisninger. For at beskytte mod automatiseret spam, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'For at beskytte mod automatiske forsøg på at gætte adgangskoden, skal du indtaste ordet som vises i feltet nedenfor. ([[Special:Captcha/help|mere information]]):',
+	'fancycaptcha-createaccount' => 'For at beskytte mod automatisk oprettelse af brugernavne, der bruges til spam, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):', # Fuzzy
 	'fancycaptcha-create' => 'For at oprette en ny side, skal du indtaste ordet som vises nedenfor i feltet under det. ([[Special:Captcha/help|mere information]]):',
 	'fancycaptcha-edit' => 'or at redigere denne side
 ([[Special:Captcha/help|more info]]):',
@@ -749,9 +790,9 @@ $messages['jut'] = array(
  * @author Meursault2004
  */
 $messages['jv'] = array(
-	'fancycaptcha-addurl' => 'Suntingan panjenengan iku ngandhut pranala jaba anyar. Kanggo pangreksan marang spam otomatis, mangga lebokna tembung sing kapacak ing ngisor iki ing kothak sing wis cumepak ([[Special:Captcha/help|info jangkep]]):',
-	'fancycaptcha-badlogin' => 'Kanggo ngréwangi pangreksan marang parengkahan kunci sandhi otomatis, mangga lebokna tembung sing kapacak ing ngisor iki ing kothak sing wis cumepak ([[Special:Captcha/help|info jangkep]]):',
-	'fancycaptcha-createaccount' => 'Minangka pangreksan marang rékening (akun) sing digawé otomatis, tulung lebokna tembung sing kapacak ing ngisor iki ing kothak sing wis cumepak ([[Special:Captcha/help|info jangkep]]):',
+	'fancycaptcha-addurl' => 'Suntingan panjenengan iku ngandhut pranala jaba anyar. Kanggo pangreksan marang spam otomatis, mangga lebokna tembung sing kapacak ing ngisor iki ing kothak sing wis cumepak ([[Special:Captcha/help|info jangkep]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Kanggo ngréwangi pangreksan marang parengkahan kunci sandhi otomatis, mangga lebokna tembung sing kapacak ing ngisor iki ing kothak sing wis cumepak ([[Special:Captcha/help|info jangkep]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Minangka pangreksan marang rékening (akun) sing digawé otomatis, tulung lebokna tembung sing kapacak ing ngisor iki ing kothak sing wis cumepak ([[Special:Captcha/help|info jangkep]]):', # Fuzzy
 	'fancycaptcha-create' => 'Suntingan panjenengan ngandhut pranala jaba anyar. Kanggo nggawé kaca iki, mangga isèkna tembung-tembung sing ana ing kothak iki ([[Special:Captcha/help|info jangkep]]):',
 	'fancycaptcha-edit' => 'Suntingan panjenengan ngandhut pranala jaba anyar. Kanggo nyunting kaca iki, mangga isèkna tembung-tembung sing ana ing kothak iki ([[Special:Captcha/help|info jangkep]]):',
 );
@@ -762,12 +803,12 @@ $messages['jv'] = array(
  */
 $messages['ka'] = array(
 	'fancycaptcha-addurl' => 'თქვენი ცვლილება შეიცავს ახალ გარე ბმულებს.
-ავტომატური სპამინგისგან თავდაცვის მიზნით, გთხოვთ, შეიყვანოთ ქვემოთ მოცემული სიტყვები ყუთში ([[Special:Captcha/help|მეტი ინფორმაცია]]):',
-	'fancycaptcha-badlogin' => 'პაროლების ავტომატური გატეხვისგან თავდაცვის მიზნით, გთხოვთ, შეიყვანოთ ქვემოთ მოცემული სიტყვები ყუთში ([[Special:Captcha/help|მეტი ინფორმაცია]]):',
-	'fancycaptcha-createaccount' => 'ანგარიშების ავტომატური რეგისტრაციისაგან თავდაცვის მიზნით, გთხოვთ, შეიყვანოთ ნაჩვენები სიმბოლოები ტექსტურ ველში ([[Special:Captcha/help|დეტალურად]]):',
+ვიკის ავტომატური სპამინგისგან თავდაცვის მიზნით, ჩვენ მოგიწოდებთ, შეიყვანოთ ქვემოთ მოცემული სიტყვები ყუთში ([[Special:Captcha/help|მეტი ინფორმაცია]]):',
+	'fancycaptcha-badlogin' => 'ვიკის პაროლების ავტომატური გატეხვისგან თავდაცვის მიზნით, ჩვენ მოგიწოდებთ, შეიყვანოთ ქვემოთ მოცემული სიტყვები ყუთში ([[Special:Captcha/help|მეტი ინფორმაცია]]):',
+	'fancycaptcha-createaccount' => 'ვიკის ანგარიშების ავტომატური რეგისტრაციისაგან თავდაცვის მიზნით, ჩვენ მოგიწოდებთ, შეიყვანოთ ნაჩვენები სიმბოლოები ტექსტურ ველში ([[Special:Captcha/help|დეტალურად]]):',
 	'fancycaptcha-create' => 'გვერდის შესაქმნელად, გთხოვთ, შეიყვანეთ ასოები, რომლებიც ნაჩვენებია ქვედა სურათზე ([[Special:Captcha/help|დეტალურად…]]):',
 	'fancycaptcha-edit' => 'გვერდის რედაქტირებისათვის, გთხოვთ, შეიყვანეთ ასოები, რომლებიც ნაჩვენებია ქვედა სურათზე ([[Special:Captcha/help|დეტალურად…]]):',
-	'fancycaptcha-sendemail' => 'ავტომატური სპამისაგან თავდაცვის მიზნით, გთხოვთ, შეიყვანოთ ქვევით ნაჩვენები სიტყვა ტექსტურ ველში ([[Special:Captcha/help|მეტი ინფორმაცია]]):',
+	'fancycaptcha-sendemail' => 'ვიკის ავტომატური სპამისაგან თავდაცვის მიზნით, ჩვენ მოგიწოდებთ, შეიყვანოთ ქვევით ნაჩვენები სიტყვა ტექსტურ ველში ([[Special:Captcha/help|მეტი ინფორმაცია]]):',
 );
 
 /** Kara-Kalpak (Qaraqalpaqsha)
@@ -794,6 +835,7 @@ $messages['kk-arab'] = array(
 );
 
 /** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author Arystanbek
  */
 $messages['kk-cyrl'] = array(
 	'fancycaptcha-addurl' => 'Түзетуіңізде жаңа сыртқы сілтемелер бар екен. Өздік түрде «спам» жасалуынан қорғану үшін,
@@ -806,6 +848,7 @@ $messages['kk-cyrl'] = array(
 төмендегі көрсетілген сөздерді аумаққа енгізіңіз ([[{{ns:special}}:Captcha/help|көбірек ақпарат]]):', # Fuzzy
 	'fancycaptcha-edit' => 'Түзетуіңізде жаңа сыртқы сілтемелер бар екен. Өздік түрде «спам» жасалуынан қорғану үшін,
 төмендегі көрсетілген сөздерді аумаққа енгізіңіз ([[{{ns:special}}:Captcha/help|көбірек ақпарат]]):', # Fuzzy
+	'fancycaptcha-reload-text' => 'Жаңарту',
 );
 
 /** Kazakh (Latin script) (qazaqşa (latın)‎)
@@ -830,8 +873,8 @@ tömendegi körsetilgen sözderdi awmaqqa engiziñiz ([[{{ns:special}}:Captcha/h
 $messages['km'] = array(
 	'fancycaptcha-addurl' => 'កំណែប្រែរបស់អ្នកមានតំណភ្ជាប់ខាងក្រៅ។
 
-ដើម្បីការពារពីស្ប៉ាម(spam)ស្វ័យប្រវត្តិ សូមបញ្ជូលពាក្យខាងក្រោមទៅក្នុងប្រអប់ ([[Special:Captcha/help|ព័ត៌មានបន្ថែម]])៖',
-	'fancycaptcha-badlogin' => 'ដើម្បីការពារការបំបែកពាក្យសំងាត់ដោយស្វ័យប្រវត្តិ សូមបញ្ជូលពាក្យខាងក្រោមទៅក្នុងប្រអប់ ([[Special:Captcha/help|ព័ត៌មានបន្ថែម]])៖',
+ដើម្បីការពារពីស្ប៉ាមស្វ័យប្រវត្តិ សូមបញ្ជូលពាក្យខាងក្រោមទៅក្នុងប្រអប់ ([[Special:Captcha/help|ព័ត៌មានបន្ថែម]])៖',
+	'fancycaptcha-badlogin' => 'ដើម្បីការពារការបំបែកពាក្យសម្ងាត់ដោយស្វ័យប្រវត្តិ សូមបញ្ជូលពាក្យខាងក្រោមទៅក្នុងប្រអប់ ([[Special:Captcha/help|ព័ត៌មានបន្ថែម]])៖',
 	'fancycaptcha-createaccount' => 'ដើម្បីការពារការបង្កើតគណនីដោយស្វ័យប្រវត្តិ សូមបញ្ជូលពាក្យខាងក្រោមទៅក្នុងប្រអប់ ([[Special:Captcha/help|ព័ត៌មានបន្ថែម]])៖',
 	'fancycaptcha-create' => 'ដើម្បីបង្កើតទំព័រនេះ សូមបញ្ជូលពាក្យខាងក្រោមទៅក្នុងប្រអប់ ([[Special:Captcha/help|ព័ត៌មានបន្ថែម]])៖',
 	'fancycaptcha-edit' => 'ដើម្បីកែប្រែទំព័រនេះ សូមបញ្ជូលពាក្យខាងក្រោមទៅក្នុងប្រអប់ ([[Special:Captcha/help|ព័ត៌មានបន្ថែម]])៖',
@@ -845,12 +888,12 @@ $messages['km'] = array(
 $messages['ko'] = array(
 	'fancycaptcha-desc' => '편집 확인에 대한 공상 CAPTCHA(캡차) 생성기',
 	'fancycaptcha-addurl' => '편집에 새로운 바깥 링크가 포함되어 있습니다.
-자동화된 스팸으로부터 보호하기 위해 아래 상자의 낱말을 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
-	'fancycaptcha-badlogin' => '자동화된 비밀번호 깨기로부터 보호하기 위해 아래의 상자 안에 있는 낱말을 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
-	'fancycaptcha-createaccount' => '자동화된 계정 만들기로부터 보호하기 위해 아래의 상자 안에 있는 낱말을 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
+자동화된 스팸으로부터 위키를 보호하기 위해, 친절하게 요청하며 아래 상자에 나타나는 낱말을 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
+	'fancycaptcha-badlogin' => '자동화된 비밀번호 깨기로부터 위키를 보호하기 위해, 친절하게 요청하며 아래 상자에 나타나는 낱말을 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
+	'fancycaptcha-createaccount' => '자동화된 계정 만들기로부터 위키를 보호하기 위해, 친절하게 요청하며 아래 상자에 나타나는 낱말을 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
 	'fancycaptcha-create' => '문서를 만드려면 아래의 상자 안에 있는 낱말을 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
 	'fancycaptcha-edit' => '이 문서를 편집하려면 아래의 상자 안에 있는 낱말을 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
-	'fancycaptcha-sendemail' => '자동화된 스팸으로부터 보호하기 위해 아래의 상자 안에 있는 낱말을 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
+	'fancycaptcha-sendemail' => '자동화된 스팸으로부터 위키를 보호하기 위해, 친절하게 요청하며 아래 상자에 나타나는 낱말을 입력해주세요 ([[Special:Captcha/help|자세한 정보]]):',
 	'fancycaptcha-reload-text' => '새로 고침',
 );
 
@@ -858,7 +901,7 @@ $messages['ko'] = array(
  * @author Iltever
  */
 $messages['krc'] = array(
-	'fancycaptcha-createaccount' => 'Тергеу джазыуланы (аккаунтланы) автомат халда регистрация этиуню къоймаз ючюн, текстлик терезеде суратланнган символланы джазыгъыз ([[Special:Captcha/help|толуракъ]]):',
+	'fancycaptcha-createaccount' => 'Тергеу джазыуланы (аккаунтланы) автомат халда регистрация этиуню къоймаз ючюн, текстлик терезеде суратланнган символланы джазыгъыз ([[Special:Captcha/help|толуракъ]]):', # Fuzzy
 );
 
 /** Colognian (Ripoarisch)
@@ -868,42 +911,43 @@ $messages['ksh'] = array(
 	'fancycaptcha-desc' => 'Määt e nett Käptsche för dä <code lang="en">Confirm Edit</code> Projramm-Zohsatz',
 	'fancycaptcha-addurl' => 'Do häß neu Lingks op frembde Websigge dobei jedonn.
 Mer schöze uns Wiki jäje automatesche SPAM, dröm
-don di Wööter en dat Käßje endraare. (Verklierung)',
+don di Wööter en dat Käßje endraare. (Verklierung)', # Fuzzy
 	'fancycaptcha-badlogin' => 'Mer schöze Metmaacher en unsem Wiki jäje automatesche
 Paßwoot-Knackerei, dröm don di Wööt onge en dat Käßje
-endraare. (Verklierung)',
+endraare. (Verklierung)', # Fuzzy
 	'fancycaptcha-createaccount' => 'Mer schöze uns Wiki dojäje, dat mer en Masse automatesch
 Metmaacher aanmeldt. Dröm beß esu joot un
-don di Wööt onge en dat Käßje endraare. (Verklierung)',
+don di Wööt onge en dat Käßje endraare. (Verklierung)', # Fuzzy
 	'fancycaptcha-create' => 'Öm di Sigg neu aanzelääje, don di Wööt onge en dat Käßje endraare. (Verklierung)',
 	'fancycaptcha-edit' => 'Öm de Sigg ze ändere, don di Wööt onge en dat Käßje endraare. ([[Special:Captcha/help|Verklierung]])',
 	'fancycaptcha-sendemail' => 'Öm et Wiki jääje automattesch enjedraare SPAM ze schötze,
 bes esu joot, donn di Wööter enjävve, di en däm Käßje heh dronger shtonn.
-([[Special:Captcha/help|Mieh Enfommazjuhne]])',
+([[Special:Captcha/help|Mieh Enfommazjuhne]])', # Fuzzy
 	'fancycaptcha-reload-text' => 'Nöü Aanzeije!',
 );
 
 /** Cornish (kernowek)
  * @author Kernoweger
+ * @author Nrowe
  */
 $messages['kw'] = array(
-	'fancycaptcha-createaccount' => "Rag gwitha rag formya acontow awtomategys, gwrewgh entra an geryow usy ow tisqwedhes a-woles y'n gist ([[Special:Captcha/help|moy kedhlow]]):",
+	'fancycaptcha-createaccount' => "Rag gwitha rag gwruthyl akontow yawtomategys, entrewgh an geryow a omdhiskwa a-woles y'n gist ([[Special:Captcha/help|moy kedhlow]]):", # Fuzzy
 );
 
-/** Kirghiz (Кыргызча)
+/** Kyrgyz (Кыргызча)
  * @author Chorobek
  */
 $messages['ky'] = array(
-	'fancycaptcha-sendemail' => 'Автоматташтырылган спамдан коргонууга жардам катары бул сөздөрдү төмөндөгү көзөнөккө киргизиңиз ([[Special:Captcha/help|more info]]):',
+	'fancycaptcha-sendemail' => 'Автоматташтырылган спамдан коргонууга жардам катары бул сөздөрдү төмөндөгү көзөнөккө киргизиңиз ([[Special:Captcha/help|more info]]):', # Fuzzy
 );
 
 /** Latin (Latina)
  * @author SPQRobin
  */
 $messages['la'] = array(
-	'fancycaptcha-addurl' => 'Emendatione tua insunt nexus externi; ut spam automaticum vitemus, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):',
-	'fancycaptcha-badlogin' => 'Ut vitemus ne tesserae frangantur, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):',
-	'fancycaptcha-createaccount' => 'Ut creationem rationum automaticam vitemus, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):',
+	'fancycaptcha-addurl' => 'Emendatione tua insunt nexus externi; ut spam automaticum vitemus, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Ut vitemus ne tesserae frangantur, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Ut creationem rationum automaticam vitemus, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):', # Fuzzy
 	'fancycaptcha-create' => 'Ad paginam creandum, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):',
 	'fancycaptcha-edit' => 'Ad hanc paginam recensendum, necesse est tibi in capsam inscribere verba quae sub capsa monstrantur ([[Special:Captcha/help|Quidst illud?]]):',
 );
@@ -913,14 +957,14 @@ $messages['la'] = array(
  * @author Robby
  */
 $messages['lb'] = array(
-	'fancycaptcha-addurl' => 'An Ärer Ännerung sinn nei extern Linken.
+	'fancycaptcha-addurl' => "An Ärer Ännerung sinn nei extern Linken.
 
-Fir ze hellëfen, géint automatiséierte Spam virzegoen, gitt w.e.g. déi Wierder an, déi an der Këscht ënnendrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):',
-	'fancycaptcha-badlogin' => "Fir ze hellëfe fir d'automatiséiert Hacke vu Passwierder méi schwéier ze maachen, gitt w.e.g. déi Wierder an, déi an der Këscht ënnendrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):",
-	'fancycaptcha-createaccount' => "Fir géint d'automatiséiert Opmaache vu Benotzerkonte virzegoen, gitt w.e.g. déi Wierder an, déi an der Këscht ënnedrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):",
+Fir dës Wiki géint automatiséierte Spam ze schütze froe mir Iech d'Wierder anzeginn, déi an der Këscht ënnendrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):",
+	'fancycaptcha-badlogin' => "Fir ze hëllefe fir d'automatiséiert Hacke vu Passwierder méi schwéier ze maachen, froe mir Iech fir d'Wierder anzeginn, déi an der Këscht ënnendrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):",
+	'fancycaptcha-createaccount' => "Fir d'Wiki géint automatiséiert Opmaache vu Benotzerkonte ze schützen, froe mir Iech d'Wierder  déi an der Këscht ënnendrënner stinn anzeginn ([[Special:Captcha/help|méi Informatiounen]]):",
 	'fancycaptcha-create' => 'Fir dës Säit unzeleeën, gitt w.e.g. déi Wierder an, déi an der Këscht ënnendrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):',
 	'fancycaptcha-edit' => "Fir dës Säit z'änneren, gitt w.e.g. déi Wierder an, déi an der Këscht ënnendrënner stinn ([[Special:Captcha/help|méi Informatiounen]]):",
-	'fancycaptcha-sendemail' => 'Fir eis géint automatescht Spammen ze schützen, gitt w.e.g. déi Wierder déi an der Këscht ënnedrënner stinn an ([[Special:Captcha/help|méi Informatiounen]]):',
+	'fancycaptcha-sendemail' => "Fir eis géint automatescht Spammen ze schützen, froe mir Iech fir d'Wierder déi an der Këscht ënnendrënner stinn anzeginn ([[Special:Captcha/help|méi Informatiounen]]):",
 	'fancycaptcha-reload-text' => 'Aktualiséieren',
 );
 
@@ -930,32 +974,53 @@ Fir ze hellëfen, géint automatiséierte Spam virzegoen, gitt w.e.g. déi Wierd
  */
 $messages['li'] = array(
 	'fancycaptcha-addurl' => 'Uw bewerking bevat nieuwe externe links. Voer de woorden die
-hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
-	'fancycaptcha-badlogin' => 'Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen het automatisch kraken van wachtwoorden ([[Special:Captcha/help|meer informatie]]):',
+hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen het automatisch kraken van wachtwoorden ([[Special:Captcha/help|meer informatie]]):', # Fuzzy
 	'fancycaptcha-createaccount' => 'Voer de woorden die hieronder verschijnen in het invoerveld in
-ter bescherming tegen het automatisch aanmaken van gebruikers ([[Special:Captcha/help|meer informatie]]):',
+ter bescherming tegen het automatisch aanmaken van gebruikers ([[Special:Captcha/help|meer informatie]]):', # Fuzzy
 	'fancycaptcha-create' => 'Uw bewerking bevat nieuwe externe links. Voer de woorden die
 hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
 	'fancycaptcha-edit' => 'Uw bewerking bevat nieuwe externe links. Voer de woorden die
 hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|mie informatie]]):',
-	'fancycaptcha-sendemail' => "Veur de weurd die hie onger versjienen in 't inveurvèldj in es besjerming taege geautometiseerde spam ([[Special:Captcha/help|mier info]]):",
+	'fancycaptcha-sendemail' => "Veur de weurd die hie onger versjienen in 't inveurvèldj in es besjerming taege geautometiseerde spam ([[Special:Captcha/help|mier info]]):", # Fuzzy
 );
 
 /** Lao (ລາວ)
  */
 $messages['lo'] = array(
-	'fancycaptcha-addurl' => 'ການດັດແກ້ຂອງທ່ານ ມີລິ້ງຄ໌ພາຍນອກ. ເພື່ອປ້ອງກັນ ສະແປມອັດຕະໂນມັດ, ກະລຸນາ ພິມຄຳສັບຂ້າງລຸ່ມນີ້ ໃສ່ໃນກັບ ([[Special:Captcha/help|ຂໍ້ມູນເພີ່ມຕື່ມ]]):',
-	'fancycaptcha-badlogin' => 'ເພື່ອຊ່ອຍປ້ອງກັນ ການສືບຄົ້ນຫາລະຫັດຜ່ານແບບອັດຕະໂນມັດ, ກະລຸນາ ພິມຄຳສັບ ຂ້າງລຸ່ມນີ້ ໃສ່ໃນກັບ ([[Special:Captcha/help|ຂໍ້ມູນເພີ່ມຕື່ມ]]):',
-	'fancycaptcha-createaccount' => 'ເພື່ອປ້ອງກັນ ການສ້າງບັນຊີແບບອັດຕະໂນມດ, ກະລຸນາພິມ ຄຳສັບຂ້າງລຸ່ມນີ້​ ໃສ່ໃນກັບ ([[Special:Captcha/help|ຂໍ້ມູນເພິ່ມຕືມ]]):',
+	'fancycaptcha-addurl' => 'ການດັດແກ້ຂອງທ່ານ ມີລິ້ງຄ໌ພາຍນອກ. ເພື່ອປ້ອງກັນ ສະແປມອັດຕະໂນມັດ, ກະລຸນາ ພິມຄຳສັບຂ້າງລຸ່ມນີ້ ໃສ່ໃນກັບ ([[Special:Captcha/help|ຂໍ້ມູນເພີ່ມຕື່ມ]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'ເພື່ອຊ່ອຍປ້ອງກັນ ການສືບຄົ້ນຫາລະຫັດຜ່ານແບບອັດຕະໂນມັດ, ກະລຸນາ ພິມຄຳສັບ ຂ້າງລຸ່ມນີ້ ໃສ່ໃນກັບ ([[Special:Captcha/help|ຂໍ້ມູນເພີ່ມຕື່ມ]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'ເພື່ອປ້ອງກັນ ການສ້າງບັນຊີແບບອັດຕະໂນມດ, ກະລຸນາພິມ ຄຳສັບຂ້າງລຸ່ມນີ້​ ໃສ່ໃນກັບ ([[Special:Captcha/help|ຂໍ້ມູນເພິ່ມຕືມ]]):', # Fuzzy
 	'fancycaptcha-create' => 'ກະລຸນາ ພິມຄຳສັບຂ້າງລຸ່ມນີ້​ ໃສ່ໃນກັບ ເພື່ອສ້າງໜ້ານີ້ ([[Special:Captcha/help|more info]]):',
 	'fancycaptcha-edit' => 'ກະລຸນາ ພິມຄຳສັບຂ້າງລຸ່ມນີ້ ໃສ່ໃນກັບ ເພື່ອ ດັດແກ້ໜ້ານີ້ ([[Special:Captcha/help|ຂໍ້ມູນເພີ່ມຕື່ມ]]):',
 );
 
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+	'fancycaptcha-reload-text' => 'د نؤ كردن',
+);
+
+/** Lithuanian (lietuvių)
+ * @author Eitvys200
+ */
+$messages['lt'] = array(
+	'fancycaptcha-reload-text' => 'Atnaujinti',
+);
+
+/** Latvian (latviešu)
+ * @author Papuass
+ */
+$messages['lv'] = array(
+	'fancycaptcha-reload-text' => 'Atjaunināt',
+);
+
 /** Minangkabau (Baso Minangkabau)
  * @author Iwan Novirion
  */
 $messages['min'] = array(
-	'fancycaptcha-createaccount' => 'Untuak palinduangan tahadok pambuek akun otomatis, tolong masuakan kato di bawah ko ka kotak nan tasadio ([[Special:Captcha/help|info labiah lanjuik]]):',
+	'fancycaptcha-createaccount' => 'Untuak palinduangan tahadok pambuek akun otomatis, tolong masuakan kato di bawah ko ka kotak nan tasadio ([[Special:Captcha/help|info labiah lanjuik]]):', # Fuzzy
 );
 
 /** Macedonian (македонски)
@@ -964,12 +1029,12 @@ $messages['min'] = array(
 $messages['mk'] = array(
 	'fancycaptcha-desc' => 'Збогатен создавач CAPTCHA за потврда на уредувања',
 	'fancycaptcha-addurl' => 'Вашето уредување вклучува нови надворешни врски.
-Со цел да се заштитиме од автоматизиран спам, внесете ги зборовите на сликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
-	'fancycaptcha-badlogin' => 'Со цел да се заштитиме од автоматизирано пробивање на лозинки, внесете ги зборовите на сликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
-	'fancycaptcha-createaccount' => 'Со цел да се заштитиме од автоматизирано создавање на сметки, внесете ги зборовите на сликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
+Со цел да се заштитиме од автоматизиран спам, би ве замолиле да ги внесете зборовите на сликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
+	'fancycaptcha-badlogin' => 'Со цел да се заштитиме од автоматизирано пробивање на лозинки, би ве замолиле да ги внесете зборовите на сликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
+	'fancycaptcha-createaccount' => 'Со цел да се заштитиме од автоматизирано создавање на сметки, би ве замолиле да ги внесете зборовите на сликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
 	'fancycaptcha-create' => 'За да создадете страница, внесете ги зборовите на сликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
 	'fancycaptcha-edit' => 'За да ја уредите страницава, внесете ги зборовите на сликичката подолу ([[Special:Captcha/help|повеќе информации]]):',
-	'fancycaptcha-sendemail' => 'За да се заштитиме од автоматизирано спамирање, препишете ги зборовите од сликичката во полето подолу ([[Special:Captcha/help|повеќе информации]]):',
+	'fancycaptcha-sendemail' => 'За да се заштитиме од автоматизирано спамирање, би ве замолиле да ги внесете зборовите од сликичката во полето подолу ([[Special:Captcha/help|повеќе информации]]):',
 	'fancycaptcha-reload-text' => 'Превчитај',
 );
 
@@ -979,12 +1044,13 @@ $messages['mk'] = array(
  */
 $messages['ml'] = array(
 	'fancycaptcha-addurl' => 'താങ്കളുടെ തിരുത്തലലിൽ പുറം കണ്ണികൾ ഉൾപ്പെട്ടിരിക്കുന്നു.
-യാന്ത്രിക സ്പാമിനെതിരെയുള്ള സം‌രക്ഷണത്തിന്റെ ഭാഗമായി, താഴെ കാണുന്ന വാക്കുകൾ പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക  ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
-	'fancycaptcha-badlogin' => 'രഹസ്യവാക്ക് യാന്ത്രികമായി  പൊളിക്കുന്നത് തടയുന്നതിന്റെ ഭാഗമായി, താഴെ കാണുന്ന വാക്കുകൾ പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക  ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
-	'fancycaptcha-createaccount' => 'അംഗത്വം യാന്ത്രികമായി സൃഷ്ടിക്കുന്നതു തടയുന്നതൊഴിവാക്കാനുള്ള സം‌രക്ഷണത്തിന്റെ ഭാഗമായി, താഴെ കാണുന്ന വാക്കുകൾ പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക  ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
+യാന്ത്രിക സ്പാമിനെതിരെയുള്ള സം‌രക്ഷണത്തിന്റെ ഭാഗമായി, താഴെ കാണുന്ന വാക്കുകൾ പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക  ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'രഹസ്യവാക്ക് യാന്ത്രികമായി  പൊളിക്കുന്നത് തടയുന്നതിന്റെ ഭാഗമായി, താഴെ കാണുന്ന വാക്കുകൾ പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക  ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'അംഗത്വം യാന്ത്രികമായി സൃഷ്ടിക്കുന്നതു തടയുന്നതൊഴിവാക്കാനുള്ള സം‌രക്ഷണത്തിന്റെ ഭാഗമായി, താഴെ കാണുന്ന വാക്കുകൾ പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക  ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):', # Fuzzy
 	'fancycaptcha-create' => 'ഈ താൾ സൃഷ്ടിക്കുവാൻ താഴെയുള്ള പെട്ടിയിൽ കാണുന്ന വാക്കുകൾ ടൈപ്പു ചെയ്യുക  ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
 	'fancycaptcha-edit' => 'ഈ താൾ തിരുത്തുവാൻ ദയവായി താഴെ കാണുന്ന വാക്കുകൾ പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
-	'fancycaptcha-sendemail' => 'യാന്ത്രികമായ പാഴെഴുത്ത് ഉൾപ്പെടുത്തലിനുള്ള പ്രതിരോധമെന്ന നിലയിൽ, താഴെ കാണുന്ന വാക്കുകൾ പെട്ടിയിൽ ടൈപ്പ് ചെയ്യുക ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
+	'fancycaptcha-sendemail' => 'യാന്ത്രികമായ പാഴെഴുത്ത് ഉൾപ്പെടുത്തലിനുള്ള പ്രതിരോധമെന്ന നിലയിൽ, താഴെ കാണുന്ന വാക്കുകൾ പെട്ടിയിൽ ടൈപ്പ് ചെയ്യുക ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):', # Fuzzy
+	'fancycaptcha-reload-text' => 'പുതുക്കുക',
 );
 
 /** Marathi (मराठी)
@@ -993,12 +1059,12 @@ $messages['ml'] = array(
  */
 $messages['mr'] = array(
 	'fancycaptcha-addurl' => 'तुमच्या संपादनात नवीन बाह्य दुवे आहेत.
-आपोआप होणार्‍या संपादनांपासून बचावासाठी, खाली दिसणारे शब्द दिलेल्या पृष्ठपेटी मध्ये लिहा ([[Special:Captcha/help|अधिक माहिती]]):',
-	'fancycaptcha-badlogin' => 'आपोआप होणार्‍या परवलीच्या शब्दाच्या चोरीपासून वाचण्यासाठी, खाली दिसणारे शब्द दिलेल्या पृष्ठपेटी मध्ये लिहा ([[Special:Captcha/help|अधिक माहिती]]):',
-	'fancycaptcha-createaccount' => 'आपोआप होणार्‍या सदस्य नोंदणीपासून वाचण्यासाठी, खाली दिसणारे शब्द दिलेल्या पृष्ठपेटी मध्ये लिहा ([[Special:Captcha/help|अधिक माहिती]]):',
+आपोआप होणार्‍या संपादनांपासून बचावासाठी, खाली दिसणारे शब्द दिलेल्या पृष्ठपेटी मध्ये लिहा ([[Special:Captcha/help|अधिक माहिती]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'आपोआप होणार्‍या परवलीच्या शब्दाच्या चोरीपासून वाचण्यासाठी, खाली दिसणारे शब्द दिलेल्या पृष्ठपेटी मध्ये लिहा ([[Special:Captcha/help|अधिक माहिती]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'आपोआप होणार्‍या सदस्य नोंदणीपासून वाचण्यासाठी, खाली दिसणारे शब्द दिलेल्या पृष्ठपेटी मध्ये लिहा ([[Special:Captcha/help|अधिक माहिती]]):', # Fuzzy
 	'fancycaptcha-create' => 'हे पान तयार करण्यासाठी, खाली दिसणारे शब्द दिलेल्या पृष्ठपेटी मध्ये लिहा ([[Special:Captcha/help|अधिक माहिती]]):',
 	'fancycaptcha-edit' => 'हे पान संपादित करण्यासाठी, खाली दिसणारे शब्द दिलेल्या पृष्ठपेटी मध्ये लिहा ([[Special:Captcha/help|अधिक माहिती]]):',
-	'fancycaptcha-sendemail' => 'आपोआप होणार्‍या उत्पातापासून वाचण्यासाठी, खाली दिसणारे शब्द दिलेल्या पृष्ठपेटी मध्ये लिहा ([[Special:Captcha/help|अधिक माहिती]]):',
+	'fancycaptcha-sendemail' => 'आपोआप होणार्‍या उत्पातापासून वाचण्यासाठी, खाली दिसणारे शब्द दिलेल्या पृष्ठपेटी मध्ये लिहा ([[Special:Captcha/help|अधिक माहिती]]):', # Fuzzy
 );
 
 /** Malay (Bahasa Melayu)
@@ -1006,12 +1072,12 @@ $messages['mr'] = array(
  * @author Aviator
  */
 $messages['ms'] = array(
-	'fancycaptcha-addurl' => 'Suntingan anda mengandungi pautan luar baru. Untuk membanteras kegiatan spam automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
-	'fancycaptcha-badlogin' => 'Untuk membanteras kegiatan meneka kata laluan secara automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
-	'fancycaptcha-createaccount' => 'Untuk membanteras kegiatan pembukaan akaun secara automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
+	'fancycaptcha-addurl' => 'Suntingan anda mengandungi pautan luar baru. Untuk membanteras kegiatan spam automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Untuk membanteras kegiatan meneka kata laluan secara automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Untuk membanteras kegiatan pembukaan akaun secara automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
 	'fancycaptcha-create' => 'Untuk mencipta laman ini, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
 	'fancycaptcha-edit' => 'Untuk menyunting laman ini, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
-	'fancycaptcha-sendemail' => 'Untuk membanteras kegiatan spam secara automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):',
+	'fancycaptcha-sendemail' => 'Untuk membanteras kegiatan spam secara automatik, anda diminta mengisi huruf-huruf berikut dalam kotak yang disediakan ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
 	'fancycaptcha-reload-text' => 'Muat semula',
 );
 
@@ -1020,27 +1086,29 @@ $messages['ms'] = array(
  */
 $messages['mt'] = array(
 	'fancycaptcha-addurl' => "Il-modifika tiegħek tinkludi ħoloq esterni ġodda.
-Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok solvi din is-somma sempliċi t'hawn taħt u daħħal ir-risposta fil-kaxxa ([[Special:Captcha/help|aktar informazzjoni]]):",
-	'fancycaptcha-badlogin' => 'Bħala prekawzjoni kontra l-infurzar awtomatiku tal-password, jekk jogħġbok daħħal il-kliem li jidhru hawn taħt fil-kaxxa ([[Special:Captcha/help|aktar informazzjoni]]):',
-	'fancycaptcha-createaccount' => "Bħala miżura ta' prekawzjoni kontra l-ħolqien awtomatiku tal-kontijiet, jekk jogħġbok daħħal fil-kaxxa l-ittri li jidhru hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):",
+Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok solvi din is-somma sempliċi t'hawn taħt u daħħal ir-risposta fil-kaxxa ([[Special:Captcha/help|aktar informazzjoni]]):", # Fuzzy
+	'fancycaptcha-badlogin' => 'Bħala prekawzjoni kontra l-infurzar awtomatiku tal-password, jekk jogħġbok daħħal il-kliem li jidhru hawn taħt fil-kaxxa ([[Special:Captcha/help|aktar informazzjoni]]):', # Fuzzy
+	'fancycaptcha-createaccount' => "Bħala miżura ta' prekawzjoni kontra l-ħolqien awtomatiku tal-kontijiet, jekk jogħġbok daħħal fil-kaxxa l-ittri li jidhru hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):", # Fuzzy
 	'fancycaptcha-create' => 'Sabiex toħloq din il-paġna, jekk jogħġbok daħħal il-kliem li jidhru hawn taħt fil-kaxxa ([[Special:Captcha/help|aktar informazzjoni]]):',
 	'fancycaptcha-edit' => 'Sabiex timmodifika din il-paġna, jekk jogħġbok daħħal il-kliem li jidhru hawn taħt fil-kaxxa ([[Special:Captcha/help|aktar informazzjoni]]):',
-	'fancycaptcha-sendemail' => 'Bħala prekawzjoni kontra l-ispam awtomatiku, jekk jogħġbok daħħal fil-kaxxa l-ittri li jidhru hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):',
+	'fancycaptcha-sendemail' => 'Bħala prekawzjoni kontra l-ispam awtomatiku, jekk jogħġbok daħħal fil-kaxxa l-ittri li jidhru hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):', # Fuzzy
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
+ * @author Danmichaelo
  * @author Harald Khan
  * @author Laaknor
  * @author Njardarlogar
  */
 $messages['nb'] = array(
 	'fancycaptcha-desc' => 'CAPTCHA-generator for «Confirm Edit»',
-	'fancycaptcha-addurl' => 'Din endring inkluderer nye eksterne lenker. For hjelpe oss å beskytte oss mot automatisk spam, vennligst skriv inn ordene som kommer opp i denne boksen ([[Special:Captcha/help|mer informasjon]]):',
-	'fancycaptcha-badlogin' => 'Skriv inn ordene som dukker opp i boksen nedenfor for å hjelpe oss å beskytte oss mot passordtyveri ([[Special:Captcha/help|mer informasjon]]):',
-	'fancycaptcha-createaccount' => 'Skriv inn ordene som dukker opp i boksen nedenfor for å hjelpe oss å beskytte oss mot automatisk kontoopprettelse ([[Special:Captcha/help|mer informasjon]]):',
+	'fancycaptcha-addurl' => 'Din endring inkluderer nye eksterne lenker. For hjelpe oss å beskytte oss mot automatisk spam, vennligst skriv inn ordene som kommer opp i denne boksen ([[Special:Captcha/help|mer informasjon]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Skriv inn ordene som dukker opp i boksen nedenfor for å hjelpe oss å beskytte oss mot passordtyveri ([[Special:Captcha/help|mer informasjon]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Skriv inn ordene som dukker opp i boksen nedenfor for å hjelpe oss å beskytte oss mot automatisk kontoopprettelse ([[Special:Captcha/help|mer informasjon]]):', # Fuzzy
 	'fancycaptcha-create' => 'Skriv inn ordene som dukker opp i boksen nedenfor for å opprette siden ([[Special:Captcha/help|mer informasjon]]):',
 	'fancycaptcha-edit' => 'For å endre denne siden, vennligst skriv inn ordene som dukker opp i boksen nedenfor ([[Special:Captcha/help|mer informasjon]]):',
-	'fancycaptcha-sendemail' => 'For å beskytte mot automatisert spam så må du skrive ordene under inn i tekstboksen ([[Special:Captcha/help|mer informasjon]]):',
+	'fancycaptcha-sendemail' => 'For å beskytte mot automatisert spam så må du skrive ordene under inn i tekstboksen ([[Special:Captcha/help|mer informasjon]]):', # Fuzzy
+	'fancycaptcha-reload-text' => 'Last inn ny',
 );
 
 /** Low German (Plattdüütsch)
@@ -1048,39 +1116,42 @@ $messages['nb'] = array(
  */
 $messages['nds'] = array(
 	'fancycaptcha-addurl' => 'In dien Ännern sünd ne’e Weblenken in.
-As Schutz gegen automaatsch Spam, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).',
-	'fancycaptcha-badlogin' => 'As Schutz gegen Passwoord-Knackers, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).',
-	'fancycaptcha-createaccount' => 'As Schutz gegen dat automaatsch Opstellen vun ne’e Brukerkonten, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).',
+As Schutz gegen automaatsch Spam, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).', # Fuzzy
+	'fancycaptcha-badlogin' => 'As Schutz gegen Passwoord-Knackers, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).', # Fuzzy
+	'fancycaptcha-createaccount' => 'As Schutz gegen dat automaatsch Opstellen vun ne’e Brukerkonten, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).', # Fuzzy
 	'fancycaptcha-create' => 'Disse Sied nee optostellen, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).',
 	'fancycaptcha-edit' => 'Disse Sied to ännern, geev disse Bookstavenreeg in dat Feld ünnen in ([[Special:Captcha/help|mehr Infos]]).',
 );
 
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
  * @author Servien
  */
 $messages['nds-nl'] = array(
 	'fancycaptcha-addurl' => "Joew bewarking bevat uutgaonde verwiezingen. 
-Um dit projekt te bescharmen tegen ongewunst reklame, mö'j t woord dat hieronder steet invullen ([[Special:Captcha/help|hulpe]]):",
-	'fancycaptcha-badlogin' => "Um disse webstee te beveiligen tegen t kraken van wachtwoorden, wö'j verzöcht um de woorden die'j hieronder zien in te vullen ([[Special:Captcha/help|hulpe]]):",
-	'fancycaptcha-createaccount' => "Um disse wiki te bescharmen tegen t automaties anmaken van gebrukersprefielen mö'j t woord hieronder invullen ([[Special:Captcha/help|hulpe]]):",
+Um dit projekt te bescharmen tegen automatiese spam, mu'j t woord dat hieronder steet invullen ([[Special:Captcha/help|hulpe]]):",
+	'fancycaptcha-badlogin' => "Um disse webstee te beveiligen tegen t kraken van wachtwoorden, mu'j de woorden die'j hieronder zien effen invullen ([[Special:Captcha/help|hulpe]]):",
+	'fancycaptcha-createaccount' => "Um disse wiki te bescharmen tegen t automaties anmaken van gebrukersprofielen mu'j t woord hieronder invullen ([[Special:Captcha/help|hulpe]]):",
 	'fancycaptcha-create' => "Um n pagina an te maken, mö'j t woord dat hieronder steet invullen
 ([[Special:Captcha/help|hulpe]]):",
-	'fancycaptcha-edit' => "Joew bewarking bevat nieje uutgaonde verwiezingen. Um disse wiki te bescharmen tegen ongewunste reklame mö'j de woorden hieronder invullen ([[Special:Captcha/help|hulpe]]):",
-	'fancycaptcha-sendemail' => 'Voer de woorden die hieronder staon in t invoerveld in as bescharming tegen automatiese ongewunste reklame ([[Special:Captcha/help|meer informasie]]):',
+	'fancycaptcha-edit' => 'Vul de woorden die hieronder staon in um disse zied te bewarken ([[Special:Captcha/help|hulpe]]):',
+	'fancycaptcha-sendemail' => 'Voer de woorden die hieronder staon in t invoerveld in as bescharming tegen automatiese ongewunste reklame 
+([[Special:Captcha/help|hulpe]]):',
+	'fancycaptcha-reload-text' => 'Verniejen',
 );
 
 /** Dutch (Nederlands)
+ * @author HanV
  * @author Siebrand
  */
 $messages['nl'] = array(
 	'fancycaptcha-desc' => "Generator voor opgedirkte captcha's voor ConfirmEdit",
 	'fancycaptcha-addurl' => 'Uw bewerking bevat nieuwe externe koppelingen.
 Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
-	'fancycaptcha-badlogin' => 'Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen geautomatiseerde wachtwoordaanvallen ([[Special:Captcha/help|meer informatie]]):',
-	'fancycaptcha-createaccount' => 'Voer de woorden die hieronder verschijnen in het invoerveld in ter bescherming tegen het geautomatiseerd aanmaken van gebruikers ([[Special:Captcha/help|meer informatie]]):',
+	'fancycaptcha-badlogin' => 'Voer de woorden die hieronder getoond worden in het invoerveld in als bescherming tegen het automatisch kraken van wachtwoorden ([[Special:Captcha/help|meer informatie]]):',
+	'fancycaptcha-createaccount' => 'Voer de woorden die hieronder getoond worden in het invoerveld in ter bescherming tegen het geautomatiseerd aanmaken van gebruikers ([[Special:Captcha/help|meer informatie]]):',
 	'fancycaptcha-create' => 'Voer de woorden die hieronder verschijnen in het invoerveld in om de pagina aan te maken ([[Special:Captcha/help|meer informatie]]):',
 	'fancycaptcha-edit' => 'Voer de woorden die hieronder verschijnen in het invoerveld in om deze pagina te bewerken ([[Special:Captcha/help|meer informatie]]):',
-	'fancycaptcha-sendemail' => 'Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen geautomatiseerde spam ([[Special:Captcha/help|meer informatie]]):',
+	'fancycaptcha-sendemail' => 'Voer de woorden die hieronder getoond worden in het invoerveld in als bescherming tegen spam ([[Special:Captcha/help|meer informatie]]):',
 	'fancycaptcha-reload-text' => 'Verversen',
 );
 
@@ -1089,7 +1160,7 @@ Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming t
  */
 $messages['nl-informal'] = array(
 	'fancycaptcha-addurl' => 'Je bewerking bevat nieuwe externe koppelingen.
-Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
+Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):', # Fuzzy
 );
 
 /** Norwegian Nynorsk (norsk nynorsk)
@@ -1098,12 +1169,12 @@ Voer de woorden die hieronder verschijnen in het invoerveld in als bescherming t
  */
 $messages['nn'] = array(
 	'fancycaptcha-addurl' => 'Endringa di inneheld nye utlenkjer.
-For å hjelpa oss med å unngå automatisert spam, ver venleg og skriv inn orda som kjem til syne i boksen under ([[Special:Captcha/help|meir informasjon]]):',
-	'fancycaptcha-badlogin' => 'Skriv inn orda som kjem til syne i boksen nedanfor for å hjelpa oss med å unngå automatisert passordknekking ([[Special:Captcha/help|meir informasjon]]):',
-	'fancycaptcha-createaccount' => 'Skriv inn orda som kjem til syne i boksen nedanfor for å hjelpa oss med å unngå automatisk kontooppretting ([[Special:Captcha/help|meir informasjon]]):',
+For å hjelpa oss med å unngå automatisert spam, ver venleg og skriv inn orda som kjem til syne i boksen under ([[Special:Captcha/help|meir informasjon]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Skriv inn orda som kjem til syne i boksen nedanfor for å hjelpa oss med å unngå automatisert passordknekking ([[Special:Captcha/help|meir informasjon]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Skriv inn orda som kjem til syne i boksen nedanfor for å hjelpa oss med å unngå automatisk kontooppretting ([[Special:Captcha/help|meir informasjon]]):', # Fuzzy
 	'fancycaptcha-create' => 'Skriv inn orda som kjem til syne i boksen nedanfor for å oppretta sida ([[Special:Captcha/help|meir informasjon]]):',
 	'fancycaptcha-edit' => 'For å endra denne sida, ver venleg og skriv inn orda som kjem til syne i boksen nedanfor ([[Special:Captcha/help|meir informasjon]]):',
-	'fancycaptcha-sendemail' => 'For å hjelpa til mot sjølvgåande spamming, skriv inn orda som kjem til syne i boksen under ([[Special:Captcha/help|meir informasjon]]):',
+	'fancycaptcha-sendemail' => 'For å hjelpa til mot sjølvgåande spamming, skriv inn orda som kjem til syne i boksen under ([[Special:Captcha/help|meir informasjon]]):', # Fuzzy
 	'fancycaptcha-reload-text' => 'Oppdater',
 );
 
@@ -1112,39 +1183,41 @@ For å hjelpa oss med å unngå automatisert spam, ver venleg og skriv inn orda
  */
 $messages['oc'] = array(
 	'fancycaptcha-desc' => "Generador d’imatges ''captcha'' antirobòts que demandan una confirmacion umana de las modificacions.",
-	'fancycaptcha-addurl' => "Vòstra modificacion inclutz de ligams extèrnes novèls. Per verificar que s’agisson pas de spams automatics, epicatz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :",
-	'fancycaptcha-badlogin' => 'Per ajudar a vos protegir contra lo piratatge de compte per de senhals automatics, mercés de picar los mots que s’afichan dins aquesta bóstia ([[Special:Captcha/help|Ajuda]]) :',
-	'fancycaptcha-createaccount' => 'Coma proteccion contra las creacions de compte abusivas, picatz los mots çaijós dins la bóstia ([[Special:Captcha/help|mai d’entresenhas]]) :',
+	'fancycaptcha-addurl' => "Vòstra modificacion inclutz de ligams extèrnes novèls. Per verificar que s’agisson pas de spams automatics, epicatz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :", # Fuzzy
+	'fancycaptcha-badlogin' => 'Per ajudar a vos protegir contra lo piratatge de compte per de senhals automatics, mercés de picar los mots que s’afichan dins aquesta bóstia ([[Special:Captcha/help|Ajuda]]) :', # Fuzzy
+	'fancycaptcha-createaccount' => 'Coma proteccion contra las creacions de compte abusivas, picatz los mots çaijós dins la bóstia ([[Special:Captcha/help|mai d’entresenhas]]) :', # Fuzzy
 	'fancycaptcha-create' => "Vòstra modificacion inclutz de ligams extèrnes novèls. Per verificar que s’agisson pas de spams automatics, picatz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :",
 	'fancycaptcha-edit' => "Vòstra modificacion inclutz de ligams extèrnes novèls. Per verificar que s’agís pas de spam automatic, picatz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :",
-	'fancycaptcha-sendemail' => "Per tal de nos ajudar a prevenir lo spam automatic, entratz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’informacions]]) :",
+	'fancycaptcha-sendemail' => "Per tal de nos ajudar a prevenir lo spam automatic, entratz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’informacions]]) :", # Fuzzy
+	'fancycaptcha-reload-text' => 'Actualizar',
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Psubhashish
  */
 $messages['or'] = array(
 	'fancycaptcha-addurl' => 'ଆପଣଙ୍କ ସମ୍ପାଦନାରେ ନୂଆ ବାହାର ଲିଙ୍କ ରହିଛି ।
-ଆପେଆପେ ହେଉଥିବା ସ୍ପାମର ପ୍ରତିରୋଧ କରିବା ନିମନ୍ତେ  ଘର ତଳେ ଥିବା ଶବ୍ଦସବୁ ଦିଅନ୍ତୁ ([[Special:Captcha/help|ଅଧିକ ବିବରଣୀ]]):',
-	'fancycaptcha-badlogin' => 'ଆପେଆପେ ହେଉଥିବା ପାସବାର୍ଡ଼ ଚୋରାଇବାକୁ ପ୍ରତିରୋଧ କରିବା ନିମନ୍ତେ ଦୟାକରି ଏହି ଘରଭିତରେ ଥିବା ଶବ୍ଦସବୁକୁ ତାହା ତଳେ ଥିବା ବାକ୍ସରେ ଟାଇପ କରନ୍ତୁ । ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):',
-	'fancycaptcha-createaccount' => 'ଆପେଆପେ ଖାତା ଖୋଲିବାକୁ ଅଟକାଇବା ପାଇଁ ଦୟାକରି ଏହି ଘରଭିତରେ ଥିବା ଶବ୍ଦସବୁକୁ ତାହା ତଳେ ଥିବା ବାକ୍ସରେ ଟାଇପ କରନ୍ତୁ । ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):',
+ଆପେଆପେ ହେଉଥିବା ସ୍ପାମର ପ୍ରତିରୋଧ କରିବା ନିମନ୍ତେ  ଘର ତଳେ ଥିବା ଶବ୍ଦସବୁ ଦିଅନ୍ତୁ ([[Special:Captcha/help|ଅଧିକ ବିବରଣୀ]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'ଆପେଆପେ ହେଉଥିବା ପାସବାର୍ଡ଼ ଚୋରାଇବାକୁ ପ୍ରତିରୋଧ କରିବା ନିମନ୍ତେ ଦୟାକରି ଏହି ଘରଭିତରେ ଥିବା ଶବ୍ଦସବୁକୁ ତାହା ତଳେ ଥିବା ବାକ୍ସରେ ଟାଇପ କରନ୍ତୁ । ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'ଆପେଆପେ ଖାତା ଖୋଲିବାକୁ ଅଟକାଇବା ପାଇଁ ଦୟାକରି ଏହି ଘରଭିତରେ ଥିବା ଶବ୍ଦସବୁକୁ ତାହା ତଳେ ଥିବା ବାକ୍ସରେ ଟାଇପ କରନ୍ତୁ । ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):', # Fuzzy
 	'fancycaptcha-create' => 'ଏହି ପୃଷ୍ଠାଟିକୁ ତିଆରିବା ନିମନ୍ତେ, ଘର ତଳେ ଥିବା ଶବ୍ଦଟିକୁ ଏଠାରେ ଦିଅନ୍ତୁ ([[Special:Captcha/help|ଅଧିକ ଜାଣନ୍ତୁ]]):',
 	'fancycaptcha-edit' => 'ଏହି ପୃଷ୍ଠାଟିକୁ ବଦଳାଇବା ନିମନ୍ତେ, ଘର ତଳେ ଥିବା ଶବ୍ଦଟିକୁ ଏଠାରେ ଦିଅନ୍ତୁ ([[Special:Captcha/help|ଅଧିକ ଜାଣନ୍ତୁ]]):',
-	'fancycaptcha-sendemail' => 'ଆପେଆପେ ହେଉଥିବା ସ୍ପାମକୁ ରୋକିବା ନିମନ୍ତେ ଦୟାକରି ଏହି ଘରଭିତରେ ଥିବା ଶବ୍ଦସବୁକୁ ତାହା ତଳେ ଥିବା ବାକ୍ସରେ ଟାଇପ କରନ୍ତୁ । ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):',
+	'fancycaptcha-sendemail' => 'ଆପେଆପେ ହେଉଥିବା ସ୍ପାମକୁ ରୋକିବା ନିମନ୍ତେ ଦୟାକରି ଏହି ଘରଭିତରେ ଥିବା ଶବ୍ଦସବୁକୁ ତାହା ତଳେ ଥିବା ବାକ୍ସରେ ଟାଇପ କରନ୍ତୁ । ([[Special:Captcha/help|ଅଧିକ ସୂଚନା]]):', # Fuzzy
 );
 
 /** Polish (polski)
  * @author Chrumps
  * @author Sp5uhe
+ * @author WTM
  */
 $messages['pl'] = array(
 	'fancycaptcha-desc' => 'Generator obrazka, którego odczytanie jest wymagane dla zatwierdzenia edycji.',
-	'fancycaptcha-addurl' => 'Twoja edycja zawiera nowe linki zewnętrzne. Ze względu na ochronę przed zautomatyzowanym spamem prosimy o wpisanie słów, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
-	'fancycaptcha-badlogin' => 'Ze względu na zabezpieczenie przed automatycznym łamaniem haseł prosimy o wpisanie słów, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
-	'fancycaptcha-createaccount' => 'Ze względu na ochronę przed automatycznym spamem, aby się zarejestrować musisz wpisać słowo, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]])',
-	'fancycaptcha-create' => 'Aby utworzyć tę stronę, wpisz słowa, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
-	'fancycaptcha-edit' => 'Aby edytować tę stronę, wpisz słowa, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
-	'fancycaptcha-sendemail' => 'Zabezpieczenie przed automatycznie dodawanym spamem. Wprowadzić słowa widoczne w poniższym prostokącie ([[Special:Captcha/help|więcej informacji]]).',
+	'fancycaptcha-addurl' => 'Twoja edycja zawiera nowe linki zewnętrzne. Ze względu na ochronę przed zautomatyzowanym spamem prosimy o wpisanie słów, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Ze względu na zabezpieczenie przed automatycznym łamaniem haseł prosimy o wpisanie słów, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Ze względu na ochronę przed automatycznym spamem, aby się zarejestrować musisz wpisać słowo, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]])', # Fuzzy
+	'fancycaptcha-create' => 'Aby utworzyć tę stronę, przepisz słowa, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
+	'fancycaptcha-edit' => 'Aby edytować tę stronę, przepisz słowa, które widzisz poniżej, do pola tekstowego ([[Special:Captcha/help|pomoc]]):',
+	'fancycaptcha-sendemail' => 'Zabezpieczenie przed automatycznie dodawanym spamem. Wprowadzić słowa widoczne w poniższym prostokącie ([[Special:Captcha/help|więcej informacji]]).', # Fuzzy
 	'fancycaptcha-reload-text' => 'Odśwież',
 );
 
@@ -1154,12 +1227,13 @@ $messages['pl'] = array(
  */
 $messages['pms'] = array(
 	'fancycaptcha-addurl' => "Soa modìfica a l'ha andrinta dj'anliure esterne neuve.
-Për dene na man a vardesse da la reclam aotomatisà, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ambelessì sota ([[Special:Captcha/help|për savejne dë pì]]):",
-	'fancycaptcha-badlogin' => "Për dene na man a vardesse da ij programa ch'a fan ciav fàosse, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ambelessì sota ([[Special:Captcha/help|për savejne dë pì]]):",
-	'fancycaptcha-createaccount' => "Për dene na man a vardesse da ij programa ch'a deurbo cont neuv n'aotomàtich, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ambelessì sota ([[Special:Captcha/help|për savejne dë pì]]):",
+Për protege la wiki da la rumenta aotomatisà, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ant la casela ([[Special:Captcha/help|për savejne dë pì]]):",
+	'fancycaptcha-badlogin' => "Për protege la wiki dai programa ch'a sërco ëd freghé le ciav, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ant la casela ambelessì-sota ([[Special:Captcha/help|për savejne dë pì]]):",
+	'fancycaptcha-createaccount' => "Për protege la wiki dai programa ch'a deurbo ëd cont neuv n'aotomàtich, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ant la casela ambelessì-sota ([[Special:Captcha/help|për savejne dë pì]]):",
 	'fancycaptcha-create' => "Për creé sta pàgina-i d'amblé, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ambelessì sota ([[Special:Captcha/help|për savejne dë pì]]):",
 	'fancycaptcha-edit' => "Për fe-ie dle modìfiche ansima a sta pàgina-sì, për piasì, ch'a l'arbata le paròle ch'a s-ciàira ambelessì sota ([[Special:Captcha/help|për savejne dë pì]]):",
-	'fancycaptcha-sendemail' => "Për giuté a protegi contra la rumenta automàtica, për piasì ch'a anseriss le paròle che as vëddo sota ant la casela ([[Special:Captcha/help|për savèjne ëd pi]]):",
+	'fancycaptcha-sendemail' => "Për protege la wiki contra la rumenta automàtica, për piasì ch'a anserissa le paròle che as vëddo ant la casela sì-sota ([[Special:Captcha/help|për savèjne ëd pi]]):",
+	'fancycaptcha-reload-text' => 'Agiorné',
 );
 
 /** Western Punjabi (پنجابی)
@@ -1167,20 +1241,20 @@ Për dene na man a vardesse da la reclam aotomatisà, për piasì, ch'a l'arbata
  */
 $messages['pnb'] = array(
 	'fancycaptcha-addurl' => 'تواڈی تبدیلی چ نویں بارلے جوڑ نیں۔
-اس صفحے نوں تبدیل کرن واسطے، مہربانی کر کے ڈبے چ دتے گۓ شبداں نوں لکھو ([[Special:Captcha/help|مزید جانکاری]]):',
-	'fancycaptcha-badlogin' => 'اپنے آپ کنجی توڑن دے خلاف مدد واسطے، مہربانی کر کے ڈبے چ دتے گۓ شبداں نوں لکھو ([[Special:Captcha/help|مزید جانکاری]]):',
-	'fancycaptcha-createaccount' => 'اپنے آپ غلط نویں کھاتے بنان نوں روکن واسطے، مہربانی کر کے ڈبے چ دتے گۓ شبداں نوں لکھو ([[Special:Captcha/help|مزید جانکاری]]):',
+اس صفحے نوں تبدیل کرن واسطے، مہربانی کر کے ڈبے چ دتے گۓ شبداں نوں لکھو ([[Special:Captcha/help|مزید جانکاری]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'اپنے آپ کنجی توڑن دے خلاف مدد واسطے، مہربانی کر کے ڈبے چ دتے گۓ شبداں نوں لکھو ([[Special:Captcha/help|مزید جانکاری]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'اپنے آپ غلط نویں کھاتے بنان نوں روکن واسطے، مہربانی کر کے ڈبے چ دتے گۓ شبداں نوں لکھو ([[Special:Captcha/help|مزید جانکاری]]):', # Fuzzy
 	'fancycaptcha-create' => 'صفحہ بنان واسطے، مہربانی کر کے ڈبے چ دتے گۓ شبداں نوں لکھو ([[Special:Captcha/help|مزید جانکاری]]):',
 	'fancycaptcha-edit' => 'اس صفحے تے تبدیلی کرن واسطے، مہربانی کر کے ڈبے چ دتے گۓ شبداں نوں لکھو ([[Special:Captcha/help|مزید جانکاری]]):',
-	'fancycaptcha-sendemail' => 'اپنے آپ غلط مال آن نوں روکن واسطے، مہربانی کر کے ڈبے چ دتے گۓ شبداں نوں لکھو ([[Special:Captcha/help|مزید جانکاری]]):',
+	'fancycaptcha-sendemail' => 'اپنے آپ غلط مال آن نوں روکن واسطے، مہربانی کر کے ڈبے چ دتے گۓ شبداں نوں لکھو ([[Special:Captcha/help|مزید جانکاری]]):', # Fuzzy
 );
 
 /** Pashto (پښتو)
  * @author Ahmed-Najib-Biabani-Ibrahimkhel
  */
 $messages['ps'] = array(
-	'fancycaptcha-create' => 'ددې مخ د جوړلو لپاره، لطفاً ورکړل شوي توري څنګه چې تاسو ته ښکاري هماغسې کټ مټ په لانديني چوکاټ کې وليکی ([[Special:Captcha/help|نور مالومات]]):',
-	'fancycaptcha-edit' => 'ددې مخ د سمولو لپاره، لطفاً ورکړل شوي توري څنګه چې تاسې ته ښکاري هماغسې کټ مټ په لانديني چوکاټ کې وليکی ([[Special:Captcha/help|نور مالومات]]):',
+	'fancycaptcha-create' => 'ددې مخ د جوړلو لپاره، لطفاً ورکړل شوي توري چې څنگه تاسې ته ښکاري هماغسې کټ مټ په لانديني چوکاټ کې وليکی ([[Special:Captcha/help|نور مالومات]]):',
+	'fancycaptcha-edit' => 'ددې مخ د سمولو لپاره، لطفاً ورکړل شوي توري چې څنگه تاسې ته ښکاري هماغسې کټ مټ په لانديني چوکاټ کې وليکی ([[Special:Captcha/help|نور مالومات]]):',
 );
 
 /** Portuguese (português)
@@ -1190,32 +1264,42 @@ $messages['ps'] = array(
 $messages['pt'] = array(
 	'fancycaptcha-desc' => 'Gerador sofisticado de captcha para o Confirm Edit',
 	'fancycaptcha-addurl' => "A sua edição introduziu links externos novos.
-Para ajudar a prevenir o ''spam'' automatizado, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):",
-	'fancycaptcha-badlogin' => 'Para ajudar a prevenir mecanismos automatizados de descoberta de palavras-chave, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):',
-	'fancycaptcha-createaccount' => 'Para ajudar a prevenir a criação de contas automatizada, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):',
+Para ajudar a prevenir o ''spam'' automatizado, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):", # Fuzzy
+	'fancycaptcha-badlogin' => 'Para ajudar a prevenir mecanismos automatizados de descoberta de palavras-chave, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Para ajudar a prevenir a criação de contas automatizada, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):', # Fuzzy
 	'fancycaptcha-create' => 'Para criar a página, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):',
 	'fancycaptcha-edit' => 'Para editar esta página, por favor, introduza na caixa abaixo as palavras apresentadas ([[Special:Captcha/help|mais informações]]):',
-	'fancycaptcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, introduza na caixa as palavras que aparecem abaixo ([[Special:Captcha/help|mais informações]]):",
+	'fancycaptcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, introduza na caixa as palavras que aparecem abaixo ([[Special:Captcha/help|mais informações]]):", # Fuzzy
 );
 
 /** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
  * @author Eduardo.mps
  * @author Giro720
  */
 $messages['pt-br'] = array(
-	'fancycaptcha-addurl' => "A sua edição inclui novas ligações externas. Como prevenção contra sistemas automatizados que inserem ''spam'', por favor, introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):",
-	'fancycaptcha-badlogin' => 'Como prevenção contra formas automatizadas de descoberta de palavras-chave, por favor, introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):',
-	'fancycaptcha-createaccount' => 'Como prevenção contra sistemas automatizados de criação de contas, por favor, introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):',
+	'fancycaptcha-addurl' => "A sua edição inclui novas ligações externas. Para proteger a wiki contra sistemas automatizados que inserem ''spam'', por favor, introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):",
+	'fancycaptcha-badlogin' => 'Para proteger a wiki contra programas automatizados de detecção de senhas, por favor, introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):',
+	'fancycaptcha-createaccount' => 'Para proteger a wiki contra sistemas automatizados de criação de contas, solicitamos que introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):',
 	'fancycaptcha-create' => 'Para criar a página, por favor, introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):',
 	'fancycaptcha-edit' => 'Para editar esta página, por favor, introduza as palavras exibidas na seguinte caixa ([[Special:Captcha/help|mais informações]]):',
-	'fancycaptcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, introduza na caixa as palavras que aparecem abaixo ([[Special:Captcha/help|mais informações]]):",
+	'fancycaptcha-sendemail' => "Para ajudar a combater ''spam'' automatizado, pedimos que, por favor, introduza as palavras que aparecem abaixo ([[Special:Captcha/help|mais informações]]):",
+	'fancycaptcha-reload-text' => 'Atualizar',
+);
+
+/** Quechua (Runa Simi)
+ * @author AlimanRuna
+ */
+$messages['qu'] = array(
+	'fancycaptcha-create' => "P'anqata kamarinaykipaqqa kay qatiq kahachapi kaq rimakunata yaykuchiy ([[Special:Captcha/help|astawan yachay]]):",
+	'fancycaptcha-edit' => "Kay p'anqata llamk'anaykipaqqa kay qatiq kahachapi kaq rimakunata yaykuchiy ([[Special:Captcha/help|astawan yachay]]):",
 );
 
 /** Romansh (rumantsch)
  * @author Kazu89
  */
 $messages['rm'] = array(
-	'fancycaptcha-createaccount' => "Per impedir la creaziun automatica da contos d'utilisader, endatescha per plaschair ils bustabs che vegnan mussads sutvart ([[Special:Captcha/help|dapli infos]]):",
+	'fancycaptcha-createaccount' => "Per impedir la creaziun automatica da contos d'utilisader, endatescha per plaschair ils bustabs che vegnan mussads sutvart ([[Special:Captcha/help|dapli infos]]):", # Fuzzy
 );
 
 /** Romanian (română)
@@ -1225,12 +1309,13 @@ $messages['rm'] = array(
  */
 $messages['ro'] = array(
 	'fancycaptcha-addurl' => 'Modificarea dumneavoastră include legături externe noi.
-Pentru a împiedica roboții de spam, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):',
-	'fancycaptcha-badlogin' => 'Pentru a împiedica spargerea automată a parolelor, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):',
-	'fancycaptcha-createaccount' => 'Pentru a împiedica crearea automată de conturi, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):',
+Pentru a împiedica roboții de spam, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Pentru a împiedica spargerea automată a parolelor, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Pentru a împiedica crearea automată de conturi, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
 	'fancycaptcha-create' => 'Pentru a crea pagina, vă rugăm să introduceți în casetă cuvintele care apar mai jos ([[Special:Captcha/help|mai multe detalii]]):',
 	'fancycaptcha-edit' => 'Pentru a modifica această pagină, vă rugăm să introduceți în casetă cuvintele care apar mai jos ([[Special:Captcha/help|mai multe detalii]]):',
-	'fancycaptcha-sendemail' => 'Pentru a împiedica roboții de spam, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):',
+	'fancycaptcha-sendemail' => 'Pentru a împiedica roboții de spam, vă rugăm să introduceți cuvintele care apar mai jos în căsuță ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
+	'fancycaptcha-reload-text' => 'Reîncarcă',
 );
 
 /** tarandíne (tarandíne)
@@ -1238,40 +1323,43 @@ Pentru a împiedica roboții de spam, vă rugăm să introduceți cuvintele care
  */
 $messages['roa-tara'] = array(
 	'fancycaptcha-addurl' => "'U cangiamende tue inglude de le collegaminde esterne.
-Pe aiutà a proteggere condre a 'u spam automateche, pe piacere mitte le parole ca combare sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):",
-	'fancycaptcha-badlogin' => 'Pe aiutà a proteggere condre a futteminde automatece de password, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|more info]]):',
-	'fancycaptcha-createaccount' => 'Pe aiutà a proteggere condre a ccreazione automateche de cunde utinde, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|more info]]):',
+Pe aiutà a proteggere condre a 'u spam automateche, pe piacere mitte le parole ca combare sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):", # Fuzzy
+	'fancycaptcha-badlogin' => 'Pe aiutà a proteggere condre a futteminde automatece de password, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|more info]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Pe aiutà a proteggere condre a ccreazione automateche de cunde utinde, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|more info]]):', # Fuzzy
 	'fancycaptcha-create' => 'Pe ccrejà sta pàgene, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|more info]]):',
 	'fancycaptcha-edit' => 'Pe cangià sta pàgene, pe piacere mitte le parole combare aqquà sotte ([[Special:Captcha/help|more info]]):',
-	'fancycaptcha-sendemail' => "Pe aiutà a proteggere condre a spam automatece, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):",
+	'fancycaptcha-sendemail' => "Pe aiutà a proteggere condre a spam automatece, pe piacere mitte le parole ca combare aqquà sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):", # Fuzzy
 	'fancycaptcha-reload-text' => 'Aggiorne',
 );
 
 /** Russian (русский)
  * @author Dim Grits
  * @author Lockal
+ * @author Okras
  * @author Александр Сигачёв
  */
 $messages['ru'] = array(
 	'fancycaptcha-desc' => 'Необычный CAPTCHA-генератор для подтверждения редактирования',
-	'fancycaptcha-addurl' => 'Ваша правка содержит новые внешние ссылки. В целях защиты от спама, пожалуйста, введите слова, показанные ниже в рамке ([[Special:Captcha/help|подробнее…]]):',
-	'fancycaptcha-badlogin' => 'В целях защиты от автоматического взлома паролей, пожалуйста, введите в поле ввода буквы с изображения ([[Special:Captcha/help|подробнее]]):',
-	'fancycaptcha-createaccount' => 'Для предотвращения автоматической регистрации учётных записей, пожалуйста, введите изображённые символы в текстовое поле ([[Special:Captcha/help|подробнее]]):',
+	'fancycaptcha-addurl' => 'Ваша правка содержит новые внешние ссылки.
+В целях защиты от спама просим вас ввести слова, показанные ниже в рамке ([[Special:Captcha/help|подробнее…]]):',
+	'fancycaptcha-badlogin' => 'В целях защиты от автоматического взлома паролей просим вас ввести слова, показанные ниже в рамке ([[Special:Captcha/help|подробнее…]]):',
+	'fancycaptcha-createaccount' => 'Для предотвращения автоматической регистрации учётных записей просим вас ввести слова, показанные ниже в рамке ([[Special:Captcha/help|подробнее…]]):',
 	'fancycaptcha-create' => 'Для создания страницы, пожалуйста, введите буквы, которые видны на изображении ниже ([[Special:Captcha/help|подробнее…]]):',
 	'fancycaptcha-edit' => 'Для редактирования страницы, пожалуйста, введите буквы, которые видны на изображении ниже ([[Special:Captcha/help|подробнее…]]):',
-	'fancycaptcha-sendemail' => 'В целях защиты от автоматического спама, пожалуйста, введите показанные ниже слова ([[Special:Captcha/help|подробнее]]):',
+	'fancycaptcha-sendemail' => 'В целях защиты от автоматического спама просим вас ввести слова, показанные ниже в рамке ([[Special:Captcha/help|подробнее…]]):',
+	'fancycaptcha-reload-text' => 'Обновить',
 );
 
 /** Rusyn (русиньскый)
  * @author Gazeb
  */
 $messages['rue'] = array(
-	'fancycaptcha-addurl' => 'Ваше едітованя обсягує новы одказы формов URL; про охорону перед автоматічным спамом мусите описати текст з наступного образку. ([[Special:Captcha/help|Што тото значіть?]])',
-	'fancycaptcha-badlogin' => 'В рамках охороны перед автоматічныма пробами угаднути гесло мусите описати текст з наступного образку. ([[Special:Captcha/help|Што тото значіть?]]):',
-	'fancycaptcha-createaccount' => 'В рамках охороны перед автоматічныма створёванями конт мусите про выконаня реґістрації описати текст з наступного образку. ([[Special:Captcha/help|Што тото значіть?]]):',
+	'fancycaptcha-addurl' => 'Ваше едітованя обсягує новы одказы формов URL; про охорону перед автоматічным спамом мусите описати текст з наступного образку. ([[Special:Captcha/help|Што тото значіть?]])', # Fuzzy
+	'fancycaptcha-badlogin' => 'В рамках охороны перед автоматічныма пробами угаднути гесло мусите описати текст з наступного образку. ([[Special:Captcha/help|Што тото значіть?]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'В рамках охороны перед автоматічныма створёванями конт мусите про выконаня реґістрації описати текст з наступного образку. ([[Special:Captcha/help|Што тото значіть?]]):', # Fuzzy
 	'fancycaptcha-create' => 'Жебы сьте могли створити сторінку, мусите описати текст з наступного образку:([[Special:Captcha/help|Што тото значіть?]])',
 	'fancycaptcha-edit' => 'Жебы сьте могли едітовати тоту сторінку, мусите описати текст з наступного образку: ([[Special:Captcha/help|Што тото значіть?]])',
-	'fancycaptcha-sendemail' => 'В рамках охороны перед автоматічным спамом мусите описати текст з наступного образку. ([[Special:Captcha/help|Што тото значіть?]]):',
+	'fancycaptcha-sendemail' => 'В рамках охороны перед автоматічным спамом мусите описати текст з наступного образку. ([[Special:Captcha/help|Што тото значіть?]]):', # Fuzzy
 );
 
 /** Sanskrit (संस्कृतम्)
@@ -1280,27 +1368,27 @@ $messages['rue'] = array(
 $messages['sa'] = array(
 	'fancycaptcha-addurl' => 'भवतः सम्पादने नूतनबाह्यानुबन्धाः अन्तर्भूताः ।
 स्वचालितानिष्टसन्देशेभ्यः रक्षणस्य साहाय्यार्थं कृपया अधः मञ्जूषायां दृश्यमानानि पदानि लिखतु
-([[Special:Captcha/help|more info]]) :',
+([[Special:Captcha/help|more info]]) :', # Fuzzy
 	'fancycaptcha-badlogin' => 'स्वचालिताभ्यः कूटशब्दभेदनेभ्यः रक्षणस्य साहाय्यार्थं कृपया अधः मञ्जूषायां दृश्यमानानि पदानि लिखतु
-([[Special:Captcha/help|more info]]) :',
+([[Special:Captcha/help|more info]]) :', # Fuzzy
 	'fancycaptcha-createaccount' => 'स्वचालिताभ्यः लेखासर्जनेभ्यः रक्षणस्य साहाय्यार्थं कृपया अधः मञ्जूषायां दृश्यमानानि पदानि लिखतु
-([[Special:Captcha/help|more info]]) :',
+([[Special:Captcha/help|more info]]) :', # Fuzzy
 	'fancycaptcha-create' => 'पृष्ठस्य सर्जनाय, अधः मञ्जूषायां दृश्यमानानि पदानि लिखतु ([[Special:Captcha/help|more info]]):',
 	'fancycaptcha-edit' => 'अस्य पृष्ठस्य सम्पादनाय, अधः मञ्जूषायां दृश्यमानानि पदानि लिखतु ([[Special:Captcha/help|अधिक जानकारी]]):',
 	'fancycaptcha-sendemail' => 'स्वचालिताभ्यः अनिष्टसन्देशेभ्यः रक्षणस्य साहाय्यार्थं कृपया अधः मञ्जूषायां दृश्यमानानि पदानि लिखतु
-([[Special:Captcha/help|more info]]) :',
+([[Special:Captcha/help|more info]]) :', # Fuzzy
 );
 
 /** Sakha (саха тыла)
  * @author HalanTul
  */
 $messages['sah'] = array(
-	'fancycaptcha-addurl' => 'Эн көннөрүүҥ тас ыйынньыктаах эбит. Спаамтан көмүскэнэр соруктаах дьайыыны оҥор, манна баар тыллары хатылаа ([[Special:Captcha/help|сиһилии…]]):',
-	'fancycaptcha-badlogin' => 'Киирии тылы аптамаатынан алдьатыыттан көмүскэнэр дьайыыны оҥороргор көрдөһөбүт, манна ойууламмыт буукубалары хатылаа ([[Special:Captcha/help|сиһилии]]):',
-	'fancycaptcha-createaccount' => 'Ааттары аптамаатынан бэлиэтиири суох оҥорор туһуттан бу дьайыыны оҥороргор көрдөһөбүт: ойууламмыт сурук бэлиэлэрин анал сиргэ киллэр  ([[Special:Captcha/help|сиһилии]]):',
+	'fancycaptcha-addurl' => 'Эн көннөрүүҥ тас ыйынньыктаах эбит. Спаамтан көмүскэнэр соруктаах дьайыыны оҥор, манна баар тыллары хатылаа ([[Special:Captcha/help|сиһилии…]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Киирии тылы аптамаатынан алдьатыыттан көмүскэнэр дьайыыны оҥороргор көрдөһөбүт, манна ойууламмыт буукубалары хатылаа ([[Special:Captcha/help|сиһилии]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Ааттары аптамаатынан бэлиэтиири суох оҥорор туһуттан бу дьайыыны оҥороргор көрдөһөбүт: ойууламмыт сурук бэлиэлэрин анал сиргэ киллэр  ([[Special:Captcha/help|сиһилии]]):', # Fuzzy
 	'fancycaptcha-create' => 'Эн көннөрүүҥ тас ыйынньыктардаах эбит. Спаамтан көмүскэнэр туһуттан манна баар тыллары хатылыыргар көрдөһөбүт ([[Special:Captcha/help|сиһилии…]]):',
 	'fancycaptcha-edit' => 'Эн көннөрүүҥ тас ыйынньыктардаах эбит. Спаамтан көмүскэнэр туһуттан манна баар тыллары хатылыыргар көрдөһөбүт ([[Special:Captcha/help|сиһилии…]]):',
-	'fancycaptcha-sendemail' => 'Аптамаат спаамтан көмүскэнэр дьайыыны оҥороргор көрдөһөбүт, манна ойууламмыт тыллары хатылаа ([[Special:Captcha/help|сиһилии]]):',
+	'fancycaptcha-sendemail' => 'Аптамаат спаамтан көмүскэнэр дьайыыны оҥороргор көрдөһөбүт, манна ойууламмыт тыллары хатылаа ([[Special:Captcha/help|сиһилии]]):', # Fuzzy
 );
 
 /** Sinhala (සිංහල)
@@ -1310,24 +1398,26 @@ $messages['sah'] = array(
  */
 $messages['si'] = array(
 	'fancycaptcha-addurl' => 'ඔබගේ සංස්කරණයෙහි නව බාහිර සබැඳියන් අඩංගුයි.
-ස්වයංක්‍රීය අයාචිත තැපෑලෙන් ආරක්ෂා වනු වස්, පහත පෙන්නුම් කෙරෙන වචන  කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|වැඩිමනත් තොරතුරු]]):',
-	'fancycaptcha-badlogin' => 'ස්වයංක්‍රීය මුරපද බිඳීම වලක්වනු වස්, පහත පෙන්නුම් කෙරෙන වචන  කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|වැඩිමනත් තොරතුරු]]):',
-	'fancycaptcha-createaccount' => 'ස්වයංක්‍රීයව ගිණුම් තැනීම වැලකුම‍ට සඳහා, පහත දැක්වෙන වචන  CAPTCHA කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|වැඩිමනත් තොරතුරු]]):',
+ස්වයංක්‍රීය අයාචිත තැපෑලෙන් ආරක්ෂා වනු වස්, පහත පෙන්නුම් කෙරෙන වචන  කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|වැඩිමනත් තොරතුරු]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'ස්වයංක්‍රීය මුරපද බිඳීම වලක්වනු වස්, පහත පෙන්නුම් කෙරෙන වචන  කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|වැඩිමනත් තොරතුරු]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'ස්වයංක්‍රීයව ගිණුම් තැනීම වැලකුම‍ට සඳහා, පහත දැක්වෙන වචන  CAPTCHA කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|වැඩිමනත් තොරතුරු]]):', # Fuzzy
 	'fancycaptcha-create' => 'පිටුව තනනු වස්, පහත පෙන්නුම් කෙරෙන වචන  කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|වැඩිමනත් තොරතුරු]]):',
 	'fancycaptcha-edit' => 'මෙම පිටුව සංස්කරණය කරනු වස්, පහත පෙන්නුම් කෙරෙන වචන  කොටුව තුල ඇතුලත් කරන්න ([[Special:Captcha/help|වැඩිමනත් තොරතුරු]]):',
-	'fancycaptcha-sendemail' => 'ස්වයංක්‍රීය ස්පෑම් කිරීම්වලින් ආරක්ෂා කිරීම සඳහා උදව් වීමට පහත කොටුවේ පෙන්වන වචන ඇතුළත් කරන්න ([[Special:Captcha/help|more info]]):',
+	'fancycaptcha-sendemail' => 'ස්වයංක්‍රීය ස්පෑම් කිරීම්වලින් ආරක්ෂා කිරීම සඳහා උදව් වීමට පහත කොටුවේ පෙන්වන වචන ඇතුළත් කරන්න ([[Special:Captcha/help|more info]]):', # Fuzzy
 );
 
 /** Slovak (slovenčina)
  * @author Helix84
+ * @author Teslaton
  */
 $messages['sk'] = array(
-	'fancycaptcha-addurl' => 'Vaša úprava obsahuje nové URL odkazy; kvôli ochrane proti automatizovanému spamu je potrebné napísať slová zobrazené na tomto obrázku: <br />([[Special:Captcha/help|Čo je toto?]])',
-	'fancycaptcha-badlogin' => 'Ako ochranu proti automatizovanému lámaniu hesiel, prosím zadajte slová z nasledujúceho obrázka do poľa pre odpoveď ([[Special:Captcha/help|viac informácií]]):',
-	'fancycaptcha-createaccount' => 'Kvôli ochrane proti automatizovanému spamu je potrebné napísať slová zobrazené na tomto obrázku, až potom bude vytvorený nový účet: <br />([[Special:Captcha/help|Čo je toto?]])',
+	'fancycaptcha-addurl' => 'Vaša úprava obsahuje nové URL odkazy; kvôli ochrane proti automatizovanému spamu je potrebné napísať slová zobrazené na tomto obrázku: <br />([[Special:Captcha/help|Čo je toto?]])', # Fuzzy
+	'fancycaptcha-badlogin' => 'Ako ochranu proti automatizovanému lámaniu hesiel, prosím zadajte slová z nasledujúceho obrázka do poľa pre odpoveď ([[Special:Captcha/help|viac informácií]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Kvôli ochrane proti automatizovanému spamu je potrebné napísať slová zobrazené na tomto obrázku, až potom bude vytvorený nový účet: <br />([[Special:Captcha/help|Čo je toto?]])', # Fuzzy
 	'fancycaptcha-create' => 'Vaša úprava obsahuje nové URL odkazy; kvôli ochrane proti automatizovanému spamu je potrebné napísať slová zobrazené na tomto obrázku: <br />([[Special:Captcha/help|Čo je toto?]])',
 	'fancycaptcha-edit' => 'Vaša úprava obsahuje nové URL odkazy; kvôli ochrane proti automatizovanému spamu je potrebné napísať slová zobrazené na tomto obrázku: <br />([[Special:Captcha/help|Čo je toto?]])',
-	'fancycaptcha-sendemail' => 'Ako ochranu proti automatizovanému spamu, prosím zadajte slová z nasledujúceho obrázka do poľa pre odpoveď ([[Special:Captcha/help|ďalšie informácie]]):',
+	'fancycaptcha-sendemail' => 'Ako ochranu proti automatizovanému spamu, prosím zadajte slová z nasledujúceho obrázka do poľa pre odpoveď ([[Special:Captcha/help|ďalšie informácie]]):', # Fuzzy
+	'fancycaptcha-reload-text' => 'Vygenerovať nový kód',
 );
 
 /** Slovenian (slovenščina)
@@ -1335,19 +1425,20 @@ $messages['sk'] = array(
  */
 $messages['sl'] = array(
 	'fancycaptcha-addurl' => 'Vaše urejanje vključuje nove zunanje povezave.
-Zaradi zaščite pred samodejnim smetjem prosimo, da vnesete spodnje besede v polje ([[Special:Captcha/help|več informacij]]):',
-	'fancycaptcha-badlogin' => 'Zaradi zaščite pred samodejnim ugotavljanjem gesel prosimo, da vnesete spodnje besede v polje ([[Special:Captcha/help|več informacij]]):',
-	'fancycaptcha-createaccount' => 'Zaradi zaščite pred samodejnim ustvarjanjem računov prosimo, da vnesete spodnje besede v polje ([[Special:Captcha/help|več informacij]]):',
+Zaradi zaščite wikija pred samodejnim smetjem vas prijazno naprošamo, da vnesete spodnje besede v polje ([[Special:Captcha/help|več informacij]]):',
+	'fancycaptcha-badlogin' => 'Zaradi zaščite wikija pred samodejnim ugotavljanjem gesel vas prijazno naprošamo, da vnesete spodnje besede v polje ([[Special:Captcha/help|več informacij]]):',
+	'fancycaptcha-createaccount' => 'Zaradi zaščite wikija pred samodejnim ustvarjanjem računov vas prijazno naprošamo, da vnesete spodnje besede v polje ([[Special:Captcha/help|več informacij]]):',
 	'fancycaptcha-create' => 'Če želite ustvariti stran, prosimo vnesite spodnje besede v polje ([[Special:Captcha/help|več informacij]]):',
 	'fancycaptcha-edit' => 'Če želite urediti stran, prosimo vnesite spodnje besede v polje ([[Special:Captcha/help|več informacij]]):',
-	'fancycaptcha-sendemail' => 'Zaradi zaščite pred samodejnim smetenjem prosimo, da vnesete spodnje besede v polje ([[Special:Captcha/help|več informacij]]):',
+	'fancycaptcha-sendemail' => 'Zaradi zaščite wikija pred samodejnim smetenjem vas prijazno naprošamo, da vnesete spodnje besede v polje ([[Special:Captcha/help|več informacij]]):',
+	'fancycaptcha-reload-text' => 'Osveži',
 );
 
 /** Somali (Soomaaliga)
  * @author Abshirdheere
  */
 $messages['so'] = array(
-	'fancycaptcha-createaccount' => 'Si aad u caawiso dhowritaanka in la iska samaysto Akoon,Fadlan meelaha banaan buux buuxi ee hoostaan ah ([[Special:Captcha/help|Macluumaad dheeraad ah]]):',
+	'fancycaptcha-createaccount' => 'Si aad u caawiso dhowritaanka in la iska samaysto Akoon,Fadlan meelaha banaan buux buuxi ee hoostaan ah ([[Special:Captcha/help|Macluumaad dheeraad ah]]):', # Fuzzy
 );
 
 /** Albanian (shqip)
@@ -1355,12 +1446,12 @@ $messages['so'] = array(
  * @author Olsi
  */
 $messages['sq'] = array(
-	'fancycaptcha-addurl' => 'Redaktimi juaj ka lidhje URL të reja dhe si mbrojtje kundër abuzimeve automatike duhet të shtypni çfarë shfaqet tek figura e mëposhtme:<br /> ([[Special:Captcha|Çfarë është kjo?]])',
-	'fancycaptcha-badlogin' => 'Për tu mbrojtur nga metoda automatike të gjetjes së fjalëkalimeve ju kërkojmë të vendosni fjalët e figurës në kuti ([[Special:Captcha/help|më shumë informacion]]):',
-	'fancycaptcha-createaccount' => 'Për të mbrojtur kundër hapjeve të llogarive në mënyrë automatike ju lutem shtypni çfarë shfaqet tek figura e mëposhtme ([[Special:Captcha|Çfarë është kjo?]]):',
+	'fancycaptcha-addurl' => 'Redaktimi juaj ka lidhje URL të reja dhe si mbrojtje kundër abuzimeve automatike duhet të shtypni çfarë shfaqet tek figura e mëposhtme:<br /> ([[Special:Captcha|Çfarë është kjo?]])', # Fuzzy
+	'fancycaptcha-badlogin' => 'Për tu mbrojtur nga metoda automatike të gjetjes së fjalëkalimeve ju kërkojmë të vendosni fjalët e figurës në kuti ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Për të mbrojtur kundër hapjeve të llogarive në mënyrë automatike ju lutem shtypni çfarë shfaqet tek figura e mëposhtme ([[Special:Captcha|Çfarë është kjo?]]):', # Fuzzy
 	'fancycaptcha-create' => 'Për të krijuar një faqe, ju lutem shtypni çfarë shfaqet tek figura e mëposhtme ([[Special:Captcha|Çfarë është kjo?]]):',
 	'fancycaptcha-edit' => 'Për të redaktuar këtë faqe ju lutem shtypni çfarë shfaqet tek figura e mëposhtme ([[Special:Captcha|Çfarë është kjo?]]):',
-	'fancycaptcha-sendemail' => "Për t'u mbrojtur nga metoda automatike e gjetjes së fjalëkalimeve ju kërkojmë të vendosni fjalët e figurës në kuti ([[Special:Captcha/help|më shumë informacion]]):",
+	'fancycaptcha-sendemail' => "Për t'u mbrojtur nga metoda automatike e gjetjes së fjalëkalimeve ju kërkojmë të vendosni fjalët e figurës në kuti ([[Special:Captcha/help|më shumë informacion]]):", # Fuzzy
 );
 
 /** Serbian (Cyrillic script) (српски (ћирилица)‎)
@@ -1372,12 +1463,12 @@ $messages['sq'] = array(
 $messages['sr-ec'] = array(
 	'fancycaptcha-desc' => 'Обогаћен стварач сликовног кода за потврду уређивања',
 	'fancycaptcha-addurl' => 'Ваша измена садржи нове спољашње везе.
-У циљу заштите од непожељних порука, унесите речи са слике у поље испод ([[Special:Captcha/help|више информација]]):',
-	'fancycaptcha-badlogin' => 'У циљу заштите од пробијања лозинки, унесите речи са слике у поље испод ([[Special:Captcha/help|више информација]]):',
-	'fancycaptcha-createaccount' => 'У циљу заштите од самоотварања налога, унесите речи са слике у поље испод ([[Special:Captcha/help|више информација]]):',
+У циљу заштите од непожељних порука, унесите речи са слике у поље испод ([[Special:Captcha/help|више информација]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'У циљу заштите од пробијања лозинки, унесите речи са слике у поље испод ([[Special:Captcha/help|више информација]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'У циљу заштите од самоотварања налога, унесите речи са слике у поље испод ([[Special:Captcha/help|више информација]]):', # Fuzzy
 	'fancycaptcha-create' => 'Да бисте направили страницу, унесите речи са слике у поље испод ([[Special:Captcha/help|више информација]]):',
 	'fancycaptcha-edit' => 'Да бисте уредили ову страницу, унесите речи са слике у поље испод ([[Special:Captcha/help|више информација]]):',
-	'fancycaptcha-sendemail' => 'У циљу заштите од непожељних порука, унесите речи са слике у поље испод ([[Special:Captcha/help|више информација]]):',
+	'fancycaptcha-sendemail' => 'У циљу заштите од непожељних порука, унесите речи са слике у поље испод ([[Special:Captcha/help|више информација]]):', # Fuzzy
 );
 
 /** Serbian (Latin script) (srpski (latinica)‎)
@@ -1386,12 +1477,12 @@ $messages['sr-ec'] = array(
  */
 $messages['sr-el'] = array(
 	'fancycaptcha-desc' => 'Obogaćen stvarač slikovnog koda za potvrdu uređivanja',
-	'fancycaptcha-addurl' => 'Tvoja izmena uključuje nove spoljne veze. U cilju zaštite od automatskog spama, unesi reči koje se nalaze ispod u kutiju ([[Special:Captcha/help|detaljnije]]):',
-	'fancycaptcha-badlogin' => 'U cilju sprečavanja automatskog otkrivanja lozinki, unesi reči koje se nalaze ispod u kutiju ([[Special:Captcha/help|detaljnije]]):',
-	'fancycaptcha-createaccount' => 'U cilju zaštite od automatskog spama, unesi reči odozdo u kutiju ([[Special:Captcha/help|detaljnije]]):',
+	'fancycaptcha-addurl' => 'Tvoja izmena uključuje nove spoljne veze. U cilju zaštite od automatskog spama, unesi reči koje se nalaze ispod u kutiju ([[Special:Captcha/help|detaljnije]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'U cilju sprečavanja automatskog otkrivanja lozinki, unesi reči koje se nalaze ispod u kutiju ([[Special:Captcha/help|detaljnije]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'U cilju zaštite od automatskog spama, unesi reči odozdo u kutiju ([[Special:Captcha/help|detaljnije]]):', # Fuzzy
 	'fancycaptcha-create' => 'Da bi se napravila stranica, potrebno je uneti reči koje se nalaze ispod kutije ([[Special:Captcha/help|detaljnije]]):',
 	'fancycaptcha-edit' => 'Za izmenu ove strane unesi reči koje se nalaze ispod kutije ([[Special:Captcha/help|detaljnije]]):',
-	'fancycaptcha-sendemail' => 'U cilju zaštite od automatskog spama, unesi reči odozdo u kutiju ([[Special:Captcha/help|detaljnije]]):',
+	'fancycaptcha-sendemail' => 'U cilju zaštite od automatskog spama, unesi reči odozdo u kutiju ([[Special:Captcha/help|detaljnije]]):', # Fuzzy
 );
 
 /** Seeltersk (Seeltersk)
@@ -1400,9 +1491,9 @@ $messages['sr-el'] = array(
 $messages['stq'] = array(
 	'fancycaptcha-addurl' => 'Dien Beoarbaidenge änthaalt näie externe Ferbiendengen.
 Tou Skuts foar automatisierde Spamminge reek dät foulgjende Woud in dät Fäild ien.
-Klik dan fonnäien ap „Siede spiekerje“ [[Special:Captcha/help|(Froagen of Probleme?)]].',
-	'fancycaptcha-badlogin' => 'Toun Skuts foar ne Kompromittierenge fon dien Benutserkonto reek dät foulgjende Woud in dät Fäild hierunner ien [[Special:Captcha/help|(Froagen of Probleme?)]]:',
-	'fancycaptcha-createaccount' => 'Toun Skuts foar automatisierde Anloage fon Benutserkonten reek dät foulgjende Woud in dät Fäild hierunner ien [[Special:Captcha/help|(Froagen of Probleme?)]].',
+Klik dan fonnäien ap „Siede spiekerje“ [[Special:Captcha/help|(Froagen of Probleme?)]].', # Fuzzy
+	'fancycaptcha-badlogin' => 'Toun Skuts foar ne Kompromittierenge fon dien Benutserkonto reek dät foulgjende Woud in dät Fäild hierunner ien [[Special:Captcha/help|(Froagen of Probleme?)]]:', # Fuzzy
+	'fancycaptcha-createaccount' => 'Toun Skuts foar automatisierde Anloage fon Benutserkonten reek dät foulgjende Woud in dät Fäild hierunner ien [[Special:Captcha/help|(Froagen of Probleme?)]].', # Fuzzy
 	'fancycaptcha-create' => 'Tou dät Moakjen fon ju Siede reek dät foulgjende Woud in dät Fäild hierunner ien
 [[Special:Captcha/help|(Froagen of Probleme?)]].',
 	'fancycaptcha-edit' => 'Tou Beoarbaidenge fon disse Siede reek dät foulgjende Woud in dät Fäild hierunner ien
@@ -1418,20 +1509,23 @@ $messages['su'] = array(
 
 /** Swedish (svenska)
  * @author Ainali
+ * @author Thurs
+ * @author WikiPhoenix
  */
 $messages['sv'] = array(
-	'fancycaptcha-addurl' => 'Din ändring lägger till nya externa länkar i texten. För att skydda wikin mot
-automatisk spam måste du skriva orden som visas härunder i rutan ([[Special:Captcha/help|mer information]]):',
-	'fancycaptcha-badlogin' => 'För att skydda wikin mot automatiserad lösenordknäckning måste du skriva
-orden som visas härunder i rutan ([[Special:Captcha/help|mer information]]):',
-	'fancycaptcha-createaccount' => 'För att skydda wikin mot automatiskt skapade användarkonton måste du
-skriva orden som visas härunder i rutan ([[Special:Captcha/help|mer information]]):',
+	'fancycaptcha-addurl' => 'Din ändring innehåller nya externa länkar.
+För att skydda wikin mot
+automatisk spam ber vi dig att skriva orden som visas i rutan nedan ([[Special:Captcha/help|mer information]]):',
+	'fancycaptcha-badlogin' => 'För att skydda wikin mot automatiserad lösenordsknäckning ber vi dig att skriva
+orden som visas i rutan nedan ([[Special:Captcha/help|mer information]]):',
+	'fancycaptcha-createaccount' => 'För att skydda wikin mot automatiskt skapade av användarkonton ber vi dig att
+skriva orden som visas i rutan nedan ([[Special:Captcha/help|mer information]]):',
 	'fancycaptcha-create' => 'För att skapa den här sidan måste du först skriva orden som visas härunder i rutan
 ([[Special:Captcha/help|mer information]]):',
 	'fancycaptcha-edit' => 'För att redigera den här sidan måste du först skriva orden som visas härunder i rutan
 ([[Special:Captcha/help|mer information]]):',
-	'fancycaptcha-sendemail' => 'För att skydda wikin mot automatiserad lösenordknäckning måste du skriva
-orden som visas härunder i rutan ([[Special:Captcha/help|mer information]]):',
+	'fancycaptcha-sendemail' => 'För att skydda wikin mot automatiserad spam ber vi dig att skriva orden som visas i rutan nedan ([[Special:Captcha/help|mer information]]):',
+	'fancycaptcha-reload-text' => 'Uppdatera',
 );
 
 /** Tamil (தமிழ்)
@@ -1439,8 +1533,8 @@ orden som visas härunder i rutan ([[Special:Captcha/help|mer information]]):',
  * @author மதனாஹரன்
  */
 $messages['ta'] = array(
-	'fancycaptcha-badlogin' => 'தானியங்கு கடவுச் சொல் உடைத்தலிலிருந்து பாதுகாக்க உதவுவதற்காகத் தயவு செய்து கீழேயுள்ள பெட்டியில் தோன்றும் சொற்களை உள்ளிடவும் ([[Special:Captcha/help|கூடிய தகவல்]]):',
-	'fancycaptcha-createaccount' => 'தானியங்கியாக கணக்கு உருவாக்குவதிலிருந்து பாதுகாக்க உதவ, தயவுசெய்து கீழே தெரியும் வார்த்தைகளை பெட்டியில் உள்ளிடவும் ([[Special:Captcha/help|மேலும் விவரங்களுக்கு]]):',
+	'fancycaptcha-badlogin' => 'தானியங்கு கடவுச் சொல் உடைத்தலிலிருந்து பாதுகாக்க உதவுவதற்காகத் தயவு செய்து கீழேயுள்ள பெட்டியில் தோன்றும் சொற்களை உள்ளிடவும் ([[Special:Captcha/help|கூடிய தகவல்]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'தானியங்கியாக கணக்கு உருவாக்குவதிலிருந்து பாதுகாக்க உதவ, தயவுசெய்து கீழே தெரியும் வார்த்தைகளை பெட்டியில் உள்ளிடவும் ([[Special:Captcha/help|மேலும் விவரங்களுக்கு]]):', # Fuzzy
 	'fancycaptcha-create' => 'பக்கத்தை உருவாக்குவதற்காக, தயவு செய்து கீழே பெட்டியில் தோன்றுகின்ற சொற்களை உள்ளிடுங்கள் ([[Special:Captcha/help|கூடிய தகவல்]]):',
 	'fancycaptcha-edit' => 'இப்பக்கத்தைத் தொகுப்பதற்குத் தயவு செய்து கீழேயுள்ள பெட்டியில் தோன்றும் சொற்களை உள்ளிடவும் ([[Special:Captcha/help|கூடிய தகவல்]]):',
 );
@@ -1450,10 +1544,10 @@ $messages['ta'] = array(
  */
 $messages['te'] = array(
 	'fancycaptcha-addurl' => 'మీ దిద్దుబాటులో కొత్త బయటి లింకులున్నాయి. బాట్లద్వారా చేసే స్పాము నుండి రక్షణను ఏర్పరచేందుకు గాను,
-కింద కనిపించే బొమ్మలోని అక్షరాలను పెట్టెలో రాయండి ([[Special:Captcha/help|మరింత సమాచారం]]):',
-	'fancycaptcha-badlogin' => 'సంకేత పదాలను దొంగిలించే ఆటోమాటిక్ ప్రోగ్రాముల నుండి రక్షించేందుకు గాను, కింద కనిపించే బొమ్మలోని అక్షరాలను పెట్టెలో రాయండి ([[Special:Captcha/help|మరింత సమాచారం]]):',
+కింద కనిపించే బొమ్మలోని అక్షరాలను పెట్టెలో రాయండి ([[Special:Captcha/help|మరింత సమాచారం]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'సంకేత పదాలను దొంగిలించే ఆటోమాటిక్ ప్రోగ్రాముల నుండి రక్షించేందుకు గాను, కింద కనిపించే బొమ్మలోని అక్షరాలను పెట్టెలో రాయండి ([[Special:Captcha/help|మరింత సమాచారం]]):', # Fuzzy
 	'fancycaptcha-createaccount' => 'ఆటోమాటిగ్గా ఖాతాలను సృష్టించడాన్ని నివారించేందుకు, కింద కనిపించే పదాలను
-ఈ పెట్టెలో రాయండి ([[Special:Captcha/help|మరింత సహాయం]]):',
+ఈ పెట్టెలో రాయండి ([[Special:Captcha/help|మరింత సహాయం]]):', # Fuzzy
 	'fancycaptcha-create' => 'కొత్త పేజీ సృష్టించేందుకు గాను, కింద కనిపించే బొమ్మలోని అక్షరాలను పెట్టెలో రాయండి
 ([[Special:Captcha/help|మరింత సమాచారం]]):',
 	'fancycaptcha-edit' => 'ఈ పేజీలో దిద్దుబాటు చేసేందుకు, కింద కనిపించే బొమ్మలోని అక్షరాలను పెట్టెలో రాయండి
@@ -1464,9 +1558,9 @@ $messages['te'] = array(
  * @author Ibrahim
  */
 $messages['tg-cyrl'] = array(
-	'fancycaptcha-addurl' => 'Вироиши шумо пайвандҳои ҷадиди хориҷиро дар бар мегирад. Барои кӯмак ба пешгири аз ҳаразнигори худкор, лутфан вожаеро ки дар тасвир мебинед, ворид кунед ([[Special:Captcha/help|иттилооти бештар]]):',
-	'fancycaptcha-badlogin' => 'Барои кӯмак ба пешгири аз шикастани худкори калимаҳои убур, вожаеро ки дар тасвир мебинед, ворид кунед  ([[Special:Captcha/help|иттилооти бештар]]):',
-	'fancycaptcha-createaccount' => 'Барои кӯмак аз эҷоди худкори ҳисоби корбарӣ, вожаеро ки дар тасвир мебинед, ворид кунед ([[Special:Captcha/help|иттилооти бештар]]):',
+	'fancycaptcha-addurl' => 'Вироиши шумо пайвандҳои ҷадиди хориҷиро дар бар мегирад. Барои кӯмак ба пешгири аз ҳаразнигори худкор, лутфан вожаеро ки дар тасвир мебинед, ворид кунед ([[Special:Captcha/help|иттилооти бештар]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Барои кӯмак ба пешгири аз шикастани худкори калимаҳои убур, вожаеро ки дар тасвир мебинед, ворид кунед  ([[Special:Captcha/help|иттилооти бештар]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Барои кӯмак аз эҷоди худкори ҳисоби корбарӣ, вожаеро ки дар тасвир мебинед, ворид кунед ([[Special:Captcha/help|иттилооти бештар]]):', # Fuzzy
 	'fancycaptcha-create' => 'Барои эҷоди саҳифа, вожаеро ки дар тасвир мебинед, ворид кунед  ([[Special:Captcha/help|иттилооти бештар]]):',
 	'fancycaptcha-edit' => 'Барои вироиши ин саҳифа, вожаеро ки дар тасвир мебинед, ворид кунед ([[Special:Captcha/help|иттилооти бештар]]):',
 );
@@ -1475,9 +1569,9 @@ $messages['tg-cyrl'] = array(
  * @author Liangent
  */
 $messages['tg-latn'] = array(
-	'fancycaptcha-addurl' => 'Viroişi şumo pajvandhoi çadidi xoriçiro dar bar megirad. Baroi kūmak ba peşgiri az haraznigori xudkor, lutfan voƶaero ki dar tasvir mebined, vorid kuned ([[Special:Captcha/help|ittilooti beştar]]):',
-	'fancycaptcha-badlogin' => 'Baroi kūmak ba peşgiri az şikastani xudkori kalimahoi ubur, voƶaero ki dar tasvir mebined, vorid kuned  ([[Special:Captcha/help|ittilooti beştar]]):',
-	'fancycaptcha-createaccount' => 'Baroi kūmak az eçodi xudkori hisobi korbarī, voƶaero ki dar tasvir mebined, vorid kuned ([[Special:Captcha/help|ittilooti beştar]]):',
+	'fancycaptcha-addurl' => 'Viroişi şumo pajvandhoi çadidi xoriçiro dar bar megirad. Baroi kūmak ba peşgiri az haraznigori xudkor, lutfan voƶaero ki dar tasvir mebined, vorid kuned ([[Special:Captcha/help|ittilooti beştar]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Baroi kūmak ba peşgiri az şikastani xudkori kalimahoi ubur, voƶaero ki dar tasvir mebined, vorid kuned  ([[Special:Captcha/help|ittilooti beştar]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Baroi kūmak az eçodi xudkori hisobi korbarī, voƶaero ki dar tasvir mebined, vorid kuned ([[Special:Captcha/help|ittilooti beştar]]):', # Fuzzy
 	'fancycaptcha-create' => 'Baroi eçodi sahifa, voƶaero ki dar tasvir mebined, vorid kuned  ([[Special:Captcha/help|ittilooti beştar]]):',
 	'fancycaptcha-edit' => 'Baroi viroişi in sahifa, voƶaero ki dar tasvir mebined, vorid kuned ([[Special:Captcha/help|ittilooti beştar]]):',
 );
@@ -1486,9 +1580,9 @@ $messages['tg-latn'] = array(
  * @author Harley Hartwell
  */
 $messages['th'] = array(
-	'fancycaptcha-addurl' => 'การแก้ไขของคุณมีการเพิ่มลิงก์ไปสู่เว็บไซต์อื่น เพื่อช่วยป้องกันการสแปมอัตโนมัติ กรุณาพิมพ์ข้อความที่คุณเห็นด้านล่างลงในกล่องที่กำหนดให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])',
-	'fancycaptcha-badlogin' => 'เพื่อป้องกันการแคร็กรหัสผ่านจากกระบวนการอัตโนมัติ กรุณาพิมพ์ข้อความที่คุณเห็นด้านล่างลงในกล่องที่กำหนดให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])',
-	'fancycaptcha-createaccount' => 'เพื่อป้องกันการสร้างบัญชีผู้ใช้ด้วยกระบวนการอัตโนมัติ กรุณาพิมพ์ข้อความที่คุณเห็นด้านล่างลงในกล่องที่กำหนดให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])',
+	'fancycaptcha-addurl' => 'การแก้ไขของคุณมีการเพิ่มลิงก์ไปสู่เว็บไซต์อื่น เพื่อช่วยป้องกันการสแปมอัตโนมัติ กรุณาพิมพ์ข้อความที่คุณเห็นด้านล่างลงในกล่องที่กำหนดให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])', # Fuzzy
+	'fancycaptcha-badlogin' => 'เพื่อป้องกันการแคร็กรหัสผ่านจากกระบวนการอัตโนมัติ กรุณาพิมพ์ข้อความที่คุณเห็นด้านล่างลงในกล่องที่กำหนดให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])', # Fuzzy
+	'fancycaptcha-createaccount' => 'เพื่อป้องกันการสร้างบัญชีผู้ใช้ด้วยกระบวนการอัตโนมัติ กรุณาพิมพ์ข้อความที่คุณเห็นด้านล่างลงในกล่องที่กำหนดให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])', # Fuzzy
 	'fancycaptcha-create' => 'เพื่อสร้างหน้านี้ กรุณาพิมพ์ข้อความที่คุณเห็นด้านล่างลงในกล่องที่กำหนดให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])',
 	'fancycaptcha-edit' => 'เพื่อแก้ไขหน้านี้ กรุณาพิมพ์ข้อความที่คุณเห็นด้านล่างลงในกล่องที่กำหนดให้ ([[Special:Captcha/help|ข้อมูลเพิ่มเติม]])',
 );
@@ -1497,8 +1591,8 @@ $messages['th'] = array(
  * @author Hanberke
  */
 $messages['tk'] = array(
-	'fancycaptcha-badlogin' => 'Awtomatik parol döwülmeginden goranmak üçin, aşakdaky sözleri gutunyň içine ýazyň ([[Special:Captcha/help|jikme-jik]]):',
-	'fancycaptcha-createaccount' => 'Hasaby awtomatik parol döwülmeginden goramak üçin, aşakdaky sözleri gutunyň içine ýazyň ([[Special:Captcha/help|jikme-jik]]):',
+	'fancycaptcha-badlogin' => 'Awtomatik parol döwülmeginden goranmak üçin, aşakdaky sözleri gutunyň içine ýazyň ([[Special:Captcha/help|jikme-jik]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Hasaby awtomatik parol döwülmeginden goramak üçin, aşakdaky sözleri gutunyň içine ýazyň ([[Special:Captcha/help|jikme-jik]]):', # Fuzzy
 	'fancycaptcha-create' => 'Sahypa döretmek üçin, aşakdaky sözleri gutunyň içine ýazyň ([[Special:Captcha/help|jikme-jik]]):',
 	'fancycaptcha-edit' => 'Bu sahypany redaktirlemek üçin, aşakdaky sözleri gutunyň içine ýazyň ([[Special:Captcha/help|jikme-jik]]):',
 );
@@ -1509,12 +1603,12 @@ $messages['tk'] = array(
 $messages['tl'] = array(
 	'fancycaptcha-desc' => 'Kaakit-akit na panlikha ng CAPTCHA para sa Pagtiyak ng Pagbago',
 	'fancycaptcha-addurl' => "Kabilang sa ginawa mong pagbabago ang bagong panlabas na mga kawing.
-Upang makatulong sa pagsasanggalang laban sa kusang pinapadalang mga \"manlulusob\" (''spam''), pakilagay lamang ang mga salitang lumitaw sa ibaba papasok sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):",
-	'fancycaptcha-badlogin' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang paglutas ng hudyat, pakilagay lamang ang mga salitang lumitaw sa ibaba patungo sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):',
-	'fancycaptcha-createaccount' => 'Upang makatulong sa pagsasanggalang laban sa kusang paglikha ng kuwenta/akawnt, pakilagay lamang ang mga salitang lumitaw sa ibaba patungo sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):',
+Upang makatulong sa pagsasanggalang laban sa kusang pinapadalang mga \"manlulusob\" (''spam''), pakilagay lamang ang mga salitang lumitaw sa ibaba papasok sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):", # Fuzzy
+	'fancycaptcha-badlogin' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang paglutas ng hudyat, pakilagay lamang ang mga salitang lumitaw sa ibaba patungo sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Upang makatulong sa pagsasanggalang laban sa kusang paglikha ng kuwenta/akawnt, pakilagay lamang ang mga salitang lumitaw sa ibaba patungo sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):', # Fuzzy
 	'fancycaptcha-create' => 'Upang malikha ang pahina, pakilagay lamang ang mga salitang lumitaw sa ibaba patungo sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):',
 	'fancycaptcha-edit' => 'Upang mabago ang pahinang ito, pakilagay lamang ang mga salitang lumitaw sa ibaba patungo sa loob ng kahon ([[Special:Captcha/help|mas marami pang kabatiran]]):',
-	'fancycaptcha-sendemail' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang pagsalakay ng ispam, pakilagay lamang ang mga salitang lumilitaw sa ibaba sa loob ng kahong ([[Special:Captcha/help|marami pang kabatiran]]):',
+	'fancycaptcha-sendemail' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang pagsalakay ng ispam, pakilagay lamang ang mga salitang lumilitaw sa ibaba sa loob ng kahong ([[Special:Captcha/help|marami pang kabatiran]]):', # Fuzzy
 );
 
 /** Turkish (Türkçe)
@@ -1524,16 +1618,18 @@ Upang makatulong sa pagsasanggalang laban sa kusang pinapadalang mga \"manluluso
  */
 $messages['tr'] = array(
 	'fancycaptcha-addurl' => 'Değişikliğiniz yeni dış bağlantılar içeriyor.
-Otomatik spamdan korunmak için, lütfen aşağıdaki sözcükleri kutunun içine yazın ([[Special:Captcha/help|ayrıntılı bilgiler]]):',
-	'fancycaptcha-badlogin' => 'Otomatik parola kırma yöntemine karşı korunmak için lütfen aşağıdaki sözcükleri kutunun içine yazınız ([[Special:Captcha/help|ayrıntılı bilgi]]):',
-	'fancycaptcha-createaccount' => 'Otomatik hesap oluşturmaya karşı korumaya yardım etmek için, lütfen aşağıdaki kutuda görünen kelimeleri girin ([[Special:Captcha/help|daha fazla bilgi]]):',
+Otomatik spamdan korunmak için, lütfen aşağıdaki sözcükleri kutunun içine yazın ([[Special:Captcha/help|ayrıntılı bilgiler]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Otomatik parola kırma yöntemine karşı korunmak için lütfen aşağıdaki sözcükleri kutunun içine yazınız ([[Special:Captcha/help|ayrıntılı bilgi]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Otomatik hesap oluşturmaya karşı korumaya yardım etmek için, lütfen aşağıdaki kutuda görünen kelimeleri girin ([[Special:Captcha/help|daha fazla bilgi]]):', # Fuzzy
 	'fancycaptcha-create' => 'Sayfayı oluşturmak için, lütfen aşağıdaki kutuda görünen kelimeleri girin ([[Special:Captcha/help|daha fazla bilgi]]):',
 	'fancycaptcha-edit' => 'Bu sayfayı değiştirmek için, lütfen aşağıdaki kutuda görünen kelimeleri girin ([[Special:Captcha/help|daha fazla bilgi]]):',
-	'fancycaptcha-sendemail' => 'Otomatik spamlerden korunmaya yardımcı olmak için, lütfen aşağıda görünen sözcükleri kutuya yazın ([[Special:Captcha/help|daha fazla bilgi]]):',
+	'fancycaptcha-sendemail' => 'Otomatik spamlerden korunmaya yardımcı olmak için, lütfen aşağıda görünen sözcükleri kutuya yazın ([[Special:Captcha/help|daha fazla bilgi]]):', # Fuzzy
+	'fancycaptcha-reload-text' => 'Yenile',
 );
 
 /** Ukrainian (українська)
  * @author Ahonc
+ * @author Andriykopanytsia
  * @author Base
  * @author Dim Grits
  * @author Ytsukeng Fyvaprol
@@ -1541,12 +1637,12 @@ Otomatik spamdan korunmak için, lütfen aşağıdaki sözcükleri kutunun için
 $messages['uk'] = array(
 	'fancycaptcha-desc' => 'Чудернацький CAPTCHA-генератор для підтвердження редагування',
 	'fancycaptcha-addurl' => 'Ваше редагування містить нові зовнішні посилання.
-Із метою захисту від спаму, будь ласка, введіть у текстове поле слова, зображені на картинці ([[Special:Captcha/help|докладніше]]):',
-	'fancycaptcha-badlogin' => 'Із метою захисту від автоматичного злому пароля, будь ласка, введіть у текстове поле слова, зображені на картинці ([[Special:Captcha/help|докладніше]]):',
-	'fancycaptcha-createaccount' => 'Із метою захисту від автоматичного створення облікових записів, будь ласка, введіть у текстове поле слова, зображені на картинці ([[Special:Captcha/help|докладніше]]):',
+Із метою захисту вікі від спаму просимо вас ввести у текстове поле слова, зображені на картинці ([[Special:Captcha/help|докладніше]]):',
+	'fancycaptcha-badlogin' => 'Із метою захисту вікі від автоматичного злому пароля, просимо вас ввести у текстове поле слова, зображені на картинці ([[Special:Captcha/help|докладніше]]):',
+	'fancycaptcha-createaccount' => 'Із метою захисту вікі від автоматичного створення облікових записів, просимо вас ввести у текстове поле слова, зображені на картинці ([[Special:Captcha/help|докладніше]]):',
 	'fancycaptcha-create' => 'Щоб створити сторінку, будь ласка, введіть у текстове поле слова, зображені на картинці: ([[Special:Captcha/help|докладніше]]):',
 	'fancycaptcha-edit' => 'Щоб редагувати цю сторінку, будь ласка, введіть у текстове поле слова, зображені на картинці: ([[Special:Captcha/help|докладніше]]):',
-	'fancycaptcha-sendemail' => 'Для захисту від автоматичного спаму, будь ласка, введіть слова, які показані нижче в полі ([[Special:Captcha/help|more info]]):',
+	'fancycaptcha-sendemail' => 'Для захисту вікі від автоматичного спаму просимо вас ввести слова, які показані нижче в полі ([[Special:Captcha/help|more info]]):',
 	'fancycaptcha-reload-text' => 'Оновити',
 );
 
@@ -1555,12 +1651,12 @@ $messages['uk'] = array(
  */
 $messages['vec'] = array(
 	'fancycaptcha-addurl' => 'La to modifica la include dei novi colegamenti esterni.
-Par jutarne a conbàtar el spam, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
-	'fancycaptcha-badlogin' => 'Par precauzion contro i tentativi de forzatura automatica de le password, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
-	'fancycaptcha-createaccount' => 'Par jutarne a inpedir la creazion automatica dei account, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
+Par jutarne a conbàtar el spam, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Par precauzion contro i tentativi de forzatura automatica de le password, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Par jutarne a inpedir la creazion automatica dei account, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):', # Fuzzy
 	'fancycaptcha-create' => 'Par crear la pagina, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
 	'fancycaptcha-edit' => 'Par modificar la pagina, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
-	'fancycaptcha-sendemail' => 'Par precauzion contro i tentativi de forzatura automatica de le password, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):',
+	'fancycaptcha-sendemail' => 'Par precauzion contro i tentativi de forzatura automatica de le password, par piaser inserissi ne la casela le parole che vien fora qua soto ([[Special:Captcha/help|magiori informazion]]):', # Fuzzy
 	'fancycaptcha-reload-text' => 'Ajorna',
 );
 
@@ -1571,12 +1667,12 @@ Par jutarne a conbàtar el spam, par piaser inserissi ne la casela le parole che
  */
 $messages['vi'] = array(
 	'fancycaptcha-desc' => 'Trình sản xuất hình CAPTCHA đặc biệt cho ConfirmEdit',
-	'fancycaptcha-addurl' => 'Sửa đổi của bạn có chứa các liên kết ngoài. Để giúp tránh spam tự động, xin hãy nhập những từ xuất hiện ở dưới vào ô ([[Special:Captcha/help|thông tin thêm]]):',
-	'fancycaptcha-badlogin' => 'Để giúp tránh bẻ mật khẩu tự động, xin hãy nhập những từ xuất hiện ở dưới vào ô ([[Special:Captcha/help|thông tin thêm]]):',
-	'fancycaptcha-createaccount' => 'Để giúp tránh tạo tài khoản tự động, xin hãy nhập những chữ xuất hiện ở dưới vào ô ([[Special:Captcha/help|thông tin thêm]]):',
+	'fancycaptcha-addurl' => 'Sửa đổi của bạn có chứa các liên kết ngoài. Để giúp chúng tôi chống lại spam tự động, xin vui lòng nhập những từ xuất hiện ở dưới vào ô ([[Special:Captcha/help|thông tin thêm]]):',
+	'fancycaptcha-badlogin' => 'Để giúp chúng tôi tránh bẻ mật khẩu tự động, xin vui lòng nhập những từ xuất hiện ở dưới vào ô ([[Special:Captcha/help|thông tin thêm]]):',
+	'fancycaptcha-createaccount' => 'Để giúp chúng tôi tránh mở tài khoản tự động, xin vui lòng nhập những chữ xuất hiện ở dưới vào ô ([[Special:Captcha/help|thông tin thêm]]):',
 	'fancycaptcha-create' => 'Để tạo trang, xin hãy nhập những chữ xuất hiện ở dưới vào ô ([[Special:Captcha/help|thông tin thêm]]):',
 	'fancycaptcha-edit' => 'Để sửa trang này, xin hãy nhập những từ xuất hiện ở dưới vào ô ([[Special:Captcha/help|thông tin thêm]]):',
-	'fancycaptcha-sendemail' => 'Để giúp chúng tôi chống lại spam tự động, xin hãy nhập những từ xuất hiện ở dưới vào ô ([[Special:Captcha/help|thông tin thêm]]):',
+	'fancycaptcha-sendemail' => 'Để giúp chúng tôi chống lại spam tự động, xin vui lòng nhập những từ xuất hiện ở dưới vào ô ([[Special:Captcha/help|thông tin thêm]]):',
 	'fancycaptcha-reload-text' => 'Làm tươi',
 );
 
@@ -1584,9 +1680,9 @@ $messages['vi'] = array(
  * @author Smeira
  */
 $messages['vo'] = array(
-	'fancycaptcha-addurl' => 'Redakam olik keninükon yümis plödik nulik. Ad jelön siti ta peneds itjäfidik, penolös vödis sököl in bokil ([[Special:Captcha/help|nüns pluik]]):',
-	'fancycaptcha-badlogin' => 'Ad jelön siti ta daget itjäfidik letavödas, penolös, begö! vödis dono pejonölis in bokil ([[Special:Captcha/help|nüns pluik]]):',
-	'fancycaptcha-createaccount' => 'Ad jelön siti ta kalijafam itjäfidik, penolös, begö! vödis dono pejonölis in bokil ([[Special:Captcha/help|nüns pluik]]):',
+	'fancycaptcha-addurl' => 'Redakam olik keninükon yümis plödik nulik. Ad jelön siti ta peneds itjäfidik, penolös vödis sököl in bokil ([[Special:Captcha/help|nüns pluik]]):', # Fuzzy
+	'fancycaptcha-badlogin' => 'Ad jelön siti ta daget itjäfidik letavödas, penolös, begö! vödis dono pejonölis in bokil ([[Special:Captcha/help|nüns pluik]]):', # Fuzzy
+	'fancycaptcha-createaccount' => 'Ad jelön siti ta kalijafam itjäfidik, penolös, begö! vödis dono pejonölis in bokil ([[Special:Captcha/help|nüns pluik]]):', # Fuzzy
 	'fancycaptcha-create' => 'Ad jafön padi at, penolös, begö! vödis dono pejonöls in bokil ([[Special:Captcha/help|nüns pluik]]):',
 	'fancycaptcha-edit' => 'Ad redakön padi at, penolös, begö! vödis dono pejonölis ini bokil ([[Special:Captcha/help|nüns pluik]]):',
 );
@@ -1596,7 +1692,7 @@ $messages['vo'] = array(
  */
 $messages['vro'] = array(
 	'fancycaptcha-badlogin' => 'Salasõna automaatsõ vällänuhkmisõ vasta kirodaq pildi päält sõnaq alanolõvahe kasti
-([[Special:Captcha/help|Abiteedüs]]):',
+([[Special:Captcha/help|Abiteedüs]]):', # Fuzzy
 );
 
 /** Walloon (walon)
@@ -1604,12 +1700,12 @@ $messages['vro'] = array(
  */
 $messages['wa'] = array(
 	'fancycaptcha-addurl' => "Dins vos candjmints i gn a des dfoûtrinnès hårdêyes (URL).
-Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aparexhèt chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
-	'fancycaptcha-badlogin' => "Po s' mete a houte des des robots ki sayèt d' adviner les screts, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aperexhèt chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
-	'fancycaptcha-createaccount' => "Po s' mete a houte des des robots k' ahivèt des contes otomaticmint, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aparexhèt chal pa dzi ([[Special:Captcha/help|pus di racsegnes]]):",
+Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aparexhèt chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
+	'fancycaptcha-badlogin' => "Po s' mete a houte des des robots ki sayèt d' adviner les screts, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aperexhèt chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
+	'fancycaptcha-createaccount' => "Po s' mete a houte des des robots k' ahivèt des contes otomaticmint, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aparexhèt chal pa dzi ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
 	'fancycaptcha-create' => "Por vos poleur ahiver l' pådje, vos dvoz taper les mots k' aparexhèt e l' boesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
 	'fancycaptcha-edit' => "Po candjî cisse pådje ci, vos dvoz taper les mots k' aparexhèt e l' boesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
-	'fancycaptcha-sendemail' => "Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aparexhèt chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
+	'fancycaptcha-sendemail' => "Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula tapez les mots k' aparexhèt chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
 );
 
 /** Yiddish (ייִדיש)
@@ -1625,15 +1721,15 @@ $messages['yi'] = array(
  */
 $messages['yo'] = array(
 	'fancycaptcha-addurl' => 'Àwọn àtúnṣe yín ní àwọn ìjápọ̀ òde nínú.
-Láti ṣèránwọ́ láti kojú spam aṣefúnrararẹ̀, ẹ jọ̀wọ́ ẹ fi àwọn ọ̀rọ̀ tí wọ́n hàn nísàlẹ̀ sínú ààyè ([[Special:Captcha/help|ẹ̀kúnrẹ́rẹ́]]):',
+Láti ṣèránwọ́ láti kojú spam aṣefúnrararẹ̀, ẹ jọ̀wọ́ ẹ fi àwọn ọ̀rọ̀ tí wọ́n hàn nísàlẹ̀ sínú ààyè ([[Special:Captcha/help|ẹ̀kúnrẹ́rẹ́]]):', # Fuzzy
 );
 
 /** Cantonese (粵語)
  */
 $messages['yue'] = array(
-	'fancycaptcha-addurl' => '你嘅編輯包括咗新嘅外部連結。為咗防止自動化嘅濫貼，請響下面個盒度輸入下面嘅文字 ([[Special:Captcha/help|更多資訊]]):',
-	'fancycaptcha-badlogin' => '為咗防止不當程式破解密碼，請響下面個盒度輸入下面嘅文字 ([[Special:Captcha/help|更多資訊]]):',
-	'fancycaptcha-createaccount' => '為咗防止自動化開新戶口，請響下面個盒度輸入下面嘅文字 ([[Special:Captcha/help|更多資訊]]):',
+	'fancycaptcha-addurl' => '你嘅編輯包括咗新嘅外部連結。為咗防止自動化嘅濫貼，請響下面個盒度輸入下面嘅文字 ([[Special:Captcha/help|更多資訊]]):', # Fuzzy
+	'fancycaptcha-badlogin' => '為咗防止不當程式破解密碼，請響下面個盒度輸入下面嘅文字 ([[Special:Captcha/help|更多資訊]]):', # Fuzzy
+	'fancycaptcha-createaccount' => '為咗防止自動化開新戶口，請響下面個盒度輸入下面嘅文字 ([[Special:Captcha/help|更多資訊]]):', # Fuzzy
 	'fancycaptcha-create' => '要開一個新版，請響下面個盒度輸入下面嘅文字 ([[Special:Captcha/help|更多資訊]]):',
 	'fancycaptcha-edit' => '要編輯呢一版，請響下面個盒度輸入下面嘅文字 ([[Special:Captcha/help|更多資訊]]):',
 );
@@ -1654,13 +1750,17 @@ $messages['zh-hans'] = array(
 
 /** Traditional Chinese (中文（繁體）‎)
  * @author Horacewai2
+ * @author Justincheng12345
+ * @author Liuxinyu970226
  * @author Waihorace
  */
 $messages['zh-hant'] = array(
-	'fancycaptcha-addurl' => '您的編輯內容中含有本網站以外的連結。為防止不當程式大量破壞，請輸入以下的文字（[[Special:Captcha/help|相關資訊]]）：',
-	'fancycaptcha-badlogin' => '為防止不當程式破解密碼，請輸入以下的文字（[[Special:Captcha/help|相關資訊]]）：',
-	'fancycaptcha-createaccount' => '為防止不當程式大量建立帳戶，請輸入以下的文字（[[Special:Captcha/help|相關資訊]]）：',
+	'fancycaptcha-addurl' => '您的編輯內容中含有本網站以外的連結。
+為防止不當程式大量破壞，請輸入以下的文字（[[Special:Captcha/help|相關資訊]]）：',
+	'fancycaptcha-badlogin' => '為幫助wiki防範可自動破解密碼之不當程式，我們請您鍵入下面資訊框中的單詞（[[Special:Captcha/help|相關資訊]]）：',
+	'fancycaptcha-createaccount' => '為幫助wiki防範可自動創建賬戶之不當程式，我們請您鍵入下面資訊框中的單詞（[[Special:Captcha/help|相關資訊]]）：',
 	'fancycaptcha-create' => '為防止不當程式大量建立頁面，請輸入以下的文字（[[Special:Captcha/help|相關資訊]]）：',
 	'fancycaptcha-edit' => '如您想要編輯此頁面，請輸入以下的文字（[[Special:Captcha/help|相關資訊]]）：',
-	'fancycaptcha-sendemail' => '為防止不當程式進行破壞，請輸入以下的文字（[[Special:Captcha/help|相關資訊]]）：',
+	'fancycaptcha-sendemail' => '為幫助wiki防範垃圾電郵，我們請您鍵入下面資訊框中的單詞（[[Special:Captcha/help|相關資訊]]）：',
+	'fancycaptcha-reload-text' => '重新整理',
 );
diff --git a/extensions/ConfirmEdit/FancyCaptcha.php b/extensions/ConfirmEdit/FancyCaptcha.php
index 46002e22..cbabb4a0 100644
--- a/extensions/ConfirmEdit/FancyCaptcha.php
+++ b/extensions/ConfirmEdit/FancyCaptcha.php
@@ -62,6 +62,7 @@ $wgAutoloadClasses['FancyCaptcha'] = $dir . '/FancyCaptcha.class.php';
 $wgResourceModules['ext.confirmEdit.fancyCaptcha.styles'] = array(
 	'localBasePath' => $dir . '/resources',
 	'remoteExtPath' => 'ConfirmEdit/resources',
+	'targets' => array( 'mobile', 'desktop' ),
 	'styles' => 'ext.confirmEdit.fancyCaptcha.css',
 );
 
@@ -72,5 +73,15 @@ $wgResourceModules['ext.confirmEdit.fancyCaptcha'] = array(
 	'dependencies' => 'mediawiki.api',
 );
 
+// FIXME: remove, add mobile target to ext.confirmEdit.fancyCaptcha and update
+// MobileFrontend accordingly when bug 57629 is resolved
+$wgResourceModules['ext.confirmEdit.fancyCaptchaMobile'] = array(
+	'localBasePath' => $dir . '/resources',
+	'remoteExtPath' => 'ConfirmEdit/resources',
+	'scripts' => 'ext.confirmEdit.fancyCaptcha.js',
+	'targets' => array( 'mobile', 'desktop' ),
+	'dependencies' => 'mobile.startup',
+);
+
 $wgAutoloadClasses['ApiFancyCaptchaReload'] = $dir . '/ApiFancyCaptchaReload.php';
 $wgAPIModules['fancycaptchareload'] = 'ApiFancyCaptchaReload';
diff --git a/extensions/ConfirmEdit/MathCaptcha.class.php b/extensions/ConfirmEdit/MathCaptcha.class.php
index fdb6d1ff..ac220baa 100644
--- a/extensions/ConfirmEdit/MathCaptcha.class.php
+++ b/extensions/ConfirmEdit/MathCaptcha.class.php
@@ -39,7 +39,7 @@ class MathCaptcha extends SimpleCaptcha {
 
 	/** Fetch the math */
 	function fetchMath( $sum ) {
-		if ( MWInit::classExists( 'MathRenderer' ) ) {
+		if ( class_exists( 'MathRenderer' ) ) {
 			$math = MathRenderer::getRenderer( $sum, array(), MW_MATH_PNG );
 		} else {
 			throw new MWException( 'MathCaptcha requires the Math extension for MediaWiki versions 1.18 and above.' );
diff --git a/extensions/ConfirmEdit/QuestyCaptcha.i18n.php b/extensions/ConfirmEdit/QuestyCaptcha.i18n.php
index c83ed9af..949449fd 100644
--- a/extensions/ConfirmEdit/QuestyCaptcha.i18n.php
+++ b/extensions/ConfirmEdit/QuestyCaptcha.i18n.php
@@ -13,19 +13,19 @@ $messages = array();
 $messages['en'] = array(
 	'questycaptcha-desc' => 'Questy CAPTCHA generator for Confirm Edit',
 	'questycaptcha-addurl' => 'Your edit includes new external links.
-To help protect against automated spam, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
-	'questycaptcha-badlogin' => 'To help protect against automated password cracking, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
-	'questycaptcha-createaccount' => 'To help protect against automated account creation, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
+To protect the wiki against automated edit spam, we kindly ask you to answer the question that appears below ([[Special:Captcha/help|more info]]):',
+	'questycaptcha-badlogin' => 'To protect the wiki against automated password cracking, we kindly ask you to answer the question that appears below ([[Special:Captcha/help|more info]]):',
+	'questycaptcha-createaccount' => 'To protect the wiki against automated account creation, we kindly ask you to answer the question that appears below ([[Special:Captcha/help|more info]]):',
 	'questycaptcha-create' => 'To create the page, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
 	'questycaptcha-edit' => 'To edit this page, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
-	'questycaptcha-sendemail' => 'To help protect against automated spamming, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
+	'questycaptcha-sendemail' => 'To protect the wiki against automated spamming, we kindly ask you to answer the question that appears below ([[Special:Captcha/help|more info]]):',
 	'questycaptchahelp-text' => 'Web sites that accept contributions from the public, like this wiki, are often abused by spammers who use automated tools to add their links to many sites.
 While these spam links can be removed, they are a significant nuisance.
 
 Sometimes, especially when adding new web links to a page, the wiki may ask you to answer a question.
 Since this is a task that is hard to automate, it will allow most real humans to make their contributions while stopping most spammers and other robotic attackers.
 
-Please contact the [[{{MediaWiki:Grouppage-sysop}}|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate contributions.
+Please contact the [[Special:ListAdmins|site administrators]] for assistance if this is unexpectedly preventing you from making legitimate contributions.
 
 Click the "back" button in your browser to return to the page editor.',
 );
@@ -51,13 +51,13 @@ $messages['qqq'] = array(
  * @author Mdupont
  */
 $messages['aln'] = array(
-	'questycaptcha-addurl' => 'Your redakto përfshin të jashtme lidhje të reja. Për të ndihmuar në mbrojtjen kundër spam automatizuar, ju lutem përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):',
-	'questycaptcha-badlogin' => 'Për të ndihmuar në mbrojtjen kundër fjalëkalimin automatizuar plasaritje, ju lutem përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):',
-	'questycaptcha-createaccount' => 'Për të ndihmuar në mbrojtjen kundër krijimit llogari e automatizuar, ju lutemi përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):',
+	'questycaptcha-addurl' => 'Your redakto përfshin të jashtme lidhje të reja. Për të ndihmuar në mbrojtjen kundër spam automatizuar, ju lutem përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Për të ndihmuar në mbrojtjen kundër fjalëkalimin automatizuar plasaritje, ju lutem përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Për të ndihmuar në mbrojtjen kundër krijimit llogari e automatizuar, ju lutemi përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
 	'questycaptcha-create' => 'Për të krijuar një faqe, ju lutem përgjigje të pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):',
 	'questycaptcha-edit' => 'Për të redaktuar këtë faqe, ju lutem përgjigje të pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):',
-	'questycaptcha-sendemail' => 'Për të ndihmuar në mbrojtjen kundër spamming automatizuar, ju lutem përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):',
-	'questycaptchahelp-text' => "Web faqet që të pranojë kontribute nga publiku, si ky wiki, shpesh keqtrajtohen nga spammers që përdorin mjete të automatizuar për të shtuar lidhjet e tyre me shumë vende. Përderisa këto lidhje spam mund të hiqen, ata janë një ngatërresë të rëndësishme. Ndonjëherë, sidomos kur duke shtuar të reja web lidhje me një faqe, wiki mund të kërkojë që për t'iu përgjigjur një pyetje. Ngaqë kjo është një detyrë që është e vështirë për të automatizuar, ajo do të lejojë të vërtetë njerëzit më të japin kontribute të tyre, ndërsa ndaluar spammers më dhe robotik sulmuesit të tjera. Ju lutem kontaktoni [[{{MediaWiki:Grouppage-sysop}}|faqe administratorët]] për ndihmë, nëse kjo është e papritur në parandalimin e ju nga bërja e kontributeve të ligjshme. Kliko 'butonin mbrapa në shfletuesin tuaj për t'u kthyer në faqen e redaktorit.",
+	'questycaptcha-sendemail' => 'Për të ndihmuar në mbrojtjen kundër spamming automatizuar, ju lutem përgjigje pyetjes që duket më poshtë ([[Special:Captcha/help|më shumë informacion]]):', # Fuzzy
+	'questycaptchahelp-text' => "Web faqet që të pranojë kontribute nga publiku, si ky wiki, shpesh keqtrajtohen nga spammers që përdorin mjete të automatizuar për të shtuar lidhjet e tyre me shumë vende. Përderisa këto lidhje spam mund të hiqen, ata janë një ngatërresë të rëndësishme. Ndonjëherë, sidomos kur duke shtuar të reja web lidhje me një faqe, wiki mund të kërkojë që për t'iu përgjigjur një pyetje. Ngaqë kjo është një detyrë që është e vështirë për të automatizuar, ajo do të lejojë të vërtetë njerëzit më të japin kontribute të tyre, ndërsa ndaluar spammers më dhe robotik sulmuesit të tjera. Ju lutem kontaktoni [[Special:ListAdmins|faqe administratorët]] për ndihmë, nëse kjo është e papritur në parandalimin e ju nga bërja e kontributeve të ligjshme. Kliko 'butonin mbrapa në shfletuesin tuaj për t'u kthyer në faqen e redaktorit.",
 );
 
 /** Arabic (العربية)
@@ -68,12 +68,12 @@ $messages['aln'] = array(
 $messages['ar'] = array(
 	'questycaptcha-desc' => 'مولد كويستي كابتشا لConfirm Edit',
 	'questycaptcha-addurl' => 'يحتوي تعديلك على وصلات خارجية جديدة.
-للمساعدة في الحماية من السبام التلقائي، من فضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):',
-	'questycaptcha-badlogin' => 'للمساعدة في الحماية من السبام التلقائي، من فضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):',
-	'questycaptcha-createaccount' => 'للمساعدة في الحماية من إنشاء الحسابات التلقائي، من فضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):',
+للمساعدة في الحماية من السبام التلقائي، من فضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'للمساعدة في الحماية من السبام التلقائي، من فضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'للمساعدة في الحماية من إنشاء الحسابات التلقائي، من فضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):', # Fuzzy
 	'questycaptcha-create' => 'لتنشئ الصفحة، من فضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):',
 	'questycaptcha-edit' => 'لتحرّر هذه الصفحة، من فضلك أجب على السؤال الذي يظهر أدناه ([[Special:Captcha/help|مزيد من المعلومات]]):',
-	'questycaptcha-sendemail' => 'للمساعدة في الحماية ضد البريد الإلكتروني الآلي المرغوب فيه، الرجاء الإجابة على السؤال الذي يظهر أدناه ([[Special:Captcha/help|المزيد من المعلومات]]):',
+	'questycaptcha-sendemail' => 'للمساعدة في الحماية ضد البريد الإلكتروني الآلي المرغوب فيه، الرجاء الإجابة على السؤال الذي يظهر أدناه ([[Special:Captcha/help|المزيد من المعلومات]]):', # Fuzzy
 	'questycaptchahelp-text' => "عادة ما يتم في المواقع التي تقبل الردود والرسائل من العامة، كهذا الويكي، تخريب الموقع عن طريق الأشخاص الذين يستعملون آليات معينة لإرسال وصلاتهم لمواقع متعددة بصورة آلية.
 وعلى الرغم من أن هذا يمكن إزالته ولكنه مزعج للغاية.
 
@@ -82,7 +82,7 @@ $messages['ar'] = array(
 
 للأسف سيكون هذا صعبا بالنسبة لمستخدمي المتصفحات المحدودة أو التي تعتمد على النصوص فقط أو قراءة النصوص.
 في الوقت الحالي لا يوجد لدينا بديل سمعي.
-من فضلك راسل [[{{MediaWiki:Grouppage-sysop}}|إداريي الموقع]] للمساعدة إذا كان هذا الأمر يمنعك من التعديل ووضع وصلات قانونية.
+من فضلك راسل [[Special:ListAdmins|إداريي الموقع]] للمساعدة إذا كان هذا الأمر يمنعك من التعديل ووضع وصلات قانونية.
 
 إذا كنت تحرر صفحة معينة: اضغط زر 'العودة' في متصفحك للعودة إلى التحرير.",
 );
@@ -91,40 +91,41 @@ $messages['ar'] = array(
  * @author Xuacu
  */
 $messages['ast'] = array(
-	'questycaptcha-addurl' => "La to edición inclúi nuevos enllaces esternos. P'aidar a protexer escontra'l spam automatizáu, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
-	'questycaptcha-badlogin' => "P'ayudar a protexer escontra'l descifráu automáticu de claves, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
-	'questycaptcha-createaccount' => "P'ayudar a protexer escontra la creación automática de cuentes, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
+	'questycaptcha-addurl' => "La so edición incluye nuevos enllaces esternos. Pa protexer la wiki escontra'l spam d'edición automatizáu, pidimos-y que conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
+	'questycaptcha-badlogin' => "Pa protexer la wiki escontra'l descifráu automáticu de claves, pidimos-y que conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
+	'questycaptcha-createaccount' => "Pa protexer la wiki escontra la creación automática de cuentes, pidimos-y que conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
 	'questycaptcha-create' => "Pa crear la páxina, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
 	'questycaptcha-edit' => "Pa editar la páxina, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
-	'questycaptcha-sendemail' => "P'ayudar a protexer escontra'l corréu puxarra automáticu, por favor conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
+	'questycaptcha-sendemail' => "Pa protexer la wiki escontra'l corréu puxarra automáticu, pidimos-y que conteste la entruga qu'apaez embaxo ([[Special:Captcha/help|más información]]):",
 	'questycaptchahelp-text' => "Los sitios web qu'aceuten collaboración del públicu, como esta wiki, sufren de vezu l'abusu de «spammers» qu'usen ferramientes automátiques p'amestar los sos enllaces en munchos sitios.
 Mentanto qu'esos enllaces puen desaniciase, suponen una bultable molestia.
 
 Dacuando, especialmente al amestar enllaces nuevos a una páxina, la wiki pue pidi-y que conteste una entruga.
 Como esta ye una xera difícil d'automatizar, permitirá que la mayor parte de persones faiga collaboraciones mentanto torga a la mayor parte de «spammers» y otros atacantes robotizaos .
 
-Por favor, pongase'n contautu colos [[{{MediaWiki:Grouppage-sysop}}|alministradores del sitiu]] pa pidir ayuda si esto ta torgando-y de mou inesperáu facer collaboraciones llexítimes.
+Por favor, pongase'n contautu colos [[Special:ListAdmins|alministradores del sitiu]] pa pidir ayuda si esto ta torgando-y de mou inesperáu facer collaboraciones llexítimes.
 
 Calque nel botón «atrás» del navegador pa volver al editor de páxines.",
 );
 
 /** Bashkir (башҡортса)
  * @author Assele
+ * @author Рустам Нурыев
  */
 $messages['ba'] = array(
 	'questycaptcha-addurl' => 'Һеҙҙең текстығыҙҙа яңы тышҡы һылтанмалар бар.
-Автоматик спамдан һаҡлау маҡсатында, зинһар, түбәндә килтерелгән һорауға яуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
-	'questycaptcha-badlogin' => 'Паролде автоматик ватыуҙан һаҡлау маҡсатында, зинһар, түбәндә килтерелгән һорауға яуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
-	'questycaptcha-createaccount' => 'Иҫәп яҙмаларын автоматик булдырыуҙан һаҡлау маҡсатында, зинһар, түбәндә килтерелгән һорауға яуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
+Автоматик спамдан һаҡлау маҡсатында, зинһар, түбәндә килтерелгән һорауға яуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Серһүҙҙе автоматик ватыуҙан һаҡлау маҡсатында, зинһар, түбәндә килтерелгән һорауға яуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Иҫәп яҙмаларын автоматик булдырыуҙан һаҡлау маҡсатында, зинһар, түбәндә килтерелгән һорауға яуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
 	'questycaptcha-create' => 'Яңы бит булдырыу өсөн, зинһар, түбәндә килтерелгән һорауға яуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
 	'questycaptcha-edit' => 'Был битте мөхәррирләү өсөн, зинһар, түбәндә килтерелгән һорауға яуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
-	'questycaptcha-sendemail' => 'Автоматик спамдан һаҡлау маҡсатында, зинһар, түбәндә килтерелгән һорауға яуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):',
+	'questycaptcha-sendemail' => 'Автоматик спамдан һаҡлау маҡсатында, зинһар, түбәндә килтерелгән һорауға яуап бирегеҙ ([[Special:Captcha/help|тулыраҡ мәғлүмәт]]):', # Fuzzy
 	'questycaptchahelp-text' => 'Үҙенә эстәлек өҫтәргә һәм эстәлеген мөхәррирләргә мөмкинлек биргән веб-сайттар, шул иҫәптән был вики, йыш ҡына сайттарға автоматик һылтанмалар өҫтәү өсөн программалар ҡулланған спамлаусыларҙың маҡсатына әйләнә.
 Бындай һылтанмалар юйыла ала, әммә улар һиҙелерлек уңайһыҙлыҡ килтерә.
 
 Ҡайһы бер ғәмәлдәрҙе башҡарған ваҡытта — мәҫәлән, биткә һылтанма өҫтәгән ваҡытта — вики һеҙгә һорауға яуап бирергә тәҡдим итә ала. Был мәсьәләне автоматик рәүештә сисеү ауыр булғанға күрә, ул күпселек кешеләргә мөхәррирләүҙе башҡарырға мөмкинлек бирәсәк, һәм шул уҡ ваҡытта спамлаусыларҙың һәм башҡа автоматлаштырылған зыян килтереүселәрҙең күпселеген туҡтатасаҡ.
 
-Зинһар, әгәр бындай тикшереү һеҙгә сайтта намыҫ менән эшләргә ҡамасаулаһа, [[{{MediaWiki:Grouppage-sysop}}|хәкимдәргә]] мөрәжәғәт итегеҙ.
+Зинһар, әгәр бындай тикшереү һеҙгә сайтта намыҫ менән эшләргә ҡамасаулаһа, [[Special:ListAdmins|хәкимдәргә]] мөрәжәғәт итегеҙ.
 
 Мөхәррирләүгә кире ҡайтыу өсөн, браузерығыҙҙа кире ҡайтыу төймәһенә баҫығыҙ.',
 );
@@ -135,12 +136,12 @@ $messages['ba'] = array(
  */
 $messages['be-tarask'] = array(
 	'questycaptcha-addurl' => 'Вашае рэдагаваньне ўтрымлівае вонкавыя спасылкі.
-Каб абараніцца да аўтаматычнага спаму, калі ласка, адкажыце на пытаньне, паказанае ніжэй ([[Special:Captcha/help|дадатковая інфармацыя]]):',
-	'questycaptcha-badlogin' => 'Для абароны супраць аўтаматычнага падбору пароля, калі ласка, адкажыце на пытаньне, паказанае ніжэй ([[Special:Captcha/help|дадатковая інфармацыя]]):',
-	'questycaptcha-createaccount' => 'Для абароны супраць аўтаматычнага стварэньня рахункаў, калі ласка, адкажыце на пытаньне, паказанае ніжэй ([[Special:Captcha/help|дадатковая інфармацыя]]):',
+Каб абараніцца да аўтаматычнага спаму, калі ласка, адкажыце на пытаньне, паказанае ніжэй ([[Special:Captcha/help|дадатковая інфармацыя]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Для абароны супраць аўтаматычнага падбору пароля, калі ласка, адкажыце на пытаньне, паказанае ніжэй ([[Special:Captcha/help|дадатковая інфармацыя]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Для абароны супраць аўтаматычнага стварэньня рахункаў, калі ласка, адкажыце на пытаньне, паказанае ніжэй ([[Special:Captcha/help|дадатковая інфармацыя]]):', # Fuzzy
 	'questycaptcha-create' => 'Для стварэньня старонкі, калі ласка, адкажыце на пытаньне, паказанае ніжэй ([[Special:Captcha/help|дадатковая інфармацыя]]):',
 	'questycaptcha-edit' => 'Для рэдагаваньня гэтай старонкі, калі ласка, адкажыце на пытаньне, паказанае ніжэй ([[Special:Captcha/help|дадатковая інфармацыя]]):',
-	'questycaptcha-sendemail' => 'У мэтах абароны супраць аўтаматычнага спаму, калі ласка, адкажыце на пытаньне, паказанае ніжэй ([[Special:Captcha/help|дадатковая інфармацыя]]):',
+	'questycaptcha-sendemail' => 'У мэтах абароны супраць аўтаматычнага спаму, калі ласка, адкажыце на пытаньне, паказанае ніжэй ([[Special:Captcha/help|дадатковая інфармацыя]]):', # Fuzzy
 	'questycaptchahelp-text' => 'Вэб-сайты, якія прымаюць запісы ад грамадзкасьці, падобныя на {{GRAMMAR:вінавальны|{{SITENAME}}}}, часта атакуюцца спамэрамі, якія ўжываюць аўтаматызаваныя інструмэнты, каб зьмяшчаць свае спасылкі на шмат сайтаў.
 І хаця гэтыя спасылкі могуць быць прыбраныя, яны выклікаюць значныя нязручнасьці.
 
@@ -149,28 +150,29 @@ $messages['be-tarask'] = array(
 
 На жаль, гэта можа выклікаць нязручнасьці для ўдзельнікаў з абмежаваньнямі па зроку і для тых, хто ўжывае тэкставыя ці моўныя браўзэры.
 На гэты момант мы ня маем аўдыё-альтэрнатывы гэтай праверцы.
-Калі ласка, зьвяжыцеся з [[{{MediaWiki:Grouppage-sysop}}|адміністратарамі]], калі гэтая праверка перашкаджае Вам рабіць слушныя запісы.
+Калі ласка, зьвяжыцеся з [[Special:ListAdmins|адміністратарамі]], калі гэтая праверка перашкаджае Вам рабіць слушныя запісы.
 
 Націсьніце кнопку «назад» у Вашым браўзэры, каб вярнуцца да рэдагаваньня старонкі.',
 );
 
 /** Breton (brezhoneg)
+ * @author Fohanno
  * @author Fulup
  */
 $messages['br'] = array(
 	'questycaptcha-addurl' => "Degaset hoc'h liammoù diavaez nevez.
 A-benn hor skoazellañ da stourm a-enep d'ar strob emgefre, respontit d'ar goulenn a-is ([[Special:Captcha/help|muioc'h a ditouroù]]) :",
-	'questycaptcha-badlogin' => "A-benn hor skoazellañ da stourm a-enep ar freuzañ gerioù-tremen gant ardivinkoù, respontit d'ar goulenn a-is ([[Special:Captcha/help|muioc'h a ditouroù]]) :",
-	'questycaptcha-createaccount' => "A-benn hor skoazellañ da stourm a-enep ar c'hrouiñ kontoù emgefre, respontit d'ar goulenn a-is ([[Special:Captcha/help|muioc'h a ditouroù]]) :",
+	'questycaptcha-badlogin' => "Evit hor sikour da stourm a-enep ar freuzañ gerioù-tremen gant ardivinkoù, respontit d'ar goulenn a-is ([[Special:Captcha/help|muioc'h a ditouroù]]) :",
+	'questycaptcha-createaccount' => "Evit hor sikour da stourm a-enep ar c'hrouiñ kontoù emgefre, respontit d'ar goulenn a-is ([[Special:Captcha/help|muioc'h a ditouroù]]) :",
 	'questycaptcha-create' => "A-benn gellout krouiñ ar bajenn, respontit d'ar goulenn a-is ([[Special:Captcha/help|muioc'h a ditouroù]]) :",
 	'questycaptcha-edit' => "A-benn gellout degas kemmoù er bajenn-mañ, respontit d'ar goulenn a-is ([[Special:Captcha/help|muioc'h a ditouroù]]) :",
-	'questycaptcha-sendemail' => "Evit hor skoazellañ da zizarbenn ar strob emgefre, respontit d'ar goulenn skrivet dindan ([[Special:Captcha/help|gouzout hiroc'h]]) :",
+	'questycaptcha-sendemail' => "Evit hor sikour da zizarbenn ar strob emgefre, respontit d'ar goulenn skrivet dindan ([[Special:Captcha/help|gouzout hiroc'h]]) :",
 	'questycaptchahelp-text' => "Alies e vez taget al lec'hiennoù a zegemer kemennadennoù a-berzh an holl, evel ar wiki-mañ, gant ar stroberien a implij ostilhoù emgefre evit postañ o liammoù war-du lec'hiennoù a bep seurt. Ha pa c'hallfent bezañ diverket, kazus-mat ez eo ar stroboù-se memes tra.
 
 A-wezhioù, dreist-holl pa vez ouzhpennet liammoù Web nevez war ur bajenn, e c'hallo ar wiki-mañ sevel ur goulenn ouzhoc'h. 
 Un trevell start da emgefrekaat eo hemañ. Gant se e c'hallo an implijerien wirion postañ ar pezh a fell dezho tra ma vo lakaet un harz d'an darn vrasañ eus ar stroberien pe d'an dagerien robotek all.
 
-Kit e darempred gant [[{{MediaWiki:Grouppage-sysop}}|merourien al lec'hienn]] evit bezañ skoazellet m'hoc'h eus diaesterioù da gemer perzh da vat abalamour d'an teknik-se.
+Kit e darempred gant [[Special:ListAdmins|merourien al lec'hienn]] evit bezañ skoazellet m'hoc'h eus diaesterioù da gemer perzh da vat abalamour d'an teknik-se.
 
 Pouezit war bouton 'kent' ho merdeer evit distreiñ d'ar bajenn gemmañ.",
 );
@@ -180,18 +182,18 @@ Pouezit war bouton 'kent' ho merdeer evit distreiñ d'ar bajenn gemmañ.",
  */
 $messages['bs'] = array(
 	'questycaptcha-addurl' => 'Vaša izmjena uključuje nove vanjske linkove.
-Da bi pomogli protiv automatskog spama, molimo odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):',
-	'questycaptcha-badlogin' => 'Da bi pomogli u sprječavanju protiv automatskog probijanja šifre, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):',
-	'questycaptcha-createaccount' => 'Da bi pomogli u sprječavanju automatskog pravljenja računa, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):',
+Da bi pomogli protiv automatskog spama, molimo odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Da bi pomogli u sprječavanju protiv automatskog probijanja šifre, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Da bi pomogli u sprječavanju automatskog pravljenja računa, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):', # Fuzzy
 	'questycaptcha-create' => 'Da bi ste napravili stranicu, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):',
 	'questycaptcha-edit' => 'Da bi ste uredili ovu stranicu, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):',
-	'questycaptcha-sendemail' => 'Da bi pomogli u zaštiti protiv automatskog spamovanja, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):',
+	'questycaptcha-sendemail' => 'Da bi pomogli u zaštiti protiv automatskog spamovanja, molimo Vas da odgovorite na pitanje koje je prikazano ispod ([[Special:Captcha/help|više informacija]]):', # Fuzzy
 	'questycaptchahelp-text' => "Websajtovi koji podržavaju doprinose iz javnosti, kao što je ovaj viki, često zloupotrebljavaju vandali koji koriste automatizovane alate da šalju svoje linkove ka mnogim sajtovima.
 Iako se ovi neželjeni linkovi mogu ukloniti, oni ipak zadaju veliku muku.
 
 Ponekad, pogotovo kad se dodaju novi internet linkovi na stranicu, wiki može tražiti od Vas da odgovorite na pitanje. Pošto je teško automatizovati ovakav zadatak, on omogućuje svim pravim ljudima da vrše svoje izmjene, ali će zato spriječiti vandale i ostale robotske napadače.
 
-Molimo Vas da kontaktirate [[{{MediaWiki:Grouppage-sysop}}|administratore stranice]] za pomoć ako je ovo prepreka za Vas da pravite uobičajene izmjene.
+Molimo Vas da kontaktirate [[Special:ListAdmins|administratore stranice]] za pomoć ako je ovo prepreka za Vas da pravite uobičajene izmjene.
 
 Kliknite 'nazad' ('back') dugme vašeg preglednika da se vratite na polje za unos teksta.",
 );
@@ -202,7 +204,7 @@ Kliknite 'nazad' ('back') dugme vašeg preglednika da se vratite na polje za uno
  */
 $messages['ca'] = array(
 	'questycaptcha-addurl' => "L'edició inclou enllaços externs nous.
-Per ajudar a protegir-se contra la brossa automàtica, responeu la pregunta que apareix a continuació ([[Special:Captcha/help|més informació]]):",
+Per ajudar a protegir-se contra la brossa automàtica, responeu la pregunta que apareix a continuació ([[Special:Captcha/help|més informació]]):", # Fuzzy
 	'questycaptcha-create' => 'Per crear la pàgina, per favor responeu la pregunta que apareix a continuació ([[Special:Captcha/help|més informació]]):',
 );
 
@@ -211,18 +213,18 @@ Per ajudar a protegir-se contra la brossa automàtica, responeu la pregunta que
  */
 $messages['cs'] = array(
 	'questycaptcha-addurl' => 'Vaše editace obsahuje nové externí odkazy.
-V zájmu ochrany před automatickým spamováním musíte zodpovědět níže uvedenou otázku ([[Special:Captcha/help|další informace]]):',
-	'questycaptcha-badlogin' => 'V rámci ochrany proti automatickým pokusům uhodnout heslo musíte zodpovědět níže uvedenou otázku ([[Special:Captcha/help|další informace]]):',
-	'questycaptcha-createaccount' => 'V rámci ochrany před automatickým vytvářením účtů musíte pro provedení registrace zodpovědět níže uvedenou otázku ([[Special:Captcha/help|další informace]]):',
+V zájmu ochrany před automatickým spamováním musíte zodpovědět níže uvedenou otázku ([[Special:Captcha/help|další informace]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'V rámci ochrany proti automatickým pokusům uhodnout heslo musíte zodpovědět níže uvedenou otázku ([[Special:Captcha/help|další informace]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'V rámci ochrany před automatickým vytvářením účtů musíte pro provedení registrace zodpovědět níže uvedenou otázku ([[Special:Captcha/help|další informace]]):', # Fuzzy
 	'questycaptcha-create' => 'Abyste mohli založit stránku, musíte zodpovědět níže uvedenou otázku ([[Special:Captcha/help|další informace]]):',
 	'questycaptcha-edit' => 'Abyste mohli editovat tuto stránku, musíte zodpovědět níže uvedenou otázku ([[Special:Captcha/help|další informace]]):',
-	'questycaptcha-sendemail' => 'V rámci ochrany proti automatickému spamování musíte zodpovědět níže zobrazenou otázku ([[Special:Captcha/help|více informací]]):',
+	'questycaptcha-sendemail' => 'V rámci ochrany proti automatickému spamování musíte zodpovědět níže zobrazenou otázku ([[Special:Captcha/help|více informací]]):', # Fuzzy
 	'questycaptchahelp-text' => 'Webové stránky, do kterých mohou přispívat jejich návštěvníci (jako například tato wiki), jsou často terčem spammerů, kteří pomocí automatických nástrojů vkládají své odkazy na velké množství stránek. Přestože lze tento spam odstranit, představuje nepříjemné obtěžování.
 
 Někdy, zvláště při přidávání nových webových odkazů, vás wiki může požádat o zodpovězení otázky.
 Jelikož takovou úlohu lze jen těžko automatizovat, skuteční lidé mohou dále přispívat, zatímco většinu spammerů a jiných robotických útočníků to zastaví.
 
-Pokud vám to brání v užitečných příspěvcích a potřebujete pomoc, kontaktujte laskavě [[{{MediaWiki:Grouppage-sysop}}|správce serveru]].
+Pokud vám to brání v užitečných příspěvcích a potřebujete pomoc, kontaktujte laskavě [[Special:ListAdmins|správce serveru]].
 
 Pro návrat na předchozí stránku stiskněte ve svém prohlížeči tlačítko „zpět“.',
 );
@@ -232,36 +234,44 @@ Pro návrat na předchozí stránku stiskněte ve svém prohlížeči tlačítko
  */
 $messages['cy'] = array(
 	'questycaptcha-addurl' => 'Mae eich golygiad yn cynnwys o leiaf un cyswllt allanol newydd.
-Er mwyn ceisio rhwystro peiriannau sbam, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
-	'questycaptcha-badlogin' => 'Er mwyn ceisio rhwystro peiriannau datrys cyfrineiriau, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
-	'questycaptcha-createaccount' => 'Er mwyn ceisio rhwystro peiriannau creu cyfrifon, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+Er mwyn arbed y wici rhag peiriannau sbam, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+	'questycaptcha-badlogin' => 'Er mwyn arbed y wici rhag peiriannau datrys cyfrineiriau, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+	'questycaptcha-createaccount' => 'Er mwyn arbed y wici rhag peiriannau creu cyfrifon, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
 	'questycaptcha-create' => "Er mwyn dechrau'r dudalen, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):",
 	'questycaptcha-edit' => "Er mwyn golygu'r dudalen, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):",
-	'questycaptcha-sendemail' => 'Er mwyn cyfrannu at ddiogelu rhag sbamio awtomatig, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+	'questycaptcha-sendemail' => 'Er mwyn arbed y wici rhag sbamio awtomatig, byddwch gystal ag ateb y cwestiwn a welwch isod ([[Special:Captcha/help|rhagor o wybodaeth]]):',
+	'questycaptchahelp-text' => "Mae safleoedd gwe fel y wici hon, sy'n caniatau i'r cyhoedd ysgrifennu iddi, yn darged beunyddiol i sbamwyr sy'n defnyddio rhaglenni arbennig i bostio eu cysylltiadau ar wefannau lu. Gellir dileu'r dolenni o'r tudalennau, ond mae hynny'n waith trafferthus.
+
+O dro i dro, yn enwedig wrth ychwanegu dolenni at safleoedd gwe eraill, fe fydd y wici hon yn gofyn i chi ateb cwestiwn. Mae hyn yn dasg anodd iawn i raglenni cyfrifiadurol, felly dylai'r rhan fwyaf o olygwyr go iawn gyflawni'r dasg yn ddi-drafferth, yn wahanol i'r mwyafrif o'r rhaglenni sbam ac ymosodwyr automatig eraill.
+
+Cysylltwch â [[Special:ListAdmins|gweinyddwyr y safle]] os ydi'r nodwedd hon yn eich rhwystro rhag ychwanegu golygiadau dilys.
+
+Gwasgwch botwm \"nôl\" eich porwr er mwyn dychwelyd at y dudalen olygu.",
 );
 
 /** German (Deutsch)
  * @author Geitost
  * @author Kghbln
+ * @author Metalhead64
  * @author Pill
  * @author Umherirrender
  */
 $messages['de'] = array(
 	'questycaptcha-desc' => 'Questy-CAPTCHA-Generator für die Erweiterung „Confirm Edit“',
 	'questycaptcha-addurl' => 'Deine Bearbeitung enthält neue externe Links.
-Zum Schutz vor automatisiertem Spam, beantworte bitte die untenstehende Frage, um die Seite speichern zu können ([[Special:Captcha/help|weitere Informationen]]):',
-	'questycaptcha-badlogin' => 'Zum Schutz vor einer Kompromittierung deines Benutzerkontos, beantworte bitte die untenstehende Frage, um dich anmelden zu können ([[Special:Captcha/help|weitere Informationen]]):',
-	'questycaptcha-createaccount' => 'Zum Schutz vor einer automatisierten Anlage von Benutzerkonten ist es erforderlich, die folgende Frage zu beantworten ([[Special:Captcha/help|weitere Informationen]]):',
+Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, die untenstehende Frage zu beantworten, um die Seite speichern zu können ([[Special:Captcha/help|weitere Informationen]]):',
+	'questycaptcha-badlogin' => 'Zum Schutz des Wikis vor einer Kompromittierung deines Benutzerkontos bitten wir dich, die untenstehende Frage zu beantworten, um dich anmelden zu können ([[Special:Captcha/help|weitere Informationen]]):',
+	'questycaptcha-createaccount' => 'Zum Schutz des Wikis vor einer automatisierten Anlage von Benutzerkonten bitten wir dich, die folgende Frage zu beantworten ([[Special:Captcha/help|weitere Informationen]]):',
 	'questycaptcha-create' => 'Bitte beantworte die folgende Frage, um diese Seite erstellen zu können ([[Special:Captcha/help|weitere Informationen]]):',
 	'questycaptcha-edit' => 'Bitte beantworte die folgende Frage, um diese Seite speichern zu können ([[Special:Captcha/help|weitere Informationen]]):',
-	'questycaptcha-sendemail' => 'Zum Schutz vor automatisiertem Spam bitte die untenstehende Frage beantworten ([[Special:Captcha/help|weitere Informationen]]):',
-	'questycaptchahelp-text' => 'Internetangebote, die — wie dieses Wiki — für Beiträge von praktisch jedem offen sind, werden häufig von Spammern missbraucht, welche versuchen, mithilfe entsprechender Werkzeuge ihre Links automatisch auf vielen Webseiten zu platzieren.
+	'questycaptcha-sendemail' => 'Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, die untenstehende Frage zu beantworten ([[Special:Captcha/help|weitere Informationen]]):',
+	'questycaptchahelp-text' => 'Internetangebote, die – wie dieses Wiki – für Beiträge von praktisch jedem offen sind, werden häufig von Spammern missbraucht, welche versuchen, mithilfe entsprechender Werkzeuge ihre Links automatisch auf vielen Webseiten zu platzieren.
 Zwar können derartige Spam-Links wieder entfernt werden, doch stellen sie trotzdem ein erhebliches Ärgernis dar.
 
 In manchen Fällen, meist beim Versuch, neue Weblinks zu einer Seite hinzuzufügen, kann es vorkommen, dass du um die Beantwortung einer Frage gebeten wirst.
 Da es kaum möglich ist, dies zu automatisieren, können hierdurch die meisten Spammer aufgehalten werden. Menschlichen Benutzer sollten ihre Bearbeitungen hingegen durchführen können.
 
-Sollte dich dieses Verfahren beim Vornehmen erwünschter Bearbeitungen behindern, wende dich bitte an einen [[{{MediaWiki:Grouppage-sysop}}|Administrator]], um Unterstützung zu erhalten.
+Sollte dich dieses Verfahren beim Vornehmen erwünschter Bearbeitungen behindern, wende dich bitte an einen [[Special:ListAdmins|Administrator]], um Unterstützung zu erhalten.
 
 Die Schaltfläche „Zurück“ des Browsers führt zurück zum vorherigen Bearbeitungsfenster.',
 );
@@ -272,20 +282,20 @@ Die Schaltfläche „Zurück“ des Browsers führt zurück zum vorherigen Bearb
  */
 $messages['de-formal'] = array(
 	'questycaptcha-addurl' => 'Ihre Bearbeitung enthält neue externe Links.
-Zum Schutz vor automatisiertem Spam beantworten Sie bitte die untenstehende Frage ([[Special:Captcha/help|weitere Informationen]]):',
-	'questycaptcha-badlogin' => 'Zum Schutz vor einer Kompromittierung Ihres Benutzerkontos beantworten Sie bitte die folgende Frage ([[Special:Captcha/help|weitere Informationen]]):',
+Zum Schutz vor automatisiertem Spam beantworten Sie bitte die untenstehende Frage ([[Special:Captcha/help|weitere Informationen]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Zum Schutz vor einer Kompromittierung Ihres Benutzerkontos beantworten Sie bitte die folgende Frage ([[Special:Captcha/help|weitere Informationen]]):', # Fuzzy
 	'questycaptcha-create' => 'Bitte beantworten Sie die folgende Frage, um diese Seite erstellen zu können ([[Special:Captcha/help|weitere Informationen]]):',
 	'questycaptcha-edit' => 'Bitte beantworten Sie die folgende Frage, um diese Seite bearbeiten zu können ([[Special:Captcha/help|weitere Informationen]]):',
-	'questycaptcha-sendemail' => 'Zum Schutz vor automatisiertem Spam bitten wir Sie, die folgende Frage zu beantworten ([[Special:Captcha/help|weitere Informationen]]):',
+	'questycaptcha-sendemail' => 'Zum Schutz vor automatisiertem Spam bitten wir Sie, die folgende Frage zu beantworten ([[Special:Captcha/help|weitere Informationen]]):', # Fuzzy
 	'questycaptchahelp-text' => 'Internetangebote, die — wie dieses Wiki — für Beiträge von praktisch jedem offen sind, werden häufig von Spammern missbraucht, welche versuchen, mithilfe entsprechender Werkzeuge ihre Links automatisch auf vielen Webseiten zu platzieren.
 Zwar können derartige Spam-Links wieder entfernt werden, doch stellen sie trotzdem ein erhebliches Ärgernis dar.
 
 In manchen Fällen, meist beim Versuch, neue Weblinks zu einer Seite hinzuzufügen, kann es vorkommen, dass Sie um die Beantwortung einer Frage gebeten wirst.
 Da es kaum möglich ist, dies zu automatisieren, können hierdurch die meisten Spammer aufgehalten werden. Menschlichen Benutzer sollten ihre Bearbeitungen hingegen durchführen können.
 
-Sollte Sie dieses Verfahren beim Vornehmen erwünschter Bearbeitungen behindern, wenden Sie sich bitte an einen [[{{MediaWiki:Grouppage-sysop}}|Administrator]], um Unterstützung zu erhalten.
+Sollte Sie dieses Verfahren beim Vornehmen erwünschter Bearbeitungen behindern, wenden Sie sich bitte an einen [[Special:ListAdmins|Administrator]], um Unterstützung zu erhalten.
 
-Der „Zurück“-Knopf des Browsers führt zurück zum Bearbeitungsfenster.',
+Der „Zurück“-Knopf des Browsers führt zurück zum Bearbeitungsfenster.', # Fuzzy
 );
 
 /** Lower Sorbian (dolnoserbski)
@@ -293,28 +303,42 @@ Der „Zurück“-Knopf des Browsers führt zurück zum Bearbeitungsfenster.',
  */
 $messages['dsb'] = array(
 	'questycaptcha-addurl' => 'Twója změna wopśimujo nowe eksterne wótkaze.
-Za šćit pśeśiwo zawtomatizěrowanemu spamoju, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):',
-	'questycaptcha-badlogin' => 'Za šćit pśeśiwo zawtomatizěrowanemu wusnuchlenjeju gronidła, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):',
-	'questycaptcha-createaccount' => 'Za šćit pśeśiwo zawtomatizěrowanemu napóranjeju kontow, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):',
+Za šćit pśeśiwo zawtomatizěrowanemu spamoju, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Za šćit pśeśiwo zawtomatizěrowanemu wusnuchlenjeju gronidła, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Za šćit pśeśiwo zawtomatizěrowanemu napóranjeju kontow, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
 	'questycaptcha-create' => 'Aby napórał bok, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):',
 	'questycaptcha-edit' => 'Aby wobźěłał toś ten bok, wótegroń pšosym na pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):',
-	'questycaptcha-sendemail' => 'Za šćit pśeśiwo awtomatiskemu spamowanjeju, wótegroń pšosym pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):',
+	'questycaptcha-sendemail' => 'Za šćit pśeśiwo awtomatiskemu spamowanjeju, wótegroń pšosym pšašanje, kótarež pokazujo se dołojce ([[Special:Captcha/help|dalšne informacije]]):', # Fuzzy
 	'questycaptchahelp-text' => 'Websedła, kótarež akceptěruju zjawne pśinoski, ako toś ten wiki, znjewužywaju se cesto wót spamowarjow, kótarež wužywaju zawtomatizěrowane rědy, aby pśidali swóje wótkaze na wjele sedłow. Lěcrownož toś te spamowe wótkaze daju se wótpóraś, su wóne bejna pógóršota. 
 
 Wótergi, wósebnje, gaž se nowe wótkaze pśidawaju bokoju, jo móžno, až se śi wiki něco pšaša. 
 Dokulaž to jo nadawk, kótaryž dajo se śěžko awtomatizěrowaś, dowólujo to napšawdnym luźam jich pśinoski wótpósłaś, nejwěcej spamowarjow a robotowe ataki pak se zaźaržyju. 
 
-Staj se pšosym z [[{{MediaWiki:Grouppage-sysop}}|administratorami sedła]] z pšosbu wó pomoc do zwiska, jolic to śi njewócakane zawobarujo słanje legitimnych pśinoskow. 
+Staj se pšosym z [[Special:ListAdmins|administratorami sedła]] z pšosbu wó pomoc do zwiska, jolic to śi njewócakane zawobarujo słanje legitimnych pśinoskow. 
 
 Klikni na tłocašk "Slědk" we swójom wobglědowaku, aby wróśił se k wobźěłowańskemu woknoju.',
 );
 
 /** Greek (Ελληνικά)
  * @author Omnipaedista
+ * @author Protnet
  */
 $messages['el'] = array(
-	'questycaptcha-addurl' => 'Η επεξεργασία σας περιέχει νέους εξωτερικούς συνδέσμους.
-Για να μας βοηθήσετε στην προστασία κατά των αυτοματοποιημένων σπαμ, παρακαλώ απαντήστε στην παρακάτω ερώτηση ([[Special:Captcha/help|περισσότερες πληροφορίες]]):',
+	'questycaptcha-desc' => 'Γεννήτρια Questy CAPTCHA για το Confirm Edit',
+	'questycaptcha-addurl' => 'Η επεξεργασία σας περιλαμβάνει νέους εξωτερικούς συνδέσμους.
+Για την προστασία του wiki ενάντια σε αυτοματοποιημένη επεξεργασία spam, σας παρακαλούμε να απαντήσετε στην παρακάτω ερώτηση ([[Special:Captcha/help|περισσότερες πληροφορίες]]):',
+	'questycaptcha-badlogin' => 'Για την προστασία του wiki ενάντια σε αυτοματοποιημένο σπάσιμο κωδικών, σας παρακαλούμε να απαντήσετε στην παρακάτω ερώτηση ([[Special:Captcha/help|περισσότερες πληροφορίες]]):',
+	'questycaptcha-createaccount' => 'Για την προστασία του wiki ενάντια σε αυτοματοποιημένη δημιουργία λογαριασμών, σας παρακαλούμε να απαντήσετε στην παρακάτω ερώτηση ([[Special:Captcha/help|περισσότερες πληροφορίες]]):',
+	'questycaptcha-create' => 'Για να δημιουργήσετε τη σελίδα, σας παρακαλούμε να απαντήσετε στην παρακάτω ερώτηση ([[Special:Captcha/help|περισσότερες πληροφορίες]]):',
+	'questycaptcha-edit' => 'Για να επεξεργαστείτε αυτή τη σελίδα, σας παρακαλούμε να απαντήσετε στην παρακάτω ερώτηση ([[Special:Captcha/help|περισσότερες πληροφορίες]]):',
+	'questycaptcha-sendemail' => 'Για την προστασία του wiki ενάντια σε αυτοματοποιημένο σπαμάρισμα, σας παρακαλούμε να απαντήσετε στην παρακάτω ερώτηση ([[Special:Captcha/help|περισσότερες πληροφορίες]]):',
+	'questycaptchahelp-text' => 'Οι ιστότοποι που επιτρέπουν δημόσιες συνεισφορές, όπως αυτό το wiki, παραβιάζονται συχνά από spammers που χρησιμοποιούν αυτοματοποιημένα εργαλεία για να δημοσιεύουν μαζικά υπερσυνδέσμους σε πλήθος ιστοτόπων. Αν και αυτοί οι σύνδεσμοι spam μπορούν να αφαιρεθούν, είναι μεγάλος μπελάς.
+
+Μερικές φορές, ειδικά κατά την προσθήκη νέων συνδέσμων σε μια σελίδα, το wiki μπορεί να σας ζητήσει να απαντήσετε σε μια ερώτηση. Δεδομένου ότι αυτή η εργασία είναι δύσκολο να αυτοματοποιηθεί, θα επιτρέψει στους περισσότερους πραγματικούς ανθρώπους να κάνουν τις δημοσιεύσεις τους, σταματώντας όμως spammers και άλλους ρομποτικά επιτιθέμενους.
+
+Παρακαλούμε επικοινωνήστε με τους [[Special:ListAdmins|διαχειριστές του ιστότοπου]] για βοήθεια εάν αυτό για κάποιο λόγο σας αποτρέπει να εκτελέσετε θεμιτές ενέργειες.
+
+Πατήστε το κουμπί «πίσω» στον περιηγητή σας για να επιστρέψετε στον επεξεργαστή σελίδων.',
 );
 
 /** Esperanto (Esperanto)
@@ -322,16 +346,16 @@ $messages['el'] = array(
  */
 $messages['eo'] = array(
 	'questycaptcha-addurl' => 'Via redakto entenas novajn eksterajn ligilojn. 
-Por helpi protekti kontraŭ aŭtomatan spamadon, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):',
-	'questycaptcha-badlogin' => 'Por helpi protekti kontraŭ aŭtomata divenado de pasvortoj, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):',
-	'questycaptcha-createaccount' => 'Por helpi protekti kontraŭ aŭtomata konto-kreado, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):',
+Por helpi protekti kontraŭ aŭtomatan spamadon, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Por helpi protekti kontraŭ aŭtomata divenado de pasvortoj, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Por helpi protekti kontraŭ aŭtomata konto-kreado, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):', # Fuzzy
 	'questycaptcha-create' => 'Por krei la paĝon, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):',
 	'questycaptcha-edit' => 'Por redakti ĉi tiun paĝon, bonvolu respondu la demandon sube ([[Special:Captcha/help|pli da informo]]):',
 	'questycaptchahelp-text' => "Retejoj kiuj akcepti informon de publiko, kiel ĉi tiu vikio, estas ofte misuzitaj de spamistoj kiu uzas aŭtomatajn ilojn por afiŝi ligilojn al multaj retejoj. Kvankam ĉi tiu spam-ligiloj estas forigeblaj, ili estas granda ĝeno.
 
 Iufoje, ja kiam aldonante novajn retligilojn al paĝo, la vikio eble petos al vi respondi demandon. Tial ĉi tiu tasko estas malfacila por fari aŭtomate, ebligos al realaj homoj fari aldonaĵojn, kaj malebligos spamistojn kaj aliajn robotajn atakilojn.
 
-Bonvolu kontakti la [[{{MediaWiki:Grouppage-sysop}}|administrantojn de la retejo]] por helpo se ĉi tio malebligas al vi fari bonan aldonon.
+Bonvolu kontakti la [[Special:ListAdmins|administrantojn de la retejo]] por helpo se ĉi tio malebligas al vi fari bonan aldonon.
 
 Klaku la 'reiru' butonon en via retumilo por reiri al la paĝo-redaktilo.",
 );
@@ -342,19 +366,19 @@ Klaku la 'reiru' butonon en via retumilo por reiri al la paĝo-redaktilo.",
  */
 $messages['es'] = array(
 	'questycaptcha-addurl' => 'Tu edición incluye nuevos vínculos externos.
-Para ayudar a proteger contra spam automático, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):',
-	'questycaptcha-badlogin' => 'Para ayudar a proteger contra craqueo de contraseña, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):',
-	'questycaptcha-createaccount' => 'Para ayudar a proteger contra la creación automática de cuentas, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):',
+Para ayudar a proteger contra spam automático, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Para ayudar a proteger contra craqueo de contraseña, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Para ayudar a proteger contra la creación automática de cuentas, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):', # Fuzzy
 	'questycaptcha-create' => 'Para crear la página, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):',
 	'questycaptcha-edit' => 'Para editar esta página, por favor responde la pregunta que aparece abajo ([[Special:Captcha/help|más información]]):',
-	'questycaptcha-sendemail' => 'Para protegernos contra el spam automatizado por favor conteste la pregunta que aparece a continuación ([[Special:Captcha/help|más información]]):',
+	'questycaptcha-sendemail' => 'Para protegernos contra el spam automatizado por favor conteste la pregunta que aparece a continuación ([[Special:Captcha/help|más información]]):', # Fuzzy
 	'questycaptchahelp-text' => "Sitios Web que aceptan contribuciones del público, como este wiki, son constantemente abusadas por enviadores de spam quienes usan herramientas automáticas para agregar sus enlaces a muchos sitios.
 Así estos enlaces spam puedan ser borrados, son una molestia significativa.
 
 A veces, especialmente cuando se agregan nuevos enlaces web a una página, el wiki puede pedirte que respondas a una pregunta.
 Ya que esta es una tarea que es difícil de automatizar, eso permitirá que más seres humanos reales hagan sus contribuciones mientras detiene a la mayor parte de enviadores de spam y otros atacantes robóticos.
 
-Por favor contacta a los [[{{MediaWiki:Grouppage-sysop}}|administradores del sitio]] para asistencia si esto está impidiéndote hacer contribuciones legítimas.
+Por favor contacta a los [[Special:ListAdmins|administradores del sitio]] para asistencia si esto está impidiéndote hacer contribuciones legítimas.
 
 Haz click en el botón 'atrás' en tu navegador para regresar al editor de página.",
 );
@@ -364,18 +388,18 @@ Haz click en el botón 'atrás' en tu navegador para regresar al editor de pági
  */
 $messages['et'] = array(
 	'questycaptcha-addurl' => 'Sinu muudatus sisaldab uusi välislinke.
-Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks automaadistatud rämpsmuudatuste eest ([[Special:Captcha/help|lisateave]]):',
-	'questycaptcha-badlogin' => 'Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks automaatsete parooliäraarvajate eest ([[Special:Captcha/help|lisateave]]):',
-	'questycaptcha-createaccount' => 'Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks kontode automaatse loomise eest ([[Special:Captcha/help|lisateave]]):',
+Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks automaadistatud rämpsmuudatuste eest ([[Special:Captcha/help|lisateave]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks automaatsete parooliäraarvajate eest ([[Special:Captcha/help|lisateave]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks kontode automaatse loomise eest ([[Special:Captcha/help|lisateave]]):', # Fuzzy
 	'questycaptcha-create' => 'Lehekülje loomiseks vasta palun alljärgnevale küsimusele ([[Special:Captcha/help|lisateave]]):',
 	'questycaptcha-edit' => 'Selle lehekülje muutmiseks vasta palun alljärgnevale küsimusele ([[Special:Captcha/help|lisateave]]):',
-	'questycaptcha-sendemail' => 'Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks automaadistatud rämpsmuudatuste eest ([[Special:Captcha/help|lisateave]]):',
+	'questycaptcha-sendemail' => 'Palun vasta alljärgnevale küsimusele. Abinõu on kaitseks automaadistatud rämpsmuudatuste eest ([[Special:Captcha/help|lisateave]]):', # Fuzzy
 	'questycaptchahelp-text' => "Võrgukohti, mis lubavad külastajatel sisu muuta, nagu ka see viki, kasutavad sageli rämpsposti levitajad, lisades näiteks lehekülgedele reklaamilinke. Kuigi neid linke saab eemaldada, on nad siiski tülikad.
 
 Kasutajakontot registreerides või mõnele lehele uusi internetiaadresse postitades võidakse paluda sul küsimusele vastata.
 Kuna sellist tegevust on raske automaadistada, on see efektiivseks kaitseks rämpspostirobotite vastu ja lubab samas tavakasutajatel rahus muudatusi teha.
 
-Kui sul tekib raskusi muudatuste tegemisel, võta palun ühendust selle võrgukoha [[{{MediaWiki:Grouppage-sysop}}|administraatoritega]].
+Kui sul tekib raskusi muudatuste tegemisel, võta palun ühendust selle võrgukoha [[Special:ListAdmins|administraatoritega]].
 
 Redigeerimislehele naasmiseks klõpsa võrgulehitseja ''tagasi''-nuppu.",
 );
@@ -388,29 +412,53 @@ $messages['eu'] = array(
 	'questycaptcha-edit' => 'Orrialde hau aldatzeko, behean agertzen den galdera erantzun ezazu mesedez ([[Special:Captcha/help|informazio gehiago]]):',
 );
 
+/** Persian (فارسی)
+ * @author Ebraminio
+ * @author Omidh
+ */
+$messages['fa'] = array(
+	'questycaptcha-addurl' => 'ویرایش شما شامل پیوندهای جدید به بیرون است.
+برای محافظت از ویکی در برابر هرزنامه‌های خودکار، ما از شما خواهش می‌کنیم که به سوال زیر پاسخ دهید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+	'questycaptcha-badlogin' => 'برای محافظت ویکی از شکستن خودکار گذرواژه، ما با احترام از شما خواهش می‌کنیم که به سوال زیر پاسخ دهید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+	'questycaptcha-createaccount' => 'برای جلوگیری از ایجاد خودکار حساب کاربری، از شما خواهش می‌کنیم که به سوال زیر پاسخ دهید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+	'questycaptcha-create' => 'برای ایجاد صفحه، لطفاً به سوالی که در زیر آمده‌است پاسخ دهید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+	'questycaptcha-edit' => 'برای ویرایش این صفحه، لطفاً به سوال زیر پاسخ دهید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+	'questycaptcha-sendemail' => 'برای حفاظت از ویکی در برابر هرزنامه‌های خودکار، از شما خواهش می‌کنیم که به سوال زیر پاسخ دهید ([[Special:Captcha/help|اطلاعات بیشتر]]):',
+	'questycaptchahelp-text' => 'وب‌گاه‌هایی که به عموم اجازهٔ نوشتن مطلب می‌دهند، مانند این ویکی، معمولاً توسط هرزنامه فرستندگانی که از ابزارهای خودکار برای افزودن پیوندهایشان به وب‌گاه‌های متعدد استفاده می‌کنند، مورد سوءاستفاده قرار می‌گیرند.
+اگر چه این پیوندهای هرزنامه را می‌توان حذف کرد ولی باعث اعصاب‌خوردی می‌شوند.
+
+گاهی اوقات، بخصوص زمانی که در یک صفحه پیوند جدیدی اضافه می‌کنید، ویکی ممکن‌است از شما سوالی بپرسد.
+بدلیل این که انجام اینکار برای ابزارهای خودکار سخت است، اجازه می‌دهد که انسان‌های واقعی در ویکی شرکت کنند در حالی که بیشتر هرزنامه‌ها و حمله‌های خودکار متوقف می‌شود.
+
+در صورتی که سامانه به صورت پیش‌بینی‌نشده‌ای از مشارکت‌های صحیح شما جلوگیری می‌کند لطفاً با [[Special:ListAdmins|مدیران وب‌گاه]] تماس بگیرید.
+
+بر روی دکمهٔ «بازگشت» در مرورگر خود فشار دهید تا به صفحهٔ ویرایش برگردید.',
+);
+
 /** Finnish (suomi)
  * @author Crt
  * @author Nike
  */
 $messages['fi'] = array(
 	'questycaptcha-addurl' => 'Muokkauksesi sisältää uusia ulkoisia linkkejä.
-Automatisoitujen roskamuokkausten välttämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):',
-	'questycaptcha-badlogin' => 'Automatisoidun salasanan murtamisen estämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):',
-	'questycaptcha-createaccount' => 'Automaattisen käyttäjätunnusten luonnin estämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):',
+Automatisoitujen roskamuokkausten välttämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Automatisoidun salasanan murtamisen estämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Automaattisen käyttäjätunnusten luonnin estämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
 	'questycaptcha-create' => 'Luodaksesi sivun vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):',
 	'questycaptcha-edit' => 'Muokataksesi tätä sivua vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):',
-	'questycaptcha-sendemail' => 'Automatisoidun roskapostin lähettämisen estämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):',
+	'questycaptcha-sendemail' => 'Automatisoidun roskapostin lähettämisen estämiseksi vastaa alla olevaan kysymykseen ([[Special:Captcha/help|lisätietoja]]):', # Fuzzy
 	'questycaptchahelp-text' => 'Web-sivustot, jotka hyväksyvät materiaalia yleisöltä, kuten tämä wiki, joutuvat usein automaattisia työkaluja käyttävien "spämmääjien" kohteeksi jotka lisäävät linkkejä eri sivustoille. Vaikka nämä roskalinkit voidaan poistaa, ne ovat merkittävä haittatekijä.
 
 Joskus, erityisesti kun lisäät uusia Web-linkkejä sivulle, wiki saattaa pyytää sinua vastaamaan kysymykseen.
 Koska tämä on vaikeasti automatisoitava tehtävä, se antaa useimpien oikeiden henkilöiden osallistua estäen roskamuokkausten ja muiden automaattisten hyökkäysten tekijöitä.
 
-Ota yhteyttä [[{{MediaWiki:Grouppage-sysop}}|ylläpitäjiin]] saadaksesi avustusta jos tämä odottamattomasti estää sinua tekemästä asiallisia muokkauksia.
+Ota yhteyttä [[Special:ListAdmins|ylläpitäjiin]] saadaksesi avustusta jos tämä odottamattomasti estää sinua tekemästä asiallisia muokkauksia.
 
 Napsauta selaimesi \'takaisin\'-painiketta palataksesi sivumuokkaimeen.',
 );
 
 /** French (français)
+ * @author Gomoko
  * @author IAlex
  * @author Nicolas NALLET
  * @author Verdy p
@@ -418,19 +466,19 @@ Napsauta selaimesi \'takaisin\'-painiketta palataksesi sivumuokkaimeen.',
 $messages['fr'] = array(
 	'questycaptcha-desc' => "Générateur de questions ''captcha'' pour confirmer les modifications",
 	'questycaptcha-addurl' => 'Votre modification inclut de nouveaux liens externes.
-Pour nous aider dans la protection contre le pourriel automatisé, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
-	'questycaptcha-badlogin' => 'Afin de nous aider à prévenir le cassage des mots de passe par des automates, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
-	'questycaptcha-createaccount' => 'Afin de nous aider à lutter contre les créations automatiques de comptes, veuillez répondre à la question qui apparaît ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+Pour protéger le wiki contre le pourriel de modification automatisé, nous vous demandons de bien vouloir répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+	'questycaptcha-badlogin' => 'Afin de protéger le wiki contre le cassage automatisé des mots de passe, nous vous demandons de bien vouloir répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+	'questycaptcha-createaccount' => 'Afin de protéger le wiki contre les créations automatiques de comptes, nous vous demandons de bien vouloir répondre à la question qui apparaît ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
 	'questycaptcha-create' => 'Pour créer la page, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
 	'questycaptcha-edit' => 'Pour créer, modifier ou publier cette page, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
-	'questycaptcha-sendemail' => 'Afin de nous aider à prévenir le spam automatique, veuillez répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
+	'questycaptcha-sendemail' => 'Afin de protéger le wiki contre le spam automatique, nous vous demandons de bien vouloir répondre à la question ci-dessous ([[Special:Captcha/help|plus d’informations]]) :',
 	'questycaptchahelp-text' => 'Les sites web qui acceptent des contributions du public, tels que ce wiki, sont souvent victimes de polluposteurs qui utilisent des outils automatisés pour placer de nombreux liens vers leurs sites.
 Même si cette pollution peut être effacée, elle n’en reste pas moins irritante.
 
 Parfois, particulièrement lors de l’ajout de nouveaux liens externes dans une page, le wiki peut vous demander de répondre à une question.
 Cette tâche étant difficile à accomplir de façon automatisée, cela permet à la plupart des humains de réaliser leurs contributions tout en stoppant la plupart des polluposteurs et autres attaquants robotisés.
 
-Veuillez contacter [[{{MediaWiki:Grouppage-sysop}}|les administrateurs du site]] si cela vous empêche de façon inattendue de faire des contributions légitimes.
+Veuillez contacter [[Special:ListAdmins|les administrateurs du site]] si cela vous empêche de façon inattendue de faire des contributions légitimes.
 
 Cliquez sur le bouton « Précédent » de votre navigateur pour revenir à la page de modification.',
 );
@@ -441,19 +489,19 @@ Cliquez sur le bouton « Précédent » de votre navigateur pour revenir à la p
 $messages['gl'] = array(
 	'questycaptcha-desc' => 'Xerador de preguntas CAPTCHA para Confirm Edit',
 	'questycaptcha-addurl' => 'A súa edición inclúe novas ligazóns externas.
-Para axudar na protección contra o spam automatizado, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
-	'questycaptcha-badlogin' => 'Para axudar na protección contra o descifrado automatizado de contrasinais, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
-	'questycaptcha-createaccount' => 'Para axudar na protección contra a creación automática de contas, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
+Para protexer o wiki contra o spam automático, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
+	'questycaptcha-badlogin' => 'Para protexer o wiki contra o roubo de contrasinais, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
+	'questycaptcha-createaccount' => 'Para protexer o wiki contra a creación automática de contas, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
 	'questycaptcha-create' => 'Para crear a páxina, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
 	'questycaptcha-edit' => 'Para editar esta páxina, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
-	'questycaptcha-sendemail' => 'Para contribuír na protección contra o spam automatizado, responda a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
+	'questycaptcha-sendemail' => 'Para protexer o wiki contra o spam automático, conteste a pregunta que aparece a continuación ([[Special:Captcha/help|máis información]]):',
 	'questycaptchahelp-text' => 'Os sitios web que aceptan publicar as contribucións dos usuarios, coma este wiki, sofren, con frecuencia, o abuso por parte de spammers que usan ferramentas que automatizan a inclusión de lixo en forma de ligazóns publicitarias, nunha chea de páxinas, en pouco tempo.
 Mentres as devanditas ligazóns non son eliminadas supoñen unha molestia e unha perda de tempo.
 
 En ocasións, en particular cando engada algunha nova ligazón externa, o wiki pode pedirlle que conteste unha pregunta.
 Como esta tarefa é difícil de automatizar, permite distinguir entre persoas e robots e dificulta os ataques automatizados dos spammers.
 
-Por favor, póñase en contacto cun [[{{MediaWiki:Grouppage-sysop}}|administrador do sitio]] para solicitar axuda se o sistema lle impide rexistrarse para facer contribucións lexítimas.
+Por favor, póñase en contacto cun [[Special:ListAdmins|administrador do sitio]] para solicitar axuda se o sistema lle impide rexistrarse para facer contribucións lexítimas.
 
 Prema no botón "Atrás" do seu navegador para volver á páxina de edición.',
 );
@@ -464,19 +512,19 @@ Prema no botón "Atrás" do seu navegador para volver á páxina de edición.',
  */
 $messages['gsw'] = array(
 	'questycaptcha-addurl' => 'In Dynere Bearbeitig het s neji extärni Links.
-As Schutz gege automatischi Spam, beantwort bitte d Frog, wu do unter gnännt wird ([[Special:Captcha/help|meh Informatione]]):',
-	'questycaptcha-badlogin' => 'As Schutz gege ne automatisch Passwort-Knacke, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):',
-	'questycaptcha-createaccount' => 'As Schutz gege ne automatisch Aalege vu Benutzerkonte, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):',
+As Schutz gege automatischi Spam, beantwort bitte d Frog, wu do unter gnännt wird ([[Special:Captcha/help|meh Informatione]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'As Schutz gege ne automatisch Passwort-Knacke, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'As Schutz gege ne automatisch Aalege vu Benutzerkonte, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):', # Fuzzy
 	'questycaptcha-create' => 'Go d Syte aalege, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):',
 	'questycaptcha-edit' => 'Go die Syte bearbeite, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):',
-	'questycaptcha-sendemail' => 'As Schutz gege e automatischs Spamming, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):',
+	'questycaptcha-sendemail' => 'As Schutz gege e automatischs Spamming, beantwort bitte d Frog, wu do unte gnännt wird ([[Special:Captcha/help|meh Informatione]]):', # Fuzzy
 	'questycaptchahelp-text' => "Websyte, wu jede cha byytrage, wie des Wiki, wäre vylmol missbrucht vu Spammer, wu automatischi Wärchzyg bruche go ihri Gleicher (Links) in meglischt vyli Syte yyfiege.
 Au wänn die Spamgleicher chenne wider uusegnuu wäre, sin si einewäg e zimlig Ärgernis.
 
 Ab un zue, vor allem wänn neji Netzgleicher (Weblinks) in e Syte yygfiegt wäre, forderet s Wiki Di villicht uf, e Frog z beantworte.
 Wel des e Ufgab isch, wu mer schwär cha automatisiere, isch des e Megligkeit, Spammer un anderi automatischi Attacke z verhindere, derwylscht di meischte mänschlige Benutzer ihri Bearbeitige chenne byytrage.
 
-Bitte nimm Kontakt uf zue dr [[{{MediaWiki:Grouppage-sysop}}|Website-Administratore]] fir Hilf, wänn des unerwarteterwys verhinderet, ass Du chasch rächtmäßigi Bearbeitige mache.
+Bitte nimm Kontakt uf zue dr [[Special:ListAdmins|Website-Administratore]] fir Hilf, wänn des unerwarteterwys verhinderet, ass Du chasch rächtmäßigi Bearbeitige mache.
 
 Druck dr 'Zruck'-Chnopf in Dyym Browser go zuem Bearbeitigsfänschter zruckgoh.",
 );
@@ -487,19 +535,19 @@ Druck dr 'Zruck'-Chnopf in Dyym Browser go zuem Bearbeitigsfänschter zruckgoh."
  */
 $messages['he'] = array(
 	'questycaptcha-addurl' => 'עריכתכם כוללת קישורים חיצוניים חדשים.
-כהגנה מפני ספאם אוטומטי, אנא ענו על השאלה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):',
-	'questycaptcha-badlogin' => 'כהגנה מפני פריצת סיסמאות אוטומטית, אנא ענו על השאלה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):',
-	'questycaptcha-createaccount' => 'כהגנה מפני יצירת חשבונות אוטומטית, אנא ענו על השאלה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):',
+כהגנה מפני ספאם אוטומטי, אנא ענו על השאלה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'כהגנה מפני פריצת סיסמאות אוטומטית, אנא ענו על השאלה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'כהגנה מפני יצירת חשבונות אוטומטית, אנא ענו על השאלה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):', # Fuzzy
 	'questycaptcha-create' => 'כדי ליצור את הדף, אנא ענו על השאלה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):',
 	'questycaptcha-edit' => 'כדי לערוך את הדף, אנא ענו על השאלה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):',
-	'questycaptcha-sendemail' => 'כדי לסייע בהגנה מפני הודעות ספאם אוטומטיות, נא לענות על השאלה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):',
+	'questycaptcha-sendemail' => 'כדי לסייע בהגנה מפני הודעות ספאם אוטומטיות, נא לענות על השאלה המופיעה להלן ([[Special:Captcha/help|מידע נוסף]]):', # Fuzzy
 	'questycaptchahelp-text' => "פעמים רבות מנצלים ספאמרים אתרים שמקבלים תוכן מהציבור, כמו אתר הוויקי הזה, כדי להוסיף את הקישורים שלהם לאתרים רבים באינטרנט, באמצעות כלים אוטומטיים.
 אמנם ניתן להסיר את קישורי הספאם הללו, אך הם מהווים מטרד משמעותי.
 
 לעתים, בעיקר כשאתם מכניסים קישורי אינטרנט חדשים לתוך עמוד, אתר הוויקי עשוי לבקש מכם לענות על שאלה.
 כיוון שזו משימה שקשה לבצעה בצורה אוטומטית, הדבר יאפשר לבני־אדם אמיתיים לשלוח את הדפים, אך יעצור את רוב הספאמרים והמתקיפים הרובוטיים האחרים.
 
-אנא צרו קשר עם [[{{MediaWiki:Grouppage-sysop}}|מפעילי המערכת]] לעזרה אם המערכת מונעת מכם באופן בלתי צפוי לבצע עריכות לגיטימיות.
+אנא צרו קשר עם [[Special:ListAdmins|מפעילי המערכת]] לעזרה אם המערכת מונעת מכם באופן בלתי צפוי לבצע עריכות לגיטימיות.
 
 לחצו על הכפתור 'Back' בדפדפן שלכם כדי לחזור לדף העריכה.",
 );
@@ -509,18 +557,18 @@ $messages['he'] = array(
  */
 $messages['hsb'] = array(
 	'questycaptcha-addurl' => 'Twoja změna wobsahuje nowe eksterne wotkazy.
-Za škit přećiwo awtomatizowanemu spamej, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):',
-	'questycaptcha-badlogin' => 'Za škit přećiwo awtomatiskemu kradnjenju hesła, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):',
-	'questycaptcha-createaccount' => 'Za škit přećiwo awtomatizowanemu tworjenju kontow, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalš informacije]]):',
+Za škit přećiwo awtomatizowanemu spamej, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Za škit přećiwo awtomatiskemu kradnjenju hesła, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Za škit přećiwo awtomatizowanemu tworjenju kontow, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalš informacije]]):', # Fuzzy
 	'questycaptcha-create' => 'Zo by stronu wutworił, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):',
 	'questycaptcha-edit' => 'Zo by tutu stronu změnił, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):',
-	'questycaptcha-sendemail' => 'Za škit přećiwo awtomatiskemu spamowanju, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):',
+	'questycaptcha-sendemail' => 'Za škit přećiwo awtomatiskemu spamowanju, wotmołw prošu na prašenje, kotrež so deleka jewi ([[Special:Captcha/help|dalše informacije]]):', # Fuzzy
 	'questycaptchahelp-text' => 'Websydła, kotrež přinoški ze zjawnosće akceptuja, kaž tutón wiki, so často wot spamarjow znjewužiwaja, kotřiž awtomatizowane nastroje wužiwaja, zo bychu swoje wotkazy wjele sydłam přidali. Hačrunjež so tute spamowe wotkazy hodźa wotstronić, su wone njesnadne mjerzanje.
 
 Druhdy, wosebje, hdyž so nowe webwotkazy stronje přidawaja, wiki so ći něčeho praša.
 Dokelž to je nadawk, kotryž hodźi so jenož ćežko awtomatizować, dowoluje to woprawdźitym wosobam swoje přinoški wotpósłać, mjeztym zo so najwjace spamarjow a druhich nadpadowacych botow blokuje. 
 
-Prošu staj so z [[{{MediaWiki:Grouppage-sysop}}|administratorami sydła]] z prostwu wo pomoc do zwiska, jeli to će haći legitimne přinoški pósłać. 
+Prošu staj so z [[Special:ListAdmins|administratorami sydła]] z prostwu wo pomoc do zwiska, jeli to će haći legitimne přinoški pósłać. 
 
 Klikń na tłócatko "Wróćo" w swojim wobhladowaku, zo by so k wobdźěłowanskemu woknu wróćił.',
 );
@@ -530,18 +578,18 @@ Klikń na tłócatko "Wróćo" w swojim wobhladowaku, zo by so k wobdźěłowans
  */
 $messages['hu'] = array(
 	'questycaptcha-addurl' => 'A szerkesztésed új külső hivatkozásokat tartalmaz.
-Segíts az automatikus spamek elleni védekezésben, kérlek válaszolj az alábbi kérdésre ([[Special:Captcha/help|további információk]]):',
-	'questycaptcha-badlogin' => 'Segíts az automatikus jelszófeltörés kivédésében, kérlek válaszolj az alábbi kérdésre ([[Special:Captcha/help|további információk]]):',
-	'questycaptcha-createaccount' => 'Segíts az automatikus felhasználói fiók készítés kivédésében, kérlek válszolj az alábbi kérdésre ([[Special:Captcha/help|további információk]]):',
+Segíts az automatikus spamek elleni védekezésben, kérlek válaszolj az alábbi kérdésre ([[Special:Captcha/help|további információk]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Segíts az automatikus jelszófeltörés kivédésében, kérlek válaszolj az alábbi kérdésre ([[Special:Captcha/help|további információk]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Segíts az automatikus felhasználói fiók készítés kivédésében, kérlek válszolj az alábbi kérdésre ([[Special:Captcha/help|további információk]]):', # Fuzzy
 	'questycaptcha-create' => 'Kérlek válaszolj az alábbi kérdésre a lap létrehozásához ([[Special:Captcha/help|további információk]]):',
 	'questycaptcha-edit' => 'A lap szerkesztéséhez kérlek válaszolj az alábbi kérdésre ([[Special:Captcha/help|további információk]]):',
-	'questycaptcha-sendemail' => 'Hogy segíts az automatikus spammelés elleni védekezésben, kérünk válaszolj az alábbi kérdésre ([[Special:Captcha/help|segítség]]):',
+	'questycaptcha-sendemail' => 'Hogy segíts az automatikus spammelés elleni védekezésben, kérünk válaszolj az alábbi kérdésre ([[Special:Captcha/help|segítség]]):', # Fuzzy
 	'questycaptchahelp-text' => 'Az olyan weboldalakat, amelyekre bárki írhat, gyakran támadják meg spammerek olyan eszközök felhasználásával, amelyek képesek automatikusan, emberi felügyelet nélkül elhelyezni hivatkozásokat sok különböző oldalon. 
 
 Néha, különösen ha egy új külső hivatkozást teszel egy szócikkbe, a wiki egy egy kérdés megválaszolására kérhet.
 Mivel ezt nehéz automatizálni, a valódi szerkesztőknek lehetőségük lesz szerkeszteni, miközben kiszűri a legtöbb spammert és más automatizált kártevőket.
 
-Ha ez nem várt módon akadályoz a hasznos közreműködéseidben, segítségért kérlek vedd fel a kapcsolatot [[{{MediaWiki:Grouppage-sysop}}|az oldal adminisztrátoraival]].
+Ha ez nem várt módon akadályoz a hasznos közreműködéseidben, segítségért kérlek vedd fel a kapcsolatot [[Special:ListAdmins|az oldal adminisztrátoraival]].
 
 Használd a böngésződ „vissza” gombját a szöveg szerkesztéséhez való visszalépéshez.',
 );
@@ -551,19 +599,19 @@ Használd a böngésződ „vissza” gombját a szöveg szerkesztéséhez való
  */
 $messages['ia'] = array(
 	'questycaptcha-addurl' => 'Tu modification include nove ligamines externe.
-Pro adjutar nos in le protection contra le spam automatisate, per favor responde al question ci infra ([[Special:Captcha/help|plus info]]):',
-	'questycaptcha-badlogin' => 'Pro adjutar nos in le protection contra le deciframento automatisate de contrasignos, per favor responde al question ci infra ([[Special:Captcha/help|plus info]]):',
-	'questycaptcha-createaccount' => 'Pro adjutar nos in le protection contra le creation automatisate de contos, per favor responde al question ci infra ([[Special:Captcha/help|plus info]]):',
+Pro adjutar a proteger le wiki contra le spam automatisate, per favor responde al question que appare infra ([[Special:Captcha/help|plus info]]):',
+	'questycaptcha-badlogin' => 'Pro adjutar a proteger le wiki contra le furto automatisate de contrasignos, per favor responde al question que appare infra ([[Special:Captcha/help|plus info]]):',
+	'questycaptcha-createaccount' => 'Pro adjutar a proteger le wiki contra le creation automatisate de contos, per favor responde al question que appare infra ([[Special:Captcha/help|plus info]]):',
 	'questycaptcha-create' => 'Pro crear le pagina, per favor responde al question ci infra ([[Special:Captcha/help|plus info]]):',
 	'questycaptcha-edit' => 'Pro modificar iste pagina, per favor responde al question ci infra ([[Special:Captcha/help|plus info]]):',
-	'questycaptcha-sendemail' => 'Pro adjutar nos in le protection contra le spam automatic, per favor responde al question hic infra ([[Special:Captcha/help|plus info]]):',
+	'questycaptcha-sendemail' => 'Pro adjutar a proteger le wiki contra le spam automatisate, per favor responde al question que appare infra ([[Special:Captcha/help|plus info]]):',
 	'questycaptchahelp-text' => "Le sitos web que accepta contributiones del publico, como iste wiki, es frequentemente abusate per spammatores que usa instrumentos automatic pro publicar lor ligamines in multe sitos.
 Ben que iste ligamines spam pote esser eliminate, illos constitue un considerabile molestia.
 
 Alcun vices, specialmente quando tu adde nove ligamines web a un pagina, le wiki pote demandar te de responder a un question.
 Post que isto es un carga difficile de automatisar, isto permittera al major parte del humanos real de facer lor contributiones, durante que le major parte del spammatores e altere attaccatores robotic es stoppate.
 
-Per favor contacta le [[{{MediaWiki:Grouppage-sysop}}|administratores del sito]] pro assistentia si isto insperatemente te impedi de facer contributiones legitime.
+Per favor contacta le [[Special:ListAdmins|administratores del sito]] pro assistentia si isto insperatemente te impedi de facer contributiones legitime.
 
 Clicca le button 'retro' in tu navigator pro retornar al editor de paginas.",
 );
@@ -577,23 +625,23 @@ Clicca le button 'retro' in tu navigator pro retornar al editor de paginas.",
 $messages['id'] = array(
 	'questycaptcha-addurl' => 'Suntingan Anda menambahkan pranala eksternal yang baru.
 Untuk melindungi dari spam otomatis, mohon jawab pertanyaan di bawah ini
-([[Special:Captcha/help|info lebih lanjut]]):',
+([[Special:Captcha/help|info lebih lanjut]]):', # Fuzzy
 	'questycaptcha-badlogin' => 'Untuk melindungi dari pemecah kata sandi otomatis, mohon jawab pertanyaan di bawah ini
-([[Special:Captcha/help|info lebih lanjut]]):',
+([[Special:Captcha/help|info lebih lanjut]]):', # Fuzzy
 	'questycaptcha-createaccount' => 'Untuk melindungi dari pembuatan akun otomatis, mohon jawab pertanyaan di bawah ini
-([[Special:Captcha/help|info lebih lanjut]]):',
+([[Special:Captcha/help|info lebih lanjut]]):', # Fuzzy
 	'questycaptcha-create' => 'Untuk membuat halaman, mohon jawab pertanyaan di bawah ini
 ([[Special:Captcha/help|info lebih lanjut]]):',
 	'questycaptcha-edit' => 'Untuk menyunting halaman ini, mohon jawab pertanyaan di bawah ini
 ([[Special:Captcha/help|info lebih lanjut]]):',
-	'questycaptcha-sendemail' => 'Sebagai pelindungan terhadap spam otomatis, silahkan jawab pertanyaan di bawah ini ([[Special:Captcha/help|info lengkap]]):',
+	'questycaptcha-sendemail' => 'Sebagai pelindungan terhadap spam otomatis, silahkan jawab pertanyaan di bawah ini ([[Special:Captcha/help|info lengkap]]):', # Fuzzy
 	'questycaptchahelp-text' => "Situs-situs web yang menerima tulisan dari publik, seperti wiki ini, kerapkali disalahgunakan oleh pengguna-pengguna yang tidak bertanggungjawab untuk mengirimkan spam dengan menggunakan program-program otomatis guna membahkan prnala mereka pada berbagai situs web.
 Walaupun pranala-pranala spam tersebut dapat dibuang, tetapi tetap saja menimbulkan gangguan yang berarti.
 
 Kadang-kadang, terutama sat menambahkan pranala web baru ke suatu halaman, wiki akan meminta anda menjawab suatu pertanyaan. 
 Karena ini merupakan suatu pekerjaan yang sulit diotomatisasi, pembatasan ini akan dapat dengan mudah dilalui oleh manusia, sekaligus juga dapat menghentikan hampir semua serangan spam dan robot otomatis lainnya.
 
-Silakan hubungi [[{{MediaWiki:Grouppage-sysop}}|pengurus]] untuk meminta bantuan jika hal ini menghambat anda untuk mengirimkan suntingan yang layak.
+Silakan hubungi [[Special:ListAdmins|pengurus]] untuk meminta bantuan jika hal ini menghambat anda untuk mengirimkan suntingan yang layak.
 
 Tekan tombol 'back' di penjelajah web Anda untuk kembali ke halaman penyuntingan.",
 );
@@ -603,19 +651,19 @@ Tekan tombol 'back' di penjelajah web Anda untuk kembali ke halaman penyuntingan
  */
 $messages['ilo'] = array(
 	'questycaptcha-addurl' => 'Ti inurnos mo ket adda nagyan na a baro a panilpo ti ruar.
-Tapno  makasalaknib kadagiti automatiko a spam, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):',
-	'questycaptcha-badlogin' => 'Tapno  makasalaknib kadagiti automatiko a pinagsulbar ti kontrasenias, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):',
-	'questycaptcha-createaccount' => 'Tapno  makasalaknib kadagiti automatiko a pinagaramid ti pakabilangan, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):',
+Tapno  makasalaknib kadagiti automatiko a spam, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Tapno  makasalaknib kadagiti automatiko a pinagsulbar ti kontrasenias, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Tapno  makasalaknib kadagiti automatiko a pinagaramid ti pakabilangan, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):', # Fuzzy
 	'questycaptcha-create' => 'Tapno makaaramid ti panid, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):',
 	'questycaptcha-edit' => 'Tapno makaurnoy ditoya panid, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):',
-	'questycaptcha-sendemail' => 'Tapno  makasalaknib kadagiti automatiko a pinagspam, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):',
+	'questycaptcha-sendemail' => 'Tapno  makasalaknib kadagiti automatiko a pinagspam, pangaasim a sungbatan ti saludsud a nagparang dita baba. ([[Special:Captcha/help|adu pay a pakaammo]]):', # Fuzzy
 	'questycaptchahelp-text' => "Dagiti sapot a pagsaadan nga agaw-awat kadagiti maipablaak iti publiko, kasla daytoy a wiki, ket kanayon nga inabuso dagiti spammers nga agus-usar ti automatiko a ramramit ti pinagipablaak da kadagiti kukua da a panilpo ti adu a pagsasaadan. 
 Maikkat met dagitoy a panilpo, mgen makariri da unay.
 
 No sagpaminsan pay, nangruna no agikabil kadagiti baro a panilpo ti sapot iti panid, ti wiki ket agdamag kenka nga agsungbat ti maysa a saludsod. 
 Yantangay daytoy ket obra a narigat a ma-automatiko, agpalubos kadagiti agpayso a tattao ti agipablaak bayat nga agpasardeng ti kaaduan a spammers ken dagiti robot nga agraraut.
 
-Pangngaasi a kontaken ti [[{{MediaWiki:Grouppage-sysop}}|administrador ti pagsaadan ]] para iti pannulong no daytoy ket saan a napadpadaanan a pawilan na ti agpayso a pinagbaplaak mo.
+Pangngaasi a kontaken ti [[Special:ListAdmins|administrador ti pagsaadan ]] para iti pannulong no daytoy ket saan a napadpadaanan a pawilan na ti agpayso a pinagbaplaak mo.
 
 Peslen ti 'agsubli' a buton dita pagbasabasam (browser) ti agsubli idiay panid ti pinagurnos.",
 );
@@ -626,17 +674,18 @@ Peslen ti 'agsubli' a buton dita pagbasabasam (browser) ti agsubli idiay panid t
  * @author Nemo bis
  */
 $messages['it'] = array(
-	'questycaptcha-addurl' => "La modifica richiesta aggiunge dei collegamenti esterni alla pagina; come misura precauzionale contro l'inserimento automatico di spam, si prega di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):",
-	'questycaptcha-badlogin' => 'Come misura precauzionale contro i tentativi di forzatura automatica della password, si prega di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
-	'questycaptcha-createaccount' => 'Come misura precauzionale contro i tentativi di creazione automatica degli account, si prega di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
+	'questycaptcha-addurl' => 'La modifica richiesta aggiunge dei collegamenti esterni alla pagina.
+Per proteggere il wiki dallo spam automatico, ti chiediamo gentilmente di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
+	'questycaptcha-badlogin' => 'Per proteggere il wiki dalla forzatura automatica delle password, ti chiediamo gentilmente di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
+	'questycaptcha-createaccount' => 'Per proteggere il wiki dalla creazione automatica di nuovi accessi, ti chiediamo gentilmente di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
 	'questycaptcha-create' => 'Per creare la pagina si prega di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
 	'questycaptcha-edit' => 'Per modificare questa pagina si prega di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
-	'questycaptcha-sendemail' => 'Come misura precauzionale nei confronti dei messaggi di spam automatici, si prega di inserire nella casella sottostante le parole che compaiono di seguito ([[Special:Captcha/help|come funziona?]]):',
+	'questycaptcha-sendemail' => 'Per proteggere il wiki dalle modifiche automatiche che aggiungono spam, ti chiediamo gentilmente di rispondere alla domanda che compare di seguito ([[Special:Captcha/help|come funziona?]]):',
 	'questycaptchahelp-text' => 'Capita spesso che i siti web che accettano contributi pubblici, come questo wiki, siano presi di mira da persone che usano strumenti automatici per inserire collegamenti pubblicitari verso un gran numero di siti (spam). Per quanto i collegamenti indesiderati si possano rimuovere, si tratta comunque di una seccatura non indifferente. 
 
 In alcuni casi, ad esempio quando si tenta di aggiungere nuovi collegamenti web in una pagina, il software wiki può richiedere di rispondere a una domanda. Poiché si tratta di un\'azione difficile da replicare da parte di un computer, questo meccanismo consente a (quasi tutti) gli utenti reali di effettuare i proprio contributi, impedendo l\'accesso alla maggior parte degli spammer e degli altri attacchi automatizzati. 
 
-Se queste procedure impediscono contributi che si ritengono legittimi, si prega di contattare gli [[{{MediaWiki:Grouppage-sysop}}|amministratori del sito]] e chiedere loro assistenza. 
+Se queste procedure impediscono contributi che si ritengono legittimi, si prega di contattare gli [[Special:ListAdmins|amministratori del sito]] e chiedere loro assistenza. 
 
 Fare clic sul pulsante "indietro" del browser per tornare alla pagina di modifica.',
 );
@@ -649,17 +698,17 @@ Fare clic sul pulsante "indietro" del browser per tornare alla pagina di modific
 $messages['ja'] = array(
 	'questycaptcha-desc' => 'Confirm Edit 用の質問形式 CAPTCHA ジェネレーター',
 	'questycaptcha-addurl' => 'あなたは新しい外部リンクを追加しようとしています。
-自動でのスパム攻撃を防ぐため、下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
-	'questycaptcha-badlogin' => '自動でのパスワードクラック攻撃を防ぐため、下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
-	'questycaptcha-createaccount' => 'アカウントの自動登録を防ぐため、下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
+ウィキへの自動スパム攻撃を防ぐため、お手数をおかけしますが下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
+	'questycaptcha-badlogin' => 'ウィキへの自動パスワードクラック攻撃を防ぐため、お手数をおかけしますが下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
+	'questycaptcha-createaccount' => 'ウィキでのアカウント自動作成を防ぐため、お手数をおかけしますが下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
 	'questycaptcha-create' => 'ページを新規作成するには、下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
 	'questycaptcha-edit' => 'このページを編集するには、下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
-	'questycaptcha-sendemail' => '自動でのスパム攻撃を防ぐため、下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
+	'questycaptcha-sendemail' => 'ウィキへの自動スパム攻撃を防ぐため、お手数をおかけしますが下記の確認用の質問に回答してください ([[Special:Captcha/help|詳細]]):',
 	'questycaptchahelp-text' => '一般からの投稿を受け付けるこのウィキのようなウェブサイトは、自動投稿ツールを使って多くのサイトにリンクを張ってまわるスパマーにより荒らされがちです。このようなスパムは除去できるものの、その作業は大変に面倒なものです。
 
 このため、このウィキではときどき、特に新しい外部リンクがページに追加されたときなどに、質問に答えていただくようお願いすることがあります。この作業は自動化が難しいため、スパマーなどのプログラムを用いた攻撃をほぼ阻止しつつ、大半の生身の人間による投稿を可能にします。
 
-正当な投稿をするにあたって本機能が障害となっている場合、[[{{MediaWiki:Grouppage-sysop}}|サイト管理者]]に連絡して協力を求めてください。
+正当な投稿をするにあたって本機能が障害となっている場合、[[Special:ListAdmins|サイト管理者]]に連絡して協力を求めてください。
 
 ページの編集に戻るには、ブラウザーの「戻る」ボタンを押してください。',
 );
@@ -671,19 +720,19 @@ $messages['ja'] = array(
 $messages['ko'] = array(
 	'questycaptcha-desc' => '편집 확인에 대한 탐구적인 CAPCHA(캡차) 생성기',
 	'questycaptcha-addurl' => '편집에 새로운 바깥 링크가 포함되어 있습니다.
-자동화된 스팸으로부터 보호하기 위해, 아래에 보이는 질문에 답해주세요 ([[Special:Captcha/help|자세한 정보]]):',
-	'questycaptcha-badlogin' => '자동화된 비밀번호 깨기로부터 보호하기 위해, 아래에 보이는 질문에 답해주세요 ([[Special:Captcha/help|자세한 정보]]):',
-	'questycaptcha-createaccount' => '자동화된 계정 만들기로부터 보호하기 위해, 아래에 보이는 질문에 답해주세요 ([[Special:Captcha/help|자세한 정보]]):',
+자동화된 스팸으로부터 보호하기 위해, 아래에 보이는 질문에 답해주세요 ([[Special:Captcha/help|자세한 정보]]):', # Fuzzy
+	'questycaptcha-badlogin' => '자동화된 비밀번호 깨기로부터 보호하기 위해, 아래에 보이는 질문에 답해주세요 ([[Special:Captcha/help|자세한 정보]]):', # Fuzzy
+	'questycaptcha-createaccount' => '자동화된 계정 만들기로부터 보호하기 위해, 아래에 보이는 질문에 답해주세요 ([[Special:Captcha/help|자세한 정보]]):', # Fuzzy
 	'questycaptcha-create' => '문서를 만드려면 아래에 보이는 질문에 답해주세요 ([[Special:Captcha/help|자세한 정보]]):',
 	'questycaptcha-edit' => '이 문서를 편집하려면 아래에 보이는 질문에 답해주세요 ([[Special:Captcha/help|자세한 정보]]):',
-	'questycaptcha-sendemail' => '자동화된 스팸으로부터 보호하기 위해, 아래에 보이는 질문에 답해주세요 ([[Special:Captcha/help|자세한 정보]]):',
+	'questycaptcha-sendemail' => '자동화된 스팸으로부터 보호하기 위해, 아래에 보이는 질문에 답해주세요 ([[Special:Captcha/help|자세한 정보]]):', # Fuzzy
 	'questycaptchahelp-text' => '이 위키와 같이 사람의 공개적인 참여가 가능한 웹 사이트에서는 자동 프로그램이 스팸을 뿌리는 경우가 있습니다.
 물론 이러한 스팸은 제거할 수는 있지만 번거로운 작업이 늘어납니다.
 
 이러한 스팸을 방지하기 위해서, 이 위키의 문서에 웹 사이트 주소를 추가하는 등의 행동을 할 경우에는 질문에 답해달라고 하는 경우가 있습니다.
 이 글자 입력 작업은 자동 프로그램을 만들기가 힘들기 때문에 스팸을 효과적으로 막으면서 일반 사용자를 막지 않을 수 있습니다.
 
-예기치않게 정당한 행동을 하지 못하도록 막는다면 [[{{MediaWiki:Grouppage-sysop}}|사이트 관리자]]에게 도움을 요청해 주세요.
+예기치않게 정당한 행동을 하지 못하도록 막는다면 [[Special:ListAdmins|사이트 관리자]]에게 도움을 요청해 주세요.
 
 이전 화면으로 돌아가려면 웹 브라우저의 "뒤로" 버튼을 클릭하세요.',
 );
@@ -695,13 +744,13 @@ $messages['ksh'] = array(
 	'questycaptcha-addurl' => 'Ding Änderung säz neu Lengks noh ußerhallef vum Wiki.
 Öm uns jäje der automattesch dobeijedonn <i lang="en">SPAM</i> ze hellefe,
 bes esu joot un donn di Frooch be_anntwoode, di heh dronger shteiht.
-([[Special:Captcha/help|Mieh Enfommazjuhne]])',
+([[Special:Captcha/help|Mieh Enfommazjuhne]])', # Fuzzy
 	'questycaptcha-badlogin' => 'Öm uns jäje et automattesche Paßwootknacke ze hellefe,
 bes esu joot un donn di Frooch be_anntwoode, di heh dronge shteiht.
-([[Special:Captcha/help|Mieh Enfommazjuhne]])',
+([[Special:Captcha/help|Mieh Enfommazjuhne]])', # Fuzzy
 	'questycaptcha-createaccount' => 'Öm uns jäje et maßesch automattesch neu Metmaacher Aanlääje ze hellefe,
 bes esu joot un donn di Frooch be_anntwoode, di heh dronger shteiht.
-([[Special:Captcha/help|Mieh Enfommazjuhne]])',
+([[Special:Captcha/help|Mieh Enfommazjuhne]])', # Fuzzy
 	'questycaptcha-create' => 'Öm di Sigg aanzelääje,
 bes esu joot, donn di Frooch be_anntwoode, di heh dronge shteiht.
 ([[Special:Captcha/help|Mieh Enfommazjuhne]])',
@@ -710,7 +759,7 @@ bes esu joot, donn di Frooch be_anntwoode, di heh dronge shteiht.
 ([[Special:Captcha/help|Mieh Enfommazjuhne]])',
 	'questycaptcha-sendemail' => 'Öm et Wiki jääje automattesch enjedraare SPAM ze schötze,
 bes esu joot, donn di Frooch be_anntwoode, di heh dronger shteiht.
-([[Special:Captcha/help|Mieh Enfommazjuhne]])',
+([[Special:Captcha/help|Mieh Enfommazjuhne]])', # Fuzzy
 	'questycaptchahelp-text' => 'Websigge, di Beijdrääsch vun de Öffentleschkeit aannämme, wi dat Wiki heh,
 wääde öff vun <i lang="en">SPAM</i>mer heimjesöhk. Di bruche Projramme
 för ier Lengks udder annder Jedrieße automattesch en dousende Wikis erin
@@ -722,7 +771,7 @@ Wiki Desch bedde, en Frooch ze be_antwoode. Nohdämm dat schwiiresch mem
 automattesche Projramm henzekrijje es, löht et de Minsche ier Beidrääsch
 maache, deiht ävver de miehßte <i lang="en">SPAM</i>mer un ander Robots affhallde.
 
-Donn Desh aan de [[{{MediaWiki:Grouppage-sysop}}|Köbeße vum Wiki]] wende,
+Donn Desh aan de [[Special:ListAdmins|Köbeße vum Wiki]] wende,
 wann et Der trozdämm en de Fööß kütt, un De Dinge aanshtändejje Beijdraach
 nit en et Wiki kriß!
 
@@ -733,22 +782,23 @@ di Sigg zom Ändere, woh De jraad wohß.',
 /** Luxembourgish (Lëtzebuergesch)
  * @author Les Meloures
  * @author Robby
+ * @author Soued031
  */
 $messages['lb'] = array(
 	'questycaptcha-addurl' => "An Ärer Ännerung sinn nei extern Linken.
-Fir d'Protectioun géint automatesche Spam ze vergréisseren, beäntwert w.e.g. déi Fro hei ënnendrënner ([[Special:Captcha/help|méi Informatiounen]]):",
-	'questycaptcha-badlogin' => "Fir d'Protectioun géint d'automatiséiert Knacke vu Passwierder ze vergréisseren, beäntwert w.e.g. déi Fro hei ënnedrënner ([[Special:Captcha/help|méi Informatiounen]]):",
-	'questycaptcha-createaccount' => "Fir d'Protectioun géint d'automatiséiert Uleeë vu Benotzerkonten ze vergréisseren, beäntwert w.e.g. déi Fro hei ënnendrënner ([[Special:Captcha/help|méi Informatiounen]]):",
+Fir d'Wiki géint automatesche Spam-Ännerungen ze schützen, froe mir Iech d'Fro hei ënnendrënner ze beäntweren ([[Special:Captcha/help|méi Informatiounen]]):",
+	'questycaptcha-badlogin' => "Fir dës Wiki géint d'automatiséiert Knacke vu Passwierder ze schütze, froe mir Iech d'Fro hei ënnendrënner ze beäntweren ([[Special:Captcha/help|méi Informatiounen]]):",
+	'questycaptcha-createaccount' => "Fir d'Wiki géint d'automatiséiert Uleeë vu Benotzerkonten ze schützen, froe mir Iech d'Fro hei ënnendrënner ze beäntweren ([[Special:Captcha/help|méi Informatiounen]]):",
 	'questycaptcha-create' => "Fir d'Säit unzeleeën, beäntwert w.e.g. déi Fro hei ënnedrënner ([[Special:Captcha/help|méi Informatiounen]]):",
 	'questycaptcha-edit' => "Fir dës Säit z'änneren, beäntwert w.e.g. déi Fro hei ënnedrënner ([[Special:Captcha/help|méi Informatiounen]]):",
-	'questycaptcha-sendemail' => 'Fir ze hëllefe eis géint automatiséierte Spam ze schütze, beäntwert w.e.g. déi Fro hei ënnendrënner ([[Special:Captcha/help|méi Informatiounen]]):',
+	'questycaptcha-sendemail' => 'Fir ze hëllefe dës Wiki géint automatiséierte Spam ze schütze, beäntwert w.e.g. déi Fro hei ënnendrënner ([[Special:Captcha/help|méi Informatiounen]]):',
 	'questycaptchahelp-text' => "Websäiten, déi et jiddwerengem erlaben Ännerunge virzehuelen, sou wéi dës Wiki, ginn dacks vu sougenannte Spammer mëssbraucht, déi automatiséiert hir Linken op vill Internetsäite setzen.
-Esou Spam-Linke kënne wuel geläscht ginn, mä si sinn trotzdem eng grouss Plo.
+Sou Spam-Linke kënne wuel geläscht ginn, mä si sinn trotzdem eng grouss Plo.
 
-Heiandsdo, besonnesch wann nei Internet-Linken op eng Säit derbäigesat ginn, freet dës Wiki Iech eng Fro ze beäntwerten.
-Well dëst eng Aufgab ass déi schwéier z'automatiséieren ass, erlaabt dëst datt Mënschen hir Ännerunge kënnen agi wärend déi meescht Spammer an aner Roboter-Attacke kënnen ofgewiert ginn.
+Heiansdo, besonnesch wann nei Internet-Linken op eng Säit derbäigesat ginn, freet dës Wiki Iech eng Fro ze beäntwerten.
+Well dëst eng Aufgab ass déi schwéier z'automatiséieren ass, erlaabt dëst datt Mënschen hir Ännerunge kënnen agi während déi meescht Spammer an aner Roboter-Attacke kënnen ofgewiert ginn.
 
-Kontaktéiert w.e.g. d'[[{{MediaWiki:Grouppage-sysop}}|Administrateure vun dësem Site]] fir Hëllef wann dëst Iech onerwaarter Weis vu legitimen Editen ofhält.
+Kontaktéiert w.e.g. d'[[Special:ListAdmins|Administrateure vun dësem Site]] fir Hëllef wann dëst Iech onerwaarter Weis vu legitimen Editen ofhält.
 
 Dréckt op den 'Zréck' Knäppche vun ärem Browser fir an d'Beaarbechtungsfënster zréckzekommen.",
 );
@@ -773,19 +823,19 @@ Takan tombol "back" di paramban web Sanak untuak baliak ka laman panyuntiangan.'
 $messages['mk'] = array(
 	'questycaptcha-desc' => 'Создавач CAPTCHA со текнувало за потврда на уредувања',
 	'questycaptcha-addurl' => 'Вашето уредување содржи нови надворешни врски.
-За да ни помогнете да се заштитиме од автоматизиран спам, одговорете на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
-	'questycaptcha-badlogin' => 'За да ни помогнете да се заштитиме од автоматизирано пробивање на лозинки, одговорете на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
-	'questycaptcha-createaccount' => 'За да ни помогнете да се заштитиме од автоматизирано создавање на сметки, одговорете на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
+За го заштитиме викито од автоматизиран спам, би ве замолиле да одговорите на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
+	'questycaptcha-badlogin' => 'За да ни помогнете да се заштитиме од автоматизирано пробивање на лозинки, би ве замолиле да одговорите на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
+	'questycaptcha-createaccount' => 'За да ни помогнете да се заштитиме од автоматизирано создавање на сметки, би ве замолиле да одговорите на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
 	'questycaptcha-create' => 'За да ја создадете страницата, одговорете на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
 	'questycaptcha-edit' => 'За да ја уредите страницава, одговорете на прашањето подолу ([[Special:Captcha/help|повеќе инфо]]):',
-	'questycaptcha-sendemail' => 'За да се заштитиме од автоматизирано спамирање, одговорете на долупоставеното прашање ([[Special:Captcha/help|повеќе информации]]):',
+	'questycaptcha-sendemail' => 'За да се заштитиме од автоматизирано спамирање, би ве замолиле да одговорите на прашањето подолу ([[Special:Captcha/help|повеќе информации]]):',
 	'questycaptchahelp-text' => 'Мрежните места  кои прифаќаат учество на јавноста, како ова вики, честопати страдаат од спамери кои користат автоматизирани алатки за да ги додаваат нивните врски на голем број мрежни места.
 Иако врските на спамерот може да се отстранат, тие значително ја пореметуваат нашата работа.
 
 Понекогаш, особено кога додава нови врски на страница, викито може да ви побара да одговорите на прашање.
 Бидејќи ова е задача која е тешко да се автоматизира, им овозможува вистинските корисници да придонесуваат, а им попречува на спамерите и другите роботски напаѓачи.
 
-Контактирајте ги [[{{MediaWiki:Grouppage-sysop}}|администраторите на страната]] за помош доколку ова неочекувано ве спречува во правењето на искрени придонеси.
+Контактирајте ги [[Special:ListAdmins|администраторите на страната]] за помош доколку ова неочекувано ве спречува во правењето на искрени придонеси.
 
 Кликнете на копчето „назад“ во вашиот прелисувач за да се вратите на уредувањето на страницата.',
 );
@@ -795,7 +845,7 @@ $messages['mk'] = array(
  */
 $messages['ml'] = array(
 	'questycaptcha-addurl' => 'താങ്കളുടെ തിരുത്തലുകളിൽ പുറം കണ്ണികൾ ഉൾപ്പെട്ടിരിക്കുന്നു.
-യാന്ത്രിക സ്പാമിനെതിരെയുള്ള സം‌രക്ഷണത്തിന്റെ ഭാഗമായി, താഴെ കാണുന്ന വാക്കുകൾ പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക  ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):',
+യാന്ത്രിക സ്പാമിനെതിരെയുള്ള സം‌രക്ഷണത്തിന്റെ ഭാഗമായി, താഴെ കാണുന്ന വാക്കുകൾ പെട്ടിയിൽ ടൈപ്പു ചെയ്യുക  ([[Special:Captcha/help|കൂടുതൽ വിവരങ്ങൾ]]):', # Fuzzy
 );
 
 /** Malay (Bahasa Melayu)
@@ -803,19 +853,19 @@ $messages['ml'] = array(
  */
 $messages['ms'] = array(
 	'questycaptcha-addurl' => 'Suntingan anda mengandungi pautan luar baru.
-Untuk membanteras kegiatan spam automatik, anda diminta menjawab soalan yang berikut ([[Special:Captcha/help|maklumat lanjut]]):',
-	'questycaptcha-badlogin' => 'Untuk membanteras kegiatan meneka kata laluan secara automatik, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):',
-	'questycaptcha-createaccount' => 'Untuk membanteras kegiatan pembukaan akaun secara automatik, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):',
+Untuk membanteras kegiatan spam automatik, anda diminta menjawab soalan yang berikut ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Untuk membanteras kegiatan meneka kata laluan secara automatik, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Untuk membanteras kegiatan pembukaan akaun secara automatik, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
 	'questycaptcha-create' => 'Untuk mencipta laman ini, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):',
 	'questycaptcha-edit' => 'Untuk menyunting laman ini, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):',
-	'questycaptcha-sendemail' => 'Untuk membanteras kegiatan spam secara automatik, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):',
+	'questycaptcha-sendemail' => 'Untuk membanteras kegiatan spam secara automatik, anda diminta menjawab soalan berikut ([[Special:Captcha/help|maklumat lanjut]]):', # Fuzzy
 	'questycaptchahelp-text' => "Tapak-tapak web yang menerima sumbangan awam, misalnya wiki ini, sering disalah guna oleh pembuat spam yang menggunakan peralatan berautomasi untuk membubuh pautan mereka di banyak tapak.
 Walaupun pautan-pautan spam ini boleh dipadamkan, namun ia amat menyusahkan.
 
 Adakalanya, terutamanya apabila membubuh pautan web baru pada sesuatu laman, wiki ini mungkin akan menanya anda satu soalan.
 Memandangkan ini ialah tugas yang sukar diautomasi, ia akan membolehkan kebanyakan manusia sebenar untuk membuat sumbangan, sambil menghalang spam dan serangan robotik yang seumpamanya.
 
-Sila hubungi [[{{MediaWiki:Grouppage-sysop}}|pentadbir laman]] untuk mendapatkan bantuan jika ia menghalang anda daripada membuat sumbangan yang munasabah tanpa dijangka.
+Sila hubungi [[Special:ListAdmins|pentadbir laman]] untuk mendapatkan bantuan jika ia menghalang anda daripada membuat sumbangan yang munasabah tanpa dijangka.
 
 Klik butang '←' untuk kembali ke editor laman.",
 );
@@ -825,54 +875,55 @@ Klik butang '←' untuk kembali ke editor laman.",
  */
 $messages['mt'] = array(
 	'questycaptcha-addurl' => 'Il-modifika tiegħek tinkludi ħoloq esterni ġodda.
-Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):',
-	'questycaptcha-badlogin' => 'Bħala prekawzjoni kontra l-infurzar awtomatiku tal-password, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):',
-	'questycaptcha-createaccount' => "Bħala miżura ta' prekawzjoni kontra l-ħolqien awtomatiku tal-kontijiet, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):",
+Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Bħala prekawzjoni kontra l-infurzar awtomatiku tal-password, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):', # Fuzzy
+	'questycaptcha-createaccount' => "Bħala miżura ta' prekawzjoni kontra l-ħolqien awtomatiku tal-kontijiet, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):", # Fuzzy
 	'questycaptcha-create' => 'Sabiex toħloq din il-paġna, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):',
 	'questycaptcha-edit' => 'Sabiex timmodifika din il-paġna, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):',
-	'questycaptcha-sendemail' => 'Bħala prekawzjoni kontra l-ispam awtomatiku, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):',
+	'questycaptcha-sendemail' => 'Bħala prekawzjoni kontra l-ispam awtomatiku, jekk jogħġbok irrispondi l-mistoqsija li tidher hawn taħt ([[Special:Captcha/help|aktar informazzjoni]]):', # Fuzzy
 	'questycaptchahelp-text' => "Siti elettroniċi li jaċċettaw kontribuzzjonijiet mill-pubbliku, bħal din il-wiki, huma ħafna drabi abbużati minn ''spammers'' li jużaw għodda awtomatiċi sabiex idaħħlu ħoloq lejn ħafna siti.
 Waqt li dawn il-ħoloq ta' spam jistgħu jitneħħew, dan huwa xorta waħda xogħol għalxejn.
 
 Xi drabi, speċjalment meta żżid ħoloq esterni ġodda f'paġna, il-paġna wiki tista' tistaqsik biex tirrispondi mistoqsija.
 Minħabba li din hija azzjoni li diffiċli li tiġi replikata min-naħa ta' kompjuter, dan il-mekkaniżmu jippermetti lil (kważi) kull utent li jeżisti li jagħmel il-kontribuzzjonijiet tiegħu waqt li ħafna ''spammers'' u attakki awtomatiċi jiġu mwaqqfa.
 
-Jekk jogħġbok ikkuntatja lill-[[{{MediaWiki:Grouppage-sysop}}|amministraturi tas-sit]] għall-għajnuna fuq jekk din il-proċedura hix qed tipprevjeni milli tagħmel kontribuzzjonijiet leġittimi.
+Jekk jogħġbok ikkuntatja lill-[[Special:ListAdmins|amministraturi tas-sit]] għall-għajnuna fuq jekk din il-proċedura hix qed tipprevjeni milli tagħmel kontribuzzjonijiet leġittimi.
 
 Iklikkja fuq il-buttuna 'lura' tal-browżer tiegħek sabiex tirritorna għall-editur ta-paġna.",
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Helland
  * @author Nghtwlkr
  * @author Simny
  */
 $messages['nb'] = array(
 	'questycaptcha-addurl' => 'Din endring inneholder nye eksterne lenker.
-For å beskytte mot automatisert spam, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):',
-	'questycaptcha-badlogin' => 'For å hindre passordtyveri, vær vennlig og svar på spørsmålet under ([[Special:Captcha/help|mer informasjon]]):',
-	'questycaptcha-createaccount' => 'For å beskytte mot automatisert spam, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):',
+For å beskytte mot automatisert spam, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'For å hindre passordtyveri, vær vennlig og svar på spørsmålet under ([[Special:Captcha/help|mer informasjon]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'For å beskytte mot automatisert spam, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):', # Fuzzy
 	'questycaptcha-create' => 'For å opprette siden, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):',
 	'questycaptcha-edit' => 'For å endre denne siden, vennligst svar på spørsmålet som vises under ([[Special:Captcha/help|mer informasjon]]):',
-	'questycaptcha-sendemail' => 'For å beskytte mot automatisert søppelpost, svar på spørsmålet som vises nedenfor ([[Special:Captcha/help|mer info]]):',
+	'questycaptcha-sendemail' => 'For å beskytte mot automatisert søppelpost, svar på spørsmålet som vises nedenfor ([[Special:Captcha/help|mer info]]):', # Fuzzy
 	'questycaptchahelp-text' => "Nettsteder som tar imot bidrag fra allmennheten, som denne wikien, er ofte utsatt for angrep fra spammere som bruker automatiserte verktøy for å legge til lenker til mange sider.
 Selv om disse spam-lenkene kan fjernes er de en stor plage.
 
 Iblant, spesielt ved tillegg av nye lenker til en side, kan wikien be deg svare på et spørsmål.
 Siden dette er en oppgave som er vanskelig å automatisere, vil den tillate de fleste virkelige personer å bidra mens den stopper de fleste spammere og andre robotangrep.
 
-Vennligst kontakt [[{{MediaWiki:Grouppage-sysop}}|sideadministratorer]] for hjelp dersom dette er uventet hindrer deg fra å bidra med legitime bidrag.
+Vennligst kontakt [[Special:ListAdmins|sideadministratorer]] for hjelp dersom dette er uventet hindrer deg fra å bidra med legitime bidrag.
 
 Klikk på 'tilbake'-knappen i nettleseren din for å gå tilbake til sideeditoren.",
 );
 
 /** Dutch (Nederlands)
+ * @author HanV
  * @author Siebrand
  */
 $messages['nl'] = array(
 	'questycaptcha-addurl' => 'Uw bewerking bevat nieuwe externe koppelingen.
 Beantwoord de onderstaande vraag als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
-	'questycaptcha-badlogin' => 'Beantwoord de onderstaande vraag als bescherming tegen geautomatiseerde wachtwoordaanvallen ([[Special:Captcha/help|meer informatie]]):',
+	'questycaptcha-badlogin' => 'Beantwoord de onderstaande vraag als bescherming tegen het automatisch kraken van wachtwoorden  ([[Special:Captcha/help|meer informatie]]):',
 	'questycaptcha-createaccount' => 'Beantwoord de onderstaande vraag als bescherming tegen het geautomatiseerd aanmaken van gebruikers ([[Special:Captcha/help|meer informatie]]):',
 	'questycaptcha-create' => 'Beantwoord de onderstaande vraag om de pagina aan te maken ([[Special:Captcha/help|meer informatie]]):',
 	'questycaptcha-edit' => 'Beantwoord de onderstaande vraag om deze pagina te bewerken ([[Special:Captcha/help|meer informatie]]):',
@@ -883,7 +934,7 @@ Hoewel deze externe koppelingen weer verwijderd kunnen worden, leveren ze wel ve
 Soms, en in het bijzonder bij het toevoegen van externe koppelingen op pagina\'s, vraag de wiki u een vraag te beantwoorden.
 Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat dit proces succesvol te doorlopen en worden hiermee spammers en andere geautomatiseerde aanvallen geweerd.
 
-Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
+Vraag assistentie van de [[Special:ListAdmins|sitebeheerders]] als dit proces u verhindert een nuttige bijdrage te leveren.
 
 Klik op de knop "terug" in uw browser om terug te gaan naar het tekstbewerkingsscherm.',
 );
@@ -893,25 +944,25 @@ Klik op de knop "terug" in uw browser om terug te gaan naar het tekstbewerkingss
  */
 $messages['nl-informal'] = array(
 	'questycaptcha-addurl' => 'Je bewerking bevat nieuwe externe koppelingen.
-Beantwoord de onderstaande vraag als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):',
+Beantwoord de onderstaande vraag als bescherming tegen automatische spam ([[Special:Captcha/help|meer informatie]]):', # Fuzzy
 	'questycaptchahelp-text' => 'Websites die vrij te bewerken zijn, zoals deze wiki, worden vaak misbruikt door spammers die er met hun programma\'s automatisch koppelingen op zetten naar vele websites.
 Hoewel deze externe koppelingen weer verwijderd kunnen worden, leveren ze wel veel hinder en administratief werk op.
 
 Soms, en in het bijzonder bij het toevoegen van externe koppelingen op pagina\'s, vraag de wiki je een vraag te beantwoorden.
 Omdat dit proces lastig te automatiseren is, zijn vrijwel alleen mensen in staat dit proces succesvol te doorlopen en worden hiermee spammers en andere geautomatiseerde aanvallen geweerd.
 
-Vraag assistentie van de [[{{MediaWiki:Grouppage-sysop}}|sitebeheerders]] als dit proces je verhindert een nuttige bijdrage te leveren.
+Vraag assistentie van de [[Special:ListAdmins|sitebeheerders]] als dit proces je verhindert een nuttige bijdrage te leveren.
 
 Klik op de knop "terug" in je browser om terug te gaan naar het tekstbewerkingsscherm.',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Gunnernett
  */
 $messages['nn'] = array(
 	'questycaptcha-addurl' => 'Endringa di inneheld nye lenkjer ut. 
-Som ei hjelp til å unngå automatisert spam, ver venleg og skiv inn spørsmålet som er synt nedanfor ([[Special:Captcha/help|meir informasjon]]):',
-	'questycaptcha-createaccount' => 'For å hjelpa til med å hindra automatisk kontooppretting, ver venleg og svar på spørsmålet nedanfor ([[Special:Captcha/help|more info]]):',
+Som ei hjelp til å unngå automatisert spam, ver venleg og skiv inn spørsmålet som er synt nedanfor ([[Special:Captcha/help|meir informasjon]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'For å hjelpa til med å hindra automatisk kontooppretting, ver venleg og svar på spørsmålet nedanfor ([[Special:Captcha/help|more info]]):', # Fuzzy
 	'questycaptcha-create' => 'For å oppretta sida, ver venleg og svar på spørsmålet nedanfor ([[Special:Captcha/help|meir informasjon]]):',
 	'questycaptcha-edit' => 'For å endra sida, ver venleg og svar på spørsmålet som er synt nedanfor ([[Special:Captcha/help|meir informasjon]]):',
 );
@@ -921,19 +972,19 @@ Som ei hjelp til å unngå automatisert spam, ver venleg og skiv inn spørsmåle
  */
 $messages['oc'] = array(
 	'questycaptcha-addurl' => 'Vòstra modificacion inclutz de ligams extèrnes novèls.
-Per nos ajudar dins la proteccion contra lo spam automatizat, respondètz a la question çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :',
-	'questycaptcha-badlogin' => "Per nos ajudar a prevenir la copadura dels senhals per d'automats, respondètz a la question çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :",
-	'questycaptcha-createaccount' => "Per nos ajudar a luchar contra las creacions automaticas de comptes, respondètz a la question qu'apareis çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :",
+Per nos ajudar dins la proteccion contra lo spam automatizat, respondètz a la question çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :', # Fuzzy
+	'questycaptcha-badlogin' => "Per nos ajudar a prevenir la copadura dels senhals per d'automats, respondètz a la question çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :", # Fuzzy
+	'questycaptcha-createaccount' => "Per nos ajudar a luchar contra las creacions automaticas de comptes, respondètz a la question qu'apareis çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :", # Fuzzy
 	'questycaptcha-create' => 'Per crear la pagina, respondètz a la question çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :',
 	'questycaptcha-edit' => 'Per modificar aquesta pagina, respondètz a la question çaijós ([[Special:Captcha/help|mai d’entresenhas]]) :',
-	'questycaptcha-sendemail' => "Per tal de nos ajudar a prevenir lo spam automatic, entratz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’informacions]]) :",
-	'questycaptchahelp-text' => "Los sites web qu'acceptan de contribucions del public, coma aqueste wiki, son sovent victimas de polluposteires qu'utilizan d'espleches automatizats per plaçar de ligams nombroses cap a lors sites.
+	'questycaptcha-sendemail' => "Per tal de nos ajudar a prevenir lo spam automatic, entratz los mots qu'apareisson dins la bóstia çaijós ([[Special:Captcha/help|mai d’informacions]]) :", # Fuzzy
+	'questycaptchahelp-text' => "Los sites web qu'acceptan de contribucions del public, coma aqueste wiki, son sovent victimas de polluposteires qu'utilizan d'aisinas automatizadas per plaçar de ligams nombroses cap a lors sites.
 Quitament s'aquesta pollucion pòt èsser escafada, es irritanta.
 
 De còps, particularament al moment de l’apondon de ligams extèrnes novèls dins una pagina, lo wiki vos pòt demandar de respondre a una question.
 Aqueste prètzfach es pas de bon acomplir d'un biais automatizat, aquò permet a la màger part dels umans de realizar lors contribucions tot en empachant la màger part dels polluposteires e autres atacants robotizats.
 
-Contactatz [[{{MediaWiki:Grouppage-sysop}}|los administrators del site]] s'aquò vos empacha de faiçon imprevista de far de contribucions legitimas.
+Contactatz [[Special:ListAdmins|los administrators del site]] s'aquò vos empacha de faiçon imprevista de far de contribucions legitimas.
 
 Clicatz sul boton « Precedent » de vòstre navigador per tornar a la pagina de modificacion.",
 );
@@ -943,19 +994,19 @@ Clicatz sul boton « Precedent » de vòstre navigador per tornar a la pagina de
  */
 $messages['pl'] = array(
 	'questycaptcha-addurl' => 'Edycja zawiera nowe linki zewnętrzne. 
-Ochrona przed zautomatyzowanym spamem wymaga odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])',
-	'questycaptcha-badlogin' => 'Ochrona przed zautomatyzowanym łamaniem haseł wymaga odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])',
-	'questycaptcha-createaccount' => 'Ochrona przed zautomatyzowanym tworzeniem kont wymaga odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])',
+Ochrona przed zautomatyzowanym spamem wymaga odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])', # Fuzzy
+	'questycaptcha-badlogin' => 'Ochrona przed zautomatyzowanym łamaniem haseł wymaga odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])', # Fuzzy
+	'questycaptcha-createaccount' => 'Ochrona przed zautomatyzowanym tworzeniem kont wymaga odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])', # Fuzzy
 	'questycaptcha-create' => 'Utworzenie strony jest możliwe po udzieleniu odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])',
 	'questycaptcha-edit' => 'Edycja strony jest możliwa po udzieleniu odpowiedzi na poniższe pytanie ([[Special:Captcha/help|więcej informacji]])',
-	'questycaptcha-sendemail' => 'Z uwagi na ochronę przed automatycznym spamem, należy odpowiedzieć na znajdujące się poniżej pytanie ([[Special:Captcha/help|pomoc]])',
+	'questycaptcha-sendemail' => 'Z uwagi na ochronę przed automatycznym spamem, należy odpowiedzieć na znajdujące się poniżej pytanie ([[Special:Captcha/help|pomoc]])', # Fuzzy
 	'questycaptchahelp-text' => "Witryny, które publicznie udostępniają możliwość wprowadzania zmian, tak jak ta wiki, często są wykorzystywane przez spamerów, którzy korzystają ze zautomatyzowanych narzędzi, aby dodawać swoje linki do wielu stron.
 Pomimo tego, że takie linki mogą zostać usunięte, jest to jednak uciążliwe.
 
 Czasami, zwłaszcza jeśli dodano nowe linki zewnętrzne, wiki może poprosić o udzielenie odpowiedzi na pytanie.
 Ponieważ odpowiadanie na pytania jest czynnością trudną do zautomatyzowania, pozwala większości ludziom na wykonywanie edycji, zarazem uniemożliwiając ją spamerom i innym atakującym automatom.
 
-Skontaktuj się z [[{{MediaWiki:Grouppage-sysop}}|administratorami]], jeśli potrzebujesz pomocy ponieważ mechanizm ten uniemożliwia Ci dokonywania uzasadnionych edycji.
+Skontaktuj się z [[Special:ListAdmins|administratorami]], jeśli potrzebujesz pomocy ponieważ mechanizm ten uniemożliwia Ci dokonywania uzasadnionych edycji.
 
 Kliknij przycisk 'wstecz' w przeglądarce, aby wrócić do strony edycji.",
 );
@@ -966,21 +1017,21 @@ Kliknij przycisk 'wstecz' w przeglądarce, aby wrócić do strony edycji.",
  */
 $messages['pms'] = array(
 	'questycaptcha-addurl' => 'Toa modìfica a conten na neuva anliura esterna.
-Për giuté a protegi contra spam automàtich, për piasì arspond a la custion che a-i é sì sota ([[Special:Captcha/help|për savèjne ëd pì]]):',
-	'questycaptcha-badlogin' => 'Për giuté a protegi contra ël crack ëd ciav automatisà, për piasì arspond a la custion che a ven fòra sota ([[Special:Captcha/help|për savèjne ëd pì]]):',
-	'questycaptcha-createaccount' => 'Për giuté a protegi contra la creassion automàtica ëd cont, për piasì arspond a la custion che a ven fòra sota ([[Special:Captcha/help|për savejne ëd pì]]):',
+Për giuté a protegi contra spam automàtich, për piasì arspond a la custion che a-i é sì sota ([[Special:Captcha/help|për savèjne ëd pì]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Për giuté a protegi contra ël crack ëd ciav automatisà, për piasì arspond a la custion che a ven fòra sota ([[Special:Captcha/help|për savèjne ëd pì]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Për giuté a protegi contra la creassion automàtica ëd cont, për piasì arspond a la custion che a ven fòra sota ([[Special:Captcha/help|për savejne ëd pì]]):', # Fuzzy
 	'questycaptcha-create' => 'Për creé la pàgina, për piasì arspond a la custion che a ven fòra sota: ([[Special:Captcha/help|për savejne ëd pì]]):',
 	'questycaptcha-edit' => 'Për modifiché sta pàgina-sì, për piasì arspond a la custion che a ven fòra sota ([[Special:Captcha/help|për savejne ëd pì]]):',
-	'questycaptcha-sendemail' => "Për giuté a protegi contra la rumenta automàtica, për piasì ch'a risponda a la chestion ch'as vëdd sì-sota ([[Special:Captcha/help|për savèjne ëd pi]]):",
-	'questycaptchahelp-text' => "Soèns a-i riva che ij sit dla Ragnà che la gent a peul dovré për ëscrive chèich-còs, coma sta wiki-sì, a resto ambërlifà ëd reclam da màchine che a carìo soa ròba dadsà e dadlà n'automàtich. 
-Për tant che sta reclam un a peula peuj gavela, a resta sempe un gran fastudi. 
+	'questycaptcha-sendemail' => "Për giuté a protegi contra la rumenta automàtica, për piasì ch'a risponda a la chestion ch'as vëdd sì-sota ([[Special:Captcha/help|për savèjne ëd pi]]):", # Fuzzy
+	'questycaptchahelp-text' => "Soèns a-i riva che ij sit dla Ragnà che la gent a peul dovré për ëscrive chèich-còs, coma sta wiki-sì, a resto ambërlifà d'areclam da 'd màchine che a cario soa ròba dadsà e dadlà n'automàtich. 
+Për tant che sti areclam un a peula peuj gaveje, a resta sempe un gran fastudi. 
 
-Dle vire, dzortut quand un a caria dj'anliure esterne neuve ansime a na pàgina, la wiki a peul ciamete d'arsponde a na custion. 
-Da già ch'a l'é grama scrive un programa ch'a lo fasa, a ven che la pì gran part dla gent a-i la fa a scrive, ma la ói part dle màchine a-i la fa pa. 
+Dle vire, dzortut quand un a caria dj'anliure esterne neuve ansime a na pàgina, la wiki a peul ciameje ëd rësponde a na chestion. 
+Da già ch'a l'é grama scrive un programa ch'a lo fasa, a ven che la pì gran part dla gent a-i la fa a scrive, ma la pi part dle màchine a-i la fa pa. 
 
-Për piasì contata j'[[{{MediaWiki:Grouppage-sysop}}|aministrador dël sit]] për assistensa se sòn-sì a l'ha nen lassate fé na contribussion legìtima.
+Për piasì ch'a contata j'[[Special:ListAdmins|aministrator dël sit]] për d'assistensa se sòn a-j përmet nen ëd fé na contribussion legìtima.
 
-Ch'a-i bata ansima al boton 'andré' ant sò navigator për torné andré a l'editor dla pàgina.",
+Ch'a-i bata ansima al boton «andré» ant sò navigator për torné andré a l'editor dla pàgina.",
 );
 
 /** Portuguese (português)
@@ -990,19 +1041,19 @@ Ch'a-i bata ansima al boton 'andré' ant sò navigator për torné andré a l'ed
  */
 $messages['pt'] = array(
 	'questycaptcha-addurl' => "A sua edição introduziu links externos novos.
-Para ajudar a prevenir o ''spam'' automatizado, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):",
-	'questycaptcha-badlogin' => 'Para ajudar a prevenir mecanismos automatizados de descoberta de palavras-chave, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):',
-	'questycaptcha-createaccount' => 'Para ajudar a prevenir a criação de contas automatizada, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):',
+Para ajudar a prevenir o ''spam'' automatizado, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):", # Fuzzy
+	'questycaptcha-badlogin' => 'Para ajudar a prevenir mecanismos automatizados de descoberta de palavras-chave, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Para ajudar a prevenir a criação de contas automatizada, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):', # Fuzzy
 	'questycaptcha-create' => 'Para criar a página, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):',
 	'questycaptcha-edit' => 'Para editar esta página, por favor, responda à questão apresentada abaixo ([[Special:Captcha/help|mais informações]]):',
-	'questycaptcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, responda à seguinte pergunta ([[Special:Captcha/help|mais informações]]):",
+	'questycaptcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, responda à seguinte pergunta ([[Special:Captcha/help|mais informações]]):", # Fuzzy
 	'questycaptchahelp-text' => "Sites na internet abertos a edição pública, como é o caso desta wiki, são frequentemente abusados por ''spammers'' que utilizam ferramentas automatizadas para inserção em massa de links em muitos sites.
 Embora esses links possam ser removidos, representam um incómodo significativo.
 
 Por vezes, especialmente quando introduzir links externos novos numa página, a wiki pedirá que responda a uma pergunta.
 Porque esta é uma tarefa difícil de automatizar, permite que a maioria das pessoas façam as suas edições, ao mesmo tempo que inibe edições feitas por ''spammers'' e outros mecanismos automatizados.
 
-Por favor, contacte os [[{{MediaWiki:Grouppage-sysop}}|administradores]] para assistência, caso esta funcionalidade esteja a impedi-lo de fazer edições legítimas.
+Por favor, contacte os [[Special:ListAdmins|administradores]] para assistência, caso esta funcionalidade esteja a impedi-lo de fazer edições legítimas.
 
 Clique o botão 'voltar' do seu browser para voltar à página de edição.",
 );
@@ -1010,23 +1061,24 @@ Clique o botão 'voltar' do seu browser para voltar à página de edição.",
 /** Brazilian Portuguese (português do Brasil)
  * @author Eduardo.mps
  * @author Giro720
+ * @author Luckas
  * @author 555
  */
 $messages['pt-br'] = array(
 	'questycaptcha-addurl' => 'Sua edição inclui novas ligações externas.
-Para proteção contra spam automático, por favor responda a questão que aparece abaixo ([[Special:Captcha/help|mais informações]]):',
-	'questycaptcha-badlogin' => 'Para proteger contra quebra automatizada de palavra-chave, por favor responda a questão que aparece abaixo ([[Special:Captcha/help|more info]]):',
-	'questycaptcha-createaccount' => 'Para proteger contra criação automática de contas, por favor responda as questões que aparecem abaixo ([[Special:Captcha/help|more info]]):',
+Para proteção contra spam automático, por favor responda a questão que aparece abaixo ([[Special:Captcha/help|mais informações]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Para proteger contra quebra automatizada de senha, por favor responda a questão que aparece abaixo ([[Special:Captcha/help|mais informação]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Para proteger contra criação automática de contas, por favor responda as questões que aparecem abaixo ([[Special:Captcha/help|more info]]):', # Fuzzy
 	'questycaptcha-create' => 'Para criar a página, por favor responda a questão que aparece abaixo ([[Special:Captcha/help|more info]]):',
 	'questycaptcha-edit' => 'Para editar esta página, por favor responda a questão que aparece abaixo ([[Special:Captcha/help|more info]]):',
-	'questycaptcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, responda à seguinte pergunta ([[Special:Captcha/help|mais informações]]):",
+	'questycaptcha-sendemail' => "Para ajudar a prevenir o ''spam'' automatizado, por favor, responda à seguinte pergunta ([[Special:Captcha/help|mais informações]]):", # Fuzzy
 	'questycaptchahelp-text' => "Sites que aceitam contribuições públicas, como este wiki, são vulneráveis a spammers que utilizam ferramentas automatizadas para inserir os seus links em diversos locais. 
 Apesar de ser possível remover tais links, eles são um incômodo significativo.
 
 Algumas vezes, especialmente ao adicionar novos links externos a uma página, o wiki pode pedir a você que responda a uma pergunta. 
 Uma vez que essa é uma tarefa um tanto difícil de ser automatizada, ela possibilita que a maioria dos humanos faça as suas contribuições ao mesmo tempo que inibe as que forem feitas por spammers e mecanismos automatizados.
 
-Entre em contato com os [[{{MediaWiki:Grouppage-sysop}}|administradores do site]] para pedir ajuda caso isso esteja te impedindo de realizar contribuições legítimas.
+Entre em contato com os [[Special:ListAdmins|administradores do site]] para pedir ajuda caso isso esteja te impedindo de realizar contribuições legítimas.
 
 Clique no botão 'voltar' de seu navegador para retornar ao editor de páginas.",
 );
@@ -1036,18 +1088,18 @@ Clique no botão 'voltar' de seu navegador para retornar ao editor de páginas."
  */
 $messages['ro'] = array(
 	'questycaptcha-addurl' => 'Modificarea dumneavoastră include legături externe noi.
-Pentru a împiedica roboții de spam, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):',
-	'questycaptcha-badlogin' => 'Pentru a împiedica spargerea automată a parolelor, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):',
-	'questycaptcha-createaccount' => 'Pentru a împiedica crearea automată de conturi, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):',
+Pentru a împiedica roboții de spam, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Pentru a împiedica spargerea automată a parolelor, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Pentru a împiedica crearea automată de conturi, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
 	'questycaptcha-create' => 'Pentru a crea pagina, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):',
 	'questycaptcha-edit' => 'Pentru a modifica această pagină, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):',
-	'questycaptcha-sendemail' => 'Pentru a împiedica roboții de spam, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):',
+	'questycaptcha-sendemail' => 'Pentru a împiedica roboții de spam, vă rugăm să răspundeți la întrebarea de mai jos ([[Special:Captcha/help|mai multe detalii]]):', # Fuzzy
 	'questycaptchahelp-text' => 'Siturile web care acceptă contribuții din partea publicului, precum acest wiki, sunt de obicei victime ale persoanelor care folosesc unelte automate pentru a introduce legături către multe alte situri. 
 Deși aceste legături de spam pot fi îndepărtate, acest lucru reprezintă o bătaie de cap semnificativă.
 
 Uneori, mai ales la adăugarea de noi legături web într-o pagină, situl wiki vă poate cere să răspundeți la o anumită întrebare. Întrucât rezolvarea acestei cerințe este dificil de automatizat, ea permite majorității persoanelor reale să-și trimită contribuțiile și va opri majoritatea atacatorilor.
 
-În cazul în care această practică vă împiedică în mod neașteptat să faceți contribuții legitime, vă rugăm să contactați [[{{MediaWiki:Grouppage-sysop}}|administratorii sitului]].
+În cazul în care această practică vă împiedică în mod neașteptat să faceți contribuții legitime, vă rugăm să contactați [[Special:ListAdmins|administratorii sitului]].
 
 Apăsați butonul „Înapoi” al navigatorului pentru a vă reîntoarce la pagina de editare.',
 );
@@ -1057,43 +1109,43 @@ Apăsați butonul „Înapoi” al navigatorului pentru a vă reîntoarce la pag
  */
 $messages['roa-tara'] = array(
 	'questycaptcha-addurl' => "'U cangiamende tue inglude de le collegaminde esterne.
-Pe aiutà a proteggere condre a 'u spam automateche, pe piacere respunne a 'a domande ca combare sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):",
-	'questycaptcha-badlogin' => "Pe aiutà a proteggere condre a futteminde automatece de password, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|more info]]):",
-	'questycaptcha-createaccount' => "Pe aiutà a proteggere condre a ccreazione automateche de cunde utinde, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|more info]]):",
+Pe aiutà a proteggere condre a 'u spam automateche, pe piacere respunne a 'a domande ca combare sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):", # Fuzzy
+	'questycaptcha-badlogin' => "Pe aiutà a proteggere condre a futteminde automatece de password, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|more info]]):", # Fuzzy
+	'questycaptcha-createaccount' => "Pe aiutà a proteggere condre a ccreazione automateche de cunde utinde, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|more info]]):", # Fuzzy
 	'questycaptcha-create' => "Pe ccrejà sta pàgene, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|more info]]):",
 	'questycaptcha-edit' => "Pe cangià sta pàgene, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|more info]]):",
-	'questycaptcha-sendemail' => "Pe aiutà a proteggere condre a spam automatece, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):",
+	'questycaptcha-sendemail' => "Pe aiutà a proteggere condre a spam automatece, pe piacere respunne a 'a domande ca combare aqquà sotte ([[Special:Captcha/help|cchiù 'mbormaziune]]):", # Fuzzy
 	'questycaptchahelp-text' => "Le site web ca accettane condrebbute da 'u pubbleche, cumme sta Uicchi, sonde spesse abusate da le ''spammer'' ca ausane struminde automatece e aggiungene le lore collegaminde a 'nu sacche de site.<br />
 Pure ca chiste collegaminde de spam ponne essere luate, lore sò sembre 'nu scassamende de palle.<br />
 <br />
 Certe vote, specialmende quanne aggiunge 'nu nuève collegamende web a 'na pàgene, Uicchi te pò chiedere de responnere a 'na domande.<br />
 Accussì addeviene 'nu combete cchiù defficile da automatizzà, accussì se permette a le cristiane de fà cangiaminde reale e se blocchene de cchiù le ''spammer'' e otre attacche de robot.<br />
 <br />
-Pe piacere condatte le [[{{MediaWiki:Grouppage-sysop}}|amministrature d'u site]] pe assistenze ce stu fatte non ge funzione accume se deve e no te face fà le cangiaminde legittime.<br />
+Pe piacere condatte le [[Special:ListAdmins|amministrature d'u site]] pe assistenze ce stu fatte non ge funzione accume se deve e no te face fà le cangiaminde legittime.<br />
 <br />
 Cazze 'u buttone 'rrete' jndr'à 'u browser tue pe turnà 'a pàgene d'u cangiamende.",
 );
 
 /** Russian (русский)
+ * @author Lockal
+ * @author Okras
  * @author Александр Сигачёв
  */
 $messages['ru'] = array(
 	'questycaptcha-addurl' => 'Ваша правка содержит новые внешние ссылки.
-В целях защиты от автоматического спама, пожалуйста, ответьте на приведённый ниже вопрос ([[Special:Captcha/help|подробнее]]):',
-	'questycaptcha-badlogin' => 'В целях защиты от автоматического подбора пароля, пожалуйста, ответьте на приведённый ниже вопрос  ([[Special:Captcha/help|подробнее]]):',
-	'questycaptcha-createaccount' => 'В целях защиты от автоматического создания учётных записей, пожалуйста, ответьте на приведённый ниже вопрос  ([[Special:Captcha/help|подробнее]]):',
+В целях защиты от автоматического спама просим вас ответить на вопрос, показанный ниже ([[Special:Captcha/help|подробнее…]]):',
+	'questycaptcha-badlogin' => 'В целях защиты от автоматического подбора пароля  просим вас ответить на вопрос, показанный ниже ([[Special:Captcha/help|подробнее…]]):',
+	'questycaptcha-createaccount' => 'В целях защиты от автоматического создания учётных записей просим вас ответить на вопрос, показанный ниже ([[Special:Captcha/help|подробнее…]]):',
 	'questycaptcha-create' => 'Для создания страницы, пожалуйста, ответьте на приведённый ниже вопрос  ([[Special:Captcha/help|подробнее]]):',
 	'questycaptcha-edit' => 'Чтобы изменить эту страницу, пожалуйста, ответьте на приведённый ниже вопрос  ([[Special:Captcha/help|подробнее]]):',
-	'questycaptcha-sendemail' => 'В целях защиты от автоматического спама, пожалуйста, ответьте на приведённый ниже вопрос ([[Special:Captcha/help|подробнее]]):',
-	'questycaptchahelp-text' => 'Веб-сайты позволяющие изменять своё содержимое, как эта вики, часто становятся целью спамеров, использующих автоматические инструменты для добавления ссылок на другие сайты.
-Несмотря на то, что такие ссылки могут быть удалены, они являются заметной помехой.
+	'questycaptcha-sendemail' => 'В целях защиты от автоматического спама просим вас ответить на вопрос, показанный ниже ([[Special:Captcha/help|подробнее…]]):',
+	'questycaptchahelp-text' => 'Веб-сайты, позволяющие добавлять и изменять своё содержимое, в том числе эта вики, часто становятся целью спамеров, использующих программы для автоматического добавления ссылок на сайты. Хотя такие ссылки могут быть впоследствии удалены, они являются существенной помехой.
 
-Иногда, в частности при добавлении на страницу новых веб-ссылок, вики может попросить вас ответить на вопрос.
-Так как эта задача, которую сложно автоматизировать, то это позволит большинству людей сделать данную правку, и в тоже время остановит большинство спамеров и других роботизированных недоброжелателей.
+При некоторых действиях — например, при добавлении на страницу новой веб-ссылки —  вики может попросить вас ответить на вопрос. Поскольку эта задача является сложной для автоматизации, большинство спамерских и вандальных программ не могут с ней справиться, в то время как люди справляются легко.
 
-Пожалуйста, обратитесь к [[{{MediaWiki:Grouppage-sysop}}|администраторам сайта]] за помощь, если данная система не позволяет вам вносить допустимые изменения.
+Пожалуйста, обратитесь за помощью к [[Special:ListAdmins|администраторам]], если подобная проверка мешает вам добросовестно работать с сайтом.
 
-Нажмите в вашем браузере кнопку «назад», чтобы вернуться к странице редактирования.',
+Нажмите кнопку «Назад» в вашем браузере, чтобы вернуться к редактированию.',
 );
 
 /** Slovak (slovenčina)
@@ -1102,11 +1154,11 @@ $messages['ru'] = array(
 $messages['sk'] = array(
 	'questycaptcha-addurl' => 'Vaša úprava obsahuje nové externé odkazy.
 Ako opatrenie proti automatizovanému spamu musíte zodpovedať dolu uvedenú otázku
-([[Special:Captcha/help|ďalšie informácie]]):',
+([[Special:Captcha/help|ďalšie informácie]]):', # Fuzzy
 	'questycaptcha-badlogin' => 'Ako opatrenie proti automatizovanému lámaniu hesiel musíte zodpovedať dolu uvedenú otázku
-([[Special:Captcha/help|ďalšie informácie]]):',
+([[Special:Captcha/help|ďalšie informácie]]):', # Fuzzy
 	'questycaptcha-createaccount' => 'Ako opatrenie proti automatizovanému vytváraniu účtov musíte zodpovedať dolu uvedenú otázku
-([[Special:Captcha/help|ďalšie informácie]]):',
+([[Special:Captcha/help|ďalšie informácie]]):', # Fuzzy
 	'questycaptcha-create' => 'Ak chcete vytvoriť stránku, musíte zodpovedať dolu uvedenú otázku
 ([[Special:Captcha/help|ďalšie informácie]]):',
 	'questycaptcha-edit' => 'Ak chcete upraviť túto stránku, musíte zodpovedať dolu uvedenú otázku
@@ -1117,7 +1169,7 @@ Hoci je možné odkazy na spam odstrániť, je to významná nepríjemnosť.
 Niekedy, obzvlášť pri pridávaní nových webových odkazov na stránku, vás wiki môže požiadať o zodpovedanie otázky.
 Pretože takúto úlohu je ťažké zautomatizovať, umožní väčšine skutočných ľudí prispievať a zastaví vačšinu spammerov a robotických útočníkov.
 
-Kontaktujte prosím [[{{MediaWiki:Grouppage-sysop}}|správcov lokality]] ak potrebujete pomoc v prípade, že vám táto funkcia neočakávaným spôsobom bráni v právoplatných príspevkoch.
+Kontaktujte prosím [[Special:ListAdmins|správcov lokality]] ak potrebujete pomoc v prípade, že vám táto funkcia neočakávaným spôsobom bráni v právoplatných príspevkoch.
 
 Späť na úpravu stránky sa vrátite kliknutím na tlačidlo „Späť“ vo vašom prehliadači.',
 );
@@ -1127,19 +1179,19 @@ Späť na úpravu stránky sa vrátite kliknutím na tlačidlo „Späť“ vo v
  */
 $messages['sl'] = array(
 	'questycaptcha-addurl' => 'Vaše urejanje vključuje nove zunanje povezave.
-Zaradi zaščite pred samodejnim smetjem prosimo, da odgovorite na spodaj zastavljeno vprašanje ([[Special:Captcha/help|več informacij]]):',
-	'questycaptcha-badlogin' => 'Zaradi zaščite pred samodejnim ugotavljanjem gesel prosimo, da odgovorite na spodaj zastavljeno vprašanje ([[Special:Captcha/help|več informacij]]):',
-	'questycaptcha-createaccount' => 'Zaradi zaščite pred samodejnim ustvarjanjem računov prosimo, da odgovorite na spodaj zastavljeno vprašanje ([[Special:Captcha/help|več informacij]]):',
+Zaradi zaščite wikija pred samodejnim smetjem vas prijazno naprošamo, da odgovorite na spodaj zastavljeno vprašanje ([[Special:Captcha/help|več informacij]]):',
+	'questycaptcha-badlogin' => 'Zaradi zaščite wikija pred samodejnim ugotavljanjem gesel vas prijazno naprošamo, da odgovorite na spodaj zastavljeno vprašanje ([[Special:Captcha/help|več informacij]]):',
+	'questycaptcha-createaccount' => 'Zaradi zaščite wikija pred samodejnim ustvarjanjem računov vas prijazno naprošamo, da odgovorite na spodaj zastavljeno vprašanje ([[Special:Captcha/help|več informacij]]):',
 	'questycaptcha-create' => 'Če želite ustvariti stran, prosimo odgovorite na spodaj zastavljeno vprašanje ([[Special:Captcha/help|več informacij]]):',
 	'questycaptcha-edit' => 'Če želite urediti stran, prosimo odgovorite na spodaj zastavljeno vprašanje ([[Special:Captcha/help|več informacij]]):',
-	'questycaptcha-sendemail' => 'Zaradi zaščite pred samodejnim smetenjem prosimo, da odgovorite na spodaj zastavljeno vprašanje ([[Special:Captcha/help|več informacij]]):',
+	'questycaptcha-sendemail' => 'Zaradi zaščite wikija pred samodejnim smetenjem vas prijazno naprošamo, da odgovorite na spodaj zastavljeno vprašanje ([[Special:Captcha/help|več informacij]]):',
 	'questycaptchahelp-text' => 'Spletne strani, ki omogočajo prispevanje širši javnosti, kot na primer ta wiki, pogosto zlorabljajo spamerji, ki za dodajanje svojih povezav na mnoge strani uporabljajo avtomatizirana orodja.
 Čeprav je neželene povezave mogoče odstraniti, so precejšnja nadloga.
 
 Včasih, zlasti pri dodajanju novih spletnih povezav na stran, vam bo wiki morda zastavil vprašanje.
 Ker je to opravilo težko avtomatizirati, bo s tem večini ljudi prispevanje dovoljeno, spamerji in drugi robotski napadalci pa bodo ustavljeni.
 
-Če vam to nepričakovano preprečuje legitimno prispevanje, prosimo, da se obrnete na [[{{MediaWiki:Grouppage-sysop}}|administratorje spletišča]].
+Če vam to nepričakovano preprečuje legitimno prispevanje, prosimo, da se obrnete na [[Special:ListAdmins|administratorje spletišča]].
 
 Za vrnitev v urejevalnik izberite gumb »nazaj« v vašem brskalniku.',
 );
@@ -1148,7 +1200,7 @@ Za vrnitev v urejevalnik izberite gumb »nazaj« v vašem brskalniku.',
  * @author Abshirdheere
  */
 $messages['so'] = array(
-	'questycaptcha-createaccount' => "Si aad u caawiso dhowritaanka in la iska samaysto Akoon,Fadlan ka jawaan su'aalahaan hoos ku qoran ([[Special:Captcha/help|Macluumaad dheeraad ah]]):",
+	'questycaptcha-createaccount' => "Si aad u caawiso dhowritaanka in la iska samaysto Akoon,Fadlan ka jawaan su'aalahaan hoos ku qoran ([[Special:Captcha/help|Macluumaad dheeraad ah]]):", # Fuzzy
 );
 
 /** Serbian (Cyrillic script) (српски (ћирилица)‎)
@@ -1166,22 +1218,24 @@ $messages['sr-el'] = array(
 
 /** Swedish (svenska)
  * @author Boivie
+ * @author Rotsee
+ * @author WikiPhoenix
  */
 $messages['sv'] = array(
 	'questycaptcha-addurl' => 'Din redigering inkluderar nya externa länkar.
-För att hjälpa till i skyddet mot automatisk spam, vänligen svara på frågan som finns nedan ([[Special:Captcha/help|mer information]]):',
-	'questycaptcha-badlogin' => 'För att hjälpa till i skyddet mot automatisk lösenordsknäckning, vänligen svara på frågan som finns nedan ([[Special:Captcha/help|mer information]]):',
-	'questycaptcha-createaccount' => 'För att hjälpa till i skyddet mot automatiskt kontoskapande, vänligen svara på frågan som finns nedan ([[Special:Captcha/help|mer information]]):',
+För att skydda wikin mot automatisk spam ber vi dig att svara på frågan här ([[Special:Captcha/help|mer information]]):',
+	'questycaptcha-badlogin' => 'För att skydda wikin mot automatisk lösenordsknäckning ber vi dig att svara på frågan som finns nedan ([[Special:Captcha/help|mer information]]):',
+	'questycaptcha-createaccount' => 'För att skydda wikin mot automatiskt kontoskapande ber vi dig att svara på frågan som finns nedan ([[Special:Captcha/help|mer information]]):',
 	'questycaptcha-create' => 'För att skapa sidan, vänligen svara på frågan som finns nedan ([[Special:Captcha/help|mer information]]):',
 	'questycaptcha-edit' => 'För att redigera denna sida, vänligen svara på frågan som finns nedan ([[Special:Captcha/help|mer information]]):',
-	'questycaptcha-sendemail' => 'För att skydda mot automatisk spamning, vänligen svara på frågan som visas nedan ([[Special:Captcha/help|mer information]]):',
+	'questycaptcha-sendemail' => 'För att skydda wikin mot automatiskt spam ber vid dig att svara på frågan som visas nedan ([[Special:Captcha/help|mer information]]):',
 	'questycaptchahelp-text' => "Webbplatser som accepterar bidrag från allmänheten, som denna wiki, blir ofta utnyttjade av spammare som använder automatiska verktyg för att lägga till sina linkar till många sajter.
 Även om dessa spam-länkar kan tas bort är de väldigt störande.
 
 Ibland, särskilt vid tillägg av nya webblänkar till en sida, kan wikin be dig svara på en fråga.
 Eftersom denna uppgift är svår att automatisera, låter den de flesta riktiga människor göra sina bidrag medan den stoppar de flesta spammare och andra robotattackerare.
 
-Vänligen kontakta [[{{MediaWiki:Grouppage-sysop}}|sajtens administratörer]] för hjälp ifall detta oväntat förhindrar dig från att göra tillåtna bidrag.
+Vänligen kontakta [[Special:ListAdmins|sajtens administratörer]] för hjälp ifall detta oväntat förhindrar dig från att göra tillåtna bidrag.
 
 Klicka 'tillbaka'-knappen i din webbläsare för att återvända till sidredigeraren.",
 );
@@ -1192,7 +1246,7 @@ Klicka 'tillbaka'-knappen i din webbläsare för att återvända till sidrediger
  */
 $messages['te'] = array(
 	'questycaptcha-addurl' => 'మీరు చేసిన మార్పులో కొత్త బయటి లింకులు ఉన్నాయి.
-ఆటోమేటెడ్ స్పాము నుండి రక్షణకై, క్రింద కనిపించే ప్రశ్నకు సమాధానమివ్వండి ([[Special:Captcha/help|మరింత సమాచారం]]):',
+ఆటోమేటెడ్ స్పాము నుండి రక్షణకై, క్రింద కనిపించే ప్రశ్నకు సమాధానమివ్వండి ([[Special:Captcha/help|మరింత సమాచారం]]):', # Fuzzy
 	'questycaptcha-edit' => 'ఈ పేజీని సరిదిద్దడానికి, క్రింద కనిపించే ప్రశ్నకి జవాబివ్వండి ([[Special:Captcha/help|మరింత సమాచారం]]):',
 );
 
@@ -1204,7 +1258,7 @@ $messages['th'] = array(
 
 เนื่องจากการใส่ลิงก์เป็นเรื่องยากในการดูแลโดยอัตโนมัติ ในบางครั้ง โดยเฉพาะเมื่อคุณใส่ลิงก์เว็บภายนอก ระบบวิกิอาจขอให้คุณตอบคำถาม เพื่อป้องกันนักสแปมและโรบอตโจมตีอื่น ๆ ทำการแก้ไข แต่จะอนุญาตให้ผู้ที่ใกล้เคียงมนุษย์มากทีุ่สุดแก้ไขได้
 
-กรุณาติดต่อ [[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]] หากกระบวนการนี้ไม่สามารถทำให้คุณแก้ไขข้อมูลให้ถูกต้องได้
+กรุณาติดต่อ [[Special:ListAdmins|ผู้ดูแลระบบ]] หากกระบวนการนี้ไม่สามารถทำให้คุณแก้ไขข้อมูลให้ถูกต้องได้
 
 กดปุ่ม 'Back' บนเบราเซอร์ของคุณเพื่อกลับไปยังหน้าแก้ไข",
 );
@@ -1215,18 +1269,18 @@ $messages['th'] = array(
 $messages['tl'] = array(
 	'questycaptcha-desc' => 'Kaakit-akit na panlikha ng CAPTCHA na Questy para sa Pagtiyak ng Pagbago',
 	'questycaptcha-addurl' => 'Kasali sa pagbago mo ang bagong panglabas na mga kawing.
-Upang makatulong sa pagsanggalang laban sa kusang panglulusob, pakisagot ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|more info]]):',
-	'questycaptcha-badlogin' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang paglutas ng hudyat, pakisagot lamang ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):',
-	'questycaptcha-createaccount' => 'Upang makatulong sa pagsasanggalang laban sa kusang paglikha ng akawnt, pakisagot ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):',
+Upang makatulong sa pagsanggalang laban sa kusang panglulusob, pakisagot ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|more info]]):', # Fuzzy
+	'questycaptcha-badlogin' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang paglutas ng hudyat, pakisagot lamang ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):', # Fuzzy
+	'questycaptcha-createaccount' => 'Upang makatulong sa pagsasanggalang laban sa kusang paglikha ng akawnt, pakisagot ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):', # Fuzzy
 	'questycaptcha-create' => 'Upang malikha ang pahina, pakisagot ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):',
 	'questycaptcha-edit' => 'Upang mabago ang pahina, pakisagot ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):',
-	'questycaptcha-sendemail' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang paglusob, pakisagot lamang ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):',
+	'questycaptcha-sendemail' => 'Upang makatulong sa pagsasanggalang laban sa mga kusang paglusob, pakisagot lamang ang tanong na nakalitaw sa ibaba ([[Special:Captcha/help|marami pang kabatiran]]):', # Fuzzy
 	'questycaptchahelp-text' => "Ang mga websayt na tumatanggap ng mga ambag mula sa madla, katulad ng wiking ito, ay madalas abusuhin ng mga manlulusob na gumagamit ng kasangkapang pangkusa upang madagdag ang kanilang mga kawing sa maraming mga sayt.
 
 Kung minsan, partikular na kapag nagdaragdag ng bagong mga kawing pangweb sa isang pahina, maaaring humiling ang wiki na sagutin mo ang isang tanong.  
 Dahil isa itong gawaing mahirap ikusa, magpapahintulot ito ng karamihan sa tunay na mga tao na gawin ang kanilang mga kontribusyon habang pinahihinto ang karamihan sa mga ispamer at iba pang mga makarobot na mga panglusob.
 
-Mangyaring makipag-ugnayan sa [[{{MediaWiki:Grouppage-sysop}}|mga tagapangasiwa ng sayt]] para sa pagtulong kung hindi inaasahang pigilan ka mula sa paggawa ng tunay na mga ambag.
+Mangyaring makipag-ugnayan sa [[Special:ListAdmins|mga tagapangasiwa ng sayt]] para sa pagtulong kung hindi inaasahang pigilan ka mula sa paggawa ng tunay na mga ambag.
 
 Pindutin ang pindutang 'bumalik' sa iyong pantingin-tingin upang makabalik sa pambago ng pahina.",
 );
@@ -1237,41 +1291,42 @@ Pindutin ang pindutang 'bumalik' sa iyong pantingin-tingin upang makabalik sa pa
  */
 $messages['tr'] = array(
 	'questycaptcha-addurl' => 'Değişikliğiniz yeni dış bağlantı içeriyor.
-Otomatik reklama karşı korunmaya yardımcı olmak için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:',
-	'questycaptcha-badlogin' => 'Otomatik şifre kırmaya karşı korunmaya yardımcı olmak için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:',
-	'questycaptcha-createaccount' => 'Otomatik hesap oluşturmaya karşı korunmaya yardımcı olmak için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:',
+Otomatik reklama karşı korunmaya yardımcı olmak için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:', # Fuzzy
+	'questycaptcha-badlogin' => 'Otomatik şifre kırmaya karşı korunmaya yardımcı olmak için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:', # Fuzzy
+	'questycaptcha-createaccount' => 'Otomatik hesap oluşturmaya karşı korunmaya yardımcı olmak için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:', # Fuzzy
 	'questycaptcha-create' => 'Sayfayı oluşturmak için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:',
 	'questycaptcha-edit' => 'Sayfayı değiştirmek için, lütfen ([[Special:Captcha/help|daha fazla bilgi]]) bölümünün altında yer alan soruya cevap verin:',
-	'questycaptcha-sendemail' => 'Otomatik spamlerden korunmaya yardımcı olmak için, lütfen aşağıda görünen soruyu cevaplayın ([[Special:Captcha/help|daha fazla bilgi]]):',
+	'questycaptcha-sendemail' => 'Otomatik spamlerden korunmaya yardımcı olmak için, lütfen aşağıda görünen soruyu cevaplayın ([[Special:Captcha/help|daha fazla bilgi]]):', # Fuzzy
 	'questycaptchahelp-text' => "Bu viki gibi herkesin katkı yapmasına izin veren web siteleri, genellikle bir çok siteye verilen bağlantıları ekleyen otomatik araçlar kullanan reklam amaçlı kullanıcılar tarafından istismar edilmektedir.
 Bu reklam bağlantıları kaldırılabiliyor olsa da, önemli bir sıkıntı yaratmaktadırlar.
 
 Bazen, özellikle bir sayfaya yeni web bağlantıları eklenirken, viki size bir soru sorabilir.
 Bu, otomatikleştirilmesi zor bir iş olduğu için, insanların katkılarını yapmasını mümkün kılarken çoğu reklam amaçlı kullanıcıyı ya da robot saldırganı durduracaktır.
 
-Bu durumun sizi normal katkılarınızı yapmaktan olağandışı bir şekilde alıkoyması halinde, lütfen destek için [[{{MediaWiki:Grouppage-sysop}}|site hizmetlileri]] ile irtibata geçin.
+Bu durumun sizi normal katkılarınızı yapmaktan olağandışı bir şekilde alıkoyması halinde, lütfen destek için [[Special:ListAdmins|site hizmetlileri]] ile irtibata geçin.
 
 Sayfa editörüne dönmek için tarayıcınızın 'geri' düğmesine tıklayın.",
 );
 
 /** Ukrainian (українська)
+ * @author Andriykopanytsia
  * @author Diemon.ukr
  */
 $messages['uk'] = array(
 	'questycaptcha-addurl' => 'Ваше редагування містить нові зовнішні посилання.
-Із метою захисту від спаму, будь ласка, дайте відповідь на питання, що наводиться нижче ([[Special:Captcha/help|докладніше]]):',
-	'questycaptcha-badlogin' => 'Із метою захисту від автоматичного підбору пароля, будь ласка, дайте відповідь на питання, що наводиться нижче ([[Special:Captcha/help|докладніше]]):',
-	'questycaptcha-createaccount' => 'Із метою захисту від автоматичного створення облікових записів, будь ласка, дайте відповідь на питання, що наводиться нижче ([[Special:Captcha/help|докладніше]]):',
+Із метою захисту вікі від спаму просимо вас дати відповідь на питання, що наводиться нижче ([[Special:Captcha/help|докладніше]]):',
+	'questycaptcha-badlogin' => 'Із метою захисту вікі від автоматичного підбору пароля, просимо вас дати відповідь на питання, що наводиться нижче ([[Special:Captcha/help|докладніше]]):',
+	'questycaptcha-createaccount' => 'Із метою захисту вікі від автоматичного створення облікових записів просимо вас дати відповідь на питання, що наводиться нижче ([[Special:Captcha/help|докладніше]]):',
 	'questycaptcha-create' => 'Щоб створити сторінку, будь ласка, дайте відповідь на питання, що наводиться нижче ([[Special:Captcha/help|докладніше]]):',
 	'questycaptcha-edit' => 'Щоб редагувати цю сторінку, будь ласка, дайте відповідь на питання, що наводиться нижче ([[Special:Captcha/help|докладніше]]):',
-	'questycaptcha-sendemail' => 'Із метою захисту від автоматичного спаму, будь ласка, дайте відповідь на питання, що наводиться нижче ([[Special:Captcha/help|докладніше]]):',
+	'questycaptcha-sendemail' => 'Із метою захисту вікі від автоматичного спаму просимо вас дати відповідь на питання, що наводиться нижче ([[Special:Captcha/help|докладніше]]):',
 	'questycaptchahelp-text' => 'Сайти, які надають можливість змінювати свій зміст, як це вікі, часто є місцем зловживання спамерів, які використовують автоматизовані інструменти для додавання посилань на інші сайти. 
 Хоча ці спам-посилання можуть бути вилучені, вони є суттєвим негативним чинником. 
 
 Іноді, особливо при додаванні нових посилань веб-сторінки, вікі може попросити вас відповісти на запитання. 
 Це є завданням, яке важко автоматизувати, тому воно дозволить більшості реальних людей зробити свій внесок, і в той же час зупинить більшість спамерів та інших роботизованих нападників. 
 
-Будь ласка, зв\'яжіться з [[{{MediaWiki:Grouppage-sysop}}|адміністраторами сайту]] по допомогу, якщо ця система не дозволяє вам робити допустимий внесок. 
+Будь ласка, зв\'яжіться з [[Special:ListAdmins|адміністраторами сайту]] по допомогу, якщо ця система не дозволяє вам робити допустимий внесок. 
 
 Натисніть на кнопку "назад" у браузері, щоб повернутися на сторінку редагування.',
 );
@@ -1281,18 +1336,18 @@ $messages['uk'] = array(
  */
 $messages['wa'] = array(
 	'questycaptcha-addurl' => "Dins vos candjmints i gn a des dfoûtrinnès hårdêyes (URL).
-Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
-	'questycaptcha-badlogin' => "Po s' mete a houte des des robots ki sayèt d' adviner les screts, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
-	'questycaptcha-createaccount' => "Po s' mete a houte des des robots k' ahivèt des contes otomaticmint, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzi ([[Special:Captcha/help|pus di racsegnes]]):",
+Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
+	'questycaptcha-badlogin' => "Po s' mete a houte des des robots ki sayèt d' adviner les screts, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
+	'questycaptcha-createaccount' => "Po s' mete a houte des des robots k' ahivèt des contes otomaticmint, nos  vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzi ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
 	'questycaptcha-create' => "Por vos poleur ahiver l' pådje, vos dvoz responde al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
 	'questycaptcha-edit' => 'Po candjî cisse pådje ci, vos dvoz responde al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):',
-	'questycaptcha-sendemail' => "Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):",
+	'questycaptcha-sendemail' => "Po s' mete a houte des robots di spam, nos vs dimandans d' acertiner ki vos estoz bén ene djin, po çoula respondez al kesse chal pa dzo ([[Special:Captcha/help|pus di racsegnes]]):", # Fuzzy
 	'questycaptchahelp-text' => "Les waibes k' acceptèt des messaedjes do publik, come ci wiki chal, sont sovint eployîs pa des må-fjhants spameus, po pleur mete, avou des usteyes otomatikes, des loyéns di rclame viè les sites da zels.
 Bén seur, on pout todi les disfacer al mwin, mins c' est on soyant ovraedje.
 
 Adon, pa côps, copurade cwand vos radjoutez des hårdêyes a ene pådje, on eployrè ene passete d' acertinaedje, dj' ô bén k' on vs dimandrè d' responde a ene kesse. Come çoula est ene sacwè d' målåjheye a fé otomaticmint pa on robot, çoula permete di leyî les vraiyès djins fé leus candjmints tot arestant l' plupårt des spameus et des sfwaitès atakes pa robot.
 
-S' i vs plait contactez les [[{{MediaWiki:Grouppage-sysop}}|manaedjeus do site]] po d' l' aidance si çoula vos espaitche di fé vos candjmints ledjitimes.
+S' i vs plait contactez les [[Special:ListAdmins|manaedjeus do site]] po d' l' aidance si çoula vos espaitche di fé vos candjmints ledjitimes.
 
 Clitchîz sol boton «En erî» di vosse betchteu waibe po rivni al pådje di dvant.",
 );
@@ -1306,32 +1361,41 @@ $messages['yi'] = array(
 
 /** Simplified Chinese (中文（简体）‎)
  * @author Cwek
+ * @author Fantasticfears
  */
 $messages['zh-hans'] = array(
-	'questycaptcha-addurl' => '您的编辑内容中含有本网站以外的连结。为防止不当程式大量破坏，请回答以下的问题（[[Special:Captcha/help|相关资讯]]）：',
-	'questycaptcha-badlogin' => '为防止不当程式破解密码，请回答以下的问题（[[Special:Captcha/help|相关资讯]]）：',
-	'questycaptcha-createaccount' => '为防止不当程式大量建立帐户，请回答以下的问题（[[Special:Captcha/help|相关资讯]]）：',
+	'questycaptcha-addurl' => '您的编辑内容中含有本网站以外的连结。为防止自动程序垃圾编辑，请回答以下的问题（[[Special:Captcha/help|更多信息]]）：',
+	'questycaptcha-badlogin' => '为防止自动程序破解密码，请回答以下的问题（[[Special:Captcha/help|更多信息]]）：',
+	'questycaptcha-createaccount' => '为防止不当程式大量建立帐户，请回答以下的问题（[[Special:Captcha/help|更多信息]]）：',
 	'questycaptcha-create' => '为防止不当程式大量建立页面，请回答以下问题（[[Special:Captcha/help|相关资讯]]）：',
 	'questycaptcha-edit' => '为防破坏，如您想要编辑此页面，请回答以下的问题（[[Special:Captcha/help|相关资讯]]）：',
-	'questycaptcha-sendemail' => '为防止不当程式破解密码，请回答下列问题（[[Special:Captcha/help|相关资讯]]）：',
+	'questycaptcha-sendemail' => '为防止不当程式破解密码，请回答下列问题（[[Special:Captcha/help|更多信息]]）：',
 	'questycaptchahelp-text' => '像本站一样，对公众开放编辑的网站经常被垃圾连结骚扰。那些人使用自动化垃圾程序将他们的连结张贴到很多网站。虽然这些连结可以被清除，但是这些东西确实令人十分讨厌。
 
 有时，特别是当给一个页面添加新的网页链接时，本站会让你看一幅有颜色的或者有变形文字的图像，并且要你输入所显示的文字。因为这是难以自动完成的一项任务，它将允许人保存他们的编辑，同时阻止大多数发送垃圾邮件者和其他机器人的攻击。
 
-令人遗憾是，这会使得视力不好的人，或者使用基於文本或者基於声音的浏览器的用户感到不便。而目前我们还没有提供的音频的选择。如果这正好阻止你进行正常的编辑，请和[[{{MediaWiki:Grouppage-sysop}}|站点管理员]]联系获得帮助。
+令人遗憾是，这会使得视力不好的人，或者使用基於文本或者基於声音的浏览器的用户感到不便。而目前我们还没有提供的音频的选择。如果这正好阻止你进行正常的编辑，请和[[Special:ListAdmins|站点管理员]]联系获得帮助。
 
 点击浏览器中的“后退”按钮返回你所编辑的页面。',
 );
 
 /** Traditional Chinese (中文（繁體）‎)
  * @author Horacewai2
+ * @author Justincheng12345
  * @author Waihorace
  */
 $messages['zh-hant'] = array(
-	'questycaptcha-addurl' => '您的編輯內容中含有本網站以外的連結。為防止不當程式大量破壞，請回答以下的問題（[[Special:Captcha/help|相關資訊]]）：',
-	'questycaptcha-badlogin' => '為防止不當程式破解密碼，請回答以下的問題（[[Special:Captcha/help|相關資訊]]）：',
-	'questycaptcha-createaccount' => '為防止不當程式大量建立帳戶，請回答以下的問題（[[Special:Captcha/help|相關資訊]]）：',
+	'questycaptcha-addurl' => '您的編輯內容中含有本網站以外的連結。為防止不當程式大量破壞，請回答以下的問題（[[Special:Captcha/help|相關資訊]]）：', # Fuzzy
+	'questycaptcha-badlogin' => '為防止不當程式破解密碼，請回答以下的問題（[[Special:Captcha/help|相關資訊]]）：', # Fuzzy
+	'questycaptcha-createaccount' => '為防止不當程式大量建立帳戶，請回答以下的問題（[[Special:Captcha/help|相關資訊]]）：', # Fuzzy
 	'questycaptcha-create' => '為防止不當程式大量建立頁面，請回答以下問題（[[Special:Captcha/help|相關資訊]]）：',
 	'questycaptcha-edit' => '為防破壞，如您想要編輯此頁面，請回答以下的問題（[[Special:Captcha/help|相關資訊]]）：',
-	'questycaptcha-sendemail' => '為防止不當程式破解密碼，請回答下列問題（[[Special:Captcha/help|相關資訊]]）：',
+	'questycaptcha-sendemail' => '為防止不當程式破解密碼，請回答下列問題（[[Special:Captcha/help|相關資訊]]）：', # Fuzzy
+	'questycaptchahelp-text' => '像本維基一样，對公眾開放編輯的網站經常受垃圾連結騷擾。那些人使用自動化程式將他們的連結張貼至很多網站。雖然可以清除這些連結，但是這些連結的確十分討厭。
+
+有時，特别是為某一頁面加入新連結時，本維基會讓你看一幅有顏色或變形文字的圖片，並要求你輸入圖片中顯示的文字。因為此項任務難以自動完成，它將允許人類繼續儲存其編輯，同時阻止大多數發送垃圾郵件的人和其他機械人的攻擊。
+
+令人遺憾是，這會使視力不好的人或者使用基於文本或聲音的瀏覽器用戶感到不便。然而我們目前尚未提供音頻選擇。如果這阻止了你進行正常編輯，請與[[Special:ListAdmins|管理員]]聯繫獲得幫助。
+
+按下瀏覽器的「返回」按鈕回到你所編輯的頁面。',
 );
diff --git a/extensions/ConfirmEdit/ReCaptcha.i18n.php b/extensions/ConfirmEdit/ReCaptcha.i18n.php
index e8722f93..9e2c4781 100644
--- a/extensions/ConfirmEdit/ReCaptcha.i18n.php
+++ b/extensions/ConfirmEdit/ReCaptcha.i18n.php
@@ -10,15 +10,16 @@ $messages = array();
 
 $messages['en'] = array(
 	'recaptcha-desc' => 'reCAPTCHA module for Confirm Edit',
-        'recaptcha-edit' => 'To help protect against automated edit spam, please type the two words you see in the box below:', 
-        'recaptcha-addurl' => 'Your edit includes new external links. To help protect against automated spam, please type the two words you see in the box below:',
-	'recaptcha-badpass' => 'To help protect against automated password cracking, please type the two words you see in the box below:',
-	'recaptcha-createaccount' => 'To help protect against automated account creation, please type the two words you see in the box below:',
+	'recaptcha-edit' => 'To protect the wiki against automated edit spam, we kindly ask you to type the two words you see in the box below:',
+	'recaptcha-addurl' => 'Your edit includes new external links. To protect the wiki against automated spam, we kindly ask you to type the two words you see in the box below:',
+	'recaptcha-badlogin' => 'To protect the wiki against automated password cracking, we kindly ask you to type the two words you see in the box below:',
+	'recaptcha-createaccount' => 'To protect the wiki against automated account creation, we kindly ask you to type the two words you see in the box below:',
 	'recaptcha-createaccount-fail' => "Incorrect or missing reCAPTCHA answer.",
-	'recaptcha-create' => 'To help protect against automated page creation, please type the two words you see in the box below:', 
+	'recaptcha-create' => 'To protect the wiki against automated page creation, we kindly ask you to type the two words you see in the box below:',
 );
 
 /** Message documentation (Message documentation)
+ * @author Raymond
  * @author Shirayuki
  * @author Umherirrender
  */
@@ -27,7 +28,7 @@ $messages['qqq'] = array(
 {{desc}}',
 	'recaptcha-edit' => '{{Related|ConfirmEdit-edit}}',
 	'recaptcha-addurl' => '{{Related|ConfirmEdit-addurl}}',
-	'recaptcha-badpass' => '{{Related|ConfirmEdit-badlogin}}',
+	'recaptcha-badlogin' => '{{Related|ConfirmEdit-badlogin}}',
 	'recaptcha-createaccount' => '{{Related|ConfirmEdit-createaccount}}',
 	'recaptcha-createaccount-fail' => '{{Related|ConfirmEdit-createaccount-fail}}',
 	'recaptcha-create' => '{{Related|ConfirmEdit-create}}',
@@ -40,24 +41,24 @@ $messages['qqq'] = array(
  */
 $messages['ar'] = array(
 	'recaptcha-desc' => 'موديل reCAPTCHA لConfirm Edit',
-	'recaptcha-edit' => 'للمساعدة في الحماية ضد التحرير السبام، يرجى كتابة الكلمتين التي تراها في المربع أدناه :',
-	'recaptcha-addurl' => 'إن تعديلك يتضمن وصلات خارجية جديدة. للمساعدة في الحماية ضد السبام، يرجى كتابة الكلمتين التي تراها في المربع أدناه :',
-	'recaptcha-badpass' => 'للمساعدة في الحماية ضد الكسر الآلي لكلمة السر، يرجى كتابة الكلمتين اللتين تراهما في المربع أدناه :',
-	'recaptcha-createaccount' => 'للمساعدة في الحماية ضد الإنشاء الآلي للحسابات، رجاء اكتب الكلمتين اللتين تراهما في المربع أدناه:',
+	'recaptcha-edit' => 'للمساعدة في الحماية ضد التحرير السبام، يرجى كتابة الكلمتين التي تراها في المربع أدناه :', # Fuzzy
+	'recaptcha-addurl' => 'إن تعديلك يتضمن وصلات خارجية جديدة. للمساعدة في الحماية ضد السبام، يرجى كتابة الكلمتين التي تراها في المربع أدناه :', # Fuzzy
+	'recaptcha-badlogin' => 'للمساعدة في الحماية ضد الكسر الآلي لكلمة السر، يرجى كتابة الكلمتين اللتين تراهما في المربع أدناه :', # Fuzzy
+	'recaptcha-createaccount' => 'للمساعدة في الحماية ضد الإنشاء الآلي للحسابات، رجاء اكتب الكلمتين اللتين تراهما في المربع أدناه:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'جواب reCAPTCHA غير صحيح أو مفقود.',
-	'recaptcha-create' => 'للمساعدة في الحماية ضد الإنشاء الآلي للصفحات، يرجى كتابة الكلمتين اللتين تراهما في المربع أدناه :',
+	'recaptcha-create' => 'للمساعدة في الحماية ضد الإنشاء الآلي للصفحات، يرجى كتابة الكلمتين اللتين تراهما في المربع أدناه :', # Fuzzy
 );
 
 /** Asturian (asturianu)
  * @author Xuacu
  */
 $messages['ast'] = array(
-	'recaptcha-edit' => "P'ayudar a protexenos escontra'l spam d'edición, escribi les dos pallabres que se ven na caxella d'abaxo:",
-	'recaptcha-addurl' => "La to edición incluye enllaces esternos nuevos. P'ayudar a protexenos escontra'l spam automáticu, escribi les dos pallabres que se ven na caxella d'abaxo:",
-	'recaptcha-badpass' => "P'ayudar a protexenos escontra'l frañimientu de claves automáticu, escribi les dos pallabres que se ven na caxella d'abaxo:",
-	'recaptcha-createaccount' => "P'ayudar a protexenos escontra la creación de cuentes automática, escribi les dos pallabres que se ven na caxella d'abaxo:",
+	'recaptcha-edit' => "Pa protexer la wiki escontra'l spam d'edición automáticu, pidimos-y qu'escriba les dos pallabres que se ven na caxella d'abaxo:",
+	'recaptcha-addurl' => "La so edición incluye enllaces esternos nuevos. Pa protexer la wiki escontra'l spam automáticu, pidimos-y qu'escriba les dos pallabres que se ven na caxella d'abaxo:",
+	'recaptcha-badlogin' => "Pa protexer la wiki escontra'l descifráu de claves automáticu, pidimos-y qu'escriba les dos pallabres que se ven na caxella d'abaxo:",
+	'recaptcha-createaccount' => "Pa protexer la wiki escontra la creación de cuentes automática, pidimos-y qu'escriba les dos pallabres que se ven na caxella d'abaxo:",
 	'recaptcha-createaccount-fail' => 'Falta la rempuesta a la entruga de reCAPTCHA o ye incorreuta',
-	'recaptcha-create' => "P'ayudar a protexenos escontra la creación de páxines automática, escribi les dos pallabres que se ven na caxella d'abaxo:",
+	'recaptcha-create' => "Pa protexer la wiki escontra la creación de páxines automática, pidimos-y qu'escriba les dos pallabres que se ven na caxella d'abaxo:",
 );
 
 /** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
@@ -65,36 +66,37 @@ $messages['ast'] = array(
  * @author Jim-by
  */
 $messages['be-tarask'] = array(
-	'recaptcha-edit' => 'Для абароны супраць спаму, калі ласка, увядзіце два словы, якія Вы бачыце ў полі ніжэй:',
-	'recaptcha-addurl' => 'Вашае рэдагаваньне ўтрымлівае новыя вонкавыя спасылкі. Для абароны супраць спаму, калі ласка, увядзіце два словы, якія Вы бачыце ў полі ніжэй:',
-	'recaptcha-badpass' => 'Для абароны супраць узлому паролю, калі ласка, увядзіце два словы, якія Вы бачыце ў полі ніжэй:',
-	'recaptcha-createaccount' => 'Для абароны супраць аўтаматычнага стварэньня рахункаў, калі ласка, увядзіце два словы, якія Вы бачыце ў полі ніжэй:',
+	'recaptcha-edit' => 'Для абароны супраць спаму, калі ласка, увядзіце два словы, якія Вы бачыце ў полі ніжэй:', # Fuzzy
+	'recaptcha-addurl' => 'Вашае рэдагаваньне ўтрымлівае новыя вонкавыя спасылкі. Для абароны супраць спаму, калі ласка, увядзіце два словы, якія Вы бачыце ў полі ніжэй:', # Fuzzy
+	'recaptcha-badlogin' => 'Для абароны супраць узлому паролю, калі ласка, увядзіце два словы, якія Вы бачыце ў полі ніжэй:', # Fuzzy
+	'recaptcha-createaccount' => 'Для абароны супраць аўтаматычнага стварэньня рахункаў, калі ласка, увядзіце два словы, якія Вы бачыце ў полі ніжэй:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'Адказ reCAPTCHA няслушны ці адсутнічае.',
-	'recaptcha-create' => 'Для абароны супраць аўтаматычнага стварэньня старонак, калі ласка, увядзіце два словы, якія Вы бачыце ў полі ніжэй:',
+	'recaptcha-create' => 'Для абароны супраць аўтаматычнага стварэньня старонак, калі ласка, увядзіце два словы, якія Вы бачыце ў полі ніжэй:', # Fuzzy
 );
 
 /** Breton (brezhoneg)
+ * @author Fohanno
  * @author Fulup
  */
 $messages['br'] = array(
-	'recaptcha-edit' => "Da sikour en em wareziñ diouzh ar stroboù emgefre, merkit an daou c'her a welit er voest dindan :",
-	'recaptcha-addurl' => "Liamm diavaez nevez zo bet degaset ganeoc'h. Da sikour en em wareziñ diouzh ar stroboù, merkit an daou c'her a welit er voest dindan :",
-	'recaptcha-badpass' => "Da sikour en em wareziñ diouzh an diskuliañ gerioù-tremen emgefre dre daolioù-esae, merkit an daou c'her a welit er voest dindan :",
-	'recaptcha-createaccount' => "Da sikour en em wareziñ diouzh ar c'hrouiñ kontoù emgefre, merkit an daou c'her a welit er voest dindan :",
+	'recaptcha-edit' => "Evit sikour en em wareziñ diouzh ar stroboù emgefre, merkit an daou c'her a welit er voest dindan :",
+	'recaptcha-addurl' => "Liamm diavaez nevez zo bet degaset ganeoc'h. Evit sikour en em wareziñ diouzh ar stroboù, merkit an daou c'her a welit er voest dindan :",
+	'recaptcha-badlogin' => "Da sikour en em wareziñ diouzh an diskuliañ gerioù-tremen emgefre dre daolioù-esae, merkit an daou c'her a welit er voest dindan :", # Fuzzy
+	'recaptcha-createaccount' => "Da sikour en em wareziñ diouzh ar c'hrouiñ kontoù emgefre, merkit an daou c'her a welit er voest dindan :", # Fuzzy
 	'recaptcha-createaccount-fail' => 'Respont reCAPTHCA faziek pe ezvezant.',
-	'recaptcha-create' => "Da sikour en em wareziñ diouzh ar c'hrouiñ pajennoù emgefre, merkit an daou c'her a welit er voest dindan :",
+	'recaptcha-create' => "Da sikour en em wareziñ diouzh ar c'hrouiñ pajennoù emgefre, merkit an daou c'her a welit er voest dindan :", # Fuzzy
 );
 
 /** Bosnian (bosanski)
  * @author CERminator
  */
 $messages['bs'] = array(
-	'recaptcha-edit' => 'Da bismo pomogli protiv automatiziranog spam uređivanja, molimo upišite dvije riječi koje vidite u kutiju ispod:',
-	'recaptcha-addurl' => 'Vaše izmjene uključuju nove vanjske linkove. Da bismo pomogli protiv automatiziranog spama, molimo upišite dvije riječi koje vidite u kutiju ispod.',
-	'recaptcha-badpass' => 'Da bismo pomogli protiv automatiziranog probijanja šifre, molimo upišite dvije riječi koje vidite u kutiju ispod:',
-	'recaptcha-createaccount' => 'Da bismo pomogli protiv automatiziranog pravljenja računa, molimo upišite dvije riječi koje vidite u kutiju ispod:',
+	'recaptcha-edit' => 'Da bismo pomogli protiv automatiziranog spam uređivanja, molimo upišite dvije riječi koje vidite u kutiju ispod:', # Fuzzy
+	'recaptcha-addurl' => 'Vaše izmjene uključuju nove vanjske linkove. Da bismo pomogli protiv automatiziranog spama, molimo upišite dvije riječi koje vidite u kutiju ispod.', # Fuzzy
+	'recaptcha-badlogin' => 'Da bismo pomogli protiv automatiziranog probijanja šifre, molimo upišite dvije riječi koje vidite u kutiju ispod:', # Fuzzy
+	'recaptcha-createaccount' => 'Da bismo pomogli protiv automatiziranog pravljenja računa, molimo upišite dvije riječi koje vidite u kutiju ispod:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'Neispravan ili nedostajući reCAPTCHA odgovor.',
-	'recaptcha-create' => 'Da bismo pomogli protiv automatiziranog pravljenja stranica, molimo upišite dvije riječi koje vidite u kutiju ispod:',
+	'recaptcha-create' => 'Da bismo pomogli protiv automatiziranog pravljenja stranica, molimo upišite dvije riječi koje vidite u kutiju ispod:', # Fuzzy
 );
 
 /** Czech (česky)
@@ -103,45 +105,46 @@ $messages['bs'] = array(
  */
 $messages['cs'] = array(
 	'recaptcha-desc' => 'Podpora reCAPTCHA pro rozšíření Confirm Edit',
-	'recaptcha-edit' => 'V zájmu ochrany před automatickým spamováním opište dvě slova, která vidíte na obrázku:',
-	'recaptcha-addurl' => 'Vaše editace obsahuje nové externí odkazy. V zájmu ochrany před automatickým spamováním opište dvě slova, která vidíte na obrázku:',
-	'recaptcha-badpass' => 'V zájmu ochrany proti automatickým pokusům uhodnout heslo opište dvě slova, která vidíte na obrázku:',
-	'recaptcha-createaccount' => 'V rámci ochrany před automatickým vytvářením účtů opište dvě slova, která vidíte na obrázku:',
+	'recaptcha-edit' => 'V zájmu ochrany před automatickým spamováním opište dvě slova, která vidíte na obrázku:', # Fuzzy
+	'recaptcha-addurl' => 'Vaše editace obsahuje nové externí odkazy. V zájmu ochrany před automatickým spamováním opište dvě slova, která vidíte na obrázku:', # Fuzzy
+	'recaptcha-badlogin' => 'V zájmu ochrany proti automatickým pokusům uhodnout heslo opište dvě slova, která vidíte na obrázku:', # Fuzzy
+	'recaptcha-createaccount' => 'V rámci ochrany před automatickým vytvářením účtů opište dvě slova, která vidíte na obrázku:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'Nesprávná nebo chybějící odpověď na reCAPTCHA.',
-	'recaptcha-create' => 'V zájmu ochrany před automatickým zakládáním stránek opište dvě slova, která vidíte na obrázku:',
+	'recaptcha-create' => 'V zájmu ochrany před automatickým zakládáním stránek opište dvě slova, která vidíte na obrázku:', # Fuzzy
 );
 
 /** Welsh (Cymraeg)
  * @author Lloffiwr
  */
 $messages['cy'] = array(
-	'recaptcha-edit' => "Er mwyn ei gwneud yn anodd i olygyddion awtomatig osod sbam, teipiwch y ddau air sydd i'w gweld yn y blwch isod:",
-	'recaptcha-addurl' => "Mae'ch golygiad yn cynnwys cysylltiadau allanol newydd. Er mwyn helpu i ddiogelu rhag sbam awtomatig, teipiwch y ddau air sydd i'w gweld yn y blwch isod:",
-	'recaptcha-badpass' => "Er mwyn helpu i arbed rhag i'ch cyfrinair gael ei ddatrys gan beiriant, teipiwch y ddau air sydd i'w gweld yn y blwch isod:",
-	'recaptcha-createaccount' => "Er mwyn ei gwneud yn anodd i beiriannau i agor cyfrifon yn awtomatig, teipiwch y ddau air sydd i'w gweld yn y blwch isod:",
+	'recaptcha-edit' => "Er mwyn arbed y wici rhag i olygyddion awtomatig osod sbam, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:",
+	'recaptcha-addurl' => "Mae'ch golygiad yn cynnwys cysylltiadau allanol newydd. Er mwyn arbed y wici rhag sbam awtomatig, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:",
+	'recaptcha-badlogin' => "Er mwyn arbed y wici rhag peiriannau sy'n datrys cyfrineiriau'n awtomatig, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:",
+	'recaptcha-createaccount' => "Er mwyn arbed y wici rhag peiriannau sy'n dechrau cyfrifon yn awtomatig, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:",
 	'recaptcha-createaccount-fail' => "Mae'r ateb i'r pos CAPTCHA yn anghywir neu yn eisiau.",
-	'recaptcha-create' => "Er mwyn ei gwneud yn anodd i beiriannau i ddechrau tudalennau yn awtomatig, teipiwch y ddau air sydd i'w gweld yn y blwch isod:",
+	'recaptcha-create' => "Er mwyn arbed y wici rhag peiriannau sy'n dechrau tudalennau yn awtomatig, byddwch gystal â theipio'r ddau air sydd i'w gweld yn y blwch isod:",
 );
 
 /** German (Deutsch)
  * @author Kghbln
+ * @author Metalhead64
  * @author Umherirrender
  */
 $messages['de'] = array(
 	'recaptcha-desc' => 'reCAPTCHA-Module für die Erweiterung „Confirm Edit“',
-	'recaptcha-edit' => 'Zum Schutz vor automatisiertem Spam, gib bitte die beiden folgenden Wörter in das untenstehende Feld ein:',
-	'recaptcha-addurl' => 'Deine Bearbeitung enthält neue externe Links. Zum Schutz vor automatisiertem Spam gib bitte die beiden folgenden Wörter in das folgende Feld ein:',
-	'recaptcha-badpass' => 'Zum Schutz gegen automatisiertes Knacken von Passwörtern, gib bitte die beiden folgenden Wörter in das folgende Feld ein:',
-	'recaptcha-createaccount' => 'Zum Schutz gegen die automatisierte Erstellung von Benutzerkonten bitten wir dich, die folgenden beiden Wörter in das untenstehende Feld einzugeben:',
+	'recaptcha-edit' => 'Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, die beiden folgenden Wörter in das untenstehende Feld einzugeben:',
+	'recaptcha-addurl' => 'Deine Bearbeitung enthält neue externe Links. Zum Schutz des Wikis vor automatisiertem Spam bitten wir dich, die beiden folgenden Wörter in das folgende Feld einzugeben:',
+	'recaptcha-badlogin' => 'Zum Schutz des Wikis gegen automatisiertes Knacken von Passwörtern bitten wir dich, die beiden folgenden Wörter in das folgende Feld einzugeben:',
+	'recaptcha-createaccount' => 'Zum Schutz des Wikis gegen die automatisierte Erstellung von Benutzerkonten bitten wir dich, die folgenden beiden Wörter in das untenstehende Feld einzugeben:',
 	'recaptcha-createaccount-fail' => 'Fehlerhafte oder fehlende reCAPTCHA Antwort.',
-	'recaptcha-create' => 'Zum Schutz gegen automatisierte Erstellung von Seiten gib bitte die beiden folgenden Wörter in das folgende Feld ein:',
+	'recaptcha-create' => 'Zum Schutz des Wikis gegen automatisierte Erstellung von Seiten bitten wir dich, die beiden folgenden Wörter in das folgende Feld einzugeben:',
 );
 
 /** German (formal address) (Deutsch (Sie-Form)‎)
  * @author Kghbln
  */
 $messages['de-formal'] = array(
-	'recaptcha-createaccount' => 'Zum Schutz gegen die automatisierte Erstellung von Benutzerkonten bitten wir Sie, die folgenden beiden Wörter in das untenstehende Feld einzugeben:',
+	'recaptcha-createaccount' => 'Zum Schutz gegen die automatisierte Erstellung von Benutzerkonten bitten wir Sie, die folgenden beiden Wörter in das untenstehende Feld einzugeben:', # Fuzzy
 );
 
 /** Lower Sorbian (dolnoserbski)
@@ -155,12 +158,12 @@ $messages['dsb'] = array(
  * @author Fitoschido
  */
 $messages['es'] = array(
-	'recaptcha-edit' => 'Para protegernos de la publicidad automatizada, escribe las dos palabras visibles en el cuadro de abajo:',
-	'recaptcha-addurl' => 'Tu edición incluye nuevos enlaces externos. Para ayudar a protegernos contra el spam automatizado, por favor, escribe las dos palabras que ves en el cuadro a continuación:',
-	'recaptcha-badpass' => 'Para protegernos del robo automatizado de contraseñas, escribe las dos palabras visibles en el cuadro de abajo:',
-	'recaptcha-createaccount' => 'Para protegernos de la creación automática de cuentas, escribe las dos palabras que ves en el cuadro de abajo:',
+	'recaptcha-edit' => 'Para protegernos de la publicidad automatizada, escribe las dos palabras visibles en el cuadro de abajo:', # Fuzzy
+	'recaptcha-addurl' => 'Tu edición incluye nuevos enlaces externos. Para ayudar a protegernos contra el spam automatizado, por favor, escribe las dos palabras que ves en el cuadro a continuación:', # Fuzzy
+	'recaptcha-badlogin' => 'Para protegernos del robo automatizado de contraseñas, escribe las dos palabras visibles en el cuadro de abajo:', # Fuzzy
+	'recaptcha-createaccount' => 'Para protegernos de la creación automática de cuentas, escribe las dos palabras que ves en el cuadro de abajo:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'ReCAPTCHA incorrecto o sin responder.',
-	'recaptcha-create' => 'Para protegernos de la creación automática de páginas, escribe las dos palabras que ves en el cuadro de abajo:',
+	'recaptcha-create' => 'Para protegernos de la creación automática de páginas, escribe las dos palabras que ves en el cuadro de abajo:', # Fuzzy
 );
 
 /** Finnish (suomi)
@@ -168,24 +171,25 @@ $messages['es'] = array(
  * @author VezonThunder
  */
 $messages['fi'] = array(
-	'recaptcha-edit' => 'Suojana automaattisia roskamuokkauksia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
-	'recaptcha-addurl' => 'Muokkauksesi sisältää uusia ulkoisia linkkejä. Suojana automaattista roskapostia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
-	'recaptcha-badpass' => 'Suojana automaattisia salasanamurtoja vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
-	'recaptcha-createaccount' => 'Suojana automaattista tunnusten luontia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
+	'recaptcha-edit' => 'Suojana automaattisia roskamuokkauksia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:', # Fuzzy
+	'recaptcha-addurl' => 'Muokkauksesi sisältää uusia ulkoisia linkkejä. Suojana automaattista roskapostia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:', # Fuzzy
+	'recaptcha-badlogin' => 'Suojana automaattisia salasanamurtoja vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:', # Fuzzy
+	'recaptcha-createaccount' => 'Suojana automaattista tunnusten luontia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'Väärä tai puuttuva reCAPTCHA-vastaus.',
-	'recaptcha-create' => 'Suojana automaattista sivujen luontia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:',
+	'recaptcha-create' => 'Suojana automaattista sivujen luontia vastaan sinun on syötettävä kaksi näkemääsi sanaa laatikkoon alla:', # Fuzzy
 );
 
 /** French (français)
+ * @author Gomoko
  * @author Urhixidur
  */
 $messages['fr'] = array(
-	'recaptcha-edit' => "Pour nous protéger des robots, merci d'écrire les deux mots visibles dans le cadre qui suit:",
-	'recaptcha-addurl' => 'Votre contribution contient des liens vers un site externe. Pour nous protéger des robots, merci d’écrire les deux mots visibles dans le cadre qui suit :',
-	'recaptcha-badpass' => "Pour nous protéger des essais automatiques de cassage de mot de passe, merci d'écrire les deux mots visibles dans le cadre qui suit:",
-	'recaptcha-createaccount' => "Pour nous protéger des créations automatiques de compte, merci d'écrire les deux mots visibles dans le cadre qui suit:",
+	'recaptcha-edit' => 'Afin de protéger le wiki du spam des modifications automatisées, nous vous demandons de bien vouloir écrire les deux mots visibles dans le cadre ci-dessous :',
+	'recaptcha-addurl' => 'Votre contribution contient des liens vers un site externe. Pour protéger le wiki contre le spam automatisé, nous vous demandons de bien vouloir écrire les deux mots visibles dans le cadre qui suit :',
+	'recaptcha-badlogin' => 'Pour protéger le wiki des essais automatiques de cassage de mot de passe, nous vous demandons de bien vouloir écrire les deux mots visibles dans le cadre qui suit:',
+	'recaptcha-createaccount' => 'Pour protéger le wiki des créations automatiques de compte, nous vous demandons de bien vouloir écrire les deux mots visibles dans le cadre qui suit :',
 	'recaptcha-createaccount-fail' => 'Réponse de reCAPTCHA fausse ou manquante.',
-	'recaptcha-create' => "Pour nous protéger des créations automatiques de pages, merci d'écrire les deux mots visibles dans le cadre qui suit:",
+	'recaptcha-create' => 'Pour protéger le wiki des créations automatiques de pages, nous vous demandons de bien vouloir écrire les deux mots visibles dans le cadre qui suit :',
 );
 
 /** Galician (galego)
@@ -193,83 +197,84 @@ $messages['fr'] = array(
  */
 $messages['gl'] = array(
 	'recaptcha-desc' => 'Módulo de reCAPTCHA para Confirm Edit',
-	'recaptcha-edit' => 'Para axudarnos á protección contra o spam, escriba as dúas palabras que vexa nesta caixa:',
-	'recaptcha-addurl' => 'A súa edición inclúe novas ligazóns externas. Para axudar na protección contra o spam automático, ten que escribir as dúas palabras que aparecen na caixa inferior:',
-	'recaptcha-badpass' => 'Para axudarnos á protección contra o roubo de contrasinais, escriba as dúas palabras que vexa nesta caixa:',
-	'recaptcha-createaccount' => 'Para axudarnos á protección contra a creación automática de contas, escriba as dúas palabras que vexa nesta caixa:',
+	'recaptcha-edit' => 'Para protexer o wiki contra o spam automático, introduza as dúas palabras que vexa na caixa:',
+	'recaptcha-addurl' => 'A súa edición inclúe novas ligazóns externas. Para protexer o wiki contra o spam automático, introduza as dúas palabras que vexa na caixa:',
+	'recaptcha-badlogin' => 'Para protexer o wiki contra o roubo de contrasinais, introduza as dúas palabras que vexa na caixa:',
+	'recaptcha-createaccount' => 'Para protexer o wiki contra a creación automática de contas, introduza as dúas palabras que vexa na caixa:',
 	'recaptcha-createaccount-fail' => 'Falta a resposta ao reCAPTCHA ou esta é incorrecta.',
-	'recaptcha-create' => 'Para axudarnos á protección contra a creación automática de páxinas, escriba as dúas palabras que vexa nesta caixa:',
+	'recaptcha-create' => 'Para protexer o wiki contra a creación automática de páxinas, introduza as dúas palabras que vexa na caixa:',
 );
 
 /** Swiss German (Alemannisch)
  * @author Als-Holder
  */
 $messages['gsw'] = array(
-	'recaptcha-edit' => 'Zum Schutz vor automatisiertem Spam, gib bitte di beide Werter in s Fäld unten yy:',
-	'recaptcha-addurl' => 'In Dyre Bearbeitg het s neji extärni Links. Zum Schutz vor automatisiertem Spam, gib bitte di beide Werter in s Fäld unten yy:',
-	'recaptcha-badpass' => 'Zum Schutz gege automatisiert Knacken vu Passwerter, gib bitte di beide Werter in s Fäld unten yy:',
-	'recaptcha-createaccount' => 'Zum Schutz gege s automatisiert Aalege vu Benutzerkonte, gib bitte di beide Werter in s Fäld unten yy:',
+	'recaptcha-edit' => 'Zum Schutz vor automatisiertem Spam, gib bitte di beide Werter in s Fäld unten yy:', # Fuzzy
+	'recaptcha-addurl' => 'In Dyre Bearbeitg het s neji extärni Links. Zum Schutz vor automatisiertem Spam, gib bitte di beide Werter in s Fäld unten yy:', # Fuzzy
+	'recaptcha-badlogin' => 'Zum Schutz gege automatisiert Knacken vu Passwerter, gib bitte di beide Werter in s Fäld unten yy:', # Fuzzy
+	'recaptcha-createaccount' => 'Zum Schutz gege s automatisiert Aalege vu Benutzerkonte, gib bitte di beide Werter in s Fäld unten yy:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'D reCAPTCHA-Antwort isch fählerhaft oder si fählt.',
-	'recaptcha-create' => 'Zum Schutz gege s automatisiert Aalege vu Syte, gib bitte di beide Werter in s Fäld unten yy:',
+	'recaptcha-create' => 'Zum Schutz gege s automatisiert Aalege vu Syte, gib bitte di beide Werter in s Fäld unten yy:', # Fuzzy
 );
 
 /** Hebrew (עברית)
  */
 $messages['he'] = array(
-	'recaptcha-edit' => 'אינכם משתמש רשום.כהגנה מפני ספאם אוטומטי, אנא הקלידו את שתי המילים שלהלן. תודה.',
-	'recaptcha-addurl' => 'אינכם משתמש רשום.כהגנה מפני ספאם אוטומטי, אנא הקלידו את שתי המילים שלהלן. תודה.',
-	'recaptcha-badpass' => 'כהגנה מפני מפצחי סיסמאות אוטומטיים אנא הקלידו את שתי המילים שלהלן:',
-	'recaptcha-createaccount' => 'כהגנה מפני יצירת חשבונות פיקטיביים ע"י אוטומטים אנא הקלידו את שתי המילים שלהלן:',
+	'recaptcha-edit' => 'אינכם משתמש רשום.כהגנה מפני ספאם אוטומטי, אנא הקלידו את שתי המילים שלהלן. תודה.', # Fuzzy
+	'recaptcha-addurl' => 'אינכם משתמש רשום.כהגנה מפני ספאם אוטומטי, אנא הקלידו את שתי המילים שלהלן. תודה.', # Fuzzy
+	'recaptcha-badlogin' => 'כהגנה מפני מפצחי סיסמאות אוטומטיים אנא הקלידו את שתי המילים שלהלן:', # Fuzzy
+	'recaptcha-createaccount' => 'כהגנה מפני יצירת חשבונות פיקטיביים ע"י אוטומטים אנא הקלידו את שתי המילים שלהלן:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'לא הוקלדו מילות האישור, או שהוקלדו מילים לא נכונות. נסו שנית.',
-	'recaptcha-create' => 'אינכם משתמש רשום.כהגנה מפני ספאם אוטומטי, אנא הקלידו את שתי המילים שלהלן. תודה.',
+	'recaptcha-create' => 'אינכם משתמש רשום.כהגנה מפני ספאם אוטומטי, אנא הקלידו את שתי המילים שלהלן. תודה.', # Fuzzy
 );
 
 /** Upper Sorbian (hornjoserbsce)
  * @author Michawiki
  */
 $messages['hsb'] = array(
-	'recaptcha-edit' => 'Za škit přećiwo awtomatizowanemu spamej, prošu zapisaj dwě słowje, kotrejž w slědowacym polu widźiš:',
-	'recaptcha-addurl' => 'Twoja změna wobsahuje nowe eksterne wotkazy. Za škit přećiwo awtomatizowanemu spamej, prošu zapisaj dwě słowje, kotrerjž w slědowacym polu widźiš:',
-	'recaptcha-badpass' => 'Za škit přećiwo awtomatizowanemu złamanju hesłow, zapisaj prošu wobě słowje, kotrejž widźiš, do slědowaceho pola:',
-	'recaptcha-createaccount' => 'Za škit přećiwo awtomatiskemu wutworjenju konta, prošu zapisaj tej wobě słowje, kotrejž w slědowacym polu widźiš:',
+	'recaptcha-edit' => 'Za škit přećiwo awtomatizowanemu spamej, prošu zapisaj dwě słowje, kotrejž w slědowacym polu widźiš:', # Fuzzy
+	'recaptcha-addurl' => 'Twoja změna wobsahuje nowe eksterne wotkazy. Za škit přećiwo awtomatizowanemu spamej, prošu zapisaj dwě słowje, kotrerjž w slědowacym polu widźiš:', # Fuzzy
+	'recaptcha-badlogin' => 'Za škit přećiwo awtomatizowanemu złamanju hesłow, zapisaj prošu wobě słowje, kotrejž widźiš, do slědowaceho pola:', # Fuzzy
+	'recaptcha-createaccount' => 'Za škit přećiwo awtomatiskemu wutworjenju konta, prošu zapisaj tej wobě słowje, kotrejž w slědowacym polu widźiš:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'Wopačna abo falowaca wotmołwa reCAPTCHA.',
-	'recaptcha-create' => 'Za škit přećiwo awtomatiskemu wutworjenju strony, prošu zapisaj tej wobě słowje, kotrejž w slědowacym polu widźiš:',
+	'recaptcha-create' => 'Za škit přećiwo awtomatiskemu wutworjenju strony, prošu zapisaj tej wobě słowje, kotrejž w slědowacym polu widźiš:', # Fuzzy
 );
 
 /** Interlingua (interlingua)
  * @author McDutchie
  */
 $messages['ia'] = array(
-	'recaptcha-edit' => 'Pro adjutar a proteger nos contra le spam automatisate, per favor entra le duo parolas que tu vide in le quadro sequente:',
-	'recaptcha-addurl' => 'Iste modification include nove ligamines externe. Pro adjutar a proteger nos contra le spam automatisate, per favor entra le duo parolas que tu vide in le quadro sequente:',
-	'recaptcha-badpass' => 'Pro adjutar a proteger nos contra le furto automatisate de contrasignos, per favor entra le duo parolas que tu vide in le quadro sequente:',
-	'recaptcha-createaccount' => 'Pro adjutar a proteger nos contra le creation automatisate de contos, per favor entra le duo parolas que tu vide in le quadro sequente:',
+	'recaptcha-edit' => 'Pro adjutar a proteger le wiki contra le spam automatisate, per favor dactylographa le duo parolas que tu vide in le quadro sequente:',
+	'recaptcha-addurl' => 'Iste modification include nove ligamines externe. Pro adjutar a proteger le wiki contra le spam automatisate, per favor dactylographa le duo parolas que tu vide in le quadro sequente:',
+	'recaptcha-badlogin' => 'Pro adjutar a proteger le wiki contra le furto automatisate de contrasignos, per favor dactylographa le duo parolas que tu vide in le quadro sequente:',
+	'recaptcha-createaccount' => 'Pro adjutar a proteger le wiki contra le creation automatisate de contos, per favor dactylographa le duo parolas que tu vide in le quadro sequente:',
 	'recaptcha-createaccount-fail' => 'Responsa reCAPTCHA incorrecte o mancante.',
-	'recaptcha-create' => 'Pro adjutar a proteger nos contra le creation automatisate de paginas, per favor entra le duo parolas que tu vide in le quadro sequente:',
+	'recaptcha-create' => 'Pro adjutar a proteger le wiki contra le creation automatisate de paginas, per favor dactylographa le duo parolas que tu vide in le quadro sequente:',
 );
 
 /** Indonesian (Bahasa Indonesia)
  * @author IvanLanin
  */
 $messages['id'] = array(
-	'recaptcha-edit' => 'Untuk membantu pelindungan terhadap spam penyuntingan otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:',
-	'recaptcha-addurl' => 'Suntingan Anda menyertakan pranala eksternal baru. Untuk membantu pelindungan terhadap spam otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:',
-	'recaptcha-badpass' => 'Untuk membantu pelindungan terhadap perengkahan sandi otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:',
-	'recaptcha-createaccount' => 'Untuk membantu pelindungan terhadap pembuatan akun otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:',
+	'recaptcha-edit' => 'Untuk membantu pelindungan terhadap spam penyuntingan otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:', # Fuzzy
+	'recaptcha-addurl' => 'Suntingan Anda menyertakan pranala eksternal baru. Untuk membantu pelindungan terhadap spam otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:', # Fuzzy
+	'recaptcha-badlogin' => 'Untuk membantu pelindungan terhadap perengkahan sandi otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:', # Fuzzy
+	'recaptcha-createaccount' => 'Untuk membantu pelindungan terhadap pembuatan akun otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'Jawaban reCAPTCHA tidak benar atau tidak dimasukkan.',
-	'recaptcha-create' => 'Untuk membantu pelindungan terhadap pembuatan halaman otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:',
+	'recaptcha-create' => 'Untuk membantu pelindungan terhadap pembuatan halaman otomatis, silakan ketik dua kata yang Anda lihat dalam kotak di bawah ini:', # Fuzzy
 );
 
 /** Italian (italiano)
+ * @author Beta16
  * @author Nemo bis
  */
 $messages['it'] = array(
-	'recaptcha-edit' => 'Per aiutarci a proteggerci dalle modifiche automatiche che aggiungono spam, scrivi le due parole mostrate nel riquadro sottostante:',
-	'recaptcha-addurl' => 'La tua modifica aggiunge qualche nuovo collegamento esterno. Per aiutarci a proteggerci dallo spam automatico, scrivi le due parole mostrate nel riquadro sottostante:',
-	'recaptcha-badpass' => 'Per aiutarci a proteggerci dalla forzatura automatica delle password, scrivi le due parole mostrate nel riquadro sottostante:',
-	'recaptcha-createaccount' => 'Per aiutarci a proteggerci dalla creazione automatica di nuovi accessi, scrivi le due parole mostrate nel riquadro sottostante:',
+	'recaptcha-edit' => 'Per proteggere il wiki dalle modifiche automatiche che aggiungono spam, ti chiediamo gentilmente di scrivere le due parole mostrate nel riquadro sottostante:',
+	'recaptcha-addurl' => 'La tua modifica aggiunge qualche nuovo collegamento esterno. Per proteggere il wiki dallo spam automatico, ti chiediamo gentilmente di scrivere le due parole mostrate nel riquadro sottostante:',
+	'recaptcha-badlogin' => 'Per proteggere il wiki dalla forzatura automatica delle password, ti chiediamo gentilmente di scrivere le due parole mostrate nel riquadro sottostante:',
+	'recaptcha-createaccount' => 'Per proteggere il wiki dalla creazione automatica di nuovi accessi, ti chiediamo gentilmente di scrivere le due parole mostrate nel riquadro sottostante:',
 	'recaptcha-createaccount-fail' => 'Risposta reCAPTCHA mancante o errata.',
-	'recaptcha-create' => 'Per aiutarci a proteggerci dalla creazione automatica di pagine, scrivi le due parole mostrate nel riquadro sottostante:',
+	'recaptcha-create' => 'Per proteggere il wiki dalla creazione automatica di pagine, ti chiediamo gentilmente di scrivere le due parole mostrate nel riquadro sottostante:',
 );
 
 /** Japanese (日本語)
@@ -277,12 +282,12 @@ $messages['it'] = array(
  */
 $messages['ja'] = array(
 	'recaptcha-desc' => 'Confirm Edit 用 reCAPTCHA モジュール',
-	'recaptcha-edit' => '自動編集のスパム攻撃を防ぐため、下の画像に表示されている 2 つの単語を入力してください:',
-	'recaptcha-addurl' => 'あなたは新しい外部リンクを追加しようとしています。自動でのスパム攻撃を防ぐため、下の画像に表示されている 2 つの単語を入力してください:',
-	'recaptcha-badpass' => '自動でのパスワードクラック攻撃を防ぐため、下の画像に表示されている 2 つの単語を入力してください:',
-	'recaptcha-createaccount' => 'アカウントの自動登録を防ぐため、下の画像に表示されている 2 つの単語を入力してください:',
+	'recaptcha-edit' => 'ウィキへの自動編集スパム攻撃を防ぐため、お手数をおかけしますが下の画像に表示されている 2 つの単語を入力してください:',
+	'recaptcha-addurl' => 'あなたは新しい外部リンクを追加しようとしています。ウィキへの自動スパム攻撃を防ぐため、お手数をおかけしますが下の画像に表示されている 2 つの単語を入力してください:',
+	'recaptcha-badlogin' => 'ウィキへの自動パスワードクラック攻撃を防ぐため、お手数をおかけしますが下の画像に表示されている 2 つの単語を入力してください:',
+	'recaptcha-createaccount' => 'ウィキでのアカウント自動作成を防ぐため、お手数をおかけしますが下の画像に表示されている 2 つの単語を入力してください:',
 	'recaptcha-createaccount-fail' => '文字列が正しくない、または入力されていません。',
-	'recaptcha-create' => 'ページの自動作成を防ぐため、下の画像に表示されている 2 つの単語を入力してください:',
+	'recaptcha-create' => 'ウィキでのページの自動作成を防ぐため、お手数をおかけしますが下の画像に表示されている 2 つの単語を入力してください:',
 );
 
 /** Korean (한국어)
@@ -290,12 +295,12 @@ $messages['ja'] = array(
  */
 $messages['ko'] = array(
 	'recaptcha-desc' => '편집 확인에 대한 reCAPCHA 모듈',
-	'recaptcha-edit' => '자동화된 편집 스팸으로부터 보호하기 위해, 아래 상자에 보이는 두 낱말을 입력하세요:',
-	'recaptcha-addurl' => '편집에 새로운 바깥 링크가 포함되어 있습니다. 자동화된 스팸으로부터 보호하기 위해, 아래 상자에 보이는 두 낱말을 입력하세요:',
-	'recaptcha-badpass' => '자동화된 비밀번호 깨기로부터 보호하기 위해, 아래 상자에 보이는 두 낱말을 입력하세요:',
-	'recaptcha-createaccount' => '자동화된 계정 만들기로부터 보호하기 위해, 아래 상자에 보이는 두 낱말을 입력하세요:',
+	'recaptcha-edit' => '자동화된 편집 스팸으로부터 보호하기 위해, 아래 상자에 보이는 두 낱말을 입력하세요:', # Fuzzy
+	'recaptcha-addurl' => '편집에 새로운 바깥 링크가 포함되어 있습니다. 자동화된 스팸으로부터 보호하기 위해, 아래 상자에 보이는 두 낱말을 입력하세요:', # Fuzzy
+	'recaptcha-badlogin' => '자동화된 비밀번호 깨기로부터 보호하기 위해, 아래 상자에 보이는 두 낱말을 입력하세요:', # Fuzzy
+	'recaptcha-createaccount' => '자동화된 계정 만들기로부터 보호하기 위해, 아래 상자에 보이는 두 낱말을 입력하세요:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'reCAPTCHA 답이 올바르지 않거나 없습니다.',
-	'recaptcha-create' => '자동화된 문서 만들기로부터 보호하기 위해, 아래 상자에 보이는 두 낱말을 입력하세요:',
+	'recaptcha-create' => '자동화된 문서 만들기로부터 보호하기 위해, 아래 상자에 보이는 두 낱말을 입력하세요:', # Fuzzy
 );
 
 /** Colognian (Ripoarisch)
@@ -306,7 +311,7 @@ $messages['ksh'] = array(
 Dat sull jääje et automattesche Ändere un SPAM em Wiki schöze.', # Fuzzy
 	'recaptcha-addurl' => 'Schrief di zwei Wööt en dä Kaste onge erin.
 Dat sull jääje automattesch en et Wiki jebraate SPAM schöze, nohdämm en Dingem Beidraach {{PLURAL:$1|ene neue Lengk dren es|neue Lengks dren sin|kein neue Lengks dren sin}}.', # Fuzzy
-	'recaptcha-badpass' => 'Schrief di zwei Wööt en dä Kaste onge erin.
+	'recaptcha-badlogin' => 'Schrief di zwei Wööt en dä Kaste onge erin.
 Dat sull jääje et automattesche Paßwoot Knacke em Wiki schöze.', # Fuzzy
 	'recaptcha-createaccount' => 'Schrief di zwei Wööt en dä Kaste onge erin.
 Dat sull jääje SPAM un automattesch aanjelaate Zohjäng nohm Wiki schöze.', # Fuzzy
@@ -319,12 +324,12 @@ Dat sull jääje SPAM un automattesch aanjelaate Sigge em Wiki schöze.', # Fuzz
  * @author Robby
  */
 $messages['lb'] = array(
-	'recaptcha-edit' => "Fir ze hëllefe eis géint automatiséierte Spam ze schützen, tippt w.e.g. déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner an:",
-	'recaptcha-addurl' => "An Ärer Ännerung sinn nei extern Linken! Fir ze hëllefe géint automatiséierte Spam virzegoen, tippt w.e.g. déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner:",
-	'recaptcha-badpass' => "Fir ze hëllefe eis géint d'automatiséiert hacke vu Passwierder ze schützen, tippt w.e.g. déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner an:",
-	'recaptcha-createaccount' => "Fir ze hëllefe eis géint d'automatiséiert Uleeë vu Benotzerkonten ze schützen, tippt w.e.g. déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner an:",
+	'recaptcha-edit' => "Fir d'Wiki géint automatiséierte Spam ze schützen, froe mir Iech déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner anzeginn:",
+	'recaptcha-addurl' => "An Ärer Ännerung sinn nei extern Linken! Fir dës Wikie géint automatiséierte Spam ze schütze, froe mir Iech déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner anzeginn:",
+	'recaptcha-badlogin' => "Fir d'Wiki géint d'automatiséiert Hacke vu Passwierder ze schützen, froe mir Iech déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner anzeginn:",
+	'recaptcha-createaccount' => "Fir d'Wiki géint d'automatiséiert Uleeë vu Benotzerkonten ze schützen, froe mir Iech déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner anzeginn:",
 	'recaptcha-createaccount-fail' => 'reCAPTCHA Äntwert feelt oder ass net korrekt.',
-	'recaptcha-create' => "Fir ze hëllefe eis géint d'automatiséiert Uleeë vu Säiten ze schützen, tippt w.e.g. déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner an:",
+	'recaptcha-create' => "Fir d'Wiki géint d'automatiséiert Uleeë vu Säiten ze schützen, froe mir Iech déi zwee Wierder déi Dir gesitt an d'Këscht ënnendrënner anzeginn:",
 );
 
 /** Macedonian (македонски)
@@ -332,82 +337,91 @@ $messages['lb'] = array(
  */
 $messages['mk'] = array(
 	'recaptcha-desc' => 'Модул reCAPTCHA за потврда на уредувања',
-	'recaptcha-edit' => 'Како заштитна мерка против автоматизиран спам, внесете ги двата збора прикажани во полето:',
-	'recaptcha-addurl' => 'Во вашите измени има нови надворешни врски. Како заштитна мерка против автоматизиран спам, внесете ги двата збора прикажани во полето:',
-	'recaptcha-badpass' => 'Како заштитна мерка против автоматизирано провалување на лозинки, внесете ги двата збора прикажани во полето:',
-	'recaptcha-createaccount' => 'Како заштитна мерка против автоматизирано создавање на сметки, внесете ги двата збора прикажани во полето:',
+	'recaptcha-edit' => 'Како заштитна мерка против автоматизиран спам, би ве замолиле да ги внесете двата збора прикажани во полето:',
+	'recaptcha-addurl' => 'Во вашите измени има нови надворешни врски. Како заштитна мерка против автоматизиран спам, би ве замолиле да внесете двата збора прикажани во полето:',
+	'recaptcha-badlogin' => 'Како заштитна мерка против автоматизирано провалување на лозинки, би ве замолиле да внесете двата збора прикажани во полето:',
+	'recaptcha-createaccount' => 'Како заштитна мерка против автоматизирано создавање на сметки, би ве замолиле да внесете двата збора прикажани во полето:',
 	'recaptcha-createaccount-fail' => 'reCAPTCHA доби погрешен одговор или одговорот недостасува.',
-	'recaptcha-create' => 'Како заштитна мерка против автоматизирано создавање на страници, внесете ги двата збора прикажани во полето:',
+	'recaptcha-create' => 'Како заштитна мерка против автоматизирано создавање на страници, би ве замолиле да внесете двата збора прикажани во полето:',
 );
 
 /** Malay (Bahasa Melayu)
  * @author Anakmalaysia
  */
 $messages['ms'] = array(
-	'recaptcha-edit' => 'Untuk membanteras kegiatan spam automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:',
-	'recaptcha-addurl' => 'Suntingan anda termasuk pautan luar baru. Untuk membanteras kegiatan spam automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:',
-	'recaptcha-badpass' => 'Untuk membanteras kegiatan meneka kata laluan secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:',
-	'recaptcha-createaccount' => 'Untuk membanteras kegiatan membuka akaun secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:',
+	'recaptcha-edit' => 'Untuk membanteras kegiatan spam automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:', # Fuzzy
+	'recaptcha-addurl' => 'Suntingan anda termasuk pautan luar baru. Untuk membanteras kegiatan spam automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:', # Fuzzy
+	'recaptcha-badlogin' => 'Untuk membanteras kegiatan meneka kata laluan secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:', # Fuzzy
+	'recaptcha-createaccount' => 'Untuk membanteras kegiatan membuka akaun secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'Jawapan reCAPTCHA tidak betul atau tidak ada.',
-	'recaptcha-create' => 'Untuk membanteras kegiatan mencipta laman secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:',
+	'recaptcha-create' => 'Untuk membanteras kegiatan mencipta laman secara automatik, sila taipkan dua perkataan yang anda lihat dalam petak di bawah:', # Fuzzy
 );
 
 /** Maltese (Malti)
  * @author Chrisportelli
  */
 $messages['mt'] = array(
-	'recaptcha-edit' => "Sabiex tgħinna nipproteġu kontra l-modifiki li jżidu spam, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
-	'recaptcha-addurl' => "Il-modifika tiegħek tinkludi ħoloq esterni ġodda. Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
-	'recaptcha-badpass' => "Sabiex tgħinna nipproteġu kontra l-infurzar awtomatiku tal-passwords, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
-	'recaptcha-createaccount' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' kontijiet ġodda, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
+	'recaptcha-edit' => "Sabiex tgħinna nipproteġu kontra l-modifiki li jżidu spam, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:", # Fuzzy
+	'recaptcha-addurl' => "Il-modifika tiegħek tinkludi ħoloq esterni ġodda. Sabiex tipproteġi kontra spam awtomatiku, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:", # Fuzzy
+	'recaptcha-badlogin' => "Sabiex tgħinna nipproteġu kontra l-infurzar awtomatiku tal-passwords, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:", # Fuzzy
+	'recaptcha-createaccount' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' kontijiet ġodda, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:", # Fuzzy
 	'recaptcha-createaccount-fail' => 'Tweġiba reCAPTCHA ħażina jew nieqsa.',
-	'recaptcha-create' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' paġni, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:",
+	'recaptcha-create' => "Sabiex tgħinna nipproteġu kontra l-ħolqien awtomatiku ta' paġni, jekk jogħġbok ikteb iż-żewġ kelmiet li tara fil-kaxxa t'hawn taħt:", # Fuzzy
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Event
  */
 $messages['nb'] = array(
-	'recaptcha-edit' => 'Som beskyttelse mot automatisk redigert spam, vennligst skriv inn de to ordene du ser i boksen under:',
-	'recaptcha-addurl' => 'Din redigering inneholder nye eksterne lenker. Som beskyttelse mot automatisk spam, vennligst skriv inn de to ordene du ser i boksen under:',
-	'recaptcha-badpass' => 'Som beskyttelse mot automatisk passordknekking, vennligst skriv inn de to ordene du ser i boksen under:',
-	'recaptcha-createaccount' => 'Som beskyttelse mot automatisk opprettelse av brukerkonto, vennligst skriv inn de to ordene du ser i boksen under:',
+	'recaptcha-edit' => 'Som beskyttelse mot automatisk redigert spam, vennligst skriv inn de to ordene du ser i boksen under:', # Fuzzy
+	'recaptcha-addurl' => 'Din redigering inneholder nye eksterne lenker. Som beskyttelse mot automatisk spam, vennligst skriv inn de to ordene du ser i boksen under:', # Fuzzy
+	'recaptcha-badlogin' => 'Som beskyttelse mot automatisk passordknekking, vennligst skriv inn de to ordene du ser i boksen under:', # Fuzzy
+	'recaptcha-createaccount' => 'Som beskyttelse mot automatisk opprettelse av brukerkonto, vennligst skriv inn de to ordene du ser i boksen under:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'Feil eller manglende reCAPTCHA-svar.',
-	'recaptcha-create' => 'Som beskyttelse mot automatisk opprettelse av side, vennligst skriv inn de to ordene du ser i boksen under:',
+	'recaptcha-create' => 'Som beskyttelse mot automatisk opprettelse av side, vennligst skriv inn de to ordene du ser i boksen under:', # Fuzzy
 );
 
 /** Dutch (Nederlands)
+ * @author HanV
  * @author Siebrand
  */
 $messages['nl'] = array(
-	'recaptcha-edit' => 'Voer ter bescherming tegen geautomatiseerde spam de twee woorden die u ziet in het invoervenster in:',
-	'recaptcha-addurl' => 'Uw bewerking bevat nieuwe externe koppelingen. Voer ter bescherming tegen geautomatiseerde spam de twee woorden die u ziet in het invoervenster in:',
-	'recaptcha-badpass' => 'Voer ter bescherming tegen het automatisch kraken van wachtwoorden de twee woorden die u ziet in het invoervenster in:',
-	'recaptcha-createaccount' => 'Om het automatisch aanmaken van gebruikers tegen te gaan moet u de twee woorden die u ziet invoeren:',
+	'recaptcha-edit' => 'Voer ter bescherming tegen geautomatiseerde spam de twee woorden in die u in het onderstaande venster ziet:',
+	'recaptcha-addurl' => 'Uw bewerking bevat nieuwe externe koppelingen. Voer ter bescherming tegen geautomatiseerde spam de twee woorden in die u ziet in het onderstaande venster:',
+	'recaptcha-badlogin' => 'Voer ter bescherming tegen het automatisch kraken van wachtwoorden de twee woorden in die u ziet in het invoervenster:',
+	'recaptcha-createaccount' => 'Om het automatisch aanmaken van gebruikers tegen te gaan moet u de twee woorden in het onderstaande venster invoeren:',
 	'recaptcha-createaccount-fail' => 'Het reCAPTCHA-antwoord is onjuist of niet ingevoerd.',
-	'recaptcha-create' => "Om het automatisch aanmaken van pagina's tegen te gaan moet u de twee woorden die u ziet invoeren:",
+	'recaptcha-create' => 'Om het automatisch aanmaken van een pagina tegen te gaan moet u de twee woorden invoeren die in het onderstaande veld staan:',
 );
 
 /** Nederlands (informeel)‎ (Nederlands (informeel)‎)
  * @author Siebrand
  */
 $messages['nl-informal'] = array(
-	'recaptcha-edit' => 'Voer ter bescherming tegen geautomatiseerde spam de twee woorden die je ziet in het invoervenster in:',
-	'recaptcha-addurl' => 'Je bewerking bevat nieuwe externe koppelingen. Voer ter bescherming tegen geautomatiseerde spam de twee woorden die je ziet in het invoervenster in:',
-	'recaptcha-badpass' => 'Voer ter bescherming tegen het automatisch kraken van wachtwoorden de twee woorden die je ziet in het invoervenster in:',
-	'recaptcha-createaccount' => 'Om het automatisch aanmaken van gebruikers tegen te gaan moet je de twee woorden die je ziet invoeren:',
-	'recaptcha-create' => "Om het automatisch aanmaken van pagina's tegen te gaan moet je de twee woorden die je ziet invoeren:",
+	'recaptcha-edit' => 'Voer ter bescherming tegen geautomatiseerde spam de twee woorden die je ziet in het invoervenster in:', # Fuzzy
+	'recaptcha-addurl' => 'Je bewerking bevat nieuwe externe koppelingen. Voer ter bescherming tegen geautomatiseerde spam de twee woorden die je ziet in het invoervenster in:', # Fuzzy
+	'recaptcha-badlogin' => 'Voer ter bescherming tegen het automatisch kraken van wachtwoorden de twee woorden die je ziet in het invoervenster in:', # Fuzzy
+	'recaptcha-createaccount' => 'Om het automatisch aanmaken van gebruikers tegen te gaan moet je de twee woorden die je ziet invoeren:', # Fuzzy
+	'recaptcha-create' => "Om het automatisch aanmaken van pagina's tegen te gaan moet je de twee woorden die je ziet invoeren:", # Fuzzy
+);
+
+/** Occitan (occitan)
+ * @author Cedric31
+ */
+$messages['oc'] = array(
+	'recaptcha-createaccount-fail' => 'Responsa de reCAPTCHA faussa o mancanta.',
 );
 
 /** Polish (polski)
+ * @author WTM
  */
 $messages['pl'] = array(
-	'recaptcha-edit' => 'Aby uchronić nas przed robotami, proszę wpisać dwa widoczne słowa w poniższym polu:',
-	'recaptcha-addurl' => 'Twoja edycja zawiera linki zewnętrzne. Aby uchronić nas przed robotami, proszę wpisać dwa widoczne słowa w poniższym polu:',
-	'recaptcha-badpass' => 'Aby uchronić nas przed złamaniem automatycznym haseł, proszę wpisać dwa widoczne słowa w poniższym polu:',
-	'recaptcha-createaccount' => 'Aby uchronić nas przed automatycznym stworzeniem użytkowników, proszę wpisać dwa widoczne słowa w poniższym polu:',
+	'recaptcha-edit' => 'Aby uchronić nas przed robotami, proszę wpisać dwa widoczne słowa w poniższym polu:', # Fuzzy
+	'recaptcha-addurl' => 'Twoja edycja zawiera linki zewnętrzne. Aby uchronić nas przed robotami, proszę wpisać dwa widoczne słowa w poniższym polu:', # Fuzzy
+	'recaptcha-badlogin' => 'Aby uchronić nas przed złamaniem automatycznym haseł, proszę wpisać dwa widoczne słowa w poniższym polu:', # Fuzzy
+	'recaptcha-createaccount' => 'Aby uchronić nas przed automatycznym tworzeniem użytkowników, proszę wpisać dwa widoczne słowa w poniższym polu:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'Odpowiedź na reCAPTCHA jest fałszywa lub brakująca.',
-	'recaptcha-create' => 'Aby uchronić nas przed tworzeniem stron przez robotów, proszę wpisać dwa widoczne słowa w poniższym polu:',
+	'recaptcha-create' => 'Aby uchronić nas przed tworzeniem stron przez robotów, proszę wpisać dwa widoczne słowa w poniższym polu:', # Fuzzy
 );
 
 /** Piedmontese (Piemontèis)
@@ -415,59 +429,60 @@ $messages['pl'] = array(
  * @author Dragonòt
  */
 $messages['pms'] = array(
-	'recaptcha-edit' => "Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël quàder sì-sota:",
-	'recaptcha-addurl' => "Soa modìfica a conten d'anliure esterne neuv. Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël quàder sì-sota:",
-	'recaptcha-badpass' => "Për giuté a protege contra la forsadura automatisà ëd le ciav, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël formolari sì-sota:",
-	'recaptcha-createaccount' => "Për giuté a protege contra la creassion automatisà ëd cont, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël formolari sì-sota:",
+	'recaptcha-edit' => "Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël quàder sì-sota:", # Fuzzy
+	'recaptcha-addurl' => "Soa modìfica a conten d'anliure esterne neuv. Për giuté a protege contra la rumenta dle modìfiche automàtiche, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël quàder sì-sota:", # Fuzzy
+	'recaptcha-badlogin' => "Për giuté a protege contra la forsadura automatisà ëd le ciav, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël formolari sì-sota:", # Fuzzy
+	'recaptcha-createaccount' => "Për giuté a protege contra la creassion automatisà ëd cont, për piasì ch'a scriva le doe paròle ch'a s-ciàira ant ël formolari sì-sota:", # Fuzzy
 	'recaptcha-createaccount-fail' => 'Rispòsta ëd reCAPTCHA fàussa o mancanta.',
-	'recaptcha-create' => "Për giuté a protege contra la creassion automatisà ëd pàgine, për piasì ch'a scriv le doe paròle ch'a s-ciàira ant la casela sì-sota:",
+	'recaptcha-create' => "Për giuté a protege contra la creassion automatisà ëd pàgine, për piasì ch'a scriv le doe paròle ch'a s-ciàira ant la casela sì-sota:", # Fuzzy
 );
 
 /** Portuguese (português)
  * @author Hamilton Abreu
  */
 $messages['pt'] = array(
-	'recaptcha-edit' => 'Para proteger-nos de spam, por favor escreva  as duas palavras visíveis abaixo:',
-	'recaptcha-addurl' => "A sua edição contém links externos novos. Como prevenção contra sistemas automatizados de inserção de ''spam'', escreva as duas palavras visíveis na caixa abaixo:",
-	'recaptcha-badpass' => 'Para proteger-nos de robots que tentam adivinhar senhas, por favor escreva  as duas palavras visíveis abaixo:',
-	'recaptcha-createaccount' => 'Para proteger-nos de criação automática de contas, por favor escreva  as duas palavras visíveis abaixo:',
+	'recaptcha-edit' => 'Para proteger-nos de spam, por favor escreva  as duas palavras visíveis abaixo:', # Fuzzy
+	'recaptcha-addurl' => "A sua edição contém links externos novos. Como prevenção contra sistemas automatizados de inserção de ''spam'', escreva as duas palavras visíveis na caixa abaixo:", # Fuzzy
+	'recaptcha-badlogin' => 'Para proteger-nos de robots que tentam adivinhar senhas, por favor escreva  as duas palavras visíveis abaixo:', # Fuzzy
+	'recaptcha-createaccount' => 'Para proteger-nos de criação automática de contas, por favor escreva  as duas palavras visíveis abaixo:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'A resposta ao reCAPTCHA é errada.',
-	'recaptcha-create' => 'Para proteger-nos da criação automática de páginas, por favor escreva  as duas palavras visíveis abaixo:',
+	'recaptcha-create' => 'Para proteger-nos da criação automática de páginas, por favor escreva  as duas palavras visíveis abaixo:', # Fuzzy
 );
 
 /** Brazilian Portuguese (português do Brasil)
  */
 $messages['pt-br'] = array(
-	'recaptcha-edit' => 'Para ajudar a prevenir contra vandalismos, por favor digite as duas palavras que você vê na caixa abaixo:',
-	'recaptcha-addurl' => 'A sua edição inclui ligações externas. Para ajudar a prevenir contra vandalismos, por favor digite as duas palavras que você vê na caixa abaixo:',
-	'recaptcha-badpass' => 'Para ajudar a prevenir contra tentativas de desbloquear senhas, por favor digite as duas palavras que você vê na caixa abaixo:',
-	'recaptcha-createaccount' => 'Para ajudar a prevenir contra criação automatizada de usuários, por favor digite as duas palavras que você vê na caixa abaixo:',
+	'recaptcha-edit' => 'Para ajudar a prevenir contra vandalismos, por favor digite as duas palavras que você vê na caixa abaixo:', # Fuzzy
+	'recaptcha-addurl' => 'A sua edição inclui ligações externas. Para ajudar a prevenir contra vandalismos, por favor digite as duas palavras que você vê na caixa abaixo:', # Fuzzy
+	'recaptcha-badlogin' => 'Para ajudar a prevenir contra tentativas de desbloquear senhas, por favor digite as duas palavras que você vê na caixa abaixo:', # Fuzzy
+	'recaptcha-createaccount' => 'Para ajudar a prevenir contra criação automatizada de usuários, por favor digite as duas palavras que você vê na caixa abaixo:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'Resposta incorreta ao reCAPTCHA.',
-	'recaptcha-create' => 'Para ajudar a prevenir contra criação automatizada de páginas, por favor digite as duas palavras que você vê na caixa abaixo:',
+	'recaptcha-create' => 'Para ajudar a prevenir contra criação automatizada de páginas, por favor digite as duas palavras que você vê na caixa abaixo:', # Fuzzy
 );
 
 /** tarandíne (tarandíne)
  * @author Joetaras
  */
 $messages['roa-tara'] = array(
-	'recaptcha-edit' => "Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
-	'recaptcha-addurl' => "Le cangiaminde tune 'ngludone collegaminde de fore nuève. Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
-	'recaptcha-badpass' => "Pe darne 'na màne a proteggere condre le futteminde automatece de le passuord, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
-	'recaptcha-createaccount' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le cunde, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
+	'recaptcha-edit' => "Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:", # Fuzzy
+	'recaptcha-addurl' => "Le cangiaminde tune 'ngludone collegaminde de fore nuève. Pe darne 'na màne a proteggere condre le cangiaminde automatece de le rummate, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:", # Fuzzy
+	'recaptcha-badlogin' => "Pe darne 'na màne a proteggere condre le futteminde automatece de le passuord, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:", # Fuzzy
+	'recaptcha-createaccount' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le cunde, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:", # Fuzzy
 	'recaptcha-createaccount-fail' => 'Resposte reCAPTCHA ingorrette o mangande.',
-	'recaptcha-create' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le pàggene, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:",
+	'recaptcha-create' => "Pe darne 'na màne a proteggere condre le ccrejaziune automatece de le pàggene, pe piacere scrive le doje parole ca 'ndruche jndr'à buatte aqquà sotte:", # Fuzzy
 );
 
 /** Russian (русский)
+ * @author Okras
  * @author Александр Сигачёв
  */
 $messages['ru'] = array(
-	'recaptcha-edit' => 'В целях защиты от автоматического спама в правках, пожалуйста, введите два слова, которые вы видите ниже:',
-	'recaptcha-addurl' => 'Ваша правка содержит новые внешние ссылки. В целях защиты от автоматического спама, пожалуйста, введите два слова, которые вы видите ниже:',
-	'recaptcha-badpass' => 'В целях защиты от автоматического подбора пароля, пожалуйста, введите два слова, которые вы видите ниже:',
-	'recaptcha-createaccount' => 'В целях защиты от автоматического создания учётных записей, пожалуйста, введите два слова, которые вы видите ниже:',
+	'recaptcha-edit' => 'В целях защиты от автоматического спама в правках просим вас ввести два слова, которые вы видите ниже:',
+	'recaptcha-addurl' => 'Ваша правка содержит новые внешние ссылки. В целях защиты от автоматического спама просим вас ввести два слова, которые вы видите в рамке ниже:',
+	'recaptcha-badlogin' => 'В целях защиты от автоматического подбора пароля просим вас ввести два слова, которые вы видите в рамке ниже:',
+	'recaptcha-createaccount' => 'В целях защиты от автоматического создания учётных записей просим вас ввести два слова, которые вы видите в рамке ниже:',
 	'recaptcha-createaccount-fail' => 'Ответ reCAPTCHA неправильный или отсутствует.',
-	'recaptcha-create' => 'В целях защиты от автоматического создания страниц, пожалуйста, введите два слова, которые вы видите ниже:',
+	'recaptcha-create' => 'В целях защиты от автоматического создания страниц просим вас ввести два слова, которые вы видите в рамке ниже:',
 );
 
 /** Sinhala (සිංහල)
@@ -491,14 +506,15 @@ $messages['sr-el'] = array(
 );
 
 /** Swedish (svenska)
+ * @author WikiPhoenix
  */
 $messages['sv'] = array(
-	'recaptcha-edit' => 'Den här sidan skyddas mot spam-robotar, bevisa att du är en människa genom att skriva de två orden du ser i boxen nedan:',
-	'recaptcha-addurl' => 'Din förändring av sidan innehåller nya externa länkar, vilket är typiskt för spam. Bevisa att du är en människa genom att skriva de två orden du ser i boxen nedan:',
-	'recaptcha-badpass' => 'För att skydda wikin mot robotar som gissar användares lösenord behöver användare bevisa att de är människor. Skriv ner de två orden som du ser i boxen nedan:',
-	'recaptcha-createaccount' => 'För att skydda wikin mot robotar som skapar konton behöver användare bevisa att de är människor. Var vänlig och skriv ner de två orden du ser i boxen nedan:',
+	'recaptcha-edit' => 'För att skydda wikin mot automatiskt redigerings-spam ber vi dig att skriva de två orden du ser i rutan nedan.',
+	'recaptcha-addurl' => 'Din redigering innehåller nya externa länkar. För att skydda wikin mot automatiserat spam ber vi dig att skriva de två ordern du ser i rutan nedan:',
+	'recaptcha-badlogin' => 'För att skydda wikin mot automatiserade försök att knäcka lösenord ber vi dig att skriva in de två orden du ser i rutan nedan:',
+	'recaptcha-createaccount' => 'För att skydda wikin mot automatiskt kontoskapande ber vi dig att skriva de två orden som du ser i rutan nedan:',
 	'recaptcha-createaccount-fail' => 'Du har angivit ett felaktig svar för reCAPTCHA.',
-	'recaptcha-create' => 'För att skydda wikin mot robotar som skapar nya artiklar. Var vänlig och skriv ner de två orden som finns i boxen nedan:',
+	'recaptcha-create' => 'För att skydda wikin mot automatiserade sidskapande ber vi dig att skriva in de två orden du ser i rutan nedan:',
 );
 
 /** Swahili (Kiswahili)
@@ -507,7 +523,7 @@ $messages['sv'] = array(
 $messages['sw'] = array(
 	'recaptcha-edit' => 'Ili kusaidia kuzuia mashine zisihariri, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:', # Fuzzy
 	'recaptcha-addurl' => 'Haririo lako lina viungo vipya vya nje. Ili kusaidia katika kuzuisha viungo visivyotakiwa visiwekwe na mashine, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:', # Fuzzy
-	'recaptcha-badpass' => 'Ili kusaidia katika kuzuia neno lako la siri lisigunduliwe na mashine, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:', # Fuzzy
+	'recaptcha-badlogin' => 'Ili kusaidia katika kuzuia neno lako la siri lisigunduliwe na mashine, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:', # Fuzzy
 	'recaptcha-createaccount' => 'Ili kusaidia kuzuia akaunti zisifunguliwe nyingi na mashine, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'Jibu la swali la CAPTCHA si sahihi au halipo.', # Fuzzy
 	'recaptcha-create' => 'Ili kusaidia kuzuia kurasa zisianzishwe nyingi na mashine, tafadhali andika maneno mawili yanayoonekana katika kisanduku pakipo chini:', # Fuzzy
@@ -518,36 +534,39 @@ $messages['sw'] = array(
  */
 $messages['tl'] = array(
 	'recaptcha-desc' => 'Modulo ng reCAPTCHA para sa Pagtiyak ng Pagbago',
-	'recaptcha-edit' => 'Upang makatulong sa pagprutekta laban sa kusang basurang pamamatnugot, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:',
-	'recaptcha-addurl' => 'Ang pagbabago mo ay nagsasama ng bagong panlabas na mga kawing.  Upang makatulong sa pagprutekta laban sa kusang paglusob ng basurang-liham, paki imakinilya ang dalawang mga salitang nakikita sa loob ng kahong nasa ibaba:',
-	'recaptcha-badpass' => 'Upang makatulong sa pagsasanggalang laban sa kusang panghuhula ng hudyat, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:',
-	'recaptcha-createaccount' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng akawnt, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:',
+	'recaptcha-edit' => 'Upang makatulong sa pagprutekta laban sa kusang basurang pamamatnugot, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:', # Fuzzy
+	'recaptcha-addurl' => 'Ang pagbabago mo ay nagsasama ng bagong panlabas na mga kawing.  Upang makatulong sa pagprutekta laban sa kusang paglusob ng basurang-liham, paki imakinilya ang dalawang mga salitang nakikita sa loob ng kahong nasa ibaba:', # Fuzzy
+	'recaptcha-badlogin' => 'Upang makatulong sa pagsasanggalang laban sa kusang panghuhula ng hudyat, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:', # Fuzzy
+	'recaptcha-createaccount' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng akawnt, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:', # Fuzzy
 	'recaptcha-createaccount-fail' => 'Hindi tama o nawawalang sagot sa reCAPTCHA.',
-	'recaptcha-create' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng pahina, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:',
+	'recaptcha-create' => 'Upang makatulong sa pagprutekta laban sa kusang paglikha ng pahina, paki imakinilya ang dalawang mga salitang nakikita mo sa loob ng kahong nasa ibaba:', # Fuzzy
 );
 
 /** Ukrainian (українська)
+ * @author Andriykopanytsia
  * @author Base
  * @author Тест
  */
 $messages['uk'] = array(
-	'recaptcha-edit' => 'Для запобігання автоматичному спаму у редагуваннях, будь ласка, введіть два слова, які Ви бачите у блоці нижче:',
-	'recaptcha-addurl' => 'Ваше редагування містить зовнішні посилання. Для запобігання автоматичному спаму у редагуваннях, будь ласка, введіть два слова, які Ви бачите у блоці нижче:',
-	'recaptcha-badpass' => 'Для запобігання автоматичному підбору паролю, будь ласка, введіть два слова, які Ви бачите у блоці нижче:',
-	'recaptcha-createaccount' => 'Для запобігання автоматичному створенню облікових записів, будь ласка, введіть два слова, які Ви бачите у блоці нижче:',
+	'recaptcha-edit' => 'Для запобігання автоматичному спаму у редагуваннях просимо вас ввести два слова, які Ви бачите у блоці нижче:',
+	'recaptcha-addurl' => 'Ваше редагування містить зовнішні посилання. Для запобігання автоматичному спаму у редагуваннях просимо вас ввести два слова, які Ви бачите у блоці нижче:',
+	'recaptcha-badlogin' => 'Для запобігання автоматичному підбору паролю просимо вас ввести два слова, які Ви бачите у блоці нижче:',
+	'recaptcha-createaccount' => 'Для запобігання автоматичному створенню облікових записів просимо вас ввести два слова, які Ви бачите у блоці нижче:',
 	'recaptcha-createaccount-fail' => 'Відповідь reCAPTCHA неправильна або відсутня.',
-	'recaptcha-create' => 'Для запобігання автоматичному створенню сторінок, будь ласка, введіть два слова, які Ви бачите у блоці нижче:',
+	'recaptcha-create' => 'З метою захисту вікі від автоматичного створення сторінки просимо вас ввести два слова, які ви бачите у блоці нижче:',
 );
 
 /** Vietnamese (Tiếng Việt)
+ * @author Minh Nguyen
  */
 $messages['vi'] = array(
-	'recaptcha-edit' => 'Để giúp tránh các sửa đổi rác tự động, xin hãy gõ hai từ mà bạn nhìn thấy vào ô dưới đây:',
-	'recaptcha-addurl' => 'Sửa đổi của bạn có chứa liên kết ngoài mới. Để giúp tránh các sửa đổi rác tự động, xin hãy gõ hai từ mà bạn nhìn vào ô dưới đây:',
-	'recaptcha-badpass' => 'Để giúp tránh bẻ khóa mật khẩu tự động, xin hãy gõ hai từ mà bạn nhìn vào ô dưới đây:',
-	'recaptcha-createaccount' => 'Để giúp tránh việc mở tài khoản tự động, xin hãy gõ hai từ mà bạn nhìn vào ô dưới đây:',
+	'recaptcha-desc' => 'Mô đun reCAPTCHA cho Confirm Edit',
+	'recaptcha-edit' => 'Để giúp tránh các sửa đổi spam tự động, xin vui lòng gõ hai từ mà bạn nhìn thấy vào hộp dưới đây:',
+	'recaptcha-addurl' => 'Sửa đổi của bạn có chứa liên kết ngoài mới. Để giúp tránh các sửa đổi spam tự động, xin vui lòng gõ hai từ mà bạn nhìn vào hộp dưới đây:',
+	'recaptcha-badlogin' => 'Để giúp tránh bẻ khóa mật khẩu tự động, xin vui lòng gõ hai từ mà bạn nhìn vào hộp dưới đây:',
+	'recaptcha-createaccount' => 'Để giúp tránh việc mở tài khoản tự động, xin vui lòng gõ hai từ mà bạn nhìn vào hộp dưới đây:',
 	'recaptcha-createaccount-fail' => 'Thiếu câu trả lời reCAPTCHA hoặc câu trả lời không đúng.',
-	'recaptcha-create' => 'Để giúp tránh việc tạo trang tự động, xin hãy gõ hai từ mà bạn nhìn vào ô dưới đây:',
+	'recaptcha-create' => 'Để giúp tránh việc tạo trang tự động, xin vui lòng gõ hai từ mà bạn nhìn vào hộp dưới đây:',
 );
 
 /** Simplified Chinese (中文（简体）‎)
@@ -558,19 +577,20 @@ $messages['vi'] = array(
 $messages['zh-hans'] = array(
 	'recaptcha-edit' => '为了避免垃圾用户自动编辑，请键入下面框中的两个单词：',
 	'recaptcha-addurl' => '您的编辑包含新的外部链接。为了避免垃圾用户自动编辑，请键入下面框中的两个单词：',
-	'recaptcha-badpass' => '为避免自动密码破解，请键入下面框中的两个单词：',
+	'recaptcha-badlogin' => '为避免自动密码破解，请键入下面框中的两个单词：',
 	'recaptcha-createaccount' => '为了避免创建自动垃圾用户，请键入下面框中的两个单词：',
 	'recaptcha-createaccount-fail' => 'reCAPTCHA 答案不正确或未填写。',
 	'recaptcha-create' => '为了避免垃圾用户自动创建页面，请键入下面框中的两个单词：',
 );
 
 /** Traditional Chinese (中文（繁體）‎)
+ * @author StephDC
  */
 $messages['zh-hant'] = array(
-	'recaptcha-edit' => '要幫助保護免受垃圾郵件自動的編輯，請鍵入您在下面的框中看到這兩個詞：',
-	'recaptcha-addurl' => '您的編輯包含新的外部鏈接。為了幫助防止自動垃圾郵件，請鍵入您在下面的框中看到這兩個詞：',
-	'recaptcha-badpass' => '為幫助防止自動密碼破解，請鍵入您看到下面的框中的兩個字：',
-	'recaptcha-createaccount' => '為了幫助防止創建自動化的帳戶，請鍵入您在下面的框中看到的這兩個字：',
+	'recaptcha-edit' => '為了防止wiki被自動編輯的垃圾損害，我們請您鍵入您在下面的框中看到的這兩個單詞：',
+	'recaptcha-addurl' => '您的編輯包含新的外部鏈接。為了幫助防止自動垃圾郵件，請鍵入您在下面的框中看到這兩個詞：', # Fuzzy
+	'recaptcha-badlogin' => '為幫助防止自動密碼破解，請鍵入您看到下面的框中的兩個字：', # Fuzzy
+	'recaptcha-createaccount' => '為了幫助防止創建自動化的帳戶，請鍵入您在下面的框中看到的這兩個字：', # Fuzzy
 	'recaptcha-createaccount-fail' => '不正確或缺失的 reCAPTCHA 答案。',
-	'recaptcha-create' => '為了幫助防止自動的頁創建，請鍵入您在下面的框中看到這兩個詞：',
+	'recaptcha-create' => '為了幫助防止自動的頁創建，請鍵入您在下面的框中看到這兩個詞：', # Fuzzy
 );
diff --git a/extensions/ConfirmEdit/blacklist b/extensions/ConfirmEdit/blacklist
new file mode 100644
index 00000000..b9f8cd12
--- /dev/null
+++ b/extensions/ConfirmEdit/blacklist
@@ -0,0 +1,40 @@
+altar
+anus
+ass
+bitch
+breast
+butt
+christ
+cock
+crazy
+cross
+cum
+cunt
+daemon
+demon
+dick
+dumb
+fuck
+hag
+holy
+horny
+idiot
+jerk
+jesus
+lust
+nerd
+nigger
+penis
+piss
+pussy
+satan
+sex
+shit
+smut
+stupid
+tit
+tits
+twat
+vamp
+whore
+witch
diff --git a/extensions/ConfirmEdit/captcha.py b/extensions/ConfirmEdit/captcha.py
index 3d13c054..558b9fab 100644
--- a/extensions/ConfirmEdit/captcha.py
+++ b/extensions/ConfirmEdit/captcha.py
@@ -183,6 +183,7 @@ if __name__ == '__main__':
 	To check a reply, hash it in the same way with the same salt and
 	secret key, then compare with the hash value given.
 	"""
+	script_dir = os.path.dirname(os.path.realpath(__file__))
 	parser = OptionParser()
 	parser.add_option("--wordlist", help="A list of words (required)", metavar="WORDS.txt")
 	parser.add_option("--random", help="Use random charcters instead of a wordlist", action="store_true")
@@ -191,7 +192,7 @@ if __name__ == '__main__':
 	parser.add_option("--font", help="The font to use (required)", metavar="FONT.ttf")
 	parser.add_option("--font-size", help="The font size (default 40)", metavar="N", type='int', default=40)
 	parser.add_option("--count", help="The maximum number of images to make (default 20)", metavar="N", type='int', default=20)
-	parser.add_option("--blacklist", help="A blacklist of words that should not be used", metavar="FILE")
+	parser.add_option("--blacklist", help="A blacklist of words that should not be used", metavar="FILE", default=os.path.join(script_dir, "blacklist"))
 	parser.add_option("--fill", help="Fill the output directory to contain N files, overrides count, cannot be used with --dirs", metavar="N", type='int')
 	parser.add_option("--dirs", help="Put the images into subdirectories N levels deep - $wgCaptchaDirectoryLevels", metavar="N", type='int')
 	parser.add_option("--verbose", "-v", help="Show debugging information", action='store_true')
@@ -219,8 +220,8 @@ if __name__ == '__main__':
 		font = opts.font
 	else:
 		sys.exit("Need to specify the location of a font")
-	
-	blacklistfile = opts.blacklist
+
+	blacklist = read_wordlist(opts.blacklist)
 	count = opts.count
 	fill = opts.fill
 	dirs = opts.dirs
@@ -236,12 +237,7 @@ if __name__ == '__main__':
 		words = [x for x in words
 			if len(x) in (4,5) and x[0] != "f"
 			and x[0] != x[1] and x[-1] != x[-2]]
-	
-	if blacklistfile:
-		blacklist = read_wordlist(blacklistfile)
-	else:
-		blacklist = []
-	
+
 	for i in range(count):
 		word = pick_word(words, blacklist, verbose, opts.number_words, opts.min_length, opts.max_length)
 		salt = "%08x" % random.randrange(2**32)
diff --git a/extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js b/extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js
index 52dc532c..34296d03 100644
--- a/extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js
+++ b/extensions/ConfirmEdit/resources/ext.confirmEdit.asirra.js
@@ -9,18 +9,17 @@
 \*======================================================================*/
 
 jQuery( function( $ ) {
-	var asirraform = $( "form#userlogin2" );
+	// Selectors for create account, login, and page edit forms.
+	var asirraform = $( 'form#userlogin2, #userloginForm form, form#editform' );
 	var submitButtonClicked = document.createElement("input");
 	var passThroughFormSubmit = false;
 
 	function PrepareSubmit() {
-		console.log( 'daa' );
 		submitButtonClicked.type = "hidden";
 		var inputFields = asirraform.find( "input" );
 		for (var i=0; i<inputFields.length; i++) {
 			if (inputFields[i].type === "submit") {
 				inputFields[i].onclick = function(event) {
-					console.log( this );
 					submitButtonClicked.name = this.name;
 					submitButtonClicked.value = this.value;
 				}
@@ -42,7 +41,7 @@ jQuery( function( $ ) {
 
 	function HumanCheckComplete(isHuman) {
 		if (!isHuman) {
-			alert( mw.msg( 'asirra-failed' ) );
+			window.alert( mediaWiki.msg( 'asirra-failed' ) );
 		} else {
 			asirraform.append(submitButtonClicked);
 			passThroughFormSubmit = true;
diff --git a/extensions/FluxBBAuthPlugin.php b/extensions/FluxBBAuthPlugin.php
index 16b26c41..32d4b145 100644
--- a/extensions/FluxBBAuthPlugin.php
+++ b/extensions/FluxBBAuthPlugin.php
@@ -2,7 +2,7 @@
 
 $wgExtensionCredits['other'][] = array(
 	'name' => 'FluxBBAuthPlugin',
-	'version' => '1.5',
+	'version' => '1.6',
 	'description' => 'Use FluxBB accounts in MediaWiki',
 	'author' => 'Pierre Schmitz',
 	'url' => 'https://pierre-schmitz.com/'
@@ -59,7 +59,6 @@ class FluxBBAuthPlugin extends AuthPlugin {
 
 	public function modifyUITemplate( &$template, &$type ) {
 		$template->set( 'usedomain', false );
-		$template->set('link', 'Um Dich hier anzumelden, nutze Deine Konto-Daten aus dem <a href="https://bbs.archlinux.de/">archlinux.de-Forum</a>.');
 	}
 
 	public function updateUser( &$user ) {
@@ -98,6 +97,10 @@ class FluxBBAuthPlugin extends AuthPlugin {
 		return false;
 	}
 
+	public function updateExternalDBGroups( $user, $addgroups, $delgroups = array() ) {
+		return false;
+	}
+
 	public function canCreateAccounts() {
 		return false;
 	}
diff --git a/extensions/Gadgets/ApiQueryGadgets.php b/extensions/Gadgets/ApiQueryGadgets.php
index 90e77a3b..a529daf0 100644
--- a/extensions/Gadgets/ApiQueryGadgets.php
+++ b/extensions/Gadgets/ApiQueryGadgets.php
@@ -54,6 +54,10 @@ class ApiQueryGadgets extends ApiQueryBase {
 	private function getList() {
 		$gadgets = Gadget::loadStructuredList();
 
+		if ( $gadgets === false ) {
+			return array();
+		}
+
 		$result = array();
 		foreach ( $gadgets as $category => $list ) {
 			if ( $this->categories && !isset( $this->categories[$category] ) ) {
diff --git a/extensions/Gadgets/GadgetHooks.php b/extensions/Gadgets/GadgetHooks.php
new file mode 100644
index 00000000..ee1f4081
--- /dev/null
+++ b/extensions/Gadgets/GadgetHooks.php
@@ -0,0 +1,257 @@
+<?php
+
+/**
+ * Copyright © 2007 Daniel Kinzler
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class GadgetHooks {
+	/**
+	 * ArticleSaveComplete hook handler.
+	 *
+	 * @param $article Article
+	 * @param $user User
+	 * @param $text String: New page text
+	 * @return bool
+	 */
+	public static function articleSaveComplete( $article, $user, $text ) {
+		// update cache if MediaWiki:Gadgets-definition was edited
+		wfProfileIn( __METHOD__ );
+		$title = $article->getTitle();
+		if ( $title->getNamespace() == NS_MEDIAWIKI && $title->getText() == 'Gadgets-definition' ) {
+			Gadget::loadStructuredList( $text );
+		}
+		wfProfileOut( __METHOD__ );
+		return true;
+	}
+
+	/**
+	 * UserGetDefaultOptions hook handler
+	 * @param $defaultOptions Array of default preference keys and values
+	 * @return bool
+	 */
+	public static function userGetDefaultOptions( &$defaultOptions ) {
+		$gadgets = Gadget::loadStructuredList();
+		if ( !$gadgets ) {
+			return true;
+		}
+
+		/**
+		 * @var $gadget Gadget
+		 */
+		foreach ( $gadgets as $thisSection ) {
+			foreach ( $thisSection as $gadgetId => $gadget ) {
+				if ( $gadget->isOnByDefault() ) {
+					$defaultOptions['gadget-' . $gadgetId] = 1;
+				}
+			}
+		}
+
+		return true;
+	}
+
+	/**
+	 * GetPreferences hook handler.
+	 * @param $user User
+	 * @param $preferences Array: Preference descriptions
+	 * @return bool
+	 */
+	public static function getPreferences( $user, &$preferences ) {
+		wfProfileIn( __METHOD__ );
+		$gadgets = Gadget::loadStructuredList();
+		if ( !$gadgets ) {
+			wfProfileOut( __METHOD__ );
+			return true;
+		}
+
+		$options = array();
+		$default = array();
+		foreach ( $gadgets as $section => $thisSection ) {
+			$available = array();
+
+			/**
+			 * @var $gadget Gadget
+			 */
+			foreach ( $thisSection as $gadget ) {
+				if ( $gadget->isAllowed( $user ) ) {
+					$gname = $gadget->getName();
+					# bug 30182: dir="auto" because it's often not translated
+					$desc = '<span dir="auto">' . $gadget->getDescription() . '</span>';
+					$available[$desc] = $gname;
+					if ( $gadget->isEnabled( $user ) ) {
+						$default[] = $gname;
+					}
+				}
+			}
+
+			if ( $section !== '' ) {
+				$section = wfMessage( "gadget-section-$section" )->parse();
+
+				if ( count ( $available ) ) {
+					$options[$section] = $available;
+				}
+			} else {
+				$options = array_merge( $options, $available );
+			}
+		}
+
+		$preferences['gadgets-intro'] =
+			array(
+				'type' => 'info',
+				'label' => '&#160;',
+				'default' => Xml::tags( 'tr', array(),
+					Xml::tags( 'td', array( 'colspan' => 2 ),
+						wfMessage( 'gadgets-prefstext' )->parseAsBlock() ) ),
+				'section' => 'gadgets',
+				'raw' => 1,
+				'rawrow' => 1,
+			);
+
+		$preferences['gadgets'] =
+			array(
+				'type' => 'multiselect',
+				'options' => $options,
+				'section' => 'gadgets',
+				'label' => '&#160;',
+				'prefix' => 'gadget-',
+				'default' => $default,
+			);
+		wfProfileOut( __METHOD__ );
+
+		return true;
+	}
+
+	/**
+	 * ResourceLoaderRegisterModules hook handler.
+	 * @param $resourceLoader ResourceLoader
+	 * @return bool
+	 */
+	public static function registerModules( &$resourceLoader ) {
+		$gadgets = Gadget::loadList();
+		if ( !$gadgets ) {
+			return true;
+		}
+
+		/**
+		 * @var $g Gadget
+		 */
+		foreach ( $gadgets as $g ) {
+			$module = $g->getModule();
+			if ( $module ) {
+				$resourceLoader->register( $g->getModuleName(), $module );
+			}
+		}
+		return true;
+
+	}
+
+	/**
+	 * BeforePageDisplay hook handler.
+	 * @param $out OutputPage
+	 * @return bool
+	 */
+	public static function beforePageDisplay( $out ) {
+		wfProfileIn( __METHOD__ );
+
+		$gadgets = Gadget::loadList();
+		if ( !$gadgets ) {
+			wfProfileOut( __METHOD__ );
+			return true;
+		}
+
+		$lb = new LinkBatch();
+		$lb->setCaller( __METHOD__ );
+		$pages = array();
+
+		/**
+		 * @var $gadget Gadget
+		 */
+		$user = $out->getUser();
+		foreach ( $gadgets as $gadget ) {
+			if ( $gadget->isEnabled( $user ) && $gadget->isAllowed( $user ) ) {
+				if ( $gadget->hasModule() ) {
+					$out->addModuleStyles( $gadget->getModuleName() );
+					$out->addModules( $gadget->getModuleName() );
+				}
+
+				foreach ( $gadget->getLegacyScripts() as $page ) {
+					$lb->add( NS_MEDIAWIKI, $page );
+					$pages[] = $page;
+				}
+			}
+		}
+
+
+		// Allow other extensions, e.g. MobileFrontend, to disallow legacy gadgets
+		if ( wfRunHooks( 'Gadgets::allowLegacy', array( $out->getContext() ) ) ) {
+			$lb->execute( __METHOD__ );
+
+			$done = array();
+
+			foreach ( $pages as $page ) {
+				if ( isset( $done[$page] ) ) {
+					continue;
+				}
+
+				$done[$page] = true;
+				self::applyScript( $page, $out );
+			}
+		}
+		wfProfileOut( __METHOD__ );
+
+		return true;
+	}
+
+	/**
+	 * Adds one legacy script to output.
+	 *
+	 * @param string $page Unprefixed page title
+	 * @param OutputPage $out
+	 */
+	private static function applyScript( $page, $out ) {
+		global $wgJsMimeType;
+
+		# bug 22929: disable gadgets on sensitive pages.  Scripts loaded through the
+		# ResourceLoader handle this in OutputPage::getModules()
+		# TODO: make this extension load everything via RL, then we don't need to worry
+		# about any of this.
+		if ( $out->getAllowedModules( ResourceLoaderModule::TYPE_SCRIPTS ) < ResourceLoaderModule::ORIGIN_USER_SITEWIDE ) {
+			return;
+		}
+
+		$t = Title::makeTitleSafe( NS_MEDIAWIKI, $page );
+		if ( !$t ) {
+			return;
+		}
+
+		$u = $t->getLocalURL( 'action=raw&ctype=' . $wgJsMimeType );
+		$out->addScriptFile( $u, $t->getLatestRevID() );
+	}
+
+	/**
+	 * UnitTestsList hook handler
+	 * @param array $files
+	 * @return bool
+	 */
+	public static function onUnitTestsList( array &$files ) {
+		$testDir = __DIR__ . '/tests/';
+		$files = array_merge( $files, glob( "$testDir/*Test.php" ) );
+		return true;
+	}
+}
diff --git a/extensions/Gadgets/Gadgets.alias.php b/extensions/Gadgets/Gadgets.alias.php
index 1371558d..3b041c51 100644
--- a/extensions/Gadgets/Gadgets.alias.php
+++ b/extensions/Gadgets/Gadgets.alias.php
@@ -5,6 +5,7 @@
  * @file
  * @ingroup Extensions
  */
+// @codingStandardsIgnoreFile
 
 $specialPageAliases = array();
 
@@ -53,7 +54,12 @@ $specialPageAliases['bs'] = array(
 	'Gadgets' => array( 'Dodaci' ),
 );
 
-/** Czech (česky) */
+/** Chechen (нохчийн) */
+$specialPageAliases['ce'] = array(
+	'Gadgets' => array( 'Гаджеташ' ),
+);
+
+/** Czech (čeština) */
 $specialPageAliases['cs'] = array(
 	'Gadgets' => array( 'Udělátka' ),
 );
@@ -193,6 +199,11 @@ $specialPageAliases['lb'] = array(
 	'Gadgets' => array( 'Gadgeten' ),
 );
 
+/** Minangkabau (Baso Minangkabau) */
+$specialPageAliases['min'] = array(
+	'Gadgets' => array( 'Pakakeh' ),
+);
+
 /** Macedonian (македонски) */
 $specialPageAliases['mk'] = array(
 	'Gadgets' => array( 'Алатки' ),
diff --git a/extensions/Gadgets/Gadgets.i18n.php b/extensions/Gadgets/Gadgets.i18n.php
index f0dae2e9..2a754600 100644
--- a/extensions/Gadgets/Gadgets.i18n.php
+++ b/extensions/Gadgets/Gadgets.i18n.php
@@ -88,7 +88,17 @@ See [[meta:Special:Gadgets|Gadgets page in meta.wikimedia.org]]",
 	'gadgets-export-title' => 'Used as page title. Example: [[Special:Gadgets/export/editbuttons]]',
 	'gadgets-not-found' => 'Used as error message. Parameters:
 * $1 - gadget name',
-	'gadgets-export-text' => 'Used as page description. See example: [[Special:Gadgets/export/editbuttons]]',
+	'gadgets-export-text' => 'Used as page description in [[Special:Gadgets]].
+
+Refers to {{msg-mw|Gadgets-export-download}}.
+
+See example: [[Special:Gadgets/export/editbuttons]]
+
+Followed by the "Export" form.
+
+Parameters:
+* $1 - gadget name
+* $2 - gadget definition (code)',
 	'gadgets-export-download' => 'Use the verb for this message. Submit button.
 {{Identical|Download}}',
 );
@@ -229,8 +239,8 @@ $1',
  * @author Basharh
  */
 $messages['arc'] = array(
-	'gadgets' => 'ܬܘܣܦܝܬ̈ܐ',
-	'gadgets-title' => 'ܬܘܣܦܝܬ̈ܐ',
+	'gadgets' => 'ܬܘܣܦܬ̈ܐ',
+	'gadgets-title' => 'ܬܘܣܦܬ̈ܐ',
 	'gadgets-export-download' => 'ܐܚܬ:',
 );
 
@@ -255,7 +265,7 @@ $messages['arz'] = array(
 	'gadgets-uses' => 'إستخدامات',
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Bishnu Saikia
  * @author Gitartha.bordoloi
  */
@@ -397,6 +407,36 @@ $messages['bcc'] = array(
 	'gadgets-uses' => 'استفاده بیت',
 );
 
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+	'gadgets-desc' => 'Minatugot sa mga paragamit na pumili nin kustombre [[Special:Gadgets|CSS and JavaScript gadgets]] sa saindang [[Special:Preferences#mw-prefsection-gadgets|preferences]]',
+	'prefs-gadgets' => 'Mga gadyet',
+	'gadgets-prefstext' => 'Sa ibaba yaon an sarong listahan kan espesyal na mga gadyet na saimong mapapagana para sa saimong panindog.
+Ining mga gadyet haros nakabase sa JavaScript, kaya an JavaScript kaipong paganahon sa saimong kilyawan para an mga ini magagamit.
+Tandai na ining mga gadyet mayo nin epekto kaining pahina nin mga kamuyahan.
+
+Tandai man na ining mga espesyal na gadyet bakong parte kan panuklob nin MediaWiki, asin pirmehang pinagpauswag asin pinagmamantine nin mga paragamit sa saimong lokal na wiki.
+
+An mga lokal na mga administrador makakaliwat kan  [[MediaWiki:Gadgets-definition|mga pakahulugan]] asin [[Special:Gadgets|mga deskripsyon]] kan yaon na mga gadyet.',
+	'gadgets' => 'Mga gadyet',
+	'gadgets-title' => 'Mga gadyet',
+	'gadgets-pagetext' => 'Sa ibaba yaon an sarong listahan kan espesyal na mga gadyet na an mga paragamit mapapagana sa saindang [[Special:Preferences#mw-prefsection-gadgets|pahina nin mga kamuyahan]], siring sa pinapakahulugan kan [[MediaWiki:Gadgets-definition|mga pakahulugan]]. Ining patanawon minatao nin yanong langkayan sa mga pahina kan mensahe sa sistema na minakahulugan sa lambang deskripsyon nin gadyet asin koda.',
+	'gadgets-uses' => 'Mga magagamitan',
+	'gadgets-required-rights' => 'Minahagad kan minasunod {{PLURAL:$2|katanosan|mga katanosan}}:
+
+
+$1',
+	'gadgets-required-skins' => 'Makukua sa {{PLURAL:$2|$1 kublit|minasunod na mga kublit: $1}}.',
+	'gadgets-default' => 'Tugmadong pinagpapagana para sa kagabsan.',
+	'gadgets-export' => 'Eksport',
+	'gadgets-export-title' => 'Gadyet eksport',
+	'gadgets-not-found' => 'Gadyet na "$1" dae nanagboan.',
+	'gadgets-export-text' => 'Tanganing ma-eksport an $1 na gadyet, paki-klik an "{{int:gadgets-export-download}}" pindutan, itagama an naikargang sagunson, magduman sa Espesyal:Importaron sa wiking destinasyon and ikarga ini. An sunod idugang an minasunod sa MediaWiki:Mga Gadyet-pakahulugang pahina: <pre>$2</pre> Ika dapat magkaigwa nin makanigong mga permiso sa wiking destination (kabali na an katanosan na magliwat nin pansistemang mga mensahe) asin an mag-importa gikan sa ikinakargang mga sagunson na dapat kaipong pinagpagana.',
+	'gadgets-export-download' => 'Kargahon',
+);
+
 /** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  * @author Cesco
  * @author EugeneZelenko
@@ -590,21 +630,23 @@ Heu de tenir els permisos adequats en el wiki de destinació (incloent-hi els pe
 
 /** Chechen (нохчийн)
  * @author Sasan700
+ * @author Умар
  */
 $messages['ce'] = array(
 	'gadgets-desc' => 'Атто бо декъашхошна харжам ба [[Special:Preferences#mw-prefsection-gadgets|гIирс нисбарца]] CSS- а JavaScript-хIоттончаш, лато лууш йерш', # Fuzzy
-	'prefs-gadgets' => 'Хlоттончаш',
-	'gadgets-prefstext' => 'Лаххьа балийна леррина хlоттончаш могlам, шуьга шайга латалур йолуш хьай долахь долучу дакъан.
-Хlара хlоттончаш дукхачу хьоляхь болх беш ю оцу JavaScript тlяхь, цундела аша латоеза JavaScript шай дуьнена машан гlирса чохь, цаьрга болх байта.
-Диц маделаш, хlара хlоттончаш болх бяш яз хlо гlирс нисбо агlон чохь.
+	'prefs-gadgets' => 'Гаджеташ',
+	'gadgets-prefstext' => 'Лаххьа балийна леррина гаджеташ могӀам, шуьга шайга латалур йолуш хьай долахь долучу дакъан.
+ХӀара гаджеташ дуккхачу хьолехь болх беш ю оцу JavaScript тӀехь, цундела аша латоеза JavaScript шай браузер чохь, цаьрга болх байта.
+Диц маделаш, хӀара гаджеташ болх бяш яц хӀо гӀирс нисбо агӀон чохь.
 
-Ишта диц маде, хlара хlоттончаш юкъа йогуш яз кху MediaWiki гlирсашна, мадарра аьльча шу санна декъашхоша шаьш йеш ю.
+Ишта диц маде, хӀара гаджеташ юкъа йогуш яц кху MediaWiki гlирсашна, мадарра аьльча шу санна декъашхоша шаьш йеш ю.
 Адманкуьйгалхошка шайг хийцало и хlоттончи могlам, хlокх могlам гlонца [[MediaWiki:Gadgets-definition|къастам бало]] а [[Special:Gadgets|церах лаьцна]].',
-	'gadgets' => 'Хlоттончаш',
-	'gadgets-title' => 'Хlоттончаш',
+	'gadgets' => 'Гаджеташ',
+	'gadgets-title' => 'Гаджеташ',
 	'gadgets-pagetext' => 'Гlирса хааман могlамаш, къастош йолу хlоттончи цlераш, хуьлаш йолу хIокху [[MediaWiki:Gadgets-definition|къастамца]]]].
 ХIокху могIамо атто бо гIирсан хаамаш атта тIе кхочуш барца, цуьнах лаьцна хIоттош а йолш йолучу хIоттончи ишарца.', # Fuzzy
 	'gadgets-uses' => 'Лелош йу',
+	'gadgets-export' => 'Экспорт ян',
 );
 
 /** Sorani Kurdish (کوردی)
@@ -806,22 +848,24 @@ Sie müssen über die notwendigen Berechtigungen auf dem für den Import vorgese
 
 /** Zazaki (Zazaki)
  * @author Erdemaslancan
+ * @author Gorizon
+ * @author Neribij
  * @author Olvörg
  * @author Xoser
  */
 $messages['diq'] = array(
-	'gadgets-desc' => 'Karberan rê destur bide ke pê [[Special:Preferences#mw-prefsection-gadgets|opsiyonan]] ra [[Special:Gadgets|Xacetanê CSS u JavaScriptî]] biweçî',
-	'prefs-gadgets' => 'Xacetî',
-	'gadgets-prefstext' => 'Cor de yew listeyê xacetanê xasî estê ke ti eşkenî xesabê xo de a bike.
-Enê xecatan ser JavaScript gure kenê, aya ra ti gani browser xo de JavaScript a bike.
-Ena pela opsiyonî de xacetan etki nikenê.
-
-Enê xecatanê xasî parçê sofwarê Mediyawîkî niyo, aye ra karberanê localî enê xecetî virazeno.
-Adminstorê localî eşkenê xacetî  [[MediaWiki:Gadgets-definition|definitions]] u [[Special:Gadgets|descriptions]] ra bivurne.',
-	'gadgets' => 'Xacetî',
-	'gadgets-title' => 'Xacetî',
-	'gadgets-pagetext' => 'Cor de yew listeyê xacetanê xasî estê ke ti eşkenî [[Special:Preferences#mw-prefsection-gadgets|xesabê xo]] de a bike, descripsiyon [[MediaWiki:Gadgets-definition|definitions]] de esto.
-Ena descripisyon kerberanê îmkan dano ke aye meajanê sistemî ra asani cikewtê.',
+	'gadgets-desc' => "Karberan ré destur bidek [[Special:Preferences#mw-prefsection-gadgets|hesıbyayan]]'ra [[Special:Gadgets|Hacetanê CSS u JavaScriptî]] bışé weçiné",
+	'prefs-gadgets' => 'Haleti',
+	'gadgets-prefstext' => 'Cor de yew listeya hacetanê xasî esta ke ti eşkenî xesabê xo de a bikî.
+Enê hacatî JavaScript ser o gurêyenê, aya ra ti ganî browserê xo de JavaScript a bikî.
+Ena pela opsiyonî de hacetî tesîr nêkenê.
+
+Enê hacatanê xasî parçê sofwarê Mediyawîkî nîyê, aye ra karberê localî enê hacetî virazenê.
+Îdarekarê mehelî eşkenê hacetan  [[MediaWiki:Gadgets-definition|definitions]] û [[Special:Gadgets|descriptions]] ra bivurnê.',
+	'gadgets' => 'Haleti',
+	'gadgets-title' => 'Haleti',
+	'gadgets-pagetext' => 'Cêr de yew listeya hacetanê xasan esta ke ti eşkenî [[Special:Preferences#mw-prefsection-gadgets|xesabê xo]] de a bikî, seke [[MediaWiki:Gadgets-definition|definitions]] nîşan dîyayo.
+No ewnîyayîşo pêroyî îmkan dano ke merdim bi asanî bireso pelanê mesajanê sistemî ke descripisyon û kodê her hacetî nawneno.',
 	'gadgets-uses' => 'Karber',
 	'gadgets-required-rights' => 'Cêrêni icab kenê {{PLURAL:$2|raşti|raşteya}}:
 
@@ -1072,20 +1116,21 @@ $1',
 	'gadgets-export-text' => 'برای برون‌بری ابزار $1، بر دکمهٔ «{{int:gadgets-export-download}}» کلیک کنید، پروندهٔ بارگیری‌شده را ذخیره کنید، به ویژه:درون‌ریزی در ویکی مقصد بروید و بارگذاری‌اش کنید. سپس این را به صفحهٔ مدیاویکی:Gadgets-definition بیفزایید:
 <pre>$2</pre>
 لازم است تا در ویکی مقصد دسترسی‌های مناسب (شامل حق ویرایش پیغام‌های سامانه) را داشته باشید و درون‌ریزی از بارگذاری‌های پرونده باید فعال شده باشد.',
-	'gadgets-export-download' => 'بارگیری',
+	'gadgets-export-download' => 'دریافت',
 );
 
 /** Finnish (suomi)
  * @author Crt
  * @author Nike
  * @author Olli
+ * @author Stryn
  */
 $messages['fi'] = array(
 	'gadgets-desc' => 'Tarjoaa mahdollisuuden käyttäjille ottaa käyttöön [[Special:Gadgets|määritettyjä CSS- ja JavaScript-pienoisohjelmia]] omista [[Special:Preferences#mw-prefsection-gadgets|asetuksistaan]].',
 	'prefs-gadgets' => 'Pienoisohjelmat',
 	'gadgets-prefstext' => 'Alla on lista pienoisohjelmista, joita käyttäjät voivat ottaa käyttöön. Nämä pienoisohjelmat pohjautuvat usein JavaScriptiin, joten toimiakseen selaimessasi pitää olla JavaScript käytössä.
 
-Huomio myös, että nämä pienoisohjelmat eivät ole osa MediaWiki-ohjelmistoa – tavallisesti niitä kehittävät ja ylläpitävät paikallisen wikin käyttäjät. Paikalliset ylläpitäjät voivat muokata saatavilla olevia pienoisohjelmia [[MediaWiki:Gadgets-definition|määrityssivulla]] ja [[Special:Gadgets|kuvauksista]].',
+Huomioi myös, että nämä pienoisohjelmat eivät ole osa MediaWiki-ohjelmistoa – tavallisesti niitä kehittävät ja ylläpitävät paikallisen wikin käyttäjät. Paikalliset ylläpitäjät voivat muokata saatavilla olevia pienoisohjelmia [[MediaWiki:Gadgets-definition|määrityssivulla]] ja [[Special:Gadgets|kuvauksista]].',
 	'gadgets' => 'Pienoisohjelmat',
 	'gadgets-title' => 'Pienoisohjelmat',
 	'gadgets-pagetext' => 'Alla on lista pienoisohjelmista, joita käyttäjät voivat ottaa käyttöön [[Special:Preferences#mw-prefsection-gadgets|asetussivulta]]. Pienoisohjelmat määritetään [[MediaWiki:Gadgets-definition|täältä]].
@@ -1189,6 +1234,35 @@ O est nècèssèro de d’avêr los drêts corrèspondents sur lo vouiqui de dè
 	'gadgets-export-download' => 'Tèlèchargiér',
 );
 
+/** Northern Frisian (Nordfriisk)
+ * @author Murma174
+ */
+$messages['frr'] = array(
+	'gadgets-desc' => 'Brükern kön uun hör [[Special:Preferences#mw-prefsection-gadgets|iinstelangen]] enkelt [[Special:Gadgets|CSS- an JavaScript-halpers]] aktiwiare',
+	'prefs-gadgets' => 'Letj halpers',
+	'gadgets-prefstext' => 'Diar stun enkelt letj halpers, diar arke brüke aktiwiare koon. Jo san miast uun JavaScript skrewen, an diaram kön jo bluas werke, wan JavaScript uun a browser aktiif as. Üüb detheer spezial-sidj werke jo oober ei.
+
+Jodiar letj halpers san nään dial faan MediaWiki an wurd miast faan enkelt brükern ütjspekeliaret. Administratooren kön jo letj halpers bewerke. Diarför jaft at [[MediaWiki:Gadgets-definition|definitjuunen]] an [[Special:Gadgets|beskriiwangen]].',
+	'gadgets' => 'Letj halpers',
+	'gadgets-title' => 'Letj halpers',
+	'gadgets-pagetext' => 'Diar stun letj halpers, diar uun det [[MediaWiki:Gadgets-definition|definitjuun]] fäästlaanj san an diar arke brüker uun sin [[Special:Preferences#mw-prefsection-gadgets|iinstelangen]] iinracht koon.
+
+Auer detheer sidj komst dü tu a MediaWiki-süsteemnoorachten mä en beskriiwang an di program-code.',
+	'gadgets-uses' => 'Tu brüken',
+	'gadgets-required-rights' => 'Diarför brükst dü {{PLURAL:$2|detdiar brükerrocht|jodiar brükerrochten}}:
+
+$1',
+	'gadgets-required-skins' => 'Koon mä {{PLURAL:$2|didiar skak|jodiar skaker}} brükt wurd: $1.',
+	'gadgets-default' => 'Det as faan began för arken aktiif.',
+	'gadgets-export' => 'Eksport',
+	'gadgets-export-title' => 'Eksport faan letj halpers',
+	'gadgets-not-found' => 'Letj halper "$1" ei fünjen.',
+	'gadgets-export-text' => 'Am di letj halper $1 tu eksportiarin, trak üüb „{{int:gadgets-export-download}}“ an seekre det datei üüb dan reegner. Do gung tu "Spezial:Import" üüb det wiki, huar di letj halper importiaret wurd skal an schüür det datei huuch. Skriiw do noch didiar tekst üüb det sidj MediaWiki:Gadgets-definition:
+<pre>$2</pre>
+Huar dü det importiare wel, brükst dü jo nuadag brükerrochten tu importiarin an uk det brükerrocht, am MediaWiki-süsteemnoorachten tu bewerkin. An do skal natüürelk det importiarin uun detdiar wiki aktiwiaret wees.',
+	'gadgets-export-download' => 'Deelloose',
+);
+
 /** Irish (Gaeilge)
  * @author පසිඳු කාවින්ද
  */
@@ -1305,6 +1379,8 @@ Special:Import નિયોજીત વિકિ પર Special:Import પર 
 
 /** Hebrew (עברית)
  * @author Amire80
+ * @author Guycn1
+ * @author Guycn2
  * @author Rotem Liss
  * @author YaronSh
  */
@@ -1326,9 +1402,9 @@ $messages['he'] = array(
 
 $1',
 	'gadgets-required-skins' => 'זמין {{PLURAL:$2|בערכות העיצוב הבאות: $1|בערכת העיצוב $1}}',
-	'gadgets-default' => 'מופעל לכולם לפי בררת מחדל.',
+	'gadgets-default' => 'מופעל לכולם כברירת מחדל.',
 	'gadgets-export' => 'יצוא',
-	'gadgets-export-title' => 'יצוא גאדג׳טים',
+	'gadgets-export-title' => "יצוא גאדג'טים",
 	'gadgets-not-found' => 'הגאדג׳ט "$1" לא נמצא.',
 	'gadgets-export-text' => 'כדי לייצא את הגאדג׳ט $1, יש ללחוץ על הלחצן "{{int:gadgets-export-download}}", לשמור את הקובץ שהתקבל,
 לגשת אל Special:Import באתר הוויקי המיועד ולהעלות אותו. ואז להוסיף את הדברים הבאים לדף MediaWiki:Gadgets-definition:
@@ -1346,7 +1422,7 @@ $1',
  */
 $messages['hi'] = array(
 	'gadgets-desc' => 'सदस्यों को उनकी [[Special:Preferences#mw-prefsection-gadgets|वरीयताओं]] में से चुनिंदा [[Special:Gadgets|CSS और जावालिपि जुगत]] चुनने दो।',
-	'prefs-gadgets' => 'उपकरण (गैज़ेट)',
+	'prefs-gadgets' => 'उपकरण (गैजेट)',
 	'gadgets-prefstext' => 'नीचे विशेष उपकरणों की सूची दी गई है, जिन्हें आप अपने खाते के लिये सक्षम कर सकते हैं।
 ये उपकरण अधिकांशतः जावास्क्रिप्ट पर आधारित है, इसलिए इनके कार्यशील होने के लिए आपके ब्राउज़र में जावास्क्रिप्ट सक्षम होनी चाहिये।
 ध्यान दें कि इन उपकरणों से आपके वरीयता पृष्ठ पर कोई असर नहीं होगा।
@@ -1376,6 +1452,7 @@ $1',
  * @author Anton008
  * @author Dalibor Bosits
  * @author Ex13
+ * @author MaGa
  * @author Roberta F.
  * @author SpeedyGonsales
  */
@@ -1383,10 +1460,10 @@ $messages['hr'] = array(
 	'gadgets-desc' => 'Omogućava suradnicama biranje osobnih [[Special:Gadgets|CSS i JavaScript dodataka]] u svojim [[Special:Preferences#mw-prefsection-gadgets|postavkama]]',
 	'prefs-gadgets' => 'Dodaci',
 	'gadgets-prefstext' => 'Slijedi popis posebnih dodataka koje možete omogućiti.
-One su većinom napisane u JavaScriptu, stoga JavaScript mora biti omogućen u vašem web pregledniku da bi dodaci radili.
+Većinom su napisani u JavaScriptu, stoga JavaScript mora biti omogućen u vašem web pregledniku da bi radili.
 Nijedan dodatak nema učinka na ovu stranicu s postavkama.
 
-Ovi posebni dodaci nisu dio MediaWiki softvera, najčešće su razvijane i održavane od suradnika na lokalnom wikiju.
+Ovi posebni dodaci nisu dio MediaWiki softvera, najčešće ih razvijaju i održavaju suradnici na lokalnom wikiju.
 Lokalni administratori mogu uređivati dostupne dodatke putem [[MediaWiki:Gadgets-definition|definicija]] i [[Special:Gadgets|opisa]].',
 	'gadgets' => 'Dodaci',
 	'gadgets-title' => 'Dodatci',
@@ -1561,32 +1638,32 @@ Anda harus memeroleh izin pada wiki tujuan (termasuk hak menyunting pesan sistem
  * @author Lam-ang
  */
 $messages['ilo'] = array(
-	'gadgets-desc' => 'Mabalin dagiti agar-aramat nga agpili iti [[Special:Gadgets|CSS ken JavaScript gadgets]] idiay [[Special:Preferences#mw-prefsection-gadgets|kaykayat da]]',
-	'prefs-gadgets' => 'Gadgets',
-	'gadgets-prefstext' => 'Adda dita baba ti listaan ti naipangruna a gadgets nga usaren idiay pakabilangam.
-Dagitoy a gadgets ket naibasta iti JavaScript, masapul a pakabaelan ti  JavaScript idiay  "pagbasabasam" tapno agbalin da.
-Saan a mabalin nga usaren dagitoy a gadgets ditoy kaykayat a panid.
-
-Dagitoy a gadgets ket saan a paset ti MediaWiki software, inaramid ken inayaywanan dagiti agar-aramat ti lokal a wiki.
-Mabaliwan dagita administrador nga urnosen ti  [[MediaWiki:Gadgets-definition|pinakailawag]] ken [[Special:Gadgets|deskripsion]] ti gadgets.',
-	'gadgets' => 'Gadgets',
-	'gadgets-title' => 'Gadgets',
-	'gadgets-pagetext' => 'Dita baba ket adda listaan dagiti naipangruna a gadgets a dagiti agar-aramat ket mapagbalin da idiay [[Special:Preferences#mw-prefsection-gadgets|kaykayat da a panid]],  a naipalawag iti [[MediaWiki:Gadgets-definition|dagiti pinakailawag]].
-Daytoy a pinakabuklan ket mangted ti nalaka a pinagserrek kadagit mensahe ti sistema a panid a nagpailawag iti deskripsion ti gadget ken kodigo.',
+	'gadgets-desc' => 'Agpalubos kadagiti agar-aramat nga agpili kadagiti naiduma a [[Special:Gadgets|CSS ken JavaScript a gadget]] iti [[Special:Preferences#mw-prefsection-gadgets|kakaykayatanda]]',
+	'prefs-gadgets' => 'Dagiti gadget',
+	'gadgets-prefstext' => 'Dita baba ket listaan kadagiti naipangruna a gadget a mabalinmo a pakabaelan iti pakabilangam.
+Dagitoy a gadget ket naibatay iti JavaScript, isunga masapul a pakabaelan ti  JavaScript idiay  "pagbasabasam" tapno agbalin dagitoy.
+Laglagipen a dagitoy a gadget ket awan ti pagbanaganna iti daytoy panid ti kakaykayatan.
+
+Laglagipen pay a dagitoy a naipangruna a gadget ket saan a paset ti sopwer ti MediaWiki, ken kadawyan a pinarang-ay ken tinartaripato babaen dagiti agar-aramat iti lokal a wiki.
+Dagiti lokal nga administrador ket mabalinda nga urnosen dagiti [[MediaWiki:Gadgets-definition|panangipalplawag]] ken dagiti [[Special:Gadgets|deskripsion]] dagiti magun-od a gadget.',
+	'gadgets' => 'Dagiti gadget',
+	'gadgets-title' => 'Dagiti gadget',
+	'gadgets-pagetext' => 'Dita baba ket listaan dagiti naipangruna a gadget a mabalin a pakabaelan dagiti agar-aramat iti bukodda a [[Special:Preferences#mw-prefsection-gadgets|panid ti kakaykayatan]], a kas naipalawag babaen dagiti [[MediaWiki:Gadgets-definition|pannakaipalawag]].
+Daytoy a nakabuklan ket mangted ti nalaka a panagserrek kadagiti panid ti mensahe ti sistema a mangipalawag ti tungngal maysa a deskripsion ken kodigo ti gadget.',
 	'gadgets-uses' => 'Usar',
-	'gadgets-required-rights' => 'Masapul dagiti sumaganad {{PLURAL:$2|a karbengan|dagiti karbengan}}:
+	'gadgets-required-rights' => 'Masapul ti sumaganad a {{PLURAL:$2|karbengan|karkarbengan}}:
 
 $1',
-	'gadgets-required-skins' => 'Adda mabalin idiay {{PLURAL:$2|$1 a kudil|dagiti sumaganad a kudil: $1}}.',
-	'gadgets-default' => 'Pakabaelan a kinasigud iti amin nga agar-aramat.',
+	'gadgets-required-skins' => 'Mabalin a magun-od {{PLURAL:$2|iti $1 a kudil|kadagiti sumaganad a kudil: $1}}.',
+	'gadgets-default' => 'Pakabaelan a kasisigud para kadagiti amin.',
 	'gadgets-export' => 'Agipan',
 	'gadgets-export-title' => 'Agipan ti gadget',
 	'gadgets-not-found' => 'Saan a nabirukan ti "$1" a gadget.',
-	'gadgets-export-text' => 'Ti pinag-ipan ti $1 a gadget, agtakla idiay "{{int:gadgets-export-download}}" a buton, idulin ti inkarga nga agpababa a papeles,
-mapan idiay  Special:Import ti papanan a wiki ken ikarga nga agpangato. Ken inayon dagiti sumaganad idiay MediaWiki:Gadgets-definition page:
+	'gadgets-export-text' => 'Ti panag-ipan ti $1 a gadget, pinduten ti buton ti "{{int:gadgets-export-download}}", idulin ti naikarga a papeles,
+mapan idiay Special:Import iti papanan a wiki ken ikarganto. Kalpasanna inayon dagiti sumaganad idiay panid ti MediaWiki:Gadgets-definition:
 <pre>$2</pre>
-Masapul nga addaan ka ti husto a pammalubos iti papanan a wiki (nairaman ti karbegnan a pinagbaliw dagiti mensahe ti sistema) ken naipabalin ti pinagala kadagiti naggapu a papeles a naikarga nga agpangato.',
-	'gadgets-export-download' => 'Ikarga nga agpababa',
+Nasken nga addaanka ti maitunos a pammalubos iti papanan a wiki (mairaman ti karbengan a panag-urnos kadagiti mensahe ti sistema) ken nasken a napakabaelan ti panagikarga kadagiti papeles.',
+	'gadgets-export-download' => 'Agikaraga',
 );
 
 /** Ido (Ido)
@@ -1637,7 +1714,7 @@ farðu á þann wiki sem á að flytja smátólið á, farðu á kerfisíðuna S
 $messages['it'] = array(
 	'gadgets-desc' => 'Consente agli utenti di selezionare [[Special:Gadgets|accessori CSS e JavaScript]] nelle proprie [[Special:Preferences#mw-prefsection-gadgets|preferenze]]',
 	'prefs-gadgets' => 'Accessori',
-	'gadgets-prefstext' => "Di seguito viene presentata una lista di accessori speciali (''gadget'') che è possibile abilitare per il proprio account.
+	'gadgets-prefstext' => "Di seguito viene presentata una lista di accessori speciali (''gadget'') che è possibile abilitare per la propria utenza.
 La maggior parte di questi accessori è basata su JavaScript, è quindi necessario abilitare JavaScript nel proprio browser perché funzionino correttamente. Si noti che gli accessori non hanno alcun effetto in questa pagina di preferenze.
 
 Inoltre, si noti che questi accessori speciali non sono compresi nel software MediaWiki e vengono di solito realizzati e gestiti dagli utenti di ciascun sito wiki. Gli amministratori del sito possono modificare la lista degli accessori disponibili tramite le pagine delle [[MediaWiki:Gadgets-definition|definizioni]] e delle [[Special:Gadgets|descrizioni]].",
@@ -1792,21 +1869,27 @@ $messages['kk-arab'] = array(
 );
 
 /** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author Arystanbek
  */
 $messages['kk-cyrl'] = array(
 	'prefs-gadgets' => 'Қажет құралдар',
-	'gadgets-prefstext' => 'Төменде өз тіркелгіңізде қоса алатын арнаулы қажет құралдар тізімі беріледі.
-Осы қажет құралдар көбінесе JavaScript әмірлеріне негізделінеді, сондықтан бұлар жұмыс істеуі үшін шолғышыңызда JavaScript қосылған болуы керек.
-Бұл баптау бетіне осы қажет құралдар әсер етпейтінің ескеріңіз.
+	'gadgets-prefstext' => 'Төменде өз тіркелгіңізде қоса алатын арнаулы қажет құралдар тізімі берілген.
+Осы қажет құралдар көбінесе JavaScript әмірлеріне негізделеді, сондықтан бұлар жұмыс істеуі үшін шолғышыңызда JavaScript қосылған болуы керек.
+Бұл баптау бетіне осы қажет құралдар әсер етпейтінін ескеріңіз.
 
-Тағы да ескеріңіз: осы қажет құралдар MediaWiki бағдарламасының бөлігі емес, және де бұларды жайшылықта жергілікті уикидің қатысушылары дамытады және қоштайды.
-Жергілікті әкімшілер жетімді қажет нәрсе тізімін [[{{ns:mediawiki}}:Gadgets-definition]] және [[{{ns:special}}:Gadgets]] беттері арқылы
+Тағы да ескеріңіз: осы қажет құралдар MediaWiki бағдарламасының бөлігі емес және бұларды әдетте сіздің жергілікті уикиіңіздің қатысушылары дамытады және қоштайды.
+Жергілікті [[Project:Әкімшілер|әкімшілер]] жетімді гаджеттерді [[MediaWiki:Gadgets-definition]]  және [[special:Gadgets]] беттері арқылы
 өңдей алады.', # Fuzzy
 	'gadgets' => 'Қажет құралдар',
 	'gadgets-title' => 'Қажет құралдар',
-	'gadgets-pagetext' => 'Төменде арнаулы қажет құралдар тізімі беріледі. [[{{ns:mediawiki}}:Gadgets-definition]] бетінде анықталған қажет құралдарды қатысушылар өзінің баптауында қоса алады.
-Бұл шолу беті арқылы әрбір қажет құралдың сипаттамасы мен әмірін анықтайтын жүйе хабар беттеріне жеңіл қатынай аласыз.', # Fuzzy
-	'gadgets-uses' => 'Қолданудағылар',
+	'gadgets-pagetext' => 'Төменде қатысушылар өзінің [[Special:Preferences#mw-prefsection-gadgets|баптауларынан]] қоса алатын   арнаулы қажет құралдар тізімі берілген. [[MediaWiki:Gadgets-definition]] шолу беті арқылы әрбір қажет құралдың сипаттамасы мен әмірін анықтайтын жүйе хабар беттеріне жеңіл қатынай аласыз.',
+	'gadgets-uses' => 'Қолданыстағылар',
+	'gadgets-required-rights' => 'Келесі {{PLURAL:$2|құқықты|құқықтарды}} қажет етеді: $1',
+	'gadgets-default' => 'Әркімге автоматты түрде қосылады.',
+	'gadgets-export' => 'Экспорттау',
+	'gadgets-export-title' => 'Гаджетті экспорттау',
+	'gadgets-not-found' => '"$1" гаджеті табылмады.',
+	'gadgets-export-download' => 'Түсіру',
 );
 
 /** Kazakh (Latin script) (qazaqşa (latın)‎)
@@ -1851,7 +1934,7 @@ $messages['km'] = array(
  * @author 아라
  */
 $messages['ko'] = array(
-	'gadgets-desc' => '각 사용자가 [[Special:Gadgets|CSS와 자바스크립트 소도구]]를 [[Special:Preferences#mw-prefsection-gadgets|사용자 환경 설정]]을 통해 사용할 수 있도록 허용',
+	'gadgets-desc' => '각 사용자가 [[Special:Gadgets|CSS와 자바스크립트 소도구]]를 [[Special:Preferences#mw-prefsection-gadgets|사용자 환경 설정]]을 통해 사용할 수 있습니다',
 	'prefs-gadgets' => '소도구',
 	'gadgets-prefstext' => '아래 목록은 현재 사용 가능한 소도구의 목록입니다.
 대부분의 소도구는 자바스크립트로 동작하며, 웹 브라우저에서 자바스크립트를 사용할 수 있어야 동작합니다.
@@ -1863,7 +1946,7 @@ $messages['ko'] = array(
 	'gadgets-title' => '소도구',
 	'gadgets-pagetext' => '[[Special:Preferences#mw-prefsection-gadgets|사용자 환경 설정]]에서 설정할 수 있는 소도구 목록입니다. 해당 목록은 [[MediaWiki:Gadgets-definition|소도구 정의]]에서 편집할 수 있습니다.
 이 문서에서는 각 소도구의 각 설명 문서와 코드의 시스템 메시지 링크를 제공합니다.',
-	'gadgets-uses' => '다음 코드를 이용',
+	'gadgets-uses' => '다음 코드를 사용',
 	'gadgets-required-rights' => '다음 {{PLURAL:$2|권한}}이 필요합니다: 
 
 $1',
@@ -1933,12 +2016,23 @@ Do moß en däm Wiki de nüüdijje Rääschde han, och dat Rääsch, aan Täxte
 
 /** Kurdish (Latin script) (Kurdî (latînî)‎)
  * @author George Animal
+ * @author Ghybu
+ * @author Gomada
  */
 $messages['ku-latn'] = array(
+	'prefs-gadgets' => 'Amûr',
+	'gadgets' => 'Amûr',
+	'gadgets-title' => 'Amûr',
+	'gadgets-uses' => 'Bikaranîn',
+	'gadgets-required-rights' => '{{PLURAL:$2|Mafa|Mafên}} di dorê de pêwîst in:
+
+$1',
+	'gadgets-export' => 'Derxe',
 	'gadgets-not-found' => ' Gadget "$1" nehate dîtin.',
+	'gadgets-export-download' => 'Daxe',
 );
 
-/** Kirghiz (Кыргызча)
+/** Kyrgyz (Кыргызча)
  * @author Growingup
  */
 $messages['ky'] = array(
@@ -1950,19 +2044,20 @@ $messages['ky'] = array(
 /** Luxembourgish (Lëtzebuergesch)
  * @author Les Meloures
  * @author Robby
+ * @author Soued031
  */
 $messages['lb'] = array(
 	'gadgets-desc' => 'Erméiglecht de Benotzer et perséinlech [[Special:Gadgets|CSS a JavaScript Gadgeten]] an hiren [[Special:Preferences#mw-prefsection-gadgets|Astellunge]] festzeleeën.',
 	'prefs-gadgets' => 'Gadgeten',
 	'gadgets-prefstext' => "Lëscht vu spezielle Gadgeten déi fir Äre Benotzerkont aktivéiert kënne ginn.
-D'Gadgete baséiere meeschtens op engem JavaScript, dofir muss JavaScript an Ärem Browser aktivéiert sinn, fir datt se fonctionéieren.
-D'Gadgete fonctionéieren awer net op dëser Säit mat de perséinlechen Astellungen.
+D'Gadgete baséiere meeschtens op engem JavaScript, dofir muss JavaScript an Ärem Browser aktivéiert sinn, fir datt se funktionéieren.
+D'Gadgete funktionéieren awer net op dëser Säit mat de perséinlechen Astellungen.
 
 Ausserdeem sollt Dir wëssen, datt dës Gadgete generell net Deel vu MediaWiki sinn, a meeschtens vu Benotzer vu lokale Wikien entwéckelt an ënnerhale ginn.
 Lokal Wiki-Administrateure kënnen d'Lëscht von den disponibele Gadgeten op de Säiten [[MediaWiki:Gadgets-definition|Definitioune vun Gadgeten]] a [[Special:Gadgets|Beschreiwunge vu Gadgeten]] änneren.",
 	'gadgets' => 'Gadgeten',
 	'gadgets-title' => 'Gadgeten',
-	'gadgets-pagetext' => "Ënnendrënner ass eng Lëscht vun de spezielle Gadgeten déi d'Benotzer op hire [[Special:Preferences#mw-prefsection-gadgets|Benotzer-Astellungen]] aschalte kënnen, esou wéi dat op [[MediaWiki:Gadgets-definition|definéiert]] ass.
+	'gadgets-pagetext' => "Ënnendrënner ass eng Lëscht vun de spezielle Gadgeten déi d'Benotzer op hire [[Special:Preferences#mw-prefsection-gadgets|Benotzer-Astellungen]] aschalte kënnen, sou wéi dat op [[MediaWiki:Gadgets-definition|definéiert]] ass.
 Dës Iwwersiicht gëtt einfachen Zougang zu de Systemmessage-Säiten, déi all Gadget beschreiwen an zum Programméiercode vun dem Gadget.",
 	'gadgets-uses' => 'Benotzt',
 	'gadgets-required-rights' => "Erfuerdert {{PLURAL:$2|d'Recht|dës Rechter}}: $1.",
@@ -1971,8 +2066,8 @@ Dës Iwwersiicht gëtt einfachen Zougang zu de Systemmessage-Säiten, déi all G
 	'gadgets-export' => 'Export',
 	'gadgets-export-title' => 'Export vu Gadgeten',
 	'gadgets-not-found' => 'Gadget "$1" net fonnt.',
-	'gadgets-export-text' => 'Fir de Gadget $1 z\'exportéieren klickt w.e.g. op de(n) "{{int:gadgets-export-download}}"-Knäppchen, späichert den erofgelueden Fichier, gitt op Spezial:Import op der Zil-Wiki a lued en do erop. Duerno setzt der op d\'MediaWiki:Gadgets-Definitiouns Säit dëst derbäi:<pre>$2</pre>
-Dir musst déi erfuerdert Rechter(inklusiv d\'Recht fir System-Messagen z\'änneren) op der Zil-Wiki hunn an den Import vun eropgelueden Fichiere muss ageschalt sinn.',
+	'gadgets-export-text' => 'Fir de Gadget $1 z\'exportéieren klickt w.e.g. op de(n) "{{int:gadgets-export-download}}"-Knäppchen, späichert den erofgelueden Fichier, gitt op Spezial:Import op der Zil-Wiki a luet en do erop. Duerno setzt der op d\'MediaWiki:Gadgets-Definitiouns Säit dëst derbäi:<pre>$2</pre>
+Dir musst déi erfuerdert Rechter(inklusiv d\'Recht fir Systemmessagen z\'änneren) op der Zil-Wiki hunn an den Import vun eropgelueden Fichiere muss ageschalt sinn.',
 	'gadgets-export-download' => 'Eroflueden',
 );
 
@@ -2019,6 +2114,18 @@ Doe mós de juuste rèchte höbben óppe doelwie, ouch óm bewirkinge aan systee
 	'gadgets-export-download' => 'Haol óp',
 );
 
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+	'prefs-gadgets' => 'چيا هنی',
+	'gadgets' => 'گجت یا',
+	'gadgets-title' => 'گجت یا',
+	'gadgets-uses' => 'کاروردیا',
+	'gadgets-export' => 'وه صحرا ديئن',
+	'gadgets-export-download' => 'گرتن',
+);
+
 /** Lithuanian (lietuvių)
  * @author Eitvys200
  * @author Homo
@@ -2203,7 +2310,7 @@ $messages['mr'] = array(
 	'gadgets-title' => 'गॅजेट',
 	'gadgets-pagetext' => 'खाली तुम्ही तुमच्या सदस्यत्वासाठी [[Special:Preferences#mw-prefsection-gadgets|माझ्या पसंती]] पानावर वापरू शकत असलेल्या [[MediaWiki:Gadgets-definition|व्याख्या]]ने सांगितलेल्या गॅजेट्सची यादी दिलेली आहे. हे पान तुम्हाला प्रत्येक गॅजेट्सचा कोड व व्याख्या देणार्‍या पानासाठी सोपी संपर्क सुविधा पुरविते.',
 	'gadgets-uses' => 'उपयोग',
-	'gadgets-required-rights' => 'खलील गोष्ठी साठी विनंती     {{PLURAL:$2|right|rights}}:
+	'gadgets-required-rights' => 'खालील {{PLURAL:$2|अधिकार}} हवेच :
 
 $1',
 	'gadgets-required-skins' => '{{PLURAL:$2|$1 skin|खालील देखाव्यांवर  : $1}} उपलब्ध आहेत',
@@ -2211,11 +2318,11 @@ $1',
 	'gadgets-export' => 'निर्यात करा',
 	'gadgets-export-title' => 'उपकरण निर्यात',
 	'gadgets-not-found' => 'उपकरण "$1" सापडत नाही.',
-	'gadgets-export-text' => '$1 उपकरण-सुविधा निर्यातकरण्या करिता, "{{int:gadgets-export-download}}" कलीवर टिचकी मारा, उतरवलेली संचिका-फाईल जतन करा
+	'gadgets-export-text' => '$1 उपकरण-सुविधा निर्यात करण्याकरिता, "{{int:gadgets-export-download}}" कळीवर टिचकी मारा, उतरवलेली संचिका-फाईल जतन करा
 डेस्टिनेशन विकिच्या विशेष:आयात पानावर जाऊन संचिका-फाईल चढवावी.नंतर खालील MediaWiki:Gadgets-definition पान चढवावे :
 <pre>$2</pre>
 तुमच्याकडे डेस्टिनेशन विकिवर (सिस्टीम मेसेजेस सुद्धा संपादीत करण्यासहीत )  सुयोग्य परवानग्या उपलब्ध असणे अत्यावश्यक आहे आणि  चढवलेल्या संचिकाकरिता आयात सुविधा सक्षम असणे आवश्यक आहे.',
-	'gadgets-export-download' => 'उतरवा',
+	'gadgets-export-download' => 'अधिभारण करा',
 );
 
 /** Malay (Bahasa Melayu)
@@ -2288,7 +2395,7 @@ $messages['mzn'] = array(
 	'gadgets-title' => 'ابزارون',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Laaknor
  * @author Nghtwlkr
  * @author Sjurhamre
@@ -2337,7 +2444,7 @@ Disse Översicht gifft direkten Togang to de Systemnarichten, in de de Text to d
 	'gadgets-uses' => 'Bruukt',
 );
 
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
  * @author Servien
  */
 $messages['nds-nl'] = array(
@@ -2438,7 +2545,7 @@ Voeg daarna het volgende toe aan de pagina "MediaWiki:Gadgets-definition":
 Je moet de juiste rechten hebben op de doelwiki, inclusief het recht om bewerkingen te maken aan de systeemberichten, en importeren uit bestanden moet ingeschakeld zijn.',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Eirik
  * @author Harald Khan
  * @author Nghtwlkr
@@ -2466,7 +2573,7 @@ Dette oversynet gjev enkel tilgang til systemmeldingssidene som inneheld skildri
 $messages['oc'] = array(
 	'gadgets-desc' => 'Daissa als utilizaires los [[Special:Gadgets|gadgets CSS e JavaScript]] dins lor [[Special:Preferences#mw-prefsection-gadgets|preferéncias]]',
 	'prefs-gadgets' => 'Gadgets',
-	'gadgets-prefstext' => "Çaijós apareis una tièra de gadgets que podètz activar per vòstre compte. Fan ampèl a JavaScript, deu doncas èsser activat per vòstre navigador Web.
+	'gadgets-prefstext' => "Çaijós apareis una lista de gadgets que podètz activar per vòstre compte. Fan apèl a JavaScript, deu doncas èsser activat per vòstre navigador Web.
 
 An pas cap d'incidéncia sus aquesta pagina de preferéncias. E mai, son generalament desvolopats e mantenguts sus aqueste wiki.
 Los administrators pòdon modificar los gadgets en passant per [[MediaWiki:Gadgets-definition|las definicions]] e las [[Special:Gadgets|descripcions]].",
@@ -2479,7 +2586,7 @@ Aqueste susvòl dona un accès rapid a las paginas de messatges del sistèma que
 	'gadgets-export-download' => 'Telecargar',
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Ansumang
  * @author Odisha1
  * @author Psubhashish
@@ -2513,6 +2620,21 @@ $1',
 	'gadgets-export-download' => 'ଡାଉନଲୋଡ଼',
 );
 
+/** Punjabi (ਪੰਜਾਬੀ)
+ * @author Babanwalia
+ */
+$messages['pa'] = array(
+	'prefs-gadgets' => 'ਗੈਜਟ',
+	'gadgets' => 'ਗੈਜਟ',
+	'gadgets-title' => 'ਗੈਜਟ',
+	'gadgets-uses' => 'ਵਰਤਦਾ ਹੈ',
+	'gadgets-default' => "ਮੂਲ ਤੌਰ 'ਤੇ ਸਾਰਿਆਂ ਲਈ ਚਾਲੂ ਹੈ।",
+	'gadgets-export' => 'ਨਿਰਯਾਤ',
+	'gadgets-export-title' => 'ਗੈਜਟ ਨਿਰਯਾਤ',
+	'gadgets-not-found' => 'ਗੈਜਟ "$1" ਨਹੀਂ ਲੱਭਾ।',
+	'gadgets-export-download' => 'ਡਾਊਨਲੋਡ ਕਰੋ',
+);
+
 /** Pampanga (Kapampangan)
  * @author Katimawan2005
  */
@@ -2543,6 +2665,7 @@ $messages['pdc'] = array(
 );
 
 /** Polish (polski)
+ * @author Chrumps
  * @author Derbeth
  * @author Marcin Łukasz Kiejzik
  * @author Matma Rex
@@ -2553,7 +2676,7 @@ $messages['pl'] = array(
 	'gadgets-desc' => 'Pozwala użytkownikom wybrać [[Special:Gadgets|gadżety CSS i JavaScript]] na [[Special:Preferences#mw-prefsection-gadgets|stronie preferencji]]',
 	'prefs-gadgets' => 'Gadżety',
 	'gadgets-prefstext' => 'Poniżej znajduje się lista specjalnych gadżetów, które możesz włączyć dla swojego konta użytkownika.
-Gadżety najczęściej wykorzystują JavaScript, więc by działały musisz mieć w swojej przeglądarce włączoną obsługę JavaScriptu. Gadżety nie mają wpływu na tę stronę preferencji.
+Gadżety najczęściej wykorzystują JavaScript, więc by działały, musisz mieć w swojej przeglądarce włączoną obsługę JavaScriptu. Gadżety nie mają wpływu na tę stronę preferencji.
 
 Gadżety nie są częścią oprogramowania MediaWiki i najprawdopodobniej zostały stworzone przez użytkowników tej wiki.
 Lokalni administratorzy mogą edytować dostępne gadżety używając stron [[MediaWiki:Gadgets-definition|Definicje gadżetów]] oraz [[Special:Gadgets|Gadżety]].',
@@ -2641,40 +2764,48 @@ Special:Import تے جاؤ وکی تے ، چرھاؤ اینوں۔ فیر تھل
  * @author Ahmed-Najib-Biabani-Ibrahimkhel
  */
 $messages['ps'] = array(
-	'prefs-gadgets' => 'ګاډجېټ',
-	'gadgets' => 'ګاډجېټ',
-	'gadgets-title' => 'ګاډجېټ',
+	'prefs-gadgets' => 'گاډجېټ',
+	'gadgets-prefstext' => 'دلته لاندې د ځانگړو گاډجېټونو (هوښيارتوکي) يو لړليک دی چې تاسې يې خپل گڼون لپاره چارنولی شی.
+دا گاډجېټونه د جاواسکرېپټ پر بنسټ جوړ شوي، نو د دې لپاره چې همدا گاډجېټونه سم کار وکړي نو ستاسې د کتنمل جاواسکرېپټ بايد چارند وي.
+په پام کې مو اوسه چې دا گاډجېټونه به په همدې غوره توبونو هېڅ اغېزه و نه لري.
+
+دا هم په پام کې ونيسئ چې دا ځانگړي گاډجېټونه د مېډياويکي د ساوترۍ برخه نه ده او دا اکثراً ستاسې د سيمه ايزې ويکي کارنانو لخوا پرمخ بېول کېږي.
+
+سيمه ايز پازوالان کولی شي د شته گاډجېټونو [[MediaWiki:Gadgets-definition|پېژندنې]] او [[Special:Gadgets|څرگندونې]] سمې کړي.',
+	'gadgets' => 'گاډجېټ',
+	'gadgets-title' => 'گاډجېټ',
 	'gadgets-uses' => 'کارونې',
 	'gadgets-export' => 'صادرول',
-	'gadgets-not-found' => 'د "$1" ګاډجېټ و نه موندل شو.',
+	'gadgets-not-found' => 'د "$1" گاډجېټ و نه موندل شو.',
 	'gadgets-export-download' => 'ښکته کول',
 );
 
 /** Portuguese (português)
  * @author Hamilton Abreu
  * @author Helder.wiki
+ * @author Luckas
  * @author Malafaya
  * @author 555
  */
 $messages['pt'] = array(
 	'gadgets-desc' => "Permite que os utilizadores seleccionem [[Special:Gadgets|''\"gadgets\"'' em JavaScript e CSS]] personalizados nas suas [[Special:Preferences#mw-prefsection-gadgets|preferências]]",
 	'prefs-gadgets' => 'Gadgets',
-	'gadgets-prefstext' => "Segue-se uma lista de ''\"gadgets\"'' especiais que pode activar na sua conta.
-Estes ''gadgets'' são baseados principalmente em JavaScript, sendo necessário activar o suporte a JavaScript no seu browser para que funcionem.
+	'gadgets-prefstext' => "Segue-se uma lista de ''\"gadgets\"'' especiais que pode ativar na sua conta.
+Estes ''gadgets'' são baseados principalmente em JavaScript, sendo necessário ativar o suporte a JavaScript no seu browser para que funcionem.
 Note que não terão efeito nesta página de preferências.
 
 Note também que estes ''gadgets'' especiais não fazem parte do programa MediaWiki, sendo geralmente desenvolvidos e mantidos por utilizadores na sua wiki local.
 Administradores locais podem editar os ''gadgets'' disponíveis usando as [[MediaWiki:Gadgets-definition|definições]] e [[Special:Gadgets|descrições]].",
 	'gadgets' => 'Gadgets',
 	'gadgets-title' => 'Gadgets',
-	'gadgets-pagetext' => "Segue-se uma lista de ''\"gadgets\"'' que podem ser activados pelos utilizadores nas suas [[Special:Preferences#mw-prefsection-gadgets|preferências]], como estabelecido pelas [[MediaWiki:Gadgets-definition|definições]].
+	'gadgets-pagetext' => "Segue-se uma lista de ''\"gadgets\"'' que podem ser ativados pelos utilizadores nas suas [[Special:Preferences#mw-prefsection-gadgets|preferências]], como estabelecido pelas [[MediaWiki:Gadgets-definition|definições]].
 Este resumo proporciona acesso fácil às páginas das mensagens de sistema que definem a descrição e o código de cada ''gadget''.",
 	'gadgets-uses' => 'Utiliza',
 	'gadgets-required-rights' => 'Requer {{PLURAL:$2|o seguinte privilégio|os seguintes privilégios}}:
 
 $1',
 	'gadgets-required-skins' => 'Disponível {{PLURAL:$2|no tema $1|nos seguintes temas: $1}}',
-	'gadgets-default' => 'Activado para todos por padrão.',
+	'gadgets-default' => 'Ativado para todos por padrão.',
 	'gadgets-export' => 'Exportar',
 	'gadgets-export-title' => 'Exportação de gadget',
 	'gadgets-not-found' => 'O gadget "$1" não foi encontrado.',
@@ -2691,34 +2822,35 @@ Na wiki de destino, tem de ter as permissões necessárias (incluindo o privilé
  * @author GoEThe
  * @author Helder.wiki
  * @author Rafael Vargas
+ * @author 555
  */
 $messages['pt-br'] = array(
-	'gadgets-desc' => 'Permite aos utilizadores selecionarem [[Special:Gadgets|"gadgets" JavaScript e CSS]] personalizados nas suas [[Special:Preferences#mw-prefsection-gadgets|preferências]]',
+	'gadgets-desc' => 'Permite que os usuários selecionem [[Special:Gadgets|"gadgets" JavaScript e CSS]] personalizados nas suas [[Special:Preferences#mw-prefsection-gadgets|preferências]]',
 	'prefs-gadgets' => 'Gadgets',
 	'gadgets-prefstext' => 'Segue-se uma lista de "gadgets" que podem ser ativados em sua conta.
 Tais gadgets normalmente são baseados em JavaScript, o que faz com que seja necessário que o suporte a JavaScript esteja ativado em seu navegador para que os mesmos funcionem.
 Note que os gadgets não possuem efeito nesta página (a página de preferências).
 
-Note também que tais gadgets não são parte do software MediaWiki, geralmente sendo desenvolvidos e mantidos por usuários de sua wiki local.
+Repare também que tais gadgets não são parte do software MediaWiki, geralmente sendo desenvolvidos e mantidos por usuários de seu wiki local.
 Administradores locais podem editar os gadgets disponíveis através de [[MediaWiki:Gadgets-definition|definições]] e [[Special:Gadgets|descrições]].',
 	'gadgets' => 'Gadgets',
 	'gadgets-title' => 'Gadgets',
-	'gadgets-pagetext' => 'Segue-se uma lista de "gadgets" que podem ser ativados por utilizadores através de [[Special:Preferences#mw-prefsection-gadgets|suas páginas de preferências]], definidos em [[MediaWiki:Gadgets-definition|definições]].
-Esta visão geral proporciona um acesso fácil para as mensagens de sistema que definem as descrições e códigos de cada um dos gadgets.',
-	'gadgets-uses' => 'Utiliza',
+	'gadgets-pagetext' => 'Segue-se uma lista de "gadgets" que podem ser ativados pelos usuários através de [[Special:Preferences#mw-prefsection-gadgets|suas páginas de preferências]], definidos em [[MediaWiki:Gadgets-definition|suas definições]].
+Esta lista possibilita um acesso fácil para as mensagens de sistema que definem as descrições e códigos de cada um dos gadgets.',
+	'gadgets-uses' => 'Usa',
 	'gadgets-required-rights' => 'Requer {{PLURAL:$2|o seguinte privilégio|os seguintes privilégios}}:
 
 $1',
 	'gadgets-required-skins' => 'Disponível {{PLURAL:$2|no skin $1|nos seguintes skins: $1}}.',
 	'gadgets-default' => 'Ativado para todos por padrão.',
 	'gadgets-export' => 'Exportar',
-	'gadgets-export-title' => 'Exportação de gadget',
-	'gadgets-not-found' => '*Gadget "$1" não encontrado.',
+	'gadgets-export-title' => 'Exportar gadgets',
+	'gadgets-not-found' => 'O gadget "$1" não encontrado.',
 	'gadgets-export-text' => 'Para exportar o gadget $1, clique no botão "{{int:gadgets-export-download}}", salve o arquivo transferido,
-vá à página Special:Import na wiki de destino e faça o upload do arquivo. Depois adicione o seguinte à página MediaWiki:Gadgets-definition:
+vá à página Special:Import no wiki de destino e faça o upload do arquivo. Depois, adicione o seguinte à página MediaWiki:Gadgets-definition:
 <pre>$2</pre>
-Na wiki de destino, você deve ter as permissões necessárias (incluindo o privilégio de editar mensagens de sistema) e a importação por upload de arquivos deve estar habilitada na wiki.',
-	'gadgets-export-download' => 'Baixar',
+É necessário que você tenha, no wiki de destino, as permissões necessárias (incluindo o privilégio de editar mensagens de sistema) e a importação por upload de arquivos deve estar ativada.',
+	'gadgets-export-download' => 'Fazer download',
 );
 
 /** Quechua (Runa Simi)
@@ -2989,6 +3121,7 @@ Musíte mať príslušné oprávnenia na cieľovej wiki (vrátane práva na úpr
 
 /** Slovenian (slovenščina)
  * @author Dbc334
+ * @author Eleassar
  * @author Smihael
  */
 $messages['sl'] = array(
@@ -2998,7 +3131,7 @@ $messages['sl'] = array(
 Večinoma temeljijo na JavaScriptu, zato mora biti za njihovo delovanje omogočen v vašem brskalniku.
 Ti vtičniki nimajo nobenega vpliva na to nastavitveno stran.
 
-Prav tako pomnite, da ti vtičniki niso del programja MediaWiki in jih običajno razvijajo ter vzdržujejo uporabniki na vašem lokalnem wikiju.
+Prav tako upoštevajte, da ti vtičniki niso del programja MediaWiki in jih običajno razvijajo ter vzdržujejo uporabniki na vašem lokalnem wikiju.
 Administratorji lahko uredite seznam vtičnikov z uporabo [[MediaWiki:Gadgets-definition|opredelitev]] in [[Special:Gadgets|posebne strani]].',
 	'gadgets' => 'Vtičniki',
 	'gadgets-title' => 'Vtičniki',
@@ -3055,6 +3188,7 @@ Ju duhet të keni leje të përshtatshme në wiki-n e destinuar (duke përfshir
 );
 
 /** Serbian (Cyrillic script) (српски (ћирилица)‎)
+ * @author Milicevic01
  * @author Millosh
  * @author Nikola Smolenski
  * @author Rancher
@@ -3062,12 +3196,12 @@ Ju duhet të keni leje të përshtatshme në wiki-n e destinuar (duke përfshir
  */
 $messages['sr-ec'] = array(
 	'gadgets-desc' => 'Омогућава корисницима да изаберу прилагођене [[Special:Gadgets|CSS и јаваскрипт гаџете]] у својим [[Special:Preferences#mw-prefsection-gadgets|подешавањима]]',
-	'prefs-gadgets' => 'Гаџети',
+	'prefs-gadgets' => 'Геџети',
 	'gadgets-prefstext' => 'Испод се налази списак посебних гаџета које можете да омогућите на свом налогу.
 Ове справице су углавном засноване на јаваскрипти, тако да она мора бити омогућена.
 Гаџети неће утицати на страницу за подешавање.
 
-Они нису део софтвера Медијавики, већ се развијају и одржавају од стране корисника ваше викије.
+Они нису део софтвера Медијавики, већ се развијају и одржавају од стране корисника на вашем локалном викију.
 Администратори могу да измене [[MediaWiki:Gadgets-definition|значења]] и [[Special:Gadgets|описе]] доступних гаџета.',
 	'gadgets' => 'Гаџети',
 	'gadgets-title' => 'Гаџети',
@@ -3091,6 +3225,7 @@ $1',
 
 /** Serbian (Latin script) (srpski (latinica)‎)
  * @author Michaello
+ * @author Milicevic01
  * @author Жељко Тодоровић
  */
 $messages['sr-el'] = array(
@@ -3100,7 +3235,7 @@ $messages['sr-el'] = array(
 Ove spravice su uglavnom zasnovane na javaskripti, tako da ona mora biti omogućena.
 Gadžeti neće uticati na stranicu za podešavanje.
 
-Oni nisu deo softvera Medijaviki, već se razvijaju i održavaju od strane korisnika vaše vikije.
+Oni nisu deo softvera Medijaviki, već se razvijaju i održavaju od strane korisnika na vašem lokalnom vikiju.
 Administratori mogu da izmene [[MediaWiki:Gadgets-definition|značenja]] i [[Special:Gadgets|opise]] dostupnih gadžeta.',
 	'gadgets' => 'gedžeti',
 	'gadgets-title' => 'gedžeti',
@@ -3336,6 +3471,7 @@ Dapat kang mayroong nararapat na mga pahintulot sa kapupuntahang wiki (kasama an
 /** Turkish (Türkçe)
  * @author Emperyan
  * @author Erkan Yilmaz
+ * @author Incelemeelemani
  * @author Joseph
  * @author Karduelis
  * @author Koc61
@@ -3353,6 +3489,11 @@ Yerel yöneticiler [[MediaWiki:Gadgets-definition|tanımları]] ve [[Special:Gad
 	'gadgets-pagetext' => "Aşağıdaki, kullanıcıların [[Special:Preferences#mw-prefsection-gadgets|tercihler sayfasında]] etkin hale getirebileceği, [[MediaWiki:Gadgets-definition|tanımlarla]] belirtildiği gibi, özel gadgetlerin bir listesidir.
 Bu genel bakış, her gadget'in tanımını ve kodunu belirten sistem mesaj sayfalarına kolay erişim sağlar.",
 	'gadgets-uses' => 'Kullanıyor',
+	'gadgets-required-rights' => 'Aşağıda gösterilen {{PLURAL:$2|hak|haklar}} gereklidir:
+
+$1',
+	'gadgets-required-skins' => 'Kullanılabilecek {{PLURAL:$2|$1 tema|temalar: $1}}.',
+	'gadgets-default' => 'Herkes için varsayılan olarak etkindir.',
 	'gadgets-export' => 'Dışa aktar',
 	'gadgets-export-title' => 'Gadget dışa aktarımı',
 	'gadgets-not-found' => 'Gadget "$1" bulunamadı.',
@@ -3589,16 +3730,12 @@ $messages['yue'] = array(
 $messages['zh-hans'] = array(
 	'gadgets-desc' => '允许用户在其[[Special:Preferences#mw-prefsection-gadgets|系统设置]]中选择自定义[[Special:Gadgets|CSS和JavaScript工具]]',
 	'prefs-gadgets' => '小工具',
-	'gadgets-prefstext' => '以下是您可以为您的帐户启用的特别小工具的名单。
-这些小工具大多都是基于JavaScript技术制作，所以您的浏览器的JavaScript功能必须可用才可使用它们。
-要稍作留意的是，这些小工具在这个参数设置页面中不会有任何效果。
+	'gadgets-prefstext' => '下面是你可以为你的账户启用的特殊小工具的列表。这些小工具大多数基于JavaScript，所以你必需使你的浏览器启用JavaScript以使它们工作。请注意这些小工具不会在这个设置页面上产生效果。
 
-亦请您了解这些特别的小工具不是MediaWiki软件的一部份，大多是由您本地wiki中的用户开发和维护。
-本地的管理员可以编辑可用小工具的[[MediaWiki:Gadgets-definition|定义]]及[[Special:Gadgets|描述]]。',
+同时请注意，这些特殊小工具不是MediaWiki软件的组成部分，他们通常是由你的本地wiki的用户开发并维护的。本地管理员可以编辑可用小工具的[[MediaWiki:Gadgets-definition|定义]]和[[Special:Gadgets|说明]]。',
 	'gadgets' => '小工具',
 	'gadgets-title' => '小工具',
-	'gadgets-pagetext' => '以下是一个按照[[MediaWiki:Gadgets-definition]]定义的特殊小工具列表，用户可以在他们的[[Special:Preferences#mw-prefsection-gadgets|参数设置页面]]中激活它们。
-通过这个概览可以方便的获得系统信息页面，从而可以定义每个小工具的描述以及源码。',
+	'gadgets-pagetext' => '下面是用户可以在他们的[[Special:Preferences#mw-prefsection-gadgets|设置页面]]启用的特殊小工具的列表，由[[MediaWiki:Gadgets-definition|定义]]确定。这个概览提供便捷访问确定每个小工具的说明和代码的系统信息页面的途径。',
 	'gadgets-uses' => '使用',
 	'gadgets-required-rights' => '需要以下{{PLURAL:$2|权限|权限}}：
 
@@ -3619,13 +3756,14 @@ $1',
  * @author Danny0838
  * @author Gakmo
  * @author Horacewai2
+ * @author Justincheng12345
  * @author Liangent
  * @author Mark85296341
  * @author Shinjiman
  * @author Waihorace
  */
 $messages['zh-hant'] = array(
-	'gadgets-desc' => '讓使用者可以在[[Special:Preferences#mw-prefsection-gadgets|偏好設定]]中自訂 [[Special:Gadgets|CSS與JavaScript工具]]',
+	'gadgets-desc' => '讓使用者可以於[[Special:Preferences#mw-prefsection-gadgets|偏好設定]]中自訂[[Special:Gadgets|CSS與JavaScript工具]]',
 	'prefs-gadgets' => '小工具',
 	'gadgets-prefstext' => '以下列出各種特殊小工具，可在您的帳戶中啟用之。小工具多使用了JavaScript，瀏覽器必須啟用JavaScript才能正常運作。請注意小工具的效果不會作用在這個偏好設定頁。
 
diff --git a/extensions/Gadgets/Gadgets.php b/extensions/Gadgets/Gadgets.php
index 59b0af69..b0b455c4 100644
--- a/extensions/Gadgets/Gadgets.php
+++ b/extensions/Gadgets/Gadgets.php
@@ -24,7 +24,7 @@ $wgExtensionCredits['other'][] = array(
 	'path' => __FILE__,
 	'name' => 'Gadgets',
 	'author' => array( 'Daniel Kinzler', 'Max Semenik' ),
-	'url' => 'https://mediawiki.org/wiki/Extension:Gadgets',
+	'url' => 'https://www.mediawiki.org/wiki/Extension:Gadgets',
 	'descriptionmsg' => 'gadgets-desc',
 );
 
@@ -42,7 +42,7 @@ $wgExtensionMessagesFiles['GadgetsAlias'] = $dir . 'Gadgets.alias.php';
 $wgAutoloadClasses['ApiQueryGadgetCategories'] = $dir . 'ApiQueryGadgetCategories.php';
 $wgAutoloadClasses['ApiQueryGadgets'] = $dir . 'ApiQueryGadgets.php';
 $wgAutoloadClasses['Gadget'] = $dir . 'Gadgets_body.php';
-$wgAutoloadClasses['GadgetHooks'] = $dir . 'Gadgets_body.php';
+$wgAutoloadClasses['GadgetHooks'] = $dir . 'GadgetHooks.php';
 $wgAutoloadClasses['GadgetResourceLoaderModule'] = $dir . 'Gadgets_body.php';
 $wgAutoloadClasses['SpecialGadgets'] = $dir . 'SpecialGadgets.php';
 
diff --git a/extensions/Gadgets/Gadgets_body.php b/extensions/Gadgets/Gadgets_body.php
index e787062a..1e043a82 100644
--- a/extensions/Gadgets/Gadgets_body.php
+++ b/extensions/Gadgets/Gadgets_body.php
@@ -11,235 +11,6 @@
  * @license GNU General Public Licence 2.0 or later
  */
 
-class GadgetHooks {
-	/**
-	 * ArticleSaveComplete hook handler.
-	 *
-	 * @param $article Article
-	 * @param $user User
-	 * @param $text String: New page text
-	 * @return bool
-	 */
-	public static function articleSaveComplete( $article, $user, $text ) {
-		// update cache if MediaWiki:Gadgets-definition was edited
-		$title = $article->getTitle();
-		if ( $title->getNamespace() == NS_MEDIAWIKI && $title->getText() == 'Gadgets-definition' ) {
-			Gadget::loadStructuredList( $text );
-		}
-		return true;
-	}
-
-	/**
-	 * UserGetDefaultOptions hook handler
-	 * @param $defaultOptions Array of default preference keys and values
-	 * @return bool
-	 */
-	public static function userGetDefaultOptions( &$defaultOptions ) {
-		$gadgets = Gadget::loadStructuredList();
-		if ( !$gadgets ) {
-			return true;
-		}
-
-		/**
-		 * @var $gadget Gadget
-		 */
-		foreach ( $gadgets as $thisSection ) {
-			foreach ( $thisSection as $gadgetId => $gadget ) {
-				if ( $gadget->isOnByDefault() ) {
-					$defaultOptions['gadget-' . $gadgetId] = 1;
-				}
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * GetPreferences hook handler.
-	 * @param $user User
-	 * @param $preferences Array: Preference descriptions
-	 * @return bool
-	 */
-	public static function getPreferences( $user, &$preferences ) {
-		$gadgets = Gadget::loadStructuredList();
-		if ( !$gadgets ) {
-			return true;
-		}
-
-		$options = array();
-		$default = array();
-		foreach ( $gadgets as $section => $thisSection ) {
-			$available = array();
-
-			/**
-			 * @var $gadget Gadget
-			 */
-			foreach ( $thisSection as $gadget ) {
-				if ( $gadget->isAllowed( $user ) ) {
-					$gname = $gadget->getName();
-					# bug 30182: dir="auto" because it's often not translated
-					$desc = '<span dir="auto">' . $gadget->getDescription() . '</span>';
-					$available[$desc] = $gname;
-					if ( $gadget->isEnabled( $user ) ) {
-						$default[] = $gname;
-					}
-				}
-			}
-
-			if ( $section !== '' ) {
-				$section = wfMessage( "gadget-section-$section" )->parse();
-
-				if ( count ( $available ) ) {
-					$options[$section] = $available;
-				}
-			} else {
-				$options = array_merge( $options, $available );
-			}
-		}
-
-		$preferences['gadgets-intro'] =
-			array(
-				'type' => 'info',
-				'label' => '&#160;',
-				'default' => Xml::tags( 'tr', array(),
-					Xml::tags( 'td', array( 'colspan' => 2 ),
-						wfMessage( 'gadgets-prefstext' )->parseAsBlock() ) ),
-				'section' => 'gadgets',
-				'raw' => 1,
-				'rawrow' => 1,
-			);
-
-		$preferences['gadgets'] =
-			array(
-				'type' => 'multiselect',
-				'options' => $options,
-				'section' => 'gadgets',
-				'label' => '&#160;',
-				'prefix' => 'gadget-',
-				'default' => $default,
-			);
-
-		return true;
-	}
-
-	/**
-	 * ResourceLoaderRegisterModules hook handler.
-	 * @param $resourceLoader ResourceLoader
-	 * @return bool
-	 */
-	public static function registerModules( &$resourceLoader ) {
-		$gadgets = Gadget::loadList();
-		if ( !$gadgets ) {
-			return true;
-		}
-
-		/**
-		 * @var $g Gadget
-		 */
-		foreach ( $gadgets as $g ) {
-			$module = $g->getModule();
-			if ( $module ) {
-				$resourceLoader->register( $g->getModuleName(), $module );
-			}
-		}
-		return true;
-
-	}
-
-	/**
-	 * BeforePageDisplay hook handler.
-	 * @param $out OutputPage
-	 * @return bool
-	 */
-	public static function beforePageDisplay( $out ) {
-		wfProfileIn( __METHOD__ );
-
-		$gadgets = Gadget::loadList();
-		if ( !$gadgets ) {
-			wfProfileOut( __METHOD__ );
-			return true;
-		}
-
-		$lb = new LinkBatch();
-		$lb->setCaller( __METHOD__ );
-		$pages = array();
-
-		/**
-		 * @var $gadget Gadget
-		 */
-		$user = $out->getUser();
-		foreach ( $gadgets as $gadget ) {
-			if ( $gadget->isEnabled( $user ) && $gadget->isAllowed( $user ) ) {
-				if ( $gadget->hasModule() ) {
-					$out->addModuleStyles( $gadget->getModuleName() );
-					$out->addModules( $gadget->getModuleName() );
-				}
-
-				foreach ( $gadget->getLegacyScripts() as $page ) {
-					$lb->add( NS_MEDIAWIKI, $page );
-					$pages[] = $page;
-				}
-			}
-		}
-
-
-		// Allow other extensions, e.g. MobileFrontend, to disallow legacy gadgets
-		if ( wfRunHooks( 'Gadgets::allowLegacy', array( $out->getContext() ) ) ) {
-			$lb->execute( __METHOD__ );
-
-			$done = array();
-
-			foreach ( $pages as $page ) {
-				if ( isset( $done[$page] ) ) {
-					continue;
-				}
-
-				$done[$page] = true;
-				self::applyScript( $page, $out );
-			}
-		}
-		wfProfileOut( __METHOD__ );
-
-		return true;
-	}
-
-	/**
-	 * Adds one legacy script to output.
-	 *
-	 * @param string $page Unprefixed page title
-	 * @param OutputPage $out
-	 */
-	private static function applyScript( $page, $out ) {
-		global $wgJsMimeType;
-
-		# bug 22929: disable gadgets on sensitive pages.  Scripts loaded through the
-		# ResourceLoader handle this in OutputPage::getModules()
-		# TODO: make this extension load everything via RL, then we don't need to worry
-		# about any of this.
-		if ( $out->getAllowedModules( ResourceLoaderModule::TYPE_SCRIPTS ) < ResourceLoaderModule::ORIGIN_USER_SITEWIDE ) {
-			return;
-		}
-
-		$t = Title::makeTitleSafe( NS_MEDIAWIKI, $page );
-		if ( !$t ) {
-			return;
-		}
-
-		$u = $t->getLocalURL( 'action=raw&ctype=' . $wgJsMimeType );
-		$out->addScriptFile( $u, $t->getLatestRevID() );
-	}
-
-	/**
-	 * UnitTestsList hook handler
-	 * @param array $files
-	 * @return bool
-	 */
-	public static function onUnitTestsList( array &$files ) {
-		$testDir = __DIR__ . '/tests/';
-		$files = array_merge( $files, glob( "$testDir/*Test.php" ) );
-		return true;
-	}
-}
 
 /**
  * Wrapper for one gadget.
@@ -248,7 +19,7 @@ class Gadget {
 	/**
 	 * Increment this when changing class structure
 	 */
-	const GADGET_CLASS_VERSION = 6;
+	const GADGET_CLASS_VERSION = 7;
 
 	private $version = self::GADGET_CLASS_VERSION,
 			$scripts = array(),
@@ -261,6 +32,7 @@ class Gadget {
 			$requiredSkins = array(),
 			$targets = array( 'desktop' ),
 			$onByDefault = false,
+			$position = 'bottom',
 			$category;
 
 	/**
@@ -310,6 +82,9 @@ class Gadget {
 				case 'targets':
 					$gadget->targets = $params;
 					break;
+				case 'top':
+					$gadget->position = 'top';
+					break;
 			}
 		}
 
@@ -463,7 +238,7 @@ class Gadget {
 			return null;
 		}
 
-		return new GadgetResourceLoaderModule( $pages, $this->dependencies, $this->targets );
+		return new GadgetResourceLoaderModule( $pages, $this->dependencies, $this->targets, $this->position );
 	}
 
 	/**
@@ -501,6 +276,14 @@ class Gadget {
 		return $this->requiredSkins;
 	}
 
+	/**
+	 * Returns the position of this Gadget's ResourceLoader module
+	 * @return String: 'bottom' or 'top'
+	 */
+	public function getPosition() {
+		return $this->position;
+	}
+
 	/**
 	 * Loads and returns a list of all gadgets
 	 * @return Mixed: Array of gadgets or false
@@ -614,6 +397,13 @@ class Gadget {
 			}
 		}
 
+		if ( !count( $gadgets ) ) {
+			// Don't cache in case we couldn't find any gadgets. Bug 37228
+			$gadgets = false;
+			wfProfileOut( __METHOD__ );
+			return $gadgets;
+		}
+
 		// cache for a while. gets purged automatically when MediaWiki:Gadgets-definition is edited
 		$wgMemc->set( $key, $gadgets, 60 * 60 * 24 );
 		$source = $forceNewText !== null ? 'input text' : 'MediaWiki:Gadgets-definition';
@@ -641,11 +431,13 @@ class GadgetResourceLoaderModule extends ResourceLoaderWikiModule {
 	 * )
 	 * @param $dependencies Array: Names of resources this module depends on
 	 * @param $targets Array: List of targets this module support
+	 * @param $position String: 'bottom' or 'top'
 	 */
-	public function __construct( $pages, $dependencies, $targets ) {
+	public function __construct( $pages, $dependencies, $targets, $position ) {
 		$this->pages = $pages;
 		$this->dependencies = $dependencies;
 		$this->targets = $targets;
+		$this->position = $position;
 	}
 
 	/**
@@ -664,4 +456,12 @@ class GadgetResourceLoaderModule extends ResourceLoaderWikiModule {
 	public function getDependencies() {
 		return $this->dependencies;
 	}
+
+	/**
+	 * Overrides ResourceLoaderModule::getPosition()
+	 * @return String: 'bottom' or 'top'
+	 */
+	public function getPosition() {
+		return $this->position;
+	}
 }
diff --git a/extensions/Gadgets/README b/extensions/Gadgets/README
index cbe0862e..5fb3c353 100644
--- a/extensions/Gadgets/README
+++ b/extensions/Gadgets/README
@@ -8,7 +8,7 @@ Licenses: GNU General Public Licence (GPL)
 The Gadgets extension provides a way for users to pick JavaScript or CSS
 based "gadgets" that other wiki users provide.
 
-<https://mediawiki.org/wiki/Extension:Gadgets>
+<https://www.mediawiki.org/wiki/Extension:Gadgets>
 
 The Gadgets extension was originally written by Daniel Kinzler in 2007
 and is released under the GNU General Public Licence (GPL).
diff --git a/extensions/ImageMap/ImageMap.i18n.php b/extensions/ImageMap/ImageMap.i18n.php
index f3a46a76..cf4e2655 100644
--- a/extensions/ImageMap/ImageMap.i18n.php
+++ b/extensions/ImageMap/ImageMap.i18n.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Internationalisation file for extension FindSpam.
+ * Internationalisation file for extension ImageMap.
  *
  * @file
  * @ingroup Extensions
@@ -48,7 +48,9 @@ This message indicates that an image must be specified in the first line.',
 * $1 - line number',
 	'imagemap_missing_coord' => 'Used as error message. Parameters:
 * $1 - line number',
-	'imagemap_unrecognised_shape' => '{{doc-important|Do not translate the parameters <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code>.}}',
+	'imagemap_unrecognised_shape' => '{{doc-important|Do not translate the parameters <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code>.}}
+Used as error message. Parameters:
+* $1 - line number',
 	'imagemap_invalid_coord' => 'Used as error message. Parameters:
 * $1 - line number',
 	'imagemap_invalid_desc' => 'Used as error message. Parameters:
@@ -132,7 +134,7 @@ $messages['arz'] = array(
 	'imagemap_poly_odd' => 'خطأ: تم العثور على مضلع بعدد فردى من الأضلاع فى السطر $1',
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Bishnu Saikia
  * @author Gitartha.bordoloi
  */
@@ -220,9 +222,21 @@ $messages['bcc'] = array(
 
 /** Bikol Central (Bikol Central)
  * @author Filipinayzd
+ * @author Geopoet
  */
 $messages['bcl'] = array(
+	'imagemap_desc' => 'Minatugot sa lado nin kliyente an puwedeng ma-klik na mga imahe nin mapa na ginagamit an <code>&lt;imagemap&gt;</code> na tatak',
+	'imagemap_no_image' => 'Kasalaan:Kaipuhan isambit an imahe sa enot na linya.',
+	'imagemap_invalid_image' => 'Kasalaan: An imahe imbalido o bakong eksistido.',
+	'imagemap_bad_image' => 'Kasalaan:An imahe pinagbawal sa pahinang ini.',
+	'imagemap_no_link' => 'Kasalaan:Mayo nin balidong sugpon an manumpungan sa tapos kan linya na $1.',
+	'imagemap_invalid_title' => 'Kasalaan:Imbalido an titulo na yaon sa sugpon sa linya na $1.',
+	'imagemap_missing_coord' => 'Kasalaan:Bakong supisiyente an mga koordinato para sa kahitsurahan kan linya $1.',
+	'imagemap_unrecognised_shape' => 'Kasalaan: Bakong rekonosido an kahitsurahan sa linya $1, an lambang linya kaipong magpoon na igwang saro kan: <code>default</code>, <code>rect</code>, <code>circle</code> or <code>poly</code>.',
+	'imagemap_invalid_coord' => 'Kasalaan:Imbalidong koordinato sa linya $1, kaipohan na sarong numero.',
+	'imagemap_invalid_desc' => 'Kasalaan: Imbalido an deskripsyon nin espesipikasyon, kaipohan na saro sa:<code>$1</code>.',
 	'imagemap_description' => 'Manónongod sa retratong ini',
+	'imagemap_poly_odd' => 'Kasalaan:Nanumpungan an poli na igwang butal na numero kan koordinato sa may linya na $1',
 );
 
 /** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
@@ -348,9 +362,13 @@ $messages['ca'] = array(
 
 /** Chechen (нохчийн)
  * @author Sasan700
+ * @author Умар
  */
 $messages['ce'] = array(
-	'imagemap_invalid_image' => 'Гlалат: нийса дац йа ишта сурт дац кху чохь',
+	'imagemap_invalid_image' => 'ГӀалат: нийса дац я ишта сурт дац кху чохь',
+	'imagemap_no_link' => 'ГӀалат: $1 могӀанан чаккхехь нийса йоцу хьажораг ю',
+	'imagemap_invalid_title' => 'ГӀалат: могӀана $1 хьажориган корта нийса яц',
+	'imagemap_description' => 'Суьртах лаьцна',
 );
 
 /** Corsican (corsu)
@@ -382,6 +400,11 @@ $messages['cs'] = array(
  * @author Lloffiwr
  */
 $messages['cy'] = array(
+	'imagemap_no_image' => 'Gwall: Rhaid nodi delwedd yn y llinell gyntaf.',
+	'imagemap_invalid_image' => "Gwall: Nid yw'r ddelwedd yn ddilys, neu nid yw'n bod.",
+	'imagemap_bad_image' => "Gwall: Mae'r ddelwedd wedi ei gwahardd rhag ei defnyddio ar y dudalen hon.",
+	'imagemap_no_link' => 'Gwall: Ni chafwyd unrhyw gyswllt dilys ar ddiwedd y llinell $1.',
+	'imagemap_invalid_title' => 'Gwall: Teitl annilys yn y cyswllt ar linell $1.',
 	'imagemap_description' => "Ynglŷn â'r ddelwedd hon",
 );
 
@@ -570,20 +593,21 @@ $messages['ext'] = array(
 );
 
 /** Persian (فارسی)
+ * @author Ebraminio
  * @author Huji
  * @author ZxxZxxZ
  */
 $messages['fa'] = array(
 	'imagemap_desc' => 'امکان ایجاد نقشه‌های تصویری قابل کلیک کردن در سمت کاربر را با استفاده از برچسب <code>&lt;imagemap&gt;</code> فراهم می‌آورد',
 	'imagemap_no_image' => '<imagemap>: باید در اولین سطر یک تصویر را مشخص کنید',
-	'imagemap_invalid_image' => '<imagemap>: تصویر غیرمجاز است یا وجود ندارد',
+	'imagemap_invalid_image' => '<imagemap>: تصویر نامحاز است یا وجود ندارد',
 	'imagemap_bad_image' => 'خطا: تصویر در این صفحه در فهرست سیاه قرار دارد',
 	'imagemap_no_link' => 'خطا: هیچ پیوند مجازی در انتهای خط $1 یافت نشد',
-	'imagemap_invalid_title' => '<imagemap>: عنوان غیرمجاز در پیوند سطر $1',
+	'imagemap_invalid_title' => '<imagemap>: عنوان نامجاز در پیوند سطر $1',
 	'imagemap_missing_coord' => '<imagemap>: تعداد مختصات در سطر $1 برای شکل کافی نیست',
 	'imagemap_unrecognised_shape' => '<imagemap>: شکل ناشناخته در سطر $1، هر سطر باید با یکی از این دستورات آغاز شود: <code>default</code>، <code>rect</code>، <code>circle</code> یا <code>poly</code>',
-	'imagemap_invalid_coord' => '<imagemap>: مختصات غیرمجاز در سطر $1، مختصات باید عدد باشد',
-	'imagemap_invalid_desc' => '<imagemap>: توضیحات غیرمجاز، باید یکی از این موارد باشد: <code>$1</code>',
+	'imagemap_invalid_coord' => '<imagemap>: مختصات نامجاز در سطر $1، مختصات باید عدد باشد',
+	'imagemap_invalid_desc' => '<imagemap>: توضیحات نامجاز، باید یکی از این موارد باشد: <code>$1</code>',
 	'imagemap_description' => 'دربارهٔ این تصویر',
 	'imagemap_poly_odd' => 'خطا: چند ضلعی با تعداد فرعی از مختصات در سطر $1 پیدا شد',
 );
@@ -1048,18 +1072,19 @@ $messages['km'] = array(
  * @author Klutzy
  * @author Kwj2772
  * @author Yknok29
+ * @author 아라
  */
 $messages['ko'] = array(
-	'imagemap_desc' => '사용자가 이미지맵을 사용할 수 있도록 <code>&lt;imagemap&gt;</code> 태그를 추가',
+	'imagemap_desc' => '<code>&lt;imagemap&gt;</code> 태그로 클라이언트 측에서 클릭할 수 있는 이미지 맵을 사용할 수 있습니다',
 	'imagemap_no_image' => '오류: 첫 줄에 그림이 제시되어야 합니다.',
 	'imagemap_invalid_image' => '오류: 그림이 잘못되었거나 존재하지 않습니다.',
-	'imagemap_bad_image' => '오류: 이 그림은 이 문서에서 사용이 금지되어 있습니다.',
-	'imagemap_no_link' => '오류: $1번째 줄에서 유효한 링크를 찾을 수 없습니다',
+	'imagemap_bad_image' => '오류: 그림은 이 문서에서 사용이 금지되어 있습니다.',
+	'imagemap_no_link' => '오류: $1번째 줄에서 올바른 링크를 찾을 수 없습니다',
 	'imagemap_invalid_title' => '오류: $1번째 줄의 링크 제목이 잘못되었습니다',
 	'imagemap_missing_coord' => '오류: $1줄에 정의된 도형의 좌표 값이 충분하지 않습니다.',
 	'imagemap_unrecognised_shape' => '오류: $1줄에서 도형을 인식할 수 없음, 각 줄은 다음으로 시작해야 합니다: <code>default</code>, <code>rect</code>, <code>circle</code>, <code>poly</code>',
 	'imagemap_invalid_coord' => '오류: $1번째 줄에서 좌표가 잘못되었습니다. 좌표는 반드시 숫자여야 합니다.',
-	'imagemap_invalid_desc' => '오류: 질못된 desc 설정. 다음 중 하나가 되어야 함: <code>$1</code>',
+	'imagemap_invalid_desc' => '오류: 질못된 desc 설정으로, 다음 중 하나여야 합니다: <code>$1</code>',
 	'imagemap_description' => '이 그림에 대한 정보',
 	'imagemap_poly_odd' => '오류: $1번째 줄에 정의된 좌표 값의 수가 홀수 개입니다.',
 );
@@ -1101,6 +1126,7 @@ $messages['la'] = array(
 
 /** Luxembourgish (Lëtzebuergesch)
  * @author Robby
+ * @author Soued031
  */
 $messages['lb'] = array(
 	'imagemap_desc' => 'Erlaabt et Biller ze benotzen déi een uklicke ka mat Hëllef vum Tag <code>&lt;imagemap&gt;</code>.',
@@ -1113,7 +1139,7 @@ $messages['lb'] = array(
 	'imagemap_unrecognised_shape' => 'Feeler: Onbekannte Form an der Zeil $1. All Zeile muss matt engem vun dëse Parameter ufänken: <tt><code>default</code>, <code>rect</code>, <code>circle</code></tt> oder <tt><code>poly</code></tt>',
 	'imagemap_invalid_coord' => 'Feeler: Ongëlteg Koordinaten an der Zeil $1: et sinn nëmmen Zuelen erlaabt',
 	'imagemap_invalid_desc' => 'Feeler: Ongëltegen „desc“-Parameter, méiglech sinn: <code>$1</code>',
-	'imagemap_description' => 'Iwwert dëst Bild',
+	'imagemap_description' => 'Iwwer dëst Bild',
 	'imagemap_desc_types' => 'uewe-riets, ënne-riets, ënne-lénks, uewe-lénks, keen',
 	'imagemap_poly_odd' => 'Feeler: e Polygon mat enger ongerueder Zuel vu Koordinate gouf an der Linn $1 fonnt',
 );
@@ -1267,7 +1293,7 @@ $messages['myv'] = array(
 	'imagemap_description' => 'Те артовкстонть',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  */
 $messages['nb'] = array(
 	'imagemap_desc' => 'Gjør at man kan bruke klikkbare bilder ved hjelp av <code>&lt;imagemap&gt;</code>.',
@@ -1302,12 +1328,14 @@ $messages['nds'] = array(
 	'imagemap_poly_odd' => 'Fehler: Polygon mit unevene Tall Koordinaten in Reeg $1',
 );
 
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
  * @author Servien
  */
 $messages['nds-nl'] = array(
+	'imagemap_desc' => 'Maakt anklikbaore verwiezingen op aofbeeldingen meugelik mit t etiket <code>&lt;imagemap&gt;</code>',
 	'imagemap_no_image' => 'Fout: geef n aofbeelding op in de eerste regel',
 	'imagemap_invalid_image' => 'Fout: aofbeelding is ongeldig of besteet niet',
+	'imagemap_bad_image' => 'Fout: de aofbeelding steet op de zwarte lieste veur disse zied',
 	'imagemap_no_link' => 'Fout: der is gien geldige verwiezing evunnen an t einde van regel $1',
 	'imagemap_invalid_title' => 'Fout: ongeldige titel in de verwiezing op regel $1',
 	'imagemap_missing_coord' => 'Fout: niet genog koördinaoten veur vorm op regel $1',
@@ -1315,6 +1343,7 @@ $messages['nds-nl'] = array(
 	'imagemap_invalid_coord' => 'Fout: ongeldige koördinaot in regel $1, mut n getal ween',
 	'imagemap_invalid_desc' => 'Fout: ongeldige beschrievingsspesifikasie, mut n van: <code>$1</code> ween',
 	'imagemap_description' => 'Over disse aofbeelding',
+	'imagemap_poly_odd' => 'Fout: polygoon evunnen mit n oneffen antal koördinaoten op regel $1',
 );
 
 /** Nepali (नेपाली)
@@ -1342,7 +1371,7 @@ $messages['nl'] = array(
 	'imagemap_poly_odd' => 'Fout: polygoon gevonden met een oneven aantal coördinaten op regel $1',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Frokor
  */
 $messages['nn'] = array(
@@ -1367,7 +1396,7 @@ $messages['oc'] = array(
 	'imagemap_desc' => "Permet qu'una mapa imatge clienta siá clicabla en utilizant la balisa <code>&lt;imagemap&gt;</code>",
 	'imagemap_no_image' => 'Error : vos cal especificar un imatge dins la primièra linha',
 	'imagemap_invalid_image' => 'Error : l’imatge es invalid o existís pas',
-	'imagemap_bad_image' => 'Error : l’imatge es sus la tièra negra sus aquesta pagina',
+	'imagemap_bad_image' => 'Error : l’imatge es sus la lista negra sus aquesta pagina',
 	'imagemap_no_link' => 'Error : cap de ligam valid es pas estat trobat a la fin de la linha $1',
 	'imagemap_invalid_title' => 'Error : títol invalid dins lo ligam a la linha $1',
 	'imagemap_missing_coord' => 'Error : pas pro de coordenadas per la forma a la linha $1',
@@ -1378,7 +1407,7 @@ $messages['oc'] = array(
 	'imagemap_poly_odd' => 'Error : trobat un poligòn amb un nombre impar de coordenadas a la linha $1',
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Psubhashish
  */
 $messages['or'] = array(
diff --git a/extensions/ImageMap/ImageMap.php b/extensions/ImageMap/ImageMap.php
index aa4cfa0d..b263bbb5 100644
--- a/extensions/ImageMap/ImageMap.php
+++ b/extensions/ImageMap/ImageMap.php
@@ -1,4 +1,20 @@
 <?php
+/**
+ * ImageMap extension - Allows clickable HTML image maps.
+ *
+ * @link https://www.mediawiki.org/wiki/Extension:ImageMap Documentation
+ *
+ * @file
+ * @ingroup Extensions
+ * @package MediaWiki
+ * @author Tim Starling
+ * @copyright (C) 2007 Tim Starling
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+   die( 'This file is a MediaWiki extension, it is not a valid entry point' );
+}
 
 $dir = __DIR__ . '/';
 $wgExtensionMessagesFiles['ImageMap'] = $dir . 'ImageMap.i18n.php';
diff --git a/extensions/ImageMap/ImageMap_body.php b/extensions/ImageMap/ImageMap_body.php
index e67b4426..7b53285e 100644
--- a/extensions/ImageMap/ImageMap_body.php
+++ b/extensions/ImageMap/ImageMap_body.php
@@ -1,7 +1,9 @@
 <?php
-
 /**
- * Image map extension.
+ * Main file for extension ImageMap.
+ *
+ * @file
+ * @ingroup Extensions
  *
  * Syntax:
  * <imagemap>
diff --git a/extensions/InputBox/InputBox.i18n.php b/extensions/InputBox/InputBox.i18n.php
index c4a27d40..0d05d036 100644
--- a/extensions/InputBox/InputBox.i18n.php
+++ b/extensions/InputBox/InputBox.i18n.php
@@ -40,8 +40,8 @@ $messages['qqq'] = array(
 See also:
 * {{msg-mw|Inputbox-error-bad-type}}',
 	'inputbox-error-bad-type' => '{{doc-important|"create", "comment", "search", "search2" and "fulltext" should not be translated.}}
-Used as error message.
-
+Used as error message. Parameters:
+* $1 - invalid type. Valid types are: "create", "comment", "commenttitle", "search", "fulltext", and "search2"
 See also:
 * {{msg-mw|Inputbox-error-no-type}}',
 	'tryexact' => 'Part of the "Inputbox" extension. This message is the text of the button to search the page you typed in the inputbox. If the page with the exact name exists, you will go directly to that page.',
@@ -51,8 +51,10 @@ See also:
 * {{msg-mw|Search}}
 * {{msg-mw|Accesskey-search-fulltext}}
 * {{msg-mw|Tooltip-search-fulltext}}',
-	'createarticle' => 'Part of the "Inputbox" extension. This message is the text of the button to create the page you typed in the inputbox.',
-	'inputbox-ns-main' => 'Probably refers to the main namespace.',
+	'createarticle' => 'Part of the "Inputbox" extension. This message is the text of the button to create the page you typed in the inputbox.
+{{Identical|Create page}}',
+	'inputbox-ns-main' => 'Probably refers to the main namespace.
+{{Identical|Main}}',
 );
 
 /** Afrikaans (Afrikaans)
@@ -127,7 +129,7 @@ $messages['arz'] = array(
 	'createarticle' => 'إنشاء صفحة',
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Bishnu Saikia
  * @author Chaipau
  * @author Gitartha.bordoloi
@@ -206,6 +208,21 @@ $messages['bcc'] = array(
 	'createarticle' => 'شرکتن صفحه',
 );
 
+/** Bikol Central (Bikol Central)
+ * @author Filipinayzd
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+	'inputbox-desc' => 'Minatugot na balihon an pangenot na pakahulugan kan mga porma nin HTML',
+	'inputbox-error-no-type' => 'Ika dae nagsasambit kan tipo nin palaogang kahon tanganing maimukna.',
+	'inputbox-error-bad-type' => 'An tipo kan palaogang kahon na "$1" bakong rekonosido.
+Pakisambit tabi an "magmukna", "komento", "hanapa" "hanapa2" o an "kabilogang teksto".',
+	'tryexact' => 'Prubaran an eksaktong katampadan',
+	'searchfulltext' => 'Hanapa an kabilogang teksto',
+	'createarticle' => 'Muknaon an pahina',
+	'inputbox-ns-main' => 'Kapamayuhanan',
+);
+
 /** Belarusian (беларуская)
  */
 $messages['be'] = array(
@@ -327,16 +344,21 @@ Especifiqueu-hi «create», «comment», «search», «search2» o «fulltext».
 );
 
 /** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄)
+ * @author Yejianfei
  */
 $messages['cdo'] = array(
-	'createarticle' => 'Kŭi hiĕk',
+	'createarticle' => '開頁',
 );
 
 /** Chechen (нохчийн)
  * @author Sasan700
+ * @author Умар
  */
 $messages['ce'] = array(
+	'inputbox-error-no-type' => 'Ахьа язъечу меттиган тайп билгала йина яц.',
 	'tryexact' => 'Леррина лахар',
+	'searchfulltext' => 'Дуьззина йозанца лахар',
+	'createarticle' => 'Яззам кхоллар',
 );
 
 /** Sorani Kurdish (کوردی)
@@ -658,8 +680,8 @@ $messages['frr'] = array(
 	'inputbox-desc' => 'Föörformatiaret HTML-fialen tuläät',
 	'inputbox-error-no-type' => 'Dü heest ei uunden, hün slach faan fial iinracht wurd skal.',
 	'inputbox-error-bad-type' => 'Di slach „$1“ as ei tuläät. Wees so gud an nem „create“, „comment“, „search“, „search2“ of „fulltext“.',
-	'tryexact' => 'Sjük genau',
-	'searchfulltext' => 'Sjük uun di hialer tekst',
+	'tryexact' => 'Schük genau',
+	'searchfulltext' => 'Schük uun di hialer tekst',
 	'createarticle' => 'Maage en nei sidj',
 	'inputbox-ns-main' => 'Sidjen',
 );
@@ -759,7 +781,7 @@ $messages['gv'] = array(
 	'createarticle' => 'Croo duillag',
 );
 
-/** Hakka (Hak-kâ-fa)
+/** Hakka (客家語/Hak-kâ-ngî)
  * @author Hakka
  */
 $messages['hak'] = array(
@@ -928,14 +950,14 @@ $messages['ig'] = array(
  * @author Lam-ang
  */
 $messages['ilo'] = array(
-	'inputbox-desc' => 'Pakabaelan na nga agikabil kadagiti napalasin a kinabuklan ti HTML',
-	'inputbox-error-no-type' => 'Saan mo pay nga imbaga no ania a kita ti pagikabilan a kahon ti aramiden.',
-	'inputbox-error-bad-type' => 'Ti kita ti pigikabilan a kahon "$1" ket saan a ma-ammoan.
-Pangaasi ta ibagam nga "agaramid", "komentario", "biruken", "biruken2", "wenno sibubukel a testo".',
+	'inputbox-desc' => 'Mangipalubos ti panangiraman kadagiti nasakbayan a naipalawag a porma ti HTML',
+	'inputbox-error-no-type' => 'Saanmo pay a nainaganan no ania a kita ti partuaten a kahon ti pagikabilan.',
+	'inputbox-error-bad-type' => 'Ti kita ti kahon a pigikabilan ti "$1" ket saan a mabigbigan.
+Pangngaasi nga inaganam ti "agpartuat", "komento", "biruken", "biruken2", "wenno sibubukel a testo".',
 	'tryexact' => 'Padasem to pudno a kapada',
-	'searchfulltext' => 'Agbiruk ti sibubukel a testo',
-	'createarticle' => 'Agaramid ti panid',
-	'inputbox-ns-main' => 'Dati',
+	'searchfulltext' => 'Agbiruk ti napno a testo',
+	'createarticle' => 'Agpartuat ti panid',
+	'inputbox-ns-main' => 'Nangruna',
 );
 
 /** Ido (Ido)
@@ -1095,13 +1117,14 @@ $messages['km'] = array(
  * @author Klutzy
  * @author Kwj2772
  * @author ToePeu
+ * @author 아라
  */
 $messages['ko'] = array(
-	'inputbox-desc' => '사전 정의된 HTML 폼을 포함할 수 있게 해 줌',
-	'inputbox-error-no-type' => 'type 속성을 정하지 않았습니다.',
-	'inputbox-error-bad-type' => '"$1"은(는) 사용할 수 없는 type 속성입니다.
-"create", "comment", "search", "search2", "fulltext" 중 하나를 사용하세요.',
-	'tryexact' => '정확한 이름으로 찾기',
+	'inputbox-desc' => '사전 정의된 HTML 양식을 포함할 수 있습니다',
+	'inputbox-error-no-type' => '만드려는 입력 상자의 종류를 지정하지 않았습니다.',
+	'inputbox-error-bad-type' => '"$1" 입력 상자 종류는 정의되어 있지 않습니다.
+"create", "comment", "search", "search2"나 "fulltext" 중 하나를 지정하세요.',
+	'tryexact' => '일치하는 항목 찾기',
 	'searchfulltext' => '전체 글 검색',
 	'createarticle' => '문서 만들기',
 	'inputbox-ns-main' => '문서',
@@ -1208,6 +1231,14 @@ $messages['lo'] = array(
 	'createarticle' => 'ສ້າງບົດຄວາມ',
 );
 
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+	'createarticle' => 'راس كردن بلگه',
+	'inputbox-ns-main' => 'اصلی',
+);
+
 /** Lithuanian (lietuvių)
  * @author Vogone
  */
@@ -1318,7 +1349,7 @@ $messages['mn'] = array(
  */
 $messages['mr'] = array(
 	'inputbox-desc' => 'पूर्वी लिहिलेले HTML अर्ज वापरण्याची परवानगी द्या',
-	'inputbox-error-no-type' => 'तुम्ही कुठल्या प्रकारची पृष्ठपेटी तयार करायची ते स्पष्ट केलेले नाही.',
+	'inputbox-error-no-type' => 'कुठल्या प्रकारची पृष्ठपेटी तयार करायची ते तुम्ही स्पष्ट केलेले नाही.',
 	'inputbox-error-bad-type' => 'तुम्ही दिलेला पृष्ठपेटीचा "$1" हा प्रकार ओळखीचा नाही. 
 कृपया "create", "comment", "search" किंवा "search2"  किंवा "fulltext".यातील एक निवडा.',
 	'tryexact' => 'दिलेलेच शब्द शोधा',
@@ -1385,7 +1416,7 @@ $messages['nan'] = array(
 	'searchfulltext' => 'Chhiau choan-bûn',
 );
 
-/** Neapolitan (Nnapulitano)
+/** Neapolitan (Napulitano)
  * @author Chelin
  * @author SabineCretella
  */
@@ -1394,7 +1425,7 @@ $messages['nap'] = array(
 	'createarticle' => 'Cria paggena',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author EivindJ
  */
 $messages['nb'] = array(
@@ -1421,7 +1452,7 @@ Geev een vun disse Typen an: „create“, „comment“, „search“, „searc
 	'createarticle' => 'Siet anleggen',
 );
 
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
  * @author Servien
  */
 $messages['nds-nl'] = array(
@@ -1465,7 +1496,7 @@ $messages['nl-informal'] = array(
 	'inputbox-error-no-type' => 'Je hebt het type invoerveld niet opgegeven.',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Frokor
  * @author Harald Khan
  * @author Njardarlogar
@@ -1508,7 +1539,7 @@ Indicatz una opcion demest ''create'', ''comment'', ''search'' o ''searche2'' o
 	'inputbox-ns-main' => 'Principal',
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Odisha1
  * @author Psubhashish
  */
@@ -2060,10 +2091,11 @@ $messages['ts'] = array(
 );
 
 /** Tuvinian (тыва дыл)
+ * @author Agilight
  * @author Sborsody
  */
 $messages['tyv'] = array(
-	'createarticle' => 'Арынны чаяары',
+	'createarticle' => 'Арын чаяар',
 	'inputbox-ns-main' => 'Кол',
 );
 
diff --git a/extensions/Interwiki/Interwiki.alias.php b/extensions/Interwiki/Interwiki.alias.php
index 44e5b225..30098f05 100644
--- a/extensions/Interwiki/Interwiki.alias.php
+++ b/extensions/Interwiki/Interwiki.alias.php
@@ -5,6 +5,7 @@
  * @file
  * @ingroup Extensions
  */
+// @codingStandardsIgnoreFile
 
 $specialPageAliases = array();
 
@@ -43,6 +44,16 @@ $specialPageAliases['bs'] = array(
 	'Interwiki' => array( 'Medjuwiki' ),
 );
 
+/** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄) */
+$specialPageAliases['cdo'] = array(
+	'Interwiki' => array( '跨維基' ),
+);
+
+/** Chechen (нохчийн) */
+$specialPageAliases['ce'] = array(
+	'Interwiki' => array( 'Юкъарвики' ),
+);
+
 /** German (Deutsch) */
 $specialPageAliases['de'] = array(
 	'Interwiki' => array( 'Interwikitabelle', 'Interwiki-Tabelle' ),
diff --git a/extensions/Interwiki/Interwiki.i18n.php b/extensions/Interwiki/Interwiki.i18n.php
index efd2b11d..8b9c85a0 100644
--- a/extensions/Interwiki/Interwiki.i18n.php
+++ b/extensions/Interwiki/Interwiki.i18n.php
@@ -123,39 +123,43 @@ Used when the user has no right to edit the interwiki data and can only view the
 	'interwiki-legend-hide' => 'Link text for toggle to hide the legend on [[Special:Interwiki]].',
 	'interwiki_prefix' => 'Used on [[Special:Interwiki]] as a column header of the table.',
 	'interwiki-prefix-label' => 'Used on [[Special:Interwiki]] as a field label in a form.',
-	'interwiki_prefix_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|interwiki_prefix}} column of the table.
+	'interwiki_prefix_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|Interwiki prefix}} column of the table.
+
 Do translate both words inside the square brackets as placeholders, where "prefix" should be identical to, or clearly linked to, the column header.',
 	'interwiki_url' => '{{optional}}
 Used on [[Special:Interwiki]] as a column header of the table.
 
-See also: {{msg-mw|Interwiki-url-label}}',
+See also:
+*{{msg-mw|Interwiki-url-label}}
+{{Identical|URL}}',
 	'interwiki-url-label' => '{{optional}}
 Used on [[Special:Interwiki]] as a field label in a form.
 
-See also: {{msg-mw|interwiki url}}',
-	'interwiki_url_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|interwiki_url}} column of the table.
+See also:
+* {{msg-mw|interwiki url}}
+{{Identical|URL}}',
+	'interwiki_url_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|Interwiki url}} column of the table.
 
-$1 is being rendered verbatim. It refers to the syntax of the values listed in the "prefix" column, and does not mark a substitutable variable of this message.',
+Parameters:
+* $1 is being rendered verbatim. It refers to the syntax of the values listed in the "prefix" column, and does not mark a substitutable variable of this message.',
 	'interwiki_local' => 'Used on [[Special:Interwiki]] as a column header.
 
 {{Identical|Forward}}',
 	'interwiki-local-label' => 'Field label for the interwiki property "local", to set if an HTTP request to the local wiki with this interwiki prefix in the URL is redirected to the target URL given in the interwiki link definitions.',
-	'interwiki_local_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|interwiki_local}} column of the table.',
-	'interwiki_local_0_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 0 in the {{msg-mw|interwiki_local}} column of the table.',
-	'interwiki_local_1_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 1 in the {{msg-mw|interwiki_local}} column of the table.',
+	'interwiki_local_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|Interwiki local}} column of the table.',
+	'interwiki_local_0_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 0 in the {{msg-mw|Interwiki local}} column of the table.',
+	'interwiki_local_1_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 1 in the {{msg-mw|Interwiki local}} column of the table.',
 	'interwiki_trans' => 'Used on [[Special:Interwiki]] as table column header.',
 	'interwiki-trans-label' => 'Used on [[Special:Interwiki]] as a field label in a form.',
-	'interwiki_trans_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|interwiki_trans}} column of the table.',
-	'interwiki_trans_1_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 1 in the {{msg-mw|interwiki_trans}} column of the table.',
-	'interwiki_trans_0_intro' => 'Used on [[Special:Interwiki]] so as to describe the meaning of the value 0 in the {{msg-mw|interwiki_trans}} column of the table.',
+	'interwiki_trans_intro' => 'Used on [[Special:Interwiki]] so as to explain the data in the {{msg-mw|Interwiki trans}} column of the table.',
+	'interwiki_trans_1_intro' => 'Used on [[Special:Interwiki]] so as to descripe the meaning of the value 1 in the {{msg-mw|Interwiki trans}} column of the table.',
+	'interwiki_trans_0_intro' => 'Used on [[Special:Interwiki]] so as to describe the meaning of the value 0 in the {{msg-mw|Interwiki trans}} column of the table.',
 	'interwiki_intro_footer' => 'Part of the interwiki extension.
-Shown as last pice of the introductory text on [[Special:Interwiki]].
-Parameter $1 contains the following (a link): [[mw:Manual:Interwiki_table|MediaWiki.org]]',
-	'interwiki_1' => "'''Yes'''-value to be inserted into the columns headed by {{msg-mw|interwiki_local}} and {{msg-mw|interwiki_trans}}.
 
+Shown as last piece of the introductory text on [[Special:Interwiki]].',
+	'interwiki_1' => "'''Yes'''-value to be inserted into the columns headed by {{msg-mw|Interwiki local}} and {{msg-mw|Interwiki trans}}.
 {{Identical|Yes}}",
-	'interwiki_0' => "'''No'''-value to be inserted into the columns headed by {{msg-mw|interwiki_local}} and {{msg-mw|interwiki_trans}}.
-
+	'interwiki_0' => "'''No'''-value to be inserted into the columns headed by {{msg-mw|Interwiki local}} and {{msg-mw|Interwiki trans}}.
 {{Identical|No}}",
 	'interwiki_error' => 'This error message is shown when the [[Special:Interwiki]] page is empty.',
 	'interwiki-cached' => 'Informational message on why interwiki data cannot be manipulated.',
@@ -163,9 +167,16 @@ Parameter $1 contains the following (a link): [[mw:Manual:Interwiki_table|MediaW
 
 {{Identical|Edit}}',
 	'interwiki_reasonfield' => '{{Identical|Reason}}',
-	'interwiki_delquestion' => 'Parameter $1 is the interwiki prefix you are deleting.',
-	'interwiki_deleting' => '-',
-	'interwiki_deleted' => '',
+	'interwiki_delquestion' => 'Used as top message.
+
+Followed by the form.
+
+Parameters:
+* $1 - the interwiki prefix you are deleting',
+	'interwiki_deleting' => 'Used as intro message for the table. Parameters:
+* $1 - the specified prefix',
+	'interwiki_deleted' => 'Used as success message. Parameters:
+* $1 - interwiki prefix',
 	'interwiki_delfailed' => 'Error message when removing an interwiki table entry fails. Parameters:
 * $1 is an interwiki prefix.',
 	'interwiki_addtext' => 'Link description to open form to add an interwiki prefix.',
@@ -177,12 +188,17 @@ Parameter $1 contains the following (a link): [[mw:Manual:Interwiki_table|MediaW
 * $1 is the added interwiki prefix.',
 	'interwiki_addfailed' => 'Error message displayed when adding an interwiki prefix fails. Parameters:
 * $1 is the interwiki prefix that could not be added.',
-	'interwiki-defaulturl' => '{{notranslate}}',
+	'interwiki-defaulturl' => '{{notranslate}}
+Used as default value of interwiki URL
+
+Parameters:
+* $1 - seems to be empty',
 	'interwiki_edittext' => 'Fieldset legend for interwiki prefix edit form.',
 	'interwiki_editintro' => 'Form information when editing an interwiki prefix.',
 	'interwiki_edited' => 'Success message after editing an interwiki prefix. Parameters:
 * $1 is the added interwiki prefix.',
-	'interwiki_editerror' => 'Error message when modifying a prefix has failed.',
+	'interwiki_editerror' => 'Error message when modifying a prefix has failed. Parameters:
+* $1 - prefix',
 	'interwiki-badprefix' => 'Error message displayed when trying to save an interwiki prefix that contains invalid characters. Parameters:
 * $1 is the interwiki prefix containing invalid characters.',
 	'interwiki-submit-empty' => 'Error message displayed when trying to save an interwiki prefix with an empty prefix or an empty URL.',
@@ -294,6 +310,7 @@ $messages['an'] = array(
 /** Arabic (العربية)
  * @author Meno25
  * @author OsamaK
+ * @author زكريا
  */
 $messages['ar'] = array(
 	'interwiki' => 'عرض وتعديل بيانات الإنترويكي',
@@ -321,7 +338,7 @@ $messages['ar'] = array(
 	'interwiki_1' => 'نعم',
 	'interwiki_0' => 'لا',
 	'interwiki_error' => 'خطأ: جدول الإنترويكي فارغ، أو حدث خطأ آخر.',
-	'interwiki_edit' => 'تعديل',
+	'interwiki_edit' => 'عدل',
 	'interwiki_reasonfield' => 'السبب:',
 	'interwiki_delquestion' => 'حذف "$1"',
 	'interwiki_deleting' => 'أنت تحذف البادئة "$1".',
@@ -416,7 +433,7 @@ $messages['arz'] = array(
 	'action-interwiki' => 'تغيير مدخلة الإنترويكى هذه',
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Bishnu Saikia
  */
 $messages['as'] = array(
@@ -711,9 +728,11 @@ $messages['bg'] = array(
 );
 
 /** Bengali (বাংলা)
+ * @author Aftab1995
  * @author Wikitanvir
  */
 $messages['bn'] = array(
+	'interwiki-title-norights' => 'আন্তঃউইকি তথ্য দেখুন',
 	'interwiki_prefix' => 'উপসর্গ',
 	'interwiki-prefix-label' => 'উপসর্গ:',
 	'interwiki_1' => 'হ্যাঁ',
@@ -911,8 +930,28 @@ Possiblement no existeix.',
  * @author Умар
  */
 $messages['ce'] = array(
+	'interwiki-title-norights' => 'Юкъарвикишан хаамаш хьажар',
+	'interwiki_intro' => 'ХӀара ду юкъарвикишан таблице хьажар.',
+	'interwiki-legend-show' => 'Гайта хьехар',
+	'interwiki-legend-hide' => 'Къайладаккха хьехар',
+	'interwiki_prefix' => 'ТӀетоьхна элпаш',
+	'interwiki_prefix_intro' => 'Юкъарвикин дешхьалхе вики-йозана синтаксисехь лело: <code>[<nowiki />[дешхьалхе:<em>агӀона цӀе</em>]]</code>.',
+	'interwiki_url_intro' => 'URLлан кеп. $1 метта хира ю <em>агӀона цӀе</em>, Лакхара синтаксис лелачу хенахь гайтина йолу.',
+	'interwiki_local' => 'ДӀасхьажор',
+	'interwiki-local-label' => 'ДӀасхьажор:',
+	'interwiki_local_intro' => 'HTTP-дехар кхузара википедига юкъарвики-дешхьалхеца URL чохь:',
+	'interwiki_local_0_intro' => 'магийна яц, хаамо блоктуху «агӀо цакарий»',
+	'interwiki_local_1_intro' => 'дӀасхьахьажа йо Ӏалашонан URL, юкъарвики-хьажораш билгал еш язйина йолу (кеч йо локальни агӀона хьажораг сана)',
+	'interwiki_trans' => 'Юкъатохар',
+	'interwiki-trans-label' => 'Юкъатохар:',
+	'interwiki_trans_intro' => 'Вики-йозана синтаксис лелош елахь <code>{<nowiki />{дешхьалхе:<em>агӀона цӀе</em>}}</code> тайпана:',
+	'interwiki_trans_1_intro' => 'Кхечу вики чура юкъарвикеш чуяха йиш хуьлуьйту хӀокху вики чохь магийна делахь.',
+	'interwiki_trans_0_intro' => 'ТӀетоха магийна дац, кепийн цӀерийн меттигехь агӀо лоху.',
+	'interwiki_1' => 'ю',
+	'interwiki_0' => 'яц',
 	'interwiki_edit' => 'Нисйé',
 	'interwiki_reasonfield' => 'Бахьан:',
+	'interwiki_delquestion' => '«$1» дӀаяккхар',
 	'interwiki_addbutton' => 'Тlетоха',
 );
 
@@ -996,7 +1035,9 @@ Pravděpodobně neexistuje.',
  * @author ОйЛ
  */
 $messages['cu'] = array(
-	'interwiki_0' => 'нѣ́тъ',
+	'interwiki_1' => 'да',
+	'interwiki_0' => 'нѣтъ',
+	'interwiki_edit' => 'исправи',
 );
 
 /** Welsh (Cymraeg)
@@ -1046,8 +1087,8 @@ $messages['da'] = array(
 	'interwiki-legend-hide' => 'Skjul forklaring',
 	'interwiki_prefix' => 'Præfiks',
 	'interwiki-prefix-label' => 'Præfiks:',
-	'interwiki_prefix_intro' => 'Interwiki præfiks som skal anvendes i <code>[<nowiki />[præfiks:<em>sidenavn</em>]]</code> wikitext syntaks.',
-	'interwiki_url_intro' => 'Skabelon til URL-adresser. Pladsholderen $1 vil blive erstattet af <em>sidenavn</em> af wikitext, når den ovennævnte wikitext syntaks bruges.',
+	'interwiki_prefix_intro' => 'Interwiki præfiks som skal anvendes i <code>[<nowiki />[præfiks:<em>sidenavn</em>]]</code> wikitekst syntaks.',
+	'interwiki_url_intro' => 'Skabelon til URL-adresser. Pladsholderen $1 vil blive erstattet af <em>sidenavn</em> af wikitekst, når den ovennævnte wikitekst syntaks bruges.',
 	'interwiki_local' => 'Videresend',
 	'interwiki-local-label' => 'Videresend:',
 	'interwiki_local_intro' => 'En HTTP-forespørgsel til den lokale wiki med denne interwiki præfiks i URL-adressen er:',
@@ -1055,7 +1096,7 @@ $messages['da'] = array(
 	'interwiki_local_1_intro' => 'Omdirigeret til target URL i interwiki link definitioner (dvs. behandles som referencer i lokale sider).',
 	'interwiki_trans' => 'Transkluder',
 	'interwiki-trans-label' => 'Transkluder:',
-	'interwiki_trans_intro' => 'Hvis wikitext syntaksen <code>[<nowiki />[præfiks:<em>sidenavn</em>]]</code> bruges, så:',
+	'interwiki_trans_intro' => 'Hvis wikitekst syntaksen <code>[<nowiki />[præfiks:<em>sidenavn</em>]]</code> bruges, så:',
 	'interwiki_1' => 'ja',
 	'interwiki_0' => 'nej',
 	'interwiki_error' => 'Fejl: Interwikitabellen er tom eller noget andet gik galt.',
@@ -1081,12 +1122,13 @@ Husk, at dette kan bryde eksisterende hyperlinks.',
 Det findes muligvis ikke.',
 	'interwiki-badprefix' => 'Det angivne interwikipræfiks "$1" indeholder ugyldige tegn.',
 	'right-interwiki' => 'Redigere interwikidata',
-	'action-interwiki' => 'ændre dette interwiki-element',
+	'action-interwiki' => 'redigere interwikidata',
 );
 
 /** German (Deutsch)
  * @author Als-Holder
  * @author Church of emacs
+ * @author Geitost
  * @author Kghbln
  * @author MF-Warburg
  * @author Metalhead64
@@ -1115,7 +1157,7 @@ $messages['de'] = array(
 	'interwiki_trans_intro' => 'Wenn die Vorlagensyntax <code>{<nowiki />{präfix:<em>Seitenname</em>}}</code> verwendet wird, dann:',
 	'interwiki_trans_1_intro' => 'erlaube die Einbindung aus dem fremden Wiki, sofern Einbindungen in diesem Wiki allgemein zulässig sind',
 	'interwiki_trans_0_intro' => 'erlaube die Einbindung nicht, und nimm eine Seite aus dem Vorlagennamensraum des lokalen Wikis',
-	'interwiki_intro_footer' => 'Siehe auch die [//www.mediawiki.org/wiki/Manual:Interwiki_table Dokumentationsseite auf MediaWiki.org] für weitere Informationen zur Interwikitabelle. Das [[Special:Log/interwiki|Logbuch]] protokolliert alle Änderungen an der Interwikitabelle dieses Wikis.',
+	'interwiki_intro_footer' => 'Weitere Informationen zur Interwikitabelle sind auf der [//www.mediawiki.org/wiki/Manual:Interwiki_table Dokumentationsseite unter MediaWiki.org] zu finden. Das [[Special:Log/interwiki|Logbuch]] protokolliert alle Änderungen an der Interwikitabelle dieses Wikis.',
 	'interwiki_1' => 'ja',
 	'interwiki_0' => 'nein',
 	'interwiki_error' => 'Fehler: Die Interwikitabelle ist leer oder etwas anderes ist schiefgelaufen.',
@@ -1494,10 +1536,22 @@ Võimalik, et seda pole olemas.',
 /** Basque (euskara)
  * @author An13sa
  * @author Kobazulo
+ * @author Theklan
  */
 $messages['eu'] = array(
+	'interwiki' => 'Ikusi eta aldatu interwikiak',
+	'interwiki-title-norights' => 'Ikusi interwikiak',
+	'interwiki-desc' => 'Interwiki taula ikusi eta aldatzeko [[Special:Interwiki|orrialde berezi]] bat gehitzen du',
+	'interwiki_intro' => 'Hau interwiki taularen ikuspegi orokor bat da.',
+	'interwiki-legend-show' => 'Erakutsi legenda',
+	'interwiki-legend-hide' => 'Izkutatu legenda',
 	'interwiki_prefix' => 'Aurrizkia',
 	'interwiki-prefix-label' => 'Aurrizkia:',
+	'interwiki_local' => 'Aurrera',
+	'interwiki-local-label' => 'Aurrera:',
+	'interwiki_trans' => 'Txertatu',
+	'interwiki-trans-label' => 'Txertatu:',
+	'interwiki_trans_intro' => '<code>{<nowiki />{prefix:<em>pagename</em>}}</code> wikitestu erako sintaxia erabiltzen bada, orduan:',
 	'interwiki_1' => 'bai',
 	'interwiki_0' => 'ez',
 	'interwiki_edit' => 'Aldatu',
@@ -1506,6 +1560,8 @@ $messages['eu'] = array(
 	'interwiki_deleting' => '"$1" aurrizkia ezabatzen ari zara.',
 	'interwiki_addbutton' => 'Gehitu',
 	'interwiki_edittext' => 'Interwiki aurrizkia editatzen',
+	'right-interwiki' => 'Interwiki datuak aldatu',
+	'action-interwiki' => 'aldatu interwiki sarrera hau',
 );
 
 /** Persian (فارسی)
@@ -1549,7 +1605,7 @@ $messages['fa'] = array(
 	'interwiki_edited' => 'پیشوند «$1» با موفقیت در جدول میان‌ویکی تغییر داده شد.',
 	'interwiki_editerror' => 'پیشوند «$1» را نمی‌توان در جدول میان‌ویکی تغییر داد.
 احتمالاً این پیشوند وجود ندارد.',
-	'interwiki-badprefix' => 'پیشوند میان‌ویکی «$1» حاوی نویسه‌های غیر مجاز است',
+	'interwiki-badprefix' => 'پیشوند میان‌ویکی «$1» حاوی نویسه‌های نامجاز است',
 	'interwiki-submit-empty' => 'پیشوند و آدرس URL نمی‌توانند خالی باشند.',
 	'log-name-interwiki' => 'سیاههٔ جدول میان‌ویکی',
 	'log-description-interwiki' => 'این یک تاریخچه از تغییرات [[Special:Interwiki|interwiki table]] است.',
@@ -1563,6 +1619,7 @@ $messages['fa'] = array(
  * @author Jack Phoenix
  * @author Mobe
  * @author Nike
+ * @author Stryn
  * @author VezonThunder
  */
 $messages['fi'] = array(
@@ -1577,7 +1634,7 @@ $messages['fi'] = array(
 	'interwiki_local' => 'Välitä',
 	'interwiki-local-label' => 'Välitä:',
 	'interwiki_trans' => 'Sisällytä',
-	'interwiki-trans-label' => 'Sisällytä:', # Fuzzy
+	'interwiki-trans-label' => 'Sisällytä:',
 	'interwiki_1' => 'kyllä',
 	'interwiki_0' => 'ei',
 	'interwiki_error' => 'Virhe: Interwiki-taulu on tyhjä tai jokin muu meni pieleen.',
@@ -1703,6 +1760,13 @@ $messages['frp'] = array(
 	'action-interwiki' => 'changiér ceta entrâ entèrvouiqui',
 );
 
+/** Northern Frisian (Nordfriisk)
+ * @author Murma174
+ */
+$messages['frr'] = array(
+	'interwiki-title-norights' => 'Interwiki-dooten uunluke',
+);
+
 /** Friulian (furlan)
  * @author Klenje
  */
@@ -1992,35 +2056,66 @@ $messages['he'] = array(
 /** Hindi (हिन्दी)
  * @author Karthi.dr
  * @author Kaustubh
+ * @author Siddhartha Ghai
  */
 $messages['hi'] = array(
-	'interwiki' => 'आंतरविकि डाटा देखें एवं बदलें',
-	'interwiki-title-norights' => 'आंतरविकि डाटा देखें',
-	'interwiki-desc' => 'आंतरविकि तालिका देखनेके लिये और बदलने के लिये एक [[Special:Interwiki|विशेष पॄष्ठ]]',
-	'interwiki_intro' => 'आंतरविकि तालिका के बारें में अधिक ज़ानकारी के लिये [http://www.mediawiki.org/wiki/Interwiki_table MediaWiki.org] देखें। यहां आंतरविकि तालिका में हुए [[Special:Log/interwiki|बदलावों की सूची]] हैं।', # Fuzzy
-	'interwiki_prefix' => 'उपपद',
-	'interwiki-prefix-label' => 'उपपद:', # Fuzzy
+	'interwiki' => 'अंतरविकि डाटा देखें एवं बदलें',
+	'interwiki-title-norights' => 'अंतरविकि डाटा देखें',
+	'interwiki-desc' => 'अंतरविकि तालिका देखने और बदलने के लिये एक [[Special:Interwiki|विशेष पृष्ठ]] जोड़ता है',
+	'interwiki_intro' => 'यह अंतरविकि तालिका का मूल विवरण है।',
+	'interwiki-legend-show' => 'शीर्षक विवरण दिखाएँ',
+	'interwiki-legend-hide' => 'शीर्षक विवरण छुपाएँ',
+	'interwiki_prefix' => 'उपसर्ग',
+	'interwiki-prefix-label' => 'उपसर्ग:',
+	'interwiki_prefix_intro' => 'विकिपाठ सिंटेक्स <code>[<nowiki />[उपसर्ग:<em>पृष्ठनाम</em>]]में प्रयोग हेतु अंतरविकि उपसर्ग।',
+	'interwiki_url' => 'यू॰आर॰एल',
+	'interwiki-url-label' => 'यू॰आर॰एल:',
+	'interwiki_url_intro' => 'यू॰आर॰एल साँचा। जब उपरोक्त विकिपाठ सिंटेक्स का प्रयोग किया जाए तो $1 की जगह विकिपाठ में प्रयुक्त <em>पृष्ठनाम</em> लगा दिया जाएगा।',
+	'interwiki_local' => 'आगे भेजा जाता है',
+	'interwiki-local-label' => 'आगे भेजा जाता है:',
+	'interwiki_local_intro' => 'स्थानीय विकि में इस अंतरविकि उपसर्ग का प्रयोग कर रहे यू॰आर॰एल को:',
+	'interwiki_local_0_intro' => 'आगे नहीं भेजा जाता, सामान्यतः "पृष्ठ नहीं मिला" त्रुटि आती है',
+	'interwiki_local_1_intro' => 'अंतरविकि तालिका अनुसार यू॰आर॰एल पर आगे भेज दिया जाता है (अर्थात सामान्य विकि कड़ियों की तरह माना जाता है)।',
+	'interwiki_trans' => 'ट्रांसक्लूड',
+	'interwiki-trans-label' => 'ट्रांसक्लूड:',
+	'interwiki_trans_intro' => 'अगर <code>{<nowiki />{उपसर्ग:<em>पृष्ठनाम</em>}}</code> प्रकार के सिंटेक्स का प्रयोग किया जाए तो:',
+	'interwiki_trans_1_intro' => 'बाहरी विकि से ट्रांसक्लूज़न करने दिया जाएगा, यदि इस विकि में सामान्यतः अंतरविकि ट्रांसक्लूज़न समर्थित हैं।',
+	'interwiki_trans_0_intro' => 'ट्रांसक्लूज़न नहीं करने दिया जाएगा, बल्कि उस नाम के साँचे को ढूँढा जाएगा।',
+	'interwiki_intro_footer' => 'अंतरविकि तालिका के बारे में अधिक जानकारी हेतु [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] देखें।
+अंतरविकि तालिका में हुए [[Special:Log/interwiki|बदलावों का लॉग]] उपलब्ध है।',
 	'interwiki_1' => 'हाँ',
 	'interwiki_0' => 'नहीं',
-	'interwiki_error' => 'गलती: आंतरविकि तालिका खाली हैं, या और कुछ गलत हैं।',
+	'interwiki_error' => 'त्रुटि: आंतरविकि तालिका खाली है, या और कोई गड़बड़ी हुई है।',
+	'interwiki-cached' => 'अंतरविकि डाटा कैश मेमोरी में सहेजा हुआ है। कैश मेमोरी में बदलाव करना संभव नहीं है।',
 	'interwiki_edit' => 'सम्पादन',
 	'interwiki_reasonfield' => 'कारण:',
-	'interwiki_delquestion' => '$1 को हटा रहें हैं',
-	'interwiki_deleting' => 'आप "$1" उपपद हटा रहें हैं।',
-	'interwiki_deleted' => '"$1" उपपद आंतरविकि तालिकासे हटा दिया गया हैं।',
-	'interwiki_delfailed' => '"$1" उपपद आंतरविकि तालिकासे हटा नहीं पा रहें हैं।',
-	'interwiki_addtext' => 'एक आंतरविकि उपपद दें',
-	'interwiki_addintro' => 'आप एक नया आंतरविकि उपपद बढा रहें हैं। कृपया ध्यान रहें की इसमें स्पेस ( ), विसर्ग (:), और (&), या बराबर का चिन्ह (=) नहीम दे सकतें हैं।',
-	'interwiki_addbutton' => 'बढायें',
-	'interwiki_added' => '$1" उपपद आंतरविकि तालिका में बढाया गया हैं।',
-	'interwiki_addfailed' => '"$1" उपपद आंतरविकि तालिका में बढा नहीं पायें।
-शायद वह पहले से अस्तित्वमें हैं।',
-	'interwiki_edittext' => 'एक आंतरविकि उपपद बदल रहें हैं',
-	'interwiki_editintro' => 'आप एक आंतरविकि उपपद बदल रहें हैं। ध्यान रखें ये पहले दी हुई कड़ीयों को तोड सकता हैं।',
-	'interwiki_edited' => '"$1" उपपद आंतरविकि तालिका में बदला गया।',
-	'interwiki_editerror' => '"$1" उपपद आंतरविकि तालिका में बदल नहीं पायें। शायद वह अस्तित्वमें नहीं हैं।',
-	'log-name-interwiki' => 'आंतरविकि तालिका सूची',
-	'log-description-interwiki' => '[[Special:Interwiki|आंतरविकि तालिकामें]] हुए बदलावोंकी यह सूची है।',
+	'interwiki_delquestion' => '$1 को हटा रहे हैं',
+	'interwiki_deleting' => 'आप "$1" उपसर्ग हटा रहे हैं।',
+	'interwiki_deleted' => '"$1" उपसर्ग अंतरविकि तालिका से हटा दिया गया है।',
+	'interwiki_delfailed' => '"$1" उपसर्ग अंतरविकि तालिका से हटाया नहीं जा सका।',
+	'interwiki_addtext' => 'अंतरविकि उपसर्ग जोड़ें',
+	'interwiki_addintro' => 'आप एक नया आंतरविकि उपसर्ग जोड़ रहे हैं।
+कृपया ध्यान रखें कि इसमें स्पेस ( ), कोलन (:), ऐम्परसेंड (&), या बराबर का चिन्ह (=) नहीं हो सकते हैं।',
+	'interwiki_addbutton' => 'जोड़ें',
+	'interwiki_added' => '"$1" उपसर्ग अंतरविकि तालिका में जोड़ दिया गया है।',
+	'interwiki_addfailed' => '"$1" उपसर्ग अंतरविकि तालिका में जोड़ा नहीं जा सका।
+संभवतः वह पहले से अंतरविकि तालिका में मौजूद है।',
+	'interwiki_edittext' => 'अंतरविकि उपसर्ग बदल रहे हैं',
+	'interwiki_editintro' => 'आप एक अंतरविकि उपसर्ग बदल रहे हैं।
+ध्यान रखें ये पहले से प्रयुक्त कड़ियों को तोड़ सकता है।',
+	'interwiki_edited' => 'अंतरविकि तालिका में "$1" उपसर्ग बदला गया।',
+	'interwiki_editerror' => 'आंतरविकि तालिका में "$1" उपसर्ग बदला नहीं जा सका।
+शायद वह मौजूद नहीं है।',
+	'interwiki-badprefix' => 'निर्दिष्ट अंतरविकि उपसर्ग "$1" में अमान्य कैरेक्टर हैं',
+	'interwiki-submit-empty' => 'उपसर्ग और यू॰आर॰एल रिक्त नहीं छोड़े जा सकते।',
+	'interwiki-submit-invalidurl' => 'यू॰आर॰एल का प्रोटोकॉल अमान्य है।',
+	'log-name-interwiki' => 'अंतरविकि तालिका लॉग',
+	'logentry-interwiki-iw_add' => '$1 ने अंतरविकि तालिका में उपसर्ग "$4" ($5) (trans: $6; local: $7) {{GENDER:$2|जोड़ा}}',
+	'logentry-interwiki-iw_edit' => '$1 ने अंतरविकि तालिका में उपसर्ग "$4" ($5) (trans: $6; local: $7) {{GENDER:$2|बदला}}',
+	'logentry-interwiki-iw_delete' => '$1 ने अंतरविकि तालिका से उपसर्ग "$4" {{GENDER:$2|हटाया}}',
+	'log-description-interwiki' => 'यह [[Special:Interwiki|अंतरविकि तालिका]] में हुए बदलावों का लॉग है।',
+	'right-interwiki' => 'अंतरविकि डाटा सम्पादित करें',
+	'action-interwiki' => 'इस अंतरविकि प्रविष्टि को बदलने',
 );
 
 /** Hiligaynon (Ilonggo)
@@ -2290,6 +2385,7 @@ Memora que isto pote rumper ligamines existente.',
 Es possibile que illo non existe.',
 	'interwiki-badprefix' => 'Le prefixo interwiki specificate "$1" contine characteres invalide',
 	'interwiki-submit-empty' => 'Le prefixo e le URL non pote esser vacue.',
+	'interwiki-submit-invalidurl' => 'Le protocollo del URL es invalide.',
 	'log-name-interwiki' => 'Registro del tabella interwiki',
 	'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|addeva}} le prefixo "$4" ($5) (trans: $6; local: $7) al tabella interwiki',
 	'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|modificava}} le prefixo "$4" ($5) (trans: $6; local: $7) in le tabella interwiki',
@@ -2598,6 +2694,46 @@ $messages['ka'] = array(
 	'action-interwiki' => 'ინტერვიკის ჩანაწერების შეცვლა',
 );
 
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author Arystanbek
+ */
+$messages['kk-cyrl'] = array(
+	'interwiki' => 'интеруики деректерін қарау және өңдеу',
+	'interwiki-title-norights' => 'Интеруики дерегін қарау',
+	'interwiki_intro' => 'Бұл интеруики кестесін шолып шығу',
+	'interwiki-legend-show' => 'Мәндік белгілерді көрсету',
+	'interwiki-legend-hide' => 'Мәндік белгілерді жасыру',
+	'interwiki_prefix' => 'Префикс',
+	'interwiki-prefix-label' => 'Префикс',
+	'interwiki_local' => 'Алға',
+	'interwiki-local-label' => 'Алға',
+	'interwiki_1' => 'иә',
+	'interwiki_0' => 'жоқ',
+	'interwiki_edit' => 'Өңдеу',
+	'interwiki_reasonfield' => 'Себебі:',
+	'interwiki_delquestion' => '"$1" жойылуда',
+	'interwiki_deleting' => '"$1" префиксін жоюдасыз.',
+	'interwiki_deleted' => '"$1" префиксі интеруики кестесінен сәтті алынып тасталды.',
+	'interwiki_delfailed' => '"$1" префиксі интеруики кестесінен алынып тасталмады',
+	'interwiki_addtext' => 'Интеруики префиксін қосу',
+	'interwiki_addbutton' => 'Қосу',
+	'interwiki_added' => '"$1" префиксі интеруики кестесіне сәтті қосылды.',
+	'interwiki_addfailed' => '"$1" префиксі интеруики кестесіне қосылмады.
+Мүмкін әлдеқашан интеруики кестесінде қолданылған болар.',
+	'interwiki_edittext' => 'Интеруики префиксі өңделуде',
+	'interwiki_editintro' => 'Интеруики префиксін өңдеудесіз.
+Есіңізде болсын бұл бұрыннан бар сілтемелерді бұза алады.',
+	'interwiki_edited' => '"$1" префиксі интеруики кестесінде сәтті өзгертілді.',
+	'interwiki_editerror' => '"$1" префиксі интеруики кестесінде өзгеру мүмкін болмады.
+Мүмкін бұл бар болмаған шығар.',
+	'log-name-interwiki' => 'Интеруики кесте журналы',
+	'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|added}} "$4" префиксі интеруики кестесіне ($5) (trans: $6; local: $7)',
+	'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|modified}} "$4" ($5) интеруики кестесіне (trans: $6; local: $7)',
+	'logentry-interwiki-iw_delete' => 'Интеруики кестесінен "$4" префиксі $1 {{GENDER:$2|removed}}',
+	'right-interwiki' => 'Интеруики деректерін өңдеу',
+	'action-interwiki' => 'бұл интеруики ендірілуін өзгерту',
+);
+
 /** Khmer (ភាសាខ្មែរ)
  * @author Chhorran
  * @author Lovekhmer
@@ -2695,7 +2831,7 @@ $messages['ko'] = array(
 	'interwiki_delquestion' => '"$1" 지우기',
 	'interwiki_deleting' => '"$1" 접두어를 지웁니다.',
 	'interwiki_deleted' => '"$1" 접두어를 인터위키 테이블에서 지웠습니다.',
-	'interwiki_delfailed' => '"$1" 접두어를 인터위키 테이블에서 지울 수 없습니다.',
+	'interwiki_delfailed' => '"$1" 접두어를 인터위키 테이블에서 제거할 수 없습니다.',
 	'interwiki_addtext' => '인터위키 접두어 추가',
 	'interwiki_addintro' => '새 인터위키 접두어를 만듭니다. 공백( ), 쌍점(:), &기호(&), 등호(=)는 포함할 수 없습니다.',
 	'interwiki_addbutton' => '추가',
@@ -2715,7 +2851,7 @@ $messages['ko'] = array(
 	'logentry-interwiki-iw_add' => '$1 사용자가 "$4" ($5) (틀 포함: $6, 로컬: $7) 접두어를 인터위키 테이블에 {{GENDER:$2|추가}}했습니다.',
 	'logentry-interwiki-iw_edit' => '$1 사용자가 인터위키 테이블의 "$4" ($5) (틀 포함: $6, 로컬: $7) 접두어를 {{GENDER:$2|수정}}했습니다.',
 	'logentry-interwiki-iw_delete' => '$1 사용자가 인터위키 테이블의 "$4" 접두어를 {{GENDER:$2|삭제}}했습니다.',
-	'log-description-interwiki' => '[[Special:Interwiki|인터위키]] 목록의 바뀐 내역입니다.',
+	'log-description-interwiki' => '[[Special:Interwiki|인터위키 테이블]]이 바뀐 기록입니다.',
 	'right-interwiki' => '인터위키 목록 고치기',
 	'action-interwiki' => '이 인터위키 접두어 바꾸기',
 );
@@ -2829,12 +2965,13 @@ Fortasse nondum est in tabula intervica.',
  * @author Les Meloures
  * @author Purodha
  * @author Robby
+ * @author Soued031
  */
 $messages['lb'] = array(
 	'interwiki' => 'Interwiki-Date kucken a veränneren',
 	'interwiki-title-norights' => 'Interwiki-Date kucken',
 	'interwiki-desc' => "Setzt eng [[Special:Interwiki|Spezialsäit]] derbäi fir d'Interwiki-Tabell ze gesinn an z'änneren",
-	'interwiki_intro' => "Dëst ass en Iwwerbléck iwwert d'Interwiki-Tabell.",
+	'interwiki_intro' => "Dëst ass en Iwwerbléck iwwer d'Interwikitabell.",
 	'interwiki-legend-show' => 'Legend weisen',
 	'interwiki-legend-hide' => 'Legend verstoppen',
 	'interwiki_prefix' => 'Prefix',
@@ -2872,7 +3009,7 @@ Denkt drunn datt keng Espacen ( ), Et-commerciale (&), Gläichzeechen (=) a keng
 Méiglecherweis gëtt et e schn an der Interwiki-Tabell.',
 	'interwiki_edittext' => 'En interwiki Prefix änneren',
 	'interwiki_editintro' => 'Dir ännert en Interwiki Prefix.
-Denkt drun, datt dat kann dozou féieren datt Linken déi et scho gëtt net méi fonctionnéieren.',
+Denkt drun, datt dat kann dozou féieren datt Linken déi et scho gëtt net méi funktionéieren.',
 	'interwiki_edited' => 'De Prefix "$1" gouf an der Interwiki-Tabell geännert.',
 	'interwiki_editerror' => 'De Prefix "$1" kann an der Interwiki-Tabell net geännert ginn.
 Méiglecherweis gëtt et en net.',
@@ -3125,6 +3262,7 @@ $messages['ml'] = array(
 മിക്കവാറും അത് നിലവിലുണ്ടാകില്ല.',
 	'interwiki-badprefix' => 'നൽകിയ അന്തർവിക്കി പൂർവ്വാക്ഷരങ്ങൾ "$1" അസാധുവായ അക്ഷരങ്ങൾ ഉൾക്കൊള്ളുന്നു',
 	'interwiki-submit-empty' => 'പൂർവ്വാക്ഷരങ്ങളും യൂ.ആർ.എലും. ശൂന്യമായിരിക്കാൻ പാടില്ല.',
+	'interwiki-submit-invalidurl' => 'ചട്ടം സംബന്ധിച്ച യു.ആർ.എൽ. അസാധുവാണ്.',
 	'log-name-interwiki' => 'അന്തർവിക്കി പട്ടികയുടെ രേഖ',
 	'logentry-interwiki-iw_add' => 'അന്തർവിക്കി പട്ടികയിൽ നിന്നും "$4"  ($5) (ഉൾപ്പെടുത്തൽ: $6; പ്രാദേശികം: $7) എന്ന പൂർവ്വാക്ഷരങ്ങൾ $1 {{GENDER:$2|കൂട്ടിച്ചേർത്തു}}',
 	'logentry-interwiki-iw_edit' => 'അന്തർവിക്കി പട്ടികയിൽ നിന്നും "$4"  ($5) (ഉൾപ്പെടുത്തൽ: $6; പ്രാദേശികം: $7) എന്ന പൂർവ്വാക്ഷരങ്ങൾ $1 {{GENDER:$2|പുതുക്കി}}',
@@ -3146,11 +3284,12 @@ $messages['mn'] = array(
 
 /** Marathi (मराठी)
  * @author Kaustubh
+ * @author V.narsikar
  */
 $messages['mr'] = array(
 	'interwiki' => 'आंतरविकि डाटा पहा व संपादा',
 	'interwiki-title-norights' => 'अंतरविकि डाटा पहा',
-	'interwiki-desc' => 'आंतरविकि सारणी पाहण्यासाठी व संपादन्यासाठी एक [[Special:Interwiki|विशेष पान]] वाढविते',
+	'interwiki-desc' => 'आंतरविकि सारणी पाहण्यासाठी व संपादण्यासाठी एक [[Special:Interwiki|विशेष पान]] वाढविते',
 	'interwiki_intro' => 'आंतरविकि सारणी बद्दल अधिक माहीतीसाठी [http://www.mediawiki.org/wiki/Interwiki_table MediaWiki.org] पहा.', # Fuzzy
 	'interwiki_prefix' => 'उपपद (पूर्वप्रत्यय)',
 	'interwiki-prefix-label' => 'उपपद (पूर्वप्रत्यय):', # Fuzzy
@@ -3165,11 +3304,11 @@ $messages['mr'] = array(
 	'interwiki_addbutton' => 'वाढवा',
 	'interwiki_added' => '"$1" उपपद आंतरविकि सारणी मध्ये वाढविण्यात आलेले आहे.',
 	'interwiki_addfailed' => '"$1" उपपद आंतरविकि सारणी मध्ये वाढवू शकलेलो नाही. कदाचित ते अगोदरच अस्तित्वात असण्याची शक्यता आहे.',
-	'interwiki_edittext' => 'एक अंतरविकि उपपद संपादित आहे',
-	'interwiki_editintro' => 'तुम्ही एक अंतरविकि उपपद संपादित आहात.
+	'interwiki_edittext' => 'एक आंतरविकि उपपद संपादित आहे',
+	'interwiki_editintro' => 'तुम्ही एक आंतरविकि उपपद संपादित आहात.
 लक्षात ठेवा की यामुळे अगोदर दिलेले दुवे तुटू शकतात.',
-	'interwiki_edited' => 'अंतरविकि सारणीमध्ये "$1" उपपद यशस्वीरित्या बदलण्यात आलेले आहे.',
-	'interwiki_editerror' => 'अंतरविकि सारणीमध्ये "$1" उपपद बदलू शकत नाही.
+	'interwiki_edited' => 'आंतरविकि सारणीमध्ये "$1" उपपद यशस्वीरित्या बदलण्यात आलेले आहे.',
+	'interwiki_editerror' => 'आंतरविकि सारणीमध्ये "$1" उपपद बदलू शकत नाही.
 कदाचित ते अस्तित्वात नसेल.',
 	'log-name-interwiki' => 'आंतरविकि सारणी नोंद',
 	'log-description-interwiki' => '[[Special:Interwiki|आंतरविकि सारणीत]] झालेल्या बदलांची ही सूची आहे.',
@@ -3284,7 +3423,7 @@ $messages['nah'] = array(
 	'interwiki_addbutton' => 'Ticcētilīz',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Event
  * @author Nghtwlkr
  * @author Purodha
@@ -3367,10 +3506,23 @@ $messages['nds'] = array(
 	'action-interwiki' => 'dissen Indrag in de Interwiki-Tabell ännern',
 );
 
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
  * @author Servien
  */
 $messages['nds-nl'] = array(
+	'interwiki' => 'Interwikigegevens bekieken en wiezigen',
+	'interwiki-title-norights' => 'Interwikigegevens bekieken',
+	'interwiki-legend-show' => 'Legenda laoten zien',
+	'interwiki-legend-hide' => 'Legenda verbargen',
+	'interwiki_prefix' => 'Veurvoegsel',
+	'interwiki-prefix-label' => 'Veurvoegsel:',
+	'interwiki_local' => 'Veuruut',
+	'interwiki-local-label' => 'Veuruut:',
+	'interwiki_trans' => 'Transkluderen',
+	'interwiki-trans-label' => 'Transkluderen:',
+	'interwiki_edit' => 'Bewarken',
+	'interwiki_delquestion' => '"$1" vortdoon',
+	'interwiki_deleting' => 'Je bin veurvoegsel "$1" an t vortdoon.',
 	'interwiki_addbutton' => 'Derbie doon',
 );
 
@@ -3452,7 +3604,7 @@ Let op dat dit geen spaties ( ), dubbele punt (:), ampersands (&), of gelijkteke
 	'interwiki_editintro' => 'Je bent een interwikivoorvoegsel aan het bewerken. Let op dat dit bestaande koppelingen kan breken.',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Eirik
  * @author Gunnernett
  * @author Harald Khan
@@ -3583,7 +3735,7 @@ Benlèu i existís ja.',
 	'action-interwiki' => 'modificar aquesta entrada interwiki',
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Ansumang
  * @author Jnanaranjan Sahu
  * @author Psubhashish
@@ -3805,13 +3957,14 @@ $messages['ps'] = array(
 	'interwiki_0' => 'نه',
 	'interwiki_edit' => 'سمول',
 	'interwiki_reasonfield' => 'سبب:',
-	'interwiki_delquestion' => '"$1" د ړنګولو په حال کې دی...',
+	'interwiki_delquestion' => '"$1" د ړنگولو په حال کې دی...',
 	'interwiki_deleting' => 'تاسې د "$1" مختاړی ړنګوی.',
-	'interwiki_addbutton' => 'ورګډول',
+	'interwiki_addbutton' => 'ورگډول',
 );
 
 /** Portuguese (português)
  * @author Alchimista
+ * @author Cainamarques
  * @author Hamilton Abreu
  * @author Malafaya
  * @author Waldir
@@ -3843,7 +3996,7 @@ Existe um [[Special:Log/interwiki|registo de modificações]] à tabela de inter
 	'interwiki_1' => 'sim',
 	'interwiki_0' => 'não',
 	'interwiki_error' => 'ERRO: A tabela de interwikis está vazia, ou alguma outra coisa não correu bem.',
-	'interwiki-cached' => 'Os dados de interwikis são armazenados na cache. Não é possível modificar a cache.',
+	'interwiki-cached' => 'Os dados de interwikis são armazenados no cache. Não é possível modificar o cache.',
 	'interwiki_edit' => 'Editar',
 	'interwiki_reasonfield' => 'Motivo:',
 	'interwiki_delquestion' => 'A apagar "$1"',
@@ -3872,8 +4025,10 @@ Lembre-se que este não pode conter espaços ( ), dois-pontos (:), conjunções
 );
 
 /** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
  * @author Eduardo.mps
  * @author Giro720
+ * @author Luckas
  * @author Luckas Blade
  * @author 555
  */
@@ -3882,6 +4037,8 @@ $messages['pt-br'] = array(
 	'interwiki-title-norights' => 'Ver dados interwiki',
 	'interwiki-desc' => 'Adiciona uma [[Special:Interwiki|página especial]] para visualizar e editar a tabela de interwikis',
 	'interwiki_intro' => 'Esta é uma visão geral da tabela de interwikis.',
+	'interwiki-legend-show' => 'Exibir legenda',
+	'interwiki-legend-hide' => 'Ocultar legenda',
 	'interwiki_prefix' => 'Prefixo',
 	'interwiki-prefix-label' => 'Prefixo:',
 	'interwiki_prefix_intro' => 'Prefixo de interwiki a ser usado na sintaxe de wikitexto <code>[<nowiki />[prefix:<em>nome_página</em>]]</code>.',
@@ -3901,6 +4058,7 @@ Existe um [[Special:Log/interwiki|registro de modificações]] à tabela de inte
 	'interwiki_1' => 'sim',
 	'interwiki_0' => 'não',
 	'interwiki_error' => 'ERRO: A tabela de interwikis está vazia, ou alguma outra coisa não correu bem.',
+	'interwiki-cached' => 'Os dados dos interwikis são armazenados no cache. Não é possível modificar o cache.',
 	'interwiki_edit' => 'Editar',
 	'interwiki_reasonfield' => 'Motivo:',
 	'interwiki_delquestion' => 'Apagando "$1"',
@@ -3917,7 +4075,12 @@ Existe um [[Special:Log/interwiki|registro de modificações]] à tabela de inte
 	'interwiki_edited' => 'O prefixo "$1" foi modificado na tabela de interwikis com sucesso.',
 	'interwiki_editerror' => 'O prefixo "$1" não pode ser modificado na tabela de interwikis. Possivelmente, não existe.',
 	'interwiki-badprefix' => 'O prefixo interwiki "$1" contém caracteres inválidos',
+	'interwiki-submit-empty' => 'O prefixo e o URL não podem estar vazios.',
+	'interwiki-submit-invalidurl' => 'O protocolo do URL é inválido.',
 	'log-name-interwiki' => 'Registro da tabela de interwikis',
+	'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|adicionou}} o prefixo "$4" ($5) (trans: $6; local: $7) à tabela de interwikis',
+	'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|modificou}} o prefixo "$4" ($5) (trans: $6; local: $7) na tabela de interwikis',
+	'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|removeu}} o prefixo "$4" da tabela de interwikis',
 	'log-description-interwiki' => 'Este é um registro das alterações à [[Special:Interwiki|tabela de interwikis]].',
 	'right-interwiki' => 'Editar dados de interwiki',
 	'action-interwiki' => 'alterar esta entrada interwiki',
@@ -3960,6 +4123,10 @@ $messages['ro'] = array(
  * @author Joetaras
  */
 $messages['roa-tara'] = array(
+	'interwiki' => "'Ndruche e cange le date de le inderuicchi",
+	'interwiki-title-norights' => "'Ndruche le date de inderuicchi",
+	'interwiki-desc' => "Aggiunge 'na [[Special:Interwiki|pàgena speciale]] pe 'ndrucà e cangià 'a tabbelle de inderuicchi",
+	'interwiki_intro' => "Queste jè 'na panorameche d'a tabbelle de inderuicchi.",
 	'interwiki-legend-show' => "Fà vedè 'a leggende",
 	'interwiki-legend-hide' => "Scunne 'a leggende",
 	'interwiki_prefix' => 'Prefisse',
@@ -3975,6 +4142,8 @@ $messages['roa-tara'] = array(
 	'interwiki_deleting' => 'Tu ste scangille \'u prefisse "$1".',
 	'interwiki_addtext' => "Aggiunge 'nu prefisse inderuicchi",
 	'interwiki_addbutton' => 'Aggiunge',
+	'right-interwiki' => 'Cange le date de inderuicchi',
+	'action-interwiki' => 'cange sta vôsce de inderuicchi',
 );
 
 /** Russian (русский)
@@ -3985,6 +4154,7 @@ $messages['roa-tara'] = array(
  * @author KPu3uC B Poccuu
  * @author Kaganer
  * @author Lockal
+ * @author Putnik
  * @author Александр Сигачёв
  */
 $messages['ru'] = array(
@@ -4031,6 +4201,7 @@ $messages['ru'] = array(
 	'interwiki_editerror' => 'Префикс «$1» не может быть изменён в таблице интервики. Возможно, его там не существует.',
 	'interwiki-badprefix' => 'Указанный префикс интервики «$1» содержит недопустимые символы',
 	'interwiki-submit-empty' => 'Префикс и URL не могут быть пустыми.',
+	'interwiki-submit-invalidurl' => 'Протокол URL-адреса является недопустимым.',
 	'log-name-interwiki' => 'Журнал изменений таблицы интервики',
 	'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|добавил|добавила}} префикс «$4» ($5) (trans: $6; local: $7) в интервики-таблицу',
 	'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|изменил|изменила}} префикс «$4» ($5) (trans: $6; local: $7) в интервики-таблице',
@@ -4220,6 +4391,7 @@ Obsahuje [[Special:Log/interwiki|záznam zmien]] tabuľky interwiki.',
 
 /** Slovenian (slovenščina)
  * @author Dbc334
+ * @author Eleassar
  */
 $messages['sl'] = array(
 	'interwiki' => 'Ogled in urejanje podatkov interwiki',
@@ -4245,8 +4417,8 @@ $messages['sl'] = array(
 	'interwiki_deleted' => 'Predpona »$1« je bila uspešno odstranjena iz tabele interwiki.',
 	'interwiki_delfailed' => 'Predpone »$1« ni bilo mogoče odstraniti iz tabele interwiki.',
 	'interwiki_addtext' => 'Dodaj predpono interwiki',
-	'interwiki_addintro' => "Dodajate novo predpono interwiki.
-Pomnite, da ne sme vsebovati presledkov ( ), dvopičij (:), znakov ''in'' (&) ali enačajev (=).",
+	'interwiki_addintro' => "Dodajate novo medwikipredpono.
+Upoštevajte, da ne sme vsebovati presledkov ( ), dvopičij (:), znakov ''in'' (&) ali enačajev (=).",
 	'interwiki_addbutton' => 'Dodaj',
 	'interwiki_added' => 'Predpona »$1« je bila uspešno dodana v tabelo interwiki.',
 	'interwiki_addfailed' => 'Predpone »$1« ni mogoče dodati tabeli interwiki.
@@ -4266,6 +4438,7 @@ Morda ne obstaja.',
 );
 
 /** Serbian (Cyrillic script) (српски (ћирилица)‎)
+ * @author Milicevic01
  * @author Rancher
  * @author Sasa Stefanovic
  * @author Жељко Тодоровић
@@ -4307,13 +4480,14 @@ $messages['sr-ec'] = array(
 	'interwiki_editerror' => 'Префикс "$1" не може бити измењен у табели међувикија.
 Вероватно затшо што не постоји.',
 	'interwiki-badprefix' => 'Задати међувики префикс "$1" садржи недозвољене знакове',
-	'log-name-interwiki' => 'Историја табеле међувикија',
+	'log-name-interwiki' => 'Дневник табеле међувикија',
 	'log-description-interwiki' => 'Ово је историја измена [[Special:Interwiki|табеле међувикија]].',
 	'right-interwiki' => 'уређивање међувикија',
 );
 
 /** Serbian (Latin script) (srpski (latinica)‎)
  * @author Michaello
+ * @author Milicevic01
  * @author Жељко Тодоровић
  */
 $messages['sr-el'] = array(
@@ -4352,7 +4526,7 @@ Imajte na umu da može da ošteti postojeće međuviki veze.',
 	'interwiki_editerror' => 'Prefiks "$1" ne može biti izmenjen u tabeli međuvikija.
 Verovatno zatšo što ne postoji.',
 	'interwiki-badprefix' => 'Zadati međuviki prefiks "$1" sadrži nedozvoljene znakove',
-	'log-name-interwiki' => 'Istorija tabele međuvikija',
+	'log-name-interwiki' => 'Dnevnik tabele međuvikija',
 	'log-description-interwiki' => 'Ovo je istorija izmena [[Special:Interwiki|tabele međuvikija]].',
 	'right-interwiki' => 'Izmeni međuviki',
 );
@@ -4392,6 +4566,7 @@ $messages['su'] = array(
 /** Swedish (svenska)
  * @author Boivie
  * @author Fluff
+ * @author Jopparn
  * @author Lejonel
  * @author M.M.S.
  * @author Najami
@@ -4405,19 +4580,28 @@ $messages['sv'] = array(
 	'interwiki-title-norights' => 'Visa interwiki-data',
 	'interwiki-desc' => 'Lägger till en [[Special:Interwiki|specialsida]] för att visa och ändra interwikitabellen',
 	'interwiki_intro' => 'Det här är en överblick över interwiki-tabellen.',
+	'interwiki-legend-show' => 'Visa teckenförklaring',
+	'interwiki-legend-hide' => 'Dölj teckenförklaring',
 	'interwiki_prefix' => 'Prefix',
 	'interwiki-prefix-label' => 'Prefix:',
 	'interwiki_prefix_intro' => 'Interwiki-prefix avsedda att användas i <code>[<nowiki />[prefix:<em>pagename</em>]]</code>-wikisyntax.',
+	'interwiki_url_intro' => 'Mall för webbadresser. Platshållaren $1 kommer att ersättas av <em>sidnamnet</em> i wikitexten, när den ovannämnda wikitextsyntaxen används.',
 	'interwiki_local' => 'Vidarebefordra',
 	'interwiki-local-label' => 'Vidarebefordra:',
 	'interwiki_local_intro' => 'En HTTP-förfrågan till den lokala wikin med denna interwiki-prefix i webbadressen är:',
+	'interwiki_local_0_intro' => 'inte accepterad, vanligtvis blockerad av "sidan kunde inte hittas".',
+	'interwiki_local_1_intro' => 'omdirigeras till måladressen som anges i definitionerna av interwiki-länken (d.v.s. behandlas som referenser i lokala sidor).',
 	'interwiki_trans' => 'Transkludera',
 	'interwiki-trans-label' => 'Transkludera:',
+	'interwiki_trans_intro' => 'Om wikitextsyntax <code>{<nowiki />{prefix:<em>pagename</em>}}</code> används så:',
+	'interwiki_trans_1_intro' => 'tillåt inkludering från utländska wikin, om interwiki-inkluderingar är allmänt tillåten på denna wiki.',
+	'interwiki_trans_0_intro' => 'tillåt inte det, leta istället efter en sida i mall-namnrymden.',
 	'interwiki_intro_footer' => 'Se [//www.mediawiki.org/wiki/Manual:Interwiki_table MediaWiki.org] för mer information om interwikitabellen.
 Det finns en [[Special:Log/interwiki|logg över ändringar]] i interwikitabellen.',
 	'interwiki_1' => 'ja',
 	'interwiki_0' => 'nej',
 	'interwiki_error' => 'FEL: Interwikitabellen är tom, eller så gick något fel.',
+	'interwiki-cached' => 'Interwikidatat cachas. Att ändra cache-minnet är inte möjligt.',
 	'interwiki_edit' => 'Redigera',
 	'interwiki_reasonfield' => 'Anledning:',
 	'interwiki_delquestion' => 'Ta bort "$1"',
@@ -4437,7 +4621,11 @@ Det är möjligt att prefixet redan finns i tabellen.',
 	'interwiki_editerror' => 'Prefixet "$1" kan inte ändras i interwikitabellen. Det är möjligt att det inte finns.',
 	'interwiki-badprefix' => 'Specificerat interwikiprefix "$1" innehåller ogiltiga tecken',
 	'interwiki-submit-empty' => 'Prefix och URL-adressen kan inte vara tomma.',
+	'interwiki-submit-invalidurl' => 'URL:ens protokoll är ogiltigt.',
 	'log-name-interwiki' => 'Interwikitabellogg',
+	'logentry-interwiki-iw_add' => '$1 {{GENDER:$2|lade till}} prefixet "$4" ($5) (trans: $6; lokal: $7) till interwikitabellen',
+	'logentry-interwiki-iw_edit' => '$1 {{GENDER:$2|ändrade}} prefixet "$4" ($5) (trans: $6; lokal: $7) i interwikitabellen',
+	'logentry-interwiki-iw_delete' => '$1 {{GENDER:$2|tog bort}} prefixet "$4" från interwikitabellen',
 	'log-description-interwiki' => 'Detta är en logg över ändringar i [[Special:Interwiki|interwikitabellen]].',
 	'right-interwiki' => 'Redigera interwikidata',
 	'action-interwiki' => 'ändra det här interwikielementet',
@@ -4802,9 +4990,11 @@ $messages['ur'] = array(
 
 /** Uzbek (oʻzbekcha)
  * @author CoderSI
+ * @author Sociologist
  */
 $messages['uz'] = array(
-	'log-name-interwiki' => "Interviki jadvalidagi o'zgarishlar qaydlari",
+	'interwiki_addbutton' => 'Qoʻshish',
+	'log-name-interwiki' => 'Interviki jadvalidagi oʻzgarishlar qaydlari',
 );
 
 /** vèneto (vèneto)
@@ -4976,13 +5166,22 @@ $messages['wuu'] = array(
  * @author פוילישער
  */
 $messages['yi'] = array(
+	'interwiki-title-norights' => 'באקוקן אינטערוויקי דאטן',
+	'interwiki_intro' => 'דאס איז אן איבערבליק פון דער אינטערוויקי טאבעלע.',
+	'interwiki-legend-show' => 'ווייזן לעגענדע',
+	'interwiki-legend-hide' => 'באהאלטן לעגענדע',
 	'interwiki_prefix' => 'פרעפֿיקס',
 	'interwiki-prefix-label' => 'פרעפֿיקס:',
 	'interwiki_local' => 'איבערפֿירן',
+	'interwiki-local-label' => 'איבערפֿירן:',
+	'interwiki_trans' => 'אריבערשליסן',
+	'interwiki-trans-label' => 'אריבערשליסן:',
+	'interwiki_trans_intro' => 'אז דער וויקיטעקסט סינטאקס <code>{<nowiki />{prefix:<em>בלאטנאמען</em>}}</code> ווערט געניצט, דעמאלסט:',
 	'interwiki_1' => 'יא',
 	'interwiki_0' => 'ניין',
 	'interwiki_edit' => 'רעדאַקטירן',
 	'interwiki_addbutton' => 'צולייגן',
+	'interwiki_edittext' => 'רעדאקטירן אן אינטערוויקי פרעפיקס',
 );
 
 /** Cantonese (粵語)
@@ -5034,7 +5233,7 @@ $messages['yue'] = array(
  */
 $messages['zh-hans'] = array(
 	'interwiki' => '查看和编辑跨wiki数据',
-	'interwiki-title-norights' => '查看跨维基数据',
+	'interwiki-title-norights' => '查看跨wiki数据',
 	'interwiki-desc' => '新增[[Special:Interwiki|特殊页面]]以查看和编辑跨wiki表',
 	'interwiki_intro' => '这是跨wiki表的概览。',
 	'interwiki-legend-show' => '显示说明',
@@ -5057,7 +5256,7 @@ $messages['zh-hans'] = array(
 	'interwiki_1' => '是',
 	'interwiki_0' => '否',
 	'interwiki_error' => '错误: 跨wiki表为空，或是发生其它错误。',
-	'interwiki-cached' => '跨wiki数据已缓存。缓存不能编辑。',
+	'interwiki-cached' => '跨维基数据是缓存的。缓存不能被修改。',
 	'interwiki_edit' => '编辑',
 	'interwiki_reasonfield' => '理由：',
 	'interwiki_delquestion' => '正在删除“$1”',
@@ -5085,7 +5284,7 @@ $messages['zh-hans'] = array(
 	'logentry-interwiki-iw_edit' => '$1{{GENDER:$2|已修改}}跨wiki表中的前缀“$4”($5) (包含：$6；本地：$7)',
 	'logentry-interwiki-iw_delete' => '$1已从跨wiki表中{{GENDER:$2|删除}}前缀“$4”',
 	'log-description-interwiki' => '这是一个[[Special:Interwiki|跨wiki表]]的更改日志。',
-	'right-interwiki' => '编辑跨维基数据',
+	'right-interwiki' => '编辑跨wiki数据',
 	'action-interwiki' => '更改该跨维基条目',
 );
 
diff --git a/extensions/Interwiki/Interwiki.php b/extensions/Interwiki/Interwiki.php
index 6b99f999..f15bb290 100644
--- a/extensions/Interwiki/Interwiki.php
+++ b/extensions/Interwiki/Interwiki.php
@@ -30,7 +30,16 @@ $wgInterwikiViewOnly = false;
 $wgExtensionCredits['specialpage'][] = array(
 	'path' => __FILE__,
 	'name' => 'Interwiki',
-	'author' => array( 'Stephanie Amanda Stevens', 'Alexandre Emsenhuber', 'Robin Pepermans', 'Siebrand Mazeland', 'Platonides', 'Raimond Spekking', 'Sam Reed', '...' ),
+	'author' => array(
+		'Stephanie Amanda Stevens',
+		'Alexandre Emsenhuber',
+		'Robin Pepermans',
+		'Siebrand Mazeland',
+		'Platonides',
+		'Raimond Spekking',
+		'Sam Reed',
+		'...'
+	),
 	'version' => '2.2 20120425',
 	'url' => 'https://www.mediawiki.org/wiki/Extension:Interwiki',
 	'descriptionmsg' => 'interwiki-desc',
@@ -68,7 +77,7 @@ function setupInterwikiExtension() {
 		// Set up the new log type - interwiki actions are logged to this new log
 		$wgLogTypes[] = 'interwiki';
 		# interwiki, iw_add, iw_delete, iw_edit
-		$wgLogActionsHandlers['interwiki/*']  = 'InterwikiLogFormatter';
+		$wgLogActionsHandlers['interwiki/*'] = 'InterwikiLogFormatter';
 	}
 
 	return true;
diff --git a/extensions/Interwiki/Interwiki_body.php b/extensions/Interwiki/Interwiki_body.php
index 3325771f..ec104968 100644
--- a/extensions/Interwiki/Interwiki_body.php
+++ b/extensions/Interwiki/Interwiki_body.php
@@ -50,7 +50,9 @@ class SpecialInterwiki extends SpecialPage {
 		case 'submit':
 			if ( !$this->canModify( $out ) ) {
 				# Error msg added by canModify()
-			} elseif ( !$request->wasPosted() || !$this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) ) ) {
+			} elseif ( !$request->wasPosted() ||
+				!$this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) )
+			) {
 				// Prevent cross-site request forgeries
 				$out->addWikiMsg( 'sessionfailure' );
 			} else {
@@ -146,22 +148,49 @@ class SpecialInterwiki extends SpecialPage {
 			$formContent = Html::rawElement( 'tr', null,
 				Html::element( 'td', $label, $this->msg( 'interwiki-prefix-label' )->text() ) .
 				Html::rawElement( 'td', null, '<tt>' . $prefixElement . '</tt>' )
+			) . Html::rawElement(
+				'tr',
+				null,
+				Html::rawElement(
+					'td',
+					$label,
+					Xml::label( $this->msg( 'interwiki-local-label' )->text(), 'mw-interwiki-local' )
+				) .
+				Html::rawElement(
+					'td',
+					$input,
+					Xml::check( 'wpInterwikiLocal', $local, array( 'id' => 'mw-interwiki-local' ) )
+				)
 			) . Html::rawElement( 'tr', null,
-				Html::rawElement( 'td', $label, Xml::label( $this->msg( 'interwiki-local-label' )->text(), 'mw-interwiki-local' ) ) .
-				Html::rawElement( 'td', $input, Xml::check( 'wpInterwikiLocal', $local, array( 'id' => 'mw-interwiki-local' ) ) )
+				Html::rawElement(
+					'td',
+					$label,
+					Xml::label( $this->msg( 'interwiki-trans-label' )->text(), 'mw-interwiki-trans' )
+				) .
+				Html::rawElement(
+					'td',
+					$input,  Xml::check( 'wpInterwikiTrans', $trans, array( 'id' => 'mw-interwiki-trans' ) ) )
 			) . Html::rawElement( 'tr', null,
-				Html::rawElement( 'td', $label, Xml::label( $this->msg( 'interwiki-trans-label' )->text(), 'mw-interwiki-trans' ) ) .
-				Html::rawElement( 'td', $input,  Xml::check( 'wpInterwikiTrans', $trans, array( 'id' => 'mw-interwiki-trans' ) ) )
-			) . Html::rawElement( 'tr', null,
-				Html::rawElement( 'td', $label, Xml::label( $this->msg( 'interwiki-url-label' )->text(), 'mw-interwiki-url' ) ) .
+				Html::rawElement(
+					'td',
+					$label,
+					Xml::label( $this->msg( 'interwiki-url-label' )->text(), 'mw-interwiki-url' )
+				) .
 				Html::rawElement( 'td', $input, Xml::input( 'wpInterwikiURL', 60, $defaulturl,
 					array( 'tabindex' => 1, 'maxlength' => 200, 'id' => 'mw-interwiki-url' ) ) )
 			);
 		}
 
-		$form = Xml::fieldset( $topmessage, Html::rawElement( 'form',
-			array( 'id' => "mw-interwiki-{$action}form", 'method' => 'post',
-				'action' => $this->getTitle()->getLocalUrl( array( 'action' => 'submit', 'prefix' => $prefix ) ) ),
+		$form = Xml::fieldset( $topmessage, Html::rawElement(
+			'form',
+			array(
+				'id' => "mw-interwiki-{$action}form",
+				'method' => 'post',
+				'action' => $this->getTitle()->getLocalUrl( array(
+					'action' => 'submit',
+					'prefix' => $prefix
+				) )
+			),
 			Html::rawElement( 'p', null, $intromessage ) .
 			Html::rawElement( 'table', array( 'id' => "mw-interwiki-{$action}" ),
 				$formContent . Html::rawElement( 'tr', null,
@@ -313,16 +342,25 @@ class SpecialInterwiki extends SpecialPage {
 			return;
 		}
 
-		$out = '';
-
 		# Output the existing Interwiki prefixes table header
-		$out .=	Html::openElement( 'table', array( 'class' => 'mw-interwikitable wikitable sortable body' ) ) . "\n";
+		$out = '';
+		$out .=	Html::openElement(
+			'table',
+			array( 'class' => 'mw-interwikitable wikitable sortable body' )
+		) . "\n";
 		$out .= Html::openElement( 'tr', array( 'id' => 'interwikitable-header' ) ) .
 			Html::element( 'th', null, $this->msg( 'interwiki_prefix' )->text() ) .
 			Html::element( 'th', null, $this->msg( 'interwiki_url' )->text() ) .
 			Html::element( 'th', null, $this->msg( 'interwiki_local' )->text() ) .
 			Html::element( 'th', null, $this->msg( 'interwiki_trans' )->text() ) .
-			( $canModify ? Html::element( 'th', array( 'class' => 'unsortable' ), $this->msg( 'interwiki_edit' )->text() ) : '' );
+			( $canModify ?
+				Html::element(
+					'th',
+					array( 'class' => 'unsortable' ),
+					$this->msg( 'interwiki_edit' )->text()
+				) :
+				''
+			);
 		$out .= Html::closeElement( 'tr' ) . "\n";
 
 		$selfTitle = $this->getTitle();
@@ -332,23 +370,31 @@ class SpecialInterwiki extends SpecialPage {
 			$out .= Html::openElement( 'tr', array( 'class' => 'mw-interwikitable-row' ) );
 			$out .= Html::element( 'td', array( 'class' => 'mw-interwikitable-prefix' ),
 				$iwPrefix['iw_prefix'] );
-			$out .= Html::element( 'td', array( 'class' => 'mw-interwikitable-url' ), $iwPrefix['iw_url'] );
+			$out .= Html::element(
+				'td',
+				array( 'class' => 'mw-interwikitable-url' ),
+				$iwPrefix['iw_url']
+			);
 			$attribs = array( 'class' => 'mw-interwikitable-local' );
 			// Green background for cells with "yes".
 			if( $iwPrefix['iw_local'] ) {
 				$attribs['style'] = 'background: lime;';
 			}
 			// The messages interwiki_0 and interwiki_1 are used here.
-			$out .= Html::element( 'td', $attribs,
-				( isset( $iwPrefix['iw_local'] ) ? $this->msg( 'interwiki_' . $iwPrefix['iw_local'] )->text() : '-' ) );
+			$contents = isset( $iwPrefix['iw_local'] ) ?
+				$this->msg( 'interwiki_' . $iwPrefix['iw_local'] )->text() :
+				'-';
+			$out .= Html::element( 'td', $attribs, $contents );
 			$attribs = array( 'class' => 'mw-interwikitable-trans' );
 			// Green background for cells with "yes".
 			if( $iwPrefix['iw_trans'] ) {
 				$attribs['style'] = 'background: lime;';
 			}
 			// The messages interwiki_0 and interwiki_1 are used here.
-			$out .= Html::element( 'td', $attribs,
-				( isset( $iwPrefix['iw_trans'] ) ? $this->msg( 'interwiki_' . $iwPrefix['iw_trans'] )->text() : '-' ) );
+			$contents = isset( $iwPrefix['iw_trans'] ) ?
+				$this->msg( 'interwiki_' . $iwPrefix['iw_trans'] )->text() :
+				'-';
+			$out .= Html::element( 'td', $attribs, $contents );
 
 			// Additional column when the interwiki table can be modified.
 			if ( $canModify ) {
@@ -377,7 +423,11 @@ class SpecialInterwiki extends SpecialPage {
 	private function addInfoRow( $align = 'start', $title, $text ) {
 		return Html::rawElement( 'tr', null,
 			// The classes mw-align-start and mw-align-end are used here.
-			Html::rawElement( 'th', array( 'class' => 'mw-align-' . $align ), $this->msg( $title )->escaped() ) .
+			Html::rawElement(
+				'th',
+				array( 'class' => 'mw-align-' . $align ),
+				$this->msg( $title )->escaped()
+			) .
 			// This message is expected to have wiki syntax
 			Html::rawElement( 'td', null, $this->msg( $text )->parse() )
 		);
diff --git a/extensions/LocalisationUpdate/LocalisationUpdate.class.php b/extensions/LocalisationUpdate/LocalisationUpdate.class.php
index 39368b7c..66b63232 100644
--- a/extensions/LocalisationUpdate/LocalisationUpdate.class.php
+++ b/extensions/LocalisationUpdate/LocalisationUpdate.class.php
@@ -144,8 +144,8 @@ class LocalisationUpdate {
 
 		// Create a full path.
 		$svnfile = str_replace(
-			array( '$1', '$2' ),
-			array( $ext, $extFile ),
+			array( '$1', '$2', '$3', '$4' ),
+			array( $ext, $extFile, urlencode( $ext ), urlencode( $extFile ) ),
 			$extUrl
 		);
 
@@ -165,7 +165,11 @@ class LocalisationUpdate {
 	public static function updateMediawikiMessages( $verbose, $coreUrl ) {
 		// Find the changed English strings (as these messages won't be updated in ANY language).
 		$localUrl = Language::getMessagesFileName( 'en' );
-		$repoUrl = str_replace( '$2', 'languages/messages/MessagesEn.php', $coreUrl );
+		$repoUrl = str_replace(
+			array( '$2', '$4' ),
+			array( 'languages/messages/MessagesEn.php', 'languages%2Fmessages%2FMessagesEn.php' ),
+			$coreUrl
+		);
 		$changedEnglishStrings = self::compareFiles( $repoUrl, $localUrl, $verbose );
 
 		// Count the changes.
@@ -176,7 +180,11 @@ class LocalisationUpdate {
 			$localUrl = Language::getMessagesFileName( $code );
 			// Not prefixed with $IP
 			$filename = Language::getFilename( 'languages/messages/Messages', $code );
-			$repoUrl = str_replace( '$2', $filename, $coreUrl );
+			$repoUrl = str_replace(
+				array( '$2', '$4' ),
+				array( $filename, urlencode( $filename ) ),
+				$coreUrl
+			);
 
 			// Compare the files.
 			$changedCount += self::compareFiles( $repoUrl, $localUrl, $verbose, $changedEnglishStrings, false, true );
diff --git a/extensions/LocalisationUpdate/LocalisationUpdate.i18n.php b/extensions/LocalisationUpdate/LocalisationUpdate.i18n.php
index 5d52609f..194bb1e3 100644
--- a/extensions/LocalisationUpdate/LocalisationUpdate.i18n.php
+++ b/extensions/LocalisationUpdate/LocalisationUpdate.i18n.php
@@ -289,9 +289,10 @@ $messages['km'] = array(
 
 /** Korean (한국어)
  * @author Kwj2772
+ * @author 아라
  */
 $messages['ko'] = array(
-	'localisationupdate-desc' => '번역된 시스템 메시지를 가능한 한 최신으로 유지',
+	'localisationupdate-desc' => '번역된 메시지를 가능한 한 최신으로 유지합니다',
 );
 
 /** Colognian (Ripoarisch)
@@ -303,9 +304,10 @@ $messages['ksh'] = array(
 
 /** Luxembourgish (Lëtzebuergesch)
  * @author Robby
+ * @author Soued031
  */
 $messages['lb'] = array(
-	'localisationupdate-desc' => 'hält déi lokaliséiert Messagen esou aktuell wéi méiglech.',
+	'localisationupdate-desc' => 'hält déi lokaliséiert Messagen sou aktuell wéi méiglech.',
 );
 
 /** Macedonian (македонски)
@@ -329,7 +331,7 @@ $messages['ms'] = array(
 	'localisationupdate-desc' => 'Memastikan kekemaskinian mesej-mesej yang disetempatkan',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Nghtwlkr
  */
 $messages['nb'] = array(
@@ -343,7 +345,7 @@ $messages['nl'] = array(
 	'localisationupdate-desc' => 'Houdt de gelokaliseerde berichten zo actueel mogelijk',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Gunnernett
  */
 $messages['nn'] = array(
@@ -373,10 +375,11 @@ $messages['pms'] = array(
 
 /** Portuguese (português)
  * @author Hamilton Abreu
+ * @author Luckas
  * @author Malafaya
  */
 $messages['pt'] = array(
-	'localisationupdate-desc' => 'Mantém as mensagens localizadas tão actualizadas quanto possível',
+	'localisationupdate-desc' => 'Mantém as mensagens localizadas tão atualizadas quanto possível',
 );
 
 /** Brazilian Portuguese (português do Brasil)
diff --git a/extensions/LocalisationUpdate/LocalisationUpdate.php b/extensions/LocalisationUpdate/LocalisationUpdate.php
index 89f0659d..abec5406 100644
--- a/extensions/LocalisationUpdate/LocalisationUpdate.php
+++ b/extensions/LocalisationUpdate/LocalisationUpdate.php
@@ -15,9 +15,11 @@ $wgLocalisationUpdateDirectory = false;
 /**
  * These should point to either an HTTP-accessible file or local file system.
  * $1 is the name of the repo (for extensions) and $2 is the name of file in the repo.
+ * $3 and $4 are the same, respectively, but urlencoded for e.g. gitblit.
  */
-$wgLocalisationUpdateCoreURL = "https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/core.git;a=blob_plain;f=$2;hb=HEAD";
-$wgLocalisationUpdateExtensionURL = "https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/$1.git;a=blob_plain;f=$2;hb=HEAD";
+
+$wgLocalisationUpdateCoreURL = "https://git.wikimedia.org/raw/mediawiki%2Fcore.git/HEAD/$4";
+$wgLocalisationUpdateExtensionURL = "https://git.wikimedia.org/raw/mediawiki%2Fextensions%2F$3.git/HEAD/$4";
 
 /// Deprecated
 $wgLocalisationUpdateSVNURL = false;
diff --git a/extensions/Nuke/Nuke.alias.php b/extensions/Nuke/Nuke.alias.php
index 7ca75426..973f92ee 100644
--- a/extensions/Nuke/Nuke.alias.php
+++ b/extensions/Nuke/Nuke.alias.php
@@ -5,6 +5,7 @@
  * @file
  * @ingroup Extensions
  */
+// @codingStandardsIgnoreFile
 
 $specialPageAliases = array();
 
@@ -38,6 +39,11 @@ $specialPageAliases['bjn'] = array(
 	'Nuke' => array( 'Nuklir' ),
 );
 
+/** Chechen (нохчийн) */
+$specialPageAliases['ce'] = array(
+	'Nuke' => array( 'Дуккха_дӀаяккхар' ),
+);
+
 /** German (Deutsch) */
 $specialPageAliases['de'] = array(
 	'Nuke' => array( 'Massenlöschung' ),
@@ -195,7 +201,7 @@ $specialPageAliases['nl'] = array(
 
 /** Norwegian Nynorsk (norsk nynorsk) */
 $specialPageAliases['nn'] = array(
-	'Nuke' => array( 'Massesletting' ),
+	'Nuke' => array( 'Massesletting', 'Masseslett' ),
 );
 
 /** Polish (polski) */
diff --git a/extensions/Nuke/Nuke.i18n.php b/extensions/Nuke/Nuke.i18n.php
index a7b6f045..71ee547a 100644
--- a/extensions/Nuke/Nuke.i18n.php
+++ b/extensions/Nuke/Nuke.i18n.php
@@ -91,8 +91,9 @@ Parameters:
 	'nuke-submit-user' => '{{Identical|Go}}',
 	'nuke-submit-delete' => 'Submit button to delete the selected pages.',
 	'right-nuke' => '{{doc-right|nuke}}',
-	'nuke-select' => 'Parameter $1 are two links: {{msg-mw|powersearch-toggleall}} and {{msg-mw|powersearch-togglenone}} which respectively selects all pages and de-selects all pages.
-
+	'nuke-select' => 'Parameters:
+* $1 - two links: {{msg-mw|Powersearch-toggleall}} and {{msg-mw|Powersearch-togglenone}} which respectively selects all pages and de-selects all 
+pages
 {{Identical|Select}}',
 	'nuke-userorip' => 'Used as label for "target" input box.',
 	'nuke-maxpages' => 'Used as label for "nuke limit" input box.',
@@ -100,8 +101,14 @@ Parameters:
 
 Parameters:
 * $1 - a username',
-	'nuke-deleted' => '*$1 - page title',
-	'nuke-not-deleted' => '*$1 - page title',
+	'nuke-deleted' => 'Used as success result of deletion. Parameters:
+* $1 - page title
+See also:
+* {{msg-mw|Nuke-not-deleted}}',
+	'nuke-not-deleted' => 'Used as failure result of deletion. Parameters:
+* $1 - page title
+See also:
+* {{msg-mw|Nuke-deleted}}',
 	'nuke-delete-more' => 'Used at the bottom of the Nuke (mass deletion) result page.',
 	'nuke-pattern' => 'Used as label for "nuke pattern" input box.',
 	'nuke-nopages-global' => 'Used if there are no pages to delete and the username is empty.
@@ -219,7 +226,7 @@ $messages['arz'] = array(
 	'right-nuke' => 'مسح كبير للصفحات',
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Bishnu Saikia
  */
 $messages['as'] = array(
@@ -267,10 +274,11 @@ $messages['az'] = array(
 /** Bashkir (башҡортса)
  * @author Assele
  * @author Haqmar
+ * @author Рустам Нурыев
  */
 $messages['ba'] = array(
 	'nuke' => 'Күпләп юйыу',
-	'nuke-desc' => 'Хәкимдәргә биттәрҙе [[Special:Nuke|күпләп юйыу]] мөмкинлеген бирә',
+	'nuke-desc' => 'Хакимдәргә биттәрҙе [[Special:Nuke|күпләп юйыу]] мөмкинлеген бирә',
 	'nuke-nopages' => 'Һуңғы үҙгәртеүҙәрҙә [[Special:Contributions/$1|$1]] тарафынан булдырылған биттәр юҡ.', # Fuzzy
 	'nuke-list' => 'Түбәндәге биттәр [[Special:Contributions/$1|$1]] тарафынан яңыраҡ булдырылған.
 Уларҙы юйыр өсөн, аңлатма керетегеҙ һәм төймәгә баҫығыҙ.', # Fuzzy
@@ -370,6 +378,7 @@ $messages['bg'] = array(
 );
 
 /** Bengali (বাংলা)
+ * @author Aftab1995
  * @author Bellayet
  * @author Wikitanvir
  * @author Zaheen
@@ -378,7 +387,7 @@ $messages['bn'] = array(
 	'nuke' => 'গণ মুছে ফেলা',
 	'nuke-desc' => 'প্রশাসকদের পাতাগুলি [[Special:Nuke|গণহারে মুছে ফেলার]] ক্ষমতা দেয়',
 	'nuke-nopages' => 'সাম্প্রতিক পরিবর্তনগুলিতে [[Special:Contributions/$1|$1]]-এর তৈরি কোন নতুন পাতা নেই।', # Fuzzy
-	'nuke-list' => '[[Special:Contributions/$1|$1]] সাম্প্রতিক কালে নিচের পাতাগুলি সৃষ্টি করেছেন; একটি মন্তব্য দিন এবং বোতাম চেপে এগুলি মুছে ফেলুন।', # Fuzzy
+	'nuke-list' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] সাম্প্রতিক কালে নিচের পাতাগুলি সৃষ্টি করেছেন; একটি মন্তব্য দিন এবং বোতাম চেপে এগুলি মুছে ফেলুন।',
 	'nuke-defaultreason' => '$1-এর যোগ করা পাতাগুলির গণ মুছে-ফেলা', # Fuzzy
 	'nuke-multiplepeople' => 'একাধিক ব্যবহারকারী', # Fuzzy
 	'nuke-tools' => 'এই সরঞ্জামটি ব্যবহার করে আপনি একটি প্রদত্ত ব্যবহারকারীর বা আইপি ঠিকানার যোগ করা পাতাগুলি গণ আকারে মুছে ফেলতে পারবেন। পাতাগুলির তালিকা পেতে ব্যবহারকারী নাম বা আইপি ঠিকানাটি ইনপুট করুন:', # Fuzzy
@@ -391,6 +400,7 @@ $messages['bn'] = array(
 
 /** Breton (brezhoneg)
  * @author Fulup
+ * @author Y-M D
  */
 $messages['br'] = array(
 	'nuke' => "Diverkañ a-vloc'h",
@@ -417,7 +427,7 @@ Merkañ ar c'homlec'h IP pe anv an implijer evit kaout roll ar pajennoù da zive
 	'nuke-delete-more' => '[[Special:Nuke|Diverkañ pajennoù all]]',
 	'nuke-pattern' => 'Patrom evit anv ar bajenn :',
 	'nuke-nopages-global' => "N'eus pajenn nevez ebet er [[Special:RecentChanges|c'hemmoù diwezhañ]].",
-	'nuke-viewchanges' => "Diskouez ar c'hemmoù",
+	'nuke-viewchanges' => "diskouez ar c'hemmoù",
 );
 
 /** Bosnian (bosanski)
@@ -446,6 +456,7 @@ Unesite korisničko ime ili IP adresu za izlistavanje stranica koje se brišu il
 
 /** Catalan (català)
  * @author Aleator
+ * @author Alvaro Vidal-Abarca
  * @author Paucabot
  * @author SMP
  * @author Toniher
@@ -453,7 +464,7 @@ Unesite korisničko ime ili IP adresu za izlistavanje stranica koje se brišu il
 $messages['ca'] = array(
 	'nuke' => 'Eliminació massiva',
 	'nuke-desc' => "Dóna als administradors l'habilitat d'[[Special:Nuke|esborrar pàgines massivament]]",
-	'nuke-nopages' => 'No hi ha pàgines noves de [[Special:Contributions/$1|$1]] als canvis recents.', # Fuzzy
+	'nuke-nopages' => 'No hi ha pàgines noves de [[Special:Contributions/$1|{{GENDER:$1|$1}}]] als canvis recents.',
 	'nuke-list' => 'Les següents pàgines han estat creades recentment per [[Special:Contributions/$1|$1]];
 feu un comentari i cliqueu el botó per a esborrar-les.', # Fuzzy
 	'nuke-defaultreason' => 'Esborrat massiu de pàgines creades per $1', # Fuzzy
@@ -466,12 +477,26 @@ Per obtenir la llista de pàgines per esborrar podeu introduir el nom d'un usuar
 
 /** Chechen (нохчийн)
  * @author Sasan700
+ * @author Умар
  */
 $messages['ce'] = array(
-	'nuke' => 'Дуккха дIадайар',
-	'nuke-defaultreason' => 'Декъашхочо кхоьллина агIонаш, дуккха дIайайар $1', # Fuzzy
-	'nuke-submit-delete' => 'Дlадайá хаьржнарш',
-	'right-nuke' => 'дуккха агIонаш дIайайар',
+	'nuke' => 'Дуккха дӀяккхар',
+	'action-nuke' => 'дуккха агIонаш дӀаяхар',
+	'nuke-list-multiple' => 'Лахахь гайтина агӀонаш дукху хан йоцуш кхолийна.
+Уьш дӀаяха билгалонаш Ӏадйите тӀетаӀе кнопка.',
+	'nuke-defaultreason' => 'Декъашхочо $1 кхоьллина агIонаш, дуккха дӀаяхар', # Fuzzy
+	'nuke-multiplepeople' => 'Дуккха агӀонаш дӀаяхар',
+	'nuke-tools' => 'ХӀокху агӀонехь йиш ю дуккха агӀонаш дӀаяха, дукх хан йоцуш кхолийна йолу.',
+	'nuke-submit-user' => 'Кхочушдé',
+	'nuke-submit-delete' => 'ДӀаяха хаьржнарш',
+	'right-nuke' => 'дуккха агIонаш дӀаяхар',
+	'nuke-userorip' => 'Декъашхочун цӀе, IP-адрес (еса йита мега):',
+	'nuke-maxpages' => 'АгӀонашан максимальни дукхалла:',
+	'nuke-editby' => 'Кхолийна {{GENDER:$1|декъашхочо}} [[Special:Contributions/$1|$1]]',
+	'nuke-delete-more' => '[[Special:Nuke|Дуккха агӀонаш дӀаяхар]]',
+	'nuke-pattern' => 'Кеп агӀона цӀеран:',
+	'nuke-viewchanges' => 'ХӀоттина болу хийцам',
+	'nuke-namespace' => 'Къастае ана цӀераш:',
 );
 
 /** Chamorro (Chamoru)
@@ -481,10 +506,18 @@ $messages['ch'] = array(
 	'nuke-submit-user' => 'Hånao',
 );
 
-/** Czech (česky)
+/** Sorani Kurdish (کوردی)
+ * @author Calak
+ */
+$messages['ckb'] = array(
+	'right-nuke' => 'سڕینەوەی پەڕەکان بەکۆمەڵ',
+);
+
+/** Czech (čeština)
  * @author Danny B.
  * @author Jkjk
  * @author Li-sung
+ * @author Littledogboy
  * @author Matěj Grabovský
  * @author Mormegil
  */
@@ -497,8 +530,8 @@ $messages['cs'] = array(
 vyplňte komentář a všechny smažte kliknutím na tlačítko.',
 	'nuke-list-multiple' => 'Nedávno byly vytvořeny následující stránky;
 zadáním komentáře a stisknutím tlačítka je smažete.',
-	'nuke-defaultreason' => 'Hromadné odstranění stránek, které {{GENDER:$1|vytvořil|vytvořila}}  [[Special:Contributions/$1|$1]]',
-	'nuke-multiplepeople' => 'Hromadné odstranění nedávno založených stránek',
+	'nuke-defaultreason' => 'Hromadné smazání stránek, které {{GENDER:$1|vytvořil|vytvořila}}  [[Special:Contributions/$1|$1]]',
+	'nuke-multiplepeople' => 'Hromadné smazání nedávno založených stránek',
 	'nuke-tools' => 'Tento nástroj umožňuje hromadné smazání stránek nedávno vytvořených zadaným uživatelem nebo IP adresou.
 Zadejte uživatelské jméno nebo IP adresu, zobrazí se seznam stránek ke smazání; případně ponechte prázdné pro všechny uživatele.',
 	'nuke-submit-user' => 'Provést',
@@ -552,6 +585,7 @@ Skriv et brugernavn eller en IP-adresse for at få en liste over sider at slette
 );
 
 /** German (Deutsch)
+ * @author Geitost
  * @author Kghbln
  * @author Metalhead64
  * @author Raimond Spekking
@@ -569,7 +603,7 @@ Gib einen Kommentar bezüglich der Löschung an und klicke auf die Schaltfläche
 	'nuke-defaultreason' => 'Massenlöschung der Seiten, die von „[[Special:Contributions/$1|{{GENDER:$1|$1}}]]“ angelegt wurden',
 	'nuke-multiplepeople' => 'Massenlöschung kürzlich erstellter Seiten',
 	'nuke-tools' => 'Diese Arbeitshilfe ermöglicht die Massenlöschung von Seiten, die von einer IP-Adresse oder einem Benutzer angelegt wurden.
-Gib die IP-Adresse oder den Benutzernamen ein, um eine Liste der zu löschenden Seiten zu erhalten. Sofern Du keine Angabe machst, werden alle Benutzer ausgewählt.',
+Gib die IP-Adresse oder den Benutzernamen ein, um eine Liste der zu löschenden Seiten zu erhalten. Sofern du keine Angabe machst, werden alle Benutzer ausgewählt.',
 	'nuke-submit-user' => 'Abrufen',
 	'nuke-submit-delete' => 'Ausgewählte Seiten löschen',
 	'right-nuke' => 'Massenlöschungen von Seiten',
@@ -726,6 +760,7 @@ Enigu la salutnomon aŭ IP-adreson por akiri liston de paĝoj forigi, aŭ lasu 
  * @author Fitoschido
  * @author Imre
  * @author Jatrobat
+ * @author MarcoAurelio
  * @author Platonides
  * @author Ralgis
  * @author Remember the dot
@@ -807,6 +842,7 @@ idatz ezazu ohar bat, eta sakatu botoia orri horiek ezabatzeko.',
 );
 
 /** Persian (فارسی)
+ * @author Ebraminio
  * @author Huji
  * @author Mjbmr
  * @author Reza1615
@@ -817,10 +853,11 @@ $messages['fa'] = array(
 	'action-nuke' => 'حذف دسته‌جمعی صفحه‌ها',
 	'nuke-desc' => 'به مدیران امکان [[Special:Nuke|حذف دسته‌جمعی]] صفحه‌ها را می‌دهد',
 	'nuke-nopages' => 'صفحهٔ جدیدی از [[Special:Contributions/$1|{{GENDER:$1|$1}}]] در تغییرات اخیر وجود ندارد.',
-	'nuke-list' => 'صفحه‌های زیر به تازگی توسط [[Special:Contributions/$1|$1]] ایجاد شده‌اند؛ توضیحی ارائه کنید و دکمه را بزنید تا این صحفه‌ها حذف شوند.', # Fuzzy
+	'nuke-list' => 'صفحه‌های زیر به تازگی توسط [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ایجاد شده‌اند؛
+توضیحی ارائه کنید و دکمه را بزنید تا این صحفه‌ها حذف شوند.',
 	'nuke-list-multiple' => 'صفحه‌های مقابل اخیراً ایجاد شده‌اند؛
 یک توضیح قرار دهید و برای حذف کلید را فشار دهید.',
-	'nuke-defaultreason' => 'حذف دسته‌جمعی صفحه‌هایی که توسط $1 ایجاد شده‌اند', # Fuzzy
+	'nuke-defaultreason' => 'حذف دسته‌جمعی صفحه‌هایی که توسط [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ایجاد شده‌اند',
 	'nuke-multiplepeople' => 'حذف توده‌ای صفحه‌های به‌تازگی افزوده‌شده',
 	'nuke-tools' => 'این ابزار امکان حذف دسته‌جمعی صفحه‌هایی که به تازگی توسط یک کاربر یا نشانی آی‌پی اضافه شده‌اند را فراهم می‌کند.
 نام کاربری یا نشانی آی‌پی موردنظر را وارد کنید، یا جعبه را خالی بگذارید تا تمام کاربرها در نظر گرفته شوند.',
@@ -830,21 +867,24 @@ $messages['fa'] = array(
 	'nuke-select' => 'انتخاب: $1',
 	'nuke-userorip' => 'نام کاربری، نشانی آی‌پی یا خالی:',
 	'nuke-maxpages' => 'حداکثر تعداد صفحه‌ها:',
-	'nuke-editby' => 'ایجاد شده توسط [[Special:Contributions/$1|$1]]', # Fuzzy
-	'nuke-deleted' => "صفحهٔ '''$1''' حذف شده است.",
+	'nuke-editby' => 'ایجاد شده توسط [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
+	'nuke-deleted' => "صفحهٔ '''$1''' حذف شده‌است.",
 	'nuke-not-deleted' => "صفحهٔ [[:$1]] را '''نمی‌توان''' حذف کرد.",
 	'nuke-delete-more' => '[[Special:Nuke|حذف صفحه‌های بیشتر]]',
 	'nuke-pattern' => 'الگو برای نام صفحه:',
 	'nuke-nopages-global' => 'هیچ صفحهٔ جدیدی در [[Special:RecentChanges|فهرست تغییرات اخیر]] نیست.',
 	'nuke-viewchanges' => 'نمایش تغییرات',
+	'nuke-namespace' => 'محدودیت به فضای نام:',
 );
 
 /** Finnish (suomi)
  * @author Beluga
  * @author Crt
  * @author Jaakonam
+ * @author Mies
  * @author Nike
  * @author Olli
+ * @author Pxos
  * @author Stryn
  */
 $messages['fi'] = array(
@@ -853,15 +893,15 @@ $messages['fi'] = array(
 	'nuke-desc' => 'Mahdollistaa ylläpitäjille sivujen [[Special:Nuke|massapoistamisen]].',
 	'nuke-nopages' => 'Ei käyttäjän [[Special:Contributions/$1|{{GENDER:$1|$1}}]] lisäämiä uusia sivuja tuoreissa muutoksissa.',
 	'nuke-list' => 'Käyttäjä [[Special:Contributions/$1|{{GENDER:$1|$1}}]] on äskettäin luonut seuraavat sivut.
-Lisää kommentti ja poista napsauttamalla painiketta.',
-	'nuke-list-multiple' => 'Seuraavat sivut tehtiin äskettäin.
-Lisää kommentti ja poista napsauttamalla painiketta.',
+Lisää kommentti ja poista sivut napsauttamalla painiketta.',
+	'nuke-list-multiple' => 'Seuraavat sivut on luotu äskettäin.
+Lisää kommentti ja poista sivut napsauttamalla painiketta.',
 	'nuke-defaultreason' => 'Käyttäjän [[Special:Contributions/$1|{{GENDER:$1|$1}}]] lisäämien sivujen massapoistaminen',
 	'nuke-multiplepeople' => 'Äskettäin lisättyjen sivujen massapoistaminen',
 	'nuke-tools' => 'Tämä työkalu mahdollistaa äskettäin lisättyjen sivujen massapoistamisen käyttäjänimen tai IP-osoitteen perusteella.
 Kirjoita käyttäjänimi tai IP-osoite, niin saat listan poistettavista sivuista, tai jätä kenttä tyhjäksi niin saat kaikkien käyttäjien tekemät sivut.',
 	'nuke-submit-user' => 'Siirry',
-	'nuke-submit-delete' => 'Poista valitut',
+	'nuke-submit-delete' => 'Poista valitsemasi sivut',
 	'right-nuke' => 'Massapoistaa sivuja',
 	'nuke-select' => 'Valinta: $1',
 	'nuke-userorip' => 'Käyttäjänimi tai IP-osoite (voi jättää myös tyhjäksi):',
@@ -869,8 +909,8 @@ Kirjoita käyttäjänimi tai IP-osoite, niin saat listan poistettavista sivuista
 	'nuke-editby' => 'Luonut [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
 	'nuke-deleted' => "Sivu '''$1''' on poistettu.",
 	'nuke-not-deleted' => "Sivua [[:$1]] '''ei voitu''' poistaa.",
-	'nuke-delete-more' => '[[Special:Nuke|Poista lisää sivuja]]',
-	'nuke-pattern' => 'Sivun nimien etuliite',
+	'nuke-delete-more' => '[[Special:Nuke|Poista enemmän sivuja]]',
+	'nuke-pattern' => 'Malli sivun nimelle:',
 	'nuke-nopages-global' => '[[Special:RecentChanges|Tuoreissa muutoksissa]] ei ole uusia sivuja.',
 	'nuke-viewchanges' => 'näytä muutokset',
 	'nuke-namespace' => 'Rajoita nimiavaruuteen:',
@@ -948,6 +988,39 @@ Buchiér lo nom d’usanciér ou ben l’adrèce IP por avêr la lista de les p
 	'nuke-namespace' => 'Sè limitar a cet’èspâço de noms :',
 );
 
+/** Northern Frisian (Nordfriisk)
+ * @author Murma174
+ */
+$messages['frr'] = array(
+	'nuke' => 'Sidjen bonkerwiis strik',
+	'action-nuke' => 'sidjen bonkerwiis tu striken',
+	'nuke-desc' => 'Administratooren kön diarmä sidjen [[Special:Nuke|bonkerwiis strik]]',
+	'nuke-nopages' => 'Bi a „leetst feranrangen“ san nian nei sidjen faan [[Special:Contributions/$1|{{GENDER:$1|$1}}]].',
+	'nuke-list' => 'Jodiar sidjen san faan [[Special:Contributions/$1|{{GENDER:$1|$1}}]] skrewen wurden.
+Skriiw ap, huaram dü jo strikst, an do trak üüb di knoop tu striken.',
+	'nuke-list-multiple' => 'Jodiar sidjen san jüst skrewen wurden.
+Skriiw ap, huaram dü jo strikst, an do trak üüb di knoop tu striken.',
+	'nuke-defaultreason' => 'Sidjen faan [[Special:Contributions/$1|{{GENDER:$1|$1}}]] bonkerwiis strik',
+	'nuke-multiplepeople' => 'Jüst skrewen sidjen bonkerwiis strik',
+	'nuke-tools' => 'Diarmä kön sidjen, diar faan en was IP of en wasen brüker skrewen wurden san, bonkerwiis stregen wurd.
+Skriiw diar det IP-adres of di brükernööm iin, an do könst dü det list faan sidjen sä, diar stregen wurd kön.
+Wan dü diar niks henskrafst, wurd aal a brükern uunwiset.',
+	'nuke-submit-user' => 'Widjer',
+	'nuke-submit-delete' => 'Enkelten strik',
+	'right-nuke' => 'Sidjen bonkerwiis strik',
+	'nuke-select' => 'Schük ütj: $1',
+	'nuke-userorip' => 'Brükernööm, IP-adres of niks:',
+	'nuke-maxpages' => 'Ei muar sidjen üs:',
+	'nuke-editby' => 'Skrewen faan [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
+	'nuke-deleted' => "Sidj '''„$1“''' as stregen wurden.",
+	'nuke-not-deleted' => "Sidj [[:$1]] '''küd ei''' stregen wurd.",
+	'nuke-delete-more' => '[[Special:Nuke|Muar sidjen strik]]',
+	'nuke-pattern' => 'Münster för di sidjnööm:',
+	'nuke-nopages-global' => 'Diar san nian sidjen uun a [[Special:RecentChanges|leetst feranrangen]].',
+	'nuke-viewchanges' => 'Feranrangen wise',
+	'nuke-namespace' => 'Bluas uun di nöömrüm:',
+);
+
 /** Friulian (furlan)
  * @author Klenje
  */
@@ -1046,6 +1119,7 @@ $messages['gv'] = array(
 
 /** Hebrew (עברית)
  * @author Amire80
+ * @author Guycn1
  * @author Rotem Liss
  * @author YaronSh
  */
@@ -1058,7 +1132,7 @@ $messages['he'] = array(
 אנא כתבו הסבר למחיקה ולחצו על הכפתור כדי למחוק אותם.',
 	'nuke-list-multiple' => 'הדפים הבאים נוצרו לאחרונה;
 אנא כתבו נימוק למחיקה ולחצו על הכפתור כדי למחוק אותם.',
-	'nuke-defaultreason' => 'הסרה מרובה של דפים שנוספו על־ידי [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
+	'nuke-defaultreason' => 'הסרה מרובה של דפים שנוצרו על־ידי [[Special:Contributions/$1|$1]]',
 	'nuke-multiplepeople' => 'מחיקה מרובה של דפים שנוספו לאחרונה',
 	'nuke-tools' => 'כלי זה מאפשר מחיקות המוניות של דפים שנוספו לאחרונה על ידי משתמש או כתובת IP מסוימים.
 כתבו את שם המשתמש או כתובת ה־IP כדי לקבל את רשימת הדפים למחיקה או השאירו את השדה הזה ריק עבור כל המשתמשים.',
@@ -1082,22 +1156,35 @@ $messages['he'] = array(
  * @author Ansumang
  * @author Kaustubh
  * @author Shyam
+ * @author Siddhartha Ghai
  */
 $messages['hi'] = array(
-	'nuke' => 'एकसाथ बहुत सारे पन्ने हटायें',
-	'nuke-desc' => 'प्रबंधकोंको एकसाथ [[Special:Nuke|बहुत सारे पन्ने हटानेकी]] अनुमति देता हैं',
-	'nuke-nopages' => 'हाल में हुए बदलावोंमें [[Special:Contributions/$1|$1]] द्वारा नये पन्ने नहीं हैं।', # Fuzzy
-	'nuke-list' => 'नीचे दिये हुए पन्ने [[Special:Contributions/$1|$1]] ने हाल में बनायें हैं; टिप्पणी दें और हटाने के लिये बटनपर क्लिक करें।', # Fuzzy
-	'nuke-defaultreason' => '$1 ने बनाये हुए पन्ने एकसाथ हटायें', # Fuzzy
-	'nuke-tools' => 'यह उपकरण किसी सदस्य या IP द्वारा हाल ही में जोड़े गए पृष्ठों को सामूहिक रूप से हटाने में सहायक है।
-सदस्यनाम या IP डालकर हटाने वाले पृष्ठों की सूची प्राप्त करें।', # Fuzzy
+	'nuke' => 'एक साथ बहुत सारे पृष्ठ हटायें',
+	'action-nuke' => 'एक साथ बहुत सारे पृष्ठ हटाने',
+	'nuke-desc' => 'प्रबंधकों को एक साथ [[Special:Nuke|बहुत सारे पृष्ठ हटाने]] की सुविधा देता है',
+	'nuke-nopages' => 'हाल में हुए बदलावों में [[Special:Contributions/$1|{{GENDER:$1|$1}}]] द्वारा नये पृष्ठ नहीं हैं।',
+	'nuke-list' => 'नीचे दिये हुए पृष्ठ [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ने हाल में बनाये हैं;
+टिप्पणी दें और हटाने के लिये बटन पर क्लिक करें।',
+	'nuke-list-multiple' => 'निम्न पृष्ठ हाल में बनाए गए हैं;
+टिप्पणी दें और हटाने के लिए बटन पर क्लिक करें।',
+	'nuke-defaultreason' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] द्वारा बनाये गए पृष्ठ एक साथ हटाये',
+	'nuke-multiplepeople' => 'हाल में बने पृष्ठ एक साथ हटाए',
+	'nuke-tools' => 'यह उपकरण किसी सदस्य या आई॰पी द्वारा हाल ही में जोड़े गए पृष्ठों को सामूहिक रूप से हटाने के लिए है।
+सदस्यनाम या आई॰पी डालकर हटाने हेतु पृष्ठों की सूची प्राप्त करें। सभी सदस्यों के बनाए पृष्ठों की सूची के लिए खाली छोड़ दें।',
 	'nuke-submit-user' => 'जायें',
 	'nuke-submit-delete' => 'चुने हुए हटायें',
-	'right-nuke' => 'बहुतसे पन्ने एकसाथ हटायें',
-	'nuke-select' => 'चयन करें: $1',
-	'nuke-userorip' => 'सदस्यनाम, आईपी पते या खाली:',
+	'right-nuke' => 'बहुत से पृष्ठ एक साथ हटायें',
+	'nuke-select' => 'चुनें: $1',
+	'nuke-userorip' => 'सदस्यनाम, आई॰पी पता या खाली:',
 	'nuke-maxpages' => 'अधिकतम पृष्ठ संख्या:',
-	'nuke-deleted' => "पृष्ठ '''$1''' को हटा दिया गया हैं।",
+	'nuke-editby' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] द्वारा बनाए गए',
+	'nuke-deleted' => "पृष्ठ '''$1''' को हटा दिया गया है।",
+	'nuke-not-deleted' => "पृष्ठ [[:$1]] हटाया '''नहीं''' जा सका।",
+	'nuke-delete-more' => '[[Special:Nuke|और पृष्ठ हटाएँ]]',
+	'nuke-pattern' => 'पृष्ठ नाम के लिए पैटर्न:',
+	'nuke-nopages-global' => '[[Special:RecentChanges|हाल में हुए बदलावों]] में कोई नए पृष्ठ नहीं हैं।',
+	'nuke-viewchanges' => 'बदलाव देखें',
+	'nuke-namespace' => 'इस नामस्थान में सीमित करें:',
 );
 
 /** Hiligaynon (Ilonggo)
@@ -1196,12 +1283,12 @@ $messages['ia'] = array(
 	'nuke' => 'Deletion in massa',
 	'action-nuke' => 'deler paginas in massa',
 	'nuke-desc' => 'Da le possibilitate al administratores de [[Special:Nuke|deler paginas in massa]]',
-	'nuke-nopages' => 'Nulle nove paginas per [[Special:Contributions/$1|$1]] trovate in le modificationes recente.', # Fuzzy
-	'nuke-list' => 'Le sequente paginas esseva recentemente create per [[Special:Contributions/$1|$1]];
-entra un commento e clicca le button pro deler los.', # Fuzzy
+	'nuke-nopages' => 'Nulle nove pagina create per [[Special:Contributions/$1|{{GENDER:$1|$1}}]] trovate in le modificationes recente.',
+	'nuke-list' => 'Le sequente paginas esseva recentemente create per [[Special:Contributions/$1|{{GENDER:$1|$1}}]];
+entra un commento e clicca le button pro deler los.',
 	'nuke-list-multiple' => 'Le sequente paginas esseva create recentemente;
 entra un commento e pulsa sur le button pro deler los.',
-	'nuke-defaultreason' => 'Deletion in massa de paginas addite per $1', # Fuzzy
+	'nuke-defaultreason' => 'Deletion in massa de paginas addite per [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
 	'nuke-multiplepeople' => 'Deletion in massa de paginas addite recentemente',
 	'nuke-tools' => 'Iste instrumento permitte le deletion in massa de paginas recentemente addite per un usator o adresse IP specific.
 Entra le nomine de usator o adresse IP pro obtener un lista de paginas a deler, o lassa vacue pro tote le usatores.',
@@ -1211,7 +1298,7 @@ Entra le nomine de usator o adresse IP pro obtener un lista de paginas a deler,
 	'nuke-select' => 'Seliger: $1',
 	'nuke-userorip' => 'Nomine de usator, adresse IP o vacue:',
 	'nuke-maxpages' => 'Numero maxime de paginas:',
-	'nuke-editby' => 'Create per [[Special:Contributions/$1|$1]]', # Fuzzy
+	'nuke-editby' => 'Create per [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
 	'nuke-deleted' => "Le pagina '''$1''' ha essite delite.",
 	'nuke-not-deleted' => "Le pagina [[:$1]] '''non poteva''' esser delite.",
 	'nuke-delete-more' => '[[Special:Nuke|Deler plus paginas]]',
@@ -1264,9 +1351,9 @@ $messages['ig'] = array(
  * @author Lam-ang
  */
 $messages['ilo'] = array(
-	'nuke' => 'Paga-adduan nga pinag-ikkat',
+	'nuke' => 'Paga-adduan nga panagikkat',
 	'action-nuke' => 'ikkaten dagiti panid',
-	'nuke-desc' => 'Ikkan na ti administrador ti abilidad nga [[Special:Nuke|	paga-adduan nga pang-ikkat]] kadagit panid',
+	'nuke-desc' => 'Ikkanna ti administrador ti abilidad iti [[Special:Nuke|adu a panagikkat]] kadagiti panid',
 	'nuke-nopages' => 'Awan dagiti baro a panid babaen ni [[Special:Contributions/$1|{{GENDER:$1|$1}}]] idiay kaudian abalbaliw.',
 	'nuke-list' => 'Dagiti sumaganad a panid ket kadamdamaan a pinartuat babaen ni [[Special:Contributions/$1|{{GENDER:$1|$1}}]];
 ikkam ti komentario ken pindutem ti buton tapno maikkatda.',
@@ -1289,6 +1376,7 @@ Ikabil ti nagan ti agar-aramat wenno IP address tapno maalam dagiti listaan dagi
 	'nuke-pattern' => 'Manipud a kita iti nagan ti panid:',
 	'nuke-nopages-global' => 'Awan dagiti baro a panid idiay [[Special:RecentChanges|kinaudian a pinagbaliw]].',
 	'nuke-viewchanges' => 'kitaen dagiti sinukatan',
+	'nuke-namespace' => 'Patingga iti nagan a lugar:',
 );
 
 /** Ido (Ido)
@@ -1337,6 +1425,7 @@ Tilgreindu notendanafn eða vistfang til að fá lista yfir síður til að eyð
  * @author BrokenArrow
  * @author Darth Kule
  * @author F. Cosoleto
+ * @author Nemo bis
  */
 $messages['it'] = array(
 	'nuke' => 'Cancellazione di massa',
@@ -1359,7 +1448,7 @@ Inserisci il nome utente o l'indirizzo IP per la lista delle pagine da cancellar
 	'nuke-editby' => 'Creata da [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
 	'nuke-deleted' => "La pagina '''$1''' è stata cancellata.",
 	'nuke-not-deleted' => "La pagina [[:$1]] '''non può''' essere cancellata.",
-	'nuke-delete-more' => '[[Special:Nuke|Cancella più pagine]]',
+	'nuke-delete-more' => '[[Special:Nuke|Cancella altre pagine]]',
 	'nuke-pattern' => 'Modello per il titolo della pagina:',
 	'nuke-nopages-global' => 'Non ci sono nuove pagine negli [[Special:RecentChanges|ultimi cambiamenti]].',
 	'nuke-viewchanges' => 'vedi modifiche',
@@ -1399,8 +1488,8 @@ $messages['ja'] = array(
 	'nuke-userorip' => '利用者名、IP アドレス、空欄のいずれか:',
 	'nuke-maxpages' => '最大ページ数:',
 	'nuke-editby' => '[[Special:Contributions/$1|$1]] が作成',
-	'nuke-deleted' => "ページ  '''$1''' は削除されました。",
-	'nuke-not-deleted' => "ページ [[:$1]] は削除'''できません''' 。",
+	'nuke-deleted' => "ページ  '''$1''' を削除しました。",
+	'nuke-not-deleted' => "ページ [[:$1]] を削除'''できませんでした'''。",
 	'nuke-delete-more' => '[[Special:Nuke|他のページも削除]]',
 	'nuke-pattern' => 'ページ名のパターン:',
 	'nuke-nopages-global' => '[[Special:RecentChanges|最近の更新]]には新しいページはありません。',
@@ -1480,6 +1569,35 @@ $messages['ka'] = array(
 	'nuke-viewchanges' => 'ცვლილებების ჩვენება',
 );
 
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author Arystanbek
+ */
+$messages['kk-cyrl'] = array(
+	'nuke' => 'Жаппай жою',
+	'action-nuke' => 'Жаппай жою беттері',
+	'nuke-desc' => 'Әкімшілер беттерді [[Special:Nuke|жаппай жоюға]] құзретті',
+	'nuke-nopages' => 'Жуықтағы өзгерістерде [[Special:Contributions/$1|{{GENDER:$1|$1}}]] қосқан жаңа беттер жоқ.',
+	'nuke-list' => 'Төмендегі беттерді жуықта [[Special:Contributions/$1|{{GENDER:$1|$1}}]] бастаған; пікіріңізді қалдырыңыз және оларды жою үшін батырманы басыңыз.',
+	'nuke-list-multiple' => 'Төмендегі беттерді жуықта басталған; пікіріңізді қалдырыңыз және оларды жою үшін батырманы басыңыз.',
+	'nuke-defaultreason' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] қосқан беттерді жаппай жойды',
+	'nuke-multiplepeople' => 'Жуырда қосылған беттерді жаппай жойды',
+	'nuke-tools' => 'Бұл құрал осы қатысушының немесе IP мекен-жайының соңғы қосқан беттерді жаппай жоюға мүмкіндік береді.',
+	'nuke-submit-user' => 'Өту',
+	'nuke-submit-delete' => 'Жойылуға таңдалды',
+	'right-nuke' => 'Беттерді жаппай жой',
+	'nuke-select' => 'Таңдау: $1',
+	'nuke-userorip' => 'Қатысушы есімі, IP мекенөжай немесе бос орын',
+	'nuke-maxpages' => 'Жою мүмкін болатын ең көп беттер саны',
+	'nuke-editby' => '[[Special:Contributions/$1|{{GENDER:$1|$1}}]] бастаған',
+	'nuke-deleted' => "'''$1'''  беті жойылды.",
+	'nuke-not-deleted' => "[[:$1]] беті '''жойылмады'''.",
+	'nuke-delete-more' => '[[Special:Nuke|Басқа да беттерді жою]]',
+	'nuke-pattern' => 'Бет атауы үшін өрнек:',
+	'nuke-nopages-global' => '[[Special:RecentChanges|Жуықтағы өзгерістерде]] жаңа беттер жоқ.',
+	'nuke-viewchanges' => 'өзгерістерін көру',
+	'nuke-namespace' => 'Есім кеңістігіндегі шектеулер',
+);
+
 /** Khmer (ភាសាខ្មែរ)
  * @author Chhorran
  * @author Thearith
@@ -1513,7 +1631,7 @@ $messages['kn'] = array(
 $messages['ko'] = array(
 	'nuke' => '문서 대량 삭제',
 	'action-nuke' => '문서를 대량 삭제할',
-	'nuke-desc' => '관리자가 문서를 [[Special:Nuke|대량 삭제]]할 수 있는 기능을 추가',
+	'nuke-desc' => '관리자가 문서를 [[Special:Nuke|대량 삭제]]할 수 있는 기능을 줍니다',
 	'nuke-nopages' => '최근에 [[Special:Contributions/$1|{{GENDER:$1|$1}}]] 사용자가 만든 문서가 없습니다.',
 	'nuke-list' => '다음은 [[Special:Contributions/$1|{{GENDER:$1|$1}}]] 사용자가 최근에 만든 문서입니다.
 삭제에 대한 이유를 입력한 다음 아래 버튼을 클릭해주세요.',
@@ -1603,14 +1721,14 @@ $messages['ku-latn'] = array(
  * @author Robby
  */
 $messages['lb'] = array(
-	'nuke' => 'Masse-Läschung',
+	'nuke' => 'Masseläschung',
 	'action-nuke' => "Säiten 'en masse' ze läschen",
 	'nuke-desc' => "Gëtt Administrateuren d'Méiglechkeet fir [[Special:Nuke|vill Säite mateneen ze läschen]]",
 	'nuke-nopages' => 'Et gëtt bei de rezenten Ännerunge keng nei Säite vum [[Special:Contributions/$1|{{GENDER:$1|$1}}]].',
 	'nuke-list' => 'Dës Säite goufe viru kuerzem vum [[Special:Contributions/$1|{{GENDER:$1|$1}}]] nei ugeluecht; gitt w.e.g. eng Bemierkung an, an dréckt op de Knäppche Läschen.',
 	'nuke-list-multiple' => 'Dës Säite goufe rezent gemaach;
 setzt eng Bemierkung derbäi a klickt op de Knäppche fir se ze läschen.',
-	'nuke-defaultreason' => 'Masse-Läschung vu Säiten, déi vum [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ugefaang goufen',
+	'nuke-defaultreason' => 'Masseläschung vu Säiten, déi vum [[Special:Contributions/$1|{{GENDER:$1|$1}}]] ugefaang goufen',
 	'nuke-multiplepeople' => 'Masse-Läschung vu Säiten déi rezent derbäi gesat goufen',
 	'nuke-tools' => "Dësen Tool erlaabt vill Säite mateneen ze läschen, déi vun engem Benotzer oder vun enger IP-Adress ugeluecht goufen.
 Gitt w.e.g. d'IP-Adress respektiv de Benotzer u fir eng Lëscht vun de Säiten ze kréien déi geläscht solle ginn, oder loosst et eidel fir all Benotzer.",
@@ -1627,6 +1745,7 @@ Gitt w.e.g. d'IP-Adress respektiv de Benotzer u fir eng Lëscht vun de Säiten z
 	'nuke-pattern' => 'Muster fir de Säitennumm:',
 	'nuke-nopages-global' => 'Et si keng nei Säiten an de [[Special:RecentChanges|rezenten Ännerungen]].',
 	'nuke-viewchanges' => 'Ännerunge weisen',
+	'nuke-namespace' => 'Op dësen Nummraum limitéieren:',
 );
 
 /** Limburgish (Limburgs)
@@ -1782,21 +1901,23 @@ $messages['ml'] = array(
 	'nuke-pattern' => 'താളിന്റെ പേരിന്റെ ശൈലി:',
 	'nuke-nopages-global' => '[[Special:RecentChanges|സമീപകാലമാറ്റങ്ങളിൽ]] പുതിയ താളുകളൊന്നുമില്ല.',
 	'nuke-viewchanges' => 'മാറ്റങ്ങൾ കാണുക',
+	'nuke-namespace' => 'ഈ നാമമേഖലയിൽ ഒതുക്കുക:',
 );
 
 /** Marathi (मराठी)
  * @author Kaustubh
+ * @author V.narsikar
  */
 $messages['mr'] = array(
 	'nuke' => 'एकदम खूप पाने वगळा',
-	'nuke-desc' => 'प्रबंधकांना एकाचवेळी [[Special:Nuke|अनेक पाने वगळण्याची]] परवानगी देते',
+	'nuke-desc' => 'प्रबंधकांना  [[Special:Nuke|गठ्ठ्याने वगळण्याची(मास डिलीट)]] क्षमता देते',
 	'nuke-nopages' => '[[Special:Contributions/$1|$1]] कडून अलीकडील बदलांमध्ये नवीन पाने नाहीत.', # Fuzzy
 	'nuke-list' => 'खालील पाने ही [[Special:Contributions/$1|$1]] ने अलिकडे वाढविलेली आहेत; शेरा द्या व वगळण्यासाठी कळीवर टिचकी द्या.', # Fuzzy
 	'nuke-defaultreason' => '$1 ने नवीन वाढविलेली अनेक पाने एकावेळी वगळा', # Fuzzy
 	'nuke-tools' => 'हे उपकरण एखाद्या विशिष्ट सदस्य अथवा अंकपत्त्याद्वारे नवीन तयार करण्यात आलेल्या पानांना एकाचवेळी वगळण्याची संधी देते. सदस्य नाव अथवा अंकपत्ता दिल्यास वगळण्यासाठी पानांची यादी मिळेल:', # Fuzzy
 	'nuke-submit-user' => 'जा',
 	'nuke-submit-delete' => 'निवडलेले वगळा',
-	'right-nuke' => 'खूप पाने एकत्र वगळा',
+	'right-nuke' => 'गठ्ठ्याने पाने वगळा',
 );
 
 /** Malay (Bahasa Melayu)
@@ -1878,7 +1999,7 @@ $messages['nah'] = array(
 	'nuke-submit-user' => 'Yāuh',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Event
  * @author Nghtwlkr
  */
@@ -1923,14 +2044,14 @@ $messages['nds'] = array(
 	'right-nuke' => 'Groten Hümpel Sieden wegsmieten',
 );
 
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
  * @author Servien
  */
 $messages['nds-nl'] = array(
 	'nuke' => 'Massaal vortdoon',
 	'nuke-desc' => 'Hiermee kunnen beheerders [[Special:Nuke|massaal ziejen vortdoon]]',
-	'nuke-nopages' => 'Gien nieje ziejen van [[Special:Contributions/$1|$1]] in de leste wiezigingen.', # Fuzzy
-	'nuke-defaultreason' => 'Massaal ziejen van $1 vortdoon', # Fuzzy
+	'nuke-nopages' => 'Gien nieje ziejen van [[Special:Contributions/$1|{{GENDER:$1|$1}}]] in de leste wiezigingen.',
+	'nuke-defaultreason' => 'Massaal ziejen van [[Special:Contributions/$1|{{GENDER:$1|$1}}]] vortdoon',
 	'right-nuke' => 'Massaal ziejen vortdoon',
 );
 
@@ -2038,16 +2159,16 @@ $messages['nso'] = array(
 $messages['oc'] = array(
 	'nuke' => 'Supression en massa',
 	'nuke-desc' => 'Balha la possiblitat als administrators de [[Special:Nuke|suprimir en massa]] de paginas.',
-	'nuke-nopages' => 'Cap de pagina novèla creada per [[Special:Contributions/$1|$1]] dins la lista dels darrièrs cambiaments.', # Fuzzy
-	'nuke-list' => 'Las paginas seguentas son estadas creadas recentament per [[Special:Contributions/$1|$1]]; Indicatz un comentari e clicatz sul boton per los suprimir.', # Fuzzy
-	'nuke-defaultreason' => 'Supression en massa de las paginas apondudas per $1', # Fuzzy
-	'nuke-tools' => 'Aquesta aisina autoriza las supressions en massa de las paginas apondudas recentament per un utilizaire enregistrat o per una adreça IP. Indicatz l’adreça IP per obténer la tièra de las paginas de suprimir :', # Fuzzy
+	'nuke-nopages' => 'Cap de pagina novèla pas creada per [[Special:Contributions/$1|{{GENDER:$1|$1}}]] dins la lista dels darrièrs cambiaments.',
+	'nuke-list' => 'Las paginas seguentas son estadas creadas recentament per [[Special:Contributions/$1|{{GENDER:$1|$1}}]]; picatz un comentari e clicatz sul boton per los suprimir.',
+	'nuke-defaultreason' => 'Supression en massa de las paginas apondudas per [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
+	'nuke-tools' => 'Aquesta aisina autoriza las supressions en massa de las paginas apondudas recentament per un utilizaire enregistrat o per una adreça IP. Indicatz l’adreça IP per obténer la lista de las paginas de suprimir, o daissar blanc per totes los utilizaires.',
 	'nuke-submit-user' => 'Validar',
 	'nuke-submit-delete' => 'Supression seleccionada',
 	'right-nuke' => 'Suprimir de paginas en massa',
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Jnanaranjan Sahu
  * @author Psubhashish
  */
@@ -2084,6 +2205,7 @@ $messages['pdc'] = array(
 /** Polish (polski)
  * @author Beau
  * @author BeginaFelicysym
+ * @author Chrumps
  * @author Derbeth
  * @author Leinad
  * @author Matma Rex
@@ -2103,14 +2225,14 @@ $messages['pl'] = array(
 Wpisz powód, a następnie zatwierdź usunięcie stron.',
 	'nuke-defaultreason' => 'Masowe usunięcie stron stworzonych przez [[Special:Contributions/$1|{{GENDER:$1|$1}}]]',
 	'nuke-multiplepeople' => 'Masowe usuwanie ostatnio utworzonych stron',
-	'nuke-tools' => 'Narzędzie pozwala na masowe usuwanie stron ostatnio dodanych przez zarejestrowanego lub anonimowego użytkownika.
-Wpisz nazwę użytkownika lub adres IP by otrzymać listę stron do usunięcia. Możesz także nic nie wpisywać, wtedy będzie można masowo usunąć wkład wszystkich użytkowników.',
+	'nuke-tools' => 'Narzędzie pozwala na masowe usuwanie stron ostatnio dodanych przez zarejestrowanego lub anonimowego użytkownika.<br />
+Wpisz nazwę użytkownika lub adres IP, by otrzymać listę stron do usunięcia. Możesz także nic nie wpisywać, wtedy będzie można masowo usunąć wkład wszystkich użytkowników.',
 	'nuke-submit-user' => 'Dalej',
 	'nuke-submit-delete' => 'Usuń zaznaczone',
 	'right-nuke' => 'Masowe usuwanie stron',
 	'nuke-select' => 'Wybierz: $1',
 	'nuke-userorip' => 'Podaj nazwę użytkownika, adres IP lub pozostaw puste pole',
-	'nuke-maxpages' => 'Maksymalna liczba stron',
+	'nuke-maxpages' => 'Maksymalna liczba stron:',
 	'nuke-editby' => 'Utworzona przez {{GENDER:$1|użytkownika|użytkowniczkę}} [[Special:Contributions/$1|$1]]',
 	'nuke-deleted' => "Strona '''$1''' została usunięta.",
 	'nuke-not-deleted' => "Strony [[:$1]] '''nie można''' usunąć.",
@@ -2157,18 +2279,18 @@ ch'a buta un coment e ch'a sgnaca ël boton për scanceleje.",
  * @author Ahmed-Najib-Biabani-Ibrahimkhel
  */
 $messages['ps'] = array(
-	'nuke' => 'ټول ړنګېدنه',
+	'nuke' => 'ټول ړنگېدنه',
 	'action-nuke' => 'نيوک مخونه',
-	'nuke-multiplepeople' => 'د تازه راګډ شويو مخونو ټول ړنګېدنه',
+	'nuke-multiplepeople' => 'د تازه راگډ شويو مخونو ټول ړنگېدنه',
 	'nuke-submit-user' => 'ورځه',
-	'nuke-submit-delete' => 'ټاکل شوی ړنګول',
+	'nuke-submit-delete' => 'ټاکل شوی ړنگول',
 	'right-nuke' => 'د ډله ايز ړنګون مخونه',
 	'nuke-select' => 'ټاکل: $1',
 	'nuke-userorip' => 'کارن-نوم، آي پي پته يا تش:',
 	'nuke-maxpages' => 'د حد اکثر شمېر مخونه:',
-	'nuke-deleted' => "د '''$1''' مخ ړنګ شو.",
+	'nuke-deleted' => "د '''$1''' مخ ړنگ شو.",
 	'nuke-not-deleted' => "د [[:$1]] مخ '''نشي''' ړنګېدلی.",
-	'nuke-delete-more' => '[[Special:Nuke|لا نور مخونه ړنګول]]',
+	'nuke-delete-more' => '[[Special:Nuke|لا نور مخونه ړنگول]]',
 	'nuke-viewchanges' => 'بدلونونه کتل',
 );
 
@@ -2189,7 +2311,7 @@ introduza um comentário e clique o botão para eliminá-las.',
 	'nuke-multiplepeople' => 'vários utilizadores', # Fuzzy
 	'nuke-tools' => 'Esta ferramenta permite a eliminação em massa de páginas criadas recentemente por um utilizador ou IP específico. Forneça o nome de utilizador ou o IP para obter a lista de páginas a eliminar, ou deixe em branco para todos os utilizadores.',
 	'nuke-submit-user' => 'Ir',
-	'nuke-submit-delete' => 'Eliminar as seleccionadas',
+	'nuke-submit-delete' => 'Eliminar as selecionadas',
 	'right-nuke' => 'Eliminar páginas em massa',
 	'nuke-select' => 'Selecionar: $1',
 	'nuke-userorip' => 'Utilizador, endereço IP, ou vazio:',
@@ -2200,6 +2322,7 @@ introduza um comentário e clique o botão para eliminá-las.',
 );
 
 /** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
  * @author Carla404
  * @author Eduardo.mps
  * @author Giro720
@@ -2208,25 +2331,31 @@ introduza um comentário e clique o botão para eliminá-las.',
  */
 $messages['pt-br'] = array(
 	'nuke' => 'Eliminar de forma massiva',
+	'action-nuke' => 'eliminar páginas de forma massiva',
 	'nuke-desc' => '[[Special:Nuke|Página especial]] que permite que administradores apaguem páginas de forma massiva',
-	'nuke-nopages' => 'Não há novas páginas criadas por [[Special:Contributions/$1|$1]] nas mudanças recentes.', # Fuzzy
-	'nuke-list' => 'As páginas a seguir foram criadas recentemente por [[Special:Contributions/$1|$1]];
-forneça uma justificativa e clique no botão equivalente para eliminá-las.', # Fuzzy
+	'nuke-nopages' => 'Não há novas páginas criadas [[Special:Contributions/$1|{{GENDER:$1|pelo usuário $1|pela usuária $1|por $1}}]] nas mudanças recentes.',
+	'nuke-list' => 'As páginas a seguir foram recentemente criadas  [[Special:Contributions/$1|{{GENDER:$1|pelo usuário $1|pela usuária $1|por $1}}]];
+forneça uma justificativa e clique no botão equivalente para eliminá-las.',
 	'nuke-list-multiple' => 'As páginas a seguir foram criadas recentemente;
 forneça uma justificativa e clique no botão equivalente para eliminá-las.',
-	'nuke-defaultreason' => 'Eliminação de forma massiva de páginas criadas por $1', # Fuzzy
-	'nuke-multiplepeople' => 'Eliminação em massa de páginas recentemente adicionadas',
+	'nuke-defaultreason' => 'Eliminação em massa de páginas criadas [[Special:Contributions/$1|{{GENDER:$1|pelo usuário $1|pela usuária $1|por $1}}]]',
+	'nuke-multiplepeople' => 'Eliminação em massa de páginas criadas recentemente',
 	'nuke-tools' => 'Esta ferramenta permite que páginas criadas recentemente por um usuário ou IP específico sejam eliminadas de forma massiva.
 Insira um nome de usuário ou IP para listar páginas a eliminar; deixe em branco se deseja listar de todos os usuários.',
 	'nuke-submit-user' => 'Ir',
-	'nuke-submit-delete' => 'Eliminar as selecionadas',
+	'nuke-submit-delete' => 'Eliminar selecionadas',
 	'right-nuke' => 'Eliminar páginas de forma massiva',
 	'nuke-select' => 'Selecionar: $1',
 	'nuke-userorip' => 'Nome de usuário, endereço IP ou em branco:',
 	'nuke-maxpages' => 'Número máximo de páginas:',
-	'nuke-editby' => 'Criada por [[Special:Contributions/$1|$1]]', # Fuzzy
+	'nuke-editby' => 'Criada [[Special:Contributions/$1|{{GENDER:$1|pelo usuário $1|pela usuária $1|por $1}}]]',
 	'nuke-deleted' => 'A página ""$1"" foi excluída.',
 	'nuke-not-deleted' => "A página [[:$1]] '''não pôde''' ser excluída.",
+	'nuke-delete-more' => '[[Special:Nuke|Eliminar mais páginas]]',
+	'nuke-pattern' => 'Padrão em nomes de páginas:',
+	'nuke-nopages-global' => 'Não há novas páginas nas [[Special:RecentChanges|mudanças recentes]].',
+	'nuke-viewchanges' => 'ver alterações',
+	'nuke-namespace' => 'Limitar ao espaço nominal:',
 );
 
 /** Quechua (Runa Simi)
@@ -2515,6 +2644,7 @@ Vnesite uporabniško ime ali IP, da pridobite seznam strani za izbris, ali pusti
 );
 
 /** Serbian (Cyrillic script) (српски (ћирилица)‎)
+ * @author Milicevic01
  * @author Millosh
  * @author Rancher
  * @author Жељко Тодоровић
@@ -2524,7 +2654,7 @@ $messages['sr-ec'] = array(
 	'action-nuke' => 'масовно брисање страница',
 	'nuke-desc' => 'Даје администратору могућност да [[Special:Nuke|масовно брише]] странице.',
 	'nuke-nopages' => 'Нема нових страница од стране корисника [[Special:Contributions/$1|$1]] у скорашњим изменама.', # Fuzzy
-	'nuke-list' => 'Следеће странице је скоро направио корисник [[Special:Contributions/$1|$1]]; коментариши и притисни дугме за њихово брисање.', # Fuzzy
+	'nuke-list' => 'Следеће странице је скоро направио корисник [[Special:Contributions/$1|{{GENDER:$1|$1}}]]; оставите коментар и притисните дугме за њихово брисање.',
 	'nuke-defaultreason' => 'Масовно брисање страница које је направио корисник $1', # Fuzzy
 	'nuke-multiplepeople' => 'Масовно брисање недавно додатих страница',
 	'nuke-tools' => 'Ова алатка омогућава збирно брисање страница које је недавно додао одређени корисник (са налогом или без њега).
@@ -2544,6 +2674,7 @@ $messages['sr-ec'] = array(
 
 /** Serbian (Latin script) (srpski (latinica)‎)
  * @author Michaello
+ * @author Milicevic01
  * @author Жељко Тодоровић
  */
 $messages['sr-el'] = array(
@@ -2551,7 +2682,7 @@ $messages['sr-el'] = array(
 	'action-nuke' => 'masovno brisanje stranica',
 	'nuke-desc' => 'Daje administratoru mogućnost da [[Special:Nuke|masovno briše]] stranice.',
 	'nuke-nopages' => 'Nema novih stranica od strane korisnika [[Special:Contributions/$1|$1]] u skorašnjim izmenama.', # Fuzzy
-	'nuke-list' => 'Sledeće stranice je skoro napravio korisnik [[Special:Contributions/$1|$1]]; komentariši i pritisni dugme za njihovo brisanje.', # Fuzzy
+	'nuke-list' => 'Sledeće stranice je skoro napravio korisnik [[Special:Contributions/$1|{{GENDER:$1|$1}}]]; ostavite komentar i pritisnite dugme za njihovo brisanje.',
 	'nuke-defaultreason' => 'Masovno brisanje stranica koje je napravio korisnik $1.', # Fuzzy
 	'nuke-multiplepeople' => 'Masovno brisanje nedavno dodatih stranica',
 	'nuke-tools' => 'Ova alatka omogućava zbirno brisanje stranica koje je nedavno dodao određeni korisnik (sa nalogom ili bez njega).
@@ -2818,6 +2949,7 @@ $messages['ug-latn'] = array(
 
 /** Ukrainian (українська)
  * @author AS
+ * @author Aced
  * @author Ahonc
  * @author Base
  * @author Dim Grits
@@ -2841,7 +2973,7 @@ $messages['uk'] = array(
 	'nuke-submit-delete' => 'Вилучити обрані',
 	'right-nuke' => 'Масове вилучення сторінок',
 	'nuke-select' => 'Вибір: $1',
-	'nuke-userorip' => "Ім'я користувача, IP-адреса (за бажанням):",
+	'nuke-userorip' => "Ім'я користувача, IP-адреса (необов'язковий параметр):",
 	'nuke-maxpages' => 'Максимальна кількість сторінок:',
 	'nuke-editby' => 'Створено {{GENDER:$1|користувачем|користувачкою}} [[Special:Contributions/$1|$1]]',
 	'nuke-deleted' => "Сторінка '''$1''' була вилучена.",
@@ -2922,14 +3054,15 @@ Hãy nhập tên thành viên hoặc địa chỉ IP để lấy danh sách các
 );
 
 /** Volapük (Volapük)
+ * @author Malafaya
  * @author Smeira
  */
 $messages['vo'] = array(
 	'nuke' => 'Moükön pademi',
 	'nuke-desc' => 'Gevon guvanes fägi ad moükön padamödotis',
-	'nuke-nopages' => 'Pads nonik fa geban: [[Special:Contributions/$1|$1]] pejaföls binons su lised votükamas nulik.', # Fuzzy
-	'nuke-list' => 'Pads sököl pejafons brefabüo fa geban: [[Special:Contributions/$1|$1]]; penolös küpeti e klikolös gnobi ad moükön onis.', # Fuzzy
-	'nuke-defaultreason' => 'Moükam padas fa geban: $1 pejafölas', # Fuzzy
+	'nuke-nopages' => 'Pads nonik fa geban: [[Special:Contributions/$1|{{GENDER:$1|$1}}]] pejaföls binons su lised votükamas nulik.',
+	'nuke-list' => 'Pads sököl pejafons brefabüo fa geban: [[Special:Contributions/$1|{{GENDER:$1|$1}}]]; penolös küpeti e klikolös gnobi ad moükön onis.',
+	'nuke-defaultreason' => 'Moükam masifik padas fa [[Special:Contributions/$1|{{GENDER:$1|$1}}]] pejafölas',
 	'nuke-tools' => 'Stum at kanon moükön mödoti padas fa geban u ladet-IP semik brefabüo pejafölas. Penolös gebananemi u ladeti-IP ad dagetön lisedi padas moükovik:', # Fuzzy
 	'nuke-submit-user' => 'Ledunolöd',
 	'nuke-submit-delete' => 'Pevalöl ad pamoükön',
@@ -2986,7 +3119,7 @@ $messages['zh-hans'] = array(
 	'right-nuke' => '删除大量页面',
 	'nuke-select' => '选择：$1',
 	'nuke-userorip' => '用户名、IP地址或空白：',
-	'nuke-maxpages' => '最多页面数：',
+	'nuke-maxpages' => '最大页面数：',
 	'nuke-editby' => '由[[Special:Contributions/$1|{{GENDER:$1|$1}}]]创建',
 	'nuke-deleted' => "已删除页面'''$1'''。",
 	'nuke-not-deleted' => "'''无法'''删除[[:$1]]页面。",
@@ -2999,6 +3132,7 @@ $messages['zh-hans'] = array(
 
 /** Traditional Chinese (中文（繁體）‎)
  * @author Anakmalaysia
+ * @author Cwlin0416
  * @author Justincheng12345
  * @author Liangent
  * @author Mark85296341
@@ -3012,7 +3146,7 @@ $messages['zh-hant'] = array(
 	'nuke-list' => '以下的頁面是由[[Special:Contributions/$1|$1]]在以前所寫的；記下一個註解再點擊按鈕去刪除它們。',
 	'nuke-list-multiple' => '以下為最近創建的頁面，請填寫註釋並點擊按鈕刪除它們。',
 	'nuke-defaultreason' => '大量刪除由[[Special:Contributions/$1|$1]]所建立的頁面',
-	'nuke-multiplepeople' => '大量刪除最近添加的頁面',
+	'nuke-multiplepeople' => '大量刪除最近新增的頁面',
 	'nuke-tools' => '此工具允許大量刪除指定用戶或IP地址在最近創建的頁面。輸入用戶名或IP地址可獲取可刪除頁面列表，留白則檢索所有用戶。',
 	'nuke-submit-user' => '執行',
 	'nuke-submit-delete' => '刪除已選擇的',
diff --git a/extensions/ParserFunctions/ParserFunctions.i18n.magic.php b/extensions/ParserFunctions/ParserFunctions.i18n.magic.php
index 4fdb83eb..01a25afb 100644
--- a/extensions/ParserFunctions/ParserFunctions.i18n.magic.php
+++ b/extensions/ParserFunctions/ParserFunctions.i18n.magic.php
@@ -58,25 +58,25 @@ $magicWords['ar'] = array(
 
 /** Egyptian Spoken Arabic (مصرى) */
 $magicWords['arz'] = array(
-	'expr' => array( 0, 'تعبير', 'expr' ),
-	'if' => array( 0, 'لو', 'if' ),
-	'ifeq' => array( 0, 'لومعادلة', 'ifeq' ),
-	'ifexpr' => array( 0, 'لوتعبير', 'ifexpr' ),
-	'iferror' => array( 0, 'لوخطأ', 'iferror' ),
-	'switch' => array( 0, 'تبديل', 'switch' ),
-	'default' => array( 0, '#افتراضي', '#default' ),
-	'ifexist' => array( 0, 'لوموجود', 'ifexist' ),
-	'time' => array( 0, 'وقت', 'time' ),
-	'timel' => array( 0, 'تيمل', 'timel' ),
-	'rel2abs' => array( 0, 'ريلتوآبس', 'rel2abs' ),
-	'titleparts' => array( 0, 'أجزاء_العنوان', 'titleparts' ),
-	'len' => array( 0, 'لين', 'len' ),
-	'pos' => array( 0, 'بوس', 'pos' ),
-	'rpos' => array( 0, 'آربوس', 'rpos' ),
-	'sub' => array( 0, 'متفرع', 'sub' ),
-	'count' => array( 0, 'عدد', 'count' ),
-	'replace' => array( 0, 'استبدال', 'replace' ),
-	'explode' => array( 0, 'انفجار', 'explode' ),
+	'expr' => array( 0, 'تعبير' ),
+	'if' => array( 0, 'لو' ),
+	'ifeq' => array( 0, 'لومعادلة' ),
+	'ifexpr' => array( 0, 'لوتعبير' ),
+	'iferror' => array( 0, 'لوخطأ' ),
+	'switch' => array( 0, 'تبديل' ),
+	'default' => array( 0, '#افتراضي' ),
+	'ifexist' => array( 0, 'لوموجود' ),
+	'time' => array( 0, 'وقت' ),
+	'timel' => array( 0, 'تيمل' ),
+	'rel2abs' => array( 0, 'ريلتوآبس' ),
+	'titleparts' => array( 0, 'أجزاء_العنوان' ),
+	'len' => array( 0, 'لين' ),
+	'pos' => array( 0, 'بوس' ),
+	'rpos' => array( 0, 'آربوس' ),
+	'sub' => array( 0, 'متفرع' ),
+	'count' => array( 0, 'عدد' ),
+	'replace' => array( 0, 'استبدال' ),
+	'explode' => array( 0, 'انفجار' ),
 );
 
 /** South Azerbaijani (تورکجه) */
@@ -96,19 +96,19 @@ $magicWords['br'] = array(
 
 /** Chechen (нохчийн) */
 $magicWords['ce'] = array(
-	'time' => array( 0, 'хан', 'time' ),
-	'replace' => array( 0, 'хийцарна', 'замена', 'replace' ),
+	'time' => array( 0, 'хан' ),
+	'replace' => array( 0, 'хийцарна', 'замена' ),
 );
 
-/** Czech (česky) */
+/** Czech (čeština) */
 $magicWords['cs'] = array(
-	'expr' => array( 0, 'výraz', 'expr' ),
-	'if' => array( 0, 'když', 'if' ),
-	'ifexist' => array( 0, 'kdyžexist', 'ifexist' ),
-	'time' => array( 0, 'čas', 'time' ),
-	'len' => array( 0, 'délka', 'len' ),
-	'count' => array( 0, 'počet', 'count' ),
-	'replace' => array( 0, 'nahradit', 'replace' ),
+	'expr' => array( 0, 'výraz' ),
+	'if' => array( 0, 'když' ),
+	'ifexist' => array( 0, 'kdyžexist' ),
+	'time' => array( 0, 'čas' ),
+	'len' => array( 0, 'délka' ),
+	'count' => array( 0, 'počet' ),
+	'replace' => array( 0, 'nahradit' ),
 );
 
 /** German (Deutsch) */
@@ -120,6 +120,12 @@ $magicWords['de'] = array(
 	'urldecode' => array( 0, 'URLDEKODIERT:' ),
 );
 
+/** Zazaki (Zazaki) */
+$magicWords['diq'] = array(
+	'if' => array( 0, 'se' ),
+	'ifeq' => array( 0, 'sek' ),
+);
+
 /** Esperanto (Esperanto) */
 $magicWords['eo'] = array(
 	'expr' => array( 0, 'espr', 'esprimo' ),
@@ -174,6 +180,30 @@ $magicWords['fa'] = array(
 	'urldecode' => array( 0, 'نشانی‌بی‌کد' ),
 );
 
+/** French (français) */
+$magicWords['fr'] = array(
+	'expr' => array( 0, 'expr' ),
+	'if' => array( 0, 'si' ),
+	'ifeq' => array( 0, 'si=' ),
+	'ifexpr' => array( 0, 'siexpr' ),
+	'iferror' => array( 0, 'sierreur' ),
+	'switch' => array( 0, 'selon' ),
+	'default' => array( 0, '#défaut' ),
+	'ifexist' => array( 0, 'siexiste' ),
+	'time' => array( 0, 'heure' ),
+	'timel' => array( 0, 'heurel' ),
+	'rel2abs' => array( 0, 'relenabs' ),
+	'titleparts' => array( 0, 'partiestitre' ),
+	'len' => array( 0, 'nbcar' ),
+	'pos' => array( 0, 'pos' ),
+	'rpos' => array( 0, 'posr' ),
+	'sub' => array( 0, 'stxt' ),
+	'count' => array( 0, 'nb' ),
+	'replace' => array( 0, 'remplacer' ),
+	'explode' => array( 0, 'exploser' ),
+	'urldecode' => array( 0, 'décoderurl', 'decodeurl' ),
+);
+
 /** Hebrew (עברית) */
 $magicWords['he'] = array(
 	'expr' => array( 0, 'חשב' ),
@@ -208,17 +238,17 @@ $magicWords['hu'] = array(
 
 /** Indonesian (Bahasa Indonesia) */
 $magicWords['id'] = array(
-	'expr' => array( 0, 'hitung', 'expr' ),
-	'if' => array( 0, 'jika', 'if' ),
-	'ifeq' => array( 0, 'jikasama', 'ifeq' ),
-	'ifexpr' => array( 0, 'jikahitung', 'ifexpr' ),
-	'iferror' => array( 0, 'jikasalah', 'iferror' ),
-	'switch' => array( 0, 'pilih', 'switch' ),
-	'default' => array( 0, '#baku', '#default' ),
-	'ifexist' => array( 0, 'jikaada', 'ifexist' ),
-	'time' => array( 0, 'waktu', 'time' ),
-	'timel' => array( 0, 'waktu1', 'timel' ),
-	'titleparts' => array( 0, 'bagianjudul', 'titleparts' ),
+	'expr' => array( 0, 'hitung' ),
+	'if' => array( 0, 'jika' ),
+	'ifeq' => array( 0, 'jikasama' ),
+	'ifexpr' => array( 0, 'jikahitung' ),
+	'iferror' => array( 0, 'jikasalah' ),
+	'switch' => array( 0, 'pilih' ),
+	'default' => array( 0, '#baku' ),
+	'ifexist' => array( 0, 'jikaada' ),
+	'time' => array( 0, 'waktu' ),
+	'timel' => array( 0, 'waktu1' ),
+	'titleparts' => array( 0, 'bagianjudul' ),
 );
 
 /** Igbo (Igbo) */
@@ -343,8 +373,9 @@ $magicWords['mk'] = array(
 
 /** Malayalam (മലയാളം) */
 $magicWords['ml'] = array(
+	'expr' => array( 0, 'ദ്യോതകം' ),
 	'if' => array( 0, 'എങ്കിൽ' ),
-	'ifeq' => array( 0, 'സമെമെങ്കിൽ' ),
+	'ifeq' => array( 0, 'സമമെങ്കിൽ' ),
 	'ifexpr' => array( 0, 'എക്സ്പ്രെഷനെങ്കിൽ' ),
 	'iferror' => array( 0, 'പിഴവെങ്കിൽ' ),
 	'switch' => array( 0, 'മാറ്റുക' ),
@@ -352,10 +383,14 @@ $magicWords['ml'] = array(
 	'ifexist' => array( 0, 'ഉണ്ടെങ്കിൽ' ),
 	'time' => array( 0, 'സമയം' ),
 	'timel' => array( 0, 'സമയം|' ),
+	'len' => array( 0, 'നീളം' ),
+	'pos' => array( 0, 'സ്ഥാനം' ),
+	'rpos' => array( 0, 'ആപേക്ഷികസ്ഥാനം' ),
 	'sub' => array( 0, 'ഉപം' ),
 	'count' => array( 0, 'എണ്ണുക' ),
 	'replace' => array( 0, 'മാറ്റിച്ചേർക്കുക' ),
 	'explode' => array( 0, 'വിസ്ഫോടനം' ),
+	'urldecode' => array( 0, 'വിലാസഗൂഢീകരണമൊഴിവാക്കൽ' ),
 );
 
 /** Marathi (मराठी) */
@@ -382,15 +417,15 @@ $magicWords['mr'] = array(
 
 /** Low Saxon (Netherlands) (Nedersaksies) */
 $magicWords['nds-nl'] = array(
-	'if' => array( 0, 'as', 'als' ),
-	'ifeq' => array( 0, 'asgelieke', 'alsgelijk' ),
-	'ifexpr' => array( 0, 'asexpressie', 'alsexpressie' ),
-	'iferror' => array( 0, 'asfout', 'alsfout' ),
-	'default' => array( 0, '#standard', '#standaard' ),
-	'ifexist' => array( 0, 'asbesteet', 'alsbestaat' ),
-	'time' => array( 0, 'tied', 'tijd' ),
-	'timel' => array( 0, 'tiedl', 'tijdl' ),
-	'rel2abs' => array( 0, 'relatiefnaorabseluut', 'relatiefnaarabsoluut' ),
+	'if' => array( 0, 'as' ),
+	'ifeq' => array( 0, 'asgelieke' ),
+	'ifexpr' => array( 0, 'asexpressie' ),
+	'iferror' => array( 0, 'asfout' ),
+	'default' => array( 0, '#standard' ),
+	'ifexist' => array( 0, 'asbesteet' ),
+	'time' => array( 0, 'tied' ),
+	'timel' => array( 0, 'tiedl' ),
+	'rel2abs' => array( 0, 'relatiefnaorabseluut' ),
 );
 
 /** Dutch (Nederlands) */
@@ -415,10 +450,10 @@ $magicWords['nl'] = array(
 
 /** Norwegian Nynorsk (norsk nynorsk) */
 $magicWords['nn'] = array(
-	'expr' => array( 0, 'uttrykk' ),
+	'expr' => array( 0, 'uttrykk', 'uttr' ),
 	'if' => array( 0, 'om' ),
 	'ifeq' => array( 0, 'omlik' ),
-	'ifexpr' => array( 0, 'omuttrykk' ),
+	'ifexpr' => array( 0, 'omuttrykk', 'omuttr' ),
 	'iferror' => array( 0, 'omfeil' ),
 	'switch' => array( 0, 'byt' ),
 	'ifexist' => array( 0, 'omfinst' ),
@@ -427,7 +462,7 @@ $magicWords['nn'] = array(
 	'rel2abs' => array( 0, 'reltilabs' ),
 	'titleparts' => array( 0, 'titteldelar' ),
 	'len' => array( 0, 'lengd' ),
-	'replace' => array( 0, 'erstatt' ),
+	'replace' => array( 0, 'byt_ut', 'erstatt' ),
 );
 
 /** Oriya (ଓଡ଼ିଆ) */
@@ -449,14 +484,14 @@ $magicWords['ps'] = array(
 
 /** Portuguese (português) */
 $magicWords['pt'] = array(
-	'if' => array( 0, 'se', 'if' ),
-	'ifeq' => array( 0, 'seigual', 'ifeq' ),
-	'ifexpr' => array( 0, 'seexpr', 'ifexpr' ),
-	'iferror' => array( 0, 'seerro', 'iferror' ),
-	'default' => array( 0, '#padrão', '#padrao', '#default' ),
-	'ifexist' => array( 0, 'seexiste', 'ifexist' ),
-	'titleparts' => array( 0, 'partesdotítulo', 'partesdotitulo', 'titleparts' ),
-	'len' => array( 0, 'comprimento', 'len' ),
+	'if' => array( 0, 'se' ),
+	'ifeq' => array( 0, 'seigual' ),
+	'ifexpr' => array( 0, 'seexpr' ),
+	'iferror' => array( 0, 'seerro' ),
+	'default' => array( 0, '#padrão', '#padrao' ),
+	'ifexist' => array( 0, 'seexiste' ),
+	'titleparts' => array( 0, 'partesdotítulo', 'partesdotitulo' ),
+	'len' => array( 0, 'comprimento' ),
 );
 
 /** Russian (русский) */
@@ -545,22 +580,22 @@ $magicWords['uz'] = array(
 
 /** Vietnamese (Tiếng Việt) */
 $magicWords['vi'] = array(
-	'expr' => array( 0, 'côngthức' ),
+	'expr' => array( 0, 'công_thức', 'côngthức' ),
 	'if' => array( 0, 'nếu' ),
-	'ifeq' => array( 0, 'nếubằng' ),
-	'ifexpr' => array( 0, 'nếucôngthức' ),
-	'iferror' => array( 0, 'nếulỗi' ),
-	'default' => array( 0, '#mặcđịnh' ),
-	'ifexist' => array( 0, 'nếutồntại' ),
+	'ifeq' => array( 0, 'nếu_bằng', 'nếubằng' ),
+	'ifexpr' => array( 0, 'nếu_công_thức', 'nếucôngthức' ),
+	'iferror' => array( 0, 'nếu_lỗi', 'nếulỗi' ),
+	'default' => array( 0, '#mặc_định', '#mặcđịnh' ),
+	'ifexist' => array( 0, 'nếu_tồn_tại', 'nếutồntại' ),
 	'time' => array( 0, 'giờ' ),
-	'timel' => array( 0, 'giờđịaphương' ),
-	'len' => array( 0, 'sốchữ', 'sốkýtự', 'sốkítự' ),
-	'pos' => array( 0, 'vịtrí' ),
-	'rpos' => array( 0, 'vịtríphải' ),
-	'sub' => array( 0, 'chuỗicon' ),
+	'timel' => array( 0, 'giờ_địa_phương', 'giờđịaphương' ),
+	'len' => array( 0, 'số_chữ', 'sốchữ', 'số_ký_tự', 'sốkýtự', 'số_kí_tự', 'sốkítự' ),
+	'pos' => array( 0, 'vị_trí', 'vịtrí' ),
+	'rpos' => array( 0, 'vị_trí_phải', 'vịtríphải' ),
+	'sub' => array( 0, 'chuỗi_con', 'chuỗicon' ),
 	'count' => array( 0, 'số' ),
-	'replace' => array( 0, 'thaythế' ),
-	'urldecode' => array( 0, 'giảimãurl' ),
+	'replace' => array( 0, 'thay_thế', 'thaythế' ),
+	'urldecode' => array( 0, 'giải_mã_url', 'giảimãurl' ),
 );
 
 /** Yiddish (ייִדיש) */
@@ -593,4 +628,11 @@ $magicWords['zh'] = array(
 	'count' => array( 0, '计数' ),
 	'replace' => array( 0, '替换' ),
 	'explode' => array( 0, '爆炸', '炸开' ),
+);
+
+/** Simplified Chinese (中文（简体）‎) */
+$magicWords['zh-hans'] = array(
+	'ifeq' => array( 0, '若相等', '如果相等' ),
+	'default' => array( 0, '#默认' ),
+	'ifexist' => array( 0, '若有', '如果存在' ),
 );
\ No newline at end of file
diff --git a/extensions/ParserFunctions/ParserFunctions.i18n.php b/extensions/ParserFunctions/ParserFunctions.i18n.php
index 3bac1a8d..bc3d200d 100644
--- a/extensions/ParserFunctions/ParserFunctions.i18n.php
+++ b/extensions/ParserFunctions/ParserFunctions.i18n.php
@@ -235,7 +235,7 @@ $messages['arz'] = array(
 	'pfunc_expr_not_a_number' => 'فى $1: النتيجه مش رقم',
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Bishnu Saikia
  * @author Rajuonline
  */
@@ -352,16 +352,45 @@ $messages['bcc'] = array(
 	'pfunc_expr_not_a_number' => 'ته $1: نتیجه یک عددی نهنت',
 );
 
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+	'pfunc_desc' => 'Minapabuswang kan parabangay na igwang lohikal na mga punksyon',
+	'pfunc_time_error' => 'Kasalaan: Imbalidong oras.',
+	'pfunc_time_too_long' => 'Kasalaan:Grabe kadakol na #time na mga apod.',
+	'pfunc_time_too_big' => 'Kasalaan: #time minasuporta sana nin mga taon sagkod sa 9999.',
+	'pfunc_time_too_small' => 'Kasalaan: #time minasuporta sana nin mga taon magpoon 0.',
+	'pfunc_rel2abs_invalid_depth' => 'Kasalaan:Imbalidong rarom nin agihan: "$1" (nagprubar na makalaog sa sarong boko-boko sa ibabaw kan ugat nin boko-boko).',
+	'pfunc_expr_stack_exhausted' => 'Kasalaan sa pagpapasabot:An bangay ubos na.',
+	'pfunc_expr_unexpected_number' => 'Kasalaan sa pagpapasabot: Dae pinag-asahang numero.',
+	'pfunc_expr_preg_match_failure' => 'Kasalaan nin pagpapasabot: Dae pinag-aasahang pagpalya kan preg_match.',
+	'pfunc_expr_unrecognised_word' => 'Kasalaan nin pagpapasabot: Dae rekonosidong tataramon an "$1".',
+	'pfunc_expr_unexpected_operator' => 'Kasalaan nin pagpapasabot: Dae pinag-asahan an $1 na operador.',
+	'pfunc_expr_missing_operand' => 'Kasalaan nin pagpapasabot: Nawawara an halaga para sa $1.',
+	'pfunc_expr_unexpected_closing_bracket' => 'Kasalaan nin pagpapasabot: Dae pinag-asahang pagseserado kan pangudal.',
+	'pfunc_expr_unrecognised_punctuation' => 'Kasalaan nin pagpapasabot: Dae rekonosidong panbalangkay na karakter an "$1".',
+	'pfunc_expr_unclosed_bracket' => 'Kasalaan nin pagpapasabot: Dae nakaseradong pangudal.',
+	'pfunc_expr_division_by_zero' => 'Barangaan sa paagi ni sero.',
+	'pfunc_expr_invalid_argument' => 'Imbalidong argumento para sa $1: < -1 or > 1.',
+	'pfunc_expr_invalid_argument_ln' => 'Imbalidong argumento para sa ln: <= 0.',
+	'pfunc_expr_unknown_error' => 'Kasalaan nin pagpapasabot:Dae aram na kasalaan ($1).',
+	'pfunc_expr_not_a_number' => 'Sa $1:An resulta bako sarong numero.',
+	'pfunc_string_too_long' => 'Kasalaan:An panunod nagsobra sa $1 na limit nin karakter.',
+);
+
 /** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  * @author EugeneZelenko
  * @author Jim-by
  * @author Red Winged Duck
+ * @author Wizardist
  */
 $messages['be-tarask'] = array(
 	'pfunc_desc' => 'Палепшаны парсэр зь лягічнымі функцыямі',
 	'pfunc_time_error' => 'Памылка: няслушны час',
 	'pfunc_time_too_long' => 'Памылка: зашмат выклікаў функцыі #time',
 	'pfunc_time_too_big' => 'Памылка: #time падтрымлівае гады толькі ў дыяпазоне да 9999',
+	'pfunc_time_too_small' => 'Памылка: #time падтрымлівае толькі гады ад 0.',
 	'pfunc_rel2abs_invalid_depth' => 'Памылка: няслушная глыбіня шляху: «$1» (спроба доступу да вузла, які знаходзіцца вышэй карэннага)',
 	'pfunc_expr_stack_exhausted' => 'Памылка выразу: стэк перапоўнены',
 	'pfunc_expr_unexpected_number' => 'Памылка выразу: нечаканая лічба',
@@ -513,11 +542,14 @@ $messages['ca'] = array(
 
 /** Chechen (нохчийн)
  * @author Sasan700
+ * @author Умар
  */
 $messages['ce'] = array(
 	'pfunc_time_error' => 'Гlалато: хан нийса яц',
 	'pfunc_expr_stack_exhausted' => 'Яздарехь гlалат ду: хьаладуьззина татол',
 	'pfunc_expr_unrecognised_word' => 'Яздарехь гlалат ду: дойзуш доцу дош «$1»',
+	'pfunc_expr_unexpected_operator' => 'Дешнийн гӀалам : ца хаа оператор $1',
+	'pfunc_expr_unrecognised_punctuation' => 'Дешнашан гӀалат: евзина йоцу пунктуацин символ «$1»',
 );
 
 /** Czech (česky)
@@ -550,6 +582,21 @@ $messages['cs'] = array(
 	'pfunc_string_too_long' => 'Chyba: Řetězec je delší než $1 {{PLURAL:$1|znak|znaky|znaků}}, což je limit',
 );
 
+/** Welsh (Cymraeg)
+ * @author Lloffiwr
+ */
+$messages['cy'] = array(
+	'pfunc_time_error' => 'Gwall: Amser annilys',
+	'pfunc_time_too_long' => 'Gwall: Gormod o alwadau #time.',
+	'pfunc_time_too_big' => 'Gwall: nid yw #time yn cynnal blynyddoedd wedi 9999.',
+	'pfunc_time_too_small' => 'Gwall: nid yw #time yn cynnal blynyddoedd cyn 0.',
+	'pfunc_expr_unexpected_number' => 'Gwall yn y mynegiad: Rhif annisgwyl.',
+	'pfunc_expr_unclosed_bracket' => 'Gwall yn y mynegiad: Cromfach heb ei gau.',
+	'pfunc_expr_division_by_zero' => 'Yn rhannu gyda sero.',
+	'pfunc_expr_unknown_error' => 'Gwall yn y mynegiad: Gwall anhysbys ($1).',
+	'pfunc_expr_not_a_number' => "Yn $1: Nid yw'r canlyniad yn rhif.",
+);
+
 /** Danish (dansk)
  * @author Byrial
  * @author HenrikKbh
@@ -622,12 +669,14 @@ $messages['de-ch'] = array(
 /** Zazaki (Zazaki)
  * @author Aspar
  * @author Erdemaslancan
+ * @author Gorizon
  */
 $messages['diq'] = array(
 	'pfunc_desc' => 'Peserkerden fonksiyanane mantıxin weş kere',
 	'pfunc_time_error' => 'xeta: zemano nemeqbul',
 	'pfunc_time_too_long' => 'xeta:zaf zêd mesajê #timeyi',
 	'pfunc_time_too_big' => 'Xırabin: #time honke qebuliya cı hetana 9999.',
+	'pfunc_time_too_small' => 'Xırab: #time ancağ 0 serra beno qebul.',
 	'pfunc_rel2abs_invalid_depth' => 'Hata: Yolda geçersiz derinlik: "$1" (kök düğümünün üstünde bir düğüme erişmeye çalıştı)',
 	'pfunc_expr_stack_exhausted' => 'xetaya ifadeyi: stack qediya',
 	'pfunc_expr_unexpected_number' => 'xetaya ifadeyi: amaro bêtexmin',
@@ -816,14 +865,16 @@ $messages['eu'] = array(
  * @author Amire80
  * @author Ebraminio
  * @author Huji
+ * @author Reza1615
  * @author Wayiran
  */
 $messages['fa'] = array(
 	'pfunc_desc' => 'به تجزیه‌گر، دستورهای منطقی می‌افزاید',
-	'pfunc_time_error' => 'خطا: زمان غیرمجاز',
+	'pfunc_time_error' => 'خطا: زمان نامجاز',
 	'pfunc_time_too_long' => 'خطا: فراخوانی بیش از حد #time',
 	'pfunc_time_too_big' => 'خطا: #زمان تا سال ۹۹۹۹ را فقط حمایت می‌کند.',
-	'pfunc_rel2abs_invalid_depth' => 'خطا: عمق غیر مجاز در نشانی «$1» (تلاش برای دسترسی به یک نشانی فراتر از نشانی ریشه)',
+	'pfunc_time_too_small' => 'خطا: #time تنها  از سال  0 به بعد را پشتیبانی می‌کند.',
+	'pfunc_rel2abs_invalid_depth' => 'خطا: عمق نامجاز در نشانی «$1» (تلاش برای دسترسی به یک نشانی فراتر از نشانی ریشه)',
 	'pfunc_expr_stack_exhausted' => 'خطای عبارت: پشته از دست رفته',
 	'pfunc_expr_unexpected_number' => 'خطای عبارت: عدد دور از انتظار',
 	'pfunc_expr_preg_match_failure' => 'خطای عبارت: خطای preg_match دور از انتظار',
@@ -834,8 +885,8 @@ $messages['fa'] = array(
 	'pfunc_expr_unrecognised_punctuation' => 'خطای عبارت: نویسه نقطه‌گذاری شناخته نشده «$1»',
 	'pfunc_expr_unclosed_bracket' => 'خطای عبارت: پرانتز بسته‌نشده',
 	'pfunc_expr_division_by_zero' => 'تقسیم بر صفر',
-	'pfunc_expr_invalid_argument' => 'پارامتر غیر مجاز برای $1: < -۱ یا > ۱',
-	'pfunc_expr_invalid_argument_ln' => 'پارامتر غیر مجاز برای لگاریتم طبیعی: <= صفر',
+	'pfunc_expr_invalid_argument' => 'پارامتر نامجاز برای $1: < -۱ یا > ۱',
+	'pfunc_expr_invalid_argument_ln' => 'پارامتر نامجاز برای لگاریتم طبیعی: <= صفر',
 	'pfunc_expr_unknown_error' => 'خطای عبارت: خطای ناشناخته ($1)',
 	'pfunc_expr_not_a_number' => 'در $1: نتیجه عدد نیست',
 	'pfunc_string_too_long' => 'خطا: رشته از محدودیت نویسه‌ای $1 تجاوز می‌کند',
@@ -844,6 +895,7 @@ $messages['fa'] = array(
 /** Finnish (suomi)
  * @author Agony
  * @author Cimon Avaro
+ * @author Linnea
  * @author Nike
  * @author VezonThunder
  */
@@ -852,6 +904,7 @@ $messages['fi'] = array(
 	'pfunc_time_error' => 'Virhe: kelvoton aika',
 	'pfunc_time_too_long' => 'Virhe: liian monta #time-kutsua',
 	'pfunc_time_too_big' => 'Virhe: #time tukee vuosilukuja vain vuoteen 9999 asti.',
+	'pfunc_time_too_small' => 'Virhe: #time tukee vain vuosia 0:sta eteenpäin.',
 	'pfunc_rel2abs_invalid_depth' => 'Virhe: Virheellinen syvyys polussa: $1 (ei juurisolmun sisällä)',
 	'pfunc_expr_stack_exhausted' => 'Virhe lausekkeessa: pino loppui',
 	'pfunc_expr_unexpected_number' => 'Virhe lausekkeessa: odottamaton numero',
@@ -1180,6 +1233,33 @@ $messages['id'] = array(
 	'pfunc_string_too_long' => 'Kesalahan: String melebihi limit $1 karakter',
 );
 
+/** Iloko (Ilokano)
+ * @author Lam-ang
+ */
+$messages['ilo'] = array(
+	'pfunc_desc' => 'Napasayaat a parser nga adda kadagiti lohikal nga annong',
+	'pfunc_time_error' => 'Biddut: Imbalido nga oras.',
+	'pfunc_time_too_long' => 'Biddut: Adu unay dagiti panagtawag ti #time.',
+	'pfunc_time_too_big' => 'Biddut: Ti #time ket suportaranna laeng dagiti tawen aginggana iti 9999.',
+	'pfunc_time_too_small' => 'Biddut: ti #time ket suportaranna laeng dagiti tawen manipud ti 0.',
+	'pfunc_rel2abs_invalid_depth' => 'Biddut: Imbalido a kauneg iti dalan: "$1" (nagpadas a nangserrek ti nodo iti ngato ti ramut a nodo).',
+	'pfunc_expr_stack_exhausted' => 'Biddut a panangiyebkas: Naibusen ti tuon.',
+	'pfunc_expr_unexpected_number' => 'Biddut a panangiyebkas:Di nanamnama a bilang.',
+	'pfunc_expr_preg_match_failure' => 'Biddut a panangiyebkas: Di nanamnama a pannakapaay ti preg_match.',
+	'pfunc_expr_unrecognised_word' => 'Biddut a panangiyebkas: Di mabigbigan a balikas ti "$1".',
+	'pfunc_expr_unexpected_operator' => 'Biddut a panangiyebkas: Di nanamnama nga operator ti $1.',
+	'pfunc_expr_missing_operand' => 'Biddut a panangiyebkas: Napukaw nga operand para iti $1.',
+	'pfunc_expr_unexpected_closing_bracket' => 'Biddut a panangiyebkas: Di nanamnama a pangrikep a braket.',
+	'pfunc_expr_unrecognised_punctuation' => 'Biddut a panangiyebkas: Di nanamnama a karakter ti tuldek ti "$1".',
+	'pfunc_expr_unclosed_bracket' => 'Biddut a panangiyebkas: Di narikpan a braket.',
+	'pfunc_expr_division_by_zero' => 'Panagbingbingay babaen ti sero.',
+	'pfunc_expr_invalid_argument' => 'Imbalido nga argumento para iti $1: < -1 wenno > 1.',
+	'pfunc_expr_invalid_argument_ln' => 'Imbalido nga argumento para iti ln: <= 0.',
+	'pfunc_expr_unknown_error' => 'Biddut a panangiyebkas: Di ammo a biddut ($1).',
+	'pfunc_expr_not_a_number' => 'Iti $1: Ti resulta ket saan a bilang.',
+	'pfunc_string_too_long' => 'Biddut: Ti kuerdas ket nasurokanna ti limitado ti karakter iti $1.',
+);
+
 /** Ido (Ido)
  * @author Malafaya
  */
@@ -1383,9 +1463,9 @@ $messages['km'] = array(
 $messages['ko'] = array(
 	'pfunc_desc' => '파서에 논리 함수를 추가합니다',
 	'pfunc_time_error' => '오류: 시간이 잘못되었습니다.',
-	'pfunc_time_too_long' => '오류: #time을 너무 많이 썼습니다.',
+	'pfunc_time_too_long' => '오류: #time을 너무 많이 호출했습니다.',
 	'pfunc_time_too_big' => '오류: #time 함수는 9999년까지만을 지원합니다.',
-	'pfunc_time_too_small' => '오류: #time은 0년부터만 지원합니다.',
+	'pfunc_time_too_small' => '오류: #time은 0년부터만을 지원합니다.',
 	'pfunc_rel2abs_invalid_depth' => '오류: 경로 구조가 잘못되었습니다: "$1" (루트 노드 위의 노드에 접속을 시도했습니다)',
 	'pfunc_expr_stack_exhausted' => '표현 오류: 스택이 비어 있습니다.',
 	'pfunc_expr_unexpected_number' => '표현식 오류: 예상치 못한 숫자입니다.',
@@ -1401,7 +1481,7 @@ $messages['ko'] = array(
 	'pfunc_expr_invalid_argument_ln' => '자연로그의 진수가 잘못되었습니다: <= 0',
 	'pfunc_expr_unknown_error' => '표현 오류: 알 수 없는 오류($1)입니다.',
 	'pfunc_expr_not_a_number' => '$1: 결과가 숫자가 아닙니다.',
-	'pfunc_string_too_long' => '오류: $1자 제한을 초과하였습니다.',
+	'pfunc_string_too_long' => '오류: 문자열이 $1 글자 제한을 초과하였습니다.',
 );
 
 /** Colognian (Ripoarisch)
@@ -1434,12 +1514,14 @@ $messages['ksh'] = array(
 
 /** Luxembourgish (Lëtzebuergesch)
  * @author Robby
+ * @author Soued031
  */
 $messages['lb'] = array(
-	'pfunc_desc' => 'Erweidert Parser mat logesche Fonctiounen',
+	'pfunc_desc' => 'Erweidert Parser mat logesche Funktiounen',
 	'pfunc_time_error' => 'Feeler: ongëlteg Zäit',
 	'pfunc_time_too_long' => 'Feeler: ze dacks #time opgeruff',
 	'pfunc_time_too_big' => 'Feeler: #time ënnerstëtzt nëmme Jore bis 9999',
+	'pfunc_time_too_small' => 'Feeler: #time ënnerstëtzt nëmme Jore vun 0 un.',
 	'pfunc_expr_stack_exhausted' => 'Expressiouns-Feeler: Stack iwwergelaf',
 	'pfunc_expr_unexpected_number' => 'Expressiouns-Feeler: Onerwarten Zuel',
 	'pfunc_expr_unrecognised_word' => 'Expressiouns-Feeler: Onerkantent Wuert "$1"',
@@ -1498,6 +1580,13 @@ $messages['lv'] = array(
 	'pfunc_expr_division_by_zero' => 'Dalīšana ar nulli',
 );
 
+/** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
+ */
+$messages['min'] = array(
+	'pfunc_time_error' => 'Kasalahan: wakatu indak tapek',
+);
+
 /** Macedonian (македонски)
  * @author Bjankuloski06
  * @author Brest
@@ -1535,6 +1624,7 @@ $messages['ml'] = array(
 	'pfunc_time_error' => 'പിഴവ്:അസാധുവായ സമയം',
 	'pfunc_time_too_long' => 'പിഴവ്: വളരെയധികം #സമയ കാളുകൾ',
 	'pfunc_time_too_big' => 'പിഴവ്: 9999 വരെയുള്ള വർഷങ്ങൾ മാത്രമേ #time പിന്തുണയ്ക്കുന്നുള്ളു',
+	'pfunc_time_too_small' => 'പിഴവ്: 0 മുതലുള്ള വർഷങ്ങൾ മാത്രമേ #time പിന്തുണയ്ക്കുന്നുള്ളു.',
 	'pfunc_rel2abs_invalid_depth' => 'പിഴവ്: പഥത്തിൽ അസാധുവായ ആഴം: "$1" (റൂട്ട് തലത്തിനും മുകളിലുള്ള തലം എടുക്കാനുള്ള ശ്രമം)',
 	'pfunc_expr_stack_exhausted' => 'എക്സ്‌പ്രെഷൻ പിഴവ്: സ്റ്റാക്ക് പുറന്തള്ളിയിരിക്കുന്നു',
 	'pfunc_expr_unexpected_number' => 'പ്രയോഗരീതിയിൽ പിഴവ്: പ്രതീക്ഷിക്കാത്ത സംഖ്യ',
@@ -1625,7 +1715,7 @@ $messages['nah'] = array(
 	'pfunc_time_error' => 'Ahcuallōtl: ahcualli cāhuitl',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Event
  * @author Laaknor
  */
@@ -1713,7 +1803,7 @@ $messages['nl'] = array(
 	'pfunc_string_too_long' => 'Fout: De tekst is langer dan de limiet van $1 {{PLURAL:$1|karakter|karakters}}',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Eirik
  * @author Frokor
  * @author Gunnernett
@@ -1768,7 +1858,7 @@ $messages['oc'] = array(
 	'pfunc_string_too_long' => 'Error : La cadena depassa lo limit maximal de $1 caractèr{{PLURAL:$1||s}}',
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Jnanaranjan Sahu
  */
 $messages['or'] = array(
@@ -1836,6 +1926,7 @@ $messages['pms'] = array(
 	'pfunc_time_error' => 'Eror: temp nen bon',
 	'pfunc_time_too_long' => 'Eror: #time a ven ciamà tròpe vire',
 	'pfunc_time_too_big' => "Eror: #time a përmët mach j'agn fin al 9999.",
+	'pfunc_time_too_small' => "Eror: #time a përmet j'agn mach da 0.",
 	'pfunc_rel2abs_invalid_depth' => 'Eror: profondità nen bon-a ant ël përcors: "$1" (a l\'é provasse a ciamé un grop dzora a la rèis)',
 	'pfunc_expr_stack_exhausted' => "Eror ëd l'espression: stach esaurìa",
 	'pfunc_expr_unexpected_number' => "Eror ëd l'espression: nùmer pa spetà",
@@ -1872,10 +1963,11 @@ $messages['ps'] = array(
 
 /** Portuguese (português)
  * @author Hamilton Abreu
+ * @author Luckas
  * @author Malafaya
  */
 $messages['pt'] = array(
-	'pfunc_desc' => 'Adiciona funções lógicas ao analisador sintáctico',
+	'pfunc_desc' => 'Melhora o analisador sintático com funções lógicas',
 	'pfunc_time_error' => 'Erro: tempo inválido',
 	'pfunc_time_too_long' => 'Erro: demasiadas chamadas a #time',
 	'pfunc_time_too_big' => 'Erro: #time só lida com anos até 9999',
@@ -1898,6 +1990,7 @@ $messages['pt'] = array(
 );
 
 /** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
  * @author Eduardo.mps
  * @author Giro720
  */
@@ -1906,6 +1999,7 @@ $messages['pt-br'] = array(
 	'pfunc_time_error' => 'Erro: tempo inválido',
 	'pfunc_time_too_long' => 'Erro: muitas chamadas a #time',
 	'pfunc_time_too_big' => 'Erro: #time só lida com anos até 9999',
+	'pfunc_time_too_small' => 'Erro: #time suporta apenas anos superiores a 0.',
 	'pfunc_rel2abs_invalid_depth' => 'Erro: Profundidade inválida no caminho: "$1" (foi tentado o acesso a um nó acima do nó raiz)',
 	'pfunc_expr_stack_exhausted' => 'Erro de expressão: Pilha esgotada',
 	'pfunc_expr_unexpected_number' => 'Erro de expressão: Número inesperado',
@@ -2007,6 +2101,7 @@ $messages['roa-tara'] = array(
 
 /** Russian (русский)
  * @author G0rn
+ * @author Putnik
  * @author Александр Сигачёв
  */
 $messages['ru'] = array(
@@ -2014,6 +2109,7 @@ $messages['ru'] = array(
 	'pfunc_time_error' => 'Ошибка: неправильное время',
 	'pfunc_time_too_long' => 'Ошибка: слишком много вызовов функции #time',
 	'pfunc_time_too_big' => 'Ошибка. Параметр #time не может превышать 9999',
+	'pfunc_time_too_small' => 'Ошибка: #time поддерживает только года от 0.',
 	'pfunc_rel2abs_invalid_depth' => 'Ошибка: ошибочная глубина пути: «$1» (попытка доступа к узлу, находящемуся выше, чем корневой)',
 	'pfunc_expr_stack_exhausted' => 'Ошибка выражения: переполнение стека',
 	'pfunc_expr_unexpected_number' => 'Ошибка выражения: неожидаемое число',
@@ -2168,6 +2264,7 @@ $messages['sl'] = array(
 	'pfunc_time_error' => 'Napaka: neveljaven čas',
 	'pfunc_time_too_long' => 'Napaka: preveč klicev #time',
 	'pfunc_time_too_big' => 'Napaka: #time podpira samo leta do 9999',
+	'pfunc_time_too_small' => 'Napaka: #time podpira samo leta od 0.',
 	'pfunc_rel2abs_invalid_depth' => 'Napaka: Neveljavna globina poti: »$1« (poskus dostopanja do vozlišča višjega od korenskega vozlišča)',
 	'pfunc_expr_stack_exhausted' => 'Napaka v izrazu: Sklad je izčrpan',
 	'pfunc_expr_unexpected_number' => 'Napaka v izrazu: Nepričakovani število',
@@ -2311,6 +2408,7 @@ $messages['sv'] = array(
 	'pfunc_time_error' => 'Fel: ogiltig tid',
 	'pfunc_time_too_long' => 'Fel: för många anrop av #time',
 	'pfunc_time_too_big' => 'Fel: # tid stöder endast år fram till 9999',
+	'pfunc_time_too_small' => 'Fel: #tid stödjer enbart år från 0.',
 	'pfunc_rel2abs_invalid_depth' => 'Fel: felaktig djup i sökväg: "$1" (försöker nå en nod ovanför rotnoden)',
 	'pfunc_expr_stack_exhausted' => 'Fel i uttryck: Stackutrymmet tog slut',
 	'pfunc_expr_unexpected_number' => 'Fel i uttryck: Oväntat tal',
@@ -2517,6 +2615,7 @@ $messages['uk'] = array(
 	'pfunc_time_error' => 'Помилка: неправильний час',
 	'pfunc_time_too_long' => 'Помилка: забагато викликів функції #time',
 	'pfunc_time_too_big' => 'Помилка: Параметр #time підтримує роки лише до 9999.',
+	'pfunc_time_too_small' => 'Помилка: #time підтримує роки лише після 0.',
 	'pfunc_rel2abs_invalid_depth' => 'Помилка: неправильна глибина шляху: «$1» (спроба доступу до вузла, що знаходиться вище, ніж кореневий)',
 	'pfunc_expr_stack_exhausted' => 'Помилка виразу: стек переповнений',
 	'pfunc_expr_unexpected_number' => 'Помилка виразу: неочікуване число',
@@ -2585,7 +2684,7 @@ $messages['vi'] = array(
 	'pfunc_expr_unexpected_number' => 'Lỗi biểu thức: Dư số',
 	'pfunc_expr_preg_match_failure' => 'Lỗi biểu thức: Hàm preg_match thất bại',
 	'pfunc_expr_unrecognised_word' => 'Lỗi biểu thức: Từ “$1” không rõ ràng',
-	'pfunc_expr_unexpected_operator' => "Lỗi biểu thức: Dư toán tử '''$1'''",
+	'pfunc_expr_unexpected_operator' => 'Lỗi biểu thức: Dư toán tử $1',
 	'pfunc_expr_missing_operand' => 'Lỗi biểu thức: Thiếu toán hạng trong $1',
 	'pfunc_expr_unexpected_closing_bracket' => 'Lỗi biểu thức: Dư dấu đóng ngoặc',
 	'pfunc_expr_unrecognised_punctuation' => 'Lỗi biểu thức: Dấu phân cách “$1” không rõ ràng',
@@ -2654,6 +2753,7 @@ $messages['yue'] = array(
 
 /** Simplified Chinese (中文（简体）‎)
  * @author Hydra
+ * @author Hzy980512
  * @author Liangent
  * @author PhiLiP
  * @author Philip
@@ -2665,6 +2765,7 @@ $messages['zh-hans'] = array(
 	'pfunc_time_error' => '错误：无效时间',
 	'pfunc_time_too_long' => '错误：#time调用次数过多',
 	'pfunc_time_too_big' => '错误：#time只支持到9999年',
+	'pfunc_time_too_small' => '错误：#time只支持最低0年。',
 	'pfunc_rel2abs_invalid_depth' => '错误：无效路径深度：“$1”（尝试访问根节点以上节点）',
 	'pfunc_expr_stack_exhausted' => '表达式错误：堆栈耗尽',
 	'pfunc_expr_unexpected_number' => '表达式错误：未预料的数字',
@@ -2689,6 +2790,7 @@ $messages['zh-hans'] = array(
  * @author Liangent
  * @author Mark85296341
  * @author Shinjiman
+ * @author Simon Shek
  * @author Waihorace
  */
 $messages['zh-hant'] = array(
@@ -2696,6 +2798,7 @@ $messages['zh-hant'] = array(
 	'pfunc_time_error' => '錯誤：無效時間。',
 	'pfunc_time_too_long' => '錯誤：過多#time呼叫。',
 	'pfunc_time_too_big' => '錯誤：#time只支援至9999年。',
+	'pfunc_time_too_small' => '錯誤：#time只支援至0。',
 	'pfunc_rel2abs_invalid_depth' => '錯誤：無效路徑深度：「$1」（嘗試訪問頂點以上節點）',
 	'pfunc_expr_stack_exhausted' => '表達式錯誤：堆疊耗盡',
 	'pfunc_expr_unexpected_number' => '表達式錯誤：未預料的數字',
diff --git a/extensions/ParserFunctions/ParserFunctions_body.php b/extensions/ParserFunctions/ParserFunctions_body.php
index 967e8339..3567cc58 100644
--- a/extensions/ParserFunctions/ParserFunctions_body.php
+++ b/extensions/ParserFunctions/ParserFunctions_body.php
@@ -360,9 +360,6 @@ class ExtParserFunctions {
 				return $else;
 			} else {
 				$pdbk = $title->getPrefixedDBkey();
-				if ( !$parser->incrementExpensiveFunctionCount() ) {
-					return $else;
-				}
 				$lc = LinkCache::singleton();
 				$id = $lc->getGoodLinkID( $pdbk );
 				if ( $id != 0 ) {
@@ -372,6 +369,9 @@ class ExtParserFunctions {
 					$parser->mOutput->addLink( $title, 0 );
 					return $else;
 				}
+				if (  !$parser->incrementExpensiveFunctionCount() ) {
+					return $else;
+				}
 				$id = $title->getArticleID();
 				$parser->mOutput->addLink( $title, $id );
 				if ( $id ) {
diff --git a/extensions/PdfHandler/PdfHandler.i18n.php b/extensions/PdfHandler/PdfHandler.i18n.php
index 391dfb91..8f259998 100644
--- a/extensions/PdfHandler/PdfHandler.i18n.php
+++ b/extensions/PdfHandler/PdfHandler.i18n.php
@@ -87,7 +87,7 @@ $messages['arz'] = array(
 	'pdf_page_error' => 'رقم الصفحة ليس فى النطاق',
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Bishnu Saikia
  */
 $messages['as'] = array(
@@ -128,6 +128,19 @@ $messages['ba'] = array(
 	'pdf_page_error' => 'Бит һаны биттәр һанынан ашҡан',
 );
 
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+	'pdf-desc' => 'An tagapagkapot para sa pagtatanaw kan PDF na mga sagunson na yaon sa moda nin imahe.',
+	'pdf_no_metadata' => 'Dae makakakua nin datos na meta gikan sa PDF.',
+	'pdf_page_error' => 'An numero kan pahina dae tabi abot.',
+	'exif-pdf-producer' => 'Programa nin kombersyon',
+	'exif-pdf-version' => 'Bersyon kan PDF pormat',
+	'exif-pdf-encrypted' => 'Enkriptado',
+	'exif-pdf-pagesize' => 'Sukol kan pahina',
+);
+
 /** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  * @author EugeneZelenko
  * @author Jim-by
@@ -203,6 +216,7 @@ $messages['ce'] = array(
 	'pdf-desc' => 'Хьажа аттон кечйо PDF-файлаш суьрта куьцехь',
 	'pdf_no_metadata' => 'схьацаэцало чура бух оцу PDF',
 	'pdf_page_error' => 'Агlон терахь дозан чулацамца дац',
+	'exif-pdf-pagesize' => 'АгӀона барам',
 );
 
 /** Sorani Kurdish (کوردی)
@@ -310,6 +324,13 @@ $messages['el'] = array(
 	'pdf_page_error' => 'Αριθμός σελίδας εκτός ορίου',
 );
 
+/** British English (British English)
+ * @author Shirayuki
+ */
+$messages['en-gb'] = array(
+	'exif-pdf-producer' => 'Conversion programme',
+);
+
 /** Esperanto (Esperanto)
  * @author Yekrats
  */
@@ -358,7 +379,7 @@ $messages['et'] = array(
  * @author Wayiran
  */
 $messages['fa'] = array(
-	'pdf-desc' => 'گرداننده‌ای برای مشاهده فایل های پی‌دی‌اف در حالت تصویر',
+	'pdf-desc' => 'گرداننده‌ای برای مشاهدهٔ پرونده‌های پی‌دی‌اف در حالت تصویر',
 	'pdf_no_metadata' => 'نمی‌توان فراداده‌ها را از پی‌دی‌اف گرفت',
 	'pdf_page_error' => 'شماره صفحه در محدوده نیست',
 	'exif-pdf-producer' => 'برنامهٔ مبدل',
@@ -636,7 +657,7 @@ $messages['ksh'] = array(
 	'exif-pdf-pagesize' => 'Dä Sigg(e) ier Jrüüße', # Fuzzy
 );
 
-/** Kirghiz (Кыргызча)
+/** Kyrgyz (Кыргызча)
  * @author Chorobek
  */
 $messages['ky'] = array(
@@ -651,6 +672,7 @@ $messages['lb'] = array(
 	'pdf-desc' => '"Programm" den et erméiglecht PDF-Fichieren als Bild ze kucken',
 	'pdf_no_metadata' => 'Meta-Informatiounen aus dem PDF Dokument kënnen net gelies ginn',
 	'pdf_page_error' => "D'Säitenzuel ass net an dem Beräich.",
+	'exif-pdf-producer' => 'Ëmwandlungsprogramm',
 	'exif-pdf-version' => 'Versioun vum PDF-Format',
 	'exif-pdf-encrypted' => 'Verschlësselt',
 	'exif-pdf-pagesize' => 'Gréisst vun der Säit',
@@ -665,6 +687,13 @@ $messages['li'] = array(
 	'pdf_page_error' => 'paginanómmer besteit neet',
 );
 
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+	'exif-pdf-pagesize' => 'انازه بلگه',
+);
+
 /** Lithuanian (lietuvių)
  * @author Matasg
  */
@@ -705,11 +734,12 @@ $messages['ml'] = array(
 /** Marathi (मराठी)
  * @author Kaustubh
  * @author Sankalpdravid
+ * @author V.narsikar
  */
 $messages['mr'] = array(
 	'pdf-desc' => 'चित्र मोडमध्ये पीडीएफ संचिका पाहण्यासाठी आवश्यक प्रणाली',
 	'pdf_no_metadata' => 'पीडीएफमधून मेटाडाटा घेऊ शकत नाही',
-	'pdf_page_error' => 'पान क्रमांक सीमेमध्ये नाही',
+	'pdf_page_error' => 'पान क्रमांक आवाक्यात नाही',
 );
 
 /** Malay (Bahasa Melayu)
@@ -732,7 +762,7 @@ $messages['mt'] = array(
 	'pdf_page_error' => 'In-numru tal-paġna ma jinsabx fl-intervall',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Jsoby
  */
 $messages['nb'] = array(
@@ -750,16 +780,16 @@ $messages['nb'] = array(
  * @author Wiki13
  */
 $messages['nl'] = array(
-	'pdf-desc' => 'Handelt PDF-bestanden af en maakt het mogelijk ze als afbeeldingen te bekijken',
-	'pdf_no_metadata' => 'De metadata van het PDF-bestand kan niet uitgelezen worden',
+	'pdf-desc' => 'Handelt pdfbestanden af en maakt het mogelijk ze als afbeeldingen te bekijken',
+	'pdf_no_metadata' => 'De metadata van het pdfbestand kan niet uitgelezen worden',
 	'pdf_page_error' => 'Het paginanummer ligt niet binnen het bereik',
 	'exif-pdf-producer' => 'Conversieprogramma',
-	'exif-pdf-version' => 'Versie van PDF-opmaak',
+	'exif-pdf-version' => 'Versie van pdfopmaak',
 	'exif-pdf-encrypted' => 'Versleuteld',
 	'exif-pdf-pagesize' => 'Papierformaat',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Harald Khan
  * @author Njardarlogar
  */
@@ -782,7 +812,7 @@ $messages['oc'] = array(
 	'exif-pdf-pagesize' => 'Talha de la pagina',
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Jnanaranjan Sahu
  * @author Psubhashish
  */
@@ -1150,11 +1180,12 @@ $messages['zh-hans'] = array(
 );
 
 /** Traditional Chinese (中文（繁體）‎)
+ * @author Justincheng12345
  * @author Mark85296341
  * @author Simon Shek
  */
 $messages['zh-hant'] = array(
-	'pdf-desc' => '在圖片模式中 PDF 檔的處理器',
+	'pdf-desc' => '在圖片模式中查看PDF檔案的處理器',
 	'pdf_no_metadata' => '無法在 PDF 中擷取元數據',
 	'pdf_page_error' => '頁數不在範圍中',
 	'exif-pdf-producer' => '轉換程式',
diff --git a/extensions/PdfHandler/PdfHandler_body.php b/extensions/PdfHandler/PdfHandler_body.php
index 73ce1b58..8fa6719b 100644
--- a/extensions/PdfHandler/PdfHandler_body.php
+++ b/extensions/PdfHandler/PdfHandler_body.php
@@ -315,7 +315,7 @@ class PdfHandler extends ImageHandler {
 	 */
 	function pageCount( $image ) {
 		$data = $this->getMetaArray( $image );
-		if ( !$data ) {
+		if ( !$data || !isset( $data['Pages'] ) ) {
 			return false;
 		}
 		return intval( $data['Pages'] );
diff --git a/extensions/Poem/Poem.i18n.php b/extensions/Poem/Poem.i18n.php
index 26fecca6..7f5157f5 100644
--- a/extensions/Poem/Poem.i18n.php
+++ b/extensions/Poem/Poem.i18n.php
@@ -310,7 +310,7 @@ $messages['id'] = array(
  * @author Lam-ang
  */
 $messages['ilo'] = array(
-	'poem-desc' => 'Ikkan na iti<code>&lt;poem&gt;</code> nga tag para ti pagporma ti daniw',
+	'poem-desc' => 'Agnayon ti etiketa ti <code>&lt;poem&gt;</code> para iti panagporma ti daniw',
 );
 
 /** Italian (italiano)
@@ -360,9 +360,10 @@ $messages['km'] = array(
 
 /** Korean (한국어)
  * @author ToePeu
+ * @author 아라
  */
 $messages['ko'] = array(
-	'poem-desc' => '시 형식을 위해 <code>&lt;poem&gt;</code> 태그를 추가',
+	'poem-desc' => '시 형식을 위해 <code>&lt;poem&gt;</code> 태그를 추가합니다',
 );
 
 /** Colognian (Ripoarisch)
@@ -402,10 +403,11 @@ $messages['lus'] = array(
 );
 
 /** Latvian (latviešu)
+ * @author Papuass
  * @author Xil
  */
 $messages['lv'] = array(
-	'poem-desc' => 'Pievieno <code>&lt;poem&gt;</code> tagu dzejas formatēšanai',
+	'poem-desc' => 'Pievieno <code>&lt;poem&gt;</code> iezīmi dzejas formatēšanai',
 );
 
 /** Macedonian (македонски)
@@ -437,7 +439,7 @@ $messages['ms'] = array(
 	'poem-desc' => 'Menambah tag <code>&lt;poem&gt;</code> untuk pemformatan puisi',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  */
 $messages['nb'] = array(
 	'poem-desc' => 'Legger til taggen <code>&lt;poem&gt;</code> for å kunne formatere dikt',
@@ -457,7 +459,7 @@ $messages['nl'] = array(
 	'poem-desc' => 'Voegt de tag <code>&lt;poem&gt;</code> toe voor de opmaak van poëzie',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Harald Khan
  */
 $messages['nn'] = array(
@@ -489,7 +491,7 @@ $messages['pms'] = array(
  * @author Ahmed-Najib-Biabani-Ibrahimkhel
  */
 $messages['ps'] = array(
-	'poem-desc' => 'د شعر بڼه ورکولو کړنې لپاره د <tt>&lt;شعر&gt;</tt> وييکه ورګډوي',
+	'poem-desc' => 'د شعر بڼه ورکولو کړنې لپاره د <tt>&lt;شعر&gt;</tt> وييکه ورگډوي',
 );
 
 /** Portuguese (português)
diff --git a/extensions/README b/extensions/README
index 66236e85..e8150623 100644
--- a/extensions/README
+++ b/extensions/README
@@ -27,4 +27,4 @@ The following code snippet lets you override the default path:
  if( $IP === false ) {
 	$IP = __DIR__ . '/../..';
  }
- require_once( "$IP/maintenance/Maintenance.php" ); // a MediaWiki core file
+ require_once "$IP/maintenance/Maintenance.php"; // a MediaWiki core file
diff --git a/extensions/Renameuser/README b/extensions/Renameuser/README
index e44aaafe..a344ebf6 100644
--- a/extensions/Renameuser/README
+++ b/extensions/Renameuser/README
@@ -1,4 +1,4 @@
-These is the readme file for the MediaWiki Renameuser extension.
+This is the readme file for the MediaWiki Renameuser extension.
 
 Extension page on mediawiki.org: https://www.mediawiki.org/wiki/Extension:Renameuser
 Latest version of the readme file: https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/Renameuser.git;a=blob;f=README
diff --git a/extensions/Renameuser/Renameuser.alias.php b/extensions/Renameuser/Renameuser.alias.php
index 2331b4c5..6ac6f8cf 100644
--- a/extensions/Renameuser/Renameuser.alias.php
+++ b/extensions/Renameuser/Renameuser.alias.php
@@ -5,6 +5,7 @@
  * @file
  * @ingroup Extensions
  */
+// @codingStandardsIgnoreFile
 
 $specialPageAliases = array();
 
@@ -58,7 +59,12 @@ $specialPageAliases['ca'] = array(
 	'Renameuser' => array( 'Reanomena_usuari' ),
 );
 
-/** Czech (česky) */
+/** Chechen (нохчийн) */
+$specialPageAliases['ce'] = array(
+	'Renameuser' => array( 'Декъашхочун_цӀе_хийца' ),
+);
+
+/** Czech (čeština) */
 $specialPageAliases['cs'] = array(
 	'Renameuser' => array( 'Přejmenovat_uživatele' ),
 );
@@ -70,7 +76,7 @@ $specialPageAliases['de'] = array(
 
 /** Zazaki (Zazaki) */
 $specialPageAliases['diq'] = array(
-	'Renameuser' => array( 'NamedayışêKarberi' ),
+	'Renameuser' => array( 'NamedayışéKarberi' ),
 );
 
 /** Lower Sorbian (dolnoserbski) */
@@ -190,7 +196,7 @@ $specialPageAliases['km'] = array(
 
 /** Korean (한국어) */
 $specialPageAliases['ko'] = array(
-	'Renameuser' => array( '이름바꾸기', '계정이름바꾸기', '사용자이름바꾸기' ),
+	'Renameuser' => array( '이름바꾸기', '사용자이름바꾸기', '계정이름바꾸기' ),
 );
 
 /** Colognian (Ripoarisch) */
@@ -338,6 +344,11 @@ $specialPageAliases['tr'] = array(
 	'Renameuser' => array( 'KullanıcıAdınıDeğiştir', 'KullanıcıİsminiDeğiştir' ),
 );
 
+/** Ukrainian (українська) */
+$specialPageAliases['uk'] = array(
+	'Renameuser' => array( 'Перейменувати_користувача' ),
+);
+
 /** Vietnamese (Tiếng Việt) */
 $specialPageAliases['vi'] = array(
 	'Renameuser' => array( 'Đổi_tên_thành_viên', 'Đổi_tên_người_dùng' ),
diff --git a/extensions/Renameuser/Renameuser.i18n.php b/extensions/Renameuser/Renameuser.i18n.php
index 25d90ebe..795390bc 100644
--- a/extensions/Renameuser/Renameuser.i18n.php
+++ b/extensions/Renameuser/Renameuser.i18n.php
@@ -65,8 +65,10 @@ The rename log is provided below for reference.', # Supports GENDER
  * @author Umherirrender
  */
 $messages['qqq'] = array(
-	'renameuser' => '{{doc-special|RenameUser}}',
-	'renameuser-linkoncontribs' => 'Link description used on [[Special:Contributions]] and [[Special:DeletedContributions]]. Only added if a user has rights to rename users.',
+	'renameuser' => '{{doc-special|RenameUser}}
+{{Identical|Rename user}}',
+	'renameuser-linkoncontribs' => 'Link description used on [[Special:Contributions]] and [[Special:DeletedContributions]]. Only added if a user has rights to rename users.
+{{Identical|Rename user}}',
 	'renameuser-linkoncontribs-text' => 'Tooltip for {{msg-mw|renameuser-linkoncontribs}}.',
 	'renameuser-desc' => '{{desc|name=Rename user|url=http://www.mediawiki.org/wiki/Extension:Renameuser}}',
 	'renameuser-summary' => '{{notranslate}}',
@@ -134,11 +136,14 @@ Parameters:
 	'logentry-renameuser-renameuser-legaciest' => 'Used in [[Special:Log/renameuser]]. {{logentry}}
 Note that only user name is included in this legacy log entry, everything else is hardcoded into log comment.',
 	'renameuser-move-log' => 'Reason for a page move when a page is moved because of a user rename. Parameters:
-* $1 is the old username;
-* $2 is the new username.',
-	'action-renameuser' => '{{Doc-action|renameuser}}',
-	'right-renameuser' => '{{doc-right|renameuser}}',
-	'renameuser-renamed-notice' => 'This message supports the use of GENDER with parameter $1.',
+* $1 - the old username
+* $2 - the new username',
+	'action-renameuser' => '{{Doc-action|renameuser}}
+{{Identical|Rename user}}',
+	'right-renameuser' => '{{doc-right|renameuser}}
+{{Identical|Rename user}}',
+	'renameuser-renamed-notice' => 'Parameters:
+* $1 - (Optional) username, for GENDER support',
 );
 
 /** Afrikaans (Afrikaans)
@@ -315,7 +320,7 @@ $messages['arz'] = array(
 	'right-renameuser' => 'غير اسم اليوزرز',
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Bishnu Saikia
  * @author Gitartha.bordoloi
  */
@@ -506,13 +511,42 @@ $messages['bcc'] = array(
 
 /** Bikol Central (Bikol Central)
  * @author Filipinayzd
+ * @author Geopoet
  */
 $messages['bcl'] = array(
+	'renameuser' => 'Pangarani otro an paragamit',
+	'renameuser-linkoncontribs' => 'pangarani otro an paragamit',
+	'renameuser-linkoncontribs-text' => 'Pangarani otro ining paragamit',
+	'renameuser-desc' => "Minadugang nin sarong [[Special:Renameuser|espesyal na pahina]] tanganing pangaranan otro an sarong paragamit (kaipuhan an ''renameuser'' na katanosan)",
+	'renameuserold' => 'Sa ngunyan na ngaran-paragamit:',
+	'renameusernew' => 'Baguhong ngaran-paragamit:',
+	'renameuserreason' => 'Rason:',
+	'renameusermove' => 'Ibalyo an paragamit asin mga pahina nin orolayan (asin an saindang mga sub-pahina) pasiring sa baguhong pangaran',
+	'renameusersuppress' => 'Dae magmukna nin mga panlikwat pasiring sa baguhong pangaran',
+	'renameuserreserve' => 'Kubkubon an lumaong ngaran-paragamit na magagamit sa paabuton',
+	'renameuserwarnings' => 'Mga Patanid:',
+	'renameuserconfirm' => 'Iyo, pangarani otro an paragamit',
 	'renameusersubmit' => 'Isumitir',
+	'renameuser-submit-blocklog' => 'Ipahiling an talaan kan kinubkob para sa paragamit',
 	'renameusererrordoesnotexist' => 'An parágamit "<nowiki>$1</nowiki>" mayò man',
 	'renameusererrorexists' => 'An parágamit "<nowiki>$1</nowiki>" yaon na',
-	'renameuser-page-moved' => 'An páhinang $1 piglipat sa $2.',
-	'renameuser-page-unmoved' => 'An páhinang $1 dai mailipat sa $2.',
+	'renameusererrorinvalid' => 'An ngaran-paragamit "<nowiki>$1</nowiki>" sarong imbalido.',
+	'renameuser-error-request' => 'Nagkaigwa nin sarong problema sa pagreresibe kan hinahagad.
+Pakibalik tabi asin otroha giraray.',
+	'renameuser-error-same-user' => 'Ika dae makakapangaran otro nin sarong paragamit na kaparehong bagay na siring sa dati.',
+	'renameusersuccess' => 'An paragamit "<nowiki>$1</nowiki>" pinagngaranan otro na magin "<nowiki>$2</nowiki>".',
+	'renameuser-page-exists' => 'An pahina na $1 eksistido na asin dae tabi awtomatikong masasalambawan.',
+	'renameuser-page-moved' => 'An páhinang $1 pinagbalyo na sa $2.',
+	'renameuser-page-unmoved' => 'An páhinang $1 dai maipagbabalyo pasiring sa $2.',
+	'log-name-renameuser' => 'Talaan nin paragamit na pinagngaranan otro',
+	'log-description-renameuser' => 'Iyo ini an sarong talaan kan mga kaliwatan sa mga pangaran nin paragamit.',
+	'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|pinagngaranan otro}} paragamit $4 ({{PLURAL:$6|$6 pagliwat|$6 mga pagliwat}}) na magin $5',
+	'logentry-renameuser-renameuser-legacier' => '$1 pinagngaranan otro an paragamit na si $4 na magin $5',
+	'renameuser-move-log' => 'Awtomatikong pinagbalyo an pahina mantang pinapangaranan otro an paragamit "[[User:$1|$1]]" na magin "[[User:$2|$2]]"',
+	'action-renameuser' => 'pangaranan otro an mga paragamit',
+	'right-renameuser' => 'Pangarani otro an mga paragamit',
+	'renameuser-renamed-notice' => 'Ining paragamit pinagngaranan otro.
+An talaan kan pagpangaran otrol pinagtao sa ibaba para sa reperensiya.',
 );
 
 /** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
@@ -754,10 +788,16 @@ A continuació es proporciona el registre de reanomenaments per a més informaci
  * @author Умар
  */
 $messages['ce'] = array(
-	'renameuser' => 'Декъашхон цlе хийца',
-	'renameuser-linkoncontribs' => 'декъашхон цlе хийца',
+	'renameuser' => 'Декъашхочун цӀе хийца',
+	'renameuser-linkoncontribs' => 'декъашхочун цӀе хийца',
 	'renameuserreason' => 'Бахьан:',
+	'renameusersubmit' => 'Кхочушдé',
+	'renameuser-page-exists' => 'Агӏо $1 йолуш ю цундела и ша юху дӏаязъян йиш яц.',
 	'renameuser-page-moved' => 'АгӀона $1 цӀе хийцина оцу $2.',
+	'log-name-renameuser' => 'Декъашхойн цӀераш хийцар долу тептар',
+	'renameuser-move-log' => 'Автоматически декъашхочун цӀе хийцина дела «[[User:$1|$1]]» оцу «[[User:$2|$2]]»',
+	'action-renameuser' => 'декъашхойн цӀераш хийцар',
+	'right-renameuser' => 'декъашхойн цӀераш хийцар',
 );
 
 /** Sorani Kurdish (کوردی)
@@ -766,6 +806,8 @@ $messages['ce'] = array(
 $messages['ckb'] = array(
 	'renameusersubmit' => 'ناردن',
 	'log-name-renameuser' => 'لۆگی گۆڕینی ناوی بەکارھێنەر',
+	'logentry-renameuser-renameuser' => '$1 ناوی بەکارھێنەر $4ی ({{PLURAL:$6|$6 دەستکاری}}) {{GENDER:$2|گۆڕی}} بۆ $5',
+	'right-renameuser' => 'گۆڕینی ناوی بەکارھێنەران',
 );
 
 /** Crimean Turkish (Cyrillic script) (къырымтатарджа (Кирилл)‎)
@@ -832,7 +874,7 @@ $messages['cu'] = array(
 	'renameuser' => 'прѣимєноуи польꙃєватєл҄ь',
 	'renameuserold' => 'нꙑнѣщьнѥѥ имѧ :',
 	'renameusernew' => 'ново имѧ :',
-	'renameuserreason' => 'какъ съмꙑслъ :', # Fuzzy
+	'renameuserreason' => 'какъ съмꙑслъ :',
 	'renameusermove' => 'нарьци тако польꙃєватєлꙗ страницѫ · бєсѣдѫ и ихъ подъстраницѧ',
 	'renameusersubmit' => 'єи',
 	'renameusererrordoesnotexist' => 'польꙃєватєлꙗ ⁖ <nowiki>$1</nowiki> ⁖ нѣстъ',
@@ -840,6 +882,7 @@ $messages['cu'] = array(
 	'renameusererrorinvalid' => 'имѧ ⁖ <nowiki>$1</nowiki> ⁖ нѣстъ годѣ',
 	'log-name-renameuser' => 'польꙃєватєлъ прѣимєнованиꙗ їсторїꙗ',
 	'log-description-renameuser' => 'сѥ ѥстъ їсторїꙗ польꙃєватєльскъ имєнъ иꙁмѣнѥниꙗ',
+	'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|нарєчє}} польꙃєватєлъ ⁖ $4 ⁖ ({{PLURAL:$6|$6 мѣна|$6 мѣни|$6 мѣнъ}}) имєньмь ⁖ $5 ⁖',
 );
 
 /** Chuvash (Чӑвашла)
@@ -979,6 +1022,7 @@ Zur Information folgt das Benutzernamenänderungs-Logbuch.',
 /** Zazaki (Zazaki)
  * @author Aspar
  * @author Erdemaslancan
+ * @author Gorizon
  * @author Mirzali
  * @author Xoser
  */
@@ -993,7 +1037,7 @@ $messages['diq'] = array(
 	'renameusermove' => 'nameyê karberan u pelê werêaameyişan bıkırışi nameyo newe',
 	'renameusersuppress' => 'Name de newi re hetenayışo newe vıraştış',
 	'renameuserreserve' => 'nameyê karberi yo verini bloke bıker.',
-	'renameuserwarnings' => 'hişyariyi',
+	'renameuserwarnings' => 'İğtari:',
 	'renameuserconfirm' => 'bele karberi newe ra name bıker',
 	'renameusersubmit' => 'bierşawê/biruşnê',
 	'renameuser-submit-blocklog' => 'Rocekanê bloqandê karbari bıvin',
@@ -1062,6 +1106,7 @@ Protokol pśemjenjowanjow jo dołojce ako referenca pódany.',
  * @author Badseed
  * @author Consta
  * @author Dead3y3
+ * @author Geraki
  * @author Glavkos
  * @author Kiriakos
  * @author MF-Warburg
@@ -1082,6 +1127,7 @@ $messages['el'] = array(
 	'renameuserwarnings' => 'Προειδοποιήσεις:',
 	'renameuserconfirm' => 'Ναι, μετονομάστε τον χρήστη',
 	'renameusersubmit' => 'Καταχώριση',
+	'renameuser-submit-blocklog' => 'Εμφάνιση μητρώου φραγών του χρήστη',
 	'renameusererrordoesnotexist' => 'Ο χρήστης "<nowiki>$1</nowiki>" δεν υπάρχει',
 	'renameusererrorexists' => 'Ο χρήστης "<nowiki>$1</nowiki>" υπάρχει ήδη.',
 	'renameusererrorinvalid' => 'Το όνομα χρήστη "<nowiki>$1</nowiki>" είναι άκυρο.',
@@ -1092,6 +1138,9 @@ $messages['el'] = array(
 	'renameuser-page-moved' => 'Η σελίδα $1 μετακινήθηκε στο $2.',
 	'renameuser-page-unmoved' => 'Η σελίδα $1 δεν μπόρεσε να μετακινηθεί στο $2.',
 	'log-name-renameuser' => 'Αρχείο μετονομασίας χρηστών',
+	'log-description-renameuser' => 'Αυτό είναι ένα αρχείο καταγραφής αλλαγών σε ονόματα χρηστών',
+	'logentry-renameuser-renameuser' => '{{GENDER:$2|Ο|Η}} $1 μετονόμασε {{GENDER:$4|το χρήστη|τη χρήστρια}} $4 ({{PLURAL:$6|$6 επεξεργασία|$6 επεξεργασίες}}) σε $5',
+	'logentry-renameuser-renameuser-legacier' => '{{GENDER:$2|Ο|Η}} $1 μετονόμασε {{GENDER:$4|το χρήστη|τη χρήστρια}} $4 σε $5',
 	'renameuser-move-log' => 'Η σελίδα μετακινήθηκε αυτόματα κατά τη μετονομασία του χρήστη "[[User:$1|$1]]" σε "[[User:$2|$2]]"',
 	'action-renameuser' => 'μετονομασία χρηστών',
 	'right-renameuser' => 'Μετονομασία χρηστών',
@@ -1149,6 +1198,7 @@ Jen la protokolo pri renomigado por via referenco.',
  * @author Jatrobat
  * @author Lin linao
  * @author Locos epraix
+ * @author MarcoAurelio
  * @author Ralgis
  * @author Remember the dot
  * @author Sanbec
@@ -1252,7 +1302,7 @@ $messages['eu'] = array(
 	'renameusererrorinvalid' => '"<nowiki>$1</nowiki>" erabiltzaile izena okerra da',
 	'renameusersuccess' => '"<nowiki>$1</nowiki>" lankidearen izen berria "<nowiki>$2</nowiki>" da',
 	'renameuser-page-exists' => 'Badago $1 orrialdea, eta ezin da automatikoki gainidatzi.',
-	'renameuser-page-moved' => '$1 orria $2 izenera aldatu da.',
+	'renameuser-page-moved' => '«$1» orria «$2» izenera aldatu da.',
 	'renameuser-page-unmoved' => 'Ezin izan da $1 orrialdea $2(e)ra mugitu.',
 	'log-name-renameuser' => 'Erabiltzaileen izen aldaketa erregistroa',
 	'right-renameuser' => 'Lankideak berrizendatu',
@@ -1288,7 +1338,7 @@ $messages['fa'] = array(
 	'renameuser-submit-blocklog' => 'نمایش سیاههٔ بستن کاربر',
 	'renameusererrordoesnotexist' => 'نام کاربری «<nowiki>$1</nowiki>» وجود ندارد',
 	'renameusererrorexists' => 'نام کاربری «<nowiki>$1</nowiki>» استفاده شده‌است',
-	'renameusererrorinvalid' => 'نام کاربری «<nowiki>$1</nowiki>» غیر مجاز است',
+	'renameusererrorinvalid' => 'نام کاربری «<nowiki>$1</nowiki>» نامجاز است.',
 	'renameuser-error-request' => 'در دریافت درخواست مشکلی پیش آمد. لطفاً به صفحهٔ قبل بازگردید و دوباره تلاش کنید.',
 	'renameuser-error-same-user' => 'شما نمی‌توانید نام یک کاربر را به همان نام قبلی‌اش تغییر دهید.',
 	'renameusersuccess' => 'نام کاربر «<nowiki>$1</nowiki>» به «<nowiki>$2</nowiki>» تغییر یافت.',
@@ -1341,7 +1391,7 @@ $messages['fi'] = array(
 	'renameuser-page-unmoved' => 'Sivun $1 siirtäminen nimelle $2 ei onnistunut.',
 	'log-name-renameuser' => 'Tunnusten vaihdot',
 	'log-description-renameuser' => 'Tämä on loki käyttäjätunnuksien vaihdoista.',
-	'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|nimesi}} käyttäjän $4 ({{PLURAL:$6|$6 muokkaus|$6 muokkausta}}) uudelle nimelle $5', # Fuzzy
+	'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|nimesi}} käyttäjän $4 ({{PLURAL:$6|$6 muokkaus|$6 muokkausta}}) uudelle nimelle $5',
 	'logentry-renameuser-renameuser-legacier' => '$1 nimesi käyttäjän $4 uudelle nimelle $5',
 	'renameuser-move-log' => 'Siirretty automaattisesti tunnukselta ”[[User:$1|$1]]” tunnukselle ”[[User:$2|$2]]”',
 	'action-renameuser' => 'nimetä käyttäjätunnuksia uudelleen',
@@ -1360,7 +1410,7 @@ $messages['fo'] = array(
 	'renameuser-linkoncontribs-text' => 'Umdoyp henda brúkara',
 	'renameuserold' => 'Rætta brúkaranavn:',
 	'renameusernew' => 'Nýtt brúkaranavn:',
-	'renameuserreason' => 'Orsøk til nýtt navn:', # Fuzzy
+	'renameuserreason' => 'Orsøk:',
 	'renameuserwarnings' => 'Ávaringar:',
 	'renameuserconfirm' => 'Ja, gev hesum brúkara nýtt navn',
 	'renameusersubmit' => 'Send inn',
@@ -1460,6 +1510,43 @@ Volyéd tornar arriér et pués tornar èprovar.',
 Lo jornal des changements de nom est disponiblo ce-desot por enformacion.',
 );
 
+/** Northern Frisian (Nordfriisk)
+ * @author Murma174
+ */
+$messages['frr'] = array(
+	'renameuser' => 'Brüker amnääm',
+	'renameuser-linkoncontribs' => 'Brüker amnääm',
+	'renameuser-linkoncontribs-text' => 'Didiar brüker amnääm',
+	'renameuser-desc' => 'Diar komt en [[Special:Renameuser|spezial-sidj]] tu, am en brükernööm tu feranrin',
+	'renameuserold' => 'Uugenblakelk brükernööm:',
+	'renameusernew' => 'Nei brükernööm:',
+	'renameuserreason' => 'Grünj:',
+	'renameusermove' => 'Fersküüw brükersidj an diskusjuunssidj (mä onersidjen) tu di nei brükernööm',
+	'renameusersuppress' => 'Nian widjerfeerangen üüb di nei brükernööm iinracht',
+	'renameuserreserve' => 'Di ual brükernööm spere',
+	'renameuserwarnings' => 'Wäärnangen:',
+	'renameuserconfirm' => 'Ja, di brüker amnääm',
+	'renameusersubmit' => 'Auerdreeg',
+	'renameuser-submit-blocklog' => 'Sper-logbuk för didiar brüker uunwise',
+	'renameusererrordoesnotexist' => 'Son brüker "<nowiki>$1</nowiki>" jaft at ei.',
+	'renameusererrorexists' => 'Son brüker "<nowiki>$1</nowiki>" jaft at al.',
+	'renameusererrorinvalid' => 'Di brükernööm "<nowiki>$1</nowiki>" as ferkiard.',
+	'renameuser-error-request' => "Diar as wat skiaf gingen bi't aurdreegen. Ferschük det man noch ans.",
+	'renameuser-error-same-user' => 'Di nei an di ual brükernööm san likedenang.',
+	'renameusersuccess' => 'Di brüker "<nowiki>$1</nowiki>" as tu "<nowiki>$2</nowiki>" amnäämd wurden.',
+	'renameuser-page-exists' => 'Det sidj „$1“ as al diar an koon ei automaatisk auerskrewen wurd.',
+	'renameuser-page-moved' => 'Det sidj $1 as efter $2 fersköwen wurden.',
+	'renameuser-page-unmoved' => 'Det sidj $1 küd ei efter $2 fersköwen wurd.',
+	'log-name-renameuser' => 'Amnääm-logbuk',
+	'log-description-renameuser' => 'Det as det logbuk auer feranrangen faan brükernöömer.',
+	'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|hää}} brüker „$4“ (mä {{PLURAL:$6|ian feranrang|$6 feranrangen}}) tu „$5“ amnäämd.',
+	'logentry-renameuser-renameuser-legacier' => '$1 hää brüker $4 amnäämd tu $5',
+	'renameuser-move-log' => "Det sidj as bi't amnäämen faan „[[User:$1|$1]]“ tu „[[User:$2|$2]]“ automaatisk fersköwen wurden",
+	'action-renameuser' => 'brükern amnääm',
+	'right-renameuser' => 'Brükern amnääm',
+	'renameuser-renamed-notice' => "Didiar brüker as amnäämd wurden. Uun't amnääm-logbuk oner stäänt muar diartu.",
+);
+
 /** Friulian (furlan)
  * @author Klenje
  */
@@ -1640,6 +1727,7 @@ $messages['gu'] = array(
  * @author Rotem Liss
  * @author Rotemliss
  * @author YaronSh
+ * @author ערן
  */
 $messages['he'] = array(
 	'renameuser' => 'שינוי שם משתמש',
@@ -1667,8 +1755,8 @@ $messages['he'] = array(
 	'renameuser-page-unmoved' => 'לא ניתן היה להעביר את הדף $1 ל$2.',
 	'log-name-renameuser' => 'יומן שינויי שמות משתמש',
 	'log-description-renameuser' => 'זהו יומן השינויים בשמות המשתמשים.',
-	'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|שינה|שינתה}} את שם המשתמש $4 ({{PLURAL:$6|עריכה אחת|$6 עריכות}}) אל $5',
-	'logentry-renameuser-renameuser-legacier' => '$1 שינה את שם נמשתמש $4 אל $5',
+	'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|שינה|שינתה}} את שם המשתמש $4 &rlm;({{PLURAL:$6|עריכה אחת|$6 עריכות}}) אל $5',
+	'logentry-renameuser-renameuser-legacier' => '$1 {{GENDER:$2|שינה|שינתה}} את שם המשתמש $4 ל{{GRAMMAR:תחילית|$5}}',
 	'renameuser-move-log' => 'העברה אוטומטית בעקבות שינוי שם המשתמש "[[User:$1|$1]]" ל־"[[User:$2|$2]]"',
 	'action-renameuser' => 'לשנות שמות משתמש',
 	'right-renameuser' => 'שינוי שמות משתמש',
@@ -1679,36 +1767,42 @@ $messages['he'] = array(
 /** Hindi (हिन्दी)
  * @author Ansumang
  * @author Kaustubh
+ * @author Siddhartha Ghai
  */
 $messages['hi'] = array(
 	'renameuser' => 'सदस्यनाम बदलें',
 	'renameuser-linkoncontribs' => 'सदस्यनाम बदलें',
-	'renameuser-linkoncontribs-text' => 'इस सदस्य के नाम बदलें',
-	'renameuser-desc' => "सदस्यनाम बदलें (''सदस्यनाम बदलने अधिकार'' अनिवार्य)",
+	'renameuser-linkoncontribs-text' => 'इस सदस्य का नाम बदलें',
+	'renameuser-desc' => "सदस्यनाम बदलने के लिए एक [[Special:Renameuser|विशेष पृष्ठ]] जोड़ता है (''renameuser'' अधिकार आवश्यक)",
 	'renameuserold' => 'सद्य सदस्यनाम:',
 	'renameusernew' => 'नया सदस्यनाम:',
-	'renameuserreason' => 'नाम बदलने के कारण:', # Fuzzy
-	'renameusermove' => 'सदस्य पृष्ठ और वार्ता पृष्ठ (और उनके सबपेज) नये नाम की ओर भेजें',
-	'renameusersuppress' => 'नूतन नाम को अनुप्रेषित ना करें',
-	'renameuserreserve' => 'पुरानी सदस्यनाम को अवरोध करें',
+	'renameuserreason' => 'कारण:',
+	'renameusermove' => 'सदस्य पृष्ठ और वार्ता पृष्ठ (और उनके उपपृष्ठ) नये नाम पर स्थानांतरित करें',
+	'renameusersuppress' => 'नए नाम को अनुप्रेषित ना करें',
+	'renameuserreserve' => 'पुरान सदस्यनाम भविष्य में प्रयोग से अवरोधित करें',
 	'renameuserwarnings' => 'चेतावनी:',
-	'renameuserconfirm' => 'हाँ, सदस्य के नाम बदलें',
-	'renameusersubmit' => 'भेजें',
-	'renameusererrordoesnotexist' => 'सदस्य "<nowiki>$1</nowiki>" अस्तित्वमें नहीं हैं।',
-	'renameusererrorexists' => 'सदस्य "<nowiki>$1</nowiki>" पहले से अस्तित्वमें हैं।',
-	'renameusererrorinvalid' => 'सदस्यनाम "<nowiki>$1</nowiki>" गलत हैं।',
-	'renameuser-error-request' => 'यह मांग पूरी करने मे समस्या आई हैं।
-कृपया पीछे जाकर फिरसे यत्न करें।',
-	'renameuser-error-same-user' => 'आप सदस्यनाम को उसी नामसे बदल नहीं सकते हैं।',
-	'renameusersuccess' => '"<nowiki>$1</nowiki>" का सदस्यनाम "<nowiki>$2</nowiki>" कर दिया गया हैं।',
-	'renameuser-page-exists' => '$1 यह पन्ना पहले से अस्तित्वमें हैं और इसपर अपने आप पुनर्लेखन नहीं कर सकतें।',
-	'renameuser-page-moved' => '$1 का नाम बदलकर $2 कर दिया गया हैं।',
-	'renameuser-page-unmoved' => '$1 का नाम बदलकर $2 नहीं कर सकें हैं।',
-	'log-name-renameuser' => 'सदस्यनाम बदलाव सूची',
-	'renameuser-move-log' => '"[[User:$1|$1]]" को "[[User:$2|$2]]" करते वक्त अपने आप सदस्यपृष्ठ बदल दिया हैं',
-	'right-renameuser' => 'सदस्योंके नाम बदलें',
+	'renameuserconfirm' => 'हाँ, सदस्य का नाम बदलें',
+	'renameusersubmit' => 'जमा करें',
+	'renameuser-submit-blocklog' => 'सदस्य का ब्लॉक लॉग दिखाएँ',
+	'renameusererrordoesnotexist' => 'सदस्य "<nowiki>$1</nowiki>" मौजूद नहीं है।',
+	'renameusererrorexists' => 'सदस्य "<nowiki>$1</nowiki>" पहले से मौजूद है।',
+	'renameusererrorinvalid' => 'सदस्यनाम "<nowiki>$1</nowiki>" अमान्य है।',
+	'renameuser-error-request' => 'अनुरोध पाने में समस्या आई है।
+कृपया वापिस जाकर पुनः यत्न करें।',
+	'renameuser-error-same-user' => 'आप सदस्यनाम को उसी नाम से नहीं बदल सकते हैं।',
+	'renameusersuccess' => '"<nowiki>$1</nowiki>" का सदस्यनाम "<nowiki>$2</nowiki>" कर दिया गया है।',
+	'renameuser-page-exists' => '$1 पृष्ठ पहले से मौजूद है और स्वचालित रूप से पुनर्लेखित नहीं किया जा सकता।',
+	'renameuser-page-moved' => '$1 का नाम बदलकर $2 कर दिया गया है।',
+	'renameuser-page-unmoved' => '$1 का नाम बदलकर $2 नहीं किया जा सका।',
+	'log-name-renameuser' => 'सदस्यनाम बदलाव लॉग',
+	'log-description-renameuser' => 'यह सदस्य नाम में बदलावों का लॉग है।',
+	'logentry-renameuser-renameuser' => '$1 ने सदस्य $4 ({{PLURAL:$6|$6 सम्पादन}}) का नाम {{GENDER:$2|बदल}} कर $5 कर दिया',
+	'logentry-renameuser-renameuser-legacier' => '$1 ने सदस्य $4 का नाम बदल कर $5 कर दिया',
+	'renameuser-move-log' => 'सदस्य "[[User:$1|$1]]" का नाम "[[User:$2|$2]]" करते समय पृष्ठ स्वचालित रूप से स्थानांतरित कर दिया गया',
+	'action-renameuser' => 'सदस्यों के नाम बदलने',
+	'right-renameuser' => 'सदस्यों के नाम बदलें',
 	'renameuser-renamed-notice' => 'इस सदस्य का नाम बदल दिया गया है।
-संदर्भ के लिए नीचे नाम बदलने का चिट्ठा है।',
+संदर्भ के लिए नीचे नाम बदलने का लॉग है।',
 );
 
 /** Fiji Hindi (Latin script) (Fiji Hindi)
@@ -1823,6 +1917,7 @@ Protokol přemjenowanjow je deleka jako referenca podaty.',
  * @author Adam78
  * @author Dani
  * @author Dj
+ * @author Hunyadym
  * @author Tgr
  */
 $messages['hu'] = array(
@@ -1849,7 +1944,7 @@ $messages['hu'] = array(
 	'renameuser-page-moved' => '$1 át lett nevezve $2 névre',
 	'renameuser-page-unmoved' => '$1-t nem sikerült $2 névre nevezi',
 	'log-name-renameuser' => 'Felhasználóátnevezési napló',
-	'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|átnevezte}} $4 szerkesztőt ({{PLURAL:$6|egy|$6}} szerkesztés) erre: $4', # Fuzzy
+	'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|átnevezte}} $4 szerkesztőt ({{PLURAL:$6|egy|$6}} szerkesztés) erre: $5', # Fuzzy
 	'logentry-renameuser-renameuser-legacier' => '$1 átnevezte $4 szerkesztőt erre: $5',
 	'renameuser-move-log' => '„[[User:$1|$1]]” „[[User:$2|$2]]” névre való átnevezése közben automatikusan átnevezett oldal',
 	'action-renameuser' => 'felhasználó átnevezése',
@@ -1868,7 +1963,7 @@ $messages['ia'] = array(
 	'renameuser-desc' => "Adde un [[Special:Renameuser|pagina special]] pro renominar un usator (require le privilegio ''renameuser'')",
 	'renameuserold' => 'Nomine de usator actual:',
 	'renameusernew' => 'Nove nomine de usator:',
-	'renameuserreason' => 'Motivo del renomination:', # Fuzzy
+	'renameuserreason' => 'Motivo:',
 	'renameusermove' => 'Renominar etiam le paginas de usator e de discussion (e lor subpaginas) verso le nove nomine',
 	'renameusersuppress' => 'Non crear redirectiones al nove nomine',
 	'renameuserreserve' => 'Blocar le ancian nomine de usator de esser usate in le futuro',
@@ -1973,6 +2068,9 @@ Pangngaasi nga agsubli ken padasen manen.',
 	'renameuser-page-moved' => 'Ti panid $1 ket naiyalisen idiay $2.',
 	'renameuser-page-unmoved' => 'Ti panid  $1 ket saan a maiyalis idiay $2.',
 	'log-name-renameuser' => 'Listaan ti panaginaganan manen ti agar-aramat',
+	'log-description-renameuser' => 'Daytoy ket listaan kadagiti panagbalbaliw kadagiti nagan ti agar-aramat.',
+	'logentry-renameuser-renameuser' => 'Ni $1 ket {{GENDER:$2|ninagananna}} ti agar-aramat a ni $4 ({{PLURAL:$6|$6 nga inurnos|$6 kadagiti inurnos}}) iti $5',
+	'logentry-renameuser-renameuser-legacier' => 'Ni $1 ket ninagananna ti agar-aramat a ni $4 iti $5',
 	'renameuser-move-log' => 'Automatiko nga iyalis ti panid bayat a nagnaganan manen ti agar-aramat "[[User:$1|$1]]" iti "[[User:$2|$2]]"',
 	'action-renameuser' => 'inaganan manen dagiti agar-aramat',
 	'right-renameuser' => 'Inaganan manen dagiti agar-aramat',
@@ -2265,6 +2363,7 @@ $messages['kk-arab'] = array(
 );
 
 /** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author Arystanbek
  */
 $messages['kk-cyrl'] = array(
 	'renameuser' => 'Қатысушыны қайта атау',
@@ -2280,7 +2379,7 @@ $messages['kk-cyrl'] = array(
 	'renameuser-page-exists' => '$1 деген бет бар түге, және өздік түрде оның үстіне ештеңе жазылмайды.',
 	'renameuser-page-moved' => '$1 деген бет $2 деген бетке жылжытылды.',
 	'renameuser-page-unmoved' => '$1 деген бет $2 деген бетке жылжытылмады.',
-	'log-name-renameuser' => 'Қатысушыны қайта атау журналы',
+	'log-name-renameuser' => 'Қатысушыны есімін өзгеру журналы',
 	'renameuser-move-log' => '«[[User:$1|$1]]» деген қатысушы атын «[[User:$2|$2]]» дегенге ауысқанда бет өздік түрде жылжытылды',
 );
 
@@ -2362,7 +2461,7 @@ $messages['ko'] = array(
 	'renameuser' => '사용자 이름 바꾸기',
 	'renameuser-linkoncontribs' => '이름 바꾸기',
 	'renameuser-linkoncontribs-text' => '이 사용자의 계정 이름을 바꿉니다.',
-	'renameuser-desc' => "사용자 이름을 바꾸기를 위한 [[Special:Renameuser|특수 문서]]를 추가 ('''renameuser''' 권한 필요)",
+	'renameuser-desc' => "사용자 이름을 바꾸기를 위한 [[Special:Renameuser|특수 문서]]를 추가합니다 ('''renameuser''' 권한 필요)",
 	'renameuserold' => '기존 사용자 이름:',
 	'renameusernew' => '새 사용자 이름:',
 	'renameuserreason' => '이유:',
@@ -2383,8 +2482,8 @@ $messages['ko'] = array(
 	'renameuser-page-exists' => '$1 문서가 이미 존재하여 자동으로 이동하지 못했습니다.',
 	'renameuser-page-moved' => '$1 문서를 $2 문서로 옮겼습니다.',
 	'renameuser-page-unmoved' => '$1 문서를 $2 문서로 이동하지 못했습니다.',
-	'log-name-renameuser' => '이름 바꾸기 기록',
-	'log-description-renameuser' => '사용자 이름 바꾸기 기록입니다.',
+	'log-name-renameuser' => '사용자 이름 바꾸기 기록',
+	'log-description-renameuser' => '사용자 이름을 바꾼 기록입니다.',
 	'logentry-renameuser-renameuser' => '$1 사용자가 $4 사용자({{PLURAL:$6|편집 $6회}})의 이름을 $5(으)로 {{GENDER:$2|바꾸었습니다}}',
 	'logentry-renameuser-renameuser-legacier' => '$1 사용자가 $4 사용자의 이름을 $5(으)로 바꾸었습니다',
 	'renameuser-move-log' => '"[[User:$1|$1]]" 사용자를 "[[User:$2|$2]]" 사용자로 바꾸면서 문서를 자동으로 옮겼습니다',
@@ -2452,14 +2551,14 @@ $messages['ku-latn'] = array(
 	'renameusererrorinvalid' => 'Navê "<nowiki>$1</nowiki>" ji bikarhêneran re nayê qebûlkirin.',
 	'renameusersuccess' => 'Navê bikarhênerê "<nowiki>$1</nowiki>" bû "<nowiki>$2</nowiki>"',
 	'renameuser-page-exists' => 'Rûpelê $1 berê heye û nikane otomatîk were guherandin.',
-	'renameuser-page-moved' => 'Rûpela $1 çû cihê $2.',
+	'renameuser-page-moved' => 'Navê $1 weke $2 hate guhertin.',
 	'renameuser-page-unmoved' => 'Rûpela $1 nikanî çûba ciha $2.',
 	'log-name-renameuser' => 'Guhertina navê bikarhêner',
 	'renameuser-move-log' => 'Otomatîk hate guherandin, ji ber ku "[[User:$1|$1]]" navê xwe guherand û niha bû "[[User:$2|$2]]"',
 	'right-renameuser' => 'Navê bikarhêneran biguherîne:',
 );
 
-/** Kirghiz (Кыргызча)
+/** Kyrgyz (Кыргызча)
  * @author Chorobek
  */
 $messages['ky'] = array(
@@ -2507,6 +2606,7 @@ Commodule notatio renominationum usoris subter datur.',
 /** Luxembourgish (Lëtzebuergesch)
  * @author Les Meloures
  * @author Robby
+ * @author Soued031
  */
 $messages['lb'] = array(
 	'renameuser' => 'Benotzernumm änneren',
@@ -2530,7 +2630,7 @@ $messages['lb'] = array(
 Gitt w.e.g. zréck a versicht et nach eng Kéier.',
 	'renameuser-error-same-user' => 'Dir kënnt kee Benotzernumm änneren, an him deselwechten Numm erëmginn.',
 	'renameusersuccess' => 'De Benotzer "<nowiki>$1</nowiki>" gouf "<nowiki>$2</nowiki>" ëmbenannt.',
-	'renameuser-page-exists' => "D'Säit $1 gëtt et schonns a kann net automatesch iwwerschriwwe ginn.",
+	'renameuser-page-exists' => "D'Säit $1 gëtt et schonn a kann net automatesch iwwerschriwwe ginn.",
 	'renameuser-page-moved' => "D'Säit $1 gouf op $2 geréckelt.",
 	'renameuser-page-unmoved' => "D'Säit $1 konnt net op $2 geréckelt ginn.",
 	'log-name-renameuser' => 'Logbuch vun den Ännerunge vum Benotzernumm',
@@ -2582,6 +2682,13 @@ $messages['li'] = array(
 Relevante regels oet 't logbook staon hieónger.",
 );
 
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+	'renameuserreason' => 'دلیل:',
+);
+
 /** Lithuanian (lietuvių)
  * @author Eitvys200
  * @author Homo
@@ -2627,7 +2734,7 @@ $messages['lv'] = array(
 	'renameuser-linkoncontribs-text' => 'Pārsaukt šo lietotāju',
 	'renameuserold' => 'Pašreizējais lietotāja vārds:',
 	'renameusernew' => 'Jaunais lietotāja vārds:',
-	'renameuserreason' => 'Pārsaukšanas iemesls:', # Fuzzy
+	'renameuserreason' => 'Iemesls:',
 	'renameuserreserve' => 'Bloķēt veco lietotājvārdu no turpmākas izmantošanas',
 	'renameuserwarnings' => 'Brīdinājumi:',
 	'renameuserconfirm' => 'Jā, pārdēvēt lietotāju',
@@ -2774,7 +2881,7 @@ $messages['mr'] = array(
 	'renameuserreserve' => 'जुने सदस्य खाते पुढील वापरासाठी अवरुद्ध करा',
 	'renameuserwarnings' => 'ताकीद:',
 	'renameuserconfirm' => 'होय, सदस्याचे नाव बदला',
-	'renameusersubmit' => 'पाठवा',
+	'renameusersubmit' => 'सादर करा',
 	'renameusererrordoesnotexist' => '"<nowiki>$1</nowiki>" नावाचा सदस्य अस्तित्वात नाही.',
 	'renameusererrorexists' => '"<nowiki>$1</nowiki>" नावाचा सदस्य अगोदरच अस्तित्वात आहे',
 	'renameusererrorinvalid' => '"<nowiki>$1</nowiki>" हे नाव चुकीचे आहे.',
@@ -2892,7 +2999,7 @@ $messages['nan'] = array(
 	'renameuser-page-moved' => '$1 í-keng sóa khì tī $2.',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Danmichaelo
  * @author Event
  * @author Nghtwlkr
@@ -2958,31 +3065,40 @@ $messages['nds'] = array(
 	'right-renameuser' => 'Brukers ne’en Naam geven',
 );
 
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
  * @author Servien
  */
 $messages['nds-nl'] = array(
 	'renameuser' => 'Gebruker herneumen',
 	'renameuser-linkoncontribs' => 'gebruker herneumen',
+	'renameuser-linkoncontribs-text' => 'Disse gebruker herneumen',
+	'renameuser-desc' => "Der kömp n [[Special:Renameuser|spesiale zied]] bie um n gebruker te herneumen (je hebben hierveur t recht ''renameuser'' neudig)",
 	'renameuserold' => 'Gebrukersnaam noen',
 	'renameusernew' => 'Nieje gebrukersnaam:',
-	'renameuserreason' => 'Reden veur t herneumen:', # Fuzzy
+	'renameuserreason' => 'Reden:',
 	'renameusermove' => 'Herneum gebruker en gebrukersziejen (en ziejen die deronder vallen) naor de nieje naam.',
 	'renameusersuppress' => 'Gien deurverwiezingen maken naor de nieje naam',
 	'renameuserreserve' => 'Veurkoemen dat de ouwe gebruker opniej eregistreerd wörden',
 	'renameuserwarnings' => 'Waorschuwingen:',
 	'renameuserconfirm' => 'Ja, herneum disse gebruker',
 	'renameusersubmit' => 'Herneumen',
+	'renameuser-submit-blocklog' => 'Blokkeerlogboek veur gebruker laoten zien',
 	'renameusererrordoesnotexist' => 'De gebruker "<nowiki>$1</nowiki>" besteet niet.',
 	'renameusererrorexists' => 'De gebrukersnaam "<nowiki>$1</nowiki>" is al in gebruuk.',
 	'renameusererrorinvalid' => 'De gebrukersnaam "<nowiki>$1</nowiki>" is ongeldig.',
+	'renameuser-error-request' => 'Der was n probleem bie t ontvangen van de anvraag.
+Gao weerumme en probeer t nog es.',
+	'renameuser-error-same-user' => 'Je kunnen gien gebruker herneumen naor dezelfde naam.',
 	'renameusersuccess' => 'Gebruker "<nowiki>$1</nowiki>" is herneumd naor "<nowiki>$2</nowiki>".',
 	'renameuser-page-exists' => 'De zied $1 besteet al en kan niet automaties overschreven wörden.',
 	'renameuser-page-moved' => 'De zied $1 is herneumd naor $2.',
 	'renameuser-page-unmoved' => 'De zied $1 kon niet herneumd wörden naor $2.',
 	'log-name-renameuser' => 'Logboek gebrukersnaamwiezigingen',
 	'log-description-renameuser' => 'Dit is n logboek mit wiezigingen van gebrukersnamen',
+	'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|hef}} gebruker $4 ($6 {{PLURAL:$6|bewarking|bewarkingen}}) herneumd naor $5',
+	'logentry-renameuser-renameuser-legacier' => '$1 hef de gebruker $4 herneumd naor $5',
 	'renameuser-move-log' => 'Zied is automaties verplaotst bie t herneumen van de gebruker "[[User:$1|$1]]" naor "[[User:$2|$2]]"',
+	'action-renameuser' => 'gebrukers herneumen',
 	'right-renameuser' => 'Gebrukers herneumen',
 	'renameuser-renamed-notice' => 'Disse gebrukersnaam is herneumd.
 Hieronder vie-j t herneumlogboek as referensie.',
@@ -3047,7 +3163,7 @@ $messages['nl-informal'] = array(
 	'renameuser-error-same-user' => 'Je kunt geen gebruiker hernoemen naar dezelfde naam.',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Dittaeva
  * @author Gunnernett
  * @author Harald Khan
@@ -3129,7 +3245,7 @@ $messages['oc'] = array(
 Lo jornal dels cambiaments de noms es disponible çaijós per informacion.',
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Jnanaranjan Sahu
  * @author Odisha1
  * @author Psubhashish
@@ -3379,11 +3495,11 @@ $messages['pt'] = array(
 	'renameuser-linkoncontribs' => 'alterar nome do utilizador',
 	'renameuser-linkoncontribs-text' => 'Alterar o nome deste utilizador',
 	'renameuser-desc' => "[[Special:Renameuser|Página especial]] para alterar o nome de um utilizador (requer o privilégio ''renameuser'')",
-	'renameuserold' => 'Nome de usuário atual:',
+	'renameuserold' => 'Nome de utilizador atual:',
 	'renameusernew' => 'Novo nome de utilizador:',
-	'renameuserreason' => 'Motivo da alteração de nome:', # Fuzzy
+	'renameuserreason' => 'Motivo:',
 	'renameusermove' => 'Mover as páginas e subpáginas de utilizador e as respectivas discussões para o novo nome',
-	'renameusersuppress' => 'Não criar redireccionamentos para o novo nome',
+	'renameusersuppress' => 'Não criar redirecionamentos para o novo nome',
 	'renameuserreserve' => 'Impedir novos usos do antigo nome de utilizador',
 	'renameuserwarnings' => 'Alertas:',
 	'renameuserconfirm' => 'Sim, alterar o nome do utilizador',
@@ -3400,7 +3516,7 @@ Volte atrás e tente de novo, por favor.',
 	'renameuser-page-moved' => 'A página $1 foi movida para $2.',
 	'renameuser-page-unmoved' => 'Não foi possível mover a página $1 para $2.',
 	'log-name-renameuser' => 'Registo de alteração do nome de utilizadores',
-	'log-description-renameuser' => 'Este é um registo de alterações efectuadas a nomes de utilizadores.',
+	'log-description-renameuser' => 'Este é um registro de alterações efetuadas a nomes de utilizadores.',
 	'logentry-renameuser-renameuser' => '$1 renomeou $4 (com $6 edições) para $5', # Fuzzy
 	'logentry-renameuser-renameuser-legacier' => '$1 renomeou $4 para $5',
 	'renameuser-move-log' => 'Página movida automaticamente ao alterar o nome do utilizador "[[User:$1|$1]]" para "[[User:$2|$2]]"',
@@ -3411,6 +3527,7 @@ Volte atrás e tente de novo, por favor.',
 );
 
 /** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
  * @author Giro720
  * @author Opraco
  * @author 555
@@ -3418,12 +3535,12 @@ Volte atrás e tente de novo, por favor.',
 $messages['pt-br'] = array(
 	'renameuser' => 'Renomear usuário',
 	'renameuser-linkoncontribs' => 'renomear usuário',
-	'renameuser-linkoncontribs-text' => 'excluir este usuário',
+	'renameuser-linkoncontribs-text' => 'Renomear este usuário',
 	'renameuser-desc' => "Adiciona uma [[Special:Renameuser|página especial]] para renomear um usuário (requer privilégio ''renameuser'')",
 	'renameuserold' => 'Nome de usuário atual:',
 	'renameusernew' => 'Novo nome de usuário:',
 	'renameuserreason' => 'Motivo:',
-	'renameusermove' => 'Mover as páginas de usuário, páginas de discussão de usuário e sub-páginas para o novo nome',
+	'renameusermove' => 'Mover as páginas de usuário, páginas de discussão de usuário (e suas sub-páginas) para o novo nome',
 	'renameusersuppress' => 'Não criar redirecionamentos para o novo nome',
 	'renameuserreserve' => 'Impedir novos usos do antigo nome de usuário',
 	'renameuserwarnings' => 'Alertas:',
@@ -3437,18 +3554,18 @@ $messages['pt-br'] = array(
 Retorne e tente novamente.',
 	'renameuser-error-same-user' => 'Não é possível renomear um usuário para o nome anterior.',
 	'renameusersuccess' => 'O usuário "<nowiki>$1</nowiki>" foi renomeado para "<nowiki>$2</nowiki>".',
-	'renameuser-page-exists' => 'Já existe a página $1. Não é possível sobrescrever automaticamente.',
+	'renameuser-page-exists' => 'A página $1 já existe. Não foi possível sobrescreve-la automaticamente.',
 	'renameuser-page-moved' => 'A página $1 foi movida com sucesso para $2.',
 	'renameuser-page-unmoved' => 'Não foi possível mover a página $1 para $2.',
 	'log-name-renameuser' => 'Registro de renomeação de usuários',
-	'log-description-renameuser' => 'Este é um registro de alterações efetuadas em nomes de usuários.',
-	'logentry-renameuser-renameuser' => '$1 renomeou $4 (com $6 ediç{{PLURAL:$6|ão|ões}}) para $5', # Fuzzy
+	'log-description-renameuser' => 'Este é um registro de alterações de nomes de usuários.',
+	'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|renomeou}} $4 (com $6 ediç{{PLURAL:$6|ão|ões}}) para $5',
 	'logentry-renameuser-renameuser-legacier' => '$1 renomeou $4 para $5',
-	'renameuser-move-log' => 'Páginas foram movidas automaticamente ao renomear o usuário "[[User:$1|$1]]" para "[[User:$2|$2]]"',
+	'renameuser-move-log' => 'Páginas movidas automaticamente ao renomear o usuário "[[User:$1|$1]]" para "[[User:$2|$2]]"',
 	'action-renameuser' => 'renomear usuários',
 	'right-renameuser' => 'Renomear usuários',
 	'renameuser-renamed-notice' => 'Este usuário foi renomeado.
-O registro de renomeação é fornecido abaixo para referência.',
+O registro de renomeação é fornecido abaixo, para referência.',
 );
 
 /** Quechua (Runa Simi)
@@ -3575,6 +3692,7 @@ L'archivije de le renomenaziune 'u iacchie aqquà sotte cumme referimende.",
 
 /** Russian (русский)
  * @author Ahonc
+ * @author Anonim.one
  * @author DCamer
  * @author DR
  * @author EugeneZelenko
@@ -3609,7 +3727,7 @@ $messages['ru'] = array(
 	'renameuser-page-unmoved' => 'Страница $1 не может быть переименована в $2.',
 	'log-name-renameuser' => 'Журнал переименований участников',
 	'log-description-renameuser' => 'Это журнал произведённых переименований зарегистрированных участников.',
-	'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|переименовал}} пользователя $4 ({{PLURAL:$6|$6 правка|$6 правки|$6 правок}}) в $5',
+	'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|переименовал}} участника $4 ({{PLURAL:$6|$6 правка|$6 правки|$6 правок}}) в $5',
 	'logentry-renameuser-renameuser-legacier' => '$1 переименовал пользователя $4 в $5',
 	'renameuser-move-log' => 'Автоматически в связи с переименованием учётной записи «[[User:$1|$1]]» в «[[User:$2|$2]]»',
 	'action-renameuser' => 'переименование участников',
@@ -3799,7 +3917,7 @@ $messages['si'] = array(
 	'renameuser-desc' => "පරිශීලකයෙක් යළි-නම්කරනු වස් [[Special:Renameuser|විශේෂ පිටුවක්]] එක් කරන්න (''renameuser'' අයිතිය අවශ්‍යයි)",
 	'renameuserold' => 'වත්මන් පරිශීලක නාමය:',
 	'renameusernew' => 'නව පරිශීලක නාමය:',
-	'renameuserreason' => 'යළි-නම්කිරීමට හේතුව:', # Fuzzy
+	'renameuserreason' => 'හේතුව:',
 	'renameusermove' => 'පරිශීලක හා සාකච්ඡා පිටු   (හා  ඒවායේ උපපිටු) නව නම වෙතට ගෙන යන්න',
 	'renameusersuppress' => 'යළි යොමුවන් නම නාමයේ සැකසීමෙන් වළකින්න.',
 	'renameuserreserve' => 'පැරණි පරිශීලක නම අනාගත භාවිතයෙන් වාරණය කරන්න',
@@ -3955,6 +4073,7 @@ Regjistri i riemërimit është poshtë për referencë.',
 
 /** Serbian (Cyrillic script) (српски (ћирилица)‎)
  * @author FriedrickMILBarbarossa
+ * @author Milicevic01
  * @author Millosh
  * @author Rancher
  * @author Sasa Stefanovic
@@ -3968,7 +4087,7 @@ $messages['sr-ec'] = array(
 	'renameuser-desc' => "Додаје [[Special:Renameuser|посебну страницу]] за преименовање корисника (потребно право ''renameuser'')",
 	'renameuserold' => 'Тренутно корисничко име:',
 	'renameusernew' => 'Ново корисничко име:',
-	'renameuserreason' => 'Разлог:', # Fuzzy
+	'renameuserreason' => 'Разлог:',
 	'renameusermove' => 'Премести корисничку страницу и страницу за разговор (и њихове подстранице) на нови назив',
 	'renameusersuppress' => 'Не правите преусмерења на нови назив',
 	'renameuserreserve' => 'Блокирај старо корисничко име за даљу употребу',
@@ -3998,6 +4117,7 @@ $messages['sr-ec'] = array(
  * @author FriedrickMILBarbarossa
  * @author Liangent
  * @author Michaello
+ * @author Milicevic01
  * @author Жељко Тодоровић
  */
 $messages['sr-el'] = array(
@@ -4007,7 +4127,7 @@ $messages['sr-el'] = array(
 	'renameuser-desc' => "Dodaje [[Special:Renameuser|posebnu stranicu]] za preimenovanje korisnika (potrebno pravo ''renameuser'').",
 	'renameuserold' => 'Trenutno korisničko ime:',
 	'renameusernew' => 'Novo korisničko ime:',
-	'renameuserreason' => 'Razlog preimenovanja:', # Fuzzy
+	'renameuserreason' => 'Razlog:',
 	'renameusermove' => 'Premesti korisničku stranicu i stranicu za razgovor (i njihove podstranice) na novo ime',
 	'renameusersuppress' => 'Ne pravite preusmerenja na novi naziv',
 	'renameuserreserve' => 'Blokiraj staro korisničko ime za dalju upotrebu',
@@ -4093,9 +4213,11 @@ $messages['su'] = array(
  * @author Cybjit
  * @author Dafer45
  * @author Habj
+ * @author Jopparn
  * @author Lejonel
  * @author Lokal Profil
  * @author M.M.S.
+ * @author MagnusA
  * @author Najami
  * @author Per
  */
@@ -4124,6 +4246,9 @@ $messages['sv'] = array(
 	'renameuser-page-moved' => 'Sidan $1 har flyttats till $2.',
 	'renameuser-page-unmoved' => 'Sidan $1 kunde inte flyttas till $2.',
 	'log-name-renameuser' => 'Logg över användarnamnsbyten',
+	'log-description-renameuser' => 'Detta är en logg över ändringar av användarnamn',
+	'logentry-renameuser-renameuser' => '$1 {{GENDER:$2|bytte namn på}} användare $4 ({{PLURAL:$6|$6 redigering|$6  redigeringar}}) till $5',
+	'logentry-renameuser-renameuser-legacier' => '$1 bytte namn på användare $4 till $5',
 	'renameuser-move-log' => 'Flyttade automatiskt sidan när namnet byttes på användaren "[[User:$1|$1]]" till "[[User:$2|$2]]"',
 	'action-renameuser' => 'ändra namn på användaren',
 	'right-renameuser' => 'Ändra användares namn',
@@ -4239,6 +4364,7 @@ $messages['tet'] = array(
 	'renameusererrordoesnotexist' => 'Uza-na\'in "<nowiki>$1</nowiki>" la iha.',
 	'renameuser-page-moved' => 'Book tiha pájina $1 ba $2.',
 	'renameuser-page-unmoved' => 'La bele book pájina $1 ba $2.',
+	'logentry-renameuser-renameuser-legacier' => '$1 muda naran uza-na\'in "$4" nian. Naran foun: "$5"',
 	'right-renameuser' => "Fó naran foun ba uza-na'in sira",
 );
 
@@ -4627,7 +4753,7 @@ $messages['vo'] = array(
 	'renameuser-desc' => "Votanemön gebani (gität: ''renameuser'' zesüdon)",
 	'renameuserold' => 'Gebananem anuik:',
 	'renameusernew' => 'Gebananem nulik:',
-	'renameuserreason' => 'Kod votanemama:', # Fuzzy
+	'renameuserreason' => 'Kod:',
 	'renameusermove' => 'Topätükön padi e bespikapadi gebana (e donapadis onsik) ad nem nulik',
 	'renameuserreserve' => 'Neletön gebananemi rigik (pos votanemam) ad pagebön ün fütür',
 	'renameuserwarnings' => 'Nuneds:',
@@ -4718,6 +4844,7 @@ $messages['yo'] = array(
 );
 
 /** Cantonese (粵語)
+ * @author Liuxinyu970226
  */
 $messages['yue'] = array(
 	'renameuser' => '改用戶名',
diff --git a/extensions/Renameuser/RenameuserSQL.php b/extensions/Renameuser/RenameuserSQL.php
index eeb879a0..ca03ad3e 100644
--- a/extensions/Renameuser/RenameuserSQL.php
+++ b/extensions/Renameuser/RenameuserSQL.php
@@ -221,7 +221,7 @@ class RenameuserSQL {
 		}
 
 		if ( count( $jobs ) > 0 ) {
-			Job::safeBatchInsert( $jobs ); // don't commit yet
+			JobQueueGroup::singleton()->push( $jobs, JobQueue::QOS_ATOMIC ); // don't commit yet
 		}
 
 		// Commit the transaction
diff --git a/extensions/SimpleAntiSpam/SimpleAntiSpam.i18n.php b/extensions/SimpleAntiSpam/SimpleAntiSpam.i18n.php
index e4ee0a62..2e92679d 100644
--- a/extensions/SimpleAntiSpam/SimpleAntiSpam.i18n.php
+++ b/extensions/SimpleAntiSpam/SimpleAntiSpam.i18n.php
@@ -24,6 +24,10 @@ Do '''NOT''' fill this in!",
  * @author The Evil IP address
  */
 $messages['qqq'] = array(
+	'simpleantispam' => 'Unused at this time.',
+	'simpleantispam-label' => 'Used as label for the input box in "Edit" page.
+
+The label and the input box are always hidden.',
 	'simpleantispam-desc' => '{{desc|name=Simple Anti Spam|url=http://www.mediawiki.org/wiki/Extension:SimpleAntiSpam}}',
 );
 
@@ -76,7 +80,7 @@ $messages['arz'] = array(
 	'simpleantispam-desc' => 'بيضيف اختبار سبام/بوت بسيط للاستمارات',
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Gitartha.bordoloi
  */
 $messages['as'] = array(
@@ -116,6 +120,16 @@ $messages['bcc'] = array(
 	'simpleantispam-desc' => 'اضافه کنت یم ساده اسپم/روبوت چک په کنترل فرم آن',
 );
 
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+	'simpleantispam' => 'An saimong pagliwat nakapagkiblit kan anti-espam na mekanismo',
+	'simpleantispam-label' => 'Narikisa kan anti-espam.
+"Dae" ka magkaag nin laman digde!',
+	'simpleantispam-desc' => 'Minadugang nin simplihong rikisa kan espam/panalnga sa mga porma',
+);
+
 /** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  * @author EugeneZelenko
  */
@@ -198,6 +212,16 @@ $messages['cy'] = array(
 	'simpleantispam-desc' => 'Yn ychwanegu prawf sbam/bot syml i ffurflenni',
 );
 
+/** Danish (dansk)
+ * @author HenrikKbh
+ */
+$messages['da'] = array(
+	'simpleantispam' => 'Din redigering udløste anti-spam mekanismen',
+	'simpleantispam-label' => "Anti-spam tjek.
+Udfyld ''' ikke ''' dette!",
+	'simpleantispam-desc' => 'Tilføjer en simpel spam/bot kontrol til formularer',
+);
+
 /** German (Deutsch)
  * @author Kghbln
  * @author Raimond Spekking
@@ -466,7 +490,7 @@ $messages['it'] = array(
  * @author Shirayuki
  */
 $messages['ja'] = array(
-	'simpleantispam' => 'SPAM防止機能が有効になりました',
+	'simpleantispam' => '編集内容が原因でスパム防止機能が発動しました',
 	'simpleantispam-label' => "SPAM防止チェックです。
 決してここに値を入力'''しない'''でください。",
 	'simpleantispam-desc' => 'フォームに簡単なスパム/ボット チェックを追加',
@@ -497,12 +521,13 @@ $messages['ka'] = array(
  * @author Klutzy
  * @author Kwj2772
  * @author Yknok29
+ * @author 아라
  */
 $messages['ko'] = array(
 	'simpleantispam' => '현재 편집이 스팸 방지 장치에 탐지되었습니다',
 	'simpleantispam-label' => "스팸 방지 검사입니다.
 이것을 입력하지 '''마세요'''!",
-	'simpleantispam-desc' => '스팸/봇 확인 장치를 추가',
+	'simpleantispam-desc' => '양식에 간단한 스팸/봇 확인 장치를 추가합니다',
 );
 
 /** Colognian (Ripoarisch)
@@ -604,7 +629,7 @@ $messages['ms'] = array(
 	'simpleantispam-desc' => 'Menambah pemeriksaan spam/bot ringkas di borang sunting',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  */
 $messages['nb'] = array(
 	'simpleantispam' => 'Redigeringen din utløste antispammekanismen',
@@ -639,7 +664,7 @@ $messages['nl-informal'] = array(
 	'simpleantispam' => 'Je bewerking heeft het antispammechanisme in werking gesteld',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Harald Khan
  * @author Njardarlogar
  */
@@ -660,7 +685,7 @@ Inscrigatz '''PAS RES''' dedins !",
 	'simpleantispam-desc' => 'Apond al formulari la verificacion d’un bòt tarabastejaire',
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Psubhashish
  */
 $messages['or'] = array(
diff --git a/extensions/SpamBlacklist/README b/extensions/SpamBlacklist/README
index c017efb4..370a90b3 100644
--- a/extensions/SpamBlacklist/README
+++ b/extensions/SpamBlacklist/README
@@ -38,14 +38,16 @@ Compatibility
 -----------
 
 This extension is primarily maintained to run on the latest release version
-of MediaWiki (1.9.x as of this writing) and development versions.
+of MediaWiki (1.22.x as of this writing) and development versions, however
+the current version should work up to 1.21.
 
-The current version *may* work as far back as 1.6.x, but will *not* work
-with 1.5.x or older. You may be able to dig older versions out of the
-Subversion repository which work with those versions, but if using
-Wikimedia's blacklist file you will likely have problems with failure
-due to the large size of the blacklist not being handled by old versions
-of the code.
+If you are using an older version of MediaWiki, you can checkout an
+older release branch, for example MediaWiki 1.20 would use REL1_20.
+
+For even older versions, you may be able to dig older versions out of the
+Git repository which work, but if using Wikimedia's blacklist file
+you will likely have problems with failure due to the large size of the
+blacklist not being handled by old versions of the code.
 
 
 File format
@@ -142,6 +144,21 @@ A local whitelist can be maintained by creating a [[MediaWiki:Spam-whitelist]]
 page and listing hostnames in it, using the same format as the blacklists.
 URLs matching the whitelist will be ignored locally.
 
+Logging
+-------
+
+To aid with tracking which domains are being spammed, this extension has
+multiple logging features. By default, hits are included in the standard
+debug log (controlled by $wgDebugLogFile). You can grep for 'SpamBlacklistHit',
+which includes the IP of the user and the URL they tried to submit. This
+file is only availible for people with server access and includes private info.
+
+You can also enable logging to [[Special:Log]] by setting $wgLogSpamBlacklistHits to
+true. This will include the account which tripped the blacklist, the page title the
+edit was attempted on, and the specific URL. By default this log is only viewable
+to wiki administrators, and you can grant other groups access by giving them the
+"spamblacklistlog" permission.
+
 Copyright
 ---------
 This extension and this documentation was written by Tim Starling and is 
diff --git a/extensions/SpamBlacklist/SpamBlacklist.i18n.php b/extensions/SpamBlacklist/SpamBlacklist.i18n.php
index bd4e4f87..343586b7 100644
--- a/extensions/SpamBlacklist/SpamBlacklist.i18n.php
+++ b/extensions/SpamBlacklist/SpamBlacklist.i18n.php
@@ -53,10 +53,16 @@ $messages['en'] = array(
 	'spam-blacklisted-email-signup' => 'The given email address is currently blacklisted from use.',
 
 	'spam-invalid-lines' =>	"The following spam blacklist {{PLURAL:$1|line is an|lines are}} invalid regular {{PLURAL:$1|expression|expressions}} and {{PLURAL:$1|needs|need}} to be corrected before saving the page:",
-	'spam-blacklist-desc' => 'Regex-based anti-spam tool: [[MediaWiki:Spam-blacklist]] and [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Regex-based anti-spam tool allowing to blacklist URLs in pages and email addresses for registered users',
+	'log-name-spamblacklist' => 'Spam blacklist log',
+	'log-description-spamblacklist' => 'These events track spam blacklist hits.',
+	'logentry-spamblacklist-hit' => '$1 caused a spam blacklist hit on $3 by attempting to add $4.',
+	'right-spamblacklistlog' => 'View spam blacklist log',
+	'action-spamblacklistlog' => 'view the spam blacklist log',
 );
 
 /** Message documentation (Message documentation)
+ * @author Fryed-peach
  * @author Purodha
  * @author SPQRobin
  * @author Shirayuki
@@ -66,8 +72,8 @@ $messages['en'] = array(
 $messages['qqq'] = array(
 	'spam-blacklist' => "See also: [[MediaWiki:spam-whitelist]] and [[MediaWiki:captcha-addurl-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
 	'spam-whitelist' => "See also: [[MediaWiki:spam-blacklist]] and [[MediaWiki:captcha-addurl-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
-	'email-blacklist' => "See also: [[MediaWiki:email-whitelist]] and [[MediaWiki:captcha-addurl-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
-	'email-whitelist' => "See also: [[MediaWiki:email-blacklist]] and [[MediaWiki:captcha-addurl-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
+	'email-blacklist' => "See also: [[MediaWiki:email-whitelist]] and [[MediaWiki:Spam-blacklist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
+	'email-whitelist' => "See also: [[MediaWiki:email-blacklist]] and [[MediaWiki:Spam-whitelist]]. You can translate the text, including 'Leave this line exactly as it is'. Some lines of this messages have one (1) leading space.",
 	'spam-blacklisted-email' => 'Title of errorpage when trying to send an email with a blacklisted e-mail address',
 	'spam-blacklisted-email-text' => 'Text of errorpage when trying to send an e-mail with a blacklisted e-mail address',
 	'spam-blacklisted-email-signup' => 'Error when trying to create an account with an invalid e-mail address',
@@ -78,6 +84,17 @@ This message is followed by a list of bad lines.
 Parameters:
 * $1 - the number of bad lines',
 	'spam-blacklist-desc' => '{{desc|name=Spam Blacklist|url=http://www.mediawiki.org/wiki/Extension:SpamBlacklist}}',
+	'log-name-spamblacklist' => 'Name of log that appears on [[Special:Log]].',
+	'log-description-spamblacklist' => 'Description of spam blacklist log',
+	'logentry-spamblacklist-hit' => 'Log entry that is created when a user adds a link that is blacklisted on the spam blacklist.
+
+Parameters:
+* $1 - a user link, for example "Jane Doe (Talk | contribs)"
+* $2 - (Optional) a username. Can be used for GENDER
+* $3 - the page the user attempted to edit
+* $4 - the URL the user tried to add',
+	'right-spamblacklistlog' => '{{doc-right|spamblacklistlog}}',
+	'action-spamblacklistlog' => '{{doc-action|spamblacklistlog}}',
 );
 
 /** Aragonese (aragonés)
@@ -123,7 +140,7 @@ $messages['an'] = array(
 	'spam-blacklisted-email-text' => 'A suya adreza de correu-e ye agora en a lista negra, y no puede ninviar correu ta atros usuarios.',
 	'spam-blacklisted-email-signup' => "L'adreza de correu-e que ha dau ye actualment en a lista negra, y no se puede fer servir.",
 	'spam-invalid-lines' => "{{PLURAL:$1|A linia siguient ye una|As linias siguients son}} {{PLURAL:$1|expresión regular|expresions regulars}} y {{PLURAL:$1|ha|han}} d'estar correchitas antes d'alzar a pachina:",
-	'spam-blacklist-desc' => 'Ferramienta anti-spam basata en expresions regulars (regex): [[MediaWiki:Spam-blacklist]] y [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Ferramienta anti-spam basata en expresions regulars (regex): [[MediaWiki:Spam-blacklist]] y [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Arabic (العربية)
@@ -151,7 +168,7 @@ $messages['ar'] = array(
 
  #</pre> <!-- اترك هذا السطر تماما كما هو -->',
 	'spam-invalid-lines' => '{{PLURAL:$1||السطر التالي|السطران التاليان|السطور التالية}} في قائمة السبام السوداء {{PLURAL:$1|ليس تعبيرًا منتظمًا صحيحًا|ليسا تعبيرين منتظمين صحيحين|ليست تعبيرات منتظمة صحيحة}}  و{{PLURAL:$1||يحتاج|يحتاجان|تحتاج}} إلى أن {{PLURAL:$1||يصحح|يصححان|تصحح}} قبل حفظ الصفحة:',
-	'spam-blacklist-desc' => 'أداة ضد السبام تعتمد على التعبيرات المنتظمة: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'أداة ضد السبام تعتمد على التعبيرات المنتظمة: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Egyptian Spoken Arabic (مصرى)
@@ -179,10 +196,10 @@ $messages['arz'] = array(
 
  #</pre> <!-- سيب السطر دا زى ما هو كدا بالظبط-->',
 	'spam-invalid-lines' => '{{PLURAL:$1|السطر دا|السطور دول}} اللى فى السبام بلاك ليست {{PLURAL:$1|هو تعبير منتظم |هى تعبيرات منتظمة}} مش صح و {{PLURAL:$1|محتاج|محتاجين}} تصليح قبل حفظ الصفحة:',
-	'spam-blacklist-desc' => 'اداة انتي-سبام مبنية على اساس ريجيكس: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'اداة انتي-سبام مبنية على اساس ريجيكس: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Gitartha.bordoloi
  */
 $messages['as'] = array(
@@ -223,7 +240,7 @@ $messages['as'] = array(
 	'spam-blacklisted-email-text' => 'আন সদস্যলৈ ই-মেইল পঠিয়াব নোৱাৰাকৈ আপোনাৰ ই-মেইল ঠিকনা ব্লেকলিষ্টেড কৰা হৈছে।',
 	'spam-blacklisted-email-signup' => 'ই-মেইল ঠিকনাটো ব্যৱহাৰৰ পৰা ব্লেকলিষ্টেড কৰা হৈছে।',
 	'spam-invalid-lines' => 'তলৰ স্পাম ব্লেকলিষ্টৰ {{PLURAL:$1|শাৰীটোত|শাৰীসমূহত}} অবৈধ নিয়মিত {{PLURAL:$1|এক্সপ্ৰেছন|এক্সপ্ৰেছন}} আছে আৰু সেইবোৰ পৃষ্ঠা সাঁচি থোৱাৰ আগতেই ঠিক কৰাটো {{PLURAL:$1|প্ৰয়োজন|প্ৰয়োজন}}:',
-	'spam-blacklist-desc' => 'ৰেজেক্স-ভিত্তিক স্পামবিৰোধী সঁজুলি: [[MediaWiki:Spam-blacklist]] আৰু [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'ৰেজেক্স-ভিত্তিক স্পামবিৰোধী সঁজুলি: [[MediaWiki:Spam-blacklist]] আৰু [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Asturian (asturianu)
@@ -271,7 +288,12 @@ $messages['ast'] = array(
 	'spam-blacklisted-email-text' => 'El to corréu electrónicu anguaño ta na llista negra y nun pue unviar correos electrónicos a otros usuarios.',
 	'spam-blacklisted-email-signup' => "La direición de corréu electrónicu que se dio tien torgáu l'usu por tar anguaño na llista negra.",
 	'spam-invalid-lines' => '{{PLURAL:$1|La siguiente llinia|Les siguientes llinies}} de la llista negra de spam {{PLURAL:$1|ye una espresión regular non válida|son espresiones regulares non válides}} y {{PLURAL:$1|necesita ser correxida|necesiten ser correxíes}} enantes de guardar la páxina:',
-	'spam-blacklist-desc' => "Ferramienta antispam basada n'espresiones regulares: [[MediaWiki:Spam-blacklist]] y [[MediaWiki:Spam-whitelist]]",
+	'spam-blacklist-desc' => "Ferramienta antispam basada n'espresiones regulares que permite a los usuarios rexistraos poner nuna llista prieta URLs de páxines y direiciones de corréu electrónicu",
+	'log-name-spamblacklist' => 'Rexistru de la llista prieta de spam',
+	'log-description-spamblacklist' => 'Estos socesos rexistren les coincidencies cola llista prieta de spam.',
+	'logentry-spamblacklist-hit' => '$1 provocó una activación de la llista prieta de spam en $3 al intentar amestar $4.',
+	'right-spamblacklistlog' => 'Ver el rexistru de la llista prieta de spam',
+	'action-spamblacklistlog' => 'ver el rexistru de la llista prieta de spam',
 );
 
 /** Bashkir (башҡортса)
@@ -296,14 +318,62 @@ $messages['ba'] = array(
 # * Һәр буш булмаған юл URL эсендәге төйөнгә генә ҡулланылған регуляр аңлатманың өлөшө булып тора
 #</pre> <!-- был юлды нисек бар, шулай ҡалдырығыҙ -->',
 	'spam-invalid-lines' => 'Түбәндәге ҡара исемлек {{PLURAL:$1|юлында|юлдарында}} хаталы регуляр {{PLURAL:$1|аңлатма|аңлатмалар}} бар һәм {{PLURAL:$1|ул|улар}} битте һаҡлар алдынан төҙәтелергә тейеш:',
-	'spam-blacklist-desc' => 'Регуляр аңлатмаларға нигеҙләнгән спамға ҡаршы ҡорал: [[MediaWiki:Spam-blacklist]] һәм [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Регуляр аңлатмаларға нигеҙләнгән спамға ҡаршы ҡорал: [[MediaWiki:Spam-blacklist]] һәм [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Southern Balochi (بلوچی مکرانی)
  * @author Mostafadaneshvar
  */
 $messages['bcc'] = array(
-	'spam-blacklist-desc' => 'وسیله په ضد اسپم په اساس عبارات منظم:  [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'وسیله په ضد اسپم په اساس عبارات منظم:  [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]', # Fuzzy
+);
+
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+	'spam-blacklist' => '#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->
+# Mga panluwas na pangilyaw na minatampad kaining listahan ipagkukubkob kunsoarin na ipagdugang ini sa sarong pahina.
+# Ining listahan mina-apekto sana sa wiking ini; pakihiling man sa pankinabanong pinagbaraduhan.
+# Para sa dokumentasyon hilngon tabi sa https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+# 
+#An sintaks iyo an mga minasunod:
+# *An gabos magpoon sa "#" na karakter sagkod sa tapos kan linya iyo an komento
+# *An lambang bako na blankong linya iyo an sarong kapedasohan kan regex na makakapagtampad sana kan mga parabunsod na yaon sa laog kan mga pangilyaw
+
+#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->',
+	'spam-whitelist' => '#<!-- pakiwalat ining linya na eksaktong siring kaiyan  --> <pre>
+#An panluwas na mga pangilyaw na nagtatampad kaining listahn *dae* ipagkukubkob dawa ngani na sinda #ipinagkubkob kan mga pinagbarahang entrada.
+#
+#An sintaks iyo an mga minasunod:
+# *An gabos magpoon sa "#" na karakter sagkod sa tapos kan linya iyo an komento
+# *An lambang bako na blankong linya iyo an sarong kapedasohan kan regex na makakapagtampad sana kan mga parabunsod na yaon sa laog kan mga pangilyaw
+
+#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->',
+	'email-blacklist' => '#<!-- pakiwalat ining linya na eksaktong siring kaiyan  --> <pre>
+#An mga e-surat na nagtatampad kaining listahan ipagkukubkob sa pagpaparehistro o sa pagpapadara kan me e-surat
+#Ining listahan mina-apekto sana kaining wiki; pakihiling man sa pankinabanong pinagbarahan.
+#Para sa dokumentasyon pakihiling sa https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+#An sintaks iyo an mga minasunod:
+# *An gabos magpoon sa "#" na karakter sagkod sa tapos kan linya iyo an komento
+# *An lambang bako na blankong linya iyo an sarong kapedasohan kan regex na makakapagtampad sana kan mga parabunsod na yaon sa laog kan mga estada kan e-surat
+
+#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->',
+	'email-whitelist' => '#<!-- pakiwalat ining linya na eksaktong siring kaiyan  --> <pre>
+#An mga e-surat na nagtatampad kaining listahan *dae* ipagkukubkob dawa ngani sinda
+#pinagkubkob kan mga pingbarahang entrada.
+#
+#An sintaks iyo an mga minasunod:
+# *An gabos magpoon sa "#" na karakter sagkod sa tapos kan linya iyo an komento
+# *An lambang bako na blankong linya iyo an sarong kapedasohan kan regex na makakapagtampad sana kan mga parabunsod na yaon sa laog kan mga estada kan e-surat
+
+#</pre><!-- pakiwalat ining linya na eksaktong siring kaiyan -->',
+	'spam-blacklisted-email' => 'Pinagbaraduhang estada kan e-surat',
+	'spam-blacklisted-email-text' => 'An saimong estada kan e-surat sa ngunyan pinagbaraduhan sa pagpapadara nin mga e-surat pasiring sa ibang mga paragamit.',
+	'spam-blacklisted-email-signup' => 'An ipinagtaong estada kan e-surat sa ngunyan pinagbaraduhan na magamit.',
+	'spam-invalid-lines' => 'An minasunod na pinagbarahang listahan kan espam {{PLURAL:$1|hilira iyo an|hilira iyo an mga}} imbalidong pirmihan na {{PLURAL:$1|ekspresyon|mga ekspresyon}} asin {{PLURAL:$1|kinakaipuhan|kaipuhan}} na pagkokorihiran bago tabi itatagama an pahina:',
+	'spam-blacklist-desc' => 'Nakabase sa Regex na gamit sa anti-espam:[[MediaWiki:Spam-blacklist]] asin [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
@@ -358,7 +428,7 @@ $messages['be-tarask'] = array(
 	'spam-blacklisted-email-text' => 'З Вашага адрасу электроннай пошты ў цяперашні момант забаронена дасылаць электронныя лісты іншым удзельнікам.',
 	'spam-blacklisted-email-signup' => 'Пададзены Вамі адрас электроннай пошты ў цяперашні момант знаходзіцца ў чорным сьпісе.',
 	'spam-invalid-lines' => '{{PLURAL:$1|Наступны радок чорнага сьпісу ўтрымлівае няслушны рэгулярны выраз|Наступныя радкі чорнага сьпісу ўтрымліваюць няслушныя рэгулярныя выразы}} і {{PLURAL:$1|павінен быць|павінныя быць}} выпраўлены перад захаваньнем старонкі:',
-	'spam-blacklist-desc' => 'Антыспамавы інструмэнт, які базуецца на рэгулярных выразах: [[MediaWiki:Spam-blacklist]] і [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Антыспамавы інструмэнт, які базуецца на рэгулярных выразах: [[MediaWiki:Spam-blacklist]] і [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Bulgarian (български)
@@ -366,7 +436,7 @@ $messages['be-tarask'] = array(
  */
 $messages['bg'] = array(
 	'spam-invalid-lines' => '{{PLURAL:$1|Следният запис|Следните записи}} от черния списък на спама {{PLURAL:$1|е невалиден регулярен израз|са невалидни регулярни изрази}} и  трябва да {{PLURAL:$1|бъде коригиран|бъдат коригирани}} преди съхраняване на страницата:',
-	'spam-blacklist-desc' => 'Инструмент за защита от спам, използващ регулярни изрази: [[МедияУики:Spam-blacklist]] и [[МедияУики:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Инструмент за защита от спам, използващ регулярни изрази: [[МедияУики:Spam-blacklist]] и [[МедияУики:Spam-whitelist]]', # Fuzzy
 );
 
 /** Banjar (Bahasa Banjar)
@@ -377,6 +447,7 @@ $messages['bjn'] = array(
 );
 
 /** Bengali (বাংলা)
+ * @author Aftab1995
  * @author Bellayet
  * @author Nasir8891
  * @author Zaheen
@@ -406,7 +477,11 @@ $messages['bn'] = array(
 	'spam-blacklisted-email-text' => 'অন্যদের ইমেইল পাঠানো থেকে বিরত রাখতে আপনাকে কালোতালিকাভুক্ত করা হয়েছে।',
 	'spam-blacklisted-email-signup' => 'আপনার লেখা ইমেইল ঠিকানাটি কালোতালিকাভুক্ত।',
 	'spam-invalid-lines' => 'নিচের স্প্যাম কালোতালিকার {{PLURAL:$1|লাইন|লাইনগুলি}} অবৈধ রেগুলার {{PLURAL:$1|এক্সপ্রেশন|এক্সপ্রেশন}} ধারণ করছে এবং পাতাটি সংরক্ষণের আগে এগুলি ঠিক করা {{PLURAL:$1|প্রয়োজন|প্রয়োজন}}:',
-	'spam-blacklist-desc' => 'রেজেক্স-ভিত্তিক স্প্যামরোধী সরঞ্জাম: [[MediaWiki:Spam-blacklist]] এবং [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'রেজেক্স-ভিত্তিক স্প্যামরোধী সরঞ্জাম: [[MediaWiki:Spam-blacklist]] এবং [[MediaWiki:Spam-whitelist]]', # Fuzzy
+	'log-name-spamblacklist' => 'স্প্যাম কালোতালিকা লগ',
+	'log-description-spamblacklist' => 'এই ঘটনাগুলি স্প্যাম কালোতালিকার হিট অনুসরণ।',
+	'right-spamblacklistlog' => 'স্প্যাম কালোতালিকা লগ দেখুন',
+	'action-spamblacklistlog' => 'স্প্যাম কালোতালিকা লগ দেখুন',
 );
 
 /** Breton (brezhoneg)
@@ -454,7 +529,7 @@ $messages['br'] = array(
 	'spam-blacklisted-email-text' => "Evit ar mare emañ ho chomlec'h postel war ul listenn zu ha n'haller ket kas posteloù drezañ d'an implijerien all.",
 	'spam-blacklisted-email-signup' => "War ul listenn zu emañ ar chomlec'h postel pourchaset. N'hall ket bezañ implijet.",
 	'spam-invalid-lines' => '{{PLURAL:$1|Ul lavarenn|Lavarennoù}} reoliek direizh eo {{PLURAL:$1|al linenn|al linennoù}} da-heul eus roll du ar stroboù ha ret eo {{PLURAL:$1|he reizhañ|o reizhañ}} a-raok enrollañ ar bajenn :',
-	'spam-blacklist-desc' => 'Ostilh enep-strob diazezet war lavarennoù reoliek (Regex) : [[MediaWiki:Spam-blacklist]] ha [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Ostilh enep-strob diazezet war lavarennoù reoliek (Regex) : [[MediaWiki:Spam-blacklist]] ha [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Bosnian (bosanski)
@@ -481,7 +556,7 @@ $messages['bs'] = array(
 
  #</pre> <!-- ostavite ovaj red onakav kakav je -->',
 	'spam-invalid-lines' => 'Slijedeći {{PLURAL:$1|red|redovi}} u spisku spam nepoželjnih stavki {{PLURAL:$1|je nevalidan izraz|su nevalidni izrazi}} i {{PLURAL:$1|treba|trebaju}} se ispraviti prije spremanja stranice:',
-	'spam-blacklist-desc' => 'Alati protiv spama zasnovani na regexu: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Alati protiv spama zasnovani na regexu: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Catalan (català)
@@ -515,7 +590,14 @@ $messages['ca'] = array(
 	'spam-blacklisted-email-text' => "La vostra adreça de correu electrònic està actualment en la llista negra d'enviament de correus a altres usuaris.",
 	'spam-blacklisted-email-signup' => "L'adreça de correu electrònic proporcionada està actualment en la llista negra d'ús.",
 	'spam-invalid-lines' => "{{PLURAL:$1|La línia següent no es considera una expressió correcta|Les línies següents no es consideren expressions correctes}} {{PLURAL:$1|perquè recull|perquè recullen}} SPAM que està vetat. Heu d'esmenar-ho abans de salvar la pàgina:",
-	'spam-blacklist-desc' => 'Eina anti-spam basada en regexp: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Eina anti-spam basada en regexp: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]', # Fuzzy
+);
+
+/** Sorani Kurdish (کوردی)
+ * @author Calak
+ */
+$messages['ckb'] = array(
+	'right-spamblacklistlog' => 'دیتنی لۆگی پێرستی ڕەشی ڕیکلام',
 );
 
 /** Czech (česky)
@@ -565,7 +647,7 @@ $messages['cs'] = array(
 	'spam-blacklisted-email-text' => 'Vaše e-mailová adresa je momentálně uvedena na černé listině, takže ostatním uživatelům nemůžete posílat e-maily.',
 	'spam-blacklisted-email-signup' => 'Uvedená e-mailová adresa je v současné době na černé listině.',
 	'spam-invalid-lines' => 'Na černé listině spamu {{PLURAL:$1|je následující řádka neplatný regulární výraz|jsou následující řádky neplatné regulární výrazy|jsou následující řádky regulární výrazy}} a je nutné {{PLURAL:$1|ji|je|je}} před uložením stránky opravit :',
-	'spam-blacklist-desc' => 'Antispamový nástroj na základě regulárních výrazů: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Antispamový nástroj na základě regulárních výrazů: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Welsh (Cymraeg)
@@ -594,8 +676,35 @@ $messages['cy'] = array(
 #   * gwesteiwyr tu mewn i gyfeiriadau URL
 
  #</pre> <!-- leave this line exactly as it is -->',
-	'spam-invalid-lines' => "Mae'r {{PLURAL:$1|llinell|llinell|llinellau|llinellau|llinellau|llinellau}} canlynol ar y rhestr spam gwaharddedig yn {{PLURAL:$1|fynegiad|fynegiad|fynegiadau|fynegiadau|fynegiadau|fynegiadau}} rheolaidd annilys; rhaid {{PLURAL:ei gywiro|ei gywiro|eu cywiro|eu cywiro|eu cywiro|eu cywiro}} cyn rhoi'r dudalen ar gadw:",
-	'spam-blacklist-desc' => 'Teclyn gwrth-spam yn seiliedig ar regex: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+	'email-blacklist' => "#<!-- leave this line exactly as it is --> <pre>
+# Fe gaiff cyfeiriadau ebost sydd yn cyfateb i'r rhestr hon eu blocio rhag iddynt gofrestru neu anfon ebyst
+# Ar gyfer y wici hwn yn unig mae'r rhestr hon; mae rhestr waharddedig led-led yr holl wicïau i'w gael.
+# Gweler https://www.mediawiki.org/wiki/Extension:SpamBlacklist am ragor o wybodaeth.
+#
+# Dyma'r gystrawen:
+#   * Mae popeth o nod \"#\" hyd at ddiwedd y llinell yn sylwad
+#   * Mae pob llinell nad yw'n wag yn ddarn regex sydd ddim ond yn cydweddu gwesteiwyr tu mewn i gyfeiriadau ebost
+
+ #</pre> <!-- leave this line exactly as it is -->",
+	'email-whitelist' => ' #<!-- leave this line exactly as it is --> <pre>
+# *Ni fydd* cyfeiriadau ebost sydd ar y rhestr hon yn cael eu blocio
+# hyd yn oed pan ydynt ar restr arall o gyfeiriadau ebost gwaharaddedig.
+#
+# Dyma\'r gystrawen:
+#   * Mae popeth o nod "#" hyd at ddiwedd y llinell yn sylwad
+#   * Mae pob llinell nad yw\'n wag yn ddarn regex sydd ddim ond yn cydweddu 
+#   * gwesteiwyr tu mewn i gyfeiriadau ebost
+
+ #</pre> <!-- leave this line exactly as it is -->',
+	'spam-blacklisted-email' => 'Cyfeiriad ebost ar y rhestr waharddedig',
+	'spam-blacklisted-email-text' => 'Mae eich cyfeiriad ebost wedi ei wahardd rhag anfon ebyst at ddefnyddwyr eraill ar hyn o bryd.',
+	'spam-blacklisted-email-signup' => "Mae'r cyfeiriad ebost a roddwyd wedi ei wahardd rhag ei ddefnyddio ar hyn o bryd.",
+	'spam-invalid-lines' => "Mae'r {{PLURAL:$1|llinell|llinell|llinellau}} canlynol ar y rhestr spam gwaharddedig yn {{PLURAL:$1|fynegiad|fynegiad|fynegiadau}} rheolaidd annilys; rhaid {{PLURAL:ei gywiro|ei gywiro|eu cywiro}} cyn rhoi'r dudalen ar gadw:",
+	'spam-blacklist-desc' => "Teclyn gwrth-sbam yn seiliedig ar regex, sy'n galluogi gwahardd y canlynol - URLs o fewn tudalennau a chyfeiriadau ebost defnyddwyr cofrestredig",
+	'log-name-spamblacklist' => 'Lòg y rhestr sbam waharddedig',
+	'log-description-spamblacklist' => "Mae'r digwyddiadau hyn yn cofnodi trawiadau ar y rhestr sbam waharddedig.",
+	'logentry-spamblacklist-hit' => 'Fe geisiodd $1 ychwanegu $4 sydd ar y rhestr waharddedig $3.',
+	'right-spamblacklistlog' => 'Gallu gweld lòg y rhestr sbam waharddedig',
 );
 
 /** Danish (dansk)
@@ -638,17 +747,25 @@ $messages['da'] = array(
 #  * hver ikke-tomme linjer anvendes som regulære udtryk for at matcha domænenavne i webadresser
 #</pre> <!-- lad denne linje være nøjagtig som den er -->',
 	'spam-blacklisted-email' => 'Sortlistet e-mailadresse',
-	'spam-blacklisted-email-text' => 'Din e-mail-adresse er i øjeblikket blokeret for at sende emails til andre brugere.',
-	'spam-blacklisted-email-signup' => 'Den angivne e-mail-adresse er i øjeblikket blokeret for brug.',
+	'spam-blacklisted-email-text' => 'Din e-mailadresse er i øjeblikket blokeret for at sende e-mails til andre brugere.',
+	'spam-blacklisted-email-signup' => 'Den angivne e-mailadresse er i øjeblikket blokeret for brug.',
 	'spam-invalid-lines' => 'Følgende {{PLURAL:$1|linje|linjer}} i spamsortelisten er {{PLURAL:$1|et ugyldigt regulært udtryk|ugyldige regulære udtryk}} og må rettes før lagring af siden:',
-	'spam-blacklist-desc' => 'Antispamværktøj baseret på regulære udtryk: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Antispamværktøj baseret på regulære udtryk der giver mulighed for at sortliste URLs i sider og e-mailadresser for registrerede brugere',
+	'log-name-spamblacklist' => 'Spamsortlistningslog',
+	'log-description-spamblacklist' => 'Disse begivenheder er træfferer i spamsortlistningen.',
+	'logentry-spamblacklist-hit' => '$1 ramte en regel i spamsortlisten på $3 ved at forsøge at tilføje $4.',
+	'right-spamblacklistlog' => 'Vis spamsortlisteloggen',
+	'action-spamblacklistlog' => 'se spamsortlisteloggen',
 );
 
 /** German (Deutsch)
  * @author Geitost
  * @author Kghbln
+ * @author Metalhead64
  * @author Raimond Spekking
+ * @author S2cchst
  * @author Umherirrender
+ * @author Wnme
  */
 $messages['de'] = array(
 	'spam-blacklist' => ' # Externe URLs, die in dieser Liste enthalten sind, blockieren das Speichern einer Seite.
@@ -690,7 +807,12 @@ $messages['de'] = array(
 	'spam-blacklisted-email-text' => 'Deine E-Mail-Adresse ist derzeit für das Senden von E-Mail-Nachrichten an andere Benutzer blockiert.',
 	'spam-blacklisted-email-signup' => 'Die angegebene E-Mail-Adresse ist derzeit für das Senden von E-Mail-Nachrichten an andere Benutzer blockiert.',
 	'spam-invalid-lines' => 'Die {{PLURAL:$1|folgende Zeile|folgenden Zeilen}} in der Blockierliste {{PLURAL:$1|ist ein ungültiger regulärer Ausdruck|sind ungültige reguläre Ausdrücke}}. Sie {{PLURAL:$1|muss|müssen}} vor dem Speichern der Seite korrigiert werden:',
-	'spam-blacklist-desc' => 'Ermöglicht ein, durch reguläre Ausdrücke gestütztes, Anti-Spam-Werkzeug: [[MediaWiki:Spam-blacklist]] und [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Ein auf regulären Ausdrücken basiertes Anti-Spam-Werkzeug, um URLs in Seiten und E-Mail-Adressen für registrierte Benutzer auf die schwarze Liste zu setzen',
+	'log-name-spamblacklist' => 'Spam-Blacklist-Logbuch',
+	'log-description-spamblacklist' => 'Es folgt ein Logbuch von Spam-Blacklist-Treffern.',
+	'logentry-spamblacklist-hit' => '$1 verursachte einen Spam-Blacklist-Treffer auf „$3“ durch das versuchte Hinzufügen von $4.',
+	'right-spamblacklistlog' => 'Spam-Blacklist-Logbuch ansehen',
+	'action-spamblacklistlog' => 'dieses Logbuch einzusehen',
 );
 
 /** Swiss High German (Schweizer Hochdeutsch)
@@ -719,6 +841,7 @@ $messages['de-formal'] = array(
 /** Zazaki (Zazaki)
  * @author Aspar
  * @author Erdemaslancan
+ * @author Marmase
  * @author Olvörg
  */
 $messages['diq'] = array(
@@ -760,7 +883,7 @@ $messages['diq'] = array(
 	'spam-blacklisted-email-text' => 'Nıka adresa e-postayê to qande karberê bini ra mesac riştene listeyê siya dero.',
 	'spam-blacklisted-email-signup' => 'E-posta adresiyo ke deyayo karkerdışe cı newke groto siyaliste.',
 	'spam-invalid-lines' => 'na qerelisteya spami {{PLURAL:$1|satır|satıran}}  {{PLURAL:$1|nemeqbulo|nemeqbuli}};',
-	'spam-blacklist-desc' => 'Regex-tabanlı anti-spam aracı: [[MediaWiki:Spam-blacklist]] ve [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => "Regex-tabanın haleta anti-spami URL'ya perer u adresa e-posta qande  karberande qeydınan geriyayo",
 );
 
 /** Lower Sorbian (dolnoserbski)
@@ -788,7 +911,7 @@ $messages['dsb'] = array(
  #</pre> <!-- wóstaj toś tu smužku rowno tak ako jo -->',
 	'spam-blacklisted-email' => 'Blokěrowana e-mailowa adresa',
 	'spam-invalid-lines' => '{{PLURAL:$1|Slědujuca smužka|Slědujucej smužce|Slědujuce smužki|Slědujuce smužki}} corneje lisćiny spama {{PLURAL:$1|jo njepłaśiwy regularny wuraz|stej njepłaśiwej regularnej wuraza|su njepłaśiwe regularne wuraze|su njepłaśiwe regularne wuraze}} a {{PLURAL:$1|musy|musytej|muse|muse}} se korigěrowaś, pjerwjej až składujoš bok:',
-	'spam-blacklist-desc' => 'Antispamowy rěd na zakłaźe regularnych wurazow: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Antispamowy rěd na zakłaźe regularnych wurazow: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Greek (Ελληνικά)
@@ -817,7 +940,7 @@ $messages['el'] = array(
 
  #</pre> <!-- leave this line exactly as it is -->',
 	'spam-invalid-lines' => '{{PLURAL:$1|Η ακόλουθη γραμμή|Οι ακόλουθες γραμμές}} της μαύρης λίστας spam είναι {{PLURAL:$1|άκυρη κανονική έκφραση|άκυρες κανονικές εκφράσεις}} και {{PLURAL:$1|χρειάζεται|χρειάζονται}} διόρθωση πριν την αποθήκευση της σελίδας:',
-	'spam-blacklist-desc' => 'Εργαλείο anti-spam βασισμένο σε κανονικές εκφράσεις: [[MediaWiki:Spam-blacklist]] και [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Εργαλείο anti-spam βασισμένο σε κανονικές εκφράσεις: [[MediaWiki:Spam-blacklist]] και [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Esperanto (Esperanto)
@@ -863,13 +986,14 @@ $messages['eo'] = array(
 	'spam-blacklisted-email-text' => 'Via retpoŝtadreso estas nune membro de nigralisto forbarita de sendante retpoŝtojn al aliaj uzantoj.',
 	'spam-blacklisted-email-signup' => 'Tiu retpoŝtadreso estas nune forbarita de uzado.',
 	'spam-invalid-lines' => 'La {{PLURAL:$1|jena linio|jenaj linioj}} de spama nigralisto estas {{PLURAL:$1|nevlidaj regularaj esprimoj|nevlidaj regularaj esprimoj}} kaj devas esti {{PLURAL:$1|korektigita|korektigitaj}} antaŭ savante la paĝon:',
-	'spam-blacklist-desc' => 'Regex-bazita kontraŭspamilo: [[MediaWiki:Spam-blacklist]] kaj [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Regex-bazita kontraŭspamilo: [[MediaWiki:Spam-blacklist]] kaj [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Spanish (español)
  * @author Armando-Martin
  * @author Dferg
  * @author Drini
+ * @author MarcoAurelio
  * @author Sanbec
  * @author Vivaelcelta
  */
@@ -915,7 +1039,7 @@ $messages['es'] = array(
 	'spam-blacklisted-email-text' => 'Su dirección de correo electrónico está actualmente en la lista negra y no puede enviar correos electrónicos a otros usuarios.',
 	'spam-blacklisted-email-signup' => 'La dirección de correo electrónico dada está actualmente en la lista negra de uso.',
 	'spam-invalid-lines' => '{{PLURAL:$1|La siguiente línea|Las siguientes líneas}} de la lista negra de spam {{PLURAL:$1|es una expresión regular inválida|son expresiones regulares inválidas}} y es necesario {{PLURAL:$1|corregirla|corregirlas}} antes de guardar la página:',
-	'spam-blacklist-desc' => 'Herramienta anti-spam basada en expresiones regulares [[MediaWiki:Spam-blacklist]] y [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Herramienta anti-spam basada en expresiones regulares [[MediaWiki:Spam-blacklist]] y [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Estonian (eesti)
@@ -961,9 +1085,14 @@ $messages['et'] = array(
 #   * Iga rida, mis ei ole tühi, on regulaaravaldise osa, mis vastab ainult e-posti aadressides sisalduvatele hostinimedele.',
 	'spam-blacklisted-email' => 'Musta nimekirja kantud e-posti aadress',
 	'spam-blacklisted-email-text' => 'Musta nimekirja sissekande tõttu on sinu e-posti aadressilt teistele kasutajatele e-kirjade saatmine praegu keelatud.',
-	'spam-blacklisted-email-signup' => 'Selle e-posti aadressi kasutamine praegu musta nimekirja sissekandega keelatud.',
+	'spam-blacklisted-email-signup' => 'Selle e-posti aadressi kasutamine on praegu musta nimekirja sissekandega keelatud.',
 	'spam-invalid-lines' => '{{PLURAL:$1|Järgmine rida|Järgmised read}} rämpspostituste mustas nimekirjas on {{PLURAL:$1|vigane regulaaravaldis|vigased regulaaravaldised}} ja {{PLURAL:$1|see|need}} tuleb enne lehekülje salvestamist parandada:',
-	'spam-blacklist-desc' => 'Regulaaravaldisel põhinev tööriist: [[MediaWiki:Spam-blacklist]] ja [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Regulaaravaldisel põhinev tööriist, mis võimaldab lisada musta nimekirja lehekülgedel toodud internetiaadresse ning registreeritud kasutajate e-posti aadresse.',
+	'log-name-spamblacklist' => 'Rämpsu musta nimekirja logi',
+	'log-description-spamblacklist' => 'Siin on loetletud rämpspostituse musta nimekirja tabamused.',
+	'logentry-spamblacklist-hit' => '$1 püüdis lisada leheküljele $3 rämpspostituse mustas nimekirjas olevat linki $4.',
+	'right-spamblacklistlog' => 'Vaadata rämpsu musta nimekirja',
+	'action-spamblacklistlog' => 'vaadata rämpsu musta nimekirja',
 );
 
 /** Persian (فارسی)
@@ -1005,9 +1134,16 @@ $messages['fa'] = array(
 #  * هر سطر از متن به عنوان یک دستور از نوع عبارت باقاعده در نظر گرفته می‌شود که فقط با نام میزبان در نشانی پست الکترونیکی مطابقت داده می‌شود',
 	'spam-blacklisted-email' => 'نشانی پست الکترونیکی موجود در لیست سیاه',
 	'spam-blacklisted-email-text' => 'نشانی پست الکترونیکی شما در حال حاضر در فهرست سیاه قرار دارد و نمی‌توانید به دیگر کاربران نامه بفرستید.',
-	'spam-blacklisted-email-signup' => 'نشانی پست الکترونیکی داده شده در حال حاضر در فهرست سیاه است و قابل استفاده نیست.',
-	'spam-invalid-lines' => '{{PLURAL:$1|سطر|سطرهای}} زیر در فهرست سیاه هرزنگاری، عبارات باقاعدهٔ غیر مجاز {{PLURAL:$1|است|هستند}} و قبل از ذخیره کردن صفحه باید اصلاح {{PLURAL:$1|شود|شوند}}:',
-	'spam-blacklist-desc' => 'ابزار ضد هرزنویسی مبتنی بر regular expressions: [[MediaWiki:Spam-blacklist]] و [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklisted-email-signup' => 'نشانی رایانامه داده‌شده در حال حاضر در فهرست سیاه است.',
+	'spam-invalid-lines' => '{{PLURAL:$1|سطر|سطرهای}} زیر در فهرست سیاه هرزنگاری، عبارات باقاعدهٔ نامجاز {{PLURAL:$1|است|هستند}} و قبل از ذخیره کردن صفحه باید اصلاح {{PLURAL:$1|شود|شوند}}:',
+	'spam-blacklist-desc' => 'Regex-based anti-spam tool allowing to blacklist URLs in pages and email addresses for registered users
+
+ابزار بر پایهٔ عبارت باقاعده ضدهرزنگاری اجازهٔ فهرست سیاه‌کردن نشانی‌های اینترنتی در صفحه‌ها و نشانی‌های رایانامه برای کاربران ثبت نام کرده',
+	'log-name-spamblacklist' => 'سیاههٔ فهرست سیاه هرزنگاری',
+	'log-description-spamblacklist' => 'این رویدادها وقوع فهرست سیاه هزنگاری را دنبال می‌کند.',
+	'logentry-spamblacklist-hit' => '$1 در $3 با تلاش در افزودن $4 باعث برخورد به فهرست سیاه هرزنامه شده‌است.',
+	'right-spamblacklistlog' => 'دیدن یک سیاههٔ فهرست سیاه هرزنامه',
+	'action-spamblacklistlog' => 'دیدن سیاههٔ فهرست سیاه هرزنامه',
 );
 
 /** Finnish (suomi)
@@ -1016,9 +1152,11 @@ $messages['fa'] = array(
  * @author Linnea
  * @author Nike
  * @author Olli
+ * @author Pxos
  */
 $messages['fi'] = array(
-	'spam-blacklist' => ' # Tämän listan säännöillä voi estää ulkopuolisiin sivustoihin viittaavien osoitteiden lisäämisen.
+	'spam-blacklist' => '  #<!-- leave this line exactly as it is --> <pre>
+ # Tämän listan säännöillä voi estää ulkopuolisiin sivustoihin viittaavien osoitteiden lisäämisen.
  # Tämä lista koskee vain tätä wikiä. Tutustu myös järjestelmänlaajuiseen mustaan listaan.
  # Lisätietoja on osoitteessa http://www.mediawiki.org/wiki/Extension:SpamBlacklist
  #<!-- Älä koske tähän riviin lainkaan --> <pre>
@@ -1028,18 +1166,18 @@ $messages['fi'] = array(
 #   * Jokainen ei-tyhjä rivi on säännöllisen lausekkeen osa, joka tunnistaa vain osoitteissa olevat verkkotunnukset.
 
  #</pre> <!-- Älä koske tähän riviin lainkaan -->',
-	'spam-whitelist' => ' #<!-- älä koske tähän riviin --> <pre>
-# Tällä sivulla on säännöt, joihin osuvia ulkoisia osoitteita ei estetä, vaikka ne olisivat estolistalla.
+	'spam-whitelist' => '  #<!-- älä koske tähän riviin --> <pre>
+ # Tällä sivulla on säännöt, joihin osuvia ulkoisia osoitteita ei estetä, vaikka ne olisivat mustalla listalla.
 #
 # Syntaksi on seuraava:
 #  * Kommentti alkaa #-merkistä ja jatkuu rivin loppuun
 #  * Muut ei-tyhjät rivit tulkitaan säännöllisen lausekkeen osaksi, joka tutkii vain osoitteissa olevia verkko-osoitteita.
 
  #</pre> <!-- älä koske tähän riviin -->',
-	'email-blacklist' => ' # Tällä listalla olevat sähköpostit estetään rekisteröitymästä tai lähettämästä sähköpostia
- # Tämä lista koskee vain tätä wikiä. Tutustu myös järjestelmänlaajuiseen mustaan listaan.
- # Lisätietoja on osoitteessa https://www.mediawiki.org/wiki/Extension:SpamBlacklist
- #<!-- Älä koske tähän riviin lainkaan --> <pre>
+	'email-blacklist' => '  #<!-- leave this line exactly as it is --> <pre> 
+# Tällä listalla olevia sähköpostiosoitteita estetään rekisteröitymästä tai lähettämästä sähköpostia
+# Tämä lista koskee vain tätä wikiä. Tutustu myös järjestelmänlaajuiseen mustaan listaan.
+# Lisätietoja on osoitteessa https://www.mediawiki.org/wiki/Extension:SpamBlacklist
 #
 # Syntaksi on seuraavankaltainen:
 #   * Kaikki #-merkistä lähtien rivin loppuun asti on kommenttia
@@ -1050,7 +1188,12 @@ $messages['fi'] = array(
 	'spam-blacklisted-email-text' => 'Sähköpostisi on tällä hetkellä mustalla listalla, etkä voi lähettää sähköpostia muille käyttäjille.',
 	'spam-blacklisted-email-signup' => 'Annettu sähköpostiosoite on tällä hetkellä mustalla listalla.',
 	'spam-invalid-lines' => 'Listalla on {{PLURAL:$1|seuraava virheellinen säännöllinen lauseke, joka|seuraavat virheelliset säännölliset lausekkeet, jotka}} on korjattava ennen tallentamista:',
-	'spam-blacklist-desc' => 'Säännöllisiä lausekkeita tukeva mainossuodatin: [[MediaWiki:Spam-blacklist|estolista]] ja [[MediaWiki:Spam-whitelist|poikkeuslista]].',
+	'spam-blacklist-desc' => 'Säännöllisiä lausekkeita (reg-ex) tukeva roskalinkkejä torjuva työkalu, jonka avulla internet-osoitteita (URL) sivuilla ja sähköpostiosoitteissa voidaan asettaa mustalle listalle. Tarkoitettu kirjautuneille käyttäjille.',
+	'log-name-spamblacklist' => 'Roskalinkkien torjuntalistan loki',
+	'log-description-spamblacklist' => 'Nämä tapahtumat ovat osumia roskalinkkien torjuntalistalla.',
+	'logentry-spamblacklist-hit' => '$1 sai aikaan osuman roskalinkkien torjuntalistalla kohteessa $3 yrittäessään lisätä $4',
+	'right-spamblacklistlog' => 'Tarkastella roskalinkkien torjuntalistan lokia',
+	'action-spamblacklistlog' => 'nähdä roskalinkkien torjuntalistan lokia',
 );
 
 /** French (français)
@@ -1101,7 +1244,12 @@ $messages['fr'] = array(
 	'spam-blacklisted-email-text' => "Votre adresse de courriel est actuellement sur une liste noire d'envoi de courriel aux autres utilisateurs.",
 	'spam-blacklisted-email-signup' => "L'adresse de courriel fournie est actuellement sur une liste noire d'utilisation.",
 	'spam-invalid-lines' => '{{PLURAL:$1|La ligne suivante|Les lignes suivantes}} de la liste noire des polluriels {{PLURAL:$1|est une expression rationnelle invalide|sont des expressions rationnelles invalides}} et doi{{PLURAL:$1||ven}}t être corrigée{{PLURAL:$1||s}} avant d’enregistrer la page :',
-	'spam-blacklist-desc' => "Outil anti-pourriel basé sur des expressions rationnelles : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''",
+	'spam-blacklist-desc' => 'Outil anti-pourriel basé sur des expressions rationnelles permettant de mettre en liste noire des URLs dans les pages et des adresses de courriel pour les utilisateurs enregistrés',
+	'log-name-spamblacklist' => 'Journal de liste noire des pourriels',
+	'log-description-spamblacklist' => 'Ces événements tracent les correspondances avec la liste noire des pourriels.',
+	'logentry-spamblacklist-hit' => '$1 a provoqué un correspondance avec la liste noire des pourriels sur $3 en essayant d’ajouter $4.',
+	'right-spamblacklistlog' => 'Afficher le journal de la liste noire des pourriels',
+	'action-spamblacklistlog' => 'afficher le journal de la liste noir des pourriels',
 );
 
 /** Franco-Provençal (arpetan)
@@ -1128,7 +1276,7 @@ $messages['frp'] = array(
 
   #</pre> <!-- lèssiéd ceta legne justo d’ense -->',
 	'spam-invalid-lines' => '{{PLURAL:$1|Ceta legne|Cetes legnes}} de la lista nêre des spames {{PLURAL:$1|est una èxprèssion racionèla envalida|sont des èxprèssions racionèles envalides}} et dê{{PLURAL:$1||von}}t étre corregiê{{PLURAL:$1||s}} devant que sôvar la pâge :',
-	'spam-blacklist-desc' => "Outil anti-spame basâ sur des èxprèssions racionèles (''RegEx'') : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''.",
+	'spam-blacklist-desc' => "Outil anti-spame basâ sur des èxprèssions racionèles (''RegEx'') : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''.", # Fuzzy
 );
 
 /** Galician (galego)
@@ -1137,10 +1285,10 @@ $messages['frp'] = array(
  * @author Xosé
  */
 $messages['gl'] = array(
-	'spam-blacklist' => ' # As ligazóns externas que coincidan na súa totalidade ou en parte con algún rexistro desta lista serán bloqueadas cando se intenten engadir a unha páxina.
- # Esta lista afecta unicamente a este wiki; tamén existe unha lista global.
- # Para obter máis documentación vaia a https://www.mediawiki.org/wiki/Extension:SpamBlacklist
- #<!-- Deixe esta liña tal e como está --> <pre>
+	'spam-blacklist' => ' #<!-- Deixe esta liña tal e como está --> <pre>
+# As ligazóns externas que coincidan na súa totalidade ou en parte con algún rexistro desta lista serán bloqueadas cando se intenten engadir a unha páxina.
+# Esta lista afecta unicamente a este wiki; tamén existe unha lista global.
+# Para obter máis documentación vaia a https://www.mediawiki.org/wiki/Extension:SpamBlacklist
 #
 # A sintaxe é a seguinte:
 #   * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
@@ -1148,18 +1296,18 @@ $messages['gl'] = array(
 
  #</pre> <!-- Deixe esta liña tal e como está -->',
 	'spam-whitelist' => ' #<!-- Deixe esta liña tal e como está --> <pre>
- # As ligazóns externas que coincidan con esta lista *non* serán bloqueadas mesmo se
- # fosen bloqueadas mediante entradas na lista negra.
+# As ligazóns externas que coincidan con esta lista *non* serán bloqueadas mesmo se
+# fosen bloqueadas mediante entradas na lista negra.
 #
-# A sintaxe é a que segue:
+# A sintaxe é a seguinte:
 #   * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
 #   * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos URL
 
  #</pre> <!-- Deixe esta liña tal e como está -->',
-	'email-blacklist' => ' # Os enderezos de correo electrónico que coincidan na súa totalidade ou en parte con algún rexistro desta lista serán bloqueadas cando se intenten rexistrar ou se intente enviar un correo desde eles.
- # Esta lista afecta unicamente a este wiki; tamén existe unha lista global.
- # Para obter máis documentación vaia a https://www.mediawiki.org/wiki/Extension:SpamBlacklist
- #<!-- Deixe esta liña tal e como está --> <pre>
+	'email-blacklist' => ' #<!-- Deixe esta liña tal e como está --> <pre>
+# Os enderezos de correo electrónico que coincidan na súa totalidade ou en parte con algún rexistro desta lista serán bloqueadas cando se intenten rexistrar ou se intente enviar un correo desde eles.
+# Esta lista afecta unicamente a este wiki; tamén existe unha lista global.
+# Para obter máis documentación vaia a https://www.mediawiki.org/wiki/Extension:SpamBlacklist
 #
 # A sintaxe é a seguinte:
 #   * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
@@ -1169,17 +1317,22 @@ $messages['gl'] = array(
 	'email-whitelist' => ' #<!-- Deixe esta liña tal e como está --> <pre>
 # Os enderezos de correo electrónico que coincidan con algún desta lista *non* serán bloqueados,
 # mesmo se foron bloqueados por entradas da lista negra.
-#
- #</pre> <!-- Deixe esta liña tal e como está -->
 #
 # A sintaxe é a seguinte:
 #   * Todo o que vaia despois dun carácter "#" ata o final da liña é un comentario
-#   * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos de correo electrónico',
+#   * Toda liña que non estea en branco é un fragmento de expresión regular que só coincide con dominios dentro de enderezos de correo electrónico
+
+ #</pre> <!-- Deixe esta liña tal e como está -->',
 	'spam-blacklisted-email' => 'Enderezo de correo electrónico presente na lista negra',
 	'spam-blacklisted-email-text' => 'O seu enderezo de correo electrónico atópase na lista negra e non pode enviar correos electrónicos aos outros usuarios.',
 	'spam-blacklisted-email-signup' => 'O enderezo de correo electrónico especificado está na lista negra e non se pode empregar.',
 	'spam-invalid-lines' => '{{PLURAL:$1|A seguinte liña|As seguintes}} da lista negra de spam {{PLURAL:$1|é unha expresión regular inválida|son expresións regulares inválidas}} e {{PLURAL:$1|haina|hainas}} que corrixir antes de gardar a páxina:',
-	'spam-blacklist-desc' => 'Ferramenta antispam baseada en expresións regulares: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Ferramenta antispam baseada en expresións regulares que permite incluír enderezos URL e enderezos de correo electrónico nunha lista negra para os usuarios rexistrados',
+	'log-name-spamblacklist' => 'Rexistro da lista negra de spam',
+	'log-description-spamblacklist' => 'Este rexistro fai un seguimento das coincidencias coa lista negra de spam.',
+	'logentry-spamblacklist-hit' => '$1 provocou a activación da lista negra de spam en "$3" ao intentar engadir $4.',
+	'right-spamblacklistlog' => 'Ver o rexistro da lista negra de spam',
+	'action-spamblacklistlog' => 'ver o rexistro da lista negra de spam',
 );
 
 /** Swiss German (Alemannisch)
@@ -1227,10 +1380,11 @@ $messages['gsw'] = array(
 	'spam-blacklisted-email-text' => 'Dyy E-Mail-Adräss isch zurzyt fir s Sände vu E-Mail-Nochrichte an anderi Benutzer blockiert.',
 	'spam-blacklisted-email-signup' => 'Di aagee E-Mail-Adräss isch zurzyt fir s Sände vu E-Mail-Nochrichte an anderi Benutzer blockiert.',
 	'spam-invalid-lines' => 'Die {{PLURAL:$1|Zyylete|Zyylete}} in dr Spam-Blacklist {{PLURAL:$1|isch e nit giltige reguläre Usdruck|sin nit giltigi reguläri Usdrick}}. Si {{PLURAL:$1|muess|mien}} vor em Spychere vu dr Syte korrigiert wäre:',
-	'spam-blacklist-desc' => 'Regex-basiert Anti-Spam-Wärchzyyg: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Regex-basiert Anti-Spam-Wärchzyyg: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Gujarati (ગુજરાતી)
+ * @author Ashok modhvadia
  * @author KartikMistry
  * @author Sushant savla
  */
@@ -1272,7 +1426,7 @@ $messages['gu'] = array(
 	'spam-blacklisted-email-text' => 'તમારા ઈ-મેલ સરનામાં પર હાલમાં પ્રતિબંધ લગાડેલો છે આથી તમે ઈ-મેલ મોકલી  નહીં શકો.',
 	'spam-blacklisted-email-signup' => 'આ ઈ-મેલ પર હાલમાં વપરાશ પ્રતિબંધ લાગેલો છે.',
 	'spam-invalid-lines' => 'નીચેને સ્પૅમ બ્લેકલીસ્ટમાં {{PLURAL:$1| લાઈન|લાઈનો}} અમાન્ય છે. નિયમીત {{PLURAL:$1|expression|expressions}} અને પાનુમ્ સાચવ્યાં પહેલા તેને સુધારી લેશો.',
-	'spam-blacklist-desc' => 'Regex-આધારિત ઍન્ટી સ્પૅમ સાધનl: [[MediaWiki:Spam-blacklist]] અને [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Regex-આધારિત ઍન્ટી સ્પૅમ સાધનો પાનાઓ અને નોંધાયેલા સભ્યોનાં ઇમેલ સરનામાઓમાં URLs ને બ્લેકલિસ્ટ કરવા દે છે.',
 );
 
 /** Hebrew (עברית)
@@ -1321,7 +1475,12 @@ $messages['he'] = array(
 	'spam-blacklisted-email-signup' => 'כתובת הדוא"ל הזאת נמצאת כרגע ברשימה השחורה של כתובות אסורות לשימוש.',
 	'spam-invalid-lines' => '{{PLURAL:$1|השורה הבאה|השורות הבאות}} ברשימת כתובות ה־URL האסורות
 	{{PLURAL:$1|היא ביטוי רגולרי בלתי תקין ויש לתקנה|הן ביטויים רגולריים בלתי תקינים ויש לתקנן}} לפני שמירת הדף:',
-	'spam-blacklist-desc' => 'כלי אנטי־ספאם מבוסס ביטוי רגולרי: [[MediaWiki:Spam-blacklist]] ו־[[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'כלי נגד זבל מבוסס ביטויים רגולריים ליצירת רשימה שחורה של URL־ים בדפים וכתובות דוא"ל למשתמשים רשומים',
+	'log-name-spamblacklist' => 'יומן רשימה שחורה של ספאם',
+	'log-description-spamblacklist' => 'האירועים האלה עוקבים אחרי הפעלות של רשימה שחורה של ספאם.',
+	'logentry-spamblacklist-hit' => '$1 {{GENDER:$1|גרם|גרמה}} לפעולת רשימה שחורה בדף $3 תוך כדי ניסיון להוסיף את הכתובת $4.',
+	'right-spamblacklistlog' => 'תצוגת יומן רשימה שחורה של ספאם',
+	'action-spamblacklistlog' => 'תצוגת יומן רשימה שחורה של ספאם',
 );
 
 /** Hindi (हिन्दी)
@@ -1349,7 +1508,7 @@ $messages['hi'] = array(
 
  #</pre> <!-- इस पंक्तीं को ऐसे के ऐसे ही रहने दें -->',
 	'spam-invalid-lines' => 'निम्नांकित अवांछित ब्लैकलिस्ट {{PLURAL:$1|पंक्ति|पंक्तियाँ}} अमान्य नियमित {{PLURAL:$1|अभिव्यक्ति है|अभिव्यक्तियाँ हैं}} और पृष्ठ को जमा कराने से पहले ठीक करना चाहिए:',
-	'spam-blacklist-desc' => 'रेजएक्स पर आधारित स्पॅम रोकनेवाला उपकरण:[[MediaWiki:Spam-blacklist]] और [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'रेजएक्स पर आधारित स्पॅम रोकनेवाला उपकरण:[[MediaWiki:Spam-blacklist]] और [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Croatian (hrvatski)
@@ -1378,7 +1537,7 @@ $messages['hr'] = array(
 
  #</pre> <!-- leave this line exactly as it is -->',
 	'spam-invalid-lines' => '{{PLURAL:$1|Slijedeći redak|Slijedeći redovi|Slijedeći redovi}} "crnog popisa" spama {{PLURAL:$1|je|su}} nevaljani {{PLURAL:$1|regularan izraz|regularni izrazi|regularni izrazi}} i {{PLURAL:$1|mora|moraju|moraju}} biti ispravljeni prije snimanja ove stranice:',
-	'spam-blacklist-desc' => 'Anti-spam alat zasnovan na reg. izrazima: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Anti-spam alat zasnovan na reg. izrazima: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Upper Sorbian (hornjoserbsce)
@@ -1426,7 +1585,7 @@ $messages['hsb'] = array(
 	'spam-blacklisted-email-text' => 'Twoja e-mejlowa adresa je tuchwilu w čornej lisćinje a tohodla za słanje e-mejlow do druhich wužiwarjow zablokowana.',
 	'spam-blacklisted-email-signup' => 'Podata e-mejlowa adresa je tuchwilu přećiwo wužiwanju zablokowana.',
 	'spam-invalid-lines' => '{{PLURAL:$1|slědowaca linka je njepłaćiwy regularny wuraz|slědowacych linkow je regularny wuraz|slědowace linki su regularne wurazy|slědowacej lince stej regularnej wurazaj}} a {{PLURAL:$1|dyrbi|dyrbi|dyrbja|dyrbjetej}} so korigować, prjedy hač so strona składuje:',
-	'spam-blacklist-desc' => 'Přećiwospamowy nastroj na zakładźe Regex: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Přećiwospamowy nastroj na zakładźe Regex: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Hungarian (magyar)
@@ -1455,7 +1614,7 @@ $messages['hu'] = array(
 	'spam-blacklisted-email' => 'Feketelistás e-mail cím',
 	'spam-blacklisted-email-signup' => 'A megadott email cím jelenleg feketelistán van, és nem lehet használni.',
 	'spam-invalid-lines' => 'Az alábbi {{PLURAL:$1|sor hibás|sorok hibásak}} a spam elleni feketelistában; {{PLURAL:$1|javítsd|javítsd őket}} mentés előtt:',
-	'spam-blacklist-desc' => 'Regex-alapú spamellenes eszköz: [[MediaWiki:Spam-blacklist]] és [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Regex-alapú spamellenes eszköz: [[MediaWiki:Spam-blacklist]] és [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Interlingua (interlingua)
@@ -1503,7 +1662,7 @@ $messages['ia'] = array(
 	'spam-blacklisted-email-text' => 'Tu adresse de e-mail es actualmente blocate de inviar messages a altere usatores.',
 	'spam-blacklisted-email-signup' => 'Le adresse de e-mail specificate es actualmente blocate per le lista nigre.',
 	'spam-invalid-lines' => 'Le sequente {{PLURAL:$1|linea|lineas}} del lista nigre antispam es {{PLURAL:$1|un expression|expressiones}} regular invalide e debe esser corrigite ante que tu immagazina le pagina:',
-	'spam-blacklist-desc' => 'Instrumento antispam a base de regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Instrumento antispam a base de regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Indonesian (Bahasa Indonesia)
@@ -1535,7 +1694,7 @@ $messages['id'] = array(
 	'spam-blacklisted-email' => 'Alamat surel yang masuk daftar hitam',
 	'spam-blacklisted-email-signup' => 'Alamat surel yang dimasukkan saat ini sedang tidak boleh digunakan.',
 	'spam-invalid-lines' => '{{PLURAL:$1|Baris|Baris-baris}} daftar hitam spam berikut adalah {{PLURAL:$1|ekspresi|ekspresi}} regular yang tak valid dan {{PLURAL:$1|perlu|perlu}} dikoreksi sebelum disimpan:',
-	'spam-blacklist-desc' => 'Perkakas anti-spam berbasis regex: [[MediaWiki:Spam-blacklist]] dan [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Perkakas anti-spam berbasis regex: [[MediaWiki:Spam-blacklist]] dan [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Iloko (Ilokano)
@@ -1578,7 +1737,12 @@ $messages['ilo'] = array(
 	'spam-blacklisted-email-text' => 'Ti e-suratmo a pagtaengan ket agdama a naiparit manipud ti panagipatulod kadagiti e-surat kadagiti sabsabali nga agar-aramat.',
 	'spam-blacklisted-email-signup' => 'Ti naited nga e-surat a pagatengan ket agdama a naiparit manipud ti panagusar.',
 	'spam-invalid-lines' => 'Ti sumaganad a spam blacklist {{PLURAL:$1| a linia ket|kadagiti linia ket}} imbalido a kadawyan {{PLURAL:$1|a nangisao|kadagiti panangisao}} ken {{PLURAL:$1|masapsapol|masapol}} a mapudnuan sakbay nga idulin ti panid:',
-	'spam-blacklist-desc' => 'Naibantay ti regex kontra-spam a ramit: [[MediaWiki:Spam-blacklist]] ken [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Naibatay ti regex a ramit ti kontra-spam a mangpalubos a mangiparit kadagiti URL kadagiti panid ken dagiti esurat a pagtaengan para kadagiti nakarehistro nga agar-aramat',
+	'log-name-spamblacklist' => 'Listaan ti naiparit para iti spam',
+	'log-description-spamblacklist' => 'Dagitoy a pasamak ket surotenna dagiti naiparit a listaan a napuntaan ti spam.',
+	'logentry-spamblacklist-hit' => 'Ti $1 ket gapuanan ti pannakapunta ti naiparit a listaan ti spam iti $3 babaen ti panagpadas nga aginayon iti $4.',
+	'right-spamblacklistlog' => 'Kitaen ti naiparit a listaan ti spam',
+	'action-spamblacklistlog' => 'kitaen ti naiparit a listaan ti spam',
 );
 
 /** Icelandic (íslenska)
@@ -1623,7 +1787,7 @@ $messages['is'] = array(
 	'spam-blacklisted-email-text' => 'Netfangið þitt er skráð á bannlista og ekki er hægt að senda tölfupóst frá því til annara notenda.',
 	'spam-blacklisted-email-signup' => 'Netfangið sem þú tilgreindir er á bannlista og er ekki hægt að nota.',
 	'spam-invalid-lines' => 'Eftirfarandi bannlista {{PLURAL:$1|færsla er ógild regluleg segð|færslur eru ógildar reglulegar segðir}} og leiðrétta þarf {{PLURAL:$1|hana|þær}} áður en síðan er vistuð:',
-	'spam-blacklist-desc' => 'Kæfuvörn byggð á reglulegum segðum: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Kæfuvörn byggð á reglulegum segðum: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Italian (italiano)
@@ -1632,10 +1796,11 @@ $messages['is'] = array(
  * @author Ximo17
  */
 $messages['it'] = array(
-	'spam-blacklist' => ' # Le URL esterne al sito che corrispondono alla lista seguente verranno bloccate.
- # La lista è valida solo per questo sito; fare riferimento anche alla blacklist globale.
- # Per la documentazione si veda https://www.mediawiki.org/wiki/Extension:SpamBlacklist
- #<!-- non modificare in alcun modo questa riga --> <pre>
+	'spam-blacklist' => ' #<!-- non modificare in alcun modo questa riga --> <pre>
+# Le URL esterne al sito che corrispondono alla lista seguente verranno bloccate.
+# La lista è valida solo per questo sito; fare riferimento anche alla blacklist globale.
+# Per la documentazione si veda https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
 # La sintassi è la seguente:
 #  * Tutto ciò che segue un carattere "#" è un commento, fino al termine della riga
 #  * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host nelle URL
@@ -1647,29 +1812,34 @@ $messages['it'] = array(
 # La sintassi è la seguente:
 #  * Tutto ciò che segue un carattere "#" è un commento, fino al termine della riga
 #  * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host nelle URL
-
  #</pre> <!-- non modificare in alcun modo questa riga -->',
-	'email-blacklist' => ' # Gli indirizzi e-mail che corrispondono alla lista seguente saranno bloccati, non sarà possibile salvare o inviare e-mail.
- # La lista è valida solo per questo wiki; fare riferimento anche alla blacklist globale.
- # Per la documentazione si veda https://www.mediawiki.org/wiki/Extension:SpamBlacklist
- # <!-- non modificare questa linea --> <pre>
+	'email-blacklist' => ' #<!-- non modificare in alcun modo questa riga --> <pre>
+# Gli indirizzi email che corrispondono alla lista seguente saranno bloccati, non sarà possibile salvare o inviare email.
+# La lista è valida solo per questo sito; fare riferimento anche alla blacklist globale.
+# Per la documentazione si veda https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
 # La sintassi è la seguente:
-#  * Tutto ciò che è compreso tra un carattere "#" e la fine della riga è un commento
-#  * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host degli indirizzi e-mail
- #</pre> <!-- non modificare questa linea -->',
-	'email-whitelist' => ' #<!-- non modificare questa linea --> <pre>
-# Gli indirizzi e-mail compresi in questa lista *non* saranno bloccati anche se dovrebbero
-# essere stati bloccati dagli elementi presenti nella lista nera.
-#
- #</pre> <!-- non modificare questa linea -->
+#  * Tutto ciò che segue un carattere "#" è un commento, fino al termine della riga
+#  * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host degli indirizzi email
+ #</pre> <!-- non modificare in alcun modo questa riga -->',
+	'email-whitelist' => ' #<!-- non modificare in alcun modo questa riga --> <pre>
+# Gli indirizzi email che corrispondono alla lista seguente *non* verranno
+# bloccati, anche nel caso corrispondano a delle voci della blacklist
+#
 # La sintassi è la seguente:
-#  * Tutto ciò che è compreso tra un carattere "#" e la fine della riga è un commento
-#  * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host degli indirizzi e-mail',
+#  * Tutto ciò che segue un carattere "#" è un commento, fino al termine della riga
+#  * Tutte le righe non vuote sono frammenti di espressioni regolari che si applicano al solo nome dell\'host degli indirizzi email
+ #</pre> <!-- non modificare in alcun modo questa riga -->',
 	'spam-blacklisted-email' => 'Indirizzo di posta elettronica bloccato',
 	'spam-blacklisted-email-text' => "Il tuo indirizzo di posta elettronica è attualmente nella lista nera per l'invio di email verso altri utenti.",
 	'spam-blacklisted-email-signup' => "L'indirizzo di posta elettronica indicato è attualmente nella lista nera.",
 	'spam-invalid-lines' => "{{PLURAL:$1|La seguente riga|Le seguenti righe}} della blacklist dello spam {{PLURAL:$1|non è un'espressione regolare valida|non sono espressioni regolari valide}}; si prega di correggere {{PLURAL:$1|l'errore|gli errori}} prima di salvare la pagina.",
-	'spam-blacklist-desc' => 'Strumento antispam basato sulle espressioni regolari [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Strumento antispam basato sulle espressioni regolari per bloccare URL e indirizzi email di utenti registrati',
+	'log-name-spamblacklist' => 'Spam blacklist',
+	'log-description-spamblacklist' => 'Questi eventi tengono traccia delle attivazioni della lista nera dello spam.',
+	'logentry-spamblacklist-hit' => "$1 ha causato l'attivazione della spam blacklist su $3 tentando di aggiungere $4.",
+	'right-spamblacklistlog' => 'Visualizza registro della spam blacklist',
+	'action-spamblacklistlog' => 'vedere il registro della spam blacklist',
 );
 
 /** Japanese (日本語)
@@ -1688,7 +1858,7 @@ $messages['ja'] = array(
 #
 # 構文は以下の通りです:
 #  * 「#」以降行末まではコメントです
-#  * 空白を含まない行は、URLに含まれるホスト名との一致を検出する正規表現です
+#  * 空でない行は、URLに含まれるホスト名との一致を検出する正規表現です
 
  #</pre> <!-- この行は変更しないでください -->',
 	'spam-whitelist' => ' #<!-- この行は変更しないでください --> <pre>
@@ -1697,21 +1867,45 @@ $messages['ja'] = array(
 #
 # 構文は以下の通りです:
 #  * 「#」文字から行末まではコメントとして扱われます
-#  * 空白を含まない行は、URLに含まれるホスト名との一致を検出する正規表現です
+#  * 空でない行は、URLに含まれるホスト名との一致を検出する正規表現です
+
+ #</pre> <!-- この行は変更しないでください -->',
+	'email-blacklist' => ' #<!-- この行は変更しないでください --> <pre>
+# この一覧と一致するメールアドレスはその登録とそこからのメール送信がブロックされます。
+# この一覧はこのウィキでのみ有効です。グローバル ブラックリストも参照してください。
+# 利用方法は https://www.mediawiki.org/wiki/Extension:SpamBlacklist/ja をご覧ください。
+#
+# 構文は以下の通りです:
+#  * 「#」以降行末まではコメントです
+#  * 空でない行は、URLに含まれるホスト名との一致を検出する正規表現です
+
+ #</pre> <!-- この行は変更しないでください -->',
+	'email-whitelist' => ' #<!-- この行は変更しないでください --> <pre>
+# この一覧と一致するメールアドレスはたとえブラックリストに
+# 掲載されていたとしても、ブロック*されません*。
+#
+# 構文は以下の通りです:
+#  * 「#」文字から行末まではコメントとして扱われます
+#  * 空でない行は、URLに含まれるホスト名との一致を検出する正規表現です
 
  #</pre> <!-- この行は変更しないでください -->',
 	'spam-blacklisted-email' => '拒否リストにあるメールアドレス',
 	'spam-blacklisted-email-text' => 'メールアドレスが拒否リストに入っているため、他の利用者にメールを送信できません。',
 	'spam-blacklisted-email-signup' => '指定されたメールアドレスは現在拒否リストに入っており、使用できません。',
 	'spam-invalid-lines' => 'このスパムブラックリストには、無効な{{PLURAL:$1|正規表現}}を含む{{PLURAL:$1|行}}があります。保存する前に問題部分を修正してください:',
-	'spam-blacklist-desc' => '正規表現を用いたスパム対策ツール: [[MediaWiki:Spam-blacklist|スパムブラックリスト]]および[[MediaWiki:Spam-whitelist|スパムホワイトリスト]]',
+	'spam-blacklist-desc' => 'ページ内の URL や登録利用者のメールアドレスをブラックリスト化できるようにする、正規表現に基づいたスパム対策ツール',
+	'log-name-spamblacklist' => 'スパムブラックリスト記録',
+	'log-description-spamblacklist' => 'これらのイベントはスパムブラックリストとの一致を追跡します。',
+	'logentry-spamblacklist-hit' => '$1 が $3 に $4 を追加しようとした際にスパムブラックリストが発動しました。',
+	'right-spamblacklistlog' => 'スパムブラックリストを閲覧',
+	'action-spamblacklistlog' => 'スパムブラックリスト記録の閲覧',
 );
 
 /** Jutish (jysk)
  * @author Ælsån
  */
 $messages['jut'] = array(
-	'spam-blacklist-desc' => 'Regex-basærn anti-spem tø: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Regex-basærn anti-spem tø: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Javanese (Basa Jawa)
@@ -1742,7 +1936,7 @@ $messages['jv'] = array(
 	'spam-blacklisted-email-text' => 'Alamat layang èlèktronik Sampéyan saiki didaptarirengaké saka ngirim layang èlèktronik nèng panganggi liya.',
 	'spam-blacklisted-email-signup' => 'Alamat layang èlèktronik sing diawèhaké saiki ora dililakaké.',
 	'spam-invalid-lines' => '{{PLURAL:$1|Baris|Baris-baris}} daftar ireng spam ing ngisor iki yaiku {{PLURAL:$1|èksprèsi|èksprèsi}} regulèr sing ora absah lan {{PLURAL:$1|perlu|perlu}} dikorèksi sadurungé disimpen:',
-	'spam-blacklist-desc' => 'Piranti anti-spam adhedhasar regex: [[MediaWiki:Spam-blacklist]] lan [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Piranti anti-spam adhedhasar regex: [[MediaWiki:Spam-blacklist]] lan [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Georgian (ქართული)
@@ -1790,7 +1984,7 @@ $messages['ka'] = array(
 	'spam-blacklisted-email-text' => 'ამჟამად თქვენი ელ.ფოსტის მისამართი შეტანილია შავ სიაში, ამიტომ თქვენ არ შეგიძლიათ სხვა მომხმარებლებისათვის შეტყობინებების გაგზავნა.',
 	'spam-blacklisted-email-signup' => 'მითითებული ელ.ფოსტის მისამართი შეტანილია შავ სიაში და მისი გამოყენება შეუძლებელია.',
 	'spam-invalid-lines' => '{{PLURAL:$1|შავი სიის შემდეგმა ხაზმა შესაძლოა შეიცავდეს არასწორი რეგულარუსლი გამოთქმა და უნდა გასწორდეს|შავი სიის შემდეგმა ხაზებმა შესაძლოა შეიცავდეს არასწორი რეგულარუსლი გამოთქმები და უნდა გასწორდეს}} შენახვამდე:',
-	'spam-blacklist-desc' => 'რეგულარულ გამოთქმებზე დაფუძნებული ანტი-სპამ ინსტრუმენტი[[MediaWiki:Spam-blacklist]] და [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'რეგულარულ გამოთქმებზე დაფუძნებული ანტი-სპამ ინსტრუმენტი[[MediaWiki:Spam-blacklist]] და [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Kazakh (Arabic script) (قازاقشا (تٴوتە)‏)
@@ -1876,48 +2070,53 @@ $messages['kk-latn'] = array(
  * @author 아라
  */
 $messages['ko'] = array(
-	'spam-blacklist' => ' # 이 필터에 해당하는 URL을 문서에 넣을 경우 해당 편집의 저장을 자동으로 막습니다.
- # 이 필터는 여기 위키 내에서만 적용됩니다. 광역 블랙리스트 기능이 있을 경우 해당 목록도 작동합니다.
- # 자세한 내용은 https://www.mediawiki.org/wiki/Extension:SpamBlacklist (영어) 문서를 참고해 주세요.
- #<!-- 이 줄은 편집하지 말아 주세요. 문서 모양을 위한 줄입니다.--> <pre>
+	'spam-blacklist' => ' #<!-- 이 줄은 그대로 두십시오 --> <pre>
+# 이 필터에 해당하는 URL을 문서에 넣을 경우 해당 편집의 저장을 자동으로 막습니다.
+# 이 필터는 여기 위키 내에서만 적용됩니다. 광역 블랙리스트 기능이 있을 경우 해당 목록도 작동합니다.
+# 설명서에 대해서는 https://www.mediawiki.org/wiki/Extension:SpamBlacklist 문서를 참고하세요
 # 
-# 문법은 다음과 같습니다.
-#  * "#"은 주석 기호입니다. 줄에서 #가 있는 부분부터의 글자는 모두 무시됩니다.
-#  * 각 줄은 정규 표현식으로, URL 문장 내부를 검사하는 데에 사용됩니다.
+# 문법은 다음과 같습니다:
+#   * ""#" 문자에서 줄의 끝까지는 주석입니다
+#   * 각 줄은 정규 표현식으로, URL 문장을 검사하는 데에 사용됩니다
 
- #</pre> <!-- 이 줄은 편집하지 말아 주세요. 문서 모양을 위한 줄입니다. -->',
+ #</pre> <!-- 이 줄은 그대로 두십시오 -->',
 	'spam-whitelist' => ' # <!-- 이 줄은 그대로 두십시오 --> <pre>
 # 이 목록에 포함되는 바깥 URL은 블랙리스트에 의해 차단되어
 # 있더라도 문서 편집이 제한되지 않습니다.
 #
-# 문법은 다음과 같습니다.
-# * "#"에서 그 줄의 끝까지는 주석입니다.
-# * 모든 줄은 URL의 호스트와 일치하는 정규 표현식의 일부분입니다.
+# 문법은 다음과 같습니다:
+#   * "#" 문자에서 줄의 끝까지는 주석입니다
+#   * 모든 줄은 URL의 호스트와 일치하는 정규 표현식의 일부분입니다
  #</pre> <!-- 이 줄은 그대로 두십시오 -->',
-	'email-blacklist' => ' # 이 리스트와 일치하는 이메일 주소는 등록과 이메일 발송이 금지됩니다.
- # 이 리스트는 이 위키에만 적용됩니다; 글로벌 블랙리스트도 함께 참조하십시오.
- # 설명 문서를 보시려면 https://www.mediawiki.org/wiki/Extension:SpamBlacklist 를 방문해주세요.
- #<!-- 이 줄은 그대로 두십시오 --> <pre>
+	'email-blacklist' => ' #<!-- 이 줄은 그대로 두십시오 --> <pre>
+# 이 리스트와 일치하는 이메일 주소는 등록과 이메일 발송이 금지됩니다.
+# 이 리스트는 이 위키에만 적용됩니다; 전역 블랙리스트도 함께 참조하십시오.
+# 설명서에 대해서는 https://www.mediawiki.org/wiki/Extension:SpamBlacklist 를 참조하십시오
 #
 # 문법은 다음과 같습니다:
-# * "#" 다음부터 줄의 끝까지는 주석으로 취급됩니다
-# * 빈 줄이 아닌 모든 줄은 이메일 주소의 호스트만 검사하는 정규 표현식입니다.
+#   * "#" 문자에서 줄의 끝까지는 주석입니다
+#   * 빈 줄이 아닌 모든 줄은 이메일 주소의 호스트만 검사하는 정규 표현식입니다
 
- #<!-- 이 줄은 그대로 두십시오 --> </pre>',
+ #</pre> <!-- 이 줄은 그대로 두십시오 -->',
 	'email-whitelist' => ' #<!-- 이 줄은 그대로 두십시오 --> <pre>
- # 이 리스트와 일치하는 이메일 주소는 블랙리스트에 올라가 있을지라도
- # 사용이 금지되지 않습니다.
- #
- #<!-- 이 줄은 그대로 두십시오 --> </pre>
+# 이 리스트와 일치하는 이메일 주소는 블랙리스트에 올라가 있을지라도
+# 사용이 차단되지 않습니다.
 #
- # 문법은 다음과 같습니다:
- # * "#" 다음부터 줄의 끝까지는 주석으로 취급됩니다
- # * 빈 줄이 아닌 모든 줄은 이메일 주소의 호스트만 검사하는 정규 표현식입니다.',
+# 문법은 다음과 같습니다:
+#   * "#" 문자에서 줄의 끝까지는 주석입니다
+#   * 빈 줄이 아닌 모든 줄은 이메일 주소의 호스트만 검사하는 정규 표현식입니다.
+
+ #</pre> <!-- 이 줄은 그대로 두십시오 -->',
 	'spam-blacklisted-email' => '이메일 주소가 블랙리스트됨',
 	'spam-blacklisted-email-text' => '이메일 주소는 다른 사용자가 이메일을 보내지 못하도록 블랙리스트에 올라와 있습니다.',
 	'spam-blacklisted-email-signup' => '입력한 이메일 주소는 사용할 수 없도록 블랙리스트되어 있습니다.',
-	'spam-invalid-lines' => '스팸 블랙리스트의 다음 {{PLURAL:$1|줄}}에 잘못된 정규 표현식이 사용되어 저장하기 전에 바르게 고쳐져야 합니다:',
-	'spam-blacklist-desc' => '정규 표현식을 이용해 스팸을 막습니다: [[MediaWiki:Spam-blacklist]]와 [[MediaWiki:Spam-whitelist]]를 사용합니다.',
+	'spam-invalid-lines' => '스팸 블랙리스트의 다음 {{PLURAL:$1|줄}}에 잘못된 정규 {{PLURAL:$1|표현식}}이 사용되어 문서를 저장하기 전에 바르게 고쳐져{{PLURAL:$1|야 합니다}}:',
+	'spam-blacklist-desc' => '정규 표현식을 사용해 문서에 있는 URL과 등록된 사용자의 이메일 주소를 블랙리스트 처리하여 스팸을 막는 도구',
+	'log-name-spamblacklist' => '스팸 블랙리스트 기록',
+	'log-description-spamblacklist' => '이 사건은 스팸 블랙리스트의 일치를 추적합니다.',
+	'logentry-spamblacklist-hit' => '$1 사용자가 $3 문서에 $4(을)를 추가하려고 했을 때에 스팸 블랙리스트의 일치가 발생했습니다.',
+	'right-spamblacklistlog' => '스팸 블랙리스트 기록 보기',
+	'action-spamblacklistlog' => '스팸 블랙리스트 기록을 볼',
 );
 
 /** Colognian (Ripoarisch)
@@ -1963,7 +2162,7 @@ $messages['ksh'] = array(
 	'spam-invalid-lines' => 'Mer han Fähler en rejolähre Ußdröck jefonge.
 {{PLURAL:$1|De Reih onge schtemmp nit un moß|Di $1 Reije onge schtemme nit un möße|Dat sull}}
 för em Afschpeischere eets en Oodenong jebraat wääde:',
-	'spam-blacklist-desc' => 'Met rejolähre Ußdröck jääje der <i lang="en">SPAM<i> — övver en [[MediaWiki:Spam-blacklist|„schwazze Leß“]] un en [[MediaWiki:Spam-whitelist|Leß met Ußnahme dohfun]].',
+	'spam-blacklist-desc' => 'Met rejolähre Ußdröck jääje der <i lang="en">SPAM<i> — övver en [[MediaWiki:Spam-blacklist|„schwazze Leß“]] un en [[MediaWiki:Spam-whitelist|Leß met Ußnahme dohfun]].', # Fuzzy
 );
 
 /** Luxembourgish (Lëtzebuergesch)
@@ -1973,7 +2172,7 @@ $messages['lb'] = array(
 	'spam-blacklisted-email' => 'Gespaart Mail-Adressen',
 	'spam-blacklisted-email-text' => 'Är Mailadress ass elo gespaart fir anere Benotzer Mailen ze schécken.',
 	'spam-blacklisted-email-signup' => "D'Mailadress déi Dir uginn hutt ass elo gespaart fir anere Benotzer Mailen ze schécken.",
-	'spam-blacklist-desc' => 'Op regulären Ausdréck (Regex) opgebauten Tool: [[MediaWiki:Spam-blacklist]] a [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Op regulären Ausdréck (Regex) opgebauten Tool deen et erlaabt URLe vu Säiten op eng schwaarz Lëscht ze setzen an e-Mail-Adresssen vu registréierte Benotzer',
 );
 
 /** Limburgish (Limburgs)
@@ -2028,14 +2227,14 @@ $messages['li'] = array(
 	'spam-blacklisted-email-text' => 'Dien e-mailadres steit momenteel oppe zwarte lies wodoor se gein e-mails nao anger gebroekers kins versjikke.',
 	'spam-blacklisted-email-signup' => "'t Opgegaeve e-mailadres steit momenteel oppe zwarte lies.",
 	'spam-invalid-lines' => "De volgende {{PLURAL:$1|regel|regel}} van de zwarte lies {{PLURAL:$1|is 'n|zeen}} onzjuuste reguliere {{PLURAL:$1|oetdrukking|oetdrukkinge}}  en {{PLURAL:$1|mót|mótte}} verbaeterd waere alveures de pazjena kin waere opgeslage:",
-	'spam-blacklist-desc' => 'Antispamfunctionaliteit via reguliere expressies: [[MediaWiki:Spam-blacklist]] en [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Antispamfunctionaliteit via reguliere expressies: [[MediaWiki:Spam-blacklist]] en [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Minangkabau (Baso Minangkabau)
  * @author Iwan Novirion
  */
 $messages['min'] = array(
-	'spam-blacklist-desc' => 'Pakakeh anti-spam babasis regex: [[MediaWiki:Spam-blacklist]] jo [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Pakakeh anti-spam babasis regex: [[MediaWiki:Spam-blacklist]] jo [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Macedonian (македонски)
@@ -2083,7 +2282,12 @@ $messages['mk'] = array(
 	'spam-blacklisted-email-text' => 'На вашата адреса моментално не ѝ е дозволено да испраќа е-пошта на други корисници.',
 	'spam-blacklisted-email-signup' => 'Употребата на дадената адреса е моментално забранета.',
 	'spam-invalid-lines' => '{{PLURAL:$1|Следниов ред во црниот список на спам е|Следниве редови во црниот список на спам се}} {{PLURAL:$1|погрешен регуларен израз|погрешни регуларни изрази}} и {{PLURAL:$1|треба да се поправи|треба да се поправат}} пред да се зачува страницата:',
-	'spam-blacklist-desc' => 'Антиспам алатка на основа на регуларни изрази: [[MediaWiki:Spam-blacklist]] и [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Алатка против спам на основа на регуларни изрази што овозможува забрана на URL и е-поштенски адреси за корисници',
+	'log-name-spamblacklist' => 'Дневник за спам од црниот список',
+	'log-description-spamblacklist' => 'Овие настани следат обиди на спам од црниот список.',
+	'logentry-spamblacklist-hit' => '$1 стави спам заведен во црниот список $3 при обидот да ја додаде адресата $4.',
+	'right-spamblacklistlog' => 'Преглед на дневникот за спам од црниот список',
+	'action-spamblacklistlog' => 'преглед на дневникот за спам од црниот список',
 );
 
 /** Malayalam (മലയാളം)
@@ -2131,7 +2335,12 @@ $messages['ml'] = array(
 	'spam-blacklisted-email-text' => 'താങ്കളുടെ ഇമെയിൽ വിലാസം ഇപ്പോൾ മറ്റുള്ളവർക്ക് എഴുത്തയക്കാനാവാത്ത കരിമ്പട്ടികയിൽ ഉൾപ്പെട്ടിരിക്കുന്നു.',
 	'spam-blacklisted-email-signup' => 'നൽകിയ ഇമെയിൽ വിലാസം ഇപ്പോൾ കരിമ്പട്ടികയിൽ പെട്ടിരിക്കുന്ന ഒന്നാണ്.',
 	'spam-invalid-lines' => 'താഴെ കൊടുത്തിരിക്കുന്ന പാഴെഴുത്ത് കരിമ്പട്ടികയിലെ {{PLURAL:$1|വരി ഒരു|വരികൾ}} അസാധുവായ റെഗുലർ {{PLURAL:$1|എക്സ്‌‌പ്രെഷൻ|എക്സ്‌‌പ്രെഷനുകൾ}} ആണ്, താൾ സേവ് ചെയ്യുന്നതിനു മുമ്പ് {{PLURAL:$1|അത്|അവ}} ശരിയാക്കേണ്ടതുണ്ട്:',
-	'spam-blacklist-desc' => 'റെജെക്സ്-അധിഷ്ഠിത പാഴെഴുത്ത് തടയൽ ഉപകരണം: [[MediaWiki:Spam-blacklist]] ഒപ്പം [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'അംഗത്വമെടുത്ത ഉപയോക്താക്കൾ യു.ആർ.എല്ലുകളും ഇമെയിൽ വിലാസങ്ങളും, താളുകളിൽ ചേർക്കുന്നത് കരിമ്പട്ടികയിൽ പെടുത്താനുള്ള റെജെക്സ്-അധിഷ്ഠിത പാഴെഴുത്ത് തടയൽ ഉപകരണം',
+	'log-name-spamblacklist' => 'പാഴെഴുത്ത് കരിമ്പട്ടിക രേഖ',
+	'log-description-spamblacklist' => 'പാഴെഴുത്ത് കരിമ്പട്ടികയെ ഉണർത്തിയ പ്രവൃത്തികളുടെ രേഖ.',
+	'logentry-spamblacklist-hit' => '$3 എന്ന താളിൽ $4 എന്നത് ചേർക്കാൻ $1 നടത്തിയ ശ്രമം പാഴെഴുത്ത് കരിമ്പട്ടികയിൽ കുടുങ്ങിയിരിക്കുന്നു.',
+	'right-spamblacklistlog' => 'പാഴെഴുത്ത് കരിമ്പട്ടിക രേഖ കാണുക',
+	'action-spamblacklistlog' => 'പാഴെഴുത്ത് കരിമ്പട്ടിക രേഖ കാണുക',
 );
 
 /** Marathi (मराठी)
@@ -2164,7 +2373,7 @@ $messages['mr'] = array(
 	'spam-blacklisted-email-text' => 'तुमचा ई-पत्ता काळ्या यादीत समाविष्ट करण्यात आला आहे. इतर सदस्यांना संपर्क करणे शक्य नाही.',
 	'spam-blacklisted-email-signup' => 'दिलेला विपत्र पत्ता सद्य वापरण्यास प्रतिबंधित केलेला आहे',
 	'spam-invalid-lines' => 'हे पान जतन करण्यापूर्वी खालील {{PLURAL:$1|ओळ जी चुकीची|ओळी ज्या चुकीच्या}} एक्स्प्रेशन {{PLURAL:$1|आहे|आहेत}}, दुरुस्त करणे गरजेचे आहे:',
-	'spam-blacklist-desc' => 'रेजएक्स वर चालणारे स्पॅम थांबविणारे उपकरण: [[MediaWiki:Spam-blacklist]] व [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'रेजएक्स वर चालणारे स्पॅम थांबविणारे उपकरण: [[MediaWiki:Spam-blacklist]] व [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Malay (Bahasa Melayu)
@@ -2213,10 +2422,10 @@ $messages['ms'] = array(
 	'spam-blacklisted-email-text' => 'Alamat e-mel anda kini disenaraihitamkan daripada menghantar e-mel kepada pengguna lain.',
 	'spam-blacklisted-email-signup' => 'Alamat e-mel yang diberikan ini kini disenaraihitamkan.',
 	'spam-invalid-lines' => '{{PLURAL:$1|Baris|Baris-baris}} berikut menggunakan ungkapan nalar yang tidak sah. Sila baiki senarai hitam ini sebelum menyimpannya:',
-	'spam-blacklist-desc' => 'Alat anti-spam berdasarkan ungkapan nalar: [[MediaWiki:Spam-blacklist]] dan [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Alat anti-spam berdasarkan ungkapan nalar: [[MediaWiki:Spam-blacklist]] dan [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  */
 $messages['nb'] = array(
 	'spam-blacklist' => ' # Eksterne URL-er som finnes på denne lista vil ikke kunne legges til på en side.
@@ -2260,7 +2469,7 @@ $messages['nb'] = array(
 	'spam-blacklisted-email-text' => 'E-postadressen din er svartelistes, så du kan ikke sende e-post til andre brukere.',
 	'spam-blacklisted-email-signup' => 'Den angitte e-postadressen er svartelistet.',
 	'spam-invalid-lines' => 'Følgende {{PLURAL:$1|linje|linjer}} i spamsvartelista er {{PLURAL:$1|et ugyldig regulært uttrykk|ugyldige regulære uttrykk}} og må rettes før lagring av siden:',
-	'spam-blacklist-desc' => 'Antispamverktøy basert på regulære uttrykk: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Antispamverktøy basert på regulære uttrykk: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Low German (Plattdüütsch)
@@ -2287,7 +2496,7 @@ $messages['nds'] = array(
 
   #</pre> <!-- Disse Reeg dröff nich ännert warrn! -->',
 	'spam-invalid-lines' => 'Disse {{PLURAL:$1|Reeg|Regen}} in de Spam-Swartlist {{PLURAL:$1|is en ungülligen regulären Utdruck|sünd ungüllige reguläre Utdrück}}. De {{PLURAL:$1|mutt|mööt}} utbetert warrn, ehrdat de Sied spiekert warrn kann:',
-	'spam-blacklist-desc' => 'Regex-baseert Anti-Spam-Warktüüch: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Regex-baseert Anti-Spam-Warktüüch: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Dutch (Nederlands)
@@ -2342,7 +2551,12 @@ $messages['nl'] = array(
 	'spam-blacklisted-email-text' => 'Uw e-mailadres staat momenteel op de zwarte lijst waardoor u geen e-mails naar andere gebruikers kunt verzenden.',
 	'spam-blacklisted-email-signup' => 'Het opgegeven e-mailadres staat momenteel op de zwarte lijst.',
 	'spam-invalid-lines' => 'De volgende {{PLURAL:$1|regel|regels}} van de zwarte lijst {{PLURAL:$1|is een|zijn}} onjuiste reguliere {{PLURAL:$1|expressie|expressies}}  en {{PLURAL:$1|moet|moeten}} verbeterd worden alvorens de pagina kan worden opgeslagen:',
-	'spam-blacklist-desc' => 'Antispamfunctionaliteit via reguliere expressies: [[MediaWiki:Spam-blacklist]] en [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => "Op reguliere expressies gebaseed antispamhulpprogramma dat het mogelijk maakt URL's in pagina's te blokkeren en e-mailadressen voor geblokkeerde gebruikers",
+	'log-name-spamblacklist' => 'Logboek zwarte lijst',
+	'log-description-spamblacklist' => 'Deze lijst bevat gebeurtenissen met betrekking tot de zwarte lijst.',
+	'logentry-spamblacklist-hit' => '{{GENDER:$2|$1}} heeft geprobeerd $4 van de zwarte lijst toe te voegen op $3', # Fuzzy
+	'right-spamblacklistlog' => 'Logboek zwarte lijst bekijken',
+	'action-spamblacklistlog' => 'logboek zwarte lijst te bekijken',
 );
 
 /** Nederlands (informeel)‎ (Nederlands (informeel)‎)
@@ -2352,7 +2566,7 @@ $messages['nl-informal'] = array(
 	'spam-blacklisted-email-text' => 'Je e-mailadres staat momenteel op de zwarte lijst waardoor je geen e-mails naar andere gebruikers kunt verzenden.',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Frokor
  */
 $messages['nn'] = array(
@@ -2376,7 +2590,7 @@ $messages['nn'] = array(
 
  #</pre> <!-- la denne linja vere nøyaktig som ho er -->',
 	'spam-invalid-lines' => 'Følgjande {{PLURAL:$1|linje|linjer}} i spamsvartelista er {{PLURAL:$1|eit ugyldig regulært uttrykk|ugyldige regulære uttrykk}} og må rettast før lagring av sida:',
-	'spam-blacklist-desc' => 'Antispamverktøy basert på regulære uttrykk: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Antispamverktøy basert på regulære uttrykk: [[MediaWiki:Spam-blacklist]] og [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Occitan (occitan)
@@ -2395,10 +2609,10 @@ $messages['oc'] = array(
 
  #</pre> <!--Daissatz aquesta linha tala coma es -->",
 	'spam-invalid-lines' => "{{PLURAL:$1|La linha seguenta |Las linhas seguentas}} de la lista dels spams {{PLURAL:$1|es redigida|son redigidas}} d'un biais incorrècte e {{PLURAL:$1|necessita|necessitan}} las correccions necessàrias abans tot salvament de la pagina :",
-	'spam-blacklist-desc' => "Aisina antispam basada sus d'expressions regularas : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''",
+	'spam-blacklist-desc' => "Aisina antispam basada sus d'expressions regularas : ''[[MediaWiki:Spam-blacklist]]'' et ''[[MediaWiki:Spam-whitelist]]''", # Fuzzy
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Jnanaranjan Sahu
  * @author Psubhashish
  */
@@ -2445,7 +2659,7 @@ $messages['or'] = array(
 	'spam-blacklisted-email-text' => 'ଆପଣଙ୍କ ଇ-ମେଲ ଠିକଣାଟି ଅନ୍ୟମାନଙ୍କୁ ଇ-ମେଲ ପଠାଇବାରୁ ବାସନ୍ଦ କରାଯାଇଛି ।',
 	'spam-blacklisted-email-signup' => 'ଦିଆଯାଇଥିବା ଇ-ମେଲ ଠିକଣାଟି ବ୍ୟବହାରକରିବାରୁ ବାସନ୍ଦ କରାଯାଇଛି ।',
 	'spam-invalid-lines' => 'ଏହି ସ୍ପାମ ଅଟକତାଲିକା {{PLURAL:$1|ଧାଡ଼ିଟି|ଧାଡ଼ିସବୁ}} ଅଚଳ ସାଧାରଣ {{PLURAL:$1|ପରିପ୍ରକାଶ|ପରିପ୍ରକାଶ}} ଓ ସାଇତିବା ଆଗରୁ  {{PLURAL:$1|ତାହାକୁ  ସୁଧାରିବା ଲୋଡ଼ା|ସେହିସବୁକୁ ସୁଧାରିବା ଲୋଡ଼ା}}:',
-	'spam-blacklist-desc' => 'Regex-ଭିତ୍ତିକ ସ୍ପାମ-ବିରୋଧୀ ଉପକରଣ: [[MediaWiki:Spam-blacklist]] ଓ [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Regex-ଭିତ୍ତିକ ସ୍ପାମ-ବିରୋଧୀ ଉପକରଣ: [[MediaWiki:Spam-blacklist]] ଓ [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Polish (polski)
@@ -2495,7 +2709,7 @@ $messages['pl'] = array(
 	'spam-blacklisted-email-text' => 'Twój adres e-mail jest obecnie umieszczony na czarnej liście i nie można z niego wysyłać wiadomości e-mail do innych użytkowników.',
 	'spam-blacklisted-email-signup' => 'Podany adres e-mail jest obecnie na czarnej liście blokującej przed użyciem.',
 	'spam-invalid-lines' => '{{PLURAL:$1|Następująca linia jest niepoprawnym wyrażeniem regularnym i musi być poprawiona przed zapisaniem strony:|Następujące linie są niepoprawnymi wyrażeniami regularnymi i muszą być poprawione przed zapisaniem strony:}}',
-	'spam-blacklist-desc' => 'Narzędzie antyspamowe oparte o wyrażenia regularne: [[MediaWiki:Spam-blacklist|spam – lista zabronionych]] oraz [[MediaWiki:Spam-whitelist|spam – lista dozwolonych]]',
+	'spam-blacklist-desc' => 'Narzędzie antyspamowe oparte o wyrażenia regularne: [[MediaWiki:Spam-blacklist|spam – lista zabronionych]] oraz [[MediaWiki:Spam-whitelist|spam – lista dozwolonych]]', # Fuzzy
 );
 
 /** Piedmontese (Piemontèis)
@@ -2528,7 +2742,12 @@ $messages['pms'] = array(
 	'spam-blacklisted-email-text' => "Soa adrëssa ëd pòsta eletrònica a l'é al moment an na lista nèira për mandé dij mëssagi a j'àutri utent.",
 	'spam-blacklisted-email-signup' => "L'adrëssa ëd pòsta eletrònica dàita a l'é al moment an na lista nèira për l'utilisassion.",
 	'spam-invalid-lines' => "{{PLURAL:$1|St'|Sti}} element dla lista nèira dla rumenta ëd reclam a {{PLURAL:$1|l'é|son}} {{PLURAL:$1|n'|dj'}}espression regolar nen {{PLURAL:$1|bon-a|bon-e}} e a l'{{PLURAL:$1|ha|han}} da manca d'esse coregiùe anans che salvé la pàgina:",
-	'spam-blacklist-desc' => 'Strument anti-spam basà an dzora a Regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => "Utiss contra la rumenta basà su dj'espression regolar ch'a permëtto ëd buté an sla lista nèira dj'adrësse an sl'Aragnà ant le pàgine e dj'adrësse ëd pòsta eletrònica për j'utent argistrà.",
+	'log-name-spamblacklist' => 'Argistr dla lista nèira dla rumenta',
+	'log-description-spamblacklist' => 'Costi eveniment a marco le rëspondense con la lista nèira dla rumenta.',
+	'logentry-spamblacklist-hit' => "$1 a l'ha causà na rëspondensa con la lista nèira dla rumenta su $3 an sërcand ëd gionté $4.",
+	'right-spamblacklistlog' => "Smon-e l'argistr dla lista nèira dla rumenta",
+	'action-spamblacklistlog' => "vëdde l'argistr dla lista nèira dla rumenta",
 );
 
 /** Western Punjabi (پنجابی)
@@ -2554,7 +2773,7 @@ $messages['pnb'] = array(
 
 #</pre> <!-- ایس لین نوں انج ای چھوڑ دیو جنج ایہ ہے -->',
 	'spam-invalid-lines' => 'تھلے دتی گئی سپام کالیلسٹ {{PLURAL:$1|lلین|لیناں}} ناں منی جان والی ریگولر {{PLURAL:$1|ایکسپریشن|ایکسپریشناں}} تے {{PLURAL:$1|لوڑاں|لوڑ}} نوں ٹھیک کرنا ضروری صفہ بچان توں پہلے:',
-	'spam-blacklist-desc' => 'ریجیکس تے بنیا سپام ویری اوزار: [[MediaWiki:Spam-blacklist]] تے [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'ریجیکس تے بنیا سپام ویری اوزار: [[MediaWiki:Spam-blacklist]] تے [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Portuguese (português)
@@ -2588,11 +2807,19 @@ $messages['pt'] = array(
 
  #</pre> <!-- mantenha esta linha exatamente assim -->',
 	'spam-blacklisted-email' => 'Endereço de correio electrónico da lista negra',
+	'spam-blacklisted-email-text' => 'Atualmente o seu endereço de e-mail está na lista negra que impede o envio de e-mails a outros utilizadores.',
+	'spam-blacklisted-email-signup' => 'O endereço de e-mail fornecido não pode ser utilizado pois está na lista negra.',
 	'spam-invalid-lines' => "{{PLURAL:$1|A entrada|As entradas}} abaixo {{PLURAL:$1|é uma expressão regular|são expressões regulares}}  ''(regex)'' {{PLURAL:$1|inválida e precisa|inválidas e precisam}} de ser {{PLURAL:$1|corrigida|corrigidas}} antes de gravar a página:",
-	'spam-blacklist-desc' => 'Ferramenta anti-"spam" baseada em Regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Ferramenta anti-"spam" baseada em Regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]', # Fuzzy
+	'log-name-spamblacklist' => 'Registros da lista negra de spam',
+	'log-description-spamblacklist' => 'Estes eventos acompanham as ocorrências da lista negra de spam.',
+	'logentry-spamblacklist-hit' => '$1 ativou a lista negra de spam em $3 ao tentar inserir $4.',
+	'right-spamblacklistlog' => 'Ver registros da lista negra de spam',
+	'action-spamblacklistlog' => 'ver os registos da lista negra de spam',
 );
 
 /** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
  * @author Eduardo.mps
  * @author Helder.wiki
  * @author Tuliouel
@@ -2656,14 +2883,26 @@ $messages['pt-br'] = array(
 	'spam-blacklisted-email-text' => 'O seu endereço de correio eletrônico está proibido de enviar mensagens para outros usuários.',
 	'spam-blacklisted-email-signup' => 'O endereço fornecido encontra-se na lista negra.',
 	'spam-invalid-lines' => '{{PLURAL:$1|A linha|As linhas}} a seguir {{PLURAL:$1|é uma expressão regular|são expressões regulares}} (regex) {{PLURAL:$1|inválida e precisa|inválidas e precisam}} ser {{PLURAL:$1|corrigida|corrigidas}} antes de salvar a página:',
-	'spam-blacklist-desc' => 'Ferramenta anti-"spam" baseada em Regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Ferramenta anti-spam baseada em expressões regulares que permite adicionar URLs numa lista negra, barrando-os em páginas e também em emails enviados a usuários registrados',
+	'log-name-spamblacklist' => 'Registro da lista negra de spam',
+	'action-spamblacklistlog' => 'ver os registros da lista negra de spam',
 );
 
 /** Romanian (română)
  * @author Firilacroco
+ * @author Minisarm
  */
 $messages['ro'] = array(
-	'spam-blacklisted-email' => 'Adresă de e-mail în lista neagră',
+	'spam-blacklisted-email' => 'Adresă de e-mail inclusă în lista neagră',
+	'spam-blacklisted-email-text' => 'Adresa dumneavoastră de e-mail este actualmente inclusă în lista neagră, neputând expedia e-mailuri altor utilizatori.',
+	'spam-blacklisted-email-signup' => 'Adresa de e-mail specificată este actualmente inclusă în lista neagră, neputând fi utilizată.',
+	'spam-invalid-lines' => '{{PLURAL:$1|Următorul rând|Următoarele rânduri}} din lista neagră de spam {{PLURAL:$1|este|sunt}} {{PLURAL:$1|o expresie regulată invalidă|expresii regulate invalide}} și trebuie {{PLURAL:$1|corectat|corectate}} înainte de a salva pagina:',
+	'spam-blacklist-desc' => 'Unealtă antispam bazată pe regex care permite includerea adreselor URL introduse în pagini și a adreselor de e-mail ale utilizatorilor înregistrați în lista neagră',
+	'log-name-spamblacklist' => 'Jurnal listă neagră spam',
+	'log-description-spamblacklist' => 'Aceste evenimente urmăresc declanșarea listei negre de spam.',
+	'logentry-spamblacklist-hit' => '$1 a provocat declanșarea listei negre de spam în pagina $3, încercând să adauge $4.',
+	'right-spamblacklistlog' => 'Vizualizează jurnalul listei negre de spam',
+	'action-spamblacklistlog' => 'vizualizați jurnalul listei negre de spam',
 );
 
 /** tarandíne (tarandíne)
@@ -2713,7 +2952,12 @@ $messages['roa-tara'] = array(
 	'spam-blacklisted-email-text' => "L'indirizze email tune jè mo jndr'à lista gnore pe mannà email a otre utinde.",
 	'spam-blacklisted-email-signup' => "L'indirizze email ca è date pe mò ste jndr'à lista gnore.",
 	'spam-invalid-lines' => "{{PLURAL:$1|'A seguende linèe d'a blacklist de spam jè|Le seguende linèe d'a blacklist de spam sonde}} {{PLURAL:$1|espressione|espressiune}} regolare invalide e {{PLURAL:$1|abbesogne|abbesognane}} de avenè corrette apprime de reggistrà 'a pàgene:",
-	'spam-blacklist-desc' => "'U strumende andi-spam basate sus a le regex: [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]",
+	'spam-blacklist-desc' => "'U strumende andi-spam basate sus a le regex ca dèje le URL de le pàggene de l'elenghe gnure e le indirizze email de le utinde reggistrate",
+	'log-name-spamblacklist' => "Archivije de l'elenghe gnure de le rummate",
+	'log-description-spamblacklist' => "Ste evende tracciane le trasute jndr'à l'elenghe gnure de le rummate.",
+	'logentry-spamblacklist-hit' => "$1 ave fatte 'na trasute jndr'à l'elenghe gnure de le rummate sus a $3 pruvanne a aggiungere $4.",
+	'right-spamblacklistlog' => "'Ndruche l'archivije de l'elenghe gnure de le rummate",
+	'action-spamblacklistlog' => "'ndruche l'archivije de l'elenghe gnure d'u rummate",
 );
 
 /** Russian (русский)
@@ -2721,6 +2965,8 @@ $messages['roa-tara'] = array(
  * @author Express2000
  * @author HalanTul
  * @author Kaganer
+ * @author NBS
+ * @author Okras
  * @author Александр Сигачёв
  */
 $messages['ru'] = array(
@@ -2764,7 +3010,12 @@ $messages['ru'] = array(
 	'spam-blacklisted-email-text' => 'Ваш адрес электронной почты в настоящее время находится в чёрном списке, поэтому вы не можете отправлять сообщения другим пользователям.',
 	'spam-blacklisted-email-signup' => 'Указанный адрес электронной почты в настоящее время занесён в чёрный список и не может быть использован.',
 	'spam-invalid-lines' => '{{PLURAL:$1|Следующая строка чёрного списка ссылок содержит ошибочное регулярное выражение и должна быть исправлена|Следующие строки чёрного списка ссылок содержат ошибочные регулярные выражения и должны быть исправлены}} перед сохранением:',
-	'spam-blacklist-desc' => 'Основанный на регулярных выражениях анти-спам инструмент: [[MediaWiki:Spam-blacklist]] и [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Основанный на регулярных выражениях анти-спам инструмент позволяет добавлять в чёрный список URL на страницах и адреса электронной почты для зарегистрированных пользователей',
+	'log-name-spamblacklist' => 'Журнал спам-листа',
+	'log-description-spamblacklist' => 'Это журнал, отслеживающий срабатывание спам-листа.',
+	'logentry-spamblacklist-hit' => '$1 вызвал срабатывание спам-листа на странице $3 из-за попытки добавить $4.',
+	'right-spamblacklistlog' => 'Просмотр журнала чёрного списка по спаму',
+	'action-spamblacklistlog' => 'просмотр журнала чёрного списка по спаму',
 );
 
 /** Rusyn (русиньскый)
@@ -2812,7 +3063,7 @@ $messages['rue'] = array(
 	'spam-blacklisted-email-text' => 'Ваша імейлова адреса є моментално уведжена на чорнім списку, та же другым хоснователям не можете послати імейл.',
 	'spam-blacklisted-email-signup' => 'Уведжена імейлова адреса є моментално на чорнім списку.',
 	'spam-invalid-lines' => 'На чорній листинї спаму {{PLURAL:$1|є наступный рядок неправилный реґуларный выраз|суть наступны рядкы неправилны реґуларны выразы|суть наступны рядкы неправилны реґуларны выразы}} і є треба {{PLURAL:$1|го|їх|їх}} перед уложінём сторінкы справити:',
-	'spam-blacklist-desc' => 'Антіспамовый інштрумент на базї реґуларных выразів: [[MediaWiki:Spam-blacklist]] і [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Антіспамовый інштрумент на базї реґуларных выразів: [[MediaWiki:Spam-blacklist]] і [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Sanskrit (संस्कृतम्)
@@ -2854,7 +3105,7 @@ $messages['sa'] = array(
 	'spam-blacklisted-email-text' => 'भवतः ईपत्रसङ्केतः सम्प्रति निन्द्यसङ्केतानाम् आवल्यां प्रवेशितः । अतः अन्येभ्यः योजकेभ्यः ईपत्रप्रेषणं नानुमन्यते ।',
 	'spam-blacklisted-email-signup' => 'प्रदत्तः निन्द्यः ईपत्रसङ्केतः सम्प्रति उपयोगे नास्ति ।',
 	'spam-invalid-lines' => 'अधोनिर्दिष्टाः अनिष्टसन्देशदुर्वृत्तयः {{PLURAL:$1|पंक्तिः|पंक्तियः}} अमान्याः नियताः {{PLURAL:$1|अभिव्यक्तिः अस्ति|अभिव्यक्तयः सन्ति}} अतः पृष्ठरक्षणात् पूर्वं तेषां परिष्कारः अवश्यं कर्तव्याः :',
-	'spam-blacklist-desc' => 'रेजेक्स्-आधारितम् अनिष्टसन्देशविरोधि उपकरणम्: [[MediaWiki:Spam-blacklist]]  [[MediaWiki:Spam-whitelist]] च',
+	'spam-blacklist-desc' => 'रेजेक्स्-आधारितम् अनिष्टसन्देशविरोधि उपकरणम्: [[MediaWiki:Spam-blacklist]]  [[MediaWiki:Spam-whitelist]] च', # Fuzzy
 );
 
 /** Sakha (саха тыла)
@@ -2880,7 +3131,7 @@ $messages['sah'] = array(
 
  #</pre> <!-- бу строканы уларытыма -->',
 	'spam-invalid-lines' => 'Хара испииһэк манна көрдөрүллүбүт {{PLURAL:$1|строкаата сыыһалаах|строкаалара сыыһалаахтар}}, уларытыах иннинэ ол көннөрүллүөхтээх:',
-	'spam-blacklist-desc' => 'Анти-спам үстүрүмүөнэ: [[MediaWiki:Spam-blacklist]] уонна [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Анти-спам үстүрүмүөнэ: [[MediaWiki:Spam-blacklist]] уонна [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Sicilian (sicilianu)
@@ -2905,7 +3156,7 @@ $messages['scn'] = array(
 
  #</pre> <!-- non mudificari nta nudda manera sta riga -->',
 	'spam-invalid-lines' => '{{PLURAL:$1|La riga di sècutu|Li righi di sècutu}} di la blacklist dô spam {{PLURAL:$1|nun è na sprissioni riulari boni|nun sunnu sprissioni riulari boni}}; currèggiri {{PLURAL:$1|lu sbagghiu|li sbagghi}} prima di sarvari la pàggina.',
-	'spam-blacklist-desc' => 'Strumentu antispam basatu supra li sprissioni riulari [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Strumentu antispam basatu supra li sprissioni riulari [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Sinhala (සිංහල)
@@ -2934,7 +3185,7 @@ $messages['si'] = array(
  #</pre> <!-- leave this line exactly as it is -->',
 	'spam-blacklisted-email' => 'අපලේඛනගත විද්‍යුත්-තැපැල් ලිපින',
 	'spam-invalid-lines' => 'පහත දැක්වෙන කළු ලයිස්තු {{PLURAL:$1|පේලිය|පේලි}} වැරදි regular {{PLURAL:$1|expression|expressions}} වන අතර, පිටුව සුරැකීමට පෙර නිවැරදි කළ යුතුය:',
-	'spam-blacklist-desc' => 'Regex-පාදක ප්‍රති-ස්පෑම ආවුදය: [[MediaWiki:Spam-blacklist]] සහ [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Regex-පාදක ප්‍රති-ස්පෑම ආවුදය: [[MediaWiki:Spam-blacklist]] සහ [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Slovak (slovenčina)
@@ -2961,7 +3212,7 @@ $messages['sk'] = array(
 
  #</pre> <!-- leave this line exactly as it is -->',
 	'spam-invalid-lines' => '{{PLURAL:$1|Nasledovný riadok|Nasledovné riadky}} čiernej listiny spamu {{PLURAL:$1|je neplatný regulárny výraz|sú neplatné regulárne výrazy}} a je potrebné {{PLURAL:$1|ho|ich}} opraviť pred uložením stránky:',
-	'spam-blacklist-desc' => 'Antispamový nástroj na základe regulárnych výrazov: [[MediaWiki:Spam-blacklist|Čierna listina]] a [[MediaWiki:Spam-whitelist|Biela listina]]',
+	'spam-blacklist-desc' => 'Antispamový nástroj na základe regulárnych výrazov: [[MediaWiki:Spam-blacklist|Čierna listina]] a [[MediaWiki:Spam-whitelist|Biela listina]]', # Fuzzy
 );
 
 /** Slovenian (slovenščina)
@@ -3011,7 +3262,12 @@ $messages['sl'] = array(
 	'spam-blacklisted-email-text' => 'Vaš e-poštni naslov je trenutno na črnem seznamu, zato ne morete pošiljati pošte drugim uporabnikom.',
 	'spam-blacklisted-email-signup' => 'E-poštni naslov je trenutno na črnem seznamu.',
 	'spam-invalid-lines' => '{{PLURAL:$1|Naslednja vrstica|Naslednji vrstici|Naslednje vrstice}} črnega seznama smetja {{PLURAL:$1|je neveljavni regularni izraz in ga|sta neveljavna regularna izraza in ju|so neveljavni regularni izrazi in jih}} je pred shranjevanjem strani potrebno popraviti:',
-	'spam-blacklist-desc' => 'Orodje proti smetju, temelječe na regularnih izrazih: [[MediaWiki:Spam-blacklist]] in [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Orodje proti smetju, temelječe na regularnih izrazih, ki omogoča navedbo spletnih naslovov na straneh in v e-poštnih naslovih za registrirane uporabnike na črnem seznamu',
+	'log-name-spamblacklist' => 'Dnevnik črnega seznama smetja',
+	'log-description-spamblacklist' => 'Ti dogodki sledijo zadetke črnega seznama smetja.',
+	'logentry-spamblacklist-hit' => '$1 je povzročil zadetek na črnem seznamu smetja na strani $3 ob dodajanju povezave $4',
+	'right-spamblacklistlog' => 'Prikaz dnevnika črnega seznama smetja',
+	'action-spamblacklistlog' => 'ogled dnevnika s črnim seznamom smetja',
 );
 
 /** Albanian (shqip)
@@ -3042,21 +3298,21 @@ $messages['sq'] = array(
 	'spam-blacklisted-email-text' => 'E-mail adresa juaj është për momentin në penguar nga dërgimi i e-mailave tek përdoruesit e tjerë.',
 	'spam-blacklisted-email-signup' => 'E-mail adresa e dhënë për momentin është ndaluuar nga përdorimi',
 	'spam-invalid-lines' => 'Lista e zezë e mëposhtme spam {{PLURAL:$1|rreshti është një|rreshtat janë}} {{PLURAL:$1|shprehje|shprehje}} të rregullta të pavlefshme dhe {{PLURAL:$1|nevojitet|nevojitet}} të korrigjohen përpara ruajtjes së faqes:',
-	'spam-blacklist-desc' => 'Mjeti anti-spam regex i bazuar: [[MediaWiki:Spam-blacklist]] dhe [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Mjeti anti-spam regex i bazuar: [[MediaWiki:Spam-blacklist]] dhe [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Serbian (Cyrillic script) (српски (ћирилица)‎)
  * @author Millosh
  */
 $messages['sr-ec'] = array(
-	'spam-blacklist-desc' => 'Антиспам оруђе засновано на регуларним изразима: [[MediaWiki:Spam-blacklist]] и [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Антиспам оруђе засновано на регуларним изразима: [[MediaWiki:Spam-blacklist]] и [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Serbian (Latin script) (srpski (latinica)‎)
  * @author Michaello
  */
 $messages['sr-el'] = array(
-	'spam-blacklist-desc' => 'Antispam oruđe zasnovano na regularnim izrazima: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Antispam oruđe zasnovano na regularnim izrazima: [[MediaWiki:Spam-blacklist]] i [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Seeltersk (Seeltersk)
@@ -3085,19 +3341,21 @@ $messages['stq'] = array(
 	'spam-invalid-lines' => '{{PLURAL:$1
 	| Ju foulgjende Siede in ju Spam-Blacklist is n uungultigen regulären Uutdruk. Ju mout foar dät Spiekerjen fon ju Siede korrigierd wäide
 	| Do foulgjende Sieden in ju Spam-Blacklist sunt uungultige reguläre Uutdrukke. Do mouten foar dät Spiekerjen fon ju Siede korrigierd wäide}}:',
-	'spam-blacklist-desc' => 'Regex-basierde Anti-Spam-Reewe: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Regex-basierde Anti-Spam-Reewe: [[MediaWiki:Spam-blacklist]] un [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Swedish (svenska)
+ * @author Ainali
  * @author Lejonel
+ * @author Lokal Profil
+ * @author Skalman
  * @author WikiPhoenix
  */
 $messages['sv'] = array(
-	'spam-blacklist' => '
- # Den här listan stoppar matchande externa URL:er från att läggas till på sidor.
- # Listan påverkar bara den här wikin; se även den globala svarta listan för spam.
- # För dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist
- #<!-- ändra inte den här raden --> <pre>
+	'spam-blacklist' => ' #<!-- ändra inte den här raden --> <pre>
+# Den här listan stoppar matchande externa URL:er från att läggas till på sidor.
+# Listan påverkar bara den här wikin; se även den globala svartlistan.
+# För dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist
 #
 # Syntaxen är följande:
 #   * All text från ett #-tecken till radens slut är en kommentar
@@ -3113,10 +3371,34 @@ $messages['sv'] = array(
 #   * All text från ett #-tecken till radens slut är en kommentar
 #   * Alla icke-tomma rader används som reguljära uttryck för att matcha domännamn i URL:er
 
+ #</pre> <!-- ändra inte den här raden -->',
+	'email-blacklist' => ' #<!-- ändra inte den här raden --> <pre>
+# E-postadresser som matchar den här listan kommer att hindras att registrera och skicka e-post
+# Denna lista gäller endast denna wiki; se även den globala svartlistan.
+# För dokumentation se https://www.mediawiki.org/wiki/Extension:SpamBlacklist
+#
+# Syntaxen är följande:
+#   * Allt från ett "#"-tecken till slutet av raden är en kommentar
+#   * Varje icke-tom rad är ett regex-fragment som endast kommer att matcha värdnamn i e-postadresser
+ #</pre> <!-- ändra inte den här raden -->',
+	'email-whitelist' => ' #<!-- ändra inte den här raden --> <pre>
+# E-postadresser som matchar den här listan kommer *inte* att blockeras, även om de skulle ha blivit blockerade av svartlistan.
+#
+# Syntaxen är följande:
+#   * Allt från ett "#"-tecken till slutet av raden är en kommentar
+#   * Varje icke-tom rad är ett regex-fragment som endast kommer att matcha värdnamn i e-postadresser
+
  #</pre> <!-- ändra inte den här raden -->',
 	'spam-blacklisted-email' => 'Svartlistad e-postadress',
+	'spam-blacklisted-email-text' => 'Din e-postadress är för närvarande svartlistad från att skicka e-post till andra användare.',
+	'spam-blacklisted-email-signup' => 'Den angivna e-postadressen är förnärvarande svartlistad från användning.',
 	'spam-invalid-lines' => 'Följande {{PLURAL:$1|rad|rader}} i svarta listan för spam innehåller inte något giltigt reguljärt uttryck  och måste rättas innan sidan sparas:',
-	'spam-blacklist-desc' => 'Antispamverktyg baserat på reguljära uttryck: [[MediaWiki:Spam-blacklist]] och [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Antispamverktyg baserat på reguljära uttryck som gör det möjligt att svartlista webbadresser på sidor och e-postadresser för registrerade användare',
+	'log-name-spamblacklist' => 'Svartlistningslogg för spam',
+	'log-description-spamblacklist' => 'Dessa händelser spårar träffar is svartlistningsloggen för spam.',
+	'logentry-spamblacklist-hit' => '$1 orsakade en träff i svartlistningsloggen för spam på $3 genom att försöka lägga till $4.',
+	'right-spamblacklistlog' => 'Visa svartlistningslogg för spam',
+	'action-spamblacklistlog' => 'visa svartlistningsloggen för spam',
 );
 
 /** Tamil (தமிழ்)
@@ -3155,7 +3437,7 @@ $messages['te'] = array(
 
  #</pre> <!-- leave this line exactly as it is -->',
 	'spam-invalid-lines' => 'స్పామ్ నిరోధపు జాబితాలోని క్రింద పేర్కొన్న {{PLURAL:$1|లైను|లైన్లు}} తప్పుగా {{PLURAL:$1|ఉంది|ఉన్నాయి}}, పేజీని భద్రపరిచేముందు {{PLURAL:$1|దాన్ని|వాటిని}} సరిదిద్దండి:',
-	'spam-blacklist-desc' => 'Regex-ఆధారిత స్పామ్ నిరోధక పనిముట్టు: [[MediaWiki:Spam-blacklist]] మరియు [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Regex-ఆధారిత స్పామ్ నిరోధక పనిముట్టు: [[MediaWiki:Spam-blacklist]] మరియు [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Tajik (Cyrillic script) (тоҷикӣ)
@@ -3184,7 +3466,7 @@ $messages['tg-cyrl'] = array(
 # нишонии интернетии URL мутобиқат дода мешавад
  #</pre> <!-- ин сатрро ҳамонгуна, ки ҳаст раҳо кунед -->',
 	'spam-invalid-lines' => '{{PLURAL:$1|Сатри|Сатрҳои}} зерин дар феҳристи сиёҳи ҳарзнигорӣ дастуроти ғайри миҷозе regular expressions  {{PLURAL:$1|аст|ҳастанд}} ва қабл аз захира кардани саҳифа ба ислоҳ кардан ниёз {{PLURAL:$1|дорад|доранд}}:',
-	'spam-blacklist-desc' => 'Абзори зидди ҳарзнигорӣ дар асоси Regex: [[MediaWiki:Spam-blacklist]] ва [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Абзори зидди ҳарзнигорӣ дар асоси Regex: [[MediaWiki:Spam-blacklist]] ва [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Tajik (Latin script) (tojikī)
@@ -3213,7 +3495,7 @@ $messages['tg-latn'] = array(
 # nişoniji internetiji URL mutobiqat doda meşavad
  #</pre> <!-- in satrro hamonguna, ki hast raho kuned -->',
 	'spam-invalid-lines' => '{{PLURAL:$1|Satri|Satrhoi}} zerin dar fehristi sijohi harznigorī dasturoti ƣajri miçoze regular expressions  {{PLURAL:$1|ast|hastand}} va qabl az zaxira kardani sahifa ba isloh kardan nijoz {{PLURAL:$1|dorad|dorand}}:',
-	'spam-blacklist-desc' => 'Abzori ziddi harznigorī dar asosi Regex: [[MediaWiki:Spam-blacklist]] va [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Abzori ziddi harznigorī dar asosi Regex: [[MediaWiki:Spam-blacklist]] va [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Turkmen (Türkmençe)
@@ -3221,7 +3503,7 @@ $messages['tg-latn'] = array(
  */
 $messages['tk'] = array(
 	'spam-invalid-lines' => 'Aşakdaky spam gara sanawynyň {{PLURAL:$1|setiri|setiri}} nädogry regulýar {{PLURAL:$1|aňlatmadyr|aňlatmadyr}} we sahypa ýazdyrylmanka düzedilmelidir:',
-	'spam-blacklist-desc' => 'Regulýar aňlatmalar esasynda anti-spam guraly: [[MediaWiki:Spam-blacklist]] we [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Regulýar aňlatmalar esasynda anti-spam guraly: [[MediaWiki:Spam-blacklist]] we [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Tagalog (Tagalog)
@@ -3269,7 +3551,7 @@ $messages['tl'] = array(
 	'spam-blacklisted-email-text' => 'Kasalukuyang pinagbabawalan ang iyong tirahan ng e-liham na makapagpadala ng mga e-liham papunta sa ibang mga tagagamit.',
 	'spam-blacklisted-email-signup' => 'Kasalukuyang ipinagbabawal ang paggamit ng ibinigay na tirahan ng e-liham.',
 	'spam-invalid-lines' => 'Ang sumusunod na {{PLURAL:$1|isang hanay/guhit|mga hanay/guhit}} ng talaan ng pinagbabawalang "manlulusob" (\'\'spam\'\') ay hindi tanggap na karaniwang {{PLURAL:$1|pagsasaad|mga pagsasaad}} at {{PLURAL:$1|kinakailangang|kinakailangang}} maitama muna bago sagipin ang pahina:',
-	'spam-blacklist-desc' => "Kasangkapang panlaban sa \"manlulusob\" (''spam'') na nakabatay sa karaniwang pagsasaad (''regex''): [[MediaWiki:Spam-blacklist]] at [[MediaWiki:Spam-whitelist]]",
+	'spam-blacklist-desc' => "Kasangkapang panlaban sa \"manlulusob\" (''spam'') na nakabatay sa karaniwang pagsasaad (''regex''): [[MediaWiki:Spam-blacklist]] at [[MediaWiki:Spam-whitelist]]", # Fuzzy
 );
 
 /** Turkish (Türkçe)
@@ -3296,12 +3578,13 @@ $messages['tr'] = array(
 
  #</pre> <!--bu satırı olduğu gibi bırakın -->',
 	'spam-invalid-lines' => 'Şu spam karaliste {{PLURAL:$1|satırı|satırları}} geçersiz düzenli {{PLURAL:$1|tanımdır|tanımlardır}} ve sayfayı kaydetmeden düzeltilmesi gerekmektedir:',
-	'spam-blacklist-desc' => 'Regex-tabanlı anti-spam aracı: [[MediaWiki:Spam-blacklist]] ve [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Regex-tabanlı anti-spam aracı: [[MediaWiki:Spam-blacklist]] ve [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Ukrainian (українська)
  * @author AS
  * @author Ahonc
+ * @author Andriykopanytsia
  * @author AtUkr
  * @author Base
  * @author Ата
@@ -3347,7 +3630,12 @@ $messages['uk'] = array(
 	'spam-blacklisted-email-text' => 'Ваша адреса електронної пошти в даний час знаходиться в чорному списку, тому ви не можете надсилати повідомлення іншим користувачам.',
 	'spam-blacklisted-email-signup' => 'Вказана Вами адреса електронної пошти наразі занесена до чорного списку і не може бути використаною.',
 	'spam-invalid-lines' => '{{PLURAL:$1|Наступний рядок із чорного списку посилань містить помилковий регулярний вираз і його треба виправити|Наступні рядки із чорного списку посилань містять помилкові регулярні вирази і їх треба виправити}} перед збереженням:',
-	'spam-blacklist-desc' => 'Протиспамовий засіб, що базується на регулярних виразах: [[MediaWiki:Spam-blacklist]] та [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Засновану на регулярних виразах антиспам інструмент, який дозволяє кидати у чорний список URL сторінки і адреси електронної пошти для зареєстрованих користувачів',
+	'log-name-spamblacklist' => 'Журнал чорного списку спамерів',
+	'log-description-spamblacklist' => 'Ці події відстежують потрапляння у чорний список спамерів.',
+	'logentry-spamblacklist-hit' => '$1 спричинив потрапляння у чорний список спамерів на $3, намагаючись додати $4.',
+	'right-spamblacklistlog' => 'Перегляд журналу чорного списку спамерів',
+	'action-spamblacklistlog' => 'перегляд журналу "чорний список" спамерів',
 );
 
 /** vèneto (vèneto)
@@ -3392,7 +3680,7 @@ $messages['vec'] = array(
 	'spam-blacklisted-email-text' => "El to indiriso de posta eletronega el xe atualmente inte ła lista nera par 'l invio de e-mail verso altri utenti.",
 	'spam-blacklisted-email-signup' => 'El indiriso de posta eletronega indicà el xe atualmente inte ła lista nera.',
 	'spam-invalid-lines' => "{{PLURAL:$1|La seguente riga|Le seguenti righe}} de la lista nera del spam {{PLURAL:$1|no la xe na espression regolare valida|no le xe espressioni regolari valide}}; se prega de corègiar {{PLURAL:$1|l'eror|i erori}} prima de salvar la pagina.",
-	'spam-blacklist-desc' => 'Strumento antispam basà su le espressioni regolari [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Strumento antispam basà su le espressioni regolari [[MediaWiki:Spam-blacklist]] e [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Vietnamese (Tiếng Việt)
@@ -3417,7 +3705,7 @@ $messages['vi'] = array(
 #  * Các dòng không để trống là một mảnh biểu thức chính quy, nó chỉ trùng với tên máy chủ trong địa chỉ URL.
 
  #</pre> <!-- leave this line exactly as it is -->',
-	'email-blacklist' => ' # Các địa chỉ thư điện tử trùng với danh sách này bị cấm không được đăng ký hoặc gửi thư điện tử.
+	'email-blacklist' => ' # Các địa chỉ thư điện tử trùng với danh sách này bị cấm không được mở tài khoản hoặc gửi thư điện tử.
  # Danh sách này chỉ có hiệu lực ở wiki này; hãy xem thêm “danh sách đen toàn cầu”.
  # Có tài liệu hướng dẫn tại https://www.mediawiki.org/wiki/Extension:SpamBlacklist
  #<!-- leave this line exactly as it is --> <pre>
@@ -3438,7 +3726,19 @@ $messages['vi'] = array(
 	'spam-blacklisted-email-text' => 'Địa chỉ thư điện tử của bạn đã được đưa vào danh sách đen nên bị cấm không được gửi thư điện tử cho người dùng khác.',
 	'spam-blacklisted-email-signup' => 'Địa chỉ thư điện tử được cung cấp đã được đưa vào danh sách đen nên bị cấm không được sử dụng.',
 	'spam-invalid-lines' => '{{PLURAL:$1|Dòng|Những dòng}} sau đây trong danh sách đen về spam không hợp lệ; xin hãy sửa chữa {{PLURAL:$1|nó|chúng}} để tuân theo cú pháp biểu thức chính quy trước khi lưu trang:',
-	'spam-blacklist-desc' => 'Công cụ dùng biểu thức chính quy để chống spam: [[MediaWiki:Spam-blacklist]] và [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => 'Công cụ cho phép chống spam bằng cách cấm những URL trong trang và địa chỉ thư điện tử của thành viên đăng ký khớp với các biểu thức chính quy trong danh sách đen',
+	'log-name-spamblacklist' => 'Nhật trình chặn spam vì danh sách đen',
+	'log-description-spamblacklist' => 'Nhật trình này ghi các lần chặn spam vì nằm vào danh sách đen.',
+	'logentry-spamblacklist-hit' => '$1 bị danh sách đen chống spam ngăn không được thêm $4 vào $3',
+	'right-spamblacklistlog' => 'Xem nhật trình chặn spam vì danh sách đen',
+	'action-spamblacklistlog' => 'xem nhật trình chặn spam vì danh sách đen',
+);
+
+/** Wu (吴语)
+ * @author 十弌
+ */
+$messages['wuu'] = array(
+	'log-name-spamblacklist' => '垃圾電郵黑名單日誌',
 );
 
 /** Cantonese (粵語)
@@ -3464,12 +3764,14 @@ $messages['yue'] = array(
 
  #</pre> <!-- 請完全噉留番呢行 -->',
 	'spam-invalid-lines' => '下面響灌水黑名單嘅{{PLURAL:$1|一行|多行}}有無效嘅表示式，請響保存呢版之前先將{{PLURAL:$1|佢|佢哋}}修正:',
-	'spam-blacklist-desc' => '以正規表達式為本嘅防灌水工具: [[MediaWiki:Spam-blacklist]] 同 [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => '以正規表達式為本嘅防灌水工具: [[MediaWiki:Spam-blacklist]] 同 [[MediaWiki:Spam-whitelist]]', # Fuzzy
 );
 
 /** Simplified Chinese (中文（简体）‎)
  * @author Hzy980512
+ * @author Liangent
  * @author Linforest
+ * @author Liuxinyu970226
  * @author Mys 721tx
  * @author PhiLiP
  * @author Supaiku
@@ -3515,10 +3817,17 @@ $messages['zh-hans'] = array(
 	'spam-blacklisted-email-text' => '您的电子邮件地址目前已被列入黑名单以防止您发送邮件。',
 	'spam-blacklisted-email-signup' => '所给电邮地址已被列入黑名单。',
 	'spam-invalid-lines' => '下列垃圾链接黑名单有{{PLURAL:$1|一行|多行}}含有无效的正则表示式，请在保存该页前修正之：',
-	'spam-blacklist-desc' => '基于正则表达式的反垃圾链接工具：[[MediaWiki:Spam-blacklist]]和[[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => '基于正则表达式的反垃圾邮件工具，允许列入黑名单的网页的URL和电子邮件地址注册用户',
+	'log-name-spamblacklist' => '垃圾链接黑名单日志',
+	'log-description-spamblacklist' => '这个列表跟踪垃圾链接黑名单的触发。',
+	'logentry-spamblacklist-hit' => '$1在$3上试图加入$4，触发了垃圾链接黑名单',
+	'right-spamblacklistlog' => '查看垃圾邮件黑名单日志',
+	'action-spamblacklistlog' => '查看垃圾邮件黑名单日志',
 );
 
 /** Traditional Chinese (中文（繁體）‎)
+ * @author Liangent
+ * @author Liuxinyu970226
  * @author Mark85296341
  * @author Oapbtommy
  * @author Waihorace
@@ -3564,5 +3873,10 @@ $messages['zh-hant'] = array(
 	'spam-blacklisted-email-text' => '您的電郵地址目前已列入黑名單以防止您發送電郵予其他用戶。',
 	'spam-blacklisted-email-signup' => '此電郵地址目前被禁止使用。',
 	'spam-invalid-lines' => '以下在灌水黑名單的{{PLURAL:$1|一行|多行}}有無效的表示式，請在儲存這頁前先將{{PLURAL:$1|它|它們}}修正：',
-	'spam-blacklist-desc' => '以正則表達式為本的防灌水工具：[[MediaWiki:Spam-blacklist]] 與 [[MediaWiki:Spam-whitelist]]',
+	'spam-blacklist-desc' => '基於正則表達式的反垃圾電郵工具，允許加入濫發電郵的URL和/或註冊用戶於此頁面',
+	'log-name-spamblacklist' => '垃圾連結黑名單日誌',
+	'log-description-spamblacklist' => '這些事件已被垃圾郵件黑名單觸發。',
+	'logentry-spamblacklist-hit' => '$1於$3嘗試加入$4而觸發垃圾電郵黑名單。',
+	'right-spamblacklistlog' => '查閱垃圾電郵黑名單日誌',
+	'action-spamblacklistlog' => '查閱垃圾電郵黑名單日誌',
 );
diff --git a/extensions/SpamBlacklist/SpamBlacklist.php b/extensions/SpamBlacklist/SpamBlacklist.php
index f3e27f3c..2fd7855d 100644
--- a/extensions/SpamBlacklist/SpamBlacklist.php
+++ b/extensions/SpamBlacklist/SpamBlacklist.php
@@ -10,7 +10,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 $wgExtensionCredits['antispam'][] = array(
 	'path'           => __FILE__,
 	'name'           => 'SpamBlacklist',
-	'author'         => array( 'Tim Starling', 'John Du Hart' ),
+	'author'         => array( 'Tim Starling', 'John Du Hart', 'Daniel Kinzler' ),
 	'url'            => 'https://www.mediawiki.org/wiki/Extension:SpamBlacklist',
 	'descriptionmsg' => 'spam-blacklist-desc',
 );
@@ -21,7 +21,16 @@ $wgExtensionMessagesFiles['SpamBlackList'] = $dir . 'SpamBlacklist.i18n.php';
 /**
  * Array of settings for blacklist classes
  */
-$wgBlacklistSettings = array();
+$wgBlacklistSettings = array(
+	'spam' => array(
+		'files' => array( "http://meta.wikimedia.org/w/index.php?title=Spam_blacklist&action=raw&sb_ver=1" )
+	)
+);
+
+/**
+ * Log blacklist hits to Special:Log
+ */
+$wgLogSpamBlacklistHits = false;
 
 /**
  * @deprecated
@@ -33,10 +42,19 @@ $wgSpamBlacklistFiles =& $wgBlacklistSettings['spam']['files'];
  */
 $wgSpamBlacklistSettings =& $wgBlacklistSettings['spam'];
 
-$wgHooks['EditFilterMerged'][] = 'SpamBlacklistHooks::filterMerged';
+if ( !defined( 'MW_SUPPORTS_CONTENTHANDLER' ) ) {
+	die( "This version of SpamBlacklist requires a version of MediaWiki that supports the ContentHandler facility (supported since MW 1.21)." );
+}
+
+// filter pages on save
+$wgHooks['EditFilterMergedContent'][] = 'SpamBlacklistHooks::filterMergedContent';
 $wgHooks['APIEditBeforeSave'][] = 'SpamBlacklistHooks::filterAPIEditBeforeSave';
+
+// editing filter rules
 $wgHooks['EditFilter'][] = 'SpamBlacklistHooks::validate';
-$wgHooks['ArticleSaveComplete'][] = 'SpamBlacklistHooks::articleSave';
+$wgHooks['PageContentSaveComplete'][] = 'SpamBlacklistHooks::pageSaveContent';
+
+// email filters
 $wgHooks['UserCanSendEmail'][] = 'SpamBlacklistHooks::userCanSendEmail';
 $wgHooks['AbortNewAccount'][] = 'SpamBlacklistHooks::abortNewAccount';
 
@@ -45,3 +63,10 @@ $wgAutoloadClasses['EmailBlacklist'] = $dir . 'EmailBlacklist.php';
 $wgAutoloadClasses['SpamBlacklistHooks'] = $dir . 'SpamBlacklistHooks.php';
 $wgAutoloadClasses['SpamBlacklist'] = $dir . 'SpamBlacklist_body.php';
 $wgAutoloadClasses['SpamRegexBatch'] = $dir . 'SpamRegexBatch.php';
+
+$wgLogTypes[] = 'spamblacklist';
+$wgLogActionsHandlers['spamblacklist/*'] = 'LogFormatter';
+$wgLogRestrictions['spamblacklist'] = 'spamblacklistlog';
+$wgGroupPermissions['sysop']['spamblacklistlog'] = true;
+
+$wgAvailableRights[] = 'spamblacklistlog';
diff --git a/extensions/SpamBlacklist/SpamBlacklistHooks.php b/extensions/SpamBlacklist/SpamBlacklistHooks.php
index 530df16a..54f833cb 100644
--- a/extensions/SpamBlacklist/SpamBlacklistHooks.php
+++ b/extensions/SpamBlacklist/SpamBlacklistHooks.php
@@ -5,34 +5,53 @@
  */
 class SpamBlacklistHooks {
 	/**
-	 * Hook function for EditFilterMerged
+	 * Hook function for EditFilterMergedContent
+	 *
+	 * @param IContextSource $context
+	 * @param Content        $content
+	 * @param Status         $status
+	 * @param string         $summary
+	 * @param User           $user
+	 * @param bool           $minoredit
 	 *
-	 * @param $editPage EditPage
-	 * @param $text string
-	 * @param $hookErr string
-	 * @param $editSummary string
 	 * @return bool
 	 */
-	static function filterMerged( $editPage, $text, &$hookErr, $editSummary ) {
-		global $wgTitle;
-		if( is_null( $wgTitle ) ) {
-			# API mode
-			# wfSpamBlacklistFilterAPIEditBeforeSave already checked the blacklist
+	static function filterMergedContent( IContextSource $context, Content $content, Status $status, $summary, User $user, $minoredit ) {
+		$title = $context->getTitle();
+
+		if ( isset( $title->spamBlackListFiltered ) && $title->spamBlackListFiltered ) {
+			// already filtered
 			return true;
 		}
 
+		// get the link from the not-yet-saved page content.
+		$pout = $content->getParserOutput( $title );
+		$links = array_keys( $pout->getExternalLinks() );
+
+		// HACK: treat the edit summary as a link
+		if ( $summary !== '' ) {
+			$links[] = $summary;
+		}
+
 		$spamObj = BaseBlacklist::getInstance( 'spam' );
-		$title = $editPage->mArticle->getTitle();
-		$ret = $spamObj->filter( $title, $text, '', $editSummary, $editPage );
-		if ( $ret !== false ) {
-			$editPage->spamPageWithContent( $ret );
+		$matches = $spamObj->filter( $links, $title );
+
+		if ( $matches !== false ) {
+			$status->fatal( 'spamprotectiontext' );
+
+			foreach ( $matches as $match ) {
+				$status->fatal( 'spamprotectionmatch', $match );
+			}
 		}
-		// Return convention for hooks is the inverse of $wgFilterCallback
-		return ( $ret === false );
+
+		// Always return true, EditPage will look at $status->isOk().
+		return true;
 	}
 
 	/**
-	 * Hook function for APIEditBeforeSave
+	 * Hook function for APIEditBeforeSave.
+	 * This allows blacklist matches to be reported directly in the result structure
+	 * of the API call.
 	 *
 	 * @param $editPage EditPage
 	 * @param $text string
@@ -40,14 +59,37 @@ class SpamBlacklistHooks {
 	 * @return bool
 	 */
 	static function filterAPIEditBeforeSave( $editPage, $text, &$resultArr ) {
-		$spamObj = BaseBlacklist::getInstance( 'spam' );
 		$title = $editPage->mArticle->getTitle();
-		$ret = $spamObj->filter( $title, $text, '', '', $editPage );
-		if ( $ret!==false ) {
-			$resultArr['spamblacklist'] = implode( '|', $ret );
+
+		// get the links from the not-yet-saved page content.
+		$content = ContentHandler::makeContent(
+			$text,
+			$editPage->getTitle(),
+			$editPage->contentModel,
+			$editPage->contentFormat
+		);
+		$editInfo = $editPage->mArticle->prepareContentForEdit( $content, null, null, $editPage->contentFormat );
+		$pout = $editInfo->output;
+		$links = array_keys( $pout->getExternalLinks() );
+
+		// HACK: treat the edit summary as a link
+		$summary = $editPage->summary;
+		if ( $summary !== '' ) {
+			$links[] = $summary;
+		}
+
+		$spamObj = BaseBlacklist::getInstance( 'spam' );
+		$matches = $spamObj->filter( $links, $title );
+
+		if ( $matches !== false ) {
+			$resultArr['spamblacklist'] = implode( '|', $matches );
 		}
-		// Return convention for hooks is the inverse of $wgFilterCallback
-		return ( $ret === false );
+
+		// mark the title, so filterMergedContent can skip it.
+		$title->spamBlackListFiltered = true;
+
+		// return convention for hooks is the inverse of $wgFilterCallback
+		return ( $matches === false );
 	}
 
 	/**
@@ -136,20 +178,37 @@ class SpamBlacklistHooks {
 	}
 
 	/**
-	 * Hook function for ArticleSaveComplete
+	 * Hook function for PageContentSaveComplete
 	 * Clear local spam blacklist caches on page save.
 	 *
-	 * @param $article Article
-	 * @param $user User
-	 * @param $text string
-	 * @param $summary string
-	 * @param $isminor
-	 * @param $iswatch
-	 * @param $section
+	 * @param Page $wikiPage
+	 * @param User     $user
+	 * @param Content  $content
+	 * @param string   $summary
+	 * @param bool     $isMinor
+	 * @param bool     $isWatch
+	 * @param string   $section
+	 * @param int      $flags
+	 * @param int      $revision
+	 * @param Status   $status
+	 * @param int      $baseRevId
+	 *
 	 * @return bool
 	 */
-	static function articleSave( &$article, &$user, $text, $summary, $isminor, $iswatch, $section ) {
-		if( !BaseBlacklist::isLocalSource( $article->getTitle() ) ) {
+	static function pageSaveContent(
+		Page $wikiPage,
+		User $user,
+		Content $content,
+		$summary,
+		$isMinor,
+		$isWatch,
+		$section,
+		$flags,
+		$revision,
+		Status $status,
+		$baseRevId
+	) {
+		if( !BaseBlacklist::isLocalSource( $wikiPage->getTitle() ) ) {
 			return true;
 		}
 		global $wgMemc, $wgDBname;
diff --git a/extensions/SpamBlacklist/SpamBlacklist_body.php b/extensions/SpamBlacklist/SpamBlacklist_body.php
index 7279e20b..bf5c9aab 100644
--- a/extensions/SpamBlacklist/SpamBlacklist_body.php
+++ b/extensions/SpamBlacklist/SpamBlacklist_body.php
@@ -5,8 +5,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 }
 
 class SpamBlacklist extends BaseBlacklist {
-	var $files = array( "http://meta.wikimedia.org/w/index.php?title=Spam_blacklist&action=raw&sb_ver=1" );
-	var $ignoreEditSummary = false;
 
 	/**
 	 * Returns the code for the blacklist implementation
@@ -18,49 +16,45 @@ class SpamBlacklist extends BaseBlacklist {
 	}
 
 	/**
-	 * @param Title $title
-	 * @param string $text Text of section, or entire text if $editPage!=false
-	 * @param string $section Section number or name
-	 * @param string $editsummary Edit summary if one exists, some people use urls there too
-	 * @param EditPage $editPage EditPage if EditFilterMerged was called, null otherwise
-	 * @return Array Matched text(s) if the edit should not be allowed, false otherwise
+	 * Apply some basic anti-spoofing to the links before they get filtered,
+	 * see @bug 12896
+	 *
+	 * @param string $text
+	 *
+	 * @return string
 	 */
-	function filter( &$title, $text, $section, $editsummary = '', EditPage &$editPage = null ) {
-		/**
-		 * @var $wgParser Parser
-		 */
-		global $wgParser, $wgUser;
+	protected function antiSpoof( $text ) {
+		$text = str_replace( '．', '.', $text );
+		return $text;
+	}
 
+	/**
+	 * @param string[] $links An array of links to check against the blacklist
+	 * @param Title  $title The title of the page to which the filter shall be applied.
+	 *               This is used to load the old links already on the page, so
+	 *               the filter is only applied to links that got added. If not given,
+	 *               the filter is applied to all $links.
+	 *
+	 * @return Array Matched text(s) if the edit should not be allowed, false otherwise
+	 */
+	function filter( array $links, Title $title = null ) {
 		$fname = 'wfSpamBlacklistFilter';
 		wfProfileIn( $fname );
 
-		# These don't do anything, commenting out...
-		#$this->title = $title;
-		#$this->text = $text;
-		#$this->section = $section;
-		$text = str_replace( '．', '.', $text ); //@bug 12896
-
 		$blacklists = $this->getBlacklists();
 		$whitelists = $this->getWhitelists();
 
 		if ( count( $blacklists ) ) {
-			# Run parser to strip SGML comments and such out of the markup
-			# This was being used to circumvent the filter (see bug 5185)
-			if ( $editPage ) {
-				$editInfo = $editPage->mArticle->prepareTextForEdit( $text );
-				$out = $editInfo->output;
-			} else {
-				$options = new ParserOptions();
-				$text = $wgParser->preSaveTransform( $text, $title, $wgUser, $options );
-				$out = $wgParser->parse( $text, $title, $options );
-			}
-			$newLinks = array_keys( $out->getExternalLinks() );
-			$oldLinks = $this->getCurrentLinks( $title );
-			$addedLinks = array_diff( $newLinks, $oldLinks );
+			// poor man's anti-spoof, see bug 12896
+			$newLinks = array_map( array( $this, 'antiSpoof' ), $links );
 
-			// We add the edit summary if one exists
-			if ( !$this->ignoreEditSummary && !empty( $editsummary ) ) {
-				$addedLinks[] = $editsummary;
+			$oldLinks = array();
+			if ( $title !== null ) {
+				$oldLinks = $this->getCurrentLinks( $title );
+				$addedLinks = array_diff( $newLinks, $oldLinks );
+			} else {
+				// can't load old links, so treat all links as added.
+				$addedLinks = $newLinks;
 			}
 
 			wfDebugLog( 'SpamBlacklist', "Old URLs: " . implode( ', ', $oldLinks ) );
@@ -99,12 +93,16 @@ class SpamBlacklist extends BaseBlacklist {
 					$ip = $wgRequest->getIP();
 					$imploded = implode( ' ', $matches[0] );
 					wfDebugLog( 'SpamBlacklistHit', "$ip caught submitting spam: $imploded\n" );
+					$this->logFilterHit( $title, $imploded ); // Log it
 					if( $retVal === false ){
 						$retVal = array();
 					}
-					$retVal = array_merge( $retVal, $matches[0] );
+					$retVal = array_merge( $retVal, $matches[1] );
 				}
 			}
+			if ( is_array( $retVal ) ) {
+				$retVal = array_unique( $retVal );
+			}
 		} else {
 			$retVal = false;
 		}
@@ -150,4 +148,24 @@ class SpamBlacklist extends BaseBlacklist {
 	public function getRegexEnd( $batchSize ) {
 		return ')' . parent::getRegexEnd( $batchSize );
 	}
+	/**
+	 * Logs the filter hit to Special:Log if
+	 * $wgLogSpamBlacklistHits is enabled.
+	 *
+	 * @param Title $title
+	 * @param string $url URL that the user attempted to add
+	 */
+	public function logFilterHit( $title, $url ) {
+		global $wgUser, $wgLogSpamBlacklistHits;
+		if ( $wgLogSpamBlacklistHits ) {
+			$logEntry = new ManualLogEntry( 'spamblacklist', 'hit' );
+			$logEntry->setPerformer( $wgUser );
+			$logEntry->setTarget( $title );
+			$logEntry->setParameters( array(
+				'4::url' => $url,
+			) );
+			$logid = $logEntry->insert();
+			$logEntry->publish( $logid, "rc" );
+		}
+	}
 }
diff --git a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php
index 4538a5f1..b1c9851d 100644
--- a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php
+++ b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.class.php
@@ -28,12 +28,6 @@ class SyntaxHighlight_GeSHi {
 		// Don't trim leading spaces away, just the linefeeds
 		$text = preg_replace( '/^\n+/', '', $text );
 
-		if( $wgUseTidy ) {
-			// HTML Tidy will convert tabs to spaces incorrectly (bug 30930).
-			// Preemptively replace the spaces in a more controlled fashion.
-			$text = self::tabsToSpaces( $text );
-		}
-
 		// Validate language
 		if( isset( $args['lang'] ) && $args['lang'] ) {
 			$lang = $args['lang'];
@@ -101,6 +95,12 @@ class SyntaxHighlight_GeSHi {
 		if( $enclose === GESHI_HEADER_DIV ) {
 			$out = str_replace( "\n", '', $out );
 		}
+		// HTML Tidy will convert tabs to spaces incorrectly (bug 30930).
+		// But the conversion from tab to space occurs while reading the input,
+		// before the conversion from &#9; to tab, so we can armor it that way.
+		if( $wgUseTidy ) {
+			$out = str_replace( "\t", '&#9;', $out );
+		}
 		// Register CSS
 		$parser->getOutput()->addHeadItem( self::buildHeadItem( $geshi ), "source-{$lang}" );
 
@@ -327,6 +327,9 @@ class SyntaxHighlight_GeSHi {
 	 * @return GeSHi
 	 */
 	public static function prepare( $text, $lang ) {
+
+		global $wgSyntaxHighlightKeywordLinks;
+
 		self::initialise();
 		$geshi = new GeSHi( $text, $lang );
 		if( $geshi->error() == GESHI_ERROR_NO_SUCH_LANG ) {
@@ -335,7 +338,7 @@ class SyntaxHighlight_GeSHi {
 		$geshi->set_encoding( 'UTF-8' );
 		$geshi->enable_classes();
 		$geshi->set_overall_class( "source-$lang" );
-		$geshi->enable_keyword_links( false );
+		$geshi->enable_keyword_links( $wgSyntaxHighlightKeywordLinks );
 
 		// If the source code is over 100 kB, disable higlighting of symbols.
 		// If over 200 kB, disable highlighting of strings too.
@@ -485,35 +488,4 @@ class SyntaxHighlight_GeSHi {
 	public static function hOldSpecialVersion_GeSHi( &$sp, &$extensionTypes ) {
 		return self::hSpecialVersion_GeSHi( $extensionTypes );
 	}
-
-	/**
-	 * Convert tabs to spaces
-	 *
-	 * @param string $text
-	 * @return string
-	 */
-	private static function tabsToSpaces( $text ) {
-		$lines = explode( "\n", $text );
-		$lines = array_map( array( __CLASS__, 'tabsToSpacesLine' ), $lines );
-		return implode( "\n", $lines );
-	}
-
-	/**
-	 * Convert tabs to spaces for a single line
-	 *
-	 * @param $line
-	 * @internal param string $text
-	 * @return string
-	 */
-	private static function tabsToSpacesLine( $line ) {
-		$parts = explode( "\t", $line );
-		$width = 8; // To match tidy's config & typical browser defaults
-		$out = $parts[0];
-		foreach( array_slice( $parts, 1 ) as $chunk ) {
-			$spaces = $width - (strlen( $out ) % $width);
-			$out .= str_repeat( ' ', $spaces );
-			$out .= $chunk;
-		}
-		return $out;
-	}
 }
diff --git a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.i18n.php b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.i18n.php
index b9a336dd..9b940f3e 100644
--- a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.i18n.php
+++ b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.i18n.php
@@ -78,7 +78,7 @@ $messages['arz'] = array(
 	'geshi.css' => '/* CSS المحطوطة هنا ح تتطبق على تظليل سينتاكس الGeSHi */',
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Bishnu Saikia
  */
 $messages['as'] = array(
@@ -199,9 +199,11 @@ $messages['ca'] = array(
 
 /** Chechen (нохчийн)
  * @author Sasan700
+ * @author Умар
  */
 $messages['ce'] = array(
-	'geshi.css' => '/* CSS-ишар, кху чу хlоттайахь, оцо болх бийра бу сизашдо беснашна хlокхуньца GeSHI */',
+	'syntaxhighlight-supported' => 'Ловш долу меттанаш:',
+	'geshi.css' => '/* CSS-код, кху чу хlоттайахь, оцо болх бийра бу сизашдо беснашна хlокхуньца GeSHI */',
 );
 
 /** Czech (česky)
@@ -218,10 +220,16 @@ $messages['cs'] = array(
 );
 
 /** Danish (dansk)
+ * @author Christian List
  * @author Sarrus
  */
 $messages['da'] = array(
+	'syntaxhighlight-desc' => 'Giver syntaksfremhævning <code>&lt;syntaxhighlight&gt;</code> ved brug af [http://qbnz.com/highlighter/ GeSHi - Generic Syntax Highlighter]',
+	'syntaxhighlight-specify' => 'Du skal angive et sprog, sådan her:',
+	'syntaxhighlight-supported' => 'Understøttede sprog for syntaksfremhævning:',
+	'syntaxhighlight-err-loading' => '(fejl ved indlæsning af listen af understøttede sprog)',
 	'syntaxhighlight-err-language' => 'Ugyldigt sprog.',
+	'geshi.css' => '/* CSS placeret her vil blive anvendt til GeSHi syntaksfremhævning */',
 );
 
 /** German (Deutsch)
@@ -314,7 +322,7 @@ $messages['et'] = array(
 	'syntaxhighlight-specify' => 'Sa pead täpsustama keelt nõnda:',
 	'syntaxhighlight-supported' => 'Süntaksi esiletoomise on toetatud järgnevates keeltes:',
 	'syntaxhighlight-err-loading' => '(toetatud keelte loetelu laadimisel esines viga)',
-	'syntaxhighlight-err-language' => 'antud keel on mittekehtiv',
+	'syntaxhighlight-err-language' => 'Vigane keel.',
 	'geshi.css' => '/* CSS mis on asetatud siia, määrab GeSHi süntaksi esiletoomise stiili */',
 );
 
@@ -335,7 +343,7 @@ $messages['fa'] = array(
 	'syntaxhighlight-specify' => 'شما باید به این شکل زبانی را مشخص کنید:',
 	'syntaxhighlight-supported' => 'زبان‌های پشتیبانی‌شده برای رنگین‌کردن دستورات:',
 	'syntaxhighlight-err-loading' => '(خطا در بارگذاری فهرست زبان‌های پشتیبانی‌شده)',
-	'syntaxhighlight-err-language' => 'زبان غیرمجاز.',
+	'syntaxhighlight-err-language' => 'زبان نامجاز.',
 	'geshi.css' => '/* دستورات CSS اینجا توسط سامانه رنگین‌کردن دستورات GeSHi به کار گرفته می‌شوند */',
 );
 
@@ -657,10 +665,10 @@ $messages['km'] = array(
  * @author 아라
  */
 $messages['ko'] = array(
-	'syntaxhighlight-desc' => '<code>&lt;syntaxhighlight&gt;</code> 태그로 [http://qbnz.com/highlighter/ GeSHi Highlighter]를 이용해 문법 강조 기능을 지원합니다.',
-	'syntaxhighlight-specify' => '오른쪽과 같이 언어를 설정해야 합니다:',
-	'syntaxhighlight-supported' => '문법 강조가 지원되는 언어 목록',
-	'syntaxhighlight-err-loading' => '(지원하는 언어 목록을 불러오는 중 오류 발생)',
+	'syntaxhighlight-desc' => '[http://qbnz.com/highlighter/ GeSHi Highlighter]를 사용해 <code>&lt;syntaxhighlight&gt;</code>로 문법 강조를 제공합니다',
+	'syntaxhighlight-specify' => '다음과 같이 언어를 지정해야 합니다:',
+	'syntaxhighlight-supported' => '문법 강조가 지원되는 언어 목록:',
+	'syntaxhighlight-err-loading' => '(지원되는 언어 목록을 불러오는 중 오류)',
 	'syntaxhighlight-err-language' => '잘못된 언어입니다.',
 	'geshi.css' => '/* 이 문서에서 설정한 CSS는 GeSHi에 적용됩니다. */',
 );
@@ -680,10 +688,11 @@ $messages['ksh'] = array(
 /** Luxembourgish (Lëtzebuergesch)
  * @author Les Meloures
  * @author Robby
+ * @author Soued031
  */
 $messages['lb'] = array(
 	'syntaxhighlight-desc' => "Syntax-Ervirhiewung <code>&lt;syntaxhighlight&gt;</code> mat Hëllef vu [http://qbnz.com/highlighter/ 'GeSHi Highlighter']",
-	'syntaxhighlight-specify' => 'Déi gewënscht Sprooch muss esou definéiert ginn:',
+	'syntaxhighlight-specify' => 'Déi gewënscht Sprooch muss sou definéiert ginn:',
 	'syntaxhighlight-supported' => "Ënnerstëtzte Sprooche fir d'Syntax faarweg ze markéieren",
 	'syntaxhighlight-err-loading' => '(Feeler beim Luede vun der Lëscht vun den ënnerstëtzte Sproochen)',
 	'syntaxhighlight-err-language' => 'Net valabel Sprooch.',
@@ -790,7 +799,7 @@ $messages['nah'] = array(
 	'syntaxhighlight-err-language' => 'Âmò kualli tlâtòlli',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  */
 $messages['nb'] = array(
 	'syntaxhighlight-desc' => 'Gir syntaks som framhever <code>&lt;syntaxhighlight&gt;</code> ved hjelp av [http://qbnz.com/highlighter/ GeSHi Highlighter]',
@@ -813,7 +822,7 @@ $messages['nds'] = array(
 	'geshi.css' => '/* CSS in disse MediaWiki-Systemnaricht warrt för dat GeSHi-Syntaxrutheven bruukt */',
 );
 
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
  * @author Servien
  */
 $messages['nds-nl'] = array(
@@ -833,7 +842,7 @@ $messages['nl'] = array(
 	'geshi.css' => '/* Hier geplaatste CSS wordt toegepast op GeSHi Syntax Highlighting */',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Frokor
  */
 $messages['nn'] = array(
@@ -909,7 +918,7 @@ $messages['pms'] = array(
  * @author Ahmed-Najib-Biabani-Ibrahimkhel
  */
 $messages['ps'] = array(
-	'syntaxhighlight-specify' => 'بايد تاسې يوه ژبه په دې توګه ځانګړې کړی:',
+	'syntaxhighlight-specify' => 'بايد تاسې يوه ژبه په دې توگه ځانگړې کړۍ:',
 	'syntaxhighlight-err-language' => 'ناسمه ژبه.',
 );
 
diff --git a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php
index 0b6cb0c6..5372342d 100644
--- a/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php
+++ b/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php
@@ -48,7 +48,10 @@ $wgExtensionCredits['parserhook']['SyntaxHighlight_GeSHi'] = array(
 	'url'            => 'https://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi',
 );
 
-$wgSyntaxHighlightDefaultLang = null; //Change this in LocalSettings.php
+// Change these in LocalSettings.php
+$wgSyntaxHighlightDefaultLang = null;
+$wgSyntaxHighlightKeywordLinks = false;
+
 $dir = dirname(__FILE__) . '/';
 $wgExtensionMessagesFiles['SyntaxHighlight_GeSHi'] = $dir . 'SyntaxHighlight_GeSHi.i18n.php';
 $wgAutoloadClasses['SyntaxHighlight_GeSHi'] = $dir . 'SyntaxHighlight_GeSHi.class.php';
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php
index 60741577..4323d05c 100644
--- a/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi.php
@@ -41,7 +41,7 @@
 //
 
 /** The version of this GeSHi file */
-define('GESHI_VERSION', '1.0.8.11');
+define('GESHI_VERSION', '1.0.8.11-wmf1');  // WMF fix for Haskell (bug 52509)
 
 // Define the root directory for the GeSHi code tree
 if (!defined('GESHI_ROOT')) {
diff --git a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/haskell.php b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/haskell.php
index adae1116..d3b494ed 100644
--- a/extensions/SyntaxHighlight_GeSHi/geshi/geshi/haskell.php
+++ b/extensions/SyntaxHighlight_GeSHi/geshi/geshi/haskell.php
@@ -13,6 +13,14 @@
  * -------
  * 2005/08/27 (1.0.0)
  *   -  First Release
+ * 2013/09/28
+ *   -  Single quotes dropped from QUOTEMARKS to resolve <https://bugzilla.wikimedia.org/52509>.
+ *      Change is local to SyntaxHighlight_GeSHi, made by Ori Livneh (ori@wikimedia.org), based
+ *      on a proposed upstream patch.
+ *      Upstream bug report:
+ *        <http://sourceforge.net/p/geshi/bugs/217/>
+ *      Upstream patch (stalled since 2012):
+ *        <http://sourceforge.net/p/geshi/bugs/219/>
  *
  * TODO (updated 2005/08/27)
  * -------------------------
@@ -46,7 +54,7 @@ $language_data = array (
         3 => "/{-(?:(?R)|.)-}/s", //Nested Comments
         ),
     'CASE_KEYWORDS' => 0,
-    'QUOTEMARKS' => array('"',"'"),
+    'QUOTEMARKS' => array('"'),  // SyntaxHighlight_GeSHi modification; see CHANGES above.
     'ESCAPE_CHAR' => '\\',
     'KEYWORDS' => array(
         /* main haskell keywords */
diff --git a/extensions/TitleBlacklist/TitleBlacklist.i18n.php b/extensions/TitleBlacklist/TitleBlacklist.i18n.php
index 874a990b..eb8f6987 100644
--- a/extensions/TitleBlacklist/TitleBlacklist.i18n.php
+++ b/extensions/TitleBlacklist/TitleBlacklist.i18n.php
@@ -155,7 +155,7 @@ $messages['arz'] = array(
 	'right-tboverride' => 'اتجاوز البلاك ليست بتاعةالعناوين', # Fuzzy
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Bishnu Saikia
  * @author Gitartha.bordoloi
  * @author Nilamdyuti
@@ -210,9 +210,10 @@ por favor {{PLURAL:$1|corríxila|corríxiles}} enantes de guardar:',
 
 /** Bashkir (башҡортса)
  * @author Assele
+ * @author Рустам Нурыев
  */
 $messages['ba'] = array(
-	'titleblacklist-desc' => 'Хәкимдәргә [[MediaWiki:Titleblacklist|ҡара]] һәм [[MediaWiki:Titlewhitelist|аҡ]] исемлек ярҙамында биттәрҙе һәм иҫәп яҙмаларын булдырыуҙы тыйырға мөмкинлек бирә.',
+	'titleblacklist-desc' => 'Хакимдәргә [[MediaWiki:Titleblacklist|ҡара]] һәм [[MediaWiki:Titlewhitelist|аҡ]] исемлек ярҙамында биттәрҙе һәм иҫәп яҙмаларын булдырыуҙы тыйырға мөмкинлек бирә.',
 	'titleblacklist' => '# Был — тыйылған исемдәр исемлеге. Күһәтелгән регуляр аңлатмаларға тап килгән биттәр һәм иҫәп яҙмалары булдырыла алмай.
 # Иҫкәрмәләр өсөн "#" ҡулланығыҙ.
 # Ғәҙәттә ҙур/бәләкәй хәрефкә һиҙгер түгел',
@@ -250,6 +251,30 @@ $messages['bcc'] = array(
 	'right-tboverride' => 'لیست سیاه عنوان لغو کن', # Fuzzy
 );
 
+/** Bikol Central (Bikol Central)
+ * @author Geopoet
+ */
+$messages['bcl'] = array(
+	'titleblacklist-desc' => 'Minatugot sa mga administrador na magbawal sa pagmumukna nin mga pahina asin mga panindog nin paragamit sa kada [[MediaWiki:Titleblacklist|pinagbarahang listahan]] and [[MediaWiki:Titlewhitelist|pinagtugutang listahan]]',
+	'titleblacklist' => '#Ini sarong pinagbarahang listahan kan titulo. Mga titulo asin mga paragamit na minatampad nin sarong regular na ekspresyon digde dae puwedeng maipagmukna.
+#Gamiton an "#" para sa mga komento.
+#Ini bakong sensitibo sa pindutan bilang panugmad',
+	'titlewhitelist' => '#Ini sarong pinagtutugutang listahan kan titulo. Gamiton an "#" para sa mga komento.
+#Ini bakong sensitibo sa pindutan bilang panugmad',
+	'titleblacklist-forbidden-edit' => 'An titulong "$2" pinagbabawalan sa makapagmukna.
+Ini minatampad sa minasunod na entrada kan pinagbarahang listahan: <code>$1</code>',
+	'titleblacklist-forbidden-move' => 'An "$2" dae tabi maibabalyo sa "$3", nin huli ta an titulo "$3" pinagbabawalan sa makapagmukna.
+Ini minatampad sa minasunod na entrada kan pinagbarahang listahan:<code>$1</code>',
+	'titleblacklist-forbidden-upload' => 'An pangaran nin sagunson na "$2" pinagbabawalan na makapagmukna.
+Ini minatampad sa minasunod na entrada kan pinagbarahang listahan:<code>$1</code>',
+	'titleblacklist-forbidden-new-account' => 'An pangaran nin paragamit na "$2" pinagbabawalan na makapagmukna.
+Ini minatampad sa minasunod na entrada kan pinagbarahang listahan:<code>$1</code>',
+	'titleblacklist-invalid' => 'An minasunod na {{PLURAL:$1|linya|mga linya}} na yaon sa pinagbarahang listahan kan titulo {{PLURAL:$1|iyo an|iyo an mga}} imbalido; pakikoriher tabi {{PLURAL:$1|ini|sinda}} bago pa man ipagtagama:',
+	'titleblacklist-override' => 'Pabayae an pinagbarahang listahan',
+	'right-tboverride' => 'Salambawan an titulo o pinagbabawal na listahan kan pangaran nin paragamit',
+	'right-tboverride-account' => 'Salambawan an pinagbarahang listahan kan pangaran nin paragamit',
+);
+
 /** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  * @author EugeneZelenko
  * @author Jim-by
@@ -379,6 +404,7 @@ molimo da {{PLURAL:$1|ga|ih}} ispravite prije spremanja:',
  * @author Aleator
  * @author El libre
  * @author Jordi Roqué
+ * @author Papapep
  * @author Pitort
  * @author SMP
  * @author Vriullop
@@ -392,7 +418,7 @@ $messages['ca'] = array(
 # Per defecte, no distingeix majúscules de minúscules',
 	'titleblacklist-forbidden-edit' => 'El títol «$2» està prohibit i no es pot crear. Concorda amb la següent entrada de la llista negra: <code>$1</code>',
 	'titleblacklist-forbidden-move' => "No es pot moure «$2» a «$3», perquè el títol «$3» està prohibit. Concorda amb l'entrada de la llista negra següent: <code>$1</code>",
-	'titleblacklist-forbidden-upload' => "El nom de fitxer «$2» ha estat prohibit i se n'impedeix la creació. Concorda amb la següent línia de la llista negra: <code>$1</code>",
+	'titleblacklist-forbidden-upload' => "S'ha prohibit el nom de fitxer «$2» i se n'impedeix la creació. Concorda amb la següent línia de la llista negra: <code>$1</code>",
 	'titleblacklist-forbidden-new-account' => "No es pot crear el nom d'usuari «$2». Coincideix amb la següent entrada de la llista negra: <code>$1</code>",
 	'titleblacklist-invalid' => '{{PLURAL:$1|La línia següent|Les línies següents}} de la llista negra no {{PLURAL:$1|és vàlida|són vàlides}}; heu de corregir-{{PLURAL:$1|la|les}} abans de guardar:',
 	'titleblacklist-override' => 'Ignora la llista negra',
@@ -400,11 +426,20 @@ $messages['ca'] = array(
 	'right-tboverride-account' => "Ignorar la llista negra de noms d'usuari",
 );
 
+/** Chechen (нохчийн)
+ * @author Умар
+ */
+$messages['ce'] = array(
+	'right-tboverride' => 'Ӏаьржачу могӀанийн чура агӀонийн цӀераш тергалцаяр я декъашхой тергалцабар',
+	'right-tboverride-account' => 'Ӏаьржачу могӀанийн чура декъашхойн цӀераш тергалцаяр',
+);
+
 /** Sorani Kurdish (کوردی)
  * @author Calak
  */
 $messages['ckb'] = array(
 	'titleblacklist-override' => 'پێرستی ڕەش لەبەر چاو مەگرە',
+	'right-tboverride' => 'تێپەڕاندنی تاوتوێی پێرستی ڕەشی سەردێڕ یان ناوی بەکارھێنەری',
 );
 
 /** Czech (česky)
@@ -473,6 +508,7 @@ Det svarer til følgende sortlistepost: <code>$1</code>',
  * @author Metalhead64
  * @author Raimond Spekking
  * @author The Evil IP address
+ * @author Umherirrender
  */
 $messages['de'] = array(
 	'titleblacklist-desc' => 'Ermöglicht es Administratoren die Erstellung unerwünschter Seiten- und Benutzernamen zu unterbinden: [[MediaWiki:Titleblacklist]] und [[MediaWiki:Titlewhitelist]]',
@@ -484,7 +520,7 @@ $messages['de'] = array(
 	'titleblacklist-forbidden-edit' => "'''Eine Seite mit dem Titel „$2“ kann nicht erstellt werden.'''<br />Der Titel kollidiert mit diesem Sperrbegriff: '''''$1'''''",
 	'titleblacklist-forbidden-move' => "'''Die Seite „$2“ kann nicht nach „$3“ verschoben werden.'''<br />Der Titel kollidiert mit diesem Sperrbegriff: '''''$1'''''",
 	'titleblacklist-forbidden-upload' => "'''Eine Datei mit dem Namen „$2“ kann nicht hochgeladen werden.'''<br />Der Titel kollidiert mit diesem Sperrbegriff: '''''$1'''''",
-	'titleblacklist-forbidden-new-account' => 'Die Registrierung des Benutzernames „$2“ ist nicht erwünscht.
+	'titleblacklist-forbidden-new-account' => 'Die Registrierung des Benutzernamens „$2“ ist nicht erwünscht.
 Folgender Eintrag aus der Liste unerwünschter Benutzernamen führte zur Ablehnung: <code>$1</code>',
 	'titleblacklist-invalid' => 'Die {{PLURAL:$1|folgende Zeile|folgenden Zeilen}} in der Sperrliste {{PLURAL:$1|ist|sind}} ungültig; bitte korrigiere diese vor dem Speichern:',
 	'titleblacklist-override' => 'Schwarze Liste ignorieren',
@@ -522,6 +558,7 @@ $messages['de-formal'] = array(
 /** Zazaki (Zazaki)
  * @author Aspar
  * @author Erdemaslancan
+ * @author Marmase
  */
 $messages['diq'] = array(
 	'titleblacklist-desc' => 'serkaran re desturê vıraştışê pel u hesabê karberan dano, qey qedexekerdışi re yew [[MediaWiki:Titleblacklist|listeya risiyayan]] u [[MediaWiki:Titlewhitelist|listeya risıpiyan]] dano.',
@@ -538,8 +575,8 @@ malumatê ey na listeyasiya de zepê ya: <code>$1</code>',
 malumatê ey na listeyasiya de zêpê ya: <code>$1</code>',
 	'titleblacklist-forbidden-new-account' => 'vıraştışê nameyê karberê"$2" i qedexe bı.
 malumatê ey na listeyasiya de zêpê ya: <code>$1</code>',
-	'titleblacklist-invalid' => 'nê {{PLURAL:$1|satır o ke|satır ê ke}} listeyasiyayi de qedexe yê;
-kerem kerê verqeydkerdışi de raşt kerê:',
+	'titleblacklist-invalid' => 'Na  ğırab lista dı {{PLURAL:$1|en asatır|ené satıri}}  néravérené;
+Verdé qeyd kerdışi  timar keré:',
 	'titleblacklist-override' => 'Tenilisti mehesebne',
 	'right-tboverride' => 'Siya listeya sernuşti nêravêrde ke',
 	'right-tboverride-account' => 'Tenilisteya naman dê karberan mehesebnê',
@@ -676,6 +713,7 @@ Palun paranda {{PLURAL:$1|see|need}} enne salvestamist:',
 );
 
 /** Persian (فارسی)
+ * @author Dalba
  * @author Ebraminio
  * @author Huji
  * @author Ladsgroup
@@ -689,14 +727,14 @@ $messages['fa'] = array(
 # از «#» برای توضیحات استفاده کنید.
 # به‌طور پیش‌فرض به بزرگ و کوچکی حروف حساس نیست.',
 	'titlewhitelist' => '# این یک فهرست سفید برای عنوان‌ها است. از «#» برای افزودن توضیحات استفاده کنید.
-#این فهرست به بزرگی و کوچکی به طرو پیش‌فرض حساس نیست',
+#این فهرست به طور پیش‌فرض به بزرگی و کوچکی حساس نیست',
 	'titleblacklist-forbidden-edit' => 'ایجاد عنوان «$2» ممنوع شده‌است. این عنوان با این دستور از فهرست سیاه مطابقت می‌کند: <code>$1</code>',
 	'titleblacklist-forbidden-move' => '«$2» را نمی‌توان به «$3» انتقال داد. ایجاد «$3» ممنوع است. چون با این دستور از فهرست سیاه مطابقت می‌کند: <code>$1</code>',
 	'titleblacklist-forbidden-upload' => 'ایجاد نام «$2» برای پرونده‌ها ممنوع است، زیرا با این دستور از فهرست سیاه مطابقت می‌کند: <code>$1</code>',
 	'titleblacklist-forbidden-new-account' => 'حساب کاربری «$2» در برابر ایجاد محافظت شده‌است.
 این نام کاربری با این قسمت از فهرست سیاه مطابقت دارد: <code>$1</code>',
 	'titleblacklist-invalid' => '
-{{PLURAL:$1|سطر|سطرهای}} زیر در فهرست سیاه عنوان‌ها غیرمجاز {{PLURAL:$1|است|هستند}}؛ لطفاً {{PLURAL:$1|آن|آن‌ها}} را قبل از ذخیره کردن اصلاح کنید:',
+{{PLURAL:$1|سطر|سطرهای}} زیر در فهرست سیاه عنوان‌ها نامجاز {{PLURAL:$1|است|هستند}}؛ لطفاً {{PLURAL:$1|آن|آن‌ها}} را قبل از ذخیره‌کردن اصلاح کنید:',
 	'titleblacklist-override' => 'از فهرست سیاه چشم‌پوشی کن',
 	'right-tboverride' => 'نادیده گرفتن لیست سیاه عنوان یا نام کاربری',
 	'right-tboverride-account' => 'لغو فهرست سیاه نام کاربری',
@@ -1084,7 +1122,7 @@ Naipada ti sumaganad a blacklist a naikabil: <code>$1</code>',
 	'titleblacklist-invalid' => 'Ti sumaganad a {{PLURAL:$1|linia|dagiti linia}} iti titulo ti blacklist {{PLURAL:$1|ket|ket}} imbalido;
 pangngaasi ta pasayaaten {{PLURAL:$1|ida|dagida}} sakbay nga idulin:',
 	'titleblacklist-override' => 'Saan nga ikaskaso ti blacklist',
-	'right-tboverride' => 'Ipatuon ti titulo a blacklist', # Fuzzy
+	'right-tboverride' => 'Patuonan ti titulo wenno madi a listaan ti nagan ti agar-aramat',
 	'right-tboverride-account' => 'Ipatuon ti nagan ti agar-aramat a blacklist',
 );
 
@@ -1115,13 +1153,14 @@ Hann passar við eftirfarandi færslu í bannlistanum: <code>$1</code>',
  * @author BrokenArrow
  * @author Darth Kule
  * @author Melos
+ * @author Nemo bis
  */
 $messages['it'] = array(
-	'titleblacklist-desc' => 'Consente di proibire la creazione di pagine e account utente con i titoli indicati in una [[MediaWiki:Titleblacklist|blacklist]] e una [[MediaWiki:Titlewhitelist|whitelist]]',
-	'titleblacklist' => '# Lista dei titoli non consentiti.
-# È impedita la creazione delle pagine e degli account il cui nome corrisponde a un\'espressione regolare indicata di seguito.
+	'titleblacklist-desc' => 'Consente di proibire la creazione di pagine e utenze con i titoli indicati in una [[MediaWiki:Titleblacklist|blacklist]] e una [[MediaWiki:Titlewhitelist|whitelist]]',
+	'titleblacklist' => '# Lista di titoli non consentiti.
+# È impedita la creazione di pagine e utenze il cui nome corrisponda a un\'espressione regolare indicata di seguito.
 # Usare "#" per le righe di commento.
-# Per default la differenza tra maiuscole e minuscole non è significativa',
+# Per default la differenza tra maiuscole e minuscole non è significativa.',
 	'titlewhitelist' => '# Questa è una whitelist dei titoli. Usare "#" per le righe di commento
 # Per default la differenza tra maiuscole e minuscole non è significativa',
 	'titleblacklist-forbidden-edit' => 'La creazione di pagine con titolo "$2" è stata impedita. La voce corrispondente nell\'elenco dei titoli non consentiti è la seguente: <code>$1</code>',
@@ -1272,13 +1311,12 @@ Mändemeler üşin «#» nışanın qoldanıñız.', # Fuzzy
  * @author 아라
  */
 $messages['ko'] = array(
-	'titleblacklist-desc' => '[[MediaWiki:Titleblacklist]], [[MediaWiki:Titlewhitelist]]를 통해서 특정 제목의 문서 만들기를 막는 기능',
-	'titleblacklist' => ' # 문서 이름 금지 목록을 적는 곳입니다. 정규 표현식과 일치하는 문서나 사용자 이름은 만들기가 제한됩니다.
- # 규칙이 아닌 주석 내용에는 앞에 "#"을 붙여 주세요.
- # 기본적으로 규칙은 대소문자를 구별하지 않습니다.',
-	'titlewhitelist' => ' # 만들기 허용 규칙을 적는 곳입니다. 만들기 금지 규칙에 포함되는 문서의 경우, 이 곳의 규칙에도 포함될 경우 만들기가 가능해집니다.
- # 규칙이 아닌 주석 내용에는 앞에 "#"을 붙여 주세요.
- # 기본적으로 규칙은 대소문자를 구별하지 않습니다.',
+	'titleblacklist-desc' => '관리자가 [[MediaWiki:Titleblacklist]], [[MediaWiki:Titlewhitelist]]마다 문서와 사용자 계정을 만드는 것을 금지할 수 있습니다',
+	'titleblacklist' => '# 제목 금지 목록입니다. 정규 표현식과 일치하는 제목나 사용자는 만들 수 없습니다.
+# 주석 내용에는 앞에 "#"을 붙여 주세요.
+# 기본적으로 규칙은 대소문자를 구별하지 않습니다',
+	'titlewhitelist' => '# 제목 허용 목록입니다. 주석 내용에는 앞에 "#"을 붙여 주세요.
+# 기본적으로 규칙은 대소문자를 구별하지 않습니다',
 	'titleblacklist-forbidden-edit' => '"$2" 문서는 만들기 금지 목록에 포함되어 있습니다.
 해당 만들기 금지 조건은 <code>$1</code>입니다.',
 	'titleblacklist-forbidden-move' => '"$2" 문서를 "$3" 제목으로 옮길 수 없습니다. 문서 만들기 금지 조건이 걸려 있습니다.
@@ -1287,8 +1325,8 @@ $messages['ko'] = array(
 파일 이름이 다음의 규칙에 해당됩니다: <code>$1</code>',
 	'titleblacklist-forbidden-new-account' => '"$2" 이름으로 계정을 만드는 것이 제한되어 있습니다.
 계정 이름이 다음의 규칙에 해당됩니다: <code>$1</code>',
-	'titleblacklist-invalid' => '제목 블랙리스트 목록에 잘못된 구문이 있습니다.
-저장하기 전에 올바르게 수정해주세요.',
+	'titleblacklist-invalid' => '제목 블랙리스트의 다음 {{PLURAL:$1|줄}}에 잘못된 구문이 {{PLURAL:$1|있습니다}}.
+저장하기 전에 {{PLURAL:$1}}올바르게 수정해주세요:',
 	'titleblacklist-override' => '블랙리스트를 무시',
 	'right-tboverride' => '문서 제목이나 사용자 이름 블랙리스트 무시',
 	'right-tboverride-account' => '사용자 이름 블랙리스트를 무시',
@@ -1338,14 +1376,15 @@ Hic titulus congruit cum expressione regulari: <code>$1</code>',
 
 /** Luxembourgish (Lëtzebuergesch)
  * @author Robby
+ * @author Soued031
  */
 $messages['lb'] = array(
 	'titleblacklist-desc' => "Erlaabt den Administrateuren et d'Uleeë vu Säiten a Benotzerkonte mat spezifeschen Titelen iwwer eng [[MediaWiki:Titleblacklist|schwaarz Lëscht]] an eng [[MediaWiki:Titlewhitelist|wäiss Lëscht]] ze verbidden",
 	'titleblacklist' => '# Dëst ass een Titel deen op enger schwaarzer Lëscht steet. Titelen a Benotzernimm op déi dës Ausdréck passe kann net ugeluecht ginn
 # Benotzt "#" fir Bemierkungen
-# Et gëtt tëschent groussen a klenge Buchstawen ënnerscheed',
+# Et gëtt tëscht groussen a klenge Buchstawen ënnerscheet',
 	'titlewhitelist' => "# Dëst ass d'''Whitelist'' vun den Titelen. Benotzt \"#\" fir Bemierkungen.
-# Et gëtt een Ënnerscheed tëschent groussen a klenge Buchstawe gemaach",
+# Et gëtt een Ënnerscheed tëscht groussen a klenge Buchstawe gemaach",
 	'titleblacklist-forbidden-edit' => 'Den Titel "$2" dàerf net ugeluecht ginn.
 En ass op der schwaarzer Lëscht wéint folgendem Begrëff: <code>$1</code>',
 	'titleblacklist-forbidden-move' => '"$2" kann net op "$3" geréckelt ginn, well den Titel "$3" net däerf ugeluecht ginn.
@@ -1353,7 +1392,7 @@ En entsprécht dëser Rubrik vun der schwaarzr Lëscht: <code>$1</code>',
 	'titleblacklist-forbidden-upload' => 'De Fichiersnumm "$2" kann net benotzt ginn.
 Hien ass identesch mat dësem Numm vun der schwaarzer Lëscht (black list): <code>$1</code>',
 	'titleblacklist-forbidden-new-account' => 'De Benotzermumm "$2" gouf gespaart fir benotzt ze ginn.
-En ass esou op der \'\'schwaarzer Lëscht\'\': <code>$1</code>',
+En ass sou op der \'\'schwaarzer Lëscht\'\': <code>$1</code>',
 	'titleblacklist-invalid' => 'Dës {{PLURAL:$1|Linn|Linnen}} op der schwaarzer Lëscht vun den {{PLURAL:$1|Titelen ass|Titele sinn}} net valabel;
 verbessert se virum späicheren:',
 	'titleblacklist-override' => 'Schwaarz Lëscht ignoréieren',
@@ -1462,9 +1501,10 @@ $messages['ml'] = array(
  * @author Kaustubh
  * @author Mahitgar
  * @author Rahuldeshmukh101
+ * @author V.narsikar
  */
 $messages['mr'] = array(
-	'titleblacklist-desc' => '[[MediaWiki:Titleblacklist|ब्लॅकलीस्ट]] व [[MediaWiki:Titlewhitelist|व्हाईट लीस्ट]] ला अनुसरून पाने आणि सदस्य खात्यांना प्रतिबंधतीअ करण्याची प्रचालकांना परवानगी द्या',
+	'titleblacklist-desc' => '[[MediaWiki:Titleblacklist|ब्लॅकलीस्ट]] व [[MediaWiki:Titlewhitelist|व्हाईट लीस्ट]] ला अनुसरून पाने आणि सदस्य खात्यांना प्रतिबंधित करण्याची प्रचालकांना परवानगी द्या',
 	'titleblacklist' => '# ही ब्लॉक केलेल्या शीर्षकांची यादी आहे. या यादीत असलेल्या शीर्षकांचे लेख लिहिता येणार नाहीत.
 # शेरा देण्यासाठी "#" वापरा.',
 	'titlewhitelist' => '# ही वापरू शकत असलेल्या शीर्षकांची यादी आहे. शेरा देण्यासाठी "#" वापरा',
@@ -1526,7 +1566,7 @@ $messages['nah'] = array(
 #Inīn ahmo quimati in huēyimachiyōtlahtōliztli intlā ahmo mopehpena',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Danmichaelo
  * @author Nghtwlkr
  * @author Reedy
@@ -1593,7 +1633,7 @@ Verbeter die {{PLURAL:$1|regel|regels}} voordat u de lijst opslaat:',
 	'right-tboverride-account' => 'Zwarte lijst voor gebruikersnamen negeren',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Frokor
  * @author Harald Khan
  * @author Njardarlogar
@@ -1630,10 +1670,10 @@ $messages['oc'] = array(
 	'titleblacklist-forbidden-new-account' => 'Lo nom d’utilizaire « $2 » es estat interdich a la creacion.
 Correspond a l’entrada seguenta de la lista negra : <code>$1</code>',
 	'titleblacklist-invalid' => '{{PLURAL:$1|La linha seguenta|Las linhas seguentas}} dins la lista negra dels títols {{PLURAL:$1|es invalida|son invalidas}} : sètz convidat a {{PLURAL:$1|la|las}} corregir abans de salvar.',
-	'right-tboverride' => 'Ignorar la lista negra dels títols', # Fuzzy
+	'right-tboverride' => "Remplaçar la lista negra dels títols o dels noms d'utilizaires",
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Jnanaranjan Sahu
  * @author Psubhashish
  */
@@ -1740,10 +1780,11 @@ $messages['pnb'] = array(
  * @author Ahmed-Najib-Biabani-Ibrahimkhel
  */
 $messages['ps'] = array(
-	'titleblacklist-override' => 'تورليک بابېزه ګڼل',
+	'titleblacklist-override' => 'تورليک بابېزه گڼل',
 );
 
 /** Portuguese (português)
+ * @author Cainamarques
  * @author Hamilton Abreu
  * @author Malafaya
  * @author Waldir
@@ -1766,31 +1807,37 @@ O nome corresponde à seguinte entrada da lista negra: <code>$1</code>',
 O nome corresponde à seguinte entrada da lista negra: <code>$1</code>',
 	'titleblacklist-invalid' => '{{PLURAL:$1|A seguinte linha|As seguintes linhas}} da lista negra {{PLURAL:$1|é inválida|são inválidas}}. Por favor, {{PLURAL:$1|corrija-a|corrija-as}} antes de gravar:',
 	'titleblacklist-override' => 'Ignorar a lista negra',
-	'right-tboverride' => 'Ignorar a lista negra de títulos', # Fuzzy
+	'right-tboverride' => 'Sobrepor a lista negra de títulos e nomes de utilizador',
 	'right-tboverride-account' => 'Ignorar a lista negra de nomes de utilizador',
 );
 
 /** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
  * @author Eduardo.mps
  * @author Giro720
  * @author Luckas
+ * @author 555
  */
 $messages['pt-br'] = array(
-	'titleblacklist-desc' => 'Permite a proibição da criação de páginas e contas de utilizadores com títulos específicos através de uma [[MediaWiki:Titleblacklist|lista negra]] e uma [[MediaWiki:Titlewhitelist|lista de exceções]]',
+	'titleblacklist-desc' => 'Permite que administradores restrinjam a criação de páginas e contas de usuários a partir de uma [[MediaWiki:Titleblacklist|lista negra]] e uma [[MediaWiki:Titlewhitelist|lista de exceções]]',
 	'titleblacklist' => '# Esta é uma lista negra de títulos. Títulos de páginas e nomes de usuários que sejam filtrados por uma expressão regular desta lista não poderão ser criados.
 # Utilize "#" para fazer comentários.
-# Esta lista não é sensível á capitalização por padrão',
-	'titlewhitelist' => '# Esta é uma lista branca de títulos. Utilize "#" para fazer comentários
-# Esta lista não é sensível a capitalização por padrão',
-	'titleblacklist-forbidden-edit' => 'O título "$2" foi impedido de ser criado. Ele se encaixa na seguinte entrada da lista negra: <code>$1</code>',
-	'titleblacklist-forbidden-move' => '"$2" não pode ser movida para "$3" já que "$3" é um título impedido de ser criado. Se encaixa na seguinte entrada da lista-negra: <code>$1</code>',
-	'titleblacklist-forbidden-upload' => 'O arquivo "$2" foi impedido de ser criado. Ele se encaixa na seguinte entrada da lista negra: <code>$1</code>',
-	'titleblacklist-forbidden-new-account' => 'O nome de usuário "$2" foi banido da criação de usuários.
-O nome corresponde à seguinte entrada na lista negra: <code>$1</code>',
-	'titleblacklist-invalid' => '{{PLURAL:$1|A seguinte linha|As seguintes linhas}} da lista negra {{PLURAL:$1|é inválida|são inválidas}}. Por gentileza, {{PLURAL:$1|corrija-a|corrija-as}} antes de salvar:',
+# Esta lista não difere maiúsculas de minúsculas',
+	'titlewhitelist' => '# Esta é uma lista de títulos permitidos. Utilize "#" para fazer comentários
+# Esta lista não difere maiúsculas de minúsculas',
+	'titleblacklist-forbidden-edit' => 'O título "$2" foi impedido de ser criado.
+Ele se encaixa na seguinte entrada da lista negra: <code>$1</code>',
+	'titleblacklist-forbidden-move' => '"$2" não pode ser movida para "$3", já que "$3" é um título impedido de ser criado.
+Se encaixa na seguinte entrada da lista-negra: <code>$1</code>',
+	'titleblacklist-forbidden-upload' => 'O arquivo nomeado como "$2" foi impedido de ser criado.
+Ele se encaixa na seguinte entrada da lista negra: <code>$1</code>',
+	'titleblacklist-forbidden-new-account' => 'O nome de usuário "$2" foi banido de ser registrado.
+O nome corresponde na seguinte entrada da lista negra: <code>$1</code>',
+	'titleblacklist-invalid' => '{{PLURAL:$1|A seguinte linha|As seguintes linhas}} da lista negra {{PLURAL:$1|é inválida|são inválidas}}. 
+{{PLURAL:$1|Corrija-a|Corrija-as}} antes de salvar:',
 	'titleblacklist-override' => 'Ignorar a lista negra.',
-	'right-tboverride' => 'Sobrepor a lista negra de títulos', # Fuzzy
-	'right-tboverride-account' => 'Sobrepor a lista negra de nomes de usuários',
+	'right-tboverride' => 'Contornar a lista negra de títulos e nomes de usuário',
+	'right-tboverride-account' => 'Contornar a lista negra de nomes de usuários',
 );
 
 /** Quechua (Runa Simi)
@@ -2418,7 +2465,7 @@ $messages['zh-hans'] = array(
 # 本页默认不区分大小写',
 	'titleblacklist-forbidden-edit' => '标题 "$2" 已经被禁止创建。它跟以下黑名单的项目配合: <code>$1</code>',
 	'titleblacklist-forbidden-move' => '"$2" 不可以移动到 "$3"，由于该标题 "$3" 已经被禁止创建。它跟以下黑名单的项目配合: <code>$1</code>',
-	'titleblacklist-forbidden-upload' => '文件名称 "$2" 已经被禁止创建。它跟以下黑名单的项目配合: <code>$1</code>',
+	'titleblacklist-forbidden-upload' => '文件名称“$2”已经被禁止创建。它跟以下黑名单的项目配合：<code>$1</code>',
 	'titleblacklist-forbidden-new-account' => '用户名“$2”已被阻止创建。
 它匹配以下黑名单项目：<code>$1</code>',
 	'titleblacklist-invalid' => '以下在标题黑名单上的{{PLURAL:$1|一行|多行}}无效；请在保存前改正{{PLURAL:$1|它|它们}}:',
diff --git a/extensions/TitleBlacklist/TitleBlacklist.list.php b/extensions/TitleBlacklist/TitleBlacklist.list.php
index d197a9c5..cec4dd89 100644
--- a/extensions/TitleBlacklist/TitleBlacklist.list.php
+++ b/extensions/TitleBlacklist/TitleBlacklist.list.php
@@ -175,7 +175,7 @@ class TitleBlacklist {
 		}
 		$blacklist = $this->getBlacklist();
 		foreach ( $blacklist as $item ) {
-			if ( $item->matches( $title, $action ) ) {
+			if ( $item->matches( $title->getFullText(), $action ) ) {
 				if ( $this->isWhitelisted( $title, $action ) ) {
 					return false;
 				}
@@ -199,7 +199,7 @@ class TitleBlacklist {
 		}
 		$whitelist = $this->getWhitelist();
 		foreach ( $whitelist as $item ) {
-			if ( $item->matches( $title, $action ) ) {
+			if ( $item->matches( $title->getFullText(), $action ) ) {
 				return true;
 			}
 		}
@@ -343,7 +343,7 @@ class TitleBlacklistEntry {
 	 * Check whether a user can perform the specified action
 	 * on the specified Title
 	 *
-	 * @param $title Title to check
+	 * @param $title string to check
 	 * @param $action %Action to check
 	 * @return bool TRUE if the the regex matches the title, and is not overridden
 	 * else false if it doesn't match (or was overridden)
@@ -357,8 +357,17 @@ class TitleBlacklistEntry {
 			return false;
 		}
 
+		if ( isset( $this->mParams['antispoof'] ) && is_callable( 'AntiSpoof::checkUnicodeString' ) ) {
+			list( $ok, $norm ) = AntiSpoof::checkUnicodeString( $title );
+			if ( $ok == "OK" ) {
+				list( $ver, $title ) = explode( ':', $norm, 2 );
+			} else {
+				wfDebugLog( 'TitleBlacklist', 'AntiSpoof could not normalize "' . $title . '".' );
+			}
+		}
+
 		wfSuppressWarnings();
-		$match = preg_match( "/^(?:{$this->mRegex})$/us" . ( isset( $this->mParams['casesensitive'] ) ? '' : 'i' ), $title->getFullText() );
+		$match = preg_match( "/^(?:{$this->mRegex})$/us" . ( isset( $this->mParams['casesensitive'] ) ? '' : 'i' ), $title );
 		wfRestoreWarnings();
 
 		global $wgUser;
@@ -427,6 +436,9 @@ class TitleBlacklistEntry {
 			if ( preg_match( '/errmsg\s*=\s*(.+)/i', $opt, $matches ) ) {
 				$options['errmsg'] = $matches[1];
 			}
+			if ( $opt2 == 'antispoof' ) {
+				$options['antispoof'] = true;
+			}
 		}
 		// Process magic words
 		preg_match_all( '/{{\s*([a-z]+)\s*:\s*(.+?)\s*}}/', $regex, $magicwords, PREG_SET_ORDER );
diff --git a/extensions/TitleBlacklist/TitleBlacklist.php b/extensions/TitleBlacklist/TitleBlacklist.php
index 68fb6778..2bb62b0a 100644
--- a/extensions/TitleBlacklist/TitleBlacklist.php
+++ b/extensions/TitleBlacklist/TitleBlacklist.php
@@ -76,6 +76,10 @@ $wgHooks['CentralAuthAutoCreate'][] = 'TitleBlacklistHooks::centralAuthAutoCreat
 $wgHooks['EditFilter'][] = 'TitleBlacklistHooks::validateBlacklist';
 $wgHooks['ArticleSaveComplete'][] = 'TitleBlacklistHooks::clearBlacklist';
 $wgHooks['UserCreateForm'][] = 'TitleBlacklistHooks::addOverrideCheckbox';
+$wgHooks['UnitTestsList'][] = function( &$files ) {
+	$files += glob( __DIR__ . '/tests/*Test.php' );
+	return true;
+};
 
 $wgResourceModules['mediawiki.api.titleblacklist'] = array(
 	'scripts' => 'mediawiki.api.titleblacklist.js',
diff --git a/extensions/TitleBlacklist/tests/ApiQueryTitleBlacklistTest.php b/extensions/TitleBlacklist/tests/ApiQueryTitleBlacklistTest.php
index 1f8164e7..344e9996 100644
--- a/extensions/TitleBlacklist/tests/ApiQueryTitleBlacklistTest.php
+++ b/extensions/TitleBlacklist/tests/ApiQueryTitleBlacklistTest.php
@@ -105,6 +105,28 @@ class ApiQueryTitleBlacklistTest extends ApiTestCase {
 			$listed[0]['titleblacklist']['line'],
 			'Correct blacklist line is returned'
 		);
+	}
+
+	/**
+	 * Tests integration with the AntiSpoof extension
+	 */
+	function testAntiSpoofIntegration() {
+		if ( !class_exists( 'AntiSpoof') ) {
+			$this->markTestSkipped( "This test requires the AntiSpoof extension" );
+		}
+
+		$listed = $this->doApiRequest( array(
+			'action' => 'titleblacklist',
+			'tbtitle' => 'AVVVV',
+			'tbaction' => 'create',
+			'tbnooverride' => true,
+		) );
+
+		$this->assertEquals(
+			'blacklisted',
+			$listed[0]['titleblacklist']['result'],
+			'Spoofed title is blacklisted'
+		);
 
 	}
 }
diff --git a/extensions/TitleBlacklist/tests/testSource b/extensions/TitleBlacklist/tests/testSource
index f73d9dd7..235cc671 100644
--- a/extensions/TitleBlacklist/tests/testSource
+++ b/extensions/TitleBlacklist/tests/testSource
@@ -2,3 +2,4 @@
 .*[Ff]ail.*
 .*[Nn]yancat.* <errmsg=blacklisted-nyancat>
 .*evil_acc.* <newaccountonly>
+AW{1,10} <antispoof>
diff --git a/extensions/Vector/.gitreview b/extensions/Vector/.gitreview
deleted file mode 100644
index 8d06d24a..00000000
--- a/extensions/Vector/.gitreview
+++ /dev/null
@@ -1,5 +0,0 @@
-[gerrit]
-host=gerrit.wikimedia.org
-port=29418
-project=mediawiki/extensions/Vector.git
-defaultbranch=master
diff --git a/extensions/Vector/README b/extensions/Vector/README
deleted file mode 100644
index b7737a5b..00000000
--- a/extensions/Vector/README
+++ /dev/null
@@ -1,17 +0,0 @@
-# Vector provides enhancements to the Vector skin
-
-# This extension requires MediaWiki 1.17+ because it makes use of ResourceLoader.
-
-# Example LocalSettings.php additions
-
-require_once( "$IP/extensions/Vector/Vector.php" );
-
-# Before configuring this extension, see Vector.php and become familiar with the initial state and structure of the
-# $wgVectorFeatures configuration variable. Essentially it's an array of arrays, keyed by feature name, each containing
-# global and user keys with boolean values. "global" indicates that it should be turned on for everyone always, while
-# user indicates that users should be allowed to turn it on or off in their user preferences.
-
-# To enable a preference by default but still allow users to disable it in preferences, use something like...
-
-$wgDefaultUserOptions['vector-collapsiblenav'] = 1;
-
diff --git a/extensions/Vector/Vector.hooks.php b/extensions/Vector/Vector.hooks.php
deleted file mode 100644
index 50cec461..00000000
--- a/extensions/Vector/Vector.hooks.php
+++ /dev/null
@@ -1,174 +0,0 @@
-<?php
-/**
- * Hooks for Vector extension
- * 
- * @file
- * @ingroup Extensions
- */
-
-class VectorHooks {
-	
-	/* Protected Static Members */
-	
-	protected static $features = array(
-		'collapsiblenav' => array(
-			'preferences' => array(
-				'vector-collapsiblenav' => array(
-					'type' => 'toggle',
-					'label-message' => 'vector-collapsiblenav-preference',
-					'section' => 'rendering/advancedrendering',
-				),
-			),
-			'requirements' => array(
-				'vector-collapsiblenav' => true,
-			),
-			'configurations' => array(
-				'wgCollapsibleNavBucketTest',
-				'wgCollapsibleNavForceNewVersion',
-			),
-			'modules' => array( 'ext.vector.collapsibleNav' ),
-		),
-		'collapsibletabs' => array(
-			'modules' => array( 'ext.vector.collapsibleTabs' ),
-		),
-		'expandablesearch' => array(
-			'requirements' => array( 'vector-simplesearch' => true ),
-			'modules' => array( 'ext.vector.expandableSearch' ),
-		),
-		'footercleanup' => array(
-			'modules' => array( 'ext.vector.footerCleanup' ),
-		),
-		'sectioneditlinks' => array(
-			'modules' => array( 'ext.vector.sectionEditLinks' ),
-			'configurations' => array(
-				'wgVectorSectionEditLinksBucketTest',
-				'wgVectorSectionEditLinksLotteryOdds',
-				'wgVectorSectionEditLinksExperiment',
-			),
-			'requirements' => array(
-				'vector-noexperiments' => false,
-			),
-		),
-		'experiments' => array(
-			'preferences' => array(
-				'vector-noexperiments' => array(
-					'type' => 'toggle',
-					'label-message' => 'vector-noexperiments-preference',
-					'section' => 'rendering/advancedrendering',
-				),
-			),
-		),
-	);
-	
-	/* Protected Static Methods */
-	
-	protected static function isEnabled( $name ) {
-		global $wgVectorFeatures, $wgUser;
-		
-		// Features with global set to true are always enabled
-		if ( !isset( $wgVectorFeatures[$name] ) || $wgVectorFeatures[$name]['global'] ) {
-			return true;
-		}
-		// Features with user preference control can have any number of preferences to be specific values to be enabled
-		if ( $wgVectorFeatures[$name]['user'] ) {
-			if ( isset( self::$features[$name]['requirements'] ) ) {
-				foreach ( self::$features[$name]['requirements'] as $requirement => $value ) {
-					// Important! We really do want fuzzy evaluation here
-					if ( $wgUser->getOption( $requirement ) != $value ) {
-						return false;
-					}
-				}
-			}
-			return true;
-		}
-		// Features controlled by $wgVectorFeatures with both global and user set to false are awlways disabled 
-		return false;
-	}
-	
-	/* Static Methods */
-	
-	/**
-	 * BeforePageDisplay hook
-	 * 
-	 * Adds the modules to the page
-	 * 
-	 * @param $out OutputPage output page
-	 * @param $skin Skin current skin
-	 */
-	public static function beforePageDisplay( $out, $skin ) {
-		if ( $skin instanceof SkinVector ) {
-			// Add modules for enabled features
-			foreach ( self::$features as $name => $feature ) {
-				if ( isset( $feature['modules'] ) && self::isEnabled( $name ) ) {
-					$out->addModules( $feature['modules'] );
-				}
-			}
-		}
-		return true;
-	}
-	
-	/**
-	 * GetPreferences hook
-	 * 
-	 * Adds Vector-releated items to the preferences
-	 * 
-	 * @param $user User current user
-	 * @param $defaultPreferences array list of default user preference controls
-	 */
-	public static function getPreferences( $user, &$defaultPreferences ) {
-		global $wgVectorFeatures;
-		
-		foreach ( self::$features as $name => $feature ) {
-			if (
-				isset( $feature['preferences'] ) &&
-				( !isset( $wgVectorFeatures[$name] ) || $wgVectorFeatures[$name]['user'] )
-			) {
-				foreach ( $feature['preferences'] as $key => $options ) {
-					$defaultPreferences[$key] = $options;
-				}
-			}
-		}
-		return true;
-	}
-	
-	/**
-	 * ResourceLoaderGetConfigVars hook
-	 * 
-	 * Adds enabled/disabled switches for Vector modules
-	 */
-	public static function resourceLoaderGetConfigVars( &$vars ) {
-		global $wgVectorFeatures;
-		
-		$configurations = array();
-		foreach ( self::$features as $name => $feature ) {
-			if (
-				isset( $feature['configurations'] ) &&
-				( !isset( $wgVectorFeatures[$name] ) || self::isEnabled( $name ) )
-			) {
-				foreach ( $feature['configurations'] as $configuration ) {
-					global $$configuration;
-					$configurations[$configuration] = $$configuration;
-				}
-			}
-		}
-		if ( count( $configurations ) ) {
-			$vars = array_merge( $vars, $configurations );
-		}
-		return true;
-	}
-
-	/**
-	 * @param $vars array
-	 * @return bool
-	 */
-	public static function makeGlobalVariablesScript( &$vars ) {
-		// Build and export old-style wgVectorEnabledModules object for back compat
-		$enabledModules = array();
-		foreach ( self::$features as $name => $feature ) {
-			$enabledModules[$name] = self::isEnabled( $name );
-		}
-		
-		$vars['wgVectorEnabledModules'] = $enabledModules;
-		return true;
-	}
-}
diff --git a/extensions/Vector/Vector.i18n.php b/extensions/Vector/Vector.i18n.php
deleted file mode 100644
index 2c4e4b41..00000000
--- a/extensions/Vector/Vector.i18n.php
+++ /dev/null
@@ -1,2467 +0,0 @@
-<?php
-/**
- * Internationalisation for Vector extension
- *
- * @file
- * @ingroup Extensions
- */
-
-$messages = array();
-
-/** English
- * @author Trevor Parscal
- */
-$messages['en'] = array(
-	'vector' => 'UI improvements for Vector',
-	'vector-desc' => 'Enhances the user interface when using the Vector skin',
-	'vector-collapsiblenav-preference' => 'Enable collapsing of items in the sidebar in Vector skin',
-	'vector-collapsiblenav-more' => 'More languages',
-	'vector-simplesearch-search' => 'Search',
-	'vector-simplesearch-containing' => 'containing...',
-	'vector-noexperiments-preference' => 'Exclude me from feature experiments',
-	'vector-footercleanup-transclusion' => 'This page contains {{PLURAL:$1|transclusion|transclusions}} of {{PLURAL:$1|one other page|$1 other pages}}.',
-	'vector-footercleanup-templates' => 'View templates on this page',
-	'vector-footercleanup-categories' => 'View hidden categories on this page',
-);
-
-/** Message documentation (Message documentation)
- * @author Fryed-peach
- * @author Lloffiwr
- * @author Nemo bis
- * @author Shirayuki
- * @author Srtxg
- * @author Umherirrender
- */
-$messages['qqq'] = array(
-	'vector' => 'UI means User Interface. Vector is the name of an interface skin.',
-	'vector-desc' => '{{desc|name=Vector|url=http://www.mediawiki.org/wiki/Extension:Vector}}',
-	'vector-collapsiblenav-preference' => 'The message refers to the sidebar, whose sections are collapsible in Vector skin (some of them collapsed by default and some no); the preference disables collapsing entirely and is among "Advanced options" in the "Appearence" section.',
-	'vector-editwarning-warning' => "{{doc-important|Do ''not'' use <nowiki>{{int:prefs-editing}}</nowiki> for \"Editing\". It is forbidden in this message, see [[mwr:68405]].}}
-
-but you can see the text of that button here: {{msg-mw|Prefs-editing}}",
-	'vector-simplesearch-search' => 'Greyed out default text in the simple search box in the Vector skin. (It disappears and lets the user enter the requested search terms when the search box receives focus.)
-
-{{Identical|Search}}',
-	'vector-simplesearch-containing' => 'Label used in the special item of the search suggestions list which gives the user an option to perform a full text search for the term.',
-	'vector-noexperiments-preference' => 'An option in [[Special:Preferences]]',
-	'vector-footercleanup-transclusion' => 'Label used in the footer while editing to display the count of how many transclusions a page contains.',
-);
-
-/** Achinese (Acèh)
- * @author Si Gam Acèh
- */
-$messages['ace'] = array(
-	'vector-simplesearch-search' => 'Mita',
-);
-
-/** Afrikaans (Afrikaans)
- * @author Adriaan
- * @author Naudefj
- * @author පසිඳු කාවින්ද
- */
-$messages['af'] = array(
-	'vector' => 'Gebruikerskoppelvlak-verbeteringe vir Vektor',
-	'vector-desc' => 'Verbeter die gebruikerskoppelvlak-elemente van die Vektor omslag (skin).', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Inklapbare navigasiespyskaart by die gebruik van Vector toelaat',
-	'vector-collapsiblenav-more' => 'Meer tale',
-	'vector-editwarning-warning' => 'As u hierdie bladsy verlaat, verloor u moontlik die wysigings wat u aangebring het.
-Indien u aangemeld is, kan u hierdie waarskuwing in die {{int:prefs-editing}}"-afdeling van u voorkeure afskakel.',
-	'vector-editwarning-preference' => "Waarsku my as ek 'n gewysigde bladsy verlaat alvorens dit gestoor is",
-	'vector-simplesearch-search' => 'Soek',
-	'vector-simplesearch-containing' => 'bevat...',
-	'vector-noexperiments-preference' => 'Verban my uit funksie eksperimente',
-);
-
-/** Gheg Albanian (Gegë)
- * @author Mdupont
- */
-$messages['aln'] = array(
-	'vector' => 'përmirësime UI për Vektor',
-	'vector-desc' => 'Në elementet përmirëson ndërfaqen e përdoruesit të lëkurës Vektor.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Aktivizo paloset la navigacion menu', # Fuzzy
-	'vector-editwarning-warning' => 'Duke e lënë këtë faqe mund të bëjë që ju të humbni ndonjë ndryshim që keni bërë. Nëse ju jeni regjistruar, ju mund ta çaktivizoni këtë paralajmërim në "Tue redaktue" seksionin e preferencave tuaja.',
-	'vector-editwarning-preference' => 'Paralajmëron mua kur unë të lë një redakto faqe me ndryshimet e para shpëtimit',
-	'vector-simplesearch-search' => 'Kërkim',
-	'vector-simplesearch-containing' => 'përmban ...',
-);
-
-/** Amharic (አማርኛ)
- * @author Codex Sinaiticus
- */
-$messages['am'] = array(
-	'vector-simplesearch-search' => 'ፈልግ',
-	'vector-simplesearch-containing' => 'በመጣጥፎች ይዘት ለመፈልግ...',
-);
-
-/** Aragonese (aragonés)
- * @author Juanpabl
- */
-$messages['an'] = array(
-	'vector' => "Milloras d'a interficie ta Vector",
-	'vector-desc' => "Milloras en os elementos d'interficie d'usuario de l'aparencia Vector.", # Fuzzy
-	'vector-collapsiblenav-preference' => "Activar a opción de plegar os menús de navegación en l'aparencia Vector",
-	'vector-collapsiblenav-more' => 'Más luengas',
-	'vector-editwarning-warning' => "Si sale d'ista pachina perderá totz os cambios que haiga feito. Si tiene una cuenta d'usuario, puet eliminar ista alvertencia en a sección «Caixa d'edición» d'as suyas preferencies.",
-	'vector-editwarning-preference' => "Alvertir-me quan salga d'una pachina d'edición sin alzar os cambios",
-	'vector-simplesearch-search' => 'Mirar',
-	'vector-simplesearch-containing' => 'que contién...',
-	'vector-noexperiments-preference' => "Excluir-me d'as caracteristicas experimentals",
-);
-
-/** Arabic (العربية)
- * @author Aiman titi
- * @author Alexknight12
- * @author DRIHEM
- * @author Meno25
- * @author Mido
- * @author OsamaK
- */
-$messages['ar'] = array(
-	'vector' => 'تحسينات واجهة المستخدم لفكتور',
-	'vector-desc' => 'تحسينات في عناصر واجهة المستخدم لواجهة فكتور.',
-	'vector-collapsiblenav-preference' => 'مكّن طي العناصر في قائمة التصفح في واجهة فكتور',
-	'vector-collapsiblenav-more' => 'لغات أخرى',
-	'vector-editwarning-warning' => 'قد تتسبب مغادرة هذه الصفحة بخسارتك لأي تغييرات قمت بها.
-يمكنك تعطيل هذا التحذير إذا كنت والجلًا في قسم "التحرير" في تفضيلاتك.',
-	'vector-editwarning-preference' => 'حذّرني عندما أغادر تحرير صفحة ذات تغييرات غير محفوظة',
-	'vector-simplesearch-search' => 'بحث',
-	'vector-simplesearch-containing' => 'يحتوي...',
-	'vector-noexperiments-preference' => 'استبعدني من تجارب الخاصية',
-	'vector-footercleanup-transclusion' => 'هذه الصفحة تحتوي على {{PLURAL:$1تضمين|تضمينات}} لـ {{PLURAL:$1|صفحة واحدة أخرى|$1 صفحات أخرى}}.',
-	'vector-footercleanup-templates' => 'عرض القوالب في هذه الصفحة',
-);
-
-/** Aramaic (ܐܪܡܝܐ)
- * @author Basharh
- */
-$messages['arc'] = array(
-	'vector-editwarning-warning' => 'ܐܢ ܫܒܩܬ ܦܐܬܐ ܗܕܐ ܡܬܡܨܝܢܬܐ ܐܝܬܝܗ ܕܚܣܪܬ ܟܠ ܫܘܚܠܦ̈ܐ ܕܥܒܝܕܬ ܗܪܟܐ.
-ܡܨܬ ܕܬܒܛܠ ܙܘܗܪܐ ܗܢܐ ܐܢ ܥܠܝܠܐ ܐܝܬܝܟ ܒܡܢܬܐ ܕ"ܫܚܠܦܬܐ" ܒܨܒܝܢܝܘܬ̈ܐ.',
-	'vector-editwarning-preference' => 'ܙܗܪ ܠܝ ܐܡܬܝ ܫܒܩ ܐܢܐ ܦܐܬܐ ܕܫܘܚܠܦܐ ܕܐܝܬ ܒܗ ܫܘܚܠܦ̈ܐ ܠܐ ܠܒܝܟ̈ܐ',
-	'vector-simplesearch-search' => 'ܒܨܝ',
-	'vector-simplesearch-containing' => 'ܬܚܒܘܫ...',
-	'vector-footercleanup-templates' => 'ܚܙܝ ܩܠܒ̈ܐ ܒܦܐܬܐ ܗܕܐ',
-	'vector-footercleanup-categories' => 'ܚܙܝ ܣܕܪ̈ܐ ܛܘܫܝ̈ܐ ܒܦܐܬܐ ܗܕܐ',
-);
-
-/** Egyptian Spoken Arabic (مصرى)
- * @author Dudi
- * @author Meno25
- */
-$messages['arz'] = array(
-	'vector' => 'تحسينات واجهه المستخدم لفكتور',
-	'vector-desc' => 'تحسينات فى عناصر واجهه المستخدم لواجهه فكتور.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'خلّى الليستات بتاعة مينيو الاستكشاف تبان مقفوله فى Vector skin',
-	'vector-collapsiblenav-more' => 'لغات اكتر',
-	'vector-editwarning-warning' => 'لو سيبت الصفحه دى ممكن يخلّيك تضيّع اى تغييرات عملتها.
-لو انت مسجّل دخولك, ممكن تعطّل التحذير ده من الجزء بتاع "تعديل" فى تفضيلاتك.',
-	'vector-editwarning-preference' => 'حذّرنى لما اسيب صفحة تعديل فيها تغييرات مش متسييڤه',
-	'vector-simplesearch-search' => 'تدوير',
-	'vector-simplesearch-containing' => 'جوّاه...',
-);
-
-/** Assamese (অসমীয়া)
- * @author Bishnu Saikia
- * @author Gitartha.bordoloi
- */
-$messages['as'] = array(
-	'vector' => 'ভেক্টৰৰ বাবে ব্যৱহাৰকাৰী যোগাযোগৰ উন্নতি সাধন',
-	'vector-desc' => "ভেক্টৰ আৱৰণৰ ব্যৱহাৰকাৰীৰ ইণ্টাৰফে'চ উপাদানৰ উন্নতি সাধন কৰে।",
-	'vector-collapsiblenav-preference' => 'ভেক্টৰ আৱৰণত ভাঁজযুক্ত নেভিগছন মেনু সক্ৰিয় কৰক',
-	'vector-collapsiblenav-more' => 'অধিক ভাষা',
-	'vector-editwarning-warning' => 'এই পৃষ্ঠাটো এৰিলে আপুনি কৰা পৰিবৰ্তনসমূহ হেৰাব পাৰে। যদি আপুনি প্ৰৱেশ কৰা অৱস্থাত আছে, আপুনি এই সতৰ্কবাৰ্তাক আপোনাৰ পছন্দসমূহৰ "সম্পাদনা" অংশত অসামৰ্থবান কৰিব পাৰিব।',
-	'vector-editwarning-preference' => 'সালসলনি সংৰক্ষণ নকৰাকৈ সম্পাদনা পৃষ্ঠা ত্যাগৰ সময়ত মোক সাৱধান কৰক',
-	'vector-simplesearch-search' => 'সন্ধান কৰক',
-	'vector-simplesearch-containing' => 'যি আছে...',
-	'vector-noexperiments-preference' => 'ভৱিষ্যতৰ পৰীক্ষাবোৰৰ পৰা মোক ৰেহাই দিয়ক',
-	'vector-footercleanup-transclusion' => 'এই পৃষ্ঠাটোৱে {{PLURAL:$1|অন্য এটা পৃষ্ঠাৰ|$1 অন্য পৃষ্ঠাসমূহৰ}} {{PLURAL:$1|বেষ্টন|বেষ্টনসমূহ}} অন্তৰ্ভুক্ত কৰে।',
-	'vector-footercleanup-templates' => 'এই পৃষ্ঠাৰ সংলগ্ন সাঁচ চাওক',
-	'vector-footercleanup-categories' => 'এই পৃষ্ঠাত সন্নিবিষ্ট অদৃশ্য পৃষ্ঠাসমূহ চাওক',
-);
-
-/** Asturian (asturianu)
- * @author Xuacu
- */
-$messages['ast'] = array(
-	'vector' => "Meyores de la interfaz d'usuariu pa Vector",
-	'vector-desc' => "Ameyora la interfaz d'usuariu al usar l'aspeutu Vector.",
-	'vector-collapsiblenav-preference' => 'Activar anubrir elementos nel panel llateral del aspeutu Vector',
-	'vector-collapsiblenav-more' => 'Más llingües',
-	'vector-editwarning-warning' => 'Salir d\'esta páxina pue facer que se pierda cualesquier cambiu fechu.
-Si aniciasti sesión, puedes desactivar esti avisu na seición "Edición" de les tos preferencies.',
-	'vector-editwarning-preference' => "Avisame cuando salga d'una páxina d'edición con cambios ensin guardar",
-	'vector-simplesearch-search' => 'Guetar',
-	'vector-simplesearch-containing' => 'que contién...',
-	'vector-noexperiments-preference' => 'Escluíme de carauterístiques esperimentales',
-	'vector-footercleanup-transclusion' => "Esta páxina contién {{PLURAL:$1|una tresclusión|tresclusiones}} {{PLURAL:$1|d'otra páxina|d'otres $1 páxines}}.",
-	'vector-footercleanup-templates' => "Ver los modelos d'esta páxina",
-	'vector-footercleanup-categories' => "Ver les categoríes anubríes d'esta páxina",
-);
-
-/** Azerbaijani (azərbaycanca)
- * @author PPerviz
- * @author Vugar 1981
- */
-$messages['az'] = array(
-	'vector-collapsiblenav-more' => 'Çoxlu dillər',
-	'vector-simplesearch-search' => 'Axtar',
-);
-
-/** South Azerbaijani (تورکجه)
- * @author Amir a57
- * @author E THP
- * @author Ebrahimi-amir
- * @author Mousa
- */
-$messages['azb'] = array(
-	'vector-collapsiblenav-more' => 'آیری دیل‌لر',
-	'vector-editwarning-preference' => 'دَییشدیرمه صحیفه‌سینده چیخیش زامانی، آچیق و قئید اولمایان دَییشدیرمه صحیفه وارسا منه هشدار وئریلسین',
-	'vector-simplesearch-search' => 'آختار',
-);
-
-/** Bashkir (башҡортса)
- * @author Assele
- */
-$messages['ba'] = array(
-	'vector' => '"Векторлы" күренешен яҡшыртыуҙар',
-	'vector-desc' => '"Векторлы" күренешенең ҡулланыусы интерфейсында яҡшыртыуҙар.', # Fuzzy
-	'vector-collapsiblenav-preference' => '"Векторлы" күренешендә һул яҡ менюла блоктарҙы төрөргә рөхсәт итергә',
-	'vector-collapsiblenav-more' => 'Күберәк телдәр',
-	'vector-editwarning-warning' => 'Икенсе биткә күсеү һеҙ индергән үҙгәрештәрҙең юғалыуына килтереүе мөмкин.
-Әгәр системала танылыу үтһәгеҙ, көйләүҙәрегеҙ битенең "Мөхәррирләү" бүлегендә был киҫәтеүҙе һүндерә алаһығыҙ.',
-	'vector-editwarning-preference' => 'Мөхәррирләү битенән үҙгәртеүҙәрҙе һаҡламайынса сыҡҡан ваҡытта мине киҫәтергә',
-	'vector-simplesearch-search' => 'Эҙләү',
-	'vector-simplesearch-containing' => 'эстәлегендә...',
-	'vector-noexperiments-preference' => 'Һынау өсөн мөмкинлектәр тәҡдим итмәҫкә',
-);
-
-/** Bavarian (Boarisch)
- * @author Mucalexx
- * @author ✓
- */
-$messages['bar'] = array(
-	'vector' => "Vabesserrungen fyr d' Vector-Benutzerowerflächen",
-	'vector-desc' => 'Vabesserrungen an da Vektor-Benutzerowerflächen', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Zåmmkloppm vo Elemente im Navigazionsmenü vo da Benutzerowerflächen Vector aktivirn',
-	'vector-collapsiblenav-more' => 'Weiderne Sproochen',
-	'vector-editwarning-warning' => "'s Valossen vo derer Seiten kå dodazua fyrn, daas d' Änderrungen valurn geengan.
-Ois ågmödter Benutzer kå's Åzoang vo derer Warnung im \"Beorweiten\"-Bereich vo de Eistellungen obgschoiden wern.",
-	'vector-editwarning-preference' => ' A Warung geem, sofern a zur da Beorweitung geffnate Seiten valossen werd, de ned gspeicherde Änderrungen enthoit.',
-	'vector-simplesearch-search' => 'Suach',
-	'vector-simplesearch-containing' => 'Voitextsuach noch ...',
-	'vector-noexperiments-preference' => 'Ned an Funkzions-Experimenten teilnemmer',
-);
-
-/** Belarusian (беларуская)
- * @author Maksim L.
- */
-$messages['be'] = array(
-	'vector' => 'Паляпшае інтэрфэйс для кажуха Vector',
-	'vector-desc' => 'Паляпшае элементы інтэрфэйсу ўдзельніка для кажуха Vector', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Уключыць згортванне блокаў у навігацыйным меню для кажуха Vector',
-	'vector-collapsiblenav-more' => 'Болей моваў',
-	'vector-editwarning-warning' => 'Выхад з гэтай старонкі прывядзе да страты правак, якія вы зрабілі. 
-Калі Вы зарэгістраваныя ў сістэме, Вы можаце адключыць гэта папярэджанне ў закладцы "Праца" Вашых настаўленняў.',
-	'vector-editwarning-preference' => 'Папярэдзіць мяне, калі я пакідаю старонку з незахаванымі праўкамі',
-	'vector-simplesearch-search' => 'Знайсці',
-	'vector-simplesearch-containing' => 'змяшчае...',
-);
-
-/** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
- * @author EugeneZelenko
- * @author Jim-by
- * @author Wizardist
- * @author Zedlik
- */
-$messages['be-tarask'] = array(
-	'vector' => 'Паляпшэньні інтэрфэйсу для афармленьня «Вэктар»',
-	'vector-desc' => 'Паляпшае элемэнты інтэрфэйсу карыстальніка для афармленьня «Вэктар»',
-	'vector-collapsiblenav-preference' => 'Дазволіць згортваньне блёкаў у навігацыйным мэню для афармленьня «Вэктар»',
-	'vector-collapsiblenav-more' => 'Болей моваў',
-	'vector-editwarning-warning' => 'Усе зробленыя Вамі зьмены могуць быць страчаныя, калі Вы пакінеце гэтую старонку.
-Калі Вы ўвайшлі ў сыстэму, Вы можаце адключыць гэтае папярэджаньне у сэкцыі «Рэдагаваньне» Вашых наладаў.',
-	'vector-editwarning-preference' => 'Папярэджваць мяне, калі я буду пакідаць старонку рэдагаваньня зь незахаванымі зьменамі',
-	'vector-simplesearch-search' => 'Пошук',
-	'vector-simplesearch-containing' => 'утрымлівае...',
-	'vector-noexperiments-preference' => 'Не прапаноўваць экспэрымэнтальныя магчымасьці',
-	'vector-footercleanup-transclusion' => 'Гэтая старонка ўключае {{PLURAL:$1|адну іншую старонку|$1 іншыя старонкі|$1 іншых старонак}}.',
-	'vector-footercleanup-templates' => 'Паказаць шаблёны на гэтай старонцы',
-	'vector-footercleanup-categories' => 'Паказаць схаваныя катэгорыі да гэтай старонкі',
-);
-
-/** Bulgarian (български)
- * @author DCLXVI
- * @author Spiritia
- * @author Stanqo
- * @author Turin
- */
-$messages['bg'] = array(
-	'vector' => 'Подобрения на потребителския интерфейс за облик Вектор',
-	'vector-desc' => 'Подобрява елементите от потребителския интерфейс на облик Вектор.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Включване на сгъваемо/разгъваемо меню за навигация в облика Vector',
-	'vector-collapsiblenav-more' => 'Още езици',
-	'vector-editwarning-warning' => 'Ако излезете от тази страница, може да загубите всички незапазени промени, които сте направили. 
-Ако сте влезли в системата, можете да изключите това предупреждение през меню "Редактиране" във вашите лични настройки.',
-	'vector-editwarning-preference' => 'Предупреждаване при опит за напускане на страница, отворена в режим на редактиране, без да са запазени промените',
-	'vector-simplesearch-search' => 'Търсене',
-	'vector-noexperiments-preference' => 'Не желая да участвам в бъдещи експерименти',
-	'vector-footercleanup-templates' => 'Преглеждане на шаблоните в страницата',
-	'vector-footercleanup-categories' => 'Показване на скритите категории за тази страница',
-);
-
-/** Banjar (Bahasa Banjar)
- * @author Ezagren
- */
-$messages['bjn'] = array(
-	'vector-collapsiblenav-more' => 'Labih banyak bahasa',
-	'vector-editwarning-preference' => 'Ingatakan ulun pabila maninggalakan tungkaran pambabakan sabalum manyimpan parubahan',
-	'vector-simplesearch-search' => 'Gagai',
-	'vector-simplesearch-containing' => 'isian ...',
-);
-
-/** Bengali (বাংলা)
- * @author Bellayet
- * @author Nasir8891
- * @author Wikitanvir
- */
-$messages['bn'] = array(
-	'vector' => 'ভেক্টরের জন্য ব্যবহারকারী ইন্টারফেসের উন্নতি সাধন',
-	'vector-desc' => 'ভেক্টর স্কিনের ইন্টারফেস উপাদানের উন্নতি সাধন', # Fuzzy
-	'vector-collapsiblenav-preference' => 'ভেক্টর স্কিনে ভাঁজযোগ্য নেভিগেশন মেনু সক্রিয় করো',
-	'vector-collapsiblenav-more' => 'আরও ভাষা',
-	'vector-editwarning-warning' => 'এই পাতাটি ত্যাগ করলে আপনার আপনার করা পরিবর্তনগুলো হারিয়ে যেতে পারে।
-আপনি যদি লগইন করা থাকেন, আপনি এই সতর্কীকরণ বার্তাটি আপনার পছন্দের "সমপাদনা" অনুচ্ছেদ থেকে নিস্ক্রিয় করতে পারেন।',
-	'vector-editwarning-preference' => 'অসংরক্ষিত পরিবর্তন সহ কোনো পাতা ত্যাগের সময় সাবধান করো',
-	'vector-simplesearch-search' => 'অনুসন্ধান',
-	'vector-simplesearch-containing' => 'যা আছে...',
-	'vector-noexperiments-preference' => 'বৈশিষ্ট পরীক্ষার তালিকা থেকে আমাকে বাদ দেয়া হোক',
-);
-
-/** Bishnupria Manipuri (বিষ্ণুপ্রিয়া মণিপুরী)
- * @author Usingha
- */
-$messages['bpy'] = array(
-	'vector' => 'ভেক্টরর কা আতাকুরার ইন্টারফেসহার উন্নতি করানিহান',
-	'vector-desc' => 'ভেক্টর স্কিনর ইন্টারফেস মাথেলর উন্নতি করানি।', # Fuzzy
-	'vector-collapsiblenav-preference' => 'ভেক্টর স্কিনহানার থিপকরানি একরব নেভিগেশন মেনু থা কর',
-	'vector-collapsiblenav-more' => 'আরাকউ ঠার',
-	'vector-editwarning-warning' => 'পাতা এহান বেলিয়া গেলেগা তি সিলকরিসত অতা মাঙুইতে পারে।
-তি লগইন করিসতগ ইলে, এরে সিঙকরানির পৌ এহান তর "পতানি" থাকেত্ত আরুম করানি পারর।',
-	'vector-editwarning-preference' => 'পতানির সময় ইতু নাকরিয়া বেলিয়া গেলেগা মরে সিঙকরেদিস',
-	'vector-simplesearch-search' => 'বিসারা',
-	'vector-simplesearch-containing' => 'আসেতা...',
-);
-
-/** Breton (brezhoneg)
- * @author Fulup
- * @author Y-M D
- */
-$messages['br'] = array(
-	'vector' => 'Gwellaennoù IU evit Vector',
-	'vector-desc' => 'Gwellaat a ra elfennoù eus ar gwiskadur Vector war an etrefas implijer.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Aotren al lañser merdeiñ pak-dispak a-gleiz gant an neuz Vector',
-	'vector-collapsiblenav-more' => "Muioc'h a yezhoù",
-	'vector-editwarning-warning' => "Mar kuitait ar bajenn-mañ e c'hallit koll ar c'hemmoù degaset ganeoc'h.
-Ma'z oc'h kevreet e c'hallit diweredekaat ar c'hemenn-diwall-mañ e rann \"Prenestr skridaozañ\" ho penndibaboù.",
-	'vector-editwarning-preference' => 'Kas keloù din pa guitaan ur bajenn degaset kemmoù enni hep enrollañ',
-	'vector-simplesearch-search' => 'Klask',
-	'vector-simplesearch-containing' => 'ennañ...',
-	'vector-noexperiments-preference' => "Lezit-me er-maez eus al labour amprouiñ an arc'hwelioù nevez",
-	'vector-footercleanup-templates' => 'Gwelet patromoù ar bajenn-mañ',
-	'vector-footercleanup-categories' => 'Gwelet ar rummadoù kuzhet evit ar pennad-mañ',
-);
-
-/** Bosnian (bosanski)
- * @author CERminator
- */
-$messages['bs'] = array(
-	'vector' => 'UI poboljšanja za Vector',
-	'vector-desc' => 'Poboljšava elemente korisničkog interfejsa u koži Vector.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Omogući skrivanje stavki u navigacionom meniju u koži Vector',
-	'vector-collapsiblenav-more' => 'Više jezika',
-	'vector-editwarning-warning' => 'Napuštanje ove stranice može dovesti do gubitka svih promjena koje ste načinili.
-Ako ste prijavljeni, možete isključiti ovo upozorenje u "Veličine tekstualnog polja" dijelu vaših opcija.',
-	'vector-editwarning-preference' => 'Upozori me kada napustim stranicu za izmjene bez spašenih promjena',
-	'vector-simplesearch-search' => 'Traži',
-	'vector-simplesearch-containing' => 'sadrži...',
-	'vector-noexperiments-preference' => 'Isključi me iz funkcijskih probi',
-);
-
-/** Catalan (català)
- * @author Anskar
- * @author Grondin
- * @author Paucabot
- * @author SMP
- * @author Vriullop
- */
-$messages['ca'] = array(
-	'vector' => 'Millores de la interfície per a Vector',
-	'vector-desc' => "Millores en els elements d'interfície d'usuari de l'aparença Vector.",
-	'vector-collapsiblenav-preference' => "Activa l'opció de plegar els menús de navegació en l'aparença Vector",
-	'vector-collapsiblenav-more' => 'Més llengües',
-	'vector-editwarning-warning' => "Si sortiu d'aquesta pàgina perdreu tots els canvis que hàgiu fet.
-Si teniu un compte d'usuari, podeu eliminar aquest avís a la secció «Caixa d'edició» de les vostres preferències.",
-	'vector-editwarning-preference' => "Avisa'm quan surti d'una pàgina d'edició amb canvis sense desar",
-	'vector-simplesearch-search' => 'Cerca',
-	'vector-simplesearch-containing' => 'que conté ...',
-	'vector-noexperiments-preference' => 'Exclou-me dels experiments de funcionalitats',
-	'vector-footercleanup-transclusion' => "Aquesta pàgina conté {{PLURAL:$1|una transclusió d'una altra pàgina|unes transclusions de $1 altres pàgines}}.",
-	'vector-footercleanup-templates' => "Mostra les plantilles d'aquesta pàgina",
-	'vector-footercleanup-categories' => "Mostra les categories ocultes d'aquesta pàgina",
-);
-
-/** Chechen (нохчийн)
- * @author Sasan700
- */
-$messages['ce'] = array(
-	'vector-simplesearch-search' => 'Лаха',
-);
-
-/** Sorani Kurdish (کوردی)
- * @author Asoxor
- * @author Calak
- * @author Marmzok
- */
-$messages['ckb'] = array(
-	'vector-collapsiblenav-preference' => 'ڕێگە بدە بە کرانەوەی بڕگەکانی پێرستی ڕێدۆزی لە بەرگی ڤێکتۆردا.',
-	'vector-collapsiblenav-more' => 'زمانەکانی دیکە',
-	'vector-editwarning-warning' => 'بەجێ‌هێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەست چوونی هەموو ئەو گۆڕانکاریانەی کردووتە.
-ئەگەر لەژوورەوەی، دەتوانی ئەم ئاگادارییە لە بەشی "دەستکاریی" لە ھەڵبژاردەکانی، لەکاربخەی.',
-	'vector-editwarning-preference' => 'ھۆشیارم بکەوە کاتێک لە پەڕەیەکی دەستکاری بە گۆڕانکاریی پاشەکەوت‌نەکراو دەردەچم',
-	'vector-simplesearch-search' => 'گەڕان',
-	'vector-simplesearch-containing' => 'بە لەبەرگرتنەوەی ...',
-	'vector-noexperiments-preference' => 'من لە تایبەتمەندییەکانی تاقیکردنەوە ھەڵاوێرە',
-	'vector-footercleanup-templates' => 'داڕێژەکانی ئەم پەڕەیە ببینە',
-	'vector-footercleanup-categories' => 'پۆلە شاردراوەکانی ئەم پەڕەیە ببینە',
-);
-
-/** Crimean Turkish (Cyrillic script) (къырымтатарджа (Кирилл)‎)
- * @author Don Alessandro
- */
-$messages['crh-cyrl'] = array(
-	'vector-simplesearch-search' => 'Къыдыр',
-	'vector-simplesearch-containing' => 'ичинде бу олгъан...',
-);
-
-/** Crimean Turkish (Latin script) (qırımtatarca (Latin)‎)
- * @author Don Alessandro
- */
-$messages['crh-latn'] = array(
-	'vector-simplesearch-search' => 'Qıdır',
-	'vector-simplesearch-containing' => 'içinde bu olğan...',
-);
-
-/** Czech (česky)
- * @author Mormegil
- */
-$messages['cs'] = array(
-	'vector' => 'Vylepšení uživatelského rozhraní pro Vektor',
-	'vector-desc' => 'Vylepšuje uživatelské rozhraní při užití vzhledu Vektor',
-	'vector-collapsiblenav-preference' => 'Povolit sbalování položek v navigačním menu ve vzhledu Vektor',
-	'vector-collapsiblenav-more' => 'Další jazyky',
-	'vector-editwarning-warning' => 'Opuštěním této stránky se mohou veškeré provedené změny ztratit.
-Pokud jste přihlášeni, můžete si toto varování vypnout na záložce „Editace“ v uživatelském nastavení.',
-	'vector-editwarning-preference' => 'Upozornit, když budu opouštět editaci bez uložení změn',
-	'vector-simplesearch-search' => 'Hledat',
-	'vector-simplesearch-containing' => 'obsahující…',
-	'vector-noexperiments-preference' => 'Neúčastnit se experimentů s novými funkcemi',
-	'vector-footercleanup-transclusion' => 'Do této stránky {{PLURAL:$1|je vložena $1 jiná stránka|jsou vloženy $1 jiné stránky|je vloženo $1 jiných stránek}}.',
-	'vector-footercleanup-templates' => 'Zobrazit šablony na této stránce',
-	'vector-footercleanup-categories' => 'Zobrazit skryté kategorie na této stránce',
-);
-
-/** Kashubian (kaszëbsczi)
- * @author Kuvaly
- */
-$messages['csb'] = array(
-	'vector-simplesearch-search' => 'Szëkba',
-);
-
-/** Church Slavic (словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ)
- * @author ОйЛ
- */
-$messages['cu'] = array(
-	'vector-collapsiblenav-more' => 'дроуꙃи ѩꙁꙑци',
-	'vector-simplesearch-search' => 'исканиѥ',
-	'vector-simplesearch-containing' => 'сѥ дрьжащи···',
-);
-
-/** Chuvash (Чӑвашла)
- * @author FLAGELLVM DEI
- */
-$messages['cv'] = array(
-	'vector-simplesearch-search' => 'Шырав',
-);
-
-/** Welsh (Cymraeg)
- * @author Lloffiwr
- */
-$messages['cy'] = array(
-	'vector' => "Gwelliannau i'r rhyngwyneb ar gyfer Vector",
-	'vector-desc' => 'Yn gwella ar y rhyngwyneb yn y wedd Vector.',
-	'vector-collapsiblenav-preference' => "Galluogi crebachu'r ddewislen lywio yn y wedd Vector",
-	'vector-collapsiblenav-more' => 'Rhagor o ieithoedd',
-	'vector-simplesearch-search' => 'Chwilio',
-	'vector-simplesearch-containing' => 'yn cynnwys...',
-	'vector-noexperiments-preference' => "Peidio â'm cynnwys mewn arbrofion ar y nodweddion",
-	'vector-footercleanup-transclusion' => "Mae'r dudalen hon yn cynnwys {{PLURAL:$1||tudalen|$1 dudalen|$1 tudalen|$1 thudalen|$1 tudalen}} sydd wedi cael {{PLURAL:$1||ei thrawsgynnwys|eu trawsgynnwys}}.",
-	'vector-footercleanup-templates' => 'Gweld nodiadau ar y dudalen hon.',
-	'vector-footercleanup-categories' => 'Gweld categorïau cudd ar y dudalen hon',
-);
-
-/** Danish (dansk)
- * @author Froztbyte
- * @author Peter Alberti
- * @author Sarrus
- * @author Sir48
- */
-$messages['da'] = array(
-	'vector' => 'Forbedringer af brugerfladen til Vector',
-	'vector-desc' => 'Forbedrer brugerfladen, når Vector-udseendet er i brug.',
-	'vector-collapsiblenav-preference' => 'Aktiver sammenklapning af sidemenuen i Vector-udseendet',
-	'vector-collapsiblenav-more' => 'Flere sprog',
-	'vector-editwarning-warning' => 'Hvis du forlader siden nu, risikerer du at miste alle ændringer som du har lavet.
-Denne advarsel kan slås fra under Redigering i dine indstillinger.',
-	'vector-editwarning-preference' => 'Advar mig, hvis jeg forlader en redigeringsside med ændringer, der ikke er gemt.',
-	'vector-simplesearch-search' => 'Søg',
-	'vector-simplesearch-containing' => 'indeholder...',
-	'vector-noexperiments-preference' => 'Udeluk mig fra funktionseksperimenter',
-	'vector-footercleanup-transclusion' => 'Denne side indeholder {{PLURAL:$1|en transklusion|transklusioner}} af {{PLURAL:$1|én anden side|$1 andre sider}}.',
-	'vector-footercleanup-templates' => 'Vis skabeloner på denne side',
-	'vector-footercleanup-categories' => 'Vis skjulte kategorier på denne side',
-);
-
-/** German (Deutsch)
- * @author Church of emacs
- * @author Kghbln
- * @author SVG
- * @author The Evil IP address
- * @author Tischbeinahe
- * @author ✓
- */
-$messages['de'] = array(
-	'vector' => 'Verbesserungen für die Benutzeroberfläche „Vector“',
-	'vector-desc' => 'Ermöglicht zusätzliche Verbesserungen der Benutzeroberfläche „Vector“',
-	'vector-collapsiblenav-preference' => 'Zusammenklappen von Elementen im Navigationsmenü der Benutzeroberfläche Vector aktivieren',
-	'vector-collapsiblenav-more' => 'Weitere Sprachen',
-	'vector-editwarning-warning' => 'Das Verlassen dieser Seite kann dazu führen, dass die Änderungen verloren gehen.
-Als angemeldeter Benutzer kann das Anzeigen dieser Warnung im „Bearbeiten“-Bereich der Einstellungen abgeschaltet werden.',
-	'vector-editwarning-preference' => 'Warnen, sofern eine zur Bearbeitung geöffnete Seite verlassen wird, die nicht gespeicherte Änderungen enthält',
-	'vector-simplesearch-search' => 'Suche',
-	'vector-simplesearch-containing' => 'Volltextsuche nach …',
-	'vector-noexperiments-preference' => 'Nicht an Funktionsexperimenten teilnehmen',
-	'vector-footercleanup-transclusion' => 'In diese Seite {{PLURAL:$1|wurde eine Seite|wurden $1 Seiten}} eingebunden.',
-	'vector-footercleanup-templates' => 'Auf dieser Seite eingebundene Vorlagen anzeigen',
-	'vector-footercleanup-categories' => 'Versteckte Kategorien auf dieser Seite anzeigen',
-);
-
-/** German (formal address) (Deutsch (Sie-Form)‎)
- */
-$messages['de-formal'] = array(
-	'vector-editwarning-warning' => 'Das Verlassen dieser Seite kann dazu führen, dass Ihre Änderungen verloren gehen.
-Wenn Sie angemeldet sind, können Sie das Anzeigen dieser Warnung im „Bearbeiten“-Bereich Ihrer Einstellungen abschalten.',
-);
-
-/** Zazaki (Zazaki)
- * @author Erdemaslancan
- * @author Mirzali
- * @author Xoser
- */
-$messages['diq'] = array(
-	'vector' => 'Ser vectori UI hacetanê hewli',
-	'vector-desc' => 'Yeweniya asayışa vektori da rıasayışe karberi keno weş.',
-	'vector-collapsiblenav-preference' => 'Eyarê qic kerdisê ke hecatan menuyê navigasyon ke Vector de inan a bike',
-	'vector-collapsiblenav-more' => 'Ziwananê binan',
-	'vector-editwarning-warning' => 'ihtimal o ke wexta şıma peli ra bıveci, vurnayiş o ke şıma kerdo, hewna şiyêro .
-eke şıma kewtê hesabê xo, no hişyari tercihanê xo ra şıma eşkeni "Ho vurnayeno" bıvındarnî .',
-	'vector-editwarning-preference' => 'wexta ke ez pelo nêqeydbiyaye ra veciyaya mı hişyar bıker',
-	'vector-simplesearch-search' => 'Cı geyre',
-	'vector-simplesearch-containing' => 'Estên...',
-	'vector-noexperiments-preference' => 'Mı tewrê cerbnayışan dê bahdoyêna meke',
-	'vector-footercleanup-transclusion' => 'Zerrey ena pela {{PLURAL:$1|vıraştışen|Vıraştışeni}} sera {{PLURAL:$1|pelaya bin|$1 zewbi pelaya}}.',
-	'vector-footercleanup-templates' => 'Şablonanê ena perer bıvinê',
-	'vector-footercleanup-categories' => 'Nımıte kategoriyanê ena perer bıvinê',
-);
-
-/** Lower Sorbian (dolnoserbski)
- * @author Michawiki
- */
-$messages['dsb'] = array(
-	'vector' => 'Pólěpšenja wužywarskego pówjercha za Vector',
-	'vector-desc' => '!Pólěpša wužywarski pówjerch za drastwu Vector.',
-	'vector-collapsiblenav-preference' => 'Złožowanje zapiskow w bocnicy w drastwje Vector zmóžniś',
-	'vector-collapsiblenav-more' => 'Dalšne rěcy',
-	'vector-editwarning-warning' => 'Gaž toś ten bok se spušća, mógu se změny zgubiś, kótarež sy pśewjadł. Jolic sy pśizjawjeny, móžoš toś to warnowanje we wótrězku Wobźěłaś swójich nastajenjow znjemóžniś.',
-	'vector-editwarning-preference' => 'Warnowaś, gaž bok spušća se z njeskłaźonymi změnami',
-	'vector-simplesearch-search' => 'Pytaś',
-	'vector-simplesearch-containing' => 'wopśimujo...',
-	'vector-noexperiments-preference' => 'Mě z funkciskich eksperimentow wuzamknuś',
-	'vector-footercleanup-transclusion' => 'Toś ten bok wopśimujo {{PLURAL:$1|transkluziju|transkluziji|transkluzije|transkluzije}} $1 {{PLURAL:$1|drugego boka|drugeju bokowu|drugich bokow|drugich bokow}}.',
-	'vector-footercleanup-templates' => 'Pśedłogi na toś tom boku zwobrazniś',
-	'vector-footercleanup-categories' => 'Schowane kategorije na toś tom boku pokazaś',
-);
-
-/** Greek (Ελληνικά)
- * @author Dead3y3
- * @author Geraki
- * @author Glavkos
- * @author Απεργός
- */
-$messages['el'] = array(
-	'vector' => 'βελτιώσεις στο UI για το Vector',
-	'vector-desc' => 'Παρέχει βελτίωση στα στοιχεία διεπαφής χρήστη του skin Vector.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Ενεργοποίηση πτυσσόμενων ενοτήτων στο μενού πλοήγησης με το θέμα Vector',
-	'vector-collapsiblenav-more' => 'Περισσότερες γλώσσες',
-	'vector-editwarning-warning' => 'Αφήνοντας αυτή τη σελίδα μπορεί να σας κάνει να χάσετε κάποιες αλλαγές που έχετε κάνει.
-Αν έχετε συνδεθεί, μπορείτε να απενεργοποιήσετε αυτή την προειδοποίηση στο τμήμα "Επεξεργασία" των προτιμήσεών σας.',
-	'vector-editwarning-preference' => 'Προειδοποίηση όταν εγκαταλείπω μία σελίδα επεξεργασίας χωρίς να έχω πρώτα αποθηκεύσει τις αλλαγές',
-	'vector-simplesearch-search' => 'Αναζήτηση',
-	'vector-simplesearch-containing' => 'περιέχει...',
-	'vector-noexperiments-preference' => 'Εξαιρέστε με από την λειτουργία πειραμάτων',
-);
-
-/** Esperanto (Esperanto)
- * @author AVRS
- * @author Maximillion Pegasus
- * @author Yekrats
- */
-$messages['eo'] = array(
-	'vector' => 'Plibonigado de grafika interfaco por Vector',
-	'vector-desc' => 'Plibonigas la uzula interfaco kiam oni lernas Vector-etoson.',
-	'vector-collapsiblenav-preference' => 'Ŝalti kaŝebladon de aĵoj en la dekstra navigmenuo kun etoso Vector',
-	'vector-collapsiblenav-more' => 'Pli lingvoj',
-	'vector-editwarning-warning' => 'Forlasante ĉi tiun paĝon kaŭzos al vi perdi iun ajn ŝanĝojn kiujn vi faris.
-Se vi ensalutas, vi povas malŝalti ĉi tiun averton en la sekcio "Grandeco de redakta tekstujo" de viaj preferoj.',
-	'vector-editwarning-preference' => 'Averti min kiam mi forlasas redaktan paĝon kun nekonservitaj ŝanĝoj',
-	'vector-simplesearch-search' => 'Serĉi',
-	'vector-simplesearch-containing' => 'enhavas...',
-	'vector-noexperiments-preference' => 'Ekskluzivu min de estontecaj testoj',
-	'vector-footercleanup-transclusion' => 'Ĉi tiu paĝo enhavas {{PLURAL:$1|transinkluzivaĵon|transinkluzivaĵojn}} de {{PLURAL:$1|unu alia paĝo|$1 aliaj paĝoj}}.',
-	'vector-footercleanup-templates' => 'Rigardi ŝablonojn en ĉi tiu paĝo',
-);
-
-/** Spanish (español)
- * @author Armando-Martin
- * @author Crazymadlover
- * @author Drini
- * @author Fitoschido
- * @author Locos epraix
- * @author Translationista
- */
-$messages['es'] = array(
-	'vector' => 'Mejoras de interfaz de usuario para Vector',
-	'vector-desc' => 'Mejora la interfaz de usuario cuando se utiliza Vector como aspecto',
-	'vector-collapsiblenav-preference' => 'Activar menús plegables en la barra lateral de la piel Vector',
-	'vector-collapsiblenav-more' => 'Más idiomas',
-	'vector-editwarning-warning' => 'El dejar esta página causará la pérdida de cualquier cambio que hayas realizado.
-Si has iniciado sesión, puedes desactivar este aviso en la sección «Edición» en tus preferencias.',
-	'vector-editwarning-preference' => 'Advertirme cuando abandone una página editada con cambios sin grabar',
-	'vector-simplesearch-search' => 'Buscar',
-	'vector-simplesearch-containing' => 'conteniendo...',
-	'vector-noexperiments-preference' => 'Excluirme de características experimentales',
-	'vector-footercleanup-transclusion' => 'Esta página contiene {{PLURAL:$1|una transclusión|transclusiones}} {{PLURAL:$1|de otra página|de otras $1 páginas}}.',
-	'vector-footercleanup-templates' => 'Ver las plantillas de esta página',
-	'vector-footercleanup-categories' => 'Ver las categorías ocultas de esta página',
-);
-
-/** Estonian (eesti)
- * @author Pikne
- */
-$messages['et'] = array(
-	'vector' => 'Vector-kujunduse kasutajaliidese täiustused',
-	'vector-desc' => 'Täiustab Vectori-kujunduse kasutajaliidest.',
-	'vector-collapsiblenav-preference' => 'Luba Vektori-kujundusega navigeerimismenüü üksusi peita',
-	'vector-collapsiblenav-more' => 'Veel keeli',
-	'vector-editwarning-warning' => 'Sellelt leheküljelt lahkumise tõttu võivad tehtud muudatused kaotsi minna.
-Kui oled sisse loginud, saad selle hoiatuse eelistuste alaosas "Toimetamine" keelata.',
-	'vector-editwarning-preference' => 'Hoiata mind, kui lahkun redigeerimisleheküljelt muudatusi salvestamata',
-	'vector-simplesearch-search' => 'Otsi',
-	'vector-simplesearch-containing' => 'sisalduv...',
-	'vector-noexperiments-preference' => 'Jäta mind funktsioonide katsetamisest kõrvale',
-	'vector-footercleanup-transclusion' => 'Sellel leheküljel kasutatakse mallina {{PLURAL:$1|üht|$1}} teist lehekülge.',
-	'vector-footercleanup-templates' => 'Näita malle, mida leheküljel kasutatakse',
-	'vector-footercleanup-categories' => 'Näita peidetud kategooriaid, millesse lehekülg kuulub',
-);
-
-/** Basque (euskara)
- * @author An13sa
- */
-$messages['eu'] = array(
-	'vector' => 'EI hobekuntzak Vector-entzat',
-	'vector-desc' => 'Vector skin-eko lankidearen interfazeko elementuak hobetzen ditu.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Vector skin-ean ezkerreko nabigazio menua irekigarri bihurtzen du',
-	'vector-collapsiblenav-more' => 'Hizkuntza gehiago',
-	'vector-editwarning-warning' => 'Orrialde honetatik irteten bazara, egindako aldaketak galdu egingo dira.
-Saioa hasi baduzu, mezu hau kendu dezakezu zure hobespenen orrialdeko "Aldatzen" atalean.',
-	'vector-editwarning-preference' => 'Abisa nazazu gorde gabeko aldaketak eginez orrialde bat uzten dudanean',
-	'vector-simplesearch-search' => 'Bilatu',
-	'vector-simplesearch-containing' => 'edukian...',
-);
-
-/** Persian (فارسی)
- * @author Ebraminio
- * @author Huji
- * @author Ladsgroup
- * @author Reza1615
- * @author Sahim
- * @author ZxxZxxZ
- */
-$messages['fa'] = array(
-	'vector' => 'بهبودهای رابط کاربر برای پوستهٔ برداری',
-	'vector-desc' => 'بهبود در عناصر رابط کاربری در زمان استفاده از پوستهٔ وکتور',
-	'vector-collapsiblenav-preference' => 'فعال‌کردن منوی تاشوی ناوبری در پوسته وکتور',
-	'vector-collapsiblenav-more' => 'زبان‌های بیشتر',
-	'vector-editwarning-warning' => 'خروج از این صفحه ممکن است باعث از دست رفتن هرچه نوشته‌اید شود.
-اگر شما با نام کاربری وارد شده‌اید می‌توانید این هشدار را در بخش «در حال ویرایش» ترجیحاتتان بیابید.',
-	'vector-editwarning-preference' => 'زمان خروج از صفحهٔ ویرایش در صورت داشتن ویرایش‌های‌ ذخیره‌نشده به من هشدار داده شود',
-	'vector-simplesearch-search' => 'جستجو',
-	'vector-simplesearch-containing' => 'صفحه‌های دربردارنده...',
-	'vector-noexperiments-preference' => 'من را از ویژگی‌های آزمایشی مستثنی کن',
-	'vector-footercleanup-transclusion' => 'این صفحه شامل {{PLURAL:$1|تراگنجانش|تراگنجانش‌های}} {{PLURAL:$1|صفحه‌ای دیگر است|$1 صفحهٔ دیگر است}}.',
-	'vector-footercleanup-templates' => 'نمایش الگوها در این صفحه',
-	'vector-footercleanup-categories' => 'نمایش رده‌های پنهان این صفحه',
-);
-
-/** Finnish (suomi)
- * @author Crt
- * @author Nike
- * @author Olli
- * @author Str4nd
- * @author VezonThunder
- */
-$messages['fi'] = array(
-	'vector' => 'Käyttöliittymän parannukset Vectorille',
-	'vector-desc' => 'Parantaa käyttöliittymää Vector-ulkoasua käytettäessä.',
-	'vector-collapsiblenav-preference' => 'Ota käyttöön sivupalkin kohteiden piilottaminen Vector-ulkoasussa',
-	'vector-collapsiblenav-more' => 'Muilla kielillä',
-	'vector-editwarning-warning' => 'Tältä sivulta poistuminen saattaa aiheuttaa kaikkien tekemiesi muutosten katoamisen.
-Jos olet kirjautuneena sisään, voit poistaa tämän varoituksen käytöstä asetuksissa ”Muokkaus”-osiossa.',
-	'vector-editwarning-preference' => 'Varoita minua, kun poistun muokkaussivulta tallentamatta muutoksia',
-	'vector-simplesearch-search' => 'Hae',
-	'vector-simplesearch-containing' => 'sisältää...',
-	'vector-noexperiments-preference' => 'Älä ota minua mukaan ominaisuuskokeiluihin',
-	'vector-footercleanup-transclusion' => 'Tälle sivulle on sisällytetty {{PLURAL:$1|yksi muu sivu|$1 muuta sivua}}.',
-	'vector-footercleanup-templates' => 'Näytä mallineet tällä sivulla',
-	'vector-footercleanup-categories' => 'Näytä piilotetut luokat tällä sivulla',
-);
-
-/** Faroese (føroyskt)
- * @author Diupwijk
- */
-$messages['fo'] = array(
-	'vector-simplesearch-search' => 'Leita',
-);
-
-/** French (français)
- * @author Gomoko
- * @author IAlex
- * @author Jean-Frédéric
- * @author McDutchie
- * @author PieRRoMaN
- * @author Sherbrooke
- * @author Urhixidur
- */
-$messages['fr'] = array(
-	'vector' => 'Améliorations IU pour Vector',
-	'vector-desc' => "Améliore l’interface utilisateur lors de l'utilisation de l'habillage Vecteur",
-	'vector-collapsiblenav-preference' => "Activer le menu de navigation à gauche repliable avec l'habillage vector",
-	'vector-collapsiblenav-more' => 'Plus de langues',
-	'vector-editwarning-warning' => 'Quitter cette page vous fera perdre toutes les modifications que vous avez faites.
-Si vous êtes connecté avec votre compte, vous pouvez retirer cet avertissement dans la section « Fenêtre de modification » de vos préférences.',
-	'vector-editwarning-preference' => 'M’avertir quand je quitte une page de modification sans publier les changements',
-	'vector-simplesearch-search' => 'Rechercher',
-	'vector-simplesearch-containing' => 'contenant...',
-	'vector-noexperiments-preference' => "M'exclure des expériences de nouvelles fonctionnalités",
-	'vector-footercleanup-transclusion' => 'Cette page contient {{PLURAL:$1|une traduction|des traductions}} de $1 {{PLURAL:$1|autre page|autres pages}}.',
-	'vector-footercleanup-templates' => 'Afficher les modèles sur cette page',
-	'vector-footercleanup-categories' => 'Afficher les catégories cachées sur cette page',
-);
-
-/** Franco-Provençal (arpetan)
- * @author ChrisPtDe
- */
-$messages['frp'] = array(
-	'vector' => 'Mèlyoracions EU por « Vèctor »',
-	'vector-desc' => 'Mèlyoracions des èlèments de l’entèrface usanciér de l’habelyâjo « Vèctor ».', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Activar lo menu de navigacion repleyâblo avouéc l’habelyâjo « Vèctor »',
-	'vector-collapsiblenav-more' => 'Més de lengoues',
-	'vector-editwarning-warning' => 'Quitar ceta pâge vos farat pèrdre tôs los changements que vos éd fêts.
-Se vos éte branchiê, vos pouede enlevar ceti avèrtissement dens la sèccion « Fenétra d’èdicion » de voutres prèferences.',
-	'vector-editwarning-preference' => 'M’avèrtir quand quito una pâge de changement sen sôvar los changements',
-	'vector-simplesearch-search' => 'Rechèrchiér',
-	'vector-simplesearch-containing' => 'que contint...',
-	'vector-noexperiments-preference' => 'M’èxcllure des èxpèriences de novèles fonccionalitâts',
-);
-
-/** Northern Frisian (Nordfriisk)
- * @author Murma174
- */
-$messages['frr'] = array(
-	'vector' => 'Ferbeedrangen för di skak „Vector“',
-	'vector-desc' => 'Muar ferbeedrangen för di skak „Vector“ mögelk maage',
-	'vector-collapsiblenav-preference' => "Det fersteegen faan elementen uun't nawigatsjuunsmenu bi „Vector“ aktiwiare",
-	'vector-collapsiblenav-more' => 'Muar spriaken',
-	'vector-editwarning-warning' => 'Wan dü detheer sidj slotst, kön feranrangen ferleesen gung.
-Üs uunmeldet brüker könst dü detheer wäärnang bi din iinstelangen oner „Bewerke“ wechknipse.',
-	'vector-editwarning-preference' => 'Waarskaue mi, wan en sidj slööden woort, huar noch ünseekert feranrangen maaget wurden san',
-	'vector-simplesearch-search' => 'Sjük',
-	'vector-simplesearch-containing' => 'Uun di tekst sjük efter …',
-	'vector-noexperiments-preference' => 'Ik wal ei bi eksperimenten tu nei funktsjuunen mämaage',
-	'vector-footercleanup-transclusion' => 'Uun detdiar sidj {{PLURAL:$1|as ian sidj muar|san $1 sidjen muar}} iinbünjen.',
-	'vector-footercleanup-templates' => 'Wise föörlaagen uun, diar faan detheer sidj brükt wurd',
-	'vector-footercleanup-categories' => 'Wise ferstäächt kategoriin faan detheer sidj uun',
-);
-
-/** Friulian (furlan)
- * @author Klenje
- */
-$messages['fur'] = array(
-	'vector-collapsiblenav-more' => 'Altris lenghis',
-	'vector-editwarning-preference' => 'Visimi cuant che o stoi par lassâ une pagjine dulà che a son cambiaments no salvâts',
-	'vector-simplesearch-search' => 'Ricercje',
-	'vector-simplesearch-containing' => 'che al à dentri...',
-);
-
-/** Irish (Gaeilge)
- * @author පසිඳු කාවින්ද
- */
-$messages['ga'] = array(
-	'vector-simplesearch-search' => 'Cuardaigh',
-);
-
-/** Simplified Gan script (赣语（简体）‎)
- */
-$messages['gan-hans'] = array(
-	'vector-simplesearch-search' => '寻吖',
-);
-
-/** Traditional Gan script (贛語（繁體）‎)
- * @author Symane
- */
-$messages['gan-hant'] = array(
-	'vector-simplesearch-search' => '尋吖',
-);
-
-/** Scottish Gaelic (Gàidhlig)
- * @author Akerbeltz
- */
-$messages['gd'] = array(
-	'vector' => 'Leasachaidhean an UI airson Vector',
-	'vector-desc' => 'Cuiridh seo piseach air eileamaidean eadar-aghaidh nan cleachdaichean san chraiceann Vector.',
-	'vector-collapsiblenav-preference' => 'Cuir an comas dùmhlachadh nan rudan san chlàr-taice seòlaidh san chraiceann Vector',
-	'vector-collapsiblenav-more' => 'Barrachd chànan',
-	'vector-editwarning-warning' => 'Ma dh\'fhàgas tu an duilleag seo, faodaidh gun caill thu mùthadh sam bith a rinn thu.
-Ma tha thu air logadh a-steach, \'s urrainn dhut an rabhadh seo a chur dheth san roinn "Deasachadh" sna roghainnean agad.',
-	'vector-editwarning-preference' => 'Thoir rabhadh dhomh ma bhios mi an impis duilleag deasachaidh fhàgail mus do shàbhail mi na mùthaidhean agam',
-	'vector-simplesearch-search' => 'Lorg',
-	'vector-simplesearch-containing' => 'anns a bheil...',
-);
-
-/** Galician (galego)
- * @author Toliño
- */
-$messages['gl'] = array(
-	'vector' => 'Melloras na interface de usuario para a aparencia Vector',
-	'vector-desc' => 'Mellora a interface de usuario ao usar a aparencia Vector',
-	'vector-collapsiblenav-preference' => 'Activar o menú de navegación despregable á esquerda na aparencia Vector',
-	'vector-collapsiblenav-more' => 'Máis linguas',
-	'vector-editwarning-warning' => 'Deixar esta páxina pode causar a perda de calquera cambio feito.
-Se accedeu ao sistema, pode desactivar esta mensaxe de advertencia na sección "Edición" das súas preferencias.',
-	'vector-editwarning-preference' => 'Avisádeme cando deixe unha páxina de edición cos cambios sen gardar',
-	'vector-simplesearch-search' => 'Procurar',
-	'vector-simplesearch-containing' => 'que conteña...',
-	'vector-noexperiments-preference' => 'Excluídeme das novas características',
-	'vector-footercleanup-transclusion' => 'Esta páxina contén {{PLURAL:$1|unha transclusión|transclusións}} {{PLURAL:$1|doutra páxina|doutras $1 páxinas}}.',
-	'vector-footercleanup-templates' => 'Ver os modelos desta páxina',
-	'vector-footercleanup-categories' => 'Ver as categorías ocultas desta páxina',
-);
-
-/** Ancient Greek (Ἀρχαία ἑλληνικὴ)
- */
-$messages['grc'] = array(
-	'vector-simplesearch-search' => 'Ζητεῖν',
-	'vector-simplesearch-containing' => 'περιέχον...',
-);
-
-/** Swiss German (Alemannisch)
- * @author Als-Holder
- */
-$messages['gsw'] = array(
-	'vector' => 'BI-Verbesserige fir Vektor',
-	'vector-desc' => 'Verbesserige an dr Elemänt vu dr Benutzeroberflechi bim Vector-skin',
-	'vector-collapsiblenav-preference' => 'Yyklappbar Navgationsmenü yyschalte bi dr Verwändig vu Vector',
-	'vector-collapsiblenav-more' => 'Meh Sproche',
-	'vector-editwarning-warning' => 'Wänn Du die Syte verlosch, cha s syy, ass Du alli Bearbeitige verliersch, wu Du do dra gmacht hesch.
-Wänn Du aagmäldet bisch, chasch s Anzeige vu däre Warnig im „Tekscht-Ygab“-Beryych vu Dyyne Yystelligen abstelle.',
-	'vector-editwarning-preference' => 'Warn mi, wänn I ne Syte verloss mit Bearbeitige, wu nonig gspycheret sin',
-	'vector-simplesearch-search' => 'Suechi',
-	'vector-simplesearch-containing' => 'din het s …',
-	'vector-noexperiments-preference' => 'Mi uusschließe vu dr Dailnahm Feature-Experimänt',
-	'vector-footercleanup-transclusion' => 'In die Syte {{PLURAL:$1|isch ei Syte|sin $1 Syte}} yybunde wore.',
-	'vector-footercleanup-templates' => 'Vorlage uf däre Syten aazeige',
-	'vector-footercleanup-categories' => 'Versteckti Kategorie uf däre Syten aazeige',
-);
-
-/** Gujarati (ગુજરાતી)
- * @author Ashok modhvadia
- * @author KartikMistry
- * @author Sushant savla
- */
-$messages['gu'] = array(
-	'vector' => 'વેક્ટર માટે UI સુધારા',
-	'vector-desc' => 'વેક્ટર સ્કીનના યુઝર ઈંટરફેઝ ના તત્વોને સુધારે છે', # Fuzzy
-	'vector-collapsiblenav-preference' => 'વેક્ટર સ્કીનના સાઈડ બારમાં કોલેપ્સીંગ સક્રીય કરશે.',
-	'vector-collapsiblenav-more' => 'વધુ ભાષાઓ',
-	'vector-editwarning-warning' => 'આ પાનું છોડી દેશો તો તમારા ફેરફારો સચવાશે નહીં.
-જો તમે પ્રવેશ કરેલો હોય તો તમે આ ચેતવણીને તમારી પસંદના "ફેરફાર" વિભાગના વિકલ્પો બદલીને બંધ કરી શકો છો.',
-	'vector-editwarning-preference' => 'સાચવ્યા વગર જો હું પૃષ્ઠ છોડું તો મને ચેતવણી આપો',
-	'vector-simplesearch-search' => 'શોધો',
-	'vector-simplesearch-containing' => 'ધરાવતી...',
-	'vector-noexperiments-preference' => 'મને પ્રયોગોમાંથી બાકાત રાખો',
-);
-
-/** Manx (Gaelg)
- * @author Shimmin Beg
- */
-$messages['gv'] = array(
-	'vector-collapsiblenav-more' => 'Tooilley çhengaghyn',
-	'vector-editwarning-warning' => "My faagys oo y duillag, hed caghlaaghyn erbee er coayl, foddee.
-My t'ou uss loggalt stiagh, foddee oo lhiettal y raaue shoh 'sy tosheeaghtyn ayd, 'sy rheynn \"Reaghey\".",
-	'vector-editwarning-preference' => 'Cur raaue dou my ta mee faagail duillag reaghey gyn sauail yn obbyr jeant aym',
-	'vector-simplesearch-search' => 'Ronsaghey',
-	'vector-simplesearch-containing' => 'goaill stiagh...',
-);
-
-/** Hebrew (עברית)
- * @author Amire80
- * @author Ofekalef
- * @author Rotemliss
- * @author YaronSh
- * @author Yonidebest
- */
-$messages['he'] = array(
-	'vector' => 'שיפורי מנשק משתמש עבור וקטור',
-	'vector-desc' => 'הרחבת ממשק המשתמש בעת השימוש בעיצוב וקטור',
-	'vector-collapsiblenav-preference' => 'הפעלת קיפול פריטים בתפריט הניווט בעיצוב וקטור',
-	'vector-collapsiblenav-more' => 'דף זה בשפות אחרות',
-	'vector-editwarning-warning' => 'עזיבת דף זה עשויה לגרום לאובדן כל השינויים שביצעתם.
-אם אתם מחוברים לחשבון, תוכלו לבטל אזהרה זו בחלק "עריכה" שבהעדפות שלכם.',
-	'vector-editwarning-preference' => 'הצגת אזהרה בעת עזיבת דף עריכה עם שינויים שטרם נשמרו',
-	'vector-simplesearch-search' => 'חיפוש',
-	'vector-simplesearch-containing' => 'כולל...',
-	'vector-noexperiments-preference' => 'אל תכללו אותי בניסויים בעתיד',
-	'vector-footercleanup-transclusion' => 'הדף הזה מכליל {{PLURAL:$1|דף אחד אחר|$1 דפים אחרים}}',
-	'vector-footercleanup-templates' => 'הצגת תבניות בדף הזה',
-	'vector-footercleanup-categories' => 'הצגת קטגוריות מוסתרות בדף הזה',
-);
-
-/** Hindi (हिन्दी)
- * @author Ansumang
- */
-$messages['hi'] = array(
-	'vector' => 'यूआई उन्नति वेक्टर स्किन के लिए',
-	'vector-collapsiblenav-more' => 'और अधिक भाषाएं',
-	'vector-simplesearch-search' => 'खोज',
-	'vector-noexperiments-preference' => 'मुझे सुविधा प्रयोगों से बाहर निकालें',
-);
-
-/** Fiji Hindi (Latin script) (Fiji Hindi)
- * @author Karthi.dr
- */
-$messages['hif-latn'] = array(
-	'vector-simplesearch-search' => 'Khojo',
-);
-
-/** Croatian (hrvatski)
- * @author Anton008
- * @author Excaliboor
- * @author SpeedyGonsales
- */
-$messages['hr'] = array(
-	'vector' => 'Poboljšanja sučelja stila Vektor',
-	'vector-desc' => 'Poboljšava elemente korisničkog sučelja stila Vector.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Omogući sklopivi lijevi navigacijski izbornik za Vektor stil',
-	'vector-collapsiblenav-more' => 'Više jezika',
-	'vector-editwarning-warning' => 'Napuštanje ove stranice može uzrokovati gubitak svake izmjene koju ste napravili.
-Možete onemogućiti ovo upozorenje u odjeljku "Širina okvira za uređivanje" Vaših postavki.',
-	'vector-editwarning-preference' => 'Upozori me kad napuštam stranicu za uređivanje bez spremanja izmjena',
-	'vector-simplesearch-search' => 'Traži',
-	'vector-simplesearch-containing' => 'sadrži....',
-	'vector-noexperiments-preference' => 'Isključi me iz daljnjih eksperimentiranja',
-);
-
-/** Upper Sorbian (hornjoserbsce)
- * @author Michawiki
- */
-$messages['hsb'] = array(
-	'vector' => 'Polěpšenja wužiwarskeho powjercha za Vector',
-	'vector-desc' => 'Polěpša wužiwarski powjerch drasty Vector',
-	'vector-collapsiblenav-preference' => 'Fałdowanje zapiskow w bóčnicy w drasće Vector zmóžnić',
-	'vector-collapsiblenav-more' => 'Dalše rěče',
-	'vector-editwarning-warning' => 'Hdyž so strona wopušća, móžeja so změny zhubić, kotrež sy přewjedł. Jeli sy přizjewjeny, móžeš tute warnowanje we wotrězku "Wobdźěłowanje" swojich nastajenjow znjemóžnić.',
-	'vector-editwarning-preference' => 'Warnować, hdyž so wobdźěłowanska strona z njeskładowanymi změnami wopušća',
-	'vector-simplesearch-search' => 'Pytać',
-	'vector-simplesearch-containing' => 'wobsahuje...',
-	'vector-noexperiments-preference' => 'Mje z funkciskich eksperimentow wuzamknyć',
-	'vector-footercleanup-transclusion' => 'Tuta strona wobsahuje {{PLURAL:$1|transkluziju|transkluziji|transkluzije|transkluzije}} $1 {{PLURAL:$1|druheje strony|druheju stronow|druhich stronow|druhich stronow}}.',
-	'vector-footercleanup-templates' => 'Předłohi na tutej stronje zwobraznić',
-	'vector-footercleanup-categories' => 'Schowane kategorije na tutej stronje pokazać',
-);
-
-/** Hungarian (magyar)
- * @author Dani
- * @author Hunyadym
- * @author Tgr
- */
-$messages['hu'] = array(
-	'vector' => 'Fejlesztések a Vector felhasználói felületén',
-	'vector-desc' => 'Fejlesztések a Vector felület felhasználói felületének elemein.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Összecsukható navigációs menü engedélyezése a Vector felületen',
-	'vector-collapsiblenav-more' => 'Más nyelveken',
-	'vector-editwarning-warning' => 'A lap elhagyásával az összes itt végzett változtatás elveszhet.
-Ha be vagy jelentkezve letilthatod ezt a figyelmeztetést a beállításaid „Szerkesztés” szakaszában.',
-	'vector-editwarning-preference' => 'Figyelmeztessen, ha szerkesztéskor a módosítások mentése nélkül akarom elhagyni a lapot',
-	'vector-simplesearch-search' => 'Keresés',
-	'vector-simplesearch-containing' => 'tartalmazza…',
-	'vector-noexperiments-preference' => 'Nem akarok kísérleti funkciókat használni',
-);
-
-/** Armenian (Հայերեն)
- * @author Xelgen
- */
-$messages['hy'] = array(
-	'vector-editwarning-warning' => 'Այս էջը լքելով դուք կարող եք կորցնել ձեր կատարած փոփոխությունները։
-Եթե դուք գրանցված եք համակարգում, կարող եք անջատել այս նախազգուշացումը ձեր նախընրությունների «Խմբագրում» բաժնում։',
-	'vector-editwarning-preference' => 'Զգուշացնել ինձ, երբ ես լքում եմ խմբագրման էջը առանց կատարած փոփոխությունները հիշելու։',
-	'vector-simplesearch-search' => 'Որոնել',
-);
-
-/** Interlingua (interlingua)
- * @author McDutchie
- */
-$messages['ia'] = array(
-	'vector' => 'Meliorationes del interfacie de usator pro Vector',
-	'vector-desc' => 'Meliora le elementos del interfacie de usator del apparentia Vector.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Render plicabile le elementos in le menu de navigation in le apparentia Vector',
-	'vector-collapsiblenav-more' => 'Plus linguas',
-	'vector-editwarning-warning' => 'Quitar iste pagina pote causar le perdita de omne modificationes que tu ha facite.
-Si tu ha aperite un session, tu pote disactivar iste aviso in le section "Modification" de tu preferentias.',
-	'vector-editwarning-preference' => 'Advertir me quando io quita un pagina de modification sin publicar le cambiamentos',
-	'vector-simplesearch-search' => 'Cercar',
-	'vector-simplesearch-containing' => 'continente...',
-	'vector-noexperiments-preference' => 'Excluder me de functionalitate experimental',
-	'vector-footercleanup-transclusion' => 'Iste pagina contine {{PLURAL:$1|un transclusion|transclusiones}} de $1 altere {{PLURAL:$1|pagina|paginas}}.',
-);
-
-/** Indonesian (Bahasa Indonesia)
- * @author Farras
- * @author Irwangatot
- * @author IvanLanin
- * @author Kenrick95
- */
-$messages['id'] = array(
-	'vector' => 'Meningkatkan UI untuk Vector',
-	'vector-desc' => 'Meningkatkan elemen pada antarmuka penguna dari kulit Vector.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Aktifkan fungsi menu navigasi kiri yang dapat ditampilkan pada kulit Vektor',
-	'vector-collapsiblenav-more' => 'Lebih banyak bahasa',
-	'vector-editwarning-warning' => 'Meninggalkan halaman ini dapat menyebabkan semua perubahan yang belum tersimpan hilang.
-Jika Anda telah masuk log, Anda dapat mematikan peringatan ini lewat "Penyuntingan" pada halaman preferensi Anda.',
-	'vector-editwarning-preference' => 'Ingatkan saya bila meninggalkan halaman penyuntingan sebelum menyimpan perubahan',
-	'vector-simplesearch-search' => 'Cari',
-	'vector-simplesearch-containing' => 'isian ...',
-	'vector-noexperiments-preference' => 'Kecualikan saya dari percobaan fitur',
-	'vector-footercleanup-transclusion' => 'Halaman ini berisi {{PLURAL:$1|transklusi|transklusi}} {{PLURAL:$1|sebuah halaman lain|$1 halaman lain}}.',
-);
-
-/** Igbo (Igbo)
- * @author Ukabia
- */
-$messages['ig'] = array(
-	'vector-simplesearch-search' => 'Chọwa',
-);
-
-/** Iloko (Ilokano)
- * @author Lam-ang
- */
-$messages['ilo'] = array(
-	'vector' => 'Napasayat nga UI para iti Vector',
-	'vector-desc' => 'Pasayaatenna ti interface ti agar-aramat no agusar ti kudil a Vector',
-	'vector-collapsiblenav-preference' => 'Pakabaelanna ti panarebba dagiti banag ti uneg ti igid a baras iti kudil a Vector',
-	'vector-collapsiblenav-more' => 'Adu pay a pagsasao',
-	'vector-editwarning-warning' => 'Ti ipapanaw ti daytoy a panid ket makapataud ti panakapukaw kadagiti amiaman a binalbaliwam.
-No nakastrekka, mabalinmo nga ibaldado daytoy a ballaag idiay "Panagurnos" a paset kadagiti kakaykayatam.',
-	'vector-editwarning-preference' => 'Pakaunaannak no pumanawak ti pagurnosan a panid nga adda ti saan a naidulin a sinuksukatan',
-	'vector-simplesearch-search' => 'Biruken',
-	'vector-simplesearch-containing' => 'naglaon ti...',
-	'vector-noexperiments-preference' => 'Saannak nga iraman kadagiti eksperimento a langa',
-	'vector-footercleanup-transclusion' => 'Daytoy a panid ket naglaon  {{PLURAL:$1|ti transklusion|kadagiti transklusion}}  {{PLURAL:$1|ti maysa a panid|dagiti $1 a nadumaduma a pampanid}}.',
-	'vector-footercleanup-templates' => 'Kitaen dagiti plantilia iti daytoy a panid',
-	'vector-footercleanup-categories' => 'Ipakita dagiti nailemmeng a kategoria iti daytoy a panid',
-);
-
-/** Ido (Ido)
- * @author Malafaya
- */
-$messages['io'] = array(
-	'vector-collapsiblenav-more' => 'Plusa lingui',
-	'vector-simplesearch-search' => 'Serchez',
-	'vector-simplesearch-containing' => 'quan kontenas...',
-);
-
-/** Icelandic (íslenska)
- * @author Krun
- * @author Snævar
- * @author Ævar Arnfjörð Bjarmason
- */
-$messages['is'] = array(
-	'vector' => 'Viðmóts lagfæringar á Vector-sniði',
-	'vector-desc' => 'Endurbætir notanda viðmót Vector sniðsins.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Fella saman hluti í hliðarstiku Vector sniðsins',
-	'vector-collapsiblenav-more' => 'Fleiri tungumál',
-	'vector-editwarning-warning' => 'Ef farið er frá þessari síðu gætu þær breytingar sem þú hefur gert tapast.
-Ef þú ert skráður inn, þá getur þú óvirkjað þessi skilaboð í „Breytingarflipanum" undir stillingum.',
-	'vector-editwarning-preference' => 'Vara mig við þegar ég fer frá breytingarsíðu með óvistaðar breytingar',
-	'vector-simplesearch-search' => 'Leita',
-	'vector-simplesearch-containing' => 'sem innihalda ...',
-	'vector-noexperiments-preference' => 'Útiloka mig frá tilraunum framvegis.',
-	'vector-footercleanup-transclusion' => 'Þessi síða ítengist {{PLURAL:$1|einni síðu|$1 öðrum síðum}}.',
-);
-
-/** Italian (italiano)
- * @author Beta16
- * @author F. Cosoleto
- * @author Una giornata uggiosa '94
- */
-$messages['it'] = array(
-	'vector' => "Miglioramenti all'interfaccia utente per Vector",
-	'vector-desc' => "Potenzia l'interfaccia utente quando si usa la skin Vector",
-	'vector-collapsiblenav-preference' => 'Abilita menù di navigazione nascondibile per la skin Vector',
-	'vector-collapsiblenav-more' => 'Altre lingue',
-	'vector-editwarning-warning' => 'Lasciare questa pagina potrebbe costarti la perdita di tutti i cambiamenti effettuati.
-Se sei loggato, puoi disattivare questo avviso nella sezione "Casella di modifica" delle tue preferenze.',
-	'vector-editwarning-preference' => 'Avvisa quando si lascia una pagina di modifica con modifiche non salvate',
-	'vector-simplesearch-search' => 'Ricerca',
-	'vector-simplesearch-containing' => 'contenente...',
-	'vector-noexperiments-preference' => 'Escludimi dalle funzionalità sperimentali',
-	'vector-footercleanup-transclusion' => "Questa pagina contiene {{PLURAL:$1|un'inclusione|delle inclusioni}} di {{PLURAL:$1|un'altra pagina|$1 altre pagine}}.",
-	'vector-footercleanup-templates' => 'Mostra i template di questa pagina',
-	'vector-footercleanup-categories' => 'Mostra le categorie nascoste di questa pagina',
-);
-
-/** Japanese (日本語)
- * @author Fryed-peach
- * @author Shirayuki
- * @author Whym
- * @author 青子守歌
- */
-$messages['ja'] = array(
-	'vector' => 'ベクター外装用ユーザーインターフェイス改良',
-	'vector-desc' => 'ベクター外装の使用時にユーザーインターフェイスを強化する',
-	'vector-collapsiblenav-preference' => 'ベクター外装のナビゲーションで、項目の折り畳みを有効にする',
-	'vector-collapsiblenav-more' => '他の言語',
-	'vector-editwarning-warning' => 'このページを離れると、あなたが行った変更がすべて失われるおそれがあります。
-ログインしている場合は、個人設定の「編集」タブでこの警告を表示しない設定に変更できます。',
-	'vector-editwarning-preference' => '変更を保存せずに編集画面から離れようとしたら警告',
-	'vector-simplesearch-search' => '検索',
-	'vector-simplesearch-containing' => 'この語句を全文検索',
-	'vector-noexperiments-preference' => '開発中の機能から自分を除外',
-	'vector-footercleanup-transclusion' => 'このページでは、{{PLURAL:$1|他の $1 件のページ}}を{{PLURAL:$1|参照読み込み}}しています。',
-	'vector-footercleanup-templates' => 'このページのテンプレートを閲覧',
-	'vector-footercleanup-categories' => 'このページの隠しカテゴリを閲覧',
-);
-
-/** Javanese (Basa Jawa)
- * @author NoiX180
- */
-$messages['jv'] = array(
-	'vector' => 'Pambenahan UI kanggo Vector',
-	'vector-desc' => 'Benahi unsur antarmuka panganggo saka kulit Vector.', # Fuzzy
-	'vector-collapsiblenav-more' => 'Luwih akèh basa',
-	'vector-editwarning-preference' => 'Èlingaké kula yèn kula ninggalaké suntingan sing durung kasimpen',
-	'vector-simplesearch-search' => 'Golèk',
-	'vector-simplesearch-containing' => 'ngisi...',
-	'vector-noexperiments-preference' => 'Sajabakaké kula saka èksperimèn piranti',
-);
-
-/** Georgian (ქართული)
- * @author BRUTE
- * @author David1010
- * @author ITshnik
- * @author გიორგიმელა
- */
-$messages['ka'] = array(
-	'vector' => 'ვექტორული თემის ინტერფეისის გაუმჯობესება',
-	'vector-desc' => 'აუმჯობესებს მომხმარებლის ინტერფეისს გაფორმების ვექტორული თემისათვის',
-	'vector-collapsiblenav-preference' => 'დართეთ მარცხნივ "ვექტორ" დიზაინში ბლოკების ჩაკეცვა',
-	'vector-collapsiblenav-more' => 'დამატებითი ენები',
-	'vector-editwarning-warning' => 'სხვა გვერდზე გადასვლა გამოიწვევს ცვლილებების დაკარგვას.',
-	'vector-editwarning-preference' => 'გამაფრთხილე, როდესაც დავტოვებ რედაქტირებად გვერდს, დაუმახსოვრებელი ცვლილებებით',
-	'vector-simplesearch-search' => 'ძიება',
-	'vector-simplesearch-containing' => 'შეიცავს...',
-	'vector-noexperiments-preference' => 'გამომრიცხე შემდგომი ექსპერიმენტებისგან.',
-	'vector-footercleanup-transclusion' => 'ეს გვერდი შეიცავს {{PLURAL:$1|ერთი სხვა გვერდის|$1 სხვა გვერდის}} {{PLURAL:$1|ჩანართს|ჩანართს}}.',
-	'vector-footercleanup-templates' => 'ამ გვერდზე გამოყენებული თარგების ხილვა',
-	'vector-footercleanup-categories' => 'ამ გვერდის დამალული კატეგორიების ხილვა',
-);
-
-/** Kazakh (Қазақша)
- * @author Kaztrans
- */
-$messages['kk'] = array(
-	'vector-editwarning-warning' => 'Басқа бетке өтсеңіз сіздің жазған соңғы өңдемелеріңіз жойылуы мүмкін. 
-Егер сiз жүйеде тiркелсеңiз, онда сiз баптауларыңыздағы «Өңдеу» бөлігіне кіріп, бұл ескертуді өшіре аласыз.',
-);
-
-/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
- * @author GaiJin
- * @author Kaztrans
- */
-$messages['kk-cyrl'] = array(
-	'vector-editwarning-warning' => 'Басқа бетке өтсеңіз сіздің жазған соңғы өңдемелеріңіз жойылуы мүмкін. 
-Егер сiз жүйеде тiркелсеңiз, онда сiз баптауларыңыздағы «Өңдеу» бөлігіне кіріп, бұл ескертуді өшіре аласыз.',
-	'vector-simplesearch-search' => 'Іздеу',
-	'vector-noexperiments-preference' => 'Параметр эксперименттеріне қатыстырма',
-);
-
-/** Kalaallisut (kalaallisut)
- * @author Qaqqalik
- */
-$messages['kl'] = array(
-	'vector-simplesearch-search' => 'Ujarlerit',
-);
-
-/** Khmer (ភាសាខ្មែរ)
- * @author គីមស៊្រុន
- */
-$messages['km'] = array(
-	'vector-collapsiblenav-preference' => 'ប្រើមុខងារលាតបើកលាតបិទធាតុក្នុងរបារចំហៀងសំរាប់សំបកវ៉ិចទ័រ',
-	'vector-collapsiblenav-more' => 'ភាសាផ្សេងទៀត',
-	'vector-editwarning-warning' => 'ចាកចេញពីទំព័រនេះ នឹងធ្វើឲ្យអ្នកបាត់បង់កំណែប្រែដែលអ្នកបានធ្វើ។
-ប្រសិនបើអ្នកបានកត់ឈ្មោះរួចហើយ អ្នកអាច​បិទ​បម្រាម​នេះ​នៅ​ក្នុងផ្នែក​ "កំណែប្រែ" នៃ​ចំណូល​ចិត្ត​របស់​អ្នក​។',
-	'vector-editwarning-preference' => 'សូមព្រមាន​ខ្ញុំ​ ពេលដែលខ្ញុំ​ចាកចេញ​ពី​ទំព័រ​កែប្រែដោយមិន​បានរក្សា​ទុកបំលាស់ប្ដូរ​នានា​',
-	'vector-simplesearch-search' => 'ស្វែងរក​',
-	'vector-simplesearch-containing' => 'ដែលមានពាក្យ...',
-	'vector-noexperiments-preference' => 'ដកខ្ញុំចេញពីការពិសោធន៍មុខងារថ្មីៗ',
-);
-
-/** Korean (한국어)
- * @author Albamhandae
- * @author IRTC1015
- * @author Kwj2772
- * @author 아라
- */
-$messages['ko'] = array(
-	'vector' => '벡터 스킨의 사용자 인터페이스를 향상',
-	'vector-desc' => '벡터 스킨을 사용할 때 사용자 인터페이스를 향상합니다',
-	'vector-collapsiblenav-preference' => '벡터 스킨에서 사이드바 항목 접기 활성화',
-	'vector-collapsiblenav-more' => '기타 언어',
-	'vector-simplesearch-search' => '찾기',
-	'vector-simplesearch-containing' => '다음 어구가 들어간 문서 찾기',
-	'vector-noexperiments-preference' => '기능 실험에서 나를 제외',
-	'vector-footercleanup-transclusion' => '이 문서는 {{PLURAL:$1|다른 문서 한 개|다른 문서 $1개}}의 {{PLURAL:$1|틀}}을 포함합니다.',
-	'vector-footercleanup-templates' => '이 문서에 사용된 틀 보기',
-	'vector-footercleanup-categories' => '이 문서의 숨은 분류 보기',
-);
-
-/** Karachay-Balkar (къарачай-малкъар)
- * @author Iltever
- */
-$messages['krc'] = array(
-	'vector' => '«Вектор» темагъа интерфейсни игилендириу',
-	'vector-desc' => '«Вектор» темагъа къошулуучу интерфейсни игилендириулери', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Сол менюда «Вектор» темада блокла джашырыу амалны джандыр',
-	'vector-collapsiblenav-more' => 'Дагъыда тилле',
-	'vector-editwarning-warning' => 'Башха бетге кёчсегиз, этген тюрлениулеригиз тас болургъа боллукъдула.
-Системада регистрацияны ётген эсегиз, бу билдириуню джарашдырыуларыгъызны «Тюрлендириу» деген бёлюмюнде джукълатыргъа боллукъсуз.',
-	'vector-editwarning-preference' => 'Тюрлендириулени сакълатмай редакторлау бетден кетген сагъатымда билдир',
-	'vector-simplesearch-search' => 'Излеу',
-	'vector-simplesearch-containing' => 'ичиндегиси…',
-);
-
-/** Colognian (Ripoarisch)
- * @author Purodha
- */
-$messages['ksh'] = array(
-	'vector' => 'Verbäßert Schnettschtäll för Minsche en dä Vektor Bovverfläsch.',
-	'vector-desc' => 'Verbäßert de Schnettschtäll för der Minsch met dä Vektor Bovverfläsch.',
-	'vector-collapsiblenav-preference' => 'Donn zohlohße, Ußwahle em Ußsinn „Vektor“ zoh_ze_klappe',
-	'vector-collapsiblenav-more' => 'Mieh Shprooche',
-	'vector-editwarning-warning' => 'Wann de vun hee dä Sigg fott jeihß, doh künnte all Ding Änderunge aan dä Sigg verschött jonn.
-Do kanns heh di Warnung affschallde, wann de aanjemelldt un enjelogg bes, dann kriß de se nieh mieh wider. Jangk doför en dä Affschnett „Beim Bearbeide“ en Dinge Enshtellunge.',
-	'vector-editwarning-preference' => 'Donn mesch warne, wann esch vun en Sigg fott jonn, ih dat esch all ming Änderunge avjeschpeischert hann.',
-	'vector-simplesearch-search' => 'Söhke',
-	'vector-simplesearch-containing' => 'dren änthallde…',
-	'vector-noexperiments-preference' => 'Donn mesch nit met neue Saache zom Ußprobeere behällijje',
-	'vector-footercleanup-transclusion' => 'Heh di Sigg trick {{PLURAL:$1|ein ander Sigg|$1 ander Sigge|kein ander Sigg}} en sesch eren.',
-	'vector-footercleanup-templates' => 'Donn de Schablohne op heh dä Sigg aanzeije',
-	'vector-footercleanup-categories' => 'Donn de verschtoche Saachjrioppe vun heh dä Sigg aanzeije',
-);
-
-/** Kurdish (Latin script) (Kurdî (latînî)‎)
- * @author Erdal Ronahi
- */
-$messages['ku-latn'] = array(
-	'vector-collapsiblenav-more' => 'Zêdetir ziman',
-	'vector-simplesearch-search' => 'Lêgerîn',
-	'vector-simplesearch-containing' => 'dihundirîne...',
-);
-
-/** Cornish (kernowek)
- * @author Kernoweger
- * @author Kw-Moon
- * @author Nrowe
- */
-$messages['kw'] = array(
-	'vector-collapsiblenav-more' => 'Moy yethow',
-	'vector-editwarning-warning' => 'Mar tewgh why ha gasa an folen-ma, chanjyow eus gwres genowgh a alsa bos kellys.
-Mars owgh why omgelmys, why a yll dialosegy an gwarnyans-ma yn trogh "Chanjya" agas dowisyansow.',
-	'vector-editwarning-preference' => 'Gwra ow gwarnya pan wrellen vy gasa folen chanjya gans chanjyow nag eus gwithys',
-	'vector-simplesearch-search' => 'Whilas',
-	'vector-simplesearch-containing' => 'ynno...',
-	'vector-footercleanup-templates' => "Gweles an scantlyns war'n folen-ma",
-	'vector-footercleanup-categories' => "Gweles an classys cudhys war'n folen-ma",
-);
-
-/** Latin (Latina)
- */
-$messages['la'] = array(
-	'vector-simplesearch-search' => 'Quaerere',
-);
-
-/** Luxembourgish (Lëtzebuergesch)
- * @author Robby
- */
-$messages['lb'] = array(
-	'vector' => 'Verbesserunge vum Benotzer-IInterface (UI) fir Vector',
-	'vector-desc' => "Verbessert am Benotzer-Interface Elementer wann d'Ausgesinn ''Vector'' benotzt gëtt.",
-	'vector-collapsiblenav-preference' => 'Zesummeklappe vun Objeten am Navigatiounsmenü am Vector-Ausgesinn aschalten',
-	'vector-collapsiblenav-more' => 'Méi Sproochen',
-	'vector-simplesearch-search' => 'Sichen',
-	'vector-simplesearch-containing' => 'mat ...',
-	'vector-noexperiments-preference' => 'Mech vun Experimenter mat neie Fonctiounen eraushuelen',
-	'vector-footercleanup-transclusion' => 'Op dëser Säit {{PLURAL:$1|ass eng Säit|sinn $1 Säiten}} agebonn.',
-	'vector-footercleanup-templates' => 'Schablounen op dëser Säit weisen',
-	'vector-footercleanup-categories' => 'Verstoppte Kategorien op dëser Säit weisen',
-);
-
-/** Ganda (Luganda)
- * @author Kizito
- */
-$messages['lg'] = array(
-	'vector-editwarning-warning' => 'Bw\'ova ku lupapula luno kiyinza okuleetera enkyukakyuka z\'olukozeko okuvawo.<br />
-Bw\'oba nga okola oyingidde mu sisitemu, okulabula kuno oyinza okukusirisa nga weyambisa<br />
-ebiri mu kitundu ekya "Kukyusa" eky\'omu "Nteekateeka yange".',
-);
-
-/** Limburgish (Limburgs)
- * @author Ooswesthoesbes
- */
-$messages['li'] = array(
-	'vector' => 'Vectorgebroekersinterfaceverbaeteringe',
-	'vector-desc' => 'Verbaetertj de vectorgebroekersinterface-illemente', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Zèt inklapbaar navigatiemenu in bie vectorgebroek',
-	'vector-collapsiblenav-more' => 'Mieë spräök',
-	'vector-editwarning-warning' => "Es se dees pagina verleets verluus se meugelik wieziginge die se haes gemaak.
-Es se bös aangemeld, kins se dees waorsjoewing oetzètten in 't bewerkingstabblaad in dien veurkäöre.",
-	'vector-editwarning-preference' => "Waorssjoew mich es ich 'n bewerkdje pagina die nag neet is opgeslage wil verlaote",
-	'vector-simplesearch-search' => 'Zeuke',
-	'vector-simplesearch-containing' => 'bevat...',
-	'vector-noexperiments-preference' => "Laot mich in 't vervolg neet mier mitdoon aan experimente",
-	'vector-footercleanup-transclusion' => "Dees pagina bevat {{PLURAL:$1|'n transclusie|transclusies}} van {{PLURAL:$1|ein anger pagina|$1 anger pagina's}}.",
-);
-
-/** Lithuanian (lietuvių)
- * @author Garas
- * @author Matasg
- */
-$messages['lt'] = array(
-	'vector' => '„Vektorinės“ vartotojo sąsajos patobulinimai',
-	'vector-collapsiblenav-more' => 'Daugiau kalbų',
-	'vector-editwarning-warning' => 'Palikdamas šį puslapį jūs prarasite visus padarytus pakeitimus.',
-	'vector-editwarning-preference' => 'Perspėti mane, kai palieku redagavimo puslapį, o jame yra neišsaugotų pakeitimų',
-	'vector-simplesearch-search' => 'Ieškoti',
-);
-
-/** Mizo (Mizo ţawng)
- * @author RMizo
- */
-$messages['lus'] = array(
-	'vector-collapsiblenav-more' => 'Ţawng dangin',
-	'vector-editwarning-preference' => 'Ka phêk siam danglamna ka dahţhat theihnghilh palh chuan min hrilh rawh',
-	'vector-simplesearch-search' => 'Zawnna',
-	'vector-simplesearch-containing' => 'hemi thu telna hi...',
-);
-
-/** Latvian (latviešu)
- * @author GreenZeb
- * @author Xil
- */
-$messages['lv'] = array(
-	'vector' => 'Vector lietotāja saskarsnes uzlabojumi',
-	'vector-desc' => 'Uzlabo lietotāja saskarsnes elementus Vector apdarē.', # Fuzzy
-	'vector-collapsiblenav-more' => 'Vairāk valodu',
-	'vector-editwarning-warning' => 'Atstājot šo lapu tu zaudēsi izdarītās izmaiņas. 
-Ja esi pieteicies, jūs vari atspējot šo brīdinājumu savās izvēlēs sadaļā "rediģēšana"',
-	'vector-editwarning-preference' => 'Brīdināt mani, kad es atstāju lapas rediģēšanu nesaglabājot izmaiņas',
-	'vector-simplesearch-search' => 'Meklēt',
-	'vector-simplesearch-containing' => 'Meklējamā frāze:',
-);
-
-/** Minangkabau (Baso Minangkabau)
- * @author Iwan Novirion
- * @author VoteITP
- */
-$messages['min'] = array(
-	'vector' => 'Maningkekan UI untuak Vector',
-	'vector-desc' => 'Maningkekan antamuka pangguno bilo mamakai kulik Vektor',
-	'vector-collapsiblenav-preference' => 'Aktifkan fungsi menu bukak-tutuik pado sidebar di kulik Vektor',
-	'vector-collapsiblenav-more' => 'Labiah banyak bahaso',
-	'vector-simplesearch-search' => 'Cari',
-	'vector-simplesearch-containing' => 'barisi...',
-	'vector-noexperiments-preference' => 'Jan ikuikan Ambo jo uji-cubo fitur',
-	'vector-footercleanup-transclusion' => 'Laman ko barisi {{PLURAL:$1|transklusi}} {{PLURAL:$1|$1 laman}}.',
-	'vector-footercleanup-templates' => 'Caliak templat di laman ko',
-	'vector-footercleanup-categories' => 'Caliak kategori tasuruak pado laman ko',
-);
-
-/** Macedonian (македонски)
- * @author Bjankuloski06
- * @author Brest
- */
-$messages['mk'] = array(
-	'vector' => 'Подобрувања на посредникот за изгледот „Векторски“',
-	'vector-desc' => 'Ги подобрува корисничкиот посредник кога се користи рувото „Векторско“',
-	'vector-collapsiblenav-preference' => 'Овозможи расклопување на елементи во навигационо мени во рувото „Векторско“',
-	'vector-collapsiblenav-more' => 'Повеќе јазици',
-	'vector-editwarning-warning' => 'Ако ја напуштите страницата ќе ги изгубите сите промени кои сте ги направиле.
-Ако сте најавени, можете да го исклучите ова предупредување во одделот „Уредување“ во вашите нагодувања.',
-	'vector-editwarning-preference' => 'Предупреди ме кога сакам да напуштам страница за уредување без да ги имам зачувано промените',
-	'vector-simplesearch-search' => 'Пребарување',
-	'vector-simplesearch-containing' => 'содржи...',
-	'vector-noexperiments-preference' => 'Изземи ме од експерименти сo функции',
-	'vector-footercleanup-transclusion' => 'Оваа страница содржи {{PLURAL:$1|превметнување|превметнувања}} на уште $1 {{PLURAL:$1|друга страница|други страници}}.',
-	'vector-footercleanup-templates' => 'Погл. шаблони на страницава',
-	'vector-footercleanup-categories' => 'Погл. скриени категории на страницава',
-);
-
-/** Malayalam (മലയാളം)
- * @author Junaidpv
- * @author Praveenp
- */
-$messages['ml'] = array(
-	'vector' => 'വെക്റ്റർ ദൃശ്യരൂപത്തിന്റെ സമ്പർക്കമുഖ മെച്ചപ്പെടുത്തലുകൾ',
-	'vector-desc' => 'വെക്റ്റർ ദൃശ്യരൂപം ഉപയോഗിക്കുമ്പോൾ ഉപയോക്തൃസമ്പർക്കമുഖം മെച്ചപ്പെടുത്തുന്നു',
-	'vector-collapsiblenav-preference' => 'വെക്റ്റർ ദൃശ്യരൂപത്തിൽ ഇടതുവശത്തെ വഴികാട്ടി മെനു ചുരുക്കാവുന്നതാക്കി സജ്ജീകരിക്കുക',
-	'vector-collapsiblenav-more' => 'ഇതര ഭാഷകളിൽ',
-	'vector-editwarning-warning' => 'ഈ താളിൽ നിന്നും പോകുന്നത് താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ നഷ്ടപ്പെടാൻ ഇടയാക്കും.
-താങ്കൾ ലോഗിൻ ചെയ്തിട്ടുണ്ടെങ്കിൽ, താങ്കളുടെ ക്രമീകരണങ്ങളിൽ "തിരുത്തൽ" എന്ന ഭാഗത്ത് ചെന്ന് ഈ അറിയിപ്പ് പ്രദർശിപ്പിക്കുന്നത് ഒഴിവാക്കാവുന്നതാണ്.',
-	'vector-editwarning-preference' => 'സേവ് ചെയ്യാത്ത മാറ്റങ്ങളോടു കൂടിയ തിരുത്തൽ താളിൽ നിന്നും പോകുമ്പോൾ എന്നെ അറിയിക്കുക',
-	'vector-simplesearch-search' => 'തിരയുക',
-	'vector-simplesearch-containing' => 'ഉൾപ്പെടുന്നവ...',
-	'vector-noexperiments-preference' => 'സവിശേഷഗുണങ്ങൾ പരീക്ഷിക്കുന്നതിൽ നിന്നും എന്നെ ഒഴിവാക്കുക',
-	'vector-footercleanup-transclusion' => 'ഈ താളിൽ {{PLURAL:$1|മറ്റൊരു താൾ|മറ്റ് $1 താളുകൾ}} ഉൾപ്പെടുത്തിയിട്ടുണ്ട്.',
-	'vector-footercleanup-templates' => 'ഈ താളിലെ ഫലകങ്ങൾ കാണുക',
-	'vector-footercleanup-categories' => 'ഈ താളിൽ മറഞ്ഞിരിക്കുന്ന വർഗ്ഗങ്ങൾ കാണുക',
-);
-
-/** Mongolian (монгол)
- */
-$messages['mn'] = array(
-	'vector-simplesearch-search' => 'Хайх',
-);
-
-/** Marathi (मराठी)
- * @author Mahitgar
- * @author V.narsikar
- */
-$messages['mr'] = array(
-	'vector' => 'समदिश परिधानाच्या उपयोगकर्ता-आंतरपृष्ठातील(UI) सुधारणा',
-	'vector-desc' => 'समदिश परिधान (व्हेक्टर) त्वचेच्या उपयोगकर्ता-आंतरपृष्ठ (इंटरफेस) घटकांमध्ये सुधारणा करते', # Fuzzy
-	'vector-collapsiblenav-preference' => 'समदिश परिधानाच्या सुचालनानुक्रमातील घटकांची घडीक्षमता सक्षम करा.',
-	'vector-collapsiblenav-more' => 'इतर भाषा दाखवा',
-	'vector-editwarning-warning' => "या पानावरुन दुसर्‍या पानावर गेल्यास, तुम्ही येथे केलेले बदल जतन होणार नाहीत.
-ही सूचना घालवण्यासाठी ''माझ्या पसंती'' मधील संपादनपसंतीत बदल करा.",
-	'vector-editwarning-preference' => 'जर मी संपादित करीत असलेल्या पानावरील माझे संपादिलेले बदल जतन न केल्यास मला इशारा द्या',
-	'vector-simplesearch-search' => 'शोधा',
-	'vector-simplesearch-containing' => '.......हे असलेले',
-	'vector-noexperiments-preference' => 'प्रायोगिक वैशिष्ट्यापासून मला दूर ठेवा',
-);
-
-/** Malay (Bahasa Melayu)
- * @author Anakmalaysia
- * @author Aurora
- * @author Diagramma Della Verita
- */
-$messages['ms'] = array(
-	'vector' => 'pembaikian untuk Vector',
-	'vector-desc' => 'Meningkatkan antara muka pengguna ketika menggunakan kulit Vector',
-	'vector-collapsiblenav-preference' => 'Aktifkan menu navigasi pada laman',
-	'vector-collapsiblenav-more' => 'Bahasa lain',
-	'vector-editwarning-warning' => 'Meninggalkan laman ini mungkin akan menyebabkan anda kehilangan sebarang perubahan yang telah anda lakukan.
-Anda boleh melumpuhkan amaran in di bahagian "Menyunting" dalam keutamaan anda.',
-	'vector-editwarning-preference' => 'Beri saya amaran apabila saya meninggalkan sesebuah laman penyuntingan tanpa menyimpan perubahan.',
-	'vector-simplesearch-search' => 'Cari',
-	'vector-simplesearch-containing' => 'mengandungi...',
-	'vector-noexperiments-preference' => 'Kecualikan saya dari uji kaji ciri',
-	'vector-footercleanup-transclusion' => 'Laman ini mengandungi {{PLURAL:$1|transklusi|transklusi-transklusi}} {{PLURAL:$1|satu laman lain|$1 laman lain}}.',
-	'vector-footercleanup-templates' => 'Lihat templat pada halaman ini',
-	'vector-footercleanup-categories' => 'Lihat kategori tersembunyi pada halaman ini',
-);
-
-/** Maltese (Malti)
- * @author Chrisportelli
- */
-$messages['mt'] = array(
-	'vector' => 'Titjib tal-interfaċċa tal-utent għal Vector',
-	'vector-desc' => 'Ittejjeb l-elementi tal-interfaċċa tal-utent tal-aspett grafiku Vector.', # Fuzzy
-	'vector-collapsiblenav-preference' => "Ippermetti ''menus'' tan-navigazzjoni li jistew jinħbew fl-aspett grafiku Vector",
-	'vector-collapsiblenav-more' => 'Aktar lingwi',
-	'vector-editwarning-warning' => 'Jekk tħalli din il-paġna jista\' jwassal sabiex titlef kwalunkwe tibdil li tkun għamilt. Jekk int tinsab fil-kont tiegħek, tista\' tneħħi dan l-avviż fis-sezzjoni "Modifiki" tal-preferenzi tiegħek.',
-	'vector-editwarning-preference' => "Avżani kull meta nħalli paġna ta' modifika b'modifiki li għadhom ma ġewx salvati",
-	'vector-simplesearch-search' => 'Fittex',
-	'vector-simplesearch-containing' => 'li tinkludi...',
-	'vector-noexperiments-preference' => 'Eskludini minn esperimenti tal-funzjonalitajiet',
-	'vector-footercleanup-transclusion' => "Din il-paġna tinkludi l-{{PLURAL:$1|inklużjoni|inklużjonijiet}} ta' {{PLURAL:$1|paġna oħra|$1 paġni oħra}}.",
-);
-
-/** Nahuatl (Nāhuatl)
- * @author Ricardo gs
- * @author Teòtlalili
- */
-$messages['nah'] = array(
-	'vector-collapsiblenav-more' => 'Okseki tlâtòltìn',
-	'vector-simplesearch-search' => 'Tlatēmoliztli',
-);
-
-/** Norwegian Bokmål (norsk (bokmål)‎)
- * @author Danmichaelo
- * @author Event
- * @author Jsoby
- * @author Laaknor
- * @author Nghtwlkr
- */
-$messages['nb'] = array(
-	'vector' => 'Brukergrensesnittsforbedringer for Vector',
-	'vector-desc' => 'Forbedrer brukergrensesnittet for Vector-utseendet.',
-	'vector-collapsiblenav-preference' => 'Aktiver sammenlegging av element i navigeringsmenyen i drakten Vector',
-	'vector-collapsiblenav-more' => 'Flere språk',
-	'vector-editwarning-warning' => 'Ved å forlate siden vil du miste alle endringer du har utført.
-Denne advarselen kan slås av under Redigering i instillingene dine.',
-	'vector-editwarning-preference' => 'Si ifra dersom jeg forlater en side jeg har gjort redigeringer på men ikke har lagret siden.',
-	'vector-simplesearch-search' => 'Søk',
-	'vector-simplesearch-containing' => 'inneholder …',
-	'vector-noexperiments-preference' => 'Ekskluder meg fra funksjonseksperimenter',
-	'vector-footercleanup-transclusion' => 'Denne siden inneholder {{PLURAL:$1|en transklusjon|transklusjoner}} av {{PLURAL:$1|én annen side|$1 andre sider}}.',
-	'vector-footercleanup-templates' => 'Vis maler på denne siden',
-	'vector-footercleanup-categories' => 'Vis skjulte kategorier på denne siden',
-);
-
-/** Nedersaksies (Nedersaksies)
- * @author Servien
- */
-$messages['nds-nl'] = array(
-	'vector-collapsiblenav-preference' => 'Inklapbaor navigasiemenu inschakelen bie t gebruuk van Vector',
-	'vector-collapsiblenav-more' => 'Meer talen',
-	'vector-editwarning-warning' => "A'j disse zied aofsluten dan kan t ween dat der wieziging die'j emaakt hebben kwiet raken.
-A'j an-emeld bin, dan ku'j disse waorschuwing uutzetten in t tabblad \"Bewarken\" in joew veurkeuren.",
-	'vector-editwarning-preference' => "Waorschuw mien a'k n bewörken zied aof wil sluten die nog niet op-esleugen is",
-	'vector-simplesearch-search' => 'Zeuken / zuken / zuiken',
-	'vector-simplesearch-containing' => 'bevat...',
-);
-
-/** Dutch (Nederlands)
- * @author SPQRobin
- * @author Siebrand
- */
-$messages['nl'] = array(
-	'vector' => 'Gebruikersinterfaceverbeteringen voor Vector',
-	'vector-desc' => 'Verbetert de gebruikersinterface van het uiterlijk Vector',
-	'vector-collapsiblenav-preference' => 'Inklapbaar navigatiemenu inschakelen bij gebruik van Vector',
-	'vector-collapsiblenav-more' => 'Meer talen',
-	'vector-editwarning-warning' => 'Als u deze pagina verlaat verliest u mogelijk wijzigingen die u hebt gemaakt.
-Als u bent aangemeld, kunt u deze waarschuwing uitschakelen in het tabblad "Bewerken" in uw voorkeuren.',
-	'vector-editwarning-preference' => 'Waarschuw mij als ik een bewerkte pagina die nog niet is opgeslagen wil verlaten',
-	'vector-simplesearch-search' => 'Zoeken',
-	'vector-simplesearch-containing' => 'bevat...',
-	'vector-noexperiments-preference' => 'Mij in de toekomst niet laten deelnemen aan experimenten',
-	'vector-footercleanup-transclusion' => "Deze pagina bevat {{PLURAL:$1|een transclusie|transclusies}} van {{PLURAL:$1|één andere pagina|$1 andere pagina's}}.",
-	'vector-footercleanup-templates' => 'Sjablonen van deze pagina weergeven',
-	'vector-footercleanup-categories' => 'Verborgen categorieën van deze pagina weergeven',
-);
-
-/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
- * @author Siebrand
- */
-$messages['nl-informal'] = array(
-	'vector-editwarning-warning' => 'Als je deze pagina verlaat verlies je mogelijk wijzigingen die je hebt gemaakt.
-Als je bent aangemeld, kan je deze waarschuwing uitschakelen in het tabblad "Bewerken" in je voorkeuren.',
-);
-
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
- * @author Gunnernett
- * @author Njardarlogar
- */
-$messages['nn'] = array(
-	'vector-collapsiblenav-more' => 'Fleire språk',
-	'vector-editwarning-warning' => 'Gjennom å navigera bort frå sida vil du missa alle endringane du måtte ha gjort.
-Om du er innlogga, kan du slå av denne åtvaringa under «Endring» i instillingane dine.',
-	'vector-editwarning-preference' => 'Gje ei åtvaring om eg går ut av ei redigeringsside og ikkje alle endringar er lagra',
-	'vector-simplesearch-search' => 'Søk',
-	'vector-simplesearch-containing' => 'inneheld ...',
-);
-
-/** Occitan (occitan)
- * @author Cedric31
- */
-$messages['oc'] = array(
-	'vector' => 'Melhoraments IU per Vector',
-	'vector-desc' => "Melhoraments dels elements de l'interfàcia d'utilizaire de l'abilhatge Vector.", # Fuzzy
-	'vector-collapsiblenav-preference' => "Activar lo menú de navigacion a esquèrra replegable amb l'abilhatge vector",
-	'vector-editwarning-warning' => "Quitar aquesta pagina vos farà pèrdre totas las modificacions qu'avètz fachas.
-Se sètz connectat amb vòstre compte, podètz levar aqueste avertiment dins la seccion Fenèstra de modificacion de vòstras preferéncias.",
-	'vector-editwarning-preference' => 'M’avisar quand quiti una pagina de modificacion sens publicar los cambiaments',
-	'vector-simplesearch-search' => 'Recercar',
-	'vector-simplesearch-containing' => 'que conten...',
-);
-
-/** Oriya (ଓଡ଼ିଆ)
- * @author Jnanaranjan Sahu
- * @author Odisha1
- * @author Psubhashish
- * @author Shisir 1945
- */
-$messages['or'] = array(
-	'vector' => 'ଭେକ୍ଟର ପାଇଁ ଇଉଜର ଇଣ୍ଟରଫେସ ଉନ୍ନତିକରଣ',
-	'vector-desc' => 'ଭେକ୍ଟର ଆବରଣରେ ବ୍ୟବହାର କରୁଥିବା ବେଳେ ଇଉଜର ଇଣ୍ଟରଫେସକୁ ଉନ୍ନତ କରିବେ ।',
-	'vector-collapsiblenav-preference' => 'ଭେକ୍ଟର ବହିରାବରଣରେ କଡ଼ରେ ଥିବା ପଟିକାର ଚିଜ ସବୁକୁ ଦେଖାଇବା-ଲୁଚାଇବା ସଚଳ କରିବେ',
-	'vector-collapsiblenav-more' => 'ଅଧିକ ଭାଷା',
-	'vector-editwarning-warning' => 'ଏହି ପୃଷ୍ଠାକୁ ଛାଡ଼ି ଚାଲିଗଲେ ହୁଏ ତ ଆପଣ କରିଥିବା କିଛି ସମ୍ପାଦନା ହରାଇ ପାରନ୍ତି ।
-ଯଦି ଆପଣ ଲଗ ଇନ କରିଥାନ୍ତି ତେବେ ଆପଣଙ୍କ ପସନ୍ଦର "ସମ୍ପାଦନା" ଭାଗରେ ଏହି ଚେତାବନୀଟିକୁ ଅଚଳ କରିପାରିବେ ।',
-	'vector-editwarning-preference' => 'ଯେତେବେଳେ ମୁଁ ଗୋଟିଏ ସାଇତାଯାଇନଥିବା ପୃଷ୍ଠାକୁ ବନ୍ଦ କରିଦିଏ ମୋତେ ଚେତାବନୀ ଦେବେ',
-	'vector-simplesearch-search' => 'ଖୋଜିବା',
-	'vector-simplesearch-containing' => 'ଧାରଣ ହେଉଛି...',
-	'vector-noexperiments-preference' => 'ସୁବିଧାର ପରଖରୁ ମୋତେ ବାହାର କରିବେ',
-	'vector-footercleanup-transclusion' => 'ଏହି ପୃଷ୍ଟାରେ {{PLURAL:$1|one other page|$1 other pages}} ର {{PLURAL:$1|transclusion|transclusions}} ଅଛି',
-	'vector-footercleanup-templates' => 'ଏହି ପୃଷ୍ଠାରେ ଥିବା ଟେମ୍ପଲେଟଗୁଡିକୁ ଦେଖିବେ',
-	'vector-footercleanup-categories' => 'ଏହି ପୃଷ୍ଠାରେ ଲୁଚିକି ଥିବା ବିଭାଗଗୁଡିକୁ ଦେଖିବେ',
-);
-
-/** Ossetic (Ирон)
- * @author Bouron
- */
-$messages['os'] = array(
-	'vector-simplesearch-search' => 'Агурын',
-	'vector-simplesearch-containing' => 'кæдоны ис...',
-);
-
-/** Punjabi (ਪੰਜਾਬੀ)
- * @author Amire80
- */
-$messages['pa'] = array(
-	'vector-simplesearch-search' => 'ਖੋਜ',
-);
-
-/** Deitsch (Deitsch)
- * @author Xqt
- */
-$messages['pdc'] = array(
-	'vector-collapsiblenav-more' => 'Weidere Schprooche',
-	'vector-simplesearch-search' => 'Uffgucke',
-);
-
-/** Pälzisch (Pälzisch)
- * @author Manuae
- */
-$messages['pfl'] = array(
-	'vector-collapsiblenav-more' => 'Mea Schbooche',
-	'vector-simplesearch-search' => 'Suche',
-);
-
-/** Polish (polski)
- * @author BeginaFelicysym
- * @author Matma Rex
- * @author Sp5uhe
- */
-$messages['pl'] = array(
-	'vector' => 'Usprawnienia interfejsu użytkownika skórki Wektor',
-	'vector-desc' => 'Usprawnia elementy interfejsu użytkownika skórki Wektor',
-	'vector-collapsiblenav-preference' => 'Włącz zwijanie sekcji menu bocznego w skórce Wektor',
-	'vector-collapsiblenav-more' => 'Inne języki',
-	'vector-editwarning-warning' => 'Opuszczenie tej strony może spowodować utratę wprowadzonych przez Ciebie zmian.
-Jeśli jesteś zalogowany, możesz wyłączyć wyświetlanie tego ostrzeżenia w zakładce Edycja w swoich preferencjach.',
-	'vector-editwarning-preference' => 'Ostrzegaj mnie, gdy opuszczam stronę edycji bez zapisania zmian',
-	'vector-simplesearch-search' => 'Szukaj',
-	'vector-simplesearch-containing' => 'zawierające...',
-	'vector-noexperiments-preference' => 'Nie chcę w przyszłości brać udziału w testach',
-	'vector-footercleanup-transclusion' => 'Ta strona zawiera {{PLURAL:$1|dołączoną treść|dołączone treści}} z {{PLURAL:$1|jednej innej strony|$1 innych stron|$1 innych stron}}.',
-	'vector-footercleanup-templates' => 'Zobacz szablony użyte na tej stronie',
-	'vector-footercleanup-categories' => 'Zobacz ukryte kategorie dodane do tej strony',
-);
-
-/** Piedmontese (Piemontèis)
- * @author Borichèt
- * @author Dragonòt
- */
-$messages['pms'] = array(
-	'vector' => 'Ameliorament UI për Vector',
-	'vector-desc' => "A ameliora l'antërfacia utent quand as deuvra la pel Vector",
-	'vector-collapsiblenav-preference' => "Abilité a stërmé j'element ant la bara ëd navigassion ant ël livel Vector",
-	'vector-collapsiblenav-more' => "Pì 'd lenghe",
-	'vector-editwarning-warning' => "Lassé sta pàgina-sì a peul fé an manera che it perde tute le modìfiche ch'it l'has fàit.
-S'it ses logà, it peule disabilité st'avis-sì ant la session \"Quàder ëd modìfica dël test\" dij tò gust.",
-	'vector-editwarning-preference' => 'Avisme quand che i lasso na pàgina ëd modìfiche con modìfiche nen salvà',
-	'vector-simplesearch-search' => 'Arserca',
-	'vector-simplesearch-containing' => 'contenent ...',
-	'vector-noexperiments-preference' => "Gav-me da j'esperiment ëd le funsion",
-	'vector-footercleanup-transclusion' => "Costa pàgina a conten {{PLURAL:$1|transclusion|transclusion}} ëd {{PLURAL:$1|n'àutra pàgina|$1 àutre pàgine}}.",
-	'vector-footercleanup-templates' => 'Smon-e jë stamp dzora sta pàgina',
-	'vector-footercleanup-categories' => 'Vëdde le categorìe stërmà dzora sta pàgina',
-);
-
-/** Western Punjabi (پنجابی)
- * @author Khalid Mahmood
- */
-$messages['pnb'] = array(
-	'vector' => 'یو آئی بہتریاں ویکٹر لئی',
-	'vector-desc' => 'ورتن والے دے وکھالے', # Fuzzy
-	'vector-collapsiblenav-preference' => 'ویکٹر سکن چ سائیڈ بار چ چیزاں دا ڈگنا ہون دیو۔',
-	'vector-collapsiblenav-more' => 'ہور بولیاں',
-	'vector-editwarning-warning' => 'اے صفے توں جان تے ہو سکدا اوہ ساریاں تبدیلیاں مک جان جیہڑیاں تساں بناياں نیں۔
-اگر تسیں لاکان او، تسیں ایڈیٹنگ سیکشن چ  اپنی پسنداں چ ایس خبرداری نوں پعلے ناں۔',
-	'vector-editwarning-preference' => 'جدوں میں کوئی صفحہ تبدیلی کر کے بچاۓ بغیر چھڈن لگاں تے منوں دس دیو',
-	'vector-simplesearch-search' => 'کھوج',
-	'vector-simplesearch-containing' => 'بند کر ریا اے۔۔۔',
-	'vector-noexperiments-preference' => 'منوں نویاں شیواں دے تجربیاں توں بار رکھو',
-);
-
-/** Pontic (Ποντιακά)
- */
-$messages['pnt'] = array(
-	'vector-simplesearch-search' => 'Αράεμαν',
-);
-
-/** Pashto (پښتو)
- * @author Ahmed-Najib-Biabani-Ibrahimkhel
- */
-$messages['ps'] = array(
-	'vector-collapsiblenav-preference' => 'د وکټور پوښۍ په څنګپټه کې د توکو پرځېدنه چارنول',
-	'vector-collapsiblenav-more' => 'نورې ژبې',
-	'vector-simplesearch-search' => 'پلټل',
-	'vector-noexperiments-preference' => 'ما په آزمېښتي ځانګړنو کې مه شمېرۍ.',
-);
-
-/** Portuguese (português)
- * @author Hamilton Abreu
- * @author Helder.wiki
- * @author Raylton P. Sousa
- */
-$messages['pt'] = array(
-	'vector' => 'Melhorias da interface do tema Vector',
-	'vector-desc' => 'Melhora os elementos da interface do utilizador para o tema Vector', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Permitir o ocultamento dos elementos do menu de navegação no tema Vector',
-	'vector-collapsiblenav-more' => 'Mais línguas',
-	'vector-editwarning-warning' => 'Abandonar esta página pode fazer com que perca todas as suas alterações.
-Se estiver autenticado, pode desactivar este aviso na secção "Edição" das preferências.',
-	'vector-editwarning-preference' => 'Avisar-me ao abandonar uma página editada sem gravar as alterações.',
-	'vector-simplesearch-search' => 'Pesquisa',
-	'vector-simplesearch-containing' => 'contendo...',
-	'vector-noexperiments-preference' => 'Excluir-me da experimentação de funcionalidades',
-	'vector-footercleanup-transclusion' => 'Esta página contém {{PLURAL:$1|transclusão|transclusões}} de {{PLURAL:$1|uma outra página|$1 outras páginas}}.',
-	'vector-footercleanup-templates' => 'Ver predefinições utilizadas nesta página',
-	'vector-footercleanup-categories' => 'Ver categorias ocultas nesta página',
-);
-
-/** Brazilian Portuguese (português do Brasil)
- * @author Daemorris
- * @author Everton137
- * @author Giro720
- * @author Helder.wiki
- * @author Raylton P. Sousa
- */
-$messages['pt-br'] = array(
-	'vector' => 'Melhorias da IU do Vector',
-	'vector-desc' => 'Melhora a interface do usuário do tema Vector', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Ativar o ocultamento de itens no menu de navegação no tema Vector',
-	'vector-collapsiblenav-more' => 'Mais idiomas',
-	'vector-editwarning-warning' => 'Abandonar esta página pode fazer com que você perca todas as alterações que fez.
-Se você estiver autenticado, você pode desabilitar este aviso na seção "Opções de edição" de suas preferências.',
-	'vector-editwarning-preference' => 'Avisar-me quando eu deixar uma janela de edição sem ter salvo as alterações',
-	'vector-simplesearch-search' => 'Pesquisa',
-	'vector-simplesearch-containing' => 'contendo...',
-	'vector-noexperiments-preference' => 'Excluir-me da experimentação de funcionalidades',
-	'vector-footercleanup-transclusion' => 'Esta página contém {{PLURAL:$1|transclusão|transclusões}} de {{PLURAL:$1|uma outra página|$1 outras páginas}}.',
-	'vector-footercleanup-templates' => 'Ver predefinições utilizadas nesta página',
-	'vector-footercleanup-categories' => 'Ver categorias ocultas nesta página',
-);
-
-/** Quechua (Runa Simi)
- * @author AlimanRuna
- */
-$messages['qu'] = array(
-	'vector' => 'Ruraqpaq uyapurapi Vector nisqapaq allinchasqakuna',
-	'vector-desc' => "Vector qarawan llamk'aptiykiqa ruraqpaq uyapuratam allinchan.",
-	'vector-collapsiblenav-preference' => "Vector qarap wamp'unanpi qallawa pakana llamk'anata atichiy",
-	'vector-collapsiblenav-more' => 'Aswan rimaykuna',
-	'vector-editwarning-warning' => "Kay p'anqata saqispaykiqa lliw rurarqusqayki hukchasqakunatachá chinkachiykiman.
-Yaykusqa kaspaykiqa, kay yuyampayta hark'ayta atinki allinkachinaykikunapi \"Llamk'apusqa\" rakipi.",
-	'vector-editwarning-preference' => "Yuyampaway p'anqata saqiptiy manaraq rurarqusqay hukchasqakunata waqaychaspay.",
-	'vector-simplesearch-search' => 'Maskay',
-	'vector-simplesearch-containing' => 'kaykunayuq: ...',
-	'vector-noexperiments-preference' => 'Ñuqawan ama lliplli llanchikukunata ruraychu',
-);
-
-/** Romanian (română)
- * @author AdiJapan
- * @author Minisarm
- */
-$messages['ro'] = array(
-	'vector' => 'Îmbunătățiri la nivelul interfeței Vector',
-	'vector-desc' => 'Îmbunătățiri ale interfeței când se utilizează interfața Vector.',
-	'vector-collapsiblenav-preference' => 'Activează ascunderea elementelor meniului de navigare în interfața Vector',
-	'vector-collapsiblenav-more' => 'Mai multe limbi',
-	'vector-editwarning-warning' => 'Părăsind această pagină, există riscul pierderii modificărilor efectuate.
-Dacă sunteți autentificat, puteți dezactiva această avertizare în secțiunea „Modificare” a preferințelor dumneavoastră.',
-	'vector-editwarning-preference' => 'Avertizează-mă când părăsesc o pagină fără a salva modificările',
-	'vector-simplesearch-search' => 'Căutare',
-	'vector-simplesearch-containing' => 'conținând...',
-	'vector-noexperiments-preference' => 'Nu mai vreau să iau parte la experimente viitoare',
-	'vector-footercleanup-transclusion' => 'Această pagină conține {{PLURAL:$1|o transcludere a |transcluderi ale}} {{PLURAL:$1|unei alte pagini|altor $1 pagini|altor $1 de pagini}}.',
-);
-
-/** tarandíne (tarandíne)
- * @author Joetaras
- */
-$messages['roa-tara'] = array(
-	'vector' => 'Miglioramende UI pe Vector',
-	'vector-desc' => "Migliore l'elemende de l'inderfacce utende quanne ause 'a visualizzazzione Vector",
-	'vector-collapsiblenav-preference' => "Abbilete 'a chiusure de le artichele jndr'à 'u menu de navigazione sus a 'u skin Vector",
-	'vector-collapsiblenav-more' => 'Cchiù linguagge',
-	'vector-simplesearch-search' => 'Cirche',
-	'vector-simplesearch-containing' => 'tène...',
-	'vector-noexperiments-preference' => 'Escludeme da le funziune sperimendale',
-	'vector-footercleanup-transclusion' => "Sta pàgene tène {{PLURAL:$1|inglusione|inglusiune}} de {{PLURAL:$1|'n'otra pàgene|$1 otre pàggene}}.",
-	'vector-footercleanup-templates' => "'Ndruche le template de sta pàgene",
-	'vector-footercleanup-categories' => 'Vide le categorije scunnute sus a sta pàgene',
-);
-
-/** Russian (русский)
- * @author Base
- * @author G0rn
- * @author Ignatus
- * @author KPu3uC B Poccuu
- * @author Kaganer
- * @author MaxSem
- * @author Александр Сигачёв
- */
-$messages['ru'] = array(
-	'vector' => 'Улучшения интерфейса для темы «Векторное»',
-	'vector-desc' => 'Улучшает пользовательский интерфейс для темы оформления «Векторное»',
-	'vector-collapsiblenav-preference' => 'Разрешить сворачивать блоки в левом меню в теме «Векторное»',
-	'vector-collapsiblenav-more' => 'Больше языков',
-	'vector-editwarning-warning' => 'Переход на другую страницу может привести к потере сделанных вами изменений.
-Если вы зарегистрированы в системе, то вы можете отключить это предупреждение в разделе «Редактирование» ваших настроек.',
-	'vector-editwarning-preference' => 'Предупреждать, когда я покидаю страницу с несохранёнными изменениями',
-	'vector-simplesearch-search' => 'Поиск',
-	'vector-simplesearch-containing' => 'содержащие…',
-	'vector-noexperiments-preference' => 'Не предлагать экспериментальные возможности',
-	'vector-footercleanup-transclusion' => 'Эта страница содержит {{PLURAL:$1|включение|включения}} {{PLURAL:$1|другой страницы|$1 других страниц}}.',
-	'vector-footercleanup-templates' => 'Показать шаблоны, используемые этой страницей',
-	'vector-footercleanup-categories' => 'Показать скрытые категории этой страницы',
-);
-
-/** Rusyn (русиньскый)
- * @author Engelseziekte
- * @author Gazeb
- */
-$messages['rue'] = array(
-	'vector' => 'Здоконалїня хосновательского інтерфейсу про Вектор',
-	'vector-desc' => 'Здоконалює елементы хосновательского інтерфейсу Вектор.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Поволити згортати положкы навіґачного меню во взглядї «Векторне»',
-	'vector-collapsiblenav-more' => 'Іншы языкы',
-	'vector-editwarning-warning' => 'Зохаблїнём той стрінкы ся можуть вшыткы учінены зміны стратити.
-Кідь сьте приголошеный, можете тото варованя выпнути на картї „Едітованя“ в хосновательскім інтерфейсї.',
-	'vector-editwarning-preference' => 'Упозорнити ня, кідь буду опущати сторінку без уложіня змін',
-	'vector-simplesearch-search' => 'Глядати',
-	'vector-simplesearch-containing' => 'обсягуючій...',
-	'vector-noexperiments-preference' => 'Не брати участь на експеріментах з новыма функціями',
-);
-
-/** Sanskrit (संस्कृतम्)
- * @author Ansumang
- * @author Shubha
- */
-$messages['sa'] = array(
-	'vector' => 'वाहकाय यु ऐ प्रगतिः',
-	'vector-desc' => 'आकृतिचर्मणः योजकमध्यस्थांशेषु प्रगतिः', # Fuzzy
-	'vector-collapsiblenav-preference' => 'आकृतिचर्मणि पार्श्वदण्डे वस्तुपतनस्य सक्रियता',
-	'vector-collapsiblenav-more' => 'अन्याः भाषाः',
-	'vector-editwarning-warning' => 'अस्मात् पृष्ठात् गमनेन अत्र भवता कृतानि परिवर्तनानि निष्फलानि भवेयुः ।
-भवता यदि प्रविष्टं तर्हि मम इष्टतमानि इत्यत्र अस्मिन् विभागे सम्पादनेन एषः प्रबोधः यथा न आगच्छेत् तथा कर्तुं शक्यते ।',
-	'vector-editwarning-preference' => 'सम्पादनानन्तरं रक्षणेन विना पृष्ठत्यागावसरे स्मार्यताम्',
-	'vector-simplesearch-search' => 'अन्वेषणम्',
-	'vector-simplesearch-containing' => 'विद्यन्ते......',
-	'vector-noexperiments-preference' => 'प्रयोगव्यवस्थातः मां बहिष्करोतु',
-	'vector-footercleanup-transclusion' => 'अस्मिन् पृष्ठे {{PLURAL:$1|one other page|$1 other pages}}इत्येतस्य {{PLURAL:$1|transclusion|transclusions}}विद्यते ।',
-);
-
-/** Sakha (саха тыла)
- * @author HalanTul
- */
-$messages['sah'] = array(
-	'vector' => '"Вектор" диэн тиэмэни тупсарар',
-	'vector-desc' => 'Вектор диэн тиэмэ туттар интерфейсын тупсарыы', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Вектор тиэмэ хаҥас менютугар блоктары куччатары (сворачивание) көҥүллүүргэ',
-	'vector-collapsiblenav-more' => 'Өссө тыллар',
-	'vector-editwarning-warning' => 'Атын сирэйгэ көстөххүнэ билигин оҥорбут уларытыыларыҥ барыта сүтэн хаалыахтара.
-Бэлиэтэммит буоллаҕына, бу сэрэтиини туруорууларыҥ «Уларытыы» сирэйигэр араарыаххын сөп.',
-	'vector-editwarning-preference' => 'Эрэдээксийэлиир сирэйтэн уларытыыларбын бигэргэппэккэ тахсаары гыннахпына сэрэтээр',
-	'vector-simplesearch-search' => 'Көрдөөһүн',
-	'vector-simplesearch-containing' => 'тыл баар ыстатыйалара...',
-	'vector-noexperiments-preference' => 'Эспэримиэн быһыытынан бэриллэр кыахтары туһаммат гын',
-);
-
-/** Sardinian (sardu)
- * @author Andria
- */
-$messages['sc'] = array(
-	'vector-simplesearch-search' => 'Chirca',
-);
-
-/** Sicilian (sicilianu)
- */
-$messages['scn'] = array(
-	'vector-simplesearch-search' => 'Ricerca',
-);
-
-/** Northern Sami (sámegiella)
- * @author Jeblad
- */
-$messages['se'] = array(
-	'vector-simplesearch-search' => 'Oza',
-);
-
-/** Sinhala (සිංහල)
- * @author Budhajeewa
- * @author Calcey
- * @author තඹරු විජේසේකර
- * @author පසිඳු කාවින්ද
- * @author බිඟුවා
- */
-$messages['si'] = array(
-	'vector' => 'දෛශික සඳහා UI දියුණු කිරීම්',
-	'vector-desc' => 'දෛශික පෘෂ්ඨයේ පරිශීලක අතුරු මුහුණත් මූලිකාංග මත දියුණු කරයි', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Vector ඡවියේ ගමන්කෙරුම් මෙනුවේ අංග හැකිළුම සක්‍රීය කරයි',
-	'vector-collapsiblenav-more' => 'තවත් භාෂාවන්',
-	'vector-editwarning-warning' => 'අවධානයට: මෙම පිටුවෙන් නික්ම යාම ඔබ සිදු කළ වෙනස්කම් නැතිවී යෑමට හේතු විය හැක.
-ඔබ ප්‍රවිෂ්ටවී ඇත්නම්, ඔබගේ වරණයන්වල "සංසකරණය කිරීම්" කොටසේ ඇති මෙම අනතුරු ඇඟවීම අක්‍රීය කළ හැක.',
-	'vector-editwarning-preference' => 'මා සංස්කරණ පිටුවක් සුරකිනු නොලැබූ වෙනස්කිරීම් සමඟ අතහැර යන විට අවවාද කරන්න',
-	'vector-simplesearch-search' => 'ගවේශණය කරන්න',
-	'vector-simplesearch-containing' => 'ඇතුළත් වෙමින් පවතී...',
-	'vector-noexperiments-preference' => 'ඉදිරි අත්හදා බැලීම් වලින් මාව බැහැර කරන්න',
-	'vector-footercleanup-templates' => 'මෙම පිටුව මත ඇති සැකිලි නරඹන්න',
-	'vector-footercleanup-categories' => 'මෙම පිටුව මත ඇති සඟවන ලද ප්‍රවර්ගයන් නරඹන්න',
-);
-
-/** Slovak (slovenčina)
- * @author Helix84
- * @author Teslaton
- */
-$messages['sk'] = array(
-	'vector' => 'Vylepšenia použ. rozhrania Vector',
-	'vector-desc' => 'Vylepšuje prvky používateľského rozhrania témy vzhľady Vector', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Povoliť zbaľovanie položiek v navigačnom menu v téme vzhľadu Vector',
-	'vector-collapsiblenav-more' => 'Ďalšie jazyky',
-	'vector-editwarning-warning' => 'Ak opustíte túto stránku, môžete tým stratiť všetky vykonané zmeny.
-Ak ste prihlásený, toto upozornenie môžete vypnúť v sekcii „Úpravy“ svojich nastavení.',
-	'vector-editwarning-preference' => 'Upozorniť ma, keď opúšťam upravovaciu stránku s neuloženými zmenami',
-	'vector-simplesearch-search' => 'Hľadať',
-	'vector-simplesearch-containing' => 'obsahuje...',
-	'vector-noexperiments-preference' => 'Vylúčiť ma z budúcich experimentov',
-	'vector-footercleanup-transclusion' => 'Táto stránka obsahuje {{PLURAL:$1|transklúziu|transklúzie}} $1 {{PLURAL:$1|inej stránky|iných stránok}}.',
-);
-
-/** Slovenian (slovenščina)
- * @author Dbc334
- */
-$messages['sl'] = array(
-	'vector' => 'Izboljšave uporabniškega vmesnika za Vector',
-	'vector-desc' => 'Izboljša uporabniški vmesnik pri uporabi kože Vector.',
-	'vector-collapsiblenav-preference' => 'Omogoči zlaganje vnosov v navigacijskem meniju v koži Vector',
-	'vector-collapsiblenav-more' => 'Več jezikov',
-	'vector-editwarning-warning' => 'Če zapustite stran, boste morda izgubili vse spremembe, ki ste jih naredili.
-Če ste prijavljeni, lahko to opozorilo onemogočite v razdelku »Urejanje« v svojih nastavitvah.',
-	'vector-editwarning-preference' => 'Opozori me, ko skušam zapreti urejevalno polje z neshranjenimi spremembami',
-	'vector-simplesearch-search' => 'Iskanje',
-	'vector-simplesearch-containing' => 'vsebujoč ...',
-	'vector-noexperiments-preference' => 'Izključi me iz prihodnjih preizkusov',
-	'vector-footercleanup-transclusion' => 'Stran vsebuje {{PLURAL:$1|vključitev|vključitvi|vključitve}} $1 {{PLURAL:$1|druge strani|drugih strani}}.',
-	'vector-footercleanup-templates' => 'Ogled predlog na strani',
-	'vector-footercleanup-categories' => 'Ogled skritih kategorij na strani',
-);
-
-/** Somali (Soomaaliga)
- * @author Maax
- */
-$messages['so'] = array(
-	'vector-simplesearch-search' => 'Raadi',
-);
-
-/** Albanian (shqip)
- * @author Mikullovci11
- * @author Olsi
- */
-$messages['sq'] = array(
-	'vector' => 'Përmirësime UI për Vector',
-	'vector-desc' => 'Përmirësime në elementet e ndërfaqes së përdoruesit të pamjes Vector.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Aktivizoni mbylljen e artikujve në menunë e navigimit në pamjen Vector',
-	'vector-collapsiblenav-more' => 'Gjuhët tjera',
-	'vector-editwarning-warning' => 'Lënia e kësaj faqeje mund t\'ju shkaktojë humbjen e çdo ndryshimi që keni bërë.
-Nëse keni hyrë brenda, ju mund ta hiqni këtë paralajmërim në seksionin "Redaktimi" tek preferencat tuaja.',
-	'vector-editwarning-preference' => 'Më paralajmëro kur unë lë një redaktim faqeje me ndryshime të paruajtura',
-	'vector-simplesearch-search' => 'Kërko',
-	'vector-simplesearch-containing' => 'përmban ...',
-);
-
-/** Serbian (Cyrillic script) (српски (ћирилица)‎)
- * @author Helios13
- * @author Rancher
- * @author Жељко Тодоровић
- */
-$messages['sr-ec'] = array(
-	'vector' => 'Побољшања корисничког интерфејса за вектор',
-	'vector-desc' => 'Побољшава корисничке елементе сучеља за пресвлаку Вектор.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Расклапање ставки у бочној траци у теми „Векторско“',
-	'vector-collapsiblenav-more' => 'Више језика:',
-	'vector-editwarning-warning' => 'Ако напустите ову страницу, изгубићете све измене које сте направили.
-Ако сте пријављени, можете онемогућити ово упозорење у својим подешавањима, у одељку „Уређивање“.',
-	'vector-editwarning-preference' => 'Упозори ме када напустим страницу која није сачувана',
-	'vector-simplesearch-search' => 'Претрага',
-	'vector-simplesearch-containing' => 'садржи...',
-	'vector-noexperiments-preference' => 'Изузми ме из пробних могућности',
-	'vector-footercleanup-transclusion' => 'Ова страница садржи {{PLURAL:$1|укључивање|укључивања}} на још $1 {{PLURAL:$1|другу страницу|друге странице|других страница}}.',
-);
-
-/** Serbian (Latin script) (srpski (latinica)‎)
- * @author Liangent
- */
-$messages['sr-el'] = array(
-	'vector' => 'Poboljšanja korisničkog interfejsa za vektor',
-	'vector-desc' => 'Poboljšava korisničke elemente sučelja za presvlaku Vektor.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Skupljanje stavki navigacionog menija u Vector presvlaci',
-	'vector-collapsiblenav-more' => 'Još jezika:',
-	'vector-editwarning-warning' => 'Ako napustite ovu stranicu, izgubićete sve izmene koje ste napravili.
-Ako ste prijavljeni, možete onemogućiti ovo upozorenje u svojim podešavanjima, u odeljku „Uređivanje“.',
-	'vector-editwarning-preference' => 'Upozori me kada napustim stranicu sa nesačuvanim promenama',
-	'vector-simplesearch-search' => 'Pretraga',
-	'vector-simplesearch-containing' => 'sadrži...',
-	'vector-noexperiments-preference' => 'Izuzmi me iz probnih mogućnosti',
-	'vector-footercleanup-transclusion' => 'Ova stranica sadrži {{PLURAL:$1|uključivanje|uključivanja}} na još $1 {{PLURAL:$1|drugu stranicu|druge stranice|drugih stranica}}.', # Fuzzy
-);
-
-/** Seeltersk (Seeltersk)
- * @author Pyt
- */
-$messages['stq'] = array(
-	'vector-simplesearch-search' => 'Säik',
-	'vector-simplesearch-containing' => 'Fultextsäike ätter ...',
-);
-
-/** Sundanese (Basa Sunda)
- * @author Kandar
- */
-$messages['su'] = array(
-	'vector-collapsiblenav-more' => 'Basa lianna',
-	'vector-editwarning-preference' => 'Béjaan kuring lamun ninggalkeun kaca édit anu parobahanana can disimpen',
-	'vector-simplesearch-search' => 'Sungsi',
-	'vector-simplesearch-containing' => 'ngandung...',
-);
-
-/** Swedish (svenska)
- * @author Ainali
- * @author Boivie
- * @author MagnusA
- * @author Martinwiss
- */
-$messages['sv'] = array(
-	'vector' => 'Användargränssnittsförbättringar för Vector',
-	'vector-desc' => 'Förbättrar användargränssnittet när man använder Vector-utseendet',
-	'vector-collapsiblenav-preference' => 'Aktivera hopfällning av poster i navigeringsmenyn i Vector-utseendet',
-	'vector-collapsiblenav-more' => 'Fler språk',
-	'vector-editwarning-warning' => 'Om du lämnar den här sidan kommer du att förlora alla ändringar du har gjort.
-Om du är inloggad kan du slå av den här varningen under "Redigering" i dina inställningar.',
-	'vector-editwarning-preference' => 'Varna mig om jag lämnar en redigeringssida där jag gjort ändringar men inte sparat.',
-	'vector-simplesearch-search' => 'Sök',
-	'vector-simplesearch-containing' => 'innehåller...',
-	'vector-noexperiments-preference' => 'Uteslut mig från funktionsexperiment',
-	'vector-footercleanup-transclusion' => 'Denna sida innehåller {{PLURAL:$1| transklusion|transklusioner}} av {{PLURAL:$1|en annan sida| $1 andra sidor}}.',
-	'vector-footercleanup-templates' => 'Visa mallar på den här sidan',
-	'vector-footercleanup-categories' => 'Visa dolda kategorier på den här sidan',
-);
-
-/** Swahili (Kiswahili)
- * @author Lloffiwr
- * @author Muddyb Blast Producer
- */
-$messages['sw'] = array(
-	'vector' => 'Mabadiliko ya kuendeleza kusano ya Vector',
-	'vector-desc' => 'Inaboresha kusano kwa ajili ya watumiaji wa umbo la Vector.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Kuwezesha vitu vikunjike katika orodha ya urambazaji, katika umbo la Vector',
-	'vector-collapsiblenav-more' => 'Lugha zingine',
-	'vector-editwarning-warning' => 'Ukitoka kwenye ukurasa huu labda utapoteza madabiliko uliyoyafanya.
-Unaweza kuondoa ilani hii ukienda kwenye sehemu ya "Kuhariri" kwenye mapendekezo yako.',
-	'vector-editwarning-preference' => 'Unionyeshe ilani ninapotaka kutoka kwenye ukurasa ninouhariri, bila kuhifadhi mabadiliko',
-	'vector-simplesearch-search' => 'Kutafuta',
-	'vector-simplesearch-containing' => 'ya maneno...',
-);
-
-/** Tamil (தமிழ்)
- * @author Sodabottle
- * @author TRYPPN
- * @author மதனாஹரன்
- */
-$messages['ta'] = array(
-	'vector-collapsiblenav-more' => 'மேலும் அதிகமான மொழிகள்',
-	'vector-editwarning-preference' => 'தொகுத்துக் கொண்டிருக்கும் பக்கத்தை சேமிக்காமல் வெளியேறினால் எனக்கு எச்சரிக்கை செய்',
-	'vector-simplesearch-search' => 'தேடு',
-	'vector-simplesearch-containing' => 'கொண்டுள்ளது...',
-	'vector-noexperiments-preference' => 'வசதிப் பரிசோதனைகளிலிருந்து என்னை விலக்கவும்',
-);
-
-/** Telugu (తెలుగు)
- * @author Veeven
- */
-$messages['te'] = array(
-	'vector' => 'వెక్టర్ కొరకు ముఖాంతరపు మెరుగులు',
-	'vector-collapsiblenav-more' => 'మరిన్ని భాషలు',
-	'vector-editwarning-warning' => 'ఈ పేజీని వదిలివెళ్ళడం వల్ల మీరు చేసిన మార్పులను కోల్పోయే అవకాశం ఉంది.
-మీరు ప్రవేశించివుంటే, ఈ హెచ్చరికని మీ అభిరుచులలో "మరపులు" అనే విభాగంలో అచేతనం చేసుకోవచ్చు.',
-	'vector-editwarning-preference' => 'ఏదైనా పేజీని నేను వదిలివెళ్తున్నప్పుడు దానిలో భద్రపరచని మార్పులు ఉంటే నన్ను హెచ్చరించు',
-	'vector-simplesearch-search' => 'వెతుకు',
-);
-
-/** Thai (ไทย)
- * @author Horus
- * @author Octahedron80
- * @author Woraponboonkerd
- */
-$messages['th'] = array(
-	'vector-desc' => 'ข้อปรับปรุงองค์ประกอบอินเตอร์เฟซผู้ใช้ของสกินเวกเตอร์', # Fuzzy
-	'vector-collapsiblenav-preference' => 'ใช้งานการย่อรายการของเมนูนำทางในสกินเวกเตอร์',
-	'vector-collapsiblenav-more' => 'ภาษาอื่นๆ',
-	'vector-editwarning-warning' => 'การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณกระทำสูญหาย
-ถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน "การแก้ไข" ในการตั้งค่าของคุณ',
-	'vector-editwarning-preference' => 'เตือนฉัน เมื่อฉันกำลังจะออกจากหน้าแก้ไขโดยมีข้อมูลที่ยังไม่ได้บันทึก',
-	'vector-simplesearch-search' => 'ค้นหา',
-	'vector-simplesearch-containing' => 'ประกอบไปด้วย...',
-);
-
-/** Turkmen (Türkmençe)
- * @author Hanberke
- */
-$messages['tk'] = array(
-	'vector' => 'Vector üçin interfeýs gowulandyrmalary',
-	'vector-collapsiblenav-more' => 'Has köp dil',
-	'vector-simplesearch-search' => 'Gözleg',
-	'vector-simplesearch-containing' => 'öz içine alýar...',
-);
-
-/** Tagalog (Tagalog)
- * @author AnakngAraw
- */
-$messages['tl'] = array(
-	'vector' => 'Mga pagpapainam na UI para sa Vector',
-	'vector-desc' => 'Nagpapainam sa mga sangkap ng dugtungang-mukha na pangtatagamit ng pabalat ng Vector.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'Paganahin ang pagkanatitiklop ng mga bagay na nasa loob ng talaang panglibot sa loob ng pabalat na Vector',
-	'vector-collapsiblenav-more' => 'Iba pang mga wika',
-	'vector-editwarning-warning' => 'Ang paglisan mula sa pahinang ito ay maaaring makasanhi sa iyo ng pagkawala ng anumang mga pagbabagong ginawa mo.
-Kung nakalagda ka, maaari mong huwag paganahin ang babalang ito sa loob ng seksyong "May binabago" ng mga nais mo.',
-	'vector-editwarning-preference' => 'Magbabala sa akin kapag umalis ako sa isang pahina ng pampatnugot na hindi pa nasasagip ang mga pagbabago',
-	'vector-simplesearch-search' => 'Maghanap',
-	'vector-simplesearch-containing' => 'naglalaman ng ...',
-	'vector-noexperiments-preference' => 'Huwag akong isali sa tampok na mga eksperimento',
-	'vector-footercleanup-transclusion' => 'Ang pahinang ito ay naglalaman ng {{PLURAL:$1|transklusyon|mga transklusyon}} ng {{PLURAL:$1|isang ibang pahina|$1 ibang mga pahina}}.',
-);
-
-/** Tok Pisin (Tok Pisin)
- * @author Iketsi
- */
-$messages['tpi'] = array(
-	'vector-simplesearch-search' => 'Painim',
-);
-
-/** Turkish (Türkçe)
- * @author Emperyan
- * @author Hcagri
- * @author Karduelis
- * @author Srhat
- * @author Vito Genovese
- */
-$messages['tr'] = array(
-	'vector' => 'Vector için kullanıcı arabirimi iyileştirmeleri',
-	'vector-desc' => 'Vector görünümünün kullanıcı arayüzü bileşenlerini geliştirir',
-	'vector-collapsiblenav-preference' => 'Vector temasında kenar çubuğundaki ögelerin daraltılmasını etkinleştir',
-	'vector-collapsiblenav-more' => 'Diğer diller',
-	'vector-editwarning-warning' => 'Bu sayfadan ayrılmak yaptığınız herhangi bir değişikliği kaybetmenize sebep olabilir.
-Eğer giriş yaptıysanız, bu uyarıyı, tercihlerinizin "Sayfa yazma alanı" bölümünde devre dışı bırakabilirsiniz.',
-	'vector-editwarning-preference' => 'Kaydedilmemiş değişikliğe sahip bir değişiklik sayfasından çıkarken beni uyar',
-	'vector-simplesearch-search' => 'Ara',
-	'vector-simplesearch-containing' => 'içeren...',
-	'vector-noexperiments-preference' => 'Beni gelecekteki deneylere dahil etme',
-	'vector-footercleanup-templates' => 'Bu sayfada kullanılan şablonları göster',
-	'vector-footercleanup-categories' => 'Bu sayfadaki gizli kategorileri göster',
-);
-
-/** Turoyo (Ṫuroyo)
- * @author Ariyo
- */
-$messages['tru'] = array(
-	'vector-simplesearch-search' => 'Kruxyo',
-);
-
-/** Tatar (Cyrillic script) (татарча)
- * @author Ильнар
- */
-$messages['tt-cyrl'] = array(
-	'vector' => '«Сызымлы» бизәлеше өчен яңартулар',
-	'vector-collapsiblenav-preference' => '«Сызымлы» бизәлеше өчен сул менюдагы блокларны ябарга рөхсәт итү',
-	'vector-collapsiblenav-more' => 'Башка телләр',
-	'vector-editwarning-warning' => 'Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.
-Әгәрдә сез теркәлгән булсагыз, бу искәрмәне сез «Көйләнмәләрем» өлешендә үзгәртә аласыз.',
-	'vector-editwarning-preference' => 'Битне сакламыйча китү вакытында мине кисәтергә',
-	'vector-simplesearch-search' => 'Эзләү',
-	'vector-simplesearch-containing' => 'эчтәлек...',
-	'vector-noexperiments-preference' => 'Тикшерүдәге мөмкинлекләрне кулланмаска',
-);
-
-/** Central Atlas Tamazight (ⵜⴰⵎⴰⵣⵉⵖⵜ)
- * @author Tifinaghes
- */
-$messages['tzm'] = array(
-	'vector-collapsiblenav-more' => 'ⵓⴳⴰⵔ ⵏ ⵜⵓⵜⵍⴰⵢⵉⵏ',
-	'vector-simplesearch-search' => 'ⴰⵔⵣⵣⵓ',
-);
-
-/** Uyghur (Arabic script) (ئۇيغۇرچە)
- * @author Sahran
- */
-$messages['ug-arab'] = array(
-	'vector-collapsiblenav-more' => 'تېخىمۇ كۆپ تىللار',
-	'vector-simplesearch-search' => 'ئىزدە',
-	'vector-simplesearch-containing' => 'ئىچىدە…',
-);
-
-/** Ukrainian (українська)
- * @author AS
- * @author Base
- * @author Microcell
- * @author Olvin
- * @author Prima klasy4na
- */
-$messages['uk'] = array(
-	'vector' => 'Удосконалення інтерфейсу користувача за допомогою «векторного» оформлення',
-	'vector-desc' => 'Покращує інтерфейс користувача для оформлення «Вектор»',
-	'vector-collapsiblenav-preference' => 'Дозволити згортання бічного меню в оформленні «Векторне»',
-	'vector-collapsiblenav-more' => 'Інші мови',
-	'vector-editwarning-warning' => 'Перехід на іншу сторінку призведе до втрати ваших змін.
-Якщо ви ввійшли до системи, то ви можете відключити це попередження в розділі «Редагування» ваших налаштувань.',
-	'vector-editwarning-preference' => 'Попереджати мене, якщо я залишаю сторінку редагування з незбереженими змінами',
-	'vector-simplesearch-search' => 'Пошук',
-	'vector-simplesearch-containing' => 'що містять...',
-	'vector-noexperiments-preference' => 'Відмовитись від випробування технічних експериментів',
-	'vector-footercleanup-transclusion' => 'Ця сторінка містить {{PLURAL:$1|включення|включення|включень}} інших сторінок',
-	'vector-footercleanup-templates' => 'Показати шаблони, що використовує ця сторінка',
-	'vector-footercleanup-categories' => 'Показати приховані категорії на цій сторінці',
-);
-
-/** Urdu (اردو)
- * @author පසිඳු කාවින්ද
- */
-$messages['ur'] = array(
-	'vector-desc' => 'صارف انٹرفیس کے عناصر ویکٹر جلد کے پر بہتر ہے.', # Fuzzy
-	'vector-collapsiblenav-preference' => 'فعال حصہ ویکٹر جلد میں سائڈبار میں آئیٹمز کی',
-	'vector-collapsiblenav-more' => 'مزید زبانوں میں',
-	'vector-editwarning-preference' => 'خبردار مجھے جب میں غیر محفوظ کردہ تبدیلیوں کے ساتھ ایک ترمیم کے صفحے کو چھوڑ دو',
-	'vector-simplesearch-search' => 'تلاش',
-);
-
-/** Uzbek (oʻzbekcha)
- * @author CoderSI
- * @author Sociologist
- */
-$messages['uz'] = array(
-	'vector-collapsiblenav-preference' => '«Vektor» tashqi koʻrinishida chap menyudagi boʻlimlarni yashirishga ruxsat berish',
-	'vector-simplesearch-search' => 'Qidiruv',
-	'vector-noexperiments-preference' => 'Tajribaviy imkoniyatlarni tavsiya qilmaslik',
-);
-
-/** vèneto (vèneto)
- * @author Candalua
- * @author GatoSelvadego
- * @author Vajotwo
- */
-$messages['vec'] = array(
-	'vector' => 'Mejoramenti de interfacia utente (UI) par el Vector.',
-	'vector-desc' => "Potensia l'interfacia utente có se dopara el tema Vector",
-	'vector-collapsiblenav-preference' => 'Abiłita menù de navigaxion nascondibiłe par ła skin Vector',
-	'vector-collapsiblenav-more' => 'Pì łengue',
-	'vector-editwarning-warning' => 'Se te vè via da sta pagina te podaressi pèrdar tute le modìfeghe che te ghè fato.
-Se te sì loggà, te poli disabilitar sto aviso in te la sezion "Dimension de la casela de modifica" de le to preferense.',
-	'vector-editwarning-preference' => 'Dime se sto lassando na pagina de modifica sensa aver salvà',
-	'vector-simplesearch-search' => 'Serca',
-	'vector-simplesearch-containing' => 'che contien...',
-	'vector-noexperiments-preference' => 'Escludame da łe funsionałità sperimentałi',
-	'vector-footercleanup-transclusion' => "Sta pàjina ła contien {{PLURAL:$1|n'incluxion|de łe incluxion}} de {{PLURAL:$1|n'altra pàjina|$1 altre pàjine}}.",
-	'vector-footercleanup-templates' => 'Mostra i modełi de sta pàjina',
-	'vector-footercleanup-categories' => 'Mostra łe categorie sconte de sta pàjina',
-);
-
-/** Veps (vepsän kel’)
- */
-$messages['vep'] = array(
-	'vector-simplesearch-search' => 'Ectä',
-	'vector-simplesearch-containing' => 'mülütajad...',
-);
-
-/** Vietnamese (Tiếng Việt)
- * @author Minh Nguyen
- * @author Vinhtantran
- */
-$messages['vi'] = array(
-	'vector' => 'Giao diện tích hợp với Vectơ',
-	'vector-desc' => 'Hoàn thiện giao diện khi sử dụng hình dạng Vectơ',
-	'vector-collapsiblenav-preference' => 'Bật trình đơn chuyển hướng gấp lại được ở bên phải trong bề ngoài Vectơ',
-	'vector-collapsiblenav-more' => 'Thêm ngôn ngữ khác',
-	'vector-editwarning-warning' => 'Rời khỏi trang này sẽ khiến bạn mất các sửa đổi đã thực hiện.
-Nếu đã đăng nhập, bạn có thể tắt cảnh báo này tại mục “Sửa đổi” trong tùy chọn cá nhân.',
-	'vector-editwarning-preference' => 'Cảnh báo khi tôi thoát trang sửa đổi mà chưa lưu trang',
-	'vector-simplesearch-search' => 'Tìm kiếm',
-	'vector-simplesearch-containing' => 'có chứa…',
-	'vector-noexperiments-preference' => 'Loại trừ tôi khỏi các thí nghiệm tính năng',
-	'vector-footercleanup-transclusion' => 'Trang này nhúng nội dung của {{PLURAL:$1|một trang khác|$1 trang khác}}.',
-	'vector-footercleanup-templates' => 'Xem các bản mẫu dùng trong trang này',
-	'vector-footercleanup-categories' => 'Xem các thể loại ẩn gồm trang này',
-);
-
-/** Volapük (Volapük)
- * @author Malafaya
- */
-$messages['vo'] = array(
-	'vector-collapsiblenav-more' => 'Püks pluik',
-	'vector-simplesearch-search' => 'Suk',
-	'vector-simplesearch-containing' => 'ninädöl...',
-);
-
-/** Walloon (walon)
- * @author Srtxg
- */
-$messages['wa'] = array(
-	'vector' => "Amidraedjes di l' eterface pol pea «Vector»",
-	'vector-desc' => "Amidraedjes pol pea d' eterface d' uzeu «Vector»", # Fuzzy
-	'vector-collapsiblenav-preference' => "Permete d' erôler les cayets del båre di costé avou l' pea «Vector»",
-	'vector-collapsiblenav-more' => 'Pus di lingaedjes',
-	'vector-editwarning-warning' => "Cwiter cisse pådje ci vos frè piede tos les candjmints ki vos avoz fwait.
-Si vos estoz elodjî, vos ploz dismete cist adviertixhmint ci dins l' linwete «Boesse di tecse» di vos preferinces.",
-	'vector-editwarning-preference' => "M' advierti cwand dji cwite ene pådje k' a des candjmints nén schapés",
-	'vector-simplesearch-search' => 'Cweri',
-	'vector-simplesearch-containing' => 'ki contént...',
-	'vector-noexperiments-preference' => 'Mi rsaetchî des esperyinces di fonccionalité',
-	'vector-footercleanup-transclusion' => "Cisse pådje ci a {{PLURAL:$1|on ravalé elemint|des ravalés elemints}} vnant d' {{PLURAL:$1|ene ôte pådje|$1 ôtès pådjes}}.",
-);
-
-/** Mingrelian (მარგალური)
- */
-$messages['xmf'] = array(
-	'vector-simplesearch-search' => 'გორუა',
-);
-
-/** Yiddish (ייִדיש)
- * @author פוילישער
- */
-$messages['yi'] = array(
-	'vector' => 'באַניצער־אויבערפֿלאַך פֿאַרבעסערונגען פֿאַר וועקטאר',
-	'vector-desc' => 'פֿאַרבעסערט דעם באניצער אויבערפֿלאַך ווען מען ניצט די וועקטאר ווײַזונג.',
-	'vector-collapsiblenav-preference' => 'אַקטיווירן צונויפֿלייגן איינהייטן אינעם נאַוויגאַציע מעניו אין דעם וועקטאר געשטעל',
-	'vector-collapsiblenav-more' => 'נאך שפראַכן',
-	'vector-editwarning-warning' => 'איבערלאזן דעם בלאט קען גורם זײַן פֿארלירן אײַערע ענדערונגען.
-אויב איר זענט ארײַנלאגירט, קענט איר מבטל זײַן די דאזיגע ווארענונג אין דער "באארבעטן" אפטיילונג פון אײַערע פרעפערענצן.',
-	'vector-editwarning-preference' => 'שטעלן א ווארענונג ווען איך לאז איבער א רעדאקטירונג בלאט מיט נישט אויפגעהיטענע ענדערונגען',
-	'vector-simplesearch-search' => 'זוכן',
-	'vector-simplesearch-containing' => 'כולל…',
-	'vector-footercleanup-templates' => 'ווײַזן מוסטער אויף דעם בלאט',
-	'vector-footercleanup-categories' => 'ווײַזן באהאלטענע קאטעגאריעס אויף דעם בלאט',
-);
-
-/** Yoruba (Yorùbá)
- * @author Demmy
- */
-$messages['yo'] = array(
-	'vector' => 'Àwọn ìmúdára UI fún Vector',
-	'vector-collapsiblenav-more' => 'Àwọn èdè lẹ́kùúnrẹ́rẹ́',
-	'vector-editwarning-warning' => 'Kíkúrò ní ojúewé yìí yíò jẹ́ kí ẹ pòfo àwọn àtúnṣe tí ẹ ti ṣe.
-Tó bá jẹ́ pé ẹ ti wọlé, ẹ lè dẹ́kun ìkìlọ̀ yìí nínù abala "Àtúnṣe ṣíṣe" ti àwọn ìfẹ́ràn yín.',
-	'vector-editwarning-preference' => 'Kìlọ̀ fún mi tí mo bá únkúrò ní ojúewé àtúnṣe láì tíì mupamọ́',
-	'vector-simplesearch-search' => 'Ṣàwárí',
-	'vector-simplesearch-containing' => 'tó ní...',
-);
-
-/** Cantonese (粵語)
- * @author Horacewai2
- * @author Waihorace
- */
-$messages['yue'] = array(
-	'vector' => '對於Vector嘅界面改進',
-	'vector-desc' => '改進Vector畫面嘅界面元素。', # Fuzzy
-	'vector-collapsiblenav-preference' => '用可折疊導航列',
-	'vector-collapsiblenav-more' => '更多語言',
-	'vector-editwarning-warning' => '離開呢一版會令到你嘅修改唔見咗。
-你可以響你嘅喜好設定嘅"編輯中"小節度停用呢個警告。',
-	'vector-editwarning-preference' => '當我離開未保存好嘅修改嗰陣警告我',
-	'vector-simplesearch-search' => '搵嘢',
-	'vector-simplesearch-containing' => '名單傳送緊...',
-);
-
-/** Simplified Chinese (中文（简体）‎)
- * @author Bencmq
- * @author Dimension
- * @author Liangent
- * @author Onecountry
- * @author Xiaomingyan
- * @author Yfdyh000
- * @author 阿pp
- */
-$messages['zh-hans'] = array(
-	'vector' => 'Vector用户界面改进',
-	'vector-desc' => '改进Vector皮肤中的用户界面元素',
-	'vector-collapsiblenav-preference' => '在Vector皮肤的导航菜单中折叠项目',
-	'vector-collapsiblenav-more' => '更多语言',
-	'vector-simplesearch-search' => '搜索',
-	'vector-simplesearch-containing' => '含有...',
-	'vector-noexperiments-preference' => '功能实验中排除我',
-	'vector-footercleanup-transclusion' => '此页{{PLURAL:$1|嵌入包含}}有{{PLURAL:$1|一个其他页面|$1个其他页面}}。',
-	'vector-footercleanup-templates' => '查看该页面使用的模板',
-	'vector-footercleanup-categories' => '查看该页面的隐藏分类',
-);
-
-/** Traditional Chinese (中文（繁體）‎)
- * @author Bencmq
- * @author Gaoxuewei
- * @author Liangent
- * @author Mark85296341
- * @author Simon Shek
- * @author Waihorace
- * @author Wrightbus
- */
-$messages['zh-hant'] = array(
-	'vector' => 'Vector 使用者介面改進',
-	'vector-desc' => '改善 Vector 外觀的使用者介面元素。',
-	'vector-collapsiblenav-preference' => '在 Vector 外觀的導覽選單中摺疊項目',
-	'vector-collapsiblenav-more' => '更多語言',
-	'vector-editwarning-warning' => '離開這個頁面可能會令您失去之前的所有更改。若您已經登入，您可在您偏好設定的「編輯」節中關閉此警告。',
-	'vector-editwarning-preference' => '當我在更改未儲存時離開頁面時警告我',
-	'vector-simplesearch-search' => '搜尋',
-	'vector-simplesearch-containing' => '包含...',
-	'vector-noexperiments-preference' => '我不參與功能實險',
-	'vector-footercleanup-transclusion' => '此頁{{PLURAL:$1|嵌入包含}}有{{PLURAL:$1|一|$1}}個其他頁面。',
-	'vector-footercleanup-templates' => '查看該頁調用的模板',
-	'vector-footercleanup-categories' => '查看該頁所屬的隱藏類別',
-);
diff --git a/extensions/Vector/Vector.php b/extensions/Vector/Vector.php
deleted file mode 100644
index a7e24673..00000000
--- a/extensions/Vector/Vector.php
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php
-/**
- * Vector extension
- * 
- * @file
- * @ingroup Extensions
- * 
- * @author Trevor Parscal <trevor@wikimedia.org>
- * @author Roan Kattouw <roan.kattouw@gmail.com>
- * @author Nimish Gautam <nimish@wikimedia.org>
- * @author Adam Miller <amiller@wikimedia.org>
- * @license GPL v2 or later
- * @version 0.3.0
- */
-
-/* Configuration */
-
-// Each module may be configured individually to be globally on/off or user preference based
-$wgVectorFeatures = array(
-	'collapsiblenav' => array( 'global' => true, 'user' => true ),
-	'collapsibletabs' => array( 'global' => true, 'user' => false ),
-	// The follwing are experimental and likely unstable - use at your own risk
-	'expandablesearch' => array( 'global' => false, 'user' => false ),
-	'footercleanup' => array( 'global' => false, 'user' => false ),
-	'sectioneditlinks' => array( 'global' => false, 'user' => false ),
-);
-
-// The Vector skin has a basic version of simple search, which is a prerequisite for the enhanced one
-$wgDefaultUserOptions['vector-simplesearch'] = 1;
-
-// Enable bucket testing for new version of collapsible nav
-$wgCollapsibleNavBucketTest = false;
-// Force the new version
-$wgCollapsibleNavForceNewVersion = false;
-
-// Enable bucket testing for new version of section edit links
-$wgVectorSectionEditLinksBucketTest = false;
-// Percentage of users who's use of section edit links will be tracked - half of which will see the
-// new section edit links - default 5%
-$wgVectorSectionEditLinksLotteryOdds = 5;
-// Version number of the current experiment - Buckets from previous experiments will be overwritten
-// with new values when this is incremented, so as to allow accurate re-distribution. When changing
-// the lottery odds, this needs to change too, or you will have inaccurate data.
-$wgVectorSectionEditLinksExperiment = 0;
-
-/* Setup */
-
-$wgExtensionCredits['other'][] = array(
-	'path' => __FILE__,
-	'name' => 'Vector',
-	'author' => array( 'Trevor Parscal', 'Roan Kattouw', 'Nimish Gautam', 'Adam Miller' ),
-	'version' => '0.3.0',
-	'url' => 'https://www.mediawiki.org/wiki/Extension:Vector',
-	'descriptionmsg' => 'vector-desc',
-);
-$wgAutoloadClasses['VectorHooks'] = dirname( __FILE__ ) . '/Vector.hooks.php';
-$wgExtensionMessagesFiles['Vector'] = dirname( __FILE__ ) . '/Vector.i18n.php';
-$wgHooks['BeforePageDisplay'][] = 'VectorHooks::beforePageDisplay';
-$wgHooks['GetPreferences'][] = 'VectorHooks::getPreferences';
-$wgHooks['ResourceLoaderGetConfigVars'][] = 'VectorHooks::resourceLoaderGetConfigVars';
-$wgHooks['MakeGlobalVariablesScript'][] = 'VectorHooks::makeGlobalVariablesScript';
-
-$vectorResourceTemplate = array(
-	'localBasePath' => dirname( __FILE__ ) . '/modules',
-	'remoteExtPath' => 'Vector/modules',
-	'group' => 'ext.vector',
-);
-$wgResourceModules += array(
-	// TODO this module should be merged with ext.vector.collapsibleTabs
-	'jquery.collapsibleTabs' => $vectorResourceTemplate + array(
-		'scripts' => 'jquery.collapsibleTabs.js',
-		'dependencies' => 'jquery.delayedBind',
-	),
-	'ext.vector.collapsibleNav' => $vectorResourceTemplate + array(
-		'scripts' => 'ext.vector.collapsibleNav.js',
-		'styles' => 'ext.vector.collapsibleNav.css',
-		'messages' => array(
-			'vector-collapsiblenav-more',
-		),
-		'dependencies' => array(
-			'mediawiki.util',
-			'jquery.client',
-			'jquery.cookie',
-			'jquery.tabIndex',
-		),
-	),
-	'ext.vector.collapsibleTabs' => $vectorResourceTemplate + array(
-		'scripts' => 'ext.vector.collapsibleTabs.js',
-		'dependencies' => array(
-			'jquery.collapsibleTabs',
-			'jquery.delayedBind',
-		),
-	),
-	'ext.vector.expandableSearch' => $vectorResourceTemplate + array(
-		'scripts' => 'ext.vector.expandableSearch.js',
-		'styles' => 'ext.vector.expandableSearch.css',
-		'dependencies' => array(
-			'jquery.client',
-			'jquery.expandableField',
-			'jquery.delayedBind',
-		),
-	),
-	'ext.vector.footerCleanup' => $vectorResourceTemplate + array(
-		'scripts' => array(
-			'jquery.footerCollapsibleList.js',
-			'ext.vector.footerCleanup.js',
-		),
-		'styles' => 'ext.vector.footerCleanup.css',
-		'messages' => array (
-			'vector-footercleanup-transclusion',
-			'vector-footercleanup-templates',
-			'vector-footercleanup-categories',
-		),
-		'dependencies' => array(
-			// The message require plural support at javascript.
-			'mediawiki.jqueryMsg',
-			'jquery.cookie'
-		),
-		'position' => 'top',
-	),
-	'ext.vector.sectionEditLinks' => $vectorResourceTemplate + array(
-		'scripts' => 'ext.vector.sectionEditLinks.js',
-		'styles' => 'ext.vector.sectionEditLinks.css',
-		'dependencies' => array(
-			'jquery.cookie',
-		),
-	),
-);
-
diff --git a/extensions/Vector/modules/ext.vector.collapsibleNav.css b/extensions/Vector/modules/ext.vector.collapsibleNav.css
deleted file mode 100644
index b9c27355..00000000
--- a/extensions/Vector/modules/ext.vector.collapsibleNav.css
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * Stylesheet for collapsible nav
- * NOTE: Please remove all the h5 selectors at some point as they are only for
- *   backwards-compatibility due to html caching. --2012-11-28
- */
-
-#mw-panel.collapsible-nav .portal {
-	/* @embed */
-	background: url(images/portal-break.png) left top no-repeat;
-	padding: 0.25em 0 !important;
-	margin: -11px 9px 10px 11px;
-}
-
-#mw-panel.collapsible-nav .portal h3,
-#mw-panel.collapsible-nav .portal h5 {
-	color: #4D4D4D;
-	font-weight: normal;
-	/* @embed */
-	background: url(images/open.png) left center no-repeat;
-	padding: 4px 0 3px 1.5em;
-	margin-bottom: 0;
-}
-
-#mw-panel.collapsible-nav .portal h3:hover,
-#mw-panel.collapsible-nav .portal h5:hover {
-	cursor: pointer;
-	text-decoration: none;
-}
-
-#mw-panel.collapsible-nav .portal h3 a,
-#mw-panel.collapsible-nav .portal h5 a {
-	color: #4D4D4D;
-	text-decoration: none;
-}
-
-#mw-panel.collapsible-nav .portal .body {
-	background: none !important;
-	padding-top: 0;
-	display: none;
-}
-
-#mw-panel.collapsible-nav .portal .body ul li {
-	padding: 0.25em 0;
-}
-
-/* First */
-#mw-panel.collapsible-nav .portal.first h3,
-#mw-panel.collapsible-nav .portal.first h5 {
-	display: none;
-}
-
-#mw-panel.collapsible-nav .portal.first {
-	background-image: none;
-	margin-top: 0;
-}
-
-/* Persistent */
-
-#mw-panel.collapsible-nav .portal.persistent .body {
-	display: block;
-}
-
-#mw-panel.collapsible-nav .portal.persistent h3,
-#mw-panel.collapsible-nav .portal.persistent h5 {
-	background: none !important;
-	padding-left: 0.7em;
-	cursor: default;
-}
-
-#mw-panel.collapsible-nav .portal.persistent .body {
-	margin-left: 0.5em;
-}
-
-/* Collapsed */
-
-#mw-panel.collapsible-nav .portal.collapsed h3,
-#mw-panel.collapsible-nav .portal.collapsed h5 {
-	color: #0645AD;
-	/* @embed */
-	background: url(images/closed-ltr.png) left center no-repeat;
-	margin-bottom: 0;
-}
-
-#mw-panel.collapsible-nav .portal.collapsed h3 a,
-#mw-panel.collapsible-nav .portal.collapsed h5 a {
-	color: #0645AD;
-}
-
-#mw-panel.collapsible-nav .portal.collapsed h3:hover,
-#mw-panel.collapsible-nav .portal.collapsed h5:hover {
-	text-decoration: underline;
-}
diff --git a/extensions/Vector/modules/ext.vector.collapsibleNav.js b/extensions/Vector/modules/ext.vector.collapsibleNav.js
deleted file mode 100644
index 28a85676..00000000
--- a/extensions/Vector/modules/ext.vector.collapsibleNav.js
+++ /dev/null
@@ -1,253 +0,0 @@
-/**
- * Collapisble navigation for Vector
- */
-( function ( mw, $ ) {
-	"use strict";
-	var map, version;
-
-	// Use the same function for all navigation headings - don't repeat
-	function toggle( $element ) {
-		$.cookie(
-			'vector-nav-' + $element.parent().attr( 'id' ),
-			$element.parent().is( '.collapsed' ),
-			{ 'expires': 30, 'path': '/' }
-		);
-		$element
-			.parent()
-			.toggleClass( 'expanded' )
-			.toggleClass( 'collapsed' )
-			.find( '.body' )
-			.slideToggle( 'fast' );
-	}
-
-	/* Browser Support */
-
-	map = {
-		// Left-to-right languages
-		ltr: {
-			// Collapsible Nav is broken in Opera < 9.6 and Konqueror < 4
-			opera: [['>=', 9.6]],
-			konqueror: [['>=', 4.0]],
-			blackberry: false,
-			ipod: false,
-			iphone: false,
-			ps3: false
-		},
-		// Right-to-left languages
-		rtl: {
-			opera: [['>=', 9.6]],
-			konqueror: [['>=', 4.0]],
-			blackberry: false,
-			ipod: false,
-			iphone: false,
-			ps3: false
-		}
-	};
-	if ( !$.client.test( map ) ) {
-		return true;
-	}
-
-	/* Bucket Testing */
-
-	// Fallback to old version
-	version = 1;
-	// Allow new version override
-	if ( mw.config.get( 'wgCollapsibleNavForceNewVersion' ) ) {
-		version = 2;
-	} else {
-		// Make bucket testing optional
-		if ( mw.config.get( 'wgCollapsibleNavBucketTest' ) ) {
-			// This is be determined randomly, and then stored in a cookie
-			version = $.cookie( 'vector-nav-pref-version' );
-			// If the cookie didn't exist, or the value is out of range, generate a new one and save it
-			if ( version === null ) {
-				// 50% of the people will get the new version
-				version = Math.round( Math.random() + 1 );
-				$.cookie( 'vector-nav-pref-version', version, {
-					expires: 30,
-					path: '/'
-				});
-			}
-		}
-	}
-
-	$( function ( $ ) {
-		var limit, threshold, languages, acceptLangCookie,
-			$primary, $secondary,
-			i, $link, count,
-			$headings, tabIndex;
-
-		/* Special Language Portal Handling */
-
-		// Language portal splitting feature (if it's turned on)
-		if ( version === 2 ) {
-			// How many links to show in the primary languages portal
-			limit = 5;
-			// How many links there must be in the secondary portal to justify having a secondary portal
-			threshold = 3;
-			// Make the interwiki language links list a secondary list, and create a new list before it as primary list
-			$( '#p-lang ul' ).addClass( 'secondary' ).before( '<ul class="primary"></ul>' );
-			// This is a list of languages in order of Wikipedia project size. This is the lowest fallback for choosing
-			// which links to show in the primary list. Ideally the browser's accept-language headers should steer this
-			// list, and we should fallback on a site configured (MediaWiki:Common.js) list of prefered languages.
-			languages = [
-				'en', 'fr', 'de', 'es', 'pt', 'it', 'ru', 'ja', 'nl', 'pl', 'zh', 'sv', 'ar', 'tr', 'uk', 'fi', 'no', 'ca',
-				'ro', 'hu', 'ksh', 'id',  'he', 'cs', 'vi', 'ko', 'sr', 'fa', 'da', 'eo', 'sk', 'th', 'lt', 'vo', 'bg',
-				'sl', 'hr', 'hi', 'et', 'mk', 'simple', 'new', 'ms', 'nn', 'gl', 'el', 'eu', 'ka', 'tl', 'bn', 'lv', 'ml',
-				'bs', 'te', 'la', 'az', 'sh', 'war', 'br', 'is', 'mr', 'be-x-old', 'sq', 'cy', 'lb', 'ta', 'zh-classical',
-				'an', 'jv', 'ht', 'oc', 'bpy', 'ceb', 'ur', 'zh-yue', 'pms', 'scn', 'be', 'roa-rup', 'qu', 'af', 'sw',
-				'nds', 'fy', 'lmo', 'wa', 'ku', 'hy', 'su', 'yi', 'io', 'os', 'ga', 'ast', 'nap', 'vec', 'gu', 'cv',
-				'bat-smg', 'kn', 'uz', 'zh-min-nan', 'si', 'als', 'yo', 'li', 'gan', 'arz', 'sah', 'tt', 'bar', 'gd', 'tg',
-				'kk', 'pam', 'hsb', 'roa-tara', 'nah', 'mn', 'vls', 'gv', 'mi', 'am', 'ia', 'co', 'ne', 'fo', 'nds-nl',
-				'glk', 'mt', 'ang', 'wuu', 'dv', 'km', 'sco', 'bcl', 'mg', 'my', 'diq', 'tk', 'szl', 'ug', 'fiu-vro', 'sc',
-				'rm', 'nrm', 'ps', 'nv', 'hif', 'bo', 'se', 'sa', 'pnb', 'map-bms', 'lad', 'lij', 'crh', 'fur', 'kw', 'to',
-				'pa', 'jbo', 'ba', 'ilo', 'csb', 'wo', 'xal', 'krc', 'ckb', 'pag', 'ln', 'frp', 'mzn', 'ce', 'nov', 'kv',
-				'eml', 'gn', 'ky', 'pdc', 'lo', 'haw', 'mhr', 'dsb', 'stq', 'tpi', 'arc', 'hak', 'ie', 'so', 'bh', 'ext',
-				'mwl', 'sd', 'ig', 'myv', 'ay', 'iu', 'na', 'cu', 'pi', 'kl', 'ty', 'lbe', 'ab', 'got', 'sm', 'as', 'mo',
-				'ee', 'zea', 'av', 'ace', 'kg', 'bm', 'cdo', 'cbk-zam', 'kab', 'om', 'chr', 'pap', 'udm', 'ks', 'zu', 'rmy',
-				'cr', 'ch', 'st', 'ik', 'mdf', 'kaa', 'aa', 'fj', 'srn', 'tet', 'or', 'pnt', 'bug', 'ss', 'ts', 'pcd',
-				'pih', 'za', 'sg', 'lg', 'bxr', 'xh', 'ak', 'ha', 'bi', 've', 'tn', 'ff', 'dz', 'ti', 'ki', 'ny', 'rw',
-				'chy', 'tw', 'sn', 'tum', 'ng', 'rn', 'mh', 'ii', 'cho', 'hz', 'kr', 'ho', 'mus', 'kj'
-			];
-			// If the user has an Accept-Language cookie, use it. Otherwise, set it asynchronously but keep the default
-			// behavior for this page view.
-			acceptLangCookie = $.cookie( 'accept-language' );
-			if ( acceptLangCookie !== null ) {
-				// Put the user's accepted languages before the list ordered by wiki size
-				if ( acceptLangCookie !== '' ) {
-					languages = acceptLangCookie.split( ',' ).concat( languages );
-				}
-			} else {
-				$.getJSON(
-					mw.util.wikiScript( 'api' ),
-					'format=json&action=query&meta=userinfo&uiprop=acceptlang',
-					function ( data ) {
-						var langs = [], j, len, lang;
-						if ( data.query &&
-								data.query.userinfo &&
-								data.query.userinfo.acceptlang !== undefined
-						) {
-							for ( j = 0, lang = data.query.userinfo.acceptlang, len = lang.length; j < len; j++ ) {
-								if ( lang[j].q !== 0 ) {
-									langs.push( lang[j]['*'] );
-								}
-							}
-						}
-						$.cookie( 'accept-language', langs.join( ',' ), {
-							path: '/',
-							expires: 30
-						});
-					}
-				);
-			}
-			// Shortcuts to the two lists
-			$primary = $( '#p-lang ul.primary' );
-			$secondary = $( '#p-lang ul.secondary' );
-			// Adjust the limit based on the threshold
-			if ( $secondary.children().length < limit + threshold ) {
-				limit += threshold;
-			}
-			// Move up to 5 of the links into the primary list, based on the priorities set forth in the languages list
-			count = 0;
-			for ( i = 0; i < languages.length; i++ ) {
-				$link = $secondary.find( '.interwiki-' + languages[i] );
-				if ( $link.length ) {
-					if ( count++ < limit ) {
-						$link.appendTo( $primary );
-					} else {
-						break;
-					}
-				}
-			}
-			// If there's still links in the secondary list and we havn't filled the primary list to it's limit yet, move
-			// links into the primary list in order of appearance
-			if ( count < limit ) {
-				$secondary.children().each( function () {
-					if ( count++ < limit ) {
-						$(this).appendTo( $primary );
-					} else {
-						return false;
-					}
-				} );
-			}
-			// Hide the more portal if it's now empty, otherwise make the list into it's very own portal
-			if ( $secondary.children().length === 0 ) {
-				$secondary.remove();
-			} else {
-				$( '#p-lang' ).after( '<div id="p-lang-more" class="portal"><h3></h3><div class="body"></div></div>' );
-				$( '#p-lang-more h3' ).text( mw.msg( 'vector-collapsiblenav-more' ) );
-				$secondary.appendTo( $( '#p-lang-more .body' ) );
-			}
-			// Always show the primary interwiki language portal
-			$( '#p-lang' ).addClass( 'persistent' );
-		}
-
-		/* General Portal Modification */
-
-		// Always show the first portal
-		$( '#mw-panel > .portal:first' ).addClass( 'first persistent' );
-		// Apply a class to the entire panel to activate styles
-		$( '#mw-panel' ).addClass( 'collapsible-nav' );
-		// Use cookie data to restore preferences of what to show and hide
-		$( '#mw-panel > .portal:not(.persistent)' )
-			.each( function ( i ) {
-				var id = $(this).attr( 'id' ),
-					state = $.cookie( 'vector-nav-' + id );
-				// Add anchor tag to heading for better accessibility
-				$( this ).find( 'h3, h5' ).wrapInner( $( '<a href="#"></a>' ).click( false ) );
-				// In the case that we are not showing the new version, let's show the languages by default
-				if (
-					state === 'true' ||
-					( state === null && i < 1 ) ||
-					( state === null && version === 1 && id === 'p-lang' )
-				) {
-					$(this)
-						.addClass( 'expanded' )
-						.removeClass( 'collapsed' )
-						.find( '.body' )
-						.hide() // bug 34450
-						.show();
-				} else {
-					$(this)
-						.addClass( 'collapsed' )
-						.removeClass( 'expanded' );
-				}
-				// Re-save cookie
-				if ( state !== null ) {
-					$.cookie( 'vector-nav-' + $(this).attr( 'id' ), state, { 'expires': 30, 'path': '/' } );
-				}
-			} );
-
-		/* Tab Indexing */
-
-		$headings = $( '#mw-panel > .portal:not(.persistent) > h3, #mw-panel > .portal:not(.persistent) > h5' );
-
-		// Get the highest tab index
-		tabIndex = $( document ).lastTabIndex() + 1;
-
-		// Fix the search not having a tabindex
-		$( '#searchInput' ).attr( 'tabindex', tabIndex++ );
-
-		// Make it keyboard accessible
-		$headings.attr( 'tabindex', function () {
-			return tabIndex++;
-		});
-
-		// Toggle the selected menu's class and expand or collapse the menu
-		$( '#mw-panel' )
-			.delegate( '.portal:not(.persistent) > h3, .portal:not(.persistent) > h5', 'keydown', function ( e ) {
-				// Make the space and enter keys act as a click
-				if ( e.which === 13 /* Enter */ || e.which === 32 /* Space */ ) {
-					toggle( $(this) );
-				}
-			} )
-			.delegate( '.portal:not(.persistent) > h3, .portal:not(.persistent) > h5', 'mousedown', function ( e ) {
-				if ( e.which !== 3 ) { // Right mouse click
-					toggle( $(this) );
-					$(this).blur();
-				}
-				return false;
-			} );
-	});
-
-}( mediaWiki, jQuery ) );
diff --git a/extensions/Vector/modules/ext.vector.collapsibleTabs.js b/extensions/Vector/modules/ext.vector.collapsibleTabs.js
deleted file mode 100644
index 439a1995..00000000
--- a/extensions/Vector/modules/ext.vector.collapsibleTabs.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Collapsible tabs for Vector
- */
-jQuery( function ( $ ) {
-	var $cactions = $( '#p-cactions' );
-
-	// Bind callback functions to animate our drop down menu in and out
-	// and then call the collapsibleTabs function on the menu
-	$( '#p-views ul' )
-		.bind( 'beforeTabCollapse', function () {
-			// If the dropdown was hidden, show it
-			if ( $cactions.hasClass( 'emptyPortlet' ) ) {
-				$cactions
-					.removeClass( 'emptyPortlet' )
-					.find( 'h3, h5' )
-						.css( 'width', '1px' ).animate( { 'width': '24px' }, 390 );
-			}
-		} )
-		.bind( 'beforeTabExpand', function () {
-			// If we're removing the last child node right now, hide the dropdown
-			if ( $cactions.find( 'li' ).length === 1 ) {
-				$cactions.find( 'h3, h5' ).animate( { 'width': '1px' }, 390, function () {
-					$( this ).attr( 'style', '' )
-						.parent().addClass( 'emptyPortlet' );
-				});
-			}
-		} )
-		.collapsibleTabs();
-} );
diff --git a/extensions/Vector/modules/ext.vector.expandableSearch.css b/extensions/Vector/modules/ext.vector.expandableSearch.css
deleted file mode 100644
index 8b33bbb1..00000000
--- a/extensions/Vector/modules/ext.vector.expandableSearch.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.expandableField {
-	display: block;
-}
-
-#simpleSearch { 
-	overflow: auto;
-}
-
-#searchButton {
-	margin-top: 0.2em !important;
-}
diff --git a/extensions/Vector/modules/ext.vector.expandableSearch.js b/extensions/Vector/modules/ext.vector.expandableSearch.js
deleted file mode 100644
index b4910647..00000000
--- a/extensions/Vector/modules/ext.vector.expandableSearch.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Expandable search for Vector
- */
-jQuery( document ).ready( function ( $ ) {
-	
-	/* Browser Support */
-
-	var map = {
-		// Left-to-right languages
-		ltr: {
-			// Collapsible Nav is broken in Opera < 9.6 and Konqueror < 4
-			msie: [['>=', 8]],
-			blackberry: false,
-			ipod: false,
-			iphone: false,
-			ps3: false
-		},
-		// Right-to-left languages
-		rtl: {
-			msie: [['>=', 8]],
-			blackberry: false,
-			ipod: false,
-			iphone: false,
-			ps3: false
-		}
-	};
-	if ( !$.client.test( map ) ) {
-		return true;
-	}
-	
-	$( '#searchInput' )
-		.expandableField( { 
-			beforeExpand: function ( context ) {
-				// Animate the containers border
-				$( this )
-					.parent()
-					.animate( {
-						borderTopColor: '#a0d8ff',
-						borderLeftColor: '#a0d8ff',
-						borderRightColor: '#a0d8ff',
-						borderBottomColor: '#a0d8ff'
-					}, 'fast' );
-			},
-			beforeCondense: function ( context ) {
-				// Animate the containers border
-				$( this )
-					.parent()
-					.animate( {
-						borderTopColor: '#aaaaaa',
-						borderLeftColor: '#aaaaaa',
-						borderRightColor: '#aaaaaa',
-						borderBottomColor: '#aaaaaa'
-					}, 'fast' );
-			},
-			afterExpand: function ( context ) {
-				// Trigger the collapsible tabs resize handler
-				if ( $.collapsibleTabs ) {
-					$.collapsibleTabs.handleResize();
-				}
-			},
-			afterCondense: function ( context ) {
-				// Trigger the collapsible tabs resize handler
-				if ( $.collapsibleTabs ) {
-					$.collapsibleTabs.handleResize();
-				}
-			},
-			expandToLeft: !$( 'body' ).hasClass( 'rtl' )
-		} )
-		.css( 'float', $( 'body' ).hasClass( 'rtl' ) ? 'right' : 'left' )
-		.siblings( 'button' )
-		.css( 'float', $( 'body' ).hasClass( 'rtl' ) ? 'right' : 'left' );
-} );
diff --git a/extensions/Vector/modules/ext.vector.footerCleanup.css b/extensions/Vector/modules/ext.vector.footerCleanup.css
deleted file mode 100644
index a361346b..00000000
--- a/extensions/Vector/modules/ext.vector.footerCleanup.css
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * Footer cleanup
- */
-
-/* General layout */
-#wpTextbox1 {
-	margin: 0;
-	display: block;
-}
-
-.editOptions {
-	background-color: #F0F0F0;
-	border: 1px solid silver;
-	border-top: none;
-	padding: 1em 1em 1.5em 1em;
-	margin-bottom: 2em;
-}
-
-/* Styles for collapsible lists of templates used and hidden categories */
-.collapsible-list {
-	display: inline;
-	cursor: pointer;
-	min-width: 400px;
-}
-
-.collapsible-list span {
-	float: left;
-	/* @embed */
-	background-image: url(./images/open.png);
-	background-repeat: no-repeat;
-	background-position: 50% 50%;
-	display: block;
-	height: 16px;
-	width: 16px;
-}
-
-.collapsible-list span.collapsed {
-	/* @embed */
-	background-image: url(./images/closed-ltr.png);
-}
-
-.hiddencats ul, .templatesUsed ul {
-	margin-bottom: 1em;
-	margin-left: 2.5em;
-}
-
-/* Adjustments to edit form elements */
-.editCheckboxes {
-	margin-bottom: 1em;
-}
-
-.editCheckboxes input:first-child {
-	margin-left: 0;
-}
-
-.cancelLink {
-	margin-left: 0.5em;
-}
-
-#editpage-copywarn {
-	font-size: 0.9em;
-}
-
-#wpSummary {
-	display: block;
-	margin-top: 0;
-	margin-bottom: 0.5em;
-}
-
-.editButtons input:first-child {
-	margin-left: .1em;
-}
diff --git a/extensions/Vector/modules/ext.vector.footerCleanup.js b/extensions/Vector/modules/ext.vector.footerCleanup.js
deleted file mode 100644
index 5881014d..00000000
--- a/extensions/Vector/modules/ext.vector.footerCleanup.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Footer cleanup for Vector
- */
-( function ( $ ) {
-	// Wait for onload to remove edit help and "|" after cancel link.
-	$( window ).load( function () {
-		// Only if advanced editor is found.
-		if ( 'wikiEditor' in $ ) {
-			$( '.editButtons' ).find( '.editHelp' ).remove();
-			// Remove the "|" from after the cancelLink.
-			var $cancelLink = $( '#mw-editform-cancel' );
-			$cancelLink.parent().empty().append( $cancelLink );
-			// Adjustment for proper right side alignment with WikiEditor.
-			$( '.editOptions, #editpage-specialchars' ).css( 'margin-right', '-2px' );
-		}
-	} );
-	// Waiting until dom ready as the module is loaded in the head.
-	$( document ).ready( function () {
-		// Make "Templates used" a collapsible list.
-		$( '.templatesUsed' ).footerCollapsibleList( {
-			name: 'templates-used-list',
-			title: mw.msg( 'vector-footercleanup-templates' )
-		} );
-
-		// Make "Hidden categories" a collapsible list.
-		$( '.hiddencats' ).footerCollapsibleList( {
-			name: 'hidden-categories-list',
-			title: mw.msg( 'vector-footercleanup-categories' )
-		} );
-	} );
-} ( jQuery ) );
diff --git a/extensions/Vector/modules/ext.vector.sectionEditLinks.css b/extensions/Vector/modules/ext.vector.sectionEditLinks.css
deleted file mode 100644
index 07df70aa..00000000
--- a/extensions/Vector/modules/ext.vector.sectionEditLinks.css
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Section edit links
- */
-
-span.vector-editLink {
-	float: none;
-	display: inline-block;
-}
-
-span.vector-editLink a {
-	padding-left: 18px;
-	/* @embed */
-	background: url(images/edit-faded.png) left top no-repeat;
-}
-
-span.vector-editLink a:hover {
-	/* @embed */
-	background-image: url(images/edit.png);
-}
diff --git a/extensions/Vector/modules/ext.vector.sectionEditLinks.js b/extensions/Vector/modules/ext.vector.sectionEditLinks.js
deleted file mode 100644
index 62bde9e6..00000000
--- a/extensions/Vector/modules/ext.vector.sectionEditLinks.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Section Edit Links for Vector
- */
-( function ( $, mw ) {
-
-var eventBase = 'ext.vector.sectionEditLinks-bucket:';
-var cookieBase = 'ext.vector.sectionEditLinks-';
-var bucket = null;
-
-if ( mw.config.get( 'wgVectorSectionEditLinksBucketTest', false ) ) {
-	// If the version in the client's cookie doesn't match wgVectorSectionEditLinksExperiment, then
-	// we need to disregard the bucket they may already be in to ensure accurate redistribution
-	var currentExperiment = $.cookie( cookieBase + 'experiment' );
-	var experiment = Number( mw.config.get( 'wgVectorSectionEditLinksExperiment', 0 ) );
-	if ( currentExperiment === null || Number( currentExperiment ) != experiment ) {
-		$.cookie( cookieBase + 'experiment', experiment );
-	} else {
-		bucket = $.cookie( cookieBase + 'bucket' );
-	}
-	if ( bucket === null ) {
-		// Percentage chance of being tracked
-		var odds = Math.min( 100, Math.max( 0,
-			Number( mw.config.get( 'wgVectorSectionEditLinksLotteryOdds', 0 ) )
-		) );
-		// 0 = not tracked, 1 = tracked with old version, 2 = tracked with new version
-		bucket = ( Math.random() * 100 ) < odds ? Number( Math.random() < 0.5 ) + 1 : 0;
-		$.cookie( cookieBase + 'bucket', bucket, { 'path': '/', 'expires': 30 } );
-		// If we are going to track this person from now on, let's also track which bucket we put
-		// them into and when
-		if ( bucket > 0 && 'trackAction' in $ ) {
-			$.trackAction( eventBase + bucket + '@' + experiment );
-		}
-	}
-}
-
-if ( bucket <= 0 ) {
-	return;
-}
-
-$(document).ready( function () {
-	if ( bucket == 2 ) {
-		// Move the link over to be next to the heading text and style it with an icon
-		$( 'span.mw-headline' ).each( function () {
-			$(this)
-				.after(
-					$( '<span class="editsection vector-editLink"></span>' )
-						.append(
-							$(this)
-								.prev( 'span.editsection' )
-								.find( 'a' )
-									.each( function () {
-										var text = $(this).text();
-										$(this).text(
-											text.substr( 0, 1 ).toUpperCase() + text.substr( 1 )
-										);
-									} )
-									.detach()
-						)
-				)
-				.prev( 'span.editsection' )
-					.remove();
-		} );
-	}
-} );
-
-} )( jQuery, mediaWiki );
diff --git a/extensions/Vector/modules/images/closed-ltr.png b/extensions/Vector/modules/images/closed-ltr.png
deleted file mode 100644
index 063ac6f7..00000000
Binary files a/extensions/Vector/modules/images/closed-ltr.png and /dev/null differ
diff --git a/extensions/Vector/modules/images/closed-rtl.png b/extensions/Vector/modules/images/closed-rtl.png
deleted file mode 100644
index c3462182..00000000
Binary files a/extensions/Vector/modules/images/closed-rtl.png and /dev/null differ
diff --git a/extensions/Vector/modules/images/edit-faded.png b/extensions/Vector/modules/images/edit-faded.png
deleted file mode 100644
index 1e2e5d83..00000000
Binary files a/extensions/Vector/modules/images/edit-faded.png and /dev/null differ
diff --git a/extensions/Vector/modules/images/edit.png b/extensions/Vector/modules/images/edit.png
deleted file mode 100644
index fe281252..00000000
Binary files a/extensions/Vector/modules/images/edit.png and /dev/null differ
diff --git a/extensions/Vector/modules/images/open.png b/extensions/Vector/modules/images/open.png
deleted file mode 100644
index 0221028e..00000000
Binary files a/extensions/Vector/modules/images/open.png and /dev/null differ
diff --git a/extensions/Vector/modules/images/portal-break.png b/extensions/Vector/modules/images/portal-break.png
deleted file mode 100644
index 10cd7f83..00000000
Binary files a/extensions/Vector/modules/images/portal-break.png and /dev/null differ
diff --git a/extensions/Vector/modules/jquery.collapsibleTabs.js b/extensions/Vector/modules/jquery.collapsibleTabs.js
deleted file mode 100644
index 1e6b7af5..00000000
--- a/extensions/Vector/modules/jquery.collapsibleTabs.js
+++ /dev/null
@@ -1,206 +0,0 @@
-/**
- * Collapsible tabs jQuery Plugin
- */
-( function ( $ ) {
-	var rtl = $( 'body' ).is( '.rtl' );
-	$.fn.collapsibleTabs = function ( options ) {
-		// return if the function is called on an empty jquery object
-		if ( !this.length ) {
-			return this;
-		}
-		// Merge options into the defaults
-		var $settings = $.extend( {}, $.collapsibleTabs.defaults, options );
-
-		this.each( function () {
-			var $el = $( this );
-			// add the element to our array of collapsible managers
-			$.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ?
-				$el : $.collapsibleTabs.instances.add( $el ) );
-			// attach the settings to the elements
-			$el.data( 'collapsibleTabsSettings', $settings );
-			// attach data to our collapsible elements
-			$el.children( $settings.collapsible ).each( function () {
-				$.collapsibleTabs.addData( $( this ) );
-			} );
-		} );
-
-		// if we haven't already bound our resize hanlder, bind it now
-		if ( !$.collapsibleTabs.boundEvent ) {
-			$( window )
-				.delayedBind( '500', 'resize', function ( ) {
-					$.collapsibleTabs.handleResize();
-				} );
-		}
-		// call our resize handler to setup the page
-		$.collapsibleTabs.handleResize();
-		return this;
-	};
-	/**
-	 * Returns the amount of horizontal distance between the two tabs groups
-	 * (#left-navigation and #right-navigation), in pixels. If negative, this
-	 * means that the tabs overlap, and the value is the width of overlapping
-	 * parts.
-	 *
-	 * Used in default expandCondition and collapseCondition.
-	 *
-	 * @return {Numeric} distance/overlap in pixels
-	 */
-	function calculateTabDistance() {
-		var $tabsArray, $leftTab, $rightTab, leftEnd, rightStart;
-
-		// In RTL, #right-navigation is actually on the left and vice versa.
-		// Hooray for descriptive naming.
-		if ( !rtl ) {
-			$leftTab = $( '#left-navigation' );
-			$rightTab = $( '#right-navigation' );
-		} else {
-			$leftTab = $( '#right-navigation' );
-			$rightTab = $( '#left-navigation' );
-		}
-
-		leftEnd = $leftTab.offset().left + $leftTab.width();
-		rightStart = $rightTab.offset().left;
-
-		return rightStart - leftEnd;
-	}
-	$.collapsibleTabs = {
-		instances: [],
-		boundEvent: null,
-		defaults: {
-			expandedContainer: '#p-views ul',
-			collapsedContainer: '#p-cactions ul',
-			collapsible: 'li.collapsible',
-			shifting: false,
-			expandCondition: function ( eleWidth ) {
-				// If there's at least eleWidth pixels free space, expand.
-				return calculateTabDistance() >= eleWidth;
-			},
-			collapseCondition: function () {
-				// If there's an overlap, collapse.
-				return calculateTabDistance() < 0;
-			}
-		},
-		addData: function ( $collapsible ) {
-			var $settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
-			if ( $settings !== null ) {
-				$collapsible.data( 'collapsibleTabsSettings', {
-					expandedContainer: $settings.expandedContainer,
-					collapsedContainer: $settings.collapsedContainer,
-					expandedWidth: $collapsible.width(),
-					prevElement: $collapsible.prev()
-				} );
-			}
-		},
-		getSettings: function ( $collapsible ) {
-			var $settings = $collapsible.data( 'collapsibleTabsSettings' );
-			if ( $settings === undefined ) {
-				$.collapsibleTabs.addData( $collapsible );
-				$settings = $collapsible.data( 'collapsibleTabsSettings' );
-			}
-			return $settings;
-		},
-		/**
-		 * @param {jQuery.Event} e
-		 */
-		handleResize: function () {
-			$.collapsibleTabs.instances.each( function () {
-				var $el = $( this ),
-					data = $.collapsibleTabs.getSettings( $el );
-
-				if ( data.shifting ) {
-					return;
-				}
-
-				// if the two navigations are colliding
-				if ( $el.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
-
-					$el.trigger( 'beforeTabCollapse' );
-					// move the element to the dropdown menu
-					$.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible + ':last' ) );
-				}
-
-				// if there are still moveable items in the dropdown menu,
-				// and there is sufficient space to place them in the tab container
-				if ( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0
-						&& data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
-								data.collapsible + ':first' ) ).expandedWidth ) ) {
-					//move the element from the dropdown to the tab
-					$el.trigger( 'beforeTabExpand' );
-					$.collapsibleTabs
-						.moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' );
-				}
-			});
-		},
-		moveToCollapsed: function ( ele ) {
-			var $moving = $( ele );
-
-			var data = $.collapsibleTabs.getSettings( $moving );
-			if ( !data ) {
-				return;
-			}
-			var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
-			if ( !expContainerSettings ) {
-				return;
-			}
-			expContainerSettings.shifting = true;
-
-			// Remove the element from where it's at and put it in the dropdown menu
-			var target = data.collapsedContainer;
-			$moving.css( 'position', 'relative' )
-				.css( ( rtl ? 'left' : 'right' ), 0 )
-				.animate( { width: '1px' }, 'normal', function () {
-					var data;
-					$( this ).hide();
-					// add the placeholder
-					$( '<span class="placeholder" style="display: none;"></span>' ).insertAfter( this );
-					// XXX: 'data' is undefined here, should the 'data' from the outer scope have
-					// a different name?
-					$( this ).detach().prependTo( target ).data( 'collapsibleTabsSettings', data );
-					$( this ).attr( 'style', 'display: list-item;' );
-					data = $.collapsibleTabs.getSettings( $( ele ) );
-					if ( data ) {
-						var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
-						if ( expContainerSettings ) {
-							expContainerSettings.shifting = false;
-							$.collapsibleTabs.handleResize();
-						}
-					}
-				} );
-		},
-		moveToExpanded: function ( ele ) {
-			var $moving = $( ele );
-			var data = $.collapsibleTabs.getSettings( $moving );
-			if ( !data ) {
-				return;
-			}
-			var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
-			if ( !expContainerSettings ) {
-				return;
-			}
-			expContainerSettings.shifting = true;
-
-			// grab the next appearing placeholder so we can use it for replacing
-			var $target = $( data.expandedContainer ).find( 'span.placeholder:first' );
-			var expandedWidth = data.expandedWidth;
-			$moving.css( 'position', 'relative' ).css( ( rtl ? 'right' : 'left' ), 0 ).css( 'width', '1px' );
-			$target.replaceWith(
-				$moving
-				.detach()
-				.css( 'width', '1px' )
-				.data( 'collapsibleTabsSettings', data )
-				.animate( { width: expandedWidth + 'px' }, 'normal', function () {
-					$( this ).attr( 'style', 'display: block;' );
-					var data = $.collapsibleTabs.getSettings( $( this ) );
-					if ( data ) {
-						var expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
-						if ( expContainerSettings ) {
-							expContainerSettings.shifting = false;
-							$.collapsibleTabs.handleResize();
-						}
-					}
-				} )
-			);
-		}
-	};
-
-}( jQuery ) );
diff --git a/extensions/Vector/modules/jquery.footerCollapsibleList.js b/extensions/Vector/modules/jquery.footerCollapsibleList.js
deleted file mode 100644
index 7b9b5bcb..00000000
--- a/extensions/Vector/modules/jquery.footerCollapsibleList.js
+++ /dev/null
@@ -1,44 +0,0 @@
-( function( $ ) {
-	// Small jQuery plugin to handle the toggle function & cookie for state
-	// For collapsible items in the footer
-	$.fn.footerCollapsibleList = function( config ) {
-		if ( !( 'title' in config ) || !( 'name' in config ) ) {
-			return;
-		}
-
-		return this.each( function () {
-			var $container, $ul, $explanation, $icon;
-
-			$container = $( this );
-			$ul = $container.find( 'ul' );
-			$explanation = $container.find( '.mw-templatesUsedExplanation, .mw-hiddenCategoriesExplanation' );
-
-			$icon = $( '<span>' );
-			$ul.before(
-				$( '<a>' )
-					.addClass( 'collapsible-list' )
-					.text( config.title )
-					.append( $icon )
-					.on( 'click', function( e ) {
-						// Modify state cookie.
-						var state = ( $.cookie( config.name ) !== 'expanded' ) ? 'expanded' : 'collapsed';
-						$.cookie( config.name, state );
-
-						// Modify DOM.
-						$ul.slideToggle();
-						$icon.toggleClass( 'collapsed' );
-
-						e.preventDefault();
-					} )
-			);
-
-			$explanation.remove();
-
-			// Check cookie and collapse.
-			if( $.cookie( config.name ) === null || $.cookie( config.name ) === 'collapsed' ) {
-				$ul.hide();
-				$icon.addClass( 'collapsed' );
-			}
-		} );
-	};
-}( jQuery ) );
diff --git a/extensions/Vector/switchExperimentPrefs.php b/extensions/Vector/switchExperimentPrefs.php
deleted file mode 100644
index 82ddd868..00000000
--- a/extensions/Vector/switchExperimentPrefs.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-$path = '../..';
-
-if ( getenv( 'MW_INSTALL_PATH' ) !== false ) {
-	$path = getenv( 'MW_INSTALL_PATH' );
-}
-
-require_once( $path . '/maintenance/Maintenance.php' );
-
-class SwitchExperimentPrefs extends Maintenance {
-	function __construct() {
-		parent::__construct();
-		$this->addOption( 'pref', 'Preference to set', true, true );
-		$this->addOption( 'value', 'Value to set the preference to', true, true );
-		$this->mDescription = 'Set a preference for all users that have the vector-noexperiments preference enabled.';
-	}
-
-	function execute() {
-		$dbw = wfGetDB( DB_MASTER );
-
-		$batchSize = 100;
-		$total = 0;
-		$lastUserID = 0;
-		while ( true ) {
-			$res = $dbw->select( 'user_properties', array( 'up_user' ),
-				array( 'up_property' => 'vector-noexperiments', "up_user > $lastUserID" ),
-				__METHOD__,
-				array( 'LIMIT' => $batchSize ) );
-			if ( !$res->numRows() ) {
-				$dbw->commit();
-				break;
-			}
-			$total += $res->numRows();
-
-			$ids = array();
-			foreach ( $res as $row ) {
-				$ids[] = $row->up_user;
-			}
-			$lastUserID = max( $ids );
-			
-			
-			foreach ( $ids as $id ) {
-				$user = User::newFromId( $id );
-				if ( !$user->isLoggedIn() )
-					continue;
-				$user->setOption( $this->getOption( 'pref' ), $this->getOption( 'value' ) );
-				$user->saveSettings();
-			}
-
-			echo "$total\n";
-
-			wfWaitForSlaves(); // Must be wfWaitForSlaves_masterPos(); on 1.17wmf1
-		}
-		echo "Done\n";
-
-	}
-}
-
-$maintClass = 'SwitchExperimentPrefs';
-require_once( RUN_MAINTENANCE_IF_MAIN );
-
-
diff --git a/extensions/WikiEditor/.jshintignore b/extensions/WikiEditor/.jshintignore
index 66a218b5..b97a47d3 100644
--- a/extensions/WikiEditor/.jshintignore
+++ b/extensions/WikiEditor/.jshintignore
@@ -1,2 +1,4 @@
 # upstream lib from Google
 modules/contentCollector.js
+# messy
+modules/jquery.wikiEditor.iframe.js
diff --git a/extensions/WikiEditor/.jshintrc b/extensions/WikiEditor/.jshintrc
index 64cd5087..5d335e32 100644
--- a/extensions/WikiEditor/.jshintrc
+++ b/extensions/WikiEditor/.jshintrc
@@ -1,9 +1,33 @@
 {
+	/* Common */
+
+	// Enforcing
+	"camelcase": true,
+	"curly": true,
+	"eqeqeq": true,
+	"immed": true,
+	"latedef": true,
+	"newcap": true,
+	"noarg": true,
+	"noempty": true,
+	"nonew": true,
+	"quotmark": "single",
+	"trailing": true,
+	"undef": true,
+	"unused": true,
+	// Legacy
+	"onevar": true,
+
+	/* Local */
+
+	// Relaxing
+	"loopfunc": true,
+	"multistr": true,
+	// Environment
+	"browser": true,
+
 	"predef": [
 		"mediaWiki",
 		"jQuery"
-	],
-	"browser": true,
-	"smarttabs": true,
-	"multistr": true
+	]
 }
diff --git a/extensions/WikiEditor/WikiEditor.hooks.php b/extensions/WikiEditor/WikiEditor.hooks.php
index 57b8ff35..89f27f48 100644
--- a/extensions/WikiEditor/WikiEditor.hooks.php
+++ b/extensions/WikiEditor/WikiEditor.hooks.php
@@ -12,7 +12,7 @@ class WikiEditorHooks {
 
 	protected static $features = array(
 
-		/* Beta Features */
+		/* Toolbar Features */
 
 		'toolbar' => array(
 			'preferences' => array(
@@ -20,7 +20,7 @@ class WikiEditorHooks {
 				'usebetatoolbar' => array(
 					'type' => 'toggle',
 					'label-message' => 'wikieditor-toolbar-preference',
-					'section' => 'editing/beta',
+					'section' => 'editing/editor',
 				),
 			),
 			'requirements' => array(
@@ -36,7 +36,7 @@ class WikiEditorHooks {
 				'usebetatoolbar-cgd' => array(
 					'type' => 'toggle',
 					'label-message' => 'wikieditor-toolbar-dialogs-preference',
-					'section' => 'editing/beta',
+					'section' => 'editing/editor',
 				),
 			),
 			'requirements' => array(
@@ -52,7 +52,7 @@ class WikiEditorHooks {
 				'wikieditor-toolbar-hidesig' => array(
 					'type' => 'toggle',
 					'label-message' => 'wikieditor-toolbar-hidesig',
-					'section' => 'editing/beta',
+					'section' => 'editing/editor',
 				),
 			),
 			'requirements' => array(
diff --git a/extensions/WikiEditor/WikiEditor.i18n.php b/extensions/WikiEditor/WikiEditor.i18n.php
index b679ab48..97cef8ff 100644
--- a/extensions/WikiEditor/WikiEditor.i18n.php
+++ b/extensions/WikiEditor/WikiEditor.i18n.php
@@ -51,7 +51,7 @@ $messages['en'] = array(
 	'wikieditor-toolbar' => 'Editing toolbar',
 	'wikieditor-toolbar-desc' => 'Edit page toolbar with enhanced usability',
 	'wikieditor-toolbar-preference' => 'Enable enhanced editing toolbar',
-	'wikieditor-toolbar-dialogs-preference' => 'Enable dialogs for inserting links, tables and more',
+	'wikieditor-toolbar-dialogs-preference' => 'Enable wizards for inserting links, tables as well as the search and replace function',
 	'wikieditor-toolbar-hidesig' => 'Hide the signature button from pages in the main namespace',
 	'wikieditor-toolbar-loading' => 'Loading...',
 	/* Toolbar - Main Section */
@@ -80,6 +80,7 @@ $messages['en'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Invalid title',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'External link',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Checking page existence...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Disambiguation page',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'The title you specified is invalid.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'The URL you specified looks like it was intended as a link to another wiki page.
 Do you want to make it an internal link?',
@@ -333,6 +334,7 @@ I guess that "feature-providing modules" means the same as "modules providing fe
 {{Identical|Publish}}",
 	'wikieditor-publish-dialog-goback' => 'Button that closes the dialog that opens when the user clicks the Publish button.
 {{Identical|Go back}}',
+	'wikieditor-template-editor-dialog-title' => '{{Identical|Edit template}}',
 	'wikieditor-template-editor-dialog-submit' => '{{Identical|Update}}',
 	'wikieditor-template-editor-dialog-cancel' => '{{Identical|Cancel}}',
 	'wikieditor-toc-preference' => "Option at [[Special:Preferences]], tab ''{{int:prefs-editing}}''",
@@ -340,10 +342,10 @@ I guess that "feature-providing modules" means the same as "modules providing fe
 	'wikieditor-toc-hide' => 'Label of the show/hide link when the navigable table of contents is visible',
 	'wikieditor-toolbar' => 'A customizable toolbar for the WikiEditor.
 For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Toolbar_customization',
-	'wikieditor-toolbar-desc' => '{{desc}}',
+	'wikieditor-toolbar-desc' => 'Unused at this time.',
 	'wikieditor-toolbar-preference' => 'Option in [[Special:Preferences]]',
 	'wikieditor-toolbar-dialogs-preference' => "Caption of a checkbox on [[Special:Preferences]] (''editing'' tab), enabling helper dialogs for various features of the advanced edit toolbar (e.g. inserting links or tables).
-{{Identical|Enable dialogs for inserting links, tables and more}}",
+{{Identical|Enable wizards for inserting links, tables as well as the search and replace function}}",
 	'wikieditor-toolbar-loading' => '{{Identical|Loading}}',
 	'wikieditor-toolbar-tool-bold' => '{{Identical|Bold}}',
 	'wikieditor-toolbar-tool-bold-example' => '{{Identical|Bold text}}',
@@ -353,6 +355,7 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
 	'wikieditor-toolbar-tool-xlink' => '{{Identical|External link (remember http:// prefix)}}',
 	'wikieditor-toolbar-tool-xlink-example' => "www.example.com is not a real website, but it has been reserved to use in software documentation, and will never be sold or used for advertising. If you translate the word example and try to go to that web address then you might get a message that it doesn't exist. But somebody may have created a commercial web page for that address, such as www.Beispiel.org, using the German word for example. It is therefore recommended that you do not translate http://www.example.com at all. If you do wish to translate it you should first check where the translated link takes you, and bear in mind that anybody could purchase that name in the future.",
 	'wikieditor-toolbar-tool-link' => '{{Identical|Link}}',
+	'wikieditor-toolbar-tool-link-ext-target' => '{{Identical|Link URL}}',
 	'wikieditor-toolbar-tool-link-cancel' => '{{Identical|Cancel}}',
 	'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Text shown when the title the user entered exists',
 	'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Text shown when the title the user entered does not exist',
@@ -361,12 +364,16 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Text shown when the link target the user entered points to an external web site
 {{Identical|External link}}',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'alt text and title text for the image shown while the title the user entered is being checked for existence',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Text shown when the link target the user entered points to a disambiguation page.
+{{Identical|Disambiguation page}}',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'This message appears when you try to create an internal link but the page title in the link is invalid.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => '{{Identical|Internal link}}',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => '{{Identical|External link}}',
 	'wikieditor-toolbar-tool-file' => '{{Identical|Embedded file}}',
+	'wikieditor-toolbar-tool-file-example' => '{{Identical|Example}}',
 	'wikieditor-toolbar-tool-file-title' => 'Title for insert file dialog',
-	'wikieditor-toolbar-file-target' => 'Label for the input of filename on insert file dialog',
+	'wikieditor-toolbar-file-target' => 'Label for the input of filename on insert file dialog.
+{{Identical|Filename}}',
 	'wikieditor-toolbar-file-caption' => 'Label for input of caption on insert file dialog
 
 {{Identical|Caption}}',
@@ -381,20 +388,24 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
 	'wikieditor-toolbar-tool-file-cancel' => '{{Identical|Cancel}}',
 	'wikieditor-toolbar-tool-reference' => '{{Identical|Reference}}',
 	'wikieditor-toolbar-tool-reference-cancel' => '{{Identical|Cancel}}',
-	'wikieditor-toolbar-tool-reference-title' => 'Title of insert reference dialog. This text is on the very top bar of the dialog.',
+	'wikieditor-toolbar-tool-reference-title' => 'Title of insert reference dialog. This text is on the very top bar of the dialog.
+{{Identical|Insert reference}}',
 	'wikieditor-toolbar-tool-reference-insert' => 'Button text for the insert action of the insert reference dialog.
 {{Identical|Insert}}',
 	'wikieditor-toolbar-tool-reference-text' => 'Label for the input field on the insert reference dialog.',
 	'wikieditor-toolbar-tool-signature' => '{{Identical|Signature with timestamp}}',
 	'wikieditor-toolbar-section-advanced' => '{{Identical|Advanced}}',
+	'wikieditor-toolbar-tool-heading' => '{{Identical|Heading}}',
 	'wikieditor-toolbar-group-format' => '{{Identical|Format}}',
 	'wikieditor-toolbar-tool-ulist' => '{{Identical|Bulleted list}}',
 	'wikieditor-toolbar-tool-olist' => '{{Identical|Numbered list}}',
+	'wikieditor-toolbar-tool-indent' => '{{Identical|Indent}}',
 	'wikieditor-toolbar-tool-nowiki' => 'This is the text that appears when you hover the mouse over the third button from the right on the edit toolbar.',
 	'wikieditor-toolbar-tool-redirect' => "Tooltip for icon to place wiki text for a redirect in the edit box. The label before these icons says 'Insert'. 'Redirect' is a noun here.
 {{Identical|Redirect}}",
 	'wikieditor-toolbar-tool-redirect-example' => "Target is an adjective describing the page name. You could use 'destination' instead of 'target'. 'Target page name' is the destination of the redirect and appears when the wikitext for a redirect is inserted in the text box thus
  <nowiki>#REDIRECT [[target page name]]</nowiki>",
+	'wikieditor-toolbar-tool-big' => '{{Identical|Big}}',
 	'wikieditor-toolbar-tool-small' => '{{Identical|Small}}',
 	'wikieditor-toolbar-group-insert' => '{{Identical|Insert}}',
 	'wikieditor-toolbar-tool-gallery-example' => 'Used as example for Picture Gallery.
@@ -411,7 +422,9 @@ See also:
 * {{msg-mw|wikieditor-toolbar-tool-table-example-header}}
 * {{msg-mw|wikieditor-toolbar-tool-table-example}}',
 	'wikieditor-toolbar-tool-table-title' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
-	'wikieditor-toolbar-tool-table-dimensions-rows' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
+	'wikieditor-toolbar-tool-table-dimensions-rows' => 'See screenshot.
+[[File:Wikieditor-toolbar-tool-table.png|thumb]]
+{{Identical|Row}}',
 	'wikieditor-toolbar-tool-table-dimensions-columns' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.
 {{Identical|Column}}',
 	'wikieditor-toolbar-tool-table-dimensions-header' => '[[File:Wikieditor-toolbar-tool-table.png|thumb]] See screenshot.',
@@ -458,11 +471,14 @@ More notes:
 	'wikieditor-toolbar-tool-replace-close' => '{{Identical|Close}}',
 	'wikieditor-toolbar-tool-replace-success' => 'Parameter:
 * $1 - the number of replacements',
-	'wikieditor-toolbar-tool-replace-invalidregex' => '$1 is a browser-supplied error message, probably in English, possibly in the browser language.
+	'wikieditor-toolbar-tool-replace-invalidregex' => 'Parameters:
+* $1 - a browser-supplied error message, probably in English, possibly in the browser language.
 
 A "regular expression" is a syntax to find strings based on patterns, for more see [[wikipedia:Regular expression|the Wikipedia article]].
 
-Regular expressions are mostly a programmer tool, which is sometimes exposed to normal users too. It\'s almost as an programming language, but it is used to describe different kinds of strings (sometimes also called patterns and pattern matching), and is often used to change (parts of) the strings too.',
+Regular expressions are mostly a programmer tool, which is sometimes exposed to normal users too.
+
+It\'s almost as an programming language, but it is used to describe different kinds of strings (sometimes also called patterns and pattern matching), and is often used to change (parts of) the strings too.',
 	'wikieditor-toolbar-section-characters' => 'This will be a toolbar for special characters, like emoticons.
 For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Toolbar_customization
 {{Identical|Special character}}',
@@ -485,12 +501,15 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
 For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Toolbar_customization',
 	'wikieditor-toolbar-characters-page-telugu' => 'The name of the [[w:Telugu language#Alphabet|Telugu]] character set (alphabet) on the toolbar.
 For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Toolbar_customization',
+	'wikieditor-toolbar-characters-page-lao' => '{{Identical|Lao}}',
+	'wikieditor-toolbar-characters-page-khmer' => '{{Identical|Khmer}}',
 	'wikieditor-toolbar-characters-endash' => 'Title tooltip for the en dash character (–); See https://en.wikipedia.org/wiki/Dash',
 	'wikieditor-toolbar-characters-emdash' => 'Title tooltip for the em dash character (—); See https://en.wikipedia.org/wiki/Dash',
 	'wikieditor-toolbar-characters-minus' => 'Title tooltip for the minus sign character (−), not to be confused with a hyphen',
 	'wikieditor-toolbar-section-help' => '{{Identical|Help}}',
 	'wikieditor-toolbar-help-heading-description' => '{{Identical|Description}}',
 	'wikieditor-toolbar-help-page-link' => '{{Identical|Link}}',
+	'wikieditor-toolbar-help-page-heading' => '{{Identical|Heading}}',
 	'wikieditor-toolbar-help-page-list' => '{{Identical|List}}',
 	'wikieditor-toolbar-help-page-file' => '{{Identical|File}}',
 	'wikieditor-toolbar-help-page-reference' => '{{Identical|Reference}}',
@@ -519,8 +538,13 @@ For more information, see http://www.mediawiki.org/wiki/Extension:WikiEditor/Too
 	'wikieditor-toolbar-help-content-ulist-description' => '{{Identical|Bulleted list}}',
 	'wikieditor-toolbar-help-content-olist-description' => '{{Identical|Numbered list}}',
 	'wikieditor-toolbar-help-content-file-description' => '{{Identical|Embedded file}}',
-	'wikieditor-toolbar-help-content-file-syntax' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}",
-	'wikieditor-toolbar-help-content-file-result' => '{{doc-important|Do not translate anything except "Caption text" (twice) and "Enlarge" (to "{{int:thumbnail-more}}").}}',
+	'wikieditor-toolbar-help-content-file-syntax' => "{{doc-important|''thumb'' is a magic word. Leave it untranslated!}}
+Parameters:
+* \$1 - \"File\" namespace name",
+	'wikieditor-toolbar-help-content-file-result' => '{{doc-important|Do not translate anything except "Caption text" (twice) and "Enlarge" (to "{{int:thumbnail-more}}").}}
+Parameters:
+* $1 - style path. e.g. "/w/skins"
+* $2 - extension assets path. e.g. "/w/extensions"',
 	'wikieditor-toolbar-help-content-reference-description' => '{{Identical|Reference}}',
 	'wikieditor-toolbar-help-content-reference-syntax' => 'I suggest leaving the <code>name="test"</code> string in English
 
@@ -534,6 +558,7 @@ www.example.org is not a real website, but it has been reserved to use in softwa
 	'wikieditor-toolbar-help-content-signaturetimestamp-syntax' => '{{notranslate}}',
 	'wikieditor-toolbar-help-content-signature-description' => '{{Identical|Signature}}',
 	'wikieditor-toolbar-help-content-signature-syntax' => '{{notranslate}}',
+	'wikieditor-toolbar-help-content-indent-description' => '{{Identical|Indent}}',
 );
 
 /** Abkhazian (Аҧсшәа)
@@ -588,7 +613,7 @@ $messages['af'] = array(
 	'wikieditor-toolbar' => 'Wysigingswerksbalk',
 	'wikieditor-toolbar-desc' => 'Wysigingsbalk met verhoogde bruikbaarheid',
 	'wikieditor-toolbar-preference' => 'Gebruik gevorderde redigeringsbalk',
-	'wikieditor-toolbar-dialogs-preference' => 'Aktiveer dialoog vir die byvoeging van skakels, tabelle en meer',
+	'wikieditor-toolbar-dialogs-preference' => 'Aktiveer dialoog vir die byvoeging van skakels, tabelle en meer', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Steek die ondertekening knoppie van die bladsye in die hoof naamruimte',
 	'wikieditor-toolbar-loading' => 'Besig om te laai...',
 	'wikieditor-toolbar-tool-bold' => 'Vetdruk',
@@ -624,10 +649,14 @@ Wil u dit na 'n interne skakel verander?",
 	'wikieditor-toolbar-tool-link-empty' => 'U het niks ingesleutel om na te skakel nie.',
 	'wikieditor-toolbar-tool-file' => 'Ingebedde lêer',
 	'wikieditor-toolbar-tool-file-example' => 'Voorbeeld.jpg',
+	'wikieditor-toolbar-tool-file-title' => 'Voeg lêer by',
 	'wikieditor-toolbar-file-target' => 'Lêernaam:',
 	'wikieditor-toolbar-file-caption' => 'Byskrif:',
 	'wikieditor-toolbar-file-size' => 'Grootte:',
+	'wikieditor-toolbar-file-float' => 'Uitlyning:',
+	'wikieditor-toolbar-file-default' => '(standaard)',
 	'wikieditor-toolbar-file-format' => 'Formaat:',
+	'wikieditor-toolbar-file-format-none' => 'geen',
 	'wikieditor-toolbar-tool-file-insert' => 'Invoeg',
 	'wikieditor-toolbar-tool-file-cancel' => 'Kanselleer',
 	'wikieditor-toolbar-tool-reference' => 'Verwysing',
@@ -694,7 +723,7 @@ $1:Voorbeeld2|Byskrif2',
 	'wikieditor-toolbar-tool-table-preview' => 'Voorskou',
 	'wikieditor-toolbar-tool-table-insert' => 'Invoeg',
 	'wikieditor-toolbar-tool-table-cancel' => 'Kanselleer',
-	'wikieditor-toolbar-tool-table-toomany' => "U kan nie 'n tabel met meer as $1 selle met die dialoog invoeg nie.", # Fuzzy
+	'wikieditor-toolbar-tool-table-toomany' => "Die dialoog kan die 'n tabel met meer as 1000 selle hanteer nie.",
 	'wikieditor-toolbar-tool-table-invalidnumber' => "U het 'n ongeldige aantal lyne of kolomme verskaf.",
 	'wikieditor-toolbar-tool-table-zero' => "U kan nie 'n tabel sonder lyne en kolomme invoeg nie.",
 	'wikieditor-toolbar-tool-replace' => 'Soek en vervang',
@@ -708,7 +737,7 @@ $1:Voorbeeld2|Byskrif2',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'Vervang alles',
 	'wikieditor-toolbar-tool-replace-close' => 'Sluit',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'U soektog het geen resultate opgelewer nie.',
-	'wikieditor-toolbar-tool-replace-success' => '$1 vervangings gemaak.', # Fuzzy
+	'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|item|items}} is vervang.',
 	'wikieditor-toolbar-tool-replace-emptysearch' => 'U het niks ingesleutel om na te soek nie.',
 	'wikieditor-toolbar-tool-replace-invalidregex' => 'Die "regular expression" wat u verskaf het is ongeldig: $1',
 	'wikieditor-toolbar-section-characters' => 'Spesiale karakters',
@@ -776,7 +805,7 @@ $1:Voorbeeld2|Byskrif2',
 	'wikieditor-toolbar-help-content-olist-syntax' => '# Lyn in genommerde lys<br /># Lyn in genommerde lys',
 	'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Lyn in genommerde lys</li><li>Lyn in genommerde lys</li></ol>',
 	'wikieditor-toolbar-help-content-file-description' => 'Ingebedde lêer',
-	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Voorbeeld.png|thumb|Byskrif]]', # Fuzzy
+	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Voorbeeld.png|thumb|Byskrif]]',
 	'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Byskrif' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Vergroot' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Byskrif</div></div>",
 	'wikieditor-toolbar-help-content-reference-description' => 'Verwysing',
 	'wikieditor-toolbar-help-content-reference-syntax' => 'Bladsyteks.&lt;ref name="test"&gt;[http://www.voorbeeld.org Skakel se teks], addisionele teks.&lt;/ref&gt;',
@@ -828,7 +857,7 @@ $messages['aln'] = array(
 	'wikieditor-toolbar' => 'Editing toolbar', # Fuzzy
 	'wikieditor-toolbar-desc' => 'toolbar Redakto faqe me të përdorshmërisë zgjeruar',
 	'wikieditor-toolbar-preference' => 'Lejo redaktimin zgjeruar toolbar',
-	'wikieditor-toolbar-dialogs-preference' => 'dialogs Aktivizo për futjen e lidhjeve, tavolina dhe më shumë',
+	'wikieditor-toolbar-dialogs-preference' => 'dialogs Aktivizo për futjen e lidhjeve, tavolina dhe më shumë', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Loading ...', # Fuzzy
 	'wikieditor-toolbar-tool-bold' => 'Guximtar',
 	'wikieditor-toolbar-tool-bold-example' => 'Tekst i trashë',
@@ -1054,7 +1083,7 @@ $messages['an'] = array(
 	'wikieditor-toolbar' => "Barra de ferramientas d'edición",
 	'wikieditor-toolbar-desc' => "Barra de ferramientas d'edición con usabilidat amillorada",
 	'wikieditor-toolbar-preference' => "Activar a barra de ferramientas d'edición amillorada",
-	'wikieditor-toolbar-dialogs-preference' => 'Activar as caixas de dialogos ta ficar vinclos, tablas y atros',
+	'wikieditor-toolbar-dialogs-preference' => 'Activar as caixas de dialogos ta ficar vinclos, tablas y atros', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Amagar o botón sinyar en as pachinas en o espacio de nombres prencipal',
 	'wikieditor-toolbar-loading' => 'Cargando...',
 	'wikieditor-toolbar-tool-bold' => 'Negreta',
@@ -1253,51 +1282,52 @@ $1:Eixemplo.jpg|Piet_de_foto_2',
 
 /** Old English (Ænglisc)
  * @author Gott wisst
+ * @author Shirayuki
  * @author Wōdenhelm
  */
 $messages['ang'] = array(
-	'wikieditor-toolbar' => 'Ādihtende tōlscyttel',
-	'wikieditor-toolbar-loading' => 'Hlādende...',
+	'wikieditor-toolbar' => 'Adihtunge tōlmearc',
+	'wikieditor-toolbar-loading' => 'Hladende...',
 	'wikieditor-toolbar-tool-bold' => 'Þicce',
 	'wikieditor-toolbar-tool-bold-example' => 'Þicce traht',
-	'wikieditor-toolbar-tool-ilink' => 'Innanƿeard hlenċe',
-	'wikieditor-toolbar-tool-ilink-example' => 'Hlenċenama',
-	'wikieditor-toolbar-tool-xlink' => 'Ūtanƿeard hlenċe (ȝemynd http:// foretraht)',
-	'wikieditor-toolbar-tool-link' => 'Hlenċe',
-	'wikieditor-toolbar-tool-link-title' => 'Hlenċan ēacian',
-	'wikieditor-toolbar-tool-link-int' => 'To ƿikisīdan',
-	'wikieditor-toolbar-tool-link-int-target' => 'Gōl sīde oþþe URL:',
-	'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Sīdenama oþþe URL',
-	'wikieditor-toolbar-tool-link-int-text' => 'Traht to scēaƿienne:',
-	'wikieditor-toolbar-tool-link-ext' => 'To ūtanƿeardum ƿebbsīdan',
-	'wikieditor-toolbar-tool-link-ext-target' => 'Hlenċe URL',
-	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ūtanƿeard hlenċan',
-	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Innanƿeard hlenċe',
-	'wikieditor-toolbar-tool-file-example' => 'Bisen.jpg',
+	'wikieditor-toolbar-tool-ilink' => 'Innanweard hlenca',
+	'wikieditor-toolbar-tool-ilink-example' => 'Hlencan nama',
+	'wikieditor-toolbar-tool-xlink' => 'Ūtanweard hlenca (gemynd http:// fōretraht)',
+	'wikieditor-toolbar-tool-link' => 'Hlenca',
+	'wikieditor-toolbar-tool-link-title' => 'Insettan hlencan',
+	'wikieditor-toolbar-tool-link-int' => 'Tō wiki tramete',
+	'wikieditor-toolbar-tool-link-int-target' => 'Endelīc tramet oþþe URL:',
+	'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Trametes nama oþþe URL',
+	'wikieditor-toolbar-tool-link-int-text' => 'Traht þe bēo geīwed:',
+	'wikieditor-toolbar-tool-link-ext' => 'To ūtanweardum webbtramete',
+	'wikieditor-toolbar-tool-link-ext-target' => 'Hlencan URL:',
+	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ūtanweard hlenca',
+	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Innanweard hlenca',
+	'wikieditor-toolbar-tool-file-example' => 'Bysen.jpg',
 	'wikieditor-toolbar-tool-reference' => 'Fruma',
-	'wikieditor-toolbar-tool-heading-1' => 'Emnet 1',
-	'wikieditor-toolbar-tool-heading-2' => 'Emnet 2',
-	'wikieditor-toolbar-tool-heading-3' => 'Emnet 3',
-	'wikieditor-toolbar-tool-heading-4' => 'Emnet 4',
-	'wikieditor-toolbar-tool-heading-5' => 'Emnet 5',
-	'wikieditor-toolbar-tool-big' => 'Miċel',
-	'wikieditor-toolbar-tool-big-example' => 'Miċel traht',
+	'wikieditor-toolbar-tool-heading-1' => '1. emnet',
+	'wikieditor-toolbar-tool-heading-2' => '2. emnet',
+	'wikieditor-toolbar-tool-heading-3' => '3. emnet',
+	'wikieditor-toolbar-tool-heading-4' => '4. emnet',
+	'wikieditor-toolbar-tool-heading-5' => '5. emnet',
+	'wikieditor-toolbar-tool-big' => 'Micel',
+	'wikieditor-toolbar-tool-big-example' => 'Micel traht',
 	'wikieditor-toolbar-tool-small' => 'Lytel',
 	'wikieditor-toolbar-tool-small-example' => 'Lytel traht',
-	'wikieditor-toolbar-tool-table' => 'Tæfl',
-	'wikieditor-toolbar-tool-table-dimensions-rows' => 'Rǣƿa',
-	'wikieditor-toolbar-tool-table-example' => 'Bisen',
-	'wikieditor-toolbar-tool-table-preview' => 'Forescēaƿian',
+	'wikieditor-toolbar-tool-table' => 'Tabelle',
+	'wikieditor-toolbar-tool-table-dimensions-rows' => 'Rǣwa',
+	'wikieditor-toolbar-tool-table-example' => 'Bysen',
+	'wikieditor-toolbar-tool-table-preview' => 'Fōrebysen',
 	'wikieditor-toolbar-characters-page-latin' => 'Lǣden',
-	'wikieditor-toolbar-characters-page-latinextended' => 'Āstrecced Lǣden',
+	'wikieditor-toolbar-characters-page-latinextended' => 'Ēacnod Lǣden',
 	'wikieditor-toolbar-characters-page-symbols' => 'Tācnu',
 	'wikieditor-toolbar-characters-page-greek' => 'Grēcisc',
 	'wikieditor-toolbar-characters-page-cyrillic' => 'Cyrillisc',
 	'wikieditor-toolbar-characters-page-arabic' => 'Arabisc',
 	'wikieditor-toolbar-characters-page-persian' => 'Perseanisc',
 	'wikieditor-toolbar-section-help' => 'Help',
-	'wikieditor-toolbar-help-page-link' => 'Hlenċan',
-	'wikieditor-toolbar-help-page-discussion' => 'Ȝespreċ',
+	'wikieditor-toolbar-help-page-link' => 'Hlencan',
+	'wikieditor-toolbar-help-page-discussion' => 'Mōtung',
 	'wikieditor-toolbar-help-content-bold-description' => 'Þicce',
 	'wikieditor-toolbar-help-content-bold-syntax' => "'''Þicce traht'''",
 	'wikieditor-toolbar-help-content-bold-result' => '<strong>Þicce traht</strong>',
@@ -1321,37 +1351,37 @@ $messages['ar'] = array(
 	'wikieditor' => 'الواجهة المتقدمة لتعديل نص ويكي',
 	'wikieditor-desc' => 'يوفر واجهة تعديل نص ويكي قابلة للتمديد والعديد من الوحدات التي توفر المزايا',
 	'wikieditor-wikitext-tab' => 'نص الويكي',
-	'wikieditor-loading' => 'جاري التحميل...',
-	'wikieditor-preview-preference' => 'مكّن المعاينة جنبًا لجنب',
-	'wikieditor-preview-tab' => 'عرض مسبق',
+	'wikieditor-loading' => 'تحميل...',
+	'wikieditor-preview-preference' => 'تفعيل المعاينة جنبا بجنب',
+	'wikieditor-preview-tab' => 'معاينة',
 	'wikieditor-preview-changes-tab' => 'تغييرات',
-	'wikieditor-preview-loading' => 'جاري التحميل...',
-	'wikieditor-previewDialog-preference' => 'مكّن حوار المعاينة',
-	'wikieditor-previewDialog-tab' => 'عرض مسبق',
-	'wikieditor-previewDialog-loading' => 'جاري التحميل...',
-	'wikieditor-publish-preference' => 'فعّل النشر خطوة بخطوة',
+	'wikieditor-preview-loading' => 'تحميل...',
+	'wikieditor-previewDialog-preference' => 'تفعيل حوار المعاينة',
+	'wikieditor-previewDialog-tab' => 'معاينة',
+	'wikieditor-previewDialog-loading' => 'تحميل...',
+	'wikieditor-publish-preference' => 'تفعيل النشر خطوة بخطوة',
 	'wikieditor-publish-button-publish' => 'انشر',
 	'wikieditor-publish-button-cancel' => 'إلغاء',
 	'wikieditor-publish-dialog-title' => 'انشر في {{SITENAME}}',
-	'wikieditor-publish-dialog-summary' => 'ملخص التعديل (اشرح باختصار التغييرات التي قمت بها):',
+	'wikieditor-publish-dialog-summary' => 'ملخص التعديل (اشرح باختصار التغييرات التي أجريتها):',
 	'wikieditor-publish-dialog-minor' => 'تعديل طفيف',
 	'wikieditor-publish-dialog-watch' => 'راقب هذه الصفحة',
 	'wikieditor-publish-dialog-publish' => 'انشر',
 	'wikieditor-publish-dialog-goback' => 'ارجع',
-	'wikieditor-template-editor-preference' => 'فعل تعديل قوالب الويكي المعتمد على النماذج',
-	'wikieditor-template-editor-dialog-title' => 'عدّل القالب',
-	'wikieditor-template-editor-dialog-submit' => 'حدّث',
-	'wikieditor-template-editor-dialog-cancel' => 'إلغاء',
-	'wikieditor-templates-preference' => 'مكّن طي القوالب',
-	'wikieditor-toc-preference' => 'مكّن جدول المحتويات القابل للتصفح',
+	'wikieditor-template-editor-preference' => 'تفعيل تعديل قوالب الويكي في نماذج',
+	'wikieditor-template-editor-dialog-title' => 'عدل القالب',
+	'wikieditor-template-editor-dialog-submit' => 'حدث',
+	'wikieditor-template-editor-dialog-cancel' => 'ألغ',
+	'wikieditor-templates-preference' => 'تفعيل طي القوالب',
+	'wikieditor-toc-preference' => 'تفعيل جدول المحتويات القابل للتصفح',
 	'wikieditor-toc-show' => 'أظهر المحتويات',
-	'wikieditor-toc-hide' => 'أخفِ المحتويات',
+	'wikieditor-toc-hide' => 'أخف المحتويات',
 	'wikieditor-toolbar' => 'شريط أدوات التحرير',
 	'wikieditor-toolbar-desc' => 'شريط تحرير الصفحات مع تحسين الاستخدامية',
-	'wikieditor-toolbar-preference' => 'مكن شريط أدوات التحرير المحسن',
-	'wikieditor-toolbar-dialogs-preference' => 'مكن حوارات إدراج الوصلات والجداول وغيرها',
+	'wikieditor-toolbar-preference' => 'تفعيل شريط أدوات التحرير المحسن',
+	'wikieditor-toolbar-dialogs-preference' => 'تفعيل حوارات إدراج الوصلات والجداول وخاصية البحث والاستبدال',
 	'wikieditor-toolbar-hidesig' => 'أخف زر التوقيع في صفحات النطاق الرئيسي',
-	'wikieditor-toolbar-loading' => 'جاري التحميل...',
+	'wikieditor-toolbar-loading' => 'تحميل...',
 	'wikieditor-toolbar-tool-bold' => 'غليظ',
 	'wikieditor-toolbar-tool-bold-example' => 'نص غليظ',
 	'wikieditor-toolbar-tool-italic' => 'مائل',
@@ -1377,20 +1407,21 @@ $messages['ar'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'عنوان غير صحيح',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'وصلة خارجية',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'يلتمس وجود الصفحة...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'صفحة توضيح',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'العنوان الذي اخترته غير صالح.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'يبدو أن المُراد بالمسار الذي حددته وصلة إلى صفحة ويكي أخرى. أتريد أن تجعلها وصلة داخلية؟',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'وصلة داخلية',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'وصلة خارجية',
 	'wikieditor-toolbar-tool-link-empty' => 'لم تدخل شيئا لتصل به.',
-	'wikieditor-toolbar-tool-file' => 'ملف مضمّن',
+	'wikieditor-toolbar-tool-file' => 'ملف مضمن',
 	'wikieditor-toolbar-tool-file-example' => 'Example.jpg',
 	'wikieditor-toolbar-tool-file-title' => 'أدرج الملف',
 	'wikieditor-toolbar-file-target' => 'اسم الملف:',
 	'wikieditor-toolbar-file-caption' => 'التعليق:',
 	'wikieditor-toolbar-file-size' => 'الحجم:',
 	'wikieditor-toolbar-file-float' => 'ناحية:',
-	'wikieditor-toolbar-file-default' => '(افتراضي)',
-	'wikieditor-toolbar-file-format' => 'الصيغة:',
+	'wikieditor-toolbar-file-default' => '(غيابي)',
+	'wikieditor-toolbar-file-format' => 'صيغة:',
 	'wikieditor-toolbar-file-format-none' => 'لا يوجد',
 	'wikieditor-toolbar-tool-file-insert' => 'إدراج',
 	'wikieditor-toolbar-tool-file-cancel' => 'إلغاء',
@@ -1402,22 +1433,22 @@ $messages['ar'] = array(
 	'wikieditor-toolbar-tool-reference-text' => 'نص المرجع',
 	'wikieditor-toolbar-tool-signature' => 'توقيع مع الطابع الزمني',
 	'wikieditor-toolbar-section-advanced' => 'متقدم',
-	'wikieditor-toolbar-tool-heading' => 'ترويسة',
+	'wikieditor-toolbar-tool-heading' => 'عنوان',
 	'wikieditor-toolbar-tool-heading-1' => 'مستوى 1',
 	'wikieditor-toolbar-tool-heading-2' => 'مستوى 2',
 	'wikieditor-toolbar-tool-heading-3' => 'مستوى 3',
 	'wikieditor-toolbar-tool-heading-4' => 'مستوى 4',
 	'wikieditor-toolbar-tool-heading-5' => 'مستوى 5',
-	'wikieditor-toolbar-tool-heading-example' => 'نص الترويسة',
+	'wikieditor-toolbar-tool-heading-example' => 'نص العنوان',
 	'wikieditor-toolbar-group-format' => 'تنسيق',
-	'wikieditor-toolbar-tool-ulist' => 'قائمة منقّطة',
+	'wikieditor-toolbar-tool-ulist' => 'قائمة منقطة',
 	'wikieditor-toolbar-tool-ulist-example' => 'عنصر قائمة منقطة',
 	'wikieditor-toolbar-tool-olist' => 'قائمة مرقمة',
 	'wikieditor-toolbar-tool-olist-example' => 'عنصر قائمة مرقمة',
-	'wikieditor-toolbar-tool-indent' => 'هامش',
-	'wikieditor-toolbar-tool-indent-example' => 'سطر بهامش',
-	'wikieditor-toolbar-tool-nowiki' => 'لا تنسيق ويكي',
-	'wikieditor-toolbar-tool-nowiki-example' => 'أدرج نصًا غير منسق هنا',
+	'wikieditor-toolbar-tool-indent' => 'إزاحة',
+	'wikieditor-toolbar-tool-indent-example' => 'إزاحة سطر',
+	'wikieditor-toolbar-tool-nowiki' => 'بلا تنسيق ويكي',
+	'wikieditor-toolbar-tool-nowiki-example' => 'نص غير منسق',
 	'wikieditor-toolbar-tool-redirect' => 'تحويلة',
 	'wikieditor-toolbar-tool-redirect-example' => 'اسم الصفحة الهدف',
 	'wikieditor-toolbar-tool-big' => 'كبير',
@@ -1425,55 +1456,55 @@ $messages['ar'] = array(
 	'wikieditor-toolbar-tool-small' => 'صغير',
 	'wikieditor-toolbar-tool-small-example' => 'نص صغير',
 	'wikieditor-toolbar-tool-superscript' => 'حرف علوي',
-	'wikieditor-toolbar-tool-superscript-example' => 'نص الحرف العلوي',
+	'wikieditor-toolbar-tool-superscript-example' => 'نص علوي',
 	'wikieditor-toolbar-tool-subscript' => 'حرف سفلي',
-	'wikieditor-toolbar-tool-subscript-example' => 'نص الحرف السفلي',
-	'wikieditor-toolbar-group-insert' => 'أدرج',
+	'wikieditor-toolbar-tool-subscript-example' => 'نص سفلي',
+	'wikieditor-toolbar-group-insert' => 'إدراج',
 	'wikieditor-toolbar-tool-gallery' => 'معرض صور',
 	'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|تعليق1
 $1:Example.jpg|تعليق2',
 	'wikieditor-toolbar-tool-newline' => 'سطر جديد',
-	'wikieditor-toolbar-tool-table' => 'جدولًا',
+	'wikieditor-toolbar-tool-table' => 'جدول',
 	'wikieditor-toolbar-tool-table-example-old' => '-
-! ترويسة 1
-! ترويسة 2
-! ترويسة 3
+! عنوان عمود 1
+! عنوان عمود 2
+! عنوان عمود 3
 |-
-| صف 1، خلية 1
-| صف 1، خلية 2
-| صف 1، خلية 3
+| صف 1، خانة 1
+| صف 1، خانة 2
+| صف 1، خانة 3
 |-
-| صف 2، خلية 1
-| صف 2، خلية 2
-| صف 2، خلية 3',
-	'wikieditor-toolbar-tool-table-example-cell-text' => 'نص الخلية',
-	'wikieditor-toolbar-tool-table-example-header' => 'نص الترويسة',
+| صف 2، خانة 1
+| صف 2، خانة 2
+| صف 2، خانة 3',
+	'wikieditor-toolbar-tool-table-example-cell-text' => 'نص الخانة',
+	'wikieditor-toolbar-tool-table-example-header' => 'عنوان العمود',
 	'wikieditor-toolbar-tool-table-title' => 'إدراج جدول',
-	'wikieditor-toolbar-tool-table-dimensions-rows' => 'الصفوف',
-	'wikieditor-toolbar-tool-table-dimensions-columns' => 'الأعمدة',
-	'wikieditor-toolbar-tool-table-dimensions-header' => 'ضمّن صف الترويسة',
-	'wikieditor-toolbar-tool-table-wikitable' => 'سمة ذات حدود',
+	'wikieditor-toolbar-tool-table-dimensions-rows' => 'صفوف',
+	'wikieditor-toolbar-tool-table-dimensions-columns' => 'أعمدة',
+	'wikieditor-toolbar-tool-table-dimensions-header' => 'صف العناوين',
+	'wikieditor-toolbar-tool-table-wikitable' => 'حدود',
 	'wikieditor-toolbar-tool-table-sortable' => 'اجعل الجدول قابلا للترتيب',
 	'wikieditor-toolbar-tool-table-example' => 'مثال',
-	'wikieditor-toolbar-tool-table-preview' => 'عرض مسبق',
+	'wikieditor-toolbar-tool-table-preview' => 'معاينة',
 	'wikieditor-toolbar-tool-table-insert' => 'أدرج',
 	'wikieditor-toolbar-tool-table-cancel' => 'إلغاء',
-	'wikieditor-toolbar-tool-table-toomany' => 'إدراج جدول بأكثر من 1000 خلية غير ممكن عبر هذا الحوار.',
+	'wikieditor-toolbar-tool-table-toomany' => 'إدراج جدول بأكثر من 1000 خانة غير ممكن هنا.',
 	'wikieditor-toolbar-tool-table-invalidnumber' => 'لم تدخل رقما صحيحا للصفوف أو الأعمدة.',
 	'wikieditor-toolbar-tool-table-zero' => 'لا يمكن أن تدرج جدولا بلا صفوف أو أعمدة.',
 	'wikieditor-toolbar-tool-replace' => 'ابحث واستبدل',
 	'wikieditor-toolbar-tool-replace-title' => 'ابحث واستبدل',
 	'wikieditor-toolbar-tool-replace-search' => 'ابحث عن:',
 	'wikieditor-toolbar-tool-replace-replace' => 'استبدل ب:',
-	'wikieditor-toolbar-tool-replace-case' => 'مطابقة الحالة',
-	'wikieditor-toolbar-tool-replace-regex' => 'عامل عبارة البحث كتعبير نمطي',
-	'wikieditor-toolbar-tool-replace-button-findnext' => 'جِد التالي',
+	'wikieditor-toolbar-tool-replace-case' => 'مطابقة حالة الأحرف الكبيرة أو الصغيرة',
+	'wikieditor-toolbar-tool-replace-regex' => 'البحث باستعمال تعبير نمطي',
+	'wikieditor-toolbar-tool-replace-button-findnext' => 'جد التالي',
 	'wikieditor-toolbar-tool-replace-button-replace' => 'استبدل',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'استبدل الكل',
 	'wikieditor-toolbar-tool-replace-close' => 'أغلق',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'بحثك لم يطابق أي شيء.',
-	'wikieditor-toolbar-tool-replace-success' => 'أجري $1 استبدال(ات).', # Fuzzy
-	'wikieditor-toolbar-tool-replace-emptysearch' => 'لم تكتب شيئًا لتبحث عنه.',
+	'wikieditor-toolbar-tool-replace-success' => 'أجري {{PLURAL:$1|استبدال|استبدال واحد|استبدالان|$1 استبدالات|$1 استبدالا|$1 استبدال}}.',
+	'wikieditor-toolbar-tool-replace-emptysearch' => 'لم تكتب شيئا لتبحث عنه.',
 	'wikieditor-toolbar-tool-replace-invalidregex' => 'التعبير النمطي الذي أدخلته غير صالح: $1',
 	'wikieditor-toolbar-section-characters' => 'أحرف خاصة',
 	'wikieditor-toolbar-characters-page-latin' => 'لاتينية',
@@ -1484,7 +1515,7 @@ $1:Example.jpg|تعليق2',
 	'wikieditor-toolbar-characters-page-cyrillic' => 'كيريلية',
 	'wikieditor-toolbar-characters-page-arabic' => 'عربية',
 	'wikieditor-toolbar-characters-page-arabicextended' => 'عربية موسعة',
-	'wikieditor-toolbar-characters-page-persian' => 'الفارسية',
+	'wikieditor-toolbar-characters-page-persian' => 'فارسية',
 	'wikieditor-toolbar-characters-page-hebrew' => 'عبرية',
 	'wikieditor-toolbar-characters-page-bangla' => 'بنغالية',
 	'wikieditor-toolbar-characters-page-tamil' => 'تاميلية',
@@ -1495,13 +1526,16 @@ $1:Example.jpg|تعليق2',
 	'wikieditor-toolbar-characters-page-thai' => 'تايلندية',
 	'wikieditor-toolbar-characters-page-lao' => 'لاوية',
 	'wikieditor-toolbar-characters-page-khmer' => 'خميرية',
+	'wikieditor-toolbar-characters-endash' => 'واصلة قصيرة',
+	'wikieditor-toolbar-characters-emdash' => 'واصلة طويلة',
+	'wikieditor-toolbar-characters-minus' => 'علامة الطرح',
 	'wikieditor-toolbar-section-help' => 'مساعدة',
-	'wikieditor-toolbar-help-heading-description' => 'الوصف',
+	'wikieditor-toolbar-help-heading-description' => 'وصف',
 	'wikieditor-toolbar-help-heading-syntax' => 'ما تكتبه',
 	'wikieditor-toolbar-help-heading-result' => 'ما تحصل عليه',
 	'wikieditor-toolbar-help-page-format' => 'تنسيق',
 	'wikieditor-toolbar-help-page-link' => 'وصلات',
-	'wikieditor-toolbar-help-page-heading' => 'ترويسات',
+	'wikieditor-toolbar-help-page-heading' => 'عناوين',
 	'wikieditor-toolbar-help-page-list' => 'قوائم',
 	'wikieditor-toolbar-help-page-file' => 'ملفات',
 	'wikieditor-toolbar-help-page-reference' => 'مراجع',
@@ -1521,26 +1555,26 @@ $1:Example.jpg|تعليق2',
 	'wikieditor-toolbar-help-content-xlink-description' => 'وصلة خارجية',
 	'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org اسم الوصلة]<br />[http://www.example.org]<br />http://www.example.org',
 	'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>اسم الوصلة</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.example.org</a>",
-	'wikieditor-toolbar-help-content-heading2-description' => 'ترويسة المستوى الثاني',
-	'wikieditor-toolbar-help-content-heading2-syntax' => '== نص الترويسة ==',
-	'wikieditor-toolbar-help-content-heading2-result' => '<h2>نص الترويسة</h2>',
-	'wikieditor-toolbar-help-content-heading3-description' => 'ترويسة المستوى الثالث',
-	'wikieditor-toolbar-help-content-heading3-syntax' => '=== نص الترويسة ===',
-	'wikieditor-toolbar-help-content-heading3-result' => '<h3>نص الترويسة</h3>',
-	'wikieditor-toolbar-help-content-heading4-description' => 'توريسة المستوى الرابع',
-	'wikieditor-toolbar-help-content-heading4-syntax' => '==== نص الترويسة ====',
-	'wikieditor-toolbar-help-content-heading4-result' => '<h4>نص الترويسة</h4>',
-	'wikieditor-toolbar-help-content-heading5-description' => 'توريسة المستوى الخامس',
-	'wikieditor-toolbar-help-content-heading5-syntax' => '===== نص الترويسة =====',
-	'wikieditor-toolbar-help-content-heading5-result' => '<h5>نص الترويسة</h5>',
-	'wikieditor-toolbar-help-content-ulist-description' => 'قائمة منقّطة',
+	'wikieditor-toolbar-help-content-heading2-description' => 'عنوان من المستوى الثاني',
+	'wikieditor-toolbar-help-content-heading2-syntax' => '== عنوان ==',
+	'wikieditor-toolbar-help-content-heading2-result' => '<h2>عنوان</h2>',
+	'wikieditor-toolbar-help-content-heading3-description' => 'عنوان من المستوى الثالث',
+	'wikieditor-toolbar-help-content-heading3-syntax' => '=== عنوان ===',
+	'wikieditor-toolbar-help-content-heading3-result' => '<h3>عنوان</h3>',
+	'wikieditor-toolbar-help-content-heading4-description' => 'عنوان من المستوى الرابع',
+	'wikieditor-toolbar-help-content-heading4-syntax' => '==== عنوان ====',
+	'wikieditor-toolbar-help-content-heading4-result' => '<h4>عنوان</h4>',
+	'wikieditor-toolbar-help-content-heading5-description' => 'عنوان من المستوى الخامس',
+	'wikieditor-toolbar-help-content-heading5-syntax' => '===== عنوان =====',
+	'wikieditor-toolbar-help-content-heading5-result' => '<h5>عنوان</h5>',
+	'wikieditor-toolbar-help-content-ulist-description' => 'قائمة منقطة',
 	'wikieditor-toolbar-help-content-ulist-syntax' => '* عنصر قائمة<br />* عنصر قائمة',
 	'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>عنصر قائمة</li><li>عنصر قائمة</li></ul>',
 	'wikieditor-toolbar-help-content-olist-description' => 'قائمة مرقمة',
 	'wikieditor-toolbar-help-content-olist-syntax' => '# عنصر قائمة<br /># عنصر قائمة',
 	'wikieditor-toolbar-help-content-olist-result' => '<ol><li>عنصر قائمة</li><li>عنصر قائمة</li></ol>',
-	'wikieditor-toolbar-help-content-file-description' => 'ملف مضمّن',
-	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|نص التعليق]]',
+	'wikieditor-toolbar-help-content-file-description' => 'ملف مضمن',
+	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|تصغير|نص التعليق]]',
 	'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='نص التعليق' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='تكبير' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>نص التعليق</div></div>",
 	'wikieditor-toolbar-help-content-reference-description' => 'مرجع',
 	'wikieditor-toolbar-help-content-reference-syntax' => 'نص الصفحة.&lt;ref name="test"&gt;[http://www.example.org نص الوصلة]، نص إضافي.&lt;/ref&gt;',
@@ -1549,13 +1583,13 @@ $1:Example.jpg|تعليق2',
 	'wikieditor-toolbar-help-content-rereference-result' => "نص الصفحة.<sup><a href='#'>[1]</a></sup>",
 	'wikieditor-toolbar-help-content-showreferences-description' => 'اعرض المراجع',
 	'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>نص الرابط</a>، نص إضافي.</li></ol>",
-	'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'التوقيع مع الطابع الزمني',
-	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>اسم المستخدم</a> (<a href='#' title='{{#special:mytalk}}'>ناقش</a>) 15:54، 10 يونيو 2009 (ت‌ع‌م)",
-	'wikieditor-toolbar-help-content-signature-description' => 'التوقيع',
+	'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'توقيع مع طابع زمني',
+	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>اسم المستخدم</a> (<a href='#' title='{{#special:mytalk}}'>ناقش</a>) 15:54، 10 يونيو 2009 (ت ع م)",
+	'wikieditor-toolbar-help-content-signature-description' => 'توقيع',
 	'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>اسم المستخدم</a> (<a href='#' title='{{#special:mytalk}}'>ناقش</a>)",
-	'wikieditor-toolbar-help-content-indent-description' => 'بادئة',
-	'wikieditor-toolbar-help-content-indent-syntax' => 'نص عادي<br />:نص ببادئة<br />::نص ببادئة',
-	'wikieditor-toolbar-help-content-indent-result' => 'نص عادي<dl><dd>نص ببادئة<dl><dd>نص ببادئة</dd></dl></dd></dl>',
+	'wikieditor-toolbar-help-content-indent-description' => 'إزاحة',
+	'wikieditor-toolbar-help-content-indent-syntax' => 'نص عادي<br />:نص مزاح<br />::نص مزاح',
+	'wikieditor-toolbar-help-content-indent-result' => 'نص عادي<dl><dd>نص مزاح<dl><dd>نص مزاح</dd></dl></dd></dl>',
 );
 
 /** Aramaic (ܐܪܡܝܐ)
@@ -1892,7 +1926,7 @@ $1:Example.jpg|Caption2',
 	'wikieditor-toolbar-help-content-indent-result' => 'Normal text<dl><dd>Indented text<dl><dd>Indented text</dd></dl></dd></dl>',
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Bishnu Saikia
  * @author Chaipau
  * @author Gitartha.bordoloi
@@ -1930,7 +1964,7 @@ $messages['as'] = array(
 	'wikieditor-toolbar' => 'সম্পাদনা টুলবাৰ',
 	'wikieditor-toolbar-desc' => 'অধিক ব্যৱহাৰযোগ্য সম্পাদনা পৃষ্ঠাৰ টুলবাৰ',
 	'wikieditor-toolbar-preference' => 'শক্তিশালী সম্পাদনা টুলবাৰ সক্ৰিয় কৰক',
-	'wikieditor-toolbar-dialogs-preference' => 'লিংক, টেবল আৰু অধিক বস্তু সংযোজনৰ বাবে ডায়লগ সক্ৰিয় কৰক',
+	'wikieditor-toolbar-dialogs-preference' => 'লিংক, টেবল আৰু অধিক বস্তু সংযোজনৰ বাবে ডায়লগ সক্ৰিয় কৰক', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'মুখ্য নামস্থানৰ পৃষ্ঠাবোৰত স্বাক্ষৰ বুটাম লুকুৱাওক',
 	'wikieditor-toolbar-loading' => "ল'ড হৈ আছে…",
 	'wikieditor-toolbar-tool-bold' => 'গাঢ়',
@@ -2178,7 +2212,7 @@ $messages['ast'] = array(
 	'wikieditor-toolbar' => 'Editando la barra de ferramientes',
 	'wikieditor-toolbar-desc' => "Barra de ferramientes de la páxina d'edición con usabilidá enantada",
 	'wikieditor-toolbar-preference' => "Activar a barra d'edición enantada",
-	'wikieditor-toolbar-dialogs-preference' => "Activar los diálogos p'amestar enllaces, tables y más",
+	'wikieditor-toolbar-dialogs-preference' => "Activar los asistentes p'amestar enllaces y tables, y tamién la función de guetar y trocar",
 	'wikieditor-toolbar-hidesig' => 'Anubrir el botón de robla nes páxines del espaciu de nomes principal',
 	'wikieditor-toolbar-loading' => 'Cargando...',
 	'wikieditor-toolbar-tool-bold' => 'Negrina',
@@ -2206,6 +2240,7 @@ $messages['ast'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Títulu inválidu',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Enllaz esternu',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Comprobando la esistencia de la páxina...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Páxina de dixebra',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'El títulu que conseñasti nun ye válidu.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'La URL que conseñasti paez que quería ser un enllaz a otra páxina de la wiki.
 ¿Quies convertila nún enllaz internu?',
@@ -2840,7 +2875,7 @@ $messages['ba'] = array(
 	'wikieditor-toolbar' => 'Мөхәррирләү ҡоралдары',
 	'wikieditor-toolbar-desc' => 'Яҡшыртылған мөхәррирләү ҡоралдары',
 	'wikieditor-toolbar-preference' => 'Яҡшыртылған мөхәррирләү ҡоралдарын ҡулланырға',
-	'wikieditor-toolbar-dialogs-preference' => 'Һылтанмалар, таблицалар һәм башҡаларҙы өҫтәү өсөн диалогтар ҡулланырға',
+	'wikieditor-toolbar-dialogs-preference' => 'Һылтанмалар, таблицалар һәм башҡаларҙы өҫтәү өсөн диалогтар ҡулланырға', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Имза ҡуйыу төймәһен төп исемдәр арауығындағы биттәрҙә йәшерергә',
 	'wikieditor-toolbar-loading' => 'Сығарыу...',
 	'wikieditor-toolbar-tool-bold' => 'Ҡалын',
@@ -3096,7 +3131,7 @@ $messages['be'] = array(
 	'wikieditor-toolbar' => 'Панэль інструментаў',
 	'wikieditor-toolbar-desc' => 'Панэль інструментаў з палепшанымі магчымасцямі',
 	'wikieditor-toolbar-preference' => 'Уключыць панэль інструментаў з палепшанымі магчымасцямі',
-	'wikieditor-toolbar-dialogs-preference' => 'Уключыць дыялогі для ўстаўкі спасылак, табліц і інш.',
+	'wikieditor-toolbar-dialogs-preference' => 'Уключыць дыялогі для ўстаўкі спасылак, табліц і інш.', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Загрузка…',
 	'wikieditor-toolbar-tool-bold' => 'Цёмны',
 	'wikieditor-toolbar-tool-bold-example' => 'Цёмны тэкст',
@@ -3330,7 +3365,7 @@ $messages['be-tarask'] = array(
 	'wikieditor-toolbar' => 'Панэль інструмэнтаў для рэдагаваньня',
 	'wikieditor-toolbar-desc' => 'Панэль інструмэнтаў для рэдагаваньня з палепшанай зручнасьцю',
 	'wikieditor-toolbar-preference' => 'Уключыць палепшаную панэль інструмэнтаў для рэдагаваньня',
-	'wikieditor-toolbar-dialogs-preference' => 'Дазволіць формы для ўстаўкі спасылак, табліцаў і іншых элемэнтаў',
+	'wikieditor-toolbar-dialogs-preference' => 'Дазволіць формы для ўстаўкі спасылак, табліцаў, а таксама для пошуку і замены',
 	'wikieditor-toolbar-hidesig' => 'Схаваць кнопку подпісу са старонак у асноўнай прасторы назваў',
 	'wikieditor-toolbar-loading' => 'Загрузка…',
 	'wikieditor-toolbar-tool-bold' => 'Тоўсты',
@@ -3358,6 +3393,7 @@ $messages['be-tarask'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Няслушная назва',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Вонкавая спасылка',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Праверка існаваньня старонкі…',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Старонка-неадназначнасьць',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Пазначаная няслушная назва.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Пададзены URL-адрас верагодна зьяўляецца спасылкай на іншую вікі-старонку.
 Ці жадаеце зрабіць яе ўнутранай спасылкай?',
@@ -3580,7 +3616,7 @@ $messages['bg'] = array(
 	'wikieditor-toolbar' => 'Лента за редактиране',
 	'wikieditor-toolbar-desc' => 'Лента за редактиране с подобрени възможности за използваемост',
 	'wikieditor-toolbar-preference' => 'Включване на разширената лента с инструменти',
-	'wikieditor-toolbar-dialogs-preference' => 'Включване на инструменти за вмъкване на препратки, таблици и други',
+	'wikieditor-toolbar-dialogs-preference' => 'Включване на инструменти за вмъкване на препратки, таблици и други', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Скриване на бутона за подпис за страници от основното именно пространство',
 	'wikieditor-toolbar-loading' => 'Зареждане...',
 	'wikieditor-toolbar-tool-bold' => 'Получер (удебелен) текст',
@@ -3998,6 +4034,7 @@ $1:Cuntuh.jpg|Judul2',
 );
 
 /** Bengali (বাংলা)
+ * @author Aftab1995
  * @author Bellayet
  * @author Leemon2010
  * @author Nasir8891
@@ -4034,7 +4071,7 @@ $messages['bn'] = array(
 	'wikieditor-toolbar' => 'সম্পাদনা টুলবার',
 	'wikieditor-toolbar-desc' => 'বেশি ব্যবহারযোগ্য সম্পাদনা পাতার টুলবার',
 	'wikieditor-toolbar-preference' => 'শক্তিশালী সম্পাদনা টুলবার সক্রিয় করো',
-	'wikieditor-toolbar-dialogs-preference' => 'যোগকৃত লিংক, ছক এবং আরও কিছুর জন্য ডায়লগ সক্রিয় করো',
+	'wikieditor-toolbar-dialogs-preference' => 'যোগকৃত লিংক, ছক এবং আরও কিছুর জন্য ডায়লগ সক্রিয় করো', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'প্রধান নামস্থানের পাতায় স্বাক্ষর বোতাম লুকাও',
 	'wikieditor-toolbar-loading' => 'লোডিং...',
 	'wikieditor-toolbar-tool-bold' => 'গাঢ়',
@@ -4115,8 +4152,8 @@ $messages['bn'] = array(
 	'wikieditor-toolbar-tool-subscript-example' => 'সাবস্ক্রিপ্ট লেখা',
 	'wikieditor-toolbar-group-insert' => 'যোগ করো',
 	'wikieditor-toolbar-tool-gallery' => 'ছবির গ্যালারী',
-	'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|ক্যাপশন১
-$1:Example.jpg|ক্যাপশন২',
+	'wikieditor-toolbar-tool-gallery-example' => '$1:উদাহরণ.jpg|ক্যাপশন১
+$1:উদাহরণ.jpg|ক্যাপশন২',
 	'wikieditor-toolbar-tool-newline' => 'নতুন লাইন',
 	'wikieditor-toolbar-tool-table' => 'ছক',
 	'wikieditor-toolbar-tool-table-example-old' => '-
@@ -4284,7 +4321,7 @@ $messages['bpy'] = array(
 	'wikieditor-toolbar' => 'পতানির টুলবার',
 	'wikieditor-toolbar-desc' => 'বপ ব্যবহারঅর পতানির পাতা অতার টুলবার',
 	'wikieditor-toolbar-preference' => 'লিঙপা পতার টুলবার ফঙে থ',
-	'wikieditor-toolbar-dialogs-preference' => 'তিলকরিসি লিংক, ছক বারো আরতার ডায়ালগ ফঙে থ',
+	'wikieditor-toolbar-dialogs-preference' => 'তিলকরিসি লিংক, ছক বারো আরতার ডায়ালগ ফঙে থ', # Fuzzy
 	'wikieditor-toolbar-loading' => 'লোডিং…',
 	'wikieditor-toolbar-tool-bold' => 'গাঢ়পা',
 	'wikieditor-toolbar-tool-bold-example' => 'গাঢ়পা ইকা',
@@ -4516,7 +4553,7 @@ $messages['br'] = array(
 	'wikieditor-toolbar' => 'Barrenn ostilhoù kemmañ',
 	'wikieditor-toolbar-desc' => "Barrenn ostilhoù kemmañ aesoc'h da implijout",
 	'wikieditor-toolbar-preference' => 'Gweredekaat ar varrenn ostilhoù kemmañ gwellaet',
-	'wikieditor-toolbar-dialogs-preference' => 'Gweredekaat ar boestoù divizout evit ouzhpennañ liammoù, taolennoù ha traoù all',
+	'wikieditor-toolbar-dialogs-preference' => 'Gweredekaat ar boestoù divizout evit ouzhpennañ liammoù, taolennoù ha traoù all', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Kuzhat ar bouton sinañ er pajennoù zo en esaouenn anv pennañ',
 	'wikieditor-toolbar-loading' => 'O kargañ...',
 	'wikieditor-toolbar-tool-bold' => 'Tev',
@@ -4761,7 +4798,7 @@ $messages['bs'] = array(
 	'wikieditor-toolbar' => 'Uređivanje alatne trake',
 	'wikieditor-toolbar-desc' => 'Alatna traka stranice za uređivanje sa poboljšanom upotrebljivošću',
 	'wikieditor-toolbar-preference' => 'Omogući naprednu traku za uređivanje',
-	'wikieditor-toolbar-dialogs-preference' => 'Omogući dijaloge za dodavanje linkova, tabela i više',
+	'wikieditor-toolbar-dialogs-preference' => 'Omogući čarobnjake za ubacivanje linkova, tabela kao i funkciju pretrage i zamjene',
 	'wikieditor-toolbar-hidesig' => 'Sakrij dugme potpisa sa stranica u glavnom imenskom prostoru',
 	'wikieditor-toolbar-loading' => 'Punjenje...',
 	'wikieditor-toolbar-tool-bold' => 'Podebljano',
@@ -4999,7 +5036,7 @@ $messages['ca'] = array(
 	'wikieditor-toolbar' => "Editant la barra d'eines",
 	'wikieditor-toolbar-desc' => "Barra d'eines d'edició amb usabilitat millorada",
 	'wikieditor-toolbar-preference' => "Habilita la barra d'eines millorada",
-	'wikieditor-toolbar-dialogs-preference' => 'Habilita caixes de diàleg per inserir enllaços, taules i altres',
+	'wikieditor-toolbar-dialogs-preference' => 'Habilita caixes de diàleg per inserir enllaços, taules i altres', # Fuzzy
 	'wikieditor-toolbar-hidesig' => "Amaga el botó de signar de les pàgines de l'espai de noms principal",
 	'wikieditor-toolbar-loading' => 'Carregant...',
 	'wikieditor-toolbar-tool-bold' => 'Negreta',
@@ -5223,7 +5260,7 @@ $messages['ce'] = array(
 	'wikieditor-loading' => 'Чуйолуш',
 	'wikieditor-preview-preference' => 'Латайé хьалха муха ю хьажар дуьхь дуьхьал',
 	'wikieditor-preview-tab' => 'Хьалха муха ю хьажа',
-	'wikieditor-preview-changes-tab' => 'Хийцамаш',
+	'wikieditor-preview-changes-tab' => 'Хийцам',
 	'wikieditor-preview-loading' => 'Чуйолуш…',
 	'wikieditor-previewDialog-preference' => 'Латайé йоза хьалха муха ду хьажар',
 	'wikieditor-previewDialog-tab' => 'Хьалха муха ю хьажа',
@@ -5236,7 +5273,7 @@ $messages['ce'] = array(
 	'wikieditor-publish-dialog-minor' => 'Жим хийцам',
 	'wikieditor-publish-dialog-watch' => 'Тергам бé хlокху агlон',
 	'wikieditor-publish-dialog-publish' => 'Нахангайта',
-	'wikieditor-publish-dialog-goback' => 'Юхьа',
+	'wikieditor-publish-dialog-goback' => 'Юха',
 	'wikieditor-template-editor-preference' => 'Латайé куцкепа рéдаккхар бáраман гlонца',
 	'wikieditor-template-editor-dialog-title' => 'Кеп хийцам',
 	'wikieditor-template-editor-dialog-submit' => 'Карлаяккха',
@@ -5248,48 +5285,56 @@ $messages['ce'] = array(
 	'wikieditor-toolbar' => 'Рéдоккху меттиг',
 	'wikieditor-toolbar-desc' => 'Рéдоккху меттиг гlоле лелорца',
 	'wikieditor-toolbar-preference' => 'Латайé гlоле йолу тадар',
-	'wikieditor-toolbar-dialogs-preference' => 'Латайé йозан хьажориг йуьллург, таблийцан аъ кхин хlумнашна',
+	'wikieditor-toolbar-dialogs-preference' => 'Латайé йозан хьажораг йуьллург, таблицан а кхин хӀумнашна а',
 	'wikieditor-toolbar-loading' => 'Чуйолуш…',
 	'wikieditor-toolbar-tool-bold' => 'Дерстино',
 	'wikieditor-toolbar-tool-bold-example' => 'Дерстино до йоза',
-	'wikieditor-toolbar-tool-italic' => 'Курсетта',
-	'wikieditor-toolbar-tool-italic-example' => 'Курсеттан до йоза',
-	'wikieditor-toolbar-tool-ilink' => 'Чоьхьа хьажориг',
+	'wikieditor-toolbar-tool-italic' => 'Сетта',
+	'wikieditor-toolbar-tool-italic-example' => 'Сеттан до йоза',
+	'wikieditor-toolbar-tool-ilink' => 'Чоьхьа хьажораг',
 	'wikieditor-toolbar-tool-ilink-example' => 'Хьажориган коьрта могlа',
-	'wikieditor-toolbar-tool-xlink' => 'Арахьа хьажориг (йиц ма йе хlотталушерг http://)',
-	'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com хьажориг корта',
-	'wikieditor-toolbar-tool-link' => 'Хьажориг',
-	'wikieditor-toolbar-tool-link-title' => 'Чуйилла хьажориг',
+	'wikieditor-toolbar-tool-xlink' => 'Арахьара хьажораг (йиц ма йе хӀотталушерг http://)',
+	'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com хьажораг корта',
+	'wikieditor-toolbar-tool-link' => 'Хьажораг',
+	'wikieditor-toolbar-tool-link-title' => 'Чуйилла хьажораг',
 	'wikieditor-toolbar-tool-link-int' => 'Оцу вики агlон',
 	'wikieditor-toolbar-tool-link-int-target' => 'Хьажийна агlо йа URL:',
 	'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Агlон цlе йа URL',
 	'wikieditor-toolbar-tool-link-int-text' => 'Гойтуш долу йоза:',
 	'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Чудилла схьагайта дезаш долу йоза',
 	'wikieditor-toolbar-tool-link-ext' => 'Хьалхара агlон чохь',
-	'wikieditor-toolbar-tool-link-ext-target' => 'URL хьажоригаш:',
+	'wikieditor-toolbar-tool-link-ext-target' => 'URL хьажорагаш:',
 	'wikieditor-toolbar-tool-link-ext-text' => 'Хьажориган йоза:',
-	'wikieditor-toolbar-tool-link-insert' => 'Чуйилла хьажориг',
+	'wikieditor-toolbar-tool-link-insert' => 'Чуйилла хьажораг',
 	'wikieditor-toolbar-tool-link-cancel' => 'Цаоьшу',
 	'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Ишта агlо йолш ю',
 	'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Ишта агlо яц',
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ца магайо цlе',
-	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Арахьа хьажориг',
+	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Арахьара хьажораг',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Агlо ю яц хьоьжуш…',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Гойтуш йолу цlе ца магайо.',
-	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Ахьа хоттийна URL кхечу вики-агlонан хьажоригах тера ю. Хьо лууш ву и хьажориг чоьхьарчех йа?',
-	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Чоьхьа хьажориг',
-	'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Арахьа хьажориг',
-	'wikieditor-toolbar-tool-link-empty' => 'Ахьа ца гайтин мичхьа хьажойеза хьажориг.',
+	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Ахьа хоттийна URL кхечу вики-агӀонан хьажорагах тера ю. Лаьий хьуна и хьажораг чоьхьарчех я?',
+	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Чоьхьа хьажораг',
+	'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Арахьара хьажораг',
+	'wikieditor-toolbar-tool-link-empty' => 'Ахьа ца гайтин мичхьа хьажойеза хьажораг.',
 	'wikieditor-toolbar-tool-file' => 'Чохь йолу файл',
 	'wikieditor-toolbar-tool-file-example' => 'Example.jpg',
-	'wikieditor-toolbar-tool-reference' => 'Такхо',
-	'wikieditor-toolbar-tool-reference-example' => 'Чудилла кхузе такхо деза йоза',
+	'wikieditor-toolbar-tool-file-title' => 'Файл чуйиллар',
+	'wikieditor-toolbar-file-target' => 'Файлан цӀе:',
+	'wikieditor-toolbar-file-caption' => 'КуьгтаӀор:',
+	'wikieditor-toolbar-file-size' => 'Барам:',
+	'wikieditor-toolbar-file-float' => 'Нисдар:',
+	'wikieditor-toolbar-file-default' => '(Iад йитарца)',
+	'wikieditor-toolbar-tool-file-insert' => 'Чудилла',
+	'wikieditor-toolbar-tool-file-cancel' => 'Цаоьшу',
+	'wikieditor-toolbar-tool-reference' => 'ТIетовжар',
+	'wikieditor-toolbar-tool-reference-example' => 'Чудилла кхузе тIетовжа деза йоза',
 	'wikieditor-toolbar-tool-reference-cancel' => 'Цаоьшу',
-	'wikieditor-toolbar-tool-reference-title' => 'Чудилла такхо',
+	'wikieditor-toolbar-tool-reference-title' => 'Чудилла тIетовжар',
 	'wikieditor-toolbar-tool-reference-insert' => 'Чудилла',
-	'wikieditor-toolbar-tool-reference-text' => 'Такхо деза йоза',
+	'wikieditor-toolbar-tool-reference-text' => 'ТIетовжаран йоза',
 	'wikieditor-toolbar-tool-signature' => 'Куьгтаlор хан хlоттош',
-	'wikieditor-toolbar-section-advanced' => 'Кхин тlе дукха',
+	'wikieditor-toolbar-section-advanced' => 'Кхин тӀе',
 	'wikieditor-toolbar-tool-heading' => 'Корта',
 	'wikieditor-toolbar-tool-heading-1' => 'Локхалла 1',
 	'wikieditor-toolbar-tool-heading-2' => 'Локхалла 2',
@@ -5321,7 +5366,7 @@ $messages['ce'] = array(
 	'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|Цуьнах лаце1
 $1:Example.jpg|Цуьнах лаце2',
 	'wikieditor-toolbar-tool-newline' => 'Керла могlа',
-	'wikieditor-toolbar-tool-table' => 'Таблийца',
+	'wikieditor-toolbar-tool-table' => 'Таблица',
 	'wikieditor-toolbar-tool-table-example-old' => '-
 ! коьрта могlа 1
 ! коьрта могlа 2
@@ -5336,73 +5381,76 @@ $1:Example.jpg|Цуьнах лаце2',
 | могlа 2, чоь 3',
 	'wikieditor-toolbar-tool-table-example-cell-text' => 'Чоьнан йоза',
 	'wikieditor-toolbar-tool-table-example-header' => 'Коьрта йоза',
-	'wikieditor-toolbar-tool-table-title' => 'Чуйилла таблийца',
+	'wikieditor-toolbar-tool-table-title' => 'Чуйилла таблица',
 	'wikieditor-toolbar-tool-table-dimensions-rows' => 'МогӀанаш',
 	'wikieditor-toolbar-tool-table-dimensions-columns' => 'Бlогlамаш',
 	'wikieditor-toolbar-tool-table-dimensions-header' => 'Тlетоха коьрта могlан могlа',
 	'wikieditor-toolbar-tool-table-wikitable' => 'Кечйеш дозанашца',
-	'wikieditor-toolbar-tool-table-sortable' => 'Листалуш йе таблийца',
+	'wikieditor-toolbar-tool-table-sortable' => 'Листалуш йе таблица',
 	'wikieditor-toolbar-tool-table-example' => 'Чоьнан йоза',
 	'wikieditor-toolbar-tool-table-preview' => 'Хьалха муха ю хьажа',
 	'wikieditor-toolbar-tool-table-insert' => 'Чуйилла',
 	'wikieditor-toolbar-tool-table-cancel' => 'Цаоьшу',
 	'wikieditor-toolbar-tool-table-toomany' => 'Оцул чоьнаш йа аьтту ца болу, таблийцан чоьнашна бáрам $1 хоттало.', # Fuzzy
 	'wikieditor-toolbar-tool-table-invalidnumber' => 'Ахьа нийса ца хоттийн цхьатерра могlанаш ле бlогlамаш.',
-	'wikieditor-toolbar-tool-table-zero' => 'Хьога йиллалур яц таблийца йоцургца могlанаш ле бlогlамаш долуш.',
-	'wikieditor-toolbar-tool-replace' => 'Лаха хийца аъ хуьйцуш',
-	'wikieditor-toolbar-tool-replace-title' => 'Лаха хийца аъ хуьйцуш',
+	'wikieditor-toolbar-tool-table-zero' => 'Хьога йиллалур яц таблица йоцургца могӀанаш ле бӀогӀамаш долуш.',
+	'wikieditor-toolbar-tool-replace' => 'Лаха хийца а хуьйцуш',
+	'wikieditor-toolbar-tool-replace-title' => 'Лаха хийца а хуьйцуш',
 	'wikieditor-toolbar-tool-replace-search' => 'Лаха:',
 	'wikieditor-toolbar-tool-replace-replace' => 'Хийца оцуьнца:',
 	'wikieditor-toolbar-tool-replace-case' => 'Яздар тидаме оьцуш',
 	'wikieditor-toolbar-tool-replace-regex' => 'Хилийта могlа юх-юха лохуш долу дош',
-	'wikieditor-toolbar-tool-replace-button-findnext' => 'Караде тlаьхьадогlург',
-	'wikieditor-toolbar-tool-replace-button-replaceall' => 'Деригге хийца',
-	'wikieditor-toolbar-tool-replace-close' => 'Дlачlагlа',
+	'wikieditor-toolbar-tool-replace-button-findnext' => 'Караде тӀаьхьа-догӀург',
+	'wikieditor-toolbar-tool-replace-button-replace' => 'Хийца',
+	'wikieditor-toolbar-tool-replace-button-replaceall' => 'Дерриге хийца',
+	'wikieditor-toolbar-tool-replace-close' => 'ДӀачӀагӀа',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'Хьан дехарца хlумма ца карийна.',
 	'wikieditor-toolbar-tool-replace-success' => 'Балийна хийцам: $1.', # Fuzzy
 	'wikieditor-toolbar-tool-replace-emptysearch' => 'Ахьа ца гайтна хlу лаха деза.',
 	'wikieditor-toolbar-tool-replace-invalidregex' => 'Ахьа язйина цlе юх-юха нийса яц: $1',
-	'wikieditor-toolbar-section-characters' => 'Саболу куьцаш',
-	'wikieditor-toolbar-characters-page-latin' => 'Латинхойн',
-	'wikieditor-toolbar-characters-page-latinextended' => 'Латинхойн аллсам',
+	'wikieditor-toolbar-section-characters' => 'Леррина символаш',
+	'wikieditor-toolbar-characters-page-latin' => 'Латинан',
+	'wikieditor-toolbar-characters-page-latinextended' => 'Латинан алсам',
 	'wikieditor-toolbar-characters-page-ipa' => 'ДАЭ (IPA)',
-	'wikieditor-toolbar-characters-page-symbols' => 'Саболурш',
+	'wikieditor-toolbar-characters-page-symbols' => 'Символаш',
 	'wikieditor-toolbar-characters-page-greek' => 'Гlайрхойн',
 	'wikieditor-toolbar-characters-page-cyrillic' => 'Кирилан',
-	'wikieditor-toolbar-characters-page-arabic' => 'Iарбойн',
+	'wikieditor-toolbar-characters-page-arabic' => 'Ӏарбийн',
+	'wikieditor-toolbar-characters-page-arabicextended' => 'Iаьрбийн шординарш',
 	'wikieditor-toolbar-characters-page-persian' => 'Пхьарсхойн',
 	'wikieditor-toolbar-characters-page-hebrew' => 'Жуьгтийн',
 	'wikieditor-toolbar-characters-page-bangla' => 'Бангалойн',
+	'wikieditor-toolbar-characters-page-tamil' => 'Тамилхойн',
 	'wikieditor-toolbar-characters-page-telugu' => 'Телугойн',
 	'wikieditor-toolbar-characters-page-sinhala' => 'Синхалойн',
 	'wikieditor-toolbar-characters-page-gujarati' => 'Гужаратойн',
 	'wikieditor-toolbar-characters-page-thai' => 'Тайхойн',
 	'wikieditor-toolbar-characters-page-lao' => 'Лаохойн',
 	'wikieditor-toolbar-characters-page-khmer' => 'Кхимерхойн',
-	'wikieditor-toolbar-section-help' => 'Нисвохаам',
+	'wikieditor-toolbar-section-help' => 'ГӀо',
 	'wikieditor-toolbar-help-heading-description' => 'Цуьнах лаьцна',
 	'wikieditor-toolbar-help-heading-syntax' => 'Хlу йуьллу ахьа',
 	'wikieditor-toolbar-help-heading-result' => 'Хlу хуьлу хьуна',
 	'wikieditor-toolbar-help-page-format' => 'Бáрамхlоттор',
-	'wikieditor-toolbar-help-page-link' => 'Хьажоригаш',
+	'wikieditor-toolbar-help-page-link' => 'Хьажорагаш',
 	'wikieditor-toolbar-help-page-heading' => 'Коьрта могlнаш',
 	'wikieditor-toolbar-help-page-list' => 'Могlамаш',
 	'wikieditor-toolbar-help-page-file' => 'Файлаш',
 	'wikieditor-toolbar-help-page-reference' => 'Билгалдаккхар',
 	'wikieditor-toolbar-help-page-discussion' => 'Дийцаре',
-	'wikieditor-toolbar-help-content-italic-description' => 'Курсетта',
-	'wikieditor-toolbar-help-content-italic-syntax' => "''Курсеттан до йоза''",
-	'wikieditor-toolbar-help-content-italic-result' => '<em>Курсеттан до йоза</em>',
+	'wikieditor-toolbar-help-content-italic-description' => 'Сетта',
+	'wikieditor-toolbar-help-content-italic-syntax' => "''Сеттан до йоза''",
+	'wikieditor-toolbar-help-content-italic-result' => '<em>Сеттан до йоза</em>',
 	'wikieditor-toolbar-help-content-bold-description' => 'Дерстино',
 	'wikieditor-toolbar-help-content-bold-syntax' => "'''Дерстино до йоза'''",
 	'wikieditor-toolbar-help-content-bold-result' => '<strong>Дерстино до йоза</strong>',
 	'wikieditor-toolbar-help-content-bolditalic-description' => 'Дерстино курсеттан',
 	'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Дерстино курсеттан'''''",
 	'wikieditor-toolbar-help-content-bolditalic-result' => '<em><strong>Дерстино курсеттан</strong></em>',
-	'wikieditor-toolbar-help-content-ilink-description' => 'Чоьхьа хьажориг',
+	'wikieditor-toolbar-help-content-ilink-description' => 'Чоьхьа хьажораг',
 	'wikieditor-toolbar-help-content-ilink-syntax' => '[[Агlонан коьрта могlа|Хьажориган йоза]]<br />[[Агlонан коьрта могlа]]',
 	'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Хьажориган йоза</a><br /><a href='#'>Агlонан коьрта могlа</a>",
-	'wikieditor-toolbar-help-content-xlink-description' => 'Арахьа хьажориг',
+	'wikieditor-toolbar-help-content-xlink-description' => 'Арахьара хьажораг',
 	'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Хьажориган йоза]<br />[http://www.example.org]<br />http://www.example.org',
 	'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Хьажориган йоза</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.example.org</a>",
 	'wikieditor-toolbar-help-content-heading2-description' => 'Коьрта могlа 2-гlа локхалла',
@@ -5431,14 +5479,14 @@ $1:Example.jpg|Цуьнах лаце2',
 	'wikieditor-toolbar-help-content-reference-description' => 'Билгалдаккхар',
 	'wikieditor-toolbar-help-content-reference-syntax' => 'Агlонан йоза.&lt;ref name="test"&gt;[http://www.example.org Хьажориган йоза], кхин тlе дузуш йоза.&lt;/ref&gt;',
 	'wikieditor-toolbar-help-content-reference-result' => "Агlонан йоза.<sup><a href='#'>[1]</a></sup>",
-	'wikieditor-toolbar-help-content-rereference-description' => 'Кхин тlе лело изза хьажориг',
+	'wikieditor-toolbar-help-content-rereference-description' => 'Кхин тӀе лело изза хьажораг',
 	'wikieditor-toolbar-help-content-rereference-result' => "Агlонан йоза<sup><a href='#'>[1]</a></sup>.",
 	'wikieditor-toolbar-help-content-showreferences-description' => 'Гайта билгалдаккхар',
 	'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Хьажориган йоза</a>, кхин тlе дузуш йоза.</li></ol>",
 	'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Куьгтаlор хан хlоттош',
-	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Декъашхон цlе</a> (<a href='#' title='{{#special:mytalk}}'>дийцаре</a>) 15:54, 10 Мангал бутт 2009 (UTC)",
+	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Декъашхочун цӀе</a> (<a href='#' title='{{#special:mytalk}}'>дийцаре</a>) 15:54, 10 июнь 2009 (UTC)",
 	'wikieditor-toolbar-help-content-signature-description' => 'Куьгтаlор',
-	'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Декъашхон цlе</a> (<a href='#' title='{{#special:mytalk}}'>дийцаре</a>)",
+	'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Декъашхочун цӀе</a> (<a href='#' title='{{#special:mytalk}}'>дийцаре</a>)",
 	'wikieditor-toolbar-help-content-indent-description' => 'Дlахило',
 	'wikieditor-toolbar-help-content-indent-syntax' => 'Гуттарлера йоза<br />:Дlахилийна йоза<br />::Дlахилийна йоза',
 	'wikieditor-toolbar-help-content-indent-result' => 'Гуттарлера йоза<dl><dd>Дlахилийна йоза<dl><dd>Дlахилийна йоза</dd></dl></dd></dl>',
@@ -5448,6 +5496,7 @@ $1:Example.jpg|Цуьнах лаце2',
  * @author Asoxor
  * @author BMRG14
  * @author Calak
+ * @author Ebraminio
  * @author Marmzok
  * @author McDutchie
  * @author Muhammed taha
@@ -5482,8 +5531,8 @@ $messages['ckb'] = array(
 	'wikieditor-toc-hide' => 'شاردنەوەی ناوەڕۆک',
 	'wikieditor-toolbar' => 'شریتامرازی دەستکاریکردن',
 	'wikieditor-toolbar-desc' => 'شریتامرازی پەڕەی دەستکاریکردن بە کارەمەیی پەرەپێدراو',
-	'wikieditor-toolbar-preference' => 'ڕێگە بدە بە شریتامرازی پەرەسندووی دەستکاری کردن',
-	'wikieditor-toolbar-dialogs-preference' => 'ڕێگە بدە بە پەنجەرە وتووێژییەکان بۆ تێخستنی بەستەرەکان، خشتەکان و ھتد.',
+	'wikieditor-toolbar-preference' => 'ڕێگە بدە بە شریتامرازی پەرەسندووی دەستکاریکردن',
+	'wikieditor-toolbar-dialogs-preference' => 'ڕێگە بدە بە پەنجەرە وتووێژییەکان بۆ تێخستنی بەستەرەکان، خشتەکان و ھتد.', # Fuzzy
 	'wikieditor-toolbar-loading' => 'خەریکی بارکردن...',
 	'wikieditor-toolbar-tool-bold' => 'تۆخ',
 	'wikieditor-toolbar-tool-bold-example' => 'دەقی تۆخ',
@@ -5587,7 +5636,7 @@ $1:نموونە.jpg|شرۆڤەی ٢',
 	'wikieditor-toolbar-tool-table-preview' => 'پێشبینین',
 	'wikieditor-toolbar-tool-table-insert' => 'تێخستن',
 	'wikieditor-toolbar-tool-table-cancel' => 'ھەڵوەشاندنەوە',
-	'wikieditor-toolbar-tool-table-toomany' => 'تێخستنی خشتەیەک بە زۆرتر لە $1 خانەوە بەم ئامرازەوە ناکرێ.', # Fuzzy
+	'wikieditor-toolbar-tool-table-toomany' => 'تێخستنی خشتەیەک بە زۆرتر لە ١٠٠٠ خانەوە بەم ئامرازەوە ناکرێ.',
 	'wikieditor-toolbar-tool-table-invalidnumber' => 'ژمارەیەکی دروستت بۆ ڕیزەکان یان ستوونەکان نەداوە.',
 	'wikieditor-toolbar-tool-table-zero' => 'ناتوانی خشتەیەک بێ ھیچ ڕیز یان ستوونێک تێبخەی',
 	'wikieditor-toolbar-tool-replace' => 'دۆزینەوە و لەجێدانان',
@@ -5612,7 +5661,7 @@ $1:نموونە.jpg|شرۆڤەی ٢',
 	'wikieditor-toolbar-characters-page-cyrillic' => 'کیریلی',
 	'wikieditor-toolbar-characters-page-arabic' => 'عەرەبی',
 	'wikieditor-toolbar-characters-page-arabicextended' => 'عەرەبیی پەرەپێدراو',
-	'wikieditor-toolbar-characters-page-persian' => 'پارسی',
+	'wikieditor-toolbar-characters-page-persian' => 'فارسی',
 	'wikieditor-toolbar-characters-page-hebrew' => 'عیبری',
 	'wikieditor-toolbar-characters-page-bangla' => 'بەنگالی',
 	'wikieditor-toolbar-characters-page-telugu' => 'تێلوگو',
@@ -5696,6 +5745,7 @@ $messages['co'] = array(
 /** Czech (česky)
  * @author Jkjk
  * @author Kuvaly
+ * @author Littledogboy
  * @author Mormegil
  */
 $messages['cs'] = array(
@@ -5730,7 +5780,7 @@ $messages['cs'] = array(
 	'wikieditor-toolbar' => 'Editační panel nástrojů',
 	'wikieditor-toolbar-desc' => 'Editační panel nástrojů s vylepšenou použitelností',
 	'wikieditor-toolbar-preference' => 'Zapnout vylepšený panel nástrojů',
-	'wikieditor-toolbar-dialogs-preference' => 'Používat dialogy pro vkládání odkazů, tabulek atd.',
+	'wikieditor-toolbar-dialogs-preference' => 'Používat dialogy pro vkládání odkazů, tabulek atd.', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Skrýt tlačítko podpisu na stránkách v hlavním jmenném prostoru',
 	'wikieditor-toolbar-loading' => 'Načítá se…',
 	'wikieditor-toolbar-tool-bold' => 'Tučně',
@@ -5758,13 +5808,14 @@ $messages['cs'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Neplatný název',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Externí odkaz',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Zjišťování existence stránky…',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Rozcestník',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Zadaný název je neplatný.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Uvedené URL vypadá jako odkaz na jinou stránku této wiki.
 Chcete z něj tedy udělat vnitřní odkaz?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Vnitřní odkaz',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Externí odkaz',
 	'wikieditor-toolbar-tool-link-empty' => 'Musíte uvést cíl odkazu.',
-	'wikieditor-toolbar-tool-file' => 'Vložený soubor',
+	'wikieditor-toolbar-tool-file' => 'Soubor',
 	'wikieditor-toolbar-tool-file-example' => 'Příklad.jpg',
 	'wikieditor-toolbar-tool-file-title' => 'Vložit soubor',
 	'wikieditor-toolbar-file-target' => 'Název souboru:',
@@ -5776,7 +5827,7 @@ Chcete z něj tedy udělat vnitřní odkaz?',
 	'wikieditor-toolbar-file-format-none' => 'žádný',
 	'wikieditor-toolbar-tool-file-insert' => 'Vložit',
 	'wikieditor-toolbar-tool-file-cancel' => 'Storno',
-	'wikieditor-toolbar-tool-reference' => 'Poznámky',
+	'wikieditor-toolbar-tool-reference' => 'Reference',
 	'wikieditor-toolbar-tool-reference-example' => 'Sem uveďte text poznámky',
 	'wikieditor-toolbar-tool-reference-cancel' => 'Storno',
 	'wikieditor-toolbar-tool-reference-title' => 'Vložit referenci',
@@ -5889,7 +5940,7 @@ $1:Příklad.jpg|Titulek 2',
 	'wikieditor-toolbar-help-page-heading' => 'Nadpisy',
 	'wikieditor-toolbar-help-page-list' => 'Seznamy',
 	'wikieditor-toolbar-help-page-file' => 'Soubory',
-	'wikieditor-toolbar-help-page-reference' => 'Poznámky',
+	'wikieditor-toolbar-help-page-reference' => 'Reference',
 	'wikieditor-toolbar-help-page-discussion' => 'Diskuse',
 	'wikieditor-toolbar-help-content-italic-description' => 'Kurzíva',
 	'wikieditor-toolbar-help-content-italic-syntax' => "''Text kurzívou''",
@@ -5927,12 +5978,12 @@ $1:Příklad.jpg|Titulek 2',
 	'wikieditor-toolbar-help-content-file-description' => 'Vložení souboru',
 	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Příklad.png|thumb|Text titulku]]',
 	'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Text titulku' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Zvětšit' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Text titulku</div></div>",
-	'wikieditor-toolbar-help-content-reference-description' => 'Poznámka',
+	'wikieditor-toolbar-help-content-reference-description' => 'Reference',
 	'wikieditor-toolbar-help-content-reference-syntax' => 'Text stránky.&lt;ref name="test"&gt;[http://www.example.org Text odkazu], další text.&lt;/ref&gt;',
 	'wikieditor-toolbar-help-content-reference-result' => "Text stránky.<sup><a href='#'>[1]</a></sup>",
-	'wikieditor-toolbar-help-content-rereference-description' => 'Další odkaz na stejnou poznámku',
+	'wikieditor-toolbar-help-content-rereference-description' => 'Další odkaz na stejnou referenci',
 	'wikieditor-toolbar-help-content-rereference-result' => "Text stránky.<sup><a href='#'>[1]</a></sup>",
-	'wikieditor-toolbar-help-content-showreferences-description' => 'Zobrazení poznámek',
+	'wikieditor-toolbar-help-content-showreferences-description' => 'Zobrazení referencí',
 	'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Text odkazu</a>, další text.</li></ol>",
 	'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Podpis a datum',
 	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{ns:User}}:Uživatelské jméno'>Uživatelské jméno</a> 23. 6. 2009, 10:43 (UTC)",
@@ -6026,6 +6077,7 @@ $messages['cu'] = array(
 	'wikieditor-toolbar-tool-table' => 'та́влїѥ',
 	'wikieditor-toolbar-tool-table-dimensions-rows' => 'рѧдꙑ',
 	'wikieditor-toolbar-tool-table-example' => 'прикладъ',
+	'wikieditor-toolbar-tool-replace-close' => 'ꙁакрꙑи',
 	'wikieditor-toolbar-section-characters' => 'допльнитєл҄ьнꙑ сѷмволи',
 	'wikieditor-toolbar-characters-page-latin' => 'латиньска аꙁъбоукꙑ',
 	'wikieditor-toolbar-characters-page-latinextended' => 'латиньскꙑ аꙁъбоукьвє доложєниѥ',
@@ -6071,7 +6123,7 @@ $messages['cy'] = array(
 	'wikieditor-publish-dialog-watch' => 'Dilyn hynt y dudalen hon',
 	'wikieditor-publish-dialog-publish' => 'Cyhoedder',
 	'wikieditor-publish-dialog-goback' => 'Yn ôl',
-	'wikieditor-template-editor-preference' => 'Galluogi golygu nodynnau wici drwy ffurflen',
+	'wikieditor-template-editor-preference' => 'Galluogi golygu nodiadau wici drwy ffurflen',
 	'wikieditor-template-editor-dialog-title' => "Golygu'r nodyn",
 	'wikieditor-template-editor-dialog-submit' => 'Diweddarer',
 	'wikieditor-template-editor-dialog-cancel' => 'Diddymer',
@@ -6082,7 +6134,7 @@ $messages['cy'] = array(
 	'wikieditor-toolbar' => 'Bar offer golygu',
 	'wikieditor-toolbar-desc' => 'Bar offer y dudalen olygu gyda gwelliannau defnyddioldeb',
 	'wikieditor-toolbar-preference' => "Defnyddio'r bar offer golygu estynedig",
-	'wikieditor-toolbar-dialogs-preference' => 'Galluoger y blychau yn y rhyngwyneb ar gyfer mewnosod cysylltiadau, tablau ag ati',
+	'wikieditor-toolbar-dialogs-preference' => "Galluogi'r dewin sy'n mewnosod cysylltau a thablau, ac sy'n gallu chwilio a disodli",
 	'wikieditor-toolbar-hidesig' => "Cuddio'r botwm llofnodi rhag y tudalennau yn y prif barth",
 	'wikieditor-toolbar-loading' => "Wrthi'n llwytho...",
 	'wikieditor-toolbar-tool-bold' => 'Praff',
@@ -6110,6 +6162,7 @@ $messages['cy'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Teitl annilys',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Cyswllt allanol',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => "Wrthi'n gwirio a yw'r dudalen ar gael...",
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Tudalen gwahaniaethu',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Ysgrifennwyd teitl annilys.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => "Mae'n ymddangos bod yr URL a osodwyd yn arwain at dudalen arall yn y wici.
 Ydych chi am ei osod ar ffurf cyswllt mewnol?",
@@ -6118,6 +6171,16 @@ Ydych chi am ei osod ar ffurf cyswllt mewnol?",
 	'wikieditor-toolbar-tool-link-empty' => "Nid ydych wedi ysgrifennu nod i'r cyswllt fynd ato.",
 	'wikieditor-toolbar-tool-file' => 'Ffeil mewnosodol',
 	'wikieditor-toolbar-tool-file-example' => 'Enghraifft.jpg',
+	'wikieditor-toolbar-tool-file-title' => 'Mewnosod ffeil',
+	'wikieditor-toolbar-file-target' => "Enw'r ffeil:",
+	'wikieditor-toolbar-file-caption' => 'Pennawd:',
+	'wikieditor-toolbar-file-size' => 'Maint:',
+	'wikieditor-toolbar-file-float' => 'Alinio:',
+	'wikieditor-toolbar-file-default' => '(diofyn)',
+	'wikieditor-toolbar-file-format' => 'Fformat:',
+	'wikieditor-toolbar-file-format-none' => 'dim',
+	'wikieditor-toolbar-tool-file-insert' => 'Mewnosod',
+	'wikieditor-toolbar-tool-file-cancel' => 'Rhoi heibio',
 	'wikieditor-toolbar-tool-reference' => 'Troednodyn',
 	'wikieditor-toolbar-tool-reference-example' => 'Ysgrifennwch droednodyn fan hyn',
 	'wikieditor-toolbar-tool-reference-cancel' => 'Diddymu',
@@ -6182,7 +6245,7 @@ $1:Enghraifft.jpg|Disgrifiad2',
 	'wikieditor-toolbar-tool-table-preview' => 'Rhagolwg',
 	'wikieditor-toolbar-tool-table-insert' => 'Mewnosod',
 	'wikieditor-toolbar-tool-table-cancel' => 'Diddymu',
-	'wikieditor-toolbar-tool-table-toomany' => "Nid yw'n bosib gosod tabl ag iddo mwy na $1 o gelloedd trwy ddefnyddio'r deialog hwn.", # Fuzzy
+	'wikieditor-toolbar-tool-table-toomany' => "Nid yw'n bosib gosod tabl ag iddo mwy na 1,000 o gelloedd trwy ddefnyddio'r deialog hwn.",
 	'wikieditor-toolbar-tool-table-invalidnumber' => 'Nid ydych wedi gosod nifer (dilys) o resi neu o golofnau.',
 	'wikieditor-toolbar-tool-table-zero' => 'Ni allwch osod tabl heb unrhyw resi neu golofnau iddo.',
 	'wikieditor-toolbar-tool-replace' => 'Canfod a disodli',
@@ -6196,7 +6259,7 @@ $1:Enghraifft.jpg|Disgrifiad2',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => "Disodli'r cwbwl",
 	'wikieditor-toolbar-tool-replace-close' => 'Cau',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'Ni chanfyddwyd yr hyn a chwiliwyd amdano.',
-	'wikieditor-toolbar-tool-replace-success' => 'Gwnaethpwyd $1 amnewidiad.', # Fuzzy
+	'wikieditor-toolbar-tool-replace-success' => 'Gwnaethpwyd $1 {{PLURAL:$1|amnewidiad}}.',
 	'wikieditor-toolbar-tool-replace-emptysearch' => 'Ni osodwyd unrhywbeth yn y blwch chwilio.',
 	'wikieditor-toolbar-tool-replace-invalidregex' => "Nid yw'r ymadrodd rheolaidd a ysgrifennwyd gennych yn ddilys: $1",
 	'wikieditor-toolbar-section-characters' => 'Nodau arbennig',
@@ -6219,6 +6282,9 @@ $1:Enghraifft.jpg|Disgrifiad2',
 	'wikieditor-toolbar-characters-page-thai' => 'Thai',
 	'wikieditor-toolbar-characters-page-lao' => 'Laoseg',
 	'wikieditor-toolbar-characters-page-khmer' => 'Chmereg',
+	'wikieditor-toolbar-characters-endash' => 'heiffen en',
+	'wikieditor-toolbar-characters-emdash' => 'heiffen em',
+	'wikieditor-toolbar-characters-minus' => 'arwydd minws',
 	'wikieditor-toolbar-section-help' => 'Cymorth',
 	'wikieditor-toolbar-help-heading-description' => 'Disgrifiad',
 	'wikieditor-toolbar-help-heading-syntax' => 'Pan deipiwch hyn',
@@ -6294,8 +6360,8 @@ $1:Enghraifft.jpg|Disgrifiad2',
 $messages['da'] = array(
 	'wikieditor' => 'Avanceret interface til redigering af wikitekst',
 	'wikieditor-desc' => 'Giver et udvidet interface til redigering af wikitekst og mange moduler med hjælpefunktioner',
-	'wikieditor-wikitext-tab' => 'wikitekst',
-	'wikieditor-loading' => 'Indlæser',
+	'wikieditor-wikitext-tab' => 'Wikitekst',
+	'wikieditor-loading' => 'Indlæser...',
 	'wikieditor-preview-preference' => 'Aktiver forhåndsvisning side-om-side',
 	'wikieditor-preview-tab' => 'Forhåndsvisning',
 	'wikieditor-preview-changes-tab' => 'Ændringer',
@@ -6306,8 +6372,8 @@ $messages['da'] = array(
 	'wikieditor-publish-preference' => 'Aktiver skridt-for-skridt udgivelse',
 	'wikieditor-publish-button-publish' => 'Udgiv',
 	'wikieditor-publish-button-cancel' => 'Afbryd',
-	'wikieditor-publish-dialog-title' => 'Udgiv som {{SITENAME}}',
-	'wikieditor-publish-dialog-summary' => 'Redigeringsbeskrivelse (beskriv kort de ændringer, du har gjort)',
+	'wikieditor-publish-dialog-title' => 'Udgiv til {{SITENAME}}',
+	'wikieditor-publish-dialog-summary' => 'Redigeringsbeskrivelse (beskriv kort de ændringer, du har lavet)',
 	'wikieditor-publish-dialog-minor' => 'Mindre ændring',
 	'wikieditor-publish-dialog-watch' => 'Overvåg denne side',
 	'wikieditor-publish-dialog-publish' => 'Udgiv',
@@ -6323,7 +6389,7 @@ $messages['da'] = array(
 	'wikieditor-toolbar' => 'Værktøjslinje til redigering',
 	'wikieditor-toolbar-desc' => 'Værktøjslinje til redigering med udvidet brugervenlighed',
 	'wikieditor-toolbar-preference' => 'Aktiver forbedret værktøjslinje til redigering',
-	'wikieditor-toolbar-dialogs-preference' => 'Aktiver dialoger til indsættelse af links, tabeller og mere.',
+	'wikieditor-toolbar-dialogs-preference' => 'Aktiver guider til at indsætte links, tabeller samt søg og erstat-funktionen',
 	'wikieditor-toolbar-hidesig' => 'Skjul signaturknappen på sider i hovednavnerummet',
 	'wikieditor-toolbar-loading' => 'Indlæser ...',
 	'wikieditor-toolbar-tool-bold' => 'Fed',
@@ -6337,7 +6403,7 @@ $messages['da'] = array(
 	'wikieditor-toolbar-tool-link' => 'Henvisning',
 	'wikieditor-toolbar-tool-link-title' => 'Indsæt henvisning',
 	'wikieditor-toolbar-tool-link-int' => 'Til en wikiartikel/-side',
-	'wikieditor-toolbar-tool-link-int-target' => 'Artikeltitel:',
+	'wikieditor-toolbar-tool-link-int-target' => 'Destinationsside eller URL:',
 	'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Sidetitel eller internetadresse',
 	'wikieditor-toolbar-tool-link-int-text' => 'Henvisningstekst:',
 	'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Tekst, der skal vises',
@@ -6351,12 +6417,13 @@ $messages['da'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ugyldig titel',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ekstern henvisning',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Kontrollerer om siden findes ...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Flertydig side',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Titlen du gav, er ugyldig.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => "URL'en, du har angivet, ser ud til at være tiltænkt som en henvisning til en anden wikiside.
 Ønsker du at gøre den til en intern henvisning.",
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Intern henvisning',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Ekstern henvisning',
-	'wikieditor-toolbar-tool-link-empty' => 'Du har ikke angivet noget at linke til.',
+	'wikieditor-toolbar-tool-link-empty' => 'Du har ikke angivet noget at henvise til.',
 	'wikieditor-toolbar-tool-file' => 'Indlejret fil',
 	'wikieditor-toolbar-tool-file-example' => 'Eksempel.jpg',
 	'wikieditor-toolbar-tool-file-title' => 'Indsæt fil',
@@ -6368,7 +6435,7 @@ $messages['da'] = array(
 	'wikieditor-toolbar-file-format' => 'Format:',
 	'wikieditor-toolbar-file-format-none' => 'ingen',
 	'wikieditor-toolbar-tool-file-insert' => 'Indsæt',
-	'wikieditor-toolbar-tool-file-cancel' => 'Annuller',
+	'wikieditor-toolbar-tool-file-cancel' => 'Annullér',
 	'wikieditor-toolbar-tool-reference' => 'Fodnote',
 	'wikieditor-toolbar-tool-reference-example' => 'Indsæt fodnotetekst her',
 	'wikieditor-toolbar-tool-reference-cancel' => 'Annullér',
@@ -6402,7 +6469,7 @@ $messages['da'] = array(
 	'wikieditor-toolbar-tool-superscript' => 'Hævet skrift',
 	'wikieditor-toolbar-tool-superscript-example' => 'Hævet tekst',
 	'wikieditor-toolbar-tool-subscript' => 'Sænket skrift',
-	'wikieditor-toolbar-tool-subscript-example' => 'Sænket skrift',
+	'wikieditor-toolbar-tool-subscript-example' => 'Sænket tekst',
 	'wikieditor-toolbar-group-insert' => 'Indsæt',
 	'wikieditor-toolbar-tool-gallery' => 'Billedgalleri',
 	'wikieditor-toolbar-tool-gallery-example' => '$1:Eksempel.jpg|Billedtekst1
@@ -6421,7 +6488,7 @@ $1:Eksempel.jpg|Billedtekst2',
 | række 2, celle 1
 | række 2, celle 2
 | række 2, celle 3',
-	'wikieditor-toolbar-tool-table-example-cell-text' => 'Række $1, celle $2',
+	'wikieditor-toolbar-tool-table-example-cell-text' => 'Celletekst',
 	'wikieditor-toolbar-tool-table-example-header' => 'Overskriftstekst',
 	'wikieditor-toolbar-tool-table-title' => 'Indsæt tabel',
 	'wikieditor-toolbar-tool-table-dimensions-rows' => 'Rækker',
@@ -6429,7 +6496,7 @@ $1:Eksempel.jpg|Billedtekst2',
 	'wikieditor-toolbar-tool-table-dimensions-header' => 'Tilføj række til kolonneoverskrifter',
 	'wikieditor-toolbar-tool-table-wikitable' => 'Stil med kanter',
 	'wikieditor-toolbar-tool-table-sortable' => 'Gør tabel sorterbar',
-	'wikieditor-toolbar-tool-table-example' => 'Celletekst',
+	'wikieditor-toolbar-tool-table-example' => 'Eksempel',
 	'wikieditor-toolbar-tool-table-preview' => 'Forhåndsvisning',
 	'wikieditor-toolbar-tool-table-insert' => 'Indsæt',
 	'wikieditor-toolbar-tool-table-cancel' => 'Annullér',
@@ -6610,6 +6677,7 @@ $messages['de'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ungültiger Titel',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Externer Link',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Prüfe, ob Seite vorhanden ist …',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Begriffsklärungsseite',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Der angegebene Seitenname ist ungültig.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Die von dir angegebene URL wirkt wie eine, die auf eine andere Wikiseite verlinken würde.
 Möchtest du daraus einen internen Link machen?',
@@ -6826,6 +6894,8 @@ Möchten Sie daraus einen internen Link machen?',
 
 /** Zazaki (Zazaki)
  * @author Erdemaslancan
+ * @author Gorizon
+ * @author Marmase
  * @author Mirzali
  * @author Xoser
  */
@@ -6861,7 +6931,7 @@ $messages['diq'] = array(
 	'wikieditor-toolbar' => 'nizamkerdışê çuyaya haceti',
 	'wikieditor-toolbar-desc' => 'Xacetê çuveyî pê enhanced usability bivurne',
 	'wikieditor-toolbar-preference' => 'çuyaya haceti yo dewlemendbiyayeyi aktif ker',
-	'wikieditor-toolbar-dialogs-preference' => "qey têare kerdışê gıre, tablo usb'ani mesajan aktif bıker",
+	'wikieditor-toolbar-dialogs-preference' => "Qey têare kerdışê gıre, tablo usb'ani mesajan aktif bıkere",
 	'wikieditor-toolbar-hidesig' => 'Vanganê naman de serênan pela dı maka  imzer bınımnê',
 	'wikieditor-toolbar-loading' => 'bar beno...',
 	'wikieditor-toolbar-tool-bold' => 'qalın',
@@ -6889,6 +6959,7 @@ $messages['diq'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Sernameyo xırab.',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Gırêy teberi',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'mewcudiyetê peli konrol beno',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Pera maneyo bini',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Sernameyo ke şımayê vanê ravêrde niyo.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'URLyo ke şıma nişan kerdo, pelê yewna wikiyi re gıre biyo aseno.
 şıma wazeni no gıre yew gıreyo daxili bıbo?',
@@ -6907,10 +6978,10 @@ $messages['diq'] = array(
 	'wikieditor-toolbar-file-format-none' => 'çıniyo',
 	'wikieditor-toolbar-tool-file-insert' => 'Têare ker',
 	'wikieditor-toolbar-tool-file-cancel' => 'Bıterkne',
-	'wikieditor-toolbar-tool-reference' => 'çıme',
+	'wikieditor-toolbar-tool-reference' => 'Referans',
 	'wikieditor-toolbar-tool-reference-example' => 'metnê notê bınini tiya kerê',
 	'wikieditor-toolbar-tool-reference-cancel' => 'Bıtexelne',
-	'wikieditor-toolbar-tool-reference-title' => 'Referance de bike',
+	'wikieditor-toolbar-tool-reference-title' => 'Referans dek',
 	'wikieditor-toolbar-tool-reference-insert' => 'de bike',
 	'wikieditor-toolbar-tool-reference-text' => 'Nusteyê Referansi',
 	'wikieditor-toolbar-tool-signature' => 'tamğayê imza ve zamani',
@@ -6925,7 +6996,7 @@ $messages['diq'] = array(
 	'wikieditor-toolbar-group-format' => 'Format',
 	'wikieditor-toolbar-tool-ulist' => 'listeya maddeya işaretıni',
 	'wikieditor-toolbar-tool-ulist-example' => 'unsuro listeya maddeya işaretıni',
-	'wikieditor-toolbar-tool-olist' => 'listeya numreyıni',
+	'wikieditor-toolbar-tool-olist' => 'Listeya nımreyın',
 	'wikieditor-toolbar-tool-olist-example' => 'unsuro listeya numreyıni',
 	'wikieditor-toolbar-tool-indent' => 'Paragraf',
 	'wikieditor-toolbar-tool-indent-example' => 'Rêza paragrafi',
@@ -6971,7 +7042,7 @@ $1:misal.jpg|nuşteyê resmi2',
 	'wikieditor-toolbar-tool-table-preview' => 'Verqayt',
 	'wikieditor-toolbar-tool-table-insert' => 'têare ker',
 	'wikieditor-toolbar-tool-table-cancel' => 'Bıterkne',
-	'wikieditor-toolbar-tool-table-toomany' => '$1 hucreyın ra ziyed tablo eştış pê no mesaj mumkin niyo', # Fuzzy
+	'wikieditor-toolbar-tool-table-toomany' => '1000 hucrara ziyed tablo eştış pê no mesaj mumkın niyo',
 	'wikieditor-toolbar-tool-table-invalidnumber' => 'şıma pê yew amaro meqbul o satır u estun cı nêkewti',
 	'wikieditor-toolbar-tool-table-zero' => 'tablo ya ke tede satır u estun çinibo şıma nêşkeni têare bıkeri',
 	'wikieditor-toolbar-tool-replace' => 'bıgêr u bıvurn',
@@ -6985,7 +7056,7 @@ $1:misal.jpg|nuşteyê resmi2',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'pêroyin bıvurn',
 	'wikieditor-toolbar-tool-replace-close' => 'Racnê',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'çi yo ke şıma gêrenê cı çin o.',
-	'wikieditor-toolbar-tool-replace-success' => '$1 vurnayiş vıraziya.', # Fuzzy
+	'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|yedeg|yedegi}} vıraziya.',
 	'wikieditor-toolbar-tool-replace-emptysearch' => 'şıma qey cıgêrayiş taway/çiyek nênuşt',
 	'wikieditor-toolbar-tool-replace-invalidregex' => 'ifadeya normal a ke şıma kwene cı meqbul niya: $1',
 	'wikieditor-toolbar-section-characters' => 'karakterê xususiyî',
@@ -7011,7 +7082,7 @@ $1:misal.jpg|nuşteyê resmi2',
 	'wikieditor-toolbar-characters-endash' => 'tira kılme',
 	'wikieditor-toolbar-characters-emdash' => 'tira derge',
 	'wikieditor-toolbar-characters-minus' => 'işaretê kemiye',
-	'wikieditor-toolbar-section-help' => 'Peşti',
+	'wikieditor-toolbar-section-help' => 'Desteg',
 	'wikieditor-toolbar-help-heading-description' => 'Şınasnayış',
 	'wikieditor-toolbar-help-heading-syntax' => 'o yo ke şıma nuşt',
 	'wikieditor-toolbar-help-heading-result' => 'o yo ke şıma gırewt',
@@ -7021,7 +7092,7 @@ $1:misal.jpg|nuşteyê resmi2',
 	'wikieditor-toolbar-help-page-list' => 'Listey',
 	'wikieditor-toolbar-help-page-file' => 'dosyayi',
 	'wikieditor-toolbar-help-page-reference' => 'Çımey',
-	'wikieditor-toolbar-help-page-discussion' => 'werê-ameyiş/munaqeşa',
+	'wikieditor-toolbar-help-page-discussion' => 'Vaten',
 	'wikieditor-toolbar-help-content-italic-description' => 'italik',
 	'wikieditor-toolbar-help-content-italic-syntax' => "''metno italik''",
 	'wikieditor-toolbar-help-content-italic-result' => '<em>metno italik</em>',
@@ -7052,13 +7123,13 @@ $1:misal.jpg|nuşteyê resmi2',
 	'wikieditor-toolbar-help-content-ulist-description' => 'listeya işareti ya maddeyın',
 	'wikieditor-toolbar-help-content-ulist-syntax' => '* unsurê listeyi<br />* unsurê listeyi',
 	'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>unsurê listeyi</li><li>unsurê listeyi</li></ul>',
-	'wikieditor-toolbar-help-content-olist-description' => 'listeya numreyın',
+	'wikieditor-toolbar-help-content-olist-description' => 'Listeya nımreyın',
 	'wikieditor-toolbar-help-content-olist-syntax' => '# unsurê listeyi<br /># unsurê listeyi',
 	'wikieditor-toolbar-help-content-olist-result' => '<ol><li>unsurê listeyi</li><li>unsurê listeyi</li></ol>',
 	'wikieditor-toolbar-help-content-file-description' => 'dosyaya weradaye/nımıte',
 	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Nuşteyê resîmî]]',
 	'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Caption text' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Enlarge' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>metnê resmi</div></div>",
-	'wikieditor-toolbar-help-content-reference-description' => 'çıme/referans',
+	'wikieditor-toolbar-help-content-reference-description' => 'Referans',
 	'wikieditor-toolbar-help-content-reference-syntax' => 'metnê peli.&lt;ref name="tesel kerdış/cerebnayiş"&gt;[http://www.misal.org metnê gıreyi], zeylê metni.&lt;/ref&gt;',
 	'wikieditor-toolbar-help-content-reference-result' => "metnê peli.<sup><a href='#'>[1]</a></sup>",
 	'wikieditor-toolbar-help-content-rereference-description' => 'şuxulnayişê zeylê o çımeyi',
@@ -7109,7 +7180,7 @@ $messages['dsb'] = array(
 	'wikieditor-toolbar' => 'Wobźěłowańska rědowa kšoma',
 	'wikieditor-toolbar-desc' => 'Rědowa kšoma za wobźěłowanje bokow z pólěpšoneju wužywajobnosću',
 	'wikieditor-toolbar-preference' => 'Pólěpšonu wobźěłowańsku rědowu kšomu aktiwěrowaś',
-	'wikieditor-toolbar-dialogs-preference' => 'Dialogi za zasajźenje wótkazow, tabelow a hynakšego zmóžniś',
+	'wikieditor-toolbar-dialogs-preference' => 'Dialogi za zasajźenje wótkazow, tabelow a hynakšego zmóžniś', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Pódpisowy tłočašk w bokach w głownem mjenjowem rumje schowaś',
 	'wikieditor-toolbar-loading' => 'Zacytujo se...',
 	'wikieditor-toolbar-tool-bold' => 'Tucny',
@@ -7365,7 +7436,7 @@ $messages['el'] = array(
 	'wikieditor-toolbar' => 'Επεξεργασία εργαλειοθήκης',
 	'wikieditor-toolbar-desc' => 'Μπάρα εργαλείων επεξεργασίας σελίδων με περισσότερες δυνατότητες χρήσης',
 	'wikieditor-toolbar-preference' => 'Ενεργοποιήστε την μπάρα εργαλείων με τις περισσότερες δυνατότητες επεξεργασίας',
-	'wikieditor-toolbar-dialogs-preference' => 'Ενεργοποιήστε παράθυρα διαλόγων για την εισαγωγή συνδέσμων, πινάκων και άλλων',
+	'wikieditor-toolbar-dialogs-preference' => 'Ενεργοποιήστε παράθυρα διαλόγων για την εισαγωγή συνδέσμων, πινάκων και άλλων', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Κρύψε το κουμπί υπογραφής από σελίδες στον κύριο χώρο ονομάτων',
 	'wikieditor-toolbar-loading' => 'Φόρτωση...',
 	'wikieditor-toolbar-tool-bold' => 'Έντονα',
@@ -7617,7 +7688,7 @@ $messages['eo'] = array(
 	'wikieditor-toolbar' => 'Ilobreto por redaktoj',
 	'wikieditor-toolbar-desc' => 'Ilobreto por redaktoj, kun plibonigita uzebleco',
 	'wikieditor-toolbar-preference' => 'Enŝalti plibonigitan ilobreton por redaktoj',
-	'wikieditor-toolbar-dialogs-preference' => 'Enŝalti dialogujojn por aldoni ligilojn, tabelojn kaj pli',
+	'wikieditor-toolbar-dialogs-preference' => 'Enŝalti dialogujojn por aldoni ligilojn, tabelojn kaj pli', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Kaŝi la subskribo-butonon de paĝoj en la ĉefa nomspaco',
 	'wikieditor-toolbar-loading' => 'Ŝarĝante...',
 	'wikieditor-toolbar-tool-bold' => 'Diklitera',
@@ -7851,12 +7922,12 @@ $messages['es'] = array(
 	'wikieditor' => 'Interfaz avanzada de edición de wikitexto',
 	'wikieditor-desc' => 'Provee de una interfaz extensible de edición de wikitexto y varios módulos que ofrecen características',
 	'wikieditor-wikitext-tab' => 'Wikitexto',
-	'wikieditor-loading' => 'Cargando',
+	'wikieditor-loading' => 'Cargando…',
 	'wikieditor-preview-preference' => 'Habilitar previsualización comparativa',
 	'wikieditor-preview-tab' => 'Previsualizar',
 	'wikieditor-preview-changes-tab' => 'Cambios',
 	'wikieditor-preview-loading' => 'Cargando...',
-	'wikieditor-previewDialog-preference' => 'Habilitar diálogo de vista previa',
+	'wikieditor-previewDialog-preference' => 'Activar el diálogo de previsualización',
 	'wikieditor-previewDialog-tab' => 'Previsualizar',
 	'wikieditor-previewDialog-loading' => 'Cargando...',
 	'wikieditor-publish-preference' => 'Habilitar publicación paso a paso',
@@ -7879,7 +7950,7 @@ $messages['es'] = array(
 	'wikieditor-toolbar' => 'Barra de herramientas de edición',
 	'wikieditor-toolbar-desc' => 'Barra de herramientas de la página de edición con usabilidad mejorada',
 	'wikieditor-toolbar-preference' => 'Habilitar la barra de herramientas de edición mejorada',
-	'wikieditor-toolbar-dialogs-preference' => 'Habilitar diálogos para insertar enlaces, tablas y más',
+	'wikieditor-toolbar-dialogs-preference' => 'Activar los asistentes para insertar enlaces y tablas, y la función de buscar y reemplazar',
 	'wikieditor-toolbar-hidesig' => 'Ocultar el botón firmar de las páginas en el espacio de nombres principal',
 	'wikieditor-toolbar-loading' => 'Cargando...',
 	'wikieditor-toolbar-tool-bold' => 'Negrita',
@@ -7906,21 +7977,22 @@ $messages['es'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'No existe la página',
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Título inválido',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Enlace externo',
-	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Revisando existencia de la página...',
+	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Comprobando que la página existe…',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Página de desambiguación',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'El título que ha especificado no es válido.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'EL URL que has especificado parece que tenia como finalidad ser un vínculo para otra página wiki.
 ¿Deseas hacerlo un vínculo interno?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Enlace interno',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Enlace externo',
 	'wikieditor-toolbar-tool-link-empty' => 'No has escrito nada a qué vincular.',
-	'wikieditor-toolbar-tool-file' => 'Archivo empotrado',
+	'wikieditor-toolbar-tool-file' => 'Archivo incrustado',
 	'wikieditor-toolbar-tool-file-example' => 'Ejemplo.jpg',
 	'wikieditor-toolbar-tool-file-title' => 'Insertar archivo',
 	'wikieditor-toolbar-file-target' => 'Nombre de archivo:',
 	'wikieditor-toolbar-file-caption' => 'Leyenda:',
 	'wikieditor-toolbar-file-size' => 'Tamaño:',
 	'wikieditor-toolbar-file-float' => 'Alinear:',
-	'wikieditor-toolbar-file-default' => '(por defecto)',
+	'wikieditor-toolbar-file-default' => '(predeterminado)',
 	'wikieditor-toolbar-file-format' => 'Formato:',
 	'wikieditor-toolbar-file-format-none' => 'ninguno',
 	'wikieditor-toolbar-tool-file-insert' => 'Insertar',
@@ -7942,11 +8014,11 @@ $messages['es'] = array(
 	'wikieditor-toolbar-tool-heading-example' => 'Texto de encabezado',
 	'wikieditor-toolbar-group-format' => 'Formato',
 	'wikieditor-toolbar-tool-ulist' => 'Lista viñeteada',
-	'wikieditor-toolbar-tool-ulist-example' => 'Ítem de lista de viñetas',
+	'wikieditor-toolbar-tool-ulist-example' => 'Elemento de lista de viñetas',
 	'wikieditor-toolbar-tool-olist' => 'Lista numerada',
-	'wikieditor-toolbar-tool-olist-example' => 'Ítem de lista numerada',
-	'wikieditor-toolbar-tool-indent' => 'Indentación',
-	'wikieditor-toolbar-tool-indent-example' => 'Línea indentada',
+	'wikieditor-toolbar-tool-olist-example' => 'Elemento de lista numerada',
+	'wikieditor-toolbar-tool-indent' => 'Sangría',
+	'wikieditor-toolbar-tool-indent-example' => 'Línea con sangría',
 	'wikieditor-toolbar-tool-nowiki' => 'Sin formato wiki',
 	'wikieditor-toolbar-tool-nowiki-example' => 'Introduzca texto sin formato aquí',
 	'wikieditor-toolbar-tool-redirect' => 'Redirección',
@@ -7955,15 +8027,15 @@ $messages['es'] = array(
 	'wikieditor-toolbar-tool-big-example' => 'Texto grande',
 	'wikieditor-toolbar-tool-small' => 'Pequeño',
 	'wikieditor-toolbar-tool-small-example' => 'Texto pequeño',
-	'wikieditor-toolbar-tool-superscript' => 'Superescrito',
-	'wikieditor-toolbar-tool-superscript-example' => 'Texto superescrito',
-	'wikieditor-toolbar-tool-subscript' => 'Suscribir',
-	'wikieditor-toolbar-tool-subscript-example' => 'Texto suscrito',
+	'wikieditor-toolbar-tool-superscript' => 'Superíndice',
+	'wikieditor-toolbar-tool-superscript-example' => 'Texto en superíndice',
+	'wikieditor-toolbar-tool-subscript' => 'Subíndice',
+	'wikieditor-toolbar-tool-subscript-example' => 'Texto en subíndice',
 	'wikieditor-toolbar-group-insert' => 'Insertar',
 	'wikieditor-toolbar-tool-gallery' => 'Galería de fotos',
 	'wikieditor-toolbar-tool-gallery-example' => '$1:Ejemplo.jpg|Descripción1
 $1:Ejemplo.jpg|Descripción2',
-	'wikieditor-toolbar-tool-newline' => 'Nueva línea',
+	'wikieditor-toolbar-tool-newline' => 'Línea nueva',
 	'wikieditor-toolbar-tool-table' => 'Tabla',
 	'wikieditor-toolbar-tool-table-example-old' => '-
 ! encabezado 1
@@ -7979,7 +8051,7 @@ $1:Ejemplo.jpg|Descripción2',
 | fila 2, celda 3',
 	'wikieditor-toolbar-tool-table-example-cell-text' => 'Texto de celda',
 	'wikieditor-toolbar-tool-table-example-header' => 'Texto de encabezado',
-	'wikieditor-toolbar-tool-table-title' => 'Inserte tabla',
+	'wikieditor-toolbar-tool-table-title' => 'Insertar una tabla',
 	'wikieditor-toolbar-tool-table-dimensions-rows' => 'Filas',
 	'wikieditor-toolbar-tool-table-dimensions-columns' => 'Columnas',
 	'wikieditor-toolbar-tool-table-dimensions-header' => 'Incluir encabezado de fila',
@@ -7989,21 +8061,21 @@ $1:Ejemplo.jpg|Descripción2',
 	'wikieditor-toolbar-tool-table-preview' => 'Previsualización',
 	'wikieditor-toolbar-tool-table-insert' => 'Insertar',
 	'wikieditor-toolbar-tool-table-cancel' => 'Cancelar',
-	'wikieditor-toolbar-tool-table-toomany' => 'Insertar una tabla con más de $1 celdas no es posible con este cuadro de diálogo.', # Fuzzy
+	'wikieditor-toolbar-tool-table-toomany' => 'No se puede insertar una tabla con más de mil celdas con este diálogo.',
 	'wikieditor-toolbar-tool-table-invalidnumber' => 'No se ha introducido un número válido de filas o columnas.',
 	'wikieditor-toolbar-tool-table-zero' => 'No se puede insertar una tabla con cero filas o columnas.',
 	'wikieditor-toolbar-tool-replace' => 'Buscar y reemplazar',
 	'wikieditor-toolbar-tool-replace-title' => 'Buscar y reemplazar',
 	'wikieditor-toolbar-tool-replace-search' => 'Buscar:',
 	'wikieditor-toolbar-tool-replace-replace' => 'Reemplazar por:',
-	'wikieditor-toolbar-tool-replace-case' => 'Considerar mayúsculas',
+	'wikieditor-toolbar-tool-replace-case' => 'Distinguir mayúsculas y minúsculas',
 	'wikieditor-toolbar-tool-replace-regex' => 'Tratar la cadena de búsqueda como expresión regular',
 	'wikieditor-toolbar-tool-replace-button-findnext' => 'Buscar siguiente',
 	'wikieditor-toolbar-tool-replace-button-replace' => 'Reemplazar',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'Reemplazar todo',
 	'wikieditor-toolbar-tool-replace-close' => 'Cerrar',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'Su búsqueda no halló resultados.',
-	'wikieditor-toolbar-tool-replace-success' => '$1 reemplazos hechos', # Fuzzy
+	'wikieditor-toolbar-tool-replace-success' => 'Se {{PLURAL:$1|realizó|realizaron}} $1 {{PLURAL:$1|reemplazo|reemplazos}}.',
 	'wikieditor-toolbar-tool-replace-emptysearch' => 'No ingresó nada para buscar.',
 	'wikieditor-toolbar-tool-replace-invalidregex' => 'La expresión regular que ha introducido es inválida: $1',
 	'wikieditor-toolbar-section-characters' => 'Caracteres especiales',
@@ -8023,17 +8095,17 @@ $1:Ejemplo.jpg|Descripción2',
 	'wikieditor-toolbar-characters-page-sinhala' => 'Sinhala',
 	'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
 	'wikieditor-toolbar-characters-page-devanagari' => 'Devanagari',
-	'wikieditor-toolbar-characters-page-thai' => 'Thai',
+	'wikieditor-toolbar-characters-page-thai' => 'Tailandés',
 	'wikieditor-toolbar-characters-page-lao' => 'Lao',
-	'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
-	'wikieditor-toolbar-characters-endash' => 'guión corto',
-	'wikieditor-toolbar-characters-emdash' => 'guión largo',
+	'wikieditor-toolbar-characters-page-khmer' => 'Jemer',
+	'wikieditor-toolbar-characters-endash' => 'semirraya',
+	'wikieditor-toolbar-characters-emdash' => 'raya',
 	'wikieditor-toolbar-characters-minus' => 'signo menos',
 	'wikieditor-toolbar-section-help' => 'Ayuda',
 	'wikieditor-toolbar-help-heading-description' => 'Descripción',
-	'wikieditor-toolbar-help-heading-syntax' => 'Lo que escribe',
-	'wikieditor-toolbar-help-heading-result' => 'Lo que obtiene',
-	'wikieditor-toolbar-help-page-format' => 'Formateando',
+	'wikieditor-toolbar-help-heading-syntax' => 'Lo que escribes',
+	'wikieditor-toolbar-help-heading-result' => 'Lo que obtienes',
+	'wikieditor-toolbar-help-page-format' => 'Formato',
 	'wikieditor-toolbar-help-page-link' => 'Enlaces',
 	'wikieditor-toolbar-help-page-heading' => 'Encabezados',
 	'wikieditor-toolbar-help-page-list' => 'Listas',
@@ -8055,16 +8127,16 @@ $1:Ejemplo.jpg|Descripción2',
 	'wikieditor-toolbar-help-content-xlink-description' => 'Enlace externo',
 	'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Etiqueta del enlace]<br />[http://www.example.org]<br />http://www.example.org',
 	'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Etiqueta del enlace</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.example.org</a>",
-	'wikieditor-toolbar-help-content-heading2-description' => 'Encabezado de 2º nivel',
+	'wikieditor-toolbar-help-content-heading2-description' => 'Encabezado de 2.º nivel',
 	'wikieditor-toolbar-help-content-heading2-syntax' => '== Texto de encabezado ==',
 	'wikieditor-toolbar-help-content-heading2-result' => '<h2>Texto de encabezado</h2>',
-	'wikieditor-toolbar-help-content-heading3-description' => 'Encabezado de 3º nivel',
+	'wikieditor-toolbar-help-content-heading3-description' => 'Encabezado de tercer nivel',
 	'wikieditor-toolbar-help-content-heading3-syntax' => '=== Texto de encabezado ===',
 	'wikieditor-toolbar-help-content-heading3-result' => '<h3>Texto de encabezado</h3>',
-	'wikieditor-toolbar-help-content-heading4-description' => 'Encabezado de 4º nivel',
+	'wikieditor-toolbar-help-content-heading4-description' => 'Encabezado de 4.º nivel',
 	'wikieditor-toolbar-help-content-heading4-syntax' => '==== Texto de encabezado ====',
 	'wikieditor-toolbar-help-content-heading4-result' => '<h4>Texto de encabezado</h4>',
-	'wikieditor-toolbar-help-content-heading5-description' => 'Encabezado de 5º nivel',
+	'wikieditor-toolbar-help-content-heading5-description' => 'Encabezado de 5.º nivel',
 	'wikieditor-toolbar-help-content-heading5-syntax' => '===== Texto de encabezado =====',
 	'wikieditor-toolbar-help-content-heading5-result' => '<h5>Texto de encabezado</h5>',
 	'wikieditor-toolbar-help-content-ulist-description' => 'Lista viñeteada',
@@ -8073,7 +8145,7 @@ $1:Ejemplo.jpg|Descripción2',
 	'wikieditor-toolbar-help-content-olist-description' => 'Lista numerada',
 	'wikieditor-toolbar-help-content-olist-syntax' => '# Elemento de la lista<br /># Elemento de la lista',
 	'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Elemento de la lista</li><li>Elemento de la lista</li></ol>',
-	'wikieditor-toolbar-help-content-file-description' => 'Archivo empotrado',
+	'wikieditor-toolbar-help-content-file-description' => 'Archivo incrustado',
 	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Ejemplo.png|thumb|Texto de la leyenda]]',
 	'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Caption text' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Enlarge' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Texto leyenda</div></div>",
 	'wikieditor-toolbar-help-content-reference-description' => 'Referencia',
@@ -8087,9 +8159,9 @@ $1:Ejemplo.jpg|Descripción2',
 	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Nombre de usuario</a> (<a href='#' title='{{#special:mytalk}}'>discusión</a>) 15:54, 10 June 2009 (UTC)",
 	'wikieditor-toolbar-help-content-signature-description' => 'Firma',
 	'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Nombre de usuario</a> (<a href='#' title='{{#special:mytalk}}'>discusión</a>)",
-	'wikieditor-toolbar-help-content-indent-description' => 'Indentado',
-	'wikieditor-toolbar-help-content-indent-syntax' => 'Texto normal<br />:Texto indentado<br />::Texto indentado',
-	'wikieditor-toolbar-help-content-indent-result' => 'Texto normal<dl><dd>Texto indentado<dl><dd>Texto indentado</dd></dl></dd></dl>',
+	'wikieditor-toolbar-help-content-indent-description' => 'Sangría',
+	'wikieditor-toolbar-help-content-indent-syntax' => 'Texto normal<br />:Texto con sangría<br />::Texto con sangría',
+	'wikieditor-toolbar-help-content-indent-result' => 'Texto normal<dl><dd>Texto con sangría<dl><dd>Texto con sangría</dd></dl></dd></dl>',
 );
 
 /** Estonian (eesti)
@@ -8103,7 +8175,7 @@ $messages['et'] = array(
 	'wikieditor-desc' => 'Sisaldab vikiteksti laiendatud redigeerimisliidest ja palju redigeerimisfunktsioone.',
 	'wikieditor-wikitext-tab' => 'Vikitekst',
 	'wikieditor-loading' => 'Laadimine...',
-	'wikieditor-preview-preference' => 'Kuva eelvaade külgmisel sakil',
+	'wikieditor-preview-preference' => 'Kasuta kõrvalkaardil kuvatavat eelvaadet',
 	'wikieditor-preview-tab' => 'Eelvaade',
 	'wikieditor-preview-changes-tab' => 'Muudatused',
 	'wikieditor-preview-loading' => 'Laadimine...',
@@ -8129,7 +8201,7 @@ $messages['et'] = array(
 	'wikieditor-toolbar' => 'Toimetamise tööriistariba',
 	'wikieditor-toolbar-desc' => 'Täiustatud kasutushõlpsusega redigeerimislehekülje tööriistariba',
 	'wikieditor-toolbar-preference' => 'Kasuta laiendatud redigeerimisriba',
-	'wikieditor-toolbar-dialogs-preference' => 'Kasuta tabelite ja muu lisamiseks dialoogikaste',
+	'wikieditor-toolbar-dialogs-preference' => 'Kasuta viisardeid tabelite lisamisel ning otsi- ja asendusfunktsiooni jaoks',
 	'wikieditor-toolbar-hidesig' => 'Peida põhinimeruumi lehekülgedel allkirjanupp',
 	'wikieditor-toolbar-loading' => 'Laadimine...',
 	'wikieditor-toolbar-tool-bold' => 'Rasvane',
@@ -8157,6 +8229,7 @@ $messages['et'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Vigane pealkiri',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Välislink',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Lehekülje olemasolu kindlakstegemine...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Täpsustuslehekülg',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Määratud pealkiri on vigane.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Paistab, et sisestatud internetiaadress viitab teisele vikileheküljele.
 Kas soovid sellest siselingi teha?',
@@ -8366,7 +8439,7 @@ $messages['eu'] = array(
 	'wikieditor-publish-button-publish' => 'Argitaratu',
 	'wikieditor-publish-button-cancel' => 'Utzi',
 	'wikieditor-publish-dialog-title' => '{{SITENAME}}era argitaratu',
-	'wikieditor-publish-dialog-summary' => 'Laburpena (Egindako aldaketak laburki azaldu):',
+	'wikieditor-publish-dialog-summary' => 'Laburpena (azaldu itzazu egin dituzun aldaketak, laburki):',
 	'wikieditor-publish-dialog-minor' => 'Aldaketa txikia',
 	'wikieditor-publish-dialog-watch' => 'Orrialde hau jarraitu',
 	'wikieditor-publish-dialog-publish' => 'Argitaratu',
@@ -8382,7 +8455,7 @@ $messages['eu'] = array(
 	'wikieditor-toolbar' => 'Tresna-barra aldatzen',
 	'wikieditor-toolbar-desc' => 'Orrialdeko editatzeko barra aldatu era erabilgarritasun hobetuarekin',
 	'wikieditor-toolbar-preference' => 'Editatzeko tresna barra hobetua gaitu',
-	'wikieditor-toolbar-dialogs-preference' => 'Elkarrizketa kutxak gaitu loturak, taula eta bestelakoak sartzeko',
+	'wikieditor-toolbar-dialogs-preference' => 'Elkarrizketa kutxak gaitu loturak, taula eta bestelakoak sartzeko', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Kargatzen...',
 	'wikieditor-toolbar-tool-bold' => 'Lodia',
 	'wikieditor-toolbar-tool-bold-example' => 'Letra lodiko testua',
@@ -8596,12 +8669,12 @@ $messages['fa'] = array(
 	'wikieditor' => 'رابط ویرایش پیشرفته ویکی‌متن',
 	'wikieditor-desc' => 'یک رابط ویرایش پیشرفته ویکی‌متن و چندین پودمان دارای قابلیت فراهم می‌کند',
 	'wikieditor-wikitext-tab' => 'ویکی‌متن',
-	'wikieditor-loading' => 'در حال بارگیری',
+	'wikieditor-loading' => 'در حال بارگیری...',
 	'wikieditor-preview-preference' => 'فعال‌سازی پیش‌نمایش کنار یک دیگر',
 	'wikieditor-preview-tab' => 'پیش‌نمایش',
 	'wikieditor-preview-changes-tab' => 'تغییرها',
 	'wikieditor-preview-loading' => 'در حال بارگیری...',
-	'wikieditor-previewDialog-preference' => 'فعال کردن پنجره‌های تعاملی پیش‌نمایش',
+	'wikieditor-previewDialog-preference' => 'فعال‌کردن پنجره‌های تعاملی پیش‌نمایش',
 	'wikieditor-previewDialog-tab' => 'پیش‌نمایش',
 	'wikieditor-previewDialog-loading' => 'در حال بارگیری...',
 	'wikieditor-publish-preference' => 'فعال‌سازی انتشار گام‌به‌گام',
@@ -8624,7 +8697,7 @@ $messages['fa'] = array(
 	'wikieditor-toolbar' => 'نوار ابزار ویرایش',
 	'wikieditor-toolbar-desc' => 'نوار ابزار ویرایش صفحه با استفاده‌پذیری بالاتر',
 	'wikieditor-toolbar-preference' => 'فعال‌کردن نوارابزار ویرایش پیشرفته',
-	'wikieditor-toolbar-dialogs-preference' => 'فعال‌سازی پنجره‌های تعاملی برای وارد کردن پیوندها، جدول‌ها و غیره',
+	'wikieditor-toolbar-dialogs-preference' => 'فعال‌سازی پنجره‌های تعاملی برای وارد کردن پیوندها، جدول‌ها همراه با دستور جستجو و جایگزینی',
 	'wikieditor-toolbar-hidesig' => 'نهفتن دکمهٔ امضا از صفحه‌های فضای نام اصلی',
 	'wikieditor-toolbar-loading' => 'در حال بارگیری...',
 	'wikieditor-toolbar-tool-bold' => 'پررنگ',
@@ -8652,6 +8725,7 @@ $messages['fa'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'عنوان نادرست',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'پیوند به بیرون',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'بررسی وجود داشتن صفحه...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'صفحهٔ ابهام‌زدائی',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'عنوان تعیین‌شده نامعتبر است.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'نشانی اینترنتی که وارد کردید به شکلی است که نمایانگر یک پیوند به صفحه‌ای داخل ویکی است. آیا می‌خواهید آن را به یک پیوند داخلی تبدیل کنید؟',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'پیوند داخلی',
@@ -8733,7 +8807,7 @@ $1:مثال.jpg|عنوان ۲',
 	'wikieditor-toolbar-tool-table-preview' => 'پیش‌نمایش',
 	'wikieditor-toolbar-tool-table-insert' => 'افزودن',
 	'wikieditor-toolbar-tool-table-cancel' => 'لغو',
-	'wikieditor-toolbar-tool-table-toomany' => 'اضافه کردن جدولی با بیش از $1 خانه توسط این ابزار ممکن نیست.', # Fuzzy
+	'wikieditor-toolbar-tool-table-toomany' => 'اضافه کردن جدولی با بیش از ۱۰۰۰ خانه توسط این ابزار ممکن نیست.',
 	'wikieditor-toolbar-tool-table-invalidnumber' => 'شما عدد درستی برای تعداد ردیف‌ها و ستون‌ها وارد نکرده‌اید.',
 	'wikieditor-toolbar-tool-table-zero' => 'شما نمی‌توانید جدولی با صفر ردیف یا ستون اضافه کنید.',
 	'wikieditor-toolbar-tool-replace' => 'یافتن و جایگزین کردن',
@@ -8747,7 +8821,7 @@ $1:مثال.jpg|عنوان ۲',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'جایگزین کردن همه موارد',
 	'wikieditor-toolbar-tool-replace-close' => 'بستن',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'جستجوی شما با هیچ موردی مطابقت نداشت.',
-	'wikieditor-toolbar-tool-replace-success' => '$1 جایگزینی انجام شد.', # Fuzzy
+	'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|جایگزینی|جایگزینی}} انجام شد.',
 	'wikieditor-toolbar-tool-replace-emptysearch' => 'شما چیزی برای جستجو وارد نکردید.',
 	'wikieditor-toolbar-tool-replace-invalidregex' => 'عبارت باقاعده‌ای که وارد کردید مجاز نیست: $1',
 	'wikieditor-toolbar-section-characters' => 'نویسه‌های ویژه',
@@ -8759,7 +8833,7 @@ $1:مثال.jpg|عنوان ۲',
 	'wikieditor-toolbar-characters-page-cyrillic' => 'سیریلیک',
 	'wikieditor-toolbar-characters-page-arabic' => 'عربی',
 	'wikieditor-toolbar-characters-page-arabicextended' => 'عربی گسترش‌یافته',
-	'wikieditor-toolbar-characters-page-persian' => 'پارسی',
+	'wikieditor-toolbar-characters-page-persian' => 'فارسی',
 	'wikieditor-toolbar-characters-page-hebrew' => 'عبری',
 	'wikieditor-toolbar-characters-page-bangla' => 'بنگالی',
 	'wikieditor-toolbar-characters-page-tamil' => 'تامیلی',
@@ -8844,6 +8918,7 @@ $1:مثال.jpg|عنوان ۲',
  * @author Nedergard
  * @author Nike
  * @author Olli
+ * @author Pxos
  * @author Silvonen
  * @author Str4nd
  * @author Stryn
@@ -8882,7 +8957,7 @@ $messages['fi'] = array(
 	'wikieditor-toolbar' => 'Työkalupalkki muokkaukseen',
 	'wikieditor-toolbar-desc' => 'Muokkaussivun työkalupalkki paremmalla käytettävyydellä.',
 	'wikieditor-toolbar-preference' => 'Ota käyttöön parannettu työkalupalkki muokkauksissa',
-	'wikieditor-toolbar-dialogs-preference' => 'Ota käyttöön valintatoiminto, jonka avulla voit lisätä linkkejä, taulukoita ja muuta',
+	'wikieditor-toolbar-dialogs-preference' => 'Ota käyttöön valintatoiminto, jonka avulla voit lisätä linkkejä, taulukoita ja muuta', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Piilota allekirjoituspainike sivuilta päänimiavaruudessa',
 	'wikieditor-toolbar-loading' => 'Ladataan…',
 	'wikieditor-toolbar-tool-bold' => 'Lihavointi',
@@ -8910,6 +8985,7 @@ $messages['fi'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Virheellinen otsikko',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ulkoinen linkki',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Tarkastetaan sivun olemassaolo…',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Täsmennyssivu',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Antamasi otsikko on virheellinen.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'URL-osoite, jonka annoit näyttää siltä kuin se olisi linkki toiselle wikisivulle.
 Haluatko tehdä siitä sisäisen linkin?',
@@ -9108,6 +9184,7 @@ $1:Esimerkki.jpg|Kuvateksti2',
  * @author PieRRoMaN
  * @author Urhixidur
  * @author Verdy p
+ * @author Wyz
  * @author Zetud
  */
 $messages['fr'] = array(
@@ -9130,7 +9207,7 @@ $messages['fr'] = array(
 	'wikieditor-publish-dialog-minor' => 'Modification mineure',
 	'wikieditor-publish-dialog-watch' => 'Suivre cette page',
 	'wikieditor-publish-dialog-publish' => 'Publier',
-	'wikieditor-publish-dialog-goback' => 'Revenir en arrière',
+	'wikieditor-publish-dialog-goback' => 'Retour',
 	'wikieditor-template-editor-preference' => 'Activer la modification à base de formulaires des modèles wiki',
 	'wikieditor-template-editor-dialog-title' => 'Modifier le modèle',
 	'wikieditor-template-editor-dialog-submit' => 'Mettre à jour',
@@ -9142,7 +9219,7 @@ $messages['fr'] = array(
 	'wikieditor-toolbar' => 'Barre d’outils de modification',
 	'wikieditor-toolbar-desc' => 'Barre d’outils de modification avec l’utilisabilité améliorée',
 	'wikieditor-toolbar-preference' => 'Activer la barre d’outils améliorée',
-	'wikieditor-toolbar-dialogs-preference' => 'Activer les boîtes de dialogue pour ajouter des liens, des tableaux et plus',
+	'wikieditor-toolbar-dialogs-preference' => 'Activer les assistants pour ajouter des liens, des tableaux ainsi que la fonction de recherche et remplacement',
 	'wikieditor-toolbar-hidesig' => "Masquer le bouton de signature dans les pages de l'espace de noms principal",
 	'wikieditor-toolbar-loading' => 'Chargement...',
 	'wikieditor-toolbar-tool-bold' => 'Gras',
@@ -9170,6 +9247,7 @@ $messages['fr'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Titre invalide',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Lien externe',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Vérification de l’existence de la page...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Page d’homonymie',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Le titre que vous avez spécifié est incorrect.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'L’URL que vous avez spécifiée semble mener à une autre page du wiki.
 Voulez-vous utiliser un lien interne à la place ?',
@@ -9390,7 +9468,7 @@ $messages['frp'] = array(
 	'wikieditor-toolbar' => 'Bârra d’outils d’èdicion',
 	'wikieditor-toolbar-desc' => 'Bârra d’outils d’èdicion avouéc l’utilisabilitât mèlyorâ',
 	'wikieditor-toolbar-preference' => 'Activar la bârra d’outils d’èdicion mèlyorâ',
-	'wikieditor-toolbar-dialogs-preference' => 'Activar les bouètes de dialogo por apondre des lims, des tablôs et ples',
+	'wikieditor-toolbar-dialogs-preference' => 'Activar les bouètes de dialogo por apondre des lims, des tablôs et ples', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Cachiér lo boton de signatura dens les pâges de l’èspâço de noms principâl',
 	'wikieditor-toolbar-loading' => 'Chargement...',
 	'wikieditor-toolbar-tool-bold' => 'Grâs',
@@ -9659,6 +9737,7 @@ $messages['ga'] = array(
 
 /** Scottish Gaelic (Gàidhlig)
  * @author Akerbeltz
+ * @author Shirayuki
  */
 $messages['gd'] = array(
 	'wikieditor' => 'Eadar-aghaidh deasachadh wikitext adhartach',
@@ -9692,7 +9771,7 @@ $messages['gd'] = array(
 	'wikieditor-toolbar' => 'Am bàr-inneil deasachaidh',
 	'wikieditor-toolbar-desc' => 'Am bàr-inneil deasachaidh le comasan a bharrachd',
 	'wikieditor-toolbar-preference' => 'Cuir am bàr-inneil le comasan a bharrachd an comas',
-	'wikieditor-toolbar-dialogs-preference' => 'Cuir an comas na còmhraidhean airson ceanglaichean, clàir is rudan eile a chur a-steach',
+	'wikieditor-toolbar-dialogs-preference' => 'Cuir an comas na draoidhean airson ceanglaichean, clàran agus am foincsean airson lorg a dhèanamh no rudan a chur an àite rudan eile',
 	'wikieditor-toolbar-loading' => "'Ga luchdadh...",
 	'wikieditor-toolbar-tool-bold' => 'Trom',
 	'wikieditor-toolbar-tool-bold-example' => 'Teacs trom',
@@ -9919,7 +9998,7 @@ $messages['gl'] = array(
 	'wikieditor-toolbar' => 'Barra de ferramentas de edición',
 	'wikieditor-toolbar-desc' => 'Editar a páxina da barra de ferramentas cunha mellor usabilidade',
 	'wikieditor-toolbar-preference' => 'Activar a barra de ferramentas de edición mellorada',
-	'wikieditor-toolbar-dialogs-preference' => 'Activar os diálogos para engadir ligazóns, táboas e máis',
+	'wikieditor-toolbar-dialogs-preference' => 'Activar os diálogos para engadir ligazóns, táboas, así como a función de buscar e substituír',
 	'wikieditor-toolbar-hidesig' => 'Agochar o botón de sinatura nas páxinas do espazo de nomes principal',
 	'wikieditor-toolbar-loading' => 'Cargando...',
 	'wikieditor-toolbar-tool-bold' => 'Negra',
@@ -9947,6 +10026,7 @@ $messages['gl'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Título non válido',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ligazón externa',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Comprobando a existencia da páxina...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Páxina de homónimos',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'O título que especificou non é válido.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'O enderezo URL que especificou semella ser unha ligazón cara a outra páxina do wiki.
 Quere converter ese enderezo nunha ligazón interna?',
@@ -10263,7 +10343,7 @@ $messages['gsw'] = array(
 	'wikieditor-toolbar' => 'Wärchzygchäschtli bearbeite',
 	'wikieditor-toolbar-desc' => 'Wärchzygchäschtli mit ere verbesserete Benutzerfrejndligkeit bearbeite',
 	'wikieditor-toolbar-preference' => 'Verbesseret Bearbeitigs-Wärchzygchäschtli meglig mache',
-	'wikieditor-toolbar-dialogs-preference' => 'Dialog aktiviere zum Links, Tabälle usw. yysetze',
+	'wikieditor-toolbar-dialogs-preference' => 'Dialog aktiviere zum Links, Tabälle usw. yysetze', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Dr Unterschriftebutton bi Syte im Artikelnamensruum uusblände',
 	'wikieditor-toolbar-loading' => 'Am Lade ...',
 	'wikieditor-toolbar-tool-bold' => 'Fätt',
@@ -10510,7 +10590,7 @@ $messages['gu'] = array(
 	'wikieditor-toolbar' => 'ફેરફાર  સાધન કંપાસ',
 	'wikieditor-toolbar-desc' => 'પૃષ્ઠના ફેરફાર સાધનો ને વધારેલ વપરાશ સાધનો ધરાવતી પેટી ઉમેરી મુકો',
 	'wikieditor-toolbar-preference' => 'અદ્યતન સંપાદન સાધનો સક્રીય કરો',
-	'wikieditor-toolbar-dialogs-preference' => 'કડીઓ, કોઠા અને અન્ય વસ્તુઓ ઉમેરવા સંભાષણ સક્રીય કરો',
+	'wikieditor-toolbar-dialogs-preference' => 'કડીઓ, કોઠા અને અન્ય વસ્તુઓ ઉમેરવા સંભાષણ સક્રીય કરો', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'મુખ્ય નામ સ્થળ  પરના પાના પરથી હસ્તાક્ષર બટન હટાવો',
 	'wikieditor-toolbar-loading' => 'લવાઇ રહ્યું છે...',
 	'wikieditor-toolbar-tool-bold' => 'ઘાટું',
@@ -10748,7 +10828,7 @@ $messages['gv'] = array(
 	'wikieditor-toolbar' => 'Barr greieyn reaghey',
 	'wikieditor-toolbar-desc' => 'Barr greieyn reaghey tooilley yn-ymmydey',
 	'wikieditor-toolbar-preference' => 'Lhiggey da barr greieyn reaghey tooilley yn-ymmydey',
-	'wikieditor-toolbar-dialogs-preference' => 'Lhiggey da kishtaghyn cooney dys cur stiagh kianglaghyn, taabylyn as reddyn elley',
+	'wikieditor-toolbar-dialogs-preference' => 'Lhiggey da kishtaghyn cooney dys cur stiagh kianglaghyn, taabylyn as reddyn elley', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Laadey...',
 	'wikieditor-toolbar-tool-bold' => 'Trome',
 	'wikieditor-toolbar-tool-bold-example' => 'Teks trome',
@@ -10997,7 +11077,7 @@ $messages['he'] = array(
 	'wikieditor-toolbar' => 'סרגל עריכה',
 	'wikieditor-toolbar-desc' => 'הרחבת השמישות של סרגל עריכת הדף',
 	'wikieditor-toolbar-preference' => 'הפעלת סרגל עריכה משופר',
-	'wikieditor-toolbar-dialogs-preference' => 'הפעלת תיבות דו־שיח להוספת קישורים, טבלאות ועוד',
+	'wikieditor-toolbar-dialogs-preference' => 'הפעלת אשפים להוספת קישורים וטבלאות וכפתור חיפוש והחלפה',
 	'wikieditor-toolbar-hidesig' => 'להחביא את כפתור החתימה מהדפים במרחב הראשי',
 	'wikieditor-toolbar-loading' => 'בטעינה...',
 	'wikieditor-toolbar-tool-bold' => 'הדגשה',
@@ -11025,6 +11105,7 @@ $messages['he'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'כותרת בלתי תקינה',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'קישור חיצוני',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'בדיקה האם הדף קיים...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'דף פירושונים',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'הכותרת שצוינה אינה תקינה.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'הכתובת שציינתם נראית כאילו היא מיועדת לקשר לדף אחר בוויקי. האם ברצונכם להפוך זאת לקישור פנימי?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'קישור פנימי',
@@ -11443,8 +11524,10 @@ $messages['hif-latn'] = array(
 
 /** Croatian (hrvatski)
  * @author Bugoslav
+ * @author Eleassar
  * @author Ex13
  * @author Excaliboor
+ * @author MaGa
  * @author Roberta F.
  * @author SpeedyGonsales
  */
@@ -11463,7 +11546,7 @@ $messages['hr'] = array(
 	'wikieditor-publish-preference' => 'Omogućiti korak-po-korak izdavanje',
 	'wikieditor-publish-button-publish' => 'Objaviti',
 	'wikieditor-publish-button-cancel' => 'Odustani',
-	'wikieditor-publish-dialog-title' => 'Objavi na {{SITENAME}}',
+	'wikieditor-publish-dialog-title' => 'Objavi na {{GRAMMAR:dajalnik|{{SITENAME}}}}',
 	'wikieditor-publish-dialog-summary' => 'Uredi sažetak (kratko opišite promjene koje ste učinili):',
 	'wikieditor-publish-dialog-minor' => 'Manja promjena',
 	'wikieditor-publish-dialog-watch' => 'Prati ovu stranicu',
@@ -11480,7 +11563,7 @@ $messages['hr'] = array(
 	'wikieditor-toolbar' => 'Alatna vrpca',
 	'wikieditor-toolbar-desc' => 'Alatna vrpca za uređivanje s poboljšanom uporabljivošću',
 	'wikieditor-toolbar-preference' => 'Omogući poboljšanu alatnu traku',
-	'wikieditor-toolbar-dialogs-preference' => 'Dopusti upitnike za unos veza, tablica i ostalog',
+	'wikieditor-toolbar-dialogs-preference' => 'Dopusti upitnike za unos veza, tablica i ostalog', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Sakrij gumb potpisa sa stranica u glavnom imenskom prostoru',
 	'wikieditor-toolbar-loading' => 'Učitavam...',
 	'wikieditor-toolbar-tool-bold' => 'Podebljano',
@@ -11519,7 +11602,7 @@ $messages['hr'] = array(
 	'wikieditor-toolbar-tool-reference' => 'Bilješke',
 	'wikieditor-toolbar-tool-reference-example' => 'Umetni tekst fusnote ovdje',
 	'wikieditor-toolbar-tool-reference-cancel' => 'Odustani',
-	'wikieditor-toolbar-tool-reference-title' => 'Umetni poveznicu',
+	'wikieditor-toolbar-tool-reference-title' => 'Umetni izvor',
 	'wikieditor-toolbar-tool-reference-insert' => 'Umetni',
 	'wikieditor-toolbar-tool-reference-text' => 'Referentni tekst',
 	'wikieditor-toolbar-tool-signature' => 'Potpis i datum',
@@ -11711,7 +11794,7 @@ $messages['hsb'] = array(
 	'wikieditor-toolbar' => 'Gratowa lajsta za wobdźěłowanje',
 	'wikieditor-toolbar-desc' => 'Gratowa lajsta za wobdźěłowanje stronow z polěpšenej wužiwajomnosću',
 	'wikieditor-toolbar-preference' => 'Polěpšenu gratowu lajstu za wobdźěłowanje aktiwizować',
-	'wikieditor-toolbar-dialogs-preference' => 'Dialogi za zasunjenje wotkazow, tabelow a hinašeho zmóžnić',
+	'wikieditor-toolbar-dialogs-preference' => 'Dialogi za zasunjenje wotkazow, tabelow a hinašeho zmóžnić', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Podpisowe tłóčatko w stronach we hłownym mjenowym rumje schować',
 	'wikieditor-toolbar-loading' => 'Čita so...',
 	'wikieditor-toolbar-tool-bold' => 'Tučny',
@@ -11965,7 +12048,7 @@ $messages['hu'] = array(
 	'wikieditor-toolbar' => 'Szerkesztő-eszköztár',
 	'wikieditor-toolbar-desc' => 'Használhatóbb szerkesztő eszköztár',
 	'wikieditor-toolbar-preference' => 'Fejlettebb szerkesztő-eszköztár használata',
-	'wikieditor-toolbar-dialogs-preference' => 'Párbeszédablakok engedélyezése hivatkozások, táblázatok és egyebek beillesztéséhez',
+	'wikieditor-toolbar-dialogs-preference' => 'Párbeszédablakok engedélyezése hivatkozások, táblázatok és egyebek beillesztéséhez', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Aláírás gomb elrejtése a szócikknévtérben',
 	'wikieditor-toolbar-loading' => 'Betöltés…',
 	'wikieditor-toolbar-tool-bold' => 'Félkövér',
@@ -12180,8 +12263,10 @@ $1:Példa.jpg|képaláírás2',
  * @author Xelgen
  */
 $messages['hy'] = array(
-	'wikieditor-preview-preference' => 'Ակտիվացնել կողք–կողքի նախադիտումը',
+	'wikieditor-loading' => 'Բեռնվում է…',
+	'wikieditor-preview-preference' => 'Միացնել կողք–կողքի նախադիտումը',
 	'wikieditor-preview-tab' => 'Նախադիտել',
+	'wikieditor-preview-changes-tab' => 'Փոփոխություններ',
 	'wikieditor-preview-loading' => 'Բեռնում…',
 	'wikieditor-previewDialog-tab' => 'Նախադիտել',
 	'wikieditor-previewDialog-loading' => 'Բեռնում…',
@@ -12193,13 +12278,17 @@ $messages['hy'] = array(
 	'wikieditor-publish-dialog-watch' => 'Հսկել այս էջը',
 	'wikieditor-publish-dialog-publish' => 'Հրատարակել',
 	'wikieditor-publish-dialog-goback' => 'Հետ գնալ',
+	'wikieditor-template-editor-dialog-title' => 'Խմբագրել կաղապարը',
+	'wikieditor-template-editor-dialog-submit' => 'Թարմացնել',
+	'wikieditor-template-editor-dialog-cancel' => 'Բեկանել',
 	'wikieditor-toc-preference' => 'Ակտիվացնել նավարկելի բովանդակության ցանկ',
 	'wikieditor-toc-show' => 'Ցուցադրել բովանդակությունը',
 	'wikieditor-toc-hide' => 'Թաքցնել բովանդակությունը',
 	'wikieditor-toolbar' => 'Խմբագրման վահանակ',
 	'wikieditor-toolbar-desc' => 'Բարձրացրած հարմարավետությամբ խմբագրման վահանակ',
 	'wikieditor-toolbar-preference' => 'Ակտիվացնել բարելավված խմբագրման վահանակը',
-	'wikieditor-toolbar-dialogs-preference' => 'Ակտիվացնել երկխոսությունները հղումների, աղյուսակների և այլնի համար',
+	'wikieditor-toolbar-dialogs-preference' => 'Ակտիվացնել երկխոսությունները հղումների, աղյուսակների և այլնի համար', # Fuzzy
+	'wikieditor-toolbar-hidesig' => 'Թաքցնել ստորագրության կոճակը գլխավոր անվանատարածքի էջերում',
 	'wikieditor-toolbar-loading' => 'Բեռնում…',
 	'wikieditor-toolbar-tool-bold' => 'Թավատառ',
 	'wikieditor-toolbar-tool-bold-example' => 'Թավատառ տեքստ',
@@ -12234,6 +12323,16 @@ $messages['hy'] = array(
 	'wikieditor-toolbar-tool-link-empty' => 'Դուք հղվելու որևէ բան չեք նշել։',
 	'wikieditor-toolbar-tool-file' => 'Ներկառուցված նիշք',
 	'wikieditor-toolbar-tool-file-example' => 'Օրինակ.jpg',
+	'wikieditor-toolbar-tool-file-title' => 'Ավելացնել նիշք',
+	'wikieditor-toolbar-file-target' => 'Նիշքի անուն․',
+	'wikieditor-toolbar-file-caption' => 'Նկարագրություն․',
+	'wikieditor-toolbar-file-size' => 'Չափս․',
+	'wikieditor-toolbar-file-float' => 'Դիրք․',
+	'wikieditor-toolbar-file-default' => '(լռելյայն)',
+	'wikieditor-toolbar-file-format' => 'Տեսք․',
+	'wikieditor-toolbar-file-format-none' => 'ոչ մի',
+	'wikieditor-toolbar-tool-file-insert' => 'Ավելացնել',
+	'wikieditor-toolbar-tool-file-cancel' => 'Բեկանել',
 	'wikieditor-toolbar-tool-reference' => 'Ծանոթագրություն',
 	'wikieditor-toolbar-tool-reference-example' => 'Գրեք այստեղ ծանոթագրության տեքստը',
 	'wikieditor-toolbar-tool-reference-cancel' => 'Բեկանել',
@@ -12298,7 +12397,7 @@ $1:Example.jpg|Նկարագրություն2',
 	'wikieditor-toolbar-tool-table-preview' => 'Նախադիտում',
 	'wikieditor-toolbar-tool-table-insert' => 'Ավելացնել',
 	'wikieditor-toolbar-tool-table-cancel' => 'Բեկանել',
-	'wikieditor-toolbar-tool-table-toomany' => 'Այս երկխոսության միջոցով հնարավոր չէ $1 վանդակից ավել վանդակ ունեցող աղյուսակ ստեղծել։', # Fuzzy
+	'wikieditor-toolbar-tool-table-toomany' => 'Այս երկխոսության միջոցով հնարավոր չէ 1000-ից ավել վանդակ ունեցող աղյուսակ ստեղծել։',
 	'wikieditor-toolbar-tool-table-invalidnumber' => 'Դուք չեք նշել տողերի կամ սյունակների թույլատրելի քանակ։',
 	'wikieditor-toolbar-tool-table-zero' => 'Դուք չեք կարող ավելացնել տողերի կամ սյունակների զրոյական քանակությամբ աղյուսակ։',
 	'wikieditor-toolbar-tool-replace' => 'Որոնում և փոխարինում',
@@ -12308,10 +12407,11 @@ $1:Example.jpg|Նկարագրություն2',
 	'wikieditor-toolbar-tool-replace-case' => 'Համընկում ըստ տառաշարի (մեծատառ/փոքրատառ)',
 	'wikieditor-toolbar-tool-replace-regex' => 'Որոնման տողը ընկալել որպես regular expression',
 	'wikieditor-toolbar-tool-replace-button-findnext' => 'Գտնել հաջորդը',
+	'wikieditor-toolbar-tool-replace-button-replace' => 'Փոխարինել',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'Փոխարինել բոլորը',
-	'wikieditor-toolbar-tool-replace-close' => 'Բեկանել', # Fuzzy
+	'wikieditor-toolbar-tool-replace-close' => 'Բեկանել',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'Ձեր որոնմանը համապատասխանող արդյունքներ չեն գտնվել։',
-	'wikieditor-toolbar-tool-replace-success' => 'Կատարվել է $1 փոխարինում։', # Fuzzy
+	'wikieditor-toolbar-tool-replace-success' => 'Կատարվել է $1 {{PLURAL:$1|փոխարինում}}։',
 	'wikieditor-toolbar-tool-replace-emptysearch' => 'Դուք որոնելու որևէ բան չեք նշել։',
 	'wikieditor-toolbar-tool-replace-invalidregex' => 'Ձեր նշած regular expression-ը սխալ է․ $1',
 	'wikieditor-toolbar-section-characters' => 'Հատուկ նշաններ',
@@ -12323,11 +12423,20 @@ $1:Example.jpg|Նկարագրություն2',
 	'wikieditor-toolbar-characters-page-cyrillic' => 'Կիրիլիցա',
 	'wikieditor-toolbar-characters-page-arabic' => 'Արաբերեն',
 	'wikieditor-toolbar-characters-page-arabicextended' => 'Արաբերեն ընդլայնված',
+	'wikieditor-toolbar-characters-page-persian' => 'Պարսկերեն',
 	'wikieditor-toolbar-characters-page-hebrew' => 'Եբրայերեն',
 	'wikieditor-toolbar-characters-page-bangla' => 'Բենգալերեն',
+	'wikieditor-toolbar-characters-page-tamil' => 'Թամիլերեն',
 	'wikieditor-toolbar-characters-page-telugu' => 'Տելուգու',
 	'wikieditor-toolbar-characters-page-sinhala' => 'Սինհալերեն',
 	'wikieditor-toolbar-characters-page-gujarati' => 'Գուջարատի',
+	'wikieditor-toolbar-characters-page-devanagari' => 'Դեվանգարի',
+	'wikieditor-toolbar-characters-page-thai' => 'Թայերեն',
+	'wikieditor-toolbar-characters-page-lao' => 'Լաոերեն',
+	'wikieditor-toolbar-characters-page-khmer' => 'Կխմեր',
+	'wikieditor-toolbar-characters-endash' => 'ո գծիկ (en dash)',
+	'wikieditor-toolbar-characters-emdash' => 'ա գծիկ (em dash)',
+	'wikieditor-toolbar-characters-minus' => 'հանածի նշան',
 	'wikieditor-toolbar-section-help' => 'Օգնություն',
 	'wikieditor-toolbar-help-heading-description' => 'Նկարագրություն',
 	'wikieditor-toolbar-help-heading-syntax' => 'Ինչ եք հավաքում',
@@ -12383,7 +12492,7 @@ $1:Example.jpg|Նկարագրություն2',
 	'wikieditor-toolbar-help-content-showreferences-description' => 'Ցուցադրել ծանոթագրությունները',
 	'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Հղման տեքստ</a>, հավելյալ տեքստ։</li></ol>",
 	'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Ստորագրությունը ամսաթվով',
-	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Մասնակցի Անուն</a> (<a href='#' title='{{#special:mytalk}}'>քննարկում</a>) 15:54, 29 հունիս 2009 (UTC)",
+	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Մասնակցի անուն</a> (<a href='#' title='{{#special:mytalk}}'>քննարկում</a>) 15:54, 10 հունիս 2009 (UTC)",
 	'wikieditor-toolbar-help-content-signature-description' => 'Ստորագրություն',
 	'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Մասնակցի Անուն</a> (<a href='#' title='{{#special:mytalk}}'>քննարկում</a>)",
 	'wikieditor-toolbar-help-content-indent-description' => 'Խորքից',
@@ -12426,7 +12535,7 @@ $messages['ia'] = array(
 	'wikieditor-toolbar' => 'Instrumentario de modification',
 	'wikieditor-toolbar-desc' => 'Barra con instrumentos de modification con augmento de usabilitate',
 	'wikieditor-toolbar-preference' => 'Activar le instrumentario de modification meliorate',
-	'wikieditor-toolbar-dialogs-preference' => 'Activar dialogos pro inserer ligamines, tabulas e plus',
+	'wikieditor-toolbar-dialogs-preference' => 'Activar dialogos pro inserer ligamines, tabulas e plus', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Celar le button de signatura in paginas in le spatio de nomines principal',
 	'wikieditor-toolbar-loading' => 'Cargamento in curso…',
 	'wikieditor-toolbar-tool-bold' => 'Grasse',
@@ -12675,7 +12784,7 @@ $messages['id'] = array(
 	'wikieditor-toolbar' => 'Bilah alat penyuntingan',
 	'wikieditor-toolbar-desc' => 'Bilah alat penyuntingan dengan kebergunaan yang ditingkatkan',
 	'wikieditor-toolbar-preference' => 'Aktifkan bilah alat penyuntingan yang telah ditingkatkan',
-	'wikieditor-toolbar-dialogs-preference' => 'Aktifkan bantuan untuk menambahkan pranala, tabel dan lainnya',
+	'wikieditor-toolbar-dialogs-preference' => 'Aktifkan bantuan untuk menambahkan pranala, tabel dan lainnya', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Sembunyikan tombol tanda tangan dari halaman pada ruang nama utama',
 	'wikieditor-toolbar-loading' => 'Mengunggah...',
 	'wikieditor-toolbar-tool-bold' => 'Tebal',
@@ -12718,6 +12827,7 @@ Apakah Anda ingin membuatnya menjadi pranala internal?',
 	'wikieditor-toolbar-file-float' => 'Rata:',
 	'wikieditor-toolbar-file-default' => '(baku)',
 	'wikieditor-toolbar-file-format' => 'Format:',
+	'wikieditor-toolbar-file-format-none' => 'tidak ada',
 	'wikieditor-toolbar-tool-file-insert' => 'Sisipkan',
 	'wikieditor-toolbar-tool-file-cancel' => 'Batal',
 	'wikieditor-toolbar-tool-reference' => 'Referensi',
@@ -12850,16 +12960,16 @@ $1:Contoh.jpg|Judul2',
 	'wikieditor-toolbar-help-content-xlink-description' => 'Pranala luar',
 	'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.contoh.org Label pranala]<br />[http://www.contoh.org]<br />http://www.contoh.org',
 	'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Label pranala</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.contoh.org</a>",
-	'wikieditor-toolbar-help-content-heading2-description' => 'Judul bagian tingkat kedua',
+	'wikieditor-toolbar-help-content-heading2-description' => 'Judul tingkat 2',
 	'wikieditor-toolbar-help-content-heading2-syntax' => '== Teks judul ==',
 	'wikieditor-toolbar-help-content-heading2-result' => '<h2>Teks judul</h2>',
-	'wikieditor-toolbar-help-content-heading3-description' => 'Judul bagian tingkat ketiga',
+	'wikieditor-toolbar-help-content-heading3-description' => 'Judul tingkat 3',
 	'wikieditor-toolbar-help-content-heading3-syntax' => '=== Teks judul ===',
 	'wikieditor-toolbar-help-content-heading3-result' => '<h3>Teks judul</h3>',
-	'wikieditor-toolbar-help-content-heading4-description' => 'Judul bagian tingkat keempat',
+	'wikieditor-toolbar-help-content-heading4-description' => 'Judul tingkat 4',
 	'wikieditor-toolbar-help-content-heading4-syntax' => '==== Teks judul ====',
 	'wikieditor-toolbar-help-content-heading4-result' => '<h4>Teks judul</h4>',
-	'wikieditor-toolbar-help-content-heading5-description' => 'Judul bagian tingkat kelima',
+	'wikieditor-toolbar-help-content-heading5-description' => 'Judul tingkat 5',
 	'wikieditor-toolbar-help-content-heading5-syntax' => '===== Teks judul =====',
 	'wikieditor-toolbar-help-content-heading5-result' => '<h5>Teks judul</h5>',
 	'wikieditor-toolbar-help-content-ulist-description' => 'Daftar berpoin',
@@ -13013,7 +13123,7 @@ $messages['ilo'] = array(
 	'wikieditor-toolbar' => 'Ramit a baras ti panag-urnos',
 	'wikieditor-toolbar-desc' => 'Ramit ti baras ti panag-urnos nga addan ti napasayaat a panag-usar',
 	'wikieditor-toolbar-preference' => 'Pakabaelanna ti napasayaat a ramit ti baras a panag-urnos',
-	'wikieditor-toolbar-dialogs-preference' => 'Pakabaekanna dagiti panakisinnarita para iti panagisengngat kadagiti panilpo, tab-tabla ken adu pay',
+	'wikieditor-toolbar-dialogs-preference' => 'Pakabaelanna dagiti mangngarading para iti panangisengngat kadagiti silpo, tab-tabla ken ti pay panagbiruk ken panagisukat nga annong',
 	'wikieditor-toolbar-hidesig' => 'Ilemmeng ti pirma a buton manipud kadagiti panid iti umuna a nagan ti lugar',
 	'wikieditor-toolbar-loading' => 'Agkarkarga...',
 	'wikieditor-toolbar-tool-bold' => 'Napuskol',
@@ -13041,6 +13151,7 @@ $messages['ilo'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Imbalido a titulo',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Kasilpo iti ruar',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Kitkitaen no adda ti panid...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Panangilawlawag a panid',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Ti titulo a nainaganam ket imbalido.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Ti URL a nainaganam ket kasla naaramid a panilpo iti sabali a panid ti wiki.
 Kayatmo nga aramiden daytoy nga akinuneg a panilpo?',
@@ -13340,7 +13451,7 @@ $messages['is'] = array(
 	'wikieditor-toc-hide' => 'Fela efnisyfirlit',
 	'wikieditor-toolbar' => 'Breytingarstika',
 	'wikieditor-toolbar-desc' => 'Breytingarstika með auknu notagildi',
-	'wikieditor-toolbar-dialogs-preference' => 'Virkja valmynd fyrir innsetningu tengla, taflna og fleira',
+	'wikieditor-toolbar-dialogs-preference' => 'Virkja valmynd fyrir innsetningu tengla, taflna og fleira', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Fela undirskriftar hnappinn á síðum í aðalnafnrými',
 	'wikieditor-toolbar-loading' => 'Hleð...',
 	'wikieditor-toolbar-tool-bold' => 'Feitletrað',
@@ -13592,7 +13703,7 @@ $messages['it'] = array(
 	'wikieditor-toolbar' => 'Barra degli strumenti di modifica',
 	'wikieditor-toolbar-desc' => 'Barra degli strumenti di modifica della pagina con migliorata usabilità',
 	'wikieditor-toolbar-preference' => 'Abilita barra degli strumenti di modifica avanzata',
-	'wikieditor-toolbar-dialogs-preference' => "Abilita le finestre per l'inserimento di link, tabelle ed altro",
+	'wikieditor-toolbar-dialogs-preference' => "Abilita le finestre per l'inserimento di collegamenti, tabelle e la funzione di cerca e sostituisci",
 	'wikieditor-toolbar-hidesig' => 'Nasconde il pulsante della firma dalle pagine nel namespace principale',
 	'wikieditor-toolbar-loading' => 'Caricamento in corso...',
 	'wikieditor-toolbar-tool-bold' => 'Grassetto',
@@ -13620,6 +13731,7 @@ $messages['it'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Titolo non valido',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Collegamento esterno',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => "Controllo dell'esistenza della pagina in corso....",
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Pagina di disambiguazione',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Il titolo che hai specificato non è valido.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => "La URL che hai indicato sembra un link verso un'altra pagina wiki.
 Vuoi che sia un link interno?",
@@ -13848,7 +13960,7 @@ $messages['ja'] = array(
 	'wikieditor-toolbar' => '編集ツールバー',
 	'wikieditor-toolbar-desc' => '使いやすさの向上したページ編集ツールバー',
 	'wikieditor-toolbar-preference' => '改良型編集ツールバーを有効にする',
-	'wikieditor-toolbar-dialogs-preference' => 'リンクや表などの挿入ダイアログを有効にする',
+	'wikieditor-toolbar-dialogs-preference' => 'リンクや表の挿入、および検索と置換のためのウィザードを有効にする',
 	'wikieditor-toolbar-hidesig' => '標準名前空間で署名ボタンを非表示にする',
 	'wikieditor-toolbar-loading' => '読み込み中...',
 	'wikieditor-toolbar-tool-bold' => '太字',
@@ -13876,6 +13988,7 @@ $messages['ja'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ページ名として無効です',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => '外部リンク',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'ページの存在を確認中...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => '曖昧さ回避ページ',
 	'wikieditor-toolbar-tool-link-int-invalid' => '指定したページ名は無効です。',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => '指定した URL は別のウィキページへのリンクのようです。
 これを内部リンクにしますか?',
@@ -13924,9 +14037,9 @@ $messages['ja'] = array(
 	'wikieditor-toolbar-tool-big-example' => '大きなテキスト',
 	'wikieditor-toolbar-tool-small' => '小',
 	'wikieditor-toolbar-tool-small-example' => '小さなテキスト',
-	'wikieditor-toolbar-tool-superscript' => '上付き文字',
+	'wikieditor-toolbar-tool-superscript' => '上付き',
 	'wikieditor-toolbar-tool-superscript-example' => '上付き文字',
-	'wikieditor-toolbar-tool-subscript' => '下付き文字',
+	'wikieditor-toolbar-tool-subscript' => '下付き',
 	'wikieditor-toolbar-tool-subscript-example' => '下付き文字',
 	'wikieditor-toolbar-group-insert' => '挿入',
 	'wikieditor-toolbar-tool-gallery' => '画像ギャラリー',
@@ -14107,7 +14220,7 @@ $messages['jv'] = array(
 	'wikieditor-toolbar' => 'Bilah prangkat panyuntingan',
 	'wikieditor-toolbar-desc' => 'Sunting bilah prangkat kaca mawa kagunan canggih',
 	'wikieditor-toolbar-preference' => 'Urubaké bilah prangkat panyuntingan canggih',
-	'wikieditor-toolbar-dialogs-preference' => 'Urubaké dialog kanggo nglebokaké pranala, tabèl lan liyané',
+	'wikieditor-toolbar-dialogs-preference' => 'Urubaké dialog kanggo nglebokaké pranala, tabèl lan liyané', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Dhelikaké pencetan tapak asta saka kaca-kaca nèng bilik jeneng utama',
 	'wikieditor-toolbar-loading' => 'Ngemot...',
 	'wikieditor-toolbar-tool-bold' => 'Kandel',
@@ -14351,7 +14464,7 @@ $messages['ka'] = array(
 	'wikieditor-toolbar' => 'რედაქტირების პანელი',
 	'wikieditor-toolbar-desc' => 'რედაქტირების პანელი გაუმჯობესებული იუზაბილითით',
 	'wikieditor-toolbar-preference' => 'ჩართეთ რედაქტირების გაუმჯობესებული პანელი',
-	'wikieditor-toolbar-dialogs-preference' => 'ჩართეთ დიალოგები ბმულების, ტაბულებისა და სხვა ობიექტების ჩასასმელად',
+	'wikieditor-toolbar-dialogs-preference' => 'ბმულების, ცხრილებისა და სხვა ობიექტების ჩასასმელად ჩართეთ დიალოგები', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'ხელმოწერის ღილაკის დამალვა სახელთა სივრცის ძირითად გვერდებზე',
 	'wikieditor-toolbar-loading' => 'იტვირთება…',
 	'wikieditor-toolbar-tool-bold' => 'მუქი',
@@ -14580,6 +14693,7 @@ $messages['kiu'] = array(
 );
 
 /** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ * @author Arystanbek
  * @author GaiJin
  * @author Kaztrans
  */
@@ -14594,13 +14708,20 @@ $messages['kk-cyrl'] = array(
 	'wikieditor-previewDialog-loading' => 'Күте тұр...',
 	'wikieditor-publish-button-publish' => 'Жариялау',
 	'wikieditor-publish-button-cancel' => 'Болдырмау',
+	'wikieditor-publish-dialog-title' => '{{SITENAME}} сайтына жариялау',
 	'wikieditor-publish-dialog-minor' => 'Шағын өңдеме',
 	'wikieditor-publish-dialog-watch' => 'Бұл бетті бақылау',
 	'wikieditor-publish-dialog-publish' => 'Жариялау',
 	'wikieditor-publish-dialog-goback' => 'Артқа',
+	'wikieditor-template-editor-dialog-title' => 'Үлгіні өңдеу',
 	'wikieditor-template-editor-dialog-submit' => 'Жаңарту',
 	'wikieditor-template-editor-dialog-cancel' => 'Болдырмау',
+	'wikieditor-templates-preference' => 'Үлгі түруін қосу',
+	'wikieditor-toc-preference' => 'Мағұлыматтар навигациялық кестесін қосу',
+	'wikieditor-toc-show' => 'Мазмұнды көрсету',
+	'wikieditor-toc-hide' => 'Мазмұнды жасыру',
 	'wikieditor-toolbar' => 'Өңдеу жақтауы',
+	'wikieditor-toolbar-hidesig' => 'Негізгі есім кеңістігіндегі беттерден қолтаңба батырмасын жасыру',
 	'wikieditor-toolbar-loading' => 'Жүктеуде…',
 	'wikieditor-toolbar-tool-bold' => 'Жуан жазу',
 	'wikieditor-toolbar-tool-bold-example' => 'Жуан мәтін',
@@ -14609,11 +14730,17 @@ $messages['kk-cyrl'] = array(
 	'wikieditor-toolbar-tool-ilink' => 'Ішкі сілтеме',
 	'wikieditor-toolbar-tool-ilink-example' => 'Сілтеме тақырыбы',
 	'wikieditor-toolbar-tool-xlink' => 'Сыртқы сілтеме (алдына http:// енгізуін ұмытпаңыз)',
-	'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com сілтеме тақырыбы',
+	'wikieditor-toolbar-tool-xlink-example' => 'http://www.мысал.com сілтеме тақырыбы',
 	'wikieditor-toolbar-tool-link' => 'Сілтеме',
 	'wikieditor-toolbar-tool-link-title' => 'Сілтеме қою',
 	'wikieditor-toolbar-tool-link-int' => 'уики бетіне бару',
+	'wikieditor-toolbar-tool-link-int-target' => 'Нысана беті немесе URL:',
+	'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Бет атауы немесе URL',
 	'wikieditor-toolbar-tool-link-int-text' => 'Көрсетілетін мәтін:',
+	'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Көрсетілетін мәтін',
+	'wikieditor-toolbar-tool-link-ext' => 'Сыртқы уеб бетіне бару',
+	'wikieditor-toolbar-tool-link-ext-target' => 'URL сілтеме:',
+	'wikieditor-toolbar-tool-link-ext-text' => 'Мәтінді сілтеме:',
 	'wikieditor-toolbar-tool-link-insert' => 'Сілтеме енгізу',
 	'wikieditor-toolbar-tool-link-cancel' => 'Болдырмау',
 	'wikieditor-toolbar-tool-link-int-target-status-exists' => 'Бұл бет бар',
@@ -14624,7 +14751,19 @@ $messages['kk-cyrl'] = array(
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Ішкі сілтеме',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Сыртқы сілтеме',
 	'wikieditor-toolbar-tool-file' => 'Файл орнату',
+	'wikieditor-toolbar-tool-file-example' => 'Мысал.jpg',
+	'wikieditor-toolbar-tool-file-title' => 'Файл кірістіру',
+	'wikieditor-toolbar-file-target' => 'Файл атауы:',
+	'wikieditor-toolbar-file-caption' => 'Тақырыбы',
+	'wikieditor-toolbar-file-size' => 'Өлшемі:',
+	'wikieditor-toolbar-file-float' => 'Туралау:',
+	'wikieditor-toolbar-file-default' => '(әдепкі)',
+	'wikieditor-toolbar-file-format' => 'Пішімі:',
+	'wikieditor-toolbar-file-format-none' => 'Ешқандай',
+	'wikieditor-toolbar-tool-file-insert' => 'Кірістіру',
+	'wikieditor-toolbar-tool-file-cancel' => 'Болдырмау',
 	'wikieditor-toolbar-tool-reference' => 'Дереккөз',
+	'wikieditor-toolbar-tool-reference-example' => 'Мұнда түсірінді мәтін кірістір',
 	'wikieditor-toolbar-tool-reference-cancel' => 'Болдырмау',
 	'wikieditor-toolbar-tool-reference-title' => 'Дереккөз енгізу',
 	'wikieditor-toolbar-tool-reference-insert' => 'Енгізу',
@@ -14648,6 +14787,7 @@ $messages['kk-cyrl'] = array(
 	'wikieditor-toolbar-tool-nowiki' => 'Уики-форматтауды елемеу',
 	'wikieditor-toolbar-tool-nowiki-example' => 'Форматтауды қажет етпейтін мәтінді мында енгізіңіз',
 	'wikieditor-toolbar-tool-redirect' => 'Айдау',
+	'wikieditor-toolbar-tool-redirect-example' => 'Нысана бет атауы',
 	'wikieditor-toolbar-tool-big' => 'Ірі жазу',
 	'wikieditor-toolbar-tool-big-example' => 'Ірі жазу',
 	'wikieditor-toolbar-tool-small' => 'Кішірек жазу',
@@ -14685,6 +14825,8 @@ $1:Example.jpg|Сипаттамасы2',
 	'wikieditor-toolbar-tool-table-preview' => 'Қарап шығу',
 	'wikieditor-toolbar-tool-table-insert' => 'Енгізу',
 	'wikieditor-toolbar-tool-table-cancel' => 'Болдырмау',
+	'wikieditor-toolbar-tool-table-invalidnumber' => 'Сіз бағандар немесе қатарлар бойынша жарамды нөмір енгізбедіңіз.',
+	'wikieditor-toolbar-tool-table-zero' => 'Сіз нөлдік қатар немесе баған бойынша кесте кірістіре алмайсыз.',
 	'wikieditor-toolbar-tool-replace' => 'Іздеу және алмастыру',
 	'wikieditor-toolbar-tool-replace-title' => 'Іздеу және алмастыру',
 	'wikieditor-toolbar-tool-replace-search' => 'Іздеу:',
@@ -14696,12 +14838,28 @@ $1:Example.jpg|Сипаттамасы2',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'Барлығын алмастыру',
 	'wikieditor-toolbar-tool-replace-close' => 'Жабу',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'Сіздің сұрауыңыз бойынша еш нәрсе табылмады.',
-	'wikieditor-toolbar-tool-replace-success' => '$1 алмастыру жасалды.', # Fuzzy
+	'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|алмастыру|алмастырулар}} жасалды.',
+	'wikieditor-toolbar-tool-replace-emptysearch' => 'Іздеу үшін ештеңе енгізбедіңіз.',
 	'wikieditor-toolbar-section-characters' => 'Арнайы таңбалар',
 	'wikieditor-toolbar-characters-page-latin' => 'Латын',
+	'wikieditor-toolbar-characters-page-latinextended' => 'Кеңейтілген латын',
 	'wikieditor-toolbar-characters-page-symbols' => 'Белгілер',
+	'wikieditor-toolbar-characters-page-greek' => 'Грек',
+	'wikieditor-toolbar-characters-page-cyrillic' => 'Кирилл',
+	'wikieditor-toolbar-characters-page-arabic' => 'Араб',
+	'wikieditor-toolbar-characters-page-arabicextended' => 'Кеңейтілген араб',
+	'wikieditor-toolbar-characters-page-persian' => 'Парсы',
 	'wikieditor-toolbar-section-help' => 'Анықтама',
 	'wikieditor-toolbar-help-heading-description' => 'Сипаттамасы',
+	'wikieditor-toolbar-help-heading-syntax' => 'Жазғаныңыз',
+	'wikieditor-toolbar-help-heading-result' => 'Алғаныңыз',
+	'wikieditor-toolbar-help-page-format' => 'Форматтау',
+	'wikieditor-toolbar-help-page-link' => 'Сілтемелер',
+	'wikieditor-toolbar-help-page-heading' => 'Бөлімдер',
+	'wikieditor-toolbar-help-page-list' => 'Тізімдер',
+	'wikieditor-toolbar-help-page-file' => 'Файлдар',
+	'wikieditor-toolbar-help-page-reference' => 'Дереккөздер',
+	'wikieditor-toolbar-help-page-discussion' => 'Талқылау',
 	'wikieditor-toolbar-help-content-italic-description' => 'Көлбеу жазу',
 	'wikieditor-toolbar-help-content-italic-syntax' => "''Көлбеу мәтін''",
 	'wikieditor-toolbar-help-content-italic-result' => '<em>Көлбеу мәтін</em>',
@@ -14712,7 +14870,11 @@ $1:Example.jpg|Сипаттамасы2',
 	'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Жуан көлбеу мәтін'''''",
 	'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Жуан көлбеу мәтін</em></strong>',
 	'wikieditor-toolbar-help-content-ilink-description' => 'Ішкі сілтеме',
+	'wikieditor-toolbar-help-content-ilink-syntax' => '[[Бет атауы|Сілтеме деңгейі]]<br />[[Бет атауы]]',
+	'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Сілтеме деңгейі</a><br /><a href='#'>Бет атауы</a>",
 	'wikieditor-toolbar-help-content-xlink-description' => 'Сыртқы сілтеме',
+	'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.мысал.org Сілтеме деңгейі]<br />[http://www.мысал.org]<br />http://www.мысал.org',
+	'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Сілтеме деңгейі</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.мысал.org</a>",
 	'wikieditor-toolbar-help-content-heading2-description' => '2-ші деңгейлі бөлім',
 	'wikieditor-toolbar-help-content-heading2-syntax' => '== Бөлім мәтіні ==',
 	'wikieditor-toolbar-help-content-heading2-result' => '<h2>Бөлім мәтіні</h2>',
@@ -14726,14 +14888,27 @@ $1:Example.jpg|Сипаттамасы2',
 	'wikieditor-toolbar-help-content-heading5-syntax' => '===== Бөлім мәтіні =====',
 	'wikieditor-toolbar-help-content-heading5-result' => '<h5>Бөлім мәтіні</h5>',
 	'wikieditor-toolbar-help-content-ulist-description' => 'Таңбаланған тізім',
+	'wikieditor-toolbar-help-content-ulist-syntax' => '* Элемент тізімі<br />* Элемент тізімі',
+	'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Элемент тізімі</li><li>Элемент тізімі</li></ul>',
 	'wikieditor-toolbar-help-content-olist-description' => 'Нөмірленген тізім',
+	'wikieditor-toolbar-help-content-olist-syntax' => '# Элемент тізімі<br /># Элемент тізімі',
+	'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Элемент тізімі</li><li>Элемент тізімі</li></ol>',
 	'wikieditor-toolbar-help-content-file-description' => 'Файл орнату',
 	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Файл тақырыбы]]',
 	'wikieditor-toolbar-help-content-reference-description' => 'Дереккөз',
+	'wikieditor-toolbar-help-content-reference-syntax' => 'Бет мәтіні.&lt;ref name="test"&gt;[http://www.мысал.org Сілтеме мәтіні], қосымша мәтін.&lt;/ref&gt;',
+	'wikieditor-toolbar-help-content-reference-result' => "Бет мәтіні.<sup><a href='#'>[1]</a></sup>",
+	'wikieditor-toolbar-help-content-rereference-description' => 'Кейбір дереккөздердің қосымша қолданылуы',
+	'wikieditor-toolbar-help-content-rereference-result' => "Бет мәтіні.<sup><a href='#'>[1]</a></sup>",
 	'wikieditor-toolbar-help-content-showreferences-description' => 'Дереккөзін көрсету',
+	'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.мысал.org' class='external text' href='#'>Сілтеме мәтіні</a>, қосымша мәтін.</li></ol>",
 	'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Қолтаңба және уақыт',
+	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Қатысушы есімі</a> (<a href='#' title='{{#special:mytalk}}'>талқылауы</a>) 15:54, 10 June 2009 (UTC)",
 	'wikieditor-toolbar-help-content-signature-description' => 'Қолтаңба',
+	'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Қатысушы есімі</a> (<a href='#' title='{{#special:mytalk}}'>талқ</a>)",
 	'wikieditor-toolbar-help-content-indent-description' => 'Шегініс',
+	'wikieditor-toolbar-help-content-indent-syntax' => 'Қалыпты мәтін<br />:Шегінген мәтін<br />::Шегінген мәтін',
+	'wikieditor-toolbar-help-content-indent-result' => 'Қалыпты мәтін<dl><dd>Шегінген мәтін<dl><dd>Шегінген мәтін</dd></dl></dd></dl>',
 );
 
 /** Khmer (ភាសាខ្មែរ)
@@ -14764,7 +14939,7 @@ $messages['km'] = array(
 	'wikieditor-toc-hide' => 'លាក់ខ្លឹមសារ',
 	'wikieditor-toolbar' => 'របារឧបករណ៍កែប្រែ',
 	'wikieditor-toolbar-preference' => 'ប្រើរបារឧបករណ៍កែប្រែទំនើប',
-	'wikieditor-toolbar-dialogs-preference' => 'ប្រើផ្ទាំងពិសេសសំរាប់បញ្ចូលតំណភ្ជាប់ តារាង ជាដើម',
+	'wikieditor-toolbar-dialogs-preference' => 'ប្រើផ្ទាំងពិសេសសំរាប់បញ្ចូលតំណភ្ជាប់ តារាង ជាដើម', # Fuzzy
 	'wikieditor-toolbar-loading' => 'កំពុងផ្ទុក…',
 	'wikieditor-toolbar-tool-bold' => 'អក្សរដិត',
 	'wikieditor-toolbar-tool-bold-example' => 'អត្ថបទជាអក្សរដិត',
@@ -15014,13 +15189,13 @@ $messages['ko'] = array(
 	'wikieditor-publish-button-publish' => '게시',
 	'wikieditor-publish-button-cancel' => '취소',
 	'wikieditor-publish-dialog-title' => '{{SITENAME}}에 게시',
-	'wikieditor-publish-dialog-summary' => '편집 요약 (무엇을 편집했는지 간략하게 설명합니다):',
+	'wikieditor-publish-dialog-summary' => '편집 요약 (바꾼 내용을 간략하게 설명하세요):',
 	'wikieditor-publish-dialog-minor' => '사소한 편집',
 	'wikieditor-publish-dialog-watch' => '이 문서 주시하기',
 	'wikieditor-publish-dialog-publish' => '게시',
 	'wikieditor-publish-dialog-goback' => '돌아가기',
 	'wikieditor-template-editor-preference' => '위키 틀의 양식 기반 편집을 활성화하기',
-	'wikieditor-template-editor-dialog-title' => '틀 편집하기',
+	'wikieditor-template-editor-dialog-title' => '틀 편집',
 	'wikieditor-template-editor-dialog-submit' => '업데이트',
 	'wikieditor-template-editor-dialog-cancel' => '취소',
 	'wikieditor-templates-preference' => '틀 접기 활성화하기',
@@ -15030,7 +15205,7 @@ $messages['ko'] = array(
 	'wikieditor-toolbar' => '편집 툴바',
 	'wikieditor-toolbar-desc' => '사용성이 향상된 편집 툴바',
 	'wikieditor-toolbar-preference' => '기능이 향상된 편집 툴바 사용하기',
-	'wikieditor-toolbar-dialogs-preference' => '링크와 표 등을 삽입할 때 대화 상자 사용하기',
+	'wikieditor-toolbar-dialogs-preference' => '링크와 표 넣기 뿐만 아니라 찾아 바꾸기 기능을 위한 마법사를 활성화',
 	'wikieditor-toolbar-hidesig' => '일반 문서 이름공간에서 서명 단추를 숨기기',
 	'wikieditor-toolbar-loading' => '불러오는 중...',
 	'wikieditor-toolbar-tool-bold' => '굵은 글씨',
@@ -15042,7 +15217,7 @@ $messages['ko'] = array(
 	'wikieditor-toolbar-tool-xlink' => '바깥 링크 (주소 앞에 http://가 있어야 합니다)',
 	'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com 링크 이름',
 	'wikieditor-toolbar-tool-link' => '링크',
-	'wikieditor-toolbar-tool-link-title' => '링크 추가',
+	'wikieditor-toolbar-tool-link-title' => '링크 넣기',
 	'wikieditor-toolbar-tool-link-int' => '위키 문서로 연결',
 	'wikieditor-toolbar-tool-link-int-target' => '대상 문서 또는 URL:',
 	'wikieditor-toolbar-tool-link-int-target-tooltip' => '문서 제목 또는 URL',
@@ -15051,13 +15226,14 @@ $messages['ko'] = array(
 	'wikieditor-toolbar-tool-link-ext' => '바깥 웹 페이지로 연결',
 	'wikieditor-toolbar-tool-link-ext-target' => '링크 URL:',
 	'wikieditor-toolbar-tool-link-ext-text' => '링크 텍스트:',
-	'wikieditor-toolbar-tool-link-insert' => '링크 추가하기',
+	'wikieditor-toolbar-tool-link-insert' => '링크 넣기',
 	'wikieditor-toolbar-tool-link-cancel' => '취소',
 	'wikieditor-toolbar-tool-link-int-target-status-exists' => '문서가 존재합니다.',
 	'wikieditor-toolbar-tool-link-int-target-status-notexists' => '문서가 존재하지 않습니다.',
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => '제목이 잘못되었습니다.',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => '바깥 링크',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => '문서가 존재하는 지 확인 중...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => '동음이의 문서',
 	'wikieditor-toolbar-tool-link-int-invalid' => '입력한 제목이 잘못되었습니다.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => '입력한 URL은 다른 내부 문서일 수 있습니다.
 안쪽 링크로 바꾸겠습니까?',
@@ -15066,7 +15242,7 @@ $messages['ko'] = array(
 	'wikieditor-toolbar-tool-link-empty' => '링크할 대상을 입력하지 않았습니다.',
 	'wikieditor-toolbar-tool-file' => '파일 넣기',
 	'wikieditor-toolbar-tool-file-example' => 'Example.jpg',
-	'wikieditor-toolbar-tool-file-title' => '파일 추가하기',
+	'wikieditor-toolbar-tool-file-title' => '파일 넣기',
 	'wikieditor-toolbar-file-target' => '파일 이름:',
 	'wikieditor-toolbar-file-caption' => '설명:',
 	'wikieditor-toolbar-file-size' => '크기:',
@@ -15074,16 +15250,16 @@ $messages['ko'] = array(
 	'wikieditor-toolbar-file-default' => '(기본값)',
 	'wikieditor-toolbar-file-format' => '형식:',
 	'wikieditor-toolbar-file-format-none' => '없음',
-	'wikieditor-toolbar-tool-file-insert' => '추가',
+	'wikieditor-toolbar-tool-file-insert' => '넣기',
 	'wikieditor-toolbar-tool-file-cancel' => '취소',
-	'wikieditor-toolbar-tool-reference' => '주석',
-	'wikieditor-toolbar-tool-reference-example' => '여기에 출처 내용을 적어 주세요',
+	'wikieditor-toolbar-tool-reference' => '출처',
+	'wikieditor-toolbar-tool-reference-example' => '여기에 주석 내용을 적어 주세요',
 	'wikieditor-toolbar-tool-reference-cancel' => '취소',
-	'wikieditor-toolbar-tool-reference-title' => '주석 추가',
-	'wikieditor-toolbar-tool-reference-insert' => '추가',
-	'wikieditor-toolbar-tool-reference-text' => '참조 텍스트',
+	'wikieditor-toolbar-tool-reference-title' => '출처 넣기',
+	'wikieditor-toolbar-tool-reference-insert' => '넣기',
+	'wikieditor-toolbar-tool-reference-text' => '출처 텍스트',
 	'wikieditor-toolbar-tool-signature' => '서명 및 시각',
-	'wikieditor-toolbar-section-advanced' => '고급 기능',
+	'wikieditor-toolbar-section-advanced' => '고급',
 	'wikieditor-toolbar-tool-heading' => '문단 제목',
 	'wikieditor-toolbar-tool-heading-1' => '1단계',
 	'wikieditor-toolbar-tool-heading-2' => '2단계',
@@ -15110,8 +15286,8 @@ $messages['ko'] = array(
 	'wikieditor-toolbar-tool-superscript-example' => '위 첨자',
 	'wikieditor-toolbar-tool-subscript' => '아래 첨자',
 	'wikieditor-toolbar-tool-subscript-example' => '아래 첨자',
-	'wikieditor-toolbar-group-insert' => '추가',
-	'wikieditor-toolbar-tool-gallery' => '화랑',
+	'wikieditor-toolbar-group-insert' => '넣기',
+	'wikieditor-toolbar-tool-gallery' => '사진 갤러리',
 	'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|설명1
 $1:Example.jpg|설명2',
 	'wikieditor-toolbar-tool-newline' => '새 줄',
@@ -15130,7 +15306,7 @@ $1:Example.jpg|설명2',
 | 2행 3열',
 	'wikieditor-toolbar-tool-table-example-cell-text' => '셀 내용',
 	'wikieditor-toolbar-tool-table-example-header' => '표 제목',
-	'wikieditor-toolbar-tool-table-title' => '표 추가하기',
+	'wikieditor-toolbar-tool-table-title' => '표 넣기',
 	'wikieditor-toolbar-tool-table-dimensions-rows' => '행',
 	'wikieditor-toolbar-tool-table-dimensions-columns' => '열',
 	'wikieditor-toolbar-tool-table-dimensions-header' => '표 제목란을 포함시키기',
@@ -15138,14 +15314,14 @@ $1:Example.jpg|설명2',
 	'wikieditor-toolbar-tool-table-sortable' => '표를 정렬 가능하게 만들기',
 	'wikieditor-toolbar-tool-table-example' => '셀 내용',
 	'wikieditor-toolbar-tool-table-preview' => '미리 보기',
-	'wikieditor-toolbar-tool-table-insert' => '추가',
+	'wikieditor-toolbar-tool-table-insert' => '넣기',
 	'wikieditor-toolbar-tool-table-cancel' => '취소',
-	'wikieditor-toolbar-tool-table-toomany' => '이 기능을 통해서는 1000개 이상의 셀을 가진 틀을 추가할 수 없습니다.',
-	'wikieditor-toolbar-tool-table-invalidnumber' => '행이나 열의 개수를 잘못 입력하였습니다.',
-	'wikieditor-toolbar-tool-table-zero' => '행이나 열의 개수가 0인 표를 추가할 수 없습니다.',
+	'wikieditor-toolbar-tool-table-toomany' => '이 기능을 통해서는 1000개 이상의 셀을 가진 틀을 넣을 수 없습니다.',
+	'wikieditor-toolbar-tool-table-invalidnumber' => '행이나 열의 개수를 잘못 입력했습니다.',
+	'wikieditor-toolbar-tool-table-zero' => '행이나 열의 개수가 0인 표를 넣을 수 없습니다.',
 	'wikieditor-toolbar-tool-replace' => '찾아 바꾸기',
 	'wikieditor-toolbar-tool-replace-title' => '찾아 바꾸기',
-	'wikieditor-toolbar-tool-replace-search' => '찾기:',
+	'wikieditor-toolbar-tool-replace-search' => '찾을 대상:',
 	'wikieditor-toolbar-tool-replace-replace' => '바꾸기:',
 	'wikieditor-toolbar-tool-replace-case' => '대소문자를 구별',
 	'wikieditor-toolbar-tool-replace-regex' => '찾을 문자열에 정규 표현식을 적용',
@@ -15189,7 +15365,7 @@ $1:Example.jpg|설명2',
 	'wikieditor-toolbar-help-page-heading' => '문단 제목',
 	'wikieditor-toolbar-help-page-list' => '목록',
 	'wikieditor-toolbar-help-page-file' => '파일',
-	'wikieditor-toolbar-help-page-reference' => '주석',
+	'wikieditor-toolbar-help-page-reference' => '출처',
 	'wikieditor-toolbar-help-page-discussion' => '토론',
 	'wikieditor-toolbar-help-content-italic-description' => '기울인 글씨',
 	'wikieditor-toolbar-help-content-italic-syntax' => "''기울인 글씨''",
@@ -15227,7 +15403,7 @@ $1:Example.jpg|설명2',
 	'wikieditor-toolbar-help-content-file-description' => '파일 넣기',
 	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|그림 설명]]',
 	'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Caption text' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='실제 크기로' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>그림 설명</div></div>",
-	'wikieditor-toolbar-help-content-reference-description' => '주석',
+	'wikieditor-toolbar-help-content-reference-description' => '출처',
 	'wikieditor-toolbar-help-content-reference-syntax' => '문서 내용.&lt;ref name="test"&gt;[http://www.example.org 링크 제목], 기타 설명.&lt;/ref&gt;',
 	'wikieditor-toolbar-help-content-reference-result' => "문서 내용.<sup><a href='#'>[1]</a></sup>",
 	'wikieditor-toolbar-help-content-rereference-description' => '기존에 붙인 출처 재사용하기',
@@ -15276,7 +15452,7 @@ $messages['krc'] = array(
 	'wikieditor-toolbar' => 'Тюзетиулени панели',
 	'wikieditor-toolbar-desc' => 'Хайырланыр мадары игиленнген тюрлендириу панель',
 	'wikieditor-toolbar-preference' => 'Игиленнген тюрлендириу панелни джандыр',
-	'wikieditor-toolbar-dialogs-preference' => 'Джибериулени, таблицаланы эмда андан башханы къошар ючюн диалогланы джандыр',
+	'wikieditor-toolbar-dialogs-preference' => 'Джибериулени, таблицаланы эмда андан башханы къошар ючюн диалогланы джандыр', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Джюклениу...',
 	'wikieditor-toolbar-tool-bold' => 'Къалын',
 	'wikieditor-toolbar-tool-bold-example' => 'Къалын джазыу',
@@ -15507,7 +15683,7 @@ $messages['ksh'] = array(
 	'wikieditor-toolbar' => 'Werkzüsh för et Ändere',
 	'wikieditor-toolbar-desc' => 'Verbesserte Werkzüsh för et Ändere',
 	'wikieditor-toolbar-preference' => 'Donn et ußföerlesh Werkzüsh för et Ändere aanzeije (bruch Java_Skripp)',
-	'wikieditor-toolbar-dialogs-preference' => 'Donn de Lengks aanzeije för Lengks, Tabälle, un mieh en Sigge em Wiki ennzefööje',
+	'wikieditor-toolbar-dialogs-preference' => 'Donn de Lengks aanzeije för Lengks, Tabälle, un mieh en Sigge em Wiki ennzefööje', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Donn dä Knopp för de „Ongerschreff“ nit aanzeije för nomaale Sigge vum Wiki singem Enhalld.',
 	'wikieditor-toolbar-loading' => 'Ben aam Laade{{int:ellipsis}}',
 	'wikieditor-toolbar-tool-bold' => 'Fätte Schreff',
@@ -15760,11 +15936,12 @@ $messages['ku-latn'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Rûpel tune',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Girêdanên derve',
 	'wikieditor-toolbar-tool-file-example' => 'Mînak.jpg',
-	'wikieditor-toolbar-tool-reference' => 'Referans',
+	'wikieditor-toolbar-tool-file-insert' => 'Tevlî bike',
+	'wikieditor-toolbar-tool-reference' => 'Çavkanî',
 	'wikieditor-toolbar-tool-reference-cancel' => 'Betal bike',
-	'wikieditor-toolbar-tool-reference-title' => 'Referans têxe',
-	'wikieditor-toolbar-tool-reference-insert' => 'Têxistin',
-	'wikieditor-toolbar-tool-reference-text' => 'Teksta referansê',
+	'wikieditor-toolbar-tool-reference-title' => 'Çavkaniyek têxe',
+	'wikieditor-toolbar-tool-reference-insert' => 'Tevlî bike',
+	'wikieditor-toolbar-tool-reference-text' => 'Nivîsa çavkaniyê',
 	'wikieditor-toolbar-tool-signature' => 'Destnîşan û demxeya demê',
 	'wikieditor-toolbar-section-advanced' => 'Pêşketî',
 	'wikieditor-toolbar-tool-heading' => 'Sernivîs',
@@ -15781,6 +15958,7 @@ $messages['ku-latn'] = array(
 	'wikieditor-toolbar-tool-big' => 'Mezin',
 	'wikieditor-toolbar-tool-big-example' => 'Nivîsa girdek',
 	'wikieditor-toolbar-tool-small' => 'Biçûk',
+	'wikieditor-toolbar-group-insert' => 'Tevlî bike',
 	'wikieditor-toolbar-tool-gallery' => 'Pêşangeha wêneyan',
 	'wikieditor-toolbar-tool-newline' => 'Rêzika nû',
 	'wikieditor-toolbar-tool-table' => 'Tablo',
@@ -15788,7 +15966,7 @@ $messages['ku-latn'] = array(
 	'wikieditor-toolbar-tool-table-dimensions-columns' => 'Sitûn',
 	'wikieditor-toolbar-tool-table-example' => 'Mînak',
 	'wikieditor-toolbar-tool-table-preview' => 'Pêşdîtin',
-	'wikieditor-toolbar-tool-table-insert' => 'Têxistin',
+	'wikieditor-toolbar-tool-table-insert' => 'Tevlî bike',
 	'wikieditor-toolbar-tool-table-cancel' => 'Betal bike',
 	'wikieditor-toolbar-tool-replace-close' => 'Girtin',
 	'wikieditor-toolbar-section-characters' => 'Karakterên taybet',
@@ -15819,14 +15997,15 @@ $messages['ku-latn'] = array(
 	'wikieditor-toolbar-help-page-reference' => 'Referans',
 	'wikieditor-toolbar-help-page-discussion' => 'Gotûbêj',
 	'wikieditor-toolbar-help-content-italic-description' => 'Xwahr',
-	'wikieditor-toolbar-help-content-italic-syntax' => "''Nivîşa îtalîk''",
+	'wikieditor-toolbar-help-content-italic-syntax' => "''Nivîsa xwahr''",
 	'wikieditor-toolbar-help-content-italic-result' => '<em>Nivîsa xwahr</em>',
 	'wikieditor-toolbar-help-content-bold-description' => 'Stûr',
 	'wikieditor-toolbar-help-content-bold-syntax' => "'''Nivîsa stûr'''",
 	'wikieditor-toolbar-help-content-bold-result' => '<strong>Nivîsa stûr</strong>',
 	'wikieditor-toolbar-help-content-bolditalic-description' => 'Stûr û xwahr',
-	'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Nivîsa qalind û îtalîk</em></strong>',
-	'wikieditor-toolbar-help-content-ilink-description' => 'Lînka hundirî',
+	'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Nivîsa stûr û xwahr'''''",
+	'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Nivîsa stûr û xwahr</em></strong>',
+	'wikieditor-toolbar-help-content-ilink-description' => 'Girêdana hundirî',
 	'wikieditor-toolbar-help-content-xlink-description' => 'Girêdana derve',
 	'wikieditor-toolbar-help-content-reference-description' => 'Referans',
 	'wikieditor-toolbar-help-content-signature-description' => 'Îmze',
@@ -15838,65 +16017,65 @@ $messages['ku-latn'] = array(
  * @author Nrowe
  */
 $messages['kw'] = array(
-	'wikieditor-wikitext-tab' => 'Wikitext',
-	'wikieditor-loading' => 'Ow carga...',
+	'wikieditor-wikitext-tab' => 'Wikitekst',
+	'wikieditor-loading' => 'Ow karga...',
 	'wikieditor-preview-tab' => 'Ragweles',
 	'wikieditor-preview-changes-tab' => 'Chanjyow',
-	'wikieditor-preview-loading' => 'Ow carga...',
+	'wikieditor-preview-loading' => 'Ow karga...',
 	'wikieditor-previewDialog-tab' => 'Ragwel',
-	'wikieditor-previewDialog-loading' => 'Ow carga...',
+	'wikieditor-previewDialog-loading' => 'Ow karga...',
 	'wikieditor-publish-button-publish' => 'Dyllo',
-	'wikieditor-publish-button-cancel' => 'Hedhy',
+	'wikieditor-publish-button-cancel' => 'Hedhi',
 	'wikieditor-publish-dialog-title' => 'Dyllo war {{SITENAME}}',
-	'wikieditor-publish-dialog-minor' => 'Chanj bian',
-	'wikieditor-publish-dialog-watch' => 'Golyas an folen-ma',
+	'wikieditor-publish-dialog-minor' => 'Chanj byhan',
+	'wikieditor-publish-dialog-watch' => 'Golya an folen-ma',
 	'wikieditor-publish-dialog-publish' => 'Dyllo',
-	'wikieditor-template-editor-dialog-submit' => 'Nowedhy',
-	'wikieditor-template-editor-dialog-cancel' => 'Hedhy',
+	'wikieditor-template-editor-dialog-submit' => 'Nowedhi',
+	'wikieditor-template-editor-dialog-cancel' => 'Hedhi',
 	'wikieditor-toolbar' => 'Toulvar chanjya',
-	'wikieditor-toolbar-desc' => 'Toulvar folen chanjya gans devnydh gwellhes',
-	'wikieditor-toolbar-preference' => 'Galosegy an toulvar chanjya gwellhes',
-	'wikieditor-toolbar-loading' => 'Ow carga...',
+	'wikieditor-toolbar-desc' => 'Toulvar folen janjya gans devnydh gwellhes',
+	'wikieditor-toolbar-preference' => 'Galosegi an toulvar chanjya gwellhes',
+	'wikieditor-toolbar-loading' => 'Ow karga...',
 	'wikieditor-toolbar-tool-bold' => 'Tew',
-	'wikieditor-toolbar-tool-bold-example' => 'Text tew',
+	'wikieditor-toolbar-tool-bold-example' => 'Tekst tew',
 	'wikieditor-toolbar-tool-italic' => 'Italek',
-	'wikieditor-toolbar-tool-italic-example' => 'Text italek',
+	'wikieditor-toolbar-tool-italic-example' => 'Tekst italek',
 	'wikieditor-toolbar-tool-ilink' => 'Kevren bervedhel',
 	'wikieditor-toolbar-tool-ilink-example' => 'Titel an gevren',
-	'wikieditor-toolbar-tool-xlink' => 'Kevren a-ves (na ankevowgh an rager http://)',
+	'wikieditor-toolbar-tool-xlink' => 'Kevren a-ves (na ankevewgh an rager http://)',
 	'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com titel an gevren',
 	'wikieditor-toolbar-tool-link' => 'Kevren',
 	'wikieditor-toolbar-tool-link-title' => 'Keworra kevren',
-	'wikieditor-toolbar-tool-link-int' => 'War-tu folen wiki',
+	'wikieditor-toolbar-tool-link-int' => 'War-tu ha folen wiki',
 	'wikieditor-toolbar-tool-link-int-target' => 'Folen po URL kosten:',
 	'wikieditor-toolbar-tool-link-int-target-tooltip' => 'Titel po URL an folen:',
-	'wikieditor-toolbar-tool-link-int-text' => 'Text rag disqwedhes:',
-	'wikieditor-toolbar-tool-link-int-text-tooltip' => 'Text dhe vos disqwedhys',
-	'wikieditor-toolbar-tool-link-ext' => 'War-tu folen wias a-ves',
+	'wikieditor-toolbar-tool-link-int-text' => 'An tekst rag diskwedhes:',
+	'wikieditor-toolbar-tool-link-int-text-tooltip' => 'An tekst rag diskwedhes',
+	'wikieditor-toolbar-tool-link-ext' => 'War-tu ha folen wias a-ves',
 	'wikieditor-toolbar-tool-link-ext-target' => 'URL an gevren:',
-	'wikieditor-toolbar-tool-link-ext-text' => 'Text an gevren:',
+	'wikieditor-toolbar-tool-link-ext-text' => 'Tekst an gevren:',
 	'wikieditor-toolbar-tool-link-insert' => 'Keworra kevren',
-	'wikieditor-toolbar-tool-link-cancel' => 'Hedhy',
+	'wikieditor-toolbar-tool-link-cancel' => 'Hedhi',
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Titel drog',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Kevren a-ves',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Drog yw an titel res genowgh.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Yth hevel bos an URL res genowgh ow kevrenna dhe folen wiki aral.
-Eus whans dhywgh y dreylya dhe gevren bervedhel?',
+Eus hwans dhywgh y dreylya dhe gevren bervedhel?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Kevren bervedhel',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Kevren a-ves',
-	'wikieditor-toolbar-tool-link-empty' => 'Ny wrussowgh why entra tra vedh dhe gevrenna dhodho.',
+	'wikieditor-toolbar-tool-link-empty' => 'Ny entersowgh tra vydh dhe gevrenna dhodho.',
 	'wikieditor-toolbar-tool-file' => 'Restren neythys',
 	'wikieditor-toolbar-tool-file-example' => 'Ensampel.jpg',
 	'wikieditor-toolbar-tool-file-title' => 'Keworra restren',
 	'wikieditor-toolbar-file-target' => 'Hanow an restren:',
-	'wikieditor-toolbar-file-size' => 'Mens:',
-	'wikieditor-toolbar-tool-file-cancel' => 'Hedhy',
+	'wikieditor-toolbar-file-size' => 'Myns:',
+	'wikieditor-toolbar-tool-file-cancel' => 'Hedhi',
 	'wikieditor-toolbar-tool-reference' => 'Devyn',
-	'wikieditor-toolbar-tool-reference-example' => 'Entrowgh text an drosnoten omma',
-	'wikieditor-toolbar-tool-reference-cancel' => 'Hedhy',
+	'wikieditor-toolbar-tool-reference-example' => 'Entrewgh tekst an drosnoten omma',
+	'wikieditor-toolbar-tool-reference-cancel' => 'Hedhi',
 	'wikieditor-toolbar-tool-reference-title' => 'Keworra devyn',
 	'wikieditor-toolbar-tool-reference-insert' => 'Keworra',
-	'wikieditor-toolbar-tool-reference-text' => 'Text an devyn',
+	'wikieditor-toolbar-tool-reference-text' => 'Tekst an devyn',
 	'wikieditor-toolbar-tool-signature' => 'Sinans ha dedhyans',
 	'wikieditor-toolbar-section-advanced' => 'Avonsys',
 	'wikieditor-toolbar-tool-heading' => 'Titel',
@@ -15905,31 +16084,31 @@ Eus whans dhywgh y dreylya dhe gevren bervedhel?',
 	'wikieditor-toolbar-tool-heading-3' => 'Nivel 3',
 	'wikieditor-toolbar-tool-heading-4' => 'Nivel 4',
 	'wikieditor-toolbar-tool-heading-5' => 'Nivel 5',
-	'wikieditor-toolbar-tool-heading-example' => 'Text an titel',
+	'wikieditor-toolbar-tool-heading-example' => 'Tekst an bennlinen',
 	'wikieditor-toolbar-group-format' => 'Furvyans',
 	'wikieditor-toolbar-tool-ulist' => 'Rol bulettys',
 	'wikieditor-toolbar-tool-ulist-example' => "Elven a'n rol bulettys",
 	'wikieditor-toolbar-tool-olist' => 'Rol niverys',
 	'wikieditor-toolbar-tool-olist-example' => "Elven a'n rol niverys",
-	'wikieditor-toolbar-tool-indent' => 'Crybans',
+	'wikieditor-toolbar-tool-indent' => 'Krybans',
 	'wikieditor-toolbar-tool-indent-example' => 'Linen grybys',
 	'wikieditor-toolbar-tool-nowiki' => 'Heb furvyans wiki',
-	'wikieditor-toolbar-tool-nowiki-example' => 'Keworrowgh text heb furvyans omma',
-	'wikieditor-toolbar-tool-redirect' => 'Daswedyans',
+	'wikieditor-toolbar-tool-nowiki-example' => 'Keworrewgh tekst heb furvyans omma',
+	'wikieditor-toolbar-tool-redirect' => 'Daskedyans',
 	'wikieditor-toolbar-tool-redirect-example' => 'Hanow an folen gosten',
 	'wikieditor-toolbar-tool-big' => 'Bras',
-	'wikieditor-toolbar-tool-big-example' => 'Text bras',
-	'wikieditor-toolbar-tool-small' => 'Bian',
-	'wikieditor-toolbar-tool-small-example' => 'Text bian',
-	'wikieditor-toolbar-tool-superscript' => 'Gorscrif',
-	'wikieditor-toolbar-tool-superscript-example' => 'Tekst gorscrif',
-	'wikieditor-toolbar-tool-subscript' => 'Isscrif',
-	'wikieditor-toolbar-tool-subscript-example' => 'Text isscrif',
+	'wikieditor-toolbar-tool-big-example' => 'Tekst bras',
+	'wikieditor-toolbar-tool-small' => 'Byhan',
+	'wikieditor-toolbar-tool-small-example' => 'Tekst byhan',
+	'wikieditor-toolbar-tool-superscript' => 'Gorskrif',
+	'wikieditor-toolbar-tool-superscript-example' => 'Tekst gorskrif',
+	'wikieditor-toolbar-tool-subscript' => 'Isskrif',
+	'wikieditor-toolbar-tool-subscript-example' => 'Tekst isskrif',
 	'wikieditor-toolbar-group-insert' => 'Keworra',
 	'wikieditor-toolbar-tool-gallery' => 'Mirva imajys',
-	'wikieditor-toolbar-tool-gallery-example' => '$1:Ensampel.jpg|Descrifans1
-$1:Ensampel.jpg|Descrifans2',
-	'wikieditor-toolbar-tool-newline' => 'Linen noweth',
+	'wikieditor-toolbar-tool-gallery-example' => '$1:Ensampel.jpg|Deskrifans1
+$1:Ensampel.jpg|Deskrifans2',
+	'wikieditor-toolbar-tool-newline' => 'Linen nowyth',
 	'wikieditor-toolbar-tool-table' => 'Tabel',
 	'wikieditor-toolbar-tool-table-example-old' => '-
 ! pennlinen 1
@@ -15943,35 +16122,35 @@ $1:Ensampel.jpg|Descrifans2',
 | rew 2, kellik 1
 | rew 2, kellik 2
 | rew 2, kellik 3',
-	'wikieditor-toolbar-tool-table-example-cell-text' => 'Text an kellik',
+	'wikieditor-toolbar-tool-table-example-cell-text' => 'Tekst an kellik',
 	'wikieditor-toolbar-tool-table-example-header' => 'Text an bennlinen',
-	'wikieditor-toolbar-tool-table-title' => 'Gorra tabel a-bervedh',
+	'wikieditor-toolbar-tool-table-title' => 'Keworra tabel',
 	'wikieditor-toolbar-tool-table-dimensions-rows' => 'Rewyow',
-	'wikieditor-toolbar-tool-table-dimensions-columns' => 'Colovennow',
+	'wikieditor-toolbar-tool-table-dimensions-columns' => 'Kolovennow',
 	'wikieditor-toolbar-tool-table-dimensions-header' => 'Keworra rew pennlinen',
 	'wikieditor-toolbar-tool-table-wikitable' => 'Keworra emlow',
-	'wikieditor-toolbar-tool-table-sortable' => 'Gwul sortyadow an tabel',
+	'wikieditor-toolbar-tool-table-sortable' => 'Gul sortyadow an tabel',
 	'wikieditor-toolbar-tool-table-example' => 'Ensampel',
 	'wikieditor-toolbar-tool-table-preview' => 'Ragwel',
 	'wikieditor-toolbar-tool-table-insert' => 'Keworra',
-	'wikieditor-toolbar-tool-table-cancel' => 'Hedhy',
-	'wikieditor-toolbar-tool-table-invalidnumber' => 'Nyns eus entrys genowgh niver da a rewyow po colovennow.',
-	'wikieditor-toolbar-tool-table-zero' => 'Ny yllowgh why gorra a-bervedh tabel heb rew po coloven.',
-	'wikieditor-toolbar-tool-replace' => 'Whilas ha kemeres le',
-	'wikieditor-toolbar-tool-replace-title' => 'Whilas ha kemeres le',
-	'wikieditor-toolbar-tool-replace-search' => 'Whilas:',
+	'wikieditor-toolbar-tool-table-cancel' => 'Hedhi',
+	'wikieditor-toolbar-tool-table-invalidnumber' => 'Ny entersowgh niver da a rewyow po kolovennow.',
+	'wikieditor-toolbar-tool-table-zero' => 'Ny yllowgh keworra tabel heb rew po koloven vyth.',
+	'wikieditor-toolbar-tool-replace' => 'Hwilas ha kemeres le',
+	'wikieditor-toolbar-tool-replace-title' => 'Hwilas ha kemeres le',
+	'wikieditor-toolbar-tool-replace-search' => 'Hwilas:',
 	'wikieditor-toolbar-tool-replace-replace' => 'Kemeres le gans:',
-	'wikieditor-toolbar-tool-replace-button-findnext' => 'Cavos an nessa',
+	'wikieditor-toolbar-tool-replace-button-findnext' => 'Kavos an nessa',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'Kemeres le pub tra',
 	'wikieditor-toolbar-tool-replace-close' => 'Degea',
-	'wikieditor-toolbar-tool-replace-nomatch' => 'Ny wrug agas whilans machya tra veth.',
-	'wikieditor-toolbar-tool-replace-emptysearch' => 'Ny wrussowgh why entra tra veth dhe whilas.',
+	'wikieditor-toolbar-tool-replace-nomatch' => 'Ny omdhesedhas agas hwilans orth tra vyth.',
+	'wikieditor-toolbar-tool-replace-emptysearch' => 'Ny entersowgh tra vyth dhe hwilas.',
 	'wikieditor-toolbar-section-characters' => 'Lytherennow arbennek',
 	'wikieditor-toolbar-characters-page-latin' => 'Latin',
 	'wikieditor-toolbar-characters-page-latinextended' => 'Latin ystynnys',
-	'wikieditor-toolbar-characters-page-ipa' => 'LFK (IPA)',
+	'wikieditor-toolbar-characters-page-ipa' => 'IPA',
 	'wikieditor-toolbar-characters-page-symbols' => 'Arwodhyow',
-	'wikieditor-toolbar-characters-page-greek' => 'Greca',
+	'wikieditor-toolbar-characters-page-greek' => 'Greka',
 	'wikieditor-toolbar-characters-page-arabic' => 'Arabek',
 	'wikieditor-toolbar-characters-page-arabicextended' => 'Arabek ystynnys',
 	'wikieditor-toolbar-characters-page-persian' => 'Persek',
@@ -15984,43 +16163,43 @@ $1:Ensampel.jpg|Descrifans2',
 	'wikieditor-toolbar-characters-page-lao' => 'Laosek',
 	'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
 	'wikieditor-toolbar-section-help' => 'Gweres',
-	'wikieditor-toolbar-help-heading-description' => 'Descrifans',
-	'wikieditor-toolbar-help-heading-syntax' => 'An peth yw scrifys',
+	'wikieditor-toolbar-help-heading-description' => 'Deskrifans',
+	'wikieditor-toolbar-help-heading-syntax' => 'An pyth a skrifowgh',
 	'wikieditor-toolbar-help-heading-result' => 'An sewyans',
 	'wikieditor-toolbar-help-page-format' => 'Furvyans',
 	'wikieditor-toolbar-help-page-link' => 'Kevrennow',
-	'wikieditor-toolbar-help-page-heading' => 'Titlys',
+	'wikieditor-toolbar-help-page-heading' => 'Pennlinennow',
 	'wikieditor-toolbar-help-page-list' => 'Rolyow',
 	'wikieditor-toolbar-help-page-file' => 'Restrennow',
 	'wikieditor-toolbar-help-page-reference' => 'Devynnow',
-	'wikieditor-toolbar-help-page-discussion' => 'Kescows',
+	'wikieditor-toolbar-help-page-discussion' => 'Keskows',
 	'wikieditor-toolbar-help-content-italic-description' => 'Italek',
-	'wikieditor-toolbar-help-content-italic-syntax' => "''Text italek''",
-	'wikieditor-toolbar-help-content-italic-result' => '<em>Text italek</em>',
+	'wikieditor-toolbar-help-content-italic-syntax' => "''Tekst italek''",
+	'wikieditor-toolbar-help-content-italic-result' => '<em>Tekst italek</em>',
 	'wikieditor-toolbar-help-content-bold-description' => 'Tew',
-	'wikieditor-toolbar-help-content-bold-syntax' => "'''Text tew'''",
-	'wikieditor-toolbar-help-content-bold-result' => '<strong>Text tew</strong>',
+	'wikieditor-toolbar-help-content-bold-syntax' => "'''Tekst tew'''",
+	'wikieditor-toolbar-help-content-bold-result' => '<strong>Tekst tew</strong>',
 	'wikieditor-toolbar-help-content-bolditalic-description' => 'Tew &amp; italek',
-	'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Text tew &amp; italek'''''",
-	'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Text tew &amp; italek</em></strong>',
+	'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Tekst tew &amp; italek'''''",
+	'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Tekst tew &amp; italek</em></strong>',
 	'wikieditor-toolbar-help-content-ilink-description' => 'Kevren bervedhel',
-	'wikieditor-toolbar-help-content-ilink-syntax' => '[[Titel an folen|Text an gevren]]<br />[[Titel an folen]]',
-	'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Text an gevren</a><br /><a href='#'>Titel an folen</a>",
+	'wikieditor-toolbar-help-content-ilink-syntax' => '[[Titel an folen|Tekst an gevren]]<br />[[Titel an folen]]',
+	'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Tekst an gevren</a><br /><a href='#'>Titel an folen</a>",
 	'wikieditor-toolbar-help-content-xlink-description' => 'Kevren bervedhel',
-	'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.ensampel.org Text an gevren]<br />[http://www.ensampel.org]<br />http://www.ensampel.org',
-	'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Text an gevren</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.ensampel.org</a>",
-	'wikieditor-toolbar-help-content-heading2-description' => 'Titel nivel 2',
-	'wikieditor-toolbar-help-content-heading2-syntax' => '== Text an titel ==',
-	'wikieditor-toolbar-help-content-heading2-result' => '<h2>Text an titel</h2>',
-	'wikieditor-toolbar-help-content-heading3-description' => 'Titel nivel 3',
-	'wikieditor-toolbar-help-content-heading3-syntax' => '=== Text an titel ===',
-	'wikieditor-toolbar-help-content-heading3-result' => '<h3>Text an titel</h3>',
-	'wikieditor-toolbar-help-content-heading4-description' => 'Titel nivel 4',
-	'wikieditor-toolbar-help-content-heading4-syntax' => '==== Text an titel ====',
-	'wikieditor-toolbar-help-content-heading4-result' => '<h4>Text an titel</h4>',
-	'wikieditor-toolbar-help-content-heading5-description' => 'Titel nivel 5',
-	'wikieditor-toolbar-help-content-heading5-syntax' => '===== Text an titel =====',
-	'wikieditor-toolbar-help-content-heading5-result' => '<h5>Text an titel</h5>',
+	'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.ensampel.org Tekst an gevren]<br />[http://www.ensampel.org]<br />http://www.ensampel.org',
+	'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Tekst an gevren</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.ensampel.org</a>",
+	'wikieditor-toolbar-help-content-heading2-description' => 'Pennlinen nivel 2',
+	'wikieditor-toolbar-help-content-heading2-syntax' => '== Tekst an bennlinen ==',
+	'wikieditor-toolbar-help-content-heading2-result' => '<h2>Tekst an bennlinen</h2>',
+	'wikieditor-toolbar-help-content-heading3-description' => 'Pennlinen nivel 3',
+	'wikieditor-toolbar-help-content-heading3-syntax' => '=== Tekst an bennlinen ===',
+	'wikieditor-toolbar-help-content-heading3-result' => '<h3>Tekst an bennlinen</h3>',
+	'wikieditor-toolbar-help-content-heading4-description' => 'Pennlinen nivel 4',
+	'wikieditor-toolbar-help-content-heading4-syntax' => '==== Tekst an bennlinen ====',
+	'wikieditor-toolbar-help-content-heading4-result' => '<h4>Tekst an bennlinen</h4>',
+	'wikieditor-toolbar-help-content-heading5-description' => 'Pennlinen nivel 5',
+	'wikieditor-toolbar-help-content-heading5-syntax' => '===== Tekst an bennlinen =====',
+	'wikieditor-toolbar-help-content-heading5-result' => '<h5>Tekst an bennlinen</h5>',
 	'wikieditor-toolbar-help-content-ulist-description' => 'Rol bulettys',
 	'wikieditor-toolbar-help-content-ulist-syntax' => "* Elven a'n rol<br />* Elven a'n rol",
 	'wikieditor-toolbar-help-content-ulist-result' => "<ul><li>Elven a'n rol</li><li>Elven a'n rol</li></ul>",
@@ -16028,28 +16207,56 @@ $1:Ensampel.jpg|Descrifans2',
 	'wikieditor-toolbar-help-content-olist-syntax' => "# Elven a'n rol<br /># Elven a'n rol",
 	'wikieditor-toolbar-help-content-olist-result' => "<ol><li>Elven a'n rol</li><li>Elven a'n rol</li></ol>",
 	'wikieditor-toolbar-help-content-file-description' => 'Restren neythys',
-	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Ensampel.png|thumb|Text an descrifans]]',
-	'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Text an descrifans' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Brashe' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Text an descrifans</div></div>",
+	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Ensampel.png|thumb|Tekst an deskrifans]]',
+	'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Tekst an deskrifans' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Brashe' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Tekst an deskrifans</div></div>",
 	'wikieditor-toolbar-help-content-reference-description' => 'Devyn',
-	'wikieditor-toolbar-help-content-reference-syntax' => 'Text an folen.&lt;ref name="test"&gt;[http://www.ensampel.org Text an gevren], text keworansel.&lt;/ref&gt;',
-	'wikieditor-toolbar-help-content-reference-result' => "Text an folen.<sup><a href='#'>[1]</a></sup>",
+	'wikieditor-toolbar-help-content-reference-syntax' => 'Tekst an folen.&lt;ref name="test"&gt;[http://www.ensampel.org Tekst an gevren], tekst keworansel.&lt;/ref&gt;',
+	'wikieditor-toolbar-help-content-reference-result' => "Tekst an folen.<sup><a href='#'>[1]</a></sup>",
 	'wikieditor-toolbar-help-content-rereference-description' => "Devnydh keworansel a'n keth devyn",
-	'wikieditor-toolbar-help-content-rereference-result' => "Text an folen.<sup><a href='#'>[1]</a></sup>",
-	'wikieditor-toolbar-help-content-showreferences-description' => 'Disqwedhes devynnow',
-	'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.ensampel.org' class='external text' href='#'>Text an gevren</a>, text keworansel.</li></ol>",
+	'wikieditor-toolbar-help-content-rereference-result' => "Tekst an folen.<sup><a href='#'>[1]</a></sup>",
+	'wikieditor-toolbar-help-content-showreferences-description' => 'Diskwedhes devynnow',
+	'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.ensampel.org' class='external text' href='#'>Tekst an gevren</a>, tekst keworansel.</li></ol>",
 	'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Sinans gans an dedhyans',
-	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Hanow usyer</a> (<a href='#' title='{{#special:mytalk}}'>kescows</a>) 15:54, 10 Metheven 2009 (UTC)",
+	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Hanow usyer</a> (<a href='#' title='{{#special:mytalk}}'>keskows</a>) 15:54, 10 Metheven 2009 (UTC)",
 	'wikieditor-toolbar-help-content-signature-description' => 'Sinans',
-	'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Hanow usyer</a> (<a href='#' title='{{#special:mytalk}}'>kescows</a>)",
-	'wikieditor-toolbar-help-content-indent-description' => 'Cryba',
-	'wikieditor-toolbar-help-content-indent-syntax' => 'Text usadow<br />:Text crybys<br />::Text crybys',
-	'wikieditor-toolbar-help-content-indent-result' => 'Text usadow<dl><dd>Text crybys<dl><dd>Text crybys</dd></dl></dd></dl>',
+	'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Hanow devnydhyer</a> (<a href='#' title='{{#special:mytalk}}'>keskows</a>)",
+	'wikieditor-toolbar-help-content-indent-description' => 'Kryba',
+	'wikieditor-toolbar-help-content-indent-syntax' => 'Tekst usadow<br />:Tekst krybys<br />::Tekst krybys',
+	'wikieditor-toolbar-help-content-indent-result' => 'Tekst usadow<dl><dd>Tekst krybys<dl><dd>Tekst krybys</dd></dl></dd></dl>',
 );
 
-/** Kirghiz (Кыргызча)
+/** Kyrgyz (Кыргызча)
  * @author Chorobek
+ * @author Викиней
  */
 $messages['ky'] = array(
+	'wikieditor-loading' => 'Жүктөлүүдө...',
+	'wikieditor-preview-changes-tab' => 'Өзгөртүүлөр',
+	'wikieditor-preview-loading' => 'Жүктөлүүдө...',
+	'wikieditor-previewDialog-loading' => 'Жүктөлүүдө...',
+	'wikieditor-publish-button-cancel' => 'Жокко чыгаруу',
+	'wikieditor-publish-dialog-goback' => 'Артка',
+	'wikieditor-template-editor-dialog-cancel' => 'Жокко чыгаруу',
+	'wikieditor-toolbar-loading' => 'Жүктөлүүдө...',
+	'wikieditor-toolbar-tool-bold' => 'Калың',
+	'wikieditor-toolbar-tool-bold-example' => 'Калың текст',
+	'wikieditor-toolbar-tool-italic' => 'Жантык',
+	'wikieditor-toolbar-tool-italic-example' => 'жантык текст',
+	'wikieditor-toolbar-tool-ilink-example' => 'Шилтеменин аты',
+	'wikieditor-toolbar-tool-link' => 'Шилтеме',
+	'wikieditor-toolbar-tool-link-title' => 'Шилтеме коюу',
+	'wikieditor-toolbar-tool-link-ext-target' => 'URL шилтемеси:',
+	'wikieditor-toolbar-tool-link-ext-text' => 'Шилтеменин тексти:',
+	'wikieditor-toolbar-tool-link-insert' => 'Шилтеме коюу',
+	'wikieditor-toolbar-tool-link-cancel' => 'Жокко чыгаруу',
+	'wikieditor-toolbar-file-target' => 'Файл аты:',
+	'wikieditor-toolbar-file-size' => 'Өлчөм:',
+	'wikieditor-toolbar-file-float' => 'Тегиздөө:',
+	'wikieditor-toolbar-file-format-none' => 'жок',
+	'wikieditor-toolbar-tool-file-insert' => 'Киргизүү',
+	'wikieditor-toolbar-tool-file-cancel' => 'Жокко чыгаруу',
+	'wikieditor-toolbar-tool-reference-cancel' => 'Жокко чыгаруу',
+	'wikieditor-toolbar-tool-reference-insert' => 'Киргизүү',
 	'wikieditor-toolbar-section-advanced' => 'Кеңейтилген',
 	'wikieditor-toolbar-tool-heading' => 'Баш сөз',
 	'wikieditor-toolbar-tool-heading-1' => '1 Деңгээл',
@@ -16107,7 +16314,7 @@ $1:Example.jpg|Баяндама2',
 	'wikieditor-toolbar-tool-table-preview' => 'Алдын ала көргөз',
 	'wikieditor-toolbar-tool-table-insert' => 'Киргиз',
 	'wikieditor-toolbar-tool-table-cancel' => 'Жокко чыгар',
-	'wikieditor-toolbar-tool-table-toomany' => 'Бул баарлашууда $1 ашык көзөнөгү бар жадыбал койгонго мүмкүн эмес.', # Fuzzy
+	'wikieditor-toolbar-tool-table-toomany' => 'Бул баарлашууда 1000ден ашык көзөнөгү бар жадыбал коюууга мүмкүн эмес.',
 	'wikieditor-toolbar-tool-table-invalidnumber' => 'Сиз саптардын же тилкелердин туура эмес санын көргөздүңүз',
 	'wikieditor-toolbar-tool-table-zero' => 'Сиз бир дагы сабы же тилкеси жок жадыбал киргизе албайсыз',
 	'wikieditor-toolbar-tool-replace' => 'Таап алмаштыр',
@@ -16121,7 +16328,7 @@ $1:Example.jpg|Баяндама2',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'Баарын алмаштыр',
 	'wikieditor-toolbar-tool-replace-close' => 'Жап',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'Сиздин талап боюнча эчтеке табылган жок',
-	'wikieditor-toolbar-tool-replace-success' => '$1 алмаштыруу болду.', # Fuzzy
+	'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|өзгөртүү|өзгөртүүлөр}} аткарылды.',
 	'wikieditor-toolbar-tool-replace-emptysearch' => 'Сиз издегенге эч нерсе көргөзгөн жоксуз.',
 	'wikieditor-toolbar-tool-replace-invalidregex' => 'Сиз киргизген регулярдуу айтылыш туура эмес: $1',
 	'wikieditor-toolbar-section-characters' => 'Атайын белгилер',
@@ -16208,6 +16415,7 @@ $1:Example.jpg|Баяндама2',
 );
 
 /** Latin (Latina)
+ * @author Autokrator
  * @author OrbiliusMagister
  * @author UV
  */
@@ -16240,6 +16448,7 @@ $messages['la'] = array(
 	'wikieditor-toolbar-tool-reference' => 'Referentia bibliographica',
 	'wikieditor-toolbar-tool-reference-title' => 'Referentiam bibliographicam addere',
 	'wikieditor-toolbar-tool-signature' => 'Subscriptio tua cum indicatione temporis',
+	'wikieditor-toolbar-section-advanced' => 'Plura',
 	'wikieditor-toolbar-tool-heading-1' => 'Planities 1',
 	'wikieditor-toolbar-tool-big' => 'Magna',
 	'wikieditor-toolbar-tool-big-example' => 'Textus magnus',
@@ -16267,8 +16476,12 @@ $1:Exemplum.jpg|Descriptio 2',
 	'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
 	'wikieditor-toolbar-section-help' => 'Adiutatum',
 	'wikieditor-toolbar-help-heading-description' => 'Descriptio',
+	'wikieditor-toolbar-help-heading-syntax' => 'Quod scribis',
+	'wikieditor-toolbar-help-heading-result' => 'Quod accipies',
 	'wikieditor-toolbar-help-page-format' => 'Formatio',
 	'wikieditor-toolbar-help-page-link' => 'Nexus',
+	'wikieditor-toolbar-help-page-heading' => 'Tituli',
+	'wikieditor-toolbar-help-page-list' => 'Indices',
 	'wikieditor-toolbar-help-page-file' => 'Fasciculi',
 	'wikieditor-toolbar-help-page-reference' => 'Referentiae bibliographicae',
 	'wikieditor-toolbar-help-page-discussion' => 'Disputatio',
@@ -16287,11 +16500,31 @@ $1:Exemplum.jpg|Descriptio 2',
 	'wikieditor-toolbar-help-content-xlink-description' => 'Nexus externus',
 	'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Titulus nexus]<br />[http://www.example.org]<br />http://www.example.org',
 	'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='external'>Titulus nexus</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='external'>http://www.example.org</a>",
+	'wikieditor-toolbar-help-content-heading2-description' => 'Secundi ordinis titulus',
+	'wikieditor-toolbar-help-content-heading2-syntax' => '== Textus tituli ==',
+	'wikieditor-toolbar-help-content-heading2-result' => '<h2>Textus tituli</h2>',
+	'wikieditor-toolbar-help-content-heading3-description' => 'Tertii ordinis titulus',
+	'wikieditor-toolbar-help-content-heading3-syntax' => '=== Textus tituli ===',
+	'wikieditor-toolbar-help-content-heading3-result' => '<h3>Textus tituli</h3>',
+	'wikieditor-toolbar-help-content-heading4-description' => 'Quarti ordinis titulus',
+	'wikieditor-toolbar-help-content-heading4-syntax' => '==== Textus tituli ====',
+	'wikieditor-toolbar-help-content-heading4-result' => '<h4>Textus tituli</h4>',
+	'wikieditor-toolbar-help-content-heading5-description' => 'Quinti ordinis titulus',
+	'wikieditor-toolbar-help-content-heading5-syntax' => '===== Textus tituli =====',
+	'wikieditor-toolbar-help-content-heading5-result' => '<h5>Textus tituli</h5>',
+	'wikieditor-toolbar-help-content-ulist-description' => 'Index globosus',
+	'wikieditor-toolbar-help-content-ulist-syntax' => '* Res indicata<br />* Res indicata',
+	'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>Res indicata</li><li>Res indicata</li></ul>',
 	'wikieditor-toolbar-help-content-file-description' => 'Fasciculus in pagina impositus',
 	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Exemplum.png|thumb|Descriptio fasciculi]]', # Fuzzy
 	'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Descriptio fasciculi' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Augere' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Descriptio fasciculi</div></div>",
 	'wikieditor-toolbar-help-content-reference-description' => 'Referentia bibliographica',
+	'wikieditor-toolbar-help-content-reference-syntax' => 'Textus paginae.&lt;ref name="test"&gt;[http://www.example.org Textus nexus], textus additus.&lt;/ref&gt;',
+	'wikieditor-toolbar-help-content-reference-result' => "Textus paginae.<sup><a href='#'>[1]</a></sup>",
+	'wikieditor-toolbar-help-content-rereference-description' => 'Eiusdem referentiae usus additus',
+	'wikieditor-toolbar-help-content-rereference-result' => "Textus paginae.<sup><a href='#'>[1]</a></sup>",
 	'wikieditor-toolbar-help-content-showreferences-description' => 'Referentias bibliographicas monstrare',
+	'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Textus nexus</a>, textus additus.</li></ol>",
 	'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Subscriptio tua cum indicatione temporis',
 	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Nomen usoris</a> (<a href='#' title='{{#special:mytalk}}'>disputatio</a>) 15:54, 10 Iunii 2009 (UTC)",
 	'wikieditor-toolbar-help-content-signature-description' => 'Subscriptio',
@@ -16300,10 +16533,11 @@ $1:Exemplum.jpg|Descriptio 2',
 
 /** Luxembourgish (Lëtzebuergesch)
  * @author Robby
+ * @author Soued031
  */
 $messages['lb'] = array(
 	'wikieditor' => "Erweiderten Interface fir d'Änner vu Wikitext",
-	'wikieditor-desc' => "Liwwert en erweiderbaren Interface fir d'Ännere vu Wikitext a vill Module mat Fonctiounen",
+	'wikieditor-desc' => "Liwwert en erweiderbaren Interface fir d'Ännere vu Wikitext a vill Module mat Funktiounen",
 	'wikieditor-wikitext-tab' => 'WikiText',
 	'wikieditor-loading' => 'Lueden',
 	'wikieditor-preview-preference' => 'side-by-side kucken ouni ze späicheren aschalten',
@@ -16333,7 +16567,7 @@ $messages['lb'] = array(
 	'wikieditor-toolbar' => 'Toolbar änneren',
 	'wikieditor-toolbar-desc' => 'Toolbar vun de Säitenännerunge mat erweiderter Benotzerfrëndlechkeet',
 	'wikieditor-toolbar-preference' => 'Déi erweidert Ännerungs-Toolbar aktivéieren',
-	'wikieditor-toolbar-dialogs-preference' => "Dialoge fir d'Drasetze vu Linken, Tabellen a méi aschalten",
+	'wikieditor-toolbar-dialogs-preference' => "Assistente fir d'Drasetze vu Linken, Tabellen genee sou wéi d'Funktioun 'sichen an ersetzen' aschalten",
 	'wikieditor-toolbar-hidesig' => 'Den Ënnerschrëftsknäppchen op Säiten am Haaptnummraum verstoppen',
 	'wikieditor-toolbar-loading' => 'Lueden...',
 	'wikieditor-toolbar-tool-bold' => 'Fettgedréckt',
@@ -16361,6 +16595,7 @@ $messages['lb'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Net valabelen Titel',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Externe Link',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => "Et gëtt nogekuckt ob et d'Säit gëtt...",
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Homonymie-Säit',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Den Titel deen Dir uginn hutt ass net valabel.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Déi URL déi dir uginn hutt gesäit aus wéi e Link op eng aner Wikisäit. Wëllt dir doraus en interne Link maachen?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Interne Link',
@@ -16370,6 +16605,7 @@ $messages['lb'] = array(
 	'wikieditor-toolbar-tool-file-example' => 'Beispill.jpg',
 	'wikieditor-toolbar-tool-file-title' => 'Fichier drasetzen',
 	'wikieditor-toolbar-file-target' => 'Numm vum Fichier:',
+	'wikieditor-toolbar-file-caption' => 'Beschreiwung:',
 	'wikieditor-toolbar-file-size' => 'Gréisst:',
 	'wikieditor-toolbar-file-float' => 'Ausriichtung:',
 	'wikieditor-toolbar-file-default' => '(Standard)',
@@ -16597,7 +16833,7 @@ $messages['li'] = array(
 	'wikieditor-toolbar' => 'Bewèrkingswèrkbalk',
 	'wikieditor-toolbar-desc' => 'Nuje bewèrkingsbalk',
 	'wikieditor-toolbar-preference' => 'Gebroek de nuje bewèrkingsbalk',
-	'wikieditor-toolbar-dialogs-preference' => 'Zèt inveurvensters aan',
+	'wikieditor-toolbar-dialogs-preference' => 'Zèt inveurvensters aan', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Verberg de knoep veur óngerteikene in dees naamruumde',
 	'wikieditor-toolbar-loading' => 'Laje…',
 	'wikieditor-toolbar-tool-bold' => 'Vèt',
@@ -16797,6 +17033,83 @@ $1:Veurbeildj2|Biesjrif2',
 	'wikieditor-toolbar-help-content-indent-result' => 'Normaal teks<dl><dd>Ingesprónge teks<dl><dd>Ingesprónge teks</dd></dl></dd></dl>',
 );
 
+/** لوری (لوری)
+ * @author Mogoeilor
+ */
+$messages['lrc'] = array(
+	'wikieditor' => 'كاروری پيشرفته ويراشتگر ويكی متن',
+	'wikieditor-wikitext-tab' => 'ويكی متن',
+	'wikieditor-loading' => 'د حالت سوار كرد',
+	'wikieditor-preview-tab' => 'پيش زمينه',
+	'wikieditor-preview-changes-tab' => 'آلشتيا',
+	'wikieditor-preview-loading' => 'د حالت سوار كرد',
+	'wikieditor-previewDialog-tab' => 'پيش زمينه',
+	'wikieditor-previewDialog-loading' => 'د حالت سوار كرد',
+	'wikieditor-publish-preference' => 'توانايی پا وه پا سی انتشار',
+	'wikieditor-publish-button-publish' => 'منتشر كردن',
+	'wikieditor-publish-button-cancel' => 'رد كردن',
+	'wikieditor-publish-dialog-title' => 'انتشار سی{{نوم مالگه}}',
+	'wikieditor-publish-dialog-minor' => 'ويرايشت كؤچك',
+	'wikieditor-publish-dialog-watch' => 'ديئن ای بلگه',
+	'wikieditor-publish-dialog-publish' => 'منتشر كردن',
+	'wikieditor-publish-dialog-goback' => 'ورئرد',
+	'wikieditor-template-editor-dialog-title' => 'قالو ويرايشت',
+	'wikieditor-template-editor-dialog-submit' => 'روزآمد كردن',
+	'wikieditor-template-editor-dialog-cancel' => 'رد كردن',
+	'wikieditor-toc-show' => 'نشون ديئن محتوايا',
+	'wikieditor-toc-hide' => 'قام كردن محتوايا',
+	'wikieditor-toolbar' => 'اوزارگه ويرايشت',
+	'wikieditor-toolbar-loading' => 'د حالت سوار كرد',
+	'wikieditor-toolbar-tool-bold' => 'توپر',
+	'wikieditor-toolbar-tool-bold-example' => 'متن توپر بيه',
+	'wikieditor-toolbar-tool-italic' => 'كج كوله',
+	'wikieditor-toolbar-tool-italic-example' => 'نوشته كج كوله',
+	'wikieditor-toolbar-tool-ilink' => 'لینک مئن ون',
+	'wikieditor-toolbar-tool-ilink-example' => 'عنوان لينك',
+	'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com نوم ديس ون',
+	'wikieditor-toolbar-tool-link' => 'ديس ون',
+	'wikieditor-toolbar-tool-link-int' => 'سی ويكی بلگه',
+	'wikieditor-toolbar-tool-link-cancel' => 'رد كردن',
+	'wikieditor-toolbar-file-size' => 'انازه',
+	'wikieditor-toolbar-file-float' => 'د راست چيين',
+	'wikieditor-toolbar-file-default' => 'پيش فرض',
+	'wikieditor-toolbar-file-format' => 'قالو',
+	'wikieditor-toolbar-file-format-none' => 'هيش كوم',
+	'wikieditor-toolbar-tool-file-insert' => 'دائن',
+	'wikieditor-toolbar-tool-file-cancel' => 'رد كردن',
+	'wikieditor-toolbar-tool-reference' => 'سرچشمه',
+	'wikieditor-toolbar-tool-reference-cancel' => 'رد كردن',
+	'wikieditor-toolbar-tool-reference-title' => 'دائن سرچشمه',
+	'wikieditor-toolbar-tool-reference-insert' => 'دائن',
+	'wikieditor-toolbar-section-advanced' => 'پيشرفته',
+	'wikieditor-toolbar-tool-heading' => 'سربلگه',
+	'wikieditor-toolbar-tool-small' => 'كؤچك',
+	'wikieditor-toolbar-tool-small-example' => 'متن كؤچك',
+	'wikieditor-toolbar-group-insert' => 'دائن',
+	'wikieditor-toolbar-tool-newline' => 'خط تازه',
+	'wikieditor-toolbar-tool-table' => 'جعوه',
+	'wikieditor-toolbar-tool-replace-close' => 'بسن',
+	'wikieditor-toolbar-characters-page-latin' => 'لاتين',
+	'wikieditor-toolbar-characters-page-symbols' => 'نماديا',
+	'wikieditor-toolbar-characters-page-greek' => 'هلنی',
+	'wikieditor-toolbar-characters-page-cyrillic' => 'سريليك',
+	'wikieditor-toolbar-characters-page-arabic' => 'عروی',
+	'wikieditor-toolbar-characters-page-persian' => 'فارسی',
+	'wikieditor-toolbar-characters-page-hebrew' => 'عبری',
+	'wikieditor-toolbar-characters-page-bangla' => 'بانگلا',
+	'wikieditor-toolbar-characters-page-tamil' => 'تاميل',
+	'wikieditor-toolbar-characters-page-telugu' => 'تلوگو',
+	'wikieditor-toolbar-characters-page-sinhala' => 'سين هالا',
+	'wikieditor-toolbar-characters-page-gujarati' => 'گجرات',
+	'wikieditor-toolbar-characters-page-devanagari' => 'دوانگاری',
+	'wikieditor-toolbar-characters-page-thai' => 'تايی',
+	'wikieditor-toolbar-characters-page-lao' => 'لائو',
+	'wikieditor-toolbar-characters-page-khmer' => 'خمر',
+	'wikieditor-toolbar-section-help' => 'هومياری',
+	'wikieditor-toolbar-help-page-discussion' => 'گپ',
+	'wikieditor-toolbar-help-content-indent-description' => 'مئن رئته',
+);
+
 /** Lithuanian (lietuvių)
  * @author Eitvys200
  * @author Garas
@@ -16836,7 +17149,7 @@ $messages['lt'] = array(
 	'wikieditor-toolbar' => 'Redagavimo įrankių juosta',
 	'wikieditor-toolbar-desc' => 'Redaguoti įrankių juostą, siekiant didesnio praktiškumo',
 	'wikieditor-toolbar-preference' => 'Įjungti naudingesnę įrankių juostą',
-	'wikieditor-toolbar-dialogs-preference' => 'Įjungti dialogus įterpti nuorodas, lenteles ir daugiau',
+	'wikieditor-toolbar-dialogs-preference' => 'Įjungti dialogus įterpti nuorodas, lenteles ir daugiau', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Kraunama...',
 	'wikieditor-toolbar-tool-bold' => 'Paryškinti',
 	'wikieditor-toolbar-tool-bold-example' => 'Paryškinti tekstą',
@@ -17272,7 +17585,7 @@ $messages['lv'] = array(
 	'wikieditor-toolbar' => 'Rediģēšanas rīku josla',
 	'wikieditor-toolbar-desc' => 'Rediģēšanas rīku josla ar uzlabotu lietojamību',
 	'wikieditor-toolbar-preference' => 'Izmantot paplašināto rediģēšanas rīkjoslu',
-	'wikieditor-toolbar-dialogs-preference' => 'Izmantot dialoga logus saišu, tabulu u.c. ievietošanai',
+	'wikieditor-toolbar-dialogs-preference' => 'Izmantot dialoga logus saišu, tabulu u.c. ievietošanai', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Ielādē…',
 	'wikieditor-toolbar-tool-bold' => 'Pustrekns',
 	'wikieditor-toolbar-tool-bold-example' => 'Pustrekns teksts',
@@ -17472,6 +17785,13 @@ $1:Example.jpg|Apraksts2',
 	'wikieditor-toolbar-help-content-indent-result' => 'Teksts bez atkāpes<dl><dd>Teksts ar atkāpi<dl><dd>Teksts ar atkāpi</dd></dl></dd></dl>',
 );
 
+/** Literary Chinese (文言)
+ * @author Yanteng3
+ */
+$messages['lzh'] = array(
+	'wikieditor-loading' => '載之……',
+);
+
 /** Lazuri (Lazuri)
  * @author Bombola
  */
@@ -17571,7 +17891,7 @@ $messages['min'] = array(
 	'wikieditor-toolbar' => 'Bilah suntiang',
 	'wikieditor-toolbar-desc' => 'Laman bilah suntiang jo kagunoan lanjuik',
 	'wikieditor-toolbar-preference' => 'Aktipan bilah panyuntiangan tingkek lanjuik',
-	'wikieditor-toolbar-dialogs-preference' => 'Aktipan bantuan untuak manambah pautan, tabel dan lainnyo',
+	'wikieditor-toolbar-dialogs-preference' => 'Aktipan bantuan untuak manambah pautan, tabel dan lainnyo', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Suruakan tombol tando tangan dari laman pado ruang namo utama',
 	'wikieditor-toolbar-loading' => 'Loading...',
 	'wikieditor-toolbar-tool-bold' => 'Taba',
@@ -17823,7 +18143,7 @@ $messages['mk'] = array(
 	'wikieditor-toolbar' => 'Алатник за уредување',
 	'wikieditor-toolbar-desc' => 'Алатник за уредување со подобрена употребливост',
 	'wikieditor-toolbar-preference' => 'Вклучи го подобрениот алатник за уредување',
-	'wikieditor-toolbar-dialogs-preference' => 'Овозможи дијалози за вметнување врски, табели и повеќе',
+	'wikieditor-toolbar-dialogs-preference' => 'Овозможи помошници за вметнување врски, табели, како и можноста за пребарување и замена',
 	'wikieditor-toolbar-hidesig' => 'Скриј го копчето за потпис на страниците во главниот именски простор',
 	'wikieditor-toolbar-loading' => 'Вчитувам...',
 	'wikieditor-toolbar-tool-bold' => 'Задебелено',
@@ -17851,6 +18171,7 @@ $messages['mk'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Погрешен наслов',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Надворешна врска',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Проверувам дали постои страницата...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Појаснителна страница',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Наведениот наслов е неважечки.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'URL адресата која ја назначивте изгледа како врска до друга вики-страница. Сакате ова да биде внатрешна врска?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Внатрешна врска',
@@ -18073,7 +18394,7 @@ $messages['ml'] = array(
 	'wikieditor-toolbar' => 'തിരുത്തൽ പണിപ്പെട്ടി',
 	'wikieditor-toolbar-desc' => 'തിരുത്താനുള്ള താളിൽ മെച്ചപ്പെട്ട ഉപയോഗത്തിനായുള്ള പണിപ്പെട്ടി',
 	'wikieditor-toolbar-preference' => 'തിരുത്തുവാനുള്ള വിശദ പണിപ്പെട്ടി ഉപയോഗപ്പെടുത്തുക',
-	'wikieditor-toolbar-dialogs-preference' => 'കണ്ണികൾ, പട്ടികകൾ തുടങ്ങിയവ ഉൾപ്പെടുത്താനുള്ള സൗകര്യം സജ്ജമാക്കുക',
+	'wikieditor-toolbar-dialogs-preference' => 'കണ്ണികൾ, പട്ടികകൾ ഒപ്പം  തിരഞ്ഞ് കണ്ടെത്താനും മാറ്റാനും ഉള്ള സൗകര്യം തുടങ്ങിയവ ഉൾപ്പെടുത്താനുള്ള വഴികാട്ടി സജ്ജമാക്കുക',
 	'wikieditor-toolbar-hidesig' => 'പ്രധാന നാമമേഖലയിലുള്ള താളുകളിൽ ഒപ്പിടാനുള്ള ബട്ടൺ മറയ്ക്കുക',
 	'wikieditor-toolbar-loading' => 'ശേഖരിക്കുന്നു...',
 	'wikieditor-toolbar-tool-bold' => 'കടുപ്പിക്കുക',
@@ -18101,6 +18422,7 @@ $messages['ml'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'അസാധുവായ തലക്കെട്ട്',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'പുറത്തേയ്ക്കുള്ള കണ്ണി',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'താൾ നിലനിൽക്കുന്നുണ്ടോ എന്നു പരിശോധിക്കുന്നു...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'വിവക്ഷിതതാൾ',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'താങ്കൾ നൽകിയ തലക്കെട്ട് അസാധുവാണ്.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'താങ്കൾ വ്യക്തമാക്കിയ യൂ.ആർ.എൽ. കണ്ടിട്ട് മറ്റൊരു വിക്കി താളിലേയ്ക്കുള്ളതാണെന്നു തോന്നുന്നു. ഇതൊരു ആഭ്യന്തര കണ്ണി ആക്കണോ?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'ആഭ്യന്തര കണ്ണി',
@@ -18220,6 +18542,7 @@ $1:Example.jpg|കുറിപ്പ്2',
 	'wikieditor-toolbar-characters-page-lao' => 'ലാവോ',
 	'wikieditor-toolbar-characters-page-khmer' => 'ഖെമർ',
 	'wikieditor-toolbar-characters-endash' => 'ഇം  ഡാഷ്',
+	'wikieditor-toolbar-characters-emdash' => 'എം ഡാഷ്',
 	'wikieditor-toolbar-characters-minus' => 'വ്യവകലന ചിഹ്നം',
 	'wikieditor-toolbar-section-help' => 'സഹായം',
 	'wikieditor-toolbar-help-heading-description' => 'വിവരണം',
@@ -18310,22 +18633,22 @@ $messages['mr'] = array(
 	'wikieditor' => 'विकिमजकूर संपादनाची विकसित सुविधा',
 	'wikieditor-desc' => 'विस्तारणीय विकिमजकुर संपादन आंतरपृष्ठ (इंटरफेस) आणि बर्‍याच वैशिष्ट्यपूर्ण निश्चयिका (मॊड्यूल्स) पुरवते',
 	'wikieditor-wikitext-tab' => 'विकिमजकूर',
-	'wikieditor-loading' => 'चढवत आहे…',
+	'wikieditor-loading' => 'प्रभारण करीत आहे',
 	'wikieditor-preview-preference' => 'सोबतच आजु-बाजूस दिसणारी झलक शक्य करा.',
 	'wikieditor-preview-tab' => 'झलक',
 	'wikieditor-preview-changes-tab' => 'बदल',
-	'wikieditor-preview-loading' => 'चढवत आहे…',
+	'wikieditor-preview-loading' => 'प्रभारण करीत आहे',
 	'wikieditor-previewDialog-preference' => '"झलक पहा" चौकट सक्षम करा',
 	'wikieditor-previewDialog-tab' => 'झलक पहा',
-	'wikieditor-previewDialog-loading' => 'चढवत आहे…',
+	'wikieditor-previewDialog-loading' => 'प्रभारण करीत आहे',
 	'wikieditor-publish-preference' => 'टप्प्या-टप्प्याने प्रकाशन शक्य करा',
 	'wikieditor-publish-button-publish' => 'प्रकाशित करा
 दाखवा',
 	'wikieditor-publish-button-cancel' => 'रद्द करा',
 	'wikieditor-publish-dialog-title' => '{{संकेतस्थळनाव}} येथे प्रदर्शित करा',
-	'wikieditor-publish-dialog-summary' => 'बदलांचा आढावा :(आपण केलेल्या बदलांचे थोडक्यात वर्णन करा.)',
+	'wikieditor-publish-dialog-summary' => 'बदलांचा सारांश :(आपण केलेल्या बदलांचे थोडक्यात वर्णन करा):',
 	'wikieditor-publish-dialog-minor' => 'छोटा बदल',
-	'wikieditor-publish-dialog-watch' => 'या पानावर बदलांसाठी लक्ष ठेवा',
+	'wikieditor-publish-dialog-watch' => 'पान निरीक्षणांतर्गत ठेवा',
 	'wikieditor-publish-dialog-publish' => 'प्रकाशित करा',
 	'wikieditor-publish-dialog-goback' => 'मागे जा',
 	'wikieditor-template-editor-preference' => 'विकि साच्यांची नमुना संपादन सक्षम करा',
@@ -18340,13 +18663,13 @@ $messages['mr'] = array(
 	'wikieditor-toolbar' => 'संपादन साधनपट्टी',
 	'wikieditor-toolbar-desc' => 'सुलभीकरणाने वर्धित संपादनपान  साधनपट्टी',
 	'wikieditor-toolbar-preference' => 'वर्धित संपादन साधनपट्टी सक्षम करा',
-	'wikieditor-toolbar-dialogs-preference' => 'दुवे, सारण्या (टेबल) आणि इतर भरण्याकरिता  dialogs  सक्षम करा',
+	'wikieditor-toolbar-dialogs-preference' => 'दुवे, सारण्या (टेबल) आणि इतर भरण्याकरिता  dialogs  सक्षम करा', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'मुख्य नामविश्वातील पानांपासून स्वाक्षरीची कळ लपवा',
-	'wikieditor-toolbar-loading' => 'चढवत आहे…',
+	'wikieditor-toolbar-loading' => 'प्रभारण करीत आहे',
 	'wikieditor-toolbar-tool-bold' => 'ठळक',
 	'wikieditor-toolbar-tool-bold-example' => 'ठळक मजकूर',
 	'wikieditor-toolbar-tool-italic' => 'तिरपी मुद्राक्षरे',
-	'wikieditor-toolbar-tool-italic-example' => 'तिरपी मुद्राक्षरे',
+	'wikieditor-toolbar-tool-italic-example' => 'तिरप्या मुद्राक्षरातील मजकूर',
 	'wikieditor-toolbar-tool-ilink' => 'अंतर्गत दुवा',
 	'wikieditor-toolbar-tool-ilink-example' => 'शीर्षकास दुवा द्या',
 	'wikieditor-toolbar-tool-xlink' => 'बाह्य दुव्यात (http:// हा उपसर्ग विसरू नका)',
@@ -18367,7 +18690,7 @@ $messages['mr'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'पान अस्तित्वात नाही',
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'अग्राह्य शीर्षक',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'बाह्य दुवा',
-	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'पानाचे अस्तित्व तपासत आहे...',
+	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'पान अस्तित्व आहे काय ते तपासत आहे...',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'तुम्ही नमूद केलेले शीर्षक अग्राह्य आहे.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'तुम्ही नमूद केलेली यूआरएल इतर विकिपानास जोडावयाची आहे असे दिसते. तुम्हाला अंतर्गत दुवा बनवायचा आहे काय ?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'अंतर्गत दुवा',
@@ -18377,13 +18700,13 @@ $messages['mr'] = array(
 	'wikieditor-toolbar-tool-file-example' => 'उदाहरण.jpg',
 	'wikieditor-toolbar-tool-file-title' => 'चित्र टाका',
 	'wikieditor-toolbar-file-target' => 'संचिकेचे नाव:',
-	'wikieditor-toolbar-file-caption' => 'वर्णन:',
+	'wikieditor-toolbar-file-caption' => 'मथळा:',
 	'wikieditor-toolbar-file-size' => 'आकार:',
 	'wikieditor-toolbar-file-float' => 'समास:',
-	'wikieditor-toolbar-file-format' => 'प्रकार',
+	'wikieditor-toolbar-file-format' => 'प्रारुप:',
 	'wikieditor-toolbar-file-format-none' => 'काहीही नाही',
 	'wikieditor-toolbar-tool-file-insert' => 'समाविष्ट करा',
-	'wikieditor-toolbar-tool-file-cancel' => 'रद्द',
+	'wikieditor-toolbar-tool-file-cancel' => 'रद्द करा',
 	'wikieditor-toolbar-tool-reference' => 'संदर्भ',
 	'wikieditor-toolbar-tool-reference-example' => 'तळटीप मजकूर येथे भरा',
 	'wikieditor-toolbar-tool-reference-cancel' => 'रद्द करा',
@@ -18399,10 +18722,10 @@ $messages['mr'] = array(
 	'wikieditor-toolbar-tool-heading-4' => 'स्तर ४',
 	'wikieditor-toolbar-tool-heading-5' => 'स्तर ५',
 	'wikieditor-toolbar-tool-heading-example' => 'अग्रशीर्ष मजकूर',
-	'wikieditor-toolbar-group-format' => 'आराखडा',
+	'wikieditor-toolbar-group-format' => 'प्रारुप',
 	'wikieditor-toolbar-tool-ulist' => 'बिंदी क्रमांकन',
 	'wikieditor-toolbar-tool-ulist-example' => 'बिंदी क्रमांकन घटक',
-	'wikieditor-toolbar-tool-olist' => 'अनुक्रम यादी',
+	'wikieditor-toolbar-tool-olist' => 'अनुक्रमित यादी',
 	'wikieditor-toolbar-tool-olist-example' => 'अनुक्रम यादी घटक',
 	'wikieditor-toolbar-tool-indent' => 'समासांतर',
 	'wikieditor-toolbar-tool-indent-example' => 'समासांतर ओळ',
@@ -18440,7 +18763,7 @@ $1:Example.jpg|चित्रपरिचय २',
 	'wikieditor-toolbar-tool-table-title' => 'सारणी समाविष्ट करा',
 	'wikieditor-toolbar-tool-table-dimensions-rows' => 'ओळी',
 	'wikieditor-toolbar-tool-table-dimensions-columns' => 'रकाना',
-	'wikieditor-toolbar-tool-table-dimensions-header' => 'मथळा ओळ जोडा',
+	'wikieditor-toolbar-tool-table-dimensions-header' => 'शीर्ष ओळ जोडा',
 	'wikieditor-toolbar-tool-table-wikitable' => 'काठासहीत शैली',
 	'wikieditor-toolbar-tool-table-sortable' => 'सारणी क्रमानुसारी करण्याजोगी करा',
 	'wikieditor-toolbar-tool-table-example' => 'उदाहरण',
@@ -18483,7 +18806,7 @@ $1:Example.jpg|चित्रपरिचय २',
 	'wikieditor-toolbar-characters-page-devanagari' => 'देवनागरी',
 	'wikieditor-toolbar-characters-page-thai' => 'थाई भाषा',
 	'wikieditor-toolbar-characters-page-lao' => 'लाऒ भाषा',
-	'wikieditor-toolbar-characters-page-khmer' => 'खमेर',
+	'wikieditor-toolbar-characters-page-khmer' => 'ख्मेर',
 	'wikieditor-toolbar-characters-minus' => 'ॠण चिन्ह',
 	'wikieditor-toolbar-section-help' => 'साहाय्य',
 	'wikieditor-toolbar-help-heading-description' => 'वर्णन',
@@ -18526,7 +18849,7 @@ $1:Example.jpg|चित्रपरिचय २',
 	'wikieditor-toolbar-help-content-ulist-description' => 'बिंदीक्रमांकीत यादी',
 	'wikieditor-toolbar-help-content-ulist-syntax' => '* यादी कलम<br />* यादी कलम',
 	'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>यादी घटक</li><li>यादी घटक</li></ul>',
-	'wikieditor-toolbar-help-content-olist-description' => 'अनुक्रम यादी',
+	'wikieditor-toolbar-help-content-olist-description' => 'अनुक्रमित यादी',
 	'wikieditor-toolbar-help-content-olist-syntax' => '# यादी घटक<br /># यादी घटक',
 	'wikieditor-toolbar-help-content-olist-result' => '<ol><li>यादी घटक</li><li>यादी घटक</li></ol>',
 	'wikieditor-toolbar-help-content-file-description' => 'संलग्न संचिका',
@@ -18540,8 +18863,7 @@ $1:Example.jpg|चित्रपरिचय २',
 	'wikieditor-toolbar-help-content-rereference-result' => "पान मजकूर.<sup><a href='#'>[1]</a></sup>",
 	'wikieditor-toolbar-help-content-showreferences-description' => 'संदर्भ दर्शवा',
 	'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Link text</a>, additional text.</li></ol>",
-	'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'वेळेसह तुमची सही
-तुमची सही व वेळ',
+	'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'सही आणि वेळठसा',
 	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>सदस्यनाव</a> (<a href='#' title='{{#special:mytalk}}'>चर्चा</a>) 15:54, 10 June 2009 (UTC)",
 	'wikieditor-toolbar-help-content-signature-description' => 'सही',
 	'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#विशेष:माझेसदस्यपान}}'>सदस्यनाव</a> (<a href='#' title='{{#विशेष:माझ्याचर्चा}}'>चर्चा</a>)",
@@ -18590,7 +18912,7 @@ $messages['ms'] = array(
 	'wikieditor-toolbar' => 'Bar alatan penyuntingan',
 	'wikieditor-toolbar-desc' => 'Bar alatan penyuntingan maju',
 	'wikieditor-toolbar-preference' => 'Bolehkan alatan penyuntingan maju',
-	'wikieditor-toolbar-dialogs-preference' => 'Aktifkan dialog untuk menyelitkan pautan, jadual dan lain-lain',
+	'wikieditor-toolbar-dialogs-preference' => 'Bolehkan pendeta untuk menyisipkan pautan di samping juga fungsi cari dan ganti',
 	'wikieditor-toolbar-hidesig' => 'Sorokkan butang tandatangan daripada laman-laman dalam ruang nama utama',
 	'wikieditor-toolbar-loading' => 'Memuatkan...',
 	'wikieditor-toolbar-tool-bold' => 'Teks tebal',
@@ -18618,6 +18940,7 @@ $messages['ms'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Tajuk tidak sah',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Pautan luar',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Memeriksa kewujudan laman...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Halaman nyahkekaburan',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Tajuk yang anda nyatakan tidak sah.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'URL yang diselitkan merupakan halaman wiki? Adakah anda ingin menyelitkan pautan dalaman?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Pautan dalaman',
@@ -18839,7 +19162,7 @@ $messages['mt'] = array(
 	'wikieditor-toolbar' => 'Kaxxa tal-għodda għall-immodifikar',
 	'wikieditor-toolbar-desc' => "Immodifika l-kaxxa tal-għodda b'akbar użabilità",
 	'wikieditor-toolbar-preference' => 'Awtorizza l-użu tal-kaxxa tal-għodda estiża',
-	'wikieditor-toolbar-dialogs-preference' => "Awtorizza l-għajnuna għaż-żieda ta' test wiki avvanzat",
+	'wikieditor-toolbar-dialogs-preference' => "Awtorizza l-għajnuna għaż-żieda ta' test wiki avvanzat", # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Aħbi l-buttuna tal-firma mill-paġni tal-ispazju tal-isem prinċipali',
 	'wikieditor-toolbar-loading' => "Tiela'...",
 	'wikieditor-toolbar-tool-bold' => 'Tipa ħoxna',
@@ -19113,7 +19436,7 @@ $messages['nah'] = array(
 	'wikieditor-toolbar' => 'Tlayêyèktlàlilòkàtekitiâpalli',
 	'wikieditor-toolbar-desc' => 'Ìtekitiâpal in tlayêyèktlàlilòkàtlaìxtlapalli ìwàn okảchi kuâkualli tlamantli tlatekitiliskàyòtl',
 	'wikieditor-toolbar-preference' => 'Motekitìltìs in okảchi kualli tekitiâpalli tlèn ìka tlayêyèktlàlilo',
-	'wikieditor-toolbar-dialogs-preference' => 'Motekitìltìs tlanônòtzaliskàyòtl tlèn ìnka tlatzòtzòwìltlàlilòs, tlatlapaltlàlilòs wàn oksẻki îtlàtlèn monẻkis motlàlìs',
+	'wikieditor-toolbar-dialogs-preference' => 'Motekitìltìs tlanônòtzaliskàyòtl tlèn ìnka tlatzòtzòwìltlàlilòs, tlatlapaltlàlilòs wàn oksẻki îtlàtlèn monẻkis motlàlìs', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Motlàtìs in machiòpàchitl ìwikpa ìtlaìxtlapalwàn in achkàuhtòkâyẻyàntli',
 	'wikieditor-toolbar-loading' => 'Motlamàmaltîtỉka....',
 	'wikieditor-toolbar-tool-bold' => 'Tlìltik',
@@ -19255,10 +19578,11 @@ $messages['nah'] = array(
 	'wikieditor-toolbar-help-content-indent-result' => 'Sâsanỉman tlâkuilòlmantli<dl><dd>Tlâtlapouhki tlakuilòlmantli<dl><dd>Tlâtlapouhki tlâkuilòlmantli</dd></dl></dd></dl>',
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Danmichaelo
  * @author Event
  * @author Haakon K
+ * @author Jeblad
  * @author Jsoby
  * @author Laaknor
  * @author Nghtwlkr
@@ -19268,14 +19592,14 @@ $messages['nb'] = array(
 	'wikieditor' => 'Avansert grensesnitt for redigering av wikitekst',
 	'wikieditor-desc' => 'Gir et utvidbart tekstredigeringsgrensesnitt og mange utvidelsesmoduler',
 	'wikieditor-wikitext-tab' => 'Wikitekst',
-	'wikieditor-loading' => 'Laster',
+	'wikieditor-loading' => 'Laster…',
 	'wikieditor-preview-preference' => 'Aktiver forhåndsvisning side-ved-side',
 	'wikieditor-preview-tab' => 'Forhåndsvisning',
 	'wikieditor-preview-changes-tab' => 'Endringer',
-	'wikieditor-preview-loading' => 'Laster...',
+	'wikieditor-preview-loading' => 'Laster…',
 	'wikieditor-previewDialog-preference' => 'Aktiver forhåndsvisningsdialog',
 	'wikieditor-previewDialog-tab' => 'Forhåndsvisning',
-	'wikieditor-previewDialog-loading' => 'Laster...',
+	'wikieditor-previewDialog-loading' => 'Laster…',
 	'wikieditor-publish-preference' => 'Aktiver steg-for-steg publisering',
 	'wikieditor-publish-button-publish' => 'Publiser',
 	'wikieditor-publish-button-cancel' => 'Avbryt',
@@ -19296,9 +19620,9 @@ $messages['nb'] = array(
 	'wikieditor-toolbar' => 'Verktøylinje for redigering',
 	'wikieditor-toolbar-desc' => 'Verktøylinje for redigering med utvidet brukervennlighet',
 	'wikieditor-toolbar-preference' => 'Aktiver utvidet verktøylinje for redigering',
-	'wikieditor-toolbar-dialogs-preference' => 'Slå på dialoger for innsetting av lenker, tabeller og mer',
+	'wikieditor-toolbar-dialogs-preference' => 'Slå på dialoger for innsetting av lenker, tabeller og mer', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Skjul signaturknappen fra sider i hovednavnerommet',
-	'wikieditor-toolbar-loading' => 'Laster...',
+	'wikieditor-toolbar-loading' => 'Laster…',
 	'wikieditor-toolbar-tool-bold' => 'Fet',
 	'wikieditor-toolbar-tool-bold-example' => 'Fet tekst',
 	'wikieditor-toolbar-tool-italic' => 'Kursiv',
@@ -19323,7 +19647,7 @@ $messages['nb'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'Siden finnes ikke',
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ugyldig tittel',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Ekstern lenke',
-	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Kontrollerer om siden finnes...',
+	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Kontrollerer om siden finnes…',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Tittelen du gav er ugyldig',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'URLen du la inn ser ut som en lenke til en annen wikiside. Vil du gjøre den til en internlenke?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Intern lenke',
@@ -19405,7 +19729,7 @@ $1:Example.jpg|Bildetekst2',
 	'wikieditor-toolbar-tool-table-preview' => 'Forhåndsvisning',
 	'wikieditor-toolbar-tool-table-insert' => 'Sett inn',
 	'wikieditor-toolbar-tool-table-cancel' => 'Avbryt',
-	'wikieditor-toolbar-tool-table-toomany' => 'Det er ikke mulig å sette inn mer enn $1 celler med denne boksen.', # Fuzzy
+	'wikieditor-toolbar-tool-table-toomany' => 'Det er ikke mulig å sette inn mer enn $1 celler med denne dialogen.', # Fuzzy
 	'wikieditor-toolbar-tool-table-invalidnumber' => 'Du har ikke skrevet inn et gyldig antall rader eller kolonner.',
 	'wikieditor-toolbar-tool-table-zero' => 'De kan ikke sette inn en tabell med null rader eller kolonner.',
 	'wikieditor-toolbar-tool-replace' => 'Søk og erstatt',
@@ -19419,7 +19743,7 @@ $1:Example.jpg|Bildetekst2',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'Erstatt alle',
 	'wikieditor-toolbar-tool-replace-close' => 'Lukk',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'Søket ga ingen resultater.',
-	'wikieditor-toolbar-tool-replace-success' => 'Gjorde $1 erstating(er).', # Fuzzy
+	'wikieditor-toolbar-tool-replace-success' => '{{PLURAL:$1|En erstatning|$1 erstatninger}} utført.',
 	'wikieditor-toolbar-tool-replace-emptysearch' => 'Du skrev ikke inn noe å søke etter.',
 	'wikieditor-toolbar-tool-replace-invalidregex' => 'Det regulære uttrykket du skrev inn er ugyldig: $1',
 	'wikieditor-toolbar-section-characters' => 'Spesialtegn',
@@ -19510,18 +19834,21 @@ $1:Example.jpg|Bildetekst2',
 	'wikieditor-toolbar-help-content-indent-result' => 'Normal tekst<dl><dd>Innrykket tekst<dl><dd>Innrykket tekst</dd></dl></dd></dl>',
 );
 
-/** Nedersaksies (Nedersaksies)
+/** Low Saxon (Netherlands) (Nedersaksies)
  * @author Servien
  */
 $messages['nds-nl'] = array(
 	'wikieditor' => 'Uutebreien tekstverwarker veur wikitekste',
-	'wikieditor-desc' => "Hierdeur krie-j n tekstverwarker veur wikitekste die'j uut kunnen breien en modules mit extra funksies",
+	'wikieditor-desc' => "Hierdeur krie'j n tekstverwarker veur wikitekste die'j uut kunnen breien en modules mit extra funksies",
 	'wikieditor-wikitext-tab' => 'Wikitekste',
-	'wikieditor-loading' => 'An t laojen',
+	'wikieditor-loading' => 'An t laojen...',
 	'wikieditor-preview-preference' => 'Bewarken en naokieken naos mekaar',
 	'wikieditor-preview-tab' => 'Naokieken',
 	'wikieditor-preview-changes-tab' => 'Wiezigingen',
 	'wikieditor-preview-loading' => 'An t laojen...',
+	'wikieditor-previewDialog-preference' => 't Naokiekvienster anzetten',
+	'wikieditor-previewDialog-tab' => 'Naokieken',
+	'wikieditor-previewDialog-loading' => 'An t laojen...',
 	'wikieditor-publish-preference' => 'Stap veur stap publiseren inschakelen',
 	'wikieditor-publish-button-publish' => 'Publiseren',
 	'wikieditor-publish-button-cancel' => 'Aofbreken',
@@ -19542,8 +19869,9 @@ $messages['nds-nl'] = array(
 	'wikieditor-toolbar' => 'Bewarkingswarkbalke',
 	'wikieditor-toolbar-desc' => 'Bewarkingsbalke die makkeliker te gebruken is',
 	'wikieditor-toolbar-preference' => 'De uutebreien bewarkingsbalke anzetten',
-	'wikieditor-toolbar-dialogs-preference' => 'Dialogen veur t plaotsen van verwiezingen, tabellen en meer inschakelen',
-	'wikieditor-toolbar-loading' => 'Bezig mit laojen...',
+	'wikieditor-toolbar-dialogs-preference' => 'Dialogen inschakelen veur t plaotsen van verwiezingen, tabellen en zeuken en vervangen',
+	'wikieditor-toolbar-hidesig' => 'De knoppe veur ondertekenen in disse naamruumte verbargen',
+	'wikieditor-toolbar-loading' => 'An t laojen...',
 	'wikieditor-toolbar-tool-bold' => 'Vet',
 	'wikieditor-toolbar-tool-bold-example' => 'Vet-edrokten tekste',
 	'wikieditor-toolbar-tool-italic' => 'Schunedrokt',
@@ -19569,6 +19897,7 @@ $messages['nds-nl'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ongeldige ziednaam',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Uutgaonde verwiezing',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Is an t kieken of disse zied al besteet...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Deurverwieszied',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'De op-egeven zied is ongeldig.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => "t Lik as of t webadres da'j op-egeven hebben n verwiezing naor n aandere wikizied mut ween.
 Wi'j der n interne verwiezing van maken?",
@@ -19577,6 +19906,16 @@ Wi'j der n interne verwiezing van maken?",
 	'wikieditor-toolbar-tool-link-empty' => 'Je hebben niks op-egeven um naor te verwiezen.',
 	'wikieditor-toolbar-tool-file' => 'Bestaand derbie doon',
 	'wikieditor-toolbar-tool-file-example' => 'Veurbeeld.jpg',
+	'wikieditor-toolbar-tool-file-title' => 'Bestaand derbie doon',
+	'wikieditor-toolbar-file-target' => 'Bestaandsnaam:',
+	'wikieditor-toolbar-file-caption' => 'Bieschrift:',
+	'wikieditor-toolbar-file-size' => 'Grootte:',
+	'wikieditor-toolbar-file-float' => 'Uutliening:',
+	'wikieditor-toolbar-file-default' => '(standard)',
+	'wikieditor-toolbar-file-format' => 'Opmaak:',
+	'wikieditor-toolbar-file-format-none' => 'gien',
+	'wikieditor-toolbar-tool-file-insert' => 'Derbie doon',
+	'wikieditor-toolbar-tool-file-cancel' => 'Aofbreken',
 	'wikieditor-toolbar-tool-reference' => 'Referensie',
 	'wikieditor-toolbar-tool-reference-example' => 'Plaots hier tekste veur de vootnote',
 	'wikieditor-toolbar-tool-reference-cancel' => 'Aofbreken',
@@ -19641,7 +19980,7 @@ $1:Veurbeeld2|Bieschrift2',
 	'wikieditor-toolbar-tool-table-preview' => 'Naokieken',
 	'wikieditor-toolbar-tool-table-insert' => 'Invoegen',
 	'wikieditor-toolbar-tool-table-cancel' => 'Aofbreken',
-	'wikieditor-toolbar-tool-table-toomany' => 'Je kunnen via dit dialoogvienster gien tabel derbie doon mit meer as $1 sellen.', # Fuzzy
+	'wikieditor-toolbar-tool-table-toomany' => 'Je kunnen via dit dialoogvienster gien tabel derbie doon mit meer as 1000 sellen.',
 	'wikieditor-toolbar-tool-table-invalidnumber' => 'Je hebben nog gien geldig antal regels of kolommen op-egeven.',
 	'wikieditor-toolbar-tool-table-zero' => 'Je kunnen gien tabel derbie doon zonder regels of kolommen.',
 	'wikieditor-toolbar-tool-replace' => 'Zeuken en vervangen',
@@ -19651,10 +19990,11 @@ $1:Veurbeeld2|Bieschrift2',
 	'wikieditor-toolbar-tool-replace-case' => 'Heufdlettergeveulig',
 	'wikieditor-toolbar-tool-replace-regex' => 'De zeukreeks as reguliere expressie behaandelen',
 	'wikieditor-toolbar-tool-replace-button-findnext' => 'Volgende zeuken',
+	'wikieditor-toolbar-tool-replace-button-replace' => 'Vervangen',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'Alles vervangen',
 	'wikieditor-toolbar-tool-replace-close' => 'Sluten',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'Joew zeukopdrach hef niks op-eleverd.',
-	'wikieditor-toolbar-tool-replace-success' => 'Der bin $1 vervangingen edaon.', # Fuzzy
+	'wikieditor-toolbar-tool-replace-success' => 'Der {{PLURAL:$1|is één vervanging|bin $1 vervangingen}} edaon.',
 	'wikieditor-toolbar-tool-replace-emptysearch' => 'Je hebben gien zeukterm op-egeven.',
 	'wikieditor-toolbar-tool-replace-invalidregex' => "De reguliere die'j op-egeven hebben is ongeldig: $1",
 	'wikieditor-toolbar-section-characters' => 'Spesiale tekens',
@@ -19665,12 +20005,21 @@ $1:Veurbeeld2|Bieschrift2',
 	'wikieditor-toolbar-characters-page-greek' => 'Grieks',
 	'wikieditor-toolbar-characters-page-cyrillic' => 'Kyrillies',
 	'wikieditor-toolbar-characters-page-arabic' => 'Arabies',
+	'wikieditor-toolbar-characters-page-arabicextended' => 'Arabies uutebreid',
 	'wikieditor-toolbar-characters-page-persian' => 'Perzies',
 	'wikieditor-toolbar-characters-page-hebrew' => 'Hebreeuws',
 	'wikieditor-toolbar-characters-page-bangla' => 'Bengaals',
+	'wikieditor-toolbar-characters-page-tamil' => 'Tamil',
 	'wikieditor-toolbar-characters-page-telugu' => 'Telugu',
 	'wikieditor-toolbar-characters-page-sinhala' => 'Singalees',
 	'wikieditor-toolbar-characters-page-gujarati' => 'Gujarati',
+	'wikieditor-toolbar-characters-page-devanagari' => 'Devanagari',
+	'wikieditor-toolbar-characters-page-thai' => 'Thai',
+	'wikieditor-toolbar-characters-page-lao' => 'Laotiaans',
+	'wikieditor-toolbar-characters-page-khmer' => 'Khmer',
+	'wikieditor-toolbar-characters-endash' => 'liggend streepjen',
+	'wikieditor-toolbar-characters-emdash' => 'gedachtenstreepjen',
+	'wikieditor-toolbar-characters-minus' => 'minteken',
 	'wikieditor-toolbar-section-help' => 'Hulpe',
 	'wikieditor-toolbar-help-heading-description' => 'Beschrieving',
 	'wikieditor-toolbar-help-heading-syntax' => "Wa'j tikken",
@@ -19750,6 +20099,7 @@ $messages['ne'] = array(
 /** Dutch (Nederlands)
  * @author Hamaryns
  * @author McDutchie
+ * @author Romaine
  * @author SPQRobin
  * @author Siebrand
  * @author Tvdm
@@ -19787,7 +20137,7 @@ $messages['nl'] = array(
 	'wikieditor-toolbar' => 'Bewerkingswerkbalk',
 	'wikieditor-toolbar-desc' => 'Bewerkingsbalk die eenvoudiger te gebruiken is',
 	'wikieditor-toolbar-preference' => 'Uitgebreide bewerkingsbalk inschakelen',
-	'wikieditor-toolbar-dialogs-preference' => 'Dialogen voor het toevoegen van koppelingen, tabellen en meer inschakelen',
+	'wikieditor-toolbar-dialogs-preference' => 'Dialogen inschakelen voor het toevoegen van koppelingen, tabellen, en zoeken en vervangen',
 	'wikieditor-toolbar-hidesig' => 'De knop voor ondertekenen in deze naamruimte verbergen',
 	'wikieditor-toolbar-loading' => 'Bezig met laden…',
 	'wikieditor-toolbar-tool-bold' => 'Vet',
@@ -19815,6 +20165,7 @@ $messages['nl'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ongeldige paginanaam',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Externe koppeling',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Bezig met controleren of de pagina al bestaat...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Doorverwijspagina',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'De opgegeven pagina is ongeldig.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'De URL die u hebt opgegeven lijkt bedoeld te zijn als koppeling naar een andere wikipagina.
 Wilt u er een interne koppeling van maken?',
@@ -20018,7 +20369,7 @@ Wil je er een interne koppeling van maken?',
 	'wikieditor-toolbar-help-heading-result' => 'Wat je te zien krijgt',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Eirik
  * @author Gunnernett
  * @author Harald Khan
@@ -20055,7 +20406,7 @@ $messages['nn'] = array(
 	'wikieditor-toolbar' => 'Verktøyline for redigering',
 	'wikieditor-toolbar-desc' => 'Ei meir brukarvenleg verktøylinje for redigering',
 	'wikieditor-toolbar-preference' => 'Ta i bruk utvida verktøylinje for redigering',
-	'wikieditor-toolbar-dialogs-preference' => 'Aktiver dialogar for insetjing av lenkjer, tabellar og meir',
+	'wikieditor-toolbar-dialogs-preference' => 'Aktiver dialogar for insetjing av lenkjer, tabellar og meir', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Lastar …',
 	'wikieditor-toolbar-tool-bold' => 'Feit',
 	'wikieditor-toolbar-tool-bold-example' => 'Feit tekst',
@@ -20290,6 +20641,7 @@ $messages['nso'] = array(
 );
 
 /** Occitan (occitan)
+ * @author Beta16
  * @author Boulaur
  * @author Cedric31
  * @author Jfblanc
@@ -20324,10 +20676,10 @@ $messages['oc'] = array(
 	'wikieditor-toc-preference' => "Activar l'ensenhador navigable",
 	'wikieditor-toc-show' => 'Afichar lo contengut',
 	'wikieditor-toc-hide' => 'Amagar lo contengut',
-	'wikieditor-toolbar' => 'Modificacion de la barra d’espleches',
-	'wikieditor-toolbar-desc' => "Modificacion de la barra d'espleches amb l'utilizabilitat melhorada",
-	'wikieditor-toolbar-preference' => "Activar la barra d'espleches melhorada",
-	'wikieditor-toolbar-dialogs-preference' => 'Activar las bóstias de dialòg per apondre de ligams, de tablèus e mai encara',
+	'wikieditor-toolbar' => 'Barra d’aisinas de modificacion',
+	'wikieditor-toolbar-desc' => "Modificacion de la barra d'aisinas amb l'utilizabilitat melhorada",
+	'wikieditor-toolbar-preference' => "Activar la barra d'aisinas melhorada",
+	'wikieditor-toolbar-dialogs-preference' => 'Activar las bóstias de dialòg per apondre de ligams, de tablèus e mai encara', # Fuzzy
 	'wikieditor-toolbar-hidesig' => "Amagar lo boton de signatura dins las paginas de l'espaci de noms principal",
 	'wikieditor-toolbar-loading' => 'Cargament ...',
 	'wikieditor-toolbar-tool-bold' => 'Gras',
@@ -20364,7 +20716,7 @@ $messages['oc'] = array(
 	'wikieditor-toolbar-tool-file-example' => 'Exemple.jpg',
 	'wikieditor-toolbar-tool-file-title' => 'Importar un fichièr',
 	'wikieditor-toolbar-file-target' => 'Nom de fichièr :',
-	'wikieditor-toolbar-file-caption' => 'Legenda :',
+	'wikieditor-toolbar-file-caption' => 'Legenda:',
 	'wikieditor-toolbar-file-size' => 'Talha :',
 	'wikieditor-toolbar-file-float' => 'Alinhament :',
 	'wikieditor-toolbar-file-default' => '(per defaut)',
@@ -20539,7 +20891,7 @@ $1:Exemple.jpg|Descripcion 2',
 	'wikieditor-toolbar-help-content-indent-result' => 'Tèxte normal<dl><dd>Tèxte indentat<dl><dd>Tèxte indentat</dd></dl></dd></dl>',
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Ansumang
  * @author Jnanaranjan Sahu
  * @author Odisha1
@@ -20572,223 +20924,223 @@ $messages['or'] = array(
 	'wikieditor-template-editor-dialog-submit' => 'ଅପଡେଟ',
 	'wikieditor-template-editor-dialog-cancel' => 'ନାକଚ',
 	'wikieditor-templates-preference' => 'ଛାଞ୍ଚର ଦେଖାଇବା-ଲୁଚାଇବା ସୁବିଧ ସଚଳ କରିବେ',
-	'wikieditor-toc-preference' => 'ଖୋଜା ଯାଇପାରୁଥିବା ସୂଚି',
-	'wikieditor-toc-show' => 'ସୂଚି ଦେଖାଇବେ',
-	'wikieditor-toc-hide' => 'ସୂଚି ଲୁଚାଇବେ',
-	'wikieditor-toolbar' => 'ସମ୍ପାଦନା ଉପକରଣ ପଟିକା',
-	'wikieditor-toolbar-desc' => 'ଅଧିକ ବ୍ୟବହାର ସୁବିଧା ସହ ପୃଷ୍ଠା ସମ୍ପାଦନା ଉପକରଣ ପଟିକା',
-	'wikieditor-toolbar-preference' => 'ଉନ୍ନତ ସମ୍ପାଦନା ଉପକରଣ ପେଡ଼ିକୁ ସଚଳ କରିବେ',
-	'wikieditor-toolbar-dialogs-preference' => 'ଲିଙ୍କ, ସାରଣୀ ଓ ଅଧିକ ସୁବିଧା ସବୁ ଯୋଡ଼ିବା ନିମନ୍ତେ ଆଦେଶ ସଚଳ କରାଇବେ',
-	'wikieditor-toolbar-hidesig' => 'ମୂଳ ନେମସ୍ପେସରେ ପୃଷ୍ଠାମାନଙ୍କରୁ  ସନ୍ତକ ଦେବା ସୁବିଧାଟିକୁ ଲୁଚାଇଦେବେ',
+	'wikieditor-toc-preference' => 'ଖୋଜା ଯାଇପାରୁଥିବା ସୂଚୀ',
+	'wikieditor-toc-show' => 'ସୂଚୀ ଦେଖାଇବେ',
+	'wikieditor-toc-hide' => 'ସୂଚୀ ଲୁଚାଇବେ',
+	'wikieditor-toolbar' => 'ସମ୍ପାଦନା ଉପକରଣ ଟୁଲବାର',
+	'wikieditor-toolbar-desc' => 'ଅଧିକ ବ୍ୟବହାର ସୁବିଧା ସହ ପୃଷ୍ଠା ସମ୍ପାଦନା ଉପକରଣ ଟୁଲବାର',
+	'wikieditor-toolbar-preference' => 'ଉନ୍ନତ ସମ୍ପାଦନା ଉପକରଣ ଟୁଲବାର ସଚଳ କରନ୍ତୁ',
+	'wikieditor-toolbar-dialogs-preference' => 'ଲିଙ୍କ, ସାରଣୀ ଓ ଅଧିକ ସୁବିଧା ସବୁ ଯୋଡ଼ିବା ନିମନ୍ତେ ଆଦେଶ ସଚଳ କରାଇବେ', # Fuzzy
+	'wikieditor-toolbar-hidesig' => 'ମୂଳ ନେମସ୍ପେସରେ ପୃଷ୍ଠାମାନଙ୍କରୁ ସନ୍ତକ (Sign) ଦେବା ସୁବିଧାଟିକୁ ଲୁଚାଇଦେବେ',
 	'wikieditor-toolbar-loading' => 'ଖୋଲୁଅଛି...',
-	'wikieditor-toolbar-tool-bold' => 'ମୋଟା ଅକ୍ଷର',
-	'wikieditor-toolbar-tool-bold-example' => 'ମୋଟା ଲେଖା',
-	'wikieditor-toolbar-tool-italic' => 'ତେରେଛା',
-	'wikieditor-toolbar-tool-italic-example' => 'ତେରେଛା ଲେଖା',
-	'wikieditor-toolbar-tool-ilink' => 'ଭିତର ଲିଙ୍କ',
-	'wikieditor-toolbar-tool-ilink-example' => 'ଲିଙ୍କ ଶିରୋନାମା',
-	'wikieditor-toolbar-tool-xlink' => 'ବାହାର ଲିଙ୍କ (http:// ଆଗରେ ଲଗାଇବାକୁ ମନେରଖିଥିବେ)',
-	'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com ଲିଙ୍କ ଶିରୋନାମା',
+	'wikieditor-toolbar-tool-bold' => 'ବୋଲ୍‌ଡ (Bold)',
+	'wikieditor-toolbar-tool-bold-example' => 'ବୋଲ୍‌ଡ (Bold) ଲେଖା',
+	'wikieditor-toolbar-tool-italic' => 'ତେରେଛା (Italic)',
+	'wikieditor-toolbar-tool-italic-example' => 'ତେରେଛା ଲେଖା (Italic text)',
+	'wikieditor-toolbar-tool-ilink' => 'ଇଣ୍ଟରନାଲ ଲିଙ୍କ',
+	'wikieditor-toolbar-tool-ilink-example' => 'ଲିଙ୍କ ଶିରୋନାମ',
+	'wikieditor-toolbar-tool-xlink' => 'ବାହାର ଲିଙ୍କ (ଲିଙ୍କ ଆଗରୁ http:// ଲଗାଇବେ)',
+	'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com ଲିଙ୍କ ଶିରୋନାମ',
 	'wikieditor-toolbar-tool-link' => 'ଲିଙ୍କ',
-	'wikieditor-toolbar-tool-link-title' => 'ଲିଙ୍କ ପୁରାଇବେ',
+	'wikieditor-toolbar-tool-link-title' => 'ଲିଙ୍କ ଭରିବେ',
 	'wikieditor-toolbar-tool-link-int' => 'ଏକ ଉଇକି ପୃଷ୍ଠାକୁ',
-	'wikieditor-toolbar-tool-link-int-target' => 'ଲକ୍ଷ ପୃଷ୍ଠା ବା URL:',
-	'wikieditor-toolbar-tool-link-int-target-tooltip' => 'ପୃଷ୍ଠା ଶିରୋନାମା ଅବା URL',
-	'wikieditor-toolbar-tool-link-int-text' => 'ଦେଖଣା ଲେଖା:',
-	'wikieditor-toolbar-tool-link-int-text-tooltip' => 'ଦେଖଣା ଲେଖା',
-	'wikieditor-toolbar-tool-link-ext' => 'ଏକ ବାହାର ଵେବ ପୃଷ୍ଠା ନିମନ୍ତେ',
+	'wikieditor-toolbar-tool-link-int-target' => 'ଖୋଜିବାକୁ ଚାହୁଁଥିବା ପୃଷ୍ଠା ବା URL:',
+	'wikieditor-toolbar-tool-link-int-target-tooltip' => 'ପୃଷ୍ଠା ଶିରୋନାମ କିମ୍ବା URL',
+	'wikieditor-toolbar-tool-link-int-text' => 'ପ୍ରଦର୍ଶିତ ହେବାକୁ ଥିବା ଲେଖା:',
+	'wikieditor-toolbar-tool-link-int-text-tooltip' => 'ପ୍ରଦର୍ଶିତ ହେବାକୁ ଥିବା ଲେଖା',
+	'wikieditor-toolbar-tool-link-ext' => 'ଏକ ଉଇକି ବାହାର ୱେବ ପୃଷ୍ଠାକୁ',
 	'wikieditor-toolbar-tool-link-ext-target' => 'ଲିଙ୍କ URL:',
 	'wikieditor-toolbar-tool-link-ext-text' => 'ଲିଙ୍କ ଲେଖା:',
-	'wikieditor-toolbar-tool-link-insert' => 'ଲିଙ୍କ ପୁରାଇବେ',
+	'wikieditor-toolbar-tool-link-insert' => 'ଲିଙ୍କ ଭରିବେ',
 	'wikieditor-toolbar-tool-link-cancel' => 'ନାକଚ',
-	'wikieditor-toolbar-tool-link-int-target-status-exists' => 'ପୃଷ୍ଠାଟି ଅଛି',
+	'wikieditor-toolbar-tool-link-int-target-status-exists' => 'ପୃଷ୍ଠାଟି ଆଗରୁ ଅଛି',
 	'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'ପୃଷ୍ଠାଟି ନାହିଁ',
-	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ଅଚଳ ଶିରୋନାମା',
+	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ଅକାମୀ ଶିରୋନାମ',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'ବାହାର ଲିଙ୍କ',
-	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'ପୃଷ୍ଠାର ସ୍ଥିତି ଦେଖୁଅଛି...',
-	'wikieditor-toolbar-tool-link-int-invalid' => 'ଆପଣ ଦେଇଥିବା ଶିରୋନାମାଟି ଅଚଳ ଅଟେ ।',
-	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'ଆପଣ ଦେଇଥିବା URL ଟି ଆଉ ଗୋଟେ ଉଇକି ପୃଷ୍ଠାର ଲିଙ୍କ ଭଳି ବୋଧ ହେଉଛି ।
-ଆପଣ ଏହାକୁ ଏକ ଭିତର ଲିଙ୍କ କରିବାକୁ ଚାହାନ୍ତି କି?',
-	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'ଭିତର ଲିଙ୍କ',
+	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'ପୃଷ୍ଠାଟି ଅଛି କି ନାହିଁ ଖୋଜୁଛି...',
+	'wikieditor-toolbar-tool-link-int-invalid' => 'ଆପଣ ଦେଇଥିବା ଶିରୋନାମଟି କାମ କରୁନାହିଁ ।',
+	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'ଆପଣ ଦେଇଥିବା URL ଟି ଆଉ ଗୋଟେ ଉଇକି ପୃଷ୍ଠାର ଲିଙ୍କ ଭଳି ଲାଗୁଛି ।
+ଆପଣ ଏହାକୁ ଏକ ଇଣ୍ଟରଲିଙ୍କ କରିବାକୁ ଚାହାଁନ୍ତି କି?',
+	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'ଇଣ୍ଟରନାଲ ଲିଙ୍କ',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'ବାହାର ଲିଙ୍କ',
 	'wikieditor-toolbar-tool-link-empty' => 'ଆପଣ କିଛି ଲିଙ୍କ ସମ୍ପର୍କିତ କରିବା ପାଇଁ ଦେଇନାହାନ୍ତି ।',
-	'wikieditor-toolbar-tool-file' => 'ଏମବେଡ଼ ହୋଇ ଥିବା ଫାଇଲ',
-	'wikieditor-toolbar-tool-file-example' => 'ଉଦାହରଣ.jpg',
-	'wikieditor-toolbar-tool-file-title' => 'ଫାଇଲ୍‌ ପୁରାନ୍ତୁ',
-	'wikieditor-toolbar-file-target' => 'ଫାଇଲ ନାମ:',
-	'wikieditor-toolbar-file-caption' => 'ଶିରୋନାମା:',
+	'wikieditor-toolbar-tool-file' => 'ଏମବେଡ଼ ହୋଇଥିବା ଫାଇଲ',
+	'wikieditor-toolbar-tool-file-example' => 'Example.jpg',
+	'wikieditor-toolbar-tool-file-title' => 'ଫାଇଲ ଭରନ୍ତୁ',
+	'wikieditor-toolbar-file-target' => 'Filename:',
+	'wikieditor-toolbar-file-caption' => 'ଶିରୋନାମ:',
 	'wikieditor-toolbar-file-size' => 'ଆକାର:',
 	'wikieditor-toolbar-file-float' => 'ସଜାଣି:',
-	'wikieditor-toolbar-file-default' => '(ମୂଳ)',
+	'wikieditor-toolbar-file-default' => '(default)',
 	'wikieditor-toolbar-file-format' => 'ସଜାଣି:',
 	'wikieditor-toolbar-file-format-none' => 'କିଛି ନାହିଁ',
 	'wikieditor-toolbar-tool-file-insert' => 'ଭରିବେ',
 	'wikieditor-toolbar-tool-file-cancel' => 'ନାକଚ',
 	'wikieditor-toolbar-tool-reference' => 'ଆଧାର',
-	'wikieditor-toolbar-tool-reference-example' => 'ଏଠାରେ ପାଦଟୀକାଟି ରଖିବେ',
+	'wikieditor-toolbar-tool-reference-example' => 'ଏଠାରେ ପାଦଟୀକାଟି ଭରିବେ',
 	'wikieditor-toolbar-tool-reference-cancel' => 'ନାକଚ',
 	'wikieditor-toolbar-tool-reference-title' => 'ଆଧାର ଦେବେ',
 	'wikieditor-toolbar-tool-reference-insert' => 'ଭରିବେ',
-	'wikieditor-toolbar-tool-reference-text' => 'ଆଧାର ଲେଖା',
-	'wikieditor-toolbar-tool-signature' => 'ସନ୍ତକ ଓ ସମୟଚିହ୍ନ',
-	'wikieditor-toolbar-section-advanced' => 'ଉନ୍ନତ',
-	'wikieditor-toolbar-tool-heading' => 'ଶିରୋନାମା',
-	'wikieditor-toolbar-tool-heading-1' => 'ସ୍ତର ୧',
-	'wikieditor-toolbar-tool-heading-2' => 'ସ୍ତର ୨',
-	'wikieditor-toolbar-tool-heading-3' => 'ସ୍ତର ୩',
-	'wikieditor-toolbar-tool-heading-4' => 'ସ୍ତର ୪',
-	'wikieditor-toolbar-tool-heading-5' => 'ସ୍ତର ୫',
-	'wikieditor-toolbar-tool-heading-example' => 'ଶିରୋନାମା ଲେଖା',
-	'wikieditor-toolbar-group-format' => 'ସଜାଣି',
+	'wikieditor-toolbar-tool-reference-text' => 'ଆଧାର ଟେକ୍ସଟ',
+	'wikieditor-toolbar-tool-signature' => 'ସନ୍ତକ ଓ ସମୟଚିହ୍ନ (Signature & timestamp)',
+	'wikieditor-toolbar-section-advanced' => 'ଉନ୍ନତ (Advanced)',
+	'wikieditor-toolbar-tool-heading' => 'ଶିରୋନାମ',
+	'wikieditor-toolbar-tool-heading-1' => 'ସୋପାନ ୧',
+	'wikieditor-toolbar-tool-heading-2' => 'ସୋପାନ ୨',
+	'wikieditor-toolbar-tool-heading-3' => 'ସୋପାନ ୩',
+	'wikieditor-toolbar-tool-heading-4' => 'ସୋପାନ ୪',
+	'wikieditor-toolbar-tool-heading-5' => 'ସୋପାନ ୫',
+	'wikieditor-toolbar-tool-heading-example' => 'ଶିରୋନାମ ଲେଖା',
+	'wikieditor-toolbar-group-format' => 'ଫରମାଟ',
 	'wikieditor-toolbar-tool-ulist' => 'ବିନ୍ଦୁ ଦିଆ ତାଲିକା',
 	'wikieditor-toolbar-tool-ulist-example' => 'ବିନ୍ଦୁ ଦିଆ ତାଲିକା ବସ୍ତୁ',
 	'wikieditor-toolbar-tool-olist' => 'ସଂଖ୍ୟାଦିଆ ତାଲିକା',
 	'wikieditor-toolbar-tool-olist-example' => 'ସଂଖ୍ୟା ଦିଆ ତାଲିକା ବସ୍ତୁ',
 	'wikieditor-toolbar-tool-indent' => 'ଅନୁଚ୍ଛେଦ ଛାଡ଼',
 	'wikieditor-toolbar-tool-indent-example' => 'ମାର୍ଜିନରୁ ଆରମ୍ଭ ଧାଡ଼ି',
-	'wikieditor-toolbar-tool-nowiki' => 'ଉଇକି ସଜାଣି ବିନା',
-	'wikieditor-toolbar-tool-nowiki-example' => 'ଅସଜଡ଼ା ଲେଖା ଏଠାରେ ଭରିବେ',
+	'wikieditor-toolbar-tool-nowiki' => 'ଉଇକି ଫରମାଟିଂ ରହିତ',
+	'wikieditor-toolbar-tool-nowiki-example' => 'ନନ-ଫରମାଟେଡ଼ ଲେଖା ଏଠାରେ ଭରିବେ',
 	'wikieditor-toolbar-tool-redirect' => 'ପୁନପ୍ରେରଣ',
-	'wikieditor-toolbar-tool-redirect-example' => 'ମୁକାମ ପୃଷ୍ଠାର ନାମ',
+	'wikieditor-toolbar-tool-redirect-example' => 'ଠିକ ପୃଷ୍ଠାର ନାମ',
 	'wikieditor-toolbar-tool-big' => 'ବଡ଼',
 	'wikieditor-toolbar-tool-big-example' => 'ବଡ଼ ଅକ୍ଷର',
 	'wikieditor-toolbar-tool-small' => 'ଛୋଟ',
 	'wikieditor-toolbar-tool-small-example' => 'ଛୋଟ ଅକ୍ଷର',
-	'wikieditor-toolbar-tool-superscript' => 'ଉପର ଅକ୍ଷର',
-	'wikieditor-toolbar-tool-superscript-example' => 'ଉପର ଛୋଟ ଅକ୍ଷର',
-	'wikieditor-toolbar-tool-subscript' => 'ପାଦାଙ୍କ',
-	'wikieditor-toolbar-tool-subscript-example' => 'ପାଦାଙ୍କ',
+	'wikieditor-toolbar-tool-superscript' => 'ସୁପରସ୍କ୍ରିପ୍ଟ',
+	'wikieditor-toolbar-tool-superscript-example' => 'ସୁପରସ୍କ୍ରିପ୍ଟ ଅକ୍ଷର',
+	'wikieditor-toolbar-tool-subscript' => 'ସବସ୍କ୍ରିପ୍ଟ',
+	'wikieditor-toolbar-tool-subscript-example' => 'ସବସ୍କ୍ରିପ୍ଟ ଅକ୍ଷର',
 	'wikieditor-toolbar-group-insert' => 'ଭରିବେ',
 	'wikieditor-toolbar-tool-gallery' => 'ଛବି ସମୂହ',
-	'wikieditor-toolbar-tool-gallery-example' => '$1:ଉଦାହରଣ.jpg|ଶିରୋନାମା୧
-$1:ଉଦାହରଣ.jpg|ଶିରୋନାମା୨',
+	'wikieditor-toolbar-tool-gallery-example' => '$1:Example.jpg|Caption1
+$1:Example.jpg|Caption2',
 	'wikieditor-toolbar-tool-newline' => 'ନୂଆ ଧାଡ଼ି',
-	'wikieditor-toolbar-tool-table' => 'ସାରଣୀ',
+	'wikieditor-toolbar-tool-table' => 'ସାରଣୀ (Table)',
 	'wikieditor-toolbar-tool-table-example-old' => '-
-! ଶିରୋନାମା ୧
-! ଶିରୋନାମା ୨
-! ଶିରୋନାମା ୩
+! header 1
+! header 2
+! header 3
 |-
-| ଧାଡ଼ି ୧, କୋଷ ୧
-| ଧାଡ଼ି ୧, କୋଷ ୨
-| ଧାଡ଼ି ୧, କୋଷ ୩
+| row 1, cell 1
+| row 1, cell 2
+| row 1, cell 3
 |-
-| ଧାଡ଼ି ୨, କୋଷ ୧
-| ଧାଡ଼ି ୨, କୋଷ ୨
-| ଧାଡ଼ି ୨, କୋଷ ୩',
-	'wikieditor-toolbar-tool-table-example-cell-text' => 'କୋଷ ଲେଖା',
-	'wikieditor-toolbar-tool-table-example-header' => 'ଶିରୋନାମା ଲେଖା',
-	'wikieditor-toolbar-tool-table-title' => 'ସାରଣିଟିଏ ପୁରାନ୍ତୁ',
+| row 2, cell 1
+| row 2, cell 2
+| row 2, cell 3',
+	'wikieditor-toolbar-tool-table-example-cell-text' => 'Cell ଲେଖା',
+	'wikieditor-toolbar-tool-table-example-header' => 'ଶିରୋନାମ ଲେଖା',
+	'wikieditor-toolbar-tool-table-title' => 'ସାରଣୀଟିଏ ଭରନ୍ତୁ [Insert table]',
 	'wikieditor-toolbar-tool-table-dimensions-rows' => 'ଧାଡ଼ି',
 	'wikieditor-toolbar-tool-table-dimensions-columns' => 'ସ୍ତମ୍ଭସବୁ',
-	'wikieditor-toolbar-tool-table-dimensions-header' => 'ଉପର ଶିରୋନାମା ଧାଡ଼ି',
+	'wikieditor-toolbar-tool-table-dimensions-header' => 'ଉପର ଶିରୋନାମ ଧାଡ଼ି',
 	'wikieditor-toolbar-tool-table-wikitable' => 'ସୀମା ସହିତ ସଜାଣି',
-	'wikieditor-toolbar-tool-table-sortable' => 'ଶ୍ରେଣୀ ଅନୁସାରେ ସାରଣି ତିଆରି କରିବେ',
+	'wikieditor-toolbar-tool-table-sortable' => 'ଶ୍ରେଣୀ ଅନୁସାରେ ସାରଣୀ ଗଢ଼ିବେ',
 	'wikieditor-toolbar-tool-table-example' => 'ଉଦାହରଣ',
-	'wikieditor-toolbar-tool-table-preview' => 'ସାଇତା ଆଗରୁ ଦେଖଣା',
+	'wikieditor-toolbar-tool-table-preview' => 'ସାଇତିବା ଆଗରୁ ଦେଖଣା',
 	'wikieditor-toolbar-tool-table-insert' => 'ଭରିବେ',
 	'wikieditor-toolbar-tool-table-cancel' => 'ନାକଚ',
-	'wikieditor-toolbar-tool-table-toomany' => 'ଏହି ଆଦେଶରେ 1000 ରୁ ଅଧିକ କୋଷ ଥିବା ସାରଣୀ ପୁରାଇବା ସମ୍ଭବପର ନୁହେଁ ।',
-	'wikieditor-toolbar-tool-table-invalidnumber' => 'ଆପଣ ଏକ ସଠିକ ଧାଡ଼ି ଓ ସ୍ତମ୍ଭ ସଂଖ୍ୟା ଦେଇ ନାହାନ୍ତି ।',
-	'wikieditor-toolbar-tool-table-zero' => 'ଆପଣ କିଛି ଧାଡ଼ି ବ ସ୍ତମ୍ଭ ନଥାଇ ସାରଣୀଟିଏ ପୁରାଇପାରିବେ ନାହିଁ ।',
-	'wikieditor-toolbar-tool-replace' => 'ଖୋଜି ବଦଳାଇବେ',
-	'wikieditor-toolbar-tool-replace-title' => 'ଖୋଜି ବଦଳାଇବେ',
+	'wikieditor-toolbar-tool-table-toomany' => 'ଏହି ଡାଏଲଗରେ ୧୦୦୦ ରୁ ଅଧିକ କୋଷ ଥିବା ସାରଣୀ ପୁରାଇବା ସମ୍ଭବପର ନୁହେଁ ।',
+	'wikieditor-toolbar-tool-table-invalidnumber' => 'ଆପଣ ଏକ ସଠିକ ଧାଡ଼ି ଓ ସ୍ତମ୍ଭ ସଂଖ୍ୟା ଦେଇ ନାହାଁନ୍ତି ।',
+	'wikieditor-toolbar-tool-table-zero' => 'ଆପଣ କିଛି ଧାଡ଼ି ବା ସ୍ତମ୍ଭ ନଥାଇ ସାରଣୀଟିଏ ଭରିପାରିବେ ନାହିଁ ।',
+	'wikieditor-toolbar-tool-replace' => 'ଖୋଜିକରି ବଦଳାନ୍ତୁ',
+	'wikieditor-toolbar-tool-replace-title' => 'ଖୋଜି ବଦଳାନ୍ତୁ',
 	'wikieditor-toolbar-tool-replace-search' => 'ଖୋଜିବେ:',
 	'wikieditor-toolbar-tool-replace-replace' => 'ପ୍ରତିବଦଳ:',
-	'wikieditor-toolbar-tool-replace-case' => 'ବଡ଼ ଛୋଟ ଅକ୍ଷର ମେଳାଇବେ',
-	'wikieditor-toolbar-tool-replace-regex' => 'ଏକ ସାଧାରଣ ଦେଖଣା ଭାବରେ ପ୍ରଶ୍ନଟି ଖୋଜିବେ',
+	'wikieditor-toolbar-tool-replace-case' => 'ଛୋଟ ବଡ଼ ଅକ୍ଷର ମେଳାନ୍ତୁ',
+	'wikieditor-toolbar-tool-replace-regex' => 'ଏକ ରେଗୁଲାର ଏକ୍ସପ୍ରେସନ ଭାବରେ ପ୍ରଶ୍ନଟି ଖୋଜନ୍ତୁ',
 	'wikieditor-toolbar-tool-replace-button-findnext' => 'ଆଗାମୀ ଖୋଜିବେ',
 	'wikieditor-toolbar-tool-replace-button-replace' => 'ପ୍ରତିବଦଳ',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'ସବୁ ବଦଳାଇବେ',
 	'wikieditor-toolbar-tool-replace-close' => 'ବନ୍ଦ କରିବେ',
-	'wikieditor-toolbar-tool-replace-nomatch' => 'ଆପଣଙ୍କ ଖୋଜା କାହା ସଙ୍ଗେ ମେଳ ଖାଇଲା ନାହିଁ',
-	'wikieditor-toolbar-tool-replace-success' => '!$1 {{PLURAL:$1|ପ୍ରତିବଦଳ|ପ୍ରତିବଦଳଗୁଡିକ}} କରାଗଲା ।',
-	'wikieditor-toolbar-tool-replace-emptysearch' => 'ଆପଣ କିଛି ଖୋଜିବା ପାଇଁ ଦେଇନାହାନ୍ତି ।',
-	'wikieditor-toolbar-tool-replace-invalidregex' => 'ଆପଣ ଦେଇଥିବା ନିୟମିତ ଅଭିବ୍ୟକ୍ତି ଅବୈଧ ଅଟେ : $1',
+	'wikieditor-toolbar-tool-replace-nomatch' => 'ଆପଣଙ୍କ ଖୋଜା କାହା ସଙ୍ଗେ ମେଳ ହେଲାନାହିଁ ।',
+	'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|ପ୍ରତିବଦଳ|ପ୍ରତିବଦଳମାନ}} କରାଗଲା ।',
+	'wikieditor-toolbar-tool-replace-emptysearch' => 'ଆପଣ କିଛି ଖୋଜିନାହାଁନ୍ତି ।',
+	'wikieditor-toolbar-tool-replace-invalidregex' => 'ଆପଣ ଦେଇଥିବା ରେଗୁଲାର ଏକ୍ସ‌ପ୍ରେସନ‌ଟି ଭୁଲ: $1',
 	'wikieditor-toolbar-section-characters' => 'ବିଶେଷ ସଙ୍କେତ',
 	'wikieditor-toolbar-characters-page-latin' => 'ଲାଟିନ',
 	'wikieditor-toolbar-characters-page-latinextended' => 'ଲାଟିନ ଅଧିକ ଅକ୍ଷର',
 	'wikieditor-toolbar-characters-page-ipa' => 'IPA',
 	'wikieditor-toolbar-characters-page-symbols' => 'ସଙ୍କେତ',
-	'wikieditor-toolbar-characters-page-greek' => 'ଗ୍ରିକ',
+	'wikieditor-toolbar-characters-page-greek' => 'ଗ୍ରୀକ',
 	'wikieditor-toolbar-characters-page-cyrillic' => 'ସିରିଲିକ',
 	'wikieditor-toolbar-characters-page-arabic' => 'ଆରବୀ',
-	'wikieditor-toolbar-characters-page-arabicextended' => 'ଆରବିକ ଅଧିକ ଅକ୍ଷର',
-	'wikieditor-toolbar-characters-page-persian' => 'ପାରସିକ',
-	'wikieditor-toolbar-characters-page-hebrew' => 'ହିବୁରୁ',
+	'wikieditor-toolbar-characters-page-arabicextended' => 'ଆରବୀ ଅଧିକ ଅକ୍ଷର',
+	'wikieditor-toolbar-characters-page-persian' => 'ପାରସୀକ',
+	'wikieditor-toolbar-characters-page-hebrew' => 'ହିବ୍ରୁ',
 	'wikieditor-toolbar-characters-page-bangla' => 'ବଙ୍ଗଳା',
 	'wikieditor-toolbar-characters-page-tamil' => 'ତାମିଲ',
 	'wikieditor-toolbar-characters-page-telugu' => 'ତେଲୁଗୁ',
-	'wikieditor-toolbar-characters-page-sinhala' => 'ସିଂହଳି',
-	'wikieditor-toolbar-characters-page-gujarati' => 'ଗୁଜୁରାଟି',
+	'wikieditor-toolbar-characters-page-sinhala' => 'ସିଂହଳୀ',
+	'wikieditor-toolbar-characters-page-gujarati' => 'ଗୁଜୁରାଟୀ',
 	'wikieditor-toolbar-characters-page-devanagari' => 'ଦେବନାଗରୀ',
 	'wikieditor-toolbar-characters-page-thai' => 'ଥାଇ',
 	'wikieditor-toolbar-characters-page-lao' => 'ଲାଓ',
-	'wikieditor-toolbar-characters-page-khmer' => 'କମେର ଭାଷା',
+	'wikieditor-toolbar-characters-page-khmer' => 'ଖମେର ଭାଷା',
 	'wikieditor-toolbar-characters-endash' => 'en ଡ୍ୟାସ',
-	'wikieditor-toolbar-characters-emdash' => 'em ଡ୍ୟାସ',
-	'wikieditor-toolbar-characters-minus' => 'ମିନୁଗୁଡିକର ଚିହ୍ନ',
-	'wikieditor-toolbar-section-help' => 'ସହଯୋଗ',
-	'wikieditor-toolbar-help-heading-description' => 'ବିବରଣୀ',
-	'wikieditor-toolbar-help-heading-syntax' => 'ଆପଣ କଣ ଟାଇପ କରିବେ',
-	'wikieditor-toolbar-help-heading-result' => 'ଆପଣ କଣ ପାଇବେ',
-	'wikieditor-toolbar-help-page-format' => 'ସଜାଣି',
+	'wikieditor-toolbar-characters-emdash' => 'em dash',
+	'wikieditor-toolbar-characters-minus' => 'ମେନୁଗୁଡିକର ଚିହ୍ନ',
+	'wikieditor-toolbar-section-help' => 'ସହଯୋଗ (Help)',
+	'wikieditor-toolbar-help-heading-description' => 'ବର୍ଣ୍ଣନା',
+	'wikieditor-toolbar-help-heading-syntax' => 'ଆପଣ ଯାହା ଟାଇପ କରିବେ',
+	'wikieditor-toolbar-help-heading-result' => 'ଆପଣ ଯାହା ଦେଖିବେ',
+	'wikieditor-toolbar-help-page-format' => 'ଫରମାଟିଂ',
 	'wikieditor-toolbar-help-page-link' => 'ଲିଙ୍କ',
-	'wikieditor-toolbar-help-page-heading' => 'ଶିରୋନାମା',
+	'wikieditor-toolbar-help-page-heading' => 'ଶିରୋନାମ',
 	'wikieditor-toolbar-help-page-list' => 'ତାଲିକା',
 	'wikieditor-toolbar-help-page-file' => 'ଫାଇଲ',
 	'wikieditor-toolbar-help-page-reference' => 'ଆଧାର',
 	'wikieditor-toolbar-help-page-discussion' => 'ଆଲୋଚନା',
-	'wikieditor-toolbar-help-content-italic-description' => 'ତେରେଛା',
-	'wikieditor-toolbar-help-content-italic-syntax' => "''ତେରେଛା ଲେଖା''",
-	'wikieditor-toolbar-help-content-italic-result' => '<em>ତେରେଛା ଲେଖା</em>',
-	'wikieditor-toolbar-help-content-bold-description' => 'ମୋଟା ଅକ୍ଷର',
-	'wikieditor-toolbar-help-content-bold-syntax' => "'''ମୋଟା ଅକ୍ଷର'''",
-	'wikieditor-toolbar-help-content-bold-result' => '<strong>ମୋଟା ଲେଖା</strong>',
-	'wikieditor-toolbar-help-content-bolditalic-description' => 'ମୋଟା ଓ ତେରେଛା',
-	'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''ମୋଟା ଓ ତେରେଛା ଅକ୍ଷର'''''",
-	'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>ମୋଟା ଓ ତେରେଛା ଅକ୍ଷର</em></strong>',
-	'wikieditor-toolbar-help-content-ilink-description' => 'ଭିତର ଲିଙ୍କ',
-	'wikieditor-toolbar-help-content-ilink-syntax' => '[[ପୃଷ୍ଠା ନାମ|ଲିଙ୍କ ନାମ]]<br />[[ପୃଷ୍ଠା ନାମ]]',
-	'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>ଲିଙ୍କ ନାମ</a><br /><a href='#'>ପୃଷ୍ଠା ନାମ</a>",
+	'wikieditor-toolbar-help-content-italic-description' => 'Italic',
+	'wikieditor-toolbar-help-content-italic-syntax' => "''Italic text''",
+	'wikieditor-toolbar-help-content-italic-result' => '<em>Italic text</em>',
+	'wikieditor-toolbar-help-content-bold-description' => 'Bold',
+	'wikieditor-toolbar-help-content-bold-syntax' => "'''Bold text'''",
+	'wikieditor-toolbar-help-content-bold-result' => '<strong>Bold text</strong>',
+	'wikieditor-toolbar-help-content-bolditalic-description' => 'Bold &amp; italic',
+	'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''Bold &amp; italic text'''''",
+	'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>Bold &amp; italic text</em></strong>',
+	'wikieditor-toolbar-help-content-ilink-description' => 'ଇଣ୍ଟରନାଲ ଲିଙ୍କ',
+	'wikieditor-toolbar-help-content-ilink-syntax' => '[[Page title|Link label]]<br />[[Page title]]',
+	'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>Link label</a><br /><a href='#'>ପୃଷ୍ଠାର ନାମ</a>",
 	'wikieditor-toolbar-help-content-xlink-description' => 'ବାହାର ଲିଙ୍କ',
-	'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org ଲିଙ୍କ ନାମ]<br />[http://www.example.org]<br />http://www.example.org',
+	'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org Link label]<br />[http://www.example.org]<br />http://www.example.org',
 	'wikieditor-toolbar-help-content-xlink-result' => "<a href='#' class='ବାହାର'>ଲିଙ୍କ ନାମ</a><br /><a href='#' class='external autonumber'>[1]</a><br /><a href='#' class='ବାହାର'>http://www.example.org</a>",
-	'wikieditor-toolbar-help-content-heading2-description' => '୨ୟ ସ୍ତରର ଶିରୋନାମା',
-	'wikieditor-toolbar-help-content-heading2-syntax' => '== ଶିରୋନାମା ==',
-	'wikieditor-toolbar-help-content-heading2-result' => '<h2>ଶିରୋନାମା ଲେଖା</h2>',
-	'wikieditor-toolbar-help-content-heading3-description' => '୩ୟ ସ୍ତରର ଶିରୋନାମା',
-	'wikieditor-toolbar-help-content-heading3-syntax' => '=== ଶିରୋନାମା ===',
-	'wikieditor-toolbar-help-content-heading3-result' => '<h3>ଶିରୋନାମା ଲେଖା</h3>',
-	'wikieditor-toolbar-help-content-heading4-description' => '୪ର୍ଥ ସ୍ତରର ଶିରୋନାମା',
-	'wikieditor-toolbar-help-content-heading4-syntax' => '==== ଶିରୋନାମା ====',
-	'wikieditor-toolbar-help-content-heading4-result' => '<h4>ଶିରୋନାମା ଲେଖା</h4>',
-	'wikieditor-toolbar-help-content-heading5-description' => '୫ମ ସ୍ତରର ଶିରୋନାମା',
-	'wikieditor-toolbar-help-content-heading5-syntax' => '===== ଶିରୋନାମା =====',
-	'wikieditor-toolbar-help-content-heading5-result' => '<h5>ଶିରୋନାମା ଲେଖା</h5>',
+	'wikieditor-toolbar-help-content-heading2-description' => '୨ୟ ସ୍ତରର ଶିରୋନାମ',
+	'wikieditor-toolbar-help-content-heading2-syntax' => '== ଶିରୋନାମ ==',
+	'wikieditor-toolbar-help-content-heading2-result' => '<h2>ଶିରୋନାମ ଲେଖା</h2>',
+	'wikieditor-toolbar-help-content-heading3-description' => '୩ୟ ସୋପାନର ଶିରୋନାମ',
+	'wikieditor-toolbar-help-content-heading3-syntax' => '=== ଶିରୋନାମ ===',
+	'wikieditor-toolbar-help-content-heading3-result' => '<h3>ଶିରୋନାମ ଲେଖା</h3>',
+	'wikieditor-toolbar-help-content-heading4-description' => '୪ର୍ଥ ସୋପାନର ଶିରୋନାମ',
+	'wikieditor-toolbar-help-content-heading4-syntax' => '==== ଶିରୋନାମ ଲେଖା ====',
+	'wikieditor-toolbar-help-content-heading4-result' => '<h4>ଶିରୋନାମ ଲେଖା</h4>',
+	'wikieditor-toolbar-help-content-heading5-description' => '୫ମ ସୋପାନର ଶିରୋନାମ',
+	'wikieditor-toolbar-help-content-heading5-syntax' => '===== ଶିରୋନାମ =====',
+	'wikieditor-toolbar-help-content-heading5-result' => '<h5>ଶିରୋନାମ ଲେଖା</h5>',
 	'wikieditor-toolbar-help-content-ulist-description' => 'ବିନ୍ଦୁ ଦିଆ ତାଲିକା',
-	'wikieditor-toolbar-help-content-ulist-syntax' => '* ତାଲିକା ଚିଜ<br />* ତାଲିକା ଚିଜ',
-	'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>ତାଲିକା ଚିଜ</li><li>ତାଲିକା ଚିଜ</li></ul>',
+	'wikieditor-toolbar-help-content-ulist-syntax' => '* ତାଲିକା ବସ୍ତୁ<br />* ତାଲିକା ବସ୍ତୁ',
+	'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>ତାଲିକା ବସ୍ତୁ</li><li>ତାଲିକା ବସ୍ତୁ</li></ul>',
 	'wikieditor-toolbar-help-content-olist-description' => 'ସଂଖ୍ୟାଦିଆ ତାଲିକା',
-	'wikieditor-toolbar-help-content-olist-syntax' => '# ତାଲିକା ଚିଜ<br /># ତାଲିକା ଚିଜ',
-	'wikieditor-toolbar-help-content-olist-result' => '<ol><li>ତାଲିକା ଚିଜ</li><li>ତାଲିକା ଚିଜ</li></ol>',
-	'wikieditor-toolbar-help-content-file-description' => 'ଏମବେଡ଼ ହୋଇ ଥିବା ଫାଇଲ',
-	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:ଉଦାହରଣ.png|thumb|ଶିରୋନାମା ଲେଖା]]',
-	'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='ଶିରୋନାମା ଲେଖା' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='ବଡ଼ କରିବେ' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>ଶିରୋନାମା ଲେଖା</div></div>",
+	'wikieditor-toolbar-help-content-olist-syntax' => '# ତାଲିକା ବସ୍ତୁ<br /># ତାଲିକା ବସ୍ତୁ',
+	'wikieditor-toolbar-help-content-olist-result' => '<ol><li>ତାଲିକା ବସ୍ତୁ</li><li>ତାଲିକା ବସ୍ତୁ</li></ol>',
+	'wikieditor-toolbar-help-content-file-description' => 'ଏମବେଡ଼ ହୋଇଥିବା ଫାଇଲ',
+	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Caption text]]',
+	'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='ଶିରୋନାମ ଲେଖା' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='ବଢ଼ାଇବେ' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>ଶିରୋନାମ ଲେଖା</div></div>",
 	'wikieditor-toolbar-help-content-reference-description' => 'ଆଧାର',
-	'wikieditor-toolbar-help-content-reference-syntax' => 'ପୃଷ୍ଠା ଲେଖା.&lt;ref name="test"&gt;[http://www.example.org Link text], ଅତିରିକ୍ତ ଲେଖା ।&lt;/ref&gt;',
+	'wikieditor-toolbar-help-content-reference-syntax' => 'Page text.&lt;ref name="test"&gt;[http://www.example.org Link text], additional text.&lt;/ref&gt;',
 	'wikieditor-toolbar-help-content-reference-result' => "ପୃଷ୍ଠା ଲେଖା ।<sup><a href='#'>[1]</a></sup>",
-	'wikieditor-toolbar-help-content-rereference-description' => 'ଏକ ଆଧାରର ଅତିରିକ୍ତ ବ୍ୟବହାର',
+	'wikieditor-toolbar-help-content-rereference-description' => 'ଏକ ଆଧାରର ଅଧିକ ବ୍ୟବହାର',
 	'wikieditor-toolbar-help-content-rereference-result' => "ପୃଷ୍ଠା ଲେଖା ।<sup><a href='#'>[1]</a></sup>",
-	'wikieditor-toolbar-help-content-showreferences-description' => 'ଦେଖଣା ଆଧାରସମୂହ',
-	'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Link text</a>, ଅଧିକ ବିବରଣୀ ।</li></ol>",
-	'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'ସନ୍ତକ ସହିତ ସମୟଚିହ୍ନ',
-	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>ଇଉଜର ନାମ</a> (<a href='#' title='{{#special:mytalk}}'>ଆଲୋଚନା</a>) 15:54, 10 June 2009 (UTC)",
-	'wikieditor-toolbar-help-content-signature-description' => 'ସନ୍ତକ',
-	'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>ଇଉଜର ନାମ</a> (<a href='#' title='{{#special:mytalk}}'>ଆଲୋଚନା</a>)",
+	'wikieditor-toolbar-help-content-showreferences-description' => 'ଡିସ‌ପ୍ଲେ ଆଧାରସମୂହ',
+	'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Link text</a>, ଅଧିକ ଲେଖା ।</li></ol>",
+	'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'ସନ୍ତକ ଓ ସମୟଚିହ୍ନ (Signature with timestamp)',
+	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Username</a> (<a href='#' title='{{#special:mytalk}}'>talk</a>) 15:54, 10 June 2009 (UTC)",
+	'wikieditor-toolbar-help-content-signature-description' => 'ସନ୍ତକ (Signature)',
+	'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>Username</a> (<a href='#' title='{{#special:mytalk}}'>talk</a>)",
 	'wikieditor-toolbar-help-content-indent-description' => 'ଅନୁଚ୍ଛେଦ ଛାଡ଼',
 	'wikieditor-toolbar-help-content-indent-syntax' => 'ସାଧାରଣ ଲେଖା<br />:ମାର୍ଜିନ ଦିଆ ଲେଖା<br />::ମାର୍ଜିନ ଦିଆ ଲେଖା',
-	'wikieditor-toolbar-help-content-indent-result' => 'ସାଧାରଣ ଲେଖା<dl><dd>ମାର୍ଜିନ ଦିଆ ଲେଖା<dl><dd>ମାର୍ଜିନ ଦିଆ ଲେଖା</dd></dl></dd></dl>',
+	'wikieditor-toolbar-help-content-indent-result' => 'Normal text<dl><dd>Indented text<dl><dd>Indented text</dd></dl></dd></dl>',
 );
 
 /** Ossetic (Ирон)
@@ -20826,7 +21178,7 @@ $messages['os'] = array(
 	'wikieditor-toolbar' => 'Ивыны панель',
 	'wikieditor-toolbar-desc' => 'Æнцонгонд архайдимæ ивыны панель',
 	'wikieditor-toolbar-preference' => 'Хуыздæргонд ивыны панель баиу кæнын',
-	'wikieditor-toolbar-dialogs-preference' => 'Æрвитæн тыссын, таблицæ æмæ æндæрты диалогтæ баиу кæнын',
+	'wikieditor-toolbar-dialogs-preference' => 'Æрвитæн тыссын, таблицæ æмæ æндæрты диалогтæ баиу кæнын', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Къухæрфыст равзарæн сæйраг номдоны фæрстæй айсын',
 	'wikieditor-toolbar-loading' => 'Æвгæд цæуы...',
 	'wikieditor-toolbar-tool-bold' => 'Бæзджын',
@@ -21039,6 +21391,214 @@ $1:Example.jpg|Фыст2',
 	'wikieditor-toolbar-help-content-indent-result' => 'Нæуи текст<dl><dd>Хаст текст<dl><dd>Хаст текст</dd></dl></dd></dl>',
 );
 
+/** Punjabi (ਪੰਜਾਬੀ)
+ * @author Babanwalia
+ */
+$messages['pa'] = array(
+	'wikieditor-wikitext-tab' => 'ਵਿਕੀਲਿਖਤ',
+	'wikieditor-loading' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…',
+	'wikieditor-preview-tab' => 'ਝਲਕ',
+	'wikieditor-preview-changes-tab' => 'ਤਬਦੀਲੀਆਂ',
+	'wikieditor-preview-loading' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...',
+	'wikieditor-previewDialog-preference' => 'ਝਲਕ ਡੱਬਾ ਚਾਲੂ ਕਰੋ',
+	'wikieditor-previewDialog-tab' => 'ਝਲਕ',
+	'wikieditor-previewDialog-loading' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…',
+	'wikieditor-publish-preference' => 'ਕਦਮ ਦਰ ਕਦਮ ਛਾਪਾ ਚਾਲੂ ਕਰੋ',
+	'wikieditor-publish-button-publish' => 'ਛਾਪੋ',
+	'wikieditor-publish-button-cancel' => 'ਰੱਦ ਕਰੋ',
+	'wikieditor-publish-dialog-title' => "{{SITENAME}} 'ਤੇ ਛਾਪੋ",
+	'wikieditor-publish-dialog-summary' => 'ਸੋਧ ਸਾਰ (ਆਪਣੀਆਂ ਤਬਦੀਲੀਆਂ ਦੀ ਸੰਖੇਪ ਸਾਰ ਦਿਓ):',
+	'wikieditor-publish-dialog-minor' => 'ਛੋਟੀ ਸੋਧ',
+	'wikieditor-publish-dialog-watch' => 'ਇਹ ਸਫ਼ਾ ਵਾਚੋ',
+	'wikieditor-publish-dialog-publish' => 'ਛਾਪੋ',
+	'wikieditor-publish-dialog-goback' => 'ਪਿੱਛੇ ਜਾਓ',
+	'wikieditor-template-editor-preference' => 'ਵਿਕੀ ਫਰਮਿਆਂ ਦੀ ਫ਼ਾਰਮ-ਅਧਾਰਤ ਸੋਧ ਚਾਲੂ ਕਰੋ',
+	'wikieditor-template-editor-dialog-title' => 'ਫਰਮਾ ਸੋਧੋ',
+	'wikieditor-template-editor-dialog-submit' => 'ਅੱਪਡੇਟ',
+	'wikieditor-template-editor-dialog-cancel' => 'ਰੱਦ ਕਰੋ',
+	'wikieditor-templates-preference' => 'ਫਰਮੇ ਦਾ ਸਮੇਟਨਾ ਚਾਲੂ ਕਰੋ',
+	'wikieditor-toc-preference' => 'ਫੇਰੀਯੋਗ ਸਮੱਗਰੀ ਸਾਰਨੀ ਚਾਲੂ ਕਰੋ',
+	'wikieditor-toc-show' => 'ਸਮੱਗਰੀ ਵਿਖਾਓ',
+	'wikieditor-toc-hide' => 'ਸਮੱਗਰੀ ਲੁਕਾਓ',
+	'wikieditor-toolbar' => 'ਸੰਦਬਕਸਾ ਸੋਧਿਆ ਜਾ ਰਿਹਾ ਹੈ',
+	'wikieditor-toolbar-loading' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…',
+	'wikieditor-toolbar-tool-bold' => 'ਮੋਟੇ ਅੱਖਰਾਂ ਵਿਚ',
+	'wikieditor-toolbar-tool-bold-example' => 'ਮੋਟੀ ਲਿਖਤ',
+	'wikieditor-toolbar-tool-italic' => 'ਟੇਢਾ',
+	'wikieditor-toolbar-tool-italic-example' => 'ਟੇਢੀ ਲਿਖਤ',
+	'wikieditor-toolbar-tool-ilink' => 'ਅੰਦਰੂਨੀ ਕੜੀ',
+	'wikieditor-toolbar-tool-ilink-example' => 'ਕੜੀ ਦਾ ਸਿਰਲੇਖ',
+	'wikieditor-toolbar-tool-xlink' => 'ਬਾਹਰੀ ਕੜੀ (ਯਾਦ ਰੱਖੋ http:// prefix)',
+	'wikieditor-toolbar-tool-xlink-example' => 'http://www.example.com ਕੜੀ ਦਾ ਸਿਰਲੇਖ',
+	'wikieditor-toolbar-tool-link' => 'ਕੜੀ',
+	'wikieditor-toolbar-tool-link-title' => 'ਕੜੀ ਜੋੜੋ',
+	'wikieditor-toolbar-tool-link-int' => 'ਵਿਕੀ ਸਫ਼ੇ ਨਾਲ਼',
+	'wikieditor-toolbar-tool-link-int-target' => 'ਨਿਸ਼ਾਨਾਨੁਮਾ ਸਫ਼ਾ ਜਾਂ URL:',
+	'wikieditor-toolbar-tool-link-int-target-tooltip' => 'ਸਫ਼ੇ ਦਾ ਸਿਰਲੇਖ ਜਾਂ URL',
+	'wikieditor-toolbar-tool-link-int-text' => 'ਵਿਖਾਉਣ ਲਈ ਲਿਖਤ:',
+	'wikieditor-toolbar-tool-link-int-text-tooltip' => 'ਵਿਖਾਉਣ ਲਈ ਲਿਖਤ',
+	'wikieditor-toolbar-tool-link-ext' => 'ਬਾਹਰੀ ਵੈੱਬ ਸਫ਼ੇ ਵੱਲ',
+	'wikieditor-toolbar-tool-link-ext-target' => 'ਕੜੀ ਦਾ URL:',
+	'wikieditor-toolbar-tool-link-ext-text' => 'ਕੜੀ ਦੀ ਲਿਖਤ:',
+	'wikieditor-toolbar-tool-link-insert' => 'ਕੜੀ ਜੋੜੋ',
+	'wikieditor-toolbar-tool-link-cancel' => 'ਰੱਦ ਕਰੋ',
+	'wikieditor-toolbar-tool-link-int-target-status-exists' => 'ਸਫ਼ਾ ਮੌਜੂਦ ਹੈ',
+	'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'ਸਫ਼ਾ ਮੌਜੂਦ ਨਹੀਂ ਹੈ',
+	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ਗ਼ਲਤ ਸਿਰਲੇਖ',
+	'wikieditor-toolbar-tool-link-int-target-status-external' => 'ਬਾਹਰੀ ਕੜੀ',
+	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'ਸਫ਼ੇ ਦੀ ਮੌਜੂਦਗੀ ਚੈੱਕ ਹੋ ਰਹੀ ਹੈ...',
+	'wikieditor-toolbar-tool-link-int-invalid' => 'ਤੁਹਾਡਾ ਦੱਸਿਆ ਹੋਇਆ ਸਿਰਲੇਖ ਗ਼ਲਤ ਹੈ।',
+	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'ਅੰਦਰੂਨੀ ਕੜੀ',
+	'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'ਬਾਹਰੀ ਕੜੀ',
+	'wikieditor-toolbar-tool-link-empty' => 'ਤੁਸੀਂ ਕੁਝ ਜੋੜਨ ਲਈ ਭਰਿਆ ਹੀ ਨਹੀਂ।',
+	'wikieditor-toolbar-tool-file-example' => 'ਮਿਸਾਲ.jpg',
+	'wikieditor-toolbar-tool-file-title' => 'ਫ਼ਾਈਲ ਜੋੜੋ',
+	'wikieditor-toolbar-file-target' => 'ਫ਼ਾਈਲ ਦਾ ਨਾਂ:',
+	'wikieditor-toolbar-file-caption' => 'ਸਿਰਲੇਖ:',
+	'wikieditor-toolbar-file-size' => 'ਅਕਾਰ:',
+	'wikieditor-toolbar-file-float' => 'ਪੰਗਤ:',
+	'wikieditor-toolbar-file-default' => '(ਮੂਲ)',
+	'wikieditor-toolbar-file-format' => 'ਰੂਪ:',
+	'wikieditor-toolbar-file-format-none' => 'ਕੋਈ ਨਹੀਂ',
+	'wikieditor-toolbar-tool-file-insert' => 'ਜੋੜੋ',
+	'wikieditor-toolbar-tool-file-cancel' => 'ਰੱਦ ਕਰੋ',
+	'wikieditor-toolbar-tool-reference' => 'ਹਵਾਲਾ',
+	'wikieditor-toolbar-tool-reference-example' => 'ਪਗਨੋਟ ਦੀ ਲਿਖਤ ਇੱਥੇ ਭਰੋ',
+	'wikieditor-toolbar-tool-reference-cancel' => 'ਰੱਦ ਕਰੋ',
+	'wikieditor-toolbar-tool-reference-title' => 'ਹਵਾਲਾ ਜੋੜੋ',
+	'wikieditor-toolbar-tool-reference-insert' => 'ਜੋੜੋ',
+	'wikieditor-toolbar-tool-reference-text' => 'ਹਵਾਲੇ ਦੀ ਲਿਖਤ',
+	'wikieditor-toolbar-tool-signature' => 'ਦਸਤਖ਼ਤ ਅਤੇ ਸਮੇਂ ਦੀ ਮੋਹਰ',
+	'wikieditor-toolbar-section-advanced' => 'ਉੱਨਤ',
+	'wikieditor-toolbar-tool-heading' => 'ਸਿਰਨਾਵਾਂ',
+	'wikieditor-toolbar-tool-heading-1' => 'ਪੱਧਰ ੧',
+	'wikieditor-toolbar-tool-heading-2' => 'ਪੱਧਰ ੨',
+	'wikieditor-toolbar-tool-heading-3' => 'ਪੱਧਰ ੩',
+	'wikieditor-toolbar-tool-heading-4' => 'ਪੱਧਰ ੪',
+	'wikieditor-toolbar-tool-heading-5' => 'ਪੱਧਰ ੫',
+	'wikieditor-toolbar-tool-heading-example' => 'ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ',
+	'wikieditor-toolbar-group-format' => 'ਰੂਪ',
+	'wikieditor-toolbar-tool-ulist' => 'ਨਿਸ਼ਾਨਦਾਇਕ ਸੂਚੀ',
+	'wikieditor-toolbar-tool-ulist-example' => 'ਨਿਸ਼ਾਨਦਾਇਕ ਸੂਚੀ ਦੀ ਵਸਤੂ',
+	'wikieditor-toolbar-tool-olist' => 'ਗਿਣਤੀਦਾਇਕ ਸੂਚੀ',
+	'wikieditor-toolbar-tool-olist-example' => 'ਗਿਣਤੀਦਾਇਕ ਸੂਚੀ ਦੀ ਵਸਤੂ',
+	'wikieditor-toolbar-tool-indent' => 'ਹਾਸ਼ੀਆ',
+	'wikieditor-toolbar-tool-indent-example' => 'ਹਾਸ਼ੀਆਈ ਰੇਖਾ',
+	'wikieditor-toolbar-tool-nowiki' => 'ਕੋਈ ਵਿਕੀ ਰੂਪਕਰਨ ਨਹੀਂ',
+	'wikieditor-toolbar-tool-nowiki-example' => 'ਇੱਥੇ ਗ਼ੈਰ-ਰੂਪਕਿਰਤ ਲਿਖਤ ਭਰੋ',
+	'wikieditor-toolbar-tool-redirect' => 'ਮੁੜ-ਦਿਸ਼ਾ',
+	'wikieditor-toolbar-tool-redirect-example' => 'ਨਿਸ਼ਾਨਾਨੁਮਾ ਸਫ਼ੇ ਦਾ ਨਾਂ',
+	'wikieditor-toolbar-tool-big' => 'ਵੱਡਾ',
+	'wikieditor-toolbar-tool-big-example' => 'ਵੱਡੀ ਲਿਖਤ',
+	'wikieditor-toolbar-tool-small' => 'ਛੋਟਾ',
+	'wikieditor-toolbar-tool-small-example' => 'ਛੋਟੀ ਲਿਖਤ',
+	'wikieditor-toolbar-tool-superscript' => 'ਉਤਲੀ ਲਿਖਤ',
+	'wikieditor-toolbar-tool-superscript-example' => 'ਉਤਲੀ ਲਿਖਤ',
+	'wikieditor-toolbar-tool-subscript' => 'ਹੇਠਲੀ ਲਿਖਤ',
+	'wikieditor-toolbar-tool-subscript-example' => 'ਹੇਠਲੀ ਲਿਖਤ',
+	'wikieditor-toolbar-group-insert' => 'ਜੋੜੋ',
+	'wikieditor-toolbar-tool-gallery' => 'ਤਸਵੀਰਾਂ ਦੀ ਗੈਲਰੀ',
+	'wikieditor-toolbar-tool-gallery-example' => '$1:ਮਿਸਾਲ.jpg|ਸਿਰਲੇਖ੧
+$1:ਮਿਸਾਲ.jpg|ਸਿਰਲੇਖ੨',
+	'wikieditor-toolbar-tool-newline' => 'ਨਵੀਂ ਲਾਈਨ',
+	'wikieditor-toolbar-tool-table' => 'ਸਾਰਨੀ',
+	'wikieditor-toolbar-tool-table-example-header' => 'ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ',
+	'wikieditor-toolbar-tool-table-title' => 'ਸਾਰਨੀ ਜੋੜੋ',
+	'wikieditor-toolbar-tool-table-dimensions-rows' => 'ਕਤਾਰਾਂ',
+	'wikieditor-toolbar-tool-table-dimensions-columns' => 'ਕਾਲਮ',
+	'wikieditor-toolbar-tool-table-dimensions-header' => 'ਸਿਰਨਾਵੇਂ ਦੀ ਕਤਾਰ ਜੋੜੋ',
+	'wikieditor-toolbar-tool-table-example' => 'ਮਿਸਾਲ',
+	'wikieditor-toolbar-tool-table-preview' => 'ਝਲਕ',
+	'wikieditor-toolbar-tool-table-insert' => 'ਜੋੜੋ',
+	'wikieditor-toolbar-tool-table-cancel' => 'ਰੱਦ ਕਰੋ',
+	'wikieditor-toolbar-tool-table-invalidnumber' => 'ਤੁਸੀਂ ਕਤਾਰਾਂ ਜਾਂ ਕਾਲਮਾਂ ਦੀ ਸਹੀ ਗਿਣਤੀ ਨਹੀਂ ਭਰੀ ਹੈ।',
+	'wikieditor-toolbar-tool-table-zero' => 'ਤੁਸੀਂ ਸਿਫ਼ਰ ਕਤਾਰਾਂ ਜਾਂ ਕਾਲਮਾਂ ਵਾਲੀ ਸਾਰਨੀ ਨਹੀਂ ਬਣਾ ਸਕਦੇ।',
+	'wikieditor-toolbar-tool-replace' => 'ਖੋਜੋ ਅਤੇ ਵਾਪਸ ਰੱਖੋ',
+	'wikieditor-toolbar-tool-replace-title' => 'ਖੋਜੋ ਅਤੇ ਵਾਪਸ ਰੱਖੋ',
+	'wikieditor-toolbar-tool-replace-search' => 'ਖੋਜੋ:',
+	'wikieditor-toolbar-tool-replace-button-findnext' => 'ਅਗਲਾ ਲੱਭੋ',
+	'wikieditor-toolbar-tool-replace-close' => 'ਬੰਦ ਕਰੋ',
+	'wikieditor-toolbar-tool-replace-nomatch' => 'ਤੁਹਾਡੀ ਖੋਜ ਨੇ ਕਿਸੇ ਨਾਲ਼ ਮੇਲ ਨਹੀਂ ਖਾਧਾ।',
+	'wikieditor-toolbar-tool-replace-emptysearch' => 'ਤੁਸੀਂ ਲੱਭਣ ਲਈ ਕੁਝ ਨਹੀਂ ਭਰਿਆ।',
+	'wikieditor-toolbar-section-characters' => 'ਖ਼ਾਸ ਚਿੰਨ੍ਹ',
+	'wikieditor-toolbar-characters-page-latin' => 'ਲਾਤੀਨੀ',
+	'wikieditor-toolbar-characters-page-latinextended' => 'ਲਾਤੀਨੀ ਤੋਂ ਛੁੱਟ',
+	'wikieditor-toolbar-characters-page-ipa' => 'ਆਈ੦ਪੀ੦ਏ',
+	'wikieditor-toolbar-characters-page-symbols' => 'ਨਿਸ਼ਾਨ',
+	'wikieditor-toolbar-characters-page-greek' => 'ਯੂਨਾਨੀ',
+	'wikieditor-toolbar-characters-page-cyrillic' => 'ਸਿਰੀਲਿਕ',
+	'wikieditor-toolbar-characters-page-arabic' => 'ਅਰਬੀ',
+	'wikieditor-toolbar-characters-page-arabicextended' => 'ਅਰਬੀ ਵਿਸਥਾਰੀ',
+	'wikieditor-toolbar-characters-page-persian' => 'ਫ਼ਾਰਸੀ',
+	'wikieditor-toolbar-characters-page-hebrew' => 'ਹਿਬਰੂ',
+	'wikieditor-toolbar-characters-page-bangla' => 'ਬਾਂਗਲਾ',
+	'wikieditor-toolbar-characters-page-tamil' => 'ਤਾਮਿਲ',
+	'wikieditor-toolbar-characters-page-telugu' => 'ਤੇਲਗੂ',
+	'wikieditor-toolbar-characters-page-sinhala' => 'ਸਿਨਹਾਲਾ',
+	'wikieditor-toolbar-characters-page-gujarati' => 'ਗੁਜਰਾਤੀ',
+	'wikieditor-toolbar-characters-page-devanagari' => 'ਦੇਵਨਾਗਰੀ',
+	'wikieditor-toolbar-characters-page-thai' => 'ਥਾਈ',
+	'wikieditor-toolbar-characters-page-lao' => 'ਲਾਓ',
+	'wikieditor-toolbar-characters-page-khmer' => 'ਖ਼ਮੇਰ',
+	'wikieditor-toolbar-characters-endash' => 'ਅੰਗਰੇਜ਼ੀ ਡੈਸ਼',
+	'wikieditor-toolbar-characters-emdash' => 'em ਡੈਸ਼',
+	'wikieditor-toolbar-characters-minus' => 'ਘਟਾਓ ਦਾ ਨਿਸ਼ਾਨ',
+	'wikieditor-toolbar-section-help' => 'ਮਦਦ',
+	'wikieditor-toolbar-help-heading-description' => 'ਵੇਰਵਾ',
+	'wikieditor-toolbar-help-heading-syntax' => 'ਜੋ ਤੁਸੀਂ ਟਾਈਪ ਕਰਦੇ ਹੋ',
+	'wikieditor-toolbar-help-heading-result' => 'ਜੋ ਤੁਹਾਨੂੰ ਮਿਲਦਾ ਹੈ',
+	'wikieditor-toolbar-help-page-link' => 'ਕੜੀਆਂ',
+	'wikieditor-toolbar-help-page-heading' => 'ਸਿਰਨਾਵੇਂ',
+	'wikieditor-toolbar-help-page-list' => 'ਸੂਚੀਆਂ',
+	'wikieditor-toolbar-help-page-file' => 'ਫ਼ਾਈਲਾਂ',
+	'wikieditor-toolbar-help-page-reference' => 'ਹਵਾਲੇ',
+	'wikieditor-toolbar-help-page-discussion' => 'ਚਰਚਾ',
+	'wikieditor-toolbar-help-content-italic-description' => 'ਟੇਢਾ',
+	'wikieditor-toolbar-help-content-italic-syntax' => "''ਟੇਢੀ ਲਿਖਤ''",
+	'wikieditor-toolbar-help-content-italic-result' => '<em>ਟੇਢੀ ਲਿਖਤ</em>',
+	'wikieditor-toolbar-help-content-bold-description' => 'ਮੋਟਾ',
+	'wikieditor-toolbar-help-content-bold-syntax' => "'''ਮੋਟੀ ਲਿਖਤ'''",
+	'wikieditor-toolbar-help-content-bold-result' => '<strong>ਮੋਟੀ ਲਿਖਤ</strong>',
+	'wikieditor-toolbar-help-content-bolditalic-description' => 'ਮੋਟਾ &amp; ਟੇਢਾ',
+	'wikieditor-toolbar-help-content-bolditalic-syntax' => "'''''ਮੋਟੀ &amp; ਟੇਢੀ ਲਿਖਤ'''''",
+	'wikieditor-toolbar-help-content-bolditalic-result' => '<strong><em>ਮੋਟੀ &amp; ਟੇਢੀ ਲਿਖਤ</em></strong>',
+	'wikieditor-toolbar-help-content-ilink-description' => 'ਅੰਦਰੂਨੀ ਕੜੀ',
+	'wikieditor-toolbar-help-content-ilink-syntax' => '[[ਸਫ਼ਾ ਸਿਰਲੇਖ|ਕੜੀ ਲੇਬਲ]]<br />[[ਸਫ਼ਾ ਸਿਰਲੇਖ]]',
+	'wikieditor-toolbar-help-content-ilink-result' => "<a href='#'>ਕੜੀ ਲੇਬਲ</a><br /><a href='#'>ਸਫ਼ਾ ਸਿਰਲੇਖ</a>",
+	'wikieditor-toolbar-help-content-xlink-description' => 'ਬਾਹਰੀ ਕੜੀ',
+	'wikieditor-toolbar-help-content-xlink-syntax' => '[http://www.example.org ਕੜੀ ਲੇਬਲ]<br />[http://www.example.org]<br />http://www.example.org',
+	'wikieditor-toolbar-help-content-heading2-description' => 'ਦੂਜੇ ਪੱਧਰ ਦਾ ਸਿਰਨਾਵਾਂ',
+	'wikieditor-toolbar-help-content-heading2-syntax' => '== ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ ==',
+	'wikieditor-toolbar-help-content-heading2-result' => '<h2>ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ</h2>',
+	'wikieditor-toolbar-help-content-heading3-description' => 'ਤੀਜੇ ਪੱਧਰ ਦਾ ਸਿਰਨਾਵਾਂ',
+	'wikieditor-toolbar-help-content-heading3-syntax' => '=== ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ ===',
+	'wikieditor-toolbar-help-content-heading3-result' => '<h3>ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ</h3>',
+	'wikieditor-toolbar-help-content-heading4-description' => 'ਚੌਥੇ ਪੱਧਰ ਦਾ ਸਿਰਨਾਵਾਂ',
+	'wikieditor-toolbar-help-content-heading4-syntax' => '==== ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ ====',
+	'wikieditor-toolbar-help-content-heading4-result' => '<h4>ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ</h4>',
+	'wikieditor-toolbar-help-content-heading5-description' => '੫ਵੇਂ ਪੱਧਰ ਦਾ ਸਿਰਨਾਵਾਂ',
+	'wikieditor-toolbar-help-content-heading5-syntax' => '===== ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ =====',
+	'wikieditor-toolbar-help-content-heading5-result' => '<h5>ਸਿਰਨਾਵੇਂ ਦੀ ਲਿਖਤ</h5>',
+	'wikieditor-toolbar-help-content-ulist-description' => 'ਨਿਸ਼ਾਨਦਾਇਕ ਸੂਚੀ',
+	'wikieditor-toolbar-help-content-ulist-syntax' => '* ਸੂਚੀ ਦੀ ਵਸਤੂ<br />* ਸੂਚੀ ਦੀ ਵਸਤੂ',
+	'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>ਸੂਚੀ ਦੀ ਵਸਤੂ</li><li>ਸੂਚੀ ਦੀ ਵਸਤੂ</li></ul>',
+	'wikieditor-toolbar-help-content-olist-description' => 'ਗਿਣਤੀਦਾਇਕ ਸੂਚੀ',
+	'wikieditor-toolbar-help-content-olist-syntax' => '# ਸੂਚੀ ਦੀ ਵਸਤੂ<br /># ਸੂਚੀ ਦੀ ਵਸਤੂ',
+	'wikieditor-toolbar-help-content-olist-result' => '<ol><li>ਸੂਚੀ ਦੀ ਵਸਤੂ</li><li>ਸੂਚੀ ਦੀ ਵਸਤੂ</li></ol>',
+	'wikieditor-toolbar-help-content-reference-description' => 'ਹਵਾਲਾ',
+	'wikieditor-toolbar-help-content-reference-syntax' => 'ਸਫ਼ਾ ਲਿਖਤ।&lt;ref name="test"&gt;[http://www.example.org ਕੜੀ ਲਿਖਤ], ਵਧੀਕ ਲਿਖਤ।&lt;/ref&gt;',
+	'wikieditor-toolbar-help-content-reference-result' => "ਸਫ਼ਾ ਲਿਖਤ।<sup><a href='#'>[੧]</a></sup>",
+	'wikieditor-toolbar-help-content-rereference-description' => 'ਉਸੇ ਹਵਾਲੇ ਦੀ ਵਧੀਕ ਵਰਤੋਂ',
+	'wikieditor-toolbar-help-content-rereference-result' => "ਸਫ਼ੇ ਦੀ ਲਿਖਤ।<sup><a href='#'>[1]</a></sup>",
+	'wikieditor-toolbar-help-content-showreferences-description' => 'ਹਵਾਲੇ ਵਿਖਾਓ',
+	'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>ਕੜੀ ਲਿਖਤ</a>, ਵਧੀਕ ਲਿਖਤ।</li></ol>",
+	'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'ਸਮੇਂ ਦੀ ਮੋਹਰ ਸਮੇਤ ਦਸਤਖ਼ਤ',
+	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>ਵਰਤੋਂਕਾਰ ਨਾਂ</a> (<a href='#' title='{{#special:mytalk}}'>talk</a>) ੧੫:੫੪, ੧੦ ਜੂਨ ੨੦੦੯ (ਯੂਟੀਸੀ)",
+	'wikieditor-toolbar-help-content-signature-description' => 'ਦਸਤਖ਼ਤ',
+	'wikieditor-toolbar-help-content-signature-result' => "<a href='#' title='{{#special:mypage}}'>ਵਰਤੋਂਕਾਰ ਨਾਂ</a> (<a href='#' title='{{#special:mytalk}}'>ਗੱਲਬਾਤ</a>)",
+	'wikieditor-toolbar-help-content-indent-description' => 'ਹਾਸ਼ੀਏ ਤੋਂ ਦੂਰ',
+);
+
 /** Deitsch (Deitsch)
  * @author Xqt
  */
@@ -21177,7 +21737,7 @@ $messages['pl'] = array(
 	'wikieditor-toolbar' => 'Pasek narzędzi edycyjnych',
 	'wikieditor-toolbar-desc' => 'Ułatwiający pracę pasek narzędzi edycyjnych',
 	'wikieditor-toolbar-preference' => 'Włącz rozszerzony pasek narzędzi edycyjnych',
-	'wikieditor-toolbar-dialogs-preference' => 'Włącz okienka dodawania linków, tabel itp.',
+	'wikieditor-toolbar-dialogs-preference' => 'Włącz kreatory dodawania linków, tabel itp.',
 	'wikieditor-toolbar-hidesig' => 'Ukryj przycisk podpisu na stronach głównej przestrzeni nazw',
 	'wikieditor-toolbar-loading' => 'Ładowanie...',
 	'wikieditor-toolbar-tool-bold' => 'Wytłuszczenie',
@@ -21205,6 +21765,7 @@ $messages['pl'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Nieprawidłowy tytuł',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Link zewnętrzny',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Sprawdzanie czy strona istnieje…',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Strona ujednoznaczniająca',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Wprowadzony tytuł jest nieprawidłowy.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Podany URL wygląda jak link do innej strony wiki. Czy chcesz, aby był to link wewnętrzny?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Link wewnętrzny',
@@ -21426,7 +21987,7 @@ $messages['pms'] = array(
 	'wikieditor-toolbar' => "Bara d'utiss ëd modìfica",
 	'wikieditor-toolbar-desc' => "Bara d'utiss ëd modìfica con dovrabilità ameliorà",
 	'wikieditor-toolbar-preference' => "Ativé la bara d'utiss ameliorà",
-	'wikieditor-toolbar-dialogs-preference' => "Ativé ij quàder ëd diàlogh për anserì anliure, tàule e d'àutr",
+	'wikieditor-toolbar-dialogs-preference' => "Ativé j'assistent për gionté dle anliure, dle tàule e ëdcò la fonsion d'arserca e rampiass",
 	'wikieditor-toolbar-hidesig' => 'Stërmé ël boton ëd firma ant le pàgine ëd lë spassi nominal prinsipal',
 	'wikieditor-toolbar-loading' => 'Cariament...',
 	'wikieditor-toolbar-tool-bold' => 'Grassèt',
@@ -21454,6 +22015,7 @@ $messages['pms'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Tìtol nen vàlid',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Anliura esterna',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => "Verìfica ëd l'esistensa dla pàgina...",
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => "Pàgina d'omonimìa",
 	'wikieditor-toolbar-tool-link-int-invalid' => "Ël tìtol ch'a l'ha spessificà a va pa bin.",
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => "L'URL ch'a l'ha spessificà a smijërìa n'anliura a n'àutra pàgina wiki. Veul-lo fene n'anliura anterna?",
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Anliura anterna',
@@ -21640,6 +22202,7 @@ $1:Esempi.jpg|Descrission2',
 
 /** Western Punjabi (پنجابی)
  * @author BMRG14
+ * @author Ebraminio
  * @author Khalid Mahmood
  */
 $messages['pnb'] = array(
@@ -21674,7 +22237,7 @@ $messages['pnb'] = array(
 	'wikieditor-toolbar' => 'لکھت اوزار',
 	'wikieditor-toolbar-desc' => 'اوزار پٹی چ تبدیلی ورتن کرکے کرو۔',
 	'wikieditor-toolbar-preference' => 'ودیا اوزار پٹی نوں چالو کرو۔',
-	'wikieditor-toolbar-dialogs-preference' => 'ڈائیلاگ نوں قابل کرو جوڑ یا پعاڑے یا ہور رلان لئی۔',
+	'wikieditor-toolbar-dialogs-preference' => 'ڈائیلاگ نوں قابل کرو جوڑ یا پعاڑے یا ہور رلان لئی۔', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'دسخص بٹن نوں ناںتھاں صفیاں توں لکاؤ۔',
 	'wikieditor-toolbar-loading' => 'لوڈنگ۔۔۔',
 	'wikieditor-toolbar-tool-bold' => 'موٹا',
@@ -21798,7 +22361,7 @@ $1:ادھارن.جےپیجی|سرخی2',
 	'wikieditor-toolbar-characters-page-cyrillic' => 'سریلیک',
 	'wikieditor-toolbar-characters-page-arabic' => 'عربی',
 	'wikieditor-toolbar-characters-page-arabicextended' => 'عربی ودویں',
-	'wikieditor-toolbar-characters-page-persian' => 'پارسی',
+	'wikieditor-toolbar-characters-page-persian' => 'فارسی',
 	'wikieditor-toolbar-characters-page-hebrew' => 'عبرانی',
 	'wikieditor-toolbar-characters-page-bangla' => 'بنگالی',
 	'wikieditor-toolbar-characters-page-telugu' => 'تلیگو',
@@ -21887,7 +22450,7 @@ $messages['ps'] = array(
 	'wikieditor' => 'د پرمختللی ويکي متن د سمون ليدنمخ',
 	'wikieditor-wikitext-tab' => 'ويکي متن',
 	'wikieditor-loading' => 'برسېرېدنې کې دی...',
-	'wikieditor-preview-preference' => 'څنګ په څنګ مخليدنه چارنده کول',
+	'wikieditor-preview-preference' => 'څنگ په څنگ مخليدنه چارنول',
 	'wikieditor-preview-tab' => 'مخليدنه',
 	'wikieditor-preview-changes-tab' => 'بدلونونه',
 	'wikieditor-preview-loading' => 'برسېرېدنې کې دی...',
@@ -21895,19 +22458,19 @@ $messages['ps'] = array(
 	'wikieditor-previewDialog-loading' => 'برسېرېدنې کې دی...',
 	'wikieditor-publish-preference' => 'ګام په ګام خپرېدنه چارنده کول',
 	'wikieditor-publish-button-publish' => 'خپرول',
-	'wikieditor-publish-button-cancel' => 'ناګارل',
+	'wikieditor-publish-button-cancel' => 'ناگارل',
 	'wikieditor-publish-dialog-title' => '{{SITENAME}} کې خپرول',
-	'wikieditor-publish-dialog-summary' => 'د سمون لنډيز (په لنډه توګه د خپلو بدلونونو څرګندونه وکړۍ):',
+	'wikieditor-publish-dialog-summary' => 'د سمون لنډيز (په لنډه توگه د خپلو بدلونونو څرگندونه وکړۍ):',
 	'wikieditor-publish-dialog-minor' => 'وړوکی سمون',
 	'wikieditor-publish-dialog-watch' => 'همدا مخ کتل',
 	'wikieditor-publish-dialog-publish' => 'خپرول',
 	'wikieditor-publish-dialog-goback' => 'پر شا تلل',
 	'wikieditor-template-editor-dialog-title' => 'کينډۍ سمول',
 	'wikieditor-template-editor-dialog-submit' => 'اوسمهالول',
-	'wikieditor-template-editor-dialog-cancel' => 'ناګارل',
+	'wikieditor-template-editor-dialog-cancel' => 'ناگارل',
 	'wikieditor-templates-preference' => 'کينډۍ غځول چارنده کول',
-	'wikieditor-toc-show' => 'مېنځپانګه ښکاره کول',
-	'wikieditor-toc-hide' => 'مېنځپانګه پټول',
+	'wikieditor-toc-show' => 'مېنځپانگه ښکاره کول',
+	'wikieditor-toc-hide' => 'مېنځپانگه پټول',
 	'wikieditor-toolbar' => 'د سمون توکپټه',
 	'wikieditor-toolbar-loading' => 'برسېرېدنې کې دی...',
 	'wikieditor-toolbar-tool-bold' => 'زغرد',
@@ -21929,13 +22492,13 @@ $messages['ps'] = array(
 	'wikieditor-toolbar-tool-link-ext-target' => 'د تړنې URL:',
 	'wikieditor-toolbar-tool-link-ext-text' => 'د تړنې متن:',
 	'wikieditor-toolbar-tool-link-insert' => 'تړنه ورټومبل',
-	'wikieditor-toolbar-tool-link-cancel' => 'ناګارل',
+	'wikieditor-toolbar-tool-link-cancel' => 'ناگارل',
 	'wikieditor-toolbar-tool-link-int-target-status-exists' => 'پدې نوم مخ شته',
 	'wikieditor-toolbar-tool-link-int-target-status-notexists' => 'پدې نوم مخ نشته',
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'ناسم سرليک',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'باندنۍ تړنه',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'د مخ د شتون څارنه...',
-	'wikieditor-toolbar-tool-link-int-invalid' => 'ستاسې ځانګړی شوی سرليک سم نه وو.',
+	'wikieditor-toolbar-tool-link-int-invalid' => 'ستاسې ځانگړی شوی سرليک سم نه وو.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'کورنۍ تړنه',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'باندنۍ تړنه',
 	'wikieditor-toolbar-tool-file' => 'خښه شوې دوتنه',
@@ -21944,11 +22507,11 @@ $messages['ps'] = array(
 	'wikieditor-toolbar-file-default' => '(تلواليز)',
 	'wikieditor-toolbar-file-format' => 'بڼه:',
 	'wikieditor-toolbar-tool-file-insert' => 'ورټومبل',
-	'wikieditor-toolbar-tool-file-cancel' => 'ناګارل',
+	'wikieditor-toolbar-tool-file-cancel' => 'ناگارل',
 	'wikieditor-toolbar-tool-reference' => 'سرچينه',
 	'wikieditor-toolbar-tool-reference-example' => 'د پايڅوړ متن دلته وليکۍ',
-	'wikieditor-toolbar-tool-reference-cancel' => 'ناګارل',
-	'wikieditor-toolbar-tool-reference-title' => 'سرچينه ورګډول',
+	'wikieditor-toolbar-tool-reference-cancel' => 'ناگارل',
+	'wikieditor-toolbar-tool-reference-title' => 'سرچينه ورگډول',
 	'wikieditor-toolbar-tool-reference-insert' => 'ورټومبل',
 	'wikieditor-toolbar-tool-reference-text' => 'د سرچينې متن',
 	'wikieditor-toolbar-tool-signature' => 'لاسليک او د وخت ټاپه',
@@ -21961,8 +22524,8 @@ $messages['ps'] = array(
 	'wikieditor-toolbar-tool-heading-5' => '۵ کچه',
 	'wikieditor-toolbar-tool-heading-example' => 'د سرليک متن',
 	'wikieditor-toolbar-group-format' => 'بڼه',
-	'wikieditor-toolbar-tool-ulist' => 'ګولۍ داره لړليک',
-	'wikieditor-toolbar-tool-ulist-example' => 'د ګولۍ داره لړليک توکی',
+	'wikieditor-toolbar-tool-ulist' => 'گولۍ داره لړليک',
+	'wikieditor-toolbar-tool-ulist-example' => 'د گولۍ داره لړليک توکی',
 	'wikieditor-toolbar-tool-olist' => 'شمېرن لړليک',
 	'wikieditor-toolbar-tool-redirect-example' => 'د هدفي مخ نوم',
 	'wikieditor-toolbar-tool-big' => 'لوی',
@@ -21994,11 +22557,11 @@ $messages['ps'] = array(
 	'wikieditor-toolbar-tool-table-dimensions-rows' => 'ليکې',
 	'wikieditor-toolbar-tool-table-dimensions-columns' => 'ستنې',
 	'wikieditor-toolbar-tool-table-wikitable' => 'ډول او پولې',
-	'wikieditor-toolbar-tool-table-sortable' => 'لښتيال د اوډون وړ ګرځول',
-	'wikieditor-toolbar-tool-table-example' => 'بېلګه',
+	'wikieditor-toolbar-tool-table-sortable' => 'لښتيال اوډون وړ گرځول',
+	'wikieditor-toolbar-tool-table-example' => 'بېلگه',
 	'wikieditor-toolbar-tool-table-preview' => 'مخليدنه',
 	'wikieditor-toolbar-tool-table-insert' => 'ورټومبل',
-	'wikieditor-toolbar-tool-table-cancel' => 'ناګارل',
+	'wikieditor-toolbar-tool-table-cancel' => 'ناگارل',
 	'wikieditor-toolbar-tool-replace' => 'پلټل او ځايناستول',
 	'wikieditor-toolbar-tool-replace-title' => 'پلټل او ځايناستول',
 	'wikieditor-toolbar-tool-replace-search' => 'پلټنه د:',
@@ -22009,7 +22572,7 @@ $messages['ps'] = array(
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'ټول ځايناستول',
 	'wikieditor-toolbar-tool-replace-close' => 'تړل',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'ستاسې پلټنه د هېڅ کوم شي سره اړونده نه وه.',
-	'wikieditor-toolbar-section-characters' => 'ځانګړي توري',
+	'wikieditor-toolbar-section-characters' => 'ځانگړي توري',
 	'wikieditor-toolbar-characters-page-latin' => 'لاتين',
 	'wikieditor-toolbar-characters-page-latinextended' => 'غځېدلی لاتين',
 	'wikieditor-toolbar-characters-page-ipa' => 'ن.غ.ا',
@@ -22030,7 +22593,7 @@ $messages['ps'] = array(
 	'wikieditor-toolbar-characters-page-lao' => 'لاوي',
 	'wikieditor-toolbar-characters-page-khmer' => 'خمري',
 	'wikieditor-toolbar-section-help' => 'لارښود',
-	'wikieditor-toolbar-help-heading-description' => 'څرګندونه',
+	'wikieditor-toolbar-help-heading-description' => 'څرگندونه',
 	'wikieditor-toolbar-help-heading-syntax' => 'هغه څه چې ليکۍ',
 	'wikieditor-toolbar-help-heading-result' => 'هغه څه چې لاس ته راوړۍ',
 	'wikieditor-toolbar-help-page-link' => 'تړنې',
@@ -22063,7 +22626,7 @@ $messages['ps'] = array(
 	'wikieditor-toolbar-help-content-heading5-description' => 'د پينځمې کچې سرليک',
 	'wikieditor-toolbar-help-content-heading5-syntax' => '===== د سرليک متن =====',
 	'wikieditor-toolbar-help-content-heading5-result' => '<h5>د سرليک متن</h5>',
-	'wikieditor-toolbar-help-content-ulist-description' => 'ګولۍ داره لړليک',
+	'wikieditor-toolbar-help-content-ulist-description' => 'گولۍ داره لړليک',
 	'wikieditor-toolbar-help-content-ulist-syntax' => '* د لړليک توکی<br />* د لړليک توکی',
 	'wikieditor-toolbar-help-content-ulist-result' => '<ul><li>د لړليک توکی</li><li>د لړليک توکی</li></ul>',
 	'wikieditor-toolbar-help-content-olist-description' => 'شمېرن لړليک',
@@ -22109,7 +22672,7 @@ $messages['pt'] = array(
 	'wikieditor-preview-tab' => 'Antevisão',
 	'wikieditor-preview-changes-tab' => 'Alterações',
 	'wikieditor-preview-loading' => 'A carregar…',
-	'wikieditor-previewDialog-preference' => 'Activar o diálogo de antevisão',
+	'wikieditor-previewDialog-preference' => 'Ativar o diálogo de antevisão',
 	'wikieditor-previewDialog-tab' => 'Antevisão',
 	'wikieditor-previewDialog-loading' => 'A carregar…',
 	'wikieditor-publish-preference' => 'Possibilitar publicação passo a passo',
@@ -22131,8 +22694,8 @@ $messages['pt'] = array(
 	'wikieditor-toc-hide' => 'Esconder conteúdo',
 	'wikieditor-toolbar' => 'Barra de ferramentas de edição',
 	'wikieditor-toolbar-desc' => 'Barra de ferramentas de edição com usabilidade melhorada',
-	'wikieditor-toolbar-preference' => 'Activar a barra de ferramentas de edição melhorada',
-	'wikieditor-toolbar-dialogs-preference' => 'Possibilitar diálogos de inserção de links, tabelas e outros',
+	'wikieditor-toolbar-preference' => 'Ativar a barra de ferramentas de edição melhorada',
+	'wikieditor-toolbar-dialogs-preference' => 'Possibilitar diálogos de inserção de links, tabelas e outros', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Esconder o botão da assinatura nas páginas do espaço nominal principal',
 	'wikieditor-toolbar-loading' => 'A carregar…',
 	'wikieditor-toolbar-tool-bold' => 'Negrito',
@@ -22200,7 +22763,7 @@ $messages['pt'] = array(
 	'wikieditor-toolbar-tool-indent-example' => 'Linha indentada',
 	'wikieditor-toolbar-tool-nowiki' => 'Sem formatação wiki',
 	'wikieditor-toolbar-tool-nowiki-example' => 'Inserir aqui texto sem formatação',
-	'wikieditor-toolbar-tool-redirect' => 'Redireccionamento',
+	'wikieditor-toolbar-tool-redirect' => 'Redirecionamento',
 	'wikieditor-toolbar-tool-redirect-example' => 'Nome da página de destino',
 	'wikieditor-toolbar-tool-big' => 'Grande',
 	'wikieditor-toolbar-tool-big-example' => 'Texto grande',
@@ -22254,7 +22817,7 @@ $1:Exemplo2.jpg|Legenda2',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'Substituir todos',
 	'wikieditor-toolbar-tool-replace-close' => 'Fechar',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'A sua pesquisa não produziu resultados.',
-	'wikieditor-toolbar-tool-replace-success' => 'Substituições realizadas: $1.', # Fuzzy
+	'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|substituição realizada|substituições realizadas}}.',
 	'wikieditor-toolbar-tool-replace-emptysearch' => 'Não introduziu nada para pesquisar.',
 	'wikieditor-toolbar-tool-replace-invalidregex' => "A expressão regular ''(regex)'' que introduziu é inválida: $1",
 	'wikieditor-toolbar-section-characters' => 'Caracteres especiais',
@@ -22341,13 +22904,14 @@ $1:Exemplo2.jpg|Legenda2',
 );
 
 /** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
  * @author Daemorris
  * @author Everton137
  * @author Giro720
  * @author Hamilton Abreu
  * @author Helder.wiki
- * @author Heldergeovane
  * @author Lijealso
+ * @author Luckas
  * @author Luckas Blade
  * @author MetalBrasil
  * @author Rafael Vargas
@@ -22385,7 +22949,7 @@ $messages['pt-br'] = array(
 	'wikieditor-toolbar' => 'Barra de ferramentas de edição',
 	'wikieditor-toolbar-desc' => 'Barra de ferramentas de edição com usabilidade melhorada',
 	'wikieditor-toolbar-preference' => 'Ativar a barra de ferramentas de edição melhorada',
-	'wikieditor-toolbar-dialogs-preference' => 'Possibilitar diálogos de inserção de ligações, tabelas e outros',
+	'wikieditor-toolbar-dialogs-preference' => 'Possibilitar diálogos de inserção de ligações, tabelas assim como a função de buscar e substituir',
 	'wikieditor-toolbar-hidesig' => 'Esconder o botão da assinatura nas páginas do espaço nominal principal',
 	'wikieditor-toolbar-loading' => 'Carregando...',
 	'wikieditor-toolbar-tool-bold' => 'Negrito',
@@ -22413,6 +22977,7 @@ $messages['pt-br'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Título inválido',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Link externo',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Verificando existência da página...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Página de desambiguação',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'O título que você especificou é inválido.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'A URL que você especificou parece ser um link para outra página do wiki. Você deseja usar como link interno?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Link interno',
@@ -22427,6 +22992,7 @@ $messages['pt-br'] = array(
 	'wikieditor-toolbar-file-float' => 'Alinhamento:',
 	'wikieditor-toolbar-file-default' => '(padrão)',
 	'wikieditor-toolbar-file-format' => 'Formato:',
+	'wikieditor-toolbar-file-format-none' => 'nenhum',
 	'wikieditor-toolbar-tool-file-insert' => 'Inserir',
 	'wikieditor-toolbar-tool-file-cancel' => 'Cancelar',
 	'wikieditor-toolbar-tool-reference' => 'Referência',
@@ -22493,7 +23059,7 @@ $1:Exemplo.jpg|Legenda2',
 	'wikieditor-toolbar-tool-table-preview' => 'Pré-visualização',
 	'wikieditor-toolbar-tool-table-insert' => 'Inserir',
 	'wikieditor-toolbar-tool-table-cancel' => 'Cancelar',
-	'wikieditor-toolbar-tool-table-toomany' => 'Não é possível inserir uma tabela com mais de $1 colunas com esta interface.', # Fuzzy
+	'wikieditor-toolbar-tool-table-toomany' => 'Não é possível inserir uma tabela com mais de 1000 células com esta interface.',
 	'wikieditor-toolbar-tool-table-invalidnumber' => 'Você não introduziu um número válido de linhas ou colunas.',
 	'wikieditor-toolbar-tool-table-zero' => 'Você não pode inserir uma tabela com zero linhas ou colunas.',
 	'wikieditor-toolbar-tool-replace' => 'Localizar e substituir',
@@ -22507,7 +23073,7 @@ $1:Exemplo.jpg|Legenda2',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'Substituir todos',
 	'wikieditor-toolbar-tool-replace-close' => 'Fechar',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'Não houve coincidências para a sua pesquisa.',
-	'wikieditor-toolbar-tool-replace-success' => 'Substituições realizadas: $1.', # Fuzzy
+	'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|substituição realizada|substituições realizadas}}.',
 	'wikieditor-toolbar-tool-replace-emptysearch' => 'Você não introduziu nada para buscar.',
 	'wikieditor-toolbar-tool-replace-invalidregex' => "A expressão regular ''(regex)'' que você introduziu é inválida: $1",
 	'wikieditor-toolbar-section-characters' => 'Caracteres especiais',
@@ -22628,7 +23194,7 @@ $messages['qu'] = array(
 	'wikieditor-toolbar' => "Llamk'apunapaq butunnintin uma siq'i",
 	'wikieditor-toolbar-desc' => "Kallpachasqa llamk'apunapaq butunnintin uma siq'i",
 	'wikieditor-toolbar-preference' => "Kallpachasqa llamk'apunapaq butunnintin uma siq'ita atichiy",
-	'wikieditor-toolbar-dialogs-preference' => "T'inkikunapaq, wachuchasqakunapaq, aswanpaqpas willanakuykunata atichiy",
+	'wikieditor-toolbar-dialogs-preference' => "T'inkikunata, wachuchasqakunata sat'inapaq, maskanapaq huknachanapaqpas layqakunata atichiy",
 	'wikieditor-toolbar-hidesig' => "Uma suti k'iti p'anqakunamanta silq'uy butunta pakay",
 	'wikieditor-toolbar-loading' => 'Chaqnamuspa…',
 	'wikieditor-toolbar-tool-bold' => 'Yanasapa',
@@ -22656,6 +23222,7 @@ $messages['qu'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => "P'anqap sutinqa manam allinchu",
 	'wikieditor-toolbar-tool-link-int-target-status-external' => "Hawa t'inki",
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => "P'anqa kachkayta llanchichkaspa...",
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => "Sut'ichana qillqa",
 	'wikieditor-toolbar-tool-link-int-invalid' => "Qusqayki p'anqap sutinqa manam allinchu.",
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => "Qusqayki URL nisqaqa huk wiki p'anqaman t'inkimuqmanmi rik'chakun. Ukhu t'inkiri kachunchu?",
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => "Ukhu t'inki",
@@ -22879,7 +23446,7 @@ $messages['ro'] = array(
 	'wikieditor-toolbar' => 'Modificarea barei de instrumente',
 	'wikieditor-toolbar-desc' => 'Modificarea barei de instrumente cu utilizare ridicată',
 	'wikieditor-toolbar-preference' => 'Activează varianta îmbunătățită a barei de unelte',
-	'wikieditor-toolbar-dialogs-preference' => 'Activează casetele de dialog pentru inserarea legăturilor, tabelelor și a altor funcționalități',
+	'wikieditor-toolbar-dialogs-preference' => 'Activează casetele de dialog pentru inserarea legăturilor, tabelelor și a altor funcționalități', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Ascunde butonul de semnătură în cazul paginilor din spațiul de nume principal',
 	'wikieditor-toolbar-loading' => 'Se încarcă...',
 	'wikieditor-toolbar-tool-bold' => 'Aldin',
@@ -23127,7 +23694,7 @@ $messages['roa-tara'] = array(
 	'wikieditor-toolbar' => 'Barre de le cangiaminde',
 	'wikieditor-toolbar-desc' => "Cange 'a pàgene d'a barre de le struminde cu l'usabbilità avanzate",
 	'wikieditor-toolbar-preference' => "Abbilite 'a barre de le struminde pe le cangiaminde avanzate",
-	'wikieditor-toolbar-dialogs-preference' => "Abbilite le dialoghe pe l'inzerimende de collegaminde, tabbelle e otre cose",
+	'wikieditor-toolbar-dialogs-preference' => "Abbilite le procedure guidate pe l'inzerimende de collegaminde, tabbelle e otre cose pa funzione de ricerche e sostituzione",
 	'wikieditor-toolbar-hidesig' => "Scunne 'u buttone d'a firme da le pàggene jndr'à 'u namespace prengepàle",
 	'wikieditor-toolbar-loading' => 'Stoche a careche…',
 	'wikieditor-toolbar-tool-bold' => 'Grascette',
@@ -23155,6 +23722,7 @@ $messages['roa-tara'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Titole invalide',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Collegaminde fore a Uicchipèdie',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => "Stoche a verifiche l'esistenze d'a pàgene...",
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Pàgene de disambbiguazione',
 	'wikieditor-toolbar-tool-link-int-invalid' => "'U titele ca è specificate jè invalide.",
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => "'A URL ca tu è specificate pare manghe ca vò ccù punde a 'n'otra pàgene de Uicchi. Ce vuè ccù face 'nu collegamende inderne?",
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => "Collegamende jndr'à Uicchipèdie",
@@ -23350,6 +23918,7 @@ $1:Example.jpg|Titele2',
  * @author KPu3uC B Poccuu
  * @author Kaganer
  * @author Lockal
+ * @author Okras
  * @author Temuri rajavi
  * @author Александр Сигачёв
  */
@@ -23385,7 +23954,7 @@ $messages['ru'] = array(
 	'wikieditor-toolbar' => 'Панель редактирования',
 	'wikieditor-toolbar-desc' => 'Панель редактирования, более удобная в использовании',
 	'wikieditor-toolbar-preference' => 'Включить улучшенную панель редактирования',
-	'wikieditor-toolbar-dialogs-preference' => 'Включить диалоги для вставки ссылок, таблиц и других объектов',
+	'wikieditor-toolbar-dialogs-preference' => 'Включить мастера для вставки ссылок, таблиц, а также функции вставки и замены',
 	'wikieditor-toolbar-hidesig' => 'Скрыть кнопку подписи на страницах основного пространства имён',
 	'wikieditor-toolbar-loading' => 'Загрузка…',
 	'wikieditor-toolbar-tool-bold' => 'Полужирный',
@@ -23413,6 +23982,7 @@ $messages['ru'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Недопустимое название',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Внешняя ссылка',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Проверка существования страницы…',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Страницы разрешения неоднозначностей',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Указанное название недопустимо.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Указанный вами URL похож на ссылку на другую вики-страницу. Вы хотите сделать данную ссылку внутренней?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Внутренняя ссылка',
@@ -23509,7 +24079,7 @@ $1:Example.jpg|Описание2',
 	'wikieditor-toolbar-tool-replace-button-replaceall' => 'Заменить все',
 	'wikieditor-toolbar-tool-replace-close' => 'Закрыть',
 	'wikieditor-toolbar-tool-replace-nomatch' => 'По вашему запросу ничего не найдено.',
-	'wikieditor-toolbar-tool-replace-success' => 'Произведено замен: $1.', # Fuzzy
+	'wikieditor-toolbar-tool-replace-success' => '$1 {{PLURAL:$1|замена произведена|замены произведены|замен произведено}}.',
 	'wikieditor-toolbar-tool-replace-emptysearch' => 'Вы не указали что следует искать.',
 	'wikieditor-toolbar-tool-replace-invalidregex' => 'Введённое вами регулярное выражение ошибочно:  $1',
 	'wikieditor-toolbar-section-characters' => 'Спецсимволы',
@@ -23532,6 +24102,7 @@ $1:Example.jpg|Описание2',
 	'wikieditor-toolbar-characters-page-thai' => 'Тайские',
 	'wikieditor-toolbar-characters-page-lao' => 'Лаосские',
 	'wikieditor-toolbar-characters-page-khmer' => 'Кхмерские',
+	'wikieditor-toolbar-characters-endash' => 'среднее тире',
 	'wikieditor-toolbar-characters-emdash' => 'длинное тире',
 	'wikieditor-toolbar-characters-minus' => 'знак минус',
 	'wikieditor-toolbar-section-help' => 'Справка',
@@ -23636,7 +24207,7 @@ $messages['rue'] = array(
 	'wikieditor-toolbar' => 'Едітачный панел інштрументів',
 	'wikieditor-toolbar-desc' => 'Едітачный панел інштрументів з вылїпшенов хосновательностёв',
 	'wikieditor-toolbar-preference' => 'Запнути вылїпшеный панел інштрументів',
-	'wikieditor-toolbar-dialogs-preference' => 'Поволити діалоґы про вкладаня одказів, таблиць ітд.',
+	'wikieditor-toolbar-dialogs-preference' => 'Поволити діалоґы про вкладаня одказів, таблиць ітд.', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Скрыти клапку підпису на сторінках у головнім просторї назв',
 	'wikieditor-toolbar-loading' => 'Награваня...',
 	'wikieditor-toolbar-tool-bold' => 'Тучне',
@@ -23874,7 +24445,7 @@ $messages['sa'] = array(
 	'wikieditor-toolbar' => 'उपकरणपेटिका सम्पाद्यताम्',
 	'wikieditor-toolbar-desc' => 'विवृद्धोपयोगयुक्तम् उपकरणपेटिकापृष्ठं सम्पाद्यताम्',
 	'wikieditor-toolbar-preference' => 'विवृद्धोपकरणपेटिकायाः सम्पादनं सक्रियं क्रियताम्',
-	'wikieditor-toolbar-dialogs-preference' => 'अनुबन्धकोष्टकादीनां समायोजनाय सम्भाषणं सक्रियं करोतु',
+	'wikieditor-toolbar-dialogs-preference' => 'अनुबन्धकोष्टकादीनां समायोजनाय सम्भाषणं सक्रियं करोतु', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'मुख्यनामावकाशपृष्ठेषु हस्ताक्षरकुड्मलं विलोपयतु',
 	'wikieditor-toolbar-loading' => 'आरोप्यमाणमस्ति.....',
 	'wikieditor-toolbar-tool-bold' => 'स्थूलक्षरम्',
@@ -24092,11 +24663,11 @@ $messages['sah'] = array(
 	'wikieditor-wikitext-tab' => 'Биики тиэкис',
 	'wikieditor-loading' => 'Хачайдааһын',
 	'wikieditor-preview-preference' => 'Инники көрүүнү сэргэстэһиннэрэ көрдөр',
-	'wikieditor-preview-tab' => 'Инники көрүү',
+	'wikieditor-preview-tab' => 'Холоон көрүү',
 	'wikieditor-preview-changes-tab' => 'Уларыйыылар',
 	'wikieditor-preview-loading' => 'Хачайдана турар...',
 	'wikieditor-previewDialog-preference' => 'Эрдэ көрүү диалогын холбуурга',
-	'wikieditor-previewDialog-tab' => 'Инники көрүү',
+	'wikieditor-previewDialog-tab' => 'Холоон көрүү',
 	'wikieditor-previewDialog-loading' => 'Хачайдана турар...',
 	'wikieditor-publish-preference' => 'Биирдии хаамыынан бэчээккэ таһаарыыны холбоо',
 	'wikieditor-publish-button-publish' => 'Бэчээккэ таһаарарга',
@@ -24118,7 +24689,7 @@ $messages['sah'] = array(
 	'wikieditor-toolbar' => 'Көннөрүү хаптаһына (панель)',
 	'wikieditor-toolbar-desc' => 'Тупсарыллыбыт уларытыы хаптаһына',
 	'wikieditor-toolbar-preference' => 'Тупсарыллыбыт уларытыы хаптаһынын холбуурга',
-	'wikieditor-toolbar-dialogs-preference' => 'Сигэлэри, таабыллары уонна атын объектары киллэрэр самалыктары холбуурга',
+	'wikieditor-toolbar-dialogs-preference' => 'Сигэлэри, таабыллары уонна атын объектары киллэрэр самалыктары холбуурга', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Киллэрии...',
 	'wikieditor-toolbar-tool-bold' => 'Модьу',
 	'wikieditor-toolbar-tool-bold-example' => 'Модьу бичик',
@@ -24331,7 +24902,7 @@ $messages['sc'] = array(
 	'wikieditor-toolbar' => "Barra de is ainas pro s'acontzu",
 	'wikieditor-toolbar-desc' => "Barra de is ainas pro s'acontzu megiorada",
 	'wikieditor-toolbar-preference' => 'Abilita sa barra de is ainas megiorada',
-	'wikieditor-toolbar-dialogs-preference' => 'Abilita is bentanas pro insertare ligàmines, tabellas e àteru',
+	'wikieditor-toolbar-dialogs-preference' => 'Abilita is bentanas pro insertare ligàmines, tabellas e àteru', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Carrigamentu...',
 	'wikieditor-toolbar-tool-bold' => 'Grassu',
 	'wikieditor-toolbar-tool-bold-example' => 'Testu grassu',
@@ -24554,7 +25125,7 @@ $messages['scn'] = array(
 	'wikieditor-toolbar' => 'Barra dî strummenta di canci',
 	'wikieditor-toolbar-desc' => 'Barra dî strummenta di canci dâ pàggina cu na megghiu usabbilità',
 	'wikieditor-toolbar-preference' => 'Abbilita la barra avanzata dî strummenta di canci',
-	'wikieditor-toolbar-dialogs-preference' => 'Abbilita li finestri di dialugu pi nsirìri liami, tabbelli e àutri cosi',
+	'wikieditor-toolbar-dialogs-preference' => 'Abbilita li finestri di dialugu pi nsirìri liami, tabbelli e àutri cosi', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Caricamentu in corsu...',
 	'wikieditor-toolbar-tool-bold' => 'Grassettu',
 	'wikieditor-toolbar-tool-bold-example' => 'Testu in grassettu',
@@ -24812,7 +25383,7 @@ $messages['si'] = array(
 	'wikieditor-toolbar' => 'සංස්කරණ මෙවලම් තීරුව',
 	'wikieditor-toolbar-desc' => 'වර්ධිත පරිශීලන හැකියාව සහිත සංස්කරණ පිටු මෙවලම් තීරුව',
 	'wikieditor-toolbar-preference' => 'වර්ධිත මෙවලම් තීරුව සක්‍රීය කරන්න',
-	'wikieditor-toolbar-dialogs-preference' => 'දියුණු කළ විකි පෙළක් ඇතුල් කිරීම ස‍ඳහා උදව් සක්‍රීය කරන්න',
+	'wikieditor-toolbar-dialogs-preference' => 'දියුණු කළ විකි පෙළක් ඇතුල් කිරීම ස‍ඳහා උදව් සක්‍රීය කරන්න', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'ප්‍රධාන නාමඅවකාශයේ තිබෙන පිටුවල අත්සන් බොත්තම සඟවන්න',
 	'wikieditor-toolbar-loading' => 'ප්‍රවේශනය වෙමින් පවතී...',
 	'wikieditor-toolbar-tool-bold' => 'තද පැහැ අකුරු',
@@ -25062,7 +25633,7 @@ $messages['sk'] = array(
 	'wikieditor-toolbar' => 'Panel nástrojov na úpravy',
 	'wikieditor-toolbar-desc' => 'Panel nástrojov na úpravy stránky s rozšírenou použiteľnosťou',
 	'wikieditor-toolbar-preference' => 'Zapnúť rozšírený panel nástrojov na úpravy',
-	'wikieditor-toolbar-dialogs-preference' => 'Povoliť dialógy na vkladanie odkazov, tabuliek atď.',
+	'wikieditor-toolbar-dialogs-preference' => 'Povoliť dialógy na vkladanie odkazov, tabuliek atď.', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Skryť tlačidlo podpis zo stránok v hlavnom mennom priestore',
 	'wikieditor-toolbar-loading' => 'Načítava sa...',
 	'wikieditor-toolbar-tool-bold' => 'Hrubý',
@@ -25261,6 +25832,7 @@ $1:Príklad.jpg|Popis2',
 
 /** Slovenian (slovenščina)
  * @author Dbc334
+ * @author Eleassar
  * @author Yerpo
  */
 $messages['sl'] = array(
@@ -25295,7 +25867,7 @@ $messages['sl'] = array(
 	'wikieditor-toolbar' => 'Urejevalna orodna vrstica',
 	'wikieditor-toolbar-desc' => 'Urejevalna orodna vrstica z večjo uporabnostjo',
 	'wikieditor-toolbar-preference' => 'Omogoči izboljšano urejevalno vrstico',
-	'wikieditor-toolbar-dialogs-preference' => 'Omogoči pogovorna okna za vstavljanje povezav, tabel itn.',
+	'wikieditor-toolbar-dialogs-preference' => 'Omogoči čarovnike za vstavljanje povezav in tabel, kakor tudi funkcijo išči in zamenjaj',
 	'wikieditor-toolbar-hidesig' => 'Skrij gumb za podpis s strani v glavnem imenskem prostoru',
 	'wikieditor-toolbar-loading' => 'Nalaganje ...',
 	'wikieditor-toolbar-tool-bold' => 'Krepko',
@@ -25323,6 +25895,7 @@ $messages['sl'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Neveljaven naslov',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Zunanja povezava',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Preverjanje obstoja strani ...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Razločitvena stran',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Navedeni naslov ni veljaven.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Navedeni URL izgleda kot povezava na drugo wikistran. Ali jo želite narediti notranjo povezavo?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Notranja povezava',
@@ -25543,7 +26116,7 @@ $messages['sq'] = array(
 	'wikieditor-toolbar' => 'Redaktoni trat me vegla',
 	'wikieditor-toolbar-desc' => 'Redaktoni shiritin e veglave të faqes me përdorshmëri të zgjeruar',
 	'wikieditor-toolbar-preference' => 'Aktizoni redaktimin e zgjeruar të shiritit të mjeteve',
-	'wikieditor-toolbar-dialogs-preference' => 'Aktivizoni dialogun për të futur lidhjet, tabelët etj.',
+	'wikieditor-toolbar-dialogs-preference' => 'Aktivizoni dialogun për të futur lidhjet, tabelët etj.', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Duke punuar...',
 	'wikieditor-toolbar-tool-bold' => 'Trashë',
 	'wikieditor-toolbar-tool-bold-example' => 'Tekst i trashë',
@@ -25779,7 +26352,7 @@ $messages['sr-ec'] = array(
 	'wikieditor-toolbar' => 'Алатна трака за уређивање',
 	'wikieditor-toolbar-desc' => 'Алатна трака за уређивање с побољшаном употребљивошћу',
 	'wikieditor-toolbar-preference' => 'Омогући побољшану траку за уређивање',
-	'wikieditor-toolbar-dialogs-preference' => 'Омогући прозорчад за убацивање веза, табела и више',
+	'wikieditor-toolbar-dialogs-preference' => 'Омогући прозорчад за убацивање веза, табела и више', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Сакриј дугме за потпис на страницама у главном именском простору',
 	'wikieditor-toolbar-loading' => 'Учитавам…',
 	'wikieditor-toolbar-tool-bold' => 'Подебљано',
@@ -26026,7 +26599,7 @@ $messages['sr-el'] = array(
 	'wikieditor-toolbar' => 'Alatna traka za uređivanje',
 	'wikieditor-toolbar-desc' => 'Alatna traka za uređivanje s poboljšanom upotrebljivošću',
 	'wikieditor-toolbar-preference' => 'Omogući poboljšanu traku za uređivanje',
-	'wikieditor-toolbar-dialogs-preference' => 'Omogući prozorčad za ubacivanje veza, tabela i više',
+	'wikieditor-toolbar-dialogs-preference' => 'Omogući prozorčad za ubacivanje veza, tabela i više', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Sakrij dugme za potpis na stranicama u glavnom imenskom prostoru',
 	'wikieditor-toolbar-loading' => 'Učitavanje...',
 	'wikieditor-toolbar-tool-bold' => 'Podebljan',
@@ -26472,7 +27045,7 @@ $messages['sv'] = array(
 	'wikieditor-previewDialog-preference' => 'Aktivera förhandsgranska',
 	'wikieditor-previewDialog-tab' => 'Förhandsgranska',
 	'wikieditor-previewDialog-loading' => 'Laddar...',
-	'wikieditor-publish-preference' => 'Aktivera steg-efter-steg-publicering',
+	'wikieditor-publish-preference' => 'Aktivera steg-för-steg-publicering',
 	'wikieditor-publish-button-publish' => 'Publicera',
 	'wikieditor-publish-button-cancel' => 'Avbryt',
 	'wikieditor-publish-dialog-title' => 'Publicera i {{SITENAME}}',
@@ -26492,7 +27065,7 @@ $messages['sv'] = array(
 	'wikieditor-toolbar' => 'Redigeringsverktygsrad',
 	'wikieditor-toolbar-desc' => 'Redigeringsverktygsrad med utökad användbarhet',
 	'wikieditor-toolbar-preference' => 'Aktivera utökad redigeringsverktygsrad',
-	'wikieditor-toolbar-dialogs-preference' => 'Aktivera dialoger för inläggning av länkar, tabeller och annat',
+	'wikieditor-toolbar-dialogs-preference' => 'Aktivera guider för att lägga in länkar, tabeller såväl som sök- och ersättningsfunktionen',
 	'wikieditor-toolbar-hidesig' => 'Dölj knappen signatur på sidor i huvudnamnrymden',
 	'wikieditor-toolbar-loading' => 'Laddar...',
 	'wikieditor-toolbar-tool-bold' => 'Fet',
@@ -26520,6 +27093,7 @@ $messages['sv'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Ogiltig titel',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Extern länk',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Kontrollerar om sidan existerar...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Förgreningssida',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Titeln du angav är ogiltig.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'URL:et du specificerade ser ut att vara avsett som en länk till en annan wikisida. Vill du göra det till en intern länk?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Intern länk',
@@ -26601,7 +27175,7 @@ $1:Exempel.jpg|Bildtext2',
 	'wikieditor-toolbar-tool-table-preview' => 'Förhandsgranska',
 	'wikieditor-toolbar-tool-table-insert' => 'Sätt in',
 	'wikieditor-toolbar-tool-table-cancel' => 'Avbryt',
-	'wikieditor-toolbar-tool-table-toomany' => 'Att sätta in en tabell med fler än $1 celler är inte möjligt med denna dialog.', # Fuzzy
+	'wikieditor-toolbar-tool-table-toomany' => 'Att sätta in en tabell med fler än 1000 celler är inte möjligt med denna dialog.',
 	'wikieditor-toolbar-tool-table-invalidnumber' => 'Du har inte angett ett giltigt antal rader eller kolumner.',
 	'wikieditor-toolbar-tool-table-zero' => 'Du kan inte sätta in en tabell med noll rader eller kolumner.',
 	'wikieditor-toolbar-tool-replace' => 'Sök och ersätt',
@@ -26740,7 +27314,7 @@ $messages['sw'] = array(
 	'wikieditor-toolbar' => 'Mwambaa zana wa kuhariri',
 	'wikieditor-toolbar-desc' => 'Mwambaa zana wa kuhariri uliozidishwa',
 	'wikieditor-toolbar-preference' => 'Tumia mwambaa zana wa kuhariri uliozidishwa',
-	'wikieditor-toolbar-dialogs-preference' => 'Kuwezesha visanduku vya zana za kuingiza viungo, jedwali na mengineyo',
+	'wikieditor-toolbar-dialogs-preference' => 'Kuwezesha visanduku vya zana za kuingiza viungo, jedwali na mengineyo', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Inapakizwa...',
 	'wikieditor-toolbar-tool-bold' => 'Koze',
 	'wikieditor-toolbar-tool-bold-example' => 'Maandishi ya kooze',
@@ -26772,15 +27346,15 @@ $messages['sw'] = array(
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Kiungo cha ndani',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-ext' => 'Kiungo cha nje',
 	'wikieditor-toolbar-tool-link-empty' => 'Hukuandika kitu cha kuunganisha naye.',
-	'wikieditor-toolbar-tool-file' => 'Faili futike',
+	'wikieditor-toolbar-tool-file' => 'Ingiza faili',
 	'wikieditor-toolbar-tool-file-example' => 'Mfano.jpg',
 	'wikieditor-toolbar-tool-file-title' => 'Ingiza faili',
 	'wikieditor-toolbar-file-target' => 'Jina la faili:',
 	'wikieditor-toolbar-file-size' => 'Ukubwa:',
 	'wikieditor-toolbar-tool-file-insert' => 'Ingiza',
 	'wikieditor-toolbar-tool-file-cancel' => 'Ghairi',
-	'wikieditor-toolbar-tool-reference' => 'Tiniwayo',
-	'wikieditor-toolbar-tool-reference-example' => 'Weka maneno ya tiniwayo hapa',
+	'wikieditor-toolbar-tool-reference' => 'Marejeo',
+	'wikieditor-toolbar-tool-reference-example' => 'Weka maneno ya marejeo hapa',
 	'wikieditor-toolbar-tool-reference-cancel' => 'Batilisha',
 	'wikieditor-toolbar-tool-reference-title' => 'Ingiza marejeo',
 	'wikieditor-toolbar-tool-reference-insert' => 'Ingiza',
@@ -26888,7 +27462,7 @@ Idadi ya mistari au ya safu si halali.',
 	'wikieditor-toolbar-help-page-heading' => 'Vichwa',
 	'wikieditor-toolbar-help-page-list' => 'Orodha',
 	'wikieditor-toolbar-help-page-file' => 'Mafaili',
-	'wikieditor-toolbar-help-page-reference' => 'Tiniwayo',
+	'wikieditor-toolbar-help-page-reference' => 'Marejeo',
 	'wikieditor-toolbar-help-page-discussion' => 'Majadiliano',
 	'wikieditor-toolbar-help-content-italic-description' => 'Italiki',
 	'wikieditor-toolbar-help-content-italic-syntax' => "''Maandishi ya italiki''",
@@ -26923,15 +27497,15 @@ Idadi ya mistari au ya safu si halali.',
 	'wikieditor-toolbar-help-content-olist-description' => 'Orodha zenye namba',
 	'wikieditor-toolbar-help-content-olist-syntax' => '# Aya<br /># Aya',
 	'wikieditor-toolbar-help-content-olist-result' => '<ol><li>Aya</li><li>Aya</li></ol>',
-	'wikieditor-toolbar-help-content-file-description' => 'Faili futike',
+	'wikieditor-toolbar-help-content-file-description' => 'Ingiza faili',
 	'wikieditor-toolbar-help-content-file-syntax' => '[[$1:Example.png|thumb|Maelezo mafupi]]',
 	'wikieditor-toolbar-help-content-file-result' => "<div style='width:104px;' class='thumbinner'><a title='Maelezo mafupi' class='image' href='#'><img height='50' width='100' border='0' class='thumbimage' src='$2/WikiEditor/modules/images/toolbar/example-image.png' alt=''/></a><div class='thumbcaption'><div class='magnify'><a title='Kuza' class='internal' href='#'><img height='11' width='15' alt='' src='$1/common/images/magnify-clip.png'/></a></div>Maelezo mafupi</div></div>",
-	'wikieditor-toolbar-help-content-reference-description' => 'Tiniwayo',
+	'wikieditor-toolbar-help-content-reference-description' => 'Marejeo',
 	'wikieditor-toolbar-help-content-reference-syntax' => 'Maandishi ya ukurasa.&lt;ref name="mfano"&gt;[http://www.example.org Maandishi ya kiungo], maandishi mengine.&lt;/ref&gt;',
 	'wikieditor-toolbar-help-content-reference-result' => "Maandiko.<sup><a href='#'>[1]</a></sup>",
-	'wikieditor-toolbar-help-content-rereference-description' => 'Kutumia tiniwayo fulani kwa mara nyingine',
+	'wikieditor-toolbar-help-content-rereference-description' => 'Kutumia marejeo fulani kwa mara nyingine',
 	'wikieditor-toolbar-help-content-rereference-result' => "Maandiko.<sup><a href='#'>[1]</a></sup>",
-	'wikieditor-toolbar-help-content-showreferences-description' => 'Onyesha tiniwayo',
+	'wikieditor-toolbar-help-content-showreferences-description' => 'Onyesha marejeo',
 	'wikieditor-toolbar-help-content-showreferences-result' => "<ol class='references'><li id='cite_note-test-0'><b><a title='' href='#'>^</a></b> <a rel='nofollow' title='http://www.example.org' class='external text' href='#'>Maandishi ya kiungo</a>, maandishi mengine.</li></ol>",
 	'wikieditor-toolbar-help-content-signaturetimestamp-description' => 'Sahihi pamoja na stempu ya saa',
 	'wikieditor-toolbar-help-content-signaturetimestamp-result' => "<a href='#' title='{{#special:mypage}}'>Jina la mtumiaji</a> (<a href='#' title='{{#special:mytalk}}'>majadiliano</a>) 15:54, 10 June 2009 (UTC)",
@@ -27230,7 +27804,7 @@ $messages['te'] = array(
 	'wikieditor-toc-hide' => 'విషయసూచికని దాచు',
 	'wikieditor-toolbar' => 'ఎడిటింగ్ టూల్‌బార్',
 	'wikieditor-toolbar-desc' => 'మెరుగైన ఉపయోగశీలతో దిద్దుబాటు పేజీ పనిముట్లపట్టీ',
-	'wikieditor-toolbar-dialogs-preference' => 'లంకెలు, పట్టికలు మరియు మరెన్నింటినే చేర్చడానికి సంవాదపేటికలను చేతనంచేయి',
+	'wikieditor-toolbar-dialogs-preference' => 'లంకెలు, పట్టికలు మరియు మరెన్నింటినే చేర్చడానికి సంవాదపేటికలను చేతనంచేయి', # Fuzzy
 	'wikieditor-toolbar-loading' => 'లోడవుతోంది...',
 	'wikieditor-toolbar-tool-bold' => 'బొద్దు',
 	'wikieditor-toolbar-tool-bold-example' => 'బొద్దు పాఠ్యం',
@@ -27455,7 +28029,7 @@ $messages['th'] = array(
 	'wikieditor-toolbar' => 'แถบเครื่องมือสำหรับการแก้ไข',
 	'wikieditor-toolbar-desc' => 'แถบเครื่องมือเสริมความสามารถการใช้งานในการแก้ไขหน้า',
 	'wikieditor-toolbar-preference' => 'เปิดใช้แถบเครื่องมือเสริมความสามารถการแก้ไข',
-	'wikieditor-toolbar-dialogs-preference' => 'เปิดกล่องโต้ตอบสำหรับการแทรกลิงก์ ตาราง และอื่นๆ',
+	'wikieditor-toolbar-dialogs-preference' => 'เปิดกล่องโต้ตอบสำหรับการแทรกลิงก์ ตาราง และอื่นๆ', # Fuzzy
 	'wikieditor-toolbar-loading' => 'กำลังดึงข้อมูล...',
 	'wikieditor-toolbar-tool-bold' => 'ตัวหนา',
 	'wikieditor-toolbar-tool-bold-example' => 'ข้อความตัวหนา',
@@ -27679,7 +28253,7 @@ $messages['tk'] = array(
 	'wikieditor-toolbar' => 'Redaktirleme gural paneli',
 	'wikieditor-toolbar-desc' => 'Güýçlendirilen oňaýlylyk bilen sahypa gural panelini redaktirle',
 	'wikieditor-toolbar-preference' => 'Güýçlendirilen redaktirleme gural panelini aç',
-	'wikieditor-toolbar-dialogs-preference' => 'Çykgytlary, tablisalary we ýenekileri girizmek üçin dialoglary aç',
+	'wikieditor-toolbar-dialogs-preference' => 'Çykgytlary, tablisalary we ýenekileri girizmek üçin dialoglary aç', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Yüklenýär...',
 	'wikieditor-toolbar-tool-bold' => 'Goýy',
 	'wikieditor-toolbar-tool-bold-example' => 'Goýy tekst',
@@ -27909,7 +28483,7 @@ $messages['tl'] = array(
 	'wikieditor-toolbar' => 'Kahong kasangkapan na pamatnugot',
 	'wikieditor-toolbar-desc' => 'Kahong kasangkapan na pamatnugot na may pinainam na pagkanagagamit',
 	'wikieditor-toolbar-preference' => 'Paganahin ang pinainam na kahong kasangkapang pamatnugot',
-	'wikieditor-toolbar-dialogs-preference' => 'Paganahin ang mga salitaan para sa pagsisingit ng mga kawing, mga tabla at marami pa',
+	'wikieditor-toolbar-dialogs-preference' => 'Paganahin ang mga salitaan para sa pagsisingit ng mga kawing, mga tabla at marami pa', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Itago ang pindutan ng lagda magmula sa mga pahina sa loob ng pangunahing puwang ng pangalan',
 	'wikieditor-toolbar-loading' => 'Ikinakarga...',
 	'wikieditor-toolbar-tool-bold' => 'Makapal',
@@ -28140,6 +28714,7 @@ $messages['tpi'] = array(
  * @author Joseph
  * @author Koc61
  * @author Manco Capac
+ * @author Rapsar
  * @author Sadrettin
  * @author Srhat
  * @author Vito Genovese
@@ -28176,7 +28751,7 @@ $messages['tr'] = array(
 	'wikieditor-toolbar' => 'Araç çubuğu düzenleme',
 	'wikieditor-toolbar-desc' => 'Gelişmiş kullanılabilirlik ile sayfa araç çubuğunu düzenle',
 	'wikieditor-toolbar-preference' => 'Gelişmiş düzenleme araç çubuğunu etkinleştir',
-	'wikieditor-toolbar-dialogs-preference' => 'Bağlantılar, tablolar ve daha fazlasını eklemek için iletileri etkinleştir',
+	'wikieditor-toolbar-dialogs-preference' => 'Bağlantılar, tablolar ve daha fazlasını eklemek için iletileri etkinleştir', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Ana ad boşluğundaki sayfalardan imza düğmesini gizle',
 	'wikieditor-toolbar-loading' => 'Yükleniyor...',
 	'wikieditor-toolbar-tool-bold' => 'Kalın',
@@ -28204,6 +28779,7 @@ $messages['tr'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Geçersiz başlık',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Dış bağlantı',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Sayfanın mevcudiyeti denetleniyor...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Anlam ayrımı sayfası',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Belirttiğiniz başlık geçersiz.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Belirttiğiniz URL, başka bir viki sayfasına bir bağlantı yapılmak istenmiş gibi görünüyor. Bunu dahili bir bağlantı yapmak ister misiniz?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Dahili bağlantı',
@@ -28413,7 +28989,7 @@ $messages['tt-cyrl'] = array(
 	'wikieditor-toolbar' => 'Төзәтү панеле',
 	'wikieditor-toolbar-desc' => 'Яңартылган үзгәртү панеле',
 	'wikieditor-toolbar-preference' => 'Яңа үзгәртү панелен куллана башлау',
-	'wikieditor-toolbar-dialogs-preference' => 'Сылтамалар, табыннар һәм башка җисемнәрне кую',
+	'wikieditor-toolbar-dialogs-preference' => 'Сылтамалар, табыннар һәм башка җисемнәрне кую', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Йөкләү...',
 	'wikieditor-toolbar-tool-bold' => 'Куе төс',
 	'wikieditor-toolbar-tool-bold-example' => 'Калын язылыш',
@@ -28755,6 +29331,7 @@ $messages['ug-arab'] = array(
 /** Ukrainian (українська)
  * @author AS
  * @author Ahonc
+ * @author Andriykopanytsia
  * @author AtUkr
  * @author Base
  * @author Dim Grits
@@ -28796,7 +29373,7 @@ $messages['uk'] = array(
 	'wikieditor-toolbar' => 'Панель засобів редагування',
 	'wikieditor-toolbar-desc' => 'Панель засобів редагування з покращеною ужитковістю',
 	'wikieditor-toolbar-preference' => 'Увімкнути покращену панель засобів редагування',
-	'wikieditor-toolbar-dialogs-preference' => 'Увімкнути діалоги для пошуку і заміни, додавання посилань, таблиць та іншого',
+	'wikieditor-toolbar-dialogs-preference' => 'Увімкнути майстри для додавання посилань, таблиць, а також функції пошуку і заміни',
 	'wikieditor-toolbar-hidesig' => 'Приховати кнопку підпису зі сторінок в основному просторі назв',
 	'wikieditor-toolbar-loading' => 'Завантаження…',
 	'wikieditor-toolbar-tool-bold' => 'Жирний',
@@ -28824,6 +29401,7 @@ $messages['uk'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Неприпустима назва',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Зовнішнє посилання',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Перевірка наявності сторінки...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Сторінка неоднозначності',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Зазначена назва неприпустима.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Зазначений вами URL виглядає як посилання на іншу вікі-сторінку. Ви хочете зробити його внутрішнім посиланням?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Внутрішнє посилання',
@@ -29013,6 +29591,7 @@ $1:Example.jpg|Опис2',
 
 /** Urdu (اردو)
  * @author BMRG14
+ * @author Ebraminio
  * @author محبوب عالم
  * @author පසිඳු කාවින්ද
  */
@@ -29046,7 +29625,7 @@ $messages['ur'] = array(
 	'wikieditor-toc-hide' => 'مشتملات چھپاؤ',
 	'wikieditor-toolbar' => 'تدوینی اوزارتختہ',
 	'wikieditor-toolbar-preference' => 'افزودہ تدوینی اوزارتختہ فعال کرو',
-	'wikieditor-toolbar-dialogs-preference' => 'رابطو اور جدولوں وغیرہ کے ادخال کیلئے مکالمہ جات فعال کرو',
+	'wikieditor-toolbar-dialogs-preference' => 'رابطو اور جدولوں وغیرہ کے ادخال کیلئے مکالمہ جات فعال کرو', # Fuzzy
 	'wikieditor-toolbar-loading' => 'لَدرہا ہے۔۔',
 	'wikieditor-toolbar-tool-bold' => 'جلی',
 	'wikieditor-toolbar-tool-bold-example' => 'دبیز متن',
@@ -29175,7 +29754,7 @@ $1:مثال.jpg|تعقیب2',
 	'wikieditor-toolbar-characters-page-greek' => 'یونانی',
 	'wikieditor-toolbar-characters-page-arabic' => 'عربی',
 	'wikieditor-toolbar-characters-page-arabicextended' => 'عربی توسیع شدہ',
-	'wikieditor-toolbar-characters-page-persian' => 'پارسی',
+	'wikieditor-toolbar-characters-page-persian' => 'فارسی',
 	'wikieditor-toolbar-characters-page-hebrew' => 'عبرانی',
 	'wikieditor-toolbar-characters-page-bangla' => 'بنگالی',
 	'wikieditor-toolbar-characters-page-tamil' => 'تامل',
@@ -29269,7 +29848,7 @@ $messages['uz'] = array(
 	'wikieditor-toolbar' => 'Tahrirlash darchasi',
 	'wikieditor-toolbar-desc' => 'Foydalanishga qulayroq boʻlgan tahrirlash darchasi',
 	'wikieditor-toolbar-preference' => 'Yaxshilangan tahrirlash darchasini yoqish',
-	'wikieditor-toolbar-dialogs-preference' => 'Havolalar, jadvallar va boshqa obyektlarni qoʻyish uchun dialoglarni yoqish',
+	'wikieditor-toolbar-dialogs-preference' => 'Havolalar, jadvallar va boshqa obyektlarni qoʻyish uchun dialoglarni yoqish', # Fuzzy
 	'wikieditor-toolbar-hidesig' => 'Asosiy nomfazodagi sahifalarda imzo tugmasini yashirish',
 	'wikieditor-toolbar-loading' => 'Yuklash...',
 	'wikieditor-toolbar-tool-bold' => 'Qalin',
@@ -29380,7 +29959,7 @@ $1:Example.jpg|Izoh2',
 	'wikieditor-toolbar-tool-table-cancel' => 'Bekor',
 	'wikieditor-toolbar-tool-table-toomany' => 'Ushbu dialog 1000 ta katakdan katta hajmdagi jadvalni qoʻyish imkonini bermaydi.',
 	'wikieditor-toolbar-tool-table-invalidnumber' => 'Toʻgʻri qator yoki ustun miqdorini koʻrsatmadingiz.',
-	'wikieditor-toolbar-tool-table-zero' => 'Siz nol miqdordagi qatorli yoki ustunli jadval qoʻya olmaysiz.',
+	'wikieditor-toolbar-tool-table-zero' => 'Qatorlarsiz yoki ustunlarsiz jadval qoʻyib boʻlmaydi.',
 	'wikieditor-toolbar-tool-replace' => 'Qidirish va almashtirish',
 	'wikieditor-toolbar-tool-replace-title' => 'Qidirish va almashtirish',
 	'wikieditor-toolbar-tool-replace-search' => 'Qidirish:',
@@ -29519,7 +30098,7 @@ $messages['vec'] = array(
 	'wikieditor-toolbar' => 'Bara dei strumenti de modifica',
 	'wikieditor-toolbar-desc' => 'Modifica bara dei strumenti de la pàgina co na magiore uxabilità',
 	'wikieditor-toolbar-preference' => 'Abilita bara dei strumenti de modifica avansada',
-	'wikieditor-toolbar-dialogs-preference' => 'Intacar i ajuti par xontar colegamenti, tabèle e altro',
+	'wikieditor-toolbar-dialogs-preference' => 'Intacar le finestre par xontar colegamenti, tabèle e la funsion de serca e sostituissi',
 	'wikieditor-toolbar-hidesig' => "Sconde el boton de ła firma da łe pàjine inte'l namespace prinsipałe",
 	'wikieditor-toolbar-loading' => "So' drio cargar...",
 	'wikieditor-toolbar-tool-bold' => 'Graseto',
@@ -29854,7 +30433,7 @@ $messages['vi'] = array(
 	'wikieditor-toolbar' => 'Thanh công cụ sửa đổi',
 	'wikieditor-toolbar-desc' => 'Thanh công cụ ở trang sửa đổi được cải tiến để dễ sử dụng hơn',
 	'wikieditor-toolbar-preference' => 'Sử dụng thanh công cụ sửa đổi nâng cao',
-	'wikieditor-toolbar-dialogs-preference' => 'Mở hộp thoại để chèn liên kết, bảng, v.v.',
+	'wikieditor-toolbar-dialogs-preference' => 'Mở hộp thoại để chèn liên kết và bảng, cũng như hộp thoại tìm và thay',
 	'wikieditor-toolbar-hidesig' => 'Ẩn nút ký tên từ các trang trong không gian tên chính',
 	'wikieditor-toolbar-loading' => 'Đang tải…',
 	'wikieditor-toolbar-tool-bold' => 'Đậm',
@@ -29882,6 +30461,7 @@ $messages['vi'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => 'Tựa sai',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => 'Liên kết ngoài',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => 'Kiểm tra trang đã tồn tại chưa...',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => 'Trang định hướng',
 	'wikieditor-toolbar-tool-link-int-invalid' => 'Tên trang chỉ định không hợp lệ.',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => 'Hình như bạn đã chọn URL chỉ đến trang wiki khác. Bạn có muốn biến nó thành liên kết nội bộ không?',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => 'Liên kết nội bộ',
@@ -30078,7 +30658,7 @@ $messages['vo'] = array(
 	'wikieditor-toolbar-tool-link-int-target' => 'Tiäd pada:',
 	'wikieditor-toolbar-tool-link-int-text' => 'Vödem yüma',
 	'wikieditor-toolbar-tool-link-cancel' => 'Nosükön',
-	'wikieditor-toolbar-group-format' => 'Lised', # Fuzzy
+	'wikieditor-toolbar-group-format' => 'Fomät',
 	'wikieditor-toolbar-tool-big' => 'Gretik',
 	'wikieditor-toolbar-tool-big-example' => 'Vödem gretik',
 	'wikieditor-toolbar-tool-table' => 'Taib',
@@ -30100,7 +30680,7 @@ $messages['wo'] = array(
 	'wikieditor-toolbar' => 'Banqaasu jumtukaayu coppite',
 	'wikieditor-toolbar-desc' => 'Banqaasu jumtukaayu coppite bees gënal ag jëfandikoom',
 	'wikieditor-toolbar-preference' => 'Doxal banqaasu jumtukaayu coppite bees gënal bi',
-	'wikieditor-toolbar-dialogs-preference' => 'Doxal palanteeri duggaluwaayu lëkkalekaay, xaatim ak yeneen',
+	'wikieditor-toolbar-dialogs-preference' => 'Doxal palanteeri duggaluwaayu lëkkalekaay, xaatim ak yeneen', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Ci yoonu yeb...',
 	'wikieditor-toolbar-tool-bold' => 'Duuf',
 	'wikieditor-toolbar-tool-bold-example' => 'Mbind mu duuf',
@@ -30248,7 +30828,7 @@ $messages['yi'] = array(
 	'wikieditor-toolbar' => 'רעדאקטירונג געצייג־פאס',
 	'wikieditor-toolbar-desc' => 'רעדאַקטירן בלאַט געצייגפאַס מיט פֿאַרברייטערטער ניצלעכקייט',
 	'wikieditor-toolbar-preference' => 'אַקטיווירן פֿאַרברייטערטן רעדאַקטירונג פאַס',
-	'wikieditor-toolbar-dialogs-preference' => 'דערמעגלעכן דיאָלאג קעסטלעך פֿאַר אַרײַנלייגן לינקען, טאַבעלעס און נאך',
+	'wikieditor-toolbar-dialogs-preference' => 'דערמעגלעכן אסיסטאנטן פֿאַר אַרײַנלייגן לינקען, טאַבעלעס ווי אויך די זוכן און פֿאַרבײַטן פֿונקציע.',
 	'wikieditor-toolbar-hidesig' => 'באהאלטן דאס אונטערשריפט קנעפל פון בלעטער אין דעם הויפט נאמענטייל',
 	'wikieditor-toolbar-loading' => 'אָנלאָדן...',
 	'wikieditor-toolbar-tool-bold' => 'דיק',
@@ -30493,7 +31073,7 @@ $messages['yo'] = array(
 	'wikieditor-toolbar' => 'Àtúnṣe sí pẹpẹ irinṣẹ́',
 	'wikieditor-toolbar-desc' => 'Àtúnṣe ojúewé pẹpẹ irinṣẹ́ pẹ̀lú ìṣeémúlò amúdára',
 	'wikieditor-toolbar-preference' => 'Ìgbàláyè pẹpẹ irinṣẹ́ àtúnṣe mímúdára',
-	'wikieditor-toolbar-dialogs-preference' => 'Ìgbàláyè àwọn pátákó àkíyèsí fún ìkìbọ̀ ìjápọ̀, tábìlì àti bẹ́ẹ̀bẹ́ẹ̀ lọ',
+	'wikieditor-toolbar-dialogs-preference' => 'Ìgbàláyè àwọn pátákó àkíyèsí fún ìkìbọ̀ ìjápọ̀, tábìlì àti bẹ́ẹ̀bẹ́ẹ̀ lọ', # Fuzzy
 	'wikieditor-toolbar-loading' => 'Óúnbọ̀wá...',
 	'wikieditor-toolbar-tool-bold' => 'Kedere',
 	'wikieditor-toolbar-tool-bold-example' => 'Ìkọ kedere',
@@ -30721,7 +31301,7 @@ $messages['yue'] = array(
 	'wikieditor-toolbar' => '編輯工具列',
 	'wikieditor-toolbar-desc' => '加強可用性嘅編輯版工具',
 	'wikieditor-toolbar-preference' => '開着加強編輯工具列',
-	'wikieditor-toolbar-dialogs-preference' => '啟用信息框去提供插入連結同表格等嘅幫助',
+	'wikieditor-toolbar-dialogs-preference' => '啟用信息框去提供插入連結同表格等嘅幫助', # Fuzzy
 	'wikieditor-toolbar-loading' => '載入緊...',
 	'wikieditor-toolbar-tool-bold' => '粗體',
 	'wikieditor-toolbar-tool-bold-example' => '粗體字',
@@ -30941,6 +31521,7 @@ Bangla',
  * @author Gaoxuewei
  * @author Hydra
  * @author Liangent
+ * @author Liuxinyu970226
  * @author Onecountry
  * @author PhiLiP
  * @author Shirayuki
@@ -30978,9 +31559,9 @@ $messages['zh-hans'] = array(
 	'wikieditor-toc-show' => '显示内容',
 	'wikieditor-toc-hide' => '隐藏内容',
 	'wikieditor-toolbar' => '编辑工具栏',
-	'wikieditor-toolbar-desc' => '具有增强可用性的页面编辑工具',
-	'wikieditor-toolbar-preference' => '启用增强编辑工具栏',
-	'wikieditor-toolbar-dialogs-preference' => '启用对话框插入链接、表格等',
+	'wikieditor-toolbar-desc' => '有增强的使用性能的页面编辑工具栏',
+	'wikieditor-toolbar-preference' => '启用增强的编辑工具栏',
+	'wikieditor-toolbar-dialogs-preference' => '启用插入链接表格向导及查找和替换功能',
 	'wikieditor-toolbar-hidesig' => '在主名字空间中隐藏签名按钮',
 	'wikieditor-toolbar-loading' => '正在载入',
 	'wikieditor-toolbar-tool-bold' => '粗体',
@@ -31008,6 +31589,7 @@ $messages['zh-hans'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => '无效标题',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => '外部链接',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => '检查页面是否存在……',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => '消歧义页面',
 	'wikieditor-toolbar-tool-link-int-invalid' => '您指定的标题无效。',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => '您输入的网址似乎指向另一个wiki页面，是否希望将其改为内部链接？',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => '内部链接',
@@ -31018,7 +31600,7 @@ $messages['zh-hans'] = array(
 	'wikieditor-toolbar-tool-file-title' => '插入文件',
 	'wikieditor-toolbar-file-target' => '文件名：',
 	'wikieditor-toolbar-file-caption' => '标题：',
-	'wikieditor-toolbar-file-size' => '大小：',
+	'wikieditor-toolbar-file-size' => '尺寸：',
 	'wikieditor-toolbar-file-float' => '对齐：',
 	'wikieditor-toolbar-file-default' => '(默认)',
 	'wikieditor-toolbar-file-format' => '格式：',
@@ -31026,7 +31608,7 @@ $messages['zh-hans'] = array(
 	'wikieditor-toolbar-tool-file-insert' => '插入',
 	'wikieditor-toolbar-tool-file-cancel' => '取消',
 	'wikieditor-toolbar-tool-reference' => '参考',
-	'wikieditor-toolbar-tool-reference-example' => '在此处插入注释文字',
+	'wikieditor-toolbar-tool-reference-example' => '请在这里插入注释文字',
 	'wikieditor-toolbar-tool-reference-cancel' => '取消',
 	'wikieditor-toolbar-tool-reference-title' => '插入注释内容',
 	'wikieditor-toolbar-tool-reference-insert' => '插入',
@@ -31048,7 +31630,7 @@ $messages['zh-hans'] = array(
 	'wikieditor-toolbar-tool-indent' => '缩进',
 	'wikieditor-toolbar-tool-indent-example' => '已缩进行',
 	'wikieditor-toolbar-tool-nowiki' => '非维基格式文字',
-	'wikieditor-toolbar-tool-nowiki-example' => '在此处插入非维基格式文字',
+	'wikieditor-toolbar-tool-nowiki-example' => '请在这里插入非格式化文字',
 	'wikieditor-toolbar-tool-redirect' => '重定向',
 	'wikieditor-toolbar-tool-redirect-example' => '目标页名称',
 	'wikieditor-toolbar-tool-big' => '大号',
@@ -31118,10 +31700,10 @@ $1:Example.jpg|标题2',
 	'wikieditor-toolbar-characters-page-persian' => '波斯语',
 	'wikieditor-toolbar-characters-page-hebrew' => '希伯来字母',
 	'wikieditor-toolbar-characters-page-bangla' => '孟加拉',
-	'wikieditor-toolbar-characters-page-tamil' => '泰米尔',
+	'wikieditor-toolbar-characters-page-tamil' => '泰米尔数字和符号',
 	'wikieditor-toolbar-characters-page-telugu' => '泰卢固字母',
-	'wikieditor-toolbar-characters-page-sinhala' => '僧伽罗字母',
-	'wikieditor-toolbar-characters-page-gujarati' => '古吉拉特字母',
+	'wikieditor-toolbar-characters-page-sinhala' => '僧伽罗语',
+	'wikieditor-toolbar-characters-page-gujarati' => '古吉拉特语',
 	'wikieditor-toolbar-characters-page-devanagari' => '梵文',
 	'wikieditor-toolbar-characters-page-thai' => '泰语',
 	'wikieditor-toolbar-characters-page-lao' => '老挝语',
@@ -31195,11 +31777,13 @@ $1:Example.jpg|标题2',
 
 /** Traditional Chinese (中文（繁體）‎)
  * @author Anakmalaysia
+ * @author Ch.Andrew
  * @author Frankou
  * @author Gaoxuewei
  * @author Horacewai2
  * @author KaiesTse
  * @author Liangent
+ * @author Liuxinyu970226
  * @author Mark85296341
  * @author Oapbtommy
  * @author PhiLiP
@@ -31241,7 +31825,7 @@ $messages['zh-hant'] = array(
 	'wikieditor-toolbar' => '編輯工具列',
 	'wikieditor-toolbar-desc' => '可用性更佳之編輯工具',
 	'wikieditor-toolbar-preference' => '啟用加強編輯工具列',
-	'wikieditor-toolbar-dialogs-preference' => '使用對話框插入連結、表格等',
+	'wikieditor-toolbar-dialogs-preference' => '啟用精靈來插入連結、表格以及搜尋與取代函數',
 	'wikieditor-toolbar-hidesig' => '從主名字空間的頁面中隱藏簽名按鈕',
 	'wikieditor-toolbar-loading' => '載入中...',
 	'wikieditor-toolbar-tool-bold' => '粗體',
@@ -31269,6 +31853,7 @@ $messages['zh-hant'] = array(
 	'wikieditor-toolbar-tool-link-int-target-status-invalid' => '無效標題',
 	'wikieditor-toolbar-tool-link-int-target-status-external' => '外部連結',
 	'wikieditor-toolbar-tool-link-int-target-status-loading' => '正檢查頁面是否存在……',
+	'wikieditor-toolbar-tool-link-int-target-status-disambig' => '消歧義頁',
 	'wikieditor-toolbar-tool-link-int-invalid' => '所指定標題無效。',
 	'wikieditor-toolbar-tool-link-lookslikeinternal' => '閣下所輸入 URL 似乎指向另一個 wiki 頁面，請問須否轉為內部連結？',
 	'wikieditor-toolbar-tool-link-lookslikeinternal-int' => '內部連結',
diff --git a/extensions/WikiEditor/WikiEditor.php b/extensions/WikiEditor/WikiEditor.php
index dc6df0a6..103c9eb9 100644
--- a/extensions/WikiEditor/WikiEditor.php
+++ b/extensions/WikiEditor/WikiEditor.php
@@ -239,6 +239,7 @@ $wgResourceModules += array(
 			'wikieditor-toolbar-tool-link-int-target-status-invalid',
 			'wikieditor-toolbar-tool-link-int-target-status-external',
 			'wikieditor-toolbar-tool-link-int-target-status-loading',
+			'wikieditor-toolbar-tool-link-int-target-status-disambig',
 			'wikieditor-toolbar-tool-link-int-invalid',
 			'wikieditor-toolbar-tool-link-lookslikeinternal',
 			'wikieditor-toolbar-tool-link-lookslikeinternal-int',
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.css b/extensions/WikiEditor/modules/ext.wikiEditor.css
index f0665730..30a27326 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.css
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.css
@@ -2,19 +2,16 @@
  * CSS for WikiEditor
  */
 
-/* This ID (#editform) could change in MediaWiki */
 form#editform {
 	margin: 0;
 	padding: 0;
 }
 
-/* These IDs (#wpSummaryLabel and #wpSummary) could change in MediaWiki */
 #wpSummary,
 #wpSummaryLabel {
 	margin-bottom: 1em;
 }
 
-/* This ID (#wpTextbox1) could change in MediaWiki */
 .wikiEditor-ui textarea#wpTextbox1 {
 	border: none;
 	padding: 0;
@@ -26,3 +23,9 @@ form#editform {
 .wikiEditor-ui .wikiEditor-ui-text > textarea#wpTextbox1 {
 	margin: 0;
 }
+
+/* Hide vanilla MediaWiki's "Editing help" link, as we provide it in the toolbar */
+.editButtons .editHelp,
+.editButtons .mw-editButtons-pipe-separator {
+	display: none;
+}
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.dialogs.js b/extensions/WikiEditor/modules/ext.wikiEditor.dialogs.js
index 0e0dd090..c6d327f8 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.dialogs.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.dialogs.js
@@ -1,15 +1,14 @@
 /*
  * JavaScript for WikiEditor Dialogs
  */
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
 	if ( !$.wikiEditor.isSupported( $.wikiEditor.modules.dialogs ) ) {
 		return;
 	}
-	
+
 	// Replace icons
 	$.wikiEditor.modules.dialogs.config.replaceIcons( $( '#wpTextbox1' ) );
-	
+
 	// Add dialogs module
 	$( '#wpTextbox1' ).wikiEditor( 'addModule', $.wikiEditor.modules.dialogs.config.getDefaultConfig() );
 } );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.highlight.js b/extensions/WikiEditor/modules/ext.wikiEditor.highlight.js
index a6b43851..92515cfd 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.highlight.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.highlight.js
@@ -1,8 +1,7 @@
 /*
  * JavaScript for WikiEditor Highlighting
  */
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
 	// Add highlight module
 	$( '#wpTextbox1' ).wikiEditor( 'addModule', 'highlight' );
 } );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.js b/extensions/WikiEditor/modules/ext.wikiEditor.js
index 6056e63b..46087989 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.js
@@ -1,8 +1,7 @@
 /*
  * JavaScript for WikiEditor
  */
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
 	// Initialize wikiEditor
 	$( '#wpTextbox1' ).wikiEditor();
 } );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.preview.js b/extensions/WikiEditor/modules/ext.wikiEditor.preview.js
index 3fbca82d..cdc00f7b 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.preview.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.preview.js
@@ -1,8 +1,7 @@
 /*
  * JavaScript for WikiEditor Preview module
  */
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
 	// Add preview module
 	$( 'textarea#wpTextbox1' ).wikiEditor( 'addModule', 'preview' );
 } );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.previewDialog.js b/extensions/WikiEditor/modules/ext.wikiEditor.previewDialog.js
index 67f97e00..3b1acd7c 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.previewDialog.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.previewDialog.js
@@ -1,8 +1,7 @@
 /*
  * JavaScript for WikiEditor Preview Dialog
  */
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
 	// Add preview module
 	$( 'textarea#wpTextbox1' ).wikiEditor( 'addModule', 'previewDialog' );
 } );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.publish.js b/extensions/WikiEditor/modules/ext.wikiEditor.publish.js
index d874478c..423766d2 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.publish.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.publish.js
@@ -1,8 +1,7 @@
 /*
  * JavaScript for WikiEditor Publish module
  */
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
 	// Add publish module
 	$( '#wpTextbox1' ).wikiEditor( 'addModule', 'publish' );
 } );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.templateEditor.js b/extensions/WikiEditor/modules/ext.wikiEditor.templateEditor.js
index 8879d10d..660a14fb 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.templateEditor.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.templateEditor.js
@@ -1,12 +1,13 @@
 /*
  * JavaScript for WikiEditor Template Editor
  */
-
-$( document ).ready( function () {
-	// Disable in template namespace
-	if ( mw.config.get( 'wgNamespaceNumber' ) === 10 ) {
-		return true;
-	}
-	// Add template editor module
-	$( 'textarea#wpTextbox1' ).wikiEditor( 'addModule', 'templateEditor' );
-});
+( function ( mw, $ ) {
+	$( document ).ready( function () {
+		// Disable in template namespace
+		if ( mw.config.get( 'wgNamespaceNumber' ) === 10 ) {
+			return true;
+		}
+		// Add template editor module
+		$( 'textarea#wpTextbox1' ).wikiEditor( 'addModule', 'templateEditor' );
+	} );
+}( mediaWiki, jQuery ) );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.templates.js b/extensions/WikiEditor/modules/ext.wikiEditor.templates.js
index 6eae6de5..fec51866 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.templates.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.templates.js
@@ -1,12 +1,13 @@
 /*
  * JavaScript for WikiEditor Templates
  */
-
-$( document ).ready( function () {
-	// Disable for template namespace
-	if ( mw.config.get( 'wgNamespaceNumber' ) === 10 ) {
-		return true;
-	}
-	// Add templates module
-	$( '#wpTextbox1' ).wikiEditor( 'addModule', 'templates' );
-} );
+( function ( mw, $ ) {
+	$( document ).ready( function () {
+		// Disable for template namespace
+		if ( mw.config.get( 'wgNamespaceNumber' ) === 10 ) {
+			return true;
+		}
+		// Add templates module
+		$( '#wpTextbox1' ).wikiEditor( 'addModule', 'templates' );
+	} );
+}( mediaWiki, jQuery ) );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.tests.toolbar.js b/extensions/WikiEditor/modules/ext.wikiEditor.tests.toolbar.js
index d4ffe5ae..7ed765e9 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.tests.toolbar.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.tests.toolbar.js
@@ -4,7 +4,7 @@
 var textareaId = '#wpTextbox1';
 var wikiEditorTests = {
 	// Add emoticons section
-	add_sections_toolbar: {
+	'add_sections_toolbar': {
 		call: 'addToToolbar',
 		data: {
 			'sections': {
@@ -159,8 +159,8 @@ var wikiEditorTests = {
 		data: {
 			section: 'info',
 			page: 'removeme'
-	    },
-	    test: '*[rel=info].section *[rel=removeme].page',
+		},
+		test: '*[rel=info].section *[rel=removeme].page',
 		pre: 1,
 		post: 0
 	},
@@ -171,8 +171,8 @@ var wikiEditorTests = {
 			section: 'info',
 			page: 'emoticons',
 			'character': ':))'
-	    },
-	    test: '*[rel=info].section *[rel=emoticons].page *[rel=":))"]',
+		},
+		test: '*[rel=info].section *[rel=emoticons].page *[rel=":))"]',
 		pre: 1,
 		post: 0
 	},
@@ -211,7 +211,7 @@ jQuery(document).ready( function ( $ ) {
 				return false;
 			}
 
-			var test, pre, post,
+			var test, pre, post, i,
 				messages = [ 'Running tests for wikiEditor API' ],
 				$target = $( textareaId ),
 				$ui = $target.data( 'wikiEditor-context' ).$ui,
@@ -234,13 +234,13 @@ jQuery(document).ready( function ( $ ) {
 			}
 
 			if ( window.console ) {
-				for ( var i = 0; i < messages.length; i++ ) {
+				for ( i = 0; i < messages.length; i++ ) {
 					window.console.log( messages[i] );
 				}
 			}
 
 			$(this)
-				.attr( 'title', messages.join( " | " ) )
+				.attr( 'title', messages.join( ' | ' ) )
 				.text( passes + ' / ' + tests + ' were successful' )
 				.css( 'backgroundColor', passes < tests ? 'red' : 'green' )
 				.data( 'testDone', 'true' )
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.toc.js b/extensions/WikiEditor/modules/ext.wikiEditor.toc.js
index 264e9f86..1fc542c5 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.toc.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.toc.js
@@ -1,8 +1,7 @@
 /*
  * JavaScript for WikiEditor Table of Contents
  */
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
 	// Add table of contents module
 	$( '#wpTextbox1' ).wikiEditor( 'addModule', 'toc' );
 } );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.hideSig.js b/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.hideSig.js
index 3bc0f0b4..48d30274 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.hideSig.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.hideSig.js
@@ -1,7 +1,7 @@
 /*
  * Remove the signature button if the main namespace is edited.
  */
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
 	// This module is designed not to depend on ext.wikiEditor or jquery.wikiEditor.
 	// Removing this dependency fixed various bugs, but it does mean that we have to
 	// account for the situation where $.wikiEditor is not present
@@ -11,4 +11,4 @@ $( document ).ready( function() {
 	if ( $( 'body' ).hasClass( 'ns-0' ) ) {
 		$( '#wpTextbox1' ).wikiEditor( 'removeFromToolbar', { 'section': 'main', 'group': 'insert', 'tool': 'signature' } );
 	}
-});
+} );
diff --git a/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.js b/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.js
index 5cdeae57..3f30c0c4 100644
--- a/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.js
+++ b/extensions/WikiEditor/modules/ext.wikiEditor.toolbar.js
@@ -1,8 +1,7 @@
 /*
  * JavaScript for WikiEditor Toolbar
  */
-
-$( document ).ready( function() {
+jQuery( document ).ready( function ( $ ) {
 	if ( !$.wikiEditor.isSupported( $.wikiEditor.modules.toolbar ) ) {
 		$( '.wikiEditor-oldToolbar' ).show();
 		return;
diff --git a/extensions/WikiEditor/modules/images/dialogs/insert-disambiguation.png b/extensions/WikiEditor/modules/images/dialogs/insert-disambiguation.png
new file mode 100644
index 00000000..f9057763
Binary files /dev/null and b/extensions/WikiEditor/modules/images/dialogs/insert-disambiguation.png differ
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.css b/extensions/WikiEditor/modules/jquery.wikiEditor.css
index d8e331cc..6e05ff03 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.css
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.css
@@ -18,9 +18,6 @@
 }
 .wikiEditor-ui textarea:focus {
 	outline: none;
-}
-.wikiEditor-ui .wikiEditor-ui-bottom {
-	
 }
 .wikiEditor-ui .wikiEditor-ui-text {
 	line-height: 0;
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.css b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.css
index efde00fb..39d9d50e 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.css
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.css
@@ -55,7 +55,8 @@
 #wikieditor-toolbar-link-int-target-status-exists,
 #wikieditor-toolbar-link-int-target-status-notexists,
 #wikieditor-toolbar-link-int-target-status-invalid,
-#wikieditor-toolbar-link-int-target-status-external {
+#wikieditor-toolbar-link-int-target-status-external,
+#wikieditor-toolbar-link-int-target-status-disambig {
 	padding-left: 30px;
 	background-position: 0 50%;
 	background-repeat: no-repeat;
@@ -80,6 +81,11 @@
 	background-image: url(images/dialogs/insert-link-external.png);
 	background-position: left;
 }
+#wikieditor-toolbar-link-int-target-status-disambig {
+	/* @embed */
+	background-image: url(images/dialogs/insert-disambiguation.png);
+	background-position: left;
+}
 /* File dialog */
 #wikieditor-toolbar-file-target,
 #wikieditor-toolbar-file-caption {
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.js b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.js
index 146de0f9..f37d004e 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.config.js
@@ -1,6 +1,8 @@
 /**
  * Configuration of Dialog module for wikiEditor
  */
+/*jshint curly:false, noarg:false, quotmark:false, onevar:false */
+/*global alert */
 ( function ( $, mw ) {
 
 $.wikiEditor.modules.dialogs.config = {
@@ -188,45 +190,45 @@ $.wikiEditor.modules.dialogs.config = {
 						// Show loading spinner while waiting for the API to respond
 						updateWidget( 'loading' );
 						// Call the API to check page status, saving the request object so it can be aborted if
-						// necessary
+						// necessary.
+						// This used to request a page that would show whether or not the target exists, but we can
+						// also check whether it has the disambiguation property and still get existence information.
+						// If the Disambiguator extension is not installed then such a property won't be set.
 						$( '#wikieditor-toolbar-link-int-target-status' ).data(
 							'request',
-							$.ajax( {
-								url: mw.util.wikiScript( 'api' ),
-								dataType: 'json',
-								data: {
-									action: 'query',
-									indexpageids: '',
-									titles: target,
-									converttitles: '',
-									format: 'json'
-								},
-								success: function ( data ) {
-									var status;
-									if ( !data || !data.query ) {
-										// This happens in some weird cases
-										status = false;
-									} else {
-										var page = data.query.pages[data.query.pageids[0]];
-										status = 'exists';
-										if ( page.missing !== undefined ) {
-											status = 'notexists';
-										} else if ( page.invalid !== undefined ) {
-											status = 'invalid';
-										}
-									}
-									// Cache the status of the link target if the force internal
-									// parameter was not passed
-									if ( !internal ) {
-										cache[target] = status;
+							( new mw.Api() ).get( {
+								action: 'query',
+								prop: 'pageprops',
+								titles: target,
+								ppprop: 'disambiguation',
+								indexpageids: true
+							} ).done( function ( data ) {
+								var status;
+								if ( !data.query ) {
+									// This happens in some weird cases
+									status = false;
+								} else {
+									var page = data.query.pages[data.query.pageids[0]];
+									status = 'exists';
+									if ( page.missing !== undefined ) {
+										status = 'notexists';
+									} else if ( page.invalid !== undefined ) {
+										status = 'invalid';
+									} else if ( page.pageprops !== undefined ) {
+										status = 'disambig';
 									}
-									updateWidget( status );
 								}
+								// Cache the status of the link target if the force internal
+								// parameter was not passed
+								if ( !internal ) {
+									cache[target] = status;
+								}
+								updateWidget( status );
 							} )
 						);
 					}
 					$( '#wikieditor-toolbar-link-type-int, #wikieditor-toolbar-link-type-ext' ).click( function () {
-						if ( $( '#wikieditor-toolbar-link-type-ext' ).is( ':checked' ) ) {
+						if ( $( '#wikieditor-toolbar-link-type-ext' ).prop( 'checked' ) ) {
 							// Abort previous request
 							var request = $( '#wikieditor-toolbar-link-int-target-status' ).data( 'request' );
 							if ( request ) {
@@ -234,8 +236,9 @@ $.wikiEditor.modules.dialogs.config = {
 							}
 							updateWidget( 'external' );
 						}
-						if ( $( '#wikieditor-toolbar-link-type-int' ).is( ':checked' ) )
+						if ( $( '#wikieditor-toolbar-link-type-int' ).prop( 'checked' ) ) {
 							updateExistence( true );
+						}
 					});
 					// Set labels of tabs based on rel values
 					$(this).find( '[rel]' ).each( function () {
@@ -250,12 +253,12 @@ $.wikiEditor.modules.dialogs.config = {
 						.data( 'tooltip', mw.msg( 'wikieditor-toolbar-tool-link-int-text-tooltip' ) );
 					$( '#wikieditor-toolbar-link-int-target, #wikieditor-toolbar-link-int-text' )
 						.each( function () {
-							var tooltip = mw.msg( $( this ).attr( 'id' ) + '-tooltip' );
-							if ( $( this ).val() === '' )
+							if ( $( this ).val() === '' ) {
 								$( this )
 									.addClass( 'wikieditor-toolbar-dialog-hint' )
 									.val( $( this ).data( 'tooltip' ) )
 									.data( 'tooltip-mode', true );
+							}
 						} )
 						.focus( function () {
 							if ( $( this ).val() === $( this ).data( 'tooltip' ) ) {
@@ -295,26 +298,30 @@ $.wikiEditor.modules.dialogs.config = {
 								$( '#wikieditor-toolbar-link-type-int' ).prop( 'checked', true );
 								updateExistence();
 							}
-							if ( $( '#wikieditor-toolbar-link-int-text' ).data( 'untouched' ) )
+							/*jshint eqeqeq:false */
+							if ( $( '#wikieditor-toolbar-link-int-text' ).data( 'untouched' ) ) {
 								if ( $( '#wikieditor-toolbar-link-int-target' ).val() ==
-									$( '#wikieditor-toolbar-link-int-target' ).data( 'tooltip' ) ) {
-										$( '#wikieditor-toolbar-link-int-text' )
-											.addClass( 'wikieditor-toolbar-dialog-hint' )
-											.val( $( '#wikieditor-toolbar-link-int-text' ).data( 'tooltip' ) )
-											.change();
-									} else {
-										$( '#wikieditor-toolbar-link-int-text' )
-											.val( $( '#wikieditor-toolbar-link-int-target' ).val() )
-											.change();
-									}
+									$( '#wikieditor-toolbar-link-int-target' ).data( 'tooltip' )
+								) {
+									$( '#wikieditor-toolbar-link-int-text' )
+										.addClass( 'wikieditor-toolbar-dialog-hint' )
+										.val( $( '#wikieditor-toolbar-link-int-text' ).data( 'tooltip' ) )
+										.change();
+								} else {
+									$( '#wikieditor-toolbar-link-int-text' )
+										.val( $( '#wikieditor-toolbar-link-int-target' ).val() )
+										.change();
+								}
+							}
 						}, 0 );
 					});
 					$( '#wikieditor-toolbar-link-int-text' ).bind( 'change keydown paste cut', function () {
 						var oldVal = $(this).val();
 						var that = this;
 						setTimeout( function () {
-							if ( $(that).val() !== oldVal )
+							if ( $(that).val() !== oldVal ) {
 								$(that).data( 'untouched', false );
+							}
 						}, 0 );
 					});
 					// Add images to the page existence widget, which will be shown mutually exclusively to communicate if
@@ -324,6 +331,7 @@ $.wikiEditor.modules.dialogs.config = {
 					var invalidMsg = mw.msg( 'wikieditor-toolbar-tool-link-int-target-status-invalid' );
 					var externalMsg = mw.msg( 'wikieditor-toolbar-tool-link-int-target-status-external' );
 					var loadingMsg = mw.msg( 'wikieditor-toolbar-tool-link-int-target-status-loading' );
+					var disambigMsg = mw.msg( 'wikieditor-toolbar-tool-link-int-target-status-disambig' );
 					$( '#wikieditor-toolbar-link-int-target-status' )
 						.append( $( '<div>' )
 							.attr( 'id', 'wikieditor-toolbar-link-int-target-status-exists' )
@@ -349,6 +357,10 @@ $.wikiEditor.modules.dialogs.config = {
 								'title': loadingMsg
 							} ) )
 						)
+						.append( $( '<div>' )
+							.attr( 'id', 'wikieditor-toolbar-link-int-target-status-disambig' )
+							.append( disambigMsg )
+						)
 						.data( 'existencecache', {} )
 						.children().hide();
 
@@ -374,7 +386,7 @@ $.wikiEditor.modules.dialogs.config = {
 
 					// Title suggestions
 					$( '#wikieditor-toolbar-link-int-target' ).data( 'suggcache', {} ).suggestions( {
-						fetch: function ( query ) {
+						fetch: function () {
 							var that = this;
 							var title = $(this).val();
 
@@ -603,7 +615,7 @@ $.wikiEditor.modules.dialogs.config = {
 							// Execute the action associated with the first button
 							// when the user presses Enter
 							$(this).closest( '.ui-dialog' ).keypress( function ( e ) {
-								if ( ( e.keyCode || e.which ) == 13 ) {
+								if ( ( e.keyCode || e.which ) === 13 ) {
 									var button = $(this).data( 'dialogaction' ) || $(this).find( 'button:first' );
 									button.click();
 									e.preventDefault();
@@ -701,7 +713,7 @@ $.wikiEditor.modules.dialogs.config = {
 							// Execute the action associated with the first button
 							// when the user presses Enter
 							$( this ).closest( '.ui-dialog' ).keypress( function ( e ) {
-								if ( ( e.keyCode || e.which ) == 13 ) {
+								if ( ( e.keyCode || e.which ) === 13 ) {
 									var button = $( this ).data( 'dialogaction' ) || $( this ).find( 'button:first' );
 									button.click();
 									e.preventDefault();
@@ -973,7 +985,7 @@ $.wikiEditor.modules.dialogs.config = {
 						var hiddenHTML = $( '.wikieditor-toolbar-table-preview-hidden' ).html();
 						$( '.wikieditor-toolbar-table-preview-header' ).html( hiddenHTML );
 						$( '.wikieditor-toolbar-table-preview-hidden' ).html( headerHTML );
-						if ( typeof jQuery.fn.tablesorter == 'function' ) {
+						if ( typeof jQuery.fn.tablesorter === 'function' ) {
 								$( '#wikieditor-toolbar-table-preview, #wikieditor-toolbar-table-preview2' )
 									.filter( '.sortable' )
 									.tablesorter();
@@ -1065,7 +1077,7 @@ $.wikiEditor.modules.dialogs.config = {
 							// Execute the action associated with the first button
 							// when the user presses Enter
 							$(this).closest( '.ui-dialog' ).keypress( function ( e ) {
-								if ( ( e.keyCode || e.which ) == 13 ) {
+								if ( ( e.keyCode || e.which ) === 13 ) {
 									var button = $(this).data( 'dialogaction' ) || $(this).find( 'button:first' );
 									button.click();
 									e.preventDefault();
@@ -1197,7 +1209,7 @@ $.wikiEditor.modules.dialogs.config = {
 
 						if ( !match ) {
 							$( '#wikieditor-toolbar-replace-nomatch' ).show();
-						} else if ( mode == 'replaceAll' ) {
+						} else if ( mode === 'replaceAll' ) {
 							// Instead of using repetitive .match() calls, we use one .match() call with /g
 							// and indexOf() followed by substr() to find the offsets. This is actually
 							// faster because our indexOf+substr loop is faster than a match loop, and the
@@ -1232,7 +1244,7 @@ $.wikiEditor.modules.dialogs.config = {
 							$(this).data( 'offset', 0 );
 						} else {
 
-							if ( mode == 'replace' ) {
+							if ( mode === 'replace' ) {
 								var actualReplacement;
 
 								if (isRegex) {
@@ -1325,7 +1337,7 @@ $.wikiEditor.modules.dialogs.config = {
 							// Execute the action associated with the first button
 							// when the user presses Enter
 							$(this).closest( '.ui-dialog' ).keypress( function ( e ) {
-								if ( ( e.keyCode || e.which ) == 13 ) {
+								if ( ( e.keyCode || e.which ) === 13 ) {
 									var button = $(this).data( 'dialogaction' ) || $(this).find( 'button:first' );
 									button.click();
 									e.preventDefault();
@@ -1345,12 +1357,12 @@ $.wikiEditor.modules.dialogs.config = {
 
 						$( textbox )
 							.bind( 'keypress.srdialog', function ( e ) {
-								if ( e.which == 13 ) {
+								if ( e.which === 13 ) {
 									// Enter
 									var button = dialog.data( 'dialogaction' ) || dialog.find( 'button:first' );
 									button.click();
 									e.preventDefault();
-								} else if ( e.which == 27 ) {
+								} else if ( e.which === 27 ) {
 									// Escape
 									$(that).dialog( 'close' );
 								}
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.js b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.js
index f6d86d78..6d92966f 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.dialogs.js
@@ -42,8 +42,8 @@ $.wikiEditor.modules.dialogs = {
 		},
 		openDialog: function ( context, module ) {
 			if ( module in $.wikiEditor.modules.dialogs.modules ) {
-				var mod = $.wikiEditor.modules.dialogs.modules[module];
-				var $dialog = $( '#' + mod.id );
+				var mod = $.wikiEditor.modules.dialogs.modules[module],
+					$dialog = $( '#' + mod.id );
 				if ( $dialog.length === 0 ) {
 					$.wikiEditor.modules.dialogs.fn.reallyCreate( context, mod, module );
 					$dialog = $( '#' + mod.id );
@@ -82,7 +82,7 @@ $.wikiEditor.modules.dialogs = {
 				module = config[mod];
 				// Only create the dialog if it's supported, isn't filtered and doesn't exist yet
 				filtered = false;
-				if ( typeof module.filters != 'undefined' ) {
+				if ( typeof module.filters !== 'undefined' ) {
 					for ( i = 0; i < module.filters.length; i++ ) {
 						if ( $( module.filters[i] ).length === 0 ) {
 							filtered = true;
@@ -92,7 +92,7 @@ $.wikiEditor.modules.dialogs = {
 				}
 				// If the dialog already exists, but for another textarea, simply remove it
 				$existingDialog = $( '#' + module.id );
-				if ( $existingDialog.length > 0 && $existingDialog.data( 'context' ).$textarea != context.$textarea ) {
+				if ( $existingDialog.length > 0 && $existingDialog.data( 'context' ).$textarea !== context.$textarea ) {
 					$existingDialog.remove();
 				}
 				// Re-select from the DOM, we might have removed the dialog just now
@@ -119,13 +119,13 @@ $.wikiEditor.modules.dialogs = {
 		 * @param {String} name Dialog name (key in $.wikiEditor.modules.dialogs.modules)
 		 */
 		reallyCreate: function ( context, module, name ) {
-			var msg,
+			var msg, dialogDiv,
 				configuration = module.dialog;
 			// Add some stuff to configuration
 			configuration.bgiframe = true;
 			configuration.autoOpen = false;
 			// By default our dialogs are modal, unless explicitely defined in their specific configuration.
-			if( typeof configuration.modal == "undefined" ) {
+			if( typeof configuration.modal === 'undefined' ) {
 				configuration.modal = true;
 			}
 			configuration.title = $.wikiEditor.autoMsg( module, 'title' );
@@ -138,7 +138,7 @@ $.wikiEditor.modules.dialogs = {
 			}
 			configuration.buttons = configuration.newButtons;
 			// Create the dialog <div>
-			var dialogDiv = $( '<div>' )
+			dialogDiv = $( '<div>' )
 				.attr( 'id', module.id )
 				.html( module.html )
 				.data( 'context', context )
@@ -171,26 +171,28 @@ $.wikiEditor.modules.dialogs = {
 		 * NOTE: This function assumes $.ui.dialog has already been loaded
 		 */
 		resize: function () {
-			var wrapper = $(this).closest( '.ui-dialog' );
-			var oldWidth = wrapper.width();
-			// Make sure elements don't wrapped so we get an accurate idea of whether they really fit. Also temporarily show
-			// hidden elements. Work around jQuery bug where <div style="display: inline;"/> inside a dialog is both
-			// :visible and :hidden
-			var oldHidden = $(this).find( '*' ).not( ':visible' );
+			var oldWS, thisWidth, wrapperWidth,
+				wrapper = $(this).closest( '.ui-dialog' ),
+				oldWidth = wrapper.width(),
+				// Make sure elements don't wrapped so we get an accurate idea of whether they really fit. Also temporarily show
+				// hidden elements. Work around jQuery bug where <div style="display: inline;"/> inside a dialog is both
+				// :visible and :hidden
+				oldHidden = $(this).find( '*' ).not( ':visible' );
+
 			// Save the style attributes of the hidden elements to restore them later. Calling hide() after show() messes up
 			// for elements hidden with a class
 			oldHidden.each( function () {
 				$(this).data( 'oldstyle', $(this).attr( 'style' ) );
 			});
 			oldHidden.show();
-			var oldWS = $(this).css( 'white-space' );
+			oldWS = $(this).css( 'white-space' );
 			$(this).css( 'white-space', 'nowrap' );
 			if ( wrapper.width() <= $(this).get(0).scrollWidth ) {
-				var thisWidth = $(this).data( 'thisWidth' ) ? $(this).data( 'thisWidth' ) : 0;
+				thisWidth = $(this).data( 'thisWidth' ) ? $(this).data( 'thisWidth' ) : 0;
 				thisWidth = Math.max( $(this).get(0).width, thisWidth );
 				$(this).width( thisWidth );
 				$(this).data( 'thisWidth', thisWidth );
-				var wrapperWidth = $(this).data( 'wrapperWidth' ) ? $(this).data( 'wrapperWidth' ) : 0;
+				wrapperWidth = $(this).data( 'wrapperWidth' ) ? $(this).data( 'wrapperWidth' ) : 0;
 				wrapperWidth = Math.max( wrapper.get(0).scrollWidth, wrapperWidth );
 				wrapper.width( wrapperWidth );
 				$(this).data( 'wrapperWidth', wrapperWidth );
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.highlight.js b/extensions/WikiEditor/modules/jquery.wikiEditor.highlight.js
index 9d964fa7..f646e456 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.highlight.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.highlight.js
@@ -20,13 +20,21 @@ $.wikiEditor.modules.highlight = {
 	 * Internally used event handlers
 	 */
 	evt: {
+		/**
+		 * @param context
+		 * @param event
+		 */
 		delayedChange: function ( context, event ) {
-			if ( event.data.scope == 'realchange' ) {
+			if ( event.data.scope === 'realchange' ) {
 				$.wikiEditor.modules.highlight.fn.scan( context );
 				$.wikiEditor.modules.highlight.fn.mark( context, event.data.scope );
 			}
 		},
-		ready: function ( context, event ) {
+		/**
+		 * @param context
+		 * @param event
+		 */
+		ready: function ( context ) {
 			$.wikiEditor.modules.highlight.fn.scan( context );
 			$.wikiEditor.modules.highlight.fn.mark( context, 'ready' );
 		}
@@ -39,19 +47,22 @@ $.wikiEditor.modules.highlight = {
 		/**
 		 * Creates a highlight module within a wikiEditor
 		 *
+		 * @param context
 		 * @param config Configuration object to create module from
 		 */
-		create: function ( context, config ) {
+		create: function ( context ) {
 			context.modules.highlight.markersStr = '';
 		},
 		/**
 		 * Scans text division for tokens
 		 *
+		 * @param context
 		 * @param division
 		 */
-		scan: function ( context, division ) {
+		scan: function ( context ) {
 			var tokenArray, text, module, exp,
-				left, right, match;
+				left, right, match,
+				regex, label, markAfter, offset;
 			/*jshint eqnull: true */
 
 			// Remove all existing tokens
@@ -65,11 +76,11 @@ $.wikiEditor.modules.highlight = {
 				if ( module in $.wikiEditor.modules && 'exp' in $.wikiEditor.modules[module] ) {
 					for ( exp in $.wikiEditor.modules[module].exp ) {
 						// Prepare configuration
-						var regex = $.wikiEditor.modules[module].exp[exp].regex;
-						var label = $.wikiEditor.modules[module].exp[exp].label;
-						var markAfter = $.wikiEditor.modules[module].exp[exp].markAfter || false;
+						regex = $.wikiEditor.modules[module].exp[exp].regex;
+						label = $.wikiEditor.modules[module].exp[exp].label;
+						markAfter = $.wikiEditor.modules[module].exp[exp].markAfter || false;
 						// Search for tokens
-						var offset = 0;
+						offset = 0;
 						while ( ( match = text.substr( offset ).match( regex ) ) != null ) {
 							right = ( left = offset + match.index ) + match[0].length;
 							tokenArray[tokenArray.length] = {
@@ -95,16 +106,19 @@ $.wikiEditor.modules.highlight = {
 		/**
 		 * Marks up text with HTML
 		 *
+		 * @param context
 		 * @param division
 		 * @param tokens
 		 */
 		// FIXME: What do division and tokens do?
 		// TODO: Document the scan() and mark() APIs somewhere
-		mark: function ( context, division, tokens ) {
-			var i, subtracted, oldLength, j, o;
+		mark: function ( context, division ) {
+			/*jshint eqeqeq:false, onevar:false */
+			var i, subtracted, oldLength, j, o,
+				markers;
 
 			// Reset markers
-			var markers = [];
+			markers = [];
 
 			// Recycle markers that will be skipped in this run
 			if ( context.modules.highlight.markers && division !== '' ) {
@@ -353,8 +367,9 @@ $.wikiEditor.modules.highlight = {
 					// Don't remove these either
 					return true;
 				}
-				if ( marker && typeof marker.beforeUnwrap === 'function' )
+				if ( marker && typeof marker.beforeUnwrap === 'function' ) {
 					marker.beforeUnwrap( this );
+				}
 				if ( ( marker && marker.anchor === 'tag' ) || $(this).is( 'p' ) ) {
 					// Remove all classes
 					$(this).removeAttr( 'class' );
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.iframe.js b/extensions/WikiEditor/modules/jquery.wikiEditor.iframe.js
index 4d425012..538fcb18 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.iframe.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.iframe.js
@@ -1,6 +1,6 @@
 /* IFrame extension for wikiEditor */
-
-( function( $ ) { $.wikiEditor.extensions.iframe = function( context ) {
+/*jshint onevar:false, boss:true */
+( function ( $ ) { $.wikiEditor.extensions.iframe = function ( context ) {
 
 /*
  * Event Handlers
@@ -14,18 +14,18 @@ context.evt = $.extend( context.evt, {
 	 * function is to both classify the scope of changes as 'division' or 'character' and to prevent further
 	 * processing of events which did not actually change the content of the iframe.
 	 */
-	'keydown': function( event ) {
+	keydown: function ( event ) {
 		switch ( event.which ) {
 			case 90: // z
 			case 89: // y
-				if ( event.which == 89 && !$.browser.msie ) {
+				if ( event.which === 89 && !$.browser.msie ) {
 					// only handle y events for IE
 					return true;
 				} else if ( ( event.ctrlKey || event.metaKey ) && context.history.length ) {
 					// HistoryPosition is a negative number between -1 and -context.history.length, in other words
 					// it's the number of steps backwards from the latest state.
 					var newPosition;
-					if ( event.shiftKey || event.which == 89 ) {
+					if ( event.shiftKey || event.which === 89 ) {
 						// Redo
 						newPosition = context.historyPosition + 1;
 					} else {
@@ -35,7 +35,7 @@ context.evt = $.extend( context.evt, {
 					// Only act if we are switching to a valid state
 					if ( newPosition >= ( context.history.length * -1 ) && newPosition < 0 ) {
 						// Make sure we run the history storing code before we make this change
-						context.fn.updateHistory( context.oldDelayedHTML != context.$content.html() );
+						context.fn.updateHistory( context.oldDelayedHTML !== context.$content.html() );
 						context.oldDelayedHistoryPosition = context.historyPosition;
 						context.historyPosition = newPosition;
 						// Change state
@@ -65,8 +65,8 @@ context.evt = $.extend( context.evt, {
 						var $tabindexList = $( '[tabindex]:visible' ).sort( function( a, b ) {
 							return a.tabIndex - b.tabIndex;
 						} );
-						for( var i=0; i < $tabindexList.length; i++ ) {
-							if( $tabindexList.eq( i ).attr( 'id' ) == context.$iframe.attr( 'id' ) ) {
+						for ( var i=0; i < $tabindexList.length; i++ ) {
+							if ( $tabindexList.eq( i ).attr( 'id' ) === context.$iframe.attr( 'id' ) ) {
 								$tabindexList.get( i + 1 ).focus();
 								break;
 							}
@@ -74,48 +74,48 @@ context.evt = $.extend( context.evt, {
 						return false;
 					}
 				break;
-			 case 86: //v
-				 if ( event.ctrlKey && $.browser.msie && 'paste' in context.evt ) {
-					 //paste, intercepted for IE
-					 context.evt.paste( event );
-				 }
-				 break;
+			case 86: //v
+				if ( event.ctrlKey && $.browser.msie && 'paste' in context.evt ) {
+					//paste, intercepted for IE
+					context.evt.paste( event );
+				}
+				break;
 		}
 		return true;
 	},
-	'change': function( event ) {
+	change: function ( event ) {
 		event.data.scope = 'division';
 		var newHTML = context.$content.html();
-		if ( context.oldHTML != newHTML ) {
+		if ( context.oldHTML !== newHTML ) {
 			context.fn.purgeOffsets();
 			context.oldHTML = newHTML;
 			event.data.scope = 'realchange';
 		}
 		// Never let the body be totally empty
-		if ( context.$content.children().length == 0 ) {
+		if ( context.$content.children().length === 0 ) {
 			context.$content.append( '<p></p>' );
 		}
 		return true;
 	},
-	'delayedChange': function( event ) {
+	delayedChange: function ( event ) {
 		event.data.scope = 'division';
 		var newHTML = context.$content.html();
-		if ( context.oldDelayedHTML != newHTML ) {
+		if ( context.oldDelayedHTML !== newHTML ) {
 			context.oldDelayedHTML = newHTML;
 			event.data.scope = 'realchange';
 			// Surround by <p> if it does not already have it
 			var cursorPos = context.fn.getCaretPosition();
 			var t = context.fn.getOffset( cursorPos[0] );
-			if ( ! $.browser.msie && t && t.node.nodeName == '#text' && t.node.parentNode.nodeName.toLowerCase() == 'body' ) {
-				$( t.node ).wrap( "<p></p>" );
+			if ( ! $.browser.msie && t && t.node.nodeName === '#text' && t.node.parentNode.nodeName.toLowerCase() === 'body' ) {
+				$( t.node ).wrap( '<p></p>' );
 				context.fn.purgeOffsets();
 				context.fn.setSelection( { start: cursorPos[0], end: cursorPos[1] } );
 			}
 		}
-		context.fn.updateHistory( event.data.scope == 'realchange' );
+		context.fn.updateHistory( event.data.scope === 'realchange' );
 		return true;
 	},
-	'cut': function( event ) {
+	cut: function ( event ) {
 		setTimeout( function() {
 			context.$content.find( 'br' ).each( function() {
 				if ( $(this).parent().is( 'body' ) ) {
@@ -125,7 +125,7 @@ context.evt = $.extend( context.evt, {
 		}, 100 );
 		return true;
 	},
-	'paste': function( event ) {
+	paste: function ( event ) {
 		// Save the cursor position to restore it after all this voodoo
 		var cursorPos = context.fn.getCaretPosition();
 		var oldLength = context.fn.getContents().length;
@@ -138,6 +138,7 @@ context.evt = $.extend( context.evt, {
 		}
 
 		setTimeout( function() {
+			/*jshint eqnull:true */
 			// Kill stuff we know we don't want
 			context.$content.find( 'script,style,img,input,select,textarea,hr,button,link,meta' ).remove();
 			var nodeToDelete = [];
@@ -152,30 +153,31 @@ context.evt = $.extend( context.evt, {
 			}
 			if ( elementAtCursor == null || elementAtCursor.node == null ) {
 				context.$content.prepend( '<p class = wikiEditor></p>' );
-				firstDirtyNode 	= context.$content.children()[0];
+				firstDirtyNode = context.$content.children()[0];
 			} else {
 				firstDirtyNode = elementAtCursor.node;
 			}
 
-			//this is ugly but seems like the best way to handle the case where we select and replace all editor contents
+			// This is ugly but seems like the best way to handle the case where we select and replace all editor contents
 			try {
+				/*jshint expr:true */
 				firstDirtyNode.parentNode;
 			} catch ( err ) {
 				context.$content.prepend( '<p class = wikiEditor></p>' );
-				firstDirtyNode 	= context.$content.children()[0];
+				firstDirtyNode = context.$content.children()[0];
 			}
 
 			while ( firstDirtyNode != null ) {
 				//we're going to replace the contents of the entire parent node.
-				while ( firstDirtyNode.parentNode && firstDirtyNode.parentNode.nodeName != 'BODY'
-					 && ! $( firstDirtyNode ).hasClass( 'wikiEditor' )
-					) {
+				while ( firstDirtyNode.parentNode && firstDirtyNode.parentNode.nodeName !== 'BODY' &&
+					!$( firstDirtyNode ).hasClass( 'wikiEditor' )
+				) {
 					firstDirtyNode = firstDirtyNode.parentNode;
 				}
 				//go back till we find the first pasted node
-				while ( firstDirtyNode.previousSibling != null
-						&& ! $( firstDirtyNode.previousSibling ).hasClass( 'wikiEditor' )
-					) {
+				while ( firstDirtyNode.previousSibling != null &&
+						!$( firstDirtyNode.previousSibling ).hasClass( 'wikiEditor' )
+				) {
 
 					if ( $( firstDirtyNode.previousSibling ).hasClass( '#comment' ) ) {
 						$( firstDirtyNode ).remove();
@@ -185,9 +187,9 @@ context.evt = $.extend( context.evt, {
 				}
 
 				if ( firstDirtyNode.previousSibling != null ) {
-					$lastDirtyNode 	= $( firstDirtyNode.previousSibling );
+					$lastDirtyNode = $( firstDirtyNode.previousSibling );
 				} else {
-					$lastDirtyNode 	= $( firstDirtyNode );
+					$lastDirtyNode = $( firstDirtyNode );
 				}
 
 				var cc = makeContentCollector( $.browser, null );
@@ -218,7 +220,7 @@ context.evt = $.extend( context.evt, {
 					}
 
 
-					if( !pastedPretty && $.browser.msie && i == 0 ) {
+					if ( !pastedPretty && $.browser.msie && i === 0 ) {
 						continue;
 					}
 					$newElement = $( '<p class="wikiEditor pasted" ></p>' );
@@ -241,7 +243,7 @@ context.evt = $.extend( context.evt, {
 
 				//anything without wikiEditor class was pasted.
 				$selection = context.$content.find( ':not(.wikiEditor)' );
-				if  ( $selection.length == 0 ) {
+				if ( $selection.length === 0 ) {
 					break;
 				} else {
 					firstDirtyNode = $selection.eq( 0 )[0];
@@ -260,7 +262,7 @@ context.evt = $.extend( context.evt, {
 		}, 0 );
 		return true;
 	},
-	'ready': function( event ) {
+	ready: function ( event ) {
 		// Initialize our history queue
 		if ( context.$content ) {
 			context.history.push( { 'html': context.$content.html(), 'sel':  context.fn.getCaretPosition() } );
@@ -275,7 +277,11 @@ context.evt = $.extend( context.evt, {
  * Internally used functions
  */
 context.fn = $.extend( context.fn, {
-	'highlightLine': function( $element, mode ) {
+	/**
+	 * @param {jQuery} $element
+	 * @param mode
+	 */
+	highlightLine: function ( $element ) {
 		if ( !$element.is( 'p' ) ) {
 			$element = $element.closest( 'p' );
 		}
@@ -283,7 +289,7 @@ context.fn = $.extend( context.fn, {
 		setTimeout( function() { $element.animate( { 'backgroundColor': 'white' }, 'slow' ); }, 100 );
 		setTimeout( function() { $element.css( 'backgroundColor', 'white' ); }, 1000 );
 	},
-	'htmlToText': function( html ) {
+	htmlToText: function ( html ) {
 		// This function is slow for large inputs, so aggressively cache input/output pairs
 		if ( html in context.htmlToTextMap ) {
 			return context.htmlToTextMap[html];
@@ -294,15 +300,15 @@ context.fn = $.extend( context.fn, {
 		// IE does overzealous whitespace collapsing for $( '<pre />' ).html( html );
 		// We also do <br> and easy cases for <p> conversion here, complicated cases are handled later
 		html = html
-			.replace( /\r?\n/g, "" ) // IE7 inserts newlines before block elements
-			.replace( /&nbsp;/g, " " ) // We inserted these to prevent IE from collapsing spaces
-			.replace( /\<br[^\>]*\>\<\/p\>/gi, '</p>' ) // Remove trailing <br> from <p>
-			.replace( /\<\/p\>\s*\<p[^\>]*\>/gi, "\n" ) // Easy case for <p> conversion
-			.replace( /\<br[^\>]*\>/gi, "\n" ) // <br> conversion
-			.replace( /\<\/p\>(\n*)\<p[^\>]*\>/gi, "$1\n" )
+			.replace( /\r?\n/g, '' ) // IE7 inserts newlines before block elements
+			.replace( /&nbsp;/g, ' ' ) // We inserted these to prevent IE from collapsing spaces
+			.replace( /<br[^\>]*\><\/p\>/gi, '</p>' ) // Remove trailing <br> from <p>
+			.replace( /<\/p\>\s*<p[^\>]*\>/gi, '\n' ) // Easy case for <p> conversion
+			.replace( /<br[^\>]*\>/gi, '\n' ) // <br> conversion
+			.replace( /<\/p\>(\n*)<p[^\>]*\>/gi, '$1\n' )
 			// Un-nest <p> tags
-			.replace( /\<p[^\>]*\><p[^\>]*\>/gi, '<p>' )
-			.replace( /\<\/p\><\/p\>/gi, '</p>' );
+			.replace( /<p[^\>]*\><p[^\>]*\>/gi, '<p>' )
+			.replace( /<\/p\><\/p\>/gi, '</p>' );
 		// Save leading and trailing whitespace now and restore it later. IE eats it all, and even Firefox
 		// won't leave everything alone
 		var leading = html.match( /^\s*/ )[0];
@@ -311,8 +317,8 @@ context.fn = $.extend( context.fn, {
 		var $pre = $( '<pre>' + html + '</pre>' );
 		$pre.find( '.wikiEditor-noinclude' ).each( function() { $( this ).remove(); } );
 		// Convert tabs, <p>s and <br>s back
-		$pre.find( '.wikiEditor-tab' ).each( function() { $( this ).text( "\t" ); } );
-		$pre.find( 'br' ).each( function() { $( this ).replaceWith( "\n" ); } );
+		$pre.find( '.wikiEditor-tab' ).each( function() { $( this ).text( '\t' ); } );
+		$pre.find( 'br' ).each( function() { $( this ).replaceWith( '\n' ); } );
 		// Converting <p>s is wrong if there's nothing before them, so check that.
 		// .find( '* + p' ) isn't good enough because textnodes aren't considered
 		$pre.find( 'p' ).each( function() {
@@ -323,21 +329,21 @@ context.fn = $.extend( context.fn, {
 
 			// Check for preceding text
 			var t = new context.fn.rawTraverser( this.firstChild, this, $pre.get( 0 ), true ).prev();
-			while ( t && t.node.nodeName != '#text' && t.node.nodeName != 'BR' && t.node.nodeName != 'P' ) {
+			while ( t && t.node.nodeName !== '#text' && t.node.nodeName !== 'BR' && t.node.nodeName !== 'P' ) {
 				t = t.prev();
 			}
 			if ( t ) {
-				text = "\n" + text;
+				text = '\n' + text;
 			}
 
 			// Check for following text
 			t = new context.fn.rawTraverser( this.lastChild, this, $pre.get( 0 ), true ).next();
-			while ( t && t.node.nodeName != '#text' && t.node.nodeName != 'BR' && t.node.nodeName != 'P' ) {
+			while ( t && t.node.nodeName !== '#text' && t.node.nodeName !== 'BR' && t.node.nodeName !== 'P' ) {
 				t = t.next();
 			}
-			if ( t && !t.inP && t.node.nodeName == '#text' && t.node.nodeValue.charAt( 0 ) != '\n'
-					&& t.node.nodeValue.charAt( 0 ) != '\r' ) {
-				text += "\n";
+			if ( t && !t.inP && t.node.nodeName === '#text' && t.node.nodeValue.charAt( 0 ) !== '\n' &&
+					t.node.nodeValue.charAt( 0 ) !== '\r' ) {
+				text += '\n';
 			}
 			$( this ).text( text );
 		} );
@@ -357,8 +363,8 @@ context.fn = $.extend( context.fn, {
 	 * @param strict If true, the element the selection starts in cannot match (default: false)
 	 * @return jQuery object or null if unknown
 	 */
-	'beforeSelection': function( classname, strict ) {
-		if ( typeof classname == 'undefined' ) {
+	beforeSelection: function ( classname, strict ) {
+		if ( typeof classname === 'undefined' ) {
 			classname = '';
 		}
 		var e = null, offset = null;
@@ -381,7 +387,7 @@ context.fn = $.extend( context.fn, {
 			// When the cursor is on an empty line, Opera gives us a bogus range object with
 			// startContainer=endContainer=body and startOffset=endOffset=1
 			var body = context.$iframe[0].contentWindow.document.body;
-			if ( $.browser.opera && e == body && offset == 1 ) {
+			if ( $.browser.opera && e === body && offset === 1 ) {
 				return null;
 			}
 		}
@@ -400,14 +406,14 @@ context.fn = $.extend( context.fn, {
 				return null;
 			}
 			var seekPos = context.fn.htmlToText( range2.htmlText ).length;
-			var offset = context.fn.getOffset( seekPos );
+			offset = context.fn.getOffset( seekPos );
 			e = offset ? offset.node : null;
 			offset = offset ? offset.offset : null;
 			if ( !e ) {
 				return null;
 			}
 		}
-		if ( e.nodeName != '#text' ) {
+		if ( e.nodeName !== '#text' ) {
 			// The selection is not in a textnode, but between two non-text nodes
 			// (usually inside the <body> between two <br>s). Go to the rightmost
 			// child of the node just before the selection
@@ -425,7 +431,7 @@ context.fn = $.extend( context.fn, {
 		// constructor thousands of times is very inefficient
 		var classStr = ' ' + classname + ' ';
 		while ( e ) {
-			if ( !strict && ( !classname || ( ' ' + e.className + ' ' ).indexOf( classStr ) != -1 ) ) {
+			if ( !strict && ( !classname || ( ' ' + e.className + ' ' ).indexOf( classStr ) !== -1 ) ) {
 				return $( e );
 			}
 			var next = e.previousSibling;
@@ -440,7 +446,7 @@ context.fn = $.extend( context.fn, {
 	/**
 	 * Object used by traverser(). Don't use this unless you know what you're doing
 	 */
-	'rawTraverser': function( node, inP, ancestor, skipNoinclude ) {
+	rawTraverser: function ( node, inP, ancestor, skipNoinclude ) {
 		this.node = node;
 		this.inP = inP;
 		this.ancestor = ancestor;
@@ -450,16 +456,16 @@ context.fn = $.extend( context.fn, {
 			var nextInP = this.inP;
 			while ( p && !p.nextSibling ) {
 				p = p.parentNode;
-				if ( p == this.ancestor ) {
+				if ( p === this.ancestor ) {
 					// We're back at the ancestor, stop here
 					p = null;
 				}
-				if ( p && p.nodeName == "P" ) {
+				if ( p && p.nodeName === 'P' ) {
 					nextInP = null;
 				}
 			}
 			p = p ? p.nextSibling : null;
-			if ( p && p.nodeName == "P" ) {
+			if ( p && p.nodeName === 'P' ) {
 				nextInP = p;
 			}
 			do {
@@ -467,13 +473,13 @@ context.fn = $.extend( context.fn, {
 				// Don't use $( p ).hasClass( 'wikiEditor-noinclude' ) because
 				// $() is slow in a tight loop
 				if ( this.skipNoinclude ) {
-					while ( p && ( ' ' + p.className + ' ' ).indexOf( ' wikiEditor-noinclude ' ) != -1 ) {
+					while ( p && ( ' ' + p.className + ' ' ).indexOf( ' wikiEditor-noinclude ' ) !== -1 ) {
 						p = p.nextSibling;
 					}
 				}
 				if ( p && p.firstChild ) {
 					p = p.firstChild;
-					if ( p.nodeName == "P" ) {
+					if ( p.nodeName === 'P' ) {
 						nextInP = p;
 					}
 				}
@@ -487,16 +493,16 @@ context.fn = $.extend( context.fn, {
 			var prevInP = this.inP;
 			while ( p && !p.previousSibling ) {
 				p = p.parentNode;
-				if ( p == this.ancestor ) {
+				if ( p === this.ancestor ) {
 					// We're back at the ancestor, stop here
 					p = null;
 				}
-				if ( p && p.nodeName == "P" ) {
+				if ( p && p.nodeName === 'P' ) {
 					prevInP = null;
 				}
 			}
 			p = p ? p.previousSibling : null;
-			if ( p && p.nodeName == "P" ) {
+			if ( p && p.nodeName === 'P' ) {
 				prevInP = p;
 			}
 			do {
@@ -510,7 +516,7 @@ context.fn = $.extend( context.fn, {
 				}
 				if ( p && p.lastChild ) {
 					p = p.lastChild;
-					if ( p.nodeName == "P" ) {
+					if ( p.nodeName == 'P' ) {
 						prevInP = p;
 					}
 				}
@@ -528,28 +534,28 @@ context.fn = $.extend( context.fn, {
 	 * @return Traverser object, use .next() or .prev() to get a traverser object referring to the
 	 *  previous/next node
 	 */
-	'traverser': function( start ) {
+	traverser: function ( start ) {
 		// Find the leftmost leaf node in the tree
 		var startNode = start.jquery ? start.get( 0 ) : start;
 		var node = startNode;
-		var inP = node.nodeName == "P" ? node : null;
+		var inP = node.nodeName === 'P' ? node : null;
 		do {
 			// Filter nodes with the wikiEditor-noinclude class
 			// Don't use $( p ).hasClass( 'wikiEditor-noinclude' ) because
 			// $() is slow in a tight loop
-			while ( node && ( ' ' + node.className + ' ' ).indexOf( ' wikiEditor-noinclude ' ) != -1 ) {
+			while ( node && ( ' ' + node.className + ' ' ).indexOf( ' wikiEditor-noinclude ' ) !== -1 ) {
 				node = node.nextSibling;
 			}
 			if ( node && node.firstChild ) {
 				node = node.firstChild;
-				if ( node.nodeName == "P" ) {
+				if ( node.nodeName === 'P' ) {
 					inP = node;
 				}
 			}
 		} while ( node && node.firstChild );
 		return new context.fn.rawTraverser( node, inP, startNode, true );
 	},
-	'getOffset': function( offset ) {
+	getOffset: function ( offset ) {
 		if ( !context.offsets ) {
 			context.fn.refreshOffsets();
 		}
@@ -578,21 +584,21 @@ context.fn = $.extend( context.fn, {
 			'lastTextNode': base.lastTextNode
 		};
 	},
-	'purgeOffsets': function() {
+	purgeOffsets: function () {
 		context.offsets = null;
 	},
-	'refreshOffsets': function() {
+	refreshOffsets: function () {
 		context.offsets = [ ];
 		var t = context.fn.traverser( context.$content );
 		var pos = 0, lastTextNode = null;
 		while ( t ) {
-			if ( t.node.nodeName != '#text' && t.node.nodeName != 'BR' ) {
+			if ( t.node.nodeName !== '#text' && t.node.nodeName !== 'BR' ) {
 				t = t.next();
 				continue;
 			}
-			var nextPos = t.node.nodeName == '#text' ? pos + t.node.nodeValue.length : pos + 1;
+			var nextPos = t.node.nodeName === '#text' ? pos + t.node.nodeValue.length : pos + 1;
 			var nextT = t.next();
-			var leavingP = t.node.nodeName == '#text' && t.inP && nextT && ( !nextT.inP || nextT.inP != t.inP );
+			var leavingP = t.node.nodeName === '#text' && t.inP && nextT && ( !nextT.inP || nextT.inP !== t.inP );
 			context.offsets[pos] = {
 				'node': t.node,
 				'offset': 0,
@@ -610,27 +616,27 @@ context.fn = $.extend( context.fn, {
 				};
 			}
 			pos = nextPos + ( leavingP ? 1 : 0 );
-			if ( t.node.nodeName == '#text' ) {
+			if ( t.node.nodeName === '#text' ) {
 				lastTextNode = t.node;
 			}
 			t = nextT;
 		}
 	},
-	'saveCursorAndScrollTop': function() {
+	saveCursorAndScrollTop: function () {
 		// Stub out textarea behavior
 		return;
 	},
-	'restoreCursorAndScrollTop': function() {
+	restoreCursorAndScrollTop: function () {
 		// Stub out textarea behavior
 		return;
 	},
-	'saveSelection': function() {
+	saveSelection: function () {
 		if ( $.client.profile().name === 'msie' ) {
 			context.$iframe[0].contentWindow.focus();
 			context.savedSelection = context.$iframe[0].contentWindow.document.selection.createRange();
 		}
 	},
-	'restoreSelection': function() {
+	restoreSelection: function () {
 		if ( $.client.profile().name === 'msie' && context.savedSelection !== null ) {
 			context.$iframe[0].contentWindow.focus();
 			context.savedSelection.select();
@@ -640,10 +646,10 @@ context.fn = $.extend( context.fn, {
 	/**
 	 * Update the history queue
 	 *
-	 * @param htmlChange pass true or false to inidicate if there was a text change that should potentially
+	 * @param htmlChange Pass true or false to inidicate if there was a text change that should potentially
 	 * 	be given a new history state.
 	 */
-	'updateHistory': function( htmlChange ) {
+	updateHistory: function ( htmlChange ) {
 		var newHTML = context.$content.html();
 		var newSel = context.fn.getCaretPosition();
 		// Was text changed? Was it because of a REDO or UNDO action?
@@ -675,7 +681,7 @@ context.fn = $.extend( context.fn, {
 	/**
 	 * Sets up the iframe in place of the textarea to allow more advanced operations
 	 */
-	'setupIframe': function() {
+	setupIframe: function () {
 		context.$iframe = $( '<iframe></iframe>' )
 			.attr( {
 				'frameBorder': 0,
@@ -834,7 +840,7 @@ context.fn = $.extend( context.fn, {
 	 * equivilant functionality to the otherwise textarea-based functionality.
 	 */
 
-	'getElementAtCursor': function() {
+	getElementAtCursor: function () {
 		if ( context.$iframe[0].contentWindow.getSelection ) {
 			// Firefox and Opera
 			var selection = context.$iframe[0].contentWindow.getSelection();
@@ -855,7 +861,7 @@ context.fn = $.extend( context.fn, {
 	/**
 	 * Gets the complete contents of the iframe (in plain text, not HTML)
 	 */
-	'getContents': function() {
+	getContents: function () {
 		// For <p></p>, .html() returns <p>&nbsp;</p> in IE
 		// This seems to convince IE while not affecting display
 		if ( !context.$content ) {
@@ -880,7 +886,7 @@ context.fn = $.extend( context.fn, {
 	 * Gets the currently selected text in the content
 	 * DO NOT CALL THIS DIRECTLY, use $.textSelection( 'functionname', options ) instead
 	 */
-	'getSelection': function() {
+	getSelection: function () {
 		var retval;
 		if ( context.$iframe[0].contentWindow.getSelection ) {
 			// Firefox and Opera
@@ -915,7 +921,7 @@ context.fn = $.extend( context.fn, {
 	 * selection is empty.
 	 * DO NOT CALL THIS DIRECTLY, use $.textSelection( 'functionname', options ) instead
 	 */
-	'encapsulateSelection': function( options ) {
+	encapsulateSelection: function ( options ) {
 		var selText = $(this).textSelection( 'getSelection' );
 		var selTextArr;
 		var collapseToEnd = false;
@@ -1127,7 +1133,7 @@ context.fn = $.extend( context.fn, {
 	 * Gets the position (in resolution of bytes not nessecarily characters) in a textarea
 	 * DO NOT CALL THIS DIRECTLY, use $.textSelection( 'functionname', options ) instead
 	 */
-	'getCaretPosition': function( options ) {
+	getCaretPosition: function ( options ) {
 		var startPos = null, endPos = null;
 		if ( context.$iframe[0].contentWindow.getSelection ) {
 			var selection = context.$iframe[0].contentWindow.getSelection();
@@ -1264,7 +1270,7 @@ context.fn = $.extend( context.fn, {
 	 * @param startContainer Element in iframe to start selection in. If not set, start is a character offset
 	 * @param endContainer Element in iframe to end selection in. If not set, end is a character offset
 	 */
-	'setSelection': function( options ) {
+	setSelection: function ( options ) {
 		var sc = options.startContainer, ec = options.endContainer;
 		sc = sc && sc.jquery ? sc[0] : sc;
 		ec = ec && ec.jquery ? ec[0] : ec;
@@ -1351,7 +1357,7 @@ context.fn = $.extend( context.fn, {
 	 * Scroll a textarea to the current cursor position. You can set the cursor position with setSelection()
 	 * DO NOT CALL THIS DIRECTLY, use $.textSelection( 'functionname', options ) instead
 	 */
-	'scrollToCaretPosition': function( options ) {
+	scrollToCaretPosition: function ( options ) {
 		context.fn.scrollToTop( context.fn.getElementAtCursor(), true );
 	},
 	/**
@@ -1361,7 +1367,7 @@ context.fn = $.extend( context.fn, {
 	 * @param $element jQuery object containing an element in the iframe
 	 * @param force If true, scroll the element even if it's already visible
 	 */
-	'scrollToTop': function( $element, force ) {
+	scrollToTop: function ( $element, force ) {
 		var html = context.$content.closest( 'html' ),
 			body = context.$content.closest( 'body' ),
 			parentHtml = $( 'html' ),
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.js b/extensions/WikiEditor/modules/jquery.wikiEditor.js
index 6e87a45f..460203ff 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.js
@@ -8,7 +8,8 @@
  *     $( 'textarea#wpTextbox1' ).wikiEditor( 'addModule', 'toolbar', { ... config ... } );
  *
  */
-( function ( $ ) {
+/*jshint onevar:false, boss:true */
+( function ( $, mw ) {
 
 /**
  * Global static object for wikiEditor that provides generally useful functionality to all modules and contexts.
@@ -113,7 +114,7 @@ $.wikiEditor = {
 	isRequired: function ( module, requirement ) {
 		if ( typeof module.req !== 'undefined' ) {
 			for ( var req in module.req ) {
-				if ( module.req[req] == requirement ) {
+				if ( module.req[req] === requirement ) {
 					return true;
 				}
 			}
@@ -132,9 +133,10 @@ $.wikiEditor = {
 	 * with the key 'bar'.
 	 */
 	autoMsg: function ( object, property ) {
+		var i, p;
 		// Accept array of possible properties, of which the first one found will be used
-		if ( typeof property == 'object' ) {
-			for ( var i in property ) {
+		if ( typeof property === 'object' ) {
+			for ( i in property ) {
 				if ( property[i] in object || property[i] + 'Msg' in object ) {
 					property = property[i];
 					break;
@@ -144,11 +146,11 @@ $.wikiEditor = {
 		if ( property in object ) {
 			return object[property];
 		} else if ( property + 'Msg' in object ) {
-			var p = object[property + 'Msg'];
+			p = object[property + 'Msg'];
 			if ( $.isArray( p ) && p.length >= 2 ) {
-				return mediaWiki.msg.apply( mediaWiki.msg, p );
+				return mw.message.apply( mw.message, p ).plain();
 			} else {
-				return mediaWiki.msg( p );
+				return mw.message( p ).plain();
 			}
 		} else {
 			return '';
@@ -181,7 +183,7 @@ $.wikiEditor = {
 		var src = $.wikiEditor.autoLang( icon, lang );
 		path = path || $.wikiEditor.imgPath;
 		// Prepend path if src is not absolute
-		if ( src.substr( 0, 7 ) != 'http://' && src.substr( 0, 8 ) != 'https://' && src[0] != '/' ) {
+		if ( src.substr( 0, 7 ) !== 'http://' && src.substr( 0, 8 ) !== 'https://' && src[0] !== '/' ) {
 			src = path + src;
 		}
 		return src + '?' + mw.loader.version( 'jquery.wikiEditor' );
@@ -197,9 +199,9 @@ $.wikiEditor = {
 	 */
 	autoIconOrOffset: function ( icon, offset, path, lang ) {
 		lang = lang || mw.config.get( 'wgUserLanguage' );
-		if ( typeof offset == 'object' && lang in offset ) {
+		if ( typeof offset === 'object' && lang in offset ) {
 			return offset[lang];
-		} else if ( typeof icon == 'object' && lang in icon ) {
+		} else if ( typeof icon === 'object' && lang in icon ) {
 			return $.wikiEditor.autoIcon( icon, undefined, lang );
 		} else {
 			return $.wikiEditor.autoLang( offset, lang );
@@ -223,7 +225,7 @@ if ( !$.wikiEditor.isSupported() ) {
 // where we left off
 var context = $(this).data( 'wikiEditor-context' );
 // On first call, we need to set things up, but on all following calls we can skip right to the API handling
-if ( !context || typeof context == 'undefined' ) {
+if ( !context || typeof context === 'undefined' ) {
 
 	// Star filling the context with useful data - any jQuery selections, as usual should be named with a preceding $
 	context = {
@@ -276,14 +278,14 @@ if ( !context || typeof context == 'undefined' ) {
 		'addModule': function ( context, data ) {
 			var module, call,
 				modules = {};
-			if ( typeof data == 'string' ) {
+			if ( typeof data === 'string' ) {
 				modules[data] = {};
-			} else if ( typeof data == 'object' ) {
+			} else if ( typeof data === 'object' ) {
 				modules = data;
 			}
 			for ( module in modules ) {
 				// Check for the existance of an available / supported module with a matching name and a create function
-				if ( typeof module == 'string' && typeof $.wikiEditor.modules[module] !== 'undefined' &&
+				if ( typeof module === 'string' && typeof $.wikiEditor.modules[module] !== 'undefined' &&
 						$.wikiEditor.isSupported( $.wikiEditor.modules[module] ) )
 				{
 					// Extend the context's core API with this module's own API calls
@@ -326,11 +328,11 @@ if ( !context || typeof context == 'undefined' ) {
 		 */
 		trigger: function ( name, event ) {
 			// Event is an optional argument, but from here on out, at least the type field should be dependable
-			if ( typeof event == 'undefined' ) {
+			if ( typeof event === 'undefined' ) {
 				event = { 'type': 'custom' };
 			}
 			// Ensure there's a place for extra information to live
-			if ( typeof event.data == 'undefined' ) {
+			if ( typeof event.data === 'undefined' ) {
 				event.data = {};
 			}
 
@@ -393,7 +395,7 @@ if ( !context || typeof context == 'undefined' ) {
 				// Return the newly appended tab
 				return $( '<div>' )
 					.attr( 'rel', 'wikiEditor-ui-view-' + options.name )
-					.addClass( context.view == options.name ? 'current' : null )
+					.addClass( context.view === options.name ? 'current' : null )
 					.append( $( '<a>' )
 						.attr( 'href', '#' )
 						.mousedown( function () {
@@ -406,7 +408,7 @@ if ( !context || typeof context == 'undefined' ) {
 							context.$tabs.find( 'div' ).removeClass( 'current' );
 							$(this).parent().addClass( 'current' );
 							$(this).blur();
-							if ( 'init' in options && typeof options.init == 'function' ) {
+							if ( 'init' in options && typeof options.init === 'function' ) {
 								options.init( context );
 							}
 							event.preventDefault();
@@ -539,9 +541,9 @@ if ( !context || typeof context == 'undefined' ) {
 var args = $.makeArray( arguments );
 
 // Dynamically setup core extensions for modules that are required
-if ( args[0] == 'addModule' && typeof args[1] !== 'undefined' ) {
+if ( args[0] === 'addModule' && typeof args[1] !== 'undefined' ) {
 	var modules = args[1];
-	if ( typeof modules !== "object" ) {
+	if ( typeof modules !== 'object' ) {
 		modules = {};
 		modules[args[1]] = '';
 	}
@@ -577,4 +579,4 @@ return $(this).data( 'wikiEditor-context', context );
 
 };
 
-}( jQuery ) );
+}( jQuery, mediaWiki ) );
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.preview.js b/extensions/WikiEditor/modules/jquery.wikiEditor.preview.js
index 39907364..372d2e8e 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.preview.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.preview.js
@@ -1,6 +1,6 @@
 /* Preview module for wikiEditor */
 ( function ( $, mw ) {
-
+/*jshint onevar:false */
 $.wikiEditor.modules.preview = {
 
 /**
@@ -32,7 +32,7 @@ fn: {
 	 * @param context Context object of editor to create module in
 	 * @param config Configuration object to create module from
 	 */
-	create: function ( context, config ) {
+	create: function ( context ) {
 		if ( 'initialized' in context.modules.preview ) {
 			return;
 		}
@@ -65,9 +65,9 @@ fn: {
 					},
 					function ( data ) {
 						if (
-							typeof data.parse == 'undefined' ||
-							typeof data.parse.text == 'undefined' ||
-							typeof data.parse.text['*'] == 'undefined'
+							typeof data.parse === 'undefined' ||
+							typeof data.parse.text === 'undefined' ||
+							typeof data.parse.text['*'] === 'undefined'
 						) {
 							return;
 						}
@@ -89,7 +89,7 @@ fn: {
 				// Gets the latest copy of the wikitext
 				var wikitext = context.$textarea.textSelection( 'getContents' );
 				// Aborts when nothing has changed since the last time
-				if ( context.modules.preview.changesText == wikitext ) {
+				if ( context.modules.preview.changesText === wikitext ) {
 					return;
 				}
 				context.$changesTab.find( 'table.diff tbody' ).empty();
@@ -115,8 +115,9 @@ fn: {
 							rvprop: ''
 						};
 						var section = $( '[name="wpSection"]' ).val();
-						if ( section !== '' )
+						if ( section !== '' ) {
 							postdata2.rvsection = section;
+						}
 
 						$.post( mw.util.wikiScript( 'api' ), postdata2, function ( data ) {
 								// Add diff CSS
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.previewDialog.js b/extensions/WikiEditor/modules/jquery.wikiEditor.previewDialog.js
index ca88c79a..5381e605 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.previewDialog.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.previewDialog.js
@@ -1,5 +1,6 @@
 /* Publish module for wikiEditor */
-( function( $ ) { $.wikiEditor.modules.previewDialog = {
+/*jshint onevar:false */
+( function ( $, mw ) { $.wikiEditor.modules.previewDialog = {
 
 /**
  * Compatability map
@@ -29,7 +30,7 @@ fn: {
 	 * @param context Context object of editor to create module in
 	 * @param config Configuration object to create module from
 	 */
-	create: function( context, config ) {
+	create: function( context ) {
 		// Build the dialog behind the Publish button
 		var dialogID = 'wikiEditor-' + context.instance + '-preview-dialog';
 		$.wikiEditor.modules.dialogs.fn.create(
@@ -78,7 +79,7 @@ fn: {
 								.css( 'top', '25px' );
 							// $dialog.dialog( 'option', 'width', $( 'body' ).width() - 300 );
 							// Aborts when nothing has changed since the last preview
-							if ( context.modules.preview.previewText == wikitext ) {
+							if ( context.modules.preview.previewText === wikitext ) {
 								return;
 							}
 
@@ -96,9 +97,9 @@ fn: {
 								},
 								function( data ) {
 									if (
-										typeof data.parse == 'undefined' ||
-										typeof data.parse.text == 'undefined' ||
-										typeof data.parse.text['*'] == 'undefined'
+										typeof data.parse === 'undefined' ||
+										typeof data.parse.text === 'undefined' ||
+										typeof data.parse.text['*'] === 'undefined'
 									) {
 										return;
 									}
@@ -128,4 +129,4 @@ fn: {
 	}
 }
 
-}; } )( jQuery );
+}; } )( jQuery, mediaWiki );
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.publish.js b/extensions/WikiEditor/modules/jquery.wikiEditor.publish.js
index b61140dc..058fa1b3 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.publish.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.publish.js
@@ -1,4 +1,5 @@
 /* Publish module for wikiEditor */
+/*jshint onevar:false */
 ( function ( $ ) {
 
 $.wikiEditor.modules.publish = {
@@ -31,7 +32,7 @@ fn: {
 	 * @param context Context object of editor to create module in
 	 * @param config Configuration object to create module from
 	 */
-	create: function ( context, config ) {
+	create: function ( context ) {
 		// Build the dialog behind the Publish button
 		var dialogID = 'wikiEditor-' + context.instance + '-dialog';
 		$.wikiEditor.modules.dialogs.fn.create(
@@ -89,16 +90,18 @@ fn: {
 						);
 						/* END OF REALLY DIRTY HACK */
 
-						if ( $( '#wpMinoredit' ).length === 0 )
+						if ( $( '#wpMinoredit' ).length === 0 ) {
 							$( '#wikiEditor-' + context.instance + '-dialog-minor' ).hide();
-						else if ( $( '#wpMinoredit' ).is( ':checked' ) )
+						} else if ( $( '#wpMinoredit' ).prop( 'checked' ) ) {
 							$( '#wikiEditor-' + context.instance + '-dialog-minor' )
 								.prop( 'checked', true );
-						if ( $( '#wpWatchthis' ).length === 0 )
+						}
+						if ( $( '#wpWatchthis' ).length === 0 ) {
 							$( '#wikiEditor-' + context.instance + '-dialog-watch' ).hide();
-						else if ( $( '#wpWatchthis' ).is( ':checked' ) )
+						} else if ( $( '#wpWatchthis' ).prop( 'checked' ) ) {
 							$( '#wikiEditor-' + context.instance + '-dialog-watch' )
 								.prop( 'checked', true );
+							}
 
 						$(this).find( 'form' ).submit( function ( e ) {
 							$(this).closest( '.ui-dialog' ).find( 'button:first' ).click();
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.templateEditor.js b/extensions/WikiEditor/modules/jquery.wikiEditor.templateEditor.js
index bd00325f..3cbd5ba5 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.templateEditor.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.templateEditor.js
@@ -1,5 +1,6 @@
 /* TemplateEditor module for wikiEditor */
-( function( $ ) { $.wikiEditor.modules.templateEditor = {
+/*jshint quotmark:false, onevar:false */
+( function ( $ ) { $.wikiEditor.modules.templateEditor = {
 /**
  * Name mappings, dirty hack which will be removed once "TemplateInfo" extension is more fully supported
  */
@@ -37,9 +38,13 @@
  */
 evt: {
 
-	mark: function( context, event ) {
+	/**
+	 * @param context
+	 * @param event
+	 */
+	mark: function( context ) {
 		// The markers returned by this function are skipped on realchange, so don't regenerate them in that case
-		if ( context.modules.highlight.currentScope == 'realchange' ) {
+		if ( context.modules.highlight.currentScope === 'realchange' ) {
 			return;
 		}
 
@@ -47,10 +52,9 @@ evt: {
 		var markers = context.modules.highlight.markers;
 		var tokenArray = context.modules.highlight.tokenArray;
 		// Collect matching level 0 template call boundaries from the tokenArray
-		var level = 0;
 		var tokenIndex = 0;
 		while ( tokenIndex < tokenArray.length ){
-			while ( tokenIndex < tokenArray.length && tokenArray[tokenIndex].label != 'TEMPLATE_BEGIN' ) {
+			while ( tokenIndex < tokenArray.length && tokenArray[tokenIndex].label !== 'TEMPLATE_BEGIN' ) {
 				tokenIndex++;
 			}
 			//open template
@@ -58,19 +62,18 @@ evt: {
 				var beginIndex = tokenIndex;
 				var endIndex = -1; //no match found
 				var openTemplates = 1;
-				var templatesMatched = false;
-				while ( tokenIndex < tokenArray.length - 1 && endIndex == -1 ) {
+				while ( tokenIndex < tokenArray.length - 1 && endIndex === -1 ) {
 					tokenIndex++;
-					if ( tokenArray[tokenIndex].label == 'TEMPLATE_BEGIN' ) {
+					if ( tokenArray[tokenIndex].label === 'TEMPLATE_BEGIN' ) {
 						openTemplates++;
-					} else if ( tokenArray[tokenIndex].label == 'TEMPLATE_END' ) {
+					} else if ( tokenArray[tokenIndex].label === 'TEMPLATE_END' ) {
 						openTemplates--;
-						if ( openTemplates == 0 ) {
+						if ( openTemplates === 0 ) {
 							endIndex = tokenIndex;
 						} //we can stop looping
 					}
 				}//while finding template ending
-				if ( endIndex != -1 ) {
+				if ( endIndex !== -1 ) {
 					markers.push( {
 						start: tokenArray[beginIndex].offset,
 						end: tokenArray[endIndex].offset,
@@ -92,7 +95,7 @@ evt: {
 							}
 						},
 						onSkip: function( node ) {
-							if ( $( node ).html() == $( node ).data( 'oldHTML' ) ) {
+							if ( $( node ).html() === $( node ).data( 'oldHTML' ) ) {
 								// No change
 								return;
 							}
@@ -104,7 +107,7 @@ evt: {
 							if ( $( node ).parent().hasClass( 'wikiEditor-template' ) ) {
 								var $label = $( node ).parent().find( '.wikiEditor-template-label' );
 								var displayName = $.wikiEditor.modules.templateEditor.fn.getTemplateDisplayName( model );
-								if ( $label.text() != displayName ) {
+								if ( $label.text() !== displayName ) {
 									$label.text( displayName );
 								}
 							}
@@ -119,7 +122,7 @@ evt: {
 								$.wikiEditor.modules.templateEditor.fn.bindTemplateEvents( $( node ) );
 							}
 						},
-						getAnchor: function( ca1, ca2 ) {
+						getAnchor: function( ca1 ) {
 							return $( ca1.parentNode ).is( 'span.wikiEditor-template-text' ) ?
 								ca1.parentNode : null;
 						},
@@ -142,7 +145,9 @@ evt: {
 		var $evtElem = event.jQueryNode;
 		if ( $evtElem.hasClass( 'wikiEditor-template-label' ) ) {
 			// Allow anything if the command or control key are depressed
-			if ( event.ctrlKey || event.metaKey ) return true;
+			if ( event.ctrlKey || event.metaKey ) {
+				return true;
+			}
 			switch ( event.which ) {
 				case 13: // Enter
 					$evtElem.click();
@@ -177,14 +182,22 @@ evt: {
 			}
 		}
 	},
-	keyup: function( context, event ) {
+	/**
+	 * @param context
+	 * @param event
+	 */
+	keyup: function( context ) {
 		// Rest our ignoreKeypress variable if it's set to true
 		if ( context.$iframe.data( 'ignoreKeypress' ) ) {
 			context.$iframe.data( 'ignoreKeypress', false );
 		}
 		return true;
 	},
-	keypress: function( context, event ) {
+	/**
+	 * @param context
+	 * @param event
+	 */
+	keypress: function( context ) {
 		// If this event is from a keydown event which we want to block, ignore it
 		return ( context.$iframe.data( 'ignoreKeypress' ) ? false : true );
 	}
@@ -210,7 +223,7 @@ fn: {
 	 * @param context Context object of editor to create module in
 	 * @param config Configuration object to create module from
 	 */
-	create: function( context, config ) {
+	create: function( context ) {
 		// Initialize module within the context
 		context.modules.templateEditor = {};
 	},
@@ -220,8 +233,7 @@ fn: {
 	 */
 	wrapTemplate: function( $wrapper ) {
 		var model = $wrapper.data( 'model' );
-		var context = $wrapper.data( 'marker' ).context;
-		var $template = $wrapper
+		$wrapper
 			.wrap( '<span class="wikiEditor-template"></span>' )
 			.addClass( 'wikiEditor-template-text wikiEditor-template-text-shrunken' )
 			.parent()
@@ -249,7 +261,7 @@ fn: {
 	bindTemplateEvents: function( $wrapper ) {
 		var $template = $wrapper.parent( '.wikiEditor-template' );
 
-		if ( typeof ( opera ) == "undefined" ) {
+		if ( typeof opera === 'undefined' ) {
 			$template.parent().attr('contentEditable', 'false');
 		}
 
@@ -274,7 +286,7 @@ fn: {
 	 * Toggle the visisbilty of the wikitext for a given template
 	 * @param $wrapper The origianl wrapper we want expand/collapse
 	 */
-	 toggleWikiTextEditor: function( $wrapper ) {
+	toggleWikiTextEditor: function( $wrapper ) {
 		var context = $wrapper.data( 'marker' ).context;
 		var $template = $wrapper.parent( '.wikiEditor-template' );
 		context.fn.purgeOffsets();
@@ -285,11 +297,11 @@ fn: {
 		var $templateText = $template.find( '.wikiEditor-template-text' );
 		$templateText.toggleClass( 'wikiEditor-template-text-shrunken' );
 		$templateText.toggleClass( 'wikiEditor-template-text-visible' );
-		if( $templateText.hasClass('wikiEditor-template-text-shrunken') ){
+		if ( $templateText.hasClass('wikiEditor-template-text-shrunken') ){
 			//we just closed the template
 
 			// Update the model if we need to
-			if ( $templateText.html() != $templateText.data( 'oldHTML' ) ) {
+			if ( $templateText.html() !== $templateText.data( 'oldHTML' ) ) {
 				var templateModel = $.wikiEditor.modules.templateEditor.fn.updateModel( $templateText );
 
 				//this is the only place the template name can be changed; keep the template name in sync
@@ -350,7 +362,7 @@ fn: {
 					var $templateText = $templateDiv.children( '.wikiEditor-template-text' );
 					var templateModel = $templateText.data( 'model' );
 					// Update the model if we need to
-					if ( $templateText.html() != $templateText.data( 'oldHTML' ) ) {
+					if ( $templateText.html() !== $templateText.data( 'oldHTML' ) ) {
 						templateModel = $.wikiEditor.modules.templateEditor.fn.updateModel( $templateText );
 					}
 
@@ -362,11 +374,11 @@ fn: {
 					var $rows = $fields.find( '.wikiEditor-template-dialog-field-wrapper' );
 					for ( var paramIndex in params ) {
 						var param = params[paramIndex];
-						if ( typeof param.name == 'undefined' ) {
+						if ( typeof param.name === 'undefined' ) {
 							// param is the template name, skip it
 							continue;
 						}
-						var paramText = typeof param == 'string' ?
+						var paramText = typeof param === 'string' ?
 							param.name.replace( /[\_\-]/g, ' ' ) :
 							param.name;
 						var paramVal = templateModel.getValue( param.name );
@@ -397,11 +409,13 @@ fn: {
 								.data( 'expanded', false )
 								.bind( 'cut paste keypress click change', function( e ) {
 									// If this was fired by a tab keypress, let it go
-									if ( e.keyCode == '9' ) return true;
+									if ( e.keyCode === 9 || e.keyCode === '9' ) {
+										return true;
+									}
 									var $this = $( this );
 									setTimeout( function() {
 										var expanded = $this.data( 'expanded' );
-										if ( $this.val().indexOf( '\n' ) != -1 || $this.val().length > 24 ) {
+										if ( $this.val().indexOf( '\n' ) !== -1 || $this.val().length > 24 ) {
 											if ( !expanded ) {
 												$this.animate( { 'height': '4.5em' }, 'fast' );
 												$this.data( 'expanded', true );
@@ -455,7 +469,7 @@ fn: {
 	updateModel: function( $templateText, model ) {
 		var context = $templateText.data( 'marker' ).context;
 		var text;
-		if ( typeof model == 'undefined' ) {
+		if ( typeof model === 'undefined' ) {
 			text = context.fn.htmlToText( $templateText.html() );
 		} else {
 			text = model.getText();
@@ -464,7 +478,7 @@ fn: {
 		$templateText.text( text );
 		$templateText.html( $templateText.html().replace( /\n/g, '<br />' ) );
 		$templateText.data( 'oldHTML', $templateText.html() );
-		if ( typeof model == 'undefined' ) {
+		if ( typeof model === 'undefined' ) {
 			model = new $.wikiEditor.modules.templateEditor.fn.model( text );
 			$templateText.data( 'model', model );
 		}
@@ -476,9 +490,9 @@ fn: {
 	 */
 	getTemplateDisplayName: function ( model ) {
 		var tName = model.getName();
-		if( model.getValue( 'name' ) != '' ) {
+		if( model.getValue( 'name' ) !== '' ) {
 			return tName + ': ' + model.getValue( 'name' );
-		} else if( model.getValue( 'Name' ) != '' ) {
+		} else if( model.getValue( 'Name' ) !== '' ) {
 			return tName + ': ' + model.getValue( 'Name' );
 		} else if( tName.toLowerCase() in $.wikiEditor.modules.templateEditor.nameMappings ) {
 			return tName + ': ' + model.getValue( $.wikiEditor.modules.templateEditor.nameMappings[tName.toLowerCase()] );
@@ -541,27 +555,28 @@ fn: {
 			var retVal;
 			if ( isNaN( name ) ) {
 				// It's a string!
-				if ( typeof paramsByName[name] == 'undefined' ) {
+				if ( typeof paramsByName[name] === 'undefined' ) {
 					// Does not exist
-					return "";
+					return '';
 				}
 				rangeIndex = paramsByName[name];
 			} else {
 				// It's a number!
-				rangeIndex = parseInt( name );
+				rangeIndex = parseInt( name, 10 );
 			}
-			if ( typeof params[rangeIndex]  == 'undefined' ) {
+			if ( typeof params[rangeIndex] === 'undefined' ) {
 				// Does not exist
-				return "";
+				return '';
 			}
 			valueRange = ranges[params[rangeIndex].valueIndex];
-			if ( typeof valueRange.newVal == 'undefined' || original ) {
+			if ( typeof valueRange.newVal === 'undefined' || original ) {
 				// Value unchanged, return original wikitext
 				retVal = wikitext.substring( valueRange.begin, valueRange.end );
 			} else {
 				// New value exists, return new value
 				retVal = valueRange.newVal;
 			}
+			/*jshint eqnull:true */
 			if ( value != null ) {
 				ranges[params[rangeIndex].valueIndex].newVal = value;
 			}
@@ -574,7 +589,7 @@ fn: {
 		 * Get template name
 		 */
 		this.getName = function() {
-			if( typeof ranges[templateNameIndex].newVal == 'undefined' ) {
+			if( typeof ranges[templateNameIndex].newVal === 'undefined' ) {
 				return wikitext.substring( ranges[templateNameIndex].begin, ranges[templateNameIndex].end );
 			} else {
 				return ranges[templateNameIndex].newVal;
@@ -635,9 +650,9 @@ fn: {
 		 * Get modified template text
 		 */
 		this.getText = function() {
-			newText = "";
-			for ( i = 0 ; i < ranges.length; i++ ) {
-				if( typeof ranges[i].newVal == 'undefined' ) {
+			var newText = "";
+			for ( var i = 0 ; i < ranges.length; i++ ) {
+				if( typeof ranges[i].newVal === 'undefined' ) {
 					newText += wikitext.substring( ranges[i].begin, ranges[i].end );
 				} else {
 					newText += ranges[i].newVal;
@@ -659,7 +674,7 @@ fn: {
 			var adjustment = 0;
 			for (var i = 0 ; i < ranges.length; i++ ) {
 				ranges[i].begin += adjustment;
-				if( typeof ranges[i].adjust != 'undefined' ) {
+				if ( typeof ranges[i].adjust !== 'undefined' ) {
 					adjustment += ranges[i].adjust();
 					// NOTE: adjust should be a function that has the information necessary to calculate the length of
 					// this 'segment'
@@ -680,15 +695,16 @@ fn: {
 		// Get rid of first {{ with whitespace
 		var sanatizedStr = wikitext.replace( /{{/, "  " );
 		// Replace end
-		endBraces = sanatizedStr.match( /}}\s*$/ );
+		var endBraces = sanatizedStr.match( /}}\s*$/ );
 		if ( endBraces ) {
 			sanatizedStr = sanatizedStr.substring( 0, endBraces.index ) + "  " +
 				sanatizedStr.substring( endBraces.index + 2 );
 		}
 
+		var startIndex, endIndex, sanatizedSegment, openBraces, brace;
 
 		//treat HTML comments like whitespace
-		while ( sanatizedStr.indexOf( '<!' ) != -1 ) {
+		while ( sanatizedStr.indexOf( '<!' ) !== -1 ) {
 			startIndex = sanatizedStr.indexOf( '<!' );
 			endIndex = sanatizedStr.indexOf('-->') + 3;
 			if( endIndex < 3 ){
@@ -700,26 +716,26 @@ fn: {
 		}
 
 		// Match the open braces we just found with equivalent closing braces note, works for any level of braces
-		while ( sanatizedStr.indexOf( '{{' ) != -1 ) {
+		while ( sanatizedStr.indexOf( '{{' ) !== -1 ) {
 			startIndex = sanatizedStr.indexOf( '{{' ) + 1;
 			openBraces = 2;
 			endIndex = startIndex;
 			while ( (openBraces > 0)  && (endIndex < sanatizedStr.length) ) {
-				var brace = sanatizedStr[++endIndex];
-				openBraces += brace == '}' ? -1 : brace == '{' ? 1 : 0;
+				brace = sanatizedStr[++endIndex];
+				openBraces += brace === '}' ? -1 : brace === '{' ? 1 : 0;
 			}
 			sanatizedSegment = sanatizedStr.substring( startIndex,endIndex ).replace( /[{}|=]/g , 'X' );
 			sanatizedStr =
 				sanatizedStr.substring( 0, startIndex ) + sanatizedSegment + sanatizedStr.substring( endIndex );
 		}
 		//links, images, etc, which also can nest
-		while ( sanatizedStr.indexOf( '[[' ) != -1 ) {
+		while ( sanatizedStr.indexOf( '[[' ) !== -1 ) {
 			startIndex = sanatizedStr.indexOf( '[[' ) + 1;
 			openBraces = 2;
 			endIndex = startIndex;
 			while ( (openBraces > 0)  && (endIndex < sanatizedStr.length) ) {
-				var brace = sanatizedStr[++endIndex];
-				openBraces += brace == ']' ? -1 : brace == '[' ? 1 : 0;
+				brace = sanatizedStr[++endIndex];
+				openBraces += brace === ']' ? -1 : brace === '[' ? 1 : 0;
 			}
 			sanatizedSegment = sanatizedStr.substring( startIndex,endIndex ).replace( /[\[\]|=]/g , 'X' );
 			sanatizedStr =
@@ -733,14 +749,16 @@ fn: {
 		var params = [];
 		var templateNameIndex = 0;
 		var doneParsing = false;
-		oldDivider = 0;
-		divider = sanatizedStr.indexOf( '|', oldDivider );
-		if ( divider == -1 ) {
+		var oldDivider = 0;
+		var divider = sanatizedStr.indexOf( '|', oldDivider );
+		if ( divider === -1 ) {
 			divider = sanatizedStr.length;
 			doneParsing = true;
 			collapsible = false; //zero params
 		}
-		nameMatch = sanatizedStr.substring( 0, divider ).match( /[^\s]/ );
+		var nameMatch = sanatizedStr.substring( 0, divider ).match( /[^\s]/ );
+		var nameEndMatch;
+		/*jshint eqnull:true */
 		if ( nameMatch != null ) {
 			ranges.push( new Range( 0 ,nameMatch.index ) ); //whitespace and squiggles upto the name
 			nameEndMatch = sanatizedStr.substring( 0 , divider ).match( /[^\s]\s*$/ ); //last nonwhitespace character
@@ -758,18 +776,21 @@ fn: {
 		 * Start looping over params
 		 */
 		var currentParamNumber = 0;
+		var currentField, currentValue, valueBeginIndex, valueBegin, valueEnd;
+		var nameIndex, equalsIndex, valueIndex;
+		var currentName, nameBegin, nameBeginIndex, nameEnd, nameEndIndex;
 		var valueEndIndex = ranges[templateNameIndex].end;
 		var paramsByName = [];
 		while ( !doneParsing ) {
 			currentParamNumber++;
 			oldDivider = divider;
 			divider = sanatizedStr.indexOf( '|', oldDivider + 1 );
-			if ( divider == -1 ) {
+			if ( divider === -1 ) {
 				divider = sanatizedStr.length;
 				doneParsing = true;
 			}
 			currentField = sanatizedStr.substring( oldDivider+1, divider );
-			if ( currentField.indexOf( '=' ) == -1 ) {
+			if ( currentField.indexOf( '=' ) === -1 ) {
 				// anonymous field, gets a number
 
 				//default values, since we'll allow empty values
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.templates.js b/extensions/WikiEditor/modules/jquery.wikiEditor.templates.js
index b303e3fa..b0462563 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.templates.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.templates.js
@@ -1,22 +1,23 @@
 /* Templates Module for wikiEditor */
-( function( $ ) { $.wikiEditor.modules.templates = {
+/*jshint onevar:false */
+( function ( $ ) { $.wikiEditor.modules.templates = {
 
 /**
  * Core Requirements
  */
-'req': [ 'iframe' ],
+req: [ 'iframe' ],
 /**
  * Object Templates
  */
-'tpl': {
-	'marker': {
-		'type': 'template',
-		'anchor': 'wrap',
-		'skipDivision': 'realchange',
-		'afterWrap': function( node ) {
+tpl: {
+	marker: {
+		type: 'template',
+		anchor: 'wrap',
+		skipDivision: 'realchange',
+		afterWrap: function ( node ) {
 			$( node ).addClass( 'wikiEditor-template' );
 		},
-		'getAnchor': function( ca1, ca2 ) {
+		getAnchor: function ( ca1 ) {
 			return $( ca1.parentNode ).is( '.wikiEditor-template' ) ? ca1.parentNode : null;
 		}
 	}
@@ -24,10 +25,14 @@
 /**
  * Event handlers
  */
-'evt': {
-	'mark': function( context, event ) {
+evt: {
+	/**
+	 * @param context
+	 * @param event
+	 */
+	mark: function ( context ) {
 		// The markers returned by this function are skipped on realchange, so don't regenerate them in that case
-		if ( context.modules.highlight.currentScope == 'realchange' ) {
+		if ( context.modules.highlight.currentScope === 'realchange' ) {
 			return;
 		}
 		// Get references to the markers and tokens from the current context
@@ -36,14 +41,14 @@
 		// Use depth-tracking to extract top-level templates from tokens
 		var depth = 0, bias, start;
 		for ( var i in tokens ) {
-			depth += ( bias = tokens[i].label == 'TEMPLATE_BEGIN' ? 1 : ( tokens[i].label == 'TEMPLATE_END' ? -1 : 0 ) );
-			if ( bias > 0 && depth == 1 ) {
+			depth += ( bias = tokens[i].label === 'TEMPLATE_BEGIN' ? 1 : ( tokens[i].label === 'TEMPLATE_END' ? -1 : 0 ) );
+			if ( bias > 0 && depth === 1 ) {
 				// Top-level opening - use offset as start
 				start = tokens[i].offset;
-			} else if ( bias < 0 && depth == 0 ) {
+			} else if ( bias < 0 && depth === 0 ) {
 				// Top-level closing - use offset as end
 				markers[markers.length] = $.extend(
-					{ 'context': context, 'start': start, 'end': tokens[i].offset },
+					{ context: context, start: start, end: tokens[i].offset },
 					$.wikiEditor.modules.templates.tpl.marker
 				);
 			}
@@ -53,15 +58,19 @@
 		}
 	}
 },
-'exp': [
-	{ 'regex': /{{/, 'label': "TEMPLATE_BEGIN" },
-	{ 'regex': /}}/, 'label': "TEMPLATE_END", 'markAfter': true }
+exp: [
+	{ regex: /{{/, label: 'TEMPLATE_BEGIN' },
+	{ regex: /}}/, label: 'TEMPLATE_END', markAfter: true }
 ],
 /**
  * Internally used functions
  */
-'fn': {
-	'create': function( context, config ) {
+fn: {
+	/**
+	 * @param context
+	 * @param config
+	 */
+	create: function () {
 		// Do some stuff here...
 	}
 }
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.toc.js b/extensions/WikiEditor/modules/jquery.wikiEditor.toc.js
index 54b8a863..3f186db6 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.toc.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.toc.js
@@ -1,31 +1,32 @@
 /* TOC Module for wikiEditor */
-( function( $ ) { $.wikiEditor.modules.toc = {
+/*jshint onevar:false */
+( function ( $, mw ) { $.wikiEditor.modules.toc = {
 
 /**
  * Compatability map
  */
-'browsers': {
+browsers: {
 	// Left-to-right languages
-	'ltr': {
-		'msie': [['>=', 7]],
-		'firefox': [['>=', 3]],
-		'opera': [['>=', 10]],
-		'safari': [['>=', 4]],
-		'chrome': [['>=', 4]]
+	ltr: {
+		msie: [['>=', 7]],
+		firefox: [['>=', 3]],
+		opera: [['>=', 10]],
+		safari: [['>=', 4]],
+		chrome: [['>=', 4]]
 	},
 	// Right-to-left languages
-	'rtl': {
-		'msie': [['>=', 8]],
-		'firefox': [['>=', 3]],
-		'opera': [['>=', 10]],
-		'safari': [['>=', 4]],
-		'chrome': [['>=', 4]]
+	rtl: {
+		msie: [['>=', 8]],
+		firefox: [['>=', 3]],
+		opera: [['>=', 10]],
+		safari: [['>=', 4]],
+		chrome: [['>=', 4]]
 	}
 },
 /**
  * Core Requirements
  */
-'req': [ 'iframe' ],
+req: [ 'iframe' ],
 /**
  * Configuration
  */
@@ -51,10 +52,18 @@ api: {
  * Event handlers
  */
 evt: {
-	change: function( context, event ) {
+	/**
+	 * @param context
+	 * @param event
+	 */
+	change: function( context ) {
 		$.wikiEditor.modules.toc.fn.update( context );
 	},
-	ready: function( context, event ) {
+	/**
+	 * @param context
+	 * @param event
+	 */
+	ready: function( context ) {
 		// Add the TOC to the document
 		$.wikiEditor.modules.toc.fn.build( context );
 		if ( !context.$content ) {
@@ -68,28 +77,32 @@ evt: {
 		$.wikiEditor.modules.toc.fn.improveUI();
 		$.wikiEditor.modules.toc.evt.resize( context );
 	},
-	resize: function( context, event ) {
+	/**
+	 * @param context
+	 * @param event
+	 */
+	resize: function( context ) {
 		var availableWidth = context.$wikitext.width() - parseFloat( $.wikiEditor.modules.toc.cfg.textMinimumWidth ),
 			totalMinWidth = parseFloat( $.wikiEditor.modules.toc.cfg.minimumWidth ) +
 				parseFloat( $.wikiEditor.modules.toc.cfg.textMinimumWidth );
 		context.$ui.find( '.wikiEditor-ui-right' )
 			.resizable( 'option', 'maxWidth', availableWidth );
-		if ( context.modules.toc.$toc.data( 'positionMode' ) != 'disabled' &&
+		if ( context.modules.toc.$toc.data( 'positionMode' ) !== 'disabled' &&
 			context.$wikitext.width() < totalMinWidth ) {
 				$.wikiEditor.modules.toc.fn.disable( context );
-		} else if ( context.modules.toc.$toc.data( 'positionMode' ) == 'disabled'  &&
+		} else if ( context.modules.toc.$toc.data( 'positionMode' ) === 'disabled'  &&
 			context.$wikitext.width() >  totalMinWidth ) {
 				$.wikiEditor.modules.toc.fn.enable( context );
-		} else if ( context.modules.toc.$toc.data( 'positionMode' ) == 'regular'  &&
+		} else if ( context.modules.toc.$toc.data( 'positionMode' ) === 'regular'  &&
 			context.$ui.find( '.wikiEditor-ui-right' ).width() > availableWidth ) {
 			//switch mode
 			$.wikiEditor.modules.toc.fn.switchLayout( context );
-		} else if ( context.modules.toc.$toc.data( 'positionMode' ) == 'goofy'  &&
+		} else if ( context.modules.toc.$toc.data( 'positionMode' ) === 'goofy'  &&
 			context.modules.toc.$toc.data( 'previousWidth' ) < context.$wikitext.width() ) {
 			//switch mode
 			$.wikiEditor.modules.toc.fn.switchLayout( context );
 		}
-		if ( context.modules.toc.$toc.data( 'positionMode' ) == 'goofy' ) {
+		if ( context.modules.toc.$toc.data( 'positionMode' ) === 'goofy' ) {
 			context.modules.toc.$toc.find( 'div' ).autoEllipsis(
 				{ 'position': 'right', 'tooltip': true, 'restoreText': true }
 			);
@@ -105,14 +118,18 @@ evt: {
 		// store the width of the view for comparison on next resize
 		context.modules.toc.$toc.data( 'previousWidth', context.$wikitext.width() );
 	},
-	mark: function( context, event ) {
+	/**
+	 * @param context
+	 * @param event
+	 */
+	mark: function( context ) {
 		var hash = '';
 		var markers = context.modules.highlight.markers;
 		var tokenArray = context.modules.highlight.tokenArray;
 		var outline = context.data.outline = [];
 		var h = 0;
 		for ( var i = 0; i < tokenArray.length; i++ ) {
-			if ( tokenArray[i].label != 'TOC_HEADER' ) {
+			if ( tokenArray[i].label !== 'TOC_HEADER' ) {
 				continue;
 			}
 			h++;
@@ -134,14 +151,14 @@ evt: {
 				},
 				onSkip: function( node ) {
 					var marker = $( node ).data( 'marker' );
-					if ( $( node ).data( 'section' ) != marker.index ) {
+					if ( $( node ).data( 'section' ) !== marker.index ) {
 						$( node )
 							.removeClass( 'wikiEditor-toc-section-' + $( node ).data( 'section' ) )
 							.addClass( 'wikiEditor-toc-section-' + marker.index )
 							.data( 'section', marker.index );
 					}
 				},
-				getAnchor: function( ca1, ca2 ) {
+				getAnchor: function( ca1 ) {
 					return $( ca1.parentNode ).is( '.wikiEditor-toc-header' ) ?
 						ca1.parentNode : null;
 				}
@@ -154,7 +171,7 @@ evt: {
 			} );
 		}
 		// Only update the TOC if it's been changed - we do this by comparing a hash of the headings this time to last
-		if ( typeof context.modules.toc.lastHash == 'undefined' || context.modules.toc.lastHash !== hash ) {
+		if ( typeof context.modules.toc.lastHash === 'undefined' || context.modules.toc.lastHash !== hash ) {
 			$.wikiEditor.modules.toc.fn.build( context );
 			$.wikiEditor.modules.toc.fn.update( context );
 			// Remember the changed version
@@ -175,13 +192,13 @@ fn: {
 	 * @param {Object} context Context object of editor to create module in
 	 * @param {Object} config Configuration object to create module from
 	 */
-	create: function( context, config ) {
+	create: function( context ) {
 		if ( '$toc' in context.modules.toc ) {
 			return;
 		}
 		$.wikiEditor.modules.toc.cfg.rtl = $( 'body' ).is( '.rtl' );
 		$.wikiEditor.modules.toc.cfg.flexProperty = $.wikiEditor.modules.toc.cfg.rtl ? 'marginLeft' : 'marginRight';
-		var height = context.$ui.find( '.wikiEditor-ui-left' ).height();
+		context.$ui.find( '.wikiEditor-ui-left' ).height();
 		context.modules.toc.$toc = $( '<div>' )
 			.addClass( 'wikiEditor-ui-toc' )
 			.data( 'context', context )
@@ -196,14 +213,14 @@ fn: {
 	},
 	redraw: function( context, fixedWidth ) {
 		fixedWidth = parseFloat( fixedWidth );
-		if( context.modules.toc.$toc.data( 'positionMode' ) == 'regular' ) {
+		if ( context.modules.toc.$toc.data( 'positionMode' ) === 'regular' ) {
 			context.$ui.find( '.wikiEditor-ui-right' )
 			.css( 'width', fixedWidth + 'px' );
 			context.$ui.find( '.wikiEditor-ui-left' )
 				.css( $.wikiEditor.modules.toc.cfg.flexProperty, ( -1 * fixedWidth ) + 'px' )
 				.children()
 				.css( $.wikiEditor.modules.toc.cfg.flexProperty, fixedWidth + 'px' );
-		} else if( context.modules.toc.$toc.data( 'positionMode' ) == 'goofy' ) {
+		} else if( context.modules.toc.$toc.data( 'positionMode' ) === 'goofy' ) {
 			context.$ui.find( '.wikiEditor-ui-left' )
 				.css( 'width', fixedWidth );
 			context.$ui.find( '.wikiEditor-ui-right' )
@@ -212,10 +229,10 @@ fn: {
 		}
 	},
 	switchLayout: function( context ) {
-		var width,
-			height = context.$ui.find( '.wikiEditor-ui-right' ).height();
-		if ( context.modules.toc.$toc.data( 'positionMode' ) == 'regular'
-				&& !context.modules.toc.$toc.data( 'collapsed' )
+		var width;
+		context.$ui.find( '.wikiEditor-ui-right' ).height();
+		if ( context.modules.toc.$toc.data( 'positionMode' ) === 'regular' &&
+			!context.modules.toc.$toc.data( 'collapsed' )
 		) {
 			// store position mode
 			context.modules.toc.$toc.data( 'positionMode', 'goofy' );
@@ -237,7 +254,7 @@ fn: {
 				'left' : $.wikiEditor.modules.toc.cfg.rtl ? 0 : 'auto' } );
 			context.$wikitext
 				.css( 'position', 'relative' );
-		} else if ( context.modules.toc.$toc.data( 'positionMode' ) == 'goofy' ) {
+		} else if ( context.modules.toc.$toc.data( 'positionMode' ) === 'goofy' ) {
 			// store position mode
 			context.modules.toc.$toc.data( 'positionMode', 'regular' );
 			// set width
@@ -260,7 +277,7 @@ fn: {
 		if ( context.modules.toc.$toc.data( 'collapsed' ) ) {
 			context.$ui.find( '.wikiEditor-ui-toc-expandControl' ).hide();
 		} else {
-			if( context.modules.toc.$toc.data( 'positionMode' ) == 'goofy' ) {
+			if( context.modules.toc.$toc.data( 'positionMode' ) === 'goofy' ) {
 				$.wikiEditor.modules.toc.fn.switchLayout( context );
 			}
 			context.$ui.find( '.wikiEditor-ui-right' ).hide();
@@ -296,7 +313,7 @@ fn: {
 	 *
 	 * @param {Object} context
 	 */
-	update: function( context ) {
+	update: function () {
 		//temporarily commenting this out because it is causing all kinds of cursor
 		//and text jumping issues in IE. WIll get back to this --pdhanda
 		/*
@@ -333,10 +350,10 @@ fn: {
 	 *
 	 * @param {Object} event Event object with context as data
 	 */
-	collapse: function( event ) {
+	collapse: function () {
 		var $this = $( this ),
 			context = $this.data( 'context' );
-		if( context.modules.toc.$toc.data( 'positionMode' ) == 'goofy' ) {
+		if ( context.modules.toc.$toc.data( 'positionMode' ) === 'goofy' ) {
 			$.wikiEditor.modules.toc.fn.switchLayout( context );
 		}
 		var pT = $this.parent().position().top - 1;
@@ -366,7 +383,7 @@ fn: {
 				// Let the UI know things have moved around
 				context.fn.trigger( 'tocCollapse' );
 				context.fn.trigger( 'resize' );
-			 } );
+			} );
 
 		$.cookie( 'wikiEditor-' + context.instance + '-toc-width', 0 );
 		return false;
@@ -377,15 +394,19 @@ fn: {
 	 *
 	 * @param {Object} event Event object with context as data
 	 */
-	expand: function( event ) {
+	expand: function () {
 		var $this = $( this ),
 			context = $this.data( 'context' ),
 			openWidth = parseFloat( context.modules.toc.$toc.data( 'openWidth' ) ),
 			availableSpace = context.$wikitext.width() - parseFloat( $.wikiEditor.modules.toc.cfg.textMinimumWidth );
-		if ( availableSpace < $.wikiEditor.modules.toc.cfg.textMinmumWidth ) return false;
+		if ( availableSpace < $.wikiEditor.modules.toc.cfg.textMinmumWidth ) {
+			return false;
+		}
 		context.modules.toc.$toc.data( 'collapsed', false );
 		// check if we've got enough room to open to our stored width
-		if ( availableSpace < openWidth ) openWidth = availableSpace;
+		if ( availableSpace < openWidth ) {
+			openWidth = availableSpace;
+		}
 		context.$ui.find( '.wikiEditor-ui-toc-expandControl' ).hide();
 		var leftParam = {}, leftChildParam = {};
 		leftParam[ $.wikiEditor.modules.toc.cfg.flexProperty ] = parseFloat( openWidth ) * -1;
@@ -407,7 +428,7 @@ fn: {
 					'top': 'auto' } );
 					context.fn.trigger( 'tocExpand' );
 					context.fn.trigger( 'resize' );
-			 } );
+			} );
 		$.cookie( 'wikiEditor-' + context.instance + '-toc-width',
 			context.modules.toc.$toc.data( 'openWidth' ) );
 		return false;
@@ -432,7 +453,7 @@ fn: {
 			}
 			var sections = [];
 			for ( var i = offset; i < outline.length; i++ ) {
-				if ( outline[i].nLevel == level ) {
+				if ( outline[i].nLevel === level ) {
 					var sub = buildStructure( outline, i + 1, level + 1 );
 					if ( sub.length ) {
 						outline[i].sections = sub;
@@ -462,8 +483,9 @@ fn: {
 					.click( function( event ) {
 						var wrapper = context.$content.find(
 							'.wikiEditor-toc-section-' + $( this ).data( 'index' ) );
-						if ( wrapper.length === 0 )
+						if ( wrapper.length === 0 ) {
 							wrapper = context.$content;
+						}
 						context.fn.scrollToTop( wrapper, true );
 						context.$textarea.textSelection( 'setSelection', {
 							'start': 0,
@@ -481,8 +503,9 @@ fn: {
 						event.preventDefault();
 					} )
 					.text( structure[i].text );
-				if ( structure[i].text === '' )
+				if ( structure[i].text === '' ) {
 					div.html( '&nbsp;' );
+				}
 				var item = $( '<li>' ).append( div );
 				if ( structure[i].sections !== undefined ) {
 					item.append( buildList( structure[i].sections ) );
@@ -546,7 +569,7 @@ fn: {
 				.data( 'wikiEditor-ui-left', context.$ui.find( '.wikiEditor-ui-left' ) )
 				.resizable( { handles: 'w,e', preventPositionLeftChange: true,
 					minWidth: parseFloat( $.wikiEditor.modules.toc.cfg.minimumWidth ),
-					start: function( e, ui ) {
+					start: function () {
 						var $this = $( this );
 						// Toss a transparent cover over our iframe
 						$( '<div>' )
@@ -562,7 +585,7 @@ fn: {
 							.appendTo( context.$ui.find( '.wikiEditor-ui-left' ) );
 						$this.resizable( 'option', 'maxWidth', $this.parent().width() -
 							parseFloat( $.wikiEditor.modules.toc.cfg.textMinimumWidth ) );
-						if(context.modules.toc.$toc.data( 'positionMode' ) == 'goofy' ) {
+						if ( context.modules.toc.$toc.data( 'positionMode' ) === 'goofy' ) {
 							$.wikiEditor.modules.toc.fn.switchLayout( context );
 						}
 					},
@@ -596,7 +619,7 @@ fn: {
 			var handle = $.wikiEditor.modules.toc.cfg.rtl ? 'w' : 'e';
 			context.$ui.find( '.ui-resizable-' + handle )
 				.removeClass( 'ui-resizable-' + handle )
-				.addClass( 'ui-resizable-' + ( handle == 'w' ? 'e' : 'w' ) )
+				.addClass( 'ui-resizable-' + ( handle === 'w' ? 'e' : 'w' ) )
 				.addClass( 'wikiEditor-ui-toc-resize-grip' );
 			// Bind collapse and expand event handlers to the TOC
 			context.modules.toc.$toc
@@ -604,12 +627,13 @@ fn: {
 				.bind( 'expand.wikiEditor-toc', $.wikiEditor.modules.toc.fn.expand  );
 			context.modules.toc.$toc.data( 'openWidth', $.wikiEditor.modules.toc.cfg.defaultWidth );
 			// If the toc-width cookie is set, reset the widths based upon that
-			if ( $.cookie( 'wikiEditor-' + context.instance + '-toc-width' ) == 0 ) {
+			if ( $.cookie( 'wikiEditor-' + context.instance + '-toc-width' ) === 0 ) {
 				context.modules.toc.$toc.trigger( 'collapse.wikiEditor-toc', { data: context } );
 			} else if ( $.cookie( 'wikiEditor-' + context.instance + '-toc-width' ) > 0 ) {
 				var initialWidth = $.cookie( 'wikiEditor-' + context.instance + '-toc-width' );
-				if( initialWidth < parseFloat( $.wikiEditor.modules.toc.cfg.minimumWidth ) )
+				if ( initialWidth < parseFloat( $.wikiEditor.modules.toc.cfg.minimumWidth ) ) {
 					initialWidth = parseFloat( $.wikiEditor.modules.toc.cfg.minimumWidth ) + 1;
+				}
 				context.modules.toc.$toc.data( 'openWidth', initialWidth + 'px' );
 				$.wikiEditor.modules.toc.fn.redraw( context, initialWidth );
 			}
@@ -664,7 +688,7 @@ fn: {
 		 * Extending resizable to allow west resizing without altering the left position attribute
 		 */
 		$.ui.plugin.add( 'resizable', 'preventPositionLeftChange', {
-			resize: function( event, ui ) {
+			resize: function () {
 				$( this ).data( 'resizable' ).position.left = 0;
 			}
 		} );
@@ -673,4 +697,4 @@ fn: {
 
 };
 
-} ) ( jQuery );
+} )( jQuery, mediaWiki );
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js
index c9d0f797..780eb2c3 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.config.js
@@ -1,7 +1,8 @@
 /**
  * Configuration of Toolbar module for wikiEditor
  */
-( function( $ ) { $.wikiEditor.modules.toolbar.config = {
+/*jshint camelcase:false, quotmark:false */
+( function ( $, mw ) { $.wikiEditor.modules.toolbar.config = {
 
 getDefaultConfig: function() {
 	var fileNamespace = mw.config.get( 'wgFormattedNamespaces' )[6];
@@ -45,6 +46,7 @@ getDefaultConfig: function() {
 								'hu': 'format-bold-F.png',
 								'it': 'format-bold-G.png',
 								'ka': 'format-bold-ka.png',
+								'ky': 'format-bold-ru.png',
 								'nl': 'format-bold-V.png',
 								'os': 'format-bold-os.png',
 								'pt': 'format-bold-N.png',
@@ -78,6 +80,7 @@ getDefaultConfig: function() {
 								'es': [2, -790],
 								'he': [2, -862],
 								'it': [2, -790],
+								'ky': [2, -934],
 								'nl': [2, -790],
 								'pt': [2, -862],
 								'pt-br': [2, -862],
@@ -98,6 +101,7 @@ getDefaultConfig: function() {
 								'hu': 'format-italic-D.png',
 								'it': 'format-italic-C.png',
 								'ka': 'format-italic-ka.png',
+								'ky': 'format-italic-K.png',
 								'nl': 'format-italic-C.png',
 								'os': 'format-italic-K.png',
 								'pt': 'format-italic-I.png',
@@ -812,7 +816,7 @@ getDefaultConfig: function() {
 						"\u047A", "\u047B", // Round Omega (old cyrillic)
 						"\u047c", "\u047d", // Cyr Omega with Titlo (old cyrillic)
 						"\u047e", "\u047f", // Cyr Ot (old cyrillic)
-						"\u0480", "\u0481", // Cyr Koppa (old cyrillic)
+						"\u0480", "\u0481"  // Cyr Koppa (old cyrillic)
 					]
 				},
 				// The core 28-letter alphabet, special letters for the Arabic language,
@@ -1449,4 +1453,4 @@ getDefaultConfig: function() {
 	} };
 }
 
-}; } ) ( jQuery );
+}; } ) ( jQuery, mediaWiki );
diff --git a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js
index b43dff47..71592b53 100644
--- a/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js
+++ b/extensions/WikiEditor/modules/jquery.wikiEditor.toolbar.js
@@ -1,6 +1,7 @@
 /**
  * Toolbar module for wikiEditor
  */
+/*jshint onevar:false */
 ( function ( mw, $ ) { $.wikiEditor.modules.toolbar = {
 
 /**
@@ -17,7 +18,7 @@ api : {
 					var	$sections = context.modules.toolbar.$toolbar.find( 'div.sections' ),
 						$tabs = context.modules.toolbar.$toolbar.find( 'div.tabs' );
 					for ( var section in data[type] ) {
-						if ( section == 'main' ) {
+						if ( section === 'main' ) {
 							// Section
 							context.modules.toolbar.$toolbar.prepend(
 								$.wikiEditor.modules.toolbar.fn.buildSection(
@@ -145,28 +146,28 @@ api : {
 		}
 	},
 	removeFromToolbar : function( context, data ) {
-		if ( typeof data.section == 'string' ) {
+		if ( typeof data.section === 'string' ) {
 			// Section
 			var tab = 'div.tabs span[rel="' + data.section + '"].tab';
 			var target = 'div[rel="' + data.section + '"].section';
 			var group = null;
-			if ( typeof data.group == 'string' ) {
+			if ( typeof data.group === 'string' ) {
 				// Toolbar group
 				target += ' div[rel="' + data.group + '"].group';
-				if ( typeof data.tool == 'string' ) {
+				if ( typeof data.tool === 'string' ) {
 					// Save for later checking if empty
 					group = target;
 					// Tool
 					target += ' a[rel="' + data.tool + '"].tool';
 				}
-			} else if ( typeof data.page == 'string' ) {
+			} else if ( typeof data.page === 'string' ) {
 				// Booklet page
 				var index = target + ' div.index div[rel="' + data.page + '"]';
 				target += ' div.pages div[rel="' + data.page + '"].page';
-				if ( typeof data.character == 'string' ) {
+				if ( typeof data.character === 'string' ) {
 					// Character
 					target += ' span[rel="' + data.character + '"]';
-				} else if ( typeof data.row == 'number' ) {
+				} else if ( typeof data.row === 'number' ) {
 					// Table row
 					target += ' table tr:not(:has(th)):eq(' + data.row + ')';
 				} else {
@@ -198,7 +199,11 @@ api : {
  * Event handlers
  */
 evt: {
-	resize: function( context, event ) {
+	/**
+	 * @param context
+	 * @param event
+	 */
+	resize: function( context ) {
 		context.$ui.find( '.sections' ).height( context.$ui.find( '.sections .section-visible' ).outerHeight() );
 	},
 	tocCollapse: function( context, event ) {
@@ -235,7 +240,7 @@ fn: {
 	 * @param {Object} action
 	 * @param {Object} source
 	 */
-	doAction : function( context, action, source ) {
+	doAction : function( context, action ) {
 		switch ( action.type ) {
 			case 'replace':
 			case 'encapsulate':
@@ -244,7 +249,7 @@ fn: {
 					'peri' : $.wikiEditor.autoMsg( action.options, 'peri' ),
 					'post' : $.wikiEditor.autoMsg( action.options, 'post' )
 				};
-				var replace = action.type == 'replace';
+				var replace = action.type === 'replace';
 				if ( 'regex' in action.options && 'regexReplace' in action.options ) {
 					var selection = context.$textarea.textSelection( 'getSelection' );
 					if ( selection !== '' && selection.match( action.options.regex ) ) {
@@ -263,7 +268,7 @@ fn: {
 				}
 				break;
 			case 'callback':
-				if ( typeof action.execute == 'function' ) {
+				if ( typeof action.execute === 'function' ) {
 					action.execute( context );
 				}
 				break;
@@ -287,7 +292,7 @@ fn: {
 				if ( tool ) {
 					// Consider a group with only hidden tools empty as well
 					// .is( ':visible' ) always returns false because tool is not attached to the DOM yet
-					empty = empty && tool.css( 'display' ) == 'none';
+					empty = empty && tool.css( 'display' ) === 'none';
 					$group.append( tool );
 				}
 			}
@@ -314,13 +319,13 @@ fn: {
 					var offsetOrIcon = $.wikiEditor.autoIconOrOffset( tool.icon, tool.offset,
 						$.wikiEditor.imgPath + 'toolbar/'
 					);
-					if ( typeof offsetOrIcon == 'object' ) {
+					if ( typeof offsetOrIcon === 'object' ) {
 						$button = $( '<a/>' )
 							.attr( {
 								'href' : '#',
-								'alt' : label,
 								'title' : label,
 								'rel' : id,
+								'role' : 'button',
 								'class' : 'tool tool-button wikiEditor-toolbar-spritedButton'
 							} )
 							.text( label )
@@ -336,6 +341,7 @@ fn: {
 							'alt' : label,
 							'title' : label,
 							'rel' : id,
+							'role' : 'button',
 							'class' : 'tool tool-button'
 						} );
 				}
@@ -446,7 +452,7 @@ fn: {
 			} );
 	},
 	buildPage : function( context, id, page ) {
-		var html;
+		var html, i;
 		var $page = $( '<div/>' ).attr( {
 			'class' : 'page page-' + id,
 			'rel' : id
@@ -460,7 +466,7 @@ fn: {
 					html += $.wikiEditor.modules.toolbar.fn.buildHeading( context, page.headings );
 				}
 				if ( 'rows' in page ) {
-					for ( var i = 0; i < page.rows.length; i++ ) {
+					for ( i = 0; i < page.rows.length; i++ ) {
 						html += $.wikiEditor.modules.toolbar.fn.buildRow( context, page.rows[i] );
 					}
 				}
@@ -483,7 +489,7 @@ fn: {
 				}
 				if ( 'characters' in page ) {
 					html = '';
-					for ( var i = 0; i < page.characters.length; i++ ) {
+					for ( i = 0; i < page.characters.length; i++ ) {
 						html += $.wikiEditor.modules.toolbar.fn.buildCharacter( page.characters[i], actions );
 					}
 					$characters
@@ -526,7 +532,7 @@ fn: {
 		return html + '</tr>';
 	},
 	buildCharacter : function( character, actions ) {
-		if ( typeof character == 'string' ) {
+		if ( typeof character === 'string' ) {
 			character = {
 				'label' : character,
 				'action' : {
@@ -563,8 +569,9 @@ fn: {
 				return mw.html.element( 'span', { 'rel': character.label }, character.label );
 			}
 		}
-		mw.log( "A character for the toolbar was undefined. This is not supposed to happen. Double check the config." );
-		return ""; // bug 31673; also an additional fix for bug 24208...
+		mw.log( 'A character for the toolbar was undefined. This is not supposed to happen. Double check the config.' );
+		// bug 31673; also an additional fix for bug 24208...
+		return '';
 	},
 	buildTab : function( context, id, section ) {
 		var selected = $.cookie( 'wikiEditor-' + context.instance + '-toolbar-section' );
@@ -574,11 +581,16 @@ fn: {
 		}
 		var $link =
 			$( '<a/>' )
-				.addClass( selected == id ? 'current' : null )
-				.attr( 'href', '#' )
+				.addClass( selected === id ? 'current' : null )
+				.attr( {
+					href: '#',
+					role: 'button',
+					'aria-pressed': 'false',
+					'aria-controls': 'wikiEditor-section-' + id
+				} )
 				.text( $.wikiEditor.autoMsg( section, 'label' ) )
 				.data( 'context', context )
-				.mouseup( function( e ) {
+				.mouseup( function () {
 					$(this).blur();
 				} )
 				.mousedown( function( e ) {
@@ -587,14 +599,23 @@ fn: {
 					return false;
 				} )
 				.click( function( e ) {
+					// We have to set aria-pressed over here, as NVDA wont recognize it
+					// if we do it in the below .each as it seems
+					$(this).attr( 'aria-pressed', 'true' );
+					$( '.tab > a' ).each( function( i, elem ) {
+						if ( elem !== e.target ) {
+							$( elem ).attr( 'aria-pressed', 'false' );
+						}
+					} );
 					var $sections = $(this).data( 'context' ).$ui.find( '.sections' );
 					var $section =
 						$(this).data( 'context' ).$ui.find( '.section-' + $(this).parent().attr( 'rel' ) );
-					var show = $section.css( 'display' ) == 'none';
-					var $previousSections = $section.parent().find( '.section-visible' );
-					$previousSections.css( 'position', 'absolute' );
-					$previousSections.removeClass( 'section-visible' );
-					$previousSections.fadeOut( 'fast', function() { $(this).css( 'position', 'static' ); } );
+					var show = $section.css( 'display' ) === 'none';
+					$section.parent().find( '.section-visible' )
+						.css( 'position', 'absolute' )
+						.attr( 'aria-expanded', 'false' )
+						.removeClass( 'section-visible' )
+						.fadeOut( 'fast', function() { $(this).css( 'position', 'static' ); } );
 					$(this).parent().parent().find( 'a' ).removeClass( 'current' );
 					$sections.css( 'overflow', 'hidden' );
 					var animate = function( $that ) {
@@ -606,8 +627,9 @@ fn: {
 						} );
 					};
 					if ( show ) {
-						$section.addClass( 'section-visible' );
-						$section.fadeIn( 'fast' );
+						$section.addClass( 'section-visible' )
+							.attr( 'aria-expanded', 'true' )
+							.fadeIn( 'fast' );
 						if ( $section.hasClass( 'loading' ) ) {
 							// Loading of this section was deferred, load it now
 							var $that = $(this);
@@ -646,9 +668,13 @@ fn: {
 			.append( $link );
 	},
 	buildSection: function( context, id, section ) {
-		var $section = $( '<div/>' ).attr( { 'class': section.type + ' section section-' + id, 'rel': id } );
+		var $section = $( '<div/>' ).attr( {
+			'class': section.type + ' section section-' + id,
+			'rel': id,
+			id: 'wikiEditor-section-' + id
+		} );
 		var selected = $.cookie( 'wikiEditor-' + context.instance + '-toolbar-section' );
-		var show = selected == id;
+		var show = selected === id;
 
 		if ( section.deferLoad !== undefined && section.deferLoad && id !== 'main' && !show ) {
 			// This class shows the spinner and serves as a marker for the click handler in buildTab()
@@ -663,7 +689,10 @@ fn: {
 
 		// Show or hide section
 		if ( id !== 'main' ) {
-			$section.css( 'display', show ? 'block' : 'none' );
+			$section
+				.css( 'display', show ? 'block' : 'none' )
+				.attr( 'aria-expanded', show ? 'true' : 'false' );
+
 			if ( show ) {
 				$section.addClass( 'section-visible' );
 			}
@@ -701,6 +730,7 @@ fn: {
 		}
 	},
 	updateBookletSelection : function( context, id, $pages, $index ) {
+		/*jshint eqnull:true */
 		var cookie = 'wikiEditor-' + context.instance + '-booklet-' + id + '-page';
 		var selected = $.cookie( cookie );
 		// Re-save cookie
@@ -724,7 +754,7 @@ fn: {
 		context.modules.toolbar.$toolbar.append( $( '<div/>' ).css( 'clear', 'both' ) );
 		var sectionQueue = [];
 		for ( var section in config ) {
-			if ( section == 'main' ) {
+			if ( section === 'main' ) {
 				context.modules.toolbar.$toolbar.prepend(
 					$.wikiEditor.modules.toolbar.fn.buildSection( context, section, config[section] )
 				);
diff --git a/img_auth.php b/img_auth.php
index ccaa8af0..c8759ec8 100644
--- a/img_auth.php
+++ b/img_auth.php
@@ -40,11 +40,7 @@
  */
 
 define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-	require ( 'core/includes/WebStart.php' );
-} else {
-	require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
 wfProfileIn( 'img_auth.php' );
 
 # Set action base paths so that WebRequest::getPathInfo()
@@ -117,6 +113,8 @@ function wfImageAuthMain() {
 	}
 
 	// Run hook for extension authorization plugins
+	/** @var $result array */
+	$result = null;
 	if ( !wfRunHooks( 'ImgAuthBeforeStream', array( &$title, &$path, &$name, &$result ) ) ) {
 		wfForbidden( $result[0], $result[1], array_slice( $result, 2 ) );
 		return;
diff --git a/includes/Action.php b/includes/Action.php
index 2e0c88ba..4b6e4468 100644
--- a/includes/Action.php
+++ b/includes/Action.php
@@ -59,7 +59,7 @@ abstract class Action {
 	 * the action is disabled, or null if it's not recognised
 	 * @param $action String
 	 * @param $overrides Array
-	 * @return bool|null|string
+	 * @return bool|null|string|callable
 	 */
 	final private static function getClass( $action, array $overrides ) {
 		global $wgActions;
@@ -89,12 +89,18 @@ abstract class Action {
 	 *     if it is not recognised
 	 */
 	final public static function factory( $action, Page $page, IContextSource $context = null ) {
-		$class = self::getClass( $action, $page->getActionOverrides() );
-		if ( $class ) {
-			$obj = new $class( $page, $context );
+		$classOrCallable = self::getClass( $action, $page->getActionOverrides() );
+
+		if ( is_string( $classOrCallable ) ) {
+			$obj = new $classOrCallable( $page, $context );
 			return $obj;
 		}
-		return $class;
+
+		if ( is_callable( $classOrCallable ) ) {
+			return call_user_func_array( $classOrCallable, array( $page, $context ) );
+		}
+
+		return $classOrCallable;
 	}
 
 	/**
@@ -136,7 +142,7 @@ abstract class Action {
 			return 'view';
 		}
 
-		$action = Action::factory( $actionName, $context->getWikiPage() );
+		$action = Action::factory( $actionName, $context->getWikiPage(), $context );
 		if ( $action instanceof Action ) {
 			return $action->getName();
 		}
@@ -161,8 +167,14 @@ abstract class Action {
 	final public function getContext() {
 		if ( $this->context instanceof IContextSource ) {
 			return $this->context;
+		} else if ( $this->page instanceof Article ) {
+			// NOTE: $this->page can be a WikiPage, which does not have a context.
+			wfDebug( __METHOD__ . ': no context known, falling back to Article\'s context.' );
+			return $this->page->getContext();
 		}
-		return $this->page->getContext();
+
+		wfWarn( __METHOD__ . ': no context known, falling back to RequestContext::getMain().' );
+		return RequestContext::getMain();
 	}
 
 	/**
@@ -213,7 +225,7 @@ abstract class Action {
 	/**
 	 * Shortcut to get the user Language being used for this instance
 	 *
-	 * @deprecated 1.19 Use getLanguage instead
+	 * @deprecated since 1.19 Use getLanguage instead
 	 * @return Language
 	 */
 	final public function getLang() {
@@ -241,12 +253,20 @@ abstract class Action {
 	}
 
 	/**
-	 * Protected constructor: use Action::factory( $action, $page ) to actually build
-	 * these things in the real world
+	 * Constructor.
+	 *
+	 * Only public since 1.21
+	 *
 	 * @param $page Page
 	 * @param $context IContextSource
 	 */
-	protected function __construct( Page $page, IContextSource $context = null ) {
+	public function __construct( Page $page, IContextSource $context = null ) {
+		if ( $context === null ) {
+			wfWarn( __METHOD__ . ' called without providing a Context object.' );
+			// NOTE: We could try to initialize $context using $page->getContext(),
+			//      if $page is an Article. That however seems to not work seamlessly.
+		}
+
 		$this->page = $page;
 		$this->context = $context;
 	}
@@ -374,18 +394,23 @@ abstract class FormAction extends Action {
 	 * Add pre- or post-text to the form
 	 * @return String HTML which will be sent to $form->addPreText()
 	 */
-	protected function preText() { return ''; }
+	protected function preText() {
+		return '';
+	}
 
 	/**
 	 * @return string
 	 */
-	protected function postText() { return ''; }
+	protected function postText() {
+		return '';
+	}
 
 	/**
 	 * Play with the HTMLForm if you need to more substantially
 	 * @param $form HTMLForm
 	 */
-	protected function alterForm( HTMLForm $form ) {}
+	protected function alterForm( HTMLForm $form ) {
+	}
 
 	/**
 	 * Get the HTMLForm to control behavior
@@ -464,7 +489,7 @@ abstract class FormAction extends Action {
 	public function execute( array $data = null, $captureErrors = true ) {
 		try {
 			// Set a new context so output doesn't leak.
-			$this->context = clone $this->page->getContext();
+			$this->context = clone $this->getContext();
 
 			// This will throw exceptions if there's a problem
 			$this->checkCanExecute( $this->getUser() );
@@ -553,7 +578,7 @@ abstract class FormlessAction extends Action {
 	public function execute( array $data = null, $captureErrors = true ) {
 		try {
 			// Set a new context so output doesn't leak.
-			$this->context = clone $this->page->getContext();
+			$this->context = clone $this->getContext();
 			if ( is_array( $data ) ) {
 				$this->context->setRequest( new FauxRequest( $data, false ) );
 			}
diff --git a/includes/AjaxDispatcher.php b/includes/AjaxDispatcher.php
index b00cf309..c9ca1283 100644
--- a/includes/AjaxDispatcher.php
+++ b/includes/AjaxDispatcher.php
@@ -63,7 +63,7 @@ class AjaxDispatcher {
 			$this->mode = "post";
 		}
 
-		switch( $this->mode ) {
+		switch ( $this->mode ) {
 			case 'get':
 				$this->func_name = isset( $_GET["rs"] ) ? $_GET["rs"] : '';
 				if ( ! empty( $_GET["rsargs"] ) ) {
@@ -111,15 +111,13 @@ class AjaxDispatcher {
 			wfHttpError(
 				400,
 				'Bad Request',
-				"unknown function " . (string) $this->func_name
+				"unknown function " . $this->func_name
 			);
-		} elseif ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true )
-			&& !$wgUser->isAllowed( 'read' ) )
-		{
+		} elseif ( !User::isEveryoneAllowed( 'read' ) && !$wgUser->isAllowed( 'read' ) ) {
 			wfHttpError(
 				403,
 				'Forbidden',
-				'You must log in to view pages.' );
+				'You are not allowed to view pages.' );
 		} else {
 			wfDebug( __METHOD__ . ' dispatching ' . $this->func_name . "\n" );
 
diff --git a/includes/AjaxResponse.php b/includes/AjaxResponse.php
index 138f808a..d5536529 100644
--- a/includes/AjaxResponse.php
+++ b/includes/AjaxResponse.php
@@ -210,7 +210,7 @@ class AjaxResponse {
 	 * @param $timestamp string
 	 * @return bool Returns true if the response code was set to 304 Not Modified.
 	 */
-	function checkLastModified ( $timestamp ) {
+	function checkLastModified( $timestamp ) {
 		global $wgCachePages, $wgCacheEpoch, $wgUser;
 		$fname = 'AjaxResponse::checkLastModified';
 
diff --git a/includes/ArrayUtils.php b/includes/ArrayUtils.php
index 0b74f06a..985271f7 100644
--- a/includes/ArrayUtils.php
+++ b/includes/ArrayUtils.php
@@ -39,7 +39,7 @@ class ArrayUtils {
 	 *
 	 * @return bool|int|string
 	 */
-	public static function pickRandom( $weights ){
+	public static function pickRandom( $weights ) {
 		if ( !is_array( $weights ) || count( $weights ) == 0 ) {
 			return false;
 		}
diff --git a/includes/Article.php b/includes/Article.php
index 9b4afe44..0b18221a 100644
--- a/includes/Article.php
+++ b/includes/Article.php
@@ -25,7 +25,7 @@
  *
  * This maintains WikiPage functions for backwards compatibility.
  *
- * @todo move and rewrite code to an Action class
+ * @todo Move and rewrite code to an Action class
  *
  * See design.txt for an overview.
  * Note: edit user interface and cache support functions have been
@@ -160,7 +160,7 @@ class Article implements Page {
 		$page = null;
 		wfRunHooks( 'ArticleFromTitle', array( &$title, &$page ) );
 		if ( !$page ) {
-			switch( $title->getNamespace() ) {
+			switch ( $title->getNamespace() ) {
 				case NS_FILE:
 					$page = new ImagePage( $title );
 					break;
@@ -385,7 +385,8 @@ class Article implements Page {
 
 		$content = $this->fetchContentObject();
 
-		$this->mContent = ContentHandler::getContentText( $content ); #@todo: get rid of mContent everywhere!
+		// @todo Get rid of mContent everywhere!
+		$this->mContent = ContentHandler::getContentText( $content );
 		ContentHandler::runLegacyHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
 
 		wfProfileOut( __METHOD__ );
@@ -609,7 +610,7 @@ class Article implements Page {
 		$this->mParserOutput = false;
 
 		while ( !$outputDone && ++$pass ) {
-			switch( $pass ) {
+			switch ( $pass ) {
 				case 1:
 					wfRunHooks( 'ArticleViewHeader', array( &$this, &$outputDone, &$useParserCache ) );
 					break;
@@ -673,12 +674,12 @@ class Article implements Page {
 						wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
 						$this->showCssOrJsPage();
 						$outputDone = true;
-					} elseif( !wfRunHooks( 'ArticleContentViewCustom',
+					} elseif ( !wfRunHooks( 'ArticleContentViewCustom',
 							array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
 
 						# Allow extensions do their own custom view for certain pages
 						$outputDone = true;
-					} elseif( !ContentHandler::runLegacyHooks( 'ArticleViewCustom',
+					} elseif ( !ContentHandler::runLegacyHooks( 'ArticleViewCustom',
 							array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
 
 						# Allow extensions do their own custom view for certain pages
@@ -787,7 +788,7 @@ class Article implements Page {
 	 * Show a diff page according to current request variables. For use within
 	 * Article::view() only, other callers should use the DifferenceEngine class.
 	 *
-	 * @todo: make protected
+	 * @todo Make protected
 	 */
 	public function showDiffPage() {
 		$request = $this->getContext()->getRequest();
@@ -854,11 +855,11 @@ class Article implements Page {
 	/**
 	 * Get the robot policy to be used for the current view
 	 * @param string $action the action= GET parameter
-	 * @param $pOutput ParserOutput
+	 * @param $pOutput ParserOutput|null
 	 * @return Array the policy that should be set
 	 * TODO: actions other than 'view'
 	 */
-	public function getRobotPolicy( $action, $pOutput ) {
+	public function getRobotPolicy( $action, $pOutput = null ) {
 		global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
 
 		$ns = $this->getTitle()->getNamespace();
@@ -875,7 +876,7 @@ class Article implements Page {
 			}
 			if ( Block::newFromTarget( $specificTarget, $vagueTarget ) instanceof Block ) {
 				return array(
-					'index'  => 'noindex',
+					'index' => 'noindex',
 					'follow' => 'nofollow'
 				);
 			}
@@ -884,19 +885,19 @@ class Article implements Page {
 		if ( $this->mPage->getID() === 0 || $this->getOldID() ) {
 			# Non-articles (special pages etc), and old revisions
 			return array(
-				'index'  => 'noindex',
+				'index' => 'noindex',
 				'follow' => 'nofollow'
 			);
 		} elseif ( $this->getContext()->getOutput()->isPrintable() ) {
 			# Discourage indexing of printable versions, but encourage following
 			return array(
-				'index'  => 'noindex',
+				'index' => 'noindex',
 				'follow' => 'follow'
 			);
 		} elseif ( $this->getContext()->getRequest()->getInt( 'curid' ) ) {
 			# For ?curid=x urls, disallow indexing
 			return array(
-				'index'  => 'noindex',
+				'index' => 'noindex',
 				'follow' => 'follow'
 			);
 		}
@@ -988,8 +989,9 @@ class Article implements Page {
 
 				// Set the fragment if one was specified in the redirect
 				if ( strval( $this->getTitle()->getFragment() ) != '' ) {
-					$fragment = Xml::escapeJsString( $this->getTitle()->getFragmentForURL() );
-					$outputPage->addInlineScript( "redirectToFragment(\"$fragment\");" );
+					$outputPage->addInlineScript( Xml::encodeJsCall(
+						'redirectToFragment', array( $this->getTitle()->getFragmentForURL() )
+					) );
 				}
 
 				// Add a <link rel="canonical"> tag
@@ -1035,11 +1037,10 @@ class Article implements Page {
 			$this->getContext()->getOutput()->addWikiMsg( 'anontalkpagetext' );
 		}
 
-		# If we have been passed an &rcid= parameter, we want to give the user a
-		# chance to mark this new article as patrolled.
-		$this->showPatrolFooter();
+		// Show a footer allowing the user to patrol the shown revision or page if possible
+		$patrolFooterShown = $this->showPatrolFooter();
 
-		wfRunHooks( 'ArticleViewFooter', array( $this ) );
+		wfRunHooks( 'ArticleViewFooter', array( $this, $patrolFooterShown ) );
 
 	}
 
@@ -1049,21 +1050,92 @@ class Article implements Page {
 	 * desired, does nothing.
 	 * Side effect: When the patrol link is build, this method will call
 	 * OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
+	 *
+	 * @return bool
 	 */
 	public function showPatrolFooter() {
-		$request = $this->getContext()->getRequest();
+		global $wgUseNPPatrol, $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
+
 		$outputPage = $this->getContext()->getOutput();
 		$user = $this->getContext()->getUser();
-		$rcid = $request->getVal( 'rcid' );
+		$cache = wfGetMainCache();
+		$rc = false;
 
-		if ( !$rcid || !$this->getTitle()->quickUserCan( 'patrol', $user ) ) {
-			return;
+		if ( !$this->getTitle()->quickUserCan( 'patrol', $user ) || !( $wgUseRCPatrol || $wgUseNPPatrol ) ) {
+			// Patrolling is disabled or the user isn't allowed to
+			return false;
+		}
+
+		wfProfileIn( __METHOD__ );
+
+		// New page patrol: Get the timestamp of the oldest revison which
+		// the revision table holds for the given page. Then we look
+		// whether it's within the RC lifespan and if it is, we try
+		// to get the recentchanges row belonging to that entry
+		// (with rc_new = 1).
+
+		// Check for cached results
+		if ( $cache->get( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ) ) ) {
+			wfProfileOut( __METHOD__ );
+			return false;
 		}
 
+		if ( $this->mRevision && !RecentChange::isInRCLifespan( $this->mRevision->getTimestamp(), 21600 ) ) {
+			// The current revision is already older than what could be in the RC table
+			// 6h tolerance because the RC might not be cleaned out regularly
+			wfProfileOut( __METHOD__ );
+			return false;
+		}
+
+		$dbr = wfGetDB( DB_SLAVE );
+		$oldestRevisionTimestamp = $dbr->selectField(
+			'revision',
+			'MIN( rev_timestamp )',
+			array( 'rev_page' => $this->getTitle()->getArticleID() ),
+			__METHOD__
+		);
+
+		if ( $oldestRevisionTimestamp && RecentChange::isInRCLifespan( $oldestRevisionTimestamp, 21600 ) ) {
+			// 6h tolerance because the RC might not be cleaned out regularly
+			$rc = RecentChange::newFromConds(
+				array(
+					'rc_new' => 1,
+					'rc_timestamp' => $oldestRevisionTimestamp,
+					'rc_namespace' => $this->getTitle()->getNamespace(),
+					'rc_cur_id' => $this->getTitle()->getArticleID(),
+					'rc_patrolled' => 0
+				),
+				__METHOD__,
+				array( 'USE INDEX' => 'new_name_timestamp' )
+			);
+		}
+
+		if ( !$rc ) {
+			// No RC entry around
+
+			// Cache the information we gathered above in case we can't patrol
+			// Don't cache in case we can patrol as this could change
+			$cache->set( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ), '1' );
+
+			wfProfileOut( __METHOD__ );
+			return false;
+		}
+
+		if ( $rc->getPerformer()->getName() == $user->getName() ) {
+			// Don't show a patrol link for own creations. If the user could
+			// patrol them, they already would be patrolled
+			wfProfileOut( __METHOD__ );
+			return false;
+		}
+
+		$rcid = $rc->getAttribute( 'rc_id' );
+
 		$token = $user->getEditToken( $rcid );
 
 		$outputPage->preventClickjacking();
-		$outputPage->addModules( 'mediawiki.page.patrol.ajax' );
+		if ( $wgEnableAPI && $wgEnableWriteAPI && $user->isAllowed( 'writeapi' ) ) {
+			$outputPage->addModules( 'mediawiki.page.patrol.ajax' );
+		}
 
 		$link = Linker::linkKnown(
 			$this->getTitle(),
@@ -1081,6 +1153,9 @@ class Article implements Page {
 				wfMessage( 'markaspatrolledlink' )->rawParams( $link )->escaped() .
 			'</div>'
 		);
+
+		wfProfileOut( __METHOD__ );
+		return true;
 	}
 
 	/**
@@ -1090,6 +1165,7 @@ class Article implements Page {
 	public function showMissingArticle() {
 		global $wgSend404Code;
 		$outputPage = $this->getContext()->getOutput();
+		// Whether the page is a root user page of an existing user (but not a subpage)
 		$validUserPage = false;
 
 		# Show info in user (talk) namespace. Does the user exist? Is he blocked?
@@ -1099,7 +1175,7 @@ class Article implements Page {
 			$user = User::newFromName( $rootPart, false /* allow IP users*/ );
 			$ip = User::isIP( $rootPart );
 
-			if ( !($user && $user->isLoggedIn()) && !$ip ) { # User does not exist
+			if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist
 				$outputPage->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
 					array( 'userpage-userdoesnotexist-view', wfEscapeWikiText( $rootPart ) ) );
 			} elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
@@ -1117,9 +1193,9 @@ class Article implements Page {
 						)
 					)
 				);
-				$validUserPage = true;
+				$validUserPage = !$this->getTitle()->isSubpage();
 			} else {
-				$validUserPage = true;
+				$validUserPage = !$this->getTitle()->isSubpage();
 			}
 		}
 
@@ -1139,6 +1215,13 @@ class Article implements Page {
 			$this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
 		}
 
+		if ( $validUserPage ) {
+			// Also apply the robot policy for nonexisting user pages (as those aren't served as 404)
+			$policy = $this->getRobotPolicy( 'view' );
+			$outputPage->setIndexPolicy( $policy['index'] );
+			$outputPage->setFollowPolicy( $policy['follow'] );
+		}
+
 		$hookResult = wfRunHooks( 'BeforeDisplayNoArticleText', array( $this ) );
 
 		if ( ! $hookResult ) {
@@ -1188,7 +1271,7 @@ class Article implements Page {
 		} elseif ( $this->getContext()->getRequest()->getInt( 'unhide' ) != 1 ) {
 			# Give explanation and add a link to view the revision...
 			$oldid = intval( $this->getOldID() );
-			$link = $this->getTitle()->getFullUrl( "oldid={$oldid}&unhide=1" );
+			$link = $this->getTitle()->getFullURL( "oldid={$oldid}&unhide=1" );
 			$msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
 				'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide';
 			$outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
@@ -1470,13 +1553,7 @@ class Article implements Page {
 
 			$this->doDelete( $reason, $suppress );
 
-			if ( $user->isLoggedIn() && $request->getCheck( 'wpWatch' ) != $user->isWatched( $title ) ) {
-				if ( $request->getCheck( 'wpWatch' ) ) {
-					WatchAction::doWatch( $title, $user );
-				} else {
-					WatchAction::doUnwatch( $title, $user );
-				}
-			}
+			WatchAction::doWatchOrUnwatch( $request->getCheck( 'wpWatch' ), $title, $user );
 
 			return;
 		}
diff --git a/includes/AuthPlugin.php b/includes/AuthPlugin.php
index a4658176..84cf3d5e 100644
--- a/includes/AuthPlugin.php
+++ b/includes/AuthPlugin.php
@@ -212,6 +212,19 @@ class AuthPlugin {
 		return true;
 	}
 
+	/**
+	 * Update user groups in the external authentication database.
+	 * Return true if successful.
+	 *
+	 * @param $user User object.
+	 * @param $addgroups Groups to add.
+	 * @param $delgroups Groups to remove.
+	 * @return Boolean
+	 */
+	public function updateExternalDBGroups( $user, $addgroups, $delgroups = array() ) {
+		return true;
+	}
+
 	/**
 	 * Check to see if external accounts can be created.
 	 * Return true if external accounts can be created.
diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php
index 3555e2c3..0706fe3f 100644
--- a/includes/AutoLoader.php
+++ b/includes/AutoLoader.php
@@ -55,7 +55,6 @@ $wgAutoloadLocalClasses = array(
 	'CdbWriter_DBA' => 'includes/Cdb.php',
 	'CdbWriter_PHP' => 'includes/Cdb_PHP.php',
 	'ChangesFeed' => 'includes/ChangesFeed.php',
-	'ChangesList' => 'includes/ChangesList.php',
 	'ChangeTags' => 'includes/ChangeTags.php',
 	'ChannelFeed' => 'includes/Feed.php',
 	'Collation' => 'includes/Collation.php',
@@ -65,10 +64,10 @@ $wgAutoloadLocalClasses = array(
 	'ConfEditorToken' => 'includes/ConfEditor.php',
 	'Cookie' => 'includes/Cookie.php',
 	'CookieJar' => 'includes/Cookie.php',
-	'MWCryptRand' => 'includes/CryptRand.php',
 	'CurlHttpRequest' => 'includes/HttpFunctions.php',
 	'DeferrableUpdate' => 'includes/DeferredUpdates.php',
 	'DeferredUpdates' => 'includes/DeferredUpdates.php',
+	'MWCallableUpdate' => 'includes/CallableUpdate.php',
 	'DeprecatedGlobal' => 'includes/DeprecatedGlobal.php',
 	'DerivativeRequest' => 'includes/WebRequest.php',
 	'DiffHistoryBlob' => 'includes/HistoryBlob.php',
@@ -87,16 +86,8 @@ $wgAutoloadLocalClasses = array(
 	'DumpPipeOutput' => 'includes/Export.php',
 	'EditPage' => 'includes/EditPage.php',
 	'EmailNotification' => 'includes/UserMailer.php',
-	'EnhancedChangesList' => 'includes/ChangesList.php',
 	'ErrorPageError' => 'includes/Exception.php',
 	'ExplodeIterator' => 'includes/StringUtils.php',
-	'ExternalEdit' => 'includes/ExternalEdit.php',
-	'ExternalStore' => 'includes/externalstore/ExternalStore.php',
-	'ExternalStoreDB' => 'includes/externalstore/ExternalStoreDB.php',
-	'ExternalStoreHttp' => 'includes/externalstore/ExternalStoreHttp.php',
-	'ExternalStoreMedium' => 'includes/externalstore/ExternalStoreMedium.php',
-	'ExternalStoreMwstore' => 'includes/externalstore/ExternalStoreMwstore.php',
-	'ExternalUser' => 'includes/ExternalUser.php',
 	'FakeTitle' => 'includes/FakeTitle.php',
 	'Fallback' => 'includes/Fallback.php',
 	'FatalError' => 'includes/Exception.php',
@@ -111,22 +102,27 @@ $wgAutoloadLocalClasses = array(
 	'FormOptions' => 'includes/FormOptions.php',
 	'FormSpecialPage' => 'includes/SpecialPage.php',
 	'GitInfo' => 'includes/GitInfo.php',
+	'HashRing' => 'includes/HashRing.php',
 	'HashtableReplacer' => 'includes/StringUtils.php',
 	'HistoryBlob' => 'includes/HistoryBlob.php',
 	'HistoryBlobCurStub' => 'includes/HistoryBlob.php',
 	'HistoryBlobStub' => 'includes/HistoryBlob.php',
 	'Hooks' => 'includes/Hooks.php',
 	'Html' => 'includes/Html.php',
+	'HtmlFormatter' => 'includes/HtmlFormatter.php',
 	'HTMLApiField' => 'includes/HTMLForm.php',
+	'HTMLButtonField' => 'includes/HTMLForm.php',
 	'HTMLCheckField' => 'includes/HTMLForm.php',
 	'HTMLCheckMatrix' => 'includes/HTMLForm.php',
 	'HTMLEditTools' => 'includes/HTMLForm.php',
 	'HTMLFloatField' => 'includes/HTMLForm.php',
 	'HTMLForm' => 'includes/HTMLForm.php',
 	'HTMLFormField' => 'includes/HTMLForm.php',
+	'HTMLFormFieldRequiredOptionsException' => 'includes/HTMLForm.php',
 	'HTMLHiddenField' => 'includes/HTMLForm.php',
 	'HTMLInfoField' => 'includes/HTMLForm.php',
 	'HTMLIntField' => 'includes/HTMLForm.php',
+	'HTMLNestedFilterable' => 'includes/HTMLForm.php',
 	'HTMLMultiSelectField' => 'includes/HTMLForm.php',
 	'HTMLRadioField' => 'includes/HTMLForm.php',
 	'HTMLSelectAndOtherField' => 'includes/HTMLForm.php',
@@ -140,7 +136,6 @@ $wgAutoloadLocalClasses = array(
 	'ICacheHelper' => 'includes/CacheHelper.php',
 	'IcuCollation' => 'includes/Collation.php',
 	'IdentityCollation' => 'includes/Collation.php',
-	'ImageGallery' => 'includes/ImageGallery.php',
 	'ImageHistoryList' => 'includes/ImagePage.php',
 	'ImageHistoryPseudoPager' => 'includes/ImagePage.php',
 	'ImagePage' => 'includes/ImagePage.php',
@@ -156,7 +151,6 @@ $wgAutoloadLocalClasses = array(
 	'LCStore_CDB' => 'includes/cache/LocalisationCache.php',
 	'LCStore_DB' => 'includes/cache/LocalisationCache.php',
 	'LCStore_Null' => 'includes/cache/LocalisationCache.php',
-	'LegacyTemplate' => 'includes/SkinLegacy.php',
 	'License' => 'includes/Licenses.php',
 	'Licenses' => 'includes/Licenses.php',
 	'Linker' => 'includes/Linker.php',
@@ -174,6 +168,7 @@ $wgAutoloadLocalClasses = array(
 	'Message' => 'includes/Message.php',
 	'MessageBlobStore' => 'includes/MessageBlobStore.php',
 	'MimeMagic' => 'includes/MimeMagic.php',
+	'MWCryptRand' => 'includes/MWCryptRand.php',
 	'MWException' => 'includes/Exception.php',
 	'MWExceptionHandler' => 'includes/Exception.php',
 	'MWFunction' => 'includes/MWFunction.php',
@@ -181,7 +176,6 @@ $wgAutoloadLocalClasses = array(
 	'MWHttpRequest' => 'includes/HttpFunctions.php',
 	'MWInit' => 'includes/Init.php',
 	'MWNamespace' => 'includes/Namespace.php',
-	'OldChangesList' => 'includes/ChangesList.php',
 	'OutputPage' => 'includes/OutputPage.php',
 	'Page' => 'includes/WikiPage.php',
 	'PageQueryPage' => 'includes/PageQueryPage.php',
@@ -194,6 +188,7 @@ $wgAutoloadLocalClasses = array(
 	'PoolCounter' => 'includes/PoolCounter.php',
 	'PoolCounter_Stub' => 'includes/PoolCounter.php',
 	'PoolCounterWork' => 'includes/PoolCounter.php',
+	'PoolCounterWorkViaCallback' => 'includes/PoolCounter.php',
 	'PoolWorkArticleView' => 'includes/WikiPage.php',
 	'Preferences' => 'includes/Preferences.php',
 	'PreferencesForm' => 'includes/Preferences.php',
@@ -202,10 +197,8 @@ $wgAutoloadLocalClasses = array(
 	'QueryPage' => 'includes/QueryPage.php',
 	'QuickTemplate' => 'includes/SkinTemplate.php',
 	'RawMessage' => 'includes/Message.php',
-	'RCCacheEntry' => 'includes/ChangesList.php',
 	'RdfMetaData' => 'includes/Metadata.php',
 	'ReadOnlyError' => 'includes/Exception.php',
-	'RecentChange' => 'includes/RecentChange.php',
 	'RedirectSpecialArticle' => 'includes/SpecialPage.php',
 	'RedirectSpecialPage' => 'includes/SpecialPage.php',
 	'RegexlikeReplacer' => 'includes/StringUtils.php',
@@ -228,7 +221,6 @@ $wgAutoloadLocalClasses = array(
 	'SiteStatsInit' => 'includes/SiteStats.php',
 	'SiteStatsUpdate' => 'includes/SiteStats.php',
 	'Skin' => 'includes/Skin.php',
-	'SkinLegacy' => 'includes/SkinLegacy.php',
 	'SkinTemplate' => 'includes/SkinTemplate.php',
 	'SpecialCreateAccount' => 'includes/SpecialPage.php',
 	'SpecialListAdmins' => 'includes/SpecialPage.php',
@@ -237,11 +229,13 @@ $wgAutoloadLocalClasses = array(
 	'SpecialMypage' => 'includes/SpecialPage.php',
 	'SpecialMytalk' => 'includes/SpecialPage.php',
 	'SpecialMyuploads' => 'includes/SpecialPage.php',
+	'SpecialAllMyUploads' => 'includes/SpecialPage.php',
 	'SpecialPage' => 'includes/SpecialPage.php',
 	'SpecialPageFactory' => 'includes/SpecialPageFactory.php',
 	'SpecialRedirectToSpecial' => 'includes/SpecialPage.php',
 	'SquidPurgeClient' => 'includes/SquidPurgeClient.php',
 	'SquidPurgeClientPool' => 'includes/SquidPurgeClient.php',
+	'StatCounter' => 'includes/StatCounter.php',
 	'Status' => 'includes/Status.php',
 	'StreamFile' => 'includes/StreamFile.php',
 	'StringUtils' => 'includes/StringUtils.php',
@@ -415,6 +409,7 @@ $wgAutoloadLocalClasses = array(
 	'ApiQueryQueryPage' => 'includes/api/ApiQueryQueryPage.php',
 	'ApiQueryRandom' => 'includes/api/ApiQueryRandom.php',
 	'ApiQueryRecentChanges' => 'includes/api/ApiQueryRecentChanges.php',
+	'ApiQueryFileRepoInfo' => 'includes/api/ApiQueryFileRepoInfo.php',
 	'ApiQueryRevisions' => 'includes/api/ApiQueryRevisions.php',
 	'ApiQuerySearch' => 'includes/api/ApiQuerySearch.php',
 	'ApiQuerySiteinfo' => 'includes/api/ApiQuerySiteinfo.php',
@@ -457,6 +452,13 @@ $wgAutoloadLocalClasses = array(
 	'TitleDependency' => 'includes/cache/CacheDependency.php',
 	'TitleListDependency' => 'includes/cache/CacheDependency.php',
 
+	# includes/changes
+	'ChangesList' => 'includes/changes/ChangesList.php',
+	'EnhancedChangesList' => 'includes/changes/EnhancedChangesList.php',
+	'OldChangesList' => 'includes/changes/OldChangesList.php',
+	'RCCacheEntry' => 'includes/changes/RCCacheEntry.php',
+	'RecentChange' => 'includes/changes/RecentChange.php',
+
 	# includes/clientpool
 	'RedisConnectionPool' => 'includes/clientpool/RedisConnectionPool.php',
 	'RedisConnRef' => 'includes/clientpool/RedisConnectionPool.php',
@@ -473,11 +475,13 @@ $wgAutoloadLocalClasses = array(
 
 	# includes/db
 	'Blob' => 'includes/db/DatabaseUtility.php',
-	'ChronologyProtector' => 'includes/db/LBFactory.php',
+	'ChronologyProtector' => 'includes/db/ChronologyProtector.php',
 	'CloneDatabase' => 'includes/db/CloneDatabase.php',
 	'DatabaseBase' => 'includes/db/Database.php',
 	'DatabaseMssql' => 'includes/db/DatabaseMssql.php',
 	'DatabaseMysql' => 'includes/db/DatabaseMysql.php',
+	'DatabaseMysqlBase' => 'includes/db/DatabaseMysqlBase.php',
+	'DatabaseMysqli' => 'includes/db/DatabaseMysqli.php',
 	'DatabaseOracle' => 'includes/db/DatabaseOracle.php',
 	'DatabasePostgres' => 'includes/db/DatabasePostgres.php',
 	'DatabaseSqlite' => 'includes/db/DatabaseSqlite.php',
@@ -485,8 +489,10 @@ $wgAutoloadLocalClasses = array(
 	'DatabaseType' => 'includes/db/Database.php',
 	'DBAccessError' => 'includes/db/LBFactory.php',
 	'DBConnectionError' => 'includes/db/DatabaseError.php',
+	'DBConnRef' => 'includes/db/LoadBalancer.php',
 	'DBError' => 'includes/db/DatabaseError.php',
 	'DBObject' => 'includes/db/DatabaseUtility.php',
+	'IDatabase'  => 'includes/db/Database.php',
 	'IORMRow' => 'includes/db/IORMRow.php',
 	'IORMTable' => 'includes/db/IORMTable.php',
 	'DBMasterPos' => 'includes/db/DatabaseUtility.php',
@@ -507,8 +513,8 @@ $wgAutoloadLocalClasses = array(
 	'LoadMonitor_Null' => 'includes/db/LoadMonitor.php',
 	'MssqlField' => 'includes/db/DatabaseMssql.php',
 	'MssqlResult' => 'includes/db/DatabaseMssql.php',
-	'MySQLField' => 'includes/db/DatabaseMysql.php',
-	'MySQLMasterPos' => 'includes/db/DatabaseMysql.php',
+	'MySQLField' => 'includes/db/DatabaseMysqlBase.php',
+	'MySQLMasterPos' => 'includes/db/DatabaseMysqlBase.php',
 	'ORAField' => 'includes/db/DatabaseOracle.php',
 	'ORAResult' => 'includes/db/DatabaseOracle.php',
 	'ORMIterator' => 'includes/db/ORMIterator.php',
@@ -543,14 +549,17 @@ $wgAutoloadLocalClasses = array(
 	'WikiDiff3' => 'includes/diff/WikiDiff3.php',
 	'WordLevelDiff' => 'includes/diff/DairikiDiff.php',
 
-	# includes/extauth
-	'ExternalUser_Hardcoded' => 'includes/extauth/Hardcoded.php',
-	'ExternalUser_MediaWiki' => 'includes/extauth/MediaWiki.php',
-	'ExternalUser_vB' => 'includes/extauth/vB.php',
+	# includes/externalstore
+	'ExternalStore' => 'includes/externalstore/ExternalStore.php',
+	'ExternalStoreDB' => 'includes/externalstore/ExternalStoreDB.php',
+	'ExternalStoreHttp' => 'includes/externalstore/ExternalStoreHttp.php',
+	'ExternalStoreMedium' => 'includes/externalstore/ExternalStoreMedium.php',
+	'ExternalStoreMwstore' => 'includes/externalstore/ExternalStoreMwstore.php',
 
 	# includes/filebackend
 	'FileBackendGroup' => 'includes/filebackend/FileBackendGroup.php',
 	'FileBackend' => 'includes/filebackend/FileBackend.php',
+	'FileBackendError' => 'includes/filebackend/FileBackend.php',
 	'FileBackendStore' => 'includes/filebackend/FileBackendStore.php',
 	'FileBackendStoreShardListIterator' => 'includes/filebackend/FileBackendStore.php',
 	'FileBackendStoreShardDirIterator' => 'includes/filebackend/FileBackendStore.php',
@@ -582,6 +591,7 @@ $wgAutoloadLocalClasses = array(
 	'QuorumLockManager' => 'includes/filebackend/lockmanager/QuorumLockManager.php',
 	'MySqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
 	'PostgreSqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
+	'RedisLockManager' => 'includes/filebackend/lockmanager/RedisLockManager.php',
 	'NullLockManager' => 'includes/filebackend/lockmanager/LockManager.php',
 	'FileOp' => 'includes/filebackend/FileOp.php',
 	'FileOpBatch' => 'includes/filebackend/FileOpBatch.php',
@@ -657,11 +667,15 @@ $wgAutoloadLocalClasses = array(
 	# includes/job
 	'Job' => 'includes/job/Job.php',
 	'JobQueue' => 'includes/job/JobQueue.php',
-	'JobQueueAggregator' => 'includes/job/JobQueueAggregator.php',
-	'JobQueueAggregatorMemc' => 'includes/job/JobQueueAggregatorMemc.php',
-	'JobQueueAggregatorRedis' => 'includes/job/JobQueueAggregatorRedis.php',
+	'JobQueueAggregator' => 'includes/job/aggregator/JobQueueAggregator.php',
+	'JobQueueAggregatorMemc' => 'includes/job/aggregator/JobQueueAggregatorMemc.php',
+	'JobQueueAggregatorRedis' => 'includes/job/aggregator/JobQueueAggregatorRedis.php',
 	'JobQueueDB' => 'includes/job/JobQueueDB.php',
+	'JobQueueConnectionError' => 'includes/job/JobQueue.php',
+	'JobQueueError' => 'includes/job/JobQueue.php',
 	'JobQueueGroup' => 'includes/job/JobQueueGroup.php',
+	'JobQueueFederated' => 'includes/job/JobQueueFederated.php',
+	'JobQueueRedis' => 'includes/job/JobQueueRedis.php',
 
 	# includes/job/jobs
 	'DoubleRedirectJob' => 'includes/job/jobs/DoubleRedirectJob.php',
@@ -678,8 +692,6 @@ $wgAutoloadLocalClasses = array(
 
 	# includes/json
 	'FormatJson' => 'includes/json/FormatJson.php',
-	'Services_JSON' => 'includes/json/Services_JSON.php',
-	'Services_JSON_Error' => 'includes/json/Services_JSON.php',
 
 	# includes/libs
 	'CSSJanus' => 'includes/libs/CSSJanus.php',
@@ -697,9 +709,16 @@ $wgAutoloadLocalClasses = array(
 	'JSToken' => 'includes/libs/jsminplus.php',
 	'JSTokenizer' => 'includes/libs/jsminplus.php',
 
+	# includes/libs/lessphp
+	'lessc' => 'includes/libs/lessc.inc.php',
+	'lessc_parser' => 'includes/libs/lessc.inc.php',
+	'lessc_formatter_classic' => 'includes/libs/lessc.inc.php',
+	'lessc_formatter_compressed' => 'includes/libs/lessc.inc.php',
+	'lessc_formatter_lessjs' => 'includes/libs/lessc.inc.php',
+
 	# includes/logging
 	'DatabaseLogEntry' => 'includes/logging/LogEntry.php',
-	'DeleteLogFormatter' => 'includes/logging/LogFormatter.php',
+	'DeleteLogFormatter' => 'includes/logging/DeleteLogFormatter.php',
 	'LegacyLogFormatter' => 'includes/logging/LogFormatter.php',
 	'LogEntry' => 'includes/logging/LogEntry.php',
 	'LogEventsList' => 'includes/logging/LogEventsList.php',
@@ -708,12 +727,22 @@ $wgAutoloadLocalClasses = array(
 	'LogPage' => 'includes/logging/LogPage.php',
 	'LogPager' => 'includes/logging/LogPager.php',
 	'ManualLogEntry' => 'includes/logging/LogEntry.php',
-	'MoveLogFormatter' => 'includes/logging/LogFormatter.php',
-	'NewUsersLogFormatter' => 'includes/logging/LogFormatter.php',
+	'MoveLogFormatter' => 'includes/logging/MoveLogFormatter.php',
+	'NewUsersLogFormatter' => 'includes/logging/NewUsersLogFormatter.php',
 	'PatrolLog' => 'includes/logging/PatrolLog.php',
-	'PatrolLogFormatter' => 'includes/logging/LogFormatter.php',
+	'PatrolLogFormatter' => 'includes/logging/PatrolLogFormatter.php',
 	'RCDatabaseLogEntry' => 'includes/logging/LogEntry.php',
-	'RightsLogFormatter' => 'includes/logging/LogFormatter.php',
+	'RightsLogFormatter' => 'includes/logging/RightsLogFormatter.php',
+
+	# Image gallery
+
+	'ImageGallery' => 'includes/gallery/TraditionalImageGallery.php',
+	'ImageGalleryBase' => 'includes/gallery/ImageGalleryBase.php',
+	'NolinesImageGallery' => 'includes/gallery/NolinesImageGallery.php',
+	'TraditionalImageGallery' => 'includes/gallery/TraditionalImageGallery.php',
+	'PackedImageGallery' => 'includes/gallery/PackedImageGallery.php',
+	'PackedHoverImageGallery' => 'includes/gallery/PackedOverlayImageGallery.php',
+	'PackedOverlayImageGallery' => 'includes/gallery/PackedOverlayImageGallery.php',
 
 	# includes/media
 	'BitmapHandler' => 'includes/media/Bitmap.php',
@@ -775,12 +804,10 @@ $wgAutoloadLocalClasses = array(
 
 	# includes/parser
 	'CacheTime' => 'includes/parser/CacheTime.php',
-	'CoreLinkFunctions' => 'includes/parser/CoreLinkFunctions.php',
 	'CoreParserFunctions' => 'includes/parser/CoreParserFunctions.php',
 	'CoreTagHooks' => 'includes/parser/CoreTagHooks.php',
 	'DateFormatter' => 'includes/parser/DateFormatter.php',
 	'LinkHolderArray' => 'includes/parser/LinkHolderArray.php',
-	'LinkMarkerReplacer' => 'includes/parser/Parser_LinkHooks.php',
 	'MWTidy' => 'includes/parser/Tidy.php',
 	'MWTidyWrapper' => 'includes/parser/Tidy.php',
 	'PPCustomFrame_DOM' => 'includes/parser/Preprocessor_DOM.php',
@@ -808,7 +835,6 @@ $wgAutoloadLocalClasses = array(
 	'ParserOptions' => 'includes/parser/ParserOptions.php',
 	'ParserOutput' => 'includes/parser/ParserOutput.php',
 	'Parser_DiffTest' => 'includes/parser/Parser_DiffTest.php',
-	'Parser_LinkHooks' => 'includes/parser/Parser_LinkHooks.php',
 	'Preprocessor' => 'includes/parser/Preprocessor.php',
 	'Preprocessor_DOM' => 'includes/parser/Preprocessor_DOM.php',
 	'Preprocessor_Hash' => 'includes/parser/Preprocessor_Hash.php',
@@ -821,12 +847,22 @@ $wgAutoloadLocalClasses = array(
 	'ProfilerSimpleTrace' => 'includes/profiler/ProfilerSimpleTrace.php',
 	'ProfilerSimpleUDP' => 'includes/profiler/ProfilerSimpleUDP.php',
 	'ProfilerStub' => 'includes/profiler/ProfilerStub.php',
+	'ProfileSection' => 'includes/profiler/Profiler.php',
+
+	# includes/rcfeed
+	'RCFeedEngine' => 'includes/rcfeed/RCFeedEngine.php',
+	'RedisPubSubFeedEngine' => 'includes/rcfeed/RedisPubSubFeedEngine.php',
+	'UDPRCFeedEngine' => 'includes/rcfeed/UDPRCFeedEngine.php',
+	'RCFeedFormatter' => 'includes/rcfeed/RCFeedFormatter.php',
+	'IRCColourfulRCFeedFormatter' => 'includes/rcfeed/IRCColourfulRCFeedFormatter.php',
+	'JSONRCFeedFormatter' => 'includes/rcfeed/JSONRCFeedFormatter.php',
 
 	# includes/resourceloader
 	'ResourceLoader' => 'includes/resourceloader/ResourceLoader.php',
 	'ResourceLoaderContext' => 'includes/resourceloader/ResourceLoaderContext.php',
 	'ResourceLoaderFileModule' => 'includes/resourceloader/ResourceLoaderFileModule.php',
 	'ResourceLoaderFilePageModule' => 'includes/resourceloader/ResourceLoaderFilePageModule.php',
+	'ResourceLoaderLESSFunctions' => 'includes/resourceloader/ResourceLoaderLESSFunctions.php',
 	'ResourceLoaderModule' => 'includes/resourceloader/ResourceLoaderModule.php',
 	'ResourceLoaderNoscriptModule' => 'includes/resourceloader/ResourceLoaderNoscriptModule.php',
 	'ResourceLoaderSiteModule' => 'includes/resourceloader/ResourceLoaderSiteModule.php',
@@ -874,7 +910,6 @@ $wgAutoloadLocalClasses = array(
 	'SearchResultTooMany' => 'includes/search/SearchEngine.php',
 	'SearchSqlite' => 'includes/search/SearchSqlite.php',
 	'SearchUpdate' => 'includes/search/SearchUpdate.php',
-	'SearchUpdateMyISAM' => 'includes/search/SearchUpdate.php',
 	'SqliteSearchResultSet' => 'includes/search/SearchSqlite.php',
 	'SqlSearchResultSet' => 'includes/search/SearchEngine.php',
 
@@ -899,7 +934,6 @@ $wgAutoloadLocalClasses = array(
 	'DeadendPagesPage' => 'includes/specials/SpecialDeadendpages.php',
 	'DeletedContribsPager' => 'includes/specials/SpecialDeletedContributions.php',
 	'DeletedContributionsPage' => 'includes/specials/SpecialDeletedContributions.php',
-	'DisambiguationsPage' => 'includes/specials/SpecialDisambiguations.php',
 	'DoubleRedirectsPage' => 'includes/specials/SpecialDoubleRedirects.php',
 	'EditWatchlistCheckboxSeriesField' => 'includes/specials/SpecialEditWatchlist.php',
 	'EditWatchlistNormalHTMLForm' => 'includes/specials/SpecialEditWatchlist.php',
@@ -940,7 +974,6 @@ $wgAutoloadLocalClasses = array(
 	'SpecialBlankpage' => 'includes/specials/SpecialBlankpage.php',
 	'SpecialBlock' => 'includes/specials/SpecialBlock.php',
 	'SpecialBlockList' => 'includes/specials/SpecialBlockList.php',
-	'SpecialBlockme' => 'includes/specials/SpecialBlockme.php',
 	'SpecialBookSources' => 'includes/specials/SpecialBooksources.php',
 	'SpecialCachedPage' => 'includes/specials/SpecialCachedPage.php',
 	'SpecialCategories' => 'includes/specials/SpecialCategories.php',
@@ -969,9 +1002,12 @@ $wgAutoloadLocalClasses = array(
 	'SpecialPrefixindex' => 'includes/specials/SpecialPrefixindex.php',
 	'SpecialProtectedpages' => 'includes/specials/SpecialProtectedpages.php',
 	'SpecialProtectedtitles' => 'includes/specials/SpecialProtectedtitles.php',
+	'SpecialRandomInCategory' => 'includes/specials/SpecialRandomInCategory.php',
 	'SpecialRandomredirect' => 'includes/specials/SpecialRandomredirect.php',
 	'SpecialRecentChanges' => 'includes/specials/SpecialRecentchanges.php',
 	'SpecialRecentchangeslinked' => 'includes/specials/SpecialRecentchangeslinked.php',
+	'SpecialRedirect' => 'includes/specials/SpecialRedirect.php',
+	'SpecialResetTokens' => 'includes/specials/SpecialResetTokens.php',
 	'SpecialRevisionDelete' => 'includes/specials/SpecialRevisiondelete.php',
 	'SpecialSearch' => 'includes/specials/SpecialSearch.php',
 	'SpecialSpecialpages' => 'includes/specials/SpecialSpecialpages.php',
@@ -1021,6 +1057,7 @@ $wgAutoloadLocalClasses = array(
 	'UploadFromUrl' => 'includes/upload/UploadFromUrl.php',
 	'UploadStash' => 'includes/upload/UploadStash.php',
 	'UploadStashBadPathException' => 'includes/upload/UploadStash.php',
+	'UploadStashException' => 'includes/upload/UploadStash.php',
 	'UploadStashFile' => 'includes/upload/UploadStash.php',
 	'UploadStashFileException' => 'includes/upload/UploadStash.php',
 	'UploadStashFileNotFoundException' => 'includes/upload/UploadStash.php',
@@ -1091,17 +1128,10 @@ $wgAutoloadLocalClasses = array(
 	'CologneBlueTemplate' => 'skins/CologneBlue.php',
 	'ModernTemplate' => 'skins/Modern.php',
 	'MonoBookTemplate' => 'skins/MonoBook.php',
-	'NostalgiaTemplate' => 'skins/Nostalgia.php',
-	'SkinChick' => 'skins/Chick.php',
 	'SkinCologneBlue' => 'skins/CologneBlue.php',
 	'SkinModern' => 'skins/Modern.php',
 	'SkinMonoBook' => 'skins/MonoBook.php',
-	'SkinMySkin' => 'skins/MySkin.php',
-	'SkinNostalgia' => 'skins/Nostalgia.php',
-	'SkinSimple' => 'skins/Simple.php',
-	'SkinStandard' => 'skins/Standard.php',
 	'SkinVector' => 'skins/Vector.php',
-	'StandardTemplate' => 'skins/Standard.php',
 	'VectorTemplate' => 'skins/Vector.php',
 );
 
@@ -1117,12 +1147,13 @@ class AutoLoader {
 	static function autoload( $className ) {
 		global $wgAutoloadClasses, $wgAutoloadLocalClasses;
 
-		// Workaround for PHP bug <https://bugs.php.net/bug.php?id=49143> (5.3.2. is broken, it's fixed in 5.3.6).
-		// Strip leading backslashes from class names. When namespaces are used, leading backslashes are used to indicate
-		// the top-level namespace, e.g. \foo\Bar. When used like this in the code, the leading backslash isn't passed to
-		// the auto-loader ($className would be 'foo\Bar'). However, if a class is accessed using a string instead of a
-		// class literal (e.g. $class = '\foo\Bar'; new $class()), then some versions of PHP do not strip the leading
-		// backlash in this case, causing autoloading to fail.
+		// Workaround for PHP bug <https://bugs.php.net/bug.php?id=49143> (5.3.2. is broken, it's
+		// fixed in 5.3.6). Strip leading backslashes from class names. When namespaces are used,
+		// leading backslashes are used to indicate the top-level namespace, e.g. \foo\Bar. When
+		// used like this in the code, the leading backslash isn't passed to the auto-loader
+		// ($className would be 'foo\Bar'). However, if a class is accessed using a string instead
+		// of a class literal (e.g. $class = '\foo\Bar'; new $class()), then some versions of PHP
+		// do not strip the leading backlash in this case, causing autoloading to fail.
 		$className = ltrim( $className, '\\' );
 
 		if ( isset( $wgAutoloadLocalClasses[$className] ) ) {
@@ -1157,7 +1188,7 @@ class AutoLoader {
 			$filename = "$IP/$filename";
 		}
 
-		require( $filename );
+		require $filename;
 
 		return true;
 	}
@@ -1175,12 +1206,4 @@ class AutoLoader {
 	}
 }
 
-if ( function_exists( 'spl_autoload_register' ) ) {
-	spl_autoload_register( array( 'AutoLoader', 'autoload' ) );
-} else {
-	function __autoload( $class ) {
-		AutoLoader::autoload( $class );
-	}
-
-	ini_set( 'unserialize_callback_func', '__autoload' );
-}
+spl_autoload_register( array( 'AutoLoader', 'autoload' ) );
diff --git a/includes/Autopromote.php b/includes/Autopromote.php
index 604b9248..170d7abf 100644
--- a/includes/Autopromote.php
+++ b/includes/Autopromote.php
@@ -126,7 +126,8 @@ class Autopromote {
 				return false;
 			} elseif ( $cond[0] == '^' ) { // XOR (exactly one cond passes)
 				if ( count( $cond ) > 3 ) {
-					wfWarn( 'recCheckCondition() given XOR ("^") condition on three or more conditions. Check your $wgAutopromote and $wgAutopromoteOnce settings.' );
+					wfWarn( 'recCheckCondition() given XOR ("^") condition on three or more conditions.' .
+						' Check your $wgAutopromote and $wgAutopromoteOnce settings.' );
 				}
 				return self::recCheckCondition( $cond[1], $user )
 					xor self::recCheckCondition( $cond[2], $user );
@@ -165,7 +166,7 @@ class Autopromote {
 			return false;
 		}
 
-		switch( $cond[0] ) {
+		switch ( $cond[0] ) {
 			case APCOND_EMAILCONFIRMED:
 				if ( Sanitizer::validateEmail( $user->getEmail() ) ) {
 					if ( $wgEmailAuthentication ) {
diff --git a/includes/Block.php b/includes/Block.php
index 7ee36ce9..34b89e73 100644
--- a/includes/Block.php
+++ b/includes/Block.php
@@ -65,11 +65,11 @@ class Block {
 		$timestamp = 0, $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0, $enableAutoblock = 0,
 		$hideName = 0, $blockEmail = 0, $allowUsertalk = 0, $byText = '' )
 	{
-		if( $timestamp === 0 ) {
+		if ( $timestamp === 0 ) {
 			$timestamp = wfTimestampNow();
 		}
 
-		if( count( func_get_args() ) > 0 ) {
+		if ( count( func_get_args() ) > 0 ) {
 			# Soon... :D
 			# wfDeprecated( __METHOD__ . " with arguments" );
 		}
@@ -206,16 +206,16 @@ class Block {
 	 */
 	public function load( $address = '', $user = 0 ) {
 		wfDeprecated( __METHOD__, '1.18' );
-		if( $user ) {
+		if ( $user ) {
 			$username = User::whoIs( $user );
 			$block = self::newFromTarget( $username, $address );
 		} else {
 			$block = self::newFromTarget( null, $address );
 		}
 
-		if( $block instanceof Block ) {
+		if ( $block instanceof Block ) {
 			# This is mildly evil, but hey, it's B/C :D
-			foreach( $block as $variable => $value ) {
+			foreach ( $block as $variable => $value ) {
 				$this->$variable = $value;
 			}
 			return true;
@@ -237,7 +237,7 @@ class Block {
 	protected function newLoad( $vagueTarget = null ) {
 		$db = wfGetDB( $this->mFromMaster ? DB_MASTER : DB_SLAVE );
 
-		if( $this->type !== null ) {
+		if ( $this->type !== null ) {
 			$conds = array(
 				'ipb_address' => array( (string)$this->target ),
 			);
@@ -247,9 +247,9 @@ class Block {
 
 		# Be aware that the != '' check is explicit, since empty values will be
 		# passed by some callers (bug 29116)
-		if( $vagueTarget != '' ) {
+		if ( $vagueTarget != '' ) {
 			list( $target, $type ) = self::parseTarget( $vagueTarget );
-			switch( $type ) {
+			switch ( $type ) {
 				case self::TYPE_USER:
 					# Slightly weird, but who are we to argue?
 					$conds['ipb_address'][] = (string)$target;
@@ -285,20 +285,20 @@ class Block {
 		# This is begging for $this = $bestBlock, but that's not allowed in PHP :(
 		$bestBlockPreventsEdit = null;
 
-		foreach( $res as $row ) {
+		foreach ( $res as $row ) {
 			$block = self::newFromRow( $row );
 
 			# Don't use expired blocks
-			if( $block->deleteIfExpired() ) {
+			if ( $block->deleteIfExpired() ) {
 				continue;
 			}
 
 			# Don't use anon only blocks on users
-			if( $this->type == self::TYPE_USER && !$block->isHardblock() ) {
+			if ( $this->type == self::TYPE_USER && !$block->isHardblock() ) {
 				continue;
 			}
 
-			if( $block->getType() == self::TYPE_RANGE ) {
+			if ( $block->getType() == self::TYPE_RANGE ) {
 				# This is the number of bits that are allowed to vary in the block, give
 				# or take some floating point errors
 				$end = wfBaseconvert( $block->getRangeEnd(), 16, 10 );
@@ -313,14 +313,14 @@ class Block {
 				$score = $block->getType();
 			}
 
-			if( $score < $bestBlockScore ) {
+			if ( $score < $bestBlockScore ) {
 				$bestBlockScore = $score;
 				$bestRow = $row;
 				$bestBlockPreventsEdit = $block->prevents( 'edit' );
 			}
 		}
 
-		if( $bestRow !== null ) {
+		if ( $bestRow !== null ) {
 			$this->initFromRow( $bestRow );
 			$this->prevents( 'edit', $bestBlockPreventsEdit );
 			return true;
@@ -511,7 +511,7 @@ class Block {
 	 * @return Array
 	 */
 	protected function getDatabaseArray( $db = null ) {
-		if( !$db ) {
+		if ( !$db ) {
 			$db = wfGetDB( DB_SLAVE );
 		}
 		$expiry = $db->encodeExpiry( $this->mExpiry );
@@ -579,7 +579,7 @@ class Block {
 		global $wgPutIPinRC;
 
 		// No IPs are in recentchanges table, so nothing to select
-		if( !$wgPutIPinRC ) {
+		if ( !$wgPutIPinRC ) {
 			return;
 		}
 
@@ -601,7 +601,9 @@ class Block {
 			foreach ( $res as $row ) {
 				if ( $row->rc_ip ) {
 					$id = $block->doAutoblock( $row->rc_ip );
-					if ( $id ) $blockIds[] = $id;
+					if ( $id ) {
+						$blockIds[] = $id;
+					}
 				}
 			}
 		}
@@ -681,7 +683,7 @@ class Block {
 		if ( $ipblock ) {
 			# Check if the block is an autoblock and would exceed the user block
 			# if renewed. If so, do nothing, otherwise prolong the block time...
-			if ( $ipblock->mAuto && // @TODO: why not compare $ipblock->mExpiry?
+			if ( $ipblock->mAuto && // @todo Why not compare $ipblock->mExpiry?
 				$this->mExpiry > Block::getAutoblockExpiry( $ipblock->mTimestamp )
 			) {
 				# Reset block timestamp to now and its expiry to
@@ -793,7 +795,7 @@ class Block {
 	 * @return String IP in Hex form
 	 */
 	public function getRangeStart() {
-		switch( $this->type ) {
+		switch ( $this->type ) {
 			case self::TYPE_USER:
 				return '';
 			case self::TYPE_IP:
@@ -801,17 +803,18 @@ class Block {
 			case self::TYPE_RANGE:
 				list( $start, /*...*/ ) = IP::parseRange( $this->target );
 				return $start;
-			default: throw new MWException( "Block with invalid type" );
+			default:
+				throw new MWException( "Block with invalid type" );
 		}
 	}
 
 	/**
-	 * Get the IP address at the start of the range in Hex form
+	 * Get the IP address at the end of the range in Hex form
 	 * @throws MWException
 	 * @return String IP in Hex form
 	 */
 	public function getRangeEnd() {
-		switch( $this->type ) {
+		switch ( $this->type ) {
 			case self::TYPE_USER:
 				return '';
 			case self::TYPE_IP:
@@ -819,7 +822,8 @@ class Block {
 			case self::TYPE_RANGE:
 				list( /*...*/, $end ) = IP::parseRange( $this->target );
 				return $end;
-			default: throw new MWException( "Block with invalid type" );
+			default:
+				throw new MWException( "Block with invalid type" );
 		}
 	}
 
@@ -907,7 +911,7 @@ class Block {
 	 * @return Bool
 	 */
 	public function prevents( $action, $x = null ) {
-		switch( $action ) {
+		switch ( $action ) {
 			case 'edit':
 				# For now... <evil laugh>
 				return true;
@@ -997,11 +1001,16 @@ class Block {
 	 * Purge expired blocks from the ipblocks table
 	 */
 	public static function purgeExpired() {
-		if ( !wfReadOnly() ) {
-			$dbw = wfGetDB( DB_MASTER );
-			$dbw->delete( 'ipblocks',
-				array( 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), __METHOD__ );
+		if ( wfReadOnly() ) {
+			return;
 		}
+
+		$method = __METHOD__;
+		$dbw = wfGetDB( DB_MASTER );
+		$dbw->onTransactionIdle( function() use ( $dbw, $method ) {
+			$dbw->delete( 'ipblocks',
+				array( 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), $method );
+		} );
 	}
 
 	/**
@@ -1050,30 +1059,216 @@ class Block {
 	public static function newFromTarget( $specificTarget, $vagueTarget = null, $fromMaster = false ) {
 
 		list( $target, $type ) = self::parseTarget( $specificTarget );
-		if( $type == Block::TYPE_ID || $type == Block::TYPE_AUTO ) {
+		if ( $type == Block::TYPE_ID || $type == Block::TYPE_AUTO ) {
 			return Block::newFromID( $target );
 
-		} elseif( $target === null && $vagueTarget == '' ) {
+		} elseif ( $target === null && $vagueTarget == '' ) {
 			# We're not going to find anything useful here
 			# Be aware that the == '' check is explicit, since empty values will be
 			# passed by some callers (bug 29116)
 			return null;
 
-		} elseif( in_array( $type, array( Block::TYPE_USER, Block::TYPE_IP, Block::TYPE_RANGE, null ) ) ) {
+		} elseif ( in_array( $type, array( Block::TYPE_USER, Block::TYPE_IP, Block::TYPE_RANGE, null ) ) ) {
 			$block = new Block();
 			$block->fromMaster( $fromMaster );
 
-			if( $type !== null ) {
+			if ( $type !== null ) {
 				$block->setTarget( $target );
 			}
 
-			if( $block->newLoad( $vagueTarget ) ) {
+			if ( $block->newLoad( $vagueTarget ) ) {
 				return $block;
 			}
 		}
 		return null;
 	}
 
+
+	/**
+	 * Get all blocks that match any IP from an array of IP addresses
+	 *
+	 * @param Array $ipChain list of IPs (strings), usually retrieved from the
+	 *	   X-Forwarded-For header of the request
+	 * @param Bool $isAnon Exclude anonymous-only blocks if false
+	 * @param Bool $fromMaster Whether to query the master or slave database
+	 * @return Array of Blocks
+	 * @since 1.22
+	 */
+	public static function getBlocksForIPList( array $ipChain, $isAnon, $fromMaster = false ) {
+		if ( !count( $ipChain ) ) {
+			return array();
+		}
+
+		wfProfileIn( __METHOD__ );
+		$conds = array();
+		foreach ( array_unique( $ipChain ) as $ipaddr ) {
+			# Discard invalid IP addresses. Since XFF can be spoofed and we do not
+			# necessarily trust the header given to us, make sure that we are only
+			# checking for blocks on well-formatted IP addresses (IPv4 and IPv6).
+			# Do not treat private IP spaces as special as it may be desirable for wikis
+			# to block those IP ranges in order to stop misbehaving proxies that spoof XFF.
+			if ( !IP::isValid( $ipaddr ) ) {
+				continue;
+			}
+			# Don't check trusted IPs (includes local squids which will be in every request)
+			if ( wfIsTrustedProxy( $ipaddr ) ) {
+				continue;
+			}
+			# Check both the original IP (to check against single blocks), as well as build
+			# the clause to check for rangeblocks for the given IP.
+			$conds['ipb_address'][] = $ipaddr;
+			$conds[] = self::getRangeCond( IP::toHex( $ipaddr ) );
+		}
+
+		if ( !count( $conds ) ) {
+			wfProfileOut( __METHOD__ );
+			return array();
+		}
+
+		if ( $fromMaster ) {
+			$db = wfGetDB( DB_MASTER );
+		} else {
+			$db = wfGetDB( DB_SLAVE );
+		}
+		$conds = $db->makeList( $conds, LIST_OR );
+		if ( !$isAnon ) {
+			$conds = array( $conds, 'ipb_anon_only' => 0 );
+		}
+		$selectFields = array_merge(
+			array( 'ipb_range_start', 'ipb_range_end' ),
+			Block::selectFields()
+		);
+		$rows = $db->select( 'ipblocks',
+			$selectFields,
+			$conds,
+			__METHOD__
+		);
+
+		$blocks = array();
+		foreach ( $rows as $row ) {
+			$block = self::newFromRow( $row );
+			if ( !$block->deleteIfExpired()  ) {
+				$blocks[] = $block;
+			}
+		}
+
+		wfProfileOut( __METHOD__ );
+		return $blocks;
+	}
+
+	/**
+	 * From a list of multiple blocks, find the most exact and strongest Block.
+	 * The logic for finding the "best" block is:
+	 *  - Blocks that match the block's target IP are preferred over ones in a range
+	 *  - Hardblocks are chosen over softblocks that prevent account creation
+	 *  - Softblocks that prevent account creation are chosen over other softblocks
+	 *  - Other softblocks are chosen over autoblocks
+	 *  - If there are multiple exact or range blocks at the same level, the one chosen
+	 *    is random
+
+	 * @param Array $ipChain list of IPs (strings). This is used to determine how "close"
+	 * 	  a block is to the server, and if a block matches exactly, or is in a range.
+	 *	  The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
+	 *	  local-squid, ...)
+	 * @param Array $block Array of blocks
+	 * @return Block|null the "best" block from the list
+	 */
+	public static function chooseBlock( array $blocks, array $ipChain ) {
+		if ( !count( $blocks ) ) {
+			return null;
+		} elseif ( count( $blocks ) == 1 ) {
+			return $blocks[0];
+		}
+
+		wfProfileIn( __METHOD__ );
+
+		// Sort hard blocks before soft ones and secondarily sort blocks
+		// that disable account creation before those that don't.
+		usort( $blocks, function( Block $a, Block $b ) {
+			$aWeight = (int)$a->isHardblock() . (int)$a->prevents( 'createaccount' );
+			$bWeight = (int)$b->isHardblock() . (int)$b->prevents( 'createaccount' );
+			return strcmp( $bWeight, $aWeight ); // highest weight first
+		} );
+
+		$blocksListExact = array(
+			'hard' => false,
+			'disable_create' => false,
+			'other' => false,
+			'auto' => false
+		);
+		$blocksListRange = array(
+			'hard' => false,
+			'disable_create' => false,
+			'other' => false,
+			'auto' => false
+		);
+		$ipChain = array_reverse( $ipChain );
+
+		foreach ( $blocks as $block ) {
+			// Stop searching if we have already have a "better" block. This
+			// is why the order of the blocks matters
+			if ( !$block->isHardblock() && $blocksListExact['hard'] ) {
+				break;
+			} elseif ( !$block->prevents( 'createaccount' ) && $blocksListExact['disable_create'] ) {
+				break;
+			}
+
+			foreach ( $ipChain as $checkip ) {
+				$checkipHex = IP::toHex( $checkip );
+				if ( (string)$block->getTarget() === $checkip ) {
+					if ( $block->isHardblock() ) {
+						$blocksListExact['hard'] = $blocksListExact['hard'] ?: $block;
+					} elseif ( $block->prevents( 'createaccount' ) ) {
+						$blocksListExact['disable_create'] = $blocksListExact['disable_create'] ?: $block;
+					} elseif ( $block->mAuto ) {
+						$blocksListExact['auto'] = $blocksListExact['auto'] ?: $block;
+					} else {
+						$blocksListExact['other'] = $blocksListExact['other'] ?: $block;
+					}
+					// We found closest exact match in the ip list, so go to the next Block
+					break;
+				} elseif ( array_filter( $blocksListExact ) == array()
+					&& $block->getRangeStart() <= $checkipHex
+					&& $block->getRangeEnd() >= $checkipHex
+				) {
+					if ( $block->isHardblock() ) {
+						$blocksListRange['hard'] = $blocksListRange['hard'] ?: $block;
+					} elseif ( $block->prevents( 'createaccount' ) ) {
+						$blocksListRange['disable_create'] = $blocksListRange['disable_create'] ?: $block;
+					} elseif ( $block->mAuto ) {
+						$blocksListRange['auto'] = $blocksListRange['auto'] ?: $block;
+					} else {
+						$blocksListRange['other'] = $blocksListRange['other'] ?: $block;
+					}
+					break;
+				}
+			}
+		}
+
+		if ( array_filter( $blocksListExact ) == array() ) {
+			$blocksList = &$blocksListRange;
+		} else {
+			$blocksList = &$blocksListExact;
+		}
+
+		$chosenBlock = null;
+		if ( $blocksList['hard'] ) {
+			$chosenBlock = $blocksList['hard'];
+		} elseif ( $blocksList['disable_create'] ) {
+			$chosenBlock = $blocksList['disable_create'];
+		} elseif ( $blocksList['other'] ) {
+			$chosenBlock = $blocksList['other'];
+		} elseif ( $blocksList['auto'] ) {
+			$chosenBlock = $blocksList['auto'];
+		} else {
+			wfProfileOut( __METHOD__ );
+			throw new MWException( "Proxy block found, but couldn't be classified." );
+		}
+
+		wfProfileOut( __METHOD__ );
+		return $chosenBlock;
+	}
+
 	/**
 	 * From an existing Block, get the target and the type of target.
 	 * Note that, except for null, it is always safe to treat the target
@@ -1085,13 +1280,13 @@ class Block {
 	 */
 	public static function parseTarget( $target ) {
 		# We may have been through this before
-		if( $target instanceof User ) {
-			if( IP::isValid( $target->getName() ) ) {
+		if ( $target instanceof User ) {
+			if ( IP::isValid( $target->getName() ) ) {
 				return array( $target, self::TYPE_IP );
 			} else {
 				return array( $target, self::TYPE_USER );
 			}
-		} elseif( $target === null ) {
+		} elseif ( $target === null ) {
 			return array( null, null );
 		}
 
@@ -1112,7 +1307,7 @@ class Block {
 
 		# Consider the possibility that this is not a username at all
 		# but actually an old subpage (bug #29797)
-		if( strpos( $target, '/' ) !== false ) {
+		if ( strpos( $target, '/' ) !== false ) {
 			# An old subpage, drill down to the user behind it
 			$parts = explode( '/', $target );
 			$target = $parts[0];
@@ -1198,4 +1393,43 @@ class Block {
 	public function setBlocker( $user ) {
 		$this->blocker = $user;
 	}
+
+	/**
+	 * Get the key and parameters for the corresponding error message.
+	 *
+	 * @since 1.22
+	 * @param IContextSource $context
+	 * @return array
+	 */
+	public function getPermissionsError( IContextSource $context ) {
+		$blocker = $this->getBlocker();
+		if ( $blocker instanceof User ) { // local user
+			$blockerUserpage = $blocker->getUserPage();
+			$link = "[[{$blockerUserpage->getPrefixedText()}|{$blockerUserpage->getText()}]]";
+		} else { // foreign user
+			$link = $blocker;
+		}
+
+		$reason = $this->mReason;
+		if ( $reason == '' ) {
+			$reason = $context->msg( 'blockednoreason' )->text();
+		}
+
+		/* $ip returns who *is* being blocked, $intended contains who was meant to be blocked.
+		 * This could be a username, an IP range, or a single IP. */
+		$intended = $this->getTarget();
+
+		$lang = $context->getLanguage();
+		return array(
+			$this->mAuto ? 'autoblockedtext' : 'blockedtext',
+			$link,
+			$reason,
+			$context->getRequest()->getIP(),
+			$this->getByName(),
+			$this->getId(),
+			$lang->formatExpiry( $this->mExpiry ),
+			(string)$intended,
+			$lang->timeanddate( wfTimestamp( TS_MW, $this->mTimestamp ), true ),
+		);
+	}
 }
diff --git a/includes/CallableUpdate.php b/includes/CallableUpdate.php
new file mode 100644
index 00000000..6eb55413
--- /dev/null
+++ b/includes/CallableUpdate.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * Deferrable Update for closure/callback
+ */
+class MWCallableUpdate implements DeferrableUpdate {
+
+	/**
+	 * @var closure/callabck
+	 */
+	private $callback;
+
+	/**
+	 * @param callable $callback
+	 */
+	public function __construct( $callback ) {
+		if ( !is_callable( $callback ) ) {
+			throw new MWException( 'Not a valid callback/closure!' );
+		}
+		$this->callback = $callback;
+	}
+
+	/**
+	 * Run the update
+	 */
+	public function doUpdate() {
+		call_user_func( $this->callback );
+	}
+
+}
diff --git a/includes/Category.php b/includes/Category.php
index 868d6c46..126b8fee 100644
--- a/includes/Category.php
+++ b/includes/Category.php
@@ -40,7 +40,8 @@ class Category {
 	/** Counts of membership (cat_pages, cat_subcats, cat_files) */
 	private $mPages = null, $mSubcats = null, $mFiles = null;
 
-	private function __construct() { }
+	private function __construct() {
+	}
 
 	/**
 	 * Set up all member variables using a database query.
diff --git a/includes/CategoryPage.php b/includes/CategoryPage.php
index 43ab4dbd..ba71aa01 100644
--- a/includes/CategoryPage.php
+++ b/includes/CategoryPage.php
@@ -106,7 +106,13 @@ class CategoryPage extends Article {
 		unset( $reqArray["from"] );
 		unset( $reqArray["to"] );
 
-		$viewer = new $this->mCategoryViewerClass( $this->getContext()->getTitle(), $this->getContext(), $from, $until, $reqArray );
+		$viewer = new $this->mCategoryViewerClass(
+			$this->getContext()->getTitle(),
+			$this->getContext(),
+			$from,
+			$until,
+			$reqArray
+		);
 		$this->getContext()->getOutput()->addHTML( $viewer->getHTML() );
 	}
 }
diff --git a/includes/CategoryViewer.php b/includes/CategoryViewer.php
index 970adb53..55d9c1e5 100644
--- a/includes/CategoryViewer.php
+++ b/includes/CategoryViewer.php
@@ -141,8 +141,17 @@ class CategoryViewer extends ContextSource {
 		$this->children = array();
 		$this->children_start_char = array();
 		if ( $this->showGallery ) {
-			$this->gallery = new ImageGallery();
+			// Note that null for mode is taken to mean use default.
+			$mode = $this->getRequest()->getVal( 'gallerymode', null );
+			try {
+				$this->gallery = ImageGalleryBase::factory( $mode );
+			} catch ( MWException $e ) {
+				// User specified something invalid, fallback to default.
+				$this->gallery = ImageGalleryBase::factory();
+			}
+
 			$this->gallery->setHideBadImages();
+			$this->gallery->setContext( $this->getContext() );
 		} else {
 			$this->imgsNoGallery = array();
 			$this->imgsNoGallery_start_char = array();
@@ -526,7 +535,10 @@ class CategoryViewer extends ContextSource {
 
 			$first = true;
 			foreach ( $colContents as $char => $articles ) {
-				$ret .= '<h3>' . htmlspecialchars( $char );
+				# Change space to non-breaking space to keep headers aligned
+				$h3char = $char === ' ' ? '&#160;' : htmlspecialchars( $char );
+
+				$ret .= '<h3>' . $h3char;
 				if ( $first && $char === $prevchar ) {
 					# We're continuing a previous chunk at the top of a new
 					# column, so add " cont." after the letter.
@@ -645,28 +657,23 @@ class CategoryViewer extends ContextSource {
 	 * returned?  This function says what. Each type is considered independently
 	 * of the other types.
 	 *
-	 * Note for grepping: uses the messages category-article-count,
-	 * category-article-count-limited, category-subcat-count,
-	 * category-subcat-count-limited, category-file-count,
-	 * category-file-count-limited.
-	 *
 	 * @param int $rescnt The number of items returned by our database query.
 	 * @param int $dbcnt The number of items according to the category table.
 	 * @param string $type 'subcat', 'article', or 'file'
-	 * @return String: A message giving the number of items, to output to HTML.
+	 * @return string: A message giving the number of items, to output to HTML.
 	 */
 	private function getCountMessage( $rescnt, $dbcnt, $type ) {
-		# There are three cases:
-		#   1) The category table figure seems sane.  It might be wrong, but
-		#      we can't do anything about it if we don't recalculate it on ev-
-		#      ery category view.
-		#   2) The category table figure isn't sane, like it's smaller than the
-		#      number of actual results, *but* the number of results is less
-		#      than $this->limit and there's no offset.  In this case we still
-		#      know the right figure.
-		#   3) We have no idea.
-
-		# Check if there's a "from" or "until" for anything
+		// There are three cases:
+		//   1) The category table figure seems sane.  It might be wrong, but
+		//      we can't do anything about it if we don't recalculate it on ev-
+		//      ery category view.
+		//   2) The category table figure isn't sane, like it's smaller than the
+		//      number of actual results, *but* the number of results is less
+		//      than $this->limit and there's no offset.  In this case we still
+		//      know the right figure.
+		//   3) We have no idea.
+
+		// Check if there's a "from" or "until" for anything
 
 		// This is a little ugly, but we seem to use different names
 		// for the paging types then for the messages.
@@ -686,19 +693,22 @@ class CategoryViewer extends ContextSource {
 		if ( $dbcnt == $rescnt ||
 			( ( $rescnt == $this->limit || $fromOrUntil ) && $dbcnt > $rescnt )
 		) {
-			# Case 1: seems sane.
+			// Case 1: seems sane.
 			$totalcnt = $dbcnt;
 		} elseif ( $rescnt < $this->limit && !$fromOrUntil ) {
-			# Case 2: not sane, but salvageable.  Use the number of results.
-			# Since there are fewer than 200, we can also take this opportunity
-			# to refresh the incorrect category table entry -- which should be
-			# quick due to the small number of entries.
+			// Case 2: not sane, but salvageable.  Use the number of results.
+			// Since there are fewer than 200, we can also take this opportunity
+			// to refresh the incorrect category table entry -- which should be
+			// quick due to the small number of entries.
 			$totalcnt = $rescnt;
 			$this->cat->refreshCounts();
 		} else {
-			# Case 3: hopeless.  Don't give a total count at all.
+			// Case 3: hopeless.  Don't give a total count at all.
+			// Messages: category-subcat-count-limited, category-article-count-limited,
+			// category-file-count-limited
 			return $this->msg( "category-$type-count-limited" )->numParams( $rescnt )->parseAsBlock();
 		}
+		// Messages: category-subcat-count, category-article-count, category-file-count
 		return $this->msg( "category-$type-count" )->numParams( $rescnt, $totalcnt )->parseAsBlock();
 	}
 }
diff --git a/includes/Cdb.php b/includes/Cdb.php
index a142c7cb..81c0afe1 100644
--- a/includes/Cdb.php
+++ b/includes/Cdb.php
@@ -133,7 +133,7 @@ class CdbReader_DBA {
 	}
 
 	function close() {
-		if( isset( $this->handle ) ) {
+		if ( isset( $this->handle ) ) {
 			dba_close( $this->handle );
 		}
 		unset( $this->handle );
@@ -164,7 +164,7 @@ class CdbWriter_DBA {
 	}
 
 	function close() {
-		if( isset( $this->handle ) ) {
+		if ( isset( $this->handle ) ) {
 			dba_close( $this->handle );
 		}
 		if ( wfIsWindows() ) {
diff --git a/includes/Cdb_PHP.php b/includes/Cdb_PHP.php
index 71b55f87..a38b9a86 100644
--- a/includes/Cdb_PHP.php
+++ b/includes/Cdb_PHP.php
@@ -73,10 +73,10 @@ class CdbFunctions {
 	public static function hash( $s ) {
 		$h = 5381;
 		for ( $i = 0; $i < strlen( $s ); $i++ ) {
-			$h5 = ($h << 5) & 0xffffffff;
+			$h5 = ( $h << 5 ) & 0xffffffff;
 			// Do a 32-bit sum
 			// Inlined here for speed
-			$sum = ($h & 0x3fffffff) + ($h5 & 0x3fffffff);
+			$sum = ( $h & 0x3fffffff ) + ( $h5 & 0x3fffffff );
 			$h =
 				(
 					( $sum & 0x40000000 ? 1 : 0 )
@@ -138,7 +138,7 @@ class CdbReader_PHP extends CdbReader {
 	}
 
 	function close() {
-		if( isset( $this->handle ) ) {
+		if ( isset( $this->handle ) ) {
 			fclose( $this->handle );
 		}
 		unset( $this->handle );
@@ -332,7 +332,7 @@ class CdbWriter_PHP extends CdbWriter {
 	 */
 	public function close() {
 		$this->finish();
-		if( isset( $this->handle ) ) {
+		if ( isset( $this->handle ) ) {
 			fclose( $this->handle );
 		}
 		if ( wfIsWindows() && file_exists( $this->realFileName ) ) {
@@ -411,7 +411,7 @@ class CdbWriter_PHP extends CdbWriter {
 		// Calculate the number of items that will be in each hashtable
 		$counts = array_fill( 0, 256, 0 );
 		foreach ( $this->hplist as $item ) {
-			++ $counts[ 255 & $item['h'] ];
+			++ $counts[255 & $item['h']];
 		}
 
 		// Fill in $starts with the *end* indexes
@@ -450,9 +450,11 @@ class CdbWriter_PHP extends CdbWriter {
 				$hp = $packedTables[$starts[$i] + $u];
 				$where = CdbFunctions::unsignedMod(
 					CdbFunctions::unsignedShiftRight( $hp['h'], 8 ), $len );
-				while ( $hashtable[$where]['p'] )
-					if ( ++$where == $len )
+				while ( $hashtable[$where]['p'] ) {
+					if ( ++$where == $len ) {
 						$where = 0;
+					}
+				}
 				$hashtable[$where] = $hp;
 			}
 
diff --git a/includes/ChangeTags.php b/includes/ChangeTags.php
index 3adf58f8..3fc27f9a 100644
--- a/includes/ChangeTags.php
+++ b/includes/ChangeTags.php
@@ -34,17 +34,18 @@ class ChangeTags {
 	 *            - classes: Array of strings: CSS classes used in the generated html, one class for each tag
 	 *
 	 */
-	static function formatSummaryRow( $tags, $page ) {
+	public static function formatSummaryRow( $tags, $page ) {
 		global $wgLang;
 
-		if( !$tags )
+		if ( !$tags ) {
 			return array( '', array() );
+		}
 
 		$classes = array();
 
 		$tags = explode( ',', $tags );
 		$displayTags = array();
-		foreach( $tags as $tag ) {
+		foreach ( $tags as $tag ) {
 			$displayTags[] = Xml::tags(
 				'span',
 				array( 'class' => 'mw-tag-marker ' .
@@ -53,7 +54,10 @@ class ChangeTags {
 			);
 			$classes[] = Sanitizer::escapeClass( "mw-tag-$tag" );
 		}
-		$markers = wfMessage( 'parentheses' )->rawParams( $wgLang->commaList( $displayTags ) )->text();
+		$markers = wfMessage( 'tag-list-wrapper' )
+			->numParams( count( $displayTags ) )
+			->rawParams( $wgLang->commaList( $displayTags ) )
+			->parse();
 		$markers = Xml::tags( 'span', array( 'class' => 'mw-tag-markers' ), $markers );
 
 		return array( $markers, $classes );
@@ -67,7 +71,7 @@ class ChangeTags {
 	 * @return String: Short description of the tag from "mediawiki:tag-$tag" if this message exists,
 	 *                 html-escaped version of $tag otherwise
 	 */
-	static function tagDescription( $tag ) {
+	public static function tagDescription( $tag ) {
 		$msg = wfMessage( "tag-$tag" );
 		return $msg->exists() ? $msg->parse() : htmlspecialchars( $tag );
 	}
@@ -86,28 +90,29 @@ class ChangeTags {
 	 *
 	 * @exception MWException when $rc_id, $rev_id and $log_id are all null
 	 */
-	static function addTags( $tags, $rc_id = null, $rev_id = null, $log_id = null, $params = null ) {
+	public static function addTags( $tags, $rc_id = null, $rev_id = null, $log_id = null, $params = null ) {
 		if ( !is_array( $tags ) ) {
 			$tags = array( $tags );
 		}
 
 		$tags = array_filter( $tags ); // Make sure we're submitting all tags...
 
-		if( !$rc_id && !$rev_id && !$log_id ) {
-			throw new MWException( "At least one of: RCID, revision ID, and log ID MUST be specified when adding a tag to a change!" );
+		if ( !$rc_id && !$rev_id && !$log_id ) {
+			throw new MWException( 'At least one of: RCID, revision ID, and log ID MUST be ' .
+				'specified when adding a tag to a change!' );
 		}
 
 		$dbr = wfGetDB( DB_SLAVE );
 
 		// Might as well look for rcids and so on.
-		if( !$rc_id ) {
+		if ( !$rc_id ) {
 			$dbr = wfGetDB( DB_MASTER ); // Info might be out of date, somewhat fractionally, on slave.
-			if( $log_id ) {
+			if ( $log_id ) {
 				$rc_id = $dbr->selectField( 'recentchanges', 'rc_id', array( 'rc_logid' => $log_id ), __METHOD__ );
-			} elseif( $rev_id ) {
+			} elseif ( $rev_id ) {
 				$rc_id = $dbr->selectField( 'recentchanges', 'rc_id', array( 'rc_this_oldid' => $rev_id ), __METHOD__ );
 			}
-		} elseif( !$log_id && !$rev_id ) {
+		} elseif ( !$log_id && !$rev_id ) {
 			$dbr = wfGetDB( DB_MASTER ); // Info might be out of date, somewhat fractionally, on slave.
 			$log_id = $dbr->selectField( 'recentchanges', 'rc_logid', array( 'rc_id' => $rc_id ), __METHOD__ );
 			$rev_id = $dbr->selectField( 'recentchanges', 'rc_this_oldid', array( 'rc_id' => $rc_id ), __METHOD__ );
@@ -138,7 +143,7 @@ class ChangeTags {
 
 		// Insert the tags rows.
 		$tagsRows = array();
-		foreach( $tags as $tag ) { // Filter so we don't insert NULLs as zero accidentally.
+		foreach ( $tags as $tag ) { // Filter so we don't insert NULLs as zero accidentally.
 			$tagsRows[] = array_filter(
 				array(
 					'ct_tag' => $tag,
@@ -169,18 +174,18 @@ class ChangeTags {
 	 *
 	 * @throws MWException When unable to determine appropriate JOIN condition for tagging
 	 */
-	static function modifyDisplayQuery( &$tables, &$fields, &$conds,
+	public static function modifyDisplayQuery( &$tables, &$fields, &$conds,
 										&$join_conds, &$options, $filter_tag = false ) {
 		global $wgRequest, $wgUseTagFilter;
 
-		if( $filter_tag === false ) {
+		if ( $filter_tag === false ) {
 			$filter_tag = $wgRequest->getVal( 'tagfilter' );
 		}
 
 		// Figure out which conditions can be done.
 		if ( in_array( 'recentchanges', $tables ) ) {
 			$join_cond = 'rc_id';
-		} elseif( in_array( 'logging', $tables ) ) {
+		} elseif ( in_array( 'logging', $tables ) ) {
 			$join_cond = 'log_id';
 		} elseif ( in_array( 'revision', $tables ) ) {
 			$join_cond = 'rev_id';
@@ -193,14 +198,12 @@ class ChangeTags {
 		$join_conds['tag_summary'] = array( 'LEFT JOIN', "ts_$join_cond=$join_cond" );
 		$fields[] = 'ts_tags';
 
-		if( $wgUseTagFilter && $filter_tag ) {
+		if ( $wgUseTagFilter && $filter_tag ) {
 			// Somebody wants to filter on a tag.
 			// Add an INNER JOIN on change_tag
 
 			// FORCE INDEX -- change_tags will almost ALWAYS be the correct query plan.
-			global $wgOldChangeTagsIndex;
-			$index = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
-			$options['USE INDEX'] = array( 'change_tag' => $index );
+			$options['USE INDEX'] = array( 'change_tag' => 'change_tag_tag_id' );
 			unset( $options['FORCE INDEX'] );
 			$tables[] = 'change_tag';
 			$join_conds['change_tag'] = array( 'INNER JOIN', "ct_$join_cond=$join_cond" );
@@ -252,7 +255,7 @@ class ChangeTags {
 	 *
 	 * @return Array of strings: tags
 	 */
-	static function listDefinedTags() {
+	public static function listDefinedTags() {
 		// Caching...
 		global $wgMemc;
 		$key = wfMemcKey( 'valid-tags' );
@@ -278,4 +281,34 @@ class ChangeTags {
 		$wgMemc->set( $key, $emptyTags, 300 );
 		return $emptyTags;
 	}
+
+	/**
+	 * Returns a map of any tags used on the wiki to number of edits
+	 * tagged with them, ordered descending by the hitcount.
+	 *
+	 * @return array Array of string => int
+	 */
+	public static function tagUsageStatistics() {
+		$out = array();
+
+		$dbr = wfGetDB( DB_SLAVE );
+		$res = $dbr->select(
+			'change_tag',
+			array( 'ct_tag', 'hitcount' => 'count(*)' ),
+			array(),
+			__METHOD__,
+			array( 'GROUP BY' => 'ct_tag', 'ORDER BY' => 'hitcount DESC' )
+		);
+
+		foreach ( $res as $row ) {
+			$out[$row->ct_tag] = $row->hitcount;
+		}
+		foreach ( self::listDefinedTags() as $tag ) {
+			if ( !isset( $out[$tag] ) ) {
+				$out[$tag] = 0;
+			}
+		}
+
+		return $out;
+	}
 }
diff --git a/includes/ChangesFeed.php b/includes/ChangesFeed.php
index 476de5bd..0736c507 100644
--- a/includes/ChangesFeed.php
+++ b/includes/ChangesFeed.php
@@ -54,7 +54,7 @@ class ChangesFeed {
 			return false;
 		}
 
-		if( !array_key_exists( $this->format, $wgFeedClasses ) ) {
+		if ( !array_key_exists( $this->format, $wgFeedClasses ) ) {
 			// falling back to atom
 			$this->format = 'atom';
 		}
@@ -92,7 +92,7 @@ class ChangesFeed {
 		 * gets it quick too.
 		 */
 		$cachedFeed = $this->loadFromCache( $lastmod, $timekey, $key );
-		if( is_string( $cachedFeed ) ) {
+		if ( is_string( $cachedFeed ) ) {
 			wfDebug( "RC: Outputting cached feed\n" );
 			$feed->httpHeaders();
 			echo $cachedFeed;
@@ -134,7 +134,7 @@ class ChangesFeed {
 
 		$feedLastmod = $messageMemc->get( $timekey );
 
-		if( ( $wgFeedCacheTimeout > 0 ) && $feedLastmod ) {
+		if ( ( $wgFeedCacheTimeout > 0 ) && $feedLastmod ) {
 			/**
 			 * If the cached feed was rendered very recently, we may
 			 * go ahead and use it even if there have been edits made
@@ -146,7 +146,7 @@ class ChangesFeed {
 			$feedLastmodUnix = wfTimestamp( TS_UNIX, $feedLastmod );
 			$lastmodUnix = wfTimestamp( TS_UNIX, $lastmod );
 
-			if( $feedAge < $wgFeedCacheTimeout || $feedLastmodUnix > $lastmodUnix) {
+			if ( $feedAge < $wgFeedCacheTimeout || $feedLastmodUnix > $lastmodUnix ) {
 				wfDebug( "RC: loading feed from cache ($key; $feedLastmod; $lastmod)...\n" );
 				if ( $feedLastmodUnix < $lastmodUnix ) {
 					$wgOut->setLastModified( $feedLastmod ); // bug 21916
@@ -172,30 +172,32 @@ class ChangesFeed {
 		# Merge adjacent edits by one user
 		$sorted = array();
 		$n = 0;
-		foreach( $rows as $obj ) {
-			if( $n > 0 &&
+		foreach ( $rows as $obj ) {
+			if ( $n > 0 &&
 				$obj->rc_type == RC_EDIT &&
 				$obj->rc_namespace >= 0 &&
-				$obj->rc_cur_id == $sorted[$n-1]->rc_cur_id &&
-				$obj->rc_user_text == $sorted[$n-1]->rc_user_text ) {
-				$sorted[$n-1]->rc_last_oldid = $obj->rc_last_oldid;
+				$obj->rc_cur_id == $sorted[$n - 1]->rc_cur_id &&
+				$obj->rc_user_text == $sorted[$n - 1]->rc_user_text ) {
+				$sorted[$n - 1]->rc_last_oldid = $obj->rc_last_oldid;
 			} else {
 				$sorted[$n] = $obj;
 				$n++;
 			}
 		}
 
-		foreach( $sorted as $obj ) {
+		foreach ( $sorted as $obj ) {
 			$title = Title::makeTitle( $obj->rc_namespace, $obj->rc_title );
-			$talkpage = MWNamespace::canTalk( $obj->rc_namespace ) ? $title->getTalkPage()->getFullUrl() : '';
+			$talkpage = MWNamespace::canTalk( $obj->rc_namespace ) ? $title->getTalkPage()->getFullURL() : '';
 			// Skip items with deleted content (avoids partially complete/inconsistent output)
-			if( $obj->rc_deleted ) continue;
+			if ( $obj->rc_deleted ) {
+				continue;
+			}
 
 			if ( $obj->rc_this_oldid ) {
-				$url = $title->getFullURL(
-					'diff=' . $obj->rc_this_oldid .
-					'&oldid=' . $obj->rc_last_oldid
-				);
+				$url = $title->getFullURL( array(
+					'diff' => $obj->rc_this_oldid,
+					'oldid' => $obj->rc_last_oldid,
+				) );
 			} else {
 				// log entry or something like that.
 				$url = $title->getFullURL();
@@ -206,7 +208,8 @@ class ChangesFeed {
 				FeedUtils::formatDiff( $obj ),
 				$url,
 				$obj->rc_timestamp,
-				( $obj->rc_deleted & Revision::DELETED_USER ) ? wfMessage( 'rev-deleted-user' )->escaped() : $obj->rc_user_text,
+				( $obj->rc_deleted & Revision::DELETED_USER )
+					? wfMessage( 'rev-deleted-user' )->escaped() : $obj->rc_user_text,
 				$talkpage
 			);
 			$feed->outItem( $item );
diff --git a/includes/ChangesList.php b/includes/ChangesList.php
deleted file mode 100644
index 8461001e..00000000
--- a/includes/ChangesList.php
+++ /dev/null
@@ -1,1304 +0,0 @@
-<?php
-/**
- * Classes to show lists of changes.
- *
- * These can be:
- * - watchlist
- * - related changes
- * - recent changes
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * @todo document
- */
-class RCCacheEntry extends RecentChange {
-	var $secureName, $link;
-	var $curlink, $difflink, $lastlink, $usertalklink, $versionlink;
-	var $userlink, $timestamp, $watched;
-
-	/**
-	 * @param $rc RecentChange
-	 * @return RCCacheEntry
-	 */
-	static function newFromParent( $rc ) {
-		$rc2 = new RCCacheEntry;
-		$rc2->mAttribs = $rc->mAttribs;
-		$rc2->mExtra = $rc->mExtra;
-		return $rc2;
-	}
-}
-
-/**
- * Base class for all changes lists
- */
-class ChangesList extends ContextSource {
-
-	/**
-	 * @var Skin
-	 */
-	public $skin;
-
-	protected $watchlist = false;
-
-	protected $message;
-
-	/**
-	 * Changeslist constructor
-	 *
-	 * @param $obj Skin or IContextSource
-	 */
-	public function __construct( $obj ) {
-		if ( $obj instanceof IContextSource ) {
-			$this->setContext( $obj );
-			$this->skin = $obj->getSkin();
-		} else {
-			$this->setContext( $obj->getContext() );
-			$this->skin = $obj;
-		}
-		$this->preCacheMessages();
-	}
-
-	/**
-	 * Fetch an appropriate changes list class for the main context
-	 * This first argument used to be an User object.
-	 *
-	 * @deprecated in 1.18; use newFromContext() instead
-	 * @param string|User $unused Unused
-	 * @return ChangesList|EnhancedChangesList|OldChangesList derivative
-	 */
-	public static function newFromUser( $unused ) {
-		wfDeprecated( __METHOD__, '1.18' );
-		return self::newFromContext( RequestContext::getMain() );
-	}
-
-	/**
-	 * Fetch an appropriate changes list class for the specified context
-	 * Some users might want to use an enhanced list format, for instance
-	 *
-	 * @param $context IContextSource to use
-	 * @return ChangesList|EnhancedChangesList|OldChangesList derivative
-	 */
-	public static function newFromContext( IContextSource $context ) {
-		$user = $context->getUser();
-		$sk = $context->getSkin();
-		$list = null;
-		if( wfRunHooks( 'FetchChangesList', array( $user, &$sk, &$list ) ) ) {
-			$new = $context->getRequest()->getBool( 'enhanced', $user->getOption( 'usenewrc' ) );
-			return $new ? new EnhancedChangesList( $context ) : new OldChangesList( $context );
-		} else {
-			return $list;
-		}
-	}
-
-	/**
-	 * Sets the list to use a "<li class='watchlist-(namespace)-(page)'>" tag
-	 * @param $value Boolean
-	 */
-	public function setWatchlistDivs( $value = true ) {
-		$this->watchlist = $value;
-	}
-
-	/**
-	 * As we use the same small set of messages in various methods and that
-	 * they are called often, we call them once and save them in $this->message
-	 */
-	private function preCacheMessages() {
-		if( !isset( $this->message ) ) {
-			foreach ( explode( ' ', 'cur diff hist last blocklink history ' .
-			'semicolon-separator pipe-separator' ) as $msg ) {
-				$this->message[$msg] = $this->msg( $msg )->escaped();
-			}
-		}
-	}
-
-	/**
-	 * Returns the appropriate flags for new page, minor change and patrolling
-	 * @param array $flags Associative array of 'flag' => Bool
-	 * @param string $nothing to use for empty space
-	 * @return String
-	 */
-	protected function recentChangesFlags( $flags, $nothing = '&#160;' ) {
-		$f = '';
-		foreach( array( 'newpage', 'minor', 'bot', 'unpatrolled' ) as $flag ) {
-			$f .= isset( $flags[$flag] ) && $flags[$flag]
-				? self::flag( $flag )
-				: $nothing;
-		}
-		return $f;
-	}
-
-	/**
-	 * Provide the "<abbr>" element appropriate to a given abbreviated flag,
-	 * namely the flag indicating a new page, a minor edit, a bot edit, or an
-	 * unpatrolled edit.  By default in English it will contain "N", "m", "b",
-	 * "!" respectively, plus it will have an appropriate title and class.
-	 *
-	 * @param string $flag 'newpage', 'unpatrolled', 'minor', or 'bot'
-	 * @return String: Raw HTML
-	 */
-	public static function flag( $flag ) {
-		static $messages = null;
-		if ( is_null( $messages ) ) {
-			$messages = array(
-				'newpage' => array( 'newpageletter', 'recentchanges-label-newpage' ),
-				'minoredit' => array( 'minoreditletter', 'recentchanges-label-minor' ),
-				'botedit' => array( 'boteditletter', 'recentchanges-label-bot' ),
-				'unpatrolled' => array( 'unpatrolledletter', 'recentchanges-label-unpatrolled' ),
-			);
-			foreach( $messages as &$value ) {
-				$value[0] = wfMessage( $value[0] )->escaped();
-				$value[1] = wfMessage( $value[1] )->escaped();
-			}
-		}
-
-		# Inconsistent naming, bleh
-		$map = array(
-			'newpage' => 'newpage',
-			'minor' => 'minoredit',
-			'bot' => 'botedit',
-			'unpatrolled' => 'unpatrolled',
-			'minoredit' => 'minoredit',
-			'botedit' => 'botedit',
-		);
-		$flag = $map[$flag];
-
-		return "<abbr class='$flag' title='" . $messages[$flag][1] . "'>" . $messages[$flag][0] . '</abbr>';
-	}
-
-	/**
-	 * Returns text for the start of the tabular part of RC
-	 * @return String
-	 */
-	public function beginRecentChangesList() {
-		$this->rc_cache = array();
-		$this->rcMoveIndex = 0;
-		$this->rcCacheIndex = 0;
-		$this->lastdate = '';
-		$this->rclistOpen = false;
-		$this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' );
-		return '';
-	}
-
-	/**
-	 * Show formatted char difference
-	 * @param $old Integer: bytes
-	 * @param $new Integer: bytes
-	 * @param $context IContextSource context to use
-	 * @return String
-	 */
-	public static function showCharacterDifference( $old, $new, IContextSource $context = null ) {
-		global $wgRCChangedSizeThreshold, $wgMiserMode;
-
-		if ( !$context ) {
-			$context = RequestContext::getMain();
-		}
-
-		$new = (int)$new;
-		$old = (int)$old;
-		$szdiff = $new - $old;
-
-		$lang = $context->getLanguage();
-		$code = $lang->getCode();
-		static $fastCharDiff = array();
-		if ( !isset( $fastCharDiff[$code] ) ) {
-			$fastCharDiff[$code] = $wgMiserMode || $context->msg( 'rc-change-size' )->plain() === '$1';
-		}
-
-		$formattedSize = $lang->formatNum( $szdiff );
-
-		if ( !$fastCharDiff[$code] ) {
-			$formattedSize = $context->msg( 'rc-change-size', $formattedSize )->text();
-		}
-
-		if( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) {
-			$tag = 'strong';
-		} else {
-			$tag = 'span';
-		}
-
-		if ( $szdiff === 0 ) {
-			$formattedSizeClass = 'mw-plusminus-null';
-		}
-		if ( $szdiff > 0 ) {
-			$formattedSize = '+' . $formattedSize;
-			$formattedSizeClass = 'mw-plusminus-pos';
-		}
-		if ( $szdiff < 0 ) {
-			$formattedSizeClass = 'mw-plusminus-neg';
-		}
-
-		$formattedTotalSize = $context->msg( 'rc-change-size-new' )->numParams( $new )->text();
-
-		return Html::element( $tag,
-			array( 'dir' => 'ltr', 'class' => $formattedSizeClass, 'title' => $formattedTotalSize ),
-			$context->msg( 'parentheses', $formattedSize )->plain() ) . $lang->getDirMark();
-	}
-
-	/**
-	 * Format the character difference of one or several changes.
-	 *
-	 * @param $old RecentChange
-	 * @param $new RecentChange last change to use, if not provided, $old will be used
-	 * @return string HTML fragment
-	 */
-	public function formatCharacterDifference( RecentChange $old, RecentChange $new = null ) {
-		$oldlen = $old->mAttribs['rc_old_len'];
-
-		if ( $new ) {
-			$newlen = $new->mAttribs['rc_new_len'];
-		} else {
-			$newlen = $old->mAttribs['rc_new_len'];
-		}
-
-		if( $oldlen === null || $newlen === null ) {
-			return '';
-		}
-
-		return self::showCharacterDifference( $oldlen, $newlen, $this->getContext() );
-	}
-
-	/**
-	 * Returns text for the end of RC
-	 * @return String
-	 */
-	public function endRecentChangesList() {
-		if( $this->rclistOpen ) {
-			return "</ul>\n";
-		} else {
-			return '';
-		}
-	}
-
-	/**
-	 * @param string $s HTML to update
-	 * @param $rc_timestamp mixed
-	 */
-	public function insertDateHeader( &$s, $rc_timestamp ) {
-		# Make date header if necessary
-		$date = $this->getLanguage()->userDate( $rc_timestamp, $this->getUser() );
-		if( $date != $this->lastdate ) {
-			if( $this->lastdate != '' ) {
-				$s .= "</ul>\n";
-			}
-			$s .= Xml::element( 'h4', null, $date ) . "\n<ul class=\"special\">";
-			$this->lastdate = $date;
-			$this->rclistOpen = true;
-		}
-	}
-
-	/**
-	 * @param string $s HTML to update
-	 * @param $title Title
-	 * @param $logtype string
-	 */
-	public function insertLog( &$s, $title, $logtype ) {
-		$page = new LogPage( $logtype );
-		$logname = $page->getName()->escaped();
-		$s .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $title, $logname ) )->escaped();
-	}
-
-	/**
-	 * @param string $s HTML to update
-	 * @param $rc RecentChange
-	 * @param $unpatrolled
-	 */
-	public function insertDiffHist( &$s, &$rc, $unpatrolled ) {
-		# Diff link
-		if( $rc->mAttribs['rc_type'] == RC_NEW || $rc->mAttribs['rc_type'] == RC_LOG ) {
-			$diffLink = $this->message['diff'];
-		} elseif ( !self::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
-			$diffLink = $this->message['diff'];
-		} else {
-			$query = array(
-				'curid' => $rc->mAttribs['rc_cur_id'],
-				'diff' => $rc->mAttribs['rc_this_oldid'],
-				'oldid' => $rc->mAttribs['rc_last_oldid']
-			);
-
-			if( $unpatrolled ) {
-				$query['rcid'] = $rc->mAttribs['rc_id'];
-			};
-
-			$diffLink = Linker::linkKnown(
-				$rc->getTitle(),
-				$this->message['diff'],
-				array( 'tabindex' => $rc->counter ),
-				$query
-			);
-		}
-		$diffhist = $diffLink . $this->message['pipe-separator'];
-		# History link
-		$diffhist .= Linker::linkKnown(
-			$rc->getTitle(),
-			$this->message['hist'],
-			array(),
-			array(
-				'curid' => $rc->mAttribs['rc_cur_id'],
-				'action' => 'history'
-			)
-		);
-		$s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() . ' <span class="mw-changeslist-separator">. .</span> ';
-	}
-
-	/**
-	 * @param string $s HTML to update
-	 * @param $rc RecentChange
-	 * @param $unpatrolled
-	 * @param $watched
-	 */
-	public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) {
-		# If it's a new article, there is no diff link, but if it hasn't been
-		# patrolled yet, we need to give users a way to do so
-		$params = array();
-
-		if ( $unpatrolled && $rc->mAttribs['rc_type'] == RC_NEW ) {
-			$params['rcid'] = $rc->mAttribs['rc_id'];
-		}
-
-		$articlelink = Linker::linkKnown(
-			$rc->getTitle(),
-			null,
-			array( 'class' => 'mw-changeslist-title' ),
-			$params
-		);
-		if( $this->isDeleted( $rc, Revision::DELETED_TEXT ) ) {
-			$articlelink = '<span class="history-deleted">' . $articlelink . '</span>';
-		}
-		# To allow for boldening pages watched by this user
-		$articlelink = "<span class=\"mw-title\">{$articlelink}</span>";
-		# RTL/LTR marker
-		$articlelink .= $this->getLanguage()->getDirMark();
-
-		wfRunHooks( 'ChangesListInsertArticleLink',
-			array( &$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched ) );
-
-		$s .= " $articlelink";
-	}
-
-	/**
-	 * Get the timestamp from $rc formatted with current user's settings
-	 * and a separator
-	 *
-	 * @param $rc RecentChange
-	 * @return string HTML fragment
-	 */
-	public function getTimestamp( $rc ) {
-		return $this->message['semicolon-separator'] . '<span class="mw-changeslist-date">' .
-			$this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . '</span> <span class="mw-changeslist-separator">. .</span> ';
-	}
-
-	/**
-	 * Insert time timestamp string from $rc into $s
-	 *
-	 * @param string $s HTML to update
-	 * @param $rc RecentChange
-	 */
-	public function insertTimestamp( &$s, $rc ) {
-		$s .= $this->getTimestamp( $rc );
-	}
-
-	/**
-	 * Insert links to user page, user talk page and eventually a blocking link
-	 *
-	 * @param &$s String HTML to update
-	 * @param &$rc RecentChange
-	 */
-	public function insertUserRelatedLinks( &$s, &$rc ) {
-		if( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
-			$s .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
-		} else {
-			$s .= $this->getLanguage()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'],
-				$rc->mAttribs['rc_user_text'] );
-			$s .= Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
-		}
-	}
-
-	/**
-	 * Insert a formatted action
-	 *
-	 * @param $rc RecentChange
-	 * @return string
-	 */
-	public function insertLogEntry( $rc ) {
-		$formatter = LogFormatter::newFromRow( $rc->mAttribs );
-		$formatter->setContext( $this->getContext() );
-		$formatter->setShowUserToolLinks( true );
-		$mark = $this->getLanguage()->getDirMark();
-		return $formatter->getActionText() . " $mark" . $formatter->getComment();
-	}
-
-	/**
-	 * Insert a formatted comment
-	 * @param $rc RecentChange
-	 * @return string
-	 */
-	public function insertComment( $rc ) {
-		if( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) {
-			if( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) {
-				return ' <span class="history-deleted">' . $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
-			} else {
-				return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
-			}
-		}
-		return '';
-	}
-
-	/**
-	 * Check whether to enable recent changes patrol features
-	 * @return Boolean
-	 */
-	public static function usePatrol() {
-		global $wgUser;
-		return $wgUser->useRCPatrol();
-	}
-
-	/**
-	 * Returns the string which indicates the number of watching users
-	 * @return string
-	 */
-	protected function numberofWatchingusers( $count ) {
-		static $cache = array();
-		if( $count > 0 ) {
-			if( !isset( $cache[$count] ) ) {
-				$cache[$count] = $this->msg( 'number_of_watching_users_RCview' )->numParams( $count )->escaped();
-			}
-			return $cache[$count];
-		} else {
-			return '';
-		}
-	}
-
-	/**
-	 * Determine if said field of a revision is hidden
-	 * @param $rc RCCacheEntry
-	 * @param $field Integer: one of DELETED_* bitfield constants
-	 * @return Boolean
-	 */
-	public static function isDeleted( $rc, $field ) {
-		return ( $rc->mAttribs['rc_deleted'] & $field ) == $field;
-	}
-
-	/**
-	 * Determine if the current user is allowed to view a particular
-	 * field of this revision, if it's marked as deleted.
-	 * @param $rc RCCacheEntry
-	 * @param $field Integer
-	 * @param $user User object to check, or null to use $wgUser
-	 * @return Boolean
-	 */
-	public static function userCan( $rc, $field, User $user = null ) {
-		if( $rc->mAttribs['rc_type'] == RC_LOG ) {
-			return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
-		} else {
-			return Revision::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
-		}
-	}
-
-	/**
-	 * @param $link string
-	 * @param $watched bool
-	 * @return string
-	 */
-	protected function maybeWatchedLink( $link, $watched = false ) {
-		if( $watched ) {
-			return '<strong class="mw-watched">' . $link . '</strong>';
-		} else {
-			return '<span class="mw-rc-unwatched">' . $link . '</span>';
-		}
-	}
-
-	/** Inserts a rollback link
-	 *
-	 * @param $s string
-	 * @param $rc RecentChange
-	 */
-	public function insertRollback( &$s, &$rc ) {
-		if( $rc->mAttribs['rc_type'] != RC_NEW && $rc->mAttribs['rc_this_oldid'] && $rc->mAttribs['rc_cur_id'] ) {
-			$page = $rc->getTitle();
-			/** Check for rollback and edit permissions, disallow special pages, and only
-			  * show a link on the top-most revision */
-			if ( $this->getUser()->isAllowed( 'rollback' ) && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid'] )
-			{
-				$rev = new Revision( array(
-					'title' => $page,
-					'id' => $rc->mAttribs['rc_this_oldid'],
-					'user' => $rc->mAttribs['rc_user'],
-					'user_text' => $rc->mAttribs['rc_user_text'],
-					'deleted' => $rc->mAttribs['rc_deleted']
-				) );
-				$s .= ' '.Linker::generateRollback( $rev, $this->getContext() );
-			}
-		}
-	}
-
-	/**
-	 * @param $s string
-	 * @param $rc RecentChange
-	 * @param $classes
-	 */
-	public function insertTags( &$s, &$rc, &$classes ) {
-		if ( empty( $rc->mAttribs['ts_tags'] ) )
-			return;
-
-		list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $rc->mAttribs['ts_tags'], 'changeslist' );
-		$classes = array_merge( $classes, $newClasses );
-		$s .= ' ' . $tagSummary;
-	}
-
-	public function insertExtra( &$s, &$rc, &$classes ) {
-		// Empty, used for subclasses to add anything special.
-	}
-
-	protected function showAsUnpatrolled( RecentChange $rc ) {
-		$unpatrolled = false;
-		if ( !$rc->mAttribs['rc_patrolled'] ) {
-			if ( $this->getUser()->useRCPatrol() ) {
-				$unpatrolled = true;
-			} elseif ( $this->getUser()->useNPPatrol() && $rc->mAttribs['rc_type'] == RC_NEW ) {
-				$unpatrolled = true;
-			}
-		}
-		return $unpatrolled;
-	}
-}
-
-/**
- * Generate a list of changes using the good old system (no javascript)
- */
-class OldChangesList extends ChangesList {
-	/**
-	 * Format a line using the old system (aka without any javascript).
-	 *
-	 * @param $rc RecentChange, passed by reference
-	 * @param bool $watched (default false)
-	 * @param int $linenumber (default null)
-	 *
-	 * @return string|bool
-	 */
-	public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
-		global $wgRCShowChangedSize;
-		wfProfileIn( __METHOD__ );
-
-		# Should patrol-related stuff be shown?
-		$unpatrolled = $this->showAsUnpatrolled( $rc );
-
-		$dateheader = ''; // $s now contains only <li>...</li>, for hooks' convenience.
-		$this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
-
-		$s = '';
-		$classes = array();
-		// use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
-		if( $linenumber ) {
-			if( $linenumber & 1 ) {
-				$classes[] = 'mw-line-odd';
-			}
-			else {
-				$classes[] = 'mw-line-even';
-			}
-		}
-
-		// Indicate watched status on the line to allow for more
-		// comprehensive styling.
-		$classes[] = $watched ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
-
-		// Moved pages (very very old, not supported anymore)
-		if( $rc->mAttribs['rc_type'] == RC_MOVE || $rc->mAttribs['rc_type'] == RC_MOVE_OVER_REDIRECT ) {
-		// Log entries
-		} elseif( $rc->mAttribs['rc_log_type'] ) {
-			$logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] );
-			$this->insertLog( $s, $logtitle, $rc->mAttribs['rc_log_type'] );
-		// Log entries (old format) or log targets, and special pages
-		} elseif( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
-			list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
-			if( $name == 'Log' ) {
-				$this->insertLog( $s, $rc->getTitle(), $subpage );
-			}
-		// Regular entries
-		} else {
-			$this->insertDiffHist( $s, $rc, $unpatrolled );
-			# M, N, b and ! (minor, new, bot and unpatrolled)
-			$s .= $this->recentChangesFlags(
-				array(
-					'newpage' => $rc->mAttribs['rc_type'] == RC_NEW,
-					'minor' => $rc->mAttribs['rc_minor'],
-					'unpatrolled' => $unpatrolled,
-					'bot' => $rc->mAttribs['rc_bot']
-				),
-				''
-			);
-			$this->insertArticleLink( $s, $rc, $unpatrolled, $watched );
-		}
-		# Edit/log timestamp
-		$this->insertTimestamp( $s, $rc );
-		# Bytes added or removed
-		if ( $wgRCShowChangedSize ) {
-			$cd = $this->formatCharacterDifference( $rc );
-			if ( $cd !== '' ) {
-				$s .= $cd . '  <span class="mw-changeslist-separator">. .</span> ';
-			}
-		}
-
-		if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
-			$s .= $this->insertLogEntry( $rc );
-		} else {
-			# User tool links
-			$this->insertUserRelatedLinks( $s, $rc );
-			# LTR/RTL direction mark
-			$s .= $this->getLanguage()->getDirMark();
-			$s .= $this->insertComment( $rc );
-		}
-
-		# Tags
-		$this->insertTags( $s, $rc, $classes );
-		# Rollback
-		$this->insertRollback( $s, $rc );
-		# For subclasses
-		$this->insertExtra( $s, $rc, $classes );
-
-		# How many users watch this page
-		if( $rc->numberofWatchingusers > 0 ) {
-			$s .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers );
-		}
-
-		if( $this->watchlist ) {
-			$classes[] = Sanitizer::escapeClass( 'watchlist-' . $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
-		}
-
-		if ( !wfRunHooks( 'OldChangesListRecentChangesLine', array( &$this, &$s, $rc, &$classes ) ) ) {
-			wfProfileOut( __METHOD__ );
-			return false;
-		}
-
-		wfProfileOut( __METHOD__ );
-		return "$dateheader<li class=\"" . implode( ' ', $classes ) . "\">" . $s . "</li>\n";
-	}
-}
-
-/**
- * Generate a list of changes using an Enhanced system (uses javascript).
- */
-class EnhancedChangesList extends ChangesList {
-
-	protected $rc_cache;
-
-	/**
-	 * Add the JavaScript file for enhanced changeslist
-	 * @return String
-	 */
-	public function beginRecentChangesList() {
-		$this->rc_cache = array();
-		$this->rcMoveIndex = 0;
-		$this->rcCacheIndex = 0;
-		$this->lastdate = '';
-		$this->rclistOpen = false;
-		$this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' );
-		return '';
-	}
-	/**
-	 * Format a line for enhanced recentchange (aka with javascript and block of lines).
-	 *
-	 * @param $baseRC RecentChange
-	 * @param $watched bool
-	 *
-	 * @return string
-	 */
-	public function recentChangesLine( &$baseRC, $watched = false ) {
-		wfProfileIn( __METHOD__ );
-
-		# Create a specialised object
-		$rc = RCCacheEntry::newFromParent( $baseRC );
-
-		$curIdEq = array( 'curid' => $rc->mAttribs['rc_cur_id'] );
-
-		# If it's a new day, add the headline and flush the cache
-		$date = $this->getLanguage()->userDate( $rc->mAttribs['rc_timestamp'], $this->getUser() );
-		$ret = '';
-		if( $date != $this->lastdate ) {
-			# Process current cache
-			$ret = $this->recentChangesBlock();
-			$this->rc_cache = array();
-			$ret .= Xml::element( 'h4', null, $date ) . "\n";
-			$this->lastdate = $date;
-		}
-
-		# Should patrol-related stuff be shown?
-		$rc->unpatrolled = $this->showAsUnpatrolled( $rc );
-
-		$showdifflinks = true;
-		# Make article link
-		$type = $rc->mAttribs['rc_type'];
-		$logType = $rc->mAttribs['rc_log_type'];
-		// Page moves, very old style, not supported anymore
-		if( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
-		// New unpatrolled pages
-		} elseif( $rc->unpatrolled && $type == RC_NEW ) {
-			$clink = Linker::linkKnown( $rc->getTitle(), null, array(),
-				array( 'rcid' => $rc->mAttribs['rc_id'] ) );
-		// Log entries
-		} elseif( $type == RC_LOG ) {
-			if( $logType ) {
-				$logtitle = SpecialPage::getTitleFor( 'Log', $logType );
-				$logpage = new LogPage( $logType );
-				$logname = $logpage->getName()->escaped();
-				$clink = $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
-			} else {
-				$clink = Linker::link( $rc->getTitle() );
-			}
-			$watched = false;
-		// Log entries (old format) and special pages
-		} elseif( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
-			wfDebug( "Unexpected special page in recentchanges\n" );
-			$clink = '';
-		// Edits
-		} else {
-			$clink = Linker::linkKnown( $rc->getTitle() );
-		}
-
-		# Don't show unusable diff links
-		if ( !ChangesList::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
-			$showdifflinks = false;
-		}
-
-		$time = $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() );
-		$rc->watched = $watched;
-		$rc->link = $clink;
-		$rc->timestamp = $time;
-		$rc->numberofWatchingusers = $baseRC->numberofWatchingusers;
-
-		# Make "cur" and "diff" links.  Do not use link(), it is too slow if
-		# called too many times (50% of CPU time on RecentChanges!).
-		$thisOldid = $rc->mAttribs['rc_this_oldid'];
-		$lastOldid = $rc->mAttribs['rc_last_oldid'];
-		if( $rc->unpatrolled ) {
-			$rcIdQuery = array( 'rcid' => $rc->mAttribs['rc_id'] );
-		} else {
-			$rcIdQuery = array();
-		}
-		$querycur = $curIdEq + array( 'diff' => '0', 'oldid' => $thisOldid );
-		$querydiff = $curIdEq + array( 'diff' => $thisOldid, 'oldid' =>
-			$lastOldid ) + $rcIdQuery;
-
-		if( !$showdifflinks ) {
-			$curLink = $this->message['cur'];
-			$diffLink = $this->message['diff'];
-		} elseif( in_array( $type, array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
-			if ( $type != RC_NEW ) {
-				$curLink = $this->message['cur'];
-			} else {
-				$curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) );
-				$curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
-			}
-			$diffLink = $this->message['diff'];
-		} else {
-			$diffUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querydiff ) );
-			$curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) );
-			$diffLink = "<a href=\"$diffUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['diff']}</a>";
-			$curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
-		}
-
-		# Make "last" link
-		if( !$showdifflinks || !$lastOldid ) {
-			$lastLink = $this->message['last'];
-		} elseif( in_array( $type, array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
-			$lastLink = $this->message['last'];
-		} else {
-			$lastLink = Linker::linkKnown( $rc->getTitle(), $this->message['last'],
-				array(), $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ) + $rcIdQuery );
-		}
-
-		# Make user links
-		if( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
-			$rc->userlink = ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
-		} else {
-			$rc->userlink = Linker::userLink( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
-			$rc->usertalklink = Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
-		}
-
-		$rc->lastlink = $lastLink;
-		$rc->curlink = $curLink;
-		$rc->difflink = $diffLink;
-
-		# Put accumulated information into the cache, for later display
-		# Page moves go on their own line
-		$title = $rc->getTitle();
-		$secureName = $title->getPrefixedDBkey();
-		if( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
-			# Use an @ character to prevent collision with page names
-			$this->rc_cache['@@' . ($this->rcMoveIndex++)] = array( $rc );
-		} else {
-			# Logs are grouped by type
-			if( $type == RC_LOG ) {
-				$secureName = SpecialPage::getTitleFor( 'Log', $logType )->getPrefixedDBkey();
-			}
-			if( !isset( $this->rc_cache[$secureName] ) ) {
-				$this->rc_cache[$secureName] = array();
-			}
-
-			array_push( $this->rc_cache[$secureName], $rc );
-		}
-
-		wfProfileOut( __METHOD__ );
-
-		return $ret;
-	}
-
-	/**
-	 * Enhanced RC group
-	 * @return string
-	 */
-	protected function recentChangesBlockGroup( $block ) {
-		global $wgRCShowChangedSize;
-
-		wfProfileIn( __METHOD__ );
-
-		# Add the namespace and title of the block as part of the class
-		$classes = array( 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' );
-		if ( $block[0]->mAttribs['rc_log_type'] ) {
-			# Log entry
-			$classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
-					. $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] );
-		} else {
-			$classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns'
-					. $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
-		}
-		$classes[] = $block[0]->watched ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
-		$r = Html::openElement( 'table', array( 'class' => $classes ) ) .
-			Html::openElement( 'tr' );
-
-		# Collate list of users
-		$userlinks = array();
-		# Other properties
-		$unpatrolled = false;
-		$isnew = false;
-		$allBots = true;
-		$allMinors = true;
-		$curId = $currentRevision = 0;
-		# Some catalyst variables...
-		$namehidden = true;
-		$allLogs = true;
-		foreach( $block as $rcObj ) {
-			$oldid = $rcObj->mAttribs['rc_last_oldid'];
-			if( $rcObj->mAttribs['rc_type'] == RC_NEW ) {
-				$isnew = true;
-			}
-			// If all log actions to this page were hidden, then don't
-			// give the name of the affected page for this block!
-			if( !$this->isDeleted( $rcObj, LogPage::DELETED_ACTION ) ) {
-				$namehidden = false;
-			}
-			$u = $rcObj->userlink;
-			if( !isset( $userlinks[$u] ) ) {
-				$userlinks[$u] = 0;
-			}
-			if( $rcObj->unpatrolled ) {
-				$unpatrolled = true;
-			}
-			if( $rcObj->mAttribs['rc_type'] != RC_LOG ) {
-				$allLogs = false;
-			}
-			# Get the latest entry with a page_id and oldid
-			# since logs may not have these.
-			if( !$curId && $rcObj->mAttribs['rc_cur_id'] ) {
-				$curId = $rcObj->mAttribs['rc_cur_id'];
-			}
-			if( !$currentRevision && $rcObj->mAttribs['rc_this_oldid'] ) {
-				$currentRevision = $rcObj->mAttribs['rc_this_oldid'];
-			}
-
-			if( !$rcObj->mAttribs['rc_bot'] ) {
-				$allBots = false;
-			}
-			if( !$rcObj->mAttribs['rc_minor'] ) {
-				$allMinors = false;
-			}
-
-			$userlinks[$u]++;
-		}
-
-		# Sort the list and convert to text
-		krsort( $userlinks );
-		asort( $userlinks );
-		$users = array();
-		foreach( $userlinks as $userlink => $count) {
-			$text = $userlink;
-			$text .= $this->getLanguage()->getDirMark();
-			if( $count > 1 ) {
-				$text .= ' ' . $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->formatNum( $count ) . '×' )->escaped();
-			}
-			array_push( $users, $text );
-		}
-
-		$users = ' <span class="changedby">'
-			. $this->msg( 'brackets' )->rawParams(
-				implode( $this->message['semicolon-separator'], $users )
-			)->escaped() . '</span>';
-
-		$tl = '<span class="mw-collapsible-toggle mw-enhancedchanges-arrow mw-enhancedchanges-arrow-space"></span>';
-		$r .= "<td>$tl</td>";
-
-		# Main line
-		$r .= '<td class="mw-enhanced-rc">' . $this->recentChangesFlags( array(
-			'newpage' => $isnew, # show, when one have this flag
-			'minor' => $allMinors, # show only, when all have this flag
-			'unpatrolled' => $unpatrolled, # show, when one have this flag
-			'bot' => $allBots, # show only, when all have this flag
-		) );
-
-		# Timestamp
-		$r .= '&#160;' . $block[0]->timestamp . '&#160;</td><td>';
-
-		# Article link
-		if( $namehidden ) {
-			$r .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-event' )->escaped() . '</span>';
-		} elseif( $allLogs ) {
-			$r .= $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
-		} else {
-			$this->insertArticleLink( $r, $block[0], $block[0]->unpatrolled, $block[0]->watched );
-		}
-
-		$r .= $this->getLanguage()->getDirMark();
-
-		$queryParams['curid'] = $curId;
-		# Changes message
-		$n = count( $block );
-		static $nchanges = array();
-		if ( !isset( $nchanges[$n] ) ) {
-			$nchanges[$n] = $this->msg( 'nchanges' )->numParams( $n )->escaped();
-		}
-		# Total change link
-		$r .= ' ';
-		$logtext = '';
-		if( !$allLogs ) {
-			if( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
-				$logtext .= $nchanges[$n];
-			} elseif( $isnew ) {
-				$logtext .= $nchanges[$n];
-			} else {
-				$params = $queryParams;
-				$params['diff'] = $currentRevision;
-				$params['oldid'] = $oldid;
-
-				$logtext .= Linker::link(
-					$block[0]->getTitle(),
-					$nchanges[$n],
-					array(),
-					$params,
-					array( 'known', 'noclasses' )
-				);
-			}
-		}
-
-		# History
-		if( $allLogs ) {
-			// don't show history link for logs
-		} elseif( $namehidden || !$block[0]->getTitle()->exists() ) {
-			$logtext .= $this->message['pipe-separator'] . $this->message['hist'];
-		} else {
-			$params = $queryParams;
-			$params['action'] = 'history';
-
-			$logtext .= $this->message['pipe-separator'] .
-				Linker::linkKnown(
-					$block[0]->getTitle(),
-					$this->message['hist'],
-					array(),
-					$params
-				);
-		}
-
-		if( $logtext !== '' ) {
-			$r .= $this->msg( 'parentheses' )->rawParams( $logtext )->escaped();
-		}
-
-		$r .= ' <span class="mw-changeslist-separator">. .</span> ';
-
-		# Character difference (does not apply if only log items)
-		if( $wgRCShowChangedSize && !$allLogs ) {
-			$last = 0;
-			$first = count( $block ) - 1;
-			# Some events (like logs) have an "empty" size, so we need to skip those...
-			while( $last < $first && $block[$last]->mAttribs['rc_new_len'] === null ) {
-				$last++;
-			}
-			while( $first > $last && $block[$first]->mAttribs['rc_old_len'] === null ) {
-				$first--;
-			}
-			# Get net change
-			$chardiff = $this->formatCharacterDifference( $block[$first], $block[$last] );
-
-			if( $chardiff == '' ) {
-				$r .= ' ';
-			} else {
-				$r .= ' ' . $chardiff. ' <span class="mw-changeslist-separator">. .</span> ';
-			}
-		}
-
-		$r .= $users;
-		$r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
-
-		# Sub-entries
-		foreach( $block as $rcObj ) {
-			# Classes to apply -- TODO implement
-			$classes = array();
-			$type = $rcObj->mAttribs['rc_type'];
-
-			$r .= '<tr><td></td><td class="mw-enhanced-rc">';
-			$r .= $this->recentChangesFlags( array(
-				'newpage' => $type == RC_NEW,
-				'minor' => $rcObj->mAttribs['rc_minor'],
-				'unpatrolled' => $rcObj->unpatrolled,
-				'bot' => $rcObj->mAttribs['rc_bot'],
-			) );
-			$r .= '&#160;</td><td class="mw-enhanced-rc-nested"><span class="mw-enhanced-rc-time">';
-
-			$params = $queryParams;
-
-			if( $rcObj->mAttribs['rc_this_oldid'] != 0 ) {
-				$params['oldid'] = $rcObj->mAttribs['rc_this_oldid'];
-			}
-
-			# Log timestamp
-			if( $type == RC_LOG ) {
-				$link = $rcObj->timestamp;
-			# Revision link
-			} elseif( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
-				$link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
-			} else {
-				if ( $rcObj->unpatrolled && $type == RC_NEW) {
-					$params['rcid'] = $rcObj->mAttribs['rc_id'];
-				}
-
-				$link = Linker::linkKnown(
-						$rcObj->getTitle(),
-						$rcObj->timestamp,
-						array(),
-						$params
-					);
-				if( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
-					$link = '<span class="history-deleted">' . $link . '</span> ';
-				}
-			}
-			$r .= $link . '</span>';
-
-			if ( !$type == RC_LOG || $type == RC_NEW ) {
-				$r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->curlink . $this->message['pipe-separator'] . $rcObj->lastlink )->escaped();
-			}
-			$r .= ' <span class="mw-changeslist-separator">. .</span> ';
-
-			# Character diff
-			if ( $wgRCShowChangedSize ) {
-				$cd = $this->formatCharacterDifference( $rcObj );
-				if ( $cd !== '' ) {
-					$r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
-				}
-			}
-
-			if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
-				$r .= $this->insertLogEntry( $rcObj );
-			} else {
-				# User links
-				$r .= $rcObj->userlink;
-				$r .= $rcObj->usertalklink;
-				$r .= $this->insertComment( $rcObj );
-			}
-
-			# Rollback
-			$this->insertRollback( $r, $rcObj );
-			# Tags
-			$this->insertTags( $r, $rcObj, $classes );
-
-			$r .= "</td></tr>\n";
-		}
-		$r .= "</table>\n";
-
-		$this->rcCacheIndex++;
-
-		wfProfileOut( __METHOD__ );
-
-		return $r;
-	}
-
-	/**
-	 * Generate HTML for an arrow or placeholder graphic
-	 * @param string $dir one of '', 'd', 'l', 'r'
-	 * @param string $alt text
-	 * @param string $title text
-	 * @return String: HTML "<img>" tag
-	 */
-	protected function arrow( $dir, $alt = '', $title = '' ) {
-		global $wgStylePath;
-		$encUrl = htmlspecialchars( $wgStylePath . '/common/images/Arr_' . $dir . '.png' );
-		$encAlt = htmlspecialchars( $alt );
-		$encTitle = htmlspecialchars( $title );
-		return "<img src=\"$encUrl\" width=\"12\" height=\"12\" alt=\"$encAlt\" title=\"$encTitle\" />";
-	}
-
-	/**
-	 * Generate HTML for a right- or left-facing arrow,
-	 * depending on language direction.
-	 * @return String: HTML "<img>" tag
-	 */
-	protected function sideArrow() {
-		$dir = $this->getLanguage()->isRTL() ? 'l' : 'r';
-		return $this->arrow( $dir, '+', $this->msg( 'rc-enhanced-expand' )->text() );
-	}
-
-	/**
-	 * Generate HTML for a down-facing arrow
-	 * depending on language direction.
-	 * @return String: HTML "<img>" tag
-	 */
-	protected function downArrow() {
-		return $this->arrow( 'd', '-', $this->msg( 'rc-enhanced-hide' )->text() );
-	}
-
-	/**
-	 * Generate HTML for a spacer image
-	 * @return String: HTML "<img>" tag
-	 */
-	protected function spacerArrow() {
-		return $this->arrow( '', codepointToUtf8( 0xa0 ) ); // non-breaking space
-	}
-
-	/**
-	 * Enhanced RC ungrouped line.
-	 *
-	 * @param $rcObj RecentChange
-	 * @return String: a HTML formatted line (generated using $r)
-	 */
-	protected function recentChangesBlockLine( $rcObj ) {
-		global $wgRCShowChangedSize;
-
-		wfProfileIn( __METHOD__ );
-		$query['curid'] = $rcObj->mAttribs['rc_cur_id'];
-
-		$type = $rcObj->mAttribs['rc_type'];
-		$logType = $rcObj->mAttribs['rc_log_type'];
-		$classes = array( 'mw-enhanced-rc' );
-		if( $logType ) {
-			# Log entry
-			$classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
-					. $logType . '-' . $rcObj->mAttribs['rc_title'] );
-		} else {
-			$classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' .
-					$rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
-		}
-		$classes[] = $rcObj->watched ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
-		$r = Html::openElement( 'table', array( 'class' => $classes ) ) .
-			Html::openElement( 'tr' );
-
-		$r .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow-space"></span>';
-		# Flag and Timestamp
-		if( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
-			$r .= '&#160;&#160;&#160;&#160;'; // 4 flags -> 4 spaces
-		} else {
-			$r .= $this->recentChangesFlags( array(
-				'newpage' => $type == RC_NEW,
-				'minor' => $rcObj->mAttribs['rc_minor'],
-				'unpatrolled' => $rcObj->unpatrolled,
-				'bot' => $rcObj->mAttribs['rc_bot'],
-			) );
-		}
-		$r .= '&#160;' . $rcObj->timestamp . '&#160;</td><td>';
-		# Article or log link
-		if( $logType ) {
-			$logPage = new LogPage( $logType );
-			$logTitle = SpecialPage::getTitleFor( 'Log', $logType );
-			$logName = $logPage->getName()->escaped();
-			$r .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logTitle, $logName ) )->escaped();
-		} else {
-			$this->insertArticleLink( $r, $rcObj, $rcObj->unpatrolled, $rcObj->watched );
-		}
-		# Diff and hist links
-		if ( $type != RC_LOG ) {
-			$query['action'] = 'history';
-			$r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
-				$rcObj->getTitle(),
-				$this->message['hist'],
-				array(),
-				$query
-			) )->escaped();
-		}
-		$r .= ' <span class="mw-changeslist-separator">. .</span> ';
-		# Character diff
-		if ( $wgRCShowChangedSize ) {
-			$cd = $this->formatCharacterDifference( $rcObj );
-			if ( $cd !== '' ) {
-				$r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
-			}
-		}
-
-		if ( $type == RC_LOG ) {
-			$r .= $this->insertLogEntry( $rcObj );
-		} else {
-			$r .= ' ' . $rcObj->userlink . $rcObj->usertalklink;
-			$r .= $this->insertComment( $rcObj );
-			$this->insertRollback( $r, $rcObj );
-		}
-
-		# Tags
-		$this->insertTags( $r, $rcObj, $classes );
-		# Show how many people are watching this if enabled
-		$r .= $this->numberofWatchingusers( $rcObj->numberofWatchingusers );
-
-		$r .= "</td></tr></table>\n";
-
-		wfProfileOut( __METHOD__ );
-
-		return $r;
-	}
-
-	/**
-	 * If enhanced RC is in use, this function takes the previously cached
-	 * RC lines, arranges them, and outputs the HTML
-	 *
-	 * @return string
-	 */
-	protected function recentChangesBlock() {
-		if( count ( $this->rc_cache ) == 0 ) {
-			return '';
-		}
-
-		wfProfileIn( __METHOD__ );
-
-		$blockOut = '';
-		foreach( $this->rc_cache as $block ) {
-			if( count( $block ) < 2 ) {
-				$blockOut .= $this->recentChangesBlockLine( array_shift( $block ) );
-			} else {
-				$blockOut .= $this->recentChangesBlockGroup( $block );
-			}
-		}
-
-		wfProfileOut( __METHOD__ );
-
-		return '<div>' . $blockOut . '</div>';
-	}
-
-	/**
-	 * Returns text for the end of RC
-	 * If enhanced RC is in use, returns pretty much all the text
-	 * @return string
-	 */
-	public function endRecentChangesList() {
-		return $this->recentChangesBlock() . parent::endRecentChangesList();
-	}
-
-}
diff --git a/includes/Collation.php b/includes/Collation.php
index 6bba019b..b0252c70 100644
--- a/includes/Collation.php
+++ b/includes/Collation.php
@@ -40,7 +40,7 @@ abstract class Collation {
 	 * @return Collation
 	 */
 	static function factory( $collationName ) {
-		switch( $collationName ) {
+		switch ( $collationName ) {
 			case 'uppercase':
 				return new UppercaseCollation;
 			case 'identity':
@@ -49,7 +49,7 @@ abstract class Collation {
 				return new IcuCollation( 'root' );
 			default:
 				$match = array();
-				if ( preg_match( '/^uca-([a-z-]+)$/', $collationName, $match ) ) {
+				if ( preg_match( '/^uca-([a-z@=-]+)$/', $collationName, $match ) ) {
 					return new IcuCollation( $match[1] );
 				}
 
@@ -62,7 +62,7 @@ abstract class Collation {
 				}
 
 				// If all else fails...
-				throw new MWException( __METHOD__.": unknown collation type \"$collationName\"" );
+				throw new MWException( __METHOD__ . ": unknown collation type \"$collationName\"" );
 		}
 	}
 
@@ -214,6 +214,7 @@ class IcuCollation extends Collation {
 		'pt' => array(),
 		'ru' => array(),
 		'sv' => array( "Å", "Ä", "Ö" ),
+		'sv@collation=standard' => array( "Å", "Ä", "Ö" ),
 		'uk' => array( "Ґ", "Ь" ),
 		'vi' => array( "Ă", "Â", "Đ", "Ê", "Ô", "Ơ", "Ư" ),
 		// Not verified, but likely correct
@@ -235,6 +236,7 @@ class IcuCollation extends Collation {
 		'es' => array( "Ñ" ),
 		'et' => array( "Š", "Ž", "Õ", "Ä", "Ö", "Ü" ),
 		'eu' => array( "Ñ" ),
+		'fa' => array( "آ", "ء", "ه" ),
 		'fo' => array( "Á", "Ð", "Í", "Ó", "Ú", "Ý", "Æ", "Ø", "Å" ),
 		'fr' => array(),
 		'fur' => array( "À", "Á", "Â", "È", "Ì", "Ò", "Ù" ),
@@ -349,21 +351,21 @@ class IcuCollation extends Collation {
 		$cacheEntry = $cache->get( $cacheKey );
 
 		if ( $cacheEntry && isset( $cacheEntry['version'] )
-			&& $cacheEntry['version'] == self::FIRST_LETTER_VERSION ) 
-		{
+			&& $cacheEntry['version'] == self::FIRST_LETTER_VERSION
+		) {
 			$this->firstLetterData = $cacheEntry;
 			return $this->firstLetterData;
 		}
 
 		// Generate data from serialized data file
 
-		if ( isset ( self::$tailoringFirstLetters[$this->locale] ) ) {
+		if ( isset( self::$tailoringFirstLetters[$this->locale] ) ) {
 			$letters = wfGetPrecompiledData( "first-letters-root.ser" );
 			// Append additional characters
 			$letters = array_merge( $letters, self::$tailoringFirstLetters[$this->locale] );
 			// Remove unnecessary ones, if any
-			if ( isset( self::$tailoringFirstLetters[ '-' . $this->locale ] ) ) {
-				$letters = array_diff( $letters, self::$tailoringFirstLetters[ '-' . $this->locale ] );
+			if ( isset( self::$tailoringFirstLetters['-' . $this->locale] ) ) {
+				$letters = array_diff( $letters, self::$tailoringFirstLetters['-' . $this->locale] );
 			}
 		} else {
 			$letters = wfGetPrecompiledData( "first-letters-{$this->locale}.ser" );
@@ -430,7 +432,7 @@ class IcuCollation extends Collation {
 
 		$prev = false;
 		$duplicatePrefixes = array();
-		foreach( $letterMap as $key => $value ) {
+		foreach ( $letterMap as $key => $value ) {
 			// Remove terminator byte. Otherwise the prefix
 			// comparison will get hung up on that.
 			$trimmedKey = rtrim( $key, "\0" );
@@ -456,7 +458,7 @@ class IcuCollation extends Collation {
 			}
 			$prev = $trimmedKey;
 		}
-		foreach( $duplicatePrefixes as $badKey ) {
+		foreach ( $duplicatePrefixes as $badKey ) {
 			wfDebug( "Removing '{$letterMap[$badKey]}' from first letters." );
 			unset( $letterMap[$badKey] );
 			// This code assumes that unsetting does not change sort order.
diff --git a/includes/ConfEditor.php b/includes/ConfEditor.php
index 1d9ca921..67cb87db 100644
--- a/includes/ConfEditor.php
+++ b/includes/ConfEditor.php
@@ -278,19 +278,23 @@ class ConfEditor {
 	function getVars() {
 		$vars = array();
 		$this->parse();
-		foreach( $this->pathInfo as $path => $data ) {
-			if ( $path[0] != '$' )
+		foreach ( $this->pathInfo as $path => $data ) {
+			if ( $path[0] != '$' ) {
 				continue;
+			}
 			$trimmedPath = substr( $path, 1 );
 			$name = $data['name'];
-			if ( $name[0] == '@' )
+			if ( $name[0] == '@' ) {
 				continue;
-			if ( $name[0] == '$' )
+			}
+			if ( $name[0] == '$' ) {
 				$name = substr( $name, 1 );
+			}
 			$parentPath = substr( $trimmedPath, 0,
 				strlen( $trimmedPath ) - strlen( $name ) );
-			if( substr( $parentPath, -1 ) == '/' )
+			if ( substr( $parentPath, -1 ) == '/' ) {
 				$parentPath = substr( $parentPath, 0, -1 );
+			}
 
 			$value = substr( $this->text, $data['valueStartByte'],
 				$data['valueEndByte'] - $data['valueStartByte']
@@ -315,13 +319,15 @@ class ConfEditor {
 		$target =& $array;
 		if ( $path !== '' ) {
 			foreach ( $pathArr as $p ) {
-				if( !isset( $target[$p] ) )
+				if ( !isset( $target[$p] ) ) {
 					$target[$p] = array();
+				}
 				$target =& $target[$p];
 			}
 		}
-		if ( !isset( $target[$key] ) )
+		if ( !isset( $target[$key] ) ) {
 			$target[$key] = $value;
+		}
 	}
 
 	/**
@@ -329,25 +335,30 @@ class ConfEditor {
 	 * @return mixed Parsed value
 	 */
 	function parseScalar( $str ) {
-		if ( $str !== '' && $str[0] == '\'' )
+		if ( $str !== '' && $str[0] == '\'' ) {
 			// Single-quoted string
 			// @todo FIXME: trim() call is due to mystery bug where whitespace gets
 			// appended to the token; without it we ended up reading in the
 			// extra quote on the end!
 			return strtr( substr( trim( $str ), 1, -1 ),
 				array( '\\\'' => '\'', '\\\\' => '\\' ) );
-		if ( $str !== '' && $str[0] == '"' )
+		}
+		if ( $str !== '' && $str[0] == '"' ) {
 			// Double-quoted string
 			// @todo FIXME: trim() call is due to mystery bug where whitespace gets
 			// appended to the token; without it we ended up reading in the
 			// extra quote on the end!
 			return stripcslashes( substr( trim( $str ), 1, -1 ) );
-		if ( substr( $str, 0, 4 ) == 'true' )
+		}
+		if ( substr( $str, 0, 4 ) == 'true' ) {
 			return true;
-		if ( substr( $str, 0, 5 ) == 'false' )
+		}
+		if ( substr( $str, 0, 5 ) == 'false' ) {
 			return false;
-		if ( substr( $str, 0, 4 ) == 'null' )
+		}
+		if ( substr( $str, 0, 4 ) == 'null' ) {
 			return null;
+		}
 		// Must be some kind of numeric value, so let PHP's weak typing
 		// be useful for a change
 		return $str;
@@ -537,7 +548,7 @@ class ConfEditor {
 	 */
 	function getIndent( $pos, $key = false, $arrowPos = false ) {
 		$arrowIndent = ' ';
-		if ( $pos == 0 || $this->text[$pos-1] == "\n" ) {
+		if ( $pos == 0 || $this->text[$pos - 1] == "\n" ) {
 			$indentLength = strspn( $this->text, " \t", $pos );
 			$indent = substr( $this->text, $pos, $indentLength );
 		} else {
@@ -559,7 +570,7 @@ class ConfEditor {
 	public function parse() {
 		$this->initParse();
 		$this->pushState( 'file' );
-		$this->pushPath( '@extra-' . ($this->serial++) );
+		$this->pushPath( '@extra-' . ( $this->serial++ ) );
 		$token = $this->firstToken();
 
 		while ( !$token->isEnd() ) {
@@ -617,19 +628,21 @@ class ConfEditor {
 				$this->expect( '=' );
 				$this->skipSpace();
 				$this->startPathValue();
-				if ( $arrayAssign )
+				if ( $arrayAssign ) {
 					$this->pushState( 'expression', 'array assign end' );
-				else
+				} else {
 					$this->pushState( 'expression', 'statement end' );
+				}
 				break;
 			case 'array assign end':
 			case 'statement end':
 				$this->endPathValue();
-				if ( $state == 'array assign end' )
+				if ( $state == 'array assign end' ) {
 					$this->popPath();
+				}
 				$this->skipSpace();
 				$this->expect( ';' );
-				$this->nextPath( '@extra-' . ($this->serial++) );
+				$this->nextPath( '@extra-' . ( $this->serial++ ) );
 				break;
 			case 'expression':
 				$token = $this->skipSpace();
@@ -649,7 +662,7 @@ class ConfEditor {
 				$this->skipSpace();
 				$this->expect( '(' );
 				$this->skipSpace();
-				$this->pushPath( '@extra-' . ($this->serial++) );
+				$this->pushPath( '@extra-' . ( $this->serial++ ) );
 				if ( $this->isAhead( ')' ) ) {
 					// Empty array
 					$this->pushState( 'array end' );
@@ -681,7 +694,7 @@ class ConfEditor {
 					$this->endPathValue();
 					$this->markComma();
 					$this->nextToken();
-					$this->nextPath( '@extra-' . ($this->serial++) );
+					$this->nextPath( '@extra-' . ( $this->serial++ ) );
 					// Look ahead to find ending bracket
 					if ( $this->isAhead( ")" ) ) {
 						// Found ending bracket, no continuation
@@ -1056,7 +1069,7 @@ class ConfEditorParseError extends MWException {
 		$lines = StringUtils::explode( "\n", $text );
 		foreach ( $lines as $lineNum => $line ) {
 			if ( $lineNum == $this->lineNum - 1 ) {
-				return "$line\n" .str_repeat( ' ', $this->colNum - 1 ) . "^\n";
+				return "$line\n" . str_repeat( ' ', $this->colNum - 1 ) . "^\n";
 			}
 		}
 		return '';
diff --git a/includes/Cookie.php b/includes/Cookie.php
index 27a85072..ecf4667d 100644
--- a/includes/Cookie.php
+++ b/includes/Cookie.php
@@ -82,7 +82,8 @@ class Cookie {
 	 * http://publicsuffix.org/
 	 *
 	 * @todo fixme fails to detect 3-letter top-level domains
-	 * @todo fixme fails to detect 2-letter top-level domains for single-domain use (probably not a big problem in practice, but there are test cases)
+	 * @todo fixme fails to detect 2-letter top-level domains for single-domain use (probably
+	 * not a big problem in practice, but there are test cases)
 	 *
 	 * @param string $domain the domain to validate
 	 * @param string $originDomain (optional) the domain the cookie originates from
@@ -197,7 +198,7 @@ class CookieJar {
 	 * Set a cookie in the cookie jar. Make sure only one cookie per-name exists.
 	 * @see Cookie::set()
 	 */
-	public function setCookie ( $name, $value, $attr ) {
+	public function setCookie( $name, $value, $attr ) {
 		/* cookies: case insensitive, so this should work.
 		 * We'll still send the cookies back in the same case we got them, though.
 		 */
@@ -235,7 +236,7 @@ class CookieJar {
 	 * @param string $domain cookie's domain
 	 * @return null
 	 */
-	public function parseCookieResponseHeader ( $cookie, $domain ) {
+	public function parseCookieResponseHeader( $cookie, $domain ) {
 		$len = strlen( 'Set-Cookie:' );
 
 		if ( substr_compare( 'Set-Cookie:', $cookie, 0, $len, true ) === 0 ) {
diff --git a/includes/CryptRand.php b/includes/CryptRand.php
deleted file mode 100644
index d0305d8b..00000000
--- a/includes/CryptRand.php
+++ /dev/null
@@ -1,497 +0,0 @@
-<?php
-/**
- * A cryptographic random generator class used for generating secret keys
- *
- * This is based in part on Drupal code as well as what we used in our own code
- * prior to introduction of this class.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @author Daniel Friesen
- * @file
- */
-
-class MWCryptRand {
-
-	/**
-	 * Minimum number of iterations we want to make in our drift calculations.
-	 */
-	const MIN_ITERATIONS = 1000;
-
-	/**
-	 * Number of milliseconds we want to spend generating each separate byte
-	 * of the final generated bytes.
-	 * This is used in combination with the hash length to determine the duration
-	 * we should spend doing drift calculations.
-	 */
-	const MSEC_PER_BYTE = 0.5;
-
-	/**
-	 * Singleton instance for public use
-	 */
-	protected static $singleton = null;
-
-	/**
-	 * The hash algorithm being used
-	 */
-	protected $algo = null;
-
-	/**
-	 * The number of bytes outputted by the hash algorithm
-	 */
-	protected $hashLength = null;
-
-	/**
-	 * A boolean indicating whether the previous random generation was done using
-	 * cryptographically strong random number generator or not.
-	 */
-	protected $strong = null;
-
-	/**
-	 * Initialize an initial random state based off of whatever we can find
-	 */
-	protected function initialRandomState() {
-		// $_SERVER contains a variety of unstable user and system specific information
-		// It'll vary a little with each page, and vary even more with separate users
-		// It'll also vary slightly across different machines
-		$state = serialize( $_SERVER );
-
-		// To try vary the system information of the state a bit more
-		// by including the system's hostname into the state
-		$state .= wfHostname();
-
-		// Try to gather a little entropy from the different php rand sources
-		$state .= rand() . uniqid( mt_rand(), true );
-
-		// Include some information about the filesystem's current state in the random state
-		$files = array();
-
-		// We know this file is here so grab some info about ourselves
-		$files[] = __FILE__;
-
-		// We must also have a parent folder, and with the usual file structure, a grandparent
-		$files[] = __DIR__;
-		$files[] = dirname( __DIR__ );
-
-		// The config file is likely the most often edited file we know should be around
-		// so include its stat info into the state.
-		// The constant with its location will almost always be defined, as WebStart.php defines
-		// MW_CONFIG_FILE to $IP/LocalSettings.php unless being configured with MW_CONFIG_CALLBACK (eg. the installer)
-		if ( defined( 'MW_CONFIG_FILE' ) ) {
-			$files[] = MW_CONFIG_FILE;
-		}
-
-		foreach ( $files as $file ) {
-			wfSuppressWarnings();
-			$stat = stat( $file );
-			wfRestoreWarnings();
-			if ( $stat ) {
-				// stat() duplicates data into numeric and string keys so kill off all the numeric ones
-				foreach ( $stat as $k => $v ) {
-					if ( is_numeric( $k ) ) {
-						unset( $k );
-					}
-				}
-				// The absolute filename itself will differ from install to install so don't leave it out
-				if( ( $path = realpath( $file ) ) !== false ) {
-					$state .= $path;
-				} else {
-					$state .= $file;
-				}
-				$state .= implode( '', $stat );
-			} else {
-				// The fact that the file isn't there is worth at least a
-				// minuscule amount of entropy.
-				$state .= '0';
-			}
-		}
-
-		// Try and make this a little more unstable by including the varying process
-		// id of the php process we are running inside of if we are able to access it
-		if ( function_exists( 'getmypid' ) ) {
-			$state .= getmypid();
-		}
-
-		// If available try to increase the instability of the data by throwing in
-		// the precise amount of memory that we happen to be using at the moment.
-		if ( function_exists( 'memory_get_usage' ) ) {
-			$state .= memory_get_usage( true );
-		}
-
-		// It's mostly worthless but throw the wiki's id into the data for a little more variance
-		$state .= wfWikiID();
-
-		// If we have a secret key or proxy key set then throw it into the state as well
-		global $wgSecretKey, $wgProxyKey;
-		if ( $wgSecretKey ) {
-			$state .= $wgSecretKey;
-		} elseif ( $wgProxyKey ) {
-			$state .= $wgProxyKey;
-		}
-
-		return $state;
-	}
-
-	/**
-	 * Randomly hash data while mixing in clock drift data for randomness
-	 *
-	 * @param string $data The data to randomly hash.
-	 * @return String The hashed bytes
-	 * @author Tim Starling
-	 */
-	protected function driftHash( $data ) {
-		// Minimum number of iterations (to avoid slow operations causing the loop to gather little entropy)
-		$minIterations = self::MIN_ITERATIONS;
-		// Duration of time to spend doing calculations (in seconds)
-		$duration = ( self::MSEC_PER_BYTE / 1000 ) * $this->hashLength();
-		// Create a buffer to use to trigger memory operations
-		$bufLength = 10000000;
-		$buffer = str_repeat( ' ', $bufLength );
-		$bufPos = 0;
-
-		// Iterate for $duration seconds or at least $minIterations number of iterations
-		$iterations = 0;
-		$startTime = microtime( true );
-		$currentTime = $startTime;
-		while ( $iterations < $minIterations || $currentTime - $startTime < $duration ) {
-			// Trigger some memory writing to trigger some bus activity
-			// This may create variance in the time between iterations
-			$bufPos = ( $bufPos + 13 ) % $bufLength;
-			$buffer[$bufPos] = ' ';
-			// Add the drift between this iteration and the last in as entropy
-			$nextTime = microtime( true );
-			$delta = (int)( ( $nextTime - $currentTime ) * 1000000 );
-			$data .= $delta;
-			// Every 100 iterations hash the data and entropy
-			if ( $iterations % 100 === 0 ) {
-				$data = sha1( $data );
-			}
-			$currentTime = $nextTime;
-			$iterations++;
-		}
-		$timeTaken = $currentTime - $startTime;
-		$data = $this->hash( $data );
-
-		wfDebug( __METHOD__ . ": Clock drift calculation " .
-			"(time-taken=" . ( $timeTaken * 1000 ) . "ms, " .
-			"iterations=$iterations, " .
-			"time-per-iteration=" . ( $timeTaken / $iterations * 1e6 ) . "us)\n" );
-		return $data;
-	}
-
-	/**
-	 * Return a rolling random state initially build using data from unstable sources
-	 * @return string A new weak random state
-	 */
-	protected function randomState() {
-		static $state = null;
-		if ( is_null( $state ) ) {
-			// Initialize the state with whatever unstable data we can find
-			// It's important that this data is hashed right afterwards to prevent
-			// it from being leaked into the output stream
-			$state = $this->hash( $this->initialRandomState() );
-		}
-		// Generate a new random state based on the initial random state or previous
-		// random state by combining it with clock drift
-		$state = $this->driftHash( $state );
-		return $state;
-	}
-
-	/**
-	 * Decide on the best acceptable hash algorithm we have available for hash()
-	 * @throws MWException
-	 * @return String A hash algorithm
-	 */
-	protected function hashAlgo() {
-		if ( !is_null( $this->algo ) ) {
-			return $this->algo;
-		}
-
-		$algos = hash_algos();
-		$preference = array( 'whirlpool', 'sha256', 'sha1', 'md5' );
-
-		foreach ( $preference as $algorithm ) {
-			if ( in_array( $algorithm, $algos ) ) {
-				$this->algo = $algorithm;
-				wfDebug( __METHOD__ . ": Using the {$this->algo} hash algorithm.\n" );
-				return $this->algo;
-			}
-		}
-
-		// We only reach here if no acceptable hash is found in the list, this should
-		// be a technical impossibility since most of php's hash list is fixed and
-		// some of the ones we list are available as their own native functions
-		// But since we already require at least 5.2 and hash() was default in
-		// 5.1.2 we don't bother falling back to methods like sha1 and md5.
-		throw new MWException( "Could not find an acceptable hashing function in hash_algos()" );
-	}
-
-	/**
-	 * Return the byte-length output of the hash algorithm we are
-	 * using in self::hash and self::hmac.
-	 *
-	 * @return int Number of bytes the hash outputs
-	 */
-	protected function hashLength() {
-		if ( is_null( $this->hashLength ) ) {
-			$this->hashLength = strlen( $this->hash( '' ) );
-		}
-		return $this->hashLength;
-	}
-
-	/**
-	 * Generate an acceptably unstable one-way-hash of some text
-	 * making use of the best hash algorithm that we have available.
-	 *
-	 * @param $data string
-	 * @return String A raw hash of the data
-	 */
-	protected function hash( $data ) {
-		return hash( $this->hashAlgo(), $data, true );
-	}
-
-	/**
-	 * Generate an acceptably unstable one-way-hmac of some text
-	 * making use of the best hash algorithm that we have available.
-	 *
-	 * @param $data string
-	 * @param $key string
-	 * @return String A raw hash of the data
-	 */
-	protected function hmac( $data, $key ) {
-		return hash_hmac( $this->hashAlgo(), $data, $key, true );
-	}
-
-	/**
-	 * @see self::wasStrong()
-	 */
-	public function realWasStrong() {
-		if ( is_null( $this->strong ) ) {
-			throw new MWException( __METHOD__ . ' called before generation of random data' );
-		}
-		return $this->strong;
-	}
-
-	/**
-	 * @see self::generate()
-	 */
-	public function realGenerate( $bytes, $forceStrong = false ) {
-		wfProfileIn( __METHOD__ );
-
-		wfDebug( __METHOD__ . ": Generating cryptographic random bytes for " . wfGetAllCallers( 5 ) . "\n" );
-
-		$bytes = floor( $bytes );
-		static $buffer = '';
-		if ( is_null( $this->strong ) ) {
-			// Set strength to false initially until we know what source data is coming from
-			$this->strong = true;
-		}
-
-		if ( strlen( $buffer ) < $bytes ) {
-			// If available make use of mcrypt_create_iv URANDOM source to generate randomness
-			// On unix-like systems this reads from /dev/urandom but does it without any buffering
-			// and bypasses openbasedir restrictions, so it's preferable to reading directly
-			// On Windows starting in PHP 5.3.0 Windows' native CryptGenRandom is used to generate
-			// entropy so this is also preferable to just trying to read urandom because it may work
-			// on Windows systems as well.
-			if ( function_exists( 'mcrypt_create_iv' ) ) {
-				wfProfileIn( __METHOD__ . '-mcrypt' );
-				$rem = $bytes - strlen( $buffer );
-				$iv = mcrypt_create_iv( $rem, MCRYPT_DEV_URANDOM );
-				if ( $iv === false ) {
-					wfDebug( __METHOD__ . ": mcrypt_create_iv returned false.\n" );
-				} else {
-					$buffer .= $iv;
-					wfDebug( __METHOD__ . ": mcrypt_create_iv generated " . strlen( $iv ) . " bytes of randomness.\n" );
-				}
-				wfProfileOut( __METHOD__ . '-mcrypt' );
-			}
-		}
-
-		if ( strlen( $buffer ) < $bytes ) {
-			// If available make use of openssl's random_pseudo_bytes method to attempt to generate randomness.
-			// However don't do this on Windows with PHP < 5.3.4 due to a bug:
-			// http://stackoverflow.com/questions/1940168/openssl-random-pseudo-bytes-is-slow-php
-			// http://git.php.net/?p=php-src.git;a=commitdiff;h=cd62a70863c261b07f6dadedad9464f7e213cad5
-			if ( function_exists( 'openssl_random_pseudo_bytes' )
-				&& ( !wfIsWindows() || version_compare( PHP_VERSION, '5.3.4', '>=' ) )
-			) {
-				wfProfileIn( __METHOD__ . '-openssl' );
-				$rem = $bytes - strlen( $buffer );
-				$openssl_bytes = openssl_random_pseudo_bytes( $rem, $openssl_strong );
-				if ( $openssl_bytes === false ) {
-					wfDebug( __METHOD__ . ": openssl_random_pseudo_bytes returned false.\n" );
-				} else {
-					$buffer .= $openssl_bytes;
-					wfDebug( __METHOD__ . ": openssl_random_pseudo_bytes generated " . strlen( $openssl_bytes ) . " bytes of " . ( $openssl_strong ? "strong" : "weak" ) . " randomness.\n" );
-				}
-				if ( strlen( $buffer ) >= $bytes ) {
-					// openssl tells us if the random source was strong, if some of our data was generated
-					// using it use it's say on whether the randomness is strong
-					$this->strong = !!$openssl_strong;
-				}
-				wfProfileOut( __METHOD__ . '-openssl' );
-			}
-		}
-
-		// Only read from urandom if we can control the buffer size or were passed forceStrong
-		if ( strlen( $buffer ) < $bytes && ( function_exists( 'stream_set_read_buffer' ) || $forceStrong ) ) {
-			wfProfileIn( __METHOD__ . '-fopen-urandom' );
-			$rem = $bytes - strlen( $buffer );
-			if ( !function_exists( 'stream_set_read_buffer' ) && $forceStrong ) {
-				wfDebug( __METHOD__ . ": Was forced to read from /dev/urandom without control over the buffer size.\n" );
-			}
-			// /dev/urandom is generally considered the best possible commonly
-			// available random source, and is available on most *nix systems.
-			wfSuppressWarnings();
-			$urandom = fopen( "/dev/urandom", "rb" );
-			wfRestoreWarnings();
-
-			// Attempt to read all our random data from urandom
-			// php's fread always does buffered reads based on the stream's chunk_size
-			// so in reality it will usually read more than the amount of data we're
-			// asked for and not storing that risks depleting the system's random pool.
-			// If stream_set_read_buffer is available set the chunk_size to the amount
-			// of data we need. Otherwise read 8k, php's default chunk_size.
-			if ( $urandom ) {
-				// php's default chunk_size is 8k
-				$chunk_size = 1024 * 8;
-				if ( function_exists( 'stream_set_read_buffer' ) ) {
-					// If possible set the chunk_size to the amount of data we need
-					stream_set_read_buffer( $urandom, $rem );
-					$chunk_size = $rem;
-				}
-				$random_bytes = fread( $urandom, max( $chunk_size, $rem ) );
-				$buffer .= $random_bytes;
-				fclose( $urandom );
-				wfDebug( __METHOD__ . ": /dev/urandom generated " . strlen( $random_bytes ) . " bytes of randomness.\n" );
-				if ( strlen( $buffer ) >= $bytes ) {
-					// urandom is always strong, set to true if all our data was generated using it
-					$this->strong = true;
-				}
-			} else {
-				wfDebug( __METHOD__ . ": /dev/urandom could not be opened.\n" );
-			}
-			wfProfileOut( __METHOD__ . '-fopen-urandom' );
-		}
-
-		// If we cannot use or generate enough data from a secure source
-		// use this loop to generate a good set of pseudo random data.
-		// This works by initializing a random state using a pile of unstable data
-		// and continually shoving it through a hash along with a variable salt.
-		// We hash the random state with more salt to avoid the state from leaking
-		// out and being used to predict the /randomness/ that follows.
-		if ( strlen( $buffer ) < $bytes ) {
-			wfDebug( __METHOD__ . ": Falling back to using a pseudo random state to generate randomness.\n" );
-		}
-		while ( strlen( $buffer ) < $bytes ) {
-			wfProfileIn( __METHOD__ . '-fallback' );
-			$buffer .= $this->hmac( $this->randomState(), mt_rand() );
-			// This code is never really cryptographically strong, if we use it
-			// at all, then set strong to false.
-			$this->strong = false;
-			wfProfileOut( __METHOD__ . '-fallback' );
-		}
-
-		// Once the buffer has been filled up with enough random data to fulfill
-		// the request shift off enough data to handle the request and leave the
-		// unused portion left inside the buffer for the next request for random data
-		$generated = substr( $buffer, 0, $bytes );
-		$buffer = substr( $buffer, $bytes );
-
-		wfDebug( __METHOD__ . ": " . strlen( $buffer ) . " bytes of randomness leftover in the buffer.\n" );
-
-		wfProfileOut( __METHOD__ );
-		return $generated;
-	}
-
-	/**
-	 * @see self::generateHex()
-	 */
-	public function realGenerateHex( $chars, $forceStrong = false ) {
-		// hex strings are 2x the length of raw binary so we divide the length in half
-		// odd numbers will result in a .5 that leads the generate() being 1 character
-		// short, so we use ceil() to ensure that we always have enough bytes
-		$bytes = ceil( $chars / 2 );
-		// Generate the data and then convert it to a hex string
-		$hex = bin2hex( $this->generate( $bytes, $forceStrong ) );
-		// A bit of paranoia here, the caller asked for a specific length of string
-		// here, and it's possible (eg when given an odd number) that we may actually
-		// have at least 1 char more than they asked for. Just in case they made this
-		// call intending to insert it into a database that does truncation we don't
-		// want to give them too much and end up with their database and their live
-		// code having two different values because part of what we gave them is truncated
-		// hence, we strip out any run of characters longer than what we were asked for.
-		return substr( $hex, 0, $chars );
-	}
-
-	/** Publicly exposed static methods **/
-
-	/**
-	 * Return a singleton instance of MWCryptRand
-	 * @return MWCryptRand
-	 */
-	protected static function singleton() {
-		if ( is_null( self::$singleton ) ) {
-			self::$singleton = new self;
-		}
-		return self::$singleton;
-	}
-
-	/**
-	 * Return a boolean indicating whether or not the source used for cryptographic
-	 * random bytes generation in the previously run generate* call
-	 * was cryptographically strong.
-	 *
-	 * @return bool Returns true if the source was strong, false if not.
-	 */
-	public static function wasStrong() {
-		return self::singleton()->realWasStrong();
-	}
-
-	/**
-	 * Generate a run of (ideally) cryptographically random data and return
-	 * it in raw binary form.
-	 * You can use MWCryptRand::wasStrong() if you wish to know if the source used
-	 * was cryptographically strong.
-	 *
-	 * @param int $bytes the number of bytes of random data to generate
-	 * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
-	 *                          strong sources of entropy even if reading from them may steal
-	 *                          more entropy from the system than optimal.
-	 * @return String Raw binary random data
-	 */
-	public static function generate( $bytes, $forceStrong = false ) {
-		return self::singleton()->realGenerate( $bytes, $forceStrong );
-	}
-
-	/**
-	 * Generate a run of (ideally) cryptographically random data and return
-	 * it in hexadecimal string format.
-	 * You can use MWCryptRand::wasStrong() if you wish to know if the source used
-	 * was cryptographically strong.
-	 *
-	 * @param int $chars the number of hex chars of random data to generate
-	 * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
-	 *                          strong sources of entropy even if reading from them may steal
-	 *                          more entropy from the system than optimal.
-	 * @return String Hexadecimal random data
-	 */
-	public static function generateHex( $chars, $forceStrong = false ) {
-		return self::singleton()->realGenerateHex( $chars, $forceStrong );
-	}
-
-}
diff --git a/includes/DataUpdate.php b/includes/DataUpdate.php
index c1076b23..7b9ac281 100644
--- a/includes/DataUpdate.php
+++ b/includes/DataUpdate.php
@@ -78,7 +78,9 @@ abstract class DataUpdate implements DeferrableUpdate {
 	 * @throws Exception|null
 	 */
 	public static function runUpdates( $updates ) {
-		if ( empty( $updates ) ) return; # nothing to do
+		if ( empty( $updates ) ) {
+			return; # nothing to do
+		}
 
 		$open_transactions = array();
 		$exception = null;
diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php
index a56ef849..0fc59fb2 100644
--- a/includes/DefaultSettings.php
+++ b/includes/DefaultSettings.php
@@ -63,7 +63,7 @@ $wgConf = new SiteConfiguration;
  * MediaWiki version number
  * @since 1.2
  */
-$wgVersion = '1.21.3';
+$wgVersion = '1.22.0';
 
 /**
  * Name of the site. It must be changed in LocalSettings.php
@@ -171,14 +171,6 @@ $wgScriptExtension = '.php';
  */
 $wgScript = false;
 
-/**
- * The URL path to redirect.php. This is a script that is used by the Nostalgia
- * skin.
- *
- * Defaults to "{$wgScriptPath}/redirect{$wgScriptExtension}".
- */
-$wgRedirectScript = false;
-
 /**
  * The URL path to load.php.
  *
@@ -274,7 +266,6 @@ $wgAppleTouchIcon = false;
  *
  * @see wfTempDir()
  * @note Default changed to false in MediaWiki 1.20.
- *
  */
 $wgTmpDirectory = false;
 
@@ -317,7 +308,9 @@ $wgActionPaths = array();
  * @{
  */
 
-/** Uploads have to be specially set up to be secure */
+/**
+ * Uploads have to be specially set up to be secure
+ */
 $wgEnableUploads = false;
 
 /**
@@ -325,23 +318,21 @@ $wgEnableUploads = false;
  */
 $wgUploadStashMaxAge = 6 * 3600; // 6 hours
 
-/** Allows to move images and other media files */
+/**
+ * Allows to move images and other media files
+ */
 $wgAllowImageMoving = true;
 
 /**
  * Enable deferred upload tasks that use the job queue.
  * Only enable this if job runners are set up for both the
  * 'AssembleUploadChunks' and 'PublishStashedFile' job types.
+ *
+ * @note If you use suhosin, this setting is incompatible with
+ *   suhosin.session.encrypt.
  */
 $wgEnableAsyncUploads = false;
 
-/**
- * Allow chunked uploads.  This should only really be needed if you
- * use the UploadWizard extension or allow huge file uploads.
- * https://www.mediawiki.org/wiki/API:Upload#Chunked_uploading
- */
-$wgAllowChunkedUploads = false;
-
 /**
  * These are additional characters that should be replaced with '-' in filenames
  */
@@ -456,7 +447,9 @@ $wgImgAuthPublicTest = true;
  */
 $wgLocalFileRepo = false;
 
-/** @see $wgLocalFileRepo */
+/**
+ * @see $wgLocalFileRepo
+ */
 $wgForeignFileRepos = array();
 
 /**
@@ -512,11 +505,11 @@ $wgFileBackends = array();
 $wgLockManagers = array();
 
 /**
- * Show EXIF data, on by default if available.
- * Requires PHP's EXIF extension: http://www.php.net/manual/en/ref.exif.php
+ * Show Exif data, on by default if available.
+ * Requires PHP's Exif extension: http://www.php.net/manual/en/ref.exif.php
  *
  * @note FOR WINDOWS USERS:
- * To enable EXIF functions, add the following lines to the "Windows
+ * To enable Exif functions, add the following lines to the "Windows
  * extensions" section of php.ini:
  * @code{.ini}
  * extension=extensions/php_mbstring.dll
@@ -547,22 +540,36 @@ $wgUpdateCompatibleMetadata = false;
  */
 $wgUseSharedUploads = false;
 
-/** Full path on the web server where shared uploads can be found */
+/**
+ * Full path on the web server where shared uploads can be found
+ */
 $wgSharedUploadPath = "http://commons.wikimedia.org/shared/images";
 
-/** Fetch commons image description pages and display them on the local wiki? */
+/**
+ * Fetch commons image description pages and display them on the local wiki?
+ */
 $wgFetchCommonsDescriptions = false;
 
-/** Path on the file system where shared uploads can be found. */
+/**
+ * Path on the file system where shared uploads can be found.
+ */
 $wgSharedUploadDirectory = "/var/www/wiki3/images";
 
-/** DB name with metadata about shared directory. Set this to false if the uploads do not come from a wiki. */
+/**
+ * DB name with metadata about shared directory.
+ * Set this to false if the uploads do not come from a wiki.
+ */
 $wgSharedUploadDBname = false;
 
-/** Optional table prefix used in database. */
+/**
+ * Optional table prefix used in database.
+ */
 $wgSharedUploadDBprefix = '';
 
-/** Cache shared metadata in memcached. Don't do this if the commons wiki is in a different memcached domain */
+/**
+ * Cache shared metadata in memcached.
+ * Don't do this if the commons wiki is in a different memcached domain
+ */
 $wgCacheSharedUploads = true;
 
 /**
@@ -598,6 +605,27 @@ $wgCopyUploadsFromSpecialUpload = false;
  */
 $wgCopyUploadProxy = false;
 
+/**
+ * Different timeout for upload by url
+ * This could be useful since when fetching large files, you may want a
+ * timeout longer than the default $wgHTTPTimeout. False means fallback
+ * to default.
+ *
+ * @since 1.22
+ */
+$wgCopyUploadTimeout = false;
+
+/**
+ * Different timeout for upload by url when run as a background job
+ * This could be useful since when fetching large files via job queue,
+ * you may want a different timeout, especially because there is no
+ * http request being kept alive.
+ *
+ * false means fallback to $wgCopyUploadTimeout.
+ * @since 1.22
+ */
+$wgCopyUploadAsyncTimeout = false;
+
 /**
  * Max size for uploads, in bytes. If not set to an array, applies to all
  * uploads. If set to an array, per upload type maximums can be set, using the
@@ -613,7 +641,6 @@ $wgCopyUploadProxy = false;
  * @endcode
  * Sets the maximum for all uploads to 250 kB except for upload-by-url, which
  * will have a maximum of 500 kB.
- *
  */
 $wgMaxUploadSize = 1024 * 1024 * 100; # 100MB
 
@@ -648,6 +675,7 @@ $wgUploadMissingFileUrl = false;
  * @endcode
  */
 $wgThumbnailScriptPath = false;
+
 /**
  * @see $wgThumbnailScriptPath
  */
@@ -699,7 +727,7 @@ $wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg' );
  * Files with these extensions will never be allowed as uploads.
  * An array of file extensions to blacklist. You should append to this array
  * if you want to blacklist additional files.
- * */
+ */
 $wgFileBlacklist = array(
 	# HTML may contain cookie-stealing JavaScript and web bugs
 	'html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht',
@@ -826,15 +854,25 @@ $wgContentHandlers = array(
  * Use Image Magick instead of PHP builtin functions.
  */
 $wgUseImageMagick = false;
-/** The convert command shipped with ImageMagick */
+
+/**
+ * The convert command shipped with ImageMagick
+ */
 $wgImageMagickConvertCommand = '/usr/bin/convert';
-/** The identify command shipped with ImageMagick */
+
+/**
+ * The identify command shipped with ImageMagick
+ */
 $wgImageMagickIdentifyCommand = '/usr/bin/identify';
 
-/** Sharpening parameter to ImageMagick */
+/**
+ * Sharpening parameter to ImageMagick
+ */
 $wgSharpenParameter = '0x0.4';
 
-/** Reduction in linear dimensions below which sharpening will be enabled */
+/**
+ * Reduction in linear dimensions below which sharpening will be enabled
+ */
 $wgSharpenReductionThreshold = 0.85;
 
 /**
@@ -857,15 +895,15 @@ $wgImageMagickTempDir = false;
  */
 $wgCustomConvertCommand = false;
 
-/** used for lossless jpeg rotation
+/**
+ * used for lossless jpeg rotation
  *
  * @since 1.21
- * **/
+ */
 $wgJpegTran = '/usr/bin/jpegtran';
 
-
 /**
- * Some tests and extensions use exiv2 to manipulate the EXIF metadata in some
+ * Some tests and extensions use exiv2 to manipulate the Exif metadata in some
  * image formats.
  */
 $wgExiv2Command = '/usr/bin/exiv2';
@@ -889,16 +927,23 @@ $wgSVGConverters = array(
 	'ImagickExt' => array( 'SvgHandler::rasterizeImagickExt' ),
 );
 
-/** Pick a converter defined in $wgSVGConverters */
+/**
+ * Pick a converter defined in $wgSVGConverters
+ */
 $wgSVGConverter = 'ImageMagick';
 
-/** If not in the executable PATH, specify the SVG converter path. */
+/**
+ * If not in the executable PATH, specify the SVG converter path.
+ */
 $wgSVGConverterPath = '';
 
-/** Don't scale a SVG larger than this */
+/**
+ * Don't scale a SVG larger than this
+ */
 $wgSVGMaxSize = 2048;
 
-/** Don't read SVG metadata beyond this point.
+/**
+ * Don't read SVG metadata beyond this point.
  * Default is 1024*256 bytes
  */
 $wgSVGMetadataCutoff = 262144;
@@ -930,6 +975,7 @@ $wgAllowTitlesInSVG = false;
  * 12.5 million pixels or 3500x3500.
  */
 $wgMaxImageArea = 1.25e7;
+
 /**
  * Force thumbnailing of animated GIFs above this size to a single
  * frame instead of an animated thumbnail.  As of MW 1.17 this limit
@@ -937,6 +983,7 @@ $wgMaxImageArea = 1.25e7;
  * It probably makes sense to keep this equal to $wgMaxImageArea.
  */
 $wgMaxAnimatedGifArea = 1.25e7;
+
 /**
  * Browsers don't support TIFF inline generally...
  * For inline display, we need to convert to PNG or JPEG.
@@ -987,7 +1034,9 @@ $wgGenerateThumbnailOnParse = true;
  */
 $wgShowArchiveThumbnails = true;
 
-/** Obsolete, always true, kept for compatibility with extensions */
+/**
+ * Obsolete, always true, kept for compatibility with extensions
+ */
 $wgUseImageResize = true;
 
 /**
@@ -1053,29 +1102,31 @@ $wgAntivirusSetup = array(
 	),
 );
 
-/** Determines if a failed virus scan (AV_SCAN_FAILED) will cause the file to be rejected. */
+/**
+ * Determines if a failed virus scan (AV_SCAN_FAILED) will cause the file to be rejected.
+ */
 $wgAntivirusRequired = true;
 
-/** Determines if the mime type of uploaded files should be checked */
+/**
+ * Determines if the mime type of uploaded files should be checked
+ */
 $wgVerifyMimeType = true;
 
-/** Sets the mime type definition file to use by MimeMagic.php. */
+/**
+ * Sets the mime type definition file to use by MimeMagic.php.
+ * Set to null, to use built-in defaults only.
+ * example: $wgMimeTypeFile = '/etc/mime.types';
+ */
 $wgMimeTypeFile = 'includes/mime.types';
-#$wgMimeTypeFile = '/etc/mime.types';
-#$wgMimeTypeFile = null; #use built-in defaults only.
-
-/** Sets the mime type info file to use by MimeMagic.php. */
-$wgMimeInfoFile = 'includes/mime.info';
-#$wgMimeInfoFile = null; #use built-in defaults only.
 
 /**
- * Switch for loading the FileInfo extension by PECL at runtime.
- * This should be used only if fileinfo is installed as a shared object
- * or a dynamic library.
+ * Sets the mime type info file to use by MimeMagic.php.
+ * Set to null, to use built-in defaults only.
  */
-$wgLoadFileinfoExtension = false;
+$wgMimeInfoFile = 'includes/mime.info';
 
-/** Sets an external mime detector program. The command must print only
+/**
+ * Sets an external mime detector program. The command must print only
  * the mime type to standard output.
  * The name of the file to process will be appended to the command given here.
  * If not set or NULL, mime_content_type will be used if available.
@@ -1145,6 +1196,7 @@ $wgGalleryOptions = array(
 	'imageHeight' => 120, // Height of the cells containing images in galleries (in "px")
 	'captionLength' => 25, // Length of caption to truncate (in characters)
 	'showBytes' => true, // Show the filesize in bytes in categories
+	'mode' => 'traditional',
 );
 
 /**
@@ -1173,25 +1225,26 @@ $wgResponsiveImages = true;
  * @name DJVU settings
  * @{
  */
+
 /**
  * Path of the djvudump executable
  * Enable this and $wgDjvuRenderer to enable djvu rendering
+ * example: $wgDjvuDump = 'djvudump';
  */
-# $wgDjvuDump = 'djvudump';
 $wgDjvuDump = null;
 
 /**
  * Path of the ddjvu DJVU renderer
  * Enable this and $wgDjvuDump to enable djvu rendering
+ * example: $wgDjvuRenderer = 'ddjvu';
  */
-# $wgDjvuRenderer = 'ddjvu';
 $wgDjvuRenderer = null;
 
 /**
  * Path of the djvutxt DJVU text extraction utility
  * Enable this and $wgDjvuDump to enable text layer extraction from djvu files
+ * example: $wgDjvuTxt = 'djvutxt';
  */
-# $wgDjvuTxt = 'djvutxt';
 $wgDjvuTxt = null;
 
 /**
@@ -1216,10 +1269,12 @@ $wgDjvuToXML = null;
  * Set this to false to output the ppm file directly.
  */
 $wgDjvuPostProcessor = 'pnmtojpeg';
+
 /**
  * File extension for the DJVU post processor output
  */
 $wgDjvuOutputExtension = 'jpg';
+
 /** @} */ # end of DJvu }
 
 /** @} */ # end of file uploads }
@@ -1334,7 +1389,8 @@ $wgAllowHTMLEmail = false;
 $wgEnotifFromEditor = false;
 
 // TODO move UPO to preferences probably ?
-# If set to true, users get a corresponding option in their preferences and can choose to enable or disable at their discretion
+# If set to true, users get a corresponding option in their preferences and can choose to
+# enable or disable at their discretion
 # If set to false, the corresponding input form on the user preference page is suppressed
 # It call this to be a "user-preferences-option (UPO)"
 
@@ -1400,33 +1456,61 @@ $wgEnotifUseRealName = false;
  */
 $wgUsersNotifiedOnAllChanges = array();
 
-
 /** @} */ # end of email settings
 
 /************************************************************************//**
  * @name   Database settings
  * @{
  */
-/** Database host name or IP address */
+
+/**
+ * Database host name or IP address
+ */
 $wgDBserver = 'localhost';
-/** Database port number (for PostgreSQL) */
+
+/**
+ * Database port number (for PostgreSQL)
+ */
 $wgDBport = 5432;
-/** Name of the database */
+
+/**
+ * Name of the database
+ */
 $wgDBname = 'my_wiki';
-/** Database username */
+
+/**
+ * Database username
+ */
 $wgDBuser = 'wikiuser';
-/** Database user's password */
+
+/**
+ * Database user's password
+ */
 $wgDBpassword = '';
-/** Database type */
+
+/**
+ * Database type
+ */
 $wgDBtype = 'mysql';
-/** Whether to use SSL in DB connection. */
+
+/**
+ * Whether to use SSL in DB connection.
+ */
 $wgDBssl = false;
-/** Whether to use compression in DB connection. */
+
+/**
+ * Whether to use compression in DB connection.
+ */
 $wgDBcompress = false;
 
-/** Separate username for maintenance tasks. Leave as null to use the default. */
+/**
+ * Separate username for maintenance tasks. Leave as null to use the default.
+ */
 $wgDBadminuser = null;
-/** Separate password for maintenance tasks. Leave as null to use the default. */
+
+/**
+ * Separate password for maintenance tasks. Leave as null to use the default.
+ */
 $wgDBadminpassword = null;
 
 /**
@@ -1437,9 +1521,23 @@ $wgDBadminpassword = null;
  */
 $wgSearchType = null;
 
-/** Table name prefix */
+/**
+ * Alternative search types
+ * Sometimes you want to support multiple search engines for testing. This
+ * allows users to select their search engine of choice via url parameters
+ * to Special:Search and the action=search API. If using this, there's no
+ * need to add $wgSearchType to it, that is handled automatically.
+ */
+$wgSearchTypeAlternatives = null;
+
+/**
+ * Table name prefix
+ */
 $wgDBprefix = '';
-/** MySQL table options to use during installation or update */
+
+/**
+ * MySQL table options to use during installation or update
+ */
 $wgDBTableOptions = 'ENGINE=InnoDB';
 
 /**
@@ -1450,10 +1548,14 @@ $wgDBTableOptions = 'ENGINE=InnoDB';
  */
 $wgSQLMode = '';
 
-/** Mediawiki schema */
+/**
+ * Mediawiki schema
+ */
 $wgDBmwschema = 'mediawiki';
 
-/** To override default SQLite data directory ($docroot/../data) */
+/**
+ * To override default SQLite data directory ($docroot/../data)
+ */
 $wgSQLiteDataDir = '';
 
 /**
@@ -1487,9 +1589,14 @@ $wgAllDBsAreLocalhost = false;
  */
 $wgSharedDB = null;
 
-/** @see $wgSharedDB */
+/**
+ * @see $wgSharedDB
+ */
 $wgSharedPrefix = false;
-/** @see $wgSharedDB */
+
+/**
+ * @see $wgSharedDB
+ */
 $wgSharedTables = array( 'user', 'user_properties' );
 
 /**
@@ -1509,11 +1616,11 @@ $wgSharedTables = array( 'user', 'user_properties' );
  *                  - DBO_DEFAULT -- turns on DBO_TRX only if !$wgCommandLineMode (recommended)
  *                  - DBO_DEBUG -- equivalent of $wgDebugDumpSql
  *                  - DBO_TRX -- wrap entire request in a transaction
- *                  - DBO_IGNORE -- ignore errors (not useful in LocalSettings.php)
  *                  - DBO_NOBUFFER -- turn off buffering (not useful in LocalSettings.php)
  *                  - DBO_PERSISTENT -- enables persistent database connections
  *                  - DBO_SSL -- uses SSL/TLS encryption in database connections, if available
- *                  - DBO_COMPRESS -- uses internal compression in database connections, if available
+ *                  - DBO_COMPRESS -- uses internal compression in database connections,
+ *                                    if available
  *
  *   - max lag:     (optional) Maximum replication lag before a slave will taken out of rotation
  *   - max threads: (optional) Maximum number of running threads
@@ -1552,10 +1659,14 @@ $wgDBservers = false;
  */
 $wgLBFactoryConf = array( 'class' => 'LBFactory_Simple' );
 
-/** How long to wait for a slave to catch up to the master */
+/**
+ * How long to wait for a slave to catch up to the master
+ */
 $wgMasterWaitTimeout = 10;
 
-/** File to log database errors to */
+/**
+ * File to log database errors to
+ */
 $wgDBerrorLog = false;
 
 /**
@@ -1578,7 +1689,9 @@ $wgDBerrorLog = false;
  */
 $wgDBerrorLogTZ = false;
 
-/** When to give an error message */
+/**
+ * When to give an error message
+ */
 $wgDBClusterTimeout = 10;
 
 /**
@@ -1606,6 +1719,35 @@ $wgDBAvgStatusPoll = 2000;
  */
 $wgDBmysql5 = false;
 
+/**
+ * Set true to enable Oracle DCRP (supported from 11gR1 onward)
+ *
+ * To use this feature set to true and use a datasource defined as
+ * POOLED (i.e. in tnsnames definition set server=pooled in connect_data
+ * block).
+ *
+ * Starting from 11gR1 you can use DCRP (Database Resident Connection
+ * Pool) that maintains established sessions and reuses them on new
+ * connections.
+ *
+ * Not completely tested, but it should fall back on normal connection
+ * in case the pool is full or the datasource is not configured as
+ * pooled.
+ * And the other way around; using oci_pconnect on a non pooled
+ * datasource should produce a normal connection.
+ *
+ * When it comes to frequent shortlived DB connections like with MW
+ * Oracle tends to s***. The problem is the driver connects to the
+ * database reasonably fast, but establishing a session takes time and
+ * resources. MW does not rely on session state (as it does not use
+ * features such as package variables) so establishing a valid session
+ * is in this case an unwanted overhead that just slows things down.
+ *
+ * @warning EXPERIMENTAL!
+ *
+ */
+$wgDBOracleDRCP = false;
+
 /**
  * Other wikis on this site, can be administered from a single developer
  * account.
@@ -1619,13 +1761,11 @@ $wgLocalDatabases = array();
  * show a more obvious warning.
  */
 $wgSlaveLagWarning = 10;
-/** @see $wgSlaveLagWarning */
-$wgSlaveLagCritical = 30;
 
 /**
- * Use old names for change_tags indices.
+ * @see $wgSlaveLagWarning
  */
-$wgOldChangeTagsIndex = false;
+$wgSlaveLagCritical = 30;
 
 /**@}*/ # End of DB settings }
 
@@ -1637,8 +1777,8 @@ $wgOldChangeTagsIndex = false;
 /**
  * We can also compress text stored in the 'text' table. If this is set on, new
  * revisions will be compressed on page save if zlib support is available. Any
- * compressed revisions will be decompressed on load regardless of this setting
- * *but will not be readable at all* if zlib support is not available.
+ * compressed revisions will be decompressed on load regardless of this setting,
+ * but will not be readable at all* if zlib support is not available.
  */
 $wgCompressRevisions = false;
 
@@ -1701,23 +1841,36 @@ $wgRevisionCacheExpiry = 0;
  * @name   Performance hacks and limits
  * @{
  */
-/** Disable database-intensive features */
+
+/**
+ * Disable database-intensive features
+ */
 $wgMiserMode = false;
-/** Disable all query pages if miser mode is on, not just some */
+
+/**
+ * Disable all query pages if miser mode is on, not just some
+ */
 $wgDisableQueryPages = false;
-/** Number of rows to cache in 'querycache' table when miser mode is on */
+
+/**
+ * Number of rows to cache in 'querycache' table when miser mode is on
+ */
 $wgQueryCacheLimit = 1000;
-/** Number of links to a page required before it is deemed "wanted" */
+
+/**
+ * Number of links to a page required before it is deemed "wanted"
+ */
 $wgWantedPagesThreshold = 1;
-/** Enable slow parser functions */
+
+/**
+ * Enable slow parser functions
+ */
 $wgAllowSlowParserFunctions = false;
-/** Allow schema updates */
-$wgAllowSchemaUpdates = true;
 
 /**
- * Do DELETE/INSERT for link updates instead of incremental
+ * Allow schema updates
  */
-$wgUseDumbLinkUpdate = false;
+$wgAllowSchemaUpdates = true;
 
 /**
  * Anti-lock flags - bitfield
@@ -1886,11 +2039,15 @@ $wgObjectCacheSessionExpiry = 3600;
  */
 $wgSessionHandler = null;
 
-/** If enabled, will send MemCached debugging information to $wgDebugLogFile */
+/**
+ * If enabled, will send MemCached debugging information to $wgDebugLogFile
+ */
 $wgMemCachedDebug = false;
 
-/** The list of MemCached servers and port numbers */
-$wgMemCachedServers = array( '127.0.0.1:11000' );
+/**
+ * The list of MemCached servers and port numbers
+ */
+$wgMemCachedServers = array( '127.0.0.1:11211' );
 
 /**
  * Use persistent connections to MemCached, which are shared across multiple
@@ -1909,13 +2066,6 @@ $wgMemCachedTimeout = 500000;
  */
 $wgUseLocalMessageCache = false;
 
-/**
- * Defines format of local cache.
- *  - true: Serialized object
- *  - false: PHP source file (Warning - security risk)
- */
-$wgLocalMessageCacheSerialized = true;
-
 /**
  * Instead of caching everything, only cache those messages which have
  * been customised in the site content language. This means that
@@ -1952,7 +2102,9 @@ $wgLocalisationCacheConf = array(
 	'manualRecache' => false,
 );
 
-/** Allow client-side caching of pages */
+/**
+ * Allow client-side caching of pages
+ */
 $wgCachePages = true;
 
 /**
@@ -2038,7 +2190,8 @@ $wgUseGzip = false;
  */
 $wgUseETag = false;
 
-/** Clock skew or the one-second resolution of time() can occasionally cause cache
+/**
+ * Clock skew or the one-second resolution of time() can occasionally cause cache
  * problems when the user requests two pages within a short period of time. This
  * variable adds a given number of seconds to vulnerable timestamps, thereby giving
  * a grace period.
@@ -2077,13 +2230,18 @@ $wgInvalidateCacheOnLocalSettingsChange = true;
  */
 $wgUseSquid = false;
 
-/** If you run Squid3 with ESI support, enable this (default:false): */
+/**
+ * If you run Squid3 with ESI support, enable this (default:false):
+ */
 $wgUseESI = false;
 
-/** Send X-Vary-Options header for better caching (requires patched Squid) */
+/**
+ * Send X-Vary-Options header for better caching (requires patched Squid)
+ */
 $wgUseXVO = false;
 
-/** Add X-Forwarded-Proto to the Vary and X-Vary-Options headers for API
+/**
+ * Add X-Forwarded-Proto to the Vary and X-Vary-Options headers for API
  * requests and RSS/Atom feeds. Use this if you have an SSL termination setup
  * and need to split the cache between HTTP and HTTPS for API requests,
  * feed requests and HTTP redirect responses in order to prevent cache
@@ -2131,7 +2289,9 @@ $wgSquidServers = array();
  */
 $wgSquidServersNoPurge = array();
 
-/** Maximum number of titles to purge in any one client operation */
+/**
+ * Maximum number of titles to purge in any one client operation
+ */
 $wgMaxSquidPurgeTitles = 400;
 
 /**
@@ -2163,12 +2323,12 @@ $wgSquidPurgeUseHostHeader = true;
  * Each key in this array is a regular expression to match against the purged
  * URL, or an empty string to match all URLs. The purged URL is matched against
  * the regexes in the order specified, and the first rule whose regex matches
- * is used.
+ * is used, all remaining rules will thus be ignored.
  *
- * Example configuration to send purges for upload.wikimedia.org to one
+ * @par Example configuration to send purges for upload.wikimedia.org to one
  * multicast group and all other purges to another:
  * @code
- * $wgHTCPMulticastRouting = array(
+ * $wgHTCPRouting = array(
  *         '|^https?://upload\.wikimedia\.org|' => array(
  *                 'host' => '239.128.0.113',
  *                 'port' => 4827,
@@ -2180,11 +2340,44 @@ $wgSquidPurgeUseHostHeader = true;
  * );
  * @endcode
  *
- * @since 1.20
+ * You can also pass an array of hosts to send purges too. This is useful when
+ * you have several multicast groups or unicast address that should receive a
+ * given purge.  Multiple hosts support was introduced in MediaWiki 1.22.
+ *
+ * @par Example of sending purges to multiple hosts:
+ * @code
+ * $wgHTCPRouting = array(
+ *     '' => array(
+ *         // Purges to text caches using multicast
+ *         array( 'host' => '239.128.0.114', 'port' => '4827' ),
+ *         // Purges to a hardcoded list of caches
+ *         array( 'host' => '10.88.66.1', 'port' => '4827' ),
+ *         array( 'host' => '10.88.66.2', 'port' => '4827' ),
+ *         array( 'host' => '10.88.66.3', 'port' => '4827' ),
+ *     ),
+ * );
+ * @endcode
+ *
+ * @since 1.22
+ *
+ * $wgHTCPRouting replaces $wgHTCPMulticastRouting that was introduced in 1.20.
+ * For back compatibility purposes, whenever its array is empty
+ * $wgHTCPMutlicastRouting will be used as a fallback if it not null.
  *
  * @see $wgHTCPMulticastTTL
  */
-$wgHTCPMulticastRouting = array();
+$wgHTCPRouting = array();
+
+/**
+ * @deprecated since 1.22, please use $wgHTCPRouting instead.
+ *
+ * Whenever this is set and $wgHTCPRouting evaluates to false, $wgHTCPRouting
+ * will be set to this value.
+ * This is merely for back compatibility.
+ *
+ * @since 1.20
+ */
+$wgHTCPMulticastRouting = null;
 
 /**
  * HTCP multicast address. Set this to a multicast IP address to enable HTCP.
@@ -2192,29 +2385,34 @@ $wgHTCPMulticastRouting = array();
  * Note that MediaWiki uses the old non-RFC compliant HTCP format, which was
  * present in the earliest Squid implementations of the protocol.
  *
- * This setting is DEPRECATED in favor of $wgHTCPMulticastRouting , and kept
- * for backwards compatibility only. If $wgHTCPMulticastRouting is set, this
- * setting is ignored. If $wgHTCPMulticastRouting is not set and this setting
- * is, it is used to populate $wgHTCPMulticastRouting.
+ * This setting is DEPRECATED in favor of $wgHTCPRouting , and kept for
+ * backwards compatibility only. If $wgHTCPRouting is set, this setting is
+ * ignored. If $wgHTCPRouting is not set and this setting is, it is used to
+ * populate $wgHTCPRouting.
  *
- * @deprecated since 1.20 in favor of $wgHTCPMulticastRouting
+ * @deprecated since 1.20 in favor of $wgHTCPMulticastRouting and since 1.22 in
+ * favor of $wgHTCPRouting.
  */
 $wgHTCPMulticastAddress = false;
 
 /**
  * HTCP multicast port.
- * @deprecated since 1.20 in favor of $wgHTCPMulticastRouting
+ * @deprecated since 1.20 in favor of $wgHTCPMulticastRouting and since 1.22 in
+ * favor of $wgHTCPRouting.
+ *
  * @see $wgHTCPMulticastAddress
  */
 $wgHTCPPort = 4827;
 
 /**
  * HTCP multicast TTL.
- * @see $wgHTCPMulticastRouting
+ * @see $wgHTCPRouting
  */
 $wgHTCPMulticastTTL = 1;
 
-/** Should forwarded Private IPs be accepted? */
+/**
+ * Should forwarded Private IPs be accepted?
+ */
 $wgUsePrivateIPs = false;
 
 /** @} */ # end of HTTP proxy settings
@@ -2258,13 +2456,19 @@ $wgLangObjCacheSize = 10;
  */
 $wgGrammarForms = array();
 
-/** Treat language links as magic connectors, not inline links */
+/**
+ * Treat language links as magic connectors, not inline links
+ */
 $wgInterwikiMagic = true;
 
-/** Hide interlanguage links from the sidebar */
+/**
+ * Hide interlanguage links from the sidebar
+ */
 $wgHideInterlanguageLinks = false;
 
-/** List of language names or overrides for default names in Names.php */
+/**
+ * List of language names or overrides for default names in Names.php
+ */
 $wgExtraLanguageNames = array();
 
 /**
@@ -2364,7 +2568,8 @@ $wgBrowserBlackList = array(
 	'/^Mozilla\/4\.[^ ]+ [^(]*?\((?!compatible).*; [UIN]/',
 
 	/**
-	 * MSIE on Mac OS 9 is teh sux0r, converts þ to <thorn>, ð to <eth>, Þ to <THORN> and Ð to <ETH>
+	 * MSIE on Mac OS 9 is teh sux0r, converts þ to <thorn>, ð to <eth>,
+	 * Þ to <THORN> and Ð to <ETH>
 	 *
 	 * Known useragents:
 	 * - Mozilla/4.0 (compatible; MSIE 5.0; Mac_PowerPC)
@@ -2372,7 +2577,7 @@ $wgBrowserBlackList = array(
 	 * - Mozilla/4.0 (compatible; MSIE 5.23; Mac_PowerPC)
 	 * - [...]
 	 *
-	 * @link http://en.wikipedia.org/w/index.php?title=User%3A%C6var_Arnfj%F6r%F0_Bjarmason%2Ftestme&diff=12356041&oldid=12355864
+	 * @link http://en.wikipedia.org/w/index.php?diff=12356041&oldid=12355864
 	 * @link http://en.wikipedia.org/wiki/Template%3AOS9
 	 */
 	'/^Mozilla\/4\.0 \(compatible; MSIE \d+\.\d+; Mac_PowerPC\)/',
@@ -2403,6 +2608,7 @@ $wgLegacySchemaConversion = false;
  * the interface is set to English.
  */
 $wgAmericanDates = false;
+
 /**
  * For Hindi and Arabic use local numerals instead of Western style (0-9)
  * numerals in interface.
@@ -2425,16 +2631,24 @@ $wgMsgCacheExpiry = 86400;
  */
 $wgMaxMsgCacheEntrySize = 10000;
 
-/** Whether to enable language variant conversion. */
+/**
+ * Whether to enable language variant conversion.
+ */
 $wgDisableLangConversion = false;
 
-/** Whether to enable language variant conversion for links. */
+/**
+ * Whether to enable language variant conversion for links.
+ */
 $wgDisableTitleConversion = false;
 
-/** Whether to enable canonical language links in meta data. */
+/**
+ * Whether to enable canonical language links in meta data.
+ */
 $wgCanonicalLanguageLinks = true;
 
-/** Default variant code, if false, the default will be the language code */
+/**
+ * Default variant code, if false, the default will be the language code
+ */
 $wgDefaultLanguageVariant = false;
 
 /**
@@ -2538,52 +2752,44 @@ $wgLocalTZoffset = null;
  * @{
  */
 
-/** The default Content-Type header. */
-$wgMimeType = 'text/html';
-
-/**
- * The content type used in script tags.  This is mostly going to be ignored if
- * $wgHtml5 is true, at least for actual HTML output, since HTML5 doesn't
- * require a MIME type for JavaScript or CSS (those are the default script and
- * style languages).
- */
-$wgJsMimeType = 'text/javascript';
-
 /**
- * The HTML document type.  Ignored if $wgHtml5 is true, since <!DOCTYPE html>
- * doesn't actually have a doctype part to put this variable's contents in.
+ * The default Content-Type header.
  */
-$wgDocType = '-//W3C//DTD XHTML 1.0 Transitional//EN';
+$wgMimeType = 'text/html';
 
 /**
- * The URL of the document type declaration.  Ignored if $wgHtml5 is true,
- * since HTML5 has no DTD, and <!DOCTYPE html> doesn't actually have a DTD part
- * to put this variable's contents in.
+ * Previously used as content type in HTML script tags. This is now ignored since
+ * HTML5 doesn't require a MIME type for script tags (javascript is the default).
+ * It was also previously used by RawAction to determine the ctype query parameter
+ * value that will result in a javascript response.
+ * @deprecated since 1.22
  */
-$wgDTD = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd';
+$wgJsMimeType = null;
 
 /**
- * The default xmlns attribute.  Ignored if $wgHtml5 is true (or it's supposed
- * to be), since we don't currently support XHTML5, and in HTML5 (i.e., served
- * as text/html) the attribute has no effect, so why bother?
+ * The default xmlns attribute. The option to define this has been removed.
+ * The value of this variable is no longer used by core and is set to a fixed
+ * value in Setup.php for compatibility with extensions that depend on the value
+ * of this variable being set. Such a dependency however is deprecated.
+ * @deprecated since 1.22
  */
-$wgXhtmlDefaultNamespace = 'http://www.w3.org/1999/xhtml';
+$wgXhtmlDefaultNamespace = null;
 
 /**
- * Should we output an HTML5 doctype?  If false, use XHTML 1.0 Transitional
- * instead, and disable HTML5 features.  This may eventually be removed and set
- * to always true.  If it's true, a number of other settings will be irrelevant
- * and have no effect.
+ * Previously used to determine if we should output an HTML5 doctype.
+ * This is no longer used as we always output HTML5 now. For compatibility with
+ * extensions that still check the value of this config it's value is now forced
+ * to true by Setup.php.
+ * @deprecated since 1.22
  */
 $wgHtml5 = true;
 
 /**
  * Defines the value of the version attribute in the &lt;html&gt; tag, if any.
- * This is ignored if $wgHtml5 is false.  If $wgAllowRdfaAttributes and
- * $wgHtml5 are both true, and this evaluates to boolean false (like if it's
- * left at the default null value), it will be auto-initialized to the correct
- * value for RDFa+HTML5.  As such, you should have no reason to ever actually
- * set this to anything.
+ * If $wgAllowRdfaAttributes is true, and this evaluates to boolean false
+ * (like if it's left at the default null value), it will be auto-initialized
+ * to the correct value for RDFa+HTML5.  As such, you should have no reason to
+ * ever actually set this to anything.
  */
 $wgHtml5Version = null;
 
@@ -2594,7 +2800,7 @@ $wgHtml5Version = null;
 $wgAllowRdfaAttributes = false;
 
 /**
- * Enabled HTML5 microdata attributes for use in wikitext, if $wgHtml5 is also true.
+ * Enabled HTML5 microdata attributes for use in wikitext.
  */
 $wgAllowMicrodataAttributes = false;
 
@@ -2628,8 +2834,7 @@ $wgWellFormedXml = true;
  * Normally we wouldn't have to define this in the root "<html>"
  * element, but IE needs it there in some circumstances.
  *
- * This is ignored if $wgHtml5 is true, for the same reason as
- * $wgXhtmlDefaultNamespace.
+ * This is ignored if $wgMimeType is set to a non-XML mimetype.
  */
 $wgXhtmlNamespaces = array();
 
@@ -2679,34 +2884,11 @@ $wgDefaultSkin = 'vector';
  * remove from the .../skins/ directory
  */
 $wgSkipSkin = '';
-/** Array for more like $wgSkipSkin. */
-$wgSkipSkins = array();
 
 /**
- * Optionally, we can specify a stylesheet to use for media="handheld".
- * This is recognized by some, but not all, handheld/mobile/PDA browsers.
- * If left empty, compliant handheld browsers won't pick up the skin
- * stylesheet, which is specified for 'screen' media.
- *
- * Can be a complete URL, base-relative path, or $wgStylePath-relative path.
- * Try 'chick/main.css' to apply the Chick styles to the MonoBook HTML.
- *
- * Will also be switched in when 'handheld=yes' is added to the URL, like
- * the 'printable=yes' mode for print media.
+ * Array for more like $wgSkipSkin.
  */
-$wgHandheldStyle = false;
-
-/**
- * If set, 'screen' and 'handheld' media specifiers for stylesheets are
- * transformed such that they apply to the iPhone/iPod Touch Mobile Safari,
- * which doesn't recognize 'handheld' but does support media queries on its
- * screen size.
- *
- * Consider only using this if you have a *really good* handheld stylesheet,
- * as iPhone users won't have any way to disable it and use the "grown-up"
- * styles instead.
- */
-$wgHandheldForIPhone = false;
+$wgSkipSkins = array();
 
 /**
  * Allow user Javascript page?
@@ -2729,10 +2911,14 @@ $wgAllowUserCss = false;
  */
 $wgAllowUserCssPrefs = true;
 
-/** Use the site's Javascript page? */
+/**
+ * Use the site's Javascript page?
+ */
 $wgUseSiteJs = true;
 
-/** Use the site's Cascading Style Sheets (CSS)? */
+/**
+ * Use the site's Cascading Style Sheets (CSS)?
+ */
 $wgUseSiteCss = true;
 
 /**
@@ -2771,7 +2957,6 @@ $wgEditPageFrameOptions = 'DENY';
  *   - 'SAMEORIGIN': Allow framing by pages on the same domain.
  *   - false: Allow all framing.
  */
-
 $wgApiFrameOptions = 'DENY';
 
 /**
@@ -2807,9 +2992,10 @@ $wgExperimentalHtmlIds = false;
  * The value should be either a string or an array. If it is a string it will be output
  * directly as html, however some skins may choose to ignore it. An array is the preferred format
  * for the icon, the following keys are used:
- *  - src: An absolute url to the image to use for the icon, this is recommended
+ * - src: An absolute url to the image to use for the icon, this is recommended
  *        but not required, however some skins will ignore icons without an image
- * - url: The url to use in the a element around the text or icon, if not set an a element will not be outputted
+ * - url: The url to use in the a element around the text or icon, if not set an a element will
+ *        not be outputted
  * - alt: This is the text form of the icon, it will be displayed without an image in
  *        skins like Modern or if src is not set, and will otherwise be used as
  *        the alt="" for the image. This key is required.
@@ -2851,7 +3037,7 @@ $wgVectorUseSimpleSearch = true;
  *  - true = use an icon watch/unwatch button
  *  - false = use watch/unwatch text link
  */
-$wgVectorUseIconWatch = false;
+$wgVectorUseIconWatch = true;
 
 /**
  * Display user edit counts in various prominent places.
@@ -3052,8 +3238,10 @@ $wgLegacyJavaScriptGlobals = true;
  *
  * If set to a negative number, ResourceLoader will assume there is no query
  * string length limit.
+ *
+ * Defaults to a value based on php configuration.
  */
-$wgResourceLoaderMaxQueryLength = -1;
+$wgResourceLoaderMaxQueryLength = false;
 
 /**
  * If set to true, JavaScript modules loaded from wiki pages will be parsed
@@ -3081,6 +3269,59 @@ $wgResourceLoaderValidateStaticJS = false;
  */
 $wgResourceLoaderExperimentalAsyncLoading = false;
 
+/**
+ * Global LESS variables. An associative array binding variable names to CSS
+ * string values.
+ *
+ * Because the hashed contents of this array are used to construct the cache key
+ * that ResourceLoader uses to look up LESS compilation results, updating this
+ * array can be used to deliberately invalidate the set of cached results.
+ *
+ * @par Example:
+ * @code
+ *   $wgResourceLoaderLESSVars = array(
+ *     'baseFontSize'  => '1em',
+ *     'smallFontSize' => '0.75em',
+ *     'WikimediaBlue' => '#006699',
+ *   );
+ * @endcode
+ * @since 1.22
+ */
+$wgResourceLoaderLESSVars = array();
+
+/**
+ * Custom LESS functions. An associative array mapping function name to PHP
+ * callable.
+ *
+ * Changes to LESS functions do not trigger cache invalidation. If you update
+ * the behavior of a LESS function and need to invalidate stale compilation
+ * results, you can touch one of values in $wgResourceLoaderLESSVars, as
+ * documented above.
+ *
+ * @since 1.22
+ */
+$wgResourceLoaderLESSFunctions = array(
+	'embeddable' => 'ResourceLoaderLESSFunctions::embeddable',
+	'embed' => 'ResourceLoaderLESSFunctions::embed',
+);
+
+/**
+ * Default import paths for LESS modules. LESS files referenced in @import
+ * statements will be looked up here first, and relative to the importing file
+ * second. To avoid collisions, it's important for the LESS files in these
+ * directories to have a common, predictable file name prefix.
+ *
+ * Extensions need not (and should not) register paths in
+ * $wgResourceLoaderLESSImportPaths. The import path includes the path of the
+ * currently compiling LESS file, which allows each extension to freely import
+ * files from its own tree.
+ *
+ * @since 1.22
+ */
+$wgResourceLoaderLESSImportPaths = array(
+	"$IP/resources/mediawiki.less/",
+);
+
 /** @} */ # End of resource loader settings }
 
 /*************************************************************************//**
@@ -3167,7 +3408,8 @@ $wgNamespaceAliases = array();
  *   -  []{}|#    Are needed for link syntax, never enable these
  *   -  <>        Causes problems with HTML escaping, don't use
  *   -  %         Enabled by default, minor problems with path to query rewrite rules, see below
- *   -  +         Enabled by default, but doesn't work with path to query rewrite rules, corrupted by apache
+ *   -  +         Enabled by default, but doesn't work with path to query rewrite rules,
+ *                corrupted by apache
  *   -  ?         Enabled by default, but doesn't work with path to PATH_INFO rewrites
  *
  * All three of these punctuation problems can be avoided by using an alias,
@@ -3201,6 +3443,7 @@ $wgInterwikiExpiry = 10800;
  * @name Interwiki caching settings.
  * @{
  */
+
 /**
  *$wgInterwikiCache specifies path to constant database file.
  *
@@ -3215,6 +3458,7 @@ $wgInterwikiExpiry = 10800;
  * data layout.
  */
 $wgInterwikiCache = false;
+
 /**
  * Specify number of domains to check for messages.
  *    - 1: Just wiki(db)-level
@@ -3222,10 +3466,12 @@ $wgInterwikiCache = false;
  *    - 3: site levels
  */
 $wgInterwikiScopes = 3;
+
 /**
- *    $wgInterwikiFallbackSite - if unable to resolve from cache
+ * Fallback site, if unable to resolve from cache
  */
 $wgInterwikiFallbackSite = 'wiki';
+
 /** @} */ # end of Interwiki caching settings.
 
 /**
@@ -3270,7 +3516,8 @@ $wgCapitalLinks = true;
  */
 $wgCapitalLinkOverrides = array();
 
-/** Which namespaces should support subpages?
+/**
+ * Which namespaces should support subpages?
  * See Language.php for a list of namespaces.
  */
 $wgNamespacesWithSubpages = array(
@@ -3313,7 +3560,7 @@ $wgMaxRedirects = 1;
  * As of now, this only checks special pages. Redirects to pages in
  * other namespaces cannot be invalidated by this variable.
  */
-$wgInvalidRedirectTargets = array( 'Filepath', 'Mypage', 'Mytalk' );
+$wgInvalidRedirectTargets = array( 'Filepath', 'Mypage', 'Mytalk', 'Redirect' );
 
 /** @} */ # End of title and interwiki settings }
 
@@ -3349,7 +3596,9 @@ $wgParserConf = array(
 	#'preprocessorClass' => 'Preprocessor_Hash',
 );
 
-/** Maximum indent level of toc. */
+/**
+ * Maximum indent level of toc.
+ */
 $wgMaxTocLevel = 999;
 
 /**
@@ -3377,25 +3626,41 @@ $wgMaxGeneratedPPNodeCount = 1000000;
  */
 $wgMaxTemplateDepth = 40;
 
-/** @see $wgMaxTemplateDepth */
+/**
+ * @see $wgMaxTemplateDepth
+ */
 $wgMaxPPExpandDepth = 40;
 
-/** The external URL protocols */
+/**
+ * The external URL protocols
+ */
 $wgUrlProtocols = array(
 	'http://',
 	'https://',
 	'ftp://',
+	'ftps://', // If we allow ftp:// we should allow the secure version.
+	'ssh://',
+	'sftp://', // SFTP > FTP
 	'irc://',
 	'ircs://', // @bug 28503
+	'xmpp:', // Another open communication protocol
+	'sip:',
+	'sips:',
 	'gopher://',
 	'telnet://', // Well if we're going to support the above.. -ævar
 	'nntp://', // @bug 3808 RFC 1738
 	'worldwind://',
 	'mailto:',
+	'tel:', // If we can make emails linkable, why not phone numbers?
+	'sms:', // Likewise this is standardized too
 	'news:',
 	'svn://',
 	'git://',
 	'mms://',
+	'bitcoin:', // Even registerProtocolHandler whitelists this along with mailto:
+	'magnet:', // No reason to reject torrents over magnet: when they're allowed over http://
+	'urn:', // Allow URNs to be used in Microdata/RDFa <link ... href="urn:...">s
+	'geo:', // urls define geo locations, they're useful in Microdata/RDFa and for coordinates
 	'//', // for protocol-relative URLs
 );
 
@@ -3404,7 +3669,9 @@ $wgUrlProtocols = array(
  */
 $wgCleanSignatures = true;
 
-/**  Whether to allow inline image pointing to other websites */
+/**
+ * Whether to allow inline image pointing to other websites
+ */
 $wgAllowExternalImages = false;
 
 /**
@@ -3421,7 +3688,8 @@ $wgAllowExternalImages = false;
  */
 $wgAllowExternalImagesFrom = '';
 
-/** If $wgAllowExternalImages is false, you can allow an on-wiki
+/**
+ * If $wgAllowExternalImages is false, you can allow an on-wiki
  * whitelist of regular expression fragments to match the image URL
  * against. If the image matches one of the regular expression fragments,
  * The image will be displayed.
@@ -3457,15 +3725,30 @@ $wgAllowImageTag = false;
  *   'extension=tidy.so' to php.ini.
  */
 $wgUseTidy = false;
-/** @see $wgUseTidy */
+
+/**
+ * @see $wgUseTidy
+ */
 $wgAlwaysUseTidy = false;
-/** @see $wgUseTidy */
+
+/**
+ * @see $wgUseTidy
+ */
 $wgTidyBin = 'tidy';
-/** @see $wgUseTidy */
+
+/**
+ * @see $wgUseTidy
+ */
 $wgTidyConf = $IP . '/includes/tidy.conf';
-/** @see $wgUseTidy */
+
+/**
+ * @see $wgUseTidy
+ */
 $wgTidyOpts = '';
-/** @see $wgUseTidy */
+
+/**
+ * @see $wgUseTidy
+ */
 $wgTidyInternal = extension_loaded( 'tidy' );
 
 /**
@@ -3474,7 +3757,8 @@ $wgTidyInternal = extension_loaded( 'tidy' );
  */
 $wgDebugTidy = false;
 
-/** Allow raw, unchecked HTML in "<html>...</html>" sections.
+/**
+ * Allow raw, unchecked HTML in "<html>...</html>" sections.
  * THIS IS VERY DANGEROUS on a publicly editable site, so USE wgGroupPermissions
  * TO RESTRICT EDITING to only those that you trust
  */
@@ -3518,8 +3802,9 @@ $wgNoFollowDomainExceptions = array();
 $wgAllowDisplayTitle = true;
 
 /**
- * For consistency, restrict DISPLAYTITLE to titles that normalize to the same
- * canonical DB key.
+ * For consistency, restrict DISPLAYTITLE to text that normalizes to the same
+ * canonical DB key. Also disallow some inline CSS rules like display: none;
+ * which can cause the text to be hidden or unselectable.
  */
 $wgRestrictDisplayTitle = true;
 
@@ -3536,12 +3821,13 @@ $wgExpensiveParserFunctionLimit = 100;
 $wgPreprocessorCacheThreshold = 1000;
 
 /**
- * Enable interwiki transcluding.  Only when iw_trans=1.
+ * Enable interwiki transcluding.  Only when iw_trans=1 in the interwiki table.
  */
 $wgEnableScaryTranscluding = false;
 
 /**
- * (see next option $wgGlobalDatabase).
+ * Expiry time for transcluded templates cached in transcache database table.
+ * Only used $wgEnableInterwikiTranscluding is set to true.
  */
 $wgTranscludeCacheExpiry = 3600;
 
@@ -3591,7 +3877,8 @@ $wgHitcounterUpdateFreq = 1;
 
 /**
  * How many days user must be idle before he is considered inactive. Will affect
- * the number shown on Special:Statistics and Special:ActiveUsers special page.
+ * the number shown on Special:Statistics, Special:ActiveUsers, and the
+ * {{NUMBEROFACTIVEUSERS}} magic word in wikitext.
  * You might want to leave this as the default value, to provide comparable
  * numbers between different wikis.
  */
@@ -3604,7 +3891,9 @@ $wgActiveUserDays = 30;
  * @{
  */
 
-/** For compatibility with old installations set to false */
+/**
+ * For compatibility with old installations set to false
+ */
 $wgPasswordSalt = true;
 
 /**
@@ -3647,7 +3936,7 @@ $wgReservedUsernames = array(
 	'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
 	'msg:double-redirect-fixer', // Automatic double redirect fix
 	'msg:usermessage-editor', // Default user for leaving user messages
-	'msg:proxyblocker', // For Special:Blockme
+	'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
 );
 
 /**
@@ -3655,7 +3944,6 @@ $wgReservedUsernames = array(
  * preferences used by anonymous visitors and newly created accounts.
  * For instance, to disable section editing links:
  * $wgDefaultUserOptions ['editsection'] = 0;
- *
  */
 $wgDefaultUserOptions = array(
 	'ccmeonemails' => 0,
@@ -3673,8 +3961,6 @@ $wgDefaultUserOptions = array(
 	'enotifusertalkpages' => 1,
 	'enotifwatchlistpages' => 0,
 	'extendwatchlist' => 0,
-	'externaldiff' => 0,
-	'externaleditor' => 0,
 	'fancysig' => 0,
 	'forceeditsummary' => 0,
 	'gender' => 'unknown',
@@ -3691,14 +3977,12 @@ $wgDefaultUserOptions = array(
 	'numberheadings' => 0,
 	'previewonfirst' => 0,
 	'previewontop' => 1,
-	'quickbar' => 5,
 	'rcdays' => 7,
 	'rclimit' => 50,
 	'rememberpassword' => 0,
 	'rows' => 25,
 	'searchlimit' => 20,
 	'showhiddencats' => 0,
-	'showjumplinks' => 1,
 	'shownumberswatching' => 1,
 	'showtoc' => 1,
 	'showtoolbar' => 1,
@@ -3708,6 +3992,7 @@ $wgDefaultUserOptions = array(
 	'underline' => 2,
 	'uselivepreview' => 0,
 	'usenewrc' => 0,
+	'vector-simplesearch' => 1,
 	'watchcreations' => 0,
 	'watchdefault' => 0,
 	'watchdeletion' => 0,
@@ -3720,9 +4005,13 @@ $wgDefaultUserOptions = array(
 	'watchlisthidepatrolled' => 0,
 	'watchmoves' => 0,
 	'wllimit' => 250,
+	'useeditwarning' => 1,
+	'prefershttps' => 1,
 );
 
-/** An array of preferences to not show for the user */
+/**
+ * An array of preferences to not show for the user
+ */
 $wgHiddenPrefs = array();
 
 /**
@@ -3743,63 +4032,6 @@ $wgInvalidUsernameCharacters = '@';
  */
 $wgUserrightsInterwikiDelimiter = '@';
 
-/**
- * Use some particular type of external authentication.  The specific
- * authentication module you use will normally require some extra settings to
- * be specified.
- *
- * null indicates no external authentication is to be used.  Otherwise,
- * $wgExternalAuthType must be the name of a non-abstract class that extends
- * ExternalUser.
- *
- * Core authentication modules can be found in includes/extauth/.
- */
-$wgExternalAuthType = null;
-
-/**
- * Configuration for the external authentication.  This may include arbitrary
- * keys that depend on the authentication mechanism.  For instance,
- * authentication against another web app might require that the database login
- * info be provided.  Check the file where your auth mechanism is defined for
- * info on what to put here.
- */
-$wgExternalAuthConf = array();
-
-/**
- * When should we automatically create local accounts when external accounts
- * already exist, if using ExternalAuth?  Can have three values: 'never',
- * 'login', 'view'.  'view' requires the external database to support cookies,
- * and implies 'login'.
- *
- * TODO: Implement 'view' (currently behaves like 'login').
- */
-$wgAutocreatePolicy = 'login';
-
-/**
- * Policies for how each preference is allowed to be changed, in the presence
- * of external authentication.  The keys are preference keys, e.g., 'password'
- * or 'emailaddress' (see Preferences.php et al.).  The value can be one of the
- * following:
- *
- * - local: Allow changes to this pref through the wiki interface but only
- * apply them locally (default).
- * - semiglobal: Allow changes through the wiki interface and try to apply them
- * to the foreign database, but continue on anyway if that fails.
- * - global: Allow changes through the wiki interface, but only let them go
- * through if they successfully update the foreign database.
- * - message: Allow no local changes for linked accounts; replace the change
- * form with a message provided by the auth plugin, telling the user how to
- * change the setting externally (maybe providing a link, etc.).  If the auth
- * plugin provides no message for this preference, hide it entirely.
- *
- * Accounts that are not linked to an external account are never affected by
- * this setting.  You may want to look at $wgHiddenPrefs instead.
- * $wgHiddenPrefs supersedes this option.
- *
- * TODO: Implement message, global.
- */
-$wgAllowPrefChange = array();
-
 /**
  * This is to let user authenticate using https when they come from http.
  * Based on an idea by George Herbert on wikitech-l:
@@ -3808,13 +4040,6 @@ $wgAllowPrefChange = array();
  */
 $wgSecureLogin = false;
 
-/**
- * By default, keep users logged in via HTTPS when $wgSecureLogin is also
- * true. Users opt-out of HTTPS when they login by de-selecting the checkbox.
- * @since 1.21
- */
-$wgSecureLoginDefaultHTTPS = true;
-
 /** @} */ # end user accounts }
 
 /************************************************************************//**
@@ -3832,7 +4057,9 @@ $wgAutoblockExpiry = 86400;
  */
 $wgBlockAllowsUTEdit = false;
 
-/** Allow sysops to ban users from accessing Emailuser */
+/**
+ * Allow sysops to ban users from accessing Emailuser
+ */
 $wgSysopEmailBans = true;
 
 /**
@@ -3950,6 +4177,13 @@ $wgGroupPermissions['*']['edit'] = true;
 $wgGroupPermissions['*']['createpage'] = true;
 $wgGroupPermissions['*']['createtalk'] = true;
 $wgGroupPermissions['*']['writeapi'] = true;
+$wgGroupPermissions['*']['editmyusercss'] = true;
+$wgGroupPermissions['*']['editmyuserjs'] = true;
+$wgGroupPermissions['*']['viewmywatchlist'] = true;
+$wgGroupPermissions['*']['editmywatchlist'] = true;
+$wgGroupPermissions['*']['viewmyprivateinfo'] = true;
+$wgGroupPermissions['*']['editmyprivateinfo'] = true;
+$wgGroupPermissions['*']['editmyoptions'] = true;
 #$wgGroupPermissions['*']['patrolmarks'] = false; // let anons see what was patrolled
 
 // Implicit group for all logged-in accounts
@@ -3971,25 +4205,29 @@ $wgGroupPermissions['user']['sendemail'] = true;
 
 // Implicit group for accounts that pass $wgAutoConfirmAge
 $wgGroupPermissions['autoconfirmed']['autoconfirmed'] = true;
+$wgGroupPermissions['autoconfirmed']['editsemiprotected'] = true;
 
 // Users with bot privilege can have their edits hidden
 // from various log pages by default
 $wgGroupPermissions['bot']['bot'] = true;
 $wgGroupPermissions['bot']['autoconfirmed'] = true;
+$wgGroupPermissions['bot']['editsemiprotected'] = true;
 $wgGroupPermissions['bot']['nominornewtalk'] = true;
 $wgGroupPermissions['bot']['autopatrol'] = true;
 $wgGroupPermissions['bot']['suppressredirect'] = true;
 $wgGroupPermissions['bot']['apihighlimits'] = true;
 $wgGroupPermissions['bot']['writeapi'] = true;
-#$wgGroupPermissions['bot']['editprotected'] = true; // can edit all protected pages without cascade protection enabled
 
 // Most extra permission abilities go to this group
 $wgGroupPermissions['sysop']['block'] = true;
 $wgGroupPermissions['sysop']['createaccount'] = true;
 $wgGroupPermissions['sysop']['delete'] = true;
-$wgGroupPermissions['sysop']['bigdelete'] = true; // can be separately configured for pages with > $wgDeleteRevisionsLimit revs
-$wgGroupPermissions['sysop']['deletedhistory'] = true; // can view deleted history entries, but not see or restore the text
-$wgGroupPermissions['sysop']['deletedtext'] = true; // can view deleted revision text
+// can be separately configured for pages with > $wgDeleteRevisionsLimit revs
+$wgGroupPermissions['sysop']['bigdelete'] = true;
+// can view deleted history entries, but not see or restore the text
+$wgGroupPermissions['sysop']['deletedhistory'] = true;
+// can view deleted revision text
+$wgGroupPermissions['sysop']['deletedtext'] = true;
 $wgGroupPermissions['sysop']['undelete'] = true;
 $wgGroupPermissions['sysop']['editinterface'] = true;
 $wgGroupPermissions['sysop']['editusercss'] = true;
@@ -4002,6 +4240,7 @@ $wgGroupPermissions['sysop']['move-rootuserpages'] = true;
 $wgGroupPermissions['sysop']['patrol'] = true;
 $wgGroupPermissions['sysop']['autopatrol'] = true;
 $wgGroupPermissions['sysop']['protect'] = true;
+$wgGroupPermissions['sysop']['editprotected'] = true;
 $wgGroupPermissions['sysop']['proxyunbannable'] = true;
 $wgGroupPermissions['sysop']['rollback'] = true;
 $wgGroupPermissions['sysop']['upload'] = true;
@@ -4009,6 +4248,7 @@ $wgGroupPermissions['sysop']['reupload'] = true;
 $wgGroupPermissions['sysop']['reupload-shared'] = true;
 $wgGroupPermissions['sysop']['unwatchedpages'] = true;
 $wgGroupPermissions['sysop']['autoconfirmed'] = true;
+$wgGroupPermissions['sysop']['editsemiprotected'] = true;
 $wgGroupPermissions['sysop']['ipblock-exempt'] = true;
 $wgGroupPermissions['sysop']['blockemail'] = true;
 $wgGroupPermissions['sysop']['markbotedits'] = true;
@@ -4084,11 +4324,12 @@ $wgImplicitGroups = array( '*', 'user', 'autoconfirmed' );
  * @endcode
  * This allows users in the '*' group (i.e. any user) to remove themselves from
  * any group that they happen to be in.
- *
  */
 $wgGroupsAddToSelf = array();
 
-/** @see $wgGroupsAddToSelf */
+/**
+ * @see $wgGroupsAddToSelf
+ */
 $wgGroupsRemoveFromSelf = array();
 
 /**
@@ -4108,10 +4349,36 @@ $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' );
  * dictates the order on the protection form's lists.
  *
  *   - '' will be ignored (i.e. unprotected)
- *   - 'sysop' is quietly rewritten to 'protect' for backwards compatibility
+ *   - 'autoconfirmed' is quietly rewritten to 'editsemiprotected' for backwards compatibility
+ *   - 'sysop' is quietly rewritten to 'editprotected' for backwards compatibility
  */
 $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' );
 
+/**
+ * Restriction levels that can be used with cascading protection
+ *
+ * A page can only be protected with cascading protection if the
+ * requested restriction level is included in this array.
+ *
+ * 'autoconfirmed' is quietly rewritten to 'editsemiprotected' for backwards compatibility.
+ * 'sysop' is quietly rewritten to 'editprotected' for backwards compatibility.
+ */
+$wgCascadingRestrictionLevels = array( 'sysop' );
+
+/**
+ * Restriction levels that should be considered "semiprotected"
+ *
+ * Certain places in the interface recognize a dichotomy between "protected"
+ * and "semiprotected", without further distinguishing the specific levels. In
+ * general, if anyone can be eligible to edit a protection level merely by
+ * reaching some condition in $wgAutopromote, it should probably be considered
+ * "semiprotected".
+ *
+ * 'autoconfirmed' is quietly rewritten to 'editsemiprotected' for backwards compatibility.
+ * 'sysop' is not changed, since it really shouldn't be here.
+ */
+$wgSemiprotectedRestrictionLevels = array( 'autoconfirmed' );
+
 /**
  * Set the minimum permissions required to edit pages in each
  * namespace.  If you list more than one permission, a user must
@@ -4248,7 +4515,10 @@ $wgAutopromoteOnceLogInRC = true;
  * @endcode
  */
 $wgAddGroups = array();
-/** @see $wgAddGroups */
+
+/**
+ * @see $wgAddGroups
+ */
 $wgRemoveGroups = array();
 
 /**
@@ -4283,7 +4553,9 @@ $wgAccountCreationThrottle = 0;
  */
 $wgSpamRegex = array();
 
-/** Same as the above except for edit summaries */
+/**
+ * Same as the above except for edit summaries
+ */
 $wgSummarySpamRegex = array();
 
 /**
@@ -4336,6 +4608,13 @@ $wgSorbsUrl = array();
  */
 $wgProxyWhitelist = array();
 
+/**
+ * Whether to look at the X-Forwarded-For header's list of (potentially spoofed)
+ * IPs and apply IP blocks to them. This allows for IP blocks to work with correctly-configured
+ * (transparent) proxies without needing to block the proxies themselves.
+ */
+$wgApplyIpBlocksToXff = false;
+
 /**
  * Simple rate limiter options to brake edit floods.
  *
@@ -4362,7 +4641,7 @@ $wgRateLimits = array(
 		'user' => null, // for each logged-in user
 		'newbie' => null, // for each recent (autoconfirmed) account; overrides 'user'
 		'ip' => null, // for each anon and recent account
-		'subnet' => null, // ... with final octet removed
+		'subnet' => null, // ... within a /24 subnet in IPv4 or /64 in IPv6
 	),
 	'move' => array(
 		'user' => null,
@@ -4370,11 +4649,25 @@ $wgRateLimits = array(
 		'ip' => null,
 		'subnet' => null,
 	),
-	'mailpassword' => array(
+	'mailpassword' => array( // triggering password resets emails
 		'anon' => null,
 	),
-	'emailuser' => array(
+	'emailuser' => array( // emailing other users using MediaWiki
+		'user' => null,
+	),
+	'linkpurge' => array( // purges of link tables
+		'anon' => null,
 		'user' => null,
+		'newbie' => null,
+		'ip' => null,
+		'subnet' => null,
+	),
+	'renderfile' => array( // files rendered via thumb.php or thumb_handler.php
+		'anon' => null,
+		'user' => null,
+		'newbie' => null,
+		'ip' => null,
+		'subnet' => null,
 	),
 );
 
@@ -4417,22 +4710,8 @@ $wgPasswordAttemptThrottle = array( 'count' => 5, 'seconds' => 300 );
  */
 
 /**
- * If you enable this, every editor's IP address will be scanned for open HTTP
- * proxies.
- *
- * @warning Don't enable this. Many sysops will report "hostile TCP port scans"
- * to your ISP and ask for your server to be shut down.
- * You have been warned.
- *
+ * This should always be customised in LocalSettings.php
  */
-$wgBlockOpenProxies = false;
-/** Port we want to scan for a proxy */
-$wgProxyPorts = array( 80, 81, 1080, 3128, 6588, 8000, 8080, 8888, 65506 );
-/** Script used to scan */
-$wgProxyScriptPath = "$IP/maintenance/proxyCheck.php";
-/** */
-$wgProxyMemcExpiry = 86400;
-/** This should always be customised in LocalSettings.php */
 $wgSecretKey = false;
 
 /**
@@ -4516,10 +4795,14 @@ $wgHttpOnlyBlacklist = array(
 	'/^Mozilla\/4\.0 \(compatible; MSIE \d+\.\d+; Mac_PowerPC\)/',
 );
 
-/** A list of cookies that vary the cache (for use by extensions) */
+/**
+ * A list of cookies that vary the cache (for use by extensions)
+ */
 $wgCacheVaryCookies = array();
 
-/** Override to customise the session name */
+/**
+ * Override to customise the session name
+ */
 $wgSessionName = false;
 
 /** @} */ # end of cookie settings }
@@ -4537,7 +4820,7 @@ $wgSessionName = false;
  */
 $wgUseTeX = false;
 
-/* @} */ # end LaTeX }
+/** @} */ # end LaTeX }
 
 /************************************************************************//**
  * @name   Profiling, testing and debugging
@@ -4676,10 +4959,14 @@ $wgDevelopmentWarnings = false;
  */
 $wgDeprecationReleaseLimit = false;
 
-/** Only record profiling info for pages that took longer than this */
+/**
+ * Only record profiling info for pages that took longer than this
+ */
 $wgProfileLimit = 0.0;
 
-/** Don't put non-profiling info into log file */
+/**
+ * Don't put non-profiling info into log file
+ */
 $wgProfileOnly = false;
 
 /**
@@ -4694,10 +4981,14 @@ $wgProfileOnly = false;
  */
 $wgProfileToDatabase = false;
 
-/** If true, print a raw call tree instead of per-function report */
+/**
+ * If true, print a raw call tree instead of per-function report
+ */
 $wgProfileCallTree = false;
 
-/** Should application server host be put into profiling table */
+/**
+ * Should application server host be put into profiling table
+ */
 $wgProfilePerHost = false;
 
 /**
@@ -4714,10 +5005,25 @@ $wgUDPProfilerHost = '127.0.0.1';
  */
 $wgUDPProfilerPort = '3811';
 
-/** Detects non-matching wfProfileIn/wfProfileOut calls */
+/**
+ * Format string for the UDP profiler. The UDP profiler invokes sprintf() with
+ * (profile id, count, cpu, cpu_sq, real, real_sq, entry name) as arguments.
+ * You can use sprintf's argument numbering/swapping capability to repeat,
+ * re-order or omit fields.
+ *
+ * @see $wgStatsFormatString
+ * @since 1.22
+ */
+$wgUDPProfilerFormatString = "%s - %d %f %f %f %f %s\n";
+
+/**
+ * Detects non-matching wfProfileIn/wfProfileOut calls
+ */
 $wgDebugProfiling = false;
 
-/** Output debug message on every wfProfileIn/wfProfileOut */
+/**
+ * Output debug message on every wfProfileIn/wfProfileOut
+ */
 $wgDebugFunctionEntry = false;
 
 /**
@@ -4736,7 +5042,21 @@ $wgStatsMethod = 'cache';
  */
 $wgAggregateStatsID = false;
 
-/** Whereas to count the number of time an article is viewed.
+/**
+ * When $wgStatsMethod is 'udp', this variable specifies how stats should be
+ * formatted. Its value should be a format string suitable for a sprintf()
+ * invocation with (id, count, key) arguments, where 'id' is either
+ * $wgAggregateStatsID or the DB name, 'count' is the value by which the metric
+ * is being incremented, and 'key' is the metric name.
+ *
+ * @see $wgUDPProfilerFormatString
+ * @see $wgAggregateStatsID
+ * @since 1.22
+ */
+$wgStatsFormatString = "stats/%s - %s 1 1 1 1 %s\n";
+
+/**
+ * Whereas to count the number of time an article is viewed.
  * Does not work if pages are cached (for example with squid).
  */
 $wgDisableCounters = false;
@@ -4867,7 +5187,6 @@ $wgCountTotalSearchHits = false;
  * PHP wrapper to avoid firing up mediawiki for every keystroke
  *
  * Placeholders: {searchTerms}
- *
  */
 $wgOpenSearchTemplate = false;
 
@@ -4919,7 +5238,6 @@ $wgNamespacesToBeSearchedHelp = array(
  * logged-in users.
  * Useful for big wikis to maintain different search profiles for anonymous and
  * logged-in users.
- *
  */
 $wgSearchEverythingOnlyLoggedIn = false;
 
@@ -5011,12 +5329,8 @@ $wgPreviewOnOpenNamespaces = array(
 );
 
 /**
- * Activate external editor interface for files and pages
- * See http://www.mediawiki.org/wiki/Manual:External_editors
+ * Go button goes straight to the edit screen if the article doesn't exist.
  */
-$wgUseExternalEditor = true;
-
-/** Go button goes straight to the edit screen if the article doesn't exist. */
 $wgGoToEdit = false;
 
 /**
@@ -5050,7 +5364,9 @@ if ( !isset( $wgCommandLineMode ) ) {
 }
 /** @endcond */
 
-/** For colorized maintenance script output, is your terminal background dark ? */
+/**
+ * For colorized maintenance script output, is your terminal background dark ?
+ */
 $wgCommandLineDarkBg = false;
 
 /**
@@ -5090,6 +5406,11 @@ $wgReadOnlyFile = false;
  */
 $wgUpgradeKey = false;
 
+/**
+ * Fully specified path to git binary
+ */
+$wgGitBin = '/usr/bin/git';
+
 /**
  * Map GIT repository URLs to viewer URLs to provide links in Special:Version
  *
@@ -5098,12 +5419,14 @@ $wgUpgradeKey = false;
  * The value is the replacement for the key (it can contain $1, etc.)
  * %h will be replaced by the short SHA-1 (7 first chars) and %H by the
  * full SHA-1 of the HEAD revision.
+ * %r will be replaced with a URL-encoded version of $1.
  *
  * @since 1.20
  */
 $wgGitRepositoryViewers = array(
-	'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
-	'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/r/gitweb?p=$1;h=%H',
+	'https://gerrit.wikimedia.org/r/p/(.*)' => 'https://git.wikimedia.org/commit/%r/%H',
+	'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)'
+		=> 'https://git.wikimedia.org/commit/%r/%H',
 );
 
 /** @} */ # End of maintenance }
@@ -5139,11 +5462,15 @@ $wgRCLinkDays = array( 1, 3, 7, 14, 30 );
 /**
  * Send recent changes updates via UDP. The updates will be formatted for IRC.
  * Set this to the IP address of the receiver.
+ *
+ * @deprecated since 1.22, use $wgRCFeeds
  */
 $wgRC2UDPAddress = false;
 
 /**
  * Port number for RC updates
+ *
+ * @deprecated since 1.22, use $wgRCFeeds
  */
 $wgRC2UDPPort = false;
 
@@ -5152,21 +5479,73 @@ $wgRC2UDPPort = false;
  * This can be used to identify the wiki. A script is available called
  * mxircecho.py which listens on a UDP port, and uses a prefix ending in a
  * tab to identify the IRC channel to send the log line to.
+ *
+ * @deprecated since 1.22, use $wgRCFeeds
  */
 $wgRC2UDPPrefix = '';
 
 /**
  * If this is set to true, $wgLocalInterwiki will be prepended to links in the
  * IRC feed. If this is set to a string, that string will be used as the prefix.
+ *
+ * @deprecated since 1.22, use $wgRCFeeds
  */
 $wgRC2UDPInterwikiPrefix = false;
 
 /**
  * Set to true to omit "bot" edits (by users with the bot permission) from the
  * UDP feed.
+ *
+ * @deprecated since 1.22, use $wgRCFeeds
  */
 $wgRC2UDPOmitBots = false;
 
+/**
+ * Destinations to which notifications about recent changes
+ * should be sent.
+ *
+ * As of MediaWiki 1.22, the only supported 'engine' parameter option in core
+ * is 'UDPRCFeedEngine', which is used to send recent changes over UDP to the
+ * specified server.
+ * The common options are:
+ *   * 'uri' -- the address to which the notices are to be sent.
+ *   * 'formatter' -- the class name (implementing RCFeedFormatter) which will
+ *     produce the text to send.
+ *   * 'omit_bots' -- whether the bot edits should be in the feed
+ *  The IRC-specific options are:
+ *   * 'add_interwiki_prefix' -- whether the titles should be prefixed with
+ *     $wgLocalInterwiki.
+ *  The JSON-specific options are:
+ *   * 'channel' -- if set, the 'channel' parameter is also set in JSON values.
+ *
+ *  To ensure backwards-compatability, whenever $wgRC2UDPAddress is set, a
+ *  'default' feed will be created reusing the deprecated $wgRC2UDP* variables.
+ *
+ * @example $wgRCFeeds['example'] = array(
+ *		'formatter' => 'JSONRCFeedFormatter',
+ *		'uri' => "udp://localhost:1336",
+ *		'add_interwiki_prefix' => false,
+ *		'omit_bots' => true,
+ *	);
+ * @example $wgRCFeeds['exampleirc'] = array(
+ *		'formatter' => 'IRCColourfulRCFeedFormatter',
+ *		'uri' => "udp://localhost:1338",
+ *		'add_interwiki_prefix' => false,
+ *		'omit_bots' => true,
+ *	);
+ * @since 1.22
+ */
+$wgRCFeeds = array();
+
+/**
+ * Used by RecentChange::getEngine to find the correct engine to use for a given URI scheme.
+ * Keys are scheme names, values are names of engine classes.
+ */
+$wgRCEngines = array(
+	'redis' => 'RedisPubSubFeedEngine',
+	'udp' => 'UDPRCFeedEngine',
+);
+
 /**
  * Enable user search in Special:Newpages
  * This is really a temporary hack around an index install bug on some Wikipedias.
@@ -5174,20 +5553,34 @@ $wgRC2UDPOmitBots = false;
  */
 $wgEnableNewpagesUserFilter = true;
 
-/** Use RC Patrolling to check for vandalism */
+/**
+ * Use RC Patrolling to check for vandalism
+ */
 $wgUseRCPatrol = true;
 
-/** Use new page patrolling to check new pages on Special:Newpages */
+/**
+ * Use new page patrolling to check new pages on Special:Newpages
+ */
 $wgUseNPPatrol = true;
 
-/** Provide syndication feeds (RSS, Atom) for, e.g., Recentchanges, Newpages */
+/**
+ * Log autopatrol actions to the log table
+ */
+$wgLogAutopatrol = true;
+
+/**
+ * Provide syndication feeds (RSS, Atom) for, e.g., Recentchanges, Newpages
+ */
 $wgFeed = true;
 
-/** Set maximum number of results to return in syndication feeds (RSS, Atom) for
- * eg Recentchanges, Newpages. */
+/**
+ * Set maximum number of results to return in syndication feeds (RSS, Atom) for
+ * eg Recentchanges, Newpages.
+ */
 $wgFeedLimit = 50;
 
-/** _Minimum_ timeout for cached Recentchanges feed, in seconds.
+/**
+ * _Minimum_ timeout for cached Recentchanges feed, in seconds.
  * A cached version will continue to be served out even if changes
  * are made, until this many seconds runs out since the last render.
  *
@@ -5196,11 +5589,14 @@ $wgFeedLimit = 50;
  */
 $wgFeedCacheTimeout = 60;
 
-/** When generating Recentchanges RSS/Atom feed, diffs will not be generated for
- * pages larger than this size. */
+/**
+ * When generating Recentchanges RSS/Atom feed, diffs will not be generated for
+ * pages larger than this size.
+ */
 $wgFeedDiffCutoff = 32768;
 
-/** Override the site's default RSS/ATOM feed for recentchanges that appears on
+/**
+ * Override the site's default RSS/ATOM feed for recentchanges that appears on
  * every page. Some sites might have a different feed they'd like to promote
  * instead of the RC feed (maybe like a "Recent New Articles" or "Breaking news" one).
  * Should be a format as key (either 'rss' or 'atom') and an URL to the feed
@@ -5229,11 +5625,19 @@ $wgFeedClasses = array(
  */
 $wgAdvertisedFeedTypes = array( 'atom' );
 
-/** Show watching users in recent changes, watchlist and page history views */
+/**
+ * Show watching users in recent changes, watchlist and page history views
+ */
 $wgRCShowWatchingUsers = false; # UPO
-/** Show watching users in Page views */
+
+/**
+ * Show watching users in Page views
+ */
 $wgPageShowWatchingUsers = false;
-/** Show the amount of changed characters in recent changes */
+
+/**
+ * Show the amount of changed characters in recent changes
+ */
 $wgRCShowChangedSize = true;
 
 /**
@@ -5245,7 +5649,8 @@ $wgRCChangedSizeThreshold = 500;
 
 /**
  * Show "Updated (since my last visit)" marker in RC view, watchlist and history
- * view for watched pages with new changes */
+ * view for watched pages with new changes
+ */
 $wgShowUpdatedMarker = true;
 
 /**
@@ -5274,6 +5679,33 @@ $wgUseTagFilter = true;
  */
 $wgUnwatchedPageThreshold = false;
 
+/**
+ * Flags (letter symbols) shown in recent changes and watchlist to indicate
+ * certain types of edits.
+ *
+ * To register a new one:
+ * @code
+ * $wgRecentChangesFlags['flag'] => array(
+ *   'letter' => 'letter-msg',
+ *   'title' => 'tooltip-msg'
+ * );
+ * @endcode
+ *
+ * Optional 'class' allows to set a css class different than the flag name.
+ *
+ * @since 1.22
+ */
+$wgRecentChangesFlags = array(
+	'newpage' => array( 'letter' => 'newpageletter',
+		'title' => 'recentchanges-label-newpage' ),
+	'minor' => array( 'letter' => 'minoreditletter',
+		'title' => 'recentchanges-label-minor', 'class' => 'minoredit' ),
+	'bot' => array( 'letter' => 'boteditletter',
+		'title' => 'recentchanges-label-bot', 'class' => 'botedit' ),
+	'unpatrolled' => array( 'letter' => 'unpatrolledletter',
+		'title' => 'recentchanges-label-unpatrolled' ),
+);
+
 /** @} */ # end RC/watchlist }
 
 /************************************************************************//**
@@ -5291,15 +5723,17 @@ $wgUnwatchedPageThreshold = false;
 $wgRightsPage = null;
 
 /**
- * Set this to specify an external URL containing details about the content license used on your wiki.
+ * Set this to specify an external URL containing details about the content license used on your
+ * wiki.
  * If $wgRightsPage is set then this setting is ignored.
  */
 $wgRightsUrl = null;
 
 /**
- * If either $wgRightsUrl or $wgRightsPage is specified then this variable gives the text for the link.
- * If using $wgRightsUrl then this value must be specified. If using $wgRightsPage then the name of the
- * page will also be used as the link if this variable is not set.
+ * If either $wgRightsUrl or $wgRightsPage is specified then this variable gives the text for the
+ * link.
+ * If using $wgRightsUrl then this value must be specified. If using $wgRightsPage then the name
+ * of the page will also be used as the link if this variable is not set.
  */
 $wgRightsText = null;
 
@@ -5319,7 +5753,9 @@ $wgLicenseTerms = false;
  */
 $wgCopyrightIcon = null;
 
-/** Set this to true if you want detailed copyright information forms on Upload. */
+/**
+ * Set this to true if you want detailed copyright information forms on Upload.
+ */
 $wgUseCopyrightUpload = false;
 
 /**
@@ -5331,8 +5767,10 @@ $wgUseCopyrightUpload = false;
  */
 $wgMaxCredits = 0;
 
-/** If there are more than $wgMaxCredits authors, show $wgMaxCredits of them.
- * Otherwise, link to a separate credits page. */
+/**
+ * If there are more than $wgMaxCredits authors, show $wgMaxCredits of them.
+ * Otherwise, link to a separate credits page.
+ */
 $wgShowCreditsIfMax = true;
 
 /** @} */ # end of copyright and credits settings }
@@ -5434,6 +5872,13 @@ $wgExtensionFunctions = array();
  */
 $wgExtensionMessagesFiles = array();
 
+/**
+ * Array of files with list(s) of extension entry points to be used in
+ * maintenance/mergeMessageFileList.php
+ * @since 1.22
+ */
+$wgExtensionEntryPointListFiles = array();
+
 /**
  * Parser output hooks.
  * This is an associative array where the key is an extension-defined tag
@@ -5450,6 +5895,11 @@ $wgExtensionMessagesFiles = array();
  */
 $wgParserOutputHooks = array();
 
+/**
+ * Whether to include the NewPP limit report as a HTML comment
+ */
+$wgEnableParserLimitReporting = true;
+
 /**
  * List of valid skin names.
  * The key should be the name in all lower case, the value should be a properly
@@ -5521,17 +5971,24 @@ $wgAuth = null;
  * @endcode
  * - A function with some data:
  * @code
- *     $wgHooks['event_name'][] = array($function, $data);
+ *     $wgHooks['event_name'][] = array( $function, $data );
  * @endcode
  * - A an object method:
  * @code
- *     $wgHooks['event_name'][] = array($object, 'method');
+ *     $wgHooks['event_name'][] = array( $object, 'method' );
+ * @endcode
+ * - A closure:
+ * @code
+ *     $wgHooks['event_name'][] = function ( $hookParam ) {
+ *         // Handler code goes here.
+ *     };
  * @endcode
  *
  * @warning You should always append to an event array or you will end up
  * deleting a previous registered hook.
  *
- * @todo Does it support PHP closures?
+ * @warning Hook handlers should be registered at file scope. Registering
+ * handlers after file scope can lead to unexpected results due to caching.
  */
 $wgHooks = array();
 
@@ -5543,7 +6000,6 @@ $wgJobClasses = array(
 	'refreshLinks' => 'RefreshLinksJob',
 	'refreshLinks2' => 'RefreshLinksJob2',
 	'htmlCacheUpdate' => 'HTMLCacheUpdateJob',
-	'html_cache_update' => 'HTMLCacheUpdateJob', // backwards-compatible
 	'sendMail' => 'EmaillingJob',
 	'enotifNotify' => 'EnotifNotifyJob',
 	'fixDoubleRedirect' => 'DoubleRedirectJob',
@@ -5843,12 +6299,13 @@ $wgDisableQueryPageUpdate = false;
  * List of special pages, followed by what subtitle they should go under
  * at Special:SpecialPages
  *
- * @deprecated 1.21 Override SpecialPage::getGroupName instead
+ * @deprecated since 1.21 Override SpecialPage::getGroupName instead
  */
 $wgSpecialPageGroups = array();
 
-/** Whether or not to sort special pages in Special:Specialpages */
-
+/**
+ * Whether or not to sort special pages in Special:Specialpages
+ */
 $wgSortSpecialPages = true;
 
 /**
@@ -6065,6 +6522,16 @@ $wgAPIRequestLog = false;
  */
 $wgAPICacheHelpTimeout = 60 * 60;
 
+/**
+ * The ApiQueryQueryPages module should skip pages that are redundant to true
+ * API queries.
+ */
+$wgAPIUselessQueryPages = array(
+	'MIMEsearch', // aiprop=mime
+	'LinkSearch', // list=exturlusage
+	'FileDuplicateSearch', // prop=duplicatefiles
+);
+
 /**
  * Enable AJAX framework
  */
@@ -6119,7 +6586,6 @@ $wgCrossSiteAJAXdomains = array();
  * even if they match one of the domains allowed by $wgCrossSiteAJAXdomains
  * Uses the same syntax as $wgCrossSiteAJAXdomains
  */
-
 $wgCrossSiteAJAXdomainExceptions = array();
 
 /** @} */ # End AJAX and API }
@@ -6132,7 +6598,7 @@ $wgCrossSiteAJAXdomainExceptions = array();
 /**
  * Maximum amount of virtual memory available to shell processes under linux, in KB.
  */
-$wgMaxShellMemory = 102400;
+$wgMaxShellMemory = 307200;
 
 /**
  * Maximum file size created by shell processes under linux, in KB
@@ -6210,6 +6676,12 @@ $wgAsyncHTTPTimeout = 25;
  */
 $wgHTTPProxy = false;
 
+/**
+ * Timeout for connections done internally (in seconds)
+ * Only works for curl
+ */
+$wgHTTPConnectTimeout = 5e0;
+
 /** @} */ # End HTTP client }
 
 /************************************************************************//**
@@ -6248,61 +6720,13 @@ $wgMaxBacklinksInvalidate = false;
 /** @} */ # End job queue }
 
 /************************************************************************//**
- * @name   HipHop compilation
+ * @name   Miscellaneous
  * @{
  */
 
 /**
- * The build directory for HipHop compilation.
- * Defaults to '$IP/maintenance/hiphop/build'.
- */
-$wgHipHopBuildDirectory = false;
-
-/**
- * The HipHop build type. Can be either "Debug" or "Release".
+ * Name of the external diff engine to use
  */
-$wgHipHopBuildType = 'Debug';
-
-/**
- * Number of parallel processes to use during HipHop compilation, or "detect"
- * to guess from system properties.
- */
-$wgHipHopCompilerProcs = 'detect';
-
-/**
- * Filesystem extensions directory. Defaults to $IP/../extensions.
- *
- * To compile extensions with HipHop, set $wgExtensionsDirectory correctly,
- * and use code like:
- * @code
- *    require( MWInit::extensionSetupPath( 'Extension/Extension.php' ) );
- * @endcode
- *
- * to include the extension setup file from LocalSettings.php. It is not
- * necessary to set this variable unless you use MWInit::extensionSetupPath().
- */
-$wgExtensionsDirectory = false;
-
-/**
- * A list of files that should be compiled into a HipHop build, in addition to
- * those listed in $wgAutoloadClasses. Add to this array in an extension setup
- * file in order to add files to the build.
- *
- * The files listed here must either be either absolute paths under $IP or
- * under $wgExtensionsDirectory, or paths relative to the virtual source root
- * "$IP/..", i.e. starting with "phase3" for core files, and "extensions" for
- * extension files.
- */
-$wgCompiledFiles = array();
-
-/** @} */ # End of HipHop compilation }
-
-/************************************************************************//**
- * @name   Miscellaneous
- * @{
- */
-
-/** Name of the external diff engine to use */
 $wgExternalDiffEngine = false;
 
 /**
@@ -6372,25 +6796,18 @@ $wgPoolCounterConf = null;
 $wgUploadMaintenance = false;
 
 /**
- * Allows running of selenium tests via maintenance/tests/RunSeleniumTests.php
- */
-$wgEnableSelenium = false;
-$wgSeleniumTestConfigs = array();
-$wgSeleniumConfigFile = null;
-$wgDBtestuser = ''; //db user that has permission to create and drop the test databases only
-$wgDBtestpassword = '';
-
-/**
- * Associative array mapping namespace IDs to the name of the content model pages in that namespace should have by
- * default (use the CONTENT_MODEL_XXX constants). If no special content type is defined for a given namespace,
- * pages in that namespace will  use the CONTENT_MODEL_WIKITEXT (except for the special case of JS and CS pages).
+ * Associative array mapping namespace IDs to the name of the content model pages in that namespace
+ * should have by default (use the CONTENT_MODEL_XXX constants). If no special content type is
+ * defined for a given namespace, pages in that namespace will use the CONTENT_MODEL_WIKITEXT
+ * (except for the special case of JS and CS pages).
  *
  * @since 1.21
  */
 $wgNamespaceContentModels = array();
 
 /**
- * How to react if a plain text version of a non-text Content object is requested using ContentHandler::getContentText():
+ * How to react if a plain text version of a non-text Content object is requested using
+ * ContentHandler::getContentText():
  *
  * * 'ignore': return null
  * * 'fail': throw an MWException
@@ -6402,14 +6819,14 @@ $wgContentHandlerTextFallback = 'ignore';
 
 /**
  * Set to false to disable use of the database fields introduced by the ContentHandler facility.
- * This way, the ContentHandler facility can be used without any additional information in the database.
- * A page's content model is then derived solely from the page's title. This however means that changing
- * a page's default model (e.g. using $wgNamespaceContentModels) will break the page and/or make the content
- * inaccessible. This also means that pages can not be moved to a title that would default to a different
- * content model.
+ * This way, the ContentHandler facility can be used without any additional information in the
+ * database. A page's content model is then derived solely from the page's title. This however
+ * means that changing a page's default model (e.g. using $wgNamespaceContentModels) will break
+ * the page and/or make the content inaccessible. This also means that pages can not be moved to
+ * a title that would default to a different content model.
  *
- * Overall, with $wgContentHandlerUseDB = false, no database updates are needed, but content handling
- * is less robust and less flexible.
+ * Overall, with $wgContentHandlerUseDB = false, no database updates are needed, but content
+ * handling is less robust and less flexible.
  *
  * @since 1.21
  */
@@ -6420,7 +6837,7 @@ $wgContentHandlerUseDB = true;
  * of texts are also rendered as wikitext, it only means that links, magic words, etc will have
  * the effect on the database they would have on a wikitext page.
  *
- * @todo: On the long run, it would be nice to put categories etc into a separate structure,
+ * @todo On the long run, it would be nice to put categories etc into a separate structure,
  * or at least parse only the contents of comments in the scripts.
  *
  * @since 1.21
@@ -6447,6 +6864,12 @@ $wgSiteTypes = array(
 	'mediawiki' => 'MediaWikiSite',
 );
 
+/**
+ * Formerly a list of files for HipHop compilation
+ * @deprecated since 1.22
+ */
+$wgCompiledFiles = array();
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
diff --git a/includes/DeferredUpdates.php b/includes/DeferredUpdates.php
index 89c4df68..c385f138 100644
--- a/includes/DeferredUpdates.php
+++ b/includes/DeferredUpdates.php
@@ -63,6 +63,16 @@ class DeferredUpdates {
 		self::addUpdate( new HTMLCacheUpdate( $title, $table ) );
 	}
 
+	/**
+	 * Add a callable update.  In a lot of cases, we just need a callback/closure,
+	 * defining a new DeferrableUpdate object is not necessary
+	 * @see MWCallableUpdate::__construct()
+	 * @param callable $callable
+	 */
+	public static function addCallableUpdate( $callable ) {
+		self::addUpdate( new MWCallableUpdate( $callable ) );
+	}
+
 	/**
 	 * Do any deferred updates and clear the list
 	 *
@@ -99,7 +109,7 @@ class DeferredUpdates {
 				// be reported to the user since the output is already sent.
 				// Instead we just log them.
 				if ( !$e instanceof ErrorPageError ) {
-					wfDebugLog( 'exception', $e->getLogMessage() );
+					MWExceptionHandler::logException( $e );
 				}
 			}
 		}
diff --git a/includes/Defines.php b/includes/Defines.php
index c4a86335..86c5520b 100644
--- a/includes/Defines.php
+++ b/includes/Defines.php
@@ -197,14 +197,14 @@ define( 'EDIT_AUTOSUMMARY', 64 );
 define( 'LIST_COMMA', 0 );
 define( 'LIST_AND', 1 );
 define( 'LIST_SET', 2 );
-define( 'LIST_NAMES', 3);
-define( 'LIST_OR', 4);
+define( 'LIST_NAMES', 3 );
+define( 'LIST_OR', 4 );
 /**@}*/
 
 /**
  * Unicode and normalisation related
  */
-require_once __DIR__.'/normal/UtfNormalDefines.php';
+require_once __DIR__ . '/normal/UtfNormalDefines.php';
 
 /**@{
  * Hook support constants
@@ -236,11 +236,6 @@ define( 'SFH_NO_HASH', 1 );
 define( 'SFH_OBJECT_ARGS', 2 );
 /**@}*/
 
-/**
- * Flags for Parser::setLinkHook
- */
-define( 'SLH_PATTERN', 1 );
-
 /**
  * Flags for Parser::replaceLinkHolders
  */
diff --git a/includes/EditPage.php b/includes/EditPage.php
index 8b2dbb5f..530e2674 100644
--- a/includes/EditPage.php
+++ b/includes/EditPage.php
@@ -100,7 +100,7 @@ class EditPage {
 
 	/**
 	 * Status: user tried to create this page, but is not allowed to do that
-	 * ( Title->usercan('create') == false )
+	 * ( Title->userCan('create') == false )
 	 */
 	const AS_NO_CREATE_PERMISSION = 223;
 
@@ -487,7 +487,7 @@ class EditPage {
 			// The edit page was reached via a red link.
 			// Redirect to the article page and let them click the edit tab if
 			// they really want a permission error.
-			$wgOut->redirect( $this->mTitle->getFullUrl() );
+			$wgOut->redirect( $this->mTitle->getFullURL() );
 			return;
 		}
 
@@ -521,6 +521,8 @@ class EditPage {
 		$wgOut->addHTML( Html::rawElement( 'div', array( 'class' => 'templatesUsed' ),
 			Linker::formatTemplates( $this->getTemplates() ) ) );
 
+		$wgOut->addModules( 'mediawiki.action.edit.collapsibleFooter' );
+
 		if ( $this->mTitle->exists() ) {
 			$wgOut->returnToMain( null, $this->mTitle );
 		}
@@ -540,7 +542,7 @@ class EditPage {
 			// The edit page was reached via a red link.
 			// Redirect to the article page and let them click the edit tab if
 			// they really want a permission error.
-			$wgOut->redirect( $this->mTitle->getFullUrl() );
+			$wgOut->redirect( $this->mTitle->getFullURL() );
 		} else {
 			$wgOut->readOnlyPage( $source, $protected, $reasons, $action );
 		}
@@ -621,6 +623,7 @@ class EditPage {
 		$this->section = $request->getVal( 'wpSection', $request->getVal( 'section' ) );
 
 		if ( $this->section !== null && $this->section !== '' && !$this->isSectionEditSupported() ) {
+			wfProfileOut( __METHOD__ );
 			throw new ErrorPageError( 'sectioneditnotsupported-title', 'sectioneditnotsupported-text' );
 		}
 
@@ -663,6 +666,11 @@ class EditPage {
 			$this->edittime = $request->getVal( 'wpEdittime' );
 			$this->starttime = $request->getVal( 'wpStarttime' );
 
+			$undidRev = $request->getInt( 'wpUndidRevision' );
+			if ( $undidRev ) {
+				$this->undidRev = $undidRev;
+			}
+
 			$this->scrolltop = $request->getIntOrNull( 'wpScrolltop' );
 
 			if ( $this->textbox1 === '' && $request->getVal( 'wpTextbox1' ) === null ) {
@@ -832,7 +840,6 @@ class EditPage {
 		if ( $this->textbox1 === false ) {
 			return false;
 		}
-		wfProxyCheck();
 		return true;
 	}
 
@@ -897,7 +904,9 @@ class EditPage {
 				$orig = $this->getOriginalContent();
 				$content = $orig ? $orig->getSection( $this->section ) : null;
 
-				if ( !$content ) $content = $def_content;
+				if ( !$content ) {
+					$content = $def_content;
+				}
 			} else {
 				$undoafter = $wgRequest->getInt( 'undoafter' );
 				$undo = $wgRequest->getInt( 'undo' );
@@ -932,7 +941,19 @@ class EditPage {
 							# If we just undid one rev, use an autosummary
 							$firstrev = $oldrev->getNext();
 							if ( $firstrev && $firstrev->getId() == $undo ) {
-								$undoSummary = wfMessage( 'undo-summary', $undo, $undorev->getUserText() )->inContentLanguage()->text();
+								$userText = $undorev->getUserText();
+								if ( $userText === '' ) {
+									$undoSummary = wfMessage(
+										'undo-summary-username-hidden',
+										$undo
+									)->inContentLanguage()->text();
+								} else {
+									$undoSummary = wfMessage(
+										'undo-summary',
+										$undo,
+										$userText
+									)->inContentLanguage()->text();
+								}
 								if ( $this->summary === '' ) {
 									$this->summary = $undoSummary;
 								} else {
@@ -950,6 +971,7 @@ class EditPage {
 						$undoMsg = 'norev';
 					}
 
+					// Messages: undo-success, undo-failure, undo-norev
 					$class = ( $undoMsg == 'success' ? '' : 'error ' ) . "mw-undo-{$undoMsg}";
 					$this->editFormPageTop .= $wgOut->parse( "<div class=\"{$class}\">" .
 						wfMessage( 'undo-' . $undoMsg )->plain() . '</div>', true, /* interface */true );
@@ -985,7 +1007,9 @@ class EditPage {
 		}
 		$revision = $this->mArticle->getRevisionFetched();
 		if ( $revision === null ) {
-			if ( !$this->contentModel ) $this->contentModel = $this->getTitle()->getContentModel();
+			if ( !$this->contentModel ) {
+				$this->contentModel = $this->getTitle()->getContentModel();
+			}
 			$handler = ContentHandler::getForModelID( $this->contentModel );
 
 			return $handler->makeEmptyContent();
@@ -1007,7 +1031,9 @@ class EditPage {
 		$content = $rev ? $rev->getContent( Revision::RAW ) : null;
 
 		if ( $content === false || $content === null ) {
-			if ( !$this->contentModel ) $this->contentModel = $this->getTitle()->getContentModel();
+			if ( !$this->contentModel ) {
+				$this->contentModel = $this->getTitle()->getContentModel();
+			}
 			$handler = ContentHandler::getForModelID( $this->contentModel );
 
 			return $handler->makeEmptyContent();
@@ -1157,20 +1183,20 @@ class EditPage {
 	 * marked HttpOnly. The JavaScript code converts the cookie to a wgPostEdit config
 	 * variable.
 	 *
-	 * Since WebResponse::setcookie does not allow forcing HttpOnly for a single
-	 * cookie, we have to use PHP's setcookie() directly.
-	 *
 	 * We use a path of '/' since wgCookiePath is not exposed to JS
 	 *
 	 * If the variable were set on the server, it would be cached, which is unwanted
 	 * since the post-edit state should only apply to the load right after the save.
 	 */
 	protected function setPostEditCookie() {
-		global $wgCookiePrefix, $wgCookieDomain;
 		$revisionId = $this->mArticle->getLatest();
 		$postEditKey = self::POST_EDIT_COOKIE_KEY_PREFIX . $revisionId;
 
-		setcookie( $wgCookiePrefix . $postEditKey, '1', time() + self::POST_EDIT_COOKIE_DURATION, '/', $wgCookieDomain );
+		$response = RequestContext::getMain()->getRequest()->response();
+		$response->setcookie( $postEditKey, '1', time() + self::POST_EDIT_COOKIE_DURATION, array(
+			'path' => '/',
+			'httpOnly' => false,
+		) );
 	}
 
 	/**
@@ -1213,7 +1239,7 @@ class EditPage {
 
 			case self::AS_SUCCESS_NEW_ARTICLE:
 				$query = $resultDetails['redirect'] ? 'redirect=no' : '';
-				$anchor = isset ( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
+				$anchor = isset( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
 				$wgOut->redirect( $this->mTitle->getFullURL( $query ) . $anchor );
 				return false;
 
@@ -1355,6 +1381,24 @@ class EditPage {
 			return $status;
 		}
 
+		$spam = $wgRequest->getText( 'wpAntispam' );
+		if ( $spam !== '' ) {
+			wfDebugLog(
+				'SimpleAntiSpam',
+				$wgUser->getName() .
+				' editing "' .
+				$this->mTitle->getPrefixedText() .
+				'" submitted bogus field "' .
+				$spam .
+				'"'
+			);
+			$status->fatal( 'spamprotectionmatch', false );
+			$status->value = self::AS_SPAM_ERROR;
+			wfProfileOut( __METHOD__ . '-checks' );
+			wfProfileOut( __METHOD__ );
+			return $status;
+		}
+
 		try {
 			# Construct Content object
 			$textbox_content = $this->toEditContent( $this->textbox1 );
@@ -1381,6 +1425,18 @@ class EditPage {
 
 		# Check for spam
 		$match = self::matchSummarySpamRegex( $this->summary );
+		if ( $match === false && $this->section == 'new' ) {
+			# $wgSpamRegex is enforced on this new heading/summary because, unlike
+			# regular summaries, it is added to the actual wikitext.
+			if ( $this->sectiontitle !== '' ) {
+				# This branch is taken when the API is used with the 'sectiontitle' parameter.
+				$match = self::matchSpamRegex( $this->sectiontitle );
+			} else {
+				# This branch is taken when the "Add Topic" user interface is used, or the API
+				# is used with the 'summary' parameter.
+				$match = self::matchSpamRegex( $this->summary );
+			}
+		}
 		if ( $match === false ) {
 			$match = self::matchSpamRegex( $this->textbox1 );
 		}
@@ -1454,7 +1510,7 @@ class EditPage {
 			wfProfileOut( __METHOD__ );
 			return $status;
 		}
-		if ( $wgUser->pingLimiter() ) {
+		if ( $wgUser->pingLimiter() || $wgUser->pingLimiter( 'linkpurge', 0 ) ) {
 			$status->fatal( 'actionthrottledtext' );
 			$status->value = self::AS_RATE_LIMITED;
 			wfProfileOut( __METHOD__ . '-checks' );
@@ -1488,8 +1544,17 @@ class EditPage {
 				return $status;
 			}
 
-			# Don't save a new article if it's blank.
-			if ( $this->textbox1 == '' ) {
+			// Don't save a new page if it's blank or if it's a MediaWiki:
+			// message with content equivalent to default (allow empty pages
+			// in this case to disable messages, see bug 50124)
+			$defaultMessageText = $this->mTitle->getDefaultMessageText();
+			if ( $this->mTitle->getNamespace() === NS_MEDIAWIKI && $defaultMessageText !== false ) {
+				$defaultText = $defaultMessageText;
+			} else {
+				$defaultText = '';
+			}
+
+			if ( $this->textbox1 === $defaultText ) {
 				$status->setResult( false, self::AS_BLANK_ARTICLE );
 				wfProfileOut( __METHOD__ );
 				return $status;
@@ -1566,8 +1631,7 @@ class EditPage {
 				}
 			}
 
-			// If sectiontitle is set, use it, otherwise use the summary as the section title (for
-			// backwards compatibility with old forms/bots).
+			// If sectiontitle is set, use it, otherwise use the summary as the section title.
 			if ( $this->sectiontitle !== '' ) {
 				$sectionTitle = $this->sectiontitle;
 			} else {
@@ -1724,6 +1788,10 @@ class EditPage {
 		}
 
 		$result['nullEdit'] = $doEditStatus->hasMessage( 'edit-no-change' );
+		if ( $result['nullEdit'] ) {
+			// We don't know if it was a null edit until now, so increment here
+			$wgUser->pingLimiter( 'linkpurge' );
+		}
 		$result['redirect'] = $content->isRedirect();
 		$this->updateWatchlist();
 		wfProfileOut( __METHOD__ );
@@ -1736,7 +1804,9 @@ class EditPage {
 	protected function updateWatchlist() {
 		global $wgUser;
 
-		if ( $wgUser->isLoggedIn() && $this->watchthis != $wgUser->isWatched( $this->mTitle ) ) {
+		if ( $wgUser->isLoggedIn()
+			&& $this->watchthis != $wgUser->isWatched( $this->mTitle, WatchedItem::IGNORE_USER_RIGHTS )
+		) {
 			$fname = __METHOD__;
 			$title = $this->mTitle;
 			$watch = $this->watchthis;
@@ -1745,11 +1815,7 @@ class EditPage {
 			$dbw = wfGetDB( DB_MASTER );
 			$dbw->onTransactionIdle( function() use ( $dbw, $title, $watch, $wgUser, $fname ) {
 				$dbw->begin( $fname );
-				if ( $watch ) {
-					WatchAction::doWatch( $title, $wgUser );
-				} else {
-					WatchAction::doUnwatch( $title, $wgUser );
-				}
+				WatchAction::doWatchOrUnwatch( $watch, $title, $wgUser );
 				$dbw->commit( $fname );
 			} );
 		}
@@ -1854,11 +1920,11 @@ class EditPage {
 	}
 
 	/**
-	 * Check given input text against $wgSpamRegex, and return the text of the first match.
+	 * Check given input text against $wgSummarySpamRegex, and return the text of the first match.
 	 *
 	 * @param $text string
 	 *
-	 * @return string|bool  matching string or false
+	 * @return string|bool matching string or false
 	 */
 	public static function matchSummarySpamRegex( $text ) {
 		global $wgSummarySpamRegex;
@@ -1885,10 +1951,16 @@ class EditPage {
 		global $wgOut, $wgUser;
 
 		$wgOut->addModules( 'mediawiki.action.edit' );
+		$wgOut->addModuleStyles( 'mediawiki.action.edit.styles' );
 
 		if ( $wgUser->getOption( 'uselivepreview', false ) ) {
 			$wgOut->addModules( 'mediawiki.action.edit.preview' );
 		}
+
+		if ( $wgUser->getOption( 'useeditwarning', false ) ) {
+			$wgOut->addModules( 'mediawiki.action.edit.editWarning' );
+		}
+
 		// Bug #19334: textarea jumps when editing articles in IE8
 		$wgOut->addStyle( 'common/IE80Fixes.css', 'screen', 'IE 8' );
 
@@ -1928,15 +2000,15 @@ class EditPage {
 		if ( $namespace == NS_MEDIAWIKI ) {
 			# Show a warning if editing an interface message
 			$wgOut->wrapWikiMsg( "<div class='mw-editinginterface'>\n$1\n</div>", 'editinginterface' );
-		} else if( $namespace == NS_FILE ) {
+		} elseif ( $namespace == NS_FILE ) {
 			# Show a hint to shared repo
 			$file = wfFindFile( $this->mTitle );
-			if( $file && !$file->isLocal() ) {
+			if ( $file && !$file->isLocal() ) {
 				$descUrl = $file->getDescriptionUrl();
 				# there must be a description url to show a hint to shared repo
-				if( $descUrl ) {
-					if( !$this->mTitle->exists() ) {
-						$wgOut->wrapWikiMsg( "<div class=\"mw-sharedupload-desc-create\">\n$1\n</div>", array (
+				if ( $descUrl ) {
+					if ( !$this->mTitle->exists() ) {
+						$wgOut->wrapWikiMsg( "<div class=\"mw-sharedupload-desc-create\">\n$1\n</div>", array(
 									'sharedupload-desc-create', $file->getRepo()->getDisplayName(), $descUrl
 						) );
 					} else {
@@ -2126,7 +2198,7 @@ class EditPage {
 			}
 		}
 
-		//@todo: add EditForm plugin interface and use it here!
+		// @todo add EditForm plugin interface and use it here!
 		//       search for textarea1 and textares2, and allow EditForm to override all uses.
 		$wgOut->addHTML( Html::openElement( 'form', array( 'id' => self::EDITFORM_ID, 'name' => self::EDITFORM_ID,
 			'method' => 'post', 'action' => $this->getActionURL( $this->getContextTitle() ),
@@ -2136,6 +2208,14 @@ class EditPage {
 			call_user_func_array( $formCallback, array( &$wgOut ) );
 		}
 
+		// Add an empty field to trip up spambots
+		$wgOut->addHTML(
+			Xml::openElement( 'div', array( 'id' => 'antispam-container', 'style' => 'display: none;' ) )
+			. Html::rawElement( 'label', array( 'for' => 'wpAntiSpam' ), wfMessage( 'simpleantispam-label' )->parse() )
+			. Xml::element( 'input', array( 'type' => 'text', 'name' => 'wpAntispam', 'id' => 'wpAntispam', 'value' => '' ) )
+			. Xml::closeElement( 'div' )
+		);
+
 		wfRunHooks( 'EditPage::showEditForm:fields', array( &$this, &$wgOut ) );
 
 		// Put these up at the top to ensure they aren't lost on early form submission
@@ -2161,7 +2241,7 @@ class EditPage {
 		}
 
 		# When the summary is hidden, also hide them on preview/show changes
-		if( $this->nosummary ) {
+		if ( $this->nosummary ) {
 			$wgOut->addHTML( Html::hidden( 'nosummary', true ) );
 		}
 
@@ -2239,6 +2319,11 @@ class EditPage {
 		$wgOut->addHTML( Html::rawElement( 'div', array( 'class' => 'hiddencats' ),
 			Linker::formatHiddenCategories( $this->mArticle->getHiddenCategories() ) ) );
 
+		$wgOut->addHTML( Html::rawElement( 'div', array( 'class' => 'limitreport' ),
+			self::getPreviewLimitReport( $this->mParserOutput ) ) );
+
+		$wgOut->addModules( 'mediawiki.action.edit.collapsibleFooter' );
+
 		if ( $this->isConflict ) {
 			try {
 				$this->showConflict();
@@ -2282,7 +2367,7 @@ class EditPage {
 		}
 
 		// Add edit notices
-		$wgOut->addHTML( implode( "\n", $this->mTitle->getEditNotices() ) );
+		$wgOut->addHTML( implode( "\n", $this->mTitle->getEditNotices( $this->oldid ) ) );
 
 		if ( $this->isConflict ) {
 			$wgOut->wrapWikiMsg( "<div class='mw-explainconflict'>\n$1\n</div>", 'explainconflict' );
@@ -2509,7 +2594,7 @@ class EditPage {
 		global $wgParser;
 
 		if ( $isSubjectPreview ) {
-			$summary = wfMessage( 'newsectionsummary', $wgParser->stripSectionName( $summary ) )
+			$summary = wfMessage( 'newsectionsummary' )->rawParams( $wgParser->stripSectionName( $summary ) )
 				->inContentLanguage()->text();
 		}
 
@@ -2626,7 +2711,7 @@ HTML
 
 		$attribs = $customAttribs + array(
 			'accesskey' => ',',
-			'id'   => $name,
+			'id' => $name,
 			'cols' => $wgUser->getIntOption( 'cols' ),
 			'rows' => $wgUser->getIntOption( 'rows' ),
 			'style' => '' // avoid php notices when appending preferences (appending allows customAttribs['style'] to still work
@@ -2702,9 +2787,9 @@ HTML
 
 		$oldtitlemsg = 'currentrev';
 		# if message does not exist, show diff against the preloaded default
-		if( $this->mTitle->getNamespace() == NS_MEDIAWIKI && !$this->mTitle->exists() ) {
+		if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI && !$this->mTitle->exists() ) {
 			$oldtext = $this->mTitle->getDefaultMessageText();
-			if( $oldtext !== false ) {
+			if ( $oldtext !== false ) {
 				$oldtitlemsg = 'defaultmessagetext';
 				$oldContent = $this->toEditContent( $oldtext );
 			} else {
@@ -2799,7 +2884,15 @@ HTML
 		return self::getCopyrightWarning( $this->mTitle );
 	}
 
-	public static function getCopyrightWarning( $title ) {
+	/**
+	 * Get the copyright warning, by default returns wikitext
+	 *
+	 * @param Title $title
+	 * @param string $format output format, valid values are any function of
+	 *                       a Message object
+	 * @return string
+	 */
+	public static function getCopyrightWarning( $title, $format = 'plain' ) {
 		global $wgRightsText;
 		if ( $wgRightsText ) {
 			$copywarnMsg = array( 'copyrightwarning',
@@ -2813,7 +2906,60 @@ HTML
 		wfRunHooks( 'EditPageCopyrightWarning', array( $title, &$copywarnMsg ) );
 
 		return "<div id=\"editpage-copywarn\">\n" .
-			call_user_func_array( 'wfMessage', $copywarnMsg )->plain() . "\n</div>";
+			call_user_func_array( 'wfMessage', $copywarnMsg )->$format() . "\n</div>";
+	}
+
+	/**
+	 * Get the Limit report for page previews
+	 *
+	 * @since 1.22
+	 * @param ParserOutput $output ParserOutput object from the parse
+	 * @return string HTML
+	 */
+	public static function getPreviewLimitReport( $output ) {
+		if ( !$output || !$output->getLimitReportData() ) {
+			return '';
+		}
+
+		wfProfileIn( __METHOD__ );
+
+		$limitReport = Html::rawElement( 'div', array( 'class' => 'mw-limitReportExplanation' ),
+			wfMessage( 'limitreport-title' )->parseAsBlock()
+		);
+
+		// Show/hide animation doesn't work correctly on a table, so wrap it in a div.
+		$limitReport .= Html::openElement( 'div', array( 'class' => 'preview-limit-report-wrapper' ) );
+
+		$limitReport .= Html::openElement( 'table', array(
+			'class' => 'preview-limit-report wikitable'
+		) ) .
+			Html::openElement( 'tbody' );
+
+		foreach ( $output->getLimitReportData() as $key => $value ) {
+			if ( wfRunHooks( 'ParserLimitReportFormat',
+				array( $key, $value, &$limitReport, true, true )
+			) ) {
+				$keyMsg = wfMessage( $key );
+				$valueMsg = wfMessage( array( "$key-value-html", "$key-value" ) );
+				if ( !$valueMsg->exists() ) {
+					$valueMsg = new RawMessage( '$1' );
+				}
+				if ( !$keyMsg->isDisabled() && !$valueMsg->isDisabled() ) {
+					$limitReport .= Html::openElement( 'tr' ) .
+						Html::rawElement( 'th', null, $keyMsg->parse() ) .
+						Html::rawElement( 'td', null, $valueMsg->params( $value )->parse() ) .
+						Html::closeElement( 'tr' );
+				}
+			}
+		}
+
+		$limitReport .= Html::closeElement( 'tbody' ) .
+			Html::closeElement( 'table' ) .
+			Html::closeElement( 'div' );
+
+		wfProfileOut( __METHOD__ );
+
+		return $limitReport;
 	}
 
 	protected function showStandardInputs( &$tabindex = 2 ) {
@@ -2838,7 +2984,9 @@ HTML
 
 		$cancel = $this->getCancelLink();
 		if ( $cancel !== '' ) {
-			$cancel .= wfMessage( 'pipe-separator' )->text();
+			$cancel .= Html::element( 'span',
+				array( 'class' => 'mw-editButtons-pipe-separator' ),
+				wfMessage( 'pipe-separator' )->text() );
 		}
 		$edithelpurl = Skin::makeInternalOrExternalUrl( wfMessage( 'edithelppage' )->inContentLanguage()->text() );
 		$edithelp = '<a target="helpwindow" href="' . $edithelpurl . '">' .
@@ -3028,9 +3176,9 @@ HTML
 
 			# don't parse non-wikitext pages, show message about preview
 			if ( $this->mTitle->isCssJsSubpage() || $this->mTitle->isCssOrJsPage() ) {
-				if( $this->mTitle->isCssJsSubpage() ) {
+				if ( $this->mTitle->isCssJsSubpage() ) {
 					$level = 'user';
-				} elseif( $this->mTitle->isCssOrJsPage() ) {
+				} elseif ( $this->mTitle->isCssOrJsPage() ) {
 					$level = 'site';
 				} else {
 					$level = false;
@@ -3046,7 +3194,7 @@ HTML
 
 				# Used messages to make sure grep find them:
 				# Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
-				if( $level && $format ) {
+				if ( $level && $format ) {
 					$note = "<div id='mw-{$level}{$format}preview'>" . wfMessage( "{$level}{$format}preview" )->text() . "</div>";
 				}
 			}
@@ -3098,9 +3246,9 @@ HTML
 			'<h2 id="mw-previewheader">' . wfMessage( 'preview' )->escaped() . "</h2>" .
 			$wgOut->parse( $note, true, /* interface */true ) . $conflict . "</div>\n";
 
-		$pageLang = $this->mTitle->getPageLanguage();
-		$attribs = array( 'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(),
-			'class' => 'mw-content-' . $pageLang->getDir() );
+		$pageViewLang = $this->mTitle->getPageViewLanguage();
+		$attribs = array( 'lang' => $pageViewLang->getHtmlCode(), 'dir' => $pageViewLang->getDir(),
+			'class' => 'mw-content-' . $pageViewLang->getDir() );
 		$previewHTML = Html::rawElement( 'div', $attribs, $previewHTML );
 
 		wfProfileOut( __METHOD__ );
@@ -3314,9 +3462,9 @@ HTML
 			$minorLabel = wfMessage( 'minoredit' )->parse();
 			if ( $wgUser->isAllowed( 'minoredit' ) ) {
 				$attribs = array(
-					'tabindex'  => ++$tabindex,
+					'tabindex' => ++$tabindex,
 					'accesskey' => wfMessage( 'accesskey-minoredit' )->text(),
-					'id'        => 'wpMinoredit',
+					'id' => 'wpMinoredit',
 				);
 				$checkboxes['minor'] =
 					Xml::check( 'wpMinoredit', $checked['minor'], $attribs ) .
@@ -3330,9 +3478,9 @@ HTML
 		$checkboxes['watch'] = '';
 		if ( $wgUser->isLoggedIn() ) {
 			$attribs = array(
-				'tabindex'  => ++$tabindex,
+				'tabindex' => ++$tabindex,
 				'accesskey' => wfMessage( 'accesskey-watch' )->text(),
-				'id'        => 'wpWatchthis',
+				'id' => 'wpWatchthis',
 			);
 			$checkboxes['watch'] =
 				Xml::check( 'wpWatchthis', $checked['watch'], $attribs ) .
@@ -3356,37 +3504,37 @@ HTML
 		$buttons = array();
 
 		$temp = array(
-			'id'        => 'wpSave',
-			'name'      => 'wpSave',
-			'type'      => 'submit',
-			'tabindex'  => ++$tabindex,
-			'value'     => wfMessage( 'savearticle' )->text(),
+			'id' => 'wpSave',
+			'name' => 'wpSave',
+			'type' => 'submit',
+			'tabindex' => ++$tabindex,
+			'value' => wfMessage( 'savearticle' )->text(),
 			'accesskey' => wfMessage( 'accesskey-save' )->text(),
-			'title'     => wfMessage( 'tooltip-save' )->text() . ' [' . wfMessage( 'accesskey-save' )->text() . ']',
+			'title' => wfMessage( 'tooltip-save' )->text() . ' [' . wfMessage( 'accesskey-save' )->text() . ']',
 		);
 		$buttons['save'] = Xml::element( 'input', $temp, '' );
 
 		++$tabindex; // use the same for preview and live preview
 		$temp = array(
-			'id'        => 'wpPreview',
-			'name'      => 'wpPreview',
-			'type'      => 'submit',
-			'tabindex'  => $tabindex,
-			'value'     => wfMessage( 'showpreview' )->text(),
+			'id' => 'wpPreview',
+			'name' => 'wpPreview',
+			'type' => 'submit',
+			'tabindex' => $tabindex,
+			'value' => wfMessage( 'showpreview' )->text(),
 			'accesskey' => wfMessage( 'accesskey-preview' )->text(),
-			'title'     => wfMessage( 'tooltip-preview' )->text() . ' [' . wfMessage( 'accesskey-preview' )->text() . ']',
+			'title' => wfMessage( 'tooltip-preview' )->text() . ' [' . wfMessage( 'accesskey-preview' )->text() . ']',
 		);
 		$buttons['preview'] = Xml::element( 'input', $temp, '' );
 		$buttons['live'] = '';
 
 		$temp = array(
-			'id'        => 'wpDiff',
-			'name'      => 'wpDiff',
-			'type'      => 'submit',
-			'tabindex'  => ++$tabindex,
-			'value'     => wfMessage( 'showdiff' )->text(),
+			'id' => 'wpDiff',
+			'name' => 'wpDiff',
+			'type' => 'submit',
+			'tabindex' => ++$tabindex,
+			'value' => wfMessage( 'showdiff' )->text(),
 			'accesskey' => wfMessage( 'accesskey-diff' )->text(),
-			'title'     => wfMessage( 'tooltip-diff' )->text() . ' [' . wfMessage( 'accesskey-diff' )->text() . ']',
+			'title' => wfMessage( 'tooltip-diff' )->text() . ' [' . wfMessage( 'accesskey-diff' )->text() . ']',
 		);
 		$buttons['diff'] = Xml::element( 'input', $temp, '' );
 
@@ -3506,7 +3654,7 @@ HTML
 		global $wgOut, $wgLang;
 		$this->textbox2 = $this->textbox1;
 
-		if( is_array( $match ) ) {
+		if ( is_array( $match ) ) {
 			$match = $wgLang->listToText( $match );
 		}
 		$wgOut->prepareErrorPage( wfMessage( 'spamprotectiontitle' ) );
diff --git a/includes/Exception.php b/includes/Exception.php
index 0bd7a2a7..5bad88c2 100644
--- a/includes/Exception.php
+++ b/includes/Exception.php
@@ -30,7 +30,6 @@
  * @ingroup Exception
  */
 class MWException extends Exception {
-	var $logId;
 
 	/**
 	 * Should the exception use $wgOut to output the error?
@@ -44,6 +43,16 @@ class MWException extends Exception {
 			!empty( $GLOBALS['wgTitle'] );
 	}
 
+	/**
+	 * Whether to log this exception in the exception debug log.
+	 *
+	 * @since 1.23
+	 * @return boolean
+	 */
+	function isLoggable() {
+		return true;
+	}
+
 	/**
 	 * Can the extension use the Message class/wfMessage to get i18n-ed messages?
 	 *
@@ -75,11 +84,11 @@ class MWException extends Exception {
 			return null; // Just silently ignore
 		}
 
-		if ( !array_key_exists( $name, $wgExceptionHooks ) || !is_array( $wgExceptionHooks[ $name ] ) ) {
+		if ( !array_key_exists( $name, $wgExceptionHooks ) || !is_array( $wgExceptionHooks[$name] ) ) {
 			return null;
 		}
 
-		$hooks = $wgExceptionHooks[ $name ];
+		$hooks = $wgExceptionHooks[$name];
 		$callargs = array_merge( array( $this ), $args );
 
 		foreach ( $hooks as $hook ) {
@@ -126,13 +135,12 @@ class MWException extends Exception {
 		global $wgShowExceptionDetails;
 
 		if ( $wgShowExceptionDetails ) {
-			return '<p>' . nl2br( htmlspecialchars( $this->getMessage() ) ) .
-				'</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) ) .
+			return '<p>' . nl2br( htmlspecialchars( MWExceptionHandler::getLogMessage( $this ) ) ) .
+				'</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( MWExceptionHandler::getRedactedTraceAsString( $this ) ) ) .
 				"</p>\n";
 		} else {
-			return
-				"<div class=\"errorbox\">" .
-				'[' . $this->getLogId() . '] ' .
+			return "<div class=\"errorbox\">" .
+				'[' . MWExceptionHandler::getLogId( $this ) . '] ' .
 				gmdate( 'Y-m-d H:i:s' ) .
 				": Fatal exception of type " . get_class( $this ) . "</div>\n" .
 				"<!-- Set \$wgShowExceptionDetails = true; " .
@@ -152,8 +160,8 @@ class MWException extends Exception {
 		global $wgShowExceptionDetails;
 
 		if ( $wgShowExceptionDetails ) {
-			return $this->getMessage() .
-				"\nBacktrace:\n" . $this->getTraceAsString() . "\n";
+			return MWExceptionHandler::getLogMessage( $this ) .
+				"\nBacktrace:\n" . MWExceptionHandler::getRedactedTraceAsString( $this ) . "\n";
 		} else {
 			return "Set \$wgShowExceptionDetails = true; " .
 				"in LocalSettings.php to show detailed debugging information.\n";
@@ -170,43 +178,28 @@ class MWException extends Exception {
 	}
 
 	/**
-	 * Get a random ID for this error.
-	 * This allows to link the exception to its corresponding log entry when
-	 * $wgShowExceptionDetails is set to false.
+	 * Get a the ID for this error.
 	 *
+	 * @since 1.20
+	 * @deprecated since 1.22 Use MWExceptionHandler::getLogId instead.
 	 * @return string
 	 */
 	function getLogId() {
-		if ( $this->logId === null ) {
-			$this->logId = wfRandomString( 8 );
-		}
-		return $this->logId;
+		wfDeprecated( __METHOD__, '1.22' );
+		return MWExceptionHandler::getLogId( $this );
 	}
 
 	/**
 	 * Return the requested URL and point to file and line number from which the
 	 * exception occurred
 	 *
+	 * @since 1.8
+	 * @deprecated since 1.22 Use MWExceptionHandler::getLogMessage instead.
 	 * @return string
 	 */
 	function getLogMessage() {
-		global $wgRequest;
-
-		$id = $this->getLogId();
-		$file = $this->getFile();
-		$line = $this->getLine();
-		$message = $this->getMessage();
-
-		if ( isset( $wgRequest ) && !$wgRequest instanceof FauxRequest ) {
-			$url = $wgRequest->getRequestURL();
-			if ( !$url ) {
-				$url = '[no URL]';
-			}
-		} else {
-			$url = '[no req]';
-		}
-
-		return "[$id] $url   Exception from line $line of $file: $message";
+		wfDeprecated( __METHOD__, '1.22' );
+		return MWExceptionHandler::getLogMessage( $this );
 	}
 
 	/**
@@ -248,16 +241,9 @@ class MWException extends Exception {
 	 * It will be either HTML or plain text based on isCommandLine().
 	 */
 	function report() {
-		global $wgLogExceptionBacktrace;
-		$log = $this->getLogMessage();
+		global $wgMimeType;
 
-		if ( $log ) {
-			if ( $wgLogExceptionBacktrace ) {
-				wfDebugLog( 'exception', $log . "\n" . $this->getTraceAsString() . "\n" );
-			} else {
-				wfDebugLog( 'exception', $log );
-			}
-		}
+		MWExceptionHandler::logException( $this );
 
 		if ( defined( 'MW_API' ) ) {
 			// Unhandled API exception, we can't be sure that format printer is alive
@@ -268,6 +254,7 @@ class MWException extends Exception {
 		} else {
 			header( "HTTP/1.1 500 MediaWiki exception" );
 			header( "Status: 500 MediaWiki exception", true );
+			header( "Content-Type: $wgMimeType; charset=utf-8", true );
 
 			$this->reportHTML();
 		}
@@ -329,11 +316,17 @@ class ErrorPageError extends MWException {
 		$this->msg = $msg;
 		$this->params = $params;
 
-		if( $msg instanceof Message ) {
-			parent::__construct( $msg );
+		// Bug 44111: Messages in the log files should be in English and not
+		// customized by the local wiki. So get the default English version for
+		// passing to the parent constructor. Our overridden report() below
+		// makes sure that the page shown to the user is not forced to English.
+		if ( $msg instanceof Message ) {
+			$enMsg = clone( $msg );
 		} else {
-			parent::__construct( wfMessage( $msg )->text() );
+			$enMsg = wfMessage( $msg, $params );
 		}
+		$enMsg->inLanguage( 'en' )->useDatabase( false );
+		parent::__construct( $enMsg->text() );
 	}
 
 	function report() {
@@ -461,39 +454,9 @@ class ThrottledError extends ErrorPageError {
  */
 class UserBlockedError extends ErrorPageError {
 	public function __construct( Block $block ) {
-		global $wgLang, $wgRequest;
-
-		$blocker = $block->getBlocker();
-		if ( $blocker instanceof User ) { // local user
-			$blockerUserpage = $block->getBlocker()->getUserPage();
-			$link = "[[{$blockerUserpage->getPrefixedText()}|{$blockerUserpage->getText()}]]";
-		} else { // foreign user
-			$link = $blocker;
-		}
-
-		$reason = $block->mReason;
-		if( $reason == '' ) {
-			$reason = wfMessage( 'blockednoreason' )->text();
-		}
-
-		/* $ip returns who *is* being blocked, $intended contains who was meant to be blocked.
-		 * This could be a username, an IP range, or a single IP. */
-		$intended = $block->getTarget();
-
-		parent::__construct(
-			'blockedtitle',
-			$block->mAuto ? 'autoblockedtext' : 'blockedtext',
-			array(
-				$link,
-				$reason,
-				$wgRequest->getIP(),
-				$block->getByName(),
-				$block->getId(),
-				$wgLang->formatExpiry( $block->mExpiry ),
-				$intended,
-				$wgLang->timeanddate( wfTimestamp( TS_MW, $block->mTimestamp ), true )
-			)
-		);
+		// @todo FIXME: Implement a more proper way to get context here.
+		$params = $block->getPermissionsError( RequestContext::getMain() );
+		parent::__construct( 'blockedtitle', array_shift( $params ), $params );
 	}
 }
 
@@ -611,7 +574,7 @@ class HttpError extends MWException {
 			$content = htmlspecialchars( $this->content );
 		}
 
-		return "<!DOCTYPE html>\n".
+		return "<!DOCTYPE html>\n" .
 			"<html><head><title>$header</title></head>\n" .
 			"<body><h1>$header</h1><p>$content</p></body></html>\n";
 	}
@@ -648,8 +611,10 @@ class MWExceptionHandler {
 				$message = "MediaWiki internal error.\n\n";
 
 				if ( $wgShowExceptionDetails ) {
-					$message .= 'Original exception: ' . $e->__toString() . "\n\n" .
-						'Exception caught inside exception handler: ' . $e2->__toString();
+					$message .= 'Original exception: ' . self::getLogMessage( $e ) .
+						 "\nBacktrace:\n" . self::getRedactedTraceAsString( $e ) .
+						 "\n\nException caught inside exception handler: " . self::getLogMessage( $e2 ) .
+						 "\nBacktrace:\n" . self::getRedactedTraceAsString( $e2 );
 				} else {
 					$message .= "Exception caught inside exception handler.\n\n" .
 						"Set \$wgShowExceptionDetails = true; at the bottom of LocalSettings.php " .
@@ -665,11 +630,11 @@ class MWExceptionHandler {
 				}
 			}
 		} else {
-			$message = "Unexpected non-MediaWiki exception encountered, of type \"" . get_class( $e ) . "\"\n" .
-				$e->__toString() . "\n";
+			$message = "Unexpected non-MediaWiki exception encountered, of type \"" . get_class( $e ) . "\"";
 
 			if ( $wgShowExceptionDetails ) {
-				$message .= "\n" . $e->getTraceAsString() . "\n";
+				$message .= "\n" . MWExceptionHandler::getLogMessage( $e ) . "\nBacktrace:\n" .
+					self::getRedactedTraceAsString( $e ) . "\n";
 			}
 
 			if ( $cmdLine ) {
@@ -692,7 +657,7 @@ class MWExceptionHandler {
 		if ( defined( 'STDERR' ) ) {
 			fwrite( STDERR, $message );
 		} else {
-			echo( $message );
+			echo $message;
 		}
 	}
 
@@ -715,11 +680,145 @@ class MWExceptionHandler {
 		// Final cleanup
 		if ( $wgFullyInitialised ) {
 			try {
-				wfLogProfilingData(); // uses $wgRequest, hence the $wgFullyInitialised condition
-			} catch ( Exception $e ) {}
+				// uses $wgRequest, hence the $wgFullyInitialised condition
+				wfLogProfilingData();
+			} catch ( Exception $e ) {
+			}
 		}
 
 		// Exit value should be nonzero for the benefit of shell jobs
 		exit( 1 );
 	}
+
+	/**
+	 * Generate a string representation of an exception's stack trace
+	 *
+	 * Like Exception::getTraceAsString, but replaces argument values with
+	 * argument type or class name.
+	 *
+	 * @param Exception $e
+	 * @return string
+	 */
+	public static function getRedactedTraceAsString( Exception $e ) {
+		$text = '';
+
+		foreach ( self::getRedactedTrace( $e ) as $level => $frame ) {
+			if ( isset( $frame['file'] ) && isset( $frame['line'] ) ) {
+				$text .= "#{$level} {$frame['file']}({$frame['line']}): ";
+			} else {
+				// 'file' and 'line' are unset for calls via call_user_func (bug 55634)
+				// This matches behaviour of Exception::getTraceAsString to instead
+				// display "[internal function]".
+				$text .= "#{$level} [internal function]: ";
+			}
+
+			if ( isset( $frame['class'] ) ) {
+				$text .= $frame['class'] . $frame['type'] . $frame['function'];
+			} else {
+				$text .= $frame['function'];
+			}
+
+			if ( isset( $frame['args'] ) ) {
+				$text .= '(' . implode( ', ', $frame['args'] ) . ")\n";
+			} else {
+				$text .= "()\n";
+			}
+		}
+
+		$level = $level + 1;
+		$text .= "#{$level} {main}";
+
+		return $text;
+	}
+
+	/**
+	 * Return a copy of an exception's backtrace as an array.
+	 *
+	 * Like Exception::getTrace, but replaces each element in each frame's
+	 * argument array with the name of its class (if the element is an object)
+	 * or its type (if the element is a PHP primitive).
+	 *
+	 * @since 1.22
+	 * @param Exception $e
+	 * @return array
+	 */
+	public static function getRedactedTrace( Exception $e ) {
+		return array_map( function ( $frame ) {
+			if ( isset( $frame['args'] ) ) {
+				$frame['args'] = array_map( function ( $arg ) {
+					return is_object( $arg ) ? get_class( $arg ) : gettype( $arg );
+				}, $frame['args'] );
+			}
+			return $frame;
+		}, $e->getTrace() );
+	}
+
+
+	/**
+	 * Get the ID for this error.
+	 *
+	 * The ID is saved so that one can match the one output to the user (when
+	 * $wgShowExceptionDetails is set to false), to the entry in the debug log.
+	 *
+	 * @since 1.22
+	 * @param Exception $e
+	 * @return string
+	 */
+	public static function getLogId( Exception $e ) {
+		if ( !isset( $e->_mwLogId ) ) {
+			$e->_mwLogId = wfRandomString( 8 );
+		}
+		return $e->_mwLogId;
+	}
+
+	/**
+	 * Return the requested URL and point to file and line number from which the
+	 * exception occurred.
+	 *
+	 * @since 1.22
+	 * @param Exception $e
+	 * @return string
+	 */
+	public static function getLogMessage( Exception $e ) {
+		global $wgRequest;
+
+		$id = self::getLogId( $e );
+		$file = $e->getFile();
+		$line = $e->getLine();
+		$message = $e->getMessage();
+
+		if ( isset( $wgRequest ) && !$wgRequest instanceof FauxRequest ) {
+			$url = $wgRequest->getRequestURL();
+			if ( !$url ) {
+				$url = '[no URL]';
+			}
+		} else {
+			$url = '[no req]';
+		}
+
+		return "[$id] $url   Exception from line $line of $file: $message";
+	}
+
+	/**
+	 * Log an exception to the exception log (if enabled).
+	 *
+	 * This method must not assume the exception is an MWException,
+	 * it is also used to handle PHP errors or errors from other libraries.
+	 *
+	 * @since 1.22
+	 * @param Exception $e
+	 */
+	public static function logException( Exception $e ) {
+		global $wgLogExceptionBacktrace;
+
+		if ( !( $e instanceof MWException ) || $e->isLoggable() ) {
+			$log = self::getLogMessage( $e );
+			if ( $wgLogExceptionBacktrace ) {
+				wfDebugLog( 'exception', $log . "\n" . $e->getTraceAsString() . "\n" );
+			} else {
+				wfDebugLog( 'exception', $log );
+			}
+		}
+	}
+
 }
diff --git a/includes/Export.php b/includes/Export.php
index d8cc0242..98de4c00 100644
--- a/includes/Export.php
+++ b/includes/Export.php
@@ -249,9 +249,13 @@ class WikiExporter {
 			$where = array( 'user_id = log_user' );
 			# Hide private logs
 			$hideLogs = LogEventsList::getExcludeClause( $this->db );
-			if ( $hideLogs ) $where[] = $hideLogs;
+			if ( $hideLogs ) {
+				$where[] = $hideLogs;
+			}
 			# Add on any caller specified conditions
-			if ( $cond ) $where[] = $cond;
+			if ( $cond ) {
+				$where[] = $cond;
+			}
 			# Get logging table name for logging.* clause
 			$logging = $this->db->tableName( 'logging' );
 
@@ -296,6 +300,7 @@ class WikiExporter {
 				}
 
 				// Inform caller about problem
+				wfProfileOut( __METHOD__ );
 				throw $e;
 			}
 		# For page dumps...
@@ -541,7 +546,7 @@ class XmlDumpWriter {
 	 * @return string
 	 */
 	function homelink() {
-		return Xml::element( 'base', array(), Title::newMainPage()->getCanonicalUrl() );
+		return Xml::element( 'base', array(), Title::newMainPage()->getCanonicalURL() );
 	}
 
 	/**
@@ -563,8 +568,9 @@ class XmlDumpWriter {
 		foreach ( $wgContLang->getFormattedNamespaces() as $ns => $title ) {
 			$spaces .= '      ' .
 				Xml::element( 'namespace',
-					array(	'key' => $ns,
-							'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive',
+					array(
+						'key' => $ns,
+						'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive',
 					), $title ) . "\n";
 		}
 		$spaces .= "    </namespaces>";
@@ -593,7 +599,7 @@ class XmlDumpWriter {
 		$out = "  <page>\n";
 		$title = Title::makeTitle( $row->page_namespace, $row->page_title );
 		$out .= '    ' . Xml::elementClean( 'title', array(), self::canonicalTitle( $title ) ) . "\n";
-		$out .= '    ' . Xml::element( 'ns', array(), strval( $row->page_namespace) ) . "\n";
+		$out .= '    ' . Xml::element( 'ns', array(), strval( $row->page_namespace ) ) . "\n";
 		$out .= '    ' . Xml::element( 'id', array(), strval( $row->page_id ) ) . "\n";
 		if ( $row->page_is_redirect ) {
 			$page = WikiPage::factory( $title );
@@ -636,7 +642,7 @@ class XmlDumpWriter {
 
 		$out = "    <revision>\n";
 		$out .= "      " . Xml::element( 'id', null, strval( $row->rev_id ) ) . "\n";
-		if( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
+		if ( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
 			$out .= "      " . Xml::element( 'parentid', null, strval( $row->rev_parent_id ) ) . "\n";
 		}
 
@@ -683,7 +689,7 @@ class XmlDumpWriter {
 			$content_model = strval( $row->rev_content_model );
 		} else {
 			// probably using $wgContentHandlerUseDB = false;
-			// @todo: test!
+			// @todo test!
 			$title = Title::makeTitle( $row->page_namespace, $row->page_title );
 			$content_model = ContentHandler::getDefaultModelFor( $title );
 		}
@@ -694,7 +700,7 @@ class XmlDumpWriter {
 			$content_format = strval( $row->rev_content_format );
 		} else {
 			// probably using $wgContentHandlerUseDB = false;
-			// @todo: test!
+			// @todo test!
 			$content_handler = ContentHandler::getForModelID( $content_model );
 			$content_format = $content_handler->getDefaultFormat();
 		}
@@ -818,10 +824,13 @@ class XmlDumpWriter {
 			$archiveName = '';
 		}
 		if ( $dumpContents ) {
+			$be = $file->getRepo()->getBackend();
 			# Dump file as base64
 			# Uses only XML-safe characters, so does not need escaping
+			# @TODO: too bad this loads the contents into memory (script might swap)
 			$contents = '      <contents encoding="base64">' .
-				chunk_split( base64_encode( file_get_contents( $file->getPath() ) ) ) .
+				chunk_split( base64_encode(
+					$be->getFileContents( array( 'src' => $file->getPath() ) ) ) ) .
 				"      </contents>\n";
 		} else {
 			$contents = '';
@@ -837,7 +846,7 @@ class XmlDumpWriter {
 			"      " . $comment . "\n" .
 			"      " . Xml::element( 'filename', null, $file->getName() ) . "\n" .
 			$archiveName .
-			"      " . Xml::element( 'src', null, $file->getCanonicalUrl() ) . "\n" .
+			"      " . Xml::element( 'src', null, $file->getCanonicalURL() ) . "\n" .
 			"      " . Xml::element( 'size', null, $file->getSize() ) . "\n" .
 			"      " . Xml::element( 'sha1base36', null, $file->getSha1() ) . "\n" .
 			"      " . Xml::element( 'rel', null, $file->getRel() ) . "\n" .
@@ -1185,7 +1194,7 @@ class Dump7ZipOutput extends DumpPipeOutput {
 		// Suppress annoying useless crap from p7zip
 		// Unfortunately this could suppress real error messages too
 		$command .= ' >' . wfGetNull() . ' 2>&1';
-		return( $command );
+		return $command;
 	}
 
 	/**
diff --git a/includes/ExternalEdit.php b/includes/ExternalEdit.php
deleted file mode 100644
index 11e94230..00000000
--- a/includes/ExternalEdit.php
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-/**
- * External editors support
- *
- * License: Public domain
- *
- * @file
- * @author Erik Moeller <moeller@scireview.de>
- */
-
-/**
- * Support for external editors to modify both text and files
- * in external applications. It works as follows: MediaWiki
- * sends a meta-file with the MIME type 'application/x-external-editor'
- * to the client. The user has to associate that MIME type with
- * a helper application (a reference implementation in Perl
- * can be found in extensions/ee), which will launch the editor,
- * and save the modified data back to the server.
- *
- */
-class ExternalEdit extends ContextSource {
-
-	/**
-	 * Array of URLs to link to
-	 * @var Array
-	 */
-	private $urls;
-
-	/**
-	 * Constructor
-	 * @param $context IContextSource context to use
-	 * @param $urls array
-	 */
-	public function __construct( IContextSource $context, array $urls = array() ) {
-		$this->setContext( $context );
-		$this->urls = $urls;
-	}
-
-	/**
-	 * Check whether external edit or diff should be used.
-	 *
-	 * @param $context IContextSource context to use
-	 * @param string $type can be either 'edit' or 'diff'
-	 * @return Bool
-	 */
-	public static function useExternalEngine( IContextSource $context, $type ) {
-		global $wgUseExternalEditor;
-
-		if ( !$wgUseExternalEditor ) {
-			return false;
-		}
-
-		$pref = $type == 'diff' ? 'externaldiff' : 'externaleditor';
-		$request = $context->getRequest();
-
-		return !$request->getVal( 'internaledit' ) &&
-			( $context->getUser()->getOption( $pref ) || $request->getVal( 'externaledit' ) );
-	}
-
-	/**
-	 * Output the information for the external editor
-	 */
-	public function execute() {
-		global $wgContLang, $wgScript, $wgScriptPath, $wgCanonicalServer;
-
-		$this->getOutput()->disable();
-
-		$response = $this->getRequest()->response();
-		$response->header( 'Content-type: application/x-external-editor; charset=utf-8' );
-		$response->header( 'Cache-control: no-cache' );
-
-		$special = $wgContLang->getNsText( NS_SPECIAL );
-
-		# $type can be "Edit text", "Edit file" or "Diff text" at the moment
-		# See the protocol specifications at [[m:Help:External editors/Tech]] for
-		# details.
-		if ( count( $this->urls ) ) {
-			$urls = $this->urls;
-			$type = "Diff text";
-		} elseif ( $this->getRequest()->getVal( 'mode' ) == 'file' ) {
-			$type = "Edit file";
-			$image = wfLocalFile( $this->getTitle() );
-			if ( $image ) {
-				$urls = array(
-					'File' => array(
-						'Extension' => $image->getExtension(),
-						'URL' => $image->getCanonicalURL()
-					)
-				);
-			} else {
-				$urls = array();
-			}
-		} else {
-			$type = "Edit text";
-			# *.wiki file extension is used by some editors for syntax
-			# highlighting, so we follow that convention
-			$urls = array( 'File' => array(
-				'Extension' => 'wiki',
-				'URL' => $this->getTitle()->getCanonicalURL(
-					array( 'action' => 'edit', 'internaledit' => 'true' ) )
-			) );
-		}
-
-		$files = '';
-		foreach( $urls as $key => $vars ) {
-			$files .= "\n[$key]\n";
-			foreach( $vars as $varname => $varval ) {
-				$files .= "$varname=$varval\n";
-			}
-		}
-
-		$url = $this->getTitle()->getFullURL(
-			$this->getRequest()->appendQueryValue( 'internaledit', 1, true ) );
-
-		$control = <<<CONTROL
-; You're seeing this file because you're using Mediawiki's External Editor feature.
-; This is probably because you selected use external editor in your preferences.
-; To edit normally, either disable that preference or go to the URL:
-; $url
-; See http://www.mediawiki.org/wiki/Manual:External_editors for details.
-[Process]
-Type=$type
-Engine=MediaWiki
-Script={$wgCanonicalServer}{$wgScript}
-Server={$wgCanonicalServer}
-Path={$wgScriptPath}
-Special namespace=$special
-$files
-CONTROL;
-		echo $control;
-	}
-}
diff --git a/includes/ExternalUser.php b/includes/ExternalUser.php
deleted file mode 100644
index 580b9896..00000000
--- a/includes/ExternalUser.php
+++ /dev/null
@@ -1,309 +0,0 @@
-<?php
-/**
- * Authentication with a foreign database
- *
- * Copyright © 2009 Aryeh Gregor
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * @defgroup ExternalUser ExternalUser
- */
-
-/**
- * A class intended to supplement, and perhaps eventually replace, AuthPlugin.
- * See: http://www.mediawiki.org/wiki/ExternalAuth
- *
- * The class represents a user whose data is in a foreign database.  The
- * database may have entirely different conventions from MediaWiki, but it's
- * assumed to at least support the concept of a user id (possibly not an
- * integer), a user name (possibly not meeting MediaWiki's username
- * requirements), and a password.
- *
- * @ingroup ExternalUser
- */
-abstract class ExternalUser {
-	protected function __construct() {}
-
-	/**
-	 * Wrappers around initFrom*().
-	 */
-
-	/**
-	 * @param $name string
-	 * @return mixed ExternalUser, or false on failure
-	 */
-	public static function newFromName( $name ) {
-		global $wgExternalAuthType;
-		if ( is_null( $wgExternalAuthType ) ) {
-			return false;
-		}
-		$obj = new $wgExternalAuthType;
-		if ( !$obj->initFromName( $name ) ) {
-			return false;
-		}
-		return $obj;
-	}
-
-	/**
-	 * @param $id string
-	 * @return mixed ExternalUser, or false on failure
-	 */
-	public static function newFromId( $id ) {
-		global $wgExternalAuthType;
-		if ( is_null( $wgExternalAuthType ) ) {
-			return false;
-		}
-		$obj = new $wgExternalAuthType;
-		if ( !$obj->initFromId( $id ) ) {
-			return false;
-		}
-		return $obj;
-	}
-
-	/**
-	 * @return mixed ExternalUser, or false on failure
-	 */
-	public static function newFromCookie() {
-		global $wgExternalAuthType;
-		if ( is_null( $wgExternalAuthType ) ) {
-			return false;
-		}
-		$obj = new $wgExternalAuthType;
-		if ( !$obj->initFromCookie() ) {
-			return false;
-		}
-		return $obj;
-	}
-
-	/**
-	 * Creates the object corresponding to the given User object, assuming the
-	 * user exists on the wiki and is linked to an external account.  If either
-	 * of these is false, this will return false.
-	 *
-	 * This is a wrapper around newFromId().
-	 *
-	 * @param $user User
-	 * @return ExternalUser|bool False on failure
-	 */
-	public static function newFromUser( $user ) {
-		global $wgExternalAuthType;
-		if ( is_null( $wgExternalAuthType ) ) {
-			# Short-circuit to avoid database query in common case so no one
-			# kills me
-			return false;
-		}
-
-		$dbr = wfGetDB( DB_SLAVE );
-		$id = $dbr->selectField( 'external_user', 'eu_external_id',
-			array( 'eu_local_id' => $user->getId() ), __METHOD__ );
-		if ( $id === false ) {
-			return false;
-		}
-		return self::newFromId( $id );
-	}
-
-	/**
-	 * Given a name, which is a string exactly as input by the user in the
-	 * login form but with whitespace stripped, initialize this object to be
-	 * the corresponding ExternalUser.  Return true if successful, otherwise
-	 * false.
-	 *
-	 * @param $name string
-	 * @return bool Success?
-	 */
-	abstract protected function initFromName( $name );
-
-	/**
-	 * Given an id, which was at some previous point in history returned by
-	 * getId(), initialize this object to be the corresponding ExternalUser.
-	 * Return true if successful, false otherwise.
-	 *
-	 * @param $id string
-	 * @return bool Success?
-	 */
-	abstract protected function initFromId( $id );
-
-	/**
-	 * Try to magically initialize the user from cookies or similar information
-	 * so he or she can be logged in on just viewing the wiki.  If this is
-	 * impossible to do, just return false.
-	 *
-	 * TODO: Actually use this.
-	 *
-	 * @return bool Success?
-	 */
-	protected function initFromCookie() {
-		return false;
-	}
-
-	/**
-	 * This must return some identifier that stably, uniquely identifies the
-	 * user.  In a typical web application, this could be an integer
-	 * representing the "user id".  In other cases, it might be a string.  In
-	 * any event, the return value should be a string between 1 and 255
-	 * characters in length; must uniquely identify the user in the foreign
-	 * database; and, if at all possible, should be permanent.
-	 *
-	 * This will only ever be used to reconstruct this ExternalUser object via
-	 * newFromId().  The resulting object in that case should correspond to the
-	 * same user, even if details have changed in the interim (e.g., renames or
-	 * preference changes).
-	 *
-	 * @return string
-	 */
-	abstract public function getId();
-
-	/**
-	 * This must return the name that the user would normally use for login to
-	 * the external database.  It is subject to no particular restrictions
-	 * beyond rudimentary sanity, and in particular may be invalid as a
-	 * MediaWiki username.  It's used to auto-generate an account name that
-	 * *is* valid for MediaWiki, either with or without user input, but
-	 * basically is only a hint.
-	 *
-	 * @return string
-	 */
-	abstract public function getName();
-
-	/**
-	 * Is the given password valid for the external user?  The password is
-	 * provided in plaintext.
-	 *
-	 * @param $password string
-	 * @return bool
-	 */
-	abstract public function authenticate( $password );
-
-	/**
-	 * Retrieve the value corresponding to the given preference key.  The most
-	 * important values are:
-	 *
-	 * - emailaddress
-	 * - language
-	 *
-	 * The value must meet MediaWiki's requirements for values of this type,
-	 * and will be checked for validity before use.  If the preference makes no
-	 * sense for the backend, or it makes sense but is unset for this user, or
-	 * is unrecognized, return null.
-	 *
-	 * $pref will never equal 'password', since passwords are usually hashed
-	 * and cannot be directly retrieved.  authenticate() is used for this
-	 * instead.
-	 *
-	 * TODO: Currently this is only called for 'emailaddress'; generalize!  Add
-	 * some config option to decide which values are grabbed on user
-	 * initialization.
-	 *
-	 * @param $pref string
-	 * @return mixed
-	 */
-	public function getPref( $pref ) {
-		return null;
-	}
-
-	/**
-	 * Return an array of identifiers for all the foreign groups that this user
-	 * has.  The identifiers are opaque objects that only need to be
-	 * specifiable by the administrator in LocalSettings.php when configuring
-	 * $wgAutopromote.  They may be, for instance, strings or integers.
-	 *
-	 * TODO: Support this in $wgAutopromote.
-	 *
-	 * @return array
-	 */
-	public function getGroups() {
-		return array();
-	}
-
-	/**
-	 * Given a preference key (e.g., 'emailaddress'), provide an HTML message
-	 * telling the user how to change it in the external database.  The
-	 * administrator has specified that this preference cannot be changed on
-	 * the wiki, and may only be changed in the foreign database.  If no
-	 * message is available, such as for an unrecognized preference, return
-	 * false.
-	 *
-	 * TODO: Use this somewhere.
-	 *
-	 * @param $pref string
-	 * @return mixed String or false
-	 */
-	public static function getPrefMessage( $pref ) {
-		return false;
-	}
-
-	/**
-	 * Set the given preference key to the given value.  Two important
-	 * preference keys that you might want to implement are 'password' and
-	 * 'emailaddress'.  If the set fails, such as because the preference is
-	 * unrecognized or because the external database can't be changed right
-	 * now, return false.  If it succeeds, return true.
-	 *
-	 * If applicable, you should make sure to validate the new value against
-	 * any constraints the external database may have, since MediaWiki may have
-	 * more limited constraints (e.g., on password strength).
-	 *
-	 * TODO: Untested.
-	 *
-	 * @param $key string
-	 * @param $value string
-	 * @return bool Success?
-	 */
-	public static function setPref( $key, $value ) {
-		return false;
-	}
-
-	/**
-	 * Create a link for future reference between this object and the provided
-	 * user_id.  If the user was already linked, the old link will be
-	 * overwritten.
-	 *
-	 * This is part of the core code and is not overridable by specific
-	 * plugins.  It's in this class only for convenience.
-	 *
-	 * @param int $id user_id
-	 */
-	final public function linkToLocal( $id ) {
-		$dbw = wfGetDB( DB_MASTER );
-		$dbw->replace( 'external_user',
-			array( 'eu_local_id', 'eu_external_id' ),
-			array( 'eu_local_id' => $id,
-				'eu_external_id' => $this->getId() ),
-			__METHOD__ );
-	}
-
-	/**
-	 * Check whether this external user id is already linked with
-	 * a local user.
-	 * @return Mixed User if the account is linked, Null otherwise.
-	 */
-	final public function getLocalUser() {
-		$dbr = wfGetDB( DB_SLAVE );
-		$row = $dbr->selectRow(
-			'external_user',
-			'*',
-			array( 'eu_external_id' => $this->getId() )
-		);
-		return $row
-			? User::newFromId( $row->eu_local_id )
-			: null;
-	}
-
-}
diff --git a/includes/Fallback.php b/includes/Fallback.php
index 2e19a095..cdf6c88e 100644
--- a/includes/Fallback.php
+++ b/includes/Fallback.php
@@ -35,13 +35,13 @@ class Fallback {
 		if ( substr( $to, -8 ) == '//IGNORE' ) {
 			$to = substr( $to, 0, strlen( $to ) - 8 );
 		}
-		if( strcasecmp( $from, $to ) == 0 ) {
+		if ( strcasecmp( $from, $to ) == 0 ) {
 			return $string;
 		}
-		if( strcasecmp( $from, 'utf-8' ) == 0 ) {
+		if ( strcasecmp( $from, 'utf-8' ) == 0 ) {
 			return utf8_decode( $string );
 		}
-		if( strcasecmp( $to, 'utf-8' ) == 0 ) {
+		if ( strcasecmp( $to, 'utf-8' ) == 0 ) {
 			return utf8_encode( $string );
 		}
 		return $string;
@@ -64,12 +64,12 @@ class Fallback {
 	 * @return string
 	 */
 	public static function mb_substr( $str, $start, $count = 'end' ) {
-		if( $start != 0 ) {
+		if ( $start != 0 ) {
 			$split = self::mb_substr_split_unicode( $str, intval( $start ) );
 			$str = substr( $str, $split );
 		}
 
-		if( $count !== 'end' ) {
+		if ( $count !== 'end' ) {
 			$split = self::mb_substr_split_unicode( $str, intval( $count ) );
 			$str = substr( $str, 0, $split );
 		}
@@ -83,14 +83,14 @@ class Fallback {
 	 * @return int
 	 */
 	public static function mb_substr_split_unicode( $str, $splitPos ) {
-		if( $splitPos == 0 ) {
+		if ( $splitPos == 0 ) {
 			return 0;
 		}
 
 		$byteLen = strlen( $str );
 
-		if( $splitPos > 0 ) {
-			if( $splitPos > 256 ) {
+		if ( $splitPos > 0 ) {
+			if ( $splitPos > 256 ) {
 				// Optimize large string offsets by skipping ahead N bytes.
 				// This will cut out most of our slow time on Latin-based text,
 				// and 1/2 to 1/3 on East European and Asian scripts.
@@ -104,7 +104,7 @@ class Fallback {
 				$bytePos = 0;
 			}
 
-			while( $charPos++ < $splitPos ) {
+			while ( $charPos++ < $splitPos ) {
 				++$bytePos;
 				// Move past any tail bytes
 				while ( $bytePos < $byteLen && $str[$bytePos] >= "\x80" && $str[$bytePos] < "\xc0" ) {
@@ -115,7 +115,7 @@ class Fallback {
 			$splitPosX = $splitPos + 1;
 			$charPos = 0; // relative to end of string; we don't care about the actual char position here
 			$bytePos = $byteLen;
-			while( $bytePos > 0 && $charPos-- >= $splitPosX ) {
+			while ( $bytePos > 0 && $charPos-- >= $splitPosX ) {
 				--$bytePos;
 				// Move past any tail bytes
 				while ( $bytePos > 0 && $str[$bytePos] >= "\x80" && $str[$bytePos] < "\xc0" ) {
@@ -138,12 +138,12 @@ class Fallback {
 		$total = 0;
 
 		// Count ASCII bytes
-		for( $i = 0; $i < 0x80; $i++ ) {
+		for ( $i = 0; $i < 0x80; $i++ ) {
 			$total += $counts[$i];
 		}
 
 		// Count multibyte sequence heads
-		for( $i = 0xc0; $i < 0xff; $i++ ) {
+		for ( $i = 0xc0; $i < 0xff; $i++ ) {
 			$total += $counts[$i];
 		}
 		return $total;
@@ -163,7 +163,7 @@ class Fallback {
 		$ar = array();
 		preg_match( '/' . $needle . '/u', $haystack, $ar, PREG_OFFSET_CAPTURE, $offset );
 
-		if( isset( $ar[0][1] ) ) {
+		if ( isset( $ar[0][1] ) ) {
 			return $ar[0][1];
 		} else {
 			return false;
@@ -184,7 +184,7 @@ class Fallback {
 		$ar = array();
 		preg_match_all( '/' . $needle . '/u', $haystack, $ar, PREG_OFFSET_CAPTURE, $offset );
 
-		if( isset( $ar[0] ) && count( $ar[0] ) > 0 &&
+		if ( isset( $ar[0] ) && count( $ar[0] ) > 0 &&
 			isset( $ar[0][count( $ar[0] ) - 1][1] ) ) {
 			return $ar[0][count( $ar[0] ) - 1][1];
 		} else {
diff --git a/includes/Feed.php b/includes/Feed.php
index caf2e571..635b04e4 100644
--- a/includes/Feed.php
+++ b/includes/Feed.php
@@ -245,7 +245,7 @@ abstract class ChannelFeed extends FeedItem {
 		global $wgRequest;
 		$ctype = $wgRequest->getVal( 'ctype', 'application/xml' );
 		$allowedctypes = array( 'application/xml', 'text/xml', 'application/rss+xml', 'application/atom+xml' );
-		return (in_array( $ctype, $allowedctypes ) ? $ctype : 'application/xml');
+		return ( in_array( $ctype, $allowedctypes ) ? $ctype : 'application/xml' );
 	}
 
 	/**
@@ -306,13 +306,13 @@ class RSSFeed extends ChannelFeed {
 	function outItem( $item ) {
 	?>
 		<item>
-			<title><?php print $item->getTitle() ?></title>
-			<link><?php print wfExpandUrl( $item->getUrl(), PROTO_CURRENT ) ?></link>
-			<guid<?php if( !$item->rssIsPermalink ) print ' isPermaLink="false"' ?>><?php print $item->getUniqueId() ?></guid>
+			<title><?php print $item->getTitle(); ?></title>
+			<link><?php print wfExpandUrl( $item->getUrl(), PROTO_CURRENT ); ?></link>
+			<guid<?php if ( !$item->rssIsPermalink ) { print ' isPermaLink="false"'; } ?>><?php print $item->getUniqueId(); ?></guid>
 			<description><?php print $item->getDescription() ?></description>
-			<?php if( $item->getDate() ) { ?><pubDate><?php print $this->formatTime( $item->getDate() ) ?></pubDate><?php } ?>
-			<?php if( $item->getAuthor() ) { ?><dc:creator><?php print $item->getAuthor() ?></dc:creator><?php }?>
-			<?php if( $item->getComments() ) { ?><comments><?php print wfExpandUrl( $item->getComments(), PROTO_CURRENT ) ?></comments><?php }?>
+			<?php if ( $item->getDate() ) { ?><pubDate><?php print $this->formatTime( $item->getDate() ); ?></pubDate><?php } ?>
+			<?php if ( $item->getAuthor() ) { ?><dc:creator><?php print $item->getAuthor(); ?></dc:creator><?php }?>
+			<?php if ( $item->getComments() ) { ?><comments><?php print wfExpandUrl( $item->getComments(), PROTO_CURRENT ); ?></comments><?php }?>
 		</item>
 <?php
 	}
@@ -392,15 +392,15 @@ class AtomFeed extends ChannelFeed {
 		global $wgMimeType;
 	?>
 	<entry>
-		<id><?php print $item->getUniqueId() ?></id>
-		<title><?php print $item->getTitle() ?></title>
-		<link rel="alternate" type="<?php print $wgMimeType ?>" href="<?php print wfExpandUrl( $item->getUrl(), PROTO_CURRENT ) ?>"/>
-		<?php if( $item->getDate() ) { ?>
-		<updated><?php print $this->formatTime( $item->getDate() ) ?>Z</updated>
+		<id><?php print $item->getUniqueId(); ?></id>
+		<title><?php print $item->getTitle(); ?></title>
+		<link rel="alternate" type="<?php print $wgMimeType ?>" href="<?php print wfExpandUrl( $item->getUrl(), PROTO_CURRENT ); ?>"/>
+		<?php if ( $item->getDate() ) { ?>
+		<updated><?php print $this->formatTime( $item->getDate() ); ?>Z</updated>
 		<?php } ?>
 
 		<summary type="html"><?php print $item->getDescription() ?></summary>
-		<?php if( $item->getAuthor() ) { ?><author><name><?php print $item->getAuthor() ?></name></author><?php }?>
+		<?php if ( $item->getAuthor() ) { ?><author><name><?php print $item->getAuthor(); ?></name></author><?php }?>
 	</entry>
 
 <?php /* @todo FIXME: Need to add comments
diff --git a/includes/FeedUtils.php b/includes/FeedUtils.php
index adc1f781..22cb52be 100644
--- a/includes/FeedUtils.php
+++ b/includes/FeedUtils.php
@@ -59,7 +59,7 @@ class FeedUtils {
 			return false;
 		}
 
-		if( !isset( $wgFeedClasses[$type] ) ) {
+		if ( !isset( $wgFeedClasses[$type] ) ) {
 			$wgOut->addWikiMsg( 'feed-invalid' );
 			return false;
 		}
@@ -77,14 +77,14 @@ class FeedUtils {
 		$titleObj = Title::makeTitle( $row->rc_namespace, $row->rc_title );
 		$timestamp = wfTimestamp( TS_MW, $row->rc_timestamp );
 		$actiontext = '';
-		if( $row->rc_type == RC_LOG ) {
+		if ( $row->rc_type == RC_LOG ) {
 			$rcRow = (array)$row; // newFromRow() only accepts arrays for RC rows
 			$actiontext = LogFormatter::newFromRow( $rcRow )->getActionText();
 		}
 		return self::formatDiffRow( $titleObj,
 			$row->rc_last_oldid, $row->rc_this_oldid,
 			$timestamp,
-			($row->rc_deleted & Revision::DELETED_COMMENT)
+			$row->rc_deleted & Revision::DELETED_COMMENT
 				? wfMessage( 'rev-deleted-comment' )->escaped()
 				: $row->rc_comment,
 			$actiontext
@@ -121,13 +121,13 @@ class FeedUtils {
 
 		// Can't diff special pages, unreadable pages or pages with no new revision
 		// to compare against: just return the text.
-		if( $title->getNamespace() < 0 || $accErrors || !$newid ) {
+		if ( $title->getNamespace() < 0 || $accErrors || !$newid ) {
 			wfProfileOut( __METHOD__ );
 			return $completeText;
 		}
 
-		if( $oldid ) {
-			wfProfileIn( __METHOD__."-dodiff" );
+		if ( $oldid ) {
+			wfProfileIn( __METHOD__ . "-dodiff" );
 
 			#$diffText = $de->getDiff( wfMessage( 'revisionasof',
 			#	$wgLang->timeanddate( $timestamp ),
@@ -168,10 +168,10 @@ class FeedUtils {
 				$diffText = UtfNormal::cleanUp( $diffText );
 				$diffText = self::applyDiffStyle( $diffText );
 			}
-			wfProfileOut( __METHOD__."-dodiff" );
+			wfProfileOut( __METHOD__ . "-dodiff" );
 		} else {
 			$rev = Revision::newFromId( $newid );
-			if( $wgFeedDiffCutoff <= 0 || is_null( $rev ) ) {
+			if ( $wgFeedDiffCutoff <= 0 || is_null( $rev ) ) {
 				$newContent = ContentHandler::getForTitle( $title )->makeEmptyContent();
 			} else {
 				$newContent = $rev->getContent();
@@ -220,10 +220,11 @@ class FeedUtils {
 	 * @return string
 	 */
 	protected static function getDiffLink( Title $title, $newid, $oldid = null ) {
-		$queryParameters = ($oldid == null)
-			? "diff={$newid}"
-			: "diff={$newid}&oldid={$oldid}";
-		$diffUrl = $title->getFullUrl( $queryParameters );
+		$queryParameters = array( 'diff' => $newid );
+		if ( $oldid != null ) {
+			$queryParameters['oldid'] = $oldid;
+		}
+		$diffUrl = $title->getFullURL( $queryParameters );
 
 		$diffLink = Html::element( 'a', array( 'href' => $diffUrl ),
 			wfMessage( 'showdiff' )->inContentLanguage()->text() );
@@ -250,7 +251,7 @@ class FeedUtils {
 			'diffchange'       => 'font-weight: bold; text-decoration: none;',
 		);
 
-		foreach( $styles as $class => $style ) {
+		foreach ( $styles as $class => $style ) {
 			$text = preg_replace( "/(<[^>]+)class=(['\"])$class\\2([^>]*>)/",
 				"\\1style=\"$style\"\\3", $text );
 		}
diff --git a/includes/FileDeleteForm.php b/includes/FileDeleteForm.php
index 28403cca..65d82b87 100644
--- a/includes/FileDeleteForm.php
+++ b/includes/FileDeleteForm.php
@@ -82,18 +82,18 @@ class FileDeleteForm {
 		# Flag to hide all contents of the archived revisions
 		$suppress = $wgRequest->getVal( 'wpSuppress' ) && $wgUser->isAllowed( 'suppressrevision' );
 
-		if( $this->oldimage ) {
+		if ( $this->oldimage ) {
 			$this->oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $this->title, $this->oldimage );
 		}
 
-		if( !self::haveDeletableFile( $this->file, $this->oldfile, $this->oldimage ) ) {
+		if ( !self::haveDeletableFile( $this->file, $this->oldfile, $this->oldimage ) ) {
 			$wgOut->addHTML( $this->prepareMessage( 'filedelete-nofile' ) );
 			$wgOut->addReturnTo( $this->title );
 			return;
 		}
 
 		// Perform the deletion if appropriate
-		if( $wgRequest->wasPosted() && $wgUser->matchEditToken( $token, $this->oldimage ) ) {
+		if ( $wgRequest->wasPosted() && $wgUser->matchEditToken( $token, $this->oldimage ) ) {
 			$deleteReasonList = $wgRequest->getText( 'wpDeleteReasonList' );
 			$deleteReason = $wgRequest->getText( 'wpReason' );
 
@@ -109,24 +109,18 @@ class FileDeleteForm {
 
 			$status = self::doDelete( $this->title, $this->file, $this->oldimage, $reason, $suppress, $wgUser );
 
-			if( !$status->isGood() ) {
+			if ( !$status->isGood() ) {
 				$wgOut->addHTML( '<h2>' . $this->prepareMessage( 'filedeleteerror-short' ) . "</h2>\n" );
 				$wgOut->addWikiText( '<div class="error">' . $status->getWikiText( 'filedeleteerror-short', 'filedeleteerror-long' ) . '</div>' );
 			}
-			if( $status->ok ) {
+			if ( $status->ok ) {
 				$wgOut->setPageTitle( wfMessage( 'actioncomplete' ) );
 				$wgOut->addHTML( $this->prepareMessage( 'filedelete-success' ) );
 				// Return to the main page if we just deleted all versions of the
 				// file, otherwise go back to the description page
 				$wgOut->addReturnTo( $this->oldimage ? $this->title : Title::newMainPage() );
 
-				if ( $wgUser->isLoggedIn() && $wgRequest->getCheck( 'wpWatch' ) != $wgUser->isWatched( $this->title ) ) {
-					if ( $wgRequest->getCheck( 'wpWatch' ) ) {
-						WatchAction::doWatch( $this->title, $wgUser );
-					} else {
-						WatchAction::doUnwatch( $this->title, $wgUser );
-					}
-				}
+				WatchAction::doWatchOrUnwatch( $wgRequest->getCheck( 'wpWatch' ), $this->title, $wgUser );
 			}
 			return;
 		}
@@ -153,13 +147,13 @@ class FileDeleteForm {
 			$user = $wgUser;
 		}
 
-		if( $oldimage ) {
+		if ( $oldimage ) {
 			$page = null;
 			$status = $file->deleteOld( $oldimage, $reason, $suppress );
-			if( $status->ok ) {
+			if ( $status->ok ) {
 				// Need to do a log item
 				$logComment = wfMessage( 'deletedrevision', $oldimage )->inContentLanguage()->text();
-				if( trim( $reason ) != '' ) {
+				if ( trim( $reason ) != '' ) {
 					$logComment .= wfMessage( 'colon-separator' )
 						->inContentLanguage()->text() . $reason;
 				}
@@ -187,7 +181,7 @@ class FileDeleteForm {
 				// or revision is missing, so check for isOK() rather than isGood()
 				if ( $deleteStatus->isOK() ) {
 					$status = $file->delete( $reason, $suppress );
-					if( $status->isOK() ) {
+					if ( $status->isOK() ) {
 						$dbw->commit( __METHOD__ );
 					} else {
 						$dbw->rollback( __METHOD__ );
@@ -213,7 +207,7 @@ class FileDeleteForm {
 	private function showForm() {
 		global $wgOut, $wgUser, $wgRequest;
 
-		if( $wgUser->isAllowed( 'suppressrevision' ) ) {
+		if ( $wgUser->isAllowed( 'suppressrevision' ) ) {
 			$suppress = "<tr id=\"wpDeleteSuppressRow\">
 					<td></td>
 					<td class='mw-input'><strong>" .
@@ -258,7 +252,7 @@ class FileDeleteForm {
 				"</td>
 			</tr>
 			{$suppress}";
-		if( $wgUser->isLoggedIn() ) {
+		if ( $wgUser->isLoggedIn() ) {
 			$form .= "
 			<tr>
 				<td></td>
@@ -314,7 +308,7 @@ class FileDeleteForm {
 	 */
 	private function prepareMessage( $message ) {
 		global $wgLang;
-		if( $this->oldimage ) {
+		if ( $this->oldimage ) {
 			return wfMessage(
 				"{$message}-old", # To ensure grep will find them: 'filedelete-intro-old', 'filedelete-nofile-old', 'filedelete-success-old'
 				wfEscapeWikiText( $this->title->getText() ),
@@ -375,11 +369,11 @@ class FileDeleteForm {
 		$q = array();
 		$q['action'] = 'delete';
 
-		if( $this->oldimage ) {
+		if ( $this->oldimage ) {
 			$q['oldimage'] = $this->oldimage;
 		}
 
-		return $this->title->getLocalUrl( $q );
+		return $this->title->getLocalURL( $q );
 	}
 
 	/**
diff --git a/includes/ForkController.php b/includes/ForkController.php
index 89ad9553..ced45af6 100644
--- a/includes/ForkController.php
+++ b/includes/ForkController.php
@@ -121,7 +121,9 @@ class ForkController {
 			if ( function_exists( 'pcntl_signal_dispatch' ) ) {
 				pcntl_signal_dispatch();
 			} else {
-				declare (ticks=1) { $status = $status; }
+				declare( ticks = 1 ) {
+					$status = $status;
+				}
 			}
 			// Respond to TERM signal
 			if ( $this->termReceived ) {
diff --git a/includes/FormOptions.php b/includes/FormOptions.php
index 8477ed98..54822e32 100644
--- a/includes/FormOptions.php
+++ b/includes/FormOptions.php
@@ -28,7 +28,8 @@
 /**
  * Helper class to keep track of options when mixing links and form elements.
  *
- * @todo This badly need some examples and tests :-)
+ * @todo This badly needs some examples and tests :) The usage in SpecialRecentchanges class is a
+ *     good ersatz in the meantime.
  */
 class FormOptions implements ArrayAccess {
 	/** @name Type constants
@@ -50,12 +51,26 @@ class FormOptions implements ArrayAccess {
 	/* @} */
 
 	/**
-	 * @todo Document!
+	 * Map of known option names to information about them.
+	 *
+	 * Each value is an array with the following keys:
+	 * - 'default' - the default value as passed to add()
+	 * - 'value' - current value, start with null, can be set by various functions
+	 * - 'consumed' - true/false, whether the option was consumed using
+	 *   consumeValue() or consumeValues()
+	 * - 'type' - one of the type constants (but never AUTO)
 	 */
 	protected $options = array();
 
 	# Setting up
 
+	/**
+	 * Add an option to be handled by this FormOptions instance.
+	 *
+	 * @param string $name Request parameter name
+	 * @param mixed $default Default value when the request parameter is not present
+	 * @param int $type One of the type constants (optional, defaults to AUTO)
+	 */
 	public function add( $name, $default, $type = self::AUTO ) {
 		$option = array();
 		$option['default'] = $default;
@@ -71,20 +86,25 @@ class FormOptions implements ArrayAccess {
 		$this->options[$name] = $option;
 	}
 
+	/**
+	 * Remove an option being handled by this FormOptions instance. This is the inverse of add().
+	 *
+	 * @param string $name Request parameter name
+	 */
 	public function delete( $name ) {
 		$this->validateName( $name, true );
 		unset( $this->options[$name] );
 	}
 
 	/**
-	 * Used to find out which type the data is.
-	 * All types are defined in the 'Type constants' section of this class
-	 * Please note we do not support detection of INTNULL MediaWiki type
-	 * which will be assumed as INT if the data is an integer.
+	 * Used to find out which type the data is. All types are defined in the 'Type constants' section
+	 * of this class.
 	 *
-	 * @param $data Mixed: value to guess type for
-	 * @throws MWException
-	 * @exception MWException Unsupported datatype
+	 * Detection of the INTNULL type is not supported; INT will be assumed if the data is an integer,
+	 * MWException will be thrown if it's null.
+	 *
+	 * @param mixed $data Value to guess the type for
+	 * @throws MWException If unable to guess the type
 	 * @return int Type constant
 	 */
 	public static function guessType( $data ) {
@@ -102,12 +122,12 @@ class FormOptions implements ArrayAccess {
 	# Handling values
 
 	/**
-	 * Verify the given option name exist.
+	 * Verify that the given option name exists.
 	 *
-	 * @param string $name option name
-	 * @param $strict Boolean: throw an exception when the option does not exist (default false)
+	 * @param string $name Option name
+	 * @param bool $strict Throw an exception when the option doesn't exist instead of returning false
 	 * @throws MWException
-	 * @return Boolean: true if option exist, false otherwise
+	 * @return bool True if the option exists, false otherwise
 	 */
 	public function validateName( $name, $strict = false ) {
 		if ( !isset( $this->options[$name] ) ) {
@@ -117,16 +137,17 @@ class FormOptions implements ArrayAccess {
 				return false;
 			}
 		}
+
 		return true;
 	}
 
 	/**
 	 * Use to set the value of an option.
 	 *
-	 * @param string $name option name
-	 * @param $value Mixed: value for the option
-	 * @param $force Boolean: whether to set the value when it is equivalent to the default value for this option (default false).
-	 * @return null
+	 * @param string $name Option name
+	 * @param mixed $value Value for the option
+	 * @param bool $force Whether to set the value when it is equivalent to the default value for this
+	 *     option (default false).
 	 */
 	public function setValue( $name, $value, $force = false ) {
 		$this->validateName( $name, true );
@@ -140,11 +161,10 @@ class FormOptions implements ArrayAccess {
 	}
 
 	/**
-	 * Get the value for the given option name.
-	 * Internally use getValueReal()
+	 * Get the value for the given option name. Uses getValueReal() internally.
 	 *
-	 * @param string $name option name
-	 * @return Mixed
+	 * @param string $name Option name
+	 * @return mixed
 	 */
 	public function getValue( $name ) {
 		$this->validateName( $name, true );
@@ -153,9 +173,10 @@ class FormOptions implements ArrayAccess {
 	}
 
 	/**
-	 * @todo Document
-	 * @param array $option array structure describing the option
-	 * @return Mixed. Value or the default value if it is null
+	 * Return current option value, based on a structure taken from $options.
+	 *
+	 * @param array $option Array structure describing the option
+	 * @return mixed Value, or the default value if it is null
 	 */
 	protected function getValueReal( $option ) {
 		if ( $option['value'] !== null ) {
@@ -167,9 +188,8 @@ class FormOptions implements ArrayAccess {
 
 	/**
 	 * Delete the option value.
-	 * This will make future calls to getValue()  return the default value.
-	 * @param string $name option name
-	 * @return null
+	 * This will make future calls to getValue() return the default value.
+	 * @param string $name Option name
 	 */
 	public function reset( $name ) {
 		$this->validateName( $name, true );
@@ -177,10 +197,13 @@ class FormOptions implements ArrayAccess {
 	}
 
 	/**
-	 * @todo Document
+	 * Get the value of given option and mark it as 'consumed'. Consumed options are not returned
+	 * by getUnconsumedValues().
+	 *
+	 * @see consumeValues()
+	 * @throws MWException If the option does not exist
 	 * @param string $name Option name
-	 * @throws MWException If option does not exist.
-	 * @return mixed Value or the default value if it is null.
+	 * @return mixed Value, or the default value if it is null
 	 */
 	public function consumeValue( $name ) {
 		$this->validateName( $name, true );
@@ -190,11 +213,15 @@ class FormOptions implements ArrayAccess {
 	}
 
 	/**
-	 * @todo Document
-	 * @param array $names array of option names
-	 * @return null
+	 * Get the values of given options and mark them as 'consumed'. Consumed options are not returned
+	 * by getUnconsumedValues().
+	 *
+	 * @see consumeValue()
+	 * @throws MWException If any option does not exist
+	 * @param array $names Array of option names as strings
+	 * @return array Array of option values, or the default values if they are null
 	 */
-	public function consumeValues( /*Array*/ $names ) {
+	public function consumeValues( $names ) {
 		$out = array();
 
 		foreach ( $names as $name ) {
@@ -213,9 +240,7 @@ class FormOptions implements ArrayAccess {
 	 * @param string $name option name
 	 * @param int $min minimum value
 	 * @param int $max maximum value
-	 * @throws MWException
-	 * @exception MWException Option is not of type int
-	 * @return null
+	 * @throws MWException If option is not of type INT
 	 */
 	public function validateIntBounds( $name, $min, $max ) {
 		$this->validateName( $name, true );
@@ -231,9 +256,10 @@ class FormOptions implements ArrayAccess {
 	}
 
 	/**
-	 * Getting the data out for use
-	 * @param $all Boolean: whether to include unchanged options (default: false)
-	 * @return Array
+	 * Get all remaining values which have not been consumed by consumeValue() or consumeValues().
+	 *
+	 * @param bool $all Whether to include unchanged options (default: false)
+	 * @return array
 	 */
 	public function getUnconsumedValues( $all = false ) {
 		$values = array();
@@ -251,7 +277,7 @@ class FormOptions implements ArrayAccess {
 
 	/**
 	 * Return options modified as an array ( name => value )
-	 * @return Array
+	 * @return array
 	 */
 	public function getChangedValues() {
 		$values = array();
@@ -266,8 +292,8 @@ class FormOptions implements ArrayAccess {
 	}
 
 	/**
-	 * Format options to an array ( name => value)
-	 * @return Array
+	 * Format options to an array ( name => value )
+	 * @return array
 	 */
 	public function getAllValues() {
 		$values = array();
@@ -281,24 +307,38 @@ class FormOptions implements ArrayAccess {
 
 	# Reading values
 
-	public function fetchValuesFromRequest( WebRequest $r, $values = false ) {
-		if ( !$values ) {
-			$values = array_keys( $this->options );
+	/**
+	 * Fetch values for all options (or selected options) from the given WebRequest, making them
+	 * available for accessing with getValue() or consumeValue() etc.
+	 *
+	 * @param WebRequest $r The request to fetch values from
+	 * @param array $optionKeys Which options to fetch the values for (default:
+	 *     all of them). Note that passing an empty array will also result in
+	 *     values for all keys being fetched.
+	 * @throws MWException If the type of any option is invalid
+	 */
+	public function fetchValuesFromRequest( WebRequest $r, $optionKeys = null ) {
+		if ( !$optionKeys ) {
+			$optionKeys = array_keys( $this->options );
 		}
 
-		foreach ( $values as $name ) {
+		foreach ( $optionKeys as $name ) {
 			$default = $this->options[$name]['default'];
 			$type = $this->options[$name]['type'];
 
-			switch( $type ) {
+			switch ( $type ) {
 				case self::BOOL:
-					$value = $r->getBool( $name, $default ); break;
+					$value = $r->getBool( $name, $default );
+					break;
 				case self::INT:
-					$value = $r->getInt( $name, $default ); break;
+					$value = $r->getInt( $name, $default );
+					break;
 				case self::STRING:
-					$value = $r->getText( $name, $default ); break;
+					$value = $r->getText( $name, $default );
+					break;
 				case self::INTNULL:
-					$value = $r->getIntOrNull( $name ); break;
+					$value = $r->getIntOrNull( $name );
+					break;
 				default:
 					throw new MWException( 'Unsupported datatype' );
 			}
@@ -310,29 +350,26 @@ class FormOptions implements ArrayAccess {
 	}
 
 	/** @name ArrayAccess functions
-	 * Those function implements PHP ArrayAccess interface
+	 * These functions implement the ArrayAccess PHP interface.
 	 * @see http://php.net/manual/en/class.arrayaccess.php
 	 */
 	/* @{ */
-	/**
-	 * Whether option exist
-	 * @return bool
-	 */
+	/** Whether the option exists. */
 	public function offsetExists( $name ) {
 		return isset( $this->options[$name] );
 	}
-	/**
-	 * Retrieve an option value
-	 * @return Mixed
-	 */
+
+	/** Retrieve an option value. */
 	public function offsetGet( $name ) {
 		return $this->getValue( $name );
 	}
-	/**	Set an option to given value */
+
+	/** Set an option to given value. */
 	public function offsetSet( $name, $value ) {
 		$this->setValue( $name, $value );
 	}
-	/**	Delete the option */
+
+	/** Delete the option. */
 	public function offsetUnset( $name ) {
 		$this->delete( $name );
 	}
diff --git a/includes/GitInfo.php b/includes/GitInfo.php
index 6f7f8020..f49f9be1 100644
--- a/includes/GitInfo.php
+++ b/includes/GitInfo.php
@@ -120,6 +120,32 @@ class GitInfo {
 		return $sha1;
 	}
 
+	/**
+	 * Return the commit date of HEAD entry of the git code repository
+	 *
+	 * @since 1.22
+	 * @return int|bool Commit date (UNIX timestamp) or false
+	 */
+	public function getHeadCommitDate() {
+		global $wgGitBin;
+
+		if ( !is_file( $wgGitBin ) || !is_executable( $wgGitBin ) ) {
+			return false;
+		}
+
+		$environment = array( "GIT_DIR" => $this->basedir );
+		$cmd = wfEscapeShellArg( $wgGitBin ) . " show -s --format=format:%ct HEAD";
+		$retc = false;
+		$commitDate = wfShellExec( $cmd, $retc, $environment );
+
+		if ( $retc !== 0 ) {
+			return false;
+		} else {
+			return (int)$commitDate;
+		}
+
+	 }
+
 	/**
 	 * Return the name of the current branch, or HEAD if not found
 	 * @return string The branch name, HEAD, or false
@@ -136,7 +162,7 @@ class GitInfo {
 	/**
 	 * Get an URL to a web viewer link to the HEAD revision.
 	 *
-	 * @return string|bool string if an URL is available or false otherwise.
+	 * @return string|bool string if a URL is available or false otherwise.
 	 */
 	public function getHeadViewUrl() {
 		$config = "{$this->basedir}/config";
@@ -151,7 +177,7 @@ class GitInfo {
 		if ( isset( $configArray['remote origin'] ) ) {
 			$remote = $configArray['remote origin'];
 		} else {
-			foreach( $configArray as $sectionName => $sectionConf ) {
+			foreach ( $configArray as $sectionName => $sectionConf ) {
 				if ( substr( $sectionName, 0, 6 ) == 'remote' ) {
 					$remote = $sectionConf;
 				}
@@ -166,14 +192,15 @@ class GitInfo {
 		if ( substr( $url, -4 ) !== '.git' ) {
 			$url .= '.git';
 		}
-		foreach( self::getViewers() as $repo => $viewer ) {
+		foreach ( self::getViewers() as $repo => $viewer ) {
 			$pattern = '#^' . $repo . '$#';
-			if ( preg_match( $pattern, $url ) ) {
+			if ( preg_match( $pattern, $url, $matches ) ) {
 				$viewerUrl = preg_replace( $pattern, $viewer, $url );
 				$headSHA1 = $this->getHeadSHA1();
 				$replacements = array(
 					'%h' => substr( $headSHA1, 0, 7 ),
-					'%H' => $headSHA1
+					'%H' => $headSHA1,
+					'%r' => urlencode( $matches[1] ),
 				);
 				return strtr( $viewerUrl, $replacements );
 			}
@@ -212,7 +239,7 @@ class GitInfo {
 	protected static function getViewers() {
 		global $wgGitRepositoryViewers;
 
-		if( self::$viewers === false ) {
+		if ( self::$viewers === false ) {
 			self::$viewers = $wgGitRepositoryViewers;
 			wfRunHooks( 'GitViewers', array( &self::$viewers ) );
 		}
diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php
index 016736f4..77c09e53 100644
--- a/includes/GlobalFunctions.php
+++ b/includes/GlobalFunctions.php
@@ -35,7 +35,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
  * PHP extensions may be included here.
  */
 
-if( !function_exists( 'iconv' ) ) {
+if ( !function_exists( 'iconv' ) ) {
 	/**
 	 * @codeCoverageIgnore
 	 * @return string
@@ -73,7 +73,7 @@ if ( !function_exists( 'mb_strlen' ) ) {
 	}
 }
 
-if( !function_exists( 'mb_strpos' ) ) {
+if ( !function_exists( 'mb_strpos' ) ) {
 	/**
 	 * @codeCoverageIgnore
 	 * @return int
@@ -84,7 +84,7 @@ if( !function_exists( 'mb_strpos' ) ) {
 
 }
 
-if( !function_exists( 'mb_strrpos' ) ) {
+if ( !function_exists( 'mb_strrpos' ) ) {
 	/**
 	 * @codeCoverageIgnore
 	 * @return int
@@ -94,24 +94,16 @@ if( !function_exists( 'mb_strrpos' ) ) {
 	}
 }
 
-// Support for Wietse Venema's taint feature
-if ( !function_exists( 'istainted' ) ) {
+// gzdecode function only exists in PHP >= 5.4.0
+// http://php.net/gzdecode
+if ( !function_exists( 'gzdecode' ) ) {
 	/**
 	 * @codeCoverageIgnore
-	 * @return int
+	 * @return string
 	 */
-	function istainted( $var ) {
-		return 0;
+	function gzdecode( $data ) {
+		return gzinflate( substr( $data, 10, -8 ) );
 	}
-	/** @codeCoverageIgnore */
-	function taint( $var, $level = 0 ) {}
-	/** @codeCoverageIgnore */
-	function untaint( $var, $level = 0 ) {}
-	define( 'TC_HTML', 1 );
-	define( 'TC_SHELL', 1 );
-	define( 'TC_MYSQL', 1 );
-	define( 'TC_PCRE', 1 );
-	define( 'TC_SELF', 1 );
 }
 /// @endcond
 
@@ -126,19 +118,19 @@ function wfArrayDiff2( $a, $b ) {
 }
 
 /**
- * @param $a
- * @param $b
+ * @param $a array|string
+ * @param $b array|string
  * @return int
  */
 function wfArrayDiff2_cmp( $a, $b ) {
-	if ( !is_array( $a ) ) {
+	if ( is_string( $a ) && is_string( $b ) ) {
 		return strcmp( $a, $b );
 	} elseif ( count( $a ) !== count( $b ) ) {
 		return count( $a ) < count( $b ) ? -1 : 1;
 	} else {
 		reset( $a );
 		reset( $b );
-		while( ( list( , $valueA ) = each( $a ) ) && ( list( , $valueB ) = each( $b ) ) ) {
+		while ( ( list( , $valueA ) = each( $a ) ) && ( list( , $valueB ) = each( $b ) ) ) {
 			$cmp = strcmp( $valueA, $valueB );
 			if ( $cmp !== 0 ) {
 				return $cmp;
@@ -150,14 +142,16 @@ function wfArrayDiff2_cmp( $a, $b ) {
 
 /**
  * Array lookup
- * Returns an array where the values in the first array are replaced by the
- * values in the second array with the corresponding keys
+ * Returns an array where the values in array $b are replaced by the
+ * values in array $a with the corresponding keys
  *
+ * @deprecated since 1.22; use array_intersect_key()
  * @param $a Array
  * @param $b Array
  * @return array
  */
 function wfArrayLookup( $a, $b ) {
+	wfDeprecated( __FUNCTION__, '1.22' );
 	return array_flip( array_intersect( array_flip( $a ), array_keys( $b ) ) );
 }
 
@@ -183,11 +177,13 @@ function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) {
  * Backwards array plus for people who haven't bothered to read the PHP manual
  * XXX: will not darn your socks for you.
  *
+ * @deprecated since 1.22; use array_replace()
  * @param $array1 Array
  * @param [$array2, [...]] Arrays
  * @return Array
  */
 function wfArrayMerge( $array1/* ... */ ) {
+	wfDeprecated( __FUNCTION__, '1.22' );
 	$args = func_get_args();
 	$args = array_reverse( $args, true );
 	$out = array();
@@ -262,7 +258,7 @@ function wfArrayInsertAfter( array $array, array $insert, $after ) {
  */
 function wfObjectToArray( $objOrArray, $recursive = true ) {
 	$array = array();
-	if( is_object( $objOrArray ) ) {
+	if ( is_object( $objOrArray ) ) {
 		$objOrArray = get_object_vars( $objOrArray );
 	}
 	foreach ( $objOrArray as $key => $value ) {
@@ -276,24 +272,6 @@ function wfObjectToArray( $objOrArray, $recursive = true ) {
 	return $array;
 }
 
-/**
- * Wrapper around array_map() which also taints variables
- *
- * @param  $function Callback
- * @param  $input Array
- * @return Array
- */
-function wfArrayMap( $function, $input ) {
-	$ret = array_map( $function, $input );
-	foreach ( $ret as $key => $value ) {
-		$taint = istainted( $input[$key] );
-		if ( $taint ) {
-			taint( $ret[$key], $taint );
-		}
-	}
-	return $ret;
-}
-
 /**
  * Get a random decimal value between 0 and 1, in a way
  * not likely to give duplicate values for any realistic
@@ -322,8 +300,8 @@ function wfRandom() {
  */
 function wfRandomString( $length = 32 ) {
 	$str = '';
-	while ( strlen( $str ) < $length ) {
-		$str .= dechex( mt_rand() );
+	for ( $n = 0; $n < $length; $n += 7 ) {
+		$str .= sprintf( '%07x', mt_rand() & 0xfffffff );
 	}
 	return substr( $str, 0, $length );
 }
@@ -480,8 +458,8 @@ function wfAppendQuery( $url, $query ) {
 	if ( is_array( $query ) ) {
 		$query = wfArrayToCgi( $query );
 	}
-	if( $query != '' ) {
-		if( false === strpos( $url, '?' ) ) {
+	if ( $query != '' ) {
+		if ( false === strpos( $url, '?' ) ) {
 			$url .= '?';
 		} else {
 			$url .= '&';
@@ -913,10 +891,10 @@ function wfMakeUrlIndexes( $url ) {
 function wfMatchesDomainList( $url, $domains ) {
 	$bits = wfParseUrl( $url );
 	if ( is_array( $bits ) && isset( $bits['host'] ) ) {
+		$host = '.' . $bits['host'];
 		foreach ( (array)$domains as $domain ) {
-			// FIXME: This gives false positives. http://nds-nl.wikipedia.org will match nl.wikipedia.org
-			// We should use something that interprets dots instead
-			if ( substr( $bits['host'], -strlen( $domain ) ) === $domain ) {
+			$domain = '.' . $domain;
+			if ( substr( $host, -strlen( $domain ) ) === $domain ) {
 				return true;
 			}
 		}
@@ -953,14 +931,12 @@ function wfDebug( $text, $logonly = false ) {
 		MWDebug::debugMsg( $text );
 	}
 
-	if ( wfRunHooks( 'Debug', array( $text, null /* no log group */ ) ) ) {
-		if ( $wgDebugLogFile != '' && !$wgProfileOnly ) {
-			# Strip unprintables; they can switch terminal modes when binary data
-			# gets dumped, which is pretty annoying.
-			$text = preg_replace( '![\x00-\x08\x0b\x0c\x0e-\x1f]!', ' ', $text );
-			$text = $wgDebugLogPrefix . $text;
-			wfErrorLog( $text, $wgDebugLogFile );
-		}
+	if ( $wgDebugLogFile != '' && !$wgProfileOnly ) {
+		# Strip unprintables; they can switch terminal modes when binary data
+		# gets dumped, which is pretty annoying.
+		$text = preg_replace( '![\x00-\x08\x0b\x0c\x0e-\x1f]!', ' ', $text );
+		$text = $wgDebugLogPrefix . $text;
+		wfErrorLog( $text, $wgDebugLogFile );
 	}
 }
 
@@ -1011,7 +987,7 @@ function wfDebugTimer() {
  */
 function wfDebugMem( $exact = false ) {
 	$mem = memory_get_usage();
-	if( !$exact ) {
+	if ( !$exact ) {
 		$mem = floor( $mem / 1024 ) . ' kilobytes';
 	} else {
 		$mem .= ' bytes';
@@ -1031,15 +1007,13 @@ function wfDebugMem( $exact = false ) {
 function wfDebugLog( $logGroup, $text, $public = true ) {
 	global $wgDebugLogGroups;
 	$text = trim( $text ) . "\n";
-	if( isset( $wgDebugLogGroups[$logGroup] ) ) {
+	if ( isset( $wgDebugLogGroups[$logGroup] ) ) {
 		$time = wfTimestamp( TS_DB );
 		$wiki = wfWikiID();
 		$host = wfHostname();
-		if ( wfRunHooks( 'Debug', array( $text, $logGroup ) ) ) {
-			wfErrorLog( "$time $host $wiki: $text", $wgDebugLogGroups[$logGroup] );
-		}
+		wfErrorLog( "$time $host $wiki: $text", $wgDebugLogGroups[$logGroup] );
 	} elseif ( $public === true ) {
-		wfDebug( "[$logGroup] $text", true );
+		wfDebug( "[$logGroup] $text", false );
 	}
 }
 
@@ -1093,16 +1067,29 @@ function wfDeprecated( $function, $version = false, $component = false, $callerO
 
 /**
  * Send a warning either to the debug log or in a PHP error depending on
- * $wgDevelopmentWarnings
+ * $wgDevelopmentWarnings. To log warnings in production, use wfLogWarning() instead.
  *
  * @param string $msg message to send
  * @param $callerOffset Integer: number of items to go back in the backtrace to
  *        find the correct caller (1 = function calling wfWarn, ...)
- * @param $level Integer: PHP error level; only used when $wgDevelopmentWarnings
- *        is true
+ * @param $level Integer: PHP error level; defaults to E_USER_NOTICE;
+ *        only used when $wgDevelopmentWarnings is true
  */
 function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
-	MWDebug::warning( $msg, $callerOffset + 1, $level );
+	MWDebug::warning( $msg, $callerOffset + 1, $level, 'auto' );
+}
+
+/**
+ * Send a warning as a PHP error and the debug log. This is intended for logging
+ * warnings in production. For logging development warnings, use WfWarn instead.
+ *
+ * @param $msg String: message to send
+ * @param $callerOffset Integer: number of items to go back in the backtrace to
+ *        find the correct caller (1 = function calling wfLogWarning, ...)
+ * @param $level Integer: PHP error level; defaults to E_USER_WARNING
+ */
+function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
+	MWDebug::warning( $msg, $callerOffset + 1, $level, 'production' );
 }
 
 /**
@@ -1177,6 +1164,8 @@ function wfLogProfilingData() {
 	global $wgRequestTime, $wgDebugLogFile, $wgDebugRawPage, $wgRequest;
 	global $wgProfileLimit, $wgUser;
 
+	StatCounter::singleton()->flush();
+
 	$profiler = Profiler::instance();
 
 	# Profiling must actually be enabled...
@@ -1240,84 +1229,35 @@ function wfLogProfilingData() {
  * @return void
  */
 function wfIncrStats( $key, $count = 1 ) {
-	global $wgStatsMethod;
-
-	$count = intval( $count );
-	if ( $count == 0 ) {
-		return;
-	}
-
-	if( $wgStatsMethod == 'udp' ) {
-		global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID;
-		static $socket;
-
-		$id = $wgAggregateStatsID !== false ? $wgAggregateStatsID : wfWikiID();
-
-		if ( !$socket ) {
-			$socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
-			$statline = "stats/{$id} - 1 1 1 1 1 -total\n";
-			socket_sendto(
-				$socket,
-				$statline,
-				strlen( $statline ),
-				0,
-				$wgUDPProfilerHost,
-				$wgUDPProfilerPort
-			);
-		}
-		$statline = "stats/{$id} - {$count} 1 1 1 1 {$key}\n";
-		wfSuppressWarnings();
-		socket_sendto(
-			$socket,
-			$statline,
-			strlen( $statline ),
-			0,
-			$wgUDPProfilerHost,
-			$wgUDPProfilerPort
-		);
-		wfRestoreWarnings();
-	} elseif( $wgStatsMethod == 'cache' ) {
-		global $wgMemc;
-		$key = wfMemcKey( 'stats', $key );
-		if ( is_null( $wgMemc->incr( $key, $count ) ) ) {
-			$wgMemc->add( $key, $count );
-		}
-	} else {
-		// Disabled
-	}
+	StatCounter::singleton()->incr( $key, $count );
 }
 
 /**
- * Check if the wiki read-only lock file is present. This can be used to lock
- * off editing functions, but doesn't guarantee that the database will not be
- * modified.
+ * Check whether the wiki is in read-only mode.
  *
  * @return bool
  */
 function wfReadOnly() {
-	global $wgReadOnlyFile, $wgReadOnly;
-
-	if ( !is_null( $wgReadOnly ) ) {
-		return (bool)$wgReadOnly;
-	}
-	if ( $wgReadOnlyFile == '' ) {
-		return false;
-	}
-	// Set $wgReadOnly for faster access next time
-	if ( is_file( $wgReadOnlyFile ) ) {
-		$wgReadOnly = file_get_contents( $wgReadOnlyFile );
-	} else {
-		$wgReadOnly = false;
-	}
-	return (bool)$wgReadOnly;
+	return wfReadOnlyReason() !== false;
 }
 
 /**
- * @return bool
+ * Get the value of $wgReadOnly or the contents of $wgReadOnlyFile.
+ *
+ * @return string|bool: String when in read-only mode; false otherwise
  */
 function wfReadOnlyReason() {
-	global $wgReadOnly;
-	wfReadOnly();
+	global $wgReadOnly, $wgReadOnlyFile;
+
+	if ( $wgReadOnly === null ) {
+		// Set $wgReadOnly for faster access next time
+		if ( is_file( $wgReadOnlyFile ) && filesize( $wgReadOnlyFile ) > 0 ) {
+			$wgReadOnly = file_get_contents( $wgReadOnlyFile );
+		} else {
+			$wgReadOnly = false;
+		}
+	}
+
 	return $wgReadOnly;
 }
 
@@ -1339,27 +1279,27 @@ function wfReadOnlyReason() {
 function wfGetLangObj( $langcode = false ) {
 	# Identify which language to get or create a language object for.
 	# Using is_object here due to Stub objects.
-	if( is_object( $langcode ) ) {
+	if ( is_object( $langcode ) ) {
 		# Great, we already have the object (hopefully)!
 		return $langcode;
 	}
 
 	global $wgContLang, $wgLanguageCode;
-	if( $langcode === true || $langcode === $wgLanguageCode ) {
+	if ( $langcode === true || $langcode === $wgLanguageCode ) {
 		# $langcode is the language code of the wikis content language object.
 		# or it is a boolean and value is true
 		return $wgContLang;
 	}
 
 	global $wgLang;
-	if( $langcode === false || $langcode === $wgLang->getCode() ) {
+	if ( $langcode === false || $langcode === $wgLang->getCode() ) {
 		# $langcode is the language code of user language object.
 		# or it was a boolean and value is false
 		return $wgLang;
 	}
 
 	$validCodes = array_keys( Language::fetchLanguageNames() );
-	if( in_array( $langcode, $validCodes ) ) {
+	if ( in_array( $langcode, $validCodes ) ) {
 		# $langcode corresponds to a valid language.
 		return Language::factory( $langcode );
 	}
@@ -1414,7 +1354,7 @@ function wfMessage( $key /*...*/) {
  */
 function wfMessageFallback( /*...*/ ) {
 	$args = func_get_args();
-	return MWFunction::callArray( 'Message::newFallbackSequence', $args );
+	return call_user_func_array( 'Message::newFallbackSequence', $args );
 }
 
 /**
@@ -1492,7 +1432,7 @@ function wfMsgForContent( $key ) {
 	$args = func_get_args();
 	array_shift( $args );
 	$forcontent = true;
-	if( is_array( $wgForceUIMsgAsContentMsg ) &&
+	if ( is_array( $wgForceUIMsgAsContentMsg ) &&
 		in_array( $key, $wgForceUIMsgAsContentMsg ) )
 	{
 		$forcontent = false;
@@ -1515,7 +1455,7 @@ function wfMsgForContentNoTrans( $key ) {
 	$args = func_get_args();
 	array_shift( $args );
 	$forcontent = true;
-	if( is_array( $wgForceUIMsgAsContentMsg ) &&
+	if ( is_array( $wgForceUIMsgAsContentMsg ) &&
 		in_array( $key, $wgForceUIMsgAsContentMsg ) )
 	{
 		$forcontent = false;
@@ -1564,7 +1504,7 @@ function wfMsgGetKey( $key, $useDB = true, $langCode = false, $transform = true
 
 	$cache = MessageCache::singleton();
 	$message = $cache->get( $key, $useDB, $langCode );
-	if( $message === false ) {
+	if ( $message === false ) {
 		$message = '&lt;' . htmlspecialchars( $key ) . '&gt;';
 	} elseif ( $transform ) {
 		$message = $cache->transform( $message );
@@ -1591,7 +1531,7 @@ function wfMsgReplaceArgs( $message, $args ) {
 			$args = array_values( $args[0] );
 		}
 		$replacementKeys = array();
-		foreach( $args as $n => $param ) {
+		foreach ( $args as $n => $param ) {
 			$replacementKeys['$' . ( $n + 1 )] = $param;
 		}
 		$message = strtr( $message, $replacementKeys );
@@ -1675,11 +1615,11 @@ function wfMsgExt( $key, $options ) {
 	array_shift( $args );
 	$options = (array)$options;
 
-	foreach( $options as $arrayKey => $option ) {
-		if( !preg_match( '/^[0-9]+|language$/', $arrayKey ) ) {
+	foreach ( $options as $arrayKey => $option ) {
+		if ( !preg_match( '/^[0-9]+|language$/', $arrayKey ) ) {
 			# An unknown index, neither numeric nor "language"
 			wfWarn( "wfMsgExt called with incorrect parameter key $arrayKey", 1, E_USER_WARNING );
-		} elseif( preg_match( '/^[0-9]+$/', $arrayKey ) && !in_array( $option,
+		} elseif ( preg_match( '/^[0-9]+$/', $arrayKey ) && !in_array( $option,
 		array( 'parse', 'parseinline', 'escape', 'escapenoentities',
 		'replaceafter', 'parsemag', 'content' ) ) ) {
 			# A numeric index with unknown value
@@ -1687,11 +1627,11 @@ function wfMsgExt( $key, $options ) {
 		}
 	}
 
-	if( in_array( 'content', $options, true ) ) {
+	if ( in_array( 'content', $options, true ) ) {
 		$forContent = true;
 		$langCode = true;
 		$langCodeObj = null;
-	} elseif( array_key_exists( 'language', $options ) ) {
+	} elseif ( array_key_exists( 'language', $options ) ) {
 		$forContent = false;
 		$langCode = wfGetLangObj( $options['language'] );
 		$langCodeObj = $langCode;
@@ -1703,13 +1643,13 @@ function wfMsgExt( $key, $options ) {
 
 	$string = wfMsgGetKey( $key, /*DB*/true, $langCode, /*Transform*/false );
 
-	if( !in_array( 'replaceafter', $options, true ) ) {
+	if ( !in_array( 'replaceafter', $options, true ) ) {
 		$string = wfMsgReplaceArgs( $string, $args );
 	}
 
 	$messageCache = MessageCache::singleton();
 	$parseInline = in_array( 'parseinline', $options, true );
-	if( in_array( 'parse', $options, true ) || $parseInline ) {
+	if ( in_array( 'parse', $options, true ) || $parseInline ) {
 		$string = $messageCache->parse( $string, null, true, !$forContent, $langCodeObj );
 		if ( $string instanceof ParserOutput ) {
 			$string = $string->getText();
@@ -1717,7 +1657,7 @@ function wfMsgExt( $key, $options ) {
 
 		if ( $parseInline ) {
 			$m = array();
-			if( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
+			if ( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
 				$string = $m[1];
 			}
 		}
@@ -1732,7 +1672,7 @@ function wfMsgExt( $key, $options ) {
 		$string = Sanitizer::escapeHtmlAllowEntities( $string );
 	}
 
-	if( in_array( 'replaceafter', $options, true ) ) {
+	if ( in_array( 'replaceafter', $options, true ) ) {
 		$string = wfMsgReplaceArgs( $string, $args );
 	}
 
@@ -1741,7 +1681,7 @@ function wfMsgExt( $key, $options ) {
 
 /**
  * Since wfMsg() and co suck, they don't return false if the message key they
- * looked up didn't exist but a XHTML string, this function checks for the
+ * looked up didn't exist but instead the key wrapped in <>'s, this function checks for the
  * nonexistence of messages by checking the MessageCache::get() result directly.
  *
  * @deprecated since 1.18. Use Message::isDisabled().
@@ -1759,10 +1699,12 @@ function wfEmptyMsg( $key ) {
  * Throw a debugging exception. This function previously once exited the process,
  * but now throws an exception instead, with similar results.
  *
+ * @deprecated since 1.22; just throw an MWException yourself
  * @param string $msg message shown when dying.
  * @throws MWException
  */
 function wfDebugDieBacktrace( $msg = '' ) {
+	wfDeprecated( __FUNCTION__, '1.22' );
 	throw new MWException( $msg );
 }
 
@@ -1779,7 +1721,7 @@ function wfHostname() {
 
 		# Hostname overriding
 		global $wgOverrideHostname;
-		if( $wgOverrideHostname !== false ) {
+		if ( $wgOverrideHostname !== false ) {
 			# Set static and skip any detection
 			$host = $wgOverrideHostname;
 			return $host;
@@ -1791,7 +1733,7 @@ function wfHostname() {
 		} else {
 			$uname = false;
 		}
-		if( is_array( $uname ) && isset( $uname['nodename'] ) ) {
+		if ( is_array( $uname ) && isset( $uname['nodename'] ) ) {
 			$host = $uname['nodename'];
 		} elseif ( getenv( 'COMPUTERNAME' ) ) {
 			# Windows computer name
@@ -1838,7 +1780,7 @@ function wfReportTime() {
 function wfDebugBacktrace( $limit = 0 ) {
 	static $disabled = null;
 
-	if( extension_loaded( 'Zend Optimizer' ) ) {
+	if ( extension_loaded( 'Zend Optimizer' ) ) {
 		wfDebug( "Zend Optimizer detected; skipping debug_backtrace for safety.\n" );
 		return array();
 	}
@@ -1878,14 +1820,14 @@ function wfBacktrace() {
 		$msg = "<ul>\n";
 	}
 	$backtrace = wfDebugBacktrace();
-	foreach( $backtrace as $call ) {
-		if( isset( $call['file'] ) ) {
+	foreach ( $backtrace as $call ) {
+		if ( isset( $call['file'] ) ) {
 			$f = explode( DIRECTORY_SEPARATOR, $call['file'] );
 			$file = $f[count( $f ) - 1];
 		} else {
 			$file = '-';
 		}
-		if( isset( $call['line'] ) ) {
+		if ( isset( $call['line'] ) ) {
 			$line = $call['line'];
 		} else {
 			$line = '-';
@@ -1895,7 +1837,7 @@ function wfBacktrace() {
 		} else {
 			$msg .= '<li>' . $file . ' line ' . $line . ' calls ';
 		}
-		if( !empty( $call['class'] ) ) {
+		if ( !empty( $call['class'] ) ) {
 			$msg .= $call['class'] . $call['type'];
 		}
 		$msg .= $call['function'] . '()';
@@ -1993,11 +1935,11 @@ function wfViewPrevNext( $offset, $limit, $link, $query = '', $atend = false ) {
 
 	$query = wfCgiToArray( $query );
 
-	if( is_object( $link ) ) {
+	if ( is_object( $link ) ) {
 		$title = $link;
 	} else {
 		$title = Title::newFromText( $link );
-		if( is_null( $title ) ) {
+		if ( is_null( $title ) ) {
 			return false;
 		}
 	}
@@ -2005,23 +1947,6 @@ function wfViewPrevNext( $offset, $limit, $link, $query = '', $atend = false ) {
 	return $wgLang->viewPrevNext( $title, $offset, $limit, $query, $atend );
 }
 
-/**
- * Make a list item, used by various special pages
- *
- * @param string $page Page link
- * @param string $details Text between brackets
- * @param $oppositedm Boolean	Add the direction mark opposite to your
- *								language, to display text properly
- * @return String
- * @deprecated since 1.19; use Language::specialList() instead
- */
-function wfSpecialList( $page, $details, $oppositedm = true ) {
-	wfDeprecated( __METHOD__, '1.19' );
-
-	global $wgLang;
-	return $wgLang->specialList( $page, $details, $oppositedm );
-}
-
 /**
  * @todo document
  * @todo FIXME: We may want to blacklist some broken browsers
@@ -2033,16 +1958,16 @@ function wfClientAcceptsGzip( $force = false ) {
 	static $result = null;
 	if ( $result === null || $force ) {
 		$result = false;
-		if( isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) ) {
+		if ( isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) ) {
 			# @todo FIXME: We may want to blacklist some broken browsers
 			$m = array();
-			if( preg_match(
+			if ( preg_match(
 				'/\bgzip(?:;(q)=([0-9]+(?:\.[0-9]+)))?\b/',
 				$_SERVER['HTTP_ACCEPT_ENCODING'],
 				$m )
 			)
 			{
-				if( isset( $m[2] ) && ( $m[1] == 'q' ) && ( $m[2] == 0 ) ) {
+				if ( isset( $m[2] ) && ( $m[1] == 'q' ) && ( $m[2] == 0 ) ) {
 					$result = false;
 					return $result;
 				}
@@ -2078,22 +2003,54 @@ function wfCheckLimits( $deflimit = 50, $optionname = 'rclimit' ) {
  * @return String
  */
 function wfEscapeWikiText( $text ) {
-	$text = strtr( "\n$text", array(
-		'"' => '&#34;', '&' => '&#38;', "'" => '&#39;', '<' => '&#60;',
-		'=' => '&#61;', '>' => '&#62;', '[' => '&#91;', ']' => '&#93;',
-		'{' => '&#123;', '|' => '&#124;', '}' => '&#125;',
-		"\n#" => "\n&#35;", "\n*" => "\n&#42;",
-		"\n:" => "\n&#58;", "\n;" => "\n&#59;",
-		'://' => '&#58;//', 'ISBN ' => 'ISBN&#32;', 'RFC ' => 'RFC&#32;',
-	) );
-	return substr( $text, 1 );
+	static $repl = null, $repl2 = null;
+	if ( $repl === null ) {
+		$repl = array(
+			'"' => '&#34;', '&' => '&#38;', "'" => '&#39;', '<' => '&#60;',
+			'=' => '&#61;', '>' => '&#62;', '[' => '&#91;', ']' => '&#93;',
+			'{' => '&#123;', '|' => '&#124;', '}' => '&#125;', ';' => '&#59;',
+			"\n#" => "\n&#35;", "\r#" => "\r&#35;",
+			"\n*" => "\n&#42;", "\r*" => "\r&#42;",
+			"\n:" => "\n&#58;", "\r:" => "\r&#58;",
+			"\n " => "\n&#32;", "\r " => "\r&#32;",
+			"\n\n" => "\n&#10;", "\r\n" => "&#13;\n",
+			"\n\r" => "\n&#13;", "\r\r" => "\r&#13;",
+			"\n\t" => "\n&#9;", "\r\t" => "\r&#9;", // "\n\t\n" is treated like "\n\n"
+			"\n----" => "\n&#45;---", "\r----" => "\r&#45;---",
+			'__' => '_&#95;', '://' => '&#58;//',
+		);
+
+		// We have to catch everything "\s" matches in PCRE
+		foreach ( array( 'ISBN', 'RFC', 'PMID' ) as $magic ) {
+			$repl["$magic "] = "$magic&#32;";
+			$repl["$magic\t"] = "$magic&#9;";
+			$repl["$magic\r"] = "$magic&#13;";
+			$repl["$magic\n"] = "$magic&#10;";
+			$repl["$magic\f"] = "$magic&#12;";
+		}
+
+		// And handle protocols that don't use "://"
+		global $wgUrlProtocols;
+		$repl2 = array();
+		foreach ( $wgUrlProtocols as $prot ) {
+			if ( substr( $prot, -1 ) === ':' ) {
+				$repl2[] = preg_quote( substr( $prot, 0, -1 ), '/' );
+			}
+		}
+		$repl2 = $repl2 ? '/\b(' . join( '|', $repl2 ) . '):/i' : '/^(?!)/';
+	}
+	$text = substr( strtr( "\n$text", $repl ), 1 );
+	$text = preg_replace( $repl2, '$1&#58;', $text );
+	return $text;
 }
 
 /**
  * Get the current unix timestamp with microseconds.  Useful for profiling
+ * @deprecated since 1.22; call microtime() directly
  * @return Float
  */
 function wfTime() {
+	wfDeprecated( __FUNCTION__, '1.22' );
 	return microtime( true );
 }
 
@@ -2195,14 +2152,14 @@ function wfHttpError( $code, $label, $desc ) {
  * @param $resetGzipEncoding Bool
  */
 function wfResetOutputBuffers( $resetGzipEncoding = true ) {
-	if( $resetGzipEncoding ) {
+	if ( $resetGzipEncoding ) {
 		// Suppress Content-Encoding and Content-Length
 		// headers from 1.10+s wfOutputHandler
 		global $wgDisableOutputCompression;
 		$wgDisableOutputCompression = true;
 	}
-	while( $status = ob_get_status() ) {
-		if( $status['type'] == 0 /* PHP_OUTPUT_HANDLER_INTERNAL */ ) {
+	while ( $status = ob_get_status() ) {
+		if ( $status['type'] == 0 /* PHP_OUTPUT_HANDLER_INTERNAL */ ) {
 			// Probably from zlib.output_compression or other
 			// PHP-internal setting which can't be removed.
 			//
@@ -2210,13 +2167,13 @@ function wfResetOutputBuffers( $resetGzipEncoding = true ) {
 			// output behavior.
 			break;
 		}
-		if( !ob_end_clean() ) {
+		if ( !ob_end_clean() ) {
 			// Could not remove output buffer handler; abort now
 			// to avoid getting in some kind of infinite loop.
 			break;
 		}
-		if( $resetGzipEncoding ) {
-			if( $status['name'] == 'ob_gzhandler' ) {
+		if ( $resetGzipEncoding ) {
+			if ( $status['name'] == 'ob_gzhandler' ) {
 				// Reset the 'Content-Encoding' field set by this handler
 				// so we can start fresh.
 				header_remove( 'Content-Encoding' );
@@ -2252,7 +2209,7 @@ function wfClearOutputBuffers() {
  */
 function wfAcceptToPrefs( $accept, $def = '*/*' ) {
 	# No arg means accept anything (per HTTP spec)
-	if( !$accept ) {
+	if ( !$accept ) {
 		return array( $def => 1.0 );
 	}
 
@@ -2260,7 +2217,7 @@ function wfAcceptToPrefs( $accept, $def = '*/*' ) {
 
 	$parts = explode( ',', $accept );
 
-	foreach( $parts as $part ) {
+	foreach ( $parts as $part ) {
 		# @todo FIXME: Doesn't deal with params like 'text/html; level=1'
 		$values = explode( ';', trim( $part ) );
 		$match = array();
@@ -2287,13 +2244,13 @@ function wfAcceptToPrefs( $accept, $def = '*/*' ) {
  * @private
  */
 function mimeTypeMatch( $type, $avail ) {
-	if( array_key_exists( $type, $avail ) ) {
+	if ( array_key_exists( $type, $avail ) ) {
 		return $type;
 	} else {
 		$parts = explode( '/', $type );
-		if( array_key_exists( $parts[0] . '/*', $avail ) ) {
+		if ( array_key_exists( $parts[0] . '/*', $avail ) ) {
 			return $parts[0] . '/*';
-		} elseif( array_key_exists( '*/*', $avail ) ) {
+		} elseif ( array_key_exists( '*/*', $avail ) ) {
 			return '*/*';
 		} else {
 			return null;
@@ -2317,21 +2274,21 @@ function mimeTypeMatch( $type, $avail ) {
 function wfNegotiateType( $cprefs, $sprefs ) {
 	$combine = array();
 
-	foreach( array_keys( $sprefs ) as $type ) {
+	foreach ( array_keys( $sprefs ) as $type ) {
 		$parts = explode( '/', $type );
-		if( $parts[1] != '*' ) {
+		if ( $parts[1] != '*' ) {
 			$ckey = mimeTypeMatch( $type, $cprefs );
-			if( $ckey ) {
+			if ( $ckey ) {
 				$combine[$type] = $sprefs[$type] * $cprefs[$ckey];
 			}
 		}
 	}
 
-	foreach( array_keys( $cprefs ) as $type ) {
+	foreach ( array_keys( $cprefs ) as $type ) {
 		$parts = explode( '/', $type );
-		if( $parts[1] != '*' && !array_key_exists( $type, $sprefs ) ) {
+		if ( $parts[1] != '*' && !array_key_exists( $type, $sprefs ) ) {
 			$skey = mimeTypeMatch( $type, $sprefs );
-			if( $skey ) {
+			if ( $skey ) {
 				$combine[$type] = $sprefs[$skey] * $cprefs[$type];
 			}
 		}
@@ -2340,8 +2297,8 @@ function wfNegotiateType( $cprefs, $sprefs ) {
 	$bestq = 0;
 	$besttype = null;
 
-	foreach( array_keys( $combine ) as $type ) {
-		if( $combine[$type] > $bestq ) {
+	foreach ( array_keys( $combine ) as $type ) {
+		if ( $combine[$type] > $bestq ) {
 			$besttype = $type;
 			$bestq = $combine[$type];
 		}
@@ -2447,7 +2404,7 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
 	try {
 		$timestamp = new MWTimestamp( $ts );
 		return $timestamp->getTimestamp( $outputtype );
-	} catch( TimestampException $e ) {
+	} catch ( TimestampException $e ) {
 		wfDebug( "wfTimestamp() fed bogus time value: TYPE=$outputtype; VALUE=$ts\n" );
 		return false;
 	}
@@ -2462,7 +2419,7 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
  * @return String
  */
 function wfTimestampOrNull( $outputtype = TS_UNIX, $ts = null ) {
-	if( is_null( $ts ) ) {
+	if ( is_null( $ts ) ) {
 		return null;
 	} else {
 		return wfTimestamp( $outputtype, $ts );
@@ -2498,7 +2455,7 @@ function wfIsWindows() {
  * @return Bool
  */
 function wfIsHipHop() {
-	return function_exists( 'hphp_thread_set_warmup_enabled' );
+	return defined( 'HPHP_VERSION' );
 }
 
 /**
@@ -2533,8 +2490,8 @@ function wfTempDir() {
 
 	$tmpDir = array_map( "getenv", array( 'TMPDIR', 'TMP', 'TEMP' ) );
 
-	foreach( $tmpDir as $tmp ) {
-		if( $tmp && file_exists( $tmp ) && is_dir( $tmp ) && is_writable( $tmp ) ) {
+	foreach ( $tmpDir as $tmp ) {
+		if ( $tmp && file_exists( $tmp ) && is_dir( $tmp ) && is_writable( $tmp ) ) {
 			return $tmp;
 		}
 	}
@@ -2561,7 +2518,7 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
 		wfDebug( "$caller: called wfMkdirParents($dir)\n" );
 	}
 
-	if( strval( $dir ) === '' || file_exists( $dir ) ) {
+	if ( strval( $dir ) === '' || ( file_exists( $dir ) && is_dir( $dir ) ) ) {
 		return true;
 	}
 
@@ -2576,10 +2533,14 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
 	$ok = mkdir( $dir, $mode, true ); // PHP5 <3
 	wfRestoreWarnings();
 
-	if( !$ok ) {
+	if ( !$ok ) {
+		//directory may have been created on another request since we last checked
+		if ( is_dir( $dir ) ) {
+			return true;
+		}
+
 		// PHP doesn't report the path in its warning message, so add our own to aid in diagnosis.
-		trigger_error( sprintf( "%s: failed to mkdir \"%s\" mode 0%o", __FUNCTION__, $dir, $mode ),
-			E_USER_WARNING );
+		wfLogWarning( sprintf( "failed to mkdir \"%s\" mode 0%o", $dir, $mode ) );
 	}
 	return $ok;
 }
@@ -2630,7 +2591,9 @@ function wfPercent( $nr, $acc = 2, $round = true ) {
 function in_string( $needle, $str, $insensitive = false ) {
 	wfDeprecated( __METHOD__, '1.21' );
 	$func = 'strpos';
-	if( $insensitive ) $func = 'stripos';
+	if ( $insensitive ) {
+		$func = 'stripos';
+	}
 
 	return $func( $str, $needle ) !== false;
 }
@@ -2659,46 +2622,14 @@ function in_string( $needle, $str, $insensitive = false ) {
  * @return Bool
  */
 function wfIniGetBool( $setting ) {
-	$val = ini_get( $setting );
+	$val = strtolower( ini_get( $setting ) );
 	// 'on' and 'true' can't have whitespace around them, but '1' can.
-	return strtolower( $val ) == 'on'
-		|| strtolower( $val ) == 'true'
-		|| strtolower( $val ) == 'yes'
+	return $val == 'on'
+		|| $val == 'true'
+		|| $val == 'yes'
 		|| preg_match( "/^\s*[+-]?0*[1-9]/", $val ); // approx C atoi() function
 }
 
-/**
- * Wrapper function for PHP's dl(). This doesn't work in most situations from
- * PHP 5.3 onward, and is usually disabled in shared environments anyway.
- *
- * @param string $extension A PHP extension. The file suffix (.so or .dll)
- *                          should be omitted
- * @param string $fileName Name of the library, if not $extension.suffix
- * @return Bool - Whether or not the extension is loaded
- */
-function wfDl( $extension, $fileName = null ) {
-	if( extension_loaded( $extension ) ) {
-		return true;
-	}
-
-	$canDl = false;
-	if( PHP_SAPI == 'cli' || PHP_SAPI == 'cgi' || PHP_SAPI == 'embed' ) {
-		$canDl = ( function_exists( 'dl' ) && is_callable( 'dl' )
-		&& wfIniGetBool( 'enable_dl' ) && !wfIniGetBool( 'safe_mode' ) );
-	}
-
-	if( $canDl ) {
-		$fileName = $fileName ? $fileName : $extension;
-		if( wfIsWindows() ) {
-			$fileName = 'php_' . $fileName;
-		}
-		wfSuppressWarnings();
-		dl( $fileName . '.' . PHP_SHLIB_SUFFIX );
-		wfRestoreWarnings();
-	}
-	return extension_loaded( $extension );
-}
-
 /**
  * Windows-compatible version of escapeshellarg()
  * Windows doesn't recognise single-quotes in the shell, but the escapeshellarg()
@@ -2764,25 +2695,15 @@ function wfEscapeShellArg() {
 }
 
 /**
- * Execute a shell command, with time and memory limits mirrored from the PHP
- * configuration if supported.
- * @param string $cmd Command line, properly escaped for shell.
- * @param &$retval null|Mixed optional, will receive the program's exit code.
- *                 (non-zero is usually failure)
- * @param array $environ optional environment variables which should be
- *                 added to the executed command environment.
- * @param array $limits optional array with limits(filesize, memory, time, walltime)
- *                 this overwrites the global wgShellMax* limits.
- * @return string collected stdout as a string (trailing newlines stripped)
+ * Check if wfShellExec() is effectively disabled via php.ini config
+ * @return bool|string False or one of (safemode,disabled)
+ * @since 1.22
  */
-function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array() ) {
-	global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime,
-		$wgMaxShellWallClockTime, $wgShellCgroup;
-
-	static $disabled;
+function wfShellExecDisabled() {
+	static $disabled = null;
 	if ( is_null( $disabled ) ) {
 		$disabled = false;
-		if( wfIniGetBool( 'safe_mode' ) ) {
+		if ( wfIniGetBool( 'safe_mode' ) ) {
 			wfDebug( "wfShellExec can't run in safe_mode, PHP's exec functions are too broken.\n" );
 			$disabled = 'safemode';
 		} else {
@@ -2795,6 +2716,28 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array
 			}
 		}
 	}
+	return $disabled;
+}
+
+/**
+ * Execute a shell command, with time and memory limits mirrored from the PHP
+ * configuration if supported.
+ * @param string $cmd Command line, properly escaped for shell.
+ * @param &$retval null|Mixed optional, will receive the program's exit code.
+ *                 (non-zero is usually failure)
+ * @param array $environ optional environment variables which should be
+ *                 added to the executed command environment.
+ * @param array $limits optional array with limits(filesize, memory, time, walltime)
+ *                 this overwrites the global wgShellMax* limits.
+ * @param array $options Array of options. Only one is "duplicateStderr" => true, which
+ *                 Which duplicates stderr to stdout, including errors from limit.sh
+ * @return string collected stdout as a string
+ */
+function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array(), $options = array() ) {
+	global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime,
+		$wgMaxShellWallClockTime, $wgShellCgroup;
+
+	$disabled = wfShellExecDisabled();
 	if ( $disabled ) {
 		$retval = 1;
 		return $disabled == 'safemode' ?
@@ -2802,10 +2745,12 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array
 			'Unable to run external programs, passthru() is disabled.';
 	}
 
+	$includeStderr = isset( $options['duplicateStderr'] ) && $options['duplicateStderr'];
+
 	wfInitShellLocale();
 
 	$envcmd = '';
-	foreach( $environ as $k => $v ) {
+	foreach ( $environ as $k => $v ) {
 		if ( wfIsWindows() ) {
 			/* Surrounding a set in quotes (method used by wfEscapeShellArg) makes the quotes themselves
 			 * appear in the environment variable, so we must use carat escaping as documented in
@@ -2839,17 +2784,25 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array
 			$cmd = '/bin/bash ' . escapeshellarg( "$IP/includes/limit.sh" ) . ' ' .
 				escapeshellarg( $cmd ) . ' ' .
 				escapeshellarg(
+					"MW_INCLUDE_STDERR=" . ( $includeStderr ? '1' : '' ) . ';' .
 					"MW_CPU_LIMIT=$time; " .
 					'MW_CGROUP=' . escapeshellarg( $wgShellCgroup ) . '; ' .
 					"MW_MEM_LIMIT=$mem; " .
 					"MW_FILE_SIZE_LIMIT=$filesize; " .
 					"MW_WALL_CLOCK_LIMIT=$wallTime"
 				);
+		} elseif ( $includeStderr ) {
+			$cmd .= ' 2>&1';
 		}
+	} elseif ( $includeStderr ) {
+		$cmd .= ' 2>&1';
 	}
 	wfDebug( "wfShellExec: $cmd\n" );
 
-	$retval = 1; // error by default?
+	// Default to an unusual value that shouldn't happen naturally,
+	// so in the unlikely event of a weird php bug, it would be
+	// more obvious what happened.
+	$retval = 200;
 	ob_start();
 	passthru( $cmd, $retval );
 	$output = ob_get_contents();
@@ -2861,6 +2814,24 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array
 	return $output;
 }
 
+/**
+ * Execute a shell command, returning both stdout and stderr. Convenience
+ * function, as all the arguments to wfShellExec can become unwieldy.
+ *
+ * @note This also includes errors from limit.sh, e.g. if $wgMaxShellFileSize is exceeded.
+ * @param string $cmd Command line, properly escaped for shell.
+ * @param &$retval null|Mixed optional, will receive the program's exit code.
+ *                 (non-zero is usually failure)
+ * @param array $environ optional environment variables which should be
+ *                 added to the executed command environment.
+ * @param array $limits optional array with limits(filesize, memory, time, walltime)
+ *                 this overwrites the global wgShellMax* limits.
+ * @return string collected stdout and stderr as a string
+ */
+function wfShellExecWithStderr( $cmd, &$retval = null, $environ = array(), $limits = array() ) {
+	return wfShellExec( $cmd, $retval, $environ, $limits, array( 'duplicateStderr' => true ) );
+}
+
 /**
  * Workaround for http://bugs.php.net/bug.php?id=45132
  * escapeshellarg() destroys non-ASCII characters if LANG is not a UTF-8 locale
@@ -2930,7 +2901,7 @@ function wfMerge( $old, $mine, $yours, &$result ) {
 	$haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
 	wfRestoreWarnings();
 
-	if( !$haveDiff3 ) {
+	if ( !$haveDiff3 ) {
 		wfDebug( "diff3 not found\n" );
 		return false;
 	}
@@ -2959,7 +2930,7 @@ function wfMerge( $old, $mine, $yours, &$result ) {
 		wfEscapeShellArg( $yourtextName );
 	$handle = popen( $cmd, 'r' );
 
-	if( fgets( $handle, 1024 ) ) {
+	if ( fgets( $handle, 1024 ) ) {
 		$conflict = true;
 	} else {
 		$conflict = false;
@@ -3011,7 +2982,7 @@ function wfDiff( $before, $after, $params = '-u' ) {
 
 	# This check may also protect against code injection in
 	# case of broken installations.
-	if( !$haveDiff ) {
+	if ( !$haveDiff ) {
 		wfDebug( "diff executable not found\n" );
 		$diffs = new Diff( explode( "\n", $before ), explode( "\n", $after ) );
 		$format = new UnifiedDiffFormatter();
@@ -3125,7 +3096,7 @@ function wfBaseName( $path, $suffix = '' ) {
 		? ''
 		: ( '(?:' . preg_quote( $suffix, '#' ) . ')?' );
 	$matches = array();
-	if( preg_match( "#([^/\\\\]*?){$encSuffix}[/\\\\]*$#", $path, $matches ) ) {
+	if ( preg_match( "#([^/\\\\]*?){$encSuffix}[/\\\\]*$#", $path, $matches ) ) {
 		return $matches[1];
 	} else {
 		return '';
@@ -3153,21 +3124,21 @@ function wfRelativePath( $path, $from ) {
 	$pieces = explode( DIRECTORY_SEPARATOR, dirname( $path ) );
 	$against = explode( DIRECTORY_SEPARATOR, $from );
 
-	if( $pieces[0] !== $against[0] ) {
+	if ( $pieces[0] !== $against[0] ) {
 		// Non-matching Windows drive letters?
 		// Return a full path.
 		return $path;
 	}
 
 	// Trim off common prefix
-	while( count( $pieces ) && count( $against )
+	while ( count( $pieces ) && count( $against )
 		&& $pieces[0] == $against[0] ) {
 		array_shift( $pieces );
 		array_shift( $against );
 	}
 
 	// relative dots to bump us to the parent
-	while( count( $against ) ) {
+	while ( count( $against ) ) {
 		array_unshift( $pieces, '..' );
 		array_shift( $against );
 	}
@@ -3206,20 +3177,20 @@ function wfDoUpdates( $commit = '' ) {
  */
 function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = true, $engine = 'auto' ) {
 	$input = (string)$input;
-	if(
+	if (
 		$sourceBase < 2 ||
 		$sourceBase > 36 ||
 		$destBase < 2 ||
 		$destBase > 36 ||
-		$sourceBase != (int) $sourceBase ||
-		$destBase != (int) $destBase ||
-		$pad != (int) $pad ||
+		$sourceBase != (int)$sourceBase ||
+		$destBase != (int)$destBase ||
+		$pad != (int)$pad ||
 		!preg_match( "/^[" . substr( '0123456789abcdefghijklmnopqrstuvwxyz', 0, $sourceBase ) . "]+$/i", $input )
 	) {
 		return false;
 	}
 
-	static $baseChars = array (
+	static $baseChars = array(
 		10 => 'a', 11 => 'b', 12 => 'c', 13 => 'd', 14 => 'e', 15 => 'f',
 		16 => 'g', 17 => 'h', 18 => 'i', 19 => 'j', 20 => 'k', 21 => 'l',
 		22 => 'm', 23 => 'n', 24 => 'o', 25 => 'p', 26 => 'q', 27 => 'r',
@@ -3234,40 +3205,40 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = t
 		'u' => 30, 'v' => 31, 'w' => 32, 'x' => 33, 'y' => 34, 'z' => 35
 	);
 
-	if( extension_loaded( 'gmp' ) && ( $engine == 'auto' || $engine == 'gmp' ) ) {
+	if ( extension_loaded( 'gmp' ) && ( $engine == 'auto' || $engine == 'gmp' ) ) {
 		$result = gmp_strval( gmp_init( $input, $sourceBase ), $destBase );
-	} elseif( extension_loaded( 'bcmath' ) && ( $engine == 'auto' || $engine == 'bcmath' ) ) {
+	} elseif ( extension_loaded( 'bcmath' ) && ( $engine == 'auto' || $engine == 'bcmath' ) ) {
 		$decimal = '0';
-		foreach( str_split( strtolower( $input ) ) as $char ) {
+		foreach ( str_split( strtolower( $input ) ) as $char ) {
 			$decimal = bcmul( $decimal, $sourceBase );
 			$decimal = bcadd( $decimal, $baseChars[$char] );
 		}
 
-		for( $result = ''; bccomp( $decimal, 0 ); $decimal = bcdiv( $decimal, $destBase, 0 ) ) {
+		for ( $result = ''; bccomp( $decimal, 0 ); $decimal = bcdiv( $decimal, $destBase, 0 ) ) {
 			$result .= $baseChars[bcmod( $decimal, $destBase )];
 		}
 
 		$result = strrev( $result );
 	} else {
 		$inDigits = array();
-		foreach( str_split( strtolower( $input ) ) as $char ) {
+		foreach ( str_split( strtolower( $input ) ) as $char ) {
 			$inDigits[] = $baseChars[$char];
 		}
 
 		// Iterate over the input, modulo-ing out an output digit
 		// at a time until input is gone.
 		$result = '';
-		while( $inDigits ) {
+		while ( $inDigits ) {
 			$work = 0;
 			$workDigits = array();
 
 			// Long division...
-			foreach( $inDigits as $digit ) {
+			foreach ( $inDigits as $digit ) {
 				$work *= $sourceBase;
 				$work += $digit;
 
-				if( $workDigits || $work >= $destBase ) {
-					$workDigits[] = (int) ( $work / $destBase );
+				if ( $workDigits || $work >= $destBase ) {
+					$workDigits[] = (int)( $work / $destBase );
 				}
 				$work %= $destBase;
 			}
@@ -3283,7 +3254,7 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = t
 		$result = strrev( $result );
 	}
 
-	if( !$lowercase ) {
+	if ( !$lowercase ) {
 		$result = strtoupper( $result );
 	}
 
@@ -3309,9 +3280,9 @@ function wfCreateObject( $name, $p ) {
 function wfHttpOnlySafe() {
 	global $wgHttpOnlyBlacklist;
 
-	if( isset( $_SERVER['HTTP_USER_AGENT'] ) ) {
-		foreach( $wgHttpOnlyBlacklist as $regex ) {
-			if( preg_match( $regex, $_SERVER['HTTP_USER_AGENT'] ) ) {
+	if ( isset( $_SERVER['HTTP_USER_AGENT'] ) ) {
+		foreach ( $wgHttpOnlyBlacklist as $regex ) {
+			if ( preg_match( $regex, $_SERVER['HTTP_USER_AGENT'] ) ) {
 				return false;
 			}
 		}
@@ -3338,7 +3309,7 @@ function wfCheckEntropy() {
  */
 function wfFixSessionID() {
 	// If the cookie or session id is already set we already have a session and should abort
-	if ( isset( $_COOKIE[ session_name() ] ) || session_id() ) {
+	if ( isset( $_COOKIE[session_name()] ) || session_id() ) {
 		return;
 	}
 
@@ -3355,6 +3326,27 @@ function wfFixSessionID() {
 	}
 }
 
+/**
+ * Reset the session_id
+ * @since 1.22
+ */
+function wfResetSessionID() {
+	global $wgCookieSecure;
+	$oldSessionId = session_id();
+	$cookieParams = session_get_cookie_params();
+	if ( wfCheckEntropy() && $wgCookieSecure == $cookieParams['secure'] ) {
+		session_regenerate_id( false );
+	} else {
+		$tmp = $_SESSION;
+		session_destroy();
+		wfSetupSession( MWCryptRand::generateHex( 32 ) );
+		$_SESSION = $tmp;
+	}
+	$newSessionId = session_id();
+	wfRunHooks( 'ResetSessionID', array( $oldSessionId, $newSessionId ) );
+}
+
+
 /**
  * Initialise php session
  *
@@ -3363,9 +3355,9 @@ function wfFixSessionID() {
 function wfSetupSession( $sessionId = false ) {
 	global $wgSessionsInMemcached, $wgSessionsInObjectCache, $wgCookiePath, $wgCookieDomain,
 			$wgCookieSecure, $wgCookieHttpOnly, $wgSessionHandler;
-	if( $wgSessionsInObjectCache || $wgSessionsInMemcached ) {
+	if ( $wgSessionsInObjectCache || $wgSessionsInMemcached ) {
 		ObjectCacheSessionHandler::install();
-	} elseif( $wgSessionHandler && $wgSessionHandler != ini_get( 'session.save_handler' ) ) {
+	} elseif ( $wgSessionHandler && $wgSessionHandler != ini_get( 'session.save_handler' ) ) {
 		# Only set this if $wgSessionHandler isn't null and session.save_handler
 		# hasn't already been set to the desired value (that causes errors)
 		ini_set( 'session.save_handler', $wgSessionHandler );
@@ -3440,7 +3432,7 @@ function wfForeignMemcKey( $db, $prefix /*, ... */ ) {
 	} else {
 		$key = $db . ':' . implode( ':', $args );
 	}
-	return $key;
+	return str_replace( ' ', '_', $key );
 }
 
 /**
@@ -3588,7 +3580,7 @@ function wfScript( $script = 'index' ) {
 	global $wgScriptPath, $wgScriptExtension, $wgScript, $wgLoadScript;
 	if ( $script === 'index' ) {
 		return $wgScript;
-	} else if ( $script === 'load' ) {
+	} elseif ( $script === 'load' ) {
 		return $wgLoadScript;
 	} else {
 		return "{$wgScriptPath}/{$script}{$wgScriptExtension}";
@@ -3601,7 +3593,7 @@ function wfScript( $script = 'index' ) {
  * @return string script URL
  */
 function wfGetScriptUrl() {
-	if( isset( $_SERVER['SCRIPT_NAME'] ) ) {
+	if ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
 		#
 		# as it was called, minus the query string.
 		#
@@ -3649,15 +3641,22 @@ function wfGetNull() {
  *
  * @param $maxLag Integer (deprecated)
  * @param $wiki mixed Wiki identifier accepted by wfGetLB
+ * @param $cluster string cluster name accepted by LBFactory
  */
-function wfWaitForSlaves( $maxLag = false, $wiki = false ) {
-	$lb = wfGetLB( $wiki );
+function wfWaitForSlaves( $maxLag = false, $wiki = false, $cluster = false ) {
+	$lb = ( $cluster !== false )
+		? wfGetLBFactory()->getExternalLB( $cluster )
+		: wfGetLB( $wiki );
 	// bug 27975 - Don't try to wait for slaves if there are none
 	// Prevents permission error when getting master position
 	if ( $lb->getServerCount() > 1 ) {
-		$dbw = $lb->getConnection( DB_MASTER );
+		$dbw = $lb->getConnection( DB_MASTER, array(), $wiki );
 		$pos = $dbw->getMasterPos();
-		$lb->waitForAll( $pos );
+		// The DBMS may not support getMasterPos() or the whole
+		// load balancer might be fake (e.g. $wgAllDBsAreLocalhost).
+		if ( $pos !== false ) {
+			$lb->waitForAll( $pos );
+		}
 	}
 }
 
@@ -3739,9 +3738,9 @@ function wfStripIllegalFilenameChars( $name ) {
 function wfMemoryLimit() {
 	global $wgMemoryLimit;
 	$memlimit = wfShorthandToInteger( ini_get( 'memory_limit' ) );
-	if( $memlimit != -1 ) {
+	if ( $memlimit != -1 ) {
 		$conflimit = wfShorthandToInteger( $wgMemoryLimit );
-		if( $conflimit == -1 ) {
+		if ( $conflimit == -1 ) {
 			wfDebug( "Removing PHP's memory limit\n" );
 			wfSuppressWarnings();
 			ini_set( 'memory_limit', $conflimit );
@@ -3766,12 +3765,12 @@ function wfMemoryLimit() {
  */
 function wfShorthandToInteger( $string = '' ) {
 	$string = trim( $string );
-	if( $string === '' ) {
+	if ( $string === '' ) {
 		return -1;
 	}
 	$last = $string[strlen( $string ) - 1];
 	$val = intval( $string );
-	switch( $last ) {
+	switch ( $last ) {
 		case 'g':
 		case 'G':
 			$val *= 1024;
@@ -3799,22 +3798,17 @@ function wfBCP47( $code ) {
 	$codeSegment = explode( '-', $code );
 	$codeBCP = array();
 	foreach ( $codeSegment as $segNo => $seg ) {
-		if ( count( $codeSegment ) > 0 ) {
-			// when previous segment is x, it is a private segment and should be lc
-			if( $segNo > 0 && strtolower( $codeSegment[( $segNo - 1 )] ) == 'x' ) {
-				$codeBCP[$segNo] = strtolower( $seg );
-			// ISO 3166 country code
-			} elseif ( ( strlen( $seg ) == 2 ) && ( $segNo > 0 ) ) {
-				$codeBCP[$segNo] = strtoupper( $seg );
-			// ISO 15924 script code
-			} elseif ( ( strlen( $seg ) == 4 ) && ( $segNo > 0 ) ) {
-				$codeBCP[$segNo] = ucfirst( strtolower( $seg ) );
-			// Use lowercase for other cases
-			} else {
-				$codeBCP[$segNo] = strtolower( $seg );
-			}
+		// when previous segment is x, it is a private segment and should be lc
+		if ( $segNo > 0 && strtolower( $codeSegment[( $segNo - 1 )] ) == 'x' ) {
+			$codeBCP[$segNo] = strtolower( $seg );
+		// ISO 3166 country code
+		} elseif ( ( strlen( $seg ) == 2 ) && ( $segNo > 0 ) ) {
+			$codeBCP[$segNo] = strtoupper( $seg );
+		// ISO 15924 script code
+		} elseif ( ( strlen( $seg ) == 4 ) && ( $segNo > 0 ) ) {
+			$codeBCP[$segNo] = ucfirst( strtolower( $seg ) );
+		// Use lowercase for other cases
 		} else {
-		// Use lowercase for single segment
 			$codeBCP[$segNo] = strtolower( $seg );
 		}
 	}
@@ -3879,7 +3873,7 @@ function wfGetLangConverterCacheStorage() {
  * @param array $args parameters passed to hook functions
  * @return Boolean True if no handler aborted the hook
  */
-function wfRunHooks( $event, $args = array() ) {
+function wfRunHooks( $event, array $args = array() ) {
 	return Hooks::run( $event, $args );
 }
 
@@ -3897,7 +3891,7 @@ function wfRunHooks( $event, $args = array() ) {
  * @throws MWException if $data not long enough, or if unpack fails
  * @return array Associative array of the extracted data
  */
-function wfUnpack( $format, $data, $length=false ) {
+function wfUnpack( $format, $data, $length = false ) {
 	if ( $length !== false ) {
 		$realLen = strlen( $data );
 		if ( $realLen < $length ) {
@@ -3939,19 +3933,19 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
 
 	# Handle redirects
 	$redirectTitle = RepoGroup::singleton()->checkRedirect( Title::makeTitle( NS_FILE, $name ) );
-	if( $redirectTitle ) {
-		$name = $redirectTitle->getDbKey();
+	if ( $redirectTitle ) {
+		$name = $redirectTitle->getDBkey();
 	}
 
 	# Run the extension hook
 	$bad = false;
-	if( !wfRunHooks( 'BadImage', array( $name, &$bad ) ) ) {
+	if ( !wfRunHooks( 'BadImage', array( $name, &$bad ) ) ) {
 		wfProfileOut( __METHOD__ );
 		return $bad;
 	}
 
 	$cacheable = ( $blacklist === null );
-	if( $cacheable && $badImageCache !== null ) {
+	if ( $cacheable && $badImageCache !== null ) {
 		$badImages = $badImageCache;
 	} else { // cache miss
 		if ( $blacklist === null ) {
@@ -3960,7 +3954,7 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
 		# Build the list now
 		$badImages = array();
 		$lines = explode( "\n", $blacklist );
-		foreach( $lines as $line ) {
+		foreach ( $lines as $line ) {
 			# List items only
 			if ( substr( $line, 0, 1 ) !== '*' ) {
 				continue;
@@ -3999,3 +3993,16 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
 	wfProfileOut( __METHOD__ );
 	return $bad;
 }
+
+/**
+ * Determine whether the client at a given source IP is likely to be able to
+ * access the wiki via HTTPS.
+ *
+ * @param string $ip The IPv4/6 address in the normal human-readable form
+ * @return boolean
+ */
+function wfCanIPUseHTTPS( $ip ) {
+	$canDo = true;
+	wfRunHooks( 'CanIPUseHTTPS', array( $ip, &$canDo ) );
+	return !!$canDo;
+}
diff --git a/includes/HTMLForm.php b/includes/HTMLForm.php
index 68639739..d260862c 100644
--- a/includes/HTMLForm.php
+++ b/includes/HTMLForm.php
@@ -83,9 +83,8 @@
  * $form = new HTMLForm( $someFields );
  * $form->setMethod( 'get' )
  *      ->setWrapperLegendMsg( 'message-key' )
- *      ->suppressReset()
  *      ->prepareForm()
- *      ->displayForm();
+ *      ->displayForm( '' );
  * @endcode
  * Note that you will have prepareForm and displayForm at the end. Other
  * methods call done after that would simply not be part of the form :(
@@ -95,7 +94,7 @@
 class HTMLForm extends ContextSource {
 
 	// A mapping of 'type' inputs onto standard HTMLFormField subclasses
-	static $typeMappings = array(
+	public static $typeMappings = array(
 		'api' => 'HTMLApiField',
 		'text' => 'HTMLTextField',
 		'textarea' => 'HTMLTextAreaField',
@@ -128,6 +127,7 @@ class HTMLForm extends ContextSource {
 
 	protected $mFieldTree;
 	protected $mShowReset = false;
+	protected $mShowSubmit = true;
 	public $mFieldData;
 
 	protected $mSubmitCallback;
@@ -140,6 +140,7 @@ class HTMLForm extends ContextSource {
 	protected $mSectionFooters = array();
 	protected $mPost = '';
 	protected $mId;
+	protected $mTableId = '';
 
 	protected $mSubmitID;
 	protected $mSubmitName;
@@ -186,6 +187,7 @@ class HTMLForm extends ContextSource {
 		'table',
 		'div',
 		'raw',
+		'vform',
 	);
 
 	/**
@@ -200,12 +202,12 @@ class HTMLForm extends ContextSource {
 			$this->setContext( $context );
 			$this->mTitle = false; // We don't need them to set a title
 			$this->mMessagePrefix = $messagePrefix;
-		} else {
+		} elseif ( is_null( $context ) && $messagePrefix !== '' ) {
+			$this->mMessagePrefix = $messagePrefix;
+		} elseif ( is_string( $context ) && $messagePrefix === '' ) {
 			// B/C since 1.18
-			if ( is_string( $context ) && $messagePrefix === '' ) {
-				// it's actually $messagePrefix
-				$this->mMessagePrefix = $context;
-			}
+			// it's actually $messagePrefix
+			$this->mMessagePrefix = $context;
 		}
 
 		// Expand out into a tree.
@@ -222,8 +224,15 @@ class HTMLForm extends ContextSource {
 			}
 
 			$field = self::loadInputFromParameters( $fieldname, $info );
+			// FIXME During field's construct, the parent form isn't available!
+			// could add a 'parent' name-value to $info, could add a third parameter.
 			$field->mParent = $this;
 
+			// vform gets too much space if empty labels generate HTML.
+			if ( $this->isVForm() ) {
+				$field->setShowEmptyLabel( false );
+			}
+
 			$setSection =& $loadedDescriptor;
 			if ( $section ) {
 				$sectionParts = explode( '/', $section );
@@ -256,7 +265,7 @@ class HTMLForm extends ContextSource {
 	 */
 	public function setDisplayFormat( $format ) {
 		if ( !in_array( $format, $this->availableDisplayFormats ) ) {
-			throw new MWException ( 'Display format must be one of ' . print_r( $this->availableDisplayFormats, true ) );
+			throw new MWException( 'Display format must be one of ' . print_r( $this->availableDisplayFormats, true ) );
 		}
 		$this->displayFormat = $format;
 		return $this;
@@ -271,12 +280,23 @@ class HTMLForm extends ContextSource {
 		return $this->displayFormat;
 	}
 
+	/**
+	 * Test if displayFormat is 'vform'
+	 * @since 1.22
+	 * @return Bool
+	 */
+	public function isVForm() {
+		return $this->displayFormat === 'vform';
+	}
+
 	/**
 	 * Add the HTMLForm-specific JavaScript, if it hasn't been
 	 * done already.
 	 * @deprecated since 1.18 load modules with ResourceLoader instead
 	 */
-	static function addJS() { wfDeprecated( __METHOD__, '1.18' ); }
+	static function addJS() {
+		wfDeprecated( __METHOD__, '1.18' );
+	}
 
 	/**
 	 * Initialise a new Object for the field
@@ -571,6 +591,21 @@ class HTMLForm extends ContextSource {
 		return $this;
 	}
 
+	/**
+	 * Add an array of hidden fields to the output
+	 *
+	 * @since 1.22
+	 * @param array $fields Associative array of fields to add;
+	 *        mapping names to their values
+	 * @return HTMLForm $this for chaining calls
+	 */
+	public function addHiddenFields( array $fields ) {
+		foreach ( $fields as $name => $value ) {
+			$this->mHiddenFields[] = array( $value, array( 'name' => $name ) );
+		}
+		return $this;
+	}
+
 	/**
 	 * Add a button to the form
 	 * @param string $name field name.
@@ -585,8 +620,8 @@ class HTMLForm extends ContextSource {
 	}
 
 	/**
-	 * Display the form (sending to $wgOut), with an appropriate error
-	 * message or stack of messages, and any validation errors, etc.
+	 * Display the form (sending to the context's OutputPage object), with an
+	 * appropriate error message or stack of messages, and any validation errors, etc.
 	 *
 	 * @attention You should call prepareForm() before calling this function.
 	 * Moreover, when doing method chaining this should be the very last method
@@ -608,6 +643,11 @@ class HTMLForm extends ContextSource {
 		# For good measure (it is the default)
 		$this->getOutput()->preventClickjacking();
 		$this->getOutput()->addModules( 'mediawiki.htmlform' );
+		if ( $this->isVForm() ) {
+			$this->getOutput()->addModuleStyles( 'mediawiki.ui' );
+			// TODO should vertical form set setWrapperLegend( false )
+			// to hide ugly fieldsets?
+		}
 
 		$html = ''
 			. $this->getErrors( $submitResult )
@@ -640,15 +680,18 @@ class HTMLForm extends ContextSource {
 			: 'application/x-www-form-urlencoded';
 		# Attributes
 		$attribs = array(
-			'action' => $this->mAction === false ? $this->getTitle()->getFullURL() : $this->mAction,
-			'method' => $this->mMethod,
-			'class' => 'visualClear',
+			'action' => $this->getAction(),
+			'method' => $this->getMethod(),
+			'class' => array( 'visualClear' ),
 			'enctype' => $encType,
 		);
 		if ( !empty( $this->mId ) ) {
 			$attribs['id'] = $this->mId;
 		}
 
+		if ( $this->isVForm() ) {
+			array_push( $attribs['class'], 'mw-ui-vform', 'mw-ui-container' );
+		}
 		return Html::rawElement( 'form', $attribs, $html );
 	}
 
@@ -682,24 +725,40 @@ class HTMLForm extends ContextSource {
 	 * @return String HTML.
 	 */
 	function getButtons() {
-		$html = '';
-		$attribs = array();
+		$html = '<span class="mw-htmlform-submit-buttons">';
 
-		if ( isset( $this->mSubmitID ) ) {
-			$attribs['id'] = $this->mSubmitID;
-		}
+		if ( $this->mShowSubmit ) {
+			$attribs = array();
 
-		if ( isset( $this->mSubmitName ) ) {
-			$attribs['name'] = $this->mSubmitName;
-		}
+			if ( isset( $this->mSubmitID ) ) {
+				$attribs['id'] = $this->mSubmitID;
+			}
 
-		if ( isset( $this->mSubmitTooltip ) ) {
-			$attribs += Linker::tooltipAndAccesskeyAttribs( $this->mSubmitTooltip );
-		}
+			if ( isset( $this->mSubmitName ) ) {
+				$attribs['name'] = $this->mSubmitName;
+			}
 
-		$attribs['class'] = 'mw-htmlform-submit';
+			if ( isset( $this->mSubmitTooltip ) ) {
+				$attribs += Linker::tooltipAndAccesskeyAttribs( $this->mSubmitTooltip );
+			}
 
-		$html .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
+			$attribs['class'] = array( 'mw-htmlform-submit' );
+
+			if ( $this->isVForm() ) {
+				// mw-ui-block is necessary because the buttons aren't necessarily in an 
+				// immediate child div of the vform.
+				array_push( $attribs['class'], 'mw-ui-button', 'mw-ui-big', 'mw-ui-primary', 'mw-ui-block' );
+			}
+
+			$html .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
+
+			// Buttons are top-level form elements in table and div layouts,
+			// but vform wants all elements inside divs to get spaced-out block
+			// styling.
+			if ( $this->isVForm() ) {
+				$html = Html::rawElement( 'div', null, "\n$html\n" );
+			}
+		}
 
 		if ( $this->mShowReset ) {
 			$html .= Html::element(
@@ -729,6 +788,8 @@ class HTMLForm extends ContextSource {
 			$html .= Html::element( 'input', $attrs );
 		}
 
+		$html .= '</span>';
+
 		return $html;
 	}
 
@@ -737,7 +798,7 @@ class HTMLForm extends ContextSource {
 	 * @return String
 	 */
 	function getBody() {
-		return $this->displaySection( $this->mFieldTree );
+		return $this->displaySection( $this->mFieldTree, $this->mTableId );
 	}
 
 	/**
@@ -851,6 +912,33 @@ class HTMLForm extends ContextSource {
 		return $this;
 	}
 
+	/**
+	 * Stop a default submit button being shown for this form. This implies that an
+	 * alternate submit method must be provided manually.
+	 *
+	 * @since 1.22
+	 *
+	 * @param bool $suppressSubmit Set to false to re-enable the button again
+	 *
+	 * @return HTMLForm $this for chaining calls
+	 */
+	function suppressDefaultSubmit( $suppressSubmit = true ) {
+		$this->mShowSubmit = !$suppressSubmit;
+		return $this;
+	}
+
+	/**
+	 * Set the id of the \<table\> or outermost \<div\> element.
+	 *
+	 * @since 1.22
+	 * @param string $id new value of the id attribute, or "" to remove
+	 * @return HTMLForm $this for chaining calls
+	 */
+	public function setTableId( $id ) {
+		$this->mTableId = $id;
+		return $this;
+	}
+
 	/**
 	 * @param string $id DOM id for the form
 	 * @return HTMLForm $this for chaining calls (since 1.20)
@@ -859,10 +947,12 @@ class HTMLForm extends ContextSource {
 		$this->mId = $id;
 		return $this;
 	}
+
 	/**
 	 * Prompt the whole form to be wrapped in a "<fieldset>", with
 	 * this text as its "<legend>" element.
-	 * @param string $legend HTML to go inside the "<legend>" element.
+	 * @param string|false $legend HTML to go inside the "<legend>" element, or
+	 * false for no <legend>
 	 *	 Will be escaped
 	 * @return HTMLForm $this for chaining calls (since 1.20)
 	 */
@@ -931,19 +1021,30 @@ class HTMLForm extends ContextSource {
 
 	/**
 	 * @todo Document
-	 * @param $fields array[]|HTMLFormField[] array of fields (either arrays or objects)
+	 * @param array[]|HTMLFormField[] $fields array of fields (either arrays or objects)
 	 * @param string $sectionName ID attribute of the "<table>" tag for this section, ignored if empty
 	 * @param string $fieldsetIDPrefix ID prefix for the "<fieldset>" tag of each subsection, ignored if empty
+	 * @param boolean &$hasUserVisibleFields Whether the section had user-visible fields
 	 * @return String
 	 */
-	public function displaySection( $fields, $sectionName = '', $fieldsetIDPrefix = '' ) {
+	public function displaySection( $fields, $sectionName = '', $fieldsetIDPrefix = '', &$hasUserVisibleFields = false ) {
 		$displayFormat = $this->getDisplayFormat();
 
 		$html = '';
 		$subsectionHtml = '';
 		$hasLabel = false;
 
-		$getFieldHtmlMethod = ( $displayFormat == 'table' ) ? 'getTableRow' : 'get' . ucfirst( $displayFormat );
+		switch( $displayFormat ) {
+			case 'table':
+				$getFieldHtmlMethod = 'getTableRow';
+				break;
+			case 'vform':
+				// Close enough to a div.
+				$getFieldHtmlMethod = 'getDiv';
+				break;
+			default:
+				$getFieldHtmlMethod = 'get' . ucfirst( $displayFormat );
+		}
 
 		foreach ( $fields as $key => $value ) {
 			if ( $value instanceof HTMLFormField ) {
@@ -956,20 +1057,38 @@ class HTMLForm extends ContextSource {
 				if ( $labelValue != '&#160;' && $labelValue !== '' ) {
 					$hasLabel = true;
 				}
-			} elseif ( is_array( $value ) ) {
-				$section = $this->displaySection( $value, $key, "$fieldsetIDPrefix$key-" );
-				$legend = $this->getLegend( $key );
-				if ( isset( $this->mSectionHeaders[$key] ) ) {
-					$section = $this->mSectionHeaders[$key] . $section;
-				}
-				if ( isset( $this->mSectionFooters[$key] ) ) {
-					$section .= $this->mSectionFooters[$key];
+
+				if ( get_class( $value ) !== 'HTMLHiddenField' &&
+						get_class( $value ) !== 'HTMLApiField' ) {
+					$hasUserVisibleFields = true;
 				}
-				$attributes = array();
-				if ( $fieldsetIDPrefix ) {
-					$attributes['id'] = Sanitizer::escapeId( "$fieldsetIDPrefix$key" );
+			} elseif ( is_array( $value ) ) {
+				$subsectionHasVisibleFields = false;
+				$section = $this->displaySection( $value, "mw-htmlform-$key", "$fieldsetIDPrefix$key-", $subsectionHasVisibleFields );
+				$legend = null;
+
+				if ( $subsectionHasVisibleFields === true ) {
+					// Display the section with various niceties.
+					$hasUserVisibleFields = true;
+
+					$legend = $this->getLegend( $key );
+
+					if ( isset( $this->mSectionHeaders[$key] ) ) {
+						$section = $this->mSectionHeaders[$key] . $section;
+					}
+					if ( isset( $this->mSectionFooters[$key] ) ) {
+						$section .= $this->mSectionFooters[$key];
+					}
+
+					$attributes = array();
+					if ( $fieldsetIDPrefix ) {
+						$attributes['id'] = Sanitizer::escapeId( "$fieldsetIDPrefix$key" );
+					}
+					$subsectionHtml .= Xml::fieldset( $legend, $section, $attributes ) . "\n";
+				} else {
+					// Just return the inputs, nothing fancy.
+					$subsectionHtml .= $section;
 				}
-				$subsectionHtml .= Xml::fieldset( $legend, $section, $attributes ) . "\n";
 			}
 		}
 
@@ -985,13 +1104,13 @@ class HTMLForm extends ContextSource {
 			);
 
 			if ( $sectionName ) {
-				$attribs['id'] = Sanitizer::escapeId( "mw-htmlform-$sectionName" );
+				$attribs['id'] = Sanitizer::escapeId( $sectionName );
 			}
 
 			if ( $displayFormat === 'table' ) {
 				$html = Html::rawElement( 'table', $attribs,
 					Html::rawElement( 'tbody', array(), "\n$html\n" ) ) . "\n";
-			} elseif ( $displayFormat === 'div' ) {
+			} elseif ( $displayFormat === 'div' || $displayFormat === 'vform' ) {
 				$html = Html::rawElement( 'div', $attribs, "\n$html\n" );
 			}
 		}
@@ -1074,6 +1193,32 @@ class HTMLForm extends ContextSource {
 		return $this;
 	}
 
+	/**
+	 * Get the value for the action attribute of the form.
+	 *
+	 * @since 1.22
+	 *
+	 * @return string
+	 */
+	public function getAction() {
+		global $wgScript, $wgArticlePath;
+
+		// If an action is alredy provided, return it
+		if ( $this->mAction !== false ) {
+			return $this->mAction;
+		}
+
+		// Check whether we are in GET mode and $wgArticlePath contains a "?"
+		// meaning that getLocalURL() would return something like "index.php?title=...".
+		// As browser remove the query string before submitting GET forms,
+		// it means that the title would be lost. In such case use $wgScript instead
+		// and put title in an hidden field (see getHiddenFields()).
+		if ( strpos( $wgArticlePath, '?' ) !== false && $this->getMethod() === 'get' ) {
+			return $wgScript;
+		}
+
+		return $this->getTitle()->getLocalURL();
+	}
 }
 
 /**
@@ -1091,6 +1236,12 @@ abstract class HTMLFormField {
 	protected $mClass = '';
 	protected $mDefault;
 
+	/**
+	 * @var bool If true will generate an empty div element with no label
+	 * @since 1.22
+	 */
+	protected $mShowEmptyLabels = true;
+
 	/**
 	 * @var HTMLForm
 	 */
@@ -1166,6 +1317,18 @@ abstract class HTMLFormField {
 		return true;
 	}
 
+	/**
+	 * Tell the field whether to generate a separate label element if its label
+	 * is blank.
+	 *
+	 * @since 1.22
+	 * @param bool $show Set to false to not generate a label.
+	 * @return void
+	 */
+	public function setShowEmptyLabel( $show ) {
+		$this->mShowEmptyLabels = $show;
+	}
+
 	/**
 	 * Get the value that this input has been set to from a posted form,
 	 * or the input's default value if it has not been set.
@@ -1183,6 +1346,8 @@ abstract class HTMLFormField {
 	/**
 	 * Initialise the object
 	 * @param array $params Associative Array. See HTMLForm doc for syntax.
+	 *
+	 * @since 1.22 The 'label' attribute no longer accepts raw HTML, use 'label-raw' instead
 	 * @throws MWException
 	 */
 	function __construct( $params ) {
@@ -1201,7 +1366,14 @@ abstract class HTMLFormField {
 
 			$this->mLabel = wfMessage( $msg, $msgInfo )->parse();
 		} elseif ( isset( $params['label'] ) ) {
-			$this->mLabel = $params['label'];
+			if ( $params['label'] === '&#160;' ) {
+				// Apparently some things set &nbsp directly and in an odd format
+				$this->mLabel = '&#160;';
+			} else {
+				$this->mLabel = htmlspecialchars( $params['label'] );
+			}
+		} elseif ( isset( $params['label-raw'] ) ) {
+			$this->mLabel = $params['label-raw'];
 		}
 
 		$this->mName = "wp{$params['fieldname']}";
@@ -1246,6 +1418,10 @@ abstract class HTMLFormField {
 		if ( isset( $params['flatlist'] ) ) {
 			$this->mClass .= ' mw-htmlform-flatlist';
 		}
+
+		if ( isset( $params['hidelabel'] ) ) {
+			$this->mShowEmptyLabels = false;
+		}
 	}
 
 	/**
@@ -1306,13 +1482,22 @@ abstract class HTMLFormField {
 		$cellAttributes = array();
 		$label = $this->getLabelHtml( $cellAttributes );
 
+		$outerDivClass = array(
+			'mw-input',
+			'mw-htmlform-nolabel' => ( $label === '' )
+		);
+
 		$field = Html::rawElement(
 			'div',
-			array( 'class' => 'mw-input' ) + $cellAttributes,
+			array( 'class' => $outerDivClass ) + $cellAttributes,
 			$inputHtml . "\n$errors"
 		);
+		$divCssClasses = array( "mw-htmlform-field-$fieldType", $this->mClass, $errorClass );
+		if ( $this->mParent->isVForm() ) {
+			$divCssClasses[] = 'mw-ui-vform-div';
+		}
 		$html = Html::rawElement( 'div',
-			array( 'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass" ),
+			array( 'class' => $divCssClasses ),
 			$label . $field );
 		$html .= $helptext;
 		return $html;
@@ -1437,7 +1622,7 @@ abstract class HTMLFormField {
 	}
 
 	function getLabel() {
-		return $this->mLabel;
+		return is_null( $this->mLabel ) ? '' : $this->mLabel;
 	}
 
 	function getLabelHtml( $cellAttributes = array() ) {
@@ -1449,20 +1634,32 @@ abstract class HTMLFormField {
 			$for['for'] = $this->mID;
 		}
 
+		$labelValue = trim( $this->getLabel() );
+		$hasLabel = false;
+		if ( $labelValue !== '&#160;' && $labelValue !== '' ) {
+			$hasLabel = true;
+		}
+
 		$displayFormat = $this->mParent->getDisplayFormat();
-		$labelElement = Html::rawElement( 'label', $for, $this->getLabel() );
+		$html = '';
 
-		if ( $displayFormat == 'table' ) {
-			return Html::rawElement( 'td', array( 'class' => 'mw-label' ) + $cellAttributes,
-				Html::rawElement( 'label', $for, $this->getLabel() )
+		if ( $displayFormat === 'table' ) {
+			$html = Html::rawElement( 'td', array( 'class' => 'mw-label' ) + $cellAttributes,
+				Html::rawElement( 'label', $for, $labelValue )
 			);
-		} elseif ( $displayFormat == 'div' ) {
-			return Html::rawElement( 'div', array( 'class' => 'mw-label' ) + $cellAttributes,
-				Html::rawElement( 'label', $for, $this->getLabel() )
-			);
-		} else {
-			return $labelElement;
+		} elseif ( $hasLabel || $this->mShowEmptyLabels ) {
+			if ( $displayFormat === 'div' ) {
+				$html = Html::rawElement(
+					'div',
+					array( 'class' => 'mw-label' ) + $cellAttributes,
+					Html::rawElement( 'label', $for, $labelValue )
+				);
+			} else {
+				$html = Html::rawElement( 'label', $for, $labelValue );
+			}
 		}
+
+		return $html;
 	}
 
 	function getDefault() {
@@ -1602,16 +1799,19 @@ class HTMLTextField extends HTMLFormField {
 	}
 }
 class HTMLTextAreaField extends HTMLFormField {
+	const DEFAULT_COLS = 80;
+	const DEFAULT_ROWS = 25;
+
 	function getCols() {
 		return isset( $this->mParams['cols'] )
 			? $this->mParams['cols']
-			: 80;
+			: static::DEFAULT_COLS;
 	}
 
 	function getRows() {
 		return isset( $this->mParams['rows'] )
 			? $this->mParams['rows']
-			: 25;
+			: static::DEFAULT_ROWS;
 	}
 
 	function getInputHTML( $value ) {
@@ -1741,8 +1941,25 @@ class HTMLCheckField extends HTMLFormField {
 			$attr['class'] = $this->mClass;
 		}
 
-		return Xml::check( $this->mName, $value, $attr ) . '&#160;' .
-			Html::rawElement( 'label', array( 'for' => $this->mID ), $this->mLabel );
+		if ( $this->mParent->isVForm() ) {
+			// Nest checkbox inside label.
+			return Html::rawElement(
+					'label',
+					array(
+						'class' => 'mw-ui-checkbox-label'
+					),
+					Xml::check(
+						$this->mName,
+						$value,
+						$attr
+					) .
+					// Html:rawElement doesn't escape contents.
+					htmlspecialchars( $this->mLabel )
+				);
+		} else {
+			return Xml::check( $this->mName, $value, $attr ) . '&#160;' .
+				Html::rawElement( 'label', array( 'for' => $this->mID ), $this->mLabel );
+		}
 	}
 
 	/**
@@ -1754,6 +1971,13 @@ class HTMLCheckField extends HTMLFormField {
 		return '&#160;';
 	}
 
+	/**
+	 * checkboxes don't need a label.
+	 */
+	protected function needsLabel() {
+		return false;
+	}
+
 	/**
 	 * @param  $request WebRequest
 	 * @return String
@@ -1786,9 +2010,39 @@ class HTMLCheckField extends HTMLFormField {
  * A checkbox matrix
  * Operates similarly to HTMLMultiSelectField, but instead of using an array of
  * options, uses an array of rows and an array of columns to dynamically
- * construct a matrix of options.
+ * construct a matrix of options. The tags used to identify a particular cell
+ * are of the form "columnName-rowName"
+ *
+ * Options:
+ *   - columns
+ *     - Required list of columns in the matrix.
+ *   - rows
+ *     - Required list of rows in the matrix.
+ *   - force-options-on
+ *     - Accepts array of column-row tags to be displayed as enabled but unavailable to change
+ *   - force-options-off
+ *     - Accepts array of column-row tags to be displayed as disabled but unavailable to change.
+ *   - tooltips
+ *     - Optional array mapping row label to tooltip content
+ *   - tooltip-class
+ *     - Optional CSS class used on tooltip container span. Defaults to mw-icon-question.
  */
-class HTMLCheckMatrix extends HTMLFormField {
+class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
+
+	static private $requiredParams = array(
+		// Required by underlying HTMLFormField
+		'fieldname',
+		// Required by HTMLCheckMatrix
+		'rows', 'columns'
+	);
+
+	public function __construct( $params ) {
+		$missing = array_diff( self::$requiredParams, array_keys( $params ) );
+		if ( $missing ) {
+			throw new HTMLFormFieldRequiredOptionsException( $this, $missing );
+		}
+		parent::__construct( $params );
+	}
 
 	function validate( $value, $alldata ) {
 		$rows = $this->mParams['rows'];
@@ -1848,27 +2102,42 @@ class HTMLCheckMatrix extends HTMLFormField {
 		}
 		$tableContents .= Html::rawElement( 'tr', array(), "\n$headerContents\n" );
 
+		$tooltipClass = 'mw-icon-question';
+		if ( isset( $this->mParams['tooltip-class'] ) ) {
+			$tooltipClass = $this->mParams['tooltip-class'];
+		}
+
 		// Build the options matrix
 		foreach ( $rows as $rowLabel => $rowTag ) {
+			// Append tooltip if configured
+			if ( isset( $this->mParams['tooltips'][$rowLabel] ) ) {
+				$tooltipAttribs = array(
+					'class' => "mw-htmlform-tooltip $tooltipClass",
+					'title' =>  $this->mParams['tooltips'][$rowLabel],
+				);
+				$rowLabel .= ' ' . Html::element( 'span', $tooltipAttribs, '' );
+			}
 			$rowContents = Html::rawElement( 'td', array(), $rowLabel );
 			foreach ( $columns as $columnTag ) {
-				// Knock out any options that are not wanted
-				if ( isset( $this->mParams['remove-options'] )
-					&& in_array( "$columnTag-$rowTag", $this->mParams['remove-options'] ) )
-				{
-					$rowContents .= Html::rawElement( 'td', array(), '&#160;' );
-				} else {
-					// Construct the checkbox
-					$thisAttribs = array(
-						'id' => "{$this->mID}-$columnTag-$rowTag",
-						'value' => $columnTag . '-' . $rowTag
-					);
-					$checkbox = Xml::check(
-						$this->mName . '[]',
-						in_array( $columnTag . '-' . $rowTag, (array)$value, true ),
-						$attribs + $thisAttribs );
-					$rowContents .= Html::rawElement( 'td', array(), $checkbox );
+				$thisTag = "$columnTag-$rowTag";
+				// Construct the checkbox
+				$thisAttribs = array(
+					'id' => "{$this->mID}-$thisTag",
+					'value' => $thisTag,
+				);
+				$checked = in_array( $thisTag, (array)$value, true );
+				if ( $this->isTagForcedOff( $thisTag ) ) {
+					$checked = false;
+					$thisAttribs['disabled'] = 1;
+				} elseif ( $this->isTagForcedOn( $thisTag ) ) {
+					$checked = true;
+					$thisAttribs['disabled'] = 1;
 				}
+				$rowContents .= Html::rawElement(
+					'td',
+					array(),
+					Xml::check( "{$this->mName}[]", $checked, $attribs + $thisAttribs )
+				);
 			}
 			$tableContents .= Html::rawElement( 'tr', array(), "\n$rowContents\n" );
 		}
@@ -1880,6 +2149,16 @@ class HTMLCheckMatrix extends HTMLFormField {
 		return $html;
 	}
 
+	protected function isTagForcedOff( $tag ) {
+		return isset( $this->mParams['force-options-off'] )
+			&& in_array( $tag, $this->mParams['force-options-off'] );
+	}
+
+	protected function isTagForcedOn( $tag ) {
+		return isset( $this->mParams['force-options-on'] )
+			&& in_array( $tag, $this->mParams['force-options-on'] );
+	}
+
 	/**
 	 * Get the complete table row for the input, including help text,
 	 * labels, and whatever.
@@ -1944,6 +2223,27 @@ class HTMLCheckMatrix extends HTMLFormField {
 			return array();
 		}
 	}
+
+	function filterDataForSubmit( $data ) {
+		$columns = HTMLFormField::flattenOptions( $this->mParams['columns'] );
+		$rows = HTMLFormField::flattenOptions( $this->mParams['rows'] );
+		$res = array();
+		foreach ( $columns as $column ) {
+			foreach ( $rows as $row ) {
+				// Make sure option hasn't been forced
+				$thisTag = "$column-$row";
+				if ( $this->isTagForcedOff( $thisTag ) ) {
+					$res[$thisTag] = false;
+				} elseif ( $this->isTagForcedOn( $thisTag ) ) {
+					$res[$thisTag] = true;
+				} else {
+					$res[$thisTag] = in_array( $thisTag, $data );
+				}
+			}
+		}
+
+		return $res;
+	}
 }
 
 /**
@@ -1959,10 +2259,11 @@ class HTMLSelectField extends HTMLFormField {
 
 		$validOptions = HTMLFormField::flattenOptions( $this->mParams['options'] );
 
-		if ( in_array( $value, $validOptions ) )
+		if ( in_array( $value, $validOptions ) ) {
 			return true;
-		else
+		} else {
 			return $this->msg( 'htmlform-select-badoption' )->parse();
+		}
 	}
 
 	function getInputHTML( $value ) {
@@ -1996,7 +2297,6 @@ class HTMLSelectField extends HTMLFormField {
  * Select dropdown field, with an additional "other" textbox.
  */
 class HTMLSelectOrOtherField extends HTMLTextField {
-	static $jsAdded = false;
 
 	function __construct( $params ) {
 		if ( !in_array( 'other', $params['options'], true ) ) {
@@ -2085,7 +2385,7 @@ class HTMLSelectOrOtherField extends HTMLTextField {
 /**
  * Multi-select field
  */
-class HTMLMultiSelectField extends HTMLFormField {
+class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable {
 
 	function validate( $value, $alldata ) {
 		$p = parent::validate( $value, $alldata );
@@ -2178,6 +2478,17 @@ class HTMLMultiSelectField extends HTMLFormField {
 		}
 	}
 
+	function filterDataForSubmit( $data ) {
+		$options = HTMLFormField::flattenOptions( $this->mParams['options'] );
+
+		$res = array();
+		foreach ( $options as $opt ) {
+			$res["$opt"] = in_array( $opt, $data );
+		}
+
+		return $res;
+	}
+
 	protected function needsLabel() {
 		return false;
 	}
@@ -2512,14 +2823,28 @@ class HTMLHiddenField extends HTMLFormField {
 		return $this->getTableRow( $value );
 	}
 
-	public function getInputHTML( $value ) { return ''; }
+	public function getInputHTML( $value ) {
+		return '';
+	}
 }
 
 /**
  * Add a submit button inline in the form (as opposed to
  * HTMLForm::addButton(), which will add it at the end).
  */
-class HTMLSubmitField extends HTMLFormField {
+class HTMLSubmitField extends HTMLButtonField {
+	protected $buttonType = 'submit';
+}
+
+/**
+ * Adds a generic button inline to the form. Does not do anything, you must add
+ * click handling code in JavaScript. Use a HTMLSubmitField if you merely
+ * wish to add a submit button to a form.
+ *
+ * @since 1.22
+ */
+class HTMLButtonField extends HTMLFormField {
+	protected $buttonType = 'button';
 
 	public function __construct( $info ) {
 		$info['nodata'] = true;
@@ -2527,13 +2852,20 @@ class HTMLSubmitField extends HTMLFormField {
 	}
 
 	public function getInputHTML( $value ) {
-		return Xml::submitButton(
+		$attr = array(
+			'class' => 'mw-htmlform-submit ' . $this->mClass,
+			'id' => $this->mID,
+		);
+
+		if ( !empty( $this->mParams['disabled'] ) ) {
+			$attr['disabled'] = 'disabled';
+		}
+
+		return Html::input(
+			$this->mName,
 			$value,
-			array(
-				'class' => 'mw-htmlform-submit ' . $this->mClass,
-				'name' => $this->mName,
-				'id' => $this->mID,
-			)
+			$this->buttonType,
+			$attr
 		);
 	}
 
@@ -2612,3 +2944,22 @@ class HTMLApiField extends HTMLFormField {
 		return '';
 	}
 }
+
+interface HTMLNestedFilterable {
+	/**
+	 * Support for seperating multi-option preferences into multiple preferences
+	 * Due to lack of array support.
+	 * @param $data array
+	 */
+	function filterDataForSubmit( $data );
+}
+
+class HTMLFormFieldRequiredOptionsException extends MWException {
+	public function __construct( HTMLFormField $field, array $missing ) {
+		parent::__construct( sprintf(
+			"Form type `%s` expected the following parameters to be set: %s",
+			get_class( $field ),
+			implode( ', ', $missing )
+		) );
+	}
+}
diff --git a/includes/HashRing.php b/includes/HashRing.php
new file mode 100644
index 00000000..930f8c0a
--- /dev/null
+++ b/includes/HashRing.php
@@ -0,0 +1,142 @@
+<?php
+/**
+ * Convenience class for weighted consistent hash rings.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Convenience class for weighted consistent hash rings
+ *
+ * @since 1.22
+ */
+class HashRing {
+	/** @var Array (location => weight) */
+	protected $sourceMap = array();
+	/** @var Array (location => (start, end)) */
+	protected $ring = array();
+
+	const RING_SIZE = 268435456; // 2^28
+
+	/**
+	 * @param array $map (location => weight)
+	 */
+	public function __construct( array $map ) {
+		$map = array_filter( $map, function( $w ) { return $w > 0; } );
+		if ( !count( $map ) ) {
+			throw new MWException( "Ring is empty or all weights are zero." );
+		}
+		$this->sourceMap = $map;
+		// Sort the locations based on the hash of their names
+		$hashes = array();
+		foreach ( $map as $location => $weight ) {
+			$hashes[$location] = sha1( $location );
+		}
+		uksort( $map, function ( $a, $b ) use ( $hashes ) {
+			return strcmp( $hashes[$a], $hashes[$b] );
+		} );
+		// Fit the map to weight-proportionate one with a space of size RING_SIZE
+		$sum = array_sum( $map );
+		$standardMap = array();
+		foreach ( $map as $location => $weight ) {
+			$standardMap[$location] = (int)floor( $weight / $sum * self::RING_SIZE );
+		}
+		// Build a ring of RING_SIZE spots, with each location at a spot in location hash order
+		$index = 0;
+		foreach ( $standardMap as $location => $weight ) {
+			// Location covers half-closed interval [$index,$index + $weight)
+			$this->ring[$location] = array( $index, $index + $weight );
+			$index += $weight;
+		}
+		// Make sure the last location covers what is left
+		end( $this->ring );
+		$this->ring[key( $this->ring )][1] = self::RING_SIZE;
+	}
+
+	/**
+	 * Get the location of an item on the ring
+	 *
+	 * @param string $item
+	 * @return string Location
+	 */
+	public function getLocation( $item ) {
+		$locations = $this->getLocations( $item, 1 );
+		return $locations[0];
+	}
+
+	/**
+	 * Get the location of an item on the ring, as well as the next clockwise locations
+	 *
+	 * @param string $item
+	 * @param integer $limit Maximum number of locations to return
+	 * @return array List of locations
+	 */
+	public function getLocations( $item, $limit ) {
+		$locations = array();
+		$primaryLocation = null;
+		$spot = hexdec( substr( sha1( $item ), 0, 7 ) ); // first 28 bits
+		foreach ( $this->ring as $location => $range ) {
+			if ( count( $locations ) >= $limit ) {
+				break;
+			}
+			// The $primaryLocation is the location the item spot is in.
+			// After that is reached, keep appending the next locations.
+			if ( ( $range[0] <= $spot && $spot < $range[1] ) || $primaryLocation !== null ) {
+				if ( $primaryLocation === null ) {
+					$primaryLocation = $location;
+				}
+				$locations[] = $location;
+			}
+		}
+		// If more locations are requested, wrap-around and keep adding them
+		reset( $this->ring );
+		while ( count( $locations ) < $limit ) {
+			list( $location, ) = each( $this->ring );
+			if ( $location === $primaryLocation ) {
+				break; // don't go in circles
+			}
+			$locations[] = $location;
+		}
+		return $locations;
+	}
+
+	/**
+	 * Get the map of locations to weight (ignores 0-weight items)
+	 *
+	 * @return array
+	 */
+	public function getLocationWeights() {
+		return $this->sourceMap;
+	}
+
+	/**
+	 * Get a new hash ring with a location removed from the ring
+	 *
+	 * @param string $location
+	 * @return HashRing|bool Returns false if no non-zero weighted spots are left
+	 */
+	public function newWithoutLocation( $location ) {
+		$map = $this->sourceMap;
+		unset( $map[$location] );
+		if ( count( $map ) ) {
+			return new self( $map );
+		}
+		return false;
+	}
+}
diff --git a/includes/HistoryBlob.php b/includes/HistoryBlob.php
index 1af733a2..31aa0f87 100644
--- a/includes/HistoryBlob.php
+++ b/includes/HistoryBlob.php
@@ -143,7 +143,7 @@ class ConcatenatedGzipHistoryBlob implements HistoryBlob
 	 * Compress the bulk data in the object
 	 */
 	public function compress() {
-		if ( !$this->mCompressed  ) {
+		if ( !$this->mCompressed ) {
 			$this->mItems = gzdeflate( serialize( $this->mItems ) );
 			$this->mCompressed = true;
 		}
@@ -231,16 +231,16 @@ class HistoryBlobStub {
 	 * @return string
 	 */
 	function getText() {
-		if( isset( self::$blobCache[$this->mOldId] ) ) {
+		if ( isset( self::$blobCache[$this->mOldId] ) ) {
 			$obj = self::$blobCache[$this->mOldId];
 		} else {
 			$dbr = wfGetDB( DB_SLAVE );
 			$row = $dbr->selectRow( 'text', array( 'old_flags', 'old_text' ), array( 'old_id' => $this->mOldId ) );
-			if( !$row ) {
+			if ( !$row ) {
 				return false;
 			}
 			$flags = explode( ',', $row->old_flags );
-			if( in_array( 'external', $flags ) ) {
+			if ( in_array( 'external', $flags ) ) {
 				$url = $row->old_text;
 				$parts = explode( '://', $url, 2 );
 				if ( !isset( $parts[1] ) || $parts[1] == '' ) {
@@ -249,11 +249,11 @@ class HistoryBlobStub {
 				$row->old_text = ExternalStore::fetchFromUrl( $url );
 
 			}
-			if( !in_array( 'object', $flags ) ) {
+			if ( !in_array( 'object', $flags ) ) {
 				return false;
 			}
 
-			if( in_array( 'gzip', $flags ) ) {
+			if ( in_array( 'gzip', $flags ) ) {
 				// This shouldn't happen, but a bug in the compress script
 				// may at times gzip-compress a HistoryBlob object row.
 				$obj = unserialize( gzinflate( $row->old_text ) );
@@ -261,7 +261,7 @@ class HistoryBlobStub {
 				$obj = unserialize( $row->old_text );
 			}
 
-			if( !is_object( $obj ) ) {
+			if ( !is_object( $obj ) ) {
 				// Correct for old double-serialization bug.
 				$obj = unserialize( $obj );
 			}
@@ -318,7 +318,7 @@ class HistoryBlobCurStub {
 	function getText() {
 		$dbr = wfGetDB( DB_SLAVE );
 		$row = $dbr->selectRow( 'cur', array( 'cur_text' ), array( 'cur_id' => $this->mCurId ) );
-		if( !$row ) {
+		if ( !$row ) {
 			return false;
 		}
 		return $row->cur_text;
@@ -530,7 +530,7 @@ class DiffHistoryBlob implements HistoryBlob {
 
 		$header = unpack( 'Vofp/Vcsize', substr( $diff, 0, 8 ) );
 
-		# Check the checksum if hash/mhash is available
+		# Check the checksum if hash extension is available
 		$ofp = $this->xdiffAdler32( $base );
 		if ( $ofp !== false && $ofp !== substr( $diff, 0, 4 ) ) {
 			wfDebug( __METHOD__ . ": incorrect base checksum\n" );
@@ -577,24 +577,23 @@ class DiffHistoryBlob implements HistoryBlob {
 	 * Compute a binary "Adler-32" checksum as defined by LibXDiff, i.e. with
 	 * the bytes backwards and initialised with 0 instead of 1. See bug 34428.
 	 *
-	 * Returns false if no hashing library is available
+	 * @param string $s
+	 * @return string|bool: false if the hash extension is not available
 	 */
 	function xdiffAdler32( $s ) {
+		if ( !function_exists( 'hash' ) ) {
+			return false;
+		}
+
 		static $init;
 		if ( $init === null ) {
 			$init = str_repeat( "\xf0", 205 ) . "\xee" . str_repeat( "\xf0", 67 ) . "\x02";
 		}
+
 		// The real Adler-32 checksum of $init is zero, so it initialises the
 		// state to zero, as it is at the start of LibXDiff's checksum
 		// algorithm. Appending the subject string then simulates LibXDiff.
-		if ( function_exists( 'hash' ) ) {
-			$hash = hash( 'adler32', $init . $s, true );
-		} elseif ( function_exists( 'mhash' ) ) {
-			$hash = mhash( MHASH_ADLER32, $init . $s );
-		} else {
-			return false;
-		}
-		return strrev( $hash );
+		return strrev( hash( 'adler32', $init . $s, true ) );
 	}
 
 	function uncompress() {
diff --git a/includes/Hooks.php b/includes/Hooks.php
index 8cc7acea..396e360d 100644
--- a/includes/Hooks.php
+++ b/includes/Hooks.php
@@ -1,4 +1,5 @@
 <?php
+
 /**
  * A tool for running hook functions.
  *
@@ -37,40 +38,43 @@ class MWHookException extends MWException {}
  */
 class Hooks {
 
+	/**
+	 * Array of events mapped to an array of callbacks to be run
+	 * when that event is triggered.
+	 */
 	protected static $handlers = array();
 
 	/**
-	 * Clears hooks registered via Hooks::register(). Does not touch $wgHooks.
-	 * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
+	 * Attach an event handler to a given hook.
 	 *
-	 * @since 1.21
-	 *
-	 * @param string $name the name of the hook to clear.
+	 * @param string $name Name of hook
+	 * @param mixed $callback Callback function to attach
 	 *
-	 * @throws MWException if not in testing mode.
+	 * @since 1.18
 	 */
-	public static function clear( $name ) {
-		if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
-			throw new MWException( 'can not reset hooks in operation.' );
+	public static function register( $name, $callback ) {
+		if ( !isset( self::$handlers[$name] ) ) {
+			self::$handlers[$name] = array();
 		}
 
-		unset( self::$handlers[$name] );
+		self::$handlers[$name][] = $callback;
 	}
 
 	/**
-	 * Attach an event handler to a given hook
+	 * Clears hooks registered via Hooks::register(). Does not touch $wgHooks.
+	 * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
 	 *
-	 * @since 1.18
+	 * @param string $name the name of the hook to clear.
 	 *
-	 * @param string $name name of hook
-	 * @param $callback Mixed: callback function to attach
+	 * @since 1.21
+	 * @throws MWException if not in testing mode.
 	 */
-	public static function register( $name, $callback ) {
-		if( !isset( self::$handlers[$name] ) ) {
-			self::$handlers[$name] = array();
+	public static function clear( $name ) {
+		if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+			throw new MWException( 'Cannot reset hooks in operation.' );
 		}
 
-		self::$handlers[$name][] = $callback;
+		unset( self::$handlers[$name] );
 	}
 
 	/**
@@ -79,216 +83,139 @@ class Hooks {
 	 *
 	 * @since 1.18
 	 *
-	 * @param string $name name of hook
-	 * @return Boolean: true if the hook has a function registered to it
+	 * @param string $name Name of hook
+	 * @return bool True if the hook has a function registered to it
 	 */
 	public static function isRegistered( $name ) {
 		global $wgHooks;
-
 		return !empty( $wgHooks[$name] ) || !empty( self::$handlers[$name] );
 	}
 
 	/**
 	 * Returns an array of all the event functions attached to a hook
 	 * This combines functions registered via Hooks::register and with $wgHooks.
-	 * @since 1.18
 	 *
-	 * @throws MWException
-	 * @throws FatalError
-	 * @param string $name name of the hook
+	 * @since 1.18
 	 *
+	 * @param string $name Name of the hook
 	 * @return array
 	 */
 	public static function getHandlers( $name ) {
 		global $wgHooks;
 
-		// Return quickly in the most common case
-		if ( empty( self::$handlers[$name] ) && empty( $wgHooks[$name] ) ) {
+		if ( !self::isRegistered( $name ) ) {
 			return array();
-		}
-
-		if ( !is_array( self::$handlers ) ) {
-			throw new MWException( "Local hooks array is not an array!\n" );
-		}
-
-		if ( !is_array( $wgHooks ) ) {
-			throw new MWException( "Global hooks array is not an array!\n" );
-		}
-
-		if ( empty( Hooks::$handlers[$name] ) ) {
-			$hooks = $wgHooks[$name];
-		} elseif ( empty( $wgHooks[$name] ) ) {
-			$hooks = Hooks::$handlers[$name];
+		} elseif ( !isset( self::$handlers[$name] ) ) {
+			return $wgHooks[$name];
+		} elseif ( !isset( $wgHooks[$name] ) ) {
+			return self::$handlers[$name];
 		} else {
-			// so they are both not empty...
-			$hooks = array_merge( Hooks::$handlers[$name], $wgHooks[$name] );
+			return array_merge( self::$handlers[$name], $wgHooks[$name] );
 		}
-
-		if ( !is_array( $hooks ) ) {
-			throw new MWException( "Hooks array for event '$name' is not an array!\n" );
-		}
-
-		return $hooks;
 	}
 
 	/**
-	 * Call hook functions defined in Hooks::register
+	 * Call hook functions defined in Hooks::register and $wgHooks.
 	 *
-	 * @param string $event event name
-	 * @param $args  Array: parameters passed to hook functions
+	 * For a certain hook event, fetch the array of hook events and
+	 * process them. Determine the proper callback for each hook and
+	 * then call the actual hook using the appropriate arguments.
+	 * Finally, process the return value and return/throw accordingly.
 	 *
+	 * @param string $event Event name
+	 * @param array $args  Array of parameters passed to hook functions
+	 * @return bool True if no handler aborted the hook
+	 *
+	 * @since 1.22 A hook function is not required to return a value for
+	 *   processing to continue. Not returning a value (or explicitly
+	 *   returning null) is equivalent to returning true.
 	 * @throws MWException
 	 * @throws FatalError
-	 * @return Boolean True if no handler aborted the hook
 	 */
-	public static function run( $event, $args = array() ) {
-		global $wgHooks;
-
-		// Return quickly in the most common case
-		if ( empty( self::$handlers[$event] ) && empty( $wgHooks[$event] ) ) {
-			return true;
-		}
-
+	public static function run( $event, array $args = array() ) {
 		wfProfileIn( 'hook: ' . $event );
-		$hooks = self::getHandlers( $event );
+		foreach ( self::getHandlers( $event ) as $hook ) {
+			// Turn non-array values into an array. (Can't use casting because of objects.)
+			if ( !is_array( $hook ) ) {
+				$hook = array( $hook );
+			}
 
-		foreach ( $hooks as $hook ) {
-			$object = null;
-			$method = null;
-			$func = null;
-			$data = null;
-			$have_data = false;
-			$closure = false;
-			$badhookmsg = false;
+			if ( !array_filter( $hook ) ) {
+				// Either array is empty or it's an array filled with null/false/empty.
+				continue;
+			} elseif ( is_array( $hook[0] ) ) {
+				// First element is an array, meaning the developer intended
+				// the first element to be a callback. Merge it in so that
+				// processing can be uniform.
+				$hook = array_merge( $hook[0], array_slice( $hook, 1 ) );
+			}
 
 			/**
 			 * $hook can be: a function, an object, an array of $function and
 			 * $data, an array of just a function, an array of object and
 			 * method, or an array of object, method, and data.
 			 */
-			if ( is_array( $hook ) ) {
-				if ( count( $hook ) < 1 ) {
-					throw new MWException( 'Empty array in hooks for ' . $event . "\n" );
-				} elseif ( is_object( $hook[0] ) ) {
-					$object = $hook[0];
-					if ( $object instanceof Closure ) {
-						$closure = true;
-						if ( count( $hook ) > 1 ) {
-							$data = $hook[1];
-							$have_data = true;
-						}
-					} else {
-						if ( count( $hook ) < 2 ) {
-							$method = 'on' . $event;
-						} else {
-							$method = $hook[1];
-							if ( count( $hook ) > 2 ) {
-								$data = $hook[2];
-								$have_data = true;
-							}
-						}
-					}
-				} elseif ( is_string( $hook[0] ) ) {
-					$func = $hook[0];
-					if ( count( $hook ) > 1) {
-						$data = $hook[1];
-						$have_data = true;
-					}
-				} else {
-					throw new MWException( 'Unknown datatype in hooks for ' . $event . "\n" );
-				}
-			} elseif ( is_string( $hook ) ) { # functions look like strings, too
-				$func = $hook;
-			} elseif ( is_object( $hook ) ) {
-				$object = $hook;
-				if ( $object instanceof Closure ) {
-					$closure = true;
-				} else {
-					$method = "on" . $event;
+			if ( $hook[0] instanceof Closure ) {
+				$func = "hook-$event-closure";
+				$callback = array_shift( $hook );
+			} elseif ( is_object( $hook[0] ) ) {
+				$object = array_shift( $hook );
+				$method = array_shift( $hook );
+
+				// If no method was specified, default to on$event.
+				if ( $method === null ) {
+					$method = "on$event";
 				}
-			} else {
-				throw new MWException( 'Unknown datatype in hooks for ' . $event . "\n" );
-			}
-
-			/* We put the first data element on, if needed. */
-			if ( $have_data ) {
-				$hook_args = array_merge( array( $data ), $args );
-			} else {
-				$hook_args = $args;
-			}
 
-			if ( $closure ) {
-				$callback = $object;
-				$func = "hook-$event-closure";
-			} elseif ( isset( $object ) ) {
 				$func = get_class( $object ) . '::' . $method;
 				$callback = array( $object, $method );
+			} elseif ( is_string( $hook[0] ) ) {
+				$func = $callback = array_shift( $hook );
 			} else {
-				$callback = $func;
+				throw new MWException( 'Unknown datatype in hooks for ' . $event . "\n" );
 			}
 
 			// Run autoloader (workaround for call_user_func_array bug)
-			is_callable( $callback );
+			// and throw error if not callable.
+			if ( !is_callable( $callback ) ) {
+				throw new MWException( 'Invalid callback in hooks for ' . $event . "\n" );
+			}
 
-			/**
-			 * Call the hook. The documentation of call_user_func_array clearly
-			 * states that FALSE is returned on failure. However this is not
-			 * case always. In some version of PHP if the function signature
-			 * does not match the call signature, PHP will issue an warning:
-			 * Param y in x expected to be a reference, value given.
-			 *
-			 * In that case the call will also return null. The following code
-			 * catches that warning and provides better error message. The
-			 * function documentation also says that:
-			 *     In other words, it does not depend on the function signature
-			 *     whether the parameter is passed by a value or by a reference.
-			 * There is also PHP bug http://bugs.php.net/bug.php?id=47554 which
-			 * is unsurprisingly marked as bogus. In short handling of failures
-			 * with call_user_func_array is a failure, the documentation for that
-			 * function is wrong and misleading and PHP developers don't see any
-			 * problem here.
+			/*
+			 * Call the hook. The documentation of call_user_func_array says
+			 * false is returned on failure. However, if the function signature
+			 * does not match the call signature, PHP will issue an warning and
+			 * return null instead. The following code catches that warning and
+			 * provides better error message.
 			 */
 			$retval = null;
-			set_error_handler( 'Hooks::hookErrorHandler' );
+			$badhookmsg = null;
+			$hook_args = array_merge( $hook, $args );
+
+			// Profile first in case the Profiler causes errors.
 			wfProfileIn( $func );
+			set_error_handler( 'Hooks::hookErrorHandler' );
 			try {
 				$retval = call_user_func_array( $callback, $hook_args );
 			} catch ( MWHookException $e ) {
 				$badhookmsg = $e->getMessage();
 			}
-			wfProfileOut( $func );
 			restore_error_handler();
+			wfProfileOut( $func );
 
-			/* String return is an error; false return means stop processing. */
+			// Process the return value.
 			if ( is_string( $retval ) ) {
+				// String returned means error.
 				throw new FatalError( $retval );
-			} elseif( $retval === null ) {
-				if ( $closure ) {
-					$prettyFunc = "$event closure";
-				} elseif( is_array( $callback ) ) {
-					if( is_object( $callback[0] ) ) {
-						$prettyClass = get_class( $callback[0] );
-					} else {
-						$prettyClass = strval( $callback[0] );
-					}
-					$prettyFunc = $prettyClass . '::' . strval( $callback[1] );
-				} else {
-					$prettyFunc = strval( $callback );
-				}
-				if ( $badhookmsg ) {
-					throw new MWException(
-						'Detected bug in an extension! ' .
-						"Hook $prettyFunc has invalid call signature; " . $badhookmsg
-					);
-				} else {
-					throw new MWException(
-						'Detected bug in an extension! ' .
-						"Hook $prettyFunc failed to return a value; " .
-						'should return true to continue hook processing or false to abort.'
-					);
-				}
-			} elseif ( !$retval ) {
+			} elseif ( $badhookmsg !== null ) {
+				// Exception was thrown from Hooks::hookErrorHandler.
+				throw new MWException(
+					'Detected bug in an extension! ' .
+					"Hook $func has invalid call signature; " . $badhookmsg
+				);
+			} elseif ( $retval === false ) {
 				wfProfileOut( 'hook: ' . $event );
+				// False was returned. Stop processing, but no error.
 				return false;
 			}
 		}
@@ -298,18 +225,21 @@ class Hooks {
 	}
 
 	/**
+	 * Handle PHP errors issued inside a hook. Catch errors that have to do with
+	 * a function expecting a reference, and let all others pass through.
+	 *
 	 * This REALLY should be protected... but it's public for compatibility
 	 *
 	 * @since 1.18
 	 *
-	 * @param int $errno Unused
-	 * @param string $errstr error message
-	 * @throws MWHookException
-	 * @return Boolean: false
+	 * @param int $errno Error number (unused)
+	 * @param string $errstr Error message
+	 * @throws MWHookException If the error has to do with the function signature
+	 * @return bool Always returns false
 	 */
 	public static function hookErrorHandler( $errno, $errstr ) {
 		if ( strpos( $errstr, 'expected to be a reference, value given' ) !== false ) {
-			throw new MWHookException( $errstr );
+			throw new MWHookException( $errstr, $errno );
 		}
 		return false;
 	}
diff --git a/includes/Html.php b/includes/Html.php
index af4b4bbf..932f753e 100644
--- a/includes/Html.php
+++ b/includes/Html.php
@@ -36,8 +36,8 @@
  *
  * There are two important configuration options this class uses:
  *
- * $wgHtml5: If this is set to false, then all output should be valid XHTML 1.0
- *     Transitional.
+ * $wgMimeType: If this is set to an xml mimetype then output should be
+ *     valid XHTML5.
  * $wgWellFormedXml: If this is set to true, then all output should be
  *     well-formed XML (quotes on attributes, self-closing tags, etc.).
  *
@@ -101,19 +101,6 @@ class Html {
 		'itemscope',
 	);
 
-	private static $HTMLFiveOnlyAttribs = array(
-		'autocomplete',
-		'autofocus',
-		'max',
-		'min',
-		'multiple',
-		'pattern',
-		'placeholder',
-		'required',
-		'step',
-		'spellcheck',
-	);
-
 	/**
 	 * Returns an HTML element in a string.  The major advantage here over
 	 * manually typing out the HTML is that it will escape all attribute
@@ -177,7 +164,7 @@ class Html {
 	 * @return string
 	 */
 	public static function openElement( $element, $attribs = array() ) {
-		global $wgHtml5, $wgWellFormedXml;
+		global $wgWellFormedXml;
 		$attribs = (array)$attribs;
 		// This is not required in HTML5, but let's do it anyway, for
 		// consistency and better compression.
@@ -185,7 +172,7 @@ class Html {
 
 		// In text/html, initial <html> and <head> tags can be omitted under
 		// pretty much any sane circumstances, if they have no attributes.  See:
-		// <http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags>
+		// <http://www.whatwg.org/html/syntax.html#optional-tags>
 		if ( !$wgWellFormedXml && !$attribs
 		&& in_array( $element, array( 'html', 'head' ) ) ) {
 			return '';
@@ -204,36 +191,28 @@ class Html {
 				'image',
 				'reset',
 				'button',
-			);
 
-			// Allow more input types in HTML5 mode
-			if( $wgHtml5 ) {
-				$validTypes = array_merge( $validTypes, array(
-					'datetime',
-					'datetime-local',
-					'date',
-					'month',
-					'time',
-					'week',
-					'number',
-					'range',
-					'email',
-					'url',
-					'search',
-					'tel',
-					'color',
-				) );
-			}
+				// HTML input types
+				'datetime',
+				'datetime-local',
+				'date',
+				'month',
+				'time',
+				'week',
+				'number',
+				'range',
+				'email',
+				'url',
+				'search',
+				'tel',
+				'color',
+			);
 			if ( isset( $attribs['type'] )
 			&& !in_array( $attribs['type'], $validTypes ) ) {
 				unset( $attribs['type'] );
 			}
 		}
 
-		if ( !$wgHtml5 && $element == 'textarea' && isset( $attribs['maxlength'] ) ) {
-			unset( $attribs['maxlength'] );
-		}
-
 		// According to standard the default type for <button> elements is "submit".
 		// Depending on compatibility mode IE might use "button", instead.
 		// We enforce the standard "submit".
@@ -259,7 +238,7 @@ class Html {
 		$element = strtolower( $element );
 
 		// Reference:
-		// http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags
+		// http://www.whatwg.org/html/syntax.html#optional-tags
 		if ( !$wgWellFormedXml && in_array( $element, array(
 			'html',
 			'head',
@@ -294,12 +273,6 @@ class Html {
 	 * @return array An array of attributes functionally identical to $attribs
 	 */
 	private static function dropDefaults( $element, $attribs ) {
-		// Don't bother doing anything if we aren't outputting HTML5; it's too
-		// much of a pain to maintain two sets of defaults.
-		global $wgHtml5;
-		if ( !$wgHtml5 ) {
-			return $attribs;
-		}
 
 		// Whenever altering this array, please provide a covering test case
 		// in HtmlTest::provideElementsWithAttributesHavingDefaultValues
@@ -340,7 +313,7 @@ class Html {
 
 		foreach ( $attribs as $attrib => $value ) {
 			$lcattrib = strtolower( $attrib );
-			if( is_array( $value ) ) {
+			if ( is_array( $value ) ) {
 				$value = implode( ' ', $value );
 			} else {
 				$value = strval( $value );
@@ -444,11 +417,12 @@ class Html {
 	 *   (starting with a space if at least one attribute is output)
 	 */
 	public static function expandAttributes( $attribs ) {
-		global $wgHtml5, $wgWellFormedXml;
+		global $wgWellFormedXml;
 
 		$ret = '';
 		$attribs = (array)$attribs;
 		foreach ( $attribs as $key => $value ) {
+			// Support intuitive array( 'checked' => true/false ) form
 			if ( $value === false || is_null( $value ) ) {
 				continue;
 			}
@@ -460,15 +434,10 @@ class Html {
 				$key = $value;
 			}
 
-			// Not technically required in HTML5, but required in XHTML 1.0,
-			// and we'd like consistency and better compression anyway.
+			// Not technically required in HTML5 but we'd like consistency
+			// and better compression anyway.
 			$key = strtolower( $key );
 
-			// Here we're blacklisting some HTML5-only attributes...
-			if ( !$wgHtml5 && in_array( $key, self::$HTMLFiveOnlyAttribs ) ) {
-				continue;
-			}
-
 			// Bug 23769: Blacklist all form validation attributes for now.  Current
 			// (June 2010) WebKit has no UI, so the form just refuses to submit
 			// without telling the user why, which is much worse than failing
@@ -552,15 +521,12 @@ class Html {
 			}
 
 			if ( in_array( $key, self::$boolAttribs ) ) {
-				// In XHTML 1.0 Transitional, the value needs to be equal to the
-				// key.  In HTML5, we can leave the value empty instead.  If we
-				// don't need well-formed XML, we can omit the = entirely.
+				// In HTML5, we can leave the value empty. If we don't need
+				// well-formed XML, we can omit the = entirely.
 				if ( !$wgWellFormedXml ) {
 					$ret .= " $key";
-				} elseif ( $wgHtml5 ) {
-					$ret .= " $key=\"\"";
 				} else {
-					$ret .= " $key=\"$key\"";
+					$ret .= " $key=\"\"";
 				}
 			} else {
 				// Apparently we need to entity-encode \n, \r, \t, although the
@@ -602,14 +568,10 @@ class Html {
 	 * @return string Raw HTML
 	 */
 	public static function inlineScript( $contents ) {
-		global $wgHtml5, $wgJsMimeType, $wgWellFormedXml;
+		global $wgWellFormedXml;
 
 		$attrs = array();
 
-		if ( !$wgHtml5 ) {
-			$attrs['type'] = $wgJsMimeType;
-		}
-
 		if ( $wgWellFormedXml && preg_match( '/[<&]/', $contents ) ) {
 			$contents = "/*<![CDATA[*/$contents/*]]>*/";
 		}
@@ -625,14 +587,8 @@ class Html {
 	 * @return string Raw HTML
 	 */
 	public static function linkedScript( $url ) {
-		global $wgHtml5, $wgJsMimeType;
-
 		$attrs = array( 'src' => $url );
 
-		if ( !$wgHtml5 ) {
-			$attrs['type'] = $wgJsMimeType;
-		}
-
 		return self::element( 'script', $attrs );
 	}
 
@@ -677,8 +633,7 @@ class Html {
 
 	/**
 	 * Convenience function to produce an "<input>" element.  This supports the
-	 * new HTML5 input types and attributes, and will silently strip them if
-	 * $wgHtml5 is false.
+	 * new HTML5 input types and attributes.
 	 *
 	 * @param $name    string name attribute
 	 * @param $value   mixed  value attribute
@@ -712,9 +667,7 @@ class Html {
 	 * Convenience function to produce an "<input>" element.
 	 *
 	 * This supports leaving out the cols= and rows= which Xml requires and are
-	 * required by HTML4/XHTML but not required by HTML5 and will silently set
-	 * cols="" and rows="" if $wgHtml5 is false and cols and rows are omitted
-	 * (HTML4 validates present but empty cols="" and rows="" as valid).
+	 * required by HTML4/XHTML but not required by HTML5.
 	 *
 	 * @param $name    string name attribute
 	 * @param $value   string value attribute
@@ -723,20 +676,8 @@ class Html {
 	 * @return string Raw HTML
 	 */
 	public static function textarea( $name, $value = '', $attribs = array() ) {
-		global $wgHtml5;
-
 		$attribs['name'] = $name;
 
-		if ( !$wgHtml5 ) {
-			if ( !isset( $attribs['cols'] ) ) {
-				$attribs['cols'] = "";
-			}
-
-			if ( !isset( $attribs['rows'] ) ) {
-				$attribs['rows'] = "";
-			}
-		}
-
 		if ( substr( $value, 0, 1 ) == "\n" ) {
 			// Workaround for bug 12130: browsers eat the initial newline
 			// assuming that it's just for show, but they do keep the later
@@ -859,28 +800,29 @@ class Html {
 	public static function htmlHeader( $attribs = array() ) {
 		$ret = '';
 
-		global $wgMimeType;
-
-		if ( self::isXmlMimeType( $wgMimeType ) ) {
-			$ret .= "<?xml version=\"1.0\" encoding=\"UTF-8\" ?" . ">\n";
-		}
+		global $wgHtml5Version, $wgMimeType, $wgXhtmlNamespaces;
 
-		global $wgHtml5, $wgHtml5Version, $wgDocType, $wgDTD;
-		global $wgXhtmlNamespaces, $wgXhtmlDefaultNamespace;
+		$isXHTML = self::isXmlMimeType( $wgMimeType );
 
-		if ( $wgHtml5 ) {
-			$ret .= "<!DOCTYPE html>\n";
+		if ( $isXHTML ) { // XHTML5
+			// XML mimetyped markup should have an xml header.
+			// However a DOCTYPE is not needed.
+			$ret .= "<?xml version=\"1.0\" encoding=\"UTF-8\" ?" . ">\n";
 
-			if ( $wgHtml5Version ) {
-				$attribs['version'] = $wgHtml5Version;
-			}
-		} else {
-			$ret .= "<!DOCTYPE html PUBLIC \"$wgDocType\" \"$wgDTD\">\n";
-			$attribs['xmlns'] = $wgXhtmlDefaultNamespace;
+			// Add the standard xmlns
+			$attribs['xmlns'] = 'http://www.w3.org/1999/xhtml';
 
+			// And support custom namespaces
 			foreach ( $wgXhtmlNamespaces as $tag => $ns ) {
 				$attribs["xmlns:$tag"] = $ns;
 			}
+		} else { // HTML5
+			// DOCTYPE
+			$ret .= "<!DOCTYPE html>\n";
+		}
+
+		if ( $wgHtml5Version ) {
+			$attribs['version'] = $wgHtml5Version;
 		}
 
 		$html = Html::openElement( 'html', $attribs );
@@ -901,14 +843,11 @@ class Html {
 	 * @return Boolean
 	 */
 	public static function isXmlMimeType( $mimetype ) {
-		switch ( $mimetype ) {
-			case 'text/xml':
-			case 'application/xhtml+xml':
-			case 'application/xml':
-				return true;
-			default:
-				return false;
-		}
+		# http://www.whatwg.org/html/infrastructure.html#xml-mime-type
+		# * text/xml
+		# * application/xml
+		# * Any mimetype with a subtype ending in +xml (this implicitly includes application/xhtml+xml)
+		return (bool)preg_match( '!^(text|application)/xml$|^.+/.+\+xml$!', $mimetype );
 	}
 
 	/**
@@ -926,22 +865,22 @@ class Html {
 		global $wgStylePath;
 
 		if ( $useStylePath ) {
-			$icon = $wgStylePath.'/common/images/'.$icon;
+			$icon = $wgStylePath . '/common/images/' . $icon;
 		}
 
 		$s = Html::openElement( 'div', array( 'class' => "mw-infobox $class" ) );
 
-		$s .= Html::openElement( 'div', array( 'class' => 'mw-infobox-left' ) ).
+		$s .= Html::openElement( 'div', array( 'class' => 'mw-infobox-left' ) ) .
 				Html::element( 'img',
 					array(
 						'src' => $icon,
 						'alt' => $alt,
 					)
-				).
+				) .
 				Html::closeElement( 'div' );
 
-		$s .= Html::openElement( 'div', array( 'class' => 'mw-infobox-right' ) ).
-				$text.
+		$s .= Html::openElement( 'div', array( 'class' => 'mw-infobox-right' ) ) .
+				$text .
 				Html::closeElement( 'div' );
 		$s .= Html::element( 'div', array( 'style' => 'clear: left;' ), ' ' );
 
@@ -962,9 +901,9 @@ class Html {
 	 */
 	static function srcSet( $urls ) {
 		$candidates = array();
-		foreach( $urls as $density => $url ) {
+		foreach ( $urls as $density => $url ) {
 			// Image candidate syntax per current whatwg live spec, 2012-09-23:
-			// http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-content-1.html#attr-img-srcset
+			// http://www.whatwg.org/html/embedded-content-1.html#attr-img-srcset
 			$candidates[] = "{$url} {$density}x";
 		}
 		return implode( ", ", $candidates );
diff --git a/includes/HtmlFormatter.php b/includes/HtmlFormatter.php
new file mode 100644
index 00000000..248a76fe
--- /dev/null
+++ b/includes/HtmlFormatter.php
@@ -0,0 +1,356 @@
+<?php
+/**
+ * Performs transformations of HTML by wrapping around libxml2 and working
+ * around its countless bugs.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+class HtmlFormatter {
+	/**
+	 * @var DOMDocument
+	 */
+	private $doc;
+
+	private $html;
+	private $itemsToRemove = array();
+	private $elementsToFlatten = array();
+	protected $removeMedia = false;
+
+	/**
+	 * Constructor
+	 *
+	 * @param string $html: Text to process
+	 */
+	public function __construct( $html ) {
+		$this->html = $html;
+	}
+
+	/**
+	 * Turns a chunk of HTML into a proper document
+	 * @param string $html
+	 * @return string
+	 */
+	public static function wrapHTML( $html ) {
+		return '<!doctype html><html><head></head><body>' . $html . '</body></html>';
+	}
+
+	/**
+	 * Override this in descendant class to modify HTML after it has been converted from DOM tree
+	 * @param string $html: HTML to process
+	 * @return string: Processed HTML
+	 */
+	protected function onHtmlReady( $html ) {
+		return $html;
+	}
+
+	/**
+	 * @return DOMDocument: DOM to manipulate
+	 */
+	public function getDoc() {
+		if ( !$this->doc ) {
+			$html = mb_convert_encoding( $this->html, 'HTML-ENTITIES', 'UTF-8' );
+
+			// Workaround for bug that caused spaces before references
+			// to disappear during processing:
+			// https://bugzilla.wikimedia.org/show_bug.cgi?id=53086
+			//
+			// Please replace with a better fix if one can be found.
+			$html = str_replace( ' <', '&#32;<', $html );
+
+			libxml_use_internal_errors( true );
+			$loader = libxml_disable_entity_loader();
+			$this->doc = new DOMDocument();
+			$this->doc->strictErrorChecking = false;
+			$this->doc->loadHTML( $html );
+			libxml_disable_entity_loader( $loader );
+			libxml_use_internal_errors( false );
+			$this->doc->encoding = 'UTF-8';
+		}
+		return $this->doc;
+	}
+
+	/**
+	 * Sets whether images/videos/sounds should be removed from output
+	 * @param bool $flag
+	 */
+	public function setRemoveMedia( $flag = true ) {
+		$this->removeMedia = $flag;
+	}
+
+	/**
+	 * Adds one or more selector of content to remove. A subset of CSS selector
+	 * syntax is supported:
+	 *
+	 *   <tag>
+	 *   <tag>.class
+	 *   .<class>
+	 *   #<id>
+	 *
+	 * @param Array|string $selectors: Selector(s) of stuff to remove
+	 */
+	public function remove( $selectors ) {
+		$this->itemsToRemove = array_merge( $this->itemsToRemove, (array)$selectors );
+	}
+
+	/**
+	 * Adds one or more element name to the list to flatten (remove tag, but not its content)
+	 * Can accept undelimited regexes
+	 *
+	 * Note this interface may fail in surprising unexpected ways due to usage of regexes,
+	 * so should not be relied on for HTML markup security measures.
+	 *
+	 * @param Array|string $elements: Name(s) of tag(s) to flatten
+	 */
+	public function flatten( $elements ) {
+		$this->elementsToFlatten = array_merge( $this->elementsToFlatten, (array)$elements );
+	}
+
+	/**
+	 * Instructs the formatter to flatten all tags
+	 */
+	public function flattenAllTags() {
+		$this->flatten( '[?!]?[a-z0-9]+' );
+	}
+
+	/**
+	 * Removes content we've chosen to remove
+	 */
+	public function filterContent() {
+		wfProfileIn( __METHOD__ );
+		$removals = $this->parseItemsToRemove();
+
+		if ( !$removals ) {
+			wfProfileOut( __METHOD__ );
+			return;
+		}
+
+		$doc = $this->getDoc();
+
+		// Remove tags
+
+		// You can't remove DOMNodes from a DOMNodeList as you're iterating
+		// over them in a foreach loop. It will seemingly leave the internal
+		// iterator on the foreach out of wack and results will be quite
+		// strange. Though, making a queue of items to remove seems to work.
+		$domElemsToRemove = array();
+		foreach ( $removals['TAG'] as $tagToRemove ) {
+			$tagToRemoveNodes = $doc->getElementsByTagName( $tagToRemove );
+			foreach ( $tagToRemoveNodes as $tagToRemoveNode ) {
+				if ( $tagToRemoveNode ) {
+					$domElemsToRemove[] = $tagToRemoveNode;
+				}
+			}
+		}
+
+		$this->removeElements( $domElemsToRemove );
+
+		// Elements with named IDs
+		$domElemsToRemove = array();
+		foreach ( $removals['ID'] as $itemToRemove ) {
+			$itemToRemoveNode = $doc->getElementById( $itemToRemove );
+			if ( $itemToRemoveNode ) {
+				$domElemsToRemove[] = $itemToRemoveNode;
+			}
+		}
+		$this->removeElements( $domElemsToRemove );
+
+		// CSS Classes
+		$domElemsToRemove = array();
+		$xpath = new DOMXpath( $doc );
+		foreach ( $removals['CLASS'] as $classToRemove ) {
+			$elements = $xpath->query( '//*[contains(@class, "' . $classToRemove . '")]' );
+
+			/** @var $element DOMElement */
+			foreach ( $elements as $element ) {
+				$classes = $element->getAttribute( 'class' );
+				if ( preg_match( "/\b$classToRemove\b/", $classes ) && $element->parentNode ) {
+					$domElemsToRemove[] = $element;
+				}
+			}
+		}
+		$this->removeElements( $domElemsToRemove );
+
+		// Tags with CSS Classes
+		foreach ( $removals['TAG_CLASS'] as $classToRemove ) {
+			$parts = explode( '.', $classToRemove );
+
+			$elements = $xpath->query(
+				'//' . $parts[0] . '[@class="' . $parts[1] . '"]'
+			);
+
+			$this->removeElements( $elements );
+		}
+
+		wfProfileOut( __METHOD__ );
+	}
+
+	/**
+	 * Removes a list of elelments from DOMDocument
+	 * @param array|DOMNodeList $elements
+	 */
+	private function removeElements( $elements ) {
+		$list = $elements;
+		if ( $elements instanceof DOMNodeList ) {
+			$list = array();
+			foreach ( $elements as $element ) {
+				$list[] = $element;
+			}
+		}
+		/** @var $element DOMElement */
+		foreach ( $list as $element ) {
+			if ( $element->parentNode ) {
+				$element->parentNode->removeChild( $element );
+			}
+		}
+	}
+
+	/**
+	 * libxml in its usual pointlessness converts many chars to entities - this function
+	 * perfoms a reverse conversion
+	 * @param string $html
+	 * @return string
+	 */
+	private function fixLibXML( $html ) {
+		wfProfileIn( __METHOD__ );
+		static $replacements;
+		if ( ! $replacements ) {
+			// We don't include rules like '&#34;' => '&amp;quot;' because entities had already been
+			// normalized by libxml. Using this function with input not sanitized by libxml is UNSAFE!
+			$replacements = new ReplacementArray( array(
+				'&quot;' => '&amp;quot;',
+				'&amp;' => '&amp;amp;',
+				'&lt;' => '&amp;lt;',
+				'&gt;' => '&amp;gt;',
+			) );
+		}
+		$html = $replacements->replace( $html );
+		$html = mb_convert_encoding( $html, 'UTF-8', 'HTML-ENTITIES' );
+		wfProfileOut( __METHOD__ );
+		return $html;
+	}
+
+	/**
+	 * Performs final transformations and returns resulting HTML
+	 *
+	 * @param DOMElement|string|null $element: ID of element to get HTML from or false to get it from the whole tree
+	 * @return string: Processed HTML
+	 */
+	public function getText( $element = null ) {
+		wfProfileIn( __METHOD__ );
+
+		if ( $this->doc ) {
+			if ( $element !== null && !( $element instanceof DOMElement ) ) {
+				$element = $this->doc->getElementById( $element );
+			}
+			if ( $element ) {
+				$body = $this->doc->getElementsByTagName( 'body' )->item( 0 );
+				$nodesArray = array();
+				foreach ( $body->childNodes as $node ) {
+					$nodesArray[] = $node;
+				}
+				foreach ( $nodesArray as $nodeArray ) {
+					$body->removeChild( $nodeArray );
+				}
+				$body->appendChild( $element );
+			}
+			$html = $this->doc->saveHTML();
+			$html = $this->fixLibXml( $html );
+		} else {
+			$html = $this->html;
+		}
+		if ( wfIsWindows() ) {
+			// Appears to be cleanup for CRLF misprocessing of unknown origin
+			// when running server on Windows platform.
+			//
+			// If this error continues in the future, please track it down in the
+			// XML code paths if possible and fix there.
+			$html = str_replace( '&#13;', '', $html );
+		}
+		$html = preg_replace( '/<!--.*?-->|^.*?<body>|<\/body>.*$/s', '', $html );
+		$html = $this->onHtmlReady( $html );
+
+		if ( $this->elementsToFlatten ) {
+			$elements = implode( '|', $this->elementsToFlatten );
+			$html = preg_replace( "#</?($elements)\\b[^>]*>#is", '', $html );
+		}
+
+		wfProfileOut( __METHOD__ );
+		return $html;
+	}
+
+	/**
+	 * @param $selector: CSS selector to parse
+	 * @param $type
+	 * @param $rawName
+	 * @return bool: Whether the selector was successfully recognised
+	 */
+	protected function parseSelector( $selector, &$type, &$rawName ) {
+		if ( strpos( $selector, '.' ) === 0 ) {
+			$type = 'CLASS';
+			$rawName = substr( $selector, 1 );
+		} elseif ( strpos( $selector, '#' ) === 0 ) {
+			$type = 'ID';
+			$rawName = substr( $selector, 1 );
+		} elseif ( strpos( $selector, '.' ) !== 0 &&
+			strpos( $selector, '.' ) !== false )
+		{
+			$type = 'TAG_CLASS';
+			$rawName = $selector;
+		} elseif ( strpos( $selector, '[' ) === false
+			&& strpos( $selector, ']' ) === false )
+		{
+			$type = 'TAG';
+			$rawName = $selector;
+		} else {
+			throw new MWException( __METHOD__ . "(): unrecognized selector '$selector'" );
+		}
+
+		return true;
+	}
+
+	/**
+	 * Transforms CSS selectors into an internal representation suitable for processing
+	 * @return array
+	 */
+	protected function parseItemsToRemove() {
+		wfProfileIn( __METHOD__ );
+		$removals = array(
+			'ID' => array(),
+			'TAG' => array(),
+			'CLASS' => array(),
+			'TAG_CLASS' => array(),
+		);
+
+		foreach ( $this->itemsToRemove as $itemToRemove ) {
+			$type = '';
+			$rawName = '';
+			if ( $this->parseSelector( $itemToRemove, $type, $rawName ) ) {
+				$removals[$type][] = $rawName;
+			}
+		}
+
+		if ( $this->removeMedia ) {
+			$removals['TAG'][] = 'img';
+			$removals['TAG'][] = 'audio';
+			$removals['TAG'][] = 'video';
+		}
+
+		wfProfileOut( __METHOD__ );
+		return $removals;
+	}
+}
diff --git a/includes/HttpFunctions.php b/includes/HttpFunctions.php
index dc65c67e..78c2ac7a 100644
--- a/includes/HttpFunctions.php
+++ b/includes/HttpFunctions.php
@@ -40,14 +40,15 @@ class Http {
 	 * @param array $options options to pass to MWHttpRequest object.
 	 *	Possible keys for the array:
 	 *    - timeout             Timeout length in seconds
+	 *    - connectTimeout      Timeout for connection, in seconds (curl only)
 	 *    - postData            An array of key-value pairs or a url-encoded form data
 	 *    - proxy               The proxy to use.
 	 *                          Otherwise it will use $wgHTTPProxy (if set)
 	 *                          Otherwise it will use the environment variable "http_proxy" (if set)
 	 *    - noProxy             Don't use any proxy at all. Takes precedence over proxy value(s).
-	 *    - sslVerifyHost       (curl only) Verify hostname against certificate
-	 *    - sslVerifyCert       (curl only) Verify SSL certificate
-	 *    - caInfo              (curl only) Provide CA information
+	 *    - sslVerifyHost       Verify hostname against certificate
+	 *    - sslVerifyCert       Verify SSL certificate
+	 *    - caInfo              Provide CA information
 	 *    - maxRedirects        Maximum number of redirects to follow (defaults to 5)
 	 *    - followRedirects     Whether to follow redirects (defaults to false).
 	 *		                    Note: this should only be used when the target URL is trusted,
@@ -58,20 +59,26 @@ class Http {
 	 */
 	public static function request( $method, $url, $options = array() ) {
 		wfDebug( "HTTP: $method: $url\n" );
+		wfProfileIn( __METHOD__ . "-$method" );
+
 		$options['method'] = strtoupper( $method );
 
 		if ( !isset( $options['timeout'] ) ) {
 			$options['timeout'] = 'default';
 		}
+		if ( !isset( $options['connectTimeout'] ) ) {
+			$options['connectTimeout'] = 'default';
+		}
 
 		$req = MWHttpRequest::factory( $url, $options );
 		$status = $req->execute();
 
+		$content = false;
 		if ( $status->isOK() ) {
-			return $req->getContent();
-		} else {
-			return false;
+			$content = $req->getContent();
 		}
+		wfProfileOut( __METHOD__ . "-$method" );
+		return $content;
 	}
 
 	/**
@@ -213,7 +220,7 @@ class MWHttpRequest {
 	 * @param array $options (optional) extra params to pass (see Http::request())
 	 */
 	protected function __construct( $url, $options = array() ) {
-		global $wgHTTPTimeout;
+		global $wgHTTPTimeout, $wgHTTPConnectTimeout;
 
 		$this->url = wfExpandUrl( $url, PROTO_HTTP );
 		$this->parsedUrl = wfParseUrl( $this->url );
@@ -229,7 +236,12 @@ class MWHttpRequest {
 		} else {
 			$this->timeout = $wgHTTPTimeout;
 		}
-		if( isset( $options['userAgent'] ) ) {
+		if ( isset( $options['connectTimeout'] ) && $options['connectTimeout'] != 'default' ) {
+			$this->connectTimeout = $options['connectTimeout'];
+		} else {
+			$this->connectTimeout = $wgHTTPConnectTimeout;
+		}
+		if ( isset( $options['userAgent'] ) ) {
 			$this->setUserAgent( $options['userAgent'] );
 		}
 
@@ -277,7 +289,7 @@ class MWHttpRequest {
 				' Http::$httpEngine is set to "curl"' );
 		}
 
-		switch( Http::$httpEngine ) {
+		switch ( Http::$httpEngine ) {
 			case 'curl':
 				return new CurlHttpRequest( $url, $options );
 			case 'php':
@@ -302,7 +314,7 @@ class MWHttpRequest {
 
 	/**
 	 * Set the parameters of the request
-
+	 *
 	 * @param $args Array
 	 * @todo overload the args param
 	 */
@@ -427,6 +439,8 @@ class MWHttpRequest {
 	public function execute() {
 		global $wgTitle;
 
+		wfProfileIn( __METHOD__ );
+
 		$this->content = "";
 
 		if ( strtoupper( $this->method ) == "HEAD" ) {
@@ -446,6 +460,8 @@ class MWHttpRequest {
 		if ( !isset( $this->reqHeaders['User-Agent'] ) ) {
 			$this->setUserAgent( Http::userAgent() );
 		}
+
+		wfProfileOut( __METHOD__ );
 	}
 
 	/**
@@ -454,6 +470,8 @@ class MWHttpRequest {
 	 * found in an array in the member variable headerList.
 	 */
 	protected function parseHeader() {
+		wfProfileIn( __METHOD__ );
+
 		$lastname = "";
 
 		foreach ( $this->headerList as $header ) {
@@ -470,6 +488,8 @@ class MWHttpRequest {
 		}
 
 		$this->parseCookies();
+
+		wfProfileOut( __METHOD__ );
 	}
 
 	/**
@@ -552,8 +572,8 @@ class MWHttpRequest {
 			$this->parseHeader();
 		}
 
-		if ( isset( $this->respHeaders[strtolower ( $header ) ] ) ) {
-			$v = $this->respHeaders[strtolower ( $header ) ];
+		if ( isset( $this->respHeaders[strtolower( $header )] ) ) {
+			$v = $this->respHeaders[strtolower( $header )];
 			return $v[count( $v ) - 1];
 		}
 
@@ -603,6 +623,8 @@ class MWHttpRequest {
 	 * Parse the cookies in the response headers and store them in the cookie jar.
 	 */
 	protected function parseCookies() {
+		wfProfileIn( __METHOD__ );
+
 		if ( !$this->cookieJar ) {
 			$this->cookieJar = new CookieJar;
 		}
@@ -613,6 +635,8 @@ class MWHttpRequest {
 				$this->cookieJar->parseCookieResponseHeader( $cookie, $url['host'] );
 			}
 		}
+
+		wfProfileOut( __METHOD__ );
 	}
 
 	/**
@@ -631,17 +655,17 @@ class MWHttpRequest {
 		$headers = $this->getResponseHeaders();
 
 		//return full url (fix for incorrect but handled relative location)
-		if ( isset( $headers[ 'location' ] ) ) {
-			$locations = $headers[ 'location' ];
+		if ( isset( $headers['location'] ) ) {
+			$locations = $headers['location'];
 			$domain = '';
 			$foundRelativeURI = false;
 			$countLocations = count( $locations );
 
 			for ( $i = $countLocations - 1; $i >= 0; $i-- ) {
-				$url = parse_url( $locations[ $i ] );
+				$url = parse_url( $locations[$i] );
 
 				if ( isset( $url['host'] ) ) {
-					$domain = $url[ 'scheme' ] . '://' . $url[ 'host' ];
+					$domain = $url['scheme'] . '://' . $url['host'];
 					break; //found correct URI (with host)
 				} else {
 					$foundRelativeURI = true;
@@ -650,15 +674,15 @@ class MWHttpRequest {
 
 			if ( $foundRelativeURI ) {
 				if ( $domain ) {
-					return $domain . $locations[ $countLocations - 1 ];
+					return $domain . $locations[$countLocations - 1];
 				} else {
 					$url = parse_url( $this->url );
-					if ( isset($url[ 'host' ]) ) {
-						return $url[ 'scheme' ] . '://' . $url[ 'host' ] . $locations[ $countLocations - 1 ];
+					if ( isset( $url['host'] ) ) {
+						return $url['scheme'] . '://' . $url['host'] . $locations[$countLocations - 1];
 					}
 				}
 			} else {
-				return $locations[ $countLocations - 1 ];
+				return $locations[$countLocations - 1];
 			}
 		}
 
@@ -681,11 +705,6 @@ class MWHttpRequest {
 class CurlHttpRequest extends MWHttpRequest {
 	const SUPPORTS_FILE_POSTS = true;
 
-	static $curlMessageMap = array(
-		6 => 'http-host-unreachable',
-		28 => 'http-timed-out'
-	);
-
 	protected $curlOptions = array();
 	protected $headerText = "";
 
@@ -700,14 +719,18 @@ class CurlHttpRequest extends MWHttpRequest {
 	}
 
 	public function execute() {
+		wfProfileIn( __METHOD__ );
+
 		parent::execute();
 
 		if ( !$this->status->isOK() ) {
+			wfProfileOut( __METHOD__ );
 			return $this->status;
 		}
 
 		$this->curlOptions[CURLOPT_PROXY] = $this->proxy;
 		$this->curlOptions[CURLOPT_TIMEOUT] = $this->timeout;
+		$this->curlOptions[CURLOPT_CONNECTTIMEOUT_MS] = $this->connectTimeout * 1000;
 		$this->curlOptions[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0;
 		$this->curlOptions[CURLOPT_WRITEFUNCTION] = $this->callback;
 		$this->curlOptions[CURLOPT_HEADERFUNCTION] = array( $this, "readHeader" );
@@ -746,6 +769,7 @@ class CurlHttpRequest extends MWHttpRequest {
 		$curlHandle = curl_init( $this->url );
 
 		if ( !curl_setopt_array( $curlHandle, $this->curlOptions ) ) {
+			wfProfileOut( __METHOD__ );
 			throw new MWException( "Error setting curl options." );
 		}
 
@@ -760,14 +784,11 @@ class CurlHttpRequest extends MWHttpRequest {
 			wfRestoreWarnings();
 		}
 
-		if ( false === curl_exec( $curlHandle ) ) {
-			$code = curl_error( $curlHandle );
-
-			if ( isset( self::$curlMessageMap[$code] ) ) {
-				$this->status->fatal( self::$curlMessageMap[$code] );
-			} else {
-				$this->status->fatal( 'http-curl-error', curl_error( $curlHandle ) );
-			}
+		$curlRes = curl_exec( $curlHandle );
+		if ( curl_errno( $curlHandle ) == CURLE_OPERATION_TIMEOUTED ) {
+			$this->status->fatal( 'http-timed-out', $this->url );
+		} elseif ( $curlRes === false ) {
+			$this->status->fatal( 'http-curl-error', curl_error( $curlHandle ) );
 		} else {
 			$this->headerList = explode( "\r\n", $this->headerText );
 		}
@@ -777,6 +798,8 @@ class CurlHttpRequest extends MWHttpRequest {
 		$this->parseHeader();
 		$this->setStatus();
 
+		wfProfileOut( __METHOD__ );
+
 		return $this->status;
 	}
 
@@ -811,6 +834,8 @@ class PhpHttpRequest extends MWHttpRequest {
 	}
 
 	public function execute() {
+		wfProfileIn( __METHOD__ );
+
 		parent::execute();
 
 		if ( is_array( $this->postData ) ) {
@@ -826,7 +851,7 @@ class PhpHttpRequest extends MWHttpRequest {
 		if ( $this->method == 'POST' ) {
 			// Required for HTTP 1.0 POSTs
 			$this->reqHeaders['Content-Length'] = strlen( $this->postData );
-			if( !isset( $this->reqHeaders['Content-Type'] ) ) {
+			if ( !isset( $this->reqHeaders['Content-Type'] ) ) {
 				$this->reqHeaders['Content-Type'] = "application/x-www-form-urlencoded";
 			}
 		}
@@ -860,7 +885,23 @@ class PhpHttpRequest extends MWHttpRequest {
 
 		$options['timeout'] = $this->timeout;
 
-		$context = stream_context_create( array( 'http' => $options ) );
+		if ( $this->sslVerifyHost ) {
+			$options['CN_match'] = $this->parsedUrl['host'];
+		}
+		if ( $this->sslVerifyCert ) {
+			$options['verify_peer'] = true;
+		}
+
+		if ( is_dir( $this->caInfo ) ) {
+			$options['capath'] = $this->caInfo;
+		} elseif ( is_file( $this->caInfo ) ) {
+			$options['cafile'] = $this->caInfo;
+		} elseif ( $this->caInfo ) {
+			throw new MWException( "Invalid CA info passed: {$this->caInfo}" );
+		}
+
+		$scheme = $this->parsedUrl['scheme'];
+		$context = stream_context_create( array( "$scheme" => $options ) );
 
 		$this->headerList = array();
 		$reqCount = 0;
@@ -903,18 +944,19 @@ class PhpHttpRequest extends MWHttpRequest {
 
 		if ( $fh === false ) {
 			$this->status->fatal( 'http-request-error' );
+			wfProfileOut( __METHOD__ );
 			return $this->status;
 		}
 
 		if ( $result['timed_out'] ) {
 			$this->status->fatal( 'http-timed-out', $this->url );
+			wfProfileOut( __METHOD__ );
 			return $this->status;
 		}
 
 		// If everything went OK, or we received some error code
 		// get the response body content.
-		if ( $this->status->isOK()
-				|| (int)$this->respStatus >= 300) {
+		if ( $this->status->isOK() || (int)$this->respStatus >= 300 ) {
 			while ( !feof( $fh ) ) {
 				$buf = fread( $fh, 8192 );
 
@@ -930,6 +972,8 @@ class PhpHttpRequest extends MWHttpRequest {
 		}
 		fclose( $fh );
 
+		wfProfileOut( __METHOD__ );
+
 		return $this->status;
 	}
 }
diff --git a/includes/IP.php b/includes/IP.php
index 72b9a52c..73834a59 100644
--- a/includes/IP.php
+++ b/includes/IP.php
@@ -33,24 +33,17 @@ define( 'RE_IP_BLOCK', RE_IP_ADD . '\/' . RE_IP_PREFIX );
 // An IPv6 address is made up of 8 words (each x0000 to xFFFF).
 // However, the "::" abbreviation can be used on consecutive x0000 words.
 define( 'RE_IPV6_WORD', '([0-9A-Fa-f]{1,4})' );
-define( 'RE_IPV6_PREFIX', '(12[0-8]|1[01][0-9]|[1-9]?\d)');
+define( 'RE_IPV6_PREFIX', '(12[0-8]|1[01][0-9]|[1-9]?\d)' );
 define( 'RE_IPV6_ADD',
 	'(?:' . // starts with "::" (including "::")
 		':(?::|(?::' . RE_IPV6_WORD . '){1,7})' .
 	'|' . // ends with "::" (except "::")
 		RE_IPV6_WORD . '(?::' . RE_IPV6_WORD . '){0,6}::' .
-	'|' . // contains one "::" in the middle, ending in "::WORD"
-		RE_IPV6_WORD . '(?::' . RE_IPV6_WORD . '){0,5}' . '::' . RE_IPV6_WORD .
-	'|' . // contains one "::" in the middle, not ending in "::WORD" (regex for PCRE 4.0+)
-		RE_IPV6_WORD . '(?::(?P<abn>:(?P<iabn>))?' . RE_IPV6_WORD . '(?!:(?P=abn))){1,5}' .
-			':' . RE_IPV6_WORD . '(?P=iabn)' .
-		// NOTE: (?!(?P=abn)) fails iff "::" used twice; (?P=iabn) passes iff a "::" was found.
+	'|' . // contains one "::" in the middle (the ^ makes the test fail if none found)
+		RE_IPV6_WORD . '(?::((?(-1)|:))?' . RE_IPV6_WORD . '){1,6}(?(-2)|^)' .
 	'|' . // contains no "::"
 		RE_IPV6_WORD . '(?::' . RE_IPV6_WORD . '){7}' .
 	')'
-	// NOTE: With PCRE 7.2+, we can combine the two '"::" in the middle' cases into:
-	//		RE_IPV6_WORD . '(?::((?(-1)|:))?' . RE_IPV6_WORD . '){1,6}(?(-2)|^)'
-	// This also improves regex concatenation by using relative references.
 );
 // An IPv6 block is an IP address and a prefix (d1 to d128)
 define( 'RE_IPV6_BLOCK', RE_IPV6_ADD . '\/' . RE_IPV6_PREFIX );
@@ -212,7 +205,7 @@ class IP {
 					$longest = $match;
 					$longestPos = $pos;
 				}
-				$offset += ( $pos + strlen( $match ) ); // advance
+				$offset = ( $pos + strlen( $match ) ); // advance
 			}
 			if ( $longest !== false ) {
 				// Replace this portion of the string with the '::' abbreviation
@@ -392,11 +385,11 @@ class IP {
 		static $privateRanges = false;
 		if ( !$privateRanges ) {
 			$privateRanges = array(
-				array( '10.0.0.0',    '10.255.255.255' ),   # RFC 1918 (private)
-				array( '172.16.0.0',  '172.31.255.255' ),   #     "
-				array( '192.168.0.0', '192.168.255.255' ),  #     "
-				array( '0.0.0.0',     '0.255.255.255' ),    # this network
-				array( '127.0.0.0',   '127.255.255.255' ),  # loopback
+				array( '10.0.0.0', '10.255.255.255' ), # RFC 1918 (private)
+				array( '172.16.0.0', '172.31.255.255' ), # RFC 1918 (private)
+				array( '192.168.0.0', '192.168.255.255' ), # RFC 1918 (private)
+				array( '0.0.0.0', '0.255.255.255' ), # this network
+				array( '127.0.0.0', '127.255.255.255' ), # loopback
 			);
 		}
 
@@ -492,6 +485,11 @@ class IP {
 			$n = ip2long( $ip );
 			if ( $n < 0 ) {
 				$n += pow( 2, 32 );
+				# On 32-bit platforms (and on Windows), 2^32 does not fit into an int,
+				# so $n becomes a float. We convert it to string instead.
+				if ( is_float( $n ) ) {
+					$n = (string)$n;
+				}
 			}
 		}
 		return $n;
@@ -526,7 +524,7 @@ class IP {
 			if ( $bits == 0 ) {
 				$network = 0;
 			} else {
-				$network &= ~( ( 1 << ( 32 - $bits ) ) - 1);
+				$network &= ~( ( 1 << ( 32 - $bits ) ) - 1 );
 			}
 			# Convert to unsigned
 			if ( $network < 0 ) {
diff --git a/includes/ImageGallery.php b/includes/ImageGallery.php
deleted file mode 100644
index 1556ad94..00000000
--- a/includes/ImageGallery.php
+++ /dev/null
@@ -1,416 +0,0 @@
-<?php
-/**
- * Image gallery.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Image gallery
- *
- * Add images to the gallery using add(), then render that list to HTML using toHTML().
- *
- * @ingroup Media
- */
-class ImageGallery {
-	var $mImages, $mShowBytes, $mShowFilename;
-	var $mCaption = false;
-
-	/**
-	 * Hide blacklisted images?
-	 */
-	var $mHideBadImages;
-
-	/**
-	 * Registered parser object for output callbacks
-	 * @var Parser
-	 */
-	var $mParser;
-
-	/**
-	 * Contextual title, used when images are being screened
-	 * against the bad image list
-	 */
-	protected $contextTitle = false;
-
-	protected $mAttribs = array();
-
-	/**
-	 * Fixed margins
-	 */
-	const THUMB_PADDING = 30;
-	const GB_PADDING = 5;
-	// 2px borders on each side + 2px implied padding on each side
-	const GB_BORDERS = 8;
-
-	/**
-	 * Create a new image gallery object.
-	 */
-	function __construct() {
-		global $wgGalleryOptions;
-		$this->mImages = array();
-		$this->mShowBytes = $wgGalleryOptions['showBytes'];
-		$this->mShowFilename = true;
-		$this->mParser = false;
-		$this->mHideBadImages = false;
-		$this->mPerRow = $wgGalleryOptions['imagesPerRow'];
-		$this->mWidths = $wgGalleryOptions['imageWidth'];
-		$this->mHeights = $wgGalleryOptions['imageHeight'];
-		$this->mCaptionLength = $wgGalleryOptions['captionLength'];
-	}
-
-	/**
-	 * Register a parser object
-	 *
-	 * @param $parser Parser
-	 */
-	function setParser( $parser ) {
-		$this->mParser = $parser;
-	}
-
-	/**
-	 * Set bad image flag
-	 */
-	function setHideBadImages( $flag = true ) {
-		$this->mHideBadImages = $flag;
-	}
-
-	/**
-	 * Set the caption (as plain text)
-	 *
-	 * @param string $caption Caption
-	 */
-	function setCaption( $caption ) {
-		$this->mCaption = htmlspecialchars( $caption );
-	}
-
-	/**
-	 * Set the caption (as HTML)
-	 *
-	 * @param string $caption Caption
-	 */
-	public function setCaptionHtml( $caption ) {
-		$this->mCaption = $caption;
-	}
-
-	/**
-	 * Set how many images will be displayed per row.
-	 *
-	 * @param $num Integer >= 0; If perrow=0 the gallery layout will adapt to screensize
-	 * invalid numbers will be rejected
-	 */
-	public function setPerRow( $num ) {
-		if ( $num >= 0 ) {
-			$this->mPerRow = (int)$num;
-		}
-	}
-
-	/**
-	 * Set how wide each image will be, in pixels.
-	 *
-	 * @param $num Integer > 0; invalid numbers will be ignored
-	 */
-	public function setWidths( $num ) {
-		if ( $num > 0 ) {
-			$this->mWidths = (int)$num;
-		}
-	}
-
-	/**
-	 * Set how high each image will be, in pixels.
-	 *
-	 * @param $num Integer > 0; invalid numbers will be ignored
-	 */
-	public function setHeights( $num ) {
-		if ( $num > 0 ) {
-			$this->mHeights = (int)$num;
-		}
-	}
-
-	/**
-	 * Instruct the class to use a specific skin for rendering
-	 *
-	 * @param $skin Skin object
-	 * @deprecated since 1.18 Not used anymore
-	 */
-	function useSkin( $skin ) {
-		wfDeprecated( __METHOD__, '1.18' );
-		/* no op */
-	}
-
-	/**
-	 * Add an image to the gallery.
-	 *
-	 * @param $title Title object of the image that is added to the gallery
-	 * @param $html  String: Additional HTML text to be shown. The name and size of the image are always shown.
-	 * @param $alt   String: Alt text for the image
-	 * @param $link  String: Override image link (optional)
-	 */
-	function add( $title, $html = '', $alt = '', $link = '' ) {
-		if ( $title instanceof File ) {
-			// Old calling convention
-			$title = $title->getTitle();
-		}
-		$this->mImages[] = array( $title, $html, $alt, $link );
-		wfDebug( 'ImageGallery::add ' . $title->getText() . "\n" );
-	}
-
-	/**
-	 * Add an image at the beginning of the gallery.
-	 *
-	 * @param $title Title object of the image that is added to the gallery
-	 * @param $html  String: Additional HTML text to be shown. The name and size of the image are always shown.
-	 * @param $alt   String: Alt text for the image
-	 */
-	function insert( $title, $html = '', $alt = '' ) {
-		if ( $title instanceof File ) {
-			// Old calling convention
-			$title = $title->getTitle();
-		}
-		array_unshift( $this->mImages, array( &$title, $html, $alt ) );
-	}
-
-	/**
-	 * isEmpty() returns true if the gallery contains no images
-	 * @return bool
-	 */
-	function isEmpty() {
-		return empty( $this->mImages );
-	}
-
-	/**
-	 * Enable/Disable showing of the file size of an image in the gallery.
-	 * Enabled by default.
-	 *
-	 * @param $f Boolean: set to false to disable.
-	 */
-	function setShowBytes( $f ) {
-		$this->mShowBytes = (bool)$f;
-	}
-
-	/**
-	 * Enable/Disable showing of the filename of an image in the gallery.
-	 * Enabled by default.
-	 *
-	 * @param $f Boolean: set to false to disable.
-	 */
-	function setShowFilename( $f ) {
-		$this->mShowFilename = (bool)$f;
-	}
-
-	/**
-	 * Set arbitrary attributes to go on the HTML gallery output element.
-	 * Should be suitable for a <ul> element.
-	 *
-	 * Note -- if taking from user input, you should probably run through
-	 * Sanitizer::validateAttributes() first.
-	 *
-	 * @param array $attribs of HTML attribute pairs
-	 */
-	function setAttributes( $attribs ) {
-		$this->mAttribs = $attribs;
-	}
-
-	/**
-	 * Return a HTML representation of the image gallery
-	 *
-	 * For each image in the gallery, display
-	 * - a thumbnail
-	 * - the image name
-	 * - the additional text provided when adding the image
-	 * - the size of the image
-	 *
-	 * @return string
-	 */
-	function toHTML() {
-		if ( $this->mPerRow > 0 ) {
-			$maxwidth = $this->mPerRow * ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING + self::GB_BORDERS );
-			$oldStyle = isset( $this->mAttribs['style'] ) ? $this->mAttribs['style'] : '';
-			# _width is ignored by any sane browser. IE6 doesn't know max-width so it uses _width instead
-			$this->mAttribs['style'] = "max-width: {$maxwidth}px;_width: {$maxwidth}px;" . $oldStyle;
-		}
-
-		$attribs = Sanitizer::mergeAttributes(
-			array( 'class' => 'gallery' ), $this->mAttribs );
-
-		$output = Xml::openElement( 'ul', $attribs );
-		if ( $this->mCaption ) {
-			$output .= "\n\t<li class='gallerycaption'>{$this->mCaption}</li>";
-		}
-
-		$lang = $this->getLang();
-		$params = array(
-			'width' => $this->mWidths,
-			'height' => $this->mHeights
-		);
-		# Output each image...
-		foreach ( $this->mImages as $pair ) {
-			$nt = $pair[0];
-			$text = $pair[1]; # "text" means "caption" here
-			$alt = $pair[2];
-			$link = $pair[3];
-
-			$descQuery = false;
-			if ( $nt->getNamespace() == NS_FILE ) {
-				# Get the file...
-				if ( $this->mParser instanceof Parser ) {
-					# Give extensions a chance to select the file revision for us
-					$options = array();
-					wfRunHooks( 'BeforeParserFetchFileAndTitle',
-						array( $this->mParser, $nt, &$options, &$descQuery ) );
-					# Fetch and register the file (file title may be different via hooks)
-					list( $img, $nt ) = $this->mParser->fetchFileAndTitle( $nt, $options );
-				} else {
-					$img = wfFindFile( $nt );
-				}
-			} else {
-				$img = false;
-			}
-
-			if( !$img ) {
-				# We're dealing with a non-image, spit out the name and be done with it.
-				$thumbhtml = "\n\t\t\t" . '<div style="height: ' . ( self::THUMB_PADDING + $this->mHeights ) . 'px;">'
-					. htmlspecialchars( $nt->getText() ) . '</div>';
-			} elseif( $this->mHideBadImages && wfIsBadImage( $nt->getDBkey(), $this->getContextTitle() ) ) {
-				# The image is blacklisted, just show it as a text link.
-				$thumbhtml = "\n\t\t\t" . '<div style="height: ' . ( self::THUMB_PADDING + $this->mHeights ) . 'px;">' .
-					Linker::link(
-						$nt,
-						htmlspecialchars( $nt->getText() ),
-						array(),
-						array(),
-						array( 'known', 'noclasses' )
-					) .
-					'</div>';
-			} elseif( !( $thumb = $img->transform( $params ) ) ) {
-				# Error generating thumbnail.
-				$thumbhtml = "\n\t\t\t" . '<div style="height: ' . ( self::THUMB_PADDING + $this->mHeights ) . 'px;">'
-					. htmlspecialchars( $img->getLastError() ) . '</div>';
-			} else {
-				$vpad = ( self::THUMB_PADDING + $this->mHeights - $thumb->height ) /2;
-
-				$imageParameters = array(
-					'desc-link' => true,
-					'desc-query' => $descQuery,
-					'alt' => $alt,
-					'custom-url-link' => $link
-				);
-				# In the absence of both alt text and caption, fall back on providing screen readers with the filename as alt text
-				if ( $alt == '' && $text == '' ) {
-					$imageParameters['alt'] = $nt->getText();
-				}
-
-				# Set both fixed width and min-height.
-				$thumbhtml = "\n\t\t\t" .
-					'<div class="thumb" style="width: ' . ( $this->mWidths + self::THUMB_PADDING ) . 'px;">'
-					# Auto-margin centering for block-level elements. Needed now that we have video
-					# handlers since they may emit block-level elements as opposed to simple <img> tags.
-					# ref http://css-discuss.incutio.com/?page=CenteringBlockElement
-					. '<div style="margin:' . $vpad . 'px auto;">'
-					. $thumb->toHtml( $imageParameters ) . '</div></div>';
-
-				// Call parser transform hook
-				if ( $this->mParser && $img->getHandler() ) {
-					$img->getHandler()->parserTransformHook( $this->mParser, $img );
-				}
-			}
-
-			//TODO
-			// $linkTarget = Title::newFromText( $wgContLang->getNsText( MWNamespace::getUser() ) . ":{$ut}" );
-			// $ul = Linker::link( $linkTarget, $ut );
-
-			if( $this->mShowBytes ) {
-				if( $img ) {
-					$fileSize = htmlspecialchars( $lang->formatSize( $img->getSize() ) );
-				} else {
-					$fileSize = wfMessage( 'filemissing' )->escaped();
-				}
-				$fileSize = "$fileSize<br />\n";
-			} else {
-				$fileSize = '';
-			}
-
-			$textlink = $this->mShowFilename ?
-				Linker::link(
-					$nt,
-					htmlspecialchars( $lang->truncate( $nt->getText(), $this->mCaptionLength ) ),
-					array(),
-					array(),
-					array( 'known', 'noclasses' )
-				) . "<br />\n" :
-				'';
-
-			# ATTENTION: The newline after <div class="gallerytext"> is needed to accommodate htmltidy which
-			# in version 4.8.6 generated crackpot html in its absence, see:
-			# http://bugzilla.wikimedia.org/show_bug.cgi?id=1765 -Ævar
-
-			# Weird double wrapping (the extra div inside the li) needed due to FF2 bug
-			# Can be safely removed if FF2 falls completely out of existence
-			$output .=
-				"\n\t\t" . '<li class="gallerybox" style="width: ' . ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING ) . 'px">'
-					. '<div style="width: ' . ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING ) . 'px">'
-					. $thumbhtml
-					. "\n\t\t\t" . '<div class="gallerytext">' . "\n"
-					. $textlink . $text . $fileSize
-					. "\n\t\t\t</div>"
-					. "\n\t\t</div></li>";
-		}
-		$output .= "\n</ul>";
-
-		return $output;
-	}
-
-	/**
-	 * @return Integer: number of images in the gallery
-	 */
-	public function count() {
-		return count( $this->mImages );
-	}
-
-	/**
-	 * Set the contextual title
-	 *
-	 * @param $title Title: contextual title
-	 */
-	public function setContextTitle( $title ) {
-		$this->contextTitle = $title;
-	}
-
-	/**
-	 * Get the contextual title, if applicable
-	 *
-	 * @return mixed Title or false
-	 */
-	public function getContextTitle() {
-		return is_object( $this->contextTitle ) && $this->contextTitle instanceof Title
-			? $this->contextTitle
-			: false;
-	}
-
-	/**
-	 * Determines the correct language to be used for this image gallery
-	 * @return Language object
-	 */
-	private function getLang() {
-		global $wgLang;
-		return $this->mParser
-			? $this->mParser->getTargetLanguage()
-			: $wgLang;
-	}
-
-} //class
diff --git a/includes/ImagePage.php b/includes/ImagePage.php
index b3a485aa..7ea06b0e 100644
--- a/includes/ImagePage.php
+++ b/includes/ImagePage.php
@@ -206,7 +206,7 @@ class ImagePage extends Article {
 		}
 
 		// Add remote Filepage.css
-		if( !$this->repo->isLocal() ) {
+		if ( !$this->repo->isLocal() ) {
 			$css = $this->repo->getDescriptionStylesheetUrl();
 			if ( $css ) {
 				$out->addStyle( $css );
@@ -250,7 +250,7 @@ class ImagePage extends Article {
 	 *
 	 * @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
 	 *
-	 * @param array $metadata the array containing the EXIF data
+	 * @param array $metadata the array containing the Exif data
 	 * @return String The metadata table. This is treated as Wikitext (!)
 	 */
 	protected function makeMetadataTable( $metadata ) {
@@ -311,6 +311,12 @@ class ImagePage extends Article {
 			} else {
 				$params = array( 'page' => $page );
 			}
+
+			$renderLang = $request->getVal( 'lang' );
+			if ( !is_null( $renderLang ) ) {
+				$params['lang'] = $renderLang;
+			}
+
 			$width_orig = $this->displayImg->getWidth( $page );
 			$width = $width_orig;
 			$height_orig = $this->displayImg->getHeight( $page );
@@ -395,6 +401,7 @@ class ImagePage extends Article {
 
 				$isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
 				if ( $isMulti ) {
+					$out->addModules( 'mediawiki.page.image.pagination' );
 					$out->addHTML( '<table class="multipageimage"><tr><td>' );
 				}
 
@@ -444,7 +451,6 @@ class ImagePage extends Article {
 					$formParams = array(
 						'name' => 'pageselector',
 						'action' => $wgScript,
-						'onchange' => 'document.pageselector.submit();',
 					);
 					$options = array();
 					for ( $i = 1; $i <= $count; $i++ ) {
@@ -597,7 +603,7 @@ EOT
 		$descText = $this->mPage->getFile()->getDescriptionText();
 
 		/* Add canonical to head if there is no local page for this shared file */
-		if( $descUrl && $this->mPage->getID() == 0 ) {
+		if ( $descUrl && $this->mPage->getID() == 0 ) {
 			$out->setCanonicalUrl( $descUrl );
 		}
 
@@ -631,7 +637,7 @@ EOT
 	 * external editing (and instructions link) etc.
 	 */
 	protected function uploadLinksBox() {
-		global $wgEnableUploads, $wgUseExternalEditor;
+		global $wgEnableUploads;
 
 		if ( !$wgEnableUploads ) {
 			return;
@@ -654,25 +660,6 @@ EOT
 			$out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">" . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
 		}
 
-		# External editing link
-		if ( $wgUseExternalEditor ) {
-			$elink = Linker::linkKnown(
-				$this->getTitle(),
-				wfMessage( 'edit-externally' )->escaped(),
-				array(),
-				array(
-					'action' => 'edit',
-					'externaledit' => 'true',
-					'mode' => 'file'
-				)
-			);
-			$out->addHTML(
-				'<li id="mw-imagepage-edit-external">' . $elink . ' <small>' .
-					wfMessage( 'edit-externally-help' )->parse() .
-					"</small></li>\n"
-			);
-		}
-
 		$out->addHTML( "</ul>\n" );
 	}
 
@@ -719,7 +706,7 @@ EOT
 		$limit = 100;
 
 		$out = $this->getContext()->getOutput();
-		$res = $this->queryImageLinks( $this->getTitle()->getDbKey(), $limit + 1);
+		$res = $this->queryImageLinks( $this->getTitle()->getDBkey(), $limit + 1 );
 		$rows = array();
 		$redirects = array();
 		foreach ( $res as $row ) {
@@ -772,13 +759,21 @@ EOT
 
 		// Create links for every element
 		$currentCount = 0;
-		foreach( $rows as $element ) {
+		foreach ( $rows as $element ) {
 			$currentCount++;
 			if ( $currentCount > $limit ) {
 				break;
 			}
 
-			$link = Linker::linkKnown( Title::makeTitle( $element->page_namespace, $element->page_title ) );
+			$query = array();
+			# Add a redirect=no to make redirect pages reachable
+			if ( isset( $redirects[$element->page_title] ) ) {
+				$query['redirect'] = 'no';
+			}
+			$link = Linker::linkKnown(
+				Title::makeTitle( $element->page_namespace, $element->page_title ),
+				null, array(), $query
+			);
 			if ( !isset( $redirects[$element->page_title] ) ) {
 				# No redirects
 				$liContents = $link;
diff --git a/includes/ImageQueryPage.php b/includes/ImageQueryPage.php
index f9f6ceed..75f7ba64 100644
--- a/includes/ImageQueryPage.php
+++ b/includes/ImageQueryPage.php
@@ -29,25 +29,25 @@
  * @author Rob Church <robchur@gmail.com>
  */
 abstract class ImageQueryPage extends QueryPage {
-
 	/**
 	 * Format and output report results using the given information plus
 	 * OutputPage
 	 *
-	 * @param $out OutputPage to print to
-	 * @param $skin Skin: user skin to use [unused]
-	 * @param $dbr DatabaseBase (read) connection to use
-	 * @param $res Integer: result pointer
-	 * @param $num Integer: number of available result rows
-	 * @param $offset Integer: paging offset
+	 * @param OutputPage $out OutputPage to print to
+	 * @param Skin $skin User skin to use [unused]
+	 * @param DatabaseBase $dbr (read) connection to use
+	 * @param int $res Result pointer
+	 * @param int $num Number of available result rows
+	 * @param int $offset Paging offset
 	 */
 	protected function outputResults( $out, $skin, $dbr, $res, $num, $offset ) {
-		if( $num > 0 ) {
-			$gallery = new ImageGallery();
+		if ( $num > 0 ) {
+			$gallery = ImageGalleryBase::factory();
+			$gallery->setContext( $this->getContext() );
 
 			# $res might contain the whole 1,000 rows, so we read up to
 			# $num [should update this to use a Pager]
-			for( $i = 0; $i < $num && $row = $dbr->fetchObject( $res ); $i++ ) {
+			for ( $i = 0; $i < $num && $row = $dbr->fetchObject( $res ); $i++ ) {
 				$namespace = isset( $row->namespace ) ? $row->namespace : NS_FILE;
 				$title = Title::makeTitleSafe( $namespace, $row->title );
 				if ( $title instanceof Title && $title->getNamespace() == NS_FILE ) {
@@ -65,11 +65,10 @@ abstract class ImageQueryPage extends QueryPage {
 	/**
 	 * Get additional HTML to be shown in a results' cell
 	 *
-	 * @param $row Object: result row
-	 * @return String
+	 * @param object $row Result row
+	 * @return string
 	 */
 	protected function getCellHtml( $row ) {
 		return '';
 	}
-
 }
diff --git a/includes/Import.php b/includes/Import.php
index bb5d6349..8b7af02a 100644
--- a/includes/Import.php
+++ b/includes/Import.php
@@ -47,7 +47,7 @@ class WikiImporter {
 
 		stream_wrapper_register( 'uploadsource', 'UploadSourceAdapter' );
 		$id = UploadSourceAdapter::registerSource( $source );
-		if (defined( 'LIBXML_PARSEHUGE' ) ) {
+		if ( defined( 'LIBXML_PARSEHUGE' ) ) {
 			$this->reader->open( "uploadsource://$id", null, LIBXML_PARSEHUGE );
 		} else {
 			$this->reader->open( "uploadsource://$id" );
@@ -66,7 +66,7 @@ class WikiImporter {
 	}
 
 	private function debug( $data ) {
-		if( $this->mDebug ) {
+		if ( $this->mDebug ) {
 			wfDebug( "IMPORT: $data\n" );
 		}
 	}
@@ -188,10 +188,10 @@ class WikiImporter {
 	 * @return bool
 	 */
 	public function setTargetNamespace( $namespace ) {
-		if( is_null( $namespace ) ) {
+		if ( is_null( $namespace ) ) {
 			// Don't override namespaces
 			$this->mTargetNamespace = null;
-		} elseif( $namespace >= 0 ) {
+		} elseif ( $namespace >= 0 ) {
 			// @todo FIXME: Check for validity
 			$this->mTargetNamespace = intval( $namespace );
 		} else {
@@ -206,16 +206,16 @@ class WikiImporter {
 	 */
 	public function setTargetRootPage( $rootpage ) {
 		$status = Status::newGood();
-		if( is_null( $rootpage ) ) {
+		if ( is_null( $rootpage ) ) {
 			// No rootpage
 			$this->mTargetRootPage = null;
-		} elseif( $rootpage !== '' ) {
+		} elseif ( $rootpage !== '' ) {
 			$rootpage = rtrim( $rootpage, '/' ); //avoid double slashes
 			$title = Title::newFromText( $rootpage, !is_null( $this->mTargetNamespace ) ? $this->mTargetNamespace : NS_MAIN );
-			if( !$title || $title->isExternal() ) {
+			if ( !$title || $title->isExternal() ) {
 				$status->fatal( 'import-rootpage-invalid' );
 			} else {
-				if( !MWNamespace::hasSubpages( $title->getNamespace() ) ) {
+				if ( !MWNamespace::hasSubpages( $title->getNamespace() ) ) {
 					global $wgContLang;
 
 					$displayNSText = $title->getNamespace() == NS_MAIN
@@ -304,7 +304,7 @@ class WikiImporter {
 	 */
 	public function debugRevisionHandler( &$revision ) {
 		$this->debug( "Got revision:" );
-		if( is_object( $revision->title ) ) {
+		if ( is_object( $revision->title ) ) {
 			$this->debug( "-- Title: " . $revision->title->getPrefixedText() );
 		} else {
 			$this->debug( "-- Title: <invalid>" );
@@ -320,7 +320,7 @@ class WikiImporter {
 	 * @param $title Title
 	 */
 	function pageCallback( $title ) {
-		if( isset( $this->mPageCallback ) ) {
+		if ( isset( $this->mPageCallback ) ) {
 			call_user_func( $this->mPageCallback, $title );
 		}
 	}
@@ -334,7 +334,7 @@ class WikiImporter {
 	 * @param array $pageInfo associative array of page information
 	 */
 	private function pageOutCallback( $title, $origTitle, $revCount, $sucCount, $pageInfo ) {
-		if( isset( $this->mPageOutCallback ) ) {
+		if ( isset( $this->mPageOutCallback ) ) {
 			$args = func_get_args();
 			call_user_func_array( $this->mPageOutCallback, $args );
 		}
@@ -376,12 +376,12 @@ class WikiImporter {
 	 * @access private
 	 */
 	private function nodeContents() {
-		if( $this->reader->isEmptyElement ) {
+		if ( $this->reader->isEmptyElement ) {
 			return "";
 		}
 		$buffer = "";
-		while( $this->reader->read() ) {
-			switch( $this->reader->nodeType ) {
+		while ( $this->reader->read() ) {
+			switch ( $this->reader->nodeType ) {
 			case XmlReader::TEXT:
 			case XmlReader::SIGNIFICANT_WHITESPACE:
 				$buffer .= $this->reader->value;
@@ -420,19 +420,19 @@ class WikiImporter {
 				"END_ELEMENT",
 				"END_ENTITY",
 				"XML_DECLARATION",
-				);
+			);
 			$lookup = array();
 
-			foreach( $xmlReaderConstants as $name ) {
-				$lookup[constant("XmlReader::$name")] = $name;
+			foreach ( $xmlReaderConstants as $name ) {
+				$lookup[constant( "XmlReader::$name" )] = $name;
 			}
 		}
 
-		print( var_dump(
+		print var_dump(
 			$lookup[$this->reader->nodeType],
 			$this->reader->name,
 			$this->reader->value
-		)."\n\n" );
+		) . "\n\n";
 	}
 
 	/**
@@ -450,7 +450,7 @@ class WikiImporter {
 
 		if ( $this->reader->name != 'mediawiki' ) {
 			libxml_disable_entity_loader( $oldDisable );
-			throw new MWException( "Expected <mediawiki> tag, got ".
+			throw new MWException( "Expected <mediawiki> tag, got " .
 				$this->reader->name );
 		}
 		$this->debug( "<mediawiki> tag is correct." );
@@ -463,7 +463,7 @@ class WikiImporter {
 			$tag = $this->reader->name;
 			$type = $this->reader->nodeType;
 
-			if ( !wfRunHooks( 'ImportHandleToplevelXMLTag', $this ) ) {
+			if ( !wfRunHooks( 'ImportHandleToplevelXMLTag', array( $this ) ) ) {
 				// Do nothing
 			} elseif ( $tag == 'mediawiki' && $type == XmlReader::END_ELEMENT ) {
 				break;
@@ -522,8 +522,9 @@ class WikiImporter {
 
 			$tag = $this->reader->name;
 
-			if ( !wfRunHooks( 'ImportHandleLogItemXMLTag',
-						$this, $logInfo ) ) {
+			if ( !wfRunHooks( 'ImportHandleLogItemXMLTag', array(
+				$this, $logInfo
+			) ) ) {
 				// Do nothing
 			} elseif ( in_array( $tag, $normalFields ) ) {
 				$logInfo[$tag] = $this->nodeContents();
@@ -639,8 +640,9 @@ class WikiImporter {
 
 			$tag = $this->reader->name;
 
-			if ( !wfRunHooks( 'ImportHandleRevisionXMLTag', $this,
-						$pageInfo, $revisionInfo ) ) {
+			if ( !wfRunHooks( 'ImportHandleRevisionXMLTag', array(
+				$this, $pageInfo, $revisionInfo
+			) ) ) {
 				// Do nothing
 			} elseif ( in_array( $tag, $normalFields ) ) {
 				$revisionInfo[$tag] = $this->nodeContents();
@@ -666,7 +668,7 @@ class WikiImporter {
 	private function processRevision( $pageInfo, $revisionInfo ) {
 		$revision = new WikiRevision;
 
-		if( isset( $revisionInfo['id'] ) ) {
+		if ( isset( $revisionInfo['id'] ) ) {
 			$revision->setID( $revisionInfo['id'] );
 		}
 		if ( isset( $revisionInfo['text'] ) ) {
@@ -725,8 +727,9 @@ class WikiImporter {
 
 			$tag = $this->reader->name;
 
-			if ( !wfRunHooks( 'ImportHandleUploadXMLTag', $this,
-						$pageInfo ) ) {
+			if ( !wfRunHooks( 'ImportHandleUploadXMLTag', array(
+				$this, $pageInfo
+			) ) ) {
 				// Do nothing
 			} elseif ( in_array( $tag, $normalFields ) ) {
 				$uploadInfo[$tag] = $this->nodeContents();
@@ -840,33 +843,33 @@ class WikiImporter {
 		$workTitle = $text;
 		$origTitle = Title::newFromText( $workTitle );
 
-		if( !is_null( $this->mTargetNamespace ) && !is_null( $origTitle ) ) {
+		if ( !is_null( $this->mTargetNamespace ) && !is_null( $origTitle ) ) {
 			# makeTitleSafe, because $origTitle can have a interwiki (different setting of interwiki map)
 			# and than dbKey can begin with a lowercase char
 			$title = Title::makeTitleSafe( $this->mTargetNamespace,
 				$origTitle->getDBkey() );
 		} else {
-			if( !is_null( $this->mTargetRootPage ) ) {
+			if ( !is_null( $this->mTargetRootPage ) ) {
 				$workTitle = $this->mTargetRootPage . '/' . $workTitle;
 			}
 			$title = Title::newFromText( $workTitle );
 		}
 
-		if( is_null( $title ) ) {
+		if ( is_null( $title ) ) {
 			# Invalid page title? Ignore the page
 			$this->notice( 'import-error-invalid', $workTitle );
 			return false;
-		} elseif( $title->isExternal() ) {
+		} elseif ( $title->isExternal() ) {
 			$this->notice( 'import-error-interwiki', $title->getPrefixedText() );
 			return false;
-		} elseif( !$title->canExist() ) {
+		} elseif ( !$title->canExist() ) {
 			$this->notice( 'import-error-special', $title->getPrefixedText() );
 			return false;
-		} elseif( !$title->userCan( 'edit' ) && !$wgCommandLineMode ) {
+		} elseif ( !$title->userCan( 'edit' ) && !$wgCommandLineMode ) {
 			# Do not import if the importing wiki user cannot edit this page
 			$this->notice( 'import-error-edit', $title->getPrefixedText() );
 			return false;
-		} elseif( !$title->exists() && !$title->userCan( 'create' ) && !$wgCommandLineMode ) {
+		} elseif ( !$title->exists() && !$title->userCan( 'create' ) && !$wgCommandLineMode ) {
 			# Do not import if the importing wiki user cannot create this page
 			$this->notice( 'import-error-create', $title->getPrefixedText() );
 			return false;
@@ -997,12 +1000,12 @@ class XMLReader2 extends XMLReader {
 	 * @return bool|string
 	 */
 	function nodeContents() {
-		if( $this->isEmptyElement ) {
+		if ( $this->isEmptyElement ) {
 			return "";
 		}
 		$buffer = "";
-		while( $this->read() ) {
-			switch( $this->nodeType ) {
+		while ( $this->read() ) {
+			switch ( $this->nodeType ) {
 			case XmlReader::TEXT:
 			case XmlReader::SIGNIFICANT_WHITESPACE:
 				$buffer .= $this->value;
@@ -1051,9 +1054,9 @@ class WikiRevision {
 	 * @throws MWException
 	 */
 	function setTitle( $title ) {
-		if( is_object( $title ) ) {
+		if ( is_object( $title ) ) {
 			$this->title = $title;
-		} elseif( is_null( $title ) ) {
+		} elseif ( is_null( $title ) ) {
 			throw new MWException( "WikiRevision given a null title in import. You may need to adjust \$wgLegalTitleChars." );
 		} else {
 			throw new MWException( "WikiRevision given non-object title in import." );
@@ -1369,7 +1372,7 @@ class WikiRevision {
 
 		# Sneak a single revision into place
 		$user = User::newFromName( $this->getUser() );
-		if( $user ) {
+		if ( $user ) {
 			$userId = intval( $user->getId() );
 			$userText = $user->getName();
 			$userObj = $user;
@@ -1384,7 +1387,7 @@ class WikiRevision {
 		$linkCache->clear();
 
 		$page = WikiPage::factory( $this->title );
-		if( !$page->exists() ) {
+		if ( !$page->exists() ) {
 			# must create the page...
 			$pageId = $page->insertOn( $dbw );
 			$created = true;
@@ -1400,7 +1403,7 @@ class WikiRevision {
 					'rev_comment' => $this->getComment() ),
 				__METHOD__
 			);
-			if( $prior ) {
+			if ( $prior ) {
 				// @todo FIXME: This could fail slightly for multiple matches :P
 				wfDebug( __METHOD__ . ": skipping existing revision for [[" .
 					$this->title->getPrefixedText() . "]], timestamp " . $this->timestamp . "\n" );
@@ -1440,7 +1443,7 @@ class WikiRevision {
 	function importLogItem() {
 		$dbw = wfGetDB( DB_MASTER );
 		# @todo FIXME: This will not record autoblocks
-		if( !$this->getTitle() ) {
+		if ( !$this->getTitle() ) {
 			wfDebug( __METHOD__ . ": skipping invalid {$this->type}/{$this->action} log time, timestamp " .
 				$this->timestamp . "\n" );
 			return;
@@ -1459,7 +1462,7 @@ class WikiRevision {
 			__METHOD__
 		);
 		// @todo FIXME: This could fail slightly for multiple matches :P
-		if( $prior ) {
+		if ( $prior ) {
 			wfDebug( __METHOD__ . ": skipping existing item for Log:{$this->type}/{$this->action}, timestamp " .
 				$this->timestamp . "\n" );
 			return;
@@ -1500,7 +1503,7 @@ class WikiRevision {
 				wfDebug( __METHOD__ . "File already exists; importing as $archiveName\n" );
 			}
 		}
-		if( !$file ) {
+		if ( !$file ) {
 			wfDebug( __METHOD__ . ': Bad file for ' . $this->getTitle() . "\n" );
 			return false;
 		}
@@ -1512,7 +1515,7 @@ class WikiRevision {
 			$source = $this->downloadSource();
 			$flags |= File::DELETE_SOURCE;
 		}
-		if( !$source ) {
+		if ( !$source ) {
 			wfDebug( __METHOD__ . ": Could not fetch remote file.\n" );
 			return false;
 		}
@@ -1551,13 +1554,13 @@ class WikiRevision {
 	 */
 	function downloadSource() {
 		global $wgEnableUploads;
-		if( !$wgEnableUploads ) {
+		if ( !$wgEnableUploads ) {
 			return false;
 		}
 
 		$tempo = tempnam( wfTempDir(), 'download' );
 		$f = fopen( $tempo, 'wb' );
-		if( !$f ) {
+		if ( !$f ) {
 			wfDebug( "IMPORT: couldn't write to temp file $tempo\n" );
 			return false;
 		}
@@ -1565,7 +1568,7 @@ class WikiRevision {
 		// @todo FIXME!
 		$src = $this->getSrc();
 		$data = Http::get( $src );
-		if( !$data ) {
+		if ( !$data ) {
 			wfDebug( "IMPORT: couldn't fetch source $src\n" );
 			fclose( $f );
 			unlink( $tempo );
@@ -1601,7 +1604,7 @@ class ImportStringSource {
 	 * @return bool|string
 	 */
 	function readChunk() {
-		if( $this->atEnd() ) {
+		if ( $this->atEnd() ) {
 			return false;
 		}
 		$this->mRead = true;
@@ -1640,7 +1643,7 @@ class ImportStreamSource {
 		wfSuppressWarnings();
 		$file = fopen( $filename, 'rt' );
 		wfRestoreWarnings();
-		if( !$file ) {
+		if ( !$file ) {
 			return Status::newFatal( "importcantopen" );
 		}
 		return Status::newGood( new ImportStreamSource( $file ) );
@@ -1653,11 +1656,11 @@ class ImportStreamSource {
 	static function newFromUpload( $fieldname = "xmlimport" ) {
 		$upload =& $_FILES[$fieldname];
 
-		if( $upload === null || !$upload['name'] ) {
+		if ( $upload === null || !$upload['name'] ) {
 			return Status::newFatal( 'importnofile' );
 		}
-		if( !empty( $upload['error'] ) ) {
-			switch( $upload['error'] ) {
+		if ( !empty( $upload['error'] ) ) {
+			switch ( $upload['error'] ) {
 				case 1: # The uploaded file exceeds the upload_max_filesize directive in php.ini.
 					return Status::newFatal( 'importuploaderrorsize' );
 				case 2: # The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.
@@ -1671,7 +1674,7 @@ class ImportStreamSource {
 
 		}
 		$fname = $upload['tmp_name'];
-		if( is_uploaded_file( $fname ) ) {
+		if ( is_uploaded_file( $fname ) ) {
 			return ImportStreamSource::newFromFile( $fname );
 		} else {
 			return Status::newFatal( 'importnofile' );
@@ -1690,7 +1693,7 @@ class ImportStreamSource {
 		# otherwise prevent importing from large sites, such
 		# as the Wikimedia cluster, etc.
 		$data = Http::request( $method, $url, array( 'followRedirects' => true ) );
-		if( $data !== false ) {
+		if ( $data !== false ) {
 			$file = tmpfile();
 			fwrite( $file, $data );
 			fflush( $file );
@@ -1710,18 +1713,24 @@ class ImportStreamSource {
 	 * @return Status
 	 */
 	public static function newFromInterwiki( $interwiki, $page, $history = false, $templates = false, $pageLinkDepth = 0 ) {
-		if( $page == '' ) {
+		if ( $page == '' ) {
 			return Status::newFatal( 'import-noarticle' );
 		}
 		$link = Title::newFromText( "$interwiki:Special:Export/$page" );
-		if( is_null( $link ) || $link->getInterwiki() == '' ) {
+		if ( is_null( $link ) || $link->getInterwiki() == '' ) {
 			return Status::newFatal( 'importbadinterwiki' );
 		} else {
 			$params = array();
-			if ( $history ) $params['history'] = 1;
-			if ( $templates ) $params['templates'] = 1;
-			if ( $pageLinkDepth ) $params['pagelink-depth'] = $pageLinkDepth;
-			$url = $link->getFullUrl( $params );
+			if ( $history ) {
+				$params['history'] = 1;
+			}
+			if ( $templates ) {
+				$params['templates'] = 1;
+			}
+			if ( $pageLinkDepth ) {
+				$params['pagelink-depth'] = $pageLinkDepth;
+			}
+			$url = $link->getFullURL( $params );
 			# For interwikis, use POST to avoid redirects.
 			return ImportStreamSource::newFromURL( $url, "POST" );
 		}
diff --git a/includes/Init.php b/includes/Init.php
index 66f9544d..64431f09 100644
--- a/includes/Init.php
+++ b/includes/Init.php
@@ -2,6 +2,9 @@
 /**
  * Some functions that are useful during startup.
  *
+ * This class previously contained some functionality related to a PHP compiler
+ * called hphpc. That compiler has now been discontinued.
+ *
  * 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 2 of the License, or
@@ -22,40 +25,35 @@
 
 /**
  * Some functions that are useful during startup.
+ *
+ * This class previously contained some functionality related to a PHP compiler
+ * called hphpc. That compiler has now been discontinued. All methods are now
+ * deprecated.
  */
 class MWInit {
 	static $compilerVersion;
 
 	/**
-	 * Get the version of HipHop used to compile, or false if MediaWiki was not
-	 * compiled. This works by having our build script insert a special function
-	 * into the compiled code.
+	 * @deprecated since 1.22
 	 */
 	static function getCompilerVersion() {
-		if ( self::$compilerVersion === null ) {
-			if ( self::functionExists( 'wfHipHopCompilerVersion' ) ) {
-				self::$compilerVersion = wfHipHopCompilerVersion();
-			} else {
-				self::$compilerVersion = false;
-			}
-		}
-		return self::$compilerVersion;
+		return false;
 	}
 
 	/**
 	 * Returns true if we are running under HipHop, whether in compiled or
 	 * interpreted mode.
 	 *
+	 * @deprecated since 1.22
 	 * @return bool
 	 */
 	static function isHipHop() {
-		return function_exists( 'hphp_thread_set_warmup_enabled' );
+		return defined( 'HPHP_VERSION' );
 	}
 
 	/**
-	 * Get a fully-qualified path for a source file relative to $IP. Including
-	 * such a path under HipHop will force the file to be interpreted. This is
-	 * useful for configuration files.
+	 * Get a fully-qualified path for a source file relative to $IP.
+	 * @deprecated since 1.22
 	 *
 	 * @param $file string
 	 *
@@ -67,117 +65,39 @@ class MWInit {
 	}
 
 	/**
-	 * If we are running code compiled by HipHop, this will pass through the
-	 * input path, assumed to be relative to $IP. If the code is interpreted,
-	 * it will converted to a fully qualified path. It is necessary to use a
-	 * path which is relative to $IP in order to make HipHop use its compiled
-	 * code.
-	 *
+	 * @deprecated since 1.22
 	 * @param $file string
-	 *
 	 * @return string
 	 */
 	static function compiledPath( $file ) {
 		global $IP;
-
-		if ( defined( 'MW_COMPILED' ) ) {
-			return "phase3/$file";
-		} else {
-			return "$IP/$file";
-		}
-	}
-
-	/**
-	 * The equivalent of MWInit::interpretedPath() but for files relative to the
-	 * extensions directory.
-	 *
-	 * @param $file string
-	 * @return string
-	 */
-	static function extInterpretedPath( $file ) {
-		return self::getExtensionsDirectory() . '/' . $file;
+		return "$IP/$file";
 	}
 
 	/**
-	 * The equivalent of MWInit::compiledPath() but for files relative to the
-	 * extensions directory. Any files referenced in this way must be registered
-	 * for compilation by including them in $wgCompiledFiles.
+	 * @deprecated since 1.22
 	 * @param $file string
 	 * @return string
 	 */
 	static function extCompiledPath( $file ) {
-		if ( defined( 'MW_COMPILED' ) ) {
-			return "extensions/$file";
-		} else {
-			return self::getExtensionsDirectory() . '/' . $file;
-		}
+		return false;
 	}
 
 	/**
-	 * Register an extension setup file and return its path for compiled
-	 * inclusion. Use this function in LocalSettings.php to add extensions
-	 * to the build. For example:
-	 *
-	 *    require( MWInit::extSetupPath( 'ParserFunctions/ParserFunctions.php' ) );
-	 *
-	 * @param string $extRel The path relative to the extensions directory, as defined by
-	 *   $wgExtensionsDirectory.
-	 *
-	 * @return string
-	 */
-	static function extSetupPath( $extRel ) {
-		$baseRel = "extensions/$extRel";
-		if ( defined( 'MW_COMPILED' ) ) {
-			return $baseRel;
-		} else {
-			global $wgCompiledFiles;
-			$wgCompiledFiles[] = $baseRel;
-			return self::getExtensionsDirectory() . '/' . $extRel;
-		}
-	}
-
-	/**
-	 * @return bool|string
-	 */
-	static function getExtensionsDirectory() {
-		global $wgExtensionsDirectory, $IP;
-		if ( $wgExtensionsDirectory === false ) {
-			$wgExtensionsDirectory = "$IP/../extensions";
-		}
-		return $wgExtensionsDirectory;
-	}
-
-	/**
-	 * Determine whether a class exists, using a method which works under HipHop.
-	 *
-	 * Note that it's not possible to implement this with any variant of
-	 * class_exists(), because class_exists() returns false for classes which
-	 * are compiled in.
-	 *
-	 * Calling class_exists() on a literal string causes the class to be made
-	 * "volatile", which means (as of March 2011) that the class is broken and
-	 * can't be used at all. So don't do that. See
-	 * https://github.com/facebook/hiphop-php/issues/314
+	 * Deprecated wrapper for class_exists()
+	 * @deprecated since 1.22
 	 *
 	 * @param $class string
 	 *
 	 * @return bool
 	 */
 	static function classExists( $class ) {
-		try {
-			$r = new ReflectionClass( $class );
-		} catch( ReflectionException $r ) {
-			$r = false;
-		}
-		return $r !== false;
+		return class_exists( $class );
 	}
 
 	/**
-	 * Determine whether a method exists within a class, using a method which works
-	 * under HipHop.
-	 *
-	 * Note that under HipHop when method_exists is given a string for it's class
-	 * such as to test for a static method has the same issues as class_exists does.
+	 * Deprecated wrapper for method_exists()
+	 * @deprecated since 1.22
 	 *
 	 * @param $class string
 	 * @param $method string
@@ -185,34 +105,25 @@ class MWInit {
 	 * @return bool
 	 */
 	static function methodExists( $class, $method ) {
-		try {
-			$r = new ReflectionMethod( $class, $method );
-		} catch( ReflectionException $r ) {
-			$r = false;
-		}
-		return $r !== false;
+		return method_exists( $class, $method );
 	}
 
 	/**
-	 * Determine whether a function exists, using a method which works under
-	 * HipHop.
+	 * Deprecated wrapper for function_exists()
+	 * @deprecated since 1.22
 	 *
 	 * @param $function string
 	 *
 	 * @return bool
 	 */
 	static function functionExists( $function ) {
-		try {
-			$r = new ReflectionFunction( $function );
-		} catch( ReflectionException $r ) {
-			$r = false;
-		}
-		return $r !== false;
+		return function_exists( $function );
 	}
 
 	/**
-	 * Call a static method of a class with variable arguments without causing
-	 * it to become volatile.
+	 * Deprecated wrapper for call_user_func_array()
+	 * @deprecated since 1.22
+	 *
 	 * @param $className string
 	 * @param $methodName string
 	 * @param $args array
@@ -220,7 +131,6 @@ class MWInit {
 	 * @return mixed
 	 */
 	static function callStaticMethod( $className, $methodName, $args ) {
-		$r = new ReflectionMethod( $className, $methodName );
-		return $r->invokeArgs( null, $args );
+		return call_user_func_array( array( $className, $methodName ), $args );
 	}
 }
diff --git a/includes/Licenses.php b/includes/Licenses.php
index e8aee0b5..6c582aaf 100644
--- a/includes/Licenses.php
+++ b/includes/Licenses.php
@@ -105,7 +105,7 @@ class Licenses extends HTMLFormField {
 	protected function stackItem( &$list, $path, $item ) {
 		$position =& $list;
 		if ( $path ) {
-			foreach( $path as $key ) {
+			foreach ( $path as $key ) {
 				$position =& $position[$key];
 			}
 		}
diff --git a/includes/LinkFilter.php b/includes/LinkFilter.php
index 11b65595..d552c696 100644
--- a/includes/LinkFilter.php
+++ b/includes/LinkFilter.php
@@ -152,11 +152,11 @@ class LinkFilter {
 	 * @return array filtered array
 	 */
 	public static function keepOneWildcard( $arr ) {
-		if( !is_array( $arr ) ) {
+		if ( !is_array( $arr ) ) {
 			return $arr;
 		}
 
-		foreach( $arr as $key => $value ) {
+		foreach ( $arr as $key => $value ) {
 			if ( $value instanceof LikeMatch ) {
 				return array_slice( $arr, 0, $key + 1 );
 			}
diff --git a/includes/Linker.php b/includes/Linker.php
index 972adfce..23ece751 100644
--- a/includes/Linker.php
+++ b/includes/Linker.php
@@ -199,7 +199,7 @@ class Linker {
 			return "<!-- ERROR -->$html";
 		}
 
-		if( is_string( $query ) ) {
+		if ( is_string( $query ) ) {
 			// some functions withing core using this still hand over query strings
 			wfDeprecated( __METHOD__ . ' with parameter $query as string (should be array)', '1.20' );
 			$query = wfCgiToArray( $query );
@@ -238,7 +238,7 @@ class Linker {
 		# Note: we want the href attribute first, for prettiness.
 		$attribs = array( 'href' => self::linkUrl( $target, $query, $options ) );
 		if ( in_array( 'forcearticlepath', $options ) && $oldquery ) {
-			$attribs['href'] = wfAppendQuery( $attribs['href'], wfArrayToCgi( $oldquery ) );
+			$attribs['href'] = wfAppendQuery( $attribs['href'], $oldquery );
 		}
 
 		$attribs = array_merge(
@@ -612,7 +612,7 @@ class Linker {
 				$hp['width'] = $file->getWidth( $page );
 			}
 
-			if ( isset( $fp['thumbnail'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) {
+			if ( isset( $fp['thumbnail'] ) || isset( $fp['manualthumb'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) {
 				global $wgThumbLimits, $wgThumbUpright;
 				if ( $widthOption === null || !isset( $wgThumbLimits[$widthOption] ) ) {
 					$widthOption = User::getDefaultOption( 'thumbsize' );
@@ -644,7 +644,7 @@ class Linker {
 			# If a thumbnail width has not been provided, it is set
 			# to the default user option as specified in Language*.php
 			if ( $fp['align'] == '' ) {
-				if( $parser instanceof Parser ) {
+				if ( $parser instanceof Parser ) {
 					$fp['align'] = $parser->getTargetLanguage()->alignEnd();
 				} else {
 					# backwards compatibility, remove with makeImageLink2()
@@ -786,10 +786,18 @@ class Linker {
 		$hp =& $handlerParams;
 
 		$page = isset( $hp['page'] ) ? $hp['page'] : false;
-		if ( !isset( $fp['align'] ) ) $fp['align'] = 'right';
-		if ( !isset( $fp['alt'] ) ) $fp['alt'] = '';
-		if ( !isset( $fp['title'] ) ) $fp['title'] = '';
-		if ( !isset( $fp['caption'] ) ) $fp['caption'] = '';
+		if ( !isset( $fp['align'] ) ) {
+			$fp['align'] = 'right';
+		}
+		if ( !isset( $fp['alt'] ) ) {
+			$fp['alt'] = '';
+		}
+		if ( !isset( $fp['title'] ) ) {
+			$fp['title'] = '';
+		}
+		if ( !isset( $fp['caption'] ) ) {
+			$fp['caption'] = '';
+		}
 
 		if ( empty( $hp['width'] ) ) {
 			// Reduce width for upright images when parameter 'upright' is used
@@ -797,6 +805,7 @@ class Linker {
 		}
 		$thumb = false;
 		$noscale = false;
+		$manualthumb = false;
 
 		if ( !$exists ) {
 			$outerWidth = $hp['width'] + 2;
@@ -808,6 +817,7 @@ class Linker {
 					$manual_img = wfFindFile( $manual_title );
 					if ( $manual_img ) {
 						$thumb = $manual_img->getUnscaledThumb( $hp );
+						$manualthumb = true;
 					} else {
 						$exists = false;
 					}
@@ -838,7 +848,13 @@ class Linker {
 		# zoom icon still needs it, so we make a unique query for it. See bug 14771
 		$url = $title->getLocalURL( $query );
 		if ( $page ) {
-			$url = wfAppendQuery( $url, 'page=' . urlencode( $page ) );
+			$url = wfAppendQuery( $url, array( 'page' => $page ) );
+		}
+		if ( $manualthumb &&
+		     !isset( $fp['link-title'] ) &&
+		     !isset( $fp['link-url'] ) &&
+		     !isset( $fp['no-link'] ) ) {
+			$fp['link-url'] = $url;
 		}
 
 		$s = "<div class=\"thumb t{$fp['align']}\"><div class=\"thumbinner\" style=\"width:{$outerWidth}px;\">";
@@ -849,7 +865,7 @@ class Linker {
 			$s .= wfMessage( 'thumbnail_error', '' )->escaped();
 			$zoomIcon = '';
 		} else {
-			if ( !$noscale ) {
+			if ( !$noscale && !$manualthumb ) {
 				self::processResponsiveImages( $file, $thumb, $hp );
 			}
 			$params = array(
@@ -961,17 +977,18 @@ class Linker {
 	 */
 	protected static function getUploadUrl( $destFile, $query = '' ) {
 		global $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
-		$q = 'wpDestFile=' . $destFile->getPartialUrl();
-		if ( $query != '' )
+		$q = 'wpDestFile=' . $destFile->getPartialURL();
+		if ( $query != '' ) {
 			$q .= '&' . $query;
+		}
 
 		if ( $wgUploadMissingFileUrl ) {
 			return wfAppendQuery( $wgUploadMissingFileUrl, $q );
-		} elseif( $wgUploadNavigationUrl ) {
+		} elseif ( $wgUploadNavigationUrl ) {
 			return wfAppendQuery( $wgUploadNavigationUrl, $q );
 		} else {
 			$upload = SpecialPage::getTitleFor( 'Upload' );
-			return $upload->getLocalUrl( $q );
+			return $upload->getLocalURL( $q );
 		}
 	}
 
@@ -1442,8 +1459,9 @@ class Linker {
 				$trail = "";
 			}
 			$linkRegexp = '/\[\[(.*?)\]\]' . preg_quote( $trail, '/' ) . '/';
-			if ( isset( $match[1][0] ) && $match[1][0] == ':' )
+			if ( isset( $match[1][0] ) && $match[1][0] == ':' ) {
 				$match[1] = substr( $match[1], 1 );
+			}
 			list( $inside, $trail ) = self::splitTrail( $trail );
 
 			$linkText = $text;
@@ -1527,7 +1545,7 @@ class Linker {
 					$nodotdot = substr( $nodotdot, 3 );
 				}
 				if ( $dotdotcount > 0 ) {
-					$exploded = explode( '/', $contextTitle->GetPrefixedText() );
+					$exploded = explode( '/', $contextTitle->getPrefixedText() );
 					if ( count( $exploded ) > $dotdotcount ) { # not allowed to go below top level page
 						$ret = implode( '/', array_slice( $exploded, 0, -$dotdotcount ) );
 						# / at the end means don't show full path
@@ -1670,10 +1688,10 @@ class Linker {
 		$lang = wfGetLangObj( $lang );
 		$title = wfMessage( 'toc' )->inLanguage( $lang )->escaped();
 
-		return '<table id="toc" class="toc"><tr><td>'
+		return '<div id="toc" class="toc">'
 			. '<div id="toctitle"><h2>' . $title . "</h2></div>\n"
 			. $toc
-			. "</ul>\n</td></tr></table>\n";
+			. "</ul>\n</div>\n";
 	}
 
 	/**
@@ -1687,13 +1705,14 @@ class Linker {
 		$toc = '';
 		$lastLevel = 0;
 		foreach ( $tree as $section ) {
-			if ( $section['toclevel'] > $lastLevel )
+			if ( $section['toclevel'] > $lastLevel ) {
 				$toc .= self::tocIndent();
-			elseif ( $section['toclevel'] < $lastLevel )
+			} elseif ( $section['toclevel'] < $lastLevel ) {
 				$toc .= self::tocUnindent(
 					$lastLevel - $section['toclevel'] );
-			else
+			} else {
 				$toc .= self::tocLineEnd();
+			}
 
 			$toc .= self::tocLine( $section['anchor'],
 				$section['line'], $section['number'],
@@ -1721,8 +1740,8 @@ class Linker {
 	 */
 	public static function makeHeadline( $level, $attribs, $anchor, $html, $link, $legacyAnchor = false ) {
 		$ret = "<h$level$attribs"
+			. "<span class=\"mw-headline\" id=\"$anchor\">$html</span>"
 			. $link
-			. " <span class=\"mw-headline\" id=\"$anchor\">$html</span>"
 			. "</h$level>";
 		if ( $legacyAnchor !== false ) {
 			$ret = "<div id=\"$legacyAnchor\"></div>$ret";
@@ -1887,21 +1906,21 @@ class Linker {
 		}
 
 		$disableRollbackEditCount = false;
-		if( $wgMiserMode ) {
-			foreach( $disableRollbackEditCountSpecialPage as $specialPage ) {
-				if( $context->getTitle()->isSpecial( $specialPage ) ) {
+		if ( $wgMiserMode ) {
+			foreach ( $disableRollbackEditCountSpecialPage as $specialPage ) {
+				if ( $context->getTitle()->isSpecial( $specialPage ) ) {
 					$disableRollbackEditCount = true;
 					break;
 				}
 			}
 		}
 
-		if( !$disableRollbackEditCount && is_int( $wgShowRollbackEditCount ) && $wgShowRollbackEditCount > 0 ) {
+		if ( !$disableRollbackEditCount && is_int( $wgShowRollbackEditCount ) && $wgShowRollbackEditCount > 0 ) {
 			if ( !is_numeric( $editCount ) ) {
 				$editCount = self::getRollbackEditCount( $rev, false );
 			}
 
-			if( $editCount > $wgShowRollbackEditCount ) {
+			if ( $editCount > $wgShowRollbackEditCount ) {
 				$editCount_output = $context->msg( 'rollbacklinkcount-morethan' )->numParams( $wgShowRollbackEditCount )->parse();
 			} else {
 				$editCount_output = $context->msg( 'rollbacklinkcount' )->numParams( $editCount )->parse();
@@ -1941,6 +1960,7 @@ class Linker {
 	 * @return String: HTML output
 	 */
 	public static function formatTemplates( $templates, $preview = false, $section = false, $more = null ) {
+		global $wgLang;
 		wfProfileIn( __METHOD__ );
 
 		$outText = '';
@@ -1968,13 +1988,28 @@ class Linker {
 
 			usort( $templates, 'Title::compare' );
 			foreach ( $templates as $titleObj ) {
-				$r = $titleObj->getRestrictions( 'edit' );
-				if ( in_array( 'sysop', $r ) ) {
-					$protected = wfMessage( 'template-protected' )->parse();
-				} elseif ( in_array( 'autoconfirmed', $r ) ) {
-					$protected = wfMessage( 'template-semiprotected' )->parse();
-				} else {
-					$protected = '';
+				$protected = '';
+				$restrictions = $titleObj->getRestrictions( 'edit' );
+				if ( $restrictions ) {
+					// Check backwards-compatible messages
+					$msg = null;
+					if ( $restrictions === array( 'sysop' ) ) {
+						$msg = wfMessage( 'template-protected' );
+					} elseif ( $restrictions === array( 'autoconfirmed' ) ) {
+						$msg = wfMessage( 'template-semiprotected' );
+					}
+					if ( $msg && !$msg->isDisabled() ) {
+						$protected = $msg->parse();
+					} else {
+						// Construct the message from restriction-level-*
+						// e.g. restriction-level-sysop, restriction-level-autoconfirmed
+						$msgs = array();
+						foreach ( $restrictions as $r ) {
+							$msgs[] = wfMessage( "restriction-level-$r" )->parse();
+						}
+						$protected = wfMessage( 'parentheses' )
+							->rawParams( $wgLang->commaList( $msgs ) )->escaped();
+					}
 				}
 				if ( $titleObj->quickUserCan( 'edit' ) ) {
 					$editLink = self::link(
diff --git a/includes/LinksUpdate.php b/includes/LinksUpdate.php
index d99ae22d..fdd0e3c1 100644
--- a/includes/LinksUpdate.php
+++ b/includes/LinksUpdate.php
@@ -27,7 +27,7 @@
  */
 class LinksUpdate extends SqlDataUpdate {
 
-	// @todo: make members protected, but make sure extensions don't break
+	// @todo make members protected, but make sure extensions don't break
 
 	public $mId,         //!< Page ID of the article linked from
 		$mTitle,         //!< Title object of the article linked from
@@ -43,6 +43,16 @@ class LinksUpdate extends SqlDataUpdate {
 		$mOptions,       //!< SELECT options to be used (array)
 		$mRecursive;     //!< Whether to queue jobs for recursive updates
 
+	/**
+	 * @var null|array Added links if calculated.
+	 */
+	private $linkInsertions = null;
+
+	/**
+	 * @var null|array Deleted links if calculated.
+	 */
+	private $linkDeletions = null;
+
 	/**
 	 * Constructor
 	 *
@@ -112,14 +122,8 @@ class LinksUpdate extends SqlDataUpdate {
 	 * Update link tables with outgoing links from an updated article
 	 */
 	public function doUpdate() {
-		global $wgUseDumbLinkUpdate;
-
 		wfRunHooks( 'LinksUpdate', array( &$this ) );
-		if ( $wgUseDumbLinkUpdate ) {
-			$this->doDumbUpdate();
-		} else {
-			$this->doIncrementalUpdate();
-		}
+		$this->doIncrementalUpdate();
 		wfRunHooks( 'LinksUpdateComplete', array( &$this ) );
 	}
 
@@ -128,8 +132,9 @@ class LinksUpdate extends SqlDataUpdate {
 
 		# Page links
 		$existing = $this->getExistingLinks();
-		$this->incrTableUpdate( 'pagelinks', 'pl', $this->getLinkDeletions( $existing ),
-			$this->getLinkInsertions( $existing ) );
+		$this->linkDeletions = $this->getLinkDeletions( $existing );
+		$this->linkInsertions = $this->getLinkInsertions( $existing );
+		$this->incrTableUpdate( 'pagelinks', 'pl', $this->linkDeletions, $this->linkInsertions );
 
 		# Image links
 		$existing = $this->getExistingImages();
@@ -198,61 +203,35 @@ class LinksUpdate extends SqlDataUpdate {
 	}
 
 	/**
-	 * Link update which clears the previous entries and inserts new ones
-	 * May be slower or faster depending on level of lock contention and write speed of DB
-	 * Also useful where link table corruption needs to be repaired, e.g. in refreshLinks.php
+	 * Queue recursive jobs for this page
+	 *
+	 * Which means do LinksUpdate on all templates
+	 * that include the current page, using the job queue.
 	 */
-	protected function doDumbUpdate() {
-		wfProfileIn( __METHOD__ );
-
-		# Refresh category pages and image description pages
-		$existing = $this->getExistingCategories();
-		$categoryInserts = array_diff_assoc( $this->mCategories, $existing );
-		$categoryDeletes = array_diff_assoc( $existing, $this->mCategories );
-		$categoryUpdates = $categoryInserts + $categoryDeletes;
-		$existing = $this->getExistingImages();
-		$imageUpdates = array_diff_key( $existing, $this->mImages ) + array_diff_key( $this->mImages, $existing );
-
-		$this->dumbTableUpdate( 'pagelinks', $this->getLinkInsertions(), 'pl_from' );
-		$this->dumbTableUpdate( 'imagelinks', $this->getImageInsertions(), 'il_from' );
-		$this->dumbTableUpdate( 'categorylinks', $this->getCategoryInsertions(), 'cl_from' );
-		$this->dumbTableUpdate( 'templatelinks', $this->getTemplateInsertions(), 'tl_from' );
-		$this->dumbTableUpdate( 'externallinks', $this->getExternalInsertions(), 'el_from' );
-		$this->dumbTableUpdate( 'langlinks', $this->getInterlangInsertions(), 'll_from' );
-		$this->dumbTableUpdate( 'iwlinks', $this->getInterwikiInsertions(), 'iwl_from' );
-		$this->dumbTableUpdate( 'page_props', $this->getPropertyInsertions(), 'pp_page' );
-
-		# Update the cache of all the category pages and image description
-		# pages which were changed, and fix the category table count
-		$this->invalidateCategories( $categoryUpdates );
-		$this->updateCategoryCounts( $categoryInserts, $categoryDeletes );
-		$this->invalidateImageDescriptions( $imageUpdates );
-
-		# Refresh links of all pages including this page
-		# This will be in a separate transaction
-		if ( $this->mRecursive ) {
-			$this->queueRecursiveJobs();
-		}
-
-		wfProfileOut( __METHOD__ );
+	function queueRecursiveJobs() {
+		self::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
 	}
 
-	function queueRecursiveJobs() {
+	/**
+	 * Queue a RefreshLinks job for any table.
+	 *
+	 * @param Title $title Title to do job for
+	 * @param String $table Table to use (e.g. 'templatelinks')
+	 */
+	public static function queueRecursiveJobsForTable( Title $title, $table ) {
 		wfProfileIn( __METHOD__ );
-
-		if ( $this->mTitle->getBacklinkCache()->hasLinks( 'templatelinks' ) ) {
+		if ( $title->getBacklinkCache()->hasLinks( $table ) ) {
 			$job = new RefreshLinksJob2(
-				$this->mTitle,
+				$title,
 				array(
-					'table' => 'templatelinks',
+					'table' => $table,
 				) + Job::newRootJobParams( // "overall" refresh links job info
-					"refreshlinks:templatelinks:{$this->mTitle->getPrefixedText()}"
+					"refreshlinks:{$table}:{$title->getPrefixedText()}"
 				)
 			);
 			JobQueueGroup::singleton()->push( $job );
 			JobQueueGroup::singleton()->deduplicateRootJob( $job );
 		}
-
 		wfProfileOut( __METHOD__ );
 	}
 
@@ -282,21 +261,6 @@ class LinksUpdate extends SqlDataUpdate {
 		$this->invalidatePages( NS_FILE, array_keys( $images ) );
 	}
 
-	/**
-	 * @param $table
-	 * @param $insertions
-	 * @param $fromField
-	 */
-	private function dumbTableUpdate( $table, $insertions, $fromField ) {
-		$this->mDb->delete( $table, array( $fromField => $this->mId ), __METHOD__ );
-		if ( count( $insertions ) ) {
-			# The link array was constructed without FOR UPDATE, so there may
-			# be collisions. This may cause minor link table inconsistencies,
-			# which is better than crippling the site with lock contention.
-			$this->mDb->insert( $table, $insertions, __METHOD__, array( 'IGNORE' ) );
-		}
-	}
-
 	/**
 	 * Update a table by doing a delete query then an insert query
 	 * @param $table
@@ -354,7 +318,7 @@ class LinksUpdate extends SqlDataUpdate {
 	 */
 	private function getLinkInsertions( $existing = array() ) {
 		$arr = array();
-		foreach( $this->mLinks as $ns => $dbkeys ) {
+		foreach ( $this->mLinks as $ns => $dbkeys ) {
 			$diffs = isset( $existing[$ns] )
 				? array_diff_key( $dbkeys, $existing[$ns] )
 				: $dbkeys;
@@ -376,7 +340,7 @@ class LinksUpdate extends SqlDataUpdate {
 	 */
 	private function getTemplateInsertions( $existing = array() ) {
 		$arr = array();
-		foreach( $this->mTemplates as $ns => $dbkeys ) {
+		foreach ( $this->mTemplates as $ns => $dbkeys ) {
 			$diffs = isset( $existing[$ns] ) ? array_diff_key( $dbkeys, $existing[$ns] ) : $dbkeys;
 			foreach ( $diffs as $dbk => $id ) {
 				$arr[] = array(
@@ -398,7 +362,7 @@ class LinksUpdate extends SqlDataUpdate {
 	private function getImageInsertions( $existing = array() ) {
 		$arr = array();
 		$diffs = array_diff_key( $this->mImages, $existing );
-		foreach( $diffs as $iname => $dummy ) {
+		foreach ( $diffs as $iname => $dummy ) {
 			$arr[] = array(
 				'il_from' => $this->mId,
 				'il_to' => $iname
@@ -415,8 +379,8 @@ class LinksUpdate extends SqlDataUpdate {
 	private function getExternalInsertions( $existing = array() ) {
 		$arr = array();
 		$diffs = array_diff_key( $this->mExternals, $existing );
-		foreach( $diffs as $url => $dummy ) {
-			foreach( wfMakeUrlIndexes( $url ) as $index ) {
+		foreach ( $diffs as $url => $dummy ) {
+			foreach ( wfMakeUrlIndexes( $url ) as $index ) {
 				$arr[] = array(
 					'el_from' => $this->mId,
 					'el_to' => $url,
@@ -481,7 +445,7 @@ class LinksUpdate extends SqlDataUpdate {
 	private function getInterlangInsertions( $existing = array() ) {
 		$diffs = array_diff_assoc( $this->mInterlangs, $existing );
 		$arr = array();
-		foreach( $diffs as $lang => $title ) {
+		foreach ( $diffs as $lang => $title ) {
 			$arr[] = array(
 				'll_from' => $this->mId,
 				'll_lang' => $lang,
@@ -517,7 +481,7 @@ class LinksUpdate extends SqlDataUpdate {
 	 */
 	private function getInterwikiInsertions( $existing = array() ) {
 		$arr = array();
-		foreach( $this->mInterwikis as $prefix => $dbkeys ) {
+		foreach ( $this->mInterwikis as $prefix => $dbkeys ) {
 			$diffs = isset( $existing[$prefix] ) ? array_diff_key( $dbkeys, $existing[$prefix] ) : $dbkeys;
 			foreach ( $diffs as $dbk => $id ) {
 				$arr[] = array(
@@ -807,6 +771,40 @@ class LinksUpdate extends SqlDataUpdate {
 			}
 		}
 	}
+
+	/**
+	 * Fetch page links added by this LinksUpdate.  Only available after the update is complete.
+	 * @since 1.22
+	 * @return null|array of Titles
+	 */
+	public function getAddedLinks() {
+		if ( $this->linkInsertions === null ) {
+			return null;
+		}
+		$result = array();
+		foreach ( $this->linkInsertions as $insertion ) {
+			$result[] = Title::makeTitle( $insertion[ 'pl_namespace' ], $insertion[ 'pl_title' ] );
+		}
+		return $result;
+	}
+
+	/**
+	 * Fetch page links removed by this LinksUpdate.  Only available after the update is complete.
+	 * @since 1.22
+	 * @return null|array of Titles
+	 */
+	public function getRemovedLinks() {
+		if ( $this->linkDeletions === null ) {
+			return null;
+		}
+		$result = array();
+		foreach ( $this->linkDeletions as $ns => $titles ) {
+			foreach ( $titles as $title => $unused ) {
+				$result[] = Title::makeTitle( $ns, $title );
+			}
+		}
+		return $result;
+	}
 }
 
 /**
@@ -840,22 +838,20 @@ class LinksDeletionUpdate extends SqlDataUpdate {
 		$id = $this->mPage->getId();
 
 		# Delete restrictions for it
-		$this->mDb->delete( 'page_restrictions', array ( 'pr_page' => $id ), __METHOD__ );
+		$this->mDb->delete( 'page_restrictions', array( 'pr_page' => $id ), __METHOD__ );
 
 		# Fix category table counts
 		$cats = array();
 		$res = $this->mDb->select( 'categorylinks', 'cl_to', array( 'cl_from' => $id ), __METHOD__ );
 
 		foreach ( $res as $row ) {
-			$cats [] = $row->cl_to;
+			$cats[] = $row->cl_to;
 		}
 
 		$this->mPage->updateCategoryCounts( array(), $cats );
 
 		# If using cascading deletes, we can skip some explicit deletes
 		if ( !$this->mDb->cascadingDeletes() ) {
-			$this->mDb->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
-
 			# Delete outgoing links
 			$this->mDb->delete( 'pagelinks', array( 'pl_from' => $id ), __METHOD__ );
 			$this->mDb->delete( 'imagelinks', array( 'il_from' => $id ), __METHOD__ );
diff --git a/includes/MWCryptRand.php b/includes/MWCryptRand.php
new file mode 100644
index 00000000..bac018e8
--- /dev/null
+++ b/includes/MWCryptRand.php
@@ -0,0 +1,497 @@
+<?php
+/**
+ * A cryptographic random generator class used for generating secret keys
+ *
+ * This is based in part on Drupal code as well as what we used in our own code
+ * prior to introduction of this class.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @author Daniel Friesen
+ * @file
+ */
+
+class MWCryptRand {
+
+	/**
+	 * Minimum number of iterations we want to make in our drift calculations.
+	 */
+	const MIN_ITERATIONS = 1000;
+
+	/**
+	 * Number of milliseconds we want to spend generating each separate byte
+	 * of the final generated bytes.
+	 * This is used in combination with the hash length to determine the duration
+	 * we should spend doing drift calculations.
+	 */
+	const MSEC_PER_BYTE = 0.5;
+
+	/**
+	 * Singleton instance for public use
+	 */
+	protected static $singleton = null;
+
+	/**
+	 * The hash algorithm being used
+	 */
+	protected $algo = null;
+
+	/**
+	 * The number of bytes outputted by the hash algorithm
+	 */
+	protected $hashLength = null;
+
+	/**
+	 * A boolean indicating whether the previous random generation was done using
+	 * cryptographically strong random number generator or not.
+	 */
+	protected $strong = null;
+
+	/**
+	 * Initialize an initial random state based off of whatever we can find
+	 */
+	protected function initialRandomState() {
+		// $_SERVER contains a variety of unstable user and system specific information
+		// It'll vary a little with each page, and vary even more with separate users
+		// It'll also vary slightly across different machines
+		$state = serialize( $_SERVER );
+
+		// To try vary the system information of the state a bit more
+		// by including the system's hostname into the state
+		$state .= wfHostname();
+
+		// Try to gather a little entropy from the different php rand sources
+		$state .= rand() . uniqid( mt_rand(), true );
+
+		// Include some information about the filesystem's current state in the random state
+		$files = array();
+
+		// We know this file is here so grab some info about ourselves
+		$files[] = __FILE__;
+
+		// We must also have a parent folder, and with the usual file structure, a grandparent
+		$files[] = __DIR__;
+		$files[] = dirname( __DIR__ );
+
+		// The config file is likely the most often edited file we know should be around
+		// so include its stat info into the state.
+		// The constant with its location will almost always be defined, as WebStart.php defines
+		// MW_CONFIG_FILE to $IP/LocalSettings.php unless being configured with MW_CONFIG_CALLBACK (eg. the installer)
+		if ( defined( 'MW_CONFIG_FILE' ) ) {
+			$files[] = MW_CONFIG_FILE;
+		}
+
+		foreach ( $files as $file ) {
+			wfSuppressWarnings();
+			$stat = stat( $file );
+			wfRestoreWarnings();
+			if ( $stat ) {
+				// stat() duplicates data into numeric and string keys so kill off all the numeric ones
+				foreach ( $stat as $k => $v ) {
+					if ( is_numeric( $k ) ) {
+						unset( $k );
+					}
+				}
+				// The absolute filename itself will differ from install to install so don't leave it out
+				if ( ( $path = realpath( $file ) ) !== false ) {
+					$state .= $path;
+				} else {
+					$state .= $file;
+				}
+				$state .= implode( '', $stat );
+			} else {
+				// The fact that the file isn't there is worth at least a
+				// minuscule amount of entropy.
+				$state .= '0';
+			}
+		}
+
+		// Try and make this a little more unstable by including the varying process
+		// id of the php process we are running inside of if we are able to access it
+		if ( function_exists( 'getmypid' ) ) {
+			$state .= getmypid();
+		}
+
+		// If available try to increase the instability of the data by throwing in
+		// the precise amount of memory that we happen to be using at the moment.
+		if ( function_exists( 'memory_get_usage' ) ) {
+			$state .= memory_get_usage( true );
+		}
+
+		// It's mostly worthless but throw the wiki's id into the data for a little more variance
+		$state .= wfWikiID();
+
+		// If we have a secret key or proxy key set then throw it into the state as well
+		global $wgSecretKey, $wgProxyKey;
+		if ( $wgSecretKey ) {
+			$state .= $wgSecretKey;
+		} elseif ( $wgProxyKey ) {
+			$state .= $wgProxyKey;
+		}
+
+		return $state;
+	}
+
+	/**
+	 * Randomly hash data while mixing in clock drift data for randomness
+	 *
+	 * @param string $data The data to randomly hash.
+	 * @return String The hashed bytes
+	 * @author Tim Starling
+	 */
+	protected function driftHash( $data ) {
+		// Minimum number of iterations (to avoid slow operations causing the loop to gather little entropy)
+		$minIterations = self::MIN_ITERATIONS;
+		// Duration of time to spend doing calculations (in seconds)
+		$duration = ( self::MSEC_PER_BYTE / 1000 ) * $this->hashLength();
+		// Create a buffer to use to trigger memory operations
+		$bufLength = 10000000;
+		$buffer = str_repeat( ' ', $bufLength );
+		$bufPos = 0;
+
+		// Iterate for $duration seconds or at least $minIterations number of iterations
+		$iterations = 0;
+		$startTime = microtime( true );
+		$currentTime = $startTime;
+		while ( $iterations < $minIterations || $currentTime - $startTime < $duration ) {
+			// Trigger some memory writing to trigger some bus activity
+			// This may create variance in the time between iterations
+			$bufPos = ( $bufPos + 13 ) % $bufLength;
+			$buffer[$bufPos] = ' ';
+			// Add the drift between this iteration and the last in as entropy
+			$nextTime = microtime( true );
+			$delta = (int)( ( $nextTime - $currentTime ) * 1000000 );
+			$data .= $delta;
+			// Every 100 iterations hash the data and entropy
+			if ( $iterations % 100 === 0 ) {
+				$data = sha1( $data );
+			}
+			$currentTime = $nextTime;
+			$iterations++;
+		}
+		$timeTaken = $currentTime - $startTime;
+		$data = $this->hash( $data );
+
+		wfDebug( __METHOD__ . ": Clock drift calculation " .
+			"(time-taken=" . ( $timeTaken * 1000 ) . "ms, " .
+			"iterations=$iterations, " .
+			"time-per-iteration=" . ( $timeTaken / $iterations * 1e6 ) . "us)\n" );
+		return $data;
+	}
+
+	/**
+	 * Return a rolling random state initially build using data from unstable sources
+	 * @return string A new weak random state
+	 */
+	protected function randomState() {
+		static $state = null;
+		if ( is_null( $state ) ) {
+			// Initialize the state with whatever unstable data we can find
+			// It's important that this data is hashed right afterwards to prevent
+			// it from being leaked into the output stream
+			$state = $this->hash( $this->initialRandomState() );
+		}
+		// Generate a new random state based on the initial random state or previous
+		// random state by combining it with clock drift
+		$state = $this->driftHash( $state );
+		return $state;
+	}
+
+	/**
+	 * Decide on the best acceptable hash algorithm we have available for hash()
+	 * @throws MWException
+	 * @return String A hash algorithm
+	 */
+	protected function hashAlgo() {
+		if ( !is_null( $this->algo ) ) {
+			return $this->algo;
+		}
+
+		$algos = hash_algos();
+		$preference = array( 'whirlpool', 'sha256', 'sha1', 'md5' );
+
+		foreach ( $preference as $algorithm ) {
+			if ( in_array( $algorithm, $algos ) ) {
+				$this->algo = $algorithm;
+				wfDebug( __METHOD__ . ": Using the {$this->algo} hash algorithm.\n" );
+				return $this->algo;
+			}
+		}
+
+		// We only reach here if no acceptable hash is found in the list, this should
+		// be a technical impossibility since most of php's hash list is fixed and
+		// some of the ones we list are available as their own native functions
+		// But since we already require at least 5.2 and hash() was default in
+		// 5.1.2 we don't bother falling back to methods like sha1 and md5.
+		throw new MWException( "Could not find an acceptable hashing function in hash_algos()" );
+	}
+
+	/**
+	 * Return the byte-length output of the hash algorithm we are
+	 * using in self::hash and self::hmac.
+	 *
+	 * @return int Number of bytes the hash outputs
+	 */
+	protected function hashLength() {
+		if ( is_null( $this->hashLength ) ) {
+			$this->hashLength = strlen( $this->hash( '' ) );
+		}
+		return $this->hashLength;
+	}
+
+	/**
+	 * Generate an acceptably unstable one-way-hash of some text
+	 * making use of the best hash algorithm that we have available.
+	 *
+	 * @param $data string
+	 * @return String A raw hash of the data
+	 */
+	protected function hash( $data ) {
+		return hash( $this->hashAlgo(), $data, true );
+	}
+
+	/**
+	 * Generate an acceptably unstable one-way-hmac of some text
+	 * making use of the best hash algorithm that we have available.
+	 *
+	 * @param $data string
+	 * @param $key string
+	 * @return String A raw hash of the data
+	 */
+	protected function hmac( $data, $key ) {
+		return hash_hmac( $this->hashAlgo(), $data, $key, true );
+	}
+
+	/**
+	 * @see self::wasStrong()
+	 */
+	public function realWasStrong() {
+		if ( is_null( $this->strong ) ) {
+			throw new MWException( __METHOD__ . ' called before generation of random data' );
+		}
+		return $this->strong;
+	}
+
+	/**
+	 * @see self::generate()
+	 */
+	public function realGenerate( $bytes, $forceStrong = false ) {
+		wfProfileIn( __METHOD__ );
+
+		wfDebug( __METHOD__ . ": Generating cryptographic random bytes for " . wfGetAllCallers( 5 ) . "\n" );
+
+		$bytes = floor( $bytes );
+		static $buffer = '';
+		if ( is_null( $this->strong ) ) {
+			// Set strength to false initially until we know what source data is coming from
+			$this->strong = true;
+		}
+
+		if ( strlen( $buffer ) < $bytes ) {
+			// If available make use of mcrypt_create_iv URANDOM source to generate randomness
+			// On unix-like systems this reads from /dev/urandom but does it without any buffering
+			// and bypasses openbasedir restrictions, so it's preferable to reading directly
+			// On Windows starting in PHP 5.3.0 Windows' native CryptGenRandom is used to generate
+			// entropy so this is also preferable to just trying to read urandom because it may work
+			// on Windows systems as well.
+			if ( function_exists( 'mcrypt_create_iv' ) ) {
+				wfProfileIn( __METHOD__ . '-mcrypt' );
+				$rem = $bytes - strlen( $buffer );
+				$iv = mcrypt_create_iv( $rem, MCRYPT_DEV_URANDOM );
+				if ( $iv === false ) {
+					wfDebug( __METHOD__ . ": mcrypt_create_iv returned false.\n" );
+				} else {
+					$buffer .= $iv;
+					wfDebug( __METHOD__ . ": mcrypt_create_iv generated " . strlen( $iv ) . " bytes of randomness.\n" );
+				}
+				wfProfileOut( __METHOD__ . '-mcrypt' );
+			}
+		}
+
+		if ( strlen( $buffer ) < $bytes ) {
+			// If available make use of openssl's random_pseudo_bytes method to attempt to generate randomness.
+			// However don't do this on Windows with PHP < 5.3.4 due to a bug:
+			// http://stackoverflow.com/questions/1940168/openssl-random-pseudo-bytes-is-slow-php
+			// http://git.php.net/?p=php-src.git;a=commitdiff;h=cd62a70863c261b07f6dadedad9464f7e213cad5
+			if ( function_exists( 'openssl_random_pseudo_bytes' )
+				&& ( !wfIsWindows() || version_compare( PHP_VERSION, '5.3.4', '>=' ) )
+			) {
+				wfProfileIn( __METHOD__ . '-openssl' );
+				$rem = $bytes - strlen( $buffer );
+				$openssl_bytes = openssl_random_pseudo_bytes( $rem, $openssl_strong );
+				if ( $openssl_bytes === false ) {
+					wfDebug( __METHOD__ . ": openssl_random_pseudo_bytes returned false.\n" );
+				} else {
+					$buffer .= $openssl_bytes;
+					wfDebug( __METHOD__ . ": openssl_random_pseudo_bytes generated " . strlen( $openssl_bytes ) . " bytes of " . ( $openssl_strong ? "strong" : "weak" ) . " randomness.\n" );
+				}
+				if ( strlen( $buffer ) >= $bytes ) {
+					// openssl tells us if the random source was strong, if some of our data was generated
+					// using it use it's say on whether the randomness is strong
+					$this->strong = !!$openssl_strong;
+				}
+				wfProfileOut( __METHOD__ . '-openssl' );
+			}
+		}
+
+		// Only read from urandom if we can control the buffer size or were passed forceStrong
+		if ( strlen( $buffer ) < $bytes && ( function_exists( 'stream_set_read_buffer' ) || $forceStrong ) ) {
+			wfProfileIn( __METHOD__ . '-fopen-urandom' );
+			$rem = $bytes - strlen( $buffer );
+			if ( !function_exists( 'stream_set_read_buffer' ) && $forceStrong ) {
+				wfDebug( __METHOD__ . ": Was forced to read from /dev/urandom without control over the buffer size.\n" );
+			}
+			// /dev/urandom is generally considered the best possible commonly
+			// available random source, and is available on most *nix systems.
+			wfSuppressWarnings();
+			$urandom = fopen( "/dev/urandom", "rb" );
+			wfRestoreWarnings();
+
+			// Attempt to read all our random data from urandom
+			// php's fread always does buffered reads based on the stream's chunk_size
+			// so in reality it will usually read more than the amount of data we're
+			// asked for and not storing that risks depleting the system's random pool.
+			// If stream_set_read_buffer is available set the chunk_size to the amount
+			// of data we need. Otherwise read 8k, php's default chunk_size.
+			if ( $urandom ) {
+				// php's default chunk_size is 8k
+				$chunk_size = 1024 * 8;
+				if ( function_exists( 'stream_set_read_buffer' ) ) {
+					// If possible set the chunk_size to the amount of data we need
+					stream_set_read_buffer( $urandom, $rem );
+					$chunk_size = $rem;
+				}
+				$random_bytes = fread( $urandom, max( $chunk_size, $rem ) );
+				$buffer .= $random_bytes;
+				fclose( $urandom );
+				wfDebug( __METHOD__ . ": /dev/urandom generated " . strlen( $random_bytes ) . " bytes of randomness.\n" );
+				if ( strlen( $buffer ) >= $bytes ) {
+					// urandom is always strong, set to true if all our data was generated using it
+					$this->strong = true;
+				}
+			} else {
+				wfDebug( __METHOD__ . ": /dev/urandom could not be opened.\n" );
+			}
+			wfProfileOut( __METHOD__ . '-fopen-urandom' );
+		}
+
+		// If we cannot use or generate enough data from a secure source
+		// use this loop to generate a good set of pseudo random data.
+		// This works by initializing a random state using a pile of unstable data
+		// and continually shoving it through a hash along with a variable salt.
+		// We hash the random state with more salt to avoid the state from leaking
+		// out and being used to predict the /randomness/ that follows.
+		if ( strlen( $buffer ) < $bytes ) {
+			wfDebug( __METHOD__ . ": Falling back to using a pseudo random state to generate randomness.\n" );
+		}
+		while ( strlen( $buffer ) < $bytes ) {
+			wfProfileIn( __METHOD__ . '-fallback' );
+			$buffer .= $this->hmac( $this->randomState(), mt_rand() );
+			// This code is never really cryptographically strong, if we use it
+			// at all, then set strong to false.
+			$this->strong = false;
+			wfProfileOut( __METHOD__ . '-fallback' );
+		}
+
+		// Once the buffer has been filled up with enough random data to fulfill
+		// the request shift off enough data to handle the request and leave the
+		// unused portion left inside the buffer for the next request for random data
+		$generated = substr( $buffer, 0, $bytes );
+		$buffer = substr( $buffer, $bytes );
+
+		wfDebug( __METHOD__ . ": " . strlen( $buffer ) . " bytes of randomness leftover in the buffer.\n" );
+
+		wfProfileOut( __METHOD__ );
+		return $generated;
+	}
+
+	/**
+	 * @see self::generateHex()
+	 */
+	public function realGenerateHex( $chars, $forceStrong = false ) {
+		// hex strings are 2x the length of raw binary so we divide the length in half
+		// odd numbers will result in a .5 that leads the generate() being 1 character
+		// short, so we use ceil() to ensure that we always have enough bytes
+		$bytes = ceil( $chars / 2 );
+		// Generate the data and then convert it to a hex string
+		$hex = bin2hex( $this->generate( $bytes, $forceStrong ) );
+		// A bit of paranoia here, the caller asked for a specific length of string
+		// here, and it's possible (eg when given an odd number) that we may actually
+		// have at least 1 char more than they asked for. Just in case they made this
+		// call intending to insert it into a database that does truncation we don't
+		// want to give them too much and end up with their database and their live
+		// code having two different values because part of what we gave them is truncated
+		// hence, we strip out any run of characters longer than what we were asked for.
+		return substr( $hex, 0, $chars );
+	}
+
+	/** Publicly exposed static methods **/
+
+	/**
+	 * Return a singleton instance of MWCryptRand
+	 * @return MWCryptRand
+	 */
+	protected static function singleton() {
+		if ( is_null( self::$singleton ) ) {
+			self::$singleton = new self;
+		}
+		return self::$singleton;
+	}
+
+	/**
+	 * Return a boolean indicating whether or not the source used for cryptographic
+	 * random bytes generation in the previously run generate* call
+	 * was cryptographically strong.
+	 *
+	 * @return bool Returns true if the source was strong, false if not.
+	 */
+	public static function wasStrong() {
+		return self::singleton()->realWasStrong();
+	}
+
+	/**
+	 * Generate a run of (ideally) cryptographically random data and return
+	 * it in raw binary form.
+	 * You can use MWCryptRand::wasStrong() if you wish to know if the source used
+	 * was cryptographically strong.
+	 *
+	 * @param int $bytes the number of bytes of random data to generate
+	 * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
+	 *                          strong sources of entropy even if reading from them may steal
+	 *                          more entropy from the system than optimal.
+	 * @return String Raw binary random data
+	 */
+	public static function generate( $bytes, $forceStrong = false ) {
+		return self::singleton()->realGenerate( $bytes, $forceStrong );
+	}
+
+	/**
+	 * Generate a run of (ideally) cryptographically random data and return
+	 * it in hexadecimal string format.
+	 * You can use MWCryptRand::wasStrong() if you wish to know if the source used
+	 * was cryptographically strong.
+	 *
+	 * @param int $chars the number of hex chars of random data to generate
+	 * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
+	 *                          strong sources of entropy even if reading from them may steal
+	 *                          more entropy from the system than optimal.
+	 * @return String Hexadecimal random data
+	 */
+	public static function generateHex( $chars, $forceStrong = false ) {
+		return self::singleton()->realGenerateHex( $chars, $forceStrong );
+	}
+
+}
diff --git a/includes/MWFunction.php b/includes/MWFunction.php
index 36fcc30b..6d11d178 100644
--- a/includes/MWFunction.php
+++ b/includes/MWFunction.php
@@ -23,48 +23,24 @@
 class MWFunction {
 
 	/**
-	 * @param $callback
-	 * @return array
-	 * @throws MWException
-	 */
-	protected static function cleanCallback( $callback ) {
-		if( is_string( $callback ) ) {
-			if ( strpos( $callback, '::' ) !== false ) {
-				// PHP 5.1 cannot use call_user_func( 'Class::Method' )
-				// It can only handle only call_user_func( array( 'Class', 'Method' ) )
-				$callback = explode( '::', $callback, 2);
-			}
-		}
-
-		if( count( $callback ) == 2 && $callback[0] == 'self' || $callback[0] == 'parent' ) {
-			throw new MWException( 'MWFunction cannot call self::method() or parent::method()' );
-		}
-
-		// Run autoloader (workaround for call_user_func_array bug: http://bugs.php.net/bug.php?id=51329)
-		is_callable( $callback );
-
-		return $callback;
-	}
-
-	/**
+	 * @deprecated since 1.22; use call_user_func()
 	 * @param $callback
 	 * @return mixed
 	 */
 	public static function call( $callback ) {
-		$callback = self::cleanCallback( $callback );
-
+		wfDeprecated( __METHOD__, '1.22' );
 		$args = func_get_args();
-
 		return call_user_func_array( 'call_user_func', $args );
 	}
 
 	/**
+	 * @deprecated since 1.22; use call_user_func_array()
 	 * @param $callback
 	 * @param $argsarams
 	 * @return mixed
 	 */
 	public static function callArray( $callback, $argsarams ) {
-		$callback = self::cleanCallback( $callback );
+		wfDeprecated( __METHOD__, '1.22' );
 		return call_user_func_array( $callback, $argsarams );
 	}
 
@@ -74,7 +50,7 @@ class MWFunction {
 	 * @return object
 	 */
 	public static function newObj( $class, $args = array() ) {
-		if( !count( $args ) ) {
+		if ( !count( $args ) ) {
 			return new $class;
 		}
 
diff --git a/includes/MagicWord.php b/includes/MagicWord.php
index 7b669249..427a1adc 100644
--- a/includes/MagicWord.php
+++ b/includes/MagicWord.php
@@ -124,6 +124,7 @@ class MagicWord {
 		'revisionyear',
 		'revisiontimestamp',
 		'revisionuser',
+		'revisionsize',
 		'subpagename',
 		'subpagenamee',
 		'talkspace',
@@ -138,6 +139,8 @@ class MagicWord {
 		'numberofactiveusers',
 		'numberofpages',
 		'currentversion',
+		'rootpagename',
+		'rootpagenamee',
 		'basepagename',
 		'basepagenamee',
 		'currenttimestamp',
@@ -149,7 +152,7 @@ class MagicWord {
 	);
 
 	/* Array of caching hints for ParserCache */
-	static public $mCacheTTLs = array (
+	static public $mCacheTTLs = array(
 		'currentmonth' => 86400,
 		'currentmonth1' => 86400,
 		'currentmonthname' => 86400,
@@ -308,9 +311,9 @@ class MagicWord {
 		$this->mId = $id;
 		$wgContLang->getMagic( $this );
 		if ( !$this->mSynonyms ) {
-			$this->mSynonyms = array( 'dkjsagfjsgashfajsh' );
+			$this->mSynonyms = array( 'brionmademeputthishere' );
+			wfProfileOut( __METHOD__ );
 			throw new MWException( "Error: invalid magic word '$id'" );
-			#wfDebugLog( 'exception', "Error: invalid magic word '$id'\n" );
 		}
 		wfProfileOut( __METHOD__ );
 	}
@@ -326,9 +329,10 @@ class MagicWord {
 		usort( $synonyms, array( $this, 'compareStringLength' ) );
 
 		$escSyn = array();
-		foreach ( $synonyms as $synonym )
+		foreach ( $synonyms as $synonym ) {
 			// In case a magic word contains /, like that's going to happen;)
 			$escSyn[] = preg_quote( $synonym, '/' );
+		}
 		$this->mBaseRegex = implode( '|', $escSyn );
 
 		$case = $this->mCaseSensitive ? '' : 'iu';
@@ -381,8 +385,9 @@ class MagicWord {
 	 * @return string
 	 */
 	function getRegexCase() {
-		if ( $this->mRegex === '' )
+		if ( $this->mRegex === '' ) {
 			$this->initRegex();
+		}
 
 		return $this->mCaseSensitive ? '' : 'iu';
 	}
@@ -509,7 +514,7 @@ class MagicWord {
 	 */
 	function replace( $replacement, $subject, $limit = -1 ) {
 		$res = preg_replace( $this->getRegex(), StringUtils::escapeRegexReplacement( $replacement ), $subject, $limit );
-		$this->mModified = !($res === $subject);
+		$this->mModified = $res !== $subject;
 		return $res;
 	}
 
@@ -525,7 +530,7 @@ class MagicWord {
 	 */
 	function substituteCallback( $text, $callback ) {
 		$res = preg_replace_callback( $this->getVariableRegex(), $callback, $text );
-		$this->mModified = !($res === $text);
+		$this->mModified = $res !== $text;
 		return $res;
 	}
 
@@ -597,14 +602,14 @@ class MagicWord {
 	function replaceMultiple( $magicarr, $subject, &$result ) {
 		$search = array();
 		$replace = array();
-		foreach( $magicarr as $id => $replacement ) {
+		foreach ( $magicarr as $id => $replacement ) {
 			$mw = MagicWord::get( $id );
 			$search[] = $mw->getRegex();
 			$replace[] = $replacement;
 		}
 
 		$result = preg_replace( $search, $replace, $subject );
-		return !($result === $subject);
+		return $result !== $subject;
 	}
 
 	/**
diff --git a/includes/MappedIterator.php b/includes/MappedIterator.php
index b4376f44..70d20327 100644
--- a/includes/MappedIterator.php
+++ b/includes/MappedIterator.php
@@ -26,11 +26,15 @@
  *
  * @since 1.21
  */
-class MappedIterator implements Iterator {
-	/** @var Iterator */
-	protected $baseIterator;
-	/** @var Closure */
+class MappedIterator extends FilterIterator {
+	/** @var callable */
 	protected $vCallback;
+	/** @var callable */
+	protected $aCallback;
+	/** @var array */
+	protected $cache = array();
+
+	protected $rewound = false; // boolean; whether rewind() has been called
 
 	/**
 	 * Build an new iterator from a base iterator by having the former wrap the
@@ -38,59 +42,73 @@ class MappedIterator implements Iterator {
 	 * The callback takes the result of current() on the base iterator as an argument.
 	 * The keys of the base iterator are reused verbatim.
 	 *
+	 * An "accept" callback can also be provided which will be called for each value in
+	 * the base iterator (post-callback) and will return true if that value should be
+	 * included in iteration of the MappedIterator (otherwise it will be filtered out).
+	 *
 	 * @param Iterator|Array $iter
-	 * @param Closure $vCallback
+	 * @param callable $vCallback Value transformation callback
+	 * @param array $options Options map (includes "accept") (since 1.22)
 	 * @throws MWException
 	 */
-    public function __construct( $iter, Closure $vCallback ) {
+	public function __construct( $iter, $vCallback, array $options = array() ) {
 		if ( is_array( $iter ) ) {
-			$this->baseIterator = new ArrayIterator( $iter );
+			$baseIterator = new ArrayIterator( $iter );
 		} elseif ( $iter instanceof Iterator ) {
-			$this->baseIterator = $iter;
+			$baseIterator = $iter;
 		} else {
 			throw new MWException( "Invalid base iterator provided." );
 		}
+		parent::__construct( $baseIterator );
 		$this->vCallback = $vCallback;
-    }
+		$this->aCallback = isset( $options['accept'] ) ? $options['accept'] : null;
+	}
+
+	public function next() {
+		$this->cache = array();
+		parent::next();
+	}
 
-	/**
-	 * @return void
-	 */
 	public function rewind() {
-		$this->baseIterator->rewind();
+		$this->rewound = true;
+		$this->cache = array();
+		parent::rewind();
 	}
 
-	/**
-	 * @return Mixed|null Returns null if out of range
-	 */
-	public function current() {
-		if ( !$this->baseIterator->valid() ) {
-			return null; // out of range
+	public function accept() {
+		$value = call_user_func( $this->vCallback, $this->getInnerIterator()->current() );
+		$ok = ( $this->aCallback ) ? call_user_func( $this->aCallback, $value ) : true;
+		if ( $ok ) {
+			$this->cache['current'] = $value;
 		}
-		return call_user_func_array( $this->vCallback, array( $this->baseIterator->current() ) );
+		return $ok;
 	}
 
-	/**
-	 * @return Mixed|null Returns null if out of range
-	 */
 	public function key() {
-		if ( !$this->baseIterator->valid() ) {
-			return null; // out of range
-		}
-		return $this->baseIterator->key();
+		$this->init();
+		return parent::key();
 	}
 
-	/**
-	 * @return void
-	 */
-	public function next() {
-		$this->baseIterator->next();
+	public function valid() {
+		$this->init();
+		return parent::valid();
+	}
+
+	public function current() {
+		$this->init();
+		if ( parent::valid() ) {
+			return $this->cache['current'];
+		} else {
+			return null; // out of range
+		}
 	}
 
 	/**
-	 * @return bool
+	 * Obviate the usual need for rewind() before using a FilterIterator in a manual loop
 	 */
-	public function valid() {
-		return $this->baseIterator->valid();
+	protected function init() {
+		if ( !$this->rewound ) {
+			$this->rewind();
+		}
 	}
 }
diff --git a/includes/Message.php b/includes/Message.php
index 5719f830..57c6264d 100644
--- a/includes/Message.php
+++ b/includes/Message.php
@@ -234,7 +234,13 @@ class Message {
 	 * @return string
 	 */
 	public function getKey() {
-		return $this->key;
+		if ( is_array( $this->key ) ) {
+			// May happen if some kind of fallback is applied.
+			// For now, just use the first key. We really need a better solution.
+			return $this->key[0];
+		} else {
+			return $this->key;
+		}
 	}
 
 	/**
@@ -326,7 +332,7 @@ class Message {
 		if ( isset( $params[0] ) && is_array( $params[0] ) ) {
 			$params = $params[0];
 		}
-		foreach( $params as $param ) {
+		foreach ( $params as $param ) {
 			$this->parameters[] = self::rawParam( $param );
 		}
 		return $this;
@@ -344,12 +350,102 @@ class Message {
 		if ( isset( $params[0] ) && is_array( $params[0] ) ) {
 			$params = $params[0];
 		}
-		foreach( $params as $param ) {
+		foreach ( $params as $param ) {
 			$this->parameters[] = self::numParam( $param );
 		}
 		return $this;
 	}
 
+	/**
+	 * Add parameters that are durations of time and will be passed through
+	 * Language::formatDuration before substitution
+	 * @since 1.22
+	 * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+	 * @return Message: $this
+	 */
+	public function durationParams( /*...*/ ) {
+		$params = func_get_args();
+		if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+			$params = $params[0];
+		}
+		foreach ( $params as $param ) {
+			$this->parameters[] = self::durationParam( $param );
+		}
+		return $this;
+	}
+
+	/**
+	 * Add parameters that are expiration times and will be passed through
+	 * Language::formatExpiry before substitution
+	 * @since 1.22
+	 * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+	 * @return Message: $this
+	 */
+	public function expiryParams( /*...*/ ) {
+		$params = func_get_args();
+		if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+			$params = $params[0];
+		}
+		foreach ( $params as $param ) {
+			$this->parameters[] = self::expiryParam( $param );
+		}
+		return $this;
+	}
+
+	/**
+	 * Add parameters that are time periods and will be passed through
+	 * Language::formatTimePeriod before substitution
+	 * @since 1.22
+	 * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+	 * @return Message: $this
+	 */
+	public function timeperiodParams( /*...*/ ) {
+		$params = func_get_args();
+		if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+			$params = $params[0];
+		}
+		foreach ( $params as $param ) {
+			$this->parameters[] = self::timeperiodParam( $param );
+		}
+		return $this;
+	}
+
+	/**
+	 * Add parameters that are file sizes and will be passed through
+	 * Language::formatSize before substitution
+	 * @since 1.22
+	 * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+	 * @return Message: $this
+	 */
+	public function sizeParams( /*...*/ ) {
+		$params = func_get_args();
+		if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+			$params = $params[0];
+		}
+		foreach ( $params as $param ) {
+			$this->parameters[] = self::sizeParam( $param );
+		}
+		return $this;
+	}
+
+	/**
+	 * Add parameters that are bitrates and will be passed through
+	 * Language::formatBitrate before substitution
+	 * @since 1.22
+	 * @param Varargs: numeric parameters (or single argument that is array of numeric parameters)
+	 * @return Message: $this
+	 */
+	public function bitrateParams( /*...*/ ) {
+		$params = func_get_args();
+		if ( isset( $params[0] ) && is_array( $params[0] ) ) {
+			$params = $params[0];
+		}
+		foreach ( $params as $param ) {
+			$this->parameters[] = self::bitrateParam( $param );
+		}
+		return $this;
+	}
+
 	/**
 	 * Set the language and the title from a context object
 	 * @since 1.19
@@ -377,7 +473,7 @@ class Message {
 		if ( $lang instanceof Language || $lang instanceof StubUserLang ) {
 			$this->language = $lang;
 		} elseif ( is_string( $lang ) ) {
-			if( $this->language->getCode() != $lang ) {
+			if ( $this->language->getCode() != $lang ) {
 				$this->language = Language::factory( $lang );
 			}
 		} else {
@@ -417,7 +513,7 @@ class Message {
 	 * @since 1.20
 	 */
 	public function setInterfaceMessageFlag( $value ) {
-		$this->interface = (bool) $value;
+		$this->interface = (bool)$value;
 		return $this;
 	}
 
@@ -428,7 +524,7 @@ class Message {
 	 * @return Message: $this
 	 */
 	public function useDatabase( $value ) {
-		$this->useDatabase = (bool) $value;
+		$this->useDatabase = (bool)$value;
 		return $this;
 	}
 
@@ -484,17 +580,17 @@ class Message {
 		$string = $this->replaceParameters( $string, 'before' );
 
 		# Maybe transform using the full parser
-		if( $this->format === 'parse' ) {
+		if ( $this->format === 'parse' ) {
 			$string = $this->parseText( $string );
 			$m = array();
-			if( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
+			if ( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
 				$string = $m[1];
 			}
-		} elseif( $this->format === 'block-parse' ) {
+		} elseif ( $this->format === 'block-parse' ) {
 			$string = $this->parseText( $string );
-		} elseif( $this->format === 'text' ) {
+		} elseif ( $this->format === 'text' ) {
 			$string = $this->transformText( $string );
-		} elseif( $this->format === 'escaped' ) {
+		} elseif ( $this->format === 'escaped' ) {
 			$string = $this->transformText( $string );
 			$string = htmlspecialchars( $string, ENT_QUOTES, 'UTF-8', false );
 		}
@@ -632,6 +728,51 @@ class Message {
 		return array( 'num' => $value );
 	}
 
+	/**
+	 * @since 1.22
+	 * @param $value
+	 * @return array
+	 */
+	public static function durationParam( $value ) {
+		return array( 'duration' => $value );
+	}
+
+	/**
+	 * @since 1.22
+	 * @param $value
+	 * @return array
+	 */
+	public static function expiryParam( $value ) {
+		return array( 'expiry' => $value );
+	}
+
+	/**
+	 * @since 1.22
+	 * @param $value
+	 * @return array
+	 */
+	public static function timeperiodParam( $value ) {
+		return array( 'period' => $value );
+	}
+
+	/**
+	 * @since 1.22
+	 * @param $value
+	 * @return array
+	 */
+	public static function sizeParam( $value ) {
+		return array( 'size' => $value );
+	}
+
+	/**
+	 * @since 1.22
+	 * @param $value
+	 * @return array
+	 */
+	public static function bitrateParam( $value ) {
+		return array( 'bitrate' => $value );
+	}
+
 	/**
 	 * Substitutes any parameters into the message text.
 	 * @since 1.17
@@ -641,10 +782,10 @@ class Message {
 	 */
 	protected function replaceParameters( $message, $type = 'before' ) {
 		$replacementKeys = array();
-		foreach( $this->parameters as $n => $param ) {
+		foreach ( $this->parameters as $n => $param ) {
 			list( $paramType, $value ) = $this->extractParam( $param );
 			if ( $type === $paramType ) {
-				$replacementKeys['$' . ($n + 1)] = $value;
+				$replacementKeys['$' . ( $n + 1 )] = $value;
 			}
 		}
 		$message = strtr( $message, $replacementKeys );
@@ -658,20 +799,37 @@ class Message {
 	 * @return Tuple(type, value)
 	 */
 	protected function extractParam( $param ) {
-		if ( is_array( $param ) && isset( $param['raw'] ) ) {
-			return array( 'after', $param['raw'] );
-		} elseif ( is_array( $param ) && isset( $param['num'] ) ) {
-			// Replace number params always in before step for now.
-			// No support for combined raw and num params
-			return array( 'before', $this->language->formatNum( $param['num'] ) );
-		} elseif ( !is_array( $param ) ) {
-			return array( 'before', $param );
+		if ( is_array( $param ) ) {
+			if ( isset( $param['raw'] ) ) {
+				return array( 'after', $param['raw'] );
+			} elseif ( isset( $param['num'] ) ) {
+				// Replace number params always in before step for now.
+				// No support for combined raw and num params
+				return array( 'before', $this->language->formatNum( $param['num'] ) );
+			} elseif ( isset( $param['duration'] ) ) {
+				return array( 'before', $this->language->formatDuration( $param['duration'] ) );
+			} elseif ( isset( $param['expiry'] ) ) {
+				return array( 'before', $this->language->formatExpiry( $param['expiry'] ) );
+			} elseif ( isset( $param['period'] ) ) {
+				return array( 'before', $this->language->formatTimePeriod( $param['period'] ) );
+			} elseif ( isset( $param['size'] ) ) {
+				return array( 'before', $this->language->formatSize( $param['size'] ) );
+			} elseif ( isset( $param['bitrate'] ) ) {
+				return array( 'before', $this->language->formatBitrate( $param['bitrate'] ) );
+			} else {
+				trigger_error(
+					"Invalid message parameter: " . htmlspecialchars( serialize( $param ) ),
+					E_USER_WARNING
+				);
+				return array( 'before', '[INVALID]' );
+			}
+		} elseif ( $param instanceof Message ) {
+			// Message objects should not be before parameters because
+			// then they'll get double escaped. If the message needs to be
+			// escaped, it'll happen right here when we call toString().
+			return array( 'after', $param->toString() );
 		} else {
-			trigger_error(
-				"Invalid message parameter: " . htmlspecialchars( serialize( $param ) ),
-				E_USER_WARNING
-			);
-			return array( 'before', '[INVALID]' );
+			return array( 'before', $param );
 		}
 	}
 
@@ -760,7 +918,7 @@ class RawMessage extends Message {
 	 */
 	public function fetchMessage() {
 		// Just in case the message is unset somewhere.
-		if( !isset( $this->message ) ) {
+		if ( !isset( $this->message ) ) {
 			$this->message = $this->key;
 		}
 		return $this->message;
diff --git a/includes/Metadata.php b/includes/Metadata.php
index 0b8014a7..37df489c 100644
--- a/includes/Metadata.php
+++ b/includes/Metadata.php
@@ -42,7 +42,7 @@ abstract class RdfMetaData {
 		$httpaccept = isset( $_SERVER['HTTP_ACCEPT'] ) ? $_SERVER['HTTP_ACCEPT'] : null;
 		$rdftype = wfNegotiateType( wfAcceptToPrefs( $httpaccept ), wfAcceptToPrefs( self::RDF_TYPE_PREFS ) );
 
-		if( !$rdftype ) {
+		if ( !$rdftype ) {
 			throw new HttpError( 406, wfMessage( 'notacceptable' ) );
 		}
 
@@ -70,7 +70,7 @@ abstract class RdfMetaData {
 		$lastEditor = User::newFromId( $this->mArticle->getUser() );
 		$this->person( 'creator', $lastEditor );
 
-		foreach( $this->mArticle->getContributors() as $user ) {
+		foreach ( $this->mArticle->getContributors() as $user ) {
 			$this->person( 'contributor', $user );
 		}
 
@@ -89,13 +89,13 @@ abstract class RdfMetaData {
 	}
 
 	protected function pageOrString( $name, $page, $str ) {
-		if( $page instanceof Title ) {
+		if ( $page instanceof Title ) {
 			$nt = $page;
 		} else {
 			$nt = Title::newFromText( $page );
 		}
 
-		if( !$nt || $nt->getArticleID() == 0 ) {
+		if ( !$nt || $nt->getArticleID() == 0 ) {
 			$this->element( $name, $str );
 		} else {
 			$this->page( $name, $nt );
@@ -107,7 +107,7 @@ abstract class RdfMetaData {
 	 * @param $title Title
 	 */
 	protected function page( $name, $title ) {
-		$this->url( $name, $title->getFullUrl() );
+		$this->url( $name, $title->getFullURL() );
 	}
 
 	protected function url( $name, $url ) {
@@ -116,11 +116,13 @@ abstract class RdfMetaData {
 	}
 
 	protected function person( $name, User $user ) {
-		if( $user->isAnon() ) {
+		global $wgHiddenPrefs;
+
+		if ( $user->isAnon() ) {
 			$this->element( $name, wfMessage( 'anonymous' )->numParams( 1 )->text() );
 		} else {
 			$real = $user->getRealName();
-			if( $real ) {
+			if ( $real && !in_array( 'realname', $wgHiddenPrefs ) ) {
 				$this->element( $name, $real );
 			} else {
 				$userName = $user->getName();
@@ -140,12 +142,12 @@ abstract class RdfMetaData {
 	protected function rights() {
 		global $wgRightsPage, $wgRightsUrl, $wgRightsText;
 
-		if( $wgRightsPage && ( $nt = Title::newFromText( $wgRightsPage ) )
+		if ( $wgRightsPage && ( $nt = Title::newFromText( $wgRightsPage ) )
 			&& ( $nt->getArticleID() != 0 ) ) {
 			$this->page( 'rights', $nt );
-		} elseif( $wgRightsUrl ) {
+		} elseif ( $wgRightsUrl ) {
 			$this->url( 'rights', $wgRightsUrl );
-		} elseif( $wgRightsText ) {
+		} elseif ( $wgRightsText ) {
 			$this->element( 'rights', $wgRightsText );
 		}
 	}
@@ -153,11 +155,11 @@ abstract class RdfMetaData {
 	protected function getTerms( $url ) {
 		global $wgLicenseTerms;
 
-		if( $wgLicenseTerms ) {
+		if ( $wgLicenseTerms ) {
 			return $wgLicenseTerms;
 		} else {
 			$known = $this->getKnownLicenses();
-			if( isset( $known[$url] ) ) {
+			if ( isset( $known[$url] ) ) {
 				return $known[$url];
 			} else {
 				return array();
@@ -173,7 +175,7 @@ abstract class RdfMetaData {
 
 		foreach ( $ccVersions as $version ) {
 			foreach ( $ccLicenses as $license ) {
-				if( $version == '2.0' && substr( $license, 0, 2 ) != 'by' ) {
+				if ( $version == '2.0' && substr( $license, 0, 2 ) != 'by' ) {
 					# 2.0 dropped the non-attribs licenses
 					continue;
 				}
diff --git a/includes/MimeMagic.php b/includes/MimeMagic.php
index edabd54c..8220e92f 100644
--- a/includes/MimeMagic.php
+++ b/includes/MimeMagic.php
@@ -39,7 +39,7 @@
  * appending MM_WELL_KNOWN_MIME_TYPES behind $wgMimeTypeFile, but who knows
  * what will break? In practice this probably isn't a problem anyway -- Bryan)
  */
-define('MM_WELL_KNOWN_MIME_TYPES', <<<END_STRING
+define( 'MM_WELL_KNOWN_MIME_TYPES', <<<END_STRING
 application/ogg ogx ogg ogm ogv oga spx
 application/pdf pdf
 application/vnd.oasis.opendocument.chart odc
@@ -91,7 +91,7 @@ END_STRING
  * An extensive list of well known mime types is provided by
  * the file mime.info in the includes directory.
  */
-define('MM_WELL_KNOWN_MIME_INFO', <<<END_STRING
+define( 'MM_WELL_KNOWN_MIME_INFO', <<<END_STRING
 application/pdf [OFFICE]
 application/vnd.oasis.opendocument.chart [OFFICE]
 application/vnd.oasis.opendocument.chart-template [OFFICE]
@@ -169,10 +169,6 @@ class MimeMagic {
 	 */
 	private static $instance;
 
-	/** True if the fileinfo extension has been loaded
-	 */
-	private static $extensionLoaded = false;
-
 	/** Initializes the MimeMagic object. This is called by MimeMagic::singleton().
 	 *
 	 * This constructor parses the mime.types and mime.info files and build internal mappings.
@@ -182,7 +178,7 @@ class MimeMagic {
 		 *   --- load mime.types ---
 		 */
 
-		global $wgMimeTypeFile, $IP, $wgLoadFileinfoExtension;
+		global $wgMimeTypeFile, $IP;
 
 		$types = MM_WELL_KNOWN_MIME_TYPES;
 
@@ -190,11 +186,6 @@ class MimeMagic {
 			$wgMimeTypeFile = "$IP/$wgMimeTypeFile";
 		}
 
-		if ( $wgLoadFileinfoExtension && !self::$extensionLoaded ) {
-			self::$extensionLoaded = true;
-			wfDl( 'fileinfo' );
-		}
-
 		if ( $wgMimeTypeFile ) {
 			if ( is_file( $wgMimeTypeFile ) and is_readable( $wgMimeTypeFile ) ) {
 				wfDebug( __METHOD__ . ": loading mime types from $wgMimeTypeFile\n" );
@@ -231,7 +222,7 @@ class MimeMagic {
 			}
 
 			$mime = substr( $s, 0, $i );
-			$ext = trim( substr( $s, $i+1 ) );
+			$ext = trim( substr( $s, $i + 1 ) );
 
 			if ( empty( $ext ) ) {
 				continue;
@@ -432,7 +423,7 @@ class MimeMagic {
 		$ext = explode( ' ', $ext );
 
 		$extension = strtolower( $extension );
-		return  in_array( $extension, $ext );
+		return in_array( $extension, $ext );
 	}
 
 	/**
@@ -560,7 +551,7 @@ class MimeMagic {
 
 		$mime = $this->doGuessMimeType( $file, $ext );
 
-		if( !$mime ) {
+		if ( !$mime ) {
 			wfDebug( __METHOD__ . ": internal type detection failed for $file (.$ext)...\n" );
 			$mime = $this->detectMimeType( $file, $ext );
 		}
@@ -587,7 +578,7 @@ class MimeMagic {
 		$f = fopen( $file, 'rt' );
 		wfRestoreWarnings();
 
-		if( !$f ) {
+		if ( !$f ) {
 			return 'unknown/unknown';
 		}
 		$head = fread( $f, 1024 );
@@ -628,7 +619,7 @@ class MimeMagic {
 			$doctype = strpos( $head, "\x42\x82" );
 			if ( $doctype ) {
 				// Next byte is datasize, then data (sizes larger than 1 byte are very stupid muxers)
-				$data = substr( $head, $doctype+3, 8 );
+				$data = substr( $head, $doctype + 3, 8 );
 				if ( strncmp( $data, "matroska", 8 ) == 0 ) {
 					wfDebug( __METHOD__ . ": recognized file as video/x-matroska\n" );
 					return "video/x-matroska";
@@ -642,7 +633,7 @@ class MimeMagic {
 		}
 
 		/* Look for WebP */
-		if ( strncmp( $head, "RIFF", 4 ) == 0 && strncmp( substr( $head, 8, 8), "WEBPVP8 ", 8 ) == 0 ) {
+		if ( strncmp( $head, "RIFF", 4 ) == 0 && strncmp( substr( $head, 8, 8 ), "WEBPVP8 ", 8 ) == 0 ) {
 			wfDebug( __METHOD__ . ": recognized file as image/webp\n" );
 			return "image/webp";
 		}
@@ -689,11 +680,11 @@ class MimeMagic {
 		$script_type = null;
 
 		# detect by shebang
-		if ( substr( $head, 0, 2) == "#!" ) {
+		if ( substr( $head, 0, 2 ) == "#!" ) {
 			$script_type = "ASCII";
-		} elseif ( substr( $head, 0, 5) == "\xef\xbb\xbf#!" ) {
+		} elseif ( substr( $head, 0, 5 ) == "\xef\xbb\xbf#!" ) {
 			$script_type = "UTF-8";
-		} elseif ( substr( $head, 0, 7) == "\xfe\xff\x00#\x00!" ) {
+		} elseif ( substr( $head, 0, 7 ) == "\xfe\xff\x00#\x00!" ) {
 			$script_type = "UTF-16BE";
 		} elseif ( substr( $head, 0, 7 ) == "\xff\xfe#\x00!" ) {
 			$script_type = "UTF-16LE";
@@ -705,8 +696,8 @@ class MimeMagic {
 				$pack = array( 'UTF-16BE' => 'n*', 'UTF-16LE' => 'v*' );
 				$chars = unpack( $pack[$script_type], substr( $head, 2 ) );
 				$head = '';
-				foreach( $chars as $codepoint ) {
-					if( $codepoint < 128 ) {
+				foreach ( $chars as $codepoint ) {
+					if ( $codepoint < 128 ) {
 						$head .= chr( $codepoint );
 					} else {
 						$head .= '?';
@@ -733,7 +724,7 @@ class MimeMagic {
 		$gis = getimagesize( $file );
 		wfRestoreWarnings();
 
-		if( $gis && isset( $gis['mime'] ) ) {
+		if ( $gis && isset( $gis['mime'] ) ) {
 			$mime = $gis['mime'];
 			wfDebug( __METHOD__ . ": getimagesize detected $file as $mime\n" );
 			return $mime;
@@ -741,7 +732,7 @@ class MimeMagic {
 
 		// Also test DjVu
 		$deja = new DjVuImage( $file );
-		if( $deja->isValid() ) {
+		if ( $deja->isValid() ) {
 			wfDebug( __METHOD__ . ": detected $file as image/vnd.djvu\n" );
 			return 'image/vnd.djvu';
 		}
@@ -763,7 +754,7 @@ class MimeMagic {
 	 * @return string
 	 */
 	function detectZipType( $header, $tail = null, $ext = false ) {
-		if( $ext ) { # TODO: remove $ext param
+		if ( $ext ) { # TODO: remove $ext param
 			wfDebug( __METHOD__ . ": WARNING: use of the \$ext parameter is deprecated. " .
 				"Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
 		}
@@ -804,7 +795,7 @@ class MimeMagic {
 				 * These mime's are stored in the database, where we don't really want
 				 * x-opc+zip, because we use it only for internal purposes
 				 */
-				if ( $this->isMatchingExtension( $ext, $mime) ) {
+				if ( $this->isMatchingExtension( $ext, $mime ) ) {
 					/* A known file extension for an OPC file,
 					 * find the proper mime type for that file extension
 					 */
@@ -815,12 +806,12 @@ class MimeMagic {
 			}
 			wfDebug( __METHOD__ . ": detected an Open Packaging Conventions archive: $mime\n" );
 		} elseif ( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" &&
-				($headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
+				( $headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
 				preg_match( $openxmlRegex, substr( $tail, $headerpos + 30 ) ) ) {
-			if ( substr( $header, 512, 4) == "\xEC\xA5\xC1\x00" ) {
+			if ( substr( $header, 512, 4 ) == "\xEC\xA5\xC1\x00" ) {
 				$mime = "application/msword";
 			}
-			switch( substr( $header, 512, 6) ) {
+			switch ( substr( $header, 512, 6 ) ) {
 				case "\xEC\xA5\xC1\x00\x0E\x00":
 				case "\xEC\xA5\xC1\x00\x1C\x00":
 				case "\xEC\xA5\xC1\x00\x43\x00":
@@ -876,9 +867,8 @@ class MimeMagic {
 
 		$m = null;
 		if ( $wgMimeDetectorCommand ) {
-			// @todo FIXME: Use wfShellExec
-			$fn = wfEscapeShellArg( $file );
-			$m = `$wgMimeDetectorCommand $fn`;
+			$args = wfEscapeShellArg( $file );
+			$m = wfShellExec( "$wgMimeDetectorCommand $args" );
 		} elseif ( function_exists( "finfo_open" ) && function_exists( "finfo_file" ) ) {
 
 			# This required the fileinfo extension by PECL,
@@ -897,7 +887,7 @@ class MimeMagic {
 				$m = finfo_file( $mime_magic_resource, $file );
 				finfo_close( $mime_magic_resource );
 			} else {
-				wfDebug( __METHOD__ . ": finfo_open failed on ".FILEINFO_MIME."!\n" );
+				wfDebug( __METHOD__ . ": finfo_open failed on " . FILEINFO_MIME . "!\n" );
 			}
 		} elseif ( function_exists( "mime_content_type" ) ) {
 
@@ -935,7 +925,7 @@ class MimeMagic {
 			$ext = strtolower( $i ? substr( $file, $i + 1 ) : '' );
 		}
 		if ( $ext ) {
-			if( $this->isRecognizableExtension( $ext ) ) {
+			if ( $this->isRecognizableExtension( $ext ) ) {
 				wfDebug( __METHOD__ . ": refusing to guess mime type for .$ext file, we should have recognized it\n" );
 			} else {
 				$m = $this->guessTypesForExtension( $ext );
@@ -968,12 +958,12 @@ class MimeMagic {
 	 * @return (int?string?) a value to be used with the MEDIATYPE_xxx constants.
 	 */
 	function getMediaType( $path = null, $mime = null ) {
-		if( !$mime && !$path ) {
+		if ( !$mime && !$path ) {
 			return MEDIATYPE_UNKNOWN;
 		}
 
 		// If mime type is unknown, guess it
-		if( !$mime ) {
+		if ( !$mime ) {
 			$mime = $this->guessMimeType( $path, false );
 		}
 
@@ -983,22 +973,30 @@ class MimeMagic {
 
 			// Read a chunk of the file
 			$f = fopen( $path, "rt" );
-			if ( !$f ) return MEDIATYPE_UNKNOWN;
+			if ( !$f ) {
+				return MEDIATYPE_UNKNOWN;
+			}
 			$head = fread( $f, 256 );
 			fclose( $f );
 
 			$head = strtolower( $head );
 
 			// This is an UGLY HACK, file should be parsed correctly
-			if ( strpos( $head, 'theora' ) !== false ) return MEDIATYPE_VIDEO;
-			elseif ( strpos( $head, 'vorbis' ) !== false ) return MEDIATYPE_AUDIO;
-			elseif ( strpos( $head, 'flac' ) !== false ) return MEDIATYPE_AUDIO;
-			elseif ( strpos( $head, 'speex' ) !== false ) return MEDIATYPE_AUDIO;
-			else return MEDIATYPE_MULTIMEDIA;
+			if ( strpos( $head, 'theora' ) !== false ) {
+				return MEDIATYPE_VIDEO;
+			} elseif ( strpos( $head, 'vorbis' ) !== false ) {
+				return MEDIATYPE_AUDIO;
+			} elseif ( strpos( $head, 'flac' ) !== false ) {
+				return MEDIATYPE_AUDIO;
+			} elseif ( strpos( $head, 'speex' ) !== false ) {
+				return MEDIATYPE_AUDIO;
+			} else {
+				return MEDIATYPE_MULTIMEDIA;
+			}
 		}
 
 		// Check for entry for full mime type
-		if( $mime ) {
+		if ( $mime ) {
 			$type = $this->findMediaType( $mime );
 			if ( $type !== MEDIATYPE_UNKNOWN ) {
 				return $type;
@@ -1029,7 +1027,7 @@ class MimeMagic {
 			}
 		}
 
-		if( !$type ) {
+		if ( !$type ) {
 			$type = MEDIATYPE_UNKNOWN;
 		}
 
diff --git a/includes/Namespace.php b/includes/Namespace.php
index fccfbedb..5c8e63b7 100644
--- a/includes/Namespace.php
+++ b/includes/Namespace.php
@@ -334,7 +334,7 @@ class MWNamespace {
 	public static function getContentNamespaces() {
 		global $wgContentNamespaces;
 		if ( !is_array( $wgContentNamespaces ) || $wgContentNamespaces === array() ) {
-			return NS_MAIN;
+			return array( NS_MAIN );
 		} elseif ( !in_array( NS_MAIN, $wgContentNamespaces ) ) {
 			// always force NS_MAIN to be part of array (to match the algorithm used by isContent)
 			return array_merge( array( NS_MAIN ), $wgContentNamespaces );
@@ -387,9 +387,9 @@ class MWNamespace {
 		if ( in_array( $index, self::$alwaysCapitalizedNamespaces ) ) {
 			return true;
 		}
-		if ( isset( $wgCapitalLinkOverrides[ $index ] ) ) {
+		if ( isset( $wgCapitalLinkOverrides[$index] ) ) {
 			// $wgCapitalLinkOverrides is explicitly set
-			return $wgCapitalLinkOverrides[ $index ];
+			return $wgCapitalLinkOverrides[$index];
 		}
 		// Default to the global setting
 		return $wgCapitalLinks;
diff --git a/includes/OutputHandler.php b/includes/OutputHandler.php
index 6b40c307..3860b8e2 100644
--- a/includes/OutputHandler.php
+++ b/includes/OutputHandler.php
@@ -31,11 +31,19 @@ function wfOutputHandler( $s ) {
 	global $wgDisableOutputCompression, $wgValidateAllHtml;
 	$s = wfMangleFlashPolicy( $s );
 	if ( $wgValidateAllHtml ) {
-		$headers = apache_response_headers();
-		$isHTML = true;
-		foreach ( $headers as $name => $value ) {
-			if ( strtolower( $name ) == 'content-type' && strpos( $value, 'text/html' ) === false && strpos( $value, 'application/xhtml+xml' ) === false ) {
-				$isHTML = false;
+		$headers = headers_list();
+		$isHTML = false;
+		foreach ( $headers as $header ) {
+			$parts = explode( ':', $header, 2 );
+			if ( count( $parts ) !== 2 ) {
+				continue;
+			}
+			$name = strtolower( trim( $parts[0] ) );
+			$value = trim( $parts[1] );
+			if ( $name == 'content-type' && ( strpos( $value, 'text/html' ) === 0
+				|| strpos( $value, 'application/xhtml+xml' ) === 0 )
+			) {
+				$isHTML = true;
 				break;
 			}
 		}
@@ -64,10 +72,10 @@ function wfOutputHandler( $s ) {
  */
 function wfRequestExtension() {
 	/// @todo FIXME: this sort of dupes some code in WebRequest::getRequestUrl()
-	if( isset( $_SERVER['REQUEST_URI'] ) ) {
+	if ( isset( $_SERVER['REQUEST_URI'] ) ) {
 		// Strip the query string...
 		list( $path ) = explode( '?', $_SERVER['REQUEST_URI'], 2 );
-	} elseif( isset( $_SERVER['SCRIPT_NAME'] ) ) {
+	} elseif ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
 		// Probably IIS. QUERY_STRING appears separately.
 		$path = $_SERVER['SCRIPT_NAME'];
 	} else {
@@ -76,7 +84,7 @@ function wfRequestExtension() {
 	}
 
 	$period = strrpos( $path, '.' );
-	if( $period !== false ) {
+	if ( $period !== false ) {
 		return strtolower( substr( $path, $period ) );
 	}
 	return '';
@@ -91,17 +99,17 @@ function wfRequestExtension() {
  * @return string
  */
 function wfGzipHandler( $s ) {
-	if( !function_exists( 'gzencode' ) ) {
+	if ( !function_exists( 'gzencode' ) ) {
 		wfDebug( __FUNCTION__ . "() skipping compression (gzencode unavailable)\n" );
 		return $s;
 	}
-	if( headers_sent() ) {
+	if ( headers_sent() ) {
 		wfDebug( __FUNCTION__ . "() skipping compression (headers already sent)\n" );
 		return $s;
 	}
 
 	$ext = wfRequestExtension();
-	if( $ext == '.gz' || $ext == '.tgz' ) {
+	if ( $ext == '.gz' || $ext == '.tgz' ) {
 		// Don't do gzip compression if the URL path ends in .gz or .tgz
 		// This confuses Safari and triggers a download of the page,
 		// even though it's pretty clearly labeled as viewable HTML.
@@ -109,7 +117,7 @@ function wfGzipHandler( $s ) {
 		return $s;
 	}
 
-	if( wfClientAcceptsGzip() ) {
+	if ( wfClientAcceptsGzip() ) {
 		wfDebug( __FUNCTION__ . "() is compressing output\n" );
 		header( 'Content-Encoding: gzip' );
 		$s = gzencode( $s, 6 );
@@ -177,20 +185,8 @@ function wfHtmlValidationHandler( $s ) {
 
 	header( 'Cache-Control: no-cache' );
 
-	$out = <<<EOT
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" dir="ltr">
-<head>
-<title>HTML validation error</title>
-<style>
-.highlight { background-color: #ffc }
-li { white-space: pre }
-</style>
-</head>
-<body>
-<h1>HTML validation error</h1>
-<ul>
-EOT;
+	$out = Html::element( 'h1', null, 'HTML validation error' );
+	$out .= Html::openElement( 'ul' );
 
 	$error = strtok( $errors, "\n" );
 	$badLines = array();
@@ -198,26 +194,40 @@ EOT;
 		if ( preg_match( '/^line (\d+)/', $error, $m ) ) {
 			$lineNum = intval( $m[1] );
 			$badLines[$lineNum] = true;
-			$out .= "<li><a href=\"#line-{$lineNum}\">" . htmlspecialchars( $error ) . "</a></li>\n";
+			$out .= Html::rawElement( 'li', null,
+				Html::element( 'a', array( 'href' => "#line-{$lineNum}" ), $error ) ) . "\n";
 		}
 		$error = strtok( "\n" );
 	}
 
-	$out .= '</ul>';
-	$out .= '<pre>' . htmlspecialchars( $errors ) . '</pre>';
-	$out .= "<ol>\n";
+	$out .= Html::closeElement( 'ul' );
+	$out .= Html::element( 'pre', null, $errors );
+	$out .= Html::openElement( 'ol' ) . "\n";
 	$line = strtok( $s, "\n" );
 	$i = 1;
 	while ( $line !== false ) {
+		$attrs = array();
 		if ( isset( $badLines[$i] ) ) {
-			$out .= "<li class=\"highlight\" id=\"line-$i\">";
-		} else {
-			$out .= '<li>';
+			$attrs['class'] = 'highlight';
+			$attrs['id'] = "line-$i";
 		}
-		$out .= htmlspecialchars( $line ) . "</li>\n";
+		$out .= Html::element( 'li', $attrs, $line ) . "\n";
 		$line = strtok( "\n" );
 		$i++;
 	}
-	$out .= '</ol></body></html>';
+	$out .= Html::closeElement( 'ol' );
+
+	$style = <<<CSS
+.highlight { background-color: #ffc }
+li { white-space: pre }
+CSS;
+
+	$out = Html::htmlHeader( array( 'lang' => 'en', 'dir' => 'ltr' ) ) .
+		Html::rawElement( 'head', null,
+			Html::element( 'title', null, 'HTML validation error' ) .
+			Html::inlineStyle( $style ) ) .
+		Html::rawElement( 'body', null, $out ) .
+		Html::closeElement( 'html' );
+
 	return $out;
 }
diff --git a/includes/OutputPage.php b/includes/OutputPage.php
index 1e0c396a..7f0454f6 100644
--- a/includes/OutputPage.php
+++ b/includes/OutputPage.php
@@ -39,9 +39,6 @@ class OutputPage extends ContextSource {
 	/// Should be private. Used with addMeta() which adds "<meta>"
 	var $mMetatags = array();
 
-	/// "<meta keywords='stuff'>" most of the time the first 10 links to an article
-	var $mKeywords = array();
-
 	var $mLinktags = array();
 	var $mCanonicalUrl = false;
 
@@ -253,6 +250,16 @@ class OutputPage extends ContextSource {
 	 */
 	private $mProperties = array();
 
+	/**
+	 * @var string|null: ResourceLoader target for load.php links. If null, will be omitted
+	 */
+	private $mTarget = null;
+
+	/**
+	 * @var bool: Whether output should contain table of contents
+	 */
+	private $mEnableTOC = true;
+
 	/**
 	 * Constructor for OutputPage. This should not be called directly.
 	 * Instead a new RequestContext should be created and it will implicitly create
@@ -308,19 +315,6 @@ class OutputPage extends ContextSource {
 		array_push( $this->mMetatags, array( $name, $val ) );
 	}
 
-	/**
-	 * Add a keyword or a list of keywords in the page header
-	 *
-	 * @param string $text or array of strings
-	 */
-	function addKeyword( $text ) {
-		if( is_array( $text ) ) {
-			$this->mKeywords = array_merge( $this->mKeywords, $text );
-		} else {
-			array_push( $this->mKeywords, $text );
-		}
-	}
-
 	/**
 	 * Add a new \<link\> tag to the page header.
 	 *
@@ -408,13 +402,14 @@ class OutputPage extends ContextSource {
 	public function addScriptFile( $file, $version = null ) {
 		global $wgStylePath, $wgStyleVersion;
 		// See if $file parameter is an absolute URL or begins with a slash
-		if( substr( $file, 0, 1 ) == '/' || preg_match( '#^[a-z]*://#i', $file ) ) {
+		if ( substr( $file, 0, 1 ) == '/' || preg_match( '#^[a-z]*://#i', $file ) ) {
 			$path = $file;
 		} else {
 			$path = "{$wgStylePath}/common/{$file}";
 		}
-		if ( is_null( $version ) )
+		if ( is_null( $version ) ) {
 			$version = $wgStyleVersion;
+		}
 		$this->addScript( Html::linkedScript( wfAppendQuery( $path, $version ) ) );
 	}
 
@@ -447,11 +442,12 @@ class OutputPage extends ContextSource {
 	protected function filterModules( $modules, $position = null, $type = ResourceLoaderModule::TYPE_COMBINED ) {
 		$resourceLoader = $this->getResourceLoader();
 		$filteredModules = array();
-		foreach( $modules as $val ) {
+		foreach ( $modules as $val ) {
 			$module = $resourceLoader->getModule( $val );
-			if( $module instanceof ResourceLoaderModule
+			if ( $module instanceof ResourceLoaderModule
 				&& $module->getOrigin() <= $this->getAllowedModules( $type )
-				&& ( is_null( $position ) || $module->getPosition() == $position ) )
+				&& ( is_null( $position ) || $module->getPosition() == $position )
+				&& ( !$this->mTarget || in_array( $this->mTarget, $module->getTargets() ) ) )
 			{
 				$filteredModules[] = $val;
 			}
@@ -556,6 +552,22 @@ class OutputPage extends ContextSource {
 		$this->mModuleMessages = array_merge( $this->mModuleMessages, (array)$modules );
 	}
 
+	/**
+	 * @return null|string: ResourceLoader target
+	 */
+	public function getTarget() {
+		return $this->mTarget;
+	}
+
+	/**
+	 * Sets ResourceLoader target for load.php links. If null, will be omitted
+	 *
+	 * @param $target string|null
+	 */
+	public function setTarget( $target ) {
+		$this->mTarget = $target;
+	}
+
 	/**
 	 * Get an array of head items
 	 *
@@ -662,20 +674,20 @@ class OutputPage extends ContextSource {
 	 *
 	 * @param $timestamp string
 	 *
-	 * @return Boolean: true iff cache-ok headers was sent.
+	 * @return Boolean: true if cache-ok headers was sent.
 	 */
 	public function checkLastModified( $timestamp ) {
-		global $wgCachePages, $wgCacheEpoch;
+		global $wgCachePages, $wgCacheEpoch, $wgUseSquid, $wgSquidMaxage;
 
 		if ( !$timestamp || $timestamp == '19700101000000' ) {
 			wfDebug( __METHOD__ . ": CACHE DISABLED, NO TIMESTAMP\n" );
 			return false;
 		}
-		if( !$wgCachePages ) {
+		if ( !$wgCachePages ) {
 			wfDebug( __METHOD__ . ": CACHE DISABLED\n", false );
 			return false;
 		}
-		if( $this->getUser()->getOption( 'nocache' ) ) {
+		if ( $this->getUser()->getOption( 'nocache' ) ) {
 			wfDebug( __METHOD__ . ": USER DISABLED CACHE\n", false );
 			return false;
 		}
@@ -686,6 +698,10 @@ class OutputPage extends ContextSource {
 			'user' => $this->getUser()->getTouched(),
 			'epoch' => $wgCacheEpoch
 		);
+		if ( $wgUseSquid ) {
+			// bug 44570: the core page itself may not change, but resources might
+			$modifiedTimes['sepoch'] = wfTimestamp( TS_MW, time() - $wgSquidMaxage );
+		}
 		wfRunHooks( 'OutputPageCheckLastModified', array( &$modifiedTimes ) );
 
 		$maxModified = max( $modifiedTimes );
@@ -724,7 +740,7 @@ class OutputPage extends ContextSource {
 			wfTimestamp( TS_ISO_8601, $clientHeaderTime ) . "\n", false );
 		wfDebug( __METHOD__ . ": effective Last-Modified: " .
 			wfTimestamp( TS_ISO_8601, $maxModified ) . "\n", false );
-		if( $clientHeaderTime < $maxModified ) {
+		if ( $clientHeaderTime < $maxModified ) {
 			wfDebug( __METHOD__ . ": STALE, $info\n", false );
 			return false;
 		}
@@ -766,10 +782,10 @@ class OutputPage extends ContextSource {
 	public function setRobotPolicy( $policy ) {
 		$policy = Article::formatRobotPolicy( $policy );
 
-		if( isset( $policy['index'] ) ) {
+		if ( isset( $policy['index'] ) ) {
 			$this->setIndexPolicy( $policy['index'] );
 		}
-		if( isset( $policy['follow'] ) ) {
+		if ( isset( $policy['follow'] ) ) {
 			$this->setFollowPolicy( $policy['follow'] );
 		}
 	}
@@ -783,7 +799,7 @@ class OutputPage extends ContextSource {
 	 */
 	public function setIndexPolicy( $policy ) {
 		$policy = trim( $policy );
-		if( in_array( $policy, array( 'index', 'noindex' ) ) ) {
+		if ( in_array( $policy, array( 'index', 'noindex' ) ) ) {
 			$this->mIndexPolicy = $policy;
 		}
 	}
@@ -797,7 +813,7 @@ class OutputPage extends ContextSource {
 	 */
 	public function setFollowPolicy( $policy ) {
 		$policy = trim( $policy );
-		if( in_array( $policy, array( 'follow', 'nofollow' ) ) ) {
+		if ( in_array( $policy, array( 'follow', 'nofollow' ) ) ) {
 			$this->mFollowPolicy = $policy;
 		}
 	}
@@ -1269,7 +1285,6 @@ class OutputPage extends ContextSource {
 	 * Return whether user JavaScript is allowed for this page
 	 * @deprecated since 1.18 Load modules with ResourceLoader, and origin and
 	 *     trustworthiness is identified and enforced automagically.
-	 *     Will be removed in 1.20.
 	 * @return Boolean
 	 */
 	public function isUserJsAllowed() {
@@ -1284,7 +1299,7 @@ class OutputPage extends ContextSource {
 	 * @return Int ResourceLoaderModule ORIGIN_ class constant
 	 */
 	public function getAllowedModules( $type ) {
-		if( $type == ResourceLoaderModule::TYPE_COMBINED ) {
+		if ( $type == ResourceLoaderModule::TYPE_COMBINED ) {
 			return min( array_values( $this->mAllowedModules ) );
 		} else {
 			return isset( $this->mAllowedModules[$type] )
@@ -1401,7 +1416,7 @@ class OutputPage extends ContextSource {
 	 * @param $timestamp Mixed: string, or null
 	 * @return Mixed: previous value
 	 */
-	public function setRevisionTimestamp( $timestamp) {
+	public function setRevisionTimestamp( $timestamp ) {
 		return wfSetVar( $this->mRevisionTimestamp, $timestamp );
 	}
 
@@ -1524,7 +1539,7 @@ class OutputPage extends ContextSource {
 
 		$popts = $this->parserOptions();
 		$oldTidy = $popts->setTidy( $tidy );
-		$popts->setInterfaceMessage( (bool) $interface );
+		$popts->setInterfaceMessage( (bool)$interface );
 
 		$parserOutput = $wgParser->parse(
 			$text, $title, $popts,
@@ -1582,6 +1597,10 @@ class OutputPage extends ContextSource {
 			}
 		}
 
+		// Link flags are ignored for now, but may in the future be
+		// used to mark individual language links.
+		$linkFlags = array();
+		wfRunHooks( 'LanguageLinks', array( $this->getTitle(), &$this->mLanguageLinks, &$linkFlags ) );
 		wfRunHooks( 'OutputPageParserOutput', array( &$this, $parserOutput ) );
 	}
 
@@ -1592,6 +1611,7 @@ class OutputPage extends ContextSource {
 	 */
 	function addParserOutput( &$parserOutput ) {
 		$this->addParserOutputNoText( $parserOutput );
+		$parserOutput->setTOCEnabled( $this->mEnableTOC );
 		$text = $parserOutput->getText();
 		wfRunHooks( 'OutputPageBeforeHTML', array( &$this, &$text ) );
 		$this->addHTML( $text );
@@ -1626,7 +1646,7 @@ class OutputPage extends ContextSource {
 	public function parse( $text, $linestart = true, $interface = false, $language = null ) {
 		global $wgParser;
 
-		if( is_null( $this->getTitle() ) ) {
+		if ( is_null( $this->getTitle() ) ) {
 			throw new MWException( 'Empty $mTitle in ' . __METHOD__ );
 		}
 
@@ -1707,6 +1727,7 @@ class OutputPage extends ContextSource {
 				array(
 					"{$wgCookiePrefix}Token",
 					"{$wgCookiePrefix}LoggedOut",
+					"forceHTTPS",
 					session_name()
 				),
 				$wgCacheVaryCookies
@@ -1750,8 +1771,8 @@ class OutputPage extends ContextSource {
 	public function addVaryHeader( $header, $option = null ) {
 		if ( !array_key_exists( $header, $this->mVaryHeader ) ) {
 			$this->mVaryHeader[$header] = (array)$option;
-		} elseif( is_array( $option ) ) {
-			if( is_array( $this->mVaryHeader[$header] ) ) {
+		} elseif ( is_array( $option ) ) {
+			if ( is_array( $this->mVaryHeader[$header] ) ) {
 				$this->mVaryHeader[$header] = array_merge( $this->mVaryHeader[$header], $option );
 			} else {
 				$this->mVaryHeader[$header] = $option;
@@ -1785,7 +1806,7 @@ class OutputPage extends ContextSource {
 		$this->addVaryHeader( 'Cookie', $cookiesOption );
 
 		$headers = array();
-		foreach( $this->mVaryHeader as $header => $option ) {
+		foreach ( $this->mVaryHeader as $header => $option ) {
 			$newheader = $header;
 			if ( is_array( $option ) && count( $option ) > 0 ) {
 				$newheader .= ';' . implode( ';', $option );
@@ -1807,11 +1828,11 @@ class OutputPage extends ContextSource {
 	 */
 	function addAcceptLanguage() {
 		$lang = $this->getTitle()->getPageLanguage();
-		if( !$this->getRequest()->getCheck( 'variant' ) && $lang->hasVariants() ) {
+		if ( !$this->getRequest()->getCheck( 'variant' ) && $lang->hasVariants() ) {
 			$variants = $lang->getVariants();
 			$aloption = array();
 			foreach ( $variants as $variant ) {
-				if( $variant === $lang->getCode() ) {
+				if ( $variant === $lang->getCode() ) {
 					continue;
 				} else {
 					$aloption[] = 'string-contains=' . $variant;
@@ -1892,12 +1913,11 @@ class OutputPage extends ContextSource {
 			$response->header( $this->getXVO() );
 		}
 
-		if( $this->mEnableClientCache ) {
-			if(
+		if ( $this->mEnableClientCache ) {
+			if (
 				$wgUseSquid && session_id() == '' && !$this->isPrintable() &&
 				$this->mSquidMaxage != 0 && !$this->haveCacheVaryCookies()
-			)
-			{
+			) {
 				if ( $wgUseESI ) {
 					# We'll purge the proxy cache explicitly, but require end user agents
 					# to revalidate against the proxy on each visit.
@@ -1924,7 +1944,7 @@ class OutputPage extends ContextSource {
 				$response->header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', 0 ) . ' GMT' );
 				$response->header( "Cache-Control: private, must-revalidate, max-age=0" );
 			}
-			if( $this->mLastModified ) {
+			if ( $this->mLastModified ) {
 				$response->header( "Last-Modified: {$this->mLastModified}" );
 			}
 		} else {
@@ -1957,9 +1977,10 @@ class OutputPage extends ContextSource {
 	 * the object, let's actually output it:
 	 */
 	public function output() {
-		global $wgLanguageCode, $wgDebugRedirects, $wgMimeType, $wgVaryOnXFP;
+		global $wgLanguageCode, $wgDebugRedirects, $wgMimeType, $wgVaryOnXFP,
+			$wgUseAjax, $wgResponsiveImages;
 
-		if( $this->mDoNothing ) {
+		if ( $this->mDoNothing ) {
 			return;
 		}
 
@@ -1974,9 +1995,9 @@ class OutputPage extends ContextSource {
 			$redirect = $this->mRedirect;
 			$code = $this->mRedirectCode;
 
-			if( wfRunHooks( "BeforePageRedirect", array( $this, &$redirect, &$code ) ) ) {
-				if( $code == '301' || $code == '303' ) {
-					if( !$wgDebugRedirects ) {
+			if ( wfRunHooks( "BeforePageRedirect", array( $this, &$redirect, &$code ) ) ) {
+				if ( $code == '301' || $code == '303' ) {
+					if ( !$wgDebugRedirects ) {
 						$message = HttpStatus::getMessage( $code );
 						$response->header( "HTTP/1.1 $code $message" );
 					}
@@ -1988,7 +2009,7 @@ class OutputPage extends ContextSource {
 				$this->sendCacheControl();
 
 				$response->header( "Content-Type: text/html; charset=utf-8" );
-				if( $wgDebugRedirects ) {
+				if ( $wgDebugRedirects ) {
 					$url = htmlspecialchars( $redirect );
 					print "<html>\n<head>\n<title>Redirect</title>\n</head>\n<body>\n";
 					print "<p>Location: <a href=\"$url\">$url</a></p>\n";
@@ -2020,11 +2041,34 @@ class OutputPage extends ContextSource {
 		}
 
 		if ( $this->mArticleBodyOnly ) {
-			$this->out( $this->mBodytext );
+			echo $this->mBodytext;
 		} else {
-			$this->addDefaultModules();
 
 			$sk = $this->getSkin();
+			// add skin specific modules
+			$modules = $sk->getDefaultModules();
+
+			// enforce various default modules for all skins
+			$coreModules = array(
+				// keep this list as small as possible
+				'mediawiki.page.startup',
+				'mediawiki.user',
+			);
+
+			// Support for high-density display images if enabled
+			if ( $wgResponsiveImages ) {
+				$coreModules[] = 'mediawiki.hidpi';
+			}
+
+			$this->addModules( $coreModules );
+			foreach ( $modules as $group ) {
+				$this->addModules( $group );
+			}
+			MWDebug::addModules( $this );
+			if ( $wgUseAjax ) {
+				// FIXME: deprecate? - not clear why this is useful
+				wfRunHooks( 'AjaxAddScript', array( &$this ) );
+			}
 
 			// Hook that allows last minute changes to the output page, e.g.
 			// adding of CSS or Javascript by extensions.
@@ -2046,11 +2090,13 @@ class OutputPage extends ContextSource {
 	}
 
 	/**
-	 * Actually output something with print().
+	 * Actually output something with print.
 	 *
 	 * @param string $ins the string to output
+	 * @deprecated since 1.22 Use echo yourself.
 	 */
 	public function out( $ins ) {
+		wfDeprecated( __METHOD__, '1.22' );
 		print $ins;
 	}
 
@@ -2097,7 +2143,7 @@ class OutputPage extends ContextSource {
 	 * @param array $params message parameters; ignored if $msg is a Message object
 	 */
 	public function showErrorPage( $title, $msg, $params = array() ) {
-		if( !$title instanceof Message ) {
+		if ( !$title instanceof Message ) {
 			$title = $this->msg( $title );
 		}
 
@@ -2238,7 +2284,7 @@ class OutputPage extends ContextSource {
 		if ( count( $errors ) > 1 ) {
 			$text .= '<ul class="permissions-errors">' . "\n";
 
-			foreach( $errors as $error ) {
+			foreach ( $errors as $error ) {
 				$text .= '<li>';
 				$text .= call_user_func_array( array( $this, 'msg' ), $error )->plain();
 				$text .= "</li>\n";
@@ -2286,7 +2332,7 @@ class OutputPage extends ContextSource {
 
 		if ( !empty( $reasons ) ) {
 			// Permissions error
-			if( $source ) {
+			if ( $source ) {
 				$this->setPageTitle( $this->msg( 'viewsource-title', $this->getTitle()->getPrefixedText() ) );
 				$this->addBacklinkSubtitle( $this->getTitle() );
 			} else {
@@ -2299,7 +2345,7 @@ class OutputPage extends ContextSource {
 		}
 
 		// Show source, if supplied
-		if( is_string( $source ) ) {
+		if ( is_string( $source ) ) {
 			$this->addWikiMsg( 'viewsourcetext' );
 
 			$pageLang = $this->getTitle()->getPageLanguage();
@@ -2325,7 +2371,7 @@ $templates
 		# If the title doesn't exist, it's fairly pointless to print a return
 		# link to it.  After all, you just tried editing it and couldn't, so
 		# what's there to do there?
-		if( $this->getTitle()->exists() ) {
+		if ( $this->getTitle()->exists() ) {
 			$this->returnToMain( null, $this->getTitle() );
 		}
 	}
@@ -2349,7 +2395,7 @@ $templates
 	 */
 	public function showLagWarning( $lag ) {
 		global $wgSlaveLagWarning, $wgSlaveLagCritical;
-		if( $lag >= $wgSlaveLagWarning ) {
+		if ( $lag >= $wgSlaveLagWarning ) {
 			$message = $lag < $wgSlaveLagCritical
 				? 'lag-warn-normal'
 				: 'lag-warn-high';
@@ -2393,15 +2439,6 @@ $templates
 	 * @param $options Options array to pass to Linker
 	 */
 	public function addReturnTo( $title, $query = array(), $text = null, $options = array() ) {
-		if( in_array( 'http', $options ) ) {
-			$proto = PROTO_HTTP;
-		} elseif( in_array( 'https', $options ) ) {
-			$proto = PROTO_HTTPS;
-		} else {
-			$proto = PROTO_RELATIVE;
-		}
-
-		$this->addLink( array( 'rel' => 'next', 'href' => $title->getFullURL( '', false, $proto ) ) );
 		$link = $this->msg( 'returnto' )->rawParams(
 			Linker::link( $title, $text, array(), $query, $options ) )->escaped();
 		$this->addHTML( "<p id=\"mw-returnto\">{$link}</p>\n" );
@@ -2446,15 +2483,11 @@ $templates
 	 * @return String: The doctype, opening "<html>", and head element.
 	 */
 	public function headElement( Skin $sk, $includeStyle = true ) {
-		global $wgContLang;
+		global $wgContLang, $wgMimeType;
 
 		$userdir = $this->getLanguage()->getDir();
 		$sitedir = $wgContLang->getDir();
 
-		if ( $sk->commonPrintStylesheet() ) {
-			$this->addModuleStyles( 'mediawiki.legacy.wikiprintable' );
-		}
-
 		$ret = Html::htmlHeader( array( 'lang' => $this->getLanguage()->getHtmlCode(), 'dir' => $userdir, 'class' => 'client-nojs' ) );
 
 		if ( $this->getHTMLTitle() == '' ) {
@@ -2467,10 +2500,22 @@ $templates
 			$ret .= "$openHead\n";
 		}
 
+		if ( !Html::isXmlMimeType( $wgMimeType ) ) {
+			// Add <meta charset="UTF-8">
+			// This should be before <title> since it defines the charset used by
+			// text including the text inside <title>.
+			// The spec recommends defining XHTML5's charset using the XML declaration
+			// instead of meta.
+			// Our XML declaration is output by Html::htmlHeader.
+			// http://www.whatwg.org/html/semantics.html#attr-meta-http-equiv-content-type
+			// http://www.whatwg.org/html/semantics.html#charset
+			$ret .= Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
+		}
+
 		$ret .= Html::element( 'title', null, $this->getHTMLTitle() ) . "\n";
 
 		$ret .= implode( "\n", array(
-			$this->getHeadLinks( null, true ),
+			$this->getHeadLinks(),
 			$this->buildCssLinks(),
 			$this->getHeadScripts(),
 			$this->getHeadItems()
@@ -2481,20 +2526,29 @@ $templates
 			$ret .= "$closeHead\n";
 		}
 
-		$bodyAttrs = array();
+		$bodyClasses = array();
+		$bodyClasses[] = 'mediawiki';
 
 		# Classes for LTR/RTL directionality support
-		$bodyAttrs['class'] = "mediawiki $userdir sitedir-$sitedir";
+		$bodyClasses[] = $userdir;
+		$bodyClasses[] = "sitedir-$sitedir";
 
 		if ( $this->getLanguage()->capitalizeAllNouns() ) {
 			# A <body> class is probably not the best way to do this . . .
-			$bodyAttrs['class'] .= ' capitalize-all-nouns';
+			$bodyClasses[] = 'capitalize-all-nouns';
 		}
-		$bodyAttrs['class'] .= ' ' . $sk->getPageClasses( $this->getTitle() );
-		$bodyAttrs['class'] .= ' skin-' . Sanitizer::escapeClass( $sk->getSkinName() );
-		$bodyAttrs['class'] .= ' action-' . Sanitizer::escapeClass( Action::getActionName( $this->getContext() ) );
 
-		$sk->addToBodyAttributes( $this, $bodyAttrs ); // Allow skins to add body attributes they need
+		$bodyClasses[] = $sk->getPageClasses( $this->getTitle() );
+		$bodyClasses[] = 'skin-' . Sanitizer::escapeClass( $sk->getSkinName() );
+		$bodyClasses[] = 'action-' . Sanitizer::escapeClass( Action::getActionName( $this->getContext() ) );
+
+		$bodyAttrs = array();
+		// While the implode() is not strictly needed, it's used for backwards compatibility
+		// (this used to be built as a string and hooks likely still expect that).
+		$bodyAttrs['class'] = implode( ' ', $bodyClasses );
+
+		// Allow skins and extensions to add body attributes they need
+		$sk->addToBodyAttributes( $this, $bodyAttrs );
 		wfRunHooks( 'OutputPageBodyAttributes', array( $this, $sk, &$bodyAttrs ) );
 
 		$ret .= Html::openElement( 'body', $bodyAttrs ) . "\n";
@@ -2502,59 +2556,6 @@ $templates
 		return $ret;
 	}
 
-	/**
-	 * Add the default ResourceLoader modules to this object
-	 */
-	private function addDefaultModules() {
-		global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax,
-			$wgAjaxWatch, $wgResponsiveImages;
-
-		// Add base resources
-		$this->addModules( array(
-			'mediawiki.user',
-			'mediawiki.page.startup',
-			'mediawiki.page.ready',
-		) );
-		if ( $wgIncludeLegacyJavaScript ) {
-			$this->addModules( 'mediawiki.legacy.wikibits' );
-		}
-
-		if ( $wgPreloadJavaScriptMwUtil ) {
-			$this->addModules( 'mediawiki.util' );
-		}
-
-		MWDebug::addModules( $this );
-
-		// Add various resources if required
-		if ( $wgUseAjax ) {
-			$this->addModules( 'mediawiki.legacy.ajax' );
-
-			wfRunHooks( 'AjaxAddScript', array( &$this ) );
-
-			if( $wgAjaxWatch && $this->getUser()->isLoggedIn() ) {
-				$this->addModules( 'mediawiki.page.watch.ajax' );
-			}
-
-			if ( !$this->getUser()->getOption( 'disablesuggest', false ) ) {
-				$this->addModules( 'mediawiki.searchSuggest' );
-			}
-		}
-
-		if ( $this->getUser()->getBoolOption( 'editsectiononrightclick' ) ) {
-			$this->addModules( 'mediawiki.action.view.rightClickEdit' );
-		}
-
-		# Crazy edit-on-double-click stuff
-		if ( $this->isArticle() && $this->getUser()->getOption( 'editondblclick' ) ) {
-			$this->addModules( 'mediawiki.action.view.dblClickEdit' );
-		}
-
-		// Support for high-density display images
-		if ( $wgResponsiveImages ) {
-			$this->addModules( 'mediawiki.hidpi' );
-		}
-	}
-
 	/**
 	 * Get a ResourceLoader object associated with this OutputPage
 	 *
@@ -2579,7 +2580,7 @@ $templates
 	protected function makeResourceLoaderLink( $modules, $only, $useESI = false, array $extraQuery = array(), $loadCall = false ) {
 		global $wgResourceLoaderUseESI;
 
-		$modules = (array) $modules;
+		$modules = (array)$modules;
 
 		if ( !count( $modules ) ) {
 			return '';
@@ -2600,6 +2601,9 @@ $templates
 				return $links;
 			}
 		}
+		if ( !is_null( $this->mTarget ) ) {
+			$extraQuery['target'] = $this->mTarget;
+		}
 
 		// Create keyed-by-group list of module objects from modules list
 		$groups = array();
@@ -2612,8 +2616,8 @@ $templates
 					&& $only == ResourceLoaderModule::TYPE_SCRIPTS )
 				|| ( $module->getOrigin() > $this->getAllowedModules( ResourceLoaderModule::TYPE_STYLES )
 					&& $only == ResourceLoaderModule::TYPE_STYLES )
-				)
-			{
+				|| ( $this->mTarget && !in_array( $this->mTarget, $module->getTargets() ) )
+			) {
 				continue;
 			}
 
@@ -2648,7 +2652,7 @@ $templates
 			);
 			$context = new ResourceLoaderContext( $resourceLoader, new FauxRequest( $query ) );
 			// Extract modules that know they're empty
-			$emptyModules = array ();
+			$emptyModules = array();
 			foreach ( $grpModules as $key => $module ) {
 				if ( $module->isKnownEmpty( $context ) ) {
 					$emptyModules[$key] = 'ready';
@@ -2659,13 +2663,9 @@ $templates
 			if ( count( $emptyModules ) > 0 && $only !== ResourceLoaderModule::TYPE_STYLES ) {
 				// If we're only getting the styles, we don't need to do anything for empty modules.
 				$links .= Html::inlineScript(
-
 						ResourceLoader::makeLoaderConditionalScript(
-
 								ResourceLoader::makeLoaderStateScript( $emptyModules )
-
 						)
-
 				) . "\n";
 			}
 
@@ -2732,7 +2732,7 @@ $templates
 				// Automatically select style/script elements
 				if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
 					$link = Html::linkedStyle( $url );
-				} else if ( $loadCall ) {
+				} elseif ( $loadCall ) {
 					$link = Html::inlineScript(
 						ResourceLoader::makeLoaderConditionalScript(
 							Xml::encodeJsCall( 'mw.loader.load', array( $url, 'text/javascript', true ) )
@@ -2743,7 +2743,7 @@ $templates
 				}
 			}
 
-			if( $group == 'noscript' ) {
+			if ( $group == 'noscript' ) {
 				$links .= Html::rawElement( 'noscript', array(), $link ) . "\n";
 			} else {
 				$links .= $link . "\n";
@@ -2847,14 +2847,14 @@ $templates
 			);
 			$defaultModules['site'] = 'loading';
 		} else {
-			// The wiki is configured to not allow a site module.
-			$defaultModules['site'] = 'missing';
+			// Site module is empty, save request by marking ready in advance (bug 46857)
+			$defaultModules['site'] = 'ready';
 		}
 
 		// Add user JS if enabled
 		if ( $wgAllowUserJs ) {
 			if ( $this->getUser()->isLoggedIn() ) {
-				if( $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
+				if ( $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
 					# XXX: additional security check/prompt?
 					// We're on a preview of a JS subpage
 					// Exclude this page from the user module in case it's in there (bug 26283)
@@ -2874,15 +2874,14 @@ $templates
 				}
 				$defaultModules['user'] = 'loading';
 			} else {
-				// Non-logged-in users have no user module. Treat it as empty and 'ready' to avoid
-				// blocking default gadgets that might depend on it. Although arguably default-enabled
-				// gadgets should not depend on the user module, it's harmless and less error-prone to
-				// handle this case.
+				// Non-logged-in users have an empty user module.
+				// Save request by marking ready in advance (bug 46857)
 				$defaultModules['user'] = 'ready';
 			}
 		} else {
-			// User JS disabled
-			$defaultModules['user'] = 'missing';
+			// User modules are disabled on this wiki.
+			// Save request by marking ready in advance (bug 46857)
+			$defaultModules['user'] = 'ready';
 		}
 
 		// Group JS is only enabled if site JS is enabled.
@@ -2893,13 +2892,13 @@ $templates
 				);
 				$defaultModules['user.groups'] = 'loading';
 			} else {
-				// Non-logged-in users have no user.groups module. Treat it as empty and 'ready' to
-				// avoid blocking gadgets that might depend upon the module.
+				// Non-logged-in users have no user.groups module.
+				// Save request by marking ready in advance (bug 46857)
 				$defaultModules['user.groups'] = 'ready';
 			}
 		} else {
 			// Site (and group JS) disabled
-			$defaultModules['user.groups'] = 'missing';
+			$defaultModules['user.groups'] = 'ready';
 		}
 
 		$loaderInit = '';
@@ -2927,11 +2926,18 @@ $templates
 	 */
 	function getBottomScripts() {
 		global $wgResourceLoaderExperimentalAsyncLoading;
+
+		// Optimise jQuery ready event cross-browser.
+		// This also enforces $.isReady to be true at </body> which fixes the
+		// mw.loader bug in Firefox with using document.write between </body>
+		// and the DOMContentReady event (bug 47457).
+		$html = Html::inlineScript( 'window.jQuery && jQuery.ready();' );
+
 		if ( !$wgResourceLoaderExperimentalAsyncLoading ) {
-			return $this->getScriptsForBottomQueue( false );
-		} else {
-			return '';
+			$html .= $this->getScriptsForBottomQueue( false );
 		}
+
+		return $html;
 	}
 
 	/**
@@ -2966,24 +2972,24 @@ $templates
 	public function getJSVars() {
 		global $wgContLang;
 
-		$latestRevID = 0;
-		$pageID = 0;
-		$canonicalName = false; # bug 21115
+		$curRevisionId = 0;
+		$articleId = 0;
+		$canonicalSpecialPageName = false; # bug 21115
 
 		$title = $this->getTitle();
 		$ns = $title->getNamespace();
-		$nsname = MWNamespace::exists( $ns ) ? MWNamespace::getCanonicalName( $ns ) : $title->getNsText();
+		$canonicalNamespace = MWNamespace::exists( $ns ) ? MWNamespace::getCanonicalName( $ns ) : $title->getNsText();
 
 		// Get the relevant title so that AJAX features can use the correct page name
 		// when making API requests from certain special pages (bug 34972).
 		$relevantTitle = $this->getSkin()->getRelevantTitle();
 
 		if ( $ns == NS_SPECIAL ) {
-			list( $canonicalName, /*...*/ ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
+			list( $canonicalSpecialPageName, /*...*/ ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
 		} elseif ( $this->canUseWikiPage() ) {
 			$wikiPage = $this->getWikiPage();
-			$latestRevID = $wikiPage->getLatest();
-			$pageID = $wikiPage->getId();
+			$curRevisionId = $wikiPage->getLatest();
+			$articleId = $wikiPage->getId();
 		}
 
 		$lang = $title->getPageLanguage();
@@ -3005,20 +3011,23 @@ $templates
 		$user = $this->getUser();
 
 		$vars = array(
-			'wgCanonicalNamespace' => $nsname,
-			'wgCanonicalSpecialPageName' => $canonicalName,
+			'wgCanonicalNamespace' => $canonicalNamespace,
+			'wgCanonicalSpecialPageName' => $canonicalSpecialPageName,
 			'wgNamespaceNumber' => $title->getNamespace(),
 			'wgPageName' => $title->getPrefixedDBkey(),
 			'wgTitle' => $title->getText(),
-			'wgCurRevisionId' => $latestRevID,
-			'wgArticleId' => $pageID,
+			'wgCurRevisionId' => $curRevisionId,
+			'wgRevisionId' => (int)$this->getRevisionId(),
+			'wgArticleId' => $articleId,
 			'wgIsArticle' => $this->isArticle(),
+			'wgIsRedirect' => $title->isRedirect(),
 			'wgAction' => Action::getActionName( $this->getContext() ),
 			'wgUserName' => $user->isAnon() ? null : $user->getName(),
 			'wgUserGroups' => $user->getEffectiveGroups(),
 			'wgCategories' => $this->getCategories(),
 			'wgBreakFrames' => $this->getFrameOptions() == 'DENY',
 			'wgPageContentLanguage' => $lang->getCode(),
+			'wgPageContentModel' => $title->getContentModel(),
 			'wgSeparatorTransformTable' => $compactSeparatorTransTable,
 			'wgDigitTransformTable' => $compactDigitTransTable,
 			'wgDefaultDateFormat' => $lang->getDefaultDateFormat(),
@@ -3031,10 +3040,16 @@ $templates
 			$vars['wgUserEditCount'] = $user->getEditCount();
 			$userReg = wfTimestampOrNull( TS_UNIX, $user->getRegistration() );
 			$vars['wgUserRegistration'] = $userReg !== null ? ( $userReg * 1000 ) : null;
+			// Get the revision ID of the oldest new message on the user's talk
+			// page. This can be used for constructing new message alerts on
+			// the client side.
+			$vars['wgUserNewMsgRevisionId'] = $user->getNewMessageRevisionId();
 		}
 		if ( $wgContLang->hasVariants() ) {
 			$vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
 		}
+		// Same test as SkinTemplate
+		$vars['wgIsProbablyEditable'] = $title->quickUserCan( 'edit', $user ) && ( $title->exists() || $title->quickUserCan( 'create', $user ) );
 		foreach ( $title->getRestrictionTypes() as $type ) {
 			$vars['wgRestriction' . ucfirst( $type )] = $title->getRestrictions( $type );
 		}
@@ -3080,13 +3095,11 @@ $templates
 	}
 
 	/**
-	 * @param bool $addContentType Whether "<meta>" specifying content type should be returned
-	 *
 	 * @return array in format "link name or number => 'link html'".
 	 */
-	public function getHeadLinksArray( $addContentType = false ) {
+	public function getHeadLinksArray() {
 		global $wgUniversalEditButton, $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI,
-			$wgSitename, $wgVersion, $wgHtml5, $wgMimeType,
+			$wgSitename, $wgVersion,
 			$wgFeed, $wgOverrideSiteFeed, $wgAdvertisedFeedTypes,
 			$wgDisableLangConversion, $wgCanonicalLanguageLinks,
 			$wgRightsPage, $wgRightsUrl;
@@ -3095,30 +3108,13 @@ $templates
 
 		$canonicalUrl = $this->mCanonicalUrl;
 
-		if ( $addContentType ) {
-			if ( $wgHtml5 ) {
-				# More succinct than <meta http-equiv=Content-Type>, has the
-				# same effect
-				$tags['meta-charset'] = Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
-			} else {
-				$tags['meta-content-type'] = Html::element( 'meta', array(
-					'http-equiv' => 'Content-Type',
-					'content' => "$wgMimeType; charset=UTF-8"
-				) );
-				$tags['meta-content-style-type'] = Html::element( 'meta', array( // bug 15835
-					'http-equiv' => 'Content-Style-Type',
-					'content' => 'text/css'
-				) );
-			}
-		}
-
 		$tags['meta-generator'] = Html::element( 'meta', array(
 			'name' => 'generator',
 			'content' => "MediaWiki $wgVersion",
 		) );
 
 		$p = "{$this->mIndexPolicy},{$this->mFollowPolicy}";
-		if( $p !== 'index,follow' ) {
+		if ( $p !== 'index,follow' ) {
 			// http://www.robotstxt.org/wc/meta-user.html
 			// Only show if it's different from the default robots policy
 			$tags['meta-robots'] = Html::element( 'meta', array(
@@ -3127,21 +3123,6 @@ $templates
 			) );
 		}
 
-		if ( count( $this->mKeywords ) > 0 ) {
-			$strip = array(
-				"/<.*?" . ">/" => '',
-				"/_/" => ' '
-			);
-			$tags['meta-keywords'] = Html::element( 'meta', array(
-				'name' => 'keywords',
-				'content' => preg_replace(
-					array_keys( $strip ),
-					array_values( $strip ),
-					implode( ',', $this->mKeywords )
-				)
-			) );
-		}
-
 		foreach ( $this->mMetatags as $tag ) {
 			if ( 0 == strcasecmp( 'http:', substr( $tag[0], 0, 5 ) ) ) {
 				$a = 'http-equiv';
@@ -3233,7 +3214,7 @@ $templates
 					foreach ( $variants as $_v ) {
 						$tags["variant-$_v"] = Html::element( 'link', array(
 							'rel' => 'alternate',
-							'hreflang' => $_v,
+							'hreflang' => wfBCP47( $_v ),
 							'href' => $this->getTitle()->getLocalURL( array( 'variant' => $_v ) ) )
 						);
 					}
@@ -3266,7 +3247,7 @@ $templates
 
 		# Feeds
 		if ( $wgFeed ) {
-			foreach( $this->getSyndicationLinks() as $format => $link ) {
+			foreach ( $this->getSyndicationLinks() as $format => $link ) {
 				# Use the page name for the title.  In principle, this could
 				# lead to issues with having the same name for different feeds
 				# corresponding to the same page, but we can't avoid that at
@@ -3301,7 +3282,7 @@ $templates
 				foreach ( $wgAdvertisedFeedTypes as $format ) {
 					$tags[] = $this->feedLink(
 						$format,
-						$rctitle->getLocalURL( "feed={$format}" ),
+						$rctitle->getLocalURL( array( 'feed' => $format ) ),
 						$this->msg( "site-{$format}-feed", $wgSitename )->text() # For grep: 'site-rss-feed', 'site-atom-feed'.
 					);
 				}
@@ -3329,13 +3310,10 @@ $templates
 	}
 
 	/**
-	 * @param $unused
-	 * @param bool $addContentType Whether "<meta>" specifying content type should be returned
-	 *
 	 * @return string HTML tag links to be put in the header.
 	 */
-	public function getHeadLinks( $unused = null, $addContentType = false ) {
-		return implode( "\n", $this->getHeadLinksArray( $addContentType ) );
+	public function getHeadLinks() {
+		return implode( "\n", $this->getHeadLinksArray() );
 	}
 
 	/**
@@ -3368,13 +3346,13 @@ $templates
 		$options = array();
 		// Even though we expect the media type to be lowercase, but here we
 		// force it to lowercase to be safe.
-		if( $media ) {
+		if ( $media ) {
 			$options['media'] = $media;
 		}
-		if( $condition ) {
+		if ( $condition ) {
 			$options['condition'] = $condition;
 		}
-		if( $dir ) {
+		if ( $dir ) {
 			$options['dir'] = $dir;
 		}
 		$this->styles[$style] = $options;
@@ -3386,7 +3364,7 @@ $templates
 	 * @param string $flip Set to 'flip' to flip the CSS if needed
 	 */
 	public function addInlineStyle( $style_css, $flip = 'noflip' ) {
-		if( $flip === 'flip' && $this->getLanguage()->isRTL() ) {
+		if ( $flip === 'flip' && $this->getLanguage()->isRTL() ) {
 			# If wanted, and the interface is right-to-left, flip the CSS
 			$style_css = CSSJanus::transform( $style_css, true, false );
 		}
@@ -3416,7 +3394,7 @@ $templates
 		if ( $wgUseSiteCss ) {
 			$moduleStyles[] = 'site';
 			$moduleStyles[] = 'noscript';
-			if( $this->getUser()->isLoggedIn() ) {
+			if ( $this->getUser()->isLoggedIn() ) {
 				$moduleStyles[] = 'user.groups';
 			}
 		}
@@ -3497,9 +3475,9 @@ $templates
 		}
 		$this->mExtStyles = array();
 
-		foreach( $this->styles as $file => $options ) {
+		foreach ( $this->styles as $file => $options ) {
 			$link = $this->styleLink( $file, $options );
-			if( $link ) {
+			if ( $link ) {
 				$links[$file] = $link;
 			}
 		}
@@ -3515,22 +3493,22 @@ $templates
 	 * @return String: HTML fragment
 	 */
 	protected function styleLink( $style, $options ) {
-		if( isset( $options['dir'] ) ) {
-			if( $this->getLanguage()->getDir() != $options['dir'] ) {
+		if ( isset( $options['dir'] ) ) {
+			if ( $this->getLanguage()->getDir() != $options['dir'] ) {
 				return '';
 			}
 		}
 
-		if( isset( $options['media'] ) ) {
+		if ( isset( $options['media'] ) ) {
 			$media = self::transformCssMedia( $options['media'] );
-			if( is_null( $media ) ) {
+			if ( is_null( $media ) ) {
 				return '';
 			}
 		} else {
 			$media = 'all';
 		}
 
-		if( substr( $style, 0, 1 ) == '/' ||
+		if ( substr( $style, 0, 1 ) == '/' ||
 			substr( $style, 0, 5 ) == 'http:' ||
 			substr( $style, 0, 6 ) == 'https:' ) {
 			$url = $style;
@@ -3541,7 +3519,7 @@ $templates
 
 		$link = Html::linkedStyle( $url, $media );
 
-		if( isset( $options['condition'] ) ) {
+		if ( isset( $options['condition'] ) ) {
 			$condition = htmlspecialchars( $options['condition'] );
 			$link = "<!--[if $condition]>$link<![endif]-->";
 		}
@@ -3556,7 +3534,7 @@ $templates
 	 * this stylesheet
 	 */
 	public static function transformCssMedia( $media ) {
-		global $wgRequest, $wgHandheldForIPhone;
+		global $wgRequest;
 
 		// http://www.w3.org/TR/css3-mediaqueries/#syntax
 		$screenMediaQueryRegex = '/^(?:only\s+)?screen\b/i';
@@ -3566,11 +3544,11 @@ $templates
 			'printable' => 'print',
 			'handheld' => 'handheld',
 		);
-		foreach( $switches as $switch => $targetMedia ) {
-			if( $wgRequest->getBool( $switch ) ) {
-				if( $media == $targetMedia ) {
+		foreach ( $switches as $switch => $targetMedia ) {
+			if ( $wgRequest->getBool( $switch ) ) {
+				if ( $media == $targetMedia ) {
 					$media = '';
-				} elseif( preg_match( $screenMediaQueryRegex, $media ) === 1 ) {
+				} elseif ( preg_match( $screenMediaQueryRegex, $media ) === 1 ) {
 					// This regex will not attempt to understand a comma-separated media_query_list
 					//
 					// Example supported values for $media: 'screen', 'only screen', 'screen and (min-width: 982px)' ),
@@ -3581,25 +3559,13 @@ $templates
 					// we don't want simple 'screen' but we might want screen queries that
 					// have a max-width or something, so we'll pass all others on and let the
 					// client do the query.
-					if( $targetMedia == 'print' || $media == 'screen' ) {
+					if ( $targetMedia == 'print' || $media == 'screen' ) {
 						return null;
 					}
 				}
 			}
 		}
 
-		// Expand longer media queries as iPhone doesn't grok 'handheld'
-		if( $wgHandheldForIPhone ) {
-			$mediaAliases = array(
-				'screen' => 'screen and (min-device-width: 481px)',
-				'handheld' => 'handheld, only screen and (max-device-width: 480px)',
-			);
-
-			if( isset( $mediaAliases[$media] ) ) {
-				$media = $mediaAliases[$media];
-			}
-		}
-
 		return $media;
 	}
 
@@ -3688,4 +3654,20 @@ $templates
 		return array();
 	}
 
+	/**
+	 * Enables/disables TOC, doesn't override __NOTOC__
+	 * @param bool $flag
+	 * @since 1.22
+	 */
+	public function enableTOC( $flag = true ) {
+		$this->mEnableTOC = $flag;
+	}
+
+	/**
+	 * @return bool
+	 * @since 1.22
+	 */
+	public function isTOCEnabled() {
+		return $this->mEnableTOC;
+	}
 }
diff --git a/includes/PHPVersionError.php b/includes/PHPVersionError.php
index 7749bf1f..02d3546f 100644
--- a/includes/PHPVersionError.php
+++ b/includes/PHPVersionError.php
@@ -38,7 +38,7 @@
  * version are hardcoded here
  */
 function wfPHPVersionError( $type ) {
-	$mwVersion = '1.21';
+	$mwVersion = '1.22';
 	$minimumVersionPHP = '5.3.2';
 
 	$phpVersion = phpversion();
@@ -61,12 +61,12 @@ function wfPHPVersionError( $type ) {
 		header( 'Pragma: no-cache' );
 
 		$finalOutput = <<<HTML
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns='http://www.w3.org/1999/xhtml' lang='en'>
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
 	<head>
+		<meta charset="UTF-8" />
 		<title>MediaWiki {$mwVersion}</title>
-		<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
-		<style type='text/css' media='screen'>
+		<style media='screen'>
 			body {
 				color: #000;
 				background-color: #fff;
@@ -112,6 +112,6 @@ HTML;
 		$finalOutput = ( $type == 'load.php' ) ? "/* $message */" : $message;
 		header( "$protocol 500 MediaWiki configuration Error" );
 	}
-	echo( "$finalOutput\n" );
+	echo "$finalOutput\n";
 	die( 1 );
 }
diff --git a/includes/PageQueryPage.php b/includes/PageQueryPage.php
index 01a2439f..61a535d6 100644
--- a/includes/PageQueryPage.php
+++ b/includes/PageQueryPage.php
@@ -27,12 +27,11 @@
  * @ingroup SpecialPage
  */
 abstract class PageQueryPage extends QueryPage {
-
 	/**
 	 * Format the result as a simple link to the page
 	 *
-	 * @param $skin Skin
-	 * @param $row Object: result row
+	 * @param Skin $skin
+	 * @param object $row Result row
 	 * @return string
 	 */
 	public function formatResult( $skin, $row ) {
diff --git a/includes/Pager.php b/includes/Pager.php
index 9c514927..4a14c7e0 100644
--- a/includes/Pager.php
+++ b/includes/Pager.php
@@ -150,18 +150,19 @@ abstract class IndexPager extends ContextSource implements Pager {
 		}
 
 		$this->mIsBackwards = ( $this->mRequest->getVal( 'dir' ) == 'prev' );
-		$this->mDb = wfGetDB( DB_SLAVE );
+		# Let the subclass set the DB here; otherwise use a slave DB for the current wiki
+		$this->mDb = $this->mDb ?: wfGetDB( DB_SLAVE );
 
 		$index = $this->getIndexField(); // column to sort on
 		$extraSort = $this->getExtraSortFields(); // extra columns to sort on for query planning
 		$order = $this->mRequest->getVal( 'order' );
-		if( is_array( $index ) && isset( $index[$order] ) ) {
+		if ( is_array( $index ) && isset( $index[$order] ) ) {
 			$this->mOrderType = $order;
 			$this->mIndexField = $index[$order];
 			$this->mExtraSortFields = isset( $extraSort[$order] )
 				? (array)$extraSort[$order]
 				: array();
-		} elseif( is_array( $index ) ) {
+		} elseif ( is_array( $index ) ) {
 			# First element is the default
 			reset( $index );
 			list( $this->mOrderType, $this->mIndexField ) = each( $index );
@@ -175,7 +176,7 @@ abstract class IndexPager extends ContextSource implements Pager {
 			$this->mExtraSortFields = (array)$extraSort;
 		}
 
-		if( !isset( $this->mDefaultDirection ) ) {
+		if ( !isset( $this->mDefaultDirection ) ) {
 			$dir = $this->getDefaultDirections();
 			$this->mDefaultDirection = is_array( $dir )
 				? $dir[$this->mOrderType]
@@ -256,7 +257,7 @@ abstract class IndexPager extends ContextSource implements Pager {
 	 * @param $limit Int|String
 	 */
 	function setLimit( $limit ) {
-		$limit = (int) $limit;
+		$limit = (int)$limit;
 		// WebRequest::getLimitOffset() puts a cap of 5000, so do same here.
 		if ( $limit > 5000 ) {
 			$limit = 5000;
@@ -456,12 +457,12 @@ abstract class IndexPager extends ContextSource implements Pager {
 		}
 
 		$attrs = array();
-		if( in_array( $type, array( 'first', 'prev', 'next', 'last' ) ) ) {
+		if ( in_array( $type, array( 'first', 'prev', 'next', 'last' ) ) ) {
 			# HTML5 rel attributes
 			$attrs['rel'] = $type;
 		}
 
-		if( $type ) {
+		if ( $type ) {
 			$attrs['class'] = "mw-{$type}link";
 		}
 
@@ -593,7 +594,7 @@ abstract class IndexPager extends ContextSource implements Pager {
 			$this->doQuery();
 		}
 		// Hide navigation by default if there is nothing to page
-		return !($this->mIsFirst && $this->mIsLast);
+		return !( $this->mIsFirst && $this->mIsLast );
 	}
 
 	/**
@@ -698,7 +699,9 @@ abstract class IndexPager extends ContextSource implements Pager {
 	 *
 	 * @return Array
 	 */
-	protected function getExtraSortFields() { return array(); }
+	protected function getExtraSortFields() {
+		return array();
+	}
 
 	/**
 	 * Return the default sorting direction: false for ascending, true for
@@ -719,7 +722,9 @@ abstract class IndexPager extends ContextSource implements Pager {
 	 *
 	 * @return Boolean
 	 */
-	protected function getDefaultDirections() { return false; }
+	protected function getDefaultDirections() {
+		return false;
+	}
 }
 
 /**
@@ -739,7 +744,7 @@ abstract class AlphabeticPager extends IndexPager {
 			return '';
 		}
 
-		if( isset( $this->mNavigationBar ) ) {
+		if ( isset( $this->mNavigationBar ) ) {
 			return $this->mNavigationBar;
 		}
 
@@ -762,7 +767,7 @@ abstract class AlphabeticPager extends IndexPager {
 			$this->msg( 'viewprevnext' )->rawParams( $pagingLinks['prev'],
 				$pagingLinks['next'], $limits )->escaped();
 
-		if( !is_array( $this->getIndexField() ) ) {
+		if ( !is_array( $this->getIndexField() ) ) {
 			# Early return to avoid undue nesting
 			return $this->mNavigationBar;
 		}
@@ -770,14 +775,14 @@ abstract class AlphabeticPager extends IndexPager {
 		$extra = '';
 		$first = true;
 		$msgs = $this->getOrderTypeMessages();
-		foreach( array_keys( $msgs ) as $order ) {
-			if( $first ) {
+		foreach ( array_keys( $msgs ) as $order ) {
+			if ( $first ) {
 				$first = false;
 			} else {
 				$extra .= $this->msg( 'pipe-separator' )->escaped();
 			}
 
-			if( $order == $this->mOrderType ) {
+			if ( $order == $this->mOrderType ) {
 				$extra .= $this->msg( $msgs[$order] )->escaped();
 			} else {
 				$extra .= $this->makeLink(
@@ -787,7 +792,7 @@ abstract class AlphabeticPager extends IndexPager {
 			}
 		}
 
-		if( $extra !== '' ) {
+		if ( $extra !== '' ) {
 			$extra = ' ' . $this->msg( 'parentheses' )->rawParams( $extra )->escaped();
 			$this->mNavigationBar .= $extra;
 		}
@@ -868,9 +873,10 @@ abstract class ReverseChronologicalPager extends IndexPager {
 			$year = $this->mYear;
 		} else {
 			// If no year given, assume the current one
-			$year = gmdate( 'Y' );
+			$timestamp = MWTimestamp::getInstance();
+			$year = $timestamp->format( 'Y' );
 			// If this month hasn't happened yet this year, go back to last year's month
-			if( $this->mMonth > gmdate( 'n' ) ) {
+			if ( $this->mMonth > $timestamp->format( 'n' ) ) {
 				$year--;
 			}
 		}
@@ -917,7 +923,9 @@ abstract class TablePager extends IndexPager {
 		}
 
 		$this->mSort = $this->getRequest()->getText( 'sort' );
-		if ( !array_key_exists( $this->mSort, $this->getFieldNames() ) ) {
+		if ( !array_key_exists( $this->mSort, $this->getFieldNames() )
+			|| !$this->isFieldSortable( $this->mSort )
+		) {
 			$this->mSort = $this->getDefaultSort();
 		}
 		if ( $this->getRequest()->getBool( 'asc' ) ) {
@@ -935,16 +943,15 @@ abstract class TablePager extends IndexPager {
 	 */
 	function getStartBody() {
 		global $wgStylePath;
-		$tableClass = htmlspecialchars( $this->getTableClass() );
-		$sortClass = htmlspecialchars( $this->getSortHeaderClass() );
+		$sortClass = $this->getSortHeaderClass();
 
-		$s = "<table style='border:1px;' class=\"mw-datatable $tableClass\"><thead><tr>\n";
+		$s = '';
 		$fields = $this->getFieldNames();
 
 		# Make table header
 		foreach ( $fields as $field => $name ) {
 			if ( strval( $name ) == '' ) {
-				$s .= "<th>&#160;</th>\n";
+				$s .= Html::rawElement( 'th', array(), '&#160;' ) . "\n";
 			} elseif ( $this->isFieldSortable( $field ) ) {
 				$query = array( 'sort' => $field, 'limit' => $this->mLimit );
 				if ( $field == $this->mSort ) {
@@ -963,20 +970,26 @@ abstract class TablePager extends IndexPager {
 						$query['desc'] = '1';
 						$alt = $this->msg( 'ascending_abbrev' )->escaped();
 					}
-					$image = htmlspecialchars( "$wgStylePath/common/images/$image" );
+					$image = "$wgStylePath/common/images/$image";
 					$link = $this->makeLink(
-						"<img width=\"12\" height=\"12\" alt=\"$alt\" src=\"$image\" />" .
-							htmlspecialchars( $name ), $query );
-					$s .= "<th class=\"$sortClass\">$link</th>\n";
+						Html::element( 'img', array( 'width' => 12, 'height' => 12,
+							'alt' => $alt, 'src' => $image ) ) . htmlspecialchars( $name ), $query );
+					$s .= Html::rawElement( 'th', array( 'class' => $sortClass ), $link ) . "\n";
 				} else {
-					$s .= '<th>' . $this->makeLink( htmlspecialchars( $name ), $query ) . "</th>\n";
+					$s .= Html::rawElement( 'th', array(),
+						$this->makeLink( htmlspecialchars( $name ), $query ) ) . "\n";
 				}
 			} else {
-				$s .= '<th>' . htmlspecialchars( $name ) . "</th>\n";
+				$s .= Html::element( 'th', array(), $name ) . "\n";
 			}
 		}
-		$s .= "</tr></thead><tbody>\n";
-		return $s;
+
+		$tableClass = $this->getTableClass();
+		$ret = Html::openElement( 'table', array( 'style' => 'border:1px;', 'class' => "mw-datatable $tableClass" ) );
+		$ret .= Html::rawElement( 'thead', array(), Html::rawElement( 'tr', array(), "\n" . $s . "\n" ) );
+		$ret .= Html::openElement( 'tbody' ) . "\n";
+
+		return $ret;
 	}
 
 	/**
@@ -993,8 +1006,9 @@ abstract class TablePager extends IndexPager {
 	 */
 	function getEmptyBody() {
 		$colspan = count( $this->getFieldNames() );
-		$msgEmpty = $this->msg( 'table_pager_empty' )->escaped();
-		return "<tr><td colspan=\"$colspan\">$msgEmpty</td></tr>\n";
+		$msgEmpty = $this->msg( 'table_pager_empty' )->text();
+		return Html::rawElement( 'tr', array(),
+			Html::element( 'td', array( 'colspan' => $colspan ), $msgEmpty ) );
 	}
 
 	/**
@@ -1004,7 +1018,7 @@ abstract class TablePager extends IndexPager {
 	 */
 	function formatRow( $row ) {
 		$this->mCurrentRow = $row; // In case formatValue etc need to know
-		$s = Xml::openElement( 'tr', $this->getRowAttrs( $row ) );
+		$s = Html::openElement( 'tr', $this->getRowAttrs( $row ) ) . "\n";
 		$fieldNames = $this->getFieldNames();
 
 		foreach ( $fieldNames as $field => $name ) {
@@ -1015,10 +1029,10 @@ abstract class TablePager extends IndexPager {
 				$formatted = '&#160;';
 			}
 
-			$s .= Xml::tags( 'td', $this->getCellAttrs( $field, $value ), $formatted );
+			$s .= Html::rawElement( 'td', $this->getCellAttrs( $field, $value ), $formatted ) . "\n";
 		}
 
-		$s .= "</tr>\n";
+		$s .= Html::closeElement( 'tr' ) . "\n";
 
 		return $s;
 	}
@@ -1130,7 +1144,7 @@ abstract class TablePager extends IndexPager {
 			'next' => 'arrow_disabled_right_25.png',
 			'last' => 'arrow_disabled_last_25.png',
 		);
-		if( $this->getLanguage()->isRTL() ) {
+		if ( $this->getLanguage()->isRTL() ) {
 			$keys = array_keys( $labels );
 			$images = array_combine( $keys, array_reverse( $images ) );
 			$disabledImages = array_combine( $keys, array_reverse( $disabledImages ) );
@@ -1140,49 +1154,67 @@ abstract class TablePager extends IndexPager {
 		$disabledTexts = array();
 		foreach ( $labels as $type => $label ) {
 			$msgLabel = $this->msg( $label )->escaped();
-			$linkTexts[$type] = "<img src=\"$path/{$images[$type]}\" alt=\"$msgLabel\"/><br />$msgLabel";
-			$disabledTexts[$type] = "<img src=\"$path/{$disabledImages[$type]}\" alt=\"$msgLabel\"/><br />$msgLabel";
+			$linkTexts[$type] = Html::element( 'img', array( 'src' => "$path/{$images[$type]}",
+				'alt' => $msgLabel ) ) . "<br />$msgLabel";
+			$disabledTexts[$type] = Html::element( 'img', array( 'src' => "$path/{$disabledImages[$type]}",
+				'alt' => $msgLabel ) ) . "<br />$msgLabel";
 		}
 		$links = $this->getPagingLinks( $linkTexts, $disabledTexts );
 
-		$navClass = htmlspecialchars( $this->getNavClass() );
-		$s = "<table class=\"$navClass\"><tr>\n";
+		$s = Html::openElement( 'table', array( 'class' => $this->getNavClass() ) );
+		$s .= Html::openElement( 'tr' ) . "\n";
 		$width = 100 / count( $links ) . '%';
 		foreach ( $labels as $type => $label ) {
-			$s .= "<td style='width:$width;'>{$links[$type]}</td>\n";
+			$s .= Html::rawElement( 'td', array( 'style' => "width:$width;" ), $links[$type] ) . "\n";
 		}
-		$s .= "</tr></table>\n";
+		$s .= Html::closeElement( 'tr' ) . Html::closeElement( 'table' ) . "\n";
 		return $s;
 	}
 
 	/**
 	 * Get a "<select>" element which has options for each of the allowed limits
 	 *
+	 * @param $attribs String: Extra attributes to set
 	 * @return String: HTML fragment
 	 */
-	public function getLimitSelect() {
+	public function getLimitSelect( $attribs = array() ) {
+		$select = new XmlSelect( 'limit', false, $this->mLimit );
+		$select->addOptions( $this->getLimitSelectList() );
+		foreach ( $attribs as $name => $value ) {
+			$select->setAttribute( $name, $value );
+		}
+		return $select->getHTML();
+	}
+
+	/**
+	 * Get a list of items to show in a "<select>" element of limits.
+	 * This can be passed directly to XmlSelect::addOptions().
+	 *
+	 * @since 1.22
+	 * @return array
+	 */
+	public function getLimitSelectList() {
 		# Add the current limit from the query string
 		# to avoid that the limit is lost after clicking Go next time
 		if ( !in_array( $this->mLimit, $this->mLimitsShown ) ) {
 			$this->mLimitsShown[] = $this->mLimit;
 			sort( $this->mLimitsShown );
 		}
-		$s = Html::openElement( 'select', array( 'name' => 'limit' ) ) . "\n";
+		$ret = array();
 		foreach ( $this->mLimitsShown as $key => $value ) {
 			# The pair is either $index => $limit, in which case the $value
 			# will be numeric, or $limit => $text, in which case the $value
 			# will be a string.
-			if( is_int( $value ) ) {
+			if ( is_int( $value ) ) {
 				$limit = $value;
 				$text = $this->getLanguage()->formatNum( $limit );
 			} else {
 				$limit = $key;
 				$text = $value;
 			}
-			$s .= Xml::option( $text, $limit, $limit == $this->mLimit ) . "\n";
+			$ret[$text] = $limit;
 		}
-		$s .= Html::closeElement( 'select' );
-		return $s;
+		return $ret;
 	}
 
 	/**
@@ -1201,9 +1233,7 @@ abstract class TablePager extends IndexPager {
 		}
 		$s = '';
 		foreach ( $query as $name => $value ) {
-			$encName = htmlspecialchars( $name );
-			$encValue = htmlspecialchars( $value );
-			$s .= "<input type=\"hidden\" name=\"$encName\" value=\"$encValue\"/>\n";
+			$s .= Html::hidden( $name, $value ) . "\n";
 		}
 		return $s;
 	}
@@ -1216,12 +1246,14 @@ abstract class TablePager extends IndexPager {
 	function getLimitForm() {
 		global $wgScript;
 
-		return Xml::openElement(
+		return Html::rawElement(
 			'form',
 			array(
 				'method' => 'get',
 				'action' => $wgScript
-			) ) . "\n" . $this->getLimitDropdown() . "</form>\n";
+			),
+			"\n" . $this->getLimitDropdown()
+		) . "\n";
 	}
 
 	/**
diff --git a/includes/PathRouter.php b/includes/PathRouter.php
index fc891bb3..435e09ef 100644
--- a/includes/PathRouter.php
+++ b/includes/PathRouter.php
@@ -141,10 +141,10 @@ class PathRouter {
 		}
 
 		$pattern = (object)array(
-			'path'    => $path,
-			'params'  => $params,
+			'path' => $path,
+			'params' => $params,
 			'options' => $options,
-			'key'     => $key,
+			'key' => $key,
 		);
 		$pattern->weight = self::makeWeight( $pattern );
 		$this->patterns[] = $pattern;
@@ -185,7 +185,7 @@ class PathRouter {
 	 */
 	protected function sortByWeight() {
 		$weights = array();
-		foreach( $this->patterns as $key => $pattern ) {
+		foreach ( $this->patterns as $key => $pattern ) {
 			$weights[$key] = $pattern->weight;
 		}
 		array_multisort( $weights, SORT_DESC, SORT_NUMERIC, $this->patterns );
@@ -203,7 +203,7 @@ class PathRouter {
 		$path = explode( '/', $pattern->path );
 
 		# For each level of the path
-		foreach( $path as $piece ) {
+		foreach ( $path as $piece ) {
 			if ( preg_match( '/^\$(\d+|key)$/u', $piece ) ) {
 				# For a piece that is only a $1 variable add 1 points of weight
 				$weight += 1;
diff --git a/includes/PoolCounter.php b/includes/PoolCounter.php
index 2ebef04e..2dac9388 100644
--- a/includes/PoolCounter.php
+++ b/includes/PoolCounter.php
@@ -22,25 +22,24 @@
  */
 
 /**
- *  When you have many workers (threads/servers) giving service, and a
+ * When you have many workers (threads/servers) giving service, and a
  * cached item expensive to produce expires, you may get several workers
  * doing the job at the same time.
  *
- *  Given enough requests and the item expiring fast (non-cacheable,
+ * Given enough requests and the item expiring fast (non-cacheable,
  * lots of edits...) that single work can end up unfairly using most (all)
  * of the cpu of the pool. This is also known as 'Michael Jackson effect'
  * since this effect triggered on the english wikipedia on the day Michael
  * Jackson died, the biographical article got hit with several edits per
  * minutes and hundreds of read hits.
  *
- *  The PoolCounter provides semaphore semantics for restricting the number
+ * The PoolCounter provides semaphore semantics for restricting the number
  * of workers that may be concurrently performing such single task.
  *
- *  By default PoolCounter_Stub is used, which provides no locking. You
+ * By default PoolCounter_Stub is used, which provides no locking. You
  * can get a useful one in the PoolCounter extension.
  */
 abstract class PoolCounter {
-
 	/* Return codes */
 	const LOCKED = 1; /* Lock acquired */
 	const RELEASED = 2; /* Lock released */
@@ -52,39 +51,26 @@ abstract class PoolCounter {
 	const TIMEOUT = -4; /* Timeout exceeded */
 	const LOCK_HELD = -5; /* Cannot acquire another lock while you have one lock held */
 
-	/**
-	 * I want to do this task and I need to do it myself.
-	 *
-	 * @return Locked/Error
-	 */
-	abstract function acquireForMe();
-
-	/**
-	 * I want to do this task, but if anyone else does it
-	 * instead, it's also fine for me. I will read its cached data.
-	 *
-	 * @return Locked/Done/Error
-	 */
-	abstract function acquireForAnyone();
-
-	/**
-	 * I have successfully finished my task.
-	 * Lets another one grab the lock, and returns the workers
-	 * waiting on acquireForAnyone()
-	 *
-	 * @return Released/NotLocked/Error
-	 */
-	abstract function release();
+	/** @var string All workers with the same key share the lock */
+	protected $key;
+	/** @var integer Maximum number of workers doing the task simultaneously */
+	protected $workers;
+	/** @var integer If this number of workers are already working/waiting, fail instead of wait */
+	protected $maxqueue;
+	/** @var float Maximum time in seconds to wait for the lock */
+	protected $timeout;
 
 	/**
-	 *  $key: All workers with the same key share the lock.
-	 *  $workers: It wouldn't be a good idea to have more than this number of
-	 * workers doing the task simultaneously.
-	 *  $maxqueue: If this number of workers are already working/waiting,
-	 * fail instead of wait.
-	 *  $timeout: Maximum time in seconds to wait for the lock.
+	 * @param array $conf
+	 * @param string $type
+	 * @param string $key
 	 */
-	protected $key, $workers, $maxqueue, $timeout;
+	protected function __construct( $conf, $type, $key ) {
+		$this->key = $key;
+		$this->workers = $conf['workers'];
+		$this->maxqueue = $conf['maxqueue'];
+		$this->timeout = $conf['timeout'];
+	}
 
 	/**
 	 * Create a Pool counter. This should only be called from the PoolWorks.
@@ -105,58 +91,74 @@ abstract class PoolCounter {
 		return new $class( $conf, $type, $key );
 	}
 
-	protected function __construct( $conf, $type, $key ) {
-		$this->key = $key;
-		$this->workers = $conf['workers'];
-		$this->maxqueue = $conf['maxqueue'];
-		$this->timeout = $conf['timeout'];
-	}
-}
-
-class PoolCounter_Stub extends PoolCounter {
-
 	/**
-	 * @return Status
+	 * I want to do this task and I need to do it myself.
+	 *
+	 * @return Status Value is one of Locked/Error
 	 */
-	function acquireForMe() {
-		return Status::newGood( PoolCounter::LOCKED );
-	}
+	abstract public function acquireForMe();
 
 	/**
-	 * @return Status
+	 * I want to do this task, but if anyone else does it
+	 * instead, it's also fine for me. I will read its cached data.
+	 *
+	 * @return Status Value is one of Locked/Done/Error
 	 */
-	function acquireForAnyone() {
-		return Status::newGood( PoolCounter::LOCKED );
-	}
+	abstract public function acquireForAnyone();
 
 	/**
-	 * @return Status
+	 * I have successfully finished my task.
+	 * Lets another one grab the lock, and returns the workers
+	 * waiting on acquireForAnyone()
+	 *
+	 * @return Status value is one of Released/NotLocked/Error
 	 */
-	function release() {
-		return Status::newGood( PoolCounter::RELEASED );
-	}
+	abstract public function release();
+}
 
+class PoolCounter_Stub extends PoolCounter {
 	public function __construct() {
 		/* No parameters needed */
 	}
+
+	public function acquireForMe() {
+		return Status::newGood( PoolCounter::LOCKED );
+	}
+
+	public function acquireForAnyone() {
+		return Status::newGood( PoolCounter::LOCKED );
+	}
+
+	public function release() {
+		return Status::newGood( PoolCounter::RELEASED );
+	}
 }
 
 /**
- * Handy class for dealing with PoolCounters using class members instead of callbacks.
+ * Class for dealing with PoolCounters using class members
  */
 abstract class PoolCounterWork {
 	protected $cacheable = false; //Does this override getCachedWork() ?
 
 	/**
-	 * Actually perform the work, caching it if needed.
+	 * @param string $type The type of PoolCounter to use
+	 * @param string $key Key that identifies the queue this work is placed on
 	 */
-	abstract function doWork();
+	public function __construct( $type, $key ) {
+		$this->poolCounter = PoolCounter::factory( $type, $key );
+	}
+
+	/**
+	 * Actually perform the work, caching it if needed
+	 * @return mixed work result or false
+	 */
+	abstract public function doWork();
 
 	/**
 	 * Retrieve the work from cache
 	 * @return mixed work result or false
 	 */
-	function getCachedWork() {
+	public function getCachedWork() {
 		return false;
 	}
 
@@ -165,7 +167,7 @@ abstract class PoolCounterWork {
 	 * message.
 	 * @return mixed work result or false
 	 */
-	function fallback() {
+	public function fallback() {
 		return false;
 	}
 
@@ -181,17 +183,28 @@ abstract class PoolCounterWork {
 	 * Log an error
 	 *
 	 * @param $status Status
+	 * @return void
 	 */
 	function logError( $status ) {
 		wfDebugLog( 'poolcounter', $status->getWikiText() );
 	}
 
 	/**
-	 * Get the result of the work (whatever it is), or false.
+	 * Get the result of the work (whatever it is), or the result of the error() function.
+	 * This returns the result of the first applicable method that returns a non-false value,
+	 * where the methods are checked in the following order:
+	 *   - a) doWork()       : Applies if the work is exclusive or no another process
+	 *                         is doing it, and on the condition that either this process
+	 *                         successfully entered the pool or the pool counter is down.
+	 *   - b) doCachedWork() : Applies if the work is cacheable and this blocked on another
+	 *                         process which finished the work.
+	 *   - c) fallback()     : Applies for all remaining cases.
+	 * If these all fall through (by returning false), then the result of error() is returned.
+	 *
 	 * @param $skipcache bool
-	 * @return bool|mixed
+	 * @return mixed
 	 */
-	function execute( $skipcache = false ) {
+	public function execute( $skipcache = false ) {
 		if ( $this->cacheable && !$skipcache ) {
 			$status = $this->poolCounter->acquireForAnyone();
 		} else {
@@ -232,15 +245,85 @@ abstract class PoolCounterWork {
 			/* These two cases should never be hit... */
 			case PoolCounter::ERROR:
 			default:
-				$errors = array( PoolCounter::QUEUE_FULL => 'pool-queuefull', PoolCounter::TIMEOUT => 'pool-timeout' );
+				$errors = array(
+					PoolCounter::QUEUE_FULL => 'pool-queuefull',
+					PoolCounter::TIMEOUT => 'pool-timeout' );
 
-				$status = Status::newFatal( isset( $errors[$status->value] ) ? $errors[$status->value] : 'pool-errorunknown' );
+				$status = Status::newFatal( isset( $errors[$status->value] )
+					? $errors[$status->value]
+					: 'pool-errorunknown' );
 				$this->logError( $status );
 				return $this->error( $status );
 		}
 	}
+}
 
-	function __construct( $type, $key ) {
-		$this->poolCounter = PoolCounter::factory( $type, $key );
+/**
+ * Convenience class for dealing with PoolCounters using callbacks
+ * @since 1.22
+ */
+class PoolCounterWorkViaCallback extends PoolCounterWork {
+	/** @var callable */
+	protected $doWork;
+	/** @var callable|null */
+	protected $doCachedWork;
+	/** @var callable|null */
+	protected $fallback;
+	/** @var callable|null */
+	protected $error;
+
+	/**
+	 * Build a PoolCounterWork class from a type, key, and callback map.
+	 *
+	 * The callback map must at least have a callback for the 'doWork' method.
+	 * Additionally, callbacks can be provided for the 'doCachedWork', 'fallback',
+	 * and 'error' methods. Methods without callbacks will be no-ops that return false.
+	 * If a 'doCachedWork' callback is provided, then execute() may wait for any prior
+	 * process in the pool to finish and reuse its cached result.
+	 *
+	 * @param string $type
+	 * @param string $key
+	 * @param array $callbacks Map of callbacks
+	 * @throws MWException
+	 */
+	public function __construct( $type, $key, array $callbacks ) {
+		parent::__construct( $type, $key );
+		foreach ( array( 'doWork', 'doCachedWork', 'fallback', 'error' ) as $name ) {
+			if ( isset( $callbacks[$name] ) ) {
+				if ( !is_callable( $callbacks[$name] ) ) {
+					throw new MWException( "Invalid callback provided for '$name' function." );
+				}
+				$this->$name = $callbacks[$name];
+			}
+		}
+		if ( !isset( $this->doWork ) ) {
+			throw new MWException( "No callback provided for 'doWork' function." );
+		}
+		$this->cacheable = isset( $this->doCachedWork );
+	}
+
+	public function doWork() {
+		return call_user_func_array( $this->doWork, array() );
+	}
+
+	public function getCachedWork() {
+		if ( $this->doCachedWork ) {
+			return call_user_func_array( $this->doCachedWork, array() );
+		}
+		return false;
+	}
+
+	function fallback() {
+		if ( $this->fallback ) {
+			return call_user_func_array( $this->fallback, array() );
+		}
+		return false;
+	}
+
+	function error( $status ) {
+		if ( $this->error ) {
+			return call_user_func_array( $this->error, array( $status ) );
+		}
+		return false;
 	}
 }
diff --git a/includes/Preferences.php b/includes/Preferences.php
index 56dba05e..c9caf4f7 100644
--- a/includes/Preferences.php
+++ b/includes/Preferences.php
@@ -56,6 +56,12 @@ class Preferences {
 			'searchlimit' => array( 'Preferences', 'filterIntval' ),
 	);
 
+	// Stuff that shouldn't be saved as a preference.
+	private static $saveBlacklist = array(
+		'realname',
+		'emailaddress',
+	);
+
 	/**
 	 * @throws MWException
 	 * @param $user User
@@ -90,10 +96,19 @@ class Preferences {
 			}
 		}
 
+		## Make sure that form fields have their parent set. See bug 41337.
+		$dummyForm = new HTMLForm( array(), $context );
+
+		$disable = !$user->isAllowed( 'editmyoptions' );
+
 		## Prod in defaults from the user
 		foreach ( $defaultPreferences as $name => &$info ) {
 			$prefFromUser = self::getOptionFromUser( $name, $info, $user );
+			if ( $disable && !in_array( $name, self::$saveBlacklist ) ) {
+				$info['disabled'] = 'disabled';
+			}
 			$field = HTMLForm::loadInputFromParameters( $name, $info ); // For validation
+			$field->mParent = $dummyForm;
 			$defaultOptions = User::getDefaultOptions();
 			$globalDefault = isset( $defaultOptions[$name] )
 				? $defaultOptions[$name]
@@ -153,7 +168,7 @@ class Preferences {
 
 			foreach ( $columns as $column ) {
 				foreach ( $rows as $row ) {
-					if ( $user->getOption( "$prefix-$column-$row" ) ) {
+					if ( $user->getOption( "$prefix$column-$row" ) ) {
 						$val[] = "$column-$row";
 					}
 				}
@@ -173,7 +188,8 @@ class Preferences {
 		global $wgAuth, $wgContLang, $wgParser, $wgCookieExpiration, $wgLanguageCode,
 			$wgDisableTitleConversion, $wgDisableLangConversion, $wgMaxSigChars,
 			$wgEnableEmail, $wgEmailConfirmToEdit, $wgEnableUserEmail, $wgEmailAuthentication,
-			$wgEnotifWatchlist, $wgEnotifUserTalk, $wgEnotifRevealEditorAddress;
+			$wgEnotifWatchlist, $wgEnotifUserTalk, $wgEnotifRevealEditorAddress,
+			$wgSecureLogin;
 
 		// retrieving user name for GENDER and misc.
 		$userName = $user->getName();
@@ -225,10 +241,14 @@ class Preferences {
 			'section' => 'personal/info',
 		);
 
+		$editCount = Linker::link( SpecialPage::getTitleFor( "Contributions", $userName ),
+			$lang->formatNum( $user->getEditCount() ) );
+
 		$defaultPreferences['editcount'] = array(
 			'type' => 'info',
+			'raw' => true,
 			'label-message' => 'prefs-edits',
-			'default' => $lang->formatNum( $user->getEditCount() ),
+			'default' => $editCount,
 			'section' => 'personal/info',
 		);
 
@@ -248,28 +268,20 @@ class Preferences {
 			);
 		}
 
+		$canViewPrivateInfo = $user->isAllowed( 'viewmyprivateinfo' );
+		$canEditPrivateInfo = $user->isAllowed( 'editmyprivateinfo' );
+
 		// Actually changeable stuff
 		$defaultPreferences['realname'] = array(
-			'type' => $wgAuth->allowPropChange( 'realname' ) ? 'text' : 'info',
+			// (not really "private", but still shouldn't be edited without permission)
+			'type' => $canEditPrivateInfo && $wgAuth->allowPropChange( 'realname' ) ? 'text' : 'info',
 			'default' => $user->getRealName(),
 			'section' => 'personal/info',
 			'label-message' => 'yourrealname',
 			'help-message' => 'prefs-help-realname',
 		);
 
-		$defaultPreferences['gender'] = array(
-			'type' => 'select',
-			'section' => 'personal/info',
-			'options' => array(
-				$context->msg( 'gender-male' )->text() => 'male',
-				$context->msg( 'gender-female' )->text() => 'female',
-				$context->msg( 'gender-unknown' )->text() => 'unknown',
-			),
-			'label-message' => 'yourgender',
-			'help-message' => 'prefs-help-gender',
-		);
-
-		if ( $wgAuth->allowPasswordChange() ) {
+		if ( $canEditPrivateInfo && $wgAuth->allowPasswordChange() ) {
 			$link = Linker::link( SpecialPage::getTitleFor( 'ChangePassword' ),
 				$context->msg( 'prefs-resetpass' )->escaped(), array(),
 				array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' )->getPrefixedText() ) );
@@ -290,6 +302,15 @@ class Preferences {
 				'section' => 'personal/info',
 			);
 		}
+		// Only show preferhttps if secure login is turned on
+		if ( $wgSecureLogin && wfCanIPUseHTTPS( $context->getRequest()->getIP() ) ) {
+			$defaultPreferences['prefershttps'] = array(
+				'type' => 'toggle',
+				'label-message' => 'tog-prefershttps',
+				'help-message' => 'prefs-help-prefershttps',
+				'section' => 'personal/info'
+			);
+		}
 
 		// Language
 		$languages = Language::fetchLanguageNames( null, 'mw' );
@@ -310,39 +331,74 @@ class Preferences {
 			'label-message' => 'yourlanguage',
 		);
 
-		/* see if there are multiple language variants to choose from*/
-		$variantArray = array();
+		$defaultPreferences['gender'] = array(
+			'type' => 'radio',
+			'section' => 'personal/i18n',
+			'options' => array(
+				$context->msg( 'parentheses',
+					$context->msg( 'gender-unknown' )->text()
+				)->text() => 'unknown',
+				$context->msg( 'gender-female' )->text() => 'female',
+				$context->msg( 'gender-male' )->text() => 'male',
+			),
+			'label-message' => 'yourgender',
+			'help-message' => 'prefs-help-gender',
+		);
+
+		// see if there are multiple language variants to choose from
 		if ( !$wgDisableLangConversion ) {
-			$variants = $wgContLang->getVariants();
+			foreach ( LanguageConverter::$languagesWithVariants as $langCode ) {
+				if ( $langCode == $wgContLang->getCode() ) {
+					$variants = $wgContLang->getVariants();
 
-			foreach ( $variants as $v ) {
-				$v = str_replace( '_', '-', strtolower( $v ) );
-				$variantArray[$v] = $wgContLang->getVariantname( $v, false );
-			}
+					if ( count( $variants ) <= 1 ) {
+						continue;
+					}
 
-			$options = array();
-			foreach ( $variantArray as $code => $name ) {
-				$display = wfBCP47( $code ) . ' - ' . $name;
-				$options[$display] = $code;
-			}
+					$variantArray = array();
+					foreach ( $variants as $v ) {
+						$v = str_replace( '_', '-', strtolower( $v ) );
+						$variantArray[$v] = $lang->getVariantname( $v, false );
+					}
 
-			if ( count( $variantArray ) > 1 ) {
-				$defaultPreferences['variant'] = array(
-					'label-message' => 'yourvariant',
-					'type' => 'select',
-					'options' => $options,
-					'section' => 'personal/i18n',
-					'help-message' => 'prefs-help-variant',
-				);
+					$options = array();
+					foreach ( $variantArray as $code => $name ) {
+						$display = wfBCP47( $code ) . ' - ' . $name;
+						$options[$display] = $code;
+					}
+
+					$defaultPreferences['variant'] = array(
+						'label-message' => 'yourvariant',
+						'type' => 'select',
+						'options' => $options,
+						'section' => 'personal/i18n',
+						'help-message' => 'prefs-help-variant',
+					);
+
+					if ( !$wgDisableTitleConversion ) {
+						$defaultPreferences['noconvertlink'] = array(
+							'type' => 'toggle',
+							'section' => 'personal/i18n',
+							'label-message' => 'tog-noconvertlink',
+						);
+					}
+				} else {
+					$defaultPreferences["variant-$langCode"] = array(
+						'type' => 'api',
+					);
+				}
 			}
 		}
 
-		if ( count( $variantArray ) > 1 && !$wgDisableLangConversion && !$wgDisableTitleConversion ) {
-			$defaultPreferences['noconvertlink'] =
-				array(
+		// Stuff from Language::getExtraUserToggles()
+		// FIXME is this dead code? $extraUserToggles doesn't seem to be defined for any language
+		$toggles = $wgContLang->getExtraUserToggles();
+
+		foreach ( $toggles as $toggle ) {
+			$defaultPreferences[$toggle] = array(
 				'type' => 'toggle',
 				'section' => 'personal/i18n',
-				'label-message' => 'tog-noconvertlink',
+				'label-message' => "tog-$toggle",
 			);
 		}
 
@@ -374,43 +430,45 @@ class Preferences {
 		## Email stuff
 
 		if ( $wgEnableEmail ) {
-			$helpMessages[] = $wgEmailConfirmToEdit
-					? 'prefs-help-email-required'
-					: 'prefs-help-email';
-
-			if( $wgEnableUserEmail ) {
-				// additional messages when users can send email to each other
-				$helpMessages[] = 'prefs-help-email-others';
-			}
+			if ( $canViewPrivateInfo ) {
+				$helpMessages[] = $wgEmailConfirmToEdit
+						? 'prefs-help-email-required'
+						: 'prefs-help-email';
+
+				if ( $wgEnableUserEmail ) {
+					// additional messages when users can send email to each other
+					$helpMessages[] = 'prefs-help-email-others';
+				}
 
-			$link = Linker::link(
-				SpecialPage::getTitleFor( 'ChangeEmail' ),
-				$context->msg( $user->getEmail() ? 'prefs-changeemail' : 'prefs-setemail' )->escaped(),
-				array(),
-				array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' )->getPrefixedText() ) );
+				$emailAddress = $user->getEmail() ? htmlspecialchars( $user->getEmail() ) : '';
+				if ( $canEditPrivateInfo && $wgAuth->allowPropChange( 'emailaddress' ) ) {
+					$link = Linker::link(
+						SpecialPage::getTitleFor( 'ChangeEmail' ),
+						$context->msg( $user->getEmail() ? 'prefs-changeemail' : 'prefs-setemail' )->escaped(),
+						array(),
+						array( 'returnto' => SpecialPage::getTitleFor( 'Preferences' )->getPrefixedText() ) );
+
+					$emailAddress .= $emailAddress == '' ? $link : (
+						$context->msg( 'word-separator' )->plain()
+						. $context->msg( 'parentheses' )->rawParams( $link )->plain()
+					);
+				}
 
-			$emailAddress = $user->getEmail() ? htmlspecialchars( $user->getEmail() ) : '';
-			if ( $wgAuth->allowPropChange( 'emailaddress' ) ) {
-				$emailAddress .= $emailAddress == '' ? $link : (
-					$context->msg( 'word-separator' )->plain()
-					. $context->msg( 'parentheses' )->rawParams( $link )->plain()
+				$defaultPreferences['emailaddress'] = array(
+					'type' => 'info',
+					'raw' => true,
+					'default' => $emailAddress,
+					'label-message' => 'youremail',
+					'section' => 'personal/email',
+					'help-messages' => $helpMessages,
+					# 'cssclass' chosen below
 				);
 			}
 
-			$defaultPreferences['emailaddress'] = array(
-				'type' => 'info',
-				'raw' => true,
-				'default' => $emailAddress,
-				'label-message' => 'youremail',
-				'section' => 'personal/email',
-				'help-messages' => $helpMessages,
-				# 'cssclass' chosen below
-			);
-
 			$disableEmailPrefs = false;
 
-			$emailauthenticationclass = 'mw-email-not-authenticated';
 			if ( $wgEmailAuthentication ) {
+				$emailauthenticationclass = 'mw-email-not-authenticated';
 				if ( $user->getEmail() ) {
 					if ( $user->getEmailAuthenticationTimestamp() ) {
 						// date and time are separate parameters to facilitate localisation.
@@ -432,7 +490,7 @@ class Preferences {
 								SpecialPage::getTitleFor( 'Confirmemail' ),
 								$context->msg( 'emailconfirmlink' )->escaped()
 							) . '<br />';
-						$emailauthenticationclass="mw-email-not-authenticated";
+						$emailauthenticationclass = "mw-email-not-authenticated";
 					}
 				} else {
 					$disableEmailPrefs = true;
@@ -440,17 +498,19 @@ class Preferences {
 					$emailauthenticationclass = 'mw-email-none';
 				}
 
-				$defaultPreferences['emailauthentication'] = array(
-					'type' => 'info',
-					'raw' => true,
-					'section' => 'personal/email',
-					'label-message' => 'prefs-emailconfirm-label',
-					'default' => $emailauthenticated,
-					# Apply the same CSS class used on the input to the message:
-					'cssclass' => $emailauthenticationclass,
-				);
+				if ( $canViewPrivateInfo ) {
+					$defaultPreferences['emailauthentication'] = array(
+						'type' => 'info',
+						'raw' => true,
+						'section' => 'personal/email',
+						'label-message' => 'prefs-emailconfirm-label',
+						'default' => $emailauthenticated,
+						# Apply the same CSS class used on the input to the message:
+						'cssclass' => $emailauthenticationclass,
+					);
+					$defaultPreferences['emailaddress']['cssclass'] = $emailauthenticationclass;
+				}
 			}
-			$defaultPreferences['emailaddress']['cssclass'] = $emailauthenticationclass;
 
 			if ( $wgEnableUserEmail && $user->isAllowed( 'sendemail' ) ) {
 				$defaultPreferences['disablemail'] = array(
@@ -546,18 +606,6 @@ class Preferences {
 				'section' => 'rendering/skin',
 			);
 		}
-
-		$selectedSkin = $user->getOption( 'skin' );
-		if ( in_array( $selectedSkin, array( 'cologneblue', 'standard' ) ) ) {
-			$settings = array_flip( $context->getLanguage()->getQuickbarSettings() );
-
-			$defaultPreferences['quickbar'] = array(
-				'type' => 'radio',
-				'options' => $settings,
-				'section' => 'rendering/skin',
-				'label-message' => 'qbsettings',
-			);
-		}
 	}
 
 	/**
@@ -660,6 +708,18 @@ class Preferences {
 	 * @param $defaultPreferences Array
 	 */
 	static function renderingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
+		## Diffs ####################################
+		$defaultPreferences['diffonly'] = array(
+			'type' => 'toggle',
+			'section' => 'rendering/diffs',
+			'label-message' => 'tog-diffonly',
+		);
+		$defaultPreferences['norollbackdiff'] = array(
+			'type' => 'toggle',
+			'section' => 'rendering/diffs',
+			'label-message' => 'tog-norollbackdiff',
+		);
+
 		## Page Rendering ##############################
 		global $wgAllowUserCssPrefs;
 		if ( $wgAllowUserCssPrefs ) {
@@ -686,7 +746,7 @@ class Preferences {
 			'section' => 'rendering/advancedrendering',
 			'options' => $stubThresholdOptions,
 			'size' => 20,
-			'label' => $context->msg( 'stub-threshold' )->text(), // Raw HTML message. Yay?
+			'label-raw' => $context->msg( 'stub-threshold' )->text(), // Raw HTML message. Yay?
 		);
 
 		if ( $wgAllowUserCssPrefs ) {
@@ -706,11 +766,6 @@ class Preferences {
 			'section' => 'rendering/advancedrendering',
 			'label-message' => 'tog-showhiddencats'
 		);
-		$defaultPreferences['showjumplinks'] = array(
-			'type' => 'toggle',
-			'section' => 'rendering/advancedrendering',
-			'label-message' => 'tog-showjumplinks',
-		);
 
 		if ( $wgAllowUserCssPrefs ) {
 			$defaultPreferences['justify'] = array(
@@ -733,28 +788,31 @@ class Preferences {
 	 * @param $defaultPreferences Array
 	 */
 	static function editingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-		global $wgUseExternalEditor, $wgAllowUserCssPrefs;
+		global $wgAllowUserCssPrefs;
 
 		## Editing #####################################
-		$defaultPreferences['cols'] = array(
-			'type' => 'int',
-			'label-message' => 'columns',
-			'section' => 'editing/textboxsize',
-			'min' => 4,
-			'max' => 1000,
+		if ( $wgAllowUserCssPrefs ) {
+			$defaultPreferences['editsection'] = array(
+				'type' => 'toggle',
+				'section' => 'editing/advancedediting',
+				'label-message' => 'tog-editsection',
+			);
+		}
+		$defaultPreferences['editsectiononrightclick'] = array(
+			'type' => 'toggle',
+			'section' => 'editing/advancedediting',
+			'label-message' => 'tog-editsectiononrightclick',
 		);
-		$defaultPreferences['rows'] = array(
-			'type' => 'int',
-			'label-message' => 'rows',
-			'section' => 'editing/textboxsize',
-			'min' => 4,
-			'max' => 1000,
+		$defaultPreferences['editondblclick'] = array(
+			'type' => 'toggle',
+			'section' => 'editing/advancedediting',
+			'label-message' => 'tog-editondblclick',
 		);
 
 		if ( $wgAllowUserCssPrefs ) {
 			$defaultPreferences['editfont'] = array(
 				'type' => 'select',
-				'section' => 'editing/advancedediting',
+				'section' => 'editing/editor',
 				'label-message' => 'editfont-style',
 				'options' => array(
 					$context->msg( 'editfont-default' )->text() => 'default',
@@ -764,72 +822,59 @@ class Preferences {
 				)
 			);
 		}
-		$defaultPreferences['previewontop'] = array(
-			'type' => 'toggle',
-			'section' => 'editing/advancedediting',
-			'label-message' => 'tog-previewontop',
+		$defaultPreferences['cols'] = array(
+			'type' => 'int',
+			'label-message' => 'columns',
+			'section' => 'editing/editor',
+			'min' => 4,
+			'max' => 1000,
 		);
-		$defaultPreferences['previewonfirst'] = array(
-			'type' => 'toggle',
-			'section' => 'editing/advancedediting',
-			'label-message' => 'tog-previewonfirst',
+		$defaultPreferences['rows'] = array(
+			'type' => 'int',
+			'label-message' => 'rows',
+			'section' => 'editing/editor',
+			'min' => 4,
+			'max' => 1000,
 		);
-
-		if ( $wgAllowUserCssPrefs ) {
-			$defaultPreferences['editsection'] = array(
+		if ( $user->isAllowed( 'minoredit' ) ) {
+			$defaultPreferences['minordefault'] = array(
 				'type' => 'toggle',
-				'section' => 'editing/advancedediting',
-				'label-message' => 'tog-editsection',
+				'section' => 'editing/editor',
+				'label-message' => 'tog-minordefault',
 			);
 		}
-		$defaultPreferences['editsectiononrightclick'] = array(
+		$defaultPreferences['forceeditsummary'] = array(
 			'type' => 'toggle',
-			'section' => 'editing/advancedediting',
-			'label-message' => 'tog-editsectiononrightclick',
+			'section' => 'editing/editor',
+			'label-message' => 'tog-forceeditsummary',
 		);
-		$defaultPreferences['editondblclick'] = array(
+		$defaultPreferences['useeditwarning'] = array(
 			'type' => 'toggle',
-			'section' => 'editing/advancedediting',
-			'label-message' => 'tog-editondblclick',
+			'section' => 'editing/editor',
+			'label-message' => 'tog-useeditwarning',
 		);
 		$defaultPreferences['showtoolbar'] = array(
 			'type' => 'toggle',
-			'section' => 'editing/advancedediting',
+			'section' => 'editing/editor',
 			'label-message' => 'tog-showtoolbar',
 		);
 
-		if ( $user->isAllowed( 'minoredit' ) ) {
-			$defaultPreferences['minordefault'] = array(
-				'type' => 'toggle',
-				'section' => 'editing/advancedediting',
-				'label-message' => 'tog-minordefault',
-			);
-		}
-
-		if ( $wgUseExternalEditor ) {
-			$defaultPreferences['externaleditor'] = array(
-				'type' => 'toggle',
-				'section' => 'editing/advancedediting',
-				'label-message' => 'tog-externaleditor',
-			);
-			$defaultPreferences['externaldiff'] = array(
-				'type' => 'toggle',
-				'section' => 'editing/advancedediting',
-				'label-message' => 'tog-externaldiff',
-			);
-		}
-
-		$defaultPreferences['forceeditsummary'] = array(
+		$defaultPreferences['previewonfirst'] = array(
 			'type' => 'toggle',
-			'section' => 'editing/advancedediting',
-			'label-message' => 'tog-forceeditsummary',
+			'section' => 'editing/preview',
+			'label-message' => 'tog-previewonfirst',
+		);
+		$defaultPreferences['previewontop'] = array(
+			'type' => 'toggle',
+			'section' => 'editing/preview',
+			'label-message' => 'tog-previewontop',
 		);
-
 		$defaultPreferences['uselivepreview'] = array(
 			'type' => 'toggle',
-			'section' => 'editing/advancedediting',
+			'section' => 'editing/preview',
 			'label-message' => 'tog-uselivepreview',
 		);
+
 	}
 
 	/**
@@ -956,19 +1001,6 @@ class Preferences {
 			);
 		}
 
-		if ( $wgEnableAPI ) {
-			# Some random gibberish as a proposed default
-			// @todo Fixme: this should use CryptRand but we may not want to read urandom on every view
-			$hash = sha1( mt_rand() . microtime( true ) );
-
-			$defaultPreferences['watchlisttoken'] = array(
-				'type' => 'text',
-				'section' => 'watchlist/advancedwatchlist',
-				'label-message' => 'prefs-watchlist-token',
-				'help' => $context->msg( 'prefs-help-watchlist-token', $hash )->escaped()
-			);
-		}
-
 		$watchTypes = array(
 			'edit' => 'watchdefault',
 			'move' => 'watchmoves',
@@ -982,6 +1014,8 @@ class Preferences {
 
 		foreach ( $watchTypes as $action => $pref ) {
 			if ( $user->isAllowed( $action ) ) {
+				// Messages:
+				// tog-watchdefault, tog-watchmoves, tog-watchdeletion, tog-watchcreations
 				$defaultPreferences[$pref] = array(
 					'type' => 'toggle',
 					'section' => 'watchlist/advancedwatchlist',
@@ -989,6 +1023,19 @@ class Preferences {
 				);
 			}
 		}
+
+		if ( $wgEnableAPI ) {
+			$defaultPreferences['watchlisttoken'] = array(
+				'type' => 'api',
+			);
+			$defaultPreferences['watchlisttoken-info'] = array(
+				'type' => 'info',
+				'section' => 'watchlist/tokenwatchlist',
+				'label-message' => 'prefs-watchlist-token',
+				'default' => $user->getTokenFromOption( 'watchlisttoken' ),
+				'help-message' => 'prefs-help-watchlist-token2',
+			);
+		}
 	}
 
 	/**
@@ -1030,8 +1077,9 @@ class Preferences {
 		$nsOptions = $wgContLang->getFormattedNamespaces();
 		$nsOptions[0] = $context->msg( 'blanknamespace' )->text();
 		foreach ( $nsOptions as $ns => $name ) {
-			if ( $ns < 0 )
+			if ( $ns < 0 ) {
 				unset( $nsOptions[$ns] );
+			}
 		}
 
 		$defaultPreferences['searchnamespaces'] = array(
@@ -1044,35 +1092,9 @@ class Preferences {
 	}
 
 	/**
-	 * @param $user User
-	 * @param $context IContextSource
-	 * @param $defaultPreferences Array
+	 * Dummy, kept for backwards-compatibility.
 	 */
 	static function miscPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-		global $wgContLang;
-
-		## Misc #####################################
-		$defaultPreferences['diffonly'] = array(
-			'type' => 'toggle',
-			'section' => 'misc/diffs',
-			'label-message' => 'tog-diffonly',
-		);
-		$defaultPreferences['norollbackdiff'] = array(
-			'type' => 'toggle',
-			'section' => 'misc/diffs',
-			'label-message' => 'tog-norollbackdiff',
-		);
-
-		// Stuff from Language::getExtraUserToggles()
-		$toggles = $wgContLang->getExtraUserToggles();
-
-		foreach ( $toggles as $toggle ) {
-			$defaultPreferences[$toggle] = array(
-				'type' => 'toggle',
-				'section' => 'personal/i18n',
-				'label-message' => "tog-$toggle",
-			);
-		}
 	}
 
 	/**
@@ -1110,7 +1132,7 @@ class Preferences {
 			}
 
 			# Create preview link
-			$mplink = htmlspecialchars( $mptitle->getLocalURL( "useskin=$skinkey" ) );
+			$mplink = htmlspecialchars( $mptitle->getLocalURL( array( 'useskin' => $skinkey ) ) );
 			$linkTools[] = "<a target='_blank' href=\"$mplink\">$previewtext</a>";
 
 			# Create links to user CSS/JS pages
@@ -1278,15 +1300,17 @@ class Preferences {
 	}
 
 	/**
+	 * @param $context IContextSource
 	 * @return array
 	 */
 	static function getTimezoneOptions( IContextSource $context ) {
 		$opt = array();
 
-		global $wgLocalTZoffset, $wgLocaltimezone;
-		// Check that $wgLocalTZoffset is the same as $wgLocaltimezone
-		if ( $wgLocalTZoffset == date( 'Z' ) / 60 ) {
-			$server_tz_msg = $context->msg( 'timezoneuseserverdefault', $wgLocaltimezone )->text();
+		global $wgLocalTZoffset;
+		$timestamp = MWTimestamp::getLocalInstance();
+		// Check that $wgLocalTZoffset is the same as the local time zone offset
+		if ( $wgLocalTZoffset == $timestamp->format( 'Z' ) / 60 ) {
+			$server_tz_msg = $context->msg( 'timezoneuseserverdefault', $timestamp->getTimezone()->getName() )->text();
 		} else {
 			$tzstring = sprintf( '%+03d:%02d', floor( $wgLocalTZoffset / 60 ), abs( $wgLocalTZoffset ) % 60 );
 			$server_tz_msg = $context->msg( 'timezoneuseserverdefault', $tzstring )->text();
@@ -1368,7 +1392,9 @@ class Preferences {
 					$data[0] = intval( $data[0] );
 					$data[1] = intval( $data[1] );
 					$minDiff = abs( $data[0] ) * 60 + $data[1];
-					if ( $data[0] < 0 ) $minDiff = - $minDiff;
+					if ( $data[0] < 0 ) {
+						$minDiff = - $minDiff;
+					}
 				} else {
 					$minDiff = intval( $data[0] ) * 60;
 				}
@@ -1382,6 +1408,8 @@ class Preferences {
 	}
 
 	/**
+	 * Handle the form submission if everything validated properly
+	 *
 	 * @param $formData
 	 * @param $form PreferencesForm
 	 * @param $entryPoint string
@@ -1393,6 +1421,10 @@ class Preferences {
 		$user = $form->getModifiedUser();
 		$result = true;
 
+		if ( !$user->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
+			return Status::newFatal( 'mypreferencesprotected' );
+		}
+
 		// Filter input
 		foreach ( array_keys( $formData ) as $name ) {
 			if ( isset( self::$saveFilters[$name] ) ) {
@@ -1401,40 +1433,37 @@ class Preferences {
 			}
 		}
 
-		// Stuff that shouldn't be saved as a preference.
-		$saveBlacklist = array(
-			'realname',
-			'emailaddress',
-		);
-
 		// Fortunately, the realname field is MUCH simpler
-		if ( !in_array( 'realname', $wgHiddenPrefs ) ) {
+		// (not really "private", but still shouldn't be edited without permission)
+		if ( !in_array( 'realname', $wgHiddenPrefs ) && $user->isAllowed( 'editmyprivateinfo' ) ) {
 			$realName = $formData['realname'];
 			$user->setRealName( $realName );
 		}
 
-		foreach ( $saveBlacklist as $b ) {
-			unset( $formData[$b] );
-		}
+		if ( $user->isAllowed( 'editmyoptions' ) ) {
+			foreach ( self::$saveBlacklist as $b ) {
+				unset( $formData[$b] );
+			}
 
-		# If users have saved a value for a preference which has subsequently been disabled
-		# via $wgHiddenPrefs, we don't want to destroy that setting in case the preference
-		# is subsequently re-enabled
-		# TODO: maintenance script to actually delete these
-		foreach( $wgHiddenPrefs as $pref ) {
-			# If the user has not set a non-default value here, the default will be returned
-			# and subsequently discarded
-			$formData[$pref] = $user->getOption( $pref, null, true );
-		}
+			# If users have saved a value for a preference which has subsequently been disabled
+			# via $wgHiddenPrefs, we don't want to destroy that setting in case the preference
+			# is subsequently re-enabled
+			# TODO: maintenance script to actually delete these
+			foreach ( $wgHiddenPrefs as $pref ) {
+				# If the user has not set a non-default value here, the default will be returned
+				# and subsequently discarded
+				$formData[$pref] = $user->getOption( $pref, null, true );
+			}
 
-		// Keep old preferences from interfering due to back-compat code, etc.
-		$user->resetOptions( 'unused', $form->getContext() );
+			// Keep old preferences from interfering due to back-compat code, etc.
+			$user->resetOptions( 'unused', $form->getContext() );
 
-		foreach ( $formData as $key => $value ) {
-			$user->setOption( $key, $value );
-		}
+			foreach ( $formData as $key => $value ) {
+				$user->setOption( $key, $value );
+			}
 
-		$user->saveSettings();
+			$user->saveSettings();
+		}
 
 		$wgAuth->updateExternalDB( $user );
 
@@ -1469,7 +1498,8 @@ class Preferences {
 	/**
 	 * Try to set a user's email address.
 	 * This does *not* try to validate the address.
-	 * Caller is responsible for checking $wgAuth.
+	 * Caller is responsible for checking $wgAuth and 'editmyprivateinfo'
+	 * right.
 	 *
 	 * @deprecated in 1.20; use User::setEmailWithConfirmation() instead.
 	 * @param $user User
@@ -1488,7 +1518,7 @@ class Preferences {
 	}
 
 	/**
-	 * @deprecated in 1.19; will be removed in 1.20.
+	 * @deprecated in 1.19
 	 * @param $user User
 	 * @return array
 	 */
@@ -1558,52 +1588,37 @@ class PreferencesForm extends HTMLForm {
 	 * @return String
 	 */
 	function getButtons() {
+		if ( !$this->getModifiedUser()->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
+			return '';
+		}
+
 		$html = parent::getButtons();
 
-		$t = SpecialPage::getTitleFor( 'Preferences', 'reset' );
+		if ( $this->getModifiedUser()->isAllowed( 'editmyoptions' ) ) {
+			$t = SpecialPage::getTitleFor( 'Preferences', 'reset' );
 
-		$html .= "\n" . Linker::link( $t, $this->msg( 'restoreprefs' )->escaped() );
+			$html .= "\n" . Linker::link( $t, $this->msg( 'restoreprefs' )->escaped() );
 
-		$html = Xml::tags( 'div', array( 'class' => 'mw-prefs-buttons' ), $html );
+			$html = Xml::tags( 'div', array( 'class' => 'mw-prefs-buttons' ), $html );
+		}
 
 		return $html;
 	}
 
 	/**
+	 * Separate multi-option preferences into multiple preferences, since we
+	 * have to store them separately
 	 * @param $data array
 	 * @return array
 	 */
 	function filterDataForSubmit( $data ) {
-		// Support for separating multi-option preferences into multiple preferences
-		// Due to lack of array support.
 		foreach ( $this->mFlatFields as $fieldname => $field ) {
-			$info = $field->mParams;
-
-			if ( $field instanceof HTMLMultiSelectField ) {
-				$options = HTMLFormField::flattenOptions( $info['options'] );
+			if ( $field instanceof HTMLNestedFilterable ) {
+				$info = $field->mParams;
 				$prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
-
-				foreach ( $options as $opt ) {
-					$data["$prefix$opt"] = in_array( $opt, $data[$fieldname] );
+				foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
+					$data["$prefix$key"] = $value;
 				}
-
-				unset( $data[$fieldname] );
-
-			} elseif ( $field instanceof HTMLCheckMatrix ) {
-				$columns = HTMLFormField::flattenOptions( $info['columns'] );
-				$rows = HTMLFormField::flattenOptions( $info['rows'] );
-				$prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
-				foreach ( $columns as $column ) {
-					foreach ( $rows as $row ) {
-						// Make sure option hasn't been removed
-						if ( !isset( $info['remove-options'] )
-							|| !in_array( "$column-$row", $info['remove-options'] ) )
-						{
-							$data["$prefix-$column-$row"] = in_array( "$column-$row", $data[$fieldname] );
-						}
-					}
-				}
-
 				unset( $data[$fieldname] );
 			}
 		}
diff --git a/includes/PrefixSearch.php b/includes/PrefixSearch.php
index d37d9e80..3c464c58 100644
--- a/includes/PrefixSearch.php
+++ b/includes/PrefixSearch.php
@@ -37,16 +37,16 @@ class PrefixSearch {
 	 */
 	public static function titleSearch( $search, $limit, $namespaces = array() ) {
 		$search = trim( $search );
-		if( $search == '' ) {
+		if ( $search == '' ) {
 			return array(); // Return empty result
 		}
 		$namespaces = self::validateNamespaces( $namespaces );
 
 		// Find a Title which is not an interwiki and is in NS_MAIN
 		$title = Title::newFromText( $search );
-		if( $title && $title->getInterwiki() == '' ) {
+		if ( $title && $title->getInterwiki() == '' ) {
 			$ns = array( $title->getNamespace() );
-			if( $ns[0] == NS_MAIN ) {
+			if ( $ns[0] == NS_MAIN ) {
 				$ns = $namespaces; // no explicit prefix, use default namespaces
 			}
 			return self::searchBackend(
@@ -55,7 +55,7 @@ class PrefixSearch {
 
 		// Is this a namespace prefix?
 		$title = Title::newFromText( $search . 'Dummy' );
-		if( $title && $title->getText() == 'Dummy'
+		if ( $title && $title->getText() == 'Dummy'
 			&& $title->getNamespace() != NS_MAIN
 			&& $title->getInterwiki() == '' ) {
 			return self::searchBackend(
@@ -73,16 +73,16 @@ class PrefixSearch {
 	 * @return Array of strings
 	 */
 	protected static function searchBackend( $namespaces, $search, $limit ) {
-		if( count( $namespaces ) == 1 ) {
+		if ( count( $namespaces ) == 1 ) {
 			$ns = $namespaces[0];
-			if( $ns == NS_MEDIA ) {
+			if ( $ns == NS_MEDIA ) {
 				$namespaces = array( NS_FILE );
-			} elseif( $ns == NS_SPECIAL ) {
+			} elseif ( $ns == NS_SPECIAL ) {
 				return self::specialSearch( $search, $limit );
 			}
 		}
 		$srchres = array();
-		if( wfRunHooks( 'PrefixSearchBackend', array( $namespaces, $search, $limit, &$srchres ) ) ) {
+		if ( wfRunHooks( 'PrefixSearchBackend', array( $namespaces, $search, $limit, &$srchres ) ) ) {
 			return self::defaultSearchBackend( $namespaces, $search, $limit );
 		}
 		return $srchres;
@@ -106,24 +106,24 @@ class PrefixSearch {
 		// Unlike SpecialPage itself, we want the canonical forms of both
 		// canonical and alias title forms...
 		$keys = array();
-		foreach( SpecialPageFactory::getList() as $page => $class ) {
+		foreach ( SpecialPageFactory::getList() as $page => $class ) {
 			$keys[$wgContLang->caseFold( $page )] = $page;
 		}
 
-		foreach( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
-			if( !array_key_exists( $page, SpecialPageFactory::getList() ) ) {# bug 20885
+		foreach ( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
+			if ( !array_key_exists( $page, SpecialPageFactory::getList() ) ) {# bug 20885
 				continue;
 			}
 
-			foreach( $aliases as $alias ) {
+			foreach ( $aliases as $alias ) {
 				$keys[$wgContLang->caseFold( $alias )] = $alias;
 			}
 		}
 		ksort( $keys );
 
 		$srchres = array();
-		foreach( $keys as $pageKey => $page ) {
-			if( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
+		foreach ( $keys as $pageKey => $page ) {
+			if ( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
 				wfSuppressWarnings();
 				// bug 27671: Don't use SpecialPage::getTitleFor() here because it
 				// localizes its input leading to searches for e.g. Special:All
@@ -133,7 +133,7 @@ class PrefixSearch {
 				wfRestoreWarnings();
 			}
 
-			if( count( $srchres ) >= $limit ) {
+			if ( count( $srchres ) >= $limit ) {
 				break;
 			}
 		}
@@ -154,7 +154,7 @@ class PrefixSearch {
 	 */
 	protected static function defaultSearchBackend( $namespaces, $search, $limit ) {
 		$ns = array_shift( $namespaces ); // support only one namespace
-		if( in_array( NS_MAIN, $namespaces ) ) {
+		if ( in_array( NS_MAIN, $namespaces ) ) {
 			$ns = NS_MAIN; // if searching on many always default to main
 		}
 
@@ -175,7 +175,7 @@ class PrefixSearch {
 		$data = $module->getResultData();
 
 		// Reformat useful data for future printing by JSON engine
-		$srchres = array ();
+		$srchres = array();
 		foreach ( (array)$data['query']['allpages'] as $pageinfo ) {
 			// Note: this data will no be printable by the xml engine
 			// because it does not support lists of unnamed items
@@ -196,14 +196,14 @@ class PrefixSearch {
 
 		// We will look at each given namespace against wgContLang namespaces
 		$validNamespaces = $wgContLang->getNamespaces();
-		if( is_array( $namespaces ) && count( $namespaces ) > 0 ) {
+		if ( is_array( $namespaces ) && count( $namespaces ) > 0 ) {
 			$valid = array();
 			foreach ( $namespaces as $ns ) {
-				if( is_numeric( $ns ) && array_key_exists( $ns, $validNamespaces ) ) {
+				if ( is_numeric( $ns ) && array_key_exists( $ns, $validNamespaces ) ) {
 					$valid[] = $ns;
 				}
 			}
-			if( count( $valid ) > 0 ) {
+			if ( count( $valid ) > 0 ) {
 				return $valid;
 			}
 		}
diff --git a/includes/ProtectionForm.php b/includes/ProtectionForm.php
index d7b88400..f10317a9 100644
--- a/includes/ProtectionForm.php
+++ b/includes/ProtectionForm.php
@@ -91,7 +91,7 @@ class ProtectionForm {
 		$this->mReasonSelection = $wgRequest->getText( 'wpProtectReasonSelection' );
 		$this->mCascade = $wgRequest->getBool( 'mwProtect-cascade', $this->mCascade );
 
-		foreach( $this->mApplicableTypes as $action ) {
+		foreach ( $this->mApplicableTypes as $action ) {
 			// @todo FIXME: This form currently requires individual selections,
 			// but the db allows multiples separated by commas.
 
@@ -132,15 +132,20 @@ class ProtectionForm {
 			}
 
 			$val = $wgRequest->getVal( "mwProtect-level-$action" );
-			if( isset( $val ) && in_array( $val, $wgRestrictionLevels ) ) {
+			if ( isset( $val ) && in_array( $val, $wgRestrictionLevels ) ) {
 				// Prevent users from setting levels that they cannot later unset
-				if( $val == 'sysop' ) {
-					// Special case, rewrite sysop to either protect and editprotected
-					if( !$wgUser->isAllowedAny( 'protect', 'editprotected' ) )
+				if ( $val == 'sysop' ) {
+					// Special case, rewrite sysop to editprotected
+					if ( !$wgUser->isAllowed( 'editprotected' ) ) {
 						continue;
-				} else {
-					if( !$wgUser->isAllowed( $val ) )
+					}
+				} elseif ( $val == 'autoconfirmed' ) {
+					// Special case, rewrite autoconfirmed to editsemiprotected
+					if ( !$wgUser->isAllowed( 'editsemiprotected' ) ) {
 						continue;
+					}
+				} elseif ( !$wgUser->isAllowed( $val ) ) {
+					continue;
 				}
 				$this->mRestrictions[$action] = $val;
 			}
@@ -188,10 +193,10 @@ class ProtectionForm {
 			throw new ErrorPageError( 'protect-badnamespace-title', 'protect-badnamespace-text' );
 		}
 
-		if( $wgRequest->wasPosted() ) {
-			if( $this->save() ) {
+		if ( $wgRequest->wasPosted() ) {
+			if ( $this->save() ) {
 				$q = $this->mArticle->isRedirect() ? 'redirect=no' : '';
-				$wgOut->redirect( $this->mTitle->getFullUrl( $q ) );
+				$wgOut->redirect( $this->mTitle->getFullURL( $q ) );
 			}
 		} else {
 			$this->show();
@@ -282,10 +287,11 @@ class ProtectionForm {
 			$reasonstr = $this->mReason;
 		}
 		$expiry = array();
-		foreach( $this->mApplicableTypes as $action ) {
+		foreach ( $this->mApplicableTypes as $action ) {
 			$expiry[$action] = $this->getExpiry( $action );
-			if( empty( $this->mRestrictions[$action] ) )
+			if ( empty( $this->mRestrictions[$action] ) ) {
 				continue; // unprotected
+			}
 			if ( !$expiry[$action] ) {
 				$this->show( array( 'protect_expiry_invalid' ) );
 				return false;
@@ -296,13 +302,7 @@ class ProtectionForm {
 			}
 		}
 
-		# They shouldn't be able to do this anyway, but just to make sure, ensure that cascading restrictions aren't being applied
-		#  to a semi-protected page.
-		$edit_restriction = isset( $this->mRestrictions['edit'] ) ? $this->mRestrictions['edit'] : '';
 		$this->mCascade = $wgRequest->getBool( 'mwProtect-cascade' );
-		if ( $this->mCascade && ($edit_restriction != 'protect') &&
-			!User::groupHasPermission( $edit_restriction, 'protect' ) )
-			$this->mCascade = false;
 
 		$status = $this->mArticle->doUpdateRestrictions( $this->mRestrictions, $expiry, $this->mCascade, $reasonstr, $wgUser );
 
@@ -318,23 +318,18 @@ class ProtectionForm {
 		 *             you can also return an array of message name and its parameters
 		 */
 		$errorMsg = '';
-		if( !wfRunHooks( 'ProtectionForm::save', array( $this->mArticle, &$errorMsg ) ) ) {
+		if ( !wfRunHooks( 'ProtectionForm::save', array( $this->mArticle, &$errorMsg, $reasonstr ) ) ) {
 			if ( $errorMsg == '' ) {
 				$errorMsg = array( 'hookaborted' );
 			}
 		}
-		if( $errorMsg != '' ) {
+		if ( $errorMsg != '' ) {
 			$this->show( $errorMsg );
 			return false;
 		}
 
-		if ( $wgUser->isLoggedIn() && $wgRequest->getCheck( 'mwProtectWatch' ) != $wgUser->isWatched( $this->mTitle ) ) {
-			if ( $wgRequest->getCheck( 'mwProtectWatch' ) ) {
-				WatchAction::doWatch( $this->mTitle, $wgUser );
-			} else {
-				WatchAction::doUnwatch( $this->mTitle, $wgUser );
-			}
-		}
+		WatchAction::doWatchOrUnwatch( $wgRequest->getCheck( 'mwProtectWatch' ), $this->mTitle, $wgUser );
+
 		return true;
 	}
 
@@ -356,10 +351,10 @@ class ProtectionForm {
 		);
 
 		$out = '';
-		if( !$this->disabled ) {
+		if ( !$this->disabled ) {
 			$wgOut->addModules( 'mediawiki.legacy.protect' );
 			$out .= Xml::openElement( 'form', array( 'method' => 'post',
-				'action' => $this->mTitle->getLocalUrl( 'action=protect' ),
+				'action' => $this->mTitle->getLocalURL( 'action=protect' ),
 				'id' => 'mw-Protect-Form', 'onsubmit' => 'ProtectionForm.enableUnchainedInputs(true)' ) );
 		}
 
@@ -368,10 +363,12 @@ class ProtectionForm {
 			Xml::openElement( 'table', array( 'id' => 'mwProtectSet' ) ) .
 			Xml::openElement( 'tbody' );
 
-		foreach( $this->mRestrictions as $action => $selected ) {
-			/* Not all languages have V_x <-> N_x relation */
+		// Not all languages have V_x <-> N_x relation
+		foreach ( $this->mRestrictions as $action => $selected ) {
+			// Messages:
+			// restriction-edit, restriction-move, restriction-create, restriction-upload
 			$msg = wfMessage( 'restriction-' . $action );
-			$out .= "<tr><td>".
+			$out .= "<tr><td>" .
 			Xml::openElement( 'fieldset' ) .
 			Xml::element( 'legend', null, $msg->exists() ? $msg->text() : $action ) .
 			Xml::openElement( 'table', array( 'id' => "mw-protect-table-$action" ) ) .
@@ -384,7 +381,7 @@ class ProtectionForm {
 				'mwProtect-reason', 4 );
 			$scExpiryOptions = wfMessage( 'protect-expiry-options' )->inContentLanguage()->text();
 
-			$showProtectOptions = ($scExpiryOptions !== '-' && !$this->disabled);
+			$showProtectOptions = $scExpiryOptions !== '-' && !$this->disabled;
 
 			$mProtectexpiry = Xml::label(
 				wfMessage( 'protectexpiry' )->text(),
@@ -412,7 +409,7 @@ class ProtectionForm {
 				wfMessage( 'protect-othertime-op' )->text(),
 				"othertime"
 			) . "\n";
-			foreach( explode( ',', $scExpiryOptions ) as $option ) {
+			foreach ( explode( ',', $scExpiryOptions ) as $option ) {
 				if ( strpos( $option, ":" ) === false ) {
 					$show = $value = $option;
 				} else {
@@ -423,7 +420,7 @@ class ProtectionForm {
 				$expiryFormOptions .= Xml::option( $show, $value, $this->mExpirySelection[$action] === $value ) . "\n";
 			}
 			# Add expiry dropdown
-			if( $showProtectOptions && !$this->disabled ) {
+			if ( $showProtectOptions && !$this->disabled ) {
 				$out .= "
 					<table><tr>
 						<td class='mw-label'>
@@ -463,7 +460,7 @@ class ProtectionForm {
 		$out .= Xml::closeElement( 'tbody' ) . Xml::closeElement( 'table' );
 
 		// JavaScript will add another row with a value-chaining checkbox
-		if( $this->mTitle->exists() ) {
+		if ( $this->mTitle->exists() ) {
 			$out .= Xml::openElement( 'table', array( 'id' => 'mw-protect-table2' ) ) .
 				Xml::openElement( 'tbody' );
 			$out .= '<tr>
@@ -481,7 +478,7 @@ class ProtectionForm {
 		}
 
 		# Add manual and custom reason field/selects as well as submit
-		if( !$this->disabled ) {
+		if ( !$this->disabled ) {
 			$out .= Xml::openElement( 'table', array( 'id' => 'mw-protect-table3' ) ) .
 				Xml::openElement( 'tbody' );
 			$out .= "
@@ -506,7 +503,7 @@ class ProtectionForm {
 					"</td>
 				</tr>";
 			# Disallow watching is user is not logged in
-			if( $wgUser->isLoggedIn() ) {
+			if ( $wgUser->isLoggedIn() ) {
 				$out .= "
 				<tr>
 					<td></td>
@@ -562,15 +559,22 @@ class ProtectionForm {
 		global $wgRestrictionLevels, $wgUser;
 
 		$levels = array();
-		foreach( $wgRestrictionLevels as $key ) {
+		foreach ( $wgRestrictionLevels as $key ) {
 			//don't let them choose levels above their own (aka so they can still unprotect and edit the page). but only when the form isn't disabled
-			if( $key == 'sysop' ) {
-				//special case, rewrite sysop to protect and editprotected
-				if( !$wgUser->isAllowedAny( 'protect', 'editprotected' ) && !$this->disabled )
+			if ( $key == 'sysop' ) {
+				//special case, rewrite sysop to editprotected
+				if ( !$wgUser->isAllowed( 'editprotected' ) && !$this->disabled ) {
+					continue;
+				}
+			} elseif ( $key == 'autoconfirmed' ) {
+				//special case, rewrite autoconfirmed to editsemiprotected
+				if ( !$wgUser->isAllowed( 'editsemiprotected' ) && !$this->disabled ) {
 					continue;
+				}
 			} else {
-				if( !$wgUser->isAllowed( $key ) && !$this->disabled )
+				if ( !$wgUser->isAllowed( $key ) && !$this->disabled ) {
 					continue;
+				}
 			}
 			$levels[] = $key;
 		}
@@ -584,7 +588,7 @@ class ProtectionForm {
 			) + $this->disabledAttrib;
 
 		$out = Xml::openElement( 'select', $attribs );
-		foreach( $levels as $key ) {
+		foreach ( $levels as $key ) {
 			$out .= Xml::option( $this->getOptionLabel( $key ), $key, $key == $selected );
 		}
 		$out .= Xml::closeElement( 'select' );
@@ -598,11 +602,12 @@ class ProtectionForm {
 	 * @return String
 	 */
 	private function getOptionLabel( $permission ) {
-		if( $permission == '' ) {
+		if ( $permission == '' ) {
 			return wfMessage( 'protect-default' )->text();
 		} else {
+			// Messages: protect-level-autoconfirmed, protect-level-sysop
 			$msg = wfMessage( "protect-level-{$permission}" );
-			if( $msg->exists() ) {
+			if ( $msg->exists() ) {
 				return $msg->text();
 			}
 			return wfMessage( 'protect-fallback', $permission )->text();
@@ -610,16 +615,9 @@ class ProtectionForm {
 	}
 
 	function buildCleanupScript() {
-		global $wgRestrictionLevels, $wgOut;
-
-		$cascadeableLevels = array();
-		foreach( $wgRestrictionLevels as $key ) {
-			if ( User::groupHasPermission( $key, 'protect' )
-				|| $key == 'protect'
-			) {
-				$cascadeableLevels[] = $key;
-			}
-		}
+		global $wgCascadingRestrictionLevels, $wgOut;
+
+		$cascadeableLevels = $wgCascadingRestrictionLevels;
 		$options = array(
 			'tableId' => 'mwProtectSet',
 			'labelText' => wfMessage( 'protect-unchain-permissions' )->plain(),
diff --git a/includes/ProxyTools.php b/includes/ProxyTools.php
index b54a9a35..bf1c4059 100644
--- a/includes/ProxyTools.php
+++ b/includes/ProxyTools.php
@@ -84,43 +84,3 @@ function wfIsConfiguredProxy( $ip ) {
 		in_array( $ip, $wgSquidServersNoPurge );
 	return $trusted;
 }
-
-/**
- * Forks processes to scan the originating IP for an open proxy server
- * MemCached can be used to skip IPs that have already been scanned
- */
-function wfProxyCheck() {
-	global $wgBlockOpenProxies, $wgProxyPorts, $wgProxyScriptPath;
-	global $wgMemc, $wgProxyMemcExpiry, $wgRequest;
-	global $wgProxyKey;
-
-	if ( !$wgBlockOpenProxies ) {
-		return;
-	}
-
-	$ip = $wgRequest->getIP();
-
-	# Get MemCached key
-	$mcKey = wfMemcKey( 'proxy', 'ip', $ip );
-	$mcValue = $wgMemc->get( $mcKey );
-	$skip = (bool)$mcValue;
-
-	# Fork the processes
-	if ( !$skip ) {
-		$title = SpecialPage::getTitleFor( 'Blockme' );
-		$iphash = md5( $ip . $wgProxyKey );
-		$url = wfExpandUrl( $title->getFullURL( 'ip=' . $iphash ), PROTO_HTTP );
-
-		foreach ( $wgProxyPorts as $port ) {
-			$params = implode( ' ', array(
-						escapeshellarg( $wgProxyScriptPath ),
-						escapeshellarg( $ip ),
-						escapeshellarg( $port ),
-						escapeshellarg( $url )
-						));
-			exec( "php $params >" . wfGetNull() . " 2>&1 &" );
-		}
-		# Set MemCached key
-		$wgMemc->set( $mcKey, 1, $wgProxyMemcExpiry );
-	}
-}
diff --git a/includes/QueryPage.php b/includes/QueryPage.php
index e1f24fa9..51b5706f 100644
--- a/includes/QueryPage.php
+++ b/includes/QueryPage.php
@@ -35,7 +35,6 @@ $wgQueryPages = array(
 	array( 'AncientPagesPage',              'Ancientpages'                  ),
 	array( 'BrokenRedirectsPage',           'BrokenRedirects'               ),
 	array( 'DeadendPagesPage',              'Deadendpages'                  ),
-	array( 'DisambiguationsPage',           'Disambiguations'               ),
 	array( 'DoubleRedirectsPage',           'DoubleRedirects'               ),
 	array( 'FileDuplicateSearchPage',       'FileDuplicateSearch'           ),
 	array( 'LinkSearchPage',                'LinkSearch'                    ),
@@ -69,8 +68,9 @@ $wgQueryPages = array(
 wfRunHooks( 'wgQueryPages', array( &$wgQueryPages ) );
 
 global $wgDisableCounters;
-if ( !$wgDisableCounters )
+if ( !$wgDisableCounters ) {
 	$wgQueryPages[] = array( 'PopularPagesPage', 'Popularpages' );
+}
 
 /**
  * This is a class for doing query pages; since they're almost all the same,
@@ -89,7 +89,7 @@ abstract class QueryPage extends SpecialPage {
 	/**
 	 * The offset and limit in use, as passed to the query() function
 	 *
-	 * @var integer
+	 * @var int
 	 */
 	var $offset = 0;
 	var $limit = 0;
@@ -111,7 +111,7 @@ abstract class QueryPage extends SpecialPage {
 	/**
 	 * A mutator for $this->listoutput;
 	 *
-	 * @param $bool Boolean
+	 * @param bool $bool
 	 */
 	function setListoutput( $bool ) {
 		$this->listoutput = $bool;
@@ -186,7 +186,7 @@ abstract class QueryPage extends SpecialPage {
 	/**
 	 * Override to sort by increasing values
 	 *
-	 * @return Boolean
+	 * @return bool
 	 */
 	function sortDescending() {
 		return true;
@@ -197,7 +197,7 @@ abstract class QueryPage extends SpecialPage {
 	 * don't let it run in miser mode. $wgDisableQueryPages causes all query
 	 * pages to be declared expensive. Some query pages are always expensive.
 	 *
-	 * @return Boolean
+	 * @return bool
 	 */
 	function isExpensive() {
 		global $wgDisableQueryPages;
@@ -208,7 +208,7 @@ abstract class QueryPage extends SpecialPage {
 	 * Is the output of this query cacheable? Non-cacheable expensive pages
 	 * will be disabled in miser mode and will not have their results written
 	 * to the querycache table.
-	 * @return Boolean
+	 * @return bool
 	 * @since 1.18
 	 */
 	public function isCacheable() {
@@ -219,7 +219,7 @@ abstract class QueryPage extends SpecialPage {
 	 * Whether or not the output of the page in question is retrieved from
 	 * the database cache.
 	 *
-	 * @return Boolean
+	 * @return bool
 	 */
 	function isCached() {
 		global $wgMiserMode;
@@ -230,7 +230,7 @@ abstract class QueryPage extends SpecialPage {
 	/**
 	 * Sometime we don't want to build rss / atom feeds.
 	 *
-	 * @return Boolean
+	 * @return bool
 	 */
 	function isSyndicated() {
 		return true;
@@ -241,19 +241,16 @@ abstract class QueryPage extends SpecialPage {
 	 * skin; you can use it for making links. The result is a single row of
 	 * result data. You should be able to grab SQL results off of it.
 	 * If the function returns false, the line output will be skipped.
-	 * @param $skin Skin
-	 * @param $result object Result row
-	 * @return mixed String or false to skip
-	 *
-	 * @param $skin Skin object
-	 * @param $result Object: database row
+	 * @param Skin $skin
+	 * @param object $result Result row
+	 * @return string|bool String or false to skip
 	 */
 	abstract function formatResult( $skin, $result );
 
 	/**
 	 * The content returned by this function will be output before any result
 	 *
-	 * @return String
+	 * @return string
 	 */
 	function getPageHeader() {
 		return '';
@@ -264,7 +261,7 @@ abstract class QueryPage extends SpecialPage {
 	 * as an associative array. They will be encoded and added to the paging
 	 * links (prev/next/lengths).
 	 *
-	 * @return Array
+	 * @return array
 	 */
 	function linkParameters() {
 		return array();
@@ -285,8 +282,9 @@ abstract class QueryPage extends SpecialPage {
 	/**
 	 * Clear the cache and save new results
 	 *
-	 * @param $limit Integer: limit for SQL statement
-	 * @param $ignoreErrors Boolean: whether to ignore database errors
+	 * @param int|bool $limit Limit for SQL statement
+	 * @param bool $ignoreErrors Whether to ignore database errors
+	 * @throws DBError|Exception
 	 * @return bool|int
 	 */
 	function recache( $limit, $ignoreErrors = true ) {
@@ -351,8 +349,8 @@ abstract class QueryPage extends SpecialPage {
 
 	/**
 	 * Run the query and return the result
-	 * @param $limit mixed Numerical limit or false for no limit
-	 * @param $offset mixed Numerical offset or false for no offset
+	 * @param int|bool $limit Numerical limit or false for no limit
+	 * @param int|bool $offset Numerical offset or false for no offset
 	 * @return ResultWrapper
 	 * @since 1.18
 	 */
@@ -361,23 +359,28 @@ abstract class QueryPage extends SpecialPage {
 		$dbr = wfGetDB( DB_SLAVE );
 		$query = $this->getQueryInfo();
 		$order = $this->getOrderFields();
+
 		if ( $this->sortDescending() ) {
 			foreach ( $order as &$field ) {
 				$field .= ' DESC';
 			}
 		}
+
 		if ( is_array( $query ) ) {
 			$tables = isset( $query['tables'] ) ? (array)$query['tables'] : array();
 			$fields = isset( $query['fields'] ) ? (array)$query['fields'] : array();
 			$conds = isset( $query['conds'] ) ? (array)$query['conds'] : array();
 			$options = isset( $query['options'] ) ? (array)$query['options'] : array();
 			$join_conds = isset( $query['join_conds'] ) ? (array)$query['join_conds'] : array();
+
 			if ( count( $order ) ) {
 				$options['ORDER BY'] = $order;
 			}
+
 			if ( $limit !== false ) {
 				$options['LIMIT'] = intval( $limit );
 			}
+
 			if ( $offset !== false ) {
 				$options['OFFSET'] = intval( $offset );
 			}
@@ -392,11 +395,14 @@ abstract class QueryPage extends SpecialPage {
 			$sql = $dbr->limitResult( $sql, $limit, $offset );
 			$res = $dbr->query( $sql, $fname );
 		}
+
 		return $dbr->resultObject( $res );
 	}
 
 	/**
 	 * Somewhat deprecated, you probably want to be using execute()
+	 * @param int|bool $offset
+	 * @oaram int|bool $limit
 	 * @return ResultWrapper
 	 */
 	function doQuery( $offset = false, $limit = false ) {
@@ -409,14 +415,14 @@ abstract class QueryPage extends SpecialPage {
 
 	/**
 	 * Fetch the query results from the query cache
-	 * @param $limit mixed Numerical limit or false for no limit
-	 * @param $offset mixed Numerical offset or false for no offset
+	 * @param int|bool $limit Numerical limit or false for no limit
+	 * @param int|bool $offset Numerical offset or false for no offset
 	 * @return ResultWrapper
 	 * @since 1.18
 	 */
 	function fetchFromCache( $limit, $offset = false ) {
 		$dbr = wfGetDB( DB_SLAVE );
-		$options = array ();
+		$options = array();
 		if ( $limit !== false ) {
 			$options['LIMIT'] = intval( $limit );
 		}
@@ -451,6 +457,7 @@ abstract class QueryPage extends SpecialPage {
 	/**
 	 * This is the actual workhorse. It does everything needed to make a
 	 * real, honest-to-gosh query page.
+	 * @para $par
 	 * @return int
 	 */
 	function execute( $par ) {
@@ -562,12 +569,12 @@ abstract class QueryPage extends SpecialPage {
 	 * Format and output report results using the given information plus
 	 * OutputPage
 	 *
-	 * @param $out OutputPage to print to
-	 * @param $skin Skin: user skin to use
-	 * @param $dbr Database (read) connection to use
-	 * @param $res Integer: result pointer
-	 * @param $num Integer: number of available result rows
-	 * @param $offset Integer: paging offset
+	 * @param OutputPage $out OutputPage to print to
+	 * @param Skin $skin User skin to use
+	 * @param DatabaseBase $dbr Database (read) connection to use
+	 * @param int $res Result pointer
+	 * @param int $num Number of available result rows
+	 * @param int $offset Paging offset
 	 */
 	protected function outputResults( $out, $skin, $dbr, $res, $num, $offset ) {
 		global $wgContLang;
@@ -580,7 +587,7 @@ abstract class QueryPage extends SpecialPage {
 
 			# $res might contain the whole 1,000 rows, so we read up to
 			# $num [should update this to use a Pager]
-			for ( $i = 0; $i < $num && $row = $dbr->fetchObject( $res ); $i++ ) {
+			for ( $i = 0; $i < $num && $row = $res->fetchObject(); $i++ ) {
 				$line = $this->formatResult( $skin, $row );
 				if ( $line ) {
 					$attr = ( isset( $row->usepatrol ) && $row->usepatrol && $row->patrolled == 0 )
@@ -635,25 +642,26 @@ abstract class QueryPage extends SpecialPage {
 
 	/**
 	 * Do any necessary preprocessing of the result object.
+	 * @param DatabaseBase $db
+	 * @param ResultWrapper $res
 	 */
 	function preprocessResults( $db, $res ) {}
 
 	/**
 	 * Similar to above, but packaging in a syndicated feed instead of a web page
+	 * @param string $class
+	 * @param int $limit
 	 * @return bool
 	 */
 	function doFeed( $class = '', $limit = 50 ) {
-		global $wgFeed, $wgFeedClasses;
+		global $wgFeed, $wgFeedClasses, $wgFeedLimit;
 
 		if ( !$wgFeed ) {
 			$this->getOutput()->addWikiMsg( 'feed-unavailable' );
 			return false;
 		}
 
-		global $wgFeedLimit;
-		if ( $limit > $wgFeedLimit ) {
-			$limit = $wgFeedLimit;
-		}
+		$limit = min( $limit, $wgFeedLimit );
 
 		if ( isset( $wgFeedClasses[$class] ) ) {
 			$feed = new $wgFeedClasses[$class](
@@ -680,6 +688,7 @@ abstract class QueryPage extends SpecialPage {
 	/**
 	 * Override for custom handling. If the titles/links are ok, just do
 	 * feedItemDesc()
+	 * @param object $row
 	 * @return FeedItem|null
 	 */
 	function feedResult( $row ) {
@@ -735,7 +744,6 @@ abstract class QueryPage extends SpecialPage {
  * WantedPages, WantedTemplates, etc
  */
 abstract class WantedQueryPage extends QueryPage {
-
 	function isExpensive() {
 		return true;
 	}
@@ -746,6 +754,8 @@ abstract class WantedQueryPage extends QueryPage {
 
 	/**
 	 * Cache page existence for performance
+	 * @param DatabaseBase $db
+	 * @param ResultWrapper $res
 	 */
 	function preprocessResults( $db, $res ) {
 		if ( !$res->numRows() ) {
@@ -777,8 +787,8 @@ abstract class WantedQueryPage extends QueryPage {
 	/**
 	 * Format an individual result
 	 *
-	 * @param $skin Skin to use for UI elements
-	 * @param $result Result row
+	 * @param Skin $skin Skin to use for UI elements
+	 * @param object $result Result row
 	 * @return string
 	 */
 	public function formatResult( $skin, $result ) {
@@ -812,8 +822,8 @@ abstract class WantedQueryPage extends QueryPage {
 	/**
 	 * Make a "what links here" link for a given title
 	 *
-	 * @param $title Title to make the link for
-	 * @param $result Object: result row
+	 * @param Title $title Title to make the link for
+	 * @param object $result Result row
 	 * @return string
 	 */
 	private function makeWlhLink( $title, $result ) {
diff --git a/includes/RecentChange.php b/includes/RecentChange.php
deleted file mode 100644
index d7cf995c..00000000
--- a/includes/RecentChange.php
+++ /dev/null
@@ -1,840 +0,0 @@
-<?php
-/**
- * Utility class for creating and accessing recent change entries.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Utility class for creating new RC entries
- *
- * mAttribs:
- *  rc_id           id of the row in the recentchanges table
- *  rc_timestamp    time the entry was made
- *  rc_cur_time     timestamp on the cur row
- *  rc_namespace    namespace #
- *  rc_title        non-prefixed db key
- *  rc_type         is new entry, used to determine whether updating is necessary
- *  rc_minor        is minor
- *  rc_cur_id       page_id of associated page entry
- *  rc_user         user id who made the entry
- *  rc_user_text    user name who made the entry
- *  rc_comment      edit summary
- *  rc_this_oldid   rev_id associated with this entry (or zero)
- *  rc_last_oldid   rev_id associated with the entry before this one (or zero)
- *  rc_bot          is bot, hidden
- *  rc_ip           IP address of the user in dotted quad notation
- *  rc_new          obsolete, use rc_type==RC_NEW
- *  rc_patrolled    boolean whether or not someone has marked this edit as patrolled
- *  rc_old_len      integer byte length of the text before the edit
- *  rc_new_len      the same after the edit
- *  rc_deleted      partial deletion
- *  rc_logid        the log_id value for this log entry (or zero)
- *  rc_log_type     the log type (or null)
- *  rc_log_action   the log action (or null)
- *  rc_params       log params
- *
- * mExtra:
- *  prefixedDBkey   prefixed db key, used by external app via msg queue
- *  lastTimestamp   timestamp of previous entry, used in WHERE clause during update
- *  lang            the interwiki prefix, automatically set in save()
- *  oldSize         text size before the change
- *  newSize         text size after the change
- *  pageStatus      status of the page: created, deleted, moved, restored, changed
- *
- * temporary:       not stored in the database
- *      notificationtimestamp
- *      numberofWatchingusers
- *
- * @todo document functions and variables
- */
-class RecentChange {
-	var $mAttribs = array(), $mExtra = array();
-
-	/**
-	 * @var Title
-	 */
-	var $mTitle = false;
-
-	/**
-	 * @var User
-	 */
-	private $mPerformer = false;
-
-	/**
-	 * @var Title
-	 */
-	var $mMovedToTitle = false;
-	var $numberofWatchingusers = 0; # Dummy to prevent error message in SpecialRecentchangeslinked
-	var $notificationtimestamp;
-
-	# Factory methods
-
-	/**
-	 * @param $row
-	 * @return RecentChange
-	 */
-	public static function newFromRow( $row ) {
-		$rc = new RecentChange;
-		$rc->loadFromRow( $row );
-		return $rc;
-	}
-
-	/**
-	 * @param $row
-	 * @return RecentChange
-	 */
-	public static function newFromCurRow( $row ) {
-		$rc = new RecentChange;
-		$rc->loadFromCurRow( $row );
-		$rc->notificationtimestamp = false;
-		$rc->numberofWatchingusers = false;
-		return $rc;
-	}
-
-	/**
-	 * Obtain the recent change with a given rc_id value
-	 *
-	 * @param int $rcid rc_id value to retrieve
-	 * @return RecentChange
-	 */
-	public static function newFromId( $rcid ) {
-		return self::newFromConds( array( 'rc_id' => $rcid ), __METHOD__ );
-	}
-
-	/**
-	 * Find the first recent change matching some specific conditions
-	 *
-	 * @param array $conds of conditions
-	 * @param $fname Mixed: override the method name in profiling/logs
-	 * @return RecentChange
-	 */
-	public static function newFromConds( $conds, $fname = __METHOD__ ) {
-		$dbr = wfGetDB( DB_SLAVE );
-		$row = $dbr->selectRow( 'recentchanges', self::selectFields(), $conds, $fname );
-		if ( $row !== false ) {
-			return self::newFromRow( $row );
-		} else {
-			return null;
-		}
-	}
-
-	/**
-	 * Return the list of recentchanges fields that should be selected to create
-	 * a new recentchanges object.
-	 * @return array
-	 */
-	public static function selectFields() {
-		return array(
-			'rc_id',
-			'rc_timestamp',
-			'rc_cur_time',
-			'rc_user',
-			'rc_user_text',
-			'rc_namespace',
-			'rc_title',
-			'rc_comment',
-			'rc_minor',
-			'rc_bot',
-			'rc_new',
-			'rc_cur_id',
-			'rc_this_oldid',
-			'rc_last_oldid',
-			'rc_type',
-			'rc_patrolled',
-			'rc_ip',
-			'rc_old_len',
-			'rc_new_len',
-			'rc_deleted',
-			'rc_logid',
-			'rc_log_type',
-			'rc_log_action',
-			'rc_params',
-		);
-	}
-
-	# Accessors
-
-	/**
-	 * @param $attribs array
-	 */
-	public function setAttribs( $attribs ) {
-		$this->mAttribs = $attribs;
-	}
-
-	/**
-	 * @param $extra array
-	 */
-	public function setExtra( $extra ) {
-		$this->mExtra = $extra;
-	}
-
-	/**
-	 *
-	 * @return Title
-	 */
-	public function &getTitle() {
-		if ( $this->mTitle === false ) {
-			$this->mTitle = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] );
-		}
-		return $this->mTitle;
-	}
-
-	/**
-	 * Get the User object of the person who performed this change.
-	 *
-	 * @return User
-	 */
-	public function getPerformer() {
-		if ( $this->mPerformer === false ) {
-			if ( $this->mAttribs['rc_user'] ) {
-				$this->mPerformer = User::newFromID( $this->mAttribs['rc_user'] );
-			} else {
-				$this->mPerformer = User::newFromName( $this->mAttribs['rc_user_text'], false );
-			}
-		}
-		return $this->mPerformer;
-	}
-
-	/**
-	 * Writes the data in this object to the database
-	 * @param $noudp bool
-	 */
-	public function save( $noudp = false ) {
-		global $wgLocalInterwiki, $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker, $wgContLang;
-
-		$dbw = wfGetDB( DB_MASTER );
-		if ( !is_array( $this->mExtra ) ) {
-			$this->mExtra = array();
-		}
-		$this->mExtra['lang'] = $wgLocalInterwiki;
-
-		if ( !$wgPutIPinRC ) {
-			$this->mAttribs['rc_ip'] = '';
-		}
-
-		# If our database is strict about IP addresses, use NULL instead of an empty string
-		if ( $dbw->strictIPs() and $this->mAttribs['rc_ip'] == '' ) {
-			unset( $this->mAttribs['rc_ip'] );
-		}
-
-		# Trim spaces on user supplied text
-		$this->mAttribs['rc_comment'] = trim( $this->mAttribs['rc_comment'] );
-
-		# Make sure summary is truncated (whole multibyte characters)
-		$this->mAttribs['rc_comment'] = $wgContLang->truncate( $this->mAttribs['rc_comment'], 255 );
-
-		# Fixup database timestamps
-		$this->mAttribs['rc_timestamp'] = $dbw->timestamp( $this->mAttribs['rc_timestamp'] );
-		$this->mAttribs['rc_cur_time'] = $dbw->timestamp( $this->mAttribs['rc_cur_time'] );
-		$this->mAttribs['rc_id'] = $dbw->nextSequenceValue( 'recentchanges_rc_id_seq' );
-
-		## If we are using foreign keys, an entry of 0 for the page_id will fail, so use NULL
-		if ( $dbw->cascadingDeletes() and $this->mAttribs['rc_cur_id'] == 0 ) {
-			unset( $this->mAttribs['rc_cur_id'] );
-		}
-
-		# Insert new row
-		$dbw->insert( 'recentchanges', $this->mAttribs, __METHOD__ );
-
-		# Set the ID
-		$this->mAttribs['rc_id'] = $dbw->insertId();
-
-		# Notify extensions
-		wfRunHooks( 'RecentChange_save', array( &$this ) );
-
-		# Notify external application via UDP
-		if ( !$noudp ) {
-			$this->notifyRC2UDP();
-		}
-
-		# E-mail notifications
-		if ( $wgUseEnotif || $wgShowUpdatedMarker ) {
-			$editor = $this->getPerformer();
-			$title = $this->getTitle();
-
-			if ( wfRunHooks( 'AbortEmailNotification', array( $editor, $title ) ) ) {
-				# @todo FIXME: This would be better as an extension hook
-				$enotif = new EmailNotification();
-				$enotif->notifyOnPageChange( $editor, $title,
-					$this->mAttribs['rc_timestamp'],
-					$this->mAttribs['rc_comment'],
-					$this->mAttribs['rc_minor'],
-					$this->mAttribs['rc_last_oldid'],
-					$this->mExtra['pageStatus'] );
-			}
-		}
-	}
-
-	public function notifyRC2UDP() {
-		global $wgRC2UDPAddress, $wgRC2UDPOmitBots;
-		# Notify external application via UDP
-		if ( $wgRC2UDPAddress && ( !$this->mAttribs['rc_bot'] || !$wgRC2UDPOmitBots ) ) {
-			self::sendToUDP( $this->getIRCLine() );
-		}
-	}
-
-	/**
-	 * Send some text to UDP.
-	 * @see RecentChange::cleanupForIRC
-	 * @param string $line text to send
-	 * @param string $address defaults to $wgRC2UDPAddress.
-	 * @param string $prefix defaults to $wgRC2UDPPrefix.
-	 * @param int $port defaults to $wgRC2UDPPort. (Since 1.17)
-	 * @return Boolean: success
-	 */
-	public static function sendToUDP( $line, $address = '', $prefix = '', $port = '' ) {
-		global $wgRC2UDPAddress, $wgRC2UDPPrefix, $wgRC2UDPPort;
-		# Assume default for standard RC case
-		$address = $address ? $address : $wgRC2UDPAddress;
-		$prefix = $prefix ? $prefix : $wgRC2UDPPrefix;
-		$port = $port ? $port : $wgRC2UDPPort;
-		# Notify external application via UDP
-		if ( $address ) {
-			$conn = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
-			if ( $conn ) {
-				$line = $prefix . $line;
-				wfDebug( __METHOD__ . ": sending UDP line: $line\n" );
-				socket_sendto( $conn, $line, strlen( $line ), 0, $address, $port );
-				socket_close( $conn );
-				return true;
-			} else {
-				wfDebug( __METHOD__ . ": failed to create UDP socket\n" );
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Remove newlines, carriage returns and decode html entities
-	 * @param $text String
-	 * @return String
-	 */
-	public static function cleanupForIRC( $text ) {
-		return Sanitizer::decodeCharReferences( str_replace( array( "\n", "\r" ), array( "", "" ), $text ) );
-	}
-
-	/**
-	 * Mark a given change as patrolled
-	 *
-	 * @param $change Mixed: RecentChange or corresponding rc_id
-	 * @param $auto Boolean: for automatic patrol
-	 * @return Array See doMarkPatrolled(), or null if $change is not an existing rc_id
-	 */
-	public static function markPatrolled( $change, $auto = false ) {
-		global $wgUser;
-
-		$change = $change instanceof RecentChange
-			? $change
-			: RecentChange::newFromId( $change );
-
-		if ( !$change instanceof RecentChange ) {
-			return null;
-		}
-		return $change->doMarkPatrolled( $wgUser, $auto );
-	}
-
-	/**
-	 * Mark this RecentChange as patrolled
-	 *
-	 * NOTE: Can also return 'rcpatroldisabled', 'hookaborted' and 'markedaspatrollederror-noautopatrol' as errors
-	 * @param $user User object doing the action
-	 * @param $auto Boolean: for automatic patrol
-	 * @return array of permissions errors, see Title::getUserPermissionsErrors()
-	 */
-	public function doMarkPatrolled( User $user, $auto = false ) {
-		global $wgUseRCPatrol, $wgUseNPPatrol;
-		$errors = array();
-		// If recentchanges patrol is disabled, only new pages
-		// can be patrolled
-		if ( !$wgUseRCPatrol && ( !$wgUseNPPatrol || $this->getAttribute( 'rc_type' ) != RC_NEW ) ) {
-			$errors[] = array( 'rcpatroldisabled' );
-		}
-		// Automatic patrol needs "autopatrol", ordinary patrol needs "patrol"
-		$right = $auto ? 'autopatrol' : 'patrol';
-		$errors = array_merge( $errors, $this->getTitle()->getUserPermissionsErrors( $right, $user ) );
-		if ( !wfRunHooks( 'MarkPatrolled', array( $this->getAttribute( 'rc_id' ), &$user, false ) ) ) {
-			$errors[] = array( 'hookaborted' );
-		}
-		// Users without the 'autopatrol' right can't patrol their
-		// own revisions
-		if ( $user->getName() == $this->getAttribute( 'rc_user_text' ) && !$user->isAllowed( 'autopatrol' ) ) {
-			$errors[] = array( 'markedaspatrollederror-noautopatrol' );
-		}
-		if ( $errors ) {
-			return $errors;
-		}
-		// If the change was patrolled already, do nothing
-		if ( $this->getAttribute( 'rc_patrolled' ) ) {
-			return array();
-		}
-		// Actually set the 'patrolled' flag in RC
-		$this->reallyMarkPatrolled();
-		// Log this patrol event
-		PatrolLog::record( $this, $auto, $user );
-		wfRunHooks( 'MarkPatrolledComplete', array( $this->getAttribute( 'rc_id' ), &$user, false ) );
-		return array();
-	}
-
-	/**
-	 * Mark this RecentChange patrolled, without error checking
-	 * @return Integer: number of affected rows
-	 */
-	public function reallyMarkPatrolled() {
-		$dbw = wfGetDB( DB_MASTER );
-		$dbw->update(
-			'recentchanges',
-			array(
-				'rc_patrolled' => 1
-			),
-			array(
-				'rc_id' => $this->getAttribute( 'rc_id' )
-			),
-			__METHOD__
-		);
-		return $dbw->affectedRows();
-	}
-
-	/**
-	 * Makes an entry in the database corresponding to an edit
-	 *
-	 * @param $timestamp
-	 * @param $title Title
-	 * @param $minor
-	 * @param $user User
-	 * @param $comment
-	 * @param $oldId
-	 * @param $lastTimestamp
-	 * @param $bot
-	 * @param $ip string
-	 * @param $oldSize int
-	 * @param $newSize int
-	 * @param $newId int
-	 * @param $patrol int
-	 * @return RecentChange
-	 */
-	public static function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, $oldId,
-		$lastTimestamp, $bot, $ip = '', $oldSize = 0, $newSize = 0, $newId = 0, $patrol = 0 ) {
-		$rc = new RecentChange;
-		$rc->mTitle = $title;
-		$rc->mPerformer = $user;
-		$rc->mAttribs = array(
-			'rc_timestamp'  => $timestamp,
-			'rc_cur_time'   => $timestamp,
-			'rc_namespace'  => $title->getNamespace(),
-			'rc_title'      => $title->getDBkey(),
-			'rc_type'       => RC_EDIT,
-			'rc_minor'      => $minor ? 1 : 0,
-			'rc_cur_id'     => $title->getArticleID(),
-			'rc_user'       => $user->getId(),
-			'rc_user_text'  => $user->getName(),
-			'rc_comment'    => $comment,
-			'rc_this_oldid' => $newId,
-			'rc_last_oldid' => $oldId,
-			'rc_bot'        => $bot ? 1 : 0,
-			'rc_ip'         => self::checkIPAddress( $ip ),
-			'rc_patrolled'  => intval( $patrol ),
-			'rc_new'        => 0,  # obsolete
-			'rc_old_len'    => $oldSize,
-			'rc_new_len'    => $newSize,
-			'rc_deleted'    => 0,
-			'rc_logid'      => 0,
-			'rc_log_type'   => null,
-			'rc_log_action' => '',
-			'rc_params'     => ''
-		);
-
-		$rc->mExtra = array(
-			'prefixedDBkey' => $title->getPrefixedDBkey(),
-			'lastTimestamp' => $lastTimestamp,
-			'oldSize'       => $oldSize,
-			'newSize'       => $newSize,
-			'pageStatus'   => 'changed'
-		);
-		$rc->save();
-		return $rc;
-	}
-
-	/**
-	 * Makes an entry in the database corresponding to page creation
-	 * Note: the title object must be loaded with the new id using resetArticleID()
-	 * @todo Document parameters and return
-	 *
-	 * @param $timestamp
-	 * @param $title Title
-	 * @param $minor
-	 * @param $user User
-	 * @param $comment
-	 * @param $bot
-	 * @param $ip string
-	 * @param $size int
-	 * @param $newId int
-	 * @param $patrol int
-	 * @return RecentChange
-	 */
-	public static function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot,
-		$ip = '', $size = 0, $newId = 0, $patrol = 0 ) {
-		$rc = new RecentChange;
-		$rc->mTitle = $title;
-		$rc->mPerformer = $user;
-		$rc->mAttribs = array(
-			'rc_timestamp'      => $timestamp,
-			'rc_cur_time'       => $timestamp,
-			'rc_namespace'      => $title->getNamespace(),
-			'rc_title'          => $title->getDBkey(),
-			'rc_type'           => RC_NEW,
-			'rc_minor'          => $minor ? 1 : 0,
-			'rc_cur_id'         => $title->getArticleID(),
-			'rc_user'           => $user->getId(),
-			'rc_user_text'      => $user->getName(),
-			'rc_comment'        => $comment,
-			'rc_this_oldid'     => $newId,
-			'rc_last_oldid'     => 0,
-			'rc_bot'            => $bot ? 1 : 0,
-			'rc_ip'             => self::checkIPAddress( $ip ),
-			'rc_patrolled'      => intval( $patrol ),
-			'rc_new'            => 1, # obsolete
-			'rc_old_len'        => 0,
-			'rc_new_len'        => $size,
-			'rc_deleted'        => 0,
-			'rc_logid'          => 0,
-			'rc_log_type'       => null,
-			'rc_log_action'     => '',
-			'rc_params'         => ''
-		);
-
-		$rc->mExtra = array(
-			'prefixedDBkey' => $title->getPrefixedDBkey(),
-			'lastTimestamp' => 0,
-			'oldSize' => 0,
-			'newSize' => $size,
-			'pageStatus' => 'created'
-		);
-		$rc->save();
-		return $rc;
-	}
-
-	/**
-	 * @param $timestamp
-	 * @param $title
-	 * @param $user
-	 * @param $actionComment
-	 * @param $ip string
-	 * @param $type
-	 * @param $action
-	 * @param $target
-	 * @param $logComment
-	 * @param $params
-	 * @param $newId int
-	 * @param $actionCommentIRC string
-	 * @return bool
-	 */
-	public static function notifyLog( $timestamp, &$title, &$user, $actionComment, $ip, $type,
-		$action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' )
-	{
-		global $wgLogRestrictions;
-		# Don't add private logs to RC!
-		if ( isset( $wgLogRestrictions[$type] ) && $wgLogRestrictions[$type] != '*' ) {
-			return false;
-		}
-		$rc = self::newLogEntry( $timestamp, $title, $user, $actionComment, $ip, $type, $action,
-			$target, $logComment, $params, $newId, $actionCommentIRC );
-		$rc->save();
-		return true;
-	}
-
-	/**
-	 * @param $timestamp
-	 * @param $title Title
-	 * @param $user User
-	 * @param $actionComment
-	 * @param $ip string
-	 * @param $type
-	 * @param $action
-	 * @param $target Title
-	 * @param $logComment
-	 * @param $params
-	 * @param $newId int
-	 * @param $actionCommentIRC string
-	 * @return RecentChange
-	 */
-	public static function newLogEntry( $timestamp, &$title, &$user, $actionComment, $ip,
-		$type, $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' ) {
-		global $wgRequest;
-
-		## Get pageStatus for email notification
-		switch ( $type . '-' . $action ) {
-			case 'delete-delete':
-				$pageStatus = 'deleted';
-				break;
-			case 'move-move':
-			case 'move-move_redir':
-				$pageStatus = 'moved';
-				break;
-			case 'delete-restore':
-				$pageStatus = 'restored';
-				break;
-			case 'upload-upload':
-				$pageStatus = 'created';
-				break;
-			case 'upload-overwrite':
-			default:
-				$pageStatus = 'changed';
-				break;
-		}
-
-		$rc = new RecentChange;
-		$rc->mTitle = $target;
-		$rc->mPerformer = $user;
-		$rc->mAttribs = array(
-			'rc_timestamp'  => $timestamp,
-			'rc_cur_time'   => $timestamp,
-			'rc_namespace'  => $target->getNamespace(),
-			'rc_title'      => $target->getDBkey(),
-			'rc_type'       => RC_LOG,
-			'rc_minor'      => 0,
-			'rc_cur_id'     => $target->getArticleID(),
-			'rc_user'       => $user->getId(),
-			'rc_user_text'  => $user->getName(),
-			'rc_comment'    => $logComment,
-			'rc_this_oldid' => 0,
-			'rc_last_oldid' => 0,
-			'rc_bot'        => $user->isAllowed( 'bot' ) ? $wgRequest->getBool( 'bot', true ) : 0,
-			'rc_ip'         => self::checkIPAddress( $ip ),
-			'rc_patrolled'  => 1,
-			'rc_new'        => 0, # obsolete
-			'rc_old_len'    => null,
-			'rc_new_len'    => null,
-			'rc_deleted'    => 0,
-			'rc_logid'      => $newId,
-			'rc_log_type'   => $type,
-			'rc_log_action' => $action,
-			'rc_params'     => $params
-		);
-
-		$rc->mExtra = array(
-			'prefixedDBkey' => $title->getPrefixedDBkey(),
-			'lastTimestamp' => 0,
-			'actionComment' => $actionComment, // the comment appended to the action, passed from LogPage
-			'pageStatus'    => $pageStatus,
-			'actionCommentIRC' => $actionCommentIRC
-		);
-		return $rc;
-	}
-
-	/**
-	 * Initialises the members of this object from a mysql row object
-	 *
-	 * @param $row
-	 */
-	public function loadFromRow( $row ) {
-		$this->mAttribs = get_object_vars( $row );
-		$this->mAttribs['rc_timestamp'] = wfTimestamp( TS_MW, $this->mAttribs['rc_timestamp'] );
-		$this->mAttribs['rc_deleted'] = $row->rc_deleted; // MUST be set
-	}
-
-	/**
-	 * Makes a pseudo-RC entry from a cur row
-	 *
-	 * @param $row
-	 */
-	public function loadFromCurRow( $row ) {
-		$this->mAttribs = array(
-			'rc_timestamp' => wfTimestamp( TS_MW, $row->rev_timestamp ),
-			'rc_cur_time' => $row->rev_timestamp,
-			'rc_user' => $row->rev_user,
-			'rc_user_text' => $row->rev_user_text,
-			'rc_namespace' => $row->page_namespace,
-			'rc_title' => $row->page_title,
-			'rc_comment' => $row->rev_comment,
-			'rc_minor' => $row->rev_minor_edit ? 1 : 0,
-			'rc_type' => $row->page_is_new ? RC_NEW : RC_EDIT,
-			'rc_cur_id' => $row->page_id,
-			'rc_this_oldid' => $row->rev_id,
-			'rc_last_oldid' => isset( $row->rc_last_oldid ) ? $row->rc_last_oldid : 0,
-			'rc_bot' => 0,
-			'rc_ip' => '',
-			'rc_id' => $row->rc_id,
-			'rc_patrolled' => $row->rc_patrolled,
-			'rc_new' => $row->page_is_new, # obsolete
-			'rc_old_len' => $row->rc_old_len,
-			'rc_new_len' => $row->rc_new_len,
-			'rc_params' => isset( $row->rc_params ) ? $row->rc_params : '',
-			'rc_log_type' => isset( $row->rc_log_type ) ? $row->rc_log_type : null,
-			'rc_log_action' => isset( $row->rc_log_action ) ? $row->rc_log_action : null,
-			'rc_logid' => isset( $row->rc_logid ) ? $row->rc_logid : 0,
-			'rc_deleted' => $row->rc_deleted // MUST be set
-		);
-	}
-
-	/**
-	 * Get an attribute value
-	 *
-	 * @param string $name Attribute name
-	 * @return mixed
-	 */
-	public function getAttribute( $name ) {
-		return isset( $this->mAttribs[$name] ) ? $this->mAttribs[$name] : null;
-	}
-
-	/**
-	 * @return array
-	 */
-	public function getAttributes() {
-		return $this->mAttribs;
-	}
-
-	/**
-	 * Gets the end part of the diff URL associated with this object
-	 * Blank if no diff link should be displayed
-	 * @param $forceCur
-	 * @return string
-	 */
-	public function diffLinkTrail( $forceCur ) {
-		if ( $this->mAttribs['rc_type'] == RC_EDIT ) {
-			$trail = "curid=" . (int)( $this->mAttribs['rc_cur_id'] ) .
-				"&oldid=" . (int)( $this->mAttribs['rc_last_oldid'] );
-			if ( $forceCur ) {
-				$trail .= '&diff=0';
-			} else {
-				$trail .= '&diff=' . (int)( $this->mAttribs['rc_this_oldid'] );
-			}
-		} else {
-			$trail = '';
-		}
-		return $trail;
-	}
-
-	/**
-	 * @return string
-	 */
-	public function getIRCLine() {
-		global $wgUseRCPatrol, $wgUseNPPatrol, $wgRC2UDPInterwikiPrefix, $wgLocalInterwiki,
-			$wgCanonicalServer, $wgScript;
-
-		if ( $this->mAttribs['rc_type'] == RC_LOG ) {
-			// Don't use SpecialPage::getTitleFor, backwards compatibility with
-			// IRC API which expects "Log".
-			$titleObj = Title::newFromText( 'Log/' . $this->mAttribs['rc_log_type'], NS_SPECIAL );
-		} else {
-			$titleObj =& $this->getTitle();
-		}
-		$title = $titleObj->getPrefixedText();
-		$title = self::cleanupForIRC( $title );
-
-		if ( $this->mAttribs['rc_type'] == RC_LOG ) {
-			$url = '';
-		} else {
-			$url = $wgCanonicalServer . $wgScript;
-			if ( $this->mAttribs['rc_type'] == RC_NEW ) {
-				$query = '?oldid=' . $this->mAttribs['rc_this_oldid'];
-			} else {
-				$query = '?diff=' . $this->mAttribs['rc_this_oldid'] . '&oldid=' . $this->mAttribs['rc_last_oldid'];
-			}
-			if ( $wgUseRCPatrol || ( $this->mAttribs['rc_type'] == RC_NEW && $wgUseNPPatrol ) ) {
-				$query .= '&rcid=' . $this->mAttribs['rc_id'];
-			}
-			// HACK: We need this hook for WMF's secure server setup
-			wfRunHooks( 'IRCLineURL', array( &$url, &$query ) );
-			$url .= $query;
-		}
-
-		if ( $this->mAttribs['rc_old_len'] !== null && $this->mAttribs['rc_new_len'] !== null ) {
-			$szdiff = $this->mAttribs['rc_new_len'] - $this->mAttribs['rc_old_len'];
-			if ( $szdiff < -500 ) {
-				$szdiff = "\002$szdiff\002";
-			} elseif ( $szdiff >= 0 ) {
-				$szdiff = '+' . $szdiff;
-			}
-			// @todo i18n with parentheses in content language?
-			$szdiff = '(' . $szdiff . ')';
-		} else {
-			$szdiff = '';
-		}
-
-		$user = self::cleanupForIRC( $this->mAttribs['rc_user_text'] );
-
-		if ( $this->mAttribs['rc_type'] == RC_LOG ) {
-			$targetText = $this->getTitle()->getPrefixedText();
-			$comment = self::cleanupForIRC( str_replace( "[[$targetText]]", "[[\00302$targetText\00310]]", $this->mExtra['actionCommentIRC'] ) );
-			$flag = $this->mAttribs['rc_log_action'];
-		} else {
-			$comment = self::cleanupForIRC( $this->mAttribs['rc_comment'] );
-			$flag = '';
-			if ( !$this->mAttribs['rc_patrolled'] && ( $wgUseRCPatrol || $this->mAttribs['rc_type'] == RC_NEW && $wgUseNPPatrol ) ) {
-				$flag .= '!';
-			}
-			$flag .= ( $this->mAttribs['rc_type'] == RC_NEW ? "N" : "" ) . ( $this->mAttribs['rc_minor'] ? "M" : "" ) . ( $this->mAttribs['rc_bot'] ? "B" : "" );
-		}
-
-		if ( $wgRC2UDPInterwikiPrefix === true && $wgLocalInterwiki !== false ) {
-			$prefix = $wgLocalInterwiki;
-		} elseif ( $wgRC2UDPInterwikiPrefix ) {
-			$prefix = $wgRC2UDPInterwikiPrefix;
-		} else {
-			$prefix = false;
-		}
-		if ( $prefix !== false ) {
-			$titleString = "\00314[[\00303$prefix:\00307$title\00314]]";
-		} else {
-			$titleString = "\00314[[\00307$title\00314]]";
-		}
-
-		# see http://www.irssi.org/documentation/formats for some colour codes. prefix is \003,
-		# no colour (\003) switches back to the term default
-		$fullString = "$titleString\0034 $flag\00310 " .
-			"\00302$url\003 \0035*\003 \00303$user\003 \0035*\003 $szdiff \00310$comment\003\n";
-
-		return $fullString;
-	}
-
-	/**
-	 * Returns the change size (HTML).
-	 * The lengths can be given optionally.
-	 * @param $old int
-	 * @param $new int
-	 * @return string
-	 */
-	public function getCharacterDifference( $old = 0, $new = 0 ) {
-		if ( $old === 0 ) {
-			$old = $this->mAttribs['rc_old_len'];
-		}
-		if ( $new === 0 ) {
-			$new = $this->mAttribs['rc_new_len'];
-		}
-		if ( $old === null || $new === null ) {
-			return '';
-		}
-		return ChangesList::showCharacterDifference( $old, $new );
-	}
-
-	private static function checkIPAddress( $ip ) {
-		global $wgRequest;
-		if ( $ip ) {
-			if ( !IP::isIPAddress( $ip ) ) {
-				throw new MWException( "Attempt to write \"" . $ip . "\" as an IP address into recent changes" );
-			}
-		} else {
-			$ip = $wgRequest->getIP();
-			if ( !$ip ) {
-				$ip = '';
-			}
-		}
-		return $ip;
-	}
-}
diff --git a/includes/Revision.php b/includes/Revision.php
index 2b34984b..233eac01 100644
--- a/includes/Revision.php
+++ b/includes/Revision.php
@@ -61,6 +61,11 @@ class Revision implements IDBAccessObject {
 	 */
 	protected $mContentHandler;
 
+	/**
+	 * @var int
+	 */
+	protected $mQueryFlags = 0;
+
 	// Revision deletion constants
 	const DELETED_TEXT = 1;
 	const DELETED_COMMENT = 2;
@@ -106,16 +111,18 @@ class Revision implements IDBAccessObject {
 	public static function newFromTitle( $title, $id = 0, $flags = 0 ) {
 		$conds = array(
 			'page_namespace' => $title->getNamespace(),
-			'page_title' 	 => $title->getDBkey()
+			'page_title' => $title->getDBkey()
 		);
 		if ( $id ) {
 			// Use the specified ID
 			$conds['rev_id'] = $id;
+			return self::newFromConds( $conds, (int)$flags );
 		} else {
 			// Use a join to get the latest revision
 			$conds[] = 'rev_id=page_latest';
+			$db = wfGetDB( ( $flags & self::READ_LATEST ) ? DB_MASTER : DB_SLAVE );
+			return self::loadFromConds( $db, $conds, $flags );
 		}
-		return self::newFromConds( $conds, (int)$flags );
 	}
 
 	/**
@@ -228,8 +235,8 @@ class Revision implements IDBAccessObject {
 	 * @return Revision or null
 	 */
 	public static function loadFromPageId( $db, $pageid, $id = 0 ) {
-		$conds = array( 'rev_page' => intval( $pageid ), 'page_id'  => intval( $pageid ) );
-		if( $id ) {
+		$conds = array( 'rev_page' => intval( $pageid ), 'page_id' => intval( $pageid ) );
+		if ( $id ) {
 			$conds['rev_id'] = intval( $id );
 		} else {
 			$conds[] = 'rev_id=page_latest';
@@ -248,7 +255,7 @@ class Revision implements IDBAccessObject {
 	 * @return Revision or null
 	 */
 	public static function loadFromTitle( $db, $title, $id = 0 ) {
-		if( $id ) {
+		if ( $id ) {
 			$matchId = intval( $id );
 		} else {
 			$matchId = 'page_latest';
@@ -257,7 +264,7 @@ class Revision implements IDBAccessObject {
 			array(
 				"rev_id=$matchId",
 				'page_namespace' => $title->getNamespace(),
-				'page_title'     => $title->getDBkey()
+				'page_title' => $title->getDBkey()
 			)
 		);
 	}
@@ -275,9 +282,9 @@ class Revision implements IDBAccessObject {
 	public static function loadFromTimestamp( $db, $title, $timestamp ) {
 		return self::loadFromConds( $db,
 			array(
-				'rev_timestamp'  => $db->timestamp( $timestamp ),
+				'rev_timestamp' => $db->timestamp( $timestamp ),
 				'page_namespace' => $title->getNamespace(),
-				'page_title'     => $title->getDBkey()
+				'page_title' => $title->getDBkey()
 			)
 		);
 	}
@@ -298,6 +305,9 @@ class Revision implements IDBAccessObject {
 				$rev = self::loadFromConds( $dbw, $conditions, $flags );
 			}
 		}
+		if ( $rev ) {
+			$rev->mQueryFlags = $flags;
+		}
 		return $rev;
 	}
 
@@ -312,9 +322,9 @@ class Revision implements IDBAccessObject {
 	 */
 	private static function loadFromConds( $db, $conditions, $flags = 0 ) {
 		$res = self::fetchFromConds( $db, $conditions, $flags );
-		if( $res ) {
+		if ( $res ) {
 			$row = $res->fetchObject();
-			if( $row ) {
+			if ( $row ) {
 				$ret = new Revision( $row );
 				return $ret;
 			}
@@ -337,7 +347,7 @@ class Revision implements IDBAccessObject {
 			array(
 				'rev_id=page_latest',
 				'page_namespace' => $title->getNamespace(),
-				'page_title'     => $title->getDBkey()
+				'page_title' => $title->getDBkey()
 			)
 		);
 	}
@@ -489,7 +499,7 @@ class Revision implements IDBAccessObject {
 	 * @access private
 	 */
 	function __construct( $row ) {
-		if( is_object( $row ) ) {
+		if ( is_object( $row ) ) {
 			$this->mId        = intval( $row->rev_id );
 			$this->mPage      = intval( $row->rev_page );
 			$this->mTextId    = intval( $row->rev_text_id );
@@ -517,7 +527,7 @@ class Revision implements IDBAccessObject {
 				$this->mSha1 = $row->rev_sha1;
 			}
 
-			if( isset( $row->page_latest ) ) {
+			if ( isset( $row->page_latest ) ) {
 				$this->mCurrent = ( $row->rev_id == $row->page_latest );
 				$this->mTitle = Title::newFromRow( $row );
 			} else {
@@ -525,13 +535,13 @@ class Revision implements IDBAccessObject {
 				$this->mTitle = null;
 			}
 
-			if( !isset( $row->rev_content_model ) || is_null( $row->rev_content_model ) ) {
+			if ( !isset( $row->rev_content_model ) || is_null( $row->rev_content_model ) ) {
 				$this->mContentModel = null; # determine on demand if needed
 			} else {
 				$this->mContentModel = strval( $row->rev_content_model );
 			}
 
-			if( !isset( $row->rev_content_format ) || is_null( $row->rev_content_format ) ) {
+			if ( !isset( $row->rev_content_format ) || is_null( $row->rev_content_format ) ) {
 				$this->mContentFormat = null; # determine on demand if needed
 			} else {
 				$this->mContentFormat = strval( $row->rev_content_format );
@@ -539,7 +549,7 @@ class Revision implements IDBAccessObject {
 
 			// Lazy extraction...
 			$this->mText = null;
-			if( isset( $row->old_text ) ) {
+			if ( isset( $row->old_text ) ) {
 				$this->mTextRow = $row;
 			} else {
 				// 'text' table row entry will be lazy-loaded
@@ -554,13 +564,13 @@ class Revision implements IDBAccessObject {
 				$this->mUserText = $row->user_name; // logged-in user
 			}
 			$this->mOrigUserText = $row->rev_user_text;
-		} elseif( is_array( $row ) ) {
+		} elseif ( is_array( $row ) ) {
 			// Build a new revision to be saved...
 			global $wgUser; // ugh
 
 			# if we have a content object, use it to set the model and type
 			if ( !empty( $row['content'] ) ) {
-				//@todo: when is that set? test with external store setup! check out insertOn() [dk]
+				// @todo when is that set? test with external store setup! check out insertOn() [dk]
 				if ( !empty( $row['text_id'] ) ) {
 					throw new MWException( "Text already stored in external store (id {$row['text_id']}), " .
 						"can't serialize content object" );
@@ -714,10 +724,10 @@ class Revision implements IDBAccessObject {
 	 * @return Title|null
 	 */
 	public function getTitle() {
-		if( isset( $this->mTitle ) ) {
+		if ( isset( $this->mTitle ) ) {
 			return $this->mTitle;
 		}
-		if( !is_null( $this->mId ) ) { //rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
+		if ( !is_null( $this->mId ) ) { //rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
 			$dbr = wfGetDB( DB_SLAVE );
 			$row = $dbr->selectRow(
 				array( 'page', 'revision' ),
@@ -769,9 +779,9 @@ class Revision implements IDBAccessObject {
 	 * @return Integer
 	 */
 	public function getUser( $audience = self::FOR_PUBLIC, User $user = null ) {
-		if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
+		if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
 			return 0;
-		} elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
+		} elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
 			return 0;
 		} else {
 			return $this->mUser;
@@ -801,9 +811,9 @@ class Revision implements IDBAccessObject {
 	 * @return string
 	 */
 	public function getUserText( $audience = self::FOR_PUBLIC, User $user = null ) {
-		if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
+		if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
 			return '';
-		} elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
+		} elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
 			return '';
 		} else {
 			return $this->getRawUserText();
@@ -841,9 +851,9 @@ class Revision implements IDBAccessObject {
 	 * @return String
 	 */
 	function getComment( $audience = self::FOR_PUBLIC, User $user = null ) {
-		if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_COMMENT ) ) {
+		if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_COMMENT ) ) {
 			return '';
-		} elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_COMMENT, $user ) ) {
+		} elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_COMMENT, $user ) ) {
 			return '';
 		} else {
 			return $this->mComment;
@@ -867,24 +877,37 @@ class Revision implements IDBAccessObject {
 	}
 
 	/**
-	 * @return Integer rcid of the unpatrolled row, zero if there isn't one
+	 * @return integer rcid of the unpatrolled row, zero if there isn't one
 	 */
 	public function isUnpatrolled() {
-		if( $this->mUnpatrolled !== null ) {
+		if ( $this->mUnpatrolled !== null ) {
 			return $this->mUnpatrolled;
 		}
+		$rc = $this->getRecentChange();
+		if ( $rc && $rc->getAttribute( 'rc_patrolled' ) == 0 ) {
+			$this->mUnpatrolled = $rc->getAttribute( 'rc_id' );
+		} else {
+			$this->mUnpatrolled = 0;
+		}
+		return $this->mUnpatrolled;
+	}
+
+	/**
+	 * Get the RC object belonging to the current revision, if there's one
+	 *
+	 * @since 1.22
+	 * @return RecentChange|null
+	 */
+	public function getRecentChange() {
 		$dbr = wfGetDB( DB_SLAVE );
-		$this->mUnpatrolled = $dbr->selectField( 'recentchanges',
-			'rc_id',
-			array( // Add redundant user,timestamp condition so we can use the existing index
-				'rc_user_text'  => $this->getRawUserText(),
-				'rc_timestamp'  => $dbr->timestamp( $this->getTimestamp() ),
-				'rc_this_oldid' => $this->getId(),
-				'rc_patrolled'  => 0
+		return RecentChange::newFromConds(
+			array(
+				'rc_user_text' => $this->getRawUserText(),
+				'rc_timestamp' => $dbr->timestamp( $this->getTimestamp() ),
+				'rc_this_oldid' => $this->getId()
 			),
 			__METHOD__
 		);
-		return (int)$this->mUnpatrolled;
 	}
 
 	/**
@@ -918,7 +941,7 @@ class Revision implements IDBAccessObject {
 	 *              to the $audience parameter
 	 *
 	 * @deprecated in 1.21, use getContent() instead
-	 * @todo: replace usage in core
+	 * @todo Replace usage in core
 	 * @return String
 	 */
 	public function getText( $audience = self::FOR_PUBLIC, User $user = null ) {
@@ -943,9 +966,9 @@ class Revision implements IDBAccessObject {
 	 * @return Content|null
 	 */
 	public function getContent( $audience = self::FOR_PUBLIC, User $user = null ) {
-		if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_TEXT ) ) {
+		if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_TEXT ) ) {
 			return null;
-		} elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_TEXT, $user ) ) {
+		} elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_TEXT, $user ) ) {
 			return null;
 		} else {
 			return $this->getContentInternal();
@@ -983,6 +1006,10 @@ class Revision implements IDBAccessObject {
 	 * @return String
 	 */
 	public function getSerializedData() {
+		if ( is_null( $this->mText ) ) {
+			$this->mText = $this->loadText();
+		}
+
 		return $this->mText;
 	}
 
@@ -996,9 +1023,9 @@ class Revision implements IDBAccessObject {
 	 * @return Content|null the Revision's content, or null on failure.
 	 */
 	protected function getContentInternal() {
-		if( is_null( $this->mContent ) ) {
+		if ( is_null( $this->mContent ) ) {
 			// Revision is immutable. Load on demand:
-			if( is_null( $this->mText ) ) {
+			if ( is_null( $this->mText ) ) {
 				$this->mText = $this->loadText();
 			}
 
@@ -1097,9 +1124,9 @@ class Revision implements IDBAccessObject {
 	 * @return Revision|null
 	 */
 	public function getPrevious() {
-		if( $this->getTitle() ) {
+		if ( $this->getTitle() ) {
 			$prev = $this->getTitle()->getPreviousRevisionID( $this->getId() );
-			if( $prev ) {
+			if ( $prev ) {
 				return self::newFromTitle( $this->getTitle(), $prev );
 			}
 		}
@@ -1112,7 +1139,7 @@ class Revision implements IDBAccessObject {
 	 * @return Revision or null
 	 */
 	public function getNext() {
-		if( $this->getTitle() ) {
+		if ( $this->getTitle() ) {
 			$next = $this->getTitle()->getNextRevisionID( $this->getId() );
 			if ( $next ) {
 				return self::newFromTitle( $this->getTitle(), $next );
@@ -1129,11 +1156,11 @@ class Revision implements IDBAccessObject {
 	 * @return Integer
 	 */
 	private function getPreviousRevisionId( $db ) {
-		if( is_null( $this->mPage ) ) {
+		if ( is_null( $this->mPage ) ) {
 			return 0;
 		}
 		# Use page_latest if ID is not given
-		if( !$this->mId ) {
+		if ( !$this->mId ) {
 			$prevId = $db->selectField( 'page', 'page_latest',
 				array( 'page_id' => $this->mPage ),
 				__METHOD__ );
@@ -1166,13 +1193,13 @@ class Revision implements IDBAccessObject {
 		$textField = $prefix . 'text';
 		$flagsField = $prefix . 'flags';
 
-		if( isset( $row->$flagsField ) ) {
+		if ( isset( $row->$flagsField ) ) {
 			$flags = explode( ',', $row->$flagsField );
 		} else {
 			$flags = array();
 		}
 
-		if( isset( $row->$textField ) ) {
+		if ( isset( $row->$textField ) ) {
 			$text = $row->$textField;
 		} else {
 			wfProfileOut( __METHOD__ );
@@ -1183,7 +1210,7 @@ class Revision implements IDBAccessObject {
 		if ( in_array( 'external', $flags ) ) {
 			$url = $text;
 			$parts = explode( '://', $url, 2 );
-			if( count( $parts ) == 1 || $parts[1] == '' ) {
+			if ( count( $parts ) == 1 || $parts[1] == '' ) {
 				wfProfileOut( __METHOD__ );
 				return false;
 			}
@@ -1192,35 +1219,7 @@ class Revision implements IDBAccessObject {
 
 		// If the text was fetched without an error, convert it
 		if ( $text !== false ) {
-			if( in_array( 'gzip', $flags ) ) {
-				# Deal with optional compression of archived pages.
-				# This can be done periodically via maintenance/compressOld.php, and
-				# as pages are saved if $wgCompressRevisions is set.
-				$text = gzinflate( $text );
-			}
-
-			if( in_array( 'object', $flags ) ) {
-				# Generic compressed storage
-				$obj = unserialize( $text );
-				if ( !is_object( $obj ) ) {
-					// Invalid object
-					wfProfileOut( __METHOD__ );
-					return false;
-				}
-				$text = $obj->getText();
-			}
-
-			global $wgLegacyEncoding;
-			if( $text !== false && $wgLegacyEncoding
-				&& !in_array( 'utf-8', $flags ) && !in_array( 'utf8', $flags ) )
-			{
-				# Old revisions kept around in a legacy encoding?
-				# Upconvert on demand.
-				# ("utf8" checked for compatibility with some broken
-				#  conversion scripts 2008-12-30)
-				global $wgContLang;
-				$text = $wgContLang->iconv( $wgLegacyEncoding, 'UTF-8', $text );
-			}
+			$text = self::decompressRevisionText( $text, $flags );
 		}
 		wfProfileOut( __METHOD__ );
 		return $text;
@@ -1244,8 +1243,8 @@ class Revision implements IDBAccessObject {
 		# on load if $wgLegacyCharset is set in the future.
 		$flags[] = 'utf-8';
 
-		if( $wgCompressRevisions ) {
-			if( function_exists( 'gzdeflate' ) ) {
+		if ( $wgCompressRevisions ) {
+			if ( function_exists( 'gzdeflate' ) ) {
 				$text = gzdeflate( $text );
 				$flags[] = 'gzip';
 			} else {
@@ -1255,6 +1254,46 @@ class Revision implements IDBAccessObject {
 		return implode( ',', $flags );
 	}
 
+	/**
+	 * Re-converts revision text according to it's flags.
+	 *
+	 * @param $text Mixed: reference to a text
+	 * @param $flags array: compression flags
+	 * @return String|bool decompressed text, or false on failure
+	 */
+	public static function decompressRevisionText( $text, $flags ) {
+		if ( in_array( 'gzip', $flags ) ) {
+			# Deal with optional compression of archived pages.
+			# This can be done periodically via maintenance/compressOld.php, and
+			# as pages are saved if $wgCompressRevisions is set.
+			$text = gzinflate( $text );
+		}
+
+		if ( in_array( 'object', $flags ) ) {
+			# Generic compressed storage
+			$obj = unserialize( $text );
+			if ( !is_object( $obj ) ) {
+				// Invalid object
+				return false;
+			}
+			$text = $obj->getText();
+		}
+
+		global $wgLegacyEncoding;
+		if ( $text !== false && $wgLegacyEncoding
+			&& !in_array( 'utf-8', $flags ) && !in_array( 'utf8', $flags ) )
+		{
+			# Old revisions kept around in a legacy encoding?
+			# Upconvert on demand.
+			# ("utf8" checked for compatibility with some broken
+			#  conversion scripts 2008-12-30)
+			global $wgContLang;
+			$text = $wgContLang->iconv( $wgLegacyEncoding, 'UTF-8', $text );
+		}
+
+		return $text;
+	}
+
 	/**
 	 * Insert a new revision into the database, returning the new revision ID
 	 * number on success and dies horribly on failure.
@@ -1274,32 +1313,35 @@ class Revision implements IDBAccessObject {
 		$flags = self::compressRevisionText( $data );
 
 		# Write to external storage if required
-		if( $wgDefaultExternalStore ) {
+		if ( $wgDefaultExternalStore ) {
 			// Store and get the URL
 			$data = ExternalStore::insertToDefault( $data );
-			if( !$data ) {
+			if ( !$data ) {
+				wfProfileOut( __METHOD__ );
 				throw new MWException( "Unable to store text to external storage" );
 			}
-			if( $flags ) {
+			if ( $flags ) {
 				$flags .= ',';
 			}
 			$flags .= 'external';
 		}
 
 		# Record the text (or external storage URL) to the text table
-		if( !isset( $this->mTextId ) ) {
+		if ( !isset( $this->mTextId ) ) {
 			$old_id = $dbw->nextSequenceValue( 'text_old_id_seq' );
 			$dbw->insert( 'text',
 				array(
-					'old_id'    => $old_id,
-					'old_text'  => $data,
+					'old_id' => $old_id,
+					'old_text' => $data,
 					'old_flags' => $flags,
 				), __METHOD__
 			);
 			$this->mTextId = $dbw->insertId();
 		}
 
-		if ( $this->mComment === null ) $this->mComment = "";
+		if ( $this->mComment === null ) {
+			$this->mComment = "";
+		}
 
 		# Record the edit in revisions
 		$rev_id = isset( $this->mId )
@@ -1334,14 +1376,15 @@ class Revision implements IDBAccessObject {
 			$title = $this->getTitle();
 
 			if ( $title === null ) {
+				wfProfileOut( __METHOD__ );
 				throw new MWException( "Insufficient information to determine the title of the revision's page!" );
 			}
 
 			$defaultModel = ContentHandler::getDefaultModelFor( $title );
 			$defaultFormat = ContentHandler::getForModelID( $defaultModel )->getDefaultFormat();
 
-			$row[ 'rev_content_model' ] = ( $model === $defaultModel ) ? null : $model;
-			$row[ 'rev_content_format' ] = ( $format === $defaultFormat ) ? null : $format;
+			$row['rev_content_model'] = ( $model === $defaultModel ) ? null : $model;
+			$row['rev_content_format'] = ( $format === $defaultFormat ) ? null : $format;
 		}
 
 		$dbw->insert( 'revision', $row, __METHOD__ );
@@ -1422,9 +1465,9 @@ class Revision implements IDBAccessObject {
 		global $wgRevisionCacheExpiry, $wgMemc;
 		$textId = $this->getTextId();
 		$key = wfMemcKey( 'revisiontext', 'textid', $textId );
-		if( $wgRevisionCacheExpiry ) {
+		if ( $wgRevisionCacheExpiry ) {
 			$text = $wgMemc->get( $key );
-			if( is_string( $text ) ) {
+			if ( is_string( $text ) ) {
 				wfDebug( __METHOD__ . ": got id $textId from cache\n" );
 				wfProfileOut( __METHOD__ );
 				return $text;
@@ -1439,28 +1482,38 @@ class Revision implements IDBAccessObject {
 			$row = null;
 		}
 
-		if( !$row ) {
+		if ( !$row ) {
 			// Text data is immutable; check slaves first.
 			$dbr = wfGetDB( DB_SLAVE );
 			$row = $dbr->selectRow( 'text',
 				array( 'old_text', 'old_flags' ),
-				array( 'old_id' => $this->getTextId() ),
+				array( 'old_id' => $textId ),
 				__METHOD__ );
 		}
 
-		if( !$row && wfGetLB()->getServerCount() > 1 ) {
-			// Possible slave lag!
+		// Fallback to the master in case of slave lag. Also use FOR UPDATE if it was
+		// used to fetch this revision to avoid missing the row due to REPEATABLE-READ.
+		$forUpdate = ( $this->mQueryFlags & self::READ_LOCKING == self::READ_LOCKING );
+		if ( !$row && ( $forUpdate || wfGetLB()->getServerCount() > 1 ) ) {
 			$dbw = wfGetDB( DB_MASTER );
 			$row = $dbw->selectRow( 'text',
 				array( 'old_text', 'old_flags' ),
-				array( 'old_id' => $this->getTextId() ),
-				__METHOD__ );
+				array( 'old_id' => $textId ),
+				__METHOD__,
+				$forUpdate ? array( 'FOR UPDATE' ) : array() );
+		}
+
+		if ( !$row ) {
+			wfDebugLog( 'Revision', "No text row with ID '$textId' (revision {$this->getId()})." );
 		}
 
 		$text = self::getRevisionText( $row );
+		if ( $row && $text === false ) {
+			wfDebugLog( 'Revision', "No blob for text row '$textId' (revision {$this->getId()})." );
+		}
 
 		# No negative caching -- negative hits on text rows may be due to corrupted slave servers
-		if( $wgRevisionCacheExpiry && $text !== false ) {
+		if ( $wgRevisionCacheExpiry && $text !== false ) {
 			$wgMemc->set( $key, $text, $wgRevisionCacheExpiry );
 		}
 
@@ -1505,7 +1558,7 @@ class Revision implements IDBAccessObject {
 				),
 			__METHOD__ );
 
-		if( $current ) {
+		if ( $current ) {
 			$row = array(
 				'page'       => $pageId,
 				'comment'    => $summary,
@@ -1517,8 +1570,8 @@ class Revision implements IDBAccessObject {
 			);
 
 			if ( $wgContentHandlerUseDB ) {
-				$row[ 'content_model' ] = $current->rev_content_model;
-				$row[ 'content_format' ] = $current->rev_content_format;
+				$row['content_model'] = $current->rev_content_model;
+				$row['content_format'] = $current->rev_content_format;
 			}
 
 			$revision = new Revision( $row );
@@ -1558,7 +1611,7 @@ class Revision implements IDBAccessObject {
 	 * @return Boolean
 	 */
 	public static function userCanBitfield( $bitfield, $field, User $user = null ) {
-		if( $bitfield & $field ) { // aspect is deleted
+		if ( $bitfield & $field ) { // aspect is deleted
 			if ( $bitfield & self::DELETED_RESTRICTED ) {
 				$permission = 'suppressrevision';
 			} elseif ( $field & self::DELETED_TEXT ) {
@@ -1611,7 +1664,7 @@ class Revision implements IDBAccessObject {
 	static function countByPageId( $db, $id ) {
 		$row = $db->selectRow( 'revision', array( 'revCount' => 'COUNT(*)' ),
 			array( 'rev_page' => $id ), __METHOD__ );
-		if( $row ) {
+		if ( $row ) {
 			return $row->revCount;
 		}
 		return 0;
@@ -1626,7 +1679,7 @@ class Revision implements IDBAccessObject {
 	 */
 	static function countByTitle( $db, $title ) {
 		$id = $title->getArticleID();
-		if( $id ) {
+		if ( $id ) {
 			return self::countByPageId( $db, $id );
 		}
 		return 0;
@@ -1648,7 +1701,9 @@ class Revision implements IDBAccessObject {
 	 * @return bool True if the given user was the only one to edit since the given timestamp
 	 */
 	public static function userWasLastToEdit( $db, $pageId, $userId, $since ) {
-		if ( !$userId ) return false;
+		if ( !$userId ) {
+			return false;
+		}
 
 		if ( is_int( $db ) ) {
 			$db = wfGetDB( $db );
diff --git a/includes/RevisionList.php b/includes/RevisionList.php
index d87c540f..1b865bb0 100644
--- a/includes/RevisionList.php
+++ b/includes/RevisionList.php
@@ -105,7 +105,7 @@ abstract class RevisionListBase extends ContextSource {
 	 * @return int
 	 */
 	public function length() {
-		if( !$this->res ) {
+		if ( !$this->res ) {
 			return 0;
 		} else {
 			return $this->res->numRows();
@@ -352,8 +352,7 @@ class RevisionItem extends RevisionItemBase {
 		if ( $this->isDeleted() && !$this->canViewContent() ) {
 			return $this->context->msg( 'diff' )->escaped();
 		} else {
-			return
-				Linker::link(
+			return Linker::link(
 					$this->list->title,
 					$this->context->msg( 'diff' )->escaped(),
 					array(),
diff --git a/includes/Sanitizer.php b/includes/Sanitizer.php
index 849e4d66..499d8218 100644
--- a/includes/Sanitizer.php
+++ b/includes/Sanitizer.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * XHTML sanitizer for %MediaWiki.
+ * HTML sanitizer for %MediaWiki.
  *
  * Copyright © 2002-2005 Brion Vibber <brion@pobox.com> et al
  * http://www.mediawiki.org/
@@ -25,7 +25,7 @@
  */
 
 /**
- * XHTML sanitizer for MediaWiki
+ * HTML sanitizer for MediaWiki
  * @ingroup Parser
  */
 class Sanitizer {
@@ -54,9 +54,8 @@ class Sanitizer {
 	 * List of all named character entities defined in HTML 4.01
 	 * http://www.w3.org/TR/html4/sgml/entities.html
 	 * As well as &apos; which is only defined starting in XHTML1.
-	 * @private
 	 */
-	static $htmlEntities = array(
+	private static $htmlEntities = array(
 		'Aacute'   => 193,
 		'aacute'   => 225,
 		'Acirc'    => 194,
@@ -315,7 +314,7 @@ class Sanitizer {
 	/**
 	 * Character entity aliases accepted by MediaWiki
 	 */
-	static $htmlEntityAliases = array(
+	private static $htmlEntityAliases = array(
 		'רלמ' => 'rlm',
 		'رلم' => 'rlm',
 	);
@@ -323,7 +322,7 @@ class Sanitizer {
 	/**
 	 * Lazy-initialised attributes regex, see getAttribsRegex()
 	 */
-	static $attribsRegex;
+	private static $attribsRegex;
 
 	/**
 	 * Regular expression to match HTML/XML attribute pairs within a tag.
@@ -357,14 +356,17 @@ class Sanitizer {
 	 * removes HTML comments
 	 * @private
 	 * @param $text String
-	 * @param $processCallback Callback to do any variable or parameter replacements in HTML attribute values
+	 * @param $processCallback Callback to do any variable or parameter
+	 *        replacements in HTML attribute values
 	 * @param array $args for the processing callback
 	 * @param array $extratags for any extra tags to include
 	 * @param array $removetags for any tags (default or extra) to exclude
 	 * @return string
 	 */
-	static function removeHTMLtags( $text, $processCallback = null, $args = array(), $extratags = array(), $removetags = array() ) {
-		global $wgUseTidy, $wgHtml5, $wgAllowMicrodataAttributes, $wgAllowImageTag;
+	static function removeHTMLtags( $text, $processCallback = null,
+		$args = array(), $extratags = array(), $removetags = array()
+	) {
+		global $wgUseTidy, $wgAllowMicrodataAttributes, $wgAllowImageTag;
 
 		static $htmlpairsStatic, $htmlsingle, $htmlsingleonly, $htmlnest, $tabletags,
 			$htmllist, $listtags, $htmlsingleallowed, $htmlelementsStatic, $staticInitialised;
@@ -373,7 +375,7 @@ class Sanitizer {
 
 		// Base our staticInitialised variable off of the global config state so that if the globals
 		// are changed (like in the screwed up test system) we will re-initialise the settings.
-		$globalContext = implode( '-', compact( 'wgHtml5', 'wgAllowMicrodataAttributes', 'wgAllowImageTag' ) );
+		$globalContext = implode( '-', compact( 'wgAllowMicrodataAttributes', 'wgAllowImageTag' ) );
 		if ( !$staticInitialised || $staticInitialised != $globalContext ) {
 
 			$htmlpairsStatic = array( # Tags that must be closed
@@ -382,30 +384,28 @@ class Sanitizer {
 				'strike', 'strong', 'tt', 'var', 'div', 'center',
 				'blockquote', 'ol', 'ul', 'dl', 'table', 'caption', 'pre',
 				'ruby', 'rt', 'rb', 'rp', 'p', 'span', 'abbr', 'dfn',
-				'kbd', 'samp'
+				'kbd', 'samp', 'data', 'time', 'mark'
 			);
-			if ( $wgHtml5 ) {
-				$htmlpairsStatic = array_merge( $htmlpairsStatic, array( 'data', 'time', 'mark' ) );
-			}
 			$htmlsingle = array(
-				'br', 'hr', 'li', 'dt', 'dd'
+				'br', 'wbr', 'hr', 'li', 'dt', 'dd'
 			);
 			$htmlsingleonly = array( # Elements that cannot have close tags
-				'br', 'hr'
+				'br', 'wbr', 'hr'
 			);
-			if ( $wgHtml5 && $wgAllowMicrodataAttributes ) {
+			if ( $wgAllowMicrodataAttributes ) {
 				$htmlsingle[] = $htmlsingleonly[] = 'meta';
 				$htmlsingle[] = $htmlsingleonly[] = 'link';
 			}
 			$htmlnest = array( # Tags that can be nested--??
 				'table', 'tr', 'td', 'th', 'div', 'blockquote', 'ol', 'ul',
-				'li', 'dl', 'dt', 'dd', 'font', 'big', 'small', 'sub', 'sup', 'span'
+				'li', 'dl', 'dt', 'dd', 'font', 'big', 'small', 'sub', 'sup', 'span',
+				'var', 'kbd', 'samp', 'em', 'strong', 'q', 'ruby', 'bdo'
 			);
 			$tabletags = array( # Can only appear inside table, we will close them
 				'td', 'th', 'tr',
 			);
 			$htmllist = array( # Tags used by list
-				'ul','ol',
+				'ul', 'ol',
 			);
 			$listtags = array( # Tags that can appear in a list
 				'li',
@@ -446,7 +446,7 @@ class Sanitizer {
 				# $params: String between element name and >
 				# $brace: Ending '>' or '/>'
 				# $rest: Everything until the next element of $bits
-				if( preg_match( '!^(/?)(\\w+)([^>]*?)(/{0,1}>)([^<]*)$!', $x, $regs ) ) {
+				if ( preg_match( '!^(/?)([^\\s/>]+)([^>]*?)(/{0,1}>)([^<]*)$!', $x, $regs ) ) {
 					list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
 				} else {
 					$slash = $t = $params = $brace = $rest = null;
@@ -507,7 +507,7 @@ class Sanitizer {
 						!in_array( 'table', $tagstack ) ) {
 							$badtag = true;
 						} elseif ( in_array( $t, $tagstack ) &&
-						!isset( $htmlnest [$t ] ) ) {
+						!isset( $htmlnest[$t] ) ) {
 							$badtag = true;
 						# Is it a self closed htmlpair ? (bug 5487)
 						} elseif ( $brace == '/>' &&
@@ -537,7 +537,7 @@ class Sanitizer {
 
 						# Replace any variables or template parameters with
 						# plaintext results.
-						if( is_callable( $processCallback ) ) {
+						if ( is_callable( $processCallback ) ) {
 							call_user_func_array( $processCallback, array( &$params, $args ) );
 						}
 
@@ -555,12 +555,14 @@ class Sanitizer {
 						continue;
 					}
 				}
-				$text .= '&lt;' . str_replace( '>', '&gt;', $x);
+				$text .= '&lt;' . str_replace( '>', '&gt;', $x );
 			}
 			# Close off any remaining tags
-			while ( is_array( $tagstack ) && ($t = array_pop( $tagstack )) ) {
+			while ( is_array( $tagstack ) && ( $t = array_pop( $tagstack ) ) ) {
 				$text .= "</$t>\n";
-				if ( $t == 'table' ) { $tagstack = array_pop( $tablestack ); }
+				if ( $t == 'table' ) {
+					$tagstack = array_pop( $tablestack );
+				}
 			}
 		} else {
 			# this might be possible using tidy itself
@@ -570,7 +572,7 @@ class Sanitizer {
 				@list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
 				$badtag = false;
 				if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
-					if( is_callable( $processCallback ) ) {
+					if ( is_callable( $processCallback ) ) {
 						call_user_func_array( $processCallback, array( &$params, $args ) );
 					}
 
@@ -585,7 +587,7 @@ class Sanitizer {
 						continue;
 					}
 				}
-				$text .= '&lt;' . str_replace( '>', '&gt;', $x);
+				$text .= '&lt;' . str_replace( '>', '&gt;', $x );
 			}
 		}
 		wfProfileOut( __METHOD__ );
@@ -604,7 +606,7 @@ class Sanitizer {
 	 */
 	static function removeHTMLcomments( $text ) {
 		wfProfileIn( __METHOD__ );
-		while ( ($start = strpos( $text, '<!--' ) ) !== false ) {
+		while ( ( $start = strpos( $text, '<!--' ) ) !== false ) {
 			$end = strpos( $text, '-->', $start + 4 );
 			if ( $end === false ) {
 				# Unterminated comment; bail out
@@ -621,9 +623,11 @@ class Sanitizer {
 				$spaceStart--;
 				$spaceLen++;
 			}
-			while ( substr( $text, $spaceStart + $spaceLen, 1 ) === ' ' )
+			while ( substr( $text, $spaceStart + $spaceLen, 1 ) === ' ' ) {
 				$spaceLen++;
-			if ( substr( $text, $spaceStart, 1 ) === "\n" and substr( $text, $spaceStart + $spaceLen, 1 ) === "\n" ) {
+			}
+			if ( substr( $text, $spaceStart, 1 ) === "\n"
+				&& substr( $text, $spaceStart + $spaceLen, 1 ) === "\n" ) {
 				# Remove the comment, leading and trailing
 				# spaces, and leave only one newline.
 				$text = substr_replace( $text, "\n", $spaceStart, $spaceLen + 1 );
@@ -706,13 +710,13 @@ class Sanitizer {
 	 * @todo Check for unique id attribute :P
 	 */
 	static function validateAttributes( $attribs, $whitelist ) {
-		global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes, $wgHtml5;
+		global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
 
 		$whitelist = array_flip( $whitelist );
 		$hrefExp = '/^(' . wfUrlProtocols() . ')[^\s]+$/';
 
 		$out = array();
-		foreach( $attribs as $attribute => $value ) {
+		foreach ( $attribs as $attribute => $value ) {
 			#allow XML namespace declaration if RDFa is enabled
 			if ( $wgAllowRdfaAttributes && preg_match( self::XMLNS_ATTRIBUTE_PATTERN, $attribute ) ) {
 				if ( !preg_match( self::EVIL_URI_PATTERN, $value ) ) {
@@ -722,14 +726,14 @@ class Sanitizer {
 				continue;
 			}
 
-			# Allow any attribute beginning with "data-", if in HTML5 mode
-			if ( !($wgHtml5 && preg_match( '/^data-/i', $attribute )) && !isset( $whitelist[$attribute] ) ) {
+			# Allow any attribute beginning with "data-"
+			if ( !preg_match( '/^data-/i', $attribute ) && !isset( $whitelist[$attribute] ) ) {
 				continue;
 			}
 
 			# Strip javascript "expression" from stylesheets.
 			# http://msdn.microsoft.com/workshop/author/dhtml/overview/recalc.asp
-			if( $attribute == 'style' ) {
+			if ( $attribute == 'style' ) {
 				$value = Sanitizer::checkCss( $value );
 			}
 
@@ -739,7 +743,7 @@ class Sanitizer {
 
 			# WAI-ARIA
 			# http://www.w3.org/TR/wai-aria/
-			# http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#wai-aria
+			# http://www.whatwg.org/html/elements.html#wai-aria
 			# For now we only support role="presentation" until we work out what roles should be
 			# usable by content and we ensure that our code explicitly rejects patterns that
 			# violate HTML5's ARIA restrictions.
@@ -747,13 +751,18 @@ class Sanitizer {
 				continue;
 			}
 
-			//RDFa and microdata properties allow URLs, URIs and/or CURIs. check them for sanity
-			if ( $attribute === 'rel' || $attribute === 'rev' ||
-				$attribute === 'about' || $attribute === 'property' || $attribute === 'resource' || #RDFa
-				$attribute === 'datatype' || $attribute === 'typeof' ||                             #RDFa
-				$attribute === 'itemid' || $attribute === 'itemprop' || $attribute === 'itemref' || #HTML5 microdata
-				$attribute === 'itemscope' || $attribute === 'itemtype' ) {                         #HTML5 microdata
-
+			// RDFa and microdata properties allow URLs, URIs and/or CURIs.
+			// Check them for sanity.
+			if ( $attribute === 'rel' || $attribute === 'rev'
+				# RDFa
+				|| $attribute === 'about' || $attribute === 'property'
+				|| $attribute === 'resource' || $attribute === 'datatype'
+				|| $attribute === 'typeof'
+				# HTML5 microdata
+				|| $attribute === 'itemid' || $attribute === 'itemprop'
+				|| $attribute === 'itemref' || $attribute === 'itemscope'
+				|| $attribute === 'itemtype'
+			) {
 				//Paranoia. Allow "simple" values but suppress javascript
 				if ( preg_match( self::EVIL_URI_PATTERN, $value ) ) {
 					continue;
@@ -765,7 +774,7 @@ class Sanitizer {
 			if ( $attribute === 'href' || $attribute === 'src' ) {
 				if ( !preg_match( $hrefExp, $value ) ) {
 					continue; //drop any href or src attributes not using an allowed protocol.
-						  //NOTE: this also drops all relative URLs
+					// NOTE: this also drops all relative URLs
 				}
 			}
 
@@ -798,9 +807,10 @@ class Sanitizer {
 	 */
 	static function mergeAttributes( $a, $b ) {
 		$out = array_merge( $a, $b );
-		if( isset( $a['class'] ) && isset( $b['class'] )
-		&& is_string( $a['class'] ) && is_string( $b['class'] )
-		&& $a['class'] !== $b['class'] ) {
+		if ( isset( $a['class'] ) && isset( $b['class'] )
+			&& is_string( $a['class'] ) && is_string( $b['class'] )
+			&& $a['class'] !== $b['class']
+		) {
 			$classes = preg_split( '/\s+/', "{$a['class']} {$b['class']}",
 				-1, PREG_SPLIT_NO_EMPTY );
 			$out['class'] = implode( ' ', array_unique( $classes ) );
@@ -811,9 +821,10 @@ class Sanitizer {
 	/**
 	 * Pick apart some CSS and check it for forbidden or unsafe structures.
 	 * Returns a sanitized string. This sanitized string will have
-	 * character references and escape sequences decoded, and comments
-	 * stripped. If the input is just too evil, only a comment complaining
-	 * about evilness will be returned.
+	 * character references and escape sequences decoded and comments
+	 * stripped (unless it is itself one valid comment, in which case the value
+	 * will be passed through). If the input is just too evil, only a comment
+	 * complaining about evilness will be returned.
 	 *
 	 * Currently URL references, 'expression', 'tps' are forbidden.
 	 *
@@ -854,60 +865,28 @@ class Sanitizer {
 		$value = preg_replace_callback( $decodeRegex,
 			array( __CLASS__, 'cssDecodeCallback' ), $value );
 
-		// Normalize Halfwidth and Fullwidth Unicode block that IE6 might treat as ascii
-		$value = preg_replace_callback(
-			'/[！-ｚ]/u', // U+FF01 to U+FF5A
-			function ( $matches ) {
-				$cp = utf8ToCodepoint( $matches[0] );
-				if ( $cp === false ) {
-					return '';
-				}
-				return chr( $cp - 65248 ); // ASCII range \x21-\x7A
-			},
-			$value
-		);
-
-		// Convert more characters IE6 might treat as ascii
-		// U+0280, U+0274, U+207F, U+029F, U+026A, U+207D, U+208D
-		$value = str_replace(
-			array( 'ʀ', 'ɴ', 'ⁿ', 'ʟ', 'ɪ', '⁽', '₍' ),
-			array( 'r', 'n', 'n', 'l', 'i', '(', '(' ),
-			$value
-		);
-
-		// Remove any comments; IE gets token splitting wrong
-		// This must be done AFTER decoding character references and
-		// escape sequences, because those steps can introduce comments
-		// This step cannot introduce character references or escape
-		// sequences, because it replaces comments with spaces rather
-		// than removing them completely.
-		$value = StringUtils::delimiterReplace( '/*', '*/', ' ', $value );
-
-		// Remove anything after a comment-start token, to guard against
-		// incorrect client implementations.
-		$commentPos = strpos( $value, '/*' );
-		if ( $commentPos !== false ) {
-			$value = substr( $value, 0, $commentPos );
+		// Let the value through if it's nothing but a single comment, to
+		// allow other functions which may reject it to pass some error
+		// message through.
+		if ( !preg_match( '! ^ \s* /\* [^*\\/]* \*/ \s* $ !x', $value ) ) {
+			// Remove any comments; IE gets token splitting wrong
+			// This must be done AFTER decoding character references and
+			// escape sequences, because those steps can introduce comments
+			// This step cannot introduce character references or escape
+			// sequences, because it replaces comments with spaces rather
+			// than removing them completely.
+			$value = StringUtils::delimiterReplace( '/*', '*/', ' ', $value );
+
+			// Remove anything after a comment-start token, to guard against
+			// incorrect client implementations.
+			$commentPos = strpos( $value, '/*' );
+			if ( $commentPos !== false ) {
+				$value = substr( $value, 0, $commentPos );
+			}
 		}
 
-		// S followed by repeat, iteration, or prolonged sound marks,
-		// which IE will treat as "ss"
-		$value = preg_replace(
-			'/s(?:
-				\xE3\x80\xB1 | # U+3031
-				\xE3\x82\x9D | # U+309D
-				\xE3\x83\xBC | # U+30FC
-				\xE3\x83\xBD | # U+30FD
-				\xEF\xB9\xBC | # U+FE7C
-				\xEF\xB9\xBD | # U+FE7D
-				\xEF\xBD\xB0   # U+FF70
-			)/ix',
-			'ss',
-			$value
-		);
-
 		// Reject problematic keywords and control characters
-		if ( preg_match( '/[\000-\010\013\016-\037\177]/', $value ) ) {
+		if ( preg_match( '/[\000-\010\016-\037\177]/', $value ) ) {
 			return '/* invalid control char */';
 		} elseif ( preg_match( '! expression | filter\s*: | accelerator\s*: | url\s*\( | image\s*\( | image-set\s*\( !ix', $value ) ) {
 			return '/* insecure input */';
@@ -960,21 +939,14 @@ class Sanitizer {
 	 * @return String
 	 */
 	static function fixTagAttributes( $text, $element ) {
-		if( trim( $text ) == '' ) {
+		if ( trim( $text ) == '' ) {
 			return '';
 		}
 
 		$decoded = Sanitizer::decodeTagAttributes( $text );
 		$stripped = Sanitizer::validateTagAttributes( $decoded, $element );
 
-		$attribs = array();
-		foreach( $stripped as $attribute => $value ) {
-			$encAttribute = htmlspecialchars( $attribute );
-			$encValue = Sanitizer::safeEncodeAttribute( $value );
-
-			$attribs[] = "$encAttribute=\"$encValue\"";
-		}
-		return count( $attribs ) ? ' ' . implode( ' ', $attribs ) : '';
+		return Sanitizer::safeEncodeTagAttributes( $stripped );
 	}
 
 	/**
@@ -1047,7 +1019,7 @@ class Sanitizer {
 	 *                                                          in the id and
 	 *                                                          name attributes
 	 * @see http://www.w3.org/TR/html401/struct/links.html#h-12.2.3 Anchors with the id attribute
-	 * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#the-id-attribute
+	 * @see http://www.whatwg.org/html/elements.html#the-id-attribute
 	 *   HTML5 definition of id attribute
 	 *
 	 * @param string $id id to escape
@@ -1062,10 +1034,10 @@ class Sanitizer {
 	 * @return String
 	 */
 	static function escapeId( $id, $options = array() ) {
-		global $wgHtml5, $wgExperimentalHtmlIds;
+		global $wgExperimentalHtmlIds;
 		$options = (array)$options;
 
-		if ( $wgHtml5 && $wgExperimentalHtmlIds && !in_array( 'legacy', $options ) ) {
+		if ( $wgExperimentalHtmlIds && !in_array( 'legacy', $options ) ) {
 			$id = Sanitizer::decodeCharReferences( $id );
 			$id = preg_replace( '/[ \t\n\r\f_\'"&#%]+/', '_', $id );
 			$id = trim( $id, '_' );
@@ -1146,13 +1118,13 @@ class Sanitizer {
 	 * @return Array
 	 */
 	public static function decodeTagAttributes( $text ) {
-		if( trim( $text ) == '' ) {
+		if ( trim( $text ) == '' ) {
 			return array();
 		}
 
 		$attribs = array();
 		$pairs = array();
-		if( !preg_match_all(
+		if ( !preg_match_all(
 			self::getAttribsRegex(),
 			$text,
 			$pairs,
@@ -1160,7 +1132,7 @@ class Sanitizer {
 			return $attribs;
 		}
 
-		foreach( $pairs as $set ) {
+		foreach ( $pairs as $set ) {
 			$attribute = strtolower( $set[1] );
 			$value = Sanitizer::getTagAttributeCallback( $set );
 
@@ -1174,6 +1146,24 @@ class Sanitizer {
 		return $attribs;
 	}
 
+	/**
+	 * Build a partial tag string from an associative array of attribute
+	 * names and values as returned by decodeTagAttributes.
+	 *
+	 * @param $assoc_array Array
+	 * @return String
+	 */
+	public static function safeEncodeTagAttributes( $assoc_array ) {
+		$attribs = array();
+		foreach ( $assoc_array as $attribute => $value ) {
+			$encAttribute = htmlspecialchars( $attribute );
+			$encValue = Sanitizer::safeEncodeAttribute( $value );
+
+			$attribs[] = "$encAttribute=\"$encValue\"";
+		}
+		return count( $attribs ) ? ' ' . implode( ' ', $attribs ) : '';
+	}
+
 	/**
 	 * Pick the appropriate attribute value from a match set from the
 	 * attribs regex matches.
@@ -1183,19 +1173,19 @@ class Sanitizer {
 	 * @return String
 	 */
 	private static function getTagAttributeCallback( $set ) {
-		if( isset( $set[6] ) ) {
+		if ( isset( $set[6] ) ) {
 			# Illegal #XXXXXX color with no quotes.
 			return $set[6];
-		} elseif( isset( $set[5] ) ) {
+		} elseif ( isset( $set[5] ) ) {
 			# No quotes.
 			return $set[5];
-		} elseif( isset( $set[4] ) ) {
+		} elseif ( isset( $set[4] ) ) {
 			# Single-quoted
 			return $set[4];
-		} elseif( isset( $set[3] ) ) {
+		} elseif ( isset( $set[3] ) ) {
 			# Double-quoted
 			return $set[3];
-		} elseif( !isset( $set[2] ) ) {
+		} elseif ( !isset( $set[2] ) ) {
 			# In XHTML, attributes must have a value.
 			# For 'reduced' form, return explicitly the attribute name here.
 			return $set[1];
@@ -1271,14 +1261,14 @@ class Sanitizer {
 	 */
 	static function normalizeCharReferencesCallback( $matches ) {
 		$ret = null;
-		if( $matches[1] != '' ) {
+		if ( $matches[1] != '' ) {
 			$ret = Sanitizer::normalizeEntity( $matches[1] );
-		} elseif( $matches[2] != '' ) {
+		} elseif ( $matches[2] != '' ) {
 			$ret = Sanitizer::decCharReference( $matches[2] );
-		} elseif( $matches[3] != '' ) {
+		} elseif ( $matches[3] != '' ) {
 			$ret = Sanitizer::hexCharReference( $matches[3] );
 		}
-		if( is_null( $ret ) ) {
+		if ( is_null( $ret ) ) {
 			return htmlspecialchars( $matches[0] );
 		} else {
 			return $ret;
@@ -1314,7 +1304,7 @@ class Sanitizer {
 	 */
 	static function decCharReference( $codepoint ) {
 		$point = intval( $codepoint );
-		if( Sanitizer::validateCodepoint( $point ) ) {
+		if ( Sanitizer::validateCodepoint( $point ) ) {
 			return sprintf( '&#%d;', $point );
 		} else {
 			return null;
@@ -1327,7 +1317,7 @@ class Sanitizer {
 	 */
 	static function hexCharReference( $codepoint ) {
 		$point = hexdec( $codepoint );
-		if( Sanitizer::validateCodepoint( $point ) ) {
+		if ( Sanitizer::validateCodepoint( $point ) ) {
 			return sprintf( '&#x%x;', $point );
 		} else {
 			return null;
@@ -1340,12 +1330,12 @@ class Sanitizer {
 	 * @return Boolean
 	 */
 	private static function validateCodepoint( $codepoint ) {
-		return ($codepoint ==    0x09)
-			|| ($codepoint ==    0x0a)
-			|| ($codepoint ==    0x0d)
-			|| ($codepoint >=    0x20 && $codepoint <=   0xd7ff)
-			|| ($codepoint >=  0xe000 && $codepoint <=   0xfffd)
-			|| ($codepoint >= 0x10000 && $codepoint <= 0x10ffff);
+		return $codepoint == 0x09
+			|| $codepoint == 0x0a
+			|| $codepoint == 0x0d
+			|| ( $codepoint >= 0x20 && $codepoint <= 0xd7ff )
+			|| ( $codepoint >= 0xe000 && $codepoint <= 0xfffd )
+			|| ( $codepoint >= 0x10000 && $codepoint <= 0x10ffff );
 	}
 
 	/**
@@ -1391,12 +1381,12 @@ class Sanitizer {
 	 * @return String
 	 */
 	static function decodeCharReferencesCallback( $matches ) {
-		if( $matches[1] != '' ) {
+		if ( $matches[1] != '' ) {
 			return Sanitizer::decodeEntity( $matches[1] );
-		} elseif( $matches[2] != '' ) {
-			return  Sanitizer::decodeChar( intval( $matches[2] ) );
-		} elseif( $matches[3] != '' ) {
-			return  Sanitizer::decodeChar( hexdec( $matches[3] ) );
+		} elseif ( $matches[2] != '' ) {
+			return Sanitizer::decodeChar( intval( $matches[2] ) );
+		} elseif ( $matches[3] != '' ) {
+			return Sanitizer::decodeChar( hexdec( $matches[3] ) );
 		}
 		# Last case should be an ampersand by itself
 		return $matches[0];
@@ -1410,7 +1400,7 @@ class Sanitizer {
 	 * @private
 	 */
 	static function decodeChar( $codepoint ) {
-		if( Sanitizer::validateCodepoint( $codepoint ) ) {
+		if ( Sanitizer::validateCodepoint( $codepoint ) ) {
 			return codepointToUtf8( $codepoint );
 		} else {
 			return UTF8_REPLACEMENT;
@@ -1429,7 +1419,7 @@ class Sanitizer {
 		if ( isset( self::$htmlEntityAliases[$name] ) ) {
 			$name = self::$htmlEntityAliases[$name];
 		}
-		if( isset( self::$htmlEntities[$name] ) ) {
+		if ( isset( self::$htmlEntities[$name] ) ) {
 			return codepointToUtf8( self::$htmlEntities[$name] );
 		} else {
 			return "&$name;";
@@ -1455,10 +1445,10 @@ class Sanitizer {
 	 * @return Array
 	 */
 	static function setupAttributeWhitelist() {
-		global $wgAllowRdfaAttributes, $wgHtml5, $wgAllowMicrodataAttributes;
+		global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
 
 		static $whitelist, $staticInitialised;
-		$globalContext = implode( '-', compact( 'wgAllowRdfaAttributes', 'wgHtml5', 'wgAllowMicrodataAttributes' ) );
+		$globalContext = implode( '-', compact( 'wgAllowRdfaAttributes', 'wgAllowMicrodataAttributes' ) );
 
 		if ( isset( $whitelist ) && $staticInitialised == $globalContext ) {
 			return $whitelist;
@@ -1478,32 +1468,35 @@ class Sanitizer {
 		);
 
 		if ( $wgAllowRdfaAttributes ) {
-			#RDFa attributes as specified in section 9 of http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014
+			# RDFa attributes as specified in section 9 of
+			# http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014
 			$common = array_merge( $common, array(
-			    'about', 'property', 'resource', 'datatype', 'typeof',
+				'about', 'property', 'resource', 'datatype', 'typeof',
 			) );
 		}
 
-		if ( $wgHtml5 && $wgAllowMicrodataAttributes ) {
-			# add HTML5 microdata tags as specified by http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html#the-microdata-model
+		if ( $wgAllowMicrodataAttributes ) {
+			# add HTML5 microdata tags as specified by
+			# http://www.whatwg.org/html/microdata.html#the-microdata-model
 			$common = array_merge( $common, array(
-			    'itemid', 'itemprop', 'itemref', 'itemscope', 'itemtype'
+				'itemid', 'itemprop', 'itemref', 'itemscope', 'itemtype'
 			) );
 		}
 
 		$block = array_merge( $common, array( 'align' ) );
 		$tablealign = array( 'align', 'char', 'charoff', 'valign' );
-		$tablecell = array( 'abbr',
-		                    'axis',
-		                    'headers',
-		                    'scope',
-		                    'rowspan',
-		                    'colspan',
-		                    'nowrap', # deprecated
-		                    'width',  # deprecated
-		                    'height', # deprecated
-		                    'bgcolor' # deprecated
-		                    );
+		$tablecell = array(
+			'abbr',
+			'axis',
+			'headers',
+			'scope',
+			'rowspan',
+			'colspan',
+			'nowrap', # deprecated
+			'width', # deprecated
+			'height', # deprecated
+			'bgcolor', # deprecated
+		);
 
 		# Numbers refer to sections in HTML 4.01 standard describing the element.
 		# See: http://www.w3.org/TR/html4/
@@ -1553,6 +1546,9 @@ class Sanitizer {
 			# 9.3.2
 			'br'         => array( 'id', 'class', 'title', 'style', 'clear' ),
 
+			# http://www.whatwg.org/html/text-level-semantics.html#the-wbr-element
+			'wbr'        => array( 'id', 'class', 'title', 'style' ),
+
 			# 9.3.4
 			'pre'        => array_merge( $common, array( 'width' ) ),
 
@@ -1596,7 +1592,9 @@ class Sanitizer {
 			'td'         => array_merge( $common, $tablecell, $tablealign ),
 			'th'         => array_merge( $common, $tablecell, $tablealign ),
 
-			# 12.2 # NOTE: <a> is not allowed directly, but the attrib whitelist is used from the Parser object
+			# 12.2
+			# NOTE: <a> is not allowed directly, but the attrib
+			# whitelist is used from the Parser object
 			'a'          => array_merge( $common, array( 'href', 'rel', 'rev' ) ), # rel/rev esp. for RDFa
 
 			# 13.2
@@ -1622,8 +1620,8 @@ class Sanitizer {
 			# 15.3
 			'hr'         => array_merge( $common, array( 'noshade', 'size', 'width' ) ),
 
-			# XHTML Ruby annotation text module, simple ruby only.
-			# http://www.w3c.org/TR/ruby/
+			# HTML Ruby annotation text module, simple ruby only.
+			# http://www.whatwg.org/html/text-level-semantics.html#the-ruby-element
 			'ruby'       => $common,
 			# rbc
 			# rtc
@@ -1639,25 +1637,20 @@ class Sanitizer {
 			# HTML 5 section 4.6
 			'bdi' => $common,
 
-		);
-
-		if ( $wgHtml5 ) {
 			# HTML5 elements, defined by:
-			# http://www.whatwg.org/specs/web-apps/current-work/multipage/
-			$whitelist += array(
-				'data' => array_merge( $common, array( 'value' ) ),
-				'time' => array_merge( $common, array( 'datetime' ) ),
-				'mark' => $common,
-
-				// meta and link are only permitted by removeHTMLtags when Microdata
-				// is enabled so we don't bother adding a conditional to hide these
-				// Also meta and link are only valid in WikiText as Microdata elements
-				// (ie: validateTag rejects tags missing the attributes needed for Microdata)
-				// So we don't bother including $common attributes that have no purpose.
-				'meta' => array( 'itemprop', 'content' ),
-				'link' => array( 'itemprop', 'href' ),
-			);
-		}
+			# http://www.whatwg.org/html/
+			'data' => array_merge( $common, array( 'value' ) ),
+			'time' => array_merge( $common, array( 'datetime' ) ),
+			'mark' => $common,
+
+			// meta and link are only permitted by removeHTMLtags when Microdata
+			// is enabled so we don't bother adding a conditional to hide these
+			// Also meta and link are only valid in WikiText as Microdata elements
+			// (ie: validateTag rejects tags missing the attributes needed for Microdata)
+			// So we don't bother including $common attributes that have no purpose.
+			'meta' => array( 'itemprop', 'content' ),
+			'link' => array( 'itemprop', 'href' ),
+		);
 
 		$staticInitialised = $globalContext;
 
@@ -1696,7 +1689,7 @@ class Sanitizer {
 	 */
 	static function hackDocType() {
 		$out = "<!DOCTYPE html [\n";
-		foreach( self::$htmlEntities as $entity => $codepoint ) {
+		foreach ( self::$htmlEntities as $entity => $codepoint ) {
 			$out .= "<!ENTITY $entity \"&#$codepoint;\">";
 		}
 		$out .= "]>\n";
@@ -1718,7 +1711,7 @@ class Sanitizer {
 
 		# Validate hostname portion
 		$matches = array();
-		if( preg_match( '!^([^:]+:)(//[^/]+)?(.*)$!iD', $url, $matches ) ) {
+		if ( preg_match( '!^([^:]+:)(//[^/]+)?(.*)$!iD', $url, $matches ) ) {
 			list( /* $whole */, $protocol, $host, $rest ) = $matches;
 
 			// Characters that will be ignored in IDNs.
@@ -1762,7 +1755,7 @@ class Sanitizer {
 	 * Does a string look like an e-mail address?
 	 *
 	 * This validates an email address using an HTML5 specification found at:
-	 * http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
+	 * http://www.whatwg.org/html/states-of-the-type-attribute.html#valid-e-mail-address
 	 * Which as of 2011-01-24 says:
 	 *
 	 *   A valid e-mail address is a string that matches the ABNF production
@@ -1788,7 +1781,7 @@ class Sanitizer {
 	 */
 	public static function validateEmail( $addr ) {
 		$result = null;
-		if( !wfRunHooks( 'isValidEmailAddr', array( $addr, &$result ) ) ) {
+		if ( !wfRunHooks( 'isValidEmailAddr', array( $addr, &$result ) ) ) {
 			return $result;
 		}
 
@@ -1807,6 +1800,6 @@ class Sanitizer {
 		$                      # End of string
 		/ix"; // case Insensitive, eXtended
 
-		return (bool) preg_match( $HTML5_email_regexp, $addr );
+		return (bool)preg_match( $HTML5_email_regexp, $addr );
 	}
 }
diff --git a/includes/ScopedCallback.php b/includes/ScopedCallback.php
index 1d5b26bf..ef22e0a3 100644
--- a/includes/ScopedCallback.php
+++ b/includes/ScopedCallback.php
@@ -22,19 +22,52 @@
 
 /**
  * Class for asserting that a callback happens when an dummy object leaves scope
+ *
+ * @since 1.21
  */
 class ScopedCallback {
-	/** @var Closure */
+	/** @var callable */
 	protected $callback;
 
 	/**
-	 * @param $callback Closure
+	 * @param callable $callback
+	 * @throws MWException
 	 */
-	public function __construct( Closure $callback ) {
+	public function __construct( $callback ) {
+		if ( !is_callable( $callback ) ) {
+			throw new MWException( "Provided callback is not valid." );
+		}
 		$this->callback = $callback;
 	}
 
+	/**
+	 * Trigger a scoped callback and destroy it.
+	 * This is the same is just setting it to null.
+	 *
+	 * @param ScopedCallback $sc
+	 */
+	public static function consume( ScopedCallback &$sc = null ) {
+		$sc = null;
+	}
+
+	/**
+	 * Destroy a scoped callback without triggering it
+	 *
+	 * @param ScopedCallback $sc
+	 */
+	public static function cancel( ScopedCallback &$sc = null ) {
+		if ( $sc ) {
+			$sc->callback = null;
+		}
+		$sc = null;
+	}
+
+	/**
+	 * Trigger the callback when this leaves scope
+	 */
 	function __destruct() {
-		call_user_func( $this->callback );
+		if ( $this->callback !== null ) {
+			call_user_func( $this->callback );
+		}
 	}
 }
diff --git a/includes/SeleniumWebSettings.php b/includes/SeleniumWebSettings.php
deleted file mode 100644
index 7715484e..00000000
--- a/includes/SeleniumWebSettings.php
+++ /dev/null
@@ -1,221 +0,0 @@
-<?php
-/**
- * Dynamically change configuration variables based on the test suite name and a cookie value.
- *
- * For details on how to configure a wiki for a Selenium test, see:
- * http://www.mediawiki.org/wiki/SeleniumFramework#Test_Wiki_configuration
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
-	die( 1 );
-}
-
-require_once( "$IP/includes/GlobalFunctions.php" );
-
-$fname = 'SeleniumWebSettings.php';
-wfProfileIn( $fname );
-
-$cookiePrefix = $wgSitename . '-';
-$cookieName = $cookiePrefix . 'Selenium';
-
-// this is a fallback SQL file
-$testSqlFile = false;
-$testImageZip = false;
-
-// if we find a request parameter containing the test name, set a cookie with the test name
-if ( isset( $_GET['setupTestSuite'] ) ) {
-	$setupTestSuiteName = $_GET['setupTestSuite'];
-
-	if (
-		preg_match( '/[^a-zA-Z0-9_-]/', $setupTestSuiteName ) ||
-		!isset( $wgSeleniumTestConfigs[$setupTestSuiteName] )
-	)
-	{
-		return;
-	}
-	if ( strlen( $setupTestSuiteName ) > 0 ) {
-		$expire = time() + 600;
-		setcookie(
-			$cookieName,
-			$setupTestSuiteName,
-			$expire,
-			$wgCookiePath,
-			$wgCookieDomain,
-			$wgCookieSecure,
-			true
-		);
-	}
-
-	$testIncludes = array(); // array containing all the includes needed for this test
-	$testGlobalConfigs = array(); // an array containing all the global configs needed for this test
-	$testResourceFiles = array(); // an array containing all the resource files needed for this test
-	$callback = $wgSeleniumTestConfigs[$setupTestSuiteName];
-	call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
-
-	if ( isset( $testResourceFiles['images'] ) ) {
-		$testImageZip = $testResourceFiles['images'];
-	}
-
-	if ( isset( $testResourceFiles['db'] ) ) {
-		$testSqlFile = $testResourceFiles['db'];
-		$testResourceName = getTestResourceNameFromTestSuiteName( $setupTestSuiteName );
-
-		switchToTestResources( $testResourceName, false ); // false means do not switch database yet
-		setupTestResources( $testResourceName, $testSqlFile, $testImageZip );
-	}
-}
-
-// clear the cookie based on a request param
-if ( isset( $_GET['clearTestSuite'] ) ) {
-	$testSuiteName = getTestSuiteNameFromCookie( $cookieName );
-
-	$expire = time() - 600;
-	setcookie(
-		$cookieName,
-		'',
-		$expire,
-		$wgCookiePath,
-		$wgCookieDomain,
-		$wgCookieSecure,
-		true
-	);
-
-	$testResourceName = getTestResourceNameFromTestSuiteName( $testSuiteName );
-	teardownTestResources( $testResourceName );
-}
-
-// if a cookie is found, run the appropriate callback to get the config params.
-if ( isset( $_COOKIE[$cookieName] ) ) {
-	$testSuiteName = getTestSuiteNameFromCookie( $cookieName );
-	if ( !isset( $wgSeleniumTestConfigs[$testSuiteName] ) ) {
-		return;
-	}
-
-	$testIncludes = array(); // array containing all the includes needed for this test
-	$testGlobalConfigs = array(); // an array containing all the global configs needed for this test
-	$testResourceFiles = array(); // an array containing all the resource files needed for this test
-	$callback = $wgSeleniumTestConfigs[$testSuiteName];
-	call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
-
-	if ( isset( $testResourceFiles['db'] ) ) {
-		$testResourceName = getTestResourceNameFromTestSuiteName( $testSuiteName );
-		switchToTestResources( $testResourceName );
-	}
-	foreach ( $testIncludes as $includeFile ) {
-		$file = $IP . '/' . $includeFile;
-		require_once( $file );
-	}
-	foreach ( $testGlobalConfigs as $key => $value ) {
-		if ( is_array( $value ) ) {
-			$GLOBALS[$key] = array_merge( $GLOBALS[$key], $value );
-		} else {
-			$GLOBALS[$key] = $value;
-		}
-	}
-}
-
-wfProfileOut( $fname );
-
-function getTestSuiteNameFromCookie( $cookieName ) {
-	$testSuiteName = null;
-	if ( isset( $_COOKIE[$cookieName] ) ) {
-		$testSuiteName = $_COOKIE[$cookieName];
-	}
-	return $testSuiteName;
-}
-
-function getTestResourceNameFromTestSuiteName( $testSuiteName ) {
-	$testResourceName = null;
-	if ( isset( $testSuiteName ) ) {
-		$testResourceName = $testSuiteName;
-	}
-	return $testResourceName;
-}
-
-function getTestUploadPathFromResourceName( $testResourceName ) {
-	global $IP;
-	$testUploadPath = "$IP/images/$testResourceName";
-	return $testUploadPath;
-}
-
-function setupTestResources( $testResourceName, $testSqlFile, $testImageZip ) {
-	global $wgDBname;
-
-	// Basic security. Do not allow to drop productive database.
-	if ( $testResourceName == $wgDBname ) {
-		die( 'Cannot override productive database.' );
-	}
-	if ( $testResourceName == '' ) {
-		die( 'Cannot identify a test the resources should be installed for.' );
-	}
-
-	// create tables
-	$dbw = wfGetDB( DB_MASTER );
-	$dbw->query( 'DROP DATABASE IF EXISTS ' . $testResourceName );
-	$dbw->query( 'CREATE DATABASE ' . $testResourceName );
-
-	// do not set the new DB name before database is setup
-	$wgDBname = $testResourceName;
-	$dbw->selectDB( $testResourceName );
-	// populate from SQL file
-	if ( $testSqlFile ) {
-		$dbw->sourceFile( $testSqlFile );
-	}
-
-	// create test image dir
-	$testUploadPath = getTestUploadPathFromResourceName( $testResourceName );
-	if ( !file_exists( $testUploadPath ) ) {
-		mkdir( $testUploadPath );
-	}
-
-	if ( $testImageZip ) {
-		$zip = new ZipArchive();
-		$zip->open( $testImageZip );
-		$zip->extractTo( $testUploadPath );
-		$zip->close();
-	}
-}
-
-function teardownTestResources( $testResourceName ) {
-	// remove test database
-	$dbw = wfGetDB( DB_MASTER );
-	$dbw->query( 'DROP DATABASE IF EXISTS ' . $testResourceName );
-
-	$testUploadPath = getTestUploadPathFromResourceName( $testResourceName );
-	// remove test image dir
-	if ( file_exists( $testUploadPath ) ) {
-		wfRecursiveRemoveDir( $testUploadPath );
-	}
-}
-
-function switchToTestResources( $testResourceName, $switchDB = true ) {
-	global $wgDBuser, $wgDBpassword, $wgDBname;
-	global $wgDBtestuser, $wgDBtestpassword;
-	global $wgUploadPath;
-
-	if ( $switchDB ) {
-		$wgDBname = $testResourceName;
-	}
-	$wgDBuser = $wgDBtestuser;
-	$wgDBpassword = $wgDBtestpassword;
-
-	$testUploadPath = getTestUploadPathFromResourceName( $testResourceName );
-	$wgUploadPath = $testUploadPath;
-}
diff --git a/includes/Setup.php b/includes/Setup.php
index e87b200f..2e083d83 100644
--- a/includes/Setup.php
+++ b/includes/Setup.php
@@ -44,9 +44,12 @@ if ( !isset( $wgVersion ) ) {
 }
 
 // Set various default paths sensibly...
-if ( $wgScript === false ) $wgScript = "$wgScriptPath/index$wgScriptExtension";
-if ( $wgRedirectScript === false ) $wgRedirectScript = "$wgScriptPath/redirect$wgScriptExtension";
-if ( $wgLoadScript === false ) $wgLoadScript = "$wgScriptPath/load$wgScriptExtension";
+if ( $wgScript === false ) {
+	$wgScript = "$wgScriptPath/index$wgScriptExtension";
+}
+if ( $wgLoadScript === false ) {
+	$wgLoadScript = "$wgScriptPath/load$wgScriptExtension";
+}
 
 if ( $wgArticlePath === false ) {
 	if ( $wgUsePathInfo ) {
@@ -62,24 +65,38 @@ if ( !empty( $wgActionPaths ) && !isset( $wgActionPaths['view'] ) ) {
 	$wgActionPaths['view'] = $wgArticlePath;
 }
 
-if ( !empty( $wgActionPaths ) && !isset( $wgActionPaths['view'] ) ) {
-	# 'view' is assumed the default action path everywhere in the code
-	# but is rarely filled in $wgActionPaths
-	$wgActionPaths['view'] = $wgArticlePath;
+if ( $wgStylePath === false ) {
+	$wgStylePath = "$wgScriptPath/skins";
+}
+if ( $wgLocalStylePath === false ) {
+	$wgLocalStylePath = "$wgScriptPath/skins";
+}
+if ( $wgStyleDirectory === false ) {
+	$wgStyleDirectory = "$IP/skins";
+}
+if ( $wgExtensionAssetsPath === false ) {
+	$wgExtensionAssetsPath = "$wgScriptPath/extensions";
 }
 
-if ( $wgStylePath === false ) $wgStylePath = "$wgScriptPath/skins";
-if ( $wgLocalStylePath === false ) $wgLocalStylePath = "$wgScriptPath/skins";
-if ( $wgStyleDirectory === false ) $wgStyleDirectory = "$IP/skins";
-if ( $wgExtensionAssetsPath === false ) $wgExtensionAssetsPath = "$wgScriptPath/extensions";
-
-if ( $wgLogo === false ) $wgLogo = "$wgStylePath/common/images/wiki.png";
+if ( $wgLogo === false ) {
+	$wgLogo = "$wgStylePath/common/images/wiki.png";
+}
 
-if ( $wgUploadPath === false ) $wgUploadPath = "$wgScriptPath/images";
-if ( $wgUploadDirectory === false ) $wgUploadDirectory = "$IP/images";
-if ( $wgReadOnlyFile === false ) $wgReadOnlyFile = "{$wgUploadDirectory}/lock_yBgMBwiR";
-if ( $wgFileCacheDirectory === false ) $wgFileCacheDirectory = "{$wgUploadDirectory}/cache";
-if ( $wgDeletedDirectory === false ) $wgDeletedDirectory = "{$wgUploadDirectory}/deleted";
+if ( $wgUploadPath === false ) {
+	$wgUploadPath = "$wgScriptPath/images";
+}
+if ( $wgUploadDirectory === false ) {
+	$wgUploadDirectory = "$IP/images";
+}
+if ( $wgReadOnlyFile === false ) {
+	$wgReadOnlyFile = "{$wgUploadDirectory}/lock_yBgMBwiR";
+}
+if ( $wgFileCacheDirectory === false ) {
+	$wgFileCacheDirectory = "{$wgUploadDirectory}/cache";
+}
+if ( $wgDeletedDirectory === false ) {
+	$wgDeletedDirectory = "{$wgUploadDirectory}/deleted";
+}
 
 if ( isset( $wgFileStore['deleted']['directory'] ) ) {
 	$wgDeletedDirectory = $wgFileStore['deleted']['directory'];
@@ -130,13 +147,13 @@ $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
  * Initialise $wgLockManagers to include basic FS version
  */
 $wgLockManagers[] = array(
-	'name'          => 'fsLockManager',
-	'class'         => 'FSLockManager',
+	'name' => 'fsLockManager',
+	'class' => 'FSLockManager',
 	'lockDirectory' => "{$wgUploadDirectory}/lockdir",
 );
 $wgLockManagers[] = array(
-	'name'          => 'nullLockManager',
-	'class'         => 'NullLockManager',
+	'name' => 'nullLockManager',
+	'class' => 'NullLockManager',
 );
 
 /**
@@ -202,15 +219,15 @@ if ( $wgUseSharedUploads ) {
 }
 if ( $wgUseInstantCommons ) {
 	$wgForeignFileRepos[] = array(
-		'class'                  => 'ForeignAPIRepo',
-		'name'                   => 'wikimediacommons',
-		'apibase'                => WebRequest::detectProtocol() === 'https' ?
+		'class' => 'ForeignAPIRepo',
+		'name' => 'wikimediacommons',
+		'apibase' => WebRequest::detectProtocol() === 'https' ?
 			'https://commons.wikimedia.org/w/api.php' :
 			'http://commons.wikimedia.org/w/api.php',
-		'hashLevels'             => 2,
-		'fetchDescription'       => true,
+		'hashLevels' => 2,
+		'fetchDescription' => true,
 		'descriptionCacheExpiry' => 43200,
-		'apiThumbCacheExpiry'    => 86400,
+		'apiThumbCacheExpiry' => 86400,
 	);
 }
 /*
@@ -276,6 +293,13 @@ if ( $wgMetaNamespace === false ) {
 	$wgMetaNamespace = str_replace( ' ', '_', $wgSitename );
 }
 
+
+// Default value is either the suhosin limit or -1 for unlimited
+if ( $wgResourceLoaderMaxQueryLength === false ) {
+	$maxValueLength = ini_get( 'suhosin.get.max_value_length' );
+	$wgResourceLoaderMaxQueryLength = $maxValueLength > 0 ? $maxValueLength : -1;
+}
+
 /**
  * Definitions of the NS_ constants are in Defines.php
  * @private
@@ -301,7 +325,7 @@ $wgCanonicalNamespaceNames = array(
 );
 
 /// @todo UGLY UGLY
-if( is_array( $wgExtraNamespaces ) ) {
+if ( is_array( $wgExtraNamespaces ) ) {
 	$wgCanonicalNamespaceNames = $wgCanonicalNamespaceNames + $wgExtraNamespaces;
 }
 
@@ -323,11 +347,17 @@ if ( !$wgEnotifMinorEdits ) {
 }
 
 # $wgDisabledActions is deprecated as of 1.18
-foreach( $wgDisabledActions as $action ) {
+foreach ( $wgDisabledActions as $action ) {
 	$wgActions[$action] = false;
 }
 
-if ( !$wgHtml5Version && $wgHtml5 && $wgAllowRdfaAttributes ) {
+# We always output HTML5 since 1.22, overriding these is no longer supported
+# we set them here for extensions that depend on its value.
+$wgHtml5 = true;
+$wgXhtmlDefaultNamespace = 'http://www.w3.org/1999/xhtml';
+$wgJsMimeType = 'text/javascript';
+
+if ( !$wgHtml5Version && $wgAllowRdfaAttributes ) {
 	# see http://www.w3.org/TR/rdfa-in-html/#document-conformance
 	if ( $wgMimeType == 'application/xhtml+xml' ) {
 		$wgHtml5Version = 'XHTML+RDFa 1.0';
@@ -347,10 +377,6 @@ if ( $wgInvalidateCacheOnLocalSettingsChange ) {
 	$wgCacheEpoch = max( $wgCacheEpoch, gmdate( 'YmdHis', @filemtime( "$IP/LocalSettings.php" ) ) );
 }
 
-if ( $wgAjaxUploadDestCheck ) {
-	$wgAjaxExportList[] = 'SpecialUpload::ajaxGetExistsWarning';
-}
-
 if ( $wgNewUserLog ) {
 	# Add a new log type
 	$wgLogTypes[] = 'newusers';
@@ -367,6 +393,15 @@ if ( $wgCookieSecure === 'detect' ) {
 	$wgCookieSecure = ( WebRequest::detectProtocol() === 'https' );
 }
 
+if ( $wgRC2UDPAddress ) {
+	$wgRCFeeds['default'] = array(
+		'formatter' => 'IRCColourfulRCFeedFormatter',
+		'uri' => "udp://$wgRC2UDPAddress:$wgRC2UDPPort/$wgRC2UDPPrefix",
+		'add_interwiki_prefix' => &$wgRC2UDPInterwikiPrefix,
+		'omit_bots' => &$wgRC2UDPOmitBots,
+	);
+}
+
 // Disable MWDebug for command line mode, this prevents MWDebug from eating up
 // all the memory from logging SQL queries on maintenance scripts
 global $wgCommandLineMode;
@@ -374,22 +409,20 @@ if ( $wgDebugToolbar && !$wgCommandLineMode ) {
 	MWDebug::init();
 }
 
-if ( !defined( 'MW_COMPILED' ) ) {
-	if ( !MWInit::classExists( 'AutoLoader' ) ) {
-		require_once( "$IP/includes/AutoLoader.php" );
-	}
+if ( !class_exists( 'AutoLoader' ) ) {
+	require_once "$IP/includes/AutoLoader.php";
+}
 
-	wfProfileIn( $fname . '-exception' );
-	MWExceptionHandler::installHandler();
-	wfProfileOut( $fname . '-exception' );
+wfProfileIn( $fname . '-exception' );
+MWExceptionHandler::installHandler();
+wfProfileOut( $fname . '-exception' );
 
-	wfProfileIn( $fname . '-includes' );
-	require_once( "$IP/includes/normal/UtfNormalUtil.php" );
-	require_once( "$IP/includes/GlobalFunctions.php" );
-	require_once( "$IP/includes/ProxyTools.php" );
-	require_once( "$IP/includes/normal/UtfNormalDefines.php" );
-	wfProfileOut( $fname . '-includes' );
-}
+wfProfileIn( $fname . '-includes' );
+require_once "$IP/includes/normal/UtfNormalUtil.php";
+require_once "$IP/includes/GlobalFunctions.php";
+require_once "$IP/includes/ProxyTools.php";
+require_once "$IP/includes/normal/UtfNormalDefines.php";
+wfProfileOut( $fname . '-includes' );
 
 if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) {
 	$wgSecureLogin = false;
@@ -406,9 +439,16 @@ if ( $wgCanonicalServer === false ) {
 	$wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP );
 }
 
-// Initialize $wgHTCPMulticastRouting from backwards-compatible settings
-if ( !$wgHTCPMulticastRouting && $wgHTCPMulticastAddress ) {
-	$wgHTCPMulticastRouting = array(
+// $wgHTCPMulticastRouting got renamed to $wgHTCPRouting in MediaWiki 1.22
+// ensure back compatibility.
+if ( !$wgHTCPRouting && $wgHTCPMulticastRouting ) {
+	$wgHTCPRouting = $wgHTCPMulticastRouting;
+}
+
+// Initialize $wgHTCPRouting from backwards-compatible settings that
+// comes from pre 1.20 version.
+if ( !$wgHTCPRouting && $wgHTCPMulticastAddress ) {
+	$wgHTCPRouting = array(
 		'' => array(
 			'host' => $wgHTCPMulticastAddress,
 			'port' => $wgHTCPPort,
@@ -426,14 +466,14 @@ wfMemoryLimit();
  * that happens whenever you use a date function without the timezone being
  * explicitly set. Inspired by phpMyAdmin's treatment of the problem.
  */
-if ( is_null( $wgLocaltimezone) ) {
+if ( is_null( $wgLocaltimezone ) ) {
 	wfSuppressWarnings();
 	$wgLocaltimezone = date_default_timezone_get();
 	wfRestoreWarnings();
 }
 
 date_default_timezone_set( $wgLocaltimezone );
-if( is_null( $wgLocalTZoffset ) ) {
+if ( is_null( $wgLocalTZoffset ) ) {
 	$wgLocalTZoffset = date( 'Z' ) / 60;
 }
 
@@ -539,10 +579,11 @@ foreach ( $wgExtensionFunctions as $func ) {
 	if ( is_object( $func ) && $func instanceof Closure ) {
 		$profName = $fname . '-extensions-closure';
 	} elseif ( is_array( $func ) ) {
-		if ( is_object( $func[0] ) )
+		if ( is_object( $func[0] ) ) {
 			$profName = $fname . '-extensions-' . get_class( $func[0] ) . '::' . $func[1];
-		else
+		} else {
 			$profName = $fname . '-extensions-' . implode( '::', $func );
+		}
 	} else {
 		$profName = $fname . '-extensions-' . strval( $func );
 	}
diff --git a/includes/SiteConfiguration.php b/includes/SiteConfiguration.php
index bbc14a12..fa871fe0 100644
--- a/includes/SiteConfiguration.php
+++ b/includes/SiteConfiguration.php
@@ -191,11 +191,11 @@ class SiteConfiguration {
 	 */
 	protected function getSetting( $settingName, $wiki, /*array*/ $params ) {
 		$retval = null;
-		if( array_key_exists( $settingName, $this->settings ) ) {
+		if ( array_key_exists( $settingName, $this->settings ) ) {
 			$thisSetting =& $this->settings[$settingName];
 			do {
 				// Do individual wiki settings
-				if( array_key_exists( $wiki, $thisSetting ) ) {
+				if ( array_key_exists( $wiki, $thisSetting ) ) {
 					$retval = $thisSetting[$wiki];
 					break;
 				} elseif ( array_key_exists( "+$wiki", $thisSetting ) && is_array( $thisSetting["+$wiki"] ) ) {
@@ -203,16 +203,16 @@ class SiteConfiguration {
 				}
 
 				// Do tag settings
-				foreach( $params['tags'] as $tag ) {
-					if( array_key_exists( $tag, $thisSetting ) ) {
+				foreach ( $params['tags'] as $tag ) {
+					if ( array_key_exists( $tag, $thisSetting ) ) {
 						if ( isset( $retval ) && is_array( $retval ) && is_array( $thisSetting[$tag] ) ) {
 							$retval = self::arrayMerge( $retval, $thisSetting[$tag] );
 						} else {
 							$retval = $thisSetting[$tag];
 						}
 						break 2;
-					} elseif( array_key_exists( "+$tag", $thisSetting ) && is_array( $thisSetting["+$tag"] ) ) {
-						if( !isset( $retval ) ) {
+					} elseif ( array_key_exists( "+$tag", $thisSetting ) && is_array( $thisSetting["+$tag"] ) ) {
+						if ( !isset( $retval ) ) {
 							$retval = array();
 						}
 						$retval = self::arrayMerge( $retval, $thisSetting["+$tag"] );
@@ -220,15 +220,15 @@ class SiteConfiguration {
 				}
 				// Do suffix settings
 				$suffix = $params['suffix'];
-				if( !is_null( $suffix ) ) {
-					if( array_key_exists( $suffix, $thisSetting ) ) {
+				if ( !is_null( $suffix ) ) {
+					if ( array_key_exists( $suffix, $thisSetting ) ) {
 						if ( isset( $retval ) && is_array( $retval ) && is_array( $thisSetting[$suffix] ) ) {
 							$retval = self::arrayMerge( $retval, $thisSetting[$suffix] );
 						} else {
 							$retval = $thisSetting[$suffix];
 						}
 						break;
-					} elseif ( array_key_exists( "+$suffix", $thisSetting ) && is_array($thisSetting["+$suffix"]) ) {
+					} elseif ( array_key_exists( "+$suffix", $thisSetting ) && is_array( $thisSetting["+$suffix"] ) ) {
 						if ( !isset( $retval ) ) {
 							$retval = array();
 						}
@@ -237,8 +237,8 @@ class SiteConfiguration {
 				}
 
 				// Fall back to default.
-				if( array_key_exists( 'default', $thisSetting ) ) {
-					if( is_array( $retval ) && is_array( $thisSetting['default'] ) ) {
+				if ( array_key_exists( 'default', $thisSetting ) ) {
+					if ( is_array( $retval ) && is_array( $thisSetting['default'] ) ) {
 						$retval = self::arrayMerge( $retval, $thisSetting['default'] );
 					} else {
 						$retval = $thisSetting['default'];
@@ -248,7 +248,7 @@ class SiteConfiguration {
 			} while ( false );
 		}
 
-		if( !is_null( $retval ) && count( $params['params'] ) ) {
+		if ( !is_null( $retval ) && count( $params['params'] ) ) {
 			foreach ( $params['params'] as $key => $value ) {
 				$retval = $this->doReplace( '$' . $key, $value, $retval );
 			}
@@ -266,10 +266,10 @@ class SiteConfiguration {
 	 * @return string
 	 */
 	function doReplace( $from, $to, $in ) {
-		if( is_string( $in ) ) {
+		if ( is_string( $in ) ) {
 			return str_replace( $from, $to, $in );
-		} elseif( is_array( $in ) ) {
-			foreach( $in as $key => $val ) {
+		} elseif ( is_array( $in ) ) {
+			foreach ( $in as $key => $val ) {
 				$in[$key] = $this->doReplace( $from, $to, $val );
 			}
 			return $in;
@@ -289,7 +289,7 @@ class SiteConfiguration {
 	public function getAll( $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
 		$params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
 		$localSettings = array();
-		foreach( $this->settings as $varname => $stuff ) {
+		foreach ( $this->settings as $varname => $stuff ) {
 			$append = false;
 			$var = $varname;
 			if ( substr( $varname, 0, 1 ) == '+' ) {
@@ -317,7 +317,7 @@ class SiteConfiguration {
 	 * @return bool The value of the setting requested.
 	 */
 	public function getBool( $setting, $wiki, $suffix = null, $wikiTags = array() ) {
-		return (bool)($this->get( $setting, $wiki, $suffix, array(), $wikiTags ) );
+		return (bool)$this->get( $setting, $wiki, $suffix, array(), $wikiTags );
 	}
 
 	/**
@@ -409,18 +409,18 @@ class SiteConfiguration {
 			'params' => array(),
 		);
 
-		if( !is_callable( $this->siteParamsCallback ) ) {
+		if ( !is_callable( $this->siteParamsCallback ) ) {
 			return $default;
 		}
 
 		$ret = call_user_func_array( $this->siteParamsCallback, array( $this, $wiki ) );
 		# Validate the returned value
-		if( !is_array( $ret ) ) {
+		if ( !is_array( $ret ) ) {
 			return $default;
 		}
 
-		foreach( $default as $name => $def ) {
-			if( !isset( $ret[$name] ) || ( is_array( $default[$name] ) && !is_array( $ret[$name] ) ) ) {
+		foreach ( $default as $name => $def ) {
+			if ( !isset( $ret[$name] ) || ( is_array( $default[$name] ) && !is_array( $ret[$name] ) ) ) {
 				$ret[$name] = $default[$name];
 			}
 		}
@@ -443,7 +443,7 @@ class SiteConfiguration {
 	protected function mergeParams( $wiki, $suffix, /*array*/ $params, /*array*/ $wikiTags ) {
 		$ret = $this->getWikiParams( $wiki );
 
-		if( is_null( $ret['suffix'] ) ) {
+		if ( is_null( $ret['suffix'] ) ) {
 			$ret['suffix'] = $suffix;
 		}
 
@@ -452,10 +452,10 @@ class SiteConfiguration {
 		$ret['params'] += $params;
 
 		// Automatically fill that ones if needed
-		if( !isset( $ret['params']['lang'] ) && !is_null( $ret['lang'] ) ) {
+		if ( !isset( $ret['params']['lang'] ) && !is_null( $ret['lang'] ) ) {
 			$ret['params']['lang'] = $ret['lang'];
 		}
-		if( !isset( $ret['params']['site'] ) && !is_null( $ret['suffix'] ) ) {
+		if ( !isset( $ret['params']['site'] ) && !is_null( $ret['suffix'] ) ) {
 			$ret['params']['site'] = $ret['suffix'];
 		}
 
@@ -471,19 +471,19 @@ class SiteConfiguration {
 	public function siteFromDB( $db ) {
 		// Allow override
 		$def = $this->getWikiParams( $db );
-		if( !is_null( $def['suffix'] ) && !is_null( $def['lang'] ) ) {
+		if ( !is_null( $def['suffix'] ) && !is_null( $def['lang'] ) ) {
 			return array( $def['suffix'], $def['lang'] );
 		}
 
 		$site = null;
 		$lang = null;
-		foreach ( $this->suffixes as $suffix ) {
+		foreach ( $this->suffixes as $altSite => $suffix ) {
 			if ( $suffix === '' ) {
 				$site = '';
 				$lang = $db;
 				break;
 			} elseif ( substr( $db, -strlen( $suffix ) ) == $suffix ) {
-				$site = $suffix == 'wiki' ? 'wikipedia' : $suffix;
+				$site = is_numeric( $altSite ) ? $suffix : $altSite;
 				$lang = substr( $db, 0, strlen( $db ) - strlen( $suffix ) );
 				break;
 			}
@@ -574,8 +574,8 @@ class SiteConfiguration {
 	 */
 	static function arrayMerge( $array1/* ... */ ) {
 		$out = $array1;
-		for( $i = 1; $i < func_num_args(); $i++ ) {
-			foreach( func_get_arg( $i ) as $key => $value ) {
+		for ( $i = 1; $i < func_num_args(); $i++ ) {
+			foreach ( func_get_arg( $i ) as $key => $value ) {
 				if ( isset( $out[$key] ) && is_array( $out[$key] ) && is_array( $value ) ) {
 					$out[$key] = self::arrayMerge( $out[$key], $value );
 				} elseif ( !isset( $out[$key] ) || !$out[$key] && !is_numeric( $key ) ) {
diff --git a/includes/SiteStats.php b/includes/SiteStats.php
index b7be29d6..355993c6 100644
--- a/includes/SiteStats.php
+++ b/includes/SiteStats.php
@@ -61,13 +61,13 @@ class SiteStats {
 		wfDebug( __METHOD__ . ": reading site_stats from slave\n" );
 		$row = self::doLoad( wfGetDB( DB_SLAVE ) );
 
-		if( !self::isSane( $row ) ) {
+		if ( !self::isSane( $row ) ) {
 			// Might have just been initialized during this request? Underflow?
 			wfDebug( __METHOD__ . ": site_stats damaged or missing on slave\n" );
 			$row = self::doLoad( wfGetDB( DB_MASTER ) );
 		}
 
-		if( !self::isSane( $row ) ) {
+		if ( !self::isSane( $row ) ) {
 			// Normally the site_stats table is initialized at install time.
 			// Some manual construction scenarios may leave the table empty or
 			// broken, however, for instance when importing from a dump into a
@@ -79,7 +79,7 @@ class SiteStats {
 			$row = self::doLoad( wfGetDB( DB_MASTER ) );
 		}
 
-		if( !self::isSane( $row ) ) {
+		if ( !self::isSane( $row ) ) {
 			wfDebug( __METHOD__ . ": site_stats persistently nonsensical o_O\n" );
 		}
 		return $row;
@@ -189,7 +189,7 @@ class SiteStats {
 	static function jobs() {
 		if ( !isset( self::$jobs ) ) {
 			$dbr = wfGetDB( DB_SLAVE );
-			self::$jobs = $dbr->estimateRowCount( 'job' );
+			self::$jobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
 			/* Zero rows still do single row read for row that doesn't exist, but people are annoyed by that */
 			if ( self::$jobs == 1 ) {
 				self::$jobs = 0;
@@ -205,7 +205,7 @@ class SiteStats {
 	 */
 	static function pagesInNs( $ns ) {
 		wfProfileIn( __METHOD__ );
-		if( !isset( self::$pageCount[$ns] ) ) {
+		if ( !isset( self::$pageCount[$ns] ) ) {
 			$dbr = wfGetDB( DB_SLAVE );
 			self::$pageCount[$ns] = (int)$dbr->selectField(
 				'page',
@@ -226,20 +226,24 @@ class SiteStats {
 	 * @return bool
 	 */
 	private static function isSane( $row ) {
-		if(
-			$row === false
+		if ( $row === false
 			|| $row->ss_total_pages < $row->ss_good_articles
 			|| $row->ss_total_edits < $row->ss_total_pages
+			|| $row->ss_users < $row->ss_active_users
 		) {
 			return false;
 		}
 		// Now check for underflow/overflow
-		foreach( array( 'total_views', 'total_edits', 'good_articles',
-		'total_pages', 'users', 'images' ) as $member ) {
-			if(
-				$row->{"ss_$member"} > 2000000000
-				|| $row->{"ss_$member"} < 0
-			) {
+		foreach ( array(
+			'ss_total_views',
+			'ss_total_edits',
+			'ss_good_articles',
+			'ss_total_pages',
+			'ss_users',
+			'ss_active_users',
+			'ss_images',
+		) as $member ) {
+			if ( $row->$member > 2000000000 || $row->$member < 0 ) {
 				return false;
 			}
 		}
@@ -258,7 +262,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
 	protected $users = 0;
 	protected $images = 0;
 
-	// @TODO: deprecate this constructor
+	// @todo deprecate this constructor
 	function __construct( $views, $edits, $good, $pages = 0, $users = 0 ) {
 		$this->views = $views;
 		$this->edits = $edits;
@@ -293,50 +297,56 @@ class SiteStatsUpdate implements DeferrableUpdate {
 		if ( $rate && ( $rate < 0 || mt_rand( 0, $rate - 1 ) != 0 ) ) {
 			$this->doUpdatePendingDeltas();
 		} else {
-			$dbw = wfGetDB( DB_MASTER );
-
-			$lockKey = wfMemcKey( 'site_stats' ); // prepend wiki ID
-			if ( $rate ) {
-				// Lock the table so we don't have double DB/memcached updates
-				if ( !$dbw->lockIsFree( $lockKey, __METHOD__ )
-					|| !$dbw->lock( $lockKey, __METHOD__, 1 ) // 1 sec timeout
-				) {
-					$this->doUpdatePendingDeltas();
-					return;
-				}
-				$pd = $this->getPendingDeltas();
-				// Piggy-back the async deltas onto those of this stats update....
-				$this->views    += ( $pd['ss_total_views']['+'] - $pd['ss_total_views']['-'] );
-				$this->edits    += ( $pd['ss_total_edits']['+'] - $pd['ss_total_edits']['-'] );
-				$this->articles += ( $pd['ss_good_articles']['+'] - $pd['ss_good_articles']['-'] );
-				$this->pages    += ( $pd['ss_total_pages']['+'] - $pd['ss_total_pages']['-'] );
-				$this->users    += ( $pd['ss_users']['+'] - $pd['ss_users']['-'] );
-				$this->images   += ( $pd['ss_images']['+'] - $pd['ss_images']['-'] );
-			}
-
 			// Need a separate transaction because this a global lock
-			$dbw->begin( __METHOD__ );
-
-			// Build up an SQL query of deltas and apply them...
-			$updates = '';
-			$this->appendUpdate( $updates, 'ss_total_views', $this->views );
-			$this->appendUpdate( $updates, 'ss_total_edits', $this->edits );
-			$this->appendUpdate( $updates, 'ss_good_articles', $this->articles );
-			$this->appendUpdate( $updates, 'ss_total_pages', $this->pages );
-			$this->appendUpdate( $updates, 'ss_users', $this->users );
-			$this->appendUpdate( $updates, 'ss_images', $this->images );
-			if ( $updates != '' ) {
-				$dbw->update( 'site_stats', array( $updates ), array(), __METHOD__ );
-			}
+			wfGetDB( DB_MASTER )->onTransactionIdle( array( $this, 'tryDBUpdateInternal' ) );
+		}
+	}
 
-			if ( $rate ) {
-				// Decrement the async deltas now that we applied them
-				$this->removePendingDeltas( $pd );
-				// Commit the updates and unlock the table
-				$dbw->unlock( $lockKey, __METHOD__ );
+	/**
+	 * Do not call this outside of SiteStatsUpdate
+	 *
+	 * @return void
+	 */
+	public function tryDBUpdateInternal() {
+		global $wgSiteStatsAsyncFactor;
+
+		$dbw = wfGetDB( DB_MASTER );
+		$lockKey = wfMemcKey( 'site_stats' ); // prepend wiki ID
+		if ( $wgSiteStatsAsyncFactor ) {
+			// Lock the table so we don't have double DB/memcached updates
+			if ( !$dbw->lockIsFree( $lockKey, __METHOD__ )
+				|| !$dbw->lock( $lockKey, __METHOD__, 1 ) // 1 sec timeout
+			) {
+				$this->doUpdatePendingDeltas();
+				return;
 			}
+			$pd = $this->getPendingDeltas();
+			// Piggy-back the async deltas onto those of this stats update....
+			$this->views += ( $pd['ss_total_views']['+'] - $pd['ss_total_views']['-'] );
+			$this->edits += ( $pd['ss_total_edits']['+'] - $pd['ss_total_edits']['-'] );
+			$this->articles += ( $pd['ss_good_articles']['+'] - $pd['ss_good_articles']['-'] );
+			$this->pages += ( $pd['ss_total_pages']['+'] - $pd['ss_total_pages']['-'] );
+			$this->users += ( $pd['ss_users']['+'] - $pd['ss_users']['-'] );
+			$this->images += ( $pd['ss_images']['+'] - $pd['ss_images']['-'] );
+		}
+
+		// Build up an SQL query of deltas and apply them...
+		$updates = '';
+		$this->appendUpdate( $updates, 'ss_total_views', $this->views );
+		$this->appendUpdate( $updates, 'ss_total_edits', $this->edits );
+		$this->appendUpdate( $updates, 'ss_good_articles', $this->articles );
+		$this->appendUpdate( $updates, 'ss_total_pages', $this->pages );
+		$this->appendUpdate( $updates, 'ss_users', $this->users );
+		$this->appendUpdate( $updates, 'ss_images', $this->images );
+		if ( $updates != '' ) {
+			$dbw->update( 'site_stats', array( $updates ), array(), __METHOD__ );
+		}
 
-			$dbw->commit( __METHOD__ );
+		if ( $wgSiteStatsAsyncFactor ) {
+			// Decrement the async deltas now that we applied them
+			$this->removePendingDeltas( $pd );
+			// Commit the updates and unlock the table
+			$dbw->unlock( $lockKey, __METHOD__ );
 		}
 	}
 
@@ -356,7 +366,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
 				'rc_user != 0',
 				'rc_bot' => 0,
 				'rc_log_type != ' . $dbr->addQuotes( 'newusers' ) . ' OR rc_log_type IS NULL',
-				'rc_timestamp >= ' . $dbr->addQuotes( $dbr->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays*24*3600 ) ),
+				'rc_timestamp >= ' . $dbr->addQuotes( $dbr->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays * 24 * 3600 ) ),
 			),
 			__METHOD__
 		);
@@ -592,19 +602,19 @@ class SiteStatsInit {
 		$counter->files();
 
 		// Only do views if we don't want to not count them
-		if( $options['views'] ) {
+		if ( $options['views'] ) {
 			$counter->views();
 		}
 
 		// Update/refresh
-		if( $options['update'] ) {
+		if ( $options['update'] ) {
 			$counter->update();
 		} else {
 			$counter->refresh();
 		}
 
 		// Count active users if need be
-		if( $options['activeUsers'] ) {
+		if ( $options['activeUsers'] ) {
 			SiteStatsUpdate::cacheUpdate( wfGetDB( DB_MASTER ) );
 		}
 	}
diff --git a/includes/Skin.php b/includes/Skin.php
index 0cc1086c..5801806c 100644
--- a/includes/Skin.php
+++ b/includes/Skin.php
@@ -25,7 +25,7 @@
  */
 
 /**
- * The main skin class that provide methods and properties for all other skins.
+ * The main skin class which provides methods and properties for all other skins.
  * This base class is also the "Standard" skin.
  *
  * See docs/skin.txt for more information.
@@ -56,17 +56,19 @@ abstract class Skin extends ContextSource {
 
 			$skinDir = dir( $wgStyleDirectory );
 
-			# while code from www.php.net
-			while ( false !== ( $file = $skinDir->read() ) ) {
-				// Skip non-PHP files, hidden files, and '.dep' includes
-				$matches = array();
+			if ( $skinDir !== false && $skinDir !== null ) {
+				# while code from www.php.net
+				while ( false !== ( $file = $skinDir->read() ) ) {
+					// Skip non-PHP files, hidden files, and '.dep' includes
+					$matches = array();
 
-				if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
-					$aSkin = $matches[1];
-					$wgValidSkinNames[strtolower( $aSkin )] = $aSkin;
+					if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
+						$aSkin = $matches[1];
+						$wgValidSkinNames[strtolower( $aSkin )] = $aSkin;
+					}
 				}
+				$skinDir->close();
 			}
-			$skinDir->close();
 			$skinsInitialised = true;
 			wfProfileOut( __METHOD__ . '-init' );
 		}
@@ -79,14 +81,15 @@ abstract class Skin extends ContextSource {
 	 */
 	static function getSkinNameMessages() {
 		$messages = array();
-		foreach( self::getSkinNames() as $skinKey => $skinName ) {
+		foreach ( self::getSkinNames() as $skinKey => $skinName ) {
+			// Messages: skinname-cologneblue, skinname-monobook, skinname-modern, skinname-vector
 			$messages[] = "skinname-$skinKey";
 		}
 		return $messages;
 	}
 
 	/**
-	 * Fetch the list of usable skins in regards to $wgSkipSkins.
+	 * Fetch the list of user-selectable skins in regards to $wgSkipSkins.
 	 * Useful for Special:Preferences and other places where you
 	 * only want to show skins users _can_ use.
 	 * @return array of strings
@@ -94,13 +97,13 @@ abstract class Skin extends ContextSource {
 	public static function getUsableSkins() {
 		global $wgSkipSkins;
 
-		$usableSkins = self::getSkinNames();
+		$allowedSkins = self::getSkinNames();
 
 		foreach ( $wgSkipSkins as $skip ) {
-			unset( $usableSkins[$skip] );
+			unset( $allowedSkins[$skip] );
 		}
 
-		return $usableSkins;
+		return $allowedSkins;
 	}
 
 	/**
@@ -129,7 +132,6 @@ abstract class Skin extends ContextSource {
 		// in the user preferences.
 		$fallback = array(
 			0 => $wgDefaultSkin,
-			1 => 'nostalgia',
 			2 => 'cologneblue'
 		);
 
@@ -161,23 +163,19 @@ abstract class Skin extends ContextSource {
 		$className = "Skin{$skinName}";
 
 		# Grab the skin class and initialise it.
-		if ( !MWInit::classExists( $className ) ) {
+		if ( !class_exists( $className ) ) {
 
-			if ( !defined( 'MW_COMPILED' ) ) {
-				require_once( "{$wgStyleDirectory}/{$skinName}.php" );
-			}
+			require_once "{$wgStyleDirectory}/{$skinName}.php";
 
 			# Check if we got if not fallback to default skin
-			if ( !MWInit::classExists( $className ) ) {
+			if ( !class_exists( $className ) ) {
 				# DO NOT die if the class isn't found. This breaks maintenance
 				# scripts and can cause a user account to be unrecoverable
 				# except by SQL manipulation if a previously valid skin name
 				# is no longer valid.
 				wfDebug( "Skin class does not exist: $className\n" );
 				$className = 'SkinVector';
-				if ( !defined( 'MW_COMPILED' ) ) {
-					require_once( "{$wgStyleDirectory}/Vector.php" );
-				}
+				require_once "{$wgStyleDirectory}/Vector.php";
 			}
 		}
 		$skin = new $className( $key );
@@ -200,6 +198,68 @@ abstract class Skin extends ContextSource {
 		wfProfileOut( __METHOD__ );
 	}
 
+	/**
+	 * Defines the ResourceLoader modules that should be added to the skin
+	 * It is recommended that skins wishing to override call parent::getDefaultModules()
+	 * and substitute out any modules they wish to change by using a key to look them up
+	 * @return Array of modules with helper keys for easy overriding
+	 */
+	public function getDefaultModules() {
+		global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax,
+			$wgAjaxWatch, $wgEnableAPI, $wgEnableWriteAPI;
+
+		$out = $this->getOutput();
+		$user = $out->getUser();
+		$modules = array(
+			// modules that enhance the page content in some way
+			'content' => array(
+				'mediawiki.page.ready',
+			),
+			// modules that exist for legacy reasons
+			'legacy' => array(),
+			// modules relating to search functionality
+			'search' => array(),
+			// modules relating to functionality relating to watching an article
+			'watch' => array(),
+			// modules which relate to the current users preferences
+			'user' => array(),
+		);
+		if ( $wgIncludeLegacyJavaScript ) {
+			$modules['legacy'][] = 'mediawiki.legacy.wikibits';
+		}
+
+		if ( $wgPreloadJavaScriptMwUtil ) {
+			$modules['legacy'][] = 'mediawiki.util';
+		}
+
+		// Add various resources if required
+		if ( $wgUseAjax ) {
+			$modules['legacy'][] = 'mediawiki.legacy.ajax';
+
+			if ( $wgEnableAPI ) {
+				if ( $wgEnableWriteAPI && $wgAjaxWatch && $user->isLoggedIn()
+					&& $user->isAllowed( 'writeapi' )
+				) {
+					$modules['watch'][] = 'mediawiki.page.watch.ajax';
+				}
+
+				if ( !$user->getOption( 'disablesuggest', false ) ) {
+					$modules['search'][] = 'mediawiki.searchSuggest';
+				}
+			}
+		}
+
+		if ( $user->getBoolOption( 'editsectiononrightclick' ) ) {
+			$modules['user'][] = 'mediawiki.action.view.rightClickEdit';
+		}
+
+		// Crazy edit-on-double-click stuff
+		if ( $out->isArticle() && $user->getOption( 'editondblclick' ) ) {
+			$modules['user'][] = 'mediawiki.action.view.dblClickEdit';
+		}
+		return $modules;
+	}
+
 	/**
 	 * Preload the existence of three commonly-requested pages in a single query
 	 */
@@ -290,7 +350,7 @@ abstract class Skin extends ContextSource {
 			return $this->mRelevantUser;
 		}
 		$title = $this->getRelevantTitle();
-		if( $title->hasSubjectNamespace( NS_USER ) ) {
+		if ( $title->hasSubjectNamespace( NS_USER ) ) {
 			$rootUser = $title->getRootText();
 			if ( User::isIP( $rootUser ) ) {
 				$this->mRelevantUser = User::newFromName( $rootUser, false );
@@ -667,7 +727,7 @@ abstract class Skin extends ContextSource {
 
 						if ( $c > 1 ) {
 							$subpages .= $wgLang->getDirMarkEntity() . $this->msg( 'pipe-separator' )->escaped();
-						} else  {
+						} else {
 							$subpages .= '&lt; ';
 						}
 
@@ -1014,7 +1074,7 @@ abstract class Skin extends ContextSource {
 	 */
 	static function makeSpecialUrl( $name, $urlaction = '', $proto = null ) {
 		$title = SpecialPage::getSafeTitleFor( $name );
-		if( is_null( $proto ) ) {
+		if ( is_null( $proto ) ) {
 			return $title->getLocalURL( $urlaction );
 		} else {
 			return $title->getFullURL( $urlaction, false, $proto );
@@ -1252,7 +1312,7 @@ abstract class Skin extends ContextSource {
 						}
 
 						global $wgExternalLinkTarget;
-						if ( $wgExternalLinkTarget) {
+						if ( $wgExternalLinkTarget ) {
 							$extraAttribs['target'] = $wgExternalLinkTarget;
 						}
 					} else {
@@ -1282,28 +1342,43 @@ abstract class Skin extends ContextSource {
 	}
 
 	/**
-	 * Should we load mediawiki.legacy.wikiprintable?  Skins that have their own
-	 * print stylesheet should override this and return false.  (This is an
-	 * ugly hack to get Monobook to play nicely with OutputPage::headElement().)
+	 * This function previously controlled whether the 'mediawiki.legacy.wikiprintable' module
+	 * should be loaded by OutputPage. That module no longer exists and the return value of this
+	 * method is ignored.
 	 *
+	 * If your skin doesn't provide its own print styles, the 'mediawiki.legacy.commonPrint' module
+	 * can be used instead (SkinTemplate-based skins do it automatically).
+	 *
+	 * @deprecated since 1.22
 	 * @return bool
 	 */
 	public function commonPrintStylesheet() {
-		return true;
+		wfDeprecated( __METHOD__, '1.22' );
+		return false;
 	}
 
 	/**
-	 * Gets new talk page messages for the current user.
-	 * @return MediaWiki message or if no new talk page messages, nothing
+	 * Gets new talk page messages for the current user and returns an
+	 * appropriate alert message (or an empty string if there are no messages)
+	 * @return String
 	 */
 	function getNewtalks() {
+
+		$newMessagesAlert = '';
+		$user = $this->getUser();
+		$newtalks = $user->getNewMessageLinks();
 		$out = $this->getOutput();
 
-		$newtalks = $this->getUser()->getNewMessageLinks();
-		$ntl = '';
+		// Allow extensions to disable or modify the new messages alert
+		if ( !wfRunHooks( 'GetNewMessagesAlert', array( &$newMessagesAlert, $newtalks, $user, $out ) ) ) {
+			return '';
+		}
+		if ( $newMessagesAlert ) {
+			return $newMessagesAlert;
+		}
 
 		if ( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) {
-			$uTalkTitle = $this->getUser()->getTalkPage();
+			$uTalkTitle = $user->getTalkPage();
 
 			if ( !$uTalkTitle->equals( $out->getTitle() ) ) {
 				$lastSeenRev = isset( $newtalks[0]['rev'] ) ? $newtalks[0]['rev'] : null;
@@ -1342,26 +1417,25 @@ abstract class Skin extends ContextSource {
 				);
 
 				if ( $nofAuthors >= 1 && $nofAuthors <= 10 ) {
-					$ntl = $this->msg(
+					$newMessagesAlert = $this->msg(
 						'youhavenewmessagesfromusers',
 						$newMessagesLink,
 						$newMessagesDiffLink
 					)->numParams( $nofAuthors );
 				} else {
 					// $nofAuthors === 11 signifies "11 or more" ("more than 10")
-					$ntl = $this->msg(
+					$newMessagesAlert = $this->msg(
 						$nofAuthors > 10 ? 'youhavenewmessagesmanyusers' : 'youhavenewmessages',
 						$newMessagesLink,
 						$newMessagesDiffLink
 					);
 				}
-				$ntl = $ntl->text();
+				$newMessagesAlert = $newMessagesAlert->text();
 				# Disable Squid cache
 				$out->setSquidMaxage( 0 );
 			}
 		} elseif ( count( $newtalks ) ) {
-			// _>" " for BC <= 1.16
-			$sep = str_replace( '_', ' ', $this->msg( 'newtalkseparator' )->escaped() );
+			$sep = $this->msg( 'newtalkseparator' )->escaped();
 			$msgs = array();
 
 			foreach ( $newtalks as $newtalk ) {
@@ -1371,11 +1445,11 @@ abstract class Skin extends ContextSource {
 				);
 			}
 			$parts = implode( $sep, $msgs );
-			$ntl = $this->msg( 'youhavenewmessagesmulti' )->rawParams( $parts )->escaped();
+			$newMessagesAlert = $this->msg( 'youhavenewmessagesmulti' )->rawParams( $parts )->escaped();
 			$out->setSquidMaxage( 0 );
 		}
 
-		return $ntl;
+		return $newMessagesAlert;
 	}
 
 	/**
@@ -1391,17 +1465,17 @@ abstract class Skin extends ContextSource {
 
 		$needParse = false;
 
-		if( $name === 'default' ) {
+		if ( $name === 'default' ) {
 			// special case
 			global $wgSiteNotice;
 			$notice = $wgSiteNotice;
-			if( empty( $notice ) ) {
+			if ( empty( $notice ) ) {
 				wfProfileOut( __METHOD__ );
 				return false;
 			}
 		} else {
 			$msg = $this->msg( $name )->inContentLanguage();
-			if( $msg->isDisabled() ) {
+			if ( $msg->isDisabled() ) {
 				wfProfileOut( __METHOD__ );
 				return false;
 			}
@@ -1411,8 +1485,8 @@ abstract class Skin extends ContextSource {
 		// Use the extra hash appender to let eg SSL variants separately cache.
 		$key = wfMemcKey( $name . $wgRenderHashAppend );
 		$cachedNotice = $parserMemc->get( $key );
-		if( is_array( $cachedNotice ) ) {
-			if( md5( $notice ) == $cachedNotice['hash'] ) {
+		if ( is_array( $cachedNotice ) ) {
+			if ( md5( $notice ) == $cachedNotice['hash'] ) {
 				$notice = $cachedNotice['html'];
 			} else {
 				$needParse = true;
@@ -1515,31 +1589,12 @@ abstract class Skin extends ContextSource {
 			array( 'noclasses', 'known' )
 		);
 
-		# Run the old hook.  This takes up half of the function . . . hopefully
-		# we can rid of it someday.
-		$attribs = '';
-		if ( $tooltip ) {
-			$attribs = wfMessage( 'editsectionhint' )->rawParams( $tooltip )
-				->inLanguage( $lang )->escaped();
-			$attribs = " title=\"$attribs\"";
-		}
-		$result = null;
-		wfRunHooks( 'EditSectionLink', array( &$this, $nt, $section, $attribs, $link, &$result, $lang ) );
-		if ( !is_null( $result ) ) {
-			# For reverse compatibility, add the brackets *after* the hook is
-			# run, and even add them to hook-provided text.  (This is the main
-			# reason that the EditSectionLink hook is deprecated in favor of
-			# DoEditSectionLink: it can't change the brackets or the span.)
-			$result = wfMessage( 'editsection-brackets' )->rawParams( $result )
-				->inLanguage( $lang )->escaped();
-			return "<span class=\"editsection\">$result</span>";
-		}
-
-		# Add the brackets and the span, and *then* run the nice new hook, with
-		# clean and non-redundant arguments.
-		$result = wfMessage( 'editsection-brackets' )->rawParams( $link )
-			->inLanguage( $lang )->escaped();
-		$result = "<span class=\"editsection\">$result</span>";
+		# Add the brackets and the span and run the hook.
+		$result = '<span class="mw-editsection">'
+			. '<span class="mw-editsection-bracket">[</span>'
+			. $link
+			. '<span class="mw-editsection-bracket">]</span>'
+			. '</span>';
 
 		wfRunHooks( 'DoEditSectionLink', array( $this, $nt, $section, $tooltip, &$result, $lang ) );
 		return $result;
@@ -1557,6 +1612,7 @@ abstract class Skin extends ContextSource {
 	function __call( $fname, $args ) {
 		$realFunction = array( 'Linker', $fname );
 		if ( is_callable( $realFunction ) ) {
+			wfDeprecated( get_class( $this ) . '::' . $fname, '1.21' );
 			return call_user_func_array( $realFunction, $args );
 		} else {
 			$className = get_class( $this );
diff --git a/includes/SkinLegacy.php b/includes/SkinLegacy.php
deleted file mode 100644
index b9766a9f..00000000
--- a/includes/SkinLegacy.php
+++ /dev/null
@@ -1,882 +0,0 @@
-<?php
-/**
- * Base class for legacy skins.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-class SkinLegacy extends SkinTemplate {
-	var $useHeadElement = true;
-	protected $mWatchLinkNum = 0; // Appended to end of watch link id's
-
-	/**
-	 * Add skin specific stylesheets
-	 * @param $out OutputPage
-	 */
-	function setupSkinUserCss( OutputPage $out ) {
-		$out->addModuleStyles( 'mediawiki.legacy.shared' );
-		$out->addModuleStyles( 'mediawiki.legacy.oldshared' );
-	}
-
-	public function commonPrintStylesheet() {
-		return true;
-	}
-
-	/**
-	 * This was for the old skins and for users with 640x480 screen.
-	 * Please note old skins are still used and might prove useful for
-	 * users having old computers or visually impaired.
-	 */
-	var $mSuppressQuickbar = false;
-
-	/**
-	 * Suppress the quickbar from the output, only for skin supporting
-	 * the quickbar
-	 */
-	public function suppressQuickbar() {
-		$this->mSuppressQuickbar = true;
-	}
-
-	/**
-	 * Return whether the quickbar should be suppressed from the output
-	 *
-	 * @return Boolean
-	 */
-	public function isQuickbarSuppressed() {
-		return $this->mSuppressQuickbar;
-	}
-
-	function qbSetting() {
-		global $wgUser;
-		if ( $this->isQuickbarSuppressed() ) {
-			return 0;
-		}
-		$q = $wgUser->getOption( 'quickbar', 0 );
-		if( $q == 5 ) {
-			# 5 is the default, which chooses the setting
-			# depending on the directionality of your interface language
-			global $wgLang;
-			return $wgLang->isRTL() ? 2 : 1;
-		}
-		return $q;
-	}
-
-}
-
-class LegacyTemplate extends BaseTemplate {
-
-	// How many search boxes have we made?  Avoid duplicate id's.
-	protected $searchboxes = '';
-
-	function execute() {
-		$this->html( 'headelement' );
-		echo $this->beforeContent();
-		$this->html( 'bodytext' );
-		echo "\n";
-		echo $this->afterContent();
-		$this->html( 'dataAfterContent' );
-		$this->printTrail();
-		echo "\n</body></html>";
-	}
-
-	/**
-	 * This will be called immediately after the "<body>" tag.  Split into
-	 * two functions to make it easier to subclass.
-	 * @return string
-	 */
-	function beforeContent() {
-		return $this->doBeforeContent();
-	}
-
-	function doBeforeContent() {
-		global $wgLang;
-		wfProfileIn( __METHOD__ );
-
-		$s = '';
-
-		$langlinks = $this->otherLanguages();
-		if ( $langlinks ) {
-			$rows = 2;
-			$borderhack = '';
-		} else {
-			$rows = 1;
-			$langlinks = false;
-			$borderhack = 'class="top"';
-		}
-
-		$s .= "\n<div id='content'>\n<div id='topbar'>\n" .
-			"<table cellspacing='0' style='width: 100%;'>\n<tr>\n";
-
-		if ( $this->getSkin()->qbSetting() == 0 ) {
-			$s .= "<td class='top' style='text-align: left; vertical-align: top;' rowspan='{$rows}'>\n" .
-				$this->getSkin()->logoText( $wgLang->alignStart() ) . '</td>';
-		}
-
-		$l = $wgLang->alignStart();
-		$s .= "<td {$borderhack} style='text-align: $l; vertical-align: top;'>\n";
-
-		$s .= $this->topLinks();
-		$s .= '<p class="subtitle">' . $this->pageTitleLinks() . "</p>\n";
-
-		$r = $wgLang->alignEnd();
-		$s .= "</td>\n<td {$borderhack} style='text-align: $r; vertical-align: top;' nowrap='nowrap'>";
-		$s .= $this->nameAndLogin();
-		$s .= "\n<br />" . $this->searchForm() . '</td>';
-
-		if ( $langlinks ) {
-			$s .= "</tr>\n<tr>\n<td class='top' colspan=\"2\">$langlinks</td>\n";
-		}
-
-		$s .= "</tr>\n</table>\n</div>\n";
-		$s .= "\n<div id='article'>\n";
-
-		$notice = $this->getSkin()->getSiteNotice();
-
-		if ( $notice ) {
-			$s .= "\n<div id='siteNotice'>$notice</div>\n";
-		}
-		$s .= $this->pageTitle();
-		$s .= $this->pageSubtitle();
-		$s .= $this->getSkin()->getCategories();
-
-		wfProfileOut( __METHOD__ );
-		return $s;
-	}
-
-	/**
-	 * This gets called shortly before the "</body>" tag.
-	 * @return String HTML to be put before "</body>"
-	 */
-	function afterContent() {
-		return $this->doAfterContent();
-	}
-
-	/** overloaded by derived classes
-	 * @return string
-	 */
-	function doAfterContent() {
-		return '</div></div>';
-	}
-
-	function searchForm() {
-		global $wgRequest, $wgUseTwoButtonsSearchForm;
-
-		$search = $wgRequest->getText( 'search' );
-
-		$s = '<form id="searchform' . $this->searchboxes . '" name="search" class="inline" method="post" action="'
-			. $this->getSkin()->escapeSearchLink() . "\">\n"
-			. '<input type="text" id="searchInput' . $this->searchboxes . '" name="search" size="19" value="'
-			. htmlspecialchars( substr( $search, 0, 256 ) ) . "\" />\n"
-			. '<input type="submit" name="go" value="' . wfMessage( 'searcharticle' )->text() . '" />';
-
-		if ( $wgUseTwoButtonsSearchForm ) {
-			$s .= '&#160;<input type="submit" name="fulltext" value="' . wfMessage( 'searchbutton' )->text() . "\" />\n";
-		} else {
-			$s .= ' <a href="' . $this->getSkin()->escapeSearchLink() . '" rel="search">' . wfMessage( 'powersearch-legend' )->text() . "</a>\n";
-		}
-
-		$s .= '</form>';
-
-		// Ensure unique id's for search boxes made after the first
-		$this->searchboxes = $this->searchboxes == '' ? 2 : $this->searchboxes + 1;
-
-		return $s;
-	}
-
-	function pageStats() {
-		$ret = array();
-		$items = array( 'viewcount', 'credits', 'lastmod', 'numberofwatchingusers', 'copyright' );
-
-		foreach( $items as $item ) {
-			if ( $this->data[$item] !== false ) {
-				$ret[] = $this->data[$item];
-			}
-		}
-
-		return implode( ' ', $ret );
-	}
-
-	function topLinks() {
-		global $wgOut;
-
-		$s = array(
-			$this->getSkin()->mainPageLink(),
-			Linker::specialLink( 'Recentchanges' )
-		);
-
-		if ( $wgOut->isArticleRelated() ) {
-			$s[] = $this->editThisPage();
-			$s[] = $this->historyLink();
-		}
-
-		# Many people don't like this dropdown box
-		# $s[] = $this->specialPagesList();
-
-		if ( $this->variantLinks() ) {
-			$s[] = $this->variantLinks();
-		}
-
-		if ( $this->extensionTabLinks() ) {
-			$s[] = $this->extensionTabLinks();
-		}
-
-		// @todo FIXME: Is using Language::pipeList impossible here? Do not quite understand the use of the newline
-		return implode( $s, wfMessage( 'pipe-separator' )->escaped() . "\n" );
-	}
-
-	/**
-	 * Language/charset variant links for classic-style skins
-	 * @return string
-	 */
-	function variantLinks() {
-		$s = '';
-
-		/* show links to different language variants */
-		global $wgDisableLangConversion, $wgLang;
-
-		$title = $this->getSkin()->getTitle();
-		$lang = $title->getPageLanguage();
-		$variants = $lang->getVariants();
-
-		if ( !$wgDisableLangConversion && count( $variants ) > 1
-			&& !$title->isSpecialPage() ) {
-			foreach ( $variants as $code ) {
-				$varname = $lang->getVariantname( $code );
-
-				if ( $varname == 'disable' ) {
-					continue;
-				}
-				$s = $wgLang->pipeList( array(
-					$s,
-					'<a href="' . htmlspecialchars( $title->getLocalURL( 'variant=' . $code ) ) . '" lang="' . $code . '" hreflang="' . $code . '">' . htmlspecialchars( $varname ) . '</a>'
-				) );
-			}
-		}
-
-		return $s;
-	}
-
-	/**
-	 * Compatibility for extensions adding functionality through tabs.
-	 * Eventually these old skins should be replaced with SkinTemplate-based
-	 * versions, sigh...
-	 * @return string
-	 * @todo Exterminate! ...that, and replace it with normal SkinTemplate stuff
-	 */
-	function extensionTabLinks() {
-		$tabs = array();
-		$out = '';
-		$s = array();
-		wfRunHooks( 'SkinTemplateTabs', array( $this->getSkin(), &$tabs ) );
-		foreach ( $tabs as $tab ) {
-			$s[] = Xml::element( 'a',
-				array( 'href' => $tab['href'] ),
-				$tab['text'] );
-		}
-
-		if ( count( $s ) ) {
-			global $wgLang;
-
-			$out = wfMessage( 'pipe-separator' )->escaped();
-			$out .= $wgLang->pipeList( $s );
-		}
-
-		return $out;
-	}
-
-	function bottomLinks() {
-		global $wgOut, $wgUser;
-		$sep = wfMessage( 'pipe-separator' )->escaped() . "\n";
-
-		$s = '';
-		if ( $wgOut->isArticleRelated() ) {
-			$element[] = '<strong>' . $this->editThisPage() . '</strong>';
-
-			if ( $wgUser->isLoggedIn() ) {
-				$element[] = $this->watchThisPage();
-			}
-
-			$element[] = $this->talkLink();
-			$element[] = $this->historyLink();
-			$element[] = $this->whatLinksHere();
-			$element[] = $this->watchPageLinksLink();
-
-			$title = $this->getSkin()->getTitle();
-
-			if (
-				$title->getNamespace() == NS_USER ||
-				$title->getNamespace() == NS_USER_TALK
-			) {
-				$id = User::idFromName( $title->getText() );
-				$ip = User::isIP( $title->getText() );
-
-				# Both anons and non-anons have contributions list
-				if ( $id || $ip ) {
-					$element[] = $this->userContribsLink();
-				}
-
-				if ( $this->getSkin()->showEmailUser( $id ) ) {
-					$element[] = $this->emailUserLink();
-				}
-			}
-
-			$s = implode( $element, $sep );
-
-			if ( $title->getArticleID() ) {
-				$s .= "\n<br />";
-
-				// Delete/protect/move links for privileged users
-				if ( $wgUser->isAllowed( 'delete' ) ) {
-					$s .= $this->deleteThisPage();
-				}
-
-				if ( $wgUser->isAllowed( 'protect' ) && $title->getRestrictionTypes() ) {
-					$s .= $sep . $this->protectThisPage();
-				}
-
-				if ( $wgUser->isAllowed( 'move' ) ) {
-					$s .= $sep . $this->moveThisPage();
-				}
-			}
-
-			$s .= "<br />\n" . $this->otherLanguages();
-		}
-
-		return $s;
-	}
-
-	function otherLanguages() {
-		global $wgOut, $wgLang, $wgHideInterlanguageLinks;
-
-		if ( $wgHideInterlanguageLinks ) {
-			return '';
-		}
-
-		$a = $wgOut->getLanguageLinks();
-
-		if ( 0 == count( $a ) ) {
-			return '';
-		}
-
-		$s = wfMessage( 'otherlanguages' )->text() . wfMessage( 'colon-separator' )->text();
-		$first = true;
-
-		if ( $wgLang->isRTL() ) {
-			$s .= '<span dir="ltr">';
-		}
-
-		foreach ( $a as $l ) {
-			if ( !$first ) {
-				$s .= wfMessage( 'pipe-separator' )->escaped();
-			}
-
-			$first = false;
-
-			$nt = Title::newFromText( $l );
-			$text = Language::fetchLanguageName( $nt->getInterwiki() );
-
-			$s .= Html::element( 'a',
-				array( 'href' => $nt->getFullURL(), 'title' => $nt->getText(), 'class' => "external" ),
-				$text == '' ? $l : $text );
-		}
-
-		if ( $wgLang->isRTL() ) {
-			$s .= '</span>';
-		}
-
-		return $s;
-	}
-
-	/**
-	 * Show a drop-down box of special pages
-	 * @return string
-	 */
-	function specialPagesList() {
-		global $wgScript;
-
-		$select = new XmlSelect( 'title' );
-		$pages = SpecialPageFactory::getUsablePages();
-		array_unshift( $pages, SpecialPageFactory::getPage( 'SpecialPages' ) );
-		foreach ( $pages as $obj ) {
-			$select->addOption( $obj->getDescription(),
-				$obj->getTitle()->getPrefixedDBkey() );
-		}
-
-		return Html::rawElement( 'form',
-			array( 'id' => 'specialpages', 'method' => 'get', 'action' => $wgScript ),
-			$select->getHTML() . Xml::submitButton( wfMessage( 'go' )->text() ) );
-	}
-
-	function pageTitleLinks() {
-		global $wgOut, $wgUser, $wgRequest, $wgLang;
-
-		$oldid = $wgRequest->getVal( 'oldid' );
-		$diff = $wgRequest->getVal( 'diff' );
-		$action = $wgRequest->getText( 'action' );
-
-		$skin = $this->getSkin();
-		$title = $skin->getTitle();
-
-		$s[] = $this->printableLink();
-		$disclaimer = $skin->disclaimerLink(); # may be empty
-
-		if ( $disclaimer ) {
-			$s[] = $disclaimer;
-		}
-
-		$privacy = $skin->privacyLink(); # may be empty too
-
-		if ( $privacy ) {
-			$s[] = $privacy;
-		}
-
-		if ( $wgOut->isArticleRelated() ) {
-			if ( $title->getNamespace() == NS_FILE ) {
-				$image = wfFindFile( $title );
-
-				if ( $image ) {
-					$href = $image->getURL();
-					$s[] = Html::element( 'a', array( 'href' => $href,
-						'title' => $href ), $title->getText() );
-
-				}
-			}
-		}
-
-		if ( 'history' == $action || isset( $diff ) || isset( $oldid ) ) {
-			$s[] .= Linker::linkKnown(
-				$title,
-				wfMessage( 'currentrev' )->text()
-			);
-		}
-
-		if ( $wgUser->getNewtalk() ) {
-			# do not show "You have new messages" text when we are viewing our
-			# own talk page
-			if ( !$title->equals( $wgUser->getTalkPage() ) ) {
-				$tl = Linker::linkKnown(
-					$wgUser->getTalkPage(),
-					wfMessage( 'newmessageslink' )->escaped(),
-					array(),
-					array( 'redirect' => 'no' )
-				);
-
-				$dl = Linker::linkKnown(
-					$wgUser->getTalkPage(),
-					wfMessage( 'newmessagesdifflink' )->escaped(),
-					array(),
-					array( 'diff' => 'cur' )
-				);
-				$s[] = '<strong>' . wfMessage( 'youhavenewmessages', $tl, $dl )->text() . '</strong>';
-				# disable caching
-				$wgOut->setSquidMaxage( 0 );
-				$wgOut->enableClientCache( false );
-			}
-		}
-
-		$undelete = $skin->getUndeleteLink();
-
-		if ( !empty( $undelete ) ) {
-			$s[] = $undelete;
-		}
-
-		return $wgLang->pipeList( $s );
-	}
-
-	/**
-	 * Gets the h1 element with the page title.
-	 * @return string
-	 */
-	function pageTitle() {
-		global $wgOut;
-		$s = '<h1 class="pagetitle"><span dir="auto">' . $wgOut->getPageTitle() . '</span></h1>';
-		return $s;
-	}
-
-	function pageSubtitle() {
-		global $wgOut;
-
-		$sub = $wgOut->getSubtitle();
-
-		if ( $sub == '' ) {
-			global $wgExtraSubtitle;
-			$sub = wfMessage( 'tagline' )->parse() . $wgExtraSubtitle;
-		}
-
-		$subpages = $this->getSkin()->subPageSubtitle();
-		$sub .= !empty( $subpages ) ? "</p><p class='subpages'>$subpages" : '';
-		$s = "<p class='subtitle'>{$sub}</p>\n";
-
-		return $s;
-	}
-
-	function printableLink() {
-		global $wgOut, $wgRequest, $wgLang;
-
-		$s = array();
-
-		if ( !$wgOut->isPrintable() ) {
-			$printurl = htmlspecialchars( $this->getSkin()->getTitle()->getLocalUrl(
-				$wgRequest->appendQueryValue( 'printable', 'yes', true ) ) );
-			$s[] = "<a href=\"$printurl\" rel=\"alternate\">"
-				. wfMessage( 'printableversion' )->text() . '</a>';
-		}
-
-		if ( $wgOut->isSyndicated() ) {
-			foreach ( $wgOut->getSyndicationLinks() as $format => $link ) {
-				$feedurl = htmlspecialchars( $link );
-				$s[] = "<a href=\"$feedurl\" rel=\"alternate\" type=\"application/{$format}+xml\""
-						. " class=\"feedlink\">" . wfMessage( "feed-$format" )->escaped() . "</a>";
-			}
-		}
-		return $wgLang->pipeList( $s );
-	}
-
-	/**
-	 * @deprecated in 1.19
-	 * @return string
-	 */
-	function getQuickbarCompensator( $rows = 1 ) {
-		wfDeprecated( __METHOD__, '1.19' );
-		return "<td style='width: 152px;' rowspan='{$rows}'>&#160;</td>";
-	}
-
-	function editThisPage() {
-		global $wgOut;
-
-		if ( !$wgOut->isArticleRelated() ) {
-			$s = wfMessage( 'protectedpage' )->text();
-		} else {
-			$title = $this->getSkin()->getTitle();
-			if ( $title->quickUserCan( 'edit' ) && $title->exists() ) {
-				$t = wfMessage( 'editthispage' )->text();
-			} elseif ( $title->quickUserCan( 'create' ) && !$title->exists() ) {
-				$t = wfMessage( 'create-this-page' )->text();
-			} else {
-				$t = wfMessage( 'viewsource' )->text();
-			}
-
-			$s = Linker::linkKnown(
-				$title,
-				$t,
-				array(),
-				$this->getSkin()->editUrlOptions()
-			);
-		}
-
-		return $s;
-	}
-
-	function deleteThisPage() {
-		global $wgUser, $wgRequest;
-
-		$diff = $wgRequest->getVal( 'diff' );
-		$title = $this->getSkin()->getTitle();
-
-		if ( $title->getArticleID() && ( !$diff ) && $wgUser->isAllowed( 'delete' ) ) {
-			$t = wfMessage( 'deletethispage' )->text();
-
-			$s = Linker::linkKnown(
-				$title,
-				$t,
-				array(),
-				array( 'action' => 'delete' )
-			);
-		} else {
-			$s = '';
-		}
-
-		return $s;
-	}
-
-	function protectThisPage() {
-		global $wgUser, $wgRequest;
-
-		$diff = $wgRequest->getVal( 'diff' );
-		$title = $this->getSkin()->getTitle();
-
-		if ( $title->getArticleID() && ( ! $diff ) && $wgUser->isAllowed( 'protect' ) && $title->getRestrictionTypes() ) {
-			if ( $title->isProtected() ) {
-				$text = wfMessage( 'unprotectthispage' )->text();
-				$query = array( 'action' => 'unprotect' );
-			} else {
-				$text = wfMessage( 'protectthispage' )->text();
-				$query = array( 'action' => 'protect' );
-			}
-
-			$s = Linker::linkKnown(
-				$title,
-				$text,
-				array(),
-				$query
-			);
-		} else {
-			$s = '';
-		}
-
-		return $s;
-	}
-
-	function watchThisPage() {
-		global $wgOut, $wgUser;
-		++$this->mWatchLinkNum;
-
-		// Cache
-		$title = $this->getSkin()->getTitle();
-
-		if ( $wgOut->isArticleRelated() ) {
-			if ( $wgUser->isWatched( $title ) ) {
-				$text = wfMessage( 'unwatchthispage' )->text();
-				$query = array(
-					'action' => 'unwatch',
-					'token' => UnwatchAction::getUnwatchToken( $title, $wgUser ),
-				);
-				$id = 'mw-unwatch-link' . $this->mWatchLinkNum;
-			} else {
-				$text = wfMessage( 'watchthispage' )->text();
-				$query = array(
-					'action' => 'watch',
-					'token' => WatchAction::getWatchToken( $title, $wgUser ),
-				);
-				$id = 'mw-watch-link' . $this->mWatchLinkNum;
-			}
-
-			$s = Linker::linkKnown(
-				$title,
-				$text,
-				array( 'id' => $id ),
-				$query
-			);
-		} else {
-			$s = wfMessage( 'notanarticle' )->text();
-		}
-
-		return $s;
-	}
-
-	function moveThisPage() {
-		if ( $this->getSkin()->getTitle()->quickUserCan( 'move' ) ) {
-			return Linker::linkKnown(
-				SpecialPage::getTitleFor( 'Movepage' ),
-				wfMessage( 'movethispage' )->text(),
-				array(),
-				array( 'target' => $this->getSkin()->getTitle()->getPrefixedDBkey() )
-			);
-		} else {
-			// no message if page is protected - would be redundant
-			return '';
-		}
-	}
-
-	function historyLink() {
-		return Linker::link(
-			$this->getSkin()->getTitle(),
-			wfMessage( 'history' )->escaped(),
-			array( 'rel' => 'archives' ),
-			array( 'action' => 'history' )
-		);
-	}
-
-	function whatLinksHere() {
-		return Linker::linkKnown(
-			SpecialPage::getTitleFor( 'Whatlinkshere', $this->getSkin()->getTitle()->getPrefixedDBkey() ),
-			wfMessage( 'whatlinkshere' )->escaped()
-		);
-	}
-
-	function userContribsLink() {
-		return Linker::linkKnown(
-			SpecialPage::getTitleFor( 'Contributions', $this->getSkin()->getTitle()->getDBkey() ),
-			wfMessage( 'contributions' )->escaped()
-		);
-	}
-
-	function emailUserLink() {
-		return Linker::linkKnown(
-			SpecialPage::getTitleFor( 'Emailuser', $this->getSkin()->getTitle()->getDBkey() ),
-			wfMessage( 'emailuser' )->escaped()
-		);
-	}
-
-	function watchPageLinksLink() {
-		global $wgOut;
-
-		if ( !$wgOut->isArticleRelated() ) {
-			return wfMessage( 'parentheses', wfMessage( 'notanarticle' )->text() )->escaped();
-		} else {
-			return Linker::linkKnown(
-				SpecialPage::getTitleFor( 'Recentchangeslinked', $this->getSkin()->getTitle()->getPrefixedDBkey() ),
-				wfMessage( 'recentchangeslinked-toolbox' )->escaped()
-			);
-		}
-	}
-
-	function talkLink() {
-		$title = $this->getSkin()->getTitle();
-		if ( NS_SPECIAL == $title->getNamespace() ) {
-			# No discussion links for special pages
-			return '';
-		}
-
-		$linkOptions = array();
-
-		if ( $title->isTalkPage() ) {
-			$link = $title->getSubjectPage();
-			switch( $link->getNamespace() ) {
-				case NS_MAIN:
-					$text = wfMessage( 'articlepage' );
-					break;
-				case NS_USER:
-					$text = wfMessage( 'userpage' );
-					break;
-				case NS_PROJECT:
-					$text = wfMessage( 'projectpage' );
-					break;
-				case NS_FILE:
-					$text = wfMessage( 'imagepage' );
-					# Make link known if image exists, even if the desc. page doesn't.
-					if ( wfFindFile( $link ) )
-						$linkOptions[] = 'known';
-					break;
-				case NS_MEDIAWIKI:
-					$text = wfMessage( 'mediawikipage' );
-					break;
-				case NS_TEMPLATE:
-					$text = wfMessage( 'templatepage' );
-					break;
-				case NS_HELP:
-					$text = wfMessage( 'viewhelppage' );
-					break;
-				case NS_CATEGORY:
-					$text = wfMessage( 'categorypage' );
-					break;
-				default:
-					$text = wfMessage( 'articlepage' );
-			}
-		} else {
-			$link = $title->getTalkPage();
-			$text = wfMessage( 'talkpage' );
-		}
-
-		$s = Linker::link( $link, $text->text(), array(), array(), $linkOptions );
-
-		return $s;
-	}
-
-	function commentLink() {
-		global $wgOut;
-
-		$title = $this->getSkin()->getTitle();
-		if ( $title->isSpecialPage() ) {
-			return '';
-		}
-
-		# __NEWSECTIONLINK___ changes behavior here
-		# If it is present, the link points to this page, otherwise
-		# it points to the talk page
-		if ( !$title->isTalkPage() && !$wgOut->showNewSectionLink() ) {
-			$title = $title->getTalkPage();
-		}
-
-		return Linker::linkKnown(
-			$title,
-			wfMessage( 'postcomment' )->text(),
-			array(),
-			array(
-				'action' => 'edit',
-				'section' => 'new'
-			)
-		);
-	}
-
-	function getUploadLink() {
-		global $wgUploadNavigationUrl;
-
-		if ( $wgUploadNavigationUrl ) {
-			# Using an empty class attribute to avoid automatic setting of "external" class
-			return Linker::makeExternalLink( $wgUploadNavigationUrl,
-				wfMessage( 'upload' )->escaped(),
-				false, null, array( 'class' => '' ) );
-		} else {
-			return Linker::linkKnown(
-				SpecialPage::getTitleFor( 'Upload' ),
-				wfMessage( 'upload' )->escaped()
-			);
-		}
-	}
-
-	function nameAndLogin() {
-		global $wgUser, $wgLang, $wgRequest;
-
-		$returnTo = $this->getSkin()->getTitle();
-		$ret = '';
-
-		if ( $wgUser->isAnon() ) {
-			if ( $this->getSkin()->showIPinHeader() ) {
-				$name = $wgRequest->getIP();
-
-				$talkLink = Linker::link( $wgUser->getTalkPage(),
-					$wgLang->getNsText( NS_TALK ) );
-				$talkLink = wfMessage( 'parentheses' )->rawParams( $talkLink )->escaped();
-
-				$ret .= "$name $talkLink";
-			} else {
-				$ret .= wfMessage( 'notloggedin' )->text();
-			}
-
-			$query = array();
-
-			if ( !$returnTo->isSpecial( 'Userlogout' ) ) {
-				$query['returnto'] = $returnTo->getPrefixedDBkey();
-			}
-
-			$loginlink = $wgUser->isAllowed( 'createaccount' )
-				? 'nav-login-createaccount'
-				: 'login';
-			$ret .= "\n<br />" . Linker::link(
-				SpecialPage::getTitleFor( 'Userlogin' ),
-				wfMessage( $loginlink )->text(), array(), $query
-			);
-		} else {
-			$talkLink = Linker::link( $wgUser->getTalkPage(),
-				$wgLang->getNsText( NS_TALK ) );
-			$talkLink = wfMessage( 'parentheses' )->rawParams( $talkLink )->escaped();
-
-			$ret .= Linker::link( $wgUser->getUserPage(),
-				htmlspecialchars( $wgUser->getName() ) );
-			$ret .= " $talkLink<br />";
-			$ret .= $wgLang->pipeList( array(
-				Linker::link(
-					SpecialPage::getTitleFor( 'Userlogout' ), wfMessage( 'logout' )->text(),
-					array(), array( 'returnto' => $returnTo->getPrefixedDBkey() )
-				),
-				Linker::specialLink( 'Preferences' ),
-			) );
-		}
-
-		$ret = $wgLang->pipeList( array(
-			$ret,
-			Linker::link(
-				Title::newFromText( wfMessage( 'helppage' )->inContentLanguage()->text() ),
-				wfMessage( 'help' )->text()
-			),
-		) );
-
-		return $ret;
-	}
-}
diff --git a/includes/SkinTemplate.php b/includes/SkinTemplate.php
index 59e1ccff..53f11998 100644
--- a/includes/SkinTemplate.php
+++ b/includes/SkinTemplate.php
@@ -43,7 +43,7 @@ class MediaWiki_I18N {
 		$value = wfMessage( $value )->text();
 		// interpolate variables
 		$m = array();
-		while( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) {
+		while ( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) {
 			list( $src, $var ) = $m;
 			wfSuppressWarnings();
 			$varValue = $this->_context[$var];
@@ -123,38 +123,61 @@ class SkinTemplate extends Skin {
 	}
 
 	/**
-	 * initialize various variables and generate the template
+	 * Generates array of language links for the current page
 	 *
-	 * @param $out OutputPage
+	 * @return array
+	 * @public
 	 */
-	function outputPage( OutputPage $out=null ) {
-		global $wgContLang;
-		global $wgScript, $wgStylePath;
-		global $wgMimeType, $wgJsMimeType;
-		global $wgXhtmlDefaultNamespace, $wgXhtmlNamespaces, $wgHtml5Version;
-		global $wgDisableCounters, $wgSitename, $wgLogo, $wgHideInterlanguageLinks;
-		global $wgMaxCredits, $wgShowCreditsIfMax;
-		global $wgPageShowWatchingUsers;
-		global $wgArticlePath, $wgScriptPath, $wgServer;
+	public function getLanguages() {
+		global $wgHideInterlanguageLinks;
+		$out = $this->getOutput();
+		$userLang = $this->getLanguage();
 
-		wfProfileIn( __METHOD__ );
-		Profiler::instance()->setTemplated( true );
+		# Language links
+		$language_urls = array();
 
-		$oldContext = null;
-		if ( $out !== null ) {
-			// @todo Add wfDeprecated in 1.20
-			$oldContext = $this->getContext();
-			$this->setContext( $out->getContext() );
+		if ( !$wgHideInterlanguageLinks ) {
+			foreach ( $out->getLanguageLinks() as $languageLinkText ) {
+				$languageLinkParts = explode( ':', $languageLinkText, 2 );
+				$class = 'interwiki-' . $languageLinkParts[0];
+				unset( $languageLinkParts );
+				$languageLinkTitle = Title::newFromText( $languageLinkText );
+				if ( $languageLinkTitle ) {
+					$ilInterwikiCode = $languageLinkTitle->getInterwiki();
+					$ilLangName = Language::fetchLanguageName( $ilInterwikiCode );
+
+					if ( strval( $ilLangName ) === '' ) {
+						$ilLangName = $languageLinkText;
+					} else {
+						$ilLangName = $this->formatLanguageName( $ilLangName );
+					}
+
+					// CLDR extension or similar is required to localize the language name;
+					// otherwise we'll end up with the autonym again.
+					$ilLangLocalName = Language::fetchLanguageName( $ilInterwikiCode, $userLang->getCode() );
+
+					$language_urls[] = array(
+						'href' => $languageLinkTitle->getFullURL(),
+						'text' => $ilLangName,
+						'title' => wfMessage( 'interlanguage-link-title', $languageLinkTitle->getText(), $ilLangLocalName )->text(),
+						'class' => $class,
+						'lang' => wfBCP47( $ilInterwikiCode ),
+						'hreflang' => wfBCP47( $ilInterwikiCode ),
+					);
+				}
+			}
 		}
+		return $language_urls;
+	}
+
+	protected function setupTemplateForOutput() {
+		wfProfileIn( __METHOD__ );
 
-		$out = $this->getOutput();
 		$request = $this->getRequest();
 		$user = $this->getUser();
 		$title = $this->getTitle();
 
 		wfProfileIn( __METHOD__ . '-init' );
-		$this->initPage( $out );
-
 		$tpl = $this->setupTemplate( $this->template, 'skins' );
 		wfProfileOut( __METHOD__ . '-init' );
 
@@ -183,6 +206,47 @@ class SkinTemplate extends Skin {
 
 		wfProfileOut( __METHOD__ . '-stuff' );
 
+		wfProfileOut( __METHOD__ );
+
+		return $tpl;
+	}
+
+	/**
+	 * initialize various variables and generate the template
+	 *
+	 * @param $out OutputPage
+	 */
+	function outputPage( OutputPage $out = null ) {
+		global $wgContLang;
+		global $wgScript, $wgStylePath;
+		global $wgMimeType, $wgJsMimeType;
+		global $wgXhtmlNamespaces, $wgHtml5Version;
+		global $wgDisableCounters, $wgSitename, $wgLogo;
+		global $wgMaxCredits, $wgShowCreditsIfMax;
+		global $wgPageShowWatchingUsers;
+		global $wgArticlePath, $wgScriptPath, $wgServer;
+
+		wfProfileIn( __METHOD__ );
+		Profiler::instance()->setTemplated( true );
+
+		$oldContext = null;
+		if ( $out !== null ) {
+			// @todo Add wfDeprecated in 1.20
+			$oldContext = $this->getContext();
+			$this->setContext( $out->getContext() );
+		}
+
+		$out = $this->getOutput();
+		$request = $this->getRequest();
+		$user = $this->getUser();
+		$title = $this->getTitle();
+
+		wfProfileIn( __METHOD__ . '-init' );
+		$this->initPage( $out );
+		wfProfileOut( __METHOD__ . '-init' );
+
+		$tpl = $this->setupTemplateForOutput();
+
 		wfProfileIn( __METHOD__ . '-stuff-head' );
 		if ( !$this->useHeadElement ) {
 			$tpl->set( 'pagecss', false );
@@ -193,7 +257,7 @@ class SkinTemplate extends Skin {
 
 			$tpl->set( 'jsvarurl', false );
 
-			$tpl->setRef( 'xhtmldefaultnamespace', $wgXhtmlDefaultNamespace );
+			$tpl->set( 'xhtmldefaultnamespace', 'http://www.w3.org/1999/xhtml' );
 			$tpl->set( 'xhtmlnamespaces', $wgXhtmlNamespaces );
 			$tpl->set( 'html5version', $wgHtml5Version );
 			$tpl->set( 'headlinks', $out->getHeadLinks() );
@@ -229,10 +293,11 @@ class SkinTemplate extends Skin {
 		}
 
 		$tpl->set( 'catlinks', $this->getCategories() );
-		if( $out->isSyndicated() ) {
+		if ( $out->isSyndicated() ) {
 			$feeds = array();
-			foreach( $out->getSyndicationLinks() as $format => $link ) {
+			foreach ( $out->getSyndicationLinks() as $format => $link ) {
 				$feeds[$format] = array(
+					// Messages: feed-atom, feed-rss
 					'text' => $this->msg( "feed-$format" )->text(),
 					'href' => $link
 				);
@@ -280,7 +345,7 @@ class SkinTemplate extends Skin {
 		$tpl->set( 'rtl', $userLang->isRTL() );
 
 		$tpl->set( 'capitalizeallnouns', $userLang->capitalizeAllNouns() ? ' capitalize-all-nouns' : '' );
-		$tpl->set( 'showjumplinks', $user->getOption( 'showjumplinks' ) );
+		$tpl->set( 'showjumplinks', true ); // showjumplinks preference has been removed
 		$tpl->set( 'username', $this->loggedin ? $this->username : null );
 		$tpl->setRef( 'userpage', $this->userpage );
 		$tpl->setRef( 'userpageurl', $this->userpageUrlDetails['href'] );
@@ -409,36 +474,7 @@ class SkinTemplate extends Skin {
 		$out->mBodytext = Html::rawElement( 'div', $realBodyAttribs, $out->mBodytext );
 		$tpl->setRef( 'bodytext', $out->mBodytext );
 
-		# Language links
-		$language_urls = array();
-
-		if ( !$wgHideInterlanguageLinks ) {
-			foreach( $out->getLanguageLinks() as $languageLinkText ) {
-				$languageLinkParts = explode( ':', $languageLinkText, 2 );
-				$class = 'interwiki-' . $languageLinkParts[0];
-				unset( $languageLinkParts );
-				$languageLinkTitle = Title::newFromText( $languageLinkText );
-				if ( $languageLinkTitle ) {
-					$ilInterwikiCode = $languageLinkTitle->getInterwiki();
-					$ilLangName = Language::fetchLanguageName( $ilInterwikiCode );
-
-					if ( strval( $ilLangName ) === '' ) {
-						$ilLangName = $languageLinkText;
-					} else {
-						$ilLangName = $this->formatLanguageName( $ilLangName );
-					}
-
-					$language_urls[] = array(
-						'href' => $languageLinkTitle->getFullURL(),
-						'text' => $ilLangName,
-						'title' => $languageLinkTitle->getText(),
-						'class' => $class,
-						'lang' => $ilInterwikiCode,
-						'hreflang' => $ilInterwikiCode
-					);
-				}
-			}
-		}
+		$language_urls = $this->getLanguages();
 		if ( count( $language_urls ) ) {
 			$tpl->setRef( 'language_urls', $language_urls );
 		} else {
@@ -469,7 +505,7 @@ class SkinTemplate extends Skin {
 		$tpl->set( 'reporttime', wfReportTime() );
 
 		// original version by hansm
-		if( !wfRunHooks( 'SkinTemplateOutputPageBeforeExec', array( &$this, &$tpl ) ) ) {
+		if ( !wfRunHooks( 'SkinTemplateOutputPageBeforeExec', array( &$this, &$tpl ) ) ) {
 			wfDebug( __METHOD__ . ": Hook SkinTemplateOutputPageBeforeExec broke outputPage execution!\n" );
 		}
 
@@ -501,6 +537,20 @@ class SkinTemplate extends Skin {
 		wfProfileOut( __METHOD__ );
 	}
 
+	/**
+	 * Get the HTML for the p-personal list
+	 * @return string
+	 */
+	public function getPersonalToolsList() {
+		$tpl = $this->setupTemplateForOutput();
+		$tpl->set( 'personal_urls', $this->buildPersonalUrls() );
+		$html = '';
+		foreach ( $tpl->getPersonalTools() as $key => $item ) {
+			$html .= $tpl->makeListItem( $key, $item );
+		}
+		return $html;
+	}
+
 	/**
 	 * Format language name for use in sidebar interlanguage links list.
 	 * By default it is capitalized.
@@ -544,8 +594,6 @@ class SkinTemplate extends Skin {
 	 * @return array
 	 */
 	protected function buildPersonalUrls() {
-		global $wgSecureLogin;
-
 		$title = $this->getTitle();
 		$request = $this->getRequest();
 		$pageurl = $title->getLocalURL();
@@ -568,17 +616,13 @@ class SkinTemplate extends Skin {
 		if ( strval( $page ) !== '' ) {
 			$a['returnto'] = $page;
 			$query = $request->getVal( 'returntoquery', $this->thisquery );
-			if( $query != '' ) {
+			if ( $query != '' ) {
 				$a['returntoquery'] = $query;
 			}
 		}
 
-		if ( $wgSecureLogin && $request->detectProtocol() === 'https' ) {
-			$a['wpStickHTTPS'] = true;
-		}
-
 		$returnto = wfArrayToCgi( $a );
-		if( $this->loggedin ) {
+		if ( $this->loggedin ) {
 			$personal_urls['userpage'] = array(
 				'text' => $this->username,
 				'href' => &$this->userpageUrlDetails['href'],
@@ -599,12 +643,15 @@ class SkinTemplate extends Skin {
 				'href' => $href,
 				'active' => ( $href == $pageurl )
 			);
-			$href = self::makeSpecialUrl( 'Watchlist' );
-			$personal_urls['watchlist'] = array(
-				'text' => $this->msg( 'mywatchlist' )->text(),
-				'href' => $href,
-				'active' => ( $href == $pageurl )
-			);
+
+			if ( $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
+				$href = self::makeSpecialUrl( 'Watchlist' );
+				$personal_urls['watchlist'] = array(
+					'text' => $this->msg( 'mywatchlist' )->text(),
+					'href' => $href,
+					'active' => ( $href == $pageurl )
+				);
+			}
 
 			# We need to do an explicit check for Special:Contributions, as we
 			# have to match both the title, and the target, which could come
@@ -614,7 +661,7 @@ class SkinTemplate extends Skin {
 			# thickens, because the Title object is altered for special pages,
 			# so it doesn't contain the original alias-with-subpage.
 			$origTitle = Title::newFromText( $request->getText( 'title' ) );
-			if( $origTitle instanceof Title && $origTitle->isSpecialPage() ) {
+			if ( $origTitle instanceof Title && $origTitle->isSpecialPage() ) {
 				list( $spName, $spPar ) = SpecialPageFactory::resolveAlias( $origTitle->getText() );
 				$active = $spName == 'Contributions'
 					&& ( ( $spPar && $spPar == $this->username )
@@ -645,24 +692,19 @@ class SkinTemplate extends Skin {
 				: 'login';
 			$is_signup = $request->getText( 'type' ) == 'signup';
 
-			# anonlogin & login are the same
-			$proto = $wgSecureLogin ? PROTO_HTTPS : null;
-
 			$login_id = $this->showIPinHeader() ? 'anonlogin' : 'login';
 			$login_url = array(
 				'text' => $this->msg( $loginlink )->text(),
-				'href' => self::makeSpecialUrl( 'Userlogin', $returnto, $proto ),
+				'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
 				'active' => $title->isSpecial( 'Userlogin' ) && ( $loginlink == 'nav-login-createaccount' || !$is_signup ),
-				'class' => $wgSecureLogin ? 'link-https' : ''
 			);
 			$createaccount_url = array(
 				'text' => $this->msg( 'createaccount' )->text(),
-				'href' => self::makeSpecialUrl( 'Userlogin', "$returnto&type=signup", $proto ),
+				'href' => self::makeSpecialUrl( 'Userlogin', "$returnto&type=signup" ),
 				'active' => $title->isSpecial( 'Userlogin' ) && $is_signup,
-				'class' => $wgSecureLogin ? 'link-https' : ''
 			);
 
-			if( $this->showIPinHeader() ) {
+			if ( $this->showIPinHeader() ) {
 				$href = &$this->userpageUrlDetails['href'];
 				$personal_urls['anonuserpage'] = array(
 					'text' => $this->username,
@@ -705,10 +747,10 @@ class SkinTemplate extends Skin {
 	 */
 	function tabAction( $title, $message, $selected, $query = '', $checkEdit = false ) {
 		$classes = array();
-		if( $selected ) {
+		if ( $selected ) {
 			$classes[] = 'selected';
 		}
-		if( $checkEdit && !$title->isKnown() ) {
+		if ( $checkEdit && !$title->isKnown() ) {
 			$classes[] = 'new';
 			if ( $query !== '' ) {
 				$query = 'action=edit&redlink=1&' . $query;
@@ -733,7 +775,7 @@ class SkinTemplate extends Skin {
 		}
 
 		$result = array();
-		if( !wfRunHooks( 'SkinTemplateTabAction', array( &$this,
+		if ( !wfRunHooks( 'SkinTemplateTabAction', array( &$this,
 				$title, $message, $selected, $checkEdit,
 				&$classes, &$query, &$text, &$result ) ) ) {
 			return $result;
@@ -742,13 +784,13 @@ class SkinTemplate extends Skin {
 		return array(
 			'class' => implode( ' ', $classes ),
 			'text' => $text,
-			'href' => $title->getLocalUrl( $query ),
+			'href' => $title->getLocalURL( $query ),
 			'primary' => true );
 	}
 
 	function makeTalkUrlDetails( $name, $urlaction = '' ) {
 		$title = Title::newFromText( $name );
-		if( !is_object( $title ) ) {
+		if ( !is_object( $title ) ) {
 			throw new MWException( __METHOD__ . " given invalid pagename $name" );
 		}
 		$title = $title->getTalkPage();
@@ -761,7 +803,7 @@ class SkinTemplate extends Skin {
 
 	function makeArticleUrlDetails( $name, $urlaction = '' ) {
 		$title = Title::newFromText( $name );
-		$title= $title->getSubjectPage();
+		$title = $title->getSubjectPage();
 		self::checkTitle( $title, $name );
 		return array(
 			'href' => $title->getLocalURL( $urlaction ),
@@ -831,7 +873,7 @@ class SkinTemplate extends Skin {
 		wfRunHooks( 'SkinTemplatePreventOtherActiveTabs', array( &$this, &$preventActiveTabs ) );
 
 		// Checks if page is some kind of content
-		if( $title->canExist() ) {
+		if ( $title->canExist() ) {
 			// Gets page objects for the related namespaces
 			$subjectPage = $title->getSubjectPage();
 			$talkPage = $title->getTalkPage();
@@ -978,7 +1020,7 @@ class SkinTemplate extends Skin {
 				wfProfileOut( __METHOD__ . '-live' );
 
 				// Checks if the user is logged in
-				if ( $this->loggedin ) {
+				if ( $this->loggedin && $user->isAllowedAll( 'viewmywatchlist', 'editmywatchlist' ) ) {
 					/**
 					 * The following actions use messages which, if made particular to
 					 * the any specific skins, would break the Ajax code which makes this
@@ -1018,21 +1060,16 @@ class SkinTemplate extends Skin {
 						$params = array();
 					}
 					// Loops over each variant
-					foreach( $variants as $code ) {
+					foreach ( $variants as $code ) {
 						// Gets variant name from language code
 						$varname = $pageLang->getVariantname( $code );
-						// Checks if the variant is marked as disabled
-						if( $varname == 'disable' ) {
-							// Skips this variant
-							continue;
-						}
 						// Appends variant link
 						$content_navigation['variants'][] = array(
 							'class' => ( $code == $preferred ) ? 'selected' : false,
 							'text' => $varname,
 							'href' => $title->getLocalURL( array( 'variant' => $code ) + $params ),
-							'lang' => $code,
-							'hreflang' => $code
+							'lang' => wfBCP47( $code ),
+							'hreflang' => wfBCP47( $code ),
 						);
 					}
 				}
@@ -1156,9 +1193,9 @@ class SkinTemplate extends Skin {
 
 		$nav_urls = array();
 		$nav_urls['mainpage'] = array( 'href' => self::makeMainPageUrl() );
-		if( $wgUploadNavigationUrl ) {
+		if ( $wgUploadNavigationUrl ) {
 			$nav_urls['upload'] = array( 'href' => $wgUploadNavigationUrl );
-		} elseif( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getUser() ) === true ) {
+		} elseif ( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getUser() ) === true ) {
 			$nav_urls['upload'] = array( 'href' => self::makeSpecialUrl( 'Upload' ) );
 		} else {
 			$nav_urls['upload'] = false;
@@ -1178,15 +1215,15 @@ class SkinTemplate extends Skin {
 
 		// A print stylesheet is attached to all pages, but nobody ever
 		// figures that out. :)  Add a link...
-		if ( $out->isArticle() ) {
-			if ( !$out->isPrintable() ) {
-				$nav_urls['print'] = array(
-					'text' => $this->msg( 'printableversion' )->text(),
-					'href' => $this->getTitle()->getLocalURL(
-						$request->appendQueryValue( 'printable', 'yes', true ) )
-				);
-			}
+		if ( !$out->isPrintable() && ( $out->isArticle() || $this->getTitle()->isSpecialPage() ) ) {
+			$nav_urls['print'] = array(
+				'text' => $this->msg( 'printableversion' )->text(),
+				'href' => $this->getTitle()->getLocalURL(
+					$request->appendQueryValue( 'printable', 'yes', true ) )
+			);
+		}
 
+		if ( $out->isArticle() ) {
 			// Also add a "permalink" while we're at it
 			$revid = $this->getRevisionId();
 			if ( $revid ) {
@@ -1203,7 +1240,7 @@ class SkinTemplate extends Skin {
 
 		if ( $out->isArticleRelated() ) {
 			$nav_urls['whatlinkshere'] = array(
-				'href' => SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage )->getLocalUrl()
+				'href' => SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage )->getLocalURL()
 			);
 
 			$nav_urls['info'] = array(
@@ -1213,7 +1250,7 @@ class SkinTemplate extends Skin {
 
 			if ( $this->getTitle()->getArticleID() ) {
 				$nav_urls['recentchangeslinked'] = array(
-					'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalUrl()
+					'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalURL()
 				);
 			}
 		}
@@ -1243,11 +1280,14 @@ class SkinTemplate extends Skin {
 				);
 			}
 
-			$sur = new UserrightsPage;
-			if ( $sur->userCanExecute( $this->getUser() ) ) {
-				$nav_urls['userrights'] = array(
-					'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
-				);
+			if ( !$user->isAnon() ) {
+				$sur = new UserrightsPage;
+				$sur->setContext( $this->getContext() );
+				if ( $sur->userCanExecute( $this->getUser() ) ) {
+					$nav_urls['userrights'] = array(
+						'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
+					);
+				}
 			}
 		}
 
@@ -1263,10 +1303,6 @@ class SkinTemplate extends Skin {
 	function getNameSpaceKey() {
 		return $this->getTitle()->getNamespaceKey();
 	}
-
-	public function commonPrintStylesheet() {
-		return false;
-	}
 }
 
 /**
@@ -1292,6 +1328,21 @@ abstract class QuickTemplate {
 		$this->data[$name] = $value;
 	}
 
+	/**
+	 * Gets the template data requested
+	 * @since 1.22
+	 * @param string $name Key for the data
+	 * @param mixed $default Optional default (or null)
+	 * @return mixed The value of the data requested or the deafult
+	 */
+	public function get( $name, $default = null ) {
+		if ( isset( $this->data[$name] ) ) {
+			return $this->data[$name];
+		} else {
+			return $default;
+		}
+	}
+
 	/**
 	 * @param $name
 	 * @param $value
@@ -1322,8 +1373,10 @@ abstract class QuickTemplate {
 
 	/**
 	 * @private
+	 * @deprecated since 1.21; use Xml::encodeJsVar() or Xml::encodeJsCall() instead
 	 */
 	function jstext( $str ) {
+		wfDeprecated( __METHOD__, '1.21' );
 		echo Xml::escapeJsString( $this->data[$str] );
 	}
 
@@ -1492,7 +1545,7 @@ abstract class BaseTemplate extends QuickTemplate {
 	 */
 	function getPersonalTools() {
 		$personal_tools = array();
-		foreach ( $this->data['personal_urls'] as $key => $plink ) {
+		foreach ( $this->get( 'personal_urls' ) as $key => $plink ) {
 			# The class on a personal_urls item is meant to go on the <a> instead
 			# of the <li> so we have to use a single item "links" array instead
 			# of using most of the personal_url's keys directly.
@@ -1506,8 +1559,9 @@ abstract class BaseTemplate extends QuickTemplate {
 				$ptool['active'] = $plink['active'];
 			}
 			foreach ( array( 'href', 'class', 'text' ) as $k ) {
-				if ( isset( $plink[$k] ) )
+				if ( isset( $plink[$k] ) ) {
 					$ptool['links'][0][$k] = $plink[$k];
+				}
 			}
 			$personal_tools[$key] = $ptool;
 		}
@@ -1546,39 +1600,39 @@ abstract class BaseTemplate extends QuickTemplate {
 			case 'SEARCH':
 				// Search is a special case, skins should custom implement this
 				$boxes[$boxName] = array(
-					'id'        => 'p-search',
-					'header'    => $this->getMsg( 'search' )->text(),
+					'id' => 'p-search',
+					'header' => $this->getMsg( 'search' )->text(),
 					'generated' => false,
-					'content'   => true,
+					'content' => true,
 				);
 				break;
 			case 'TOOLBOX':
 				$msgObj = $this->getMsg( 'toolbox' );
 				$boxes[$boxName] = array(
-					'id'        => 'p-tb',
-					'header'    => $msgObj->exists() ? $msgObj->text() : 'toolbox',
+					'id' => 'p-tb',
+					'header' => $msgObj->exists() ? $msgObj->text() : 'toolbox',
 					'generated' => false,
-					'content'   => $this->getToolbox(),
+					'content' => $this->getToolbox(),
 				);
 				break;
 			case 'LANGUAGES':
 				if ( $this->data['language_urls'] ) {
 					$msgObj = $this->getMsg( 'otherlanguages' );
 					$boxes[$boxName] = array(
-						'id'        => 'p-lang',
-						'header'    => $msgObj->exists() ? $msgObj->text() : 'otherlanguages',
+						'id' => 'p-lang',
+						'header' => $msgObj->exists() ? $msgObj->text() : 'otherlanguages',
 						'generated' => false,
-						'content'   => $this->data['language_urls'],
+						'content' => $this->data['language_urls'],
 					);
 				}
 				break;
 			default:
 				$msgObj = $this->getMsg( $boxName );
 				$boxes[$boxName] = array(
-					'id'        => "p-$boxName",
-					'header'    => $msgObj->exists() ? $msgObj->text() : $boxName,
+					'id' => "p-$boxName",
+					'header' => $msgObj->exists() ? $msgObj->text() : $boxName,
 					'generated' => true,
-					'content'   => $content,
+					'content' => $content,
 				);
 				break;
 			}
@@ -1618,10 +1672,10 @@ abstract class BaseTemplate extends QuickTemplate {
 		} else {
 			if ( $hookContents ) {
 				$boxes['TOOLBOXEND'] = array(
-					'id'        => 'p-toolboxend',
-					'header'    => $boxes['TOOLBOX']['header'],
+					'id' => 'p-toolboxend',
+					'header' => $boxes['TOOLBOX']['header'],
 					'generated' => false,
-					'content'   => "<ul>{$hookContents}</ul>",
+					'content' => "<ul>{$hookContents}</ul>",
 				);
 				// HACK: Make sure that TOOLBOXEND is sorted next to TOOLBOX
 				$boxes2 = array();
@@ -1663,6 +1717,10 @@ abstract class BaseTemplate extends QuickTemplate {
 	 * on the link) is present it will be used to generate a tooltip and
 	 * accesskey for the link.
 	 *
+	 * The keys "context" and "primary" are ignored; these keys are used
+	 * internally by skins and are not supposed to be included in the HTML
+	 * output.
+	 *
 	 * If you don't want an accesskey, set $item['tooltiponly'] = true;
 	 *
 	 * @param array $options can be used to affect the output of a link.
@@ -1703,7 +1761,7 @@ abstract class BaseTemplate extends QuickTemplate {
 
 		if ( isset( $item['href'] ) || isset( $options['link-fallback'] ) ) {
 			$attrs = $item;
-			foreach ( array( 'single-id', 'text', 'msg', 'tooltiponly' ) as $k ) {
+			foreach ( array( 'single-id', 'text', 'msg', 'tooltiponly', 'context', 'primary' ) as $k ) {
 				unset( $attrs[$k] );
 			}
 
@@ -1807,14 +1865,15 @@ abstract class BaseTemplate extends QuickTemplate {
 		$realAttrs = array(
 			'type' => 'search',
 			'name' => 'search',
-			'value' => isset( $this->data['search'] ) ? $this->data['search'] : '',
+			'placeholder' => wfMessage( 'searchsuggest-search' )->text(),
+			'value' => $this->get( 'search', '' ),
 		);
 		$realAttrs = array_merge( $realAttrs, Linker::tooltipAndAccesskeyAttribs( 'search' ), $attrs );
 		return Html::element( 'input', $realAttrs );
 	}
 
 	function makeSearchButton( $mode, $attrs = array() ) {
-		switch( $mode ) {
+		switch ( $mode ) {
 			case 'go':
 			case 'fulltext':
 				$realAttrs = array(
@@ -1866,14 +1925,14 @@ abstract class BaseTemplate extends QuickTemplate {
 	 * @return array|mixed
 	 */
 	function getFooterLinks( $option = null ) {
-		$footerlinks = $this->data['footerlinks'];
+		$footerlinks = $this->get( 'footerlinks' );
 
 		// Reduce footer links down to only those which are being used
 		$validFooterLinks = array();
-		foreach( $footerlinks as $category => $links ) {
+		foreach ( $footerlinks as $category => $links ) {
 			$validFooterLinks[$category] = array();
-			foreach( $links as $link ) {
-				if( isset( $this->data[$link] ) && $this->data[$link] ) {
+			foreach ( $links as $link ) {
+				if ( isset( $this->data[$link] ) && $this->data[$link] ) {
 					$validFooterLinks[$category][] = $link;
 				}
 			}
@@ -1906,7 +1965,7 @@ abstract class BaseTemplate extends QuickTemplate {
 	 */
 	function getFooterIcons( $option = null ) {
 		// Generate additional footer icons
-		$footericons = $this->data['footericons'];
+		$footericons = $this->get( 'footericons' );
 
 		if ( $option == 'icononly' ) {
 			// Unset any icons which don't have an image
@@ -1939,9 +1998,10 @@ abstract class BaseTemplate extends QuickTemplate {
 	 * body and html tags.
 	 */
 	function printTrail() { ?>
+<?php echo MWDebug::getDebugHTML( $this->getSkin()->getContext() ); ?>
 <?php $this->html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?>
 <?php $this->html( 'reporttime' ) ?>
-<?php echo MWDebug::getDebugHTML( $this->getSkin()->getContext() );
+<?php
 	}
 
 }
diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php
index c32738f8..a6195fc4 100644
--- a/includes/SpecialPage.php
+++ b/includes/SpecialPage.php
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class SpecialPage {
-
 	// The canonical name of this special page
 	// Also used for the default <h1> heading, @see getDescription()
 	protected $mName;
@@ -305,12 +304,14 @@ class SpecialPage {
 	 *     If you override execute(), you can recover the default behavior with userCanExecute()
 	 *     and displayRestrictionError()
 	 *
-	 * @param string $name name of the special page, as seen in links and URLs
-	 * @param string $restriction user right required, e.g. "block" or "delete"
-	 * @param bool $listed whether the page is listed in Special:Specialpages
-	 * @param $function Callback|Bool: function called by execute(). By default it is constructed from $name
-	 * @param string $file file which is included by execute(). It is also constructed from $name by default
-	 * @param bool $includable whether the page can be included in normal pages
+	 * @param string $name Name of the special page, as seen in links and URLs
+	 * @param string $restriction User right required, e.g. "block" or "delete"
+	 * @param bool $listed Whether the page is listed in Special:Specialpages
+	 * @param Callback|Bool $function Function called by execute(). By default
+	 * it is constructed from $name
+	 * @param string $file File which is included by execute(). It is also
+	 * constructed from $name by default
+	 * @param bool $includable Whether the page can be included in normal pages
 	 */
 	public function __construct(
 		$name = '', $restriction = '', $listed = true,
@@ -322,12 +323,14 @@ class SpecialPage {
 	/**
 	 * Do the real work for the constructor, mainly so __call() can intercept
 	 * calls to SpecialPage()
-	 * @param string $name name of the special page, as seen in links and URLs
-	 * @param string $restriction user right required, e.g. "block" or "delete"
-	 * @param bool $listed whether the page is listed in Special:Specialpages
-	 * @param $function Callback|Bool: function called by execute(). By default it is constructed from $name
-	 * @param string $file file which is included by execute(). It is also constructed from $name by default
-	 * @param bool $includable whether the page can be included in normal pages
+	 * @param string $name Name of the special page, as seen in links and URLs
+	 * @param string $restriction User right required, e.g. "block" or "delete"
+	 * @param bool $listed Whether the page is listed in Special:Specialpages
+	 * @param Callback|Bool $function Function called by execute(). By default
+	 * it is constructed from $name
+	 * @param string $file File which is included by execute(). It is also
+	 * constructed from $name by default
+	 * @param bool $includable Whether the page can be included in normal pages
 	 */
 	private function init( $name, $restriction, $listed, $function, $file, $includable ) {
 		$this->mName = $name;
@@ -445,7 +448,10 @@ class SpecialPage {
 	 * @return Mixed
 	 * @deprecated since 1.18
 	 */
-	function name( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mName, $x ); }
+	function name( $x = null ) {
+		wfDeprecated( __METHOD__, '1.18' );
+		return wfSetVar( $this->mName, $x );
+	}
 
 	/**
 	 * These mutators are very evil, as the relevant variables should not mutate.  So
@@ -454,7 +460,10 @@ class SpecialPage {
 	 * @return Mixed
 	 * @deprecated since 1.18
 	 */
-	function restriction( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mRestriction, $x ); }
+	function restriction( $x = null ) {
+		wfDeprecated( __METHOD__, '1.18' );
+		return wfSetVar( $this->mRestriction, $x );
+	}
 
 	/**
 	 * These mutators are very evil, as the relevant variables should not mutate.  So
@@ -463,7 +472,10 @@ class SpecialPage {
 	 * @return Mixed
 	 * @deprecated since 1.18
 	 */
-	function func( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mFunction, $x ); }
+	function func( $x = null ) {
+		wfDeprecated( __METHOD__, '1.18' );
+		return wfSetVar( $this->mFunction, $x );
+	}
 
 	/**
 	 * These mutators are very evil, as the relevant variables should not mutate.  So
@@ -472,7 +484,10 @@ class SpecialPage {
 	 * @return Mixed
 	 * @deprecated since 1.18
 	 */
-	function file( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mFile, $x ); }
+	function file( $x = null ) {
+		wfDeprecated( __METHOD__, '1.18' );
+		return wfSetVar( $this->mFile, $x );
+	}
 
 	/**
 	 * These mutators are very evil, as the relevant variables should not mutate.  So
@@ -481,7 +496,10 @@ class SpecialPage {
 	 * @return Mixed
 	 * @deprecated since 1.18
 	 */
-	function includable( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mIncludable, $x ); }
+	function includable( $x = null ) {
+		wfDeprecated( __METHOD__, '1.18' );
+		return wfSetVar( $this->mIncludable, $x );
+	}
 
 	/**
 	 * Whether the special page is being evaluated via transclusion
@@ -535,7 +553,7 @@ class SpecialPage {
 	 *   pages?
 	 */
 	public function isRestricted() {
-		// DWIM: If all anons can do something, then it is not restricted
+		// DWIM: If anons can do something, then it is not restricted
 		return $this->mRestriction != '' && !User::groupHasPermission( '*', $this->mRestriction );
 	}
 
@@ -661,7 +679,7 @@ class SpecialPage {
 		$func = $this->mFunction;
 		// only load file if the function does not exist
 		if ( !is_callable( $func ) && $this->mFile ) {
-			require_once( $this->mFile );
+			require_once $this->mFile;
 		}
 		$this->outputHeader();
 		call_user_func( $func, $subPage, $this );
@@ -734,7 +752,8 @@ class SpecialPage {
 		if ( $this->mContext instanceof IContextSource ) {
 			return $this->mContext;
 		} else {
-			wfDebug( __METHOD__ . " called and \$mContext is null. Return RequestContext::getMain(); for sanity\n" );
+			wfDebug( __METHOD__ . " called and \$mContext is null. " .
+				"Return RequestContext::getMain(); for sanity\n" );
 			return RequestContext::getMain();
 		}
 	}
@@ -782,7 +801,7 @@ class SpecialPage {
 	/**
 	 * Shortcut to get user's language
 	 *
-	 * @deprecated 1.19 Use getLanguage instead
+	 * @deprecated since 1.19 Use getLanguage instead
 	 * @return Language
 	 * @since 1.18
 	 */
@@ -842,11 +861,11 @@ class SpecialPage {
 	protected function addFeedLinks( $params ) {
 		global $wgFeedClasses;
 
-		$feedTemplate = wfScript( 'api' ) . '?';
+		$feedTemplate = wfScript( 'api' );
 
 		foreach ( $wgFeedClasses as $format => $class ) {
 			$theseParams = $params + array( 'feedformat' => $format );
-			$url = $feedTemplate . wfArrayToCgi( $theseParams );
+			$url = wfAppendQuery( $feedTemplate, $theseParams );
 			$this->getOutput()->addFeedLink( $format, $url );
 		}
 	}
@@ -909,6 +928,11 @@ class SpecialPage {
  * a new structure for SpecialPages
  */
 abstract class FormSpecialPage extends SpecialPage {
+	/**
+	 * The sub-page of the special page.
+	 * @var string
+	 */
+	protected $par = null;
 
 	/**
 	 * Get an HTMLForm descriptor array
@@ -917,17 +941,27 @@ abstract class FormSpecialPage extends SpecialPage {
 	abstract protected function getFormFields();
 
 	/**
-	 * Add pre- or post-text to the form
+	 * Add pre-text to the form
 	 * @return String HTML which will be sent to $form->addPreText()
 	 */
-	protected function preText() { return ''; }
-	protected function postText() { return ''; }
+	protected function preText() {
+		return '';
+	}
+
+	/**
+	 * Add post-text to the form
+	 * @return String HTML which will be sent to $form->addPostText()
+	 */
+	protected function postText() {
+		return '';
+	}
 
 	/**
 	 * Play with the HTMLForm if you need to more substantially
 	 * @param $form HTMLForm
 	 */
-	protected function alterForm( HTMLForm $form ) {}
+	protected function alterForm( HTMLForm $form ) {
+	}
 
 	/**
 	 * Get message prefix for HTMLForm
@@ -948,9 +982,18 @@ abstract class FormSpecialPage extends SpecialPage {
 
 		$form = new HTMLForm( $this->fields, $this->getContext(), $this->getMessagePrefix() );
 		$form->setSubmitCallback( array( $this, 'onSubmit' ) );
-		$form->setWrapperLegend( $this->msg( $this->getMessagePrefix() . '-legend' ) );
-		$form->addHeaderText(
-			$this->msg( $this->getMessagePrefix() . '-text' )->parseAsBlock() );
+		// If the form is a compact vertical form, then don't output this ugly
+		// fieldset surrounding it.
+		// XXX Special pages can setDisplayFormat to 'vform' in alterForm(), but that
+		// is called after this.
+		if ( !$form->isVForm() ) {
+			$form->setWrapperLegendMsg( $this->getMessagePrefix() . '-legend' );
+		}
+
+		$headerMsg = $this->msg( $this->getMessagePrefix() . '-text' );
+		if ( !$headerMsg->isDisabled() ) {
+			$form->addHeaderText( $headerMsg->parseAsBlock() );
+		}
 
 		// Retain query parameters (uselang etc)
 		$params = array_diff_key(
@@ -977,8 +1020,10 @@ abstract class FormSpecialPage extends SpecialPage {
 	/**
 	 * Do something exciting on successful processing of the form, most likely to show a
 	 * confirmation message
+	 * @since 1.22 Default is to do nothing
 	 */
-	abstract public function onSuccess();
+	public function onSuccess() {
+	}
 
 	/**
 	 * Basic SpecialPage workflow: get a form, send it to the user; get some data back,
@@ -1000,9 +1045,11 @@ abstract class FormSpecialPage extends SpecialPage {
 
 	/**
 	 * Maybe do something interesting with the subpage parameter
-	 * @param $par String
+	 * @param string $par
 	 */
-	protected function setParameter( $par ) {}
+	protected function setParameter( $par ) {
+		$this->par = $par;
+	}
 
 	/**
 	 * Called from execute() to check if the given user can perform this action.
@@ -1090,17 +1137,16 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
 		$query = $this->getRedirectQuery();
 		// Redirect to a page title with possible query parameters
 		if ( $redirect instanceof Title ) {
-			$url = $redirect->getFullUrl( $query );
+			$url = $redirect->getFullURL( $query );
 			$this->getOutput()->redirect( $url );
 			return $redirect;
-		// Redirect to index.php with query parameters
 		} elseif ( $redirect === true ) {
-			global $wgScript;
-			$url = $wgScript . '?' . wfArrayToCgi( $query );
+			// Redirect to index.php with query parameters
+			$url = wfAppendQuery( wfScript( 'index' ), $query );
 			$this->getOutput()->redirect( $url );
 			return $redirect;
 		} else {
-			$class = __CLASS__;
+			$class = get_class( $this );
 			throw new MWException( "RedirectSpecialPage $class doesn't redirect!" );
 		}
 	}
@@ -1140,6 +1186,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
 }
 
 abstract class SpecialRedirectToSpecial extends RedirectSpecialPage {
+	// @todo FIXME: Visibility must be declared
 	var $redirName, $redirSubpage;
 
 	function __construct(
@@ -1186,7 +1233,16 @@ class SpecialListBots extends SpecialRedirectToSpecial {
  */
 class SpecialCreateAccount extends SpecialRedirectToSpecial {
 	function __construct() {
-		parent::__construct( 'CreateAccount', 'Userlogin', 'signup', array( 'uselang' ) );
+		parent::__construct( 'CreateAccount', 'Userlogin', 'signup', array( 'returnto', 'returntoquery', 'uselang' ) );
+	}
+
+	// No reason to hide this link on Special:Specialpages
+	public function isListed() {
+		return true;
+	}
+
+	protected function getGroupName() {
+		return 'login';
 	}
 }
 /**
@@ -1216,7 +1272,7 @@ class SpecialCreateAccount extends SpecialRedirectToSpecial {
  * - limit, offset: Useful for linking to history of one's own user page or
  * user talk page. For example, this would be a link to "the last edit to your
  * user talk page in the year 2010":
- * http://en.wikipedia.org/w/index.php?title=Special:MyPage&offset=20110000000000&limit=1&action=history
+ * http://en.wikipedia.org/wiki/Special:MyPage?offset=20110000000000&limit=1&action=history
  *
  * - feed: would allow linking to the current user's RSS feed for their user
  * talk page:
@@ -1270,9 +1326,9 @@ abstract class RedirectSpecialArticle extends RedirectSpecialPage {
 			'action',
 			'redirect', 'rdfrom',
 			# Options for preloaded edits
-			'preload', 'editintro', 'preloadtitle', 'summary',
+			'preload', 'editintro', 'preloadtitle', 'summary', 'nosummary',
 			# Options for overriding user settings
-			'preview', 'internaledit', 'externaledit', 'mode',
+			'preview', 'internaledit', 'externaledit', 'mode', 'minor', 'watchthis',
 			# Options for history/diffs
 			'section', 'oldid', 'diff', 'dir',
 			'limit', 'offset', 'feed',
@@ -1345,7 +1401,7 @@ class SpecialMycontributions extends RedirectSpecialPage {
 class SpecialMyuploads extends RedirectSpecialPage {
 	function __construct() {
 		parent::__construct( 'Myuploads' );
-		$this->mAllowedRedirectParams = array( 'limit' );
+		$this->mAllowedRedirectParams = array( 'limit', 'ilshowall', 'ilsearch' );
 	}
 
 	function getRedirect( $subpage ) {
@@ -1353,6 +1409,22 @@ class SpecialMyuploads extends RedirectSpecialPage {
 	}
 }
 
+/**
+ * Redirect Special:Listfiles?user=$wgUser&ilshowall=true
+ */
+class SpecialAllMyUploads extends RedirectSpecialPage {
+	function __construct() {
+		parent::__construct( 'AllMyUploads' );
+		$this->mAllowedRedirectParams = array( 'limit', 'ilsearch' );
+	}
+
+	function getRedirect( $subpage ) {
+		$this->mAddedRedirectParams['ilshowall'] = 1;
+		return SpecialPage::getTitleFor( 'Listfiles', $this->getUser()->getName() );
+	}
+}
+
+
 /**
  * Redirect from Special:PermanentLink/### to index.php?oldid=###
  */
diff --git a/includes/SpecialPageFactory.php b/includes/SpecialPageFactory.php
index 7368ab77..11edc8ac 100644
--- a/includes/SpecialPageFactory.php
+++ b/includes/SpecialPageFactory.php
@@ -78,7 +78,6 @@ class SpecialPageFactory {
 		'Allpages'                  => 'SpecialAllpages',
 		'Prefixindex'               => 'SpecialPrefixindex',
 		'Categories'                => 'SpecialCategories',
-		'Disambiguations'           => 'DisambiguationsPage',
 		'Listredirects'             => 'ListredirectsPage',
 		'PagesWithProp'             => 'SpecialPagesWithProp',
 
@@ -94,6 +93,7 @@ class SpecialPageFactory {
 		'PasswordReset'             => 'SpecialPasswordReset',
 		'DeletedContributions'      => 'DeletedContributionsPage',
 		'Preferences'               => 'SpecialPreferences',
+		'ResetTokens'               => 'SpecialResetTokens',
 		'Contributions'             => 'SpecialContributions',
 		'Listgrouprights'           => 'SpecialListGroupRights',
 		'Listusers'                 => 'SpecialListUsers',
@@ -130,6 +130,7 @@ class SpecialPageFactory {
 		// Redirecting special pages
 		'LinkSearch'                => 'LinkSearchPage',
 		'Randompage'                => 'Randompage',
+		'RandomInCategory'          => 'SpecialRandomInCategory',
 		'Randomredirect'            => 'SpecialRandomredirect',
 
 		// High use pages
@@ -154,14 +155,15 @@ class SpecialPageFactory {
 
 		// Unlisted / redirects
 		'Blankpage'                 => 'SpecialBlankpage',
-		'Blockme'                   => 'SpecialBlockme',
 		'Emailuser'                 => 'SpecialEmailUser',
 		'Movepage'                  => 'MovePageForm',
 		'Mycontributions'           => 'SpecialMycontributions',
 		'Mypage'                    => 'SpecialMypage',
 		'Mytalk'                    => 'SpecialMytalk',
 		'Myuploads'                 => 'SpecialMyuploads',
+		'AllMyUploads'              => 'SpecialAllMyUploads',
 		'PermanentLink'             => 'SpecialPermanentLink',
+		'Redirect'                  => 'SpecialRedirect',
 		'Revisiondelete'            => 'SpecialRevisionDelete',
 		'Specialpages'              => 'SpecialSpecialpages',
 		'Userlogout'                => 'SpecialUserlogout',
@@ -200,7 +202,7 @@ class SpecialPageFactory {
 				self::$mList['ChangeEmail'] = 'SpecialChangeEmail';
 			}
 
-			if( $wgEnableJavaScriptTest ) {
+			if ( $wgEnableJavaScriptTest ) {
 				self::$mList['JavaScriptTest'] = 'SpecialJavaScriptTest';
 			}
 
@@ -286,7 +288,7 @@ class SpecialPageFactory {
 	 *
 	 * @param $page Mixed: SpecialPage or string
 	 * @param $group String
-	 * @deprecated 1.21 Override SpecialPage::getGroupName
+	 * @deprecated since 1.21 Override SpecialPage::getGroupName
 	 */
 	public static function setGroup( $page, $group ) {
 		wfDeprecated( __METHOD__, '1.21' );
@@ -301,7 +303,7 @@ class SpecialPageFactory {
 	 *
 	 * @param $page SpecialPage
 	 * @return String
-	 * @deprecated 1.21 Use SpecialPage::getFinalGroupName
+	 * @deprecated since 1.21 Use SpecialPage::getFinalGroupName
 	 */
 	public static function getGroup( &$page ) {
 		wfDeprecated( __METHOD__, '1.21' );
@@ -464,9 +466,8 @@ class SpecialPageFactory {
 			if ( $name != $page->getLocalName() && !$context->getRequest()->wasPosted() ) {
 				$query = $context->getRequest()->getQueryValues();
 				unset( $query['title'] );
-				$query = wfArrayToCgi( $query );
 				$title = $page->getTitle( $par );
-				$url = $title->getFullUrl( $query );
+				$url = $title->getFullURL( $query );
 				$context->getOutput()->redirect( $url );
 				wfProfileOut( __METHOD__ );
 				return $title;
diff --git a/includes/SqlDataUpdate.php b/includes/SqlDataUpdate.php
index 79dcdc59..51188d85 100644
--- a/includes/SqlDataUpdate.php
+++ b/includes/SqlDataUpdate.php
@@ -56,7 +56,7 @@ abstract class SqlDataUpdate extends DataUpdate {
 			$this->mOptions = array( 'FOR UPDATE' );
 		}
 
-		// @todo: get connection only when it's needed? make sure that doesn't break anything, especially transactions!
+		// @todo get connection only when it's needed? make sure that doesn't break anything, especially transactions!
 		$this->mDb = wfGetDB( DB_MASTER );
 
 		$this->mWithTransaction = $withTransaction;
diff --git a/includes/StatCounter.php b/includes/StatCounter.php
new file mode 100644
index 00000000..1373f3d5
--- /dev/null
+++ b/includes/StatCounter.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * @defgroup StatCounter StatCounter
+ *
+ * StatCounter is used to increment arbitrary keys for profiling reasons.
+ * The key/values are persisted in several possible ways (see $wgStatsMethod).
+ */
+
+/**
+ * Aggregator for wfIncrStats() that batches updates per request.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup StatCounter
+ * @author Aaron Schulz
+ */
+
+/**
+ * Aggregator for wfIncrStats() that batches updates per request.
+ * This avoids spamming the collector many times for the same key.
+ *
+ * @ingroup StatCounter
+ */
+class StatCounter {
+	/** @var Array */
+	protected $deltas = array(); // (key => count)
+
+	protected function __construct() {}
+
+	/**
+	 * @return StatCounter
+	 */
+	public static function singleton() {
+		static $instance = null;
+		if ( !$instance ) {
+			$instance = new self();
+		}
+		return $instance;
+	}
+
+	/**
+	 * Increment a key by delta $count
+	 *
+	 * @param string $key
+	 * @param integer $count
+	 * @return void
+	 */
+	public function incr( $key, $count = 1 ) {
+		$this->deltas[$key] = isset( $this->deltas[$key] ) ? $this->deltas[$key] : 0;
+		$this->deltas[$key] += $count;
+		if ( PHP_SAPI === 'cli' ) {
+			$this->flush();
+		}
+	}
+
+	/**
+	 * Flush all pending deltas to persistent storage
+	 *
+	 * @return void
+	 */
+	public function flush() {
+		global $wgStatsMethod;
+
+		$deltas = array_filter( $this->deltas ); // remove 0 valued entries
+		if ( $wgStatsMethod === 'udp' ) {
+			$this->sendDeltasUDP( $deltas );
+		} elseif ( $wgStatsMethod === 'cache' ) {
+			$this->sendDeltasMemc( $deltas );
+		} else {
+			// disabled
+		}
+		$this->deltas = array();
+	}
+
+	/**
+	 * @param array $deltas
+	 * @return void
+	 */
+	protected function sendDeltasUDP( array $deltas ) {
+		global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID,
+			$wgStatsFormatString;
+
+		$id = strlen( $wgAggregateStatsID ) ? $wgAggregateStatsID : wfWikiID();
+
+		$lines = array();
+		foreach ( $deltas as $key => $count ) {
+			$lines[] = sprintf( $wgStatsFormatString, $id, $count, $key );
+		}
+
+		if ( count( $lines ) ) {
+			static $socket = null;
+			if ( !$socket ) {
+				$socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
+			}
+			$packet = '';
+			$packets = array();
+			foreach ( $lines as $line ) {
+				if ( ( strlen( $packet ) + strlen( $line ) ) > 1450 ) {
+					$packets[] = $packet;
+					$packet = '';
+				}
+				$packet .= $line;
+			}
+			if ( $packet != '' ) {
+				$packets[] = $packet;
+			}
+			foreach ( $packets as $packet ) {
+				wfSuppressWarnings();
+				socket_sendto(
+					$socket,
+					$packet,
+					strlen( $packet ),
+					0,
+					$wgUDPProfilerHost,
+					$wgUDPProfilerPort
+				);
+				wfRestoreWarnings();
+			}
+		}
+	}
+
+	/**
+	 * @param array $deltas
+	 * @return void
+	 */
+	protected function sendDeltasMemc( array $deltas ) {
+		global $wgMemc;
+
+		foreach ( $deltas as $key => $count ) {
+			$ckey = wfMemcKey( 'stats', $key );
+			if ( $wgMemc->incr( $ckey, $count ) === null ) {
+				$wgMemc->add( $ckey, $count );
+			}
+		}
+	}
+}
diff --git a/includes/Status.php b/includes/Status.php
index 5d6236f7..928f8ebd 100644
--- a/includes/Status.php
+++ b/includes/Status.php
@@ -31,6 +31,11 @@
  * An operation which is not OK should have errors so that the user can be
  * informed as to what went wrong. Calling the fatal() function sets an error
  * message and simultaneously switches off the OK flag.
+ *
+ * The recommended pattern for Status objects is to return a Status object
+ * unconditionally, i.e. both on success and on failure -- so that the
+ * developer of the calling code is reminded that the function can fail, and
+ * so that a lack of error-handling will be explicit.
  */
 class Status {
 	var $ok = true;
@@ -183,15 +188,18 @@ class Status {
 			}
 		}
 		if ( count( $this->errors ) == 1 ) {
-			$s = $this->getErrorMessage( $this->errors[0] );
+			$s = $this->getErrorMessage( $this->errors[0] )->plain();
 			if ( $shortContext ) {
 				$s = wfMessage( $shortContext, $s )->plain();
 			} elseif ( $longContext ) {
 				$s = wfMessage( $longContext, "* $s\n" )->plain();
 			}
 		} else {
-			$s = '* '. implode( "\n* ",
-				$this->getErrorMessageArray( $this->errors ) ) . "\n";
+			$errors = $this->getErrorMessageArray( $this->errors );
+			foreach ( $errors as &$error ) {
+				$error = $error->plain();
+			}
+			$s = '* ' . implode( "\n* ", $errors ) . "\n";
 			if ( $longContext ) {
 				$s = wfMessage( $longContext, $s )->plain();
 			} elseif ( $shortContext ) {
@@ -201,6 +209,56 @@ class Status {
 		return $s;
 	}
 
+	/**
+	 * Get the error list as a Message object
+	 *
+	 * @param string $shortContext a short enclosing context message name, to
+	 *        be used when there is a single error
+	 * @param string $longContext a long enclosing context message name, for a list
+	 * @return Message
+	 */
+	function getMessage( $shortContext = false, $longContext = false ) {
+		if ( count( $this->errors ) == 0 ) {
+			if ( $this->ok ) {
+				$this->fatal( 'internalerror_info',
+					__METHOD__ . " called for a good result, this is incorrect\n" );
+			} else {
+				$this->fatal( 'internalerror_info',
+					__METHOD__ . ": Invalid result object: no error text but not OK\n" );
+			}
+		}
+		if ( count( $this->errors ) == 1 ) {
+			$s = $this->getErrorMessage( $this->errors[0] );
+			if ( $shortContext ) {
+				$s = wfMessage( $shortContext, $s );
+			} elseif ( $longContext ) {
+				$wrapper = new RawMessage( "* \$1\n" );
+				$wrapper->params( $s )->parse();
+				$s = wfMessage( $longContext, $wrapper );
+			}
+		} else {
+			$msgs =  $this->getErrorMessageArray( $this->errors );
+			$msgCount = count( $msgs );
+
+			if ( $shortContext ) {
+				$msgCount++;
+			}
+
+			$wrapper = new RawMessage( '* $' . implode( "\n* \$", range( 1, $msgCount ) ) );
+			$s = $wrapper->params( $msgs )->parse();
+
+			if ( $longContext ) {
+				$s = wfMessage( $longContext, $wrapper );
+			} elseif ( $shortContext ) {
+				$wrapper = new RawMessage( "\n\$1\n", $wrapper );
+				$wrapper->parse();
+				$s = wfMessage( $shortContext, $wrapper );
+			}
+		}
+
+		return $s;
+	}
+
 	/**
 	 * Return the message for a single error.
 	 * @param $error Mixed With an array & two values keyed by
@@ -212,7 +270,7 @@ class Status {
 	 */
 	protected function getErrorMessage( $error ) {
 		if ( is_array( $error ) ) {
-			if( isset( $error['message'] ) && $error['message'] instanceof Message ) {
+			if ( isset( $error['message'] ) && $error['message'] instanceof Message ) {
 				$msg = $error['message'];
 			} elseif ( isset( $error['message'] ) && isset( $error['params'] ) ) {
 				$msg = wfMessage( $error['message'],
@@ -225,7 +283,7 @@ class Status {
 		} else {
 			$msg = wfMessage( $error );
 		}
-		return $msg->plain();
+		return $msg;
 	}
 
 	/**
@@ -234,7 +292,7 @@ class Status {
 	 *
 	 * @note: this does not perform a full wikitext to HTML conversion, it merely applies
 	 *        a message transformation.
-	 * @todo: figure out whether that is actually The Right Thing.
+	 * @todo figure out whether that is actually The Right Thing.
 	 */
 	public function getHTML( $shortContext = false, $longContext = false ) {
 		$text = $this->getWikiText( $shortContext, $longContext );
@@ -269,7 +327,8 @@ class Status {
 	/**
 	 * Get the list of errors (but not warnings)
 	 *
-	 * @return Array
+	 * @return array A list in which each entry is an array with a message key as its first element.
+	 *         The remaining array elements are the message parameters.
 	 */
 	function getErrorsArray() {
 		return $this->getStatusArray( "error" );
@@ -278,7 +337,8 @@ class Status {
 	/**
 	 * Get the list of warnings (but not errors)
 	 *
-	 * @return Array
+	 * @return array A list in which each entry is an array with a message key as its first element.
+	 *         The remaining array elements are the message parameters.
 	 */
 	function getWarningsArray() {
 		return $this->getStatusArray( "warning" );
@@ -294,9 +354,9 @@ class Status {
 		$result = array();
 		foreach ( $this->errors as $error ) {
 			if ( $error['type'] === $type ) {
-				if( $error['message'] instanceof Message ) {
-					$result[] = $error['message'];
-				} elseif( $error['params'] ) {
+				if ( $error['message'] instanceof Message ) {
+					$result[] = array_merge( array( $error['message']->getKey() ), $error['message']->getParams() );
+				} elseif ( $error['params'] ) {
 					$result[] = array_merge( array( $error['message'] ), $error['params'] );
 				} else {
 					$result[] = array( $error['message'] );
@@ -364,15 +424,6 @@ class Status {
 		return $replaced;
 	}
 
-	/**
-	 * Backward compatibility function for WikiError -> Status migration
-	 *
-	 * @return String
-	 */
-	public function getMessage() {
-		return $this->getWikiText();
-	}
-
 	/**
 	 * @return mixed
 	 */
diff --git a/includes/StreamFile.php b/includes/StreamFile.php
index f5e4acff..1ad643ac 100644
--- a/includes/StreamFile.php
+++ b/includes/StreamFile.php
@@ -42,6 +42,7 @@ class StreamFile {
 		wfProfileIn( __METHOD__ );
 
 		if ( FileBackend::isStoragePath( $fname ) ) { // sanity
+			wfProfileOut( __METHOD__ );
 			throw new MWException( __FUNCTION__ . " given storage path '$fname'." );
 		}
 
diff --git a/includes/StringUtils.php b/includes/StringUtils.php
index f4c98f1d..c1545e6e 100644
--- a/includes/StringUtils.php
+++ b/includes/StringUtils.php
@@ -38,6 +38,9 @@ class StringUtils {
 	 * unit testing our internal implementation.
 	 *
 	 * @since 1.21
+	 * @note In MediaWiki 1.21, this function did not provide proper UTF-8 validation.
+	 * In particular, the pure PHP code path did not in fact check for overlong forms.
+	 * Beware of this when backporting code to that version of MediaWiki.
 	 *
 	 * @param string $value String to check
 	 * @param boolean $disableMbstring Whether to use the pure PHP
@@ -47,26 +50,64 @@ class StringUtils {
 	 * @return boolean Whether the given $value is a valid UTF-8 encoded string
 	 */
 	static function isUtf8( $value, $disableMbstring = false ) {
+		$value = (string)$value;
 
-		if ( preg_match( '/[\x80-\xff]/', $value ) === 0 ) {
-			# no high bit set, this is pure ASCII which is de facto
-			# valid UTF-8
+		// If the mbstring extension is loaded, use it. However, before PHP 5.4, values above
+		// U+10FFFF are incorrectly allowed, so we have to check for them separately.
+		if ( !$disableMbstring && function_exists( 'mb_check_encoding' ) ) {
+			static $newPHP;
+			if ( $newPHP === null ) {
+				$newPHP = !mb_check_encoding( "\xf4\x90\x80\x80", 'UTF-8' );
+			}
+
+			return mb_check_encoding( $value, 'UTF-8' ) &&
+				( $newPHP || preg_match( "/\xf4[\x90-\xbf]|[\xf5-\xff]/S", $value ) === 0 );
+		}
+
+		if ( preg_match( "/[\x80-\xff]/S", $value ) === 0 ) {
+			// String contains only ASCII characters, has to be valid
 			return true;
 		}
 
-		if ( !$disableMbstring && function_exists( 'mb_check_encoding' ) ) {
-			return mb_check_encoding( $value, 'UTF-8' );
-		} else {
-			$hasUtf8 = preg_match( '/^(?>
-				  [\x00-\x7f]
-				| [\xc0-\xdf][\x80-\xbf]
-				| [\xe0-\xef][\x80-\xbf]{2}
-				| [\xf0-\xf7][\x80-\xbf]{3}
-				| [\xf8-\xfb][\x80-\xbf]{4}
-				| \xfc[\x84-\xbf][\x80-\xbf]{4}
-			)+$/x', $value );
-			return ($hasUtf8 > 0 );
+		// PCRE implements repetition using recursion; to avoid a stack overflow (and segfault)
+		// for large input, we check for invalid sequences (<= 5 bytes) rather than valid
+		// sequences, which can be as long as the input string is. Multiple short regexes are
+		// used rather than a single long regex for performance.
+		static $regexes;
+		if ( $regexes === null ) {
+			$cont = "[\x80-\xbf]";
+			$after = "(?!$cont)"; // "(?:[^\x80-\xbf]|$)" would work here
+			$regexes = array(
+				// Continuation byte at the start
+				"/^$cont/",
+
+				// ASCII byte followed by a continuation byte
+				"/[\\x00-\x7f]$cont/S",
+
+				// Illegal byte
+				"/[\xc0\xc1\xf5-\xff]/S",
+
+				// Invalid 2-byte sequence, or valid one then an extra continuation byte
+				"/[\xc2-\xdf](?!$cont$after)/S",
+
+				// Invalid 3-byte sequence, or valid one then an extra continuation byte
+				"/\xe0(?![\xa0-\xbf]$cont$after)/",
+				"/[\xe1-\xec\xee\xef](?!$cont{2}$after)/S",
+				"/\xed(?![\x80-\x9f]$cont$after)/",
+
+				// Invalid 4-byte sequence, or valid one then an extra continuation byte
+				"/\xf0(?![\x90-\xbf]$cont{2}$after)/",
+				"/[\xf1-\xf3](?!$cont{3}$after)/S",
+				"/\xf4(?![\x80-\x8f]$cont{2}$after)/",
+			);
 		}
+
+		foreach ( $regexes as $regex ) {
+			if ( preg_match( $regex, $value ) !== 0 ) {
+				return false;
+			}
+		}
+		return true;
 	}
 
 	/**
@@ -217,8 +258,8 @@ class StringUtils {
 	/**
 	 * More or less "markup-safe" explode()
 	 * Ignores any instances of the separator inside <...>
-	 * @param $separator String
-	 * @param $text String
+	 * @param string $separator
+	 * @param string $text
 	 * @return array
 	 */
 	static function explodeMarkup( $separator, $text ) {
@@ -233,7 +274,7 @@ class StringUtils {
 
 		// Explode, then put the replaced separators back in
 		$items = explode( $separator, $cleaned );
-		foreach( $items as $i => $str ) {
+		foreach ( $items as $i => $str ) {
 			$items[$i] = str_replace( $placeholder, $separator, $str );
 		}
 
@@ -244,8 +285,8 @@ class StringUtils {
 	 * Escape a string to make it suitable for inclusion in a preg_replace()
 	 * replacement parameter.
 	 *
-	 * @param $string String
-	 * @return String
+	 * @param string $string
+	 * @return string
 	 */
 	static function escapeRegexReplacement( $string ) {
 		$string = str_replace( '\\', '\\\\', $string );
@@ -256,8 +297,8 @@ class StringUtils {
 	/**
 	 * Workalike for explode() with limited memory usage.
 	 * Returns an Iterator
-	 * @param $separator
-	 * @param $subject
+	 * @param string $separator
+	 * @param string $subject
 	 * @return ArrayIterator|ExplodeIterator
 	 */
 	static function explode( $separator, $subject ) {
@@ -290,14 +331,14 @@ class RegexlikeReplacer extends Replacer {
 	var $r;
 
 	/**
-	 * @param $r string
+	 * @param string $r
 	 */
 	function __construct( $r ) {
 		$this->r = $r;
 	}
 
 	/**
-	 * @param $matches array
+	 * @param array $matches
 	 * @return string
 	 */
 	function replace( $matches ) {
@@ -318,7 +359,7 @@ class DoubleReplacer extends Replacer {
 	/**
 	 * @param $from
 	 * @param $to
-	 * @param $index int
+	 * @param int $index
 	 */
 	function __construct( $from, $to, $index = 0 ) {
 		$this->from = $from;
@@ -327,7 +368,7 @@ class DoubleReplacer extends Replacer {
 	}
 
 	/**
-	 * @param $matches array
+	 * @param array $matches
 	 * @return mixed
 	 */
 	function replace( $matches ) {
@@ -343,7 +384,7 @@ class HashtableReplacer extends Replacer {
 
 	/**
 	 * @param $table
-	 * @param $index int
+	 * @param int $index
 	 */
 	function __construct( $table, $index = 0 ) {
 		$this->table = $table;
@@ -351,7 +392,7 @@ class HashtableReplacer extends Replacer {
 	}
 
 	/**
-	 * @param $matches array
+	 * @param array $matches
 	 * @return mixed
 	 */
 	function replace( $matches ) {
@@ -389,6 +430,7 @@ class ReplacementArray {
 
 	/**
 	 * Set the whole replacement array at once
+	 * @param array $data
 	 */
 	function setArray( $data ) {
 		$this->data = $data;
@@ -404,8 +446,8 @@ class ReplacementArray {
 
 	/**
 	 * Set an element of the replacement array
-	 * @param $from string
-	 * @param $to string
+	 * @param string $from
+	 * @param string $to
 	 */
 	function setPair( $from, $to ) {
 		$this->data[$from] = $to;
@@ -413,7 +455,7 @@ class ReplacementArray {
 	}
 
 	/**
-	 * @param $data array
+	 * @param array $data
 	 */
 	function mergeArray( $data ) {
 		$this->data = array_merge( $this->data, $data );
@@ -421,7 +463,7 @@ class ReplacementArray {
 	}
 
 	/**
-	 * @param $other
+	 * @param ReplacementArray $other
 	 */
 	function merge( $other ) {
 		$this->data = array_merge( $this->data, $other->data );
@@ -429,7 +471,7 @@ class ReplacementArray {
 	}
 
 	/**
-	 * @param $from string
+	 * @param string $from
 	 */
 	function removePair( $from ) {
 		unset( $this->data[$from] );
@@ -437,31 +479,31 @@ class ReplacementArray {
 	}
 
 	/**
-	 * @param $data array
+	 * @param array $data
 	 */
 	function removeArray( $data ) {
-		foreach( $data as $from => $to ) {
+		foreach ( $data as $from => $to ) {
 			$this->removePair( $from );
 		}
 		$this->fss = false;
 	}
 
 	/**
-	 * @param $subject string
+	 * @param string $subject
 	 * @return string
 	 */
 	function replace( $subject ) {
 		if ( function_exists( 'fss_prep_replace' ) ) {
-			wfProfileIn( __METHOD__.'-fss' );
+			wfProfileIn( __METHOD__ . '-fss' );
 			if ( $this->fss === false ) {
 				$this->fss = fss_prep_replace( $this->data );
 			}
 			$result = fss_exec_replace( $this->fss, $subject );
-			wfProfileOut( __METHOD__.'-fss' );
+			wfProfileOut( __METHOD__ . '-fss' );
 		} else {
-			wfProfileIn( __METHOD__.'-strtr' );
+			wfProfileIn( __METHOD__ . '-strtr' );
 			$result = strtr( $subject, $this->data );
-			wfProfileOut( __METHOD__.'-strtr' );
+			wfProfileOut( __METHOD__ . '-strtr' );
 		}
 		return $result;
 	}
@@ -494,15 +536,15 @@ class ExplodeIterator implements Iterator {
 
 	/**
 	 * Construct a DelimIterator
-	 * @param $delim string
-	 * @param $s string
+	 * @param string $delim
+	 * @param string $subject
 	 */
-	function __construct( $delim, $s ) {
-		$this->subject = $s;
+	function __construct( $delim, $subject ) {
+		$this->subject = $subject;
 		$this->delim = $delim;
 
 		// Micro-optimisation (theoretical)
-		$this->subjectLength = strlen( $s );
+		$this->subjectLength = strlen( $subject );
 		$this->delimLength = strlen( $delim );
 
 		$this->rewind();
@@ -530,6 +572,9 @@ class ExplodeIterator implements Iterator {
 		return $this->current;
 	}
 
+	/**
+	 * @return int|bool Current position or boolean false if invalid
+	 */
 	function key() {
 		return $this->curPos;
 	}
diff --git a/includes/StubObject.php b/includes/StubObject.php
index f0a35740..a3970f34 100644
--- a/includes/StubObject.php
+++ b/includes/StubObject.php
@@ -25,6 +25,12 @@
  * their associated module code by deferring initialisation until the first
  * method call.
  *
+ * Note on reference parameters:
+ *
+ * If the called method takes any parameters by reference, the __call magic
+ * here won't work correctly. The solution is to unstub the object before
+ * calling the method.
+ *
  * Note on unstub loops:
  *
  * Unstub loops (infinite recursion) sometimes occur when a constructor calls
@@ -60,7 +66,21 @@ class StubObject {
 	 * @return Boolean: true if $obj is not an instance of StubObject class.
 	 */
 	static function isRealObject( $obj ) {
-		return is_object( $obj ) && !($obj instanceof StubObject);
+		return is_object( $obj ) && !$obj instanceof StubObject;
+	}
+
+	/**
+	 * Unstubs an object, if it is a stub object. Can be used to break a
+	 * infinite loop when unstubbing an object or to avoid reference parameter
+	 * breakage.
+	 *
+	 * @param $obj Object to check.
+	 * @return void
+	 */
+	static function unstub( $obj ) {
+		if ( $obj instanceof StubObject ) {
+			$obj->_unstub( 'unstub', 3 );
+		}
 	}
 
 	/**
@@ -113,7 +133,7 @@ class StubObject {
 	function _unstub( $name = '_unstub', $level = 2 ) {
 		static $recursionLevel = 0;
 
-		if ( !($GLOBALS[$this->mGlobal] instanceof StubObject) ) {
+		if ( !$GLOBALS[$this->mGlobal] instanceof StubObject ) {
 			return $GLOBALS[$this->mGlobal]; // already unstubbed.
 		}
 
@@ -122,6 +142,7 @@ class StubObject {
 			wfProfileIn( $fname );
 			$caller = wfGetCaller( $level );
 			if ( ++$recursionLevel > 2 ) {
+				wfProfileOut( $fname );
 				throw new MWException( "Unstub loop detected on call of \${$this->mGlobal}->$name from $caller\n" );
 			}
 			wfDebug( "Unstubbing \${$this->mGlobal} on call of \${$this->mGlobal}::$name from $caller\n" );
diff --git a/includes/Timestamp.php b/includes/Timestamp.php
index 1cf99a79..edcd6a88 100644
--- a/includes/Timestamp.php
+++ b/includes/Timestamp.php
@@ -45,26 +45,10 @@ class MWTimestamp {
 	);
 
 	/**
-	 * Different units for human readable timestamps.
-	 * @see MWTimestamp::getHumanTimestamp
+	 * The actual timestamp being wrapped (DateTime object).
+	 * @var DateTime
 	 */
-	private static $units = array(
-		"milliseconds" => 1,
-		"seconds" => 1000, // 1000 milliseconds per second
-		"minutes" => 60, // 60 seconds per minute
-		"hours" => 60, // 60 minutes per hour
-		"days" => 24, // 24 hours per day
-		"months" => 30, // approximately 30 days per month
-		"years" => 12, // 12 months per year
-	);
-
-	/**
-	 * The actual timestamp being wrapped. Either a DateTime
-	 * object or a string with a Unix timestamp depending on
-	 * PHP.
-	 * @var string|DateTime
-	 */
-	private $timestamp;
+	public $timestamp;
 
 	/**
 	 * Make a new timestamp and set it to the specified time,
@@ -130,10 +114,10 @@ class MWTimestamp {
 			# asctime
 			$strtime = $ts;
 		} else {
-			throw new TimestampException( __METHOD__ . " : Invalid timestamp - $ts" );
+			throw new TimestampException( __METHOD__ . ": Invalid timestamp - $ts" );
 		}
 
-		if( !$strtime ) {
+		if ( !$strtime ) {
 			$da = array_map( 'intval', $da );
 			$da[0] = "%04d-%02d-%02dT%02d:%02d:%02d.00+00:00";
 			$strtime = call_user_func_array( "sprintf", $da );
@@ -141,12 +125,12 @@ class MWTimestamp {
 
 		try {
 			$final = new DateTime( $strtime, new DateTimeZone( 'GMT' ) );
-		} catch(Exception $e) {
-			throw new TimestampException( __METHOD__ . ' Invalid timestamp format.' );
+		} catch ( Exception $e ) {
+			throw new TimestampException( __METHOD__ . ': Invalid timestamp format.', $e->getCode(), $e );
 		}
 
-		if( $final === false ) {
-			throw new TimestampException( __METHOD__ . ' Invalid timestamp format.' );
+		if ( $final === false ) {
+			throw new TimestampException( __METHOD__ . ': Invalid timestamp format.' );
 		}
 		$this->timestamp = $final;
 	}
@@ -164,20 +148,11 @@ class MWTimestamp {
 	 * @return string The formatted timestamp
 	 */
 	public function getTimestamp( $style = TS_UNIX ) {
-		if( !isset( self::$formats[$style] ) ) {
-			throw new TimestampException( __METHOD__ . ' : Illegal timestamp output type.' );
+		if ( !isset( self::$formats[$style] ) ) {
+			throw new TimestampException( __METHOD__ . ': Illegal timestamp output type.' );
 		}
 
-		if( is_object( $this->timestamp  ) ) {
-			// DateTime object was used, call DateTime::format.
-			$output = $this->timestamp->format( self::$formats[$style] );
-		} elseif( TS_UNIX == $style ) {
-			// Unix timestamp was used and is wanted, just return it.
-			$output = $this->timestamp;
-		} else {
-			// Unix timestamp was used, use gmdate().
-			$output = gmdate( self::$formats[$style], $this->timestamp );
-		}
+		$output = $this->timestamp->format( self::$formats[$style] );
 
 		if ( ( $style == TS_RFC2822 ) || ( $style == TS_POSTGRES ) ) {
 			$output .= ' GMT';
@@ -194,31 +169,143 @@ class MWTimestamp {
 	 * largest possible unit is used.
 	 *
 	 * @since 1.20
+	 * @since 1.22 Uses Language::getHumanTimestamp to produce the timestamp
+	 *
+	 * @param MWTimestamp|null $relativeTo The base timestamp to compare to (defaults to now)
+	 * @param User|null $user User the timestamp is being generated for (or null to use main context's user)
+	 * @param Language|null $lang Language to use to make the human timestamp (or null to use main context's language)
+	 * @return string Formatted timestamp
+	 */
+	public function getHumanTimestamp( MWTimestamp $relativeTo = null, User $user = null, Language $lang = null ) {
+		if ( $relativeTo === null ) {
+			$relativeTo = new self();
+		}
+		if ( $user === null ) {
+			$user = RequestContext::getMain()->getUser();
+		}
+		if ( $lang === null ) {
+			$lang = RequestContext::getMain()->getLanguage();
+		}
+
+		// Adjust for the user's timezone.
+		$offsetThis = $this->offsetForUser( $user );
+		$offsetRel = $relativeTo->offsetForUser( $user );
+
+		$ts = '';
+		if ( wfRunHooks( 'GetHumanTimestamp', array( &$ts, $this, $relativeTo, $user, $lang ) ) ) {
+			$ts = $lang->getHumanTimestamp( $this, $relativeTo, $user );
+		}
+
+		// Reset the timezone on the objects.
+		$this->timestamp->sub( $offsetThis );
+		$relativeTo->timestamp->sub( $offsetRel );
+
+		return $ts;
+	}
+
+	/**
+	 * Adjust the timestamp depending on the given user's preferences.
 	 *
-	 * @return Message Formatted timestamp
+	 * @since 1.22
+	 *
+	 * @param User $user User to take preferences from
+	 * @param[out] MWTimestamp $ts Timestamp to adjust
+	 * @return DateInterval Offset that was applied to the timestamp
 	 */
-	public function getHumanTimestamp() {
-		$then = $this->getTimestamp( TS_UNIX );
-		$now = time();
-		$timeago = ($now - $then) * 1000;
-		$message = false;
-
-		foreach( self::$units as $unit => $factor ) {
-			$next = $timeago / $factor;
-			if( $next < 1 ) {
-				break;
+	public function offsetForUser( User $user ) {
+		global $wgLocalTZoffset;
+
+		$option = $user->getOption( 'timecorrection' );
+		$data = explode( '|', $option, 3 );
+
+		// First handle the case of an actual timezone being specified.
+		if ( $data[0] == 'ZoneInfo' ) {
+			try {
+				$tz = new DateTimeZone( $data[2] );
+			} catch ( Exception $e ) {
+				$tz = false;
+			}
+
+			if ( $tz ) {
+				$this->timestamp->setTimezone( $tz );
+				return new DateInterval( 'P0Y' );
 			} else {
-				$timeago = $next;
-				$message = array( $unit, floor( $timeago ) );
+				$data[0] = 'Offset';
 			}
 		}
 
-		if( $message ) {
-			$initial = call_user_func_array( 'wfMessage', $message );
-			return wfMessage( 'ago', $initial->parse() );
+		$diff = 0;
+		// If $option is in fact a pipe-separated value, check the
+		// first value.
+		if ( $data[0] == 'System' ) {
+			// First value is System, so use the system offset.
+			if ( isset( $wgLocalTZoffset ) ) {
+				$diff = $wgLocalTZoffset;
+			}
+		} elseif ( $data[0] == 'Offset' ) {
+			// First value is Offset, so use the specified offset
+			$diff = (int)$data[1];
 		} else {
-			return wfMessage( 'just-now' );
+			// $option actually isn't a pipe separated value, but instead
+			// a comma separated value. Isn't MediaWiki fun?
+			$data = explode( ':', $option );
+			if ( count( $data ) >= 2 ) {
+				// Combination hours and minutes.
+				$diff = abs( (int)$data[0] ) * 60 + (int)$data[1];
+				if ( (int)$data[0] < 0 ) {
+					$diff *= -1;
+				}
+			} else {
+				// Just hours.
+				$diff = (int)$data[0] * 60;
+			}
+		}
+
+		$interval = new DateInterval( 'PT' . abs( $diff ) . 'M' );
+		if ( $diff < 1 ) {
+			$interval->invert = 1;
 		}
+
+		$this->timestamp->add( $interval );
+		return $interval;
+	}
+
+	/**
+	 * Generate a purely relative timestamp, i.e., represent the time elapsed between
+	 * the given base timestamp and this object.
+	 *
+	 * @param MWTimestamp $relativeTo Relative base timestamp (defaults to now)
+	 * @param User $user Use to use offset for
+	 * @param Language $lang Language to use
+	 * @param array $chosenIntervals Intervals to use to represent it
+	 * @return string Relative timestamp
+	 */
+	public function getRelativeTimestamp(
+		MWTimestamp $relativeTo = null,
+		User $user = null,
+		Language $lang = null,
+		array $chosenIntervals = array()
+	) {
+		if ( $relativeTo === null ) {
+			$relativeTo = new self;
+		}
+		if ( $user === null ) {
+			$user = RequestContext::getMain()->getUser();
+		}
+		if ( $lang === null ) {
+			$lang = RequestContext::getMain()->getLanguage();
+		}
+
+		$ts = '';
+		$diff = $this->diff( $relativeTo );
+		if ( wfRunHooks( 'GetRelativeTimestamp', array( &$ts, &$diff, $this, $relativeTo, $user, $lang ) ) ) {
+			$seconds = ( ( ( $diff->days * 24 + $diff->h ) * 60 + $diff->i ) * 60 + $diff->s );
+			$ts = wfMessage( 'ago', $lang->formatDuration( $seconds, $chosenIntervals ) )
+				->inLanguage( $lang )
+				->text();
+		}
+
+		return $ts;
 	}
 
 	/**
@@ -229,6 +316,78 @@ class MWTimestamp {
 	public function __toString() {
 		return $this->getTimestamp();
 	}
+
+	/**
+	 * Calculate the difference between two MWTimestamp objects.
+	 *
+	 * @since 1.22
+	 * @param MWTimestamp $relativeTo Base time to calculate difference from
+	 * @return DateInterval|bool The DateInterval object representing the difference between the two dates or false on failure
+	 */
+	public function diff( MWTimestamp $relativeTo ) {
+		return $this->timestamp->diff( $relativeTo->timestamp );
+	}
+
+	/**
+	 * Set the timezone of this timestamp to the specified timezone.
+	 *
+	 * @since 1.22
+	 * @param String $timezone Timezone to set
+	 * @throws TimestampException
+	 */
+	public function setTimezone( $timezone ) {
+		try {
+			$this->timestamp->setTimezone( new DateTimeZone( $timezone ) );
+		} catch ( Exception $e ) {
+			throw new TimestampException( __METHOD__ . ': Invalid timezone.', $e->getCode(), $e );
+		}
+	}
+
+	/**
+	 * Get the timezone of this timestamp.
+	 *
+	 * @since 1.22
+	 * @return DateTimeZone The timezone
+	 */
+	public function getTimezone() {
+		return $this->timestamp->getTimezone();
+	}
+
+	/**
+	 * Format the timestamp in a given format.
+	 *
+	 * @since 1.22
+	 * @param string $format Pattern to format in
+	 * @return string The formatted timestamp
+	 */
+	public function format( $format ) {
+		return $this->timestamp->format( $format );
+	}
+
+	/**
+	 * Get a timestamp instance in the server local timezone ($wgLocaltimezone)
+	 *
+	 * @since 1.22
+	 * @param bool|string $ts Timestamp to set, or false for current time
+	 * @return MWTimestamp the local instance
+	 */
+	public static function getLocalInstance( $ts = false ) {
+		global $wgLocaltimezone;
+		$timestamp = new self( $ts );
+		$timestamp->setTimezone( $wgLocaltimezone );
+		return $timestamp;
+	}
+
+	/**
+	 * Get a timestamp instance in GMT
+	 *
+	 * @since 1.22
+	 * @param bool|string $ts Timestamp to set, or false for current time
+	 * @return MWTimestamp the instance
+	 */
+	public static function getInstance( $ts = false ) {
+		return new self( $ts );
+	}
 }
 
 /**
diff --git a/includes/Title.php b/includes/Title.php
index ca66aaec..21872e45 100644
--- a/includes/Title.php
+++ b/includes/Title.php
@@ -225,7 +225,7 @@ class Title {
 	 *
 	 * @param int $id the page_id corresponding to the Title to create
 	 * @param int $flags use Title::GAID_FOR_UPDATE to use master
-	 * @return Title the new object, or NULL on an error
+	 * @return Title|null the new object, or NULL on an error
 	 */
 	public static function newFromID( $id, $flags = 0 ) {
 		$db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
@@ -289,18 +289,23 @@ class Title {
 	 */
 	public function loadFromRow( $row ) {
 		if ( $row ) { // page found
-			if ( isset( $row->page_id ) )
+			if ( isset( $row->page_id ) ) {
 				$this->mArticleID = (int)$row->page_id;
-			if ( isset( $row->page_len ) )
+			}
+			if ( isset( $row->page_len ) ) {
 				$this->mLength = (int)$row->page_len;
-			if ( isset( $row->page_is_redirect ) )
+			}
+			if ( isset( $row->page_is_redirect ) ) {
 				$this->mRedirect = (bool)$row->page_is_redirect;
-			if ( isset( $row->page_latest ) )
+			}
+			if ( isset( $row->page_latest ) ) {
 				$this->mLatestID = (int)$row->page_latest;
-			if ( isset( $row->page_content_model ) )
+			}
+			if ( isset( $row->page_content_model ) ) {
 				$this->mContentModel = strval( $row->page_content_model );
-			else
+			} else {
 				$this->mContentModel = false; # initialized lazily in getContentModel()
+			}
 		} else { // page not found
 			$this->mArticleID = 0;
 			$this->mLength = 0;
@@ -486,6 +491,108 @@ class Title {
 		return $rxTc;
 	}
 
+	/**
+	 * Utility method for converting a character sequence from bytes to Unicode.
+	 *
+	 * Primary usecase being converting $wgLegalTitleChars to a sequence usable in
+	 * javascript, as PHP uses UTF-8 bytes where javascript uses Unicode code units.
+	 *
+	 * @param string $byteClass
+	 * @return string
+	 */
+	public static function convertByteClassToUnicodeClass( $byteClass ) {
+		$length = strlen( $byteClass );
+		// Input token queue
+		$x0 = $x1 = $x2 = '';
+		// Decoded queue
+		$d0 = $d1 = $d2 = '';
+		// Decoded integer codepoints
+		$ord0 = $ord1 = $ord2 = 0;
+		// Re-encoded queue
+		$r0 = $r1 = $r2 = '';
+		// Output
+		$out = '';
+		// Flags
+		$allowUnicode = false;
+		for ( $pos = 0; $pos < $length; $pos++ ) {
+			// Shift the queues down
+			$x2 = $x1;
+			$x1 = $x0;
+			$d2 = $d1;
+			$d1 = $d0;
+			$ord2 = $ord1;
+			$ord1 = $ord0;
+			$r2 = $r1;
+			$r1 = $r0;
+			// Load the current input token and decoded values
+			$inChar = $byteClass[$pos];
+			if ( $inChar == '\\' ) {
+				if ( preg_match( '/x([0-9a-fA-F]{2})/A', $byteClass, $m, 0, $pos + 1 ) ) {
+					$x0 = $inChar . $m[0];
+					$d0 = chr( hexdec( $m[1] ) );
+					$pos += strlen( $m[0] );
+				} elseif ( preg_match( '/[0-7]{3}/A', $byteClass, $m, 0, $pos + 1 ) ) {
+					$x0 = $inChar . $m[0];
+					$d0 = chr( octdec( $m[0] ) );
+					$pos += strlen( $m[0] );
+				} elseif ( $pos + 1 >= $length ) {
+					$x0 = $d0 = '\\';
+				} else {
+					$d0 = $byteClass[$pos + 1];
+					$x0 = $inChar . $d0;
+					$pos += 1;
+				}
+			} else {
+				$x0 = $d0 = $inChar;
+			}
+			$ord0 = ord( $d0 );
+			// Load the current re-encoded value
+			if ( $ord0 < 32 || $ord0 == 0x7f ) {
+				$r0 = sprintf( '\x%02x', $ord0 );
+			} elseif ( $ord0 >= 0x80 ) {
+				// Allow unicode if a single high-bit character appears
+				$r0 = sprintf( '\x%02x', $ord0 );
+				$allowUnicode = true;
+			} elseif ( strpos( '-\\[]^', $d0 ) !== false ) {
+				$r0 = '\\' . $d0;
+			} else {
+				$r0 = $d0;
+			}
+			// Do the output
+			if ( $x0 !== '' && $x1 === '-' && $x2 !== '' ) {
+				// Range
+				if ( $ord2 > $ord0 ) {
+					// Empty range
+				} elseif ( $ord0 >= 0x80 ) {
+					// Unicode range
+					$allowUnicode = true;
+					if ( $ord2 < 0x80 ) {
+						// Keep the non-unicode section of the range
+						$out .= "$r2-\\x7F";
+					}
+				} else {
+					// Normal range
+					$out .= "$r2-$r0";
+				}
+				// Reset state to the initial value
+				$x0 = $x1 = $d0 = $d1 = $r0 = $r1 = '';
+			} elseif ( $ord2 < 0x80 ) {
+				// ASCII character
+				$out .= $r2;
+			}
+		}
+		if ( $ord1 < 0x80 ) {
+			$out .= $r1;
+		}
+		if ( $ord0 < 0x80 ) {
+			$out .= $r0;
+		}
+		if ( $allowUnicode ) {
+			$out .= '\u0080-\uFFFF';
+		}
+		return $out;
+	}
+
 	/**
 	 * Get a string representation of a title suitable for
 	 * including in a search index
@@ -689,7 +796,7 @@ class Title {
 			$this->mContentModel = ContentHandler::getDefaultModelFor( $this );
 		}
 
-		if( !$this->mContentModel ) {
+		if ( !$this->mContentModel ) {
 			throw new MWException( 'Failed to determine content model!' );
 		}
 
@@ -752,7 +859,7 @@ class Title {
 	 */
 	public function getTalkNsText() {
 		global $wgContLang;
-		return( $wgContLang->getNsText( MWNamespace::getTalk( $this->mNamespace ) ) );
+		return $wgContLang->getNsText( MWNamespace::getTalk( $this->mNamespace ) );
 	}
 
 	/**
@@ -761,7 +868,7 @@ class Title {
 	 * @return Bool TRUE or FALSE
 	 */
 	public function canTalk() {
-		return( MWNamespace::canTalk( $this->mNamespace ) );
+		return MWNamespace::canTalk( $this->mNamespace );
 	}
 
 	/**
@@ -939,7 +1046,7 @@ class Title {
 	 * @return Bool
 	 */
 	public function isConversionTable() {
-		//@todo: ConversionTable should become a separate content model.
+		// @todo ConversionTable should become a separate content model.
 
 		return $this->getNamespace() == NS_MEDIAWIKI &&
 			strpos( $this->getText(), 'Conversiontable/' ) === 0;
@@ -995,10 +1102,11 @@ class Title {
 	 */
 	public function getSkinFromCssJsSubpage() {
 		$subpage = explode( '/', $this->mTextform );
-		$subpage = $subpage[ count( $subpage ) - 1 ];
+		$subpage = $subpage[count( $subpage ) - 1];
 		$lastdot = strrpos( $subpage, '.' );
-		if ( $lastdot === false )
+		if ( $lastdot === false ) {
 			return $subpage; # Never happens: only called for names ending in '.css' or '.js'
+		}
 		return substr( $subpage, 0, $lastdot );
 	}
 
@@ -1269,10 +1377,10 @@ class Title {
 	 */
 	public function getSubpageText() {
 		if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
-			return( $this->mTextform );
+			return $this->mTextform;
 		}
 		$parts = explode( '/', $this->mTextform );
-		return( $parts[count( $parts ) - 1] );
+		return $parts[count( $parts ) - 1];
 	}
 
 	/**
@@ -1312,7 +1420,7 @@ class Title {
 	public function getSubpageUrlForm() {
 		$text = $this->getSubpageText();
 		$text = wfUrlencode( str_replace( ' ', '_', $text ) );
-		return( $text );
+		return $text;
 	}
 
 	/**
@@ -1327,8 +1435,8 @@ class Title {
 	}
 
 	/**
-	 * Helper to fix up the get{Local,Full,Link,Canonical}URL args
-	 * get{Canonical,Full,Link,Local}URL methods accepted an optional
+	 * Helper to fix up the get{Canonical,Full,Link,Local,Internal}URL args
+	 * get{Canonical,Full,Link,Local,Internal}URL methods accepted an optional
 	 * second argument named variant. This was deprecated in favor
 	 * of passing an array of option with a "variant" key
 	 * Once $query2 is removed for good, this helper can be dropped
@@ -1340,8 +1448,10 @@ class Title {
 	 * @return String
 	 */
 	private static function fixUrlQueryArgs( $query, $query2 = false ) {
-		if( $query2 !== false ) {
-			wfDeprecated( "Title::get{Canonical,Full,Link,Local} method called with a second parameter is deprecated. Add your parameter to an array passed as the first parameter.", "1.19" );
+		if ( $query2 !== false ) {
+			wfDeprecated( "Title::get{Canonical,Full,Link,Local,Internal}URL " .
+				"method called with a second parameter is deprecated. Add your " .
+				"parameter to an array passed as the first parameter.", "1.19" );
 		}
 		if ( is_array( $query ) ) {
 			$query = wfArrayToCgi( $query );
@@ -1399,7 +1509,6 @@ class Title {
 	 * Get a URL with no fragment or server name.  If this page is generated
 	 * with action=render, $wgServer is prepended.
 	 *
-
 	 * @param string|array $query an optional query string,
 	 *   not used for interwiki links. Can be specified as an associative array as well,
 	 *   e.g., array( 'action' => 'edit' ) (keys and values will be URL-escaped).
@@ -1434,7 +1543,7 @@ class Title {
 				$url = str_replace( '$1', $dbkey, $wgArticlePath );
 				wfRunHooks( 'GetLocalURL::Article', array( &$this, &$url ) );
 			} else {
-				global $wgVariantArticlePath, $wgActionPaths;
+				global $wgVariantArticlePath, $wgActionPaths, $wgContLang;
 				$url = false;
 				$matches = array();
 
@@ -1456,6 +1565,7 @@ class Title {
 
 				if ( $url === false &&
 					$wgVariantArticlePath &&
+					$wgContLang->getCode() === $this->getPageLanguage()->getCode() &&
 					$this->getPageLanguage()->hasVariants() &&
 					preg_match( '/^variant=([^&]*)$/', $query, $matches ) )
 				{
@@ -1732,6 +1842,10 @@ class Title {
 	 * @return Array list of errors
 	 */
 	private function checkQuickPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+		if ( !wfRunHooks( 'TitleQuickPermissions', array( $this, $user, $action, &$errors, $doExpensiveQueries, $short ) ) ) {
+			return $errors;
+		}
+
 		if ( $action == 'create' ) {
 			if (
 				( $this->isTalkPage() && !$user->isAllowed( 'createtalk' ) ) ||
@@ -1880,12 +1994,19 @@ class Title {
 		# Protect css/js subpages of user pages
 		# XXX: this might be better using restrictions
 		# XXX: right 'editusercssjs' is deprecated, for backward compatibility only
-		if ( $action != 'patrol' && !$user->isAllowed( 'editusercssjs' )
-				&& !preg_match( '/^' . preg_quote( $user->getName(), '/' ) . '\//', $this->mTextform ) ) {
-			if ( $this->isCssSubpage() && !$user->isAllowed( 'editusercss' ) ) {
-				$errors[] = array( 'customcssprotected' );
-			} elseif ( $this->isJsSubpage() && !$user->isAllowed( 'edituserjs' ) ) {
-				$errors[] = array( 'customjsprotected' );
+		if ( $action != 'patrol' && !$user->isAllowed( 'editusercssjs' ) ) {
+			if ( preg_match( '/^' . preg_quote( $user->getName(), '/' ) . '\//', $this->mTextform ) ) {
+				if ( $this->isCssSubpage() && !$user->isAllowedAny( 'editmyusercss', 'editusercss' ) ) {
+					$errors[] = array( 'mycustomcssprotected' );
+				} elseif ( $this->isJsSubpage() && !$user->isAllowedAny( 'editmyuserjs', 'edituserjs' ) ) {
+					$errors[] = array( 'mycustomjsprotected' );
+				}
+			} else {
+				if ( $this->isCssSubpage() && !$user->isAllowed( 'editusercss' ) ) {
+					$errors[] = array( 'customcssprotected' );
+				} elseif ( $this->isJsSubpage() && !$user->isAllowed( 'edituserjs' ) ) {
+					$errors[] = array( 'customjsprotected' );
+				}
 			}
 		}
 
@@ -1907,18 +2028,21 @@ class Title {
 	 */
 	private function checkPageRestrictions( $action, $user, $errors, $doExpensiveQueries, $short ) {
 		foreach ( $this->getRestrictions( $action ) as $right ) {
-			// Backwards compatibility, rewrite sysop -> protect
+			// Backwards compatibility, rewrite sysop -> editprotected
 			if ( $right == 'sysop' ) {
-				$right = 'protect';
+				$right = 'editprotected';
 			}
-			if ( $right != '' && !$user->isAllowed( $right ) ) {
-				// Users with 'editprotected' permission can edit protected pages
-				// without cascading option turned on.
-				if ( $action != 'edit' || !$user->isAllowed( 'editprotected' )
-					|| $this->mCascadeRestriction )
-				{
-					$errors[] = array( 'protectedpagetext', $right );
-				}
+			// Backwards compatibility, rewrite autoconfirmed -> editsemiprotected
+			if ( $right == 'autoconfirmed' ) {
+				$right = 'editsemiprotected';
+			}
+			if ( $right == '' ) {
+				continue;
+			}
+			if ( !$user->isAllowed( $right ) ) {
+				$errors[] = array( 'protectedpagetext', $right );
+			} elseif ( $this->mCascadeRestriction && !$user->isAllowed( 'protect' ) ) {
+				$errors[] = array( 'protectedpagetext', 'protect' );
 			}
 		}
 
@@ -1950,11 +2074,19 @@ class Title {
 			# This is only for protection restrictions, not for all actions
 			if ( isset( $restrictions[$action] ) ) {
 				foreach ( $restrictions[$action] as $right ) {
-					$right = ( $right == 'sysop' ) ? 'protect' : $right;
-					if ( $right != '' && !$user->isAllowed( $right ) ) {
+					// Backwards compatibility, rewrite sysop -> editprotected
+					if ( $right == 'sysop' ) {
+						$right = 'editprotected';
+					}
+					// Backwards compatibility, rewrite autoconfirmed -> editsemiprotected
+					if ( $right == 'autoconfirmed' ) {
+						$right = 'editsemiprotected';
+					}
+					if ( $right != '' && !$user->isAllowedAll( 'protect', $right ) ) {
 						$pages = '';
-						foreach ( $cascadingSources as $page )
+						foreach ( $cascadingSources as $page ) {
 							$pages .= '* [[:' . $page->getPrefixedText() . "]]\n";
+						}
 						$errors[] = array( 'cascadeprotected', count( $cascadingSources ), $pages );
 					}
 				}
@@ -1985,11 +2117,14 @@ class Title {
 			}
 		} elseif ( $action == 'create' ) {
 			$title_protection = $this->getTitleProtection();
-			if( $title_protection ) {
-				if( $title_protection['pt_create_perm'] == 'sysop' ) {
-					$title_protection['pt_create_perm'] = 'protect'; // B/C
+			if ( $title_protection ) {
+				if ( $title_protection['pt_create_perm'] == 'sysop' ) {
+					$title_protection['pt_create_perm'] = 'editprotected'; // B/C
+				}
+				if ( $title_protection['pt_create_perm'] == 'autoconfirmed' ) {
+					$title_protection['pt_create_perm'] = 'editsemiprotected'; // B/C
 				}
-				if( $title_protection['pt_create_perm'] == '' ||
+				if ( $title_protection['pt_create_perm'] == '' ||
 					!$user->isAllowed( $title_protection['pt_create_perm'] ) )
 				{
 					$errors[] = array( 'titleprotected', User::whoIs( $title_protection['pt_user'] ), $title_protection['pt_reason'] );
@@ -2034,11 +2169,11 @@ class Title {
 	private function checkUserBlock( $action, $user, $errors, $doExpensiveQueries, $short ) {
 		// Account creation blocks handled at userlogin.
 		// Unblocking handled in SpecialUnblock
-		if( !$doExpensiveQueries || in_array( $action, array( 'createaccount', 'unblock' ) ) ) {
+		if ( !$doExpensiveQueries || in_array( $action, array( 'createaccount', 'unblock' ) ) ) {
 			return $errors;
 		}
 
-		global $wgContLang, $wgLang, $wgEmailConfirmToEdit;
+		global $wgEmailConfirmToEdit;
 
 		if ( $wgEmailConfirmToEdit && !$user->isEmailConfirmed() ) {
 			$errors[] = array( 'confirmedittext' );
@@ -2047,39 +2182,9 @@ class Title {
 		if ( ( $action == 'edit' || $action == 'create' ) && !$user->isBlockedFrom( $this ) ) {
 			// Don't block the user from editing their own talk page unless they've been
 			// explicitly blocked from that too.
-		} elseif( $user->isBlocked() && $user->mBlock->prevents( $action ) !== false ) {
-			$block = $user->getBlock();
-
-			// This is from OutputPage::blockedPage
-			// Copied at r23888 by werdna
-
-			$id = $user->blockedBy();
-			$reason = $user->blockedFor();
-			if ( $reason == '' ) {
-				$reason = wfMessage( 'blockednoreason' )->text();
-			}
-			$ip = $user->getRequest()->getIP();
-
-			if ( is_numeric( $id ) ) {
-				$name = User::whoIs( $id );
-			} else {
-				$name = $id;
-			}
-
-			$link = '[[' . $wgContLang->getNsText( NS_USER ) . ":{$name}|{$name}]]";
-			$blockid = $block->getId();
-			$blockExpiry = $block->getExpiry();
-			$blockTimestamp = $wgLang->timeanddate( wfTimestamp( TS_MW, $block->mTimestamp ), true );
-			if ( $blockExpiry == 'infinity' ) {
-				$blockExpiry = wfMessage( 'infiniteblock' )->text();
-			} else {
-				$blockExpiry = $wgLang->timeanddate( wfTimestamp( TS_MW, $blockExpiry ), true );
-			}
-
-			$intended = strval( $block->getTarget() );
-
-			$errors[] = array( ( $block->mAuto ? 'autoblockedtext' : 'blockedtext' ), $link, $reason, $ip, $name,
-				$blockid, $blockExpiry, $intended, $blockTimestamp );
+		} elseif ( $user->isBlocked() && $user->mBlock->prevents( $action ) !== false ) {
+			// @todo FIXME: Pass the relevant context into this function.
+			$errors[] = $user->getBlock()->getPermissionsError( RequestContext::getMain() );
 		}
 
 		return $errors;
@@ -2097,34 +2202,10 @@ class Title {
 	 * @return Array list of errors
 	 */
 	private function checkReadPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
-		global $wgWhitelistRead, $wgWhitelistReadRegexp, $wgRevokePermissions;
-		static $useShortcut = null;
-
-		# Initialize the $useShortcut boolean, to determine if we can skip quite a bit of code below
-		if ( is_null( $useShortcut ) ) {
-			$useShortcut = true;
-			if ( !User::groupHasPermission( '*', 'read' ) ) {
-				# Not a public wiki, so no shortcut
-				$useShortcut = false;
-			} elseif ( !empty( $wgRevokePermissions ) ) {
-				/**
-				 * Iterate through each group with permissions being revoked (key not included since we don't care
-				 * what the group name is), then check if the read permission is being revoked. If it is, then
-				 * we don't use the shortcut below since the user might not be able to read, even though anon
-				 * reading is allowed.
-				 */
-				foreach ( $wgRevokePermissions as $perms ) {
-					if ( !empty( $perms['read'] ) ) {
-						# We might be removing the read right from the user, so no shortcut
-						$useShortcut = false;
-						break;
-					}
-				}
-			}
-		}
+		global $wgWhitelistRead, $wgWhitelistReadRegexp;
 
 		$whitelisted = false;
-		if ( $useShortcut ) {
+		if ( User::isEveryoneAllowed( 'read' ) ) {
 			# Shortcut for public wikis, allows skipping quite a bit of code
 			$whitelisted = true;
 		} elseif ( $user->isAllowed( 'read' ) ) {
@@ -2165,7 +2246,7 @@ class Title {
 			}
 		}
 
-		if( !$whitelisted && is_array( $wgWhitelistReadRegexp ) && !empty( $wgWhitelistReadRegexp ) ) {
+		if ( !$whitelisted && is_array( $wgWhitelistReadRegexp ) && !empty( $wgWhitelistReadRegexp ) ) {
 			$name = $this->getPrefixedText();
 			// Check for regex whitelisting
 			foreach ( $wgWhitelistReadRegexp as $listItem ) {
@@ -2250,7 +2331,7 @@ class Title {
 		}
 
 		$errors = array();
-		while( count( $checks ) > 0 &&
+		while ( count( $checks ) > 0 &&
 				!( $short && count( $errors ) > 0 ) ) {
 			$method = array_shift( $checks );
 			$errors = $this->$method( $action, $user, $errors, $doExpensiveQueries, $short );
@@ -2260,36 +2341,6 @@ class Title {
 		return $errors;
 	}
 
-	/**
-	 * Protect css subpages of user pages: can $wgUser edit
-	 * this page?
-	 *
-	 * @deprecated in 1.19; will be removed in 1.20. Use getUserPermissionsErrors() instead.
-	 * @return Bool
-	 */
-	public function userCanEditCssSubpage() {
-		global $wgUser;
-		wfDeprecated( __METHOD__, '1.19' );
-		return ( ( $wgUser->isAllowedAll( 'editusercssjs', 'editusercss' ) )
-			|| preg_match( '/^' . preg_quote( $wgUser->getName(), '/' ) . '\//', $this->mTextform ) );
-	}
-
-	/**
-	 * Protect js subpages of user pages: can $wgUser edit
-	 * this page?
-	 *
-	 * @deprecated in 1.19; will be removed in 1.20. Use getUserPermissionsErrors() instead.
-	 * @return Bool
-	 */
-	public function userCanEditJsSubpage() {
-		global $wgUser;
-		wfDeprecated( __METHOD__, '1.19' );
-		return (
-			( $wgUser->isAllowedAll( 'editusercssjs', 'edituserjs' ) )
-			|| preg_match( '/^' . preg_quote( $wgUser->getName(), '/' ) . '\//', $this->mTextform )
-		);
-	}
-
 	/**
 	 * Get a filtered list of all restriction types supported by this wiki.
 	 * @param bool $exists True to get all restriction types that apply to
@@ -2371,7 +2422,7 @@ class Title {
 	/**
 	 * Update the title protection status
 	 *
-	 * @deprecated in 1.19; will be removed in 1.20. Use WikiPage::doUpdateRestrictions() instead.
+	 * @deprecated in 1.19; use WikiPage::doUpdateRestrictions() instead.
 	 * @param $create_perm String Permission required for creation
 	 * @param string $reason Reason for protection
 	 * @param string $expiry Expiry timestamp
@@ -2407,29 +2458,31 @@ class Title {
 	}
 
 	/**
-	 * Is this page "semi-protected" - the *only* protection is autoconfirm?
+	 * Is this page "semi-protected" - the *only* protection levels are listed
+	 * in $wgSemiprotectedRestrictionLevels?
 	 *
 	 * @param string $action Action to check (default: edit)
 	 * @return Bool
 	 */
 	public function isSemiProtected( $action = 'edit' ) {
-		if ( $this->exists() ) {
-			$restrictions = $this->getRestrictions( $action );
-			if ( count( $restrictions ) > 0 ) {
-				foreach ( $restrictions as $restriction ) {
-					if ( strtolower( $restriction ) != 'autoconfirmed' ) {
-						return false;
-					}
-				}
-			} else {
-				# Not protected
-				return false;
-			}
-			return true;
-		} else {
-			# If it doesn't exist, it can't be protected
+		global $wgSemiprotectedRestrictionLevels;
+
+		$restrictions = $this->getRestrictions( $action );
+		$semi = $wgSemiprotectedRestrictionLevels;
+		if ( !$restrictions || !$semi ) {
+			// Not protected, or all protection is full protection
 			return false;
 		}
+
+		// Remap autoconfirmed to editsemiprotected for BC
+		foreach ( array_keys( $semi, 'autoconfirmed' ) as $key ) {
+			$semi[$key] = 'editsemiprotected';
+		}
+		foreach ( array_keys( $restrictions, 'autoconfirmed' ) as $key ) {
+			$restrictions[$key] = 'editsemiprotected';
+		}
+
+		return !array_diff( $restrictions, $semi );
 	}
 
 	/**
@@ -2445,7 +2498,7 @@ class Title {
 		$restrictionTypes = $this->getRestrictionTypes();
 
 		# Special pages have inherent protection
-		if( $this->isSpecialPage() ) {
+		if ( $this->isSpecialPage() ) {
 			return true;
 		}
 
@@ -2692,7 +2745,7 @@ class Title {
 					$this->mRestrictions['move'] = explode( ',', trim( $temp[0] ) );
 				} else {
 					$restriction = trim( $temp[1] );
-					if( $restriction != '' ) { //some old entries are empty
+					if ( $restriction != '' ) { //some old entries are empty
 						$this->mRestrictions[$temp[0]] = explode( ',', $restriction );
 					}
 				}
@@ -2711,8 +2764,9 @@ class Title {
 			foreach ( $rows as $row ) {
 
 				// Don't take care of restrictions types that aren't allowed
-				if ( !in_array( $row->pr_type, $restrictionTypes ) )
+				if ( !in_array( $row->pr_type, $restrictionTypes ) ) {
 					continue;
+				}
 
 				// This code should be refactored, now that it's being used more generally,
 				// But I don't really see any harm in leaving it in Block for now -werdna
@@ -2798,18 +2852,20 @@ class Title {
 			return;
 		}
 
+		$method = __METHOD__;
 		$dbw = wfGetDB( DB_MASTER );
-		$dbw->delete(
-			'page_restrictions',
-			array( 'pr_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
-			__METHOD__
-		);
-
-		$dbw->delete(
-			'protected_titles',
-			array( 'pt_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
-			__METHOD__
-		);
+		$dbw->onTransactionIdle( function() use ( $dbw, $method ) {
+			$dbw->delete(
+				'page_restrictions',
+				array( 'pr_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
+				$method
+			);
+			$dbw->delete(
+				'protected_titles',
+				array( 'pt_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
+				$method
+			);
+		} );
 	}
 
 	/**
@@ -2960,11 +3016,13 @@ class Title {
 		$linkCache = LinkCache::singleton();
 		$cached = $linkCache->getGoodLinkFieldObj( $this, 'redirect' );
 		if ( $cached === null ) {
-			// TODO: check the assumption that the cache actually knows about this title
-			// and handle this, such as get the title from the database.
-			// See https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
-			wfDebug( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
-			wfDebug( wfBacktrace() );
+			# Trust LinkCache's state over our own
+			# LinkCache is telling us that the page doesn't exist, despite there being cached
+			# data relating to an existing page in $this->mArticleID. Updaters should clear
+			# LinkCache as appropriate, or use $flags = Title::GAID_FOR_UPDATE. If that flag is
+			# set, then LinkCache will definitely be up to date here, since getArticleID() forces
+			# LinkCache to refresh its data from the master.
+			return $this->mRedirect = false;
 		}
 
 		$this->mRedirect = (bool)$cached;
@@ -2989,11 +3047,9 @@ class Title {
 		}
 		$linkCache = LinkCache::singleton();
 		$cached = $linkCache->getGoodLinkFieldObj( $this, 'length' );
-		if ( $cached === null ) { # check the assumption that the cache actually knows about this title
-			# XXX: this does apparently happen, see https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
-			#      as a stop gap, perhaps log this, but don't throw an exception?
-			wfDebug( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
-			wfDebug( wfBacktrace() );
+		if ( $cached === null ) {
+			# Trust LinkCache's state over our own, as for isRedirect()
+			return $this->mLength = 0;
 		}
 
 		$this->mLength = intval( $cached );
@@ -3005,7 +3061,6 @@ class Title {
 	 * What is the page_latest field for this page?
 	 *
 	 * @param int $flags a bit field; may be Title::GAID_FOR_UPDATE to select for update
-	 * @throws MWException
 	 * @return Int or 0 if the page doesn't exist
 	 */
 	public function getLatestRevID( $flags = 0 ) {
@@ -3019,10 +3074,9 @@ class Title {
 		$linkCache = LinkCache::singleton();
 		$linkCache->addLinkObj( $this );
 		$cached = $linkCache->getGoodLinkFieldObj( $this, 'revision' );
-		if ( $cached === null ) { # check the assumption that the cache actually knows about this title
-			# XXX: this does apparently happen, see https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
-			#      as a stop gap, perhaps log this, but don't throw an exception?
-			throw new MWException( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
+		if ( $cached === null ) {
+			# Trust LinkCache's state over our own, as for isRedirect()
+			return $this->mLatestID = 0;
 		}
 
 		$this->mLatestID = intval( $cached );
@@ -3111,7 +3165,7 @@ class Title {
 			return false;
 		}
 
-		if ( false !== strpos( $dbkey, UTF8_REPLACEMENT ) ) {
+		if ( strpos( $dbkey, UTF8_REPLACEMENT ) !== false ) {
 			# Contained illegal UTF-8 sequences or forbidden Unicode chars.
 			return false;
 		}
@@ -3248,6 +3302,7 @@ class Title {
 
 		# Can't make a link to a namespace alone... "empty" local links can only be
 		# self-links with a fragment identifier.
+		# TODO: Why do we exclude NS_MAIN (bug 54044)
 		if ( $dbkey == '' && $this->mInterwiki == '' && $this->mNamespace != NS_MAIN ) {
 			return false;
 		}
@@ -3301,7 +3356,7 @@ class Title {
 			array(
 				"{$prefix}_from=page_id",
 				"{$prefix}_namespace" => $this->getNamespace(),
-				"{$prefix}_title"     => $this->getDBkey() ),
+				"{$prefix}_title" => $this->getDBkey() ),
 			__METHOD__,
 			$options
 		);
@@ -3366,7 +3421,9 @@ class Title {
 		$titleField = "{$prefix}_title";
 
 		$fields = array( $namespaceFiled, $titleField, 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
-		if ( $wgContentHandlerUseDB ) $fields[] = 'page_content_model';
+		if ( $wgContentHandlerUseDB ) {
+			$fields[] = 'page_content_model';
+		}
 
 		$res = $db->select(
 			array( $table, 'page' ),
@@ -3465,6 +3522,7 @@ class Title {
 			}
 		}
 
+		wfRunHooks( 'TitleSquidURLs', array( $this, &$urls ) );
 		return $urls;
 	}
 
@@ -3585,7 +3643,13 @@ class Title {
 			}
 		} else {
 			$tp = $nt->getTitleProtection();
-			$right = ( $tp['pt_create_perm'] == 'sysop' ) ? 'protect' : $tp['pt_create_perm'];
+			$right = $tp['pt_create_perm'];
+			if ( $right == 'sysop' ) {
+				$right = 'editprotected'; // B/C
+			}
+			if ( $right == 'autoconfirmed' ) {
+				$right = 'editsemiprotected'; // B/C
+			}
 			if ( $tp and !$wgUser->isAllowed( $right ) ) {
 				$errors[] = array( 'cantmove-titleprotected' );
 			}
@@ -3659,6 +3723,8 @@ class Title {
 			$createRedirect = true;
 		}
 
+		wfRunHooks( 'TitleMove', array( $this, $nt, $wgUser ) );
+
 		// If it is a file, move it first.
 		// It is done before all other moving stuff is done because it's hard to revert.
 		$dbw = wfGetDB( DB_MASTER );
@@ -3711,12 +3777,12 @@ class Title {
 			# Protect the redirect title as the title used to be...
 			$dbw->insertSelect( 'page_restrictions', 'page_restrictions',
 				array(
-					'pr_page'    => $redirid,
-					'pr_type'    => 'pr_type',
-					'pr_level'   => 'pr_level',
+					'pr_page' => $redirid,
+					'pr_type' => 'pr_type',
+					'pr_level' => 'pr_level',
 					'pr_cascade' => 'pr_cascade',
-					'pr_user'    => 'pr_user',
-					'pr_expiry'  => 'pr_expiry'
+					'pr_user' => 'pr_user',
+					'pr_expiry' => 'pr_expiry'
 				),
 				array( 'pr_page' => $pageid ),
 				__METHOD__,
@@ -3733,7 +3799,7 @@ class Title {
 				$comment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
 			}
 			// @todo FIXME: $params?
-			$log->addEntry( 'move_prot', $nt, $comment, array( $this->getPrefixedText() ) );
+			$log->addEntry( 'move_prot', $nt, $comment, array( $this->getPrefixedText() ), $wgUser );
 		}
 
 		# Update watchlists
@@ -3775,7 +3841,8 @@ class Title {
 
 		if ( $createRedirect ) {
 			$contentHandler = ContentHandler::getForTitle( $this );
-			$redirectContent = $contentHandler->makeRedirectContent( $nt );
+			$redirectContent = $contentHandler->makeRedirectContent( $nt,
+				wfMessage( 'move-redirect-text' )->inContentLanguage()->plain() );
 
 			// NOTE: If this page's content model does not support redirects, $redirectContent will be null.
 		} else {
@@ -3830,14 +3897,20 @@ class Title {
 		$dbw->update( 'page',
 			/* SET */ array(
 				'page_namespace' => $nt->getNamespace(),
-				'page_title'     => $nt->getDBkey(),
+				'page_title' => $nt->getDBkey(),
 			),
 			/* WHERE */ array( 'page_id' => $oldid ),
 			__METHOD__
 		);
 
-		$this->resetArticleID( 0 );
+		// clean up the old title before reset article id - bug 45348
+		if ( !$redirectContent ) {
+			WikiPage::onArticleDelete( $this );
+		}
+
+		$this->resetArticleID( 0 ); // 0 == non existing
 		$nt->resetArticleID( $oldid );
+		$newpage->loadPageData( WikiPage::READ_LOCKING ); // bug 46397
 
 		$newpage->updateRevisionOn( $dbw, $nullRevision );
 
@@ -3851,17 +3924,17 @@ class Title {
 		}
 
 		# Recreate the redirect, this time in the other direction.
-		if ( !$redirectContent ) {
-			WikiPage::onArticleDelete( $this );
-		} else {
+		if ( $redirectContent ) {
 			$redirectArticle = WikiPage::factory( $this );
+			$redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // bug 46397
 			$newid = $redirectArticle->insertOn( $dbw );
 			if ( $newid ) { // sanity
+				$this->resetArticleID( $newid );
 				$redirectRevision = new Revision( array(
-					'title'   => $this, // for determining the default content model
-					'page'    => $newid,
+					'title' => $this, // for determining the default content model
+					'page' => $newid,
 					'comment' => $comment,
-					'content'    => $redirectContent ) );
+					'content' => $redirectContent ) );
 				$redirectRevision->insertOn( $dbw );
 				$redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
 
@@ -3963,7 +4036,9 @@ class Title {
 
 		# Is it a redirect?
 		$fields = array( 'page_is_redirect', 'page_latest', 'page_id' );
-		if ( $wgContentHandlerUseDB ) $fields[] = 'page_content_model';
+		if ( $wgContentHandlerUseDB ) {
+			$fields[] = 'page_content_model';
+		}
 
 		$row = $dbw->selectRow( 'page',
 			$fields,
@@ -4017,7 +4092,7 @@ class Title {
 		}
 		# Get the article text
 		$rev = Revision::newFromTitle( $nt, false, Revision::READ_LATEST );
-		if( !is_object( $rev ) ) {
+		if ( !is_object( $rev ) ) {
 			return false;
 		}
 		$content = $rev->getContent();
@@ -4070,8 +4145,8 @@ class Title {
 
 		if ( $res->numRows() > 0 ) {
 			foreach ( $res as $row ) {
-				// $data[] = Title::newFromText($wgContLang->getNSText ( NS_CATEGORY ).':'.$row->cl_to);
-				$data[$wgContLang->getNSText( NS_CATEGORY ) . ':' . $row->cl_to] = $this->getFullText();
+				// $data[] = Title::newFromText($wgContLang->getNsText ( NS_CATEGORY ).':'.$row->cl_to);
+				$data[$wgContLang->getNsText( NS_CATEGORY ) . ':' . $row->cl_to] = $this->getFullText();
 			}
 		}
 		return $data;
@@ -4319,7 +4394,7 @@ class Title {
 		// No DB query needed if $old and $new are the same or successive revisions:
 		if ( $old->getId() === $new->getId() ) {
 			return ( $old_cmp === '>' && $new_cmp === '<' ) ? 0 : 1;
-		} else if ( $old->getId() === $new->getParentId() ) {
+		} elseif ( $old->getId() === $new->getParentId() ) {
 			if ( $old_cmp === '>' || $new_cmp === '<' ) {
 				return ( $old_cmp === '>' && $new_cmp === '<' ) ? 0 : 1;
 			}
@@ -4414,7 +4489,7 @@ class Title {
 			return true;  // any interwiki link might be viewable, for all we know
 		}
 
-		switch( $this->mNamespace ) {
+		switch ( $this->mNamespace ) {
 			case NS_MEDIA:
 			case NS_FILE:
 				// file exists, possibly in a foreign repo
@@ -4500,27 +4575,23 @@ class Title {
 	 * @return Bool true if the update succeeded
 	 */
 	public function invalidateCache() {
-		global $wgMemc;
 		if ( wfReadOnly() ) {
 			return false;
 		}
-		$dbw = wfGetDB( DB_MASTER );
-		$success = $dbw->update(
-			'page',
-			array( 'page_touched' => $dbw->timestamp() ),
-			$this->pageCond(),
-			__METHOD__
-		);
-		HTMLFileCache::clearFileCache( $this );
 
-		// Clear page info.
-		$revision = WikiPage::factory( $this )->getRevision();
-		if( $revision !== null ) {
-			$memcKey = wfMemcKey( 'infoaction', $this->getPrefixedText(), $revision->getId() );
-			$success = $success && $wgMemc->delete( $memcKey );
-		}
+		$method = __METHOD__;
+		$dbw = wfGetDB( DB_MASTER );
+		$conds = $this->pageCond();
+		$dbw->onTransactionIdle( function() use ( $dbw, $conds, $method ) {
+			$dbw->update(
+				'page',
+				array( 'page_touched' => $dbw->timestamp() ),
+				$conds,
+				$method
+			);
+		} );
 
-		return $success;
+		return true;
 	}
 
 	/**
@@ -4568,7 +4639,7 @@ class Title {
 		if ( array_key_exists( $uid, $this->mNotificationTimestamp ) ) {
 			return $this->mNotificationTimestamp[$uid];
 		}
-		if ( !$uid || !$wgShowUpdatedMarker ) {
+		if ( !$uid || !$wgShowUpdatedMarker || !$user->isAllowed( 'viewmywatchlist' ) ) {
 			return $this->mNotificationTimestamp[$uid] = false;
 		}
 		// Don't cache too much!
@@ -4791,9 +4862,10 @@ class Title {
 	 * they will already be wrapped in paragraphs.
 	 *
 	 * @since 1.21
+	 * @param int oldid Revision ID that's being edited
 	 * @return Array
 	 */
-	public function getEditNotices() {
+	public function getEditNotices( $oldid = 0 ) {
 		$notices = array();
 
 		# Optional notices on a per-namespace and per-page basis
@@ -4820,6 +4892,8 @@ class Title {
 				$notices[$editnoticeText] = $editnoticeMsg->parseAsBlock();
 			}
 		}
+
+		wfRunHooks( 'TitleGetEditNotices', array( $this, $oldid, &$notices ) );
 		return $notices;
 	}
 }
diff --git a/includes/UIDGenerator.php b/includes/UIDGenerator.php
index b042d8c7..963e51a4 100644
--- a/includes/UIDGenerator.php
+++ b/includes/UIDGenerator.php
@@ -239,9 +239,9 @@ class UIDGenerator {
 		$data = explode( ' ', fgets( $handle ) ); // "<clk seq> <sec> <msec> <counter> <offset>"
 		$clockChanged = false; // clock set back significantly?
 		if ( count( $data ) == 5 ) { // last UID info already initialized
-			$clkSeq = (int) $data[0] % $clockSeqSize;
-			$prevTime = array( (int) $data[1], (int) $data[2] );
-			$offset = (int) $data[4] % $counterSize; // random counter offset
+			$clkSeq = (int)$data[0] % $clockSeqSize;
+			$prevTime = array( (int)$data[1], (int)$data[2] );
+			$offset = (int)$data[4] % $counterSize; // random counter offset
 			$counter = 0; // counter for UIDs with the same timestamp
 			// Delay until the clock reaches the time of the last ID.
 			// This detects any microtime() drift among processes.
@@ -251,7 +251,7 @@ class UIDGenerator {
 				$time = self::millitime();
 			} elseif ( $time == $prevTime ) {
 				// Bump the counter if there are timestamp collisions
-				$counter = (int) $data[3] % $counterSize;
+				$counter = (int)$data[3] % $counterSize;
 				if ( ++$counter >= $counterSize ) { // sanity (starts at 0)
 					flock( $handle, LOCK_UN ); // abort
 					throw new MWException( "Counter overflow for timestamp value." );
@@ -304,7 +304,7 @@ class UIDGenerator {
 			if ( $ct >= $time ) { // http://php.net/manual/en/language.operators.comparison.php
 				return $ct; // current timestamp is higher than $time
 			}
-		} while ( ( ( $time[0] - $ct[0] )*1000 + ( $time[1] - $ct[1] ) ) <= 10 );
+		} while ( ( ( $time[0] - $ct[0] ) * 1000 + ( $time[1] - $ct[1] ) ) <= 10 );
 
 		return false;
 	}
@@ -315,25 +315,12 @@ class UIDGenerator {
 	 */
 	protected function millisecondsSinceEpochBinary( array $time ) {
 		list( $sec, $msec ) = $time;
-		if ( PHP_INT_SIZE >= 8 ) { // 64 bit integers
-			$ts = ( 1000 * $sec + $msec );
-			$id_bin = str_pad( decbin( $ts % pow( 2, 46 ) ), 46, '0', STR_PAD_LEFT );
-		} elseif ( extension_loaded( 'gmp' ) ) {
-			$ts = gmp_mod( // wrap around
-				gmp_add( gmp_mul( (string) $sec, (string) 1000 ), (string) $msec ),
-				gmp_pow( '2', '46' )
-			);
-			$id_bin = str_pad( gmp_strval( $ts, 2 ), 46, '0', STR_PAD_LEFT );
-		} elseif ( extension_loaded( 'bcmath' ) ) {
-			$ts = bcmod( // wrap around
-				bcadd( bcmul( $sec, 1000 ), $msec ),
-				bcpow( 2, 46 )
-			);
-			$id_bin = wfBaseConvert( $ts, 10, 2, 46 );
-		} else {
-			throw new MWException( 'bcmath or gmp extension required for 32 bit machines.' );
+		$ts = 1000 * $sec + $msec;
+		if ( $ts > pow( 2, 52 ) ) {
+			throw new MWException( __METHOD__ .
+				': sorry, this function doesn\'t work after the year 144680' );
 		}
-		return $id_bin;
+		return substr( wfBaseConvert( $ts, 10, 2, 46 ), -46 );
 	}
 
 	/**
@@ -341,7 +328,7 @@ class UIDGenerator {
 	 */
 	protected static function millitime() {
 		list( $msec, $sec ) = explode( ' ', microtime() );
-		return array( (int) $sec, (int) ( $msec * 1000 ) );
+		return array( (int)$sec, (int)( $msec * 1000 ) );
 	}
 
 	function __destruct() {
diff --git a/includes/User.php b/includes/User.php
index 6b7348a8..12912e1c 100644
--- a/includes/User.php
+++ b/includes/User.php
@@ -124,6 +124,12 @@ class User {
 		'edit',
 		'editinterface',
 		'editprotected',
+		'editmyoptions',
+		'editmyprivateinfo',
+		'editmyusercss',
+		'editmyuserjs',
+		'editmywatchlist',
+		'editsemiprotected',
 		'editusercssjs', #deprecated
 		'editusercss',
 		'edituserjs',
@@ -164,6 +170,8 @@ class User {
 		'upload_by_url',
 		'userrights',
 		'userrights-interwiki',
+		'viewmyprivateinfo',
+		'viewmywatchlist',
 		'writeapi',
 	);
 	/**
@@ -251,7 +259,7 @@ class User {
 	}
 
 	/**
-	 * @return String
+	 * @return string
 	 */
 	function __toString() {
 		return $this->getName();
@@ -266,7 +274,7 @@ class User {
 		}
 		wfProfileIn( __METHOD__ );
 
-		# Set it now to avoid infinite recursion in accessors
+		// Set it now to avoid infinite recursion in accessors
 		$this->mLoadedItems = true;
 
 		switch ( $this->mFrom ) {
@@ -276,7 +284,7 @@ class User {
 			case 'name':
 				$this->mId = self::idFromName( $this->mName );
 				if ( !$this->mId ) {
-					# Nonexistent user placeholder object
+					// Nonexistent user placeholder object
 					$this->loadDefaults( $this->mName );
 				} else {
 					$this->loadFromId();
@@ -286,7 +294,7 @@ class User {
 				$this->loadFromId();
 				break;
 			case 'session':
-				if( !$this->loadFromSession() ) {
+				if ( !$this->loadFromSession() ) {
 					// Loading from session failed. Load defaults.
 					$this->loadDefaults();
 				}
@@ -301,7 +309,7 @@ class User {
 
 	/**
 	 * Load user table data, given mId has already been set.
-	 * @return Bool false if the ID does not exist, true otherwise
+	 * @return bool false if the ID does not exist, true otherwise
 	 */
 	public function loadFromId() {
 		global $wgMemc;
@@ -310,25 +318,25 @@ class User {
 			return false;
 		}
 
-		# Try cache
+		// Try cache
 		$key = wfMemcKey( 'user', 'id', $this->mId );
 		$data = $wgMemc->get( $key );
 		if ( !is_array( $data ) || $data['mVersion'] < MW_USER_VERSION ) {
-			# Object is expired, load from DB
+			// Object is expired, load from DB
 			$data = false;
 		}
 
 		if ( !$data ) {
 			wfDebug( "User: cache miss for user {$this->mId}\n" );
-			# Load from DB
+			// Load from DB
 			if ( !$this->loadFromDatabase() ) {
-				# Can't load from ID, user is anonymous
+				// Can't load from ID, user is anonymous
 				return false;
 			}
 			$this->saveToCache();
 		} else {
 			wfDebug( "User: got user {$this->mId} from cache\n" );
-			# Restore from cache
+			// Restore from cache
 			foreach ( self::$mCacheVars as $name ) {
 				$this->$name = $data[$name];
 			}
@@ -370,14 +378,14 @@ class User {
 	 * you have both an ID and a name handy.
 	 *
 	 * @param string $name Username, validated by Title::newFromText()
-	 * @param string|Bool $validate Validate username. Takes the same parameters as
-	 *    User::getCanonicalName(), except that true is accepted as an alias
-	 *    for 'valid', for BC.
+	 * @param string|bool $validate Validate username. Takes the same parameters as
+	 *  User::getCanonicalName(), except that true is accepted as an alias
+	 *  for 'valid', for BC.
 	 *
 	 * @return User|bool User object, or false if the username is invalid
-	 *    (e.g. if it contains illegal characters or is an IP address). If the
-	 *    username is not present in the database, the result will be a user object
-	 *    with a name, zero user ID and default settings.
+	 *  (e.g. if it contains illegal characters or is an IP address). If the
+	 *  username is not present in the database, the result will be a user object
+	 *  with a name, zero user ID and default settings.
 	 */
 	public static function newFromName( $name, $validate = 'valid' ) {
 		if ( $validate === true ) {
@@ -387,7 +395,7 @@ class User {
 		if ( $name === false ) {
 			return false;
 		} else {
-			# Create unloaded user object
+			// Create unloaded user object
 			$u = new User;
 			$u->mName = $name;
 			$u->mFrom = 'name';
@@ -418,7 +426,7 @@ class User {
 	 * If the code is invalid or has expired, returns NULL.
 	 *
 	 * @param string $code Confirmation code
-	 * @return User object, or null
+	 * @return User|null
 	 */
 	public static function newFromConfirmationCode( $code ) {
 		$dbr = wfGetDB( DB_SLAVE );
@@ -426,7 +434,7 @@ class User {
 			'user_email_token' => md5( $code ),
 			'user_email_token_expires > ' . $dbr->addQuotes( $dbr->timestamp() ),
 			) );
-		if( $id !== false ) {
+		if ( $id !== false ) {
 			return User::newFromId( $id );
 		} else {
 			return null;
@@ -437,7 +445,7 @@ class User {
 	 * Create a new user object using data from session or cookies. If the
 	 * login credentials are invalid, the result is an anonymous user.
 	 *
-	 * @param $request WebRequest object to use; $wgRequest will be used if omitted.
+	 * @param WebRequest $request Object to use; $wgRequest will be used if omitted.
 	 * @return User object
 	 */
 	public static function newFromSession( WebRequest $request = null ) {
@@ -472,7 +480,7 @@ class User {
 	/**
 	 * Get the username corresponding to a given user ID
 	 * @param int $id User ID
-	 * @return String|bool The corresponding username
+	 * @return string|bool The corresponding username
 	 */
 	public static function whoIs( $id ) {
 		return UserCache::singleton()->getProp( $id, 'name' );
@@ -482,7 +490,7 @@ class User {
 	 * Get the real name of a user given their user ID
 	 *
 	 * @param int $id User ID
-	 * @return String|bool The corresponding user's real name
+	 * @return string|bool The corresponding user's real name
 	 */
 	public static function whoIsReal( $id ) {
 		return UserCache::singleton()->getProp( $id, 'real_name' );
@@ -491,12 +499,12 @@ class User {
 	/**
 	 * Get database id given a user name
 	 * @param string $name Username
-	 * @return Int|Null The corresponding user's ID, or null if user is nonexistent
+	 * @return int|null The corresponding user's ID, or null if user is nonexistent
 	 */
 	public static function idFromName( $name ) {
 		$nt = Title::makeTitleSafe( NS_USER, $name );
-		if( is_null( $nt ) ) {
-			# Illegal name
+		if ( is_null( $nt ) ) {
+			// Illegal name
 			return null;
 		}
 
@@ -542,8 +550,8 @@ class User {
 	 * addresses like this, if we allowed accounts like this to be created
 	 * new users could get the old edits of these anonymous users.
 	 *
-	 * @param string $name to match
-	 * @return Bool
+	 * @param string $name Name to match
+	 * @return bool
 	 */
 	public static function isIP( $name ) {
 		return preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/', $name ) || IP::isIPv6( $name );
@@ -557,8 +565,8 @@ class User {
 	 * is longer than the maximum allowed username size or doesn't begin with
 	 * a capital letter.
 	 *
-	 * @param string $name to match
-	 * @return Bool
+	 * @param string $name Name to match
+	 * @return bool
 	 */
 	public static function isValidUserName( $name ) {
 		global $wgContLang, $wgMaxNameChars;
@@ -576,7 +584,7 @@ class User {
 		// Ensure that the name can't be misresolved as a different title,
 		// such as with extra namespace keys at the start.
 		$parsed = Title::newFromText( $name );
-		if( is_null( $parsed )
+		if ( is_null( $parsed )
 			|| $parsed->getNamespace()
 			|| strcmp( $name, $parsed->getPrefixedText() ) ) {
 			wfDebugLog( 'username', __METHOD__ .
@@ -594,7 +602,7 @@ class User {
 			'\x{3000}' .          # ideographic space
 			'\x{e000}-\x{f8ff}' . # private use
 			']/u';
-		if( preg_match( $unicodeBlacklist, $name ) ) {
+		if ( preg_match( $unicodeBlacklist, $name ) ) {
 			wfDebugLog( 'username', __METHOD__ .
 				": '$name' invalid due to blacklisted characters" );
 			return false;
@@ -611,8 +619,8 @@ class User {
 	 * If an account already exists in this form, login will be blocked
 	 * by a failure to pass this function.
 	 *
-	 * @param string $name to match
-	 * @return Bool
+	 * @param string $name Name to match
+	 * @return bool
 	 */
 	public static function isUsableName( $name ) {
 		global $wgReservedUsernames;
@@ -649,7 +657,7 @@ class User {
 	 * isValidUserName() to avoid disrupting existing accounts.
 	 *
 	 * @param string $name to match
-	 * @return Bool
+	 * @return bool
 	 */
 	public static function isCreatableName( $name ) {
 		global $wgInvalidUsernameCharacters;
@@ -657,15 +665,15 @@ class User {
 		// Ensure that the username isn't longer than 235 bytes, so that
 		// (at least for the builtin skins) user javascript and css files
 		// will work. (bug 23080)
-		if( strlen( $name ) > 235 ) {
+		if ( strlen( $name ) > 235 ) {
 			wfDebugLog( 'username', __METHOD__ .
 				": '$name' invalid due to length" );
 			return false;
 		}
 
 		// Preg yells if you try to give it an empty string
-		if( $wgInvalidUsernameCharacters !== '' ) {
-			if( preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name ) ) {
+		if ( $wgInvalidUsernameCharacters !== '' ) {
+			if ( preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name ) ) {
 				wfDebugLog( 'username', __METHOD__ .
 					": '$name' invalid due to wgInvalidUsernameCharacters" );
 				return false;
@@ -679,7 +687,7 @@ class User {
 	 * Is the input a valid password for this user?
 	 *
 	 * @param string $password Desired password
-	 * @return Bool
+	 * @return bool
 	 */
 	public function isValidPassword( $password ) {
 		//simple boolean wrapper for getPasswordValidity
@@ -702,15 +710,16 @@ class User {
 
 		$result = false; //init $result to false for the internal checks
 
-		if( !wfRunHooks( 'isValidPassword', array( $password, &$result, $this ) ) )
+		if ( !wfRunHooks( 'isValidPassword', array( $password, &$result, $this ) ) ) {
 			return $result;
+		}
 
 		if ( $result === false ) {
-			if( strlen( $password ) < $wgMinimalPasswordLength ) {
+			if ( strlen( $password ) < $wgMinimalPasswordLength ) {
 				return 'passwordtooshort';
 			} elseif ( $wgContLang->lc( $password ) == $wgContLang->lc( $this->mName ) ) {
 				return 'password-name-match';
-			} elseif ( isset( $blockedLogins[ $this->getName() ] ) && $password == $blockedLogins[ $this->getName() ] ) {
+			} elseif ( isset( $blockedLogins[$this->getName()] ) && $password == $blockedLogins[$this->getName()] ) {
 				return 'password-login-forbidden';
 			} else {
 				//it seems weird returning true here, but this is because of the
@@ -719,7 +728,7 @@ class User {
 				//a valid password.
 				return true;
 			}
-		} elseif( $result === true ) {
+		} elseif ( $result === true ) {
 			return true;
 		} else {
 			return $result; //the isValidPassword hook set a string $result and returned true
@@ -730,7 +739,7 @@ class User {
 	 * Does a string look like an e-mail address?
 	 *
 	 * This validates an email address using an HTML5 specification found at:
-	 * http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address
+	 * http://www.whatwg.org/html/states-of-the-type-attribute.html#valid-e-mail-address
 	 * Which as of 2011-01-24 says:
 	 *
 	 *     A valid e-mail address is a string that matches the ABNF production
@@ -750,7 +759,7 @@ class User {
 	 * pass validation here.
 	 *
 	 * @param string $addr E-mail address
-	 * @return Bool
+	 * @return bool
 	 * @deprecated since 1.18 call Sanitizer::isValidEmail() directly
 	 */
 	public static function isValidEmailAddr( $addr ) {
@@ -762,7 +771,7 @@ class User {
 	 * Given unvalidated user input, return a canonical username, or false if
 	 * the username is invalid.
 	 * @param string $name User input
-	 * @param string|Bool $validate type of validation to use:
+	 * @param string|bool $validate type of validation to use:
 	 *                - false        No validation
 	 *                - 'valid'      Valid for batch processes
 	 *                - 'usable'     Valid for batch processes and login
@@ -772,25 +781,26 @@ class User {
 	 * @return bool|string
 	 */
 	public static function getCanonicalName( $name, $validate = 'valid' ) {
-		# Force usernames to capital
+		// Force usernames to capital
 		global $wgContLang;
 		$name = $wgContLang->ucfirst( $name );
 
 		# Reject names containing '#'; these will be cleaned up
 		# with title normalisation, but then it's too late to
 		# check elsewhere
-		if( strpos( $name, '#' ) !== false )
+		if ( strpos( $name, '#' ) !== false ) {
 			return false;
+		}
 
-		# Clean up name according to title rules
+		// Clean up name according to title rules
 		$t = ( $validate === 'valid' ) ?
 			Title::newFromText( $name ) : Title::makeTitle( NS_USER, $name );
-		# Check for invalid titles
-		if( is_null( $t ) ) {
+		// Check for invalid titles
+		if ( is_null( $t ) ) {
 			return false;
 		}
 
-		# Reject various classes of invalid names
+		// Reject various classes of invalid names
 		global $wgAuth;
 		$name = $wgAuth->getCanonicalName( $t->getText() );
 
@@ -822,7 +832,7 @@ class User {
 	 * Count the number of edits of a user
 	 *
 	 * @param int $uid User ID to check
-	 * @return Int the user's edit count
+	 * @return int The user's edit count
 	 *
 	 * @deprecated since 1.21 in favour of User::getEditCount
 	 */
@@ -835,7 +845,7 @@ class User {
 	/**
 	 * Return a random password.
 	 *
-	 * @return String new random password
+	 * @return string New random password
 	 */
 	public static function randomPassword() {
 		global $wgMinimalPasswordLength;
@@ -870,7 +880,7 @@ class User {
 		$this->mOptionsLoaded = false;
 
 		$loggedOut = $this->getRequest()->getCookie( 'LoggedOut' );
-		if( $loggedOut !== null ) {
+		if ( $loggedOut !== null ) {
 			$this->mTouched = wfTimestamp( TS_MW, $loggedOut );
 		} else {
 			$this->mTouched = '1'; # Allow any pages to be cached
@@ -898,7 +908,7 @@ class User {
 	 * @param string $all 'all' to check if the whole object has been loaded
 	 *        or any other string to check if only the item is available (e.g.
 	 *        for optimisation)
-	 * @return Boolean
+	 * @return boolean
 	 */
 	public function isItemLoaded( $item, $all = 'all' ) {
 		return ( $this->mLoadedItems === true && $all === 'all' ) ||
@@ -908,9 +918,9 @@ class User {
 	/**
 	 * Set that an item has been loaded
 	 *
-	 * @param $item String
+	 * @param string $item
 	 */
-	private function setItemLoaded( $item ) {
+	protected function setItemLoaded( $item ) {
 		if ( is_array( $this->mLoadedItems ) ) {
 			$this->mLoadedItems[$item] = true;
 		}
@@ -918,25 +928,15 @@ class User {
 
 	/**
 	 * Load user data from the session or login cookie.
-	 * @return Bool True if the user is logged in, false otherwise.
+	 * @return bool True if the user is logged in, false otherwise.
 	 */
 	private function loadFromSession() {
-		global $wgExternalAuthType, $wgAutocreatePolicy;
-
 		$result = null;
 		wfRunHooks( 'UserLoadFromSession', array( $this, &$result ) );
 		if ( $result !== null ) {
 			return $result;
 		}
 
-		if ( $wgExternalAuthType && $wgAutocreatePolicy == 'view' ) {
-			$extUser = ExternalUser::newFromCookie();
-			if ( $extUser ) {
-				# TODO: Automatically create the user here (or probably a bit
-				# lower down, in fact)
-			}
-		}
-
 		$request = $this->getRequest();
 
 		$cookieId = $request->getCookie( 'UserID' );
@@ -944,7 +944,7 @@ class User {
 
 		if ( $cookieId !== null ) {
 			$sId = intval( $cookieId );
-			if( $sessId !== null && $cookieId != $sessId ) {
+			if ( $sessId !== null && $cookieId != $sessId ) {
 				wfDebugLog( 'loginSessions', "Session user ID ($sessId) and
 					cookie user ID ($sId) don't match!" );
 				return false;
@@ -967,13 +967,13 @@ class User {
 
 		$proposedUser = User::newFromId( $sId );
 		if ( !$proposedUser->isLoggedIn() ) {
-			# Not a valid ID
+			// Not a valid ID
 			return false;
 		}
 
 		global $wgBlockDisablesLogin;
-		if( $wgBlockDisablesLogin && $proposedUser->isBlocked() ) {
-			# User blocked and we've disabled blocked user logins
+		if ( $wgBlockDisablesLogin && $proposedUser->isBlocked() ) {
+			// User blocked and we've disabled blocked user logins
 			return false;
 		}
 
@@ -987,7 +987,7 @@ class User {
 			$passwordCorrect = ( strlen( $token ) && $token === $request->getCookie( 'Token' ) );
 			$from = 'cookie';
 		} else {
-			# No session or persistent login cookie
+			// No session or persistent login cookie
 			return false;
 		}
 
@@ -997,7 +997,7 @@ class User {
 			wfDebug( "User: logged in from $from\n" );
 			return true;
 		} else {
-			# Invalid credentials
+			// Invalid credentials
 			wfDebug( "User: can't log in from $from, invalid credentials\n" );
 			return false;
 		}
@@ -1007,14 +1007,14 @@ class User {
 	 * Load user and user_group data from the database.
 	 * $this->mId must be set, this is how the user is identified.
 	 *
-	 * @return Bool True if the user exists, false if the user is anonymous
+	 * @return bool True if the user exists, false if the user is anonymous
 	 */
 	public function loadFromDatabase() {
-		# Paranoia
+		// Paranoia
 		$this->mId = intval( $this->mId );
 
-		/** Anonymous user */
-		if( !$this->mId ) {
+		// Anonymous user
+		if ( !$this->mId ) {
 			$this->loadDefaults();
 			return false;
 		}
@@ -1025,13 +1025,13 @@ class User {
 		wfRunHooks( 'UserLoadFromDatabase', array( $this, &$s ) );
 
 		if ( $s !== false ) {
-			# Initialise user table data
+			// Initialise user table data
 			$this->loadFromRow( $s );
 			$this->mGroups = null; // deferred
 			$this->getEditCount(); // revalidation for nulls
 			return true;
 		} else {
-			# Invalid user_id
+			// Invalid user_id
 			$this->mId = 0;
 			$this->loadDefaults();
 			return false;
@@ -1162,16 +1162,20 @@ class User {
 	 * @see $wgAutopromoteOnce
 	 */
 	public function addAutopromoteOnceGroups( $event ) {
-		global $wgAutopromoteOnceLogInRC;
+		global $wgAutopromoteOnceLogInRC, $wgAuth;
 
 		$toPromote = array();
 		if ( $this->getId() ) {
 			$toPromote = Autopromote::getAutopromoteOnceGroups( $this, $event );
 			if ( count( $toPromote ) ) {
 				$oldGroups = $this->getGroups(); // previous groups
+
 				foreach ( $toPromote as $group ) {
 					$this->addGroup( $group );
 				}
+				// update groups in external authentication database
+				$wgAuth->updateExternalDBGroups( $this, $toPromote );
+
 				$newGroups = array_merge( $oldGroups, $toPromote ); // all groups
 
 				$logEntry = new ManualLogEntry( 'rights', 'autopromote' );
@@ -1194,7 +1198,7 @@ class User {
 	 * Clear various cached data stored in this object. The cache of the user table
 	 * data (i.e. self::$mCacheVars) is not cleared unless $reloadFrom is given.
 	 *
-	 * @param bool|String $reloadFrom Reload user and user_groups table data from a
+	 * @param bool|string $reloadFrom Reload user and user_groups table data from a
 	 *   given source. May be "name", "id", "defaults", "session", or false for
 	 *   no reload.
 	 */
@@ -1235,11 +1239,13 @@ class User {
 		}
 
 		$defOpt = $wgDefaultUserOptions;
-		# default language setting
-		$defOpt['variant'] = $wgContLang->getCode();
+		// Default language setting
 		$defOpt['language'] = $wgContLang->getCode();
-		foreach( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
-			$defOpt['searchNs'.$nsnum] = !empty( $wgNamespacesToBeSearchedDefault[$nsnum] );
+		foreach ( LanguageConverter::$languagesWithVariants as $langCode ) {
+			$defOpt[$langCode == $wgContLang->getCode() ? 'variant' : "variant-$langCode"] = $langCode;
+		}
+		foreach ( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
+			$defOpt['searchNs' . $nsnum] = !empty( $wgNamespacesToBeSearchedDefault[$nsnum] );
 		}
 		$defOpt['skin'] = $wgDefaultSkin;
 
@@ -1252,11 +1258,11 @@ class User {
 	 * Get a given default option value.
 	 *
 	 * @param string $opt Name of option to retrieve
-	 * @return String Default option value
+	 * @return string Default option value
 	 */
 	public static function getDefaultOption( $opt ) {
 		$defOpts = self::getDefaultOptions();
-		if( isset( $defOpts[$opt] ) ) {
+		if ( isset( $defOpts[$opt] ) ) {
 			return $defOpts[$opt];
 		} else {
 			return null;
@@ -1271,14 +1277,14 @@ class User {
 	 *                    done against master.
 	 */
 	private function getBlockedStatus( $bFromSlave = true ) {
-		global $wgProxyWhitelist, $wgUser;
+		global $wgProxyWhitelist, $wgUser, $wgApplyIpBlocksToXff;
 
 		if ( -1 != $this->mBlockedby ) {
 			return;
 		}
 
 		wfProfileIn( __METHOD__ );
-		wfDebug( __METHOD__.": checking...\n" );
+		wfDebug( __METHOD__ . ": checking...\n" );
 
 		// Initialize data...
 		// Otherwise something ends up stomping on $this->mBlockedby when
@@ -1296,14 +1302,14 @@ class User {
 			$ip = null;
 		}
 
-		# User/IP blocking
+		// User/IP blocking
 		$block = Block::newFromTarget( $this, $ip, !$bFromSlave );
 
-		# Proxy blocking
+		// Proxy blocking
 		if ( !$block instanceof Block && $ip !== null && !$this->isAllowed( 'proxyunbannable' )
 			&& !in_array( $ip, $wgProxyWhitelist ) )
 		{
-			# Local list
+			// Local list
 			if ( self::isLocallyBlockedProxy( $ip ) ) {
 				$block = new Block;
 				$block->setBlocker( wfMessage( 'proxyblocker' )->text() );
@@ -1317,6 +1323,25 @@ class User {
 			}
 		}
 
+		// (bug 23343) Apply IP blocks to the contents of XFF headers, if enabled
+		if ( !$block instanceof Block
+			&& $wgApplyIpBlocksToXff
+			&& $ip !== null
+			&& !$this->isAllowed( 'proxyunbannable' )
+			&& !in_array( $ip, $wgProxyWhitelist )
+		) {
+			$xff = $this->getRequest()->getHeader( 'X-Forwarded-For' );
+			$xff = array_map( 'trim', explode( ',', $xff ) );
+			$xff = array_diff( $xff, array( $ip ) );
+			$xffblocks = Block::getBlocksForIPList( $xff, $this->isAnon(), !$bFromSlave );
+			$block = Block::chooseBlock( $xffblocks, $xff );
+			if ( $block instanceof Block ) {
+				# Mangle the reason to alert the user that the block
+				# originated from matching the X-Forwarded-For header.
+				$block->mReason = wfMessage( 'xffblockreason', $block->mReason )->text();
+			}
+		}
+
 		if ( $block instanceof Block ) {
 			wfDebug( __METHOD__ . ": Found block.\n" );
 			$this->mBlock = $block;
@@ -1330,7 +1355,7 @@ class User {
 			$this->mAllowUsertalk = false;
 		}
 
-		# Extensions
+		// Extensions
 		wfRunHooks( 'GetBlockedStatus', array( &$this ) );
 
 		wfProfileOut( __METHOD__ );
@@ -1341,17 +1366,19 @@ class User {
 	 *
 	 * @param string $ip IP to check
 	 * @param bool $checkWhitelist whether to check the whitelist first
-	 * @return Bool True if blacklisted.
+	 * @return bool True if blacklisted.
 	 */
 	public function isDnsBlacklisted( $ip, $checkWhitelist = false ) {
 		global $wgEnableSorbs, $wgEnableDnsBlacklist,
 			$wgSorbsUrl, $wgDnsBlacklistUrls, $wgProxyWhitelist;
 
-		if ( !$wgEnableDnsBlacklist && !$wgEnableSorbs )
+		if ( !$wgEnableDnsBlacklist && !$wgEnableSorbs ) {
 			return false;
+		}
 
-		if ( $checkWhitelist && in_array( $ip, $wgProxyWhitelist ) )
+		if ( $checkWhitelist && in_array( $ip, $wgProxyWhitelist ) ) {
 			return false;
+		}
 
 		$urls = array_merge( $wgDnsBlacklistUrls, (array)$wgSorbsUrl );
 		return $this->inDnsBlacklist( $ip, $urls );
@@ -1362,23 +1389,23 @@ class User {
 	 *
 	 * @param string $ip IP to check
 	 * @param string|array $bases of Strings: URL of the DNS blacklist
-	 * @return Bool True if blacklisted.
+	 * @return bool True if blacklisted.
 	 */
 	public function inDnsBlacklist( $ip, $bases ) {
 		wfProfileIn( __METHOD__ );
 
 		$found = false;
 		// @todo FIXME: IPv6 ???  (http://bugs.php.net/bug.php?id=33170)
-		if( IP::isIPv4( $ip ) ) {
-			# Reverse IP, bug 21255
+		if ( IP::isIPv4( $ip ) ) {
+			// Reverse IP, bug 21255
 			$ipReversed = implode( '.', array_reverse( explode( '.', $ip ) ) );
 
-			foreach( (array)$bases as $base ) {
-				# Make hostname
-				# If we have an access key, use that too (ProjectHoneypot, etc.)
-				if( is_array( $base ) ) {
-					if( count( $base ) >= 2 ) {
-						# Access key is 1, base URL is 0
+			foreach ( (array)$bases as $base ) {
+				// Make hostname
+				// If we have an access key, use that too (ProjectHoneypot, etc.)
+				if ( is_array( $base ) ) {
+					if ( count( $base ) >= 2 ) {
+						// Access key is 1, base URL is 0
 						$host = "{$base[1]}.$ipReversed.{$base[0]}";
 					} else {
 						$host = "$ipReversed.{$base[0]}";
@@ -1387,10 +1414,10 @@ class User {
 					$host = "$ipReversed.$base";
 				}
 
-				# Send query
+				// Send query
 				$ipList = gethostbynamel( $host );
 
-				if( $ipList ) {
+				if ( $ipList ) {
 					wfDebugLog( 'dnsblacklist', "Hostname $host is {$ipList[0]}, it's a proxy says $base!\n" );
 					$found = true;
 					break;
@@ -1420,7 +1447,7 @@ class User {
 		wfProfileIn( __METHOD__ );
 
 		if ( !is_array( $wgProxyList ) ) {
-			# Load from the specified file
+			// Load from the specified file
 			$wgProxyList = array_map( 'trim', file( $wgProxyList ) );
 		}
 
@@ -1429,7 +1456,7 @@ class User {
 		} elseif ( array_search( $ip, $wgProxyList ) !== false ) {
 			$ret = true;
 		} elseif ( array_key_exists( $ip, $wgProxyList ) ) {
-			# Old-style flipped proxy list
+			// Old-style flipped proxy list
 			$ret = true;
 		} else {
 			$ret = false;
@@ -1441,11 +1468,11 @@ class User {
 	/**
 	 * Is this user subject to rate limiting?
 	 *
-	 * @return Bool True if rate limited
+	 * @return bool True if rate limited
 	 */
 	public function isPingLimitable() {
 		global $wgRateLimitsExcludedIPs;
-		if( in_array( $this->getRequest()->getIP(), $wgRateLimitsExcludedIPs ) ) {
+		if ( in_array( $this->getRequest()->getIP(), $wgRateLimitsExcludedIPs ) ) {
 			// No other good way currently to disable rate limits
 			// for specific IPs. :P
 			// But this is a crappy hack and should die.
@@ -1462,23 +1489,25 @@ class User {
 	 * last-hit counters will be shared across wikis.
 	 *
 	 * @param string $action Action to enforce; 'edit' if unspecified
-	 * @return Bool True if a rate limiter was tripped
+	 * @param integer $incrBy Positive amount to increment counter by [defaults to 1]
+	 * @return bool True if a rate limiter was tripped
 	 */
-	public function pingLimiter( $action = 'edit' ) {
-		# Call the 'PingLimiter' hook
+	public function pingLimiter( $action = 'edit', $incrBy = 1 ) {
+		// Call the 'PingLimiter' hook
 		$result = false;
-		if( !wfRunHooks( 'PingLimiter', array( &$this, $action, &$result ) ) ) {
+		if ( !wfRunHooks( 'PingLimiter', array( &$this, $action, &$result, $incrBy ) ) ) {
 			return $result;
 		}
 
 		global $wgRateLimits;
-		if( !isset( $wgRateLimits[$action] ) ) {
+		if ( !isset( $wgRateLimits[$action] ) ) {
 			return false;
 		}
 
-		# Some groups shouldn't trigger the ping limiter, ever
-		if( !$this->isPingLimitable() )
+		// Some groups shouldn't trigger the ping limiter, ever
+		if ( !$this->isPingLimitable() ) {
 			return false;
+		}
 
 		global $wgMemc, $wgRateLimitLog;
 		wfProfileIn( __METHOD__ );
@@ -1486,27 +1515,37 @@ class User {
 		$limits = $wgRateLimits[$action];
 		$keys = array();
 		$id = $this->getId();
-		$ip = $this->getRequest()->getIP();
 		$userLimit = false;
 
-		if( isset( $limits['anon'] ) && $id == 0 ) {
+		if ( isset( $limits['anon'] ) && $id == 0 ) {
 			$keys[wfMemcKey( 'limiter', $action, 'anon' )] = $limits['anon'];
 		}
 
-		if( isset( $limits['user'] ) && $id != 0 ) {
+		if ( isset( $limits['user'] ) && $id != 0 ) {
 			$userLimit = $limits['user'];
 		}
-		if( $this->isNewbie() ) {
-			if( isset( $limits['newbie'] ) && $id != 0 ) {
+		if ( $this->isNewbie() ) {
+			if ( isset( $limits['newbie'] ) && $id != 0 ) {
 				$keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $limits['newbie'];
 			}
-			if( isset( $limits['ip'] ) ) {
+			if ( isset( $limits['ip'] ) ) {
+				$ip = $this->getRequest()->getIP();
 				$keys["mediawiki:limiter:$action:ip:$ip"] = $limits['ip'];
 			}
-			$matches = array();
-			if( isset( $limits['subnet'] ) && preg_match( '/^(\d+\.\d+\.\d+)\.\d+$/', $ip, $matches ) ) {
-				$subnet = $matches[1];
-				$keys["mediawiki:limiter:$action:subnet:$subnet"] = $limits['subnet'];
+			if ( isset( $limits['subnet'] ) ) {
+				$ip = $this->getRequest()->getIP();
+				$matches = array();
+				$subnet = false;
+				if ( IP::isIPv6( $ip ) ) {
+					$parts = IP::parseRange( "$ip/64" );
+					$subnet = $parts[0];
+				} elseif ( preg_match( '/^(\d+\.\d+\.\d+)\.\d+$/', $ip, $matches ) ) {
+					// IPv4
+					$subnet = $matches[1];
+				}
+				if ( $subnet !== false ) {
+					$keys["mediawiki:limiter:$action:subnet:$subnet"] = $limits['subnet'];
+				}
 			}
 		}
 		// Check for group-specific permissions
@@ -1520,20 +1559,21 @@ class User {
 		}
 		// Set the user limit key
 		if ( $userLimit !== false ) {
-			wfDebug( __METHOD__ . ": effective user limit: $userLimit\n" );
-			$keys[ wfMemcKey( 'limiter', $action, 'user', $id ) ] = $userLimit;
+			list( $max, $period ) = $userLimit;
+			wfDebug( __METHOD__ . ": effective user limit: $max in {$period}s\n" );
+			$keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $userLimit;
 		}
 
 		$triggered = false;
-		foreach( $keys as $key => $limit ) {
+		foreach ( $keys as $key => $limit ) {
 			list( $max, $period ) = $limit;
 			$summary = "(limit $max in {$period}s)";
 			$count = $wgMemc->get( $key );
 			// Already pinged?
-			if( $count ) {
-				if( $count >= $max ) {
+			if ( $count ) {
+				if ( $count >= $max ) {
 					wfDebug( __METHOD__ . ": tripped! $key at $count $summary\n" );
-					if( $wgRateLimitLog ) {
+					if ( $wgRateLimitLog ) {
 						wfSuppressWarnings();
 						file_put_contents( $wgRateLimitLog, wfTimestamp( TS_MW ) . ' ' . wfWikiID() . ': ' . $this->getName() . " tripped $key at $count $summary\n", FILE_APPEND );
 						wfRestoreWarnings();
@@ -1544,9 +1584,13 @@ class User {
 				}
 			} else {
 				wfDebug( __METHOD__ . ": adding record for $key $summary\n" );
-				$wgMemc->add( $key, 0, intval( $period ) ); // first ping
+				if ( $incrBy > 0 ) {
+					$wgMemc->add( $key, 0, intval( $period ) ); // first ping
+				}
+			}
+			if ( $incrBy > 0 ) {
+				$wgMemc->incr( $key, $incrBy );
 			}
-			$wgMemc->incr( $key );
 		}
 
 		wfProfileOut( __METHOD__ );
@@ -1557,7 +1601,7 @@ class User {
 	 * Check if user is blocked
 	 *
 	 * @param bool $bFromSlave Whether to check the slave database instead of the master
-	 * @return Bool True if blocked, false otherwise
+	 * @return bool True if blocked, false otherwise
 	 */
 	public function isBlocked( $bFromSlave = true ) { // hacked from false due to horrible probs on site
 		return $this->getBlock( $bFromSlave ) instanceof Block && $this->getBlock()->prevents( 'edit' );
@@ -1577,9 +1621,9 @@ class User {
 	/**
 	 * Check if user is blocked from editing a particular article
 	 *
-	 * @param $title Title to check
+	 * @param Title $title Title to check
 	 * @param bool $bFromSlave whether to check the slave database instead of the master
-	 * @return Bool
+	 * @return bool
 	 */
 	function isBlockedFrom( $title, $bFromSlave = false ) {
 		global $wgBlockAllowsUTEdit;
@@ -1587,7 +1631,7 @@ class User {
 
 		$blocked = $this->isBlocked( $bFromSlave );
 		$allowUsertalk = ( $wgBlockAllowsUTEdit ? $this->mAllowUsertalk : false );
-		# If a user's name is suppressed, they cannot make edits anywhere
+		// If a user's name is suppressed, they cannot make edits anywhere
 		if ( !$this->mHideName && $allowUsertalk && $title->getText() === $this->getName() &&
 		  $title->getNamespace() == NS_USER_TALK ) {
 			$blocked = false;
@@ -1602,7 +1646,7 @@ class User {
 
 	/**
 	 * If user is blocked, return the name of the user who placed the block
-	 * @return String name of blocker
+	 * @return string Name of blocker
 	 */
 	public function blockedBy() {
 		$this->getBlockedStatus();
@@ -1611,7 +1655,7 @@ class User {
 
 	/**
 	 * If user is blocked, return the specified reason for the block
-	 * @return String Blocking reason
+	 * @return string Blocking reason
 	 */
 	public function blockedFor() {
 		$this->getBlockedStatus();
@@ -1620,7 +1664,7 @@ class User {
 
 	/**
 	 * If user is blocked, return the ID for the block
-	 * @return Int Block ID
+	 * @return int Block ID
 	 */
 	public function getBlockId() {
 		$this->getBlockedStatus();
@@ -1633,16 +1677,16 @@ class User {
 	 * This is intended for quick UI checks.
 	 *
 	 * @param string $ip IP address, uses current client if none given
-	 * @return Bool True if blocked, false otherwise
+	 * @return bool True if blocked, false otherwise
 	 */
 	public function isBlockedGlobally( $ip = '' ) {
-		if( $this->mBlockedGlobally !== null ) {
+		if ( $this->mBlockedGlobally !== null ) {
 			return $this->mBlockedGlobally;
 		}
 		// User is already an IP?
-		if( IP::isIPAddress( $this->getName() ) ) {
+		if ( IP::isIPAddress( $this->getName() ) ) {
 			$ip = $this->getName();
-		} elseif( !$ip ) {
+		} elseif ( !$ip ) {
 			$ip = $this->getRequest()->getIP();
 		}
 		$blocked = false;
@@ -1654,13 +1698,14 @@ class User {
 	/**
 	 * Check if user account is locked
 	 *
-	 * @return Bool True if locked, false otherwise
+	 * @return bool True if locked, false otherwise
 	 */
 	public function isLocked() {
-		if( $this->mLocked !== null ) {
+		if ( $this->mLocked !== null ) {
 			return $this->mLocked;
 		}
 		global $wgAuth;
+		StubObject::unstub( $wgAuth );
 		$authUser = $wgAuth->getUserInstance( $this );
 		$this->mLocked = (bool)$authUser->isLocked();
 		return $this->mLocked;
@@ -1669,15 +1714,16 @@ class User {
 	/**
 	 * Check if user account is hidden
 	 *
-	 * @return Bool True if hidden, false otherwise
+	 * @return bool True if hidden, false otherwise
 	 */
 	public function isHidden() {
-		if( $this->mHideName !== null ) {
+		if ( $this->mHideName !== null ) {
 			return $this->mHideName;
 		}
 		$this->getBlockedStatus();
-		if( !$this->mHideName ) {
+		if ( !$this->mHideName ) {
 			global $wgAuth;
+			StubObject::unstub( $wgAuth );
 			$authUser = $wgAuth->getUserInstance( $this );
 			$this->mHideName = (bool)$authUser->isHidden();
 		}
@@ -1686,14 +1732,13 @@ class User {
 
 	/**
 	 * Get the user's ID.
-	 * @return Int The user's ID; 0 if the user is anonymous or nonexistent
+	 * @return int The user's ID; 0 if the user is anonymous or nonexistent
 	 */
 	public function getId() {
-		if( $this->mId === null && $this->mName !== null
-		&& User::isIP( $this->mName ) ) {
+		if ( $this->mId === null && $this->mName !== null && User::isIP( $this->mName ) ) {
 			// Special case, we know the user is anonymous
 			return 0;
-		} elseif( !$this->isItemLoaded( 'id' ) ) {
+		} elseif ( !$this->isItemLoaded( 'id' ) ) {
 			// Don't load if this was initialized from an ID
 			$this->load();
 		}
@@ -1711,16 +1756,16 @@ class User {
 
 	/**
 	 * Get the user name, or the IP of an anonymous user
-	 * @return String User's name or IP address
+	 * @return string User's name or IP address
 	 */
 	public function getName() {
 		if ( $this->isItemLoaded( 'name', 'only' ) ) {
-			# Special case optimisation
+			// Special case optimisation
 			return $this->mName;
 		} else {
 			$this->load();
 			if ( $this->mName === false ) {
-				# Clean up IPs
+				// Clean up IPs
 				$this->mName = IP::sanitizeIP( $this->getRequest()->getIP() );
 			}
 			return $this->mName;
@@ -1747,7 +1792,7 @@ class User {
 
 	/**
 	 * Get the user's name escaped by underscores.
-	 * @return String Username escaped by underscores.
+	 * @return string Username escaped by underscores.
 	 */
 	public function getTitleKey() {
 		return str_replace( ' ', '_', $this->getName() );
@@ -1755,27 +1800,27 @@ class User {
 
 	/**
 	 * Check if the user has new messages.
-	 * @return Bool True if the user has new messages
+	 * @return bool True if the user has new messages
 	 */
 	public function getNewtalk() {
 		$this->load();
 
-		# Load the newtalk status if it is unloaded (mNewtalk=-1)
-		if( $this->mNewtalk === -1 ) {
+		// Load the newtalk status if it is unloaded (mNewtalk=-1)
+		if ( $this->mNewtalk === -1 ) {
 			$this->mNewtalk = false; # reset talk page status
 
-			# Check memcached separately for anons, who have no
-			# entire User object stored in there.
-			if( !$this->mId ) {
+			// Check memcached separately for anons, who have no
+			// entire User object stored in there.
+			if ( !$this->mId ) {
 				global $wgDisableAnonTalk;
-				if( $wgDisableAnonTalk ) {
+				if ( $wgDisableAnonTalk ) {
 					// Anon newtalk disabled by configuration.
 					$this->mNewtalk = false;
 				} else {
 					global $wgMemc;
 					$key = wfMemcKey( 'newtalk', 'ip', $this->getName() );
 					$newtalk = $wgMemc->get( $key );
-					if( strval( $newtalk ) !== '' ) {
+					if ( strval( $newtalk ) !== '' ) {
 						$this->mNewtalk = (bool)$newtalk;
 					} else {
 						// Since we are caching this, make sure it is up to date by getting it
@@ -1793,14 +1838,23 @@ class User {
 	}
 
 	/**
-	 * Return the talk page(s) this user has new messages on.
-	 * @return Array of String page URLs
+	 * Return the data needed to construct links for new talk page message
+	 * alerts. If there are new messages, this will return an associative array
+	 * with the following data:
+	 *     wiki: The database name of the wiki
+	 *     link: Root-relative link to the user's talk page
+	 *     rev: The last talk page revision that the user has seen or null. This
+	 *         is useful for building diff links.
+	 * If there are no new messages, it returns an empty array.
+	 * @note This function was designed to accomodate multiple talk pages, but
+	 * currently only returns a single link and revision.
+	 * @return Array
 	 */
 	public function getNewMessageLinks() {
 		$talks = array();
-		if( !wfRunHooks( 'UserRetrieveNewTalks', array( &$this, &$talks ) ) ) {
+		if ( !wfRunHooks( 'UserRetrieveNewTalks', array( &$this, &$talks ) ) ) {
 			return $talks;
-		} elseif( !$this->getNewtalk() ) {
+		} elseif ( !$this->getNewtalk() ) {
 			return array();
 		}
 		$utp = $this->getTalkPage();
@@ -1814,14 +1868,37 @@ class User {
 		return array( array( 'wiki' => wfWikiID(), 'link' => $utp->getLocalURL(), 'rev' => $rev ) );
 	}
 
+	/**
+	 * Get the revision ID for the last talk page revision viewed by the talk
+	 * page owner.
+	 * @return int|null Revision ID or null
+	 */
+	public function getNewMessageRevisionId() {
+		$newMessageRevisionId = null;
+		$newMessageLinks = $this->getNewMessageLinks();
+		if ( $newMessageLinks ) {
+			// Note: getNewMessageLinks() never returns more than a single link
+			// and it is always for the same wiki, but we double-check here in
+			// case that changes some time in the future.
+			if ( count( $newMessageLinks ) === 1
+				&& $newMessageLinks[0]['wiki'] === wfWikiID()
+				&& $newMessageLinks[0]['rev']
+			) {
+				$newMessageRevision = $newMessageLinks[0]['rev'];
+				$newMessageRevisionId = $newMessageRevision->getId();
+			}
+		}
+		return $newMessageRevisionId;
+	}
+
 	/**
 	 * Internal uncached check for new messages
 	 *
 	 * @see getNewtalk()
 	 * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
-	 * @param string|Int $id User's IP address for anonymous users, User ID otherwise
+	 * @param string|int $id User's IP address for anonymous users, User ID otherwise
 	 * @param bool $fromMaster true to fetch from the master, false for a slave
-	 * @return Bool True if the user has new messages
+	 * @return bool True if the user has new messages
 	 */
 	protected function checkNewtalk( $field, $id, $fromMaster = false ) {
 		if ( $fromMaster ) {
@@ -1837,9 +1914,9 @@ class User {
 	/**
 	 * Add or update the new messages flag
 	 * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
-	 * @param string|Int $id User's IP address for anonymous users, User ID otherwise
+	 * @param string|int $id User's IP address for anonymous users, User ID otherwise
 	 * @param $curRev Revision new, as yet unseen revision of the user talk page. Ignored if null.
-	 * @return Bool True if successful, false otherwise
+	 * @return bool True if successful, false otherwise
 	 */
 	protected function updateNewtalk( $field, $id, $curRev = null ) {
 		// Get timestamp of the talk page revision prior to the current one
@@ -1863,8 +1940,8 @@ class User {
 	/**
 	 * Clear the new messages flag for the given user
 	 * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
-	 * @param string|Int $id User's IP address for anonymous users, User ID otherwise
-	 * @return Bool True if successful, false otherwise
+	 * @param string|int $id User's IP address for anonymous users, User ID otherwise
+	 * @return bool True if successful, false otherwise
 	 */
 	protected function deleteNewtalk( $field, $id ) {
 		$dbw = wfGetDB( DB_MASTER );
@@ -1886,14 +1963,14 @@ class User {
 	 * @param $curRev Revision new, as yet unseen revision of the user talk page. Ignored if null or !$val.
 	 */
 	public function setNewtalk( $val, $curRev = null ) {
-		if( wfReadOnly() ) {
+		if ( wfReadOnly() ) {
 			return;
 		}
 
 		$this->load();
 		$this->mNewtalk = $val;
 
-		if( $this->isAnon() ) {
+		if ( $this->isAnon() ) {
 			$field = 'user_ip';
 			$id = $this->getName();
 		} else {
@@ -1902,13 +1979,13 @@ class User {
 		}
 		global $wgMemc;
 
-		if( $val ) {
+		if ( $val ) {
 			$changed = $this->updateNewtalk( $field, $id, $curRev );
 		} else {
 			$changed = $this->deleteNewtalk( $field, $id );
 		}
 
-		if( $this->isAnon() ) {
+		if ( $this->isAnon() ) {
 			// Anons have a separate memcached space, since
 			// user records aren't kept for them.
 			$key = wfMemcKey( 'newtalk', 'ip', $id );
@@ -1922,7 +1999,7 @@ class User {
 	/**
 	 * Generate a current or new-future timestamp to be stored in the
 	 * user_touched field when we update things.
-	 * @return String Timestamp in TS_MW format
+	 * @return string Timestamp in TS_MW format
 	 */
 	private static function newTouchedTimestamp() {
 		global $wgClockSkewFudge;
@@ -1938,7 +2015,7 @@ class User {
 	 */
 	private function clearSharedCache() {
 		$this->load();
-		if( $this->mId ) {
+		if ( $this->mId ) {
 			global $wgMemc;
 			$wgMemc->delete( wfMemcKey( 'user', 'id', $this->mId ) );
 		}
@@ -1950,28 +2027,30 @@ class User {
 	 * for reload on the next hit.
 	 */
 	public function invalidateCache() {
-		if( wfReadOnly() ) {
+		if ( wfReadOnly() ) {
 			return;
 		}
 		$this->load();
-		if( $this->mId ) {
+		if ( $this->mId ) {
 			$this->mTouched = self::newTouchedTimestamp();
 
 			$dbw = wfGetDB( DB_MASTER );
-
-			// Prevent contention slams by checking user_touched first
-			$now = $dbw->timestamp( $this->mTouched );
-			$needsPurge = $dbw->selectField( 'user', '1',
-				array( 'user_id' => $this->mId, 'user_touched < ' . $dbw->addQuotes( $now ) )
-			);
-			if ( $needsPurge ) {
-				$dbw->update( 'user',
-					array( 'user_touched' => $now ),
-					array( 'user_id' => $this->mId, 'user_touched < ' . $dbw->addQuotes( $now ) ),
-					__METHOD__
-				);
-			}
-
+			$userid = $this->mId;
+			$touched = $this->mTouched;
+			$method = __METHOD__;
+			$dbw->onTransactionIdle( function() use ( $dbw, $userid, $touched, $method ) {
+				// Prevent contention slams by checking user_touched first
+				$encTouched = $dbw->addQuotes( $dbw->timestamp( $touched ) );
+				$needsPurge = $dbw->selectField( 'user', '1',
+					array( 'user_id' => $userid, 'user_touched < ' . $encTouched ) );
+				if ( $needsPurge ) {
+					$dbw->update( 'user',
+						array( 'user_touched' => $dbw->timestamp( $touched ) ),
+						array( 'user_id' => $userid, 'user_touched < ' . $encTouched ),
+						$method
+					);
+				}
+			} );
 			$this->clearSharedCache();
 		}
 	}
@@ -1979,7 +2058,6 @@ class User {
 	/**
 	 * Validate the cache for this account.
 	 * @param string $timestamp A timestamp in TS_MW format
-	 *
 	 * @return bool
 	 */
 	public function validateCache( $timestamp ) {
@@ -1989,7 +2067,7 @@ class User {
 
 	/**
 	 * Get the user touched timestamp
-	 * @return String timestamp
+	 * @return string timestamp
 	 */
 	public function getTouched() {
 		$this->load();
@@ -2015,12 +2093,12 @@ class User {
 	public function setPassword( $str ) {
 		global $wgAuth;
 
-		if( $str !== null ) {
-			if( !$wgAuth->allowPasswordChange() ) {
+		if ( $str !== null ) {
+			if ( !$wgAuth->allowPasswordChange() ) {
 				throw new PasswordError( wfMessage( 'password-change-forbidden' )->text() );
 			}
 
-			if( !$this->isValidPassword( $str ) ) {
+			if ( !$this->isValidPassword( $str ) ) {
 				global $wgMinimalPasswordLength;
 				$valid = $this->getPasswordValidity( $str );
 				if ( is_array( $valid ) ) {
@@ -2034,7 +2112,7 @@ class User {
 			}
 		}
 
-		if( !$wgAuth->setPassword( $this, $str ) ) {
+		if ( !$wgAuth->setPassword( $this, $str ) ) {
 			throw new PasswordError( wfMessage( 'externaldberror' )->text() );
 		}
 
@@ -2047,14 +2125,14 @@ class User {
 	 * Set the password and reset the random token unconditionally.
 	 *
 	 * @param string|null $str New password to set or null to set an invalid
-	 *        password hash meaning that the user will not be able to log in
-	 *        through the web interface.
+	 *  password hash meaning that the user will not be able to log in
+	 *  through the web interface.
 	 */
 	public function setInternalPassword( $str ) {
 		$this->load();
 		$this->setToken();
 
-		if( $str === null ) {
+		if ( $str === null ) {
 			// Save an invalid hash...
 			$this->mPassword = '';
 		} else {
@@ -2067,7 +2145,7 @@ class User {
 	/**
 	 * Get the user's current token.
 	 * @param bool $forceCreation Force the generation of a new token if the user doesn't have one (default=true for backwards compatibility)
-	 * @return String Token
+	 * @return string Token
 	 */
 	public function getToken( $forceCreation = true ) {
 		$this->load();
@@ -2109,7 +2187,7 @@ class User {
 	/**
 	 * Has password reminder email been sent within the last
 	 * $wgPasswordReminderResendTime hours?
-	 * @return Bool
+	 * @return bool
 	 */
 	public function isPasswordReminderThrottled() {
 		global $wgPasswordReminderResendTime;
@@ -2123,7 +2201,7 @@ class User {
 
 	/**
 	 * Get the user's e-mail address
-	 * @return String User's email address
+	 * @return string User's email address
 	 */
 	public function getEmail() {
 		$this->load();
@@ -2133,7 +2211,7 @@ class User {
 
 	/**
 	 * Get the timestamp of the user's e-mail authentication
-	 * @return String TS_MW timestamp
+	 * @return string TS_MW timestamp
 	 */
 	public function getEmailAuthenticationTimestamp() {
 		$this->load();
@@ -2147,7 +2225,7 @@ class User {
 	 */
 	public function setEmail( $str ) {
 		$this->load();
-		if( $str == $this->mEmail ) {
+		if ( $str == $this->mEmail ) {
 			return;
 		}
 		$this->mEmail = $str;
@@ -2177,11 +2255,11 @@ class User {
 		$this->setEmail( $str );
 
 		if ( $str !== '' && $wgEmailAuthentication ) {
-			# Send a confirmation request to the new address if needed
+			// Send a confirmation request to the new address if needed
 			$type = $oldaddr != '' ? 'changed' : 'set';
 			$result = $this->sendConfirmationMail( $type );
 			if ( $result->isGood() ) {
-				# Say the the caller that a confirmation mail has been sent
+				// Say the the caller that a confirmation mail has been sent
 				$result->value = 'eauth';
 			}
 		} else {
@@ -2193,7 +2271,7 @@ class User {
 
 	/**
 	 * Get the user's real name
-	 * @return String User's real name
+	 * @return string User's real name
 	 */
 	public function getRealName() {
 		if ( !$this->isItemLoaded( 'realname' ) ) {
@@ -2217,8 +2295,8 @@ class User {
 	 *
 	 * @param string $oname The option to check
 	 * @param string $defaultOverride A default value returned if the option does not exist
-	 * @param bool $ignoreHidden = whether to ignore the effects of $wgHiddenPrefs
-	 * @return String User's current value for the option
+	 * @param bool $ignoreHidden Whether to ignore the effects of $wgHiddenPrefs
+	 * @return string User's current value for the option
 	 * @see getBoolOption()
 	 * @see getIntOption()
 	 */
@@ -2231,7 +2309,7 @@ class User {
 		# set it, and then it was disabled removing their ability to change it).  But
 		# we don't want to erase the preferences in the database in case the preference
 		# is re-enabled again.  So don't touch $mOptions, just override the returned value
-		if( in_array( $oname, $wgHiddenPrefs ) && !$ignoreHidden ) {
+		if ( !$ignoreHidden && in_array( $oname, $wgHiddenPrefs ) ) {
 			return self::getDefaultOption( $oname );
 		}
 
@@ -2257,9 +2335,9 @@ class User {
 		# set it, and then it was disabled removing their ability to change it).  But
 		# we don't want to erase the preferences in the database in case the preference
 		# is re-enabled again.  So don't touch $mOptions, just override the returned value
-		foreach( $wgHiddenPrefs as $pref ) {
+		foreach ( $wgHiddenPrefs as $pref ) {
 			$default = self::getDefaultOption( $pref );
-			if( $default !== null ) {
+			if ( $default !== null ) {
 				$options[$pref] = $default;
 			}
 		}
@@ -2271,7 +2349,7 @@ class User {
 	 * Get the user's current setting for a given option, as a boolean value.
 	 *
 	 * @param string $oname The option to check
-	 * @return Bool User's current value for the option
+	 * @return bool User's current value for the option
 	 * @see getOption()
 	 */
 	public function getBoolOption( $oname ) {
@@ -2279,16 +2357,16 @@ class User {
 	}
 
 	/**
-	 * Get the user's current setting for a given option, as a boolean value.
+	 * Get the user's current setting for a given option, as an integer value.
 	 *
 	 * @param string $oname The option to check
 	 * @param int $defaultOverride A default value returned if the option does not exist
-	 * @return Int User's current value for the option
+	 * @return int User's current value for the option
 	 * @see getOption()
 	 */
 	public function getIntOption( $oname, $defaultOverride = 0 ) {
 		$val = $this->getOption( $oname );
-		if( $val == '' ) {
+		if ( $val == '' ) {
 			$val = $defaultOverride;
 		}
 		return intval( $val );
@@ -2298,19 +2376,62 @@ class User {
 	 * Set the given option for a user.
 	 *
 	 * @param string $oname The option to set
-	 * @param $val mixed New value to set
+	 * @param mixed $val New value to set
 	 */
 	public function setOption( $oname, $val ) {
 		$this->loadOptions();
 
 		// Explicitly NULL values should refer to defaults
-		if( is_null( $val ) ) {
+		if ( is_null( $val ) ) {
 			$val = self::getDefaultOption( $oname );
 		}
 
 		$this->mOptions[$oname] = $val;
 	}
 
+	/**
+	 * Get a token stored in the preferences (like the watchlist one),
+	 * resetting it if it's empty (and saving changes).
+	 *
+	 * @param string $oname The option name to retrieve the token from
+	 * @return string|bool User's current value for the option, or false if this option is disabled.
+	 * @see resetTokenFromOption()
+	 * @see getOption()
+	 */
+	public function getTokenFromOption( $oname ) {
+		global $wgHiddenPrefs;
+		if ( in_array( $oname, $wgHiddenPrefs ) ) {
+			return false;
+		}
+
+		$token = $this->getOption( $oname );
+		if ( !$token ) {
+			$token = $this->resetTokenFromOption( $oname );
+			$this->saveSettings();
+		}
+		return $token;
+	}
+
+	/**
+	 * Reset a token stored in the preferences (like the watchlist one).
+	 * *Does not* save user's preferences (similarly to setOption()).
+	 *
+	 * @param string $oname The option name to reset the token in
+	 * @return string|bool New token value, or false if this option is disabled.
+	 * @see getTokenFromOption()
+	 * @see setOption()
+	 */
+	public function resetTokenFromOption( $oname ) {
+		global $wgHiddenPrefs;
+		if ( in_array( $oname, $wgHiddenPrefs ) ) {
+			return false;
+		}
+
+		$token = MWCryptRand::generateHex( 40 );
+		$this->setOption( $oname, $token );
+		return $token;
+	}
+
 	/**
 	 * Return a list of the types of user options currently returned by
 	 * User::getOptionKinds().
@@ -2400,9 +2521,9 @@ class User {
 		foreach ( $options as $key => $value ) {
 			if ( isset( $prefs[$key] ) ) {
 				$mapping[$key] = 'registered';
-			} elseif( isset( $multiselectOptions[$key] ) ) {
+			} elseif ( isset( $multiselectOptions[$key] ) ) {
 				$mapping[$key] = 'registered-multiselect';
-			} elseif( isset( $checkmatrixOptions[$key] ) ) {
+			} elseif ( isset( $checkmatrixOptions[$key] ) ) {
 				$mapping[$key] = 'registered-checkmatrix';
 			} elseif ( substr( $key, 0, 7 ) === 'userjs-' ) {
 				$mapping[$key] = 'userjs';
@@ -2422,11 +2543,11 @@ class User {
 	 * and 'all', which forces a reset of *all* preferences and overrides everything else.
 	 *
 	 * @param array|string $resetKinds which kinds of preferences to reset. Defaults to
-	 *             array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' )
-	 *             for backwards-compatibility.
+	 *  array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' )
+	 *  for backwards-compatibility.
 	 * @param $context IContextSource|null context source used when $resetKinds
-	 *             does not contain 'all', passed to getOptionKinds().
-	 *             Defaults to RequestContext::getMain() when null.
+	 *  does not contain 'all', passed to getOptionKinds().
+	 *  Defaults to RequestContext::getMain() when null.
 	 */
 	public function resetOptions(
 		$resetKinds = array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' ),
@@ -2469,7 +2590,7 @@ class User {
 
 	/**
 	 * Get the user's preferred date format.
-	 * @return String User's preferred date format
+	 * @return string User's preferred date format
 	 */
 	public function getDatePreference() {
 		// Important migration for old data rows
@@ -2485,6 +2606,26 @@ class User {
 		return $this->mDatePreference;
 	}
 
+	/**
+	 * Determine based on the wiki configuration and the user's options,
+	 * whether this user must be over HTTPS no matter what.
+	 *
+	 * @return bool
+	 */
+	public function requiresHTTPS() {
+		global $wgSecureLogin;
+		if ( !$wgSecureLogin ) {
+			return false;
+		} else {
+			$https = $this->getBoolOption( 'prefershttps' );
+			wfRunHooks( 'UserRequiresHTTPS', array( $this, &$https ) );
+			if ( $https ) {
+				$https = wfCanIPUseHTTPS( $this->getRequest()->getIP() );
+			}
+			return $https;
+		}
+	}
+
 	/**
 	 * Get the user preferred stub threshold
 	 *
@@ -2494,8 +2635,8 @@ class User {
 		global $wgMaxArticleSize; # Maximum article size, in Kb
 		$threshold = $this->getIntOption( 'stubthreshold' );
 		if ( $threshold > $wgMaxArticleSize * 1024 ) {
-			# If they have set an impossible value, disable the preference
-			# so we can use the parser cache again.
+			// If they have set an impossible value, disable the preference
+			// so we can use the parser cache again.
 			$threshold = 0;
 		}
 		return $threshold;
@@ -2540,7 +2681,7 @@ class User {
 				$this->getGroups(), // explicit groups
 				$this->getAutomaticGroups( $recache ) // implicit groups
 			) );
-			# Hook for additional groups
+			// Hook for additional groups
 			wfRunHooks( 'UserEffectiveGroups', array( &$this, &$this->mEffectiveGroups ) );
 			// Force reindexation of groups when a hook has unset one of them
 			$this->mEffectiveGroups = array_values( array_unique( $this->mEffectiveGroups ) );
@@ -2569,8 +2710,8 @@ class User {
 				) );
 			}
 			if ( $recache ) {
-				# Assure data consistency with rights/groups,
-				# as getEffectiveGroups() depends on this function
+				// Assure data consistency with rights/groups,
+				// as getEffectiveGroups() depends on this function
 				$this->mEffectiveGroups = null;
 			}
 			wfProfileOut( __METHOD__ );
@@ -2588,14 +2729,14 @@ class User {
 	 * @return array Names of the groups the user has belonged to.
 	 */
 	public function getFormerGroups() {
-		if( is_null( $this->mFormerGroups ) ) {
+		if ( is_null( $this->mFormerGroups ) ) {
 			$dbr = wfGetDB( DB_MASTER );
 			$res = $dbr->select( 'user_former_groups',
 				array( 'ufg_group' ),
 				array( 'ufg_user' => $this->mId ),
 				__METHOD__ );
 			$this->mFormerGroups = array();
-			foreach( $res as $row ) {
+			foreach ( $res as $row ) {
 				$this->mFormerGroups[] = $row->ufg_group;
 			}
 		}
@@ -2604,7 +2745,7 @@ class User {
 
 	/**
 	 * Get the user's edit count.
-	 * @return Int
+	 * @return int, null for anonymous users
 	 */
 	public function getEditCount() {
 		if ( !$this->getId() ) {
@@ -2622,14 +2763,14 @@ class User {
 				__METHOD__
 			);
 
-			if( $count === null ) {
+			if ( $count === null ) {
 				// it has not been initialized. do so.
 				$count = $this->initEditCount();
 			}
-			$this->mEditCount = intval( $count );
+			$this->mEditCount = $count;
 			wfProfileOut( __METHOD__ );
 		}
-		return $this->mEditCount;
+		return (int)$this->mEditCount;
 	}
 
 	/**
@@ -2638,9 +2779,9 @@ class User {
 	 * @param string $group Name of the group to add
 	 */
 	public function addGroup( $group ) {
-		if( wfRunHooks( 'UserAddGroup', array( $this, &$group ) ) ) {
+		if ( wfRunHooks( 'UserAddGroup', array( $this, &$group ) ) ) {
 			$dbw = wfGetDB( DB_MASTER );
-			if( $this->getId() ) {
+			if ( $this->getId() ) {
 				$dbw->insert( 'user_groups',
 					array(
 						'ug_user' => $this->getID(),
@@ -2652,7 +2793,14 @@ class User {
 		}
 		$this->loadGroups();
 		$this->mGroups[] = $group;
-		$this->mRights = User::getGroupPermissions( $this->getEffectiveGroups( true ) );
+		// In case loadGroups was not called before, we now have the right twice.
+		// Get rid of the duplicate.
+		$this->mGroups = array_unique( $this->mGroups );
+
+		// Refresh the groups caches, and clear the rights cache so it will be
+		// refreshed on the next call to $this->getRights().
+		$this->getEffectiveGroups( true );
+		$this->mRights = null;
 
 		$this->invalidateCache();
 	}
@@ -2664,7 +2812,7 @@ class User {
 	 */
 	public function removeGroup( $group ) {
 		$this->load();
-		if( wfRunHooks( 'UserRemoveGroup', array( $this, &$group ) ) ) {
+		if ( wfRunHooks( 'UserRemoveGroup', array( $this, &$group ) ) ) {
 			$dbw = wfGetDB( DB_MASTER );
 			$dbw->delete( 'user_groups',
 				array(
@@ -2682,14 +2830,18 @@ class User {
 		}
 		$this->loadGroups();
 		$this->mGroups = array_diff( $this->mGroups, array( $group ) );
-		$this->mRights = User::getGroupPermissions( $this->getEffectiveGroups( true ) );
+
+		// Refresh the groups caches, and clear the rights cache so it will be
+		// refreshed on the next call to $this->getRights().
+		$this->getEffectiveGroups( true );
+		$this->mRights = null;
 
 		$this->invalidateCache();
 	}
 
 	/**
 	 * Get whether the user is logged in
-	 * @return Bool
+	 * @return bool
 	 */
 	public function isLoggedIn() {
 		return $this->getID() != 0;
@@ -2697,7 +2849,7 @@ class User {
 
 	/**
 	 * Get whether the user is anonymous
-	 * @return Bool
+	 * @return bool
 	 */
 	public function isAnon() {
 		return !$this->isLoggedIn();
@@ -2707,14 +2859,14 @@ class User {
 	 * Check if user is allowed to access a feature / make an action
 	 *
 	 * @internal param \String $varargs permissions to test
-	 * @return Boolean: True if user is allowed to perform *any* of the given actions
+	 * @return boolean: True if user is allowed to perform *any* of the given actions
 	 *
 	 * @return bool
 	 */
 	public function isAllowedAny( /*...*/ ) {
 		$permissions = func_get_args();
-		foreach( $permissions as $permission ) {
-			if( $this->isAllowed( $permission ) ) {
+		foreach ( $permissions as $permission ) {
+			if ( $this->isAllowed( $permission ) ) {
 				return true;
 			}
 		}
@@ -2728,8 +2880,8 @@ class User {
 	 */
 	public function isAllowedAll( /*...*/ ) {
 		$permissions = func_get_args();
-		foreach( $permissions as $permission ) {
-			if( !$this->isAllowed( $permission ) ) {
+		foreach ( $permissions as $permission ) {
+			if ( !$this->isAllowed( $permission ) ) {
 				return false;
 			}
 		}
@@ -2738,27 +2890,28 @@ class User {
 
 	/**
 	 * Internal mechanics of testing a permission
-	 * @param $action String
+	 * @param string $action
 	 * @return bool
 	 */
 	public function isAllowed( $action = '' ) {
 		if ( $action === '' ) {
 			return true; // In the spirit of DWIM
 		}
-		# Patrolling may not be enabled
-		if( $action === 'patrol' || $action === 'autopatrol' ) {
+		// Patrolling may not be enabled
+		if ( $action === 'patrol' || $action === 'autopatrol' ) {
 			global $wgUseRCPatrol, $wgUseNPPatrol;
-			if( !$wgUseRCPatrol && !$wgUseNPPatrol )
+			if ( !$wgUseRCPatrol && !$wgUseNPPatrol ) {
 				return false;
+			}
 		}
-		# Use strict parameter to avoid matching numeric 0 accidentally inserted
-		# by misconfiguration: 0 == 'foo'
+		// Use strict parameter to avoid matching numeric 0 accidentally inserted
+		// by misconfiguration: 0 == 'foo'
 		return in_array( $action, $this->getRights(), true );
 	}
 
 	/**
 	 * Check whether to enable recent changes patrol features for this user
-	 * @return Boolean: True or false
+	 * @return boolean: True or false
 	 */
 	public function useRCPatrol() {
 		global $wgUseRCPatrol;
@@ -2767,11 +2920,14 @@ class User {
 
 	/**
 	 * Check whether to enable new pages patrol features for this user
-	 * @return Bool True or false
+	 * @return bool True or false
 	 */
 	public function useNPPatrol() {
 		global $wgUseRCPatrol, $wgUseNPPatrol;
-		return( ( $wgUseRCPatrol || $wgUseNPPatrol ) && ( $this->isAllowedAny( 'patrol', 'patrolmarks' ) ) );
+		return (
+			( $wgUseRCPatrol || $wgUseNPPatrol )
+				&& ( $this->isAllowedAny( 'patrol', 'patrolmarks' ) )
+		);
 	}
 
 	/**
@@ -2802,11 +2958,14 @@ class User {
 	/**
 	 * Get a WatchedItem for this user and $title.
 	 *
+	 * @since 1.22 $checkRights parameter added
 	 * @param $title Title
+	 * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+	 *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
 	 * @return WatchedItem
 	 */
-	public function getWatchedItem( $title ) {
-		$key = $title->getNamespace() . ':' . $title->getDBkey();
+	public function getWatchedItem( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+		$key = $checkRights . ':' . $title->getNamespace() . ':' . $title->getDBkey();
 
 		if ( isset( $this->mWatchedItems[$key] ) ) {
 			return $this->mWatchedItems[$key];
@@ -2816,34 +2975,43 @@ class User {
 			$this->mWatchedItems = array();
 		}
 
-		$this->mWatchedItems[$key] = WatchedItem::fromUserTitle( $this, $title );
+		$this->mWatchedItems[$key] = WatchedItem::fromUserTitle( $this, $title, $checkRights );
 		return $this->mWatchedItems[$key];
 	}
 
 	/**
 	 * Check the watched status of an article.
+	 * @since 1.22 $checkRights parameter added
 	 * @param $title Title of the article to look at
-	 * @return Bool
+	 * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+	 *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
+	 * @return bool
 	 */
-	public function isWatched( $title ) {
-		return $this->getWatchedItem( $title )->isWatched();
+	public function isWatched( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+		return $this->getWatchedItem( $title, $checkRights )->isWatched();
 	}
 
 	/**
 	 * Watch an article.
+	 * @since 1.22 $checkRights parameter added
 	 * @param $title Title of the article to look at
+	 * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+	 *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
 	 */
-	public function addWatch( $title ) {
-		$this->getWatchedItem( $title )->addWatch();
+	public function addWatch( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+		$this->getWatchedItem( $title, $checkRights )->addWatch();
 		$this->invalidateCache();
 	}
 
 	/**
 	 * Stop watching an article.
+	 * @since 1.22 $checkRights parameter added
 	 * @param $title Title of the article to look at
+	 * @param $checkRights int Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+	 *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
 	 */
-	public function removeWatch( $title ) {
-		$this->getWatchedItem( $title )->removeWatch();
+	public function removeWatch( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+		$this->getWatchedItem( $title, $checkRights )->removeWatch();
 		$this->invalidateCache();
 	}
 
@@ -2851,28 +3019,35 @@ class User {
 	 * Clear the user's notification timestamp for the given title.
 	 * If e-notif e-mails are on, they will receive notification mails on
 	 * the next change of the page if it's watched etc.
+	 * @note If the user doesn't have 'editmywatchlist', this will do nothing.
 	 * @param $title Title of the article to look at
 	 */
 	public function clearNotification( &$title ) {
 		global $wgUseEnotif, $wgShowUpdatedMarker;
 
-		# Do nothing if the database is locked to writes
-		if( wfReadOnly() ) {
+		// Do nothing if the database is locked to writes
+		if ( wfReadOnly() ) {
+			return;
+		}
+
+		// Do nothing if not allowed to edit the watchlist
+		if ( !$this->isAllowed( 'editmywatchlist' ) ) {
 			return;
 		}
 
-		if( $title->getNamespace() == NS_USER_TALK &&
+		if ( $title->getNamespace() == NS_USER_TALK &&
 			$title->getText() == $this->getName() ) {
-			if( !wfRunHooks( 'UserClearNewTalkNotification', array( &$this ) ) )
+			if ( !wfRunHooks( 'UserClearNewTalkNotification', array( &$this ) ) ) {
 				return;
+			}
 			$this->setNewtalk( false );
 		}
 
-		if( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
+		if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
 			return;
 		}
 
-		if( $this->isAnon() ) {
+		if ( $this->isAnon() ) {
 			// Nothing else to do...
 			return;
 		}
@@ -2895,19 +3070,25 @@ class User {
 	 * Resets all of the given user's page-change notification timestamps.
 	 * If e-notif e-mails are on, they will receive notification mails on
 	 * the next change of any watched page.
+	 * @note If the user doesn't have 'editmywatchlist', this will do nothing.
 	 */
 	public function clearAllNotifications() {
 		if ( wfReadOnly() ) {
 			return;
 		}
 
+		// Do nothing if not allowed to edit the watchlist
+		if ( !$this->isAllowed( 'editmywatchlist' ) ) {
+			return;
+		}
+
 		global $wgUseEnotif, $wgShowUpdatedMarker;
 		if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
 			$this->setNewtalk( false );
 			return;
 		}
 		$id = $this->getId();
-		if( $id != 0 ) {
+		if ( $id != 0 ) {
 			$dbw = wfGetDB( DB_MASTER );
 			$dbw->update( 'watchlist',
 				array( /* SET */
@@ -2929,8 +3110,9 @@ class User {
 	 */
 	private function decodeOptions( $str ) {
 		wfDeprecated( __METHOD__, '1.19' );
-		if( !$str )
+		if ( !$str ) {
 			return;
+		}
 
 		$this->mOptionsLoaded = true;
 		$this->mOptionOverrides = array();
@@ -2955,21 +3137,28 @@ class User {
 	 * @param string $value Value to set
 	 * @param int $exp Expiration time, as a UNIX time value;
 	 *                   if 0 or not specified, use the default $wgCookieExpiration
-	 * @param $secure Bool
+	 * @param bool $secure
 	 *  true: Force setting the secure attribute when setting the cookie
 	 *  false: Force NOT setting the secure attribute when setting the cookie
 	 *  null (default): Use the default ($wgCookieSecure) to set the secure attribute
+	 * @param array $params Array of options sent passed to WebResponse::setcookie()
 	 */
-	protected function setCookie( $name, $value, $exp = 0, $secure = null ) {
-		$this->getRequest()->response()->setcookie( $name, $value, $exp, null, null, $secure );
+	protected function setCookie( $name, $value, $exp = 0, $secure = null, $params = array() ) {
+		$params['secure'] = $secure;
+		$this->getRequest()->response()->setcookie( $name, $value, $exp, $params );
 	}
 
 	/**
 	 * Clear a cookie on the user's client
 	 * @param string $name Name of the cookie to clear
+	 * @param bool $secure
+	 *  true: Force setting the secure attribute when setting the cookie
+	 *  false: Force NOT setting the secure attribute when setting the cookie
+	 *  null (default): Use the default ($wgCookieSecure) to set the secure attribute
+	 * @param array $params Array of options sent passed to WebResponse::setcookie()
 	 */
-	protected function clearCookie( $name ) {
-		$this->setCookie( $name, '', time() - 86400 );
+	protected function clearCookie( $name, $secure = null, $params = array() ) {
+		$this->setCookie( $name, '', time() - 86400, $secure, $params );
 	}
 
 	/**
@@ -3027,10 +3216,22 @@ class User {
 		/**
 		 * If wpStickHTTPS was selected, also set an insecure cookie that
 		 * will cause the site to redirect the user to HTTPS, if they access
-		 * it over HTTP. Bug 29898.
+		 * it over HTTP. Bug 29898. Use an un-prefixed cookie, so it's the same
+		 * as the one set by centralauth (bug 53538). Also set it to session, or
+		 * standard time setting, based on if rememberme was set.
 		 */
-		if ( $request->getCheck( 'wpStickHTTPS' ) ) {
-			$this->setCookie( 'forceHTTPS', 'true', time() + 2592000, false ); //30 days
+		if ( $request->getCheck( 'wpStickHTTPS' ) || $this->requiresHTTPS() ) {
+			$time = null;
+			if ( ( 1 == $this->getOption( 'rememberpassword' ) ) ) {
+				$time = 0; // set to $wgCookieExpiration
+			}
+			$this->setCookie(
+				'forceHTTPS',
+				'true',
+				$time,
+				false,
+				array( 'prefix' => '' ) // no prefix
+			);
 		}
 	}
 
@@ -3038,7 +3239,7 @@ class User {
 	 * Log this user out.
 	 */
 	public function logout() {
-		if( wfRunHooks( 'UserLogout', array( &$this ) ) ) {
+		if ( wfRunHooks( 'UserLogout', array( &$this ) ) ) {
 			$this->doLogout();
 		}
 	}
@@ -3054,10 +3255,10 @@ class User {
 
 		$this->clearCookie( 'UserID' );
 		$this->clearCookie( 'Token' );
-		$this->clearCookie( 'forceHTTPS' );
+		$this->clearCookie( 'forceHTTPS', false, array( 'prefix' => '' ) );
 
-		# Remember when user logged out, to prevent seeing cached pages
-		$this->setCookie( 'LoggedOut', wfTimestampNow(), time() + 86400 );
+		// Remember when user logged out, to prevent seeing cached pages
+		$this->setCookie( 'LoggedOut', time(), time() + 86400 );
 	}
 
 	/**
@@ -3068,8 +3269,12 @@ class User {
 		global $wgAuth;
 
 		$this->load();
-		if ( wfReadOnly() ) { return; }
-		if ( 0 == $this->mId ) { return; }
+		if ( wfReadOnly() ) {
+			return;
+		}
+		if ( 0 == $this->mId ) {
+			return;
+		}
 
 		$this->mTouched = self::newTouchedTimestamp();
 		if ( !$wgAuth->allowSetLocalPassword() ) {
@@ -3104,11 +3309,13 @@ class User {
 
 	/**
 	 * If only this user's username is known, and it exists, return the user ID.
-	 * @return Int
+	 * @return int
 	 */
 	public function idForName() {
 		$s = trim( $this->getName() );
-		if ( $s === '' ) return 0;
+		if ( $s === '' ) {
+			return 0;
+		}
 
 		$dbr = wfGetDB( DB_SLAVE );
 		$id = $dbr->selectField( 'user', 'user_id', array( 'user_name' => $s ), __METHOD__ );
@@ -3206,6 +3413,7 @@ class User {
 		$this->mTouched = self::newTouchedTimestamp();
 
 		$dbw = wfGetDB( DB_MASTER );
+		$inWrite = $dbw->writesOrCallbacksPending();
 		$seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
 		$dbw->insert( 'user',
 			array(
@@ -3225,6 +3433,12 @@ class User {
 			array( 'IGNORE' )
 		);
 		if ( !$dbw->affectedRows() ) {
+			if ( !$inWrite ) {
+				// XXX: Get out of REPEATABLE-READ so the SELECT below works.
+				// Often this case happens early in views before any writes.
+				// This shows up at least with CentralAuth.
+				$dbw->commit( __METHOD__, 'flush' );
+			}
 			$this->mId = $dbw->selectField( 'user', 'user_id',
 				array( 'user_name' => $this->mName ), __METHOD__ );
 			$loaded = false;
@@ -3234,8 +3448,8 @@ class User {
 				}
 			}
 			if ( !$loaded ) {
-				throw new MWException( __METHOD__. ": hit a key conflict attempting " .
-					"to insert a user row, but then it doesn't exist when we select it!" );
+				throw new MWException( __METHOD__ . ": hit a key conflict attempting " .
+					"to insert user '{$this->mName}' row, but it was not present in select!" );
 			}
 			return Status::newFatal( 'userexists' );
 		}
@@ -3292,13 +3506,13 @@ class User {
 	 * settings.
 	 *
 	 * @deprecated since 1.17 use the ParserOptions object to get the relevant options
-	 * @return String Page rendering hash
+	 * @return string Page rendering hash
 	 */
 	public function getPageRenderingHash() {
 		wfDeprecated( __METHOD__, '1.17' );
 
 		global $wgRenderHashAppend, $wgLang, $wgContLang;
-		if( $this->mHash ) {
+		if ( $this->mHash ) {
 			return $this->mHash;
 		}
 
@@ -3332,11 +3546,11 @@ class User {
 
 	/**
 	 * Get whether the user is explicitly blocked from account creation.
-	 * @return Bool|Block
+	 * @return bool|Block
 	 */
 	public function isBlockedFromCreateAccount() {
 		$this->getBlockedStatus();
-		if( $this->mBlock && $this->mBlock->prevents( 'createaccount' ) ) {
+		if ( $this->mBlock && $this->mBlock->prevents( 'createaccount' ) ) {
 			return $this->mBlock;
 		}
 
@@ -3353,7 +3567,7 @@ class User {
 
 	/**
 	 * Get whether the user is blocked from using Special:Emailuser.
-	 * @return Bool
+	 * @return bool
 	 */
 	public function isBlockedFromEmailuser() {
 		$this->getBlockedStatus();
@@ -3362,7 +3576,7 @@ class User {
 
 	/**
 	 * Get whether the user is allowed to create an account.
-	 * @return Bool
+	 * @return bool
 	 */
 	function isAllowedToCreateAccount() {
 		return $this->isAllowed( 'createaccount' ) && !$this->isBlockedFromCreateAccount();
@@ -3390,7 +3604,7 @@ class User {
 	/**
 	 * Determine whether the user is a newbie. Newbies are either
 	 * anonymous IPs, or the most recently created accounts.
-	 * @return Bool
+	 * @return bool
 	 */
 	public function isNewbie() {
 		return !$this->isAllowed( 'autoconfirmed' );
@@ -3399,7 +3613,7 @@ class User {
 	/**
 	 * Check to see if the given clear-text password is one of the accepted passwords
 	 * @param string $password user password.
-	 * @return Boolean: True if the given password is correct, otherwise False.
+	 * @return boolean: True if the given password is correct, otherwise False.
 	 */
 	public function checkPassword( $password ) {
 		global $wgAuth, $wgLegacyEncoding;
@@ -3410,24 +3624,24 @@ class User {
 		// to. Certain authentication plugins do NOT want to save
 		// domain passwords in a mysql database, so we should
 		// check this (in case $wgAuth->strict() is false).
-		if( !$this->isValidPassword( $password ) ) {
+		if ( !$this->isValidPassword( $password ) ) {
 			return false;
 		}
 
-		if( $wgAuth->authenticate( $this->getName(), $password ) ) {
+		if ( $wgAuth->authenticate( $this->getName(), $password ) ) {
 			return true;
-		} elseif( $wgAuth->strict() ) {
-			/* Auth plugin doesn't allow local authentication */
+		} elseif ( $wgAuth->strict() ) {
+			// Auth plugin doesn't allow local authentication
 			return false;
-		} elseif( $wgAuth->strictUserAuth( $this->getName() ) ) {
-			/* Auth plugin doesn't allow local authentication for this user name */
+		} elseif ( $wgAuth->strictUserAuth( $this->getName() ) ) {
+			// Auth plugin doesn't allow local authentication for this user name
 			return false;
 		}
 		if ( self::comparePasswords( $this->mPassword, $password, $this->mId ) ) {
 			return true;
 		} elseif ( $wgLegacyEncoding ) {
-			# Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
-			# Check for this with iconv
+			// Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
+			// Check for this with iconv
 			$cp1252Password = iconv( 'UTF-8', 'WINDOWS-1252//TRANSLIT', $password );
 			if ( $cp1252Password != $password &&
 				self::comparePasswords( $this->mPassword, $cp1252Password, $this->mId ) )
@@ -3444,13 +3658,13 @@ class User {
 	 *
 	 * @param $plaintext string
 	 *
-	 * @return Boolean: True if matches, false otherwise
+	 * @return boolean: True if matches, false otherwise
 	 */
 	public function checkTemporaryPassword( $plaintext ) {
 		global $wgNewPasswordExpiry;
 
 		$this->load();
-		if( self::comparePasswords( $this->mNewpassword, $plaintext, $this->getId() ) ) {
+		if ( self::comparePasswords( $this->mNewpassword, $plaintext, $this->getId() ) ) {
 			if ( is_null( $this->mNewpassTime ) ) {
 				return true;
 			}
@@ -3467,7 +3681,7 @@ class User {
 	 *
 	 * @param string|array $salt of Strings Optional function-specific data for hashing
 	 * @param $request WebRequest object to use or null to use $wgRequest
-	 * @return String The new edit token
+	 * @return string The new edit token
 	 */
 	public function editToken( $salt = '', $request = null ) {
 		wfDeprecated( __METHOD__, '1.19' );
@@ -3484,7 +3698,7 @@ class User {
 	 *
 	 * @param string|array $salt of Strings Optional function-specific data for hashing
 	 * @param $request WebRequest object to use or null to use $wgRequest
-	 * @return String The new edit token
+	 * @return string The new edit token
 	 */
 	public function getEditToken( $salt = '', $request = null ) {
 		if ( $request == null ) {
@@ -3499,7 +3713,7 @@ class User {
 				$token = MWCryptRand::generateHex( 32 );
 				$request->setSessionData( 'wsEditToken', $token );
 			}
-			if( is_array( $salt ) ) {
+			if ( is_array( $salt ) ) {
 				$salt = implode( '|', $salt );
 			}
 			return md5( $token . $salt ) . EDIT_TOKEN_SUFFIX;
@@ -3509,8 +3723,8 @@ class User {
 	/**
 	 * Generate a looking random token for various uses.
 	 *
-	 * @return String The new random token
-	 * @deprecated since 1.20; Use MWCryptRand for secure purposes or wfRandomString for pseudo-randomness
+	 * @return string The new random token
+	 * @deprecated since 1.20: Use MWCryptRand for secure purposes or wfRandomString for pseudo-randomness
 	 */
 	public static function generateToken() {
 		return MWCryptRand::generateHex( 32 );
@@ -3524,8 +3738,8 @@ class User {
 	 *
 	 * @param string $val Input value to compare
 	 * @param string $salt Optional function-specific data for hashing
-	 * @param $request WebRequest object to use or null to use $wgRequest
-	 * @return Boolean: Whether the token matches
+	 * @param WebRequest $request Object to use or null to use $wgRequest
+	 * @return boolean: Whether the token matches
 	 */
 	public function matchEditToken( $val, $salt = '', $request = null ) {
 		$sessionToken = $this->getEditToken( $salt, $request );
@@ -3541,8 +3755,8 @@ class User {
 	 *
 	 * @param string $val Input value to compare
 	 * @param string $salt Optional function-specific data for hashing
-	 * @param $request WebRequest object to use or null to use $wgRequest
-	 * @return Boolean: Whether the token matches
+	 * @param WebRequest $request object to use or null to use $wgRequest
+	 * @return boolean: Whether the token matches
 	 */
 	public function matchEditTokenNoSuffix( $val, $salt = '', $request = null ) {
 		$sessionToken = $this->getEditToken( $salt, $request );
@@ -3569,6 +3783,7 @@ class User {
 		} elseif ( $type === true ) {
 			$message = 'confirmemail_body_changed';
 		} else {
+			// Messages: confirmemail_body_changed, confirmemail_body_set
 			$message = 'confirmemail_body_' . $type;
 		}
 
@@ -3594,7 +3809,7 @@ class User {
 	 * @return Status
 	 */
 	public function sendMail( $subject, $body, $from = null, $replyto = null ) {
-		if( is_null( $from ) ) {
+		if ( is_null( $from ) ) {
 			global $wgPasswordSender, $wgPasswordSenderName;
 			$sender = new MailAddress( $wgPasswordSender, $wgPasswordSenderName );
 		} else {
@@ -3613,9 +3828,9 @@ class User {
 	 * this change to the database.
 	 *
 	 * @param &$expiration \mixed Accepts the expiration time
-	 * @return String New token
+	 * @return string New token
 	 */
-	private function confirmationToken( &$expiration ) {
+	protected function confirmationToken( &$expiration ) {
 		global $wgUserEmailConfirmationTokenExpiry;
 		$now = time();
 		$expires = $now + $wgUserEmailConfirmationTokenExpiry;
@@ -3631,18 +3846,18 @@ class User {
 	/**
 	 * Return a URL the user can use to confirm their email address.
 	 * @param string $token Accepts the email confirmation token
-	 * @return String New token URL
+	 * @return string New token URL
 	 */
-	private function confirmationTokenUrl( $token ) {
+	protected function confirmationTokenUrl( $token ) {
 		return $this->getTokenUrl( 'ConfirmEmail', $token );
 	}
 
 	/**
 	 * Return a URL the user can use to invalidate their email address.
 	 * @param string $token Accepts the email confirmation token
-	 * @return String New token URL
+	 * @return string New token URL
 	 */
-	private function invalidationTokenUrl( $token ) {
+	protected function invalidationTokenUrl( $token ) {
 		return $this->getTokenUrl( 'InvalidateEmail', $token );
 	}
 
@@ -3658,12 +3873,12 @@ class User {
 	 *
 	 * @param string $page Special page
 	 * @param string $token Token
-	 * @return String Formatted URL
+	 * @return string Formatted URL
 	 */
 	protected function getTokenUrl( $page, $token ) {
 		// Hack to bypass localization of 'Special:'
 		$title = Title::makeTitle( NS_MAIN, "Special:$page/$token" );
-		return $title->getCanonicalUrl();
+		return $title->getCanonicalURL();
 	}
 
 	/**
@@ -3674,8 +3889,12 @@ class User {
 	 * @return bool
 	 */
 	public function confirmEmail() {
-		$this->setEmailAuthenticationTimestamp( wfTimestampNow() );
-		wfRunHooks( 'ConfirmEmailComplete', array( $this ) );
+		// Check if it's already confirmed, so we don't touch the database
+		// and fire the ConfirmEmailComplete hook on redundant confirmations.
+		if ( !$this->isEmailConfirmed() ) {
+			$this->setEmailAuthenticationTimestamp( wfTimestampNow() );
+			wfRunHooks( 'ConfirmEmailComplete', array( $this ) );
+		}
 		return true;
 	}
 
@@ -3708,11 +3927,11 @@ class User {
 	/**
 	 * Is this user allowed to send e-mails within limits of current
 	 * site configuration?
-	 * @return Bool
+	 * @return bool
 	 */
 	public function canSendEmail() {
 		global $wgEnableEmail, $wgEnableUserEmail;
-		if( !$wgEnableEmail || !$wgEnableUserEmail || !$this->isAllowed( 'sendemail' ) ) {
+		if ( !$wgEnableEmail || !$wgEnableUserEmail || !$this->isAllowed( 'sendemail' ) ) {
 			return false;
 		}
 		$canSend = $this->isEmailConfirmed();
@@ -3723,7 +3942,7 @@ class User {
 	/**
 	 * Is this user allowed to receive e-mails within limits of current
 	 * site configuration?
-	 * @return Bool
+	 * @return bool
 	 */
 	public function canReceiveEmail() {
 		return $this->isEmailConfirmed() && !$this->getOption( 'disablemail' );
@@ -3737,20 +3956,20 @@ class User {
 	 * confirmed their address by returning a code or using a password
 	 * sent to the address from the wiki.
 	 *
-	 * @return Bool
+	 * @return bool
 	 */
 	public function isEmailConfirmed() {
 		global $wgEmailAuthentication;
 		$this->load();
 		$confirmed = true;
-		if( wfRunHooks( 'EmailConfirmed', array( &$this, &$confirmed ) ) ) {
-			if( $this->isAnon() ) {
+		if ( wfRunHooks( 'EmailConfirmed', array( &$this, &$confirmed ) ) ) {
+			if ( $this->isAnon() ) {
 				return false;
 			}
-			if( !Sanitizer::validateEmail( $this->mEmail ) ) {
+			if ( !Sanitizer::validateEmail( $this->mEmail ) ) {
 				return false;
 			}
-			if( $wgEmailAuthentication && !$this->getEmailAuthenticationTimestamp() ) {
+			if ( $wgEmailAuthentication && !$this->getEmailAuthenticationTimestamp() ) {
 				return false;
 			}
 			return true;
@@ -3761,7 +3980,7 @@ class User {
 
 	/**
 	 * Check whether there is an outstanding request for e-mail confirmation.
-	 * @return Bool
+	 * @return bool
 	 */
 	public function isEmailConfirmationPending() {
 		global $wgEmailAuthentication;
@@ -3774,9 +3993,9 @@ class User {
 	/**
 	 * Get the timestamp of account creation.
 	 *
-	 * @return String|Bool|Null Timestamp of account creation, false for
-	 *     non-existent/anonymous user accounts, or null if existing account
-	 *     but information is not in database.
+	 * @return string|bool|null Timestamp of account creation, false for
+	 *  non-existent/anonymous user accounts, or null if existing account
+	 *  but information is not in database.
 	 */
 	public function getRegistration() {
 		if ( $this->isAnon() ) {
@@ -3789,11 +4008,11 @@ class User {
 	/**
 	 * Get the timestamp of the first edit
 	 *
-	 * @return String|Bool Timestamp of first edit, or false for
-	 *     non-existent/anonymous user accounts.
+	 * @return string|bool Timestamp of first edit, or false for
+	 *  non-existent/anonymous user accounts.
 	 */
 	public function getFirstEditTimestamp() {
-		if( $this->getId() == 0 ) {
+		if ( $this->getId() == 0 ) {
 			return false; // anons
 		}
 		$dbr = wfGetDB( DB_SLAVE );
@@ -3802,7 +4021,7 @@ class User {
 			__METHOD__,
 			array( 'ORDER BY' => 'rev_timestamp ASC' )
 		);
-		if( !$time ) {
+		if ( !$time ) {
 			return false; // no edits
 		}
 		return wfTimestamp( TS_MW, $time );
@@ -3818,16 +4037,16 @@ class User {
 		global $wgGroupPermissions, $wgRevokePermissions;
 		$rights = array();
 		// grant every granted permission first
-		foreach( $groups as $group ) {
-			if( isset( $wgGroupPermissions[$group] ) ) {
+		foreach ( $groups as $group ) {
+			if ( isset( $wgGroupPermissions[$group] ) ) {
 				$rights = array_merge( $rights,
 					// array_filter removes empty items
 					array_keys( array_filter( $wgGroupPermissions[$group] ) ) );
 			}
 		}
 		// now revoke the revoked permissions
-		foreach( $groups as $group ) {
-			if( isset( $wgRevokePermissions[$group] ) ) {
+		foreach ( $groups as $group ) {
+			if ( isset( $wgRevokePermissions[$group] ) ) {
 				$rights = array_diff( $rights,
 					array_keys( array_filter( $wgRevokePermissions[$group] ) ) );
 			}
@@ -3855,6 +4074,11 @@ class User {
 	/**
 	 * Check, if the given group has the given permission
 	 *
+	 * If you're wanting to check whether all users have a permission, use
+	 * User::isEveryoneAllowed() instead. That properly checks if it's revoked
+	 * from anyone.
+	 *
+	 * @since 1.21
 	 * @param string $group Group to check
 	 * @param string $role Role to check
 	 * @return bool
@@ -3865,11 +4089,51 @@ class User {
 			&& !( isset( $wgRevokePermissions[$group][$role] ) && $wgRevokePermissions[$group][$role] );
 	}
 
+	/**
+	 * Check if all users have the given permission
+	 *
+	 * @since 1.22
+	 * @param string $right Right to check
+	 * @return bool
+	 */
+	public static function isEveryoneAllowed( $right ) {
+		global $wgGroupPermissions, $wgRevokePermissions;
+		static $cache = array();
+
+		// Use the cached results, except in unit tests which rely on
+		// being able change the permission mid-request
+		if ( isset( $cache[$right] ) && !defined( 'MW_PHPUNIT_TEST' ) ) {
+			return $cache[$right];
+		}
+
+		if ( !isset( $wgGroupPermissions['*'][$right] ) || !$wgGroupPermissions['*'][$right] ) {
+			$cache[$right] = false;
+			return false;
+		}
+
+		// If it's revoked anywhere, then everyone doesn't have it
+		foreach ( $wgRevokePermissions as $rights ) {
+			if ( isset( $rights[$right] ) && $rights[$right] ) {
+				$cache[$right] = false;
+				return false;
+			}
+		}
+
+		// Allow extensions (e.g. OAuth) to say false
+		if ( !wfRunHooks( 'UserIsEveryoneAllowed', array( $right ) ) ) {
+			$cache[$right] = false;
+			return false;
+		}
+
+		$cache[$right] = true;
+		return true;
+	}
+
 	/**
 	 * Get the localized descriptive name for a group, if it exists
 	 *
 	 * @param string $group Internal group name
-	 * @return String Localized descriptive group name
+	 * @return string Localized descriptive group name
 	 */
 	public static function getGroupName( $group ) {
 		$msg = wfMessage( "group-$group" );
@@ -3881,7 +4145,7 @@ class User {
 	 *
 	 * @param string $group Internal group name
 	 * @param string $username Username for gender (since 1.19)
-	 * @return String Localized name for group member
+	 * @return string Localized name for group member
 	 */
 	public static function getGroupMember( $group, $username = '#' ) {
 		$msg = wfMessage( "group-$group-member", $username );
@@ -3934,14 +4198,15 @@ class User {
 	 * Get the title of a page describing a particular group
 	 *
 	 * @param string $group Internal group name
-	 * @return Title|Bool Title of the page if it exists, false otherwise
+	 * @return Title|bool Title of the page if it exists, false otherwise
 	 */
 	public static function getGroupPage( $group ) {
 		$msg = wfMessage( 'grouppage-' . $group )->inContentLanguage();
-		if( $msg->exists() ) {
+		if ( $msg->exists() ) {
 			$title = Title::newFromText( $msg->text() );
-			if( is_object( $title ) )
+			if ( is_object( $title ) ) {
 				return $title;
+			}
 		}
 		return false;
 	}
@@ -3952,14 +4217,14 @@ class User {
 	 *
 	 * @param string $group Internal name of the group
 	 * @param string $text The text of the link
-	 * @return String HTML link to the group
+	 * @return string HTML link to the group
 	 */
 	public static function makeGroupLinkHTML( $group, $text = '' ) {
-		if( $text == '' ) {
+		if ( $text == '' ) {
 			$text = self::getGroupName( $group );
 		}
 		$title = self::getGroupPage( $group );
-		if( $title ) {
+		if ( $title ) {
 			return Linker::link( $title, htmlspecialchars( $text ) );
 		} else {
 			return $text;
@@ -3972,14 +4237,14 @@ class User {
 	 *
 	 * @param string $group Internal name of the group
 	 * @param string $text The text of the link
-	 * @return String Wikilink to the group
+	 * @return string Wikilink to the group
 	 */
 	public static function makeGroupLinkWiki( $group, $text = '' ) {
-		if( $text == '' ) {
+		if ( $text == '' ) {
 			$text = self::getGroupName( $group );
 		}
 		$title = self::getGroupPage( $group );
-		if( $title ) {
+		if ( $title ) {
 			$page = $title->getPrefixedText();
 			return "[[$page|$text]]";
 		} else {
@@ -4000,53 +4265,53 @@ class User {
 		global $wgAddGroups, $wgRemoveGroups, $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
 
 		$groups = array( 'add' => array(), 'remove' => array(), 'add-self' => array(), 'remove-self' => array() );
-		if( empty( $wgAddGroups[$group] ) ) {
+		if ( empty( $wgAddGroups[$group] ) ) {
 			// Don't add anything to $groups
-		} elseif( $wgAddGroups[$group] === true ) {
+		} elseif ( $wgAddGroups[$group] === true ) {
 			// You get everything
 			$groups['add'] = self::getAllGroups();
-		} elseif( is_array( $wgAddGroups[$group] ) ) {
+		} elseif ( is_array( $wgAddGroups[$group] ) ) {
 			$groups['add'] = $wgAddGroups[$group];
 		}
 
 		// Same thing for remove
-		if( empty( $wgRemoveGroups[$group] ) ) {
-		} elseif( $wgRemoveGroups[$group] === true ) {
+		if ( empty( $wgRemoveGroups[$group] ) ) {
+		} elseif ( $wgRemoveGroups[$group] === true ) {
 			$groups['remove'] = self::getAllGroups();
-		} elseif( is_array( $wgRemoveGroups[$group] ) ) {
+		} elseif ( is_array( $wgRemoveGroups[$group] ) ) {
 			$groups['remove'] = $wgRemoveGroups[$group];
 		}
 
 		// Re-map numeric keys of AddToSelf/RemoveFromSelf to the 'user' key for backwards compatibility
-		if( empty( $wgGroupsAddToSelf['user']) || $wgGroupsAddToSelf['user'] !== true ) {
-			foreach( $wgGroupsAddToSelf as $key => $value ) {
-				if( is_int( $key ) ) {
+		if ( empty( $wgGroupsAddToSelf['user'] ) || $wgGroupsAddToSelf['user'] !== true ) {
+			foreach ( $wgGroupsAddToSelf as $key => $value ) {
+				if ( is_int( $key ) ) {
 					$wgGroupsAddToSelf['user'][] = $value;
 				}
 			}
 		}
 
-		if( empty( $wgGroupsRemoveFromSelf['user']) || $wgGroupsRemoveFromSelf['user'] !== true ) {
-			foreach( $wgGroupsRemoveFromSelf as $key => $value ) {
-				if( is_int( $key ) ) {
+		if ( empty( $wgGroupsRemoveFromSelf['user'] ) || $wgGroupsRemoveFromSelf['user'] !== true ) {
+			foreach ( $wgGroupsRemoveFromSelf as $key => $value ) {
+				if ( is_int( $key ) ) {
 					$wgGroupsRemoveFromSelf['user'][] = $value;
 				}
 			}
 		}
 
 		// Now figure out what groups the user can add to him/herself
-		if( empty( $wgGroupsAddToSelf[$group] ) ) {
-		} elseif( $wgGroupsAddToSelf[$group] === true ) {
+		if ( empty( $wgGroupsAddToSelf[$group] ) ) {
+		} elseif ( $wgGroupsAddToSelf[$group] === true ) {
 			// No idea WHY this would be used, but it's there
 			$groups['add-self'] = User::getAllGroups();
-		} elseif( is_array( $wgGroupsAddToSelf[$group] ) ) {
+		} elseif ( is_array( $wgGroupsAddToSelf[$group] ) ) {
 			$groups['add-self'] = $wgGroupsAddToSelf[$group];
 		}
 
-		if( empty( $wgGroupsRemoveFromSelf[$group] ) ) {
-		} elseif( $wgGroupsRemoveFromSelf[$group] === true ) {
+		if ( empty( $wgGroupsRemoveFromSelf[$group] ) ) {
+		} elseif ( $wgGroupsRemoveFromSelf[$group] === true ) {
 			$groups['remove-self'] = User::getAllGroups();
-		} elseif( is_array( $wgGroupsRemoveFromSelf[$group] ) ) {
+		} elseif ( is_array( $wgGroupsRemoveFromSelf[$group] ) ) {
 			$groups['remove-self'] = $wgGroupsRemoveFromSelf[$group];
 		}
 
@@ -4061,7 +4326,7 @@ class User {
 	 *  'remove-self' => array( removable groups from self) )
 	 */
 	public function changeableGroups() {
-		if( $this->isAllowed( 'userrights' ) ) {
+		if ( $this->isAllowed( 'userrights' ) ) {
 			// This group gives the right to modify everything (reverse-
 			// compatibility with old "userrights lets you change
 			// everything")
@@ -4084,7 +4349,7 @@ class User {
 		);
 		$addergroups = $this->getEffectiveGroups();
 
-		foreach( $addergroups as $addergroup ) {
+		foreach ( $addergroups as $addergroup ) {
 			$groups = array_merge_recursive(
 				$groups, $this->changeableByGroup( $addergroup )
 			);
@@ -4101,7 +4366,7 @@ class User {
 	 * Will have no effect for anonymous users.
 	 */
 	public function incEditCount() {
-		if( !$this->isAnon() ) {
+		if ( !$this->isAnon() ) {
 			$dbw = wfGetDB( DB_MASTER );
 			$dbw->update(
 				'user',
@@ -4111,10 +4376,10 @@ class User {
 			);
 
 			// Lazy initialization check...
-			if( $dbw->affectedRows() == 0 ) {
+			if ( $dbw->affectedRows() == 0 ) {
 				// Now here's a goddamn hack...
 				$dbr = wfGetDB( DB_SLAVE );
-				if( $dbr !== $dbw ) {
+				if ( $dbr !== $dbw ) {
 					// If we actually have a slave server, the count is
 					// at least one behind because the current transaction
 					// has not been committed and replicated.
@@ -4135,13 +4400,13 @@ class User {
 	 * Initialize user_editcount from data out of the revision table
 	 *
 	 * @param $add Integer Edits to add to the count from the revision table
-	 * @return Integer Number of edits
+	 * @return integer Number of edits
 	 */
 	protected function initEditCount( $add = 0 ) {
 		// Pull from a slave to be less cruel to servers
 		// Accuracy isn't the point anyway here
 		$dbr = wfGetDB( DB_SLAVE );
-		$count = (int) $dbr->selectField(
+		$count = (int)$dbr->selectField(
 			'revision',
 			'COUNT(rev_user)',
 			array( 'rev_user' => $this->getId() ),
@@ -4164,7 +4429,7 @@ class User {
 	 * Get the description of a given right
 	 *
 	 * @param string $right Right to query
-	 * @return String Localized description of the right
+	 * @return string Localized description of the right
 	 */
 	public static function getRightDescription( $right ) {
 		$key = "right-$right";
@@ -4177,7 +4442,7 @@ class User {
 	 *
 	 * @param string $password Plain-text password
 	 * @param string $userId User ID
-	 * @return String Password hash
+	 * @return string Password hash
 	 */
 	public static function oldCrypt( $password, $userId ) {
 		global $wgPasswordSalt;
@@ -4193,19 +4458,18 @@ class User {
 	 *
 	 * @param string $password Plain-text password
 	 * @param bool|string $salt Optional salt, may be random or the user ID.
-
-	 *                     If unspecified or false, will generate one automatically
-	 * @return String Password hash
+	 *  If unspecified or false, will generate one automatically
+	 * @return string Password hash
 	 */
 	public static function crypt( $password, $salt = false ) {
 		global $wgPasswordSalt;
 
 		$hash = '';
-		if( !wfRunHooks( 'UserCryptPassword', array( &$password, &$salt, &$wgPasswordSalt, &$hash ) ) ) {
+		if ( !wfRunHooks( 'UserCryptPassword', array( &$password, &$salt, &$wgPasswordSalt, &$hash ) ) ) {
 			return $hash;
 		}
 
-		if( $wgPasswordSalt ) {
+		if ( $wgPasswordSalt ) {
 			if ( $salt === false ) {
 				$salt = MWCryptRand::generateHex( 8 );
 			}
@@ -4223,25 +4487,25 @@ class User {
 	 * @param string $password Plain-text password to compare
 	 * @param string|bool $userId User ID for old-style password salt
 	 *
-	 * @return Boolean
+	 * @return boolean
 	 */
 	public static function comparePasswords( $hash, $password, $userId = false ) {
 		$type = substr( $hash, 0, 3 );
 
 		$result = false;
-		if( !wfRunHooks( 'UserComparePasswords', array( &$hash, &$password, &$userId, &$result ) ) ) {
+		if ( !wfRunHooks( 'UserComparePasswords', array( &$hash, &$password, &$userId, &$result ) ) ) {
 			return $result;
 		}
 
 		if ( $type == ':A:' ) {
-			# Unsalted
+			// Unsalted
 			return md5( $password ) === substr( $hash, 3 );
 		} elseif ( $type == ':B:' ) {
-			# Salted
+			// Salted
 			list( $salt, $realHash ) = explode( ':', substr( $hash, 3 ), 2 );
-			return md5( $salt.'-'.md5( $password ) ) === $realHash;
+			return md5( $salt . '-' . md5( $password ) ) === $realHash;
 		} else {
-			# Old-style
+			// Old-style
 			return self::oldCrypt( $password, $userId ) === $hash;
 		}
 	}
@@ -4257,6 +4521,7 @@ class User {
 	 *       no matter the value of $wgUser
 	 *     - 'create2' for a logged in user creating an account for someone else
 	 *     - 'byemail' when the created user will receive its password by e-mail
+	 *     - 'autocreate' when the user is automatically created (such as by CentralAuth).
 	 *   - Boolean means whether the account was created by e-mail (deprecated):
 	 *     - true will be converted to 'byemail'
 	 *     - false will be converted to 'create' if this object is the same as
@@ -4268,7 +4533,7 @@ class User {
 	 */
 	public function addNewUserLogEntry( $action = false, $reason = '' ) {
 		global $wgUser, $wgNewUserLog;
-		if( empty( $wgNewUserLog ) ) {
+		if ( empty( $wgNewUserLog ) ) {
 			return true; // disabled
 		}
 
@@ -4348,11 +4613,11 @@ class User {
 		// Maybe load from the object
 		if ( !is_null( $this->mOptionOverrides ) ) {
 			wfDebug( "User: loading options for user " . $this->getId() . " from override cache.\n" );
-			foreach( $this->mOptionOverrides as $key => $value ) {
+			foreach ( $this->mOptionOverrides as $key => $value ) {
 				$this->mOptions[$key] = $value;
 			}
 		} else {
-			if( !is_array( $data ) ) {
+			if ( !is_array( $data ) ) {
 				wfDebug( "User: loading options for user " . $this->getId() . " from database.\n" );
 				// Load from database
 				$dbr = wfGetDB( DB_SLAVE );
@@ -4385,8 +4650,6 @@ class User {
 	 * @todo document
 	 */
 	protected function saveOptions() {
-		global $wgAllowPrefChange;
-
 		$this->loadOptions();
 
 		// Not using getOptions(), to keep hidden preferences in database
@@ -4394,15 +4657,14 @@ class User {
 
 		// Allow hooks to abort, for instance to save to a global profile.
 		// Reset options to default state before saving.
-		if( !wfRunHooks( 'UserSaveOptions', array( $this, &$saveOptions ) ) ) {
+		if ( !wfRunHooks( 'UserSaveOptions', array( $this, &$saveOptions ) ) ) {
 			return;
 		}
 
-		$extuser = ExternalUser::newFromUser( $this );
 		$userId = $this->getId();
 		$insert_rows = array();
-		foreach( $saveOptions as $key => $value ) {
-			# Don't bother storing default values
+		foreach ( $saveOptions as $key => $value ) {
+			// Don't bother storing default values
 			$defaultOption = self::getDefaultOption( $key );
 			if ( ( is_null( $defaultOption ) &&
 					!( $value === false || is_null( $value ) ) ) ||
@@ -4413,21 +4675,21 @@ class User {
 						'up_value' => $value,
 					);
 			}
-			if ( $extuser && isset( $wgAllowPrefChange[$key] ) ) {
-				switch ( $wgAllowPrefChange[$key] ) {
-					case 'local':
-					case 'message':
-						break;
-					case 'semiglobal':
-					case 'global':
-						$extuser->setPref( $key, $value );
-				}
-			}
 		}
 
 		$dbw = wfGetDB( DB_MASTER );
-		$dbw->delete( 'user_properties', array( 'up_user' => $userId ), __METHOD__ );
-		$dbw->insert( 'user_properties', $insert_rows, __METHOD__ );
+		$hasRows = $dbw->selectField( 'user_properties', '1',
+			array( 'up_user' => $userId ), __METHOD__ );
+
+		if ( $hasRows ) {
+			// Only do this delete if there is something there. A very large portion of
+			// calls to this function are for setting 'rememberpassword' for new accounts.
+			// Doing this delete for new accounts with no rows in the table rougly causes
+			// gap locks on [max user ID,+infinity) which causes high contention since many
+			// updates will pile up on each other since they are for higher (newer) user IDs.
+			$dbw->delete( 'user_properties', array( 'up_user' => $userId ), __METHOD__ );
+		}
+		$dbw->insert( 'user_properties', $insert_rows, __METHOD__, array( 'IGNORE' ) );
 	}
 
 	/**
@@ -4451,8 +4713,7 @@ class User {
 	 *
 	 * @return array Array of HTML attributes suitable for feeding to
 	 *   Html::element(), directly or indirectly.  (Don't feed to Xml::*()!
-	 *   That will potentially output invalid XHTML 1.0 Transitional, and will
-	 *   get confused by the boolean attribute syntax used.)
+	 *   That will get confused by the boolean attribute syntax used.)
 	 */
 	public static function passwordChangeInputAttribs() {
 		global $wgMinimalPasswordLength;
@@ -4512,4 +4773,26 @@ class User {
 			'user_editcount',
 		);
 	}
+
+	/**
+	 * Factory function for fatal permission-denied errors
+	 *
+	 * @since 1.22
+	 * @param string $permission User right required
+	 * @return Status
+	 */
+	static function newFatalPermissionDeniedStatus( $permission ) {
+		global $wgLang;
+
+		$groups = array_map(
+			array( 'User', 'makeGroupLinkWiki' ),
+			User::getGroupsWithPermission( $permission )
+		);
+
+		if ( $groups ) {
+			return Status::newFatal( 'badaccess-groups', $wgLang->commaList( $groups ), count( $groups ) );
+		} else {
+			return Status::newFatal( 'badaccess-group0' );
+		}
+	}
 }
diff --git a/includes/UserArray.php b/includes/UserArray.php
index 3b8f5c10..1f55ef35 100644
--- a/includes/UserArray.php
+++ b/includes/UserArray.php
@@ -44,7 +44,7 @@ abstract class UserArray implements Iterator {
 		$ids = array_map( 'intval', (array)$ids ); // paranoia
 		if ( !$ids ) {
 			// Database::select() doesn't like empty arrays
-			return new ArrayIterator(array());
+			return new ArrayIterator( array() );
 		}
 		$dbr = wfGetDB( DB_SLAVE );
 		$res = $dbr->select( 'user', '*', array( 'user_id' => $ids ),
diff --git a/includes/UserMailer.php b/includes/UserMailer.php
index 6eb99172..8ab10b2d 100644
--- a/includes/UserMailer.php
+++ b/includes/UserMailer.php
@@ -119,7 +119,7 @@ class UserMailer {
 	 */
 	static function arrayToHeaderString( $headers, $endl = "\n" ) {
 		$strings = array();
-		foreach( $headers as $name => $value ) {
+		foreach ( $headers as $name => $value ) {
 			$strings[] = "$name: $value";
 		}
 		return implode( $endl, $strings );
@@ -241,7 +241,7 @@ class UserMailer {
 			$headers['Reply-To'] = $replyto->toString();
 		}
 
-		$headers['Date'] = date( 'r' );
+		$headers['Date'] = MWTimestamp::getLocalInstance()->format( 'r' );
 		$headers['Message-ID'] = self::makeMsgId();
 		$headers['X-Mailer'] = 'MediaWiki mailer';
 
@@ -258,14 +258,16 @@ class UserMailer {
 			wfDebug( "Assembling multipart mime email\n" );
 			if ( !stream_resolve_include_path( 'Mail/mime.php' ) ) {
 				wfDebug( "PEAR Mail_Mime package is not installed. Falling back to text email.\n" );
+				// remove the html body for text email fall back
+				$body = $body['text'];
 			}
 			else {
-				require_once( 'Mail/mime.php' );
+				require_once 'Mail/mime.php';
 				if ( wfIsWindows() ) {
 					$body['text'] = str_replace( "\n", "\r\n", $body['text'] );
 					$body['html'] = str_replace( "\n", "\r\n", $body['html'] );
 				}
-				$mime = new Mail_mime( array( 'eol' => $endl ) );
+				$mime = new Mail_mime( array( 'eol' => $endl, 'text_charset' => 'UTF-8', 'html_charset' => 'UTF-8' ) );
 				$mime->setTXTBody( $body['text'] );
 				$mime->setHTMLBody( $body['html'] );
 				$body = $mime->get(); // must call get() before headers()
@@ -300,7 +302,7 @@ class UserMailer {
 			if ( !stream_resolve_include_path( 'Mail.php' ) ) {
 				throw new MWException( 'PEAR mail package is not installed' );
 			}
-			require_once( 'Mail.php' );
+			require_once 'Mail.php';
 
 			wfSuppressWarnings();
 
@@ -338,7 +340,7 @@ class UserMailer {
 			#
 			# PHP mail()
 			#
-			if( count( $to ) > 1 ) {
+			if ( count( $to ) > 1 ) {
 				$headers['To'] = 'undisclosed-recipients:;';
 			}
 			$headers = self::arrayToHeaderString( $headers, $endl );
@@ -409,7 +411,7 @@ class UserMailer {
 	 */
 	public static function quotedPrintable( $string, $charset = '' ) {
 		# Probably incomplete; see RFC 2045
-		if( empty( $charset ) ) {
+		if ( empty( $charset ) ) {
 			$charset = 'UTF-8';
 		}
 		$charset = strtoupper( $charset );
@@ -417,7 +419,7 @@ class UserMailer {
 
 		$illegal = '\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff=';
 		$replace = $illegal . '\t ?_';
-		if( !preg_match( "/[$illegal]/", $string ) ) {
+		if ( !preg_match( "/[$illegal]/", $string ) ) {
 			return $string;
 		}
 		$out = "=?$charset?Q?";
@@ -605,6 +607,7 @@ class EmailNotification {
 
 		wfRunHooks( 'UpdateUserMailerFormattedPageStatus', array( &$formattedPageStatus ) );
 		if ( !in_array( $this->pageStatus, $formattedPageStatus ) ) {
+			wfProfileOut( __METHOD__ );
 			throw new MWException( 'Not a valid page status!' );
 		}
 
@@ -667,11 +670,13 @@ class EmailNotification {
 			} elseif ( $targetUser->getOption( 'enotifusertalkpages' ) &&
 				( !$minorEdit || $targetUser->getOption( 'enotifminoredits' ) ) )
 			{
-				if ( $targetUser->isEmailConfirmed() ) {
+				if ( !$targetUser->isEmailConfirmed() ) {
+					wfDebug( __METHOD__ . ": talk page owner doesn't have validated email\n" );
+				} elseif ( !wfRunHooks( 'AbortTalkPageEmailNotification', array( $targetUser, $title ) ) ) {
+					wfDebug( __METHOD__ . ": talk page update notification is aborted for this user\n" );
+				} else {
 					wfDebug( __METHOD__ . ": sending talk page update notification\n" );
 					return true;
-				} else {
-					wfDebug( __METHOD__ . ": talk page owner doesn't have validated email\n" );
 				}
 			} else {
 				wfDebug( __METHOD__ . ": talk page owner doesn't want notifications\n" );
@@ -696,20 +701,20 @@ class EmailNotification {
 
 		$keys = array();
 		$postTransformKeys = array();
-		$pageTitleUrl = $this->title->getCanonicalUrl();
+		$pageTitleUrl = $this->title->getCanonicalURL();
 		$pageTitle = $this->title->getPrefixedText();
 
 		if ( $this->oldid ) {
 			// Always show a link to the diff which triggered the mail. See bug 32210.
 			$keys['$NEWPAGE'] = "\n\n" . wfMessage( 'enotif_lastdiff',
-				$this->title->getCanonicalUrl( 'diff=next&oldid=' . $this->oldid ) )
+				$this->title->getCanonicalURL( array( 'diff' => 'next', 'oldid' => $this->oldid ) ) )
 				->inContentLanguage()->text();
 
 			if ( !$wgEnotifImpersonal ) {
 				// For personal mail, also show a link to the diff of all changes
 				// since last visited.
 				$keys['$NEWPAGE'] .= "\n\n" . wfMessage( 'enotif_lastvisited',
-					$this->title->getCanonicalUrl( 'diff=0&oldid=' . $this->oldid ) )
+					$this->title->getCanonicalURL( array( 'diff' => '0', 'oldid' => $this->oldid ) ) )
 					->inContentLanguage()->text();
 			}
 			$keys['$OLDID'] = $this->oldid;
@@ -724,10 +729,10 @@ class EmailNotification {
 		}
 
 		$keys['$PAGETITLE'] = $this->title->getPrefixedText();
-		$keys['$PAGETITLE_URL'] = $this->title->getCanonicalUrl();
+		$keys['$PAGETITLE_URL'] = $this->title->getCanonicalURL();
 		$keys['$PAGEMINOREDIT'] = $this->minorEdit ?
 			wfMessage( 'minoredit' )->inContentLanguage()->text() : '';
-		$keys['$UNWATCHURL'] = $this->title->getCanonicalUrl( 'action=unwatch' );
+		$keys['$UNWATCHURL'] = $this->title->getCanonicalURL( 'action=unwatch' );
 
 		if ( $this->editor->isAnon() ) {
 			# real anon (user:xxx.xxx.xxx.xxx)
@@ -738,18 +743,25 @@ class EmailNotification {
 		} else {
 			$keys['$PAGEEDITOR'] = $wgEnotifUseRealName ? $this->editor->getRealName() : $this->editor->getName();
 			$emailPage = SpecialPage::getSafeTitleFor( 'Emailuser', $this->editor->getName() );
-			$keys['$PAGEEDITOR_EMAIL'] = $emailPage->getCanonicalUrl();
+			$keys['$PAGEEDITOR_EMAIL'] = $emailPage->getCanonicalURL();
 		}
 
-		$keys['$PAGEEDITOR_WIKI'] = $this->editor->getUserPage()->getCanonicalUrl();
+		$keys['$PAGEEDITOR_WIKI'] = $this->editor->getUserPage()->getCanonicalURL();
 
 		# Replace this after transforming the message, bug 35019
 		$postTransformKeys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
 
-		# Now build message's subject and body
+		// Now build message's subject and body
+
+		// Messages:
+		// enotif_subject_deleted, enotif_subject_created, enotif_subject_moved,
+		// enotif_subject_restored, enotif_subject_changed
 		$this->subject = wfMessage( 'enotif_subject_' . $this->pageStatus )->inContentLanguage()
 			->params( $pageTitle, $keys['$PAGEEDITOR'] )->text();
 
+		// Messages:
+		// enotif_body_intro_deleted, enotif_body_intro_created, enotif_body_intro_moved,
+		// enotif_body_intro_restored, enotif_body_intro_changed
 		$keys['$PAGEINTRO'] = wfMessage( 'enotif_body_intro_' . $this->pageStatus )
 			->inContentLanguage()->params( $pageTitle, $keys['$PAGEEDITOR'], $pageTitleUrl )
 			->text();
@@ -790,8 +802,9 @@ class EmailNotification {
 	function compose( $user ) {
 		global $wgEnotifImpersonal;
 
-		if ( !$this->composed_common )
+		if ( !$this->composed_common ) {
 			$this->composeCommonMailtext();
+		}
 
 		if ( $wgEnotifImpersonal ) {
 			$this->mailTargets[] = new MailAddress( $user );
diff --git a/includes/UserRightsProxy.php b/includes/UserRightsProxy.php
index cd5dff84..a8a22be7 100644
--- a/includes/UserRightsProxy.php
+++ b/includes/UserRightsProxy.php
@@ -74,7 +74,7 @@ class UserRightsProxy {
 	 */
 	public static function whoIs( $database, $id, $ignoreInvalidDB = false ) {
 		$user = self::newFromId( $database, $id, $ignoreInvalidDB );
-		if( $user ) {
+		if ( $user ) {
 			return $user->name;
 		} else {
 			return false;
@@ -114,12 +114,12 @@ class UserRightsProxy {
 	 */
 	private static function newFromLookup( $database, $field, $value, $ignoreInvalidDB = false ) {
 		$db = self::getDB( $database, $ignoreInvalidDB );
-		if( $db ) {
+		if ( $db ) {
 			$row = $db->selectRow( 'user',
 				array( 'user_id', 'user_name' ),
 				array( $field => $value ),
 				__METHOD__ );
-			if( $row !== false ) {
+			if ( $row !== false ) {
 				return new UserRightsProxy( $db, $database,
 					$row->user_name,
 					intval( $row->user_id ) );
@@ -138,8 +138,8 @@ class UserRightsProxy {
 	 */
 	public static function getDB( $database, $ignoreInvalidDB = false ) {
 		global $wgDBname;
-		if( self::validDatabase( $database ) ) {
-			if( $database == $wgDBname ) {
+		if ( $ignoreInvalidDB || self::validDatabase( $database ) ) {
+			if ( $database == $wgDBname ) {
 				// Hmm... this shouldn't happen though. :)
 				return wfGetDB( DB_MASTER );
 			} else {
diff --git a/includes/WatchedItem.php b/includes/WatchedItem.php
index 5ac92f73..1e07e7c7 100644
--- a/includes/WatchedItem.php
+++ b/includes/WatchedItem.php
@@ -27,19 +27,37 @@
  * @ingroup Watchlist
  */
 class WatchedItem {
-	var $mTitle, $mUser;
+	/**
+	 * Constant to specify that user rights 'editmywatchlist' and
+	 * 'viewmywatchlist' should not be checked.
+	 * @since 1.22
+	 */
+	const IGNORE_USER_RIGHTS = 0;
+
+	/**
+	 * Constant to specify that user rights 'editmywatchlist' and
+	 * 'viewmywatchlist' should be checked.
+	 * @since 1.22
+	 */
+	const CHECK_USER_RIGHTS = 1;
+
+	var $mTitle, $mUser, $mCheckRights;
 	private $loaded = false, $watched, $timestamp;
 
 	/**
 	 * Create a WatchedItem object with the given user and title
+	 * @since 1.22 $checkRights parameter added
 	 * @param $user User: the user to use for (un)watching
 	 * @param $title Title: the title we're going to (un)watch
+	 * @param $checkRights int: Whether to check the 'viewmywatchlist' and 'editmywatchlist' rights.
+	 *     Pass either WatchedItem::IGNORE_USER_RIGHTS or WatchedItem::CHECK_USER_RIGHTS.
 	 * @return WatchedItem object
 	 */
-	public static function fromUserTitle( $user, $title ) {
+	public static function fromUserTitle( $user, $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
 		$wl = new WatchedItem;
 		$wl->mUser = $user;
 		$wl->mTitle = $title;
+		$wl->mCheckRights = $checkRights;
 
 		return $wl;
 	}
@@ -89,6 +107,12 @@ class WatchedItem {
 		}
 		$this->loaded = true;
 
+		// Only loggedin user can have a watchlist
+		if ( $this->mUser->isAnon() ) {
+			$this->watched = false;
+			return;
+		}
+
 		# Pages and their talk pages are considered equivalent for watching;
 		# remember that talk namespaces are numbered as page namespace+1.
 
@@ -104,11 +128,23 @@ class WatchedItem {
 		}
 	}
 
+	/**
+	 * Check permissions
+	 * @param $what string: 'viewmywatchlist' or 'editmywatchlist'
+	 */
+	private function isAllowed( $what ) {
+		return !$this->mCheckRights || $this->mUser->isAllowed( $what );
+	}
+
 	/**
 	 * Is mTitle being watched by mUser?
 	 * @return bool
 	 */
 	public function isWatched() {
+		if ( !$this->isAllowed( 'viewmywatchlist' ) ) {
+			return false;
+		}
+
 		$this->load();
 		return $this->watched;
 	}
@@ -120,6 +156,10 @@ class WatchedItem {
 	 *         the wl_notificationtimestamp field otherwise
 	 */
 	public function getNotificationTimestamp() {
+		if ( !$this->isAllowed( 'viewmywatchlist' ) ) {
+			return false;
+		}
+
 		$this->load();
 		if ( $this->watched ) {
 			return $this->timestamp;
@@ -135,6 +175,11 @@ class WatchedItem {
 	 *        page is not watched or the notification timestamp is already NULL.
 	 */
 	public function resetNotificationTimestamp( $force = '' ) {
+		// Only loggedin user can have a watchlist
+		if ( wfReadOnly() || $this->mUser->isAnon() || !$this->isAllowed( 'editmywatchlist' ) ) {
+			return;
+		}
+
 		if ( $force != 'force' ) {
 			$this->load();
 			if ( !$this->watched || $this->timestamp === null ) {
@@ -153,11 +198,17 @@ class WatchedItem {
 	/**
 	 * Given a title and user (assumes the object is setup), add the watch to the
 	 * database.
-	 * @return bool (always true)
+	 * @return bool
 	 */
 	public function addWatch() {
 		wfProfileIn( __METHOD__ );
 
+		// Only loggedin user can have a watchlist
+		if ( wfReadOnly() || $this->mUser->isAnon() || !$this->isAllowed( 'editmywatchlist' ) ) {
+			wfProfileOut( __METHOD__ );
+			return false;
+		}
+
 		// Use INSERT IGNORE to avoid overwriting the notification timestamp
 		// if there's already an entry for this page
 		$dbw = wfGetDB( DB_MASTER );
@@ -192,6 +243,12 @@ class WatchedItem {
 	public function removeWatch() {
 		wfProfileIn( __METHOD__ );
 
+		// Only loggedin user can have a watchlist
+		if ( wfReadOnly() || $this->mUser->isAnon() || !$this->isAllowed( 'editmywatchlist' ) ) {
+			wfProfileOut( __METHOD__ );
+			return false;
+		}
+
 		$success = false;
 		$dbw = wfGetDB( DB_MASTER );
 		$dbw->delete( 'watchlist',
@@ -268,7 +325,7 @@ class WatchedItem {
 			);
 		}
 
-		if( empty( $values ) ) {
+		if ( empty( $values ) ) {
 			// Nothing to do
 			return true;
 		}
diff --git a/includes/WebRequest.php b/includes/WebRequest.php
index 98007ef8..b17cb9ec 100644
--- a/includes/WebRequest.php
+++ b/includes/WebRequest.php
@@ -91,11 +91,11 @@ class WebRequest {
 			wfSuppressWarnings();
 			$a = parse_url( $url );
 			wfRestoreWarnings();
-			if( $a ) {
+			if ( $a ) {
 				$path = isset( $a['path'] ) ? $a['path'] : '';
 
 				global $wgScript;
-				if( $path == $wgScript && $want !== 'all' ) {
+				if ( $path == $wgScript && $want !== 'all' ) {
 					// Script inside a rewrite path?
 					// Abort to keep from breaking...
 					return $matches;
@@ -106,7 +106,7 @@ class WebRequest {
 				// Raw PATH_INFO style
 				$router->add( "$wgScript/$1" );
 
-				if( isset( $_SERVER['SCRIPT_NAME'] )
+				if ( isset( $_SERVER['SCRIPT_NAME'] )
 					&& preg_match( '/\.php5?/', $_SERVER['SCRIPT_NAME'] ) )
 				{
 					# Check for SCRIPT_NAME, we handle index.php explicitly
@@ -116,17 +116,17 @@ class WebRequest {
 				}
 
 				global $wgArticlePath;
-				if( $wgArticlePath ) {
+				if ( $wgArticlePath ) {
 					$router->add( $wgArticlePath );
 				}
 
 				global $wgActionPaths;
-				if( $wgActionPaths ) {
+				if ( $wgActionPaths ) {
 					$router->add( $wgActionPaths, array( 'action' => '$key' ) );
 				}
 
 				global $wgVariantArticlePath, $wgContLang;
-				if( $wgVariantArticlePath ) {
+				if ( $wgVariantArticlePath ) {
 					$router->add( $wgVariantArticlePath,
 						array( 'variant' => '$2' ),
 						array( '$2' => $wgContLang->getVariants() )
@@ -224,7 +224,7 @@ class WebRequest {
 		}
 
 		$matches = self::getPathInfo( 'title' );
-		foreach( $matches as $key => $val) {
+		foreach ( $matches as $key => $val ) {
 			$this->data[$key] = $_GET[$key] = $_REQUEST[$key] = $val;
 		}
 	}
@@ -240,15 +240,15 @@ class WebRequest {
 	 * @return array of URL variables to interpolate; empty if no match
 	 */
 	static function extractTitle( $path, $bases, $key = false ) {
-		foreach( (array)$bases as $keyValue => $base ) {
+		foreach ( (array)$bases as $keyValue => $base ) {
 			// Find the part after $wgArticlePath
 			$base = str_replace( '$1', '', $base );
 			$baseLen = strlen( $base );
-			if( substr( $path, 0, $baseLen ) == $base ) {
+			if ( substr( $path, 0, $baseLen ) == $base ) {
 				$raw = substr( $path, $baseLen );
-				if( $raw !== '' ) {
+				if ( $raw !== '' ) {
 					$matches = array( 'title' => rawurldecode( $raw ) );
-					if( $key ) {
+					if ( $key ) {
 						$matches[$key] = $keyValue;
 					}
 					return $matches;
@@ -271,8 +271,8 @@ class WebRequest {
 	 */
 	private function &fix_magic_quotes( &$arr, $topLevel = true ) {
 		$clean = array();
-		foreach( $arr as $key => $val ) {
-			if( is_array( $val ) ) {
+		foreach ( $arr as $key => $val ) {
+			if ( is_array( $val ) ) {
 				$cleanKey = $topLevel ? stripslashes( $key ) : $key;
 				$clean[$cleanKey] = $this->fix_magic_quotes( $arr[$key], false );
 			} else {
@@ -293,7 +293,7 @@ class WebRequest {
 	private function checkMagicQuotes() {
 		$mustFixQuotes = function_exists( 'get_magic_quotes_gpc' )
 			&& get_magic_quotes_gpc();
-		if( $mustFixQuotes ) {
+		if ( $mustFixQuotes ) {
 			$this->fix_magic_quotes( $_COOKIE );
 			$this->fix_magic_quotes( $_ENV );
 			$this->fix_magic_quotes( $_GET );
@@ -311,8 +311,8 @@ class WebRequest {
 	 * @private
 	 */
 	function normalizeUnicode( $data ) {
-		if( is_array( $data ) ) {
-			foreach( $data as $key => $val ) {
+		if ( is_array( $data ) ) {
+			foreach ( $data as $key => $val ) {
 				$data[$key] = $this->normalizeUnicode( $val );
 			}
 		} else {
@@ -335,19 +335,18 @@ class WebRequest {
 		# http://us2.php.net/variables.external#language.variables.external.dot-in-names
 		# Work around PHP *feature* to avoid *bugs* elsewhere.
 		$name = strtr( $name, '.', '_' );
-		if( isset( $arr[$name] ) ) {
+		if ( isset( $arr[$name] ) ) {
 			global $wgContLang;
 			$data = $arr[$name];
-			if( isset( $_GET[$name] ) && !is_array( $data ) ) {
+			if ( isset( $_GET[$name] ) && !is_array( $data ) ) {
 				# Check for alternate/legacy character encoding.
-				if( isset( $wgContLang ) ) {
+				if ( isset( $wgContLang ) ) {
 					$data = $wgContLang->checkTitleEncoding( $data );
 				}
 			}
 			$data = $this->normalizeUnicode( $data );
 			return $data;
 		} else {
-			taint( $default );
 			return $default;
 		}
 	}
@@ -364,10 +363,10 @@ class WebRequest {
 	 */
 	public function getVal( $name, $default = null ) {
 		$val = $this->getGPCVal( $this->data, $name, $default );
-		if( is_array( $val ) ) {
+		if ( is_array( $val ) ) {
 			$val = $default;
 		}
-		if( is_null( $val ) ) {
+		if ( is_null( $val ) ) {
 			return $val;
 		} else {
 			return (string)$val;
@@ -414,7 +413,7 @@ class WebRequest {
 	 */
 	public function getArray( $name, $default = null ) {
 		$val = $this->getGPCVal( $this->data, $name, $default );
-		if( is_null( $val ) ) {
+		if ( is_null( $val ) ) {
 			return null;
 		} else {
 			return (array)$val;
@@ -433,7 +432,7 @@ class WebRequest {
 	 */
 	public function getIntArray( $name, $default = null ) {
 		$val = $this->getArray( $name, $default );
-		if( is_array( $val ) ) {
+		if ( is_array( $val ) ) {
 			$val = array_map( 'intval', $val );
 		}
 		return $val;
@@ -569,6 +568,44 @@ class WebRequest {
 		return $_GET;
 	}
 
+	/**
+	 * Return the contents of the Query with no decoding. Use when you need to
+	 * know exactly what was sent, e.g. for an OAuth signature over the elements.
+	 *
+	 * @return String
+	 */
+	public function getRawQueryString() {
+		return $_SERVER['QUERY_STRING'];
+	}
+
+	/**
+	 * Return the contents of the POST with no decoding. Use when you need to
+	 * know exactly what was sent, e.g. for an OAuth signature over the elements.
+	 *
+	 * @return String
+	 */
+	public function getRawPostString() {
+		if ( !$this->wasPosted() ) {
+			return '';
+		}
+		return $this->getRawInput();
+	}
+
+	/**
+	 * Return the raw request body, with no processing. Cached since some methods
+	 * disallow reading the stream more than once. As stated in the php docs, this
+	 * does not work with enctype="multipart/form-data".
+	 *
+	 * @return String
+	 */
+	public function getRawInput() {
+		static $input = false;
+		if ( $input === false ) {
+			$input = file_get_contents( 'php://input' );
+		}
+		return $input;
+	}
+
 	/**
 	 * Get the HTTP method used for this request.
 	 *
@@ -603,7 +640,7 @@ class WebRequest {
 	 * @return Boolean
 	 */
 	public function checkSessionCookie() {
-		return isset( $_COOKIE[ session_name() ] );
+		return isset( $_COOKIE[session_name()] );
 	}
 
 	/**
@@ -615,7 +652,7 @@ class WebRequest {
 	 * @return Mixed: cookie value or $default if the cookie not set
 	 */
 	public function getCookie( $key, $prefix = null, $default = null ) {
-		if( $prefix === null ) {
+		if ( $prefix === null ) {
 			global $wgCookiePrefix;
 			$prefix = $wgCookiePrefix;
 		}
@@ -630,14 +667,14 @@ class WebRequest {
 	 * @return String
 	 */
 	public function getRequestURL() {
-		if( isset( $_SERVER['REQUEST_URI'] ) && strlen( $_SERVER['REQUEST_URI'] ) ) {
+		if ( isset( $_SERVER['REQUEST_URI'] ) && strlen( $_SERVER['REQUEST_URI'] ) ) {
 			$base = $_SERVER['REQUEST_URI'];
 		} elseif ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) && strlen( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ) {
 			// Probably IIS; doesn't set REQUEST_URI
 			$base = $_SERVER['HTTP_X_ORIGINAL_URL'];
-		} elseif( isset( $_SERVER['SCRIPT_NAME'] ) ) {
+		} elseif ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
 			$base = $_SERVER['SCRIPT_NAME'];
-			if( isset( $_SERVER['QUERY_STRING'] ) && $_SERVER['QUERY_STRING'] != '' ) {
+			if ( isset( $_SERVER['QUERY_STRING'] ) && $_SERVER['QUERY_STRING'] != '' ) {
 				$base .= '?' . $_SERVER['QUERY_STRING'];
 			}
 		} else {
@@ -651,14 +688,16 @@ class WebRequest {
 		// need to strip it or we get false-positive redirect loops
 		// or weird output URLs
 		$hash = strpos( $base, '#' );
-		if( $hash !== false ) {
+		if ( $hash !== false ) {
 			$base = substr( $base, 0, $hash );
 		}
-		if( $base[0] == '/' ) {
-			return $base;
+
+		if ( $base[0] == '/' ) {
+			// More than one slash will look like it is protocol relative
+			return preg_replace( '!^/+!', '/', $base );
 		} else {
 			// We may get paths with a host prepended; strip it.
-			return preg_replace( '!^[^:]+://[^/]+/!', '/', $base );
+			return preg_replace( '!^[^:]+://[^/]+/+!', '/', $base );
 		}
 	}
 
@@ -737,21 +776,21 @@ class WebRequest {
 		global $wgUser;
 
 		$limit = $this->getInt( 'limit', 0 );
-		if( $limit < 0 ) {
+		if ( $limit < 0 ) {
 			$limit = 0;
 		}
-		if( ( $limit == 0 ) && ( $optionname != '' ) ) {
+		if ( ( $limit == 0 ) && ( $optionname != '' ) ) {
 			$limit = $wgUser->getIntOption( $optionname );
 		}
-		if( $limit <= 0 ) {
+		if ( $limit <= 0 ) {
 			$limit = $deflimit;
 		}
-		if( $limit > 5000 ) {
+		if ( $limit > 5000 ) {
 			$limit = 5000; # We have *some* limits...
 		}
 
 		$offset = $this->getInt( 'offset', 0 );
-		if( $offset < 0 ) {
+		if ( $offset < 0 ) {
 			$offset = 0;
 		}
 
@@ -842,9 +881,10 @@ class WebRequest {
 			return;
 		}
 
-		if ( function_exists( 'apache_request_headers' ) ) {
-			foreach ( apache_request_headers() as $tempName => $tempValue ) {
-				$this->headers[ strtoupper( $tempName ) ] = $tempValue;
+		$apacheHeaders = function_exists( 'apache_request_headers' ) ? apache_request_headers() : false;
+		if ( $apacheHeaders ) {
+			foreach ( $apacheHeaders as $tempName => $tempValue ) {
+				$this->headers[strtoupper( $tempName )] = $tempValue;
 			}
 		} else {
 			foreach ( $_SERVER as $name => $value ) {
@@ -891,7 +931,7 @@ class WebRequest {
 	 * @return Mixed
 	 */
 	public function getSessionData( $key ) {
-		if( !isset( $_SESSION[$key] ) ) {
+		if ( !isset( $_SESSION[$key] ) ) {
 			return null;
 		}
 		return $_SESSION[$key];
@@ -1097,19 +1137,28 @@ HTML;
 				array_unshift( $ipchain, $ip );
 			}
 
-			# Step through XFF list and find the last address in the list which is a trusted server
-			# Set $ip to the IP address given by that trusted server, unless the address is not sensible (e.g. private)
+			# Step through XFF list and find the last address in the list which is a
+			# trusted server. Set $ip to the IP address given by that trusted server,
+			# unless the address is not sensible (e.g. private). However, prefer private
+			# IP addresses over proxy servers controlled by this site (more sensible).
 			foreach ( $ipchain as $i => $curIP ) {
-				$curIP = IP::canonicalize( $curIP );
-				if ( wfIsTrustedProxy( $curIP ) ) {
-					if ( isset( $ipchain[$i + 1] ) ) {
-						if ( $wgUsePrivateIPs || IP::isPublic( $ipchain[$i + 1 ] ) ) {
-							$ip = $ipchain[$i + 1];
+				$curIP = IP::sanitizeIP( IP::canonicalize( $curIP ) );
+				if ( wfIsTrustedProxy( $curIP ) && isset( $ipchain[$i + 1] ) ) {
+					if ( wfIsConfiguredProxy( $curIP ) || // bug 48919; treat IP as sane
+						IP::isPublic( $ipchain[$i + 1] ) ||
+						$wgUsePrivateIPs
+					) {
+						$nextIP = IP::canonicalize( $ipchain[$i + 1] );
+						if ( !$nextIP && wfIsConfiguredProxy( $ip ) ) {
+							// We have not yet made it past CDN/proxy servers of this site,
+							// so either they are misconfigured or there is some IP spoofing.
+							throw new MWException( "Invalid IP given in XFF '$forwardedFor'." );
 						}
+						$ip = $nextIP;
+						continue;
 					}
-				} else {
-					break;
 				}
+				break;
 			}
 		}
 
@@ -1117,7 +1166,7 @@ HTML;
 		wfRunHooks( 'GetIP', array( &$ip ) );
 
 		if ( !$ip ) {
-			throw new MWException( "Unable to determine IP" );
+			throw new MWException( "Unable to determine IP." );
 		}
 
 		wfDebug( "IP: $ip\n" );
@@ -1266,13 +1315,13 @@ class FauxRequest extends WebRequest {
 	 * @throws MWException
 	 */
 	public function __construct( $data = array(), $wasPosted = false, $session = null ) {
-		if( is_array( $data ) ) {
+		if ( is_array( $data ) ) {
 			$this->data = $data;
 		} else {
 			throw new MWException( "FauxRequest() got bogus data" );
 		}
 		$this->wasPosted = $wasPosted;
-		if( $session ) {
+		if ( $session ) {
 			$this->session = $session;
 		}
 	}
@@ -1337,10 +1386,11 @@ class FauxRequest extends WebRequest {
 	}
 
 	/**
-	 * @param $name
+	 * @param string $name The name of the header to get (case insensitive).
 	 * @return bool|string
 	 */
 	public function getHeader( $name ) {
+		$name = strtoupper( $name );
 		return isset( $this->headers[$name] ) ? $this->headers[$name] : false;
 	}
 
@@ -1349,6 +1399,7 @@ class FauxRequest extends WebRequest {
 	 * @param $val string
 	 */
 	public function setHeader( $name, $val ) {
+		$name = strtoupper( $name );
 		$this->headers[$name] = $val;
 	}
 
@@ -1357,7 +1408,7 @@ class FauxRequest extends WebRequest {
 	 * @return mixed
 	 */
 	public function getSessionData( $key ) {
-		if( isset( $this->session[$key] ) ) {
+		if ( isset( $this->session[$key] ) ) {
 			return $this->session[$key];
 		}
 		return null;
@@ -1386,6 +1437,30 @@ class FauxRequest extends WebRequest {
 		return false;
 	}
 
+	/**
+	 * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
+	 * @return String
+	 */
+	public function getRawQueryString() {
+		return '';
+	}
+
+	/**
+	 * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
+	 * @return String
+	 */
+	public function getRawPostString() {
+		return '';
+	}
+
+	/**
+	 * FauxRequests shouldn't depend on raw request data (but that could be implemented here)
+	 * @return String
+	 */
+	public function getRawInput() {
+		return '';
+	}
+
 	/**
 	 * @param array $extWhitelist
 	 * @return bool
diff --git a/includes/WebResponse.php b/includes/WebResponse.php
index 8e15d712..ab7524c2 100644
--- a/includes/WebResponse.php
+++ b/includes/WebResponse.php
@@ -42,56 +42,81 @@ class WebResponse {
 	 * Set the browser cookie
 	 * @param string $name name of cookie
 	 * @param string $value value to give cookie
-	 * @param int $expire Unix timestamp (in seconds) when the cookie should expire.
+	 * @param int|null $expire Unix timestamp (in seconds) when the cookie should expire.
 	 *        0 (the default) causes it to expire $wgCookieExpiration seconds from now.
-	 * @param string $prefix Prefix to use, if not $wgCookiePrefix (use '' for no prefix)
-	 * @param string $domain Cookie domain to use, if not $wgCookieDomain
-	 * @param $forceSecure Bool:
-	 *   true: force the cookie to be set with the secure attribute
-	 *   false: force the cookie to be set without the secure attribute
-	 *   null: use the value from $wgCookieSecure
+	 *        null causes it to be a session cookie.
+	 * @param array $options Assoc of additional cookie options:
+	 *     prefix: string, name prefix ($wgCookiePrefix)
+	 *     domain: string, cookie domain ($wgCookieDomain)
+	 *     path: string, cookie path ($wgCookiePath)
+	 *     secure: bool, secure attribute ($wgCookieSecure)
+	 *     httpOnly: bool, httpOnly attribute ($wgCookieHttpOnly)
+	 *     raw: bool, if true uses PHP's setrawcookie() instead of setcookie()
+	 *   For backwards compatability, if $options is not an array then it and
+	 *   the following two parameters will be interpreted as values for
+	 *   'prefix', 'domain', and 'secure'
+	 * @since 1.22 Replaced $prefix, $domain, and $forceSecure with $options
 	 */
-	public function setcookie( $name, $value, $expire = 0, $prefix = null, $domain = null, $forceSecure = null ) {
+	public function setcookie( $name, $value, $expire = 0, $options = null ) {
 		global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain;
 		global $wgCookieSecure, $wgCookieExpiration, $wgCookieHttpOnly;
-		if ( $expire == 0 ) {
-			$expire = time() + $wgCookieExpiration;
-		}
-		if( $prefix === null ) {
-			$prefix = $wgCookiePrefix;
+
+		if ( !is_array( $options ) ) {
+			// Backwards compatability
+			$options = array( 'prefix' => $options );
+			if ( func_num_args() >= 5 ) {
+				$options['domain'] = func_get_arg( 4 );
+			}
+			if ( func_num_args() >= 6 ) {
+				$options['secure'] = func_get_arg( 5 );
+			}
 		}
-		if( $domain === null ) {
-			$domain = $wgCookieDomain;
+		$options = array_filter( $options, function ( $a ) {
+			return $a !== null;
+		} ) + array(
+			'prefix' => $wgCookiePrefix,
+			'domain' => $wgCookieDomain,
+			'path' => $wgCookiePath,
+			'secure' => $wgCookieSecure,
+			'httpOnly' => $wgCookieHttpOnly,
+			'raw' => false,
+		);
+
+		if ( $expire === null ) {
+			$expire = 0; // Session cookie
+		} elseif ( $expire == 0 && $wgCookieExpiration != 0 ) {
+			$expire = time() + $wgCookieExpiration;
 		}
 
-		if ( is_null( $forceSecure ) ) {
-			$secureCookie = $wgCookieSecure;
-		} else {
-			$secureCookie = $forceSecure;
+		// Don't mark the cookie as httpOnly if the requesting user-agent is
+		// known to have trouble with httpOnly cookies.
+		if ( !wfHttpOnlySafe() ) {
+			$options['httpOnly'] = false;
 		}
 
-		// Mark the cookie as httpOnly if $wgCookieHttpOnly is true,
-		// unless the requesting user-agent is known to have trouble with
-		// httpOnly cookies.
-		$httpOnlySafe = $wgCookieHttpOnly && wfHttpOnlySafe();
-
-		wfDebugLog( 'cookie',
-			'setcookie: "' . implode( '", "',
-				array(
-					$prefix . $name,
-					$value,
-					$expire,
-					$wgCookiePath,
-					$domain,
-					$secureCookie,
-					$httpOnlySafe ) ) . '"' );
-		setcookie( $prefix . $name,
-			$value,
-			$expire,
-			$wgCookiePath,
-			$domain,
-			$secureCookie,
-			$httpOnlySafe );
+		$func = $options['raw'] ? 'setrawcookie' : 'setcookie';
+
+		if ( wfRunHooks( 'WebResponseSetCookie', array( &$name, &$value, &$expire, $options ) ) ) {
+			wfDebugLog( 'cookie',
+				$func . ': "' . implode( '", "',
+					array(
+						$options['prefix'] . $name,
+						$value,
+						$expire,
+						$options['path'],
+						$options['domain'],
+						$options['secure'],
+						$options['httpOnly'] ) ) . '"' );
+
+			call_user_func( $func,
+				$options['prefix'] . $name,
+				$value,
+				$expire,
+				$options['path'],
+				$options['domain'],
+				$options['secure'],
+				$options['httpOnly'] );
+		}
 	}
 }
 
@@ -116,7 +141,9 @@ class FauxResponse extends WebResponse {
 		} else {
 			list( $key, $val ) = array_map( 'trim', explode( ":", $string, 2 ) );
 
-			if( $replace || !isset( $this->headers[$key] ) ) {
+			$key = strtoupper( $key );
+
+			if ( $replace || !isset( $this->headers[$key] ) ) {
 				$this->headers[$key] = $val;
 			}
 		}
@@ -127,10 +154,12 @@ class FauxResponse extends WebResponse {
 	}
 
 	/**
-	 * @param $key string
+	 * @param string $key The name of the header to get (case insensitive).
 	 * @return string
 	 */
 	public function getheader( $key ) {
+		$key = strtoupper( $key );
+
 		if ( isset( $this->headers[$key] ) ) {
 			return $this->headers[$key];
 		}
@@ -152,11 +181,9 @@ class FauxResponse extends WebResponse {
 	 * @param string $name name of cookie
 	 * @param string $value value to give cookie
 	 * @param int $expire number of seconds til cookie expires (Default: 0)
-	 * @param $prefix TODO DOCUMENT (Default: null)
-	 * @param $domain TODO DOCUMENT (Default: null)
-	 * @param $forceSecure TODO DOCUMENT (Default: null)
+	 * @param array $options ignored
 	 */
-	public function setcookie( $name, $value, $expire = 0, $prefix = null, $domain = null, $forceSecure = null ) {
+	public function setcookie( $name, $value, $expire = 0, $options = null ) {
 		$this->cookies[$name] = $value;
 	}
 
diff --git a/includes/WebStart.php b/includes/WebStart.php
index e6f31355..58c953af 100644
--- a/includes/WebStart.php
+++ b/includes/WebStart.php
@@ -48,7 +48,7 @@ if ( ini_get( 'register_globals' ) ) {
 		'HTTP_SESSION_VARS'
 	);
 	foreach ( $_REQUEST as $name => $value ) {
-		if( in_array( $name, $verboten ) ) {
+		if ( in_array( $name, $verboten ) ) {
 			header( "HTTP/1.1 500 Internal Server Error" );
 			echo "register_globals security paranoia: trying to overwrite superglobals, aborting.";
 			die( -1 );
@@ -84,62 +84,56 @@ define( 'MEDIAWIKI', true );
 # if we don't have permissions on parent directories.
 $IP = getenv( 'MW_INSTALL_PATH' );
 if ( $IP === false ) {
-	if( realpath( '.' ) ) {
+	if ( realpath( '.' ) ) {
 		$IP = realpath( '.' );
 	} else {
 		$IP = dirname( __DIR__ );
 	}
 }
 
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-	define( 'MW_COMPILED', 1 );
-} else {
-	# Get MWInit class
-	require_once( "$IP/includes/Init.php" );
-
-	# Start the autoloader, so that extensions can derive classes from core files
-	require_once( "$IP/includes/AutoLoader.php" );
+# Start the autoloader, so that extensions can derive classes from core files
+require_once "$IP/includes/AutoLoader.php";
 
-	# Load the profiler
-	require_once( "$IP/includes/profiler/Profiler.php" );
+# Load the profiler
+require_once "$IP/includes/profiler/Profiler.php";
 
-	# Load up some global defines.
-	require_once( "$IP/includes/Defines.php" );
-}
+# Load up some global defines.
+require_once "$IP/includes/Defines.php";
 
 # Start the profiler
 $wgProfiler = array();
 if ( file_exists( "$IP/StartProfiler.php" ) ) {
-	require( "$IP/StartProfiler.php" );
+	require "$IP/StartProfiler.php";
 }
 
 wfProfileIn( 'WebStart.php-conf' );
 
 # Load default settings
-require_once( MWInit::compiledPath( "includes/DefaultSettings.php" ) );
+require_once "$IP/includes/DefaultSettings.php";
+
+# Load composer's autoloader if present
+if ( is_readable( "$IP/vendor/autoload.php" ) ) {
+	require_once "$IP/vendor/autoload.php";
+}
 
 if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
 	# Use a callback function to configure MediaWiki
-	MWFunction::call( MW_CONFIG_CALLBACK );
+	call_user_func( MW_CONFIG_CALLBACK );
 } else {
 	if ( !defined( 'MW_CONFIG_FILE' ) ) {
-		define( 'MW_CONFIG_FILE', MWInit::interpretedPath( 'LocalSettings.php' ) );
+		define( 'MW_CONFIG_FILE', "$IP/LocalSettings.php" );
 	}
 
 	# LocalSettings.php is the per site customization file. If it does not exist
 	# the wiki installer needs to be launched or the generated file uploaded to
 	# the root wiki directory
-	if( !file_exists( MW_CONFIG_FILE ) ) {
-		require_once( "$IP/includes/templates/NoLocalSettings.php" );
+	if ( !file_exists( MW_CONFIG_FILE ) ) {
+		require_once "$IP/includes/templates/NoLocalSettings.php";
 		die();
 	}
 
 	# Include site settings. $IP may be changed (hopefully before the AutoLoader is invoked)
-	require_once( MW_CONFIG_FILE );
-}
-
-if ( $wgEnableSelenium ) {
-	require_once( MWInit::compiledPath( "includes/SeleniumWebSettings.php" ) );
+	require_once MW_CONFIG_FILE;
 }
 
 wfProfileOut( 'WebStart.php-conf' );
@@ -150,13 +144,11 @@ wfProfileIn( 'WebStart.php-ob_start' );
 # that would cause us to potentially mix gzip and non-gzip output, creating a
 # big mess.
 if ( !defined( 'MW_NO_OUTPUT_BUFFER' ) && ob_get_level() == 0 ) {
-	if ( !defined( 'MW_COMPILED' ) ) {
-		require_once( "$IP/includes/OutputHandler.php" );
-	}
+	require_once "$IP/includes/OutputHandler.php";
 	ob_start( 'wfOutputHandler' );
 }
 wfProfileOut( 'WebStart.php-ob_start' );
 
 if ( !defined( 'MW_NO_SETUP' ) ) {
-	require_once( MWInit::compiledPath( "includes/Setup.php" ) );
+	require_once "$IP/includes/Setup.php";
 }
diff --git a/includes/Wiki.php b/includes/Wiki.php
index f8f699c9..ae75bf33 100644
--- a/includes/Wiki.php
+++ b/includes/Wiki.php
@@ -85,8 +85,6 @@ class MediaWiki {
 		} elseif ( $curid ) {
 			// URLs like this are generated by RC, because rc_title isn't always accurate
 			$ret = Title::newFromID( $curid );
-		} elseif ( $title == '' && $action != 'delete' ) {
-			$ret = Title::newMainPage();
 		} else {
 			$ret = Title::newFromURL( $title );
 			// Alias NS_MEDIA page URLs to NS_FILE...we only use NS_MEDIA
@@ -102,8 +100,12 @@ class MediaWiki {
 				$wgContLang->findVariantLink( $title, $ret );
 			}
 		}
-		// For non-special titles, check for implicit titles
-		if ( is_null( $ret ) || !$ret->isSpecialPage() ) {
+
+		// If title is not provided, always allow oldid and diff to set the title.
+		// If title is provided, allow oldid and diff to override the title, unless
+		// we are talking about a special page which might use these parameters for
+		// other purposes.
+		if ( $ret === null || !$ret->isSpecialPage() ) {
 			// We can have urls with just ?diff=,?oldid= or even just ?diff=
 			$oldid = $request->getInt( 'oldid' );
 			$oldid = $oldid ? $oldid : $request->getInt( 'diff' );
@@ -114,6 +116,11 @@ class MediaWiki {
 			}
 		}
 
+		// Use the main page as default title if nothing else has been provided
+		if ( $ret === null && strval( $title ) === '' && $action !== 'delete' ) {
+			$ret = Title::newMainPage();
+		}
+
 		if ( $ret === null || ( $ret->getDBkey() == '' && $ret->getInterwiki() == '' ) ) {
 			$ret = SpecialPage::getTitleFor( 'Badtitle' );
 		}
@@ -126,7 +133,7 @@ class MediaWiki {
 	 * @return Title
 	 */
 	public function getTitle() {
-		if( $this->context->getTitle() === null ) {
+		if ( $this->context->getTitle() === null ) {
 			$this->context->setTitle( $this->parseTitle() );
 		}
 		return $this->context->getTitle();
@@ -227,7 +234,7 @@ class MediaWiki {
 		if ( $title->getInterwiki() != '' ) {
 			$rdfrom = $request->getVal( 'rdfrom' );
 			if ( $rdfrom ) {
-				$url = $title->getFullURL( 'rdfrom=' . urlencode( $rdfrom ) );
+				$url = $title->getFullURL( array( 'rdfrom' => $rdfrom ) );
 			} else {
 				$query = $request->getValues();
 				unset( $query['title'] );
@@ -307,7 +314,8 @@ class MediaWiki {
 				$output->redirect( $article );
 			} else {
 				wfProfileOut( __METHOD__ );
-				throw new MWException( "Shouldn't happen: MediaWiki::initializeArticle() returned neither an object nor a URL" );
+				throw new MWException( "Shouldn't happen: MediaWiki::initializeArticle()"
+					. " returned neither an object nor a URL" );
 			}
 		}
 
@@ -427,7 +435,8 @@ class MediaWiki {
 
 		$act = $this->getAction();
 
-		$action = Action::factory( $act, $page );
+		$action = Action::factory( $act, $page, $this->context );
+
 		if ( $action instanceof Action ) {
 			# Let Squid cache things if we can purge them.
 			if ( $wgUseSquid &&
@@ -480,7 +489,7 @@ class MediaWiki {
 				$resp->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
 				$resp->header( 'X-Database-Lag: ' . intval( $lag ) );
 				$resp->header( 'Content-Type: text/plain' );
-				if( $wgShowHostnames ) {
+				if ( $wgShowHostnames ) {
 					echo "Waiting for $host: $lag seconds lagged\n";
 				} else {
 					echo "Waiting for a database server: $lag seconds lagged\n";
@@ -502,23 +511,6 @@ class MediaWiki {
 
 		$request = $this->context->getRequest();
 
-		if ( $request->getCookie( 'forceHTTPS' )
-			&& $request->detectProtocol() == 'http'
-			&& $request->getMethod() == 'GET'
-		) {
-			$redirUrl = $request->getFullRequestURL();
-			$redirUrl = str_replace( 'http://', 'https://', $redirUrl );
-
-			// Setup dummy Title, otherwise OutputPage::redirect will fail
-			$title = Title::newFromText( NS_MAIN, 'REDIR' );
-			$this->context->setTitle( $title );
-			$output = $this->context->getOutput();
-			$output->redirect( $redirUrl );
-			$output->output();
-			wfProfileOut( __METHOD__ );
-			return;
-		}
-
 		// Send Ajax requests to the Ajax dispatcher.
 		if ( $wgUseAjax && $request->getVal( 'action', 'view' ) == 'ajax' ) {
 
@@ -539,6 +531,51 @@ class MediaWiki {
 		$action = $this->getAction();
 		$wgTitle = $title;
 
+		// If the user has forceHTTPS set to true, or if the user
+		// is in a group requiring HTTPS, or if they have the HTTPS
+		// preference set, redirect them to HTTPS.
+		// Note: Do this after $wgTitle is setup, otherwise the hooks run from
+		// isLoggedIn() will do all sorts of weird stuff.
+		if (
+			(
+				$request->getCookie( 'forceHTTPS', '' ) ||
+				// check for prefixed version for currently logged in users
+				$request->getCookie( 'forceHTTPS' ) ||
+				// Avoid checking the user and groups unless it's enabled.
+				(
+					$this->context->getUser()->isLoggedIn()
+					&& $this->context->getUser()->requiresHTTPS()
+				)
+			) &&
+			$request->detectProtocol() == 'http'
+		) {
+			$oldUrl = $request->getFullRequestURL();
+			$redirUrl = str_replace( 'http://', 'https://', $oldUrl );
+
+			if ( $request->wasPosted() ) {
+				// This is weird and we'd hope it almost never happens. This
+				// means that a POST came in via HTTP and policy requires us
+				// redirecting to HTTPS. It's likely such a request is going
+				// to fail due to post data being lost, but let's try anyway
+				// and just log the instance.
+				//
+				// @todo @fixme See if we could issue a 307 or 308 here, need
+				// to see how clients (automated & browser) behave when we do
+				wfDebugLog( 'RedirectedPosts', "Redirected from HTTP to HTTPS: $oldUrl" );
+			}
+
+			// Setup dummy Title, otherwise OutputPage::redirect will fail
+			$title = Title::newFromText( NS_MAIN, 'REDIR' );
+			$this->context->setTitle( $title );
+			$output = $this->context->getOutput();
+			// Since we only do this redir to change proto, always send a vary header
+			$output->addVaryHeader( 'X-Forwarded-Proto' );
+			$output->redirect( $redirUrl );
+			$output->output();
+			wfProfileOut( __METHOD__ );
+			return;
+		}
+
 		if ( $wgUseFileCache && $title->getNamespace() >= 0 ) {
 			wfProfileIn( 'main-try-filecache' );
 			if ( HTMLFileCache::useFileCache( $this->context ) ) {
@@ -599,7 +636,7 @@ class MediaWiki {
 	 * Do a job from the job queue
 	 */
 	private function doJobs() {
-		global $wgJobRunRate;
+		global $wgJobRunRate, $wgPhpCli, $IP;
 
 		if ( $wgJobRunRate <= 0 || wfReadOnly() ) {
 			return;
@@ -615,23 +652,43 @@ class MediaWiki {
 			$n = intval( $wgJobRunRate );
 		}
 
-		$group = JobQueueGroup::singleton();
-		do {
-			$job = $group->pop( JobQueueGroup::USE_CACHE ); // job from any queue
-			if ( $job ) {
-				$output = $job->toString() . "\n";
-				$t = - microtime( true );
-				$success = $job->run();
-				$group->ack( $job ); // done
-				$t += microtime( true );
-				$t = round( $t * 1000 );
-				if ( !$success ) {
-					$output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
-				} else {
-					$output .= "Success, Time: $t ms\n";
-				}
-				wfDebugLog( 'jobqueue', $output );
+		if ( !wfShellExecDisabled() && is_executable( $wgPhpCli ) ) {
+			// Start a background process to run some of the jobs.
+			// This will be asynchronous on *nix though not on Windows.
+			wfProfileIn( __METHOD__ . '-exec' );
+			$retVal = 1;
+			$cmd = wfShellWikiCmd( "$IP/maintenance/runJobs.php", array( '--maxjobs', $n ) );
+			wfShellExec( "$cmd &", $retVal );
+			wfProfileOut( __METHOD__ . '-exec' );
+		} else {
+			try {
+				// Fallback to running the jobs here while the user waits
+				$group = JobQueueGroup::singleton();
+				do {
+					$job = $group->pop( JobQueueGroup::USE_CACHE ); // job from any queue
+					if ( $job ) {
+						$output = $job->toString() . "\n";
+						$t = - microtime( true );
+						wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
+						$success = $job->run();
+						wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
+						$group->ack( $job ); // done
+						$t += microtime( true );
+						$t = round( $t * 1000 );
+						if ( $success === false ) {
+							$output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
+						} else {
+							$output .= "Success, Time: $t ms\n";
+						}
+						wfDebugLog( 'jobqueue', $output );
+					}
+				} while ( --$n && $job );
+			} catch ( MWException $e ) {
+				// We don't want exceptions thrown during job execution to
+				// be reported to the user since the output is already sent.
+				// Instead we just log them.
+				MWExceptionHandler::logException( $e );
 			}
-		} while ( --$n && $job );
+		}
 	}
 }
diff --git a/includes/WikiError.php b/includes/WikiError.php
index 62781213..08eb8004 100644
--- a/includes/WikiError.php
+++ b/includes/WikiError.php
@@ -143,7 +143,7 @@ class WikiXmlError extends WikiError {
 	}
 
 	function _extractContext( $context, $offset ) {
-		if( is_null( $context ) ) {
+		if ( is_null( $context ) ) {
 			return null;
 		} else {
 			// Hopefully integer overflow will be handled transparently here
diff --git a/includes/WikiFilePage.php b/includes/WikiFilePage.php
index 5e603d37..fe1ff88a 100644
--- a/includes/WikiFilePage.php
+++ b/includes/WikiFilePage.php
@@ -183,6 +183,10 @@ class WikiFilePage extends WikiPage {
 			// to be updated (in case the cached information is wrong)
 			$this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
 		}
+		if ( $this->mRepo ) {
+			// Purge redirect cache
+			$this->mRepo->invalidateImageRedirect( $this->mTitle );
+		}
 		return parent::doPurge();
 	}
 }
diff --git a/includes/WikiMap.php b/includes/WikiMap.php
index b04a7842..da4416de 100644
--- a/includes/WikiMap.php
+++ b/includes/WikiMap.php
@@ -37,13 +37,18 @@ class WikiMap {
 		$wgConf->loadFullData();
 
 		list( $major, $minor ) = $wgConf->siteFromDB( $wikiID );
-		if( $major === null ) {
+		if ( $major === null ) {
 			return null;
 		}
-		$canonicalServer = $wgConf->get( 'wgCanonicalServer', $wikiID, $major,
-			array( 'lang' => $minor, 'site' => $major ) );
 		$server = $wgConf->get( 'wgServer', $wikiID, $major,
 			array( 'lang' => $minor, 'site' => $major ) );
+
+		$canonicalServer = $wgConf->get( 'wgCanonicalServer', $wikiID, $major,
+			array( 'lang' => $minor, 'site' => $major ) );
+		if ( $canonicalServer === false || $canonicalServer === null ) {
+			$canonicalServer = $server;
+		}
+
 		$path = $wgConf->get( 'wgArticlePath', $wikiID, $major,
 			array( 'lang' => $minor, 'site' => $major ) );
 		return new WikiReference( $major, $minor, $canonicalServer, $path, $server );
@@ -73,7 +78,7 @@ class WikiMap {
 	 * @param string $text link's text; optional, default to "User:$user"
 	 * @return String: HTML link or false if the wiki was not found
 	 */
-	public static function foreignUserLink( $wikiID, $user, $text=null ) {
+	public static function foreignUserLink( $wikiID, $user, $text = null ) {
 		return self::makeForeignLink( $wikiID, "User:$user", $text );
 	}
 
@@ -85,7 +90,7 @@ class WikiMap {
 	 * @param string $text link's text; optional, default to $page
 	 * @return String: HTML link or false if the wiki was not found
 	 */
-	public static function makeForeignLink( $wikiID, $page, $text=null ) {
+	public static function makeForeignLink( $wikiID, $page, $text = null ) {
 		if ( !$text ) {
 			$text = $page;
 		}
@@ -211,15 +216,14 @@ class WikiReference {
 	}
 
 	/**
-	 * Get a URL based on $wgServer, like Title::getFullUrl() would produce
+	 * Get a URL based on $wgServer, like Title::getFullURL() would produce
 	 * when called locally on the wiki.
 	 *
 	 * @param string $page page name (must be normalized before calling this function!)
 	 * @return String: URL
 	 */
 	public function getFullUrl( $page ) {
-		return
-			$this->mServer .
+		return $this->mServer .
 			$this->getLocalUrl( $page );
 	}
 }
diff --git a/includes/WikiPage.php b/includes/WikiPage.php
index de881ef6..7c3dc937 100644
--- a/includes/WikiPage.php
+++ b/includes/WikiPage.php
@@ -23,7 +23,8 @@
 /**
  * Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
  */
-interface Page {}
+interface Page {
+}
 
 /**
  * Class representing a MediaWiki article and history.
@@ -50,6 +51,11 @@ class WikiPage implements Page, IDBAccessObject {
 	public $mPreparedEdit = false;       // !< Array
 	/**@}}*/
 
+	/**
+	 * @var int
+	 */
+	protected $mId = null;
+
 	/**
 	 * @var int; one of the READ_* constants
 	 */
@@ -182,7 +188,7 @@ class WikiPage implements Page, IDBAccessObject {
 	 * (and only when) $wgActions[$action] === true. This allows subclasses
 	 * to override the default behavior.
 	 *
-	 * @todo: move this UI stuff somewhere else
+	 * @todo Move this UI stuff somewhere else
 	 *
 	 * @return Array
 	 */
@@ -228,6 +234,7 @@ class WikiPage implements Page, IDBAccessObject {
 	 * @return void
 	 */
 	protected function clearCacheFields() {
+		$this->mId = null;
 		$this->mCounter = null;
 		$this->mRedirectTarget = null; // Title object if set
 		$this->mLastRevision = null; // Latest revision
@@ -299,7 +306,7 @@ class WikiPage implements Page, IDBAccessObject {
 	public function pageDataFromTitle( $dbr, $title, $options = array() ) {
 		return $this->pageData( $dbr, array(
 			'page_namespace' => $title->getNamespace(),
-			'page_title'     => $title->getDBkey() ), $options );
+			'page_title' => $title->getDBkey() ), $options );
 	}
 
 	/**
@@ -381,10 +388,11 @@ class WikiPage implements Page, IDBAccessObject {
 			// Old-fashioned restrictions
 			$this->mTitle->loadRestrictions( $data->page_restrictions );
 
-			$this->mCounter     = intval( $data->page_counter );
-			$this->mTouched     = wfTimestamp( TS_MW, $data->page_touched );
-			$this->mIsRedirect  = intval( $data->page_is_redirect );
-			$this->mLatest      = intval( $data->page_latest );
+			$this->mId = intval( $data->page_id );
+			$this->mCounter = intval( $data->page_counter );
+			$this->mTouched = wfTimestamp( TS_MW, $data->page_touched );
+			$this->mIsRedirect = intval( $data->page_is_redirect );
+			$this->mLatest = intval( $data->page_latest );
 			// Bug 37225: $latest may no longer match the cached latest Revision object.
 			// Double-check the ID of any cached latest Revision object for consistency.
 			if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
@@ -397,6 +405,8 @@ class WikiPage implements Page, IDBAccessObject {
 			$this->mTitle->loadFromRow( false );
 
 			$this->clearCacheFields();
+
+			$this->mId = 0;
 		}
 
 		$this->mDataLoaded = true;
@@ -407,14 +417,20 @@ class WikiPage implements Page, IDBAccessObject {
 	 * @return int Page ID
 	 */
 	public function getId() {
-		return $this->mTitle->getArticleID();
+		if ( !$this->mDataLoaded ) {
+			$this->loadPageData();
+		}
+		return $this->mId;
 	}
 
 	/**
 	 * @return bool Whether or not the page exists in the database
 	 */
 	public function exists() {
-		return $this->mTitle->exists();
+		if ( !$this->mDataLoaded ) {
+			$this->loadPageData();
+		}
+		return $this->mId > 0;
 	}
 
 	/**
@@ -426,7 +442,7 @@ class WikiPage implements Page, IDBAccessObject {
 	 * @return bool
 	 */
 	public function hasViewableContent() {
-		return $this->mTitle->exists() || $this->mTitle->isAlwaysKnown();
+		return $this->exists() || $this->mTitle->isAlwaysKnown();
 	}
 
 	/**
@@ -447,7 +463,9 @@ class WikiPage implements Page, IDBAccessObject {
 	 */
 	public function isRedirect() {
 		$content = $this->getContent();
-		if ( !$content ) return false;
+		if ( !$content ) {
+			return false;
+		}
 
 		return $content->isRedirect();
 	}
@@ -524,6 +542,7 @@ class WikiPage implements Page, IDBAccessObject {
 		$db = wfGetDB( DB_SLAVE );
 		$revSelectFields = Revision::selectFields();
 
+		$row = null;
 		while ( $continue ) {
 			$row = $db->selectRow(
 				array( 'page', 'revision' ),
@@ -631,7 +650,7 @@ class WikiPage implements Page, IDBAccessObject {
 	 * @return String|false The text of the current revision
 	 * @deprecated as of 1.21, getContent() should be used instead.
 	 */
-	public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) { // @todo: deprecated, replace usage!
+	public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) { // @todo deprecated, replace usage!
 		ContentHandler::deprecated( __METHOD__, '1.21' );
 
 		$this->loadLastEdit();
@@ -782,7 +801,7 @@ class WikiPage implements Page, IDBAccessObject {
 	public function setCachedLastEditTime( $timestamp ) {
 		global $wgMemc;
 		$key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
-		$wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60*15 );
+		$wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60 * 15 );
 	}
 
 	/**
@@ -891,10 +910,10 @@ class WikiPage implements Page, IDBAccessObject {
 		$dbw = wfGetDB( DB_MASTER );
 		$dbw->replace( 'redirect', array( 'rd_from' ),
 			array(
-				'rd_from'      => $this->getId(),
+				'rd_from' => $this->getId(),
 				'rd_namespace' => $rt->getNamespace(),
-				'rd_title'     => $rt->getDBkey(),
-				'rd_fragment'  => $rt->getFragment(),
+				'rd_title' => $rt->getDBkey(),
+				'rd_fragment' => $rt->getFragment(),
 				'rd_interwiki' => $rt->getInterwiki(),
 			),
 			__METHOD__
@@ -929,7 +948,7 @@ class WikiPage implements Page, IDBAccessObject {
 				// This can be hard to reverse and may produce loops,
 				// so they may be disabled in the site configuration.
 				$source = $this->mTitle->getFullURL( 'redirect=no' );
-				return $rt->getFullURL( 'rdfrom=' . urlencode( $source ) );
+				return $rt->getFullURL( array( 'rdfrom' => $source ) );
 			} else {
 				// External pages pages without "local" bit set are not valid
 				// redirect targets
@@ -1006,8 +1025,8 @@ class WikiPage implements Page, IDBAccessObject {
 
 	/**
 	 * Get the last N authors
-	 * @param $num Integer: number of revisions to get
-	 * @param string $revLatest the latest rev_id, selected from the master (optional)
+	 * @param int $num Number of revisions to get
+	 * @param int|string $revLatest the latest rev_id, selected from the master (optional)
 	 * @return array Array of authors, duplicates not removed
 	 */
 	public function getLastNAuthors( $num, $revLatest = 0 ) {
@@ -1068,7 +1087,7 @@ class WikiPage implements Page, IDBAccessObject {
 
 		return $wgEnableParserCache
 			&& $parserOptions->getStubThreshold() == 0
-			&& $this->mTitle->exists()
+			&& $this->exists()
 			&& ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
 			&& $this->getContentHandler()->isParserCacheSupported();
 	}
@@ -1078,8 +1097,8 @@ class WikiPage implements Page, IDBAccessObject {
 	 * The parser cache will be used if possible.
 	 *
 	 * @since 1.19
-	 * @param $parserOptions ParserOptions to use for the parse operation
-	 * @param $oldid Revision ID to get the text from, passing null or 0 will
+	 * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
+	 * @param null|int $oldid Revision ID to get the text from, passing null or 0 will
 	 *               get the current revision (default value)
 	 *
 	 * @return ParserOutput or false if the revision was not found
@@ -1124,7 +1143,7 @@ class WikiPage implements Page, IDBAccessObject {
 		}
 
 		// Don't update page view counters on views from bot users (bug 14044)
-		if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->mTitle->exists() ) {
+		if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->exists() ) {
 			DeferredUpdates::addUpdate( new ViewCountUpdate( $this->getId() ) );
 			DeferredUpdates::addUpdate( new SiteStatsUpdate( 1, 0, 0 ) );
 		}
@@ -1140,13 +1159,12 @@ class WikiPage implements Page, IDBAccessObject {
 	public function doPurge() {
 		global $wgUseSquid;
 
-		if( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
+		if ( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
 			return false;
 		}
 
 		// Invalidate the cache
 		$this->mTitle->invalidateCache();
-		$this->clear();
 
 		if ( $wgUseSquid ) {
 			// Commit the transaction before the purge is sent
@@ -1159,16 +1177,18 @@ class WikiPage implements Page, IDBAccessObject {
 		}
 
 		if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
-			// @todo: move this logic to MessageCache
+			// @todo move this logic to MessageCache
 
-			if ( $this->mTitle->exists() ) {
+			if ( $this->exists() ) {
 				// NOTE: use transclusion text for messages.
 				//       This is consistent with  MessageCache::getMsgFromNamespace()
 
 				$content = $this->getContent();
 				$text = $content === null ? null : $content->getWikitextForTransclusion();
 
-				if ( $text === null ) $text = false;
+				if ( $text === null ) {
+					$text = false;
+				}
 			} else {
 				$text = false;
 			}
@@ -1210,6 +1230,7 @@ class WikiPage implements Page, IDBAccessObject {
 
 		if ( $affected ) {
 			$newid = $dbw->insertId();
+			$this->mId = $newid;
 			$this->mTitle->resetArticleID( $newid );
 		}
 		wfProfileOut( __METHOD__ );
@@ -1258,7 +1279,7 @@ class WikiPage implements Page, IDBAccessObject {
 		);
 
 		if ( $wgContentHandlerUseDB ) {
-			$row[ 'page_content_model' ] = $revision->getContentModel();
+			$row['page_content_model'] = $revision->getContentModel();
 		}
 
 		$dbw->update( 'page',
@@ -1436,12 +1457,12 @@ class WikiPage implements Page, IDBAccessObject {
 	}
 
 	/**
-	 * Returns true iff this page's content model supports sections.
+	 * Returns true if this page's content model supports sections.
 	 *
 	 * @return boolean whether sections are supported.
 	 *
-	 * @todo: the skin should check this and not offer section functionality if sections are not supported.
-	 * @todo: the EditPage should check this and not offer section functionality if sections are not supported.
+	 * @todo The skin should check this and not offer section functionality if sections are not supported.
+	 * @todo The EditPage should check this and not offer section functionality if sections are not supported.
 	 */
 	public function supportsSections() {
 		return $this->getContentHandler()->supportsSections();
@@ -1466,6 +1487,7 @@ class WikiPage implements Page, IDBAccessObject {
 			$newContent = $sectionContent;
 		} else {
 			if ( !$this->supportsSections() ) {
+				wfProfileOut( __METHOD__ );
 				throw new MWException( "sections not supported for content model " . $this->getContentHandler()->getModelID() );
 			}
 
@@ -1507,7 +1529,7 @@ class WikiPage implements Page, IDBAccessObject {
 	 */
 	function checkFlags( $flags ) {
 		if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
-			if ( $this->mTitle->getArticleID() ) {
+			if ( $this->exists() ) {
 				$flags |= EDIT_UPDATE;
 			} else {
 				$flags |= EDIT_NEW;
@@ -1602,7 +1624,7 @@ class WikiPage implements Page, IDBAccessObject {
 	 * edit-already-exists error will be returned. These two conditions are also possible with
 	 * auto-detection due to MediaWiki's performance-optimised locking strategy.
 	 *
-	 * @param bool|\the $baseRevId the revision ID this edit was based off, if any
+	 * @param bool|int $baseRevId the revision ID this edit was based off, if any
 	 * @param $user User the user doing the edit
 	 * @param $serialisation_format String: format for storing the content in the database
 	 *
@@ -1682,12 +1704,18 @@ class WikiPage implements Page, IDBAccessObject {
 
 		// Provide autosummaries if one is not provided and autosummaries are enabled.
 		if ( $wgUseAutomaticEditSummaries && $flags & EDIT_AUTOSUMMARY && $summary == '' ) {
-			if ( !$old_content ) $old_content = null;
+			if ( !$old_content ) {
+				$old_content = null;
+			}
 			$summary = $handler->getAutosummary( $old_content, $content, $flags );
 		}
 
 		$editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
 		$serialized = $editInfo->pst;
+
+		/**
+		 * @var Content $content
+		 */
 		$content = $editInfo->pstContent;
 		$newsize = $content->getSize();
 
@@ -1731,6 +1759,7 @@ class WikiPage implements Page, IDBAccessObject {
 
 			if ( $changed ) {
 				if ( !$content->isValid() ) {
+					wfProfileOut( __METHOD__ );
 					throw new MWException( "New content failed validity check!" );
 				}
 
@@ -1933,7 +1962,7 @@ class WikiPage implements Page, IDBAccessObject {
 		$options = $this->getContentHandler()->makeParserOptions( $context );
 
 		if ( $this->getTitle()->isConversionTable() ) {
-			//@todo: ConversionTable should become a separate content model, so we don't need special cases like this one.
+			// @todo ConversionTable should become a separate content model, so we don't need special cases like this one.
 			$options->disableContentConversion();
 		}
 
@@ -1956,16 +1985,18 @@ class WikiPage implements Page, IDBAccessObject {
 	 * Prepare content which is about to be saved.
 	 * Returns a stdclass with source, pst and output members
 	 *
-	 * @param \Content $content
-	 * @param null $revid
-	 * @param null|\User $user
-	 * @param null $serialization_format
+	 * @param Content $content
+	 * @param int|null $revid
+	 * @param User|null $user
+	 * @param string|null $serialization_format
 	 *
 	 * @return bool|object
 	 *
 	 * @since 1.21
 	 */
-	public function prepareContentForEdit( Content $content, $revid = null, User $user = null, $serialization_format = null ) {
+	public function prepareContentForEdit( Content $content, $revid = null, User $user = null,
+		$serialization_format = null
+	) {
 		global $wgContLang, $wgUser;
 		$user = is_null( $user ) ? $wgUser : $user;
 		//XXX: check $user->getId() here???
@@ -2030,7 +2061,8 @@ class WikiPage implements Page, IDBAccessObject {
 		$content = $revision->getContent();
 
 		// Parse the text
-		// Be careful not to double-PST: $text is usually already PST-ed once
+		// Be careful not to do pre-save transform twice: $text is usually
+		// already pre-save transformed once.
 		if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
 			wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
 			$editInfo = $this->prepareContentForEdit( $content, $revision->getId(), $user );
@@ -2047,7 +2079,9 @@ class WikiPage implements Page, IDBAccessObject {
 
 		// Update the links tables and other secondary data
 		if ( $content ) {
-			$updates = $content->getSecondaryDataUpdates( $this->getTitle(), null, true, $editInfo->output );
+			$recursive = $options['changed']; // bug 50785
+			$updates = $content->getSecondaryDataUpdates(
+				$this->getTitle(), null, $recursive, $editInfo->output );
 			DataUpdate::runUpdates( $updates );
 		}
 
@@ -2057,19 +2091,11 @@ class WikiPage implements Page, IDBAccessObject {
 			if ( 0 == mt_rand( 0, 99 ) ) {
 				// Flush old entries from the `recentchanges` table; we do this on
 				// random requests so as to avoid an increase in writes for no good reason
-				global $wgRCMaxAge;
-
-				$dbw = wfGetDB( DB_MASTER );
-				$cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
-				$dbw->delete(
-					'recentchanges',
-					array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ),
-					__METHOD__
-				);
+				RecentChange::purgeExpiredChanges();
 			}
 		}
 
-		if ( !$this->mTitle->exists() ) {
+		if ( !$this->exists() ) {
 			wfProfileOut( __METHOD__ );
 			return;
 		}
@@ -2093,8 +2119,7 @@ class WikiPage implements Page, IDBAccessObject {
 		}
 
 		DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, $good, $total ) );
-		DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content->getTextForSearchIndex() ) );
-		// @TODO: let the search engine decide what to do with the content object
+		DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) );
 
 		// If this is another user's talk page, update newtalk.
 		// Don't do this if $options['changed'] = false (null-edits) nor if
@@ -2104,17 +2129,20 @@ class WikiPage implements Page, IDBAccessObject {
 			&& $shortTitle != $user->getTitleKey()
 			&& !( $revision->isMinor() && $user->isAllowed( 'nominornewtalk' ) )
 		) {
-			if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this ) ) ) {
-				$other = User::newFromName( $shortTitle, false );
-				if ( !$other ) {
-					wfDebug( __METHOD__ . ": invalid username\n" );
-				} elseif ( User::isIP( $shortTitle ) ) {
-					// An anonymous user
-					$other->setNewtalk( true, $revision );
-				} elseif ( $other->isLoggedIn() ) {
-					$other->setNewtalk( true, $revision );
-				} else {
-					wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
+			$recipient = User::newFromName( $shortTitle, false );
+			if ( !$recipient ) {
+				wfDebug( __METHOD__ . ": invalid username\n" );
+			} else {
+				// Allow extensions to prevent user notification when a new message is added to their talk page
+				if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this, $recipient ) ) ) {
+					if ( User::isIP( $shortTitle ) ) {
+						// An anonymous user
+						$recipient->setNewtalk( true, $revision );
+					} elseif ( $recipient->isLoggedIn() ) {
+						$recipient->setNewtalk( true, $revision );
+					} else {
+						wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
+					}
 				}
 			}
 		}
@@ -2122,12 +2150,14 @@ class WikiPage implements Page, IDBAccessObject {
 		if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
 			// XXX: could skip pseudo-messages like js/css here, based on content model.
 			$msgtext = $content ? $content->getWikitextForTransclusion() : null;
-			if ( $msgtext === false || $msgtext === null ) $msgtext = '';
+			if ( $msgtext === false || $msgtext === null ) {
+				$msgtext = '';
+			}
 
 			MessageCache::singleton()->replace( $shortTitle, $msgtext );
 		}
 
-		if( $options['created'] ) {
+		if ( $options['created'] ) {
 			self::onArticleCreate( $this->mTitle );
 		} else {
 			self::onArticleEdit( $this->mTitle );
@@ -2152,7 +2182,7 @@ class WikiPage implements Page, IDBAccessObject {
 		ContentHandler::deprecated( __METHOD__, "1.21" );
 
 		$content = ContentHandler::makeContent( $text, $this->getTitle() );
-		return $this->doQuickEditContent( $content, $user, $comment, $minor );
+		$this->doQuickEditContent( $content, $user, $comment, $minor );
 	}
 
 	/**
@@ -2160,13 +2190,15 @@ class WikiPage implements Page, IDBAccessObject {
 	 * The article must already exist; link tables etc
 	 * are not updated, caches are not flushed.
 	 *
-	 * @param $content Content: content submitted
-	 * @param $user User The relevant user
+	 * @param Content $content Content submitted
+	 * @param User $user The relevant user
 	 * @param string $comment comment submitted
-	 * @param $serialisation_format String: format for storing the content in the database
-	 * @param $minor Boolean: whereas it's a minor modification
+	 * @param string $serialisation_format Format for storing the content in the database
+	 * @param bool $minor Whereas it's a minor modification
 	 */
-	public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = 0, $serialisation_format = null ) {
+	public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = false,
+		$serialisation_format = null
+	) {
 		wfProfileIn( __METHOD__ );
 
 		$serialized = $content->serialize( $serialisation_format );
@@ -2193,14 +2225,14 @@ class WikiPage implements Page, IDBAccessObject {
 	 * This works for protection both existing and non-existing pages.
 	 *
 	 * @param array $limit set of restriction keys
-	 * @param $reason String
-	 * @param &$cascade Integer. Set to false if cascading protection isn't allowed.
 	 * @param array $expiry per restriction type expiration
-	 * @param $user User The user updating the restrictions
+	 * @param int &$cascade Set to false if cascading protection isn't allowed.
+	 * @param string $reason
+	 * @param User $user The user updating the restrictions
 	 * @return Status
 	 */
 	public function doUpdateRestrictions( array $limit, array $expiry, &$cascade, $reason, User $user ) {
-		global $wgContLang;
+		global $wgCascadingRestrictionLevels;
 
 		if ( wfReadOnly() ) {
 			return Status::newFatal( 'readonlytext', wfReadOnlyReason() );
@@ -2208,7 +2240,7 @@ class WikiPage implements Page, IDBAccessObject {
 
 		$restrictionTypes = $this->mTitle->getRestrictionTypes();
 
-		$id = $this->mTitle->getArticleID();
+		$id = $this->getId();
 
 		if ( !$cascade ) {
 			$cascade = false;
@@ -2273,65 +2305,40 @@ class WikiPage implements Page, IDBAccessObject {
 			$logAction = 'protect';
 		}
 
-		$encodedExpiry = array();
-		$protectDescription = '';
-		# Some bots may parse IRC lines, which are generated from log entries which contain plain
-		# protect description text. Keep them in old format to avoid breaking compatibility.
-		# TODO: Fix protection log to store structured description and format it on-the-fly.
-		$protectDescriptionLog = '';
-		foreach ( $limit as $action => $restrictions ) {
-			$encodedExpiry[$action] = $dbw->encodeExpiry( $expiry[$action] );
-			if ( $restrictions != '' ) {
-				$protectDescriptionLog .= $wgContLang->getDirMark() . "[$action=$restrictions] (";
-				# $action is one of $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' ).
-				# All possible message keys are listed here for easier grepping:
-				# * restriction-create
-				# * restriction-edit
-				# * restriction-move
-				# * restriction-upload
-				$actionText = wfMessage( 'restriction-' . $action )->inContentLanguage()->text();
-				# $restrictions is one of $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' ),
-				# with '' filtered out. All possible message keys are listed below:
-				# * protect-level-autoconfirmed
-				# * protect-level-sysop
-				$restrictionsText = wfMessage( 'protect-level-' . $restrictions )->inContentLanguage()->text();
-				if ( $encodedExpiry[$action] != 'infinity' ) {
-					$expiryText = wfMessage(
-						'protect-expiring',
-						$wgContLang->timeanddate( $expiry[$action], false, false ),
-						$wgContLang->date( $expiry[$action], false, false ),
-						$wgContLang->time( $expiry[$action], false, false )
-					)->inContentLanguage()->text();
-				} else {
-					$expiryText = wfMessage( 'protect-expiry-indefinite' )
-						->inContentLanguage()->text();
-				}
-
-				if ( $protectDescription !== '' ) {
-					$protectDescription .= wfMessage( 'word-separator' )->inContentLanguage()->text();
-				}
-				$protectDescription .= wfMessage( 'protect-summary-desc' )
-					->params( $actionText, $restrictionsText, $expiryText )
-					->inContentLanguage()->text();
-				$protectDescriptionLog .= $expiryText . ') ';
-			}
-		}
-		$protectDescriptionLog = trim( $protectDescriptionLog );
-
 		if ( $id ) { // Protection of existing page
 			if ( !wfRunHooks( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
 				return Status::newGood();
 			}
 
-			// Only restrictions with the 'protect' right can cascade...
-			// Otherwise, people who cannot normally protect can "protect" pages via transclusion
+			// Only certain restrictions can cascade...
 			$editrestriction = isset( $limit['edit'] ) ? array( $limit['edit'] ) : $this->mTitle->getRestrictions( 'edit' );
+			foreach ( array_keys( $editrestriction, 'sysop' ) as $key ) {
+				$editrestriction[$key] = 'editprotected'; // backwards compatibility
+			}
+			foreach ( array_keys( $editrestriction, 'autoconfirmed' ) as $key ) {
+				$editrestriction[$key] = 'editsemiprotected'; // backwards compatibility
+			}
+
+			$cascadingRestrictionLevels = $wgCascadingRestrictionLevels;
+			foreach ( array_keys( $cascadingRestrictionLevels, 'sysop' ) as $key ) {
+				$cascadingRestrictionLevels[$key] = 'editprotected'; // backwards compatibility
+			}
+			foreach ( array_keys( $cascadingRestrictionLevels, 'autoconfirmed' ) as $key ) {
+				$cascadingRestrictionLevels[$key] = 'editsemiprotected'; // backwards compatibility
+			}
 
 			// The schema allows multiple restrictions
-			if ( !in_array( 'protect', $editrestriction ) && !in_array( 'sysop', $editrestriction ) ) {
+			if ( !array_intersect( $editrestriction, $cascadingRestrictionLevels ) ) {
 				$cascade = false;
 			}
 
+			// insert null revision to identify the page protection change as edit summary
+			$latest = $this->getLatest();
+			$nullRevision = $this->insertProtectNullRevision( $revCommentMsg, $limit, $expiry, $cascade, $reason );
+			if ( $nullRevision === null ) {
+				return Status::newFatal( 'no-null-revision', $this->mTitle->getPrefixedText() );
+			}
+
 			// Update restrictions table
 			foreach ( $limit as $action => $restrictions ) {
 				if ( $restrictions != '' ) {
@@ -2340,7 +2347,7 @@ class WikiPage implements Page, IDBAccessObject {
 							'pr_type' => $action,
 							'pr_level' => $restrictions,
 							'pr_cascade' => ( $cascade && $action == 'edit' ) ? 1 : 0,
-							'pr_expiry' => $encodedExpiry[$action]
+							'pr_expiry' => $dbw->encodeExpiry( $expiry[$action] )
 						),
 						__METHOD__
 					);
@@ -2350,41 +2357,12 @@ class WikiPage implements Page, IDBAccessObject {
 				}
 			}
 
-			// Prepare a null revision to be added to the history
-			$editComment = $wgContLang->ucfirst(
-				wfMessage(
-					$revCommentMsg,
-					$this->mTitle->getPrefixedText()
-				)->inContentLanguage()->text()
-			);
-			if ( $reason ) {
-				$editComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
-			}
-			if ( $protectDescription ) {
-				$editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
-				$editComment .= wfMessage( 'parentheses' )->params( $protectDescription )->inContentLanguage()->text();
-			}
-			if ( $cascade ) {
-				$editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
-				$editComment .= wfMessage( 'brackets' )->params(
-					wfMessage( 'protect-summary-cascade' )->inContentLanguage()->text()
-				)->inContentLanguage()->text();
-			}
-
-			// Insert a null revision
-			$nullRevision = Revision::newNullRevision( $dbw, $id, $editComment, true );
-			$nullRevId = $nullRevision->insertOn( $dbw );
-
-			$latest = $this->getLatest();
-			// Update page record
-			$dbw->update( 'page',
-				array( /* SET */
-					'page_touched' => $dbw->timestamp(),
-					'page_restrictions' => '',
-					'page_latest' => $nullRevId
-				), array( /* WHERE */
-					'page_id' => $id
-				), __METHOD__
+			// Clear out legacy restriction fields
+			$dbw->update(
+				'page',
+				array( 'page_restrictions' => '' ),
+				array( 'page_id' => $id ),
+				__METHOD__
 			);
 
 			wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $nullRevision, $latest, $user ) );
@@ -2401,7 +2379,7 @@ class WikiPage implements Page, IDBAccessObject {
 						'pt_title' => $this->mTitle->getDBkey(),
 						'pt_create_perm' => $limit['create'],
 						'pt_timestamp' => $dbw->encodeExpiry( wfTimestampNow() ),
-						'pt_expiry' => $encodedExpiry['create'],
+						'pt_expiry' => $dbw->encodeExpiry( $expiry['create'] ),
 						'pt_user' => $user->getId(),
 						'pt_reason' => $reason,
 					), __METHOD__
@@ -2417,20 +2395,153 @@ class WikiPage implements Page, IDBAccessObject {
 		}
 
 		$this->mTitle->flushRestrictions();
+		InfoAction::invalidateCache( $this->mTitle );
 
 		if ( $logAction == 'unprotect' ) {
-			$logParams = array();
+			$params = array();
 		} else {
-			$logParams = array( $protectDescriptionLog, $cascade ? 'cascade' : '' );
+			$protectDescriptionLog = $this->protectDescriptionLog( $limit, $expiry );
+			$params = array( $protectDescriptionLog, $cascade ? 'cascade' : '' );
 		}
 
 		// Update the protection log
 		$log = new LogPage( 'protect' );
-		$log->addEntry( $logAction, $this->mTitle, trim( $reason ), $logParams, $user );
+		$log->addEntry( $logAction, $this->mTitle, trim( $reason ), $params, $user );
 
 		return Status::newGood();
 	}
 
+	/**
+	 * Insert a new null revision for this page.
+	 *
+	 * @param string $revCommentMsg comment message key for the revision
+	 * @param array $limit set of restriction keys
+	 * @param array $expiry per restriction type expiration
+	 * @param int $cascade Set to false if cascading protection isn't allowed.
+	 * @param string $reason
+	 * @return Revision|null on error
+	 */
+	public function insertProtectNullRevision( $revCommentMsg, array $limit, array $expiry, $cascade, $reason ) {
+		global $wgContLang;
+		$dbw = wfGetDB( DB_MASTER );
+
+		// Prepare a null revision to be added to the history
+		$editComment = $wgContLang->ucfirst(
+			wfMessage(
+				$revCommentMsg,
+				$this->mTitle->getPrefixedText()
+			)->inContentLanguage()->text()
+		);
+		if ( $reason ) {
+			$editComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
+		}
+		$protectDescription = $this->protectDescription( $limit, $expiry );
+		if ( $protectDescription ) {
+			$editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+			$editComment .= wfMessage( 'parentheses' )->params( $protectDescription )->inContentLanguage()->text();
+		}
+		if ( $cascade ) {
+			$editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+			$editComment .= wfMessage( 'brackets' )->params(
+				wfMessage( 'protect-summary-cascade' )->inContentLanguage()->text()
+			)->inContentLanguage()->text();
+		}
+
+		$nullRev = Revision::newNullRevision( $dbw, $this->getId(), $editComment, true );
+		if ( $nullRev ) {
+			$nullRev->insertOn( $dbw );
+
+			// Update page record and touch page
+			$oldLatest = $nullRev->getParentId();
+			$this->updateRevisionOn( $dbw, $nullRev, $oldLatest );
+		}
+
+		return $nullRev;
+	}
+
+	/**
+	 * @param string $expiry 14-char timestamp or "infinity", or false if the input was invalid
+	 * @return string
+	 */
+	protected function formatExpiry( $expiry ) {
+		global $wgContLang;
+		$dbr = wfGetDB( DB_SLAVE );
+
+		$encodedExpiry = $dbr->encodeExpiry( $expiry );
+		if ( $encodedExpiry != 'infinity' ) {
+			return wfMessage(
+				'protect-expiring',
+				$wgContLang->timeanddate( $expiry, false, false ),
+				$wgContLang->date( $expiry, false, false ),
+				$wgContLang->time( $expiry, false, false )
+			)->inContentLanguage()->text();
+		} else {
+			return wfMessage( 'protect-expiry-indefinite' )
+				->inContentLanguage()->text();
+		}
+	}
+
+	/**
+	 * Builds the description to serve as comment for the edit.
+	 *
+	 * @param array $limit set of restriction keys
+	 * @param array $expiry per restriction type expiration
+	 * @return string
+	 */
+	public function protectDescription( array $limit, array $expiry ) {
+		$protectDescription = '';
+
+		foreach ( array_filter( $limit ) as $action => $restrictions ) {
+			# $action is one of $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' ).
+			# All possible message keys are listed here for easier grepping:
+			# * restriction-create
+			# * restriction-edit
+			# * restriction-move
+			# * restriction-upload
+			$actionText = wfMessage( 'restriction-' . $action )->inContentLanguage()->text();
+			# $restrictions is one of $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' ),
+			# with '' filtered out. All possible message keys are listed below:
+			# * protect-level-autoconfirmed
+			# * protect-level-sysop
+			$restrictionsText = wfMessage( 'protect-level-' . $restrictions )->inContentLanguage()->text();
+
+			$expiryText = $this->formatExpiry( $expiry[$action] );
+
+			if ( $protectDescription !== '' ) {
+				$protectDescription .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+			}
+			$protectDescription .= wfMessage( 'protect-summary-desc' )
+				->params( $actionText, $restrictionsText, $expiryText )
+				->inContentLanguage()->text();
+		}
+
+		return $protectDescription;
+	}
+
+	/**
+	 * Builds the description to serve as comment for the log entry.
+	 *
+	 * Some bots may parse IRC lines, which are generated from log entries which contain plain
+	 * protect description text. Keep them in old format to avoid breaking compatibility.
+	 * TODO: Fix protection log to store structured description and format it on-the-fly.
+	 *
+	 * @param array $limit set of restriction keys
+	 * @param array $expiry per restriction type expiration
+	 * @return string
+	 */
+	public function protectDescriptionLog( array $limit, array $expiry ) {
+		global $wgContLang;
+
+		$protectDescriptionLog = '';
+
+		foreach ( array_filter( $limit ) as $action => $restrictions ) {
+			$expiryText = $this->formatExpiry( $expiry[$action] );
+			$protectDescriptionLog .= $wgContLang->getDirMark() . "[$action=$restrictions] ($expiryText)";
+		}
+
+		return trim( $protectDescriptionLog );
+	}
+
 	/**
 	 * Take an array of page restrictions and flatten it to a string
 	 * suitable for insertion into the page_restrictions field.
@@ -2446,10 +2557,8 @@ class WikiPage implements Page, IDBAccessObject {
 		$bits = array();
 		ksort( $limit );
 
-		foreach ( $limit as $action => $restrictions ) {
-			if ( $restrictions != '' ) {
-				$bits[] = "$action=$restrictions";
-			}
+		foreach ( array_filter( $limit ) as $action => $restrictions ) {
+			$bits[] = "$action=$restrictions";
 		}
 
 		return implode( ':', $bits );
@@ -2575,8 +2684,8 @@ class WikiPage implements Page, IDBAccessObject {
 		);
 
 		if ( $wgContentHandlerUseDB ) {
-			$row[ 'ar_content_model' ] = 'rev_content_model';
-			$row[ 'ar_content_format' ] = 'rev_content_format';
+			$row['ar_content_model'] = 'rev_content_model';
+			$row['ar_content_format'] = 'rev_content_format';
 		}
 
 		$dbw->insertSelect( 'archive', array( 'page', 'revision' ),
@@ -2589,7 +2698,7 @@ class WikiPage implements Page, IDBAccessObject {
 
 		// Now that it's safely backed up, delete it
 		$dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
-		$ok = ( $dbw->affectedRows() > 0 ); // getArticleID() uses slave, could be laggy
+		$ok = ( $dbw->affectedRows() > 0 ); // $id could be laggy
 
 		if ( !$ok ) {
 			$dbw->rollback( __METHOD__ );
@@ -2597,6 +2706,10 @@ class WikiPage implements Page, IDBAccessObject {
 			return $status;
 		}
 
+		if ( !$dbw->cascadingDeletes() ) {
+			$dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
+		}
+
 		$this->doDeleteUpdates( $id, $content );
 
 		// Log the deletion, if the page was suppressed, log it at Oversight instead
@@ -2621,7 +2734,7 @@ class WikiPage implements Page, IDBAccessObject {
 	/**
 	 * Do some database updates after deletion
 	 *
-	 * @param int $id page_id value of the page being deleted (B/C, currently unused)
+	 * @param int $id page_id value of the page being deleted
 	 * @param $content Content: optional page content to be used when determining the required updates.
 	 *        This may be needed because $this->getContent() may already return null when the page proper was deleted.
 	 */
@@ -2636,11 +2749,11 @@ class WikiPage implements Page, IDBAccessObject {
 		// Clear caches
 		WikiPage::onArticleDelete( $this->mTitle );
 
-		// Reset this object
-		$this->clear();
+		// Reset this object and the Title object
+		$this->loadFromRow( false, self::READ_LATEST );
 
-		// Clear the cached article id so the interface doesn't act like we exist
-		$this->mTitle->resetArticleID( 0 );
+		// Search engine
+		DeferredUpdates::addUpdate( new SearchUpdate( $id, $this->mTitle ) );
 	}
 
 	/**
@@ -2650,7 +2763,7 @@ class WikiPage implements Page, IDBAccessObject {
 	 * performs permissions checks on $user, then calls commitRollback()
 	 * to do the dirty work
 	 *
-	 * @todo: separate the business/permission stuff out from backend code
+	 * @todo Separate the business/permission stuff out from backend code
 	 *
 	 * @param string $fromP Name of the user whose edits to rollback.
 	 * @param string $summary Custom summary. Set to default summary if empty.
@@ -2794,7 +2907,7 @@ class WikiPage implements Page, IDBAccessObject {
 			$wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
 			$current->getId(), $wgContLang->timeanddate( $current->getTimestamp() )
 		);
-		if( $summary instanceof Message ) {
+		if ( $summary instanceof Message ) {
 			$summary = $summary->params( $args )->inContentLanguage()->text();
 		} else {
 			$summary = wfMsgReplaceArgs( $summary, $args );
@@ -2835,8 +2948,8 @@ class WikiPage implements Page, IDBAccessObject {
 		$resultDetails = array(
 			'summary' => $summary,
 			'current' => $current,
-			'target'  => $target,
-			'newid'   => $revId
+			'target' => $target,
+			'newid' => $revId
 		);
 
 		return array();
@@ -2890,6 +3003,7 @@ class WikiPage implements Page, IDBAccessObject {
 
 		// File cache
 		HTMLFileCache::clearFileCache( $title );
+		InfoAction::invalidateCache( $title );
 
 		// Messages
 		if ( $title->getNamespace() == NS_MEDIAWIKI ) {
@@ -2918,7 +3032,7 @@ class WikiPage implements Page, IDBAccessObject {
 	 * Purge caches on page update etc
 	 *
 	 * @param $title Title object
-	 * @todo:  verify that $title is always a Title object (and never false or null), add Title hint to parameter $title
+	 * @todo Verify that $title is always a Title object (and never false or null), add Title hint to parameter $title
 	 */
 	public static function onArticleEdit( $title ) {
 		// Invalidate caches of articles which include this page
@@ -2932,10 +3046,34 @@ class WikiPage implements Page, IDBAccessObject {
 
 		// Clear file cache for this page only
 		HTMLFileCache::clearFileCache( $title );
+		InfoAction::invalidateCache( $title );
 	}
 
 	/**#@-*/
 
+	/**
+	 * Returns a list of categories this page is a member of.
+	 * Results will include hidden categories
+	 *
+	 * @return TitleArray
+	 */
+	public function getCategories() {
+		$id = $this->getId();
+		if ( $id == 0 ) {
+			return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
+		}
+
+		$dbr = wfGetDB( DB_SLAVE );
+		$res = $dbr->select( 'categorylinks',
+			array( 'cl_to AS page_title, ' . NS_CATEGORY . ' AS page_namespace' ),
+			// Have to do that since DatabaseBase::fieldNamesWithAlias treats numeric indexes
+			// as not being aliases, and NS_CATEGORY is numeric
+			array( 'cl_from' => $id ),
+			__METHOD__ );
+
+		return TitleArray::newFromResult( $res );
+	}
+
 	/**
 	 * Returns a list of hidden categories this page is a member of.
 	 * Uses the page_props and categorylinks tables.
@@ -2944,7 +3082,7 @@ class WikiPage implements Page, IDBAccessObject {
 	 */
 	public function getHiddenCategories() {
 		$result = array();
-		$id = $this->mTitle->getArticleID();
+		$id = $this->getId();
 
 		if ( $id == 0 ) {
 			return array();
@@ -3005,69 +3143,65 @@ class WikiPage implements Page, IDBAccessObject {
 	 * @param array $added   The names of categories that were added
 	 * @param array $deleted The names of categories that were deleted
 	 */
-	public function updateCategoryCounts( $added, $deleted ) {
-		$ns = $this->mTitle->getNamespace();
+	public function updateCategoryCounts( array $added, array $deleted ) {
+		$that = $this;
+		$method = __METHOD__;
 		$dbw = wfGetDB( DB_MASTER );
 
-		// First make sure the rows exist.  If one of the "deleted" ones didn't
-		// exist, we might legitimately not create it, but it's simpler to just
-		// create it and then give it a negative value, since the value is bogus
-		// anyway.
-		//
-		// Sometimes I wish we had INSERT ... ON DUPLICATE KEY UPDATE.
-		$insertCats = array_merge( $added, $deleted );
-		if ( !$insertCats ) {
-			// Okay, nothing to do
-			return;
-		}
-
-		$insertRows = array();
-
-		foreach ( $insertCats as $cat ) {
-			$insertRows[] = array(
-				'cat_id' => $dbw->nextSequenceValue( 'category_cat_id_seq' ),
-				'cat_title' => $cat
-			);
-		}
-		$dbw->insert( 'category', $insertRows, __METHOD__, 'IGNORE' );
-
-		$addFields = array( 'cat_pages = cat_pages + 1' );
-		$removeFields = array( 'cat_pages = cat_pages - 1' );
+		// Do this at the end of the commit to reduce lock wait timeouts
+		$dbw->onTransactionPreCommitOrIdle(
+			function() use ( $dbw, $that, $method, $added, $deleted ) {
+				$ns = $that->getTitle()->getNamespace();
+
+				$addFields = array( 'cat_pages = cat_pages + 1' );
+				$removeFields = array( 'cat_pages = cat_pages - 1' );
+				if ( $ns == NS_CATEGORY ) {
+					$addFields[] = 'cat_subcats = cat_subcats + 1';
+					$removeFields[] = 'cat_subcats = cat_subcats - 1';
+				} elseif ( $ns == NS_FILE ) {
+					$addFields[] = 'cat_files = cat_files + 1';
+					$removeFields[] = 'cat_files = cat_files - 1';
+				}
 
-		if ( $ns == NS_CATEGORY ) {
-			$addFields[] = 'cat_subcats = cat_subcats + 1';
-			$removeFields[] = 'cat_subcats = cat_subcats - 1';
-		} elseif ( $ns == NS_FILE ) {
-			$addFields[] = 'cat_files = cat_files + 1';
-			$removeFields[] = 'cat_files = cat_files - 1';
-		}
+				if ( count( $added ) ) {
+					$insertRows = array();
+					foreach ( $added as $cat ) {
+						$insertRows[] = array(
+							'cat_title'   => $cat,
+							'cat_pages'   => 1,
+							'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
+							'cat_files'   => ( $ns == NS_FILE ) ? 1 : 0,
+						);
+					}
+					$dbw->upsert(
+						'category',
+						$insertRows,
+						array( 'cat_title' ),
+						$addFields,
+						$method
+					);
+				}
 
-		if ( $added ) {
-			$dbw->update(
-				'category',
-				$addFields,
-				array( 'cat_title' => $added ),
-				__METHOD__
-			);
-		}
+				if ( count( $deleted ) ) {
+					$dbw->update(
+						'category',
+						$removeFields,
+						array( 'cat_title' => $deleted ),
+						$method
+					);
+				}
 
-		if ( $deleted ) {
-			$dbw->update(
-				'category',
-				$removeFields,
-				array( 'cat_title' => $deleted ),
-				__METHOD__
-			);
-		}
+				foreach ( $added as $catName ) {
+					$cat = Category::newFromName( $catName );
+					wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $that ) );
+				}
 
-		foreach( $added as $catName ) {
-			$cat = Category::newFromName( $catName );
-			wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $this ) );
-		}
-		foreach( $deleted as $catName ) {
-			$cat = Category::newFromName( $catName );
-			wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $this ) );
-		}
+				foreach ( $deleted as $catName ) {
+					$cat = Category::newFromName( $catName );
+					wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $that ) );
+				}
+			}
+		);
 	}
 
 	/**
@@ -3088,7 +3222,7 @@ class WikiPage implements Page, IDBAccessObject {
 		// are visible.
 
 		// Get templates from templatelinks
-		$id = $this->mTitle->getArticleID();
+		$id = $this->getId();
 
 		$tlTemplates = array();
 
@@ -3233,7 +3367,7 @@ class WikiPage implements Page, IDBAccessObject {
 	public function viewUpdates() {
 		wfDeprecated( __METHOD__, '1.18' );
 		global $wgUser;
-		return $this->doViewUpdates( $wgUser );
+		$this->doViewUpdates( $wgUser );
 	}
 
 	/**
@@ -3318,7 +3452,7 @@ class PoolWorkArticleView extends PoolCounterWork {
 	/**
 	 * Constructor
 	 *
-	 * @param $page Page
+	 * @param $page Page|WikiPage
 	 * @param $revid Integer: ID of the revision being parsed
 	 * @param $useParserCache Boolean: whether to use the parser cache
 	 * @param $parserOptions parserOptions to use for the parse operation
@@ -3373,7 +3507,7 @@ class PoolWorkArticleView extends PoolCounterWork {
 	function doWork() {
 		global $wgUseFileCache;
 
-		// @todo: several of the methods called on $this->page are not declared in Page, but present
+		// @todo several of the methods called on $this->page are not declared in Page, but present
 		//        in WikiPage and delegated by Article.
 
 		$isCurrent = $this->revid === $this->page->getLatest();
@@ -3398,6 +3532,9 @@ class PoolWorkArticleView extends PoolCounterWork {
 			return false;
 		}
 
+		// Reduce effects of race conditions for slow parses (bug 46014)
+		$cacheTime = wfTimestampNow();
+
 		$time = - microtime( true );
 		$this->parserOutput = $content->getParserOutput( $this->page->getTitle(), $this->revid, $this->parserOptions );
 		$time += microtime( true );
@@ -3409,7 +3546,8 @@ class PoolWorkArticleView extends PoolCounterWork {
 		}
 
 		if ( $this->cacheable && $this->parserOutput->isCacheable() ) {
-			ParserCache::singleton()->save( $this->parserOutput, $this->page, $this->parserOptions );
+			ParserCache::singleton()->save(
+				$this->parserOutput, $this->page, $this->parserOptions, $cacheTime );
 		}
 
 		// Make sure file cache is not used on uncacheable content.
diff --git a/includes/Xml.php b/includes/Xml.php
index 57a4fcf6..ac0539d1 100644
--- a/includes/Xml.php
+++ b/includes/Xml.php
@@ -38,13 +38,13 @@ class Xml {
 	 */
 	public static function element( $element, $attribs = null, $contents = '', $allowShortTag = true ) {
 		$out = '<' . $element;
-		if( !is_null( $attribs ) ) {
+		if ( !is_null( $attribs ) ) {
 			$out .= self::expandAttributes( $attribs );
 		}
-		if( is_null( $contents ) ) {
+		if ( is_null( $contents ) ) {
 			$out .= '>';
 		} else {
-			if( $allowShortTag && $contents === '' ) {
+			if ( $allowShortTag && $contents === '' ) {
 				$out .= ' />';
 			} else {
 				$out .= '>' . htmlspecialchars( $contents ) . "</$element>";
@@ -64,10 +64,10 @@ class Xml {
 	 */
 	public static function expandAttributes( $attribs ) {
 		$out = '';
-		if( is_null( $attribs ) ) {
+		if ( is_null( $attribs ) ) {
 			return null;
-		} elseif( is_array( $attribs ) ) {
-			foreach( $attribs as $name => $val ) {
+		} elseif ( is_array( $attribs ) ) {
+			foreach ( $attribs as $name => $val ) {
 				$out .= " {$name}=\"" . Sanitizer::encodeAttribute( $val ) . '"';
 			}
 			return $out;
@@ -88,10 +88,10 @@ class Xml {
 	 */
 	public static function elementClean( $element, $attribs = array(), $contents = '' ) {
 		global $wgContLang;
-		if( $attribs ) {
+		if ( $attribs ) {
 			$attribs = array_map( array( 'UtfNormal', 'cleanUp' ), $attribs );
 		}
-		if( $contents ) {
+		if ( $contents ) {
 			wfProfileIn( __METHOD__ . '-norm' );
 			$contents = $wgContLang->normalize( $contents );
 			wfProfileOut( __METHOD__ . '-norm' );
@@ -115,7 +115,9 @@ class Xml {
 	 * @param string $element element name
 	 * @return string
 	 */
-	public static function closeElement( $element ) { return "</$element>"; }
+	public static function closeElement( $element ) {
+		return "</$element>";
+	}
 
 	/**
 	 * Same as Xml::element(), but does not escape contents. Handy when the
@@ -144,11 +146,11 @@ class Xml {
 		wfDeprecated( __METHOD__, '1.19' );
 		return Html::namespaceSelector( array(
 			'selected' => $selected,
-			'all'      => $all,
-			'label'    => $label,
+			'all' => $all,
+			'label' => $label,
 		), array(
-			'name'  => $element_name,
-			'id'    => 'namespace',
+			'name' => $element_name,
+			'id' => 'namespace',
 			'class' => 'namespaceselector',
 		) );
 	}
@@ -164,12 +166,15 @@ class Xml {
 	public static function monthSelector( $selected = '', $allmonths = null, $id = 'month' ) {
 		global $wgLang;
 		$options = array();
-		if( is_null( $selected ) )
+		if ( is_null( $selected ) ) {
 			$selected = '';
-		if( !is_null( $allmonths ) )
+		}
+		if ( !is_null( $allmonths ) ) {
 			$options[] = self::option( wfMessage( 'monthsall' )->text(), $allmonths, $selected === $allmonths );
-		for( $i = 1; $i < 13; $i++ )
+		}
+		for ( $i = 1; $i < 13; $i++ ) {
 			$options[] = self::option( $wgLang->getMonthName( $i ), $i, $selected === $i );
+		}
 		return self::openElement( 'select', array( 'id' => $id, 'name' => 'month', 'class' => 'mw-month-selector' ) )
 			. implode( "\n", $options )
 			. self::closeElement( 'select' );
@@ -182,17 +187,18 @@ class Xml {
 	 */
 	public static function dateMenu( $year, $month ) {
 		# Offset overrides year/month selection
-		if( $month && $month !== -1 ) {
+		if ( $month && $month !== -1 ) {
 			$encMonth = intval( $month );
 		} else {
 			$encMonth = '';
 		}
-		if( $year ) {
+		if ( $year ) {
 			$encYear = intval( $year );
-		} elseif( $encMonth ) {
-			$thisMonth = intval( gmdate( 'n' ) );
-			$thisYear = intval( gmdate( 'Y' ) );
-			if( intval( $encMonth ) > $thisMonth ) {
+		} elseif ( $encMonth ) {
+			$timestamp = MWTimestamp::getInstance();
+			$thisMonth = intval( $timestamp->format( 'n' ) );
+			$thisYear = intval( $timestamp->format( 'Y' ) );
+			if ( intval( $encMonth ) > $thisMonth ) {
 				$thisYear--;
 			}
 			$encYear = $thisYear;
@@ -200,9 +206,9 @@ class Xml {
 			$encYear = '';
 		}
 		$inputAttribs = array( 'id' => 'year', 'maxlength' => 4, 'size' => 7 );
-		return self::label( wfMessage( 'year' )->text(), 'year' ) . ' '.
-			Html::input( 'year', $encYear, 'number', $inputAttribs ) . ' '.
-			self::label( wfMessage( 'month' )->text(), 'month' ) . ' '.
+		return self::label( wfMessage( 'year' )->text(), 'year' ) . ' ' .
+			Html::input( 'year', $encYear, 'number', $inputAttribs ) . ' ' .
+			self::label( wfMessage( 'month' )->text(), 'month' ) . ' ' .
 			self::monthSelector( $encMonth, -1 );
 	}
 
@@ -224,7 +230,7 @@ class Xml {
 
 		// Make sure the site language is in the list;
 		// a custom language code might not have a defined name...
-		if( !array_key_exists( $wgLanguageCode, $languages ) ) {
+		if ( !array_key_exists( $wgLanguageCode, $languages ) ) {
 			$languages[$wgLanguageCode] = $wgLanguageCode;
 		}
 
@@ -237,14 +243,14 @@ class Xml {
 		 */
 		$selected = isset( $languages[$selected] ) ? $selected : $wgLanguageCode;
 		$options = "\n";
-		foreach( $languages as $code => $name ) {
-			$options .= Xml::option( "$code - $name", $code, ($code == $selected) ) . "\n";
+		foreach ( $languages as $code => $name ) {
+			$options .= Xml::option( "$code - $name", $code, $code == $selected ) . "\n";
 		}
 
 		$attrs = array( 'id' => 'wpUserLanguage', 'name' => 'wpUserLanguage' );
 		$attrs = array_merge( $attrs, $overrideAttrs );
 
-		if( $msg === null ) {
+		if ( $msg === null ) {
 			$msg = wfMessage( 'yourlanguage' );
 		}
 		return array(
@@ -288,11 +294,11 @@ class Xml {
 	public static function input( $name, $size = false, $value = false, $attribs = array() ) {
 		$attributes = array( 'name' => $name );
 
-		if( $size ) {
+		if ( $size ) {
 			$attributes['size'] = $size;
 		}
 
-		if( $value !== false ) { // maybe 0
+		if ( $value !== false ) { // maybe 0
 			$attributes['value'] = $value;
 		}
 
@@ -330,7 +336,7 @@ class Xml {
 	 * @param array $attribs other attributes
 	 * @return string HTML
 	 */
-	public static function check( $name, $checked = false, $attribs=array() ) {
+	public static function check( $name, $checked = false, $attribs = array() ) {
 		return self::element( 'input', array_merge(
 			array(
 				'name' => $name,
@@ -369,10 +375,10 @@ class Xml {
 		$a = array( 'for' => $id );
 
 		# FIXME avoid copy pasting below:
-		if( isset( $attribs['class'] ) ) {
+		if ( isset( $attribs['class'] ) ) {
 				$a['class'] = $attribs['class'];
 		}
-		if( isset( $attribs['title'] ) ) {
+		if ( isset( $attribs['title'] ) ) {
 				$a['title'] = $attribs['title'];
 		}
 
@@ -389,7 +395,7 @@ class Xml {
 	 * @param array $attribs other attributes
 	 * @return string HTML
 	 */
-	public static function inputLabel( $label, $name, $id, $size=false, $value=false, $attribs = array() ) {
+	public static function inputLabel( $label, $name, $id, $size = false, $value = false, $attribs = array() ) {
 		list( $label, $input ) = self::inputLabelSep( $label, $name, $id, $size, $value, $attribs );
 		return $label . '&#160;' . $input;
 	}
@@ -460,18 +466,18 @@ class Xml {
 
 	/**
 	 * Convenience function to build an HTML drop-down list item.
-	 * @param string $text text for this item
+	 * @param string $text text for this item. Will be HTML escaped
 	 * @param string $value form submission value; if empty, use text
 	 * @param $selected boolean: if true, will be the default selected item
 	 * @param array $attribs optional additional HTML attributes
 	 * @return string HTML
 	 */
-	public static function option( $text, $value=null, $selected = false,
+	public static function option( $text, $value = null, $selected = false,
 			$attribs = array() ) {
-		if( !is_null( $value ) ) {
+		if ( !is_null( $value ) ) {
 			$attribs['value'] = $value;
 		}
-		if( $selected ) {
+		if ( $selected ) {
 			$attribs['selected'] = 'selected';
 		}
 		return Html::element( 'option', $attribs, $text );
@@ -488,47 +494,53 @@ class Xml {
 	 * @param $tabindex Mixed: Value of the tabindex attribute
 	 * @return string
 	 */
-	public static function listDropDown( $name= '', $list = '', $other = '', $selected = '', $class = '', $tabindex = null ) {
+	public static function listDropDown( $name = '', $list = '', $other = '', $selected = '', $class = '', $tabindex = null ) {
 		$optgroup = false;
 
 		$options = self::option( $other, 'other', $selected === 'other' );
 
-		foreach ( explode( "\n", $list ) as $option) {
+		foreach ( explode( "\n", $list ) as $option ) {
 				$value = trim( $option );
 				if ( $value == '' ) {
 					continue;
-				} elseif ( substr( $value, 0, 1) == '*' && substr( $value, 1, 1) != '*' ) {
+				} elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
 					// A new group is starting ...
 					$value = trim( substr( $value, 1 ) );
-					if( $optgroup ) $options .= self::closeElement( 'optgroup' );
+					if ( $optgroup ) {
+						$options .= self::closeElement( 'optgroup' );
+					}
 					$options .= self::openElement( 'optgroup', array( 'label' => $value ) );
 					$optgroup = true;
-				} elseif ( substr( $value, 0, 2) == '**' ) {
+				} elseif ( substr( $value, 0, 2 ) == '**' ) {
 					// groupmember
 					$value = trim( substr( $value, 2 ) );
 					$options .= self::option( $value, $value, $selected === $value );
 				} else {
 					// groupless reason list
-					if( $optgroup ) $options .= self::closeElement( 'optgroup' );
+					if ( $optgroup ) {
+						$options .= self::closeElement( 'optgroup' );
+					}
 					$options .= self::option( $value, $value, $selected === $value );
 					$optgroup = false;
 				}
 			}
 
-			if( $optgroup ) $options .= self::closeElement( 'optgroup' );
+			if ( $optgroup ) {
+				$options .= self::closeElement( 'optgroup' );
+			}
 
 		$attribs = array();
 
-		if( $name ) {
+		if ( $name ) {
 			$attribs['id'] = $name;
 			$attribs['name'] = $name;
 		}
 
-		if( $class ) {
+		if ( $class ) {
 			$attribs['class'] = $class;
 		}
 
-		if( $tabindex ) {
+		if ( $tabindex ) {
 			$attribs['tabindex'] = $tabindex;
 		}
 
@@ -590,6 +602,7 @@ class Xml {
 	 * for JavaScript source code.
 	 * Illegal control characters are assumed not to be present.
 	 *
+	 * @deprecated since 1.21; use Xml::encodeJsVar() or Xml::encodeJsCall() instead
 	 * @param string $string to escape
 	 * @return String
 	 */
@@ -621,72 +634,46 @@ class Xml {
 	}
 
 	/**
-	 * Encode a variable of unknown type to JavaScript.
-	 * Arrays are converted to JS arrays, objects are converted to JS associative
-	 * arrays (objects). So cast your PHP associative arrays to objects before
-	 * passing them to here.
+	 * Encode a variable of arbitrary type to JavaScript.
+	 * If the value is an XmlJsCode object, pass through the object's value verbatim.
 	 *
-	 * @param $value
+	 * @note Only use this function for generating JavaScript code. If generating output
+	 *       for a proper JSON parser, just call FormatJson::encode() directly.
 	 *
-	 * @return string
+	 * @param mixed $value The value being encoded. Can be any type except a resource.
+	 * @param bool $pretty If true, add non-significant whitespace to improve readability.
+	 * @return string|bool: String if successful; false upon failure
 	 */
-	public static function encodeJsVar( $value ) {
-		if ( is_bool( $value ) ) {
-			$s = $value ? 'true' : 'false';
-		} elseif ( is_null( $value ) ) {
-			$s = 'null';
-		} elseif ( is_int( $value ) || is_float( $value ) ) {
-			$s = strval( $value );
-		} elseif ( is_array( $value ) && // Make sure it's not associative.
-					array_keys( $value ) === range( 0, count( $value ) - 1 ) ||
-					count( $value ) == 0
-				) {
-			$s = '[';
-			foreach ( $value as $elt ) {
-				if ( $s != '[' ) {
-					$s .= ',';
-				}
-				$s .= self::encodeJsVar( $elt );
-			}
-			$s .= ']';
-		} elseif ( $value instanceof XmlJsCode ) {
-			$s = $value->value;
-		} elseif ( is_object( $value ) || is_array( $value ) ) {
-			// Objects and associative arrays
-			$s = '{';
-			foreach ( (array)$value as $name => $elt ) {
-				if ( $s != '{' ) {
-					$s .= ',';
-				}
-
-				$s .= '"' . self::escapeJsString( $name ) . '":' .
-					self::encodeJsVar( $elt );
-			}
-			$s .= '}';
-		} else {
-			$s = '"' . self::escapeJsString( $value ) . '"';
+	public static function encodeJsVar( $value, $pretty = false ) {
+		if ( $value instanceof XmlJsCode ) {
+			return $value->value;
 		}
-		return $s;
+		return FormatJson::encode( $value, $pretty, FormatJson::UTF8_OK );
 	}
 
 	/**
 	 * Create a call to a JavaScript function. The supplied arguments will be
 	 * encoded using Xml::encodeJsVar().
 	 *
+	 * @since 1.17
 	 * @param string $name The name of the function to call, or a JavaScript expression
 	 *    which evaluates to a function object which is called.
-	 * @param array $args of arguments to pass to the function.
-	 *
-	 * @since 1.17
-	 *
-	 * @return string
+	 * @param array $args The arguments to pass to the function.
+	 * @param bool $pretty If true, add non-significant whitespace to improve readability.
+	 * @return string|bool: String if successful; false upon failure
 	 */
-	public static function encodeJsCall( $name, $args ) {
+	public static function encodeJsCall( $name, $args, $pretty = false ) {
 		foreach ( $args as &$arg ) {
-			$arg = Xml::encodeJsVar( $arg );
+			$arg = Xml::encodeJsVar( $arg, $pretty );
+			if ( $arg === false ) {
+				return false;
+			}
 		}
 
-		return "$name(" . implode( ', ', $args ) . ");\n";
+		return "$name(" . ( $pretty
+			? ( ' ' . implode( ', ', $args ) . ' ' )
+			: implode( ',', $args )
+		) . ");";
 	}
 
 	/**
@@ -704,7 +691,7 @@ class Xml {
 		# case folding violates XML standard, turn it off
 		xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
 
-		if( !xml_parse( $parser, $text, true ) ) {
+		if ( !xml_parse( $parser, $text, true ) ) {
 			//$err = xml_error_string( xml_get_error_code( $parser ) );
 			//$position = xml_get_current_byte_index( $parser );
 			//$fragment = $this->extractFragment( $html, $position );
@@ -753,26 +740,32 @@ class Xml {
 	/**
 	 * Generate a form (without the opening form element).
 	 * Output optionally includes a submit button.
-	 * @param array $fields Associative array, key is message corresponding to a description for the field (colon is in the message), value is appropriate input.
-	 * @param string $submitLabel A message containing a label for the submit button.
+	 * @param array $fields Associative array, key is the name of a message that contains a description for the field, value is an HTML string containing the appropriate input.
+	 * @param string $submitLabel The name of a message containing a label for the submit button.
+	 * @param array $submitAttribs The attributes to add to the submit button
 	 * @return string HTML form.
 	 */
-	public static function buildForm( $fields, $submitLabel = null ) {
+	public static function buildForm( $fields, $submitLabel = null, $submitAttribs = array() ) {
 		$form = '';
 		$form .= "<table><tbody>";
 
-		foreach( $fields as $labelmsg => $input ) {
+		foreach ( $fields as $labelmsg => $input ) {
 			$id = "mw-$labelmsg";
 			$form .= Xml::openElement( 'tr', array( 'id' => $id ) );
+
+			// TODO use a <label> here for accessibility purposes - will need
+			// to either not use a table to build the form, or find the ID of
+			// the input somehow.
+
 			$form .= Xml::tags( 'td', array( 'class' => 'mw-label' ), wfMessage( $labelmsg )->parse() );
 			$form .= Xml::openElement( 'td', array( 'class' => 'mw-input' ) ) . $input . Xml::closeElement( 'td' );
 			$form .= Xml::closeElement( 'tr' );
 		}
 
-		if( $submitLabel ) {
+		if ( $submitLabel ) {
 			$form .= Xml::openElement( 'tr' );
 			$form .= Xml::tags( 'td', array(), '' );
-			$form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) ) . Xml::submitButton( wfMessage( $submitLabel )->text() ) . Xml::closeElement( 'td' );
+			$form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) ) . Xml::submitButton( wfMessage( $submitLabel )->text(), $submitAttribs ) . Xml::closeElement( 'td' );
 			$form .= Xml::closeElement( 'tr' );
 		}
 
@@ -794,7 +787,7 @@ class Xml {
 		if ( is_array( $headers ) ) {
 			$s .= Xml::openElement( 'thead', $attribs );
 
-			foreach( $headers as $id => $header ) {
+			foreach ( $headers as $id => $header ) {
 				$attribs = array();
 
 				if ( is_string( $id ) ) {
@@ -806,7 +799,7 @@ class Xml {
 			$s .= Xml::closeElement( 'thead' );
 		}
 
-		foreach( $rows as $id => $row ) {
+		foreach ( $rows as $id => $row ) {
 			$attribs = array();
 
 			if ( is_string( $id ) ) {
@@ -830,8 +823,7 @@ class Xml {
 	public static function buildTableRow( $attribs, $cells ) {
 		$s = Xml::openElement( 'tr', $attribs );
 
-		foreach( $cells as $id => $cell ) {
-
+		foreach ( $cells as $id => $cell ) {
 			$attribs = array();
 
 			if ( is_string( $id ) ) {
@@ -899,7 +891,7 @@ class XmlSelect {
 	 */
 	public function addOption( $name, $value = false ) {
 		// Stab stab stab
-		$value = ($value !== false) ? $value : $name;
+		$value = $value !== false ? $value : $name;
 
 		$this->options[] = array( $name => $value );
 	}
@@ -927,7 +919,7 @@ class XmlSelect {
 	static function formatOptions( $options, $default = false ) {
 		$data = '';
 
-		foreach( $options as $label => $value ) {
+		foreach ( $options as $label => $value ) {
 			if ( is_array( $value ) ) {
 				$contents = self::formatOptions( $value, $default );
 				$data .= Html::rawElement( 'optgroup', array( 'label' => $label ), $contents ) . "\n";
@@ -963,6 +955,11 @@ class XmlSelect {
  *    Xml::encodeJsVar( new XmlJsCode( 'a + b' ) );
  *
  * Returns "a + b".
+ *
+ * @note As of 1.21, XmlJsCode objects cannot be nested inside objects or arrays. The sole
+ *       exception is the $args argument to Xml::encodeJsCall() because Xml::encodeJsVar() is
+ *       called for each individual element in that array.
+ *
  * @since 1.17
  */
 class XmlJsCode {
diff --git a/includes/XmlTypeCheck.php b/includes/XmlTypeCheck.php
index 2e184606..92ca7d80 100644
--- a/includes/XmlTypeCheck.php
+++ b/includes/XmlTypeCheck.php
@@ -40,16 +40,52 @@ class XmlTypeCheck {
 	public $rootElement = '';
 
 	/**
-	 * @param string $file filename
-	 * @param $filterCallback callable (optional)
+	 * @param string $input a filename or string containing the XML element
+	 * @param callable $filterCallback (optional)
 	 *        Function to call to do additional custom validity checks from the
 	 *        SAX element handler event. This gives you access to the element
 	 *        namespace, name, and attributes, but not to text contents.
 	 *        Filter should return 'true' to toggle on $this->filterMatch
+	 * @param boolean $isFile (optional) indicates if the first parameter is a
+	 *        filename (default, true) or if it is a string (false)
 	 */
-	function __construct( $file, $filterCallback=null ) {
+	function __construct( $input, $filterCallback = null, $isFile = true ) {
 		$this->filterCallback = $filterCallback;
-		$this->run( $file );
+		if ( $isFile ) {
+			$this->validateFromFile( $input );
+		} else {
+			$this->validateFromString( $input );
+		}
+	}
+
+	/**
+	 * Alternative constructor: from filename
+	 *
+	 * @param string $fname the filename of an XML document
+	 * @param callable $filterCallback (optional)
+	 *        Function to call to do additional custom validity checks from the
+	 *        SAX element handler event. This gives you access to the element
+	 *        namespace, name, and attributes, but not to text contents.
+	 *        Filter should return 'true' to toggle on $this->filterMatch
+	 * @return XmlTypeCheck
+	 */
+	public static function newFromFilename( $fname, $filterCallback = null ) {
+		return new self( $fname, $filterCallback, true );
+	}
+
+	/**
+	 * Alternative constructor: from string
+	 *
+	 * @param string $string a string containing an XML element
+	 * @param callable $filterCallback (optional)
+	 *        Function to call to do additional custom validity checks from the
+	 *        SAX element handler event. This gives you access to the element
+	 *        namespace, name, and attributes, but not to text contents.
+	 *        Filter should return 'true' to toggle on $this->filterMatch
+	 * @return XmlTypeCheck
+	 */
+	public static function newFromString( $string, $filterCallback = null ) {
+		return new self( $string, $filterCallback, false );
 	}
 
 	/**
@@ -62,15 +98,23 @@ class XmlTypeCheck {
 	}
 
 	/**
-	 * @param $fname
+	 * Get an XML parser with the root element handler.
+	 * @see XmlTypeCheck::rootElementOpen()
+	 * @return resource a resource handle for the XML parser
 	 */
-	private function run( $fname ) {
+	private function getParser() {
 		$parser = xml_parser_create_ns( 'UTF-8' );
-
 		// case folding violates XML standard, turn it off
 		xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
-
 		xml_set_element_handler( $parser, array( $this, 'rootElementOpen' ), false );
+		return $parser;
+	}
+
+	/**
+	 * @param string $fname the filename
+	 */
+	private function validateFromFile( $fname ) {
+		$parser = $this->getParser();
 
 		if ( file_exists( $fname ) ) {
 			$file = fopen( $fname, "rb" );
@@ -78,23 +122,37 @@ class XmlTypeCheck {
 				do {
 					$chunk = fread( $file, 32768 );
 					$ret = xml_parse( $parser, $chunk, feof( $file ) );
-					if( $ret == 0 ) {
-						// XML isn't well-formed!
+					if ( $ret == 0 ) {
+						$this->wellFormed = false;
 						fclose( $file );
 						xml_parser_free( $parser );
 						return;
 					}
-				} while( !feof( $file ) );
+				} while ( !feof( $file ) );
 
 				fclose( $file );
 			}
 		}
-
 		$this->wellFormed = true;
 
 		xml_parser_free( $parser );
 	}
 
+	/**
+	 *
+	 * @param string $string the XML-input-string to be checked.
+	 */
+	private function validateFromString( $string ) {
+		$parser = $this->getParser();
+		$ret = xml_parse( $parser, $string, true );
+		xml_parser_free( $parser );
+		if ( $ret == 0 ) {
+			$this->wellFormed = false;
+			return;
+		}
+		$this->wellFormed = true;
+	}
+
 	/**
 	 * @param $parser
 	 * @param $name
@@ -103,7 +161,7 @@ class XmlTypeCheck {
 	private function rootElementOpen( $parser, $name, $attribs ) {
 		$this->rootElement = $name;
 
-		if( is_callable( $this->filterCallback ) ) {
+		if ( is_callable( $this->filterCallback ) ) {
 			xml_set_element_handler( $parser, array( $this, 'elementOpen' ), false );
 			$this->elementOpen( $parser, $name, $attribs );
 		} else {
@@ -118,7 +176,7 @@ class XmlTypeCheck {
 	 * @param $attribs
 	 */
 	private function elementOpen( $parser, $name, $attribs ) {
-		if( call_user_func( $this->filterCallback, $name, $attribs ) ) {
+		if ( call_user_func( $this->filterCallback, $name, $attribs ) ) {
 			// Filter hit!
 			$this->filterMatch = true;
 		}
diff --git a/includes/ZhClient.php b/includes/ZhClient.php
index fd03ec45..c5955aec 100644
--- a/includes/ZhClient.php
+++ b/includes/ZhClient.php
@@ -81,14 +81,14 @@ class ZhClient {
 		$result = fgets( $this->mFP, 1024 );
 
 		list( $status, $len ) = explode( ' ', $result );
-		if( $status == 'ERROR' ) {
+		if ( $status == 'ERROR' ) {
 			// $len is actually the error code...
 			print "zhdaemon error $len<br />\n";
 			return false;
 		}
 		$bytesread = 0;
 		$data = '';
-		while( !feof( $this->mFP ) && $bytesread < $len ) {
+		while ( !feof( $this->mFP ) && $bytesread < $len ) {
 			$str = fread( $this->mFP, $len - $bytesread );
 			$bytesread += strlen( $str );
 			$data .= $str;
@@ -131,7 +131,7 @@ class ZhClient {
 		$info = explode( ';', $infoline );
 		$ret = array();
 		$i = 0;
-		foreach( $info as $variant ) {
+		foreach ( $info as $variant ) {
 			list( $code, $len ) = explode( ' ', $variant );
 			$ret[strtolower( $code )] = substr( $data, $i, $len );
 			$i += $len;
diff --git a/includes/ZipDirectoryReader.php b/includes/ZipDirectoryReader.php
index 646180d2..307efcea 100644
--- a/includes/ZipDirectoryReader.php
+++ b/includes/ZipDirectoryReader.php
@@ -162,7 +162,7 @@ class ZipDirectoryReader {
 					|| $this->eocdr['CD entries total'] == 0xffff )
 				{
 					$this->error( 'zip-unsupported', 'Central directory header indicates ZIP64, ' .
-						'but we are in legacy mode. Rejecting this upload is necessary to avoid '.
+						'but we are in legacy mode. Rejecting this upload is necessary to avoid ' .
 						'opening vulnerabilities on clients using OpenJDK 7 or later.' );
 				}
 
diff --git a/includes/actions/CreditsAction.php b/includes/actions/CreditsAction.php
index 4d3c41be..0a2bf306 100644
--- a/includes/actions/CreditsAction.php
+++ b/includes/actions/CreditsAction.php
@@ -79,17 +79,17 @@ class CreditsAction extends FormlessAction {
 
 	/**
 	 * Get the last author with the last modification time
-	 * @param $article Article object
+	 * @param Page $page
 	 * @return String HTML
 	 */
-	protected function getAuthor( Page $article ) {
-		$user = User::newFromName( $article->getUserText(), false );
+	protected function getAuthor( Page $page ) {
+		$user = User::newFromName( $page->getUserText(), false );
 
-		$timestamp = $article->getTimestamp();
+		$timestamp = $page->getTimestamp();
 		if ( $timestamp ) {
 			$lang = $this->getLanguage();
-			$d = $lang->date( $article->getTimestamp(), true );
-			$t = $lang->time( $article->getTimestamp(), true );
+			$d = $lang->date( $page->getTimestamp(), true );
+			$t = $lang->time( $page->getTimestamp(), true );
 		} else {
 			$d = '';
 			$t = '';
@@ -114,9 +114,10 @@ class CreditsAction extends FormlessAction {
 		# Hmm... too many to fit!
 		if ( $cnt > 0 && $contributors->count() > $cnt ) {
 			$others_link = $this->othersLink();
-			if ( !$showIfMax )
+			if ( !$showIfMax ) {
 				return $this->msg( 'othercontribs' )->rawParams(
 					$others_link )->params( $contributors->count() )->escaped();
+			}
 		}
 
 		$real_names = array();
diff --git a/includes/actions/EditAction.php b/includes/actions/EditAction.php
index dec3d841..3dd4c483 100644
--- a/includes/actions/EditAction.php
+++ b/includes/actions/EditAction.php
@@ -43,21 +43,11 @@ class EditAction extends FormlessAction {
 
 	public function show() {
 		$page = $this->page;
-		$request = $this->getRequest();
 		$user = $this->getUser();
-		$context = $this->getContext();
 
 		if ( wfRunHooks( 'CustomEditor', array( $page, $user ) ) ) {
-			if ( ExternalEdit::useExternalEngine( $context, 'edit' )
-				&& $this->getName() == 'edit' && !$request->getVal( 'section' )
-				&& !$request->getVal( 'oldid' ) )
-			{
-				$extedit = new ExternalEdit( $context );
-				$extedit->execute();
-			} else {
-				$editor = new EditPage( $page );
-				$editor->edit();
-			}
+			$editor = new EditPage( $page );
+			$editor->edit();
 		}
 
 	}
diff --git a/includes/actions/HistoryAction.php b/includes/actions/HistoryAction.php
index 245a5bdc..e58791ea 100644
--- a/includes/actions/HistoryAction.php
+++ b/includes/actions/HistoryAction.php
@@ -115,7 +115,7 @@ class HistoryAction extends FormlessAction {
 
 		// Setup page variables.
 		$out->setFeedAppendQuery( 'action=history' );
-		$out->addModules( array( 'mediawiki.legacy.history', 'mediawiki.action.history' ) );
+		$out->addModules( 'mediawiki.action.history' );
 
 		// Handle atom/RSS feeds.
 		$feedType = $request->getVal( 'feed' );
@@ -178,7 +178,7 @@ class HistoryAction extends FormlessAction {
 			) .
 			Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" .
 			Html::hidden( 'action', 'history' ) . "\n" .
-			Xml::dateMenu( ( $year == null ? date( "Y" ) : $year ), $month ) . '&#160;' .
+			Xml::dateMenu( ( $year == null ? MWTimestamp::getLocalInstance()->format( 'Y' ) : $year ), $month ) . '&#160;' .
 			( $tagSelector ? ( implode( '&#160;', $tagSelector ) . '&#160;' ) : '' ) .
 			$checkDeleted .
 			Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n" .
@@ -211,7 +211,7 @@ class HistoryAction extends FormlessAction {
 	 */
 	function fetchRevisions( $limit, $offset, $direction ) {
 		// Fail if article doesn't exist.
-		if( !$this->getTitle()->exists() ) {
+		if ( !$this->getTitle()->exists() ) {
 			return new FakeResultWrapper( array() );
 		}
 
@@ -256,15 +256,14 @@ class HistoryAction extends FormlessAction {
 			$this->getTitle()->getPrefixedText() . ' - ' .
 			$this->msg( 'history-feed-title' )->inContentLanguage()->text(),
 			$this->msg( 'history-feed-description' )->inContentLanguage()->text(),
-			$this->getTitle()->getFullUrl( 'action=history' )
+			$this->getTitle()->getFullURL( 'action=history' )
 		);
 
 		// Get a limit on number of feed entries. Provide a sane default
 		// of 10 if none is defined (but limit to $wgFeedLimit max)
 		$limit = $request->getInt( 'limit', 10 );
-		if ( $limit > $wgFeedLimit || $limit < 1 ) {
-			$limit = 10;
-		}
+		$limit = min( max( $limit, 1 ), $wgFeedLimit );
+
 		$items = $this->fetchRevisions( $limit, 0, HistoryPage::DIR_NEXT );
 
 		// Generate feed elements enclosed between header and footer.
@@ -283,10 +282,10 @@ class HistoryAction extends FormlessAction {
 		return new FeedItem(
 			$this->msg( 'nohistory' )->inContentLanguage()->text(),
 			$this->msg( 'history-feed-empty' )->inContentLanguage()->parseAsBlock(),
-			$this->getTitle()->getFullUrl(),
+			$this->getTitle()->getFullURL(),
 			wfTimestamp( TS_MW ),
 			'',
-			$this->getTitle()->getTalkPage()->getFullUrl()
+			$this->getTitle()->getTalkPage()->getFullURL()
 		);
 	}
 
@@ -323,10 +322,10 @@ class HistoryAction extends FormlessAction {
 		return new FeedItem(
 			$title,
 			$text,
-			$this->getTitle()->getFullUrl( 'diff=' . $rev->getId() . '&oldid=prev' ),
+			$this->getTitle()->getFullURL( 'diff=' . $rev->getId() . '&oldid=prev' ),
 			$rev->getTimestamp(),
 			$rev->getUserText(),
-			$this->getTitle()->getTalkPage()->getFullUrl()
+			$this->getTitle()->getTalkPage()->getFullURL()
 		);
 	}
 }
@@ -367,15 +366,13 @@ class HistoryPager extends ReverseChronologicalPager {
 
 	function getQueryInfo() {
 		$queryInfo = array(
-			'tables'  => array( 'revision', 'user' ),
-			'fields'  => array_merge( Revision::selectFields(), Revision::selectUserFields() ),
-			'conds'   => array_merge(
+			'tables' => array( 'revision', 'user' ),
+			'fields' => array_merge( Revision::selectFields(), Revision::selectUserFields() ),
+			'conds' => array_merge(
 				array( 'rev_page' => $this->getWikiPage()->getId() ),
 				$this->conds ),
 			'options' => array( 'USE INDEX' => array( 'revision' => 'page_timestamp' ) ),
-			'join_conds' => array(
-				'user'        => Revision::userJoinCond(),
-				'tag_summary' => array( 'LEFT JOIN', 'ts_rev_id=rev_id' ) ),
+			'join_conds' => array( 'user' => Revision::userJoinCond() ),
 		);
 		ChangeTags::modifyDisplayQuery(
 			$queryInfo['tables'],
@@ -413,10 +410,10 @@ class HistoryPager extends ReverseChronologicalPager {
 		$batch = new LinkBatch();
 		$revIds = array();
 		foreach ( $this->mResult as $row ) {
-			if( $row->rev_parent_id ) {
+			if ( $row->rev_parent_id ) {
 				$revIds[] = $row->rev_parent_id;
 			}
-			if( !is_null( $row->user_name ) ) {
+			if ( !is_null( $row->user_name ) ) {
 				$batch->add( NS_USER, $row->user_name );
 				$batch->add( NS_USER_TALK, $row->user_name );
 			} else { # for anons or usernames of imported revisions
@@ -649,9 +646,9 @@ class HistoryPager extends ReverseChronologicalPager {
 					$this->msg( 'editundo' )->escaped(),
 					$undoTooltip,
 					array(
-						'action'    => 'edit',
+						'action' => 'edit',
 						'undoafter' => $prevRev->getId(),
-						'undo'      => $rev->getId()
+						'undo' => $rev->getId()
 					)
 				);
 				$tools[] = "<span class=\"mw-history-undo\">{$undolink}</span>";
@@ -661,7 +658,7 @@ class HistoryPager extends ReverseChronologicalPager {
 		wfRunHooks( 'HistoryRevisionTools', array( $rev, &$tools ) );
 
 		if ( $tools ) {
-			$s2 .= ' '. $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
+			$s2 .= ' ' . $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
 		}
 
 		# Tags
@@ -788,13 +785,13 @@ class HistoryPager extends ReverseChronologicalPager {
 	function diffButtons( $rev, $firstInList ) {
 		if ( $this->getNumRows() > 1 ) {
 			$id = $rev->getId();
-			$radio = array( 'type'  => 'radio', 'value' => $id );
-			/** @todo: move title texts to javascript */
+			$radio = array( 'type' => 'radio', 'value' => $id );
+			/** @todo Move title texts to javascript */
 			if ( $firstInList ) {
 				$first = Xml::element( 'input',
 					array_merge( $radio, array(
 						'style' => 'visibility:hidden',
-						'name'  => 'oldid',
+						'name' => 'oldid',
 						'id' => 'mw-oldid-null' ) )
 				);
 				$checkmark = array( 'checked' => 'checked' );
@@ -811,13 +808,13 @@ class HistoryPager extends ReverseChronologicalPager {
 				}
 				$first = Xml::element( 'input',
 					array_merge( $radio, $checkmark, array(
-						'name'  => 'oldid',
+						'name' => 'oldid',
 						'id' => "mw-oldid-$id" ) ) );
 				$checkmark = array();
 			}
 			$second = Xml::element( 'input',
 				array_merge( $radio, $checkmark, array(
-					'name'  => 'diff',
+					'name' => 'diff',
 					'id' => "mw-diff-$id" ) ) );
 			return $first . $second;
 		} else {
diff --git a/includes/actions/InfoAction.php b/includes/actions/InfoAction.php
index 1e312d7a..7fc90339 100644
--- a/includes/actions/InfoAction.php
+++ b/includes/actions/InfoAction.php
@@ -28,6 +28,8 @@
  * @ingroup Actions
  */
 class InfoAction extends FormlessAction {
+	const CACHE_VERSION = '2013-03-17';
+
 	/**
 	 * Returns the name of the action this object responds to.
 	 *
@@ -55,6 +57,22 @@ class InfoAction extends FormlessAction {
 		return false;
 	}
 
+	/**
+	 * Clear the info cache for a given Title.
+	 *
+	 * @since 1.22
+	 * @param Title $title Title to clear cache for
+	 */
+	public static function invalidateCache( Title $title ) {
+		global $wgMemc;
+		// Clear page info.
+		$revision = WikiPage::factory( $title )->getRevision();
+		if ( $revision !== null ) {
+			$key = wfMemcKey( 'infoaction', sha1( $title->getPrefixedText() ), $revision->getId() );
+			$wgMemc->delete( $key );
+		}
+	}
+
 	/**
 	 * Shows page information on GET request.
 	 *
@@ -100,12 +118,16 @@ class InfoAction extends FormlessAction {
 
 		// Render page information
 		foreach ( $pageInfo as $header => $infoTable ) {
+			// Messages:
+			// pageinfo-header-basic, pageinfo-header-edits, pageinfo-header-restrictions,
+			// pageinfo-header-properties, pageinfo-category-info
 			$content .= $this->makeHeader( $this->msg( "pageinfo-${header}" )->escaped() ) . "\n";
 			$table = "\n";
 			foreach ( $infoTable as $infoRow ) {
 				$name = ( $infoRow[0] instanceof Message ) ? $infoRow[0]->escaped() : $infoRow[0];
 				$value = ( $infoRow[1] instanceof Message ) ? $infoRow[1]->escaped() : $infoRow[1];
-				$table = $this->addRow( $table, $name, $value ) . "\n";
+				$id = ( $infoRow[0] instanceof Message ) ? $infoRow[0]->getKey() : null;
+				$table = $this->addRow( $table, $name, $value, $id ) . "\n";
 			}
 			$content = $this->addTable( $content, $table ) . "\n";
 		}
@@ -126,7 +148,7 @@ class InfoAction extends FormlessAction {
 	/**
 	 * Creates a header that can be added to the output.
 	 *
-	 * @param $header The header text.
+	 * @param string $header The header text.
 	 * @return string The HTML.
 	 */
 	protected function makeHeader( $header ) {
@@ -140,10 +162,11 @@ class InfoAction extends FormlessAction {
 	 * @param string $table The table that will be added to the content
 	 * @param string $name The name of the row
 	 * @param string $value The value of the row
+	 * @param string $id The ID to use for the 'tr' element
 	 * @return string The table with the row added
 	 */
-	protected function addRow( $table, $name, $value ) {
-		return $table . Html::rawElement( 'tr', array(),
+	protected function addRow( $table, $name, $value, $id ) {
+		return $table . Html::rawElement( 'tr', $id === null ? array() : array( 'id' => 'mw-' . $id ),
 			Html::rawElement( 'td', array( 'style' => 'vertical-align: top;' ), $name ) .
 			Html::rawElement( 'td', array(), $value )
 		);
@@ -169,18 +192,22 @@ class InfoAction extends FormlessAction {
 	 * @return array
 	 */
 	protected function pageInfo() {
-		global $wgContLang, $wgRCMaxAge, $wgMemc, $wgUnwatchedPageThreshold, $wgPageInfoTransclusionLimit;
+		global $wgContLang, $wgRCMaxAge, $wgMemc,
+			$wgUnwatchedPageThreshold, $wgPageInfoTransclusionLimit;
 
 		$user = $this->getUser();
 		$lang = $this->getLanguage();
 		$title = $this->getTitle();
 		$id = $title->getArticleID();
 
-		$memcKey = wfMemcKey( 'infoaction', sha1( $title->getPrefixedText() ), $this->page->getLatest() );
+		$memcKey = wfMemcKey( 'infoaction',
+			sha1( $title->getPrefixedText() ), $this->page->getLatest() );
 		$pageCounts = $wgMemc->get( $memcKey );
-		if ( $pageCounts === false ) {
+		$version = isset( $pageCounts['cacheversion'] ) ? $pageCounts['cacheversion'] : false;
+		if ( $pageCounts === false || $version !== self::CACHE_VERSION ) {
 			// Get page information that would be too "expensive" to retrieve by normal means
 			$pageCounts = self::pageCounts( $title );
+			$pageCounts['cacheversion'] = self::CACHE_VERSION;
 
 			$wgMemc->set( $memcKey, $pageCounts );
 		}
@@ -229,7 +256,7 @@ class InfoAction extends FormlessAction {
 		}
 
 		// Default sort key
-		$sortKey = $title->getCategorySortKey();
+		$sortKey = $title->getCategorySortkey();
 		if ( !empty( $pageProperties['defaultsort'] ) ) {
 			$sortKey = $pageProperties['defaultsort'];
 		}
@@ -259,6 +286,7 @@ class InfoAction extends FormlessAction {
 		// Use robot policy logic
 		$policy = $this->page->getRobotPolicy( 'view', $pOutput );
 		$pageInfo['header-basic'][] = array(
+			// Messages: pageinfo-robot-index, pageinfo-robot-noindex
 			$this->msg( 'pageinfo-robot-policy' ), $this->msg( "pageinfo-robot-${policy['index']}" )
 		);
 
@@ -373,6 +401,7 @@ class InfoAction extends FormlessAction {
 				$message = $this->msg( 'protect-default' )->escaped();
 			} else {
 				// Administrators only
+				// Messages: protect-level-autoconfirmed, protect-level-sysop
 				$message = $this->msg( "protect-level-$protectionLevel" );
 				if ( $message->isDisabled() ) {
 					// Require "$1" permission
@@ -382,6 +411,8 @@ class InfoAction extends FormlessAction {
 				}
 			}
 
+			// Messages: restriction-edit, restriction-move, restriction-create,
+			// restriction-upload
 			$pageInfo['header-restrictions'][] = array(
 				$this->msg( "restriction-$restrictionType" ), $message
 			);
@@ -587,7 +618,7 @@ class InfoAction extends FormlessAction {
 
 		if ( !$wgDisableCounters ) {
 			// Number of views
-			$views = (int) $dbr->selectField(
+			$views = (int)$dbr->selectField(
 				'page',
 				'page_counter',
 				array( 'page_id' => $id ),
@@ -597,19 +628,19 @@ class InfoAction extends FormlessAction {
 		}
 
 		// Number of page watchers
-		$watchers = (int) $dbr->selectField(
+		$watchers = (int)$dbr->selectField(
 			'watchlist',
 			'COUNT(*)',
 			array(
 				'wl_namespace' => $title->getNamespace(),
-				'wl_title'     => $title->getDBkey(),
+				'wl_title' => $title->getDBkey(),
 			),
 			__METHOD__
 		);
 		$result['watchers'] = $watchers;
 
 		// Total number of edits
-		$edits = (int) $dbr->selectField(
+		$edits = (int)$dbr->selectField(
 			'revision',
 			'COUNT(rev_page)',
 			array( 'rev_page' => $id ),
@@ -618,7 +649,7 @@ class InfoAction extends FormlessAction {
 		$result['edits'] = $edits;
 
 		// Total number of distinct authors
-		$authors = (int) $dbr->selectField(
+		$authors = (int)$dbr->selectField(
 			'revision',
 			'COUNT(DISTINCT rev_user_text)',
 			array( 'rev_page' => $id ),
@@ -630,7 +661,7 @@ class InfoAction extends FormlessAction {
 		$threshold = $dbr->timestamp( time() - $wgRCMaxAge );
 
 		// Recent number of edits
-		$edits = (int) $dbr->selectField(
+		$edits = (int)$dbr->selectField(
 			'revision',
 			'COUNT(rev_page)',
 			array(
@@ -642,7 +673,7 @@ class InfoAction extends FormlessAction {
 		$result['recent_edits'] = $edits;
 
 		// Recent number of distinct authors
-		$authors = (int) $dbr->selectField(
+		$authors = (int)$dbr->selectField(
 			'revision',
 			'COUNT(DISTINCT rev_user_text)',
 			array(
@@ -660,7 +691,7 @@ class InfoAction extends FormlessAction {
 
 			// Subpages of this page (redirects)
 			$conds['page_is_redirect'] = 1;
-			$result['subpages']['redirects'] = (int) $dbr->selectField(
+			$result['subpages']['redirects'] = (int)$dbr->selectField(
 				'page',
 				'COUNT(page_id)',
 				$conds,
@@ -668,7 +699,7 @@ class InfoAction extends FormlessAction {
 
 			// Subpages of this page (non-redirects)
 			$conds['page_is_redirect'] = 0;
-			$result['subpages']['nonredirects'] = (int) $dbr->selectField(
+			$result['subpages']['nonredirects'] = (int)$dbr->selectField(
 				'page',
 				'COUNT(page_id)',
 				$conds,
@@ -681,7 +712,7 @@ class InfoAction extends FormlessAction {
 		}
 
 		// Counts for the number of transclusion links (to/from)
-		$result['transclusion']['to'] = (int) $dbr->selectField(
+		$result['transclusion']['to'] = (int)$dbr->selectField(
 			'templatelinks',
 			'COUNT(tl_from)',
 			array(
@@ -691,7 +722,7 @@ class InfoAction extends FormlessAction {
 			__METHOD__
 		);
 
-		$result['transclusion']['from'] = (int) $dbr->selectField(
+		$result['transclusion']['from'] = (int)$dbr->selectField(
 			'templatelinks',
 			'COUNT(*)',
 			array( 'tl_from' => $title->getArticleID() ),
diff --git a/includes/actions/PurgeAction.php b/includes/actions/PurgeAction.php
index 00bb961d..ed0bff7b 100644
--- a/includes/actions/PurgeAction.php
+++ b/includes/actions/PurgeAction.php
@@ -71,7 +71,7 @@ class PurgeAction extends FormAction {
 				$this->getRequest()->getQueryValues(),
 				array( 'title' => null, 'action' => null )
 			) );
-			if( $this->onSubmit( array() ) ) {
+			if ( $this->onSubmit( array() ) ) {
 				$this->onSuccess();
 			}
 		} else {
@@ -96,6 +96,6 @@ class PurgeAction extends FormAction {
 	}
 
 	public function onSuccess() {
-		$this->getOutput()->redirect( $this->getTitle()->getFullUrl( $this->redirectParams ) );
+		$this->getOutput()->redirect( $this->getTitle()->getFullURL( $this->redirectParams ) );
 	}
 }
diff --git a/includes/actions/RawAction.php b/includes/actions/RawAction.php
index 12ce9f98..32751e45 100644
--- a/includes/actions/RawAction.php
+++ b/includes/actions/RawAction.php
@@ -48,7 +48,7 @@ class RawAction extends FormlessAction {
 	}
 
 	function onView() {
-		global $wgSquidMaxage, $wgForcedRawSMaxage, $wgJsMimeType;
+		global $wgSquidMaxage, $wgForcedRawSMaxage;
 
 		$this->getOutput()->disable();
 		$request = $this->getRequest();
@@ -79,7 +79,7 @@ class RawAction extends FormlessAction {
 
 		# Force caching for CSS and JS raw content, default: 5 minutes
 		if ( $smaxage === null ) {
-			if ( $contentType == 'text/css' || $contentType == $wgJsMimeType ) {
+			if ( $contentType == 'text/css' || $contentType == 'text/javascript' ) {
 				$smaxage = intval( $wgForcedRawSMaxage );
 			} else {
 				$smaxage = 0;
@@ -93,10 +93,7 @@ class RawAction extends FormlessAction {
 		$response->header( 'Content-type: ' . $contentType . '; charset=UTF-8' );
 		# Output may contain user-specific data;
 		# vary generated content for open sessions on private wikis
-		$privateCache = !User::groupHasPermission( '*', 'read' ) && ( $smaxage == 0 || session_id() != '' );
-		// Bug 53032 - make this private if user is logged in,
-		// so we don't accidentally cache cookies
-		$privateCache = $privateCache ?: $this->getUser()->isLoggedIn();
+		$privateCache = !User::isEveryoneAllowed( 'read' ) && ( $smaxage == 0 || session_id() != '' );
 		# allow the client to cache this for 24 hours
 		$mode = $privateCache ? 'private' : 'public';
 		$response->header( 'Cache-Control: ' . $mode . ', s-maxage=' . $smaxage . ', max-age=' . $maxage );
@@ -128,7 +125,7 @@ class RawAction extends FormlessAction {
 		global $wgParser;
 
 		# No longer used
-		if( $this->mGen ) {
+		if ( $this->mGen ) {
 			return '';
 		}
 
@@ -197,18 +194,18 @@ class RawAction extends FormlessAction {
 		switch ( $this->getRequest()->getText( 'direction' ) ) {
 			case 'next':
 				# output next revision, or nothing if there isn't one
-				if( $oldid ) {
-					$oldid = $this->getTitle()->getNextRevisionId( $oldid );
+				if ( $oldid ) {
+					$oldid = $this->getTitle()->getNextRevisionID( $oldid );
 				}
 				$oldid = $oldid ? $oldid : -1;
 				break;
 			case 'prev':
 				# output previous revision, or nothing if there isn't one
-				if( !$oldid ) {
+				if ( !$oldid ) {
 					# get the current revision so we can get the penultimate one
 					$oldid = $this->page->getLatest();
 				}
-				$prev = $this->getTitle()->getPreviousRevisionId( $oldid );
+				$prev = $this->getTitle()->getPreviousRevisionID( $oldid );
 				$oldid = $prev ? $prev : -1;
 				break;
 			case 'cur':
@@ -224,20 +221,18 @@ class RawAction extends FormlessAction {
 	 * @return String
 	 */
 	public function getContentType() {
-		global $wgJsMimeType;
-
 		$ctype = $this->getRequest()->getVal( 'ctype' );
 
 		if ( $ctype == '' ) {
 			$gen = $this->getRequest()->getVal( 'gen' );
 			if ( $gen == 'js' ) {
-				$ctype = $wgJsMimeType;
+				$ctype = 'text/javascript';
 			} elseif ( $gen == 'css' ) {
 				$ctype = 'text/css';
 			}
 		}
 
-		$allowedCTypes = array( 'text/x-wiki', $wgJsMimeType, 'text/css', 'application/x-zope-edit' );
+		$allowedCTypes = array( 'text/x-wiki', 'text/javascript', 'text/css', 'application/x-zope-edit' );
 		if ( $ctype == '' || !in_array( $ctype, $allowedCTypes ) ) {
 			$ctype = 'text/x-wiki';
 		}
@@ -254,6 +249,10 @@ class RawAction extends FormlessAction {
 class RawPage extends RawAction {
 	public $mOldId;
 
+	/**
+	 * @param Page $page
+	 * @param WebRequest|bool $request The WebRequest (default: false).
+	 */
 	function __construct( Page $page, $request = false ) {
 		wfDeprecated( __CLASS__, '1.19' );
 		parent::__construct( $page );
diff --git a/includes/actions/WatchAction.php b/includes/actions/WatchAction.php
index ae5f76c6..929c1b5f 100644
--- a/includes/actions/WatchAction.php
+++ b/includes/actions/WatchAction.php
@@ -87,24 +87,72 @@ class WatchAction extends FormAction {
 		return parent::checkCanExecute( $user );
 	}
 
-	public static function doWatch( Title $title, User $user  ) {
+	/**
+	 * Watch or unwatch a page
+	 * @since 1.22
+	 * @param bool $watch Whether to watch or unwatch the page
+	 * @param Title $title Page to watch/unwatch
+	 * @param User $user User who is watching/unwatching
+	 * @return Status
+	 */
+	public static function doWatchOrUnwatch( $watch, Title $title, User $user ) {
+		if ( $user->isLoggedIn() && $user->isWatched( $title, WatchedItem::IGNORE_USER_RIGHTS ) != $watch ) {
+			// If the user doesn't have 'editmywatchlist', we still want to
+			// allow them to add but not remove items via edits and such.
+			if ( $watch ) {
+				return self::doWatch( $title, $user, WatchedItem::IGNORE_USER_RIGHTS );
+			} else {
+				return self::doUnwatch( $title, $user );
+			}
+		}
+		return Status::newGood();
+	}
+
+	/**
+	 * Watch a page
+	 * @since 1.22 Returns Status, $checkRights parameter added
+	 * @param Title $title Page to watch/unwatch
+	 * @param User $user User who is watching/unwatching
+	 * @param int $checkRights Passed through to $user->addWatch()
+	 * @return Status
+	 */
+	public static function doWatch( Title $title, User $user, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+		if ( $checkRights !== WatchedItem::IGNORE_USER_RIGHTS && !$user->isAllowed( 'editmywatchlist' ) ) {
+			return User::newFatalPermissionDeniedStatus( 'editmywatchlist' );
+		}
+
 		$page = WikiPage::factory( $title );
 
-		if ( wfRunHooks( 'WatchArticle', array( &$user, &$page ) ) ) {
-			$user->addWatch( $title );
+		$status = Status::newFatal( 'hookaborted' );
+		if ( wfRunHooks( 'WatchArticle', array( &$user, &$page, &$status ) ) ) {
+			$status = Status::newGood();
+			$user->addWatch( $title, $checkRights );
 			wfRunHooks( 'WatchArticleComplete', array( &$user, &$page ) );
 		}
-		return true;
+		return $status;
 	}
 
-	public static function doUnwatch( Title $title, User $user  ) {
+	/**
+	 * Unwatch a page
+	 * @since 1.22 Returns Status
+	 * @param Title $title Page to watch/unwatch
+	 * @param User $user User who is watching/unwatching
+	 * @return Status
+	 */
+	public static function doUnwatch( Title $title, User $user ) {
+		if ( !$user->isAllowed( 'editmywatchlist' ) ) {
+			return User::newFatalPermissionDeniedStatus( 'editmywatchlist' );
+		}
+
 		$page = WikiPage::factory( $title );
 
-		if ( wfRunHooks( 'UnwatchArticle', array( &$user, &$page ) ) ) {
+		$status = Status::newFatal( 'hookaborted' );
+		if ( wfRunHooks( 'UnwatchArticle', array( &$user, &$page, &$status ) ) ) {
+			$status = Status::newGood();
 			$user->removeWatch( $title );
 			wfRunHooks( 'UnwatchArticleComplete', array( &$user, &$page ) );
 		}
-		return true;
+		return $status;
 	}
 
 	/**
diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php
index 9351a8d8..ce6ecda6 100644
--- a/includes/api/ApiBase.php
+++ b/includes/api/ApiBase.php
@@ -304,15 +304,14 @@ abstract class ApiBase extends ContextSource {
 			}
 
 			$examples = $this->getExamples();
-			if ( $examples !== false && $examples !== '' ) {
+			if ( $examples ) {
 				if ( !is_array( $examples ) ) {
 					$examples = array(
 						$examples
 					);
 				}
 				$msg .= "Example" . ( count( $examples ) > 1 ? 's' : '' ) . ":\n";
-				foreach( $examples as $k => $v ) {
-
+				foreach ( $examples as $k => $v ) {
 					if ( is_numeric( $k ) ) {
 						$msg .= "  $v\n";
 					} else {
@@ -445,7 +444,7 @@ abstract class ApiBase extends ContextSource {
 								$hintPipeSeparated = false;
 								break;
 							case 'limit':
-								$desc .= $paramPrefix . "No more than {$paramSettings[self :: PARAM_MAX]}";
+								$desc .= $paramPrefix . "No more than {$paramSettings[self::PARAM_MAX]}";
 								if ( isset( $paramSettings[self::PARAM_MAX2] ) ) {
 									$desc .= " ({$paramSettings[self::PARAM_MAX2]} for bots)";
 								}
@@ -689,9 +688,9 @@ abstract class ApiBase extends ContextSource {
 			array( $this, "parameterNotEmpty" ) ) ), $required );
 
 		if ( count( $intersection ) > 1 ) {
-			$this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', "{$p}invalidparammix" );
+			$this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', 'invalidparammix' );
 		} elseif ( count( $intersection ) == 0 ) {
-			$this->dieUsage( "One of the parameters {$p}" . implode( ", {$p}", $required ) . ' is required', "{$p}missingparam" );
+			$this->dieUsage( "One of the parameters {$p}" . implode( ", {$p}", $required ) . ' is required', 'missingparam' );
 		}
 	}
 
@@ -725,7 +724,7 @@ abstract class ApiBase extends ContextSource {
 			array( $this, "parameterNotEmpty" ) ) ), $required );
 
 		if ( count( $intersection ) > 1 ) {
-			$this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', "{$p}invalidparammix" );
+			$this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', 'invalidparammix' );
 		}
 	}
 
@@ -822,9 +821,9 @@ abstract class ApiBase extends ContextSource {
 	 * 	If not set will magically default to either watchdefault or watchcreations
 	 * @return bool
 	 */
-	protected function getWatchlistValue ( $watchlist, $titleObj, $userOption = null ) {
+	protected function getWatchlistValue( $watchlist, $titleObj, $userOption = null ) {
 
-		$userWatching = $this->getUser()->isWatched( $titleObj );
+		$userWatching = $this->getUser()->isWatched( $titleObj, WatchedItem::IGNORE_USER_RIGHTS );
 
 		switch ( $watchlist ) {
 			case 'watch':
@@ -866,12 +865,7 @@ abstract class ApiBase extends ContextSource {
 			return;
 		}
 
-		$user = $this->getUser();
-		if ( $value ) {
-			WatchAction::doWatch( $titleObj, $user );
-		} else {
-			WatchAction::doUnwatch( $titleObj, $user );
-		}
+		WatchAction::doWatchOrUnwatch( $value, $titleObj, $this->getUser() );
 	}
 
 	/**
@@ -967,9 +961,9 @@ abstract class ApiBase extends ContextSource {
 						}
 						break;
 					case 'integer': // Force everything using intval() and optionally validate limits
-						$min = isset ( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : null;
-						$max = isset ( $paramSettings[self::PARAM_MAX] ) ? $paramSettings[self::PARAM_MAX] : null;
-						$enforceLimits = isset ( $paramSettings[self::PARAM_RANGE_ENFORCE] )
+						$min = isset( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : null;
+						$max = isset( $paramSettings[self::PARAM_MAX] ) ? $paramSettings[self::PARAM_MAX] : null;
+						$enforceLimits = isset( $paramSettings[self::PARAM_RANGE_ENFORCE] )
 								? $paramSettings[self::PARAM_RANGE_ENFORCE] : false;
 
 						if ( is_array( $value ) ) {
@@ -1081,7 +1075,7 @@ abstract class ApiBase extends ContextSource {
 
 		if ( !$allowMultiple && count( $valuesList ) != 1 ) {
 			// Bug 33482 - Allow entries with | in them for non-multiple values
-			if ( in_array( $value, $allowedValues ) ) {
+			if ( in_array( $value, $allowedValues, true ) ) {
 				return $value;
 			}
 
@@ -1165,7 +1159,7 @@ abstract class ApiBase extends ContextSource {
 	/**
 	 * Validate and normalize of parameters of type 'user'
 	 * @param string $value Parameter value
-	 * @param string $encParamName Parameter value
+	 * @param string $encParamName Parameter name
 	 * @return string Validated and normalized parameter
 	 */
 	private function validateUser( $value, $encParamName ) {
@@ -1222,6 +1216,44 @@ abstract class ApiBase extends ContextSource {
 		throw new UsageException( $description, $this->encodeParamName( $errorCode ), $httpRespCode, $extradata );
 	}
 
+	/**
+	 * Throw a UsageException based on the errors in the Status object.
+	 *
+	 * @since 1.22
+	 * @param Status $status Status object
+	 * @throws UsageException
+	 */
+	public function dieStatus( $status ) {
+		if ( $status->isGood() ) {
+			throw new MWException( 'Successful status passed to ApiBase::dieStatus' );
+		}
+
+		$errors = $status->getErrorsArray();
+		if ( !$errors ) {
+			// No errors? Assume the warnings should be treated as errors
+			$errors = $status->getWarningsArray();
+		}
+		if ( !$errors ) {
+			// Still no errors? Punt
+			$errors = array( array( 'unknownerror-nocode' ) );
+		}
+
+		// Cannot use dieUsageMsg() because extensions might return custom
+		// error messages.
+		if ( $errors[0] instanceof Message ) {
+			$msg = $errors[0];
+			$code = $msg->getKey();
+		} else {
+			$code = array_shift( $errors[0] );
+			$msg = wfMessage( $code, $errors[0] );
+		}
+		if ( isset( ApiBase::$messageMap[$code] ) ) {
+			// Translate message to code, for backwards compatability
+			$code = ApiBase::$messageMap[$code]['code'];
+		}
+		$this->dieUsage( $msg->inLanguage( 'en' )->useDatabase( false )->plain(), $code );
+	}
+
 	/**
 	 * Array that maps message keys to error messages. $1 and friends are replaced.
 	 */
@@ -1372,6 +1404,7 @@ abstract class ApiBase extends ContextSource {
 		'uploaddisabled' => array( 'code' => 'uploaddisabled', 'info' => 'Uploads are not enabled. Make sure $wgEnableUploads is set to true in LocalSettings.php and the PHP ini setting file_uploads is true' ),
 		'copyuploaddisabled' => array( 'code' => 'copyuploaddisabled', 'info' => 'Uploads by URL is not enabled. Make sure $wgAllowCopyUploads is set to true in LocalSettings.php.' ),
 		'copyuploadbaddomain' => array( 'code' => 'copyuploadbaddomain', 'info' => 'Uploads by URL are not allowed from this domain.' ),
+		'copyuploadbadurl' => array( 'code' => 'copyuploadbadurl', 'info' => 'Upload not allowed from this URL.' ),
 
 		'filename-tooshort' => array( 'code' => 'filename-tooshort', 'info' => 'The filename is too short' ),
 		'filename-toolong' => array( 'code' => 'filename-toolong', 'info' => 'The filename is too long' ),
@@ -1397,7 +1430,7 @@ abstract class ApiBase extends ContextSource {
 	public function dieUsageMsg( $error ) {
 		# most of the time we send a 1 element, so we might as well send it as
 		# a string and make this an array here.
-		if( is_string( $error ) ) {
+		if ( is_string( $error ) ) {
 			$error = array( $error );
 		}
 		$parsed = $this->parseMsg( $error );
@@ -1412,10 +1445,10 @@ abstract class ApiBase extends ContextSource {
 	 */
 	public function dieUsageMsgOrDebug( $error ) {
 		global $wgDebugAPI;
-		if( $wgDebugAPI !== true ) {
+		if ( $wgDebugAPI !== true ) {
 			$this->dieUsageMsg( $error );
 		} else {
-			if( is_string( $error ) ) {
+			if ( is_string( $error ) ) {
 				$error = array( $error );
 			}
 			$parsed = $this->parseMsg( $error );
@@ -1448,7 +1481,7 @@ abstract class ApiBase extends ContextSource {
 
 		// Check whether the error array was nested
 		// array( array( <code>, <params> ), array( <another_code>, <params> ) )
-		if( is_array( $key ) ) {
+		if ( is_array( $key ) ) {
 			$error = $key;
 			$key = array_shift( $error );
 		}
@@ -1470,7 +1503,7 @@ abstract class ApiBase extends ContextSource {
 	 * @param string $message Error message
 	 */
 	protected static function dieDebug( $method, $message ) {
-		wfDebugDieBacktrace( "Internal error in $method: $message" );
+		throw new MWException( "Internal error in $method: $message" );
 	}
 
 	/**
@@ -1535,7 +1568,7 @@ abstract class ApiBase extends ContextSource {
 	public function getWatchlistUser( $params ) {
 		if ( !is_null( $params['owner'] ) && !is_null( $params['token'] ) ) {
 			$user = User::newFromName( $params['owner'], false );
-			if ( !($user && $user->getId()) ) {
+			if ( !( $user && $user->getId() ) ) {
 				$this->dieUsage( 'Specified user does not exist', 'bad_wlowner' );
 			}
 			$token = $user->getOption( 'watchlisttoken' );
@@ -1546,6 +1579,9 @@ abstract class ApiBase extends ContextSource {
 			if ( !$this->getUser()->isLoggedIn() ) {
 				$this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
 			}
+			if ( !$this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
+				$this->dieUsage( 'You don\'t have permission to view your watchlist', 'permissiondenied' );
+			}
 			$user = $this->getUser();
 		}
 		return $user;
@@ -1560,6 +1596,10 @@ abstract class ApiBase extends ContextSource {
 
 	/**
 	 * Returns a list of all possible errors returned by the module
+	 *
+	 * Don't call this function directly: use getFinalPossibleErrors() to allow
+	 * hooks to modify parameters as needed.
+	 *
 	 * @return array in the format of array( key, param1, param2, ... ) or array( 'code' => ..., 'info' => ... )
 	 */
 	public function getPossibleErrors() {
@@ -1574,10 +1614,9 @@ abstract class ApiBase extends ContextSource {
 			}
 			if ( array_key_exists( 'continue', $params ) ) {
 				$ret[] = array(
-					array(
-						'code' => 'badcontinue',
-						'info' => 'Invalid continue param. You should pass the original value returned by the previous query'
-					) );
+					'code' => 'badcontinue',
+					'info' => 'Invalid continue param. You should pass the original value returned by the previous query'
+				);
 			}
 		}
 
@@ -1595,13 +1634,31 @@ abstract class ApiBase extends ContextSource {
 		}
 
 		if ( $this->needsToken() ) {
-			$ret[] = array( 'missingparam', 'token' );
+			if ( !isset( $params['token'][ApiBase::PARAM_REQUIRED] )
+				|| !$params['token'][ApiBase::PARAM_REQUIRED]
+			) {
+				// Add token as possible missing parameter, if not already done
+				$ret[] = array( 'missingparam', 'token' );
+			}
 			$ret[] = array( 'sessionfailure' );
 		}
 
 		return $ret;
 	}
 
+	/**
+	 * Get final list of possible errors, after hooks have had a chance to
+	 * tweak it as needed.
+	 *
+	 * @return array
+	 * @since 1.22
+	 */
+	public function getFinalPossibleErrors() {
+		$possibleErrors = $this->getPossibleErrors();
+		wfRunHooks( 'APIGetPossibleErrors', array( $this, &$possibleErrors ) );
+		return $possibleErrors;
+	}
+
 	/**
 	 * Parses a list of errors into a standardised format
 	 * @param array $errors List of errors. Items can be in the for array( key, param1, param2, ... ) or array( 'code' => ..., 'info' => ... )
diff --git a/includes/api/ApiBlock.php b/includes/api/ApiBlock.php
index 6f3d1e4f..975153ac 100644
--- a/includes/api/ApiBlock.php
+++ b/includes/api/ApiBlock.php
@@ -98,7 +98,7 @@ class ApiBlock extends ApiBase {
 		$res['userID'] = $target instanceof User ? $target->getId() : 0;
 
 		$block = Block::newFromTarget( $target );
-		if( $block instanceof Block ) {
+		if ( $block instanceof Block ) {
 			$res['expiry'] = $block->mExpiry == $this->getDB()->getInfinity()
 				? 'infinite'
 				: wfTimestamp( TS_ISO_8601, $block->mExpiry );
diff --git a/includes/api/ApiComparePages.php b/includes/api/ApiComparePages.php
index 79ffcb0a..1e35c349 100644
--- a/includes/api/ApiComparePages.php
+++ b/includes/api/ApiComparePages.php
@@ -81,17 +81,17 @@ class ApiComparePages extends ApiBase {
 	 * @return int
 	 */
 	private function revisionOrTitleOrId( $revision, $titleText, $titleId ) {
-		if( $revision ) {
+		if ( $revision ) {
 			return $revision;
-		} elseif( $titleText ) {
+		} elseif ( $titleText ) {
 			$title = Title::newFromText( $titleText );
-			if( !$title || $title->isExternal() ) {
+			if ( !$title || $title->isExternal() ) {
 				$this->dieUsageMsg( array( 'invalidtitle', $titleText ) );
 			}
 			return $title->getLatestRevID();
 		} elseif ( $titleId ) {
 			$title = Title::newFromID( $titleId );
-			if( !$title ) {
+			if ( !$title ) {
 				$this->dieUsageMsg( array( 'nosuchpageid', $titleId ) );
 			}
 			return $title->getLatestRevID();
diff --git a/includes/api/ApiCreateAccount.php b/includes/api/ApiCreateAccount.php
index 69748c93..0e752c56 100644
--- a/includes/api/ApiCreateAccount.php
+++ b/includes/api/ApiCreateAccount.php
@@ -47,17 +47,19 @@ class ApiCreateAccount extends ApiBase {
 
 		$params = $this->extractRequestParams();
 
-		$result = array();
-
 		// Init session if necessary
 		if ( session_id() == '' ) {
 			wfSetupSession();
 		}
 
-		if( $params['mailpassword'] && !$params['email'] ) {
+		if ( $params['mailpassword'] && !$params['email'] ) {
 			$this->dieUsageMsg( 'noemail' );
 		}
 
+		if ( $params['language'] && !Language::isSupportedLanguage( $params['language'] ) ) {
+			$this->dieUsage( 'Invalid language parameter', 'langinvalid' );
+		}
+
 		$context = new DerivativeContext( $this->getContext() );
 		$context->setRequest( new DerivativeRequest(
 			$this->getContext()->getRequest(),
@@ -82,22 +84,20 @@ class ApiCreateAccount extends ApiBase {
 
 		$status = $loginForm->addNewaccountInternal();
 		$result = array();
-		if( $status->isGood() ) {
+		if ( $status->isGood() ) {
 			// Success!
+			global $wgEmailAuthentication;
 			$user = $status->getValue();
 
-			// If we showed up language selection links, and one was in use, be
-			// smart (and sensible) and save that language as the user's preference
-			global $wgLoginLanguageSelector, $wgEmailAuthentication;
-			if( $wgLoginLanguageSelector && $params['language'] ) {
+			if ( $params['language'] ) {
 				$user->setOption( 'language', $params['language'] );
 			}
 
-			if( $params['mailpassword'] ) {
+			if ( $params['mailpassword'] ) {
 				// If mailpassword was set, disable the password and send an email.
 				$user->setPassword( null );
 				$status->merge( $loginForm->mailPasswordInternal( $user, false, 'createaccount-title', 'createaccount-text' ) );
-			} elseif( $wgEmailAuthentication && Sanitizer::validateEmail( $user->getEmail() ) ) {
+			} elseif ( $wgEmailAuthentication && Sanitizer::validateEmail( $user->getEmail() ) ) {
 				// Send out an email authentication message if needed
 				$status->merge( $user->sendConfirmationMail() );
 			}
@@ -124,33 +124,23 @@ class ApiCreateAccount extends ApiBase {
 
 		$apiResult = $this->getResult();
 
-		if( $status->hasMessage( 'sessionfailure' ) || $status->hasMessage( 'nocookiesfornew' ) ) {
+		if ( $status->hasMessage( 'sessionfailure' ) || $status->hasMessage( 'nocookiesfornew' ) ) {
 			// Token was incorrect, so add it to result, but don't throw an exception
 			// since not having the correct token is part of the normal
 			// flow of events.
 			$result['token'] = LoginForm::getCreateaccountToken();
 			$result['result'] = 'needtoken';
-		} elseif( !$status->isOK() ) {
+		} elseif ( !$status->isOK() ) {
 			// There was an error. Die now.
-			// Cannot use dieUsageMsg() directly because extensions
-			// might return custom error messages.
-			$errors = $status->getErrorsArray();
-			if( $errors[0] instanceof Message ) {
-				$code = 'aborted';
-				$desc = $errors[0];
-			} else {
-				$code = array_shift( $errors[0] );
-				$desc = wfMessage( $code, $errors[0] );
-			}
-			$this->dieUsage( $desc, $code );
-		} elseif( !$status->isGood() ) {
+			$this->dieStatus( $status );
+		} elseif ( !$status->isGood() ) {
 			// Status is not good, but OK. This means warnings.
 			$result['result'] = 'warning';
 
 			// Add any warnings to the result
 			$warnings = $status->getErrorsByType( 'warning' );
-			if( $warnings ) {
-				foreach( $warnings as &$warning ) {
+			if ( $warnings ) {
+				foreach ( $warnings as &$warning ) {
 					$apiResult->setIndexedTagName( $warning['params'], 'param' );
 				}
 				$apiResult->setIndexedTagName( $warnings, 'warning' );
@@ -263,8 +253,8 @@ class ApiCreateAccount extends ApiBase {
 
 		$errors = parent::getPossibleErrors();
 		// All local errors are from LoginForm, which means they're actually message keys.
-		foreach( $localErrors as $error ) {
-			$errors[] = array( 'code' => $error, 'info' => wfMessage( $error )->parse() );
+		foreach ( $localErrors as $error ) {
+			$errors[] = array( 'code' => $error, 'info' => wfMessage( $error )->inLanguage( 'en' )->useDatabase( false )->parse() );
 		}
 
 		$errors[] = array(
@@ -279,12 +269,16 @@ class ApiCreateAccount extends ApiBase {
 			'code' => 'aborted',
 			'info' => 'Account creation aborted by hook (info may vary)'
 		);
+		$errors[] = array(
+			'code' => 'langinvalid',
+			'info' => 'Invalid language parameter'
+		);
 
 		// 'passwordtooshort' has parameters. :(
 		global $wgMinimalPasswordLength;
 		$errors[] = array(
 			'code' => 'passwordtooshort',
-			'info' => wfMessage( 'passwordtooshort', $wgMinimalPasswordLength )->parse()
+			'info' => wfMessage( 'passwordtooshort', $wgMinimalPasswordLength )->inLanguage( 'en' )->useDatabase( false )->parse()
 		);
 		return $errors;
 	}
diff --git a/includes/api/ApiDelete.php b/includes/api/ApiDelete.php
index d1f0806e..aea10482 100644
--- a/includes/api/ApiDelete.php
+++ b/includes/api/ApiDelete.php
@@ -61,8 +61,7 @@ class ApiDelete extends ApiBase {
 			$this->dieUsageMsg( $status[0] );
 		}
 		if ( !$status->isGood() ) {
-			$errors = $status->getErrorsArray();
-			$this->dieUsageMsg( $errors[0] ); // We don't care about multiple errors, just report one of them
+			$this->dieStatus( $status );
 		}
 
 		// Deprecated parameters
diff --git a/includes/api/ApiEditPage.php b/includes/api/ApiEditPage.php
index 4916145b..bd61895b 100644
--- a/includes/api/ApiEditPage.php
+++ b/includes/api/ApiEditPage.php
@@ -100,7 +100,7 @@ class ApiEditPage extends ApiBase {
 			$name = $titleObj->getPrefixedDBkey();
 			$model = $contentHandler->getModelID();
 
-			$this->dieUsage( "The requested format $contentFormat is not supported for content model ".
+			$this->dieUsage( "The requested format $contentFormat is not supported for content model " .
 							" $model used by $name", 'badformat' );
 		}
 
@@ -146,7 +146,7 @@ class ApiEditPage extends ApiBase {
 				}
 			}
 
-			// @todo: Add support for appending/prepending to the Content interface
+			// @todo Add support for appending/prepending to the Content interface
 
 			if ( !( $content instanceof TextContent ) ) {
 				$mode = $contentHandler->getModelID();
@@ -159,12 +159,17 @@ class ApiEditPage extends ApiBase {
 					$this->dieUsage( "Sections are not supported for this content model: $modelName.", 'sectionsnotsupported' );
 				}
 
-				// Process the content for section edits
-				$section = intval( $params['section'] );
-				$content = $content->getSection( $section );
+				if ( $params['section'] == 'new' ) {
+					// DWIM if they're trying to prepend/append to a new section.
+					$content = null;
+				} else {
+					// Process the content for section edits
+					$section = intval( $params['section'] );
+					$content = $content->getSection( $section );
 
-				if ( !$content ) {
-					$this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+					if ( !$content ) {
+						$this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+					}
 				}
 			}
 
@@ -262,7 +267,7 @@ class ApiEditPage extends ApiBase {
 			$requestArray['wpStarttime'] = wfTimestampNow(); // Fake wpStartime
 		}
 
-		if ( $params['minor'] || ( !$params['notminor'] && $user->getOption( 'minordefault' ) ) )	{
+		if ( $params['minor'] || ( !$params['notminor'] && $user->getOption( 'minordefault' ) ) ) {
 			$requestArray['wpMinoredit'] = '';
 		}
 
@@ -275,6 +280,10 @@ class ApiEditPage extends ApiBase {
 			if ( $section == 0 && $params['section'] != '0' && $params['section'] != 'new' ) {
 				$this->dieUsage( "The section parameter must be set to an integer or 'new'", "invalidsection" );
 			}
+			$content = $pageObj->getContent();
+			if ( $section !== 0 && ( !$content || !$content->getSection( $section ) ) ) {
+				$this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+			}
 			$requestArray['wpSection'] = $params['section'];
 		} else {
 			$requestArray['wpSection'] = '';
@@ -293,6 +302,10 @@ class ApiEditPage extends ApiBase {
 			$requestArray['wpWatchthis'] = '';
 		}
 
+		// Pass through anything else we might have been given, to support extensions
+		// This is kind of a hack but it's the best we can do to make extensions work
+		$requestArray += $this->getRequest()->getValues();
+
 		global $wgTitle, $wgRequest;
 
 		$req = new DerivativeRequest( $this->getRequest(), $requestArray, true );
@@ -316,11 +329,37 @@ class ApiEditPage extends ApiBase {
 
 		$ep->setContextTitle( $titleObj );
 		$ep->importFormData( $req );
+		$content = $ep->textbox1;
+
+		// The following is needed to give the hook the full content of the
+		// new revision rather than just the current section. (Bug 52077)
+		if ( !is_null( $params['section'] ) && $contentHandler->supportsSections() && $titleObj->exists() ) {
+
+			$sectionTitle = '';
+			// If sectiontitle is set, use it, otherwise use the summary as the section title (for
+			// backwards compatibility with old forms/bots).
+			if ( $ep->sectiontitle !== '' ) {
+				$sectionTitle = $ep->sectiontitle;
+			} else {
+				$sectionTitle = $ep->summary;
+			}
+
+			$contentObj = $contentHandler->unserializeContent( $content, $contentFormat );
+
+			$fullContentObj = $articleObject->replaceSectionContent( $params['section'], $contentObj, $sectionTitle );
+			if ( $fullContentObj ) {
+				$content = $fullContentObj->serialize( $contentFormat );
+			} else {
+				// This most likely means we have an edit conflict which means that the edit
+				// wont succeed anyway.
+				$this->dieUsageMsg( 'editconflict' );
+			}
+		}
 
 		// Run hooks
 		// Handle APIEditBeforeSave parameters
 		$r = array();
-		if ( !wfRunHooks( 'APIEditBeforeSave', array( $ep, $ep->textbox1, &$r ) ) ) {
+		if ( !wfRunHooks( 'APIEditBeforeSave', array( $ep, $content, &$r ) ) ) {
 			if ( count( $r ) ) {
 				$r['result'] = 'Failure';
 				$apiResult->addValue( null, $this->getModuleName(), $r );
@@ -342,7 +381,7 @@ class ApiEditPage extends ApiBase {
 		$wgRequest = $oldRequest;
 		global $wgMaxArticleSize;
 
-		switch( $status->value ) {
+		switch ( $status->value ) {
 			case EditPage::AS_HOOK_ERROR:
 			case EditPage::AS_HOOK_ERROR_EXPECTED:
 				$this->dieUsageMsg( 'hookaborted' );
diff --git a/includes/api/ApiExpandTemplates.php b/includes/api/ApiExpandTemplates.php
index f5898fb3..d5c789c3 100644
--- a/includes/api/ApiExpandTemplates.php
+++ b/includes/api/ApiExpandTemplates.php
@@ -65,14 +65,14 @@ class ApiExpandTemplates extends ApiBase {
 				$xml = $dom->__toString();
 			}
 			$xml_result = array();
-			$result->setContent( $xml_result, $xml );
+			ApiResult::setContent( $xml_result, $xml );
 			$result->addValue( null, 'parsetree', $xml_result );
 		}
 		$retval = $wgParser->preprocess( $params['text'], $title_obj, $options );
 
 		// Return result
 		$retval_array = array();
-		$result->setContent( $retval_array, $retval );
+		ApiResult::setContent( $retval_array, $retval );
 		$result->addValue( null, $this->getModuleName(), $retval_array );
 	}
 
diff --git a/includes/api/ApiFeedContributions.php b/includes/api/ApiFeedContributions.php
index 015a9922..05691093 100644
--- a/includes/api/ApiFeedContributions.php
+++ b/includes/api/ApiFeedContributions.php
@@ -43,11 +43,11 @@ class ApiFeedContributions extends ApiBase {
 
 		global $wgFeed, $wgFeedClasses, $wgSitename, $wgLanguageCode;
 
-		if( !$wgFeed ) {
+		if ( !$wgFeed ) {
 			$this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
 		}
 
-		if( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
+		if ( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
 			$this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
 		}
 
@@ -82,7 +82,7 @@ class ApiFeedContributions extends ApiBase {
 		) );
 
 		$feedItems = array();
-		if( $pager->getNumRows() > 0 ) {
+		if ( $pager->getNumRows() > 0 ) {
 			foreach ( $pager->mResult as $row ) {
 				$feedItems[] = $this->feedItem( $row );
 			}
@@ -93,7 +93,7 @@ class ApiFeedContributions extends ApiBase {
 
 	protected function feedItem( $row ) {
 		$title = Title::makeTitle( intval( $row->page_namespace ), $row->page_title );
-		if( $title ) {
+		if ( $title && $title->userCan( 'read', $this->getUser() ) ) {
 			$date = $row->rev_timestamp;
 			$comments = $title->getTalkPage()->getFullURL();
 			$revision = Revision::newFromRow( $row );
@@ -106,9 +106,8 @@ class ApiFeedContributions extends ApiBase {
 				$this->feedItemAuthor( $revision ),
 				$comments
 			);
-		} else {
-			return null;
 		}
+		return null;
 	}
 
 	/**
@@ -124,7 +123,7 @@ class ApiFeedContributions extends ApiBase {
 	 * @return string
 	 */
 	protected function feedItemDesc( $revision ) {
-		if( $revision ) {
+		if ( $revision ) {
 			$msg = wfMessage( 'colon-separator' )->inContentLanguage()->text();
 			$content = $revision->getContent();
 
@@ -149,7 +148,7 @@ class ApiFeedContributions extends ApiBase {
 	public function getAllowedParams() {
 		global $wgFeedClasses;
 		$feedFormatNames = array_keys( $wgFeedClasses );
-		return array (
+		return array(
 			'feedformat' => array(
 				ApiBase::PARAM_DFLT => 'rss',
 				ApiBase::PARAM_TYPE => $feedFormatNames
diff --git a/includes/api/ApiFeedWatchlist.php b/includes/api/ApiFeedWatchlist.php
index 6c793b36..fbb70fbc 100644
--- a/includes/api/ApiFeedWatchlist.php
+++ b/includes/api/ApiFeedWatchlist.php
@@ -33,6 +33,10 @@
  */
 class ApiFeedWatchlist extends ApiBase {
 
+	private $watchlistModule = null;
+	private $linkToDiffs = false;
+	private $linkToSections = false;
+
 	/**
 	 * This module uses a custom feed wrapper printer.
 	 *
@@ -42,8 +46,6 @@ class ApiFeedWatchlist extends ApiBase {
 		return new ApiFormatFeedWrapper( $this->getMain() );
 	}
 
-	private $linkToDiffs = false;
-
 	/**
 	 * Make a nested call to the API to request watchlist items in the last $hours.
 	 * Wrap the result as an RSS/Atom feed.
@@ -54,11 +56,11 @@ class ApiFeedWatchlist extends ApiBase {
 		try {
 			$params = $this->extractRequestParams();
 
-			if( !$wgFeed ) {
+			if ( !$wgFeed ) {
 				$this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
 			}
 
-			if( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
+			if ( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
 				$this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
 			}
 
@@ -74,7 +76,7 @@ class ApiFeedWatchlist extends ApiBase {
 				'wlprop' => 'title|user|comment|timestamp',
 				'wldir' => 'older', // reverse order - from newest to oldest
 				'wlend' => $endTime, // stop at this time
-				'wllimit' => ( 50 > $wgFeedLimit ) ? $wgFeedLimit : 50
+				'wllimit' => min( 50, $wgFeedLimit )
 			);
 
 			if ( $params['wlowner'] !== null ) {
@@ -86,6 +88,12 @@ class ApiFeedWatchlist extends ApiBase {
 			if ( $params['wlexcludeuser'] !== null ) {
 				$fauxReqArr['wlexcludeuser'] = $params['wlexcludeuser'];
 			}
+			if ( $params['wlshow'] !== null ) {
+				$fauxReqArr['wlshow'] = $params['wlshow'];
+			}
+			if ( $params['wltype'] !== null ) {
+				$fauxReqArr['wltype'] = $params['wltype'];
+			}
 
 			// Support linking to diffs instead of article
 			if ( $params['linktodiffs'] ) {
@@ -93,6 +101,12 @@ class ApiFeedWatchlist extends ApiBase {
 				$fauxReqArr['wlprop'] .= '|ids';
 			}
 
+			// Support linking directly to sections when possible
+			// (possible only if section name is present in comment)
+			if ( $params['linktosections'] ) {
+				$this->linkToSections = true;
+			}
+
 			// Check for 'allrev' parameter, and if found, show all revisions to each page on wl.
 			if ( $params['allrev'] ) {
 				$fauxReqArr['wlallrev'] = '';
@@ -160,6 +174,18 @@ class ApiFeedWatchlist extends ApiBase {
 			$titleUrl = $title->getFullURL();
 		}
 		$comment = isset( $info['comment'] ) ? $info['comment'] : null;
+
+		// Create an anchor to section.
+		// The anchor won't work for sections that have dupes on page
+		// as there's no way to strip that info from ApiWatchlist (apparently?).
+		// RegExp in the line below is equal to Linker::formatAutocomments().
+		if ( $this->linkToSections && $comment !== null && preg_match( '!(.*)/\*\s*(.*?)\s*\*/(.*)!', $comment, $matches ) ) {
+			global $wgParser;
+			$sectionTitle = $wgParser->stripSectionName( $matches[2] );
+			$sectionTitle = Sanitizer::normalizeSectionNameWhitespace( $sectionTitle );
+			$titleUrl .= Title::newFromText( '#' . $sectionTitle )->getFragmentForURL();
+		}
+
 		$timestamp = $info['timestamp'];
 		$user = $info['user'];
 
@@ -168,10 +194,18 @@ class ApiFeedWatchlist extends ApiBase {
 		return new FeedItem( $titleStr, $completeText, $titleUrl, $timestamp, $user );
 	}
 
-	public function getAllowedParams() {
+	private function getWatchlistModule() {
+		if ( $this->watchlistModule === null ) {
+			$this->watchlistModule = $this->getMain()->getModuleManager()->getModule( 'query' )
+				->getModuleManager()->getModule( 'watchlist' );
+		}
+		return $this->watchlistModule;
+	}
+
+	public function getAllowedParams( $flags = 0 ) {
 		global $wgFeedClasses;
 		$feedFormatNames = array_keys( $wgFeedClasses );
-		return array (
+		$ret = array(
 			'feedformat' => array(
 				ApiBase::PARAM_DFLT => 'rss',
 				ApiBase::PARAM_TYPE => $feedFormatNames
@@ -182,29 +216,41 @@ class ApiFeedWatchlist extends ApiBase {
 				ApiBase::PARAM_MIN => 1,
 				ApiBase::PARAM_MAX => 72,
 			),
-			'allrev' => false,
-			'wlowner' => array(
-				ApiBase::PARAM_TYPE => 'user'
-			),
-			'wltoken' => array(
-				ApiBase::PARAM_TYPE => 'string'
-			),
-			'wlexcludeuser' => array(
-				ApiBase::PARAM_TYPE => 'user'
-			),
 			'linktodiffs' => false,
+			'linktosections' => false,
 		);
+		if ( $flags ) {
+			$wlparams = $this->getWatchlistModule()->getAllowedParams( $flags );
+			$ret['allrev'] = $wlparams['allrev'];
+			$ret['wlowner'] = $wlparams['owner'];
+			$ret['wltoken'] = $wlparams['token'];
+			$ret['wlshow'] = $wlparams['show'];
+			$ret['wltype'] = $wlparams['type'];
+			$ret['wlexcludeuser'] = $wlparams['excludeuser'];
+		} else {
+			$ret['allrev'] = null;
+			$ret['wlowner'] = null;
+			$ret['wltoken'] = null;
+			$ret['wlshow'] = null;
+			$ret['wltype'] = null;
+			$ret['wlexcludeuser'] = null;
+		}
+		return $ret;
 	}
 
 	public function getParamDescription() {
+		$wldescr = $this->getWatchlistModule()->getParamDescription();
 		return array(
 			'feedformat' => 'The format of the feed',
-			'hours'      => 'List pages modified within this many hours from now',
-			'allrev'     => 'Include multiple revisions of the same page within given timeframe',
-			'wlowner'    => "The user whose watchlist you want (must be accompanied by {$this->getModulePrefix()}wltoken if it's not you)",
-			'wltoken'    => 'Security token that requested user set in their preferences',
-			'wlexcludeuser' => 'A user whose edits should not be shown in the watchlist',
+			'hours' => 'List pages modified within this many hours from now',
 			'linktodiffs' => 'Link to change differences instead of article pages',
+			'linktosections' => 'Link directly to changed sections if possible',
+			'allrev' => $wldescr['allrev'],
+			'wlowner' => $wldescr['owner'],
+			'wltoken' => $wldescr['token'],
+			'wlshow' => $wldescr['show'],
+			'wltype' => $wldescr['type'],
+			'wlexcludeuser' => $wldescr['excludeuser'],
 		);
 	}
 
diff --git a/includes/api/ApiFormatBase.php b/includes/api/ApiFormatBase.php
index d8aa1634..b89fb3a7 100644
--- a/includes/api/ApiFormatBase.php
+++ b/includes/api/ApiFormatBase.php
@@ -85,7 +85,7 @@ abstract class ApiFormatBase extends ApiBase {
 	 *
 	 * @param bool $b Whether or not ampersands should be escaped.
 	 */
-	public function setUnescapeAmps ( $b ) {
+	public function setUnescapeAmps( $b ) {
 		$this->mUnescapeAmps = $b;
 	}
 
@@ -170,12 +170,12 @@ abstract class ApiFormatBase extends ApiBase {
 ?>
 <br />
 <small>
-You are looking at the HTML representation of the <?php echo( $this->mFormat ); ?> format.<br />
+You are looking at the HTML representation of the <?php echo $this->mFormat; ?> format.<br />
 HTML is good for debugging, but is unsuitable for application use.<br />
 Specify the format parameter to change the output format.<br />
-To see the non HTML representation of the <?php echo( $this->mFormat ); ?> format, set format=<?php echo( strtolower( $this->mFormat ) ); ?>.<br />
+To see the non HTML representation of the <?php echo $this->mFormat; ?> format, set format=<?php echo strtolower( $this->mFormat ); ?>.<br />
 See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>, or
-<a href='<?php echo( $script ); ?>'>API help</a> for more information.
+<a href='<?php echo $script; ?>'>API help</a> for more information.
 </small>
 <pre style='white-space: pre-wrap;'>
 <?php
diff --git a/includes/api/ApiFormatJson.php b/includes/api/ApiFormatJson.php
index abb63480..342a580f 100644
--- a/includes/api/ApiFormatJson.php
+++ b/includes/api/ApiFormatJson.php
@@ -56,30 +56,32 @@ class ApiFormatJson extends ApiFormatBase {
 	}
 
 	public function execute() {
-		$prefix = $suffix = '';
-
 		$params = $this->extractRequestParams();
+		$json = FormatJson::encode(
+			$this->getResultData(),
+			$this->getIsHtml(),
+			$params['utf8'] ? FormatJson::ALL_OK : FormatJson::XMLMETA_OK
+		);
 		$callback = $params['callback'];
-		if ( !is_null( $callback ) ) {
-			$prefix = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback ) . '(';
-			$suffix = ')';
+		if ( $callback !== null ) {
+			$callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback );
+			$this->printText( "$callback($json)" );
+		} else {
+			$this->printText( $json );
 		}
-		$this->printText(
-			$prefix .
-			FormatJson::encode( $this->getResultData(), $this->getIsHtml() ) .
-			$suffix
-		);
 	}
 
 	public function getAllowedParams() {
 		return array(
-			'callback'  => null,
+			'callback' => null,
+			'utf8' => false,
 		);
 	}
 
 	public function getParamDescription() {
 		return array(
 			'callback' => 'If specified, wraps the output into a given function call. For safety, all user-specific data will be restricted.',
+			'utf8' => 'If specified, encodes most (but not all) non-ASCII characters as UTF-8 instead of replacing them with hexadecimal escape sequences.',
 		);
 	}
 
diff --git a/includes/api/ApiFormatWddx.php b/includes/api/ApiFormatWddx.php
index 62b69bb6..5685d937 100644
--- a/includes/api/ApiFormatWddx.php
+++ b/includes/api/ApiFormatWddx.php
@@ -46,7 +46,7 @@ class ApiFormatWddx extends ApiFormatBase {
 		} else {
 			// Don't do newlines and indentation if we weren't asked
 			// for pretty output
-			$nl = ( $this->getIsHtml() ? '' : "\n" );
+			$nl = ( $this->getIsHtml() ? "\n" : '' );
 			$indstr = ' ';
 			$this->printText( "<?xml version=\"1.0\"?>$nl" );
 			$this->printText( "<wddxPacket version=\"1.0\">$nl" );
@@ -64,44 +64,43 @@ class ApiFormatWddx extends ApiFormatBase {
 	 * @param $indent int
 	 */
 	function slowWddxPrinter( $elemValue, $indent = 0 ) {
-		$indstr = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent ) );
-		$indstr2 = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent + 2 ) );
-		$nl = ( $this->getIsHtml() ? '' : "\n" );
-		switch ( gettype( $elemValue ) ) {
-			case 'array':
-				// Check whether we've got an associative array (<struct>)
-				// or a regular array (<array>)
-				$cnt = count( $elemValue );
-				if ( $cnt == 0 || array_keys( $elemValue ) === range( 0, $cnt - 1 ) ) {
-					// Regular array
-					$this->printText( $indstr . Xml::element( 'array', array(
-						'length' => $cnt ), null ) . $nl );
-					foreach ( $elemValue as $subElemValue ) {
-						$this->slowWddxPrinter( $subElemValue, $indent + 2 );
-					}
-					$this->printText( "$indstr</array>$nl" );
-				} else {
-					// Associative array (<struct>)
-					$this->printText( "$indstr<struct>$nl" );
-					foreach ( $elemValue as $subElemName => $subElemValue ) {
-						$this->printText( $indstr2 . Xml::element( 'var', array(
-							'name' => $subElemName
-						), null ) . $nl );
-						$this->slowWddxPrinter( $subElemValue, $indent + 4 );
-						$this->printText( "$indstr2</var>$nl" );
-					}
-					$this->printText( "$indstr</struct>$nl" );
+		$indstr = ( $this->getIsHtml() ? str_repeat( ' ', $indent ) : '' );
+		$indstr2 = ( $this->getIsHtml() ? str_repeat( ' ', $indent + 2 ) : '' );
+		$nl = ( $this->getIsHtml() ? "\n" : '' );
+		if ( is_array( $elemValue ) ) {
+			// Check whether we've got an associative array (<struct>)
+			// or a regular array (<array>)
+			$cnt = count( $elemValue );
+			if ( $cnt == 0 || array_keys( $elemValue ) === range( 0, $cnt - 1 ) ) {
+				// Regular array
+				$this->printText( $indstr . Xml::element( 'array', array(
+					'length' => $cnt ), null ) . $nl );
+				foreach ( $elemValue as $subElemValue ) {
+					$this->slowWddxPrinter( $subElemValue, $indent + 2 );
 				}
-				break;
-			case 'integer':
-			case 'double':
-				$this->printText( $indstr . Xml::element( 'number', null, $elemValue ) . $nl );
-				break;
-			case 'string':
-				$this->printText( $indstr . Xml::element( 'string', null, $elemValue ) . $nl );
-				break;
-			default:
-				ApiBase::dieDebug( __METHOD__, 'Unknown type ' . gettype( $elemValue ) );
+				$this->printText( "$indstr</array>$nl" );
+			} else {
+				// Associative array (<struct>)
+				$this->printText( "$indstr<struct>$nl" );
+				foreach ( $elemValue as $subElemName => $subElemValue ) {
+					$this->printText( $indstr2 . Xml::element( 'var', array(
+						'name' => $subElemName
+					), null ) . $nl );
+					$this->slowWddxPrinter( $subElemValue, $indent + 4 );
+					$this->printText( "$indstr2</var>$nl" );
+				}
+				$this->printText( "$indstr</struct>$nl" );
+			}
+		} elseif ( is_int( $elemValue ) || is_float( $elemValue ) ) {
+			$this->printText( $indstr . Xml::element( 'number', null, $elemValue ) . $nl );
+		} elseif ( is_string( $elemValue ) ) {
+			$this->printText( $indstr . Xml::element( 'string', null, $elemValue ) . $nl );
+		} elseif ( is_bool( $elemValue ) ) {
+			$this->printText( $indstr . Xml::element( 'boolean',
+				array( 'value' => $elemValue ? 'true' : 'false' ) ) . $nl
+			);
+		} else {
+			ApiBase::dieDebug( __METHOD__, 'Unknown type ' . gettype( $elemValue ) );
 		}
 	}
 
diff --git a/includes/api/ApiFormatXml.php b/includes/api/ApiFormatXml.php
index b4e8e330..4ec149c0 100644
--- a/includes/api/ApiFormatXml.php
+++ b/includes/api/ApiFormatXml.php
@@ -32,7 +32,6 @@ class ApiFormatXml extends ApiFormatBase {
 
 	private $mRootElemName = 'api';
 	public static $namespace = 'http://www.mediawiki.org/xml/api/';
-	private $mDoubleQuote = false;
 	private $mIncludeNamespace = false;
 	private $mXslt = null;
 
@@ -50,7 +49,6 @@ class ApiFormatXml extends ApiFormatBase {
 
 	public function execute() {
 		$params = $this->extractRequestParams();
-		$this->mDoubleQuote = $params['xmldoublequote'];
 		$this->mIncludeNamespace = $params['includexmlnamespace'];
 		$this->mXslt = $params['xslt'];
 
@@ -71,8 +69,7 @@ class ApiFormatXml extends ApiFormatBase {
 		$this->printText(
 			self::recXmlPrint( $this->mRootElemName,
 				$data,
-				$this->getIsHtml() ? - 2 : null,
-				$this->mDoubleQuote
+				$this->getIsHtml() ? - 2 : null
 			)
 		);
 	}
@@ -117,11 +114,10 @@ class ApiFormatXml extends ApiFormatBase {
 	 * @param $elemName
 	 * @param $elemValue
 	 * @param $indent
-	 * @param $doublequote bool
 	 *
 	 * @return string
 	 */
-	public static function recXmlPrint( $elemName, $elemValue, $indent, $doublequote = false ) {
+	public static function recXmlPrint( $elemName, $elemValue, $indent ) {
 		$retval = '';
 		if ( !is_null( $indent ) ) {
 			$indent += 2;
@@ -131,84 +127,71 @@ class ApiFormatXml extends ApiFormatBase {
 		}
 		$elemName = str_replace( ' ', '_', $elemName );
 
-		switch ( gettype( $elemValue ) ) {
-			case 'array':
-				if ( isset( $elemValue['*'] ) ) {
-					$subElemContent = $elemValue['*'];
-					if ( $doublequote ) {
-						$subElemContent = Sanitizer::encodeAttribute( $subElemContent );
-					}
-					unset( $elemValue['*'] );
-
-					// Add xml:space="preserve" to the
-					// element so XML parsers will leave
-					// whitespace in the content alone
-					$elemValue['xml:space'] = 'preserve';
-				} else {
-					$subElemContent = null;
+		if ( is_array( $elemValue ) ) {
+			if ( isset( $elemValue['*'] ) ) {
+				$subElemContent = $elemValue['*'];
+				unset( $elemValue['*'] );
+
+				// Add xml:space="preserve" to the
+				// element so XML parsers will leave
+				// whitespace in the content alone
+				$elemValue['xml:space'] = 'preserve';
+			} else {
+				$subElemContent = null;
+			}
+
+			if ( isset( $elemValue['_element'] ) ) {
+				$subElemIndName = $elemValue['_element'];
+				unset( $elemValue['_element'] );
+			} else {
+				$subElemIndName = null;
+			}
+
+			$indElements = array();
+			$subElements = array();
+			foreach ( $elemValue as $subElemId => & $subElemValue ) {
+				if ( is_int( $subElemId ) ) {
+					$indElements[] = $subElemValue;
+					unset( $elemValue[$subElemId] );
+				} elseif ( is_array( $subElemValue ) ) {
+					$subElements[$subElemId] = $subElemValue;
+					unset( $elemValue[$subElemId] );
 				}
+			}
 
-				if ( isset( $elemValue['_element'] ) ) {
-					$subElemIndName = $elemValue['_element'];
-					unset( $elemValue['_element'] );
-				} else {
-					$subElemIndName = null;
-				}
+			if ( is_null( $subElemIndName ) && count( $indElements ) ) {
+				ApiBase::dieDebug( __METHOD__, "($elemName, ...) has integer keys without _element value. Use ApiResult::setIndexedTagName()." );
+			}
 
-				$indElements = array();
-				$subElements = array();
-				foreach ( $elemValue as $subElemId => & $subElemValue ) {
-					if ( is_string( $subElemValue ) && $doublequote ) {
-						$subElemValue = Sanitizer::encodeAttribute( $subElemValue );
-					}
-
-					if ( gettype( $subElemId ) === 'integer' ) {
-						$indElements[] = $subElemValue;
-						unset( $elemValue[$subElemId] );
-					} elseif ( is_array( $subElemValue ) ) {
-						$subElements[$subElemId] = $subElemValue;
-						unset ( $elemValue[$subElemId] );
-					}
-				}
+			if ( count( $subElements ) && count( $indElements ) && !is_null( $subElemContent ) ) {
+				ApiBase::dieDebug( __METHOD__, "($elemName, ...) has content and subelements" );
+			}
 
-				if ( is_null( $subElemIndName ) && count( $indElements ) ) {
-					ApiBase::dieDebug( __METHOD__, "($elemName, ...) has integer keys without _element value. Use ApiResult::setIndexedTagName()." );
-				}
+			if ( !is_null( $subElemContent ) ) {
+				$retval .= $indstr . Xml::element( $elemName, $elemValue, $subElemContent );
+			} elseif ( !count( $indElements ) && !count( $subElements ) ) {
+				$retval .= $indstr . Xml::element( $elemName, $elemValue );
+			} else {
+				$retval .= $indstr . Xml::element( $elemName, $elemValue, null );
 
-				if ( count( $subElements ) && count( $indElements ) && !is_null( $subElemContent ) ) {
-					ApiBase::dieDebug( __METHOD__, "($elemName, ...) has content and subelements" );
+				foreach ( $subElements as $subElemId => & $subElemValue ) {
+					$retval .= self::recXmlPrint( $subElemId, $subElemValue, $indent );
 				}
 
-				if ( !is_null( $subElemContent ) ) {
-					$retval .= $indstr . Xml::element( $elemName, $elemValue, $subElemContent );
-				} elseif ( !count( $indElements ) && !count( $subElements ) ) {
-					$retval .= $indstr . Xml::element( $elemName, $elemValue );
-				} else {
-					$retval .= $indstr . Xml::element( $elemName, $elemValue, null );
-
-					foreach ( $subElements as $subElemId => & $subElemValue ) {
-						$retval .= self::recXmlPrint( $subElemId, $subElemValue, $indent );
-					}
-
-					foreach ( $indElements as &$subElemValue ) {
-						$retval .= self::recXmlPrint( $subElemIndName, $subElemValue, $indent );
-					}
-
-					$retval .= $indstr . Xml::closeElement( $elemName );
+				foreach ( $indElements as &$subElemValue ) {
+					$retval .= self::recXmlPrint( $subElemIndName, $subElemValue, $indent );
 				}
-				break;
-			case 'object':
-				// ignore
-				break;
-			default:
-				// to make sure null value doesn't produce unclosed element,
-				// which is what Xml::element( $elemName, null, null ) returns
-				if ( $elemValue === null ) {
-					$retval .= $indstr . Xml::element( $elemName );
-				} else {
-					$retval .= $indstr . Xml::element( $elemName, null, $elemValue );
-				}
-				break;
+
+				$retval .= $indstr . Xml::closeElement( $elemName );
+			}
+		} elseif ( !is_object( $elemValue ) ) {
+			// to make sure null value doesn't produce unclosed element,
+			// which is what Xml::element( $elemName, null, null ) returns
+			if ( $elemValue === null ) {
+				$retval .= $indstr . Xml::element( $elemName );
+			} else {
+				$retval .= $indstr . Xml::element( $elemName, null, $elemValue );
+			}
 		}
 		return $retval;
 	}
@@ -232,7 +215,6 @@ class ApiFormatXml extends ApiFormatBase {
 
 	public function getAllowedParams() {
 		return array(
-			'xmldoublequote' => false,
 			'xslt' => null,
 			'includexmlnamespace' => false,
 		);
@@ -240,7 +222,6 @@ class ApiFormatXml extends ApiFormatBase {
 
 	public function getParamDescription() {
 		return array(
-			'xmldoublequote' => 'If specified, double quotes all attributes and content',
 			'xslt' => 'If specified, adds <xslt> as stylesheet. This should be a wiki page '
 				. 'in the MediaWiki namespace whose page name ends with ".xsl"',
 			'includexmlnamespace' => 'If specified, adds an XML namespace'
diff --git a/includes/api/ApiImageRotate.php b/includes/api/ApiImageRotate.php
index b2d75825..7a60e831 100644
--- a/includes/api/ApiImageRotate.php
+++ b/includes/api/ApiImageRotate.php
@@ -22,7 +22,6 @@
  */
 
 class ApiImageRotate extends ApiBase {
-
 	private $mPageSet = null;
 
 	public function __construct( $main, $action ) {
@@ -38,31 +37,28 @@ class ApiImageRotate extends ApiBase {
 	 */
 	private static function addValues( array &$result, $values, $flag = null, $name = null ) {
 		foreach ( $values as $val ) {
-			if( $val instanceof Title ) {
+			if ( $val instanceof Title ) {
 				$v = array();
 				ApiQueryBase::addTitleInfo( $v, $val );
-			} elseif( $name !== null ) {
+			} elseif ( $name !== null ) {
 				$v = array( $name => $val );
 			} else {
 				$v = $val;
 			}
-			if( $flag !== null ) {
+			if ( $flag !== null ) {
 				$v[$flag] = '';
 			}
 			$result[] = $v;
 		}
 	}
 
-
 	public function execute() {
 		$params = $this->extractRequestParams();
-		$rotation = $params[ 'rotation' ];
-		$user = $this->getUser();
+		$rotation = $params['rotation'];
 
 		$pageSet = $this->getPageSet();
 		$pageSet->execute();
 
-		$result = array();
 		$result = array();
 
 		self::addValues( $result, $pageSet->getInvalidTitles(), 'invalid', 'title' );
@@ -111,15 +107,17 @@ class ApiImageRotate extends ApiBase {
 				continue;
 			}
 			$ext = strtolower( pathinfo( "$srcPath", PATHINFO_EXTENSION ) );
-			$tmpFile = TempFSFile::factory( 'rotate_', $ext);
+			$tmpFile = TempFSFile::factory( 'rotate_', $ext );
 			$dstPath = $tmpFile->getPath();
 			$err = $handler->rotate( $file, array(
 				"srcPath" => $srcPath,
 				"dstPath" => $dstPath,
-				"rotation"=> $rotation
+				"rotation" => $rotation
 			) );
 			if ( !$err ) {
-				$comment = wfMessage( 'rotate-comment' )->numParams( $rotation )->text();
+				$comment = wfMessage(
+					'rotate-comment'
+				)->numParams( $rotation )->inContentLanguage()->text();
 				$status = $file->upload( $dstPath,
 					$comment, $comment, 0, false, false, $this->getUser() );
 				if ( $status->isGood() ) {
@@ -152,13 +150,14 @@ class ApiImageRotate extends ApiBase {
 
 	/**
 	 * Checks that the user has permissions to perform rotations.
-	 * @param $user User The user to check.
+	 * @param User $user The user to check
+	 * @param Title $title
 	 * @return string|null Permission error message, or null if there is no error
 	 */
 	protected function checkPermissions( $user, $title ) {
 		$permissionErrors = array_merge(
-			$title->getUserPermissionsErrors( 'edit' , $user ),
-			$title->getUserPermissionsErrors( 'upload' , $user )
+			$title->getUserPermissionsErrors( 'edit', $user ),
+			$title->getUserPermissionsErrors( 'upload', $user )
 		);
 
 		if ( $permissionErrors ) {
@@ -179,7 +178,6 @@ class ApiImageRotate extends ApiBase {
 	}
 
 	public function getAllowedParams( $flags = 0 ) {
-		$pageSet = $this->getPageSet();
 		$result = array(
 			'rotation' => array(
 				ApiBase::PARAM_TYPE => array( '90', '180', '270' ),
@@ -198,7 +196,7 @@ class ApiImageRotate extends ApiBase {
 
 	public function getParamDescription() {
 		$pageSet = $this->getPageSet();
-		return $pageSet->getParamDescription() + array(
+		return $pageSet->getFinalParamDescription() + array(
 			'rotation' => 'Degrees to rotate image clockwise',
 			'token' => 'Edit token. You can get one of these through action=tokens',
 		);
@@ -220,7 +218,7 @@ class ApiImageRotate extends ApiBase {
 		$pageSet = $this->getPageSet();
 		return array_merge(
 			parent::getPossibleErrors(),
-			$pageSet->getPossibleErrors()
+			$pageSet->getFinalPossibleErrors()
 		);
 	}
 
diff --git a/includes/api/ApiImport.php b/includes/api/ApiImport.php
index 1f0a5fab..f48a822e 100644
--- a/includes/api/ApiImport.php
+++ b/includes/api/ApiImport.php
@@ -57,7 +57,7 @@ class ApiImport extends ApiBase {
 			$source = ImportStreamSource::newFromUpload( 'xml' );
 		}
 		if ( !$source->isOK() ) {
-			$this->dieUsageMsg( $source->getErrorsArray() );
+			$this->dieStatus( $source );
 		}
 
 		$importer = new WikiImporter( $source->value );
@@ -66,8 +66,8 @@ class ApiImport extends ApiBase {
 		}
 		if ( isset( $params['rootpage'] ) ) {
 			$statusRootPage = $importer->setTargetRootPage( $params['rootpage'] );
-			if( !$statusRootPage->isGood() ) {
-				$this->dieUsageMsg( $statusRootPage->getErrorsArray() );
+			if ( !$statusRootPage->isGood() ) {
+				$this->dieStatus( $statusRootPage );
 			}
 		}
 		$reporter = new ApiImportReporter(
diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php
index 7b2fd914..c11f16cb 100644
--- a/includes/api/ApiMain.php
+++ b/includes/api/ApiMain.php
@@ -83,7 +83,7 @@ class ApiMain extends ApiBase {
 		'import' => 'ApiImport',
 		'userrights' => 'ApiUserrights',
 		'options' => 'ApiOptions',
-		'imagerotate' =>'ApiImageRotate',
+		'imagerotate' => 'ApiImageRotate',
 	);
 
 	/**
@@ -274,7 +274,7 @@ class ApiMain extends ApiBase {
 			return;
 		}
 
-		if ( !User::groupHasPermission( '*', 'read' ) ) {
+		if ( !User::isEveryoneAllowed( 'read' ) ) {
 			// Private wiki, only private headers
 			if ( $mode !== 'private' ) {
 				wfDebug( __METHOD__ . ": ignoring request for $mode cache mode, private wiki\n" );
@@ -383,13 +383,8 @@ class ApiMain extends ApiBase {
 			wfRunHooks( 'ApiMain::onException', array( $this, $e ) );
 
 			// Log it
-			if ( $e instanceof MWException && !( $e instanceof UsageException ) ) {
-				global $wgLogExceptionBacktrace;
-				if ( $wgLogExceptionBacktrace ) {
-					wfDebugLog( 'exception', $e->getLogMessage() . "\n" . $e->getTraceAsString() . "\n" );
-				} else {
-					wfDebugLog( 'exception', $e->getLogMessage() );
-				}
+			if ( !( $e instanceof UsageException ) ) {
+				MWExceptionHandler::logException( $e );
 			}
 
 			// Handle any kind of exception by outputting properly formatted error message.
@@ -418,7 +413,7 @@ class ApiMain extends ApiBase {
 		}
 
 		// Log the request whether or not there was an error
-		$this->logRequest( microtime( true ) - $t);
+		$this->logRequest( microtime( true ) - $t );
 
 		// Send cache headers after any code which might generate an error, to
 		// avoid sending public cache headers for errors.
@@ -609,7 +604,7 @@ class ApiMain extends ApiBase {
 
 		$result = $this->getResult();
 		// Printer may not be initialized if the extractRequestParams() fails for the main module
-		if ( !isset ( $this->mPrinter ) ) {
+		if ( !isset( $this->mPrinter ) ) {
 			// The printer has not been created yet. Try to manually get formatter value.
 			$value = $this->getRequest()->getVal( 'format', self::API_DEFAULT_FORMAT );
 			if ( !$this->mModuleMgr->isDefined( $value, 'format' ) ) {
@@ -763,7 +758,7 @@ class ApiMain extends ApiBase {
 	 */
 	protected function checkExecutePermissions( $module ) {
 		$user = $this->getUser();
-		if ( $module->isReadMode() && !User::groupHasPermission( '*', 'read' ) &&
+		if ( $module->isReadMode() && !User::isEveryoneAllowed( 'read' ) &&
 			!$user->isAllowed( 'read' ) )
 		{
 			$this->dieUsageMsg( 'readrequired' );
@@ -782,7 +777,7 @@ class ApiMain extends ApiBase {
 
 		// Allow extensions to stop execution for arbitrary reasons.
 		$message = false;
-		if( !wfRunHooks( 'ApiCheckCanExecute', array( $module, $user, &$message ) ) ) {
+		if ( !wfRunHooks( 'ApiCheckCanExecute', array( $module, $user, &$message ) ) ) {
 			$this->dieUsageMsg( $message );
 		}
 	}
@@ -857,7 +852,7 @@ class ApiMain extends ApiBase {
 			' ' . $request->getMethod() .
 			' ' . wfUrlencode( str_replace( ' ', '_', $this->getUser()->getName() ) ) .
 			' ' . $request->getIP() .
-			' T=' . $milliseconds .'ms';
+			' T=' . $milliseconds . 'ms';
 		foreach ( $this->getParamsUsed() as $name ) {
 			$value = $request->getVal( $name );
 			if ( $value === null ) {
@@ -944,7 +939,7 @@ class ApiMain extends ApiBase {
 			$unusedParams = array_diff( $allParams, $paramsUsed );
 		}
 
-		if( count( $unusedParams ) ) {
+		if ( count( $unusedParams ) ) {
 			$s = count( $unusedParams ) > 1 ? 's' : '';
 			$this->setWarning( "Unrecognized parameter$s: '" . implode( $unusedParams, "', '" ) . "'" );
 		}
@@ -957,7 +952,7 @@ class ApiMain extends ApiBase {
 	 */
 	protected function printResult( $isError ) {
 		global $wgDebugAPI;
-		if( $wgDebugAPI !== false ) {
+		if ( $wgDebugAPI !== false ) {
 			$this->setWarning( 'SECURITY WARNING: $wgDebugAPI is enabled' );
 		}
 
@@ -1002,7 +997,7 @@ class ApiMain extends ApiBase {
 				ApiBase::PARAM_DFLT => 'help',
 				ApiBase::PARAM_TYPE => $this->mModuleMgr->getNames( 'action' )
 			),
-			'maxlag'  => array(
+			'maxlag' => array(
 				ApiBase::PARAM_TYPE => 'integer'
 			),
 			'smaxage' => array(
@@ -1014,7 +1009,7 @@ class ApiMain extends ApiBase {
 				ApiBase::PARAM_DFLT => 0
 			),
 			'requestid' => null,
-			'servedby'  => false,
+			'servedby' => false,
 			'origin' => null,
 		);
 	}
@@ -1042,6 +1037,7 @@ class ApiMain extends ApiBase {
 			'servedby' => 'Include the hostname that served the request in the results. Unconditionally shown on error',
 			'origin' => array(
 				'When accessing the API using a cross-domain AJAX request (CORS), set this to the originating domain.',
+				'This must be included in any pre-flight request, and therefore must be part of the request URI (not the POST body).',
 				'This must match one of the origins in the Origin: header exactly, so it has to be set to something like http://en.wikipedia.org or https://meta.wikimedia.org .',
 				'If this parameter does not match the Origin: header, a 403 response will be returned.',
 				'If this parameter matches the Origin: header and the origin is whitelisted, an Access-Control-Allow-Origin header will be set.',
@@ -1114,7 +1110,7 @@ class ApiMain extends ApiBase {
 		return array(
 			'API developers:',
 			'    Roan Kattouw "<Firstname>.<Lastname>@gmail.com" (lead developer Sep 2007-2009)',
-			'    Victor Vasiliev - vasilvv at gee mail dot com',
+			'    Victor Vasiliev - vasilvv @ gmail . com',
 			'    Bryan Tong Minh - bryan . tongminh @ gmail . com',
 			'    Sam Reed - sam @ reedyboy . net',
 			'    Yuri Astrakhan "<Firstname><Lastname>@gmail.com" (creator, lead developer Sep 2006-Sep 2007, 2012-present)',
@@ -1143,7 +1139,7 @@ class ApiMain extends ApiBase {
 		$this->setHelp();
 		// Get help text from cache if present
 		$key = wfMemcKey( 'apihelp', $this->getModuleName(),
-			SpecialVersion::getVersion( 'nodb' ) );
+			str_replace( ' ', '_', SpecialVersion::getVersion( 'nodb' ) ) );
 		if ( $wgAPICacheHelpTimeout > 0 ) {
 			$cached = $wgMemc->get( $key );
 			if ( $cached ) {
diff --git a/includes/api/ApiMove.php b/includes/api/ApiMove.php
index 3e846e3b..c18036cf 100644
--- a/includes/api/ApiMove.php
+++ b/includes/api/ApiMove.php
@@ -88,7 +88,7 @@ class ApiMove extends ApiBase {
 			$r['redirectcreated'] = '';
 		}
 
-		if( $toTitleExists ) {
+		if ( $toTitleExists ) {
 			$r['moveoverredirect'] = '';
 		}
 
@@ -99,7 +99,7 @@ class ApiMove extends ApiBase {
 			if ( $retval === true ) {
 				$r['talkfrom'] = $fromTalk->getPrefixedText();
 				$r['talkto'] = $toTalk->getPrefixedText();
-				if( $toTalkExists ) {
+				if ( $toTalkExists ) {
 					$r['talkmoveoverredirect'] = '';
 				}
 			} else {
diff --git a/includes/api/ApiOpenSearch.php b/includes/api/ApiOpenSearch.php
index caf361ac..315ace37 100644
--- a/includes/api/ApiOpenSearch.php
+++ b/includes/api/ApiOpenSearch.php
@@ -1,7 +1,5 @@
 <?php
 /**
- *
- *
  * Created on Oct 13, 2006
  *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
@@ -29,8 +27,20 @@
  */
 class ApiOpenSearch extends ApiBase {
 
+	/**
+	 * Override built-in handling of format parameter.
+	 * Only JSON is supported.
+	 *
+	 * @return ApiFormatBase
+	 */
 	public function getCustomPrinter() {
-		return $this->getMain()->createPrinterByName( 'json' );
+		$params = $this->extractRequestParams();
+		$format = $params['format'];
+		$allowed = array( 'json', 'jsonfm' );
+		if ( in_array( $format, $allowed ) ) {
+			return $this->getMain()->createPrinterByName( $format );
+		}
+		return $this->getMain()->createPrinterByName( $allowed[0] );
 	}
 
 	public function execute() {
@@ -94,6 +104,10 @@ class ApiOpenSearch extends ApiBase {
 				ApiBase::PARAM_ISMULTI => true
 			),
 			'suggest' => false,
+			'format' => array(
+				ApiBase::PARAM_DFLT => 'json',
+				ApiBase::PARAM_TYPE => array( 'json', 'jsonfm' ),
+			)
 		);
 	}
 
@@ -103,6 +117,7 @@ class ApiOpenSearch extends ApiBase {
 			'limit' => 'Maximum amount of results to return',
 			'namespace' => 'Namespaces to search',
 			'suggest' => 'Do nothing if $wgEnableOpenSearchSuggest is false',
+			'format' => 'The format of the output',
 		);
 	}
 
diff --git a/includes/api/ApiOptions.php b/includes/api/ApiOptions.php
index 8c996a26..7256066d 100644
--- a/includes/api/ApiOptions.php
+++ b/includes/api/ApiOptions.php
@@ -42,6 +42,10 @@ class ApiOptions extends ApiBase {
 			$this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
 		}
 
+		if ( !$user->isAllowed( 'editmyoptions' ) ) {
+			$this->dieUsage( 'You don\'t have permission to edit your options', 'permissiondenied' );
+		}
+
 		$params = $this->extractRequestParams();
 		$changed = false;
 
@@ -50,7 +54,7 @@ class ApiOptions extends ApiBase {
 		}
 
 		if ( $params['reset'] ) {
-			$user->resetOptions( $params['resetkinds'] );
+			$user->resetOptions( $params['resetkinds'], $this->getContext() );
 			$changed = true;
 		}
 
@@ -83,7 +87,7 @@ class ApiOptions extends ApiBase {
 				case 'registered-checkmatrix':
 					// A key for a multiselect or checkmatrix option.
 					$validation = true;
-					$value = $value !== null ? (bool) $value : null;
+					$value = $value !== null ? (bool)$value : null;
 					break;
 				case 'userjs':
 					// Allow non-default preferences prefixed with 'userjs-', to be set by user scripts
diff --git a/includes/api/ApiPageSet.php b/includes/api/ApiPageSet.php
index 074efe4b..b05cb2b6 100644
--- a/includes/api/ApiPageSet.php
+++ b/includes/api/ApiPageSet.php
@@ -69,6 +69,9 @@ class ApiPageSet extends ApiBase {
 	private $mFakePageId = -1;
 	private $mCacheMode = 'public';
 	private $mRequestedPageFields = array();
+	/**
+	 * @var int
+	 */
 	private $mDefaultNamespace = NS_MAIN;
 
 	/**
@@ -149,7 +152,6 @@ class ApiPageSet extends ApiBase {
 			if ( !$isDryRun ) {
 				$generator->executeGenerator( $this );
 				wfRunHooks( 'APIQueryGeneratorAfterExecute', array( &$generator, &$this ) );
-				$this->resolvePendingRedirects();
 			} else {
 				// Prevent warnings from being reported on these parameters
 				$main = $this->getMain();
@@ -160,6 +162,10 @@ class ApiPageSet extends ApiBase {
 			$generator->profileOut();
 			$this->profileIn();
 
+			if ( !$isDryRun ) {
+				$this->resolvePendingRedirects();
+			}
+
 			if ( !$isQuery ) {
 				// If this pageset is not part of the query, we called profileIn() above
 				$dbSource->profileOut();
@@ -185,7 +191,7 @@ class ApiPageSet extends ApiBase {
 
 			if ( !$isDryRun ) {
 				// Populate page information with the original user input
-				switch( $dataSource ) {
+				switch ( $dataSource ) {
 					case 'titles':
 						$this->initFromTitles( $this->mParams['titles'] );
 						break;
@@ -404,7 +410,7 @@ class ApiPageSet extends ApiBase {
 	 * @return array of raw_prefixed_title (string) => prefixed_title (string)
 	 * @since 1.21
 	 */
-	public function getNormalizedTitlesAsResult( $result = null  ) {
+	public function getNormalizedTitlesAsResult( $result = null ) {
 		$values = array();
 		foreach ( $this->getNormalizedTitles() as $rawTitleStr => $titleStr ) {
 			$values[] = array(
@@ -595,13 +601,13 @@ class ApiPageSet extends ApiBase {
 		}
 
 		foreach ( $this->mRequestedPageFields as $fieldName => &$fieldValues ) {
-			$fieldValues[$pageId] = $row-> $fieldName;
+			$fieldValues[$pageId] = $row->$fieldName;
 		}
 	}
 
 	/**
 	 * Do not use, does nothing, will be removed
-	 * @deprecated 1.21
+	 * @deprecated since 1.21
 	 */
 	public function finishPageSetGeneration() {
 		wfDeprecated( __METHOD__, '1.21' );
@@ -859,7 +865,7 @@ class ApiPageSet extends ApiBase {
 			$from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText();
 			$to = Title::makeTitle( $row->rd_namespace, $row->rd_title, $row->rd_fragment, $row->rd_interwiki );
 			unset( $this->mPendingRedirectIDs[$rdfrom] );
-			if ( !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
+			if ( !$to->isExternal() && !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
 				$lb->add( $row->rd_namespace, $row->rd_title );
 			}
 			$this->mRedirectTitles[$from] = $to;
diff --git a/includes/api/ApiParamInfo.php b/includes/api/ApiParamInfo.php
index 27f8cefd..3e1a7531 100644
--- a/includes/api/ApiParamInfo.php
+++ b/includes/api/ApiParamInfo.php
@@ -149,7 +149,7 @@ class ApiParamInfo extends ApiBase {
 				$item = array();
 				if ( is_numeric( $k ) ) {
 					$retval['examples'] .= $v;
-					$result->setContent( $item, $v );
+					ApiResult::setContent( $item, $v );
 				} else {
 					if ( !is_array( $v ) ) {
 						$item['description'] = $v;
@@ -157,7 +157,7 @@ class ApiParamInfo extends ApiBase {
 						$item['description'] = implode( $v, "\n" );
 					}
 					$retval['examples'] .= $item['description'] . ' ' . $k;
-					$result->setContent( $item, $k );
+					ApiResult::setContent( $item, $k );
 				}
 				$retval['allexamples'][] = $item;
 			}
@@ -300,7 +300,7 @@ class ApiParamInfo extends ApiBase {
 		}
 
 		// Errors
-		$retval['errors'] = $this->parseErrors( $obj->getPossibleErrors() );
+		$retval['errors'] = $this->parseErrors( $obj->getFinalPossibleErrors() );
 		$result->setIndexedTagName( $retval['errors'], 'error' );
 
 		return $retval;
diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php
index 09b7a882..a369994b 100644
--- a/includes/api/ApiParse.php
+++ b/includes/api/ApiParse.php
@@ -44,6 +44,14 @@ class ApiParse extends ApiBase {
 		$params = $this->extractRequestParams();
 		$text = $params['text'];
 		$title = $params['title'];
+		if ( $title === null ) {
+			$titleProvided = false;
+			// A title is needed for parsing, so arbitrarily choose one
+			$title = 'API';
+		} else {
+			$titleProvided = true;
+		}
+
 		$page = $params['page'];
 		$pageid = $params['pageid'];
 		$oldid = $params['oldid'];
@@ -51,7 +59,7 @@ class ApiParse extends ApiBase {
 		$model = $params['contentmodel'];
 		$format = $params['contentformat'];
 
-		if ( !is_null( $page ) && ( !is_null( $text ) || $title != 'API' ) ) {
+		if ( !is_null( $page ) && ( !is_null( $text ) || $titleProvided ) ) {
 			$this->dieUsage( 'The page parameter cannot be used together with the text and title parameters', 'params' );
 		}
 
@@ -94,8 +102,7 @@ class ApiParse extends ApiBase {
 				$titleObj = $rev->getTitle();
 				$wgTitle = $titleObj;
 				$pageObj = WikiPage::factory( $titleObj );
-				$popts = $pageObj->makeParserOptions( $this->getContext() );
-				$popts->enableLimitReport( !$params['disablepp'] );
+				$popts = $this->makeParserOptions( $pageObj, $params );
 
 				// If for some reason the "oldid" is actually the current revision, it may be cached
 				if ( $rev->isCurrent() ) {
@@ -152,8 +159,7 @@ class ApiParse extends ApiBase {
 					$oldid = $pageObj->getLatest();
 				}
 
-				$popts = $pageObj->makeParserOptions( $this->getContext() );
-				$popts->enableLimitReport( !$params['disablepp'] );
+				$popts = $this->makeParserOptions( $pageObj, $params );
 
 				// Potentially cached
 				$p_result = $this->getParsedContent( $pageObj, $popts, $pageid,
@@ -170,11 +176,24 @@ class ApiParse extends ApiBase {
 			$wgTitle = $titleObj;
 			$pageObj = WikiPage::factory( $titleObj );
 
-			$popts = $pageObj->makeParserOptions( $this->getContext() );
-			$popts->enableLimitReport( !$params['disablepp'] );
+			$popts = $this->makeParserOptions( $pageObj, $params );
 
 			if ( is_null( $text ) ) {
-				$this->dieUsage( 'The text parameter should be passed with the title parameter. Should you be using the "page" parameter instead?', 'params' );
+				if ( $titleProvided && ( $prop || $params['generatexml'] ) ) {
+					$this->setWarning(
+						"'title' used without 'text', and parsed page properties were requested " .
+						"(did you mean to use 'page' instead of 'title'?)"
+					);
+				}
+				// Prevent warning from ContentHandler::makeContent()
+				$text = '';
+			}
+
+			// If we are parsing text, do not use the content model of the default
+			// API title, but default to wikitext to keep BC.
+			if ( !$titleProvided && is_null( $model ) ) {
+				$model = CONTENT_MODEL_WIKITEXT;
+				$this->setWarning( "No 'title' or 'contentmodel' was given, assuming $model." );
 			}
 
 			try {
@@ -194,10 +213,10 @@ class ApiParse extends ApiBase {
 				// Build a result and bail out
 				$result_array = array();
 				$result_array['text'] = array();
-				$result->setContent( $result_array['text'], $this->pstContent->serialize( $format ) );
+				ApiResult::setContent( $result_array['text'], $this->pstContent->serialize( $format ) );
 				if ( isset( $prop['wikitext'] ) ) {
 					$result_array['wikitext'] = array();
-					$result->setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
+					ApiResult::setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
 				}
 				$result->addValue( null, $this->getModuleName(), $result_array );
 				return;
@@ -225,21 +244,35 @@ class ApiParse extends ApiBase {
 
 		if ( isset( $prop['text'] ) ) {
 			$result_array['text'] = array();
-			$result->setContent( $result_array['text'], $p_result->getText() );
+			ApiResult::setContent( $result_array['text'], $p_result->getText() );
 		}
 
 		if ( !is_null( $params['summary'] ) ) {
 			$result_array['parsedsummary'] = array();
-			$result->setContent( $result_array['parsedsummary'], Linker::formatComment( $params['summary'], $titleObj ) );
+			ApiResult::setContent( $result_array['parsedsummary'], Linker::formatComment( $params['summary'], $titleObj ) );
+		}
+
+		if ( isset( $prop['langlinks'] ) || isset( $prop['languageshtml'] ) ) {
+			$langlinks = $p_result->getLanguageLinks();
+
+			if ( $params['effectivelanglinks'] ) {
+				// Link flags are ignored for now, but may in the future be
+				// included in the result.
+				$linkFlags = array();
+				wfRunHooks( 'LanguageLinks', array( $titleObj, &$langlinks, &$linkFlags ) );
+			}
+		} else {
+			$langlinks = false;
 		}
 
 		if ( isset( $prop['langlinks'] ) ) {
-			$result_array['langlinks'] = $this->formatLangLinks( $p_result->getLanguageLinks() );
+			$result_array['langlinks'] = $this->formatLangLinks( $langlinks );
 		}
 		if ( isset( $prop['languageshtml'] ) ) {
-			$languagesHtml = $this->languagesHtml( $p_result->getLanguageLinks() );
+			$languagesHtml = $this->languagesHtml( $langlinks );
+
 			$result_array['languageshtml'] = array();
-			$result->setContent( $result_array['languageshtml'], $languagesHtml );
+			ApiResult::setContent( $result_array['languageshtml'], $languagesHtml );
 		}
 		if ( isset( $prop['categories'] ) ) {
 			$result_array['categories'] = $this->formatCategoryLinks( $p_result->getCategories() );
@@ -247,7 +280,7 @@ class ApiParse extends ApiBase {
 		if ( isset( $prop['categorieshtml'] ) ) {
 			$categoriesHtml = $this->categoriesHtml( $p_result->getCategories() );
 			$result_array['categorieshtml'] = array();
-			$result->setContent( $result_array['categorieshtml'], $categoriesHtml );
+			ApiResult::setContent( $result_array['categorieshtml'], $categoriesHtml );
 		}
 		if ( isset( $prop['links'] ) ) {
 			$result_array['links'] = $this->formatLinks( $p_result->getLinks() );
@@ -288,7 +321,7 @@ class ApiParse extends ApiBase {
 
 			if ( isset( $prop['headhtml'] ) ) {
 				$result_array['headhtml'] = array();
-				$result->setContent( $result_array['headhtml'], $context->getOutput()->headElement( $context->getSkin() ) );
+				ApiResult::setContent( $result_array['headhtml'], $context->getOutput()->headElement( $context->getSkin() ) );
 			}
 		}
 
@@ -298,10 +331,10 @@ class ApiParse extends ApiBase {
 
 		if ( isset( $prop['wikitext'] ) ) {
 			$result_array['wikitext'] = array();
-			$result->setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
+			ApiResult::setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
 			if ( !is_null( $this->pstContent ) ) {
 				$result_array['psttext'] = array();
-				$result->setContent( $result_array['psttext'], $this->pstContent->serialize( $format ) );
+				ApiResult::setContent( $result_array['psttext'], $this->pstContent->serialize( $format ) );
 			}
 		}
 		if ( isset( $prop['properties'] ) ) {
@@ -321,7 +354,7 @@ class ApiParse extends ApiBase {
 				$xml = $dom->__toString();
 			}
 			$result_array['parsetree'] = array();
-			$result->setContent( $result_array['parsetree'], $xml );
+			ApiResult::setContent( $result_array['parsetree'], $xml );
 		}
 
 		$result_mapping = array(
@@ -345,6 +378,26 @@ class ApiParse extends ApiBase {
 		}
 	}
 
+	/**
+	 * Constructs a ParserOptions object
+	 *
+	 * @param WikiPage $pageObj
+	 * @param array $params
+	 *
+	 * @return ParserOptions
+	 */
+	protected function makeParserOptions( WikiPage $pageObj, array $params ) {
+		wfProfileIn( __METHOD__ );
+
+		$popts = $pageObj->makeParserOptions( $this->getContext() );
+		$popts->enableLimitReport( !$params['disablepp'] );
+		$popts->setIsPreview( $params['preview'] || $params['sectionpreview'] );
+		$popts->setIsSectionPreview( $params['sectionpreview'] );
+
+		wfProfileOut( __METHOD__ );
+		return $popts;
+	}
+
 	/**
 	 * @param $page WikiPage
 	 * @param $popts ParserOptions
@@ -400,7 +453,7 @@ class ApiParse extends ApiBase {
 			if ( $title ) {
 				$entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
 			}
-			$this->getResult()->setContent( $entry, $bits[1] );
+			ApiResult::setContent( $entry, $bits[1] );
 			$result[] = $entry;
 		}
 		return $result;
@@ -411,7 +464,7 @@ class ApiParse extends ApiBase {
 		foreach ( $links as $link => $sortkey ) {
 			$entry = array();
 			$entry['sortkey'] = $sortkey;
-			$this->getResult()->setContent( $entry, $link );
+			ApiResult::setContent( $entry, $link );
 			$result[] = $entry;
 		}
 		return $result;
@@ -465,7 +518,7 @@ class ApiParse extends ApiBase {
 			foreach ( $nslinks as $title => $id ) {
 				$entry = array();
 				$entry['ns'] = $ns;
-				$this->getResult()->setContent( $entry, Title::makeTitle( $ns, $title )->getFullText() );
+				ApiResult::setContent( $entry, Title::makeTitle( $ns, $title )->getFullText() );
 				if ( $id != 0 ) {
 					$entry['exists'] = '';
 				}
@@ -487,7 +540,7 @@ class ApiParse extends ApiBase {
 					$entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
 				}
 
-				$this->getResult()->setContent( $entry, $title->getFullText() );
+				ApiResult::setContent( $entry, $title->getFullText() );
 				$result[] = $entry;
 			}
 		}
@@ -499,7 +552,7 @@ class ApiParse extends ApiBase {
 		foreach ( $headItems as $tag => $content ) {
 			$entry = array();
 			$entry['tag'] = $tag;
-			$this->getResult()->setContent( $entry, $content );
+			ApiResult::setContent( $entry, $content );
 			$result[] = $entry;
 		}
 		return $result;
@@ -510,7 +563,7 @@ class ApiParse extends ApiBase {
 		foreach ( $properties as $name => $value ) {
 			$entry = array();
 			$entry['name'] = $name;
-			$this->getResult()->setContent( $entry, $value );
+			ApiResult::setContent( $entry, $value );
 			$result[] = $entry;
 		}
 		return $result;
@@ -521,7 +574,7 @@ class ApiParse extends ApiBase {
 		foreach ( $css as $file => $link ) {
 			$entry = array();
 			$entry['file'] = $file;
-			$this->getResult()->setContent( $entry, $link );
+			ApiResult::setContent( $entry, $link );
 			$result[] = $entry;
 		}
 		return $result;
@@ -537,9 +590,7 @@ class ApiParse extends ApiBase {
 
 	public function getAllowedParams() {
 		return array(
-			'title' => array(
-				ApiBase::PARAM_DFLT => 'API',
-			),
+			'title' => null,
 			'text' => null,
 			'summary' => null,
 			'page' => null,
@@ -575,10 +626,13 @@ class ApiParse extends ApiBase {
 			),
 			'pst' => false,
 			'onlypst' => false,
+			'effectivelanglinks' => false,
 			'uselang' => null,
 			'section' => null,
 			'disablepp' => false,
 			'generatexml' => false,
+			'preview' => false,
+			'sectionpreview' => false,
 			'contentformat' => array(
 				ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
 			),
@@ -590,11 +644,13 @@ class ApiParse extends ApiBase {
 
 	public function getParamDescription() {
 		$p = $this->getModulePrefix();
+		$wikitext = CONTENT_MODEL_WIKITEXT;
 		return array(
-			'text' => 'Wikitext to parse',
+			'text' => "Text to parse. Use {$p}title or {$p}contentmodel to control the content model",
 			'summary' => 'Summary to parse',
 			'redirects' => "If the {$p}page or the {$p}pageid parameter is set to a redirect, resolve it",
-			'title' => 'Title of page the text belongs to',
+			'title' => "Title of page the text belongs to. " .
+				"If omitted, \"API\" is used as the title with content model $wikitext",
 			'page' => "Parse the content of this page. Cannot be used together with {$p}text and {$p}title",
 			'pageid' => "Parse the content of this page. Overrides {$p}page",
 			'oldid' => "Parse the content of this revision. Overrides {$p}page and {$p}pageid",
@@ -618,34 +674,52 @@ class ApiParse extends ApiBase {
 				' wikitext       - Gives the original wikitext that was parsed',
 				' properties     - Gives various properties defined in the parsed wikitext',
 			),
+			'effectivelanglinks' => array(
+				'Includes language links supplied by extensions',
+				'(for use with prop=langlinks|languageshtml)',
+			),
 			'pst' => array(
 				'Do a pre-save transform on the input before parsing it',
-				'Ignored if page, pageid or oldid is used'
+				"Only valid when used with {$p}text",
 			),
 			'onlypst' => array(
 				'Do a pre-save transform (PST) on the input, but don\'t parse it',
-				'Returns the same wikitext, after a PST has been applied. Ignored if page, pageid or oldid is used'
+				'Returns the same wikitext, after a PST has been applied.',
+				"Only valid when used with {$p}text",
 			),
 			'uselang' => 'Which language to parse the request in',
 			'section' => 'Only retrieve the content of this section number',
 			'disablepp' => 'Disable the PP Report from the parser output',
-			'generatexml' => 'Generate XML parse tree (requires prop=wikitext)',
-			'contentformat' => 'Content serialization format used for the input text',
-			'contentmodel' => 'Content model of the new content',
+			'generatexml' => "Generate XML parse tree (requires contentmodel=$wikitext)",
+			'preview' => 'Parse in preview mode',
+			'sectionpreview' => 'Parse in section preview mode (enables preview mode too)',
+			'contentformat' => array(
+				'Content serialization format used for the input text',
+				"Only valid when used with {$p}text",
+			),
+			'contentmodel' => array(
+				"Content model of the input text. Default is the model of the " .
+				"specified ${p}title, or $wikitext if ${p}title is not specified",
+				"Only valid when used with {$p}text",
+			),
 		);
 	}
 
 	public function getDescription() {
+		$p = $this->getModulePrefix();
 		return array(
-			'Parses wikitext and returns parser output',
+			'Parses content and returns parser output',
 			'See the various prop-Modules of action=query to get information from the current version of a page',
+			'There are several ways to specify the text to parse:',
+			"1) Specify a page or revision, using {$p}page, {$p}pageid, or {$p}oldid.",
+			"2) Specify content explicitly, using {$p}text, {$p}title, and {$p}contentmodel.",
+			"3) Specify only a summary to parse. {$p}prop should be given an empty value.",
 		);
 	}
 
 	public function getPossibleErrors() {
 		return array_merge( parent::getPossibleErrors(), array(
 			array( 'code' => 'params', 'info' => 'The page parameter cannot be used together with the text and title parameters' ),
-			array( 'code' => 'params', 'info' => 'The text parameter should be passed with the title parameter. Should you be using the "page" parameter instead?' ),
 			array( 'code' => 'missingrev', 'info' => 'There is no revision ID oldid' ),
 			array( 'code' => 'permissiondenied', 'info' => 'You don\'t have permission to view deleted revisions' ),
 			array( 'code' => 'missingtitle', 'info' => 'The page you specified doesn\'t exist' ),
@@ -660,7 +734,10 @@ class ApiParse extends ApiBase {
 
 	public function getExamples() {
 		return array(
-			'api.php?action=parse&text={{Project:Sandbox}}'
+			'api.php?action=parse&page=Project:Sandbox' => 'Parse a page',
+			'api.php?action=parse&text={{Project:Sandbox}}' => 'Parse wikitext',
+			'api.php?action=parse&text={{PAGENAME}}&title=Test' => 'Parse wikitext, specifying the page title',
+			'api.php?action=parse&summary=Some+[[link]]&prop=' => 'Parse a summary',
 		);
 	}
 
diff --git a/includes/api/ApiPatrol.php b/includes/api/ApiPatrol.php
index 4d4fbba9..bd2fde2b 100644
--- a/includes/api/ApiPatrol.php
+++ b/includes/api/ApiPatrol.php
@@ -35,11 +35,27 @@ class ApiPatrol extends ApiBase {
 	 */
 	public function execute() {
 		$params = $this->extractRequestParams();
-
-		$rc = RecentChange::newFromID( $params['rcid'] );
-		if ( !$rc instanceof RecentChange ) {
-			$this->dieUsageMsg( array( 'nosuchrcid', $params['rcid'] ) );
+		$this->requireOnlyOneParameter( $params, 'rcid', 'revid' );
+
+		if ( isset( $params['rcid'] ) ) {
+			$rc = RecentChange::newFromID( $params['rcid'] );
+			if ( !$rc ) {
+				$this->dieUsageMsg( array( 'nosuchrcid', $params['rcid'] ) );
+			}
+		} else {
+			$rev = Revision::newFromId( $params['revid'] );
+			if ( !$rev ) {
+				$this->dieUsageMsg( array( 'nosuchrevid', $params['revid'] ) );
+			}
+			$rc = $rev->getRecentChange();
+			if ( !$rc ) {
+				$this->dieUsage(
+					'The revision ' . $params['revid'] . " can't be patrolled as it's too old",
+					'notpatrollable'
+				);
+			}
 		}
+
 		$retval = $rc->doMarkPatrolled( $this->getUser() );
 
 		if ( $retval ) {
@@ -66,8 +82,10 @@ class ApiPatrol extends ApiBase {
 				ApiBase::PARAM_REQUIRED => true
 			),
 			'rcid' => array(
-				ApiBase::PARAM_TYPE => 'integer',
-				ApiBase::PARAM_REQUIRED => true
+				ApiBase::PARAM_TYPE => 'integer'
+			),
+			'revid' => array(
+				ApiBase::PARAM_TYPE => 'integer'
 			),
 		);
 	}
@@ -76,6 +94,7 @@ class ApiPatrol extends ApiBase {
 		return array(
 			'token' => 'Patrol token obtained from list=recentchanges',
 			'rcid' => 'Recentchanges ID to patrol',
+			'revid' => 'Revision ID to patrol',
 		);
 	}
 
@@ -94,8 +113,16 @@ class ApiPatrol extends ApiBase {
 	}
 
 	public function getPossibleErrors() {
-		return array_merge( parent::getPossibleErrors(), array(
-			array( 'nosuchrcid', 'rcid' ),
+		return array_merge(
+			parent::getPossibleErrors(),
+			parent::getRequireOnlyOneParameterErrorMessages( array( 'rcid', 'revid' ) ),
+			array(
+				array( 'nosuchrcid', 'rcid' ),
+				array( 'nosuchrevid', 'revid' ),
+				array(
+					'code' => 'notpatrollable',
+					'info' => "The revision can't be patrolled as it's too old"
+				)
 		) );
 	}
 
@@ -109,7 +136,8 @@ class ApiPatrol extends ApiBase {
 
 	public function getExamples() {
 		return array(
-			'api.php?action=patrol&token=123abc&rcid=230672766'
+			'api.php?action=patrol&token=123abc&rcid=230672766',
+			'api.php?action=patrol&token=123abc&revid=230672766'
 		);
 	}
 
diff --git a/includes/api/ApiProtect.php b/includes/api/ApiProtect.php
index 503c6920..7830c8b4 100644
--- a/includes/api/ApiProtect.php
+++ b/includes/api/ApiProtect.php
@@ -103,8 +103,7 @@ class ApiProtect extends ApiBase {
 		$status = $pageObj->doUpdateRestrictions( $protections, $expiryarray, $cascade, $params['reason'], $this->getUser() );
 
 		if ( !$status->isOK() ) {
-			$errors = $status->getErrorsArray();
-			$this->dieUsageMsg( $errors[0] );
+			$this->dieStatus( $status );
 		}
 		$res = array(
 			'title' => $titleObj->getPrefixedText(),
diff --git a/includes/api/ApiPurge.php b/includes/api/ApiPurge.php
index 134f4a0d..0812ba51 100644
--- a/includes/api/ApiPurge.php
+++ b/includes/api/ApiPurge.php
@@ -42,15 +42,15 @@ class ApiPurge extends ApiBase {
 	 */
 	private static function addValues( array &$result, $values, $flag = null, $name = null ) {
 		foreach ( $values as $val ) {
-			if( $val instanceof Title ) {
+			if ( $val instanceof Title ) {
 				$v = array();
 				ApiQueryBase::addTitleInfo( $v, $val );
-			} elseif( $name !== null ) {
+			} elseif ( $name !== null ) {
 				$v = array( $name => $val );
 			} else {
 				$v = $val;
 			}
-			if( $flag !== null ) {
+			if ( $flag !== null ) {
 				$v[$flag] = '';
 			}
 			$result[] = $v;
@@ -64,6 +64,7 @@ class ApiPurge extends ApiBase {
 		$params = $this->extractRequestParams();
 
 		$forceLinkUpdate = $params['forcelinkupdate'];
+		$forceRecursiveLinkUpdate = $params['forcerecursivelinkupdate'];
 		$pageSet = $this->getPageSet();
 		$pageSet->execute();
 
@@ -82,8 +83,8 @@ class ApiPurge extends ApiBase {
 			$page->doPurge(); // Directly purge and skip the UI part of purge().
 			$r['purged'] = '';
 
-			if ( $forceLinkUpdate ) {
-				if ( !$this->getUser()->pingLimiter() ) {
+			if ( $forceLinkUpdate || $forceRecursiveLinkUpdate ) {
+				if ( !$this->getUser()->pingLimiter( 'linkpurge' ) ) {
 					global $wgEnableParserCache;
 
 					$popts = $page->makeParserOptions( 'canonical' );
@@ -93,7 +94,8 @@ class ApiPurge extends ApiBase {
 					$p_result = $content->getParserOutput( $title, $page->getLatest(), $popts, $wgEnableParserCache );
 
 					# Update the links tables
-					$updates = $content->getSecondaryDataUpdates( $title, null, true, $p_result );
+					$updates = $content->getSecondaryDataUpdates(
+						$title, null, $forceRecursiveLinkUpdate, $p_result );
 					DataUpdate::runUpdates( $updates );
 
 					$r['linkupdate'] = '';
@@ -150,7 +152,10 @@ class ApiPurge extends ApiBase {
 	}
 
 	public function getAllowedParams( $flags = 0 ) {
-		$result = array( 'forcelinkupdate' => false );
+		$result = array(
+			'forcelinkupdate' => false,
+			'forcerecursivelinkupdate' => false
+		);
 		if ( $flags ) {
 			$result += $this->getPageSet()->getFinalParams( $flags );
 		}
@@ -158,8 +163,12 @@ class ApiPurge extends ApiBase {
 	}
 
 	public function getParamDescription() {
-		return $this->getPageSet()->getParamDescription()
-			+ array( 'forcelinkupdate' => 'Update the links tables' );
+		return $this->getPageSet()->getFinalParamDescription()
+			+ array(
+				'forcelinkupdate' => 'Update the links tables',
+				'forcerecursivelinkupdate' => 'Update the links table, and update ' .
+					'the links tables for any page that uses this page as a template',
+			);
 	}
 
 	public function getResultProperties() {
@@ -204,7 +213,7 @@ class ApiPurge extends ApiBase {
 	public function getPossibleErrors() {
 		return array_merge(
 			parent::getPossibleErrors(),
-			$this->getPageSet()->getPossibleErrors()
+			$this->getPageSet()->getFinalPossibleErrors()
 		);
 	}
 
diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php
index f69ad234..e03837fc 100644
--- a/includes/api/ApiQuery.php
+++ b/includes/api/ApiQuery.php
@@ -64,6 +64,7 @@ class ApiQuery extends ApiBase {
 	 */
 	private static $QueryListModules = array(
 		'allcategories' => 'ApiQueryAllCategories',
+		'allfileusages' => 'ApiQueryAllLinks',
 		'allimages' => 'ApiQueryAllImages',
 		'alllinks' => 'ApiQueryAllLinks',
 		'allpages' => 'ApiQueryAllPages',
@@ -102,6 +103,7 @@ class ApiQuery extends ApiBase {
 		'allmessages' => 'ApiQueryAllMessages',
 		'siteinfo' => 'ApiQuerySiteinfo',
 		'userinfo' => 'ApiQueryUserInfo',
+		'filerepoinfo' => 'ApiQueryFileRepoInfo',
 	);
 
 	/**
@@ -382,7 +384,6 @@ class ApiQuery extends ApiBase {
 		$modules = $allModules;
 		$tmp = $completeModules;
 		$wasPosted = $this->getRequest()->wasPosted();
-		$main = $this->getMain();
 
 		/** @var $module ApiQueryBase */
 		foreach ( $allModules as $moduleName => $module ) {
@@ -513,7 +514,7 @@ class ApiQuery extends ApiBase {
 			ApiQueryBase::addTitleInfo( $vals, $title );
 			$vals['special'] = '';
 			if ( $title->isSpecialPage() &&
-					!SpecialPageFactory::exists( $title->getDbKey() ) ) {
+					!SpecialPageFactory::exists( $title->getDBkey() ) ) {
 				$vals['missing'] = '';
 			} elseif ( $title->getNamespace() == NS_MEDIA &&
 					!wfFindFile( $title ) ) {
@@ -697,7 +698,7 @@ class ApiQuery extends ApiBase {
 	}
 
 	public function getParamDescription() {
-		return $this->getPageSet()->getParamDescription() + array(
+		return $this->getPageSet()->getFinalParamDescription() + array(
 			'prop' => 'Which properties to get for the titles/revisions/pageids. Module help is available below',
 			'list' => 'Which lists to get. Module help is available below',
 			'meta' => 'Which metadata to get about the site. Module help is available below',
@@ -723,7 +724,7 @@ class ApiQuery extends ApiBase {
 	public function getPossibleErrors() {
 		return array_merge(
 			parent::getPossibleErrors(),
-			$this->getPageSet()->getPossibleErrors()
+			$this->getPageSet()->getFinalPossibleErrors()
 		);
 	}
 
@@ -736,6 +737,7 @@ class ApiQuery extends ApiBase {
 
 	public function getHelpUrls() {
 		return array(
+			'https://www.mediawiki.org/wiki/API:Query',
 			'https://www.mediawiki.org/wiki/API:Meta',
 			'https://www.mediawiki.org/wiki/API:Properties',
 			'https://www.mediawiki.org/wiki/API:Lists',
diff --git a/includes/api/ApiQueryAllCategories.php b/includes/api/ApiQueryAllCategories.php
index 496a0eb8..3f5c6ee7 100644
--- a/includes/api/ApiQueryAllCategories.php
+++ b/includes/api/ApiQueryAllCategories.php
@@ -76,7 +76,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
 		if ( $dir == 'newer' ) {
 			$this->addWhereRange( 'cat_pages', 'newer', $min, $max );
 		} else {
-			$this->addWhereRange( 'cat_pages', 'older', $max, $min);
+			$this->addWhereRange( 'cat_pages', 'older', $max, $min );
 		}
 
 		if ( isset( $params['prefix'] ) ) {
@@ -121,7 +121,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
 				$pages[] = $titleObj;
 			} else {
 				$item = array();
-				$result->setContent( $item, $titleObj->getText() );
+				ApiResult::setContent( $item, $titleObj->getText() );
 				if ( isset( $prop['size'] ) ) {
 					$item['size'] = intval( $row->cat_pages );
 					$item['pages'] = $row->cat_pages - $row->cat_subcats - $row->cat_files;
diff --git a/includes/api/ApiQueryAllImages.php b/includes/api/ApiQueryAllImages.php
index e24b162c..ccc7a3a2 100644
--- a/includes/api/ApiQueryAllImages.php
+++ b/includes/api/ApiQueryAllImages.php
@@ -189,7 +189,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
 		if ( !is_null( $params['mime'] ) ) {
 			global $wgMiserMode;
-			if ( $wgMiserMode  ) {
+			if ( $wgMiserMode ) {
 				$this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
 			}
 
@@ -260,7 +260,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 	}
 
 	public function getAllowedParams() {
-		return array (
+		return array(
 			'sort' => array(
 				ApiBase::PARAM_DFLT => 'name',
 				ApiBase::PARAM_TYPE => array(
diff --git a/includes/api/ApiQueryAllLinks.php b/includes/api/ApiQueryAllLinks.php
index e355f8b0..47d1bcef 100644
--- a/includes/api/ApiQueryAllLinks.php
+++ b/includes/api/ApiQueryAllLinks.php
@@ -37,24 +37,41 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
 				$prefix = 'al';
 				$this->table = 'pagelinks';
 				$this->tablePrefix = 'pl_';
+				$this->fieldTitle = 'title';
 				$this->dfltNamespace = NS_MAIN;
+				$this->hasNamespace = true;
 				$this->indexTag = 'l';
 				$this->description = 'Enumerate all links that point to a given namespace';
-				$this->descriptionLink = 'link';
-				$this->descriptionLinked = 'linked';
+				$this->descriptionWhat = 'link';
+				$this->descriptionTargets = 'linked titles';
 				$this->descriptionLinking = 'linking';
 				break;
 			case 'alltransclusions':
 				$prefix = 'at';
 				$this->table = 'templatelinks';
 				$this->tablePrefix = 'tl_';
+				$this->fieldTitle = 'title';
 				$this->dfltNamespace = NS_TEMPLATE;
+				$this->hasNamespace = true;
 				$this->indexTag = 't';
 				$this->description = 'List all transclusions (pages embedded using {{x}}), including non-existing';
-				$this->descriptionLink = 'transclusion';
-				$this->descriptionLinked = 'transcluded';
+				$this->descriptionWhat = 'transclusion';
+				$this->descriptionTargets = 'transcluded titles';
 				$this->descriptionLinking = 'transcluding';
 				break;
+			case 'allfileusages':
+				$prefix = 'af';
+				$this->table = 'imagelinks';
+				$this->tablePrefix = 'il_';
+				$this->fieldTitle = 'to';
+				$this->dfltNamespace = NS_FILE;
+				$this->hasNamespace = false;
+				$this->indexTag = 'f';
+				$this->description = 'List all file usages, including non-existing';
+				$this->descriptionWhat = 'file';
+				$this->descriptionTargets = 'file titles';
+				$this->descriptionLinking = 'using';
+				break;
 			default:
 				ApiBase::dieDebug( __METHOD__, 'Unknown module name' );
 		}
@@ -83,21 +100,29 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
 		$params = $this->extractRequestParams();
 
 		$pfx = $this->tablePrefix;
+		$fieldTitle = $this->fieldTitle;
 		$prop = array_flip( $params['prop'] );
 		$fld_ids = isset( $prop['ids'] );
 		$fld_title = isset( $prop['title'] );
+		if ( $this->hasNamespace ) {
+			$namespace = $params['namespace'];
+		} else {
+			$namespace = $this->dfltNamespace;
+		}
 
 		if ( $params['unique'] ) {
 			if ( $fld_ids ) {
 				$this->dieUsage(
-					"{$this->getModuleName()} cannot return corresponding page ids in unique {$this->descriptionLink}s mode",
+					"{$this->getModuleName()} cannot return corresponding page ids in unique {$this->descriptionWhat}s mode",
 					'params' );
 			}
 			$this->addOption( 'DISTINCT' );
 		}
 
 		$this->addTables( $this->table );
-		$this->addWhereFld( $pfx . 'namespace', $params['namespace'] );
+		if ( $this->hasNamespace ) {
+			$this->addWhereFld( $pfx . 'namespace', $namespace );
+		}
 
 		$continue = !is_null( $params['continue'] );
 		if ( $continue ) {
@@ -106,14 +131,14 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
 			if ( $params['unique'] ) {
 				$this->dieContinueUsageIf( count( $continueArr ) != 1 );
 				$continueTitle = $db->addQuotes( $continueArr[0] );
-				$this->addWhere( "{$pfx}title $op= $continueTitle" );
+				$this->addWhere( "{$pfx}{$fieldTitle} $op= $continueTitle" );
 			} else {
 				$this->dieContinueUsageIf( count( $continueArr ) != 2 );
 				$continueTitle = $db->addQuotes( $continueArr[0] );
 				$continueFrom = intval( $continueArr[1] );
 				$this->addWhere(
-					"{$pfx}title $op $continueTitle OR " .
-					"({$pfx}title = $continueTitle AND " .
+					"{$pfx}{$fieldTitle} $op $continueTitle OR " .
+					"({$pfx}{$fieldTitle} = $continueTitle AND " .
 					"{$pfx}from $op= $continueFrom)"
 				);
 			}
@@ -122,22 +147,24 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
 		// 'continue' always overrides 'from'
 		$from = ( $continue || is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
 		$to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
-		$this->addWhereRange( $pfx . 'title', 'newer', $from, $to );
+		$this->addWhereRange( $pfx . $fieldTitle, 'newer', $from, $to );
 
 		if ( isset( $params['prefix'] ) ) {
-			$this->addWhere( $pfx . 'title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+			$this->addWhere( $pfx . $fieldTitle . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
 		}
 
-		$this->addFields( array( 'pl_title' => $pfx . 'title' ) );
+		$this->addFields( array( 'pl_title' => $pfx . $fieldTitle ) );
 		$this->addFieldsIf( array( 'pl_from' => $pfx . 'from' ), !$params['unique'] );
 
-		$this->addOption( 'USE INDEX', $pfx . 'namespace' );
+		if ( $this->hasNamespace ) {
+			$this->addOption( 'USE INDEX', $pfx . 'namespace' );
+		}
 		$limit = $params['limit'];
 		$this->addOption( 'LIMIT', $limit + 1 );
 
 		$sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
 		$orderBy = array();
-		$orderBy[] = $pfx . 'title' . $sort;
+		$orderBy[] = $pfx . $fieldTitle . $sort;
 		if ( !$params['unique'] ) {
 			$orderBy[] = $pfx . 'from' . $sort;
 		}
@@ -166,7 +193,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
 					$vals['fromid'] = intval( $row->pl_from );
 				}
 				if ( $fld_title ) {
-					$title = Title::makeTitle( $params['namespace'], $row->pl_title );
+					$title = Title::makeTitle( $namespace, $row->pl_title );
 					ApiQueryBase::addTitleInfo( $vals, $title );
 				}
 				$fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
@@ -179,7 +206,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
 					break;
 				}
 			} elseif ( $params['unique'] ) {
-				$titles[] = Title::makeTitle( $params['namespace'], $row->pl_title );
+				$titles[] = Title::makeTitle( $namespace, $row->pl_title );
 			} else {
 				$pageids[] = $row->pl_from;
 			}
@@ -195,7 +222,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
 	}
 
 	public function getAllowedParams() {
-		return array(
+		$allowedParams = array(
 			'continue' => null,
 			'from' => null,
 			'to' => null,
@@ -228,30 +255,39 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
 				)
 			),
 		);
+		if ( !$this->hasNamespace ) {
+			unset( $allowedParams['namespace'] );
+		}
+		return $allowedParams;
 	}
 
 	public function getParamDescription() {
 		$p = $this->getModulePrefix();
-		$link = $this->descriptionLink;
+		$what = $this->descriptionWhat;
+		$targets = $this->descriptionTargets;
 		$linking = $this->descriptionLinking;
-		return array(
-			'from' => "The title of the $link to start enumerating from",
-			'to' => "The title of the $link to stop enumerating at",
-			'prefix' => "Search for all $link titles that begin with this value",
+		$paramDescription = array(
+			'from' => "The title of the $what to start enumerating from",
+			'to' => "The title of the $what to stop enumerating at",
+			'prefix' => "Search for all $targets that begin with this value",
 			'unique' => array(
-					"Only show distinct $link titles. Cannot be used with {$p}prop=ids.",
-					'When used as a generator, yields target pages instead of source pages.',
+				"Only show distinct $targets. Cannot be used with {$p}prop=ids.",
+				'When used as a generator, yields target pages instead of source pages.',
 			),
 			'prop' => array(
 				'What pieces of information to include',
 				" ids    - Adds the pageid of the $linking page (Cannot be used with {$p}unique)",
-				" title  - Adds the title of the $link",
+				" title  - Adds the title of the $what",
 			),
 			'namespace' => 'The namespace to enumerate',
-			'limit' => "How many total items to return",
+			'limit' => 'How many total items to return',
 			'continue' => 'When more results are available, use this to continue',
 			'dir' => 'The direction in which to list',
 		);
+		if ( !$this->hasNamespace ) {
+			unset( $paramDescription['namespace'] );
+		}
+		return $paramDescription;
 	}
 
 	public function getResultProperties() {
@@ -272,29 +308,31 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
 
 	public function getPossibleErrors() {
 		$m = $this->getModuleName();
-		$link = $this->descriptionLink;
+		$what = $this->descriptionWhat;
 		return array_merge( parent::getPossibleErrors(), array(
-			array( 'code' => 'params', 'info' => "{$m} cannot return corresponding page ids in unique {$link}s mode" ),
+			array( 'code' => 'params', 'info' => "{$m} cannot return corresponding page ids in unique {$what}s mode" ),
 		) );
 	}
 
 	public function getExamples() {
 		$p = $this->getModulePrefix();
-		$link = $this->descriptionLink;
-		$linked = $this->descriptionLinked;
+		$name = $this->getModuleName();
+		$what = $this->descriptionWhat;
+		$targets = $this->descriptionTargets;
 		return array(
-			"api.php?action=query&list=all{$link}s&{$p}from=B&{$p}prop=ids|title"
-					=> "List $linked titles with page ids they are from, including missing ones. Start at B",
-			"api.php?action=query&list=all{$link}s&{$p}unique=&{$p}from=B"
-					=> "List unique $linked titles",
-			"api.php?action=query&generator=all{$link}s&g{$p}unique=&g{$p}from=B"
-					=> "Gets all $link targets, marking the missing ones",
-			"api.php?action=query&generator=all{$link}s&g{$p}from=B"
-					=> "Gets pages containing the {$link}s",
+			"api.php?action=query&list={$name}&{$p}from=B&{$p}prop=ids|title"
+					=> "List $targets with page ids they are from, including missing ones. Start at B",
+			"api.php?action=query&list={$name}&{$p}unique=&{$p}from=B"
+					=> "List unique $targets",
+			"api.php?action=query&generator={$name}&g{$p}unique=&g{$p}from=B"
+					=> "Gets all $targets, marking the missing ones",
+			"api.php?action=query&generator={$name}&g{$p}from=B"
+					=> "Gets pages containing the {$what}s",
 		);
 	}
 
 	public function getHelpUrls() {
-		return "https://www.mediawiki.org/wiki/API:All{$this->descriptionLink}s";
+		$name = ucfirst( $this->getModuleName() );
+		return "https://www.mediawiki.org/wiki/API:{$name}";
 	}
 }
diff --git a/includes/api/ApiQueryAllMessages.php b/includes/api/ApiQueryAllMessages.php
index c9811b0d..d47c7b76 100644
--- a/includes/api/ApiQueryAllMessages.php
+++ b/includes/api/ApiQueryAllMessages.php
@@ -87,7 +87,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
 			foreach ( $messages_target as $message ) {
 				// === 0: must be at beginning of string (position 0)
 				if ( strpos( $message, $params['prefix'] ) === 0 ) {
-					if( !$skip ) {
+					if ( !$skip ) {
 						$skip = true;
 					}
 					$messages_filtered[] = $message;
diff --git a/includes/api/ApiQueryAllPages.php b/includes/api/ApiQueryAllPages.php
index d718b967..d95980c2 100644
--- a/includes/api/ApiQueryAllPages.php
+++ b/includes/api/ApiQueryAllPages.php
@@ -174,7 +174,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
 		$res = $this->select( __METHOD__ );
 
 		//Get gender information
-		if( MWNamespace::hasGenderDistinction( $params['namespace'] ) ) {
+		if ( MWNamespace::hasGenderDistinction( $params['namespace'] ) ) {
 			$users = array();
 			foreach ( $res as $row ) {
 				$users[] = $row->page_title;
@@ -304,7 +304,10 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
 			'prtype' => 'Limit to protected pages only',
 			'prlevel' => "The protection level (must be used with {$p}prtype= parameter)",
 			'prfiltercascade' => "Filter protections based on cascadingness (ignored when {$p}prtype isn't set)",
-			'filterlanglinks' => 'Filter based on whether a page has langlinks',
+			'filterlanglinks' => array(
+				'Filter based on whether a page has langlinks',
+				'Note that this may not consider langlinks added by extensions.',
+			),
 			'limit' => 'How many total pages to return.',
 			'prexpiry' => array(
 				'Which protection expiry to filter the page on',
diff --git a/includes/api/ApiQueryAllUsers.php b/includes/api/ApiQueryAllUsers.php
index 7283aa00..1948a51a 100644
--- a/includes/api/ApiQueryAllUsers.php
+++ b/includes/api/ApiQueryAllUsers.php
@@ -83,12 +83,12 @@ class ApiQueryAllUsers extends ApiQueryBase {
 
 		if ( !is_null( $params['rights'] ) && count( $params['rights'] ) ) {
 			$groups = array();
-			foreach( $params['rights'] as $r ) {
+			foreach ( $params['rights'] as $r ) {
 				$groups = array_merge( $groups, User::getGroupsWithPermission( $r ) );
 			}
 
 			// no group with the given right(s) exists, no need for a query
-			if( !count( $groups ) ) {
+			if ( !count( $groups ) ) {
 				$this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), '' );
 				return;
 			}
diff --git a/includes/api/ApiQueryBacklinks.php b/includes/api/ApiQueryBacklinks.php
index 3ef6b840..2d1089a7 100644
--- a/includes/api/ApiQueryBacklinks.php
+++ b/includes/api/ApiQueryBacklinks.php
@@ -229,10 +229,10 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
 		$orderBy = array();
 		$sort = ( $this->params['dir'] == 'descending' ? ' DESC' : '' );
 		// Don't order by namespace/title if it's constant in the WHERE clause
-		if( $this->hasNS && count( array_unique( $allRedirNs ) ) != 1 ) {
+		if ( $this->hasNS && count( array_unique( $allRedirNs ) ) != 1 ) {
 			$orderBy[] = $this->bl_ns . $sort;
 		}
-		if( count( array_unique( $allRedirDBkey ) ) != 1 ) {
+		if ( count( array_unique( $allRedirDBkey ) ) != 1 ) {
 			$orderBy[] = $this->bl_title . $sort;
 		}
 		$orderBy[] = $this->bl_from . $sort;
@@ -255,6 +255,9 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
 		if ( $this->params['limit'] == 'max' ) {
 			$this->params['limit'] = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
 			$result->setParsedLimit( $this->getModuleName(), $this->params['limit'] );
+		} else {
+			$this->params['limit'] = intval( $this->params['limit'] );
+			$this->validateLimit( 'limit', $this->params['limit'], 1, $userMax, $botMax );
 		}
 
 		$this->processContinue();
@@ -294,9 +297,9 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
 					// We've reached the one extra which shows that there are additional pages to be had. Stop here...
 					// We need to keep the parent page of this redir in
 					if ( $this->hasNS ) {
-						$parentID = $this->pageMap[$row-> { $this->bl_ns } ][$row-> { $this->bl_title } ];
+						$parentID = $this->pageMap[$row->{$this->bl_ns}][$row->{$this->bl_title}];
 					} else {
-						$parentID = $this->pageMap[NS_FILE][$row-> { $this->bl_title } ];
+						$parentID = $this->pageMap[NS_FILE][$row->{$this->bl_title}];
 					}
 					$this->continueStr = $this->getContinueRedirStr( $parentID, $row->page_id );
 					break;
@@ -377,8 +380,8 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
 		if ( $row->page_is_redirect ) {
 			$a['redirect'] = '';
 		}
-		$ns = $this->hasNS ? $row-> { $this->bl_ns } : NS_FILE;
-		$parentID = $this->pageMap[$ns][$row-> { $this->bl_title } ];
+		$ns = $this->hasNS ? $row->{$this->bl_ns} : NS_FILE;
+		$parentID = $this->pageMap[$ns][$row->{$this->bl_title}];
 		// Put all the results in an array first
 		$this->resultArr[$parentID]['redirlinks'][] = $a;
 		$this->getResult()->setIndexedTagName( $this->resultArr[$parentID]['redirlinks'], $this->bl_code );
diff --git a/includes/api/ApiQueryBase.php b/includes/api/ApiQueryBase.php
index 7819ead4..8668e04b 100644
--- a/includes/api/ApiQueryBase.php
+++ b/includes/api/ApiQueryBase.php
@@ -432,7 +432,7 @@ abstract class ApiQueryBase extends ApiBase {
 		if ( trim( $key ) == '' ) {
 			return '';
 		}
-		$t = Title::newFromDbKey( $key );
+		$t = Title::newFromDBkey( $key );
 		// This really shouldn't happen but we gotta check anyway
 		if ( !$t ) {
 			$this->dieUsageMsg( array( 'invalidtitle', $key ) );
@@ -478,7 +478,7 @@ abstract class ApiQueryBase extends ApiBase {
 	 * @param $protocol String
 	 * @return null|string
 	 */
-	public function prepareUrlQuerySearchString( $query = null, $protocol = null) {
+	public function prepareUrlQuerySearchString( $query = null, $protocol = null ) {
 		$db = $this->getDb();
 		if ( !is_null( $query ) || $query != '' ) {
 			if ( is_null( $protocol ) ) {
diff --git a/includes/api/ApiQueryBlocks.php b/includes/api/ApiQueryBlocks.php
index d9be9f28..e3c27f5e 100644
--- a/includes/api/ApiQueryBlocks.php
+++ b/includes/api/ApiQueryBlocks.php
@@ -63,7 +63,7 @@ class ApiQueryBlocks extends ApiQueryBase {
 		$this->addTables( 'ipblocks' );
 		$this->addFields( 'ipb_auto' );
 
-		$this->addFieldsIf ( 'ipb_id', $fld_id );
+		$this->addFieldsIf( 'ipb_id', $fld_id );
 		$this->addFieldsIf( array( 'ipb_address', 'ipb_user' ), $fld_user || $fld_userid );
 		$this->addFieldsIf( 'ipb_by_text', $fld_by );
 		$this->addFieldsIf( 'ipb_by', $fld_byid );
@@ -91,17 +91,30 @@ class ApiQueryBlocks extends ApiQueryBase {
 			$this->addWhereFld( 'ipb_auto', 0 );
 		}
 		if ( isset( $params['ip'] ) ) {
-			list( $ip, $range ) = IP::parseCIDR( $params['ip'] );
-			if ( $ip && $range ) {
-				// We got a CIDR range
-				if ( $range < 16 )
-					$this->dieUsage( 'CIDR ranges broader than /16 are not accepted', 'cidrtoobroad' );
-				$lower = wfBaseConvert( $ip, 10, 16, 8, false );
-				$upper = wfBaseConvert( $ip + pow( 2, 32 - $range ) - 1, 10, 16, 8, false );
+			global $wgBlockCIDRLimit;
+			if ( IP::isIPv4( $params['ip'] ) ) {
+				$type = 'IPv4';
+				$cidrLimit = $wgBlockCIDRLimit['IPv4'];
+				$prefixLen = 0;
+			} elseif ( IP::isIPv6( $params['ip'] ) ) {
+				$type = 'IPv6';
+				$cidrLimit = $wgBlockCIDRLimit['IPv6'];
+				$prefixLen = 3; // IP::toHex output is prefixed with "v6-"
 			} else {
-				$lower = $upper = IP::toHex( $params['ip'] );
+				$this->dieUsage( 'IP parameter is not valid', 'param_ip' );
 			}
-			$prefix = substr( $lower, 0, 4 );
+
+			# Check range validity, if it's a CIDR
+			list( $ip, $range ) = IP::parseCIDR( $params['ip'] );
+			if ( $ip !== false && $range !== false && $range < $cidrLimit ) {
+				$this->dieUsage( "$type CIDR ranges broader than /$cidrLimit are not accepted", 'cidrtoobroad' );
+			}
+
+			# Let IP::parseRange handle calculating $upper, instead of duplicating the logic here.
+			list( $lower, $upper ) = IP::parseRange( $params['ip'] );
+
+			# Extract the common prefix to any rangeblock affecting this IP/CIDR
+			$prefix = substr( $lower, 0, $prefixLen + floor( $cidrLimit / 4 ) );
 
 			# Fairly hard to make a malicious SQL statement out of hex characters,
 			# but it is good practice to add quotes
@@ -120,10 +133,10 @@ class ApiQueryBlocks extends ApiQueryBase {
 			$show = array_flip( $params['show'] );
 
 			/* Check for conflicting parameters. */
-			if ( ( isset ( $show['account'] ) && isset ( $show['!account'] ) )
-					|| ( isset ( $show['ip'] ) && isset ( $show['!ip'] ) )
-					|| ( isset ( $show['range'] ) && isset ( $show['!range'] ) )
-					|| ( isset ( $show['temp'] ) && isset ( $show['!temp'] ) )
+			if ( ( isset( $show['account'] ) && isset( $show['!account'] ) )
+					|| ( isset( $show['ip'] ) && isset( $show['!ip'] ) )
+					|| ( isset( $show['range'] ) && isset( $show['!range'] ) )
+					|| ( isset( $show['temp'] ) && isset( $show['!temp'] ) )
 			) {
 				$this->dieUsageMsg( 'show' );
 			}
@@ -294,6 +307,7 @@ class ApiQueryBlocks extends ApiQueryBase {
 	}
 
 	public function getParamDescription() {
+		global $wgBlockCIDRLimit;
 		$p = $this->getModulePrefix();
 		return array(
 			'start' => 'The timestamp to start enumerating from',
@@ -301,8 +315,12 @@ class ApiQueryBlocks extends ApiQueryBase {
 			'dir' => $this->getDirectionDescription( $p ),
 			'ids' => 'List of block IDs to list (optional)',
 			'users' => 'List of users to search for (optional)',
-			'ip' => array( 'Get all blocks applying to this IP or CIDR range, including range blocks.',
-					'Cannot be used together with bkusers. CIDR ranges broader than /16 are not accepted' ),
+			'ip' => array(
+				'Get all blocks applying to this IP or CIDR range, including range blocks.',
+				"Cannot be used together with bkusers. CIDR ranges broader than " .
+					"IPv4/{$wgBlockCIDRLimit['IPv4']} or IPv6/{$wgBlockCIDRLimit['IPv6']} " .
+					"are not accepted"
+			),
 			'limit' => 'The maximum amount of blocks to list',
 			'prop' => array(
 				'Which properties to get',
@@ -383,10 +401,19 @@ class ApiQueryBlocks extends ApiQueryBase {
 	}
 
 	public function getPossibleErrors() {
+		global $wgBlockCIDRLimit;
 		return array_merge( parent::getPossibleErrors(),
 			$this->getRequireOnlyOneParameterErrorMessages( array( 'users', 'ip' ) ),
 			array(
-				array( 'code' => 'cidrtoobroad', 'info' => 'CIDR ranges broader than /16 are not accepted' ),
+				array(
+					'code' => 'cidrtoobroad',
+					'info' => "IPv4 CIDR ranges broader than /{$wgBlockCIDRLimit['IPv4']} are not accepted"
+				),
+				array(
+					'code' => 'cidrtoobroad',
+					'info' => "IPv6 CIDR ranges broader than /{$wgBlockCIDRLimit['IPv6']} are not accepted"
+				),
+				array( 'code' => 'param_ip', 'info' => 'IP parameter is not valid' ),
 				array( 'code' => 'param_user', 'info' => 'User parameter may not be empty' ),
 				array( 'code' => 'param_user', 'info' => 'User name user is not valid' ),
 				array( 'show' ),
diff --git a/includes/api/ApiQueryCategories.php b/includes/api/ApiQueryCategories.php
index 69a64415..5d714f57 100644
--- a/includes/api/ApiQueryCategories.php
+++ b/includes/api/ApiQueryCategories.php
@@ -49,7 +49,6 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
 
 	/**
 	 * @param $resultPageSet ApiPageSet
-	 * @return
 	 */
 	private function run( $resultPageSet = null ) {
 		if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
@@ -174,7 +173,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
 					break;
 				}
 
-				$titles[] = Title :: makeTitle( NS_CATEGORY, $row->cl_to );
+				$titles[] = Title::makeTitle( NS_CATEGORY, $row->cl_to );
 			}
 			$resultPageSet->populateFromTitles( $titles );
 		}
@@ -184,7 +183,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
 		return array(
 			'prop' => array(
 				ApiBase::PARAM_ISMULTI => true,
-				ApiBase::PARAM_TYPE => array (
+				ApiBase::PARAM_TYPE => array(
 					'sortkey',
 					'timestamp',
 					'hidden',
diff --git a/includes/api/ApiQueryCategoryMembers.php b/includes/api/ApiQueryCategoryMembers.php
index 9dbd8593..704d108a 100644
--- a/includes/api/ApiQueryCategoryMembers.php
+++ b/includes/api/ApiQueryCategoryMembers.php
@@ -217,7 +217,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
 				if ( $fld_sortkeyprefix ) {
 					$vals['sortkeyprefix'] = $row->cl_sortkey_prefix;
 				}
-				if ( $fld_type  ) {
+				if ( $fld_type ) {
 					$vals['type'] = $row->cl_type;
 				}
 				if ( $fld_timestamp ) {
@@ -258,7 +258,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
 			'prop' => array(
 				ApiBase::PARAM_DFLT => 'ids|title',
 				ApiBase::PARAM_ISMULTI => true,
-				ApiBase::PARAM_TYPE => array (
+				ApiBase::PARAM_TYPE => array(
 					'ids',
 					'title',
 					'sortkey',
@@ -267,7 +267,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
 					'timestamp',
 				)
 			),
-			'namespace' => array (
+			'namespace' => array(
 				ApiBase::PARAM_ISMULTI => true,
 				ApiBase::PARAM_TYPE => 'namespace',
 			),
diff --git a/includes/api/ApiQueryDeletedrevs.php b/includes/api/ApiQueryDeletedrevs.php
index 890e4ecf..82733133 100644
--- a/includes/api/ApiQueryDeletedrevs.php
+++ b/includes/api/ApiQueryDeletedrevs.php
@@ -50,7 +50,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
 		$fld_user = isset( $prop['user'] );
 		$fld_userid = isset( $prop['userid'] );
 		$fld_comment = isset( $prop['comment'] );
-		$fld_parsedcomment = isset ( $prop['parsedcomment'] );
+		$fld_parsedcomment = isset( $prop['parsedcomment'] );
 		$fld_minor = isset( $prop['minor'] );
 		$fld_len = isset( $prop['len'] );
 		$fld_sha1 = isset( $prop['sha1'] );
@@ -79,13 +79,13 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
 
 		if ( $mode == 'revs' || $mode == 'user' ) {
 			// Ignore namespace and unique due to inability to know whether they were purposely set
-			foreach( array( 'from', 'to', 'prefix', /*'namespace', 'unique'*/ ) as $p ) {
+			foreach ( array( 'from', 'to', 'prefix', /*'namespace', 'unique'*/ ) as $p ) {
 				if ( !is_null( $params[$p] ) ) {
 					$this->dieUsage( "The '{$p}' parameter cannot be used in modes 1 or 2", 'badparams' );
 				}
 			}
 		} else {
-			foreach( array( 'start', 'end' ) as $p ) {
+			foreach ( array( 'start', 'end' ) as $p ) {
 				if ( !is_null( $params[$p] ) ) {
 					$this->dieUsage( "The {$p} parameter cannot be used in mode 3", 'badparams' );
 				}
diff --git a/includes/api/ApiQueryDuplicateFiles.php b/includes/api/ApiQueryDuplicateFiles.php
index 18dcba85..0311fa7f 100644
--- a/includes/api/ApiQueryDuplicateFiles.php
+++ b/includes/api/ApiQueryDuplicateFiles.php
@@ -48,8 +48,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
 	}
 
 	/**
-	 * @param $resultPageSet ApiPageSet
-	 * @return
+	 * @param ApiPageSet $resultPageSet
 	 */
 	private function run( $resultPageSet = null ) {
 		$params = $this->extractRequestParams();
@@ -59,7 +58,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
 		}
 		$images = $namespaces[NS_FILE];
 
-		if( $params['dir'] == 'descending' ) {
+		if ( $params['dir'] == 'descending' ) {
 			$images = array_reverse( $images );
 		}
 
@@ -80,7 +79,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
 		}
 
 		$filesToFind = array_keys( $images );
-		if( $params['localonly'] ) {
+		if ( $params['localonly'] ) {
 			$files = RepoGroup::singleton()->getLocalRepo()->findFiles( $filesToFind );
 		} else {
 			$files = RepoGroup::singleton()->findFiles( $filesToFind );
@@ -98,29 +97,29 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
 
 		// find all files with the hashes, result format is: array( hash => array( dup1, dup2 ), hash1 => ... )
 		$filesToFindBySha1s = array_unique( array_values( $sha1s ) );
-		if( $params['localonly'] ) {
+		if ( $params['localonly'] ) {
 			$filesBySha1s = RepoGroup::singleton()->getLocalRepo()->findBySha1s( $filesToFindBySha1s );
 		} else {
 			$filesBySha1s = RepoGroup::singleton()->findBySha1s( $filesToFindBySha1s );
 		}
 
 		// iterate over $images to handle continue param correct
-		foreach( $images as $image => $pageId ) {
-			if( !isset( $sha1s[$image] ) ) {
+		foreach ( $images as $image => $pageId ) {
+			if ( !isset( $sha1s[$image] ) ) {
 				continue; //file does not exist
 			}
 			$sha1 = $sha1s[$image];
 			$dupFiles = $filesBySha1s[$sha1];
-			if( $params['dir'] == 'descending' ) {
+			if ( $params['dir'] == 'descending' ) {
 				$dupFiles = array_reverse( $dupFiles );
 			}
 			/** @var $dupFile File */
 			foreach ( $dupFiles as $dupFile ) {
 				$dupName = $dupFile->getName();
-				if( $image == $dupName && $dupFile->isLocal() ) {
+				if ( $image == $dupName && $dupFile->isLocal() ) {
 					continue; //ignore the local file itself
 				}
-				if( $skipUntilThisDup !== false && $dupName < $skipUntilThisDup ) {
+				if ( $skipUntilThisDup !== false && $dupName < $skipUntilThisDup ) {
 					continue; //skip to pos after the image from continue param
 				}
 				$skipUntilThisDup = false;
@@ -139,7 +138,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
 						'user' => $dupFile->getUser( 'text' ),
 						'timestamp' => wfTimestamp( TS_ISO_8601, $dupFile->getTimestamp() )
 					);
-					if( !$dupFile->isLocal() ) {
+					if ( !$dupFile->isLocal() ) {
 						$r['shared'] = '';
 					}
 					$fit = $this->addPageSubItem( $pageId, $r );
@@ -149,7 +148,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
 					}
 				}
 			}
-			if( !$fit ) {
+			if ( !$fit ) {
 				break;
 			}
 		}
diff --git a/includes/api/ApiQueryExtLinksUsage.php b/includes/api/ApiQueryExtLinksUsage.php
index eb9cdf9e..456e87ba 100644
--- a/includes/api/ApiQueryExtLinksUsage.php
+++ b/includes/api/ApiQueryExtLinksUsage.php
@@ -123,7 +123,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
 				if ( $fld_url ) {
 					$to = $row->el_to;
 					// expand protocol-relative urls
-					if( $params['expandurl'] ) {
+					if ( $params['expandurl'] ) {
 						$to = wfExpandUrl( $to, PROTO_CANONICAL );
 					}
 					$vals['url'] = $to;
@@ -218,13 +218,13 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
 			),
 			'offset' => 'Used for paging. Use the value returned for "continue"',
 			'protocol' => array(
-				"Protocol of the url. If empty and {$p}query set, the protocol is http.",
+				"Protocol of the URL. If empty and {$p}query set, the protocol is http.",
 				"Leave both this and {$p}query empty to list all external links"
 			),
 			'query' => 'Search string without protocol. See [[Special:LinkSearch]]. Leave empty to list all external links',
 			'namespace' => 'The page namespace(s) to enumerate.',
 			'limit' => 'How many pages to return.',
-			'expandurl' => 'Expand protocol-relative urls with the canonical protocol',
+			'expandurl' => 'Expand protocol-relative URLs with the canonical protocol',
 		);
 
 		if ( $wgMiserMode ) {
diff --git a/includes/api/ApiQueryExternalLinks.php b/includes/api/ApiQueryExternalLinks.php
index 761b49ea..583ef697 100644
--- a/includes/api/ApiQueryExternalLinks.php
+++ b/includes/api/ApiQueryExternalLinks.php
@@ -88,7 +88,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
 			$entry = array();
 			$to = $row->el_to;
 			// expand protocol-relative urls
-			if( $params['expandurl'] ) {
+			if ( $params['expandurl'] ) {
 				$to = wfExpandUrl( $to, PROTO_CANONICAL );
 			}
 			ApiResult::setContent( $entry, $to );
@@ -131,11 +131,11 @@ class ApiQueryExternalLinks extends ApiQueryBase {
 			'limit' => 'How many links to return',
 			'offset' => 'When more results are available, use this to continue',
 			'protocol' => array(
-				"Protocol of the url. If empty and {$p}query set, the protocol is http.",
+				"Protocol of the URL. If empty and {$p}query set, the protocol is http.",
 				"Leave both this and {$p}query empty to list all external links"
 			),
 			'query' => 'Search string without protocol. Useful for checking whether a certain page contains a certain external url',
-			'expandurl' => 'Expand protocol-relative urls with the canonical protocol',
+			'expandurl' => 'Expand protocol-relative URLs with the canonical protocol',
 		);
 	}
 
@@ -148,7 +148,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
 	}
 
 	public function getDescription() {
-		return 'Returns all external urls (not interwikis) from the given page(s)';
+		return 'Returns all external URLs (not interwikis) from the given page(s)';
 	}
 
 	public function getPossibleErrors() {
diff --git a/includes/api/ApiQueryFileRepoInfo.php b/includes/api/ApiQueryFileRepoInfo.php
new file mode 100644
index 00000000..3a353533
--- /dev/null
+++ b/includes/api/ApiQueryFileRepoInfo.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * Copyright © 2013 Mark Holmquist <mtraceur@member.fsf.org>
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.22
+ */
+
+/**
+ * A query action to return meta information about the foreign file repos
+ * configured on the wiki.
+ *
+ * @ingroup API
+ */
+class ApiQueryFileRepoInfo extends ApiQueryBase {
+
+	public function __construct( $query, $moduleName ) {
+		parent::__construct( $query, $moduleName, 'fri' );
+	}
+
+	protected function getInitialisedRepoGroup() {
+		$repoGroup = RepoGroup::singleton();
+
+		if ( !$repoGroup->reposInitialised ) {
+			$repoGroup->initialiseRepos();
+		}
+
+		return $repoGroup;
+	}
+
+	public function execute() {
+		$params = $this->extractRequestParams();
+		$props = array_flip( $params['prop'] );
+
+		$repos = array();
+
+		$repoGroup = $this->getInitialisedRepoGroup();
+
+		$repoGroup->forEachForeignRepo( function ( $repo ) use ( &$repos, $props ) {
+			$repos[] = array_intersect_key( $repo->getInfo(), $props );
+		} );
+
+		$repos[] = array_intersect_key( $repoGroup->localRepo->getInfo(), $props );
+
+		$result = $this->getResult();
+		$result->setIndexedTagName( $repos, 'repo' );
+		$result->addValue( array( 'query' ), 'repos', $repos );
+	}
+
+	public function getCacheMode( $params ) {
+		return 'public';
+	}
+
+	public function getAllowedParams() {
+		$props = $this->getProps();
+
+		return array(
+			'prop' => array(
+				ApiBase::PARAM_DFLT => join( '|', $props ),
+				ApiBase::PARAM_ISMULTI => true,
+				ApiBase::PARAM_TYPE => $props,
+			),
+		);
+	}
+
+	public function getProps() {
+		$props = array();
+		$repoGroup = $this->getInitialisedRepoGroup();
+
+		$repoGroup->forEachForeignRepo( function ( $repo ) use ( &$props ) {
+			$props = array_merge( $props, array_keys( $repo->getInfo() ) );
+		} );
+
+		return array_values( array_unique( array_merge( $props, array_keys( $repoGroup->localRepo->getInfo() ) ) ) );
+	}
+
+	public function getParamDescription() {
+		$p = $this->getModulePrefix();
+		return array(
+			'prop' => array(
+				'Which repository properties to get (there may be more available on some wikis):',
+				' apiurl      - URL to the repository API - helpful for getting image info from the host.',
+				' name        - The key of the repository - used in e.g. $wgForeignFileRepos and imageinfo return values.',
+				' displayname - The human-readable name of the repository wiki.',
+				' rooturl     - Root URL for image paths.',
+				' local       - Whether that repository is the local one or not.',
+			),
+		);
+	}
+
+	public function getDescription() {
+		return 'Return meta information about image repositories configured on the wiki.';
+	}
+
+	public function getExamples() {
+		return array(
+			'api.php?action=query&meta=filerepoinfo&friprop=apiurl|name|displayname',
+		);
+	}
+}
diff --git a/includes/api/ApiQueryFilearchive.php b/includes/api/ApiQueryFilearchive.php
index 021074a9..f53cd386 100644
--- a/includes/api/ApiQueryFilearchive.php
+++ b/includes/api/ApiQueryFilearchive.php
@@ -218,7 +218,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
 	}
 
 	public function getAllowedParams() {
-		return array (
+		return array(
 			'from' => null,
 			'continue' => null,
 			'to' => null,
@@ -281,7 +281,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
 				' parseddescription - Parse the description on the version',
 				' mime              - Adds MIME of the image',
 				' mediatype         - Adds the media type of the image',
-				' metadata          - Lists EXIF metadata for the version of the image',
+				' metadata          - Lists Exif metadata for the version of the image',
 				' bitdepth          - Adds the bit depth of the version',
 				' archivename       - Adds the file name of the archive version for non-latest versions'
 			),
@@ -373,4 +373,8 @@ class ApiQueryFilearchive extends ApiQueryBase {
 			),
 		);
 	}
+
+	public function getHelpUrls() {
+		return 'https://www.mediawiki.org/wiki/API:Filearchive';
+	}
 }
diff --git a/includes/api/ApiQueryIWBacklinks.php b/includes/api/ApiQueryIWBacklinks.php
index b47d31f2..ebae3e76 100644
--- a/includes/api/ApiQueryIWBacklinks.php
+++ b/includes/api/ApiQueryIWBacklinks.php
@@ -239,4 +239,8 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
 			'api.php?action=query&generator=iwbacklinks&giwbltitle=Test&giwblprefix=wikibooks&prop=info'
 		);
 	}
+
+	public function getHelpUrls() {
+		return 'https://www.mediawiki.org/wiki/API:Iwbacklinks';
+	}
 }
diff --git a/includes/api/ApiQueryIWLinks.php b/includes/api/ApiQueryIWLinks.php
index fc77b4e6..be539311 100644
--- a/includes/api/ApiQueryIWLinks.php
+++ b/includes/api/ApiQueryIWLinks.php
@@ -81,8 +81,8 @@ class ApiQueryIWLinks extends ApiQueryBase {
 				$this->addOption( 'ORDER BY', 'iwl_from' . $sort );
 			} else {
 				$this->addOption( 'ORDER BY', array(
-						'iwl_title' . $sort,
-						'iwl_from' . $sort
+						'iwl_from' . $sort,
+						'iwl_title' . $sort
 				));
 			}
 		} else {
@@ -90,9 +90,10 @@ class ApiQueryIWLinks extends ApiQueryBase {
 			if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
 				$this->addOption( 'ORDER BY', 'iwl_prefix' . $sort );
 			} else {
-				$this->addOption( 'ORDER BY', array (
+				$this->addOption( 'ORDER BY', array(
 						'iwl_from' . $sort,
-						'iwl_prefix' . $sort
+						'iwl_prefix' . $sort,
+						'iwl_title' . $sort
 				));
 			}
 		}
@@ -192,4 +193,8 @@ class ApiQueryIWLinks extends ApiQueryBase {
 			'api.php?action=query&prop=iwlinks&titles=Main%20Page' => 'Get interwiki links from the [[Main Page]]',
 		);
 	}
+
+	public function getHelpUrls() {
+		return 'https://www.mediawiki.org/wiki/API:Iwlinks';
+	}
 }
diff --git a/includes/api/ApiQueryImageInfo.php b/includes/api/ApiQueryImageInfo.php
index 95c2745a..0ea28684 100644
--- a/includes/api/ApiQueryImageInfo.php
+++ b/includes/api/ApiQueryImageInfo.php
@@ -72,7 +72,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
 			$result = $this->getResult();
 			//search only inside the local repo
-			if( $params['localonly'] ) {
+			if ( $params['localonly'] ) {
 				$images = RepoGroup::singleton()->getLocalRepo()->findFiles( $titles );
 			} else {
 				$images = RepoGroup::singleton()->findFiles( $titles );
@@ -82,12 +82,17 @@ class ApiQueryImageInfo extends ApiQueryBase {
 				$start = $title === $fromTitle ? $fromTimestamp : $params['start'];
 
 				if ( !isset( $images[$title] ) ) {
-					$result->addValue(
-						array( 'query', 'pages', intval( $pageId ) ),
-						'imagerepository', ''
-					);
-					// The above can't fail because it doesn't increase the result size
-					continue;
+					if ( isset( $prop['uploadwarning'] ) ) {
+						// Uploadwarning needs info about non-existing files
+						$images[$title] = wfLocalFile( $title );
+					} else {
+						$result->addValue(
+							array( 'query', 'pages', intval( $pageId ) ),
+							'imagerepository', ''
+						);
+						// The above can't fail because it doesn't increase the result size
+						continue;
+					}
 				}
 
 				/** @var $img File */
@@ -170,9 +175,12 @@ class ApiQueryImageInfo extends ApiQueryBase {
 						}
 						break;
 					}
-					$fit = $this->addPageSubItem( $pageId,
-						self::getInfo( $oldie, $prop, $result,
-							$finalThumbParams, $params['metadataversion'] ) );
+					$fit = self::getTransformCount() < self::TRANSFORM_LIMIT &&
+						$this->addPageSubItem( $pageId,
+							self::getInfo( $oldie, $prop, $result,
+								$finalThumbParams, $params['metadataversion']
+							)
+						);
 					if ( !$fit ) {
 						if ( count( $pageIds[NS_FILE] ) == 1 ) {
 							$this->setContinueEnumParameter( 'start',
@@ -199,21 +207,20 @@ class ApiQueryImageInfo extends ApiQueryBase {
 	public function getScale( $params ) {
 		$p = $this->getModulePrefix();
 
-		// Height and width.
-		if ( $params['urlheight'] != -1 && $params['urlwidth'] == -1 ) {
-			$this->dieUsage( "{$p}urlheight cannot be used without {$p}urlwidth", "{$p}urlwidth" );
-		}
-
 		if ( $params['urlwidth'] != -1 ) {
 			$scale = array();
 			$scale['width'] = $params['urlwidth'];
 			$scale['height'] = $params['urlheight'];
+		} elseif ( $params['urlheight'] != -1 ) {
+			// Height is specified but width isn't
+			// Don't set $scale['width']; this signals mergeThumbParams() to fill it with the image's width
+			$scale = array();
+			$scale['height'] = $params['urlheight'];
 		} else {
 			$scale = null;
 			if ( $params['urlparam'] ) {
 				$this->dieUsage( "{$p}urlparam requires {$p}urlwidth", "urlparam_no_width" );
 			}
-			return $scale;
 		}
 
 		return $scale;
@@ -228,7 +235,21 @@ class ApiQueryImageInfo extends ApiQueryBase {
 	 * @param string $otherParams of otherParams (iiurlparam).
 	 * @return Array of parameters for transform.
 	 */
-	protected function mergeThumbParams ( $image, $thumbParams, $otherParams ) {
+	protected function mergeThumbParams( $image, $thumbParams, $otherParams ) {
+		global $wgThumbLimits;
+
+		if ( !isset( $thumbParams['width'] ) && isset( $thumbParams['height'] ) ) {
+			// We want to limit only by height in this situation, so pass the
+			// image's full width as the limiting width. But some file types
+			// don't have a width of their own, so pick something arbitrary so
+			// thumbnailing the default icon works.
+			if ( $image->getWidth() <= 0 ) {
+				$thumbParams['width'] = max( $wgThumbLimits );
+			} else {
+				$thumbParams['width'] = $image->getWidth();
+			}
+		}
+
 		if ( !$otherParams ) {
 			return $thumbParams;
 		}
@@ -254,8 +275,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
 		if ( isset( $paramList['width'] ) ) {
 			if ( intval( $paramList['width'] ) != intval( $thumbParams['width'] ) ) {
-				$this->dieUsage( "{$p}urlparam had width of {$paramList['width']} but "
-					. "{$p}urlwidth was {$thumbParams['width']}", "urlparam_urlwidth_mismatch" );
+				$this->setWarning( "Ignoring width value set in {$p}urlparam ({$paramList['width']}) "
+					. "in favor of width value derived from {$p}urlwidth/{$p}urlheight ({$thumbParams['width']})" );
 			}
 		}
 
@@ -342,6 +363,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 		$mediatype = isset( $prop['mediatype'] );
 		$archive = isset( $prop['archivename'] );
 		$bitdepth = isset( $prop['bitdepth'] );
+		$uploadwarning = isset( $prop['uploadwarning'] );
 
 		if ( ( $url || $sha1 || $meta || $mime || $mediatype || $archive || $bitdepth )
 				&& $file->isDeleted( File::DELETED_FILE ) ) {
@@ -411,6 +433,10 @@ class ApiQueryImageInfo extends ApiQueryBase {
 			$vals['bitdepth'] = $file->getBitDepth();
 		}
 
+		if ( $uploadwarning ) {
+			$vals['html'] = SpecialUpload::getExistsWarning( UploadBase::getExistsWarning( $file ) );
+		}
+
 		return $vals;
 	}
 
@@ -461,7 +487,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 		if ( $start === null ) {
 			$start = $img->getTimestamp();
 		}
-		return $img->getOriginalTitle()->getText() . '|' . $start;
+		return $img->getOriginalTitle()->getDBkey() . '|' . $start;
 	}
 
 	public function getAllowedParams() {
@@ -537,9 +563,10 @@ class ApiQueryImageInfo extends ApiQueryBase {
 			'thumbmime' =>      ' thumbmime     - Adds MIME type of the image thumbnail' .
 				' (requires url and param ' . $modulePrefix . 'urlwidth)',
 			'mediatype' =>      ' mediatype     - Adds the media type of the image',
-			'metadata' =>       ' metadata      - Lists EXIF metadata for the version of the image',
+			'metadata' =>       ' metadata      - Lists Exif metadata for the version of the image',
 			'archivename' =>    ' archivename   - Adds the file name of the archive version for non-latest versions',
 			'bitdepth' =>       ' bitdepth      - Adds the bit depth of the version',
+			'uploadwarning' =>  ' uploadwarning - Used by the Special:Upload page to get information about an existing file. Not intended for use outside MediaWiki core',
 		);
 	}
 
@@ -547,7 +574,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 	 * Returns the descriptions for the properties provided by getPropertyNames()
 	 *
 	 * @param array $filter List of properties to filter out
-	 *
+	 * @param string $modulePrefix
 	 * @return array
 	 */
 	public static function getPropertyDescriptions( $filter = array(), $modulePrefix = '' ) {
@@ -566,11 +593,12 @@ class ApiQueryImageInfo extends ApiQueryBase {
 		return array(
 			'prop' => self::getPropertyDescriptions( array(), $p ),
 			'urlwidth' => array( "If {$p}prop=url is set, a URL to an image scaled to this width will be returned.",
-						'Only the current version of the image can be scaled' ),
-			'urlheight' => "Similar to {$p}urlwidth. Cannot be used without {$p}urlwidth",
+				'For performance reasons if this option is used, ' .
+					'no more than ' . self::TRANSFORM_LIMIT . ' scaled images will be returned.' ),
+			'urlheight' => "Similar to {$p}urlwidth.",
 			'urlparam' => array( "A handler specific parameter string. For example, pdf's ",
 				"might use 'page15-100px'. {$p}urlwidth must be used and be consistent with {$p}urlparam" ),
-			'limit' => 'How many image revisions to return',
+			'limit' => 'How many image revisions to return per image',
 			'start' => 'Timestamp to start listing from',
 			'end' => 'Timestamp to stop listing at',
 			'metadataversion' => array( "Version of metadata to use. if 'latest' is specified, use latest version.",
@@ -714,8 +742,6 @@ class ApiQueryImageInfo extends ApiQueryBase {
 			array( 'code' => "{$p}urlwidth", 'info' => "{$p}urlheight cannot be used without {$p}urlwidth" ),
 			array( 'code' => 'urlparam', 'info' => "Invalid value for {$p}urlparam" ),
 			array( 'code' => 'urlparam_no_width', 'info' => "{$p}urlparam requires {$p}urlwidth" ),
-			array( 'code' => 'urlparam_urlwidth_mismatch', 'info' => "The width set in {$p}urlparm doesn't " .
-				"match the one in {$p}urlwidth" ),
 		) );
 	}
 
diff --git a/includes/api/ApiQueryInfo.php b/includes/api/ApiQueryInfo.php
index 37cd9159..017684ed 100644
--- a/includes/api/ApiQueryInfo.php
+++ b/includes/api/ApiQueryInfo.php
@@ -56,11 +56,11 @@ class ApiQueryInfo extends ApiQueryBase {
 	 * @return void
 	 */
 	public function requestExtraData( $pageSet ) {
-		global $wgDisableCounters;
+		global $wgDisableCounters, $wgContentHandlerUseDB;
 
 		$pageSet->requestField( 'page_restrictions' );
 		// when resolving redirects, no page will have this field
-		if( !$pageSet->isResolvingRedirects() ) {
+		if ( !$pageSet->isResolvingRedirects() ) {
 			$pageSet->requestField( 'page_is_redirect' );
 		}
 		$pageSet->requestField( 'page_is_new' );
@@ -70,6 +70,9 @@ class ApiQueryInfo extends ApiQueryBase {
 		$pageSet->requestField( 'page_touched' );
 		$pageSet->requestField( 'page_latest' );
 		$pageSet->requestField( 'page_len' );
+		if ( $wgContentHandlerUseDB ) {
+			$pageSet->requestField( 'page_content_model' );
+		}
 	}
 
 	/**
@@ -348,6 +351,10 @@ class ApiQueryInfo extends ApiQueryBase {
 		$titleExists = $pageid > 0; //$title->exists() needs pageid, which is not set for all title objects
 		$ns = $title->getNamespace();
 		$dbkey = $title->getDBkey();
+
+		$pageInfo['contentmodel'] = $title->getContentModel();
+		$pageInfo['pagelanguage'] = $title->getPageLanguage()->getCode();
+
 		if ( $titleExists ) {
 			global $wgDisableCounters;
 
@@ -476,7 +483,7 @@ class ApiQueryInfo extends ApiQueryBase {
 				$this->protections[$title->getNamespace()][$title->getDBkey()][] = $a;
 			}
 			// Also check old restrictions
-			foreach( $this->titles as $pageId => $title ) {
+			foreach ( $this->titles as $pageId => $title ) {
 				if ( $this->pageRestrictions[$pageId] ) {
 					$namespace = $title->getNamespace();
 					$dbKey = $title->getDBkey();
@@ -662,7 +669,9 @@ class ApiQueryInfo extends ApiQueryBase {
 	private function getWatchedInfo() {
 		$user = $this->getUser();
 
-		if ( $user->isAnon() || count( $this->everything ) == 0 ) {
+		if ( $user->isAnon() || count( $this->everything ) == 0
+			|| !$user->isAllowed( 'viewmywatchlist' )
+		) {
 			return;
 		}
 
@@ -819,7 +828,8 @@ class ApiQueryInfo extends ApiQueryBase {
 				'starttimestamp' => array(
 					ApiBase::PROP_TYPE => 'timestamp',
 					ApiBase::PROP_NULLABLE => true
-				)
+				),
+				'contentmodel' => 'string',
 			),
 			'watched' => array(
 				'watched' => 'boolean'
diff --git a/includes/api/ApiQueryLangBacklinks.php b/includes/api/ApiQueryLangBacklinks.php
index 7a4880a4..5bd451b6 100644
--- a/includes/api/ApiQueryLangBacklinks.php
+++ b/includes/api/ApiQueryLangBacklinks.php
@@ -195,7 +195,7 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
 			'prop' => array(
 				'Which properties to get',
 				' lllang         - Adds the language code of the language link',
-				' lltitle        - Adds the title of the language ink',
+				' lltitle        - Adds the title of the language link',
 			),
 			'limit' => 'How many total pages to return',
 			'dir' => 'The direction in which to list',
@@ -223,7 +223,8 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
 		return array( 'Find all pages that link to the given language link.',
 			'Can be used to find all links with a language code, or',
 			'all links to a title (with a given language).',
-			'Using neither parameter is effectively "All Language Links"',
+			'Using neither parameter is effectively "All Language Links".',
+			'Note that this may not consider language links added by extensions.',
 		);
 	}
 
@@ -239,4 +240,8 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
 			'api.php?action=query&generator=langbacklinks&glbltitle=Test&glbllang=fr&prop=info'
 		);
 	}
+
+	public function getHelpUrls() {
+		return 'https://www.mediawiki.org/wiki/API:Langbacklinks';
+	}
 }
diff --git a/includes/api/ApiQueryLangLinks.php b/includes/api/ApiQueryLangLinks.php
index ac65d2d2..aa796e31 100644
--- a/includes/api/ApiQueryLangLinks.php
+++ b/includes/api/ApiQueryLangLinks.php
@@ -67,18 +67,19 @@ class ApiQueryLangLinks extends ApiQueryBase {
 			);
 		}
 
-			$sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
-			if ( isset( $params['lang'] ) ) {
+		//FIXME: (follow-up) To allow extensions to add to the language links, we need
+		//       to load them all, add the extra links, then apply paging.
+		//       Should not be terrible, it's not going to be more than a few hundred links.
+
+		// Note that, since (ll_from, ll_lang) is a unique key, we don't need
+		// to sort by ll_title to ensure deterministic ordering.
+		$sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+		if ( isset( $params['lang'] ) ) {
 			$this->addWhereFld( 'll_lang', $params['lang'] );
 			if ( isset( $params['title'] ) ) {
 				$this->addWhereFld( 'll_title', $params['title'] );
-				$this->addOption( 'ORDER BY', 'll_from' . $sort );
-			} else {
-				$this->addOption( 'ORDER BY', array(
-							'll_title' . $sort,
-							'll_from' . $sort
-				));
 			}
+			$this->addOption( 'ORDER BY', 'll_from' . $sort );
 		} else {
 			// Don't order by ll_from if it's constant in the WHERE clause
 			if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
diff --git a/includes/api/ApiQueryLogEvents.php b/includes/api/ApiQueryLogEvents.php
index 73dcea49..1a2719ed 100644
--- a/includes/api/ApiQueryLogEvents.php
+++ b/includes/api/ApiQueryLogEvents.php
@@ -49,12 +49,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
 		$this->fld_ids = isset( $prop['ids'] );
 		$this->fld_title = isset( $prop['title'] );
 		$this->fld_type = isset( $prop['type'] );
-		$this->fld_action = isset ( $prop['action'] );
+		$this->fld_action = isset( $prop['action'] );
 		$this->fld_user = isset( $prop['user'] );
 		$this->fld_userid = isset( $prop['userid'] );
 		$this->fld_timestamp = isset( $prop['timestamp'] );
 		$this->fld_comment = isset( $prop['comment'] );
-		$this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
+		$this->fld_parsedcomment = isset( $prop['parsedcomment'] );
 		$this->fld_details = isset( $prop['details'] );
 		$this->fld_tags = isset( $prop['tags'] );
 
@@ -67,7 +67,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
 		$this->addTables( array( 'logging', 'user', 'page' ) );
 		$this->addOption( 'STRAIGHT_JOIN' );
 		$this->addJoinConds( array(
-			'user' => array( 'JOIN',
+			'user' => array( 'LEFT JOIN',
 				'user_id=log_user' ),
 			'page' => array( 'LEFT JOIN',
 				array( 'log_namespace=page_namespace',
@@ -82,8 +82,8 @@ class ApiQueryLogEvents extends ApiQueryBase {
 		) );
 
 		$this->addFieldsIf( array( 'log_id', 'page_id' ), $this->fld_ids );
-		$this->addFieldsIf( array( 'log_user', 'user_name' ), $this->fld_user );
-		$this->addFieldsIf( 'user_id', $this->fld_userid );
+		$this->addFieldsIf( array( 'log_user', 'log_user_text', 'user_name' ), $this->fld_user );
+		$this->addFieldsIf( 'log_user', $this->fld_userid );
 		$this->addFieldsIf( array( 'log_namespace', 'log_title' ), $this->fld_title || $this->fld_parsedcomment );
 		$this->addFieldsIf( 'log_comment', $this->fld_comment || $this->fld_parsedcomment );
 		$this->addFieldsIf( 'log_params', $this->fld_details );
@@ -98,8 +98,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
 			$this->addTables( 'change_tag' );
 			$this->addJoinConds( array( 'change_tag' => array( 'INNER JOIN', array( 'log_id=ct_log_id' ) ) ) );
 			$this->addWhereFld( 'ct_tag', $params['tag'] );
-			global $wgOldChangeTagsIndex;
-			$index['change_tag'] = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
+			$index['change_tag'] = 'change_tag_tag_id';
 		}
 
 		if ( !is_null( $params['action'] ) ) {
@@ -241,7 +240,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
 				break;
 			case 'rights':
 				$vals2 = array();
-				if( $legacy ) {
+				if ( $legacy ) {
 					list( $vals2['old'], $vals2['new'] ) = $params;
 				} else {
 					$vals2['new'] = implode( ', ', $params['5::newgroups'] );
@@ -265,6 +264,11 @@ class ApiQueryLogEvents extends ApiQueryBase {
 				$vals[$type] = $vals2;
 				$params = null;
 				break;
+			case 'upload':
+				if ( isset( $params['img_timestamp'] ) ) {
+					$params['img_timestamp'] = wfTimestamp( TS_ISO_8601, $params['img_timestamp'] );
+				}
+				break;
 		}
 		if ( !is_null( $params ) ) {
 			$logParams = array();
@@ -331,10 +335,10 @@ class ApiQueryLogEvents extends ApiQueryBase {
 				$vals['userhidden'] = '';
 			} else {
 				if ( $this->fld_user ) {
-					$vals['user'] = $row->user_name;
+					$vals['user'] = $row->user_name === null ? $row->log_user_text : $row->user_name;
 				}
 				if ( $this->fld_userid ) {
-					$vals['userid'] = $row->user_id;
+					$vals['userid'] = $row->log_user;
 				}
 
 				if ( !$row->log_user ) {
diff --git a/includes/api/ApiQueryORM.php b/includes/api/ApiQueryORM.php
index 41d8f11c..a23ff06b 100644
--- a/includes/api/ApiQueryORM.php
+++ b/includes/api/ApiQueryORM.php
@@ -228,7 +228,7 @@ abstract class ApiQueryORM extends ApiQueryBase {
 	 * @return array
 	 */
 	public function getAllowedParams() {
-		$params = array (
+		$params = array(
 			'props' => array(
 				ApiBase::PARAM_TYPE => $this->getTable()->getFieldNames(),
 				ApiBase::PARAM_ISMULTI => true,
@@ -252,7 +252,7 @@ abstract class ApiQueryORM extends ApiQueryBase {
 	 * @return array
 	 */
 	public function getParamDescription() {
-		$descriptions = array (
+		$descriptions = array(
 			'props' => 'Fields to query',
 			'continue' => 'Offset number from where to continue the query',
 			'limit' => 'Max amount of rows to return',
diff --git a/includes/api/ApiQueryPagesWithProp.php b/includes/api/ApiQueryPagesWithProp.php
index 0132fc3e..6f2f02e4 100644
--- a/includes/api/ApiQueryPagesWithProp.php
+++ b/includes/api/ApiQueryPagesWithProp.php
@@ -133,7 +133,7 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
 			'prop' => array(
 				ApiBase::PARAM_DFLT => 'ids|title',
 				ApiBase::PARAM_ISMULTI => true,
-				ApiBase::PARAM_TYPE => array (
+				ApiBase::PARAM_TYPE => array(
 					'ids',
 					'title',
 					'value',
diff --git a/includes/api/ApiQueryProtectedTitles.php b/includes/api/ApiQueryProtectedTitles.php
index 4aa00007..222ad074 100644
--- a/includes/api/ApiQueryProtectedTitles.php
+++ b/includes/api/ApiQueryProtectedTitles.php
@@ -157,7 +157,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
 				ApiBase::PARAM_ISMULTI => true,
 				ApiBase::PARAM_TYPE => array_diff( $wgRestrictionLevels, array( '' ) )
 			),
-			'limit' => array (
+			'limit' => array(
 				ApiBase::PARAM_DFLT => 10,
 				ApiBase::PARAM_TYPE => 'limit',
 				ApiBase::PARAM_MIN => 1,
diff --git a/includes/api/ApiQueryQueryPage.php b/includes/api/ApiQueryQueryPage.php
index b03bdfb8..79fe0498 100644
--- a/includes/api/ApiQueryQueryPage.php
+++ b/includes/api/ApiQueryQueryPage.php
@@ -32,27 +32,18 @@
 class ApiQueryQueryPage extends ApiQueryGeneratorBase {
 	private $qpMap;
 
-	/**
-	 * Some query pages are useless because they're available elsewhere in the API
-	 */
-	private $uselessQueryPages = array(
-		'MIMEsearch', // aiprop=mime
-		'LinkSearch', // list=exturlusage
-		'FileDuplicateSearch', // prop=duplicatefiles
-	);
-
 	public function __construct( $query, $moduleName ) {
 		parent::__construct( $query, $moduleName, 'qp' );
 		// We need to do this to make sure $wgQueryPages is set up
 		// This SUCKS
 		global $IP;
-		require_once( "$IP/includes/QueryPage.php" );
+		require_once "$IP/includes/QueryPage.php";
 
 		// Build mapping from special page names to QueryPage classes
-		global $wgQueryPages;
+		global $wgQueryPages, $wgAPIUselessQueryPages;
 		$this->qpMap = array();
 		foreach ( $wgQueryPages as $page ) {
-			if( !in_array( $page[1], $this->uselessQueryPages ) ) {
+			if ( !in_array( $page[1], $wgAPIUselessQueryPages ) ) {
 				$this->qpMap[$page[1]] = $page[0];
 			}
 		}
@@ -222,4 +213,8 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
 			'api.php?action=query&list=querypage&qppage=Ancientpages'
 		);
 	}
+
+	public function getHelpUrls() {
+		return 'https://www.mediawiki.org/wiki/API:Querypage';
+	}
 }
diff --git a/includes/api/ApiQueryRandom.php b/includes/api/ApiQueryRandom.php
index ae3bb893..2754bdae 100644
--- a/includes/api/ApiQueryRandom.php
+++ b/includes/api/ApiQueryRandom.php
@@ -185,4 +185,8 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
 	public function getExamples() {
 		return 'api.php?action=query&list=random&rnnamespace=0&rnlimit=2';
 	}
+
+	public function getHelpUrls() {
+		return 'https://www.mediawiki.org/wiki/API:Random';
+	}
 }
diff --git a/includes/api/ApiQueryRecentChanges.php b/includes/api/ApiQueryRecentChanges.php
index 8aceab22..6b10bdc6 100644
--- a/includes/api/ApiQueryRecentChanges.php
+++ b/includes/api/ApiQueryRecentChanges.php
@@ -39,7 +39,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 	private $fld_comment = false, $fld_parsedcomment = false, $fld_user = false, $fld_userid = false,
 			$fld_flags = false, $fld_timestamp = false, $fld_title = false, $fld_ids = false,
 			$fld_sizes = false, $fld_redirect = false, $fld_patrolled = false, $fld_loginfo = false,
-			$fld_tags = false, $token = array();
+			$fld_tags = false, $fld_sha1 = false, $token = array();
 
 	private $tokenFunctions;
 
@@ -121,6 +121,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 		$this->fld_patrolled = isset( $prop['patrolled'] );
 		$this->fld_loginfo = isset( $prop['loginfo'] );
 		$this->fld_tags = isset( $prop['tags'] );
+		$this->fld_sha1 = isset( $prop['sha1'] );
 	}
 
 	public function execute() {
@@ -273,6 +274,12 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 			$this->addFields( 'ts_tags' );
 		}
 
+		if ( $this->fld_sha1 ) {
+			$this->addTables( 'revision' );
+			$this->addJoinConds( array( 'revision' => array( 'LEFT JOIN', array( 'rc_this_oldid=rev_id' ) ) ) );
+			$this->addFields( array( 'rev_sha1', 'rev_deleted' ) );
+		}
+
 		if ( $params['toponly'] || $showRedirects ) {
 			$this->addTables( 'page' );
 			$this->addJoinConds( array( 'page' => array( 'LEFT JOIN', array( 'rc_namespace=page_namespace', 'rc_title=page_title' ) ) ) );
@@ -287,8 +294,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 			$this->addTables( 'change_tag' );
 			$this->addJoinConds( array( 'change_tag' => array( 'INNER JOIN', array( 'rc_id=ct_rc_id' ) ) ) );
 			$this->addWhereFld( 'ct_tag', $params['tag'] );
-			global $wgOldChangeTagsIndex;
-			$index['change_tag'] = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
+			$index['change_tag'] = 'change_tag_tag_id';
 		}
 
 		$this->token = $params['token'];
@@ -475,6 +481,19 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 			}
 		}
 
+		if ( $this->fld_sha1 && $row->rev_sha1 !== null ) {
+			// The RevDel check should currently never pass due to the
+			// rc_deleted = 0 condition in the WHERE clause, but in case that
+			// ever changes we check it here too.
+			if ( $row->rev_deleted & Revision::DELETED_TEXT ) {
+				$vals['sha1hidden'] = '';
+			} elseif ( $row->rev_sha1 !== '' ) {
+				$vals['sha1'] = wfBaseConvert( $row->rev_sha1, 36, 16, 40 );
+			} else {
+				$vals['sha1'] = '';
+			}
+		}
+
 		if ( !is_null( $this->token ) ) {
 			$tokenFunctions = $this->getTokenFunctions();
 			foreach ( $this->token as $t ) {
@@ -499,7 +518,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 			}
 			return $retval;
 		}
-		switch( $type ) {
+		switch ( $type ) {
 			case 'edit':
 				return RC_EDIT;
 			case 'new':
@@ -571,7 +590,8 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 					'redirect',
 					'patrolled',
 					'loginfo',
-					'tags'
+					'tags',
+					'sha1',
 				)
 			),
 			'token' => array(
@@ -638,6 +658,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 				' patrolled      - Tags edits that have been patrolled',
 				' loginfo        - Adds log information (logid, logtype, etc) to log entries',
 				' tags           - Lists tags for the entry',
+				' sha1           - Adds the content checksum for entries associated with a revision',
 			),
 			'token' => 'Which tokens to obtain for each change',
 			'show' => array(
@@ -735,7 +756,17 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 					ApiBase::PROP_TYPE => 'string',
 					ApiBase::PROP_NULLABLE => true
 				)
-			)
+			),
+			'sha1' => array(
+				'sha1' => array(
+					ApiBase::PROP_TYPE => 'string',
+					ApiBase::PROP_NULLABLE => true
+				),
+				'sha1hidden' => array(
+					ApiBase::PROP_TYPE => 'boolean',
+					ApiBase::PROP_NULLABLE => true
+				),
+			),
 		);
 
 		self::addTokenProperties( $props, $this->getTokenFunctions() );
diff --git a/includes/api/ApiQueryRevisions.php b/includes/api/ApiQueryRevisions.php
index 192fe873..415288ef 100644
--- a/includes/api/ApiQueryRevisions.php
+++ b/includes/api/ApiQueryRevisions.php
@@ -146,17 +146,17 @@ class ApiQueryRevisions extends ApiQueryBase {
 		$prop = array_flip( $params['prop'] );
 
 		// Optional fields
-		$this->fld_ids = isset ( $prop['ids'] );
+		$this->fld_ids = isset( $prop['ids'] );
 		// $this->addFieldsIf('rev_text_id', $this->fld_ids); // should this be exposed?
-		$this->fld_flags = isset ( $prop['flags'] );
-		$this->fld_timestamp = isset ( $prop['timestamp'] );
-		$this->fld_comment = isset ( $prop['comment'] );
-		$this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
-		$this->fld_size = isset ( $prop['size'] );
-		$this->fld_sha1 = isset ( $prop['sha1'] );
-		$this->fld_contentmodel = isset ( $prop['contentmodel'] );
+		$this->fld_flags = isset( $prop['flags'] );
+		$this->fld_timestamp = isset( $prop['timestamp'] );
+		$this->fld_comment = isset( $prop['comment'] );
+		$this->fld_parsedcomment = isset( $prop['parsedcomment'] );
+		$this->fld_size = isset( $prop['size'] );
+		$this->fld_sha1 = isset( $prop['sha1'] );
+		$this->fld_contentmodel = isset( $prop['contentmodel'] );
 		$this->fld_userid = isset( $prop['userid'] );
-		$this->fld_user = isset ( $prop['user'] );
+		$this->fld_user = isset( $prop['user'] );
 		$this->token = $params['token'];
 
 		if ( !empty( $params['contentformat'] ) ) {
@@ -189,8 +189,7 @@ class ApiQueryRevisions extends ApiQueryBase {
 			$this->addTables( 'change_tag' );
 			$this->addJoinConds( array( 'change_tag' => array( 'INNER JOIN', array( 'rev_id=ct_rev_id' ) ) ) );
 			$this->addWhereFld( 'ct_tag', $params['tag'] );
-			global $wgOldChangeTagsIndex;
-			$index['change_tag'] = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
+			$index['change_tag'] = 'change_tag_tag_id';
 		}
 
 		if ( isset( $prop['content'] ) || !is_null( $this->difftotext ) ) {
@@ -520,7 +519,7 @@ class ApiQueryRevisions extends ApiQueryBase {
 				} else {
 					$this->setWarning( "Conversion to XML is supported for wikitext only, " .
 										$title->getPrefixedDBkey() .
-										" uses content model " . $content->getModel() . ")" );
+										" uses content model " . $content->getModel() );
 				}
 			}
 
@@ -533,7 +532,7 @@ class ApiQueryRevisions extends ApiQueryBase {
 				} else {
 					$this->setWarning( "Template expansion is supported for wikitext only, " .
 						$title->getPrefixedDBkey() .
-						" uses content model " . $content->getModel() . ")" );
+						" uses content model " . $content->getModel() );
 
 					$text = false;
 				}
@@ -550,7 +549,7 @@ class ApiQueryRevisions extends ApiQueryBase {
 				if ( !$content->isSupportedFormat( $format ) ) {
 					$name = $title->getPrefixedDBkey();
 
-					$this->dieUsage( "The requested format {$this->contentFormat} is not supported ".
+					$this->dieUsage( "The requested format {$this->contentFormat} is not supported " .
 									"for content model $model used by $name", 'badformat' );
 				}
 
@@ -593,7 +592,7 @@ class ApiQueryRevisions extends ApiQueryBase {
 
 						$name = $title->getPrefixedDBkey();
 
-						$this->dieUsage( "The requested format {$this->contentFormat} is not supported for ".
+						$this->dieUsage( "The requested format {$this->contentFormat} is not supported for " .
 											"content model $model used by $name", 'badformat' );
 					}
 
diff --git a/includes/api/ApiQuerySearch.php b/includes/api/ApiQuerySearch.php
index 86183391..36b55979 100644
--- a/includes/api/ApiQuerySearch.php
+++ b/includes/api/ApiQuerySearch.php
@@ -31,6 +31,14 @@
  */
 class ApiQuerySearch extends ApiQueryGeneratorBase {
 
+	/**
+	 * When $wgSearchType is null, $wgSearchAlternatives[0] is null. Null isn't
+	 * a valid option for an array for PARAM_TYPE, so we'll use a fake name
+	 * that can't possibly be a class name and describes what the null behavior
+	 * does
+	 */
+	const BACKEND_NULL_PARAM = 'database-backed';
+
 	public function __construct( $query, $moduleName ) {
 		parent::__construct( $query, $moduleName, 'sr' );
 	}
@@ -59,7 +67,8 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
 		$prop = array_flip( $params['prop'] );
 
 		// Create search engine instance and set options
-		$search = SearchEngine::create();
+		$search = isset( $params['backend'] ) && $params['backend'] != self::BACKEND_NULL_PARAM ?
+			SearchEngine::create( $params['backend'] ) : SearchEngine::create();
 		$search->setLimitOffset( $limit + 1, $params['offset'] );
 		$search->setNamespaces( $params['namespace'] );
 		$search->showRedirects = $params['redirects'];
@@ -93,6 +102,8 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
 		}
 		if ( is_null( $matches ) ) {
 			$this->dieUsage( "{$what} search is disabled", "search-{$what}-disabled" );
+		} elseif ( $matches instanceof Status && !$matches->isGood() ) {
+			$this->dieUsage( $matches->getWikiText(), 'search-error' );
 		}
 
 		$apiResult = $this->getResult();
@@ -199,7 +210,9 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
 	}
 
 	public function getAllowedParams() {
-		return array(
+		global $wgSearchType;
+
+		$params = array(
 			'search' => array(
 				ApiBase::PARAM_TYPE => 'string',
 				ApiBase::PARAM_REQUIRED => true
@@ -252,10 +265,23 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
 				ApiBase::PARAM_MAX2 => ApiBase::LIMIT_SML2
 			)
 		);
+
+		$alternatives = SearchEngine::getSearchTypes();
+		if ( count( $alternatives ) > 1 ) {
+			if ( $alternatives[0] === null ) {
+				$alternatives[0] = self::BACKEND_NULL_PARAM;
+			}
+			$params['backend'] = array(
+				ApiBase::PARAM_DFLT => $wgSearchType,
+				ApiBase::PARAM_TYPE => $alternatives,
+			);
+		}
+
+		return $params;
 	}
 
 	public function getParamDescription() {
-		return array(
+		$descriptions = array(
 			'search' => 'Search for all page titles (or content) that has this value',
 			'namespace' => 'The namespace(s) to enumerate',
 			'what' => 'Search inside the text or titles',
@@ -278,6 +304,12 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
 			'offset' => 'Use this value to continue paging (return by query)',
 			'limit' => 'How many total pages to return'
 		);
+
+		if ( count( SearchEngine::getSearchTypes() ) > 1 ) {
+			$descriptions['backend'] = 'Which search backend to use, if not the default';
+		}
+
+		return $descriptions;
 	}
 
 	public function getResultProperties() {
@@ -345,6 +377,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
 		return array_merge( parent::getPossibleErrors(), array(
 			array( 'code' => 'search-text-disabled', 'info' => 'text search is disabled' ),
 			array( 'code' => 'search-title-disabled', 'info' => 'title search is disabled' ),
+			array( 'code' => 'search-error', 'info' => 'search error has occurred' ),
 		) );
 	}
 
diff --git a/includes/api/ApiQuerySiteinfo.php b/includes/api/ApiQuerySiteinfo.php
index 810e1d6b..a7767062 100644
--- a/includes/api/ApiQuerySiteinfo.php
+++ b/includes/api/ApiQuerySiteinfo.php
@@ -121,14 +121,29 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 		$data = array();
 		$mainPage = Title::newMainPage();
 		$data['mainpage'] = $mainPage->getPrefixedText();
-		$data['base'] = wfExpandUrl( $mainPage->getFullUrl(), PROTO_CURRENT );
+		$data['base'] = wfExpandUrl( $mainPage->getFullURL(), PROTO_CURRENT );
 		$data['sitename'] = $GLOBALS['wgSitename'];
+		$data['logo'] = $GLOBALS['wgLogo'];
 		$data['generator'] = "MediaWiki {$GLOBALS['wgVersion']}";
 		$data['phpversion'] = phpversion();
 		$data['phpsapi'] = PHP_SAPI;
 		$data['dbtype'] = $GLOBALS['wgDBtype'];
 		$data['dbversion'] = $this->getDB()->getServerVersion();
 
+		$allowFrom = array( '' );
+		$allowException = true;
+		if ( !$GLOBALS['wgAllowExternalImages'] ) {
+			if ( $GLOBALS['wgEnableImageWhitelist'] ) {
+				$data['imagewhitelistenabled'] = '';
+			}
+			$allowFrom = $GLOBALS['wgAllowExternalImagesFrom'];
+			$allowException = !empty( $allowFrom );
+		}
+		if ( $allowException ) {
+			$data['externalimages'] = (array)$allowFrom;
+			$this->getResult()->setIndexedTagName( $data['externalimages'], 'prefix' );
+		}
+
 		if ( !$wgDisableLangConversion ) {
 			$data['langconversion'] = '';
 		}
@@ -170,15 +185,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 		$data['lang'] = $GLOBALS['wgLanguageCode'];
 
 		$fallbacks = array();
-		foreach( $wgContLang->getFallbackLanguages() as $code ) {
+		foreach ( $wgContLang->getFallbackLanguages() as $code ) {
 			$fallbacks[] = array( 'code' => $code );
 		}
 		$data['fallback'] = $fallbacks;
 		$this->getResult()->setIndexedTagName( $data['fallback'], 'lang' );
 
-		if( $wgContLang->hasVariants() ) {
+		if ( $wgContLang->hasVariants() ) {
 			$variants = array();
-			foreach( $wgContLang->getVariants() as $code ) {
+			foreach ( $wgContLang->getVariants() as $code ) {
 				$variants[] = array( 'code' => $code );
 			}
 			$data['variants'] = $variants;
@@ -281,6 +296,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 			$data[] = $item;
 		}
 
+		sort( $data );
+
 		$this->getResult()->setIndexedTagName( $data, 'ns' );
 		return $this->getResult()->addValue( 'query', $property, $data );
 	}
@@ -345,10 +362,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 				$val['language'] = $langNames[$prefix];
 			}
 			$val['url'] = wfExpandUrl( $row['iw_url'], PROTO_CURRENT );
-			if( isset( $row['iw_wikiid'] ) ) {
+			if ( isset( $row['iw_wikiid'] ) ) {
 				$val['wikiid'] = $row['iw_wikiid'];
 			}
-			if( isset( $row['iw_api'] ) ) {
+			if ( isset( $row['iw_api'] ) ) {
 				$val['api'] = $row['iw_api'];
 			}
 
@@ -404,11 +421,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 		$data['activeusers'] = intval( SiteStats::activeUsers() );
 		$data['admins'] = intval( SiteStats::numberingroup( 'sysop' ) );
 		$data['jobs'] = intval( SiteStats::jobs() );
+
+		wfRunHooks( 'APIQuerySiteInfoStatisticsInfo', array( &$data ) );
+
 		return $this->getResult()->addValue( 'query', $property, $data );
 	}
 
 	protected function appendUserGroups( $property, $numberInGroup ) {
-		global $wgGroupPermissions, $wgAddGroups, $wgRemoveGroups, $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
+		global $wgGroupPermissions, $wgAddGroups, $wgRemoveGroups;
+		global $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
 
 		$data = array();
 		$result = $this->getResult();
@@ -456,7 +477,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 		global $wgFileExtensions;
 
 		$data = array();
-		foreach ( $wgFileExtensions as $ext ) {
+		foreach ( array_unique( $wgFileExtensions ) as $ext ) {
 			$data[] = array( 'ext' => $ext );
 		}
 		$this->getResult()->setIndexedTagName( $data, 'fe' );
@@ -520,7 +541,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
 		$data = array(
 			'url' => $url ? $url : '',
-			'text' => $text ?  $text : ''
+			'text' => $text ? $text : ''
 		);
 
 		return $this->getResult()->addValue( 'query', $property, $data );
@@ -544,9 +565,17 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
 	public function appendSkins( $property ) {
 		$data = array();
+		$usable = Skin::getUsableSkins();
+		$default = Skin::normalizeKey( 'default' );
 		foreach ( Skin::getSkinNames() as $name => $displayName ) {
 			$skin = array( 'code' => $name );
 			ApiResult::setContent( $skin, $displayName );
+			if ( !isset( $usable[$name] ) ) {
+				$skin['unusable'] = '';
+			}
+			if ( $name === $default ) {
+				$skin['default'] = '';
+			}
 			$data[] = $skin;
 		}
 		$this->getResult()->setIndexedTagName( $data, 'skin' );
@@ -661,13 +690,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 				' specialpagealiases    - List of special page aliases',
 				' magicwords            - List of magic words and their aliases',
 				' statistics            - Returns site statistics',
-				" interwikimap          - Returns interwiki map (optionally filtered, (optionally localised by using {$p}inlanguagecode))",
+				" interwikimap          - Returns interwiki map " .
+					"(optionally filtered, (optionally localised by using {$p}inlanguagecode))",
 				' dbrepllag             - Returns database server with the highest replication lag',
 				' usergroups            - Returns user groups and the associated permissions',
 				' extensions            - Returns extensions installed on the wiki',
 				' fileextensions        - Returns list of file extensions allowed to be uploaded',
 				' rightsinfo            - Returns wiki rights (license) information if available',
-				" languages             - Returns a list of languages MediaWiki supports (optionally localised by using {$p}inlanguagecode)",
+				" languages             - Returns a list of languages MediaWiki supports" .
+					"(optionally localised by using {$p}inlanguagecode)",
 				' skins                 - Returns a list of all enabled skins',
 				' extensiontags         - Returns a list of parser extension tags',
 				' functionhooks         - Returns a list of parser function hooks',
@@ -675,7 +706,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 				' variables             - Returns a list of variable IDs',
 				' protocols             - Returns a list of protocols that are allowed in external links.',
 			),
-			'filteriw' =>  'Return only local or only nonlocal entries of the interwiki map',
+			'filteriw' => 'Return only local or only nonlocal entries of the interwiki map',
 			'showalldb' => 'List all database servers, not just the one lagging the most',
 			'numberingroup' => 'Lists the number of users in user groups',
 			'inlanguagecode' => 'Language code for localised language names (best effort, use CLDR extension)',
@@ -687,9 +718,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 	}
 
 	public function getPossibleErrors() {
-		return array_merge( parent::getPossibleErrors(), array(
-			array( 'code' => 'includeAllDenied', 'info' => 'Cannot view all servers info unless $wgShowHostnames is true' ),
-		) );
+		return array_merge( parent::getPossibleErrors(), array( array(
+			'code' => 'includeAllDenied',
+			'info' => 'Cannot view all servers info unless $wgShowHostnames is true'
+		), ) );
 	}
 
 	public function getExamples() {
diff --git a/includes/api/ApiQueryTags.php b/includes/api/ApiQueryTags.php
index e0637ff7..732df9a4 100644
--- a/includes/api/ApiQueryTags.php
+++ b/includes/api/ApiQueryTags.php
@@ -133,8 +133,7 @@ class ApiQueryTags extends ApiQueryBase {
 
 	public function getAllowedParams() {
 		return array(
-			'continue' => array(
-			),
+			'continue' => null,
 			'limit' => array(
 				ApiBase::PARAM_DFLT => 10,
 				ApiBase::PARAM_TYPE => 'limit',
@@ -195,4 +194,8 @@ class ApiQueryTags extends ApiQueryBase {
 			'api.php?action=query&list=tags&tgprop=displayname|description|hitcount'
 		);
 	}
+
+	public function getHelpUrls() {
+		return 'https://www.mediawiki.org/wiki/API:Tags';
+	}
 }
diff --git a/includes/api/ApiQueryUserContributions.php b/includes/api/ApiQueryUserContributions.php
index 597c412d..9a9be7b2 100644
--- a/includes/api/ApiQueryUserContributions.php
+++ b/includes/api/ApiQueryUserContributions.php
@@ -48,7 +48,7 @@ class ApiQueryContributions extends ApiQueryBase {
 		$this->fld_ids = isset( $prop['ids'] );
 		$this->fld_title = isset( $prop['title'] );
 		$this->fld_comment = isset( $prop['comment'] );
-		$this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
+		$this->fld_parsedcomment = isset( $prop['parsedcomment'] );
 		$this->fld_size = isset( $prop['size'] );
 		$this->fld_sizediff = isset( $prop['sizediff'] );
 		$this->fld_flags = isset( $prop['flags'] );
@@ -83,10 +83,10 @@ class ApiQueryContributions extends ApiQueryBase {
 		// Do the actual query.
 		$res = $this->select( __METHOD__ );
 
-		if( $this->fld_sizediff ) {
+		if ( $this->fld_sizediff ) {
 			$revIds = array();
 			foreach ( $res as $row ) {
-				if( $row->rev_parent_id ) {
+				if ( $row->rev_parent_id ) {
 					$revIds[] = $row->rev_parent_id;
 				}
 			}
@@ -255,7 +255,7 @@ class ApiQueryContributions extends ApiQueryBase {
 		$this->addFieldsIf( 'rev_comment', $this->fld_comment || $this->fld_parsedcomment );
 		$this->addFieldsIf( 'rev_len', $this->fld_size || $this->fld_sizediff );
 		$this->addFieldsIf( 'rev_minor_edit', $this->fld_flags );
-		$this->addFieldsIf( 'rev_parent_id', $this->fld_flags || $this->fld_sizediff );
+		$this->addFieldsIf( 'rev_parent_id', $this->fld_flags || $this->fld_sizediff || $this->fld_ids );
 		$this->addFieldsIf( 'rc_patrolled', $this->fld_patrolled );
 
 		if ( $this->fld_tags ) {
@@ -268,8 +268,7 @@ class ApiQueryContributions extends ApiQueryBase {
 			$this->addTables( 'change_tag' );
 			$this->addJoinConds( array( 'change_tag' => array( 'INNER JOIN', array( 'rev_id=ct_rev_id' ) ) ) );
 			$this->addWhereFld( 'ct_tag', $this->params['tag'] );
-			global $wgOldChangeTagsIndex;
-			$index['change_tag'] = $wgOldChangeTagsIndex ? 'ct_tag' : 'change_tag_tag_id';
+			$index['change_tag'] = 'change_tag_tag_id';
 		}
 
 		if ( $this->params['toponly'] ) {
@@ -297,6 +296,10 @@ class ApiQueryContributions extends ApiQueryBase {
 			$vals['pageid'] = intval( $row->rev_page );
 			$vals['revid'] = intval( $row->rev_id );
 			// $vals['textid'] = intval( $row->rev_text_id ); // todo: Should this field be exposed?
+
+			if ( !is_null( $row->rev_parent_id ) ) {
+				$vals['parentid'] = intval( $row->rev_parent_id );
+			}
 		}
 
 		$title = Title::makeTitle( $row->page_namespace, $row->page_title );
@@ -474,7 +477,11 @@ class ApiQueryContributions extends ApiQueryBase {
 			),
 			'ids' => array(
 				'pageid' => 'integer',
-				'revid' => 'integer'
+				'revid' => 'integer',
+				'parentid' => array(
+					ApiBase::PROP_TYPE => 'integer',
+					ApiBase::PROP_NULLABLE => true
+				)
 			),
 			'title' => array(
 				'ns' => 'namespace',
diff --git a/includes/api/ApiQueryUserInfo.php b/includes/api/ApiQueryUserInfo.php
index 1a491eca..3c85ea69 100644
--- a/includes/api/ApiQueryUserInfo.php
+++ b/includes/api/ApiQueryUserInfo.php
@@ -104,12 +104,15 @@ class ApiQueryUserInfo extends ApiQueryBase {
 		}
 
 		if ( isset( $this->prop['preferencestoken'] ) &&
-			is_null( $this->getMain()->getRequest()->getVal( 'callback' ) )
+			is_null( $this->getMain()->getRequest()->getVal( 'callback' ) ) &&
+			$user->isAllowed( 'editmyoptions' )
 		) {
 			$vals['preferencestoken'] = $user->getEditToken( '', $this->getMain()->getRequest() );
 		}
 
 		if ( isset( $this->prop['editcount'] ) ) {
+			// use intval to prevent null if a non-logged-in user calls
+			// api.php?format=jsonfm&action=query&meta=userinfo&uiprop=editcount
 			$vals['editcount'] = intval( $user->getEditCount() );
 		}
 
@@ -121,11 +124,13 @@ class ApiQueryUserInfo extends ApiQueryBase {
 			$vals['realname'] = $user->getRealName();
 		}
 
-		if ( isset( $this->prop['email'] ) ) {
-			$vals['email'] = $user->getEmail();
-			$auth = $user->getEmailAuthenticationTimestamp();
-			if ( !is_null( $auth ) ) {
-				$vals['emailauthenticated'] = wfTimestamp( TS_ISO_8601, $auth );
+		if ( $user->isAllowed( 'viewmyprivateinfo' ) ) {
+			if ( isset( $this->prop['email'] ) ) {
+				$vals['email'] = $user->getEmail();
+				$auth = $user->getEmailAuthenticationTimestamp();
+				if ( !is_null( $auth ) ) {
+					$vals['emailauthenticated'] = wfTimestamp( TS_ISO_8601, $auth );
+				}
 			}
 		}
 
@@ -167,8 +172,9 @@ class ApiQueryUserInfo extends ApiQueryBase {
 		if ( $user->isNewbie() ) {
 			$categories[] = 'ip';
 			$categories[] = 'subnet';
-			if ( !$user->isAnon() )
+			if ( !$user->isAnon() ) {
 				$categories[] = 'newbie';
+			}
 		}
 		$categories = array_merge( $categories, $user->getGroups() );
 
diff --git a/includes/api/ApiQueryUsers.php b/includes/api/ApiQueryUsers.php
index 72ab7866..dccfee67 100644
--- a/includes/api/ApiQueryUsers.php
+++ b/includes/api/ApiQueryUsers.php
@@ -127,7 +127,7 @@ class ApiQueryUsers extends ApiQueryBase {
 				$this->addFields( array( 'user_name', 'ug_group' ) );
 				$userGroupsRes = $this->select( __METHOD__ );
 
-				foreach( $userGroupsRes as $row ) {
+				foreach ( $userGroupsRes as $row ) {
 					$userGroups[$row->user_name][] = $row->ug_group;
 				}
 			}
@@ -149,7 +149,7 @@ class ApiQueryUsers extends ApiQueryBase {
 				$data[$name]['name'] = $name;
 
 				if ( isset( $this->prop['editcount'] ) ) {
-					$data[$name]['editcount'] = intval( $user->getEditCount() );
+					$data[$name]['editcount'] = $user->getEditCount();
 				}
 
 				if ( isset( $this->prop['registration'] ) ) {
@@ -204,11 +204,13 @@ class ApiQueryUsers extends ApiQueryBase {
 			}
 		}
 
+		$context = $this->getContext();
 		// Second pass: add result data to $retval
 		foreach ( $goodNames as $u ) {
 			if ( !isset( $data[$u] ) ) {
 				$data[$u] = array( 'name' => $u );
 				$urPage = new UserrightsPage;
+				$urPage->setContext( $context );
 				$iwUser = $urPage->fetchUser( $u );
 
 				if ( $iwUser instanceof UserRightsProxy ) {
diff --git a/includes/api/ApiQueryWatchlist.php b/includes/api/ApiQueryWatchlist.php
index 90b12c14..22843f50 100644
--- a/includes/api/ApiQueryWatchlist.php
+++ b/includes/api/ApiQueryWatchlist.php
@@ -68,7 +68,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 			$this->fld_user = isset( $prop['user'] );
 			$this->fld_userid = isset( $prop['userid'] );
 			$this->fld_comment = isset( $prop['comment'] );
-			$this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
+			$this->fld_parsedcomment = isset( $prop['parsedcomment'] );
 			$this->fld_timestamp = isset( $prop['timestamp'] );
 			$this->fld_sizes = isset( $prop['sizes'] );
 			$this->fld_patrol = isset( $prop['patrol'] );
@@ -135,7 +135,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
 		if ( !$params['allrev'] ) {
 			$this->addTables( 'page' );
-			$this->addJoinConds( array( 'page' => array( 'LEFT JOIN','rc_cur_id=page_id' ) ) );
+			$this->addJoinConds( array( 'page' => array( 'LEFT JOIN', 'rc_cur_id=page_id' ) ) );
 			$this->addWhere( 'rc_this_oldid=page_latest OR rc_type=' . RC_LOG );
 		}
 
@@ -143,12 +143,11 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 			$show = array_flip( $params['show'] );
 
 			/* Check for conflicting parameters. */
-			if ( ( isset ( $show['minor'] ) && isset ( $show['!minor'] ) )
-					|| ( isset ( $show['bot'] ) && isset ( $show['!bot'] ) )
-					|| ( isset ( $show['anon'] ) && isset ( $show['!anon'] ) )
-					|| ( isset ( $show['patrolled'] ) && isset ( $show['!patrolled'] ) )
-			)
-			{
+			if ( ( isset( $show['minor'] ) && isset( $show['!minor'] ) )
+					|| ( isset( $show['bot'] ) && isset( $show['!bot'] ) )
+					|| ( isset( $show['anon'] ) && isset( $show['!anon'] ) )
+					|| ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) )
+			) {
 				$this->dieUsageMsg( 'show' );
 			}
 
@@ -171,6 +170,10 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 			$this->addWhereIf( 'rc_patrolled != 0', isset( $show['patrolled'] ) );
 		}
 
+		if ( !is_null( $params['type'] ) ) {
+			$this->addWhereFld( 'rc_type', $this->parseRCType( $params['type'] ) );
+		}
+
 		if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
 			$this->dieUsage( 'user and excludeuser cannot be used together', 'user-excludeuser' );
 		}
@@ -226,6 +229,32 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 	private function extractRowInfo( $row ) {
 		$vals = array();
 
+		$type = intval( $row->rc_type );
+
+		/* Determine what kind of change this was. */
+		switch ( $type ) {
+			case RC_EDIT:
+				$vals['type'] = 'edit';
+				break;
+			case RC_NEW:
+				$vals['type'] = 'new';
+				break;
+			case RC_MOVE:
+				$vals['type'] = 'move';
+				break;
+			case RC_LOG:
+				$vals['type'] = 'log';
+				break;
+			case RC_EXTERNAL:
+				$vals['type'] = 'external';
+				break;
+			case RC_MOVE_OVER_REDIRECT:
+				$vals['type'] = 'move over redirect';
+				break;
+			default:
+				$vals['type'] = $type;
+		}
+
 		if ( $this->fld_ids ) {
 			$vals['pageid'] = intval( $row->rc_cur_id );
 			$vals['revid'] = intval( $row->rc_this_oldid );
@@ -312,6 +341,27 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 		return $vals;
 	}
 
+	/* Copied from ApiQueryRecentChanges. */
+	private function parseRCType( $type ) {
+		if ( is_array( $type ) ) {
+			$retval = array();
+			foreach ( $type as $t ) {
+				$retval[] = $this->parseRCType( $t );
+			}
+			return $retval;
+		}
+		switch ( $type ) {
+			case 'edit':
+				return RC_EDIT;
+			case 'new':
+				return RC_NEW;
+			case 'log':
+				return RC_LOG;
+			case 'external':
+				return RC_EXTERNAL;
+		}
+	}
+
 	public function getAllowedParams() {
 		return array(
 			'allrev' => false,
@@ -321,7 +371,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 			'end' => array(
 				ApiBase::PARAM_TYPE => 'timestamp'
 			),
-			'namespace' => array (
+			'namespace' => array(
 				ApiBase::PARAM_ISMULTI => true,
 				ApiBase::PARAM_TYPE => 'namespace'
 			),
@@ -376,6 +426,15 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 					'!patrolled',
 				)
 			),
+			'type' => array(
+				ApiBase::PARAM_ISMULTI => true,
+				ApiBase::PARAM_TYPE => array(
+					'edit',
+					'external',
+					'new',
+					'log',
+				)
+			),
 			'owner' => array(
 				ApiBase::PARAM_TYPE => 'user'
 			),
@@ -415,6 +474,13 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 				'Show only items that meet this criteria.',
 				"For example, to see only minor edits done by logged-in users, set {$p}show=minor|!anon"
 			),
+			'type' => array(
+				'Which types of changes to show',
+				' edit           - Regular page edits',
+				' external       - External changes',
+				' new            - Page creations',
+				' log            - Log entries',
+			),
 			'owner' => 'The name of the user whose watchlist you\'d like to access',
 			'token' => 'Give a security token (settable in preferences) to allow access to another user\'s watchlist'
 		);
@@ -423,6 +489,17 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 	public function getResultProperties() {
 		global $wgLogTypes;
 		return array(
+			'' => array(
+				'type' => array(
+					ApiBase::PROP_TYPE => array(
+						'edit',
+						'new',
+						'move',
+						'log',
+						'move over redirect'
+					)
+				)
+			),
 			'ids' => array(
 				'pageid' => 'integer',
 				'revid' => 'integer',
diff --git a/includes/api/ApiQueryWatchlistRaw.php b/includes/api/ApiQueryWatchlistRaw.php
index 2cb4d9eb..ea4e724a 100644
--- a/includes/api/ApiQueryWatchlistRaw.php
+++ b/includes/api/ApiQueryWatchlistRaw.php
@@ -222,4 +222,8 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
 			'api.php?action=query&generator=watchlistraw&gwrshow=changed&prop=revisions',
 		);
 	}
+
+	public function getHelpUrls() {
+		return 'https://www.mediawiki.org/wiki/API:Watchlistraw';
+	}
 }
diff --git a/includes/api/ApiRsd.php b/includes/api/ApiRsd.php
index c4a1328c..d219c91c 100644
--- a/includes/api/ApiRsd.php
+++ b/includes/api/ApiRsd.php
@@ -40,7 +40,7 @@ class ApiRsd extends ApiBase {
 		$service = array( 'apis' => $this->formatRsdApiList() );
 		ApiResult::setContent( $service, 'MediaWiki', 'engineName' );
 		ApiResult::setContent( $service, 'https://www.mediawiki.org/', 'engineLink' );
-		ApiResult::setContent( $service, Title::newMainPage()->getCanonicalUrl(), 'homePageLink' );
+		ApiResult::setContent( $service, Title::newMainPage()->getCanonicalURL(), 'homePageLink' );
 
 		$result->setIndexedTagName( $service['apis'], 'api' );
 
diff --git a/includes/api/ApiSetNotificationTimestamp.php b/includes/api/ApiSetNotificationTimestamp.php
index 58d5d9ab..53a68fde 100644
--- a/includes/api/ApiSetNotificationTimestamp.php
+++ b/includes/api/ApiSetNotificationTimestamp.php
@@ -39,6 +39,9 @@ class ApiSetNotificationTimestamp extends ApiBase {
 		if ( $user->isAnon() ) {
 			$this->dieUsage( 'Anonymous users cannot use watchlist change notifications', 'notloggedin' );
 		}
+		if ( !$user->isAllowed( 'editmywatchlist' ) ) {
+			$this->dieUsage( 'You don\'t have permission to edit your watchlist', 'permissiondenied' );
+		}
 
 		$params = $this->extractRequestParams();
 		$this->requireMaxOneParameter( $params, 'timestamp', 'torevid', 'newerthanrevid' );
@@ -212,7 +215,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
 	}
 
 	public function getParamDescription() {
-		return $this->getPageSet()->getParamDescription() + array(
+		return $this->getPageSet()->getFinalParamDescription() + array(
 			'entirewatchlist' => 'Work on all watched pages',
 			'timestamp' => 'Timestamp to which to set the notification timestamp',
 			'torevid' => 'Revision to set the notification timestamp to (one page only)',
@@ -270,7 +273,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
 		$ps = $this->getPageSet();
 		return array_merge(
 			parent::getPossibleErrors(),
-			$ps->getPossibleErrors(),
+			$ps->getFinalPossibleErrors(),
 			$this->getRequireMaxOneParameterErrorMessages(
 				array( 'timestamp', 'torevid', 'newerthanrevid' ) ),
 			$this->getRequireOnlyOneParameterErrorMessages(
diff --git a/includes/api/ApiUpload.php b/includes/api/ApiUpload.php
index 7d67aa6e..467eccf8 100644
--- a/includes/api/ApiUpload.php
+++ b/includes/api/ApiUpload.php
@@ -56,15 +56,19 @@ class ApiUpload extends ApiBase {
 		$this->mParams['chunk'] = $request->getFileName( 'chunk' );
 
 		// Copy the session key to the file key, for backward compatibility.
-		if( !$this->mParams['filekey'] && $this->mParams['sessionkey'] ) {
+		if ( !$this->mParams['filekey'] && $this->mParams['sessionkey'] ) {
 			$this->mParams['filekey'] = $this->mParams['sessionkey'];
 		}
 
 		// Select an upload module
-		if ( !$this->selectUploadModule() ) {
-			return; // not a true upload, but a status request or similar
-		} elseif ( !isset( $this->mUpload ) ) {
-			$this->dieUsage( 'No upload module set', 'nomodule' );
+		try {
+			if ( !$this->selectUploadModule() ) {
+				return; // not a true upload, but a status request or similar
+			} elseif ( !isset( $this->mUpload ) ) {
+				$this->dieUsage( 'No upload module set', 'nomodule' );
+			}
+		} catch ( UploadStashException $e ) { // XXX: don't spam exception log
+			$this->dieUsage( get_class( $e ) . ": " . $e->getMessage(), 'stasherror' );
 		}
 
 		// First check permission to upload
@@ -82,7 +86,7 @@ class ApiUpload extends ApiBase {
 		// Check if the uploaded file is sane
 		if ( $this->mParams['chunk'] ) {
 			$maxSize = $this->mUpload->getMaxUploadSize();
-			if( $this->mParams['filesize'] > $maxSize ) {
+			if ( $this->mParams['filesize'] > $maxSize ) {
 				$this->dieUsage( 'The file you submitted was too large', 'file-too-large' );
 			}
 			if ( !$this->mUpload->getTitle() ) {
@@ -106,9 +110,13 @@ class ApiUpload extends ApiBase {
 		}
 
 		// Get the result based on the current upload context:
-		$result = $this->getContextResult();
-		if ( $result['result'] === 'Success' ) {
-			$result['imageinfo'] = $this->mUpload->getImageInfo( $this->getResult() );
+		try {
+			$result = $this->getContextResult();
+			if ( $result['result'] === 'Success' ) {
+				$result['imageinfo'] = $this->mUpload->getImageInfo( $this->getResult() );
+			}
+		} catch ( UploadStashException $e ) { // XXX: don't spam exception log
+			$this->dieUsage( get_class( $e ) . ": " . $e->getMessage(), 'stasherror' );
 		}
 
 		$this->getResult()->addValue( null, $this->getModuleName(), $result );
@@ -144,7 +152,7 @@ class ApiUpload extends ApiBase {
 	 * @return array
 	 */
 	private function getStashResult( $warnings ) {
-		$result = array ();
+		$result = array();
 		// Some uploads can request they be stashed, so as not to publish them immediately.
 		// In this case, a failure to stash ought to be fatal
 		try {
@@ -216,27 +224,27 @@ class ApiUpload extends ApiBase {
 		// Check we added the last chunk:
 		if ( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
 			if ( $this->mParams['async'] ) {
-				$progress = UploadBase::getSessionStatus( $this->mParams['filekey'] );
+				$progress = UploadBase::getSessionStatus( $filekey );
 				if ( $progress && $progress['result'] === 'Poll' ) {
 					$this->dieUsage( "Chunk assembly already in progress.", 'stashfailed' );
 				}
 				UploadBase::setSessionStatus(
-					$this->mParams['filekey'],
+					$filekey,
 					array( 'result' => 'Poll',
 						'stage' => 'queued', 'status' => Status::newGood() )
 				);
 				$ok = JobQueueGroup::singleton()->push( new AssembleUploadChunksJob(
-					Title::makeTitle( NS_FILE, $this->mParams['filekey'] ),
+					Title::makeTitle( NS_FILE, $filekey ),
 					array(
-						'filename'  => $this->mParams['filename'],
-						'filekey'   => $this->mParams['filekey'],
-						'session'   => $this->getContext()->exportSession()
+						'filename' => $this->mParams['filename'],
+						'filekey' => $filekey,
+						'session' => $this->getContext()->exportSession()
 					)
 				) );
 				if ( $ok ) {
 					$result['result'] = 'Poll';
 				} else {
-					UploadBase::setSessionStatus( $this->mParams['filekey'], false );
+					UploadBase::setSessionStatus( $filekey, false );
 					$this->dieUsage(
 						"Failed to start AssembleUploadChunks.php", 'stashfailed' );
 				}
@@ -358,11 +366,9 @@ class ApiUpload extends ApiBase {
 		}
 
 		if ( $this->mParams['chunk'] ) {
-			$this->checkChunkedEnabled();
-
 			// Chunk upload
 			$this->mUpload = new UploadFromChunks();
-			if( isset( $this->mParams['filekey'] ) ) {
+			if ( isset( $this->mParams['filekey'] ) ) {
 				// handle new chunk
 				$this->mUpload->continueChunks(
 					$this->mParams['filename'],
@@ -404,6 +410,10 @@ class ApiUpload extends ApiBase {
 				$this->dieUsageMsg( 'copyuploadbaddomain' );
 			}
 
+			if ( !UploadFromUrl::isAllowedUrl( $this->mParams['url'] ) ) {
+				$this->dieUsageMsg( 'copyuploadbadurl' );
+			}
+
 			$async = false;
 			if ( $this->mParams['asyncdownload'] ) {
 				$this->checkAsyncDownloadEnabled();
@@ -452,9 +462,9 @@ class ApiUpload extends ApiBase {
 		$verification = $this->mUpload->verifyUpload();
 		if ( $verification['status'] === UploadBase::OK ) {
 			return;
-		} else {
-			return $this->checkVerification( $verification );
 		}
+
+		$this->checkVerification( $verification );
 	}
 
 	/**
@@ -463,8 +473,8 @@ class ApiUpload extends ApiBase {
 	protected function checkVerification( array $verification ) {
 		global $wgFileExtensions;
 
-		// TODO: Move them to ApiBase's message map
-		switch( $verification['status'] ) {
+		// @todo Move them to ApiBase's message map
+		switch ( $verification['status'] ) {
 			// Recoverable errors
 			case UploadBase::MIN_LENGTH_PARTNAME:
 				$this->dieRecoverableError( 'filename-tooshort', 'filename' );
@@ -494,7 +504,7 @@ class ApiUpload extends ApiBase {
 			case UploadBase::FILETYPE_BADTYPE:
 				$extradata = array(
 					'filetype' => $verification['finalExt'],
-					'allowed' => $wgFileExtensions
+					'allowed' => array_values( array_unique( $wgFileExtensions ) )
 				);
 				$this->getResult()->setIndexedTagName( $extradata['allowed'], 'ext' );
 
@@ -555,7 +565,8 @@ class ApiUpload extends ApiBase {
 			if ( isset( $warnings['exists'] ) ) {
 				$warning = $warnings['exists'];
 				unset( $warnings['exists'] );
-				$warnings[$warning['warning']] = $warning['file']->getName();
+				$localFile = isset( $warning['normalizedFile'] ) ? $warning['normalizedFile'] : $warning['file'];
+				$warnings[$warning['warning']] = $localFile->getName();
 			}
 		}
 		return $warnings;
@@ -596,12 +607,12 @@ class ApiUpload extends ApiBase {
 			$ok = JobQueueGroup::singleton()->push( new PublishStashedFileJob(
 				Title::makeTitle( NS_FILE, $this->mParams['filename'] ),
 				array(
-					'filename'  => $this->mParams['filename'],
-					'filekey'   => $this->mParams['filekey'],
-					'comment'   => $this->mParams['comment'],
-					'text'      => $this->mParams['text'],
-					'watch'     => $watch,
-					'session'   => $this->getContext()->exportSession()
+					'filename' => $this->mParams['filename'],
+					'filekey' => $this->mParams['filekey'],
+					'comment' => $this->mParams['comment'],
+					'text' => $this->mParams['text'],
+					'watch' => $watch,
+					'session' => $this->getContext()->exportSession()
 				)
 			) );
 			if ( $ok ) {
@@ -653,13 +664,6 @@ class ApiUpload extends ApiBase {
 		}
 	}
 
-	protected function checkChunkedEnabled() {
-		global $wgAllowChunkedUploads;
-		if ( !$wgAllowChunkedUploads ) {
-			$this->dieUsage( 'Chunked uploads disabled', 'chunkeduploaddisabled' );
-		}
-	}
-
 	public function mustBePosted() {
 		return true;
 	}
@@ -816,7 +820,7 @@ class ApiUpload extends ApiBase {
 				array( 'code' => 'publishfailed', 'info' => 'Publishing of stashed file failed' ),
 				array( 'code' => 'internal-error', 'info' => 'An internal error occurred' ),
 				array( 'code' => 'asynccopyuploaddisabled', 'info' => 'Asynchronous copy uploads disabled' ),
-				array( 'code' => 'chunkeduploaddisabled', 'info' => 'Chunked uploads disabled' ),
+				array( 'code' => 'stasherror', 'info' => 'An upload stash error occurred' ),
 				array( 'fileexists-forbidden' ),
 				array( 'fileexists-shared-forbidden' ),
 			)
diff --git a/includes/api/ApiUserrights.php b/includes/api/ApiUserrights.php
index b9b1eeda..7d308285 100644
--- a/includes/api/ApiUserrights.php
+++ b/includes/api/ApiUserrights.php
@@ -38,6 +38,7 @@ class ApiUserrights extends ApiBase {
 		$user = $this->getUrUser();
 
 		$form = new UserrightsPage;
+		$form->setContext( $this->getContext() );
 		$r['user'] = $user->getName();
 		$r['userid'] = $user->getId();
 		list( $r['added'], $r['removed'] ) =
@@ -62,10 +63,10 @@ class ApiUserrights extends ApiBase {
 		$params = $this->extractRequestParams();
 
 		$form = new UserrightsPage;
+		$form->setContext( $this->getContext() );
 		$status = $form->fetchUser( $params['user'] );
 		if ( !$status->isOK() ) {
-			$errors = $status->getErrorsArray();
-			$this->dieUsageMsg( $errors[0] );
+			$this->dieStatus( $status );
 		} else {
 			$user = $status->value;
 		}
@@ -83,7 +84,7 @@ class ApiUserrights extends ApiBase {
 	}
 
 	public function getAllowedParams() {
-		return array (
+		return array(
 			'user' => array(
 				ApiBase::PARAM_TYPE => 'string',
 				ApiBase::PARAM_REQUIRED => true
diff --git a/includes/api/ApiWatch.php b/includes/api/ApiWatch.php
index 3e51299f..c7d636a1 100644
--- a/includes/api/ApiWatch.php
+++ b/includes/api/ApiWatch.php
@@ -36,6 +36,9 @@ class ApiWatch extends ApiBase {
 		if ( !$user->isLoggedIn() ) {
 			$this->dieUsage( 'You must be logged-in to have a watchlist', 'notloggedin' );
 		}
+		if ( !$user->isAllowed( 'editmywatchlist' ) ) {
+			$this->dieUsage( 'You don\'t have permission to edit your watchlist', 'permissiondenied' );
+		}
 
 		$params = $this->extractRequestParams();
 		$title = Title::newFromText( $params['title'] );
@@ -57,19 +60,19 @@ class ApiWatch extends ApiBase {
 		if ( $params['unwatch'] ) {
 			$res['unwatched'] = '';
 			$res['message'] = $this->msg( 'removedwatchtext', $title->getPrefixedText() )->title( $title )->parseAsBlock();
-			$success = UnwatchAction::doUnwatch( $title, $user );
+			$status = UnwatchAction::doUnwatch( $title, $user );
 		} else {
 			$res['watched'] = '';
 			$res['message'] = $this->msg( 'addedwatchtext', $title->getPrefixedText() )->title( $title )->parseAsBlock();
-			$success = WatchAction::doWatch( $title, $user );
+			$status = WatchAction::doWatch( $title, $user );
 		}
 
 		if ( !is_null( $oldLang ) ) {
 			$this->getContext()->setLanguage( $oldLang ); // Reset language to $oldLang
 		}
 
-		if ( !$success ) {
-			$this->dieUsageMsg( 'hookaborted' );
+		if ( !$status->isOK() ) {
+			$this->dieStatus( $status );
 		}
 		$this->getResult()->addValue( null, $this->getModuleName(), $res );
 	}
diff --git a/includes/cache/BacklinkCache.php b/includes/cache/BacklinkCache.php
index a59cc9a2..193f20fe 100644
--- a/includes/cache/BacklinkCache.php
+++ b/includes/cache/BacklinkCache.php
@@ -20,6 +20,7 @@
  *
  * @file
  * @author Tim Starling
+ * @author Aaron Schulz
  * @copyright © 2009, Tim Starling, Domas Mituzas
  * @copyright © 2010, Max Sem
  * @copyright © 2011, Antoine Musso
@@ -103,7 +104,7 @@ class BacklinkCache {
 			self::$cache = new ProcessCacheLRU( 1 );
 		}
 		$dbKey = $title->getPrefixedDBkey();
-		if ( !self::$cache->has( $dbKey, 'obj' ) ) {
+		if ( !self::$cache->has( $dbKey, 'obj', 3600 ) ) {
 			self::$cache->set( $dbKey, 'obj', new self( $title ) );
 		}
 		return self::$cache->get( $dbKey, 'obj' );
@@ -147,71 +148,73 @@ class BacklinkCache {
 		if ( !isset( $this->db ) ) {
 			$this->db = wfGetDB( DB_SLAVE );
 		}
-
 		return $this->db;
 	}
 
 	/**
 	 * Get the backlinks for a given table. Cached in process memory only.
 	 * @param $table String
-	 * @param $startId Integer or false
-	 * @param $endId Integer or false
+	 * @param $startId Integer|false
+	 * @param $endId Integer|false
+	 * @param $max Integer|INF
 	 * @return TitleArrayFromResult
 	 */
-	public function getLinks( $table, $startId = false, $endId = false ) {
+	public function getLinks( $table, $startId = false, $endId = false, $max = INF ) {
+		return TitleArray::newFromResult( $this->queryLinks( $table, $startId, $endId, $max ) );
+	}
+
+	/**
+	 * Get the backlinks for a given table. Cached in process memory only.
+	 * @param $table String
+	 * @param $startId Integer|false
+	 * @param $endId Integer|false
+	 * @param $max Integer|INF
+	 * @return ResultWrapper
+	 */
+	protected function queryLinks( $table, $startId, $endId, $max ) {
 		wfProfileIn( __METHOD__ );
 
 		$fromField = $this->getPrefix( $table ) . '_from';
 
-		if ( $startId || $endId ) {
-			// Partial range, not cached
-			wfDebug( __METHOD__ . ": from DB (uncacheable range)\n" );
+		if ( !$startId && !$endId && is_infinite( $max )
+			&& isset( $this->fullResultCache[$table] ) )
+		{
+			wfDebug( __METHOD__ . ": got results from cache\n" );
+			$res = $this->fullResultCache[$table];
+		} else {
+			wfDebug( __METHOD__ . ": got results from DB\n" );
 			$conds = $this->getConditions( $table );
-
 			// Use the from field in the condition rather than the joined page_id,
 			// because databases are stupid and don't necessarily propagate indexes.
 			if ( $startId ) {
 				$conds[] = "$fromField >= " . intval( $startId );
 			}
-
 			if ( $endId ) {
 				$conds[] = "$fromField <= " . intval( $endId );
 			}
+			$options = array( 'STRAIGHT_JOIN', 'ORDER BY' => $fromField );
+			if ( is_finite( $max ) && $max > 0 ) {
+				$options['LIMIT'] = $max;
+			}
 
 			$res = $this->getDB()->select(
 				array( $table, 'page' ),
 				array( 'page_namespace', 'page_title', 'page_id' ),
 				$conds,
 				__METHOD__,
-				array(
-					'STRAIGHT_JOIN',
-					'ORDER BY' => $fromField
-				) );
-			$ta = TitleArray::newFromResult( $res );
-
-			wfProfileOut( __METHOD__ );
-			return $ta;
-		}
+				$options
+			);
 
-		// @todo FIXME: Make this a function?
-		if ( !isset( $this->fullResultCache[$table] ) ) {
-			wfDebug( __METHOD__ . ": from DB\n" );
-			$res = $this->getDB()->select(
-				array( $table, 'page' ),
-				array( 'page_namespace', 'page_title', 'page_id' ),
-				$this->getConditions( $table ),
-				__METHOD__,
-				array(
-					'STRAIGHT_JOIN',
-					'ORDER BY' => $fromField,
-				) );
-			$this->fullResultCache[$table] = $res;
+			if ( !$startId && !$endId && $res->numRows() < $max ) {
+				// The full results fit within the limit, so cache them
+				$this->fullResultCache[$table] = $res;
+			} else {
+				wfDebug( __METHOD__ . ": results from DB were uncacheable\n" );
+			}
 		}
 
-		$ta = TitleArray::newFromResult( $this->fullResultCache[$table] );
-
 		wfProfileOut( __METHOD__ );
-		return $ta;
+		return $res;
 	}
 
 	/**
@@ -234,7 +237,7 @@ class BacklinkCache {
 		} else {
 			$prefix = null;
 			wfRunHooks( 'BacklinkCacheGetPrefix', array( $table, &$prefix ) );
-			if( $prefix ) {
+			if ( $prefix ) {
 				return $prefix;
 			} else {
 				throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
@@ -289,7 +292,7 @@ class BacklinkCache {
 			default:
 				$conds = null;
 				wfRunHooks( 'BacklinkCacheGetConditions', array( $table, $this->title, &$conds ) );
-				if( !$conds ) {
+				if ( !$conds ) {
 					throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
 				}
 		}
@@ -309,7 +312,7 @@ class BacklinkCache {
 	/**
 	 * Get the approximate number of backlinks
 	 * @param $table String
-	 * @param $max integer Only count up to this many backlinks
+	 * @param $max integer|INF Only count up to this many backlinks
 	 * @return integer
 	 */
 	public function getNumLinks( $table, $max = INF ) {
@@ -335,20 +338,12 @@ class BacklinkCache {
 		}
 
 		// 4) fetch from the database ...
-		if ( is_infinite( $max ) ) { // full count
-			$count = $this->getLinks( $table )->count();
+		$count = $this->getLinks( $table, false, false, $max )->count();
+		if ( $count < $max ) { // full count
 			$wgMemc->set( $memcKey, $count, self::CACHE_EXPIRY );
-		} else { // with limit
-			$count = $this->getDB()->select(
-				array( $table, 'page' ),
-				'1',
-				$this->getConditions( $table ),
-				__METHOD__,
-				array( 'LIMIT' => $max )
-			)->numRows();
 		}
 
-		return $count;
+		return min( $max, $count );
 	}
 
 	/**
@@ -395,8 +390,28 @@ class BacklinkCache {
 		}
 
 		// 4) ... finally fetch from the slow database :(
-		$this->getLinks( $table );
-		$cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
+		$cacheEntry = array( 'numRows' => 0, 'batches' => array() ); // final result
+		// Do the selects in batches to avoid client-side OOMs (bug 43452).
+		// Use a LIMIT that plays well with $batchSize to keep equal sized partitions.
+		$selectSize = max( $batchSize, 200000 - ( 200000 % $batchSize ) );
+		$start = false;
+		do {
+			$res = $this->queryLinks( $table, $start, false, $selectSize );
+			$partitions = $this->partitionResult( $res, $batchSize, false );
+			// Merge the link count and range partitions for this chunk
+			$cacheEntry['numRows'] += $partitions['numRows'];
+			$cacheEntry['batches'] = array_merge( $cacheEntry['batches'], $partitions['batches'] );
+			if ( count( $partitions['batches'] ) ) {
+				list( $lStart, $lEnd ) = end( $partitions['batches'] );
+				$start = $lEnd + 1; // pick up after this inclusive range
+			}
+		} while ( $partitions['numRows'] >= $selectSize );
+		// Make sure the first range has start=false and the last one has end=false
+		if ( count( $cacheEntry['batches'] ) ) {
+			$cacheEntry['batches'][0][0] = false;
+			$cacheEntry['batches'][count( $cacheEntry['batches'] ) - 1][1] = false;
+		}
+
 		// Save partitions to memcached
 		$wgMemc->set( $memcKey, $cacheEntry, self::CACHE_EXPIRY );
 
@@ -412,31 +427,32 @@ class BacklinkCache {
 	 * Partition a DB result with backlinks in it into batches
 	 * @param $res ResultWrapper database result
 	 * @param $batchSize integer
+	 * @param $isComplete bool Whether $res includes all the backlinks
 	 * @throws MWException
-	 * @return array @see
+	 * @return array
 	 */
-	protected function partitionResult( $res, $batchSize ) {
+	protected function partitionResult( $res, $batchSize, $isComplete = true ) {
 		$batches = array();
 		$numRows = $res->numRows();
 		$numBatches = ceil( $numRows / $batchSize );
 
 		for ( $i = 0; $i < $numBatches; $i++ ) {
-			if ( $i == 0  ) {
+			if ( $i == 0 && $isComplete ) {
 				$start = false;
 			} else {
-				$rowNum = intval( $numRows * $i / $numBatches );
+				$rowNum = $i * $batchSize;
 				$res->seek( $rowNum );
 				$row = $res->fetchObject();
-				$start = $row->page_id;
+				$start = (int)$row->page_id;
 			}
 
-			if ( $i == $numBatches - 1 ) {
+			if ( $i == ( $numBatches - 1 ) && $isComplete ) {
 				$end = false;
 			} else {
-				$rowNum = intval( $numRows * ( $i + 1 ) / $numBatches );
+				$rowNum = min( $numRows - 1, ( $i + 1 ) * $batchSize - 1 );
 				$res->seek( $rowNum );
 				$row = $res->fetchObject();
-				$end = $row->page_id - 1;
+				$end = (int)$row->page_id;
 			}
 
 			# Sanity check order
diff --git a/includes/cache/CacheDependency.php b/includes/cache/CacheDependency.php
index 0f047e80..32bcdf7f 100644
--- a/includes/cache/CacheDependency.php
+++ b/includes/cache/CacheDependency.php
@@ -404,7 +404,7 @@ class GlobalDependency extends CacheDependency {
 	 * @return bool
 	 */
 	function isExpired() {
-		if( !isset( $GLOBALS[$this->name] ) ) {
+		if ( !isset( $GLOBALS[$this->name] ) ) {
 			return true;
 		}
 		return $GLOBALS[$this->name] != $this->value;
diff --git a/includes/cache/FileCacheBase.php b/includes/cache/FileCacheBase.php
index 30a72174..d4bf5ee6 100644
--- a/includes/cache/FileCacheBase.php
+++ b/includes/cache/FileCacheBase.php
@@ -35,7 +35,7 @@ abstract class FileCacheBase {
 	/* lazy loaded */
 	protected $mCached;
 
-	/* @TODO: configurable? */
+	/* @todo configurable? */
 	const MISS_FACTOR = 15; // log 1 every MISS_FACTOR cache misses
 	const MISS_TTL_SEC = 3600; // how many seconds ago is "recent"
 
@@ -138,7 +138,7 @@ abstract class FileCacheBase {
 	 * @return string
 	 */
 	public function fetchText() {
-		if( $this->useGzip() ) {
+		if ( $this->useGzip() ) {
 			$fh = gzopen( $this->cachePath(), 'rb' );
 			return stream_get_contents( $fh );
 		} else {
@@ -163,7 +163,7 @@ abstract class FileCacheBase {
 
 		$this->checkCacheDirs(); // build parent dir
 		if ( !file_put_contents( $this->cachePath(), $text, LOCK_EX ) ) {
-			wfDebug( __METHOD__ . "() failed saving ". $this->cachePath() . "\n" );
+			wfDebug( __METHOD__ . "() failed saving " . $this->cachePath() . "\n" );
 			$this->mCached = null;
 			return false;
 		}
diff --git a/includes/cache/GenderCache.php b/includes/cache/GenderCache.php
index 63e4226d..a933527a 100644
--- a/includes/cache/GenderCache.php
+++ b/includes/cache/GenderCache.php
@@ -66,15 +66,14 @@ class GenderCache {
 	public function getGenderOf( $username, $caller = '' ) {
 		global $wgUser;
 
-		if( $username instanceof User ) {
+		if ( $username instanceof User ) {
 			$username = $username->getName();
 		}
 
 		$username = self::normalizeUsername( $username );
 		if ( !isset( $this->cache[$username] ) ) {
-
 			if ( $this->misses >= $this->missLimit && $wgUser->getName() !== $username ) {
-				if( $this->misses === $this->missLimit ) {
+				if ( $this->misses === $this->missLimit ) {
 					$this->misses++;
 					wfDebug( __METHOD__ . ": too many misses, returning default onwards\n" );
 				}
@@ -84,7 +83,6 @@ class GenderCache {
 				$this->misses++;
 				$this->doQuery( $username, $caller );
 			}
-
 		}
 
 		/* Undefined if there is a valid username which for some reason doesn't
@@ -102,7 +100,9 @@ class GenderCache {
 	public function doLinkBatch( $data, $caller = '' ) {
 		$users = array();
 		foreach ( $data as $ns => $pagenames ) {
-			if ( !MWNamespace::hasGenderDistinction( $ns ) ) continue;
+			if ( !MWNamespace::hasGenderDistinction( $ns ) ) {
+				continue;
+			}
 			foreach ( array_keys( $pagenames ) as $username ) {
 				$users[$username] = true;
 			}
@@ -143,14 +143,14 @@ class GenderCache {
 		$default = $this->getDefault();
 
 		$usersToCheck = array();
-		foreach ( (array) $users as $value ) {
+		foreach ( (array)$users as $value ) {
 			$name = self::normalizeUsername( $value );
 			// Skip users whose gender setting we already know
 			if ( !isset( $this->cache[$name] ) ) {
 				// For existing users, this value will be overwritten by the correct value
 				$this->cache[$name] = $default;
 				// query only for valid names, which can be in the database
-				if( User::isValidUserName( $name ) ) {
+				if ( User::isValidUserName( $name ) ) {
 					$usersToCheck[] = $name;
 				}
 			}
diff --git a/includes/cache/HTMLCacheUpdate.php b/includes/cache/HTMLCacheUpdate.php
index 88e79281..992809ef 100644
--- a/includes/cache/HTMLCacheUpdate.php
+++ b/includes/cache/HTMLCacheUpdate.php
@@ -46,8 +46,6 @@ class HTMLCacheUpdate implements DeferrableUpdate {
 	}
 
 	public function doUpdate() {
-		global $wgMaxBacklinksInvalidate;
-
 		wfProfileIn( __METHOD__ );
 
 		$job = new HTMLCacheUpdateJob(
@@ -60,13 +58,14 @@ class HTMLCacheUpdate implements DeferrableUpdate {
 		);
 
 		$count = $this->mTitle->getBacklinkCache()->getNumLinks( $this->mTable, 200 );
-		if ( $wgMaxBacklinksInvalidate !== false && $count > $wgMaxBacklinksInvalidate ) {
-			wfDebug( "Skipped HTML cache invalidation of {$this->mTitle->getPrefixedText()}." );
-		} elseif ( $count >= 200 ) { // many backlinks
+		if ( $count >= 200 ) { // many backlinks
 			JobQueueGroup::singleton()->push( $job );
 			JobQueueGroup::singleton()->deduplicateRootJob( $job );
 		} else { // few backlinks ($count might be off even if 0)
-			$job->run(); // just do the purge query now
+			$dbw = wfGetDB( DB_MASTER );
+			$dbw->onTransactionIdle( function() use ( $job ) {
+				$job->run(); // just do the purge query now
+			} );
 		}
 
 		wfProfileOut( __METHOD__ );
diff --git a/includes/cache/HTMLFileCache.php b/includes/cache/HTMLFileCache.php
index 055fd685..ab379116 100644
--- a/includes/cache/HTMLFileCache.php
+++ b/includes/cache/HTMLFileCache.php
@@ -163,7 +163,7 @@ class HTMLFileCache extends FileCacheBase {
 			return $text;
 		}
 
-		wfDebug( __METHOD__ . "()\n", false);
+		wfDebug( __METHOD__ . "()\n", false );
 
 		$now = wfTimestampNow();
 		if ( $this->useGzip() ) {
@@ -182,7 +182,7 @@ class HTMLFileCache extends FileCacheBase {
 
 		// gzip output to buffer as needed and set headers...
 		if ( $this->useGzip() ) {
-			// @TODO: ugly wfClientAcceptsGzip() function - use context!
+			// @todo Ugly wfClientAcceptsGzip() function - use context!
 			if ( wfClientAcceptsGzip() ) {
 				header( 'Content-Encoding: gzip' );
 				return $compressed;
diff --git a/includes/cache/LinkBatch.php b/includes/cache/LinkBatch.php
index 72a2e8e5..48b60aa9 100644
--- a/includes/cache/LinkBatch.php
+++ b/includes/cache/LinkBatch.php
@@ -39,7 +39,7 @@ class LinkBatch {
 	protected $caller;
 
 	function __construct( $arr = array() ) {
-		foreach( $arr as $item ) {
+		foreach ( $arr as $item ) {
 			$this->addObj( $item );
 		}
 	}
@@ -98,7 +98,7 @@ class LinkBatch {
 	 * @return bool
 	 */
 	public function isEmpty() {
-		return ($this->getSize() == 0);
+		return $this->getSize() == 0;
 	}
 
 	/**
diff --git a/includes/cache/LinkCache.php b/includes/cache/LinkCache.php
index 0e41e265..54de1989 100644
--- a/includes/cache/LinkCache.php
+++ b/includes/cache/LinkCache.php
@@ -35,18 +35,44 @@ class LinkCache {
 	private $mGoodLinkFields = array();
 	private $mBadLinks = array();
 	private $mForUpdate = false;
+	private $useDatabase = true;
 
 	/**
-	 * Get an instance of this class
+	 * @var LinkCache
+	 */
+	protected static $instance;
+
+	/**
+	 * Get an instance of this class.
 	 *
 	 * @return LinkCache
 	 */
 	static function &singleton() {
-		static $instance;
-		if ( !isset( $instance ) ) {
-			$instance = new LinkCache;
+		if ( self::$instance ) {
+			return self::$instance;
 		}
-		return $instance;
+		self::$instance = new LinkCache;
+		return self::$instance;
+	}
+
+	/**
+	 * Destroy the singleton instance, a new one will be created next time
+	 * singleton() is called.
+	 * @since 1.22
+	 */
+	static function destroySingleton() {
+		self::$instance = null;
+	}
+
+	/**
+	 * Set the singleton instance to a given object.
+	 * Since we do not have an interface for LinkCache, you have to be sure the
+	 * given object implements all the LinkCache public methods.
+	 * @param LinkCache $instance
+	 * @since 1.22
+	 */
+	static function setSingleton( LinkCache $instance ) {
+		self::$instance = $instance;
 	}
 
 	/**
@@ -156,8 +182,13 @@ class LinkCache {
 		unset( $this->mGoodLinkFields[$dbkey] );
 	}
 
-	public function getGoodLinks() { return $this->mGoodLinks; }
-	public function getBadLinks() { return array_keys( $this->mBadLinks ); }
+	public function getGoodLinks() {
+		return $this->mGoodLinks;
+	}
+
+	public function getBadLinks() {
+		return array_keys( $this->mBadLinks );
+	}
 
 	/**
 	 * Add a title to the link cache, return the page_id or zero if non-existent
@@ -167,13 +198,26 @@ class LinkCache {
 	 */
 	public function addLink( $title ) {
 		$nt = Title::newFromDBkey( $title );
-		if( $nt ) {
+		if ( $nt ) {
 			return $this->addLinkObj( $nt );
 		} else {
 			return 0;
 		}
 	}
 
+	/**
+	 * Enable or disable database use.
+	 * @since 1.22
+	 * @param $value Boolean
+	 * @return Boolean
+	 */
+	public function useDatabase( $value = null ) {
+		if ( $value !== null ) {
+			$this->useDatabase = (bool)$value;
+		}
+		return $this->useDatabase;
+	}
+
 	/**
 	 * Add a title to the link cache, return the page_id or zero if non-existent
 	 *
@@ -201,6 +245,10 @@ class LinkCache {
 			return 0;
 		}
 
+		if( !$this->useDatabase ) {
+			return 0;
+		}
+
 		# Some fields heavily used for linking...
 		if ( $this->mForUpdate ) {
 			$db = wfGetDB( DB_MASTER );
@@ -215,7 +263,9 @@ class LinkCache {
 		}
 
 		$f = array( 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
-		if ( $wgContentHandlerUseDB ) $f[] = 'page_content_model';
+		if ( $wgContentHandlerUseDB ) {
+			$f[] = 'page_content_model';
+		}
 
 		$s = $db->selectRow( 'page', $f,
 			array( 'page_namespace' => $nt->getNamespace(), 'page_title' => $nt->getDBkey() ),
diff --git a/includes/cache/LocalisationCache.php b/includes/cache/LocalisationCache.php
index 009b9507..1bfd17bd 100644
--- a/includes/cache/LocalisationCache.php
+++ b/includes/cache/LocalisationCache.php
@@ -110,7 +110,7 @@ class LocalisationCache {
 		'dateFormats', 'datePreferences', 'datePreferenceMigrationMap',
 		'defaultDateFormat', 'extraUserToggles', 'specialPageAliases',
 		'imageFiles', 'preloadedMessages', 'namespaceGenderAliases',
-		'digitGroupingPattern', 'pluralRules', 'compiledPluralRules',
+		'digitGroupingPattern', 'pluralRules', 'pluralRuleTypes', 'compiledPluralRules',
 	);
 
 	/**
@@ -160,6 +160,20 @@ class LocalisationCache {
 	 */
 	var $pluralRules = null;
 
+	/**
+	 * Associative array of cached plural rule types. The key is the language
+	 * code, the value is an array of plural rule types for that language. For
+	 * example, $pluralRuleTypes['ar'] = ['zero', 'one', 'two', 'few', 'many'].
+	 * The index for each rule type matches the index for the rule in
+	 * $pluralRules, thus allowing correlation between the two. The reason we
+	 * don't just use the type names as the keys in $pluralRules is because
+	 * Language::convertPlural applies the rules based on numeric order (or
+	 * explicit numeric parameter), not based on the name of the rule type. For
+	 * example, {{plural:count|wordform1|wordform2|wordform3}}, rather than
+	 * {{plural:count|one=wordform1|two=wordform2|many=wordform3}}.
+	 */
+	var $pluralRuleTypes = null;
+
 	var $mergeableKeys = null;
 
 	/**
@@ -340,7 +354,6 @@ class LocalisationCache {
 	 * @param $code
 	 * @param $key
 	 * @param $subkey
-	 * @return
 	 */
 	protected function loadSubitem( $code, $key, $subkey ) {
 		if ( !in_array( $key, self::$splitKeys ) ) {
@@ -370,6 +383,9 @@ class LocalisationCache {
 
 	/**
 	 * Returns true if the cache identified by $code is missing or expired.
+	 *
+	 * @param string $code
+	 *
 	 * @return bool
 	 */
 	public function isExpired( $code ) {
@@ -480,9 +496,10 @@ class LocalisationCache {
 	 * @return array
 	 */
 	protected function readPHPFile( $_fileName, $_fileType ) {
+		wfProfileIn( __METHOD__ );
 		// Disable APC caching
 		$_apcEnabled = ini_set( 'apc.cache_by_default', '0' );
-		include( $_fileName );
+		include $_fileName;
 		ini_set( 'apc.cache_by_default', $_apcEnabled );
 
 		if ( $_fileType == 'core' || $_fileType == 'extension' ) {
@@ -490,8 +507,10 @@ class LocalisationCache {
 		} elseif ( $_fileType == 'aliases' ) {
 			$data = compact( 'aliases' );
 		} else {
+			wfProfileOut( __METHOD__ );
 			throw new MWException( __METHOD__ . ": Invalid file type: $_fileType" );
 		}
+		wfProfileOut( __METHOD__ );
 		return $data;
 	}
 
@@ -506,7 +525,7 @@ class LocalisationCache {
 		}
 		try {
 			$compiledRules = CLDRPluralRuleEvaluator::compile( $rules );
-		} catch( CLDRPluralRuleError $e ) {
+		} catch ( CLDRPluralRuleError $e ) {
 			wfDebugLog( 'l10n', $e->getMessage() . "\n" );
 			return array();
 		}
@@ -519,17 +538,8 @@ class LocalisationCache {
 	 * @since 1.20
 	 */
 	public function getPluralRules( $code ) {
-		global $IP;
-
 		if ( $this->pluralRules === null ) {
-			$cldrPlural = "$IP/languages/data/plurals.xml";
-			$mwPlural = "$IP/languages/data/plurals-mediawiki.xml";
-			// Load CLDR plural rules
-			$this->loadPluralFile( $cldrPlural );
-			if ( file_exists( $mwPlural ) ) {
-				// Override or extend
-				$this->loadPluralFile( $mwPlural );
-			}
+			$this->loadPluralFiles();
 		}
 		if ( !isset( $this->pluralRules[$code] ) ) {
 			return null;
@@ -538,6 +548,37 @@ class LocalisationCache {
 		}
 	}
 
+	/**
+	 * Get the plural rule types for a given language from the XML files.
+	 * Cached.
+	 * @since 1.22
+	 */
+	public function getPluralRuleTypes( $code ) {
+		if ( $this->pluralRuleTypes === null ) {
+			$this->loadPluralFiles();
+		}
+		if ( !isset( $this->pluralRuleTypes[$code] ) ) {
+			return null;
+		} else {
+			return $this->pluralRuleTypes[$code];
+		}
+	}
+
+	/**
+	 * Load the plural XML files.
+	 */
+	protected function loadPluralFiles() {
+		global $IP;
+		$cldrPlural = "$IP/languages/data/plurals.xml";
+		$mwPlural = "$IP/languages/data/plurals-mediawiki.xml";
+		// Load CLDR plural rules
+		$this->loadPluralFile( $cldrPlural );
+		if ( file_exists( $mwPlural ) ) {
+			// Override or extend
+			$this->loadPluralFile( $mwPlural );
+		}
+	}
+
 	/**
 	 * Load a plural XML file with the given filename, compile the relevant
 	 * rules, and save the compiled rules in a process-local cache.
@@ -549,12 +590,16 @@ class LocalisationCache {
 		foreach ( $rulesets as $ruleset ) {
 			$codes = $ruleset->getAttribute( 'locales' );
 			$rules = array();
+			$ruleTypes = array();
 			$ruleElements = $ruleset->getElementsByTagName( "pluralRule" );
 			foreach ( $ruleElements as $elt ) {
+				$ruleType = $elt->getAttribute( 'count' );
 				$rules[] = $elt->nodeValue;
+				$ruleTypes[] = $ruleType;
 			}
 			foreach ( explode( ' ', $codes ) as $code ) {
 				$this->pluralRules[$code] = $rules;
+				$this->pluralRuleTypes[$code] = $ruleTypes;
 			}
 		}
 	}
@@ -566,9 +611,11 @@ class LocalisationCache {
 	 */
 	protected function readSourceFilesAndRegisterDeps( $code, &$deps ) {
 		global $IP;
+		wfProfileIn( __METHOD__ );
 
 		$fileName = Language::getMessagesFileName( $code );
 		if ( !file_exists( $fileName ) ) {
+			wfProfileOut( __METHOD__ );
 			return false;
 		}
 
@@ -579,10 +626,13 @@ class LocalisationCache {
 		$data['pluralRules'] = $this->getPluralRules( $code );
 		# And for PHP
 		$data['compiledPluralRules'] = $this->getCompiledPluralRules( $code );
+		# Load plural rule types
+		$data['pluralRuleTypes'] = $this->getPluralRuleTypes( $code );
 
 		$deps['plurals'] = new FileDependency( "$IP/languages/data/plurals.xml" );
 		$deps['plurals-mw'] = new FileDependency( "$IP/languages/data/plurals-mediawiki.xml" );
 
+		wfProfileOut( __METHOD__ );
 		return $data;
 	}
 
@@ -673,6 +723,7 @@ class LocalisationCache {
 		wfProfileIn( __METHOD__ );
 
 		if ( !$code ) {
+			wfProfileOut( __METHOD__ );
 			throw new MWException( "Invalid language code requested" );
 		}
 		$this->recachedLangs[$code] = true;
@@ -741,6 +792,7 @@ class LocalisationCache {
 		# This is done after the core because we know the fallback sequence now.
 		# But it has a higher precedence for merging so that we can support things
 		# like site-specific message overrides.
+		wfProfileIn( __METHOD__ . '-extensions' );
 		$allData = $initialData;
 		foreach ( $wgExtensionMessagesFiles as $fileName ) {
 			$data = $this->readPHPFile( $fileName, 'extension' );
@@ -761,6 +813,7 @@ class LocalisationCache {
 		foreach ( $coreData as $key => $item ) {
 			$this->mergeItem( $key, $allData[$key], $item );
 		}
+		wfProfileOut( __METHOD__ . '-extensions' );
 
 		# Add cache dependencies for any referenced globals
 		$deps['wgExtensionMessagesFiles'] = new GlobalDependency( 'wgExtensionMessagesFiles' );
@@ -786,6 +839,10 @@ class LocalisationCache {
 		if ( $allData['compiledPluralRules'] === null ) {
 			$allData['compiledPluralRules'] = array();
 		}
+		# If there were no plural rule types, return an empty array
+		if ( $allData['pluralRuleTypes'] === null ) {
+			$allData['pluralRuleTypes'] = array();
+		}
 
 		# Set the list keys
 		$allData['list'] = array();
@@ -796,6 +853,7 @@ class LocalisationCache {
 		wfRunHooks( 'LocalisationCacheRecache', array( $this, $code, &$allData ) );
 
 		if ( is_null( $allData['namespaceNames'] ) ) {
+			wfProfileOut( __METHOD__ );
 			throw new MWException( __METHOD__ . ': Localisation data failed sanity check! ' .
 				'Check that your languages/messages/MessagesEn.php file is intact.' );
 		}
@@ -810,6 +868,7 @@ class LocalisationCache {
 		}
 
 		# Save to the persistent cache
+		wfProfileIn( __METHOD__ . '-write' );
 		$this->store->startWrite( $code );
 		foreach ( $allData as $key => $value ) {
 			if ( in_array( $key, self::$splitKeys ) ) {
@@ -821,6 +880,7 @@ class LocalisationCache {
 			}
 		}
 		$this->store->finishWrite();
+		wfProfileOut( __METHOD__ . '-write' );
 
 		# Clear out the MessageBlobStore
 		# HACK: If using a null (i.e. disabled) storage backend, we
@@ -868,6 +928,7 @@ class LocalisationCache {
 		unset( $this->loadedItems[$code] );
 		unset( $this->loadedSubitems[$code] );
 		unset( $this->initialisedLangs[$code] );
+		unset( $this->shallowFallbacks[$code] );
 
 		foreach ( $this->shallowFallbacks as $shallowCode => $fbCode ) {
 			if ( $fbCode === $code ) {
@@ -921,7 +982,7 @@ interface LCStore {
 
 	/**
 	 * Start a write transaction.
-	 * @param $code Language code
+	 * @param string $code Language code
 	 */
 	function startWrite( $code );
 
@@ -933,8 +994,8 @@ interface LCStore {
 	/**
 	 * Set a key to a given value. startWrite() must be called before this
 	 * is called, and finishWrite() must be called afterwards.
-	 * @param $key
-	 * @param $value
+	 * @param string $key
+	 * @param mixed $value
 	 */
 	function set( $key, $value );
 }
@@ -1284,5 +1345,4 @@ class LocalisationCache_BulkLoad extends LocalisationCache {
 			$this->unload( $code );
 		}
 	}
-
 }
diff --git a/includes/cache/MessageCache.php b/includes/cache/MessageCache.php
index c406b5c3..a92c87f4 100644
--- a/includes/cache/MessageCache.php
+++ b/includes/cache/MessageCache.php
@@ -22,13 +22,28 @@
  */
 
 /**
- *
+ * MediaWiki message cache structure version.
+ * Bump this whenever the message cache format has changed.
  */
-define( 'MSG_LOAD_TIMEOUT', 60 );
-define( 'MSG_LOCK_TIMEOUT', 10 );
-define( 'MSG_WAIT_TIMEOUT', 10 );
 define( 'MSG_CACHE_VERSION', 1 );
 
+/**
+ * Memcached timeout when loading a key.
+ * See MessageCache::load()
+ */
+define( 'MSG_LOAD_TIMEOUT', 60 );
+
+/**
+ * Memcached timeout when locking a key for a writing operation.
+ * See MessageCache::lock()
+ */
+define( 'MSG_LOCK_TIMEOUT', 30 );
+/**
+ * Number of times we will try to acquire a lock from Memcached.
+ * This comes in addition to MSG_LOCK_TIMEOUT.
+ */
+define( 'MSG_WAIT_TIMEOUT', 30 );
+
 /**
  * Message cache
  * Performs various MediaWiki namespace-related functions
@@ -44,10 +59,16 @@ class MessageCache {
 	 */
 	protected $mCache;
 
-	// Should  mean that database cannot be used, but check
+	/**
+	 * Should  mean that database cannot be used, but check
+	 * @var bool $mDisable
+	 */
 	protected $mDisable;
 
-	/// Lifetime for cache, used by object caching
+	/**
+	 * Lifetime for cache, used by object caching.
+	 * Set on construction, see __construct().
+	 */
 	protected $mExpiry;
 
 	/**
@@ -56,18 +77,21 @@ class MessageCache {
 	 */
 	protected $mParserOptions, $mParser;
 
-	/// Variable for tracking which variables are already loaded
+	/**
+	 * Variable for tracking which variables are already loaded
+	 * @var array $mLoadedLanguages
+	 */
 	protected $mLoadedLanguages = array();
 
 	/**
 	 * Singleton instance
 	 *
-	 * @var MessageCache
+	 * @var MessageCache $instance
 	 */
 	private static $instance;
 
 	/**
-	 * @var bool
+	 * @var bool $mInParser
 	 */
 	protected $mInParser = false;
 
@@ -75,12 +99,16 @@ class MessageCache {
 	 * Get the signleton instance of this class
 	 *
 	 * @since 1.18
-	 * @return MessageCache object
+	 * @return MessageCache
 	 */
 	public static function singleton() {
 		if ( is_null( self::$instance ) ) {
 			global $wgUseDatabaseMessages, $wgMsgCacheExpiry;
-			self::$instance = new self( wfGetMessageCacheStorage(), $wgUseDatabaseMessages, $wgMsgCacheExpiry );
+			self::$instance = new self(
+				wfGetMessageCacheStorage(),
+				$wgUseDatabaseMessages,
+				$wgMsgCacheExpiry
+			);
 		}
 		return self::$instance;
 	}
@@ -94,6 +122,11 @@ class MessageCache {
 		self::$instance = null;
 	}
 
+	/**
+	 * @param ObjectCache $memCached A cache instance. If none, fall back to CACHE_NONE.
+	 * @param bool $useDB
+	 * @param int $expiry Lifetime for cache. @see $mExpiry.
+	 */
 	function __construct( $memCached, $useDB, $expiry ) {
 		if ( !$memCached ) {
 			$memCached = wfGetCache( CACHE_NONE );
@@ -119,15 +152,13 @@ class MessageCache {
 
 	/**
 	 * Try to load the cache from a local file.
-	 * Actual format of the file depends on the $wgLocalMessageCacheSerialized
-	 * setting.
 	 *
 	 * @param string $hash the hash of contents, to check validity.
-	 * @param $code Mixed: Optional language code, see documenation of load().
-	 * @return bool on failure.
+	 * @param Mixed $code Optional language code, see documenation of load().
+	 * @return array The cache array
 	 */
-	function loadFromLocal( $hash, $code ) {
-		global $wgCacheDirectory, $wgLocalMessageCacheSerialized;
+	function getLocalCache( $hash, $code ) {
+		global $wgCacheDirectory;
 
 		$filename = "$wgCacheDirectory/messages-" . wfWikiID() . "-$code";
 
@@ -139,31 +170,19 @@ class MessageCache {
 			return false; // No cache file
 		}
 
-		if ( $wgLocalMessageCacheSerialized ) {
-			// Check to see if the file has the hash specified
-			$localHash = fread( $file, 32 );
-			if ( $hash === $localHash ) {
-				// All good, get the rest of it
-				$serialized = '';
-				while ( !feof( $file ) ) {
-					$serialized .= fread( $file, 100000 );
-				}
-				fclose( $file );
-				return $this->setCache( unserialize( $serialized ), $code );
-			} else {
-				fclose( $file );
-				return false; // Wrong hash
+		// Check to see if the file has the hash specified
+		$localHash = fread( $file, 32 );
+		if ( $hash === $localHash ) {
+			// All good, get the rest of it
+			$serialized = '';
+			while ( !feof( $file ) ) {
+				$serialized .= fread( $file, 100000 );
 			}
+			fclose( $file );
+			return unserialize( $serialized );
 		} else {
-			$localHash = substr( fread( $file, 40 ), 8 );
 			fclose( $file );
-			if ( $hash != $localHash ) {
-				return false; // Wrong hash
-			}
-
-			# Require overwrites the member variable or just shadows it?
-			require( $filename );
-			return $this->setCache( $this->mCache, $code );
+			return false; // Wrong hash
 		}
 	}
 
@@ -192,55 +211,6 @@ class MessageCache {
 		wfRestoreWarnings();
 	}
 
-	function saveToScript( $array, $hash, $code ) {
-		global $wgCacheDirectory;
-
-		$filename = "$wgCacheDirectory/messages-" . wfWikiID() . "-$code";
-		$tempFilename = $filename . '.tmp';
-		wfMkdirParents( $wgCacheDirectory, null, __METHOD__ ); // might fail
-
-		wfSuppressWarnings();
-		$file = fopen( $tempFilename, 'w' );
-		wfRestoreWarnings();
-
-		if ( !$file ) {
-			wfDebug( "Unable to open local cache file for writing\n" );
-			return;
-		}
-
-		fwrite( $file, "<?php\n//$hash\n\n \$this->mCache = array(" );
-
-		foreach ( $array as $key => $message ) {
-			$key = $this->escapeForScript( $key );
-			$message = $this->escapeForScript( $message );
-			fwrite( $file, "'$key' => '$message',\n" );
-		}
-
-		fwrite( $file, ");\n?>" );
-		fclose( $file);
-		rename( $tempFilename, $filename );
-	}
-
-	function escapeForScript( $string ) {
-		$string = str_replace( '\\', '\\\\', $string );
-		$string = str_replace( '\'', '\\\'', $string );
-		return $string;
-	}
-
-	/**
-	 * Set the cache to $cache, if it is valid. Otherwise set the cache to false.
-	 *
-	 * @return bool
-	 */
-	function setCache( $cache, $code ) {
-		if ( isset( $cache['VERSION'] ) && $cache['VERSION'] == MSG_CACHE_VERSION ) {
-			$this->mCache[$code] = $cache;
-			return true;
-		} else {
-			return false;
-		}
-	}
-
 	/**
 	 * Loads messages from caches or from database in this order:
 	 * (1) local message cache (if $wgUseLocalMessageCache is enabled)
@@ -257,16 +227,14 @@ class MessageCache {
 	 * or false if populating empty cache fails. Also returns true if MessageCache
 	 * is disabled.
 	 *
-	 * @param bool|String $code String: language to which load messages
+	 * @param bool|String $code Language to which load messages
 	 * @throws MWException
 	 * @return bool
 	 */
 	function load( $code = false ) {
 		global $wgUseLocalMessageCache;
 
-		$exception = null; // deferred error
-
-		if( !is_string( $code ) ) {
+		if ( !is_string( $code ) ) {
 			# This isn't really nice, so at least make a note about it and try to
 			# fall back
 			wfDebug( __METHOD__ . " called without providing a language code\n" );
@@ -291,94 +259,161 @@ class MessageCache {
 		# Loading code starts
 		wfProfileIn( __METHOD__ );
 		$success = false; # Keep track of success
+		$staleCache = false; # a cache array with expired data, or false if none has been loaded
 		$where = array(); # Debug info, delayed to avoid spamming debug log too much
 		$cacheKey = wfMemcKey( 'messages', $code ); # Key in memc for messages
 
-		# (1) local cache
+		# Local cache
 		# Hash of the contents is stored in memcache, to detect if local cache goes
-		# out of date (due to update in other thread?)
+		# out of date (e.g. due to replace() on some other server)
 		if ( $wgUseLocalMessageCache ) {
 			wfProfileIn( __METHOD__ . '-fromlocal' );
 
 			$hash = $this->mMemc->get( wfMemcKey( 'messages', $code, 'hash' ) );
 			if ( $hash ) {
-				$success = $this->loadFromLocal( $hash, $code );
-				if ( $success ) $where[] = 'got from local cache';
+				$cache = $this->getLocalCache( $hash, $code );
+				if ( !$cache ) {
+					$where[] = 'local cache is empty or has the wrong hash';
+				} elseif ( $this->isCacheExpired( $cache ) ) {
+					$where[] = 'local cache is expired';
+					$staleCache = $cache;
+				} else {
+					$where[] = 'got from local cache';
+					$success = true;
+					$this->mCache[$code] = $cache;
+				}
 			}
 			wfProfileOut( __METHOD__ . '-fromlocal' );
 		}
 
-		# (2) memcache
-		# Fails if nothing in cache, or in the wrong version.
 		if ( !$success ) {
-			wfProfileIn( __METHOD__ . '-fromcache' );
-			$cache = $this->mMemc->get( $cacheKey );
-			$success = $this->setCache( $cache, $code );
-			if ( $success ) {
-				$where[] = 'got from global cache';
-				$this->saveToCaches( $cache, false, $code );
-			}
-			wfProfileOut( __METHOD__ . '-fromcache' );
-		}
+			# Try the global cache. If it is empty, try to acquire a lock. If
+			# the lock can't be acquired, wait for the other thread to finish
+			# and then try the global cache a second time.
+			for ( $failedAttempts = 0; $failedAttempts < 2; $failedAttempts++ ) {
+				wfProfileIn( __METHOD__ . '-fromcache' );
+				$cache = $this->mMemc->get( $cacheKey );
+				if ( !$cache ) {
+					$where[] = 'global cache is empty';
+				} elseif ( $this->isCacheExpired( $cache ) ) {
+					$where[] = 'global cache is expired';
+					$staleCache = $cache;
+				} else {
+					$where[] = 'got from global cache';
+					$this->mCache[$code] = $cache;
+					$this->saveToCaches( $cache, 'local-only', $code );
+					$success = true;
+				}
 
-		# (3)
-		# Nothing in caches... so we need create one and store it in caches
-		if ( !$success ) {
-			$where[] = 'cache is empty';
-			$where[] = 'loading from database';
-
-			if ( $this->lock( $cacheKey ) ) {
-				$that = $this;
-				$osc = new ScopedCallback( function() use ( $that, $cacheKey ) {
-					$that->unlock( $cacheKey );
-				} );
-			}
-			# Limit the concurrency of loadFromDB to a single process
-			# This prevents the site from going down when the cache expires
-			$statusKey = wfMemcKey( 'messages', $code, 'status' );
-			$success = $this->mMemc->add( $statusKey, 'loading', MSG_LOAD_TIMEOUT );
-			if ( $success ) { // acquired lock
-				$cache = $this->mMemc;
-				$isc = new ScopedCallback( function() use ( $cache, $statusKey ) {
-					$cache->delete( $statusKey );
-				} );
-				$cache = $this->loadFromDB( $code );
-				$success = $this->setCache( $cache, $code );
-				if ( $success ) { // messages loaded
-					$success = $this->saveToCaches( $cache, true, $code );
-					$isc = null; // unlock
-					if ( !$success ) {
-						$this->mMemc->set( $statusKey, 'error', 60 * 5 );
-						wfDebug( __METHOD__ . ": set() error: restart memcached server!\n" );
-						$exception = new MWException( "Could not save cache for '$code'." );
+				wfProfileOut( __METHOD__ . '-fromcache' );
+
+				if ( $success ) {
+					# Done, no need to retry
+					break;
+				}
+
+				# We need to call loadFromDB. Limit the concurrency to a single
+				# process. This prevents the site from going down when the cache
+				# expires.
+				$statusKey = wfMemcKey( 'messages', $code, 'status' );
+				$acquired = $this->mMemc->add( $statusKey, 'loading', MSG_LOAD_TIMEOUT );
+				if ( $acquired ) {
+					# Unlock the status key if there is an exception
+					$that = $this;
+					$statusUnlocker = new ScopedCallback( function () use ( $that, $statusKey ) {
+						$that->mMemc->delete( $statusKey );
+					} );
+
+					# Now let's regenerate
+					$where[] = 'loading from database';
+
+					# Lock the cache to prevent conflicting writes
+					# If this lock fails, it doesn't really matter, it just means the
+					# write is potentially non-atomic, e.g. the results of a replace()
+					# may be discarded.
+					if ( $this->lock( $cacheKey ) ) {
+						$mainUnlocker = new ScopedCallback( function () use ( $that, $cacheKey ) {
+							$that->unlock( $cacheKey );
+						} );
+					} else {
+						$mainUnlocker = null;
+						$where[] = 'could not acquire main lock';
+					}
+
+					$cache = $this->loadFromDB( $code );
+					$this->mCache[$code] = $cache;
+					$success = true;
+					$saveSuccess = $this->saveToCaches( $cache, 'all', $code );
+
+					# Unlock
+					ScopedCallback::consume( $mainUnlocker );
+					ScopedCallback::consume( $statusUnlocker );
+
+					if ( !$saveSuccess ) {
+						# Cache save has failed.
+						# There are two main scenarios where this could be a problem:
+						#
+						#   - The cache is more than the maximum size (typically
+						#     1MB compressed).
+						#
+						#   - Memcached has no space remaining in the relevant slab
+						#     class. This is unlikely with recent versions of
+						#     memcached.
+						#
+						# Either way, if there is a local cache, nothing bad will
+						# happen. If there is no local cache, disabling the message
+						# cache for all requests avoids incurring a loadFromDB()
+						# overhead on every request, and thus saves the wiki from
+						# complete downtime under moderate traffic conditions.
+						if ( !$wgUseLocalMessageCache ) {
+							$this->mMemc->set( $statusKey, 'error', 60 * 5 );
+							$where[] = 'could not save cache, disabled globally for 5 minutes';
+						} else {
+							$where[] = "could not save global cache";
+						}
 					}
+
+					# Load from DB complete, no need to retry
+					break;
+				} elseif ( $staleCache ) {
+					# Use the stale cache while some other thread constructs the new one
+					$where[] = 'using stale cache';
+					$this->mCache[$code] = $staleCache;
+					$success = true;
+					break;
+				} elseif ( $failedAttempts > 0 ) {
+					# Already retried once, still failed, so don't do another lock/unlock cycle
+					# This case will typically be hit if memcached is down, or if
+					# loadFromDB() takes longer than MSG_WAIT_TIMEOUT
+					$where[] = "could not acquire status key.";
+					break;
 				} else {
-					$isc = null; // unlock
-					$exception = new MWException( "Could not load cache from DB for '$code'." );
+					$status = $this->mMemc->get( $statusKey );
+					if ( $status === 'error' ) {
+						# Disable cache
+						break;
+					} else {
+						# Wait for the other thread to finish, then retry
+						$where[] = 'waited for other thread to complete';
+						$this->lock( $cacheKey );
+						$this->unlock( $cacheKey );
+					}
 				}
-			} else {
-				$exception = new MWException( "Could not acquire '$statusKey' lock." );
 			}
-			$osc = null; // unlock
 		}
 
 		if ( !$success ) {
+			$where[] = 'loading FAILED - cache is disabled';
 			$this->mDisable = true;
 			$this->mCache = false;
-			// This used to go on, but that led to lots of nasty side
-			// effects like gadgets and sidebar getting cached with their
-			// default content
-			if ( $exception instanceof Exception ) {
-				throw $exception;
-			} else {
-				throw new MWException( "MessageCache failed to load messages" );
-			}
+			# This used to throw an exception, but that led to nasty side effects like
+			# the whole wiki being instantly down if the memcached server died
 		} else {
 			# All good, just record the success
-			$info = implode( ', ', $where );
-			wfDebug( __METHOD__ . ": Loading $code... $info\n" );
 			$this->mLoadedLanguages[$code] = true;
 		}
+		$info = implode( ', ', $where );
+		wfDebug( __METHOD__ . ": Loading $code... $info\n" );
 		wfProfileOut( __METHOD__ );
 		return $success;
 	}
@@ -388,8 +423,8 @@ class MessageCache {
 	 * $wgMaxMsgCacheEntrySize are assigned a special value, and are loaded
 	 * on-demand from the database later.
 	 *
-	 * @param string $code language code.
-	 * @return Array: loaded messages for storing in caches.
+	 * @param string $code Language code.
+	 * @return array Loaded messages for storing in caches.
 	 */
 	function loadFromDB( $code ) {
 		wfProfileIn( __METHOD__ );
@@ -449,11 +484,15 @@ class MessageCache {
 
 		foreach ( $res as $row ) {
 			$text = Revision::getRevisionText( $row );
-			if( $text === false ) {
+			if ( $text === false ) {
 				// Failed to fetch data; possible ES errors?
 				// Store a marker to fetch on-demand as a workaround...
 				$entry = '!TOO BIG';
-				wfDebugLog( 'MessageCache', __METHOD__ . ": failed to load message page text for {$row->page_title} ($code)" );
+				wfDebugLog(
+					'MessageCache',
+					__METHOD__
+						. ": failed to load message page text for {$row->page_title} ($code)"
+				);
 			} else {
 				$entry = ' ' . $text;
 			}
@@ -461,6 +500,7 @@ class MessageCache {
 		}
 
 		$cache['VERSION'] = MSG_CACHE_VERSION;
+		$cache['EXPIRY'] = wfTimestamp( TS_MW, time() + $this->mExpiry );
 		wfProfileOut( __METHOD__ );
 		return $cache;
 	}
@@ -468,8 +508,8 @@ class MessageCache {
 	/**
 	 * Updates cache as necessary when message page is changed
 	 *
-	 * @param string $title name of the page changed.
-	 * @param $text Mixed: new contents of the page.
+	 * @param string $title Name of the page changed.
+	 * @param mixed $text New contents of the page.
 	 */
 	public function replace( $title, $text ) {
 		global $wgMaxMsgCacheEntrySize;
@@ -502,7 +542,7 @@ class MessageCache {
 		}
 
 		# Update caches
-		$this->saveToCaches( $this->mCache[$code], true, $code );
+		$this->saveToCaches( $this->mCache[$code], 'all', $code );
 		$this->unlock( $cacheKey );
 
 		// Also delete cached sidebar... just in case it is affected
@@ -528,22 +568,42 @@ class MessageCache {
 		wfProfileOut( __METHOD__ );
 	}
 
+	/**
+	 * Is the given cache array expired due to time passing or a version change?
+	 *
+	 * @param $cache
+	 * @return bool
+	 */
+	protected function isCacheExpired( $cache ) {
+		if ( !isset( $cache['VERSION'] ) || !isset( $cache['EXPIRY'] ) ) {
+			return true;
+		}
+		if ( $cache['VERSION'] != MSG_CACHE_VERSION ) {
+			return true;
+		}
+		if ( wfTimestampNow() >= $cache['EXPIRY'] ) {
+			return true;
+		}
+		return false;
+	}
+
 	/**
 	 * Shortcut to update caches.
 	 *
-	 * @param array $cache cached messages with a version.
-	 * @param bool $memc Wether to update or not memcache.
-	 * @param string $code Language code.
-	 * @return bool on somekind of error.
+	 * @param array $cache Cached messages with a version.
+	 * @param string $dest Either "local-only" to save to local caches only
+	 *   or "all" to save to all caches.
+	 * @param string|bool $code Language code (default: false)
+	 * @return bool
 	 */
-	protected function saveToCaches( $cache, $memc = true, $code = false ) {
+	protected function saveToCaches( $cache, $dest, $code = false ) {
 		wfProfileIn( __METHOD__ );
-		global $wgUseLocalMessageCache, $wgLocalMessageCacheSerialized;
+		global $wgUseLocalMessageCache;
 
 		$cacheKey = wfMemcKey( 'messages', $code );
 
-		if ( $memc ) {
-			$success = $this->mMemc->set( $cacheKey, $cache, $this->mExpiry );
+		if ( $dest === 'all' ) {
+			$success = $this->mMemc->set( $cacheKey, $cache );
 		} else {
 			$success = true;
 		}
@@ -552,12 +612,8 @@ class MessageCache {
 		if ( $wgUseLocalMessageCache ) {
 			$serialized = serialize( $cache );
 			$hash = md5( $serialized );
-			$this->mMemc->set( wfMemcKey( 'messages', $code, 'hash' ), $hash, $this->mExpiry );
-			if ( $wgLocalMessageCacheSerialized ) {
-				$this->saveToLocal( $serialized, $hash, $code );
-			} else {
-				$this->saveToScript( $cache, $hash, $code );
-			}
+			$this->mMemc->set( wfMemcKey( 'messages', $code, 'hash' ), $hash );
+			$this->saveToLocal( $serialized, $hash, $code );
 		}
 
 		wfProfileOut( __METHOD__ );
@@ -565,19 +621,35 @@ class MessageCache {
 	}
 
 	/**
-	 * Represents a write lock on the messages key
+	 * Represents a write lock on the messages key.
 	 *
-	 * @param $key string
+	 * Will retry MessageCache::MSG_WAIT_TIMEOUT times, each operations having
+	 * a timeout of MessageCache::MSG_LOCK_TIMEOUT.
 	 *
+	 * @param string $key
 	 * @return Boolean: success
 	 */
 	function lock( $key ) {
 		$lockKey = $key . ':lock';
-		for ( $i = 0; $i < MSG_WAIT_TIMEOUT && !$this->mMemc->add( $lockKey, 1, MSG_LOCK_TIMEOUT ); $i++ ) {
+		$acquired = false;
+		$testDone = false;
+		for ( $i = 0; $i < MSG_WAIT_TIMEOUT && !$acquired; $i++ ) {
+			$acquired = $this->mMemc->add( $lockKey, 1, MSG_LOCK_TIMEOUT );
+			if ( $acquired ) {
+				break;
+			}
+
+			# Fail fast if memcached is totally down
+			if ( !$testDone ) {
+				$testDone = true;
+				if ( !$this->mMemc->set( wfMemcKey( 'test' ), 'test', 1 ) ) {
+					break;
+				}
+			}
 			sleep( 1 );
 		}
 
-		return $i >= MSG_WAIT_TIMEOUT;
+		return $acquired;
 	}
 
 	function unlock( $key ) {
@@ -588,51 +660,62 @@ class MessageCache {
 	/**
 	 * Get a message from either the content language or the user language.
 	 *
-	 * @param string $key the message cache key
-	 * @param $useDB Boolean: get the message from the DB, false to use only
-	 *               the localisation
-	 * @param bool|string $langcode Code of the language to get the message for, if
-	 *                  it is a valid code create a language for that language,
-	 *                  if it is a string but not a valid code then make a basic
-	 *                  language object, if it is a false boolean then use the
-	 *                  current users language (as a fallback for the old
-	 *                  parameter functionality), or if it is a true boolean
-	 *                  then use the wikis content language (also as a
-	 *                  fallback).
-	 * @param $isFullKey Boolean: specifies whether $key is a two part key
+	 * First, assemble a list of languages to attempt getting the message from. This
+	 * chain begins with the requested language and its fallbacks and then continues with
+	 * the content language and its fallbacks. For each language in the chain, the following
+	 * process will occur (in this order):
+	 *  1. If a language-specific override, i.e., [[MW:msg/lang]], is available, use that.
+	 *     Note: for the content language, there is no /lang subpage.
+	 *  2. Fetch from the static CDB cache.
+	 *  3. If available, check the database for fallback language overrides.
+	 *
+	 * This process provides a number of guarantees. When changing this code, make sure all
+	 * of these guarantees are preserved.
+	 *  * If the requested language is *not* the content language, then the CDB cache for that
+	 *    specific language will take precedence over the root database page ([[MW:msg]]).
+	 *  * Fallbacks will be just that: fallbacks. A fallback language will never be reached if
+	 *    the message is available *anywhere* in the language for which it is a fallback.
+	 *
+	 * @param string $key the message key
+	 * @param bool $useDB If true, look for the message in the DB, false
+	 *                    to use only the compiled l10n cache.
+	 * @param bool|string|object $langcode Code of the language to get the message for.
+	 *        - If string and a valid code, will create a standard language object
+	 *        - If string but not a valid code, will create a basic language object
+	 *        - If boolean and false, create object from the current users language
+	 *        - If boolean and true, create object from the wikis content language
+	 *        - If language object, use it as given
+	 * @param bool $isFullKey specifies whether $key is a two part key
 	 *                   "msg/lang".
 	 *
-	 * @throws MWException
-	 * @return string|bool
+	 * @throws MWException when given an invalid key
+	 * @return string|bool False if the message doesn't exist, otherwise the message (which can be empty)
 	 */
 	function get( $key, $useDB = true, $langcode = true, $isFullKey = false ) {
-		global $wgLanguageCode, $wgContLang;
+		global $wgContLang;
 
-		if ( is_int( $key ) ) {
-			// "Non-string key given" exception sometimes happens for numerical strings that become ints somewhere on their way here
-			$key = strval( $key );
-		}
+		$section = new ProfileSection( __METHOD__ );
 
-		if ( !is_string( $key ) ) {
+		if ( is_int( $key ) ) {
+			// Fix numerical strings that somehow become ints
+			// on their way here
+			$key = (string)$key;
+		} elseif ( !is_string( $key ) ) {
 			throw new MWException( 'Non-string key given' );
-		}
-
-		if ( strval( $key ) === '' ) {
-			# Shortcut: the empty key is always missing
+		} elseif ( $key === '' ) {
+			// Shortcut: the empty key is always missing
 			return false;
 		}
 
-		$lang = wfGetLangObj( $langcode );
-		if ( !$lang ) {
-			throw new MWException( "Bad lang code $langcode given" );
+		// For full keys, get the language code from the key
+		$pos = strrpos( $key, '/' );
+		if ( $isFullKey && $pos !== false ) {
+			$langcode = substr( $key, $pos + 1 );
+			$key = substr( $key, 0, $pos );
 		}
 
-		$langcode = $lang->getCode();
-
-		$message = false;
-
-		# Normalise title-case input (with some inlining)
-		$lckey = str_replace( ' ', '_', $key );
+		// Normalise title-case input (with some inlining)
+		$lckey = strtr( $key, ' ', '_' );
 		if ( ord( $key ) < 128 ) {
 			$lckey[0] = strtolower( $lckey[0] );
 			$uckey = ucfirst( $lckey );
@@ -641,80 +724,160 @@ class MessageCache {
 			$uckey = $wgContLang->ucfirst( $lckey );
 		}
 
-		# Try the MediaWiki namespace
-		if( !$this->mDisable && $useDB ) {
-			$title = $uckey;
-			if( !$isFullKey && ( $langcode != $wgLanguageCode ) ) {
-				$title .= '/' . $langcode;
-			}
-			$message = $this->getMsgFromNamespace( $title, $langcode );
-		}
+		// Loop through each language in the fallback list until we find something useful
+		$lang = wfGetLangObj( $langcode );
+		$message = $this->getMessageFromFallbackChain( $lang, $lckey, $uckey, !$this->mDisable && $useDB );
 
-		# Try the array in the language object
+		// If we still have no message, maybe the key was in fact a full key so try that
 		if ( $message === false ) {
-			$message = $lang->getMessage( $lckey );
-			if ( is_null( $message ) ) {
-				$message = false;
-			}
-		}
-
-		# Try the array of another language
-		if( $message === false ) {
 			$parts = explode( '/', $lckey );
-			# We may get calls for things that are http-urls from sidebar
-			# Let's not load nonexistent languages for those
-			# They usually have more than one slash.
+			// We may get calls for things that are http-urls from sidebar
+			// Let's not load nonexistent languages for those
+			// They usually have more than one slash.
 			if ( count( $parts ) == 2 && $parts[1] !== '' ) {
 				$message = Language::getMessageFor( $parts[0], $parts[1] );
-				if ( is_null( $message ) ) {
+				if ( $message === null ) {
 					$message = false;
 				}
 			}
 		}
 
-		# Is this a custom message? Try the default language in the db...
-		if( ( $message === false || $message === '-' ) &&
-			!$this->mDisable && $useDB &&
-			!$isFullKey && ( $langcode != $wgLanguageCode ) ) {
+		// Post-processing if the message exists
+		if ( $message !== false ) {
+			// Fix whitespace
+			$message = str_replace(
+				array(
+					# Fix for trailing whitespace, removed by textarea
+					'&#32;',
+					# Fix for NBSP, converted to space by firefox
+					'&nbsp;',
+					'&#160;',
+				),
+				array(
+					' ',
+					"\xc2\xa0",
+					"\xc2\xa0"
+				),
+				$message
+			);
+		}
+
+		return $message;
+	}
+
+	/**
+	 * Given a language, try and fetch a message from that language, then the
+	 * fallbacks of that language, then the site language, then the fallbacks for the
+	 * site language.
+	 *
+	 * @param Language $lang Requested language
+	 * @param string $lckey Lowercase key for the message
+	 * @param string $uckey Uppercase key for the message
+	 * @param bool $useDB Whether to use the database
+	 *
+	 * @see MessageCache::get
+	 * @return string|bool The message, or false if not found
+	 */
+	protected function getMessageFromFallbackChain( $lang, $lckey, $uckey, $useDB ) {
+		global $wgLanguageCode, $wgContLang;
+
+		$langcode = $lang->getCode();
+		$message = false;
+
+		// First try the requested language.
+		if ( $useDB ) {
+			if ( $langcode === $wgLanguageCode ) {
+				// Messages created in the content language will not have the /lang extension
+				$message = $this->getMsgFromNamespace( $uckey, $langcode );
+			} else {
+				$message = $this->getMsgFromNamespace( "$uckey/$langcode", $langcode );
+			}
+		}
+
+		if ( $message !== false ) {
+			return $message;
+		}
+
+		// Check the CDB cache
+		$message = $lang->getMessage( $lckey );
+		if ( $message !== null ) {
+			return $message;
+		}
+
+		list( $fallbackChain, $siteFallbackChain ) = Language::getFallbacksIncludingSiteLanguage( $langcode );
+
+		// Next try checking the database for all of the fallback languages of the requested language.
+		if ( $useDB ) {
+			foreach ( $fallbackChain as $code ) {
+				if ( $code === $wgLanguageCode ) {
+					// Messages created in the content language will not have the /lang extension
+					$message = $this->getMsgFromNamespace( $uckey, $code );
+				} else {
+					$message = $this->getMsgFromNamespace( "$uckey/$code", $code );
+				}
+
+				if ( $message !== false ) {
+					// Found the message.
+					return $message;
+				}
+			}
+		}
+
+		// Now try checking the site language.
+		if ( $useDB ) {
 			$message = $this->getMsgFromNamespace( $uckey, $wgLanguageCode );
+			if ( $message !== false ) {
+				return $message;
+			}
 		}
 
-		# Final fallback
-		if( $message === false ) {
-			return false;
+		$message = $wgContLang->getMessage( $lckey );
+		if ( $message !== null ) {
+			return $message;
 		}
 
-		# Fix whitespace
-		$message = strtr( $message,
-			array(
-				# Fix for trailing whitespace, removed by textarea
-				'&#32;' => ' ',
-				# Fix for NBSP, converted to space by firefox
-				'&nbsp;' => "\xc2\xa0",
-				'&#160;' => "\xc2\xa0",
-			) );
+		// Finally try the DB for the site language's fallbacks.
+		if ( $useDB ) {
+			foreach ( $siteFallbackChain as $code ) {
+				$message = $this->getMsgFromNamespace( "$uckey/$code", $code );
+				if ( $message === false && $code === $wgLanguageCode ) {
+					// Messages created in the content language will not have the /lang extension
+					$message = $this->getMsgFromNamespace( $uckey, $code );
+				}
 
-		return $message;
+				if ( $message !== false ) {
+					// Found the message.
+					return $message;
+				}
+			}
+		}
+
+		return false;
 	}
 
 	/**
 	 * Get a message from the MediaWiki namespace, with caching. The key must
 	 * first be converted to two-part lang/msg form if necessary.
 	 *
-	 * @param string $title Message cache key with initial uppercase letter.
-	 * @param string $code code denoting the language to try.
+	 * Unlike self::get(), this function doesn't resolve fallback chains, and
+	 * some callers require this behavior. LanguageConverter::parseCachedTable()
+	 * and self::get() are some examples in core.
 	 *
-	 * @return string|bool False on failure
+	 * @param string $title Message cache key with initial uppercase letter.
+	 * @param string $code Code denoting the language to try.
+	 * @return string|bool The message, or false if it does not exist or on error
 	 */
 	function getMsgFromNamespace( $title, $code ) {
 		$this->load( $code );
 		if ( isset( $this->mCache[$code][$title] ) ) {
 			$entry = $this->mCache[$code][$title];
 			if ( substr( $entry, 0, 1 ) === ' ' ) {
-				return substr( $entry, 1 );
+				// The message exists, so make sure a string
+				// is returned.
+				return (string)substr( $entry, 1 );
 			} elseif ( $entry === '!NONEXISTENT' ) {
 				return false;
-			} elseif( $entry === '!TOO BIG' ) {
+			} elseif ( $entry === '!TOO BIG' ) {
 				// Fall through and try invididual message cache below
 			}
 		} else {
@@ -734,7 +897,9 @@ class MessageCache {
 		if ( $entry ) {
 			if ( substr( $entry, 0, 1 ) === ' ' ) {
 				$this->mCache[$code][$title] = $entry;
-				return substr( $entry, 1 );
+				// The message exists, so make sure a string
+				// is returned.
+				return (string)substr( $entry, 1 );
 			} elseif ( $entry === '!NONEXISTENT' ) {
 				$this->mCache[$code][$title] = '!NONEXISTENT';
 				return false;
@@ -752,17 +917,24 @@ class MessageCache {
 			$content = $revision->getContent();
 			if ( !$content ) {
 				// A possibly temporary loading failure.
-				wfDebugLog( 'MessageCache', __METHOD__ . ": failed to load message page text for {$title} ($code)" );
+				wfDebugLog(
+					'MessageCache',
+					__METHOD__ . ": failed to load message page text for {$title} ($code)"
+				);
 				$message = null; // no negative caching
 			} else {
 				// XXX: Is this the right way to turn a Content object into a message?
-				// NOTE: $content is typically either WikitextContent, JavaScriptContent or CssContent.
-				//       MessageContent is *not* used for storing messages, it's only used for wrapping them when needed.
+				// NOTE: $content is typically either WikitextContent, JavaScriptContent or
+				//       CssContent. MessageContent is *not* used for storing messages, it's
+				//       only used for wrapping them when needed.
 				$message = $content->getWikitextForTransclusion();
 
 				if ( $message === false || $message === null ) {
-					wfDebugLog( 'MessageCache', __METHOD__ . ": message content doesn't provide wikitext "
-								. "(content model: " . $content->getContentHandler() . ")" );
+					wfDebugLog(
+						'MessageCache',
+						__METHOD__ . ": message content doesn't provide wikitext "
+							. "(content model: " . $content->getContentHandler() . ")"
+					);
 
 					$message = false; // negative caching
 				} else {
@@ -783,15 +955,15 @@ class MessageCache {
 	}
 
 	/**
-	 * @param $message string
-	 * @param $interface bool
-	 * @param $language
-	 * @param $title Title
+	 * @param string $message
+	 * @param bool $interface
+	 * @param string $language Language code
+	 * @param Title $title
 	 * @return string
 	 */
 	function transform( $message, $interface = false, $language = null, $title = null ) {
 		// Avoid creating parser if nothing to transform
-		if( strpos( $message, '{{' ) === false ) {
+		if ( strpos( $message, '{{' ) === false ) {
 			return $message;
 		}
 
@@ -835,14 +1007,16 @@ class MessageCache {
 	}
 
 	/**
-	 * @param $text string
-	 * @param $title Title
-	 * @param $linestart bool
-	 * @param $interface bool
-	 * @param $language
+	 * @param string $text
+	 * @param Title $title
+	 * @param bool $linestart Whether or not this is at the start of a line
+	 * @param bool $interface Whether this is an interface message
+	 * @param string $language Language code
 	 * @return ParserOutput|string
 	 */
-	public function parse( $text, $title = null, $linestart = true, $interface = false, $language = null  ) {
+	public function parse( $text, $title = null, $linestart = true,
+		$interface = false, $language = null
+	) {
 		if ( $this->mInParser ) {
 			return htmlspecialchars( $text );
 		}
@@ -901,12 +1075,12 @@ class MessageCache {
 	public function figureMessage( $key ) {
 		global $wgLanguageCode;
 		$pieces = explode( '/', $key );
-		if( count( $pieces ) < 2 ) {
+		if ( count( $pieces ) < 2 ) {
 			return array( $key, $wgLanguageCode );
 		}
 
 		$lang = array_pop( $pieces );
-		if( !Language::fetchLanguageName( $lang, null, 'mw' ) ) {
+		if ( !Language::fetchLanguageName( $lang, null, 'mw' ) ) {
 			return array( $key, $wgLanguageCode );
 		}
 
@@ -919,7 +1093,7 @@ class MessageCache {
 	 * If $code is the content language code, this will return all message keys
 	 * for which MediaWiki:msgkey exists. If $code is another language code, this
 	 * will ONLY return message keys for which MediaWiki:msgkey/$code exists.
-	 * @param $code string
+	 * @param string $code Language code
 	 * @return array of message keys (strings)
 	 */
 	public function getAllMessageKeys( $code ) {
@@ -929,9 +1103,12 @@ class MessageCache {
 			// Apparently load() failed
 			return null;
 		}
-		$cache = $this->mCache[$code]; // Copy the cache
-		unset( $cache['VERSION'] ); // Remove the VERSION key
-		$cache = array_diff( $cache, array( '!NONEXISTENT' ) ); // Remove any !NONEXISTENT keys
+		// Remove administrative keys
+		$cache = $this->mCache[$code];
+		unset( $cache['VERSION'] );
+		unset( $cache['EXPIRY'] );
+		// Remove any !NONEXISTENT keys
+		$cache = array_diff( $cache, array( '!NONEXISTENT' ) );
 		// Keys may appear with a capital first letter. lcfirst them.
 		return array_map( array( $wgContLang, 'lcfirst' ), array_keys( $cache ) );
 	}
diff --git a/includes/cache/ResourceFileCache.php b/includes/cache/ResourceFileCache.php
index 61f1e8c3..2ad7b853 100644
--- a/includes/cache/ResourceFileCache.php
+++ b/includes/cache/ResourceFileCache.php
@@ -29,7 +29,7 @@
 class ResourceFileCache extends FileCacheBase {
 	protected $mCacheWorthy;
 
-	/* @TODO: configurable? */
+	/* @todo configurable? */
 	const MISS_THRESHOLD = 360; // 6/min * 60 min
 
 	/**
diff --git a/includes/cache/SquidUpdate.php b/includes/cache/SquidUpdate.php
index 39bf4c9f..71afeba9 100644
--- a/includes/cache/SquidUpdate.php
+++ b/includes/cache/SquidUpdate.php
@@ -26,32 +26,42 @@
  * @ingroup Cache
  */
 class SquidUpdate {
-	var $urlArr, $mMaxTitles;
 
 	/**
-	 * @param $urlArr array
-	 * @param $maxTitles bool|int
+	 * Collection of URLs to purge.
+	 * @var array
 	 */
-	function __construct( $urlArr = array(), $maxTitles = false ) {
+	protected $urlArr;
+
+	/**
+	 * @param array $urlArr Collection of URLs to purge
+	 * @param bool|int $maxTitles Maximum number of unique URLs to purge
+	 */
+	public function __construct( $urlArr = array(), $maxTitles = false ) {
 		global $wgMaxSquidPurgeTitles;
 		if ( $maxTitles === false ) {
-			$this->mMaxTitles = $wgMaxSquidPurgeTitles;
-		} else {
-			$this->mMaxTitles = $maxTitles;
+			$maxTitles = $wgMaxSquidPurgeTitles;
 		}
-		$urlArr = array_unique( $urlArr ); // Remove duplicates
-		if ( count( $urlArr ) > $this->mMaxTitles ) {
-			$urlArr = array_slice( $urlArr, 0, $this->mMaxTitles );
+
+		// Remove duplicate URLs from list
+		$urlArr = array_unique( $urlArr );
+		if ( count( $urlArr ) > $maxTitles ) {
+			// Truncate to desired maximum URL count
+			$urlArr = array_slice( $urlArr, 0, $maxTitles );
 		}
 		$this->urlArr = $urlArr;
 	}
 
 	/**
-	 * @param $title Title
+	 * Create a SquidUpdate from the given Title object.
+	 *
+	 * The resulting SquidUpdate will purge the given Title's URLs as well as
+	 * the pages that link to it. Capped at $wgMaxSquidPurgeTitles total URLs.
 	 *
+	 * @param Title $title
 	 * @return SquidUpdate
 	 */
-	static function newFromLinksTo( &$title ) {
+	public static function newFromLinksTo( Title $title ) {
 		global $wgMaxSquidPurgeTitles;
 		wfProfileIn( __METHOD__ );
 
@@ -79,12 +89,11 @@ class SquidUpdate {
 	/**
 	 * Create a SquidUpdate from an array of Title objects, or a TitleArray object
 	 *
-	 * @param $titles array
-	 * @param $urlArr array
-	 *
+	 * @param array $titles
+	 * @param array $urlArr
 	 * @return SquidUpdate
 	 */
-	static function newFromTitles( $titles, $urlArr = array() ) {
+	public static function newFromTitles( $titles, $urlArr = array() ) {
 		global $wgMaxSquidPurgeTitles;
 		$i = 0;
 		foreach ( $titles as $title ) {
@@ -97,20 +106,19 @@ class SquidUpdate {
 	}
 
 	/**
-	 * @param $title Title
-	 *
+	 * @param Title $title
 	 * @return SquidUpdate
 	 */
-	static function newSimplePurge( &$title ) {
+	public static function newSimplePurge( Title $title ) {
 		$urlArr = $title->getSquidURLs();
 		return new SquidUpdate( $urlArr );
 	}
 
 	/**
-	 * Purges the list of URLs passed to the constructor
+	 * Purges the list of URLs passed to the constructor.
 	 */
-	function doUpdate() {
-		SquidUpdate::purge( $this->urlArr );
+	public function doUpdate() {
+		self::purge( $this->urlArr );
 	}
 
 	/**
@@ -119,27 +127,30 @@ class SquidUpdate {
 	 * (example: $urlArr[] = 'http://my.host/something')
 	 * XXX report broken Squids per mail or log
 	 *
-	 * @param $urlArr array
-	 * @return void
+	 * @param array $urlArr List of full URLs to purge
 	 */
-	static function purge( $urlArr ) {
-		global $wgSquidServers, $wgHTCPMulticastRouting;
+	public static function purge( $urlArr ) {
+		global $wgSquidServers, $wgHTCPRouting;
 
-		if( !$urlArr ) {
+		if ( !$urlArr ) {
 			return;
 		}
 
-		wfDebug( "Squid purge: " . implode( ' ', $urlArr ) . "\n" );
+		wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) . "\n" );
 
-		if ( $wgHTCPMulticastRouting ) {
-			SquidUpdate::HTCPPurge( $urlArr );
+		if ( $wgHTCPRouting ) {
+			self::HTCPPurge( $urlArr );
 		}
 
 		wfProfileIn( __METHOD__ );
 
-		$urlArr = array_unique( $urlArr ); // Remove duplicates
-		$maxSocketsPerSquid = 8; //  socket cap per Squid
-		$urlsPerSocket = 400; // 400 seems to be a good tradeoff, opening a socket takes a while
+		// Remove duplicate URLs
+		$urlArr = array_unique( $urlArr );
+		// Maximum number of parallel connections per squid
+		$maxSocketsPerSquid = 8;
+		// Number of requests to send per socket
+		// 400 seems to be a good tradeoff, opening a socket takes a while
+		$urlsPerSocket = 400;
 		$socketsPerSquid = ceil( count( $urlArr ) / $urlsPerSocket );
 		if ( $socketsPerSquid > $maxSocketsPerSquid ) {
 			$socketsPerSquid = $maxSocketsPerSquid;
@@ -162,17 +173,20 @@ class SquidUpdate {
 	}
 
 	/**
+	 * Send Hyper Text Caching Protocol (HTCP) CLR requests.
+	 *
 	 * @throws MWException
-	 * @param $urlArr array
+	 * @param array $urlArr Collection of URLs to purge
 	 */
-	static function HTCPPurge( $urlArr ) {
-		global $wgHTCPMulticastRouting, $wgHTCPMulticastTTL;
+	public static function HTCPPurge( $urlArr ) {
+		global $wgHTCPRouting, $wgHTCPMulticastTTL;
 		wfProfileIn( __METHOD__ );
 
-		$htcpOpCLR = 4; // HTCP CLR
+		// HTCP CLR operation
+		$htcpOpCLR = 4;
 
 		// @todo FIXME: PHP doesn't support these socket constants (include/linux/in.h)
-		if( !defined( "IPPROTO_IP" ) ) {
+		if ( !defined( "IPPROTO_IP" ) ) {
 			define( "IPPROTO_IP", 0 );
 			define( "IP_MULTICAST_LOOP", 34 );
 			define( "IP_MULTICAST_TTL", 33 );
@@ -180,55 +194,73 @@ class SquidUpdate {
 
 		// pfsockopen doesn't work because we need set_sock_opt
 		$conn = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
-		if ( $conn ) {
-			// Set socket options
-			socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_LOOP, 0 );
-			if ( $wgHTCPMulticastTTL != 1 )
-				socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_TTL,
-					$wgHTCPMulticastTTL );
-
-			$urlArr = array_unique( $urlArr ); // Remove duplicates
-			foreach ( $urlArr as $url ) {
-				if( !is_string( $url ) ) {
-					throw new MWException( 'Bad purge URL' );
-				}
-				$url = SquidUpdate::expand( $url );
-				$conf = self::getRuleForURL( $url, $wgHTCPMulticastRouting );
-				if ( !$conf ) {
-					wfDebug( "No HTCP rule configured for URL $url , skipping\n" );
-					continue;
-				}
-				if ( !isset( $conf['host'] ) || !isset( $conf['port'] ) ) {
+		if ( ! $conn ) {
+			$errstr = socket_strerror( socket_last_error() );
+			wfDebugLog( 'squid', __METHOD__ .
+				": Error opening UDP socket: $errstr\n" );
+			wfProfileOut( __METHOD__ );
+			return;
+		}
+
+		// Set socket options
+		socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_LOOP, 0 );
+		if ( $wgHTCPMulticastTTL != 1 ) {
+			// Set multicast time to live (hop count) option on socket
+			socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_TTL,
+				$wgHTCPMulticastTTL );
+		}
+
+		// Remove duplicate URLs from collection
+		$urlArr = array_unique( $urlArr );
+		foreach ( $urlArr as $url ) {
+			if ( !is_string( $url ) ) {
+				wfProfileOut( __METHOD__ );
+				throw new MWException( 'Bad purge URL' );
+			}
+			$url = self::expand( $url );
+			$conf = self::getRuleForURL( $url, $wgHTCPRouting );
+			if ( !$conf ) {
+				wfDebugLog( 'squid', __METHOD__ .
+					"No HTCP rule configured for URL {$url} , skipping\n" );
+				continue;
+			}
+
+			if ( isset( $conf['host'] ) && isset( $conf['port'] ) ) {
+				// Normalize single entries
+				$conf = array( $conf );
+			}
+			foreach ( $conf as $subconf ) {
+				if ( !isset( $subconf['host'] ) || !isset( $subconf['port'] ) ) {
+					wfProfileOut( __METHOD__ );
 					throw new MWException( "Invalid HTCP rule for URL $url\n" );
 				}
+			}
 
-				// Construct a minimal HTCP request diagram
-				// as per RFC 2756
-				// Opcode 'CLR', no response desired, no auth
-				$htcpTransID = rand();
+			// Construct a minimal HTCP request diagram
+			// as per RFC 2756
+			// Opcode 'CLR', no response desired, no auth
+			$htcpTransID = rand();
 
-				$htcpSpecifier = pack( 'na4na*na8n',
-					4, 'HEAD', strlen( $url ), $url,
-					8, 'HTTP/1.0', 0 );
+			$htcpSpecifier = pack( 'na4na*na8n',
+				4, 'HEAD', strlen( $url ), $url,
+				8, 'HTTP/1.0', 0 );
 
-				$htcpDataLen = 8 + 2 + strlen( $htcpSpecifier );
-				$htcpLen = 4 + $htcpDataLen + 2;
+			$htcpDataLen = 8 + 2 + strlen( $htcpSpecifier );
+			$htcpLen = 4 + $htcpDataLen + 2;
 
-				// Note! Squid gets the bit order of the first
-				// word wrong, wrt the RFC. Apparently no other
-				// implementation exists, so adapt to Squid
-				$htcpPacket = pack( 'nxxnCxNxxa*n',
-					$htcpLen, $htcpDataLen, $htcpOpCLR,
-					$htcpTransID, $htcpSpecifier, 2);
+			// Note! Squid gets the bit order of the first
+			// word wrong, wrt the RFC. Apparently no other
+			// implementation exists, so adapt to Squid
+			$htcpPacket = pack( 'nxxnCxNxxa*n',
+				$htcpLen, $htcpDataLen, $htcpOpCLR,
+				$htcpTransID, $htcpSpecifier, 2 );
 
-				// Send out
-				wfDebug( "Purging URL $url via HTCP\n" );
+			wfDebugLog( 'squid', __METHOD__ .
+				"Purging URL $url via HTCP\n" );
+			foreach ( $conf as $subconf ) {
 				socket_sendto( $conn, $htcpPacket, $htcpLen, 0,
-					$conf['host'], $conf['port'] );
+					$subconf['host'], $subconf['port'] );
 			}
-		} else {
-			$errstr = socket_strerror( socket_last_error() );
-			wfDebug( __METHOD__ . "(): Error opening UDP socket: $errstr\n" );
 		}
 		wfProfileOut( __METHOD__ );
 	}
@@ -244,21 +276,20 @@ class SquidUpdate {
 	 *
 	 * Client functions should not need to call this.
 	 *
-	 * @param $url string
-	 *
+	 * @param string $url
 	 * @return string
 	 */
-	static function expand( $url ) {
+	public static function expand( $url ) {
 		return wfExpandUrl( $url, PROTO_INTERNAL );
 	}
 
 	/**
 	 * Find the HTCP routing rule to use for a given URL.
 	 * @param string $url URL to match
-	 * @param array $rules Array of rules, see $wgHTCPMulticastRouting for format and behavior
+	 * @param array $rules Array of rules, see $wgHTCPRouting for format and behavior
 	 * @return mixed Element of $rules that matched, or false if nothing matched
 	 */
-	static function getRuleForURL( $url, $rules ) {
+	private static function getRuleForURL( $url, $rules ) {
 		foreach ( $rules as $regex => $routing ) {
 			if ( $regex === '' || preg_match( $regex, $url ) ) {
 				return $routing;
diff --git a/includes/cache/UserCache.php b/includes/cache/UserCache.php
index bfbacfaa..6085f586 100644
--- a/includes/cache/UserCache.php
+++ b/includes/cache/UserCache.php
@@ -58,6 +58,17 @@ class UserCache {
 			: false; // user does not exist?
 	}
 
+	/**
+	 * Get the name of a user or return $ip if the user ID is 0
+	 *
+	 * @param integer $userId
+	 * @param string $ip
+	 * @since 1.22
+	 */
+	public function getUserName( $userId, $ip ) {
+		return $userId > 0 ? $this->getProp( $userId, 'name' ) : $ip;
+	}
+
 	/**
 	 * Preloads user names for given list of users.
 	 * @param array $userIds List of user IDs
@@ -70,6 +81,8 @@ class UserCache {
 		$usersToCheck = array();
 		$usersToQuery = array();
 
+		$userIds = array_unique( $userIds );
+
 		foreach ( $userIds as $userId ) {
 			$userId = (int)$userId;
 			if ( $userId <= 0 ) {
diff --git a/includes/changes/ChangesList.php b/includes/changes/ChangesList.php
new file mode 100644
index 00000000..bf800c46
--- /dev/null
+++ b/includes/changes/ChangesList.php
@@ -0,0 +1,552 @@
+<?php
+/**
+ * Base class for all changes lists.
+ *
+ * The class is used for formatting recent changes, related changes and watchlist.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class ChangesList extends ContextSource {
+
+	/**
+	 * @var Skin
+	 */
+	public $skin;
+
+	protected $watchlist = false;
+
+	protected $message;
+
+	/**
+	 * Changeslist constructor
+	 *
+	 * @param $obj Skin or IContextSource
+	 */
+	public function __construct( $obj ) {
+		if ( $obj instanceof IContextSource ) {
+			$this->setContext( $obj );
+			$this->skin = $obj->getSkin();
+		} else {
+			$this->setContext( $obj->getContext() );
+			$this->skin = $obj;
+		}
+		$this->preCacheMessages();
+	}
+
+	/**
+	 * Fetch an appropriate changes list class for the main context
+	 * This first argument used to be an User object.
+	 *
+	 * @deprecated in 1.18; use newFromContext() instead
+	 * @param string|User $unused Unused
+	 * @return ChangesList|EnhancedChangesList|OldChangesList derivative
+	 */
+	public static function newFromUser( $unused ) {
+		wfDeprecated( __METHOD__, '1.18' );
+		return self::newFromContext( RequestContext::getMain() );
+	}
+
+	/**
+	 * Fetch an appropriate changes list class for the specified context
+	 * Some users might want to use an enhanced list format, for instance
+	 *
+	 * @param $context IContextSource to use
+	 * @return ChangesList|EnhancedChangesList|OldChangesList derivative
+	 */
+	public static function newFromContext( IContextSource $context ) {
+		$user = $context->getUser();
+		$sk = $context->getSkin();
+		$list = null;
+		if ( wfRunHooks( 'FetchChangesList', array( $user, &$sk, &$list ) ) ) {
+			$new = $context->getRequest()->getBool( 'enhanced', $user->getOption( 'usenewrc' ) );
+			return $new ? new EnhancedChangesList( $context ) : new OldChangesList( $context );
+		} else {
+			return $list;
+		}
+	}
+
+	/**
+	 * Sets the list to use a "<li class='watchlist-(namespace)-(page)'>" tag
+	 * @param $value Boolean
+	 */
+	public function setWatchlistDivs( $value = true ) {
+		$this->watchlist = $value;
+	}
+
+	/**
+	 * As we use the same small set of messages in various methods and that
+	 * they are called often, we call them once and save them in $this->message
+	 */
+	private function preCacheMessages() {
+		if ( !isset( $this->message ) ) {
+			foreach ( array(
+				'cur', 'diff', 'hist', 'enhancedrc-history', 'last', 'blocklink', 'history',
+				'semicolon-separator', 'pipe-separator' ) as $msg
+			) {
+				$this->message[$msg] = $this->msg( $msg )->escaped();
+			}
+		}
+	}
+
+	/**
+	 * Returns the appropriate flags for new page, minor change and patrolling
+	 * @param array $flags Associative array of 'flag' => Bool
+	 * @param string $nothing to use for empty space
+	 * @return String
+	 */
+	public function recentChangesFlags( $flags, $nothing = '&#160;' ) {
+		global $wgRecentChangesFlags;
+		$f = '';
+		foreach ( array_keys( $wgRecentChangesFlags ) as $flag ) {
+			$f .= isset( $flags[$flag] ) && $flags[$flag]
+				? self::flag( $flag )
+				: $nothing;
+		}
+		return $f;
+	}
+
+	/**
+	 * Provide the "<abbr>" element appropriate to a given abbreviated flag,
+	 * namely the flag indicating a new page, a minor edit, a bot edit, or an
+	 * unpatrolled edit.  By default in English it will contain "N", "m", "b",
+	 * "!" respectively, plus it will have an appropriate title and class.
+	 *
+	 * @param string $flag One key of $wgRecentChangesFlags
+	 * @return String: Raw HTML
+	 */
+	public static function flag( $flag ) {
+		static $flagInfos = null;
+		if ( is_null( $flagInfos ) ) {
+			global $wgRecentChangesFlags;
+			$flagInfos = array();
+			foreach ( $wgRecentChangesFlags as $key => $value ) {
+				$flagInfos[$key]['letter'] = wfMessage( $value['letter'] )->escaped();
+				$flagInfos[$key]['title'] = wfMessage( $value['title'] )->escaped();
+				// Allow customized class name, fall back to flag name
+				$flagInfos[$key]['class'] = Sanitizer::escapeClass(
+					isset( $value['class'] ) ? $value['class'] : $key );
+			}
+		}
+
+		// Inconsistent naming, bleh, kepted for b/c
+		$map = array(
+			'minoredit' => 'minor',
+			'botedit' => 'bot',
+		);
+		if ( isset( $map[$flag] ) ) {
+			$flag = $map[$flag];
+		}
+
+		return "<abbr class='" . $flagInfos[$flag]['class'] . "' title='" . $flagInfos[$flag]['title'] . "'>" .
+			$flagInfos[$flag]['letter'] .
+			'</abbr>';
+	}
+
+	/**
+	 * Returns text for the start of the tabular part of RC
+	 * @return String
+	 */
+	public function beginRecentChangesList() {
+		$this->rc_cache = array();
+		$this->rcMoveIndex = 0;
+		$this->rcCacheIndex = 0;
+		$this->lastdate = '';
+		$this->rclistOpen = false;
+		$this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' );
+		return '';
+	}
+
+	/**
+	 * Show formatted char difference
+	 * @param $old Integer: bytes
+	 * @param $new Integer: bytes
+	 * @param $context IContextSource context to use
+	 * @return String
+	 */
+	public static function showCharacterDifference( $old, $new, IContextSource $context = null ) {
+		global $wgRCChangedSizeThreshold, $wgMiserMode;
+
+		if ( !$context ) {
+			$context = RequestContext::getMain();
+		}
+
+		$new = (int)$new;
+		$old = (int)$old;
+		$szdiff = $new - $old;
+
+		$lang = $context->getLanguage();
+		$code = $lang->getCode();
+		static $fastCharDiff = array();
+		if ( !isset( $fastCharDiff[$code] ) ) {
+			$fastCharDiff[$code] = $wgMiserMode || $context->msg( 'rc-change-size' )->plain() === '$1';
+		}
+
+		$formattedSize = $lang->formatNum( $szdiff );
+
+		if ( !$fastCharDiff[$code] ) {
+			$formattedSize = $context->msg( 'rc-change-size', $formattedSize )->text();
+		}
+
+		if ( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) {
+			$tag = 'strong';
+		} else {
+			$tag = 'span';
+		}
+
+		if ( $szdiff === 0 ) {
+			$formattedSizeClass = 'mw-plusminus-null';
+		}
+		if ( $szdiff > 0 ) {
+			$formattedSize = '+' . $formattedSize;
+			$formattedSizeClass = 'mw-plusminus-pos';
+		}
+		if ( $szdiff < 0 ) {
+			$formattedSizeClass = 'mw-plusminus-neg';
+		}
+
+		$formattedTotalSize = $context->msg( 'rc-change-size-new' )->numParams( $new )->text();
+
+		return Html::element( $tag,
+			array( 'dir' => 'ltr', 'class' => $formattedSizeClass, 'title' => $formattedTotalSize ),
+			$context->msg( 'parentheses', $formattedSize )->plain() ) . $lang->getDirMark();
+	}
+
+	/**
+	 * Format the character difference of one or several changes.
+	 *
+	 * @param $old RecentChange
+	 * @param $new RecentChange last change to use, if not provided, $old will be used
+	 * @return string HTML fragment
+	 */
+	public function formatCharacterDifference( RecentChange $old, RecentChange $new = null ) {
+		$oldlen = $old->mAttribs['rc_old_len'];
+
+		if ( $new ) {
+			$newlen = $new->mAttribs['rc_new_len'];
+		} else {
+			$newlen = $old->mAttribs['rc_new_len'];
+		}
+
+		if ( $oldlen === null || $newlen === null ) {
+			return '';
+		}
+
+		return self::showCharacterDifference( $oldlen, $newlen, $this->getContext() );
+	}
+
+	/**
+	 * Returns text for the end of RC
+	 * @return String
+	 */
+	public function endRecentChangesList() {
+		if ( $this->rclistOpen ) {
+			return "</ul>\n";
+		} else {
+			return '';
+		}
+	}
+
+	/**
+	 * @param string $s HTML to update
+	 * @param $rc_timestamp mixed
+	 */
+	public function insertDateHeader( &$s, $rc_timestamp ) {
+		# Make date header if necessary
+		$date = $this->getLanguage()->userDate( $rc_timestamp, $this->getUser() );
+		if ( $date != $this->lastdate ) {
+			if ( $this->lastdate != '' ) {
+				$s .= "</ul>\n";
+			}
+			$s .= Xml::element( 'h4', null, $date ) . "\n<ul class=\"special\">";
+			$this->lastdate = $date;
+			$this->rclistOpen = true;
+		}
+	}
+
+	/**
+	 * @param string $s HTML to update
+	 * @param $title Title
+	 * @param $logtype string
+	 */
+	public function insertLog( &$s, $title, $logtype ) {
+		$page = new LogPage( $logtype );
+		$logname = $page->getName()->escaped();
+		$s .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $title, $logname ) )->escaped();
+	}
+
+	/**
+	 * @param string $s HTML to update
+	 * @param $rc RecentChange
+	 * @param $unpatrolled
+	 */
+	public function insertDiffHist( &$s, &$rc, $unpatrolled ) {
+		# Diff link
+		if ( $rc->mAttribs['rc_type'] == RC_NEW || $rc->mAttribs['rc_type'] == RC_LOG ) {
+			$diffLink = $this->message['diff'];
+		} elseif ( !self::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
+			$diffLink = $this->message['diff'];
+		} else {
+			$query = array(
+				'curid' => $rc->mAttribs['rc_cur_id'],
+				'diff' => $rc->mAttribs['rc_this_oldid'],
+				'oldid' => $rc->mAttribs['rc_last_oldid']
+			);
+
+			$diffLink = Linker::linkKnown(
+				$rc->getTitle(),
+				$this->message['diff'],
+				array( 'tabindex' => $rc->counter ),
+				$query
+			);
+		}
+		$diffhist = $diffLink . $this->message['pipe-separator'];
+		# History link
+		$diffhist .= Linker::linkKnown(
+			$rc->getTitle(),
+			$this->message['hist'],
+			array(),
+			array(
+				'curid' => $rc->mAttribs['rc_cur_id'],
+				'action' => 'history'
+			)
+		);
+		$s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() . ' <span class="mw-changeslist-separator">. .</span> ';
+	}
+
+	/**
+	 * @param string $s HTML to update
+	 * @param $rc RecentChange
+	 * @param $unpatrolled
+	 * @param $watched
+	 */
+	public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) {
+		$params = array();
+
+		$articlelink = Linker::linkKnown(
+			$rc->getTitle(),
+			null,
+			array( 'class' => 'mw-changeslist-title' ),
+			$params
+		);
+		if ( $this->isDeleted( $rc, Revision::DELETED_TEXT ) ) {
+			$articlelink = '<span class="history-deleted">' . $articlelink . '</span>';
+		}
+		# To allow for boldening pages watched by this user
+		$articlelink = "<span class=\"mw-title\">{$articlelink}</span>";
+		# RTL/LTR marker
+		$articlelink .= $this->getLanguage()->getDirMark();
+
+		wfRunHooks( 'ChangesListInsertArticleLink',
+			array( &$this, &$articlelink, &$s, &$rc, $unpatrolled, $watched ) );
+
+		$s .= " $articlelink";
+	}
+
+	/**
+	 * Get the timestamp from $rc formatted with current user's settings
+	 * and a separator
+	 *
+	 * @param $rc RecentChange
+	 * @return string HTML fragment
+	 */
+	public function getTimestamp( $rc ) {
+		return $this->message['semicolon-separator'] . '<span class="mw-changeslist-date">' .
+			$this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . '</span> <span class="mw-changeslist-separator">. .</span> ';
+	}
+
+	/**
+	 * Insert time timestamp string from $rc into $s
+	 *
+	 * @param string $s HTML to update
+	 * @param $rc RecentChange
+	 */
+	public function insertTimestamp( &$s, $rc ) {
+		$s .= $this->getTimestamp( $rc );
+	}
+
+	/**
+	 * Insert links to user page, user talk page and eventually a blocking link
+	 *
+	 * @param &$s String HTML to update
+	 * @param &$rc RecentChange
+	 */
+	public function insertUserRelatedLinks( &$s, &$rc ) {
+		if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
+			$s .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
+		} else {
+			$s .= $this->getLanguage()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'],
+				$rc->mAttribs['rc_user_text'] );
+			$s .= Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
+		}
+	}
+
+	/**
+	 * Insert a formatted action
+	 *
+	 * @param $rc RecentChange
+	 * @return string
+	 */
+	public function insertLogEntry( $rc ) {
+		$formatter = LogFormatter::newFromRow( $rc->mAttribs );
+		$formatter->setContext( $this->getContext() );
+		$formatter->setShowUserToolLinks( true );
+		$mark = $this->getLanguage()->getDirMark();
+		return $formatter->getActionText() . " $mark" . $formatter->getComment();
+	}
+
+	/**
+	 * Insert a formatted comment
+	 * @param $rc RecentChange
+	 * @return string
+	 */
+	public function insertComment( $rc ) {
+		if ( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) {
+			if ( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) {
+				return ' <span class="history-deleted">' . $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
+			} else {
+				return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
+			}
+		}
+		return '';
+	}
+
+	/**
+	 * Check whether to enable recent changes patrol features
+	 *
+	 * @deprecated since 1.22
+	 * @return Boolean
+	 */
+	public static function usePatrol() {
+		global $wgUser;
+
+		wfDeprecated( __METHOD__, '1.22' );
+
+		return $wgUser->useRCPatrol();
+	}
+
+	/**
+	 * Returns the string which indicates the number of watching users
+	 * @return string
+	 */
+	protected function numberofWatchingusers( $count ) {
+		static $cache = array();
+		if ( $count > 0 ) {
+			if ( !isset( $cache[$count] ) ) {
+				$cache[$count] = $this->msg( 'number_of_watching_users_RCview' )->numParams( $count )->escaped();
+			}
+			return $cache[$count];
+		} else {
+			return '';
+		}
+	}
+
+	/**
+	 * Determine if said field of a revision is hidden
+	 * @param $rc RCCacheEntry
+	 * @param $field Integer: one of DELETED_* bitfield constants
+	 * @return Boolean
+	 */
+	public static function isDeleted( $rc, $field ) {
+		return ( $rc->mAttribs['rc_deleted'] & $field ) == $field;
+	}
+
+	/**
+	 * Determine if the current user is allowed to view a particular
+	 * field of this revision, if it's marked as deleted.
+	 * @param $rc RCCacheEntry
+	 * @param $field Integer
+	 * @param $user User object to check, or null to use $wgUser
+	 * @return Boolean
+	 */
+	public static function userCan( $rc, $field, User $user = null ) {
+		if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
+			return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
+		} else {
+			return Revision::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
+		}
+	}
+
+	/**
+	 * @param $link string
+	 * @param $watched bool
+	 * @return string
+	 */
+	protected function maybeWatchedLink( $link, $watched = false ) {
+		if ( $watched ) {
+			return '<strong class="mw-watched">' . $link . '</strong>';
+		} else {
+			return '<span class="mw-rc-unwatched">' . $link . '</span>';
+		}
+	}
+
+	/** Inserts a rollback link
+	 *
+	 * @param $s string
+	 * @param $rc RecentChange
+	 */
+	public function insertRollback( &$s, &$rc ) {
+		if ( $rc->mAttribs['rc_type'] == RC_EDIT && $rc->mAttribs['rc_this_oldid'] && $rc->mAttribs['rc_cur_id'] ) {
+			$page = $rc->getTitle();
+			/** Check for rollback and edit permissions, disallow special pages, and only
+			  * show a link on the top-most revision */
+			if ( $this->getUser()->isAllowed( 'rollback' ) && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid'] )
+			{
+				$rev = new Revision( array(
+					'title' => $page,
+					'id' => $rc->mAttribs['rc_this_oldid'],
+					'user' => $rc->mAttribs['rc_user'],
+					'user_text' => $rc->mAttribs['rc_user_text'],
+					'deleted' => $rc->mAttribs['rc_deleted']
+				) );
+				$s .= ' ' . Linker::generateRollback( $rev, $this->getContext() );
+			}
+		}
+	}
+
+	/**
+	 * @param $s string
+	 * @param $rc RecentChange
+	 * @param $classes
+	 */
+	public function insertTags( &$s, &$rc, &$classes ) {
+		if ( empty( $rc->mAttribs['ts_tags'] ) ) {
+			return;
+		}
+
+		list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $rc->mAttribs['ts_tags'], 'changeslist' );
+		$classes = array_merge( $classes, $newClasses );
+		$s .= ' ' . $tagSummary;
+	}
+
+	public function insertExtra( &$s, &$rc, &$classes ) {
+		// Empty, used for subclasses to add anything special.
+	}
+
+	protected function showAsUnpatrolled( RecentChange $rc ) {
+		$unpatrolled = false;
+		if ( !$rc->mAttribs['rc_patrolled'] ) {
+			if ( $this->getUser()->useRCPatrol() ) {
+				$unpatrolled = true;
+			} elseif ( $this->getUser()->useNPPatrol() && $rc->mAttribs['rc_type'] == RC_NEW ) {
+				$unpatrolled = true;
+			}
+		}
+		return $unpatrolled;
+	}
+}
diff --git a/includes/changes/EnhancedChangesList.php b/includes/changes/EnhancedChangesList.php
new file mode 100644
index 00000000..433adb37
--- /dev/null
+++ b/includes/changes/EnhancedChangesList.php
@@ -0,0 +1,662 @@
+<?php
+/**
+ * Generates a list of changes using an Enhanced system (uses javascript).
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class EnhancedChangesList extends ChangesList {
+
+	protected $rc_cache;
+
+	/**
+	 * Add the JavaScript file for enhanced changeslist
+	 * @return String
+	 */
+	public function beginRecentChangesList() {
+		$this->rc_cache = array();
+		$this->rcMoveIndex = 0;
+		$this->rcCacheIndex = 0;
+		$this->lastdate = '';
+		$this->rclistOpen = false;
+		$this->getOutput()->addModuleStyles( array(
+			'mediawiki.special.changeslist',
+			'mediawiki.special.changeslist.enhanced',
+		) );
+		$this->getOutput()->addModules( array(
+			'jquery.makeCollapsible',
+			'mediawiki.icon',
+		) );
+		return '';
+	}
+	/**
+	 * Format a line for enhanced recentchange (aka with javascript and block of lines).
+	 *
+	 * @param $baseRC RecentChange
+	 * @param $watched bool
+	 *
+	 * @return string
+	 */
+	public function recentChangesLine( &$baseRC, $watched = false ) {
+		wfProfileIn( __METHOD__ );
+
+		# Create a specialised object
+		$rc = RCCacheEntry::newFromParent( $baseRC );
+
+		$curIdEq = array( 'curid' => $rc->mAttribs['rc_cur_id'] );
+
+		# If it's a new day, add the headline and flush the cache
+		$date = $this->getLanguage()->userDate( $rc->mAttribs['rc_timestamp'], $this->getUser() );
+		$ret = '';
+		if ( $date != $this->lastdate ) {
+			# Process current cache
+			$ret = $this->recentChangesBlock();
+			$this->rc_cache = array();
+			$ret .= Xml::element( 'h4', null, $date ) . "\n";
+			$this->lastdate = $date;
+		}
+
+		# Should patrol-related stuff be shown?
+		$rc->unpatrolled = $this->showAsUnpatrolled( $rc );
+
+		$showdifflinks = true;
+		# Make article link
+		$type = $rc->mAttribs['rc_type'];
+		$logType = $rc->mAttribs['rc_log_type'];
+		// Page moves, very old style, not supported anymore
+		if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+		// New unpatrolled pages
+		} elseif ( $rc->unpatrolled && $type == RC_NEW ) {
+			$clink = Linker::linkKnown( $rc->getTitle() );
+		// Log entries
+		} elseif ( $type == RC_LOG ) {
+			if ( $logType ) {
+				$logtitle = SpecialPage::getTitleFor( 'Log', $logType );
+				$logpage = new LogPage( $logType );
+				$logname = $logpage->getName()->escaped();
+				$clink = $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logtitle, $logname ) )->escaped();
+			} else {
+				$clink = Linker::link( $rc->getTitle() );
+			}
+			$watched = false;
+		// Log entries (old format) and special pages
+		} elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
+			wfDebug( "Unexpected special page in recentchanges\n" );
+			$clink = '';
+		// Edits
+		} else {
+			$clink = Linker::linkKnown( $rc->getTitle() );
+		}
+
+		# Don't show unusable diff links
+		if ( !ChangesList::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
+			$showdifflinks = false;
+		}
+
+		$time = $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() );
+		$rc->watched = $watched;
+		$rc->link = $clink;
+		$rc->timestamp = $time;
+		$rc->numberofWatchingusers = $baseRC->numberofWatchingusers;
+
+		# Make "cur" and "diff" links.  Do not use link(), it is too slow if
+		# called too many times (50% of CPU time on RecentChanges!).
+		$thisOldid = $rc->mAttribs['rc_this_oldid'];
+		$lastOldid = $rc->mAttribs['rc_last_oldid'];
+
+		$querycur = $curIdEq + array( 'diff' => '0', 'oldid' => $thisOldid );
+		$querydiff = $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid );
+
+		if ( !$showdifflinks ) {
+			$curLink = $this->message['cur'];
+			$diffLink = $this->message['diff'];
+		} elseif ( in_array( $type, array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
+			if ( $type != RC_NEW ) {
+				$curLink = $this->message['cur'];
+			} else {
+				$curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) );
+				$curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
+			}
+			$diffLink = $this->message['diff'];
+		} else {
+			$diffUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querydiff ) );
+			$curUrl = htmlspecialchars( $rc->getTitle()->getLinkURL( $querycur ) );
+			$diffLink = "<a href=\"$diffUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['diff']}</a>";
+			$curLink = "<a href=\"$curUrl\" tabindex=\"{$baseRC->counter}\">{$this->message['cur']}</a>";
+		}
+
+		# Make "last" link
+		if ( !$showdifflinks || !$lastOldid ) {
+			$lastLink = $this->message['last'];
+		} elseif ( in_array( $type, array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
+			$lastLink = $this->message['last'];
+		} else {
+			$lastLink = Linker::linkKnown( $rc->getTitle(), $this->message['last'],
+				array(), $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ) );
+		}
+
+		# Make user links
+		if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
+			$rc->userlink = ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
+		} else {
+			$rc->userlink = Linker::userLink( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
+			$rc->usertalklink = Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
+		}
+
+		$rc->lastlink = $lastLink;
+		$rc->curlink = $curLink;
+		$rc->difflink = $diffLink;
+
+		# Put accumulated information into the cache, for later display
+		# Page moves go on their own line
+		$title = $rc->getTitle();
+		$secureName = $title->getPrefixedDBkey();
+		if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+			# Use an @ character to prevent collision with page names
+			$this->rc_cache['@@' . ( $this->rcMoveIndex++ )] = array( $rc );
+		} else {
+			# Logs are grouped by type
+			if ( $type == RC_LOG ) {
+				$secureName = SpecialPage::getTitleFor( 'Log', $logType )->getPrefixedDBkey();
+			}
+			if ( !isset( $this->rc_cache[$secureName] ) ) {
+				$this->rc_cache[$secureName] = array();
+			}
+
+			array_push( $this->rc_cache[$secureName], $rc );
+		}
+
+		wfProfileOut( __METHOD__ );
+
+		return $ret;
+	}
+
+	/**
+	 * Enhanced RC group
+	 * @return string
+	 */
+	protected function recentChangesBlockGroup( $block ) {
+		global $wgRCShowChangedSize;
+
+		wfProfileIn( __METHOD__ );
+
+		# Add the namespace and title of the block as part of the class
+		$classes = array( 'mw-collapsible', 'mw-collapsed', 'mw-enhanced-rc' );
+		if ( $block[0]->mAttribs['rc_log_type'] ) {
+			# Log entry
+			$classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
+					. $block[0]->mAttribs['rc_log_type'] . '-' . $block[0]->mAttribs['rc_title'] );
+		} else {
+			$classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns'
+					. $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
+		}
+		$classes[] = $block[0]->watched && $block[0]->mAttribs['rc_timestamp'] >= $block[0]->watched
+			? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
+		$r = Html::openElement( 'table', array( 'class' => $classes ) ) .
+			Html::openElement( 'tr' );
+
+		# Collate list of users
+		$userlinks = array();
+		# Other properties
+		$unpatrolled = false;
+		$isnew = false;
+		$allBots = true;
+		$allMinors = true;
+		$curId = $currentRevision = 0;
+		# Some catalyst variables...
+		$namehidden = true;
+		$allLogs = true;
+		foreach ( $block as $rcObj ) {
+			$oldid = $rcObj->mAttribs['rc_last_oldid'];
+			if ( $rcObj->mAttribs['rc_type'] == RC_NEW ) {
+				$isnew = true;
+			}
+			// If all log actions to this page were hidden, then don't
+			// give the name of the affected page for this block!
+			if ( !$this->isDeleted( $rcObj, LogPage::DELETED_ACTION ) ) {
+				$namehidden = false;
+			}
+			$u = $rcObj->userlink;
+			if ( !isset( $userlinks[$u] ) ) {
+				$userlinks[$u] = 0;
+			}
+			if ( $rcObj->unpatrolled ) {
+				$unpatrolled = true;
+			}
+			if ( $rcObj->mAttribs['rc_type'] != RC_LOG ) {
+				$allLogs = false;
+			}
+			# Get the latest entry with a page_id and oldid
+			# since logs may not have these.
+			if ( !$curId && $rcObj->mAttribs['rc_cur_id'] ) {
+				$curId = $rcObj->mAttribs['rc_cur_id'];
+			}
+			if ( !$currentRevision && $rcObj->mAttribs['rc_this_oldid'] ) {
+				$currentRevision = $rcObj->mAttribs['rc_this_oldid'];
+			}
+
+			if ( !$rcObj->mAttribs['rc_bot'] ) {
+				$allBots = false;
+			}
+			if ( !$rcObj->mAttribs['rc_minor'] ) {
+				$allMinors = false;
+			}
+
+			$userlinks[$u]++;
+		}
+
+		# Sort the list and convert to text
+		krsort( $userlinks );
+		asort( $userlinks );
+		$users = array();
+		foreach ( $userlinks as $userlink => $count ) {
+			$text = $userlink;
+			$text .= $this->getLanguage()->getDirMark();
+			if ( $count > 1 ) {
+				$text .= ' ' . $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->formatNum( $count ) . '×' )->escaped();
+			}
+			array_push( $users, $text );
+		}
+
+		$users = ' <span class="changedby">'
+			. $this->msg( 'brackets' )->rawParams(
+				implode( $this->message['semicolon-separator'], $users )
+			)->escaped() . '</span>';
+
+		$tl = '<span class="mw-collapsible-toggle mw-collapsible-arrow mw-enhancedchanges-arrow mw-enhancedchanges-arrow-space"></span>';
+		$r .= "<td>$tl</td>";
+
+		# Main line
+		$r .= '<td class="mw-enhanced-rc">' . $this->recentChangesFlags( array(
+			'newpage' => $isnew, # show, when one have this flag
+			'minor' => $allMinors, # show only, when all have this flag
+			'unpatrolled' => $unpatrolled, # show, when one have this flag
+			'bot' => $allBots, # show only, when all have this flag
+		) );
+
+		# Timestamp
+		$r .= '&#160;' . $block[0]->timestamp . '&#160;</td><td>';
+
+		# Article link
+		if ( $namehidden ) {
+			$r .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-event' )->escaped() . '</span>';
+		} elseif ( $allLogs ) {
+			$r .= $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
+		} else {
+			$this->insertArticleLink( $r, $block[0], $block[0]->unpatrolled, $block[0]->watched );
+		}
+
+		$r .= $this->getLanguage()->getDirMark();
+
+		$queryParams['curid'] = $curId;
+
+		# Changes message
+		static $nchanges = array();
+		static $sinceLastVisitMsg = array();
+
+		$n = count( $block );
+		if ( !isset( $nchanges[$n] ) ) {
+			$nchanges[$n] = $this->msg( 'nchanges' )->numParams( $n )->escaped();
+		}
+
+		$sinceLast = 0;
+		$unvisitedOldid = null;
+		foreach ( $block as $rcObj ) {
+			// Same logic as below inside main foreach
+			if ( $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched ) {
+				$sinceLast++;
+				$unvisitedOldid = $rcObj->mAttribs['rc_last_oldid'];
+			}
+		}
+		if ( !isset( $sinceLastVisitMsg[$sinceLast] ) ) {
+			$sinceLastVisitMsg[$sinceLast] =
+				$this->msg( 'enhancedrc-since-last-visit' )->numParams( $sinceLast )->escaped();
+		}
+
+		# Total change link
+		$r .= ' ';
+		$logtext = '';
+		if ( !$allLogs ) {
+			if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
+				$logtext .= $nchanges[$n];
+			} elseif ( $isnew ) {
+				$logtext .= $nchanges[$n];
+			} else {
+				$logtext .= Linker::link(
+					$block[0]->getTitle(),
+					$nchanges[$n],
+					array(),
+					$queryParams + array(
+						'diff' => $currentRevision,
+						'oldid' => $oldid,
+					),
+					array( 'known', 'noclasses' )
+				);
+				if ( $sinceLast > 0 && $sinceLast < $n ) {
+					$logtext .= $this->message['pipe-separator'] . Linker::link(
+						$block[0]->getTitle(),
+						$sinceLastVisitMsg[$sinceLast],
+						array(),
+						$queryParams + array(
+							'diff' => $currentRevision,
+							'oldid' => $unvisitedOldid,
+						),
+						array( 'known', 'noclasses' )
+					);
+				}
+			}
+		}
+
+		# History
+		if ( $allLogs ) {
+			// don't show history link for logs
+		} elseif ( $namehidden || !$block[0]->getTitle()->exists() ) {
+			$logtext .= $this->message['pipe-separator'] . $this->message['enhancedrc-history'];
+		} else {
+			$params = $queryParams;
+			$params['action'] = 'history';
+
+			$logtext .= $this->message['pipe-separator'] .
+				Linker::linkKnown(
+					$block[0]->getTitle(),
+					$this->message['enhancedrc-history'],
+					array(),
+					$params
+				);
+		}
+
+		if ( $logtext !== '' ) {
+			$r .= $this->msg( 'parentheses' )->rawParams( $logtext )->escaped();
+		}
+
+		$r .= ' <span class="mw-changeslist-separator">. .</span> ';
+
+		# Character difference (does not apply if only log items)
+		if ( $wgRCShowChangedSize && !$allLogs ) {
+			$last = 0;
+			$first = count( $block ) - 1;
+			# Some events (like logs) have an "empty" size, so we need to skip those...
+			while ( $last < $first && $block[$last]->mAttribs['rc_new_len'] === null ) {
+				$last++;
+			}
+			while ( $first > $last && $block[$first]->mAttribs['rc_old_len'] === null ) {
+				$first--;
+			}
+			# Get net change
+			$chardiff = $this->formatCharacterDifference( $block[$first], $block[$last] );
+
+			if ( $chardiff == '' ) {
+				$r .= ' ';
+			} else {
+				$r .= ' ' . $chardiff . ' <span class="mw-changeslist-separator">. .</span> ';
+			}
+		}
+
+		$r .= $users;
+		$r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
+
+		# Sub-entries
+		foreach ( $block as $rcObj ) {
+			# Classes to apply -- TODO implement
+			$classes = array();
+			$type = $rcObj->mAttribs['rc_type'];
+
+			$trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
+				? ' class="mw-enhanced-watched"' : '';
+
+			$r .= '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
+			$r .= $this->recentChangesFlags( array(
+				'newpage' => $type == RC_NEW,
+				'minor' => $rcObj->mAttribs['rc_minor'],
+				'unpatrolled' => $rcObj->unpatrolled,
+				'bot' => $rcObj->mAttribs['rc_bot'],
+			) );
+			$r .= '&#160;</td><td class="mw-enhanced-rc-nested"><span class="mw-enhanced-rc-time">';
+
+			$params = $queryParams;
+
+			if ( $rcObj->mAttribs['rc_this_oldid'] != 0 ) {
+				$params['oldid'] = $rcObj->mAttribs['rc_this_oldid'];
+			}
+
+			# Log timestamp
+			if ( $type == RC_LOG ) {
+				$link = $rcObj->timestamp;
+			# Revision link
+			} elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
+				$link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
+			} else {
+
+				$link = Linker::linkKnown(
+						$rcObj->getTitle(),
+						$rcObj->timestamp,
+						array(),
+						$params
+					);
+				if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
+					$link = '<span class="history-deleted">' . $link . '</span> ';
+				}
+			}
+			$r .= $link . '</span>';
+
+			if ( !$type == RC_LOG || $type == RC_NEW ) {
+				$r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->curlink . $this->message['pipe-separator'] . $rcObj->lastlink )->escaped();
+			}
+			$r .= ' <span class="mw-changeslist-separator">. .</span> ';
+
+			# Character diff
+			if ( $wgRCShowChangedSize ) {
+				$cd = $this->formatCharacterDifference( $rcObj );
+				if ( $cd !== '' ) {
+					$r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
+				}
+			}
+
+			if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
+				$r .= $this->insertLogEntry( $rcObj );
+			} else {
+				# User links
+				$r .= $rcObj->userlink;
+				$r .= $rcObj->usertalklink;
+				$r .= $this->insertComment( $rcObj );
+			}
+
+			# Rollback
+			$this->insertRollback( $r, $rcObj );
+			# Tags
+			$this->insertTags( $r, $rcObj, $classes );
+
+			$r .= "</td></tr>\n";
+		}
+		$r .= "</table>\n";
+
+		$this->rcCacheIndex++;
+
+		wfProfileOut( __METHOD__ );
+
+		return $r;
+	}
+
+	/**
+	 * Generate HTML for an arrow or placeholder graphic
+	 * @param string $dir one of '', 'd', 'l', 'r'
+	 * @param string $alt text
+	 * @param string $title text
+	 * @return String: HTML "<img>" tag
+	 */
+	protected function arrow( $dir, $alt = '', $title = '' ) {
+		global $wgStylePath;
+		$encUrl = htmlspecialchars( $wgStylePath . '/common/images/Arr_' . $dir . '.png' );
+		$encAlt = htmlspecialchars( $alt );
+		$encTitle = htmlspecialchars( $title );
+		return "<img src=\"$encUrl\" width=\"12\" height=\"12\" alt=\"$encAlt\" title=\"$encTitle\" />";
+	}
+
+	/**
+	 * Generate HTML for a right- or left-facing arrow,
+	 * depending on language direction.
+	 * @return String: HTML "<img>" tag
+	 */
+	protected function sideArrow() {
+		$dir = $this->getLanguage()->isRTL() ? 'l' : 'r';
+		return $this->arrow( $dir, '+', $this->msg( 'rc-enhanced-expand' )->text() );
+	}
+
+	/**
+	 * Generate HTML for a down-facing arrow
+	 * depending on language direction.
+	 * @return String: HTML "<img>" tag
+	 */
+	protected function downArrow() {
+		return $this->arrow( 'd', '-', $this->msg( 'rc-enhanced-hide' )->text() );
+	}
+
+	/**
+	 * Generate HTML for a spacer image
+	 * @return String: HTML "<img>" tag
+	 */
+	protected function spacerArrow() {
+		return $this->arrow( '', codepointToUtf8( 0xa0 ) ); // non-breaking space
+	}
+
+	/**
+	 * Enhanced RC ungrouped line.
+	 *
+	 * @param $rcObj RecentChange
+	 * @return String: a HTML formatted line (generated using $r)
+	 */
+	protected function recentChangesBlockLine( $rcObj ) {
+		global $wgRCShowChangedSize;
+
+		wfProfileIn( __METHOD__ );
+		$query['curid'] = $rcObj->mAttribs['rc_cur_id'];
+
+		$type = $rcObj->mAttribs['rc_type'];
+		$logType = $rcObj->mAttribs['rc_log_type'];
+		$classes = array( 'mw-enhanced-rc' );
+		if ( $logType ) {
+			# Log entry
+			$classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
+					. $logType . '-' . $rcObj->mAttribs['rc_title'] );
+		} else {
+			$classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' .
+					$rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
+		}
+		$classes[] = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
+			? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
+		$r = Html::openElement( 'table', array( 'class' => $classes ) ) .
+			Html::openElement( 'tr' );
+
+		$r .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow-space"></span>';
+		# Flag and Timestamp
+		if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+			$r .= $this->recentChangesFlags( array() ); // no flags, but need the placeholders
+		} else {
+			$r .= $this->recentChangesFlags( array(
+				'newpage' => $type == RC_NEW,
+				'minor' => $rcObj->mAttribs['rc_minor'],
+				'unpatrolled' => $rcObj->unpatrolled,
+				'bot' => $rcObj->mAttribs['rc_bot'],
+			) );
+		}
+		$r .= '&#160;' . $rcObj->timestamp . '&#160;</td><td>';
+		# Article or log link
+		if ( $logType ) {
+			$logPage = new LogPage( $logType );
+			$logTitle = SpecialPage::getTitleFor( 'Log', $logType );
+			$logName = $logPage->getName()->escaped();
+			$r .= $this->msg( 'parentheses' )->rawParams( Linker::linkKnown( $logTitle, $logName ) )->escaped();
+		} else {
+			$this->insertArticleLink( $r, $rcObj, $rcObj->unpatrolled, $rcObj->watched );
+		}
+		# Diff and hist links
+		if ( $type != RC_LOG ) {
+			$query['action'] = 'history';
+			$r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
+				$rcObj->getTitle(),
+				$this->message['hist'],
+				array(),
+				$query
+			) )->escaped();
+		}
+		$r .= ' <span class="mw-changeslist-separator">. .</span> ';
+		# Character diff
+		if ( $wgRCShowChangedSize ) {
+			$cd = $this->formatCharacterDifference( $rcObj );
+			if ( $cd !== '' ) {
+				$r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
+			}
+		}
+
+		if ( $type == RC_LOG ) {
+			$r .= $this->insertLogEntry( $rcObj );
+		} else {
+			$r .= ' ' . $rcObj->userlink . $rcObj->usertalklink;
+			$r .= $this->insertComment( $rcObj );
+			$this->insertRollback( $r, $rcObj );
+		}
+
+		# Tags
+		$this->insertTags( $r, $rcObj, $classes );
+		# Show how many people are watching this if enabled
+		$r .= $this->numberofWatchingusers( $rcObj->numberofWatchingusers );
+
+		$r .= "</td></tr></table>\n";
+
+		wfProfileOut( __METHOD__ );
+
+		return $r;
+	}
+
+	/**
+	 * If enhanced RC is in use, this function takes the previously cached
+	 * RC lines, arranges them, and outputs the HTML
+	 *
+	 * @return string
+	 */
+	protected function recentChangesBlock() {
+		if ( count ( $this->rc_cache ) == 0 ) {
+			return '';
+		}
+
+		wfProfileIn( __METHOD__ );
+
+		$blockOut = '';
+		foreach ( $this->rc_cache as $block ) {
+			if ( count( $block ) < 2 ) {
+				$blockOut .= $this->recentChangesBlockLine( array_shift( $block ) );
+			} else {
+				$blockOut .= $this->recentChangesBlockGroup( $block );
+			}
+		}
+
+		wfProfileOut( __METHOD__ );
+
+		return '<div>' . $blockOut . '</div>';
+	}
+
+	/**
+	 * Returns text for the end of RC
+	 * If enhanced RC is in use, returns pretty much all the text
+	 * @return string
+	 */
+	public function endRecentChangesList() {
+		return $this->recentChangesBlock() . parent::endRecentChangesList();
+	}
+
+}
diff --git a/includes/changes/OldChangesList.php b/includes/changes/OldChangesList.php
new file mode 100644
index 00000000..a7fe9342
--- /dev/null
+++ b/includes/changes/OldChangesList.php
@@ -0,0 +1,130 @@
+<?php
+/**
+ * Generate a list of changes using the good old system (no javascript).
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+class OldChangesList extends ChangesList {
+
+	/**
+	 * Format a line using the old system (aka without any javascript).
+	 *
+	 * @param $rc RecentChange, passed by reference
+	 * @param bool $watched (default false)
+	 * @param int $linenumber (default null)
+	 *
+	 * @return string|bool
+	 */
+	public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
+		global $wgRCShowChangedSize;
+		wfProfileIn( __METHOD__ );
+
+		# Should patrol-related stuff be shown?
+		$unpatrolled = $this->showAsUnpatrolled( $rc );
+
+		$dateheader = ''; // $s now contains only <li>...</li>, for hooks' convenience.
+		$this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
+
+		$s = '';
+		$classes = array();
+		// use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
+		if ( $linenumber ) {
+			if ( $linenumber & 1 ) {
+				$classes[] = 'mw-line-odd';
+			} else {
+				$classes[] = 'mw-line-even';
+			}
+		}
+
+		// Indicate watched status on the line to allow for more
+		// comprehensive styling.
+		$classes[] = $watched && $rc->mAttribs['rc_timestamp'] >= $watched
+			? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
+
+		// Moved pages (very very old, not supported anymore)
+		if ( $rc->mAttribs['rc_type'] == RC_MOVE || $rc->mAttribs['rc_type'] == RC_MOVE_OVER_REDIRECT ) {
+		// Log entries
+		} elseif ( $rc->mAttribs['rc_log_type'] ) {
+			$logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] );
+			$this->insertLog( $s, $logtitle, $rc->mAttribs['rc_log_type'] );
+		// Log entries (old format) or log targets, and special pages
+		} elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
+			list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
+			if ( $name == 'Log' ) {
+				$this->insertLog( $s, $rc->getTitle(), $subpage );
+			}
+		// Regular entries
+		} else {
+			$this->insertDiffHist( $s, $rc, $unpatrolled );
+			# M, N, b and ! (minor, new, bot and unpatrolled)
+			$s .= $this->recentChangesFlags(
+				array(
+					'newpage' => $rc->mAttribs['rc_type'] == RC_NEW,
+					'minor' => $rc->mAttribs['rc_minor'],
+					'unpatrolled' => $unpatrolled,
+					'bot' => $rc->mAttribs['rc_bot']
+				),
+				''
+			);
+			$this->insertArticleLink( $s, $rc, $unpatrolled, $watched );
+		}
+		# Edit/log timestamp
+		$this->insertTimestamp( $s, $rc );
+		# Bytes added or removed
+		if ( $wgRCShowChangedSize ) {
+			$cd = $this->formatCharacterDifference( $rc );
+			if ( $cd !== '' ) {
+				$s .= $cd . '  <span class="mw-changeslist-separator">. .</span> ';
+			}
+		}
+
+		if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
+			$s .= $this->insertLogEntry( $rc );
+		} else {
+			# User tool links
+			$this->insertUserRelatedLinks( $s, $rc );
+			# LTR/RTL direction mark
+			$s .= $this->getLanguage()->getDirMark();
+			$s .= $this->insertComment( $rc );
+		}
+
+		# Tags
+		$this->insertTags( $s, $rc, $classes );
+		# Rollback
+		$this->insertRollback( $s, $rc );
+		# For subclasses
+		$this->insertExtra( $s, $rc, $classes );
+
+		# How many users watch this page
+		if ( $rc->numberofWatchingusers > 0 ) {
+			$s .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers );
+		}
+
+		if ( $this->watchlist ) {
+			$classes[] = Sanitizer::escapeClass( 'watchlist-' . $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
+		}
+
+		if ( !wfRunHooks( 'OldChangesListRecentChangesLine', array( &$this, &$s, $rc, &$classes ) ) ) {
+			wfProfileOut( __METHOD__ );
+			return false;
+		}
+
+		wfProfileOut( __METHOD__ );
+		return "$dateheader<li class=\"" . implode( ' ', $classes ) . "\">" . $s . "</li>\n";
+	}
+}
diff --git a/includes/changes/RCCacheEntry.php b/includes/changes/RCCacheEntry.php
new file mode 100644
index 00000000..9aef3d30
--- /dev/null
+++ b/includes/changes/RCCacheEntry.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+class RCCacheEntry extends RecentChange {
+	var $secureName, $link;
+	var $curlink, $difflink, $lastlink, $usertalklink, $versionlink;
+	var $userlink, $timestamp, $watched;
+
+	/**
+	 * @param $rc RecentChange
+	 * @return RCCacheEntry
+	 */
+	static function newFromParent( $rc ) {
+		$rc2 = new RCCacheEntry;
+		$rc2->mAttribs = $rc->mAttribs;
+		$rc2->mExtra = $rc->mExtra;
+		return $rc2;
+	}
+}
diff --git a/includes/changes/RecentChange.php b/includes/changes/RecentChange.php
new file mode 100644
index 00000000..980bd0a0
--- /dev/null
+++ b/includes/changes/RecentChange.php
@@ -0,0 +1,846 @@
+<?php
+/**
+ * Utility class for creating and accessing recent change entries.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Utility class for creating new RC entries
+ *
+ * mAttribs:
+ *  rc_id           id of the row in the recentchanges table
+ *  rc_timestamp    time the entry was made
+ *  rc_cur_time     timestamp on the cur row
+ *  rc_namespace    namespace #
+ *  rc_title        non-prefixed db key
+ *  rc_type         is new entry, used to determine whether updating is necessary
+ *  rc_minor        is minor
+ *  rc_cur_id       page_id of associated page entry
+ *  rc_user         user id who made the entry
+ *  rc_user_text    user name who made the entry
+ *  rc_comment      edit summary
+ *  rc_this_oldid   rev_id associated with this entry (or zero)
+ *  rc_last_oldid   rev_id associated with the entry before this one (or zero)
+ *  rc_bot          is bot, hidden
+ *  rc_ip           IP address of the user in dotted quad notation
+ *  rc_new          obsolete, use rc_type==RC_NEW
+ *  rc_patrolled    boolean whether or not someone has marked this edit as patrolled
+ *  rc_old_len      integer byte length of the text before the edit
+ *  rc_new_len      the same after the edit
+ *  rc_deleted      partial deletion
+ *  rc_logid        the log_id value for this log entry (or zero)
+ *  rc_log_type     the log type (or null)
+ *  rc_log_action   the log action (or null)
+ *  rc_params       log params
+ *
+ * mExtra:
+ *  prefixedDBkey   prefixed db key, used by external app via msg queue
+ *  lastTimestamp   timestamp of previous entry, used in WHERE clause during update
+ *  lang            the interwiki prefix, automatically set in save()
+ *  oldSize         text size before the change
+ *  newSize         text size after the change
+ *  pageStatus      status of the page: created, deleted, moved, restored, changed
+ *
+ * temporary:       not stored in the database
+ *      notificationtimestamp
+ *      numberofWatchingusers
+ *
+ * @todo document functions and variables
+ */
+class RecentChange {
+	var $mAttribs = array(), $mExtra = array();
+
+	/**
+	 * @var Title
+	 */
+	var $mTitle = false;
+
+	/**
+	 * @var User
+	 */
+	private $mPerformer = false;
+
+	/**
+	 * @var Title
+	 */
+	var $mMovedToTitle = false;
+	var $numberofWatchingusers = 0; # Dummy to prevent error message in SpecialRecentchangeslinked
+	var $notificationtimestamp;
+
+	# Factory methods
+
+	/**
+	 * @param $row
+	 * @return RecentChange
+	 */
+	public static function newFromRow( $row ) {
+		$rc = new RecentChange;
+		$rc->loadFromRow( $row );
+		return $rc;
+	}
+
+	/**
+	 * @deprecated in 1.22
+	 * @param $row
+	 * @return RecentChange
+	 */
+	public static function newFromCurRow( $row ) {
+		wfDeprecated( __METHOD__, '1.22' );
+		$rc = new RecentChange;
+		$rc->loadFromCurRow( $row );
+		$rc->notificationtimestamp = false;
+		$rc->numberofWatchingusers = false;
+		return $rc;
+	}
+
+	/**
+	 * Obtain the recent change with a given rc_id value
+	 *
+	 * @param int $rcid rc_id value to retrieve
+	 * @return RecentChange
+	 */
+	public static function newFromId( $rcid ) {
+		return self::newFromConds( array( 'rc_id' => $rcid ), __METHOD__ );
+	}
+
+	/**
+	 * Find the first recent change matching some specific conditions
+	 *
+	 * @param array $conds of conditions
+	 * @param $fname Mixed: override the method name in profiling/logs
+	 * @param $options Array Query options
+	 * @return RecentChange
+	 */
+	public static function newFromConds( $conds, $fname = __METHOD__, $options = array() ) {
+		$dbr = wfGetDB( DB_SLAVE );
+		$row = $dbr->selectRow( 'recentchanges', self::selectFields(), $conds, $fname, $options );
+		if ( $row !== false ) {
+			return self::newFromRow( $row );
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Return the list of recentchanges fields that should be selected to create
+	 * a new recentchanges object.
+	 * @return array
+	 */
+	public static function selectFields() {
+		return array(
+			'rc_id',
+			'rc_timestamp',
+			'rc_cur_time',
+			'rc_user',
+			'rc_user_text',
+			'rc_namespace',
+			'rc_title',
+			'rc_comment',
+			'rc_minor',
+			'rc_bot',
+			'rc_new',
+			'rc_cur_id',
+			'rc_this_oldid',
+			'rc_last_oldid',
+			'rc_type',
+			'rc_patrolled',
+			'rc_ip',
+			'rc_old_len',
+			'rc_new_len',
+			'rc_deleted',
+			'rc_logid',
+			'rc_log_type',
+			'rc_log_action',
+			'rc_params',
+		);
+	}
+
+	# Accessors
+
+	/**
+	 * @param $attribs array
+	 */
+	public function setAttribs( $attribs ) {
+		$this->mAttribs = $attribs;
+	}
+
+	/**
+	 * @param $extra array
+	 */
+	public function setExtra( $extra ) {
+		$this->mExtra = $extra;
+	}
+
+	/**
+	 *
+	 * @return Title
+	 */
+	public function &getTitle() {
+		if ( $this->mTitle === false ) {
+			$this->mTitle = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] );
+		}
+		return $this->mTitle;
+	}
+
+	/**
+	 * Get the User object of the person who performed this change.
+	 *
+	 * @return User
+	 */
+	public function getPerformer() {
+		if ( $this->mPerformer === false ) {
+			if ( $this->mAttribs['rc_user'] ) {
+				$this->mPerformer = User::newFromID( $this->mAttribs['rc_user'] );
+			} else {
+				$this->mPerformer = User::newFromName( $this->mAttribs['rc_user_text'], false );
+			}
+		}
+		return $this->mPerformer;
+	}
+
+	/**
+	 * Writes the data in this object to the database
+	 * @param $noudp bool
+	 */
+	public function save( $noudp = false ) {
+		global $wgLocalInterwiki, $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker, $wgContLang;
+
+		$dbw = wfGetDB( DB_MASTER );
+		if ( !is_array( $this->mExtra ) ) {
+			$this->mExtra = array();
+		}
+		$this->mExtra['lang'] = $wgLocalInterwiki;
+
+		if ( !$wgPutIPinRC ) {
+			$this->mAttribs['rc_ip'] = '';
+		}
+
+		# If our database is strict about IP addresses, use NULL instead of an empty string
+		if ( $dbw->strictIPs() and $this->mAttribs['rc_ip'] == '' ) {
+			unset( $this->mAttribs['rc_ip'] );
+		}
+
+		# Trim spaces on user supplied text
+		$this->mAttribs['rc_comment'] = trim( $this->mAttribs['rc_comment'] );
+
+		# Make sure summary is truncated (whole multibyte characters)
+		$this->mAttribs['rc_comment'] = $wgContLang->truncate( $this->mAttribs['rc_comment'], 255 );
+
+		# Fixup database timestamps
+		$this->mAttribs['rc_timestamp'] = $dbw->timestamp( $this->mAttribs['rc_timestamp'] );
+		$this->mAttribs['rc_cur_time'] = $dbw->timestamp( $this->mAttribs['rc_cur_time'] );
+		$this->mAttribs['rc_id'] = $dbw->nextSequenceValue( 'recentchanges_rc_id_seq' );
+
+		## If we are using foreign keys, an entry of 0 for the page_id will fail, so use NULL
+		if ( $dbw->cascadingDeletes() and $this->mAttribs['rc_cur_id'] == 0 ) {
+			unset( $this->mAttribs['rc_cur_id'] );
+		}
+
+		# Insert new row
+		$dbw->insert( 'recentchanges', $this->mAttribs, __METHOD__ );
+
+		# Set the ID
+		$this->mAttribs['rc_id'] = $dbw->insertId();
+
+		# Notify extensions
+		wfRunHooks( 'RecentChange_save', array( &$this ) );
+
+		# Notify external application via UDP
+		if ( !$noudp ) {
+			$this->notifyRCFeeds();
+		}
+
+		# E-mail notifications
+		if ( $wgUseEnotif || $wgShowUpdatedMarker ) {
+			$editor = $this->getPerformer();
+			$title = $this->getTitle();
+
+			if ( wfRunHooks( 'AbortEmailNotification', array( $editor, $title ) ) ) {
+				# @todo FIXME: This would be better as an extension hook
+				$enotif = new EmailNotification();
+				$enotif->notifyOnPageChange( $editor, $title,
+					$this->mAttribs['rc_timestamp'],
+					$this->mAttribs['rc_comment'],
+					$this->mAttribs['rc_minor'],
+					$this->mAttribs['rc_last_oldid'],
+					$this->mExtra['pageStatus'] );
+			}
+		}
+	}
+
+	/**
+	 * @deprecated since 1.22, use notifyRCFeeds instead.
+	 */
+	public function notifyRC2UDP() {
+		wfDeprecated( __METHOD__, '1.22' );
+		$this->notifyRCFeeds();
+	}
+
+	/**
+	 * Send some text to UDP.
+	 * @deprecated since 1.22
+	 */
+	public static function sendToUDP( $line, $address = '', $prefix = '', $port = '' ) {
+		global $wgRC2UDPAddress, $wgRC2UDPInterwikiPrefix, $wgRC2UDPPort, $wgRC2UDPPrefix;
+
+		wfDeprecated( __METHOD__, '1.22' );
+
+		# Assume default for standard RC case
+		$address = $address ? $address : $wgRC2UDPAddress;
+		$prefix = $prefix ? $prefix : $wgRC2UDPPrefix;
+		$port = $port ? $port : $wgRC2UDPPort;
+
+		$engine = new UDPRCFeedEngine();
+		$feed = array(
+			'uri' => "udp://$address:$port/$prefix",
+			'formatter' => 'IRCColourfulRCFeedFormatter',
+			'add_interwiki_prefix' => $wgRC2UDPInterwikiPrefix,
+		);
+
+		return $engine->send( $feed, $line );
+	}
+
+	/**
+	 * Notify all the feeds about the change.
+	 */
+	public function notifyRCFeeds() {
+		global $wgRCFeeds;
+
+		foreach ( $wgRCFeeds as $feed ) {
+			$engine = self::getEngine( $feed['uri'] );
+
+			if ( isset( $this->mExtra['actionCommentIRC'] ) ) {
+				$actionComment = $this->mExtra['actionCommentIRC'];
+			} else {
+				$actionComment = null;
+			}
+
+			$omitBots = isset( $feed['omit_bots'] ) ? $feed['omit_bots'] : false;
+
+			if (
+				( $omitBots && $this->mAttribs['rc_bot'] ) ||
+				$this->mAttribs['rc_type'] == RC_EXTERNAL
+			) {
+				continue;
+			}
+
+			$formatter = new $feed['formatter']();
+			$line = $formatter->getLine( $feed, $this, $actionComment );
+
+			$engine->send( $feed, $line );
+		}
+	}
+
+	/**
+	 * Gets the stream engine object for a given URI from $wgRCEngines
+	 *
+	 * @param $uri string URI to get the engine object for
+	 * @return object The engine object
+	 */
+	private static function getEngine( $uri ) {
+		global $wgRCEngines;
+
+		$scheme = parse_url( $uri, PHP_URL_SCHEME );
+		if ( !$scheme ) {
+			throw new MWException( __FUNCTION__ . ": Invalid stream logger URI: '$uri'" );
+		}
+
+		if ( !isset( $wgRCEngines[$scheme] ) ) {
+			throw new MWException( __FUNCTION__ . ": Unknown stream logger URI scheme: $scheme" );
+		}
+
+		return new $wgRCEngines[$scheme];
+	}
+
+	/**
+	 * @deprecated since 1.22, moved to IRCColourfulRCFeedFormatter
+	 */
+	public static function cleanupForIRC( $text ) {
+		wfDeprecated( __METHOD__, '1.22' );
+		return IRCColourfulRCFeedFormatter::cleanupForIRC( $text );
+	}
+
+	/**
+	 * Mark a given change as patrolled
+	 *
+	 * @param $change Mixed: RecentChange or corresponding rc_id
+	 * @param $auto Boolean: for automatic patrol
+	 * @return Array See doMarkPatrolled(), or null if $change is not an existing rc_id
+	 */
+	public static function markPatrolled( $change, $auto = false ) {
+		global $wgUser;
+
+		$change = $change instanceof RecentChange
+			? $change
+			: RecentChange::newFromId( $change );
+
+		if ( !$change instanceof RecentChange ) {
+			return null;
+		}
+		return $change->doMarkPatrolled( $wgUser, $auto );
+	}
+
+	/**
+	 * Mark this RecentChange as patrolled
+	 *
+	 * NOTE: Can also return 'rcpatroldisabled', 'hookaborted' and 'markedaspatrollederror-noautopatrol' as errors
+	 * @param $user User object doing the action
+	 * @param $auto Boolean: for automatic patrol
+	 * @return array of permissions errors, see Title::getUserPermissionsErrors()
+	 */
+	public function doMarkPatrolled( User $user, $auto = false ) {
+		global $wgUseRCPatrol, $wgUseNPPatrol;
+		$errors = array();
+		// If recentchanges patrol is disabled, only new pages
+		// can be patrolled
+		if ( !$wgUseRCPatrol && ( !$wgUseNPPatrol || $this->getAttribute( 'rc_type' ) != RC_NEW ) ) {
+			$errors[] = array( 'rcpatroldisabled' );
+		}
+		// Automatic patrol needs "autopatrol", ordinary patrol needs "patrol"
+		$right = $auto ? 'autopatrol' : 'patrol';
+		$errors = array_merge( $errors, $this->getTitle()->getUserPermissionsErrors( $right, $user ) );
+		if ( !wfRunHooks( 'MarkPatrolled', array( $this->getAttribute( 'rc_id' ), &$user, false ) ) ) {
+			$errors[] = array( 'hookaborted' );
+		}
+		// Users without the 'autopatrol' right can't patrol their
+		// own revisions
+		if ( $user->getName() == $this->getAttribute( 'rc_user_text' ) && !$user->isAllowed( 'autopatrol' ) ) {
+			$errors[] = array( 'markedaspatrollederror-noautopatrol' );
+		}
+		if ( $errors ) {
+			return $errors;
+		}
+		// If the change was patrolled already, do nothing
+		if ( $this->getAttribute( 'rc_patrolled' ) ) {
+			return array();
+		}
+		// Actually set the 'patrolled' flag in RC
+		$this->reallyMarkPatrolled();
+		// Log this patrol event
+		PatrolLog::record( $this, $auto, $user );
+		wfRunHooks( 'MarkPatrolledComplete', array( $this->getAttribute( 'rc_id' ), &$user, false ) );
+		return array();
+	}
+
+	/**
+	 * Mark this RecentChange patrolled, without error checking
+	 * @return Integer: number of affected rows
+	 */
+	public function reallyMarkPatrolled() {
+		$dbw = wfGetDB( DB_MASTER );
+		$dbw->update(
+			'recentchanges',
+			array(
+				'rc_patrolled' => 1
+			),
+			array(
+				'rc_id' => $this->getAttribute( 'rc_id' )
+			),
+			__METHOD__
+		);
+		// Invalidate the page cache after the page has been patrolled
+		// to make sure that the Patrol link isn't visible any longer!
+		$this->getTitle()->invalidateCache();
+		return $dbw->affectedRows();
+	}
+
+	/**
+	 * Makes an entry in the database corresponding to an edit
+	 *
+	 * @param $timestamp
+	 * @param $title Title
+	 * @param $minor
+	 * @param $user User
+	 * @param $comment
+	 * @param $oldId
+	 * @param $lastTimestamp
+	 * @param $bot
+	 * @param $ip string
+	 * @param $oldSize int
+	 * @param $newSize int
+	 * @param $newId int
+	 * @param $patrol int
+	 * @return RecentChange
+	 */
+	public static function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, $oldId,
+		$lastTimestamp, $bot, $ip = '', $oldSize = 0, $newSize = 0, $newId = 0, $patrol = 0 ) {
+		$rc = new RecentChange;
+		$rc->mTitle = $title;
+		$rc->mPerformer = $user;
+		$rc->mAttribs = array(
+			'rc_timestamp'  => $timestamp,
+			'rc_cur_time'   => $timestamp,
+			'rc_namespace'  => $title->getNamespace(),
+			'rc_title'      => $title->getDBkey(),
+			'rc_type'       => RC_EDIT,
+			'rc_minor'      => $minor ? 1 : 0,
+			'rc_cur_id'     => $title->getArticleID(),
+			'rc_user'       => $user->getId(),
+			'rc_user_text'  => $user->getName(),
+			'rc_comment'    => $comment,
+			'rc_this_oldid' => $newId,
+			'rc_last_oldid' => $oldId,
+			'rc_bot'        => $bot ? 1 : 0,
+			'rc_ip'         => self::checkIPAddress( $ip ),
+			'rc_patrolled'  => intval( $patrol ),
+			'rc_new'        => 0,  # obsolete
+			'rc_old_len'    => $oldSize,
+			'rc_new_len'    => $newSize,
+			'rc_deleted'    => 0,
+			'rc_logid'      => 0,
+			'rc_log_type'   => null,
+			'rc_log_action' => '',
+			'rc_params'     => ''
+		);
+
+		$rc->mExtra = array(
+			'prefixedDBkey' => $title->getPrefixedDBkey(),
+			'lastTimestamp' => $lastTimestamp,
+			'oldSize'       => $oldSize,
+			'newSize'       => $newSize,
+			'pageStatus'   => 'changed'
+		);
+		$rc->save();
+		return $rc;
+	}
+
+	/**
+	 * Makes an entry in the database corresponding to page creation
+	 * Note: the title object must be loaded with the new id using resetArticleID()
+	 * @todo Document parameters and return
+	 *
+	 * @param $timestamp
+	 * @param $title Title
+	 * @param $minor
+	 * @param $user User
+	 * @param $comment
+	 * @param $bot
+	 * @param $ip string
+	 * @param $size int
+	 * @param $newId int
+	 * @param $patrol int
+	 * @return RecentChange
+	 */
+	public static function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot,
+		$ip = '', $size = 0, $newId = 0, $patrol = 0 ) {
+		$rc = new RecentChange;
+		$rc->mTitle = $title;
+		$rc->mPerformer = $user;
+		$rc->mAttribs = array(
+			'rc_timestamp'      => $timestamp,
+			'rc_cur_time'       => $timestamp,
+			'rc_namespace'      => $title->getNamespace(),
+			'rc_title'          => $title->getDBkey(),
+			'rc_type'           => RC_NEW,
+			'rc_minor'          => $minor ? 1 : 0,
+			'rc_cur_id'         => $title->getArticleID(),
+			'rc_user'           => $user->getId(),
+			'rc_user_text'      => $user->getName(),
+			'rc_comment'        => $comment,
+			'rc_this_oldid'     => $newId,
+			'rc_last_oldid'     => 0,
+			'rc_bot'            => $bot ? 1 : 0,
+			'rc_ip'             => self::checkIPAddress( $ip ),
+			'rc_patrolled'      => intval( $patrol ),
+			'rc_new'            => 1, # obsolete
+			'rc_old_len'        => 0,
+			'rc_new_len'        => $size,
+			'rc_deleted'        => 0,
+			'rc_logid'          => 0,
+			'rc_log_type'       => null,
+			'rc_log_action'     => '',
+			'rc_params'         => ''
+		);
+
+		$rc->mExtra = array(
+			'prefixedDBkey' => $title->getPrefixedDBkey(),
+			'lastTimestamp' => 0,
+			'oldSize' => 0,
+			'newSize' => $size,
+			'pageStatus' => 'created'
+		);
+		$rc->save();
+		return $rc;
+	}
+
+	/**
+	 * @param $timestamp
+	 * @param $title
+	 * @param $user
+	 * @param $actionComment
+	 * @param $ip string
+	 * @param $type
+	 * @param $action
+	 * @param $target
+	 * @param $logComment
+	 * @param $params
+	 * @param $newId int
+	 * @param $actionCommentIRC string
+	 * @return bool
+	 */
+	public static function notifyLog( $timestamp, &$title, &$user, $actionComment, $ip, $type,
+		$action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' )
+	{
+		global $wgLogRestrictions;
+		# Don't add private logs to RC!
+		if ( isset( $wgLogRestrictions[$type] ) && $wgLogRestrictions[$type] != '*' ) {
+			return false;
+		}
+		$rc = self::newLogEntry( $timestamp, $title, $user, $actionComment, $ip, $type, $action,
+			$target, $logComment, $params, $newId, $actionCommentIRC );
+		$rc->save();
+		return true;
+	}
+
+	/**
+	 * @param $timestamp
+	 * @param $title Title
+	 * @param $user User
+	 * @param $actionComment
+	 * @param $ip string
+	 * @param $type
+	 * @param $action
+	 * @param $target Title
+	 * @param $logComment
+	 * @param $params
+	 * @param $newId int
+	 * @param $actionCommentIRC string
+	 * @return RecentChange
+	 */
+	public static function newLogEntry( $timestamp, &$title, &$user, $actionComment, $ip,
+		$type, $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' ) {
+		global $wgRequest;
+
+		## Get pageStatus for email notification
+		switch ( $type . '-' . $action ) {
+			case 'delete-delete':
+				$pageStatus = 'deleted';
+				break;
+			case 'move-move':
+			case 'move-move_redir':
+				$pageStatus = 'moved';
+				break;
+			case 'delete-restore':
+				$pageStatus = 'restored';
+				break;
+			case 'upload-upload':
+				$pageStatus = 'created';
+				break;
+			case 'upload-overwrite':
+			default:
+				$pageStatus = 'changed';
+				break;
+		}
+
+		$rc = new RecentChange;
+		$rc->mTitle = $target;
+		$rc->mPerformer = $user;
+		$rc->mAttribs = array(
+			'rc_timestamp'  => $timestamp,
+			'rc_cur_time'   => $timestamp,
+			'rc_namespace'  => $target->getNamespace(),
+			'rc_title'      => $target->getDBkey(),
+			'rc_type'       => RC_LOG,
+			'rc_minor'      => 0,
+			'rc_cur_id'     => $target->getArticleID(),
+			'rc_user'       => $user->getId(),
+			'rc_user_text'  => $user->getName(),
+			'rc_comment'    => $logComment,
+			'rc_this_oldid' => 0,
+			'rc_last_oldid' => 0,
+			'rc_bot'        => $user->isAllowed( 'bot' ) ? $wgRequest->getBool( 'bot', true ) : 0,
+			'rc_ip'         => self::checkIPAddress( $ip ),
+			'rc_patrolled'  => 1,
+			'rc_new'        => 0, # obsolete
+			'rc_old_len'    => null,
+			'rc_new_len'    => null,
+			'rc_deleted'    => 0,
+			'rc_logid'      => $newId,
+			'rc_log_type'   => $type,
+			'rc_log_action' => $action,
+			'rc_params'     => $params
+		);
+
+		$rc->mExtra = array(
+			'prefixedDBkey' => $title->getPrefixedDBkey(),
+			'lastTimestamp' => 0,
+			'actionComment' => $actionComment, // the comment appended to the action, passed from LogPage
+			'pageStatus'    => $pageStatus,
+			'actionCommentIRC' => $actionCommentIRC
+		);
+		return $rc;
+	}
+
+	/**
+	 * Initialises the members of this object from a mysql row object
+	 *
+	 * @param $row
+	 */
+	public function loadFromRow( $row ) {
+		$this->mAttribs = get_object_vars( $row );
+		$this->mAttribs['rc_timestamp'] = wfTimestamp( TS_MW, $this->mAttribs['rc_timestamp'] );
+		$this->mAttribs['rc_deleted'] = $row->rc_deleted; // MUST be set
+	}
+
+	/**
+	 * Makes a pseudo-RC entry from a cur row
+	 *
+	 * @deprected in 1.22
+	 * @param $row
+	 */
+	public function loadFromCurRow( $row ) {
+		wfDeprecated( __METHOD__, '1.22' );
+		$this->mAttribs = array(
+			'rc_timestamp' => wfTimestamp( TS_MW, $row->rev_timestamp ),
+			'rc_cur_time' => $row->rev_timestamp,
+			'rc_user' => $row->rev_user,
+			'rc_user_text' => $row->rev_user_text,
+			'rc_namespace' => $row->page_namespace,
+			'rc_title' => $row->page_title,
+			'rc_comment' => $row->rev_comment,
+			'rc_minor' => $row->rev_minor_edit ? 1 : 0,
+			'rc_type' => $row->page_is_new ? RC_NEW : RC_EDIT,
+			'rc_cur_id' => $row->page_id,
+			'rc_this_oldid' => $row->rev_id,
+			'rc_last_oldid' => isset( $row->rc_last_oldid ) ? $row->rc_last_oldid : 0,
+			'rc_bot' => 0,
+			'rc_ip' => '',
+			'rc_id' => $row->rc_id,
+			'rc_patrolled' => $row->rc_patrolled,
+			'rc_new' => $row->page_is_new, # obsolete
+			'rc_old_len' => $row->rc_old_len,
+			'rc_new_len' => $row->rc_new_len,
+			'rc_params' => isset( $row->rc_params ) ? $row->rc_params : '',
+			'rc_log_type' => isset( $row->rc_log_type ) ? $row->rc_log_type : null,
+			'rc_log_action' => isset( $row->rc_log_action ) ? $row->rc_log_action : null,
+			'rc_logid' => isset( $row->rc_logid ) ? $row->rc_logid : 0,
+			'rc_deleted' => $row->rc_deleted // MUST be set
+		);
+	}
+
+	/**
+	 * Get an attribute value
+	 *
+	 * @param string $name Attribute name
+	 * @return mixed
+	 */
+	public function getAttribute( $name ) {
+		return isset( $this->mAttribs[$name] ) ? $this->mAttribs[$name] : null;
+	}
+
+	/**
+	 * @return array
+	 */
+	public function getAttributes() {
+		return $this->mAttribs;
+	}
+
+	/**
+	 * Gets the end part of the diff URL associated with this object
+	 * Blank if no diff link should be displayed
+	 * @param $forceCur
+	 * @return string
+	 */
+	public function diffLinkTrail( $forceCur ) {
+		if ( $this->mAttribs['rc_type'] == RC_EDIT ) {
+			$trail = "curid=" . (int)( $this->mAttribs['rc_cur_id'] ) .
+				"&oldid=" . (int)( $this->mAttribs['rc_last_oldid'] );
+			if ( $forceCur ) {
+				$trail .= '&diff=0';
+			} else {
+				$trail .= '&diff=' . (int)( $this->mAttribs['rc_this_oldid'] );
+			}
+		} else {
+			$trail = '';
+		}
+		return $trail;
+	}
+
+	/**
+	 * Returns the change size (HTML).
+	 * The lengths can be given optionally.
+	 * @param $old int
+	 * @param $new int
+	 * @return string
+	 */
+	public function getCharacterDifference( $old = 0, $new = 0 ) {
+		if ( $old === 0 ) {
+			$old = $this->mAttribs['rc_old_len'];
+		}
+		if ( $new === 0 ) {
+			$new = $this->mAttribs['rc_new_len'];
+		}
+		if ( $old === null || $new === null ) {
+			return '';
+		}
+		return ChangesList::showCharacterDifference( $old, $new );
+	}
+
+	/**
+	 * Purge expired changes from the recentchanges table
+	 * @since 1.22
+	 */
+	public static function purgeExpiredChanges() {
+		if ( wfReadOnly() ) {
+			return;
+		}
+
+		$method = __METHOD__;
+		$dbw = wfGetDB( DB_MASTER );
+		$dbw->onTransactionIdle( function() use ( $dbw, $method ) {
+			global $wgRCMaxAge;
+
+			$cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
+			$dbw->delete(
+				'recentchanges',
+				array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ),
+				$method
+			);
+		} );
+	}
+
+	private static function checkIPAddress( $ip ) {
+		global $wgRequest;
+		if ( $ip ) {
+			if ( !IP::isIPAddress( $ip ) ) {
+				throw new MWException( "Attempt to write \"" . $ip . "\" as an IP address into recent changes" );
+			}
+		} else {
+			$ip = $wgRequest->getIP();
+			if ( !$ip ) {
+				$ip = '';
+			}
+		}
+		return $ip;
+	}
+
+	/**
+	 * Check whether the given timestamp is new enough to have a RC row with a given tolerance
+	 * as the recentchanges table might not be cleared out regularly (so older entries might exist)
+	 * or rows which will be deleted soon shouldn't be included.
+	 *
+	 * @param $timestamp mixed MWTimestamp compatible timestamp
+	 * @param $tolerance integer Tolerance in seconds
+	 * @return bool
+	 */
+	public static function isInRCLifespan( $timestamp, $tolerance = 0 ) {
+		global $wgRCMaxAge;
+		return wfTimestamp( TS_UNIX, $timestamp ) > time() - $tolerance - $wgRCMaxAge;
+	}
+}
diff --git a/includes/clientpool/RedisConnectionPool.php b/includes/clientpool/RedisConnectionPool.php
index 5c7c4f20..ef71b182 100644
--- a/includes/clientpool/RedisConnectionPool.php
+++ b/includes/clientpool/RedisConnectionPool.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * PhpRedis client connection pooling manager.
+ * Redis client connection pooling manager.
  *
  * 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
@@ -23,7 +23,7 @@
  */
 
 /**
- * Helper class to manage redis connections using PhpRedis.
+ * Helper class to manage Redis connections.
  *
  * This can be used to get handle wrappers that free the handle when the wrapper
  * leaves scope. The maximum number of free handles (connections) is configurable.
@@ -36,39 +36,43 @@
  * @since 1.21
  */
 class RedisConnectionPool {
-	// Settings for all connections in this pool
-	protected $connectTimeout; // string; connection timeout
-	protected $persistent; // bool; whether connections persist
-	protected $password; // string; plaintext auth password
-	protected $serializer; // integer; the serializer to use (Redis::SERIALIZER_*)
+	/**
+	 * @name Pool settings.
+	 * Settings there are shared for any connection made in this pool.
+	 * See the singleton() method documentation for more details.
+	 * @{
+	 */
+	/** @var string Connection timeout in seconds */
+	protected $connectTimeout;
+	/** @var string Plaintext auth password */
+	protected $password;
+	/** @var bool Whether connections persist */
+	protected $persistent;
+	/** @var integer Serializer to use (Redis::SERIALIZER_*) */
+	protected $serializer;
+	/** @} */
 
-	protected $idlePoolSize = 0; // integer; current idle pool size
+	/** @var integer Current idle pool size */
+	protected $idlePoolSize = 0;
 
 	/** @var Array (server name => ((connection info array),...) */
 	protected $connections = array();
 	/** @var Array (server name => UNIX timestamp) */
 	protected $downServers = array();
 
-	/** @var Array */
-	protected static $instances = array(); // (pool ID => RedisConnectionPool)
+	/** @var Array (pool ID => RedisConnectionPool) */
+	protected static $instances = array();
 
-	const SERVER_DOWN_TTL = 30; // integer; seconds to cache servers as "down"
+	/** integer; seconds to cache servers as "down". */
+	const SERVER_DOWN_TTL = 30;
 
 	/**
-	 * $options include:
-	 *   - connectTimeout : The timeout for new connections, in seconds.
-	 *                      Optional, default is 1 second.
-	 *   - persistent     : Set this to true to allow connections to persist across
-	 *                      multiple web requests. False by default.
-	 *   - password       : The authentication password, will be sent to Redis in clear text.
-	 *                      Optional, if it is unspecified, no AUTH command will be sent.
-	 *   - serializer     : Set to "php", "igbinary", or "none". Default is "php".
 	 * @param array $options
 	 */
 	protected function __construct( array $options ) {
-		if ( !extension_loaded( 'redis' ) ) {
-			throw new MWException( __CLASS__. ' requires the phpredis extension: ' .
-				'https://github.com/nicolasff/phpredis' );
+		if ( !class_exists( 'Redis' ) ) {
+			throw new MWException( __CLASS__ . ' requires a Redis client library. ' .
+				'See https://www.mediawiki.org/wiki/Redis#Setup' );
 		}
 		$this->connectTimeout = $options['connectTimeout'];
 		$this->persistent = $options['persistent'];
@@ -103,6 +107,14 @@ class RedisConnectionPool {
 
 	/**
 	 * @param $options Array
+	 * $options include:
+	 *   - connectTimeout : The timeout for new connections, in seconds.
+	 *                      Optional, default is 1 second.
+	 *   - persistent     : Set this to true to allow connections to persist across
+	 *                      multiple web requests. False by default.
+	 *   - password       : The authentication password, will be sent to Redis in clear text.
+	 *                      Optional, if it is unspecified, no AUTH command will be sent.
+	 *   - serializer     : Set to "php", "igbinary", or "none". Default is "php".
 	 * @return RedisConnectionPool
 	 */
 	public static function singleton( array $options ) {
@@ -164,7 +176,7 @@ class RedisConnectionPool {
 			// TCP connection
 			$hostPort = IP::splitHostAndPort( $server );
 			if ( !$hostPort ) {
-				throw new MWException( __CLASS__.": invalid configured server \"$server\"" );
+				throw new MWException( __CLASS__ . ": invalid configured server \"$server\"" );
 			}
 			list( $host, $port ) = $hostPort;
 			if ( $port === false ) {
@@ -302,6 +314,38 @@ class RedisConnRef {
 		return call_user_func_array( array( $this->conn, $name ), $arguments );
 	}
 
+	/**
+	 * @param string $script
+	 * @param array $params
+	 * @param integer $numKeys
+	 * @return mixed
+	 * @throws RedisException
+	 */
+	public function luaEval( $script, array $params, $numKeys ) {
+		$sha1 = sha1( $script ); // 40 char hex
+		$conn = $this->conn; // convenience
+
+		// Try to run the server-side cached copy of the script
+		$conn->clearLastError();
+		$res = $conn->evalSha( $sha1, $params, $numKeys );
+		// If the script is not in cache, use eval() to retry and cache it
+		if ( preg_match( '/^NOSCRIPT/', $conn->getLastError() ) ) {
+			$conn->clearLastError();
+			$res = $conn->eval( $script, $params, $numKeys );
+			wfDebugLog( 'redis', "Used eval() for Lua script $sha1." );
+		}
+
+		if ( $conn->getLastError() ) { // script bug?
+			wfDebugLog( 'redis', "Lua script error: " . $conn->getLastError() );
+		}
+
+		return $res;
+	}
+
+	/**
+	 * @param RedisConnRef $conn
+	 * @return bool
+	 */
 	public function isConnIdentical( Redis $conn ) {
 		return $this->conn === $conn;
 	}
diff --git a/includes/content/Content.php b/includes/content/Content.php
index 72729b09..5a90e092 100644
--- a/includes/content/Content.php
+++ b/includes/content/Content.php
@@ -40,8 +40,8 @@ interface Content {
 	 *   building a full text search index. If no useful representation exists,
 	 *   this method returns an empty string.
 	 *
-	 * @todo: test that this actually works
-	 * @todo: make sure this also works with LuceneSearch / WikiSearch
+	 * @todo Test that this actually works
+	 * @todo Make sure this also works with LuceneSearch / WikiSearch
 	 */
 	public function getTextForSearchIndex();
 
@@ -51,11 +51,11 @@ interface Content {
 	 * @return string|false The wikitext to include when another page includes this
 	 * content, or false if the content is not includable in a wikitext page.
 	 *
-	 * @todo allow native handling, bypassing wikitext representation, like
-	 *    for includable special pages.
-	 * @todo allow transclusion into other content models than Wikitext!
-	 * @todo used in WikiPage and MessageCache to get message text. Not so
-	 *    nice. What should we use instead?!
+	 * @todo Allow native handling, bypassing wikitext representation, like
+	 *  for includable special pages.
+	 * @todo Allow transclusion into other content models than Wikitext!
+	 * @todo Used in WikiPage and MessageCache to get message text. Not so
+	 *  nice. What should we use instead?!
 	 */
 	public function getWikitextForTransclusion();
 
diff --git a/includes/content/ContentHandler.php b/includes/content/ContentHandler.php
index 9c201955..2a92e233 100644
--- a/includes/content/ContentHandler.php
+++ b/includes/content/ContentHandler.php
@@ -319,7 +319,7 @@ abstract class ContentHandler {
 			wfRunHooks( 'ContentHandlerForModelID', array( $modelId, &$handler ) );
 
 			if ( $handler === null ) {
-				throw new MWException( "No handler for model '$modelId'' registered in \$wgContentHandlers" );
+				throw new MWException( "No handler for model '$modelId' registered in \$wgContentHandlers" );
 			}
 
 			if ( !( $handler instanceof ContentHandler ) ) {
@@ -449,10 +449,11 @@ abstract class ContentHandler {
 	 * @since 1.21
 	 *
 	 * @param Title $destination the page to redirect to.
+	 * @param string $text text to include in the redirect, if possible.
 	 *
 	 * @return Content
 	 */
-	public function makeRedirectContent( Title $destination ) {
+	public function makeRedirectContent( Title $destination, $text = '' ) {
 		return null;
 	}
 
@@ -937,7 +938,7 @@ abstract class ContentHandler {
 	 * @return ParserOptions
 	 */
 	public function makeParserOptions( $context ) {
-		global $wgContLang;
+		global $wgContLang, $wgEnableParserLimitReporting;
 
 		if ( $context instanceof IContextSource ) {
 			$options = ParserOptions::newFromContext( $context );
@@ -949,7 +950,7 @@ abstract class ContentHandler {
 			throw new MWException( "Bad context for parser options: $context" );
 		}
 
-		$options->enableLimitReport(); // show inclusion/loop reports
+		$options->enableLimitReport( $wgEnableParserLimitReporting ); // show inclusion/loop reports
 		$options->setTidy( true ); // fix bad HTML
 
 		return $options;
@@ -1060,7 +1061,7 @@ abstract class ContentHandler {
 					if ( isset( $handler[1] ) ) {
 						$info .= '::' . $handler[1];
 					}
-				} else if ( is_object( $handler ) ) {
+				} elseif ( is_object( $handler ) ) {
 					$info = get_class( $handler[0] );
 					$info .= '::on' . $event;
 				} else {
@@ -1086,8 +1087,8 @@ abstract class ContentHandler {
 				$contentObjects[$k] = $v;
 
 				$v = $v->serialize();
-				$contentTexts[ $k ] = $v;
-				$args[ $k ] = $v;
+				$contentTexts[$k] = $v;
+				$args[$k] = $v;
 			}
 		}
 
@@ -1098,7 +1099,7 @@ abstract class ContentHandler {
 		foreach ( $contentTexts as $k => $orig ) {
 			/* @var Content $content */
 
-			$modified = $args[ $k ];
+			$modified = $args[$k];
 			$content = $contentObjects[$k];
 
 			if ( $modified !== $orig ) {
@@ -1106,7 +1107,7 @@ abstract class ContentHandler {
 				$content = $content->getContentHandler()->unserializeContent( $modified );
 			}
 
-			$args[ $k ] = $content;
+			$args[$k] = $content;
 		}
 
 		return $ok;
diff --git a/includes/content/CssContent.php b/includes/content/CssContent.php
index 569d122d..03cc2d00 100644
--- a/includes/content/CssContent.php
+++ b/includes/content/CssContent.php
@@ -46,7 +46,7 @@ class CssContent extends TextContent {
 	 */
 	public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
 		global $wgParser;
-		// @todo: make pre-save transformation optional for script pages
+		// @todo Make pre-save transformation optional for script pages
 
 		$text = $this->getNativeData();
 		$pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
diff --git a/includes/content/JavaScriptContent.php b/includes/content/JavaScriptContent.php
index 9cd947f9..2ae572be 100644
--- a/includes/content/JavaScriptContent.php
+++ b/includes/content/JavaScriptContent.php
@@ -46,7 +46,7 @@ class JavaScriptContent extends TextContent {
 	 */
 	public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
 		global $wgParser;
-		// @todo: make pre-save transformation optional for script pages
+		// @todo Make pre-save transformation optional for script pages
 		// See bug #32858
 
 		$text = $this->getNativeData();
diff --git a/includes/content/TextContent.php b/includes/content/TextContent.php
index 8fafcb63..f66dacd7 100644
--- a/includes/content/TextContent.php
+++ b/includes/content/TextContent.php
@@ -171,7 +171,7 @@ class TextContent extends AbstractContent {
 
 		$this->checkModelID( $that->getModel() );
 
-		# @todo: could implement this in DifferenceEngine and just delegate here?
+		// @todo could implement this in DifferenceEngine and just delegate here?
 
 		if ( !$lang ) {
 			$lang = $wgContLang;
diff --git a/includes/content/WikitextContent.php b/includes/content/WikitextContent.php
index 8be4ebab..26337db9 100644
--- a/includes/content/WikitextContent.php
+++ b/includes/content/WikitextContent.php
@@ -61,7 +61,8 @@ class WikitextContent extends TextContent {
 		$myModelId = $this->getModel();
 		$sectionModelId = $with->getModel();
 
-		if ( $sectionModelId != $myModelId  ) {
+		if ( $sectionModelId != $myModelId ) {
+			wfProfileOut( __METHOD__ );
 			throw new MWException( "Incompatible content model for section: " .
 				"document uses $myModelId but " .
 				"section uses $sectionModelId." );
diff --git a/includes/content/WikitextContentHandler.php b/includes/content/WikitextContentHandler.php
index e1dcc668..b1b461fb 100644
--- a/includes/content/WikitextContentHandler.php
+++ b/includes/content/WikitextContentHandler.php
@@ -55,12 +55,27 @@ class WikitextContentHandler extends TextContentHandler {
 	 * @see ContentHandler::makeRedirectContent
 	 *
 	 * @param Title $destination the page to redirect to.
+	 * @param string $text text to include in the redirect, if possible.
 	 *
 	 * @return Content
 	 */
-	public function makeRedirectContent( Title $destination ) {
+	public function makeRedirectContent( Title $destination, $text = '' ) {
+		$optionalColon = '';
+
+		if ( $destination->getNamespace() == NS_CATEGORY ) {
+			$optionalColon = ':';
+		} else {
+			$iw = $destination->getInterwiki();
+			if ( $iw && Language::fetchLanguageName( $iw, null, 'mw' ) ) {
+				$optionalColon = ':';
+			}
+		}
+
 		$mwRedir = MagicWord::get( 'redirect' );
-		$redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $destination->getPrefixedText() . ']]';
+		$redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $optionalColon . $destination->getFullText() . ']]';
+		if ( $text != '' ) {
+			$redirectText .= "\n" . $text;
+		}
 
 		return new WikitextContent( $redirectText );
 	}
diff --git a/includes/context/ContextSource.php b/includes/context/ContextSource.php
index 33f51cb9..e13cfa88 100644
--- a/includes/context/ContextSource.php
+++ b/includes/context/ContextSource.php
@@ -125,7 +125,7 @@ abstract class ContextSource implements IContextSource {
 	/**
 	 * Get the Language object
 	 *
-	 * @deprecated 1.19 Use getLanguage instead
+	 * @deprecated since 1.19 Use getLanguage instead
 	 * @return Language
 	 */
 	public function getLang() {
diff --git a/includes/context/DerivativeContext.php b/includes/context/DerivativeContext.php
index b9a70068..fd9bf963 100644
--- a/includes/context/DerivativeContext.php
+++ b/includes/context/DerivativeContext.php
@@ -100,7 +100,10 @@ class DerivativeContext extends ContextSource {
 	 *
 	 * @param Title $t
 	 */
-	public function setTitle( Title $t ) {
+	public function setTitle( $t ) {
+		if ( $t !== null && !$t instanceof Title ) {
+			throw new MWException( __METHOD__ . " expects an instance of Title" );
+		}
 		$this->title = $t;
 	}
 
@@ -209,7 +212,7 @@ class DerivativeContext extends ContextSource {
 	/**
 	 * Set the Language object
 	 *
-	 * @deprecated 1.19 Use setLanguage instead
+	 * @deprecated since 1.19 Use setLanguage instead
 	 * @param Language|string $l Language instance or language code
 	 */
 	public function setLang( $l ) {
@@ -237,7 +240,7 @@ class DerivativeContext extends ContextSource {
 	}
 
 	/**
-	 * @deprecated 1.19 Use getLanguage instead
+	 * @deprecated since 1.19 Use getLanguage instead
 	 * @return Language
 	 */
 	public function getLang() {
@@ -281,4 +284,20 @@ class DerivativeContext extends ContextSource {
 			return $this->getContext()->getSkin();
 		}
 	}
+
+	/**
+	 * Get a message using the current context.
+	 *
+	 * This can't just inherit from ContextSource, since then
+	 * it would set only the original context, and not take
+	 * into account any changes.
+	 *
+	 * @param String Message name
+	 * @param Variable number of message arguments
+	 * @return Message
+	 */
+	public function msg() {
+		$args = func_get_args();
+		return call_user_func_array( 'wfMessage', $args )->setContext( $this );
+	}
 }
diff --git a/includes/context/IContextSource.php b/includes/context/IContextSource.php
index c7b221b9..35d5aed6 100644
--- a/includes/context/IContextSource.php
+++ b/includes/context/IContextSource.php
@@ -79,7 +79,7 @@ interface IContextSource {
 	/**
 	 * Get the Language object
 	 *
-	 * @deprecated 1.19 Use getLanguage instead
+	 * @deprecated since 1.19 Use getLanguage instead
 	 * @return Language
 	 */
 	public function getLang();
diff --git a/includes/context/RequestContext.php b/includes/context/RequestContext.php
index 6aefc98e..01ec57c0 100644
--- a/includes/context/RequestContext.php
+++ b/includes/context/RequestContext.php
@@ -90,7 +90,10 @@ class RequestContext implements IContextSource {
 	 *
 	 * @param Title $t
 	 */
-	public function setTitle( Title $t ) {
+	public function setTitle( $t ) {
+		if ( $t !== null && !$t instanceof Title ) {
+			throw new MWException( __METHOD__ . " expects an instance of Title" );
+		}
 		$this->title = $t;
 		// Erase the WikiPage so a new one with the new title gets created.
 		$this->wikipage = null;
@@ -233,7 +236,7 @@ class RequestContext implements IContextSource {
 	/**
 	 * Set the Language object
 	 *
-	 * @deprecated 1.19 Use setLanguage instead
+	 * @deprecated since 1.19 Use setLanguage instead
 	 * @param Language|string $l Language instance or language code
 	 */
 	public function setLang( $l ) {
@@ -261,7 +264,7 @@ class RequestContext implements IContextSource {
 	}
 
 	/**
-	 * @deprecated 1.19 Use getLanguage instead
+	 * @deprecated since 1.19 Use getLanguage instead
 	 * @return Language
 	 */
 	public function getLang() {
@@ -401,10 +404,10 @@ class RequestContext implements IContextSource {
 	 */
 	public function exportSession() {
 		return array(
-			'ip'        => $this->getRequest()->getIP(),
-			'headers'   => $this->getRequest()->getAllHeaders(),
+			'ip' => $this->getRequest()->getIP(),
+			'headers' => $this->getRequest()->getAllHeaders(),
 			'sessionId' => session_id(),
-			'userId'    => $this->getUser()->getId()
+			'userId' => $this->getUser()->getId()
 		);
 	}
 
@@ -417,7 +420,9 @@ class RequestContext implements IContextSource {
 	 * This will setup the session from the given ID. This is useful when
 	 * background scripts inherit context when acting on behalf of a user.
 	 *
-	 * $param array $params Result of RequestContext::exportSession()
+	 * @note suhosin.session.encrypt may interfere with this method.
+	 *
+	 * @param array $params Result of RequestContext::exportSession()
 	 * @return ScopedCallback
 	 * @throws MWException
 	 * @since 1.21
diff --git a/includes/db/ChronologyProtector.php b/includes/db/ChronologyProtector.php
new file mode 100644
index 00000000..de5e72c3
--- /dev/null
+++ b/includes/db/ChronologyProtector.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * Generator of database load balancing objects.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * Class for ensuring a consistent ordering of events as seen by the user, despite replication.
+ * Kind of like Hawking's [[Chronology Protection Agency]].
+ */
+class ChronologyProtector {
+	/** @var Array (DB master name => position) */
+	protected $startupPositions = array();
+	/** @var Array (DB master name => position) */
+	protected $shutdownPositions = array();
+
+	protected $initialized = false; // bool; whether the session data was loaded
+
+	/**
+	 * Initialise a LoadBalancer to give it appropriate chronology protection.
+	 *
+	 * If the session has a previous master position recorded, this will try to
+	 * make sure that the next query to a slave of that master will see changes up
+	 * to that position by delaying execution. The delay may timeout and allow stale
+	 * data if no non-lagged slaves are available.
+	 *
+	 * @param $lb LoadBalancer
+	 * @return void
+	 */
+	public function initLB( LoadBalancer $lb ) {
+		if ( $lb->getServerCount() <= 1 ) {
+			return; // non-replicated setup
+		}
+		if ( !$this->initialized ) {
+			$this->initialized = true;
+			if ( isset( $_SESSION[__CLASS__] ) && is_array( $_SESSION[__CLASS__] ) ) {
+				$this->startupPositions = $_SESSION[__CLASS__];
+			}
+		}
+		$masterName = $lb->getServerName( 0 );
+		if ( !empty( $this->startupPositions[$masterName] ) ) {
+			$info = $lb->parentInfo();
+			$pos = $this->startupPositions[$masterName];
+			wfDebug( __METHOD__ . ": LB " . $info['id'] . " waiting for master pos $pos\n" );
+			$lb->waitFor( $pos );
+		}
+	}
+
+	/**
+	 * Notify the ChronologyProtector that the LoadBalancer is about to shut
+	 * down. Saves replication positions.
+	 *
+	 * @param $lb LoadBalancer
+	 * @return void
+	 */
+	public function shutdownLB( LoadBalancer $lb ) {
+		if ( session_id() == '' || $lb->getServerCount() <= 1 ) {
+			return; // don't start a session; don't bother with non-replicated setups
+		}
+		$masterName = $lb->getServerName( 0 );
+		if ( isset( $this->shutdownPositions[$masterName] ) ) {
+			return; // already done
+		}
+		// Only save the position if writes have been done on the connection
+		$db = $lb->getAnyOpenConnection( 0 );
+		$info = $lb->parentInfo();
+		if ( !$db || !$db->doneWrites() ) {
+			wfDebug( __METHOD__ . ": LB {$info['id']}, no writes done\n" );
+			return;
+		}
+		$pos = $db->getMasterPos();
+		wfDebug( __METHOD__ . ": LB {$info['id']} has master pos $pos\n" );
+		$this->shutdownPositions[$masterName] = $pos;
+	}
+
+	/**
+	 * Notify the ChronologyProtector that the LBFactory is done calling shutdownLB() for now.
+	 * May commit chronology data to persistent storage.
+	 *
+	 * @return void
+	 */
+	public function shutdown() {
+		if ( session_id() != '' && count( $this->shutdownPositions ) ) {
+			wfDebug( __METHOD__ . ": saving master pos for " .
+				count( $this->shutdownPositions ) . " master(s)\n" );
+			$_SESSION[__CLASS__] = $this->shutdownPositions;
+		}
+	}
+}
diff --git a/includes/db/CloneDatabase.php b/includes/db/CloneDatabase.php
index 4e443741..819925cb 100644
--- a/includes/db/CloneDatabase.php
+++ b/includes/db/CloneDatabase.php
@@ -87,7 +87,7 @@ class CloneDatabase {
 	 * Clone the table structure
 	 */
 	public function cloneTableStructure() {
-		foreach( $this->tablesToClone as $tbl ) {
+		foreach ( $this->tablesToClone as $tbl ) {
 			# Clean up from previous aborted run.  So that table escaping
 			# works correctly across DB engines, we need to change the pre-
 			# fix back and forth so tableName() works right.
@@ -98,7 +98,7 @@ class CloneDatabase {
 			self::changePrefix( $this->newTablePrefix );
 			$newTableName = $this->db->tableName( $tbl, 'raw' );
 
-			if( $this->dropCurrentTables && !in_array( $this->db->getType(), array( 'postgres', 'oracle' ) ) ) {
+			if ( $this->dropCurrentTables && !in_array( $this->db->getType(), array( 'postgres', 'oracle' ) ) ) {
 				$this->db->dropTable( $tbl, __METHOD__ );
 				wfDebug( __METHOD__ . " dropping {$newTableName}\n", true );
 				//Dropping the oldTable because the prefix was changed
@@ -115,9 +115,9 @@ class CloneDatabase {
 	 * @param bool $dropTables Optionally drop the tables we created
 	 */
 	public function destroy( $dropTables = false ) {
-		if( $dropTables ) {
+		if ( $dropTables ) {
 			self::changePrefix( $this->newTablePrefix );
-			foreach( $this->tablesToClone as $tbl ) {
+			foreach ( $this->tablesToClone as $tbl ) {
 				$this->db->dropTable( $tbl );
 			}
 		}
@@ -127,7 +127,7 @@ class CloneDatabase {
 	/**
 	 * Change the table prefix on all open DB connections/
 	 *
-	 * @param  $prefix
+	 * @param $prefix
 	 * @return void
 	 */
 	public static function changePrefix( $prefix ) {
@@ -137,8 +137,8 @@ class CloneDatabase {
 	}
 
 	/**
-	 * @param  $lb LoadBalancer
-	 * @param  $prefix
+	 * @param $lb LoadBalancer
+	 * @param $prefix
 	 * @return void
 	 */
 	public static function changeLBPrefix( $lb, $prefix ) {
@@ -146,8 +146,8 @@ class CloneDatabase {
 	}
 
 	/**
-	 * @param  $db DatabaseBase
-	 * @param  $prefix
+	 * @param $db DatabaseBase
+	 * @param $prefix
 	 * @return void
 	 */
 	public static function changeDBPrefix( $db, $prefix ) {
diff --git a/includes/db/Database.php b/includes/db/Database.php
index 65a74abf..10645608 100644
--- a/includes/db/Database.php
+++ b/includes/db/Database.php
@@ -24,13 +24,6 @@
  * @ingroup Database
  */
 
-/** Number of times to re-try an operation in case of deadlock */
-define( 'DEADLOCK_TRIES', 4 );
-/** Minimum time to wait before retry, in microseconds */
-define( 'DEADLOCK_DELAY_MIN', 500000 );
-/** Maximum time to wait before retry */
-define( 'DEADLOCK_DELAY_MAX', 1500000 );
-
 /**
  * Base interface for all DBMS-specific code. At a bare minimum, all of the
  * following must be implemented to support MediaWiki
@@ -165,7 +158,7 @@ interface DatabaseType {
 	 * @param string $fname Calling function name
 	 * @return Mixed: Database-specific index description class or false if the index does not exist
 	 */
-	function indexInfo( $table, $index, $fname = 'Database::indexInfo' );
+	function indexInfo( $table, $index, $fname = __METHOD__ );
 
 	/**
 	 * Get the number of rows affected by the last write query
@@ -191,7 +184,7 @@ interface DatabaseType {
 	 *
 	 * @return string: wikitext of a link to the server software's web site
 	 */
-	static function getSoftwareLink();
+	function getSoftwareLink();
 
 	/**
 	 * A string describing the current software version, like from
@@ -211,11 +204,23 @@ interface DatabaseType {
 	function getServerInfo();
 }
 
+/**
+ * Interface for classes that implement or wrap DatabaseBase
+ * @ingroup Database
+ */
+interface IDatabase {}
+
 /**
  * Database abstraction object
  * @ingroup Database
  */
-abstract class DatabaseBase implements DatabaseType {
+abstract class DatabaseBase implements IDatabase, DatabaseType {
+	/** Number of times to re-try an operation in case of deadlock */
+	const DEADLOCK_TRIES = 4;
+	/** Minimum time to wait before retry, in microseconds */
+	const DEADLOCK_DELAY_MIN = 500000;
+	/** Maximum time to wait before retry */
+	const DEADLOCK_DELAY_MAX = 1500000;
 
 # ------------------------------------------------------------------------------
 # Variables
@@ -230,14 +235,14 @@ abstract class DatabaseBase implements DatabaseType {
 	protected $mConn = null;
 	protected $mOpened = false;
 
-	/**
-	 * @since 1.20
-	 * @var array of Closure
-	 */
+	/** @var callable[] */
 	protected $mTrxIdleCallbacks = array();
+	/** @var callable[] */
+	protected $mTrxPreCommitCallbacks = array();
 
 	protected $mTablePrefix;
 	protected $mFlags;
+	protected $mForeign;
 	protected $mTrxLevel = 0;
 	protected $mErrorCount = 0;
 	protected $mLBInfo = array();
@@ -282,6 +287,12 @@ abstract class DatabaseBase implements DatabaseType {
 	 */
 	protected $fileHandle = null;
 
+	/**
+	 * @since 1.22
+	 * @var Process cache of VIEWs names in the database
+	 */
+	protected $allViews = null;
+
 # ------------------------------------------------------------------------------
 # Accessors
 # ------------------------------------------------------------------------------
@@ -355,6 +366,8 @@ abstract class DatabaseBase implements DatabaseType {
 	 * code should use lastErrno() and lastError() to handle the
 	 * situation as appropriate.
 	 *
+	 * Do not use this function outside of the Database classes.
+	 *
 	 * @param $ignoreErrors bool|null
 	 *
 	 * @return bool The previous value of the flag.
@@ -553,12 +566,14 @@ abstract class DatabaseBase implements DatabaseType {
 
 	/**
 	 * Returns true if there is a transaction open with possible write
-	 * queries or transaction idle callbacks waiting on it to finish.
+	 * queries or transaction pre-commit/idle callbacks waiting on it to finish.
 	 *
 	 * @return bool
 	 */
 	public function writesOrCallbacksPending() {
-		return $this->mTrxLevel && ( $this->mTrxDoneWrites || $this->mTrxIdleCallbacks );
+		return $this->mTrxLevel && (
+			$this->mTrxDoneWrites || $this->mTrxIdleCallbacks || $this->mTrxPreCommitCallbacks
+		);
 	}
 
 	/**
@@ -575,7 +590,6 @@ abstract class DatabaseBase implements DatabaseType {
 	 * @param $flag Integer: DBO_* constants from Defines.php:
 	 *   - DBO_DEBUG: output some debug info (same as debug())
 	 *   - DBO_NOBUFFER: don't buffer results (inverse of bufferResults())
-	 *   - DBO_IGNORE: ignore errors (same as ignoreErrors())
 	 *   - DBO_TRX: automatically start transactions
 	 *   - DBO_DEFAULT: automatically sets DBO_TRX if not in command line mode
 	 *       and removes it in command line mode
@@ -584,7 +598,7 @@ abstract class DatabaseBase implements DatabaseType {
 	public function setFlag( $flag ) {
 		global $wgDebugDBTransactions;
 		$this->mFlags |= $flag;
-		if ( ( $flag & DBO_TRX) & $wgDebugDBTransactions ) {
+		if ( ( $flag & DBO_TRX ) & $wgDebugDBTransactions ) {
 			wfDebug( "Implicit transactions are now  disabled.\n" );
 		}
 	}
@@ -654,15 +668,28 @@ abstract class DatabaseBase implements DatabaseType {
 
 	/**
 	 * Constructor.
+	 *
+	 * FIXME: It is possible to construct a Database object with no associated
+	 * connection object, by specifying no parameters to __construct(). This
+	 * feature is deprecated and should be removed.
+	 *
+	 * FIXME: The long list of formal parameters here is not really appropriate
+	 * for MySQL, and not at all appropriate for any other DBMS. It should be
+	 * replaced by named parameters as in DatabaseBase::factory().
+	 *
+	 * DatabaseBase subclasses should not be constructed directly in external
+	 * code. DatabaseBase::factory() should be used instead.
+	 *
 	 * @param string $server database server host
 	 * @param string $user database user name
 	 * @param string $password database user password
 	 * @param string $dbName database name
 	 * @param $flags
 	 * @param string $tablePrefix database table prefixes. By default use the prefix gave in LocalSettings.php
+	 * @param bool $foreign disable some operations specific to local databases
 	 */
 	function __construct( $server = false, $user = false, $password = false, $dbName = false,
-		$flags = 0, $tablePrefix = 'get from global'
+		$flags = 0, $tablePrefix = 'get from global', $foreign = false
 	) {
 		global $wgDBprefix, $wgCommandLineMode, $wgDebugDBTransactions;
 
@@ -689,6 +716,8 @@ abstract class DatabaseBase implements DatabaseType {
 			$this->mTablePrefix = $tablePrefix;
 		}
 
+		$this->mForeign = $foreign;
+
 		if ( $user ) {
 			$this->open( $server, $user, $password, $dbName );
 		}
@@ -706,7 +735,7 @@ abstract class DatabaseBase implements DatabaseType {
 	/**
 	 * Given a DB type, construct the name of the appropriate child class of
 	 * DatabaseBase. This is designed to replace all of the manual stuff like:
-	 *	$class = 'Database' . ucfirst( strtolower( $type ) );
+	 *	$class = 'Database' . ucfirst( strtolower( $dbType ) );
 	 * as well as validate against the canonical list of DB types we have
 	 *
 	 * This factory function is mostly useful for when you need to connect to a
@@ -714,7 +743,6 @@ abstract class DatabaseBase implements DatabaseType {
 	 * an extension, et cetera). Do not use this to connect to the MediaWiki
 	 * database. Example uses in core:
 	 * @see LoadBalancer::reallyOpenConnection()
-	 * @see ExternalUser_MediaWiki::initFromCond()
 	 * @see ForeignDBRepo::getMasterDB()
 	 * @see WebInstaller_DBConnect::execute()
 	 *
@@ -722,24 +750,55 @@ abstract class DatabaseBase implements DatabaseType {
 	 *
 	 * @param string $dbType A possible DB type
 	 * @param array $p An array of options to pass to the constructor.
-	 *    Valid options are: host, user, password, dbname, flags, tablePrefix
+	 *    Valid options are: host, user, password, dbname, flags, tablePrefix, driver
 	 * @return DatabaseBase subclass or null
 	 */
 	final public static function factory( $dbType, $p = array() ) {
 		$canonicalDBTypes = array(
-			'mysql', 'postgres', 'sqlite', 'oracle', 'mssql'
+			'mysql'    => array( 'mysqli', 'mysql' ),
+			'postgres' => array(),
+			'sqlite'   => array(),
+			'oracle'   => array(),
+			'mssql'    => array(),
 		);
+
+		$driver = false;
 		$dbType = strtolower( $dbType );
-		$class = 'Database' . ucfirst( $dbType );
+		if ( isset( $canonicalDBTypes[$dbType] ) && $canonicalDBTypes[$dbType] ) {
+			$possibleDrivers = $canonicalDBTypes[$dbType];
+			if ( !empty( $p['driver'] ) ) {
+				if ( in_array( $p['driver'], $possibleDrivers ) ) {
+					$driver = $p['driver'];
+				} else {
+					throw new MWException( __METHOD__ .
+						" cannot construct Database with type '$dbType' and driver '{$p['driver']}'" );
+				}
+			} else {
+				foreach ( $possibleDrivers as $posDriver ) {
+					if ( extension_loaded( $posDriver ) ) {
+						$driver = $posDriver;
+						break;
+					}
+				}
+			}
+		} else {
+			$driver = $dbType;
+		}
+		if ( $driver === false ) {
+			throw new MWException( __METHOD__ .
+				" no viable database extension found for type '$dbType'" );
+		}
 
-		if( in_array( $dbType, $canonicalDBTypes ) || ( class_exists( $class ) && is_subclass_of( $class, 'DatabaseBase' ) ) ) {
+		$class = 'Database' . ucfirst( $driver );
+		if ( class_exists( $class ) && is_subclass_of( $class, 'DatabaseBase' ) ) {
 			return new $class(
 				isset( $p['host'] ) ? $p['host'] : false,
 				isset( $p['user'] ) ? $p['user'] : false,
 				isset( $p['password'] ) ? $p['password'] : false,
 				isset( $p['dbname'] ) ? $p['dbname'] : false,
 				isset( $p['flags'] ) ? $p['flags'] : 0,
-				isset( $p['tablePrefix'] ) ? $p['tablePrefix'] : 'get from global'
+				isset( $p['tablePrefix'] ) ? $p['tablePrefix'] : 'get from global',
+				isset( $p['foreign'] ) ? $p['foreign'] : false
 			);
 		} else {
 			return null;
@@ -772,8 +831,9 @@ abstract class DatabaseBase implements DatabaseType {
 	/**
 	 * @param $errno
 	 * @param $errstr
+	 * @access private
 	 */
-	protected function connectionErrorHandler( $errno, $errstr ) {
+	public function connectionErrorHandler( $errno, $errstr ) {
 		$this->mPHPError = $errstr;
 	}
 
@@ -870,23 +930,8 @@ abstract class DatabaseBase implements DatabaseType {
 	 * @return boolean|ResultWrapper. true for a successful write query, ResultWrapper object
 	 *     for a successful read query, or false on failure if $tempIgnore set
 	 */
-	public function query( $sql, $fname = '', $tempIgnore = false ) {
-		$isMaster = !is_null( $this->getLBInfo( 'master' ) );
-		if ( !Profiler::instance()->isStub() ) {
-			# generalizeSQL will probably cut down the query to reasonable
-			# logging size most of the time. The substr is really just a sanity check.
-
-			if ( $isMaster ) {
-				$queryProf = 'query-m: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
-				$totalProf = 'DatabaseBase::query-master';
-			} else {
-				$queryProf = 'query: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
-				$totalProf = 'DatabaseBase::query';
-			}
-
-			wfProfileIn( $totalProf );
-			wfProfileIn( $queryProf );
-		}
+	public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
+		global $wgUser, $wgDebugDBTransactions;
 
 		$this->mLastQuery = $sql;
 		if ( !$this->mDoneWrites && $this->isWriteQuery( $sql ) ) {
@@ -896,7 +941,6 @@ abstract class DatabaseBase implements DatabaseType {
 		}
 
 		# Add a comment for easy SHOW PROCESSLIST interpretation
-		global $wgUser;
 		if ( is_object( $wgUser ) && $wgUser->isItemLoaded( 'name' ) ) {
 			$userName = $wgUser->getName();
 			if ( mb_strlen( $userName ) > 15 ) {
@@ -920,7 +964,6 @@ abstract class DatabaseBase implements DatabaseType {
 			# is really used by application
 			$sqlstart = substr( $sql, 0, 10 ); // very much worth it, benchmark certified(tm)
 			if ( strpos( $sqlstart, "SHOW " ) !== 0 && strpos( $sqlstart, "SET " ) !== 0 ) {
-				global $wgDebugDBTransactions;
 				if ( $wgDebugDBTransactions ) {
 					wfDebug( "Implicit transaction start.\n" );
 				}
@@ -932,6 +975,22 @@ abstract class DatabaseBase implements DatabaseType {
 		# Keep track of whether the transaction has write queries pending
 		if ( $this->mTrxLevel && !$this->mTrxDoneWrites && $this->isWriteQuery( $sql ) ) {
 			$this->mTrxDoneWrites = true;
+			Profiler::instance()->transactionWritingIn( $this->mServer, $this->mDBname );
+		}
+
+		$isMaster = !is_null( $this->getLBInfo( 'master' ) );
+		if ( !Profiler::instance()->isStub() ) {
+			# generalizeSQL will probably cut down the query to reasonable
+			# logging size most of the time. The substr is really just a sanity check.
+			if ( $isMaster ) {
+				$queryProf = 'query-m: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
+				$totalProf = 'DatabaseBase::query-master';
+			} else {
+				$queryProf = 'query: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
+				$totalProf = 'DatabaseBase::query';
+			}
+			wfProfileIn( $totalProf );
+			wfProfileIn( $queryProf );
 		}
 
 		if ( $this->debug() ) {
@@ -945,10 +1004,6 @@ abstract class DatabaseBase implements DatabaseType {
 			wfDebug( "Query {$this->mDBname} ($cnt) ($master): $sqlx\n" );
 		}
 
-		if ( istainted( $sql ) & TC_MYSQL ) {
-			throw new MWException( 'Tainted query found' );
-		}
-
 		$queryId = MWDebug::query( $sql, $fname, $isMaster );
 
 		# Do the query and handle errors
@@ -961,6 +1016,7 @@ abstract class DatabaseBase implements DatabaseType {
 			# Transaction is gone, like it or not
 			$this->mTrxLevel = 0;
 			$this->mTrxIdleCallbacks = array(); // cancel
+			$this->mTrxPreCommitCallbacks = array(); // cancel
 			wfDebug( "Connection lost, reconnecting...\n" );
 
 			if ( $this->ping() ) {
@@ -1091,17 +1147,22 @@ abstract class DatabaseBase implements DatabaseType {
 	 * @return String
 	 */
 	protected function fillPreparedArg( $matches ) {
-		switch( $matches[1] ) {
-			case '\\?': return '?';
-			case '\\!': return '!';
-			case '\\&': return '&';
+		switch ( $matches[1] ) {
+			case '\\?':
+				return '?';
+			case '\\!':
+				return '!';
+			case '\\&':
+				return '&';
 		}
 
 		list( /* $n */, $arg ) = each( $this->preparedArgs );
 
-		switch( $matches[1] ) {
-			case '?': return $this->addQuotes( $arg );
-			case '!': return $arg;
+		switch ( $matches[1] ) {
+			case '?':
+				return $this->addQuotes( $arg );
+			case '!':
+				return $arg;
 			case '&':
 				# return $this->addQuotes( file_get_contents( $arg ) );
 				throw new DBUnexpectedError( $this, '& mode is not implemented. If it\'s really needed, uncomment the line above.' );
@@ -1117,7 +1178,8 @@ abstract class DatabaseBase implements DatabaseType {
 	 *
 	 * @param $res Mixed: A SQL result
 	 */
-	public function freeResult( $res ) {}
+	public function freeResult( $res ) {
+	}
 
 	/**
 	 * A SELECT wrapper which returns a single field from a single result row.
@@ -1136,9 +1198,9 @@ abstract class DatabaseBase implements DatabaseType {
 	 *
 	 * @return bool|mixed The value from the field, or false on failure.
 	 */
-	public function selectField( $table, $var, $cond = '', $fname = 'DatabaseBase::selectField',
-		$options = array() )
-	{
+	public function selectField( $table, $var, $cond = '', $fname = __METHOD__,
+		$options = array()
+	) {
 		if ( !is_array( $options ) ) {
 			$options = array( $options );
 		}
@@ -1236,7 +1298,7 @@ abstract class DatabaseBase implements DatabaseType {
 			$startOpts .= ' SQL_NO_CACHE';
 		}
 
-		if ( isset( $options['USE INDEX'] ) && ! is_array( $options['USE INDEX'] ) ) {
+		if ( isset( $options['USE INDEX'] ) && is_string( $options['USE INDEX'] ) ) {
 			$useIndex = $this->useIndexClause( $options['USE INDEX'] );
 		} else {
 			$useIndex = '';
@@ -1427,7 +1489,7 @@ abstract class DatabaseBase implements DatabaseType {
 	 *   DBQueryError exception will be thrown, except if the "ignore errors"
 	 *   option was set, in which case false will be returned.
 	 */
-	public function select( $table, $vars, $conds = '', $fname = 'DatabaseBase::select',
+	public function select( $table, $vars, $conds = '', $fname = __METHOD__,
 		$options = array(), $join_conds = array() ) {
 		$sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
 
@@ -1450,7 +1512,7 @@ abstract class DatabaseBase implements DatabaseType {
 	 * @return string SQL query string.
 	 * @see DatabaseBase::select()
 	 */
-	public function selectSQLText( $table, $vars, $conds = '', $fname = 'DatabaseBase::select',
+	public function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
 		$options = array(), $join_conds = array() )
 	{
 		if ( is_array( $vars ) ) {
@@ -1458,28 +1520,26 @@ abstract class DatabaseBase implements DatabaseType {
 		}
 
 		$options = (array)$options;
+		$useIndexes = ( isset( $options['USE INDEX'] ) && is_array( $options['USE INDEX'] ) )
+			? $options['USE INDEX']
+			: array();
 
 		if ( is_array( $table ) ) {
-			$useIndex = ( isset( $options['USE INDEX'] ) && is_array( $options['USE INDEX'] ) )
-				? $options['USE INDEX']
-				: array();
-			if ( count( $join_conds ) || count( $useIndex ) ) {
-				$from = ' FROM ' .
-					$this->tableNamesWithUseIndexOrJOIN( $table, $useIndex, $join_conds );
-			} else {
-				$from = ' FROM ' . implode( ',', $this->tableNamesWithAlias( $table ) );
-			}
+			$from = ' FROM ' .
+				$this->tableNamesWithUseIndexOrJOIN( $table, $useIndexes, $join_conds );
 		} elseif ( $table != '' ) {
 			if ( $table[0] == ' ' ) {
 				$from = ' FROM ' . $table;
 			} else {
-				$from = ' FROM ' . $this->tableName( $table );
+				$from = ' FROM ' .
+					$this->tableNamesWithUseIndexOrJOIN( array( $table ), $useIndexes, array() );
 			}
 		} else {
 			$from = '';
 		}
 
-		list( $startOpts, $useIndex, $preLimitTail, $postLimitTail ) = $this->makeSelectOptions( $options );
+		list( $startOpts, $useIndex, $preLimitTail, $postLimitTail ) =
+			$this->makeSelectOptions( $options );
 
 		if ( !empty( $conds ) ) {
 			if ( is_array( $conds ) ) {
@@ -1517,7 +1577,7 @@ abstract class DatabaseBase implements DatabaseType {
 	 *
 	 * @return object|bool
 	 */
-	public function selectRow( $table, $vars, $conds, $fname = 'DatabaseBase::selectRow',
+	public function selectRow( $table, $vars, $conds, $fname = __METHOD__,
 		$options = array(), $join_conds = array() )
 	{
 		$options = (array)$options;
@@ -1558,7 +1618,7 @@ abstract class DatabaseBase implements DatabaseType {
 	 * @return Integer: row count
 	 */
 	public function estimateRowCount( $table, $vars = '*', $conds = '',
-		$fname = 'DatabaseBase::estimateRowCount', $options = array() )
+		$fname = __METHOD__, $options = array() )
 	{
 		$rows = 0;
 		$res = $this->select( $table, array( 'rowcount' => 'COUNT(*)' ), $conds, $fname, $options );
@@ -1582,19 +1642,20 @@ abstract class DatabaseBase implements DatabaseType {
 	static function generalizeSQL( $sql ) {
 		# This does the same as the regexp below would do, but in such a way
 		# as to avoid crashing php on some large strings.
-		# $sql = preg_replace ( "/'([^\\\\']|\\\\.)*'|\"([^\\\\\"]|\\\\.)*\"/", "'X'", $sql);
+		# $sql = preg_replace( "/'([^\\\\']|\\\\.)*'|\"([^\\\\\"]|\\\\.)*\"/", "'X'", $sql );
 
-		$sql = str_replace ( "\\\\", '', $sql );
-		$sql = str_replace ( "\\'", '', $sql );
-		$sql = str_replace ( "\\\"", '', $sql );
-		$sql = preg_replace ( "/'.*'/s", "'X'", $sql );
-		$sql = preg_replace ( '/".*"/s', "'X'", $sql );
+		$sql = str_replace( "\\\\", '', $sql );
+		$sql = str_replace( "\\'", '', $sql );
+		$sql = str_replace( "\\\"", '', $sql );
+		$sql = preg_replace( "/'.*'/s", "'X'", $sql );
+		$sql = preg_replace( '/".*"/s', "'X'", $sql );
 
 		# All newlines, tabs, etc replaced by single space
-		$sql = preg_replace ( '/\s+/', ' ', $sql );
+		$sql = preg_replace( '/\s+/', ' ', $sql );
 
 		# All numbers => N
-		$sql = preg_replace ( '/-?[0-9]+/s', 'N', $sql );
+		$sql = preg_replace( '/-?\d+(,-?\d+)+/s', 'N,...,N', $sql );
+		$sql = preg_replace( '/-?\d+/s', 'N', $sql );
 
 		return $sql;
 	}
@@ -1607,7 +1668,7 @@ abstract class DatabaseBase implements DatabaseType {
 	 * @param string $fname calling function name (optional)
 	 * @return Boolean: whether $table has filed $field
 	 */
-	public function fieldExists( $table, $field, $fname = 'DatabaseBase::fieldExists' ) {
+	public function fieldExists( $table, $field, $fname = __METHOD__ ) {
 		$info = $this->fieldInfo( $table, $field );
 
 		return (bool)$info;
@@ -1624,8 +1685,8 @@ abstract class DatabaseBase implements DatabaseType {
 	 *
 	 * @return bool|null
 	 */
-	public function indexExists( $table, $index, $fname = 'DatabaseBase::indexExists' ) {
-		if( !$this->tableExists( $table ) ) {
+	public function indexExists( $table, $index, $fname = __METHOD__ ) {
+		if ( !$this->tableExists( $table ) ) {
 			return null;
 		}
 
@@ -1729,7 +1790,7 @@ abstract class DatabaseBase implements DatabaseType {
 	 *
 	 * @return bool
 	 */
-	public function insert( $table, $a, $fname = 'DatabaseBase::insert', $options = array() ) {
+	public function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
 		# No rows to insert, easy just return now
 		if ( !count( $a ) ) {
 			return true;
@@ -1828,7 +1889,7 @@ abstract class DatabaseBase implements DatabaseType {
 	 *                   - LOW_PRIORITY: MySQL-specific, see MySQL manual.
 	 * @return Boolean
 	 */
-	function update( $table, $values, $conds, $fname = 'DatabaseBase::update', $options = array() ) {
+	function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
 		$table = $this->tableName( $table );
 		$opts = $this->makeUpdateOptions( $options );
 		$sql = "UPDATE $opts $table SET " . $this->makeList( $values, LIST_SET );
@@ -2065,6 +2126,7 @@ abstract class DatabaseBase implements DatabaseType {
 		} else {
 			list( $table ) = $dbDetails;
 			if ( $wgSharedDB !== null # We have a shared database
+				&& $this->mForeign == false # We're not working on a foreign database
 				&& !$this->isQuotedIdentifier( $table ) # Paranoia check to prevent shared tables listing '`table`'
 				&& in_array( $table, $wgSharedTables ) # A shared table is selected
 			) {
@@ -2257,11 +2319,11 @@ abstract class DatabaseBase implements DatabaseType {
 		}
 
 		// We can't separate explicit JOIN clauses with ',', use ' ' for those
-		$straightJoins = !empty( $ret ) ? implode( ',', $ret ) : "";
-		$otherJoins = !empty( $retJOIN ) ? implode( ' ', $retJOIN ) : "";
+		$implicitJoins = !empty( $ret ) ? implode( ',', $ret ) : "";
+		$explicitJoins = !empty( $retJOIN ) ? implode( ' ', $retJOIN ) : "";
 
 		// Compile our final table clause
-		return implode( ' ', array( $straightJoins, $otherJoins ) );
+		return implode( ' ', array( $implicitJoins, $explicitJoins ) );
 	}
 
 	/**
@@ -2274,9 +2336,9 @@ abstract class DatabaseBase implements DatabaseType {
 	protected function indexName( $index ) {
 		// Backwards-compatibility hack
 		$renamed = array(
-			'ar_usertext_timestamp'	=> 'usertext_timestamp',
-			'un_user_id'		=> 'user_id',
-			'un_user_ip'		=> 'user_ip',
+			'ar_usertext_timestamp' => 'usertext_timestamp',
+			'un_user_id' => 'user_id',
+			'un_user_ip' => 'user_ip',
 		);
 
 		if ( isset( $renamed[$index] ) ) {
@@ -2287,8 +2349,7 @@ abstract class DatabaseBase implements DatabaseType {
 	}
 
 	/**
-	 * If it's a string, adds quotes and backslashes
-	 * Otherwise returns as-is
+	 * Adds quotes and backslashes.
 	 *
 	 * @param $s string
 	 *
@@ -2445,7 +2506,7 @@ abstract class DatabaseBase implements DatabaseType {
 	 *    a field name or an array of field names
 	 * @param string $fname Calling function name (use __METHOD__) for logs/profiling
 	 */
-	public function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseBase::replace' ) {
+	public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
 		$quotedTable = $this->tableName( $table );
 
 		if ( count( $rows ) == 0 ) {
@@ -2457,7 +2518,7 @@ abstract class DatabaseBase implements DatabaseType {
 			$rows = array( $rows );
 		}
 
-		foreach( $rows as $row ) {
+		foreach ( $rows as $row ) {
 			# Delete rows which collide
 			if ( $uniqueIndexes ) {
 				$sql = "DELETE FROM $quotedTable WHERE ";
@@ -2488,7 +2549,7 @@ abstract class DatabaseBase implements DatabaseType {
 			}
 
 			# Now insert the row
-			$this->insert( $table, $row );
+			$this->insert( $table, $row, $fname );
 		}
 	}
 
@@ -2526,6 +2587,92 @@ abstract class DatabaseBase implements DatabaseType {
 		return $this->query( $sql, $fname );
 	}
 
+	/**
+	 * INSERT ON DUPLICATE KEY UPDATE wrapper, upserts an array into a table.
+	 *
+	 * This updates any conflicting rows (according to the unique indexes) using
+	 * the provided SET clause and inserts any remaining (non-conflicted) rows.
+	 *
+	 * $rows may be either:
+	 *   - A single associative array. The array keys are the field names, and
+	 *     the values are the values to insert. The values are treated as data
+	 *     and will be quoted appropriately. If NULL is inserted, this will be
+	 *     converted to a database NULL.
+	 *   - An array with numeric keys, holding a list of associative arrays.
+	 *     This causes a multi-row INSERT on DBMSs that support it. The keys in
+	 *     each subarray must be identical to each other, and in the same order.
+	 *
+	 * It may be more efficient to leave off unique indexes which are unlikely
+	 * to collide. However if you do this, you run the risk of encountering
+	 * errors which wouldn't have occurred in MySQL.
+	 *
+	 * Usually throws a DBQueryError on failure. If errors are explicitly ignored,
+	 * returns success.
+	 *
+	 * @param string $table Table name. This will be passed through DatabaseBase::tableName().
+	 * @param array $rows A single row or list of rows to insert
+	 * @param array $uniqueIndexes List of single field names or field name tuples
+	 * @param array $set An array of values to SET. For each array element,
+	 *                the key gives the field name, and the value gives the data
+	 *                to set that field to. The data will be quoted by
+	 *                DatabaseBase::addQuotes().
+	 * @param string $fname Calling function name (use __METHOD__) for logs/profiling
+	 * @param array $options of options
+	 *
+	 * @return bool
+	 * @since 1.22
+	 */
+	public function upsert(
+		$table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__
+	) {
+		if ( !count( $rows ) ) {
+			return true; // nothing to do
+		}
+		$rows = is_array( reset( $rows ) ) ? $rows : array( $rows );
+
+		if ( count( $uniqueIndexes ) ) {
+			$clauses = array(); // list WHERE clauses that each identify a single row
+			foreach ( $rows as $row ) {
+				foreach ( $uniqueIndexes as $index ) {
+					$index = is_array( $index ) ? $index : array( $index ); // columns
+					$rowKey = array(); // unique key to this row
+					foreach ( $index as $column ) {
+						$rowKey[$column] = $row[$column];
+					}
+					$clauses[] = $this->makeList( $rowKey, LIST_AND );
+				}
+			}
+			$where = array( $this->makeList( $clauses, LIST_OR ) );
+		} else {
+			$where = false;
+		}
+
+		$useTrx = !$this->mTrxLevel;
+		if ( $useTrx ) {
+			$this->begin( $fname );
+		}
+		try {
+			# Update any existing conflicting row(s)
+			if ( $where !== false ) {
+				$ok = $this->update( $table, $set, $where, $fname );
+			} else {
+				$ok = true;
+			}
+			# Now insert any non-conflicting row(s)
+			$ok = $this->insert( $table, $rows, $fname, array( 'IGNORE' ) ) && $ok;
+		} catch ( Exception $e ) {
+			if ( $useTrx ) {
+				$this->rollback( $fname );
+			}
+			throw $e;
+		}
+		if ( $useTrx ) {
+			$this->commit( $fname );
+		}
+
+		return $ok;
+	}
+
 	/**
 	 * DELETE where the condition is a join.
 	 *
@@ -2548,7 +2695,7 @@ abstract class DatabaseBase implements DatabaseType {
 	 * @throws DBUnexpectedError
 	 */
 	public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
-		$fname = 'DatabaseBase::deleteJoin' )
+		$fname = __METHOD__ )
 	{
 		if ( !$conds ) {
 			throw new DBUnexpectedError( $this,
@@ -2614,7 +2761,7 @@ abstract class DatabaseBase implements DatabaseType {
 	 * @throws DBUnexpectedError
 	 * @return bool|ResultWrapper
 	 */
-	public function delete( $table, $conds, $fname = 'DatabaseBase::delete' ) {
+	public function delete( $table, $conds, $fname = __METHOD__ ) {
 		if ( !$conds ) {
 			throw new DBUnexpectedError( $this, 'DatabaseBase::delete() called with no conditions' );
 		}
@@ -2623,7 +2770,10 @@ abstract class DatabaseBase implements DatabaseType {
 		$sql = "DELETE FROM $table";
 
 		if ( $conds != '*' ) {
-			$sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
+			if ( is_array( $conds ) ) {
+				$conds = $this->makeList( $conds, LIST_AND );
+			}
+			$sql .= ' WHERE ' . $conds;
 		}
 
 		return $this->query( $sql, $fname );
@@ -2656,7 +2806,7 @@ abstract class DatabaseBase implements DatabaseType {
 	 * @return ResultWrapper
 	 */
 	public function insertSelect( $destTable, $srcTable, $varMap, $conds,
-		$fname = 'DatabaseBase::insertSelect',
+		$fname = __METHOD__,
 		$insertOptions = array(), $selectOptions = array() )
 	{
 		$destTable = $this->tableName( $destTable );
@@ -2848,7 +2998,7 @@ abstract class DatabaseBase implements DatabaseType {
 		$args = func_get_args();
 		$function = array_shift( $args );
 		$oldIgnore = $this->ignoreErrors( true );
-		$tries = DEADLOCK_TRIES;
+		$tries = self::DEADLOCK_TRIES;
 
 		if ( is_array( $function ) ) {
 			$fname = $function[0];
@@ -2865,7 +3015,7 @@ abstract class DatabaseBase implements DatabaseType {
 			if ( $errno ) {
 				if ( $this->wasDeadlock() ) {
 					# Retry
-					usleep( mt_rand( DEADLOCK_DELAY_MIN, DEADLOCK_DELAY_MAX ) );
+					usleep( mt_rand( self::DEADLOCK_DELAY_MIN, self::DEADLOCK_DELAY_MAX ) );
 				} else {
 					$this->reportQueryError( $error, $errno, $sql, $fname );
 				}
@@ -2955,24 +3105,45 @@ abstract class DatabaseBase implements DatabaseType {
 	/**
 	 * Run an anonymous function as soon as there is no transaction pending.
 	 * If there is a transaction and it is rolled back, then the callback is cancelled.
+	 * Queries in the function will run in AUTO-COMMIT mode unless there are begin() calls.
 	 * Callbacks must commit any transactions that they begin.
 	 *
-	 * This is useful for updates to different systems or separate transactions are needed.
+	 * This is useful for updates to different systems or when separate transactions are needed.
+	 * For example, one might want to enqueue jobs into a system outside the database, but only
+	 * after the database is updated so that the jobs will see the data when they actually run.
+	 * It can also be used for updates that easily cause deadlocks if locks are held too long.
 	 *
+	 * @param callable $callback
 	 * @since 1.20
+	 */
+	final public function onTransactionIdle( $callback ) {
+		$this->mTrxIdleCallbacks[] = array( $callback, wfGetCaller() );
+		if ( !$this->mTrxLevel ) {
+			$this->runOnTransactionIdleCallbacks();
+		}
+	}
+
+	/**
+	 * Run an anonymous function before the current transaction commits or now if there is none.
+	 * If there is a transaction and it is rolled back, then the callback is cancelled.
+	 * Callbacks must not start nor commit any transactions.
+	 *
+	 * This is useful for updates that easily cause deadlocks if locks are held too long
+	 * but where atomicity is strongly desired for these updates and some related updates.
 	 *
-	 * @param Closure $callback
+	 * @param callable $callback
+	 * @since 1.22
 	 */
-	final public function onTransactionIdle( Closure $callback ) {
+	final public function onTransactionPreCommitOrIdle( $callback ) {
 		if ( $this->mTrxLevel ) {
-			$this->mTrxIdleCallbacks[] = $callback;
+			$this->mTrxPreCommitCallbacks[] = array( $callback, wfGetCaller() );
 		} else {
-			$callback();
+			$this->onTransactionIdle( $callback ); // this will trigger immediately
 		}
 	}
 
 	/**
-	 * Actually run the "on transaction idle" callbacks.
+	 * Actually any "on transaction idle" callbacks.
 	 *
 	 * @since 1.20
 	 */
@@ -2985,8 +3156,9 @@ abstract class DatabaseBase implements DatabaseType {
 			$this->mTrxIdleCallbacks = array(); // recursion guard
 			foreach ( $callbacks as $callback ) {
 				try {
+					list( $phpCallback ) = $callback;
 					$this->clearFlag( DBO_TRX ); // make each query its own transaction
-					$callback();
+					call_user_func( $phpCallback );
 					$this->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
 				} catch ( Exception $e ) {}
 			}
@@ -2997,6 +3169,29 @@ abstract class DatabaseBase implements DatabaseType {
 		}
 	}
 
+	/**
+	 * Actually any "on transaction pre-commit" callbacks.
+	 *
+	 * @since 1.22
+	 */
+	protected function runOnTransactionPreCommitCallbacks() {
+		$e = null; // last exception
+		do { // callbacks may add callbacks :)
+			$callbacks = $this->mTrxPreCommitCallbacks;
+			$this->mTrxPreCommitCallbacks = array(); // recursion guard
+			foreach ( $callbacks as $callback ) {
+				try {
+					list( $phpCallback ) = $callback;
+					call_user_func( $phpCallback );
+				} catch ( Exception $e ) {}
+			}
+		} while ( count( $this->mTrxPreCommitCallbacks ) );
+
+		if ( $e instanceof Exception ) {
+			throw $e; // re-throw any last exception
+		}
+	}
+
 	/**
 	 * Begin a transaction. If a transaction is already in progress, that transaction will be committed before the
 	 * new transaction is started.
@@ -3009,7 +3204,7 @@ abstract class DatabaseBase implements DatabaseType {
 	 *
 	 * @param $fname string
 	 */
-	final public function begin( $fname = 'DatabaseBase::begin' ) {
+	final public function begin( $fname = __METHOD__ ) {
 		global $wgDebugDBTransactions;
 
 		if ( $this->mTrxLevel ) { // implicit commit
@@ -3025,11 +3220,16 @@ abstract class DatabaseBase implements DatabaseType {
 				// log it if $wgDebugDBTransactions is enabled.
 				if ( $this->mTrxDoneWrites && $wgDebugDBTransactions ) {
 					wfDebug( "$fname: Automatic transaction with writes in progress" .
-						" (from {$this->mTrxFname}), performing implicit commit!\n" );
+						" (from {$this->mTrxFname}), performing implicit commit!\n"
+					);
 				}
 			}
 
+			$this->runOnTransactionPreCommitCallbacks();
 			$this->doCommit( $fname );
+			if ( $this->mTrxDoneWrites ) {
+				Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
+			}
 			$this->runOnTransactionIdleCallbacks();
 		}
 
@@ -3062,22 +3262,27 @@ abstract class DatabaseBase implements DatabaseType {
 	 *        This will silently break any ongoing explicit transaction. Only set the flush flag if you are sure
 	 *        that it is safe to ignore these warnings in your context.
 	 */
-	final public function commit( $fname = 'DatabaseBase::commit', $flush = '' ) {
+	final public function commit( $fname = __METHOD__, $flush = '' ) {
 		if ( $flush != 'flush' ) {
 			if ( !$this->mTrxLevel ) {
 				wfWarn( "$fname: No transaction to commit, something got out of sync!" );
-			} elseif( $this->mTrxAutomatic ) {
+			} elseif ( $this->mTrxAutomatic ) {
 				wfWarn( "$fname: Explicit commit of implicit transaction. Something may be out of sync!" );
 			}
 		} else {
 			if ( !$this->mTrxLevel ) {
 				return; // nothing to do
-			} elseif( !$this->mTrxAutomatic ) {
+			} elseif ( !$this->mTrxAutomatic ) {
 				wfWarn( "$fname: Flushing an explicit transaction, getting out of sync!" );
 			}
 		}
 
+		$this->runOnTransactionPreCommitCallbacks();
 		$this->doCommit( $fname );
+		if ( $this->mTrxDoneWrites ) {
+			Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
+		}
+		$this->mTrxDoneWrites = false;
 		$this->runOnTransactionIdleCallbacks();
 	}
 
@@ -3102,12 +3307,17 @@ abstract class DatabaseBase implements DatabaseType {
 	 *
 	 * @param $fname string
 	 */
-	final public function rollback( $fname = 'DatabaseBase::rollback' ) {
+	final public function rollback( $fname = __METHOD__ ) {
 		if ( !$this->mTrxLevel ) {
 			wfWarn( "$fname: No transaction to rollback, something got out of sync!" );
 		}
 		$this->doRollback( $fname );
 		$this->mTrxIdleCallbacks = array(); // cancel
+		$this->mTrxPreCommitCallbacks = array(); // cancel
+		if ( $this->mTrxDoneWrites ) {
+			Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
+		}
+		$this->mTrxDoneWrites = false;
 	}
 
 	/**
@@ -3139,8 +3349,8 @@ abstract class DatabaseBase implements DatabaseType {
 	 * @return Boolean: true if operation was successful
 	 */
 	public function duplicateTableStructure( $oldName, $newName, $temporary = false,
-		$fname = 'DatabaseBase::duplicateTableStructure' )
-	{
+		$fname = __METHOD__
+	) {
 		throw new MWException(
 			'DatabaseBase::duplicateTableStructure is not implemented in descendant class' );
 	}
@@ -3152,10 +3362,44 @@ abstract class DatabaseBase implements DatabaseType {
 	 * @param string $fname calling function name
 	 * @throws MWException
 	 */
-	function listTables( $prefix = null, $fname = 'DatabaseBase::listTables' ) {
+	function listTables( $prefix = null, $fname = __METHOD__ ) {
 		throw new MWException( 'DatabaseBase::listTables is not implemented in descendant class' );
 	}
 
+	/**
+	 * Reset the views process cache set by listViews()
+	 * @since 1.22
+	 */
+	final public function clearViewsCache() {
+		$this->allViews = null;
+	}
+
+	/**
+	 * Lists all the VIEWs in the database
+	 *
+	 * For caching purposes the list of all views should be stored in
+	 * $this->allViews. The process cache can be cleared with clearViewsCache()
+	 *
+	 * @param string $prefix   Only show VIEWs with this prefix, eg. unit_test_
+	 * @param string $fname    Name of calling function
+	 * @throws MWException
+	 * @since 1.22
+	 */
+	public function listViews( $prefix = null, $fname = __METHOD__ ) {
+		throw new MWException( 'DatabaseBase::listViews is not implemented in descendant class' );
+	}
+
+	/**
+	 * Differentiates between a TABLE and a VIEW
+	 *
+	 * @param $name string: Name of the database-structure to test.
+	 * @throws MWException
+	 * @since 1.22
+	 */
+	public function isView( $name ) {
+		throw new MWException( 'DatabaseBase::isView is not implemented in descendant class' );
+	}
+
 	/**
 	 * Convert a timestamp in one of the formats accepted by wfTimestamp()
 	 * to the format used for inserting into timestamp fields in this DBMS.
@@ -3285,7 +3529,8 @@ abstract class DatabaseBase implements DatabaseType {
 	 * @param $options Array
 	 * @return void
 	 */
-	public function setSessionOptions( array $options ) {}
+	public function setSessionOptions( array $options ) {
+	}
 
 	/**
 	 * Read and execute SQL commands from a file.
@@ -3375,7 +3620,7 @@ abstract class DatabaseBase implements DatabaseType {
 	 * @return bool|string
 	 */
 	public function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
-		$fname = 'DatabaseBase::sourceStream', $inputCallback = false )
+		$fname = __METHOD__, $inputCallback = false )
 	{
 		$cmd = '';
 
@@ -3614,12 +3859,12 @@ abstract class DatabaseBase implements DatabaseType {
 	 * @return bool|ResultWrapper
 	 * @since 1.18
 	 */
-	public function dropTable( $tableName, $fName = 'DatabaseBase::dropTable' ) {
-		if( !$this->tableExists( $tableName, $fName ) ) {
+	public function dropTable( $tableName, $fName = __METHOD__ ) {
+		if ( !$this->tableExists( $tableName, $fName ) ) {
 			return false;
 		}
 		$sql = "DROP TABLE " . $this->tableName( $tableName );
-		if( $this->cascadingDeletes() ) {
+		if ( $this->cascadingDeletes() ) {
 			$sql .= " CASCADE";
 		}
 		return $this->query( $sql, $fName );
@@ -3691,9 +3936,21 @@ abstract class DatabaseBase implements DatabaseType {
 		return (string)$this->mConn;
 	}
 
+	/**
+	 * Run a few simple sanity checks
+	 */
 	public function __destruct() {
-		if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
-			trigger_error( "Transaction idle callbacks still pending." );
+		if ( $this->mTrxLevel && $this->mTrxDoneWrites ) {
+			trigger_error( "Uncommitted DB writes (transaction from {$this->mTrxFname})." );
+		}
+		if ( count( $this->mTrxIdleCallbacks ) || count( $this->mTrxPreCommitCallbacks ) ) {
+			$callers = array();
+			foreach ( $this->mTrxIdleCallbacks as $callbackInfo ) {
+				$callers[] = $callbackInfo[1];
+
+			}
+			$callers = implode( ', ', $callers );
+			trigger_error( "DB transaction  callbacks still pending (from $callers)." );
 		}
 	}
 }
diff --git a/includes/db/DatabaseError.php b/includes/db/DatabaseError.php
index 628a2afc..0875695f 100644
--- a/includes/db/DatabaseError.php
+++ b/includes/db/DatabaseError.php
@@ -42,25 +42,13 @@ class DBError extends MWException {
 		parent::__construct( $error );
 	}
 
-	/**
-	 * @param $html string
-	 * @return string
-	 */
-	protected function getContentMessage( $html ) {
-		if ( $html ) {
-			return nl2br( htmlspecialchars( $this->getMessage() ) );
-		} else {
-			return $this->getMessage();
-		}
-	}
-
 	/**
 	 * @return string
 	 */
 	function getText() {
 		global $wgShowDBErrorBacktrace;
 
-		$s = $this->getContentMessage( false ) . "\n";
+		$s = $this->getTextContent() . "\n";
 
 		if ( $wgShowDBErrorBacktrace ) {
 			$s .= "Backtrace:\n" . $this->getTraceAsString() . "\n";
@@ -75,14 +63,29 @@ class DBError extends MWException {
 	function getHTML() {
 		global $wgShowDBErrorBacktrace;
 
-		$s = $this->getContentMessage( true );
+		$s = $this->getHTMLContent();
 
 		if ( $wgShowDBErrorBacktrace ) {
-			$s .= '<p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) );
+			$s .= '<p>Backtrace:</p><p>' .
+				nl2br( htmlspecialchars( $this->getTraceAsString() ) ) . '</p>';
 		}
 
 		return $s;
 	}
+
+	/**
+	 * @return string
+	 */
+	protected function getTextContent() {
+		return $this->getMessage();
+	}
+
+	/**
+	 * @return string
+	 */
+	protected function getHTMLContent() {
+		return '<p>' . nl2br( htmlspecialchars( $this->getMessage() ) ) . '</p>';
+	}
 }
 
 /**
@@ -96,11 +99,12 @@ class DBConnectionError extends DBError {
 
 		if ( trim( $error ) != '' ) {
 			$msg .= ": $error";
+		} elseif ( $db ) {
+			$error = $this->db->getServer();
 		}
 
-		$this->error = $error;
-
 		parent::__construct( $db, $msg );
+		$this->error = $error;
 	}
 
 	/**
@@ -130,10 +134,10 @@ class DBConnectionError extends DBError {
 	}
 
 	/**
-	 * @return bool
+	 * @return boolean
 	 */
-	function getLogMessage() {
-		# Don't send to the exception log
+	function isLoggable() {
+		// Don't send to the exception log, already in dberror log
 		return false;
 	}
 
@@ -141,39 +145,51 @@ class DBConnectionError extends DBError {
 	 * @return string
 	 */
 	function getPageTitle() {
-		global $wgSitename;
-		return htmlspecialchars( $this->msg( 'dberr-header', "$wgSitename has a problem" ) );
+		return $this->msg( 'dberr-header', 'This wiki has a problem' );
 	}
 
 	/**
 	 * @return string
 	 */
 	function getHTML() {
-		global $wgShowDBErrorBacktrace;
+		global $wgShowDBErrorBacktrace, $wgShowHostnames, $wgShowSQLErrors;
 
-		$sorry = htmlspecialchars( $this->msg( 'dberr-problems', 'Sorry! This site is experiencing technical difficulties.' ) );
+		$sorry = htmlspecialchars( $this->msg( 'dberr-problems', "Sorry!\nThis site is experiencing technical difficulties." ) );
 		$again = htmlspecialchars( $this->msg( 'dberr-again', 'Try waiting a few minutes and reloading.' ) );
-		$info = htmlspecialchars( $this->msg( 'dberr-info', '(Can\'t contact the database server: $1)' ) );
-
-		# No database access
-		MessageCache::singleton()->disable();
 
-		if ( trim( $this->error ) == '' && $this->db ) {
-			$this->error = $this->db->getProperty( 'mServer' );
+		if ( $wgShowHostnames || $wgShowSQLErrors ) {
+			$info = str_replace(
+				'$1', Html::element( 'span', array( 'dir' => 'ltr' ), $this->error ),
+				htmlspecialchars( $this->msg( 'dberr-info', '(Cannot contact the database server: $1)' ) )
+			);
+		} else {
+			$info = htmlspecialchars( $this->msg( 'dberr-info-hidden', '(Cannot contact the database server)' ) );
 		}
 
-		$this->error = Html::element( 'span', array( 'dir' => 'ltr' ), $this->error );
+		# No database access
+		MessageCache::singleton()->disable();
 
-		$noconnect = "<h1>$sorry</h1><p>$again</p><p><small>$info</small></p>";
-		$text = str_replace( '$1', $this->error, $noconnect );
+		$text = "<h1>$sorry</h1><p>$again</p><p><small>$info</small></p>";
 
 		if ( $wgShowDBErrorBacktrace ) {
-			$text .= '<p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) );
+			$text .= '<p>Backtrace:</p><p>' .
+				nl2br( htmlspecialchars( $this->getTraceAsString() ) ) . '</p>';
 		}
 
-		$extra = $this->searchForm();
+		$text .= '<hr />';
+		$text .= $this->searchForm();
 
-		return "$text<hr />$extra";
+		return $text;
+	}
+
+	protected function getTextContent() {
+		global $wgShowHostnames, $wgShowSQLErrors;
+
+		if ( $wgShowHostnames || $wgShowSQLErrors ) {
+			return $this->getMessage();
+		} else {
+			return 'DB connection error';
+		}
 	}
 
 	public function reportHTML() {
@@ -188,7 +204,7 @@ class DBConnectionError extends DBError {
 					# Hack: extend the body for error messages
 					$cache = str_replace( array( '</html>', '</body>' ), '', $cache );
 					# Add cache notice...
-					$cache .= '<div style="color:red;font-size:150%;font-weight:bold;">'.
+					$cache .= '<div style="color:red;font-size:150%;font-weight:bold;">' .
 						htmlspecialchars( $this->msg( 'dberr-cachederror',
 							'This is a cached copy of the requested page, and may not be up to date. ' ) ) .
 						'</div>';
@@ -302,55 +318,107 @@ class DBQueryError extends DBError {
 	}
 
 	/**
-	 * @param $html string
+	 * @return boolean
+	 */
+	function isLoggable() {
+		// Don't send to the exception log, already in dberror log
+		return false;
+	}
+
+	/**
 	 * @return string
 	 */
-	function getContentMessage( $html ) {
-		if ( $this->useMessageCache() ) {
-			if ( $html ) {
-				$msg = 'dberrortext';
-				$sql = htmlspecialchars( $this->getSQL() );
-				$fname = htmlspecialchars( $this->fname );
-				$error = htmlspecialchars( $this->error );
-			} else {
-				$msg = 'dberrortextcl';
-				$sql = $this->getSQL();
-				$fname = $this->fname;
-				$error = $this->error;
+	function getPageTitle() {
+		return $this->msg( 'databaseerror', 'Database error' );
+	}
+
+	/**
+	 * @return string
+	 */
+	protected function getHTMLContent() {
+		$key = 'databaseerror-text';
+		$s = Html::element( 'p', array(), $this->msg( $key, $this->getFallbackMessage( $key ) ) );
+
+		$details = $this->getTechnicalDetails();
+		if ( $details ) {
+			$s .= '<ul>';
+			foreach ( $details as $key => $detail ) {
+				$s .= str_replace(
+					'$1', call_user_func_array( 'Html::element', $detail ),
+					Html::element( 'li', array(),
+						$this->msg( $key, $this->getFallbackMessage( $key ) )
+					)
+				);
 			}
-			return wfMessage( $msg )->rawParams( $sql, $fname, $this->errno, $error )->text();
-		} else {
-			return parent::getContentMessage( $html );
+			$s .= '</ul>';
 		}
+
+		return $s;
 	}
 
 	/**
-	 * @return String
+	 * @return string
 	 */
-	function getSQL() {
-		global $wgShowSQLErrors;
+	protected function getTextContent() {
+		$key = 'databaseerror-textcl';
+		$s = $this->msg( $key, $this->getFallbackMessage( $key ) ) . "\n";
 
-		if ( !$wgShowSQLErrors ) {
-			return $this->msg( 'sqlhidden', 'SQL hidden' );
-		} else {
-			return $this->sql;
+		foreach ( $this->getTechnicalDetails() as $key => $detail ) {
+			$s .= $this->msg( $key, $this->getFallbackMessage( $key ), $detail[2] ) . "\n";
 		}
+
+		return $s;
 	}
 
 	/**
-	 * @return bool
+	 * Make a list of technical details that can be shown to the user. This information can
+	 * aid in debugging yet may be useful to an attacker trying to exploit a security weakness
+	 * in the software or server configuration.
+	 *
+	 * Thus no such details are shown by default, though if $wgShowHostnames is true, only the
+	 * full SQL query is hidden; in fact, the error message often does contain a hostname, and
+	 * sites using this option probably don't care much about "security by obscurity". Of course,
+	 * if $wgShowSQLErrors is true, the SQL query *is* shown.
+	 *
+	 * @return array: Keys are message keys; values are arrays of arguments for Html::element().
+	 *   Array will be empty if users are not allowed to see any of these details at all.
 	 */
-	function getLogMessage() {
-		# Don't send to the exception log
-		return false;
+	protected function getTechnicalDetails() {
+		global $wgShowHostnames, $wgShowSQLErrors;
+
+		$attribs = array( 'dir' => 'ltr' );
+		$details = array();
+
+		if ( $wgShowSQLErrors ) {
+			$details['databaseerror-query'] = array(
+				'div', array( 'class' => 'mw-code' ) + $attribs, $this->sql );
+		}
+
+		if ( $wgShowHostnames || $wgShowSQLErrors ) {
+			$errorMessage = $this->errno . ' ' . $this->error;
+			$details['databaseerror-function'] = array( 'code', $attribs, $this->fname );
+			$details['databaseerror-error'] = array( 'samp', $attribs, $errorMessage );
+		}
+
+		return $details;
 	}
 
 	/**
-	 * @return String
+	 * @param string $key Message key
+	 * @return string: English message text
 	 */
-	function getPageTitle() {
-		return $this->msg( 'databaseerror', 'Database error' );
+	private function getFallbackMessage( $key ) {
+		$messages = array(
+			'databaseerror-text' => 'A database query error has occurred.
+This may indicate a bug in the software.',
+			'databaseerror-textcl' => 'A database query error has occurred.',
+			'databaseerror-query' => 'Query: $1',
+			'databaseerror-function' => 'Function: $1',
+			'databaseerror-error' => 'Error: $1',
+		);
+		return $messages[$key];
 	}
+
 }
 
 /**
diff --git a/includes/db/DatabaseMssql.php b/includes/db/DatabaseMssql.php
index 6c45ffaf..240a097c 100644
--- a/includes/db/DatabaseMssql.php
+++ b/includes/db/DatabaseMssql.php
@@ -37,24 +37,31 @@ class DatabaseMssql extends DatabaseBase {
 	function cascadingDeletes() {
 		return true;
 	}
+
 	function cleanupTriggers() {
 		return true;
 	}
+
 	function strictIPs() {
 		return true;
 	}
+
 	function realTimestamps() {
 		return true;
 	}
+
 	function implicitGroupby() {
 		return false;
 	}
+
 	function implicitOrderby() {
 		return false;
 	}
+
 	function functionalIndexes() {
 		return true;
 	}
+
 	function unionSupportsOrderAndLimit() {
 		return false;
 	}
@@ -89,7 +96,7 @@ class DatabaseMssql extends DatabaseBase {
 
 		$connectionInfo = array();
 
-		if( $dbName ) {
+		if ( $dbName ) {
 			$connectionInfo['Database'] = $dbName;
 		}
 
@@ -102,7 +109,7 @@ class DatabaseMssql extends DatabaseBase {
 		$ntAuthPassTest = strtolower( $password );
 
 		// Decide which auth scenerio to use
-		if( $ntAuthPassTest == 'ntauth' && $ntAuthUserTest == 'ntauth' ) {
+		if ( $ntAuthPassTest == 'ntauth' && $ntAuthUserTest == 'ntauth' ) {
 			// Don't add credentials to $connectionInfo
 		} else {
 			$connectionInfo['UID'] = $user;
@@ -148,7 +155,7 @@ class DatabaseMssql extends DatabaseBase {
 		}
 
 		// MSSQL doesn't have EXTRACT(epoch FROM XXX)
-		if ( preg_match('#\bEXTRACT\s*?\(\s*?EPOCH\s+FROM\b#i', $sql, $matches ) ) {
+		if ( preg_match( '#\bEXTRACT\s*?\(\s*?EPOCH\s+FROM\b#i', $sql, $matches ) ) {
 			// This is same as UNIX_TIMESTAMP, we need to calc # of seconds from 1970
 			$sql = str_replace( $matches[0], "DATEDIFF(s,CONVERT(datetime,'1/1/1970'),", $sql );
 		}
@@ -202,9 +209,9 @@ class DatabaseMssql extends DatabaseBase {
 		$retErrors = sqlsrv_errors( SQLSRV_ERR_ALL );
 		if ( $retErrors != null ) {
 			foreach ( $retErrors as $arrError ) {
-				$strRet .= "SQLState: " . $arrError[ 'SQLSTATE'] . "\n";
-				$strRet .= "Error Code: " . $arrError[ 'code'] . "\n";
-				$strRet .= "Message: " . $arrError[ 'message'] . "\n";
+				$strRet .= "SQLState: " . $arrError['SQLSTATE'] . "\n";
+				$strRet .= "Error Code: " . $arrError['code'] . "\n";
+				$strRet .= "Message: " . $arrError['message'] . "\n";
 			}
 		} else {
 			$strRet = "No errors found";
@@ -290,7 +297,7 @@ class DatabaseMssql extends DatabaseBase {
 	 *						   (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
 	 * @return Mixed: database result resource (feed to Database::fetchObject or whatever), or false on failure
 	 */
-	function select( $table, $vars, $conds = '', $fname = 'DatabaseMssql::select', $options = array(), $join_conds = array() )
+	function select( $table, $vars, $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array() )
 	{
 		$sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
 		if ( isset( $options['EXPLAIN'] ) ) {
@@ -315,7 +322,7 @@ class DatabaseMssql extends DatabaseBase {
 	 *                    (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
 	 * @return string, the SQL text
 	 */
-	function selectSQLText( $table, $vars, $conds = '', $fname = 'DatabaseMssql::select', $options = array(), $join_conds = array() ) {
+	function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array() ) {
 		if ( isset( $options['EXPLAIN'] ) ) {
 			unset( $options['EXPLAIN'] );
 		}
@@ -330,14 +337,16 @@ class DatabaseMssql extends DatabaseBase {
 	 * Takes same arguments as Database::select()
 	 * @return int
 	 */
-	function estimateRowCount( $table, $vars = '*', $conds = '', $fname = 'DatabaseMssql::estimateRowCount', $options = array() ) {
+	function estimateRowCount( $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array() ) {
 		$options['EXPLAIN'] = true;// http://msdn2.microsoft.com/en-us/library/aa259203.aspx
 		$res = $this->select( $table, $vars, $conds, $fname, $options );
 
 		$rows = -1;
 		if ( $res ) {
 			$row = $this->fetchRow( $res );
-			if ( isset( $row['EstimateRows'] ) ) $rows = $row['EstimateRows'];
+			if ( isset( $row['EstimateRows'] ) ) {
+				$rows = $row['EstimateRows'];
+			}
 		}
 		return $rows;
 	}
@@ -347,7 +356,7 @@ class DatabaseMssql extends DatabaseBase {
 	 * If errors are explicitly ignored, returns NULL on failure
 	 * @return array|bool|null
 	 */
-	function indexInfo( $table, $index, $fname = 'DatabaseMssql::indexExists' ) {
+	function indexInfo( $table, $index, $fname = __METHOD__ ) {
 		# This does not return the same info as MYSQL would, but that's OK because MediaWiki never uses the
 		# returned value except to check for the existance of indexes.
 		$sql = "sp_helpindex '" . $table . "'";
@@ -392,7 +401,7 @@ class DatabaseMssql extends DatabaseBase {
 	 * @throws DBQueryError
 	 * @return bool
 	 */
-	function insert( $table, $arrToInsert, $fname = 'DatabaseMssql::insert', $options = array() ) {
+	function insert( $table, $arrToInsert, $fname = __METHOD__, $options = array() ) {
 		# No rows to insert, easy just return now
 		if ( !count( $arrToInsert ) ) {
 			return true;
@@ -414,7 +423,7 @@ class DatabaseMssql extends DatabaseBase {
 		$identity = null;
 		$tableRaw = preg_replace( '#\[([^\]]*)\]#', '$1', $table ); // strip matching square brackets from table name
 		$res = $this->doQuery( "SELECT NAME AS idColumn FROM SYS.IDENTITY_COLUMNS WHERE OBJECT_NAME(OBJECT_ID)='{$tableRaw}'" );
-		if( $res && $res->numrows() ) {
+		if ( $res && $res->numrows() ) {
 			// There is an identity for this table.
 			$identity = array_pop( $res->fetch( SQLSRV_FETCH_ASSOC ) );
 		}
@@ -427,11 +436,11 @@ class DatabaseMssql extends DatabaseBase {
 			$identityClause = '';
 
 			// if we have an identity column
-			if( $identity ) {
+			if ( $identity ) {
 				// iterate through
-				foreach ($a as $k => $v ) {
+				foreach ( $a as $k => $v ) {
 					if ( $k == $identity ) {
-						if( !is_null($v) ) {
+						if ( !is_null( $v ) ) {
 							// there is a value being passed to us, we need to turn on and off inserted identity
 							$sqlPre = "SET IDENTITY_INSERT $table ON;";
 							$sqlPost = ";SET IDENTITY_INSERT $table OFF;";
@@ -501,7 +510,7 @@ class DatabaseMssql extends DatabaseBase {
 			} elseif ( $ret != null ) {
 				// remember number of rows affected
 				$this->mAffectedRows = sqlsrv_rows_affected( $ret );
-				if ( !is_null($identity) ) {
+				if ( !is_null( $identity ) ) {
 					// then we want to get the identity column value we were assigned and save it off
 					$row = sqlsrv_fetch_object( $ret );
 					$this->mInsertId = $row->$identity;
@@ -530,7 +539,7 @@ class DatabaseMssql extends DatabaseBase {
 	 * @throws DBQueryError
 	 * @return null|ResultWrapper
 	 */
-	function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabaseMssql::insertSelect',
+	function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
 		$insertOptions = array(), $selectOptions = array() ) {
 		$ret = parent::insertSelect( $destTable, $srcTable, $varMap, $conds, $fname, $insertOptions, $selectOptions );
 
@@ -645,7 +654,7 @@ class DatabaseMssql extends DatabaseBase {
 	/**
 	 * @return string wikitext of a link to the server software's web site
 	 */
-	public static function getSoftwareLink() {
+	public function getSoftwareLink() {
 		return "[http://www.microsoft.com/sql/ MS SQL Server]";
 	}
 
@@ -661,11 +670,11 @@ class DatabaseMssql extends DatabaseBase {
 		return $version;
 	}
 
-	function tableExists ( $table, $fname = __METHOD__, $schema = false ) {
+	function tableExists( $table, $fname = __METHOD__, $schema = false ) {
 		$res = sqlsrv_query( $this->mConn, "SELECT * FROM information_schema.tables
 			WHERE table_type='BASE TABLE' AND table_name = '$table'" );
 		if ( $res === false ) {
-			print( "Error in tableExists query: " . $this->getErrors() );
+			print "Error in tableExists query: " . $this->getErrors();
 			return false;
 		}
 		if ( sqlsrv_fetch( $res ) ) {
@@ -679,12 +688,12 @@ class DatabaseMssql extends DatabaseBase {
 	 * Query whether a given column exists in the mediawiki schema
 	 * @return bool
 	 */
-	function fieldExists( $table, $field, $fname = 'DatabaseMssql::fieldExists' ) {
+	function fieldExists( $table, $field, $fname = __METHOD__ ) {
 		$table = $this->tableName( $table );
 		$res = sqlsrv_query( $this->mConn, "SELECT DATA_TYPE FROM INFORMATION_SCHEMA.Columns
 			WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
 		if ( $res === false ) {
-			print( "Error in fieldExists query: " . $this->getErrors() );
+			print "Error in fieldExists query: " . $this->getErrors();
 			return false;
 		}
 		if ( sqlsrv_fetch( $res ) ) {
@@ -699,7 +708,7 @@ class DatabaseMssql extends DatabaseBase {
 		$res = sqlsrv_query( $this->mConn, "SELECT * FROM INFORMATION_SCHEMA.Columns
 			WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
 		if ( $res === false ) {
-			print( "Error in fieldInfo query: " . $this->getErrors() );
+			print "Error in fieldInfo query: " . $this->getErrors();
 			return false;
 		}
 		$meta = $this->fetchRow( $res );
@@ -712,7 +721,7 @@ class DatabaseMssql extends DatabaseBase {
 	/**
 	 * Begin a transaction, committing any previously open transaction
 	 */
-	protected function doBegin( $fname = 'DatabaseMssql::begin' ) {
+	protected function doBegin( $fname = __METHOD__ ) {
 		sqlsrv_begin_transaction( $this->mConn );
 		$this->mTrxLevel = 1;
 	}
@@ -720,7 +729,7 @@ class DatabaseMssql extends DatabaseBase {
 	/**
 	 * End a transaction
 	 */
-	protected function doCommit( $fname = 'DatabaseMssql::commit' ) {
+	protected function doCommit( $fname = __METHOD__ ) {
 		sqlsrv_commit( $this->mConn );
 		$this->mTrxLevel = 0;
 	}
@@ -729,7 +738,7 @@ class DatabaseMssql extends DatabaseBase {
 	 * Rollback a transaction.
 	 * No-op on non-transactional databases.
 	 */
-	protected function doRollback( $fname = 'DatabaseMssql::rollback' ) {
+	protected function doRollback( $fname = __METHOD__ ) {
 		sqlsrv_rollback( $this->mConn );
 		$this->mTrxLevel = 0;
 	}
@@ -952,7 +961,7 @@ class DatabaseMssql extends DatabaseBase {
  */
 class MssqlField implements Field {
 	private $name, $tablename, $default, $max_length, $nullable, $type;
-	function __construct ( $info ) {
+	function __construct( $info ) {
 		$this->name = $info['COLUMN_NAME'];
 		$this->tablename = $info['TABLE_NAME'];
 		$this->default = $info['COLUMN_DEFAULT'];
@@ -1002,7 +1011,7 @@ class MssqlResult {
 
 		$rows = sqlsrv_fetch_array( $queryresult, SQLSRV_FETCH_ASSOC );
 
-		foreach( $rows as $row ) {
+		foreach ( $rows as $row ) {
 			if ( $row !== null ) {
 				foreach ( $row as $k => $v ) {
 					if ( is_object( $v ) && method_exists( $v, 'format' ) ) {// DateTime Object
@@ -1040,7 +1049,7 @@ class MssqlResult {
 				$arrNum[] = $value;
 			}
 		}
-		switch( $mode ) {
+		switch ( $mode ) {
 			case SQLSRV_FETCH_ASSOC:
 				$ret = $this->mRows[$this->mCursor];
 				break;
@@ -1093,37 +1102,96 @@ class MssqlResult {
 			$i++;
 		}
 		// http://msdn.microsoft.com/en-us/library/cc296183.aspx contains type table
-		switch( $intType ) {
-			case SQLSRV_SQLTYPE_BIGINT: 		$strType = 'bigint'; break;
-			case SQLSRV_SQLTYPE_BINARY: 		$strType = 'binary'; break;
-			case SQLSRV_SQLTYPE_BIT: 			$strType = 'bit'; break;
-			case SQLSRV_SQLTYPE_CHAR: 			$strType = 'char'; break;
-			case SQLSRV_SQLTYPE_DATETIME: 		$strType = 'datetime'; break;
-			case SQLSRV_SQLTYPE_DECIMAL/*($precision, $scale)*/: $strType = 'decimal'; break;
-			case SQLSRV_SQLTYPE_FLOAT: 			$strType = 'float'; break;
-			case SQLSRV_SQLTYPE_IMAGE: 			$strType = 'image'; break;
-			case SQLSRV_SQLTYPE_INT: 			$strType = 'int'; break;
-			case SQLSRV_SQLTYPE_MONEY: 			$strType = 'money'; break;
-			case SQLSRV_SQLTYPE_NCHAR/*($charCount)*/: $strType = 'nchar'; break;
-			case SQLSRV_SQLTYPE_NUMERIC/*($precision, $scale)*/: $strType = 'numeric'; break;
-			case SQLSRV_SQLTYPE_NVARCHAR/*($charCount)*/: $strType = 'nvarchar'; break;
-			// case SQLSRV_SQLTYPE_NVARCHAR('max'): $strType = 'nvarchar(MAX)'; break;
-			case SQLSRV_SQLTYPE_NTEXT: 			$strType = 'ntext'; break;
-			case SQLSRV_SQLTYPE_REAL: 			$strType = 'real'; break;
-			case SQLSRV_SQLTYPE_SMALLDATETIME: 	$strType = 'smalldatetime'; break;
-			case SQLSRV_SQLTYPE_SMALLINT: 		$strType = 'smallint'; break;
-			case SQLSRV_SQLTYPE_SMALLMONEY: 	$strType = 'smallmoney'; break;
-			case SQLSRV_SQLTYPE_TEXT: 			$strType = 'text'; break;
-			case SQLSRV_SQLTYPE_TIMESTAMP: 		$strType = 'timestamp'; break;
-			case SQLSRV_SQLTYPE_TINYINT: 		$strType = 'tinyint'; break;
-			case SQLSRV_SQLTYPE_UNIQUEIDENTIFIER: $strType = 'uniqueidentifier'; break;
-			case SQLSRV_SQLTYPE_UDT: 			$strType = 'UDT'; break;
-			case SQLSRV_SQLTYPE_VARBINARY/*($byteCount)*/: $strType = 'varbinary'; break;
-			// case SQLSRV_SQLTYPE_VARBINARY('max'): $strType = 'varbinary(MAX)'; break;
-			case SQLSRV_SQLTYPE_VARCHAR/*($charCount)*/: $strType = 'varchar'; break;
-			// case SQLSRV_SQLTYPE_VARCHAR('max'): $strType = 'varchar(MAX)'; break;
-			case SQLSRV_SQLTYPE_XML: 			$strType = 'xml'; break;
-			default: $strType = $intType;
+		switch ( $intType ) {
+			case SQLSRV_SQLTYPE_BIGINT:
+				$strType = 'bigint';
+				break;
+			case SQLSRV_SQLTYPE_BINARY:
+				$strType = 'binary';
+				break;
+			case SQLSRV_SQLTYPE_BIT:
+				$strType = 'bit';
+				break;
+			case SQLSRV_SQLTYPE_CHAR:
+				$strType = 'char';
+				break;
+			case SQLSRV_SQLTYPE_DATETIME:
+				$strType = 'datetime';
+				break;
+			case SQLSRV_SQLTYPE_DECIMAL: // ($precision, $scale)
+				$strType = 'decimal';
+				break;
+			case SQLSRV_SQLTYPE_FLOAT:
+				$strType = 'float';
+				break;
+			case SQLSRV_SQLTYPE_IMAGE:
+				$strType = 'image';
+				break;
+			case SQLSRV_SQLTYPE_INT:
+				$strType = 'int';
+				break;
+			case SQLSRV_SQLTYPE_MONEY:
+				$strType = 'money';
+				break;
+			case SQLSRV_SQLTYPE_NCHAR: // ($charCount):
+				$strType = 'nchar';
+				break;
+			case SQLSRV_SQLTYPE_NUMERIC: // ($precision, $scale):
+				$strType = 'numeric';
+				break;
+			case SQLSRV_SQLTYPE_NVARCHAR: // ($charCount)
+				$strType = 'nvarchar';
+				break;
+			// case SQLSRV_SQLTYPE_NVARCHAR('max'):
+			//	 $strType = 'nvarchar(MAX)';
+			//	 break;
+			case SQLSRV_SQLTYPE_NTEXT:
+				$strType = 'ntext';
+				break;
+			case SQLSRV_SQLTYPE_REAL:
+				$strType = 'real';
+				break;
+			case SQLSRV_SQLTYPE_SMALLDATETIME:
+				$strType = 'smalldatetime';
+				break;
+			case SQLSRV_SQLTYPE_SMALLINT:
+				$strType = 'smallint';
+				break;
+			case SQLSRV_SQLTYPE_SMALLMONEY:
+				$strType = 'smallmoney';
+				break;
+			case SQLSRV_SQLTYPE_TEXT:
+				$strType = 'text';
+				break;
+			case SQLSRV_SQLTYPE_TIMESTAMP:
+				$strType = 'timestamp';
+				break;
+			case SQLSRV_SQLTYPE_TINYINT:
+				$strType = 'tinyint';
+				break;
+			case SQLSRV_SQLTYPE_UNIQUEIDENTIFIER:
+				$strType = 'uniqueidentifier';
+				break;
+			case SQLSRV_SQLTYPE_UDT:
+				$strType = 'UDT';
+				break;
+			case SQLSRV_SQLTYPE_VARBINARY: // ($byteCount)
+				$strType = 'varbinary';
+				break;
+			// case SQLSRV_SQLTYPE_VARBINARY('max'):
+			//	 $strType = 'varbinary(MAX)';
+			//	 break;
+			case SQLSRV_SQLTYPE_VARCHAR: // ($charCount)
+				$strType = 'varchar';
+				break;
+			// case SQLSRV_SQLTYPE_VARCHAR('max'):
+			//	 $strType = 'varchar(MAX)';
+			//	 break;
+			case SQLSRV_SQLTYPE_XML:
+				$strType = 'xml';
+				break;
+			default:
+				$strType = $intType;
 		}
 		return $strType;
 	}
diff --git a/includes/db/DatabaseMysql.php b/includes/db/DatabaseMysql.php
index 27aae188..956bb694 100644
--- a/includes/db/DatabaseMysql.php
+++ b/includes/db/DatabaseMysql.php
@@ -22,27 +22,19 @@
  */
 
 /**
- * Database abstraction object for mySQL
- * Inherit all methods and properties of Database::Database()
+ * Database abstraction object for PHP extension mysql.
  *
  * @ingroup Database
  * @see Database
  */
-class DatabaseMysql extends DatabaseBase {
-
-	/**
-	 * @return string
-	 */
-	function getType() {
-		return 'mysql';
-	}
+class DatabaseMysql extends DatabaseMysqlBase {
 
 	/**
 	 * @param $sql string
 	 * @return resource
 	 */
 	protected function doQuery( $sql ) {
-		if( $this->bufferResults() ) {
+		if ( $this->bufferResults() ) {
 			$ret = mysql_query( $sql, $this->mConn );
 		} else {
 			$ret = mysql_unbuffered_query( $sql, $this->mConn );
@@ -50,39 +42,13 @@ class DatabaseMysql extends DatabaseBase {
 		return $ret;
 	}
 
-	/**
-	 * @param $server string
-	 * @param $user string
-	 * @param $password string
-	 * @param $dbName string
-	 * @return bool
-	 * @throws DBConnectionError
-	 */
-	function open( $server, $user, $password, $dbName ) {
-		global $wgAllDBsAreLocalhost, $wgDBmysql5, $wgSQLMode;
-		wfProfileIn( __METHOD__ );
-
-		# Load mysql.so if we don't have it
-		wfDl( 'mysql' );
-
+	protected function mysqlConnect( $realServer ) {
 		# Fail now
 		# Otherwise we get a suppressed fatal error, which is very hard to track down
-		if ( !function_exists( 'mysql_connect' ) ) {
+		if ( !extension_loaded( 'mysql' ) ) {
 			throw new DBConnectionError( $this, "MySQL functions missing, have you compiled PHP with the --with-mysql option?\n" );
 		}
 
-		# Debugging hack -- fake cluster
-		if ( $wgAllDBsAreLocalhost ) {
-			$realServer = 'localhost';
-		} else {
-			$realServer = $server;
-		}
-		$this->close();
-		$this->mServer = $server;
-		$this->mUser = $user;
-		$this->mPassword = $password;
-		$this->mDBname = $dbName;
-
 		$connFlags = 0;
 		if ( $this->mFlags & DBO_SSL ) {
 			$connFlags |= MYSQL_CLIENT_SSL;
@@ -91,81 +57,27 @@ class DatabaseMysql extends DatabaseBase {
 			$connFlags |= MYSQL_CLIENT_COMPRESS;
 		}
 
-		wfProfileIn( "dbconnect-$server" );
-
-		# The kernel's default SYN retransmission period is far too slow for us,
-		# so we use a short timeout plus a manual retry. Retrying means that a small
-		# but finite rate of SYN packet loss won't cause user-visible errors.
-		$this->mConn = false;
 		if ( ini_get( 'mysql.connect_timeout' ) <= 3 ) {
 			$numAttempts = 2;
 		} else {
 			$numAttempts = 1;
 		}
-		$this->installErrorHandler();
-		for ( $i = 0; $i < $numAttempts && !$this->mConn; $i++ ) {
+
+		$conn = false;
+
+		for ( $i = 0; $i < $numAttempts && !$conn; $i++ ) {
 			if ( $i > 1 ) {
 				usleep( 1000 );
 			}
 			if ( $this->mFlags & DBO_PERSISTENT ) {
-				$this->mConn = mysql_pconnect( $realServer, $user, $password, $connFlags );
+				$conn = mysql_pconnect( $realServer, $this->mUser, $this->mPassword, $connFlags );
 			} else {
 				# Create a new connection...
-				$this->mConn = mysql_connect( $realServer, $user, $password, true, $connFlags );
-			}
-			#if ( $this->mConn === false ) {
-				#$iplus = $i + 1;
-				#wfLogDBError("Connect loop error $iplus of $max ($server): " . mysql_errno() . " - " . mysql_error()."\n");
-			#}
-		}
-		$error = $this->restoreErrorHandler();
-
-		wfProfileOut( "dbconnect-$server" );
-
-		# Always log connection errors
-		if ( !$this->mConn ) {
-			if ( !$error ) {
-				$error = $this->lastError();
-			}
-			wfLogDBError( "Error connecting to {$this->mServer}: $error\n" );
-			wfDebug( "DB connection error\n" .
-				"Server: $server, User: $user, Password: " .
-				substr( $password, 0, 3 ) . "..., error: " . $error . "\n" );
-
-			wfProfileOut( __METHOD__ );
-			return $this->reportConnectionError( $error );
-		}
-
-		if ( $dbName != '' ) {
-			wfSuppressWarnings();
-			$success = mysql_select_db( $dbName, $this->mConn );
-			wfRestoreWarnings();
-			if ( !$success ) {
-				wfLogDBError( "Error selecting database $dbName on server {$this->mServer}\n" );
-				wfDebug( "Error selecting database $dbName on server {$this->mServer} " .
-					"from client host " . wfHostname() . "\n" );
-
-				wfProfileOut( __METHOD__ );
-				return $this->reportConnectionError( "Error selecting database $dbName" );
+				$conn = mysql_connect( $realServer, $this->mUser, $this->mPassword, true, $connFlags );
 			}
 		}
 
-		// Tell the server we're communicating with it in UTF-8.
-		// This may engage various charset conversions.
-		if( $wgDBmysql5 ) {
-			$this->query( 'SET NAMES utf8', __METHOD__ );
-		} else {
-			$this->query( 'SET NAMES binary', __METHOD__ );
-		}
-		// Set SQL mode, default is turning them all off, can be overridden or skipped with null
-		if ( is_string( $wgSQLMode ) ) {
-			$mode = $this->addQuotes( $wgSQLMode );
-			$this->query( "SET sql_mode = $mode", __METHOD__ );
-		}
-
-		$this->mOpened = true;
-		wfProfileOut( __METHOD__ );
-		return true;
+		return $conn;
 	}
 
 	/**
@@ -175,113 +87,6 @@ class DatabaseMysql extends DatabaseBase {
 		return mysql_close( $this->mConn );
 	}
 
-	/**
-	 * @param $res ResultWrapper
-	 * @throws DBUnexpectedError
-	 */
-	function freeResult( $res ) {
-		if ( $res instanceof ResultWrapper ) {
-			$res = $res->result;
-		}
-		wfSuppressWarnings();
-		$ok = mysql_free_result( $res );
-		wfRestoreWarnings();
-		if ( !$ok ) {
-			throw new DBUnexpectedError( $this, "Unable to free MySQL result" );
-		}
-	}
-
-	/**
-	 * @param $res ResultWrapper
-	 * @return object|bool
-	 * @throws DBUnexpectedError
-	 */
-	function fetchObject( $res ) {
-		if ( $res instanceof ResultWrapper ) {
-			$res = $res->result;
-		}
-		wfSuppressWarnings();
-		$row = mysql_fetch_object( $res );
-		wfRestoreWarnings();
-
-		$errno = $this->lastErrno();
-		// Unfortunately, mysql_fetch_object does not reset the last errno.
-		// Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
-		// these are the only errors mysql_fetch_object can cause.
-		// See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
-		if( $errno == 2000 || $errno == 2013 ) {
-			throw new DBUnexpectedError( $this, 'Error in fetchObject(): ' . htmlspecialchars( $this->lastError() ) );
-		}
-		return $row;
-	}
-
-	/**
-	 * @param $res ResultWrapper
-	 * @return array|bool
-	 * @throws DBUnexpectedError
-	 */
-	function fetchRow( $res ) {
-		if ( $res instanceof ResultWrapper ) {
-			$res = $res->result;
-		}
-		wfSuppressWarnings();
-		$row = mysql_fetch_array( $res );
-		wfRestoreWarnings();
-
-		$errno = $this->lastErrno();
-		// Unfortunately, mysql_fetch_array does not reset the last errno.
-		// Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
-		// these are the only errors mysql_fetch_object can cause.
-		// See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
-		if( $errno == 2000 || $errno == 2013 ) {
-			throw new DBUnexpectedError( $this, 'Error in fetchRow(): ' . htmlspecialchars( $this->lastError() ) );
-		}
-		return $row;
-	}
-
-	/**
-	 * @throws DBUnexpectedError
-	 * @param $res ResultWrapper
-	 * @return int
-	 */
-	function numRows( $res ) {
-		if ( $res instanceof ResultWrapper ) {
-			$res = $res->result;
-		}
-		wfSuppressWarnings();
-		$n = mysql_num_rows( $res );
-		wfRestoreWarnings();
-		// Unfortunately, mysql_num_rows does not reset the last errno.
-		// We are not checking for any errors here, since
-		// these are no errors mysql_num_rows can cause.
-		// See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
-		// See https://bugzilla.wikimedia.org/42430
-		return $n;
-	}
-
-	/**
-	 * @param $res ResultWrapper
-	 * @return int
-	 */
-	function numFields( $res ) {
-		if ( $res instanceof ResultWrapper ) {
-			$res = $res->result;
-		}
-		return mysql_num_fields( $res );
-	}
-
-	/**
-	 * @param $res ResultWrapper
-	 * @param $n string
-	 * @return string
-	 */
-	function fieldName( $res, $n ) {
-		if ( $res instanceof ResultWrapper ) {
-			$res = $res->result;
-		}
-		return mysql_field_name( $res, $n );
-	}
-
 	/**
 	 * @return int
 	 */
@@ -289,18 +94,6 @@ class DatabaseMysql extends DatabaseBase {
 		return mysql_insert_id( $this->mConn );
 	}
 
-	/**
-	 * @param $res ResultWrapper
-	 * @param $row
-	 * @return bool
-	 */
-	function dataSeek( $res, $row ) {
-		if ( $res instanceof ResultWrapper ) {
-			$res = $res->result;
-		}
-		return mysql_data_seek( $res, $row );
-	}
-
 	/**
 	 * @return int
 	 */
@@ -312,27 +105,6 @@ class DatabaseMysql extends DatabaseBase {
 		}
 	}
 
-	/**
-	 * @return string
-	 */
-	function lastError() {
-		if ( $this->mConn ) {
-			# Even if it's non-zero, it can still be invalid
-			wfSuppressWarnings();
-			$error = mysql_error( $this->mConn );
-			if ( !$error ) {
-				$error = mysql_error();
-			}
-			wfRestoreWarnings();
-		} else {
-			$error = mysql_error();
-		}
-		if( $error ) {
-			$error .= ' (' . $this->mServer . ')';
-		}
-		return $error;
-	}
-
 	/**
 	 * @return int
 	 */
@@ -340,100 +112,6 @@ class DatabaseMysql extends DatabaseBase {
 		return mysql_affected_rows( $this->mConn );
 	}
 
-	/**
-	 * @param $table string
-	 * @param $uniqueIndexes
-	 * @param $rows array
-	 * @param $fname string
-	 * @return ResultWrapper
-	 */
-	function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseMysql::replace' ) {
-		return $this->nativeReplace( $table, $rows, $fname );
-	}
-
-	/**
-	 * Estimate rows in dataset
-	 * Returns estimated count, based on EXPLAIN output
-	 * Takes same arguments as Database::select()
-	 *
-	 * @param $table string|array
-	 * @param $vars string|array
-	 * @param $conds string|array
-	 * @param $fname string
-	 * @param $options string|array
-	 * @return int
-	 */
-	public function estimateRowCount( $table, $vars = '*', $conds = '', $fname = 'DatabaseMysql::estimateRowCount', $options = array() ) {
-		$options['EXPLAIN'] = true;
-		$res = $this->select( $table, $vars, $conds, $fname, $options );
-		if ( $res === false ) {
-			return false;
-		}
-		if ( !$this->numRows( $res ) ) {
-			return 0;
-		}
-
-		$rows = 1;
-		foreach ( $res as $plan ) {
-			$rows *= $plan->rows > 0 ? $plan->rows : 1; // avoid resetting to zero
-		}
-		return $rows;
-	}
-
-	/**
-	 * @param $table string
-	 * @param $field string
-	 * @return bool|MySQLField
-	 */
-	function fieldInfo( $table, $field ) {
-		$table = $this->tableName( $table );
-		$res = $this->query( "SELECT * FROM $table LIMIT 1", __METHOD__, true );
-		if ( !$res ) {
-			return false;
-		}
-		$n = mysql_num_fields( $res->result );
-		for( $i = 0; $i < $n; $i++ ) {
-			$meta = mysql_fetch_field( $res->result, $i );
-			if( $field == $meta->name ) {
-				return new MySQLField( $meta );
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Get information about an index into an object
-	 * Returns false if the index does not exist
-	 *
-	 * @param $table string
-	 * @param $index string
-	 * @param $fname string
-	 * @return bool|array|null False or null on failure
-	 */
-	function indexInfo( $table, $index, $fname = 'DatabaseMysql::indexInfo' ) {
-		# SHOW INDEX works in MySQL 3.23.58, but SHOW INDEXES does not.
-		# SHOW INDEX should work for 3.x and up:
-		# http://dev.mysql.com/doc/mysql/en/SHOW_INDEX.html
-		$table = $this->tableName( $table );
-		$index = $this->indexName( $index );
-
-		$sql = 'SHOW INDEX FROM ' . $table;
-		$res = $this->query( $sql, $fname );
-
-		if ( !$res ) {
-			return null;
-		}
-
-		$result = array();
-
-		foreach ( $res as $row ) {
-			if ( $row->Key_name == $index ) {
-				$result[] = $row;
-			}
-		}
-		return empty( $result ) ? false : $result;
-	}
-
 	/**
 	 * @param $db
 	 * @return bool
@@ -443,208 +121,6 @@ class DatabaseMysql extends DatabaseBase {
 		return mysql_select_db( $db, $this->mConn );
 	}
 
-	/**
-	 * @param $s string
-	 *
-	 * @return string
-	 */
-	function strencode( $s ) {
-		$sQuoted = mysql_real_escape_string( $s, $this->mConn );
-
-		if( $sQuoted === false ) {
-			$this->ping();
-			$sQuoted = mysql_real_escape_string( $s, $this->mConn );
-		}
-		return $sQuoted;
-	}
-
-	/**
-	 * MySQL uses `backticks` for identifier quoting instead of the sql standard "double quotes".
-	 *
-	 * @param $s string
-	 *
-	 * @return string
-	 */
-	public function addIdentifierQuotes( $s ) {
-		return "`" . $this->strencode( $s ) . "`";
-	}
-
-	/**
-	 * @param $name string
-	 * @return bool
-	 */
-	public function isQuotedIdentifier( $name ) {
-		return strlen( $name ) && $name[0] == '`' && substr( $name, -1, 1 ) == '`';
-	}
-
-	/**
-	 * @return bool
-	 */
-	function ping() {
-		$ping = mysql_ping( $this->mConn );
-		if ( $ping ) {
-			return true;
-		}
-
-		mysql_close( $this->mConn );
-		$this->mOpened = false;
-		$this->mConn = false;
-		$this->open( $this->mServer, $this->mUser, $this->mPassword, $this->mDBname );
-		return true;
-	}
-
-	/**
-	 * Returns slave lag.
-	 *
-	 * This will do a SHOW SLAVE STATUS
-	 *
-	 * @return int
-	 */
-	function getLag() {
-		if ( !is_null( $this->mFakeSlaveLag ) ) {
-			wfDebug( "getLag: fake slave lagged {$this->mFakeSlaveLag} seconds\n" );
-			return $this->mFakeSlaveLag;
-		}
-
-		return $this->getLagFromSlaveStatus();
-	}
-
-	/**
-	 * @return bool|int
-	 */
-	function getLagFromSlaveStatus() {
-		$res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
-		if ( !$res ) {
-			return false;
-		}
-		$row = $res->fetchObject();
-		if ( !$row ) {
-			return false;
-		}
-		if ( strval( $row->Seconds_Behind_Master ) === '' ) {
-			return false;
-		} else {
-			return intval( $row->Seconds_Behind_Master );
-		}
-	}
-
-	/**
-	 * @deprecated in 1.19, use getLagFromSlaveStatus
-	 *
-	 * @return bool|int
-	 */
-	function getLagFromProcesslist() {
-		wfDeprecated( __METHOD__, '1.19' );
-		$res = $this->query( 'SHOW PROCESSLIST', __METHOD__ );
-		if( !$res ) {
-			return false;
-		}
-		# Find slave SQL thread
-		foreach( $res as $row ) {
-			/* This should work for most situations - when default db
-			 * for thread is not specified, it had no events executed,
-			 * and therefore it doesn't know yet how lagged it is.
-			 *
-			 * Relay log I/O thread does not select databases.
-			 */
-			if ( $row->User == 'system user' &&
-				$row->State != 'Waiting for master to send event' &&
-				$row->State != 'Connecting to master' &&
-				$row->State != 'Queueing master event to the relay log' &&
-				$row->State != 'Waiting for master update' &&
-				$row->State != 'Requesting binlog dump' &&
-				$row->State != 'Waiting to reconnect after a failed master event read' &&
-				$row->State != 'Reconnecting after a failed master event read' &&
-				$row->State != 'Registering slave on master'
-				) {
-				# This is it, return the time (except -ve)
-				if ( $row->Time > 0x7fffffff ) {
-					return false;
-				} else {
-					return $row->Time;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Wait for the slave to catch up to a given master position.
-	 *
-	 * @param $pos DBMasterPos object
-	 * @param $timeout Integer: the maximum number of seconds to wait for synchronisation
-	 * @return bool|string
-	 */
-	function masterPosWait( DBMasterPos $pos, $timeout ) {
-		$fname = 'DatabaseBase::masterPosWait';
-		wfProfileIn( $fname );
-
-		# Commit any open transactions
-		if ( $this->mTrxLevel ) {
-			$this->commit( __METHOD__ );
-		}
-
-		if ( !is_null( $this->mFakeSlaveLag ) ) {
-			$status = parent::masterPosWait( $pos, $timeout );
-			wfProfileOut( $fname );
-			return $status;
-		}
-
-		# Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
-		$encFile = $this->addQuotes( $pos->file );
-		$encPos = intval( $pos->pos );
-		$sql = "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)";
-		$res = $this->doQuery( $sql );
-
-		if ( $res && $row = $this->fetchRow( $res ) ) {
-			wfProfileOut( $fname );
-			return $row[0];
-		}
-		wfProfileOut( $fname );
-		return false;
-	}
-
-	/**
-	 * Get the position of the master from SHOW SLAVE STATUS
-	 *
-	 * @return MySQLMasterPos|bool
-	 */
-	function getSlavePos() {
-		if ( !is_null( $this->mFakeSlaveLag ) ) {
-			return parent::getSlavePos();
-		}
-
-		$res = $this->query( 'SHOW SLAVE STATUS', 'DatabaseBase::getSlavePos' );
-		$row = $this->fetchObject( $res );
-
-		if ( $row ) {
-			$pos = isset( $row->Exec_master_log_pos ) ? $row->Exec_master_log_pos : $row->Exec_Master_Log_Pos;
-			return new MySQLMasterPos( $row->Relay_Master_Log_File, $pos );
-		} else {
-			return false;
-		}
-	}
-
-	/**
-	 * Get the position of the master from SHOW MASTER STATUS
-	 *
-	 * @return MySQLMasterPos|bool
-	 */
-	function getMasterPos() {
-		if ( $this->mFakeMaster ) {
-			return parent::getMasterPos();
-		}
-
-		$res = $this->query( 'SHOW MASTER STATUS', 'DatabaseBase::getMasterPos' );
-		$row = $this->fetchObject( $res );
-
-		if ( $row ) {
-			return new MySQLMasterPos( $row->File, $row->Position );
-		} else {
-			return false;
-		}
-	}
-
 	/**
 	 * @return string
 	 */
@@ -652,388 +128,47 @@ class DatabaseMysql extends DatabaseBase {
 		return mysql_get_server_info( $this->mConn );
 	}
 
-	/**
-	 * @param $index
-	 * @return string
-	 */
-	function useIndexClause( $index ) {
-		return "FORCE INDEX (" . $this->indexName( $index ) . ")";
-	}
-
-	/**
-	 * @return string
-	 */
-	function lowPriorityOption() {
-		return 'LOW_PRIORITY';
+	protected function mysqlFreeResult( $res ) {
+		return mysql_free_result( $res );
 	}
 
-	/**
-	 * @return string
-	 */
-	public static function getSoftwareLink() {
-		return '[http://www.mysql.com/ MySQL]';
-	}
-
-	/**
-	 * @param $options array
-	 */
-	public function setSessionOptions( array $options ) {
-		if ( isset( $options['connTimeout'] ) ) {
-			$timeout = (int)$options['connTimeout'];
-			$this->query( "SET net_read_timeout=$timeout" );
-			$this->query( "SET net_write_timeout=$timeout" );
-		}
+	protected function mysqlFetchObject( $res ) {
+		return mysql_fetch_object( $res );
 	}
 
-	public function streamStatementEnd( &$sql, &$newLine ) {
-		if ( strtoupper( substr( $newLine, 0, 9 ) ) == 'DELIMITER' ) {
-			preg_match( '/^DELIMITER\s+(\S+)/', $newLine, $m );
-			$this->delimiter = $m[1];
-			$newLine = '';
-		}
-		return parent::streamStatementEnd( $sql, $newLine );
+	protected function mysqlFetchArray( $res ) {
+		return mysql_fetch_array( $res );
 	}
 
-	/**
-	 * Check to see if a named lock is available. This is non-blocking.
-	 *
-	 * @param string $lockName name of lock to poll
-	 * @param string $method name of method calling us
-	 * @return Boolean
-	 * @since 1.20
-	 */
-	public function lockIsFree( $lockName, $method ) {
-		$lockName = $this->addQuotes( $lockName );
-		$result = $this->query( "SELECT IS_FREE_LOCK($lockName) AS lockstatus", $method );
-		$row = $this->fetchObject( $result );
-		return ( $row->lockstatus == 1 );
+	protected function mysqlNumRows( $res ) {
+		return mysql_num_rows( $res );
 	}
 
-	/**
-	 * @param $lockName string
-	 * @param $method string
-	 * @param $timeout int
-	 * @return bool
-	 */
-	public function lock( $lockName, $method, $timeout = 5 ) {
-		$lockName = $this->addQuotes( $lockName );
-		$result = $this->query( "SELECT GET_LOCK($lockName, $timeout) AS lockstatus", $method );
-		$row = $this->fetchObject( $result );
-
-		if( $row->lockstatus == 1 ) {
-			return true;
-		} else {
-			wfDebug( __METHOD__ . " failed to acquire lock\n" );
-			return false;
-		}
-	}
-
-	/**
-	 * FROM MYSQL DOCS: http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_release-lock
-	 * @param $lockName string
-	 * @param $method string
-	 * @return bool
-	 */
-	public function unlock( $lockName, $method ) {
-		$lockName = $this->addQuotes( $lockName );
-		$result = $this->query( "SELECT RELEASE_LOCK($lockName) as lockstatus", $method );
-		$row = $this->fetchObject( $result );
-		return ( $row->lockstatus == 1 );
-	}
-
-	/**
-	 * @param $read array
-	 * @param $write array
-	 * @param $method string
-	 * @param $lowPriority bool
-	 * @return bool
-	 */
-	public function lockTables( $read, $write, $method, $lowPriority = true ) {
-		$items = array();
-
-		foreach( $write as $table ) {
-			$tbl = $this->tableName( $table ) .
-					( $lowPriority ? ' LOW_PRIORITY' : '' ) .
-					' WRITE';
-			$items[] = $tbl;
-		}
-		foreach( $read as $table ) {
-			$items[] = $this->tableName( $table ) . ' READ';
-		}
-		$sql = "LOCK TABLES " . implode( ',', $items );
-		$this->query( $sql, $method );
-		return true;
-	}
-
-	/**
-	 * @param $method string
-	 * @return bool
-	 */
-	public function unlockTables( $method ) {
-		$this->query( "UNLOCK TABLES", $method );
-		return true;
-	}
-
-	/**
-	 * Get search engine class. All subclasses of this
-	 * need to implement this if they wish to use searching.
-	 *
-	 * @return String
-	 */
-	public function getSearchEngine() {
-		return 'SearchMySQL';
-	}
-
-	/**
-	 * @param bool $value
-	 * @return mixed
-	 */
-	public function setBigSelects( $value = true ) {
-		if ( $value === 'default' ) {
-			if ( $this->mDefaultBigSelects === null ) {
-				# Function hasn't been called before so it must already be set to the default
-				return;
-			} else {
-				$value = $this->mDefaultBigSelects;
-			}
-		} elseif ( $this->mDefaultBigSelects === null ) {
-			$this->mDefaultBigSelects = (bool)$this->selectField( false, '@@sql_big_selects' );
-		}
-		$encValue = $value ? '1' : '0';
-		$this->query( "SET sql_big_selects=$encValue", __METHOD__ );
-	}
-
-	/**
-	 * DELETE where the condition is a join. MySql uses multi-table deletes.
-	 * @param $delTable string
-	 * @param $joinTable string
-	 * @param $delVar string
-	 * @param $joinVar string
-	 * @param $conds array|string
-	 * @param bool|string $fname bool
-	 * @throws DBUnexpectedError
-	 * @return bool|ResultWrapper
-	 */
-	function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = 'DatabaseBase::deleteJoin' ) {
-		if ( !$conds ) {
-			throw new DBUnexpectedError( $this, 'DatabaseBase::deleteJoin() called with empty $conds' );
-		}
-
-		$delTable = $this->tableName( $delTable );
-		$joinTable = $this->tableName( $joinTable );
-		$sql = "DELETE $delTable FROM $delTable, $joinTable WHERE $delVar=$joinVar ";
-
-		if ( $conds != '*' ) {
-			$sql .= ' AND ' . $this->makeList( $conds, LIST_AND );
-		}
-
-		return $this->query( $sql, $fname );
-	}
-
-	/**
-	 * Determines how long the server has been up
-	 *
-	 * @return int
-	 */
-	function getServerUptime() {
-		$vars = $this->getMysqlStatus( 'Uptime' );
-		return (int)$vars['Uptime'];
-	}
-
-	/**
-	 * Determines if the last failure was due to a deadlock
-	 *
-	 * @return bool
-	 */
-	function wasDeadlock() {
-		return $this->lastErrno() == 1213;
-	}
-
-	/**
-	 * Determines if the last failure was due to a lock timeout
-	 *
-	 * @return bool
-	 */
-	function wasLockTimeout() {
-		return $this->lastErrno() == 1205;
-	}
-
-	/**
-	 * Determines if the last query error was something that should be dealt
-	 * with by pinging the connection and reissuing the query
-	 *
-	 * @return bool
-	 */
-	function wasErrorReissuable() {
-		return $this->lastErrno() == 2013 || $this->lastErrno() == 2006;
-	}
-
-	/**
-	 * Determines if the last failure was due to the database being read-only.
-	 *
-	 * @return bool
-	 */
-	function wasReadOnlyError() {
-		return $this->lastErrno() == 1223 ||
-			( $this->lastErrno() == 1290 && strpos( $this->lastError(), '--read-only' ) !== false );
-	}
-
-	/**
-	 * @param $oldName
-	 * @param $newName
-	 * @param $temporary bool
-	 * @param $fname string
-	 */
-	function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseMysql::duplicateTableStructure' ) {
-		$tmp = $temporary ? 'TEMPORARY ' : '';
-		$newName = $this->addIdentifierQuotes( $newName );
-		$oldName = $this->addIdentifierQuotes( $oldName );
-		$query = "CREATE $tmp TABLE $newName (LIKE $oldName)";
-		$this->query( $query, $fname );
-	}
-
-	/**
-	 * List all tables on the database
-	 *
-	 * @param string $prefix Only show tables with this prefix, e.g. mw_
-	 * @param string $fname calling function name
-	 * @return array
-	 */
-	function listTables( $prefix = null, $fname = 'DatabaseMysql::listTables' ) {
-		$result = $this->query( "SHOW TABLES", $fname);
-
-		$endArray = array();
-
-		foreach( $result as $table ) {
-			$vars = get_object_vars( $table );
-			$table = array_pop( $vars );
-
-			if( !$prefix || strpos( $table, $prefix ) === 0 ) {
-				$endArray[] = $table;
-			}
-		}
-
-		return $endArray;
-	}
-
-	/**
-	 * @param $tableName
-	 * @param $fName string
-	 * @return bool|ResultWrapper
-	 */
-	public function dropTable( $tableName, $fName = 'DatabaseMysql::dropTable' ) {
-		if( !$this->tableExists( $tableName, $fName ) ) {
-			return false;
-		}
-		return $this->query( "DROP TABLE IF EXISTS " . $this->tableName( $tableName ), $fName );
-	}
-
-	/**
-	 * @return array
-	 */
-	protected function getDefaultSchemaVars() {
-		$vars = parent::getDefaultSchemaVars();
-		$vars['wgDBTableOptions'] = str_replace( 'TYPE', 'ENGINE', $GLOBALS['wgDBTableOptions'] );
-		$vars['wgDBTableOptions'] = str_replace( 'CHARSET=mysql4', 'CHARSET=binary', $vars['wgDBTableOptions'] );
-		return $vars;
-	}
-
-	/**
-	 * Get status information from SHOW STATUS in an associative array
-	 *
-	 * @param $which string
-	 * @return array
-	 */
-	function getMysqlStatus( $which = "%" ) {
-		$res = $this->query( "SHOW STATUS LIKE '{$which}'" );
-		$status = array();
-
-		foreach ( $res as $row ) {
-			$status[$row->Variable_name] = $row->Value;
-		}
-
-		return $status;
-	}
-
-}
-
-/**
- * Utility class.
- * @ingroup Database
- */
-class MySQLField implements Field {
-	private $name, $tablename, $default, $max_length, $nullable,
-		$is_pk, $is_unique, $is_multiple, $is_key, $type;
-
-	function __construct ( $info ) {
-		$this->name = $info->name;
-		$this->tablename = $info->table;
-		$this->default = $info->def;
-		$this->max_length = $info->max_length;
-		$this->nullable = !$info->not_null;
-		$this->is_pk = $info->primary_key;
-		$this->is_unique = $info->unique_key;
-		$this->is_multiple = $info->multiple_key;
-		$this->is_key = ( $this->is_pk || $this->is_unique || $this->is_multiple );
-		$this->type = $info->type;
-	}
-
-	/**
-	 * @return string
-	 */
-	function name() {
-		return $this->name;
-	}
-
-	/**
-	 * @return string
-	 */
-	function tableName() {
-		return $this->tableName;
-	}
-
-	/**
-	 * @return string
-	 */
-	function type() {
-		return $this->type;
+	protected function mysqlNumFields( $res ) {
+		return mysql_num_fields( $res );
 	}
 
-	/**
-	 * @return bool
-	 */
-	function isNullable() {
-		return $this->nullable;
+	protected function mysqlFetchField( $res, $n ) {
+		return mysql_fetch_field( $res, $n );
 	}
 
-	function defaultValue() {
-		return $this->default;
+	protected function mysqlFieldName( $res, $n ) {
+		return mysql_field_name( $res, $n );
 	}
 
-	/**
-	 * @return bool
-	 */
-	function isKey() {
-		return $this->is_key;
+	protected function mysqlDataSeek( $res, $row ) {
+		return mysql_data_seek( $res, $row );
 	}
 
-	/**
-	 * @return bool
-	 */
-	function isMultipleKey() {
-		return $this->is_multiple;
+	protected function mysqlError( $conn = null ) {
+		return ( $conn !== null ) ? mysql_error( $conn ) : mysql_error(); // avoid warning
 	}
-}
-
-class MySQLMasterPos implements DBMasterPos {
-	var $file, $pos;
 
-	function __construct( $file, $pos ) {
-		$this->file = $file;
-		$this->pos = $pos;
+	protected function mysqlRealEscapeString( $s ) {
+		return mysql_real_escape_string( $s, $this->mConn );
 	}
 
-	function __toString() {
-		return "{$this->file}/{$this->pos}";
+	protected function mysqlPing() {
+		return mysql_ping( $this->mConn );
 	}
 }
diff --git a/includes/db/DatabaseMysqlBase.php b/includes/db/DatabaseMysqlBase.php
new file mode 100644
index 00000000..26c9d247
--- /dev/null
+++ b/includes/db/DatabaseMysqlBase.php
@@ -0,0 +1,1154 @@
+<?php
+/**
+ * This is the MySQL database abstraction layer.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * Database abstraction object for MySQL.
+ * Defines methods independent on used MySQL extension.
+ *
+ * @ingroup Database
+ * @since 1.22
+ * @see Database
+ */
+abstract class DatabaseMysqlBase extends DatabaseBase {
+	/** @var MysqlMasterPos */
+	protected $lastKnownSlavePos;
+
+	/**
+	 * @return string
+	 */
+	function getType() {
+		return 'mysql';
+	}
+
+	/**
+	 * @param $server string
+	 * @param $user string
+	 * @param $password string
+	 * @param $dbName string
+	 * @return bool
+	 * @throws DBConnectionError
+	 */
+	function open( $server, $user, $password, $dbName ) {
+		global $wgAllDBsAreLocalhost, $wgDBmysql5, $wgSQLMode;
+		wfProfileIn( __METHOD__ );
+
+		# Debugging hack -- fake cluster
+		if ( $wgAllDBsAreLocalhost ) {
+			$realServer = 'localhost';
+		} else {
+			$realServer = $server;
+		}
+		$this->close();
+		$this->mServer = $server;
+		$this->mUser = $user;
+		$this->mPassword = $password;
+		$this->mDBname = $dbName;
+
+		wfProfileIn( "dbconnect-$server" );
+
+		# The kernel's default SYN retransmission period is far too slow for us,
+		# so we use a short timeout plus a manual retry. Retrying means that a small
+		# but finite rate of SYN packet loss won't cause user-visible errors.
+		$this->mConn = false;
+		$this->installErrorHandler();
+		try {
+			$this->mConn = $this->mysqlConnect( $realServer );
+		} catch ( Exception $ex ) {
+			wfProfileOut( "dbconnect-$server" );
+			wfProfileOut( __METHOD__ );
+			throw $ex;
+		}
+		$error = $this->restoreErrorHandler();
+
+		wfProfileOut( "dbconnect-$server" );
+
+		# Always log connection errors
+		if ( !$this->mConn ) {
+			if ( !$error ) {
+				$error = $this->lastError();
+			}
+			wfLogDBError( "Error connecting to {$this->mServer}: $error\n" );
+			wfDebug( "DB connection error\n" .
+				"Server: $server, User: $user, Password: " .
+				substr( $password, 0, 3 ) . "..., error: " . $error . "\n" );
+
+			wfProfileOut( __METHOD__ );
+			return $this->reportConnectionError( $error );
+		}
+
+		if ( $dbName != '' ) {
+			wfSuppressWarnings();
+			$success = $this->selectDB( $dbName );
+			wfRestoreWarnings();
+			if ( !$success ) {
+				wfLogDBError( "Error selecting database $dbName on server {$this->mServer}\n" );
+				wfDebug( "Error selecting database $dbName on server {$this->mServer} " .
+					"from client host " . wfHostname() . "\n" );
+
+				wfProfileOut( __METHOD__ );
+				return $this->reportConnectionError( "Error selecting database $dbName" );
+			}
+		}
+
+		// Tell the server we're communicating with it in UTF-8.
+		// This may engage various charset conversions.
+		if ( $wgDBmysql5 ) {
+			$this->query( 'SET NAMES utf8', __METHOD__ );
+		} else {
+			$this->query( 'SET NAMES binary', __METHOD__ );
+		}
+		// Set SQL mode, default is turning them all off, can be overridden or skipped with null
+		if ( is_string( $wgSQLMode ) ) {
+			$mode = $this->addQuotes( $wgSQLMode );
+			$this->query( "SET sql_mode = $mode", __METHOD__ );
+		}
+
+		$this->mOpened = true;
+		wfProfileOut( __METHOD__ );
+		return true;
+	}
+
+	/**
+	 * Open a connection to a MySQL server
+	 *
+	 * @param $realServer string
+	 * @return mixed Raw connection
+	 * @throws DBConnectionError
+	 */
+	abstract protected function mysqlConnect( $realServer );
+
+	/**
+	 * @param $res ResultWrapper
+	 * @throws DBUnexpectedError
+	 */
+	function freeResult( $res ) {
+		if ( $res instanceof ResultWrapper ) {
+			$res = $res->result;
+		}
+		wfSuppressWarnings();
+		$ok = $this->mysqlFreeResult( $res );
+		wfRestoreWarnings();
+		if ( !$ok ) {
+			throw new DBUnexpectedError( $this, "Unable to free MySQL result" );
+		}
+	}
+
+	/**
+	 * Free result memory
+	 *
+	 * @param $res Raw result
+	 * @return bool
+	 */
+	abstract protected function mysqlFreeResult( $res );
+
+	/**
+	 * @param $res ResultWrapper
+	 * @return object|bool
+	 * @throws DBUnexpectedError
+	 */
+	function fetchObject( $res ) {
+		if ( $res instanceof ResultWrapper ) {
+			$res = $res->result;
+		}
+		wfSuppressWarnings();
+		$row = $this->mysqlFetchObject( $res );
+		wfRestoreWarnings();
+
+		$errno = $this->lastErrno();
+		// Unfortunately, mysql_fetch_object does not reset the last errno.
+		// Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
+		// these are the only errors mysql_fetch_object can cause.
+		// See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
+		if ( $errno == 2000 || $errno == 2013 ) {
+			throw new DBUnexpectedError( $this, 'Error in fetchObject(): ' . htmlspecialchars( $this->lastError() ) );
+		}
+		return $row;
+	}
+
+	/**
+	 * Fetch a result row as an object
+	 *
+	 * @param $res Raw result
+	 * @return stdClass
+	 */
+	abstract protected function mysqlFetchObject( $res );
+
+	/**
+	 * @param $res ResultWrapper
+	 * @return array|bool
+	 * @throws DBUnexpectedError
+	 */
+	function fetchRow( $res ) {
+		if ( $res instanceof ResultWrapper ) {
+			$res = $res->result;
+		}
+		wfSuppressWarnings();
+		$row = $this->mysqlFetchArray( $res );
+		wfRestoreWarnings();
+
+		$errno = $this->lastErrno();
+		// Unfortunately, mysql_fetch_array does not reset the last errno.
+		// Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
+		// these are the only errors mysql_fetch_array can cause.
+		// See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
+		if ( $errno == 2000 || $errno == 2013 ) {
+			throw new DBUnexpectedError( $this, 'Error in fetchRow(): ' . htmlspecialchars( $this->lastError() ) );
+		}
+		return $row;
+	}
+
+	/**
+	 * Fetch a result row as an associative and numeric array
+	 *
+	 * @param $res Raw result
+	 * @return array
+	 */
+	abstract protected function mysqlFetchArray( $res );
+
+	/**
+	 * @throws DBUnexpectedError
+	 * @param $res ResultWrapper
+	 * @return int
+	 */
+	function numRows( $res ) {
+		if ( $res instanceof ResultWrapper ) {
+			$res = $res->result;
+		}
+		wfSuppressWarnings();
+		$n = $this->mysqlNumRows( $res );
+		wfRestoreWarnings();
+		// Unfortunately, mysql_num_rows does not reset the last errno.
+		// We are not checking for any errors here, since
+		// these are no errors mysql_num_rows can cause.
+		// See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
+		// See https://bugzilla.wikimedia.org/42430
+		return $n;
+	}
+
+	/**
+	 * Get number of rows in result
+	 *
+	 * @param $res Raw result
+	 * @return int
+	 */
+	abstract protected function mysqlNumRows( $res );
+
+	/**
+	 * @param $res ResultWrapper
+	 * @return int
+	 */
+	function numFields( $res ) {
+		if ( $res instanceof ResultWrapper ) {
+			$res = $res->result;
+		}
+		return $this->mysqlNumFields( $res );
+	}
+
+	/**
+	 * Get number of fields in result
+	 *
+	 * @param $res Raw result
+	 * @return int
+	 */
+	abstract protected function mysqlNumFields( $res );
+
+	/**
+	 * @param $res ResultWrapper
+	 * @param $n string
+	 * @return string
+	 */
+	function fieldName( $res, $n ) {
+		if ( $res instanceof ResultWrapper ) {
+			$res = $res->result;
+		}
+		return $this->mysqlFieldName( $res, $n );
+	}
+
+	/**
+	 * Get the name of the specified field in a result
+	 *
+	 * @param $res Raw result
+	 * @param $n int
+	 * @return string
+	 */
+	abstract protected function mysqlFieldName( $res, $n );
+
+	/**
+	 * @param $res ResultWrapper
+	 * @param $row
+	 * @return bool
+	 */
+	function dataSeek( $res, $row ) {
+		if ( $res instanceof ResultWrapper ) {
+			$res = $res->result;
+		}
+		return $this->mysqlDataSeek( $res, $row );
+	}
+
+	/**
+	 * Move internal result pointer
+	 *
+	 * @param $res Raw result
+	 * @param $row int
+	 * @return bool
+	 */
+	abstract protected function mysqlDataSeek( $res, $row );
+
+	/**
+	 * @return string
+	 */
+	function lastError() {
+		if ( $this->mConn ) {
+			# Even if it's non-zero, it can still be invalid
+			wfSuppressWarnings();
+			$error = $this->mysqlError( $this->mConn );
+			if ( !$error ) {
+				$error = $this->mysqlError();
+			}
+			wfRestoreWarnings();
+		} else {
+			$error = $this->mysqlError();
+		}
+		if ( $error ) {
+			$error .= ' (' . $this->mServer . ')';
+		}
+		return $error;
+	}
+
+	/**
+	 * Returns the text of the error message from previous MySQL operation
+	 *
+	 * @param $conn Raw connection
+	 * @return string
+	 */
+	abstract protected function mysqlError( $conn = null );
+
+	/**
+	 * @param $table string
+	 * @param $uniqueIndexes
+	 * @param $rows array
+	 * @param $fname string
+	 * @return ResultWrapper
+	 */
+	function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
+		return $this->nativeReplace( $table, $rows, $fname );
+	}
+
+	/**
+	 * Estimate rows in dataset
+	 * Returns estimated count, based on EXPLAIN output
+	 * Takes same arguments as Database::select()
+	 *
+	 * @param $table string|array
+	 * @param $vars string|array
+	 * @param $conds string|array
+	 * @param $fname string
+	 * @param $options string|array
+	 * @return int
+	 */
+	public function estimateRowCount( $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array() ) {
+		$options['EXPLAIN'] = true;
+		$res = $this->select( $table, $vars, $conds, $fname, $options );
+		if ( $res === false ) {
+			return false;
+		}
+		if ( !$this->numRows( $res ) ) {
+			return 0;
+		}
+
+		$rows = 1;
+		foreach ( $res as $plan ) {
+			$rows *= $plan->rows > 0 ? $plan->rows : 1; // avoid resetting to zero
+		}
+		return $rows;
+	}
+
+	/**
+	 * @param $table string
+	 * @param $field string
+	 * @return bool|MySQLField
+	 */
+	function fieldInfo( $table, $field ) {
+		$table = $this->tableName( $table );
+		$res = $this->query( "SELECT * FROM $table LIMIT 1", __METHOD__, true );
+		if ( !$res ) {
+			return false;
+		}
+		$n = $this->mysqlNumFields( $res->result );
+		for ( $i = 0; $i < $n; $i++ ) {
+			$meta = $this->mysqlFetchField( $res->result, $i );
+			if ( $field == $meta->name ) {
+				return new MySQLField( $meta );
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Get column information from a result
+	 *
+	 * @param $res Raw result
+	 * @param $n int
+	 * @return stdClass
+	 */
+	abstract protected function mysqlFetchField( $res, $n );
+
+	/**
+	 * Get information about an index into an object
+	 * Returns false if the index does not exist
+	 *
+	 * @param $table string
+	 * @param $index string
+	 * @param $fname string
+	 * @return bool|array|null False or null on failure
+	 */
+	function indexInfo( $table, $index, $fname = __METHOD__ ) {
+		# SHOW INDEX works in MySQL 3.23.58, but SHOW INDEXES does not.
+		# SHOW INDEX should work for 3.x and up:
+		# http://dev.mysql.com/doc/mysql/en/SHOW_INDEX.html
+		$table = $this->tableName( $table );
+		$index = $this->indexName( $index );
+
+		$sql = 'SHOW INDEX FROM ' . $table;
+		$res = $this->query( $sql, $fname );
+
+		if ( !$res ) {
+			return null;
+		}
+
+		$result = array();
+
+		foreach ( $res as $row ) {
+			if ( $row->Key_name == $index ) {
+				$result[] = $row;
+			}
+		}
+		return empty( $result ) ? false : $result;
+	}
+
+	/**
+	 * @param $s string
+	 *
+	 * @return string
+	 */
+	function strencode( $s ) {
+		$sQuoted = $this->mysqlRealEscapeString( $s );
+
+		if ( $sQuoted === false ) {
+			$this->ping();
+			$sQuoted = $this->mysqlRealEscapeString( $s );
+		}
+		return $sQuoted;
+	}
+
+	/**
+	 * MySQL uses `backticks` for identifier quoting instead of the sql standard "double quotes".
+	 *
+	 * @param $s string
+	 *
+	 * @return string
+	 */
+	public function addIdentifierQuotes( $s ) {
+		// Characters in the range \u0001-\uFFFF are valid in a quoted identifier
+		// Remove NUL bytes and escape backticks by doubling
+		return '`' . str_replace( array( "\0", '`' ), array( '', '``' ), $s )  . '`';
+	}
+
+	/**
+	 * @param $name string
+	 * @return bool
+	 */
+	public function isQuotedIdentifier( $name ) {
+		return strlen( $name ) && $name[0] == '`' && substr( $name, -1, 1 ) == '`';
+	}
+
+	/**
+	 * @return bool
+	 */
+	function ping() {
+		$ping = $this->mysqlPing();
+		if ( $ping ) {
+			return true;
+		}
+
+		$this->closeConnection();
+		$this->mOpened = false;
+		$this->mConn = false;
+		$this->open( $this->mServer, $this->mUser, $this->mPassword, $this->mDBname );
+		return true;
+	}
+
+	/**
+	 * Ping a server connection or reconnect if there is no connection
+	 *
+	 * @return bool
+	 */
+	abstract protected function mysqlPing();
+
+	/**
+	 * Returns slave lag.
+	 *
+	 * This will do a SHOW SLAVE STATUS
+	 *
+	 * @return int
+	 */
+	function getLag() {
+		if ( !is_null( $this->mFakeSlaveLag ) ) {
+			wfDebug( "getLag: fake slave lagged {$this->mFakeSlaveLag} seconds\n" );
+			return $this->mFakeSlaveLag;
+		}
+
+		return $this->getLagFromSlaveStatus();
+	}
+
+	/**
+	 * @return bool|int
+	 */
+	function getLagFromSlaveStatus() {
+		$res = $this->query( 'SHOW SLAVE STATUS', __METHOD__ );
+		if ( !$res ) {
+			return false;
+		}
+		$row = $res->fetchObject();
+		if ( !$row ) {
+			return false;
+		}
+		if ( strval( $row->Seconds_Behind_Master ) === '' ) {
+			return false;
+		} else {
+			return intval( $row->Seconds_Behind_Master );
+		}
+	}
+
+	/**
+	 * @deprecated in 1.19, use getLagFromSlaveStatus
+	 *
+	 * @return bool|int
+	 */
+	function getLagFromProcesslist() {
+		wfDeprecated( __METHOD__, '1.19' );
+		$res = $this->query( 'SHOW PROCESSLIST', __METHOD__ );
+		if ( !$res ) {
+			return false;
+		}
+		# Find slave SQL thread
+		foreach ( $res as $row ) {
+			/* This should work for most situations - when default db
+			 * for thread is not specified, it had no events executed,
+			 * and therefore it doesn't know yet how lagged it is.
+			 *
+			 * Relay log I/O thread does not select databases.
+			 */
+			if ( $row->User == 'system user' &&
+				$row->State != 'Waiting for master to send event' &&
+				$row->State != 'Connecting to master' &&
+				$row->State != 'Queueing master event to the relay log' &&
+				$row->State != 'Waiting for master update' &&
+				$row->State != 'Requesting binlog dump' &&
+				$row->State != 'Waiting to reconnect after a failed master event read' &&
+				$row->State != 'Reconnecting after a failed master event read' &&
+				$row->State != 'Registering slave on master'
+				) {
+				# This is it, return the time (except -ve)
+				if ( $row->Time > 0x7fffffff ) {
+					return false;
+				} else {
+					return $row->Time;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Wait for the slave to catch up to a given master position.
+	 * @TODO: return values for this and base class are rubbish
+	 *
+	 * @param $pos DBMasterPos object
+	 * @param $timeout Integer: the maximum number of seconds to wait for synchronisation
+	 * @return bool|string
+	 */
+	function masterPosWait( DBMasterPos $pos, $timeout ) {
+		if ( $this->lastKnownSlavePos && $this->lastKnownSlavePos->hasReached( $pos ) ) {
+			return '0'; // http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html
+		}
+
+		wfProfileIn( __METHOD__ );
+		# Commit any open transactions
+		$this->commit( __METHOD__, 'flush' );
+
+		if ( !is_null( $this->mFakeSlaveLag ) ) {
+			$status = parent::masterPosWait( $pos, $timeout );
+			wfProfileOut( __METHOD__ );
+			return $status;
+		}
+
+		# Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
+		$encFile = $this->addQuotes( $pos->file );
+		$encPos = intval( $pos->pos );
+		$sql = "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)";
+		$res = $this->doQuery( $sql );
+
+		$status = false;
+		if ( $res && $row = $this->fetchRow( $res ) ) {
+			$status = $row[0]; // can be NULL, -1, or 0+ per the MySQL manual
+			if ( ctype_digit( $status ) ) { // success
+				$this->lastKnownSlavePos = $pos;
+			}
+		}
+
+		wfProfileOut( __METHOD__ );
+		return $status;
+	}
+
+	/**
+	 * Get the position of the master from SHOW SLAVE STATUS
+	 *
+	 * @return MySQLMasterPos|bool
+	 */
+	function getSlavePos() {
+		if ( !is_null( $this->mFakeSlaveLag ) ) {
+			return parent::getSlavePos();
+		}
+
+		$res = $this->query( 'SHOW SLAVE STATUS', 'DatabaseBase::getSlavePos' );
+		$row = $this->fetchObject( $res );
+
+		if ( $row ) {
+			$pos = isset( $row->Exec_master_log_pos ) ? $row->Exec_master_log_pos : $row->Exec_Master_Log_Pos;
+			return new MySQLMasterPos( $row->Relay_Master_Log_File, $pos );
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * Get the position of the master from SHOW MASTER STATUS
+	 *
+	 * @return MySQLMasterPos|bool
+	 */
+	function getMasterPos() {
+		if ( $this->mFakeMaster ) {
+			return parent::getMasterPos();
+		}
+
+		$res = $this->query( 'SHOW MASTER STATUS', 'DatabaseBase::getMasterPos' );
+		$row = $this->fetchObject( $res );
+
+		if ( $row ) {
+			return new MySQLMasterPos( $row->File, $row->Position );
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * @param $index
+	 * @return string
+	 */
+	function useIndexClause( $index ) {
+		return "FORCE INDEX (" . $this->indexName( $index ) . ")";
+	}
+
+	/**
+	 * @return string
+	 */
+	function lowPriorityOption() {
+		return 'LOW_PRIORITY';
+	}
+
+	/**
+	 * @return string
+	 */
+	public function getSoftwareLink() {
+		return '[http://www.mysql.com/ MySQL]';
+	}
+
+	/**
+	 * @param $options array
+	 */
+	public function setSessionOptions( array $options ) {
+		if ( isset( $options['connTimeout'] ) ) {
+			$timeout = (int)$options['connTimeout'];
+			$this->query( "SET net_read_timeout=$timeout" );
+			$this->query( "SET net_write_timeout=$timeout" );
+		}
+	}
+
+	public function streamStatementEnd( &$sql, &$newLine ) {
+		if ( strtoupper( substr( $newLine, 0, 9 ) ) == 'DELIMITER' ) {
+			preg_match( '/^DELIMITER\s+(\S+)/', $newLine, $m );
+			$this->delimiter = $m[1];
+			$newLine = '';
+		}
+		return parent::streamStatementEnd( $sql, $newLine );
+	}
+
+	/**
+	 * Check to see if a named lock is available. This is non-blocking.
+	 *
+	 * @param string $lockName name of lock to poll
+	 * @param string $method name of method calling us
+	 * @return Boolean
+	 * @since 1.20
+	 */
+	public function lockIsFree( $lockName, $method ) {
+		$lockName = $this->addQuotes( $lockName );
+		$result = $this->query( "SELECT IS_FREE_LOCK($lockName) AS lockstatus", $method );
+		$row = $this->fetchObject( $result );
+		return ( $row->lockstatus == 1 );
+	}
+
+	/**
+	 * @param $lockName string
+	 * @param $method string
+	 * @param $timeout int
+	 * @return bool
+	 */
+	public function lock( $lockName, $method, $timeout = 5 ) {
+		$lockName = $this->addQuotes( $lockName );
+		$result = $this->query( "SELECT GET_LOCK($lockName, $timeout) AS lockstatus", $method );
+		$row = $this->fetchObject( $result );
+
+		if ( $row->lockstatus == 1 ) {
+			return true;
+		} else {
+			wfDebug( __METHOD__ . " failed to acquire lock\n" );
+			return false;
+		}
+	}
+
+	/**
+	 * FROM MYSQL DOCS: http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_release-lock
+	 * @param $lockName string
+	 * @param $method string
+	 * @return bool
+	 */
+	public function unlock( $lockName, $method ) {
+		$lockName = $this->addQuotes( $lockName );
+		$result = $this->query( "SELECT RELEASE_LOCK($lockName) as lockstatus", $method );
+		$row = $this->fetchObject( $result );
+		return ( $row->lockstatus == 1 );
+	}
+
+	/**
+	 * @param $read array
+	 * @param $write array
+	 * @param $method string
+	 * @param $lowPriority bool
+	 * @return bool
+	 */
+	public function lockTables( $read, $write, $method, $lowPriority = true ) {
+		$items = array();
+
+		foreach ( $write as $table ) {
+			$tbl = $this->tableName( $table ) .
+					( $lowPriority ? ' LOW_PRIORITY' : '' ) .
+					' WRITE';
+			$items[] = $tbl;
+		}
+		foreach ( $read as $table ) {
+			$items[] = $this->tableName( $table ) . ' READ';
+		}
+		$sql = "LOCK TABLES " . implode( ',', $items );
+		$this->query( $sql, $method );
+		return true;
+	}
+
+	/**
+	 * @param $method string
+	 * @return bool
+	 */
+	public function unlockTables( $method ) {
+		$this->query( "UNLOCK TABLES", $method );
+		return true;
+	}
+
+	/**
+	 * Get search engine class. All subclasses of this
+	 * need to implement this if they wish to use searching.
+	 *
+	 * @return String
+	 */
+	public function getSearchEngine() {
+		return 'SearchMySQL';
+	}
+
+	/**
+	 * @param bool $value
+	 * @return mixed
+	 */
+	public function setBigSelects( $value = true ) {
+		if ( $value === 'default' ) {
+			if ( $this->mDefaultBigSelects === null ) {
+				# Function hasn't been called before so it must already be set to the default
+				return;
+			} else {
+				$value = $this->mDefaultBigSelects;
+			}
+		} elseif ( $this->mDefaultBigSelects === null ) {
+			$this->mDefaultBigSelects = (bool)$this->selectField( false, '@@sql_big_selects' );
+		}
+		$encValue = $value ? '1' : '0';
+		$this->query( "SET sql_big_selects=$encValue", __METHOD__ );
+	}
+
+	/**
+	 * DELETE where the condition is a join. MySql uses multi-table deletes.
+	 * @param $delTable string
+	 * @param $joinTable string
+	 * @param $delVar string
+	 * @param $joinVar string
+	 * @param $conds array|string
+	 * @param bool|string $fname bool
+	 * @throws DBUnexpectedError
+	 * @return bool|ResultWrapper
+	 */
+	function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = __METHOD__ ) {
+		if ( !$conds ) {
+			throw new DBUnexpectedError( $this, 'DatabaseBase::deleteJoin() called with empty $conds' );
+		}
+
+		$delTable = $this->tableName( $delTable );
+		$joinTable = $this->tableName( $joinTable );
+		$sql = "DELETE $delTable FROM $delTable, $joinTable WHERE $delVar=$joinVar ";
+
+		if ( $conds != '*' ) {
+			$sql .= ' AND ' . $this->makeList( $conds, LIST_AND );
+		}
+
+		return $this->query( $sql, $fname );
+	}
+
+	/**
+	 * @param string $table
+	 * @param array $rows
+	 * @param array $uniqueIndexes
+	 * @param array $set
+	 * @param string $fname
+	 * @param array $options
+	 * @return bool
+	 */
+	public function upsert(
+		$table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__
+	) {
+		if ( !count( $rows ) ) {
+			return true; // nothing to do
+		}
+		$rows = is_array( reset( $rows ) ) ? $rows : array( $rows );
+
+		$table = $this->tableName( $table );
+		$columns = array_keys( $rows[0] );
+
+		$sql = "INSERT INTO $table (" . implode( ',', $columns ) . ') VALUES ';
+		$rowTuples = array();
+		foreach ( $rows as $row ) {
+			$rowTuples[] = '(' . $this->makeList( $row ) . ')';
+		}
+		$sql .= implode( ',', $rowTuples );
+		$sql .= " ON DUPLICATE KEY UPDATE " . $this->makeList( $set, LIST_SET );
+
+		return (bool)$this->query( $sql, $fname );
+	}
+
+	/**
+	 * Determines how long the server has been up
+	 *
+	 * @return int
+	 */
+	function getServerUptime() {
+		$vars = $this->getMysqlStatus( 'Uptime' );
+		return (int)$vars['Uptime'];
+	}
+
+	/**
+	 * Determines if the last failure was due to a deadlock
+	 *
+	 * @return bool
+	 */
+	function wasDeadlock() {
+		return $this->lastErrno() == 1213;
+	}
+
+	/**
+	 * Determines if the last failure was due to a lock timeout
+	 *
+	 * @return bool
+	 */
+	function wasLockTimeout() {
+		return $this->lastErrno() == 1205;
+	}
+
+	/**
+	 * Determines if the last query error was something that should be dealt
+	 * with by pinging the connection and reissuing the query
+	 *
+	 * @return bool
+	 */
+	function wasErrorReissuable() {
+		return $this->lastErrno() == 2013 || $this->lastErrno() == 2006;
+	}
+
+	/**
+	 * Determines if the last failure was due to the database being read-only.
+	 *
+	 * @return bool
+	 */
+	function wasReadOnlyError() {
+		return $this->lastErrno() == 1223 ||
+			( $this->lastErrno() == 1290 && strpos( $this->lastError(), '--read-only' ) !== false );
+	}
+
+	/**
+	 * @param $oldName
+	 * @param $newName
+	 * @param $temporary bool
+	 * @param $fname string
+	 */
+	function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
+		$tmp = $temporary ? 'TEMPORARY ' : '';
+		$newName = $this->addIdentifierQuotes( $newName );
+		$oldName = $this->addIdentifierQuotes( $oldName );
+		$query = "CREATE $tmp TABLE $newName (LIKE $oldName)";
+		$this->query( $query, $fname );
+	}
+
+	/**
+	 * List all tables on the database
+	 *
+	 * @param string $prefix Only show tables with this prefix, e.g. mw_
+	 * @param string $fname calling function name
+	 * @return array
+	 */
+	function listTables( $prefix = null, $fname = __METHOD__ ) {
+		$result = $this->query( "SHOW TABLES", $fname );
+
+		$endArray = array();
+
+		foreach ( $result as $table ) {
+			$vars = get_object_vars( $table );
+			$table = array_pop( $vars );
+
+			if ( !$prefix || strpos( $table, $prefix ) === 0 ) {
+				$endArray[] = $table;
+			}
+		}
+
+		return $endArray;
+	}
+
+	/**
+	 * @param $tableName
+	 * @param $fName string
+	 * @return bool|ResultWrapper
+	 */
+	public function dropTable( $tableName, $fName = __METHOD__ ) {
+		if ( !$this->tableExists( $tableName, $fName ) ) {
+			return false;
+		}
+		return $this->query( "DROP TABLE IF EXISTS " . $this->tableName( $tableName ), $fName );
+	}
+
+	/**
+	 * @return array
+	 */
+	protected function getDefaultSchemaVars() {
+		$vars = parent::getDefaultSchemaVars();
+		$vars['wgDBTableOptions'] = str_replace( 'TYPE', 'ENGINE', $GLOBALS['wgDBTableOptions'] );
+		$vars['wgDBTableOptions'] = str_replace( 'CHARSET=mysql4', 'CHARSET=binary', $vars['wgDBTableOptions'] );
+		return $vars;
+	}
+
+	/**
+	 * Get status information from SHOW STATUS in an associative array
+	 *
+	 * @param $which string
+	 * @return array
+	 */
+	function getMysqlStatus( $which = "%" ) {
+		$res = $this->query( "SHOW STATUS LIKE '{$which}'" );
+		$status = array();
+
+		foreach ( $res as $row ) {
+			$status[$row->Variable_name] = $row->Value;
+		}
+
+		return $status;
+	}
+
+	/**
+	 * Lists VIEWs in the database
+	 *
+	 * @param string $prefix   Only show VIEWs with this prefix, eg.
+	 * unit_test_, or $wgDBprefix. Default: null, would return all views.
+	 * @param string $fname    Name of calling function
+	 * @return array
+	 * @since 1.22
+	 */
+	public function listViews( $prefix = null, $fname = __METHOD__ ) {
+
+		if ( !isset( $this->allViews ) ) {
+
+			// The name of the column containing the name of the VIEW
+			$propertyName = 'Tables_in_' . $this->mDBname;
+
+			// Query for the VIEWS
+			$result = $this->query( 'SHOW FULL TABLES WHERE TABLE_TYPE = "VIEW"' );
+			$this->allViews = array();
+			while ( ($row = $this->fetchRow($result)) !== false ) {
+				array_push( $this->allViews, $row[$propertyName] );
+			}
+		}
+
+		if ( is_null($prefix) || $prefix === '' ) {
+			return $this->allViews;
+		}
+
+		$filteredViews = array();
+		foreach ( $this->allViews as $viewName ) {
+			// Does the name of this VIEW start with the table-prefix?
+			if ( strpos( $viewName, $prefix ) === 0 ) {
+				array_push( $filteredViews, $viewName );
+			}
+		}
+		return $filteredViews;
+	}
+
+	/**
+	 * Differentiates between a TABLE and a VIEW.
+	 *
+	 * @param $name string: Name of the TABLE/VIEW to test
+	 * @return bool
+	 * @since 1.22
+	 */
+	public function isView( $name, $prefix = null ) {
+		return in_array( $name, $this->listViews( $prefix ) );
+	}
+
+}
+
+
+
+/**
+ * Utility class.
+ * @ingroup Database
+ */
+class MySQLField implements Field {
+	private $name, $tablename, $default, $max_length, $nullable,
+		$is_pk, $is_unique, $is_multiple, $is_key, $type, $binary;
+
+	function __construct( $info ) {
+		$this->name = $info->name;
+		$this->tablename = $info->table;
+		$this->default = $info->def;
+		$this->max_length = $info->max_length;
+		$this->nullable = !$info->not_null;
+		$this->is_pk = $info->primary_key;
+		$this->is_unique = $info->unique_key;
+		$this->is_multiple = $info->multiple_key;
+		$this->is_key = ( $this->is_pk || $this->is_unique || $this->is_multiple );
+		$this->type = $info->type;
+		$this->binary = isset( $info->binary ) ? $info->binary : false;
+	}
+
+	/**
+	 * @return string
+	 */
+	function name() {
+		return $this->name;
+	}
+
+	/**
+	 * @return string
+	 */
+	function tableName() {
+		return $this->tableName;
+	}
+
+	/**
+	 * @return string
+	 */
+	function type() {
+		return $this->type;
+	}
+
+	/**
+	 * @return bool
+	 */
+	function isNullable() {
+		return $this->nullable;
+	}
+
+	function defaultValue() {
+		return $this->default;
+	}
+
+	/**
+	 * @return bool
+	 */
+	function isKey() {
+		return $this->is_key;
+	}
+
+	/**
+	 * @return bool
+	 */
+	function isMultipleKey() {
+		return $this->is_multiple;
+	}
+
+	function isBinary() {
+		return $this->binary;
+	}
+}
+
+class MySQLMasterPos implements DBMasterPos {
+	var $file, $pos;
+
+	function __construct( $file, $pos ) {
+		$this->file = $file;
+		$this->pos = $pos;
+	}
+
+	function __toString() {
+		// e.g db1034-bin.000976/843431247
+		return "{$this->file}/{$this->pos}";
+	}
+
+	/**
+	 * @return array|false (int, int)
+	 */
+	protected function getCoordinates() {
+		$m = array();
+		if ( preg_match( '!\.(\d+)/(\d+)$!', (string)$this, $m ) ) {
+			return array( (int)$m[1], (int)$m[2] );
+		}
+		return false;
+	}
+
+	function hasReached( MySQLMasterPos $pos ) {
+		$thisPos = $this->getCoordinates();
+		$thatPos = $pos->getCoordinates();
+		return ( $thisPos && $thatPos && $thisPos >= $thatPos );
+	}
+}
diff --git a/includes/db/DatabaseMysqli.php b/includes/db/DatabaseMysqli.php
new file mode 100644
index 00000000..7761abe9
--- /dev/null
+++ b/includes/db/DatabaseMysqli.php
@@ -0,0 +1,194 @@
+<?php
+/**
+ * This is the MySQLi database abstraction layer.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Database
+ */
+
+/**
+ * Database abstraction object for PHP extension mysqli.
+ *
+ * @ingroup Database
+ * @since 1.22
+ * @see Database
+ */
+class DatabaseMysqli extends DatabaseMysqlBase {
+
+	/**
+	 * @param $sql string
+	 * @return resource
+	 */
+	protected function doQuery( $sql ) {
+		if ( $this->bufferResults() ) {
+			$ret = $this->mConn->query( $sql );
+		} else {
+			$ret = $this->mConn->query( $sql, MYSQLI_USE_RESULT );
+		}
+		return $ret;
+	}
+
+	protected function mysqlConnect( $realServer ) {
+		# Fail now
+		# Otherwise we get a suppressed fatal error, which is very hard to track down
+		if ( !function_exists( 'mysqli_init' ) ) {
+			throw new DBConnectionError( $this, "MySQLi functions missing,"
+				. " have you compiled PHP with the --with-mysqli option?\n" );
+		}
+
+		$connFlags = 0;
+		if ( $this->mFlags & DBO_SSL ) {
+			$connFlags |= MYSQLI_CLIENT_SSL;
+		}
+		if ( $this->mFlags & DBO_COMPRESS ) {
+			$connFlags |= MYSQLI_CLIENT_COMPRESS;
+		}
+		if ( $this->mFlags & DBO_PERSISTENT ) {
+			$realServer = 'p:' . $realServer;
+		}
+
+		$mysqli = mysqli_init();
+		$numAttempts = 2;
+
+		for ( $i = 0; $i < $numAttempts; $i++ ) {
+			if ( $i > 1 ) {
+				usleep( 1000 );
+			}
+			if ( $mysqli->real_connect( $realServer, $this->mUser,
+				$this->mPassword, $this->mDBname, null, null, $connFlags ) )
+			{
+				return $mysqli;
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * @return bool
+	 */
+	protected function closeConnection() {
+		return $this->mConn->close();
+	}
+
+	/**
+	 * @return int
+	 */
+	function insertId() {
+		return $this->mConn->insert_id;
+	}
+
+	/**
+	 * @return int
+	 */
+	function lastErrno() {
+		if ( $this->mConn ) {
+			return $this->mConn->errno;
+		} else {
+			return mysqli_connect_errno();
+		}
+	}
+
+	/**
+	 * @return int
+	 */
+	function affectedRows() {
+		return $this->mConn->affected_rows;
+	}
+
+	/**
+	 * @param $db
+	 * @return bool
+	 */
+	function selectDB( $db ) {
+		$this->mDBname = $db;
+		return $this->mConn->select_db( $db );
+	}
+
+	/**
+	 * @return string
+	 */
+	function getServerVersion() {
+		return $this->mConn->server_info;
+	}
+
+	protected function mysqlFreeResult( $res ) {
+		$res->free_result();
+		return true;
+	}
+
+	protected function mysqlFetchObject( $res ) {
+		$object = $res->fetch_object();
+		if ( $object === null ) {
+			return false;
+		}
+		return $object;
+	}
+
+	protected function mysqlFetchArray( $res ) {
+		$array = $res->fetch_array();
+		if ( $array === null ) {
+			return false;
+		}
+		return $array;
+	}
+
+	protected function mysqlNumRows( $res ) {
+		return $res->num_rows;
+	}
+
+	protected function mysqlNumFields( $res ) {
+		return $res->field_count;
+	}
+
+	protected function mysqlFetchField( $res, $n ) {
+		$field = $res->fetch_field_direct( $n );
+		$field->not_null = $field->flags & MYSQLI_NOT_NULL_FLAG;
+		$field->primary_key = $field->flags & MYSQLI_PRI_KEY_FLAG;
+		$field->unique_key = $field->flags & MYSQLI_UNIQUE_KEY_FLAG;
+		$field->multiple_key = $field->flags & MYSQLI_MULTIPLE_KEY_FLAG;
+		$field->binary = $field->flags & MYSQLI_BINARY_FLAG;
+		return $field;
+	}
+
+	protected function mysqlFieldName( $res, $n ) {
+		$field = $res->fetch_field_direct( $n );
+		return $field->name;
+	}
+
+	protected function mysqlDataSeek( $res, $row ) {
+		return $res->data_seek( $row );
+	}
+
+	protected function mysqlError( $conn = null ) {
+		if ($conn === null) {
+			return mysqli_connect_error();
+		} else {
+			return $conn->error;
+		}
+	}
+
+	protected function mysqlRealEscapeString( $s ) {
+		return $this->mConn->real_escape_string( $s );
+	}
+
+	protected function mysqlPing() {
+		return $this->mConn->ping();
+	}
+
+}
diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php
index 75b3550a..fbaa4da5 100644
--- a/includes/db/DatabaseOracle.php
+++ b/includes/db/DatabaseOracle.php
@@ -206,7 +206,7 @@ class DatabaseOracle extends DatabaseBase {
 	}
 
 	function __destruct() {
-		if ($this->mOpened) {
+		if ( $this->mOpened ) {
 			wfSuppressWarnings();
 			$this->close();
 			wfRestoreWarnings();
@@ -249,6 +249,7 @@ class DatabaseOracle extends DatabaseBase {
 	 * @return DatabaseBase|null
 	 */
 	function open( $server, $user, $password, $dbName ) {
+		global $wgDBOracleDRCP;
 		if ( !function_exists( 'oci_connect' ) ) {
 			throw new DBConnectionError( $this, "Oracle functions missing, have you compiled PHP with the --with-oci8 option?\n (Note: if you recently installed PHP, you may need to restart your webserver and database)\n" );
 		}
@@ -276,9 +277,16 @@ class DatabaseOracle extends DatabaseBase {
 			return;
 		}
 
+		if ( $wgDBOracleDRCP ) {
+			$this->setFlag( DBO_PERSISTENT );
+		}
+
 		$session_mode = $this->mFlags & DBO_SYSDBA ? OCI_SYSDBA : OCI_DEFAULT;
+
 		wfSuppressWarnings();
-		if ( $this->mFlags & DBO_DEFAULT ) {
+		if ( $this->mFlags & DBO_PERSISTENT ) {
+			$this->mConn = oci_pconnect( $this->mUser, $this->mPassword, $this->mServer, $this->defaultCharset, $session_mode );
+		} elseif ( $this->mFlags & DBO_DEFAULT ) {
 			$this->mConn = oci_new_connect( $this->mUser, $this->mPassword, $this->mServer, $this->defaultCharset, $session_mode );
 		} else {
 			$this->mConn = oci_connect( $this->mUser, $this->mPassword, $this->mServer, $this->defaultCharset, $session_mode );
@@ -324,7 +332,7 @@ class DatabaseOracle extends DatabaseBase {
 
 		// handle some oracle specifics
 		// remove AS column/table/subquery namings
-		if( !$this->getFlag( DBO_DDLMODE ) ) {
+		if ( !$this->getFlag( DBO_DDLMODE ) ) {
 			$sql = preg_replace( '/ as /i', ' ', $sql );
 		}
 
@@ -333,7 +341,7 @@ class DatabaseOracle extends DatabaseBase {
 		$union_unique = ( preg_match( '/\/\* UNION_UNIQUE \*\/ /', $sql ) != 0 );
 		// EXPLAIN syntax in Oracle is EXPLAIN PLAN FOR and it return nothing
 		// you have to select data from plan table after explain
-		$explain_id = date( 'dmYHis' );
+		$explain_id = MWTimestamp::getLocalInstance()->format( 'dmYHis' );
 
 		$sql = preg_replace( '/^EXPLAIN /', 'EXPLAIN PLAN SET STATEMENT_ID = \'' . $explain_id . '\' FOR', $sql, 1, $explain_count );
 
@@ -456,15 +464,15 @@ class DatabaseOracle extends DatabaseBase {
 	 * If errors are explicitly ignored, returns NULL on failure
 	 * @return bool
 	 */
-	function indexInfo( $table, $index, $fname = 'DatabaseOracle::indexExists' ) {
+	function indexInfo( $table, $index, $fname = __METHOD__ ) {
 		return false;
 	}
 
-	function indexUnique( $table, $index, $fname = 'DatabaseOracle::indexUnique' ) {
+	function indexUnique( $table, $index, $fname = __METHOD__ ) {
 		return false;
 	}
 
-	function insert( $table, $a, $fname = 'DatabaseOracle::insert', $options = array() ) {
+	function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
 		if ( !count( $a ) ) {
 			return true;
 		}
@@ -493,7 +501,7 @@ class DatabaseOracle extends DatabaseBase {
 		return $retVal;
 	}
 
-	private function fieldBindStatement ( $table, $col, &$val, $includeCol = false ) {
+	private function fieldBindStatement( $table, $col, &$val, $includeCol = false ) {
 		$col_info = $this->fieldInfoMulti( $table, $col );
 		$col_type = $col_info != false ? $col_info->type() : 'CONSTANT';
 
@@ -624,7 +632,7 @@ class DatabaseOracle extends DatabaseBase {
 		oci_free_statement( $stmt );
 	}
 
-	function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabaseOracle::insertSelect',
+	function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
 		$insertOptions = array(), $selectOptions = array() )
 	{
 		$destTable = $this->tableName( $destTable );
@@ -677,7 +685,7 @@ class DatabaseOracle extends DatabaseBase {
 		Using uppercase because that's the only way Oracle can handle
 		quoted tablenames
 		*/
-		switch( $name ) {
+		switch ( $name ) {
 			case 'user':
 				$name = 'MWUSER';
 				break;
@@ -686,12 +694,12 @@ class DatabaseOracle extends DatabaseBase {
 				break;
 		}
 
-		return parent::tableName( strtoupper( $name ), $format );
+		return strtoupper( parent::tableName( $name, $format ) );
 	}
 
 	function tableNameInternal( $name ) {
 		$name = $this->tableName( $name );
-		return preg_replace( '/.*\.(.*)/', '$1', $name);
+		return preg_replace( '/.*\.(.*)/', '$1', $name );
 	}
 	/**
 	 * Return the next in a sequence, save the value for retrieval via insertId()
@@ -756,14 +764,14 @@ class DatabaseOracle extends DatabaseBase {
 
 	function unionQueries( $sqls, $all ) {
 		$glue = ' UNION ALL ';
-		return 'SELECT * ' . ( $all ? '':'/* UNION_UNIQUE */ ' ) . 'FROM (' . implode( $glue, $sqls ) . ')';
+		return 'SELECT * ' . ( $all ? '' : '/* UNION_UNIQUE */ ' ) . 'FROM (' . implode( $glue, $sqls ) . ')';
 	}
 
 	function wasDeadlock() {
 		return $this->lastErrno() == 'OCI-00060';
 	}
 
-	function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseOracle::duplicateTableStructure' ) {
+	function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
 		$temporary = $temporary ? 'TRUE' : 'FALSE';
 
 		$newName = strtoupper( $newName );
@@ -776,7 +784,7 @@ class DatabaseOracle extends DatabaseBase {
 		return $this->doQuery( "BEGIN DUPLICATE_TABLE( '$tabName', '$oldPrefix', '$newPrefix', $temporary ); END;" );
 	}
 
-	function listTables( $prefix = null, $fname = 'DatabaseOracle::listTables' ) {
+	function listTables( $prefix = null, $fname = __METHOD__ ) {
 		$listWhere = '';
 		if ( !empty( $prefix ) ) {
 			$listWhere = ' AND table_name LIKE \'' . strtoupper( $prefix ) . '%\'';
@@ -791,17 +799,18 @@ class DatabaseOracle extends DatabaseBase {
 		$endArray[] = strtoupper( $prefix . 'PAGE' );
 		$endArray[] = strtoupper( $prefix . 'IMAGE' );
 		$fixedOrderTabs = $endArray;
-		while ( ($row = $result->fetchRow()) !== false ) {
-			if ( !in_array( $row['table_name'], $fixedOrderTabs ) )
+		while ( ( $row = $result->fetchRow() ) !== false ) {
+			if ( !in_array( $row['table_name'], $fixedOrderTabs ) ) {
 				$endArray[] = $row['table_name'];
+			}
 		}
 
 		return $endArray;
 	}
 
-	public function dropTable( $tableName, $fName = 'DatabaseOracle::dropTable' ) {
+	public function dropTable( $tableName, $fName = __METHOD__ ) {
 		$tableName = $this->tableName( $tableName );
-		if( !$this->tableExists( $tableName ) ) {
+		if ( !$this->tableExists( $tableName ) ) {
 			return false;
 		}
 
@@ -836,7 +845,7 @@ class DatabaseOracle extends DatabaseBase {
 	/**
 	 * @return string wikitext of a link to the server software's web site
 	 */
-	public static function getSoftwareLink() {
+	public function getSoftwareLink() {
 		return '[http://www.oracle.com/ Oracle]';
 	}
 
@@ -856,7 +865,7 @@ class DatabaseOracle extends DatabaseBase {
 	 * Query whether a given index exists
 	 * @return bool
 	 */
-	function indexExists( $table, $index, $fname = 'DatabaseOracle::indexExists' ) {
+	function indexExists( $table, $index, $fname = __METHOD__ ) {
 		$table = $this->tableName( $table );
 		$table = strtoupper( $this->removeIdentifierQuotes( $table ) );
 		$index = strtoupper( $index );
@@ -874,7 +883,7 @@ class DatabaseOracle extends DatabaseBase {
 
 	/**
 	 * Query whether a given table exists (in the given schema, or the default mw one if not given)
-	 * @return int
+	 * @return bool
 	 */
 	function tableExists( $table, $fname = __METHOD__ ) {
 		$table = $this->tableName( $table );
@@ -882,13 +891,14 @@ class DatabaseOracle extends DatabaseBase {
 		$owner = $this->addQuotes( strtoupper( $this->mDBname ) );
 		$SQL = "SELECT 1 FROM all_tables WHERE owner=$owner AND table_name=$table";
 		$res = $this->doQuery( $SQL );
-		if ( $res ) {
-			$count = $res->numRows();
-			$res->free();
+		if ( $res && $res->numRows() > 0 ) {
+			$exists = true;
 		} else {
-			$count = 0;
+			$exists = false;
 		}
-		return $count;
+
+		$res->free();
+		return $exists;
 	}
 
 	/**
@@ -906,7 +916,7 @@ class DatabaseOracle extends DatabaseBase {
 		if ( is_array( $table ) ) {
 			$table = array_map( array( &$this, 'tableNameInternal' ), $table );
 			$tableWhere = 'IN (';
-			foreach( $table as &$singleTable ) {
+			foreach ( $table as &$singleTable ) {
 				$singleTable = $this->removeIdentifierQuotes( $singleTable );
 				if ( isset( $this->mFieldInfoCache["$singleTable.$field"] ) ) {
 					return $this->mFieldInfoCache["$singleTable.$field"];
@@ -919,7 +929,7 @@ class DatabaseOracle extends DatabaseBase {
 			if ( isset( $this->mFieldInfoCache["$table.$field"] ) ) {
 				return $this->mFieldInfoCache["$table.$field"];
 			}
-			$tableWhere = '= \''.$table.'\'';
+			$tableWhere = '= \'' . $table . '\'';
 		}
 
 		$fieldInfoStmt = oci_parse( $this->mConn, 'SELECT * FROM wiki_field_info_full WHERE table_name ' . $tableWhere . ' and column_name = \'' . $field . '\'' );
@@ -931,7 +941,7 @@ class DatabaseOracle extends DatabaseBase {
 		$res = new ORAResult( $this, $fieldInfoStmt );
 		if ( $res->numRows() == 0 ) {
 			if ( is_array( $table ) ) {
-				foreach( $table as &$singleTable ) {
+				foreach ( $table as &$singleTable ) {
 					$this->mFieldInfoCache["$singleTable.$field"] = false;
 				}
 			} else {
@@ -960,12 +970,12 @@ class DatabaseOracle extends DatabaseBase {
 		return $this->fieldInfoMulti( $table, $field );
 	}
 
-	protected function doBegin( $fname = 'DatabaseOracle::begin' ) {
+	protected function doBegin( $fname = __METHOD__ ) {
 		$this->mTrxLevel = 1;
 		$this->doQuery( 'SET CONSTRAINTS ALL DEFERRED' );
 	}
 
-	protected function doCommit( $fname = 'DatabaseOracle::commit' ) {
+	protected function doCommit( $fname = __METHOD__ ) {
 		if ( $this->mTrxLevel ) {
 			$ret = oci_commit( $this->mConn );
 			if ( !$ret ) {
@@ -976,7 +986,7 @@ class DatabaseOracle extends DatabaseBase {
 		}
 	}
 
-	protected function doRollback( $fname = 'DatabaseOracle::rollback' ) {
+	protected function doRollback( $fname = __METHOD__ ) {
 		if ( $this->mTrxLevel ) {
 			oci_rollback( $this->mConn );
 			$this->mTrxLevel = 0;
@@ -986,7 +996,7 @@ class DatabaseOracle extends DatabaseBase {
 
 	/* defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}'; */
 	function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
-		$fname = 'DatabaseOracle::sourceStream', $inputCallback = false ) {
+		$fname = __METHOD__, $inputCallback = false ) {
 		$cmd = '';
 		$done = false;
 		$dollarquote = false;
@@ -1121,16 +1131,16 @@ class DatabaseOracle extends DatabaseBase {
 		}
 	}
 
-	private function wrapConditionsForWhere ( $table, $conds, $parentCol = null ) {
+	private function wrapConditionsForWhere( $table, $conds, $parentCol = null ) {
 		$conds2 = array();
 		foreach ( $conds as $col => $val ) {
 			if ( is_array( $val ) ) {
-				$conds2[$col] = $this->wrapConditionsForWhere ( $table, $val, $col );
+				$conds2[$col] = $this->wrapConditionsForWhere( $table, $val, $col );
 			} else {
 				if ( is_numeric( $col ) && $parentCol != null ) {
-					$this->wrapFieldForWhere ( $table, $parentCol, $val );
+					$this->wrapFieldForWhere( $table, $parentCol, $val );
 				} else {
-					$this->wrapFieldForWhere ( $table, $col, $val );
+					$this->wrapFieldForWhere( $table, $col, $val );
 				}
 				$conds2[$col] = $val;
 			}
@@ -1138,7 +1148,7 @@ class DatabaseOracle extends DatabaseBase {
 		return $conds2;
 	}
 
-	function selectRow( $table, $vars, $conds, $fname = 'DatabaseOracle::selectRow', $options = array(), $join_conds = array() ) {
+	function selectRow( $table, $vars, $conds, $fname = __METHOD__, $options = array(), $join_conds = array() ) {
 		if ( is_array( $conds ) ) {
 			$conds = $this->wrapConditionsForWhere( $table, $conds );
 		}
@@ -1187,7 +1197,7 @@ class DatabaseOracle extends DatabaseBase {
 		return array( $startOpts, $useIndex, $preLimitTail, $postLimitTail );
 	}
 
-	public function delete( $table, $conds, $fname = 'DatabaseOracle::delete' ) {
+	public function delete( $table, $conds, $fname = __METHOD__ ) {
 		if ( is_array( $conds ) ) {
 			$conds = $this->wrapConditionsForWhere( $table, $conds );
 		}
@@ -1210,7 +1220,7 @@ class DatabaseOracle extends DatabaseBase {
 		return parent::delete( $table, $conds, $fname );
 	}
 
-	function update( $table, $values, $conds, $fname = 'DatabaseOracle::update', $options = array() ) {
+	function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
 		global $wgContLang;
 
 		$table = $this->tableName( $table );
diff --git a/includes/db/DatabasePostgres.php b/includes/db/DatabasePostgres.php
index f32d7758..e564a162 100644
--- a/includes/db/DatabasePostgres.php
+++ b/includes/db/DatabasePostgres.php
@@ -117,7 +117,7 @@ SQL;
 	 * @since 1.19
 	 */
 	function defaultValue() {
-		if( $this->has_default ) {
+		if ( $this->has_default ) {
 			return $this->default;
 		} else {
 			return false;
@@ -139,15 +139,15 @@ class PostgresTransactionState {
 		array(
 			"desc" => "%s: Connection state changed from %s -> %s\n",
 			"states" => array(
-				PGSQL_CONNECTION_OK       => "OK",
-				PGSQL_CONNECTION_BAD      => "BAD"
+				PGSQL_CONNECTION_OK => "OK",
+				PGSQL_CONNECTION_BAD => "BAD"
 			)
 		),
 		array(
 			"desc" => "%s: Transaction state changed from %s -> %s\n",
 			"states" => array(
-				PGSQL_TRANSACTION_IDLE    => "IDLE",
-				PGSQL_TRANSACTION_ACTIVE  => "ACTIVE",
+				PGSQL_TRANSACTION_IDLE => "IDLE",
+				PGSQL_TRANSACTION_ACTIVE => "ACTIVE",
 				PGSQL_TRANSACTION_INTRANS => "TRANS",
 				PGSQL_TRANSACTION_INERROR => "ERROR",
 				PGSQL_TRANSACTION_UNKNOWN => "UNKNOWN"
@@ -189,7 +189,7 @@ class PostgresTransactionState {
 	}
 
 	protected function describe_changed( $status, $desc_table ) {
-		if( isset( $desc_table[$status] ) ) {
+		if ( isset( $desc_table[$status] ) ) {
 			return $desc_table[$status];
 		} else {
 			return "STATUS " . $status;
@@ -218,7 +218,7 @@ class SavepointPostgres {
 	protected $id;
 	protected $didbegin;
 
-	public function __construct ( $dbw, $id ) {
+	public function __construct( $dbw, $id ) {
 		$this->dbw = $dbw;
 		$this->id = $id;
 		$this->didbegin = false;
@@ -320,7 +320,7 @@ class DatabasePostgres extends DatabaseBase {
 
 	function hasConstraint( $name ) {
 		$SQL = "SELECT 1 FROM pg_catalog.pg_constraint c, pg_catalog.pg_namespace n WHERE c.connamespace = n.oid AND conname = '" .
-				pg_escape_string( $this->mConn, $name ) . "' AND n.nspname = '" . pg_escape_string( $this->mConn, $this->getCoreSchema() ) ."'";
+				pg_escape_string( $this->mConn, $name ) . "' AND n.nspname = '" . pg_escape_string( $this->mConn, $this->getCoreSchema() ) . "'";
 		$res = $this->doQuery( $SQL );
 		return $this->numRows( $res );
 	}
@@ -438,7 +438,7 @@ class DatabasePostgres extends DatabaseBase {
 			$sql = mb_convert_encoding( $sql, 'UTF-8' );
 		}
 		$this->mTransactionState->check();
-		if( pg_send_query( $this->mConn, $sql ) === false ) {
+		if ( pg_send_query( $this->mConn, $sql ) === false ) {
 			throw new DBUnexpectedError( $this, "Unable to post new query to PostgreSQL\n" );
 		}
 		$this->mLastResult = pg_get_result( $this->mConn );
@@ -450,7 +450,7 @@ class DatabasePostgres extends DatabaseBase {
 		return $this->mLastResult;
 	}
 
-	protected function dumpError () {
+	protected function dumpError() {
 		$diags = array( PGSQL_DIAG_SEVERITY,
 				PGSQL_DIAG_SQLSTATE,
 				PGSQL_DIAG_MESSAGE_PRIMARY,
@@ -464,7 +464,7 @@ class DatabasePostgres extends DatabaseBase {
 				PGSQL_DIAG_SOURCE_LINE,
 				PGSQL_DIAG_SOURCE_FUNCTION );
 		foreach ( $diags as $d ) {
-			wfDebug( sprintf("PgSQL ERROR(%d): %s\n", $d, pg_result_error_field( $this->mLastResult, $d ) ) );
+			wfDebug( sprintf( "PgSQL ERROR(%d): %s\n", $d, pg_result_error_field( $this->mLastResult, $d ) ) );
 		}
 	}
 
@@ -482,7 +482,7 @@ class DatabasePostgres extends DatabaseBase {
 		parent::reportQueryError( $error, $errno, $sql, $fname, false );
 	}
 
-	function queryIgnore( $sql, $fname = 'DatabasePostgres::queryIgnore' ) {
+	function queryIgnore( $sql, $fname = __METHOD__ ) {
 		return $this->query( $sql, $fname, true );
 	}
 
@@ -509,7 +509,7 @@ class DatabasePostgres extends DatabaseBase {
 
 		# @todo hashar: not sure if the following test really trigger if the object
 		#          fetching failed.
-		if( pg_last_error( $this->mConn ) ) {
+		if ( pg_last_error( $this->mConn ) ) {
 			throw new DBUnexpectedError( $this, 'SQL error: ' . htmlspecialchars( pg_last_error( $this->mConn ) ) );
 		}
 		return $row;
@@ -522,7 +522,7 @@ class DatabasePostgres extends DatabaseBase {
 		wfSuppressWarnings();
 		$row = pg_fetch_array( $res );
 		wfRestoreWarnings();
-		if( pg_last_error( $this->mConn ) ) {
+		if ( pg_last_error( $this->mConn ) ) {
 			throw new DBUnexpectedError( $this, 'SQL error: ' . htmlspecialchars( pg_last_error( $this->mConn ) ) );
 		}
 		return $row;
@@ -535,7 +535,7 @@ class DatabasePostgres extends DatabaseBase {
 		wfSuppressWarnings();
 		$n = pg_num_rows( $res );
 		wfRestoreWarnings();
-		if( pg_last_error( $this->mConn ) ) {
+		if ( pg_last_error( $this->mConn ) ) {
 			throw new DBUnexpectedError( $this, 'SQL error: ' . htmlspecialchars( pg_last_error( $this->mConn ) ) );
 		}
 		return $n;
@@ -556,8 +556,10 @@ class DatabasePostgres extends DatabaseBase {
 	}
 
 	/**
-	 * This must be called after nextSequenceVal
-	 * @return null
+	 * Return the result of the last call to nextSequenceValue();
+	 * This must be called after nextSequenceValue().
+	 *
+	 * @return integer|null
 	 */
 	function insertId() {
 		return $this->mInsertId;
@@ -594,7 +596,7 @@ class DatabasePostgres extends DatabaseBase {
 			// Forced result for simulated queries
 			return $this->mAffectedRows;
 		}
-		if( empty( $this->mLastResult ) ) {
+		if ( empty( $this->mLastResult ) ) {
 			return 0;
 		}
 		return pg_affected_rows( $this->mLastResult );
@@ -608,14 +610,14 @@ class DatabasePostgres extends DatabaseBase {
 	 * Takes same arguments as Database::select()
 	 * @return int
 	 */
-	function estimateRowCount( $table, $vars = '*', $conds = '', $fname = 'DatabasePostgres::estimateRowCount', $options = array() ) {
+	function estimateRowCount( $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array() ) {
 		$options['EXPLAIN'] = true;
 		$res = $this->select( $table, $vars, $conds, $fname, $options );
 		$rows = -1;
 		if ( $res ) {
 			$row = $this->fetchRow( $res );
 			$count = array();
-			if( preg_match( '/rows=(\d+)/', $row[0], $count ) ) {
+			if ( preg_match( '/rows=(\d+)/', $row[0], $count ) ) {
 				$rows = $count[1];
 			}
 		}
@@ -627,7 +629,7 @@ class DatabasePostgres extends DatabaseBase {
 	 * If errors are explicitly ignored, returns NULL on failure
 	 * @return bool|null
 	 */
-	function indexInfo( $table, $index, $fname = 'DatabasePostgres::indexInfo' ) {
+	function indexInfo( $table, $index, $fname = __METHOD__ ) {
 		$sql = "SELECT indexname FROM pg_indexes WHERE tablename='$table'";
 		$res = $this->query( $sql, $fname );
 		if ( !$res ) {
@@ -647,9 +649,10 @@ class DatabasePostgres extends DatabaseBase {
 	 * @since 1.19
 	 * @return Array
 	 */
-	function indexAttributes ( $index, $schema = false ) {
-		if ( $schema === false )
+	function indexAttributes( $index, $schema = false ) {
+		if ( $schema === false ) {
 			$schema = $this->getCoreSchema();
+		}
 		/*
 		 * A subquery would be not needed if we didn't care about the order
 		 * of attributes, but we do
@@ -702,8 +705,8 @@ __INDEXATTR__;
 		return $a;
 	}
 
-	function indexUnique( $table, $index, $fname = 'DatabasePostgres::indexUnique' ) {
-		$sql = "SELECT indexname FROM pg_indexes WHERE tablename='{$table}'".
+	function indexUnique( $table, $index, $fname = __METHOD__ ) {
+		$sql = "SELECT indexname FROM pg_indexes WHERE tablename='{$table}'" .
 			" AND indexdef LIKE 'CREATE UNIQUE%(" .
 			$this->strencode( $this->indexName( $index ) ) .
 			")'";
@@ -730,7 +733,7 @@ __INDEXATTR__;
 	 *
 	 * @return bool Success of insert operation. IGNORE always returns true.
 	 */
-	function insert( $table, $args, $fname = 'DatabasePostgres::insert', $options = array() ) {
+	function insert( $table, $args, $fname = __METHOD__, $options = array() ) {
 		if ( !count( $args ) ) {
 			return true;
 		}
@@ -847,12 +850,12 @@ __INDEXATTR__;
 	 * @todo FIXME: Implement this a little better (seperate select/insert)?
 	 * @return bool
 	 */
-	function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabasePostgres::insertSelect',
+	function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
 		$insertOptions = array(), $selectOptions = array() )
 	{
 		$destTable = $this->tableName( $destTable );
 
-		if( !is_array( $insertOptions ) ) {
+		if ( !is_array( $insertOptions ) ) {
 			$insertOptions = array( $insertOptions );
 		}
 
@@ -868,11 +871,11 @@ __INDEXATTR__;
 			$savepoint->savepoint();
 		}
 
-		if( !is_array( $selectOptions ) ) {
+		if ( !is_array( $selectOptions ) ) {
 			$selectOptions = array( $selectOptions );
 		}
 		list( $startOpts, $useIndex, $tailOpts ) = $this->makeSelectOptions( $selectOptions );
-		if( is_array( $srcTable ) ) {
+		if ( is_array( $srcTable ) ) {
 			$srcTable = implode( ',', array_map( array( &$this, 'tableName' ), $srcTable ) );
 		} else {
 			$srcTable = $this->tableName( $srcTable );
@@ -889,9 +892,9 @@ __INDEXATTR__;
 		$sql .= " $tailOpts";
 
 		$res = (bool)$this->query( $sql, $fname, $savepoint );
-		if( $savepoint ) {
+		if ( $savepoint ) {
 			$bar = pg_last_error();
-			if( $bar != false ) {
+			if ( $bar != false ) {
 				$savepoint->rollback();
 			} else {
 				$savepoint->release();
@@ -912,7 +915,7 @@ __INDEXATTR__;
 
 	function tableName( $name, $format = 'quoted' ) {
 		# Replace reserved words with better ones
-		switch( $name ) {
+		switch ( $name ) {
 			case 'user':
 				return $this->realTableName( 'mwuser', $format );
 			case 'text':
@@ -958,7 +961,7 @@ __INDEXATTR__;
 			FROM pg_class c, pg_attribute a, pg_type t
 			WHERE relname='$table' AND a.attrelid=c.oid AND
 				a.atttypid=t.oid and a.attname='$field'";
-		$res =$this->query( $sql );
+		$res = $this->query( $sql );
 		$row = $this->fetchObject( $res );
 		if ( $row->ftype == 'varchar' ) {
 			$size = $row->size - 4;
@@ -976,21 +979,21 @@ __INDEXATTR__;
 		return $this->lastErrno() == '40P01';
 	}
 
-	function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabasePostgres::duplicateTableStructure' ) {
+	function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
 		$newName = $this->addIdentifierQuotes( $newName );
 		$oldName = $this->addIdentifierQuotes( $oldName );
 		return $this->query( 'CREATE ' . ( $temporary ? 'TEMPORARY ' : '' ) . " TABLE $newName (LIKE $oldName INCLUDING DEFAULTS)", $fname );
 	}
 
-	function listTables( $prefix = null, $fname = 'DatabasePostgres::listTables' ) {
+	function listTables( $prefix = null, $fname = __METHOD__ ) {
 		$eschema = $this->addQuotes( $this->getCoreSchema() );
 		$result = $this->query( "SELECT tablename FROM pg_tables WHERE schemaname = $eschema", $fname );
 		$endArray = array();
 
-		foreach( $result as $table ) {
+		foreach ( $result as $table ) {
 			$vars = get_object_vars( $table );
 			$table = array_pop( $vars );
-			if( !$prefix || strpos( $table, $prefix ) === 0 ) {
+			if ( !$prefix || strpos( $table, $prefix ) === 0 ) {
 				$endArray[] = $table;
 			}
 		}
@@ -1021,26 +1024,26 @@ __INDEXATTR__;
 	 * @return string
 	 */
 	function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
-		if( false === $limit ) {
-			$limit = strlen( $text )-1;
+		if ( false === $limit ) {
+			$limit = strlen( $text ) - 1;
 			$output = array();
 		}
-		if( '{}' == $text ) {
+		if ( '{}' == $text ) {
 			return $output;
 		}
 		do {
-			if ( '{' != $text{$offset} ) {
+			if ( '{' != $text[$offset] ) {
 				preg_match( "/(\\{?\"([^\"\\\\]|\\\\.)*\"|[^,{}]+)+([,}]+)/",
 					$text, $match, 0, $offset );
 				$offset += strlen( $match[0] );
-				$output[] = ( '"' != $match[1]{0}
+				$output[] = ( '"' != $match[1][0]
 						? $match[1]
 						: stripcslashes( substr( $match[1], 1, -1 ) ) );
 				if ( '},' == $match[3] ) {
 					return $output;
 				}
 			} else {
-				$offset = $this->pg_array_parse( $text, $output, $limit, $offset+1 );
+				$offset = $this->pg_array_parse( $text, $output, $limit, $offset + 1 );
 			}
 		} while ( $limit > $offset );
 		return $output;
@@ -1056,7 +1059,7 @@ __INDEXATTR__;
 	/**
 	 * @return string wikitext of a link to the server software's web site
 	 */
-	public static function getSoftwareLink() {
+	public function getSoftwareLink() {
 		return '[http://www.postgresql.org/ PostgreSQL]';
 	}
 
@@ -1406,7 +1409,8 @@ SQL;
 		return array( $startOpts, $useIndex, $preLimitTail, $postLimitTail );
 	}
 
-	function setFakeMaster( $enabled = true ) {}
+	function setFakeMaster( $enabled = true ) {
+	}
 
 	function getDBname() {
 		return $this->mDBname;
@@ -1473,7 +1477,7 @@ SQL;
 				sleep( 1 );
 			}
 		}
-		wfDebug( __METHOD__." failed to acquire lock\n" );
+		wfDebug( __METHOD__ . " failed to acquire lock\n" );
 		return false;
 	}
 
diff --git a/includes/db/DatabaseSqlite.php b/includes/db/DatabaseSqlite.php
index 0789e1b1..4a51226f 100644
--- a/includes/db/DatabaseSqlite.php
+++ b/includes/db/DatabaseSqlite.php
@@ -52,9 +52,9 @@ class DatabaseSqlite extends DatabaseBase {
 		$this->mName = $dbName;
 		parent::__construct( $server, $user, $password, $dbName, $flags );
 		// parent doesn't open when $user is false, but we can work with $dbName
-		if( $dbName ) {
+		if ( $dbName && !$this->isOpen() ) {
 			global $wgSharedDB;
-			if( $this->open( $server, $user, $password, $dbName ) && $wgSharedDB ) {
+			if ( $this->open( $server, $user, $password, $dbName ) && $wgSharedDB ) {
 				$this->attachDatabase( $wgSharedDB );
 			}
 		}
@@ -68,7 +68,7 @@ class DatabaseSqlite extends DatabaseBase {
 	}
 
 	/**
-	 * @todo: check if it should be true like parent class
+	 * @todo Check if it should be true like parent class
 	 *
 	 * @return bool
 	 */
@@ -90,6 +90,7 @@ class DatabaseSqlite extends DatabaseBase {
 	function open( $server, $user, $pass, $dbName ) {
 		global $wgSQLiteDataDir;
 
+		$this->close();
 		$fileName = self::generateFileName( $wgSQLiteDataDir, $dbName );
 		if ( !is_readable( $fileName ) ) {
 			$this->mConn = false;
@@ -200,7 +201,7 @@ class DatabaseSqlite extends DatabaseBase {
 	 *
 	 * @return ResultWrapper
 	 */
-	function attachDatabase( $name, $file = false, $fname = 'DatabaseSqlite::attachDatabase' ) {
+	function attachDatabase( $name, $file = false, $fname = __METHOD__ ) {
 		global $wgSQLiteDataDir;
 		if ( !$file ) {
 			$file = self::generateFileName( $wgSQLiteDataDir, $name );
@@ -420,7 +421,7 @@ class DatabaseSqlite extends DatabaseBase {
 	 *
 	 * @return array
 	 */
-	function indexInfo( $table, $index, $fname = 'DatabaseSqlite::indexExists' ) {
+	function indexInfo( $table, $index, $fname = __METHOD__ ) {
 		$sql = 'PRAGMA index_info(' . $this->addQuotes( $this->indexName( $index ) ) . ')';
 		$res = $this->query( $sql, $fname );
 		if ( !$res ) {
@@ -442,7 +443,7 @@ class DatabaseSqlite extends DatabaseBase {
 	 * @param $fname string
 	 * @return bool|null
 	 */
-	function indexUnique( $table, $index, $fname = 'DatabaseSqlite::indexUnique' ) {
+	function indexUnique( $table, $index, $fname = __METHOD__ ) {
 		$row = $this->selectRow( 'sqlite_master', '*',
 			array(
 				'type' => 'index',
@@ -471,7 +472,7 @@ class DatabaseSqlite extends DatabaseBase {
 	 */
 	function makeSelectOptions( $options ) {
 		foreach ( $options as $k => $v ) {
-			if ( is_numeric( $k ) && ($v == 'FOR UPDATE' || $v == 'LOCK IN SHARE MODE') ) {
+			if ( is_numeric( $k ) && ( $v == 'FOR UPDATE' || $v == 'LOCK IN SHARE MODE' ) ) {
 				$options[$k] = '';
 			}
 		}
@@ -514,7 +515,7 @@ class DatabaseSqlite extends DatabaseBase {
 	 * Based on generic method (parent) with some prior SQLite-sepcific adjustments
 	 * @return bool
 	 */
-	function insert( $table, $a, $fname = 'DatabaseSqlite::insert', $options = array() ) {
+	function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
 		if ( !count( $a ) ) {
 			return true;
 		}
@@ -541,8 +542,10 @@ class DatabaseSqlite extends DatabaseBase {
 	 * @param $fname string
 	 * @return bool|ResultWrapper
 	 */
-	function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseSqlite::replace' ) {
-		if ( !count( $rows ) ) return true;
+	function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
+		if ( !count( $rows ) ) {
+			return true;
+		}
 
 		# SQLite can't handle multi-row replaces, so divide up into multiple single-row queries
 		if ( isset( $rows[0] ) && is_array( $rows[0] ) ) {
@@ -610,7 +613,7 @@ class DatabaseSqlite extends DatabaseBase {
 	/**
 	 * @return string wikitext of a link to the server software's web site
 	 */
-	public static function getSoftwareLink() {
+	public function getSoftwareLink() {
 		return "[http://sqlite.org/ SQLite]";
 	}
 
@@ -653,7 +656,11 @@ class DatabaseSqlite extends DatabaseBase {
 		if ( $this->mTrxLevel == 1 ) {
 			$this->commit( __METHOD__ );
 		}
-		$this->mConn->beginTransaction();
+		try {
+			$this->mConn->beginTransaction();
+		} catch ( PDOException $e ) {
+			throw new DBUnexpectedError( $this, 'Error in BEGIN query: ' . $e->getMessage() );
+		}
 		$this->mTrxLevel = 1;
 	}
 
@@ -661,7 +668,11 @@ class DatabaseSqlite extends DatabaseBase {
 		if ( $this->mTrxLevel == 0 ) {
 			return;
 		}
-		$this->mConn->commit();
+		try {
+			$this->mConn->commit();
+		} catch ( PDOException $e ) {
+			throw new DBUnexpectedError( $this, 'Error in COMMIT query: ' . $e->getMessage() );
+		}
 		$this->mTrxLevel = 0;
 	}
 
@@ -707,7 +718,9 @@ class DatabaseSqlite extends DatabaseBase {
 	function addQuotes( $s ) {
 		if ( $s instanceof Blob ) {
 			return "x'" . bin2hex( $s->fetch() ) . "'";
-		} else if ( strpos( $s, "\0" ) !== false ) {
+		} elseif ( is_bool( $s ) ) {
+			return (int)$s;
+		} elseif ( strpos( $s, "\0" ) !== false ) {
 			// SQLite doesn't support \0 in strings, so use the hex representation as a workaround.
 			// This is a known limitation of SQLite's mprintf function which PDO should work around,
 			// but doesn't. I have reported this to php.net as bug #63419:
@@ -813,7 +826,7 @@ class DatabaseSqlite extends DatabaseBase {
 	 * @param $fname string
 	 * @return bool|ResultWrapper
 	 */
-	function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseSqlite::duplicateTableStructure' ) {
+	function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
 		$res = $this->query( "SELECT sql FROM sqlite_master WHERE tbl_name=" . $this->addQuotes( $oldName ) . " AND type='table'", $fname );
 		$obj = $this->fetchObject( $res );
 		if ( !$obj ) {
@@ -839,7 +852,7 @@ class DatabaseSqlite extends DatabaseBase {
 	 *
 	 * @return array
 	 */
-	function listTables( $prefix = null, $fname = 'DatabaseSqlite::listTables' ) {
+	function listTables( $prefix = null, $fname = __METHOD__ ) {
 		$result = $this->select(
 			'sqlite_master',
 			'name',
@@ -848,11 +861,11 @@ class DatabaseSqlite extends DatabaseBase {
 
 		$endArray = array();
 
-		foreach( $result as $table ) {
+		foreach ( $result as $table ) {
 			$vars = get_object_vars( $table );
 			$table = array_pop( $vars );
 
-			if( !$prefix || strpos( $table, $prefix ) === 0 ) {
+			if ( !$prefix || strpos( $table, $prefix ) === 0 ) {
 				if ( strpos( $table, 'sqlite_' ) !== 0 ) {
 					$endArray[] = $table;
 				}
diff --git a/includes/db/DatabaseUtility.php b/includes/db/DatabaseUtility.php
index 9a1c8bde..de58bab6 100644
--- a/includes/db/DatabaseUtility.php
+++ b/includes/db/DatabaseUtility.php
@@ -253,7 +253,8 @@ class FakeResultWrapper extends ResultWrapper {
 		$this->pos = $row;
 	}
 
-	function free() {}
+	function free() {
+	}
 
 	// Callers want to be able to access fields with $this->fieldName
 	function fetchObject() {
diff --git a/includes/db/IORMRow.php b/includes/db/IORMRow.php
index 6bc0cdd2..39411791 100644
--- a/includes/db/IORMRow.php
+++ b/includes/db/IORMRow.php
@@ -33,21 +33,11 @@
 
 interface IORMRow {
 
-	/**
-	 * Constructor.
-	 *
-	 * @since 1.20
-	 *
-	 * @param IORMTable $table
-	 * @param array|null $fields
-	 * @param boolean $loadDefaults
-	 */
-	public function __construct( IORMTable $table, $fields = null, $loadDefaults = false );
-
 	/**
 	 * Load the specified fields from the database.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @param array|null $fields
 	 * @param boolean $override
@@ -74,8 +64,9 @@ interface IORMRow {
 	 * Gets the value of a field but first loads it if not done so already.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
-	 * @param string$name
+	 * @param string $name
 	 *
 	 * @return mixed
 	 */
@@ -155,6 +146,7 @@ interface IORMRow {
 	 * Load the default values, via getDefaults.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @param boolean $override
 	 */
@@ -167,6 +159,7 @@ interface IORMRow {
 	 * @since 1.20
 	 *
 	 * @param string|null $functionName
+	 * @deprecated since 1.22
 	 *
 	 * @return boolean Success indicator
 	 */
@@ -176,6 +169,7 @@ interface IORMRow {
 	 * Removes the object from the database.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @return boolean Success indicator
 	 */
@@ -215,9 +209,9 @@ interface IORMRow {
 
 	/**
 	 * Add an amount (can be negative) to the specified field (needs to be numeric).
-	 * TODO: most off this stuff makes more sense in the table class
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @param string $field
 	 * @param integer $amount
@@ -239,6 +233,7 @@ interface IORMRow {
 	 * Computes and updates the values of the summary fields.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @param array|string|null $summaryFields
 	 */
@@ -248,6 +243,7 @@ interface IORMRow {
 	 * Sets the value for the @see $updateSummaries field.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @param boolean $update
 	 */
@@ -257,6 +253,7 @@ interface IORMRow {
 	 * Sets the value for the @see $inSummaryMode field.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @param boolean $summaryMode
 	 */
@@ -266,6 +263,7 @@ interface IORMRow {
 	 * Returns the table this IORMRow is a row in.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @return IORMTable
 	 */
diff --git a/includes/db/LBFactory.php b/includes/db/LBFactory.php
index d469e867..16c43a00 100644
--- a/includes/db/LBFactory.php
+++ b/includes/db/LBFactory.php
@@ -134,7 +134,8 @@ abstract class LBFactory {
 	 * Prepare all tracked load balancers for shutdown
 	 * STUB
 	 */
-	function shutdown() {}
+	function shutdown() {
+	}
 
 	/**
 	 * Call a method of each tracked load balancer
@@ -201,7 +202,7 @@ class LBFactory_Simple extends LBFactory {
 				$flags |= DBO_COMPRESS;
 			}
 
-			$servers = array(array(
+			$servers = array( array(
 				'host' => $wgDBserver,
 				'user' => $wgDBuser,
 				'password' => $wgDBpassword,
@@ -256,6 +257,7 @@ class LBFactory_Simple extends LBFactory {
 		if ( !isset( $this->extLBs[$cluster] ) ) {
 			$this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki );
 			$this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) );
+			$this->chronProt->initLB( $this->extLBs[$cluster] );
 		}
 		return $this->extLBs[$cluster];
 	}
@@ -280,6 +282,9 @@ class LBFactory_Simple extends LBFactory {
 		if ( $this->mainLB ) {
 			$this->chronProt->shutdownLB( $this->mainLB );
 		}
+		foreach ( $this->extLBs as $extLB ) {
+			$this->chronProt->shutdownLB( $extLB );
+		}
 		$this->chronProt->shutdown();
 		$this->commitMasterChanges();
 	}
@@ -292,21 +297,27 @@ class LBFactory_Simple extends LBFactory {
  * LBFactory::enableBackend() to return to normal behavior
  */
 class LBFactory_Fake extends LBFactory {
-	function __construct( $conf ) {}
+	function __construct( $conf ) {
+	}
 
-	function newMainLB( $wiki = false) {
+	function newMainLB( $wiki = false ) {
 		throw new DBAccessError;
 	}
+
 	function getMainLB( $wiki = false ) {
 		throw new DBAccessError;
 	}
+
 	function newExternalLB( $cluster, $wiki = false ) {
 		throw new DBAccessError;
 	}
+
 	function &getExternalLB( $cluster, $wiki = false ) {
 		throw new DBAccessError;
 	}
-	function forEachLB( $callback, $params = array() ) {}
+
+	function forEachLB( $callback, $params = array() ) {
+	}
 }
 
 /**
@@ -317,76 +328,3 @@ class DBAccessError extends MWException {
 		parent::__construct( "Mediawiki tried to access the database via wfGetDB(). This is not allowed." );
 	}
 }
-
-/**
- * Class for ensuring a consistent ordering of events as seen by the user, despite replication.
- * Kind of like Hawking's [[Chronology Protection Agency]].
- */
-class ChronologyProtector {
-	var $startupPos;
-	var $shutdownPos = array();
-
-	/**
-	 * Initialise a LoadBalancer to give it appropriate chronology protection.
-	 *
-	 * @param $lb LoadBalancer
-	 */
-	function initLB( $lb ) {
-		if ( $this->startupPos === null ) {
-			if ( !empty( $_SESSION[__CLASS__] ) ) {
-				$this->startupPos = $_SESSION[__CLASS__];
-			}
-		}
-		if ( !$this->startupPos ) {
-			return;
-		}
-		$masterName = $lb->getServerName( 0 );
-
-		if ( $lb->getServerCount() > 1 && !empty( $this->startupPos[$masterName] ) ) {
-			$info = $lb->parentInfo();
-			$pos = $this->startupPos[$masterName];
-			wfDebug( __METHOD__ . ": LB " . $info['id'] . " waiting for master pos $pos\n" );
-			$lb->waitFor( $this->startupPos[$masterName] );
-		}
-	}
-
-	/**
-	 * Notify the ChronologyProtector that the LoadBalancer is about to shut
-	 * down. Saves replication positions.
-	 *
-	 * @param $lb LoadBalancer
-	 */
-	function shutdownLB( $lb ) {
-		// Don't start a session, don't bother with non-replicated setups
-		if ( strval( session_id() ) == '' || $lb->getServerCount() <= 1 ) {
-			return;
-		}
-		$masterName = $lb->getServerName( 0 );
-		if ( isset( $this->shutdownPos[$masterName] ) ) {
-			// Already done
-			return;
-		}
-		// Only save the position if writes have been done on the connection
-		$db = $lb->getAnyOpenConnection( 0 );
-		$info = $lb->parentInfo();
-		if ( !$db || !$db->doneWrites() ) {
-			wfDebug( __METHOD__ . ": LB {$info['id']}, no writes done\n" );
-			return;
-		}
-		$pos = $db->getMasterPos();
-		wfDebug( __METHOD__ . ": LB {$info['id']} has master pos $pos\n" );
-		$this->shutdownPos[$masterName] = $pos;
-	}
-
-	/**
-	 * Notify the ChronologyProtector that the LBFactory is done calling shutdownLB() for now.
-	 * May commit chronology data to persistent storage.
-	 */
-	function shutdown() {
-		if ( session_id() != '' && count( $this->shutdownPos ) ) {
-			wfDebug( __METHOD__ . ": saving master pos for " .
-				count( $this->shutdownPos ) . " master(s)\n" );
-			$_SESSION[__CLASS__] = $this->shutdownPos;
-		}
-	}
-}
diff --git a/includes/db/LBFactory_Multi.php b/includes/db/LBFactory_Multi.php
index 2e4963d4..3043946a 100644
--- a/includes/db/LBFactory_Multi.php
+++ b/includes/db/LBFactory_Multi.php
@@ -145,8 +145,8 @@ class LBFactory_Multi extends LBFactory {
 		$section = $this->getSectionForWiki( $wiki );
 		if ( !isset( $this->mainLBs[$section] ) ) {
 			$lb = $this->newMainLB( $wiki, $section );
-			$this->chronProt->initLB( $lb );
 			$lb->parentInfo( array( 'id' => "main-$section" ) );
+			$this->chronProt->initLB( $lb );
 			$this->mainLBs[$section] = $lb;
 		}
 		return $this->mainLBs[$section];
@@ -181,6 +181,7 @@ class LBFactory_Multi extends LBFactory {
 		if ( !isset( $this->extLBs[$cluster] ) ) {
 			$this->extLBs[$cluster] = $this->newExternalLB( $cluster, $wiki );
 			$this->extLBs[$cluster]->parentInfo( array( 'id' => "ext-$cluster" ) );
+			$this->chronProt->initLB( $this->extLBs[$cluster] );
 		}
 		return $this->extLBs[$cluster];
 	}
@@ -296,6 +297,9 @@ class LBFactory_Multi extends LBFactory {
 		foreach ( $this->mainLBs as $lb ) {
 			$this->chronProt->shutdownLB( $lb );
 		}
+		foreach ( $this->extLBs as $extLB ) {
+			$this->chronProt->shutdownLB( $extLB );
+		}
 		$this->chronProt->shutdown();
 		$this->commitMasterChanges();
 	}
diff --git a/includes/db/LoadBalancer.php b/includes/db/LoadBalancer.php
index 1e859278..857109db 100644
--- a/includes/db/LoadBalancer.php
+++ b/includes/db/LoadBalancer.php
@@ -78,7 +78,7 @@ class LoadBalancer {
 			}
 		}
 
-		foreach( $params['servers'] as $i => $server ) {
+		foreach ( $params['servers'] as $i => $server ) {
 			$this->mLoads[$i] = $server['load'];
 			if ( isset( $server['groupLoads'] ) ) {
 				foreach ( $server['groupLoads'] as $group => $ratio ) {
@@ -117,7 +117,7 @@ class LoadBalancer {
 	 * Given an array of non-normalised probabilities, this function will select
 	 * an element and return the appropriate key
 	 *
-	 * @deprecated 1.21, use ArrayUtils::pickRandom()
+	 * @deprecated since 1.21, use ArrayUtils::pickRandom()
 	 *
 	 * @param $weights array
 	 *
@@ -167,7 +167,7 @@ class LoadBalancer {
 		#wfDebugLog( 'connect', var_export( $loads, true ) );
 
 		# Return a random representative of the remainder
-		return $this->pickRandom( $loads );
+		return ArrayUtils::pickRandom( $loads );
 	}
 
 	/**
@@ -219,6 +219,7 @@ class LoadBalancer {
 		}
 
 		if ( !$nonErrorLoads ) {
+			wfProfileOut( __METHOD__ );
 			throw new MWException( "Empty server array given to LoadBalancer" );
 		}
 
@@ -235,7 +236,7 @@ class LoadBalancer {
 			$currentLoads = $nonErrorLoads;
 			while ( count( $currentLoads ) ) {
 				if ( $wgReadOnly || $this->mAllowLagged || $laggedSlaveMode ) {
-					$i = $this->pickRandom( $currentLoads );
+					$i = ArrayUtils::pickRandom( $currentLoads );
 				} else {
 					$i = $this->getRandomNonLagged( $currentLoads, $wiki );
 					if ( $i === false && count( $currentLoads ) != 0 ) {
@@ -243,7 +244,7 @@ class LoadBalancer {
 						wfDebugLog( 'replication', "All slaves lagged. Switch to read-only mode\n" );
 						$wgReadOnly = 'The database has been automatically locked ' .
 							'while the slave database servers catch up to the master';
-						$i = $this->pickRandom( $currentLoads );
+						$i = ArrayUtils::pickRandom( $currentLoads );
 						$laggedSlaveMode = true;
 					}
 				}
@@ -348,7 +349,7 @@ class LoadBalancer {
 	 * Set the master wait position
 	 * If a DB_SLAVE connection has been opened already, waits
 	 * Otherwise sets a variable telling it to wait if such a connection is opened
-	 * @param $pos int
+	 * @param $pos DBMasterPos
 	 */
 	public function waitFor( $pos ) {
 		wfProfileIn( __METHOD__ );
@@ -366,7 +367,7 @@ class LoadBalancer {
 
 	/**
 	 * Set the master wait position and wait for ALL slaves to catch up to it
-	 * @param $pos int
+	 * @param $pos DBMasterPos
 	 */
 	public function waitForAll( $pos ) {
 		wfProfileIn( __METHOD__ );
@@ -399,7 +400,7 @@ class LoadBalancer {
 	 * @param $open bool
 	 * @return bool
 	 */
-	function doWait( $index, $open = false ) {
+	protected function doWait( $index, $open = false ) {
 		# Find a connection to wait on
 		$conn = $this->getAnyOpenConnection( $index );
 		if ( !$conn ) {
@@ -407,7 +408,7 @@ class LoadBalancer {
 				wfDebug( __METHOD__ . ": no connection open\n" );
 				return false;
 			} else {
-				$conn = $this->openConnection( $index );
+				$conn = $this->openConnection( $index, '' );
 				if ( !$conn ) {
 					wfDebug( __METHOD__ . ": failed to open connection\n" );
 					return false;
@@ -443,8 +444,10 @@ class LoadBalancer {
 		wfProfileIn( __METHOD__ );
 
 		if ( $i == DB_LAST ) {
+			wfProfileOut( __METHOD__ );
 			throw new MWException( 'Attempt to call ' . __METHOD__ . ' with deprecated server index DB_LAST' );
 		} elseif ( $i === null || $i === false ) {
+			wfProfileOut( __METHOD__ );
 			throw new MWException( 'Attempt to call ' . __METHOD__ . ' with invalid server index' );
 		}
 
@@ -476,6 +479,7 @@ class LoadBalancer {
 
 		# Operation-based index
 		if ( $i == DB_SLAVE ) {
+			$this->mLastError = 'Unknown error'; // reset error string
 			$i = $this->getReaderIndex( false, $wiki );
 			# Couldn't find a working server in getReaderIndex()?
 			if ( $i === false ) {
@@ -541,6 +545,38 @@ class LoadBalancer {
 		}
 	}
 
+	/**
+	 * Get a database connection handle reference
+	 *
+	 * The handle's methods wrap simply wrap those of a DatabaseBase handle
+	 *
+	 * @see LoadBalancer::getConnection() for parameter information
+	 *
+	 * @param integer $db
+	 * @param mixed $groups
+	 * @param string $wiki
+	 * @return DBConnRef
+	 */
+	public function getConnectionRef( $db, $groups = array(), $wiki = false ) {
+		return new DBConnRef( $this, $this->getConnection( $db, $groups, $wiki ) );
+	}
+
+	/**
+	 * Get a database connection handle reference without connecting yet
+	 *
+	 * The handle's methods wrap simply wrap those of a DatabaseBase handle
+	 *
+	 * @see LoadBalancer::getConnection() for parameter information
+	 *
+	 * @param integer $db
+	 * @param mixed $groups
+	 * @param string $wiki
+	 * @return DBConnRef
+	 */
+	public function getLazyConnectionRef( $db, $groups = array(), $wiki = false ) {
+		return new DBConnRef( $this, array( $db, $groups, $wiki ) );
+	}
+
 	/**
 	 * Open a connection to the server given by the specified index
 	 * Index must be an actual index into the array.
@@ -633,6 +669,7 @@ class LoadBalancer {
 			$server = $this->mServers[$i];
 			$server['serverIndex'] = $i;
 			$server['foreignPoolRefCount'] = 0;
+			$server['foreign'] = true;
 			$conn = $this->reallyOpenConnection( $server, $dbName );
 			if ( !$conn->isOpen() ) {
 				wfDebug( __METHOD__ . ": error opening connection for $i/$wiki\n" );
@@ -662,7 +699,7 @@ class LoadBalancer {
 	 * @return bool
 	 */
 	function isOpen( $index ) {
-		if( !is_integer( $index ) ) {
+		if ( !is_integer( $index ) ) {
 			return false;
 		}
 		return (bool)$this->getAnyOpenConnection( $index );
@@ -679,7 +716,7 @@ class LoadBalancer {
 	 * @return DatabaseBase
 	 */
 	function reallyOpenConnection( $server, $dbNameOverride = false ) {
-		if( !is_array( $server ) ) {
+		if ( !is_array( $server ) ) {
 			throw new MWException( 'You must update your load-balancing configuration. ' .
 				'See DefaultSettings.php entry for $wgDBservers.' );
 		}
@@ -830,7 +867,7 @@ class LoadBalancer {
 	 */
 	function closeAll() {
 		foreach ( $this->mConns as $conns2 ) {
-			foreach  ( $conns2 as $conns3 ) {
+			foreach ( $conns2 as $conns3 ) {
 				foreach ( $conns3 as $conn ) {
 					$conn->close();
 				}
@@ -1064,3 +1101,46 @@ class LoadBalancer {
 		$this->mLagTimes = null;
 	}
 }
+
+/**
+ * Helper class to handle automatically marking connectons as reusable (via RAII pattern)
+ * as well handling deferring the actual network connection until the handle is used
+ *
+ * @ingroup Database
+ * @since 1.22
+ */
+class DBConnRef implements IDatabase {
+	/** @var LoadBalancer */
+	protected $lb;
+	/** @var DatabaseBase|null */
+	protected $conn;
+	/** @var Array|null */
+	protected $params;
+
+	/**
+	 * @param $lb LoadBalancer
+	 * @param $conn DatabaseBase|array Connection or (server index, group, wiki ID) array
+	 */
+	public function __construct( LoadBalancer $lb, $conn ) {
+		$this->lb = $lb;
+		if ( $conn instanceof DatabaseBase ) {
+			$this->conn = $conn;
+		} else {
+			$this->params = $conn;
+		}
+	}
+
+	public function __call( $name, $arguments ) {
+		if ( $this->conn === null ) {
+			list( $db, $groups, $wiki ) = $this->params;
+			$this->conn = $this->lb->getConnection( $db, $groups, $wiki );
+		}
+		return call_user_func_array( array( $this->conn, $name ), $arguments );
+	}
+
+	function __destruct() {
+		if ( $this->conn !== null ) {
+			$this->lb->reuseConnection( $this->conn );
+		}
+	}
+}
diff --git a/includes/db/LoadMonitor.php b/includes/db/LoadMonitor.php
index ad7b3b2f..519e2dfd 100644
--- a/includes/db/LoadMonitor.php
+++ b/includes/db/LoadMonitor.php
@@ -135,18 +135,19 @@ class LoadMonitor_MySQL implements LoadMonitor {
 		$requestRate = 10;
 
 		global $wgMemc;
-		if ( empty( $wgMemc ) )
+		if ( empty( $wgMemc ) ) {
 			$wgMemc = wfGetMainCache();
+		}
 
 		$masterName = $this->parent->getServerName( 0 );
 		$memcKey = wfMemcKey( 'lag_times', $masterName );
 		$times = $wgMemc->get( $memcKey );
-		if ( $times ) {
+		if ( is_array( $times ) ) {
 			# Randomly recache with probability rising over $expiry
 			$elapsed = time() - $times['timestamp'];
 			$chance = max( 0, ( $expiry - $elapsed ) * $requestRate );
 			if ( mt_rand( 0, $chance ) != 0 ) {
-				unset( $times['timestamp'] );
+				unset( $times['timestamp'] ); // hide from caller
 				wfProfileOut( __METHOD__ );
 				return $times;
 			}
@@ -156,6 +157,17 @@ class LoadMonitor_MySQL implements LoadMonitor {
 		}
 
 		# Cache key missing or expired
+		if ( $wgMemc->add( "$memcKey:lock", 1, 10 ) ) {
+			# Let this process alone update the cache value
+			$unlocker = new ScopedCallback( function() use ( $wgMemc, $memcKey ) {
+				$wgMemc->delete( $memcKey );
+			} );
+		} elseif ( is_array( $times ) ) {
+			# Could not acquire lock but an old cache exists, so use it
+			unset( $times['timestamp'] ); // hide from caller
+			wfProfileOut( __METHOD__ );
+			return $times;
+		}
 
 		$times = array();
 		foreach ( $serverIndexes as $i ) {
@@ -170,14 +182,11 @@ class LoadMonitor_MySQL implements LoadMonitor {
 
 		# Add a timestamp key so we know when it was cached
 		$times['timestamp'] = time();
-		$wgMemc->set( $memcKey, $times, $expiry );
-
-		# But don't give the timestamp to the caller
-		unset( $times['timestamp'] );
-		$lagTimes = $times;
+		$wgMemc->set( $memcKey, $times, $expiry + 10 );
+		unset( $times['timestamp'] ); // hide from caller
 
 		wfProfileOut( __METHOD__ );
-		return $lagTimes;
+		return $times;
 	}
 
 	/**
diff --git a/includes/db/ORMRow.php b/includes/db/ORMRow.php
index 6c1f27ff..5ce3794d 100644
--- a/includes/db/ORMRow.php
+++ b/includes/db/ORMRow.php
@@ -42,18 +42,13 @@ class ORMRow implements IORMRow {
 	 */
 	protected $fields = array( 'id' => null );
 
-	/**
-	 * @since 1.20
-	 * @var ORMTable
-	 */
-	protected $table;
-
 	/**
 	 * If the object should update summaries of linked items when changed.
 	 * For example, update the course_count field in universities when a course in courses is deleted.
 	 * Settings this to false can prevent needless updating work in situations
 	 * such as deleting a university, which will then delete all it's courses.
 	 *
+	 * @deprecated since 1.22
 	 * @since 1.20
 	 * @var bool
 	 */
@@ -64,21 +59,29 @@ class ORMRow implements IORMRow {
 	 * This mode indicates that only summary fields got updated,
 	 * which allows for optimizations.
 	 *
+	 * @deprecated since 1.22
 	 * @since 1.20
 	 * @var bool
 	 */
 	protected $inSummaryMode = false;
 
+	/**
+	 * @deprecated since 1.22
+	 * @since 1.20
+	 * @var ORMTable|null
+	 */
+	protected $table;
+
 	/**
 	 * Constructor.
 	 *
 	 * @since 1.20
 	 *
-	 * @param IORMTable $table
+	 * @param IORMTable|null $table Deprecated since 1.22
 	 * @param array|null $fields
-	 * @param boolean $loadDefaults
+	 * @param boolean $loadDefaults Deprecated since 1.22
 	 */
-	public function __construct( IORMTable $table, $fields = null, $loadDefaults = false ) {
+	public function __construct( IORMTable $table = null, $fields = null, $loadDefaults = false ) {
 		$this->table = $table;
 
 		if ( !is_array( $fields ) ) {
@@ -96,6 +99,7 @@ class ORMRow implements IORMRow {
 	 * Load the specified fields from the database.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @param array|null $fields
 	 * @param boolean $override
@@ -160,6 +164,7 @@ class ORMRow implements IORMRow {
 	 * Gets the value of a field but first loads it if not done so already.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @param $name string
 	 *
@@ -231,26 +236,11 @@ class ORMRow implements IORMRow {
 			&& !is_null( $this->getField( 'id' ) );
 	}
 
-	/**
-	 * Sets multiple fields.
-	 *
-	 * @since 1.20
-	 *
-	 * @param array $fields The fields to set
-	 * @param boolean $override Override already set fields with the provided values?
-	 */
-	public function setFields( array $fields, $override = true ) {
-		foreach ( $fields as $name => $value ) {
-			if ( $override || !$this->hasField( $name ) ) {
-				$this->setField( $name, $value );
-			}
-		}
-	}
-
 	/**
 	 * Gets the fields => values to write to the table.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @return array
 	 */
@@ -269,10 +259,10 @@ class ORMRow implements IORMRow {
 				switch ( $type ) {
 					case 'array':
 						$value = (array)$value;
-						// fall-through!
+					// fall-through!
 					case 'blob':
 						$value = serialize( $value );
-						// fall-through!
+					// fall-through!
 				}
 
 				$values[$this->table->getPrefixedField( $name )] = $value;
@@ -282,6 +272,22 @@ class ORMRow implements IORMRow {
 		return $values;
 	}
 
+	/**
+	 * Sets multiple fields.
+	 *
+	 * @since 1.20
+	 *
+	 * @param array $fields The fields to set
+	 * @param boolean $override Override already set fields with the provided values?
+	 */
+	public function setFields( array $fields, $override = true ) {
+		foreach ( $fields as $name => $value ) {
+			if ( $override || !$this->hasField( $name ) ) {
+				$this->setField( $name, $value );
+			}
+		}
+	}
+
 	/**
 	 * Serializes the object to an associative array which
 	 * can then easily be converted into JSON or similar.
@@ -320,6 +326,7 @@ class ORMRow implements IORMRow {
 	 * Load the default values, via getDefaults.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @param boolean $override
 	 */
@@ -332,6 +339,7 @@ class ORMRow implements IORMRow {
 	 * when it already exists, or inserting it when it doesn't.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22 Use IORMTable->updateRow or ->insertRow
 	 *
 	 * @param string|null $functionName
 	 *
@@ -339,9 +347,9 @@ class ORMRow implements IORMRow {
 	 */
 	public function save( $functionName = null ) {
 		if ( $this->hasIdField() ) {
-			return $this->saveExisting( $functionName );
+			return $this->table->updateRow( $this, $functionName );
 		} else {
-			return $this->insert( $functionName );
+			return $this->table->insertRow( $this, $functionName );
 		}
 	}
 
@@ -349,6 +357,7 @@ class ORMRow implements IORMRow {
 	 * Updates the object in the database.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @param string|null $functionName
 	 *
@@ -386,6 +395,7 @@ class ORMRow implements IORMRow {
 	 * Inserts the object into the database.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @param string|null $functionName
 	 * @param array|null $options
@@ -418,16 +428,14 @@ class ORMRow implements IORMRow {
 	 * Removes the object from the database.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22, use IORMTable->removeRow
 	 *
 	 * @return boolean Success indicator
 	 */
 	public function remove() {
 		$this->beforeRemove();
 
-		$success = $this->table->delete( array( 'id' => $this->getId() ), __METHOD__ );
-
-		// DatabaseBase::delete does not always return true for success as documented...
-		$success = $success !== false;
+		$success = $this->table->removeRow( $this, __METHOD__ );
 
 		if ( $success ) {
 			$this->onRemoved();
@@ -440,6 +448,7 @@ class ORMRow implements IORMRow {
 	 * Gets called before an object is removed from the database.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 */
 	protected function beforeRemove() {
 		$this->loadFields( $this->getBeforeRemoveFields(), false, true );
@@ -463,6 +472,7 @@ class ORMRow implements IORMRow {
 	 * Can be overridden to get rid of linked data.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 */
 	protected function onRemoved() {
 		$this->setField( 'id', null );
@@ -503,51 +513,14 @@ class ORMRow implements IORMRow {
 	 * @throws MWException
 	 */
 	public function setField( $name, $value ) {
-		$fields = $this->table->getFields();
-
-		if ( array_key_exists( $name, $fields ) ) {
-			switch ( $fields[$name] ) {
-				case 'int':
-					$value = (int)$value;
-					break;
-				case 'float':
-					$value = (float)$value;
-					break;
-				case 'bool':
-					$value = (bool)$value;
-					break;
-				case 'array':
-					if ( is_string( $value ) ) {
-						$value = unserialize( $value );
-					}
-
-					if ( !is_array( $value ) ) {
-						$value = array();
-					}
-					break;
-				case 'blob':
-					if ( is_string( $value ) ) {
-						$value = unserialize( $value );
-					}
-					break;
-				case 'id':
-					if ( is_string( $value ) ) {
-						$value = (int)$value;
-					}
-					break;
-			}
-
-			$this->fields[$name] = $value;
-		} else {
-			throw new MWException( 'Attempted to set unknown field ' . $name );
-		}
+		$this->fields[$name] = $value;
 	}
 
 	/**
 	 * Add an amount (can be negative) to the specified field (needs to be numeric).
-	 * TODO: most off this stuff makes more sense in the table class
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22, use IORMTable->addToField
 	 *
 	 * @param string $field
 	 * @param integer $amount
@@ -555,41 +528,14 @@ class ORMRow implements IORMRow {
 	 * @return boolean Success indicator
 	 */
 	public function addToField( $field, $amount ) {
-		if ( $amount == 0 ) {
-			return true;
-		}
-
-		if ( !$this->hasIdField() ) {
-			return false;
-		}
-
-		$absoluteAmount = abs( $amount );
-		$isNegative = $amount < 0;
-
-		$dbw = $this->table->getWriteDbConnection();
-
-		$fullField = $this->table->getPrefixedField( $field );
-
-		$success = $dbw->update(
-			$this->table->getName(),
-			array( "$fullField=$fullField" . ( $isNegative ? '-' : '+' ) . $absoluteAmount ),
-			array( $this->table->getPrefixedField( 'id' ) => $this->getId() ),
-			__METHOD__
-		);
-
-		if ( $success && $this->hasField( $field ) ) {
-			$this->setField( $field, $this->getField( $field ) + $amount );
-		}
-
-		$this->table->releaseConnection( $dbw );
-
-		return $success;
+		return $this->table->addToField( $this->getUpdateConditions(), $field, $amount );
 	}
 
 	/**
 	 * Return the names of the fields.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @return array
 	 */
@@ -601,6 +547,7 @@ class ORMRow implements IORMRow {
 	 * Computes and updates the values of the summary fields.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @param array|string|null $summaryFields
 	 */
@@ -612,6 +559,7 @@ class ORMRow implements IORMRow {
 	 * Sets the value for the @see $updateSummaries field.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @param boolean $update
 	 */
@@ -623,6 +571,7 @@ class ORMRow implements IORMRow {
 	 * Sets the value for the @see $inSummaryMode field.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @param boolean $summaryMode
 	 */
@@ -630,40 +579,11 @@ class ORMRow implements IORMRow {
 		$this->inSummaryMode = $summaryMode;
 	}
 
-	/**
-	 * Return if any fields got changed.
-	 *
-	 * @since 1.20
-	 *
-	 * @param IORMRow $object
-	 * @param boolean|array $excludeSummaryFields
-	 *  When set to true, summary field changes are ignored.
-	 *  Can also be an array of fields to ignore.
-	 *
-	 * @return boolean
-	 */
-	protected function fieldsChanged( IORMRow $object, $excludeSummaryFields = false ) {
-		$exclusionFields = array();
-
-		if ( $excludeSummaryFields !== false ) {
-			$exclusionFields = is_array( $excludeSummaryFields ) ? $excludeSummaryFields : $this->table->getSummaryFields();
-		}
-
-		foreach ( $this->fields as $name => $value ) {
-			$excluded = $excludeSummaryFields && in_array( $name, $exclusionFields );
-
-			if ( !$excluded && $object->getField( $name ) !== $value ) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
 	/**
 	 * Returns the table this IORMRow is a row in.
 	 *
 	 * @since 1.20
+	 * @deprecated since 1.22
 	 *
 	 * @return IORMTable
 	 */
diff --git a/includes/db/ORMTable.php b/includes/db/ORMTable.php
index bcbe94a3..5f6723b9 100644
--- a/includes/db/ORMTable.php
+++ b/includes/db/ORMTable.php
@@ -814,10 +814,59 @@ class ORMTable extends DBAccessBase implements IORMTable {
 	 */
 	public function getFieldsFromDBResult( stdClass $result ) {
 		$result = (array)$result;
-		return array_combine(
+
+		$rawFields = array_combine(
 			$this->unprefixFieldNames( array_keys( $result ) ),
 			array_values( $result )
 		);
+
+		$fieldDefinitions = $this->getFields();
+		$fields = array();
+
+		foreach ( $rawFields as $name => $value ) {
+			if ( array_key_exists( $name, $fieldDefinitions ) ) {
+				switch ( $fieldDefinitions[$name] ) {
+					case 'int':
+						$value = (int)$value;
+						break;
+					case 'float':
+						$value = (float)$value;
+						break;
+					case 'bool':
+						if ( is_string( $value ) ) {
+							$value = $value !== '0';
+						} elseif ( is_int( $value ) ) {
+							$value = $value !== 0;
+						}
+						break;
+					case 'array':
+						if ( is_string( $value ) ) {
+							$value = unserialize( $value );
+						}
+
+						if ( !is_array( $value ) ) {
+							$value = array();
+						}
+						break;
+					case 'blob':
+						if ( is_string( $value ) ) {
+							$value = unserialize( $value );
+						}
+						break;
+					case 'id':
+						if ( is_string( $value ) ) {
+							$value = (int)$value;
+						}
+						break;
+				}
+
+				$fields[$name] = $value;
+			} else {
+				throw new MWException( 'Attempted to set unknown field ' . $name );
+			}
+		}
+
+		return $fields;
 	}
 
 	/**
@@ -867,14 +916,15 @@ class ORMTable extends DBAccessBase implements IORMTable {
 	 *
 	 * @since 1.20
 	 *
-	 * @param array $data
+	 * @param array $fields
 	 * @param boolean $loadDefaults
 	 *
 	 * @return IORMRow
 	 */
-	public function newRow( array $data, $loadDefaults = false ) {
+	public function newRow( array $fields, $loadDefaults = false ) {
 		$class = $this->getRowClass();
-		return new $class( $this, $data, $loadDefaults );
+
+		return new $class( $this, $fields, $loadDefaults );
 	}
 
 	/**
@@ -901,4 +951,157 @@ class ORMTable extends DBAccessBase implements IORMTable {
 		return array_key_exists( $name, $this->getFields() );
 	}
 
+	/**
+	 * Updates the provided row in the database.
+	 *
+	 * @since 1.22
+	 *
+	 * @param IORMRow $row The row to save
+	 * @param string|null $functionName
+	 *
+	 * @return boolean Success indicator
+	 */
+	public function updateRow( IORMRow $row, $functionName = null ) {
+		$dbw = $this->getWriteDbConnection();
+
+		$success = $dbw->update(
+			$this->getName(),
+			$this->getWriteValues( $row ),
+			$this->getPrefixedValues( array( 'id' => $row->getId() ) ),
+			is_null( $functionName ) ? __METHOD__ : $functionName
+		);
+
+		$this->releaseConnection( $dbw );
+
+		// DatabaseBase::update does not always return true for success as documented...
+		return $success !== false;
+	}
+
+	/**
+	 * Inserts the provided row into the database.
+	 *
+	 * @since 1.22
+	 *
+	 * @param IORMRow $row
+	 * @param string|null $functionName
+	 * @param array|null $options
+	 *
+	 * @return boolean Success indicator
+	 */
+	public function insertRow( IORMRow $row, $functionName = null, array $options = null ) {
+		$dbw = $this->getWriteDbConnection();
+
+		$success = $dbw->insert(
+			$this->getName(),
+			$this->getWriteValues( $row ),
+			is_null( $functionName ) ? __METHOD__ : $functionName,
+			$options
+		);
+
+		// DatabaseBase::insert does not always return true for success as documented...
+		$success = $success !== false;
+
+		if ( $success ) {
+			$row->setField( 'id', $dbw->insertId() );
+		}
+
+		$this->releaseConnection( $dbw );
+
+		return $success;
+	}
+
+	/**
+	 * Gets the fields => values to write to the table.
+	 *
+	 * @since 1.22
+	 *
+	 * @param IORMRow $row
+	 *
+	 * @return array
+	 */
+	protected function getWriteValues( IORMRow $row ) {
+		$values = array();
+
+		$rowFields = $row->getFields();
+
+		foreach ( $this->getFields() as $name => $type ) {
+			if ( array_key_exists( $name, $rowFields ) ) {
+				$value = $rowFields[$name];
+
+				switch ( $type ) {
+					case 'array':
+						$value = (array)$value;
+					// fall-through!
+					case 'blob':
+						$value = serialize( $value );
+					// fall-through!
+				}
+
+				$values[$this->getPrefixedField( $name )] = $value;
+			}
+		}
+
+		return $values;
+	}
+
+	/**
+	 * Removes the provided row from the database.
+	 *
+	 * @since 1.22
+	 *
+	 * @param IORMRow $row
+	 * @param string|null $functionName
+	 *
+	 * @return boolean Success indicator
+	 */
+	public function removeRow( IORMRow $row, $functionName = null ) {
+		$success = $this->delete(
+			array( 'id' => $row->getId() ),
+			is_null( $functionName ) ? __METHOD__ : $functionName
+		);
+
+		// DatabaseBase::delete does not always return true for success as documented...
+		return $success !== false;
+	}
+
+	/**
+	 * Add an amount (can be negative) to the specified field (needs to be numeric).
+	 *
+	 * @since 1.22
+	 *
+	 * @param array $conditions
+	 * @param string $field
+	 * @param integer $amount
+	 *
+	 * @return boolean Success indicator
+	 * @throws MWException
+	 */
+	public function addToField( array $conditions, $field, $amount ) {
+		if ( !array_key_exists( $field, $this->fields ) ) {
+			throw new MWException( 'Unknown field "' . $field . '" provided' );
+		}
+
+		if ( $amount == 0 ) {
+			return true;
+		}
+
+		$absoluteAmount = abs( $amount );
+		$isNegative = $amount < 0;
+
+		$fullField = $this->getPrefixedField( $field );
+
+		$dbw = $this->getWriteDbConnection();
+
+		$success = $dbw->update(
+			$this->getName(),
+			array( "$fullField=$fullField" . ( $isNegative ? '-' : '+' ) . $absoluteAmount ),
+			$this->getPrefixedValues( $conditions ),
+			__METHOD__
+		) !== false; // DatabaseBase::update does not always return true for success as documented...
+
+		$this->releaseConnection( $dbw );
+
+		return $success;
+	}
+
 }
diff --git a/includes/debug/Debug.php b/includes/debug/Debug.php
index 8c39e1a1..6e9ccc41 100644
--- a/includes/debug/Debug.php
+++ b/includes/debug/Debug.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Debug toolbar related code
+ * Debug toolbar related code.
  *
  * 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
@@ -21,7 +21,7 @@
  */
 
 /**
- * New debugger system that outputs a toolbar on page view
+ * New debugger system that outputs a toolbar on page view.
  *
  * By default, most methods do nothing ( self::$enabled = false ). You have
  * to explicitly call MWDebug::init() to enabled them.
@@ -35,28 +35,28 @@ class MWDebug {
 	/**
 	 * Log lines
 	 *
-	 * @var array
+	 * @var array $log
 	 */
 	protected static $log = array();
 
 	/**
-	 * Debug messages from wfDebug()
+	 * Debug messages from wfDebug().
 	 *
-	 * @var array
+	 * @var array $debug
 	 */
 	protected static $debug = array();
 
 	/**
-	 * Queries
+	 * SQL statements of the databses queries.
 	 *
-	 * @var array
+	 * @var array $query
 	 */
 	protected static $query = array();
 
 	/**
 	 * Is the debugger enabled?
 	 *
-	 * @var bool
+	 * @var bool $enabled
 	 */
 	protected static $enabled = false;
 
@@ -64,7 +64,7 @@ class MWDebug {
 	 * Array of functions that have already been warned, formatted
 	 * function-caller to prevent a buttload of warnings
 	 *
-	 * @var array
+	 * @var array $deprecationWarnings
 	 */
 	protected static $deprecationWarnings = array();
 
@@ -135,10 +135,24 @@ class MWDebug {
 	 * @since 1.19
 	 * @param $msg string
 	 * @param $callerOffset int
-	 * @param int $level A PHP error level. See sendWarning()
+	 * @param $level int A PHP error level. See sendWarning()
+	 * @param $log string: 'production' will always trigger a php error, 'auto'
+	 *        will trigger an error if $wgDevelopmentWarnings is true, and 'debug'
+	 *        will only write to the debug log(s).
+	 *
 	 * @return mixed
 	 */
-	public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
+	public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE, $log = 'auto' ) {
+		global $wgDevelopmentWarnings;
+
+		if ( $log === 'auto' && !$wgDevelopmentWarnings ) {
+			$log = 'debug';
+		}
+
+		if ( $log === 'debug' ) {
+			$level = false;
+		}
+
 		$callerDescription = self::getCallerDescription( $callerOffset );
 
 		self::sendWarning( $msg, $callerDescription, $level );
@@ -212,7 +226,8 @@ class MWDebug {
 		}
 
 		if ( $sendToLog ) {
-			self::sendWarning( $msg, $callerDescription, E_USER_DEPRECATED );
+			global $wgDevelopmentWarnings; // we could have a more specific $wgDeprecationWarnings setting.
+			self::sendWarning( $msg, $callerDescription, $wgDevelopmentWarnings ? E_USER_DEPRECATED : false );
 		}
 
 		if ( self::$enabled ) {
@@ -267,23 +282,21 @@ class MWDebug {
 	}
 
 	/**
-	 * Send a warning either to the debug log or by triggering an user PHP
-	 * error depending on $wgDevelopmentWarnings.
+	 * Send a warning to the debug log and optionally also trigger a PHP
+	 * error, depending on the $level argument.
 	 *
-	 * @param string $msg Message to send
-	 * @param array $caller caller description get from getCallerDescription()
-	 * @param $level error level to use if $wgDevelopmentWarnings is true
+	 * @param $msg string Message to send
+	 * @param $caller array caller description get from getCallerDescription()
+	 * @param $level int|bool error level to use; set to false to not trigger an error
 	 */
 	private static function sendWarning( $msg, $caller, $level ) {
-		global $wgDevelopmentWarnings;
-
 		$msg .= ' [Called from ' . $caller['func'] . ' in ' . $caller['file'] . ']';
 
-		if ( $wgDevelopmentWarnings ) {
+		if ( $level !== false ) {
 			trigger_error( $msg, $level );
-		} else {
-			wfDebug( "$msg\n" );
 		}
+
+		wfDebug( "$msg\n" );
 	}
 
 	/**
@@ -297,7 +310,7 @@ class MWDebug {
 		global $wgDebugComments, $wgShowDebug;
 
 		if ( self::$enabled || $wgDebugComments || $wgShowDebug ) {
-			self::$debug[] = rtrim( $str );
+			self::$debug[] = rtrim( UtfNormal::cleanUp( $str ) );
 		}
 	}
 
@@ -319,7 +332,7 @@ class MWDebug {
 		self::$query[] = array(
 			'sql' => $sql,
 			'function' => $function,
-			'master' => (bool) $isMaster,
+			'master' => (bool)$isMaster,
 			'time' => 0.0,
 			'_start' => microtime( true ),
 		);
@@ -471,10 +484,10 @@ class MWDebug {
 		// output errors as debug info, when display_errors is on
 		// this is necessary for all non html output of the api, because that clears all errors first
 		$obContents = ob_get_contents();
-		if( $obContents ) {
+		if ( $obContents ) {
 			$obContentArray = explode( '<br />', $obContents );
-			foreach( $obContentArray as $obContent ) {
-				if( trim( $obContent ) ) {
+			foreach ( $obContentArray as $obContent ) {
+				if ( trim( $obContent ) ) {
 					self::debugMsg( Sanitizer::stripAllTags( $obContent ) );
 				}
 			}
@@ -485,15 +498,10 @@ class MWDebug {
 
 		$result->setIndexedTagName( $debugInfo, 'debuginfo' );
 		$result->setIndexedTagName( $debugInfo['log'], 'line' );
-		foreach( $debugInfo['debugLog'] as $index => $debugLogText ) {
-			$vals = array();
-			ApiResult::setContent( $vals, $debugLogText );
-			$debugInfo['debugLog'][$index] = $vals; //replace
-		}
 		$result->setIndexedTagName( $debugInfo['debugLog'], 'msg' );
 		$result->setIndexedTagName( $debugInfo['queries'], 'query' );
 		$result->setIndexedTagName( $debugInfo['includes'], 'queries' );
-		$result->addValue( array(), 'debuginfo', $debugInfo );
+		$result->addValue( null, 'debuginfo', $debugInfo );
 	}
 
 	/**
diff --git a/includes/diff/DairikiDiff.php b/includes/diff/DairikiDiff.php
index 94ffc066..298d7240 100644
--- a/includes/diff/DairikiDiff.php
+++ b/includes/diff/DairikiDiff.php
@@ -183,7 +183,7 @@ class _DiffEngine {
 	 * @param $to_lines
 	 * @return array
 	 */
-	function diff ( $from_lines, $to_lines ) {
+	function diff( $from_lines, $to_lines ) {
 		wfProfileIn( __METHOD__ );
 
 		// Diff and store locally
@@ -241,7 +241,7 @@ class _DiffEngine {
 	 * @param $from_lines
 	 * @param $to_lines
 	 */
-	function diff_local ( $from_lines, $to_lines ) {
+	function diff_local( $from_lines, $to_lines ) {
 		global $wgExternalDiffEngine;
 		wfProfileIn( __METHOD__ );
 
@@ -271,7 +271,8 @@ class _DiffEngine {
 				$this->xchanged[$skip] = $this->ychanged[$skip] = false;
 			}
 			// Skip trailing common lines.
-			$xi = $n_from; $yi = $n_to;
+			$xi = $n_from;
+			$yi = $n_to;
 			for ( $endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++ ) {
 				if ( $from_lines[$xi] !== $to_lines[$yi] ) {
 					break;
@@ -394,7 +395,7 @@ class _DiffEngine {
 						break;
 					}
 				}
-				while ( list ( , $y ) = each( $matches ) ) {
+				while ( list( , $y ) = each( $matches ) ) {
 					if ( $y > $this->seq[$k -1] ) {
 						assert( '$y < $this->seq[$k]' );
 						// Optimization: this is a common case:
@@ -469,10 +470,9 @@ class _DiffEngine {
 	 * @param $yoff
 	 * @param $ylim
 	 */
-	function _compareseq ( $xoff, $xlim, $yoff, $ylim ) {
+	function _compareseq( $xoff, $xlim, $yoff, $ylim ) {
 		// Slide down the bottom initial diagonal.
-		while ( $xoff < $xlim && $yoff < $ylim
-		&& $this->xv[$xoff] == $this->yv[$yoff] ) {
+		while ( $xoff < $xlim && $yoff < $ylim && $this->xv[$xoff] == $this->yv[$yoff] ) {
 			++$xoff;
 			++$yoff;
 		}
@@ -491,7 +491,7 @@ class _DiffEngine {
 			// $nchunks = sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5);
 			// $nchunks = max(2,min(8,(int)$nchunks));
 			$nchunks = min( 7, $xlim - $xoff, $ylim - $yoff ) + 1;
-			list ( $lcs, $seps ) = $this->_diag( $xoff, $xlim, $yoff, $ylim, $nchunks );
+			list( $lcs, $seps ) = $this->_diag( $xoff, $xlim, $yoff, $ylim, $nchunks );
 		}
 
 		if ( $lcs == 0 ) {
@@ -508,7 +508,7 @@ class _DiffEngine {
 			reset( $seps );
 			$pt1 = $seps[0];
 			while ( $pt2 = next( $seps ) ) {
-				$this->_compareseq ( $pt1[0], $pt2[0], $pt1[1], $pt2[1] );
+				$this->_compareseq( $pt1[0], $pt2[0], $pt1[1], $pt2[1] );
 				$pt1 = $pt2;
 			}
 		}
@@ -554,9 +554,11 @@ class _DiffEngine {
 
 			while ( $i < $len && ! $changed[$i] ) {
 				assert( '$j < $other_len && ! $other_changed[$j]' );
-				$i++; $j++;
-				while ( $j < $other_len && $other_changed[$j] )
+				$i++;
 				$j++;
+				while ( $j < $other_len && $other_changed[$j] ) {
+					$j++;
+				}
 			}
 
 			if ( $i == $len ) {
@@ -690,7 +692,7 @@ class Diff {
 	/**
 	 * Check for empty diff.
 	 *
-	 * @return bool True iff two sequences were identical.
+	 * @return bool True if two sequences were identical.
 	 */
 	function isEmpty() {
 		foreach ( $this->edits as $edit ) {
@@ -1109,7 +1111,7 @@ class ArrayDiffFormatter extends DiffFormatter {
 		$newline = 1;
 		$retval = array();
 		foreach ( $diff->edits as $edit ) {
-			switch( $edit->type ) {
+			switch ( $edit->type ) {
 				case 'add':
 					foreach ( $edit->closing as $l ) {
 						$retval[] = array(
@@ -1204,7 +1206,7 @@ class _HWLDF_WordAccumulator {
 	 * @param $words
 	 * @param $tag string
 	 */
-	function addWords ( $words, $tag = '' ) {
+	function addWords( $words, $tag = '' ) {
 		if ( $tag != $this->_tag ) {
 			$this->_flushGroup( $tag );
 		}
@@ -1244,7 +1246,7 @@ class WordLevelDiff extends MappedDiff {
 	 * @param $orig_lines
 	 * @param $closing_lines
 	 */
-	function __construct ( $orig_lines, $closing_lines ) {
+	function __construct( $orig_lines, $closing_lines ) {
 		wfProfileIn( __METHOD__ );
 
 		list( $orig_words, $orig_stripped ) = $this->_split( $orig_lines );
@@ -1282,8 +1284,12 @@ class WordLevelDiff extends MappedDiff {
 				if ( preg_match_all( '/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs',
 					$line, $m ) )
 				{
-					$words = array_merge( $words, $m[0] );
-					$stripped = array_merge( $stripped, $m[1] );
+					foreach ( $m[0] as $word ) {
+						$words[] = $word;
+					}
+					foreach ( $m[1] as $stripped_word ) {
+						$stripped[] = $stripped_word;
+					}
 				}
 			}
 		}
diff --git a/includes/diff/DifferenceEngine.php b/includes/diff/DifferenceEngine.php
index 0f3c77ff..e436f58d 100644
--- a/includes/diff/DifferenceEngine.php
+++ b/includes/diff/DifferenceEngine.php
@@ -38,6 +38,7 @@ class DifferenceEngine extends ContextSource {
 	 * @private
 	 */
 	var $mOldid, $mNewid;
+	var $mOldTags, $mNewTags;
 	/**
 	 * @var Content
 	 */
@@ -48,7 +49,6 @@ class DifferenceEngine extends ContextSource {
 	 * @var Title
 	 */
 	var $mOldPage, $mNewPage;
-	var $mRcidMarkPatrolled;
 
 	/**
 	 * @var Revision
@@ -80,8 +80,8 @@ class DifferenceEngine extends ContextSource {
 	 * Constructor
 	 * @param $context IContextSource context to use, anything else will be ignored
 	 * @param $old Integer old ID we want to show and diff with.
-	 * @param string $new either 'prev' or 'next'.
-	 * @param $rcid Integer ??? FIXME (default 0)
+	 * @param $new String either 'prev' or 'next'.
+	 * @param $rcid Integer Deprecated, no longer used!
 	 * @param $refreshCache boolean If set, refreshes the diff cache
 	 * @param $unhide boolean If set, allow viewing deleted revs
 	 */
@@ -96,7 +96,6 @@ class DifferenceEngine extends ContextSource {
 
 		$this->mOldid = $old;
 		$this->mNewid = $new;
-		$this->mRcidMarkPatrolled = intval( $rcid );  # force it to be an integer
 		$this->mRefreshCache = $refreshCache;
 		$this->unhide = $unhide;
 	}
@@ -186,10 +185,14 @@ class DifferenceEngine extends ContextSource {
 		$out = $this->getOutput();
 
 		$missing = array();
-		if ( $this->mOldRev === null ) {
+		if ( $this->mOldRev === null ||
+			( $this->mOldRev && $this->mOldContent === null )
+		) {
 			$missing[] = $this->deletedIdMarker( $this->mOldid );
 		}
-		if ( $this->mNewRev === null ) {
+		if ( $this->mNewRev === null ||
+			( $this->mNewRev && $this->mNewContent === null )
+		) {
 			$missing[] = $this->deletedIdMarker( $this->mNewid );
 		}
 
@@ -223,33 +226,6 @@ class DifferenceEngine extends ContextSource {
 			throw new PermissionsError( 'read', $permErrors );
 		}
 
-		# If external diffs are enabled both globally and for the user,
-		# we'll use the application/x-external-editor interface to call
-		# an external diff tool like kompare, kdiff3, etc.
-		if ( ExternalEdit::useExternalEngine( $this->getContext(), 'diff' ) ) {
-			//TODO: come up with a good solution for non-text content here.
-			//      at least, the content format needs to be passed to the client somehow.
-			//      Currently, action=raw will just fail for non-text content.
-
-			$urls = array(
-				'File' => array( 'Extension' => 'wiki', 'URL' =>
-					# This should be mOldPage, but it may not be set, see below.
-					$this->mNewPage->getCanonicalURL( array(
-						'action' => 'raw', 'oldid' => $this->mOldid ) )
-				),
-				'File2' => array( 'Extension' => 'wiki', 'URL' =>
-					$this->mNewPage->getCanonicalURL( array(
-						'action' => 'raw', 'oldid' => $this->mNewid ) )
-				),
-			);
-
-			$externalEditor = new ExternalEdit( $this->getContext(), $urls );
-			$externalEditor->execute();
-
-			wfProfileOut( __METHOD__ );
-			return;
-		}
-
 		$rollback = '';
 		$undoLink = '';
 
@@ -279,11 +255,6 @@ class DifferenceEngine extends ContextSource {
 		} else {
 			wfRunHooks( 'DiffViewHeader', array( $this, $this->mOldRev, $this->mNewRev ) );
 
-			$sk = $this->getSkin();
-			if ( method_exists( $sk, 'suppressQuickbar' ) ) {
-				$sk->suppressQuickbar();
-			}
-
 			if ( $this->mNewPage->equals( $this->mOldPage ) ) {
 				$out->setPageTitle( $this->msg( 'difference-title', $this->mNewPage->getPrefixedText() ) );
 				$samePage = true;
@@ -304,7 +275,7 @@ class DifferenceEngine extends ContextSource {
 				}
 				if ( !$this->mOldRev->isDeleted( Revision::DELETED_TEXT ) && !$this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
 					$undoLink = Html::element( 'a', array(
-							'href' => $this->mNewPage->getLocalUrl( array(
+							'href' => $this->mNewPage->getLocalURL( array(
 								'action' => 'edit',
 								'undoafter' => $this->mOldid,
 								'undo' => $this->mNewid ) ),
@@ -336,12 +307,14 @@ class DifferenceEngine extends ContextSource {
 
 			$ldel = $this->revisionDeleteLink( $this->mOldRev );
 			$oldRevisionHeader = $this->getRevisionHeader( $this->mOldRev, 'complete' );
+			$oldChangeTags = ChangeTags::formatSummaryRow( $this->mOldTags, 'diff' );
 
 			$oldHeader = '<div id="mw-diff-otitle1"><strong>' . $oldRevisionHeader . '</strong></div>' .
 				'<div id="mw-diff-otitle2">' .
 					Linker::revUserTools( $this->mOldRev, !$this->unhide ) . '</div>' .
 				'<div id="mw-diff-otitle3">' . $oldminor .
 					Linker::revComment( $this->mOldRev, !$diffOnly, !$this->unhide ) . $ldel . '</div>' .
+				'<div id="mw-diff-otitle5">' . $oldChangeTags[0] . '</div>' .
 				'<div id="mw-diff-otitle4">' . $prevlink . '</div>';
 
 			if ( $this->mOldRev->isDeleted( Revision::DELETED_TEXT ) ) {
@@ -387,18 +360,21 @@ class DifferenceEngine extends ContextSource {
 			$formattedRevisionTools[] = $this->msg( 'parentheses' )->rawParams( $tool )->escaped();
 		}
 		$newRevisionHeader = $this->getRevisionHeader( $this->mNewRev, 'complete' ) . ' ' . implode( ' ', $formattedRevisionTools );
+		$newChangeTags = ChangeTags::formatSummaryRow( $this->mNewTags, 'diff' );
 
 		$newHeader = '<div id="mw-diff-ntitle1"><strong>' . $newRevisionHeader . '</strong></div>' .
 			'<div id="mw-diff-ntitle2">' . Linker::revUserTools( $this->mNewRev, !$this->unhide ) .
 				" $rollback</div>" .
 			'<div id="mw-diff-ntitle3">' . $newminor .
 				Linker::revComment( $this->mNewRev, !$diffOnly, !$this->unhide ) . $rdel . '</div>' .
+			'<div id="mw-diff-ntitle5">' . $newChangeTags[0] . '</div>' .
 			'<div id="mw-diff-ntitle4">' . $nextlink . $this->markPatrolledLink() . '</div>';
 
 		if ( $this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
 			$deleted = true; // new revisions text is hidden
-			if ( $this->mNewRev->isDeleted( Revision::DELETED_RESTRICTED ) )
+			if ( $this->mNewRev->isDeleted( Revision::DELETED_RESTRICTED ) ) {
 				$suppressed = true; // also suppressed
+			}
 		}
 
 		# If the diff cannot be shown due to a deleted revision, then output
@@ -414,7 +390,7 @@ class DifferenceEngine extends ContextSource {
 					array( $msg ) );
 			} else {
 				# Give explanation and add a link to view the diff...
-				$link = $this->getTitle()->getFullUrl( $this->getRequest()->appendQueryValue( 'unhide', '1', true ) );
+				$link = $this->getTitle()->getFullURL( $this->getRequest()->appendQueryValue( 'unhide', '1', true ) );
 				$msg = $suppressed ? 'rev-suppressed-unhide-diff' : 'rev-deleted-unhide-diff';
 				$out->wrapWikiMsg( "<div id='mw-$msg' class='mw-warning plainlinks'>\n$1\n</div>\n", array( $msg, $link ) );
 			}
@@ -443,45 +419,48 @@ class DifferenceEngine extends ContextSource {
 	 * @return String
 	 */
 	protected function markPatrolledLink() {
-		global $wgUseRCPatrol;
+		global $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
+		$user = $this->getUser();
 
 		if ( $this->mMarkPatrolledLink === null ) {
 			// Prepare a change patrol link, if applicable
-			if ( $wgUseRCPatrol && $this->mNewPage->quickUserCan( 'patrol', $this->getUser() ) ) {
-				// If we've been given an explicit change identifier, use it; saves time
-				if ( $this->mRcidMarkPatrolled ) {
-					$rcid = $this->mRcidMarkPatrolled;
-					$rc = RecentChange::newFromId( $rcid );
-					// Already patrolled?
-					$rcid = is_object( $rc ) && !$rc->getAttribute( 'rc_patrolled' ) ? $rcid : 0;
+			if (
+				// Is patrolling enabled and the user allowed to?
+				$wgUseRCPatrol && $this->mNewPage->quickUserCan( 'patrol', $user ) &&
+				// Only do this if the revision isn't more than 6 hours older
+				// than the Max RC age (6h because the RC might not be cleaned out regularly)
+				RecentChange::isInRCLifespan( $this->mNewRev->getTimestamp(), 21600 )
+			) {
+				// Look for an unpatrolled change corresponding to this diff
+
+				$db = wfGetDB( DB_SLAVE );
+				$change = RecentChange::newFromConds(
+					array(
+						'rc_timestamp' => $db->timestamp( $this->mNewRev->getTimestamp() ),
+						'rc_this_oldid' => $this->mNewid,
+						'rc_patrolled' => 0
+					),
+					__METHOD__,
+					array( 'USE INDEX' => 'rc_timestamp' )
+				);
+
+				if ( $change && $change->getPerformer()->getName() !== $user->getName() ) {
+					$rcid = $change->getAttribute( 'rc_id' );
 				} else {
-					// Look for an unpatrolled change corresponding to this diff
-					$db = wfGetDB( DB_SLAVE );
-					$change = RecentChange::newFromConds(
-						array(
-						// Redundant user,timestamp condition so we can use the existing index
-							'rc_user_text'  => $this->mNewRev->getRawUserText(),
-							'rc_timestamp'  => $db->timestamp( $this->mNewRev->getTimestamp() ),
-							'rc_this_oldid' => $this->mNewid,
-							'rc_last_oldid' => $this->mOldid,
-							'rc_patrolled'  => 0
-						),
-						__METHOD__
-					);
-					if ( $change instanceof RecentChange ) {
-						$rcid = $change->mAttribs['rc_id'];
-						$this->mRcidMarkPatrolled = $rcid;
-					} else {
-						// None found
-						$rcid = 0;
-					}
+					// None found or the page has been created by the current user.
+					// If the user could patrol this it already would be patrolled
+					$rcid = 0;
 				}
 				// Build the link
 				if ( $rcid ) {
 					$this->getOutput()->preventClickjacking();
-					$this->getOutput()->addModules( 'mediawiki.page.patrol.ajax' );
+					if ( $wgEnableAPI && $wgEnableWriteAPI
+						&& $user->isAllowed( 'writeapi' )
+					) {
+						$this->getOutput()->addModules( 'mediawiki.page.patrol.ajax' );
+					}
 
-					$token = $this->getUser()->getEditToken( $rcid );
+					$token = $user->getEditToken( $rcid );
 					$this->mMarkPatrolledLink = ' <span class="patrollink">[' . Linker::linkKnown(
 						$this->mNewPage,
 						$this->msg( 'markaspatrolleddiff' )->escaped(),
@@ -536,7 +515,7 @@ class DifferenceEngine extends ContextSource {
 			if ( $this->mNewPage->isCssJsSubpage() || $this->mNewPage->isCssOrJsPage() ) {
 				// Stolen from Article::view --AG 2007-10-11
 				// Give hooks a chance to customise the output
-				// @TODO: standardize this crap into one function
+				// @todo standardize this crap into one function
 				if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
 					// NOTE: deprecated hook, B/C only
 					// use the content object's own rendering
@@ -545,9 +524,9 @@ class DifferenceEngine extends ContextSource {
 					$txt = $po ? $po->getText() : '';
 					$out->addHTML( $txt );
 				}
-			} elseif( !wfRunHooks( 'ArticleContentViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+			} elseif ( !wfRunHooks( 'ArticleContentViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
 				// Handled by extension
-			} elseif( !ContentHandler::runLegacyHooks( 'ArticleViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+			} elseif ( !ContentHandler::runLegacyHooks( 'ArticleViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
 				// NOTE: deprecated hook, B/C only
 				// Handled by extension
 			} else {
@@ -576,7 +555,7 @@ class DifferenceEngine extends ContextSource {
 						# Show categories etc.
 						$out->addParserOutputNoText( $parserOutput );
 					}
-				} else if ( $parserOutput ) {
+				} elseif ( $parserOutput ) {
 					$out->addParserOutput( $parserOutput );
 				}
 			}
@@ -637,6 +616,10 @@ class DifferenceEngine extends ContextSource {
 			return false;
 		} else {
 			$multi = $this->getMultiNotice();
+			// Display a message when the diff is empty
+			if ( $body === '' ) {
+				$notice .= '<div class="mw-diff-empty">' . $this->msg( 'diff-empty' )->parse() . "</div>\n";
+			}
 			return $this->addHeader( $body, $otitle, $ntitle, $multi, $notice );
 		}
 	}
@@ -662,7 +645,6 @@ class DifferenceEngine extends ContextSource {
 			return false;
 		}
 		// Short-circuit
-		// If mOldRev is false, it means that the
 		if ( $this->mOldRev === false || ( $this->mOldRev && $this->mNewRev
 			&& $this->mOldRev->getID() == $this->mNewRev->getID() ) )
 		{
@@ -713,24 +695,6 @@ class DifferenceEngine extends ContextSource {
 		return $difftext;
 	}
 
-	/**
-	 * Make sure the proper modules are loaded before we try to
-	 * make the diff
-	 */
-	private function initDiffEngines() {
-		global $wgExternalDiffEngine;
-		if ( $wgExternalDiffEngine == 'wikidiff' && !function_exists( 'wikidiff_do_diff' ) ) {
-			wfProfileIn( __METHOD__ . '-php_wikidiff.so' );
-			wfDl( 'php_wikidiff' );
-			wfProfileOut( __METHOD__ . '-php_wikidiff.so' );
-		}
-		elseif ( $wgExternalDiffEngine == 'wikidiff2' && !function_exists( 'wikidiff2_do_diff' ) ) {
-			wfProfileIn( __METHOD__ . '-php_wikidiff2.so' );
-			wfDl( 'wikidiff2' );
-			wfProfileOut( __METHOD__ . '-php_wikidiff2.so' );
-		}
-	}
-
 	/**
 	 * Generate a diff, no caching.
 	 *
@@ -797,8 +761,6 @@ class DifferenceEngine extends ContextSource {
 		$otext = str_replace( "\r\n", "\n", $otext );
 		$ntext = str_replace( "\r\n", "\n", $ntext );
 
-		$this->initDiffEngines();
-
 		if ( $wgExternalDiffEngine == 'wikidiff' && function_exists( 'wikidiff_do_diff' ) ) {
 			# For historical reasons, external diff engine expects
 			# input text to be HTML-escaped already
@@ -893,7 +855,9 @@ class DifferenceEngine extends ContextSource {
 	}
 
 	function localiseLineNumbersCb( $matches ) {
-		if ( $matches[1] === '1' && $this->mReducedLineNumbers ) return '';
+		if ( $matches[1] === '1' && $this->mReducedLineNumbers ) {
+			return '';
+		}
 		return $this->msg( 'lineno' )->numParams( $matches[1] )->escaped();
 	}
 
@@ -1024,11 +988,13 @@ class DifferenceEngine extends ContextSource {
 				$colspan = 1;
 				$multiColspan = 2;
 			}
-			$header .= "
-			<tr style='vertical-align: top;'>
-			<td colspan='$colspan' class='diff-otitle'>{$otitle}</td>
-			<td colspan='$colspan' class='diff-ntitle'>{$ntitle}</td>
-			</tr>";
+			if ( $otitle || $ntitle ) {
+				$header .= "
+				<tr style='vertical-align: top;'>
+				<td colspan='$colspan' class='diff-otitle'>{$otitle}</td>
+				<td colspan='$colspan' class='diff-ntitle'>{$ntitle}</td>
+				</tr>";
+			}
 		}
 
 		if ( $multi != '' ) {
@@ -1169,6 +1135,25 @@ class DifferenceEngine extends ContextSource {
 			$this->mOldPage = $this->mOldRev->getTitle();
 		}
 
+		// Load tags information for both revisions
+		$dbr = wfGetDB( DB_SLAVE );
+		if ( $this->mOldid !== false ) {
+			$this->mOldTags = $dbr->selectField(
+				'tag_summary',
+				'ts_tags',
+				array( 'ts_rev_id' => $this->mOldid ),
+				__METHOD__
+			);
+		} else {
+			$this->mOldTags = false;
+		}
+		$this->mNewTags = $dbr->selectField(
+			'tag_summary',
+			'ts_tags',
+			array( 'ts_rev_id' => $this->mNewid ),
+			__METHOD__
+		);
+
 		return true;
 	}
 
@@ -1180,26 +1165,29 @@ class DifferenceEngine extends ContextSource {
 	function loadText() {
 		if ( $this->mTextLoaded == 2 ) {
 			return true;
-		} else {
-			// Whether it succeeds or fails, we don't want to try again
-			$this->mTextLoaded = 2;
 		}
 
+		// Whether it succeeds or fails, we don't want to try again
+		$this->mTextLoaded = 2;
+
 		if ( !$this->loadRevisionData() ) {
 			return false;
 		}
+
 		if ( $this->mOldRev ) {
 			$this->mOldContent = $this->mOldRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
 			if ( $this->mOldContent === null ) {
 				return false;
 			}
 		}
+
 		if ( $this->mNewRev ) {
 			$this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
 			if ( $this->mNewContent === null ) {
 				return false;
 			}
 		}
+
 		return true;
 	}
 
@@ -1211,13 +1199,16 @@ class DifferenceEngine extends ContextSource {
 	function loadNewText() {
 		if ( $this->mTextLoaded >= 1 ) {
 			return true;
-		} else {
-			$this->mTextLoaded = 1;
 		}
+
+		$this->mTextLoaded = 1;
+
 		if ( !$this->loadRevisionData() ) {
 			return false;
 		}
+
 		$this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+
 		return true;
 	}
 }
diff --git a/includes/extauth/Hardcoded.php b/includes/extauth/Hardcoded.php
deleted file mode 100644
index dfb46742..00000000
--- a/includes/extauth/Hardcoded.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-/**
- * External authentication with hardcoded user names and passwords
- *
- * Copyright © 2009 Aryeh Gregor
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * This class supports external authentication from a literal array dumped in
- * LocalSettings.php.  It's mostly useful for testing.  Example configuration:
- *
- *   $wgExternalAuthType = 'ExternalUser_Hardcoded';
- *   $wgExternalAuthConf = array(
- *       'Bob Smith' => array(
- *           'password' => 'literal string',
- *           'emailaddress' => 'bob@example.com',
- *       ),
- *   );
- *
- * Multiple names may be provided.  The keys of the inner arrays can be either
- * 'password', or the name of any preference.
- *
- * @ingroup ExternalUser
- */
-class ExternalUser_Hardcoded extends ExternalUser {
-	private $mName;
-
-	protected function initFromName( $name ) {
-		global $wgExternalAuthConf;
-
-		if ( isset( $wgExternalAuthConf[$name] ) ) {
-			$this->mName = $name;
-			return true;
-		}
-		return false;
-	}
-
-	protected function initFromId( $id ) {
-		return $this->initFromName( $id );
-	}
-
-	public function getId() {
-		return $this->mName;
-	}
-
-	public function getName() {
-		return $this->mName;
-	}
-
-	public function authenticate( $password ) {
-		global $wgExternalAuthConf;
-
-		return isset( $wgExternalAuthConf[$this->mName]['password'] )
-			&& $wgExternalAuthConf[$this->mName]['password'] == $password;
-	}
-
-	public function getPref( $pref ) {
-		global $wgExternalAuthConf;
-
-		if ( isset( $wgExternalAuthConf[$this->mName][$pref] ) ) {
-			return $wgExternalAuthConf[$this->mName][$pref];
-		}
-		return null;
-	}
-
-	# TODO: Implement setPref() via regex on LocalSettings.  (Just kidding.)
-}
diff --git a/includes/extauth/MediaWiki.php b/includes/extauth/MediaWiki.php
deleted file mode 100644
index c7f6a204..00000000
--- a/includes/extauth/MediaWiki.php
+++ /dev/null
@@ -1,168 +0,0 @@
-<?php
-/**
- * External authentication with external MediaWiki database.
- *
- * Copyright © 2009 Aryeh Gregor
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * This class supports authentication against an external MediaWiki database,
- * probably any version back to 1.5 or something.  Example configuration:
- *
- *   $wgExternalAuthType = 'ExternalUser_MediaWiki';
- *   $wgExternalAuthConf = array(
- *       'DBtype' => 'mysql',
- *       'DBserver' => 'localhost',
- *       'DBname' => 'wikidb',
- *       'DBuser' => 'quasit',
- *       'DBpassword' => 'a5Cr:yf9u-6[{`g',
- *       'DBprefix' => '',
- *   );
- *
- * All fields must be present.  These mean the same things as $wgDBtype,
- * $wgDBserver, etc.  This implementation is quite crude; it could easily
- * support multiple database servers, for instance, and memcached, and it
- * probably has bugs.  Kind of hard to reuse code when things might rely on who
- * knows what configuration globals.
- *
- * If either wiki uses the UserComparePasswords hook, password authentication
- * might fail unexpectedly unless they both do the exact same validation.
- * There may be other corner cases like this where this will fail, but it
- * should be unlikely.
- *
- * @ingroup ExternalUser
- */
-class ExternalUser_MediaWiki extends ExternalUser {
-	private $mRow;
-
-	/**
-	 * @var DatabaseBase
-	 */
-	private $mDb;
-
-	/**
-	 * @param $name string
-	 * @return bool
-	 */
-	protected function initFromName( $name ) {
-		# We might not need the 'usable' bit, but let's be safe.  Theoretically
-		# this might return wrong results for old versions, but it's probably
-		# good enough.
-		$name = User::getCanonicalName( $name, 'usable' );
-
-		if ( !is_string( $name ) ) {
-			return false;
-		}
-
-		return $this->initFromCond( array( 'user_name' => $name ) );
-	}
-
-	/**
-	 * @param $id int
-	 * @return bool
-	 */
-	protected function initFromId( $id ) {
-		return $this->initFromCond( array( 'user_id' => $id ) );
-	}
-
-	/**
-	 * @param $cond array
-	 * @return bool
-	 */
-	private function initFromCond( $cond ) {
-		global $wgExternalAuthConf;
-
-		$this->mDb = DatabaseBase::factory( $wgExternalAuthConf['DBtype'],
-			array(
-				'host'        => $wgExternalAuthConf['DBserver'],
-				'user'        => $wgExternalAuthConf['DBuser'],
-				'password'    => $wgExternalAuthConf['DBpassword'],
-				'dbname'      => $wgExternalAuthConf['DBname'],
-				'tablePrefix' => $wgExternalAuthConf['DBprefix'],
-			)
-		);
-
-		$row = $this->mDb->selectRow(
-			'user',
-			array(
-				'user_name', 'user_id', 'user_password', 'user_email',
-				'user_email_authenticated'
-			),
-			$cond,
-			__METHOD__
-		);
-		if ( !$row ) {
-			return false;
-		}
-		$this->mRow = $row;
-
-		return true;
-	}
-
-	# TODO: Implement initFromCookie().
-
-	public function getId() {
-		return $this->mRow->user_id;
-	}
-
-	/**
-	 * @return string
-	 */
-	public function getName() {
-		return $this->mRow->user_name;
-	}
-
-	public function authenticate( $password ) {
-		# This might be wrong if anyone actually uses the UserComparePasswords hook
-		# (on either end), so don't use this if you those are incompatible.
-		return User::comparePasswords( $this->mRow->user_password, $password,
-			$this->mRow->user_id );
-	}
-
-	public function getPref( $pref ) {
-		# @todo FIXME: Return other prefs too.  Lots of global-riddled code that does
-		# this normally.
-		if ( $pref === 'emailaddress'
-		&& $this->row->user_email_authenticated !== null ) {
-			return $this->mRow->user_email;
-		}
-		return null;
-	}
-
-	/**
-	 * @return array
-	 */
-	public function getGroups() {
-		# @todo FIXME: Untested.
-		$groups = array();
-		$res = $this->mDb->select(
-			'user_groups',
-			'ug_group',
-			array( 'ug_user' => $this->mRow->user_id ),
-			__METHOD__
-		);
-		foreach ( $res as $row ) {
-			$groups[] = $row->ug_group;
-		}
-		return $groups;
-	}
-
-	# TODO: Implement setPref().
-}
diff --git a/includes/extauth/vB.php b/includes/extauth/vB.php
deleted file mode 100644
index 0565a2e3..00000000
--- a/includes/extauth/vB.php
+++ /dev/null
@@ -1,146 +0,0 @@
-<?php
-/**
- * External authentication with a vBulletin database.
- *
- * Copyright © 2009 Aryeh Gregor
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * This class supports the proprietary vBulletin forum system
- * <http://www.vbulletin.com>, versions 3.5 and up.  It calls no functions or
- * code, only reads from the database.  Example lines to put in
- * LocalSettings.php:
- *
- *   $wgExternalAuthType = 'ExternalUser_vB';
- *   $wgExternalAuthConf = array(
- *       'server' => 'localhost',
- *       'username' => 'forum',
- *       'password' => 'udE,jSqDJ<""p=fI.K9',
- *       'dbname' => 'forum',
- *       'tablePrefix' => '',
- *       'cookieprefix' => 'bb'
- *   );
- *
- * @ingroup ExternalUser
- */
-class ExternalUser_vB extends ExternalUser {
-	private $mRow;
-
-	protected function initFromName( $name ) {
-		return $this->initFromCond( array( 'username' => $name ) );
-	}
-
-	protected function initFromId( $id ) {
-		return $this->initFromCond( array( 'userid' => $id ) );
-	}
-
-	protected function initFromCookie() {
-		# Try using the session table.  It will only have a row if the user has
-		# an active session, so it might not always work, but it's a lot easier
-		# than trying to convince PHP to give us vB's $_SESSION.
-		global $wgExternalAuthConf, $wgRequest;
-		if ( !isset( $wgExternalAuthConf['cookieprefix'] ) ) {
-			$prefix = 'bb';
-		} else {
-			$prefix = $wgExternalAuthConf['cookieprefix'];
-		}
-		if ( $wgRequest->getCookie( 'sessionhash', $prefix ) === null ) {
-			return false;
-		}
-
-		$db = $this->getDb();
-
-		$row = $db->selectRow(
-			array( 'session', 'user' ),
-			$this->getFields(),
-			array(
-				'session.userid = user.userid',
-				'sessionhash' => $wgRequest->getCookie( 'sessionhash', $prefix ),
-			),
-			__METHOD__
-		);
-		if ( !$row ) {
-			return false;
-		}
-		$this->mRow = $row;
-
-		return true;
-	}
-
-	private function initFromCond( $cond ) {
-		$db = $this->getDb();
-
-		$row = $db->selectRow(
-			'user',
-			$this->getFields(),
-			$cond,
-			__METHOD__
-		);
-		if ( !$row ) {
-			return false;
-		}
-		$this->mRow = $row;
-
-		return true;
-	}
-
-	private function getDb() {
-		global $wgExternalAuthConf;
-		return DatabaseBase::factory( 'mysql',
-			array(
-				'host' => $wgExternalAuthConf['server'],
-				'user' => $wgExternalAuthConf['username'],
-				'password' => $wgExternalAuthConf['password'],
-				'dbname' => $wgExternalAuthConf['dbname'],
-				'tablePrefix' => $wgExternalAuthConf['tablePrefix'],
-			)
-		);
-	}
-
-	private function getFields() {
-		return array( 'user.userid', 'username', 'password', 'salt', 'email',
-			'usergroupid', 'membergroupids' );
-	}
-
-	public function getId() { return $this->mRow->userid; }
-	public function getName() { return $this->mRow->username; }
-
-	public function authenticate( $password ) {
-		# vBulletin seemingly strips whitespace from passwords
-		$password = trim( $password );
-		return $this->mRow->password == md5( md5( $password )
-			. $this->mRow->salt );
-	}
-
-	public function getPref( $pref ) {
-		if ( $pref == 'emailaddress' && $this->mRow->email ) {
-			# TODO: only return if validated?
-			return $this->mRow->email;
-		}
-		return null;
-	}
-
-	public function getGroups() {
-		$groups = array( $this->mRow->usergroupid );
-		$groups = array_merge( $groups, explode( ',', $this->mRow->membergroupids ) );
-		$groups = array_unique( $groups );
-		return $groups;
-	}
-}
diff --git a/includes/externalstore/ExternalStore.php b/includes/externalstore/ExternalStore.php
index 4ca193d4..462b0b90 100644
--- a/includes/externalstore/ExternalStore.php
+++ b/includes/externalstore/ExternalStore.php
@@ -60,7 +60,7 @@ class ExternalStore {
 
 		$class = 'ExternalStore' . ucfirst( $proto );
 		// Any custom modules should be added to $wgAutoLoadClasses for on-demand loading
-		return MWInit::classExists( $class ) ? new $class( $params ) : false;
+		return class_exists( $class ) ? new $class( $params ) : false;
 	}
 
 	/**
@@ -90,6 +90,39 @@ class ExternalStore {
 		return $store->fetchFromURL( $url );
 	}
 
+	/**
+	 * Fetch data from multiple URLs with a minimum of round trips
+	 *
+	 * @param array $urls The URLs of the text to get
+	 * @return array Map from url to its data.  Data is either string when found
+	 *     or false on failure.
+	 */
+	public static function batchFetchFromURLs( array $urls ) {
+		$batches = array();
+		foreach ( $urls as $url ) {
+			$scheme = parse_url( $url, PHP_URL_SCHEME );
+			if ( $scheme ) {
+				$batches[$scheme][] = $url;
+			}
+		}
+		$retval = array();
+		foreach ( $batches as $proto => $batchedUrls ) {
+			$store = self::getStoreObject( $proto );
+			if ( $store === false ) {
+				continue;
+			}
+			$retval += $store->batchFetchFromURLs( $batchedUrls );
+		}
+		// invalid, not found, db dead, etc.
+		$missing = array_diff( $urls, array_keys( $retval ) );
+		if ( $missing ) {
+			foreach ( $missing as $url ) {
+				$retval[$url] = false;
+			}
+		}
+		return $retval;
+	}
+
 	/**
 	 * Store a data item to an external store, identified by a partial URL
 	 * The protocol part is used to identify the class, the rest is passed to the
@@ -123,9 +156,10 @@ class ExternalStore {
 	/**
 	 * Like insert() above, but does more of the work for us.
 	 * This function does not need a url param, it builds it by
-	 * itself. It also fails-over to the next possible clusters.
+	 * itself. It also fails-over to the next possible clusters
+	 * provided by $wgDefaultExternalStore.
 	 *
-	 * @param $data string
+	 * @param string $data
 	 * @param array $params Associative array of ExternalStoreMedium parameters
 	 * @return string|bool The URL of the stored data item, or false on error
 	 * @throws MWException
@@ -133,8 +167,23 @@ class ExternalStore {
 	public static function insertToDefault( $data, array $params = array() ) {
 		global $wgDefaultExternalStore;
 
+		return self::insertWithFallback( (array)$wgDefaultExternalStore, $data, $params );
+	}
+
+	/**
+	 * Like insert() above, but does more of the work for us.
+	 * This function does not need a url param, it builds it by
+	 * itself. It also fails-over to the next possible clusters
+	 * as provided in the first parameter.
+	 *
+	 * @param array $tryStores refer to $wgDefaultExternalStore
+	 * @param string $data
+	 * @param array $params Associative array of ExternalStoreMedium parameters
+	 * @return string|bool The URL of the stored data item, or false on error
+	 * @throws MWException
+	 */
+	public static function insertWithFallback( array $tryStores, $data, array $params = array() ) {
 		$error = false;
-		$tryStores = (array)$wgDefaultExternalStore;
 		while ( count( $tryStores ) > 0 ) {
 			$index = mt_rand( 0, count( $tryStores ) - 1 );
 			$storeUrl = $tryStores[$index];
diff --git a/includes/externalstore/ExternalStoreDB.php b/includes/externalstore/ExternalStoreDB.php
index 196e7f2c..46a89379 100644
--- a/includes/externalstore/ExternalStoreDB.php
+++ b/includes/externalstore/ExternalStoreDB.php
@@ -30,21 +30,13 @@
  */
 class ExternalStoreDB extends ExternalStoreMedium {
 	/**
-	 * The URL returned is of the form of the form DB://cluster/id
+	 * The provided URL is in the form of DB://cluster/id
 	 * or DB://cluster/id/itemid for concatened storage.
 	 *
 	 * @see ExternalStoreMedium::fetchFromURL()
 	 */
 	public function fetchFromURL( $url ) {
-		$path = explode( '/', $url );
-		$cluster = $path[2];
-		$id = $path[3];
-		if ( isset( $path[4] ) ) {
-			$itemID = $path[4];
-		} else {
-			$itemID = false;
-		}
-
+		list( $cluster, $id, $itemID ) = $this->parseURL( $url );
 		$ret =& $this->fetchBlob( $cluster, $id, $itemID );
 
 		if ( $itemID !== false && $ret !== false ) {
@@ -53,6 +45,41 @@ class ExternalStoreDB extends ExternalStoreMedium {
 		return $ret;
 	}
 
+	/**
+	 * Fetch data from given external store URLs.
+	 * The provided URLs are in the form of DB://cluster/id
+	 * or DB://cluster/id/itemid for concatened storage.
+	 *
+	 * @param array $urls An array of external store URLs
+	 * @return array A map from url to stored content. Failed results
+	 *     are not represented.
+	 */
+	public function batchFetchFromURLs( array $urls ) {
+		$batched = $inverseUrlMap = array();
+		foreach ( $urls as $url ) {
+			list( $cluster, $id, $itemID ) = $this->parseURL( $url );
+			$batched[$cluster][$id][] = $itemID;
+			// false $itemID gets cast to int, but should be ok
+			// since we do === from the $itemID in $batched
+			$inverseUrlMap[$cluster][$id][$itemID] = $url;
+		}
+		$ret = array();
+		foreach ( $batched as $cluster => $batchByCluster ) {
+			$res = $this->batchFetchBlobs( $cluster, $batchByCluster );
+			foreach ( $res as $id => $blob ) {
+				foreach ( $batchByCluster[$id] as $itemID ) {
+					$url = $inverseUrlMap[$cluster][$id][$itemID];
+					if ( $itemID === false ) {
+						$ret[$url] = $blob;
+					} else {
+						$ret[$url] = $blob->getItem( $itemID );
+					}
+				}
+			}
+		}
+		return $ret;
+	}
+
 	/**
 	 * @see ExternalStoreMedium::store()
 	 */
@@ -64,7 +91,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
 			__METHOD__ );
 		$id = $dbw->insertId();
 		if ( !$id ) {
-			throw new MWException( __METHOD__.': no insert ID' );
+			throw new MWException( __METHOD__ . ': no insert ID' );
 		}
 		if ( $dbw->getFlag( DBO_TRX ) ) {
 			$dbw->commit( __METHOD__ );
@@ -152,25 +179,31 @@ class ExternalStoreDB extends ExternalStoreMedium {
 		static $externalBlobCache = array();
 
 		$cacheID = ( $itemID === false ) ? "$cluster/$id" : "$cluster/$id/";
-		if( isset( $externalBlobCache[$cacheID] ) ) {
-			wfDebugLog( 'ExternalStoreDB-cache', "ExternalStoreDB::fetchBlob cache hit on $cacheID\n" );
+		if ( isset( $externalBlobCache[$cacheID] ) ) {
+			wfDebugLog( 'ExternalStoreDB-cache',
+				"ExternalStoreDB::fetchBlob cache hit on $cacheID\n" );
 			return $externalBlobCache[$cacheID];
 		}
 
-		wfDebugLog( 'ExternalStoreDB-cache', "ExternalStoreDB::fetchBlob cache miss on $cacheID\n" );
+		wfDebugLog( 'ExternalStoreDB-cache',
+			"ExternalStoreDB::fetchBlob cache miss on $cacheID\n" );
 
 		$dbr =& $this->getSlave( $cluster );
-		$ret = $dbr->selectField( $this->getTable( $dbr ), 'blob_text', array( 'blob_id' => $id ), __METHOD__ );
+		$ret = $dbr->selectField( $this->getTable( $dbr ),
+			'blob_text', array( 'blob_id' => $id ), __METHOD__ );
 		if ( $ret === false ) {
-			wfDebugLog( 'ExternalStoreDB', "ExternalStoreDB::fetchBlob master fallback on $cacheID\n" );
+			wfDebugLog( 'ExternalStoreDB',
+				"ExternalStoreDB::fetchBlob master fallback on $cacheID\n" );
 			// Try the master
 			$dbw =& $this->getMaster( $cluster );
-			$ret = $dbw->selectField( $this->getTable( $dbw ), 'blob_text', array( 'blob_id' => $id ), __METHOD__ );
-			if( $ret === false) {
-				wfDebugLog( 'ExternalStoreDB', "ExternalStoreDB::fetchBlob master failed to find $cacheID\n" );
+			$ret = $dbw->selectField( $this->getTable( $dbw ),
+				'blob_text', array( 'blob_id' => $id ), __METHOD__ );
+			if ( $ret === false ) {
+				wfDebugLog( 'ExternalStoreDB',
+					"ExternalStoreDB::fetchBlob master failed to find $cacheID\n" );
 			}
 		}
-		if( $itemID !== false && $ret !== false ) {
+		if ( $itemID !== false && $ret !== false ) {
 			// Unserialise object; caller extracts item
 			$ret = unserialize( $ret );
 		}
@@ -178,4 +211,73 @@ class ExternalStoreDB extends ExternalStoreMedium {
 		$externalBlobCache = array( $cacheID => &$ret );
 		return $ret;
 	}
+
+	/**
+	 * Fetch multiple blob items out of the database
+	 *
+	 * @param string $cluster A cluster name valid for use with LBFactory
+	 * @param array $ids A map from the blob_id's to look for to the requested itemIDs in the blobs
+	 * @return array A map from the blob_id's requested to their content.  Unlocated ids are not represented
+	 */
+	function batchFetchBlobs( $cluster, array $ids ) {
+		$dbr = $this->getSlave( $cluster );
+		$res = $dbr->select( $this->getTable( $dbr ),
+			array( 'blob_id', 'blob_text' ), array( 'blob_id' => array_keys( $ids ) ), __METHOD__ );
+		$ret = array();
+		if ( $res !== false ) {
+			$this->mergeBatchResult( $ret, $ids, $res );
+		}
+		if ( $ids ) {
+			wfDebugLog( __CLASS__, __METHOD__ .
+				" master fallback on '$cluster' for: " .
+				implode( ',', array_keys( $ids ) ) . "\n" );
+			// Try the master
+			$dbw = $this->getMaster( $cluster );
+			$res = $dbw->select( $this->getTable( $dbr ),
+				array( 'blob_id', 'blob_text' ),
+				array( 'blob_id' => array_keys( $ids ) ),
+				__METHOD__ );
+			if ( $res === false ) {
+				wfDebugLog( __CLASS__, __METHOD__ . " master failed on '$cluster'\n" );
+			} else {
+				$this->mergeBatchResult( $ret, $ids, $res );
+			}
+		}
+		if ( $ids ) {
+			wfDebugLog( __CLASS__, __METHOD__ .
+				" master on '$cluster' failed locating items: " .
+				implode( ',', array_keys( $ids ) ) . "\n" );
+		}
+		return $ret;
+	}
+
+	/**
+	 * Helper function for self::batchFetchBlobs for merging master/slave results
+	 * @param array &$ret Current self::batchFetchBlobs return value
+	 * @param array &$ids Map from blob_id to requested itemIDs
+	 * @param mixed $res DB result from DatabaseBase::select
+	 */
+	private function mergeBatchResult( array &$ret, array &$ids, $res ) {
+		foreach ( $res as $row ) {
+			$id = $row->blob_id;
+			$itemIDs = $ids[$id];
+			unset( $ids[$id] ); // to track if everything is found
+			if ( count( $itemIDs ) === 1 && reset( $itemIDs ) === false ) {
+				// single result stored per blob
+				$ret[$id] = $row->blob_text;
+			} else {
+				// multi result stored per blob
+				$ret[$id] = unserialize( $row->blob_text );
+			}
+		}
+	}
+
+	protected function parseURL( $url ) {
+		$path = explode( '/', $url );
+		return array(
+			$path[2], // cluster
+			$path[3], // id
+			isset( $path[4] ) ? $path[4] : false // itemID
+		);
+	}
 }
diff --git a/includes/externalstore/ExternalStoreMedium.php b/includes/externalstore/ExternalStoreMedium.php
index 41af7d87..02bdcb51 100644
--- a/includes/externalstore/ExternalStoreMedium.php
+++ b/includes/externalstore/ExternalStoreMedium.php
@@ -48,6 +48,25 @@ abstract class ExternalStoreMedium {
 	 */
 	abstract public function fetchFromURL( $url );
 
+	/**
+	 * Fetch data from given external store URLs.
+	 *
+	 * @param array $urls A list of external store URLs
+	 * @return array Map from the url to the text stored. Unfound data is not represented
+	 */
+	public function batchFetchFromURLs( array $urls ) {
+		$retval = array();
+		foreach ( $urls as $url ) {
+			$data = $this->fetchFromURL( $url );
+			// Dont return when false to allow for simpler implementations.
+			// errored urls are handled in ExternalStore::batchFetchFromURLs
+			if ( $data !== false ) {
+				$retval[$urls] = $data;
+			}
+		}
+		return $retval;
+	}
+
 	/**
 	 * Insert a data item into a given location
 	 *
diff --git a/includes/externalstore/ExternalStoreMwstore.php b/includes/externalstore/ExternalStoreMwstore.php
index 0911cca1..aa486796 100644
--- a/includes/externalstore/ExternalStoreMwstore.php
+++ b/includes/externalstore/ExternalStoreMwstore.php
@@ -46,6 +46,29 @@ class ExternalStoreMwstore extends ExternalStoreMedium {
 		return false;
 	}
 
+	/**
+	 * Fetch data from given external store URLs.
+	 * The URL returned is of the form of the form mwstore://backend/container/wiki/id
+	 *
+	 * @param array $urls An array of external store URLs
+	 * @return array A map from url to stored content. Failed results are not represented.
+	 */
+	public function batchFetchFromURLs( array $urls ) {
+		$pathsByBackend = array();
+		foreach ( $urls as $url ) {
+			$be = FileBackendGroup::singleton()->backendFromPath( $url );
+			if ( $be instanceof FileBackend ) {
+				$pathsByBackend[$be->getName()][] = $url;
+			}
+		}
+		$blobs = array();
+		foreach ( $pathsByBackend as $backendName => $paths ) {
+			$be = FileBackendGroup::get( $backendName );
+			$blobs = $blobs + $be->getFileContentsMulti( array( 'srcs' => $paths ) );
+		}
+		return $blobs;
+	}
+
 	/**
 	 * @see ExternalStoreMedium::store()
 	 */
diff --git a/includes/filebackend/FSFile.php b/includes/filebackend/FSFile.php
index 7d0dbd52..8f0a1334 100644
--- a/includes/filebackend/FSFile.php
+++ b/includes/filebackend/FSFile.php
@@ -28,7 +28,7 @@
  */
 class FSFile {
 	protected $path; // path to file
-	private $sha1Base36 = null; // File Sha1Base36
+	protected $sha1Base36; // file SHA-1 in base 36
 
 	/**
 	 * Sets up the file object
@@ -98,7 +98,7 @@ class FSFile {
 	 * Get an associative array containing information about
 	 * a file with the given storage path.
 	 *
-	 * @param $ext Mixed: the file extension, or true to extract it from the filename.
+	 * @param Mixed $ext: the file extension, or true to extract it from the filename.
 	 *             Set it to false to ignore the extension.
 	 *
 	 * @return array
@@ -171,7 +171,7 @@ class FSFile {
 	/**
 	 * Exract image size information
 	 *
-	 * @param $gis array
+	 * @param array $gis
 	 * @return Array
 	 */
 	protected function extractImageSizeInfo( array $gis ) {
@@ -194,7 +194,7 @@ class FSFile {
 	 * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
 	 * fairly neatly.
 	 *
-	 * @param $recache bool
+	 * @param bool $recache
 	 * @return bool|string False on failure
 	 */
 	public function getSha1Base36( $recache = false ) {
@@ -220,7 +220,7 @@ class FSFile {
 	/**
 	 * Get the final file extension from a file system path
 	 *
-	 * @param $path string
+	 * @param string $path
 	 * @return string
 	 */
 	public static function extensionFromPath( $path ) {
@@ -232,9 +232,8 @@ class FSFile {
 	 * Get an associative array containing information about a file in the local filesystem.
 	 *
 	 * @param string $path absolute local filesystem path
-	 * @param $ext Mixed: the file extension, or true to extract it from the filename.
+	 * @param Mixed $ext: the file extension, or true to extract it from the filename.
 	 *             Set it to false to ignore the extension.
-	 *
 	 * @return array
 	 */
 	public static function getPropsFromPath( $path, $ext = true ) {
@@ -249,19 +248,11 @@ class FSFile {
 	 * 160 log 2 / log 36 = 30.95, so the 160-bit hash fills 31 digits in base 36
 	 * fairly neatly.
 	 *
-	 * @param $path string
-	 * @param $recache bool
-	 *
+	 * @param string $path
 	 * @return bool|string False on failure
 	 */
-	public static function getSha1Base36FromPath( $path, $recache = false ) {
-		static $sha1Base36 = array();
-
-		if ( !isset( $sha1Base36[$path] ) || $recache ) {
-			$fsFile = new self( $path );
-			$sha1Base36[$path] = $fsFile->getSha1Base36();
-		}
-
-		return $sha1Base36[$path];
+	public static function getSha1Base36FromPath( $path ) {
+		$fsFile = new self( $path );
+		return $fsFile->getSha1Base36();
 	}
 }
diff --git a/includes/filebackend/FSFileBackend.php b/includes/filebackend/FSFileBackend.php
index c9769989..6d642162 100644
--- a/includes/filebackend/FSFileBackend.php
+++ b/includes/filebackend/FSFileBackend.php
@@ -82,12 +82,6 @@ class FSFileBackend extends FileBackendStore {
 		}
 	}
 
-	/**
-	 * @see FileBackendStore::resolveContainerPath()
-	 * @param $container string
-	 * @param $relStoragePath string
-	 * @return null|string
-	 */
 	protected function resolveContainerPath( $container, $relStoragePath ) {
 		// Check that container has a root directory
 		if ( isset( $this->containerPaths[$container] ) || isset( $this->basePath ) ) {
@@ -121,8 +115,8 @@ class FSFileBackend extends FileBackendStore {
 	 * Given the short (unresolved) and full (resolved) name of
 	 * a container, return the file system path of the container.
 	 *
-	 * @param $shortCont string
-	 * @param $fullCont string
+	 * @param string $shortCont
+	 * @param string $fullCont
 	 * @return string|null
 	 */
 	protected function containerFSRoot( $shortCont, $fullCont ) {
@@ -153,10 +147,6 @@ class FSFileBackend extends FileBackendStore {
 		return $fsPath;
 	}
 
-	/**
-	 * @see FileBackendStore::isPathUsableInternal()
-	 * @return bool
-	 */
 	public function isPathUsableInternal( $storagePath ) {
 		$fsPath = $this->resolveToFSPath( $storagePath );
 		if ( $fsPath === null ) {
@@ -178,10 +168,6 @@ class FSFileBackend extends FileBackendStore {
 		return $ok;
 	}
 
-	/**
-	 * @see FileBackendStore::doCreateInternal()
-	 * @return Status
-	 */
 	protected function doCreateInternal( array $params ) {
 		$status = Status::newGood();
 
@@ -235,10 +221,6 @@ class FSFileBackend extends FileBackendStore {
 		}
 	}
 
-	/**
-	 * @see FileBackendStore::doStoreInternal()
-	 * @return Status
-	 */
 	protected function doStoreInternal( array $params ) {
 		$status = Status::newGood();
 
@@ -284,10 +266,6 @@ class FSFileBackend extends FileBackendStore {
 		}
 	}
 
-	/**
-	 * @see FileBackendStore::doCopyInternal()
-	 * @return Status
-	 */
 	protected function doCopyInternal( array $params ) {
 		$status = Status::newGood();
 
@@ -319,7 +297,7 @@ class FSFileBackend extends FileBackendStore {
 			$status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd, $dest );
 		} else { // immediate write
 			$this->trapWarnings();
-			$ok = copy( $source, $dest );
+			$ok = ( $source === $dest ) ? true : copy( $source, $dest );
 			$this->untrapWarnings();
 			// In some cases (at least over NFS), copy() returns true when it fails
 			if ( !$ok || ( filesize( $source ) !== filesize( $dest ) ) ) {
@@ -348,10 +326,6 @@ class FSFileBackend extends FileBackendStore {
 		}
 	}
 
-	/**
-	 * @see FileBackendStore::doMoveInternal()
-	 * @return Status
-	 */
 	protected function doMoveInternal( array $params ) {
 		$status = Status::newGood();
 
@@ -383,7 +357,7 @@ class FSFileBackend extends FileBackendStore {
 			$status->value = new FSFileOpHandle( $this, $params, 'Move', $cmd );
 		} else { // immediate write
 			$this->trapWarnings();
-			$ok = rename( $source, $dest );
+			$ok = ( $source === $dest ) ? true : rename( $source, $dest );
 			$this->untrapWarnings();
 			clearstatcache(); // file no longer at source
 			if ( !$ok ) {
@@ -405,10 +379,6 @@ class FSFileBackend extends FileBackendStore {
 		}
 	}
 
-	/**
-	 * @see FileBackendStore::doDeleteInternal()
-	 * @return Status
-	 */
 	protected function doDeleteInternal( array $params ) {
 		$status = Status::newGood();
 
@@ -454,10 +424,6 @@ class FSFileBackend extends FileBackendStore {
 		}
 	}
 
-	/**
-	 * @see FileBackendStore::doPrepareInternal()
-	 * @return Status
-	 */
 	protected function doPrepareInternal( $fullCont, $dirRel, array $params ) {
 		$status = Status::newGood();
 		list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
@@ -481,10 +447,6 @@ class FSFileBackend extends FileBackendStore {
 		return $status;
 	}
 
-	/**
-	 * @see FileBackendStore::doSecureInternal()
-	 * @return Status
-	 */
 	protected function doSecureInternal( $fullCont, $dirRel, array $params ) {
 		$status = Status::newGood();
 		list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
@@ -512,10 +474,6 @@ class FSFileBackend extends FileBackendStore {
 		return $status;
 	}
 
-	/**
-	 * @see FileBackendStore::doPublishInternal()
-	 * @return Status
-	 */
 	protected function doPublishInternal( $fullCont, $dirRel, array $params ) {
 		$status = Status::newGood();
 		list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
@@ -543,10 +501,6 @@ class FSFileBackend extends FileBackendStore {
 		return $status;
 	}
 
-	/**
-	 * @see FileBackendStore::doCleanInternal()
-	 * @return Status
-	 */
 	protected function doCleanInternal( $fullCont, $dirRel, array $params ) {
 		$status = Status::newGood();
 		list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
@@ -560,10 +514,6 @@ class FSFileBackend extends FileBackendStore {
 		return $status;
 	}
 
-	/**
-	 * @see FileBackendStore::doFileExists()
-	 * @return array|bool|null
-	 */
 	protected function doGetFileStat( array $params ) {
 		$source = $this->resolveToFSPath( $params['src'] );
 		if ( $source === null ) {
@@ -577,7 +527,7 @@ class FSFileBackend extends FileBackendStore {
 		if ( $stat ) {
 			return array(
 				'mtime' => wfTimestamp( TS_MW, $stat['mtime'] ),
-				'size'  => $stat['size']
+				'size' => $stat['size']
 			);
 		} elseif ( !$hadError ) {
 			return false; // file does not exist
@@ -593,10 +543,6 @@ class FSFileBackend extends FileBackendStore {
 		clearstatcache(); // clear the PHP file stat cache
 	}
 
-	/**
-	 * @see FileBackendStore::doDirectoryExists()
-	 * @return bool|null
-	 */
 	protected function doDirectoryExists( $fullCont, $dirRel, array $params ) {
 		list( , $shortCont, ) = FileBackend::splitStoragePath( $params['dir'] );
 		$contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
@@ -647,10 +593,6 @@ class FSFileBackend extends FileBackendStore {
 		return new FSFileBackendFileList( $dir, $params );
 	}
 
-	/**
-	 * @see FileBackendStore::doGetLocalReferenceMulti()
-	 * @return Array
-	 */
 	protected function doGetLocalReferenceMulti( array $params ) {
 		$fsFiles = array(); // (path => FSFile)
 
@@ -666,10 +608,6 @@ class FSFileBackend extends FileBackendStore {
 		return $fsFiles;
 	}
 
-	/**
-	 * @see FileBackendStore::doGetLocalCopyMulti()
-	 * @return Array
-	 */
 	protected function doGetLocalCopyMulti( array $params ) {
 		$tmpFiles = array(); // (path => TempFSFile)
 
@@ -702,18 +640,10 @@ class FSFileBackend extends FileBackendStore {
 		return $tmpFiles;
 	}
 
-	/**
-	 * @see FileBackendStore::directoriesAreVirtual()
-	 * @return bool
-	 */
 	protected function directoriesAreVirtual() {
 		return false;
 	}
 
-	/**
-	 * @see FileBackendStore::doExecuteOpHandlesInternal()
-	 * @return Array List of corresponding Status objects
-	 */
 	protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
 		$statuses = array();
 
@@ -807,11 +737,12 @@ class FSFileBackend extends FileBackendStore {
 	}
 
 	/**
-	 * @param $errno integer
-	 * @param $errstr string
+	 * @param integer $errno
+	 * @param string $errstr
 	 * @return bool
+	 * @access private
 	 */
-	private function handleWarning( $errno, $errstr ) {
+	public function handleWarning( $errno, $errstr ) {
 		wfDebugLog( 'FSFileBackend', $errstr ); // more detailed error logging
 		$this->hadWarningErrors[count( $this->hadWarningErrors ) - 1] = true;
 		return true; // suppress from PHP handler
@@ -826,13 +757,15 @@ class FSFileOpHandle extends FileBackendStoreOpHandle {
 	public $chmodPath; // string; file to chmod
 
 	/**
-	 * @param $backend
-	 * @param $params array
-	 * @param $call
-	 * @param $cmd
-	 * @param $chmodPath null
+	 * @param FSFileBackend $backend
+	 * @param array $params
+	 * @param string $call
+	 * @param string $cmd
+	 * @param integer|null $chmodPath
 	 */
-	public function __construct( $backend, array $params, $call, $cmd, $chmodPath = null ) {
+	public function __construct(
+		FSFileBackend $backend, array $params, $call, $cmd, $chmodPath = null
+	) {
 		$this->backend = $backend;
 		$this->params = $params;
 		$this->call = $call;
@@ -858,11 +791,11 @@ abstract class FSFileBackendList implements Iterator {
 
 	/**
 	 * @param string $dir file system directory
-	 * @param $params array
+	 * @param array $params
 	 */
 	public function __construct( $dir, array $params ) {
 		$path = realpath( $dir ); // normalize
-		if( $path === false ) {
+		if ( $path === false ) {
 			$path = $dir;
 		}
 		$this->suffixStart = strlen( $path ) + 1; // size of "path/to/dir/"
@@ -921,8 +854,8 @@ abstract class FSFileBackendList implements Iterator {
 		try {
 			$this->iter->next();
 			$this->filterViaNext();
-		} catch ( UnexpectedValueException $e ) {
-			$this->iter = null;
+		} catch ( UnexpectedValueException $e ) { // bad permissions? deleted?
+			throw new FileBackendError( "File iterator gave UnexpectedValueException." );
 		}
 		++$this->pos;
 	}
@@ -936,8 +869,8 @@ abstract class FSFileBackendList implements Iterator {
 		try {
 			$this->iter->rewind();
 			$this->filterViaNext();
-		} catch ( UnexpectedValueException $e ) {
-			$this->iter = null;
+		} catch ( UnexpectedValueException $e ) { // bad permissions? deleted?
+			throw new FileBackendError( "File iterator gave UnexpectedValueException." );
 		}
 	}
 
@@ -958,12 +891,12 @@ abstract class FSFileBackendList implements Iterator {
 	 * Return only the relative path and normalize slashes to FileBackend-style.
 	 * Uses the "real path" since the suffix is based upon that.
 	 *
-	 * @param $path string
+	 * @param string $path
 	 * @return string
 	 */
 	protected function getRelPath( $dir ) {
 		$path = realpath( $dir );
-		if( $path === false ) {
+		if ( $path === false ) {
 			$path = $dir;
 		}
 		return strtr( substr( $path, $this->suffixStart ), '\\', '/' );
diff --git a/includes/filebackend/FileBackend.php b/includes/filebackend/FileBackend.php
index f40b8c16..f586578b 100644
--- a/includes/filebackend/FileBackend.php
+++ b/includes/filebackend/FileBackend.php
@@ -1,7 +1,6 @@
 <?php
 /**
  * @defgroup FileBackend File backend
- * @ingroup  FileRepo
  *
  * File backend is used to interact with file storage systems,
  * such as the local file system, NFS, or cloud storage systems.
@@ -95,7 +94,7 @@ abstract class FileBackend {
 	 *                   Allowed values are "implicit", "explicit" and "off".
 	 *   - concurrency : How many file operations can be done in parallel.
 	 *
-	 * @param $config Array
+	 * @param array $config
 	 * @throws MWException
 	 */
 	public function __construct( array $config ) {
@@ -191,7 +190,6 @@ abstract class FileBackend {
 	 *         'content'             => <string of new file contents>,
 	 *         'overwrite'           => <boolean>,
 	 *         'overwriteSame'       => <boolean>,
-	 *         'disposition'         => <Content-Disposition header value>,
 	 *         'headers'             => <HTTP header name/value map> # since 1.21
 	 *     );
 	 * @endcode
@@ -204,7 +202,6 @@ abstract class FileBackend {
 	 *         'dst'                 => <storage path>,
 	 *         'overwrite'           => <boolean>,
 	 *         'overwriteSame'       => <boolean>,
-	 *         'disposition'         => <Content-Disposition header value>,
 	 *         'headers'             => <HTTP header name/value map> # since 1.21
 	 *     )
 	 * @endcode
@@ -218,7 +215,7 @@ abstract class FileBackend {
 	 *         'overwrite'           => <boolean>,
 	 *         'overwriteSame'       => <boolean>,
 	 *         'ignoreMissingSource' => <boolean>, # since 1.21
-	 *         'disposition'         => <Content-Disposition header value>
+	 *         'headers'             => <HTTP header name/value map> # since 1.21
 	 *     )
 	 * @endcode
 	 *
@@ -231,7 +228,7 @@ abstract class FileBackend {
 	 *         'overwrite'           => <boolean>,
 	 *         'overwriteSame'       => <boolean>,
 	 *         'ignoreMissingSource' => <boolean>, # since 1.21
-	 *         'disposition'         => <Content-Disposition header value>
+	 *         'headers'             => <HTTP header name/value map> # since 1.21
 	 *     )
 	 * @endcode
 	 *
@@ -249,7 +246,6 @@ abstract class FileBackend {
 	 *     array(
 	 *         'op'                  => 'describe',
 	 *         'src'                 => <storage path>,
-	 *         'disposition'         => <Content-Disposition header value>,
 	 *         'headers'             => <HTTP header name/value map>
 	 *     )
 	 * @endcode
@@ -265,19 +261,19 @@ abstract class FileBackend {
 	 *   - ignoreMissingSource : The operation will simply succeed and do
 	 *                           nothing if the source file does not exist.
 	 *   - overwrite           : Any destination file will be overwritten.
-	 *   - overwriteSame       : An error will not be given if a file already
-	 *                           exists at the destination that has the same
-	 *                           contents as the new contents to be written there.
-	 *   - disposition         : If supplied, the backend will return a Content-Disposition
-	 *                           header when GETs/HEADs of the destination file are made.
-	 *                           Backends that don't support metadata ignore this.
-	 *                           See http://tools.ietf.org/html/rfc6266. (since 1.20)
-	 *   - headers             : If supplied, the backend will return these headers when
-	 *                           GETs/HEADs of the destination file are made. Header values
-	 *                           should be smaller than 256 bytes, often options or numbers.
-	 *                           Existing headers will remain, but these will replace any
-	 *                           conflicting previous headers, and headers will be removed
-	 *                           if they are set to an empty string.
+	 *   - overwriteSame       : If a file already exists at the destination with the
+	 *                           same contents, then do nothing to the destination file
+	 *                           instead of giving an error. This does not compare headers.
+	 *                           This option is ignored if 'overwrite' is already provided.
+	 *   - headers             : If supplied, the result of merging these headers with any
+	 *                           existing source file headers (replacing conflicting ones)
+	 *                           will be set as the destination file headers. Headers are
+	 *                           deleted if their value is set to the empty string. When a
+	 *                           file has headers they are included in responses to GET and
+	 *                           HEAD requests to the backing store for that file.
+	 *                           Header values should be no larger than 255 bytes, except for
+	 *                           Content-Disposition. The system might ignore or truncate any
+	 *                           headers that are too long to store (exact limits will vary).
 	 *                           Backends that don't support metadata ignore this. (since 1.21)
 	 *
 	 * $opts is an associative of boolean flags, including:
@@ -318,9 +314,17 @@ abstract class FileBackend {
 		if ( empty( $opts['bypassReadOnly'] ) && $this->isReadOnly() ) {
 			return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
 		}
+		if ( !count( $ops ) ) {
+			return Status::newGood(); // nothing to do
+		}
 		if ( empty( $opts['force'] ) ) { // sanity
 			unset( $opts['nonLocking'] );
 		}
+		foreach ( $ops as &$op ) {
+			if ( isset( $op['disposition'] ) ) { // b/c (MW 1.20)
+				$op['headers']['Content-Disposition'] = $op['disposition'];
+			}
+		}
 		$scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
 		return $this->doOperationsInternal( $ops, $opts );
 	}
@@ -452,7 +456,6 @@ abstract class FileBackend {
 	 *         'op'                  => 'create',
 	 *         'dst'                 => <storage path>,
 	 *         'content'             => <string of new file contents>,
-	 *         'disposition'         => <Content-Disposition header value>,
 	 *         'headers'             => <HTTP header name/value map> # since 1.21
 	 *     )
 	 * @endcode
@@ -463,7 +466,6 @@ abstract class FileBackend {
 	 *         'op'                  => 'store',
 	 *         'src'                 => <file system path>,
 	 *         'dst'                 => <storage path>,
-	 *         'disposition'         => <Content-Disposition header value>,
 	 *         'headers'             => <HTTP header name/value map> # since 1.21
 	 *     )
 	 * @endcode
@@ -475,7 +477,7 @@ abstract class FileBackend {
 	 *         'src'                 => <storage path>,
 	 *         'dst'                 => <storage path>,
 	 *         'ignoreMissingSource' => <boolean>, # since 1.21
-	 *         'disposition'         => <Content-Disposition header value>
+	 *         'headers'             => <HTTP header name/value map> # since 1.21
 	 *     )
 	 * @endcode
 	 *
@@ -486,7 +488,7 @@ abstract class FileBackend {
 	 *         'src'                 => <storage path>,
 	 *         'dst'                 => <storage path>,
 	 *         'ignoreMissingSource' => <boolean>, # since 1.21
-	 *         'disposition'         => <Content-Disposition header value>
+	 *         'headers'             => <HTTP header name/value map> # since 1.21
 	 *     )
 	 * @endcode
 	 *
@@ -504,7 +506,6 @@ abstract class FileBackend {
 	 *     array(
 	 *         'op'                  => 'describe',
 	 *         'src'                 => <storage path>,
-	 *         'disposition'         => <Content-Disposition header value>,
 	 *         'headers'             => <HTTP header name/value map>
 	 *     )
 	 * @endcode
@@ -519,13 +520,11 @@ abstract class FileBackend {
 	 * @par Boolean flags for operations (operation-specific):
 	 *   - ignoreMissingSource : The operation will simply succeed and do
 	 *                           nothing if the source file does not exist.
-	 *   - disposition         : When supplied, the backend will add a Content-Disposition
-	 *                           header when GETs/HEADs of the destination file are made.
-	 *                           Backends that don't support file metadata will ignore this.
-	 *                           See http://tools.ietf.org/html/rfc6266 (since 1.20).
 	 *   - headers             : If supplied with a header name/value map, the backend will
 	 *                           reply with these headers when GETs/HEADs of the destination
 	 *                           file are made. Header values should be smaller than 256 bytes.
+	 *                           Content-Disposition headers can be longer, though the system
+	 *                           might ignore or truncate ones that are too long to store.
 	 *                           Existing headers will remain, but these will replace any
 	 *                           conflicting previous headers, and headers will be removed
 	 *                           if they are set to an empty string.
@@ -549,8 +548,14 @@ abstract class FileBackend {
 		if ( empty( $opts['bypassReadOnly'] ) && $this->isReadOnly() ) {
 			return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
 		}
+		if ( !count( $ops ) ) {
+			return Status::newGood(); // nothing to do
+		}
 		foreach ( $ops as &$op ) {
 			$op['overwrite'] = true; // avoids RTTs in key/value stores
+			if ( isset( $op['disposition'] ) ) { // b/c (MW 1.20)
+				$op['headers']['Content-Disposition'] = $op['disposition'];
+			}
 		}
 		$scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
 		return $this->doQuickOperationsInternal( $ops );
@@ -683,6 +688,8 @@ abstract class FileBackend {
 	 * The 'noAccess' and 'noListing' parameters works the same as in secure(),
 	 * except they are only applied *if* the directory/container had to be created.
 	 * These flags should always be set for directories that have private files.
+	 * However, setting them is not guaranteed to actually do anything.
+	 * Additional server configuration may be needed to achieve the desired effect.
 	 *
 	 * @param array $params
 	 * $params include:
@@ -710,7 +717,9 @@ abstract class FileBackend {
 	 * the container it belongs to. FS backends might add .htaccess
 	 * files whereas key/value store backends might revoke container
 	 * access to the storage user representing end-users in web requests.
-	 * This is not guaranteed to actually do anything.
+	 *
+	 * This is not guaranteed to actually make files or listings publically hidden.
+	 * Additional server configuration may be needed to achieve the desired effect.
 	 *
 	 * @param array $params
 	 * $params include:
@@ -740,6 +749,9 @@ abstract class FileBackend {
 	 * access to the storage user representing end-users in web requests.
 	 * This essentially can undo the result of secure() calls.
 	 *
+	 * This is not guaranteed to actually make files or listings publically viewable.
+	 * Additional server configuration may be needed to achieve the desired effect.
+	 *
 	 * @param array $params
 	 * $params include:
 	 *   - dir            : storage directory
@@ -797,7 +809,9 @@ abstract class FileBackend {
 	final protected function getScopedPHPBehaviorForOps() {
 		if ( php_sapi_name() != 'cli' ) { // http://bugs.php.net/bug.php?id=47540
 			$old = ignore_user_abort( true ); // avoid half-finished operations
-			return new ScopedCallback( function() use ( $old ) { ignore_user_abort( $old ); } );
+			return new ScopedCallback( function() use ( $old ) {
+				ignore_user_abort( $old );
+			} );
 		}
 		return null;
 	}
@@ -1029,7 +1043,7 @@ abstract class FileBackend {
 	 *
 	 * Storage backends with eventual consistency might return stale data.
 	 *
-	 * @param $params array
+	 * @param array $params
 	 * $params include:
 	 *   - dir : storage directory
 	 * @return bool|null Returns null on failure
@@ -1047,7 +1061,9 @@ abstract class FileBackend {
 	 *
 	 * Storage backends with eventual consistency might return stale data.
 	 *
-	 * @param $params array
+	 * Failures during iteration can result in FileBackendError exceptions (since 1.22).
+	 *
+	 * @param array $params
 	 * $params include:
 	 *   - dir     : storage directory
 	 *   - topOnly : only return direct child dirs of the directory
@@ -1062,7 +1078,9 @@ abstract class FileBackend {
 	 *
 	 * Storage backends with eventual consistency might return stale data.
 	 *
-	 * @param $params array
+	 * Failures during iteration can result in FileBackendError exceptions (since 1.22).
+	 *
+	 * @param array $params
 	 * $params include:
 	 *   - dir : storage directory
 	 * @return Traversable|Array|null Returns null on failure
@@ -1082,10 +1100,13 @@ abstract class FileBackend {
 	 *
 	 * Storage backends with eventual consistency might return stale data.
 	 *
-	 * @param $params array
+	 * Failures during iteration can result in FileBackendError exceptions (since 1.22).
+	 *
+	 * @param array $params
 	 * $params include:
-	 *   - dir     : storage directory
-	 *   - topOnly : only return direct child files of the directory (since 1.20)
+	 *   - dir        : storage directory
+	 *   - topOnly    : only return direct child files of the directory (since 1.20)
+	 *   - adviseStat : set to true if stat requests will be made on the files (since 1.22)
 	 * @return Traversable|Array|null Returns null on failure
 	 */
 	abstract public function getFileList( array $params );
@@ -1096,9 +1117,12 @@ abstract class FileBackend {
 	 *
 	 * Storage backends with eventual consistency might return stale data.
 	 *
-	 * @param $params array
+	 * Failures during iteration can result in FileBackendError exceptions (since 1.22).
+	 *
+	 * @param array $params
 	 * $params include:
-	 *   - dir : storage directory
+	 *   - dir        : storage directory
+	 *   - adviseStat : set to true if stat requests will be made on the files (since 1.22)
 	 * @return Traversable|Array|null Returns null on failure
 	 * @since 1.20
 	 */
@@ -1131,10 +1155,11 @@ abstract class FileBackend {
 	 * Callers should consider using getScopedFileLocks() instead.
 	 *
 	 * @param array $paths Storage paths
-	 * @param $type integer LockManager::LOCK_* constant
+	 * @param integer $type LockManager::LOCK_* constant
 	 * @return Status
 	 */
 	final public function lockFiles( array $paths, $type ) {
+		$paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
 		return $this->lockManager->lock( $paths, $type );
 	}
 
@@ -1142,10 +1167,11 @@ abstract class FileBackend {
 	 * Unlock the files at the given storage paths in the backend.
 	 *
 	 * @param array $paths Storage paths
-	 * @param $type integer LockManager::LOCK_* constant
+	 * @param integer $type LockManager::LOCK_* constant
 	 * @return Status
 	 */
 	final public function unlockFiles( array $paths, $type ) {
+		$paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
 		return $this->lockManager->unlock( $paths, $type );
 	}
 
@@ -1157,12 +1183,21 @@ abstract class FileBackend {
 	 * Once the return value goes out scope, the locks will be released and
 	 * the status updated. Unlock fatals will not change the status "OK" value.
 	 *
-	 * @param array $paths Storage paths
-	 * @param $type integer LockManager::LOCK_* constant
-	 * @param $status Status Status to update on lock/unlock
+	 * @see ScopedLock::factory()
+	 *
+	 * @param array $paths List of storage paths or map of lock types to path lists
+	 * @param integer|string $type LockManager::LOCK_* constant or "mixed"
+	 * @param Status $status Status to update on lock/unlock
 	 * @return ScopedLock|null Returns null on failure
 	 */
 	final public function getScopedFileLocks( array $paths, $type, Status $status ) {
+		if ( $type === 'mixed' ) {
+			foreach ( $paths as &$typePaths ) {
+				$typePaths = array_map( 'FileBackend::normalizeStoragePath', $typePaths );
+			}
+		} else {
+			$paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
+		}
 		return ScopedLock::factory( $this->lockManager, $paths, $type, $status );
 	}
 
@@ -1178,7 +1213,7 @@ abstract class FileBackend {
 	 * @see FileBackend::doOperations()
 	 *
 	 * @param array $ops List of file operations to FileBackend::doOperations()
-	 * @param $status Status Status to update on lock/unlock
+	 * @param Status $status Status to update on lock/unlock
 	 * @return Array List of ScopedFileLocks or null values
 	 * @since 1.20
 	 */
@@ -1219,7 +1254,7 @@ abstract class FileBackend {
 	 * Check if a given path is a "mwstore://" path.
 	 * This does not do any further validation or any existence checks.
 	 *
-	 * @param $path string
+	 * @param string $path
 	 * @return bool
 	 */
 	final public static function isStoragePath( $path ) {
@@ -1231,7 +1266,7 @@ abstract class FileBackend {
 	 * and a relative file path. The relative path may be the empty string.
 	 * This does not do any path normalization or traversal checks.
 	 *
-	 * @param $storagePath string
+	 * @param string $storagePath
 	 * @return Array (backend, container, rel object) or (null, null, null)
 	 */
 	final public static function splitStoragePath( $storagePath ) {
@@ -1253,7 +1288,7 @@ abstract class FileBackend {
 	 * Normalize a storage path by cleaning up directory separators.
 	 * Returns null if the path is not of the format of a valid storage path.
 	 *
-	 * @param $storagePath string
+	 * @param string $storagePath
 	 * @return string|null
 	 */
 	final public static function normalizeStoragePath( $storagePath ) {
@@ -1274,7 +1309,7 @@ abstract class FileBackend {
 	 * This returns a path like "mwstore://backend/container",
 	 * "mwstore://backend/container/...", or null if there is no parent.
 	 *
-	 * @param $storagePath string
+	 * @param string $storagePath
 	 * @return string|null
 	 */
 	final public static function parentStoragePath( $storagePath ) {
@@ -1286,7 +1321,7 @@ abstract class FileBackend {
 	/**
 	 * Get the final extension from a storage or FS path
 	 *
-	 * @param $path string
+	 * @param string $path
 	 * @return string
 	 */
 	final public static function extensionFromPath( $path ) {
@@ -1297,7 +1332,7 @@ abstract class FileBackend {
 	/**
 	 * Check if a relative path has no directory traversals
 	 *
-	 * @param $path string
+	 * @param string $path
 	 * @return bool
 	 * @since 1.20
 	 */
@@ -1363,3 +1398,9 @@ abstract class FileBackend {
 		return $path;
 	}
 }
+
+/**
+ * @ingroup FileBackend
+ * @since 1.22
+ */
+class FileBackendError extends MWException {}
diff --git a/includes/filebackend/FileBackendGroup.php b/includes/filebackend/FileBackendGroup.php
index d790a996..be8a2076 100644
--- a/includes/filebackend/FileBackendGroup.php
+++ b/includes/filebackend/FileBackendGroup.php
@@ -95,17 +95,17 @@ class FileBackendGroup {
 				: 0644;
 			// Get the FS backend configuration
 			$autoBackends[] = array(
-				'name'           => $backendName,
-				'class'          => 'FSFileBackend',
-				'lockManager'    => 'fsLockManager',
+				'name' => $backendName,
+				'class' => 'FSFileBackend',
+				'lockManager' => 'fsLockManager',
 				'containerPaths' => array(
-					"{$repoName}-public"  => "{$directory}",
-					"{$repoName}-thumb"   => $thumbDir,
-					"{$repoName}-transcoded"   => $transcodedDir,
+					"{$repoName}-public" => "{$directory}",
+					"{$repoName}-thumb" => $thumbDir,
+					"{$repoName}-transcoded" => $transcodedDir,
 					"{$repoName}-deleted" => $deletedDir,
-					"{$repoName}-temp"    => "{$directory}/temp"
+					"{$repoName}-temp" => "{$directory}/temp"
 				),
-				'fileMode'       => $fileMode,
+				'fileMode' => $fileMode,
 			);
 		}
 
@@ -116,7 +116,7 @@ class FileBackendGroup {
 	/**
 	 * Register an array of file backend configurations
 	 *
-	 * @param $configs Array
+	 * @param Array $configs
 	 * @return void
 	 * @throws MWException
 	 */
@@ -135,8 +135,8 @@ class FileBackendGroup {
 
 			unset( $config['class'] ); // backend won't need this
 			$this->backends[$name] = array(
-				'class'    => $class,
-				'config'   => $config,
+				'class' => $class,
+				'config' => $config,
 				'instance' => null
 			);
 		}
@@ -145,7 +145,7 @@ class FileBackendGroup {
 	/**
 	 * Get the backend object with a given name
 	 *
-	 * @param $name string
+	 * @param string $name
 	 * @return FileBackend
 	 * @throws MWException
 	 */
@@ -165,7 +165,7 @@ class FileBackendGroup {
 	/**
 	 * Get the config array for a backend object with a given name
 	 *
-	 * @param $name string
+	 * @param string $name
 	 * @return Array
 	 * @throws MWException
 	 */
@@ -180,7 +180,7 @@ class FileBackendGroup {
 	/**
 	 * Get an appropriate backend object from a storage path
 	 *
-	 * @param $storagePath string
+	 * @param string $storagePath
 	 * @return FileBackend|null Backend or null on failure
 	 */
 	public function backendFromPath( $storagePath ) {
diff --git a/includes/filebackend/FileBackendMultiWrite.php b/includes/filebackend/FileBackendMultiWrite.php
index 939315d1..97584a71 100644
--- a/includes/filebackend/FileBackendMultiWrite.php
+++ b/includes/filebackend/FileBackendMultiWrite.php
@@ -75,10 +75,13 @@ class FileBackendMultiWrite extends FileBackend {
 	 *   - autoResync     : Automatically resync the clone backends to the master backend
 	 *                      when pre-operation sync checks fail. This should only be used
 	 *                      if the master backend is stable and not missing any files.
+	 *                      Use "conservative" to limit resyncing to copying newer master
+	 *                      backend files over older (or non-existing) clone backend files.
+	 *                      Cases that cannot be handled will result in operation abortion.
 	 *   - noPushQuickOps : (hack) Only apply doQuickOperations() to the master backend.
 	 *   - noPushDirConts : (hack) Only apply directory functions to the master backend.
 	 *
-	 * @param $config Array
+	 * @param Array $config
 	 * @throws MWException
 	 */
 	public function __construct( array $config ) {
@@ -86,7 +89,9 @@ class FileBackendMultiWrite extends FileBackend {
 		$this->syncChecks = isset( $config['syncChecks'] )
 			? $config['syncChecks']
 			: self::CHECK_SIZE;
-		$this->autoResync = !empty( $config['autoResync'] );
+		$this->autoResync = isset( $config['autoResync'] )
+			? $config['autoResync']
+			: false;
 		$this->noPushQuickOps = isset( $config['noPushQuickOps'] )
 			? $config['noPushQuickOps']
 			: false;
@@ -131,26 +136,15 @@ class FileBackendMultiWrite extends FileBackend {
 		}
 	}
 
-	/**
-	 * @see FileBackend::doOperationsInternal()
-	 * @return Status
-	 */
 	final protected function doOperationsInternal( array $ops, array $opts ) {
 		$status = Status::newGood();
 
 		$mbe = $this->backends[$this->masterIndex]; // convenience
 
-		// Get the paths to lock from the master backend
-		$realOps = $this->substOpBatchPaths( $ops, $mbe );
-		$paths = $mbe->getPathsToLockForOpsInternal( $mbe->getOperationsInternal( $realOps ) );
-		// Get the paths under the proxy backend's name
-		$paths['sh'] = $this->unsubstPaths( $paths['sh'] );
-		$paths['ex'] = $this->unsubstPaths( $paths['ex'] );
 		// Try to lock those files for the scope of this function...
 		if ( empty( $opts['nonLocking'] ) ) {
 			// Try to lock those files for the scope of this function...
-			$scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
-			$scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
+			$scopeLock = $this->getScopedLocksForOps( $ops, $status );
 			if ( !$status->isOK() ) {
 				return $status; // abort
 			}
@@ -177,6 +171,7 @@ class FileBackendMultiWrite extends FileBackend {
 			}
 		}
 		// Actually attempt the operation batch on the master backend...
+		$realOps = $this->substOpBatchPaths( $ops, $mbe );
 		$masterStatus = $mbe->doOperations( $realOps, $opts );
 		$status->merge( $masterStatus );
 		// Propagate the operations to the clone backends if there were no unexpected errors
@@ -304,11 +299,11 @@ class FileBackendMultiWrite extends FileBackend {
 		$mBackend = $this->backends[$this->masterIndex];
 		foreach ( $paths as $path ) {
 			$mPath = $this->substPaths( $path, $mBackend );
-			$mSha1 = $mBackend->getFileSha1Base36( array( 'src' => $mPath ) );
-			$mExist = $mBackend->fileExists( array( 'src' => $mPath ) );
-			// Check if the master backend is available...
-			if ( $mExist === null ) {
+			$mSha1 = $mBackend->getFileSha1Base36( array( 'src' => $mPath, 'latest' => true ) );
+			$mStat = $mBackend->getFileStat( array( 'src' => $mPath, 'latest' => true ) );
+			if ( $mStat === null || ( $mSha1 !== false && !$mStat ) ) { // sanity
 				$status->fatal( 'backend-fail-internal', $this->name );
+				continue; // file is not available on the master backend...
 			}
 			// Check of all clone backends agree with the master...
 			foreach ( $this->backends as $index => $cBackend ) {
@@ -316,15 +311,31 @@ class FileBackendMultiWrite extends FileBackend {
 					continue; // master
 				}
 				$cPath = $this->substPaths( $path, $cBackend );
-				$cSha1 = $cBackend->getFileSha1Base36( array( 'src' => $cPath ) );
+				$cSha1 = $cBackend->getFileSha1Base36( array( 'src' => $cPath, 'latest' => true ) );
+				$cStat = $cBackend->getFileStat( array( 'src' => $cPath, 'latest' => true ) );
+				if ( $cStat === null || ( $cSha1 !== false && !$cStat ) ) { // sanity
+					$status->fatal( 'backend-fail-internal', $cBackend->getName() );
+					continue; // file is not available on the clone backend...
+				}
 				if ( $mSha1 === $cSha1 ) {
 					// already synced; nothing to do
-				} elseif ( $mSha1 ) { // file is in master
-					$fsFile = $mBackend->getLocalReference( array( 'src' => $mPath ) );
+				} elseif ( $mSha1 !== false ) { // file is in master
+					if ( $this->autoResync === 'conservative'
+						&& $cStat && $cStat['mtime'] > $mStat['mtime'] )
+					{
+						$status->fatal( 'backend-fail-synced', $path );
+						continue; // don't rollback data
+					}
+					$fsFile = $mBackend->getLocalReference(
+						array( 'src' => $mPath, 'latest' => true ) );
 					$status->merge( $cBackend->quickStore(
 						array( 'src' => $fsFile->getPath(), 'dst' => $cPath )
 					) );
-				} elseif ( $mExist === false ) { // file is not in master
+				} elseif ( $mStat === false ) { // file is not in master
+					if ( $this->autoResync === 'conservative' ) {
+						$status->fatal( 'backend-fail-synced', $path );
+						continue; // don't delete data
+					}
 					$status->merge( $cBackend->quickDelete( array( 'src' => $cPath ) ) );
 				}
 			}
@@ -366,7 +377,7 @@ class FileBackendMultiWrite extends FileBackend {
 	 * for a set of operations with that of a given internal backend.
 	 *
 	 * @param array $ops List of file operation arrays
-	 * @param $backend FileBackendStore
+	 * @param FileBackendStore $backend
 	 * @return Array
 	 */
 	protected function substOpBatchPaths( array $ops, FileBackendStore $backend ) {
@@ -387,7 +398,7 @@ class FileBackendMultiWrite extends FileBackend {
 	 * Same as substOpBatchPaths() but for a single operation
 	 *
 	 * @param array $ops File operation array
-	 * @param $backend FileBackendStore
+	 * @param FileBackendStore $backend
 	 * @return Array
 	 */
 	protected function substOpPaths( array $ops, FileBackendStore $backend ) {
@@ -399,7 +410,7 @@ class FileBackendMultiWrite extends FileBackend {
 	 * Substitute the backend of storage paths with an internal backend's name
 	 *
 	 * @param array|string $paths List of paths or single string path
-	 * @param $backend FileBackendStore
+	 * @param FileBackendStore $backend
 	 * @return Array|string
 	 */
 	protected function substPaths( $paths, FileBackendStore $backend ) {
@@ -424,10 +435,6 @@ class FileBackendMultiWrite extends FileBackend {
 		);
 	}
 
-	/**
-	 * @see FileBackend::doQuickOperationsInternal()
-	 * @return Status
-	 */
 	protected function doQuickOperationsInternal( array $ops ) {
 		$status = Status::newGood();
 		// Do the operations on the master backend; setting Status fields...
@@ -457,14 +464,10 @@ class FileBackendMultiWrite extends FileBackend {
 	 * @return bool Path container should have dir changes pushed to all backends
 	 */
 	protected function replicateContainerDirChanges( $path ) {
-		list( , $shortCont,  ) = self::splitStoragePath( $path );
+		list( , $shortCont, ) = self::splitStoragePath( $path );
 		return !in_array( $shortCont, $this->noPushDirConts );
 	}
 
-	/**
-	 * @see FileBackend::doPrepare()
-	 * @return Status
-	 */
 	protected function doPrepare( array $params ) {
 		$status = Status::newGood();
 		$replicate = $this->replicateContainerDirChanges( $params['dir'] );
@@ -477,11 +480,6 @@ class FileBackendMultiWrite extends FileBackend {
 		return $status;
 	}
 
-	/**
-	 * @see FileBackend::doSecure()
-	 * @param $params array
-	 * @return Status
-	 */
 	protected function doSecure( array $params ) {
 		$status = Status::newGood();
 		$replicate = $this->replicateContainerDirChanges( $params['dir'] );
@@ -494,11 +492,6 @@ class FileBackendMultiWrite extends FileBackend {
 		return $status;
 	}
 
-	/**
-	 * @see FileBackend::doPublish()
-	 * @param $params array
-	 * @return Status
-	 */
 	protected function doPublish( array $params ) {
 		$status = Status::newGood();
 		$replicate = $this->replicateContainerDirChanges( $params['dir'] );
@@ -511,11 +504,6 @@ class FileBackendMultiWrite extends FileBackend {
 		return $status;
 	}
 
-	/**
-	 * @see FileBackend::doClean()
-	 * @param $params array
-	 * @return Status
-	 */
 	protected function doClean( array $params ) {
 		$status = Status::newGood();
 		$replicate = $this->replicateContainerDirChanges( $params['dir'] );
@@ -528,62 +516,32 @@ class FileBackendMultiWrite extends FileBackend {
 		return $status;
 	}
 
-	/**
-	 * @see FileBackend::concatenate()
-	 * @param $params array
-	 * @return Status
-	 */
 	public function concatenate( array $params ) {
 		// We are writing to an FS file, so we don't need to do this per-backend
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		return $this->backends[$this->masterIndex]->concatenate( $realParams );
 	}
 
-	/**
-	 * @see FileBackend::fileExists()
-	 * @param $params array
-	 * @return bool|null
-	 */
 	public function fileExists( array $params ) {
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		return $this->backends[$this->masterIndex]->fileExists( $realParams );
 	}
 
-	/**
-	 * @see FileBackend::getFileTimestamp()
-	 * @param $params array
-	 * @return bool|string
-	 */
 	public function getFileTimestamp( array $params ) {
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		return $this->backends[$this->masterIndex]->getFileTimestamp( $realParams );
 	}
 
-	/**
-	 * @see FileBackend::getFileSize()
-	 * @param $params array
-	 * @return bool|int
-	 */
 	public function getFileSize( array $params ) {
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		return $this->backends[$this->masterIndex]->getFileSize( $realParams );
 	}
 
-	/**
-	 * @see FileBackend::getFileStat()
-	 * @param $params array
-	 * @return Array|bool|null
-	 */
 	public function getFileStat( array $params ) {
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		return $this->backends[$this->masterIndex]->getFileStat( $realParams );
 	}
 
-	/**
-	 * @see FileBackend::getFileContentsMulti()
-	 * @param $params array
-	 * @return bool|string
-	 */
 	public function getFileContentsMulti( array $params ) {
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		$contentsM = $this->backends[$this->masterIndex]->getFileContentsMulti( $realParams );
@@ -595,41 +553,21 @@ class FileBackendMultiWrite extends FileBackend {
 		return $contents;
 	}
 
-	/**
-	 * @see FileBackend::getFileSha1Base36()
-	 * @param $params array
-	 * @return bool|string
-	 */
 	public function getFileSha1Base36( array $params ) {
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		return $this->backends[$this->masterIndex]->getFileSha1Base36( $realParams );
 	}
 
-	/**
-	 * @see FileBackend::getFileProps()
-	 * @param $params array
-	 * @return Array
-	 */
 	public function getFileProps( array $params ) {
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		return $this->backends[$this->masterIndex]->getFileProps( $realParams );
 	}
 
-	/**
-	 * @see FileBackend::streamFile()
-	 * @param $params array
-	 * @return \Status
-	 */
 	public function streamFile( array $params ) {
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		return $this->backends[$this->masterIndex]->streamFile( $realParams );
 	}
 
-	/**
-	 * @see FileBackend::getLocalReferenceMulti()
-	 * @param $params array
-	 * @return FSFile|null
-	 */
 	public function getLocalReferenceMulti( array $params ) {
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		$fsFilesM = $this->backends[$this->masterIndex]->getLocalReferenceMulti( $realParams );
@@ -641,11 +579,6 @@ class FileBackendMultiWrite extends FileBackend {
 		return $fsFiles;
 	}
 
-	/**
-	 * @see FileBackend::getLocalCopyMulti()
-	 * @param $params array
-	 * @return null|TempFSFile
-	 */
 	public function getLocalCopyMulti( array $params ) {
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		$tempFilesM = $this->backends[$this->masterIndex]->getLocalCopyMulti( $realParams );
@@ -657,48 +590,26 @@ class FileBackendMultiWrite extends FileBackend {
 		return $tempFiles;
 	}
 
-	/**
-	 * @see FileBackend::getFileHttpUrl()
-	 * @return string|null
-	 */
 	public function getFileHttpUrl( array $params ) {
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		return $this->backends[$this->masterIndex]->getFileHttpUrl( $realParams );
 	}
 
-	/**
-	 * @see FileBackend::directoryExists()
-	 * @param $params array
-	 * @return bool|null
-	 */
 	public function directoryExists( array $params ) {
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		return $this->backends[$this->masterIndex]->directoryExists( $realParams );
 	}
 
-	/**
-	 * @see FileBackend::getSubdirectoryList()
-	 * @param $params array
-	 * @return Array|null|Traversable
-	 */
 	public function getDirectoryList( array $params ) {
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		return $this->backends[$this->masterIndex]->getDirectoryList( $realParams );
 	}
 
-	/**
-	 * @see FileBackend::getFileList()
-	 * @param $params array
-	 * @return Array|null|\Traversable
-	 */
 	public function getFileList( array $params ) {
 		$realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
 		return $this->backends[$this->masterIndex]->getFileList( $realParams );
 	}
 
-	/**
-	 * @see FileBackend::clearCache()
-	 */
 	public function clearCache( array $paths = null ) {
 		foreach ( $this->backends as $backend ) {
 			$realPaths = is_array( $paths ) ? $this->substPaths( $paths, $backend ) : null;
@@ -706,19 +617,17 @@ class FileBackendMultiWrite extends FileBackend {
 		}
 	}
 
-	/**
-	 * @see FileBackend::getScopedLocksForOps()
-	 */
 	public function getScopedLocksForOps( array $ops, Status $status ) {
-		$fileOps = $this->backends[$this->masterIndex]->getOperationsInternal( $ops );
+		$realOps = $this->substOpBatchPaths( $ops, $this->backends[$this->masterIndex] );
+		$fileOps = $this->backends[$this->masterIndex]->getOperationsInternal( $realOps );
 		// Get the paths to lock from the master backend
 		$paths = $this->backends[$this->masterIndex]->getPathsToLockForOpsInternal( $fileOps );
 		// Get the paths under the proxy backend's name
-		$paths['sh'] = $this->unsubstPaths( $paths['sh'] );
-		$paths['ex'] = $this->unsubstPaths( $paths['ex'] );
-		return array(
-			$this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ),
-			$this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status )
+		$pbPaths = array(
+			LockManager::LOCK_UW => $this->unsubstPaths( $paths[LockManager::LOCK_UW] ),
+			LockManager::LOCK_EX => $this->unsubstPaths( $paths[LockManager::LOCK_EX] )
 		);
+		// Actually acquire the locks
+		return array( $this->getScopedFileLocks( $pbPaths, 'mixed', $status ) );
 	}
 }
diff --git a/includes/filebackend/FileBackendStore.php b/includes/filebackend/FileBackendStore.php
index 3f1d1857..0921e99f 100644
--- a/includes/filebackend/FileBackendStore.php
+++ b/includes/filebackend/FileBackendStore.php
@@ -38,28 +38,43 @@
 abstract class FileBackendStore extends FileBackend {
 	/** @var BagOStuff */
 	protected $memCache;
-	/** @var ProcessCacheLRU */
-	protected $cheapCache; // Map of paths to small (RAM/disk) cache items
-	/** @var ProcessCacheLRU */
-	protected $expensiveCache; // Map of paths to large (RAM/disk) cache items
+	/** @var ProcessCacheLRU Map of paths to small (RAM/disk) cache items */
+	protected $cheapCache;
+	/** @var ProcessCacheLRU Map of paths to large (RAM/disk) cache items */
+	protected $expensiveCache;
 
-	/** @var Array Map of container names to sharding settings */
-	protected $shardViaHashLevels = array(); // (container name => config array)
+	/** @var Array Map of container names to sharding config */
+	protected $shardViaHashLevels = array();
+
+	/** @var callback Method to get the MIME type of files */
+	protected $mimeCallback;
 
 	protected $maxFileSize = 4294967296; // integer bytes (4GiB)
 
 	const CACHE_TTL = 10; // integer; TTL in seconds for process cache entries
+	const CACHE_CHEAP_SIZE = 300; // integer; max entries in "cheap cache"
+	const CACHE_EXPENSIVE_SIZE = 5; // integer; max entries in "expensive cache"
 
 	/**
 	 * @see FileBackend::__construct()
+	 * Additional $config params include:
+	 *   - mimeCallback : Callback that takes (storage path, content, file system path) and
+	 *                    returns the MIME type of the file or 'unknown/unknown'. The file
+	 *                    system path parameter should be used if the content one is null.
 	 *
-	 * @param $config Array
+	 * @param array $config
 	 */
 	public function __construct( array $config ) {
 		parent::__construct( $config );
+		$this->mimeCallback = isset( $config['mimeCallback'] )
+			? $config['mimeCallback']
+			: function( $storagePath, $content, $fsPath ) {
+				// @TODO: handle the case of extension-less files using the contents
+				return StreamFile::contentTypeFromPath( $storagePath ) ?: 'unknown/unknown';
+			};
 		$this->memCache = new EmptyBagOStuff(); // disabled by default
-		$this->cheapCache = new ProcessCacheLRU( 300 );
-		$this->expensiveCache = new ProcessCacheLRU( 5 );
+		$this->cheapCache = new ProcessCacheLRU( self::CACHE_CHEAP_SIZE );
+		$this->expensiveCache = new ProcessCacheLRU( self::CACHE_EXPENSIVE_SIZE );
 	}
 
 	/**
@@ -79,7 +94,7 @@ abstract class FileBackendStore extends FileBackend {
 	 * written under it, and that any file already there is writable.
 	 * Backends using key/value stores should check if the container exists.
 	 *
-	 * @param $storagePath string
+	 * @param string $storagePath
 	 * @return bool
 	 */
 	abstract public function isPathUsableInternal( $storagePath );
@@ -92,7 +107,6 @@ abstract class FileBackendStore extends FileBackend {
 	 * $params include:
 	 *   - content     : the raw file contents
 	 *   - dst         : destination storage path
-	 *   - disposition : Content-Disposition header value for the destination
 	 *   - headers     : HTTP header name/value map
 	 *   - async       : Status will be returned immediately if supported.
 	 *                   If the status is OK, then its value field will be
@@ -104,8 +118,7 @@ abstract class FileBackendStore extends FileBackend {
 	 * @return Status
 	 */
 	final public function createInternal( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		if ( strlen( $params['content'] ) > $this->maxFileSizeInternal() ) {
 			$status = Status::newFatal( 'backend-fail-maxsize',
 				$params['dst'], $this->maxFileSizeInternal() );
@@ -116,8 +129,6 @@ abstract class FileBackendStore extends FileBackend {
 				$this->deleteFileCache( $params['dst'] ); // persistent cache
 			}
 		}
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $status;
 	}
 
@@ -135,7 +146,6 @@ abstract class FileBackendStore extends FileBackend {
 	 * $params include:
 	 *   - src         : source path on disk
 	 *   - dst         : destination storage path
-	 *   - disposition : Content-Disposition header value for the destination
 	 *   - headers     : HTTP header name/value map
 	 *   - async       : Status will be returned immediately if supported.
 	 *                   If the status is OK, then its value field will be
@@ -147,8 +157,7 @@ abstract class FileBackendStore extends FileBackend {
 	 * @return Status
 	 */
 	final public function storeInternal( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		if ( filesize( $params['src'] ) > $this->maxFileSizeInternal() ) {
 			$status = Status::newFatal( 'backend-fail-maxsize',
 				$params['dst'], $this->maxFileSizeInternal() );
@@ -159,8 +168,6 @@ abstract class FileBackendStore extends FileBackend {
 				$this->deleteFileCache( $params['dst'] ); // persistent cache
 			}
 		}
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $status;
 	}
 
@@ -179,7 +186,7 @@ abstract class FileBackendStore extends FileBackend {
 	 *   - src                 : source storage path
 	 *   - dst                 : destination storage path
 	 *   - ignoreMissingSource : do nothing if the source file does not exist
-	 *   - disposition         : Content-Disposition header value for the destination
+	 *   - headers             : HTTP header name/value map
 	 *   - async               : Status will be returned immediately if supported.
 	 *                           If the status is OK, then its value field will be
 	 *                           set to a FileBackendStoreOpHandle object.
@@ -190,15 +197,12 @@ abstract class FileBackendStore extends FileBackend {
 	 * @return Status
 	 */
 	final public function copyInternal( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$status = $this->doCopyInternal( $params );
 		$this->clearCache( array( $params['dst'] ) );
 		if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
 			$this->deleteFileCache( $params['dst'] ); // persistent cache
 		}
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $status;
 	}
 
@@ -223,13 +227,10 @@ abstract class FileBackendStore extends FileBackend {
 	 * @return Status
 	 */
 	final public function deleteInternal( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$status = $this->doDeleteInternal( $params );
 		$this->clearCache( array( $params['src'] ) );
 		$this->deleteFileCache( $params['src'] ); // persistent cache
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $status;
 	}
 
@@ -248,7 +249,7 @@ abstract class FileBackendStore extends FileBackend {
 	 *   - src                 : source storage path
 	 *   - dst                 : destination storage path
 	 *   - ignoreMissingSource : do nothing if the source file does not exist
-	 *   - disposition         : Content-Disposition header value for the destination
+	 *   - headers             : HTTP header name/value map
 	 *   - async               : Status will be returned immediately if supported.
 	 *                           If the status is OK, then its value field will be
 	 *                           set to a FileBackendStoreOpHandle object.
@@ -259,16 +260,13 @@ abstract class FileBackendStore extends FileBackend {
 	 * @return Status
 	 */
 	final public function moveInternal( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$status = $this->doMoveInternal( $params );
 		$this->clearCache( array( $params['src'], $params['dst'] ) );
 		$this->deleteFileCache( $params['src'] ); // persistent cache
 		if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
 			$this->deleteFileCache( $params['dst'] ); // persistent cache
 		}
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $status;
 	}
 
@@ -278,10 +276,12 @@ abstract class FileBackendStore extends FileBackend {
 	 */
 	protected function doMoveInternal( array $params ) {
 		unset( $params['async'] ); // two steps, won't work here :)
+		$nsrc = FileBackend::normalizeStoragePath( $params['src'] );
+		$ndst = FileBackend::normalizeStoragePath( $params['dst'] );
 		// Copy source to dest
 		$status = $this->copyInternal( $params );
-		if ( $status->isOK() ) {
-			// Delete source (only fails due to races or medium going down)
+		if ( $nsrc !== $ndst && $status->isOK() ) {
+			// Delete source (only fails due to races or network problems)
 			$status->merge( $this->deleteInternal( array( 'src' => $params['src'] ) ) );
 			$status->setResult( true, $status->value ); // ignore delete() errors
 		}
@@ -294,7 +294,6 @@ abstract class FileBackendStore extends FileBackend {
 	 *
 	 * $params include:
 	 *   - src           : source storage path
-	 *   - disposition   : Content-Disposition header value for the destination
 	 *   - headers       : HTTP header name/value map
 	 *   - async         : Status will be returned immediately if supported.
 	 *                     If the status is OK, then its value field will be
@@ -304,13 +303,14 @@ abstract class FileBackendStore extends FileBackend {
 	 * @return Status
 	 */
 	final public function describeInternal( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
-		$status = $this->doDescribeInternal( $params );
-		$this->clearCache( array( $params['src'] ) );
-		$this->deleteFileCache( $params['src'] ); // persistent cache
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
+		if ( count( $params['headers'] ) ) {
+			$status = $this->doDescribeInternal( $params );
+			$this->clearCache( array( $params['src'] ) );
+			$this->deleteFileCache( $params['src'] ); // persistent cache
+		} else {
+			$status = Status::newGood(); // nothing to do
+		}
 		return $status;
 	}
 
@@ -333,13 +333,8 @@ abstract class FileBackendStore extends FileBackend {
 		return Status::newGood();
 	}
 
-	/**
-	 * @see FileBackend::concatenate()
-	 * @return Status
-	 */
 	final public function concatenate( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$status = Status::newGood();
 
 		// Try to lock the source files for the scope of this function
@@ -355,8 +350,6 @@ abstract class FileBackendStore extends FileBackend {
 			}
 		}
 
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $status;
 	}
 
@@ -426,20 +419,13 @@ abstract class FileBackendStore extends FileBackend {
 		return $status;
 	}
 
-	/**
-	 * @see FileBackend::doPrepare()
-	 * @return Status
-	 */
 	final protected function doPrepare( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
-
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$status = Status::newGood();
+
 		list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
 		if ( $dir === null ) {
 			$status->fatal( 'backend-fail-invalidpath', $params['dir'] );
-			wfProfileOut( __METHOD__ . '-' . $this->name );
-			wfProfileOut( __METHOD__ );
 			return $status; // invalid storage path
 		}
 
@@ -453,8 +439,6 @@ abstract class FileBackendStore extends FileBackend {
 			}
 		}
 
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $status;
 	}
 
@@ -466,20 +450,13 @@ abstract class FileBackendStore extends FileBackend {
 		return Status::newGood();
 	}
 
-	/**
-	 * @see FileBackend::doSecure()
-	 * @return Status
-	 */
 	final protected function doSecure( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$status = Status::newGood();
 
 		list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
 		if ( $dir === null ) {
 			$status->fatal( 'backend-fail-invalidpath', $params['dir'] );
-			wfProfileOut( __METHOD__ . '-' . $this->name );
-			wfProfileOut( __METHOD__ );
 			return $status; // invalid storage path
 		}
 
@@ -493,8 +470,6 @@ abstract class FileBackendStore extends FileBackend {
 			}
 		}
 
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $status;
 	}
 
@@ -506,20 +481,13 @@ abstract class FileBackendStore extends FileBackend {
 		return Status::newGood();
 	}
 
-	/**
-	 * @see FileBackend::doPublish()
-	 * @return Status
-	 */
 	final protected function doPublish( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$status = Status::newGood();
 
 		list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
 		if ( $dir === null ) {
 			$status->fatal( 'backend-fail-invalidpath', $params['dir'] );
-			wfProfileOut( __METHOD__ . '-' . $this->name );
-			wfProfileOut( __METHOD__ );
 			return $status; // invalid storage path
 		}
 
@@ -533,8 +501,6 @@ abstract class FileBackendStore extends FileBackend {
 			}
 		}
 
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $status;
 	}
 
@@ -546,13 +512,8 @@ abstract class FileBackendStore extends FileBackend {
 		return Status::newGood();
 	}
 
-	/**
-	 * @see FileBackend::doClean()
-	 * @return Status
-	 */
 	final protected function doClean( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$status = Status::newGood();
 
 		// Recursive: first delete all empty subdirs recursively
@@ -570,8 +531,6 @@ abstract class FileBackendStore extends FileBackend {
 		list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
 		if ( $dir === null ) {
 			$status->fatal( 'backend-fail-invalidpath', $params['dir'] );
-			wfProfileOut( __METHOD__ . '-' . $this->name );
-			wfProfileOut( __METHOD__ );
 			return $status; // invalid storage path
 		}
 
@@ -579,8 +538,6 @@ abstract class FileBackendStore extends FileBackend {
 		$filesLockEx = array( $params['dir'] );
 		$scopedLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
 		if ( !$status->isOK() ) {
-			wfProfileOut( __METHOD__ . '-' . $this->name );
-			wfProfileOut( __METHOD__ );
 			return $status; // abort
 		}
 
@@ -596,8 +553,6 @@ abstract class FileBackendStore extends FileBackend {
 			}
 		}
 
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $status;
 	}
 
@@ -609,56 +564,30 @@ abstract class FileBackendStore extends FileBackend {
 		return Status::newGood();
 	}
 
-	/**
-	 * @see FileBackend::fileExists()
-	 * @return bool|null
-	 */
 	final public function fileExists( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$stat = $this->getFileStat( $params );
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return ( $stat === null ) ? null : (bool)$stat; // null => failure
 	}
 
-	/**
-	 * @see FileBackend::getFileTimestamp()
-	 * @return bool
-	 */
 	final public function getFileTimestamp( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$stat = $this->getFileStat( $params );
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $stat ? $stat['mtime'] : false;
 	}
 
-	/**
-	 * @see FileBackend::getFileSize()
-	 * @return bool
-	 */
 	final public function getFileSize( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$stat = $this->getFileStat( $params );
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $stat ? $stat['size'] : false;
 	}
 
-	/**
-	 * @see FileBackend::getFileStat()
-	 * @return bool
-	 */
 	final public function getFileStat( array $params ) {
 		$path = self::normalizeStoragePath( $params['src'] );
 		if ( $path === null ) {
 			return false; // invalid storage path
 		}
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$latest = !empty( $params['latest'] ); // use latest data?
 		if ( !$this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
 			$this->primeFileCache( array( $path ) ); // check persistent cache
@@ -669,14 +598,10 @@ abstract class FileBackendStore extends FileBackend {
 			// value was in fact fetched with the latest available data.
 			if ( is_array( $stat ) ) {
 				if ( !$latest || $stat['latest'] ) {
-					wfProfileOut( __METHOD__ . '-' . $this->name );
-					wfProfileOut( __METHOD__ );
 					return $stat;
 				}
 			} elseif ( in_array( $stat, array( 'NOT_EXIST', 'NOT_EXIST_LATEST' ) ) ) {
 				if ( !$latest || $stat === 'NOT_EXIST_LATEST' ) {
-					wfProfileOut( __METHOD__ . '-' . $this->name );
-					wfProfileOut( __METHOD__ );
 					return false;
 				}
 			}
@@ -696,12 +621,12 @@ abstract class FileBackendStore extends FileBackend {
 			}
 		} elseif ( $stat === false ) { // file does not exist
 			$this->cheapCache->set( $path, 'stat', $latest ? 'NOT_EXIST_LATEST' : 'NOT_EXIST' );
+			$this->cheapCache->set( $path, 'sha1', // the SHA-1 must be false too
+				array( 'hash' => false, 'latest' => $latest ) );
 			wfDebug( __METHOD__ . ": File $path does not exist.\n" );
 		} else { // an error occurred
 			wfDebug( __METHOD__ . ": Could not stat file $path.\n" );
 		}
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $stat;
 	}
 
@@ -710,19 +635,12 @@ abstract class FileBackendStore extends FileBackend {
 	 */
 	abstract protected function doGetFileStat( array $params );
 
-	/**
-	 * @see FileBackend::getFileContentsMulti()
-	 * @return Array
-	 */
 	public function getFileContentsMulti( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 
 		$params = $this->setConcurrencyFlags( $params );
 		$contents = $this->doGetFileContentsMulti( $params );
 
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $contents;
 	}
 
@@ -740,25 +658,18 @@ abstract class FileBackendStore extends FileBackend {
 		return $contents;
 	}
 
-	/**
-	 * @see FileBackend::getFileSha1Base36()
-	 * @return bool|string
-	 */
 	final public function getFileSha1Base36( array $params ) {
 		$path = self::normalizeStoragePath( $params['src'] );
 		if ( $path === null ) {
 			return false; // invalid storage path
 		}
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$latest = !empty( $params['latest'] ); // use latest data?
 		if ( $this->cheapCache->has( $path, 'sha1', self::CACHE_TTL ) ) {
 			$stat = $this->cheapCache->get( $path, 'sha1' );
 			// If we want the latest data, check that this cached
 			// value was in fact fetched with the latest available data.
 			if ( !$latest || $stat['latest'] ) {
-				wfProfileOut( __METHOD__ . '-' . $this->name );
-				wfProfileOut( __METHOD__ );
 				return $stat['hash'];
 			}
 		}
@@ -768,8 +679,6 @@ abstract class FileBackendStore extends FileBackend {
 		wfProfileOut( __METHOD__ . '-miss-' . $this->name );
 		wfProfileOut( __METHOD__ . '-miss' );
 		$this->cheapCache->set( $path, 'sha1', array( 'hash' => $hash, 'latest' => $latest ) );
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $hash;
 	}
 
@@ -786,27 +695,15 @@ abstract class FileBackendStore extends FileBackend {
 		}
 	}
 
-	/**
-	 * @see FileBackend::getFileProps()
-	 * @return Array
-	 */
 	final public function getFileProps( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$fsFile = $this->getLocalReference( $params );
 		$props = $fsFile ? $fsFile->getProps() : FSFile::placeholderProps();
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $props;
 	}
 
-	/**
-	 * @see FileBackend::getLocalReferenceMulti()
-	 * @return Array
-	 */
 	final public function getLocalReferenceMulti( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 
 		$params = $this->setConcurrencyFlags( $params );
 
@@ -836,8 +733,6 @@ abstract class FileBackendStore extends FileBackend {
 			}
 		}
 
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $fsFiles;
 	}
 
@@ -849,19 +744,12 @@ abstract class FileBackendStore extends FileBackend {
 		return $this->doGetLocalCopyMulti( $params );
 	}
 
-	/**
-	 * @see FileBackend::getLocalCopyMulti()
-	 * @return Array
-	 */
 	final public function getLocalCopyMulti( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 
 		$params = $this->setConcurrencyFlags( $params );
 		$tmpFiles = $this->doGetLocalCopyMulti( $params );
 
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $tmpFiles;
 	}
 
@@ -879,13 +767,8 @@ abstract class FileBackendStore extends FileBackend {
 		return null; // not supported
 	}
 
-	/**
-	 * @see FileBackend::streamFile()
-	 * @return Status
-	 */
 	final public function streamFile( array $params ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$status = Status::newGood();
 
 		$info = $this->getFileStat( $params );
@@ -916,8 +799,6 @@ abstract class FileBackendStore extends FileBackend {
 			$status->fatal( 'backend-fail-stream', $params['src'] );
 		}
 
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $status;
 	}
 
@@ -938,10 +819,6 @@ abstract class FileBackendStore extends FileBackend {
 		return $status;
 	}
 
-	/**
-	 * @see FileBackend::directoryExists()
-	 * @return bool|null
-	 */
 	final public function directoryExists( array $params ) {
 		list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
 		if ( $dir === null ) {
@@ -976,10 +853,6 @@ abstract class FileBackendStore extends FileBackend {
 	 */
 	abstract protected function doDirectoryExists( $container, $dir, array $params );
 
-	/**
-	 * @see FileBackend::getDirectoryList()
-	 * @return Traversable|Array|null Returns null on failure
-	 */
 	final public function getDirectoryList( array $params ) {
 		list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
 		if ( $dir === null ) { // invalid storage path
@@ -1009,10 +882,6 @@ abstract class FileBackendStore extends FileBackend {
 	 */
 	abstract public function getDirectoryListInternal( $container, $dir, array $params );
 
-	/**
-	 * @see FileBackend::getFileList()
-	 * @return Traversable|Array|null Returns null on failure
-	 */
 	final public function getFileList( array $params ) {
 		list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
 		if ( $dir === null ) { // invalid storage path
@@ -1055,13 +924,13 @@ abstract class FileBackendStore extends FileBackend {
 	 */
 	final public function getOperationsInternal( array $ops ) {
 		$supportedOps = array(
-			'store'    => 'StoreFileOp',
-			'copy'     => 'CopyFileOp',
-			'move'     => 'MoveFileOp',
-			'delete'   => 'DeleteFileOp',
-			'create'   => 'CreateFileOp',
+			'store' => 'StoreFileOp',
+			'copy' => 'CopyFileOp',
+			'move' => 'MoveFileOp',
+			'delete' => 'DeleteFileOp',
+			'create' => 'CreateFileOp',
 			'describe' => 'DescribeFileOp',
-			'null'     => 'NullFileOp'
+			'null' => 'NullFileOp'
 		);
 
 		$performOps = array(); // array of FileOp objects
@@ -1084,12 +953,13 @@ abstract class FileBackendStore extends FileBackend {
 
 	/**
 	 * Get a list of storage paths to lock for a list of operations
-	 * Returns an array with 'sh' (shared) and 'ex' (exclusive) keys,
-	 * each corresponding to a list of storage paths to be locked.
-	 * All returned paths are normalized.
+	 * Returns an array with LockManager::LOCK_UW (shared locks) and
+	 * LockManager::LOCK_EX (exclusive locks) keys, each corresponding
+	 * to a list of storage paths to be locked. All returned paths are
+	 * normalized.
 	 *
 	 * @param array $performOps List of FileOp objects
-	 * @return Array ('sh' => list of paths, 'ex' => list of paths)
+	 * @return Array (LockManager::LOCK_UW => path list, LockManager::LOCK_EX => path list)
 	 */
 	final public function getPathsToLockForOpsInternal( array $performOps ) {
 		// Build up a list of files to lock...
@@ -1103,28 +973,19 @@ abstract class FileBackendStore extends FileBackend {
 		// Get a shared lock on the parent directory of each path changed
 		$paths['sh'] = array_merge( $paths['sh'], array_map( 'dirname', $paths['ex'] ) );
 
-		return $paths;
+		return array(
+			LockManager::LOCK_UW => $paths['sh'],
+			LockManager::LOCK_EX => $paths['ex']
+		);
 	}
 
-	/**
-	 * @see FileBackend::getScopedLocksForOps()
-	 * @return Array
-	 */
 	public function getScopedLocksForOps( array $ops, Status $status ) {
 		$paths = $this->getPathsToLockForOpsInternal( $this->getOperationsInternal( $ops ) );
-		return array(
-			$this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ),
-			$this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status )
-		);
+		return array( $this->getScopedFileLocks( $paths, 'mixed', $status ) );
 	}
 
-	/**
-	 * @see FileBackend::doOperationsInternal()
-	 * @return Status
-	 */
 	final protected function doOperationsInternal( array $ops, array $opts ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$status = Status::newGood();
 
 		// Fix up custom header name/value pairs...
@@ -1138,11 +999,8 @@ abstract class FileBackendStore extends FileBackend {
 			// Build up a list of files to lock...
 			$paths = $this->getPathsToLockForOpsInternal( $performOps );
 			// Try to lock those files for the scope of this function...
-			$scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
-			$scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
+			$scopeLock = $this->getScopedFileLocks( $paths, 'mixed', $status );
 			if ( !$status->isOK() ) {
-				wfProfileOut( __METHOD__ . '-' . $this->name );
-				wfProfileOut( __METHOD__ );
 				return $status; // abort
 			}
 		}
@@ -1164,19 +1022,11 @@ abstract class FileBackendStore extends FileBackend {
 		$status->merge( $subStatus );
 		$status->success = $subStatus->success; // not done in merge()
 
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $status;
 	}
 
-	/**
-	 * @see FileBackend::doQuickOperationsInternal()
-	 * @return Status
-	 * @throws MWException
-	 */
 	final protected function doQuickOperationsInternal( array $ops ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		$status = Status::newGood();
 
 		// Fix up custom header name/value pairs...
@@ -1186,7 +1036,7 @@ abstract class FileBackendStore extends FileBackend {
 		$this->clearCache();
 
 		$supportedOps = array( 'create', 'store', 'copy', 'move', 'delete', 'null' );
-		$async = ( $this->parallelize === 'implicit' );
+		$async = ( $this->parallelize === 'implicit' && count( $ops ) > 1 );
 		$maxConcurrency = $this->concurrency; // throttle
 
 		$statuses = array(); // array of (index => Status)
@@ -1195,8 +1045,6 @@ abstract class FileBackendStore extends FileBackend {
 		// Perform the sync-only ops and build up op handles for the async ops...
 		foreach ( $ops as $index => $params ) {
 			if ( !in_array( $params['op'], $supportedOps ) ) {
-				wfProfileOut( __METHOD__ . '-' . $this->name );
-				wfProfileOut( __METHOD__ );
 				throw new MWException( "Operation '{$params['op']}' is not supported." );
 			}
 			$method = $params['op'] . 'Internal'; // e.g. "storeInternal"
@@ -1230,8 +1078,6 @@ abstract class FileBackendStore extends FileBackend {
 			}
 		}
 
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $status;
 	}
 
@@ -1245,8 +1091,7 @@ abstract class FileBackendStore extends FileBackend {
 	 * @throws MWException
 	 */
 	final public function executeOpHandlesInternal( array $fileOpHandles ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 		foreach ( $fileOpHandles as $fileOpHandle ) {
 			if ( !( $fileOpHandle instanceof FileBackendStoreOpHandle ) ) {
 				throw new MWException( "Given a non-FileBackendStoreOpHandle object." );
@@ -1258,8 +1103,6 @@ abstract class FileBackendStore extends FileBackend {
 		foreach ( $fileOpHandles as $fileOpHandle ) {
 			$fileOpHandle->closeResources();
 		}
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 		return $res;
 	}
 
@@ -1277,15 +1120,20 @@ abstract class FileBackendStore extends FileBackend {
 	}
 
 	/**
-	 * Strip long HTTP headers from a file operation
+	 * Strip long HTTP headers from a file operation.
+	 * Most headers are just numbers, but some are allowed to be long.
+	 * This function is useful for cleaning up headers and avoiding backend
+	 * specific errors, especially in the middle of batch file operations.
 	 *
 	 * @param array $op Same format as doOperation()
 	 * @return Array
 	 */
 	protected function stripInvalidHeadersFromOp( array $op ) {
-		if ( isset( $op['headers'] ) ) {
+		static $longs = array( 'Content-Disposition' );
+		if ( isset( $op['headers'] ) ) { // op sets HTTP headers
 			foreach ( $op['headers'] as $name => $value ) {
-				if ( strlen( $name ) > 255 || strlen( $value ) > 255 ) {
+				$maxHVLen = in_array( $name, $longs ) ? INF : 255;
+				if ( strlen( $name ) > 255 || strlen( $value ) > $maxHVLen ) {
 					trigger_error( "Header '$name: $value' is too long." );
 					unset( $op['headers'][$name] );
 				} elseif ( !strlen( $value ) ) {
@@ -1296,9 +1144,6 @@ abstract class FileBackendStore extends FileBackend {
 		return $op;
 	}
 
-	/**
-	 * @see FileBackend::preloadCache()
-	 */
 	final public function preloadCache( array $paths ) {
 		$fullConts = array(); // full container names
 		foreach ( $paths as $path ) {
@@ -1310,9 +1155,6 @@ abstract class FileBackendStore extends FileBackend {
 		$this->primeFileCache( $paths );
 	}
 
-	/**
-	 * @see FileBackend::clearCache()
-	 */
 	final public function clearCache( array $paths = null ) {
 		if ( is_array( $paths ) ) {
 			$paths = array_map( 'FileBackend::normalizeStoragePath', $paths );
@@ -1353,7 +1195,7 @@ abstract class FileBackendStore extends FileBackend {
 	 * Check if a container name is valid.
 	 * This checks for for length and illegal characters.
 	 *
-	 * @param $container string
+	 * @param string $container
 	 * @return bool
 	 */
 	final protected static function isValidContainerName( $container ) {
@@ -1375,7 +1217,7 @@ abstract class FileBackendStore extends FileBackend {
 	 * this means that the path can only refer to a directory and can only
 	 * be scanned by looking in all the container shards.
 	 *
-	 * @param $storagePath string
+	 * @param string $storagePath
 	 * @return Array (container, path, container suffix) or (null, null, null) if invalid
 	 */
 	final protected function resolveStoragePath( $storagePath ) {
@@ -1405,16 +1247,22 @@ abstract class FileBackendStore extends FileBackend {
 
 	/**
 	 * Like resolveStoragePath() except null values are returned if
-	 * the container is sharded and the shard could not be determined.
+	 * the container is sharded and the shard could not be determined
+	 * or if the path ends with '/'. The later case is illegal for FS
+	 * backends and can confuse listings for object store backends.
+	 *
+	 * This function is used when resolving paths that must be valid
+	 * locations for files. Directory and listing functions should
+	 * generally just use resolveStoragePath() instead.
 	 *
 	 * @see FileBackendStore::resolveStoragePath()
 	 *
-	 * @param $storagePath string
+	 * @param string $storagePath
 	 * @return Array (container, path) or (null, null) if invalid
 	 */
 	final protected function resolveStoragePathReal( $storagePath ) {
 		list( $container, $relPath, $cShard ) = $this->resolveStoragePath( $storagePath );
-		if ( $cShard !== null ) {
+		if ( $cShard !== null && substr( $relPath, -1 ) !== '/' ) {
 			return array( $container, $relPath );
 		}
 		return array( null, null );
@@ -1474,7 +1322,7 @@ abstract class FileBackendStore extends FileBackend {
 	 * If greater than 0, then all file storage paths within
 	 * the container are required to be hashed accordingly.
 	 *
-	 * @param $container string
+	 * @param string $container
 	 * @return Array (integer levels, integer base, repeat flag) or (0, 0, false)
 	 */
 	final protected function getContainerHashLevels( $container ) {
@@ -1494,7 +1342,7 @@ abstract class FileBackendStore extends FileBackend {
 	/**
 	 * Get a list of full container shard suffixes for a container
 	 *
-	 * @param $container string
+	 * @param string $container
 	 * @return Array
 	 */
 	final protected function getContainerSuffixes( $container ) {
@@ -1512,7 +1360,7 @@ abstract class FileBackendStore extends FileBackend {
 	/**
 	 * Get the full container name, including the wiki ID prefix
 	 *
-	 * @param $container string
+	 * @param string $container
 	 * @return string
 	 */
 	final protected function fullContainerName( $container ) {
@@ -1528,7 +1376,7 @@ abstract class FileBackendStore extends FileBackend {
 	 * This is intended for internal use, such as encoding illegal chars.
 	 * Subclasses can override this to be more restrictive.
 	 *
-	 * @param $container string
+	 * @param string $container
 	 * @return string|null
 	 */
 	protected function resolveContainerName( $container ) {
@@ -1563,10 +1411,11 @@ abstract class FileBackendStore extends FileBackend {
 	 * Set the cached info for a container
 	 *
 	 * @param string $container Resolved container name
-	 * @param $val mixed Information to cache
+	 * @param array $val Information to cache
+	 * @return void
 	 */
-	final protected function setContainerCache( $container, $val ) {
-		$this->memCache->add( $this->containerCacheKey( $container ), $val, 14*86400 );
+	final protected function setContainerCache( $container, array $val ) {
+		$this->memCache->add( $this->containerCacheKey( $container ), $val, 14 * 86400 );
 	}
 
 	/**
@@ -1574,6 +1423,7 @@ abstract class FileBackendStore extends FileBackend {
 	 * The cache key is salted for a while to prevent race conditions.
 	 *
 	 * @param string $container Resolved container name
+	 * @return void
 	 */
 	final protected function deleteContainerCache( $container ) {
 		if ( !$this->memCache->set( $this->containerCacheKey( $container ), 'PURGED', 300 ) ) {
@@ -1586,12 +1436,11 @@ abstract class FileBackendStore extends FileBackend {
 	 * used in a list of container names, storage paths, or FileOp objects.
 	 * This loads the persistent cache values into the process cache.
 	 *
-	 * @param $items Array
+	 * @param Array $items
 	 * @return void
 	 */
 	final protected function primeContainerCache( array $items ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 
 		$paths = array(); // list of storage paths
 		$contNames = array(); // (cache key => resolved container name)
@@ -1623,9 +1472,6 @@ abstract class FileBackendStore extends FileBackend {
 
 		// Populate the container process cache for the backend...
 		$this->doPrimeContainerCache( array_filter( $contInfo, 'is_array' ) );
-
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 	}
 
 	/**
@@ -1654,14 +1500,17 @@ abstract class FileBackendStore extends FileBackend {
 	 * salting for the case when a file is created at a path were there was none before.
 	 *
 	 * @param string $path Storage path
-	 * @param $val mixed Information to cache
+	 * @param array $val Stat information to cache
+	 * @return void
 	 */
-	final protected function setFileCache( $path, $val ) {
+	final protected function setFileCache( $path, array $val ) {
 		$path = FileBackend::normalizeStoragePath( $path );
 		if ( $path === null ) {
 			return; // invalid storage path
 		}
-		$this->memCache->add( $this->fileCacheKey( $path ), $val, 7*86400 );
+		$age = time() - wfTimestamp( TS_UNIX, $val['mtime'] );
+		$ttl = min( 7 * 86400, max( 300, floor( .1 * $age ) ) );
+		$this->memCache->add( $this->fileCacheKey( $path ), $val, $ttl );
 	}
 
 	/**
@@ -1671,6 +1520,7 @@ abstract class FileBackendStore extends FileBackend {
 	 * a file is created at a path were there was none before.
 	 *
 	 * @param string $path Storage path
+	 * @return void
 	 */
 	final protected function deleteFileCache( $path ) {
 		$path = FileBackend::normalizeStoragePath( $path );
@@ -1691,8 +1541,7 @@ abstract class FileBackendStore extends FileBackend {
 	 * @return void
 	 */
 	final protected function primeFileCache( array $items ) {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-' . $this->name );
+		$section = new ProfileSection( __METHOD__ . "-{$this->name}" );
 
 		$paths = array(); // list of storage paths
 		$pathNames = array(); // (cache key => storage path)
@@ -1726,9 +1575,6 @@ abstract class FileBackendStore extends FileBackend {
 				}
 			}
 		}
-
-		wfProfileOut( __METHOD__ . '-' . $this->name );
-		wfProfileOut( __METHOD__ );
 	}
 
 	/**
@@ -1750,6 +1596,18 @@ abstract class FileBackendStore extends FileBackend {
 		}
 		return $opts;
 	}
+
+	/**
+	 * Get the content type to use in HEAD/GET requests for a file
+	 *
+	 * @param string $storagePath
+	 * @param string|null $content File data
+	 * @param string|null $fsPath File system path
+	 * @return MIME type
+	 */
+	protected function getContentType( $storagePath, $content, $fsPath ) {
+		return call_user_func_array( $this->mimeCallback, func_get_args() );
+	}
 }
 
 /**
@@ -1786,26 +1644,20 @@ abstract class FileBackendStoreOpHandle {
  *
  * @ingroup FileBackend
  */
-abstract class FileBackendStoreShardListIterator implements Iterator {
+abstract class FileBackendStoreShardListIterator extends FilterIterator {
 	/** @var FileBackendStore */
 	protected $backend;
 	/** @var Array */
 	protected $params;
-	/** @var Array */
-	protected $shardSuffixes;
+
 	protected $container; // string; full container name
 	protected $directory; // string; resolved relative path
 
-	/** @var Traversable */
-	protected $iter;
-	protected $curShard = 0; // integer
-	protected $pos = 0; // integer
-
 	/** @var Array */
 	protected $multiShardPaths = array(); // (rel path => 1)
 
 	/**
-	 * @param $backend FileBackendStore
+	 * @param FileBackendStore $backend
 	 * @param string $container Full storage container name
 	 * @param string $dir Storage directory relative to container
 	 * @param array $suffixes List of container shard suffixes
@@ -1817,142 +1669,56 @@ abstract class FileBackendStoreShardListIterator implements Iterator {
 		$this->backend = $backend;
 		$this->container = $container;
 		$this->directory = $dir;
-		$this->shardSuffixes = $suffixes;
 		$this->params = $params;
-	}
-
-	/**
-	 * @see Iterator::key()
-	 * @return integer
-	 */
-	public function key() {
-		return $this->pos;
-	}
 
-	/**
-	 * @see Iterator::valid()
-	 * @return bool
-	 */
-	public function valid() {
-		if ( $this->iter instanceof Iterator ) {
-			return $this->iter->valid();
-		} elseif ( is_array( $this->iter ) ) {
-			return ( current( $this->iter ) !== false ); // no paths can have this value
+		$iter = new AppendIterator();
+		foreach ( $suffixes as $suffix ) {
+			$iter->append( $this->listFromShard( $this->container . $suffix ) );
 		}
-		return false; // some failure?
-	}
-
-	/**
-	 * @see Iterator::current()
-	 * @return string|bool String or false
-	 */
-	public function current() {
-		return ( $this->iter instanceof Iterator )
-			? $this->iter->current()
-			: current( $this->iter );
-	}
 
-	/**
-	 * @see Iterator::next()
-	 * @return void
-	 */
-	public function next() {
-		++$this->pos;
-		( $this->iter instanceof Iterator ) ? $this->iter->next() : next( $this->iter );
-		do {
-			$continue = false; // keep scanning shards?
-			$this->filterViaNext(); // filter out duplicates
-			// Find the next non-empty shard if no elements are left
-			if ( !$this->valid() ) {
-				$this->nextShardIteratorIfNotValid();
-				$continue = $this->valid(); // re-filter unless we ran out of shards
-			}
-		} while ( $continue );
-	}
-
-	/**
-	 * @see Iterator::rewind()
-	 * @return void
-	 */
-	public function rewind() {
-		$this->pos = 0;
-		$this->curShard = 0;
-		$this->setIteratorFromCurrentShard();
-		do {
-			$continue = false; // keep scanning shards?
-			$this->filterViaNext(); // filter out duplicates
-			// Find the next non-empty shard if no elements are left
-			if ( !$this->valid() ) {
-				$this->nextShardIteratorIfNotValid();
-				$continue = $this->valid(); // re-filter unless we ran out of shards
-			}
-		} while ( $continue );
-	}
-
-	/**
-	 * Filter out duplicate items by advancing to the next ones
-	 */
-	protected function filterViaNext() {
-		while ( $this->valid() ) {
-			$rel = $this->iter->current(); // path relative to given directory
-			$path = $this->params['dir'] . "/{$rel}"; // full storage path
-			if ( $this->backend->isSingleShardPathInternal( $path ) ) {
-				break; // path is only on one shard; no issue with duplicates
-			} elseif ( isset( $this->multiShardPaths[$rel] ) ) {
-				// Don't keep listing paths that are on multiple shards
-				( $this->iter instanceof Iterator ) ? $this->iter->next() : next( $this->iter );
-			} else {
-				$this->multiShardPaths[$rel] = 1;
-				break;
-			}
-		}
+		parent::__construct( $iter );
 	}
 
-	/**
-	 * If the list iterator for this container shard is out of items,
-	 * then move on to the next container that has items.
-	 * If there are none, then it advances to the last container.
-	 */
-	protected function nextShardIteratorIfNotValid() {
-		while ( !$this->valid() && ++$this->curShard < count( $this->shardSuffixes ) ) {
-			$this->setIteratorFromCurrentShard();
+	public function accept() {
+		$rel = $this->getInnerIterator()->current(); // path relative to given directory
+		$path = $this->params['dir'] . "/{$rel}"; // full storage path
+		if ( $this->backend->isSingleShardPathInternal( $path ) ) {
+			return true; // path is only on one shard; no issue with duplicates
+		} elseif ( isset( $this->multiShardPaths[$rel] ) ) {
+			// Don't keep listing paths that are on multiple shards
+			return false;
+		} else {
+			$this->multiShardPaths[$rel] = 1;
+			return true;
 		}
 	}
 
-	/**
-	 * Set the list iterator to that of the current container shard
-	 */
-	protected function setIteratorFromCurrentShard() {
-		$this->iter = $this->listFromShard(
-			$this->container . $this->shardSuffixes[$this->curShard],
-			$this->directory, $this->params );
-		// Start loading results so that current() works
-		if ( $this->iter ) {
-			( $this->iter instanceof Iterator ) ? $this->iter->rewind() : reset( $this->iter );
-		}
+	public function rewind() {
+		parent::rewind();
+		$this->multiShardPaths = array();
 	}
 
 	/**
 	 * Get the list for a given container shard
 	 *
 	 * @param string $container Resolved container name
-	 * @param string $dir Resolved path relative to container
-	 * @param array $params
-	 * @return Traversable|Array|null
+	 * @return Iterator
 	 */
-	abstract protected function listFromShard( $container, $dir, array $params );
+	abstract protected function listFromShard( $container );
 }
 
 /**
  * Iterator for listing directories
  */
 class FileBackendStoreShardDirIterator extends FileBackendStoreShardListIterator {
-	/**
-	 * @see FileBackendStoreShardListIterator::listFromShard()
-	 * @return Array|null|Traversable
-	 */
-	protected function listFromShard( $container, $dir, array $params ) {
-		return $this->backend->getDirectoryListInternal( $container, $dir, $params );
+	protected function listFromShard( $container ) {
+		$list = $this->backend->getDirectoryListInternal(
+			$container, $this->directory, $this->params );
+		if ( $list === null ) {
+			return new ArrayIterator( array() );
+		} else {
+			return is_array( $list ) ? new ArrayIterator( $list ) : $list;
+		}
 	}
 }
 
@@ -1960,11 +1726,13 @@ class FileBackendStoreShardDirIterator extends FileBackendStoreShardListIterator
  * Iterator for listing regular files
  */
 class FileBackendStoreShardFileIterator extends FileBackendStoreShardListIterator {
-	/**
-	 * @see FileBackendStoreShardListIterator::listFromShard()
-	 * @return Array|null|Traversable
-	 */
-	protected function listFromShard( $container, $dir, array $params ) {
-		return $this->backend->getFileListInternal( $container, $dir, $params );
+	protected function listFromShard( $container ) {
+		$list = $this->backend->getFileListInternal(
+			$container, $this->directory, $this->params );
+		if ( $list === null ) {
+			return new ArrayIterator( array() );
+		} else {
+			return is_array( $list ) ? new ArrayIterator( $list ) : $list;
+		}
 	}
 }
diff --git a/includes/filebackend/FileOp.php b/includes/filebackend/FileOp.php
index bb0ab578..fe833084 100644
--- a/includes/filebackend/FileOp.php
+++ b/includes/filebackend/FileOp.php
@@ -46,7 +46,7 @@ abstract class FileOp {
 
 	protected $doOperation = true; // boolean; operation is not a no-op
 	protected $sourceSha1; // string
-	protected $destSameAsSource; // boolean
+	protected $overwriteSameCase; // boolean
 	protected $destExists; // boolean
 
 	/* Object life-cycle */
@@ -55,17 +55,19 @@ abstract class FileOp {
 	const STATE_ATTEMPTED = 3;
 
 	/**
-	 * Build a new file operation transaction
+	 * Build a new batch file operation transaction
 	 *
-	 * @param $backend FileBackendStore
-	 * @param $params Array
+	 * @param FileBackendStore $backend
+	 * @param Array $params
 	 * @throws MWException
 	 */
 	final public function __construct( FileBackendStore $backend, array $params ) {
 		$this->backend = $backend;
 		list( $required, $optional ) = $this->allowedParams();
+		// @todo normalizeAnyStoragePaths() calls are overzealous, use a parameter list
 		foreach ( $required as $name ) {
 			if ( isset( $params[$name] ) ) {
+				// Normalize paths so the paths to the same file have the same string
 				$this->params[$name] = self::normalizeAnyStoragePaths( $params[$name] );
 			} else {
 				throw new MWException( "File operation missing parameter '$name'." );
@@ -73,6 +75,7 @@ abstract class FileOp {
 		}
 		foreach ( $optional as $name ) {
 			if ( isset( $params[$name] ) ) {
+				// Normalize paths so the paths to the same file have the same string
 				$this->params[$name] = self::normalizeAnyStoragePaths( $params[$name] );
 			}
 		}
@@ -82,7 +85,7 @@ abstract class FileOp {
 	/**
 	 * Normalize $item or anything in $item that is a valid storage path
 	 *
-	 * @param $item string|array
+	 * @param string $item|array
 	 * @return string|Array
 	 */
 	protected function normalizeAnyStoragePaths( $item ) {
@@ -102,7 +105,7 @@ abstract class FileOp {
 	/**
 	 * Normalize a string if it is a valid storage path
 	 *
-	 * @param $path string
+	 * @param string $path
 	 * @return string
 	 */
 	protected static function normalizeIfValidStoragePath( $path ) {
@@ -116,7 +119,7 @@ abstract class FileOp {
 	/**
 	 * Set the batch UUID this operation belongs to
 	 *
-	 * @param $batchId string
+	 * @param string $batchId
 	 * @return void
 	 */
 	final public function setBatchId( $batchId ) {
@@ -126,7 +129,7 @@ abstract class FileOp {
 	/**
 	 * Get the value of the parameter with the given name
 	 *
-	 * @param $name string
+	 * @param string $name
 	 * @return mixed Returns null if the parameter is not set
 	 */
 	final public function getParam( $name ) {
@@ -209,22 +212,22 @@ abstract class FileOp {
 		$pathsUsed = array_merge( $this->storagePathsRead(), $this->storagePathsChanged() );
 		foreach ( array_unique( $pathsUsed ) as $path ) {
 			$nullEntries[] = array( // assertion for recovery
-				'op'      => 'null',
-				'path'    => $path,
+				'op' => 'null',
+				'path' => $path,
 				'newSha1' => $this->fileSha1( $path, $oPredicates )
 			);
 		}
 		foreach ( $this->storagePathsChanged() as $path ) {
 			if ( $nPredicates['sha1'][$path] === false ) { // deleted
 				$deleteEntries[] = array(
-					'op'      => 'delete',
-					'path'    => $path,
+					'op' => 'delete',
+					'path' => $path,
 					'newSha1' => ''
 				);
 			} else { // created/updated
 				$updateEntries[] = array(
-					'op'      => $this->fileExists( $path, $oPredicates ) ? 'update' : 'create',
-					'path'    => $path,
+					'op' => $this->fileExists( $path, $oPredicates ) ? 'update' : 'create',
+					'path' => $path,
 					'newSha1' => $nPredicates['sha1'][$path]
 				);
 			}
@@ -237,7 +240,7 @@ abstract class FileOp {
 	 * This must update $predicates for each path that the op can change
 	 * except when a failing status object is returned.
 	 *
-	 * @param $predicates Array
+	 * @param Array $predicates
 	 * @return Status
 	 */
 	final public function precheck( array &$predicates ) {
@@ -314,7 +317,7 @@ abstract class FileOp {
 	/**
 	 * Adjust params to FileBackendStore internal file calls
 	 *
-	 * @param $params Array
+	 * @param Array $params
 	 * @return Array (required params list, optional params list)
 	 */
 	protected function setFlags( array $params ) {
@@ -341,10 +344,10 @@ abstract class FileOp {
 
 	/**
 	 * Check for errors with regards to the destination file already existing.
-	 * Also set the destExists, destSameAsSource and sourceSha1 member variables.
+	 * Also set the destExists, overwriteSameCase and sourceSha1 member variables.
 	 * A bad status will be returned if there is no chance it can be overwritten.
 	 *
-	 * @param $predicates Array
+	 * @param Array $predicates
 	 * @return Status
 	 */
 	protected function precheckDestExistence( array $predicates ) {
@@ -354,7 +357,7 @@ abstract class FileOp {
 		if ( $this->sourceSha1 === null ) { // file in storage?
 			$this->sourceSha1 = $this->fileSha1( $this->params['src'], $predicates );
 		}
-		$this->destSameAsSource = false;
+		$this->overwriteSameCase = false;
 		$this->destExists = $this->fileExists( $this->params['dst'], $predicates );
 		if ( $this->destExists ) {
 			if ( $this->getParam( 'overwrite' ) ) {
@@ -368,7 +371,7 @@ abstract class FileOp {
 					// Give an error if the files are not identical
 					$status->fatal( 'backend-fail-notsame', $this->params['dst'] );
 				} else {
-					$this->destSameAsSource = true; // OK
+					$this->overwriteSameCase = true; // OK
 				}
 				return $status; // do nothing; either OK or bad status
 			} else {
@@ -381,7 +384,7 @@ abstract class FileOp {
 
 	/**
 	 * precheckDestExistence() helper function to get the source file SHA-1.
-	 * Subclasses should overwride this iff the source is not in storage.
+	 * Subclasses should overwride this if the source is not in storage.
 	 *
 	 * @return string|bool Returns false on failure
 	 */
@@ -393,7 +396,7 @@ abstract class FileOp {
 	 * Check if a file will exist in storage when this operation is attempted
 	 *
 	 * @param string $source Storage path
-	 * @param $predicates Array
+	 * @param Array $predicates
 	 * @return bool
 	 */
 	final protected function fileExists( $source, array $predicates ) {
@@ -409,7 +412,7 @@ abstract class FileOp {
 	 * Get the SHA-1 of a file in storage when this operation is attempted
 	 *
 	 * @param string $source Storage path
-	 * @param $predicates Array
+	 * @param Array $predicates
 	 * @return string|bool False on failure
 	 */
 	final protected function fileSha1( $source, array $predicates ) {
@@ -435,7 +438,7 @@ abstract class FileOp {
 	/**
 	 * Log a file operation failure and preserve any temp files
 	 *
-	 * @param $action string
+	 * @param string $action
 	 * @return void
 	 */
 	final public function logFailure( $action ) {
@@ -457,7 +460,7 @@ abstract class FileOp {
 class CreateFileOp extends FileOp {
 	protected function allowedParams() {
 		return array( array( 'content', 'dst' ),
-			array( 'overwrite', 'overwriteSame', 'disposition', 'headers' ) );
+			array( 'overwrite', 'overwriteSame', 'headers' ) );
 	}
 
 	protected function doPrecheck( array &$predicates ) {
@@ -485,27 +488,18 @@ class CreateFileOp extends FileOp {
 		return $status; // safe to call attempt()
 	}
 
-	/**
-	 * @return Status
-	 */
 	protected function doAttempt() {
-		if ( !$this->destSameAsSource ) {
+		if ( !$this->overwriteSameCase ) {
 			// Create the file at the destination
 			return $this->backend->createInternal( $this->setFlags( $this->params ) );
 		}
 		return Status::newGood();
 	}
 
-	/**
-	 * @return bool|String
-	 */
 	protected function getSourceSha1Base36() {
 		return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
 	}
 
-	/**
-	 * @return array
-	 */
 	public function storagePathsChanged() {
 		return array( $this->params['dst'] );
 	}
@@ -516,18 +510,11 @@ class CreateFileOp extends FileOp {
  * Parameters for this operation are outlined in FileBackend::doOperations().
  */
 class StoreFileOp extends FileOp {
-	/**
-	 * @return array
-	 */
 	protected function allowedParams() {
 		return array( array( 'src', 'dst' ),
-			array( 'overwrite', 'overwriteSame', 'disposition', 'headers' ) );
+			array( 'overwrite', 'overwriteSame', 'headers' ) );
 	}
 
-	/**
-	 * @param $predicates array
-	 * @return Status
-	 */
 	protected function doPrecheck( array &$predicates ) {
 		$status = Status::newGood();
 		// Check if the source file exists on the file system
@@ -557,20 +544,14 @@ class StoreFileOp extends FileOp {
 		return $status; // safe to call attempt()
 	}
 
-	/**
-	 * @return Status
-	 */
 	protected function doAttempt() {
-		// Store the file at the destination
-		if ( !$this->destSameAsSource ) {
+		if ( !$this->overwriteSameCase ) {
+			// Store the file at the destination
 			return $this->backend->storeInternal( $this->setFlags( $this->params ) );
 		}
 		return Status::newGood();
 	}
 
-	/**
-	 * @return bool|string
-	 */
 	protected function getSourceSha1Base36() {
 		wfSuppressWarnings();
 		$hash = sha1_file( $this->params['src'] );
@@ -591,18 +572,11 @@ class StoreFileOp extends FileOp {
  * Parameters for this operation are outlined in FileBackend::doOperations().
  */
 class CopyFileOp extends FileOp {
-	/**
-	 * @return array
-	 */
 	protected function allowedParams() {
 		return array( array( 'src', 'dst' ),
-			array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'disposition' ) );
+			array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'headers' ) );
 	}
 
-	/**
-	 * @param $predicates array
-	 * @return Status
-	 */
 	protected function doPrecheck( array &$predicates ) {
 		$status = Status::newGood();
 		// Check if the source file exists
@@ -634,30 +608,26 @@ class CopyFileOp extends FileOp {
 		return $status; // safe to call attempt()
 	}
 
-	/**
-	 * @return Status
-	 */
 	protected function doAttempt() {
-		// Do nothing if the src/dst paths are the same
-		if ( $this->params['src'] !== $this->params['dst'] ) {
-			// Copy the file into the destination
-			if ( !$this->destSameAsSource ) {
-				return $this->backend->copyInternal( $this->setFlags( $this->params ) );
-			}
+		if ( $this->overwriteSameCase ) {
+			$status = Status::newGood(); // nothing to do
+		} elseif ( $this->params['src'] === $this->params['dst'] ) {
+			// Just update the destination file headers
+			$headers = $this->getParam( 'headers' ) ?: array();
+			$status = $this->backend->describeInternal( $this->setFlags( array(
+				'src' => $this->params['dst'], 'headers' => $headers
+			) ) );
+		} else {
+			// Copy the file to the destination
+			$status = $this->backend->copyInternal( $this->setFlags( $this->params ) );
 		}
-		return Status::newGood();
+		return $status;
 	}
 
-	/**
-	 * @return array
-	 */
 	public function storagePathsRead() {
 		return array( $this->params['src'] );
 	}
 
-	/**
-	 * @return array
-	 */
 	public function storagePathsChanged() {
 		return array( $this->params['dst'] );
 	}
@@ -668,18 +638,11 @@ class CopyFileOp extends FileOp {
  * Parameters for this operation are outlined in FileBackend::doOperations().
  */
 class MoveFileOp extends FileOp {
-	/**
-	 * @return array
-	 */
 	protected function allowedParams() {
 		return array( array( 'src', 'dst' ),
-			array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'disposition' ) );
+			array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'headers' ) );
 	}
 
-	/**
-	 * @param $predicates array
-	 * @return Status
-	 */
 	protected function doPrecheck( array &$predicates ) {
 		$status = Status::newGood();
 		// Check if the source file exists
@@ -713,34 +676,34 @@ class MoveFileOp extends FileOp {
 		return $status; // safe to call attempt()
 	}
 
-	/**
-	 * @return Status
-	 */
 	protected function doAttempt() {
-		// Do nothing if the src/dst paths are the same
-		if ( $this->params['src'] !== $this->params['dst'] ) {
-			if ( !$this->destSameAsSource ) {
-				// Move the file into the destination
-				return $this->backend->moveInternal( $this->setFlags( $this->params ) );
+		if ( $this->overwriteSameCase ) {
+			if ( $this->params['src'] === $this->params['dst'] ) {
+				// Do nothing to the destination (which is also the source)
+				$status = Status::newGood();
 			} else {
-				// Just delete source as the destination needs no changes
-				$params = array( 'src' => $this->params['src'] );
-				return $this->backend->deleteInternal( $this->setFlags( $params ) );
+				// Just delete the source as the destination file needs no changes
+				$status = $this->backend->deleteInternal( $this->setFlags(
+					array( 'src' => $this->params['src'] )
+				) );
 			}
+		} elseif ( $this->params['src'] === $this->params['dst'] ) {
+			// Just update the destination file headers
+			$headers = $this->getParam( 'headers' ) ?: array();
+			$status = $this->backend->describeInternal( $this->setFlags(
+				array( 'src' => $this->params['dst'], 'headers' => $headers )
+			) );
+		} else {
+			// Move the file to the destination
+			$status = $this->backend->moveInternal( $this->setFlags( $this->params ) );
 		}
-		return Status::newGood();
+		return $status;
 	}
 
-	/**
-	 * @return array
-	 */
 	public function storagePathsRead() {
 		return array( $this->params['src'] );
 	}
 
-	/**
-	 * @return array
-	 */
 	public function storagePathsChanged() {
 		return array( $this->params['src'], $this->params['dst'] );
 	}
@@ -751,17 +714,10 @@ class MoveFileOp extends FileOp {
  * Parameters for this operation are outlined in FileBackend::doOperations().
  */
 class DeleteFileOp extends FileOp {
-	/**
-	 * @return array
-	 */
 	protected function allowedParams() {
 		return array( array( 'src' ), array( 'ignoreMissingSource' ) );
 	}
 
-	/**
-	 * @param $predicates array
-	 * @return Status
-	 */
 	protected function doPrecheck( array &$predicates ) {
 		$status = Status::newGood();
 		// Check if the source file exists
@@ -788,17 +744,11 @@ class DeleteFileOp extends FileOp {
 		return $status; // safe to call attempt()
 	}
 
-	/**
-	 * @return Status
-	 */
 	protected function doAttempt() {
 		// Delete the source file
 		return $this->backend->deleteInternal( $this->setFlags( $this->params ) );
 	}
 
-	/**
-	 * @return array
-	 */
 	public function storagePathsChanged() {
 		return array( $this->params['src'] );
 	}
@@ -809,17 +759,10 @@ class DeleteFileOp extends FileOp {
  * Parameters for this operation are outlined in FileBackend::doOperations().
  */
 class DescribeFileOp extends FileOp {
-	/**
-	 * @return array
-	 */
 	protected function allowedParams() {
-		return array( array( 'src' ), array( 'disposition', 'headers' ) );
+		return array( array( 'src' ), array( 'headers' ) );
 	}
 
-	/**
-	 * @param $predicates array
-	 * @return Status
-	 */
 	protected function doPrecheck( array &$predicates ) {
 		$status = Status::newGood();
 		// Check if the source file exists
@@ -840,17 +783,11 @@ class DescribeFileOp extends FileOp {
 		return $status; // safe to call attempt()
 	}
 
-	/**
-	 * @return Status
-	 */
 	protected function doAttempt() {
 		// Update the source file's metadata
 		return $this->backend->describeInternal( $this->setFlags( $this->params ) );
 	}
 
-	/**
-	 * @return array
-	 */
 	public function storagePathsChanged() {
 		return array( $this->params['src'] );
 	}
diff --git a/includes/filebackend/FileOpBatch.php b/includes/filebackend/FileOpBatch.php
index fc51d78a..785c0bc9 100644
--- a/includes/filebackend/FileOpBatch.php
+++ b/includes/filebackend/FileOpBatch.php
@@ -51,7 +51,7 @@ class FileOpBatch {
 	 *
 	 * @param array $performOps List of FileOp operations
 	 * @param array $opts Batch operation options
-	 * @param $journal FileJournal Journal to log operations to
+	 * @param FileJournal $journal Journal to log operations to
 	 * @return Status
 	 */
 	public static function attempt( array $performOps, array $opts, FileJournal $journal ) {
@@ -145,8 +145,8 @@ class FileOpBatch {
 	 * within any given sub-batch do not depend on each other.
 	 * This will abort remaining ops on failure.
 	 *
-	 * @param $pPerformOps Array
-	 * @param $status Status
+	 * @param Array $pPerformOps
+	 * @param Status $status
 	 * @return bool Success
 	 */
 	protected static function runParallelBatches( array $pPerformOps, Status $status ) {
diff --git a/includes/filebackend/README b/includes/filebackend/README
index 6ab54810..569f3376 100644
--- a/includes/filebackend/README
+++ b/includes/filebackend/README
@@ -47,7 +47,7 @@ directories. See FileBackend.php for full documentation for each function.
 The following basic operations are supported for reading from a backend:
 
 On files:
-* state a file for basic information (timestamp, size)
+* stat a file for basic information (timestamp, size)
 * read a file into a string or  several files into a map of path names to strings
 * download a file or set of files to a temporary file (on a mounted file system)
 * get the SHA1 hash of a file
diff --git a/includes/filebackend/SwiftFileBackend.php b/includes/filebackend/SwiftFileBackend.php
index 0f3d97a3..db090a98 100644
--- a/includes/filebackend/SwiftFileBackend.php
+++ b/includes/filebackend/SwiftFileBackend.php
@@ -24,7 +24,7 @@
  */
 
 /**
- * @brief Class for an OpenStack Swift based file backend.
+ * @brief Class for an OpenStack Swift (or Ceph RGW) based file backend.
  *
  * This requires the SwiftCloudFiles MediaWiki extension, which includes
  * the php-cloudfiles library (https://github.com/rackspace/php-cloudfiles).
@@ -104,7 +104,7 @@ class SwiftFileBackend extends FileBackendStore {
 	 */
 	public function __construct( array $config ) {
 		parent::__construct( $config );
-		if ( !MWInit::classExists( 'CF_Constants' ) ) {
+		if ( !class_exists( 'CF_Constants' ) ) {
 			throw new MWException( 'SwiftCloudFiles extension not installed.' );
 		}
 		// Required settings
@@ -132,7 +132,7 @@ class SwiftFileBackend extends FileBackendStore {
 			: false;
 		$this->swiftCDNExpiry = isset( $config['swiftCDNExpiry'] )
 			? $config['swiftCDNExpiry']
-			: 12*3600; // 12 hours is safe (tokens last 24 hours per http://docs.openstack.org)
+			: 12 * 3600; // 12 hours is safe (tokens last 24 hours per http://docs.openstack.org)
 		$this->swiftCDNPurgable = isset( $config['swiftCDNPurgable'] )
 			? $config['swiftCDNPurgable']
 			: true;
@@ -172,10 +172,6 @@ class SwiftFileBackend extends FileBackendStore {
 		return $relStoragePath;
 	}
 
-	/**
-	 * @see FileBackendStore::isPathUsableInternal()
-	 * @return bool
-	 */
 	public function isPathUsableInternal( $storagePath ) {
 		list( $container, $rel ) = $this->resolveStoragePathReal( $storagePath );
 		if ( $rel === null ) {
@@ -193,6 +189,18 @@ class SwiftFileBackend extends FileBackendStore {
 		return false;
 	}
 
+	/**
+	 * @param array $headers
+	 * @return array
+	 */
+	protected function sanitizeHdrs( array $headers ) {
+		// By default, Swift has annoyingly low maximum header value limits
+		if ( isset( $headers['Content-Disposition'] ) ) {
+			$headers['Content-Disposition'] = $this->truncDisp( $headers['Content-Disposition'] );
+		}
+		return $headers;
+	}
+
 	/**
 	 * @param string $disposition Content-Disposition header value
 	 * @return string Truncated Content-Disposition header value to meet Swift limits
@@ -211,10 +219,6 @@ class SwiftFileBackend extends FileBackendStore {
 		return $res;
 	}
 
-	/**
-	 * @see FileBackendStore::doCreateInternal()
-	 * @return Status
-	 */
 	protected function doCreateInternal( array $params ) {
 		$status = Status::newGood();
 
@@ -248,17 +252,10 @@ class SwiftFileBackend extends FileBackendStore {
 			// The MD5 here will be checked within Swift against its own MD5.
 			$obj->set_etag( md5( $params['content'] ) );
 			// Use the same content type as StreamFile for security
-			$obj->content_type = StreamFile::contentTypeFromPath( $params['dst'] );
-			if ( !strlen( $obj->content_type ) ) { // special case
-				$obj->content_type = 'unknown/unknown';
-			}
-			// Set the Content-Disposition header if requested
-			if ( isset( $params['disposition'] ) ) {
-				$obj->headers['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
-			}
+			$obj->content_type = $this->getContentType( $params['dst'], $params['content'], null );
 			// Set any other custom headers if requested
 			if ( isset( $params['headers'] ) ) {
-				$obj->headers += $params['headers'];
+				$obj->headers += $this->sanitizeHdrs( $params['headers'] );
 			}
 			if ( !empty( $params['async'] ) ) { // deferred
 				$op = $obj->write_async( $params['content'] );
@@ -290,10 +287,6 @@ class SwiftFileBackend extends FileBackendStore {
 		}
 	}
 
-	/**
-	 * @see FileBackendStore::doStoreInternal()
-	 * @return Status
-	 */
 	protected function doStoreInternal( array $params ) {
 		$status = Status::newGood();
 
@@ -333,17 +326,10 @@ class SwiftFileBackend extends FileBackendStore {
 			// The MD5 here will be checked within Swift against its own MD5.
 			$obj->set_etag( md5_file( $params['src'] ) );
 			// Use the same content type as StreamFile for security
-			$obj->content_type = StreamFile::contentTypeFromPath( $params['dst'] );
-			if ( !strlen( $obj->content_type ) ) { // special case
-				$obj->content_type = 'unknown/unknown';
-			}
-			// Set the Content-Disposition header if requested
-			if ( isset( $params['disposition'] ) ) {
-				$obj->headers['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
-			}
+			$obj->content_type = $this->getContentType( $params['dst'], null, $params['src'] );
 			// Set any other custom headers if requested
 			if ( isset( $params['headers'] ) ) {
-				$obj->headers += $params['headers'];
+				$obj->headers += $this->sanitizeHdrs( $params['headers'] );
 			}
 			if ( !empty( $params['async'] ) ) { // deferred
 				wfSuppressWarnings();
@@ -387,10 +373,6 @@ class SwiftFileBackend extends FileBackendStore {
 		}
 	}
 
-	/**
-	 * @see FileBackendStore::doCopyInternal()
-	 * @return Status
-	 */
 	protected function doCopyInternal( array $params ) {
 		$status = Status::newGood();
 
@@ -424,8 +406,9 @@ class SwiftFileBackend extends FileBackendStore {
 		try {
 			$dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
 			$hdrs = array(); // source file headers to override with new values
-			if ( isset( $params['disposition'] ) ) {
-				$hdrs['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
+			// Set any other custom headers if requested
+			if ( isset( $params['headers'] ) ) {
+				$hdrs += $this->sanitizeHdrs( $params['headers'] );
 			}
 			if ( !empty( $params['async'] ) ) { // deferred
 				$op = $sContObj->copy_object_to_async( $srcRel, $dContObj, $dstRel, null, $hdrs );
@@ -459,10 +442,6 @@ class SwiftFileBackend extends FileBackendStore {
 		}
 	}
 
-	/**
-	 * @see FileBackendStore::doMoveInternal()
-	 * @return Status
-	 */
 	protected function doMoveInternal( array $params ) {
 		$status = Status::newGood();
 
@@ -497,8 +476,9 @@ class SwiftFileBackend extends FileBackendStore {
 			$srcObj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
 			$dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
 			$hdrs = array(); // source file headers to override with new values
-			if ( isset( $params['disposition'] ) ) {
-				$hdrs['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
+			// Set any other custom headers if requested
+			if ( isset( $params['headers'] ) ) {
+				$hdrs += $this->sanitizeHdrs( $params['headers'] );
 			}
 			if ( !empty( $params['async'] ) ) { // deferred
 				$op = $sContObj->move_object_to_async( $srcRel, $dContObj, $dstRel, null, $hdrs );
@@ -534,10 +514,6 @@ class SwiftFileBackend extends FileBackendStore {
 		}
 	}
 
-	/**
-	 * @see FileBackendStore::doDeleteInternal()
-	 * @return Status
-	 */
 	protected function doDeleteInternal( array $params ) {
 		$status = Status::newGood();
 
@@ -590,10 +566,6 @@ class SwiftFileBackend extends FileBackendStore {
 		}
 	}
 
-	/**
-	 * @see FileBackendStore::doDescribeInternal()
-	 * @return Status
-	 */
 	protected function doDescribeInternal( array $params ) {
 		$status = Status::newGood();
 
@@ -603,19 +575,15 @@ class SwiftFileBackend extends FileBackendStore {
 			return $status;
 		}
 
-		$hdrs = isset( $params['headers'] ) ? $params['headers'] : array();
-		// Set the Content-Disposition header if requested
-		if ( isset( $params['disposition'] ) ) {
-			$hdrs['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
-		}
-
 		try {
 			$sContObj = $this->getContainer( $srcCont );
 			// Get the latest version of the current metadata
 			$srcObj = $sContObj->get_object( $srcRel,
 				$this->headersFromParams( array( 'latest' => true ) ) );
 			// Merge in the metadata updates...
-			$srcObj->headers = $hdrs + $srcObj->headers;
+			if ( isset( $params['headers'] ) ) {
+				$srcObj->headers = $this->sanitizeHdrs( $params['headers'] ) + $srcObj->headers;
+			}
 			$srcObj->sync_metadata(); // save to Swift
 			$this->purgeCDNCache( array( $srcObj ) );
 		} catch ( CDNNotEnabledException $e ) {
@@ -631,10 +599,6 @@ class SwiftFileBackend extends FileBackendStore {
 		return $status;
 	}
 
-	/**
-	 * @see FileBackendStore::doPrepareInternal()
-	 * @return Status
-	 */
 	protected function doPrepareInternal( $fullCont, $dir, array $params ) {
 		$status = Status::newGood();
 
@@ -748,10 +712,6 @@ class SwiftFileBackend extends FileBackendStore {
 		return $status;
 	}
 
-	/**
-	 * @see FileBackendStore::doCleanInternal()
-	 * @return Status
-	 */
 	protected function doCleanInternal( $fullCont, $dir, array $params ) {
 		$status = Status::newGood();
 
@@ -787,10 +747,6 @@ class SwiftFileBackend extends FileBackendStore {
 		return $status;
 	}
 
-	/**
-	 * @see FileBackendStore::doFileExists()
-	 * @return array|bool|null
-	 */
 	protected function doGetFileStat( array $params ) {
 		list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
 		if ( $srcRel === null ) {
@@ -805,8 +761,8 @@ class SwiftFileBackend extends FileBackendStore {
 			$stat = array(
 				// Convert dates like "Tue, 03 Jan 2012 22:01:04 GMT" to TS_MW
 				'mtime' => wfTimestamp( TS_MW, $srcObj->last_modified ),
-				'size'  => (int)$srcObj->content_length,
-				'sha1'  => $srcObj->getMetadataValue( 'Sha1base36' )
+				'size' => (int)$srcObj->content_length,
+				'sha1' => $srcObj->getMetadataValue( 'Sha1base36' )
 			);
 		} catch ( NoSuchContainerException $e ) {
 		} catch ( NoSuchObjectException $e ) {
@@ -821,7 +777,7 @@ class SwiftFileBackend extends FileBackendStore {
 	/**
 	 * Fill in any missing object metadata and save it to Swift
 	 *
-	 * @param $obj CF_Object
+	 * @param CF_Object $obj
 	 * @param string $path Storage path to object
 	 * @return bool Success
 	 * @throws Exception cloudfiles exceptions
@@ -852,10 +808,6 @@ class SwiftFileBackend extends FileBackendStore {
 		return false; // failed
 	}
 
-	/**
-	 * @see FileBackendStore::doGetFileContentsMulti()
-	 * @return Array
-	 */
 	protected function doGetFileContentsMulti( array $params ) {
 		$contents = array();
 
@@ -965,24 +917,25 @@ class SwiftFileBackend extends FileBackendStore {
 	 * @param string $fullCont Resolved container name
 	 * @param string $dir Resolved storage directory with no trailing slash
 	 * @param string|null $after Storage path of file to list items after
-	 * @param $limit integer Max number of items to list
-	 * @param array $params Includes flag for 'topOnly'
-	 * @return Array List of relative paths of dirs directly under $dir
+	 * @param integer $limit Max number of items to list
+	 * @param array $params Parameters for getDirectoryList()
+	 * @return Array List of resolved paths of directories directly under $dir
+	 * @throws FileBackendError
 	 */
 	public function getDirListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
 		$dirs = array();
 		if ( $after === INF ) {
 			return $dirs; // nothing more
 		}
-		wfProfileIn( __METHOD__ . '-' . $this->name );
 
+		$section = new ProfileSection( __METHOD__ . '-' . $this->name );
 		try {
 			$container = $this->getContainer( $fullCont );
 			$prefix = ( $dir == '' ) ? null : "{$dir}/";
 			// Non-recursive: only list dirs right under $dir
 			if ( !empty( $params['topOnly'] ) ) {
 				$objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
-				foreach ( $objects as $object ) { // files and dirs
+				foreach ( $objects as $object ) { // files and directories
 					if ( substr( $object, -1 ) === '/' ) {
 						$dirs[] = $object; // directories end in '/'
 					}
@@ -1013,6 +966,7 @@ class SwiftFileBackend extends FileBackendStore {
 					}
 				}
 			}
+			// Page on the unfiltered directory listing (what is returned may be filtered)
 			if ( count( $objects ) < $limit ) {
 				$after = INF; // avoid a second RTT
 			} else {
@@ -1022,9 +976,9 @@ class SwiftFileBackend extends FileBackendStore {
 		} catch ( CloudFilesException $e ) { // some other exception?
 			$this->handleException( $e, null, __METHOD__,
 				array( 'cont' => $fullCont, 'dir' => $dir ) );
+			throw new FileBackendError( "Got " . get_class( $e ) . " exception." );
 		}
 
-		wfProfileOut( __METHOD__ . '-' . $this->name );
 		return $dirs;
 	}
 
@@ -1038,33 +992,49 @@ class SwiftFileBackend extends FileBackendStore {
 	 * @param string $fullCont Resolved container name
 	 * @param string $dir Resolved storage directory with no trailing slash
 	 * @param string|null $after Storage path of file to list items after
-	 * @param $limit integer Max number of items to list
-	 * @param array $params Includes flag for 'topOnly'
-	 * @return Array List of relative paths of files under $dir
+	 * @param integer $limit Max number of items to list
+	 * @param array $params Parameters for getDirectoryList()
+	 * @return Array List of resolved paths of files under $dir
+	 * @throws FileBackendError
 	 */
 	public function getFileListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
 		$files = array();
 		if ( $after === INF ) {
 			return $files; // nothing more
 		}
-		wfProfileIn( __METHOD__ . '-' . $this->name );
 
+		$section = new ProfileSection( __METHOD__ . '-' . $this->name );
 		try {
 			$container = $this->getContainer( $fullCont );
 			$prefix = ( $dir == '' ) ? null : "{$dir}/";
 			// Non-recursive: only list files right under $dir
 			if ( !empty( $params['topOnly'] ) ) { // files and dirs
-				$objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
-				foreach ( $objects as $object ) {
-					if ( substr( $object, -1 ) !== '/' ) {
-						$files[] = $object; // directories end in '/'
+				if ( !empty( $params['adviseStat'] ) ) {
+					$limit = min( $limit, self::CACHE_CHEAP_SIZE );
+					// Note: get_objects() does not include directories
+					$objects = $this->loadObjectListing( $params, $dir,
+						$container->get_objects( $limit, $after, $prefix, null, '/' ) );
+					$files = $objects;
+				} else {
+					$objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
+					foreach ( $objects as $object ) { // files and directories
+						if ( substr( $object, -1 ) !== '/' ) {
+							$files[] = $object; // directories end in '/'
+						}
 					}
 				}
 			// Recursive: list all files under $dir and its subdirs
 			} else { // files
-				$objects = $container->list_objects( $limit, $after, $prefix );
+				if ( !empty( $params['adviseStat'] ) ) {
+					$limit = min( $limit, self::CACHE_CHEAP_SIZE );
+					$objects = $this->loadObjectListing( $params, $dir,
+						$container->get_objects( $limit, $after, $prefix ) );
+				} else {
+					$objects = $container->list_objects( $limit, $after, $prefix );
+				}
 				$files = $objects;
 			}
+			// Page on the unfiltered object listing (what is returned may be filtered)
 			if ( count( $objects ) < $limit ) {
 				$after = INF; // avoid a second RTT
 			} else {
@@ -1074,29 +1044,57 @@ class SwiftFileBackend extends FileBackendStore {
 		} catch ( CloudFilesException $e ) { // some other exception?
 			$this->handleException( $e, null, __METHOD__,
 				array( 'cont' => $fullCont, 'dir' => $dir ) );
+			throw new FileBackendError( "Got " . get_class( $e ) . " exception." );
 		}
 
-		wfProfileOut( __METHOD__ . '-' . $this->name );
 		return $files;
 	}
 
 	/**
-	 * @see FileBackendStore::doGetFileSha1base36()
-	 * @return bool
+	 * Load a list of objects that belong under $dir into stat cache
+	 * and return a list of the names of the objects in the same order.
+	 *
+	 * @param array $params Parameters for getDirectoryList()
+	 * @param string $dir Resolved container directory path
+	 * @param array $cfObjects List of CF_Object items
+	 * @return array List of object names
 	 */
+	private function loadObjectListing( array $params, $dir, array $cfObjects ) {
+		$names = array();
+		$storageDir = rtrim( $params['dir'], '/' );
+		$suffixStart = ( $dir === '' ) ? 0 : strlen( $dir ) + 1; // size of "path/to/dir/"
+		// Iterate over the list *backwards* as this primes the stat cache, which is LRU.
+		// If this fills the cache and the caller stats an uncached file before stating
+		// the ones on the listing, there would be zero cache hits if this went forwards.
+		for ( end( $cfObjects ); key( $cfObjects ) !== null; prev( $cfObjects ) ) {
+			$object = current( $cfObjects );
+			$path = "{$storageDir}/" . substr( $object->name, $suffixStart );
+			$val = array(
+				// Convert dates like "Tue, 03 Jan 2012 22:01:04 GMT" to TS_MW
+				'mtime'  => wfTimestamp( TS_MW, $object->last_modified ),
+				'size'   => (int)$object->content_length,
+				'latest' => false // eventually consistent
+			);
+			$this->cheapCache->set( $path, 'stat', $val );
+			$names[] = $object->name;
+		}
+		return array_reverse( $names ); // keep the paths in original order
+	}
+
 	protected function doGetFileSha1base36( array $params ) {
 		$stat = $this->getFileStat( $params );
 		if ( $stat ) {
+			if ( !isset( $stat['sha1'] ) ) {
+				// Stat entries filled by file listings don't include SHA1
+				$this->clearCache( array( $params['src'] ) );
+				$stat = $this->getFileStat( $params );
+			}
 			return $stat['sha1'];
 		} else {
 			return false;
 		}
 	}
 
-	/**
-	 * @see FileBackendStore::doStreamFile()
-	 * @return Status
-	 */
 	protected function doStreamFile( array $params ) {
 		$status = Status::newGood();
 
@@ -1128,10 +1126,6 @@ class SwiftFileBackend extends FileBackendStore {
 		return $status;
 	}
 
-	/**
-	 * @see FileBackendStore::doGetLocalCopyMulti()
-	 * @return null|TempFSFile
-	 */
 	protected function doGetLocalCopyMulti( array $params ) {
 		$tmpFiles = array();
 
@@ -1201,10 +1195,6 @@ class SwiftFileBackend extends FileBackendStore {
 		return $tmpFiles;
 	}
 
-	/**
-	 * @see FileBackendStore::getFileHttpUrl()
-	 * @return string|null
-	 */
 	public function getFileHttpUrl( array $params ) {
 		if ( $this->swiftTempUrlKey != '' ||
 			( $this->rgwS3AccessKey != '' && $this->rgwS3SecretKey != '' ) )
@@ -1237,8 +1227,8 @@ class SwiftFileBackend extends FileBackendStore {
 						str_replace( '/swift/v1', '', // S3 API is the rgw default
 							$sContObj->cfs_http->getStorageUrl() . $spath ),
 						array(
-							'Signature'      => $signature,
-							'Expires'        => $expires,
+							'Signature' => $signature,
+							'Expires' => $expires,
 							'AWSAccessKeyId' => $this->rgwS3AccessKey )
 					);
 				}
@@ -1250,10 +1240,6 @@ class SwiftFileBackend extends FileBackendStore {
 		return null;
 	}
 
-	/**
-	 * @see FileBackendStore::directoriesAreVirtual()
-	 * @return bool
-	 */
 	protected function directoriesAreVirtual() {
 		return true;
 	}
@@ -1274,10 +1260,6 @@ class SwiftFileBackend extends FileBackendStore {
 		return $hdrs;
 	}
 
-	/**
-	 * @see FileBackendStore::doExecuteOpHandlesInternal()
-	 * @return Array List of corresponding Status objects
-	 */
 	protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
 		$statuses = array();
 
@@ -1314,7 +1296,7 @@ class SwiftFileBackend extends FileBackendStore {
 	 *                           matches the expression and the request is not for a listing.
 	 *                           Setting this to '*' effectively makes a container public.
 	 *   -".rlistings:<regex>" : Grants access if the request is from a referrer host that
-	 *                           matches the expression and the request for a listing.
+	 *                           matches the expression and the request is for a listing.
 	 *
 	 * $writeGrps is a list of the possible criteria for a request to have
 	 * access to write to a container. Each item is of the following format:
@@ -1325,7 +1307,7 @@ class SwiftFileBackend extends FileBackendStore {
 	 * In general, we don't allow listings to end-users. It's not useful, isn't well-defined
 	 * (lists are truncated to 10000 item with no way to page), and is just a performance risk.
 	 *
-	 * @param $contObj CF_Container Swift container
+	 * @param CF_Container $contObj Swift container
 	 * @param array $readGrps List of read access routes
 	 * @param array $writeGrps List of write access routes
 	 * @return Status
@@ -1395,12 +1377,12 @@ class SwiftFileBackend extends FileBackendStore {
 			if ( is_array( $creds ) ) { // cache hit
 				$this->auth->load_cached_credentials(
 					$creds['auth_token'], $creds['storage_url'], $creds['cdnm_url'] );
-				$this->sessionStarted = time() - ceil( $this->authTTL/2 ); // skew for worst case
+				$this->sessionStarted = time() - ceil( $this->authTTL / 2 ); // skew for worst case
 			} else { // cache miss
 				try {
 					$this->auth->authenticate();
 					$creds = $this->auth->export_credentials();
-					$this->srvCache->add( $cacheKey, $creds, ceil( $this->authTTL/2 ) ); // cache
+					$this->srvCache->add( $cacheKey, $creds, ceil( $this->authTTL / 2 ) ); // cache
 					$this->sessionStarted = time();
 				} catch ( CloudFilesException $e ) {
 					$this->connException = $e; // don't keep re-trying
@@ -1433,7 +1415,7 @@ class SwiftFileBackend extends FileBackendStore {
 	/**
 	 * Get the cache key for a container
 	 *
-	 * @param $username string
+	 * @param string $username
 	 * @return string
 	 */
 	private function getCredsCacheKey( $username ) {
@@ -1496,10 +1478,6 @@ class SwiftFileBackend extends FileBackendStore {
 		$conn->delete_container( $container );
 	}
 
-	/**
-	 * @see FileBackendStore::doPrimeContainerCache()
-	 * @return void
-	 */
 	protected function doPrimeContainerCache( array $containerInfo ) {
 		try {
 			$conn = $this->getConnection(); // Swift proxy connection
@@ -1517,9 +1495,9 @@ class SwiftFileBackend extends FileBackendStore {
 	 * Log an unexpected exception for this backend.
 	 * This also sets the Status object to have a fatal error.
 	 *
-	 * @param $e Exception
-	 * @param $status Status|null
-	 * @param $func string
+	 * @param Exception $e
+	 * @param Status $status|null
+	 * @param string $func
 	 * @param array $params
 	 * @return void
 	 */
@@ -1554,7 +1532,15 @@ class SwiftFileOpHandle extends FileBackendStoreOpHandle {
 	/** @var Array */
 	public $affectedObjects = array();
 
-	public function __construct( $backend, array $params, $call, CF_Async_Op $cfOp ) {
+	/**
+	 * @param SwiftFileBackend $backend
+	 * @param array $params
+	 * @param string $call
+	 * @param CF_Async_Op $cfOp
+	 */
+	public function __construct(
+		SwiftFileBackend $backend, array $params, $call, CF_Async_Op $cfOp
+	) {
 		$this->backend = $backend;
 		$this->params = $params;
 		$this->call = $call;
@@ -1586,7 +1572,7 @@ abstract class SwiftFileBackendList implements Iterator {
 	const PAGE_SIZE = 9000; // file listing buffer size
 
 	/**
-	 * @param $backend SwiftFileBackend
+	 * @param SwiftFileBackend $backend
 	 * @param string $fullCont Resolved container name
 	 * @param string $dir Resolved directory relative to container
 	 * @param array $params
@@ -1660,10 +1646,10 @@ abstract class SwiftFileBackendList implements Iterator {
 	 *
 	 * @param string $container Resolved container name
 	 * @param string $dir Resolved path relative to container
-	 * @param $after string|null
-	 * @param $limit integer
+	 * @param string $after|null
+	 * @param integer $limit
 	 * @param array $params
-	 * @return Traversable|Array|null Returns null on failure
+	 * @return Traversable|Array
 	 */
 	abstract protected function pageFromList( $container, $dir, &$after, $limit, array $params );
 }
@@ -1682,7 +1668,7 @@ class SwiftFileBackendDirList extends SwiftFileBackendList {
 
 	/**
 	 * @see SwiftFileBackendList::pageFromList()
-	 * @return Array|null
+	 * @return Array
 	 */
 	protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
 		return $this->backend->getDirListPageInternal( $container, $dir, $after, $limit, $params );
@@ -1703,7 +1689,7 @@ class SwiftFileBackendFileList extends SwiftFileBackendList {
 
 	/**
 	 * @see SwiftFileBackendList::pageFromList()
-	 * @return Array|null
+	 * @return Array
 	 */
 	protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
 		return $this->backend->getFileListPageInternal( $container, $dir, $after, $limit, $params );
diff --git a/includes/filebackend/TempFSFile.php b/includes/filebackend/TempFSFile.php
index 11e125c1..8266e420 100644
--- a/includes/filebackend/TempFSFile.php
+++ b/includes/filebackend/TempFSFile.php
@@ -37,8 +37,8 @@ class TempFSFile extends FSFile {
 	 * Make a new temporary file on the file system.
 	 * Temporary files may be purged when the file object falls out of scope.
 	 *
-	 * @param $prefix string
-	 * @param $extension string
+	 * @param string $prefix
+	 * @param string $extension
 	 * @return TempFSFile|null
 	 */
 	public static function factory( $prefix, $extension = '' ) {
@@ -81,7 +81,7 @@ class TempFSFile extends FSFile {
 	/**
 	 * Clean up the temporary file only after an object goes out of scope
 	 *
-	 * @param $object Object
+	 * @param Object $object
 	 * @return TempFSFile This object
 	 */
 	public function bind( $object ) {
diff --git a/includes/filebackend/filejournal/DBFileJournal.php b/includes/filebackend/filejournal/DBFileJournal.php
index 73f29a95..9250aa5e 100644
--- a/includes/filebackend/filejournal/DBFileJournal.php
+++ b/includes/filebackend/filejournal/DBFileJournal.php
@@ -65,11 +65,11 @@ class DBFileJournal extends FileJournal {
 		foreach ( $entries as $entry ) {
 			$data[] = array(
 				'fj_batch_uuid' => $batchId,
-				'fj_backend'    => $this->backend,
-				'fj_op'         => $entry['op'],
-				'fj_path'       => $entry['path'],
-				'fj_new_sha1'   => $entry['newSha1'],
-				'fj_timestamp'  => $dbw->timestamp( $now )
+				'fj_backend' => $this->backend,
+				'fj_op' => $entry['op'],
+				'fj_path' => $entry['path'],
+				'fj_new_sha1' => $entry['newSha1'],
+				'fj_timestamp' => $dbw->timestamp( $now )
 			);
 		}
 
diff --git a/includes/filebackend/lockmanager/DBLockManager.php b/includes/filebackend/lockmanager/DBLockManager.php
index f02387dc..3e934ba5 100644
--- a/includes/filebackend/lockmanager/DBLockManager.php
+++ b/includes/filebackend/lockmanager/DBLockManager.php
@@ -110,6 +110,19 @@ abstract class DBLockManager extends QuorumLockManager {
 		$this->session = wfRandomString( 31 );
 	}
 
+	// @TODO: change this code to work in one batch
+	protected function getLocksOnServer( $lockSrv, array $pathsByType ) {
+		$status = Status::newGood();
+		foreach ( $pathsByType as $type => $paths ) {
+			$status->merge( $this->doGetLocksOnServer( $lockSrv, $paths, $type ) );
+		}
+		return $status;
+	}
+
+	protected function freeLocksOnServer( $lockSrv, array $pathsByType ) {
+		return Status::newGood();
+	}
+
 	/**
 	 * @see QuorumLockManager::isServerUp()
 	 * @return bool
@@ -252,7 +265,7 @@ class MySqlLockManager extends DBLockManager {
 	 * @see DBLockManager::getLocksOnServer()
 	 * @return Status
 	 */
-	protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+	protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) {
 		$status = Status::newGood();
 
 		$db = $this->getConnection( $lockSrv ); // checked in isServerUp()
@@ -318,14 +331,6 @@ class MySqlLockManager extends DBLockManager {
 		return $status;
 	}
 
-	/**
-	 * @see QuorumLockManager::freeLocksOnServer()
-	 * @return Status
-	 */
-	protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
-		return Status::newGood(); // not supported
-	}
-
 	/**
 	 * @see QuorumLockManager::releaseAllLocks()
 	 * @return Status
@@ -361,7 +366,7 @@ class PostgreSqlLockManager extends DBLockManager {
 		self::LOCK_EX => self::LOCK_EX
 	);
 
-	protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+	protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) {
 		$status = Status::newGood();
 		if ( !count( $paths ) ) {
 			return $status; // nothing to lock
@@ -369,7 +374,9 @@ class PostgreSqlLockManager extends DBLockManager {
 
 		$db = $this->getConnection( $lockSrv ); // checked in isServerUp()
 		$bigints = array_unique( array_map(
-			function( $key ) { return wfBaseConvert( substr( $key, 0, 15 ), 16, 10 ); },
+			function( $key ) {
+				return wfBaseConvert( substr( $key, 0, 15 ), 16, 10 );
+			},
 			array_map( array( $this, 'sha1Base16Absolute' ), $paths )
 		) );
 
@@ -405,14 +412,6 @@ class PostgreSqlLockManager extends DBLockManager {
 		return $status;
 	}
 
-	/**
-	 * @see QuorumLockManager::freeLocksOnServer()
-	 * @return Status
-	 */
-	protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
-		return Status::newGood(); // not supported
-	}
-
 	/**
 	 * @see QuorumLockManager::releaseAllLocks()
 	 * @return Status
diff --git a/includes/filebackend/lockmanager/LockManager.php b/includes/filebackend/lockmanager/LockManager.php
index 0512a01b..dad8a624 100644
--- a/includes/filebackend/lockmanager/LockManager.php
+++ b/includes/filebackend/lockmanager/LockManager.php
@@ -56,7 +56,7 @@ abstract class LockManager {
 	protected $domain; // string; domain (usually wiki ID)
 	protected $lockTTL; // integer; maximum time locks can be held
 
-	/* Lock types; stronger locks have higher values */
+	/** Lock types; stronger locks have higher values */
 	const LOCK_SH = 1; // shared lock (for reads)
 	const LOCK_UW = 2; // shared lock (for reads used to write elsewhere)
 	const LOCK_EX = 3; // exclusive lock (for writes)
@@ -76,10 +76,10 @@ abstract class LockManager {
 		if ( isset( $config['lockTTL'] ) ) {
 			$this->lockTTL = max( 1, $config['lockTTL'] );
 		} elseif ( PHP_SAPI === 'cli' ) {
-			$this->lockTTL = 2*3600;
+			$this->lockTTL = 2 * 3600;
 		} else {
 			$met = ini_get( 'max_execution_time' ); // this is 0 in CLI mode
-			$this->lockTTL = max( 5*60, 2*(int)$met );
+			$this->lockTTL = max( 5 * 60, 2 * (int)$met );
 		}
 	}
 
@@ -88,11 +88,36 @@ abstract class LockManager {
 	 *
 	 * @param array $paths List of resource names
 	 * @param $type integer LockManager::LOCK_* constant
+	 * @param integer $timeout Timeout in seconds (0 means non-blocking) (since 1.21)
 	 * @return Status
 	 */
-	final public function lock( array $paths, $type = self::LOCK_EX ) {
+	final public function lock( array $paths, $type = self::LOCK_EX, $timeout = 0 ) {
+		return $this->lockByType( array( $type => $paths ), $timeout );
+	}
+
+	/**
+	 * Lock the resources at the given abstract paths
+	 *
+	 * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
+	 * @param integer $timeout Timeout in seconds (0 means non-blocking) (since 1.21)
+	 * @return Status
+	 * @since 1.22
+	 */
+	final public function lockByType( array $pathsByType, $timeout = 0 ) {
 		wfProfileIn( __METHOD__ );
-		$status = $this->doLock( array_unique( $paths ), $this->lockTypeMap[$type] );
+		$status = Status::newGood();
+		$pathsByType = $this->normalizePathsByType( $pathsByType );
+		$msleep = array( 0, 50, 100, 300, 500 ); // retry backoff times
+		$start = microtime( true );
+		do {
+			$status = $this->doLockByType( $pathsByType );
+			$elapsed = microtime( true ) - $start;
+			if ( $status->isOK() || $elapsed >= $timeout || $elapsed < 0 ) {
+				break; // success, timeout, or clock set back
+			}
+			usleep( 1e3 * ( next( $msleep ) ?: 1000 ) ); // use 1 sec after enough times
+			$elapsed = microtime( true ) - $start;
+		} while ( $elapsed < $timeout && $elapsed >= 0 );
 		wfProfileOut( __METHOD__ );
 		return $status;
 	}
@@ -100,13 +125,25 @@ abstract class LockManager {
 	/**
 	 * Unlock the resources at the given abstract paths
 	 *
-	 * @param array $paths List of storage paths
+	 * @param array $paths List of paths
 	 * @param $type integer LockManager::LOCK_* constant
 	 * @return Status
 	 */
 	final public function unlock( array $paths, $type = self::LOCK_EX ) {
+		return $this->unlockByType( array( $type => $paths ) );
+	}
+
+	/**
+	 * Unlock the resources at the given abstract paths
+	 *
+	 * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
+	 * @return Status
+	 * @since 1.22
+	 */
+	final public function unlockByType( array $pathsByType ) {
 		wfProfileIn( __METHOD__ );
-		$status = $this->doUnlock( array_unique( $paths ), $this->lockTypeMap[$type] );
+		$pathsByType = $this->normalizePathsByType( $pathsByType );
+		$status = $this->doUnlockByType( $pathsByType );
 		wfProfileOut( __METHOD__ );
 		return $status;
 	}
@@ -135,21 +172,75 @@ abstract class LockManager {
 		return sha1( "{$this->domain}:{$path}" );
 	}
 
+	/**
+	 * Normalize the $paths array by converting LOCK_UW locks into the
+	 * appropriate type and removing any duplicated paths for each lock type.
+	 *
+	 * @param array $paths Map of LockManager::LOCK_* constants to lists of paths
+	 * @return Array
+	 * @since 1.22
+	 */
+	final protected function normalizePathsByType( array $pathsByType ) {
+		$res = array();
+		foreach ( $pathsByType as $type => $paths ) {
+			$res[$this->lockTypeMap[$type]] = array_unique( $paths );
+		}
+		return $res;
+	}
+
+	/**
+	 * @see LockManager::lockByType()
+	 * @param array $paths Map of LockManager::LOCK_* constants to lists of paths
+	 * @return Status
+	 * @since 1.22
+	 */
+	protected function doLockByType( array $pathsByType ) {
+		$status = Status::newGood();
+		$lockedByType = array(); // map of (type => paths)
+		foreach ( $pathsByType as $type => $paths ) {
+			$status->merge( $this->doLock( $paths, $type ) );
+			if ( $status->isOK() ) {
+				$lockedByType[$type] = $paths;
+			} else {
+				// Release the subset of locks that were acquired
+				foreach ( $lockedByType as $type => $paths ) {
+					$status->merge( $this->doUnlock( $paths, $type ) );
+				}
+				break;
+			}
+		}
+		return $status;
+	}
+
 	/**
 	 * Lock resources with the given keys and lock type
 	 *
-	 * @param array $paths List of storage paths
+	 * @param array $paths List of paths
 	 * @param $type integer LockManager::LOCK_* constant
-	 * @return string
+	 * @return Status
 	 */
 	abstract protected function doLock( array $paths, $type );
 
+	/**
+	 * @see LockManager::unlockByType()
+	 * @param array $paths Map of LockManager::LOCK_* constants to lists of paths
+	 * @return Status
+	 * @since 1.22
+	 */
+	protected function doUnlockByType( array $pathsByType ) {
+		$status = Status::newGood();
+		foreach ( $pathsByType as $type => $paths ) {
+			$status->merge( $this->doUnlock( $paths, $type ) );
+		}
+		return $status;
+	}
+
 	/**
 	 * Unlock resources with the given keys and lock type
 	 *
-	 * @param array $paths List of storage paths
+	 * @param array $paths List of paths
 	 * @param $type integer LockManager::LOCK_* constant
-	 * @return string
+	 * @return Status
 	 */
 	abstract protected function doUnlock( array $paths, $type );
 }
@@ -159,22 +250,10 @@ abstract class LockManager {
  * @since 1.19
  */
 class NullLockManager extends LockManager {
-	/**
-	 * @see LockManager::doLock()
-	 * @param $paths array
-	 * @param $type int
-	 * @return Status
-	 */
 	protected function doLock( array $paths, $type ) {
 		return Status::newGood();
 	}
 
-	/**
-	 * @see LockManager::doUnlock()
-	 * @param $paths array
-	 * @param $type int
-	 * @return Status
-	 */
 	protected function doUnlock( array $paths, $type ) {
 		return Status::newGood();
 	}
diff --git a/includes/filebackend/lockmanager/LockManagerGroup.php b/includes/filebackend/lockmanager/LockManagerGroup.php
index ac0bd49b..9aff2415 100644
--- a/includes/filebackend/lockmanager/LockManagerGroup.php
+++ b/includes/filebackend/lockmanager/LockManagerGroup.php
@@ -97,8 +97,8 @@ class LockManagerGroup {
 			$class = $config['class'];
 			unset( $config['class'] ); // lock manager won't need this
 			$this->managers[$name] = array(
-				'class'    => $class,
-				'config'   => $config,
+				'class' => $class,
+				'config' => $config,
 				'instance' => null
 			);
 		}
diff --git a/includes/filebackend/lockmanager/MemcLockManager.php b/includes/filebackend/lockmanager/MemcLockManager.php
index fafc588a..5eab03ee 100644
--- a/includes/filebackend/lockmanager/MemcLockManager.php
+++ b/includes/filebackend/lockmanager/MemcLockManager.php
@@ -88,11 +88,44 @@ class MemcLockManager extends QuorumLockManager {
 		$this->session = wfRandomString( 32 );
 	}
 
+	// @TODO: change this code to work in one batch
+	protected function getLocksOnServer( $lockSrv, array $pathsByType ) {
+		$status = Status::newGood();
+
+		$lockedPaths = array();
+		foreach ( $pathsByType as $type => $paths ) {
+			$status->merge( $this->doGetLocksOnServer( $lockSrv, $paths, $type ) );
+			if ( $status->isOK() ) {
+				$lockedPaths[$type] = isset( $lockedPaths[$type] )
+					? array_merge( $lockedPaths[$type], $paths )
+					: $paths;
+			} else {
+				foreach ( $lockedPaths as $type => $paths ) {
+					$status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) );
+				}
+				break;
+			}
+		}
+
+		return $status;
+	}
+
+	// @TODO: change this code to work in one batch
+	protected function freeLocksOnServer( $lockSrv, array $pathsByType ) {
+		$status = Status::newGood();
+
+		foreach ( $pathsByType as $type => $paths ) {
+			$status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) );
+		}
+
+		return $status;
+	}
+
 	/**
 	 * @see QuorumLockManager::getLocksOnServer()
 	 * @return Status
 	 */
-	protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+	protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) {
 		$status = Status::newGood();
 
 		$memc = $this->getCache( $lockSrv );
@@ -145,7 +178,7 @@ class MemcLockManager extends QuorumLockManager {
 			foreach ( $paths as $path ) {
 				$locksKey = $this->recordKeyForPath( $path );
 				$locksHeld = $lockRecords[$locksKey];
-				$ok = $memc->set( $locksKey, $locksHeld, 7*86400 );
+				$ok = $memc->set( $locksKey, $locksHeld, 7 * 86400 );
 				if ( !$ok ) {
 					$status->fatal( 'lockmanager-fail-acquirelock', $path );
 				} else {
@@ -164,7 +197,7 @@ class MemcLockManager extends QuorumLockManager {
 	 * @see QuorumLockManager::freeLocksOnServer()
 	 * @return Status
 	 */
-	protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
+	protected function doFreeLocksOnServer( $lockSrv, array $paths, $type ) {
 		$status = Status::newGood();
 
 		$memc = $this->getCache( $lockSrv );
@@ -297,7 +330,7 @@ class MemcLockManager extends QuorumLockManager {
 		$start = microtime( true );
 		do {
 			if ( ( ++$rounds % 4 ) == 0 ) {
-				usleep( 1000*50 ); // 50 ms
+				usleep( 1000 * 50 ); // 50 ms
 			}
 			foreach ( array_diff( $keys, $lockedKeys ) as $key ) {
 				if ( $memc->add( "$key:mutex", 1, 180 ) ) { // lock record
diff --git a/includes/filebackend/lockmanager/QuorumLockManager.php b/includes/filebackend/lockmanager/QuorumLockManager.php
index b331b540..8356d32a 100644
--- a/includes/filebackend/lockmanager/QuorumLockManager.php
+++ b/includes/filebackend/lockmanager/QuorumLockManager.php
@@ -31,81 +31,86 @@
 abstract class QuorumLockManager extends LockManager {
 	/** @var Array Map of bucket indexes to peer server lists */
 	protected $srvsByBucket = array(); // (bucket index => (lsrv1, lsrv2, ...))
+	/** @var Array Map of degraded buckets */
+	protected $degradedBuckets = array(); // (buckey index => UNIX timestamp)
 
-	/**
-	 * @see LockManager::doLock()
-	 * @param $paths array
-	 * @param $type int
-	 * @return Status
-	 */
 	final protected function doLock( array $paths, $type ) {
+		return $this->doLockByType( array( $type => $paths ) );
+	}
+
+	final protected function doUnlock( array $paths, $type ) {
+		return $this->doUnlockByType( array( $type => $paths ) );
+	}
+
+	protected function doLockByType( array $pathsByType ) {
 		$status = Status::newGood();
 
-		$pathsToLock = array(); // (bucket => paths)
+		$pathsToLock = array(); // (bucket => type => paths)
 		// Get locks that need to be acquired (buckets => locks)...
-		foreach ( $paths as $path ) {
-			if ( isset( $this->locksHeld[$path][$type] ) ) {
-				++$this->locksHeld[$path][$type];
-			} else {
-				$bucket = $this->getBucketFromPath( $path );
-				$pathsToLock[$bucket][] = $path;
+		foreach ( $pathsByType as $type => $paths ) {
+			foreach ( $paths as $path ) {
+				if ( isset( $this->locksHeld[$path][$type] ) ) {
+					++$this->locksHeld[$path][$type];
+				} else {
+					$bucket = $this->getBucketFromPath( $path );
+					$pathsToLock[$bucket][$type][] = $path;
+				}
 			}
 		}
 
-		$lockedPaths = array(); // files locked in this attempt
+		$lockedPaths = array(); // files locked in this attempt (type => paths)
 		// Attempt to acquire these locks...
-		foreach ( $pathsToLock as $bucket => $paths ) {
+		foreach ( $pathsToLock as $bucket => $pathsToLockByType ) {
 			// Try to acquire the locks for this bucket
-			$status->merge( $this->doLockingRequestBucket( $bucket, $paths, $type ) );
+			$status->merge( $this->doLockingRequestBucket( $bucket, $pathsToLockByType ) );
 			if ( !$status->isOK() ) {
-				$status->merge( $this->doUnlock( $lockedPaths, $type ) );
+				$status->merge( $this->doUnlockByType( $lockedPaths ) );
 				return $status;
 			}
 			// Record these locks as active
-			foreach ( $paths as $path ) {
-				$this->locksHeld[$path][$type] = 1; // locked
+			foreach ( $pathsToLockByType as $type => $paths ) {
+				foreach ( $paths as $path ) {
+					$this->locksHeld[$path][$type] = 1; // locked
+					// Keep track of what locks were made in this attempt
+					$lockedPaths[$type][] = $path;
+				}
 			}
-			// Keep track of what locks were made in this attempt
-			$lockedPaths = array_merge( $lockedPaths, $paths );
 		}
 
 		return $status;
 	}
 
-	/**
-	 * @see LockManager::doUnlock()
-	 * @param $paths array
-	 * @param $type int
-	 * @return Status
-	 */
-	final protected function doUnlock( array $paths, $type ) {
+	protected function doUnlockByType( array $pathsByType ) {
 		$status = Status::newGood();
 
-		$pathsToUnlock = array();
-		foreach ( $paths as $path ) {
-			if ( !isset( $this->locksHeld[$path][$type] ) ) {
-				$status->warning( 'lockmanager-notlocked', $path );
-			} else {
-				--$this->locksHeld[$path][$type];
-				// Reference count the locks held and release locks when zero
-				if ( $this->locksHeld[$path][$type] <= 0 ) {
-					unset( $this->locksHeld[$path][$type] );
-					$bucket = $this->getBucketFromPath( $path );
-					$pathsToUnlock[$bucket][] = $path;
-				}
-				if ( !count( $this->locksHeld[$path] ) ) {
-					unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
+		$pathsToUnlock = array(); // (bucket => type => paths)
+		foreach ( $pathsByType as $type => $paths ) {
+			foreach ( $paths as $path ) {
+				if ( !isset( $this->locksHeld[$path][$type] ) ) {
+					$status->warning( 'lockmanager-notlocked', $path );
+				} else {
+					--$this->locksHeld[$path][$type];
+					// Reference count the locks held and release locks when zero
+					if ( $this->locksHeld[$path][$type] <= 0 ) {
+						unset( $this->locksHeld[$path][$type] );
+						$bucket = $this->getBucketFromPath( $path );
+						$pathsToUnlock[$bucket][$type][] = $path;
+					}
+					if ( !count( $this->locksHeld[$path] ) ) {
+						unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
+					}
 				}
 			}
 		}
 
 		// Remove these specific locks if possible, or at least release
 		// all locks once this process is currently not holding any locks.
-		foreach ( $pathsToUnlock as $bucket => $paths ) {
-			$status->merge( $this->doUnlockingRequestBucket( $bucket, $paths, $type ) );
+		foreach ( $pathsToUnlock as $bucket => $pathsToUnlockByType ) {
+			$status->merge( $this->doUnlockingRequestBucket( $bucket, $pathsToUnlockByType ) );
 		}
 		if ( !count( $this->locksHeld ) ) {
 			$status->merge( $this->releaseAllLocks() );
+			$this->degradedBuckets = array(); // safe to retry the normal quorum
 		}
 
 		return $status;
@@ -116,25 +121,25 @@ abstract class QuorumLockManager extends LockManager {
 	 * This is all or nothing; if any key is locked then this totally fails.
 	 *
 	 * @param $bucket integer
-	 * @param array $paths List of resource keys to lock
-	 * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+	 * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
 	 * @return Status
 	 */
-	final protected function doLockingRequestBucket( $bucket, array $paths, $type ) {
+	final protected function doLockingRequestBucket( $bucket, array $pathsByType ) {
 		$status = Status::newGood();
 
 		$yesVotes = 0; // locks made on trustable servers
 		$votesLeft = count( $this->srvsByBucket[$bucket] ); // remaining peers
-		$quorum = floor( $votesLeft/2 + 1 ); // simple majority
+		$quorum = floor( $votesLeft / 2 + 1 ); // simple majority
 		// Get votes for each peer, in order, until we have enough...
 		foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
 			if ( !$this->isServerUp( $lockSrv ) ) {
 				--$votesLeft;
 				$status->warning( 'lockmanager-fail-svr-acquire', $lockSrv );
+				$this->degradedBuckets[$bucket] = time();
 				continue; // server down?
 			}
 			// Attempt to acquire the lock on this peer
-			$status->merge( $this->getLocksOnServer( $lockSrv, $paths, $type ) );
+			$status->merge( $this->getLocksOnServer( $lockSrv, $pathsByType ) );
 			if ( !$status->isOK() ) {
 				return $status; // vetoed; resource locked
 			}
@@ -158,21 +163,33 @@ abstract class QuorumLockManager extends LockManager {
 	 * Attempt to release locks with the peers for a bucket
 	 *
 	 * @param $bucket integer
-	 * @param array $paths List of resource keys to lock
-	 * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+	 * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
 	 * @return Status
 	 */
-	final protected function doUnlockingRequestBucket( $bucket, array $paths, $type ) {
+	final protected function doUnlockingRequestBucket( $bucket, array $pathsByType ) {
 		$status = Status::newGood();
 
+		$yesVotes = 0; // locks freed on trustable servers
+		$votesLeft = count( $this->srvsByBucket[$bucket] ); // remaining peers
+		$quorum = floor( $votesLeft / 2 + 1 ); // simple majority
+		$isDegraded = isset( $this->degradedBuckets[$bucket] ); // not the normal quorum?
 		foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
 			if ( !$this->isServerUp( $lockSrv ) ) {
-				$status->fatal( 'lockmanager-fail-svr-release', $lockSrv );
+				$status->warning( 'lockmanager-fail-svr-release', $lockSrv );
 			// Attempt to release the lock on this peer
 			} else {
-				$status->merge( $this->freeLocksOnServer( $lockSrv, $paths, $type ) );
+				$status->merge( $this->freeLocksOnServer( $lockSrv, $pathsByType ) );
+				++$yesVotes; // success for this peer
+				// Normally the first peers form the quorum, and the others are ignored.
+				// Ignore them in this case, but not when an alternative quorum was used.
+				if ( $yesVotes >= $quorum && !$isDegraded ) {
+					break; // lock released
+				}
 			}
 		}
+		// Set a bad status if the quorum was not met.
+		// Assumes the same "up" servers as during the acquire step.
+		$status->setResult( $yesVotes >= $quorum );
 
 		return $status;
 	}
@@ -190,7 +207,8 @@ abstract class QuorumLockManager extends LockManager {
 	}
 
 	/**
-	 * Check if a lock server is up
+	 * Check if a lock server is up.
+	 * This should process cache results to reduce RTT.
 	 *
 	 * @param $lockSrv string
 	 * @return bool
@@ -198,14 +216,13 @@ abstract class QuorumLockManager extends LockManager {
 	abstract protected function isServerUp( $lockSrv );
 
 	/**
-	 * Get a connection to a lock server and acquire locks on $paths
+	 * Get a connection to a lock server and acquire locks
 	 *
 	 * @param $lockSrv string
-	 * @param $paths array
-	 * @param $type integer
+	 * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
 	 * @return Status
 	 */
-	abstract protected function getLocksOnServer( $lockSrv, array $paths, $type );
+	abstract protected function getLocksOnServer( $lockSrv, array $pathsByType );
 
 	/**
 	 * Get a connection to a lock server and release locks on $paths.
@@ -213,11 +230,10 @@ abstract class QuorumLockManager extends LockManager {
 	 * Subclasses must effectively implement this or releaseAllLocks().
 	 *
 	 * @param $lockSrv string
-	 * @param $paths array
-	 * @param $type integer
+	 * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
 	 * @return Status
 	 */
-	abstract protected function freeLocksOnServer( $lockSrv, array $paths, $type );
+	abstract protected function freeLocksOnServer( $lockSrv, array $pathsByType );
 
 	/**
 	 * Release all locks that this session is holding.
diff --git a/includes/filebackend/lockmanager/RedisLockManager.php b/includes/filebackend/lockmanager/RedisLockManager.php
new file mode 100644
index 00000000..43b0198a
--- /dev/null
+++ b/includes/filebackend/lockmanager/RedisLockManager.php
@@ -0,0 +1,288 @@
+<?php
+/**
+ * Version of LockManager based on using redis servers.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup LockManager
+ */
+
+/**
+ * Manage locks using redis servers.
+ *
+ * Version of LockManager based on using redis servers.
+ * This is meant for multi-wiki systems that may share files.
+ * All locks are non-blocking, which avoids deadlocks.
+ *
+ * All lock requests for a resource, identified by a hash string, will map to one
+ * bucket. Each bucket maps to one or several peer servers, each running redis.
+ * A majority of peers must agree for a lock to be acquired.
+ *
+ * This class requires Redis 2.6 as it makes use Lua scripts for fast atomic operations.
+ *
+ * @ingroup LockManager
+ * @since 1.22
+ */
+class RedisLockManager extends QuorumLockManager {
+	/** @var Array Mapping of lock types to the type actually used */
+	protected $lockTypeMap = array(
+		self::LOCK_SH => self::LOCK_SH,
+		self::LOCK_UW => self::LOCK_SH,
+		self::LOCK_EX => self::LOCK_EX
+	);
+
+	/** @var RedisConnectionPool */
+	protected $redisPool;
+	/** @var Array Map server names to hostname/IP and port numbers */
+	protected $lockServers = array();
+
+	protected $session = ''; // string; random UUID
+
+	/**
+	 * Construct a new instance from configuration.
+	 *
+	 * $config paramaters include:
+	 *   - lockServers  : Associative array of server names to "<IP>:<port>" strings.
+	 *   - srvsByBucket : Array of 1-16 consecutive integer keys, starting from 0,
+	 *                    each having an odd-numbered list of server names (peers) as values.
+	 *   - redisConfig  : Configuration for RedisConnectionPool::__construct().
+	 *
+	 * @param Array $config
+	 * @throws MWException
+	 */
+	public function __construct( array $config ) {
+		parent::__construct( $config );
+
+		$this->lockServers = $config['lockServers'];
+		// Sanitize srvsByBucket config to prevent PHP errors
+		$this->srvsByBucket = array_filter( $config['srvsByBucket'], 'is_array' );
+		$this->srvsByBucket = array_values( $this->srvsByBucket ); // consecutive
+
+		$config['redisConfig']['serializer'] = 'none';
+		$this->redisPool = RedisConnectionPool::singleton( $config['redisConfig'] );
+
+		$this->session = wfRandomString( 32 );
+	}
+
+	// @TODO: change this code to work in one batch
+	protected function getLocksOnServer( $lockSrv, array $pathsByType ) {
+		$status = Status::newGood();
+
+		$lockedPaths = array();
+		foreach ( $pathsByType as $type => $paths ) {
+			$status->merge( $this->doGetLocksOnServer( $lockSrv, $paths, $type ) );
+			if ( $status->isOK() ) {
+				$lockedPaths[$type] = isset( $lockedPaths[$type] )
+					? array_merge( $lockedPaths[$type], $paths )
+					: $paths;
+			} else {
+				foreach ( $lockedPaths as $type => $paths ) {
+					$status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) );
+				}
+				break;
+			}
+		}
+
+		return $status;
+	}
+
+	// @TODO: change this code to work in one batch
+	protected function freeLocksOnServer( $lockSrv, array $pathsByType ) {
+		$status = Status::newGood();
+
+		foreach ( $pathsByType as $type => $paths ) {
+			$status->merge( $this->doFreeLocksOnServer( $lockSrv, $paths, $type ) );
+		}
+
+		return $status;
+	}
+
+	protected function doGetLocksOnServer( $lockSrv, array $paths, $type ) {
+		$status = Status::newGood();
+
+		$server = $this->lockServers[$lockSrv];
+		$conn = $this->redisPool->getConnection( $server );
+		if ( !$conn ) {
+			foreach ( $paths as $path ) {
+				$status->fatal( 'lockmanager-fail-acquirelock', $path );
+			}
+			return $status;
+		}
+
+		$keys = array_map( array( $this, 'recordKeyForPath' ), $paths ); // lock records
+
+		try {
+			static $script =
+<<<LUA
+			if ARGV[1] ~= 'EX' and ARGV[1] ~= 'SH' then
+				return redis.error_reply('Unrecognized lock type given (must be EX or SH)')
+			end
+			local failed = {}
+			-- Check that all the locks can be acquired
+			for i,resourceKey in ipairs(KEYS) do
+				local keyIsFree = true
+				local currentLocks = redis.call('hKeys',resourceKey)
+				for i,lockKey in ipairs(currentLocks) do
+					local _, _, type, session = string.find(lockKey,"(%w+):(%w+)")
+					-- Check any locks that are not owned by this session
+					if session ~= ARGV[2] then
+						local lockTimestamp = redis.call('hGet',resourceKey,lockKey)
+						if 1*lockTimestamp < ( ARGV[4] - ARGV[3] ) then
+							-- Lock is stale, so just prune it out
+							redis.call('hDel',resourceKey,lockKey)
+						elseif ARGV[1] == 'EX' or type == 'EX' then
+							keyIsFree = false
+							break
+						end
+					end
+				end
+				if not keyIsFree then
+					failed[#failed+1] = resourceKey
+				end
+			end
+			-- If all locks could be acquired, then do so
+			if #failed == 0 then
+				for i,resourceKey in ipairs(KEYS) do
+					redis.call('hSet',resourceKey,ARGV[1] .. ':' .. ARGV[2],ARGV[4])
+					-- In addition to invalidation logic, be sure to garbage collect
+					redis.call('expire',resourceKey,ARGV[3])
+				end
+			end
+			return failed
+LUA;
+			$res = $conn->luaEval( $script,
+				array_merge(
+					$keys, // KEYS[0], KEYS[1],...KEYS[N]
+					array(
+						$type === self::LOCK_SH ? 'SH' : 'EX', // ARGV[1]
+						$this->session, // ARGV[2]
+						$this->lockTTL, // ARGV[3]
+						time() // ARGV[4]
+					)
+				),
+				count( $keys ) # number of first argument(s) that are keys
+			);
+		} catch ( RedisException $e ) {
+			$res = false;
+			$this->redisPool->handleException( $server, $conn, $e );
+		}
+
+		if ( $res === false ) {
+			foreach ( $paths as $path ) {
+				$status->fatal( 'lockmanager-fail-acquirelock', $path );
+			}
+		} else {
+			$pathsByKey = array_combine( $keys, $paths );
+			foreach ( $res as $key ) {
+				$status->fatal( 'lockmanager-fail-acquirelock', $pathsByKey[$key] );
+			}
+		}
+
+		return $status;
+	}
+
+	protected function doFreeLocksOnServer( $lockSrv, array $paths, $type ) {
+		$status = Status::newGood();
+
+		$server = $this->lockServers[$lockSrv];
+		$conn = $this->redisPool->getConnection( $server );
+		if ( !$conn ) {
+			foreach ( $paths as $path ) {
+				$status->fatal( 'lockmanager-fail-releaselock', $path );
+			}
+			return $status;
+		}
+
+		$keys = array_map( array( $this, 'recordKeyForPath' ), $paths ); // lock records
+
+		try {
+			static $script =
+<<<LUA
+			if ARGV[1] ~= 'EX' and ARGV[1] ~= 'SH' then
+				return redis.error_reply('Unrecognized lock type given (must be EX or SH)')
+			end
+			local failed = {}
+			for i,resourceKey in ipairs(KEYS) do
+				local released = redis.call('hDel',resourceKey,ARGV[1] .. ':' .. ARGV[2])
+				if released > 0 then
+					-- Remove the whole structure if it is now empty
+					if redis.call('hLen',resourceKey) == 0 then
+						redis.call('del',resourceKey)
+					end
+				else
+					failed[#failed+1] = resourceKey
+				end
+			end
+			return failed
+LUA;
+			$res = $conn->luaEval( $script,
+				array_merge(
+					$keys, // KEYS[0], KEYS[1],...KEYS[N]
+					array(
+						$type === self::LOCK_SH ? 'SH' : 'EX', // ARGV[1]
+						$this->session // ARGV[2]
+					)
+				),
+				count( $keys ) # number of first argument(s) that are keys
+			);
+		} catch ( RedisException $e ) {
+			$res = false;
+			$this->redisPool->handleException( $server, $conn, $e );
+		}
+
+		if ( $res === false ) {
+			foreach ( $paths as $path ) {
+				$status->fatal( 'lockmanager-fail-releaselock', $path );
+			}
+		} else {
+			$pathsByKey = array_combine( $keys, $paths );
+			foreach ( $res as $key ) {
+				$status->fatal( 'lockmanager-fail-releaselock', $pathsByKey[$key] );
+			}
+		}
+
+		return $status;
+	}
+
+	protected function releaseAllLocks() {
+		return Status::newGood(); // not supported
+	}
+
+	protected function isServerUp( $lockSrv ) {
+		return (bool)$this->redisPool->getConnection( $this->lockServers[$lockSrv] );
+	}
+
+	/**
+	 * @param $path string
+	 * @return string
+	 */
+	protected function recordKeyForPath( $path ) {
+		return implode( ':', array( __CLASS__, 'locks', $this->sha1Base36Absolute( $path ) ) );
+	}
+
+	/**
+	 * Make sure remaining locks get cleared for sanity
+	 */
+	function __destruct() {
+		while ( count( $this->locksHeld ) ) {
+			foreach ( $this->locksHeld as $path => $locks ) {
+				$this->doUnlock( array( $path ), self::LOCK_EX );
+				$this->doUnlock( array( $path ), self::LOCK_SH );
+			}
+		}
+	}
+}
diff --git a/includes/filebackend/lockmanager/ScopedLock.php b/includes/filebackend/lockmanager/ScopedLock.php
index edcb1d65..5faad4a6 100644
--- a/includes/filebackend/lockmanager/ScopedLock.php
+++ b/includes/filebackend/lockmanager/ScopedLock.php
@@ -36,24 +36,18 @@ class ScopedLock {
 	protected $manager;
 	/** @var Status */
 	protected $status;
-	/** @var Array List of resource paths*/
-	protected $paths;
-
-	protected $type; // integer lock type
+	/** @var Array Map of lock types to resource paths */
+	protected $pathsByType;
 
 	/**
-	 * @param $manager LockManager
-	 * @param array $paths List of storage paths
-	 * @param $type integer LockManager::LOCK_* constant
-	 * @param $status Status
+	 * @param LockManager $manager
+	 * @param array $pathsByType Map of lock types to path lists
+	 * @param Status $status
 	 */
-	protected function __construct(
-		LockManager $manager, array $paths, $type, Status $status
-	) {
+	protected function __construct( LockManager $manager, array $pathsByType, Status $status ) {
 		$this->manager = $manager;
-		$this->paths = $paths;
+		$this->pathsByType = $pathsByType;
 		$this->status = $status;
-		$this->type = $type;
 	}
 
 	/**
@@ -61,19 +55,24 @@ class ScopedLock {
 	 * Any locks are released once this object goes out of scope.
 	 * The status object is updated with any errors or warnings.
 	 *
-	 * @param $manager LockManager
-	 * @param array $paths List of storage paths
-	 * @param $type integer LockManager::LOCK_* constant
-	 * @param $status Status
+	 * $type can be "mixed" and $paths can be a map of types to paths (since 1.22).
+	 * Otherwise $type should be an integer and $paths should be a list of paths.
+	 *
+	 * @param LockManager $manager
+	 * @param array $paths List of storage paths or map of lock types to path lists
+	 * @param integer|string $type LockManager::LOCK_* constant or "mixed"
+	 * @param Status $status
+	 * @param integer $timeout Timeout in seconds (0 means non-blocking) (since 1.22)
 	 * @return ScopedLock|null Returns null on failure
 	 */
 	public static function factory(
-		LockManager $manager, array $paths, $type, Status $status
+		LockManager $manager, array $paths, $type, Status $status, $timeout = 0
 	) {
-		$lockStatus = $manager->lock( $paths, $type );
+		$pathsByType = is_integer( $type ) ? array( $type => $paths ) : $paths;
+		$lockStatus = $manager->lockByType( $pathsByType, $timeout );
 		$status->merge( $lockStatus );
 		if ( $lockStatus->isOK() ) {
-			return new self( $manager, $paths, $type, $status );
+			return new self( $manager, $pathsByType, $status );
 		}
 		return null;
 	}
@@ -91,9 +90,12 @@ class ScopedLock {
 		$lock = null;
 	}
 
+	/**
+	 * Release the locks when this goes out of scope
+	 */
 	function __destruct() {
 		$wasOk = $this->status->isOK();
-		$this->status->merge( $this->manager->unlock( $this->paths, $this->type ) );
+		$this->status->merge( $this->manager->unlockByType( $this->pathsByType ) );
 		if ( $wasOk ) {
 			// Make sure status is OK, despite any unlockFiles() fatals
 			$this->status->setResult( true, $this->status->value );
diff --git a/includes/filerepo/FSRepo.php b/includes/filerepo/FSRepo.php
index e49f37d2..42c9c945 100644
--- a/includes/filerepo/FSRepo.php
+++ b/includes/filerepo/FSRepo.php
@@ -56,16 +56,16 @@ class FSRepo extends FileRepo {
 			$repoName = $info['name'];
 			// Get the FS backend configuration
 			$backend = new FSFileBackend( array(
-				'name'           => $info['name'] . '-backend',
-				'lockManager'    => 'fsLockManager',
+				'name' => $info['name'] . '-backend',
+				'lockManager' => 'fsLockManager',
 				'containerPaths' => array(
-					"{$repoName}-public"  => "{$directory}",
-					"{$repoName}-temp"    => "{$directory}/temp",
-					"{$repoName}-thumb"   => $thumbDir,
-					"{$repoName}-transcoded"   => $transcodedDir,
+					"{$repoName}-public" => "{$directory}",
+					"{$repoName}-temp" => "{$directory}/temp",
+					"{$repoName}-thumb" => $thumbDir,
+					"{$repoName}-transcoded" => $transcodedDir,
 					"{$repoName}-deleted" => $deletedDir
 				),
-				'fileMode'       => $fileMode,
+				'fileMode' => $fileMode,
 			) );
 			// Update repo config to use this backend
 			$info['backend'] = $backend;
diff --git a/includes/filerepo/FileRepo.php b/includes/filerepo/FileRepo.php
index 366dd8a5..1195d5f8 100644
--- a/includes/filerepo/FileRepo.php
+++ b/includes/filerepo/FileRepo.php
@@ -67,7 +67,7 @@ class FileRepo {
 	 */
 	public function __construct( array $info = null ) {
 		// Verify required settings presence
-		if(
+		if (
 			$info === null
 			|| !array_key_exists( 'name', $info )
 			|| !array_key_exists( 'backend', $info )
@@ -259,19 +259,19 @@ class FileRepo {
 	 */
 	public function resolveVirtualUrl( $url ) {
 		if ( substr( $url, 0, 9 ) != 'mwrepo://' ) {
-			throw new MWException( __METHOD__.': unknown protocol' );
+			throw new MWException( __METHOD__ . ': unknown protocol' );
 		}
 		$bits = explode( '/', substr( $url, 9 ), 3 );
 		if ( count( $bits ) != 3 ) {
-			throw new MWException( __METHOD__.": invalid mwrepo URL: $url" );
+			throw new MWException( __METHOD__ . ": invalid mwrepo URL: $url" );
 		}
 		list( $repo, $zone, $rel ) = $bits;
 		if ( $repo !== $this->name ) {
-			throw new MWException( __METHOD__.": fetching from a foreign repo is not supported" );
+			throw new MWException( __METHOD__ . ": fetching from a foreign repo is not supported" );
 		}
 		$base = $this->getZonePath( $zone );
 		if ( !$base ) {
-			throw new MWException( __METHOD__.": invalid zone: $zone" );
+			throw new MWException( __METHOD__ . ": invalid zone: $zone" );
 		}
 		return $base . '/' . rawurldecode( $rel );
 	}
@@ -383,7 +383,7 @@ class FileRepo {
 			return false;
 		}
 		$redir = $this->checkRedirect( $title );
-		if ( $redir && $title->getNamespace() == NS_FILE) {
+		if ( $redir && $title->getNamespace() == NS_FILE ) {
 			$img = $this->newFile( $redir );
 			if ( !$img ) {
 				return false;
@@ -794,10 +794,10 @@ class FileRepo {
 				}
 			}
 			$operations[] = array(
-				'op'            => $opName,
-				'src'           => $srcPath,
-				'dst'           => $dstPath,
-				'overwrite'     => $flags & self::OVERWRITE,
+				'op' => $opName,
+				'src' => $srcPath,
+				'dst' => $dstPath,
+				'overwrite' => $flags & self::OVERWRITE,
 				'overwriteSame' => $flags & self::OVERWRITE_SAME,
 			);
 		}
@@ -917,9 +917,9 @@ class FileRepo {
 			$src = $this->resolveToStoragePath( $src );
 			$dst = $this->resolveToStoragePath( $dst );
 			$operations[] = array(
-				'op'          => FileBackend::isStoragePath( $src ) ? 'copy' : 'store',
-				'src'         => $src,
-				'dst'         => $dst,
+				'op' => FileBackend::isStoragePath( $src ) ? 'copy' : 'store',
+				'src' => $src,
+				'dst' => $dst,
 				'disposition' => isset( $triple[2] ) ? $triple[2] : null
 			);
 			$status->merge( $this->initDirectory( dirname( $dst ) ) );
@@ -942,8 +942,8 @@ class FileRepo {
 		$operations = array();
 		foreach ( $paths as $path ) {
 			$operations[] = array(
-				'op'                  => 'delete',
-				'src'                 => $this->resolveToStoragePath( $path ),
+				'op' => 'delete',
+				'src' => $this->resolveToStoragePath( $path ),
 				'ignoreMissingSource' => true
 			);
 		}
@@ -965,7 +965,7 @@ class FileRepo {
 	public function storeTemp( $originalName, $srcPath ) {
 		$this->assertWritableRepo(); // fail out if read-only
 
-		$date = gmdate( "YmdHis" );
+		$date = MWTimestamp::getInstance()->format( 'YmdHis' );
 		$hashPath = $this->getHashPath( $originalName );
 		$dstUrlRel = $hashPath . $date . '!' . rawurlencode( $originalName );
 		$virtualUrl = $this->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
@@ -987,7 +987,7 @@ class FileRepo {
 
 		$temp = $this->getVirtualUrl( 'temp' );
 		if ( substr( $virtualUrl, 0, strlen( $temp ) ) != $temp ) {
-			wfDebug( __METHOD__.": Invalid temp virtual URL\n" );
+			wfDebug( __METHOD__ . ": Invalid temp virtual URL\n" );
 			return false;
 		}
 
@@ -1132,9 +1132,9 @@ class FileRepo {
 			// race conditions unless an functioning LockManager is used.
 			// LocalFile also uses SELECT FOR UPDATE for synchronization.
 			$operations[] = array(
-				'op'                  => 'copy',
-				'src'                 => $dstPath,
-				'dst'                 => $archivePath,
+				'op' => 'copy',
+				'src' => $dstPath,
+				'dst' => $archivePath,
 				'ignoreMissingSource' => true
 			);
 
@@ -1142,28 +1142,28 @@ class FileRepo {
 			if ( FileBackend::isStoragePath( $srcPath ) ) {
 				if ( $flags & self::DELETE_SOURCE ) {
 					$operations[] = array(
-						'op'        => 'move',
-						'src'       => $srcPath,
-						'dst'       => $dstPath,
+						'op' => 'move',
+						'src' => $srcPath,
+						'dst' => $dstPath,
 						'overwrite' => true, // replace current
-						'headers'   => $headers
+						'headers' => $headers
 					);
 				} else {
 					$operations[] = array(
-						'op'        => 'copy',
-						'src'       => $srcPath,
-						'dst'       => $dstPath,
+						'op' => 'copy',
+						'src' => $srcPath,
+						'dst' => $dstPath,
 						'overwrite' => true, // replace current
-						'headers'   => $headers
+						'headers' => $headers
 					);
 				}
 			} else { // FS source path
 				$operations[] = array(
-					'op'        => 'store',
-					'src'       => $srcPath,
-					'dst'       => $dstPath,
+					'op' => 'store',
+					'src' => $srcPath,
+					'dst' => $dstPath,
 					'overwrite' => true, // replace current
-					'headers'   => $headers
+					'headers' => $headers
 				);
 				if ( $flags & self::DELETE_SOURCE ) {
 					$sourceFSFilesToDelete[] = $srcPath;
@@ -1306,9 +1306,9 @@ class FileRepo {
 		foreach ( $sourceDestPairs as $pair ) {
 			list( $srcRel, $archiveRel ) = $pair;
 			if ( !$this->validateFilename( $srcRel ) ) {
-				throw new MWException( __METHOD__.':Validation error in $srcRel' );
+				throw new MWException( __METHOD__ . ':Validation error in $srcRel' );
 			} elseif ( !$this->validateFilename( $archiveRel ) ) {
-				throw new MWException( __METHOD__.':Validation error in $archiveRel' );
+				throw new MWException( __METHOD__ . ':Validation error in $archiveRel' );
 			}
 
 			$publicRoot = $this->getZonePath( 'public' );
@@ -1324,9 +1324,9 @@ class FileRepo {
 			}
 
 			$operations[] = array(
-				'op'            => 'move',
-				'src'           => $srcPath,
-				'dst'           => $archivePath,
+				'op' => 'move',
+				'src' => $srcPath,
+				'dst' => $archivePath,
 				// We may have 2+ identical files being deleted,
 				// all of which will map to the same destination file
 				'overwriteSame' => true // also see bug 31792
@@ -1564,7 +1564,7 @@ class FileRepo {
 	public function newFatal( $message /*, parameters...*/ ) {
 		$params = func_get_args();
 		array_unshift( $params, $this );
-		return MWInit::callStaticMethod( 'FileRepoStatus', 'newFatal', $params );
+		return call_user_func_array( array( 'FileRepoStatus', 'newFatal' ), $params );
 	}
 
 	/**
@@ -1671,29 +1671,29 @@ class FileRepo {
 	 */
 	public function getTempRepo() {
 		return new TempFileRepo( array(
-			'name'      => "{$this->name}-temp",
-			'backend'   => $this->backend,
-			'zones'     => array(
+			'name' => "{$this->name}-temp",
+			'backend' => $this->backend,
+			'zones' => array(
 				'public' => array(
 					'container' => $this->zones['temp']['container'],
 					'directory' => $this->zones['temp']['directory']
 				),
-				'thumb'  => array(
+				'thumb' => array(
 					'container' => $this->zones['thumb']['container'],
 					'directory' => ( $this->zones['thumb']['directory'] == '' )
 						? 'temp'
 						: $this->zones['thumb']['directory'] . '/temp'
 				),
-				'transcoded'  => array(
+				'transcoded' => array(
 					'container' => $this->zones['transcoded']['container'],
 					'directory' => ( $this->zones['transcoded']['directory'] == '' )
 						? 'temp'
 						: $this->zones['transcoded']['directory'] . '/temp'
 				)
 			),
-			'url'        => $this->getZoneUrl( 'temp' ),
-			'thumbUrl'   => $this->getZoneUrl( 'thumb' ) . '/temp',
-			'transcodedUrl'   => $this->getZoneUrl( 'transcoded' ) . '/temp',
+			'url' => $this->getZoneUrl( 'temp' ),
+			'thumbUrl' => $this->getZoneUrl( 'thumb' ) . '/temp',
+			'transcodedUrl' => $this->getZoneUrl( 'transcoded' ) . '/temp',
 			'hashLevels' => $this->hashLevels // performance
 		) );
 	}
@@ -1716,6 +1716,22 @@ class FileRepo {
 	 * @throws MWException
 	 */
 	protected function assertWritableRepo() {}
+
+
+	/**
+	 * Return information about the repository.
+	 *
+	 * @return array
+	 * @since 1.22
+	 */
+	public function getInfo() {
+		return array(
+			'name' => $this->getName(),
+			'displayname' => $this->getDisplayName(),
+			'rootUrl' => $this->getRootUrl(),
+			'local' => $this->isLocal(),
+		);
+	}
 }
 
 /**
diff --git a/includes/filerepo/ForeignAPIRepo.php b/includes/filerepo/ForeignAPIRepo.php
index ba574da1..5eec9a50 100644
--- a/includes/filerepo/ForeignAPIRepo.php
+++ b/includes/filerepo/ForeignAPIRepo.php
@@ -61,25 +61,33 @@ class ForeignAPIRepo extends FileRepo {
 		// http://commons.wikimedia.org/w/api.php
 		$this->mApiBase = isset( $info['apibase'] ) ? $info['apibase'] : null;
 
-		if( isset( $info['apiThumbCacheExpiry'] ) ) {
+		if ( isset( $info['apiThumbCacheExpiry'] ) ) {
 			$this->apiThumbCacheExpiry = $info['apiThumbCacheExpiry'];
 		}
-		if( isset( $info['fileCacheExpiry'] ) ) {
+		if ( isset( $info['fileCacheExpiry'] ) ) {
 			$this->fileCacheExpiry = $info['fileCacheExpiry'];
 		}
-		if( !$this->scriptDirUrl ) {
+		if ( !$this->scriptDirUrl ) {
 			// hack for description fetches
 			$this->scriptDirUrl = dirname( $this->mApiBase );
 		}
 		// If we can cache thumbs we can guess sane defaults for these
-		if( $this->canCacheThumbs() && !$this->url ) {
+		if ( $this->canCacheThumbs() && !$this->url ) {
 			$this->url = $wgLocalFileRepo['url'];
 		}
-		if( $this->canCacheThumbs() && !$this->thumbUrl ) {
+		if ( $this->canCacheThumbs() && !$this->thumbUrl ) {
 			$this->thumbUrl = $this->url . '/thumb';
 		}
 	}
 
+	/**
+	 * @return string
+	 * @since 1.22
+	 */
+	function getApiUrl() {
+		return $this->mApiBase;
+	}
+
 	/**
 	 * Per docs in FileRepo, this needs to return false if we don't support versioned
 	 * files. Well, we don't.
@@ -102,10 +110,10 @@ class ForeignAPIRepo extends FileRepo {
 	function fileExistsBatch( array $files ) {
 		$results = array();
 		foreach ( $files as $k => $f ) {
-			if ( isset( $this->mFileExists[$k] ) ) {
-				$results[$k] = true;
+			if ( isset( $this->mFileExists[$f] ) ) {
+				$results[$k] = $this->mFileExists[$f];
 				unset( $files[$k] );
-			} elseif( self::isVirtualUrl( $f ) ) {
+			} elseif ( self::isVirtualUrl( $f ) ) {
 				# @todo FIXME: We need to be able to handle virtual
 				# URLs better, at least when we know they refer to the
 				# same repo.
@@ -120,11 +128,27 @@ class ForeignAPIRepo extends FileRepo {
 
 		$data = $this->fetchImageQuery( array( 'titles' => implode( $files, '|' ),
 											'prop' => 'imageinfo' ) );
-		if( isset( $data['query']['pages'] ) ) {
-			$i = 0;
-			foreach( $files as $key => $file ) {
-				$results[$key] = $this->mFileExists[$key] = !isset( $data['query']['pages'][$i]['missing'] );
-				$i++;
+		if ( isset( $data['query']['pages'] ) ) {
+			# First, get results from the query. Note we only care whether the image exists,
+			# not whether it has a description page.
+			foreach ( $data['query']['pages'] as $p ) {
+				$this->mFileExists[$p['title']] = ( $p['imagerepository'] !== '' );
+			}
+			# Second, copy the results to any redirects that were queried
+			if ( isset( $data['query']['redirects'] ) ) {
+				foreach ( $data['query']['redirects'] as $r ) {
+					$this->mFileExists[$r['from']] = $this->mFileExists[$r['to']];
+				}
+			}
+			# Third, copy the results to any non-normalized titles that were queried
+			if ( isset( $data['query']['normalized'] ) ) {
+				foreach ( $data['query']['normalized'] as $n ) {
+					$this->mFileExists[$n['from']] = $this->mFileExists[$n['to']];
+				}
+			}
+			# Finally, copy the results to the output
+			foreach ( $files as $key => $file ) {
+				$results[$key] = $this->mFileExists[$file];
 			}
 		}
 		return $results;
@@ -143,38 +167,26 @@ class ForeignAPIRepo extends FileRepo {
 	 * @return string
 	 */
 	function fetchImageQuery( $query ) {
-		global $wgMemc;
+		global $wgMemc, $wgLanguageCode;
 
 		$query = array_merge( $query,
 			array(
-				'format'    => 'json',
-				'action'    => 'query',
+				'format' => 'json',
+				'action' => 'query',
 				'redirects' => 'true'
 			) );
-		if ( $this->mApiBase ) {
-			$url = wfAppendQuery( $this->mApiBase, $query );
-		} else {
-			$url = $this->makeUrl( $query, 'api' );
+
+		if ( !isset( $query['uselang'] ) ) { // uselang is unset or null
+			$query['uselang'] = $wgLanguageCode;
 		}
 
-		if( !isset( $this->mQueryCache[$url] ) ) {
-			$key = $this->getLocalCacheKey( 'ForeignAPIRepo', 'Metadata', md5( $url ) );
-			$data = $wgMemc->get( $key );
-			if( !$data ) {
-				$data = self::httpGet( $url );
-				if ( !$data ) {
-					return null;
-				}
-				$wgMemc->set( $key, $data, 3600 );
-			}
+		$data = $this->httpGetCached( 'Metadata', $query );
 
-			if( count( $this->mQueryCache ) > 100 ) {
-				// Keep the cache from growing infinitely
-				$this->mQueryCache = array();
-			}
-			$this->mQueryCache[$url] = $data;
+		if ( $data ) {
+			return FormatJson::decode( $data, true );
+		} else {
+			return null;
 		}
-		return FormatJson::decode( $this->mQueryCache[$url], true );
 	}
 
 	/**
@@ -182,9 +194,9 @@ class ForeignAPIRepo extends FileRepo {
 	 * @return bool|array
 	 */
 	function getImageInfo( $data ) {
-		if( $data && isset( $data['query']['pages'] ) ) {
-			foreach( $data['query']['pages'] as $info ) {
-				if( isset( $info['imageinfo'][0] ) ) {
+		if ( $data && isset( $data['query']['pages'] ) ) {
+			foreach ( $data['query']['pages'] as $info ) {
+				if ( isset( $info['imageinfo'][0] ) ) {
 					return $info['imageinfo'][0];
 				}
 			}
@@ -198,14 +210,15 @@ class ForeignAPIRepo extends FileRepo {
 	 */
 	function findBySha1( $hash ) {
 		$results = $this->fetchImageQuery( array(
-										'aisha1base36' => $hash,
-										'aiprop'       => ForeignAPIFile::getProps(),
-										'list'         => 'allimages', ) );
+			'aisha1base36' => $hash,
+			'aiprop' => ForeignAPIFile::getProps(),
+			'list' => 'allimages',
+		) );
 		$ret = array();
 		if ( isset( $results['query']['allimages'] ) ) {
 			foreach ( $results['query']['allimages'] as $img ) {
 				// 1.14 was broken, doesn't return name attribute
-				if( !isset( $img['name'] ) ) {
+				if ( !isset( $img['name'] ) ) {
 					continue;
 				}
 				$ret[] = new ForeignAPIFile( Title::makeTitle( NS_FILE, $img['name'] ), $this, $img );
@@ -228,11 +241,11 @@ class ForeignAPIRepo extends FileRepo {
 			'iiprop' => 'url|timestamp',
 			'iiurlwidth' => $width,
 			'iiurlheight' => $height,
-			'iiurlparam'  => $otherParams,
+			'iiurlparam' => $otherParams,
 			'prop' => 'imageinfo' ) );
 		$info = $this->getImageInfo( $data );
 
-		if( $data && $info && isset( $info['thumburl'] ) ) {
+		if ( $data && $info && isset( $info['thumburl'] ) ) {
 			wfDebug( __METHOD__ . " got remote thumb " . $info['thumburl'] . "\n" );
 			$result = $info;
 			return $info['thumburl'];
@@ -241,6 +254,40 @@ class ForeignAPIRepo extends FileRepo {
 		}
 	}
 
+	/**
+	 * @param $name string
+	 * @param $width int
+	 * @param $height int
+	 * @param $otherParams string
+	 * @return bool|MediaTransformError
+	 * @since 1.22
+	 */
+	function getThumbError( $name, $width = -1, $height = -1, $otherParams = '', $lang = null ) {
+		$data = $this->fetchImageQuery( array(
+			'titles' => 'File:' . $name,
+			'iiprop' => 'url|timestamp',
+			'iiurlwidth' => $width,
+			'iiurlheight' => $height,
+			'iiurlparam' => $otherParams,
+			'prop' => 'imageinfo',
+			'uselang' => $lang,
+		) );
+		$info = $this->getImageInfo( $data );
+
+		if ( $data && $info && isset( $info['thumberror'] ) ) {
+			wfDebug( __METHOD__ . " got remote thumb error " . $info['thumberror'] . "\n" );
+			return new MediaTransformError(
+				'thumbnail_error_remote',
+				$width,
+				$height,
+				$this->getDisplayName(),
+				$info['thumberror'] // already parsed message from foreign repo
+			);
+		} else {
+			return false;
+		}
+	}
+
 	/**
 	 * Return the imageurl from cache if possible
 	 *
@@ -268,11 +315,11 @@ class ForeignAPIRepo extends FileRepo {
 
 		/* Get the array of urls that we already know */
 		$knownThumbUrls = $wgMemc->get( $key );
-		if( !$knownThumbUrls ) {
+		if ( !$knownThumbUrls ) {
 			/* No knownThumbUrls for this file */
 			$knownThumbUrls = array();
 		} else {
-			if( isset( $knownThumbUrls[$sizekey] ) ) {
+			if ( isset( $knownThumbUrls[$sizekey] ) ) {
 				wfDebug( __METHOD__ . ': Got thumburl from local cache: ' .
 					"{$knownThumbUrls[$sizekey]} \n" );
 				return $knownThumbUrls[$sizekey];
@@ -283,14 +330,14 @@ class ForeignAPIRepo extends FileRepo {
 		$metadata = null;
 		$foreignUrl = $this->getThumbUrl( $name, $width, $height, $metadata, $params );
 
-		if( !$foreignUrl ) {
+		if ( !$foreignUrl ) {
 			wfDebug( __METHOD__ . " Could not find thumburl\n" );
 			return false;
 		}
 
 		// We need the same filename as the remote one :)
 		$fileName = rawurldecode( pathinfo( $foreignUrl, PATHINFO_BASENAME ) );
-		if( !$this->validateFilename( $fileName ) ) {
+		if ( !$this->validateFilename( $fileName ) ) {
 			wfDebug( __METHOD__ . " The deduced filename $fileName is not safe\n" );
 			return false;
 		}
@@ -298,15 +345,14 @@ class ForeignAPIRepo extends FileRepo {
 		$localFilename = $localPath . "/" . $fileName;
 		$localUrl = $this->getZoneUrl( 'thumb' ) . "/" . $this->getHashPath( $name ) . rawurlencode( $name ) . "/" . rawurlencode( $fileName );
 
-		if( $backend->fileExists( array( 'src' => $localFilename ) )
-			&& isset( $metadata['timestamp'] ) )
-		{
+		if ( $backend->fileExists( array( 'src' => $localFilename ) )
+			&& isset( $metadata['timestamp'] ) ) {
 			wfDebug( __METHOD__ . " Thumbnail was already downloaded before\n" );
 			$modified = $backend->getFileTimestamp( array( 'src' => $localFilename ) );
 			$remoteModified = strtotime( $metadata['timestamp'] );
 			$current = time();
 			$diff = abs( $modified - $current );
-			if( $remoteModified < $modified && $diff < $this->fileCacheExpiry ) {
+			if ( $remoteModified < $modified && $diff < $this->fileCacheExpiry ) {
 				/* Use our current and already downloaded thumbnail */
 				$knownThumbUrls[$sizekey] = $localUrl;
 				$wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
@@ -315,7 +361,7 @@ class ForeignAPIRepo extends FileRepo {
 			/* There is a new Commons file, or existing thumbnail older than a month */
 		}
 		$thumb = self::httpGet( $foreignUrl );
-		if( !$thumb ) {
+		if ( !$thumb ) {
 			wfDebug( __METHOD__ . " Could not download thumb\n" );
 			return false;
 		}
@@ -323,7 +369,7 @@ class ForeignAPIRepo extends FileRepo {
 		# @todo FIXME: Delete old thumbs that aren't being used. Maintenance script?
 		$backend->prepare( array( 'dir' => dirname( $localFilename ) ) );
 		$params = array( 'dst' => $localFilename, 'content' => $thumb );
-		if( !$backend->quickCreate( $params )->isOK() ) {
+		if ( !$backend->quickCreate( $params )->isOK() ) {
 			wfDebug( __METHOD__ . " could not write to thumb path '$localFilename'\n" );
 			return $foreignUrl;
 		}
@@ -379,6 +425,36 @@ class ForeignAPIRepo extends FileRepo {
 		return Http::userAgent() . " ForeignAPIRepo/" . self::VERSION;
 	}
 
+	/**
+	 * Get information about the repo - overrides/extends the parent
+	 * class's information.
+	 * @return array
+	 * @since 1.22
+	 */
+	function getInfo() {
+		$info = parent::getInfo();
+		$info['apiurl'] = $this->getApiUrl();
+
+		$query = array(
+			'format' => 'json',
+			'action' => 'query',
+			'meta' => 'siteinfo',
+			'siprop' => 'general',
+		);
+
+		$data = $this->httpGetCached( 'SiteInfo', $query, 7200 );
+
+		if ( $data ) {
+			$siteInfo = FormatJson::decode( $data, true );
+			$general = $siteInfo['query']['general'];
+
+			$info['articlepath'] = $general['articlepath'];
+			$info['server'] = $general['server'];
+		}
+
+		return $info;
+	}
+
 	/**
 	 * Like a Http:get request, but with custom User-Agent.
 	 * @see Http:get
@@ -409,6 +485,46 @@ class ForeignAPIRepo extends FileRepo {
 		}
 	}
 
+	/**
+	 * HTTP GET request to a mediawiki API (with caching)
+	 * @param $target string Used in cache key creation, mostly
+	 * @param $query array The query parameters for the API request
+	 * @param $cacheTTL int Time to live for the memcached caching
+	 */
+	public function httpGetCached( $target, $query, $cacheTTL = 3600 ) {
+		if ( $this->mApiBase ) {
+			$url = wfAppendQuery( $this->mApiBase, $query );
+		} else {
+			$url = $this->makeUrl( $query, 'api' );
+		}
+
+		if ( !isset( $this->mQueryCache[$url] ) ) {
+			global $wgMemc;
+
+			$key = $this->getLocalCacheKey( get_class( $this ), $target, md5( $url ) );
+			$data = $wgMemc->get( $key );
+
+			if ( !$data ) {
+				$data = self::httpGet( $url );
+
+				if ( !$data ) {
+					return null;
+				}
+
+				$wgMemc->set( $key, $data, $cacheTTL );
+			}
+
+			if ( count( $this->mQueryCache ) > 100 ) {
+				// Keep the cache from growing infinitely
+				$this->mQueryCache = array();
+			}
+
+			$this->mQueryCache[$url] = $data;
+		}
+
+		return $this->mQueryCache[$url];
+	}
+
 	/**
 	 * @param $callback Array|string
 	 * @throws MWException
diff --git a/includes/filerepo/ForeignDBRepo.php b/includes/filerepo/ForeignDBRepo.php
index 18659852..37c65723 100644
--- a/includes/filerepo/ForeignDBRepo.php
+++ b/includes/filerepo/ForeignDBRepo.php
@@ -59,11 +59,12 @@ class ForeignDBRepo extends LocalRepo {
 			$this->dbConn = DatabaseBase::factory( $this->dbType,
 				array(
 					'host' => $this->dbServer,
-					'user'   => $this->dbUser,
+					'user' => $this->dbUser,
 					'password' => $this->dbPassword,
 					'dbname' => $this->dbName,
 					'flags' => $this->dbFlags,
-					'tablePrefix' => $this->tablePrefix
+					'tablePrefix' => $this->tablePrefix,
+					'foreign' => true,
 				)
 			);
 		}
diff --git a/includes/filerepo/LocalRepo.php b/includes/filerepo/LocalRepo.php
index be11b233..9b62243b 100644
--- a/includes/filerepo/LocalRepo.php
+++ b/includes/filerepo/LocalRepo.php
@@ -47,7 +47,7 @@ class LocalRepo extends FileRepo {
 		} elseif ( isset( $row->oi_name ) ) {
 			return call_user_func( $this->oldFileFromRowFactory, $row, $this );
 		} else {
-			throw new MWException( __METHOD__.': invalid row' );
+			throw new MWException( __METHOD__ . ': invalid row' );
 		}
 	}
 
@@ -171,13 +171,13 @@ class LocalRepo extends FileRepo {
 		if ( $cachedValue === ' ' || $cachedValue === '' ) {
 			// Does not exist
 			return false;
-		} elseif ( strval( $cachedValue ) !== '' ) {
+		} elseif ( strval( $cachedValue ) !== '' && $cachedValue !== ' PURGED' ) {
 			return Title::newFromText( $cachedValue, NS_FILE );
 		} // else $cachedValue is false or null: cache miss
 
 		$id = $this->getArticleID( $title );
-		if( !$id ) {
-			$wgMemc->set( $memcKey, " ", $expiry );
+		if ( !$id ) {
+			$wgMemc->add( $memcKey, " ", $expiry );
 			return false;
 		}
 		$dbr = $this->getSlaveDB();
@@ -188,12 +188,12 @@ class LocalRepo extends FileRepo {
 			__METHOD__
 		);
 
-		if( $row && $row->rd_namespace == NS_FILE ) {
+		if ( $row && $row->rd_namespace == NS_FILE ) {
 			$targetTitle = Title::makeTitle( $row->rd_namespace, $row->rd_title );
-			$wgMemc->set( $memcKey, $targetTitle->getDBkey(), $expiry );
+			$wgMemc->add( $memcKey, $targetTitle->getDBkey(), $expiry );
 			return $targetTitle;
 		} else {
-			$wgMemc->set( $memcKey, '', $expiry );
+			$wgMemc->add( $memcKey, '', $expiry );
 			return false;
 		}
 	}
@@ -206,7 +206,7 @@ class LocalRepo extends FileRepo {
 	 * @return bool|int|mixed
 	 */
 	protected function getArticleID( $title ) {
-		if( !$title instanceof Title ) {
+		if ( !$title instanceof Title ) {
 			return 0;
 		}
 		$dbr = $this->getSlaveDB();
@@ -258,7 +258,7 @@ class LocalRepo extends FileRepo {
 	 * @return array An Array of arrays or iterators of file objects and the hash as key
 	 */
 	function findBySha1s( array $hashes ) {
-		if( !count( $hashes ) ) {
+		if ( !count( $hashes ) ) {
 			return array(); //empty parameter
 		}
 
@@ -281,17 +281,17 @@ class LocalRepo extends FileRepo {
 		return $result;
 	}
 
-	/**
-	 * Return an array of files where the name starts with $prefix.
-	 *
-	 * @param string $prefix The prefix to search for
-	 * @param int $limit The maximum amount of files to return
-	 * @return array
-	 */
+	/**
+	 * Return an array of files where the name starts with $prefix.
+	 *
+	 * @param string $prefix The prefix to search for
+	 * @param int $limit The maximum amount of files to return
+	 * @return array
+	 */
 	public function findFilesByPrefix( $prefix, $limit ) {
 		$selectOptions = array( 'ORDER BY' => 'img_name', 'LIMIT' => intval( $limit ) );
 
-		// Query database
+		// Query database
 		$dbr = $this->getSlaveDB();
 		$res = $dbr->select(
 			'image',
@@ -306,7 +306,7 @@ class LocalRepo extends FileRepo {
 		foreach ( $res as $row ) {
 			$files[] = $this->newFileFromRow( $row );
 		}
-		return $files;
+		return $files;
 	}
 
 	/**
@@ -347,7 +347,11 @@ class LocalRepo extends FileRepo {
 		global $wgMemc;
 		$memcKey = $this->getSharedCacheKey( 'image_redirect', md5( $title->getDBkey() ) );
 		if ( $memcKey ) {
-			$wgMemc->delete( $memcKey );
+			// Set a temporary value for the cache key, to ensure
+			// that this value stays purged long enough so that
+			// it isn't refreshed with a stale value due to a
+			// lagged slave.
+			$wgMemc->set( $memcKey, ' PURGED', 12 );
 		}
 	}
 }
diff --git a/includes/filerepo/RepoGroup.php b/includes/filerepo/RepoGroup.php
index 02dfdad6..b2b9477a 100644
--- a/includes/filerepo/RepoGroup.php
+++ b/includes/filerepo/RepoGroup.php
@@ -209,7 +209,7 @@ class RepoGroup {
 		}
 
 		$redir = $this->localRepo->checkRedirect( $title );
-		if( $redir ) {
+		if ( $redir ) {
 			return $redir;
 		}
 		foreach ( $this->foreignRepos as $repo ) {
@@ -238,7 +238,9 @@ class RepoGroup {
 		if ( !$file ) {
 			foreach ( $this->foreignRepos as $repo ) {
 				$file = $repo->findFileFromKey( $hash, $options );
-				if ( $file ) break;
+				if ( $file ) {
+					break;
+				}
 			}
 		}
 		return $file;
@@ -279,7 +281,7 @@ class RepoGroup {
 			$result = array_merge_recursive( $result, $repo->findBySha1s( $hashes ) );
 		}
 		//sort the merged (and presorted) sublist of each hash
-		foreach( $result as $hash => $files ) {
+		foreach ( $result as $hash => $files ) {
 			usort( $result[$hash], 'File::compare' );
 		}
 		return $result;
@@ -339,9 +341,9 @@ class RepoGroup {
 	 * @return bool
 	 */
 	function forEachForeignRepo( $callback, $params = array() ) {
-		foreach( $this->foreignRepos as $repo ) {
+		foreach ( $this->foreignRepos as $repo ) {
 			$args = array_merge( array( $repo ), $params );
-			if( call_user_func_array( $callback, $args ) ) {
+			if ( call_user_func_array( $callback, $args ) ) {
 				return true;
 			}
 		}
diff --git a/includes/filerepo/file/ArchivedFile.php b/includes/filerepo/file/ArchivedFile.php
index 3f786197..749f11a5 100644
--- a/includes/filerepo/file/ArchivedFile.php
+++ b/includes/filerepo/file/ArchivedFile.php
@@ -90,7 +90,7 @@ class ArchivedFile {
 		$this->exists = false;
 		$this->sha1 = '';
 
-		if( $title instanceof Title ) {
+		if ( $title instanceof Title ) {
 			$this->title = File::normalizeTitle( $title, 'exception' );
 			$this->name = $title->getDBkey();
 		}
@@ -119,22 +119,22 @@ class ArchivedFile {
 		}
 		$conds = array();
 
-		if( $this->id > 0 ) {
+		if ( $this->id > 0 ) {
 			$conds['fa_id'] = $this->id;
 		}
-		if( $this->key ) {
+		if ( $this->key ) {
 			$conds['fa_storage_group'] = $this->group;
 			$conds['fa_storage_key'] = $this->key;
 		}
-		if( $this->title ) {
+		if ( $this->title ) {
 			$conds['fa_name'] = $this->title->getDBkey();
 		}
 
-		if( !count( $conds ) ) {
+		if ( !count( $conds ) ) {
 			throw new MWException( "No specific information for retrieving archived file" );
 		}
 
-		if( !$this->title || $this->title->getNamespace() == NS_FILE ) {
+		if ( !$this->title || $this->title->getNamespace() == NS_FILE ) {
 			$this->dataLoaded = true; // set it here, to have also true on miss
 			$dbr = wfGetDB( DB_SLAVE );
 			$row = $dbr->selectRow(
@@ -196,6 +196,7 @@ class ArchivedFile {
 			'fa_user_text',
 			'fa_timestamp',
 			'fa_deleted',
+			'fa_deleted_timestamp', /* Used by LocalFileRestoreBatch */
 			'fa_sha1',
 		);
 	}
@@ -224,7 +225,7 @@ class ArchivedFile {
 		$this->user_text = $row->fa_user_text;
 		$this->timestamp = $row->fa_timestamp;
 		$this->deleted = $row->fa_deleted;
-		if( isset( $row->fa_sha1 ) ) {
+		if ( isset( $row->fa_sha1 ) ) {
 			$this->sha1 = $row->fa_sha1;
 		} else {
 			// old row, populate from key
@@ -409,7 +410,7 @@ class ArchivedFile {
 	 */
 	public function getUser() {
 		$this->load();
-		if( $this->isDeleted( File::DELETED_USER ) ) {
+		if ( $this->isDeleted( File::DELETED_USER ) ) {
 			return 0;
 		} else {
 			return $this->user;
@@ -423,7 +424,7 @@ class ArchivedFile {
 	 */
 	public function getUserText() {
 		$this->load();
-		if( $this->isDeleted( File::DELETED_USER ) ) {
+		if ( $this->isDeleted( File::DELETED_USER ) ) {
 			return 0;
 		} else {
 			return $this->user_text;
@@ -437,7 +438,7 @@ class ArchivedFile {
 	 */
 	public function getDescription() {
 		$this->load();
-		if( $this->isDeleted( File::DELETED_COMMENT ) ) {
+		if ( $this->isDeleted( File::DELETED_COMMENT ) ) {
 			return 0;
 		} else {
 			return $this->description;
@@ -491,7 +492,7 @@ class ArchivedFile {
 	 */
 	public function isDeleted( $field ) {
 		$this->load();
-		return ($this->deleted & $field) == $field;
+		return ( $this->deleted & $field ) == $field;
 	}
 
 	/**
diff --git a/includes/filerepo/file/File.php b/includes/filerepo/file/File.php
index cecd0aee..ec5f927b 100644
--- a/includes/filerepo/file/File.php
+++ b/includes/filerepo/file/File.php
@@ -48,6 +48,7 @@
  * @ingroup FileAbstraction
  */
 abstract class File {
+	// Bitfield values akin to the Revision deletion constants
 	const DELETED_FILE = 1;
 	const DELETED_COMMENT = 2;
 	const DELETED_USER = 4;
@@ -201,9 +202,9 @@ abstract class File {
 			'mpeg' => 'mpg',
 			'tiff' => 'tif',
 			'ogv' => 'ogg' );
-		if( isset( $squish[$lower] ) ) {
+		if ( isset( $squish[$lower] ) ) {
 			return $squish[$lower];
-		} elseif( preg_match( '/^[0-9a-z]+$/', $lower ) ) {
+		} elseif ( preg_match( '/^[0-9a-z]+$/', $lower ) ) {
 			return $lower;
 		} else {
 			return '';
@@ -241,7 +242,7 @@ abstract class File {
 	 * @return array ("text", "html") etc
 	 */
 	public static function splitMime( $mime ) {
-		if( strpos( $mime, '/' ) !== false ) {
+		if ( strpos( $mime, '/' ) !== false ) {
 			return explode( '/', $mime, 2 );
 		} else {
 			return array( $mime, 'unknown' );
@@ -518,7 +519,7 @@ abstract class File {
 	 * @param $version integer version number.
 	 * @return Array containing metadata, or what was passed to it on fail (unserializing if not array)
 	 */
-	public function convertMetadataVersion($metadata, $version) {
+	public function convertMetadataVersion( $metadata, $version ) {
 		$handler = $this->getHandler();
 		if ( !is_array( $metadata ) ) {
 			// Just to make the return type consistent
@@ -681,7 +682,7 @@ abstract class File {
 		if ( $mime === "unknown/unknown" ) {
 			return false; #unknown type, not trusted
 		}
-		if ( in_array( $mime, $wgTrustedMediaFormats) ) {
+		if ( in_array( $mime, $wgTrustedMediaFormats ) ) {
 			return true;
 		}
 
@@ -737,7 +738,7 @@ abstract class File {
 			if ( $this->repo ) {
 				$script = $this->repo->getThumbScriptUrl();
 				if ( $script ) {
-					$this->transformScript = "$script?f=" . urlencode( $this->getName() );
+					$this->transformScript = wfAppendQuery( $script, array( 'f' => $this->getName() ) );
 				}
 			}
 		}
@@ -841,8 +842,9 @@ abstract class File {
 	protected function transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags ) {
 		global $wgIgnoreImageErrors;
 
-		if ( $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
-			return $this->getHandler()->getTransform( $this, $thumbPath, $thumbUrl, $params );
+		$handler = $this->getHandler();
+		if ( $handler && $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
+			return $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
 		} else {
 			return new MediaTransformError( 'thumbnail_error',
 				$params['width'], 0, wfMessage( 'thumbnail-dest-create' )->text() );
@@ -910,8 +912,7 @@ abstract class File {
 						// XXX: Pass in the storage path even though we are not rendering anything
 						// and the path is supposed to be an FS path. This is due to getScalerType()
 						// getting called on the path and clobbering $thumb->getUrl() if it's false.
-						$thumb = $handler->getTransform(
-							$this, $thumbPath, $thumbUrl, $params );
+						$thumb = $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
 						$thumb->setStoragePath( $thumbPath );
 						break;
 					}
@@ -1000,7 +1001,7 @@ abstract class File {
 	/**
 	 * Get a MediaHandler instance for this file
 	 *
-	 * @return MediaHandler
+	 * @return MediaHandler|boolean Registered MediaHandler for file's mime type or false if none found
 	 */
 	function getHandler() {
 		if ( !isset( $this->handler ) ) {
@@ -1097,7 +1098,7 @@ abstract class File {
 	 *
 	 * @return array
 	 */
-	function getHistory( $limit = null, $start = null, $end = null, $inc=true ) {
+	function getHistory( $limit = null, $start = null, $end = null, $inc = true ) {
 		return array();
 	}
 
@@ -1500,7 +1501,7 @@ abstract class File {
 	 * Is this file a "deleted" file in a private archive?
 	 * STUB
 	 *
-	 * @param $field
+	 * @param integer $field one of DELETED_* bitfield constants
 	 *
 	 * @return bool
 	 */
@@ -1656,18 +1657,22 @@ abstract class File {
 	/**
 	 * Get the HTML text of the description page, if available
 	 *
+	 * @param $lang Language Optional language to fetch description in
 	 * @return string
 	 */
-	function getDescriptionText() {
+	function getDescriptionText( $lang = false ) {
 		global $wgMemc, $wgLang;
 		if ( !$this->repo || !$this->repo->fetchDescription ) {
 			return false;
 		}
-		$renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $wgLang->getCode() );
+		if ( !$lang ) {
+			$lang = $wgLang;
+		}
+		$renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $lang->getCode() );
 		if ( $renderUrl ) {
 			if ( $this->repo->descriptionCacheExpiry > 0 ) {
 				wfDebug( "Attempting to get the description from cache..." );
-				$key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', $wgLang->getCode(),
+				$key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', $lang->getCode(),
 									$this->getName() );
 				$obj = $wgMemc->get( $key );
 				if ( $obj ) {
diff --git a/includes/filerepo/file/ForeignAPIFile.php b/includes/filerepo/file/ForeignAPIFile.php
index a96c1f3f..ed96d446 100644
--- a/includes/filerepo/file/ForeignAPIFile.php
+++ b/includes/filerepo/file/ForeignAPIFile.php
@@ -54,22 +54,22 @@ class ForeignAPIFile extends File {
 	 */
 	static function newFromTitle( Title $title, $repo ) {
 		$data = $repo->fetchImageQuery( array(
-			'titles'            => 'File:' . $title->getDBKey(),
-			'iiprop'            => self::getProps(),
-			'prop'              => 'imageinfo',
+			'titles' => 'File:' . $title->getDBkey(),
+			'iiprop' => self::getProps(),
+			'prop' => 'imageinfo',
 			'iimetadataversion' => MediaHandler::getMetadataVersion()
 		) );
 
 		$info = $repo->getImageInfo( $data );
 
-		if( $info ) {
+		if ( $info ) {
 			$lastRedirect = isset( $data['query']['redirects'] )
 				? count( $data['query']['redirects'] ) - 1
 				: -1;
-			if( $lastRedirect >= 0 ) {
-				$newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to']);
+			if ( $lastRedirect >= 0 ) {
+				$newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to'] );
 				$img = new self( $newtitle, $repo, $info, true );
-				if( $img ) {
+				if ( $img ) {
 					$img->redirectedFrom( $title->getDBkey() );
 				}
 			} else {
@@ -86,7 +86,7 @@ class ForeignAPIFile extends File {
 	 * @return string
 	 */
 	static function getProps() {
-		return 'timestamp|user|comment|url|size|sha1|metadata|mime';
+		return 'timestamp|user|comment|url|size|sha1|metadata|mime|mediatype';
 	}
 
 	// Dummy functions...
@@ -111,7 +111,7 @@ class ForeignAPIFile extends File {
 	 * @return bool|MediaTransformOutput
 	 */
 	function transform( $params, $flags = 0 ) {
-		if( !$this->canRender() ) {
+		if ( !$this->canRender() ) {
 			// show icon
 			return parent::transform( $params, $flags );
 		}
@@ -119,12 +119,25 @@ class ForeignAPIFile extends File {
 		// Note, the this->canRender() check above implies
 		// that we have a handler, and it can do makeParamString.
 		$otherParams = $this->handler->makeParamString( $params );
+		$width = isset( $params['width'] ) ? $params['width'] : -1;
+		$height = isset( $params['height'] ) ? $params['height'] : -1;
 
 		$thumbUrl = $this->repo->getThumbUrlFromCache(
 			$this->getName(),
-			isset( $params['width'] ) ? $params['width'] : -1,
-			isset( $params['height'] ) ? $params['height'] : -1,
-			$otherParams );
+			$width,
+			$height,
+			$otherParams
+		);
+		if ( $thumbUrl === false ) {
+			global $wgLang;
+			return $this->repo->getThumbError(
+				$this->getName(),
+				$width,
+				$height,
+				$otherParams,
+				$wgLang->getCode()
+			);
+		}
 		return $this->handler->getTransform( $this, 'bogus', $thumbUrl, $params );
 	}
 
@@ -161,12 +174,12 @@ class ForeignAPIFile extends File {
 	 * @return array
 	 */
 	public static function parseMetadata( $metadata ) {
-		if( !is_array( $metadata ) ) {
+		if ( !is_array( $metadata ) ) {
 			return $metadata;
 		}
 		$ret = array();
-		foreach( $metadata as $meta ) {
-			$ret[ $meta['name'] ] = self::parseMetadata( $meta['value'] );
+		foreach ( $metadata as $meta ) {
+			$ret[$meta['name']] = self::parseMetadata( $meta['value'] );
 		}
 		return $ret;
 	}
@@ -224,7 +237,7 @@ class ForeignAPIFile extends File {
 	 * @return string
 	 */
 	function getMimeType() {
-		if( !isset( $this->mInfo['mime'] ) ) {
+		if ( !isset( $this->mInfo['mime'] ) ) {
 			$magic = MimeMagic::singleton();
 			$this->mInfo['mime'] = $magic->guessTypesForExtension( $this->getExtension() );
 		}
@@ -232,10 +245,12 @@ class ForeignAPIFile extends File {
 	}
 
 	/**
-	 * @todo FIXME: May guess wrong on file types that can be eg audio or video
 	 * @return int|string
 	 */
 	function getMediaType() {
+		if ( isset( $this->mInfo['mediatype'] ) ) {
+			return $this->mInfo['mediatype'];
+		}
 		$magic = MimeMagic::singleton();
 		return $magic->getMediaType( null, $this->getMimeType() );
 	}
diff --git a/includes/filerepo/file/ForeignDBFile.php b/includes/filerepo/file/ForeignDBFile.php
index ee5883c4..01d6b0f5 100644
--- a/includes/filerepo/file/ForeignDBFile.php
+++ b/includes/filerepo/file/ForeignDBFile.php
@@ -120,10 +120,11 @@ class ForeignDBFile extends LocalFile {
 	}
 
 	/**
+	 * @param $lang Language Optional language to fetch description in.
 	 * @return string
 	 */
-	function getDescriptionText() {
+	function getDescriptionText( $lang = false ) {
 		// Restore remote behavior
-		return File::getDescriptionText();
+		return File::getDescriptionText( $lang );
 	}
 }
diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php
index 4f50bfaa..fe769be2 100644
--- a/includes/filerepo/file/LocalFile.php
+++ b/includes/filerepo/file/LocalFile.php
@@ -382,6 +382,7 @@ class LocalFile extends File {
 				$this->$name = $value;
 			}
 		} else {
+			wfProfileOut( $fname );
 			throw new MWException( "Could not find data for image '{$this->getName()}'." );
 		}
 
@@ -531,15 +532,15 @@ class LocalFile extends File {
 
 		$dbw->update( 'image',
 			array(
-				'img_size'       => $this->size, // sanity
-				'img_width'      => $this->width,
-				'img_height'     => $this->height,
-				'img_bits'       => $this->bits,
+				'img_size' => $this->size, // sanity
+				'img_width' => $this->width,
+				'img_height' => $this->height,
+				'img_bits' => $this->bits,
 				'img_media_type' => $this->media_type,
 				'img_major_mime' => $major,
 				'img_minor_mime' => $minor,
-				'img_metadata'   => $this->metadata,
-				'img_sha1'       => $this->sha1,
+				'img_metadata' => $dbw->encodeBlob($this->metadata),
+				'img_sha1' => $this->sha1,
 			),
 			array( 'img_name' => $this->getName() ),
 			__METHOD__
@@ -603,17 +604,23 @@ class LocalFile extends File {
 	 * Return the width of the image
 	 *
 	 * @param $page int
-	 * @return bool|int Returns false on error
+	 * @return int
 	 */
 	public function getWidth( $page = 1 ) {
 		$this->load();
 
 		if ( $this->isMultipage() ) {
-			$dim = $this->getHandler()->getPageDimensions( $this, $page );
+			$handler = $this->getHandler();
+			if ( !$handler ) {
+				return 0;
+			}
+			$dim = $handler->getPageDimensions( $this, $page );
 			if ( $dim ) {
 				return $dim['width'];
 			} else {
-				return false;
+				// For non-paged media, the false goes through an
+				// intval, turning failure into 0, so do same here.
+				return 0;
 			}
 		} else {
 			return $this->width;
@@ -624,17 +631,23 @@ class LocalFile extends File {
 	 * Return the height of the image
 	 *
 	 * @param $page int
-	 * @return bool|int Returns false on error
+	 * @return int
 	 */
 	public function getHeight( $page = 1 ) {
 		$this->load();
 
 		if ( $this->isMultipage() ) {
-			$dim = $this->getHandler()->getPageDimensions( $this, $page );
+			$handler = $this->getHandler();
+			if ( !$handler ) {
+				return 0;
+			}
+			$dim = $handler->getPageDimensions( $this, $page );
 			if ( $dim ) {
 				return $dim['height'];
 			} else {
-				return false;
+				// For non-paged media, the false goes through an
+				// intval, turning failure into 0, so do same here.
+				return 0;
 			}
 		} else {
 			return $this->height;
@@ -775,10 +788,12 @@ class LocalFile extends File {
 
 		$backend = $this->repo->getBackend();
 		$files = array( $dir );
-		$iterator = $backend->getFileList( array( 'dir' => $dir ) );
-		foreach ( $iterator as $file ) {
-			$files[] = $file;
-		}
+		try {
+			$iterator = $backend->getFileList( array( 'dir' => $dir ) );
+			foreach ( $iterator as $file ) {
+				$files[] = $file;
+			}
+		} catch ( FileBackendError $e ) {} // suppress (bug 54674)
 
 		return $files;
 	}
@@ -793,7 +808,9 @@ class LocalFile extends File {
 	}
 
 	/**
-	 * Purge the shared history (OldLocalFile) cache
+	 * Purge the shared history (OldLocalFile) cache.
+	 *
+	 * @note This used to purge old thumbnails as well.
 	 */
 	function purgeHistory() {
 		global $wgMemc;
@@ -801,20 +818,20 @@ class LocalFile extends File {
 		$hashedName = md5( $this->getName() );
 		$oldKey = $this->repo->getSharedCacheKey( 'oldfile', $hashedName );
 
-		// Must purge thumbnails for old versions too! bug 30192
-		foreach( $this->getHistory() as $oldFile ) {
-			$oldFile->purgeThumbnails();
-		}
-
 		if ( $oldKey ) {
 			$wgMemc->delete( $oldKey );
 		}
 	}
 
 	/**
-	 * Delete all previously generated thumbnails, refresh metadata in memcached and purge the squid
+	 * Delete all previously generated thumbnails, refresh metadata in memcached and purge the squid.
+	 *
+	 * @param Array $options An array potentially with the key forThumbRefresh.
+	 *
+	 * @note This used to purge old thumbnails by default as well, but doesn't anymore.
 	 */
 	function purgeCache( $options = array() ) {
+		wfProfileIn( __METHOD__ );
 		// Refresh metadata cache
 		$this->purgeMetadataCache();
 
@@ -823,6 +840,7 @@ class LocalFile extends File {
 
 		// Purge squid cache for this file
 		SquidUpdate::purge( array( $this->getURL() ) );
+		wfProfileOut( __METHOD__ );
 	}
 
 	/**
@@ -844,7 +862,7 @@ class LocalFile extends File {
 		// Purge the squid
 		if ( $wgUseSquid ) {
 			$urls = array();
-			foreach( $files as $file ) {
+			foreach ( $files as $file ) {
 				$urls[] = $this->getArchiveThumbUrl( $archiveName, $file );
 			}
 			SquidUpdate::purge( $urls );
@@ -865,7 +883,7 @@ class LocalFile extends File {
 		// Always purge all files from squid regardless of handler filters
 		if ( $wgUseSquid ) {
 			$urls = array();
-			foreach( $files as $file ) {
+			foreach ( $files as $file ) {
 				$urls[] = $this->getThumbUrl( $file );
 			}
 			array_shift( $urls ); // don't purge directory
@@ -1195,20 +1213,20 @@ class LocalFile extends File {
 		# doesn't deadlock. SELECT FOR UPDATE causes a deadlock for every race condition.
 		$dbw->insert( 'image',
 			array(
-				'img_name'        => $this->getName(),
-				'img_size'        => $this->size,
-				'img_width'       => intval( $this->width ),
-				'img_height'      => intval( $this->height ),
-				'img_bits'        => $this->bits,
-				'img_media_type'  => $this->media_type,
-				'img_major_mime'  => $this->major_mime,
-				'img_minor_mime'  => $this->minor_mime,
-				'img_timestamp'   => $timestamp,
+				'img_name' => $this->getName(),
+				'img_size' => $this->size,
+				'img_width' => intval( $this->width ),
+				'img_height' => intval( $this->height ),
+				'img_bits' => $this->bits,
+				'img_media_type' => $this->media_type,
+				'img_major_mime' => $this->major_mime,
+				'img_minor_mime' => $this->minor_mime,
+				'img_timestamp' => $timestamp,
 				'img_description' => $comment,
-				'img_user'        => $user->getId(),
-				'img_user_text'   => $user->getName(),
-				'img_metadata'    => $this->metadata,
-				'img_sha1'        => $this->sha1
+				'img_user' => $user->getId(),
+				'img_user_text' => $user->getName(),
+				'img_metadata' => $dbw->encodeBlob($this->metadata),
+				'img_sha1' => $this->sha1
 			),
 			__METHOD__,
 			'IGNORE'
@@ -1258,7 +1276,7 @@ class LocalFile extends File {
 					'img_description' => $comment,
 					'img_user'        => $user->getId(),
 					'img_user_text'   => $user->getName(),
-					'img_metadata'    => $this->metadata,
+					'img_metadata'    => $dbw->encodeBlob($this->metadata),
 					'img_sha1'        => $this->sha1
 				),
 				array( 'img_name' => $this->getName() ),
@@ -1274,20 +1292,45 @@ class LocalFile extends File {
 		$wikiPage->setFile( $this );
 
 		# Add the log entry
-		$log = new LogPage( 'upload' );
 		$action = $reupload ? 'overwrite' : 'upload';
-		$logId = $log->addEntry( $action, $descTitle, $comment, array(), $user );
 
-		wfProfileIn( __METHOD__ . '-edit' );
+		$logEntry = new ManualLogEntry( 'upload', $action );
+		$logEntry->setPerformer( $user );
+		$logEntry->setComment( $comment );
+		$logEntry->setTarget( $descTitle );
+
+		// Allow people using the api to associate log entries with the upload.
+		// Log has a timestamp, but sometimes different from upload timestamp.
+		$logEntry->setParameters(
+			array(
+				'img_sha1' => $this->sha1,
+				'img_timestamp' => $timestamp,
+			)
+		);
+		// Note we keep $logId around since during new image
+		// creation, page doesn't exist yet, so log_page = 0
+		// but we want it to point to the page we're making,
+		// so we later modify the log entry.
+		// For a similar reason, we avoid making an RC entry
+		// now and wait until the page exists.
+		$logId = $logEntry->insert();
+
 		$exists = $descTitle->exists();
+		if ( $exists ) {
+			// Page exists, do RC entry now (otherwise we wait for later).
+			$logEntry->publish( $logId );
+		}
+		wfProfileIn( __METHOD__ . '-edit' );
 
 		if ( $exists ) {
 			# Create a null revision
 			$latest = $descTitle->getLatestRevID();
+			$editSummary = LogFormatter::newFromEntry( $logEntry )->getPlainActionText();
+
 			$nullRevision = Revision::newNullRevision(
 				$dbw,
 				$descTitle->getArticleID(),
-				$log->getRcComment(),
+				$editSummary,
 				false
 			);
 			if ( !is_null( $nullRevision ) ) {
@@ -1315,16 +1358,20 @@ class LocalFile extends File {
 			$content = ContentHandler::makeContent( $pageText, $descTitle );
 			$status = $wikiPage->doEditContent( $content, $comment, EDIT_NEW | EDIT_SUPPRESS_RC, false, $user );
 
-			if ( isset( $status->value['revision'] ) ) { // XXX; doEdit() uses a transaction
-				$dbw->begin( __METHOD__ );
+			$dbw->begin( __METHOD__ ); // XXX; doEdit() uses a transaction
+			// Now that the page exists, make an RC entry.
+			$logEntry->publish( $logId );
+			if ( isset( $status->value['revision'] ) ) {
 				$dbw->update( 'logging',
 					array( 'log_page' => $status->value['revision']->getPage() ),
 					array( 'log_id' => $logId ),
 					__METHOD__
 				);
-				$dbw->commit( __METHOD__ ); // commit before anything bad can happen
 			}
+			$dbw->commit( __METHOD__ ); // commit before anything bad can happen
 		}
+
+
 		wfProfileOut( __METHOD__ . '-edit' );
 
 		# Save to cache and purge the squid
@@ -1351,11 +1398,17 @@ class LocalFile extends File {
 		# Invalidate cache for all pages using this file
 		$update = new HTMLCacheUpdate( $this->getTitle(), 'imagelinks' );
 		$update->doUpdate();
+		if ( !$reupload ) {
+			LinksUpdate::queueRecursiveJobsForTable( $this->getTitle(), 'imagelinks' );
+		}
 
 		# Invalidate cache for all pages that redirects on this page
 		$redirs = $this->getTitle()->getRedirectsHere();
 
 		foreach ( $redirs as $redir ) {
+			if ( !$reupload && $redir->getNamespace() === NS_FILE ) {
+				LinksUpdate::queueRecursiveJobsForTable( $redir, 'imagelinks' );
+			}
 			$update = new HTMLCacheUpdate( $redir, 'imagelinks' );
 			$update->doUpdate();
 		}
@@ -1405,7 +1458,7 @@ class LocalFile extends File {
 
 		$this->lock(); // begin
 
-		$archiveName = wfTimestamp( TS_MW ) . '!'. $this->getName();
+		$archiveName = wfTimestamp( TS_MW ) . '!' . $this->getName();
 		$archiveRel = 'archive/' . $this->getHashPath() . $archiveName;
 		$flags = $flags & File::DELETE_SOURCE ? LocalRepo::DELETE_SOURCE : 0;
 		$status = $this->repo->publish( $srcPath, $dstRel, $archiveRel, $flags, $options );
@@ -1454,18 +1507,27 @@ class LocalFile extends File {
 
 		wfDebugLog( 'imagemove', "Finished moving {$this->name}" );
 
-		$this->purgeEverything();
-		foreach ( $archiveNames as $archiveName ) {
-			$this->purgeOldThumbnails( $archiveName );
-		}
+		// Purge the source and target files...
+		$oldTitleFile = wfLocalFile( $this->title );
+		$newTitleFile = wfLocalFile( $target );
+		// Hack: the lock()/unlock() pair is nested in a transaction so the locking is not
+		// tied to BEGIN/COMMIT. To avoid slow purges in the transaction, move them outside.
+		$this->getRepo()->getMasterDB()->onTransactionIdle(
+			function() use ( $oldTitleFile, $newTitleFile, $archiveNames ) {
+				$oldTitleFile->purgeEverything();
+				foreach ( $archiveNames as $archiveName ) {
+					$oldTitleFile->purgeOldThumbnails( $archiveName );
+				}
+				$newTitleFile->purgeEverything();
+			}
+		);
+
 		if ( $status->isOK() ) {
 			// Now switch the object
 			$this->title = $target;
 			// Force regeneration of the name and hashpath
 			unset( $this->name );
 			unset( $this->hashPath );
-			// Purge the new image
-			$this->purgeEverything();
 		}
 
 		return $status;
@@ -1484,7 +1546,6 @@ class LocalFile extends File {
 	 * @return FileRepoStatus object.
 	 */
 	function delete( $reason, $suppress = false ) {
-		global $wgUseSquid;
 		if ( $this->getRepo()->getReadOnlyReason() !== false ) {
 			return $this->readOnlyFatalStatus();
 		}
@@ -1502,19 +1563,28 @@ class LocalFile extends File {
 			DeferredUpdates::addUpdate( SiteStatsUpdate::factory( array( 'images' => -1 ) ) );
 		}
 
-		$this->purgeEverything();
-		foreach ( $archiveNames as $archiveName ) {
-			$this->purgeOldThumbnails( $archiveName );
-		}
+		// Hack: the lock()/unlock() pair is nested in a transaction so the locking is not
+		// tied to BEGIN/COMMIT. To avoid slow purges in the transaction, move them outside.
+		$file = $this;
+		$this->getRepo()->getMasterDB()->onTransactionIdle(
+			function() use ( $file, $archiveNames ) {
+				global $wgUseSquid;
 
-		if ( $wgUseSquid ) {
-			// Purge the squid
-			$purgeUrls = array();
-			foreach ($archiveNames as $archiveName ) {
-				$purgeUrls[] = $this->getArchiveUrl( $archiveName );
+				$file->purgeEverything();
+				foreach ( $archiveNames as $archiveName ) {
+					$file->purgeOldThumbnails( $archiveName );
+				}
+
+				if ( $wgUseSquid ) {
+					// Purge the squid
+					$purgeUrls = array();
+					foreach ( $archiveNames as $archiveName ) {
+						$purgeUrls[] = $file->getArchiveUrl( $archiveName );
+					}
+					SquidUpdate::purge( $purgeUrls );
+				}
 			}
-			SquidUpdate::purge( $purgeUrls );
-		}
+		);
 
 		return $status;
 	}
@@ -1606,21 +1676,27 @@ class LocalFile extends File {
 	 * @return String
 	 */
 	function getDescriptionUrl() {
-		return $this->title->getLocalUrl();
+		return $this->title->getLocalURL();
 	}
 
 	/**
 	 * Get the HTML text of the description page
 	 * This is not used by ImagePage for local files, since (among other things)
 	 * it skips the parser cache.
+	 *
+	 * @param $lang Language What language to get description in (Optional)
 	 * @return bool|mixed
 	 */
-	function getDescriptionText() {
+	function getDescriptionText( $lang = null ) {
 		$revision = Revision::newFromTitle( $this->title, false, Revision::READ_NORMAL );
-		if ( !$revision ) return false;
+		if ( !$revision ) {
+			return false;
+		}
 		$content = $revision->getContent();
-		if ( !$content ) return false;
-		$pout = $content->getParserOutput( $this->title, null, new ParserOptions() );
+		if ( !$content ) {
+			return false;
+		}
+		$pout = $content->getParserOutput( $this->title, null, new ParserOptions( null, $lang ) );
 		return $pout->getText();
 	}
 
@@ -1674,11 +1750,13 @@ class LocalFile extends File {
 	}
 
 	/**
-	 * @return bool
+	 * @return bool Whether to cache in RepoGroup (this avoids OOMs)
 	 */
 	function isCacheable() {
 		$this->load();
-		return strlen( $this->metadata ) <= self::CACHE_FIELD_MAX_LEN; // avoid OOMs
+		// If extra data (metadata) was not loaded then it must have been large
+		return $this->extraDataLoaded
+			&& strlen( serialize( $this->metadata ) ) <= self::CACHE_FIELD_MAX_LEN;
 	}
 
 	/**
@@ -1695,6 +1773,16 @@ class LocalFile extends File {
 				$this->lockedOwnTrx = true;
 			}
 			$this->locked++;
+			// Bug 54736: use simple lock to handle when the file does not exist.
+			// SELECT FOR UPDATE only locks records not the gaps where there are none.
+			$cache = wfGetMainCache();
+			$key = $this->getCacheKey();
+			if ( !$cache->lock( $key, 60 ) ) {
+				throw new MWException( "Could not acquire lock for '{$this->getName()}.'" );
+			}
+			$dbw->onTransactionIdle( function() use ( $cache, $key ) {
+				$cache->unlock( $key ); // release on commit
+			} );
 		}
 
 		return $dbw->selectField( 'image', '1',
@@ -2189,7 +2277,7 @@ class LocalFileRestoreBatch {
 			$deletedRel = $this->file->repo->getDeletedHashPath( $row->fa_storage_key ) . $row->fa_storage_key;
 			$deletedUrl = $this->file->repo->getVirtualUrl() . '/deleted/' . $deletedRel;
 
-			if( isset( $row->fa_sha1 ) ) {
+			if ( isset( $row->fa_sha1 ) ) {
 				$sha1 = $row->fa_sha1;
 			} else {
 				// old row, populate from key
diff --git a/includes/filerepo/file/OldLocalFile.php b/includes/filerepo/file/OldLocalFile.php
index 5c505928..2c545963 100644
--- a/includes/filerepo/file/OldLocalFile.php
+++ b/includes/filerepo/file/OldLocalFile.php
@@ -218,6 +218,7 @@ class OldLocalFile extends LocalFile {
 				$this->$name = $value;
 			}
 		} else {
+			wfProfileOut( __METHOD__ );
 			throw new MWException( "Could not find data for image '{$this->archive_name}'." );
 		}
 
@@ -290,7 +291,7 @@ class OldLocalFile extends LocalFile {
 	 */
 	function isDeleted( $field ) {
 		$this->load();
-		return ($this->deleted & $field) == $field;
+		return ( $this->deleted & $field ) == $field;
 	}
 
 	/**
diff --git a/includes/gallery/ImageGalleryBase.php b/includes/gallery/ImageGalleryBase.php
new file mode 100644
index 00000000..f8b8c505
--- /dev/null
+++ b/includes/gallery/ImageGalleryBase.php
@@ -0,0 +1,331 @@
+<?php
+/**
+ * Image gallery.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Image gallery
+ *
+ * Add images to the gallery using add(), then render that list to HTML using toHTML().
+ *
+ * @ingroup Media
+ */
+abstract class ImageGalleryBase extends ContextSource {
+	var $mImages, $mShowBytes, $mShowFilename, $mMode;
+	var $mCaption = false;
+
+	/**
+	 * Hide blacklisted images?
+	 */
+	var $mHideBadImages;
+
+	/**
+	 * Registered parser object for output callbacks
+	 * @var Parser
+	 */
+	var $mParser;
+
+	/**
+	 * Contextual title, used when images are being screened
+	 * against the bad image list
+	 */
+	protected $contextTitle = false;
+
+	protected $mAttribs = array();
+
+	static private $modeMapping = false;
+
+	/**
+	 * Get a new image gallery. This is the method other callers
+	 * should use to get a gallery.
+	 *
+	 * @param String|bool $mode Mode to use. False to use the default.
+	 */
+	static function factory( $mode = false ) {
+		global $wgGalleryOptions, $wgContLang;
+		self::loadModes();
+		if ( !$mode ) {
+			$mode = $wgGalleryOptions['mode'];
+		}
+
+		$mode = $wgContLang->lc( $mode );
+
+		if ( isset( self::$modeMapping[$mode] ) ) {
+			return new self::$modeMapping[$mode]( $mode );
+		} else {
+			throw new MWException( "No gallery class registered for mode $mode" );
+		}
+	}
+
+	static private function loadModes() {
+		if ( self::$modeMapping === false ) {
+			self::$modeMapping = array(
+				'traditional' => 'TraditionalImageGallery',
+				'nolines' => 'NolinesImageGallery',
+				'packed' => 'PackedImageGallery',
+				'packed-hover' => 'PackedHoverImageGallery',
+				'packed-overlay' => 'PackedOverlayImageGallery',
+			);
+			// Allow extensions to make a new gallery format.
+			wfRunHooks( 'GalleryGetModes', self::$modeMapping );
+		}
+	}
+
+	/**
+	 * Create a new image gallery object.
+	 *
+	 * You should not call this directly, but instead use
+	 * ImageGalleryBase::factory().
+	 */
+	function __construct( $mode = 'traditional' ) {
+		global $wgGalleryOptions;
+		$this->mImages = array();
+		$this->mShowBytes = $wgGalleryOptions['showBytes'];
+		$this->mShowFilename = true;
+		$this->mParser = false;
+		$this->mHideBadImages = false;
+		$this->mPerRow = $wgGalleryOptions['imagesPerRow'];
+		$this->mWidths = $wgGalleryOptions['imageWidth'];
+		$this->mHeights = $wgGalleryOptions['imageHeight'];
+		$this->mCaptionLength = $wgGalleryOptions['captionLength'];
+		$this->mMode = $mode;
+	}
+
+	/**
+	 * Register a parser object. If you do not set this
+	 * and the output of this gallery ends up in parser
+	 * cache, the javascript will break!
+	 *
+	 * @note This also triggers using the page's target
+	 *  language instead of the user language.
+	 *
+	 * @param $parser Parser
+	 */
+	function setParser( $parser ) {
+		$this->mParser = $parser;
+	}
+
+	/**
+	 * Set bad image flag
+	 */
+	function setHideBadImages( $flag = true ) {
+		$this->mHideBadImages = $flag;
+	}
+
+	/**
+	 * Set the caption (as plain text)
+	 *
+	 * @param string $caption Caption
+	 */
+	function setCaption( $caption ) {
+		$this->mCaption = htmlspecialchars( $caption );
+	}
+
+	/**
+	 * Set the caption (as HTML)
+	 *
+	 * @param string $caption Caption
+	 */
+	public function setCaptionHtml( $caption ) {
+		$this->mCaption = $caption;
+	}
+
+	/**
+	 * Set how many images will be displayed per row.
+	 *
+	 * @param $num Integer >= 0; If perrow=0 the gallery layout will adapt to screensize
+	 * invalid numbers will be rejected
+	 */
+	public function setPerRow( $num ) {
+		if ( $num >= 0 ) {
+			$this->mPerRow = (int)$num;
+		}
+	}
+
+	/**
+	 * Set how wide each image will be, in pixels.
+	 *
+	 * @param $num Integer > 0; invalid numbers will be ignored
+	 */
+	public function setWidths( $num ) {
+		if ( $num > 0 ) {
+			$this->mWidths = (int)$num;
+		}
+	}
+
+	/**
+	 * Set how high each image will be, in pixels.
+	 *
+	 * @param $num Integer > 0; invalid numbers will be ignored
+	 */
+	public function setHeights( $num ) {
+		if ( $num > 0 ) {
+			$this->mHeights = (int)$num;
+		}
+	}
+
+	/**
+	 * Allow setting additional options. This is meant
+	 * to allow extensions to add additional parameters to
+	 * <gallery> parser tag.
+	 *
+	 * @param Array $options Attributes of gallery tag.
+	 */
+	public function setAdditionalOptions( $options ) { }
+
+	/**
+	 * Instruct the class to use a specific skin for rendering
+	 *
+	 * @param $skin Skin object
+	 * @deprecated since 1.18 Not used anymore
+	 */
+	function useSkin( $skin ) {
+		wfDeprecated( __METHOD__, '1.18' );
+		/* no op */
+	}
+
+	/**
+	 * Add an image to the gallery.
+	 *
+	 * @param $title Title object of the image that is added to the gallery
+	 * @param $html  String: Additional HTML text to be shown. The name and size of the image are always shown.
+	 * @param $alt   String: Alt text for the image
+	 * @param $link  String: Override image link (optional)
+	 * @param $handlerOpts Array: Array of options for image handler (aka page number)
+	 */
+	function add( $title, $html = '', $alt = '', $link = '', $handlerOpts = array() ) {
+		if ( $title instanceof File ) {
+			// Old calling convention
+			$title = $title->getTitle();
+		}
+		$this->mImages[] = array( $title, $html, $alt, $link, $handlerOpts );
+		wfDebug( 'ImageGallery::add ' . $title->getText() . "\n" );
+	}
+
+	/**
+	 * Add an image at the beginning of the gallery.
+	 *
+	 * @param $title Title object of the image that is added to the gallery
+	 * @param $html  String: Additional HTML text to be shown. The name and size of the image are always shown.
+	 * @param $alt   String: Alt text for the image
+	 * @param $link  String: Override image link (optional)
+	 * @param $handlerOpts Array: Array of options for image handler (aka page number)
+	 */
+	function insert( $title, $html = '', $alt = '', $link = '', $handlerOpts = array() ) {
+		if ( $title instanceof File ) {
+			// Old calling convention
+			$title = $title->getTitle();
+		}
+		array_unshift( $this->mImages, array( &$title, $html, $alt, $link, $handlerOpts ) );
+	}
+
+	/**
+	 * isEmpty() returns true if the gallery contains no images
+	 * @return bool
+	 */
+	function isEmpty() {
+		return empty( $this->mImages );
+	}
+
+	/**
+	 * Enable/Disable showing of the file size of an image in the gallery.
+	 * Enabled by default.
+	 *
+	 * @param $f Boolean: set to false to disable.
+	 */
+	function setShowBytes( $f ) {
+		$this->mShowBytes = (bool)$f;
+	}
+
+	/**
+	 * Enable/Disable showing of the filename of an image in the gallery.
+	 * Enabled by default.
+	 *
+	 * @param $f Boolean: set to false to disable.
+	 */
+	function setShowFilename( $f ) {
+		$this->mShowFilename = (bool)$f;
+	}
+
+	/**
+	 * Set arbitrary attributes to go on the HTML gallery output element.
+	 * Should be suitable for a <ul> element.
+	 *
+	 * Note -- if taking from user input, you should probably run through
+	 * Sanitizer::validateAttributes() first.
+	 *
+	 * @param array $attribs of HTML attribute pairs
+	 */
+	function setAttributes( $attribs ) {
+		$this->mAttribs = $attribs;
+	}
+
+	/**
+	 * Display an html representation of the gallery
+	 *
+	 * @return String The html
+	 */
+	abstract public function toHTML();
+
+	/**
+	 * @return Integer: number of images in the gallery
+	 */
+	public function count() {
+		return count( $this->mImages );
+	}
+
+	/**
+	 * Set the contextual title
+	 *
+	 * @param $title Title: contextual title
+	 */
+	public function setContextTitle( $title ) {
+		$this->contextTitle = $title;
+	}
+
+	/**
+	 * Get the contextual title, if applicable
+	 *
+	 * @return mixed Title or false
+	 */
+	public function getContextTitle() {
+		return is_object( $this->contextTitle ) && $this->contextTitle instanceof Title
+			? $this->contextTitle
+			: false;
+	}
+
+	/**
+	 * Determines the correct language to be used for this image gallery
+	 * @return Language object
+	 */
+	protected function getRenderLang() {
+		return $this->mParser
+			? $this->mParser->getTargetLanguage()
+			: $this->getLanguage();
+	}
+
+	/* Old constants no longer used.
+	const THUMB_PADDING = 30;
+	const GB_PADDING = 5;
+	const GB_BORDERS = 8;
+	*/
+
+}
+
diff --git a/includes/gallery/NolinesImageGallery.php b/includes/gallery/NolinesImageGallery.php
new file mode 100644
index 00000000..6b0d0fa6
--- /dev/null
+++ b/includes/gallery/NolinesImageGallery.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Nolines image gallery. Like "traditional" but without borders and
+ * less padding.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class NolinesImageGallery extends TraditionalImageGallery {
+
+	protected function getThumbPadding() {
+		return 0;
+	}
+
+	protected function getGBBorders() {
+		// This accounts for extra space between <li> elements.
+		return 4;
+	}
+
+	protected function getVPad( $boxHeight, $thumbHeight ) {
+		return 0;
+	}
+}
diff --git a/includes/gallery/PackedImageGallery.php b/includes/gallery/PackedImageGallery.php
new file mode 100644
index 00000000..963ee6b9
--- /dev/null
+++ b/includes/gallery/PackedImageGallery.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * Packed image gallery. All images adjusted to be same height.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class PackedImageGallery extends TraditionalImageGallery {
+
+	function __construct( $mode = 'traditional' ) {
+		parent::__construct( $mode );
+		// Does not support per row option.
+		$this->mPerRow = 0;
+	}
+
+	/**
+	 * We artificially have 1.5 the resolution neccessary so that
+	 * we can scale it up by that much on the client side, without
+	 * worrying about requesting a new image.
+	 */
+	const SCALE_FACTOR = 1.5;
+
+	protected function getVPad( $boxHeight, $thumbHeight ) {
+		return ( $this->getThumbPadding() + $boxHeight - $thumbHeight / self::SCALE_FACTOR ) / 2;
+	}
+
+	protected function getThumbPadding() {
+		return 0;
+	}
+
+	protected function getGBPadding() {
+		return 2;
+	}
+
+	/**
+	 * @param File $img The file being transformed. May be false
+	 */
+	protected function getThumbParams( $img ) {
+		if ( $img && $img->getMediaType() === MEDIATYPE_AUDIO ) {
+			$width = $this->mWidths;
+		} else {
+			// We want the width not to be the constraining
+			// factor, so use random big number.
+			$width = $this->mHeights * 10 + 100;
+		}
+		// self::SCALE_FACTOR so the js has some room to manipulate sizes.
+		return array(
+			'width' => $width * self::SCALE_FACTOR,
+			'height' => $this->mHeights * self::SCALE_FACTOR,
+		);
+	}
+
+	protected function getThumbDivWidth( $thumbWidth ) {
+		// Require at least 60px wide, so caption is wide enough to work.
+		if ( $thumbWidth < 60 * self::SCALE_FACTOR ) {
+			$thumbWidth = 60 * self::SCALE_FACTOR;
+		}
+		return $thumbWidth / self::SCALE_FACTOR + $this->getThumbPadding();
+	}
+
+	/**
+	 * @param MediaTransformOutput|bool $thumb the thumbnail, or false if no thumb (which can happen)
+	 */
+	protected function getGBWidth( $thumb ) {
+		$thumbWidth = $thumb ? $thumb->getWidth() : $this->mWidths * self::SCALE_FACTOR;
+		return $this->getThumbDivWidth( $thumbWidth ) + $this->getGBPadding();
+	}
+
+	protected function adjustImageParameters( $thumb, &$imageParameters ) {
+		// Re-adjust back to normal size.
+		$imageParameters['override-width'] = ceil( $thumb->getWidth() / self::SCALE_FACTOR );
+		$imageParameters['override-height'] = ceil( $thumb->getHeight() / self::SCALE_FACTOR );
+	}
+
+	/**
+	 * Add javascript which auto-justifies the rows by manipulating the image sizes.
+	 * Also ensures that the hover version of this degrades gracefully.
+	 */
+	protected function getModules() {
+		return array( 'mediawiki.page.gallery' );
+	}
+
+	/**
+	 * Do not support per-row on packed. It really doesn't work
+	 * since the images have varying widths.
+	 */
+	public function setPerRow( $num ) {
+		return;
+	}
+}
diff --git a/includes/gallery/PackedOverlayImageGallery.php b/includes/gallery/PackedOverlayImageGallery.php
new file mode 100644
index 00000000..bba06fcf
--- /dev/null
+++ b/includes/gallery/PackedOverlayImageGallery.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Packed overlay image gallery. All images adjusted to be same height and
+ * image caption being placed over top of image.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class PackedOverlayImageGallery extends PackedImageGallery {
+
+	/**
+	 * Add the wrapper html around the thumb's caption
+	 *
+	 * @param String $galleryText The caption
+	 * @param MediaTransformOutput|boolean $thumb The thumb this caption is for or false for bad image.
+	 */
+	protected function wrapGalleryText( $galleryText, $thumb ) {
+
+		// If we have no text, do not output anything to avoid
+		// ugly white overlay.
+		if ( trim( $galleryText ) === '' ) {
+			return '';
+		}
+
+		# ATTENTION: The newline after <div class="gallerytext"> is needed to accommodate htmltidy which
+		# in version 4.8.6 generated crackpot html in its absence, see:
+		# http://bugzilla.wikimedia.org/show_bug.cgi?id=1765 -Ævar
+
+		$thumbWidth = $this->getGBWidth( $thumb ) - $this->getThumbPadding() - $this->getGBPadding();
+		$captionWidth = ceil( $thumbWidth - 20 );
+
+		$outerWrapper = '<div class="gallerytextwrapper" style="width: ' . $captionWidth . 'px">';
+		return "\n\t\t\t" . $outerWrapper . '<div class="gallerytext">' . "\n"
+					. $galleryText
+					. "\n\t\t\t</div>";
+	}
+}
+
+/**
+ * Same as Packed except different CSS is applied to make the
+ * caption only show up on hover. If a touch screen is detected,
+ * falls back to PackedHoverGallery. Degrades gracefully for
+ * screen readers.
+ */
+class PackedHoverImageGallery extends PackedOverlayImageGallery { }
diff --git a/includes/gallery/TraditionalImageGallery.php b/includes/gallery/TraditionalImageGallery.php
new file mode 100644
index 00000000..1f60fa69
--- /dev/null
+++ b/includes/gallery/TraditionalImageGallery.php
@@ -0,0 +1,328 @@
+<?php
+/**
+ * Image gallery.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class TraditionalImageGallery extends ImageGalleryBase {
+
+
+	/**
+	 * Return a HTML representation of the image gallery
+	 *
+	 * For each image in the gallery, display
+	 * - a thumbnail
+	 * - the image name
+	 * - the additional text provided when adding the image
+	 * - the size of the image
+	 *
+	 * @return string
+	 */
+	function toHTML() {
+		if ( $this->mPerRow > 0 ) {
+			$maxwidth = $this->mPerRow * ( $this->mWidths + $this->getAllPadding() );
+			$oldStyle = isset( $this->mAttribs['style'] ) ? $this->mAttribs['style'] : '';
+			# _width is ignored by any sane browser. IE6 doesn't know max-width so it uses _width instead
+			$this->mAttribs['style'] = "max-width: {$maxwidth}px;_width: {$maxwidth}px;" . $oldStyle;
+		}
+
+		$attribs = Sanitizer::mergeAttributes(
+			array( 'class' => 'gallery mw-gallery-' . $this->mMode ), $this->mAttribs );
+
+		$modules = $this->getModules();
+
+		if ( $this->mParser ) {
+			$this->mParser->getOutput()->addModules( $modules );
+		} else {
+			$this->getOutput()->addModules( $modules );
+		}
+		$output = Xml::openElement( 'ul', $attribs );
+		if ( $this->mCaption ) {
+			$output .= "\n\t<li class='gallerycaption'>{$this->mCaption}</li>";
+		}
+
+		$lang = $this->getRenderLang();
+		# Output each image...
+		foreach ( $this->mImages as $pair ) {
+			$nt = $pair[0];
+			$text = $pair[1]; # "text" means "caption" here
+			$alt = $pair[2];
+			$link = $pair[3];
+
+			$descQuery = false;
+			if ( $nt->getNamespace() === NS_FILE ) {
+				# Get the file...
+				if ( $this->mParser instanceof Parser ) {
+					# Give extensions a chance to select the file revision for us
+					$options = array();
+					wfRunHooks( 'BeforeParserFetchFileAndTitle',
+						array( $this->mParser, $nt, &$options, &$descQuery ) );
+					# Fetch and register the file (file title may be different via hooks)
+					list( $img, $nt ) = $this->mParser->fetchFileAndTitle( $nt, $options );
+				} else {
+					$img = wfFindFile( $nt );
+				}
+			} else {
+				$img = false;
+			}
+
+			$params = $this->getThumbParams( $img );
+			// $pair[4] is per image handler options
+			$transformOptions = $params + $pair[4];
+
+			$thumb = false;
+
+			if ( !$img ) {
+				# We're dealing with a non-image, spit out the name and be done with it.
+				$thumbhtml = "\n\t\t\t" . '<div class="thumb" style="height: ' . ( $this->getThumbPadding() + $this->mHeights ) . 'px;">'
+					. htmlspecialchars( $nt->getText() ) . '</div>';
+
+				if ( $this->mParser instanceof Parser ) {
+					$this->mParser->addTrackingCategory( 'broken-file-category' );
+				}
+			} elseif ( $this->mHideBadImages && wfIsBadImage( $nt->getDBkey(), $this->getContextTitle() ) ) {
+				# The image is blacklisted, just show it as a text link.
+				$thumbhtml = "\n\t\t\t" . '<div class="thumb" style="height: ' . ( $this->getThumbPadding() + $this->mHeights ) . 'px;">' .
+					Linker::link(
+						$nt,
+						htmlspecialchars( $nt->getText() ),
+						array(),
+						array(),
+						array( 'known', 'noclasses' )
+					) .
+					'</div>';
+			} elseif ( !( $thumb = $img->transform( $transformOptions ) ) ) {
+				# Error generating thumbnail.
+				$thumbhtml = "\n\t\t\t" . '<div class="thumb" style="height: ' . ( $this->getThumbPadding() + $this->mHeights ) . 'px;">'
+					. htmlspecialchars( $img->getLastError() ) . '</div>';
+			} else {
+				$vpad = $this->getVPad( $this->mHeights, $thumb->getHeight() );
+
+				$imageParameters = array(
+					'desc-link' => true,
+					'desc-query' => $descQuery,
+					'alt' => $alt,
+					'custom-url-link' => $link
+				);
+				# In the absence of both alt text and caption, fall back on providing screen readers with the filename as alt text
+				if ( $alt == '' && $text == '' ) {
+					$imageParameters['alt'] = $nt->getText();
+				}
+
+				$this->adjustImageParameters( $thumb, $imageParameters );
+
+				# Set both fixed width and min-height.
+				$thumbhtml = "\n\t\t\t" .
+					'<div class="thumb" style="width: ' . $this->getThumbDivWidth( $thumb->getWidth() ) . 'px;">'
+					# Auto-margin centering for block-level elements. Needed now that we have video
+					# handlers since they may emit block-level elements as opposed to simple <img> tags.
+					# ref http://css-discuss.incutio.com/?page=CenteringBlockElement
+					. '<div style="margin:' . $vpad . 'px auto;">'
+					. $thumb->toHtml( $imageParameters ) . '</div></div>';
+
+				// Call parser transform hook
+				if ( $this->mParser && $img->getHandler() ) {
+					$img->getHandler()->parserTransformHook( $this->mParser, $img );
+				}
+			}
+
+			//TODO
+			// $linkTarget = Title::newFromText( $wgContLang->getNsText( MWNamespace::getUser() ) . ":{$ut}" );
+			// $ul = Linker::link( $linkTarget, $ut );
+
+			if ( $this->mShowBytes ) {
+				if ( $img ) {
+					$fileSize = htmlspecialchars( $lang->formatSize( $img->getSize() ) );
+				} else {
+					$fileSize = $this->msg( 'filemissing' )->escaped();
+				}
+				$fileSize = "$fileSize<br />\n";
+			} else {
+				$fileSize = '';
+			}
+
+			$textlink = $this->mShowFilename ?
+				Linker::link(
+					$nt,
+					htmlspecialchars( $lang->truncate( $nt->getText(), $this->mCaptionLength ) ),
+					array(),
+					array(),
+					array( 'known', 'noclasses' )
+				) . "<br />\n" :
+				'';
+
+
+			$galleryText = $textlink . $text . $fileSize;
+			$galleryText = $this->wrapGalleryText( $galleryText, $thumb );
+
+			# Weird double wrapping (the extra div inside the li) needed due to FF2 bug
+			# Can be safely removed if FF2 falls completely out of existence
+			$output .=
+				"\n\t\t" . '<li class="gallerybox" style="width: ' . $this->getGBWidth( $thumb ) . 'px">'
+					. '<div style="width: ' . $this->getGBWidth( $thumb ) . 'px">'
+					. $thumbhtml
+					. $galleryText
+					. "\n\t\t</div></li>";
+		}
+		$output .= "\n</ul>";
+
+		return $output;
+	}
+
+
+	/**
+	 * Add the wrapper html around the thumb's caption
+	 *
+	 * @param String $galleryText The caption
+	 * @param MediaTransformOutput|boolean $thumb The thumb this caption is for or false for bad image.
+	 */
+	protected function wrapGalleryText( $galleryText, $thumb ) {
+		# ATTENTION: The newline after <div class="gallerytext"> is needed to accommodate htmltidy which
+		# in version 4.8.6 generated crackpot html in its absence, see:
+		# http://bugzilla.wikimedia.org/show_bug.cgi?id=1765 -Ævar
+
+		return "\n\t\t\t" . '<div class="gallerytext">' . "\n"
+					. $galleryText
+					. "\n\t\t\t</div>";
+	}
+
+	/**
+	 * How much padding such the thumb have between image and inner div that
+	 * that contains the border. This is both for verical and horizontal
+	 * padding. (However, it is cut in half in the vertical direction).
+	 * @return int
+	 */
+	protected function getThumbPadding() {
+		return 30;
+	}
+
+	/**
+	 *
+	 * @note GB stands for gallerybox (as in the <li class="gallerybox"> element)
+	 *
+	 * @return int
+	 */
+	protected function getGBPadding() {
+		return 5;
+	}
+
+	/**
+	 * Get how much extra space the borders around the image takes up.
+	 *
+	 * For this mode, it is 2px borders on each side + 2px implied padding on
+	 * each side from the stylesheet, giving us 2*2+2*2 = 8.
+	 * @return int
+	 */
+	protected function getGBBorders() {
+		return 8;
+	}
+
+	/**
+	 * Get total padding.
+	 *
+	 * @return int How many pixels of whitespace surround the thumbnail.
+	 */
+	protected function getAllPadding() {
+		return $this->getThumbPadding() + $this->getGBPadding() + $this->getGBBorders();
+	}
+
+	/**
+	 * Get vertical padding for a thumbnail
+	 *
+	 * Generally this is the total height minus how high the thumb is.
+	 *
+	 * @param int $boxHeight How high we want the box to be.
+	 * @param int $thumbHeight How high the thumbnail is.
+	 * @return int How many vertical padding to add on each side.
+	 */
+	protected function getVPad( $boxHeight, $thumbHeight ) {
+		return ( $this->getThumbPadding() + $boxHeight - $thumbHeight ) / 2;
+	}
+
+	/**
+	 * Get the transform parameters for a thumbnail.
+	 *
+	 * @param File $img The file in question. May be false for invalid image
+	 */
+	protected function getThumbParams( $img ) {
+		return array(
+			'width' => $this->mWidths,
+			'height' => $this->mHeights
+		);
+	}
+
+	/**
+	 * Get the width of the inner div that contains the thumbnail in
+	 * question. This is the div with the class of "thumb".
+	 *
+	 * @param int $thumbWidth The width of the thumbnail.
+	 * @return int Width of inner thumb div.
+	 */
+	protected function getThumbDivWidth( $thumbWidth ) {
+		return $this->mWidths + $this->getThumbPadding();
+	}
+
+	/**
+	 * Width of gallerybox <li>.
+	 *
+	 * Generally is the width of the image, plus padding on image
+	 * plus padding on gallerybox.
+	 *
+	 * @note Important: parameter will be false if no thumb used.
+	 * @param Mixed $thumb MediaTransformObject object or false.
+	 * @return int width of gallerybox element
+	 */
+	protected function getGBWidth( $thumb ) {
+		return $this->mWidths + $this->getThumbPadding() + $this->getGBPadding();
+	}
+
+	/**
+	 * Get a list of modules to include in the page.
+	 *
+	 * Primarily intended for subclasses.
+	 *
+	 * @return Array modules to include
+	 */
+	protected function getModules() {
+		return array();
+	}
+
+	/**
+	 * Adjust the image parameters for a thumbnail.
+	 *
+	 * Used by a subclass to insert extra high resolution images.
+	 * @param MediaTransformOutput $thumb The thumbnail
+	 * @param Array $imageParameters Array of options
+	 */
+	protected function adjustImageParameters( $thumb, &$imageParameters ) { }
+}
+
+/**
+ * Backwards compatibility. This always uses traditional mode
+ * if called the old way, for extensions that may expect traditional
+ * mode.
+ *
+ * @deprecated 1.22 Use ImageGalleryBase::factory instead.
+ */
+class ImageGallery extends TraditionalImageGallery {
+	function __construct( $mode = 'traditional' ) {
+		wfDeprecated( __METHOD__, '1.22' );
+		parent::__construct( $mode );
+	}
+}
diff --git a/includes/installer/CliInstaller.php b/includes/installer/CliInstaller.php
index bb7e8776..f944fbed 100644
--- a/includes/installer/CliInstaller.php
+++ b/includes/installer/CliInstaller.php
@@ -114,7 +114,7 @@ class CliInstaller extends Installer {
 	 */
 	public function execute() {
 		$vars = Installer::getExistingLocalSettings();
-		if( $vars ) {
+		if ( $vars ) {
 			$this->showStatusMessage(
 				Status::newFatal( "config-localsettings-cli-upgrade" )
 			);
@@ -137,6 +137,8 @@ class CliInstaller extends Installer {
 	}
 
 	public function startStage( $step ) {
+		// Messages: config-install-database, config-install-tables, config-install-interwiki,
+		// config-install-stats, config-install-keys, config-install-sysop, config-install-mainpage
 		$this->showMessage( "config-install-$step" );
 	}
 
@@ -166,6 +168,7 @@ class CliInstaller extends Installer {
 		$text = wfMessage( $msg, $params )->parse();
 
 		$text = preg_replace( '/<a href="(.*?)".*?>(.*?)<\/a>/', '$2 &lt;$1&gt;', $text );
+
 		return html_entity_decode( strip_tags( $text ), ENT_QUOTES );
 	}
 
@@ -195,15 +198,17 @@ class CliInstaller extends Installer {
 		if ( !$this->specifiedScriptPath ) {
 			$this->showMessage( 'config-no-cli-uri', $this->getVar( "wgScriptPath" ) );
 		}
+
 		return parent::envCheckPath();
 	}
 
 	protected function envGetDefaultServer() {
-		return $this->getVar( 'wgServer' );
+		return null; // Do not guess if installing from CLI
 	}
 
 	public function dirIsExecutable( $dir, $url ) {
 		$this->showMessage( 'config-no-cli-uploads-check', $dir );
+
 		return false;
 	}
 }
diff --git a/includes/installer/DatabaseInstaller.php b/includes/installer/DatabaseInstaller.php
index 3472b7ff..0110ac52 100644
--- a/includes/installer/DatabaseInstaller.php
+++ b/includes/installer/DatabaseInstaller.php
@@ -32,7 +32,7 @@ abstract class DatabaseInstaller {
 	/**
 	 * The Installer object.
 	 *
-	 * TODO: naming this parent is confusing, 'installer' would be clearer.
+	 * @todo Naming this parent is confusing, 'installer' would be clearer.
 	 *
 	 * @var WebInstaller
 	 */
@@ -158,6 +158,7 @@ abstract class DatabaseInstaller {
 			$this->db->clearFlag( DBO_TRX );
 			$this->db->commit( __METHOD__ );
 		}
+
 		return $status;
 	}
 
@@ -173,9 +174,10 @@ abstract class DatabaseInstaller {
 		}
 		$this->db->selectDB( $this->getVar( 'wgDBname' ) );
 
-		if( $this->db->tableExists( 'archive', __METHOD__ ) ) {
+		if ( $this->db->tableExists( 'archive', __METHOD__ ) ) {
 			$status->warning( 'config-install-tables-exist' );
 			$this->enableLB();
+
 			return $status;
 		}
 
@@ -183,7 +185,7 @@ abstract class DatabaseInstaller {
 		$this->db->begin( __METHOD__ );
 
 		$error = $this->db->sourceFile( $this->db->getSchemaPath() );
-		if( $error !== true ) {
+		if ( $error !== true ) {
 			$this->db->reportQueryError( $error, 0, '', __METHOD__ );
 			$this->db->rollback( __METHOD__ );
 			$status->fatal( 'config-install-tables-failed', $error );
@@ -191,9 +193,10 @@ abstract class DatabaseInstaller {
 			$this->db->commit( __METHOD__ );
 		}
 		// Resume normal operations
-		if( $status->isOk() ) {
+		if ( $status->isOk() ) {
 			$this->enableLB();
 		}
+
 		return $status;
 	}
 
@@ -279,6 +282,7 @@ abstract class DatabaseInstaller {
 		}
 		$up->purgeCache();
 		ob_end_flush();
+
 		return $ret;
 	}
 
@@ -288,14 +292,12 @@ abstract class DatabaseInstaller {
 	 * long after the constructor. Helpful for things like modifying setup steps :)
 	 */
 	public function preInstall() {
-
 	}
 
 	/**
 	 * Allow DB installers a chance to make checks before upgrade.
 	 */
 	public function preUpgrade() {
-
 	}
 
 	/**
@@ -319,15 +321,11 @@ abstract class DatabaseInstaller {
 	 * Convenience function.
 	 * Check if a named extension is present.
 	 *
-	 * @see wfDl
 	 * @param $name
 	 * @return bool
 	 */
 	protected static function checkExtension( $name ) {
-		wfSuppressWarnings();
-		$compiled = wfDl( $name );
-		wfRestoreWarnings();
-		return $compiled;
+		return extension_loaded( $name );
 	}
 
 	/**
@@ -335,6 +333,8 @@ abstract class DatabaseInstaller {
 	 * @return String
 	 */
 	public function getReadableName() {
+		// Messages: config-type-mysql, config-type-postgres, config-type-sqlite,
+		// config-type-oracle
 		return wfMessage( 'config-type-' . $this->getName() )->text();
 	}
 
@@ -369,6 +369,7 @@ abstract class DatabaseInstaller {
 		} elseif ( isset( $internal[$var] ) ) {
 			$default = $internal[$var];
 		}
+
 		return $this->parent->getVar( $var, $default );
 	}
 
@@ -396,6 +397,7 @@ abstract class DatabaseInstaller {
 		if ( !isset( $attribs ) ) {
 			$attribs = array();
 		}
+
 		return $this->parent->getTextBox( array(
 			'var' => $var,
 			'label' => $label,
@@ -422,6 +424,7 @@ abstract class DatabaseInstaller {
 		if ( !isset( $attribs ) ) {
 			$attribs = array();
 		}
+
 		return $this->parent->getPasswordBox( array(
 			'var' => $var,
 			'label' => $label,
@@ -440,6 +443,7 @@ abstract class DatabaseInstaller {
 	public function getCheckBox( $var, $label, $attribs = array(), $helpData = "" ) {
 		$name = $this->getName() . '_' . $var;
 		$value = $this->getVar( $var );
+
 		return $this->parent->getCheckBox( array(
 			'var' => $var,
 			'label' => $label,
@@ -447,7 +451,7 @@ abstract class DatabaseInstaller {
 			'controlName' => $name,
 			'value' => $value,
 			'help' => $helpData
-		));
+		) );
 	}
 
 	/**
@@ -466,6 +470,7 @@ abstract class DatabaseInstaller {
 	public function getRadioSet( $params ) {
 		$params['controlName'] = $this->getName() . '_' . $params['var'];
 		$params['value'] = $this->getVar( $params['var'] );
+
 		return $this->parent->getRadioSet( $params );
 	}
 
@@ -499,7 +504,9 @@ abstract class DatabaseInstaller {
 		if ( !$this->db->selectDB( $this->getVar( 'wgDBname' ) ) ) {
 			return false;
 		}
-		return $this->db->tableExists( 'cur', __METHOD__ ) || $this->db->tableExists( 'revision', __METHOD__ );
+
+		return $this->db->tableExists( 'cur', __METHOD__ ) ||
+			$this->db->tableExists( 'revision', __METHOD__ );
 	}
 
 	/**
@@ -508,11 +515,20 @@ abstract class DatabaseInstaller {
 	 * @return String
 	 */
 	public function getInstallUserBox() {
-		return
-			Html::openElement( 'fieldset' ) .
+		return Html::openElement( 'fieldset' ) .
 			Html::element( 'legend', array(), wfMessage( 'config-db-install-account' )->text() ) .
-			$this->getTextBox( '_InstallUser', 'config-db-username', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-install-username' ) ) .
-			$this->getPasswordBox( '_InstallPassword', 'config-db-password', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-install-password' ) ) .
+			$this->getTextBox(
+				'_InstallUser',
+				'config-db-username',
+				array( 'dir' => 'ltr' ),
+				$this->parent->getHelpBox( 'config-db-install-username' )
+			) .
+			$this->getPasswordBox(
+				'_InstallPassword',
+				'config-db-password',
+				array( 'dir' => 'ltr' ),
+				$this->parent->getHelpBox( 'config-db-install-password' )
+			) .
 			Html::closeElement( 'fieldset' );
 	}
 
@@ -522,6 +538,7 @@ abstract class DatabaseInstaller {
 	 */
 	public function submitInstallUserBox() {
 		$this->setVarsFromRequest( array( '_InstallUser', '_InstallPassword' ) );
+
 		return Status::newGood();
 	}
 
@@ -550,6 +567,7 @@ abstract class DatabaseInstaller {
 			$s .= $this->getCheckBox( '_CreateDBAccount', 'config-db-web-create' );
 		}
 		$s .= Html::closeElement( 'div' ) . Html::closeElement( 'fieldset' );
+
 		return $s;
 	}
 
@@ -568,7 +586,7 @@ abstract class DatabaseInstaller {
 			$this->setVar( 'wgDBpassword', $this->getVar( '_InstallPassword' ) );
 		}
 
-		if( $this->getVar( '_CreateDBAccount' ) && strval( $this->getVar( 'wgDBpassword' ) ) == '' ) {
+		if ( $this->getVar( '_CreateDBAccount' ) && strval( $this->getVar( 'wgDBpassword' ) ) == '' ) {
 			return Status::newFatal( 'config-db-password-empty', $this->getVar( 'wgDBuser' ) );
 		}
 
@@ -587,8 +605,9 @@ abstract class DatabaseInstaller {
 		}
 		$this->db->selectDB( $this->getVar( 'wgDBname' ) );
 
-		if( $this->db->selectRow( 'interwiki', '*', array(), __METHOD__ ) ) {
+		if ( $this->db->selectRow( 'interwiki', '*', array(), __METHOD__ ) ) {
 			$status->warning( 'config-install-interwiki-exists' );
+
 			return $status;
 		}
 		global $IP;
@@ -600,9 +619,11 @@ abstract class DatabaseInstaller {
 		if ( !$rows ) {
 			return Status::newFatal( 'config-install-interwiki-list' );
 		}
-		foreach( $rows as $row ) {
+		foreach ( $rows as $row ) {
 			$row = preg_replace( '/^\s*([^#]*?)\s*(#.*)?$/', '\\1', $row ); // strip comments - whee
-			if ( $row == "" ) continue;
+			if ( $row == "" ) {
+				continue;
+			}
 			$row .= "||";
 			$interwikis[] = array_combine(
 				array( 'iw_prefix', 'iw_url', 'iw_local', 'iw_api', 'iw_wikiid' ),
@@ -610,6 +631,7 @@ abstract class DatabaseInstaller {
 			);
 		}
 		$this->db->insert( 'interwiki', $interwikis, __METHOD__ );
+
 		return Status::newGood();
 	}
 
diff --git a/includes/installer/DatabaseUpdater.php b/includes/installer/DatabaseUpdater.php
index 25f751c7..267b6c5a 100644
--- a/includes/installer/DatabaseUpdater.php
+++ b/includes/installer/DatabaseUpdater.php
@@ -21,7 +21,7 @@
  * @ingroup Deployment
  */
 
-require_once( __DIR__ . '/../../maintenance/Maintenance.php' );
+require_once __DIR__ . '/../../maintenance/Maintenance.php';
 
 /**
  * Class for handling database updates. Roughly based off of updaters.inc, with
@@ -88,11 +88,6 @@ abstract class DatabaseUpdater {
 	 */
 	protected $skipSchema = false;
 
-	/**
-	 * Hold the value of $wgContentHandlerUseDB during the upgrade.
-	 */
-	protected $wgContentHandlerUseDB = true;
-
 	/**
 	 * Constructor
 	 *
@@ -135,7 +130,8 @@ abstract class DatabaseUpdater {
 	}
 
 	/**
-	 * Loads LocalSettings.php, if needed, and initialises everything needed for LoadExtensionSchemaUpdates hook
+	 * Loads LocalSettings.php, if needed, and initialises everything needed for
+	 * LoadExtensionSchemaUpdates hook.
 	 */
 	private function loadExtensions() {
 		if ( !defined( 'MEDIAWIKI_INSTALL' ) ) {
@@ -162,8 +158,9 @@ abstract class DatabaseUpdater {
 	 */
 	public static function newForDB( &$db, $shared = false, $maintenance = null ) {
 		$type = $db->getType();
-		if( in_array( $type, Installer::getDBTypes() ) ) {
+		if ( in_array( $type, Installer::getDBTypes() ) ) {
 			$class = ucfirst( $type ) . 'Updater';
+
 			return new $class( $db, $shared, $maintenance );
 		} else {
 			throw new MWException( __METHOD__ . ' called for unsupported $wgDBtype' );
@@ -189,7 +186,7 @@ abstract class DatabaseUpdater {
 			return;
 		}
 		global $wgCommandLineMode;
-		if( !$wgCommandLineMode ) {
+		if ( !$wgCommandLineMode ) {
 			$str = htmlspecialchars( $str );
 		}
 		echo $str;
@@ -293,11 +290,22 @@ abstract class DatabaseUpdater {
 	 * @param string $tableName The table name
 	 * @param string $oldIndexName The old index name
 	 * @param string $newIndexName The new index name
-	 * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old and the new indexes exist. [facultative; by default, false]
+	 * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old
+	 * and the new indexes exist. [facultative; by default, false]
 	 * @param string $sqlPath The path to the SQL change path
 	 */
-	public function renameExtensionIndex( $tableName, $oldIndexName, $newIndexName, $sqlPath, $skipBothIndexExistWarning = false ) {
-		$this->extensionUpdates[] = array( 'renameIndex', $tableName, $oldIndexName, $newIndexName, $skipBothIndexExistWarning, $sqlPath, true );
+	public function renameExtensionIndex( $tableName, $oldIndexName, $newIndexName,
+		$sqlPath, $skipBothIndexExistWarning = false
+	) {
+		$this->extensionUpdates[] = array(
+			'renameIndex',
+			$tableName,
+			$oldIndexName,
+			$newIndexName,
+			$skipBothIndexExistWarning,
+			$sqlPath,
+			true
+		);
 	}
 
 	/**
@@ -307,7 +315,7 @@ abstract class DatabaseUpdater {
 	 * @param string $fieldName The field to be modified
 	 * @param string $sqlPath The path to the SQL change path
 	 */
-	public function modifyExtensionField( $tableName, $fieldName, $sqlPath) {
+	public function modifyExtensionField( $tableName, $fieldName, $sqlPath ) {
 		$this->extensionUpdates[] = array( 'modifyField', $tableName, $fieldName, $sqlPath, true );
 	}
 
@@ -362,7 +370,7 @@ abstract class DatabaseUpdater {
 		$updates = $this->updatesSkipped;
 		$this->updatesSkipped = array();
 
-		foreach( $updates as $funcList ) {
+		foreach ( $updates as $funcList ) {
 			$func = $funcList[0];
 			$arg = $funcList[1];
 			$origParams = $funcList[2];
@@ -378,7 +386,7 @@ abstract class DatabaseUpdater {
 	 * @param array $what what updates to perform
 	 */
 	public function doUpdates( $what = array( 'core', 'extensions', 'stats' ) ) {
-		global $wgVersion, $wgLocalisationCacheConf;
+		global $wgVersion;
 
 		$this->db->begin( __METHOD__ );
 		$what = array_flip( $what );
@@ -395,17 +403,9 @@ abstract class DatabaseUpdater {
 			$this->checkStats();
 		}
 
-		if ( isset( $what['purge'] ) ) {
-			$this->purgeCache();
-
-			if ( $wgLocalisationCacheConf['manualRecache'] ) {
-				$this->rebuildLocalisationCache();
-			}
-		}
-
 		$this->setAppliedUpdates( $wgVersion, $this->updates );
 
-		if( $this->fileHandle ) {
+		if ( $this->fileHandle ) {
 			$this->skipSchema = false;
 			$this->writeSchemaUpdateFile();
 			$this->setAppliedUpdates( "$wgVersion-schema", $this->updatesSkipped );
@@ -427,14 +427,14 @@ abstract class DatabaseUpdater {
 		foreach ( $updates as $params ) {
 			$origParams = $params;
 			$func = array_shift( $params );
-			if( !is_array( $func ) && method_exists( $this, $func ) ) {
+			if ( !is_array( $func ) && method_exists( $this, $func ) ) {
 				$func = array( $this, $func );
 			} elseif ( $passSelf ) {
 				array_unshift( $params, $this );
 			}
 			$ret = call_user_func_array( $func, $params );
 			flush();
-			if( $ret !== false ) {
+			if ( $ret !== false ) {
 				$updatesDone[] = $origParams;
 			} else {
 				$updatesSkipped[] = array( $func, $params, $origParams );
@@ -450,7 +450,7 @@ abstract class DatabaseUpdater {
 	 */
 	protected function setAppliedUpdates( $version, $updates = array() ) {
 		$this->db->clearFlag( DBO_DDLMODE );
-		if( !$this->canUseNewUpdatelog() ) {
+		if ( !$this->canUseNewUpdatelog() ) {
 			return;
 		}
 		$key = "updatelist-$version-" . time();
@@ -475,6 +475,7 @@ abstract class DatabaseUpdater {
 			array( 'ul_key' => $key ),
 			__METHOD__
 		);
+
 		return (bool)$row;
 	}
 
@@ -488,7 +489,7 @@ abstract class DatabaseUpdater {
 	public function insertUpdateRow( $key, $val = null ) {
 		$this->db->clearFlag( DBO_DDLMODE );
 		$values = array( 'ul_key' => $key );
-		if( $val && $this->canUseNewUpdatelog() ) {
+		if ( $val && $this->canUseNewUpdatelog() ) {
 			$values['ul_value'] = $val;
 		}
 		$this->db->insert( 'updatelog', $values, __METHOD__, 'IGNORE' );
@@ -551,21 +552,21 @@ abstract class DatabaseUpdater {
 		foreach ( $wgExtNewFields as $fieldRecord ) {
 			$updates[] = array(
 				'addField', $fieldRecord[0], $fieldRecord[1],
-					$fieldRecord[2], true
+				$fieldRecord[2], true
 			);
 		}
 
 		foreach ( $wgExtNewIndexes as $fieldRecord ) {
 			$updates[] = array(
 				'addIndex', $fieldRecord[0], $fieldRecord[1],
-					$fieldRecord[2], true
+				$fieldRecord[2], true
 			);
 		}
 
 		foreach ( $wgExtModifiedFields as $fieldRecord ) {
 			$updates[] = array(
 				'modifyField', $fieldRecord[0], $fieldRecord[1],
-					$fieldRecord[2], true
+				$fieldRecord[2], true
 			);
 		}
 
@@ -605,9 +606,10 @@ abstract class DatabaseUpdater {
 	 */
 	public function appendLine( $line ) {
 		$line = rtrim( $line ) . ";\n";
-		if( fwrite( $this->fileHandle, $line ) === false ) {
+		if ( fwrite( $this->fileHandle, $line ) === false ) {
 			throw new MWException( "trouble writing file" );
 		}
+
 		return false;
 	}
 
@@ -625,6 +627,7 @@ abstract class DatabaseUpdater {
 		}
 		if ( $this->skipSchema ) {
 			$this->output( "...skipping schema change ($msg).\n" );
+
 			return false;
 		}
 
@@ -633,12 +636,13 @@ abstract class DatabaseUpdater {
 		if ( !$isFullPath ) {
 			$path = $this->db->patchPath( $path );
 		}
-		if( $this->fileHandle !== null ) {
+		if ( $this->fileHandle !== null ) {
 			$this->copyFile( $path );
 		} else {
 			$this->db->sourceFile( $path );
 		}
 		$this->output( "done.\n" );
+
 		return true;
 	}
 
@@ -660,6 +664,7 @@ abstract class DatabaseUpdater {
 		} else {
 			return $this->applyPatch( $patch, $fullpath, "Creating $name table" );
 		}
+
 		return true;
 	}
 
@@ -684,6 +689,7 @@ abstract class DatabaseUpdater {
 		} else {
 			return $this->applyPatch( $patch, $fullpath, "Adding $field field to table $table" );
 		}
+
 		return true;
 	}
 
@@ -703,11 +709,12 @@ abstract class DatabaseUpdater {
 
 		if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
 			$this->output( "...skipping: '$table' table doesn't exist yet.\n" );
-		} else if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
+		} elseif ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
 			$this->output( "...index $index already set on $table table.\n" );
 		} else {
 			return $this->applyPatch( $patch, $fullpath, "Adding index $index to table $table" );
 		}
+
 		return true;
 	}
 
@@ -730,6 +737,7 @@ abstract class DatabaseUpdater {
 		} else {
 			$this->output( "...$table table does not contain $field field.\n" );
 		}
+
 		return true;
 	}
 
@@ -752,6 +760,7 @@ abstract class DatabaseUpdater {
 		} else {
 			$this->output( "...$index key doesn't exist.\n" );
 		}
+
 		return true;
 	}
 
@@ -761,12 +770,15 @@ abstract class DatabaseUpdater {
 	 * @param string $table Name of the table to modify
 	 * @param string $oldIndex Old name of the index
 	 * @param string $newIndex New name of the index
-	 * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the old and the new indexes exist.
+	 * @param $skipBothIndexExistWarning Boolean: Whether to warn if both the
+	 * old and the new indexes exist.
 	 * @param string $patch Path to the patch file
 	 * @param $fullpath Boolean: Whether to treat $patch path as a relative or not
 	 * @return Boolean false if this was skipped because schema changes are skipped
 	 */
-	protected function renameIndex( $table, $oldIndex, $newIndex, $skipBothIndexExistWarning, $patch, $fullpath = false ) {
+	protected function renameIndex( $table, $oldIndex, $newIndex,
+		$skipBothIndexExistWarning, $patch, $fullpath = false
+	) {
 		if ( !$this->doTable( $table ) ) {
 			return true;
 		}
@@ -774,27 +786,37 @@ abstract class DatabaseUpdater {
 		// First requirement: the table must exist
 		if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
 			$this->output( "...skipping: '$table' table doesn't exist yet.\n" );
+
 			return true;
 		}
 
 		// Second requirement: the new index must be missing
 		if ( $this->db->indexExists( $table, $newIndex, __METHOD__ ) ) {
 			$this->output( "...index $newIndex already set on $table table.\n" );
-			if ( !$skipBothIndexExistWarning && $this->db->indexExists( $table, $oldIndex, __METHOD__ ) ) {
-				$this->output( "...WARNING: $oldIndex still exists, despite it has been renamed into $newIndex (which also exists).\n" .
+			if ( !$skipBothIndexExistWarning &&
+				$this->db->indexExists( $table, $oldIndex, __METHOD__ )
+			) {
+				$this->output( "...WARNING: $oldIndex still exists, despite it has " .
+					"been renamed into $newIndex (which also exists).\n" .
 					"            $oldIndex should be manually removed if not needed anymore.\n" );
 			}
+
 			return true;
 		}
 
 		// Third requirement: the old index must exist
 		if ( !$this->db->indexExists( $table, $oldIndex, __METHOD__ ) ) {
 			$this->output( "...skipping: index $oldIndex doesn't exist.\n" );
+
 			return true;
 		}
 
 		// Requirements have been satisfied, patch can be applied
-		return $this->applyPatch( $patch, $fullpath, "Renaming index $oldIndex into $newIndex to table $table" );
+		return $this->applyPatch(
+			$patch,
+			$fullpath,
+			"Renaming index $oldIndex into $newIndex to table $table"
+		);
 	}
 
 	/**
@@ -820,13 +842,13 @@ abstract class DatabaseUpdater {
 				$this->output( "$msg ..." );
 				$this->db->dropTable( $table, __METHOD__ );
 				$this->output( "done.\n" );
-			}
-			else {
+			} else {
 				return $this->applyPatch( $patch, $fullpath, $msg );
 			}
 		} else {
 			$this->output( "...$table doesn't exist.\n" );
 		}
+
 		return true;
 	}
 
@@ -848,13 +870,16 @@ abstract class DatabaseUpdater {
 		if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
 			$this->output( "...$table table does not exist, skipping modify field patch.\n" );
 		} elseif ( !$this->db->fieldExists( $table, $field, __METHOD__ ) ) {
-			$this->output( "...$field field does not exist in $table table, skipping modify field patch.\n" );
-		} elseif( $this->updateRowExists( $updateKey ) ) {
+			$this->output( "...$field field does not exist in $table table, " .
+				"skipping modify field patch.\n" );
+		} elseif ( $this->updateRowExists( $updateKey ) ) {
 			$this->output( "...$field in table $table already modified by patch $patch.\n" );
 		} else {
 			$this->insertUpdateRow( $updateKey );
+
 			return $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" );
 		}
+
 		return true;
 	}
 
@@ -886,6 +911,7 @@ abstract class DatabaseUpdater {
 			$this->output( "missing ss_total_pages, rebuilding...\n" );
 		} else {
 			$this->output( "done.\n" );
+
 			return;
 		}
 		SiteStatsInit::doAllAndCommit( $this->db );
@@ -917,9 +943,10 @@ abstract class DatabaseUpdater {
 	protected function doLogUsertextPopulation() {
 		if ( !$this->updateRowExists( 'populate log_usertext' ) ) {
 			$this->output(
-			"Populating log_user_text field, printing progress markers. For large\n" .
-			"databases, you may want to hit Ctrl-C and do this manually with\n" .
-			"maintenance/populateLogUsertext.php.\n" );
+				"Populating log_user_text field, printing progress markers. For large\n" .
+				"databases, you may want to hit Ctrl-C and do this manually with\n" .
+				"maintenance/populateLogUsertext.php.\n"
+			);
 
 			$task = $this->maintenance->runChild( 'PopulateLogUsertext' );
 			$task->execute();
@@ -949,6 +976,7 @@ abstract class DatabaseUpdater {
 	protected function doUpdateTranscacheField() {
 		if ( $this->updateRowExists( 'convert transcache field' ) ) {
 			$this->output( "...transcache tc_time already converted.\n" );
+
 			return true;
 		}
 
@@ -967,9 +995,11 @@ abstract class DatabaseUpdater {
 				'COUNT(*)',
 				'cl_collation != ' . $this->db->addQuotes( $wgCategoryCollation ),
 				__METHOD__
-				) == 0 ) {
-					$this->output( "...collations up-to-date.\n" );
-					return;
+				) == 0
+			) {
+				$this->output( "...collations up-to-date.\n" );
+
+				return;
 			}
 
 			$this->output( "Updating category collations..." );
@@ -983,7 +1013,7 @@ abstract class DatabaseUpdater {
 	 * Migrates user options from the user table blob to user_properties
 	 */
 	protected function doMigrateUserOptions() {
-		if( $this->db->tableExists( 'user_properties' ) ) {
+		if ( $this->db->tableExists( 'user_properties' ) ) {
 			$cl = $this->maintenance->runChild( 'ConvertUserOptions', 'convertUserOptions.php' );
 			$cl->execute();
 			$this->output( "done.\n" );
@@ -1003,30 +1033,4 @@ abstract class DatabaseUpdater {
 		$cl->execute();
 		$this->output( "done.\n" );
 	}
-
-	/**
-	 * Turns off content handler fields during parts of the upgrade
-	 * where they aren't available.
-	 */
-	protected function disableContentHandlerUseDB() {
-		global $wgContentHandlerUseDB;
-
-		if( $wgContentHandlerUseDB ) {
-			$this->output( "Turning off Content Handler DB fields for this part of upgrade.\n" );
-			$this->holdContentHandlerUseDB = $wgContentHandlerUseDB;
-			$wgContentHandlerUseDB = false;
-		}
-	}
-
-	/**
-	 * Turns content handler fields back on.
-	 */
-	protected function enableContentHandlerUseDB() {
-		global $wgContentHandlerUseDB;
-
-		if( $this->holdContentHandlerUseDB ) {
-			$this->output( "Content Handler DB fields should be usable now.\n" );
-			$wgContentHandlerUseDB = $this->holdContentHandlerUseDB;
-		}
-	}
 }
diff --git a/includes/installer/InstallDocFormatter.php b/includes/installer/InstallDocFormatter.php
index a508e24c..6d3819cd 100644
--- a/includes/installer/InstallDocFormatter.php
+++ b/includes/installer/InstallDocFormatter.php
@@ -23,6 +23,7 @@
 class InstallDocFormatter {
 	static function format( $text ) {
 		$obj = new self( $text );
+
 		return $obj->execute();
 	}
 
@@ -33,8 +34,8 @@ class InstallDocFormatter {
 	protected function execute() {
 		$text = $this->text;
 		// Use Unix line endings, escape some wikitext stuff
-		$text = str_replace( array( '<', '{{', '[[', "\r" ),
-			array( '&lt;', '&#123;&#123;', '&#91;&#91;', '' ), $text );
+		$text = str_replace( array( '<', '{{', '[[', '__', "\r" ),
+			array( '&lt;', '&#123;&#123;', '&#91;&#91;', '&#95;&#95;', '' ), $text );
 		// join word-wrapped lines into one
 		do {
 			$prev = $text;
@@ -46,7 +47,12 @@ class InstallDocFormatter {
 		// turn (bug nnnn) into links
 		$text = preg_replace_callback( '/bug (\d+)/', array( $this, 'replaceBugLinks' ), $text );
 		// add links to manual to every global variable mentioned
-		$text = preg_replace_callback( '/(\$wg[a-z0-9_]+)/i', array( $this, 'replaceConfigLinks' ), $text );
+		$text = preg_replace_callback(
+			'/(\$wg[a-z0-9_]+)/i',
+			array( $this, 'replaceConfigLinks' ),
+			$text
+		);
+
 		return $text;
 	}
 
diff --git a/includes/installer/Installer.i18n.php b/includes/installer/Installer.i18n.php
index 85b877a8..edf5ff25 100644
--- a/includes/installer/Installer.i18n.php
+++ b/includes/installer/Installer.i18n.php
@@ -63,8 +63,8 @@ Check your php.ini and make sure <code>session.save_path</code> is set to an app
 	'config-help-restart'             => 'Do you want to clear all saved data that you have entered and restart the installation process?',
 	'config-restart'                  => 'Yes, restart it',
 	'config-welcome'                  => "=== Environmental checks ===
-Basic checks are performed to see if this environment is suitable for MediaWiki installation.
-You should provide the results of these checks if you need help during installation.",
+Basic checks will now be performed to see if this environment is suitable for MediaWiki installation.
+Remember to include this information if you seek support on how to complete the installation.",
 	'config-copyright'                => "=== Copyright and Terms ===
 
 $1
@@ -134,6 +134,10 @@ MediaWiki requires UTF-8 support to function correctly.",
 This is probably too low.
 The installation may fail!",
 	'config-ctype'                    => "'''Fatal:''' PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
+	'config-json'                     => "'''Fatal:''' PHP was compiled without JSON support.
+You must install either the PHP JSON extension or the [http://pecl.php.net/package/jsonc PECL jsonc] extension before installing MediaWiki.
+* The PHP extension is included in Red Hat Enterprise Linux (CentOS) 5 and 6, though must be enabled in <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.
+* Some Linux distributions released after May 2013 omit the PHP extension, instead packaging the PECL extension as <code>php5-json</code> or <code>php-pecl-jsonc</code>.",
 	'config-xcache'                   => '[http://xcache.lighttpd.net/ XCache] is installed',
 	'config-apc'                      => '[http://www.php.net/apc APC] is installed',
 	'config-wincache'                 => '[http://www.iis.net/download/WinCacheForPhp WinCache] is installed',
@@ -142,6 +146,8 @@ Object caching is not enabled.",
 	'config-mod-security'             => "'''Warning:''' Your web server has [http://modsecurity.org/ mod_security] enabled. If misconfigured, it can cause problems for MediaWiki or other software that allows users to post arbitrary content.
 Refer to [http://modsecurity.org/documentation/ mod_security documentation] or contact your host's support if you encounter random errors.",
 	'config-diff3-bad'                => 'GNU diff3 not found.',
+	'config-git'                      => 'Found the Git version control software: <code>$1</code>.',
+	'config-git-bad'                  => 'Git version control software not found.',
 	'config-imagemagick'              => 'Found ImageMagick: <code>$1</code>.
 Image thumbnailing will be enabled if you enable uploads.',
 	'config-gd'                       => 'Found GD graphics library built-in.
@@ -259,7 +265,7 @@ If you do not see the database system you are trying to use listed below, then f
 	'config-missing-db-host'          => 'You must enter a value for "Database host"',
 	'config-missing-db-server-oracle' => 'You must enter a value for "Database TNS"',
 	'config-invalid-db-server-oracle' => 'Invalid database TNS "$1".
-Use only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and dots (.).',
+Use either "TNS Name" or an "Easy Connect" string ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])',
 	'config-invalid-db-name'          => 'Invalid database name "$1".
 Use only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).',
 	'config-invalid-db-prefix'        => 'Invalid database prefix "$1".
@@ -315,7 +321,7 @@ This is '''not recommended''' unless you are having problems with your wiki.",
 	'config-upgrade-done-no-regenerate' => "Upgrade complete.
 
 You can now [$1 start using your wiki].",
-	'config-regenerate'               => 'Regenerate <code>LocalSettings.php</code> →',
+	'config-regenerate'               => 'Regenerate LocalSettings.php →',
 	'config-show-table-status'        => '<code>SHOW TABLE STATUS</code> query failed!',
 	'config-unknown-collation'        => "'''Warning:''' Database is using unrecognized collation.",
 	'config-db-web-account'           => 'Database account for web access',
@@ -334,6 +340,12 @@ The account you specify here must already exist.',
 
 If your MySQL installation supports InnoDB, it is highly recommended that you choose that instead.
 If your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
+	'config-mysql-only-myisam-dep'    => "'''Warning:''' MyISAM is the only available storage engine for MySQL, which is not recommended for use with MediaWiki, because:
+* it barely supports concurrency due to table locking
+* it is more prone to corruption than other engines
+* the MediaWiki codebase does not always handle MyISAM as it should
+
+Your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
 	'config-mysql-engine-help'        => "'''InnoDB''' is almost always the best option, since it has good concurrency support.
 
 '''MyISAM''' may be faster in single-user or read-only installations.
@@ -550,6 +562,9 @@ When that has been done, you can '''[$2 enter your wiki]'''.",
 	'config-download-localsettings' => 'Download <code>LocalSettings.php</code>',
 	'config-help' => 'help',
 	'config-nofile'     => 'File "$1" could not be found. Has it been deleted?',
+	'config-extension-link' => 'Did you know that your wiki supports [//www.mediawiki.org/wiki/Manual:Extensions extensions]?
+
+You can browse [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions by category] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] to see the full list of extensions.',
 	'mainpagetext'      => "'''MediaWiki has been successfully installed.'''",
 	'mainpagedocfooter' => "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.
 
@@ -576,9 +591,10 @@ When that has been done, you can '''[$2 enter your wiki]'''.",
  * @author Shirayuki
  * @author Siebrand
  * @author Umherirrender
+ * @author Waldir
  */
 $messages['qqq'] = array(
-	'config-desc' => '{{desc}}',
+	'config-desc' => 'Short description of the installer.',
 	'config-title' => 'Parameters:
 * $1 is the version of MediaWiki that is being installed.',
 	'config-information' => '{{Identical|Information}}',
@@ -604,16 +620,32 @@ Used as error message.',
 	'config-page-name' => '{{Identical|Name}}',
 	'config-page-options' => '{{Identical|Options}}',
 	'config-page-install' => '{{Identical|Install}}',
+	'config-page-complete' => '{{Identical|Complete}}',
+	'config-page-releasenotes' => '{{Identical|Release notes}}',
 	'config-page-copying' => 'This is a link to the full GPL text',
 	'config-restart' => 'Button text to confirm the installation procedure has to be restarted.',
+	'config-copyright' => 'This message follows {{msg-mw|config-env-good}}.
+
+Parameters:
+* $1 - copyright and author list',
 	'config-sidebar' => 'Maximum width for words is 24 characters. Only visible part of the translation counts to this limit.',
 	'config-env-php' => 'Parameters:
-* $1 is the version of PHP that has been installed.',
+* $1 - the version of PHP that has been installed
+See also:
+* {{msg-mw|config-env-php-toolow}}',
+	'config-env-php-toolow' => 'Parameters:
+* $1 - the version of PHP that has been installed
+* $2 - minimum PHP version number
+See also:
+* {{msg-mw|config-env-php}}',
 	'config-unicode-pure-php-warning' => 'PECL is the name of a group producing standard pieces of software for PHP, and intl is the name of their library handling some aspects of internationalization.',
 	'config-unicode-update-warning' => "ICU is a body producing standard software tools for support of Unicode and other internationalization aspects. This message warns the system administrator installing MediaWiki that the server's software is not up-to-date and MediaWiki will have problems handling some characters.",
 	'config-no-db' => '{{doc-important|Do not translate "<code>./configure --with-mysql</code>" and "<code>php5-mysql</code>".}}
 Parameters:
 * $1 is comma separated list of database types supported by MediaWiki.',
+	'config-outdated-sqlite' => 'Used as warning. Parameters:
+* $1 - the version of SQLite that has been installed
+* $2 - minimum version',
 	'config-no-fts3' => 'A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
 	'config-magic-quotes-runtime' => '{{Related|Config-fatal}}',
 	'config-magic-quotes-sybase' => '{{Related|Config-fatal}}',
@@ -628,22 +660,46 @@ Parameters:
 	'config-memory-bad' => 'Parameters:
 * $1 is the configured <code>memory_limit</code>.',
 	'config-ctype' => 'Message if support for [http://www.php.net/manual/en/ctype.installation.php Ctype] is missing from PHP',
+	'config-json' => 'Message if support for [[wikipedia:JSON|JSON]] is missing from PHP.
+* "[[wikipedia:Red Hat Enterprise Linux|Red Hat Enterprise Linux]]" (RHEL) and "[[wikipedia:CentOS|CentOS]]" refer to two almost-identical Linux distributions. "5 and 6" refers to version 5 or 6 of either distribution. Because RHEL 7 likely will not include the PHP extension, do not translate as "5 or newer".
+* "The [http://www.php.net/json PHP extension]" is the JSON extension included with PHP 5.2 and newer.
+* "The [http://pecl.php.net/package/jsonc PECL extension]" is based on the PHP extension, though excludes code some distributions have found unacceptable (see [[bugzilla:47431]]).',
 	'config-xcache' => 'Message indicates if this program is available',
 	'config-apc' => 'Message indicates if this program is available',
 	'config-wincache' => 'Message indicates if this program is available',
+	'config-git' => 'Message if Git version control software is available.
+Parameter:
+* $1 is the <code>Git</code> executable file name.',
+	'config-git-bad' => 'Message if Git version control software is not found.',
 	'config-imagemagick' => '$1 is ImageMagick\'s <code>convert</code> executable file name.
 
 Add dir="ltr" to the <nowiki><code></nowiki> for right-to-left languages.',
 	'config-no-cli-uri' => 'Parameters:
 * $1 is the default value for scriptpath.',
+	'config-using-server' => 'Used as a part of environment check result. Parameters:
+* $1 - default server name',
+	'config-using-uri' => 'Used as a part of environment check result. Parameters:
+* $1 - server name
+* $2 - script path',
+	'config-uploads-not-safe' => 'Used as a part of environment check result. Parameters:
+* $1 - name of directory for images: <code>$IP/images/</code>',
 	'config-no-cli-uploads-check' => 'CLI = [[w:Command-line interface|command-line interface]] (i.e. the installer runs as a command-line script, not using HTML interface via an internet browser)',
+	'config-using531' => 'Used as error message. Parameters:
+* $1 - the version of PHP that has been installed',
 	'config-suhosin-max-value-length' => '{{doc-important|Do not translate "length", "suhosin.get.max_value_length", "php.ini", "$wgResourceLoaderMaxQueryLength" and "LocalSettings.php".}}
 Message shown when PHP parameter <code>suhosin.get.max_value_length</code> is between 0 and 1023 (that max value is hard set in MediaWiki software).',
 	'config-db-host-help' => '{{doc-singularthey}}',
 	'config-db-host-oracle' => 'TNS = [[:wikipedia:Transparent Network Substrate|Transparent Network Substrate]] (<== wikipedia link)',
+	'config-db-host-oracle-help' => 'See also:
+* {{msg-mw|Config-invalid-db-server-oracle}}',
 	'config-db-wiki-settings' => 'This is more acurate: "Enter identifying or distinguishing data for this wiki" since a MySQL database can host tables of several wikis.',
 	'config-db-account-oracle-warn' => 'A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
+	'config-db-password-empty' => 'Used as error message. Parameters:
+* $1 - database username',
 	'config-db-account-lock' => "It might be easier to translate ''normal operation'' as \"also after the installation process\"",
+	'config-mysql-old' => 'Used as error message. Parameters:
+* $1 - minimum version
+* $2 - the version of MySQL that has been installed',
 	'config-pg-test-error' => '* $1 - database name
 * $2 - error message',
 	'config-sqlite-dir-help' => '{{doc-important|Do not translate <code>.htaccess</code> and <code>/var/lib/mediawiki/yourwiki</code>.}}
@@ -662,20 +718,105 @@ Used in help box.',
 * $1 - a link to the SQLite home page having the anchor text "SQLite".',
 	'config-support-oracle' => 'Parameters:
 * $1 - a link to the Oracle home page, the anchor text of which is "Oracle".',
+	'config-invalid-db-server-oracle' => 'Used as error message. Parameters:
+* $1 - database server name
+See also:
+* {{msg-mw|Config-db-host-oracle-help}}',
+	'config-invalid-db-name' => 'Used as error message. Parameters:
+* $1 - database name
+See also:
+* {{msg-mw|Config-invalid-db-prefix}}',
+	'config-invalid-db-prefix' => 'Used as error message. Parameters:
+* $1 - database prefix
+See also:
+* {{msg-mw|Config-invalid-db-name}}',
 	'config-connection-error' => '$1 is the external error from the database, such as "DB connection error: Access denied for user \'dba\'@\'localhost\' (using password: YES) (localhost)."
 
 If you\'re translating this message to a right-to-left language, consider writing <nowiki><div dir="ltr">$1.</div></nowiki>. (When the bidi features for HTML5 will be implemented in the browsers, it will probably be a good idea to write it as <nowiki><div dir="auto">$1.</div></nowiki>.)',
 	'config-invalid-schema' => '*$1 - schema name',
+	'config-db-sys-user-exists-oracle' => 'Used as error message. Parameters:
+* $1 - database username',
+	'config-postgres-old' => 'Used as error message. Used as warning. Parameters:
+* $1 - minimum version
+* $2 - the version of PostgreSQL that has been installed',
+	'config-sqlite-parent-unwritable-group' => 'Used as SQLite error message. Parameters:
+* $1 - data directory
+* $2 - "dirname" part of $1
+* $3 - "basename" part of $1
+* $4 - web server\'s primary group name
+See also:
+* {{msg-mw|Config-sqlite-parent-unwritable-nogroup}}',
+	'config-sqlite-parent-unwritable-nogroup' => 'Used as SQLite error message. Parameters:
+* $1 - data directory
+* $2 - "dirname" part of $1
+* $3 - "basename" part of $1
+See also:
+* {{msg-mw|Config-sqlite-parent-unwritable-group}}',
+	'config-sqlite-mkdir-error' => 'Used as SQLite error message. Parameters:
+* $1 - data directory name',
 	'config-sqlite-dir-unwritable' => 'webserver refers to a software like Apache or Lighttpd.',
+	'config-sqlite-connection-error' => 'Used as SQLite error message. Parameters:
+* $1 - error message which SQLite server returned',
+	'config-sqlite-readonly' => 'Used as SQLite error message. Parameters:
+* $1 - filename',
+	'config-sqlite-cant-create-db' => 'Used as SQLite error message. Parameters:
+* $1 - filename',
 	'config-can-upgrade' => 'Parameters:
 * $1 - Version or Revision indicator.',
+	'config-upgrade-done' => 'Used as success message. Parameters:
+* $1 - full URL of index.php
+See also:
+* {{msg-mw|config-upgrade-done-no-regenerate}}',
+	'config-upgrade-done-no-regenerate' => 'Used as success message. Parameters:
+* $1 - full URL of index.php
+See also:
+* {{msg-mw|config-upgrade-done}}',
+	'config-regenerate' => 'This message appears in a button after LocalSettings.php is generated and downloaded at the end of the MediaWiki installation process.',
 	'config-show-table-status' => '{{doc-important|"<code>SHOW TABLE STATUS</code>" is a MySQL command. Do not translate this.}}',
 	'config-db-web-account-same' => 'checkbox label',
 	'config-db-web-create' => 'checkbox label',
-	'config-ns-generic' => '{{Identical|Project}}',
+	'config-mysql-only-myisam-dep' => 'Used as warning message when mysql does not support the minimum suggested feature set.',
+	'config-mysql-binary' => '{{Identical|Binary}}',
+	'config-ns-generic' => 'Used as label for "namespace type" radio button.
+
+See also:
+* {{msg-mw|Config-ns-site-name}}
+* {{msg-mw|Config-ns-other}}
+{{Identical|Project}}',
+	'config-ns-site-name' => 'Used as label for "namespace type" radio button. Parameters:
+* $1 - wiki name
+See also:
+* {{msg-mw|Config-ns-generic}}
+* {{msg-mw|Config-ns-other}}',
+	'config-ns-other' => "Used as label for \"namespace type\" radio button.
+
+This message is followed by the input box which enables to '''specify''' a namespace name.
+
+See also:
+* {{msg-mw|Config-ns-site-name}}
+* {{msg-mw|Config-ns-generic}}",
+	'config-ns-invalid' => 'Used as error message. Parameters:
+* $1 - namespace name
+See also:
+* {{msg-mw|Config-ns-conflict}}',
+	'config-ns-conflict' => 'Used as error message. Parameters:
+* $1 - namespace name
+See also:
+* {{msg-mw|Config-ns-invalid}}',
 	'config-admin-name' => '{{Identical|Your name}}',
 	'config-admin-password' => '{{Identical|Password}}',
+	'config-admin-name-invalid' => 'Used as error message. Parameters:
+* $1 - username of administrator',
 	'config-admin-email' => '{{Identical|E-mail address}}',
+	'config-admin-error-user' => 'Used as error message. Parameters:
+* $1 - username of administrator
+See also:
+* {{msg-mw|Config-admin-error-password}}',
+	'config-admin-error-password' => 'Used as error message. Parameters:
+* $1 - username of administrator
+* $2 - error message
+See also:
+* {{msg-mw|Config-admin-error-user}}',
 	'config-subscribe' => 'Used as label for the installer checkbox',
 	'config-subscribe-help' => '"Low-volume" in this context means that there will be few e-mails to that mailing list per time period.',
 	'config-profile-help' => 'Messages referenced:
@@ -687,10 +828,31 @@ If you\'re translating this message to a right-to-left language, consider writin
 	'config-email-user' => '{{Identical|Enable user-to-user e-mail}}',
 	'config-upload-help' => 'The word "mode" here refers to the access rights given to various user groups when attempting to create and store files and/or subdiretories in the said directory on the server. It also refers to the <code>mode</code> command used to maipulate said right mask under Unix, Linux, and similar operating systems. A less operating-system-centric translation is fine.',
 	'config-logo-help' => '',
+	'config-instantcommons' => 'Used as label for the checkbox.
+
+The help message for this checkbox is:
+* {{msg-mw|Config-instantcommons-help}}',
+	'config-instantcommons-help' => 'Used as help message for the checkbox which is labeled {{msg-mw|config-instantcommons}}.',
 	'config-cc-not-chosen' => '{{doc-important|Do not translate the "<code>proceed</code>" part.}}
 This message refers to a block of HTML being embedded into the installer page. It comes from the Creative Commons Web site. The block is in the English language. It is a scripted license chooser. When an individual license has been selected, it asks you to click "proceed" so as to return to the MediaWiki installer page.',
 	'config-memcached-servers' => '{{doc-important|Do not translate "memcached".}}
 {{Identical|Memcached server}}',
+	'config-memcache-badip' => 'Used as error message. Parameters:
+* $1 - IP address for Memcached
+See also:
+* {{msg-mw|Config-memcache-noport}}
+* {{msg-mw|Config-memcache-badport}}',
+	'config-memcache-noport' => 'Used as error message. Parameters:
+* $1 - Memcached server name
+See also:
+* {{msg-mw|Config-memcache-badip}}
+* {{msg-mw|Config-memcache-badport}}',
+	'config-memcache-badport' => 'Used as error message. Parameters:
+* $1 - 1 (hard-coded)
+* $2 - 65535 (hard-coded)
+See also:
+* {{msg-mw|Config-memcache-badip}}
+* {{msg-mw|Config-memcache-noport}}',
 	'config-extensions' => '{{Identical|Extension}}',
 	'config-extensions-help' => '{{doc-important|Do not translate <code>./extensions</code>.}}
 Used in help box.',
@@ -717,6 +879,8 @@ Used in help box.',
 	'config-install-pg-schema-failed' => 'Parameters:
 * $1 = database user name (usernames in the database are unrelated to wiki user names)
 * $2 =',
+	'config-pg-no-plpgsql' => 'Used as error message. Parameters:
+* $1 - database name',
 	'config-install-user' => 'Message indicates that the user is being created
 
 See also:
@@ -729,9 +893,22 @@ See also:
 *{{msg-mw|Config-install-keys}}
 *{{msg-mw|Config-install-sysop}}
 *{{msg-mw|Config-install-mainpage}}',
+	'config-install-user-alreadyexists' => 'Used as warning. Parameters:
+* $1 - database username',
+	'config-install-user-create-failed' => 'Used as MySQL warning and as PostgreSQL error. Parameters:
+* $1 - database username
+* $2 - detailed warning/error message',
 	'config-install-user-grant-failed' => 'Parameters:
 * $1 is the database username for which granting rights failed
 * $2 is the error message',
+	'config-install-user-missing' => 'Used as PostgreSQL error message. Parameters:
+* $1 - database username
+See also:
+* {{msg-mw|Config-install-user-missing-create}}',
+	'config-install-user-missing-create' => 'Used as PostgreSQL error message. Parameters:
+* $1 - database username
+See also:
+* {{msg-mw|Config-install-user-missing}}',
 	'config-install-tables' => 'Message indicates that the tables are being created
 
 See also:
@@ -744,6 +921,8 @@ See also:
 *{{msg-mw|Config-install-keys}}
 *{{msg-mw|Config-install-sysop}}
 *{{msg-mw|Config-install-mainpage}}',
+	'config-install-tables-failed' => 'Used as PostgreSQL error message. Parameters:
+* $1 - detailed error message',
 	'config-install-interwiki' => 'Message indicates that the interwikitables are being populated
 
 See also:
@@ -801,6 +980,8 @@ See also:
 *{{msg-mw|Config-install-keys}}
 *{{msg-mw|Config-install-sysop}}
 *{{msg-mw|Config-install-mainpage}}',
+	'config-install-mainpage-failed' => 'Used as error message. Parameters:
+* $1 - detailed error message',
 	'config-install-done' => 'Parameters:
 * $1 is the URL to LocalSettings download
 * $2 is a link to the wiki.
@@ -808,6 +989,9 @@ See also:
 	'config-download-localsettings' => 'The link text used in the download link in config-install-done.',
 	'config-help' => 'This is used in help boxes.
 {{Identical|Help}}',
+	'config-nofile' => 'Used as failure message. Parameters:
+* $1 - filename',
+	'config-extension-link' => 'Shown on last page of installation to inform about possible extensions.',
 	'mainpagetext' => 'Along with {{msg-mw|mainpagedocfooter}}, the text you will see on the Main Page when your wiki is installed.',
 	'mainpagedocfooter' => 'Along with {{msg-mw|mainpagetext}}, the text you will see on the Main Page when your wiki is installed.
 This might be a good place to put information about <nowiki>{{GRAMMAR:}}</nowiki>. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/fi]] for an example. For languages having grammatical distinctions and not having an appropriate <nowiki>{{GRAMMAR:}}</nowiki> software available, a suggestion to check and possibly amend the messages having <nowiki>{{SITENAME}}</nowiki> may be valuable. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/ksh]] for an example.',
@@ -890,12 +1074,10 @@ U gebruik tans $2.',
 	'config-sqlite-dir' => 'Gids vir SQLite se data:',
 	'config-oracle-def-ts' => 'Standaard tabelruimte:',
 	'config-oracle-temp-ts' => 'Tydelike tabelruimte:',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-header-mysql' => 'MySQL-instellings',
 	'config-header-postgres' => 'PostgreSQL-instellings',
 	'config-header-sqlite' => 'SQLite-instellings',
 	'config-header-oracle' => 'Oracle-instellings',
-	'config-header-ibm_db2' => 'Instellings vir IBM DB2',
 	'config-invalid-db-type' => 'Ongeldige databasistipe',
 	'config-missing-db-name' => 'U moet \'n waarde vir "Databasnaam" verskaf',
 	'config-sqlite-readonly' => 'Die lêer <code>$1</code> kan nie geskryf word nie.',
@@ -903,7 +1085,7 @@ U gebruik tans $2.',
 	'config-upgrade-done-no-regenerate' => 'Opgradering is voltooi.
 
 U kan nou [$1 u wiki gebruik].',
-	'config-regenerate' => 'Herskep <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Herskep LocalSettings.php →',
 	'config-show-table-status' => 'Die uitvoer van <code>SHOW TABLE STATUS</code> het gefaal!',
 	'config-db-web-account' => 'Databasisgebruiker vir toegang tot die web',
 	'config-mysql-engine' => 'Stoor-enjin:',
@@ -1009,7 +1191,7 @@ $messages['aln'] = array(
 
 * [//www.mediawiki.org/wiki/Help:Configuration_settings Konfigurimi i MediaWikit]
 * [//www.mediawiki.org/wiki/Help:FAQ Pyetjet e shpeshta rreth MediaWikit]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWikit]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWikit]', # Fuzzy
 );
 
 /** Amharic (አማርኛ)
@@ -1022,7 +1204,7 @@ $messages['am'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Aragonese (aragonés)
@@ -1036,20 +1218,20 @@ $messages['an'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de caracteristicas confegurables]
 * [//www.mediawiki.org/wiki/Manual:FAQ Preguntas cutianas sobre MediaWiki (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correu sobre ta anuncios de MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correu sobre ta anuncios de MediaWiki]", # Fuzzy
 );
 
 /** Old English (Ænglisc)
  * @author Gott wisst
  */
 $messages['ang'] = array(
-	'mainpagetext' => "'''MediaǷiki hafaþ ȝeƿorden spēdiȝe inseted.'''",
+	'mainpagetext' => "'''MediaWiki hafaþ geworden spēdige inseted.'''",
 	'mainpagedocfooter' => 'Þeahta þone [//meta.wikimedia.org/wiki/Help:Contents Brūcenda Lǣdend]  on helpe mid þǣre nytte of ƿikisōftƿare.
 
 == Beȝinnunȝ ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Onfæstnunȝa ȝesetednessa ȝetæl]
 * [//www.mediawiki.org/wiki/Manual:FAQ Ȝetæl oft ascodra ascunȝa ymb MediaǷiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ǣrendunȝȝetæl nīƿra MediaǷiki forþsendnessa]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ǣrendunȝȝetæl nīƿra MediaǷiki forþsendnessa]', # Fuzzy
 );
 
 /** Arabic (العربية)
@@ -1115,7 +1297,7 @@ $messages['ary'] = array(
 == L-bdaya mĝa MediaWiki ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista dyal l-paramétraṫ dyal l-konfigurasyon]
 * [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ fe MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista dyal l-modakaraṫ ĝla versyonaṫ jdad dyal MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista dyal l-modakaraṫ ĝla versyonaṫ jdad dyal MediaWiki]', # Fuzzy
 );
 
 /** Egyptian Spoken Arabic (مصرى)
@@ -1128,10 +1310,10 @@ $messages['arz'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings لستة اعدادات الضبط]
 * [//www.mediawiki.org/wiki/Manual:FAQ أسئلة بتكرر حوالين الميدياويكى]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce لستة الايميلات بتاعة اعلانات الميدياويكى]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce لستة الايميلات بتاعة اعلانات الميدياويكى]', # Fuzzy
 );
 
-/** Assamese (অসমীয়া)
+/** Assamese (অসমীয়া)
  * @author Chaipau
  * @author Gitartha.bordoloi
  */
@@ -1142,7 +1324,7 @@ $messages['as'] = array(
 == আৰম্ভণি কৰিবলৈ ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Asturian (asturianu)
@@ -1228,7 +1410,6 @@ $messages['az'] = array(
 	'config-page-install' => 'Nizamlama',
 	'config-page-complete' => 'Komplektləşdir!',
 	'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-mysql-myisam' => 'MyISAM',
 	'config-mysql-utf8' => 'UTF-8',
 	'config-ns-generic' => 'Layihə',
@@ -1242,7 +1423,7 @@ $messages['az'] = array(
 == Faydalı keçidlər ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Tənzimləmələrin siyahısı]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki haqqında tez-tez soruşulan suallar]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçt siyahısı]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçt siyahısı]', # Fuzzy
 );
 
 /** Bashkir (башҡортса)
@@ -1255,7 +1436,7 @@ $messages['ba'] = array(
 == Файҙалы сығанаҡтар ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Көйләүҙәр исемлеге (инг.)];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki тураһында йыш бирелгән һорауҙар һәм яуаптар (инг.)];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ның яңы версиялары тураһында хәбәрҙәр алып тороу].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ның яңы версиялары тураһында хәбәрҙәр алып тороу].', # Fuzzy
 );
 
 /** Bavarian (Boarisch)
@@ -1269,7 +1450,7 @@ $messages['bar'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Listen voh de Konfigurazionsvariaablen]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglisten voh de neichen MediaWiki-Versionen]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglisten voh de neichen MediaWiki-Versionen]', # Fuzzy
 );
 
 /** Southern Balochi (بلوچی مکرانی)
@@ -1281,7 +1462,7 @@ $messages['bcc'] = array(
 == شروع بیت ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Bikol Central (Bikol Central)
@@ -1294,7 +1475,7 @@ $messages['bcl'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Belarusian (беларуская)
@@ -1307,7 +1488,7 @@ $messages['be'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Пералік параметраў канфігурацыі (англ.)]
 * [//www.mediawiki.org/wiki/Manual:FAQ ЧАПЫ MediaWiki (англ.)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ліставанне аб выпусках MediaWiki (англ.)]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ліставанне аб выпусках MediaWiki (англ.)]', # Fuzzy
 );
 
 /** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
@@ -1448,6 +1629,8 @@ MediaWiki патрабуе падтрымкі UTF-8 для слушнай пра
 	'config-mod-security' => "'''Папярэджаньне''': на Вашым ўэб-сэрверы ўключаны [http://modsecurity.org/ mod_security]. У выпадку няслушнай наладцы, ён можа стаць прычынай праблемаў для MediaWiki ці іншага праграмнага забесьпячэньня, якое дазваляе ўдзельнікам дасылаць на сэрвэр любы зьмест.
 Глядзіце [http://modsecurity.org/documentation/ дакумэнтацыю mod_security] ці зьвярніцеся ў падтрымку Вашага хосту, калі ў Вас узьнікаюць выпадковыя праблемы.",
 	'config-diff3-bad' => 'GNU diff3 ня знойдзены.',
+	'config-git' => 'Знойдзеная сыстэма канстролю вэрсіяў Git: <code>$1</code>',
+	'config-git-bad' => 'Сыстэма кантролю вэрсіяў Git ня знойдзеная.',
 	'config-imagemagick' => 'Знойдзены ImageMagick: <code>$1</code>.
 Пасьля ўключэньня загрузак будзе ўключанае маштабаваньне выяваў.',
 	'config-gd' => 'GD падтрымліваецца ўбудавана.
@@ -1545,7 +1728,6 @@ ResourceLoader, складнік MediaWiki, будзе абходзіць гэт
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'MediaWiki падтрымлівае наступныя сыстэмы базаў зьвестак:
 
 $1
@@ -1555,18 +1737,16 @@ $1
 	'config-support-postgres' => '* $1 — вядомая сыстэма базы зьвестак з адкрытым кодам, якая зьяўляецца альтэрнатывай MySQL ([http://www.php.net/manual/en/pgsql.installation.php як кампіляваць PHP з падтрымкай PostgreSQL]). Яна можа ўтрымліваць дробныя памылкі, і не рэкамэндуецца выкарыстоўваць яе для працуючых праектаў.',
 	'config-support-sqlite' => '* $1 — невялікая сыстэма базы зьвестак, якая мае вельмі добрую падтрымку. ([http://www.php.net/manual/en/pdo.installation.php як кампіляваць PHP з падтрымкай SQLite], выкарыстоўвае PDO)',
 	'config-support-oracle' => '* $1 зьяўляецца камэрцыйнай прафэсійнай базай зьвестак. ([http://www.php.net/manual/en/oci8.installation.php Як скампіляваць PHP з падтрымкай OCI8])',
-	'config-support-ibm_db2' => '* $1 — база зьвестак маштабу прадпрыемства. ([http://www.php.net/manual/en/ibm-db2.installation.php Як скампіляваць PHP з падтрымкай IBM DB2])',
 	'config-header-mysql' => 'Налады MySQL',
 	'config-header-postgres' => 'Налады PostgreSQL',
 	'config-header-sqlite' => 'Налады SQLite',
 	'config-header-oracle' => 'Налады Oracle',
-	'config-header-ibm_db2' => 'Налады IBM DB2',
 	'config-invalid-db-type' => 'Няслушны тып базы зьвестак',
 	'config-missing-db-name' => 'Вы павінны ўвесьці значэньне парамэтру «Імя базы зьвестак»',
 	'config-missing-db-host' => 'Вы павінны ўвесьці значэньне парамэтру «Хост базы зьвестак»',
 	'config-missing-db-server-oracle' => 'Вы павінны ўвесьці значэньне парамэтру «TNS базы зьвестак»',
 	'config-invalid-db-server-oracle' => 'Няслушнае TNS базы зьвестак «$1».
-Назва можа ўтрымліваць толькі ASCII-літары (a-z, A-Z), лічбы (0-9), сымбалі падкрэсьліваньня(_) і кропкі (.).',
+Назва можа ўтрымліваць толькі ASCII-літары (a-z, A-Z), лічбы (0-9), сымбалі падкрэсьліваньня(_) і кропкі (.).', # Fuzzy
 	'config-invalid-db-name' => 'Няслушная назва базы зьвестак «$1».
 Назва можа ўтрымліваць толькі ASCII-літары (a-z, A-Z), лічбы (0-9), сымбалі падкрэсьліваньня(_) і працяжнікі (-).',
 	'config-invalid-db-prefix' => 'Няслушны прэфікс базы зьвестак «$1».
@@ -1622,7 +1802,7 @@ chmod a+w $3</pre>',
 	'config-upgrade-done-no-regenerate' => 'Абнаўленьне скончанае.
 
 Цяпер Вы можаце [$1 пачаць працу з вікі].',
-	'config-regenerate' => 'Рэгенэраваць <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Рэгенэраваць LocalSettings.php →',
 	'config-show-table-status' => "Запыт '<code>SHOW TABLE STATUS</code>' не атрымаўся!",
 	'config-unknown-collation' => "'''Папярэджаньне:''' база зьвестак выкарыстоўвае нераспазнанае супастаўленьне.",
 	'config-db-web-account' => 'Рахунак базы зьвестак для вэб-доступу',
@@ -1652,7 +1832,6 @@ chmod a+w $3</pre>',
 Гэта болей эфэктыўна за рэжым MySQL UTF-8, і дазваляе Вам выкарыстоўваць увесь дыяпазон сымбаляў Unicode.
 
 У '''рэжыме UTF-8''', MySQL ведае, якая табліцы сымбаляў выкарыстоўваецца ў Вашых зьвестках, і можа адпаведна прадстаўляць і канвэртаваць іх, але гэта не дазволіць Вам захоўваць сымбалі па-за межамі [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базавага шматмоўнага дыяпазону].",
-	'config-ibm_db2-low-db-pagesize' => "Вашая база зьвестак DB2 мае таблічную прасторну зь недастатковым памерам старонкі. Памер старонкі мусіць быць ня менш за '''32к'''.",
 	'config-site-name' => 'Назва вікі:',
 	'config-site-name-help' => 'Назва будзе паказвацца ў загалоўку браўзэра і ў некаторых іншых месцах.',
 	'config-site-name-blank' => 'Увядзіце назву сайта.',
@@ -1762,7 +1941,7 @@ chmod a+w $3</pre>',
 	'config-logo-help' => 'Афармленьне MediaWiki па змоўчваньні уключае прастору для лягатыпу памерам 135×160 піксэляў у верхнім левым куце.
 Загрузіце выяву адпаведнага памеру і увядзіце тут URL-адрас.
 
-Калі Вы не жадаеце мець ніякага лягатыпу, пакіньце поле пустым.',
+Калі Вы не жадаеце мець ніякага лягатыпу, пакіньце поле пустым.', # Fuzzy
 	'config-instantcommons' => 'Дазволіць Instant Commons',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] — магчымасьць, якая дазваляе вікі выкарыстоўваць выявы, гукі і іншыя мэдыя, якія знаходзяцца на сайце [//commons.wikimedia.org/ Wikimedia Commons].
 Каб гэта зрабіць, MediaWiki патрабуе доступу да Інтэрнэту.
@@ -2071,7 +2250,6 @@ $1
 Това включва сурови данни за потребителите (адреси за е-поща, хеширани пароли), както и изтрити версии на страници и друга чувствителна и с ограничен достъп информация от и за уикито.
 
 Базата от данни е препоръчително да се разположи на друго място, например в <code>/var/lib/mediawiki/yourwiki</code>.",
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'МедияУики поддържа следните системи за бази от данни:
 
 $1
@@ -2081,12 +2259,10 @@ $1
 	'config-support-postgres' => '* $1 е популярна система за бази от данни с отворен изходен код, която е алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php как се компилира PHP с поддръжка на PostgreSQL]). Възможно е все още да има грешки, затова не се препоръчва да се използва в общодостъпна среда.',
 	'config-support-sqlite' => '* $1 е лека система за база от данни, която е много добре поддържана. ([http://www.php.net/manual/en/pdo.installation.php Как се компилира PHP с поддръжка на SQLite], използва PDO)',
 	'config-support-oracle' => '* $1 е комерсиална корпоративна база от данни. ([http://www.php.net/manual/en/oci8.installation.php Как се компилира PHP с поддръжка на OCI8])',
-	'config-support-ibm_db2' => '* $1 е комерсиална фирмена база от данни. ([http://www.php.net/manual/en/ibm-db2.installation.php Как се компилира PHP с поддръжка на IBM DB2])',
 	'config-header-mysql' => 'Настройки за MySQL',
 	'config-header-postgres' => 'Настройки за PostgreSQL',
 	'config-header-sqlite' => 'Настройки за SQLite',
 	'config-header-oracle' => 'Настройки за Oracle',
-	'config-header-ibm_db2' => 'Настройки за IBM DB2',
 	'config-invalid-db-type' => 'Невалиден тип база от данни',
 	'config-missing-db-name' => 'Необходимо е да се въведе стойност за "Име на базата от данни"',
 	'config-missing-db-host' => 'Необходимо е да се въведе стойност за "Хост на базата от данни"',
@@ -2148,7 +2324,7 @@ chmod a+w $3</pre>',
 	'config-upgrade-done-no-regenerate' => 'Обновяването приключи.
 
 Вече е възможно [$1 да използвате уикито].',
-	'config-regenerate' => 'Създаване на <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Създаване на LocalSettings.php →',
 	'config-show-table-status' => 'Заявката <code>SHOW TABLE STATUS</code> не сполучи!',
 	'config-unknown-collation' => "'''Предупреждение:''' Базата от данни използва неразпозната колация.",
 	'config-db-web-account' => 'Сметка за уеб достъп до базата от данни',
@@ -2286,7 +2462,7 @@ chmod a+w $3</pre>',
 	'config-logo-help' => 'Обликът по подразбиране на МедияУики вклчва място с размери 135х160 пиксела за лого над страничното меню.
 Ако има наличен файл с подходящ размер, неговият адрес може да бъде посочен тук.
 
-Ако не е необходимо лого, полето може да се остави празно.',
+Ако не е необходимо лого, полето може да се остави празно.', # Fuzzy
 	'config-instantcommons' => 'Включване на Instant Commons',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] е функционалност, която позволява на уикитата да използват картинки, звуци и друга медиа от сайта на Уикимедия [//commons.wikimedia.org/ Общомедия].
 За да е възможно това, МедияУики изисква достъп до Интернет.
@@ -2399,7 +2575,7 @@ $messages['bjn'] = array(
 == Gasan bamula ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Daptar konpigurasi setélan]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki nang rancak ditakunakan]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki rilis milis]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki rilis milis]', # Fuzzy
 );
 
 /** Bengali (বাংলা)
@@ -2445,12 +2621,10 @@ $messages['bn'] = array(
 	'config-sqlite-dir' => 'এসকিউলাইট ডেটা ডিরেক্টরি:',
 	'config-oracle-def-ts' => 'পূর্বনির্ধারিত টেবিলস্পেস',
 	'config-oracle-temp-ts' => 'সাময়কি টেবিলস্পেস:',
-	'config-type-ibm_db2' => 'আইবিএম ডিবি২',
 	'config-header-mysql' => 'মাইএসকিউএল সেটিংস',
 	'config-header-postgres' => 'পোস্টগ্রেএসকিউএল সেটিংস',
 	'config-header-sqlite' => 'এসকিউলাইট সেটিংস',
 	'config-header-oracle' => 'ওরাকল সেটিংস',
-	'config-header-ibm_db2' => 'আইবিএম ডিবি২ সেটিংস',
 	'config-invalid-db-type' => 'ডেটাবেজের ধরন অগ্রহযোগ্য',
 	'config-missing-db-name' => 'আপনাকে অবশ্যই "ডেটাবেজ নাম"-এর জন্য একটি মান প্রবেশ করাতে হবে',
 	'config-missing-db-host' => 'আপনাকে অবশ্যই "ডেটাবেজ হোস্ট"-এর জন্য একটি মান প্রবেশ করাতে হবে',
@@ -2480,7 +2654,7 @@ $messages['bn'] = array(
 	'config-optional-continue' => 'আরও প্রশ্ন জিজ্ঞেস করুন।',
 	'config-optional-skip' => 'আমি ইতিমধ্যেই বিরক্ত হয়ে গেছি, উইকিটি ইন্সটল করো।',
 	'config-profile' => 'ব্যবহারকারী অধিকার প্রোফাইল:',
-	'config-profile-wiki' => 'গতানুগতিক উইকি',
+	'config-profile-wiki' => 'গতানুগতিক উইকি', # Fuzzy
 	'config-profile-no-anon' => 'অ্যাকাউন্ট তৈরি করা বাধ্যতামূলক',
 	'config-profile-fishbowl' => 'শুধুমাত্র নির্ধারিত সম্পাদকদের  জন্যই',
 	'config-profile-private' => 'ব্যক্তিগত উইকি',
@@ -2514,7 +2688,7 @@ $messages['bn'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings কনফিগারেশন সেটিংস তালিকা]
 * [//www.mediawiki.org/wiki/Manual:FAQ প্রশ্নোত্তরে মিডিয়াউইকি]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি রিলিজের মেইলিং লিস্ট]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি রিলিজের মেইলিং লিস্ট]', # Fuzzy
 );
 
 /** Bishnupria Manipuri (বিষ্ণুপ্রিয়া মণিপুরী)
@@ -2527,7 +2701,7 @@ $messages['bpy'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings কনফিগারেশন সেটিংর তালিকাহান]
 * [//www.mediawiki.org/wiki/Manual:FAQ মিডিয়া উইকি আঙলাক]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়া উইকির ফঙপার বারে মেইলর তালিকাহান]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়া উইকির ফঙপার বারে মেইলর তালিকাহান]', # Fuzzy
 );
 
 /** Breton (brezhoneg)
@@ -2773,7 +2947,7 @@ Da hizivaat anezho da VediaWiki $1, klikañ war '''Kenderc'hel'''.",
 	'config-upgrade-done-no-regenerate' => 'Hizivadenn kaset da benn.
 
 Gallout a rit [$1 kregiñ da implijout ho wiki].',
-	'config-regenerate' => 'Adgenel <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Adgenel LocalSettings.php →',
 	'config-show-table-status' => "C'hwitet ar reked <code>SHOW TABLE STATUS</code> !",
 	'config-unknown-collation' => "'''Diwallit :''' Emañ an diaz roadennoù o renkañ an traoù diouzh un urzh lizherennek dianav.",
 	'config-db-web-account' => 'Kont an diaz roadennoù evit ar voned Kenrouedad',
@@ -3036,16 +3210,26 @@ $messages['ca'] = array(
 
 /** Chechen (нохчийн)
  * @author Sasan700
+ * @author Умар
  */
 $messages['ce'] = array(
+	'config-your-language' => 'Хьан мотт:',
+	'config-continue' => 'Кхин дӀа →',
+	'config-page-language' => 'Мотт',
+	'config-page-name' => 'ЦӀе',
 	'config-no-fts3' => "'''Тергам бе''': SQLite гулйина хуттург йоцуш [//sqlite.org/fts3.html FTS3] — лахар болхбеш хир дац оцу бухца.",
+	'config-site-name' => 'Викин цӀе:',
+	'config-site-name-blank' => 'Язъе сайтан цӀе.',
+	'config-license' => 'Авторан бакъонаш а лицензи а:',
+	'config-license-pd' => 'Юкъараллин хьал',
+	'config-help' => 'гӀо',
 	'mainpagetext' => "'''Вики-белха гlирс «MediaWiki» кхочуш дика дlахlоттийна.'''",
 	'mainpagedocfooter' => 'Викийца болх бан хаамаш карор бу хlокху чохь [//meta.wikimedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5 нисвохааман куьйгаллица].
 
 == Цхьаболу пайде гlирсаш ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Гlирс нисбан тарлушболу могlам];
 * [//www.mediawiki.org/wiki/Manual:FAQ Сих сиха лушдолу хаттарш а жоьпаш оцу MediaWiki];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араяларца башхонца керла MediaWiki].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араяларца башхонца керла MediaWiki].', # Fuzzy
 );
 
 /** Cebuano (Cebuano)
@@ -3057,17 +3241,36 @@ $messages['ceb'] = array(
 == Pagsugod ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Listahan sa mga setting sa kompigurasyon]
 * [//www.mediawiki.org/wiki/Manual:FAQ FAQ sa MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce  Mailing list sa mga release sa MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce  Mailing list sa mga release sa MediaWiki]', # Fuzzy
 );
 
 /** Sorani Kurdish (کوردی)
  * @author Asoxor
  * @author Calak
+ * @author Muhammed taha
  */
 $messages['ckb'] = array(
 	'config-wiki-language' => 'زمانی ویکی:',
+	'config-back' => '→ گەڕانەوە',
+	'config-continue' => 'بەردەوامبوون ←',
 	'config-page-language' => 'زمان',
+	'config-page-welcome' => 'بەخێربێیت بۆ میدیاویکی!',
+	'config-page-dbconnect' => 'پەیوەندی دەکات بەبنکەی زانیارییەکان',
+	'config-page-upgrade' => 'نويکردنەوەی دابەزاندنی پێشوو',
+	'config-page-dbsettings' => 'ڕێکخستنەکانی بنکەی زانیارییەکان',
 	'config-page-name' => 'ناو',
+	'config-page-options' => 'ھەڵبژاردەکان',
+	'config-page-install' => 'دابەزاندن',
+	'config-page-complete' => 'تەواو!',
+	'config-page-restart' => 'دەست پێکردنەوە بەدابەزاندن',
+	'config-page-readme' => 'بمخوێنەوە',
+	'config-page-copying' => 'لەبەردەگیرێتەوە',
+	'config-page-upgradedoc' => 'نوێدەکرێتەوە',
+	'config-page-existingwiki' => 'ویکی پێشوو',
+	'config-restart' => 'بەڵێ، دەستی پێ بکەرەوە',
+	'config-env-php' => 'PHP $1 دابەزێندرا.',
+	'config-env-php-toolow' => 'PHP $1 دابەزێندرا.
+ھەرچۆنێک بێت میدیاویکی پێویستی بە PHP $2 یان بەرزتر ھەیە.',
 	'mainpagetext' => "'''میدیاویکی بە سەرکەوتوویی دامەزرا.'''",
 	'mainpagedocfooter' => 'لە [//meta.wikimedia.org/wiki/Help:Contents ڕێنوێنیی بەکارھێنەران] بۆ زانیاری سەبارەت بە بەکارھێنانی نەرمامێری ویکی کەڵک وەربگرە.
 
@@ -3089,7 +3292,7 @@ $messages['cps'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sang mga setting sang konpigurayon]
 * [//www.mediawiki.org/wiki/Manual:FAQ Mga perme napangkot sa MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat sang MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat sang MediaWiki]', # Fuzzy
 );
 
 /** Crimean Turkish (Cyrillic script) (къырымтатарджа (Кирилл)‎)
@@ -3101,7 +3304,7 @@ $messages['crh-cyrl'] = array(
 == Базы файдалы сайтлар ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Олуджы сазламалар джедвели];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki боюнджа сыкъ берильген суаллернен джеваплар];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-нинъ янъы версияларынынъ чыкъувындан хабер йиберюв].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-нинъ янъы версияларынынъ чыкъувындан хабер йиберюв].", # Fuzzy
 );
 
 /** Crimean Turkish (Latin script) (qırımtatarca (Latin)‎)
@@ -3113,11 +3316,12 @@ $messages['crh-latn'] = array(
 == Bazı faydalı saytlar ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Olucı sazlamalar cedveli];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki boyunca sıq berilgen suallernen cevaplar];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-niñ yañı versiyalarınıñ çıquvından haber yiberüv].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-niñ yañı versiyalarınıñ çıquvından haber yiberüv].", # Fuzzy
 );
 
 /** Czech (česky)
  * @author Danny B.
+ * @author Jezevec
  * @author Mormegil
  * @author 아라
  */
@@ -3172,8 +3376,8 @@ Zkontrolujte svůj soubor php.ini a ujistěte se, že <code>session.save_path</c
 	'config-help-restart' => 'Chcete smazat všechny údaje, které jste zadali, a spustit proces instalace znovu od začátku?',
 	'config-restart' => 'Ano, restartovat',
 	'config-welcome' => '=== Kontrola prostředí ===
-Provedou se základní kontroly, aby se zjistilo, zda je toto prostředí použitelné k instalaci MediaWiki.
-Pokud budete potřebovat při instalaci pomoc, měli byste sdělit výsledky těchto testů.',
+Nyní se provedou základní kontroly, aby se zjistilo, zda je toto prostředí použitelné k instalaci MediaWiki.
+Pokud budete potřebovat k dokončení instalace pomoc, nezapomeňte sdělit výsledky těchto testů.',
 	'config-copyright' => "=== Licence a podmínky ===
 $1
 
@@ -3242,6 +3446,10 @@ MediaWiki vyžaduje ke správné funkci podporu UTF-8.",
 To je pravděpodobně příliš málo.
 Instalace může selhat!",
 	'config-ctype' => "'''Kritická chyba''': PHP musí být přeloženo s podporou pro [http://www.php.net/manual/en/ctype.installation.php rozšíření Ctype].",
+	'config-json' => "'''Kritická chyba:''' PHP bylo přeloženo bez podpory JSON.
+Před instalací MediaWiki musíte buď nainstalovat rozšíření PHP JSON nebo rozšíření [http://pecl.php.net/package/jsonc PECL jsonc].
+* Rozšíření PHP je součástí Red Hat Enterprise Linux (CentOS) 5 a 6, avšak musí se povolit v <code>/etc/php.ini</code> nebo <code>/etc/php.d/json.ini</code>.
+* V některých linuxových distribucích vydaných po květnu 2013 může toto rozšíření PHP chybět a místo toho mohou používat rozšíření PECL jako <code>php5-json</code> nebo <code>php-pecl-jsonc</code>.",
 	'config-xcache' => 'Je nainstalována [http://xcache.lighttpd.net/ XCache]',
 	'config-apc' => 'Je nainstalováno [http://www.php.net/apc APC]',
 	'config-wincache' => 'Je nainstalována [http://www.iis.net/download/WinCacheForPhp WinCache]',
@@ -3250,6 +3458,8 @@ Kešování objektů bude vypnuto.",
 	'config-mod-security' => "'''Upozornění''': váš webový server má zapnuto [http://modsecurity.org/ mod_security]. Při chybné konfiguraci může způsobovat potíže MediaWiki či dalším programům, které umožňují ukládat libovolný obsah.
 Pokud narazíte na náhodné chyby, podívejte se do [http://modsecurity.org/documentation/ dokumentace mod_security] nebo kontaktujte technickou podporu vašeho poskytovatele.",
 	'config-diff3-bad' => 'Nebyl nalezen GNU diff3.',
+	'config-git' => 'Nalezen software pro správu verzí Git: <code>$1</code>.',
+	'config-git-bad' => 'Software pro správu verzí Git nebyl nalezen.',
 	'config-imagemagick' => 'Nalezen ImageMagick: <code>$1</code>.
 Pokud povolíte načítání souborů, bude zapnuto vytváření náhledů.',
 	'config-gd' => 'Nalezena vestavěná grafická knihovna GD.
@@ -3348,7 +3558,6 @@ Zvažte umístění databáze někam zcela jinam, například do <code>/var/lib/
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Věštba',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'MediaWiki podporuje následující databázové systémy:
 
 $1
@@ -3358,18 +3567,16 @@ Pokud v nabídce níže nevidíte databázový systém, který chcete použít,
 	'config-support-postgres' => '* $1 je populární open-source databázový systém používaný jako alternativa k MySQL ([http://www.php.net/manual/en/pgsql.installation.php jak přeložit PHP s podporou PostgreSQL]). Mohou se vyskytnout ještě nějaké menší chyby, použití v produkčním prostředí se nedoporučuje.',
 	'config-support-sqlite' => '* $1 je velmi dobře podporovaný lehký databázový systém. ([http://www.php.net/manual/en/pdo.installation.php Jak přeložit PHP s podporou SQLite], používá PDO)',
 	'config-support-oracle' => '* $1 je komerční podniková databáze. ([http://www.php.net/manual/en/oci8.installation.php Jak přeložit PHP s podporou OCI8])',
-	'config-support-ibm_db2' => '* $1 je komerční podniková databáze. ([http://www.php.net/manual/en/ibm-db2.installation.php Jak přeložit PHP s podporou IBM DB2])',
 	'config-header-mysql' => 'Nastavení MySQL',
 	'config-header-postgres' => 'Nastavení PostgreSQL',
 	'config-header-sqlite' => 'Nastavení SQLite',
 	'config-header-oracle' => 'Nastavení Oracle',
-	'config-header-ibm_db2' => 'Nastavení IBM DB2',
 	'config-invalid-db-type' => 'Chybný typ databáze',
 	'config-missing-db-name' => 'Musíte zadat hodnotu pro „Jméno databáze“',
 	'config-missing-db-host' => 'Musíte zadat hodnotu pro „Databázový server“',
 	'config-missing-db-server-oracle' => 'Musíte zadat hodnotu pro „Databázové TNS“',
 	'config-invalid-db-server-oracle' => 'Chybné databázové TNS „$1“.
-Používejte pouze ASCII písmena (a-z, A-Z), čísla (0-9), podtržítko (_) a tečku (.).',
+Používejte buď „TNS Name“ nebo „Easy Connect“ (vizte [http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).',
 	'config-invalid-db-name' => 'Chybné jméno databáze „$1“.
 Používejte pouze ASCII písmena (a-z, A-Z), čísla (0-9), podtržítko (_) a spojovník (-).',
 	'config-invalid-db-prefix' => 'Chybný databázový prefix „$1“.
@@ -3425,7 +3632,7 @@ To se ale '''nedoporučuje''', pokud s wiki nemáte problémy.",
 	'config-upgrade-done-no-regenerate' => 'Aktualizace byla dokončena.
 
 Svou wiki teď můžete [$1 začít používat].',
-	'config-regenerate' => 'Přegenerovat <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Přegenerovat LocalSettings.php →',
 	'config-show-table-status' => 'Dotaz <code>SHOW TABLE STATUS</code> se nezdařil!',
 	'config-unknown-collation' => "'''Upozornění:''' Databáze používá nerozpoznané řazení.",
 	'config-db-web-account' => 'Databázový účet pro webový přístup',
@@ -3444,6 +3651,12 @@ Svou wiki teď můžete [$1 začít používat].',
 
 Pokud vaše instalace MySQL podporuje InnoDB, důrazně doporučujeme použít spíše to.
 Pokud vaše instalace MySQL InnoDB nepodporuje, možná je čas na aktualizaci.",
+	'config-mysql-only-myisam-dep' => "'''Upozornění:''' Jediným dostupným formátem dat pro MySQL je MyISAM, který se k užití pro MediaWiki nedoporučuje, protože:
+* téměř nepodporuje současný přístup kvůli zamykání tabulek,
+* oproti jiným formátům je náchylnější k poškození,
+* kód MediaWiki nepodporuje MyISAM tak dobře, jak by bylo potřeba.
+
+Vaše instalace MySQL nepodporuje InnoDB, možná je na čase upgradovat.",
 	'config-mysql-engine-help' => "'''InnoDB''' je téměř vždy nejlepší volba, neboť má dobrou podporu současného přístupu.
 
 '''MyISAM''' může být rychlejší u instalací pro jednoho uživatele nebo jen pro čtení.
@@ -3455,7 +3668,6 @@ Databáze MyISAM bývají poškozeny častěji než databáze InnoDB.",
 To je výkonnější než UTF-8 režim MySQL a umožňuje využít plný rozsah znaků Unicode.
 
 V '''režimu UTF-8''' bude MySQL znát znakovou sadu vašich dat a může je příslušně zobrazovat a převádět, ale neumožní vám uložit znaky mimo [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
-	'config-ibm_db2-low-db-pagesize' => "Vaše DB2 databáze má implicitní tabulkový prostor s nedostatečnou velikostí stránky. Velikost stránky musí být minimálně '''32K'''.",
 	'config-site-name' => 'Název wiki:',
 	'config-site-name-help' => 'Bude se zobrazovat v titulku prohlížeče a na dalších místech.',
 	'config-site-name-blank' => 'Zadejte název serveru.',
@@ -3565,6 +3777,8 @@ Tento adresář by ideálně neměl být dostupný z webu.',
 	'config-logo-help' => 'Základní vzhled MediaWiki zahrnuje místo pro logo o velikosti 135×160 pixelů nad bočním menu.
 Načtěte obrázek odpovídající velikosti a zadejte sem jeho URL.
 
+Pokud je vaše logo umístěno relativně vůči <code>$wgStylePath</code> nebo <code>$wgScriptPath</code>, můžete zde tyto proměnné použít.
+
 Pokud logo nechcete, ponechte toto pole prázdné.',
 	'config-instantcommons' => 'Zapnout Instant Commons',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] je funkce, která umožňuje wiki používat obrázky, zvuky a další mediální soubory ze serveru [//commons.wikimedia.org/wiki/Hlavn%C3%AD_strana Wikimedia Commons].
@@ -3658,6 +3872,9 @@ Až to dokončíte, můžete '''[$2 vstoupit do své wiki]'''.",
 	'config-download-localsettings' => 'Stáhnout <code>LocalSettings.php</code>',
 	'config-help' => 'nápověda',
 	'config-nofile' => 'Soubor „$1“ nelze nalézt. Byl smazán?',
+	'config-extension-link' => 'Věděli jste, že vaše wiki podporuje [//www.mediawiki.org/wiki/Manual:Extensions rozšíření]?
+
+Můžete procházet [//www.mediawiki.org/wiki/Category:Extensions_by_category rozšíření po kategoriích] nebo si prohlédnout [//www.mediawiki.org/wiki/Extension_Matrix Matici rozšíření] obsahující úplný seznam.',
 	'mainpagetext' => "'''MediaWiki byla úspěšně nainstalována.'''",
 	'mainpagedocfooter' => '[//meta.wikimedia.org/wiki/Help:Contents Uživatelská příručka] vám napoví, jak MediaWiki používat.
 
@@ -3675,6 +3892,15 @@ $messages['csb'] = array(
 	'mainpagetext' => "'''MediaWiki òsta zainstalowónô.'''",
 );
 
+/** Church Slavic (словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ)
+ * @author ОйЛ
+ */
+$messages['cu'] = array(
+	'config-page-language' => 'ѩꙁꙑкъ',
+	'config-page-name' => 'имѧ',
+	'config-help' => 'помощь',
+);
+
 /** Chuvash (Чӑвашла)
  */
 $messages['cv'] = array(
@@ -3684,21 +3910,23 @@ $messages['cv'] = array(
 == Пулăшма пултарĕç ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Ĕнерлевсен списокĕ];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki тăрăх час-часах ыйтакан ыйтусемпе хуравсем];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki çĕнĕ верси тухнине пĕлтерекен рассылка].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki çĕнĕ верси тухнине пĕлтерекен рассылка].', # Fuzzy
 );
 
 /** Welsh (Cymraeg)
+ * @author Lloffiwr
  * @author Xxglennxx
  */
 $messages['cy'] = array(
 	'mainpagetext' => "'''Wedi llwyddo gosod meddalwedd MediaWiki yma'''",
-	'mainpagedocfooter' => 'Ceir cymorth (yn Saesneg) ar ddefnyddio meddalwedd wici yn y [//meta.wikimedia.org/wiki/Help:Contents Canllaw Defnyddwyr] ar wefan Wikimedia.
+	'mainpagedocfooter' => "Ceir cymorth (yn Saesneg) ar ddefnyddio meddalwedd wici yn y [//meta.wikimedia.org/wiki/Help:Contents Canllaw Defnyddwyr] ar wefan Wikimedia.
 
 ==Cychwyn arni==
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Rhestr osodiadau wrth gyflunio]
 * [//www.mediawiki.org/wiki/Manual:FAQ Cwestiynau poblogaidd ar MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Rhestr postio datganiadau MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Rhestr postio datganiadau MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Cyfieithu MediaWici i'ch iaith chi]",
 );
 
 /** Danish (dansk)
@@ -3711,10 +3939,11 @@ $messages['da'] = array(
 == At komme i gang ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Listen over opsætningsmuligheder]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki ofte stillede spørgsmål]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]', # Fuzzy
 );
 
 /** German (Deutsch)
+ * @author Geitost
  * @author Kghbln
  * @author LWChris
  * @author Metalhead64
@@ -3777,8 +4006,8 @@ Die Datei <code>php.ini</code> muss geprüft und es muss dabei sichergestellt we
 	'config-help-restart' => 'Sollen alle bereits eingegebenen Daten gelöscht und der Installationsvorgang erneut gestartet werden?',
 	'config-restart' => 'Ja, erneut starten',
 	'config-welcome' => '=== Prüfung der Installationsumgebung ===
-Die Basisprüfungen werden durchgeführt, um festzustellen, ob die Installationsumgebung für die Installation von MediaWiki geeignet ist.
-Die Ergebnisse dieser Prüfung sollten angegeben werden, sofern während des Installationsvorgangs Hilfe benötigt und erfragt wird.',
+Die Basisprüfungen werden jetzt durchgeführt, um festzustellen, ob die Installationsumgebung für die Installation von MediaWiki geeignet ist.
+Nimm diese Information auf, falls du Unterstützung bei der Vervollständigung der Installation benötigst.',
 	'config-copyright' => "=== Lizenz und Nutzungsbedingungen ===
 
 $1
@@ -3787,7 +4016,7 @@ Dieses Programm ist freie Software, d. h. es kann, gemäß den Bedingungen der v
 
 Dieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings '''ohne jegliche Garantie''' und sogar ohne die implizierte Garantie einer '''Marktgängigkeit''' oder '''Eignung für einen bestimmten Zweck'''. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.
 
-Eine <doclink href=Copying>Kopie der ''GNU General Public License''</doclink> sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [http://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
+Eine <doclink href=Copying>Kopie der GNU General Public License</doclink> sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [http://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
 	'config-sidebar' => '* [//www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]
 * [//www.mediawiki.org/wiki/Help:Contents/de Benutzeranleitung]
 * [//www.mediawiki.org/wiki/Manual:Contents/de Administratorenanleitung]
@@ -3847,14 +4076,20 @@ MediaWiki benötigt die UTF-8-Unterstützung, um fehlerfrei lauffähig zu sein."
 Dieser Wert ist wahrscheinlich zu niedrig.
 Der Installationsvorgang könnte daher scheitern!",
 	'config-ctype' => "'''Fataler Fehler:''' PHP muss mit Unterstützung für das [http://www.php.net/manual/de/ctype.installation.php Modul ctype] kompiliert werden.",
+	'config-json' => "'''Fatal:''' PHP wurde ohne JSON-Support kompiliert.
+Du musst entweder die PHP-JSON- oder die [http://pecl.php.net/package/jsonc PECL-jsonc]-Erweiterung installieren, bevor du MediaWiki installierst.
+* Die PHP-Erweiterung ist in Red Hat Enterprise Linux (CentOS) 5 und 6 enthalten, muss jedoch in <code>/etc/php.ini</code> oder <code>/etc/php.d/json.ini</code> aktiviert werden.
+* Einige Linux-Distributionen, die nach Mai 2013 veröffentlicht wurden, lassen die PHP-Erweiterung weg, stattdessen wird die PECL-Erweiterung als <code>php5-json</code> oder <code>php-pecl-jsonc</code> mitgeliefert.",
 	'config-xcache' => '[http://xcache.lighttpd.net/ XCache] ist installiert',
 	'config-apc' => '[http://www.php.net/apc APC] ist installiert',
 	'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] ist installiert',
-	'config-no-cache' => "'''Warnung:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] konnten nicht gefunden werden.
+	'config-no-cache' => "'''Warnung:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] wurden nicht gefunden.
 Das Objektcaching kann daher nicht aktiviert werden.",
 	'config-mod-security' => "'''Warnung:''' Auf dem Webserver wurde [http://modsecurity.org/ ModSecurity] aktiviert. Sofern falsch konfiguriert, kann dies zu Problemen mit MediaWiki sowie anderer Software auf dem Server führen und es Benutzern ermöglichen beliebige Inhalte im Wiki einzustellen.
 Für weitere Informationen empfehlen wir die [http://modsecurity.org/documentation/ Dokumentation zu ModSecurity] oder den Kontakt zum Hoster, sofern Fehler auftreten.",
 	'config-diff3-bad' => 'GNU diff3 wurde nicht gefunden.',
+	'config-git' => 'Die Git-Versionsverwaltungssoftware wurde gefunden: <code>$1</code>.',
+	'config-git-bad' => 'Die Git-Versionsverwaltungssoftware wurde nicht gefunden.',
 	'config-imagemagick' => 'ImageMagick wurde gefunden: <code>$1</code>.
 Miniaturansichten von Bildern werden möglich sein, sobald das Hochladen von Dateien aktiviert wurde.',
 	'config-gd' => 'Die im System integrierte GD-Grafikbibliothek wurde gefunden.
@@ -3939,19 +4174,18 @@ Nur Änderungen daran vornehmen, sofern es gute Gründe dafür gibt.',
 
 Das für sie vorgesehene Verzeichnis muss während des Installationsvorgangs beschreibbar sein.
 
-Es sollte '''nicht'' über das Web zugänglich sein, was der Grund ist, warum die Datei nicht dort abgelegt wird, wo sich die PHP-Dateien befinden.
+Es sollte '''nicht''' über das Web zugänglich sein, was der Grund ist, warum die Datei nicht dort abgelegt wird, wo sich die PHP-Dateien befinden.
 
 Das Installationsprogramm wird mit der Datei zusammen eine zusätzliche <code>.htaccess</code>-Datei erstellen. Sofern dies scheitert, können Dritte auf die Datendatei zugreifen.
 Dies umfasst die Nutzerdaten (E-Mail-Adressen, Passwörter, etc.) wie auch gelöschte Seitenversionen und andere vertrauliche Daten, die im Wiki gespeichert sind.
 
-Es ist daher zu erwägen die Datendatei an gänzlich anderer Stelle abzulegen, beispielsweise im Verzeichnis <code>./var/lib/mediawiki/yourwiki</code>.",
+Es ist daher zu erwägen, die Datendatei an gänzlich anderer Stelle abzulegen, beispielsweise im Verzeichnis <code>./var/lib/mediawiki/yourwiki</code>.",
 	'config-oracle-def-ts' => 'Standardtabellenraum:',
 	'config-oracle-temp-ts' => 'Temporärer Tabellenraum:',
 	'config-type-mysql' => 'MySQL',
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'MediaWiki unterstützt die folgenden Datenbanksysteme:
 
 $1
@@ -3961,18 +4195,16 @@ Sofern nicht das Datenbanksystem angezeigt wird, das verwendet werden soll, gibt
 	'config-support-postgres' => '* $1 ist ein beliebtes Open-Source-Datenbanksystem und eine Alternative zu MySQL ([http://www.php.net/manual/de/pgsql.installation.php Anleitung zur Kompilierung von PHP mit PostgreSQL-Unterstützung]). Es gibt allerdings einige kleinere Implementierungsfehler, so dass von der Nutzung in einer Produktivumgebung abgeraten wird.',
 	'config-support-sqlite' => '* $1 ist ein verschlanktes Datenbanksystem, das auch gut unterstützt wird ([http://www.php.net/manual/de/pdo.installation.php Anleitung zur Kompilierung von PHP mit SQLite-Unterstützung], verwendet PHP Data Objects (PDO))',
 	'config-support-oracle' => '* $1 ist eine kommerzielle Unternehmensdatenbank ([http://www.php.net/manual/en/oci8.installation.php Anleitung zur Kompilierung von PHP mit OCI8-Unterstützung (en)])',
-	'config-support-ibm_db2' => '* $1 ist eine kommerzielle Unternehmensdatenbank ([http://www.php.net/manual/en/ibm-db2.installation.php PHP mit IBM-DB2-Support kompilieren])',
 	'config-header-mysql' => 'MySQL-Einstellungen',
 	'config-header-postgres' => 'PostgreSQL-Einstellungen',
 	'config-header-sqlite' => 'SQLite-Einstellungen',
 	'config-header-oracle' => 'Oracle-Einstellungen',
-	'config-header-ibm_db2' => 'IBM DB2-Einstellungen',
 	'config-invalid-db-type' => 'Unzulässiges Datenbanksystem',
 	'config-missing-db-name' => 'Bei „Datenbankname“ muss ein Wert angegeben werden.',
 	'config-missing-db-host' => 'Bei „Datenbankhost“ muss ein Wert angegeben werden.',
 	'config-missing-db-server-oracle' => 'Für das „Datenbank-TNS“ muss ein Wert eingegeben werden',
 	'config-invalid-db-server-oracle' => 'Ungültiges Datenbank-TNS „$1“.
-Es dürfen nur ASCII-codierte Buchstaben (a-z, A-Z), Zahlen (0-9) und Unterstriche (_) und Punkte (.) verwendet werden.',
+Entweder „TNS Name“ oder eine „Easy Connect“-Zeichenfolge verwenden ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle-Benennungsmethoden])',
 	'config-invalid-db-name' => 'Ungültiger Datenbankname „$1“.
 Es dürfen nur ASCII-codierte Buchstaben (a-z, A-Z), Zahlen (0-9), Unter- (_) sowie Bindestriche (-) verwendet werden.',
 	'config-invalid-db-prefix' => 'Ungültiger Datenbanktabellenpräfix „$1“.
@@ -4029,7 +4261,7 @@ Dies wird '''nicht empfohlen''', es sei denn, es treten Probleme mit dem Wiki au
 	'config-upgrade-done-no-regenerate' => 'Die Aktualisierung ist abgeschlossen.
 
 Das Wiki kann nun [$1 genutzt werden].',
-	'config-regenerate' => '<code>LocalSettings.php</code> neu erstellen →',
+	'config-regenerate' => 'LocalSettings.php neu erstellen →',
 	'config-show-table-status' => 'Die Abfrage <code>SHOW TABLE STATUS</code> ist gescheitert!',
 	'config-unknown-collation' => "'''Warnung:''' Die Datenbank nutzt eine unbekannte Kollation.",
 	'config-db-web-account' => 'Datenbankkonto für den Webzugriff',
@@ -4048,6 +4280,12 @@ Das hier angegebene Datenbankkonto muss daher bereits vorhanden sein.',
 
 Sofern die vorhandene MySQL-Installation die Speicher-Engine InnoDB unterstützt, wird deren Verwendung eindringlich empfohlen.
 Sofern sie sie nicht unterstützt, sollte eine entsprechende Aktualisierung nunmehr Erwägung gezogen werden.",
+	'config-mysql-only-myisam-dep' => "'''Warnung:''' MyISAM ist die einzige verfügbare Speicher-Engine für MySQL, die nicht für die Verwendung mit MediaWiki empfohlen wird, da sie
+* aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen unterstützt,
+* anfälliger für Datenprobleme ist und
+* von MediaWiki nicht immer adäquat unterstützt wird.
+
+Deine MySQL-Installation unterstützt nicht InnoDB. Eventuell muss eine Aktualisierung durchgeführt werden.",
 	'config-mysql-engine-help' => "'''InnoDB''' ist fast immer die bessere Wahl, da es gleichzeitige Zugriffe gut unterstützt.
 
 '''MyISAM''' ist in Einzelnutzerumgebungen sowie bei schreibgeschützten Wikis schneller.
@@ -4060,7 +4298,6 @@ Dies ist effizienter als der UTF-8-Modus von MySQL und ermöglicht so die Verwen
 
 Im '''UTF-8-Modus''' wird MySQL den Zeichensatz der Daten erkennen und sie richtig anzeigen und konvertieren,
 allerdings können keine Zeichen außerhalb des [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke ''Basic Multilingual Plane'' (BMP)] gespeichert werden.",
-	'config-ibm_db2-low-db-pagesize' => "Die DB2-Datenbank verfügt über einen Standardtabellenraum mit einer unzureichenden Seitengröße. Die Seitengröße muss '''32 000'' oder größer sein.",
 	'config-site-name' => 'Name des Wikis:',
 	'config-site-name-help' => 'Er wird in der Titelleiste des Browsers, wie auch verschiedenen anderen Stellen, genutzt.',
 	'config-site-name-blank' => 'Den Namen des Wikis angeben.',
@@ -4147,11 +4384,11 @@ Für den Fall, dass die E-Mail-Funktionen nicht benötigt werden, können sie hi
 	'config-email-auth' => 'E-Mail-Authentifizierung ermöglichen',
 	'config-email-auth-help' => "Sofern diese Funktion aktiviert ist, müssen Benutzer ihre E-Mail-Adresse bestätigen, indem sie den Bestätigungslink nutzen, der ihnen immer dann zugesandt wird, wenn sie ihre E-Mail-Adresse angeben oder ändern.
 Nur bestätigte E-Mail-Adressen können Nachrichten von anderen Benutzer oder Benachrichtigungsmitteilungen erhalten.
-Die Aktivierung dieser Funktion wird bei offenen Wikis, mit Hinblick auf möglichen Missbrauch der E-Mailfunktionen, '''empfohlen'''.",
+Die Aktivierung dieser Funktion wird bei offenen Wikis, mit Hinblick auf möglichen Missbrauch der E-Mail-Funktionen, '''empfohlen.'''",
 	'config-email-sender' => 'E-Mail-Adresse für Antworten:',
 	'config-email-sender-help' => 'Bitte hier die E-Mail-Adresse angeben, die als Absenderadresse bei ausgehenden E-Mails eingesetzt werden soll.
 Rücklaufende E-Mails werden an diese E-Mail-Adresse gesandt.
-Bei viele E-Mail-Servern muss der Teil der E-Mail-Adresse mit der Domainangabe korrekt sein.',
+Bei vielen E-Mail-Servern muss der Teil der E-Mail-Adresse mit der Domainangabe korrekt sein.',
 	'config-upload-settings' => 'Hochladen von Bildern und Dateien',
 	'config-upload-enable' => 'Das Hochladen von Dateien ermöglichen',
 	'config-upload-help' => 'Das Hochladen von Dateien macht den Server für potentielle Sicherheitsprobleme anfällig.
@@ -4163,9 +4400,11 @@ Hernach kann diese Option aktiviert werden.',
 	'config-upload-deleted-help' => 'Bitte ein Verzeichnis auswählen, in dem gelöschte Dateien archiviert werden sollen.
 Idealerweise sollte es nicht über das Internet zugänglich sein.',
 	'config-logo' => 'URL des Logos:',
-	'config-logo-help' => 'Die Standardoberfläche von MediaWiki verfügt links oberhalb der Seitenleiste über Platz für eine Logo mit den Maßen 135x160 Pixel.
+	'config-logo-help' => 'Die Standardoberfläche von MediaWiki verfügt links oberhalb der Seitenleiste über Platz für ein Logo mit den Maßen 135x160 Pixel.
 Bitte ein Logo in entsprechender Größe hochladen und die zugehörige URL an dieser Stelle angeben.
 
+Du kannst <code>$wgStylePath</code> oder <code>$wgScriptPath</code> verwenden, falls dein Logo relativ zu diesen Pfaden ist.
+
 Sofern kein Logo benötigt wird, kann dieses Datenfeld leer bleiben.',
 	'config-instantcommons' => '„InstantCommons“ aktivieren',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons] ist eine Funktion, die es Wikis ermöglicht, Bild-, Klang- und andere Mediendateien zu nutzen, die auf der Website [//commons.wikimedia.org/ Wikimedia Commons] verfügbar sind.
@@ -4182,7 +4421,7 @@ Die Lizenz ist daher jetzt manuell einzugeben.',
 Es wird sehr empfohlen es für mittelgroße bis große Wikis zu nutzen, aber auch für kleine Wikis ergeben sich erkennbare Geschwindigkeitsverbesserungen.',
 	'config-cache-none' => 'Kein Objektcaching (es wird keine Funktion entfernt, allerdings kann dies die Geschwindigkeit größerer Wikis negativ beeinflussen)',
 	'config-cache-accel' => 'Objektcaching von PHP (APC, XCache oder WinCache)',
-	'config-cache-memcached' => 'Memchached Cacheserver nutzen (erfordert einen zusätzliche Installationsvorgang mitsamt Konfiguration)',
+	'config-cache-memcached' => 'Memcached Cacheserver nutzen (erfordert einen zusätzlichen Installationsvorgang mitsamt Konfiguration)',
 	'config-memcached-servers' => 'Memcached Cacheserver',
 	'config-memcached-help' => 'Liste der für Memcached nutzbaren IP-Adressen.
 Es sollte eine je Zeile mitsamt des vorgesehenen Ports angegeben werden. Beispiele:
@@ -4259,6 +4498,9 @@ Sobald alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''. Wi
 	'config-download-localsettings' => '<code>LocalSettings.php</code> herunterladen',
 	'config-help' => 'Hilfe',
 	'config-nofile' => 'Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?',
+	'config-extension-link' => 'Wusstest du, dass dein Wiki [//www.mediawiki.org/wiki/Manual:Extensions Erweiterungen] unterstützt?
+
+Du kannst [//www.mediawiki.org/wiki/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen oder die [//www.mediawiki.org/wiki/Extension_Matrix Erweiterungstabelle] ansehen, um eine volle Erweiterungsliste zu erhalten.',
 	'mainpagetext' => "'''MediaWiki wurde erfolgreich installiert.'''",
 	'mainpagedocfooter' => 'Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].
 
@@ -4279,7 +4521,7 @@ $messages['de-formal'] = array(
 == Starthilfen ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]', # Fuzzy
 );
 
 /** Zazaki (Zazaki)
@@ -4317,7 +4559,6 @@ $messages['diq'] = array(
 	'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 dılet',
 	'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
 	'config-db-port' => 'Portê database:',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-header-mysql' => 'Sazkardışê MySQL',
 	'config-mysql-innodb' => 'InnoDB',
 	'config-mysql-myisam' => 'MyISAM',
@@ -4346,7 +4587,7 @@ $messages['diq'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista eyaranê vıraştışi]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki de ÇZP]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-dayışê postey]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-dayışê postey]', # Fuzzy
 );
 
 /** Lower Sorbian (dolnoserbski)
@@ -4376,7 +4617,7 @@ $messages['dtp'] = array(
 == Kopotimpuunan ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lis papatantu nuludan]
 * [//www.mediawiki.org/wiki/Manual:FAQ Ponguhatan Koinsoruan om Simbar ModiaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis pininsuratan pinolabus do ModiaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis pininsuratan pinolabus do ModiaWiki]', # Fuzzy
 );
 
 /** Greek (Ελληνικά)
@@ -4416,7 +4657,6 @@ $messages['el'] = array(
 	'config-header-postgres' => 'Ρυθμίσεις PostgreSQL',
 	'config-header-sqlite' => 'Ρυθμίσεις SQLite',
 	'config-header-oracle' => 'Ρυθμίσεις Oracle',
-	'config-header-ibm_db2' => 'Ρυθμίσεις IBM DB2',
 	'config-invalid-db-type' => 'Μη έγκυρος τύπος βάσης δεδομένων',
 	'config-mysql-utf8' => 'UTF-8',
 	'config-site-name' => 'Όνομα του βίκι:',
@@ -4484,13 +4724,15 @@ $messages['eo'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Listo de konfiguraĵoj] (angla)
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Oftaj Demandoj] (angla)
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki dissendolisto pri anoncoj] (angla)",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki dissendolisto pri anoncoj] (angla)", # Fuzzy
 );
 
 /** Spanish (español)
  * @author Armando-Martin
+ * @author Ciencia Al Poder
  * @author Crazymadlover
  * @author Danke7
+ * @author Fitoschido
  * @author Locos epraix
  * @author Od1n
  * @author Platonides
@@ -4552,7 +4794,7 @@ Verifica tu php.ini y comprueba que <code>session.save_path</code> está estable
 	'config-restart' => 'Sí, reiniciarlo',
 	'config-welcome' => '=== Comprobación del entorno ===
 Se realiza comprobaciones básicas para ver si el entorno es adecuado para la instalación de MediaWiki.
-Deberás suministrar los resultados de tales comprobaciones si necesitas ayuda durante la instalación.',
+Deberás suministrar los resultados de tales comprobaciones si necesitas ayuda durante la instalación.', # Fuzzy
 	'config-copyright' => "=== Derechos de autor y Términos de uso ===
 
 $1
@@ -4629,6 +4871,7 @@ El caché de objetos no está habilitado.",
 	'config-mod-security' => "''' Advertencia ''': Su servidor web tiene [http://modsecurity.org/ mod_security] habilitado. Si la configuración es incorrecta, puede causar problemas a MediaWiki u otro software que permita a los usuarios publicar contenido arbitrarios.
 Consulte la [http://modsecurity.org/documentation/ documentación de mod_security] o contacte con el soporte de su servidor (''host'') si encuentra errores aleatorios.",
 	'config-diff3-bad' => 'GNU diff3 no se encuentra.',
+	'config-git-bad' => 'No se encontró el software de control de versiones Git.',
 	'config-imagemagick' => 'ImageMagick encontrado: <code>$1</code>.
 La miniaturización de imágenes se habilitará si habilitas las cargas.',
 	'config-gd' => 'Se ha encontrado una biblioteca de gráficos GD integrada.
@@ -4725,7 +4968,6 @@ Considere la posibilidad de poner la base de datos en algún otro sitio, por eje
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'MediaWiki es compatible con los siguientes sistemas de bases de datos:
 
 $1
@@ -4735,17 +4977,15 @@ Si no encuentras en el listado el sistema de base de datos que estás intentando
 	'config-support-postgres' => '$1 es un popular sistema de base de datos de código abierto, alternativa a MySQL. ([http://www.php.net/manual/es/pgsql.installation.php cómo compilar PHP con compatibilidad PostgreSQL]). Puede haber algunos defectos menores destacables, y no es recomendable para uso en un entorno de producción.',
 	'config-support-sqlite' => '* $1 es una base de datos ligera con gran compatibilidad con MediaWiki ([http://www.php.net/manual/es/pdo.installation.php cómo compilar PHP con compatibilidad SQLite usando PDO]).',
 	'config-support-oracle' => '* $1 es una base de datos comercial a nivel empresarial ([http://www.php.net/manual/es/oci8.installation.php cómo compilar PHP con compatibilidad con OCI8])',
-	'config-support-ibm_db2' => '* $1 es una base de datos comercial a nivel empresarial ([http://www.php.net/manual/es/ibm-db2.installation.php cómo compilar PHP con compatibilidad con ibm_db2]).', # Fuzzy
 	'config-header-mysql' => 'Configuración de MySQL',
 	'config-header-postgres' => 'Configuración de PostgreSQL',
 	'config-header-sqlite' => 'Configuración de SQLite',
 	'config-header-oracle' => 'Configuración de Oracle',
-	'config-header-ibm_db2' => 'Configuración de IBM DB2',
 	'config-invalid-db-type' => 'Tipo de base de datos inválida',
 	'config-missing-db-name' => 'Debes introducir un valor para "Nombre de la base de datos"',
 	'config-missing-db-host' => 'Debe introducir un valor para "Servidor (host) de base de datos"',
 	'config-missing-db-server-oracle' => 'Debe introducir un valor para "TNS de la base de datos"',
-	'config-invalid-db-server-oracle' => 'El TNS de la base de datos, "$1", es inválido.Use sólo carateres ASCII: letras (a-z, A-Z), números (0-9), guiones bajos (_) y guiones (-).Usa sólo caracteres ASCII: letras (a-z, A-Z), dígitos (0-9), guiones bajos (_) y puntos (.).',
+	'config-invalid-db-server-oracle' => 'El TNS de la base de datos, "$1", es inválido.Use sólo carateres ASCII: letras (a-z, A-Z), números (0-9), guiones bajos (_) y guiones (-).Usa sólo caracteres ASCII: letras (a-z, A-Z), dígitos (0-9), guiones bajos (_) y puntos (.).', # Fuzzy
 	'config-invalid-db-name' => 'El nombre de la base de datos "$1"  es inválido.
 Usa sólo caracteres ASCII: letras (a-z, A-Z), números (0-9), guiones bajos (_)y guiones (-).',
 	'config-invalid-db-prefix' => 'El prefijo de la base de datos "$1"  es inválido.
@@ -4801,7 +5041,7 @@ Esto '''no se recomienda''' a menos que esté teniendo problemas con su wiki.",
 	'config-upgrade-done-no-regenerate' => 'Actualización completa.
 
 Usted puede ahora [$1  empezar a usar su wiki].',
-	'config-regenerate' => 'Regenerar <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Regenerar LocalSettings.php →',
 	'config-show-table-status' => '<code>SHOW TABLE STATUS</code> ha fallado!',
 	'config-unknown-collation' => "'''Advertencia:''' La base de datos está utilizando una intercalación no reconocida.",
 	'config-db-web-account' => 'Cuenta de base de datos para acceso Web',
@@ -4831,7 +5071,6 @@ Las bases de datos MyISAM tienden a corromperse más a menudo que las bases de d
 Esto es más eficiente que el modo UTF-8 de MySQL y le permite utilizar la gama completa de caracteres Unicode.
 
 En '''modo UTF-8''', MySQL sabrá qué conjunto de caracteres emplean sus datos y puede presentarlos y convertirlos adecuadamente, pero no le permitirá almacenar caracteres por encima del [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
-	'config-ibm_db2-low-db-pagesize' => "Su base de datos DB2 tiene un espacio de tablas por defecto con un tamaño de página insuficiente. El tamaño de página tiene que ser '''32 K''' o superior.",
 	'config-site-name' => 'Nombre del wiki:',
 	'config-site-name-help' => 'Esto aparecerá en la barra de título del navegador y en varios otros lugares.',
 	'config-site-name-blank' => 'Ingresar un nombre de sitio.',
@@ -4875,7 +5114,7 @@ Ahora puedes saltarte el resto de pasos e instalar el wiki con valores predeterm
 	'config-optional-continue' => 'Hazme más preguntas.',
 	'config-optional-skip' => 'Ya estoy aburrido, sólo instala el wiki.',
 	'config-profile' => 'Perfil de derechos de usuario:',
-	'config-profile-wiki' => 'Wiki tradicional', # Fuzzy
+	'config-profile-wiki' => 'Wiki abierto',
 	'config-profile-no-anon' => 'Creación de cuenta requerida',
 	'config-profile-fishbowl' => 'Sólo editores autorizados',
 	'config-profile-private' => 'Wiki privado',
@@ -4934,14 +5173,14 @@ Para obtener más información, lea la [//www.mediawiki.org/wiki/Manual:Security
 
 Para habilitar la carga de archivos, cambie el modo en el subdirectorio <code>images</code> bajo el directorio raíz de MediaWiki para que el servidor web pueda escribir en él.
 A continuación, habilite esta opción.',
-	'config-upload-deleted' => '*Directório para los archivos eliminados:',
+	'config-upload-deleted' => '*Directorio para los archivos eliminados:',
 	'config-upload-deleted-help' => 'Elige un directorio en el que guardar los archivos eliminados.
 Lo ideal es una carpeta no accesible desde la red.',
 	'config-logo' => 'URL del logo :',
 	'config-logo-help' => 'La apariencia por defecto de MediaWiki incluye espacio para un logotipo de 135x160 píxeles encima del menú de la barra lateral.
 Cargue una imagen de tamaño adecuado e introduzca la dirección URL aquí.
 
-Si no desea un logotipo, deje esta casilla en blanco.',
+Si no desea un logotipo, deje esta casilla en blanco.', # Fuzzy
 	'config-instantcommons' => 'Habilitar Instant Commons',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] es una característica que permite que los wikis puedan utilizar imágenes, sonidos y otros archivos multimedia que se encuentran en el sitio [//commons.wikimedia.org/ Wikimedia Commons].
 Para ello, MediaWiki requiere acceso a Internet.
@@ -5051,7 +5290,7 @@ $messages['es-formal'] = array(
 == Empezando ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustes de configuración]
 * [//www.mediawiki.org/wiki/Manual:FAQ/es FAQ de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]', # Fuzzy
 );
 
 /** Estonian (eesti)
@@ -5196,7 +5435,7 @@ $messages['eu'] = array(
 	'config-admin-password' => 'Pasahitza:',
 	'config-admin-password-confirm' => 'Pasahitza berriz:',
 	'config-admin-email' => 'E-posta helbidea:',
-	'config-profile-wiki' => 'Wiki tradizionala',
+	'config-profile-wiki' => 'Wiki tradizionala', # Fuzzy
 	'config-profile-private' => 'Wiki pribatua',
 	'config-license' => 'Copyright eta lizentzia:',
 	'config-license-pd' => 'Domeinu Askea',
@@ -5212,7 +5451,7 @@ $messages['eu'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigurazio balioen zerrenda]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ (Maiz egindako galderak)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]', # Fuzzy
 );
 
 /** Extremaduran (estremeñu)
@@ -5225,7 +5464,7 @@ $messages['ext'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Persian (فارسی)
@@ -5316,6 +5555,7 @@ $messages['fa'] = array(
  * @author Crt
  * @author Nike
  * @author Olli
+ * @author Silvonen
  * @author Str4nd
  * @author VezonThunder
  * @author 아라
@@ -5411,6 +5651,7 @@ Asennus saattaa epäonnistua!",
 	'config-db-install-help' => 'Anna käyttäjätunnus ja salasana, joita käytetään asennuksen aikana.',
 	'config-db-account-lock' => 'Käytä samaa tunnusta ja salasanaa myös asennuksen jälkeen',
 	'config-db-prefix' => 'Tietokantataulujen etuliite',
+	'config-db-charset' => 'Tietokannan merkistö',
 	'config-charset-mysql5-binary' => 'MySQL 4.1/5.0, binääri',
 	'config-charset-mysql5' => 'MySQL 4.1/5.0, UTF-8',
 	'config-charset-mysql4' => 'MySQL 4.0, taaksepäin yhteensopiva UTF-8',
@@ -5419,13 +5660,10 @@ Asennus saattaa epäonnistua!",
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
-	'config-type-ibm_db2' => 'IBM DB2',
-	'config-support-ibm_db2' => '* $1 on kaupallinen tietokanta yrityskäyttöön.', # Fuzzy
 	'config-header-mysql' => 'MySQL-asetukset',
 	'config-header-postgres' => 'PostgreSQL-asetukset',
 	'config-header-sqlite' => 'SQLite-asetukset',
 	'config-header-oracle' => 'Oracle-asetukset',
-	'config-header-ibm_db2' => 'IBM DB2 -asetukset',
 	'config-invalid-db-type' => 'Virheellinen tietokantatyyppi',
 	'config-missing-db-name' => 'Kenttä »Tietokannan nimi» on pakollinen',
 	'config-invalid-db-name' => '”$1” ei kelpaa tietokannan nimeksi.
@@ -5449,7 +5687,7 @@ Tämä '''ei ole suositeltavaa''', jos wikissäsi ei ole ongelmia.",
 	'config-upgrade-done-no-regenerate' => 'Päivitys valmis.
 
 Voit [$1 aloittaa wikin käytön].',
-	'config-regenerate' => 'Luo <code>LocalSettings.php</code> uudelleen →',
+	'config-regenerate' => 'Luo LocalSettings.php uudelleen →',
 	'config-show-table-status' => 'Kysely <code>SHOW TABLE STATUS</code> epäonnistui!',
 	'config-mysql-engine' => 'Tallennusmoottori',
 	'config-mysql-innodb' => 'InnoDB',
@@ -5582,9 +5820,9 @@ Vérifiez votre fichier php.ini et assurez-vous que <code>session.save_path</cod
 	'config-page-existingwiki' => 'Wiki existant',
 	'config-help-restart' => "Voulez-vous effacer toutes les données enregistrées que vous avez entrées et relancer le processus d'installation ?",
 	'config-restart' => 'Oui, le relancer',
-	'config-welcome' => "=== Vérifications liées à l’environnement ===
-Des vérifications de base sont effectuées pour voir si cet environnement est adapté à l'installation de MediaWiki.
-Vous devriez indiquer les résultats de ces vérifications si vous avez besoin d’aide lors de l’installation.",
+	'config-welcome' => '=== Vérifications liées à l’environnement ===
+Des vérifications de base vont maintenant être effectuées pour voir si cet environnement est adapté à l’installation de MediaWiki.
+Rappelez-vous d’inclure ces informations si vous recherchez de l’aide sur la manière de terminer l’installation.',
 	'config-copyright' => "=== Droit d'auteur et conditions ===
 
 $1
@@ -5653,6 +5891,10 @@ MédiaWiki nécessite la gestion d’UTF-8 pour fonctionner correctement.",
 Cette valeur est probablement trop faible.
 Il est possible que l’installation échoue !",
 	'config-ctype' => "'''Fatal ''': PHP doit être compilé avec le support pour l'[http://www.php.net/manual/en/ctype.installation.php extension Ctype].",
+	'config-json' => "'''Erreur fatale :''' PHP a été compilé sans le support de JSON.
+Vous devez soit installez l’extension JSON de PHP ou l’extension [http://pecl.php.net/package/jsonc PECL jsonc] avant d’installer MediaWiki.
+* L’extension PHP est comprise dans Red Hat Enterprise Linux (CentOS) 5 et 6, mais doit être activée dans <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.
+* Certaines distributions Linux après mai 2013 ne comprennent pas l’extension PHP, mais oint mis à la place l’extension PECL sous al forme <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
 	'config-xcache' => '[http://xcache.lighttpd.net/ XCache] est installé',
 	'config-apc' => '[http://www.php.net/apc APC] est installé',
 	'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] est installé',
@@ -5661,6 +5903,8 @@ La mise en cache d'objets n'est pas activée.",
 	'config-mod-security' => "'''Attention''': Votre serveur web a [http://modsecurity.org/ mod_security] activé. S&il est mal configuré, cela peut poser des problèmes à MediaWiki ou à d'autres applications qui permettent aux utilisateurs de publier un contenu quelconque.
 Reportez-vous à [http://modsecurity.org/documentation/ la documentation de mod_security] ou contactez le support de votre hébergeur si vous rencontrez des erreurs aléatoires.",
 	'config-diff3-bad' => 'GNU diff3 introuvable.',
+	'config-git' => 'Logiciel de contrôle de version Git trouvé : <code>$1</code>.',
+	'config-git-bad' => 'Logiciel de contrôle de version Git non trouvé.',
 	'config-imagemagick' => "ImageMagick trouvé : <code>$1</code>.
 La miniaturisation d'images sera activée si vous activez le téléversement de fichiers.",
 	'config-gd' => "La bibliothèque graphique GD intégrée a été trouvée.
@@ -5754,7 +5998,6 @@ Envisagez de placer la base de données ailleurs, par exemple dans <code>/var/li
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => "MediaWiki supporte ces systèmes de bases de données :
 
 $1
@@ -5764,18 +6007,16 @@ Si vous ne voyez pas le système de base de données que vous essayez d'utiliser
 	'config-support-postgres' => "* $1 est un système de base de données populaire et ''open source'' qui peut être une alternative à MySQL ([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). Il peut contenir quelques bogues mineurs et n'est pas recommandé dans un environnement de production.",
 	'config-support-sqlite' => '* $1 est un système de base de données léger qui est bien supporté. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], utilise PDO)',
 	'config-support-oracle' => '* $1 est un système commercial de gestion de base de données d’entreprise. ([http://www.php.net/manual/en/oci8.installation.php Comment compiler PHP avec le support OCI8])',
-	'config-support-ibm_db2' => "* $1 est une base de données d'entreprise commerciale. ([http://www.php.net/manual/en/ibm-db2.installation.php Comment compiler PHP avec le support de DB2 d’IBM])",
 	'config-header-mysql' => 'Paramètres de MySQL',
 	'config-header-postgres' => 'Paramètres de PostgreSQL',
 	'config-header-sqlite' => 'Paramètres de SQLite',
 	'config-header-oracle' => 'Paramètres d’Oracle',
-	'config-header-ibm_db2' => 'paramètres de IBM DB2',
 	'config-invalid-db-type' => 'Type de base de données non valide',
 	'config-missing-db-name' => 'Vous devez saisir une valeur pour « Nom de la base de données »',
 	'config-missing-db-host' => "Vous devez entrer une valeur pour « l'hôte de la base de données »",
 	'config-missing-db-server-oracle' => 'Vous devez saisir une valeur pour le « Nom TNS de la base de données »',
 	'config-invalid-db-server-oracle' => 'Le nom TNS de la base de données (« $1 ») est invalide.
-Il ne peut contenir que des lettres latines de base (a-z, A-Z), des chiffres (0-9), des caractères de soulignement (_) et des points (.).',
+Utilisez uniquement la chaîne "TNS Name" ou "Easy Connect" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Méthodes de nommage Oracle])',
 	'config-invalid-db-name' => 'Nom de la base de données invalide (« $1 »).
 Il ne peut contenir que des lettres latines (a-z, A-Z), des chiffres (0-9), des caractères de soulignement (_) et des tirets (-).',
 	'config-invalid-db-prefix' => 'Préfixe de la base de données non valide « $1 ».
@@ -5831,7 +6072,7 @@ Ce '''n'est pas recommandé''' sauf si vous rencontrez des problèmes avec votre
 	'config-upgrade-done-no-regenerate' => 'Mise à jour terminée.
 
 Vous pouvez maintenant [$1 commencer à utiliser votre wiki].',
-	'config-regenerate' => 'Regénérer <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Regénérer LocalSettings.php →',
 	'config-show-table-status' => 'Échec de la requête <code>SHOW TABLE STATUS</code> !',
 	'config-unknown-collation' => "'''Attention:''' La base de données effectue un classement alphabétique (''collation'') inconnu.",
 	'config-db-web-account' => "Compte de la base de données pour l'accès Web",
@@ -5848,6 +6089,12 @@ Le compte que vous spécifiez ici doit déjà exister.",
  * il est plus sujet à la corruption que les autres moteurs
  * le codebase MediaWiki ne gère pas toujours MyISAM comme il se doit
 Si votre installation MySQL supporte InnoDB, il est fortement recommandé que vous le choisissez plutôt. Si votre installation MySQL ne supporte pas les tables InnoDB, il est peut-être temps de faire une mise à niveau.",
+	'config-mysql-only-myisam-dep' => "'''Attention :''' MyISAM est le seul moteur de stockage disponible pour MySQL qui ne soit pas recommandé pour une utilsiation avec MédiaWiki, car :
+* il supporte très peu les accès concurrents à cause du verrouillage des tables
+* il est plus sujet à corruption que les autres moteurs
+* le code de base de MédiaWiki ne gère pas toujours MyISAM comme il faudrait
+
+Votre installation MySQL ne supporte pas InnoDB ; il est peut-être temps de la mettre à jour.",
 	'config-mysql-engine-help' => "'''InnoDB''' est presque toujours la meilleure option, car il supporte bien l'[http://fr.wikipedia.org/wiki/Ordonnancement_dans_les_syst%C3%A8mes_d%27exploitation ordonnancement].
 
 '''MyISAM''' peut être plus rapide dans les installations monoposte ou en lecture seule. Les bases de données MyISAM ont tendance à se corrompre plus souvent que celles d'InnoDB.",
@@ -5858,7 +6105,6 @@ Si votre installation MySQL supporte InnoDB, il est fortement recommandé que vo
 
 En ''mode binaire'', MediaWiki stocke le texte UTF-8 dans des champs binaires de la base de données. C'est plus efficace que le ''mode UTF-8'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.
 En ''mode UTF-8'', MySQL connaîtra le jeu de caractères de vos données et pourra présenter et convertir les données de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
-	'config-ibm_db2-low-db-pagesize' => "Votre base de données DB2 a un espace de stockage par défaut avec un pagesize insuffisant. Le pagesize doit être au minimum '''32K'''.",
 	'config-site-name' => 'Nom du wiki :',
 	'config-site-name-help' => 'Il apparaîtra dans la barre de titre du navigateur et en divers autres endroits.',
 	'config-site-name-blank' => 'Entrez un nom de site.',
@@ -5963,10 +6209,12 @@ Ensuite, activez cette option.",
 	'config-upload-deleted-help' => 'Choisissez un répertoire qui servira à archiver les fichiers supprimés.
 Idéalement, il ne devrait pas être accessible depuis le web.',
 	'config-logo' => 'URL du logo :',
-	'config-logo-help' => "L'habillage (''skin'') par défaut de MediaWiki comprend l'espace pour un logo de 135x160 pixels dans le coin supérieur gauche.
-Téléchargez une image de la taille appropriée, et entrez l'URL ici.
+	'config-logo-help' => 'L’habillage par défaut de MediaWiki comprend l’espace pour un logo de 135x160 pixels au-dessus de la barre de menu latérale.
+Téléchargez une image de la taille appropriée, et entrez son URL ici.
+
+Vous pouvez utiliser <code>$wgStylePath</code> ou <code>$wgScriptPath</code> si votre logo est relatif à ces chemins.
 
-Si vous ne voulez pas d'un logo, laissez cette case vide.",
+Si vous ne voulez pas de logo, laissez cette case vide.',
 	'config-instantcommons' => "Activer ''InstantCommons''",
 	'config-instantcommons-help' => "[//www.mediawiki.org/wiki/InstantCommons InstantCommons] est un service qui permet d'utiliser les images, les sons et les autres médias disponibles sur le site [//commons.wikimedia.org/ Wikimedia Commons].
 Pour se faire, il faut que MediaWiki accède à Internet.
@@ -6056,6 +6304,9 @@ Lorsque c'est fait, vous pouvez '''[$2 accéder à votre wiki]'''.",
 	'config-download-localsettings' => 'Télécharger <code>LocalSettings.php</code>',
 	'config-help' => 'aide',
 	'config-nofile' => 'Le fichier « $1 » est introuvable. A-t-il été supprimé ?',
+	'config-extension-link' => 'Saviez-vous que votre wiki supporte [//www.mediawiki.org/wiki/Manual:Extensions des extensions] ?
+
+Vous pouvez consulter les [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions par catégorie] ou la [//www.mediawiki.org/wiki/Extension_Matrix Matrice des extensions] pourvoir la liste complète des extensions.',
 	'mainpagetext' => "'''MediaWiki a été installé avec succès.'''",
 	'mainpagedocfooter' => 'Consultez le [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.
 
@@ -6076,7 +6327,7 @@ $messages['frc'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Réglage]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: Questions Souvent Posées]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki Liste à Malle]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki Liste à Malle]', # Fuzzy
 );
 
 /** Franco-Provençal (arpetan)
@@ -6137,18 +6388,16 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
 	'config-sqlite-dir' => 'Dossiér de les balyês SQLite :',
 	'config-oracle-def-ts' => "Èspâço de stocâjo (''tablespace'') per dèfôt :",
 	'config-oracle-temp-ts' => "Èspâço de stocâjo (''tablespace'') temporèro :",
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-header-mysql' => 'Paramètres de MySQL',
 	'config-header-postgres' => 'Paramètres de PostgreSQL',
 	'config-header-sqlite' => 'Paramètres de SQLite',
 	'config-header-oracle' => 'Paramètres d’Oracle',
-	'config-header-ibm_db2' => 'Paramètres d’IBM DB2',
 	'config-invalid-db-type' => 'Tipo de bâsa de balyês envalido',
 	'config-missing-db-name' => 'Vos dête buchiér una valor por « Nom de la bâsa de balyês »',
 	'config-missing-db-host' => 'Vos dête buchiér una valor por « Hôto de la bâsa de balyês »',
 	'config-missing-db-server-oracle' => 'Vos dête buchiér una valor por « TNS de la bâsa de balyês »',
 	'config-sqlite-readonly' => 'Lo fichiér <code>$1</code> est pas accèssiblo en ècritura.',
-	'config-regenerate' => 'Refâre <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Refâre LocalSettings.php →',
 	'config-show-table-status' => 'Falyita de la requéta <code>SHOW TABLE STATUS</code> !',
 	'config-db-web-account' => 'Compto de la bâsa de balyês por l’accès vouèbe',
 	'config-db-web-account-same' => 'Utilisâd lo mémo compto que por l’enstalacion',
@@ -6240,18 +6489,18 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
 );
 
 /** Northern Frisian (Nordfriisk)
+ * @author Murma174
  * @author Pyt
  */
 $messages['frr'] = array(
 	'mainpagetext' => "'''MediaWiki wörd ma erfolch instaliird.'''",
-	'mainpagedocfooter' => 'Heelp tu jü benjüting än konfigurasjoon foon e Wiki-software fanst dü önj dåt [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].
-
-
-== Startheelpe ==
+	'mainpagedocfooter' => "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.
 
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]
-* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
+== Getting started ==
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
+* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]",
 );
 
 /** Friulian (furlan)
@@ -6270,7 +6519,7 @@ $messages['fy'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings List mei ynstellings]
 * [//www.mediawiki.org/wiki/Manual:FAQ Faak stelde fragen (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist foar oankundigings fan nije ferzjes]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist foar oankundigings fan nije ferzjes]", # Fuzzy
 );
 
 /** Irish (Gaeilge)
@@ -6283,7 +6532,7 @@ $messages['ga'] = array(
 	'config-help' => 'Cuidiú',
 	'mainpagetext' => "'''D'éirigh le suiteáil MediaWiki.'''",
 	'mainpagedocfooter' => 'Féach ar [//meta.wikimedia.org/wiki/MediaWiki_localisation doiciméid um conas an chomhéadán a athrú]
-agus an [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Lámhleabhar úsáideora] chun cabhair úsáide agus fíoraíochta a fháil.',
+agus an [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Lámhleabhar úsáideora] chun cabhair úsáide agus fíoraíochta a fháil.', # Fuzzy
 );
 
 /** Gagauz (Gagauz)
@@ -6296,7 +6545,7 @@ $messages['gag'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Simplified Gan script (赣语（简体）‎)
@@ -6309,20 +6558,21 @@ $messages['gan-hans'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置设定列表]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 平常问题解答]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布email清单]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布email清单]', # Fuzzy
 );
 
 /** Traditional Gan script (贛語（繁體）‎)
+ * @author Symane
  */
 $messages['gan-hant'] = array(
-	'mainpagetext' => "'''安裝正MediaWiki嘍。'''",
+	'mainpagetext' => "'''安裝正MediaWiki哩。'''",
 	'mainpagedocfooter' => '參看[//meta.wikimedia.org/wiki/Help:Contents 用戶指南]裡頭會話到啷用wiki軟件
 
 == 開始使用 ==
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置設定列表]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 平常問題解答]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈email清單]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈email清單]', # Fuzzy
 );
 
 /** Scottish Gaelic (Gàidhlig)
@@ -6396,8 +6646,8 @@ Comprobe o seu php.ini e asegúrese de que en <code>session.save_path</code> est
 	'config-help-restart' => 'Quere eliminar todos os datos gardados e reiniciar o proceso de instalación?',
 	'config-restart' => 'Si, reiniciala',
 	'config-welcome' => '=== Comprobación da contorna ===
-Cómpre realizar unhas comprobacións básicas para ver se a contorna é axeitada para a instalación de MediaWiki.
-Deberá proporcionar os resultados destas comprobacións se necesita axuda durante a instalación.',
+Cómpre realizar agora unhas comprobacións básicas para ver se a contorna é axeitada para a instalación de MediaWiki.
+Lembre incluír esta información se necesita axuda para completar a instalación.',
 	'config-copyright' => "=== Dereitos de autor e termos de uso ===
 
 $1
@@ -6466,7 +6716,11 @@ MediaWiki necesita soporte UTF-8 para funcionar correctamente.",
 	'config-memory-bad' => "'''Atención:''' O parámetro <code>memory_limit</code> do PHP é $1.
 Probablemente é un valor baixo de máis.
 A instalación pode fallar!",
-	'config-ctype' => "'''Fatal:''' O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
+	'config-ctype' => "'''Erro fatal:''' O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].",
+	'config-json' => "'''Erro fatal:''' O PHP compilouse sen o soporte de JSON.
+Debe instalar ben a extensión JSON do PHP ou a extensión [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar MediaWiki.
+* A extensión do PHP está incluída en Red Hat Enterprise Linux (CentOS) 5 e 6, mais debe activarse <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.
+* Algunhas distribucións do Linux lanzadas despois de maio de 2013 omiten a extensión do PHP, pero inclúen a extensión PECL como <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
 	'config-xcache' => '[http://xcache.lighttpd.net/ XCache] está instalado',
 	'config-apc' => '[http://www.php.net/apc APC] está instalado',
 	'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado',
@@ -6475,6 +6729,8 @@ A caché de obxectos está desactivada.",
 	'config-mod-security' => "'''Atención:''' O seu servidor web ten o [http://modsecurity.org/ mod_security] activado. Se estivese mal configurado, pode causar problemas a MediaWiki ou calquera outro software que permita aos usuarios publicar contidos arbitrarios.
 Olle a [http://modsecurity.org/documentation/ documentación do mod_security] ou póñase en contacto co soporte do seu servidor se atopa erros aleatorios.",
 	'config-diff3-bad' => 'GNU diff3 non se atopou.',
+	'config-git' => 'Atopouse o software de control da versión de Git: <code>$1</code>.',
+	'config-git-bad' => 'Non se atopou o software de control da versión de Git.',
 	'config-imagemagick' => 'ImageMagick atopado: <code>$1</code>.
 As miniaturas de imaxes estarán dispoñibles se activa as cargas.',
 	'config-gd' => 'Atopouse a biblioteca gráfica GD integrada.
@@ -6571,7 +6827,6 @@ Considere poñer a base de datos nun só lugar, por exemplo en <code>/var/lib/me
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'MediaWiki soporta os seguintes sistemas de bases de datos:
 
 $1
@@ -6581,18 +6836,16 @@ Se non ve listado a continuación o sistema de base de datos que intenta usar, s
 	'config-support-postgres' => '* $1 é un sistema de base de datos popular e de código aberto como alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar o PHP con soporte PostgreSQL]). É posible que haxa algúns pequenos erros e non se recomenda o seu uso nunha contorna de produción.',
 	'config-support-sqlite' => '* $1 é un sistema de base de datos lixeiro moi ben soportado. ([http://www.php.net/manual/en/pdo.installation.php Como compilar o PHP con soporte SQLite], emprega PDO)',
 	'config-support-oracle' => '* $1 é un sistema comercial de xestión de base de datos de empresa. ([http://www.php.net/manual/en/oci8.installation.php Como compilar o PHP con soporte OCI8])',
-	'config-support-ibm_db2' => '* $1 é unha base de datos de empresa comercial. ([http://www.php.net/manual/en/ibm-db2.installation.php Como compilar o PHP con soporte IBM DB2])',
 	'config-header-mysql' => 'Configuración do MySQL',
 	'config-header-postgres' => 'Configuración do PostgreSQL',
 	'config-header-sqlite' => 'Configuración do SQLite',
 	'config-header-oracle' => 'Configuración do Oracle',
-	'config-header-ibm_db2' => 'Configuración de IBM DB2',
 	'config-invalid-db-type' => 'Tipo de base de datos incorrecto',
 	'config-missing-db-name' => 'Debe escribir un valor "Nome da base de datos"',
 	'config-missing-db-host' => 'Debe escribir un valor "Servidor da base de datos"',
 	'config-missing-db-server-oracle' => 'Debe escribir un valor "TNS da base de datos"',
 	'config-invalid-db-server-oracle' => 'O TNS da base de datos, "$1", é incorrecto.
-Só pode conter letras ASCII (a-z, A-Z), números (0-9), guións baixos (_) e puntos (.).',
+Utilice só "TNS Name" ou unha cadea de texto "Easy Connect" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm métodos de nomeamento de Oracle])',
 	'config-invalid-db-name' => 'O nome da base de datos, "$1", é incorrecto.
 Só pode conter letras ASCII (a-z, A-Z), números (0-9), guións baixos (_) e guións (-).',
 	'config-invalid-db-prefix' => 'O prefixo da base de datos, "$1", é incorrecto.
@@ -6648,7 +6901,7 @@ Isto '''non é recomendable''' a menos que estea a ter problemas co seu wiki.",
 	'config-upgrade-done-no-regenerate' => 'Actualización completada.
 
 Xa pode [$1 comezar a usar o seu wiki].',
-	'config-regenerate' => 'Rexenerar <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Rexenerar LocalSettings.php →',
 	'config-show-table-status' => 'A pescuda <code>SHOW TABLE STATUS</code> fallou!',
 	'config-unknown-collation' => "'''Atención:''' A base de datos está a empregar unha clasificación alfabética irrecoñecible.",
 	'config-db-web-account' => 'Conta na base de datos para o acceso á internet',
@@ -6667,6 +6920,12 @@ A conta que se especifique aquí xa debe existir.',
 
 Se a súa instalación MySQL soporta InnoDB, recoméndase elixilo no canto de MyISAM.
 Se a súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
+	'config-mysql-only-myisam-dep' => "'''Atención:''' MyISAM é o único motor de almacenamento para MySQL, unha combinación non recomendada para MediaWiki, porque:
+* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas
+* é máis propenso a corromperse ca outros motores
+* o código base de MediaWiki non sempre manexa o MyISAM como debera
+
+A súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
 	'config-mysql-engine-help' => "'''InnoDB''' é case sempre a mellor opción, dado que soporta ben os accesos simultáneos.
 
 '''MyISAM''' é máis rápido en instalacións de usuario único e de só lectura.
@@ -6679,7 +6938,6 @@ Isto é máis eficaz ca o modo UTF-8 de MySQL e permítelle usar o rango complet
 
 No '''modo UTF-8''', MySQL saberá o xogo de caracteres dos seus datos e pode presentar e converter os datos de maneira axeitada,
 pero non lle deixará gardar caracteres por riba do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingüe básico].",
-	'config-ibm_db2-low-db-pagesize' => "A súa base de datos DB2 ten un espazo de táboa cun tamaño de páxina insuficiente. O tamaño de páxina debe ser '''32k''' ou maior.",
 	'config-site-name' => 'Nome do wiki:',
 	'config-site-name-help' => 'Isto aparecerá na barra de títulos do navegador e noutros lugares.',
 	'config-site-name-blank' => 'Escriba o nome do sitio.',
@@ -6788,6 +7046,8 @@ O ideal é que non sexa accesible desde a web.',
 	'config-logo-help' => 'A aparencia de MediaWiki por defecto inclúe espazo para un logo de 135x160 píxeles por riba do menú lateral.
 Cargue unha imaxe do tamaño axeitado e introduza o enderezo URL aquí.
 
+Pode utilizar <code>$wgStylePath</code> ou <code>$wgScriptPath</code> se o seu logo está relacionado con esas rutas.
+
 Se non quere un logo, deixe esta caixa en branco.',
 	'config-instantcommons' => 'Activar Instant Commons',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons] é unha característica que permite aos wikis usar imaxes, sons e outros ficheiros multimedia atopados no sitio da [//commons.wikimedia.org/wiki/Portada_galega Wikimedia Commons].
@@ -6880,7 +7140,10 @@ $3
 Cando faga todo isto, xa poderá '''[$2 entrar no seu wiki]'''.",
 	'config-download-localsettings' => 'Descargar o <code>LocalSettings.php</code>',
 	'config-help' => 'axuda',
-	'config-nofile' => 'Non se puido atopar o ficheiro "$1". Se cadra, foi borrado?',
+	'config-nofile' => 'Non se puido atopar o ficheiro "$1". Se cadra, foi borrado.',
+	'config-extension-link' => 'Sabía que o seu wiki soporta [//www.mediawiki.org/wiki/Manual:Extensions extensións]?
+
+Pode explorar as [//www.mediawiki.org/wiki/Category:Extensions_by_category extensións por categoría] ou a [//www.mediawiki.org/wiki/Extension_Matrix matriz de extensións] para ollar a lista completa de extensións.',
 	'mainpagetext' => "'''MediaWiki instalouse correctamente.'''",
 	'mainpagedocfooter' => 'Consulte a [//meta.wikimedia.org/wiki/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.
 
@@ -6910,7 +7173,7 @@ $messages['grc'] = array(
 == Ἄρξασθε ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Διαλογή παραμέτρων διαμορφώσεως]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: τὰ πολλάκις αἰτηθέντα]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Διαλογή διαλέξεων ἐπὶ τῶν διανομῶν τῆς MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Διαλογή διαλέξεων ἐπὶ τῶν διανομῶν τῆς MediaWiki]', # Fuzzy
 );
 
 /** Swiss German (Alemannisch)
@@ -7025,6 +7288,7 @@ Miniaturaasichte vu Bilder sin megli, sobald s Uffelade vu Dateie aktiviert isch
 );
 
 /** Gujarati (ગુજરાતી)
+ * @author Ashok modhvadia
  * @author Dineshjk
  */
 $messages['gu'] = array(
@@ -7034,7 +7298,8 @@ $messages['gu'] = array(
 == શરૂઆતના તબક્કે ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings કોનફીગ્યુરેશન સેટીંગ્સની યાદી]
 * [//www.mediawiki.org/wiki/Manual:FAQ વારંવાર પુછાતા પ્રશ્નો]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce મિડીયાવિકિ રીલીઝ મેઇલીંગ લીસ્ટ]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce મિડીયાવિકિ રીલીઝ મેઇલીંગ લીસ્ટ]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]',
 );
 
 /** Manx (Gaelg)
@@ -7053,7 +7318,7 @@ $messages['hak'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki Phi-chṳ sat-thin chhîn-tân]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Phìn-sòng mun-thì kié-tap]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki fat-phu email chhîn-tân]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki fat-phu email chhîn-tân]', # Fuzzy
 );
 
 /** Hawaiian (Hawai`i)
@@ -7289,7 +7554,6 @@ $1
 כדאי לשקול לשים את מסד הנתונים במקום אחר לגמרי, למשל ב־<code dir="ltr">/var/lib/mediawiki/yourwik</code>.',
 	'config-oracle-def-ts' => 'מרחב טבלאות לפי בררת מחדל (default tablespace):',
 	'config-oracle-temp-ts' => 'מרחב טבלאות זמני (temporary tablespace):',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'מדיה־ויקי תומכת במערכות מסדי הנתונים הבאות:
 
 $1
@@ -7299,12 +7563,10 @@ $1
 	'config-support-postgres' => '$1 הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). ייתכן שיש בתצורה הזאת באגים מסוימים והיא לא מומלצת לסביבות מבצעיות.',
 	'config-support-sqlite' => '* $1 הוא מסד נתונים קליל עם תמיכה טובה מאוד. (ר׳ [http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], משתמש ב־PDO)',
 	'config-support-oracle' => '* $1 הוא מסד נתונים עסקי מסחרי. (ר׳ [http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
-	'config-support-ibm_db2' => '* $1 הוא מסד נתונים מסחרי ארגוני. ([http://www.php.net/manual/en/ibm-db2.installation.php How to compile PHP with IBM DB2 support])',
 	'config-header-mysql' => 'הגדרות MySQL',
 	'config-header-postgres' => 'הגדרות PostgreSQL',
 	'config-header-sqlite' => 'הגדרות SQLite',
 	'config-header-oracle' => 'הגדרות Oracle',
-	'config-header-ibm_db2' => 'תצורת IBM DB2',
 	'config-invalid-db-type' => 'סוג מסד הנתונים שגוי',
 	'config-missing-db-name' => 'עליך להזין ערך עבור "שם מסד הנתונים"',
 	'config-missing-db-host' => 'יש להכניס ערך לשדה "שרת מסד הנתונים"',
@@ -7366,7 +7628,7 @@ chmod a+w $3</pre></div>',
 	'config-upgrade-done-no-regenerate' => 'השדרוג הושלם.
 
 עכשיו אפשר [$1 להתחיל להשתמש בוויקי שלכם].',
-	'config-regenerate' => 'לחולל מחדש את <code>LocalSettings.php</code> ←',
+	'config-regenerate' => 'לחולל מחדש את LocalSettings.php ←',
 	'config-show-table-status' => 'שאילתת <code>SHOW TABLE STATUS</code> נכשלה!',
 	'config-unknown-collation' => "'''אזהרה:''' מסד הנתונים משתמש בשיטת מיון שאינה מוּכּרת.",
 	'config-db-web-account' => 'חשבון במסד הנתונים לגישה מהרשת',
@@ -7396,7 +7658,6 @@ chmod a+w $3</pre></div>',
 זה יעיל יותר ממצב UTF-8 של MySQL ומאפשר לכם להשתמש בכל הטווח של תווי יוניקוד.
 
 ב'''מצב UTF-8'''&rlm; (UTF-8 mode)&rlm; MySQL יֵדַע מה קבוצת התווים (character set) של הטקסט שלכם ויציג וימיר אותו בהתאם, אבל לא יאפשר לכם לשמור תווים שאינם נמצאים בטווח הרב־לשוני הבסיסי ([//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane]).",
-	'config-ibm_db2-low-db-pagesize' => "במסד הנתונים DB2 שלכם יש מרחב טבלאות לפי מחדלי עם גודל דף בלתי־מספיק. גודל הדף צריך להיות '''32K''' או יותר.",
 	'config-site-name' => 'שם הוויקי:',
 	'config-site-name-help' => 'זה יופיע בשורת הכותרת של הדפדפן ובמקומות רבים אחרים.',
 	'config-site-name-blank' => 'נא להזין שם לאתר.',
@@ -7505,7 +7766,7 @@ chmod a+w $3</pre></div>',
 	'config-logo-help' => 'המראה ההתחלתי של מדיה־ויקי מכיל מקום לסמל של 135 על 160 פיקסלים בפינה העליונה מעל תפריט הצד.
 יש להעלות תמונה בגודל מתאים ולהכניס את הכתובת כאן.
 
-אם אינכם רוצים סמל, השאירו את התיבה הזאת ריקה.',
+אם אינכם רוצים סמל, השאירו את התיבה הזאת ריקה.', # Fuzzy
 	'config-instantcommons' => 'להפעיל את Instant Commons',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] היא תכונה שמאפשרת לאתרי ויקי להשתמש בתמונות, בצלילים ובמדיה אחרת שנמצאת באתר [//commons.wikimedia.org/ ויקישיתוף] (Wikimedia Commons).
 כדי לעשות את זה, מדיה־ויקי צריך לגשת לאינטרנט.
@@ -7617,7 +7878,7 @@ $messages['hi'] = array(
 == शुरुवात करें ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings कॉन्फिगरेशन सेटींगकी सूची]
 * [//www.mediawiki.org/wiki/Manual:FAQ मीडियाविकिके बारे में प्राय: पूछे जाने वाले सवाल]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]', # Fuzzy
 );
 
 /** Fiji Hindi (Latin script) (Fiji Hindi)
@@ -7630,7 +7891,7 @@ $messages['hif-latn'] = array(
 == Getting started ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Hiligaynon (Ilonggo)
@@ -7643,7 +7904,7 @@ $messages['hil'] = array(
 == Pag-umpisa ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sang mga konpigorasyon sang pagkay-o]
 * [//www.mediawiki.org/wiki/Manual:FAQ Mga Masami Pamangkoton sa MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat kon may paguha-on nga MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat kon may paguha-on nga MediaWiki]", # Fuzzy
 );
 
 /** Croatian (hrvatski)
@@ -7651,7 +7912,7 @@ $messages['hil'] = array(
 $messages['hr'] = array(
 	'mainpagetext' => "'''Softver MediaWiki je uspješno instaliran.'''",
 	'mainpagedocfooter' => 'Pogledajte [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentaciju o prilagodbi sučelja]
-i [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Vodič za suradnike] za pomoć pri uporabi i podešavanju.',
+i [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Vodič za suradnike] za pomoć pri uporabi i podešavanju.', # Fuzzy
 );
 
 /** Upper Sorbian (hornjoserbsce)
@@ -7843,7 +8104,7 @@ Zo by je na MediaWiki $1 aktualizował, klikń na '''Dale'''.",
 	'config-upgrade-done-no-regenerate' => 'Aktualizacija dokónčena.
 
 Móžeš nětko [$1 swój wiki wužiwać].',
-	'config-regenerate' => '<code>LocalSettings.php</code> znowa wutworić →',
+	'config-regenerate' => 'LocalSettings.php znowa wutworić →',
 	'config-show-table-status' => 'Naprašowanje <code>SHOW TABLE STATUS</code> je so njeporadźiło!',
 	'config-unknown-collation' => "'''Warnowanje:''' Datowa banka njeznatu kolaciju wužiwa.",
 	'config-db-web-account' => 'Konto datoweje banki za webpřistup',
@@ -8012,7 +8273,7 @@ $messages['ht'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lis paramèt yo pou konfigirasyon]
 * [//www.mediawiki.org/wiki/Manyèl:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis diskisyon ki parèt sou MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis diskisyon ki parèt sou MediaWiki]', # Fuzzy
 );
 
 /** Hungarian (magyar)
@@ -8230,7 +8491,6 @@ A telepítő készít egy <code>.htaccess</code> fájlt az adatbázis mellé, az
 Fontold meg az adatbázis más helyre történő elhelyezését, például a <code>/var/lib/mediawiki/tewikid</code> könyvtárba.",
 	'config-oracle-def-ts' => 'Alapértelmezett táblatér:',
 	'config-oracle-temp-ts' => 'Ideiglenes táblatér:',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'A MediaWiki a következő adatbázisrendszereket támogatja:
 
 $1
@@ -8240,12 +8500,10 @@ Ha az alábbi listán nem találod azt a rendszert, melyet használni szeretnél
 	'config-support-postgres' => '* A $1 népszerű, nyílt forráskódú adatbázisrendszer, a MySQL alternatívája ([http://www.php.net/manual/en/pgsql.installation.php Hogyan fordítható a PHP PostgreSQL-támogatással]). Több apró, javítatlan hiba is előfordulhat, így nem ajánlott éles környezetben használni.',
 	'config-support-sqlite' => '* Az $1 egy könnyű, nagyon jól támogatott adatbázisrendszer. ([http://www.php.net/manual/en/pdo.installation.php Hogyan fordítható a PHP SQLite-támogatással], PDO-t használ)',
 	'config-support-oracle' => '* Az $1 kereskedelmi, vállalati adatbázisrendszer. ([http://www.php.net/manual/en/oci8.installation.php Hogyan fordítható a PHP OCI8-támogatással])',
-	'config-support-ibm_db2' => '* Az $1 kereskedelmi vállalati adatbázisrendszer.', # Fuzzy
 	'config-header-mysql' => 'MySQL-beállítások',
 	'config-header-postgres' => 'PostgreSQL-beállítások',
 	'config-header-sqlite' => 'SQLite-beállítások',
 	'config-header-oracle' => 'Oracle-beállítások',
-	'config-header-ibm_db2' => 'IBM DB2-beállítások',
 	'config-invalid-db-type' => 'Érvénytelen adatbázistípus',
 	'config-missing-db-name' => 'Meg kell adnod az „Adatbázisnév” értékét',
 	'config-missing-db-host' => 'Meg kell adnod az „Adatbázis hosztneve” értékét',
@@ -8307,7 +8565,7 @@ Ez '''nem ajánlott''', csak akkor, ha problémák vannak a wikivel.",
 	'config-upgrade-done-no-regenerate' => "A frissítés befejeződött.
 
 Most már '''[$1 beléphetsz a wikibe]'''.",
-	'config-regenerate' => '<code>LocalSettings.php</code> elkészítése újra →',
+	'config-regenerate' => 'LocalSettings.php elkészítése újra →',
 	'config-show-table-status' => 'A <code>SHOW TABLE STATUS</code> lekérdezés nem sikerült!',
 	'config-unknown-collation' => "'''Figyelmeztetés:''' az adatbázis ismeretlen egybevetést használ.",
 	'config-db-web-account' => 'A webes hozzáférésnél használt adatbázisfiók',
@@ -8336,7 +8594,6 @@ A '''MyISAM''' gyorsabb megoldás lehet egyfelhasználós vagy csak olvasható k
 Ez sokkal hatékonyabb a MySQL UTF-8-as módjánál, és lehetővé teszi a teljes Unicode-karakterkészlet használatát.
 
 '''UTF-8-as módban''' a MySQL tudni fogja,hogy az adatok milyen karakterkészlettel rendelkeznek, és megfelelően átalakítja őket, azonban nem tárolhatóak olyan karakterek, melyek a [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] felett vannak.",
-	'config-ibm_db2-low-db-pagesize' => "A DB2 adatbázisodnak alapértelmezett táblatere van elégtelen lapmérettel. A lapméretnek legalább '''32K'''-nak kell lennie.",
 	'config-site-name' => 'A wiki neve:',
 	'config-site-name-help' => 'A böngésző címsorában és még számos más helyen jelenik meg.',
 	'config-site-name-blank' => 'Add meg az oldal nevét.',
@@ -8443,7 +8700,7 @@ Normális esetben ennek nem szabad elérhetőnek lennie az internetről.',
 	'config-logo-help' => 'A MediaWiki alapértelmezett felülete helyet ad egy 135×160 pixeles logónak a bal felső sarokban.
 Tölts fel egy megfelelő méretű képet, majd írd be ide az URL-címét!
 
-Ha nem szeretnél logót használni, egyszerűen hagyd üresen a mezőt.',
+Ha nem szeretnél logót használni, egyszerűen hagyd üresen a mezőt.', # Fuzzy
 	'config-instantcommons' => 'Instant Commons engedélyezése',
 	'config-instantcommons-help' => 'Az [//www.mediawiki.org/wiki/InstantCommons Instant Commons] lehetővé teszi, hogy a wikin használhassák a [//commons.wikimedia.org/ Wikimedia Commons] oldalon található képeket, hangokat és más médiafájlokat.
 A használatához a MediaWikinek internethozzáférésre van szüksége.
@@ -8628,7 +8885,7 @@ $messages['hy'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Interlingua (interlingua)
@@ -8787,7 +9044,9 @@ Installation abortate.',
 	'config-using531' => 'MediaWiki non pote esser usate con PHP $1 a causa de un defecto concernente parametros de referentia a <code>__call()</code>.
 Actualisa a PHP 5.3.2 o plus recente, o retrograda a PHP 5.3.0 pro remediar isto.
 Installation abortate.',
-	'config-suhosin-max-value-length' => 'Suhosin es installate e limita le longitude del parametro GET a $1 bytes. Le componente ResourceLoader de MediaWiki pote contornar iste limite, ma isto degradara le rendimento. Si possibile, tu deberea mitter <code>suhosin.get.max_value_length</code> a 1024 o plus in <code>php.ini</code> , e mitter <code>$wgResourceLoaderMaxQueryLength</code> al mesme valor in LocalSettings.php .', # Fuzzy
+	'config-suhosin-max-value-length' => 'Suhosin es installate e limita parametro <code>length</code> de GET a $1 bytes.
+Le componente ResourceLoader de MediaWiki va contornar iste limite, ma isto prejudicara le rendimento.
+Si possibile, tu deberea mitter <code>suhosin.get.max_value_length</code> a 1024 o superior in <code>php.ini</code>, e mitter <code>$wgResourceLoaderMaxQueryLength</code> al mesme valor in <code>LocalSettings.php</code>.',
 	'config-db-type' => 'Typo de base de datos:',
 	'config-db-host' => 'Servitor de base de datos:',
 	'config-db-host-help' => 'Si tu servitor de base de datos es in un altere servitor, entra hic le nomine o adresse IP del servitor.
@@ -8861,7 +9120,6 @@ Considera poner le base de datos in un loco completemente differente, per exempl
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'MediaWiki supporta le sequente systemas de base de datos:
 
 $1
@@ -8871,18 +9129,16 @@ Si tu non vide hic infra le systema de base de datos que tu tenta usar, alora se
 	'config-support-postgres' => '* $1 es un systema de base de datos popular e open source, alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar PHP con supporto de PostgreSQL]). Es possibile que resta alcun minor defectos non resolvite, dunque illo non es recommendate pro uso in un ambiente de production.',
 	'config-support-sqlite' => '* $1 es un systema de base de datos legier que es multo ben supportate. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP con supporto de SQLite], usa PDO)',
 	'config-support-oracle' => '* $1 es un banca de datos commercial pro interprisas. ([http://www.php.net/manual/en/oci8.installation.php Como compilar PHP con supporto de OCI8])',
-	'config-support-ibm_db2' => '* $1 es un systema commercial de base de datos pro interprisas.', # Fuzzy
 	'config-header-mysql' => 'Configuration de MySQL',
 	'config-header-postgres' => 'Configuration de PostgreSQL',
 	'config-header-sqlite' => 'Configuration de SQLite',
 	'config-header-oracle' => 'Configuration de Oracle',
-	'config-header-ibm_db2' => 'Configurationes pro IBM DB2',
 	'config-invalid-db-type' => 'Typo de base de datos invalide',
 	'config-missing-db-name' => 'Tu debe entrar un valor pro "Nomine de base de datos"',
 	'config-missing-db-host' => 'Tu debe entrar un valor pro "Host del base de datos"',
 	'config-missing-db-server-oracle' => 'You must enter a value for "TNS del base de datos"',
 	'config-invalid-db-server-oracle' => 'TNS de base de datos "$1" invalide.
-Usa solmente litteras ASCII (a-z, A-Z), numeros (0-9), characteres de sublineamento (_) e punctos (.).',
+Usa o "TNS Name" o un catena "Easy Connect". ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Methodos de nomenclatura de Oracle])',
 	'config-invalid-db-name' => 'Nomine de base de datos "$1" invalide.
 Usa solmente litteras ASCII (a-z, A-Z), numeros (0-9), characteres de sublineamento (_) e tractos de union (-).',
 	'config-invalid-db-prefix' => 'Prefixo de base de datos "$1" invalide.
@@ -8938,7 +9194,7 @@ Isto '''non es recommendate''' si tu non ha problemas con tu wiki.",
 	'config-upgrade-done-no-regenerate' => 'Actualisation complete.
 
 Tu pote ora [$1 comenciar a usar tu wiki].',
-	'config-regenerate' => 'Regenerar <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Regenerar LocalSettings.php →',
 	'config-show-table-status' => 'Le consulta <code>SHOW TABLE STATUS</code> falleva!',
 	'config-unknown-collation' => "'''Aviso:''' Le base de datos usa un collation non recognoscite.",
 	'config-db-web-account' => 'Conto de base de datos pro accesso via web',
@@ -8968,7 +9224,6 @@ Le bases de datos MyISAM tende a esser corrumpite plus frequentemente que le bas
 Isto es plus efficiente que le modo UTF-8 de MySQL, e permitte usar le rango complete de characteres Unicode.
 
 In '''modo UTF-8''', MySQL cognoscera le codification de characteres usate pro tu dats, e pote presentar e converter lo appropriatemente, ma illo non permittera immagazinar characteres supra le [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Basic].",
-	'config-ibm_db2-low-db-pagesize' => 'Tu base de datos DB2 ha un "tablespace" (spatio de tabella) predefinite con un "pagesize" (dimension de pagina) insufficiente. Le "pagesize" debe esser \'\'\'32K\'\'\' o plus.',
 	'config-site-name' => 'Nomine del wiki:',
 	'config-site-name-help' => 'Isto apparera in le barra de titulo del navigator e in varie altere locos.',
 	'config-site-name-blank' => 'Entra un nomine de sito.',
@@ -9011,7 +9266,7 @@ Tu pote ora saltar le configuration remanente e installar le wiki immediatemente
 	'config-optional-continue' => 'Pone me plus questiones.',
 	'config-optional-skip' => 'Isto me es jam tediose. Simplemente installa le wiki.',
 	'config-profile' => 'Profilo de derectos de usator:',
-	'config-profile-wiki' => 'Wiki traditional', # Fuzzy
+	'config-profile-wiki' => 'Wiki aperte',
 	'config-profile-no-anon' => 'Creation de conto obligatori',
 	'config-profile-fishbowl' => 'Modificatores autorisate solmente',
 	'config-profile-private' => 'Wiki private',
@@ -9021,13 +9276,13 @@ In MediaWiki, il es facile revider le modificationes recente, e reverter omne da
 Nonobstante, multes ha trovate MediaWiki utile in un grande varietate de rolos, e alcun vices il non es facile convincer omnes del beneficios del principio wiki.
 Dunque, a te le option.
 
-Un '''{{int:config-profile-wiki}}''' permitte a omnes de modificar, sin mesmo aperir un session.
+Le modello '''{{int:config-profile-wiki}}''' permitte a omnes de modificar, sin mesmo aperir un session.
 Un wiki con '''{{int:config-profile-no-anon}}''' attribue additional responsabilitate, ma pote dissuader contributores occasional.
 
 Le scenario '''{{int:config-profile-fishbowl}}''' permitte al usatores approbate de modificar, ma le publico pote vider le paginas, includente lor historia.
 Un '''{{int:config-profile-private}}''' permitte solmente al usatores approbate de vider le paginas e de modificar los.
 
-Configurationes de derectos de usator plus complexe es disponibile post installation, vide le [//www.mediawiki.org/wiki/Manual:User_rights pertinente section del manual].", # Fuzzy
+Configurationes de derectos de usator plus complexe es disponibile post installation, vide le [//www.mediawiki.org/wiki/Manual:User_rights pertinente section del manual].",
 	'config-license' => 'Copyright e licentia:',
 	'config-license-none' => 'Nulle licentia in pede de paginas',
 	'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
@@ -9078,6 +9333,8 @@ Idealmente, isto non debe esser accessibile ab le web.',
 	'config-logo-help' => 'Le apparentia predefinite de MediaWiki include spatio pro un logotypo de 135×160 pixels supra le menu del barra lateral.
 Incarga un imagine con le dimensiones appropriate, e entra le URL hic.
 
+Tu pote usar <code>$wgStylePath</code> o <code>$wgScriptPath</code> si le loco de tu logotypo es relative a iste camminos.
+
 Si tu non vole un logotypo, lassa iste quadro vacue.',
 	'config-instantcommons' => 'Activar "Instant Commons"',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] es un function que permitte a wikis de usar imagines, sonos e altere multimedia trovate in le sito [//commons.wikimedia.org/ Wikimedia Commons].
@@ -9112,7 +9369,7 @@ Istes pote requirer additional configuration, ma tu pote activar los ora.',
 	'config-install-alreadydone' => "'''Aviso:''' Il pare que tu ha jam installate MediaWiki e tenta installar lo de novo.
 Per favor continua al proxime pagina.",
 	'config-install-begin' => 'Un clic sur "{{int:config-continue}}" comencia le installation de MediaWiki.
-Pro facer alterationes, clicca sur "Retro".', # Fuzzy
+Pro facer alterationes, clicca sur "{{int:config-back}}".',
 	'config-install-step-done' => 'finite',
 	'config-install-step-failed' => 'fallite',
 	'config-install-extensions' => 'Include le extensiones',
@@ -9178,7 +9435,8 @@ Post facer isto, tu pote '''[$2 entrar in tu wiki]'''.",
 == Pro initiar ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de configurationes]
 * [//www.mediawiki.org/wiki/Manual:FAQ FAQ a proposito de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]', # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Traducer MediaWiki in tu lingua]',
 );
 
 /** Indonesian (Bahasa Indonesia)
@@ -9476,7 +9734,7 @@ Tindakan ini '''tidak dianjurkan''' kecuali jika Anda mengalami masalah dengan w
 	'config-upgrade-done-no-regenerate' => 'Pemutakhiran selesai.
 
 Anda sekarang dapat [$1 mulai menggunakan wiki Anda].',
-	'config-regenerate' => 'Regenerasi <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Regenerasi LocalSettings.php →',
 	'config-show-table-status' => 'Kueri <code>SHOW TABLE STATUS</code> gagal!',
 	'config-unknown-collation' => "'''Peringatan:''' basis data menggunakan kolasi yang tidak dikenal.",
 	'config-db-web-account' => 'Akun basis data untuk akses web',
@@ -9604,7 +9862,7 @@ Idealnya, direktori ini tidak boleh dapat diakses dari web.',
 	'config-logo-help' => 'Kulit bawaan MediaWiki memberikan ruang untuk logo berukuran 135x160 piksel di atas menu bilah samping.
 Unggah gambar dengan ukuran yang sesuai, lalu masukkan URL di sini.
 
-Jika Anda tidak ingin menyertakan logo, biarkan kotak ini kosong.',
+Jika Anda tidak ingin menyertakan logo, biarkan kotak ini kosong.', # Fuzzy
 	'config-instantcommons' => 'Aktifkan Instant Commons',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] adalah fitur yang memungkinkan wiki untuk menggunakan gambar, suara, dan media lain dari [//commons.wikimedia.org/ Wikimedia Commons].
 Untuk melakukannya, MediaWiki memerlukan akses ke Internet.
@@ -9742,7 +10000,7 @@ $messages['io'] = array(
 == Komencar ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Listo di ''Configuration setting'']
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki OQQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki nova versioni posto-listo]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki nova versioni posto-listo]", # Fuzzy
 );
 
 /** Icelandic (íslenska)
@@ -9755,7 +10013,7 @@ $messages['is'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Listi yfir uppsetningarstillingar]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Algengar spurningar MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Póstlisti MediaWiki-útgáfa]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Póstlisti MediaWiki-útgáfa]', # Fuzzy
 );
 
 /** Italian (italiano)
@@ -9817,8 +10075,8 @@ Controlla il tuo file php.ini ed assicurati che <code>session.save_path</code> 
 	'config-help-restart' => 'Vuoi cancellare tutti i dati salvati che hai inserito e riavviare il processo di installazione?',
 	'config-restart' => 'Sì, riavvia',
 	'config-welcome' => "=== Controllo dell'ambiente ===
-Vengono eseguiti controlli di base per vedere se questo ambiente è adatto per l'installazione di MediaWiki.
-Se hai bisogno di aiuto durante l'installazione, è necessario fornire i risultati di questi controlli.",
+Saranno eseguiti controlli di base per vedere se questo ambiente è adatto per l'installazione di MediaWiki.
+Ricordati di includere queste informazioni se chiedi assistenza su come completare l'installazione.",
 	'config-sidebar' => '* [//www.mediawiki.org Pagina principale MediaWiki]
 * [//www.mediawiki.org/wiki/Aiuto:Guida ai contenuti per utenti]
 * [//www.mediawiki.org/wiki/Manuale:Guida ai contenuti per admin]
@@ -9854,6 +10112,8 @@ L'installazione potrebbe non riuscire!",
 	'config-no-cache' => "'''Attenzione:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache] non sono stati trovati.
 La caching degli oggetti non è attivata.",
 	'config-diff3-bad' => 'GNU diff3 non trovato.',
+	'config-git' => 'Trovato software di controllo della versione Git: <code>$1</code>.',
+	'config-git-bad' => 'Software di controllo della versione Git non trovato.',
 	'config-imagemagick' => 'Trovato ImageMagick: <code>$1</code>.
 Le miniature delle immagini saranno presenti se gli upload vengono abilitati.',
 	'config-gd' => 'Trovata la GD Graphics Library built-in.
@@ -9865,16 +10125,50 @@ Installazione interrotta.",
 	'config-no-cli-uri' => "'''Attenzione''': --scriptpath non specificato, si utilizza il valore predefinito: <code>$1</code>.",
 	'config-using-server' => 'Nome server in uso "<nowiki>$1</nowiki>".',
 	'config-using-uri' => 'URL del server in uso "<nowiki>$1$2</nowiki>".',
+	'config-brokenlibxml' => 'Il tuo sistema ha una combinazione di versioni di PHP e libxml2 che è difettosa e che può provocare un danneggiamento non visibile di dati in MediaWiki ed in altre applicazioni per il web.
+Aggiorna a PHP 5.2.9 o successivo, ed a libxml2 2.7.3 o successivo ([//bugs.php.net/bug.php?id=45996 il bug è studiato dal lato PHP]).
+Installazione interrotta.',
+	'config-using531' => 'MediaWiki non può essere usato con il PHP $1 a causa di un bug che coinvolge i parametri di riferimento a <code>__call()</code>.
+Aggiorna a PHP 5.3.2 o superiore, o fai un downgrade tornando a PHP 5.3.0 per risolvere il problema.
+Installazione interrotta.',
 	'config-db-type' => 'Tipo di database:',
+	'config-db-host' => 'Host del database:',
+	'config-db-host-help' => 'Se il server del tuo database è su un server diverso, immetti qui il nome dell\'host o il suo indirizzo IP.
+
+Se stai utilizzando un web hosting condiviso, il tuo hosting provider dovrebbe fornirti il nome host corretto nella sua documentazione.
+
+Se stai installando su un server Windows con uso di MySQL, l\'uso di "localhost" potrebbe non funzionare correttamente come nome del server. In caso di problemi, prova a impostare "127.0.0.1" come indirizzo IP locale.
+
+Se usi PostgreSQL, lascia questo campo vuoto per consentire di connettersi tramite un socket Unix.',
+	'config-db-host-oracle' => 'TNS del database:',
 	'config-db-wiki-settings' => 'Identifica questo wiki',
 	'config-db-name' => 'Nome del database:',
+	'config-db-name-help' => 'Scegli un nome che identifica il tuo wiki.
+Non deve contenere spazi.
+
+Se utilizzi un web hosting condiviso, il tuo hosting provider o ti fornisce uno specifico nome di database da utilizzare, oppure ti consentirà di creare il database tramite un pannello di controllo.',
 	'config-db-name-oracle' => 'Schema del database:',
+	'config-db-install-account' => "Account utente per l'installazione",
 	'config-db-username' => 'Nome utente del database:',
+	'config-db-password' => 'Password del database:',
 	'config-db-password-empty' => 'Inserire una password per il nuovo utente del database: $1.
 Anche se può essere possibile creare utenti senza password, questo non è sicuro.',
+	'config-db-install-username' => "Inserisci il nome utente che verrà utilizzato per connettersi al database durante il processo di installazione.
+Questo non è il nome utente dell'account MediaWiki; ma quello per il tuo database.",
+	'config-db-install-password' => "Inserisci la password che verrà utilizzato per connettersi al database durante il processo di installazione.
+Questa non è la password dell'account MediaWiki; ma quella per il tuo database.",
 	'config-db-install-help' => "Inserire il nome utente e la password che verranno usate per la connessione al database durante il processo d'installazione.",
+	'config-db-account-lock' => 'Utilizza lo stesso nome utente e password durante il normale funzionamento',
+	'config-db-wiki-account' => 'Account utente per il normale funzionamento',
+	'config-db-wiki-help' => "Inserisci il nome utente e la password che verrà utilizzato per connettersi al database durante il normale funzionamento del wiki.
+Se l'account non esiste, e l'account di installazione dispone di privilegi sufficienti, verrà creato con privilegi minimi necessari per operare sul wiki.",
 	'config-db-prefix' => 'Prefisso tabella del database:',
+	'config-db-prefix-help' => "Se hai bisogno di condividere un database tra più wiki, o tra MediaWiki e un'altra applicazione web, puoi scegliere di aggiungere un prefisso a tutti i nomi di tabella, per evitare conflitti.
+Non utilizzare spazi.
+
+Solitamente, questo campo viene lasciato vuoto.",
 	'config-db-charset' => 'Set di caratteri del database',
+	'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binario',
 	'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
 	'config-charset-mysql4' => 'MySQL 4.0 con compatibilità UTF-8',
 	'config-mysql-old' => 'MySQL $1 o una versione successiva è necessaria, rilevata la $2.',
@@ -9884,25 +10178,77 @@ Anche se può essere possibile creare utenti senza password, questo non è sicur
 Da cambiare solamente se si è sicuri di averne bisogno.',
 	'config-pg-test-error' => "Impossibile connettersi al database '''$1''': $2",
 	'config-sqlite-dir' => 'Directory data di SQLite:',
-	'config-type-ibm_db2' => 'IBM DB2',
+	'config-oracle-def-ts' => 'Tablespace di default:',
+	'config-oracle-temp-ts' => 'Tablespace temporaneo:',
+	'config-support-info' => 'MediaWiki supporta i seguenti sistemi di database:
+
+$1
+
+Se fra quelli elencati qui sotto non vedi il sistema di database che vorresti utilizzare, seguire le istruzioni linkate sopra per abilitare il supporto.',
+	'config-support-mysql' => '* $1 è la configurazione preferibile per MediaWiki ed è quella meglio supportata ([http://www.php.net/manual/en/mysql.installation.php come compilare PHP con supporto MySQL])',
 	'config-header-mysql' => 'Impostazioni MySQL',
 	'config-header-postgres' => 'Impostazioni PostgreSQL',
 	'config-header-sqlite' => 'Impostazioni SQLite',
 	'config-header-oracle' => 'Impostazioni Oracle',
-	'config-header-ibm_db2' => 'Impostazioni IBM DB2',
 	'config-invalid-db-type' => 'Tipo di database non valido',
 	'config-missing-db-name' => 'È necessario immettere un valore per "Nome del database"',
+	'config-missing-db-host' => 'È necessario immettere un valore per "Host del database"',
+	'config-missing-db-server-oracle' => 'È necessario immettere un valore per "TNS del database"',
+	'config-invalid-db-name' => 'Nome di database "$1" non valido.
+Utilizza soltanto caratteri ASCII come lettere (a-z, A-Z), numeri (0-9), sottolineatura (_) e trattini (-).',
+	'config-invalid-db-prefix' => 'Prefisso database "$1" non valido.
+Utilizza soltanto caratteri ASCII come lettere (a-z, A-Z), numeri (0-9), sottolineatura (_) e trattini (-).',
+	'config-connection-error' => '$1.
+
+Controlla host, nome utente e password e prova ancora.',
+	'config-db-sys-create-oracle' => "Il programma di installazione supporta solo l'utilizzo di un account SYSDBA per la creazione di un nuovo account.",
+	'config-db-sys-user-exists-oracle' => 'L\'account utente "$1" esiste già. SYSDBA può essere usato solo per la creazione di un nuovo account!',
+	'config-postgres-old' => 'PostgreSQL $1 o una versione successiva è necessaria, rilevata la $2.',
+	'config-sqlite-name-help' => 'Scegli un nome che identifichi il tuo wiki.
+Non utilizzare spazi o trattini.
+Questo servirà per il nome del file di dati SQLite.',
+	'config-sqlite-mkdir-error' => 'Errore durante la creazione della directory dati "$1".
+Controlla la posizione e riprova.',
+	'config-sqlite-dir-unwritable' => 'Impossibile scrivere nella directory "$1".
+Modifica le autorizzazioni in modo che il webserver possa scrivere in essa e riprova.',
+	'config-sqlite-connection-error' => '$1.
+
+Controlla la directory dati e il nome del database qui sotto, poi riprova.',
+	'config-sqlite-readonly' => 'Il file <code>$1</code> non è scrivibile.',
+	'config-sqlite-cant-create-db' => 'Impossibile creare il file di database <code>$1</code> .',
+	'config-sqlite-fts3-downgrade' => 'Il PHP è mancante del supporto FTS3, declassamento tabelle in corso',
+	'config-can-upgrade' => "Ci sono tabelle di MediaWiki in questo database.
+Per aggiornarle a MediaWiki $1, fai clic su '''continua'''.",
+	'config-upgrade-done' => "Aggiornamento completo.
+
+Puoi [$1 iniziare ad usare il tuo wiki].
+
+Se vuoi rigenerare il tuo file <code>LocalSettings.php</code>, clicca sul pulsante sotto. Questa operazione '''non è raccomandata''', a meno che non hai problemi con il tuo wiki.",
+	'config-upgrade-done-no-regenerate' => 'Aggiornamento completo.
+
+Puoi [$1 iniziare ad usare il tuo wiki].',
+	'config-regenerate' => 'Rigenera LocalSettings.php →',
+	'config-show-table-status' => 'La query <code>SHOW TABLE STATUS</code> è fallita!',
+	'config-unknown-collation' => "'''Attenzione:''' il database utilizza regole di confronto non riconosciute.",
 	'config-db-web-account' => "Account del database per l'accesso web",
+	'config-db-web-help' => 'Seleziona il nome utente e la password che il server web utilizzerà per connettersi al server di database, durante il normale funzionamento del wiki.',
+	'config-db-web-account-same' => "Utilizza lo stesso account dell'installazione",
 	'config-db-web-create' => "Crea l'account se non esiste già",
+	'config-db-web-no-create-privs' => "L'account usato per l'installazione non dispone dei privilegi necessari per creare un altro account.
+L'account indicato qui deve già esistere.",
 	'config-mysql-engine' => 'Storage engine:',
 	'config-mysql-innodb' => 'InnoDB',
 	'config-mysql-myisam' => 'MyISAM',
 	'config-mysql-charset' => 'Set di caratteri del database:',
 	'config-mysql-binary' => 'Binario',
 	'config-mysql-utf8' => 'UTF-8',
-	'config-ibm_db2-low-db-pagesize' => "Il database DB2 in uso ha una tablespace predefinita con un insufficiente pagesize, che dovrebbe essere '''32K''' o maggiore.",
+	'config-site-name' => 'Nome del wiki:',
+	'config-site-name-help' => 'Questo verrà visualizzato nella barra del titolo del browser e in vari altri posti.',
+	'config-site-name-blank' => 'Inserisci il nome del sito.',
+	'config-project-namespace' => 'Namespace del progetto:',
 	'config-ns-generic' => 'Progetto',
-	'config-ns-site-name' => 'Stesso nome wiki: $1',
+	'config-ns-site-name' => 'Stesso nome del wiki: $1',
+	'config-ns-other' => 'Altro (specificare)',
 	'config-ns-other-default' => 'MyWiki',
 	'config-admin-box' => 'Account amministratore',
 	'config-admin-name' => 'Tuo nome:',
@@ -9925,7 +10271,9 @@ Inserire un indirizzo email se si desidera effettuare l'iscrizione alla mailing
 	'config-almost-done' => 'Hai quasi finito!
 Adesso puoi saltare la rimanente parte della configurazione e semplicemente installare la wiki.',
 	'config-optional-continue' => 'Fammi altre domande.',
-	'config-profile-wiki' => 'Wiki tradizionale', # Fuzzy
+	'config-optional-skip' => 'Sono già stanco, installa solo il wiki.',
+	'config-profile' => 'Profilo dei diritti utente:',
+	'config-profile-wiki' => 'Wiki aperto',
 	'config-profile-no-anon' => 'Creazione utenza obbligatoria',
 	'config-profile-fishbowl' => 'Solo editori autorizzati',
 	'config-profile-private' => 'Wiki privata',
@@ -9944,8 +10292,13 @@ Se vuoi usare testi da Wikipedia, o desideri che Wikipedia possa essere in grado
 
 In precedenza Wikipedia ha utilizzato la GNU Free Documentation License. La GFDL è una licenza valida, ma è di difficile comprensione e complica il riutilizzo dei contenuti.",
 	'config-email-settings' => 'Impostazioni email',
+	'config-enable-email' => 'Abilita la posta elettronica in uscita',
 	'config-email-user' => 'Abilita invio email fra utenti',
+	'config-email-usertalk' => 'Abilita le notifiche per le pagine di discussione utente',
+	'config-email-watchlist' => 'Abilita le notifiche per gli osservati speciali',
 	'config-email-auth' => 'Abilita autenticazione via email',
+	'config-email-sender' => 'Indirizzo email di ritorno:',
+	'config-upload-settings' => 'Caricamenti di immagini e file',
 	'config-upload-enable' => 'Consentire il caricamento di file',
 	'config-upload-deleted' => 'Directory per i file cancellati:',
 	'config-logo' => 'URL del logo:',
@@ -9953,16 +10306,20 @@ In precedenza Wikipedia ha utilizzato la GNU Free Documentation License. La GFDL
 	'config-cc-again' => 'Seleziona di nuovo...',
 	'config-cc-not-chosen' => 'Scegliere quale licenza Creative Commons si desidera e cliccare su "procedi".',
 	'config-advanced-settings' => 'Configurazione avanzata',
+	'config-memcached-servers' => 'Server di memcached:',
 	'config-memcache-needservers' => 'È stato selezionato il tipo di caching Memcached, ma non è stato impostato alcun server.',
 	'config-memcache-badip' => 'È stato inserito un indirizzo IP non valido per Memcached: $1.',
+	'config-memcache-badport' => 'I numeri di porta per memcached dovrebbero essere tra $1 e $2.',
 	'config-extensions' => 'Estensioni',
 	'config-install-step-done' => 'fatto',
 	'config-install-step-failed' => 'non riuscito',
+	'config-install-database' => 'Configurazione database',
 	'config-install-schema' => 'Creazione dello schema',
 	'config-install-user' => 'Creazione di utente del database',
 	'config-install-user-alreadyexists' => 'L\'utente "$1" è già presente',
 	'config-install-user-create-failed' => 'Creazione dell\'utente "$1" non riuscita: $2',
 	'config-install-user-missing' => 'L\'utente indicato "$1" non esiste.',
+	'config-install-tables' => 'Creazione tabelle',
 	'config-install-tables-failed' => "'''Errore''': La creazione della tabella non è riuscita: $1",
 	'config-install-interwiki' => 'Riempimento della tabella interwiki predefinita',
 	'config-install-interwiki-list' => 'Impossibile leggere il file <code>interwiki.list</code>.',
@@ -9972,6 +10329,7 @@ In precedenza Wikipedia ha utilizzato la GNU Free Documentation License. La GFDL
 	'config-install-subscribe-fail' => 'Impossibile sottoscrivere mediawiki-announce: $1',
 	'config-install-subscribe-notpossible' => 'cURL non è installato e allow_url_fopen non è disponibile.',
 	'config-install-mainpage' => 'Creazione della pagina principale con contenuto predefinito',
+	'config-install-extension-tables' => 'Creazione delle tabelle per le estensioni attivate',
 	'config-install-mainpage-failed' => 'Impossibile inserire la pagina principale: $1',
 	'config-download-localsettings' => 'Scarica <code>LocalSettings.php</code>',
 	'config-help' => 'aiuto',
@@ -9990,6 +10348,7 @@ I seguenti collegamenti sono in lingua inglese:
 
 /** Japanese (日本語)
  * @author Aphaia
+ * @author Fryed-peach
  * @author Iwai.masaharu
  * @author Mizusumashi
  * @author Ninomy
@@ -9998,6 +10357,7 @@ I seguenti collegamenti sono in lingua inglese:
  * @author Whym
  * @author Yanajin66
  * @author 青子守歌
+ * @author 아라
  */
 $messages['ja'] = array(
 	'config-desc' => 'MediaWiki のインストーラー',
@@ -10052,8 +10412,8 @@ php.ini 内で <code>session.save_path</code> が適切なディレクトリに
 	'config-help-restart' => '入力した保存データをすべて消去して、インストール作業を再起動しますか?',
 	'config-restart' => 'はい、再起動します',
 	'config-welcome' => '=== 環境の確認 ===
-基本的な確認では、現在の環境がMediaWikiのインストールに適しているかを確認します。
-インストール中に助けが必要になった場合は、この確認結果を提供してください。',
+基本的な確認では、現在の環境が MediaWiki のインストールに適しているかを確認します。
+インストール方法について助けが必要になった場合は、必ずこの確認結果を添えてください。',
 	'config-copyright' => '=== 著作権および規約 ===
 $1
 
@@ -10091,6 +10451,7 @@ Unicode を少しでも利用する可能性がある場合は、[//www.mediawik
 共有サーバーを使用している場合は、適切なデータベース ドライバーのインストールを、サーバーの管理者に依頼してください。
 PHP を自分でコンパイルした場合は、例えば <code>./configure --with-mysql</code> を実行して、データベース クライアントを使用できるように再設定してください。
 Debian または Ubuntu のパッケージから PHP をインストールした場合は、php5-mysql モジュールもインストールする必要があります。',
+	'config-outdated-sqlite' => "'''警告:''' あなたは SQLite $1 を使用していますが、最低限必要なバージョン $2 より古いバージョンです。SQLite は利用できません。",
 	'config-no-fts3' => "'''警告:''' SQLite は [//sqlite.org/fts3.html FTS3] モジュールなしでコンパイルされており、このバックエンドでは検索機能は利用できなくなります。",
 	'config-register-globals' => "'''警告: PHP の <code>[http://php.net/register_globals register_globals]</code> オプションが有効になっています。'''
 '''可能なら無効化してください。'''
@@ -10126,6 +10487,8 @@ MediaWiki を正しく動作させるには、UTF-8 対応が必要です。",
 	'config-no-cache' => "'''警告:''' [http://www.php.net/apc APC]、[http://xcache.lighttpd.net/ XCache]、[http://www.iis.net/download/WinCacheForPhp WinCache] のいずれも見つかりませんでした。
 オブジェクトのキャッシュは有効化されません。",
 	'config-diff3-bad' => 'GNU diff3 が見つかりません。',
+	'config-git' => 'バージョン管理ソフトウェア Git が見つかりました: <code>$1</code>',
+	'config-git-bad' => 'バージョン管理ソフトウェア Git が見つかりません。',
 	'config-imagemagick' => 'ImageMagickが見つかりました: <code>$1</code>。
 アップロードが有効であれば、画像のサムネイルを利用できます。',
 	'config-gd' => 'GD画像ライブラリが内蔵されていることが確認されました。
@@ -10158,7 +10521,7 @@ WindowsでMySQLを使用している場合に、「localhost」は、サーバ
 
 PostgreSQLを使用している場合、UNIXソケットで接続するにはこの欄を空欄のままにしてください。',
 	'config-db-host-oracle' => 'データベース TNS:',
-	'config-db-host-oracle-help' => '有効な[http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm ローカル接続名]を入力してください。tnsnames.oraファイルは、このインストールに対して表示されてなければなりません、<br />もしクライアントライブラリ10gもしくはそれ以上を使用している場合、メソッドの名前を[http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 簡易接続]で利用できます。',
+	'config-db-host-oracle-help' => '有効な[http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm ローカル接続名]を入力してください。tnsnames.ora ファイルは、このインストール先から参照できる場所に置いてください。<br />ご使用中のクライアント ライブラリが 10g 以降の場合、[http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] ネーミング メソッドを使用できます。',
 	'config-db-wiki-settings' => 'このウィキの識別情報',
 	'config-db-name' => 'データベース名:',
 	'config-db-name-help' => 'このウィキを識別する名前を入力してください。
@@ -10236,16 +10599,16 @@ $1
 	'config-missing-db-host' => '「データベースのホスト」を入力してください',
 	'config-missing-db-server-oracle' => '「データベース TNS」の値を入力してください',
 	'config-invalid-db-server-oracle' => '「$1」は無効なデータベース TNS です。
-アスキー英字(a-z、A-Z)、数字(0-9)、アンダーバー(_)、ドット(.)のみを使用してください。',
+「TNS 名」「Easy Connect」文字列のいずれかを使用してください ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle ネーミング メソッド])',
 	'config-invalid-db-name' => '「$1」は無効なデータベース名です。
-アスキー英字(a-z、A-Z)、数字(0-9)、アンダーバー(_)、ハイフン(-)のみを使用してください。',
-	'config-invalid-db-prefix' => '「$1」は無効なデータベース接頭語です。
-アスキー英字(a-z, A-Z)、数字(0-9)、下線(_)、ハイフン(-)のみを使用してください。',
+半角の英数字 (a-z、A-Z、0-9)、アンダースコア (_)、ハイフン (-) のみを使用してください。',
+	'config-invalid-db-prefix' => '「$1」は無効なデータベース接頭辞です。
+半角の英数字 (a-z、A-Z、0-9)、アンダースコア (_)、ハイフン (-) のみを使用してください。',
 	'config-connection-error' => '$1。
 
 以下のホスト名、ユーザー名、パスワードを確認してから再度試してください。',
 	'config-invalid-schema' => '「$1」は MediaWiki のスキーマとして無効です。
-ASCII の英数字 (a-z、A-Z、0-9)、下線 (_) のみを使用してください。',
+半角の英数字 (a-z、A-Z、0-9)、アンダースコア (_) のみを使用してください。',
 	'config-postgres-old' => 'PostgreSQL $1 以降が必要です。ご使用中の PostgreSQL は $2 です。',
 	'config-sqlite-name-help' => 'あなたのウェキと同一性のある名前を選んでください。
 空白およびハイフンは使用しないでください。
@@ -10285,12 +10648,12 @@ chmod a+w $3</pre>',
 
 [$1 ウィキを使い始める]ことができます。
 
-もし、<code>LocalSettings.php</code>ファイルを再生成したいのならば、下のボタンを押してください。
-ウィキに問題がないのであれば、これは'''推奨されません'''。",
+<code>LocalSettings.php</code> ファイルを再生成したい場合は、下のボタンを押してください。
+ウィキに問題がある場合を除き、再生成は'''推奨されません'''。",
 	'config-upgrade-done-no-regenerate' => 'アップグレードが完了しました。
 
 [$1 ウィキの使用を開始]することができます。',
-	'config-regenerate' => '<code>LocalSettings.php</code> を再生成→',
+	'config-regenerate' => 'LocalSettings.php を再生成→',
 	'config-show-table-status' => '<code>SHOW TABLE STATUS</code> クエリが失敗しました!',
 	'config-unknown-collation' => "'''警告:''' データベースは認識されない照合を使用しています。",
 	'config-db-web-account' => 'ウェブアクセスのためのデータベースアカウント',
@@ -10352,7 +10715,7 @@ chmod a+w $3</pre>',
 	'config-optional-continue' => '私にもっと質問してください。',
 	'config-optional-skip' => 'もう飽きてしまったので、とにかくウィキをインストールしてください。',
 	'config-profile' => '利用者権限のプロファイル:',
-	'config-profile-wiki' => '伝統的なウィキ', # Fuzzy
+	'config-profile-wiki' => '公開ウィキ',
 	'config-profile-no-anon' => 'アカウントの作成が必要',
 	'config-profile-fishbowl' => '承認された編集者のみ',
 	'config-profile-private' => '非公開ウィキ',
@@ -10415,15 +10778,17 @@ GFDLは有効なライセンスですが、内容を理解するのは困難で
 	'config-upload-deleted-help' => '削除されるファイルを保存するためのディレクトリを選択してください。
 これがウェブからアクセスできないことが理想です。',
 	'config-logo' => 'ロゴ のURL:',
-	'config-logo-help' => 'MediaWikiの既定の外装では、サイドバー上部に135x160ピクセルのロゴ用の余白があります。
-適切なサイズの画像をアップロードして、そのURLをここに入力してください。
+	'config-logo-help' => 'MediaWiki の既定の外装では、サイドバー上部に135x160ピクセルのロゴ用の余白があります。
+適切なサイズの画像をアップロードして、その URL をここに入力してください。
+
+ロゴが相対パスの場合は、<code>$wgStylePath</code> や <code>$wgScriptPath</code> を使用できます。
 
-ロゴが不要の場合は、このボックスを空白のままにしてください。',
+ロゴが不要の場合は、この欄を空白のままにしてください。',
 	'config-instantcommons' => 'Instant Commons 機能を有効にする',
-	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons]は、[//commons.wikimedia.org/ ウィキメディア・コモンズ]のサイトで見つかった画像や音声、その他のメディアをウィキ上で利用することができるようになる機能です。
-これを有効化するには、MediaWikiはインターネットに接続できなければなりません。
+	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] は、[//commons.wikimedia.org/ ウィキメディア・コモンズ]のサイトにある画像、音声、その他のメディアをウィキ上で利用できるようにする機能です。
+これを使用するには、MediaWiki がインターネットに接続できる必要があります。
 
-ウィキメディア・コモンズ以外のウィキを同じように設定する方法など、この機能に関する詳細な情報は、[//mediawiki.org/wiki/Manual:$wgForeignFileRepos マニュアル]をご覧ください。',
+ウィキメディア・コモンズ以外のウィキを同様に設定する手順など、この機能に関する詳細な情報は、[//mediawiki.org/wiki/Manual:$wgForeignFileRepos マニュアル]をご覧ください。',
 	'config-cc-error' => 'クリエイティブ・コモンズ・ライセンスの選択器から結果が得られませんでした。
 ライセンスの名前を手動で入力してください。',
 	'config-cc-again' => 'もう一度選択してください...',
@@ -10440,6 +10805,9 @@ GFDLは有効なライセンスですが、内容を理解するのは困難で
 カンマ区切りで、利用する特定のポートの指定が必要です。例:
 127.0.0.1:11211
 192.168.1.25:1234',
+	'config-memcache-noport' => 'Memcached サーバー $1 で使用するポート番号を指定していません。
+ポート番号が分からない場合、既定値は 11211 です。',
+	'config-memcache-badport' => 'Memcached のポート番号は $1 から $2 の範囲にしてください。',
 	'config-extensions' => '拡張機能',
 	'config-extensions-help' => '<code>./extensions</code>ディレクトリ内で、上記リストの拡張機能が発見されました。
 
@@ -10457,6 +10825,7 @@ GFDLは有効なライセンスですが、内容を理解するのは困難で
 	'config-install-pg-schema-failed' => 'テーブルの作成に失敗しました。
 利用者「$1」がスキーマ「$2」に書き込めるようにしてください。',
 	'config-install-pg-commit' => '変更を送信',
+	'config-pg-no-plpgsql' => 'データベース $1 内に PL/pgSQL 言語をインストールする必要があります。',
 	'config-install-user' => 'データベースユーザーの作成',
 	'config-install-user-alreadyexists' => 'ユーザー「$1」は既に存在します',
 	'config-install-user-create-failed' => 'ユーザー「$1」の作成に失敗しました: $2',
@@ -10515,7 +10884,7 @@ $messages['jam'] = array(
 == Taatop ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Jutish (jysk)
@@ -10523,7 +10892,7 @@ $messages['jam'] = array(
  */
 $messages['jut'] = array(
 	'mainpagetext' => "'''MediaWiki er nu installeret.'''",
-	'mainpagedocfooter' => "Se vores engelskspråĝede [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentåsje tilpasnenge'm åf æ brugergrænseflade] og [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide æ brugervejlednenge] før åplysnenger åpsætnenge'm og anvendelse.",
+	'mainpagedocfooter' => "Se vores engelskspråĝede [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentåsje tilpasnenge'm åf æ brugergrænseflade] og [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide æ brugervejlednenge] før åplysnenger åpsætnenge'm og anvendelse.", # Fuzzy
 );
 
 /** Javanese (Basa Jawa)
@@ -10534,7 +10903,7 @@ $messages['jv'] = array(
 == Miwiti panggunan  ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Daftar pangaturan préférènsi]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]", # Fuzzy
 );
 
 /** Georgian (ქართული)
@@ -10582,7 +10951,6 @@ $messages['ka'] = array(
 	'config-header-postgres' => 'PostgreSQL-ის პარამეტრები',
 	'config-header-sqlite' => 'SQLite-ის პარამეტრები',
 	'config-header-oracle' => 'Oracle-ის პარამეტრები',
-	'config-header-ibm_db2' => 'IBM DB2-ის პარამეტრები',
 	'config-invalid-db-type' => 'არასწორი მონაცემთა ბაზის ტიპი',
 	'config-mysql-innodb' => 'InnoDB',
 	'config-mysql-myisam' => 'MyISAM',
@@ -10643,7 +11011,7 @@ $messages['kaa'] = array(
 == Baslaw ushın ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfiguratsiya sazlaw dizimi]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWikidin' Ko'p Soralatug'ın Sorawları]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki haqqında xat tarqatıw dizimi]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki haqqında xat tarqatıw dizimi]", # Fuzzy
 );
 
 /** Адыгэбзэ (Адыгэбзэ)
@@ -10657,14 +11025,14 @@ $messages['kbd-cyrl'] = array(
 == Къыщхьэпэгъуэ хъуфынухэр ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Зэгъэзэхуэгъуэ гуэрэхэм я тхылъ];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-м упщӀэ нахъыбу ятхэмрэ я жэуапхэмрэ];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-м и версиэ щӀэуэ къэжахэм я къэӀохугъуэ].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-м и версиэ щӀэуэ къэжахэм я къэӀохугъуэ].', # Fuzzy
 );
 
 /** Khowar (کھوار)
  * @author Rachitrali
  */
 $messages['khw'] = array(
-	'mainpagetext' => "\"<big>'''میڈیاوکیو کامیابیو سورا چالو کورونو بیتی شیر۔.'''</big>\"",
+	'mainpagetext' => "'''میڈیاوکیو کامیابیو سورا چالو کورونو بیتی شیر۔.'''",
 );
 
 /** Kirmanjki (Kırmancki)
@@ -10677,7 +11045,7 @@ $messages['kiu'] = array(
 == Gamê verêni ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista ayarunê vırastene]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki de ÇZP]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-daena postey]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-daena postey]", # Fuzzy
 );
 
 /** Kazakh (Arabic script) (قازاقشا (تٴوتە)‏)
@@ -10689,7 +11057,7 @@ $messages['kk-arab'] = array(
 == باستاۋ ٴۇشىن ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings باپتالىم قالاۋلارىنىڭ ٴتىزىمى]
 * [//www.mediawiki.org/wiki/Manual:FAQ مەدىياۋىيكىيدىڭ جىيى قويىلعان ساۋالدارى]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce مەدىياۋىيكىي شىعۋ تۋرالى حات تاراتۋ ٴتىزىمى]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce مەدىياۋىيكىي شىعۋ تۋرالى حات تاراتۋ ٴتىزىمى]', # Fuzzy
 );
 
 /** Kazakh (Cyrillic script) (қазақша (кирил)‎)
@@ -10701,7 +11069,7 @@ $messages['kk-cyrl'] = array(
 == Бастау үшін ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Бапталым қалауларының тізімі]
 * [//www.mediawiki.org/wiki/Manual:FAQ МедиаУикидің Жиы Қойылған Сауалдары]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаУики шығу туралы хат тарату тізімі]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаУики шығу туралы хат тарату тізімі]', # Fuzzy
 );
 
 /** Kazakh (Latin script) (qazaqşa (latın)‎)
@@ -10713,7 +11081,7 @@ $messages['kk-latn'] = array(
 == Bastaw üşin ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Baptalım qalawlarınıñ tizimi]
 * [//www.mediawiki.org/wiki/Manual:FAQ MedïaWïkïdiñ Jïı Qoýılğan Sawaldarı]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MedïaWïkï şığw twralı xat taratw tizimi]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MedïaWïkï şığw twralı xat taratw tizimi]', # Fuzzy
 );
 
 /** Khmer (ភាសាខ្មែរ)
@@ -10743,7 +11111,7 @@ $messages['km'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings បញ្ជីកំណត់ទម្រង់]
 * [//www.mediawiki.org/wiki/Manual:FAQ/km សំណួរញឹកញាប់​មេឌាវិគី]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce បញ្ជី​ពិភាក្សា​ការផ្សព្វផ្សាយ​របស់​មេឌាវិគី]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce បញ្ជី​ពិភាក្សា​ការផ្សព្វផ្សាយ​របស់​មេឌាវិគី]', # Fuzzy
 );
 
 /** Kannada (ಕನ್ನಡ)
@@ -10756,7 +11124,7 @@ $messages['kn'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ ಮೀಡಿಯವಿಕಿ FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
 );
 
 /** Korean (한국어)
@@ -10815,8 +11183,8 @@ php.ini를 확인하고 <code>session.save_path</code>가 적절한 디렉토리
 	'config-help-restart' => '입력한 모든 저장된 데이터를 지우고 설치 과정을 다시 시작하겠습니까?',
 	'config-restart' => '예, 다시 시작합니다',
 	'config-welcome' => '=== 사용 환경 검사 ===
-이 환경이 미디어위키 설치에 적합한지 기본 검사를 실행합니다.
-설치 중 도움이 필요하다면 이 검사 결과를 함께 제공해주어야 합니다.',
+기본 검사는 지금 이 환경이 미디어위키 설치에 적합한지 수행합니다.
+설치를 완료하는 방법에 대한 지원을 찾는다면 이 정보를 포함해야 하는 것을 기억하세요.',
 	'config-copyright' => "=== 저작권 및 이용 약관 ===
 
 $1
@@ -10894,6 +11262,8 @@ Mandrake를 실행하고 있다면 php-xml 패키지를 설치하세요.',
 	'config-mod-security' => "'''경고''': 웹 서버에 [http://modsecurity.org/ mod_security]가 허용되었습니다. 잘못 설정된 경우 미디어위키나 사용자가 임의의 콘텐츠를 게시할 수 있는 다른 소프트웨어에 대한 문제를 일으킬 수 있습니다.
 [http://modsecurity.org/documentation/ mod_security] 문서를 참고하거나 임의의 오류가 발생할 경우 호스트의 지원 요청에 문의하십시오.",
 	'config-diff3-bad' => 'GNU diff3를 찾을 수 없습니다.',
+	'config-git' => 'Git 버전 관리 소프트웨어를 찾았습니다: <code>$1</code>.',
+	'config-git-bad' => 'Git 버전 관리 소프트웨어를 찾을 수 없습니다.',
 	'config-imagemagick' => 'ImageMagick를 찾았습니다: <code>$1</code>.
 올리기를 활성화할 경우 그림 섬네일이 활성화됩니다.',
 	'config-gd' => '내장된 GD 그래픽 라이브러리를 찾았습니다.
@@ -10905,16 +11275,16 @@ Mandrake를 실행하고 있다면 php-xml 패키지를 설치하세요.',
 	'config-no-cli-uri' => "'''경고''': 기본값을 사용하여 --scriptpath를 지정하지 않았습니다: <code>$1</code>.",
 	'config-using-server' => '"<nowiki>$1</nowiki>"(을)를 서버 이름으로 사용합니다.',
 	'config-using-uri' => '"<nowiki>$1$2</nowiki>"(을)를 서버 URL로 사용합니다.',
-	'config-uploads-not-safe' => "'''경고:''' 올리기에 대한 기본 디렉토리(<code>$1</code>)는 임의의 스크립트 실행에 취약합니다.
+	'config-uploads-not-safe' => "'''경고:''' 올리기에 대한 기본 디렉터리(<code>$1</code>)는 임의의 스크립트 실행에 취약합니다.
 미디어위키는 보안 위협에 대한 모든 올린 파일을 검사하지만, 올리기를 활성화하기 전에 [//www.mediawiki.org/wiki/Manual:Security#Upload_security 이 보안 취약점을 해결할 것]을 매우 권장합니다.",
-	'config-no-cli-uploads-check' => "'''경고:''' 올리기에 대한 기본 디렉토리(<code>$1</code>)는 CLI를 설치하는 동안 임의의 스크립트 실행에 대한 취약점에 대해 검사되지 않습니다.",
+	'config-no-cli-uploads-check' => "'''경고:''' 올리기에 대한 기본 디렉터리(<code>$1</code>)는 CLI를 설치하는 동안 임의의 스크립트 실행에 대한 취약점에 대해 검사되지 않습니다.",
 	'config-brokenlibxml' => '시스템에 버그가 있는 PHP와 libxml2의 조합이 있으며 미디어위키나 다른 웹 어플리케이션에 숨겨진 데이터 손상을 일으킬 수 있습니다.
 PHP 5.2.9 이후와 libxml2 2.7.3 이후로 업그레이드하세요. ([//bugs.php.net/bug.php?id=45996 PHP에 제기한 버그])
 설치가 중단되었습니다.',
 	'config-using531' => '미디어위키는 <code>__call()</code>을 참고로 매개 변수를 포함하는 버그로 인해 PHP $1(와)과 함께 사용할 수 없습니다.
 문제를 해결하려면 PHP 5.3.2 이상로 업그레이드하거나 PHP 5.3.0으로 다운그레이드를 하세요.
 설치가 중단되었습니다.',
-	'config-suhosin-max-value-length' => 'Suhosin이 설치되었고 $1 바이트로 GET 매개 변수인 <code>length</code>를 제한하고 있습니다.
+	'config-suhosin-max-value-length' => '수호신(Suhosin)이 설치되었고 $1 바이트로 GET 매개 변수인 <code>length</code>를 제한하고 있습니다.
 미디어위키의 ResourceLoader 구성 요소는 이 제한을 해결하지만 성능이 저하됩니다.
 가능하면 <code>php.ini</code>의 <code>suhosin.get.max_value_length</code>에 1024 이상으로 설정하고 <code>LocalSettings.php</code>의 <code>$wgResourceLoaderMaxQueryLength</code>에 같은 값을 설정해야 합니다.',
 	'config-db-type' => '데이터베이스 종류:',
@@ -10927,7 +11297,7 @@ PHP 5.2.9 이후와 libxml2 2.7.3 이후로 업그레이드하세요. ([//bugs.p
 
 PostgreSQL을 사용하면 유닉스 소켓을 통해 연결되도록 입력란을 비워두세요.',
 	'config-db-host-oracle' => '데이터베이스 TNS:',
-	'config-db-host-oracle-help' => '유효한 [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm 로컬 연결 이름]을 입력하세요. tnsnames.ora 파일이 이 설치에 보여야 합니다.<br />10g 이후의 클라이언트 라이브러리를 사용하는 경우 [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 쉬운 연결] 네이밍 메소드도 사용할 수 있습니다.',
+	'config-db-host-oracle-help' => '올바른 [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm 로컬 연결 이름]을 입력하세요. tnsnames.ora 파일이 이 설치에 보여야 합니다.<br />10g 이후의 클라이언트 라이브러리를 사용하는 경우 [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 쉬운 연결] 네이밍 메소드도 사용할 수 있습니다.',
 	'config-db-wiki-settings' => '이 위키 식별',
 	'config-db-name' => '데이터베이스 이름:',
 	'config-db-name-help' => '위키를 식별하기 위한 이름을 선택하세요.
@@ -10975,7 +11345,7 @@ MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전
 	'config-db-schema-help' => '보통 이 스키마는 문제가 없습니다.
 필요한 경우에만 바꾸세요.',
 	'config-pg-test-error' => "'''$1''' 데이터베이스에 연결할 수 없습니다: $2",
-	'config-sqlite-dir' => 'SQLite 데이터 디렉토리:',
+	'config-sqlite-dir' => 'SQLite 데이터 디렉터리:',
 	'config-sqlite-dir-help' => "SQLite는 하나의 파일에 모든 데이터를 저장합니다.
 
 제공하는 디렉토리는 설치하는 동안 웹 서버가 쓸 수 있어야 합니다.
@@ -10988,8 +11358,7 @@ MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전
 예를 들어 <code>/var/lib/mediawiki/yourwiki</code>와 같이 다른 곳에 데이터베이스를 넣는 것이 좋습니다.",
 	'config-oracle-def-ts' => '기본 테이블공간:',
 	'config-oracle-temp-ts' => '임시 테이블공간:',
-	'config-type-oracle' => '오라클',
-	'config-type-ibm_db2' => 'IBM DB2',
+	'config-type-oracle' => 'Oracle',
 	'config-support-info' => '미디어위키는 다음의 데이터베이스 시스템을 지원합니다:
 
 $1
@@ -10999,18 +11368,16 @@ $1
 	'config-support-postgres' => '* $1은 MySQL의 대안으로 인기 있는 오픈 소스 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pgsql.installation.php PostgreSQL을 지원하여 PHP를 컴파일하는 방법]) 몇가지 사소한 해결하지 못한 버그가 있을 수 있으며, 이를 제작 환경에서 사용하지 않는 것이 좋습니다.',
 	'config-support-sqlite' => '* $1는 매우 잘 지원하는 가벼운 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pdo.installation.php SQLite를 지원하여 PHP를 컴파일하는 방법], PDO 사용)',
 	'config-support-oracle' => '* $1은 상용 엔터프라이스 데이터베이스입니다. ([http://www.php.net/manual/en/oci8.installation.php OCI8을 지원하여 PHP를 컴파일하는 방법])',
-	'config-support-ibm_db2' => '* $1는 상용 엔터프라이즈 데이터베이스입니다.([http://www.php.net/manual/en/ibm-db2.installation.php IBM DB2를 지원하여 PHP를 컴파일하는 방법])',
 	'config-header-mysql' => 'MySQL 설정',
 	'config-header-postgres' => 'PostgreSQL 설정',
 	'config-header-sqlite' => 'SQLite 설정',
-	'config-header-oracle' => '오라클 설정',
-	'config-header-ibm_db2' => 'IBM DB2 설정',
+	'config-header-oracle' => 'Oracle 설정',
 	'config-invalid-db-type' => '잘못된 데이터베이스 종류',
 	'config-missing-db-name' => '"데이터베이스 이름"에 대한 값을 입력해야 합니다',
 	'config-missing-db-host' => '"데이터베이스 호스트"에 대한 값을 입력해야 합니다',
 	'config-missing-db-server-oracle' => '"데이터베이스 TNS"에 대한 값을 입력해야 합니다',
 	'config-invalid-db-server-oracle' => '"$1" 데이터베이스 TNS가 잘못됐습니다.
-ASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.',
+"TNS Name"이나 "Easy Connect" 문자열 중 하나를 사용하세요 ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle 네이밍 메서드])',
 	'config-invalid-db-name' => '"$1" 데이터베이스 이름이 잘못되었습니다.
 ASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하세요.',
 	'config-invalid-db-prefix' => '"$1" 데이터베이스 접두어가 잘못됐습니다.
@@ -11066,7 +11433,7 @@ chmod a+w $3</pre>',
 	'config-upgrade-done-no-regenerate' => '업그레이드가 완료되었습니다.
 
 이제 [$1 위키를 시작]할 수 있습니다.',
-	'config-regenerate' => '<code>LocalSettings.php</code> 다시 만들기 →',
+	'config-regenerate' => 'LocalSettings.php 다시 만들기 →',
 	'config-show-table-status' => '<code>SHOW TABLE STATUS</code> 쿼리를 실패했습니다!',
 	'config-unknown-collation' => "'''경고:''' 데이터베이스가 인식하지 않는 정렬을 사용하고 있습니다.",
 	'config-db-web-account' => '웹 접근을 위한 데이터베이스 계정',
@@ -11078,13 +11445,19 @@ chmod a+w $3</pre>',
 	'config-mysql-engine' => '스토리지 엔진:',
 	'config-mysql-innodb' => 'InnoDB',
 	'config-mysql-myisam' => 'MyISAM',
-	'config-mysql-myisam-dep' => "'''경고''': 미디어위키와 함께 사용하도록 권장하지 않는 MySQL에 대한 스토리지 엔진으로 MyISAM을 선택하였습니다. 이유는:
-* 테이블이 잠겨있어 동시성을 거의 지원하지 않습니다
-* 다른 엔진보다 손상이 더 자주 발생합니다
-* 미디어위키 바탕 코드가 항상 정상적으로 MyISAM을 처리하지 않습니다
-
-MySQL 설치가 InnoDB를 지원한다면 그 선택 대신에 InnoDB를 선택할 것을 매우 권장합니다.
-MySQL 설치가 InnoDB를 지원하지 않는다면 아마도 업그레이드를 해야 할 수도 있습니다.",
+	'config-mysql-myisam-dep' => "'''경고''': 미디어위키에 사용하지 않는 것이 좋은 MySQL에 대한 스토리지 엔진으로 MyISAM을 선택하였습니다. 이유는:
+* 테이블 잠금에 의해 간신히 동시성을 지원합니다
+* 다른 엔진보다 손상하는 경향이 있습니다
+* 미디어위키 코드베이스가 항상 정상적으로 MyISAM을 처리하지 않습니다
+
+MySQL 설치가 InnoDB를 지원한다면, 그 선택 대신에 InnoDB를 선택할 것을 매우 권장합니다.
+MySQL 설치가 InnoDB를 지원하지 않는다면, 아마도 업그레이드를 할 시간입니다.",
+	'config-mysql-only-myisam-dep' => "'''경고''': 미디어위키에 사용하지 않는 것이 좋은 MySQL에 대한 유일하게 사용할 수 있는 스토리지 엔진입니다. 이유는:
+* 테이블 잠금에 의해 간신히 동시성을 지원합니다
+* 다른 엔진보다 손상하는 경향이 있습니다
+* 미디어위키 코드베이스가 항상 정상적으로 MyISAM을 처리하지 않습니다
+
+MySQL 설치가 InnoDB를 지원하지 않으며, 아마도 업그레이드를 할 시간입니다.",
 	'config-mysql-engine-help' => "'''InnoDB'''는 동시적인 지원에 좋기 때문에 대부분 최고의 옵션입니다.
 
 '''MyISAM'''은 단일 사용자 또는 읽기 전용 설치에 빠를 수 있습니다.
@@ -11096,7 +11469,6 @@ MyISAM 데이터베이스는 InnoDB 데이터베이스보다 더 자주 손실
 MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전체 범위를 사용할 수 있습니다.
 '''UTF-8 모드'''에서는 MySQL은 데이터를 설정하는 문자 집합을 알고 있기 때문에 적절하게 표현하고 변환할 수 있지만
 [//ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%ED%8F%89%EB%A9%B4#.EA.B8.B0.EB.B3.B8_.EB.8B.A4.EA.B5.AD.EC.96.B4_.ED.8F.89.EB.A9.B4 기본 다국어 평면] 밖의 문자를 저장할 수 없습니다.",
-	'config-ibm_db2-low-db-pagesize' => "DB2 데이터베이스에 부족한 페이지 크기가 기본 테이블 공간에 있습니다. 페이지 크기는 '''32K''' 이상이어야 합니다.",
 	'config-site-name' => '위키 이름:',
 	'config-site-name-help' => '브라우저 제목 표시줄과 다른 여러 곳에 나타납니다.',
 	'config-site-name-blank' => '사이트 이름을 입력하세요.',
@@ -11165,7 +11537,7 @@ MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전
 	'config-license-gfdl' => 'GNU 자유 문서 사용 허가서 1.3 이상',
 	'config-license-pd' => '퍼블릭 도메인',
 	'config-license-cc-choose' => '다른 크리에이티브 커먼즈 라이선스 선택',
-	'config-license-help' => "많은 공개 위키는 모든 기여를 [http://freedomdefined.org/Definition 자유 라이선스] 하에 넣습니다.
+	'config-license-help' => "많은 공개 위키는 모든 기여를 [http://freedomdefined.org/Definition 자유 라이선스]에 따라 넣습니다.
 이렇게 하면 커뮤니티 소유권의 이해를 할 수 있도록 하고 장기적인 기여를 장려합니다.
 일반적으로 개인 또는 회사 위키에 대해서는 필요하지 않습니다.
 
@@ -11173,7 +11545,7 @@ MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전
 
 위키백과는 이전에 GNU 자유 문서 사용 허가서를 사용했습니다.
 GFDL은 유효한 라이선스이지만 내용을 이해하기 어렵습니다.
-GFDL 하에 사용을 허가한 내용을 재사용하는 것도 어렵습니다.",
+GFDL에 따라 사용이 허가된 내용을 재사용하는 것도 어렵습니다.",
 	'config-email-settings' => '이메일 설정',
 	'config-enable-email' => '발신 이메일 활성화',
 	'config-enable-email-help' => '이메일을 작동하려면 [http://www.php.net/manual/en/mail.configuration.php PHP의 메일 설정]을 올바르게 설정해야 합니다.
@@ -11199,12 +11571,14 @@ GFDL 하에 사용을 허가한 내용을 재사용하는 것도 어렵습니다
 
 파일 올리기를 활성화하려면 미디어위키의 루트 디렉토리에 있는 <code>images</code> 하위 디렉토리에서 웹 서버가 기록할 수 있도록 모드를 바꿉니다.
 그 다음 이 옵션을 활성화합니다.',
-	'config-upload-deleted' => '삭제된 파일에 대한 디렉토리:',
+	'config-upload-deleted' => '삭제된 파일에 대한 디렉터리:',
 	'config-upload-deleted-help' => '삭제된 파일을 보관할 디렉토리를 선택하세요.
 이상적으로 웹에서 접근할 수 없게 해야 합니다.',
 	'config-logo' => '로고 URL:',
-	'config-logo-help' => '미디어위키의 기본 스킨은 사이드바 메뉴 위에 135×160 픽셀의 로고를 포함하고 있습니다.
-적당한 크기로 이미지를 올리고 URL을 여기에 입력하세요.
+	'config-logo-help' => '미디어위키의 기본 스킨은 사이드바 메뉴 위에 135×160 픽셀의 로고의 공간을 포함하고 있습니다.
+적당한 크기로 그림을 올리고 여기에 URL을 입력하세요.
+
+로고가 상대적인 경로에 있으면 <code>$wgStylePath</code>나 <code>$wgScriptPath</code>를 사용할 수 있습니다.
 
 로고 사용을 원하지 않으면 이 상자를 비우세요.',
 	'config-instantcommons' => '인스턴트 공용 활성화',
@@ -11258,7 +11632,7 @@ GFDL 하에 사용을 허가한 내용을 재사용하는 것도 어렵습니다
 
 현재 미디어위키는 테이블을 웹 사용자가 소유해야 합니다. 다른 웹 계정 이름을 지정하거나 "뒤로"를 클릭하고 적절한 권한의 설치할 사용자를 지정하세요.',
 	'config-install-user' => '데이터베이스 사용자를 만드는 중',
-	'config-install-user-alreadyexists' => '"$1" 사용자가 이미 있습니다',
+	'config-install-user-alreadyexists' => '"$1" 사용자가 이미 존재합니다',
 	'config-install-user-create-failed' => '"$1" 사용자 만드는 중 실패: $2',
 	'config-install-user-grant-failed' => '"$1" 사용자에 대한 권한 부여 실패: $2',
 	'config-install-user-missing' => '지정한 "$1" 사용자가 존재하지 않습니다.',
@@ -11287,18 +11661,21 @@ GFDL 하에 사용을 허가한 내용을 재사용하는 것도 어렵습니다
 설치 프로그램이 <code>LocalSettings.php</code> 파일을 만들었습니다.
 모든 설정이 포함되어 있습니다.
 
-파일을 다운로드하여 위키 설치의 거점에 넣어야 합니다. (index.php와 같은 디렉토리) 다운로드가 자동으로 시작됩니다.
+파일을 다운로드하여 위키 설치의 거점에 넣어야 합니다. (index.php와 같은 디렉터리) 다운로드가 자동으로 시작됩니다.
 
 다운로드가 제공되지 않을 경우나 그것을 취소한 경우에는 아래의 링크를 클릭하여 다운로드를 다시 시작할 수 있습니다:
 
 $3
 
-'''참고''': 이 생성한 설정 파일을 다운로드하지 않고 설치를 끝내면 이 파일은 나중에 사용할 수 없습니다.
+'''참고:''' 이 생성한 설정 파일을 다운로드하지 않고 설치를 끝내면 이 파일은 나중에 사용할 수 없습니다.
 
 완료되었으면 '''[$2 위키에 들어갈 수 있습니다]'''.",
 	'config-download-localsettings' => '<code>LocalSettings.php</code> 다운로드',
 	'config-help' => '도움말',
 	'config-nofile' => '"$1" 파일을 찾을 수 없습니다. 이미 삭제되었나요?',
+	'config-extension-link' => '당신의 위키가 [//www.mediawiki.org/wiki/Manual:Extensions 확장 기능]을 지원한다는 것을 알고 계십니까?
+
+전체 확장 기능의 목록을 확인하려면 [//www.mediawiki.org/wiki/Category:Extensions_by_category 분류별 확장 기능]이나 [//www.mediawiki.org/wiki/Extension_Matrix 확장 기능 표]를 찾아보실 수 있습니다.',
 	'mainpagetext' => "'''미디어위키가 성공적으로 설치되었습니다.'''",
 	'mainpagedocfooter' => '[//meta.wikimedia.org/wiki/Help:Contents 이곳]에서 위키 소프트웨어에 대한 정보를 얻을 수 있습니다.
 
@@ -11320,7 +11697,7 @@ $messages['krc'] = array(
 == Файдалы ресурсла ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings тюрлендириулени списогу (ингил.)];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-ни юсюнден кёб берилген соруула];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ни джангы версиясыны чыкъгъанын билдириу письмола].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ни джангы версиясыны чыкъгъанын билдириу письмола].", # Fuzzy
 );
 
 /** Colognian (Ripoarisch)
@@ -11450,7 +11827,7 @@ Dat heiß, mer moß en affschallde, söns jeiht nix.",
 MediaWiki bruch Funxjohne en däm Modul un deiht et esu nit.
 Wann De <i lang="en">Mandrake</i> aam loufehäs, donn dat Pakätt <code lang="en">php-xml</code> enstalleere.',
 	'config-pcre' => 'Dem PHP sing Modul för <i lang="en">PCRE</i> schingk ze fähle.
-MediaWiki deiht et nit ohne de Funxjohne för de <i lang="en">Perl-compatible regular expressions</i>.',
+MediaWiki deiht et nit der ohne de Funxjohne för de rejolähre Ußdrök vun dä Zoot, wi <i lang="en">Perl</i> se kännt.',
 	'config-pcre-no-utf8' => "'''Dä:''' Et PHP-Modul <i lang=\"en\">PCRE</i> schingk ohne de <i lang=\"en\">PCRE_UTF8</i>-Aandeile övversaz ze sin.
 MediaWiki bruch dä UTF-8-Krohm ävver, öm ohne Fähler loufe ze künne.",
 	'config-memory-raised' => 'Der jrühzte zohjelasse Shpeisherbedarf vum PHP, et <code lang="en">memory_limit</code>, shtund op $1 un es op $2 erop jesaz woode.',
@@ -11465,6 +11842,8 @@ Et Enreeschte kunnt doh draan kappott jon!",
 Et <i lang="en">object caching</i> es nit müjjelesh un ußjeschalldt.',
 	'config-mod-security' => "'''Opjepaß''': Dinge Webßööver hät <code lang=\"en\">[http://modsecurity.org/ mod_security]</code> enjeschalldt. Wann doh derbei en Enschtällong nit janz akeraat paßß, dann kann et goot sin, dat mer Probleme met MeedijaWiki un oc met ander Projramme kritt, die zohlööt, dat vun ußerhallef öhndsene Krohm op dä Webßööver jebraat wääde künnt.Beloor Der di Sigg <code lang=\"en\">[http://modsecurity.org/documentation/ mod_security documentation]</code> udder donn met dä Fachlück för Dinge Webßööver kalle, wann zohfälleje un koomijje Fähler bemerke deihß.",
 	'config-diff3-bad' => 'Mer han <i lang="en">GNU</i> <code lang="en">diff3</code> nit jefonge.',
+	'config-git' => 'Mer han de Väsjohn <code>$1</code> vun däm Väsjohnsverwalldongsprojamm <i lang="en">Git</i> jefonge.',
+	'config-git-bad' => 'Dat Väsjohnsverwalldongsprojamm <i lang="en">Git</i> ham_mer nit jefonge.',
 	'config-imagemagick' => 'Mer han <i lang="en">ImageMagick</i> jefonge: <code>$1</code>.
 Et Ömrääschne en Minni-Beldsche weed müjjelesch sin, wann De et Belder Huhlaade zohlöhß.',
 	'config-gd' => 'Mer han de ennjeboute GD-Jrafik-Projramm-Biblijotheek jefonge.
@@ -11484,7 +11863,7 @@ Heh jeihd et nit wigger.',
 	'config-using531' => 'MediaWiki läuf nit met PHP $1 zosamme wääje enem [//bugs.php.net/bug.php?id=50394 Fähler em Zosammehang met Parrameetere för <code lang="en">__call()</code>].
 Jangk op de Version 5.3.2 vum <i lang="en">PHP</i> ov dohnoh, udder op de Version 5.3.0 udder dovöör, öm dat Problem ze ömjonn.
 Heh jeiht et nit wigger.',
-	'config-suhosin-max-value-length' => '<i lang="en">Suhosin</i> es enschtalleet. Dröm kann ene <code lang="en">GET</code>-Parrameeter nit övver {{PLURAL:$1|ei Byte|$q Bytes|noll Byte}} lang wääde. En MediaWiki singe <i lang="en">ResourceLoader</i> kütt doh zwa drömeröm, ävver dat brems. Wann müjelesch, doht <code lang="en">suhosin.get.max_value_length</code> en dä Dattei <code lang="en">php.ini</code> op 1024 Bytes udder drövver enschtälle. un dann moß <code lang="en">$wgResourceLoaderMaxQueryLength</code> en dä Dattei <code lang="en">LocalSettings.php</code> op däsälve Wäät jesaz wääde.', # Fuzzy
+	'config-suhosin-max-value-length' => '<i lang="en">Suhosin</i> es enschtalleet. Dröm kann ene <code lang="en">GET</code>-Parrameeter nit övver {{PLURAL:$1|ei Byte|$1 Bytes|noll Byte}} lang wääde. Dem MediaWiki singe <i lang="en">ResourceLoader</i> kütt doh zwa drömeröm, ävver dat bräms. Wann müjelesch, doht <code lang="en">suhosin.get.max_value_length</code> en dä Dattei <code lang="en">php.ini</code> op 1024 Bytes udder drövver enschtälle, un dann moß <code lang="en">$wgResourceLoaderMaxQueryLength</code> en dä Dattei <code lang="en">LocalSettings.php</code> op däsälve Wäät jesaz wääde.',
 	'config-db-type' => 'De Zoot Daatebangk:',
 	'config-db-host' => 'Dä Name vun däm Rääschner met dä Daatebangk:',
 	'config-db-host-help' => 'Wann Dinge ẞööver för de Daatebangk ob enem andere Rääschner es, donn heh dämm singe Name udder dämm sing <i lang="en">IP</i>-Addräß enjävve.
@@ -11566,7 +11945,6 @@ Donn Ding Daatebangk et beß janz woh anders hen, noh <code lang="en">/var/lib/m
 	'config-type-postgres' => '<i lang="en">PostgreSQL</i>',
 	'config-type-sqlite' => '<i lang="en">SQLite</i>',
 	'config-type-oracle' => '<i lang="en">Oracle</i>',
-	'config-type-ibm_db2' => 'Dä <i lang="en">IBM</i> ier <i lang="en">DB2</i>',
 	'config-support-info' => 'MediaWiki kann met heh dä Daatebangk_Süßteeme zosamme jonn:
 
 $1
@@ -11576,12 +11954,10 @@ Wann dat Daatebangk_Süßteem, wat De nämme wells, onge nit dobei es, dann donn
 	'config-support-postgres' => '* <i lang="en">$1</i> es e bikannt Daatebangksüßteem met offe Quälltäxde, un en och en Wahl nävve <i lang="en">MySQL</i> ([http://www.php.net/manual/de/pgsql.installation.php Aanleidung för et Övversäze un Enreeschte von PHP met <i lang="en">PostgreSQL</i> dobei, op Deutsch]) Et sinn_er ävver paa klein Fählershe bekannt, um kunne dat em Momang för et reschtijje Werke nit emfähle.',
 	'config-support-sqlite' => '* <i lang="en">$1</i> es e eijfach Daatebangksüßteem, wat joot ongershtöz weed. ([http://www.php.net/manual/de/pdo.installation.php Aanleidong för et Övversäze un Enreeschte von PHP met <i lang="en">SQLite</i> dobei, op Deutsch])',
 	'config-support-oracle' => '* <i lang="en">$1</i> es e jeschäfflesch Daatebangksüßteem för Ferme. ([http://www.php.net/manual/de/oci8.installation.php Aanleidong för et Övversäze un Enreeschte von PHP met <i lang="en">OCI8</i> dobei, op Deutsch])',
-	'config-support-ibm_db2' => '* $1 es en Datebengk för et Jeschäff un fö Ongernehme.', # Fuzzy
 	'config-header-mysql' => 'De Enshtällunge för de <i lang="en">MySQL</i> Daatebangk',
 	'config-header-postgres' => 'De Enshtällunge för de <i lang="en">PostgreSQL</i> Daatebangk',
 	'config-header-sqlite' => 'De Enshtällunge för de <i lang="en">SQLite</i> Daatebangk',
 	'config-header-oracle' => 'De Enshtällunge för de <i lang="en">Oracle</i> Daatebangk',
-	'config-header-ibm_db2' => 'De Enshtällunge för de <i lang="en">IBM</i> ier <i lang="en">DB2</i>',
 	'config-invalid-db-type' => 'Dat es en onjöltijje Zoot Daatebangk.',
 	'config-missing-db-name' => 'Do moß jät enjävve för dä Name vun dä Daatebangk.',
 	'config-missing-db-host' => 'Do moß jät enjävve för dä Name vun däm Rääschner met dä Daatebangk.',
@@ -11658,6 +12034,13 @@ Dä aanjejovve Zohjang för der Nomaalbedrief moß dröm schunn enjersht sen!',
 
 Wann Ding <i lang="en">MySQL</i> et Schpeischere en <i lang="en">InnoDB</i>-Datteije ongerschtöze deiht, dom_mer dat nohdröcklesch ämfähle.
 Kann dä ẞööver dat nit, künnd et joode jelääjeheit sin, dä ens op der neuste Schtand ze bränge.',
+	'config-mysql-only-myisam-dep' => '\'\'\'Opjepaß:\'\'\' <i lang="en">MyISAM</i> es de einzeje Zoot Speischerprojramm för <i lang="en">MySQL</i>, di nit för MediaWiki ze ämfähle es, weil:
+* wääje dem Schpärre vun jannze Tabälle sin koum paralleele Axjuhne en dä Daatebangk möjjelesch,
+* et es aanfällesch för Probleeme met de Daate es, un
+* et weed vun MediaWiki nit emmer jood ongerschtöz.
+
+Ding Enschtallazjuhn vum <i lang="en">MySQL</i> kann nit met <i lang="en">InnoDB</i> ömjonn.
+Wi wöhr et met ener neuere väsjohn vum <i lang="en">MySQL</i>?',
 	'config-mysql-engine-help' => "'''InnoDB''' es fö jewöhnlesch et beß, weil vill Zohjreffe op eijmohl joot ongershtöz wääde.
 
 '''MyISAM''' es flöcker op Rääschnere met bloß einem Minsch draan, un bei Wikis, di mer bloß lässe un nit schrieeve kann.
@@ -11670,7 +12053,6 @@ Dat es flöcker un spaasaamer wi et UTF-8 Fommaat vum <i lang=\"en\">MySQL</i> u
 
 Beim Shpeishere em '''UTF-8 Fomaat''' deiht et <i lang=\"en\">MySQL</i> der Zeishesaz un de Kodeerung vun dä Daate känne, un kann se akeraat aanzeije un ömwandelle,
 allerdengs künne kein Zeishe ußerhalv vum [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke jrundlääje Knubbel för vill Shprooche (<i lang=\"en\">Basic Multilingual Plane — BMP</i>)] afjeshpeishert wääde.",
-	'config-ibm_db2-low-db-pagesize' => "De <i lang=\"en\">DB2</i> Daatebangk heh hät ene standattmääßeje Plaz för Tabälle met zoh klein Sigge. Dä Plaz en de Sigge moß '''32K''' udder mieh sin.",
 	'config-site-name' => 'Däm Wiki singe Name:',
 	'config-site-name-help' => 'Dä douch em Tittel vun de Brauserfinstere un aan ätlije andere Shtälle op.',
 	'config-site-name-blank' => 'Donn ene Name för di Sait aanjävve.',
@@ -11713,25 +12095,25 @@ Do künnts jez der Räß vun de einzel Enshtellunge övverjonn, un et Wiki tirä
 	'config-optional-continue' => 'De wells noch mieh Frore jeshtallt krijje un noch mieh Enshtällunge maache?',
 	'config-optional-skip' => 'Nä, lohß dä Ömshtand, donn eifarr_et Wiki opsäze.',
 	'config-profile' => 'Enshtällunge för de Metmaacher ier Rääschte:',
-	'config-profile-wiki' => 'E tradizjonäll offe Wiki', # Fuzzy
+	'config-profile-wiki' => 'En offe Wiki',
 	'config-profile-no-anon' => 'Schriever möße enlogge',
 	'config-profile-fishbowl' => 'Bloß ußdröcklesch zohjelohße Schriever',
 	'config-profile-private' => 'E jeschloße Privat_Wiki',
-	'config-profile-help' => "Wikis loufe et beß, wam_mer esu vill Lück wi müjjelesch draan metmaache un schrieve löht.
-Met MediaWiki es et ejfach, de neuste Änderunge ze beloore un wat ahnungslose udder fiese Lück kapott jemaat han wider retuur ze maache.
+	'config-profile-help' => "Wikis loufe et bäß, wam_mer esu vill Lück wi möjjelesch draan metmaache un schrieve löht.
+Met MediaWiki es et ejfach, de neuste Änderonge ze beloore un wat ahnungslose udder fiese Lück kapott jemaat han wider retuur ze maache.
 
-Bloß, mänsh eine häd_eruß jefonge, dat mer MediaWiki jood en en jruuße Zahl ongerscheidlijje Rolle bruche kann, un nit emmer es et leish, ene vum onverfälschte Wiki_Wääsch ze övverzeuje.
+Bloß, mänsch eine häd_eruß jefonge, dat mer MediaWiki jood en en jruuße Zahl ongerscheidlijje Rolle bruche kann, un nit emmer es et leisch, ene vum onverfälschte Wiki_Wääsch ze övverzeuje.
 Esu häß De de Wahl:
 
-'''{{int:config-profile-wiki}}''' löht jeder_ein metschrieve, och ohne enzelogge.
+'''{{int:config-profile-wiki}}''' löht jeder_ein metschrieve, och ohne sesch enzelogge.
 
-'''{{int:config-profile-no-anon}}''', dat sorsh för mieh seeshbaa Verantwootlishkeite, künnt ävver zohfällije Methellefer verschrecke.
+'''{{int:config-profile-no-anon}}''', dat sorsch för mieh seeschbaa Verantwootlischkeite, künnt ävver zohfällije Methellefer verschrecke.
 
 '''{{int:config-profile-fishbowl}}''' löht nor de ußjesöhk Metmaacher schrieve, ävver de janze Öffentleshkeit kann et lässe un süht och de ällder Versione, un wat wää wann draan jedonn hät.
 
 '''{{int:config-profile-private}}''' kann nur lässe, wäh en et Wiki zohjelohße es, un desellve Jropp kann uch schrieve.
 
-Noch ander un un opwändijere Enshtellunge för de Rääschte sin müjjelesch, wann et Wiki ens aam Loufe es. Loor Der doför de [//www.mediawiki.org/wiki/Manual:User_rights zopaß Hölp em Handbooch] aan.", # Fuzzy
+Noch ander un un opwändijere Enschtellunge för de Rääschte sin möjjelesch, wann et Wiki ens aam Loufe es. Loor Der doför de [//www.mediawiki.org/wiki/Manual:User_rights zopaß Hölp em Handbooch] aan.",
 	'config-license' => 'Urhävverrääsch un Lizänz:',
 	'config-license-none' => 'Kein Fooßreih övver de Lizänz',
 	'config-license-cc-by-sa' => '<i lang="en">Creative Commons</i> Der Name moß jenannt sin, et Wiggerjävve es zohjelohße onger dersellve Bedengunge',
@@ -11780,6 +12162,8 @@ Et bäß es, wam_mer vum <i lang="en">world wide web</i> doh nit drahn kumme kan
 	'config-logo-help' => 'De Schtandart_Bedeen_Bovverfläsch vum MediaWiki hät e Logo bovve en der Eck met 135x160 Pixele.
 Donn e zopaß Logo huh laade, un donn däm sing URL heh endraare.
 
+Do kanns <code lang="en">$wgStylePath</code> udder <code lang="en">$wgScriptPath</code> nämme, wann Ding Logo en einem vun dänne Pahde litt.
+
 Wells De kei Logo han, draach heh nix en.',
 	'config-instantcommons' => 'Donn <i lang="en">InstantCommons</i> zohlohße.',
 	'config-instantcommons-help' => '<i lang="en">[//www.mediawiki.org/wiki/InstantCommons InstantCommons]</i> es en Eijeschaff, di et för Wikis müjjelesch määt, Belder, Tondatteie un ander Meedijedatteie enzebenge, di op dä Webßait vun de <i lang="en">[//commons.wikimedia.org/ Wikimedia Commons]</i> ongerjebraat sin. Öm dat noze ze künne, moß dä ẞööver vum MediaWiki en Verbendung nohm Internet opnämme künne.
@@ -11806,7 +12190,7 @@ Se sullte ein pro Reih opjeschrevve sin, un en Pooz (<i lang="en">port</i>) ier
 	'config-memcache-noport' => 'Do has kein Pooz (<code lang="en">port</code>) Nommer aanjejovve för mem <code lang="en">memcached</code> ẞööver ze bruche: $1.
 Wann De di Nommer nit weiß, der Shtandatt es 11211.',
 	'config-memcache-badport' => 'Dem <code lang="en">memcached</code> ẞööver singe Pooz (<code lang="en">port</code>) Nommere sullte zwesche $1 un $2 sin.',
-	'config-extensions' => 'Projramm-Zosätz (<i lang="en">extensions</i>)',
+	'config-extensions' => 'Projramm-Zohsäz (<i lang="en">Extensions</i>)',
 	'config-extensions-help' => 'Di bovve opjeleß Zohsazprojramme för et MediaWiki sin em Verzeischneß <code lang="en">./extensions</code> ald ze fenge.
 
 Do kann se heh un jez aanschallde, ävver se künnte noch zohsäzlesch Enshtellunge bruche.',
@@ -11814,7 +12198,7 @@ Do kann se heh un jez aanschallde, ävver se künnte noch zohsäzlesch Enshtellu
 Et sühd esu uß, wi wann De MediaWiki ald enshtalleet hätß, un wöhrs aam Versöhke, dat norr_ens ze donn.
 Jang wigger op de näähßte Sigg.",
 	'config-install-begin' => 'Wann De op „{{int:config-continue}}“ klecks, jeiht de Enshtallazjuhn vum MediaWiki loßß.
-Wann De noch Änderonge maache wells, dann kleck op „{{int:config-back}}“.', # Fuzzy
+Wann De noch Änderonge maache wells, dann kleck op „{{int:config-back}}“.',
 	'config-install-step-done' => 'jedonn',
 	'config-install-step-failed' => 'donävve jejange',
 	'config-install-extensions' => 'Zohsazprojramme enjeschloße',
@@ -11874,14 +12258,18 @@ Wann De mem Ronger- un widder Huhlaade fäädesh bes, kanns De '''[\$2 en Ding W
 	'config-download-localsettings' => 'Donn di Dattei <code lang="en">LocalSettings.php</code> eronger laade',
 	'config-help' => 'Hölp',
 	'config-nofile' => 'De Dattei „$1“ ham_mer nit jefonge. Es di fottjeschmeße?',
+	'config-extension-link' => 'Häs De jewoß, dat et Wiki [//www.mediawiki.org/wiki/Manual:Extensions Zohsazprojramme] hann kann?
+
+Do kanns [//www.mediawiki.org/wiki/Category:Extensions_by_category Zohsazprojramme noh Saachjroppe] söhke udder en de [//www.mediawiki.org/wiki/Extension_Matrix Tabäll met de Zohsazprojramme] kike, öm de kumplätte Leß met de Zohsazprojramme ze krijje.',
 	'mainpagetext' => "'''MediaWiki es jetz enstalleet.'''",
-	'mainpagedocfooter' => 'Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handboch] wann De wesse wells wie de Wiki-Soffwär jebruch un bedeent wääde muss.
+	'mainpagedocfooter' => 'Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbooch] wann De wesse wells wie de Wiki-Soffwär jebruch un bedeent wääde moß.
 
 == För dä Aanfang ==
 Dat es och all op Änglesch:
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Donn MediaWiki op Ding Schprooch aanpaße]',
 );
 
 /** Kurdish (Latin script) (Kurdî (latînî)‎)
@@ -11903,7 +12291,7 @@ $messages['ku-latn'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lîsteya varîyablên konfîgûrasîyonê]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lîsteya e-nameyên versyonên nuh yê MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lîsteya e-nameyên versyonên nuh yê MediaWiki]', # Fuzzy
 );
 
 /** Ladino (Ladino)
@@ -11916,11 +12304,12 @@ $messages['lad'] = array(
 == En Empeçando ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings La lista de los arreglamientos de la konfiggurasyón]
 * [//www.mediawiki.org/wiki/Manual:FAQ/lad DDS de MedyaViki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce La lista de las letrales (e-mail) de MedyaViki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce La lista de las letrales (e-mail) de MedyaViki]', # Fuzzy
 );
 
 /** Luxembourgish (Lëtzebuergesch)
  * @author Robby
+ * @author Soued031
  * @author 아라
  */
 $messages['lb'] = array(
@@ -11930,6 +12319,8 @@ $messages['lb'] = array(
 	'config-localsettings-upgrade' => "'''Opgepasst''': E Fichier <code>LocalSettings.php</code> gouf fonnt.
 Är Software kann aktualiséiert ginn, setzt w.e.g. de Wäert vum <code>\$wgUpgradeKey</code> an d'Këscht.
 Dir fannt en am <code>LocalSettings.php</code>.",
+	'config-localsettings-cli-upgrade' => "E Fichier <code>LocalSettings.php</code> gouf fonnt.
+Fir dës Installatioun z'aktuaéliséieren start w.e.g. <code>update.php</code>",
 	'config-localsettings-key' => 'Aktualisatiounsschlëssel:',
 	'config-localsettings-badkey' => 'De Schlëssel deen Dir aginn hutt ass net korrekt',
 	'config-localsettings-incomplete' => 'De Fichier <code>LocalSettings.php</code> schéngt net komplett ze sinn.
@@ -11963,7 +12354,7 @@ Kuckt Är php.ini no a vergewëssert Iech datt <code>session.save_path</code>  o
 	'config-restart' => 'Jo, neistarten',
 	'config-welcome' => "=== Iwwerpréifung vum Installatiounsenvironnement ===
 Et gi grondsätzlech Iwwerpréifunge gemaach fir ze kucken ob den Environnment gëeegent ass fir MediaWiki z'installéieren.
-Dir sollt d'Resultater vun dëser Iwwerpréifung ugi wann Dir während der Installatioun Hëllef braucht.",
+Dir sollt d'Resultater vun dëser Iwwerpréifung ugi wann Dir während der Installatioun Hëllef frot wéi Dir D'Installatioun ofschléisse kënnt.",
 	'config-sidebar' => '* [//www.mediawiki.org MediaWiki Haaptsäit]
 * [//www.mediawiki.org/wiki/Help:Contents Benotzerguide]
 * [//www.mediawiki.org/wiki/Manual:Contents Guide fir Administrateuren]
@@ -11987,9 +12378,10 @@ Dës Datebank-Type ginn ënnerstëtzt: $1.
 Wann Dir op engem gesharte Server sidd, da frot Ären Hosting-Provider fir de passenden Datebank-Driver z'installéieren.
 Wann Dir PHP selwer compiléiert hutt, da reconfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir <code>./configure --with-mysql</code> benotzt.
 Wann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.",
+	'config-outdated-sqlite' => "'''Warnung:''' SQLite $1 ass installéiert. Allerdengs brauch MediaWiki SQLite $2 oder méi nei. SQLite ass dofir net disponibel.",
 	'config-memory-bad' => "'''Opgepasst:''' De Parameter <code>memory_limit</code> vu PHP ass $1.
 Dat ass wahrscheinlech ze niddreg.
-D'Installatioun kéint net fonctionnéieren.",
+D'Installatioun kéint net funktionéieren.",
 	'config-xcache' => '[http://xcache.lighttpd.net/ XCache] ass installéiert',
 	'config-apc' => '[http://www.php.net/apc APC] ass installéiert',
 	'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] ass installéiert',
@@ -11997,7 +12389,9 @@ D'Installatioun kéint net fonctionnéieren.",
 	'config-no-uri' => "'''Feeler:''' Déi aktuell URI konnt net festgestallt ginn.
 Installatioun ofgebrach.",
 	'config-using-server' => 'De Servernumm "<nowiki>$1</nowiki>" gëtt benotzt.',
+	'config-using-uri' => 'D\'Server URL  "<nowiki>$1$2</nowiki>" gëtt benotzt.',
 	'config-db-type' => 'Datebanktyp:',
+	'config-db-host' => 'Host vun der Datebank:',
 	'config-db-host-oracle' => 'Datebank-TNS:',
 	'config-db-wiki-settings' => 'Dës Wiki identifizéieren',
 	'config-db-name' => 'Numm vun der Datebank:',
@@ -12026,13 +12420,10 @@ Wann et de Kont net gëtt, a wann den Installatiouns-Kont genuch Rechter huet, g
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
-	'config-type-ibm_db2' => 'IBM DB2',
-	'config-support-ibm_db2' => '* $1 ass eng kommerziell Firma fir Datebanken', # Fuzzy
 	'config-header-mysql' => 'MySQL-Astellungen',
 	'config-header-postgres' => 'PostgreSQL-Astellungen',
 	'config-header-sqlite' => 'SQLite-Astellungen',
 	'config-header-oracle' => 'Oracle-Astellungen',
-	'config-header-ibm_db2' => 'IBM DB2-Astellungen',
 	'config-invalid-db-type' => 'Net valabelen Datebank-Typ',
 	'config-missing-db-name' => 'Dir musst en Numm fir de Wäert "Numm vun der Datebank" uginn',
 	'config-missing-db-host' => 'Dir musst e Wäert fir "Database host" uginn',
@@ -12047,7 +12438,7 @@ E gëtt fir den Numm vum SQLite Date-Fichier benotzt.',
 	'config-upgrade-done-no-regenerate' => "D'Aktualisatioun ass ofgeschloss.
 
 Dir kënnt elo [$1 ufänken Är Wiki ze benotzen]",
-	'config-regenerate' => '<code>LocalSettings.php</code> regeneréieren →',
+	'config-regenerate' => 'LocalSettings.php regeneréieren →',
 	'config-db-web-account' => 'Datebankkont fir den Accès iwwer de Web',
 	'config-db-web-account-same' => 'Dee selwechte Kont wéi bei der Installatioun benotzen',
 	'config-db-web-create' => 'De Kont uleeë wann et e net scho gëtt',
@@ -12074,18 +12465,18 @@ Dësen Numm gëtt da gebraucht fir sech an d\'Wiki anzeloggen.',
 Spezifizéiert en anere Benotzernumm.',
 	'config-admin-password-blank' => 'Gitt e Passwuert fir den Adminstateur-Kont an.',
 	'config-admin-password-same' => "D'Passwuert däerf net dat selwecht si wéi de Benotzernumm.",
-	'config-admin-password-mismatch' => 'Déi zwee Passwierder Déi dir aginn stëmmen net iwwerteneen.',
-	'config-admin-email' => 'E-Mailadress:',
+	'config-admin-password-mismatch' => 'Déi zwee Passwierder Déi Dir aginn hutt stëmmen net iwwereneen.',
+	'config-admin-email' => 'E-Mail-Adress:',
 	'config-admin-error-user' => 'Interne Feeler beim uleeë vun engem Administrateur mam Numm "<nowiki>$1</nowiki>".',
 	'config-admin-error-password' => 'Interne Feeler beim Setze vum Passwuert fir den Admin "<nowiki>$1</nowiki>": <pre>$2</pre>',
-	'config-admin-error-bademail' => 'Dir hutt eng E-Mailadress aginn déi net valabel ass',
+	'config-admin-error-bademail' => 'Dir hutt eng E-Mail-Adress aginn déi net valabel ass',
 	'config-subscribe' => "Sech op d'[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ukënnegunge vun neie Versiounen] abonnéieren.",
 	'config-almost-done' => "Dir sidd bal fäerdeg!
 Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki elo direkt installéieren.",
 	'config-optional-continue' => 'Stellt mir méi Froen.',
 	'config-optional-skip' => "Ech hunn es genuch, installéier just d'Wiki.",
 	'config-profile' => 'Profil vun de Benotzerrechter:',
-	'config-profile-wiki' => 'Traditionell Wiki', # Fuzzy
+	'config-profile-wiki' => 'Oppe Wiki',
 	'config-profile-no-anon' => 'Uleeë vun engem Benotzerkont verlaangt',
 	'config-profile-fishbowl' => 'Nëmmen autoriséiert Editeuren',
 	'config-profile-private' => 'Privat Wiki',
@@ -12101,39 +12492,45 @@ Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki el
 	'config-email-sender' => 'E-Mailadress fir Äntwerten:',
 	'config-upload-settings' => 'Eropgeluede Biller a Fichieren',
 	'config-upload-enable' => 'Eropluede vu Fichieren aschalten',
-	'config-upload-deleted' => 'Repertoire fir geläschte Fichieren:',
+	'config-upload-deleted' => 'Repertoire fir geläscht Fichieren:',
 	'config-logo' => 'URL vum Logo:',
 	'config-instantcommons' => '"Instant Commons" aktivéieren',
 	'config-cc-again' => 'Nach eng kéier eraussichen...',
 	'config-advanced-settings' => 'Erweidert Astellungen',
 	'config-extensions' => 'Erweiderungen',
 	'config-install-step-done' => 'fäerdeg',
-	'config-install-step-failed' => 'huet net fonctionnéiert',
+	'config-install-step-failed' => 'huet net funktionéiert',
 	'config-install-extensions' => 'Mat den Ereiderungen',
 	'config-install-database' => 'Datebank gëtt installéiert',
+	'config-install-pg-plpgsql' => 'No der Sprooch PL/pgSQL sichen',
 	'config-pg-no-plpgsql' => "Fir d'Datebank $1 muss d'Datebanksprooch PL/pgSQL installéiert ginn",
 	'config-install-user' => 'Datebank Benotzer uleeën',
 	'config-install-user-alreadyexists' => 'De Benotzer "$1" gëtt et schonn!',
-	'config-install-user-create-failed' => 'D\'Opmaache vum Benotzer "$1" huet net fonctionnéiert: $2',
+	'config-install-user-create-failed' => 'D\'Opmaache vum Benotzer "$1" huet net funktionéiert: $2',
+	'config-install-user-grant-failed' => 'D\'Bäisetze vu Rechter fir de Benotzer "$1" huet net funktionéiert: $2',
 	'config-install-user-missing' => 'De Benotzer "$1" deen ugi gouf gëtt et net.',
+	'config-install-user-missing-create' => 'De spezifizéierte Benotzer "$1" gëtt et net.
+Klickt d\'Checkbox "Benotzerkont uleeën" wann Dir dee Benotzer uleeë wëllt.',
 	'config-install-tables' => 'Tabelle ginn ugeluecht',
 	'config-install-interwiki' => 'Standard Interwiki-Tabell gëtt ausgefëllt',
 	'config-install-interwiki-list' => 'De Fichier <code>interwiki.list</code> gouf net fonnt.',
 	'config-install-stats' => 'Initialisatioun vun de Statistiken',
 	'config-install-keys' => 'Generéiere vum Geheimschlëssel',
 	'config-install-sysop' => 'Administrateur Benotzerkont gëtt ugeluecht',
+	'config-install-mainpage' => 'Haaptsäit mat Standard-Inhalt gëtt ugeluecht',
 	'config-install-extension-tables' => "D'Tabelle fir déi aktivéiert Erweiderunge ginn ugeluecht",
 	'config-install-mainpage-failed' => "D'Haaptsäit konnt net dragesat ginn: $1",
 	'config-download-localsettings' => '<code>LocalSettings.php</code> eroflueden',
 	'config-help' => 'Hëllef',
 	'config-nofile' => 'De Fichier "$1" gouf net fonnt. Gouf e geläscht?',
 	'mainpagetext' => "'''MediaWiki gouf installéiert.'''",
-	'mainpagedocfooter' => "Kuckt w.e.g. [//meta.wikimedia.org/wiki/Help:Contents d'Benotzerhandbuch] fir den Interface ze personnaliséieren.
+	'mainpagedocfooter' => "Kuckt w.e.g. [//meta.wikimedia.org/wiki/Help:Contents d'Benotzerhandbuch] fir Informatiounen iwwer de Gebruach vun der Wiki Software.
 
-== Starthëllefen ==
+== Fir  unzefänken ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Hëllef bei der Konfiguratioun]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]", # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokaliséiert MediaWiki fir Är Sprooch]",
 );
 
 /** Lingua Franca Nova (Lingua Franca Nova)
@@ -12146,7 +12543,7 @@ $messages['lfn'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustas de la desinia]
 * [//www.mediawiki.org/wiki/Manual:FAQ Demandas comun de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista per receta anunsias de novas supra MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista per receta anunsias de novas supra MediaWiki]', # Fuzzy
 );
 
 /** Ganda (Luganda)
@@ -12159,7 +12556,7 @@ $messages['lg'] = array(
 == Amagezi agakuyamba okutandika ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lukalala lw'eby'enteekateeka yo]
 * [//www.mediawiki.org/wiki/Manual:FAQ Ebiter'okubuuzibwa ku MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Wewandise ofunenga amawulire aga email ag'ebifa ku MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Wewandise ofunenga amawulire aga email ag'ebifa ku MediaWiki]", # Fuzzy
 );
 
 /** Limburgish (Limburgs)
@@ -12172,7 +12569,7 @@ $messages['li'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lies mit instellinge]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki VGV (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki mailinglies veur nuuj versies]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki mailinglies veur nuuj versies]", # Fuzzy
 );
 
 /** Lao (ລາວ)
@@ -12183,8 +12580,11 @@ $messages['lo'] = array(
 
 /** Lithuanian (lietuvių)
  * @author Eitvys200
+ * @author Mantak111
  */
 $messages['lt'] = array(
+	'config-desc' => 'MediaWiki diegimas',
+	'config-title' => 'MediaWiki $1 diegimas',
 	'config-information' => 'Informacija',
 	'config-your-language' => 'Jūsų kalba:',
 	'config-wiki-language' => 'Viki kalba:',
@@ -12192,6 +12592,8 @@ $messages['lt'] = array(
 	'config-continue' => 'Toliau →',
 	'config-page-language' => 'Kalba',
 	'config-page-welcome' => 'Sveiki atvykę į MediaWiki!',
+	'config-page-dbconnect' => 'Prisijungti prie duomenų bazės',
+	'config-page-dbsettings' => 'Duomenų bazės nustatymai',
 	'config-page-name' => 'Vardas',
 	'config-page-options' => 'Parinktys',
 	'config-page-install' => 'Įdiegti',
@@ -12201,13 +12603,22 @@ $messages['lt'] = array(
 	'config-page-copying' => 'Kopijuojama',
 	'config-page-upgradedoc' => 'Atnaujinama',
 	'config-restart' => 'Taip, paleiskite jį iš naujo',
+	'config-env-php' => 'PHP $1 yra įdiegtas.',
+	'config-env-php-toolow' => 'PHP $1 įdiegta.
+Tačiau, MediaWiki reikia PHP $2 ar naujesnės.',
+	'config-db-type' => 'Duomenų bazės tipas:',
+	'config-db-host' => 'Duomenų bazės serveris:',
+	'config-db-name' => 'Duomenų bazės pavadinimas:',
+	'config-db-name-oracle' => 'Duomenų bazės schema:',
+	'config-db-username' => 'Duomenų bazės vartotojo vardas:',
+	'config-db-password' => 'Duomenų bazės slaptažodis:',
 	'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
-	'config-type-ibm_db2' => 'IBM DB2',
+	'config-db-port' => 'Duomenų bazės prievadas:',
+	'config-db-schema' => 'MediaWiki schema:',
 	'config-header-mysql' => 'MySQL nustatymai',
 	'config-header-postgres' => 'PostgreSQL nustatymai',
 	'config-header-sqlite' => 'SQLite nustatymai',
 	'config-header-oracle' => 'Oracle nustatymai',
-	'config-header-ibm_db2' => 'IBM DB2 nustatymai',
 	'config-mysql-innodb' => 'InnoDB',
 	'config-mysql-myisam' => 'MyISAM',
 	'config-mysql-utf8' => 'UTF-8',
@@ -12216,6 +12627,7 @@ $messages['lt'] = array(
 	'config-project-namespace' => 'Projekto pavadinimas:',
 	'config-ns-generic' => 'Projektas',
 	'config-ns-site-name' => 'Toks pat kaip viki pavadinimas: $1',
+	'config-ns-other-default' => 'ManoWiki',
 	'config-admin-box' => 'Administratoriaus paskyra',
 	'config-admin-name' => 'Jūsų vardas:',
 	'config-admin-password' => 'Slaptažodis:',
@@ -12228,7 +12640,7 @@ $messages['lt'] = array(
 	'config-optional-continue' => 'Paklausti daugiau klausimų.',
 	'config-optional-skip' => 'Man jau nuobodu, tiesiog įdiekite viki.',
 	'config-profile' => 'Vartotojo teisių paskyra:',
-	'config-profile-wiki' => 'Tradicinė viki',
+	'config-profile-wiki' => 'Tradicinė viki', # Fuzzy
 	'config-profile-private' => 'Privati viki',
 	'config-license-pd' => 'Viešas Domenas',
 	'config-email-settings' => 'El. pašto nustatymai',
@@ -12239,7 +12651,25 @@ $messages['lt'] = array(
 	'config-install-step-done' => 'atlikta',
 	'config-install-step-failed' => 'nepavyko',
 	'config-install-schema' => 'Kuriama schema',
+	'config-install-tables' => 'Kuriamos lentelės',
+	'config-install-stats' => 'Inicijuojamos statistikos',
 	'config-install-keys' => 'Generuojami slapti raktai',
+	'config-install-done' => "'''Sveikiname!'''
+Jūs sėkmingai įdiegėte MediaWiki.
+
+Įdiegimo programa sukūrė <code>LocalSettings.php</code> failą.
+Jame yra visos jūsų konfigūracijos.
+
+Jums reikės atsisiųsti ir įdėti jį į savo wiki įdiegimo bazę (pačiame kataloge, kaip index.php). Atsisiuntimas turėtų prasidėti automatiškai.
+
+Jei atsisiuntimas nebuvo pasiūlytas, arba jį atšaukėte, galite iš naujo atsisiųsti paspaudę žemiau esančią nuorodą:
+
+$3
+
+'''Pastaba:''' Jei jūs to nepadarysite dabar, tada šis sukurtas konfigūracijos failas nebus galimas vėliau, jei išeisite iš įdiegimo be atsisiuntimo.
+
+Kai baigsite, jūs galėsite '''[$2 įeiti į savo wiki]'''.",
+	'config-download-localsettings' => 'Atsisiųsti <code>LocalSettings.php</code>',
 	'config-help' => 'pagalba',
 	'mainpagetext' => "'''MediaWiki sėkmingai įdiegta.'''",
 	'mainpagedocfooter' => 'Informacijos apie wiki programinės įrangos naudojimą, ieškokite [//meta.wikimedia.org/wiki/Help:Contents žinyne].
@@ -12275,7 +12705,7 @@ $messages['lv'] = array(
 == Pirmie soļi ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigurācijas iespēju saraksts]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki J&A]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Parakstīties uz paziņojumiem par jaunām MediaWiki versijām]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Parakstīties uz paziņojumiem par jaunām MediaWiki versijām]', # Fuzzy
 );
 
 /** Literary Chinese (文言)
@@ -12288,7 +12718,7 @@ $messages['lzh'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Lazuri (Lazuri)
@@ -12301,7 +12731,7 @@ $messages['lzz'] = array(
 == Ağani na gyoç’k’u maxmarepe ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Ok'iduşi ayarepeşi liste]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki P'anda Na-k'itxu K'itxalape]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-mailepeşiş liste]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-mailepeşiş liste]", # Fuzzy
 );
 
 /** Maithili (मैथिली)
@@ -12314,7 +12744,7 @@ $messages['mai'] = array(
 ==प्रारम्भ कोना करी==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Moksha (мокшень)
@@ -12327,7 +12757,7 @@ $messages['mdf'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Васьфневи арафнематнень кярькссь]
 * [//www.mediawiki.org/wiki/Manual:FAQ МедиаВикить Сидеста Кеподеви Кизефксне]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикить од верзиятнень колга кулянь пачфтема]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикить од верзиятнень колга кулянь пачфтема]', # Fuzzy
 );
 
 /** Malagasy (Malagasy)
@@ -12361,7 +12791,7 @@ $messages['mg'] = array(
 	'config-admin-name' => 'Ny anaranao :',
 	'config-admin-password' => 'Tenimiafina :',
 	'config-admin-email' => 'Adiresy imailaka :',
-	'config-profile-wiki' => 'Wiki tsotra',
+	'config-profile-wiki' => 'Wiki tsotra', # Fuzzy
 	'config-profile-no-anon' => 'Mila mamorona kaonty',
 	'config-profile-fishbowl' => 'Mpanova mahazo alalana ihany',
 	'config-profile-private' => 'Wiki tsy sarababem-bahoaka',
@@ -12385,7 +12815,7 @@ $messages['mg'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lisitra ny paramètre de configuration]
 * [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ momba ny MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Resaka momba ny fizaràn'ny MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Resaka momba ny fizaràn'ny MediaWiki]", # Fuzzy
 );
 
 /** Eastern Mari (олык марий)
@@ -12395,17 +12825,18 @@ $messages['mhr'] = array(
 );
 
 /** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
  * @author Luthfi94
  */
 $messages['min'] = array(
 	'mainpagetext' => "'''MediaWiki alah tapasang jo sukses'''.",
-	'mainpagedocfooter' => 'Silakan baco [//www.mediawiki.org/wiki/Help:Contents/id Panduan Pangguno] untuak caro panggunoan parangkaik lunak wiki iko.
+	'mainpagedocfooter' => 'Konsultasian [//meta.wikimedia.org/wiki/Help:Contents/min Panduan Panggunoan] untuak informasi caro panggunoan parangkaik lunak wiki.
 
 == Mamulai panggunoan ==
-
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings/id Dafta pangaturan konfigurasi]
-* [//www.mediawiki.org/wiki/Manual:FAQ/id Dafta patanyoan nan acok diajukan manganai MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]',
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings/id Daftar pangaturan konfigurasi]
+* [//www.mediawiki.org/wiki/Manual:FAQ/id Daftar patanyoan nan acok diajukan manganai MediaWiki]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Palokalan MediaWiki untuak bahaso Sanak]',
 );
 
 /** Macedonian (македонски)
@@ -12463,9 +12894,8 @@ $1',
 	'config-page-existingwiki' => 'Постоечко вики',
 	'config-help-restart' => 'Дали сакате да ги исчистите сите зачувани податоци што ги внесовте и да ја започнете инсталацијата одново?',
 	'config-restart' => 'Да, почни одново',
-	'config-welcome' => '=== Environmental checks ===
-Се вршат основни проверки за да се востанови дали околината е погодна за инсталирање на МедијаВики.
-Ако ви затреба помош при инсталацијата, ќе треба да ги наведете резултатите од овие проверки.',
+	'config-welcome' => '=== Проверки на околината ===
+Сега ќе се извршиме основни проверки за да се востанови дали околината е погодна за инсталирање на МедијаВики. Не заборавајте да ги приложите овие информации ако барате помош со довршување на инсталацијата.',
 	'config-copyright' => "=== Авторски права и услови ===
 
 $1
@@ -12536,6 +12966,10 @@ $1
 Ова е веројатно премалку.
 Инсталацијата може да не успее!",
 	'config-ctype' => "'''Фатална грешка''': PHP мора да се состави со поддршка за [http://www.php.net/manual/en/ctype.installation.php додатокот Ctype].",
+	'config-json' => "'''Кобно:''' PHP беше срочен без поддршка од JSON.
+Ќе мора да го инсталирате додатокот за JSON во PHP, или додатокот [http://pecl.php.net/package/jsonc PECL jsonc] пред да го инсталирате МедијаВики.
+* Додатокот за PHP е вклучен во верзиите 5 и 6 на Linux (од Red Hat Enterprise) (CentOS), но мора да се активира во <code>/etc/php.ini</code> или <code>/etc/php.d/json.ini</code>.
+* Некои варијанти на Linux излезени по мај 2013 г. не го содржат додатокот за PHP, туку го пакуваат додатокот PECL како <code>php5-json</code> или <code>php-pecl-jsonc</code>.",
 	'config-xcache' => '[http://xcache.lighttpd.net/ XCache] е инсталиран',
 	'config-apc' => '[http://www.php.net/apc APC] е инсталиран',
 	'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] е инсталиран',
@@ -12544,6 +12978,8 @@ $1
 	'config-mod-security' => "'''Предупредување''': на вашиот опслужувач има овозможено [http://modsecurity.org/ mod_security]. Ако не е поставено како што треба, ова може да предизвика проблеми кај МедијаВики и други програми што им овозможуваат на корисниците да објавуваат произволни содржини.
 Погледнете ја [http://modsecurity.org/documentation/ mod_security документацијата] или обратете се кај домаќинот ако наидете на случајни грешки.",
 	'config-diff3-bad' => 'GNU diff3 не е пронајден.',
+	'config-git' => 'Го пронајдов Git програмот за контрола на верзии: <code>$1</code>.',
+	'config-git-bad' => 'Не го пронајдов Git-програмот за контрола на верзии.',
 	'config-imagemagick' => 'Пронајден е ImageMagick: <code>$1</code>.
 Ако овозможите подигање, тогаш ќе биде овозможена минијатуризација на сликите.',
 	'config-gd' => 'Утврдив дека има вградена GD графичка библиотека.
@@ -12637,7 +13073,6 @@ $1
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'МедијаВики ги поддржува следниве системи на бази на податоци:
 
 $1
@@ -12647,18 +13082,16 @@ $1
 	'config-support-postgres' => '* $1 е популарен систем на бази на податоци со отворен код кој претставува алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php како да составите PHP со поддршка за PostgreSQL]). Може сè уште да има некои грешки. па затоа не се препорачува за употреба во производна средина.',
 	'config-support-sqlite' => '* $1 е лесен систем за бази на податоци кој е многу добро поддржан. ([http://www.php.net/manual/en/pdo.installation.php Како да составите PHP со поддршка за SQLite], користи PDO)',
 	'config-support-oracle' => '* $1 е база на податоци на комерцијално претпријатие. ([http://www.php.net/manual/en/oci8.installation.php Како да составите PHP со поддршка за OCI8])',
-	'config-support-ibm_db2' => '* $1 е комерцијална база на податоциза фирми. ([http://www.php.net/manual/en/ibm-db2.installation.php Како да составите PHP со поддршка за IBM DB2])',
 	'config-header-mysql' => 'Нагодувања на MySQL',
 	'config-header-postgres' => 'Нагодувања на PostgreSQL',
 	'config-header-sqlite' => 'Нагодувања на SQLite',
 	'config-header-oracle' => 'Нагодувања на Oracle',
-	'config-header-ibm_db2' => 'Нагодувања на IBM DB2',
 	'config-invalid-db-type' => 'Неважечки тип на база',
 	'config-missing-db-name' => 'Мора да внесете значење за параметарот „Име на базата“',
 	'config-missing-db-host' => 'Мора да внесете вредност за „Домаќин на базата на податоци“',
 	'config-missing-db-server-oracle' => 'Мора да внесете вредност за „TNS на базата“',
-	'config-invalid-db-server-oracle' => 'Неважечки TNS „$1“ за базата.
-Користете само знаци по ASCII - букви (a-z, A-Z), бројки (0-9), долни црти (_) и точки (.).',
+	'config-invalid-db-server-oracle' => 'Неважечки TNS „$1“.
+Користете или „TNS Name“ или низата „Easy Connect“ ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методи на именување за Oracle])',
 	'config-invalid-db-name' => 'Неважечко име на базата „$1“.
 Користете само ASCII-букви (a-z, A-Z), бројки (0-9), долни црти (_) и цртички (-).',
 	'config-invalid-db-prefix' => 'Неважечки префикс за базата „$1“.
@@ -12714,7 +13147,7 @@ chmod a+w $3</pre>',
 	'config-upgrade-done-no-regenerate' => 'Надградбата заврши.
 
 Сега можете да [$1 почнете да го користите викито].',
-	'config-regenerate' => 'Пресоздај <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Пресоздај LocalSettings.php →',
 	'config-show-table-status' => 'Барањето <code>SHOW TABLE STATUS</code> не успеа!',
 	'config-unknown-collation' => "'''Предупредување:''' Базата корисни непрепознаена упатна споредба.",
 	'config-db-web-account' => 'Сметка на базата за мрежен пристап',
@@ -12733,6 +13166,11 @@ chmod a+w $3</pre>',
 
 Ако вашата инсталација на MySQL поддржува InnoDB, тогаш сериозно препорачуваме да го користите него наместо MyISAM.
 Ако вашата инсталација на MySQL не поддржува InnoDB, веројатно дошло време за надградба.",
+	'config-mysql-only-myisam-dep' => "'''Предупредување:''' MyISAM е единствениот достапен складишен погон за MySQL, што не се препорачува за употреба со МедијаВики, бидејќи:
+* речиси не поддржува истовремено извршување на задачите поради заклучувањето на табелите
+* поподложен е на расипувања од другите погони
+* кодната база на МедијаВИки не секогаш работи исправно со MyISAM
+Вашата инсталација на MySQL не поддржува InnoDB. Можеби е време да ја надградите.",
 	'config-mysql-engine-help' => "'''InnoDB''' речиси секогаш е најдобар избор, бидејќи има добра поддршка за едновременост.
 
 '''MyISAM''' може да е побрз кај инсталациите наменети за само еден корисник или незаписни инсталации (само читање).
@@ -12744,7 +13182,6 @@ chmod a+w $3</pre>',
 Ова е поефикасно отколку  TF-8 режимот на MySQL, и ви овозможува да ја користите целата палета на уникодни знаци.
 
 Во '''UTF-8 режим''', MySQL ќе знае на кој збир знаци припаѓаат вашите податоци, и може соодветно да ги претстави и претвори, но нема да ви дозволи да складиратезнаци над [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Основната повеќејазична рамнина].",
-	'config-ibm_db2-low-db-pagesize' => "Вашата база на податоци DB2 има основно-зададен табеларен простор со недоволна големина на страниците. Таа треба да изнесува барем '''32 килобајти'''.",
 	'config-site-name' => 'Име на викито:',
 	'config-site-name-help' => 'Ова ќе се појавува во заглавната лента на прелистувачот и на разни други места.',
 	'config-site-name-blank' => 'Внесете име на мрежното место.',
@@ -12754,8 +13191,8 @@ chmod a+w $3</pre>',
 	'config-ns-other' => 'Друго (наведете)',
 	'config-ns-other-default' => 'МоеВики',
 	'config-project-namespace-help' => "По примерот на Википедија, многу викија ги чуваат страниците со правила на посебно место од самите содржини, т.е. во „'''проектен именски простор'''“.
-Сите наслови на страниците во овој именски простор почнуваат со извесен префикс, којшто можете да го укажете тука.
-По традиција префиксот произлегува од името на викито, но не смее да содржи интерпункциски знаци како „#“ или „:“.",
+Сите наслови на страниците во овој именски простор почнуваат со извесна претставка, којшто можете да го укажете тука.
+По традиција претставката произлегува од името на викито, но не смее да содржи интерпункциски знаци како „#“ или „:“.",
 	'config-ns-invalid' => 'Назначениот именски простор „<nowiki>$1</nowiki>“ е неважечки.
 Назначете друг проектен именски простор.',
 	'config-ns-conflict' => 'Наведениот именски простор „<nowiki>$1</nowiki>“ се коси со основниот именски простор на МедијаВики.
@@ -12851,8 +13288,9 @@ chmod a+w $3</pre>',
 	'config-upload-deleted-help' => 'Одберете во која папка да се архивираат избришаните податотеки.
 Најдобро би било ако таа не е достапна преку интернет.',
 	'config-logo' => 'URL за логото:',
-	'config-logo-help' => 'Матичното руво на МедијаВики има простор за лого од 135 x 160 пиксели над страничната лента.
-Подигнете слика со соодветна големина, и тука внесете ја URL-адресата.
+	'config-logo-help' => 'Матичното руво на МедијаВики има простор за лого од 135x160 пиксели над страничната лента.
+
+Можете да употребите <code>$wgStylePath</code> или <code>$wgScriptPath</code> ако вашето лого е релативно на тие патеки.
 
 Ако не сакате да имате лого, тогаш оставете го ова поле празно.',
 	'config-instantcommons' => 'Овозможи Instant Commons',
@@ -12947,6 +13385,9 @@ $3
 	'config-download-localsettings' => 'Преземи го <code>LocalSettings.php</code>',
 	'config-help' => 'помош',
 	'config-nofile' => 'Податотеката „$1“ не е пронајдена. Да не е избришана?',
+	'config-extension-link' => 'Дали сте знаеле дека вашето вики поддржува [//www.mediawiki.org/wiki/Manual:Extensions додатоци]?
+
+Можете да ги прелистате [//www.mediawiki.org/wiki/Category:Extensions_by_category по категории] или да ја посетите [//www.mediawiki.org/wiki/Extension_Matrix матрицата], каде ќе најдете полн список на додатоци.',
 	'mainpagetext' => "'''МедијаВики е успешно инсталиран.'''",
 	'mainpagedocfooter' => 'Погледнете го [//meta.wikimedia.org/wiki/Help:Contents Упатството за корисници] за подетални иформации како се користи вики-програмот.
 
@@ -13024,7 +13465,7 @@ $1
 	'config-connection-error' => '$1.
 
 താഴെ നൽകിയിരിക്കുന്ന ഹോസ്റ്റ്, ഉപയോക്തൃനാമം, രഹസ്യവാക്ക് എന്നിവ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.',
-	'config-regenerate' => '<code>LocalSettings.php</code> പുനഃസൃഷ്ടിക്കുക →',
+	'config-regenerate' => 'LocalSettings.php പുനഃസൃഷ്ടിക്കുക →',
 	'config-mysql-engine' => 'സ്റ്റോറേജ് എൻജിൻ:',
 	'config-site-name' => 'വിക്കിയുടെ പേര്:',
 	'config-site-name-help' => 'ഇത് ബ്രൗസറിന്റെ ടൈറ്റിൽ ബാറിലും മറ്റനേകം ഇടങ്ങളിലും പ്രദർശിപ്പിക്കപ്പെടും.',
@@ -13124,7 +13565,7 @@ $messages['mn'] = array(
 == Эхлэх ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Тохиргоо]
 * [//www.mediawiki.org/wiki/Manual:FAQ МедиаВикигийн тогтмол тавигддаг асуултууд]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикигийн мэдээний мэйл явуулах жагсаалт]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикигийн мэдээний мэйл явуулах жагсаалт]', # Fuzzy
 );
 
 /** Marathi (मराठी)
@@ -13137,7 +13578,7 @@ $messages['mr'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings कॉन्फिगरेशन सेटींगची यादी]
 * [//www.mediawiki.org/wiki/Manual:FAQ मीडियाविकी नेहमी विचारले जाणारे प्रश्न]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]', # Fuzzy
 );
 
 /** Malay (Bahasa Melayu)
@@ -13151,7 +13592,7 @@ $messages['ms'] = array(
 	'config-localsettings-key' => 'Kunci naik taraf:',
 	'config-localsettings-badkey' => 'Kunci yang anda berikan tidak betul.',
 	'config-session-error' => 'Ralat ketika memulakan sesi: $1',
-	'config-your-language' => 'Bahasa kamu:',
+	'config-your-language' => 'Bahasa anda:',
 	'config-your-language-help' => 'Pilihkan bahasa untuk digunakan dalam proses pemasangan ini.',
 	'config-wiki-language' => 'Bahasa wiki:',
 	'config-wiki-language-help' => 'Pilih bahasa utama wiki yang bakal dicipta ini.',
@@ -13178,12 +13619,10 @@ Bagaimanapun, MediaWiki memerlukan PHP $2 ke atas.',
 	'config-unicode-using-utf8' => 'utf8_normalize.so oleh Brion Vibber digunakan untuk penormalan Unicode.',
 	'config-unicode-using-intl' => '[http://pecl.php.net/intl Sambungan intl PECL] digunakan untuk penormalan Unicode.',
 	'config-db-charset' => 'Peranggu aksara pangkalan data',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-header-mysql' => 'Keutamaan MySQL',
 	'config-header-postgres' => 'Keutamaan PostgreSQL',
 	'config-header-sqlite' => 'Keutamaan SQLite',
 	'config-header-oracle' => 'Keutamaan Oracle',
-	'config-header-ibm_db2' => 'Keutamaan IBM DB2',
 	'config-invalid-db-type' => 'Jenis pangkalan data tidak sah',
 	'config-db-web-account-same' => 'Gunakan akaun yang sama seperti dalam pemasangan',
 	'config-db-web-create' => 'Ciptakan akaun jika belum wujud',
@@ -13225,11 +13664,12 @@ Bagaimanapun, MediaWiki memerlukan PHP $2 ke atas.',
 	'mainpagetext' => "'''MediaWiki telah berjaya dipasang.'''",
 	'mainpagedocfooter' => 'Sila rujuk [//meta.wikimedia.org/wiki/Help:Contents Panduan Penggunaan] untuk maklumat mengenai penggunaan perisian wiki ini.
 
-== Untuk bermula ==
+== Permulaan ==
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Senarai tetapan konfigurasi]
 * [//www.mediawiki.org/wiki/Manual:FAQ Soalan Lazim MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Senarai mel bagi keluaran MediaWiki]', # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Senarai surat keluaran MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Terjemahkan MediaWiki ke dalam bahasa anda]',
 );
 
 /** Maltese (Malti)
@@ -13376,10 +13816,10 @@ $messages['nan'] = array(
 == 入門 ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings 配置的設定]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki時常問答]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]', # Fuzzy
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Event
  * @author Nghtwlkr
  * @author 아라
@@ -13610,7 +14050,6 @@ Vurder å plassere databasen et helt annet sted, for eksempel i <code>/var/lib/m
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'MediaWiki støtter følgende databasesystem:
 
 $1
@@ -13620,12 +14059,10 @@ Hvis du ikke ser databasesystemet du prøver å bruke i listen nedenfor, følg i
 	'config-support-postgres' => '* $1 er et populært åpen kildekode-databasesystem som er et alternativ til MySQL ([http://www.php.net/manual/en/pgsql.installation.php hvordan kompilere PHP med PostgreSQL-støtte]). Det kan være noen små utestående feil og det anbefales ikke for bruk i et produksjonsmiljø.',
 	'config-support-sqlite' => '* $1 er et lettvekts-databasesystem som er veldig godt støttet. ([http://www.php.net/manual/en/pdo.installation.php hvordan kompilere PHP med SQLite-støtte], bruker PDO)',
 	'config-support-oracle' => '* $1 er en kommersiell bedriftsdatabase. ([http://www.php.net/manual/en/oci8.installation.php Hvordan kompilere PHP med OCI8-støtte])',
-	'config-support-ibm_db2' => '* $1 er en kommersiell bedriftsdatabase.', # Fuzzy
 	'config-header-mysql' => 'MySQL-innstillinger',
 	'config-header-postgres' => 'PostgreSQL-innstillinger',
 	'config-header-sqlite' => 'SQLite-innstillinger',
 	'config-header-oracle' => 'Oracle-innstillinger',
-	'config-header-ibm_db2' => 'IBM DB2-innstillinger',
 	'config-invalid-db-type' => 'Ugyldig databasetype',
 	'config-missing-db-name' => 'Du må skrive inn en verdi for «Databasenavn»',
 	'config-missing-db-host' => 'Du må skrive inn en verdi for «Databasevert»',
@@ -13687,7 +14124,7 @@ Dette er '''ikke anbefalt''' med mindre du har problemer med wikien din.",
 	'config-upgrade-done-no-regenerate' => 'Oppgradering fullført.
 
 Du kan nå [$1 begynne å bruke wikien din].',
-	'config-regenerate' => 'Regenerer <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Regenerer LocalSettings.php →',
 	'config-show-table-status' => '<code>SHOW TABLE STATUS</code> etterspørselen mislyktes!',
 	'config-unknown-collation' => "'''Advarsel:''' Databasen bruker en ukjent sortering.",
 	'config-db-web-account' => 'Databasekonto for nettilgang',
@@ -13711,7 +14148,6 @@ Dette er mer effektivt enn MySQLs UTF-8 modus og tillater deg å bruke hele spek
 
 I '''UTF-8 mode''' vil MySQL vite hvilket tegnsett dataene dine er i og kan presentere og konvertere det på en riktig måte,
 men det vil ikke la deg lagre tegn over «[//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes the Basic Multilingual Plane]».",
-	'config-ibm_db2-low-db-pagesize' => "DB2-databasen din har et standard tabellområde med en utilstrekkelig pagesize. Pagesize må være '''32K''' eller større.",
 	'config-site-name' => 'Navn på wiki:',
 	'config-site-name-help' => 'Dette vil vises i tittellinjen i nettleseren og diverse andre steder.',
 	'config-site-name-blank' => 'Skriv inn et nettstedsnavn.',
@@ -13842,14 +14278,20 @@ For mer informasjon om denne funksjonen, inklusive instruksjoner om hvordan man
 );
 
 /** Low German (Plattdüütsch)
+ * @author Joachim Mos
  */
 $messages['nds'] = array(
+	'config-page-name' => 'Naam',
+	'config-ns-generic' => 'Projekt',
+	'config-admin-name' => 'Dien Naam:',
+	'config-admin-password' => 'Passwoord:',
+	'config-help' => 'Hülp',
 	'mainpagetext' => "'''De MediaWiki-Software is mit Spood installeert worrn.'''",
 	'mainpagedocfooter' => 'Kiek de [//meta.wikimedia.org/wiki/MediaWiki_localisation Dokumentatschoon för dat Anpassen vun de Brukerböversiet]
-un dat [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Brukerhandbook] för Hülp to de Bruuk un Konfiguratschoon.',
+un dat [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Brukerhandbook] för Hülp to de Bruuk un Konfiguratschoon.', # Fuzzy
 );
 
-/** Nedersaksisch (Nedersaksisch)
+/** Low Saxon (Netherlands) (Nedersaksies)
  * @author Servien
  */
 $messages['nds-nl'] = array(
@@ -13859,7 +14301,8 @@ $messages['nds-nl'] = array(
 == Meer hulpe ==
 * [//www.mediawiki.org/wiki/Help:Configuration_settings Lieste mit instellingen]
 * [//www.mediawiki.org/wiki/Help:FAQ MediaWiki-vragen die vake esteld wörden]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-postlieste veur nieje versies]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-postlieste veur nieje versies]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Maak MediaWiki beschikbaor in joew taal]',
 );
 
 /** Nepali (नेपाली)
@@ -13873,7 +14316,7 @@ $messages['ne'] = array(
 == सुरू गर्नको लागि  ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings विन्यास सेटिङ्ग सूची]
 * [//www.mediawiki.org/wiki/Manual:FAQ मेडियाविकि सामान्य प्रश्नका उत्तरहरु]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मेडियाविकि सुचना मेलिङ्ग सूची]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मेडियाविकि सुचना मेलिङ्ग सूची]', # Fuzzy
 );
 
 /** Dutch (Nederlands)
@@ -14018,6 +14461,8 @@ Het cachen van objecten is niet ingeschakeld.",
 	'config-mod-security' => "'''Waarschuwing:''' uw webserver heeft de module [http://modsecurity.org/ mod_security] ingeschakeld. Als deze onjuist is ingesteld, kan dit problemen geven in combinatie met MediaWiki of andere software die gebruikers in staat stelt willekeurige inhoud te posten.
 Lees de [http://modsecurity.org/documentation/ documentatie over mod_security] of neem contact op met de helpdesk van uw provider als u tegen problemen aanloopt.",
 	'config-diff3-bad' => 'GNU diff3 niet aangetroffen.',
+	'config-git' => 'Versiecontrolesoftware git is aangetroffen: <code>$1</code>',
+	'config-git-bad' => 'Geen git versiecontrolesoftware aangetroffen.',
 	'config-imagemagick' => 'ImageMagick aangetroffen: <code>$1</code>.
 Het aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als u uploaden inschakelt.',
 	'config-gd' => 'Ingebouwde GD grafische bibliotheek aangetroffen.
@@ -14115,7 +14560,6 @@ Overweeg om de database op een totaal andere plaats neer te zetten, bijvoorbeeld
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'MediaWiki ondersteunt de volgende databasesystemen:
 
 $1
@@ -14125,18 +14569,16 @@ Als u het databasesysteem dat u wilt gebruiken niet in de lijst terugvindt, volg
 	'config-support-postgres' => '* $1 is een populair open source databasesysteem als alternatief voor MySQL ([http://www.php.net/manual/en/pgsql.installation.php hoe PHP gecompileerd moet zijn met ondersteuning voor PostgreSQL]). Het is mogelijk dat er een aantal bekende problemen zijn met MediaWiki in combinatie met deze database en daarom wordt PostgreSQL niet aanbevolen voor een productieomgeving.',
 	'config-support-sqlite' => '* $1 is een zeer goed ondersteund lichtgewicht databasesysteem ([http://www.php.net/manual/en/pdo.installation.php hoe PHP gecompileerd zijn met ondersteuning voor SQLite]; gebruikt PDO)',
 	'config-support-oracle' => '* $1 is een commerciële data voor grote bedrijven ([http://www.php.net/manual/en/oci8.installation.php PHP compileren met ondersteuning voor OCI8]).',
-	'config-support-ibm_db2' => '* $1 is een commerciële enterprisedatabase. ([http://www.php.net/manual/en/ibm-db2.installation.php Hoe PHP compolieren met ondersteuning voor IBM DB2])',
 	'config-header-mysql' => 'MySQL-instellingen',
 	'config-header-postgres' => 'PostgreSQL-instellingen',
 	'config-header-sqlite' => 'SQLite-instellingen',
 	'config-header-oracle' => 'Oracle-instellingen',
-	'config-header-ibm_db2' => 'Instellingen voor IBM DB2',
 	'config-invalid-db-type' => 'Ongeldig databasetype',
-	'config-missing-db-name' => 'U moet een waarde ingeven voor "Databasenaam"',
+	'config-missing-db-name' => 'U moet een waarde opgeven voor "Databasenaam"',
 	'config-missing-db-host' => 'U moet een waarde invoeren voor "Databaseserver"',
-	'config-missing-db-server-oracle' => 'U moet een waarde voor "Database-TNS" ingeven',
-	'config-invalid-db-server-oracle' => 'Ongeldige database-TMS "$1".
-Gebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_).',
+	'config-missing-db-server-oracle' => 'U moet een waarde opgeven voor "Database-TNS"',
+	'config-invalid-db-server-oracle' => 'Ongeldige database-TNS "$1".
+Gebruik "TNS Names" of een "Easy Connect" tekst ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle naamgevingsmethoden])',
 	'config-invalid-db-name' => 'Ongeldige databasenaam "$1".
 Gebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_) en streepjes (-).',
 	'config-invalid-db-prefix' => 'Ongeldig databasevoorvoegsel "$1".
@@ -14194,7 +14636,7 @@ Dit is '''niet aan te raden''' tenzij u problemen hebt met uw wiki.",
 	'config-upgrade-done-no-regenerate' => 'Het bijwerken is afgerond.
 
 U kunt nu [$1 uw wiki gebruiken].',
-	'config-regenerate' => '<code>LocalSettings.php</code> opnieuw aanmaken →',
+	'config-regenerate' => 'LocalSettings.php opnieuw aanmaken →',
 	'config-show-table-status' => 'Het uitvoeren van <code>SHOW TABLE STATUS</code> is mislukt!',
 	'config-unknown-collation' => "'''Waarschuwing:''' de database gebruikt een collatie die niet wordt herkend.",
 	'config-db-web-account' => 'Databasegebruiker voor webtoegang',
@@ -14213,6 +14655,12 @@ De gebruiker die u hier opgeeft moet al bestaan.',
 
 Als uw installatie van MySQL InnoDB ondersteunt, gebruik dat dan vooral.
 Als uw installatie van MySQL geen ondersteuning heeft voor InnoDB, denk dan na over upgraden.",
+	'config-mysql-only-myisam-dep' => "'''Waarschuwing:''' MyISAM is enige beschikbare opslagmethode voor MySQL, en deze wordt niet aangeraden voor gebruik met MediaWiki, omdat:
+* er nauwelijks ondersteuning is voor meerdere gelijktijdige transacties omdat tabellen op slot gezet worden;
+* tabellen makkelijker stuk kunnen gaan;
+* de code van MediaWiki niet altijd op de juiste wijze omgaat met MyISAM.
+
+Uw installatie van MySQL heeft geen ondersteuning voor InnoDB. We raden u aan om een meer recente versie te gebruiken.",
 	'config-mysql-engine-help' => "'''InnoDB''' is vrijwel altijd de beste instelling, omdat deze goed omgaat met meerdere verzoeken tegelijkertijd.
 
 '''MyISAM''' is bij een zeer beperkt aantal gebruikers mogelijk sneller, of als de wiki alleen-lezen is.
@@ -14225,7 +14673,6 @@ Dit is efficiënter dan de UTF-8-modus van MySQL en stelt u in staat de volledig
 
 In '''UTF-8-modus''' kent MySQL de tekenset van uw gegevens en kan de databaseserver ze juist weergeven en converteren.
 Het is dat niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
-	'config-ibm_db2-low-db-pagesize' => "Uw DB2-database heeft een standaard tablespace met een onvoldoende grote pagesize. De pagesize moet tenminste '''32K''' zijn.",
 	'config-site-name' => 'Naam van de wiki:',
 	'config-site-name-help' => 'Deze naam verschijnt in de titelbalk van browsers en op andere plaatsen.',
 	'config-site-name-blank' => 'Geef een naam op voor de site.',
@@ -14235,11 +14682,11 @@ Het is dat niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Li
 	'config-ns-other' => 'Andere (geef aan welke)',
 	'config-ns-other-default' => 'MijnWiki',
 	'config-project-namespace-help' => "In het kielzog van Wikipedia beheren veel wiki's hun beleidspagina's apart van hun inhoudelijke pagina's in een \"'''projectnaamruimte'''\".
-Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat u hier kunt aangeven.
+Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat u hier kunt opgeven.
 Dit voorvoegsel wordt meestal afgeleid van de naam van de wiki, maar het kan geen bijzondere tekens bevatten als \"#\" of \":\".",
-	'config-ns-invalid' => 'De aangegeven naamruimte "<nowiki>$1</nowiki>" is ongeldig.
+	'config-ns-invalid' => 'De opgegeven naamruimte "<nowiki>$1</nowiki>" is ongeldig.
 Geef een andere naamruimte op.',
-	'config-ns-conflict' => 'De aangegeven naamruimte "<nowiki>$1</nowiki>" conflicteert met een standaard naamruimte in MediaWiki.
+	'config-ns-conflict' => 'De opgegeven naamruimte "<nowiki>$1</nowiki>" conflicteert met een standaard naamruimte in MediaWiki.
 Geef een andere naam op voor de projectnaamruimte.',
 	'config-admin-box' => 'Beheerdersgebruiker',
 	'config-admin-name' => 'Uw naam:',
@@ -14335,6 +14782,8 @@ Idealiter is deze map niet via het web te benaderen.',
 	'config-logo-help' => 'Het standaarduiterlijk van MediaWiki bevat ruimte voor een logo van 135x160 pixels boven het menu.
 Upload een afbeelding met de juiste afmetingen en voer de URL hier in.
 
+U kunt <code>$wgStylePath</code> of <code>$wgScriptPath</code> gebruiken als uw logo relatief is aan een van deze paden.
+
 Als u geen logo wilt gebruiken, kunt u dit veld leeg laten.',
 	'config-instantcommons' => 'Instant Commons inschakelen',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] is functie die het mogelijk maakt om afbeeldingen, geluidsbestanden en andere mediabestanden te gebruiken van de website [//commons.wikimedia.org/ Wikimedia Commons].
@@ -14344,7 +14793,7 @@ Meer informatie over deze functie en hoe deze in te stellen voor andere wiki\'s
 	'config-cc-error' => 'De licentiekiezer van Creative Commons heeft geen resultaat opgeleverd.
 Voer de licentie handmatig in.',
 	'config-cc-again' => 'Opnieuw kiezen...',
-	'config-cc-not-chosen' => 'Kies alstublieft de Creative Commonslicentie die u wilt gebruiken en klik op "doorgaan".',
+	'config-cc-not-chosen' => 'Kies de Creative Commonslicentie die u wilt gebruiken en klik op "doorgaan".',
 	'config-advanced-settings' => 'Gevorderde instellingen',
 	'config-cache-options' => 'Instellingen voor het cachen van objecten:',
 	'config-cache-help' => 'Het cachen van objecten wordt gebruikt om de snelheid van MediaWiki te verbeteren door vaak gebruikte gegevens te bewaren.
@@ -14369,7 +14818,7 @@ De standaardpoort is 11211.',
 
 Mogelijk moet u aanvullende instellingen maken, maar u kunt deze uitbreidingen nu inschakelen.',
 	'config-install-alreadydone' => "'''Waarschuwing:''' het lijkt alsof u MediaWiki al hebt geïnstalleerd en probeert het programma opnieuw te installeren.
-Ga alstublieft door naar de volgende pagina.",
+Ga door naar de volgende pagina.",
 	'config-install-begin' => 'Als u nu op "{{int:config-continue}}" klikt, begint de installatie van MediaWiki.
 Als u nog wijzigingen wilt maken, klik dan op "{{int:config-back}}".',
 	'config-install-step-done' => 'afgerond',
@@ -14431,6 +14880,8 @@ Na het plaatsen van het bestand met instellingen kunt u '''[$2 uw wiki betreden]
 	'config-download-localsettings' => '<code>LocalSettings.php</code> downloaden',
 	'config-help' => 'hulp',
 	'config-nofile' => 'Het bestand "$1" is niet gevonden. Is het verwijderd?',
+	'config-extension-link' => 'Weet u dat u [//www.mediawiki.org/wiki/Manual:Extensions uitbreidingen] kunt gebruiken voor uw wiki?
+U kunt [//www.mediawiki.org/wiki/Category:Extensions_by_category uitbreidingen op categorie] bekijken of ga naar de [//www.mediawiki.org/wiki/Extension_Matrix Uitbreidingenmatrix] om de volledige lijst met uitbreidingen te bekijken.',
 	'mainpagetext' => "'''De installatie van MediaWiki is geslaagd.'''",
 	'mainpagedocfooter' => 'Raadpleeg de [//meta.wikimedia.org/wiki/NL_Help:Inhoudsopgave handleiding] voor informatie over het gebruik van de wikisoftware.
 
@@ -14564,9 +15015,9 @@ Overweeg om de database op een totaal andere plaats neer te zetten, bijvoorbeeld
 $1
 
 Als je het databasesysteem dat je wilt gebruiken niet in de lijst terugvindt, volg dan de handleiding waarnaar hierboven wordt verwezen om ondersteuning toe te voegen.',
-	'config-missing-db-name' => 'Je moet een waarde ingeven voor "Databasenaam"',
+	'config-missing-db-name' => 'Je moet een waarde opgeven voor "Databasenaam"',
 	'config-missing-db-host' => 'Je moet een waarde invoeren voor "Databaseserver"',
-	'config-missing-db-server-oracle' => 'Je moet een waarde voor "Database-TNS" ingeven',
+	'config-missing-db-server-oracle' => 'Je moet een waarde opgeven voor "Database-TNS"',
 	'config-postgres-old' => 'PostgreSQL $1 of hoger is vereist.
 Jij gebruikt $2.',
 	'config-sqlite-name-help' => 'Kies een naam die je wiki identificeert.
@@ -14595,9 +15046,8 @@ Dit is efficiënter dan de UTF-8-modus van MySQL en stelt je in staat de volledi
 
 In '''UTF-8-modus''' kent MySQL de tekenset van je gegevens en kan de databaseserver ze juist weergeven en converteren.
 Het is dat niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
-	'config-ibm_db2-low-db-pagesize' => "Je DB2-database heeft een standaard tablespace met een onvoldoende grote pagesize. De pagesize moet tenminste '''32K''' zijn.",
 	'config-project-namespace-help' => "In het kielzog van Wikipedia beheren veel wiki's hun beleidspagina's apart van hun inhoudelijke pagina's in een \"'''projectnaamruimte'''\".
-Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat je hier kunt aangeven.
+Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat je hier kunt opgeven.
 Dit voorvoegsel wordt meestal afgeleid van de naam van de wiki, maar het kan geen bijzondere tekens bevatten als \"#\" of \":\".",
 	'config-admin-name' => 'Je naam:',
 	'config-admin-password-mismatch' => 'De twee door jou ingevoerde wachtwoorden komen niet overeen.',
@@ -14641,8 +15091,8 @@ Daarmee wordt deze functie ingeschakeld.",
 	'config-logo-help' => 'Het standaarduiterlijk van MediaWiki bevat ruimte voor een logo van 135x160 pixels boven het menu.
 Upload een afbeelding met de juiste afmetingen en voer de URL hier in.
 
-Als je geen logo wilt gebruiken, kan je dit veld leeg laten.',
-	'config-cc-not-chosen' => 'Kies alsjeblieft de Creative Commonslicentie die je wilt gebruiken en klik op "doorgaan".',
+Als je geen logo wilt gebruiken, kan je dit veld leeg laten.', # Fuzzy
+	'config-cc-not-chosen' => 'Kies de Creative Commonslicentie die je wilt gebruiken en klik op "doorgaan".',
 	'config-memcache-needservers' => 'Je hebt Memcached geselecteerd als je cache, maar je hebt geen servers opgegeven.',
 	'config-memcache-badip' => 'Je hebt een ongeldig IP-adres ingevoerd voor Memcached: $1.',
 	'config-memcache-noport' => 'Je hebt geen poort opgegeven voor de Memcachedserver: $1.
@@ -14651,7 +15101,7 @@ De standaardpoort is 11211.',
 
 Mogelijk moet je aanvullende instellingen maken, maar je kunt deze uitbreidingen nu inschakelen.',
 	'config-install-alreadydone' => "'''Waarschuwing:''' het lijkt alsof je MediaWiki al hebt geïnstalleerd en probeert het programma opnieuw te installeren.
-Ga alsjeblieft door naar de volgende pagina.",
+Ga door naar de volgende pagina.",
 	'config-install-begin' => 'Als je nu op "{{int:config-continue}}" klikt, begint de installatie van MediaWiki.
 Als je nog wijzigingen wilt maken, klik dan op "Terug".', # Fuzzy
 	'config-pg-no-plpgsql' => 'Je moet de taal PL/pgSQL installeren in de database $1',
@@ -14688,7 +15138,7 @@ Na het plaatsen van het bestand met instellingen kan je '''[$2 je wiki betreden]
 * [//www.mediawiki.org/wiki/Localisation#Translation_resources Maak MediaWiki beschikbaar in jouw taal]',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Harald Khan
  * @author Nghtwlkr
  */
@@ -14735,7 +15185,7 @@ Berre bruk ASCII-bokstavar (a-z, A-Z), tal (0-9) og undestrekar (_).',
 ==Kome i gang==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste over oppsettsinnstillingar]
 * [//www.mediawiki.org/wiki/Manual:FAQ Spørsmål og svar om MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postliste med informasjon om nye MediaWiki-versjonar]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postliste med informasjon om nye MediaWiki-versjonar]', # Fuzzy
 );
 
 /** Norwegian (bokmål)‬ (‪norsk (bokmål)‬) */
@@ -14744,8 +15194,61 @@ $messages['no'] = array(
 );
 
 /** Occitan (occitan)
+ * @author Cedric31
  */
 $messages['oc'] = array(
+	'config-desc' => 'Lo programa d’installacion de MediaWiki',
+	'config-title' => 'Installacion de MediaWiki $1',
+	'config-information' => 'Informacions',
+	'config-localsettings-key' => 'Clau de mesa a jorn :',
+	'config-localsettings-badkey' => "La clau qu'avètz provesida es incorrècta",
+	'config-session-error' => "Error al moment de l'aviada de la sesilha : $1",
+	'config-your-language' => 'Vòstra lenga :',
+	'config-wiki-language' => 'Lenga del wiki :',
+	'config-back' => '← Retorn',
+	'config-continue' => 'Contunhar →',
+	'config-page-language' => 'Lenga',
+	'config-page-welcome' => 'Benvenguda sus MediaWiki !',
+	'config-page-dbconnect' => 'Se connectar a la banca de donadas',
+	'config-page-dbsettings' => 'Paramètres de la banca de donadas',
+	'config-page-name' => 'Nom',
+	'config-page-options' => 'Opcions',
+	'config-page-install' => 'Installar',
+	'config-page-complete' => 'Acabat !',
+	'config-page-restart' => 'Reaviar l’installacion',
+	'config-page-readme' => 'Legissètz-me',
+	'config-page-releasenotes' => 'Nòtas de version',
+	'config-page-copying' => 'Còpia',
+	'config-page-upgradedoc' => 'Mesa a jorn',
+	'config-page-existingwiki' => 'Wiki existent',
+	'config-restart' => 'Òc, lo reaviar',
+	'config-env-php' => 'PHP $1 es installat.',
+	'config-db-host-oracle' => 'Nom TNS de la banca de donadas :',
+	'config-db-wiki-settings' => 'Identificar aqueste wiki',
+	'config-db-name' => 'Nom de la banca de donadas :',
+	'config-db-name-oracle' => 'Esquèma de banca de donadas :',
+	'config-db-install-account' => "Compte d'utilizaire per l'installacion",
+	'config-db-username' => "Nom d'utilizaire de la banca de donadas :",
+	'config-db-password' => 'Senhal de la banca de donadas :',
+	'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binari',
+	'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+	'config-charset-mysql4' => 'MySQL 4.0 retrocompatible UTF-8',
+	'config-db-port' => 'Pòrt de la banca de donadas :',
+	'config-db-schema' => 'Esquèma per MediaWiki',
+	'config-header-mysql' => 'Paramètres de MySQL',
+	'config-header-postgres' => 'Paramètres de PostgreSQL',
+	'config-header-sqlite' => 'Paramètres de SQLite',
+	'config-header-oracle' => 'Paramètres d’Oracle',
+	'config-mysql-engine' => "Motor d'emmagazinatge :",
+	'config-mysql-innodb' => 'InnoDB',
+	'config-mysql-myisam' => 'MyISAM',
+	'config-mysql-binary' => 'Binari',
+	'config-mysql-utf8' => 'UTF-8',
+	'config-site-name' => 'Nom del wiki :',
+	'config-ns-generic' => 'Projècte',
+	'config-ns-other-default' => 'MonWiki',
+	'config-admin-name' => 'Vòstre nom :',
+	'config-admin-password' => 'Senhal :',
 	'mainpagetext' => "'''MediaWiki es estat installat amb succès.'''",
 	'mainpagedocfooter' => "Consultatz lo [//meta.wikimedia.org/wiki/Ajuda:Contengut Guida de l'utilizaire] per mai d'entresenhas sus l'utilizacion d'aqueste logicial.
 
@@ -14753,10 +15256,10 @@ $messages['oc'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista dels paramètres de configuracion]
 * [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussions de las parucions de MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussions de las parucions de MediaWiki]", # Fuzzy
 );
 
-/** Oriya (ଓଡ଼ିଆ)
+/** Oriya (ଓଡ଼ିଆ)
  * @author Jnanaranjan Sahu
  */
 $messages['or'] = array(
@@ -14791,7 +15294,7 @@ $messages['pam'] = array(
 == Pamagumpisa ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Picard (Picard)
@@ -14815,13 +15318,16 @@ $messages['pdc'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lischt vun Gnepp zum Konfiguriere]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Eposchde-Lischt fer neie MediaWiki-Versione]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Eposchde-Lischt fer neie MediaWiki-Versione]", # Fuzzy
 );
 
 /** Polish (polski)
  * @author Beau
  * @author BeginaFelicysym
+ * @author Chrumps
  * @author Holek
+ * @author Matma Rex
+ * @author Michał Roszka
  * @author Saper
  * @author Sp5uhe
  * @author Woytecr
@@ -14880,8 +15386,8 @@ Sprawdź plik php.ini i upewnij się, że <code>session.save_path</code> wskazuj
 	'config-help-restart' => 'Czy chcesz usunąć wszystkie zapisane dane i uruchomić ponownie proces instalacji?',
 	'config-restart' => 'Tak, zacznij od nowa',
 	'config-welcome' => '=== Sprawdzenie środowiska instalacji ===
-Wykonywane są podstawowe testy sprawdzające czy to środowisko jest odpowiednie dla instalacji MediaWiki.
-Jeśli potrzebujesz pomocy podczas instalacji załącz wyniki tych testów.',
+Teraz zostaną wykonane podstawowe testy sprawdzające czy to środowisko jest odpowiednie dla instalacji MediaWiki.
+Jeśli potrzebujesz pomocy podczas instalacji, załącz wyniki tych testów.',
 	'config-copyright' => "=== Prawa autorskie i warunki użytkowania ===
 
 $1
@@ -14958,8 +15464,10 @@ Instalacja może się nie udać!",
 	'config-mod-security' => "''' Ostrzeżenie ''': Serwer sieci web ma włączone [http://modsecurity.org/ mod_security]. Jeśli niepoprawnie skonfigurowane, może być przyczyną problemów MediaWiki lub innego oprogramowania, które pozwala użytkownikom na wysyłanie dowolnej zawartości.
 Sprawdź w [http://modsecurity.org/documentation/ dokumentacji mod_security] lub skontaktuj się z obsługa hosta, jeśli wystąpią losowe błędy.",
 	'config-diff3-bad' => 'Nie znaleziono GNU diff3.',
+	'config-git' => 'Znaleziono oprogramowanie kontroli wersji Git: <code>$1</code>.',
+	'config-git-bad' => 'Oprogramowanie systemu kontroli wersji Git nie zostało znalezione.',
 	'config-imagemagick' => 'Mamy zainstalowany ImageMagick <code>$1</code>, dzięki czemu będzie można pomniejszać załadowane grafiki.',
-	'config-gd' => 'Mamy wbudowaną bibliotekę graficzną GD, dzięki ceymu będzie można pomniejszać załadowane grafiki.',
+	'config-gd' => 'Mamy wbudowaną bibliotekę graficzną GD, dzięki czemu będzie można pomniejszać załadowane grafiki.',
 	'config-no-scaling' => 'Nie można odnaleźć biblioteki GD lub ImageMagick. Nie będzie działać pomniejszanie załadowane grafiki.',
 	'config-no-uri' => "'''Błąd.''' Nie można określić aktualnego URI.
 Instalacja została przerwana.",
@@ -14976,7 +15484,8 @@ Instalacja została przerwana.',
 	'config-using531' => 'MediaWiki nie może być używane z PHP $1 z powodu błędu dotyczącego referencyjnych argumentów funkcji <code>__call()</code>.
 Uaktualnij do PHP 5.3.2 lub nowszego. Możesz również cofnąć wersję do PHP 5.3.0, aby naprawić ten błąd.
 Instalacja została przerwana.',
-	'config-suhosin-max-value-length' => 'Jest zainstalowany Suhosin i ogranicza długość parametru GET do $1  bajtów. Komponent ResourceLoader w MediaWiki  wykona obejście tego ograniczenia, ale kosztem wydajności. Jeśli to możliwe należy ustawić <code>suhosin.get.max_value_length</code> na 1024 lub wyższej w <code>php.ini</code> oraz ustawić <code>$wgResourceLoaderMaxQueryLength</code> w LocalSettings.php na tę samą wartość.', # Fuzzy
+	'config-suhosin-max-value-length' => 'Jest zainstalowany Suhosin i ogranicza długość parametru GET <code>length</code> do $1 bajtów. Komponent ResourceLoader w MediaWiki wykona obejście tego ograniczenia, ale kosztem wydajności.
+Jeśli to możliwe, należy ustawić <code>suhosin.get.max_value_length</code> na 1024 lub wyżej w <code>php.ini</code> oraz ustawić <code>$wgResourceLoaderMaxQueryLength</code> w <code>LocalSettings.php</code> na tę samą wartość.',
 	'config-db-type' => 'Typ bazy danych',
 	'config-db-host' => 'Adres serwera bazy danych',
 	'config-db-host-help' => 'Jeśli serwer bazy danych jest na innej maszynie, wprowadź jej nazwę domenową lub adres IP.
@@ -15048,7 +15557,6 @@ Zawiera ona nieopracowane dane użytkownika (adresy e-mail, zahaszowane hasła)
 Warto rozważyć umieszczenie w bazie danych zupełnie gdzie indziej, na przykład w <code>/var/lib/mediawiki/yourwiki</code> .",
 	'config-oracle-def-ts' => 'Domyślna przestrzeń tabel',
 	'config-oracle-temp-ts' => 'Przestrzeń tabel tymczasowych',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'MediaWiki może współpracować z następującymi systemami baz danych:
 
 $1
@@ -15058,18 +15566,16 @@ Poniżej wyświetlone są systemy baz danych gotowe do użycia. Jeżeli poniżej
 	'config-support-postgres' => '* $1 jest popularnym systemem baz danych, często stosowanym zamiast MySQL  ([http://www.php.net/manual/en/pgsql.installation.php Zobacz, jak skompilować PHP ze wsparciem dla PostgreSQL]). Z powodu możliwości wystąpienia drobnych błędów, nie jest zalecana do wymagających wdrożeń.',
 	'config-support-sqlite' => '* $1 jest niewielkim systemem bazy danych, z którym MediaWiki bardzo dobrze współpracuje. ([http://www.php.net/manual/en/pdo.installation.php Jak skompilować PHP ze wsparciem dla SQLite], korzystając z PDO)',
 	'config-support-oracle' => '* $1 jest komercyjną profesjonalną bazą danych. ([http://www.php.net/manual/en/oci8.installation.php Jak skompilować PHP ze wsparciem dla OCI8])',
-	'config-support-ibm_db2' => '* $1 jest komercyjną zaawansowaną bazą danych.', # Fuzzy
 	'config-header-mysql' => 'Ustawienia MySQL',
 	'config-header-postgres' => 'Ustawienia PostgreSQL',
 	'config-header-sqlite' => 'Ustawienia SQLite',
 	'config-header-oracle' => 'Ustawienia Oracle',
-	'config-header-ibm_db2' => 'ustawienia dla IBM DB2',
 	'config-invalid-db-type' => 'Nieprawidłowy typ bazy danych',
 	'config-missing-db-name' => 'Należy wpisać wartość w polu „Nazwa bazy danych”',
 	'config-missing-db-host' => 'Musisz wpisać wartość w polu „Serwer bazy danych”',
 	'config-missing-db-server-oracle' => 'Należy wpisać wartość w polu „Nazwa instancji bazy danych (TNS)”',
 	'config-invalid-db-server-oracle' => 'Nieprawidłowa nazwa instancji bazy danych (TNS) „$1”.
-W nazwie można użyć wyłącznie liter ASCII (a-z, A-Z), cyfr (0-9), podkreślenia (_) i kropek (.).',
+Użyj "TNS Name" lub "Easy Connect" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])',
 	'config-invalid-db-name' => 'Nieprawidłowa nazwa bazy danych „$1”.
 Używaj wyłącznie liter ASCII (a-z, A-Z), cyfr (0-9), podkreślenia (_) lub znaku odejmowania (-).',
 	'config-invalid-db-prefix' => 'Nieprawidłowy prefiks bazy danych „$1”.
@@ -15125,7 +15631,7 @@ Jest to '''nie zalecane''', chyba że występują problemy z twoją wiki.",
 	'config-upgrade-done-no-regenerate' => 'Aktualizacja zakończona.
 
 Możesz wreszcie [$1 zacząć korzystać ze swojej wiki].',
-	'config-regenerate' => 'Ponowne generowanie <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Ponowne generowanie LocalSettings.php →',
 	'config-show-table-status' => 'Zapytanie „<code>SHOW TABLE STATUS</code>” nie powiodło się!',
 	'config-unknown-collation' => "'''Uwaga''' – bazy danych używa nierozpoznanej metody porównywania.",
 	'config-db-web-account' => 'Konto bazy danych dla dostępu przez WWW',
@@ -15144,6 +15650,12 @@ Konto, które wskazałeś tutaj musi już istnieć.',
 
 Jeśli instalacja MySQL obsługuje InnoDB, jest wysoce zalecane, by to je wybrać.
 Jeśli instalacja MySQL nie obsługuje InnoDB, być może nadszedł czas na jej uaktualnienie.",
+	'config-mysql-only-myisam-dep' => "'''Ostrzeżenie:''' MyISAM jest jedynym dostępnym mechanizmem składowania dla MySQL, który nie jest zalecany do używania z MediaWiki, ponieważ:
+* słabo obsługuje współbieżność z powodu blokowania tabel
+* jest bardziej skłonny do uszkodzeń niż inne silniki
+* kod MediaWiki nie zawsze traktuje MyISAM jak powinien
+
+Twoja instalacja MySQL nie obsługuje InnoDB, być może jest to czas na aktualizację.",
 	'config-mysql-engine-help' => "'''InnoDB''' jest prawie zawsze najlepszą opcją, ponieważ posiada dobrą obsługę współbieżności.
 
 '''MyISAM''' może być szybsze w instalacjach pojedynczego użytkownika lub tylko do odczytu.
@@ -15155,7 +15667,6 @@ Bazy danych MyISAM mają tendencję do ulegania uszkodzeniom częściej niż baz
 Jest on bardziej wydajny niż tryb UTF-8 w MySQL i pozwala na używanie znaków pełnego zakresu Unicode.
 
 W '''trybie UTF-8''', MySQL będzie znać zestaw znaków w jakim zakodowano dane, można też przedstawić i przekonwertuj je odpowiednio, ale nie pozwoli Ci przechowywać znaków spoza [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes podstawowej płaszczyzny wielojęzyczności].",
-	'config-ibm_db2-low-db-pagesize' => "Baza danych DB2 posiada domyślny obszar tabel z niewystarczającym rozmiarem strony. Wartość rozmiaru strony musi być równa lub powyżej  '''32 K'''.",
 	'config-site-name' => 'Nazwa wiki',
 	'config-site-name-help' => 'Ten napis pojawi się w pasku tytułowym przeglądarki oraz w różnych innych miejscach.',
 	'config-site-name-blank' => 'Wprowadź nazwę witryny.',
@@ -15188,7 +15699,7 @@ Podaj inną nazwę.',
 	'config-admin-error-user' => 'Błąd wewnętrzny podczas tworzenia konta administratora o nazwie „<nowiki>$1</nowiki>”.',
 	'config-admin-error-password' => 'Wewnętrzny błąd podczas ustawiania hasła dla administratora „<nowiki>$1</nowiki>”: <pre>$2</pre>',
 	'config-admin-error-bademail' => 'Wpisałeś nieprawidłowy adres e‐mail',
-	'config-subscribe' => 'Zapisz się na [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce listę pocztową z ogłaszaniami o nowych wersjach].',
+	'config-subscribe' => 'Zapisz się na [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce listę pocztową z ogłoszeniami o nowych wersjach].',
 	'config-subscribe-help' => 'Jest to lista o małej liczbie wiadomości, wykorzystywana do przesyłania informacji o udostępnieniu nowej wersji oraz istotnych sprawach dotyczących bezpieczeństwa.
 Powinieneś zapisać się na tę listę i aktualizować zainstalowane oprogramowanie MediaWiki gdy pojawia się nowa wersja.',
 	'config-subscribe-noemail' => 'Próbowano subskrybować listę mailingową ogłoszeń wersji bez podania adresu e-mail.
@@ -15198,22 +15709,22 @@ Możesz pominąć pozostałe czynności konfiguracyjne i zainstalować wiki.',
 	'config-optional-continue' => 'Zadaj mi więcej pytań.',
 	'config-optional-skip' => 'Jestem już znudzony, po prostu zainstaluj wiki.',
 	'config-profile' => 'Profil uprawnień użytkowników',
-	'config-profile-wiki' => 'Tradycyjne wiki', # Fuzzy
+	'config-profile-wiki' => 'Otwarte wiki',
 	'config-profile-no-anon' => 'Wymagane utworzenie konta',
 	'config-profile-fishbowl' => 'Wyłącznie zatwierdzeni edytorzy',
 	'config-profile-private' => 'Prywatna wiki',
 	'config-profile-help' => "Strony typu wiki działają najlepiej, gdy pozwolisz je edytować tak wielu osobom, jak to możliwie.
-W MediaWiki, jest łatwe sprawdzenie ostatnich zmian i wycofać szkody, które są spowodowane przez naiwnych lub złośliwych użytkowników.
+W MediaWiki, można łatwo sprawdzić ostatnie zmiany i wycofać szkody, które są spowodowane przez naiwnych lub złośliwych użytkowników.
 
-Jednakże wielu uznało MediaWiki użytecznymi w różnorodnych rolach, a czasami nie jest łatwo przekonać wszystkich do korzyści ze sposobu działania wiki.
+Jednakże wielu uznało MediaWiki użytecznym w różnorodnych rolach, a czasami nie jest łatwo przekonać wszystkich do korzyści ze sposobu działania wiki. Masz więc wybór.
 
-Ustawienie '''{{int:config-profil-wiki}}''' pozwala każdemu na edycję, nawet bez logowania się.
-Wiki z '''{{int:config-profile-no-anon}}''' zawiera dodatkowe funkcje rozliczania się, ale może powstrzymać dorywczych współpracowników.
+Ustawienie '''{{int:config-profile-wiki}}''' pozwala każdemu na edycję, nawet bez logowania się.
+Wiki z '''{{int:config-profile-no-anon}}''' zawiera dodatkowe możliwości ale może powstrzymywać potencjalnych edytorów.
 
 Scenariusz '''{{int:config-profile-fishbowl}}''' umożliwia zatwierdzonym użytkownikom edycję, ale wyświetlanie stron jest powszechnie dostępne, włącznie z historią.
-Ustawienie '''{{int:config-profile-private}}'' ' pozwala na wyświetlanie stron tylko zatwierdzonym użytkownikom, ta sama grupa może edytować.
+Ustawienie '''{{int:config-profile-private}}'' ' pozwala na wyświetlanie stron tylko zatwierdzonym użytkownikom, ta sama grupa może je edytować.
 
-Bardziej skomplikowane konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [//www.mediawiki.org/wiki/Manual:User_rights odpowiednią część podręcznika].", # Fuzzy
+Bardziej skomplikowane konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [//www.mediawiki.org/wiki/Manual:User_rights odpowiednią część podręcznika].",
 	'config-license' => 'Prawa autorskie i licencja',
 	'config-license-none' => 'Brak stopki z licencją',
 	'config-license-cc-by-sa' => 'Creative Commons – za uznaniem autora, na tych samych zasadach',
@@ -15264,6 +15775,8 @@ Najlepiej, aby nie był on dostępny z internetu.',
 	'config-logo-help' => 'Domyślny motyw MediaWiki zawiera miejsce na logo wielkości 135 x 160 pikseli powyżej menu na pasku bocznym.
 Prześlij obrazek o odpowiednim rozmiarze, a następnie wpisz jego URL tutaj.
 
+Możesz użyć <code>$wgStylePath</code> lub <code>$wgScriptPath</code> jeżeli twoje logo jest relatywne do tych ścieżek.
+
 Jeśli nie chcesz logo, pozostaw to pole puste.',
 	'config-instantcommons' => 'Włącz Instant Commons',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] jest funkcją, która pozwala wiki używać obrazów, dźwięków i innych mediów znalezionych na  witrynie [//commons.wikimedia.org/ Wikimedia Commons].
@@ -15297,8 +15810,8 @@ Jeśli nie znasz numeru portu, wartością domyślną jest 11211.',
 Mogą one wymagać dodatkowych czynności konfiguracyjnych, ale można je teraz włączyć',
 	'config-install-alreadydone' => "'''Uwaga''' – wydaje się, że MediaWiki jest już zainstalowane, a obecnie próbujesz zainstalować je ponownie.
 Przejdź do następnej strony.",
-	'config-install-begin' => 'Po naciśnięciu "{{int:config-continue}}", rozpocznie się instalacji MediaWiki.
-Jeśli nadal chcesz dokonać zmian, naciśnij wstecz.', # Fuzzy
+	'config-install-begin' => 'Po naciśnięciu "{{int:config-continue}}", rozpocznie się instalacja MediaWiki.
+Jeśli nadal chcesz dokonać zmian, naciśnij "{{int:config-back}}".',
 	'config-install-step-done' => 'gotowe',
 	'config-install-step-failed' => 'nieudane',
 	'config-install-extensions' => 'Włącznie z rozszerzeniami',
@@ -15340,29 +15853,33 @@ Tworzenie domyślnej listy pominięto.",
 	'config-install-extension-tables' => 'Tworzenie tabel dla aktywnych rozszerzeń',
 	'config-install-mainpage-failed' => 'Nie udało się wstawić strony głównej – $1',
 	'config-install-done' => "'''Gratulacje!'''
-Udało ci się zainstalować MediaWiki.
+Udało Ci się zainstalować MediaWiki.
 
 Instalator wygenerował plik konfiguracyjny <code>LocalSettings.php</code>.
 
-Musisz go pobrać i umieścić go w korzeniu twojej instalacji wiki (tym samym katalogu co index.php). Pobieranie powinno zacząć się automatycznie.
+Musisz go pobrać i umieścić w katalogu głównym Twojej instalacji wiki (tym samym katalogu co index.php). Pobieranie powinno zacząć się automatycznie.
 
-Jeżeli pobieranie nie zostało zaproponowane, lub jeśli użytkownik anulował je, można ponownie uruchomić pobranie klikając poniższe łącze:
+Jeżeli pobieranie nie zostało zaproponowane lub jeśli użytkownik je anulował, można ponownie uruchomić pobranie klikając poniższe łącze:
 
 $3
 
-'''Uwaga''': Jeśli tego nie zrobisz tego teraz, wygenerowany plik konfiguracyjny nie będzie już dostępny po zakończeniu instalacji.
+'''Uwaga''': Jeśli nie zrobisz tego teraz, wygenerowany plik konfiguracyjny nie będzie już dostępny po zakończeniu instalacji.
 
-Po załadowaniu pliku konfiguracyjnego możesz '''[ $2  wejść na wiki]'''.",
+Po załadowaniu pliku konfiguracyjnego możesz '''[$2 wejść na wiki]'''.",
 	'config-download-localsettings' => 'Pobierz <code>LocalSettings.php</code>',
 	'config-help' => 'pomoc',
 	'config-nofile' => 'Nie udało się odnaleźć pliku "$1". Czy nie został usunięty?',
+	'config-extension-link' => 'Czy wiesz, że twoja wiki obsługuje [//www.mediawiki.org/wiki/Manual:Extensions/pl rozszerzenia]?
+
+Możesz przejrzeć [//www.mediawiki.org/wiki/Category:Extensions_by_category rozszerzenia według kategorii] lub [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] aby zobaczyć pełną listę rozszerzeń.',
 	'mainpagetext' => "'''Instalacja MediaWiki powiodła się.'''",
 	'mainpagedocfooter' => 'Zobacz [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] w celu uzyskania informacji o działaniu oprogramowania wiki.
 
 == Na początek ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista ustawień konfiguracyjnych]
-* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]', # Fuzzy
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings/pl Lista ustawień konfiguracyjnych]
+* [//www.mediawiki.org/wiki/Manual:FAQ/pl MediaWiki FAQ]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]',
 );
 
 /** Piedmontese (Piemontèis)
@@ -15592,7 +16109,6 @@ Lòn a comprend ij dat brut ëd l'utent (adrëssa ëd pòsta eletrònica, ciav t
 Ch'a consìdera ëd buté la base ëd dàit tuta antrega da n'àutra part, për esempi an <code>/var/lib/mediawiki/yourwiki</code>.",
 	'config-oracle-def-ts' => 'Spassi dla tàula dë stàndard:',
 	'config-oracle-temp-ts' => 'Spassi dla tàula temporani:',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => "MediaWiki a manten ij sistema ëd base ëd dàit sì-dapress:
 
 $1
@@ -15602,12 +16118,10 @@ S'a vëd pa listà sì-sota ël sistema ëd base ëd dàit ch'a preuva a dovré,
 	'config-support-postgres' => "* $1 e l'é un sistema ëd base ëd dàit popolar a sorgiss duverta com alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php com compilé PHP con ël manteniment ëd PostgreSQL]). A peulo ess-ie chèich cit bigat, e a l'é nen arcomandà ëd dovrelo an n'ambient ëd produssion.",
 	'config-support-sqlite' => "* $1 e l'é un sistema ëd base ëd dàit leger che a l'é motobin bin mantnù ([http://www.php.net/manual/en/pdo.installation.php com compilé PHP con ël manteniment ëd SQLite], a deuvra PDO)",
 	'config-support-oracle' => "* $1 a l'é na base ëd dàit comersial për j'amprèise. ([http://www.php.net/manual/en/oci8.installation.php Com compilé PHP con ël manteniment OCI8])",
-	'config-support-ibm_db2' => "* $1 a l'é na base ëd dàit d'asiendal comersial.", # Fuzzy
 	'config-header-mysql' => 'Ampostassion MySQL',
 	'config-header-postgres' => 'Ampostassion PostgreSQL',
 	'config-header-sqlite' => 'Ampostassion SQLite',
 	'config-header-oracle' => 'Ampostassion Oracle',
-	'config-header-ibm_db2' => "Ampostassion d'IBM DB2",
 	'config-invalid-db-type' => 'Sòrt ëd ëd base ëd dàit pa bon-a',
 	'config-missing-db-name' => 'A dev buteje un valor për "Nòm ëd la base ëd dàit"',
 	'config-missing-db-host' => 'A dev buteje un valor për "l\'òspit ëd la base ëd dàit"',
@@ -15667,7 +16181,7 @@ Sòn a l'è '''pa arcomandà''' gavà ch'a rancontra dij problema con soa wiki."
 	'config-upgrade-done-no-regenerate' => 'Agiornament complet.
 
 It peule adess [$1 ancaminé a dovré toa wiki].',
-	'config-regenerate' => 'Generé torna <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Generé torna LocalSettings.php →',
 	'config-show-table-status' => 'Arcesta <code>SHOW TABLE STATUS</code> falìa!',
 	'config-unknown-collation' => "'''Avis:''' La base ëd dàit a deuvra na classificassion pa arconossùa.",
 	'config-db-web-account' => "Cont dla base ëd dàit për l'acess a l'aragnà",
@@ -15697,7 +16211,6 @@ La base ëd dàit MyISAM a tira a corompse pi 'd soens che la base ëd dàit Inn
 Sòn a l'é pi eficient che la manera UTF-8 ëd MySQL, e a-j përmët ëd dovré l'ansema antregh ëd caràter Unicode.
 
 An '''manera UTF-8''', MySQL a conossrà an che ansem ëd caràter a son ij sò dat, e a peul presenteje e convertije apropriatament, ma a-j lassa pa memorisé ij caràter ëdzora al [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes pian multilenghìstich ëd base].",
-	'config-ibm_db2-low-db-pagesize' => "Soa base ëd dàit DB2 a l'ha në spassi d'ambaronament predefinì con na dimension ëd pàgina insuficent. La dimension ëd pàgina a dev esse '''32K''' o pi gròssa.",
 	'config-site-name' => 'Nòm ëd la wiki:',
 	'config-site-name-help' => "Sòn a comparirà ant la bara dël tìtol dël navigador e an vàire d'àutri pòst.",
 	'config-site-name-blank' => "Ch'a buta un nòm ëd sit.",
@@ -15740,18 +16253,18 @@ A peul adess sauté la configurassion rimanenta e instalé dlongh la wiki.",
 	'config-optional-continue' => "Ciameme d'àutre chestion.",
 	'config-optional-skip' => 'I son già anojà, instala mach la wiki.',
 	'config-profile' => "Profil dij drit d'utent:",
-	'config-profile-wiki' => 'Deurb wiki',
+	'config-profile-wiki' => 'Wiki duverta',
 	'config-profile-no-anon' => 'A venta creé un cont',
 	'config-profile-fishbowl' => 'Mach editor autorisà',
 	'config-profile-private' => 'Wiki privà',
 	'config-profile-help' => "Le wiki a marcio mej quand ch'a lassa che pì përsone possìbij a-j modìfico.
-An MediaWiki, a l'é bel fé revisioné ij cambi recent, e buté andré minca dann che a sia fàit da utent noviss o malissios.
+An MediaWiki, a l'é bel fé revisioné j'ùltime modìfiche, e buté andré qualsëssìa dann che a sia fàit da dj'utent noviss o malissios.
 
 An tùit ij cas, an tanti a l'han trovà che MediaWiki a sia ùtil ant na gran varietà ëd manere, e dle vire a l'é pa bel fé convince cheidun dij vantagi dla wiki.
 Parèj a l'ha doe possibilità.
 
 Ël model '''{{int:config-profile-wiki}}''' a përmët a chicassìa ëd modifiché, bele sensa intré ant ël sistema.
-Na wiki con  '''{{int:config-profile-no-anon}}''' a dà pì 'd contròl, ma a peul slontané dij contribudor casuaj.
+Na wiki con  '''{{int:config-profile-no-anon}}''' a dà pì 'd contròl, ma a peul slontané dij contributor ocasionaj.
 
 Ël senari '''{{int:config-profile-fishbowl}}''' a përmët a j'utent aprovà ëd modifiché, ma ël pùblich a peul vëdde le pàgine, comprèisa la stòria.
 Un '''{{int:config-profile-private}}''' a përmët mach a j'utent aprovà ëd vëdde le pàgine, con la midema partìa ch'a peul modifiché.
@@ -15806,7 +16319,7 @@ Idealment, sòn a dovrìa pa esse acessìbil an sl'aragnà.",
 	'config-logo-help' => "La pel dë stàndard ëd MediaWiki a comprend lë spassi për na marca ëd 135x160 pontin dzora la lista dla bara lateral.
 Ch'a dëscaria na figura ëd la dimension aproprià, e ch'a anserissa l'anliura ambelessì.
 
-S'a veul gnun-e marche, ch'a lassa ës camp bianch.",
+S'a veul gnun-e marche, ch'a lassa ës camp bianch.", # Fuzzy
 	'config-instantcommons' => 'Abìlita Instant Commons',
 	'config-instantcommons-help' => "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] a l'é na funsion ch'a përmët a le wiki ëd dovré dle figure, dij son e d'àutri mojen trovà an sël sit [//commons.wikimedia.org/ Wikimedia Commons].
 Për dovré sossì, MediaWiki a l'ha da manca dl'acess a la ragnà.
@@ -15839,8 +16352,8 @@ S'a conòsse nen la pòrta, cola predefinìa a l'é 11211.",
 A peulo avèj da manca ëd configurassion adissionaj, ma a peul abiliteje adess",
 	'config-install-alreadydone' => "'''Avis''' A smija ch'a l'abie già instalà MediaWiki e ch'a preuva a instalelo torna.
 Për piasì, ch'a vada a la pàgina ch'a-i ven.",
-	'config-install-begin' => 'An sgnacand "{{int:config-continue}}", a anandiërà l\'istalassion ëd MediaWiki.
-S\'a veul anco\' fé dle modìfiche, ch\'a sgnaca su "{{int:config-back}}".',
+	'config-install-begin' => "An sgnacand su «{{int:config-continue}}», a anandiërà l'istalassion ëd MediaWiki.
+S'a veul anco' fé dle modìfiche, ch'a sgnaca su «{{int:config-back}}».",
 	'config-install-step-done' => 'fàit',
 	'config-install-step-failed' => 'falì',
 	'config-install-extensions' => "Comprende j'estension",
@@ -15926,7 +16439,7 @@ $messages['prg'] = array(
 == En pagaūseņu ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
 );
 
 /** Pashto (پښتو)
@@ -15940,7 +16453,7 @@ $messages['ps'] = array(
 	'config-page-welcome' => 'مېډياويکي ته ښه راغلاست!',
 	'config-page-name' => 'نوم',
 	'config-page-options' => 'خوښنې',
-	'config-page-install' => 'لګول',
+	'config-page-install' => 'لگول',
 	'config-page-complete' => 'بشپړ!',
 	'config-env-php' => 'د $1 PHP نصب شو.',
 	'config-db-type' => 'د توکبنسټ ډول:',
@@ -15953,20 +16466,19 @@ $messages['ps'] = array(
 	'config-header-postgres' => 'د PostgreSQL امستنې',
 	'config-header-sqlite' => 'د SQLite امستنې',
 	'config-header-oracle' => 'د اورېکل امستنې',
-	'config-header-ibm_db2' => 'د IBM DB2 امستنې',
 	'config-sqlite-readonly' => 'د <code>$1</code> دوتنه د ليکلو وړ نه ده.',
 	'config-sqlite-cant-create-db' => 'د توکبنسټ دوتنه <code>$1</code> جوړه نه شوه.',
 	'config-site-name' => 'د ويکي نوم:',
 	'config-site-name-blank' => 'د وېبځي نوم وليکۍ.',
 	'config-project-namespace' => 'د پروژې نوم-تشيال:',
 	'config-ns-generic' => 'پروژه',
-	'config-admin-box' => 'د پازوال ګڼون',
+	'config-admin-box' => 'د پازوال گڼون',
 	'config-admin-name' => 'ستاسې نوم:',
 	'config-admin-password' => 'پټنوم:',
 	'config-admin-password-confirm' => 'پټنوم يو ځل بيا:',
 	'config-admin-email' => 'برېښليک پته:',
-	'config-profile-wiki' => 'دوديزه ويکي', # Fuzzy
-	'config-license-pd' => 'ټولګړی شپول',
+	'config-profile-wiki' => 'پرانيستې ويکي',
+	'config-license-pd' => 'ټولگړی شپول',
 	'config-email-settings' => 'د برېښليک امستنې',
 	'config-install-step-done' => 'ترسره شو',
 	'config-install-tables' => 'لښتيالونه جوړول',
@@ -15984,25 +16496,27 @@ $messages['ps'] = array(
 /** Portuguese (português)
  * @author Crazymadlover
  * @author Hamilton Abreu
+ * @author Luckas
  * @author Mormegil
  * @author Platonides
  * @author SandroHc
  * @author Waldir
  * @author 아라
+ * @author 555
  */
 $messages['pt'] = array(
 	'config-desc' => 'O instalador do MediaWiki',
 	'config-title' => 'Instalação MediaWiki $1',
 	'config-information' => 'Informação',
 	'config-localsettings-upgrade' => 'Foi detectado um ficheiro <code>LocalSettings.php</code>.
-Para actualizar esta instalação, por favor introduza o valor de <code>$wgUpgradeKey</code> na caixa abaixo.
+Para atualizar esta instalação, por favor introduza o valor de <code>$wgUpgradeKey</code> na caixa abaixo.
 Encontra este valor no <code>LocalSettings.php</code>.',
 	'config-localsettings-cli-upgrade' => 'Foi detectada a existência de um ficheiro <code>LocalSettings.php</code>.
-Para actualizar esta instalação execute o <code>update.php</code>, por favor.',
-	'config-localsettings-key' => 'Chave de actualização:',
+Para atualizar esta instalação execute o <code>update.php</code>, por favor.',
+	'config-localsettings-key' => 'Chave de atualização:',
 	'config-localsettings-badkey' => 'A chave que forneceu está incorreta.',
 	'config-upgrade-key-missing' => 'Foi detectada uma instalação existente do MediaWiki.
-Para actualizar esta instalação, por favor coloque a seguinte linha no final do seu <code>LocalSettings.php</code>:
+Para atualizar esta instalação, por favor coloque a seguinte linha no final do seu <code>LocalSettings.php</code>:
 
 $1',
 	'config-localsettings-incomplete' => 'O ficheiro <code>LocalSettings.php</code> existente parece estar incompleto.
@@ -16017,17 +16531,17 @@ As sessões estão configuradas para uma duração de $1.
 Pode aumentar esta duração configurando <code>session.gc_maxlifetime</code> no php.ini.
 Reinicie o processo de instalação.',
 	'config-no-session' => 'Os seus dados de sessão foram perdidos!
-Verifique o seu php.ini e certifique-se de que em <code>session.save_path</code> está definido um directório apropriado.',
+Verifique o seu php.ini e certifique-se de que em <code>session.save_path</code> está definido um diretório apropriado.',
 	'config-your-language' => 'A sua língua:',
-	'config-your-language-help' => 'Seleccione a língua que será usada durante o processo de instalação.',
+	'config-your-language-help' => 'Selecione a língua que será usada durante o processo de instalação.',
 	'config-wiki-language' => 'Língua da wiki:',
-	'config-wiki-language-help' => 'Seleccione a língua que será predominante na wiki.',
+	'config-wiki-language-help' => 'Selecione a língua que será predominante na wiki.',
 	'config-back' => '← Voltar',
 	'config-continue' => 'Continuar →',
 	'config-page-language' => 'Língua',
 	'config-page-welcome' => 'Bem-vindo(a) ao MediaWiki!',
 	'config-page-dbconnect' => 'Ligar à base de dados',
-	'config-page-upgrade' => 'Actualizar a instalação existente',
+	'config-page-upgrade' => 'Atualizar a instalação existente',
 	'config-page-dbsettings' => 'Configurações da base de dados',
 	'config-page-name' => 'Nome',
 	'config-page-options' => 'Opções',
@@ -16037,13 +16551,13 @@ Verifique o seu php.ini e certifique-se de que em <code>session.save_path</code>
 	'config-page-readme' => 'Leia-me',
 	'config-page-releasenotes' => 'Notas de lançamento',
 	'config-page-copying' => 'A copiar',
-	'config-page-upgradedoc' => 'A actualizar',
+	'config-page-upgradedoc' => 'Atualizando',
 	'config-page-existingwiki' => 'Wiki existente',
 	'config-help-restart' => 'Deseja limpar todos os dados gravados que introduziu e reiniciar o processo de instalação?',
 	'config-restart' => 'Sim, reiniciar',
 	'config-welcome' => '=== Verificações do ambiente ===
 São realizadas verificações básicas para determinar se este ambiente é apropriado para instalação do MediaWiki.
-Se necessitar de pedir ajuda durante a instalação, deve fornecer os resultados destas verificações.',
+Se necessitar de pedir ajuda durante a instalação, deve fornecer os resultados destas verificações.', # Fuzzy
 	'config-copyright' => "=== Direitos de autor e Condições de uso ===
 
 $1
@@ -16070,35 +16584,35 @@ Não pode instalar o MediaWiki.',
 	'config-env-php' => 'O PHP $1 está instalado.',
 	'config-env-php-toolow' => 'O PHP $1 está instalado.
 No entanto, o MediaWiki requer o PHP $2 ou superior.',
-	'config-unicode-using-utf8' => 'A usar o utf8_normalize.so, por Brian Viper, para a normalização Unicode.',
+	'config-unicode-using-utf8' => 'A usar o utf8_normalize.so, por Brion Vibber, para a normalização Unicode.',
 	'config-unicode-using-intl' => 'A usar a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.',
-	'config-unicode-pure-php-warning' => "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efectuar a normalização Unicode. Irá recorrer-se à implementação em PHP puro, que é mais lenta.
+	'config-unicode-pure-php-warning' => "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode. Irá recorrer-se à implementação em PHP puro, que é mais lenta.
 Se o seu site tem alto volume de tráfego, devia informar-se um pouco sobre a [//www.mediawiki.org/wiki/Unicode_normalization_considerations/pt normalização Unicode].",
-	'config-unicode-update-warning' => "'''Aviso''': A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://site.icu-project.org/ projecto ICU].
-Devia [//www.mediawiki.org/wiki/Unicode_normalization_considerations actualizá-la] se tem quaisquer preocupações sobre o uso do Unicode.",
+	'config-unicode-update-warning' => "'''Aviso''': A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://site.icu-project.org/ projeto ICU].
+Devia [//www.mediawiki.org/wiki/Unicode_normalization_considerations atualizá-la] se tem quaisquer preocupações sobre o uso do Unicode.",
 	'config-no-db' => "Não foi possível encontrar um controlador ''(driver)'' apropriado para a base de dados! Precisa de instalar um controlador para o PHP. São aceites os seguintes tipos de base de dados: $1.
 
 Se usa alojamento partilhado, peça ao fornecedor do alojamento para instalar um controlador apropriado.
-Se foi você quem compilou o PHP, reconfigure-o com um cliente de base de dados activado; por exemplo, usando <code>./configure --with-mysql</code>.
+Se foi você quem compilou o PHP, reconfigure-o com um cliente de base de dados ativado; por exemplo, usando <code>./configure --with-mysql</code>.
 Se instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também o módulo php5-mysql.",
 	'config-outdated-sqlite' => "'''Aviso''': Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
 	'config-no-fts3' => "'''Aviso''': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
-	'config-register-globals' => "'''Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está activada.'''
-'''Desactive-a, se puder.'''
+	'config-register-globals' => "'''Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.'''
+'''Desative-a, se puder.'''
 O MediaWiki funciona mesmo assim, mas o seu servidor está exposto a potenciais vulnerabilidades de segurança.",
-	'config-magic-quotes-runtime' => "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está activada!'''
+	'config-magic-quotes-runtime' => "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativada!'''
 Esta opção causa corrupção dos dados de entrada, de uma forma imprevisível.
-Não pode instalar ou usar o MediaWiki a menos que esta opção seja desactivada.",
-	'config-magic-quotes-sybase' => "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está activada!'''
+Não pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+	'config-magic-quotes-sybase' => "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativada!'''
 Esta opção causa corrupção dos dados de entrada, de uma forma imprevisível.
-Não pode instalar ou usar o MediaWiki a menos que esta opção seja desactivada.",
-	'config-mbstring' => "'''Fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activada!'''
+Não pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+	'config-mbstring' => "'''Fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!'''
 Esta opção causa erros e pode corromper os dados de uma forma imprevisível.
-Não pode instalar ou usar o MediaWiki a menos que esta opção seja desactivada.",
-	'config-ze1' => "'''Fatal: A opção [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] está activada!'''
+Não pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+	'config-ze1' => "'''Fatal: A opção [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode] está ativada!'''
 Esta opção causa problemas significativos no MediaWiki.
-Não pode instalar ou usar o MediaWiki a menos que esta opção seja desactivada.",
-	'config-safe-mode' => "'''Aviso:''' O [http://www.php.net/features.safe-mode safe mode] do PHP está activo.
+Não pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+	'config-safe-mode' => "'''Aviso:''' O [http://www.php.net/features.safe-mode safe mode] do PHP está ativo.
 Este modo pode causar problemas, especialmente no upload de ficheiros e no suporte a <code>math</code>.",
 	'config-xml-bad' => 'Falta o módulo XML do PHP.
 O MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.
@@ -16106,7 +16620,7 @@ Se está a executar o Mandrake, instale o pacote php-xml.',
 	'config-pcre' => 'Parece faltar o módulo de suporte PCRE.
 Para funcionar, o MediaWiki necessita das funções de expressões regulares compatíveis com Perl.',
 	'config-pcre-no-utf8' => "'''Fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.
-O MediaWiki necessita do suporte UTF-8 para funcionar correctamente.",
+O MediaWiki necessita do suporte UTF-8 para funcionar corretamente.",
 	'config-memory-raised' => 'A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.',
 	'config-memory-bad' => "'''Aviso:''' A configuração <code>memory_limit</code> do PHP é $1.
 Isto é provavelmente demasiado baixo.
@@ -16116,29 +16630,29 @@ A instalação poderá falhar!",
 	'config-apc' => '[http://www.php.net/apc APC] instalada',
 	'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] instalada',
 	'config-no-cache' => "'''Aviso:''' Não foi possível encontrar: [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache], nem [http://www.iis.net/download/WinCacheForPhp WinCache].
-A cache de objectos não será activada.",
+A cache de objetos não está ativada.",
 	'config-mod-security' => "'''Aviso''': O seu servidor de internet tem o [http://modsecurity.org/ mod_security] ativado. Se este estiver mal configurado, pode causar problemas ao MediaWiki ou a outros programas, permitindo que os utilizadores publiquem conteúdos arbitrários.
 Consulte a [http://modsecurity.org/documentation/ mod_security documentação] ou peça apoio ao fornecedor do alojamento do seu servidor se encontrar erros aleatórios.",
 	'config-diff3-bad' => 'O GNU diff3 não foi encontrado.',
 	'config-imagemagick' => 'Foi encontrado o ImageMagick: <code>$1</code>.
-Se possibilitar uploads, a miniaturização de imagens será activada.',
+Se possibilitar uploads, a miniaturização de imagens será ativada.',
 	'config-gd' => 'Foi encontrada a biblioteca gráfica GD.
-Se possibilitar uploads, a miniaturização de imagens será activada.',
+Se possibilitar uploads, a miniaturização de imagens será ativada.',
 	'config-no-scaling' => 'Não foi encontrada a biblioteca gráfica GD nem o ImageMagick.
-A miniaturização de imagens será desactivada.',
-	'config-no-uri' => "'''Erro:''' Não foi possível determinar a URI actual.
+A miniaturização de imagens será desativada.',
+	'config-no-uri' => "'''Erro:''' Não foi possível determinar a URI atual.
 A instalação foi abortada.",
 	'config-no-cli-uri' => "'''Aviso''':  Não foi especificado um --scriptpath; por omissão, será usado: <code>$1</code>.",
 	'config-using-server' => 'Será usado o nome do servidor "<nowiki>$1</nowiki>".',
 	'config-using-uri' => 'Será usada a URL do servidor "<nowiki>$1$2</nowiki>".',
-	'config-uploads-not-safe' => "'''Aviso:''' O directório por omissão para uploads <code>$1</code>, está vulnerável à execução arbitrária de scripts.
+	'config-uploads-not-safe' => "'''Aviso:''' O diretório por omissão para uploads <code>$1</code>, está vulnerável à execução arbitrária de scripts.
 Embora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [//www.mediawiki.org/wiki/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
-	'config-no-cli-uploads-check' => "'''Aviso:''' O directório por omissão para uploads, <code>\$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário durante a instalação por CLI (\"Command-line Interface\").",
+	'config-no-cli-uploads-check' => "'''Aviso:''' O diretório por omissão para uploads, <code>\$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário durante a instalação por CLI (\"Command-line Interface\").",
 	'config-brokenlibxml' => 'O seu sistema tem uma combinação de versões de PHP e libxml2 conhecida por ser problemática, podendo causar corrupção de dados no MediaWiki e outras aplicações da internet.
-Actualize para o PHP versão 5.2.9 ou posterior e libxml2 versão 2.7.3 ou posterior ([//bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).
+Atualize para o PHP versão 5.2.9 ou posterior e libxml2 versão 2.7.3 ou posterior ([//bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).
 Instalação interrompida.',
 	'config-using531' => 'O MediaWiki não pode ser usado com o PHP $1 devido a um problema que envolve parâmetros de referência para <code>__call()</code>.
-Para resolver este problema, actualize o PHP para a versão 5.3.2 ou posterior, ou reverta-o para a 5.3.0.
+Para resolver este problema, atualize o PHP para a versão 5.3.2 ou posterior, ou reverta-o para a 5.3.0.
 Instalação interrompida.',
 	'config-suhosin-max-value-length' => 'O Suhosin está instalado e limita a $1 bytes o comprimento do parâmetro GET. O componente ResourceLoader do MediaWiki pode tornear este limite, mas prejudicando o desempenho. Se lhe for possível, deve atribuir o valor 1024 ou maior ao parâmetro <code>suhosin.get.max_value_length</code> no ficheiro <code>php.ini</code>, e definir o mesmo valor para <code>$wgResourceLoaderMaxQueryLength</code> no ficheiro LocalSettings.php.', # Fuzzy
 	'config-db-type' => 'Tipo da base de dados:',
@@ -16161,9 +16675,9 @@ Se estiver a usar um servidor partilhado, o fornecedor do alojamento deve poder
 	'config-db-name-oracle' => "Esquema ''(schema)'' da base de dados:",
 	'config-db-account-oracle-warn' => "Há três cenários suportados na instalação do servidor de base de dados Oracle:
 
-Se pretende criar a conta de acesso pela internet na base de dados durante o processo de instalação, forneça como conta para a instalação uma conta com o papel de SYSDBA na base de dados e especifique as credenciais desejadas para a conta de acesso pela internet. Se não pretende criar a conta de acesso pela internet durante a instalação, pode criá-la manualmente e fornecer só essa conta para a instalação (se ela tiver as permissões necessárias para criar os objectos do esquema ''(schema)''). A terceira alternativa é fornecer duas contas diferentes; uma com privilégios de criação e outra com privilégios limitados para o acesso pela internet.
+Se pretende criar a conta de acesso pela internet na base de dados durante o processo de instalação, forneça como conta para a instalação uma conta com o papel de SYSDBA na base de dados e especifique as credenciais desejadas para a conta de acesso pela internet. Se não pretende criar a conta de acesso pela internet durante a instalação, pode criá-la manualmente e fornecer só essa conta para a instalação (se ela tiver as permissões necessárias para criar os objetos do esquema ''(schema)''). A terceira alternativa é fornecer duas contas diferentes; uma com privilégios de criação e outra com privilégios limitados para o acesso pela internet.
 
-Existe um script para criação de uma conta com os privilégios necessários no directório \"maintenance/oracle/\" desta instalação. Mantenha em mente que usar uma conta com privilégios limitados impossibilita todas as operações de manutenção com a conta padrão.",
+Existe um script para criação de uma conta com os privilégios necessários no diretório \"maintenance/oracle/\" desta instalação. Mantenha em mente que usar uma conta com privilégios limitados impossibilita todas as operações de manutenção com a conta padrão.",
 	'config-db-install-account' => 'Conta do utilizador para a instalação',
 	'config-db-username' => 'Nome do utilizador da base de dados:',
 	'config-db-password' => 'Palavra-chave do utilizador da base de dados:',
@@ -16194,18 +16708,18 @@ mas não lhe permitirá armazenar caracteres acima do [//en.wikipedia.org/wiki/M
 	'config-mysql-old' => 'É necessário o MySQL $1 ou posterior; tem a versão $2.',
 	'config-db-port' => 'Porta da base de dados:',
 	'config-db-schema' => "Esquema ''(schema)'' do MediaWiki",
-	'config-db-schema-help' => 'Normalmente, este esquema ("schema") estará correcto.
+	'config-db-schema-help' => 'Normalmente, este esquema estará correto.
 Altere-o só se souber que precisa de o fazer.',
 	'config-pg-test-error' => "Não foi possível criar uma ligação à base de dados '''$1''': $2",
-	'config-sqlite-dir' => 'Directório de dados do SQLite:',
+	'config-sqlite-dir' => 'Diretório de dados do SQLite:',
 	'config-sqlite-dir-help' => "O SQLite armazena todos os dados num único ficheiro.
 
-Durante a instalação, o servidor de internet precisa de ter permissão de escrita no directório que especificar.
+Durante a instalação, o servidor de internet precisa de ter permissão de escrita no diretório que especificar.
 
-Este directório '''não''' deve poder ser acedido directamente da internet, por isso está a ser colocado onde estão os seus ficheiros PHP.
+Este diretório '''não''' deve poder ser acedido diretamente da internet, por isso está a ser colocado onde estão os seus ficheiros PHP.
 
-Juntamente com o directório, o instalador irá criar um ficheiro <code>.htaccess</code>, mas se esta operação falhar é possível que alguém venha a ter acesso directo à base de dados.
-Isto inclui acesso aos dados dos utilizadores (endereços de correio electrónico, palavras-chave encriptadas), às revisões eliminadas e a outros dados de acesso restrito na wiki.
+Juntamente com o diretório, o instalador irá criar um ficheiro <code>.htaccess</code>, mas se esta operação falhar é possível que alguém venha a ter acesso direto à base de dados.
+Isto inclui acesso aos dados dos utilizadores (endereços de correio eletrónico, palavras-chave encriptadas), às revisões eliminadas e a outros dados de acesso restrito na wiki.
 
 Considere colocar a base de dados num local completamente diferente, como, por exemplo, em <code>/var/lib/mediawiki/asuawiki</code>.",
 	'config-oracle-def-ts' => 'Tablespace padrão:',
@@ -16214,28 +16728,25 @@ Considere colocar a base de dados num local completamente diferente, como, por e
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'O MediaWiki suporta as seguintes plataformas de base de dados:
 
 $1
 
-Se a plataforma que pretende usar não está listada abaixo, siga as instruções nos links acima para activar o suporte.',
+Se a plataforma que pretende usar não está listada abaixo, siga as instruções nos links acima para ativar o suporte.',
 	'config-support-mysql' => '* $1 é a plataforma primária do MediaWiki e a melhor suportada ([http://www.php.net/manual/en/mysql.installation.php como compilar PHP com suporte MySQL])',
 	'config-support-postgres' => '* $1 é uma plataforma de base de dados comum, de fonte aberta, alternativa ao MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar PHP com suporte PostgreSQL]). Poderão existir alguns pequenos problemas e não é recomendado o seu uso em ambientes de exploração/produção.',
 	'config-support-sqlite' => '* $1 é uma plataforma de base de dados ligeira muito bem suportada. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP com suporte SQLite], usa PDO)',
 	'config-support-oracle' => '* $1 é uma base de dados de uma empresa comercial. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
-	'config-support-ibm_db2' => '* $1 é uma base de dados empresarial.', # Fuzzy
 	'config-header-mysql' => 'Definições MySQL',
 	'config-header-postgres' => 'Definições PostgreSQL',
 	'config-header-sqlite' => 'Definições SQLite',
 	'config-header-oracle' => 'Definições Oracle',
-	'config-header-ibm_db2' => 'Configurações da IBM DB2',
 	'config-invalid-db-type' => 'O tipo de base de dados é inválido',
 	'config-missing-db-name' => 'Tem de introduzir um valor para "Nome da base de dados"',
 	'config-missing-db-host' => 'Tem de introduzir um valor para "Servidor da base de dados"',
 	'config-missing-db-server-oracle' => 'Tem de introduzir um valor para "TNS da base de dados"',
 	'config-invalid-db-server-oracle' => 'O TNS da base de dados, "$1", é inválido.
-Use só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e pontos (.) dos caracteres ASCII.',
+Use só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e pontos (.) dos caracteres ASCII.', # Fuzzy
 	'config-invalid-db-name' => 'O nome da base de dados, "$1",  é inválido.
 Use só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e hífens (-) dos caracteres ASCII.',
 	'config-invalid-db-prefix' => 'O prefixo da base de dados, "$1",  é inválido.
@@ -16251,51 +16762,51 @@ Use só letras (a-z, A-Z), algarismos (0-9) e sublinhados (_) dos caracteres ASC
 	'config-sqlite-name-help' => 'Escolha o nome que identificará a sua wiki.
 Não use espaços ou hífens.
 Este nome será usado como nome do ficheiro de dados do SQLite.',
-	'config-sqlite-parent-unwritable-group' => 'Não é possível criar o directório de dados <code><nowiki>$1</nowiki></code>, porque o servidor de internet não tem permissão de escrita no directório que o contém <code><nowiki>$2</nowiki></code>.
+	'config-sqlite-parent-unwritable-group' => 'Não é possível criar o diretório de dados <code><nowiki>$1</nowiki></code>, porque o servidor de internet não tem permissão de escrita no diretório que o contém <code><nowiki>$2</nowiki></code>.
 
 O instalador determinou em que nome de utilizador o seu servidor de internet está a correr.
-Para continuar, configure o directório <code><nowiki>$3</nowiki></code> para poder ser escrito por este utilizador.
+Para continuar, configure o diretório <code><nowiki>$3</nowiki></code> para poder ser escrito por este utilizador.
 Para fazê-lo em sistemas Unix ou Linux, use:
 
 <pre>cd $2
 mkdir $3
 chgrp $4 $3
 chmod g+w $3</pre>',
-	'config-sqlite-parent-unwritable-nogroup' => 'Não é possível criar o directório de dados <code><nowiki>$1</nowiki></code>, porque o servidor de internet não tem permissão de escrita no directório que o contém <code><nowiki>$2</nowiki></code>.
+	'config-sqlite-parent-unwritable-nogroup' => 'Não é possível criar o diretório de dados <code><nowiki>$1</nowiki></code>, porque o servidor de internet não tem permissão de escrita no diretório que o contém <code><nowiki>$2</nowiki></code>.
 
 Não foi possível determinar em que nome de utilizador o seu servidor de internet está a correr.
-Para continuar, configure o directório <code><nowiki>$3</nowiki></code> para que este possa ser globalmente escrito por esse utilizador (e por outros!).
+Para continuar, configure o diretório <code><nowiki>$3</nowiki></code> para que este possa ser globalmente escrito por esse utilizador (e por outros!).
 Para fazê-lo em sistemas Unix ou Linux, use:
 
 <pre>cd $2
 mkdir $3
 chmod a+w $3</pre>',
-	'config-sqlite-mkdir-error' => 'Ocorreu um erro ao criar o directório de dados "$1".
+	'config-sqlite-mkdir-error' => 'Ocorreu um erro ao criar o diretório de dados "$1".
 Verifique a localização e tente novamente.',
-	'config-sqlite-dir-unwritable' => 'Não foi possível escrever no directório "$1".
+	'config-sqlite-dir-unwritable' => 'Não foi possível escrever no diretório "$1".
 Altere as permissões para que ele possa ser escrito pelo servidor de internet e tente novamente.',
 	'config-sqlite-connection-error' => '$1.
 
-Verifique o directório de dados e o nome da base de dados abaixo e tente novamente.',
+Verifique o diretório de dados e o nome da base de dados abaixo e tente novamente.',
 	'config-sqlite-readonly' => 'Não é possivel escrever no ficheiro <code>$1</code>.',
 	'config-sqlite-cant-create-db' => 'Não foi possível criar o ficheiro da base de dados <code>$1</code>.',
 	'config-sqlite-fts3-downgrade' => 'O PHP não tem suporte FTS3; a reverter o esquema das tabelas para o anterior',
 	'config-can-upgrade' => "Esta base de dados contém tabelas do MediaWiki.
-Para actualizá-las para o MediaWiki $1, clique '''Continuar'''.",
-	'config-upgrade-done' => "Actualização terminada.
+Para atualizá-las para o MediaWiki $1, clique '''Continuar'''.",
+	'config-upgrade-done' => "Atualização terminada.
 
 Agora pode [$1 começar a usar a sua wiki].
 
 Se quiser regenerar o seu ficheiro <code>LocalSettings.php</code>, clique o botão abaixo.
 Esta operação '''não é recomendada''' a menos que esteja a ter problemas com a sua wiki.",
-	'config-upgrade-done-no-regenerate' => 'Actualização terminada.
+	'config-upgrade-done-no-regenerate' => 'Atualização terminada.
 
 Agora pode [$1 começar a usar a sua wiki].',
-	'config-regenerate' => 'Regenerar o <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Regenerar o LocalSettings.php →',
 	'config-show-table-status' => 'A consulta <code>SHOW TABLE STATUS</code> falhou!',
 	'config-unknown-collation' => "'''Aviso:''' A base de dados está a utilizar uma colação ''(collation)'' desconhecida.",
 	'config-db-web-account' => 'Conta na base de dados para acesso pela internet',
-	'config-db-web-help' => 'Seleccione o nome de utilizador e a palavra-chave que o servidor de internet irá utilizar para aceder ao servidor da base de dados, durante a operação normal da wiki.',
+	'config-db-web-help' => 'Selecione o nome de utilizador e a palavra-chave que o servidor de internet irá utilizar para aceder ao servidor da base de dados, durante a operação normal da wiki.',
 	'config-db-web-account-same' => 'Usar a mesma conta usada na instalação',
 	'config-db-web-create' => 'Criar a conta se ainda não existir',
 	'config-db-web-no-create-privs' => 'A conta que especificou para a instalação não tem privilégios suficientes para criar uma conta.
@@ -16303,13 +16814,13 @@ A conta que especificar aqui já tem de existir.',
 	'config-mysql-engine' => 'Motor de armazenamento:',
 	'config-mysql-innodb' => 'InnoDB',
 	'config-mysql-myisam' => 'MyISAM',
-	'config-mysql-myisam-dep' => "'''Aviso''': Seleccionou o MyISAM para motor de armazenamento do MySQL, uma combinação desaconselhada para usar com o MediaWiki porque:
+	'config-mysql-myisam-dep' => "'''Aviso''': Selecionou o MyISAM para motor de armazenamento do MySQL, uma combinação desaconselhada para usar com o MediaWiki porque:
 * praticamente não permite acessos simultâneos, devido aos bloqueios de tabelas
-* o MyISAM é mais susceptível a perdas da integridade dos dados do que outros motores
+* o MyISAM é mais suscetível a perdas da integridade dos dados do que outros motores
 * o código do MediaWiki não trabalha devidamente com o MyISAM
 
 Se a sua instalação do MySQL suporta InnoDB, é altamente recomendado que o escolha em vez do MyISAM.
-Se não suporta o InnoDB, talvez esta seja uma boa altura para fazer a actualização para a versão mais recente do MySQL.",
+Se não suporta o InnoDB, talvez esta seja uma boa altura para fazer a atualização para a versão mais recente do MySQL.",
 	'config-mysql-engine-help' => "'''InnoDB''' é quase sempre a melhor opção, porque suporta bem acessos simultâneos ''(concurrency)''.
 
 '''MyISAM''' pode ser mais rápido no modo de utilizador único ou em instalações somente para leitura.
@@ -16322,22 +16833,21 @@ Isto é mais eficiente do que o modo UTF-8 do MySQL e permite que sejam usados t
 
 No modo '''UTF-8''', o MySQL saberá em que conjunto de caracteres os seus dados estão e pode apresentá-los e convertê-los da forma mais adequada,
 mas não lhe permitirá armazenar caracteres acima do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Básico].",
-	'config-ibm_db2-low-db-pagesize' => "A sua base de dados DB2 tem um tablespace padrão com um pagesize insuficiente. O pagesize tem de ser '''32K'' ou maior.",
 	'config-site-name' => 'Nome da wiki:',
 	'config-site-name-help' => 'Este nome aparecerá no título da janela do seu browser e em vários outros sítios.',
 	'config-site-name-blank' => 'Introduza o nome do site.',
-	'config-project-namespace' => 'Espaço nominal do projecto:',
-	'config-ns-generic' => 'Projecto',
+	'config-project-namespace' => 'Espaço nominal do projeto:',
+	'config-ns-generic' => 'Projeto',
 	'config-ns-site-name' => 'O mesmo que o nome da wiki: $1',
 	'config-ns-other' => 'Outro (especifique)',
 	'config-ns-other-default' => 'AMinhaWiki',
-	'config-project-namespace-help' => 'Seguindo o exemplo da Wikipedia, muitas wikis mantêm as páginas das suas normas e políticas, separadas das páginas de conteúdo, num "\'\'\'espaço nominal do projecto\'\'\'".
+	'config-project-namespace-help' => 'Seguindo o exemplo da Wikipedia, muitas wikis mantêm as páginas das suas normas e políticas, separadas das páginas de conteúdo, num "\'\'\'espaço nominal do projeto\'\'\'".
 Todos os nomes das páginas neste espaço nominal começam com um determinado prefixo, que pode especificar aqui.
 Tradicionalmente, este prefixo deriva do nome da wiki, mas não pode conter caracteres de pontuação, como "#" ou ":".',
 	'config-ns-invalid' => 'O espaço nominal especificado "<nowiki>$1</nowiki>" é inválido.
-Introduza um espaço nominal de projecto diferente.',
+Introduza um espaço nominal de projeto diferente.',
 	'config-ns-conflict' => 'O espaço nominal que especificou, "<nowiki>$1</nowiki>", cria um conflito com um dos espaços nominais padrão do MediaWiki.
-Especifique um espaço nominal do projecto diferente.',
+Especifique um espaço nominal do projeto diferente.',
 	'config-admin-box' => 'Conta de administrador',
 	'config-admin-name' => 'O seu nome:',
 	'config-admin-password' => 'Palavra-chave:',
@@ -16357,7 +16867,7 @@ Introduza um nome de utilizador diferente.',
 	'config-admin-error-bademail' => 'Introduziu um correio electrónico inválido',
 	'config-subscribe' => 'Subscreva a [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista de divulgação de anúncios de lançamento].',
 	'config-subscribe-help' => 'Esta é uma lista de divulgação de baixo volume para anúncios de lançamento de versões novas, incluindo anúncios de segurança importantes.
-Deve subscrevê-la e actualizar a sua instalação MediaWiki quando são lançadas versões novas.',
+Deve subscrevê-la e atualizar a sua instalação MediaWiki quando são lançadas versões novas.',
 	'config-subscribe-noemail' => 'Tentou subscrever a lista de divulgação dos anúncios de novas versões, sem fornecer um endereço de correio electrónico.
 Para subscrever esta lista de divulgação tem de fornecer um endereço de correio electrónico.',
 	'config-almost-done' => 'Está quase a terminar!
@@ -16390,7 +16900,7 @@ Após a instalação, estarão disponíveis mais configurações de privilégios
 	'config-license-cc-0' => 'Creative Commons Zero (Domínio Público)',
 	'config-license-gfdl' => 'GNU Free Documentation License 1.3 ou posterior',
 	'config-license-pd' => 'Domínio Público',
-	'config-license-cc-choose' => 'Seleccione uma licença personalizada da Creative Commons',
+	'config-license-cc-choose' => 'Selecione uma licença personalizada Creative Commons',
 	'config-license-help' => 'Muitas wikis de acesso público licenciam todas as colaborações com uma [http://freedomdefined.org/Definition licença livre].
 Isto ajuda a criar um sentido de propriedade da comunidade e encoraja as colaborações a longo prazo.
 Tal não é geralmente necessário nas wikis privadas ou corporativas.
@@ -16401,19 +16911,19 @@ A licença anterior da Wikipédia era a licença GNU Free Documentation License.
 A GFDL é uma licença válida, mas de difícil compreensão.
 Também é difícil reutilizar conteúdos licenciados com a GFDL.',
 	'config-email-settings' => 'Definições do correio electrónico',
-	'config-enable-email' => 'Activar mensagens electrónicas de saída',
-	'config-enable-email-help' => 'Se quer que o correio electrónico funcione, as [http://www.php.net/manual/en/mail.configuration.php definições de correio electrónico do PHP] têm de estar configuradas correctamente.
-Se não pretende viabilizar qualquer funcionalidade de correio electrónico, pode desactivá-lo aqui.',
-	'config-email-user' => 'Activar mensagens electrónicas entre utilizadores',
-	'config-email-user-help' => 'Permitir que todos os utilizadores troquem entre si mensagens de correio electrónico, se tiverem activado esta funcionalidade nas suas preferências.',
-	'config-email-usertalk' => 'Activar notificações de alterações à página de discussão dos utilizadores',
-	'config-email-usertalk-help' => 'Permitir que os utilizadores recebam notificações de alterações à sua página de discussão, se tiverem activado esta funcionalidade nas suas preferências.',
-	'config-email-watchlist' => 'Activar notificação de alterações às páginas vigiadas',
-	'config-email-watchlist-help' => 'Permitir que os utilizadores recebam notificações de alterações às suas páginas vigiadas, se tiverem activado esta funcionalidade nas suas preferências.',
-	'config-email-auth' => 'Activar autenticação do correio electrónico',
-	'config-email-auth-help' => "Se esta opção for activada, os utilizadores têm de confirmar o seu endereço de correio electrónico usando um link que lhes é enviado sempre que o definirem ou alterarem.
-Só os endereços de correio electrónico autenticados podem receber mensagens electrónicas dos outros utilizadores ou alterar as mensagens de notificação.
-É '''recomendado''' que esta opção seja activada nas wikis de acesso público para impedir o uso abusivo das funcionalidades de correio electrónico.",
+	'config-enable-email' => 'Ativar mensagens eletrónicas de saída',
+	'config-enable-email-help' => 'Se quer que o correio eletrónico funcione, as [http://www.php.net/manual/en/mail.configuration.php definições de correio eletrónico do PHP] têm de estar configuradas corretamente.
+Se não pretende viabilizar qualquer funcionalidade de correio eletrónico, pode desativá-lo aqui.',
+	'config-email-user' => 'Ativar mensagens eletrónicas entre utilizadores',
+	'config-email-user-help' => 'Permitir que todos os utilizadores troquem entre si mensagens de correio eletrónico, se tiverem ativado esta funcionalidade nas suas preferências.',
+	'config-email-usertalk' => 'Ativar notificações de alterações à página de discussão dos utilizadores',
+	'config-email-usertalk-help' => 'Permitir que os utilizadores recebam notificações de alterações à sua página de discussão, se tiverem ativado esta funcionalidade nas suas preferências.',
+	'config-email-watchlist' => 'Ativar notificação de alterações às páginas vigiadas',
+	'config-email-watchlist-help' => 'Permitir que os utilizadores recebam notificações de alterações às suas páginas vigiadas, se tiverem ativado esta funcionalidade nas suas preferências.',
+	'config-email-auth' => 'Ativar autenticação do correio eletrónico',
+	'config-email-auth-help' => "Se esta opção for ativada, os utilizadores têm de confirmar o seu endereço de correio eletrónico usando um link que lhes é enviado sempre que o definirem ou alterarem.
+Só os endereços de correio eletrónico autenticados podem receber mensagens eletrónicas dos outros utilizadores ou alterar as mensagens de notificação.
+É '''recomendado''' que esta opção seja ativada nas wikis de acesso público para impedir o uso abusivo das funcionalidades de correio eletrónico.",
 	'config-email-sender' => 'Endereço de correio electrónico de retorno:',
 	'config-email-sender-help' => 'Introduza o endereço de correio electrónico que será usado como endereço de retorno nas mensagens electrónicas de saída.
 É para este endereço que serão enviadas as mensagens que não podem ser entregues.
@@ -16421,19 +16931,19 @@ Muitos servidores de correio electrónico exigem que pelo menos a parte do nome
 	'config-upload-settings' => 'Upload de imagens e ficheiros',
 	'config-upload-enable' => 'Possibilitar o upload de ficheiros',
 	'config-upload-help' => 'O upload de ficheiros expõe o seu servidor a riscos de segurança.
-Para mais informações, leia a [//www.mediawiki.org/wiki/Manual:Security secção sobre segurança] do Manual Técnico.
+Para mais informações, leia a [//www.mediawiki.org/wiki/Manual:Security seção sobre segurança] do Manual Técnico.
 
-Para permitir o upload de ficheiros, altere as permissões do subdirectório <code>images</code> no directório de raiz do MediaWik para que o servidor de internet possa escrever nele.
-Depois active esta opção.',
-	'config-upload-deleted' => 'Directório para os ficheiros apagados:',
-	'config-upload-deleted-help' => 'Escolha um directório onde serão arquivados os ficheiros apagados.
-O ideal é que este directório não possa ser directamente acedido a partir da internet.',
+Para permitir o upload de ficheiros, altere as permissões do subdiretório <code>images</code> no diretório de raiz do MediaWiki para que o servidor de internet possa escrever nele.
+Depois ative esta opção.',
+	'config-upload-deleted' => 'Diretório para os ficheiros apagados:',
+	'config-upload-deleted-help' => 'Escolha um diretório onde serão arquivados os ficheiros apagados.
+O ideal é que este diretório não possa ser diretamente acedido a partir da internet.',
 	'config-logo' => 'URL do logótipo:',
 	'config-logo-help' => 'O tema padrão do MediaWiki inclui espaço para um logótipo de 135x160 pixels acima do menu da barra lateral.
 Coloque na wiki uma imagem com estas dimensões e introduza aqui a URL dessa imagem.
 
-Se não pretende usar um logótipo, deixe este campo em branco.',
-	'config-instantcommons' => 'Activar a funcionalidade Instant Commons',
+Se não pretende usar um logótipo, deixe este campo em branco.', # Fuzzy
+	'config-instantcommons' => 'Ativar Instant Commons',
 	'config-instantcommons-help' => 'O [//www.mediawiki.org/wiki/InstantCommons Instant Commons] é uma funcionalidade que permite que as wikis usem imagens, áudio e outros ficheiros multimédia disponíveis no site [//commons.wikimedia.org/ Wikimedia Commons].
 Para poder usá-los, o MediaWiki necessita de acesso à internet.
 
@@ -16443,26 +16953,26 @@ Introduza o nome da licença manualmente.',
 	'config-cc-again' => 'Escolha outra vez...',
 	'config-cc-not-chosen' => 'Escolha a licença da Creative Commons que pretende e clique "continuar".',
 	'config-advanced-settings' => 'Configuração avançada',
-	'config-cache-options' => 'Definições da cache de objectos:',
-	'config-cache-help' => 'A cache de objectos é usada para melhorar o desempenho do MediaWiki. Armazena dados usados com frequência.
-Sites de tamanho médio ou grande são altamente encorajados a activar esta funcionalidade e os sites pequenos também terão alguns benefícios em fazê-lo.',
+	'config-cache-options' => 'Configuração da cache de objetos:',
+	'config-cache-help' => 'A cache de objetos é usada para melhorar o desempenho do MediaWiki. Armazena dados usados com frequência.
+Sites de tamanho médio ou grande são altamente encorajados a ativar esta funcionalidade e os sites pequenos também terão alguns benefícios em fazê-lo.',
 	'config-cache-none' => 'Sem cache (não é removida nenhuma funcionalidade, mas a velocidade de operação pode ser afectada nas wikis grandes)',
-	'config-cache-accel' => 'Cache de objectos do PHP (APC, XCache ou WinCache)',
+	'config-cache-accel' => 'Cache de objetos do PHP (APC, XCache ou WinCache)',
 	'config-cache-memcached' => 'Usar Memcached (requer instalação e configurações adicionais)',
 	'config-memcached-servers' => 'Servidores Memcached:',
 	'config-memcached-help' => 'Lista de endereços IP que serão usados para o Memcached.
 Deve-se colocar um por linha e indicar a porta a utilizar. Por exemplo:
  127.0.0.1:11211
  192.168.1.25:1234',
-	'config-memcache-needservers' => 'Seleccionou o Memcached como tipo de chache, mas não especificou nenhum servidor.',
+	'config-memcache-needservers' => 'Selecionou o Memcached como tipo de chache, mas não especificou nenhum servidor.',
 	'config-memcache-badip' => 'Introduziu um endereço IP inválido para o Memcached: $1.',
 	'config-memcache-noport' => 'Não especificou a porta a usar para o servidor Memcached: $1.
 Se não sabe qual é a porta, a predefinida é a 11211.',
 	'config-memcache-badport' => 'Os números das portas do Memcached devem estar entre $1 e $2.',
 	'config-extensions' => 'Extensões',
-	'config-extensions-help' => 'Foi detectada a existência das extensões listadas acima, no seu directório <code>./extensions</code>.
+	'config-extensions-help' => 'Foi detectada a existência das extensões listadas acima, no seu diretório <code>./extensions</code>.
 
-Estas talvez necessitem de configurações adicionais, mas pode activá-las agora',
+Estas talvez necessitem de configurações adicionais, mas pode ativá-las agora',
 	'config-install-alreadydone' => "'''Aviso:''' Parece que já instalou o MediaWiki e está a tentar instalá-lo novamente.
 Passe para a próxima página, por favor.",
 	'config-install-begin' => 'Ao clicar "{{int:config-continue}}", vai iniciar a instalação do MediaWiki.
@@ -16480,7 +16990,7 @@ Certifique-se de que o utilizador "$1" pode escrever no esquema \'\'(schema)\'\'
 	'config-pg-no-plpgsql' => 'É preciso instalar a linguagem PL/pgSQL na base de dados $1',
 	'config-pg-no-create-privs' => 'A conta que especificou para a instalação não tem privilégios suficientes para criar uma conta.',
 	'config-pg-not-in-role' => 'A conta que especificou para o utilizador da internet já existe.
-A conta que especificou para a instalação não é a de um super-utilizador e não pertence ao grupo de utilizadores de acesso pela internet, por isso não pode criar objectos que pertencem ao utilizador da internet.
+A conta que especificou para a instalação não é a de um super-utilizador e não pertence ao grupo de utilizadores de acesso pela internet, por isso não pode criar objetos que pertencem ao utilizador da internet.
 
 O MediaWiki necessita que as tabelas pertençam ao utilizador da internet. Especifique outra conta de internet, ou clique "voltar" e especifique um utilizador com os privilégios necessários para a instalação.',
 	'config-install-user' => 'A criar o utilizador da base de dados',
@@ -16489,7 +16999,7 @@ O MediaWiki necessita que as tabelas pertençam ao utilizador da internet. Espec
 	'config-install-user-grant-failed' => 'A atribuição das permissões ao utilizador "$1" falhou: $2',
 	'config-install-user-missing' => 'O utilizador especificado, "$1", não existe.',
 	'config-install-user-missing-create' => 'O utilizador especificado, "$1", não existe.
-Marque a caixa de selecção "criar conta" abaixo se pretende criá-la, por favor.',
+Marque a caixa de seleção "criar conta" abaixo se pretende criá-la, por favor.',
 	'config-install-tables' => 'A criar as tabelas',
 	'config-install-tables-exist' => "'''Aviso''': As tabelas do MediaWiki parecem já existir.
 A criação das tabelas será saltada.",
@@ -16505,7 +17015,7 @@ O preenchimento padrão desta tabela será saltado.",
 	'config-install-subscribe-fail' => 'Não foi possível subscrever a lista mediawiki-announce: $1',
 	'config-install-subscribe-notpossible' => 'cURL não está instalado e allow_url_fopen não está disponível.',
 	'config-install-mainpage' => 'A criar a página principal com o conteúdo padrão.',
-	'config-install-extension-tables' => 'A criar as tabelas das extensões activadas',
+	'config-install-extension-tables' => 'A criar as tabelas das extensões ativadas',
 	'config-install-mainpage-failed' => 'Não foi possível inserir a página principal: $1',
 	'config-install-done' => "'''Parabéns!'''
 Terminou a instalação do MediaWiki.
@@ -16513,7 +17023,7 @@ Terminou a instalação do MediaWiki.
 O instalador gerou um ficheiro <code>LocalSettings.php</code>.
 Este ficheiro contém todas as configurações.
 
-Precisa de fazer o download do ficheiro e colocá-lo no directório de raiz da sua instalação (o mesmo directório onde está o ficheiro index.php). Este download deverá ter sido iniciado automaticamente.
+Precisa de fazer o download do ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o ficheiro index.php). Este download deverá ter sido iniciado automaticamente.
 
 Se o download não foi iniciado, ou se o cancelou, pode recomeçá-lo clicando o link abaixo:
 
@@ -16536,8 +17046,10 @@ Depois de terminar o passo anterior, pode '''[$2 entrar na wiki]'''.",
 );
 
 /** Brazilian Portuguese (português do Brasil)
+ * @author Cainamarques
  * @author Giro720
  * @author Gustavo
+ * @author Luckas
  * @author Marcionunes
  * @author 555
  */
@@ -16549,13 +17061,19 @@ $messages['pt-br'] = array(
 Para atualizar esta instalação, insira no box abaixo o valor de <code>$wgUpgradeKey</code>.
 Essa informação pode ser encontrada no arquivo <code>LocalSettings.php</code>',
 	'config-localsettings-cli-upgrade' => 'Foi detectada a existência do arquivo <code><code>LocalSettings.php</code></code>.
-Esta instalação deverá ser atualizada através do <code>update.php</code>',
+Atualize esta instalação executando o arquivo <code>update.php</code>',
 	'config-localsettings-key' => 'Chave de atualização:',
 	'config-localsettings-badkey' => 'A chave fornecida está incorreta.',
 	'config-upgrade-key-missing' => 'Foi detectada uma instalação existente do MediaWiki.
-Para atualizar esta instalação, por favor, coloque a seguinte linha na parte inferior do seu <code>LocalSettings.php</code>:
+Para atualizar esta instalação, insira a seguinte linha na parte inferior do seu <code>LocalSettings.php</code>:
+
+$1',
+	'config-localsettings-incomplete' => 'O arquivo <code>LocalSettings.php</code> parece incompleto.
+A variável $1 não está definida.
+Altere seu <code>LocalSettings.php</code> com a definição dessa variável e clique em "{{int:Config-continue}}".',
+	'config-localsettings-connection-error' => 'Ocorreu um erro ao conectar ao banco de dados através das configurações presentes ou no <code>LocalSettings.php</code> ou no <code>AdminSettings.php</code>. Corrija essas configurações e tente novamente.
 
-$ 1', # Fuzzy
+$1',
 	'config-session-error' => 'Erro ao iniciar a sessão: $1',
 	'config-session-expired' => 'Os seus dados de sessão parecem ter expirado.
 As sessões estão configuradas para uma duração de $1.
@@ -16563,31 +17081,32 @@ Você pode aumentar esta duração configurando <code>session.gc_maxlifetime</co
 Reinicie o processo de instalação.',
 	'config-no-session' => 'Os seus dados de sessão foram perdidos!
 Verifique o seu php.ini e certifique-se de que em <code>session.save_path</code> está definido um diretório apropriado.',
-	'config-your-language' => 'A sua língua:',
-	'config-your-language-help' => 'Selecione a língua que será usada durante o processo de instalação.',
-	'config-wiki-language' => 'Língua da wiki:',
-	'config-wiki-language-help' => 'Selecione a língua que será predominante na wiki.',
+	'config-your-language' => 'Seu idioma:',
+	'config-your-language-help' => 'Selecione o idioma que será usado durante o processo de instalação.',
+	'config-wiki-language' => 'Idioma do wiki:',
+	'config-wiki-language-help' => 'Selecione o idioma em que o wiki será predominantemente escrito.',
 	'config-back' => '← Voltar',
 	'config-continue' => 'Continuar →',
-	'config-page-language' => 'Língua',
+	'config-page-language' => 'Idioma',
 	'config-page-welcome' => 'Bem-vindo(a) ao MediaWiki!',
-	'config-page-dbconnect' => 'Ligar à base de dados',
+	'config-page-dbconnect' => 'Conectar ao banco de dados',
 	'config-page-upgrade' => 'Atualizar a instalação existente',
-	'config-page-dbsettings' => 'Configurações da base de dados',
+	'config-page-dbsettings' => 'Configurações do banco de dados',
 	'config-page-name' => 'Nome',
 	'config-page-options' => 'Opções',
 	'config-page-install' => 'Instalar',
-	'config-page-complete' => 'Terminado!',
+	'config-page-complete' => 'Concluído!',
 	'config-page-restart' => 'Reiniciar a instalação',
 	'config-page-readme' => 'Leia-me',
 	'config-page-releasenotes' => 'Notas de lançamento',
 	'config-page-copying' => 'Copiando',
 	'config-page-upgradedoc' => 'Atualizando',
+	'config-page-existingwiki' => 'Wiki existente',
 	'config-help-restart' => 'Deseja limpar todos os dados salvos que você introduziu e reiniciar o processo de instalação?',
 	'config-restart' => 'Sim, reiniciar',
-	'config-welcome' => '=== Verificações do ambiente ===
-São realizadas verificações básicas para determinar se este ambiente é apropriado para instalação do MediaWiki.
-Você deverá fornecer os resultados destas verificações se você precisar de ajuda durante a instalação.',
+	'config-welcome' => '=== Verificações de ambiente ===
+São realizadas verificações básicas para determinar se este ambiente é apropriado para a instalação do MediaWiki.
+Lembre-se de incluir estas informações se for procurar por suporte para a conclusão da instalação.',
 	'config-copyright' => "=== Direitos autorais e Termos de uso ===
 
 $1
@@ -16598,28 +17117,52 @@ Este programa é distribuído na esperança de que seja útil, mas '''sem qualqu
 Consulte a licença GNU General Public License para mais detalhes.
 
 Em conjunto com este programa você deve ter recebido <doclink href=Copying>uma cópia da licença GNU General Public License</doclink>; se não a recebeu, peça-a por escrito para Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [http://www.gnu.org/copyleft/gpl.html leia-a na internet].",
-	'config-sidebar' => '* [//www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]
-* [//www.mediawiki.org/wiki/Help:Contents/pt Ajuda]
-* [//www.mediawiki.org/wiki/Manual:Contents/pt Manual técnico]
-* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]', # Fuzzy
+	'config-sidebar' => '* [//www.mediawiki.org/wiki/MediaWiki Página principal do MediaWiki]
+* [//www.mediawiki.org/wiki/Help:Contents Manual de uso]
+* [//www.mediawiki.org/wiki/Manual:Contents Manual administrativo]
+* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]
+----
+* <doclink href=Readme>Leia-me</doclink>
+* <doclink href=ReleaseNotes>Notas de lançamento</doclink>
+* <doclink href=Copying>Licença</doclink>
+* <doclink href=UpgradeDoc>Como fazer upgrade</doclink>',
 	'config-env-good' => 'O ambiente foi verificado.
 Você pode instalar o MediaWiki.',
 	'config-env-bad' => 'O ambiente foi verificado.
 Você não pode instalar o MediaWiki.',
 	'config-env-php' => 'O PHP $1 está instalado.',
-	'config-unicode-using-utf8' => 'A usar o utf8_normalize.so, de Brian Viper, para a normalização Unicode.',
+	'config-unicode-using-utf8' => 'Usando o utf8_normalize.so, de Brion Vibber, para a normalização Unicode.',
 	'config-unicode-using-intl' => 'Usando a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.',
-	'config-unicode-pure-php-warning' => "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode.
-Se o seu site tem um alto volume de tráfego, devia informar-se um pouco sobre a [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalização Unicode].", # Fuzzy
-	'config-no-db' => 'Não foi possível encontrar um driver de banco de dados adequado!', # Fuzzy
+	'config-unicode-pure-php-warning' => "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode sendo usada, em seu lugar, a lenta implementação de PHP puro.
+Se o seu site tem um alto volume de tráfego, informe-se sobre a [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalização Unicode].",
+	'config-no-db' => 'Não foi possível encontrar um driver de banco de dados adequado! É necessário instalar um driver de banco de dados para o PHP.
+São suportados os seguintes tipos de bancos de dados: $1.
+
+Se estiver em uma hospedagem partilhada, peça à sua empresa de hospedagem para instalar um driver de banco de dados adequado.
+Se você mesmo tiver compilado o PHP, reconfigure-o com um cliente de banco de dados ativado usando, por exemplo, <code>./configure --with-mysql</code>.
+Se você instalou o PHP a partir de um pacote do Debian ou do Ubuntu, instale também o módulo php5-mysql.',
 	'config-no-fts3' => "' ' 'Aviso' ' ': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
 	'config-register-globals' => "' ' 'Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.'''
 ' ' 'Desative-a, se puder.'''
 O MediaWiki funcionará mesmo assim, mas o seu servidor ficará exposto a potenciais vulnerabilidades de segurança.",
-	'config-logo-help' => 'O tema padrão do MediaWiki inclui espaço para um logotipo de 135x160 pixels no canto superior esquerdo.
-Faça o upload de uma imagem com estas dimensões e introduza aqui a URL dessa imagem.
+	'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binary',
+	'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+	'config-mysql-innodb' => 'InnoDB',
+	'config-mysql-myisam' => 'MyISAM',
+	'config-mysql-binary' => 'Binary',
+	'config-mysql-utf8' => 'UTF-8',
+	'config-ns-generic' => 'Projeto',
+	'config-admin-box' => 'Conta de administrador',
+	'config-admin-name' => 'Seu nome:',
+	'config-admin-password' => 'Senha:',
+	'config-license-pd' => 'Domínio público',
+	'config-logo-help' => 'Faça o upload de uma imagem de tamanho adequado e insira seu URL aqui.
 
-Se você não pretende usar um logotipo, deixe este campo em branco.', # Fuzzy
+Você pode usar <code>$wgStylePath</code> ou <code>$wgScriptPath</code> se o seu logotipo for associado a esses diretórios.',
+	'config-advanced-settings' => 'Configuração avançada',
+	'config-extensions' => 'Extensões',
+	'config-install-step-done' => 'feito',
+	'config-help' => 'ajuda',
 	'mainpagetext' => "'''MediaWiki instalado com sucesso.'''",
 	'mainpagedocfooter' => 'Consulte o [//meta.wikimedia.org/wiki/Help:Contents Manual de Usuário] para informações de como usar o software wiki.
 
@@ -16627,7 +17170,8 @@ Se você não pretende usar um logotipo, deixe este campo em branco.', # Fuzzy
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de opções de configuração]
 * [//www.mediawiki.org/wiki/Manual:FAQ FAQ do MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]', # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Traduza o MediaWiki para seu idioma]',
 );
 
 /** Quechua (Runa Simi)
@@ -16672,7 +17216,7 @@ $messages['rm'] = array(
 == Cumenzar ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Glista da las opziuns per la configuraziun]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Glista da mail da MediaWiki cun annunzias da novas versiuns]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Glista da mail da MediaWiki cun annunzias da novas versiuns]", # Fuzzy
 );
 
 /** Romanian (română)
@@ -16729,12 +17273,10 @@ Totuși, MediaWiki necesită PHP $2 sau mai nou.',
 	'config-sqlite-dir' => 'Director de date SQLite:',
 	'config-oracle-def-ts' => 'Spațiu de stocare („tablespace”) implicit:',
 	'config-oracle-temp-ts' => 'Spațiu de stocare („tablespace”) temporar:',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-header-mysql' => 'Setările MySQL',
 	'config-header-postgres' => 'Setări PostgreSQL',
 	'config-header-sqlite' => 'Setări SQLite',
 	'config-header-oracle' => 'Setări Oracle',
-	'config-header-ibm_db2' => 'Setări IBM DB2',
 	'config-invalid-db-type' => 'Tip de bază de date incorect',
 	'config-missing-db-name' => 'Trebuie să introduci o valoare pentru „Numele bazei de date”',
 	'config-connection-error' => '$1.
@@ -16743,7 +17285,7 @@ Verificați gazda, numele de utilizator și parola și reîncercați.',
 	'config-upgrade-done-no-regenerate' => 'Actualizare completă.
 
 Acum puteți [$1 începe să vă folosiți wikiul].',
-	'config-regenerate' => 'Regenerare <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Regenerare LocalSettings.php →',
 	'config-unknown-collation' => 'AVERTISMENT: Baza de date folosește o colaționare nerecunoscută.',
 	'config-db-web-account' => 'Contul bazei de date pentru accesul web.',
 	'config-db-web-create' => 'Creați contul dacă nu există deja',
@@ -16829,8 +17371,29 @@ $messages['roa-tara'] = array(
 	'config-title' => 'Installazzione de MediaUicchi $1',
 	'config-information' => "'Mbormaziune",
 	'config-localsettings-key' => 'Chiave de aggiornamende:',
+	'config-localsettings-badkey' => "'A chiave ca è date non g'è corrette.",
+	'config-session-error' => "Errore facenne accumenzà 'a sessione: $1",
+	'config-your-language' => "'A lènga toje:",
+	'config-your-language-help' => "Scacchie 'na lènghe da ausà duranne 'u processe de installazzione:",
+	'config-wiki-language' => 'Lènga de Uicchi:',
+	'config-back' => '← Rrète',
+	'config-continue' => 'Condinue →',
 	'config-page-language' => 'Lènghe',
+	'config-page-welcome' => "Bovègne jndr'à MediaUicchi!",
+	'config-page-dbconnect' => "Collegate a 'u database",
+	'config-page-upgrade' => "Aggiorne l'installazzione esistende",
+	'config-page-dbsettings' => "'Mbostaziune d'u database",
 	'config-page-name' => 'Nome',
+	'config-page-options' => 'Opziune',
+	'config-page-install' => 'Installe',
+	'config-page-complete' => 'Combletate!',
+	'config-page-restart' => "Riavvie l'installazzione",
+	'config-page-readme' => 'Liggeme',
+	'config-page-releasenotes' => 'Note de rilasce',
+	'config-page-copying' => 'Stoche a copie',
+	'config-page-upgradedoc' => 'Aggiornamende',
+	'config-page-existingwiki' => 'Uicchi esistende',
+	'config-db-type' => 'Tipe de database:',
 	'config-db-charset' => "'Nzieme de carattere d'u database",
 	'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binary',
 	'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
@@ -16841,6 +17404,8 @@ $messages['roa-tara'] = array(
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
+	'config-mysql-innodb' => 'InnoDB',
+	'config-mysql-myisam' => 'MyISAM',
 	'config-admin-email' => 'Indirizze e-mail:',
 	'config-install-step-done' => 'fatte',
 	'config-install-step-failed' => 'fallite',
@@ -16864,10 +17429,12 @@ $messages['roa-tara'] = array(
  * @author DCamer
  * @author Eleferen
  * @author Express2000
+ * @author KPu3uC B Poccuu
  * @author Kaganer
  * @author Krinkle
  * @author Lockal
  * @author MaxSem
+ * @author Okras
  * @author Yuriy Apostol
  * @author Александр Сигачёв
  * @author Сrower
@@ -16925,8 +17492,8 @@ $1',
 	'config-help-restart' => 'Вы хотите удалить все сохранённые данные, которые вы ввели, и запустить процесс установки заново?',
 	'config-restart' => 'Да, начать заново',
 	'config-welcome' => '=== Проверка окружения ===
-Проводятся базовые проверки с целью определить, подходит ли данная система для установки MediaWiki.
-Укажите результаты этих проверок при обращении за помощью с установкой.',
+Будут проведены базовые проверки с целью определить, подходит ли данная система для установки MediaWiki.
+Не забудьте включить эту информацию, если вам потребуется помощь для завершения установки.',
 	'config-copyright' => "=== Авторские права и условия ===
 
 $1
@@ -16993,6 +17560,11 @@ MediaWiki требует поддержки UTF-8 для корректной р
 	'config-memory-bad' => "'''Внимание:''' размер PHP <code>memory_limit</code> составляет $1.
 Вероятно, этого слишком мало.
 Установка может потерпеть неудачу!",
+	'config-ctype' => "'''Фатальная ошибка:''' PHP должен быть скомпилирован с поддержкой [http://www.php.net/manual/ru/ctype.installation.php расширения Ctype].",
+	'config-json' => "'''Фатальная ошибка:''' PHP был скомпилирован без поддержка JSON.
+Вам необходимо установить либо расширение PHP JSON, либо расширение [http://pecl.php.net/package/jsonc PECL jsonc] перед установкой MediaWiki.
+* PHP-расширение входит в состав Red Hat Enterprise Linux (CentOS) 5 и 6, хотя должна быть включено в <code>/etc/php.ini</code> или <code>/etc/php.d/json.ini</code>.
+* Некоторые дистрибутивы Linux, выпущенные после мая 2013 года, не включают расширение PHP, вместо того, чтобы упаковывать расширение PECL как <code>php5-json</code> или <code>php-pecl-jsonc</code>.",
 	'config-xcache' => '[http://xcache.lighttpd.net/ XCache] установлен',
 	'config-apc' => '[http://www.php.net/apc APC] установлен',
 	'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] установлен',
@@ -17001,6 +17573,8 @@ MediaWiki требует поддержки UTF-8 для корректной р
 	'config-mod-security' => "'''Внимание''': на вашем веб-сервере включен [http://modsecurity.org/ mod_security]. При неправильной настройке он может вызывать проблемы для MediaWiki или другого ПО, позволяющего пользователям отправлять на сервер произвольный текст.
 Обратитесь к [http://modsecurity.org/documentation/ документации mod_security] или в поддержку вашего хостера, если при работе возникают непонятные ошибки.",
 	'config-diff3-bad' => 'GNU diff3 не найден.',
+	'config-git' => 'Найдена система контроля версий Git: <code>$1</code>.',
+	'config-git-bad' => 'Программное обеспечение по управлению версиями Git не найдено.',
 	'config-imagemagick' => 'Обнаружен ImageMagick: <code>$1</code>.
 Возможно отображение миниатюр изображений, если вы разрешите закачки файлов.',
 	'config-gd' => 'Найдена встроенная графическая библиотека GD.
@@ -17022,7 +17596,7 @@ MediaWiki требует поддержки UTF-8 для корректной р
 	'config-using531' => 'PHP $1 не совместим с MediaWiki из-за ошибки с параметрами-ссылками при вызовах <code>__call()</code>.
 Обновитесь до PHP 5.3.2 и выше, или откатитесь до PHP 5.3.0, чтобы избежать этой проблемы.
 Установка прервана.',
-	'config-suhosin-max-value-length' => 'Suhosin установлен и ограничивает длину параметра GET до $1 байт. Компонент MediaWiki ResourceLoader будет обходить это ограничение, но это снизит производительность. Если это возможно, следует установить <code>suhosin.get.max_value_length</code> 1024 или выше в <code>php.ini</code>, а также установить для <code>$wgResourceLoaderMaxQueryLength</code> такое же значение в LocalSettings.php.', # Fuzzy
+	'config-suhosin-max-value-length' => 'Suhosin установлен и ограничивает параметр GET <code>length</code> до $1 байт. Компонент MediaWiki ResourceLoader будет обходить это ограничение, но это снизит производительность. Если это возможно, следует установить <code>suhosin.get.max_value_length</code> в значение 1024 или выше в <code>php.ini</code>, а также установить для <code>$wgResourceLoaderMaxQueryLength</code> такое же значение в LocalSettings.php.',
 	'config-db-type' => 'Тип базы данных:',
 	'config-db-host' => 'Хост базы данных:',
 	'config-db-host-help' => 'Если сервер базы данных находится на другом сервере, введите здесь его имя хоста или IP-адрес.
@@ -17098,7 +17672,6 @@ MediaWiki требует поддержки UTF-8 для корректной р
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'MediaWiki поддерживает следующие СУБД:
 
 $1
@@ -17108,18 +17681,16 @@ $1
 	'config-support-postgres' => '* $1 — популярная открытая СУБД, альтернатива MySQL ([http://www.php.net/manual/en/pgsql.installation.php инструкция, как собрать PHP с поддержкой PostgreSQL]). Могут встречаться небольшие неисправленные ошибки, не рекомендуется для использования в рабочей системе.',
 	'config-support-sqlite' => '* $1 — это легковесная система баз данных, имеющая очень хорошую поддержку. ([http://www.php.net/manual/en/pdo.installation.php инструкция, как собрать PHP с поддержкой SQLite], работающей посредством PDO)',
 	'config-support-oracle' => '* $1 — это коммерческая база данных масштаба предприятия. ([http://www.php.net/manual/en/oci8.installation.php Как собрать PHP с поддержкой OCI8])',
-	'config-support-ibm_db2' => '$1 — коммерческая база данных масштаба предприятия.', # Fuzzy
 	'config-header-mysql' => 'Настройки MySQL',
 	'config-header-postgres' => 'Настройки PostgreSQL',
 	'config-header-sqlite' => 'Настройки SQLite',
 	'config-header-oracle' => 'Настройки Oracle',
-	'config-header-ibm_db2' => 'Настройки IBM DB2',
 	'config-invalid-db-type' => 'Неверный тип базы данных',
 	'config-missing-db-name' => 'Вы должны ввести значение параметра «Имя базы данных»',
 	'config-missing-db-host' => 'Необходимо ввести значение параметра «Сервер базы данных»',
 	'config-missing-db-server-oracle' => 'Вы должны заполнить поле «TNS базы данных»',
-	'config-invalid-db-server-oracle' => 'Неверное имя TNS базы данных «$1».
-Используйте только символы ASCII (a-z, A-Z), цифры (0-9), знаки подчёркивания (_) и точки (.).',
+	'config-invalid-db-server-oracle' => 'Неверное TNS базы данных «$1».
+Используйте либо «TNS Name», либо строку «Easy Connect» ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методы наименования Oracle])',
 	'config-invalid-db-name' => 'Неверное имя базы данных «$1».
 Используйте только ASCII-символы (a-z, A-Z), цифры (0-9), знак подчёркивания (_) и дефис(-).',
 	'config-invalid-db-prefix' => 'Неверный префикс базы данных «$1».
@@ -17175,7 +17746,7 @@ chmod a+w $3</pre>',
 	'config-upgrade-done-no-regenerate' => 'Обновление завершено.
 
 Теперь вы можете [$1 начать работу с вики].',
-	'config-regenerate' => 'Создать <code>LocalSettings.php</code> заново →',
+	'config-regenerate' => 'Создать LocalSettings.php заново →',
 	'config-show-table-status' => 'Запрос «<code>SHOW TABLE STATUS</code>» не выполнен!',
 	'config-unknown-collation' => "'''Внимание:''' База данных использует нераспознанные правила сортировки.",
 	'config-db-web-account' => 'Учётная запись для доступа к базе данных из веб-сервера',
@@ -17194,6 +17765,12 @@ chmod a+w $3</pre>',
 
 Если ваша установка MySQL поддерживает InnoDB, настоятельно рекомендуется выбрать этот механизм.
 Если ваша установка MySQL не поддерживает InnoDB, возможно, настало время обновиться.",
+	'config-mysql-only-myisam-dep' => "'''Предупреждение:''' MyISAM является единственной доступной системой хранения данных для MySQL, которая, однако, не рекомендуется для использования с MediaWiki, потому что:
+ * он слабо поддерживает параллелизм из-за блокировки таблиц
+ * она больше других систем подвержена повреждению
+ * кодовая база MediaWiki не всегда обрабатывает MyISAM так, как следует
+
+Ваша MySQL не поддерживает InnoDB, так что, возможно, настало время для обновления.",
 	'config-mysql-engine-help' => "'''InnoDB''' почти всегда предпочтительнее, так как он лучше справляется с параллельным доступом.
 
 '''MyISAM''' может оказаться быстрее для вики с одним пользователем или с минимальным количеством поступающих правок, однако базы данных на нём портятся чаще, чем на InnoDB.",
@@ -17204,7 +17781,6 @@ chmod a+w $3</pre>',
 Это более эффективно, чем ''UTF-8 режим'' MySQL, и позволяет использовать полный набор символов Unicode.
 
 В '''режиме UTF-8''' MySQL будет знать в какой кодировке находятся Ваши данные и может отображать и преобразовывать их соответствующим образом, но это не позволит вам хранить символы выше [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базовой Многоязыковой Плоскости].",
-	'config-ibm_db2-low-db-pagesize' => "В вашей базе данных DB2 по умолчанию задано табличное пространство с недостаточным размером страницы. Размер страницы должен быть не менее '''32K'''.",
 	'config-site-name' => 'Название вики:',
 	'config-site-name-help' => 'Название будет отображаться в заголовке окна браузера и в некоторых других местах вики.',
 	'config-site-name-blank' => 'Введите название сайта.',
@@ -17311,6 +17887,8 @@ GFDL может быть использована, но она сложна дл
 	'config-logo-help' => 'Стандартная тема оформления MediaWiki содержит над боковой панелью пространство для логотипа размером 135x160 пикселей.
 Загрузите изображение соответствующего размера, и введите его URL здесь.
 
+Вы можете использовать <code>$wgStylePath</code> или <code>$wgScriptPath</code>, если ваш логотип находится относительно к этим путям.
+
 Если вам не нужен логотип, оставьте это поле пустым.',
 	'config-instantcommons' => 'Включить Instant Commons',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] — это функция, позволяющая использовать изображения, звуки и другие медиафайлы с Викисклада ([//commons.wikimedia.org/ Wikimedia Commons]).
@@ -17404,6 +17982,9 @@ $3
 	'config-download-localsettings' => 'Загрузить <code>LocalSettings.php</code>',
 	'config-help' => 'справка',
 	'config-nofile' => 'Файл "$1" не удается найти. Он был удален?',
+	'config-extension-link' => 'Знаете ли вы, что ваш вики-проект поддерживает [//www.mediawiki.org/wiki/Manual:Extensions расширения]?
+
+Вы можете просмотреть [//www.mediawiki.org/wiki/Category:Extensions_by_category расширения по категориям] или [//www.mediawiki.org/wiki/Extension_Matrix матрицу расширений], чтобы увидеть их полный список.',
 	'mainpagetext' => "'''Вики-движок «MediaWiki» успешно установлен.'''",
 	'mainpagedocfooter' => 'Информацию по работе с этой вики можно найти в [//meta.wikimedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5 справочном руководстве].
 
@@ -17425,7 +18006,7 @@ $messages['rue'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Наставлїня конфіґурації]
 * [//www.mediawiki.org/wiki/Manual:FAQ Часты вопросы о MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розосыланя повідомлїнь про новы верзії MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розосыланя повідомлїнь про новы верзії MediaWiki]', # Fuzzy
 );
 
 /** Sanskrit (संस्कृतम्)
@@ -17445,7 +18026,7 @@ $messages['sah'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Конфигурация уларытыытын параметрдара]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki релизтарын почтовай испииһэгэ]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki релизтарын почтовай испииһэгэ]', # Fuzzy
 );
 
 /** Sardinian (sardu)
@@ -17464,7 +18045,7 @@ $messages['scn'] = array(
 == P'accuminzari ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Alencu di mpustazzioni di cunfigurazzioni]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list dî rilassi di MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list dî rilassi di MediaWiki]", # Fuzzy
 );
 
 /** Scots (Scots)
@@ -17477,7 +18058,7 @@ $messages['sco'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settins leet]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki releese mailin leet]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki releese mailin leet]", # Fuzzy
 );
 
 /** Sassaresu (Sassaresu)
@@ -17491,7 +18072,7 @@ Li sighenti cullegamenti so in linga ingrese:
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Impusthazioni di cunfigurazioni]
 * [//www.mediawiki.org/wiki/Manual:FAQ Prigonti friquenti i MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annùnzii MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annùnzii MediaWiki]", # Fuzzy
 );
 
 /** Cmique Itom (Cmique Itom)
@@ -17510,7 +18091,7 @@ $messages['sh'] = array(
 == Početak ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista postavki]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki najčešće postavljana pitanja]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]', # Fuzzy
 );
 
 /** Tachelhit (Tašlḥiyt/ⵜⴰⵛⵍⵃⵉⵜ)
@@ -17523,7 +18104,7 @@ $messages['shi'] = array(
 == Izwir d MediaWiki ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Umuɣ n iɣwwarn n usgadda ]
 * [//www.mediawiki.org/wiki/Manual:FAQ/fr Isqqsitn f MidyWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Umuɣ n imsgdaln f imbḍitn n MidyaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Umuɣ n imsgdaln f imbḍitn n MidyaWiki]', # Fuzzy
 );
 
 /** Sinhala (සිංහල)
@@ -17577,17 +18158,15 @@ $messages['si'] = array(
 	'config-sqlite-dir' => 'SQLite දත්ත නාමවලිය:',
 	'config-oracle-def-ts' => 'සාමාන්‍ය වගු අවකාශය:',
 	'config-oracle-temp-ts' => 'තාවකාලික වගු අවකාශය:',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-header-mysql' => 'MySQL සැකසුම්',
 	'config-header-postgres' => 'PostgreSQL සැකසුම්',
 	'config-header-sqlite' => 'SQLite සැකසුම්',
 	'config-header-oracle' => 'ඔරකල් සැකසුම්',
-	'config-header-ibm_db2' => 'IBM DB2 සැකසුම්',
 	'config-invalid-db-type' => 'වලංගු නොවන දත්ත සංචිත වර්ගය',
 	'config-missing-db-name' => '"දත්ත සංචිත නාමය" සඳහා ඔබ විසින් අගයක් දිය යුතු වේ',
 	'config-missing-db-host' => '"දත්ත සංචිත ධාරකය" සඳහා ඔබ විසින් අගයක් දිය යුතු වේ',
 	'config-missing-db-server-oracle' => '"දත්ත සංචිත TNS" සඳහා ඔබ විසින් අගයක් දිය යුතු වේ',
-	'config-regenerate' => 'නැවත ජනිත කරන්න <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'නැවත ජනිත කරන්න LocalSettings.php →',
 	'config-db-web-account' => 'ජාල ප්‍රවේශනය සඳහා දත්ත සංචිත ගිණුම',
 	'config-mysql-engine' => 'ආචයන එන්ජිම:',
 	'config-mysql-innodb' => 'InnoDB',
@@ -17741,8 +18320,8 @@ Preverite vaš php.ini in se prepričajte, da je <code>session.save_path</code>
 	'config-help-restart' => 'Želite počistiti vse shranjene podatke, ki ste jih vnesti, in ponovno začeti s postopkom namestitve?',
 	'config-restart' => 'Da, ponovno zaženi',
 	'config-welcome' => '=== Pregledi okolja ===
-Izvedeni so osnovni pregledi, da vidimo, če je okolje primerno za namestitev MediaWiki.
-Če med namestitvijo potrebujete pomoč, posredujte tudi rezultate teh pregledov.',
+Izvedli bomo osnovne preglede, da vidimo, če je okolje primerno za namestitev MediaWiki.
+Posredujte rezultate teh pregledov, če med namestitvijo potrebujete pomoč.',
 	'config-sidebar' => '* [//www.mediawiki.org Domača stran MediaWiki]
 * [//www.mediawiki.org/wiki/Help:Contents Vodnik za uporabnike]
 * [//www.mediawiki.org/wiki/Manual:Contents Vodnik za administratorje]
@@ -17785,7 +18364,6 @@ Vendar pa MediaWiki zahteva PHP $2 ali višji.',
 	'config-db-schema-help' => 'Ta shema je po navadi v redu.
 Spremenite jo samo, če veste, da jo morate.',
 	'config-sqlite-dir' => 'Mapa podatkov SQLite:',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'MediaWiki podpira naslednje sisteme zbirk podatkov:
 
 $1
@@ -17795,13 +18373,12 @@ $1
 	'config-header-postgres' => 'Nastavitve PostgreSQL',
 	'config-header-sqlite' => 'Nastavitve SQLite',
 	'config-header-oracle' => 'Nastavitve Oracle',
-	'config-header-ibm_db2' => 'Nastavitve IBM DB2',
 	'config-invalid-db-type' => 'Neveljavna vrsta zbirke podatkov',
 	'config-missing-db-name' => 'Vnesti morate vrednost za »Ime zbirke podatkov«',
 	'config-missing-db-host' => 'Vnesti morate vrednost za »Gostitelj zbirke podatkov«',
 	'config-missing-db-server-oracle' => 'Vnesti morate vrednost za »TNS zbirke podatkov«',
 	'config-invalid-db-server-oracle' => 'Neveljaven TNS zbirke podatkov »$1«.
-Uporabljajte samo črke ASCII (a-z, A-Z), številke (0-9), podčrtaje (_) in pike (.).',
+Uporabite ali "ime TNS" ali niz "Easy Connect" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Načini poimenovanja Oracle])',
 	'config-invalid-db-name' => 'Neveljavno ime zbirke podatkov »$1«.
 Uporabljajte samo črke ASCII (a-z, A-Z), številke (0-9), podčrtaje (_) in vezaje (-).',
 	'config-invalid-db-prefix' => 'Neveljavna predpona zbirke podatkov »$1«.
@@ -17818,7 +18395,7 @@ Preverite mapo podatkov in ime zbirke podatkov spodaj ter poskusite znova.',
 	'config-upgrade-done-no-regenerate' => 'Nadgradnja je končana.
 
 Sedaj lahko [$1 začnete uporabljati vaš wiki].',
-	'config-regenerate' => 'Ponovno ustvari <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Ponovno ustvari LocalSettings.php →',
 	'config-show-table-status' => 'Poizvedba <code>SHOW TABLE STATUS</code> ni uspela!',
 	'config-unknown-collation' => "'''Opozorilo:''' Zbirke podatkov uporablja neprepoznano razvrščanje znakov.",
 	'config-db-web-account' => 'Račun zbirke podatkov za spletni dostop',
@@ -17860,7 +18437,7 @@ Določite drugo uporabniško ime.',
 	'config-admin-error-bademail' => 'Vnesli ste neveljaven e-poštni naslov.',
 	'config-subscribe' => 'Naročite se na [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce poštni seznam obvestil o izdajah].',
 	'config-almost-done' => 'Skoraj ste že končali!
-Sedaj lahko preskočite preostalo konfiguriranje in zdaj namestite wiki.',
+Preostalo konfiguriranje lahko zdaj preskočite in wiki takoj namestite.',
 	'config-optional-continue' => 'Zastavi mi več vprašanj.',
 	'config-optional-skip' => 'Se že dolgočasim; samo namesti wiki.',
 	'config-profile' => 'Profil uporabniških pravic:',
@@ -17906,8 +18483,13 @@ Vnesite ime dovoljenja ročno.',
 	'config-download-localsettings' => 'Prenesi <code>LocalSettings.php</code>',
 	'config-help' => 'pomoč',
 	'mainpagetext' => "'''Programje MediaWiki je bilo uspešno nameščeno.'''",
-	'mainpagedocfooter' => 'Za uporabo in pomoč pri nastavitvi, prosimo, preglejte [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentacijo za prilagajanje vmesnika]
-in [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Uporabniški priročnik].', # Fuzzy
+	'mainpagedocfooter' => 'Oglejte si [//meta.wikimedia.org/wiki/Help:Contents Uporabniški priročnik] za informacije o uporabi programja wiki.
+
+== Kako začeti ==
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Seznam konfiguracijskih nastavitev]
+* [//www.mediawiki.org/wiki/Manual:FAQ Poogsto zastavljena vprašanja MediaWiki]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Poštni seznam izdaj MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Prevedite MediaWiki v svoj jezik]',
 );
 
 /** Lower Silesian (Schläsch)
@@ -17921,7 +18503,7 @@ $messages['sli'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]', # Fuzzy
 );
 
 /** Somali (Soomaaliga)
@@ -17933,7 +18515,7 @@ $messages['so'] = array(
 == Bilaaw ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Albanian (shqip)
@@ -17945,7 +18527,7 @@ $messages['sq'] = array(
 == Sa për fillim==
 * [//www.mediawiki.org/wiki/Help:Configuration_settings Parazgjedhjet e MediaWiki-t]
 * [//www.mediawiki.org/wiki/Help:FAQ Pyetjet e shpeshta rreth MediaWiki-t]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWiki-t]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWiki-t]', # Fuzzy
 );
 
 /** Serbian (Cyrillic script) (српски (ћирилица)‎)
@@ -17991,7 +18573,7 @@ $messages['sr-ec'] = array(
 == Увод ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Помоћ у вези са подешавањима]
 * [//www.mediawiki.org/wiki/Manual:FAQ Често постављена питања]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]', # Fuzzy
 );
 
 /** Serbian (Latin script) (srpski (latinica)‎)
@@ -18035,7 +18617,7 @@ Proverite Vaš php.ini i obezbedite da je <code>session.save_path</code> postavl
 == Za početak ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Pomoć u vezi sa podešavanjima]
 * [//www.mediawiki.org/wiki/Manual:FAQ Najčešće postavljena pitanja]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mejling lista o izdanjima MedijaVikija]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mejling lista o izdanjima MedijaVikija]', # Fuzzy
 );
 
 /** Sranan Tongo (Sranantongo)
@@ -18048,7 +18630,7 @@ $messages['srn'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Den seti]
 * [//www.mediawiki.org/wiki/Manual:FAQ Sani di ben aksi furu (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Boskopu grupu gi nyun meki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Boskopu grupu gi nyun meki]', # Fuzzy
 );
 
 /** Swati (SiSwati)
@@ -18062,17 +18644,18 @@ $messages['ss'] = array(
  */
 $messages['stq'] = array(
 	'mainpagetext' => "'''Ju MediaWiki Software wuude mäd Ärfoulch installierd.'''",
-	'mainpagedocfooter' => 'Sjuch ju [//meta.wikimedia.org/wiki/MediaWiki_localization Dokumentation tou de Anpaasenge fon dän Benutseruurfläche] un dät [//meta.wikimedia.org/wiki/Help:Contents Benutserhondbouk] foar Hälpe tou ju Benutsenge un Konfiguration.',
+	'mainpagedocfooter' => 'Sjuch ju [//meta.wikimedia.org/wiki/MediaWiki_localization Dokumentation tou de Anpaasenge fon dän Benutseruurfläche] un dät [//meta.wikimedia.org/wiki/Help:Contents Benutserhondbouk] foar Hälpe tou ju Benutsenge un Konfiguration.', # Fuzzy
 );
 
 /** Sundanese (Basa Sunda)
  */
 $messages['su'] = array(
 	'mainpagetext' => "'''''Software'' MediaWiki geus diinstal.'''",
-	'mainpagedocfooter' => "Mangga tingal ''[//meta.wikimedia.org/wiki/MediaWiki_localisation documentation on customizing the interface]'' jeung [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Tungtunan Pamaké] pikeun pitulung maké jeung konfigurasi.",
+	'mainpagedocfooter' => "Mangga tingal ''[//meta.wikimedia.org/wiki/MediaWiki_localisation documentation on customizing the interface]'' jeung [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Tungtunan Pamaké] pikeun pitulung maké jeung konfigurasi.", # Fuzzy
 );
 
 /** Swedish (svenska)
+ * @author Jopparn
  * @author Skalman
  * @author WikiPhoenix
  */
@@ -18080,8 +18663,20 @@ $messages['sv'] = array(
 	'config-desc' => 'Installationsprogram för MediaWiki',
 	'config-title' => 'Installation av MediaWiki $1',
 	'config-information' => 'Information',
+	'config-localsettings-upgrade' => 'A <code>LocalSettings.php</code>-fil har upptäckts.
+För att uppgradera den här installationen, vänligen ange värdet för <code>$wgUpgradeKey</code> i rutan nedan.
+Du hittar den i <code>LocalSettings.php</code>.',
+	'config-localsettings-cli-upgrade' => 'En <code>LocalSettings.php</code>-fil har upptäckts.
+För att uppgradera denna installation, kör <code>update.php</code> istället',
 	'config-localsettings-key' => 'Uppgraderingsnyckel:',
 	'config-localsettings-badkey' => 'Nyckeln du angav är inkorrekt.',
+	'config-upgrade-key-missing' => 'En nuvarande installerade av MediaWiki har upptäckts.
+För att uppgradera installationen, lägg till följande rad i slutet av din <code>LocalSettings.php</code>:
+
+$1',
+	'config-localsettings-incomplete' => 'De befintliga <code>LocalSettings.php</code> verkar vara ofullständig.
+Variabeln $1 är inte inställd.
+Ändra <code>LocalSettings.php</code> så att denna variabel är inställd och klicka på "{{int:Config-continue}}".',
 	'config-session-error' => 'Fel vid uppstart av session: $1',
 	'config-your-language' => 'Ditt språk:',
 	'config-your-language-help' => 'Välj ett språk som ska användas under installationen.',
@@ -18122,21 +18717,50 @@ Du kan inte installera MediaWiki.',
 	'config-env-php' => 'PHP $1 är installerad.',
 	'config-env-php-toolow' => 'PHP $1 är installerad.
 MediaWiki kräver PHP $2 eller högre.',
+	'config-outdated-sqlite' => "'''Varning:''' du har SQLite $1, vilket är lägre än minimikravet version $2. SQLite kommer inte att vara tillgänglig.",
+	'config-register-globals' => "'''Varning: PHP:s <code>[http://php.net/register_globals register_globals]</code> tillval är aktiverat.'''
+'''Inaktivera den om du kan.'''
+MediaWiki kommer att fungera, men din server exponeras för potentiella säkerhetsluckor.",
+	'config-safe-mode' => "''' Varning:''' PHP:s [http://www.php.net/features.safe-mode felsäkert läge] är aktivt.
+Det kan orsaka problem, särskilt om du använder filöverföringar och <code>math</code>-stöd.",
+	'config-xml-bad' => 'PHP:s XML-modul saknas.
+MediaWiki kräver funktioner i denna modul och kommer inte att fungera i den här konfigurationen.
+Om du kör Mandrake, installera php-xml-paketet.',
+	'config-memory-raised' => 'PHPs <code>memory_limit</code> är $1, ökar till $2.',
+	'config-memory-bad' => "''' Varning:''' PHP:s <code>memory_limit</code> är $1.
+Detta är förmodligen för lågt.
+Installationen kan misslyckas!",
 	'config-xcache' => '[http://xcache.lighttpd.net/ XCache] är installerad',
 	'config-apc' => '[http://www.php.net/apc APC] är installerad',
 	'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] är installerad',
 	'config-diff3-bad' => 'GNU diff3 hittades inte.',
+	'config-git-bad' => 'Git-versionen av kontrollmjukvaran hittades inte.',
+	'config-no-uri' => "'''Fel:''' Kunde inte fastställa det nuvarande URI:et.
+Installationen avbröts.",
+	'config-no-cli-uri' => "'''Varning:''' inget --scriptpath är anget, med standarden: <code>$1</code> .",
 	'config-using-server' => 'Använder servernamn "<nowiki>$1</nowiki>".',
 	'config-using-uri' => 'Använder server-URL "<nowiki>$1$2</nowiki>".',
+	'config-no-cli-uploads-check' => "'''Varning:''' Din standardkatalog för uppladdningar (<code>$1</code>) inte är kontrollerad för sårbarhet från godtyckliga skriptkörning under CLI-installationen.",
 	'config-db-type' => 'Databastyp:',
+	'config-db-host' => 'Databasvärd:',
 	'config-db-wiki-settings' => 'Identifiera denna wiki',
 	'config-db-name' => 'Databasnamn:',
 	'config-db-name-oracle' => 'Databasschema:',
 	'config-db-install-account' => 'Användarkonto för installation',
 	'config-db-username' => 'Databas-användarnamn:',
 	'config-db-password' => 'Databas-lösenord:',
+	'config-db-password-empty' => 'Ange ett lösenord för den nya databasanvändaren: $1.
+Även om det kan vara möjligt att skapa användare utan lösenord är det inte säkert.',
+	'config-db-account-lock' => 'Använda samma användarnamn och lösenord under normal drift',
+	'config-db-wiki-account' => 'Användarkonto för normal drift',
+	'config-db-prefix' => 'Prefix för tabellerna i databasen:',
+	'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binär',
+	'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+	'config-charset-mysql4' => 'MySQL 4.0 bakåtkompatibel UTF-8',
 	'config-db-port' => 'Databasport:',
 	'config-db-schema' => 'Schema för MediaWiki',
+	'config-pg-test-error' => "Kan inte ansluta till databas '''$1''': $2",
+	'config-sqlite-dir' => 'SQLite data-katalog:',
 	'config-header-mysql' => 'MySQL-inställningar',
 	'config-header-postgres' => 'PostgreSQL-inställningar',
 	'config-header-sqlite' => 'SQLite-inställningar',
@@ -18144,6 +18768,7 @@ MediaWiki kräver PHP $2 eller högre.',
 	'config-invalid-db-type' => 'Ogiltig databastyp',
 	'config-missing-db-name' => 'Du måste ange ett värde för "Databasnamn"',
 	'config-missing-db-host' => 'Du måste ange ett värde för "Databasvärd"',
+	'config-missing-db-server-oracle' => 'Du måste ange ett värde för "Databas TNS"',
 	'config-invalid-db-name' => '"$1" är ett ogiltigt databasnamn.
 Använd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bindestreck (-).',
 	'config-invalid-db-prefix' => '"$1" är ett ogiltigt databasprefix.
@@ -18153,8 +18778,17 @@ Använd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bin
 Kontrollera värden, användarnamnet och lösenordet nedan och försök igen',
 	'config-invalid-schema' => '"$1" är ett ogiltigt schema för MediaWiki.
 Använd bara ASCII-bokstäver (a-z, A-Z), siffror (0-9), understreck (_) och bindestreck (-).',
+	'config-db-sys-create-oracle' => 'Installationsprogrammet stöder endast med ett SYSDBA-konto för att skapa ett nytt konto.',
 	'config-db-sys-user-exists-oracle' => 'Användarkontot "$1" finns redan. SYSDBA kan endast användas för att skapa ett nytt konto!',
 	'config-postgres-old' => 'PostgreSQL $1 eller senare krävs, du har $2.',
+	'config-sqlite-name-help' => 'Välja ett namn som identifierar din wiki.
+Använd inte mellanslag eller bindestreck.
+Detta kommer att användas för SQLite-data filnamnet.',
+	'config-sqlite-readonly' => 'Filen <code>$1</code> är inte skrivbar.',
+	'config-sqlite-cant-create-db' => 'Kunde inte skapa databasfilen <code>$1</code>.',
+	'config-sqlite-fts3-downgrade' => 'PHP saknar stöd för FTS3, nedgraderar tabeller',
+	'config-can-upgrade' => "Det finns MediaWiki-tabeller i den här databasen.
+För att uppgradera dem till MediaWiki $1, klicka på '''Fortsätt'''.",
 	'config-upgrade-done' => "Uppgraderingen slutfördes.
 
 Du kan nu [$1 börja använda din wiki].
@@ -18164,6 +18798,8 @@ Detta '''rekommenderas inte''' om du har problem med din wiki.",
 	'config-upgrade-done-no-regenerate' => 'Uppgraderingen slutfördes.
 
 Du kan nu [$1 börja använda din wiki].',
+	'config-regenerate' => 'Återskapa LocalSettings.php →',
+	'config-db-web-account' => 'Databaskonto för webbaccess',
 	'config-db-web-account-same' => 'Använd samma konto som för installation',
 	'config-db-web-create' => 'Skapa kontot om det inte redan finns',
 	'config-mysql-engine' => 'Lagringsmotor:',
@@ -18172,6 +18808,8 @@ Du kan nu [$1 börja använda din wiki].',
 	'config-site-name' => 'Namnet på wikin:',
 	'config-site-name-blank' => 'Ange ett sidnamn.',
 	'config-ns-generic' => 'Projekt',
+	'config-ns-site-name' => 'Samma som wikinamnet: $1',
+	'config-ns-other' => 'Annan (specificera)',
 	'config-ns-invalid' => 'Den angivna namnrymden "<nowiki>$1</nowiki>" är ogiltig.
 Ange ett annat namnrymd för projektet.',
 	'config-ns-conflict' => 'Den angivna namnrymden "<nowiki>$1</nowiki>" står i konflikt med en standardnamnrymd för MediaWiki.
@@ -18189,12 +18827,16 @@ Ange ett annat användarnamn.',
 	'config-admin-password-same' => 'Lösenordet får inte vara samma som användarnamnet.',
 	'config-admin-password-mismatch' => 'De två lösenord du uppgett överensstämmer inte med varandra.',
 	'config-admin-email' => 'E-postadress:',
+	'config-admin-error-user' => 'Internt fel när du skapar en administratör med namnet "<nowiki>$1</nowiki>".',
+	'config-admin-error-password' => 'Internt fel när du väljer ett lösenord för administratören "<nowiki>$1</nowiki>": <pre>$2</pre>',
 	'config-admin-error-bademail' => 'Du har angivit en felaktigt e-postadress.',
+	'config-subscribe' => 'Prenumerera på [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce e-postlistan för tillkännagivanden].',
 	'config-almost-done' => 'Du är nästan färdig!
 Du kan nu hoppa över återstående konfigurationer och installera wikin nu.',
 	'config-optional-continue' => 'Ställ fler frågor till mig.',
 	'config-optional-skip' => 'Jag är redan uttråkad, bara installera wiki.',
 	'config-profile-wiki' => 'Öppen wiki',
+	'config-profile-no-anon' => 'Kontoskapande krävs',
 	'config-profile-fishbowl' => 'Endast auktoriserade redigerare',
 	'config-profile-private' => 'Privat wiki',
 	'config-license' => 'Upphovsrätt och licens:',
@@ -18207,31 +18849,54 @@ Du kan nu hoppa över återstående konfigurationer och installera wikin nu.',
 	'config-license-pd' => 'Allmän egendom',
 	'config-license-cc-choose' => 'Välj en anpassad Creative Commons-licens',
 	'config-email-settings' => 'E-postinställningar',
+	'config-enable-email' => 'Aktivera utgående e-post',
+	'config-email-user' => 'Aktivera e-post mellan användare',
+	'config-email-user-help' => 'Tillåta alla användare att skicka mail till varandra om de har aktiverat det i deras preferenser.',
+	'config-email-usertalk' => 'Aktivera underrättelse för användardiskussionssidan',
 	'config-email-watchlist' => 'Aktivera meddelanden för bevakningslistan',
+	'config-email-auth' => 'Aktivera autentisering via e-post',
 	'config-upload-settings' => 'Bild- och filuppladdningar',
 	'config-upload-enable' => 'Aktivera filöverföringar',
 	'config-upload-deleted' => 'Mapp för raderade filer:',
 	'config-logo' => 'Logotyp-URL:',
+	'config-instantcommons' => 'Aktivera Instant Commons',
+	'config-cc-error' => 'Creative Commons-licens-väljaren gav inget resultat.
+Ange licensnamnet manuellt.',
 	'config-cc-again' => 'Välj igen...',
+	'config-cc-not-chosen' => 'Välj vilken Creative Commons-licens du vill ha och klicka på "gå vidare".',
 	'config-advanced-settings' => 'Avancerad konfiguration',
 	'config-extensions' => 'Tillägg',
+	'config-install-alreadydone' => "''' Varning:''' Du verkar redan ha installerat MediaWiki och försöker installera det igen.
+Vänligen fortsätt till nästa sida.",
+	'config-install-begin' => 'Genom att trycka på "{{int:config-continue}}", påbörjar du installationen av MediaWiki.
+Om du fortfarande vill göra ändringar trycker du på "{{int:config-back}}".',
 	'config-install-step-done' => 'klar',
 	'config-install-step-failed' => 'misslyckades',
 	'config-install-database' => 'Konfigurerar databas',
 	'config-install-schema' => 'Skapar schema',
+	'config-pg-no-plpgsql' => 'Du måste installera språket PL/pgSQL i databasen $1',
 	'config-install-user' => 'Skapar databasanvändare',
 	'config-install-user-alreadyexists' => 'Användaren "$1" finns redan',
 	'config-install-user-create-failed' => 'Misslyckades att skapa användare "$1": $2',
+	'config-install-user-grant-failed' => 'Beviljandet av behörighet till användaren "$1" misslyckades: $2',
 	'config-install-user-missing' => 'Den angivna användaren "$1" existerar inte.',
+	'config-install-user-missing-create' => 'Den angivna användaren "$1" existerar inte.
+Vänligen klicka på kryssrutan "skapa konto" nedan om du vill skapa den.',
 	'config-install-tables' => 'Skapar tabeller',
+	'config-install-tables-exist' => "''' Varning:''' MediaWiki-tabeller verkar redan finnas.
+Hoppar över skapandet.",
+	'config-install-tables-failed' => "''' Fel:''' Skapandet av tabell misslyckades med följande fel: $1",
 	'config-install-interwiki' => 'Lägger till standardtabell för interwiki',
 	'config-install-interwiki-list' => 'Kunde inte läsa filen <code>interwiki.list</code>.',
 	'config-install-stats' => 'Initierar statistik',
 	'config-install-keys' => 'Genererar hemliga nycklar',
 	'config-insecure-keys' => "'''Varning:''' {{PLURAL:$2|En säkerhetsnyckel|Säkerhetsnycklar}} ($1) som generades under installationen är inte helt {{PLURAL:$2|säker|säkra}} . Överväg att ändra {{PLURAL:$2|den|dem}} manuellt.",
 	'config-install-sysop' => 'Skapar administratörskonto',
+	'config-install-subscribe-fail' => 'Det gick inte att prenumerera på mediawiki-announce: $1',
+	'config-install-subscribe-notpossible' => 'cURL är inte installerad och allow_url_fopen är inte tillgänglig.',
 	'config-install-mainpage' => 'Skapa huvudsida med standardinnehåll',
 	'config-install-extension-tables' => 'Skapar tabeller för aktiverade tillägg',
+	'config-install-mainpage-failed' => 'Kunde inte infoga huvudsidan: $1',
 	'config-install-done' => "'''Grattis!'''
 Du har installerat MediaWiki.
 
@@ -18270,7 +18935,7 @@ $messages['sw'] = array(
 == Msaada wa kianzio ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Orodha ya mipangilio ya msingi]
 * [//www.mediawiki.org/wiki/Manual:FAQ FAQ ya MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Orodha ya utoaji wa habari za MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Orodha ya utoaji wa habari za MediaWiki]', # Fuzzy
 );
 
 /** Silesian (ślůnski)
@@ -18283,7 +18948,7 @@ $messages['szl'] = array(
 == Na sztart ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sztalowań konfiguracyje]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komuńikaty uo nowych wersyjach MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komuńikaty uo nowych wersyjach MediaWiki]', # Fuzzy
 );
 
 /** Tamil (தமிழ்)
@@ -18400,7 +19065,7 @@ $messages['tcy'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ ಮೀಡಿಯವಿಕಿ FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
 );
 
 /** Telugu (తెలుగు)
@@ -18446,7 +19111,7 @@ $messages['te'] = array(
 	'config-admin-password-confirm' => 'సంకేతపదం మళ్ళీ:',
 	'config-admin-email' => 'ఈ-మెయిలు చిరునామా:',
 	'config-optional-continue' => 'నన్ను మరిన్ని ప్రశ్నలు అడుగు.',
-	'config-profile-wiki' => 'సంప్రదాయ వికీ',
+	'config-profile-wiki' => 'సంప్రదాయ వికీ', # Fuzzy
 	'config-profile-no-anon' => 'ఖాతా సృష్టింపు తప్పనిసరి',
 	'config-profile-private' => 'అంతరంగిక వికీ',
 	'config-license' => 'కాపీహక్కులు మరియు లైసెన్సు:',
@@ -18464,7 +19129,7 @@ $messages['te'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings మీడియావికీ పనితీరు, అమరిక మార్చుకునేందుకు వీలుకల్పించే చిహ్నాల జాబితా]
 * [//www.mediawiki.org/wiki/Manual:FAQ మీడియావికీపై తరుచుగా అడిగే ప్రశ్నలు]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce మీడియావికీ సాఫ్టువేరు కొత్త వెర్షను విడుదలల గురించి తెలిపే మెయిలింగు లిస్టు]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce మీడియావికీ సాఫ్టువేరు కొత్త వెర్షను విడుదలల గురించి తెలిపే మెయిలింగు లిస్టు]', # Fuzzy
 );
 
 /** Tetum (tetun)
@@ -18485,7 +19150,7 @@ $messages['tg-cyrl'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Феҳристи танзимоти пайгирбандӣ]
 * [//www.mediawiki.org/wiki/Manual:FAQ Пурсишҳои МедиаВики]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Феҳристи ройномаҳои нусхаҳои МедиаВики]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Феҳристи ройномаҳои нусхаҳои МедиаВики]', # Fuzzy
 );
 
 /** Tajik (Latin script) (tojikī)
@@ -18499,7 +19164,7 @@ $messages['tg-latn'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Fehristi tanzimoti pajgirbandī]
 * [//www.mediawiki.org/wiki/Manual:FAQ Pursişhoi MediaViki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Fehristi rojnomahoi nusxahoi MediaViki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Fehristi rojnomahoi nusxahoi MediaViki]', # Fuzzy
 );
 
 /** Thai (ไทย)
@@ -18513,7 +19178,7 @@ $messages['th'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings รายการการปรับแต่งระบบ] (ภาษาอังกฤษ)
 * [//www.mediawiki.org/wiki/Manual:FAQ คำถามที่ถามบ่อยในมีเดียวิกิ] (ภาษาอังกฤษ)
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce เมลลิงลิสต์ของมีเดียวิกิ]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce เมลลิงลิสต์ของมีเดียวิกิ]', # Fuzzy
 );
 
 /** Turkmen (Türkmençe)
@@ -18526,7 +19191,7 @@ $messages['tk'] = array(
 == Öwrenjeler ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigurasiýa sazlamalary]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki SSS]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçta sanawy]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçta sanawy]', # Fuzzy
 );
 
 /** Tagalog (Tagalog)
@@ -18757,7 +19422,6 @@ Isaalang-alang ang paglalagay na magkakasama ang kalipunan ng dato sa ibang luga
 	'config-type-postgres' => 'PostgreSQL',
 	'config-type-sqlite' => 'SQLite',
 	'config-type-oracle' => 'Oracle',
-	'config-type-ibm_db2' => 'DB2 ng IBM',
 	'config-support-info' => 'Sinusuportahan ng MediaWiki ang sumusunod na mga sistema ng kalipunan ng dato:
 
 $1
@@ -18767,12 +19431,10 @@ Kung hindi mo makita ang sistema ng kalipunan ng dato na sinusubukan mong gamiti
 	'config-support-postgres' => '* Ang $1 ay isang bantog na sistema ng kalipunan ng dato na bukas ang pinagmulan na panghalili sa MySQL ([http://www.php.net/manual/en/pgsql.installation.php paano magtipon ng PHP na mayroong suporta ng PostgreSQL]). Maaaring mayroong ilang hindi pangunahing mga surot na natitira pa, at hindi iminumungkahi para gamitin sa loob ng isang kapaligiran ng produksiyon.',
 	'config-support-sqlite' => 'Ang $1 ay isang magaan ang timbang na sistema ng kalipunan ng dato na sinusuportahan nang napaka mainam. ([http://www.php.net/manual/en/pdo.installation.php Paano magtipon ng PHP na mayroong suporta ng SQLite], gumagamit ng PDO)',
 	'config-support-oracle' => '* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal. ([http://www.php.net/manual/en/oci8.installation.php Paano magtipunan ng PHP na mayroong suporta ng OCI8])',
-	'config-support-ibm_db2' => '* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal.', # Fuzzy
 	'config-header-mysql' => 'Mga katakdaan ng MySQL',
 	'config-header-postgres' => 'Mga katakdaan ng PostgreSQL',
 	'config-header-sqlite' => 'Mga katakdaan ng SQLite',
 	'config-header-oracle' => 'Mga katakdaan ng Oracle',
-	'config-header-ibm_db2' => 'Mga katakdaan ng DB2 ng IBM',
 	'config-invalid-db-type' => 'Hindi tanggap na uri ng kalipunan ng dato',
 	'config-missing-db-name' => 'Dapat kang magpasok ng isang halaga para sa "Pangalan ng kalipunan ng dato"',
 	'config-missing-db-host' => 'Dapat kang magpasok ng isang halaga para sa "Tagapagpasinaya ng kalipunan ng dato"',
@@ -18834,7 +19496,7 @@ Kung nais mong muling likhain ang iyong talaksang <code>LocalSettings.php</code>
 	'config-upgrade-done-no-regenerate' => 'Buo na ang pagsasapanahon.
 
 Maaari ka na ngayong [$1 magsimula sa paggamit ng wiki mo].',
-	'config-regenerate' => 'Muling likhain ang <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Muling likhain ang LocalSettings.php →',
 	'config-show-table-status' => 'Nabigo ang pagtatanong na IPAKITA ANG KALAGAYAN NG TALAHANAYAN!', # Fuzzy
 	'config-unknown-collation' => "'''Babala:''' Ang kalipunan ng dato ay gumagagamit ng hindi nakikilalang pag-iipon.",
 	'config-db-web-account' => 'Akawnt ng kalipunan ng dato para sa pagpunta sa web',
@@ -18864,7 +19526,6 @@ May gawi ang mga kalipunan ng dato ng MyISAM na masira nang mas madalas kaysa sa
 Mas kapaki-pakinabang ito kaysa sa gawi na UTF-8 ng MySQL, at nagpapahintulot sa iyo upang magamit ang buong kasaklawan ng mga panitik ng Unikodigo.
 
 Sa ''gawi na UTF-8''', malalaman ng MySQL kung sa anong pangkat ng panitik nakapaloob ang iyong dato, at angkop na makakapagharap at makapapagpalit nito, subalit hindi ka nito papayagan na mag-imbak ng mga panitik na nasa itaas ng [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] o Saligang Tapyas na Pangmaramihang Wika.",
-	'config-ibm_db2-low-db-pagesize' => "Ang kalipunan mo ng dato na DB2 ay mayroong isang likas na nakatakdang puwang ng talahanayan na mayroong hindi sapat na sukat ng pahina. Ang sukat ng pahina ay dapat na maging '''32K''' o mas mataas.",
 	'config-site-name' => 'Pangalan ng wiki:',
 	'config-site-name-help' => "Lilitaw ito sa bareta ng pamagat ng pantingin-tingin at sa samu't saring ibang mga lugar.",
 	'config-site-name-blank' => 'Magpasok ng isang pangalan ng sityo.',
@@ -18972,7 +19633,7 @@ Ideyal na dapat itong  hindi mapupuntahan mula sa web.',
 	'config-logo-help' => 'Ang likas na nakatakdang pabalat ng MediaWiki ay nagsasama ng puwang para sa isang logong 135x160 ang piksel na nasa itaas ng menu ng panggilid na bareta.
 Magkargang papaitaas ng isang imahe na mayroong naaangkop na sukat, at ipasok dito ang URL.
 
-Kung ayaw mo ng isang logo, iwanang walang laman ang kahong ito.',
+Kung ayaw mo ng isang logo, iwanang walang laman ang kahong ito.', # Fuzzy
 	'config-instantcommons' => 'Paganahin ang Mga Pangkaraniwang Biglaan',
 	'config-instantcommons-help' => 'Ang [//www.mediawiki.org/wiki/InstantCommons Instant Commons] ay isang tampok na nagpapahintulot sa mga wiki upang gumamit ng mga imahe, mga tunog at iba pang mga midyang matatagpuan sa pook ng [//commons.wikimedia.org/ Wikimedia Commons].
 Upang magawa ito, nangangailangan ang MediaWiki ng pagka nakakapunta sa Internet.
@@ -19091,7 +19752,7 @@ $messages['tr'] = array(
 == Yeni Başlayanlar ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Yapılandırma ayarlarının listesi]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki SSS]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-posta listesi]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-posta listesi]', # Fuzzy
 );
 
 /** Tatar (Cyrillic script) (татарча)
@@ -19104,7 +19765,7 @@ $messages['tt-cyrl'] = array(
 == Кайбер файдалы ресурслар ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Көйләнмәләр исемлеге (инг.)];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki турында еш бирелгән сораулар һәм җаваплар (инг.)];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'ның яңа версияләре турында хәбәрләр яздырып алу].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'ның яңа версияләре турында хәбәрләр яздырып алу].", # Fuzzy
 );
 
 /** Tatar (Latin script) (tatarça)
@@ -19117,7 +19778,7 @@ $messages['tt-latn'] = array(
 == Qayber faydalı resurslar ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Köylänmälär isemlege (ing.)];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki turında yış birelgän sorawlar häm cawaplar (ing.)];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'nıñ yaña versiäläre turında xäbärlär yazdırıp alu].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'nıñ yaña versiäläre turında xäbärlär yazdırıp alu].", # Fuzzy
 );
 
 /** Udmurt (удмурт)
@@ -19137,13 +19798,14 @@ $messages['ug-arab'] = array(
 == دەسلەپكى ساۋات ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings سەپلىمە تەڭشەك تىزىملىكى]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki كۆپ ئۇچرايدىغان مەسىلىلەرگە جاۋاب]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki تارقاتقان ئېلخەت تىزىملىكى]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki تارقاتقان ئېلخەت تىزىملىكى]', # Fuzzy
 );
 
 /** Ukrainian (українська)
  * @author AS
  * @author Ahonc
  * @author Alex Khimich
+ * @author Andriykopanytsia
  * @author Base
  * @author Diemon.ukr
  * @author Ата
@@ -19201,8 +19863,8 @@ $1',
 	'config-help-restart' => 'Ви бажаєте видалити всі введені та збережені вами дані і запустити процес установки спочатку?',
 	'config-restart' => 'Так, перезапустити установку',
 	'config-welcome' => '=== Перевірка оточення ===
-Проводяться базові перевірки, щоб виявити, чи можлива установка MediaWiki у даній системі.
-Вкажіть результати цих перевірок при зверненні за допомогою під час установки.',
+Будуть проведені базові перевірки, щоб виявити, чи можлива установка MediaWiki у даній системі.
+Не забудьте включити цю інформацію, якщо ви звернетеся по підтримку, як завершити установку.',
 	'config-copyright' => "=== Авторське право і умови ===
 
 $1
@@ -19270,6 +19932,10 @@ MediaWiki вимагає підтримку UTF-8 для коректної ро
 Імовірно, це замало.
 Встановлення може не вдатись!",
 	'config-ctype' => "'''Помилка''': PHP має бути зібраним з підтримкою [http://www.php.net/manual/en/ctype.installation.php розширення Ctype].",
+	'config-json' => "'''Fatal:''' PHP був скомпільований без підтримки JSON.
+Вам потрібно встановити або розширення PHP JSON або розширення[http://pecl.php.net/package/jsonc PECL jsonc] перед встановлення Медіавікі.
+* Розширення PHP включено у Red Hat Enterprise Linux (CentOS) 5 та 6, хоча має бути доступним у  <code>/etc/php.ini</code> або <code>/etc/php.d/json.ini</code>.
+* Деякі дистрибутиви Лінукса, випущені після травня 2013, пропустили розширення PHP, натомість упакували розширення  PECL як <code>php5-json</code> або <code>php-pecl-jsonc</code>.",
 	'config-xcache' => '[http://xcache.lighttpd.net/ XCache] встановлено',
 	'config-apc' => '[http://www.php.net/apc APC] встановлено',
 	'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] встановлено',
@@ -19278,6 +19944,8 @@ MediaWiki вимагає підтримку UTF-8 для коректної ро
 	'config-mod-security' => "'''Увага''': на Вашому веб-сервері увімкнено [http://modsecurity.org/ mod_security]. У разі неправильних налаштувать, він може викликати проблеми MediaWiki або іншого ПЗ, яке дозволяє користувачам надсилати довільний вміст.
 Зверніться до [http://modsecurity.org/documentation/ документації mod_security] або підтримки Вашого хостера, якщо під час роботи виникають незрозумілі помилки.",
 	'config-diff3-bad' => 'GNU diff3 не знайдено.',
+	'config-git' => 'Знайшов програму управління версіями Git: <code>$1</code>.',
+	'config-git-bad' => 'Програму управління версіями Git  не знайдено.',
 	'config-imagemagick' => 'Виявлено ImageMagick: <code>$1</code>.
 Буде ввімкнуто відображення мініатюр, якщо ви дозволите завантаження файлів.',
 	'config-gd' => 'Виявлено вбудовано графічну бібліотеку GD.
@@ -19298,7 +19966,7 @@ MediaWiki вимагає підтримку UTF-8 для коректної ро
 	'config-using531' => 'MediaWiki не можна використовувати разом з PHP $1 через помилку з параметрами-посиланнями <code>__call()</code>.
 Оновіть PHP до версії 5.3.2 і вище або відкотіть до PHP 5.3.0 щоб уникнути цієї проблеми.
 Встановлення скасовано.',
-	'config-suhosin-max-value-length' => 'Suhosin встановлено і обмежує довжину параметра GET до $1 байтів. Компонент MediaWiki ResourceLoader буде обходити це обмеження, однак це зменшить продуктивність. Якщо це можливо, Вам варто встановити значення <code>suhosin.get.max_value_length</code> 1024 і більше у <code>php.ini</code> і встановити таке ж значення <code>$wgResourceLoaderMaxQueryLength</code> у LocalSettings.php .', # Fuzzy
+	'config-suhosin-max-value-length' => 'Suhosin встановлено і обмежує параметра GET  <code>length</code> до $1 байта. Компонент MediaWiki ResourceLoader буде обходити це обмеження, однак це зменшить продуктивність. Якщо це можливо, Вам варто встановити значення <code>suhosin.get.max_value_length</code> як 1024 і більше у <code>php.ini</code> і встановити таке ж значення <code>$wgResourceLoaderMaxQueryLength</code> у LocalSettings.php .',
 	'config-db-type' => 'Тип бази даних:',
 	'config-db-host' => 'Хост бази даних:',
 	'config-db-host-help' => 'Якщо сервер бази даних знаходиться на іншому сервері, введіть тут ім\'я хосту і IP адресу.
@@ -19369,7 +20037,6 @@ MediaWiki вимагає підтримку UTF-8 для коректної ро
 За можливості розташуйте базу даних десь окремо, наприклад в <code>/var/lib/mediawiki/yourwiki</code>.",
 	'config-oracle-def-ts' => 'Простір таблиць за замовчуванням:',
 	'config-oracle-temp-ts' => 'Тимчасовий простір таблиць:',
-	'config-type-ibm_db2' => 'IBM DB2',
 	'config-support-info' => 'MediaWiki підтримує таки системи баз даних:
 
 $1
@@ -19379,18 +20046,16 @@ $1
 	'config-support-postgres' => '* $1 — популярна відкрита СУБД, альтернатива MySQL ([http://www.php.net/manual/en/pgsql.installation.php як зібрати PHP з допомогою PostgreSQL]). Можуть зустрічатись деякі невеликі невиправлені помилки, не рекомендується використовувати у робочій системі.',
 	'config-support-sqlite' => '* $1 — легка система баз даних, яка дуже добре підтримується. ([http://www.php.net/manual/en/pdo.installation.php Як зібрати PHP з допомогою SQLite], що використовує PDO)',
 	'config-support-oracle' => '* $1 — комерційна база даних масштабу підприємства. ([http://www.php.net/manual/en/oci8.installation.php Як зібрати PHP з підтримкою OCI8])',
-	'config-support-ibm_db2' => '* $1 — комерційна база даних масштабу підприємства.', # Fuzzy
 	'config-header-mysql' => 'Налаштування MySQL',
 	'config-header-postgres' => 'Налаштування PostgreSQL',
 	'config-header-sqlite' => 'Налаштування SQLite',
 	'config-header-oracle' => 'Налаштування Oracle',
-	'config-header-ibm_db2' => 'Налаштування IBM DB2',
 	'config-invalid-db-type' => 'Невірний тип бази даних',
 	'config-missing-db-name' => "Ви повинні ввести значення параметру «Ім'я бази даних»",
 	'config-missing-db-host' => 'Ви повинні ввести значення параметру «Хост бази даних»',
 	'config-missing-db-server-oracle' => 'Ви повинні ввести значення параметру «TNS бази даних»',
 	'config-invalid-db-server-oracle' => 'Неприпустиме TNS бази даних "$1".
-Використовуйте тільки ASCII букви (a-z, A-Z), цифри (0-9), знаки підкреслення (_) і крапки (.).',
+Використовуйте "TNS Name" або рядок "Easy Connect"  ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Методи найменування Oracle])',
 	'config-invalid-db-name' => 'Неприпустима назва бази даних "$1".
 Використовуйте тільки ASCII букви (a-z, A-Z), цифри (0-9), знаки підкреслення (_) і дефіси (-).',
 	'config-invalid-db-prefix' => 'Неприпустимий префікс бази даних "$1".
@@ -19446,7 +20111,7 @@ chmod a+w $3</pre>',
 	'config-upgrade-done-no-regenerate' => 'Оновлення завершено.
 
 Ви можете зараз [$1 починати використовувати свою вікі].',
-	'config-regenerate' => 'Повторно згенерувати <code>LocalSettings.php</code> →',
+	'config-regenerate' => 'Повторно згенерувати LocalSettings.php →',
 	'config-show-table-status' => 'Запит <code>SHOW TABLE STATUS</code> не виконано!',
 	'config-unknown-collation' => "'''Увага:''' База даних використовує нерозпізнане сортування.",
 	'config-db-web-account' => 'Обліковий запис бази даних для інтернет-доступу',
@@ -19465,6 +20130,12 @@ chmod a+w $3</pre>',
 
 Якщо Ваша інсталяція MySQL підтримує InnoDB, дуже рекомендується вибрати цей двигун.
 Якщо Ваша інсталяція MySQL не підтримує InnoDB, можливо настав час її оновити.",
+	'config-mysql-only-myisam-dep' => '"\'Зауваження:"\' MyISAM є єдиним механізмом для зберігання MySQL, який не рекомендується для використання з MediaWiki, оскільки:
+* слабо підтримує паралелізм через блокування таблиць
+* більш схильний до пошкоджень, ніж інші двигуни
+* код MediaWiki не завжди розглядає MyISAM, як повинен
+
+Твоє встановлення MySQL не підтримує InnoDB, можливо, потрібно оновити.',
 	'config-mysql-engine-help' => "'''InnoDB''' є завжди кращим вибором, оскільки краще підтримує паралельний доступ.
 
 '''MyISAM''' може бути швидшим для одного користувача або в інсталяціях read-only.
@@ -19476,7 +20147,6 @@ chmod a+w $3</pre>',
 Це більш ефективно, ніж UTF-8 режим MySQL, і дозволяє використовувати увесь набір символів Юнікоду.
 
 У '''режимі UTF-8''' MySQL буде знати, якого символу стосуються Ваші дані, і могтиме відображати та конвертувати їх належним чином, але не дозволятиме зберігати символи, що виходять за межі [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
-	'config-ibm_db2-low-db-pagesize' => "У Вашій базі даних DB2 за замовчуванням заданий табличний простір з недостатнім розміром сторінки. Розмір сторінки має бути '''32K''' і більше.",
 	'config-site-name' => 'Назва вікі:',
 	'config-site-name-help' => 'Це буде відображатись у заголовку вікна браузера та у деяких інших місцях.',
 	'config-site-name-blank' => 'Введіть назву сайту.',
@@ -19519,7 +20189,7 @@ chmod a+w $3</pre>',
 	'config-optional-continue' => 'Запитуйте ще.',
 	'config-optional-skip' => 'Це вже втомлює, просто встановити вікі.',
 	'config-profile' => 'Профіль прав користувача:',
-	'config-profile-wiki' => 'Традиційна вікі', # Fuzzy
+	'config-profile-wiki' => 'Відкрита вікі',
 	'config-profile-no-anon' => 'Необхідно створити обліковий запис',
 	'config-profile-fishbowl' => 'Тільки для авторизованих редакторів',
 	'config-profile-private' => 'Приватна вікі',
@@ -19529,12 +20199,12 @@ chmod a+w $3</pre>',
 Одначе, MediaWiki може бути корисна по-різному, й інколи важко переконати у вигідності відкритої вікі-роботи.
 Тож у Вас є вибір.
 
-'''{{int:config-profile-wiki}}''' дозволяє редагувати будь-кому, навіть без входження в систему.
+Модель '''{{int:config-profile-wiki}}''' дозволяє редагувати будь-кому, навіть без входження в систему.
 Вікі з вимогою \"'''{{int:config-profile-no-anon}}'''\" дає певний облік, але може відвернути випадкових дописувачів.
 Спосіб \"'''{{int:config-profile-fishbowl}}'''\" дозволяє редагувати підтвердженим користувачам, а переглядати сторінки і історію можуть усі.
 '''{{int:config-profile-private}}''' дозволяє переглядати сторінки і редагувати лише підтвердженим користувачам.
 
-Детальніші конфігурації прав користувачів доступні після встановлення, див. [//www.mediawiki.org/wiki/Manual:User_rights відповідний розділ посібника].", # Fuzzy
+Детальніші конфігурації прав користувачів доступні після встановлення, див. [//www.mediawiki.org/wiki/Manual:User_rights відповідний розділ посібника].",
 	'config-license' => 'Авторські права і ліцензія:',
 	'config-license-none' => 'Без ліцензії у нижньому колонтитулі',
 	'config-license-cc-by-sa' => 'Creative Commons Attribution Share Alike',
@@ -19580,8 +20250,11 @@ GFDL — допустима ліцензія, але у ній важко роз
 В ідеалі, вона не має бути доступною через інтернет.',
 	'config-logo' => 'URL логотипу:',
 	'config-logo-help' => 'Стандартна схема оформлення MediaWiki містить вільне для логотипу місце над бічною панеллю розміром 135x160 пікселів. 
+
 Завантажте зображення відповідного розміру і введіть тут його URL.
 
+Ви можете використати <code>$wgStylePath</code> або <code>$wgScriptPath</code>, якщо ваш логотип пов\'язаний з цими шляхами.
+
 Якщо Вам не потрібен логотип, залиште це поле пустим.',
 	'config-instantcommons' => 'Увімкнути Instant Commons',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] це функція, що дозволяє вікі використовувати зображення, звуки та інші медіа, розміщені на [//commons.wikimedia.org/ Вікісховищі].
@@ -19616,7 +20289,7 @@ GFDL — допустима ліцензія, але у ній важко роз
 	'config-install-alreadydone' => "'''Увага:''' Здається, Ви вже встановлювали MediaWiki і зараз намагаєтесь встановити її знову.
 Будь ласка, перейдіть на наступну сторінку.",
 	'config-install-begin' => 'Натискаючи "{{int:config-continue}}", Ви розпочинаєте встановлення MediaWiki.
-Якщо Ви все ще хочете внести зміни, натисніть "Назад".', # Fuzzy
+Якщо Ви все ще хочете внести зміни, натисніть "{{int:config-back}}".',
 	'config-install-step-done' => 'виконано',
 	'config-install-step-failed' => 'не вдалося',
 	'config-install-extensions' => 'У тому числі розширення',
@@ -19674,6 +20347,9 @@ $3
 	'config-download-localsettings' => 'Завантажити <code>LocalSettings.php</code>',
 	'config-help' => 'допомога',
 	'config-nofile' => 'Файл "$1" не знайдено. Його видалено?',
+	'config-extension-link' => 'Чи знаєте ви, що ваше вікі підтримує [//www.mediawiki.org/wiki/Manual:Extensions розширення]?
+
+Ви можете переглядати [//www.mediawiki.org/wiki/Category:Extensions_by_category розширення по категорії] або в [//www.mediawiki.org/wiki/Extension_Matrix матрицю розширень] щоб побачити повний список розширень.',
 	'mainpagetext' => 'Програмне забезпечення «MediaWiki» успішно встановлене.',
 	'mainpagedocfooter' => 'Інформацію про роботу з цією вікі можна знайти в [//meta.wikimedia.org/wiki/Help:Contents посібнику користувача].
 
@@ -19685,10 +20361,19 @@ $3
 );
 
 /** Urdu (اردو)
+ * @author Noor2020
  * @author පසිඳු කාවින්ද
  */
 $messages['ur'] = array(
 	'config-information' => 'معلومات',
+	'config-git' => 'Git ورژن کنٹرول مصنع لطیف ملا: <code>$1</code> ۔',
+	'config-git-bad' => 'GIT ورژن کنٹرول مصنع لطیف نہيں ملا ۔',
+	'config-mysql-only-myisam-dep' => "' ' تنبیہ: ' '[[MyISAM|مائ اسام]] واحد دستیاب 'ذخیرہ جاتی انجن' ہے جو مائی ایس کیو ایل کے لیے ہے ، جو کہ ناموزوں ہے میڈیا وکی کے لیے ،کیوں کہ :
+* یہ ہموار قطاروں کی سہولت بمشکل فراہم کرتا ہے 
+* یہ دوسرے انجنوں کے مقابلے  زیادہ بگڑ جاتا ہے
+* میڈیا وکی کوڈ بیس ہمیشہ سنبھال نہيں پاتا مائی اسام کو ۔ 
+
+آپ کا مائی ایس کیو ایل کا نصب ہمیشہ اننو ڈی بی کی سہولت نہيں دے سکتا ، ہو سکتا ہے یہ مزید ترقیاتی کام چاہے", # Fuzzy
 	'config-profile-fishbowl' => 'صرف مجاز ایڈیٹرز',
 	'config-license-pd' => 'پبلک ڈومین',
 	'config-email-settings' => 'ای میل کی ترتیبات',
@@ -19714,8 +20399,10 @@ $messages['ur'] = array(
 );
 
 /** Uzbek (oʻzbekcha)
+ * @author Sociologist
  */
 $messages['uz'] = array(
+	'config-admin-password-blank' => 'Administrator hisob yozuvi uchun maxfiy soʻz kiriting.',
 	'mainpagetext' => "'''MediaWiki muvaffaqiyatli o'rnatildi.'''",
 	'mainpagedocfooter' => "Wiki dasturini ishlatish haqida ma'lumot olish uchun  [//meta.wikimedia.org/wiki/Help:Contents Foydalanuvchi qo'llanmasi] sahifasiga murojaat qiling.
 
@@ -19723,7 +20410,7 @@ $messages['uz'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Moslamalar ro'yxati]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki haqida ko'p so'raladigan savollar]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki yangi versiyasi chiqqanda xabar berish ro'yxati]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki yangi versiyasi chiqqanda xabar berish ro'yxati]", # Fuzzy
 );
 
 /** vèneto (vèneto)
@@ -19739,7 +20426,7 @@ I seguenti cołegamenti i xé en łengua inglese:
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Inpostasion de configurasion]
 * [//www.mediawiki.org/wiki/Manual:FAQ Domande frequenti so MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list anunsi MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list anunsi MediaWiki]", # Fuzzy
 );
 
 /** Veps (vepsän kel’)
@@ -19752,7 +20439,7 @@ $messages['vep'] = array(
 == Erased tarbhaižed resursad ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Järgendusiden nimikirjutez]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce počtnimikirjutez]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce počtnimikirjutez]', # Fuzzy
 );
 
 /** Vietnamese (Tiếng Việt)
@@ -19774,7 +20461,7 @@ $messages['vi'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Danh sách các thiết lập cấu hình]
 * [//www.mediawiki.org/wiki/Manual:FAQ Các câu hỏi thường gặp MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]', # Fuzzy
 );
 
 /** Volapük (Volapük)
@@ -19787,7 +20474,7 @@ $messages['vo'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Parametalised]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: SSP]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Potalised tefü fomams nulik ela MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Potalised tefü fomams nulik ela MediaWiki]', # Fuzzy
 );
 
 /** Võro (Võro)
@@ -19798,7 +20485,7 @@ $messages['vro'] = array(
 * [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide MediaWiki pruukmisoppus (inglüse keelen)].
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Säädmiisi oppus (inglüse keelen)]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki kõgõ küsütümbäq küsümiseq (inglüse keelen)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postilist, minka andas teedäq MediaWiki vahtsist kujõst].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postilist, minka andas teedäq MediaWiki vahtsist kujõst].', # Fuzzy
 );
 
 /** Walloon (walon)
@@ -19818,7 +20505,7 @@ $messages['war'] = array(
 == Ha pagtikang==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Wolof (Wolof)
@@ -19831,7 +20518,7 @@ $messages['wo'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Limu jumtukaayi kocc-koccal gi]
 * [//www.mediawiki.org/wiki/Manual:FAQ FAQ MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Limu waxtaan ci liy-génn ci MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Limu waxtaan ci liy-génn ci MediaWiki]', # Fuzzy
 );
 
 /** Wu (吴语)
@@ -19844,7 +20531,7 @@ $messages['wuu'] = array(
 == 入门 ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置设置列表]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常见问题解答]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布邮件列表]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布邮件列表]', # Fuzzy
 );
 
 /** Kalmyk (хальмг)
@@ -19857,7 +20544,7 @@ $messages['xal'] = array(
 == Туста заавр ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Көгүдә бүрткл]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki туск ЮмБи]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki шинҗллһнә бүрткл]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki шинҗллһнә бүрткл]', # Fuzzy
 );
 
 /** Yiddish (ייִדיש)
@@ -19907,7 +20594,7 @@ $messages['yo'] = array(
 == Láti bẹ̀rẹ̀ ==
 *  [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Cantonese (粵語)
@@ -19919,7 +20606,7 @@ $messages['yue'] = array(
 ==開始使用==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings 配置設定清單]（英）
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常見問題]（英）
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件名單]（英）',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件名單]（英）', # Fuzzy
 );
 
 /** Zeeuws (Zeêuws)
@@ -19932,14 +20619,16 @@ $messages['zea'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lieste mie instelliengen]
 * [//www.mediawiki.org/wiki/Manual:FAQ Veehestelde vraehen (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailienglieste voe ankondigiengen van nieuwe versies]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailienglieste voe ankondigiengen van nieuwe versies]", # Fuzzy
 );
 
 /** Simplified Chinese (中文（简体）‎)
  * @author Anthony Fok
+ * @author Cwek
  * @author Hydra
  * @author Hzy980512
  * @author Liangent
+ * @author Makecat
  * @author PhiLiP
  * @author Xiaomingyan
  * @author Yfdyh000
@@ -20045,6 +20734,8 @@ $1',
 Object caching is not enabled.",
 	'config-mod-security' => "'''警告'''：您的服务器已启动[http://modsecurity.org/ mod_security]。若其配置错误, 会导致MediaWiki和其他软件的错误并允许用户任意发布内容。如果您遇到任何错误，请查阅[http://modsecurity.org/documentation/ mod_security文档]或联系您的客服。",
 	'config-diff3-bad' => '找不到GNU diff3。',
+	'config-git' => '发现Git版本控制软件：<code>$1</code>',
+	'config-git-bad' => 'Git版本控制软件未找到。',
 	'config-imagemagick' => '已找到ImageMagick：<code>$1</code>。如果你启用了上传功能，缩略图功能也将被启用。',
 	'config-gd' => '已找到内建的GD图形库。如果你启用了上传功能，缩略图功能也将被启用。',
 	'config-no-scaling' => '找不到GD库或ImageMagick。缩略图功能将不可用。',
@@ -20056,7 +20747,7 @@ Object caching is not enabled.",
 	'config-no-cli-uploads-check' => "'''警告'''：在CLI安装过程中，没有对您的默认上传目录（<code>$1</code>）进行执行任意脚本的漏洞检查。",
 	'config-brokenlibxml' => '您的系统安装的PHP和libxml2版本组合存在故障，并可能在MediaWiki和其他web应用程序中造成隐藏的数据损坏。请将PHP升级到5.2.9或以上，libxml2升级到2.7.3或以上（[//bugs.php.net/bug.php?id=45996 PHP的故障报告]）。安装已中断。',
 	'config-using531' => '由于函数<code>__call()</code>的引用参数存在故障，PHP $1和MediaWiki无法兼容。请升级到PHP 5.3.2或更高版本，或降级到PHP 5.3.0以修复该问题。安装已中断。',
-	'config-suhosin-max-value-length' => 'Suhosin已经安装并将GET请求的参数长度限制在$1字节。MediaWiki的ResourceLoader部件可以在此限制下正常工作，但其性能会被降低。如果可能，请在<code>php.ini</code>中将<code>suhosin.get.max_value_length</code>设为1024或更高值，并在LocalSettings.php中将<code>$wgResourceLoaderMaxQueryLength</code>设为同一值。', # Fuzzy
+	'config-suhosin-max-value-length' => 'Suhosin已经安装并将GET请求的参数长度限制在$1字节。MediaWiki的ResourceLoader部件可以在此限制下正常工作，但其性能会被降低。如果可能，请在<code>php.ini</code>中将<code>suhosin.get.max_value_length</code>设为1024或更高值，并在LocalSettings.php中将<code>$wgResourceLoaderMaxQueryLength</code>设为同一值。',
 	'config-db-type' => '数据库类型：',
 	'config-db-host' => '数据库主机：',
 	'config-db-host-help' => '如果您的数据库在别的服务器上，请在这里输入它的域名或IP地址。
@@ -20179,7 +20870,7 @@ chmod a+w $3</pre>',
 	'config-upgrade-done-no-regenerate' => '升级完成。
 
 现在您可以[$1 开始使用您的wiki]了。',
-	'config-regenerate' => '重新生成<code>LocalSettings.php</code> →',
+	'config-regenerate' => '重新生成LocalSettings.php →',
 	'config-show-table-status' => '<code>SHOW TABLE STATUS</code>语句执行失败！',
 	'config-unknown-collation' => "'''警告：'''数据库使用了无法识别的整理。",
 	'config-db-web-account' => '供网页访问使用的数据库帐号',
@@ -20197,6 +20888,12 @@ chmod a+w $3</pre>',
 
 如果您的MySQL程序支持InnoDB，我们高度推荐您使用该引擎替代MyISAM。
 如果您的MySQL程序不支持InnoDB，请考虑升级。",
+	'config-mysql-only-myisam-dep' => "''''警告：'''MyISAM是MySQL唯一可用的存储引擎，但不适合用于MediaWiki，是由于：
+*由于只支持表级锁定，几乎不支持并发。
+*它比其他引擎更容易损坏。
+*MediaWiki代码不能总是按照预设地操作MyISAM。
+
+你的MySQL不支持InnoDB，是时候升级了。",
 	'config-mysql-engine-help' => "'''InnoDB'''通常是最佳选项，因为它对并发操作有着良好的支持。
 
 '''MyISAM'''在单用户或只读环境下可能会有更快的性能表现。但MyISAM数据库出错的概率一般要大于InnoDB数据库。",
@@ -20289,6 +20986,8 @@ GNU自由文档许可证是维基百科曾经使用过的许可证，并迄今
 	'config-logo' => '标志URL：',
 	'config-logo-help' => '在MediaWiki的默认外观中，左侧栏菜单之上有一块135x160像素的标志区。请上传一幅相应大小的图像，并在此输入URL。
 
+你可以用<code>$wgStylePath</code>或<code>$wgScriptPath</code>来表示相对于这些位置的路径。
+
 如果您不希望使用标志，请将本处留空。',
 	'config-instantcommons' => '启用即时共享资源',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons 即时共享资源]可以让wiki使用来自[//commons.wikimedia.org/ 维基共享资源]网站的图像、音频和其他媒体文件。要启用该功能，MediaWiki必须能够访问互联网。
@@ -20383,6 +21082,7 @@ $3
 /** Traditional Chinese (中文（繁體）‎)
  * @author Anthony Fok
  * @author Hzy980512
+ * @author Justincheng12345
  * @author Liangent
  * @author Mark85296341
  * @author Simon Shek
@@ -20485,6 +21185,8 @@ $1',
 Object caching is not enabled.",
 	'config-mod-security' => "'''警告'''：您的服務器已啟動[http://modsecurity.org/ mod_security]。若其配置錯誤, 會導致MediaWiki和其他軟件的錯誤並允許用戶任意發布內容。如果您遇到任何錯誤，請查閱[http://modsecurity.org/documentation/ mod_security文檔]或聯繫您的客服。",
 	'config-diff3-bad' => '找不到GNU diff3。',
+	'config-git' => '發現Git版本控制軟件：<code>$1</code>。',
+	'config-git-bad' => '無法找到Git版本控制軟件。',
 	'config-imagemagick' => '已找到ImageMagick：<code>$1</code>。如果你啟用了上傳功能，縮略圖功能也將被啟用。',
 	'config-gd' => '已找到內建的GD圖形庫。如果你啟用了上傳功能，縮略圖功能也將被啟用。',
 	'config-no-scaling' => '找不到GD庫或ImageMagick。縮略圖功能將不可用。',
@@ -20576,7 +21278,8 @@ $1
 	'config-missing-db-name' => '您必須為“數據庫名稱”輸入內容',
 	'config-missing-db-host' => '您必須為“數據庫主機”輸入內容',
 	'config-missing-db-server-oracle' => '您必須為“數據庫透明網絡底層（TNS）”輸入內容',
-	'config-invalid-db-server-oracle' => '無效的數據庫TNS“$1”。請只使用ASCII字母（a-z、A-Z）、數字（0-9）、下劃線（_）和點號（.）。',
+	'config-invalid-db-server-oracle' => '無效的數據庫TNS「$1」。
+請只使用「TNS Name」或「Easy Connect」 字串（[http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle命名法]）',
 	'config-invalid-db-name' => '無效的數據庫名稱“$1”。請只使用ASCII字母（a-z、A-Z）、數字（0-9）、下劃線（_）和連字號（-）。',
 	'config-invalid-db-prefix' => '無效的數據庫前綴“$1”。請只使用ASCII字母（a-z、A-Z）、數字（0-9）、下劃線（_）和連字號（-）。',
 	'config-connection-error' => '$1。
@@ -20619,7 +21322,7 @@ chmod a+w $3</pre>',
 	'config-upgrade-done-no-regenerate' => '升級完成。
 
 現在您可以[$1 開始使用您的wiki]了。',
-	'config-regenerate' => '重新生成<code>LocalSettings.php</code> →',
+	'config-regenerate' => '重新生成LocalSettings.php →',
 	'config-show-table-status' => '查詢<code>SHOW TABLE STATUS</code>失敗！',
 	'config-unknown-collation' => "'''警告：'''數據庫使用了無法識別的整理。",
 	'config-db-web-account' => '供網頁訪問使用的數據庫帳號',
@@ -20679,7 +21382,7 @@ chmod a+w $3</pre>',
 	'config-optional-continue' => '多問我一些問題吧。',
 	'config-optional-skip' => '我已經不耐煩了，趕緊安裝我的wiki。',
 	'config-profile' => '用戶權限配置：',
-	'config-profile-wiki' => '傳統wiki', # Fuzzy
+	'config-profile-wiki' => '開放的wiki',
 	'config-profile-no-anon' => '需要註冊帳號',
 	'config-profile-fishbowl' => '編輯受限',
 	'config-profile-private' => '非公開wiki',
@@ -20729,7 +21432,7 @@ GNU自由文檔許可證是維基百科曾經使用過的許可證，並迄今
 	'config-logo' => '標誌URL：',
 	'config-logo-help' => '在MediaWiki的默認外觀中，左側欄菜單之上有一塊135x160像素的標誌區。請上傳一幅相應大小的圖像，並在此輸入URL。
 
-如果您不希望使用標誌，請將本處留空。',
+如果您不希望使用標誌，請將本處留空。', # Fuzzy
 	'config-instantcommons' => '啟用即時共享資源',
 	'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons 即時共享資源]可以讓wiki使用來自[//commons.wikimedia.org/ 維基共享資源]網站的圖像、音頻和其他媒體文件。要啟用該功能，MediaWiki必須能夠訪問互聯網。
 
diff --git a/includes/installer/Installer.php b/includes/installer/Installer.php
index 9fd67c93..36c41910 100644
--- a/includes/installer/Installer.php
+++ b/includes/installer/Installer.php
@@ -46,7 +46,6 @@ abstract class Installer {
 	 */
 	protected $settings;
 
-
 	/**
 	 * List of detected DBs, access using getCompiledDBs().
 	 *
@@ -122,6 +121,7 @@ abstract class Installer {
 		'envCheckModSecurity',
 		'envCheckDiff3',
 		'envCheckGraphics',
+		'envCheckGit',
 		'envCheckServer',
 		'envCheckPath',
 		'envCheckExtension',
@@ -130,6 +130,7 @@ abstract class Installer {
 		'envCheckLibicu',
 		'envCheckSuhosinMaxValueLength',
 		'envCheckCtype',
+		'envCheckJSON',
 	);
 
 	/**
@@ -155,8 +156,8 @@ abstract class Installer {
 		'wgDBtype',
 		'wgDiff3',
 		'wgImageMagickConvertCommand',
+		'wgGitBin',
 		'IP',
-		'wgServer',
 		'wgScriptPath',
 		'wgScriptExtension',
 		'wgMetaNamespace',
@@ -301,7 +302,8 @@ abstract class Installer {
 	/**
 	 * URL to mediawiki-announce subscription
 	 */
-	protected $mediaWikiAnnounceUrl = 'https://lists.wikimedia.org/mailman/subscribe/mediawiki-announce';
+	protected $mediaWikiAnnounceUrl =
+		'https://lists.wikimedia.org/mailman/subscribe/mediawiki-announce';
 
 	/**
 	 * Supported language codes for Mailman
@@ -406,7 +408,7 @@ abstract class Installer {
 	 */
 	public function doEnvironmentChecks() {
 		$phpVersion = phpversion();
-		if( version_compare( $phpVersion, self::MINIMUM_PHP_VERSION, '>=' ) ) {
+		if ( version_compare( $phpVersion, self::MINIMUM_PHP_VERSION, '>=' ) ) {
 			$this->showMessage( 'config-env-php', $phpVersion );
 			$good = true;
 		} else {
@@ -414,7 +416,7 @@ abstract class Installer {
 			$good = false;
 		}
 
-		if( $good ) {
+		if ( $good ) {
 			foreach ( $this->envChecks as $check ) {
 				$status = $this->$check();
 				if ( $status === false ) {
@@ -480,7 +482,7 @@ abstract class Installer {
 		$type = strtolower( $type );
 
 		if ( !isset( $this->dbInstallers[$type] ) ) {
-			$class = ucfirst( $type ). 'Installer';
+			$class = ucfirst( $type ) . 'Installer';
 			$this->dbInstallers[$type] = new $class( $this );
 		}
 
@@ -500,16 +502,17 @@ abstract class Installer {
 		$_lsExists = file_exists( "$IP/LocalSettings.php" );
 		wfRestoreWarnings();
 
-		if( !$_lsExists ) {
+		if ( !$_lsExists ) {
 			return false;
 		}
 		unset( $_lsExists );
 
-		require( "$IP/includes/DefaultSettings.php" );
-		require( "$IP/LocalSettings.php" );
+		require "$IP/includes/DefaultSettings.php";
+		require "$IP/LocalSettings.php";
 		if ( file_exists( "$IP/AdminSettings.php" ) ) {
-			require( "$IP/AdminSettings.php" );
+			require "$IP/AdminSettings.php";
 		}
+
 		return get_defined_vars();
 	}
 
@@ -636,6 +639,7 @@ abstract class Installer {
 			'ss_users' => 0,
 			'ss_images' => 0 ),
 			__METHOD__, 'IGNORE' );
+
 		return Status::newGood();
 	}
 
@@ -659,13 +663,15 @@ abstract class Installer {
 
 		$allNames = array();
 
+		// Messages: config-type-mysql, config-type-postgres, config-type-oracle,
+		// config-type-sqlite
 		foreach ( self::getDBTypes() as $name ) {
 			$allNames[] = wfMessage( "config-type-$name" )->text();
 		}
 
 		$databases = $this->getCompiledDBs();
 
-		$databases = array_flip ( $databases );
+		$databases = array_flip( $databases );
 		foreach ( array_keys( $databases ) as $db ) {
 			$installer = $this->getDBInstaller( $db );
 			$status = $installer->checkPrerequisites();
@@ -679,9 +685,11 @@ abstract class Installer {
 		$databases = array_flip( $databases );
 		if ( !$databases ) {
 			$this->showError( 'config-no-db', $wgLang->commaList( $allNames ) );
+
 			// @todo FIXME: This only works for the web installer!
 			return false;
 		}
+
 		return true;
 	}
 
@@ -689,7 +697,7 @@ abstract class Installer {
 	 * Environment check for register_globals.
 	 */
 	protected function envCheckRegisterGlobals() {
-		if( wfIniGetBool( 'register_globals' ) ) {
+		if ( wfIniGetBool( 'register_globals' ) ) {
 			$this->showMessage( 'config-register-globals' );
 		}
 	}
@@ -702,8 +710,10 @@ abstract class Installer {
 		$test = new PhpXmlBugTester();
 		if ( !$test->ok ) {
 			$this->showError( 'config-brokenlibxml' );
+
 			return false;
 		}
+
 		return true;
 	}
 
@@ -717,8 +727,10 @@ abstract class Installer {
 		$test->execute();
 		if ( !$test->ok ) {
 			$this->showError( 'config-using531', phpversion() );
+
 			return false;
 		}
+
 		return true;
 	}
 
@@ -727,10 +739,12 @@ abstract class Installer {
 	 * @return bool
 	 */
 	protected function envCheckMagicQuotes() {
-		if( wfIniGetBool( "magic_quotes_runtime" ) ) {
+		if ( wfIniGetBool( "magic_quotes_runtime" ) ) {
 			$this->showError( 'config-magic-quotes-runtime' );
+
 			return false;
 		}
+
 		return true;
 	}
 
@@ -741,8 +755,10 @@ abstract class Installer {
 	protected function envCheckMagicSybase() {
 		if ( wfIniGetBool( 'magic_quotes_sybase' ) ) {
 			$this->showError( 'config-magic-quotes-sybase' );
+
 			return false;
 		}
+
 		return true;
 	}
 
@@ -753,8 +769,10 @@ abstract class Installer {
 	protected function envCheckMbstring() {
 		if ( wfIniGetBool( 'mbstring.func_overload' ) ) {
 			$this->showError( 'config-mbstring' );
+
 			return false;
 		}
+
 		return true;
 	}
 
@@ -765,8 +783,10 @@ abstract class Installer {
 	protected function envCheckZE1() {
 		if ( wfIniGetBool( 'zend.ze1_compatibility_mode' ) ) {
 			$this->showError( 'config-ze1' );
+
 			return false;
 		}
+
 		return true;
 	}
 
@@ -779,6 +799,7 @@ abstract class Installer {
 			$this->setVar( '_SafeMode', true );
 			$this->showMessage( 'config-safe-mode' );
 		}
+
 		return true;
 	}
 
@@ -789,8 +810,10 @@ abstract class Installer {
 	protected function envCheckXML() {
 		if ( !function_exists( "utf8_encode" ) ) {
 			$this->showError( 'config-xml-bad' );
+
 			return false;
 		}
+
 		return true;
 	}
 
@@ -805,6 +828,7 @@ abstract class Installer {
 	protected function envCheckPCRE() {
 		if ( !function_exists( 'preg_match' ) ) {
 			$this->showError( 'config-pcre' );
+
 			return false;
 		}
 		wfSuppressWarnings();
@@ -817,8 +841,10 @@ abstract class Installer {
 		wfRestoreWarnings();
 		if ( $regexd != '--' || $regexprop != '--' ) {
 			$this->showError( 'config-pcre-no-utf8' );
+
 			return false;
 		}
+
 		return true;
 	}
 
@@ -835,16 +861,17 @@ abstract class Installer {
 
 		$n = wfShorthandToInteger( $limit );
 
-		if( $n < $this->minMemorySize * 1024 * 1024 ) {
+		if ( $n < $this->minMemorySize * 1024 * 1024 ) {
 			$newLimit = "{$this->minMemorySize}M";
 
-			if( ini_set( "memory_limit", $newLimit ) === false ) {
+			if ( ini_set( "memory_limit", $newLimit ) === false ) {
 				$this->showMessage( 'config-memory-bad', $limit );
 			} else {
 				$this->showMessage( 'config-memory-raised', $limit, $newLimit );
 				$this->setVar( '_RaiseMemory', true );
 			}
 		}
+
 		return true;
 	}
 
@@ -877,6 +904,7 @@ abstract class Installer {
 		if ( self::apacheModulePresent( 'mod_security' ) ) {
 			$this->showMessage( 'config-mod-security' );
 		}
+
 		return true;
 	}
 
@@ -896,6 +924,7 @@ abstract class Installer {
 			$this->setVar( 'wgDiff3', false );
 			$this->showMessage( 'config-diff3-bad' );
 		}
+
 		return true;
 	}
 
@@ -905,19 +934,44 @@ abstract class Installer {
 	 */
 	protected function envCheckGraphics() {
 		$names = array( wfIsWindows() ? 'convert.exe' : 'convert' );
-		$convert = self::locateExecutableInDefaultPaths( $names, array( '$1 -version', 'ImageMagick' ) );
+		$versionInfo = array( '$1 -version', 'ImageMagick' );
+		$convert = self::locateExecutableInDefaultPaths( $names, $versionInfo );
 
 		$this->setVar( 'wgImageMagickConvertCommand', '' );
 		if ( $convert ) {
 			$this->setVar( 'wgImageMagickConvertCommand', $convert );
 			$this->showMessage( 'config-imagemagick', $convert );
+
 			return true;
 		} elseif ( function_exists( 'imagejpeg' ) ) {
 			$this->showMessage( 'config-gd' );
-
 		} else {
 			$this->showMessage( 'config-no-scaling' );
 		}
+
+		return true;
+	}
+
+	/**
+	 * Search for git.
+	 *
+	 * @since 1.22
+	 * @return bool
+	 */
+	protected function envCheckGit() {
+		$names = array( wfIsWindows() ? 'git.exe' : 'git' );
+		$versionInfo = array( '$1 --version', 'git version' );
+
+		$git = self::locateExecutableInDefaultPaths( $names, $versionInfo );
+
+		if ( $git ) {
+			$this->setVar( 'wgGitBin', $git );
+			$this->showMessage( 'config-git', $git );
+		} else {
+			$this->setVar( 'wgGitBin', false );
+			$this->showMessage( 'config-git-bad' );
+		}
+
 		return true;
 	}
 
@@ -926,8 +980,11 @@ abstract class Installer {
 	 */
 	protected function envCheckServer() {
 		$server = $this->envGetDefaultServer();
-		$this->showMessage( 'config-using-server', $server );
-		$this->setVar( 'wgServer', $server );
+		if ( $server !== null ) {
+			$this->showMessage( 'config-using-server', $server );
+			$this->setVar( 'wgServer', $server );
+		}
+
 		return true;
 	}
 
@@ -946,12 +1003,18 @@ abstract class Installer {
 		$IP = dirname( dirname( __DIR__ ) );
 		$this->setVar( 'IP', $IP );
 
-		$this->showMessage( 'config-using-uri', $this->getVar( 'wgServer' ), $this->getVar( 'wgScriptPath' ) );
+		$this->showMessage(
+			'config-using-uri',
+			$this->getVar( 'wgServer' ),
+			$this->getVar( 'wgScriptPath' )
+		);
+
 		return true;
 	}
 
 	/**
 	 * Environment check for setting the preferred PHP file extension.
+	 * @return bool
 	 */
 	protected function envCheckExtension() {
 		// @todo FIXME: Detect this properly
@@ -961,11 +1024,12 @@ abstract class Installer {
 			$ext = 'php';
 		}
 		$this->setVar( 'wgScriptExtension', ".$ext" );
+
 		return true;
 	}
 
 	/**
-	 * TODO: document
+	 * Environment check for preferred locale in shell
 	 * @return bool
 	 */
 	protected function envCheckShellLocale() {
@@ -984,7 +1048,7 @@ abstract class Installer {
 			return true;
 		}
 
-		$lines = wfArrayMap( 'trim', explode( "\n", $lines ) );
+		$lines = array_map( 'trim', explode( "\n", $lines ) );
 		$candidatesByLocale = array();
 		$candidatesByLang = array();
 
@@ -1004,8 +1068,9 @@ abstract class Installer {
 		}
 
 		# Try the current value of LANG.
-		if ( isset( $candidatesByLocale[ getenv( 'LANG' ) ] ) ) {
+		if ( isset( $candidatesByLocale[getenv( 'LANG' )] ) ) {
 			$this->setVar( 'wgShellLocale', getenv( 'LANG' ) );
+
 			return true;
 		}
 
@@ -1014,6 +1079,7 @@ abstract class Installer {
 		foreach ( $commonLocales as $commonLocale ) {
 			if ( isset( $candidatesByLocale[$commonLocale] ) ) {
 				$this->setVar( 'wgShellLocale', $commonLocale );
+
 				return true;
 			}
 		}
@@ -1024,6 +1090,7 @@ abstract class Installer {
 		if ( isset( $candidatesByLang[$wikiLang] ) ) {
 			$m = reset( $candidatesByLang[$wikiLang] );
 			$this->setVar( 'wgShellLocale', $m[0] );
+
 			return true;
 		}
 
@@ -1031,6 +1098,7 @@ abstract class Installer {
 		if ( count( $candidatesByLocale ) ) {
 			$m = reset( $candidatesByLocale );
 			$this->setVar( 'wgShellLocale', $m[0] );
+
 			return true;
 		}
 
@@ -1039,7 +1107,7 @@ abstract class Installer {
 	}
 
 	/**
-	 * TODO: document
+	 * Environment check for the permissions of the uploads directory
 	 * @return bool
 	 */
 	protected function envCheckUploadsDirectory() {
@@ -1052,26 +1120,22 @@ abstract class Installer {
 		if ( !$safe ) {
 			$this->showMessage( 'config-uploads-not-safe', $dir );
 		}
+
 		return true;
 	}
 
 	/**
-	 * Checks if suhosin.get.max_value_length is set, and if so, sets
-	 * $wgResourceLoaderMaxQueryLength to that value in the generated
-	 * LocalSettings file
+	 * Checks if suhosin.get.max_value_length is set, and if so generate
+	 * a warning because it decreases ResourceLoader performance.
 	 * @return bool
 	 */
 	protected function envCheckSuhosinMaxValueLength() {
 		$maxValueLength = ini_get( 'suhosin.get.max_value_length' );
-		if ( $maxValueLength > 0 ) {
-			if( $maxValueLength < 1024 ) {
-				# Only warn if the value is below the sane 1024
-				$this->showMessage( 'config-suhosin-max-value-length', $maxValueLength );
-			}
-		} else {
-			$maxValueLength = -1;
+		if ( $maxValueLength > 0 && $maxValueLength < 1024 ) {
+			// Only warn if the value is below the sane 1024
+			$this->showMessage( 'config-suhosin-max-value-length', $maxValueLength );
 		}
-		$this->setVar( 'wgResourceLoaderMaxQueryLength', $maxValueLength );
+
 		return true;
 	}
 
@@ -1122,14 +1186,14 @@ abstract class Installer {
 		 * We're going to prefer the pecl extension here unless
 		 * utf8_normalize is more up to date.
 		 */
-		if( $utf8 ) {
+		if ( $utf8 ) {
 			$useNormalizer = 'utf8';
 			$utf8 = utf8_normalize( $not_normal_c, UtfNormal::UNORM_NFC );
 			if ( $utf8 !== $normal_c ) {
 				$needsUpdate = true;
 			}
 		}
-		if( $intl ) {
+		if ( $intl ) {
 			$useNormalizer = 'intl';
 			$intl = normalizer_normalize( $not_normal_c, Normalizer::FORM_C );
 			if ( $intl !== $normal_c ) {
@@ -1137,12 +1201,13 @@ abstract class Installer {
 			}
 		}
 
-		// Uses messages 'config-unicode-using-php', 'config-unicode-using-utf8', 'config-unicode-using-intl'
-		if( $useNormalizer === 'php' ) {
+		// Uses messages 'config-unicode-using-php', 'config-unicode-using-utf8',
+		// 'config-unicode-using-intl'
+		if ( $useNormalizer === 'php' ) {
 			$this->showMessage( 'config-unicode-pure-php-warning' );
 		} else {
 			$this->showMessage( 'config-unicode-using-' . $useNormalizer );
-			if( $needsUpdate ) {
+			if ( $needsUpdate ) {
 				$this->showMessage( 'config-unicode-update-warning' );
 			}
 		}
@@ -1154,8 +1219,23 @@ abstract class Installer {
 	protected function envCheckCtype() {
 		if ( !function_exists( 'ctype_digit' ) ) {
 			$this->showError( 'config-ctype' );
+
+			return false;
+		}
+
+		return true;
+	}
+
+	/**
+	 * @return bool
+	 */
+	protected function envCheckJSON() {
+		if ( !function_exists( 'json_decode' ) ) {
+			$this->showError( 'config-json' );
+
 			return false;
 		}
+
 		return true;
 	}
 
@@ -1184,8 +1264,8 @@ abstract class Installer {
 	 * @param string $path path to search
 	 * @param array $names of executable names
 	 * @param $versionInfo Boolean false or array with two members:
-	 *		 0 => Command to run for version check, with $1 for the full executable name
-	 *		 1 => String to compare the output with
+	 *         0 => Command to run for version check, with $1 for the full executable name
+	 *         1 => String to compare the output with
 	 *
 	 * If $versionInfo is not false, only executables with a version
 	 * matching $versionInfo[1] will be returned.
@@ -1214,6 +1294,7 @@ abstract class Installer {
 				}
 			}
 		}
+
 		return false;
 	}
 
@@ -1225,12 +1306,13 @@ abstract class Installer {
 	 * @return bool|string
 	 */
 	public static function locateExecutableInDefaultPaths( $names, $versionInfo = false ) {
-		foreach( self::getPossibleBinPaths() as $path ) {
+		foreach ( self::getPossibleBinPaths() as $path ) {
 			$exe = self::locateExecutable( $path, $names, $versionInfo );
-			if( $exe !== false ) {
+			if ( $exe !== false ) {
 				return $exe;
 			}
 		}
+
 		return false;
 	}
 
@@ -1264,8 +1346,7 @@ abstract class Installer {
 
 				try {
 					$text = Http::get( $url . $file, array( 'timeout' => 3 ) );
-				}
-				catch( MWException $e ) {
+				} catch ( MWException $e ) {
 					// Http::get throws with allow_url_fopen = false and no curl extension.
 					$text = null;
 				}
@@ -1273,6 +1354,7 @@ abstract class Installer {
 
 				if ( $text == 'exec' ) {
 					wfRestoreWarnings();
+
 					return $ext;
 				}
 			}
@@ -1297,6 +1379,7 @@ abstract class Installer {
 		ob_start();
 		phpinfo( INFO_MODULES );
 		$info = ob_get_clean();
+
 		return strpos( $info, $moduleName ) !== false;
 	}
 
@@ -1319,6 +1402,24 @@ abstract class Installer {
 		return "{$_SERVER['PHP_SELF']}?page=" . urlencode( $page );
 	}
 
+	/**
+	 * Load the extension credits for i18n strings.  Very hacky for
+	 * now, but I expect it only be used for 1.22.0 at the most.
+	 */
+	public function getExtensionInfo( $file ) {
+		global $wgExtensionCredits, $wgVersion, $wgResourceModules;
+
+		$wgVersion = "1.22";
+		$wgResourceModules = array();
+		require_once( $file );
+		$e = array_values( $wgExtensionCredits );
+		if( $e ) {
+			$ext = array_values( $e[0] );
+			$wgExtensionCredits = array();
+			return $ext[0];
+		}
+	}
+
 	/**
 	 * Finds extensions that follow the format /extensions/Name/Name.php,
 	 * and returns an array containing the value for 'Name' for each found extension.
@@ -1326,24 +1427,37 @@ abstract class Installer {
 	 * @return array
 	 */
 	public function findExtensions() {
-		if( $this->getVar( 'IP' ) === null ) {
-			return false;
+		if ( $this->getVar( 'IP' ) === null ) {
+			return array();
 		}
 
-		$exts = array();
 		$extDir = $this->getVar( 'IP' ) . '/extensions';
-		$dh = opendir( $extDir );
+		if ( !is_readable( $extDir ) || !is_dir( $extDir ) ) {
+			return array();
+		}
 
+		$dh = opendir( $extDir );
+		$exts = array();
 		while ( ( $file = readdir( $dh ) ) !== false ) {
-			if( !is_dir( "$extDir/$file" ) ) {
+			if ( !is_dir( "$extDir/$file" ) ) {
 				continue;
 			}
-			if( file_exists( "$extDir/$file/$file.php" ) ) {
-				$exts[] = $file;
+
+			$extFile = "$extDir/$file/$file.php";
+			$extI18NFile = "$extDir/$file/$file.i18n.php";
+			if ( file_exists( $extFile ) ) {
+				if ( $info = $this->getExtensionInfo( $extFile ) ) {
+					$exts[$info['name']] = $info;
+
+					if ( file_exists( $extI18NFile ) ) {
+						global $wgExtensionMessagesFiles;
+						$wgExtensionMessagesFiles[$file] = $extI18NFile;
+					}
+				}
 			}
 		}
-		natcasesort( $exts );
-
+		closedir( $dh );
+		uksort( $exts, 'strnatcasecmp' );
 		return $exts;
 	}
 
@@ -1368,10 +1482,11 @@ abstract class Installer {
 		global $wgAutoloadClasses;
 		$wgAutoloadClasses = array();
 
-		require( "$IP/includes/DefaultSettings.php" );
+		require "$IP/includes/DefaultSettings.php";
 
-		foreach( $exts as $e ) {
-			require_once( "$IP/extensions/$e/$e.php" );
+		$extensions = $this->findExtensions();
+		foreach ( $exts as $e ) {
+			require_once $extensions[$e]['path'];
 		}
 
 		$hooksWeWant = isset( $wgHooks['LoadExtensionSchemaUpdates'] ) ?
@@ -1398,29 +1513,29 @@ abstract class Installer {
 	 */
 	protected function getInstallSteps( DatabaseInstaller $installer ) {
 		$coreInstallSteps = array(
-			array( 'name' => 'database',   'callback' => array( $installer, 'setupDatabase' ) ),
-			array( 'name' => 'tables',     'callback' => array( $installer, 'createTables' ) ),
-			array( 'name' => 'interwiki',  'callback' => array( $installer, 'populateInterwikiTable' ) ),
-			array( 'name' => 'stats',      'callback' => array( $this, 'populateSiteStats' ) ),
-			array( 'name' => 'keys',       'callback' => array( $this, 'generateKeys' ) ),
-			array( 'name' => 'sysop',      'callback' => array( $this, 'createSysop' ) ),
-			array( 'name' => 'mainpage',   'callback' => array( $this, 'createMainpage' ) ),
+			array( 'name' => 'database', 'callback' => array( $installer, 'setupDatabase' ) ),
+			array( 'name' => 'tables', 'callback' => array( $installer, 'createTables' ) ),
+			array( 'name' => 'interwiki', 'callback' => array( $installer, 'populateInterwikiTable' ) ),
+			array( 'name' => 'stats', 'callback' => array( $this, 'populateSiteStats' ) ),
+			array( 'name' => 'keys', 'callback' => array( $this, 'generateKeys' ) ),
+			array( 'name' => 'sysop', 'callback' => array( $this, 'createSysop' ) ),
+			array( 'name' => 'mainpage', 'callback' => array( $this, 'createMainpage' ) ),
 		);
 
 		// Build the array of install steps starting from the core install list,
 		// then adding any callbacks that wanted to attach after a given step
-		foreach( $coreInstallSteps as $step ) {
+		foreach ( $coreInstallSteps as $step ) {
 			$this->installSteps[] = $step;
-			if( isset( $this->extraInstallSteps[ $step['name'] ] ) ) {
+			if ( isset( $this->extraInstallSteps[$step['name']] ) ) {
 				$this->installSteps = array_merge(
 					$this->installSteps,
-					$this->extraInstallSteps[ $step['name'] ]
+					$this->extraInstallSteps[$step['name']]
 				);
 			}
 		}
 
 		// Prepend any steps that want to be at the beginning
-		if( isset( $this->extraInstallSteps['BEGINNING'] ) ) {
+		if ( isset( $this->extraInstallSteps['BEGINNING'] ) ) {
 			$this->installSteps = array_merge(
 				$this->extraInstallSteps['BEGINNING'],
 				$this->installSteps
@@ -1428,7 +1543,7 @@ abstract class Installer {
 		}
 
 		// Extensions should always go first, chance to tie into hooks and such
-		if( count( $this->getVar( '_Extensions' ) ) ) {
+		if ( count( $this->getVar( '_Extensions' ) ) ) {
 			array_unshift( $this->installSteps,
 				array( 'name' => 'extensions', 'callback' => array( $this, 'includeExtensions' ) )
 			);
@@ -1437,6 +1552,7 @@ abstract class Installer {
 				'callback' => array( $installer, 'createExtensionTables' )
 			);
 		}
+
 		return $this->installSteps;
 	}
 
@@ -1453,7 +1569,7 @@ abstract class Installer {
 		$installer = $this->getDBInstaller();
 		$installer->preInstall();
 		$steps = $this->getInstallSteps( $installer );
-		foreach( $steps as $stepObj ) {
+		foreach ( $steps as $stepObj ) {
 			$name = $stepObj['name'];
 			call_user_func_array( $startCB, array( $name ) );
 
@@ -1466,13 +1582,14 @@ abstract class Installer {
 
 			// If we've hit some sort of fatal, we need to bail.
 			// Callback already had a chance to do output above.
-			if( !$status->isOk() ) {
+			if ( !$status->isOk() ) {
 				break;
 			}
 		}
-		if( $status->isOk() ) {
+		if ( $status->isOk() ) {
 			$this->setVar( '_InstallDone', true );
 		}
+
 		return $installResults;
 	}
 
@@ -1486,6 +1603,7 @@ abstract class Installer {
 		if ( strval( $this->getVar( 'wgUpgradeKey' ) ) === '' ) {
 			$keys['wgUpgradeKey'] = 16;
 		}
+
 		return $this->doGenerateKeys( $keys );
 	}
 
@@ -1538,13 +1656,13 @@ abstract class Installer {
 
 			try {
 				$user->setPassword( $this->getVar( '_AdminPassword' ) );
-			} catch( PasswordError $pwe ) {
+			} catch ( PasswordError $pwe ) {
 				return Status::newFatal( 'config-admin-error-password', $name, $pwe->getMessage() );
 			}
 
 			$user->addGroup( 'sysop' );
 			$user->addGroup( 'bureaucrat' );
-			if( $this->getVar( '_AdminEmail' ) ) {
+			if ( $this->getVar( '_AdminEmail' ) ) {
 				$user->setEmail( $this->getVar( '_AdminEmail' ) );
 			}
 			$user->saveSettings();
@@ -1555,7 +1673,7 @@ abstract class Installer {
 		}
 		$status = Status::newGood();
 
-		if( $this->getVar( '_Subscribe' ) && $this->getVar( '_AdminEmail' ) ) {
+		if ( $this->getVar( '_Subscribe' ) && $this->getVar( '_AdminEmail' ) ) {
 			$this->subscribeToMediaWikiAnnounce( $status );
 		}
 
@@ -1567,23 +1685,23 @@ abstract class Installer {
 	 */
 	private function subscribeToMediaWikiAnnounce( Status $s ) {
 		$params = array(
-			'email'    => $this->getVar( '_AdminEmail' ),
+			'email' => $this->getVar( '_AdminEmail' ),
 			'language' => 'en',
-			'digest'   => 0
+			'digest' => 0
 		);
 
 		// Mailman doesn't support as many languages as we do, so check to make
 		// sure their selected language is available
 		$myLang = $this->getVar( '_UserLang' );
-		if( in_array( $myLang, $this->mediaWikiAnnounceLanguages ) ) {
+		if ( in_array( $myLang, $this->mediaWikiAnnounceLanguages ) ) {
 			$myLang = $myLang == 'pt-br' ? 'pt_BR' : $myLang; // rewrite to Mailman's pt_BR
 			$params['language'] = $myLang;
 		}
 
-		if( MWHttpRequest::canMakeRequests() ) {
+		if ( MWHttpRequest::canMakeRequests() ) {
 			$res = MWHttpRequest::factory( $this->mediaWikiAnnounceUrl,
 				array( 'method' => 'POST', 'postData' => $params ) )->execute();
-			if( !$res->isOK() ) {
+			if ( !$res->isOK() ) {
 				$s->warning( 'config-install-subscribe-fail', $res->getMessage() );
 			}
 		} else {
@@ -1601,17 +1719,18 @@ abstract class Installer {
 		$status = Status::newGood();
 		try {
 			$page = WikiPage::factory( Title::newMainPage() );
-			$content = new WikitextContent (
+			$content = new WikitextContent(
 				wfMessage( 'mainpagetext' )->inContentLanguage()->text() . "\n\n" .
 				wfMessage( 'mainpagedocfooter' )->inContentLanguage()->text()
 			);
 
 			$page->doEditContent( $content,
-					'',
-					EDIT_NEW,
-					false,
-					User::newFromName( 'MediaWiki default' ) );
-		} catch (MWException $e) {
+				'',
+				EDIT_NEW,
+				false,
+				User::newFromName( 'MediaWiki default' )
+			);
+		} catch ( MWException $e ) {
 			//using raw, because $wgShowExceptionDetails can not be set yet
 			$status->fatal( 'config-install-mainpage-failed', $e->getMessage() );
 		}
@@ -1646,6 +1765,11 @@ abstract class Installer {
 
 		// Some of the environment checks make shell requests, remove limits
 		$GLOBALS['wgMaxShellMemory'] = 0;
+
+		// Don't bother embedding images into generated CSS, which is not cached
+		$GLOBALS['wgResourceLoaderLESSFunctions']['embeddable'] = function( $frame, $less ) {
+			return $less->toBool( false );
+		};
 	}
 
 	/**
diff --git a/includes/installer/LocalSettingsGenerator.php b/includes/installer/LocalSettingsGenerator.php
index 72ea3db7..5c803d3e 100644
--- a/includes/installer/LocalSettingsGenerator.php
+++ b/includes/installer/LocalSettingsGenerator.php
@@ -73,14 +73,14 @@ class LocalSettingsGenerator {
 			'wgEnotifWatchlist', 'wgEmailAuthentication', 'wgEnableUploads', 'wgUseInstantCommons'
 		);
 
-		foreach( $confItems as $c ) {
+		foreach ( $confItems as $c ) {
 			$val = $installer->getVar( $c );
 
-			if( in_array( $c, $boolItems ) ) {
+			if ( in_array( $c, $boolItems ) ) {
 				$val = wfBoolToStr( $val );
 			}
 
-			if ( !in_array( $c, $unescaped ) ) {
+			if ( !in_array( $c, $unescaped ) && $val !== null ) {
 				$val = self::escapePhpString( $val );
 			}
 
@@ -136,15 +136,17 @@ class LocalSettingsGenerator {
 	public function getText() {
 		$localSettings = $this->getDefaultText();
 
-		if( count( $this->extensions ) ) {
+		if ( count( $this->extensions ) ) {
+			$extensions = $this->installer->findExtensions();
 			$localSettings .= "
 # Enabled Extensions. Most extensions are enabled by including the base extension file here
 # but check specific extension documentation for more details
 # The following extensions were automatically enabled:\n";
 
-			foreach( $this->extensions as $extName ) {
-				$encExtName = self::escapePhpString( $extName );
-				$localSettings .= "require_once( \"\$IP/extensions/$encExtName/$encExtName.php\" );\n";
+			$ip = $this->installer->getVar( 'IP' );
+			foreach ( $this->extensions as $ext) {
+				$path = str_replace( $ip, '$IP', $extensions[$ext]['path'] );
+				$localSettings .= "require_once \"$path\";\n";
 			}
 		}
 
@@ -169,13 +171,13 @@ class LocalSettingsGenerator {
 	protected function buildMemcachedServerList() {
 		$servers = $this->values['_MemCachedServers'];
 
-		if( !$servers ) {
+		if ( !$servers ) {
 			return 'array()';
 		} else {
 			$ret = 'array( ';
 			$servers = explode( ',', $servers );
 
-			foreach( $servers as $srv ) {
+			foreach ( $servers as $srv ) {
 				$srv = trim( $srv );
 				$ret .= "'$srv', ";
 			}
@@ -188,33 +190,33 @@ class LocalSettingsGenerator {
 	 * @return String
 	 */
 	protected function getDefaultText() {
-		if( !$this->values['wgImageMagickConvertCommand'] ) {
+		if ( !$this->values['wgImageMagickConvertCommand'] ) {
 			$this->values['wgImageMagickConvertCommand'] = '/usr/bin/convert';
 			$magic = '#';
 		} else {
 			$magic = '';
 		}
 
-		if( !$this->values['wgShellLocale'] ) {
+		if ( !$this->values['wgShellLocale'] ) {
 			$this->values['wgShellLocale'] = 'en_US.UTF-8';
 			$locale = '#';
 		} else {
 			$locale = '';
 		}
 
-		//$rightsUrl = $this->values['wgRightsUrl'] ? '' : '#'; // TODO: Fixme, I'm unused!
+		//$rightsUrl = $this->values['wgRightsUrl'] ? '' : '#'; // @todo FIXME: I'm unused!
 		$hashedUploads = $this->safeMode ? '' : '#';
 		$metaNamespace = '';
-		if( $this->values['wgMetaNamespace'] !== $this->values['wgSitename'] ) {
+		if ( $this->values['wgMetaNamespace'] !== $this->values['wgSitename'] ) {
 			$metaNamespace = "\$wgMetaNamespace = \"{$this->values['wgMetaNamespace']}\";\n";
 		}
 
 		$groupRights = '';
-		if( $this->groupPermissions ) {
+		if ( $this->groupPermissions ) {
 			$groupRights .= "# The following permissions were set based on your choice in the installer\n";
-			foreach( $this->groupPermissions as $group => $rightArr ) {
+			foreach ( $this->groupPermissions as $group => $rightArr ) {
 				$group = self::escapePhpString( $group );
-				foreach( $rightArr as $right => $perm ) {
+				foreach ( $rightArr as $right => $perm ) {
 					$right = self::escapePhpString( $right );
 					$groupRights .= "\$wgGroupPermissions['$group']['$right'] = " .
 						wfBoolToStr( $perm ) . ";\n";
@@ -222,12 +224,18 @@ class LocalSettingsGenerator {
 			}
 		}
 
-		switch( $this->values['wgMainCacheType'] ) {
+		$wgServerSetting = "";
+		if ( array_key_exists( 'wgServer', $this->values ) && $this->values['wgServer'] !== null ) {
+			$wgServerSetting = "\n## The protocol and server name to use in fully-qualified URLs\n";
+			$wgServerSetting .= "\$wgServer = \"{$this->values['wgServer']}\";\n";
+		}
+
+		switch ( $this->values['wgMainCacheType'] ) {
 			case 'anything':
 			case 'db':
 			case 'memcached':
 			case 'accel':
-				$cacheType = 'CACHE_' . strtoupper( $this->values['wgMainCacheType']);
+				$cacheType = 'CACHE_' . strtoupper( $this->values['wgMainCacheType'] );
 				break;
 			case 'none':
 			default:
@@ -235,6 +243,7 @@ class LocalSettingsGenerator {
 		}
 
 		$mcservers = $this->buildMemcachedServerList();
+
 		return "<?php
 # This file was automatically generated by the MediaWiki {$GLOBALS['wgVersion']}
 # installer. If you make manual changes, please keep track in case you
@@ -264,10 +273,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 ## http://www.mediawiki.org/wiki/Manual:Short_URL
 \$wgScriptPath = \"{$this->values['wgScriptPath']}\";
 \$wgScriptExtension = \"{$this->values['wgScriptExtension']}\";
-
-## The protocol and server name to use in fully-qualified URLs
-\$wgServer = \"{$this->values['wgServer']}\";
-
+${wgServerSetting}
 ## The relative URL path to the skins directory
 \$wgStylePath = \"\$wgScriptPath/skins\";
 
@@ -335,7 +341,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 \$wgUpgradeKey = \"{$this->values['wgUpgradeKey']}\";
 
 ## Default skin: you can change the default skin. Use the internal symbolic
-## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook', 'vector':
+## names, ie 'cologneblue', 'monobook', 'vector':
 \$wgDefaultSkin = \"{$this->values['wgDefaultSkin']}\";
 
 ## For attaching licensing metadata to pages, and displaying an
@@ -349,13 +355,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 # Path to the GNU diff3 utility. Used for conflict resolution.
 \$wgDiff3 = \"{$this->values['wgDiff3']}\";
 
-# Query string length limit for ResourceLoader. You should only set this if
-# your web server has a query string length limit (then set it to that limit),
-# or if you have suhosin.get.max_value_length set in php.ini (then set it to
-# that value)
-\$wgResourceLoaderMaxQueryLength = {$this->values['wgResourceLoaderMaxQueryLength']};
-
 {$groupRights}";
 	}
-
 }
diff --git a/includes/installer/MysqlInstaller.php b/includes/installer/MysqlInstaller.php
index f9a8ce75..5f76972c 100644
--- a/includes/installer/MysqlInstaller.php
+++ b/includes/installer/MysqlInstaller.php
@@ -64,15 +64,11 @@ class MysqlInstaller extends DatabaseInstaller {
 		return 'mysql';
 	}
 
-	public function __construct( $parent ) {
-		parent::__construct( $parent );
-	}
-
 	/**
 	 * @return Bool
 	 */
 	public function isCompiled() {
-		return self::checkExtension( 'mysql' );
+		return self::checkExtension( 'mysql' ) || self::checkExtension( 'mysqli' );
 	}
 
 	/**
@@ -86,12 +82,18 @@ class MysqlInstaller extends DatabaseInstaller {
 	 * @return string
 	 */
 	public function getConnectForm() {
-		return
-			$this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
+		return $this->getTextBox(
+			'wgDBserver',
+			'config-db-host',
+			array(),
+			$this->parent->getHelpBox( 'config-db-host-help' )
+		) .
 			Html::openElement( 'fieldset' ) .
 			Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
-			$this->getTextBox( 'wgDBname', 'config-db-name', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
-			$this->getTextBox( 'wgDBprefix', 'config-db-prefix', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-prefix-help' ) ) .
+			$this->getTextBox( 'wgDBname', 'config-db-name', array( 'dir' => 'ltr' ),
+				$this->parent->getHelpBox( 'config-db-name-help' ) ) .
+			$this->getTextBox( 'wgDBprefix', 'config-db-prefix', array( 'dir' => 'ltr' ),
+				$this->parent->getHelpBox( 'config-db-prefix-help' ) ) .
 			Html::closeElement( 'fieldset' ) .
 			$this->getInstallUserBox();
 	}
@@ -148,19 +150,18 @@ class MysqlInstaller extends DatabaseInstaller {
 	public function openConnection() {
 		$status = Status::newGood();
 		try {
-			$db = new DatabaseMysql(
-				$this->getVar( 'wgDBserver' ),
-				$this->getVar( '_InstallUser' ),
-				$this->getVar( '_InstallPassword' ),
-				false,
-				false,
-				0,
-				$this->getVar( 'wgDBprefix' )
-			);
+			$db = DatabaseBase::factory( 'mysql', array(
+				'host' => $this->getVar( 'wgDBserver' ),
+				'user' => $this->getVar( '_InstallUser' ),
+				'password' => $this->getVar( '_InstallPassword' ),
+				'dbname' => false,
+				'flags' => 0,
+				'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) );
 			$status->value = $db;
 		} catch ( DBConnectionError $e ) {
 			$status->fatal( 'config-connection-error', $e->getMessage() );
 		}
+
 		return $status;
 	}
 
@@ -170,6 +171,7 @@ class MysqlInstaller extends DatabaseInstaller {
 		$status = $this->getConnection();
 		if ( !$status->isOK() ) {
 			$this->parent->showStatusError( $status );
+
 			return;
 		}
 		/**
@@ -243,6 +245,7 @@ class MysqlInstaller extends DatabaseInstaller {
 			}
 		}
 		$engines = array_intersect( $this->supportedEngines, $engines );
+
 		return $engines;
 	}
 
@@ -327,6 +330,7 @@ class MysqlInstaller extends DatabaseInstaller {
 			// Can't grant everything
 			return false;
 		}
+
 		return true;
 	}
 
@@ -350,17 +354,24 @@ class MysqlInstaller extends DatabaseInstaller {
 
 		$s .= Xml::openElement( 'div', array(
 			'id' => 'dbMyisamWarning'
-		));
-		$s .= $this->parent->getWarningBox( wfMessage( 'config-mysql-myisam-dep' )->text() );
+		) );
+		$myisamWarning = 'config-mysql-myisam-dep';
+		if ( count( $engines ) === 1 ) {
+			$myisamWarning = 'config-mysql-only-myisam-dep';
+		}
+		$s .= $this->parent->getWarningBox( wfMessage( $myisamWarning )->text() );
 		$s .= Xml::closeElement( 'div' );
 
-		if( $this->getVar( '_MysqlEngine' ) != 'MyISAM' ) {
+		if ( $this->getVar( '_MysqlEngine' ) != 'MyISAM' ) {
 			$s .= Xml::openElement( 'script', array( 'type' => 'text/javascript' ) );
 			$s .= '$(\'#dbMyisamWarning\').hide();';
 			$s .= Xml::closeElement( 'script' );
 		}
 
 		if ( count( $engines ) >= 2 ) {
+			// getRadioSet() builds a set of labeled radio buttons.
+			// For grep: The following messages are used as the item labels:
+			// config-mysql-innodb, config-mysql-myisam
 			$s .= $this->getRadioSet( array(
 				'var' => '_MysqlEngine',
 				'label' => 'config-mysql-engine',
@@ -369,11 +380,14 @@ class MysqlInstaller extends DatabaseInstaller {
 				'itemAttribs' => array(
 					'MyISAM' => array(
 						'class' => 'showHideRadio',
-						'rel'   => 'dbMyisamWarning'),
+						'rel' => 'dbMyisamWarning'
+					),
 					'InnoDB' => array(
 						'class' => 'hideShowRadio',
-						'rel'   => 'dbMyisamWarning')
-			)));
+						'rel' => 'dbMyisamWarning'
+					)
+				)
+			) );
 			$s .= $this->parent->getHelpBox( 'config-mysql-engine-help' );
 		}
 
@@ -385,12 +399,15 @@ class MysqlInstaller extends DatabaseInstaller {
 
 		// Do charset selector
 		if ( count( $charsets ) >= 2 ) {
+			// getRadioSet() builds a set of labeled radio buttons.
+			// For grep: The following messages are used as the item labels:
+			// config-mysql-binary, config-mysql-utf8
 			$s .= $this->getRadioSet( array(
 				'var' => '_MysqlCharset',
 				'label' => 'config-mysql-charset',
 				'itemLabelPrefix' => 'config-mysql-',
 				'values' => $charsets
-			));
+			) );
 			$s .= $this->parent->getHelpBox( 'config-mysql-charset-help' );
 		}
 
@@ -419,15 +436,13 @@ class MysqlInstaller extends DatabaseInstaller {
 		if ( !$create ) {
 			// Test the web account
 			try {
-				new DatabaseMysql(
-					$this->getVar( 'wgDBserver' ),
-					$this->getVar( 'wgDBuser' ),
-					$this->getVar( 'wgDBpassword' ),
-					false,
-					false,
-					0,
-					$this->getVar( 'wgDBprefix' )
-				);
+				$db = DatabaseBase::factory( 'mysql', array(
+					'host' => $this->getVar( 'wgDBserver' ),
+					'user' => $this->getVar( 'wgDBuser' ),
+					'password' => $this->getVar( 'wgDBpassword' ),
+					'dbname' => false,
+					'flags' => 0,
+					'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) );
 			} catch ( DBConnectionError $e ) {
 				return Status::newFatal( 'config-connection-error', $e->getMessage() );
 			}
@@ -443,6 +458,7 @@ class MysqlInstaller extends DatabaseInstaller {
 		if ( !in_array( $this->getVar( '_MysqlCharset' ), $charsets ) ) {
 			$this->setVar( '_MysqlCharset', reset( $charsets ) );
 		}
+
 		return Status::newGood();
 	}
 
@@ -465,11 +481,15 @@ class MysqlInstaller extends DatabaseInstaller {
 		}
 		$conn = $status->value;
 		$dbName = $this->getVar( 'wgDBname' );
-		if( !$conn->selectDB( $dbName ) ) {
-			$conn->query( "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ), __METHOD__ );
+		if ( !$conn->selectDB( $dbName ) ) {
+			$conn->query(
+				"CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ) . "CHARACTER SET utf8",
+				__METHOD__
+			);
 			$conn->selectDB( $dbName );
 		}
 		$this->setupSchemaVars();
+
 		return $status;
 	}
 
@@ -478,7 +498,7 @@ class MysqlInstaller extends DatabaseInstaller {
 	 */
 	public function setupUser() {
 		$dbUser = $this->getVar( 'wgDBuser' );
-		if( $dbUser == $this->getVar( '_InstallUser' ) ) {
+		if ( $dbUser == $this->getVar( '_InstallUser' ) ) {
 			return Status::newGood();
 		}
 		$status = $this->getConnection();
@@ -496,15 +516,13 @@ class MysqlInstaller extends DatabaseInstaller {
 		if ( $this->getVar( '_CreateDBAccount' ) ) {
 			// Before we blindly try to create a user that already has access,
 			try { // first attempt to connect to the database
-				new DatabaseMysql(
-					$server,
-					$dbUser,
-					$password,
-					false,
-					false,
-					0,
-					$this->getVar( 'wgDBprefix' )
-				);
+				$db = DatabaseBase::factory( 'mysql', array(
+					'host' => $server,
+					'user' => $dbUser,
+					'password' => $password,
+					'dbname' => false,
+					'flags' => 0,
+					'tablePrefix' => $this->getVar( 'wgDBprefix' ) ) );
 				$grantableNames[] = $this->buildFullUserName( $dbUser, $server );
 				$tryToCreate = false;
 			} catch ( DBConnectionError $e ) {
@@ -515,7 +533,7 @@ class MysqlInstaller extends DatabaseInstaller {
 			$tryToCreate = false;
 		}
 
-		if( $tryToCreate ) {
+		if ( $tryToCreate ) {
 			$createHostList = array(
 				$server,
 				'localhost',
@@ -526,16 +544,16 @@ class MysqlInstaller extends DatabaseInstaller {
 			$createHostList = array_unique( $createHostList );
 			$escPass = $this->db->addQuotes( $password );
 
-			foreach( $createHostList as $host ) {
+			foreach ( $createHostList as $host ) {
 				$fullName = $this->buildFullUserName( $dbUser, $host );
-				if( !$this->userDefinitelyExists( $dbUser, $host ) ) {
-					try{
+				if ( !$this->userDefinitelyExists( $dbUser, $host ) ) {
+					try {
 						$this->db->begin( __METHOD__ );
 						$this->db->query( "CREATE USER $fullName IDENTIFIED BY $escPass", __METHOD__ );
 						$this->db->commit( __METHOD__ );
 						$grantableNames[] = $fullName;
-					} catch( DBQueryError $dqe ) {
-						if( $this->db->lastErrno() == 1396 /* ER_CANNOT_USER */ ) {
+					} catch ( DBQueryError $dqe ) {
+						if ( $this->db->lastErrno() == 1396 /* ER_CANNOT_USER */ ) {
 							// User (probably) already exists
 							$this->db->rollback( __METHOD__ );
 							$status->warning( 'config-install-user-alreadyexists', $dbUser );
@@ -558,12 +576,12 @@ class MysqlInstaller extends DatabaseInstaller {
 
 		// Try to grant to all the users we know exist or we were able to create
 		$dbAllTables = $this->db->addIdentifierQuotes( $dbName ) . '.*';
-		foreach( $grantableNames as $name ) {
+		foreach ( $grantableNames as $name ) {
 			try {
 				$this->db->begin( __METHOD__ );
 				$this->db->query( "GRANT ALL PRIVILEGES ON $dbAllTables TO $name", __METHOD__ );
 				$this->db->commit( __METHOD__ );
-			} catch( DBQueryError $dqe ) {
+			} catch ( DBQueryError $dqe ) {
 				$this->db->rollback( __METHOD__ );
 				$status->fatal( 'config-install-user-grant-failed', $dbUser, $dqe->getText() );
 			}
@@ -593,11 +611,11 @@ class MysqlInstaller extends DatabaseInstaller {
 		try {
 			$res = $this->db->selectRow( 'mysql.user', array( 'Host', 'User' ),
 				array( 'Host' => $host, 'User' => $user ), __METHOD__ );
+
 			return (bool)$res;
-		} catch( DBQueryError $dqe ) {
+		} catch ( DBQueryError $dqe ) {
 			return false;
 		}
-
 	}
 
 	/**
@@ -614,6 +632,7 @@ class MysqlInstaller extends DatabaseInstaller {
 		if ( $this->getVar( '_MysqlCharset' ) !== null ) {
 			$options[] = 'DEFAULT CHARSET=' . $this->getVar( '_MysqlCharset' );
 		}
+
 		return implode( ', ', $options );
 	}
 
@@ -635,8 +654,8 @@ class MysqlInstaller extends DatabaseInstaller {
 		$dbmysql5 = wfBoolToStr( $this->getVar( 'wgDBmysql5', true ) );
 		$prefix = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBprefix' ) );
 		$tblOpts = LocalSettingsGenerator::escapePhpString( $this->getTableOptions() );
-		return
-"# MySQL specific settings
+
+		return "# MySQL specific settings
 \$wgDBprefix = \"{$prefix}\";
 
 # MySQL table options to use during installation or update
diff --git a/includes/installer/MysqlUpdater.php b/includes/installer/MysqlUpdater.php
index 030c57fc..f348ecd4 100644
--- a/includes/installer/MysqlUpdater.php
+++ b/includes/installer/MysqlUpdater.php
@@ -31,209 +31,214 @@ class MysqlUpdater extends DatabaseUpdater {
 
 	protected function getCoreUpdateList() {
 		return array(
-			array( 'disableContentHandlerUseDB' ),
-
 			// 1.2
-			array( 'addField', 'ipblocks',      'ipb_id',           'patch-ipblocks.sql' ),
-			array( 'addField', 'ipblocks',      'ipb_expiry',       'patch-ipb_expiry.sql' ),
+			array( 'addField', 'ipblocks', 'ipb_id', 'patch-ipblocks.sql' ),
+			array( 'addField', 'ipblocks', 'ipb_expiry', 'patch-ipb_expiry.sql' ),
 			array( 'doInterwikiUpdate' ),
 			array( 'doIndexUpdate' ),
-			array( 'addTable', 'hitcounter',                        'patch-hitcounter.sql' ),
-			array( 'addField', 'recentchanges', 'rc_type',          'patch-rc_type.sql' ),
+			array( 'addTable', 'hitcounter', 'patch-hitcounter.sql' ),
+			array( 'addField', 'recentchanges', 'rc_type', 'patch-rc_type.sql' ),
 
 			// 1.3
-			array( 'addField', 'user',          'user_real_name',   'patch-user-realname.sql' ),
-			array( 'addTable', 'querycache',                        'patch-querycache.sql' ),
-			array( 'addTable', 'objectcache',                       'patch-objectcache.sql' ),
-			array( 'addTable', 'categorylinks',                     'patch-categorylinks.sql' ),
+			array( 'addField', 'user', 'user_real_name', 'patch-user-realname.sql' ),
+			array( 'addTable', 'querycache', 'patch-querycache.sql' ),
+			array( 'addTable', 'objectcache', 'patch-objectcache.sql' ),
+			array( 'addTable', 'categorylinks', 'patch-categorylinks.sql' ),
 			array( 'doOldLinksUpdate' ),
 			array( 'doFixAncientImagelinks' ),
-			array( 'addField', 'recentchanges', 'rc_ip',            'patch-rc_ip.sql' ),
+			array( 'addField', 'recentchanges', 'rc_ip', 'patch-rc_ip.sql' ),
 
 			// 1.4
-			array( 'addIndex', 'image',         'PRIMARY',          'patch-image_name_primary.sql' ),
-			array( 'addField', 'recentchanges', 'rc_id',            'patch-rc_id.sql' ),
-			array( 'addField', 'recentchanges', 'rc_patrolled',     'patch-rc-patrol.sql' ),
-			array( 'addTable', 'logging',                           'patch-logging.sql' ),
-			array( 'addField', 'user',          'user_token',       'patch-user_token.sql' ),
-			array( 'addField', 'watchlist',     'wl_notificationtimestamp', 'patch-email-notification.sql' ),
+			array( 'addIndex', 'image', 'PRIMARY', 'patch-image_name_primary.sql' ),
+			array( 'addField', 'recentchanges', 'rc_id', 'patch-rc_id.sql' ),
+			array( 'addField', 'recentchanges', 'rc_patrolled', 'patch-rc-patrol.sql' ),
+			array( 'addTable', 'logging', 'patch-logging.sql' ),
+			array( 'addField', 'user', 'user_token', 'patch-user_token.sql' ),
+			array( 'addField', 'watchlist', 'wl_notificationtimestamp', 'patch-email-notification.sql' ),
 			array( 'doWatchlistUpdate' ),
-			array( 'dropField', 'user',         'user_emailauthenticationtimestamp', 'patch-email-authentication.sql' ),
+			array( 'dropField', 'user', 'user_emailauthenticationtimestamp',
+				'patch-email-authentication.sql' ),
 
 			// 1.5
 			array( 'doSchemaRestructuring' ),
-			array( 'addField', 'logging',       'log_params',       'patch-log_params.sql' ),
-			array( 'checkBin', 'logging',       'log_title',        'patch-logging-title.sql', ),
-			array( 'addField', 'archive',       'ar_rev_id',        'patch-archive-rev_id.sql' ),
-			array( 'addField', 'page',          'page_len',         'patch-page_len.sql' ),
-			array( 'dropField', 'revision',     'inverse_timestamp', 'patch-inverse_timestamp.sql' ),
-			array( 'addField', 'revision',      'rev_text_id',      'patch-rev_text_id.sql' ),
-			array( 'addField', 'revision',      'rev_deleted',      'patch-rev_deleted.sql' ),
-			array( 'addField', 'image',         'img_width',        'patch-img_width.sql' ),
-			array( 'addField', 'image',         'img_metadata',     'patch-img_metadata.sql' ),
-			array( 'addField', 'user',          'user_email_token', 'patch-user_email_token.sql' ),
-			array( 'addField', 'archive',       'ar_text_id',       'patch-archive-text_id.sql' ),
+			array( 'addField', 'logging', 'log_params', 'patch-log_params.sql' ),
+			array( 'checkBin', 'logging', 'log_title', 'patch-logging-title.sql', ),
+			array( 'addField', 'archive', 'ar_rev_id', 'patch-archive-rev_id.sql' ),
+			array( 'addField', 'page', 'page_len', 'patch-page_len.sql' ),
+			array( 'dropField', 'revision', 'inverse_timestamp', 'patch-inverse_timestamp.sql' ),
+			array( 'addField', 'revision', 'rev_text_id', 'patch-rev_text_id.sql' ),
+			array( 'addField', 'revision', 'rev_deleted', 'patch-rev_deleted.sql' ),
+			array( 'addField', 'image', 'img_width', 'patch-img_width.sql' ),
+			array( 'addField', 'image', 'img_metadata', 'patch-img_metadata.sql' ),
+			array( 'addField', 'user', 'user_email_token', 'patch-user_email_token.sql' ),
+			array( 'addField', 'archive', 'ar_text_id', 'patch-archive-text_id.sql' ),
 			array( 'doNamespaceSize' ),
-			array( 'addField', 'image',         'img_media_type',   'patch-img_media_type.sql' ),
+			array( 'addField', 'image', 'img_media_type', 'patch-img_media_type.sql' ),
 			array( 'doPagelinksUpdate' ),
-			array( 'dropField', 'image',        'img_type',         'patch-drop_img_type.sql' ),
+			array( 'dropField', 'image', 'img_type', 'patch-drop_img_type.sql' ),
 			array( 'doUserUniqueUpdate' ),
 			array( 'doUserGroupsUpdate' ),
-			array( 'addField', 'site_stats',    'ss_total_pages',   'patch-ss_total_articles.sql' ),
-			array( 'addTable', 'user_newtalk',                      'patch-usernewtalk2.sql' ),
-			array( 'addTable', 'transcache',                        'patch-transcache.sql' ),
-			array( 'addField', 'interwiki',     'iw_trans',         'patch-interwiki-trans.sql' ),
+			array( 'addField', 'site_stats', 'ss_total_pages', 'patch-ss_total_articles.sql' ),
+			array( 'addTable', 'user_newtalk', 'patch-usernewtalk2.sql' ),
+			array( 'addTable', 'transcache', 'patch-transcache.sql' ),
+			array( 'addField', 'interwiki', 'iw_trans', 'patch-interwiki-trans.sql' ),
 
 			// 1.6
 			array( 'doWatchlistNull' ),
-			array( 'addIndex', 'logging',         'times',            'patch-logging-times-index.sql' ),
-			array( 'addField', 'ipblocks',        'ipb_range_start',  'patch-ipb_range_start.sql' ),
+			array( 'addIndex', 'logging', 'times', 'patch-logging-times-index.sql' ),
+			array( 'addField', 'ipblocks', 'ipb_range_start', 'patch-ipb_range_start.sql' ),
 			array( 'doPageRandomUpdate' ),
-			array( 'addField', 'user',            'user_registration', 'patch-user_registration.sql' ),
+			array( 'addField', 'user', 'user_registration', 'patch-user_registration.sql' ),
 			array( 'doTemplatelinksUpdate' ),
-			array( 'addTable', 'externallinks',                       'patch-externallinks.sql' ),
-			array( 'addTable', 'job',                                 'patch-job.sql' ),
-			array( 'addField', 'site_stats',      'ss_images',        'patch-ss_images.sql' ),
-			array( 'addTable', 'langlinks',                           'patch-langlinks.sql' ),
-			array( 'addTable', 'querycache_info',                     'patch-querycacheinfo.sql' ),
-			array( 'addTable', 'filearchive',                         'patch-filearchive.sql' ),
-			array( 'addField', 'ipblocks',        'ipb_anon_only',    'patch-ipb_anon_only.sql' ),
-			array( 'addIndex', 'recentchanges',   'rc_ns_usertext',   'patch-recentchanges-utindex.sql' ),
-			array( 'addIndex', 'recentchanges',   'rc_user_text',     'patch-rc_user_text-index.sql' ),
+			array( 'addTable', 'externallinks', 'patch-externallinks.sql' ),
+			array( 'addTable', 'job', 'patch-job.sql' ),
+			array( 'addField', 'site_stats', 'ss_images', 'patch-ss_images.sql' ),
+			array( 'addTable', 'langlinks', 'patch-langlinks.sql' ),
+			array( 'addTable', 'querycache_info', 'patch-querycacheinfo.sql' ),
+			array( 'addTable', 'filearchive', 'patch-filearchive.sql' ),
+			array( 'addField', 'ipblocks', 'ipb_anon_only', 'patch-ipb_anon_only.sql' ),
+			array( 'addIndex', 'recentchanges', 'rc_ns_usertext', 'patch-recentchanges-utindex.sql' ),
+			array( 'addIndex', 'recentchanges', 'rc_user_text', 'patch-rc_user_text-index.sql' ),
 
 			// 1.9
-			array( 'addField', 'user',          'user_newpass_time', 'patch-user_newpass_time.sql' ),
-			array( 'addTable', 'redirect',                           'patch-redirect.sql' ),
-			array( 'addTable', 'querycachetwo',                      'patch-querycachetwo.sql' ),
-			array( 'addField', 'ipblocks',      'ipb_enable_autoblock', 'patch-ipb_optional_autoblock.sql' ),
+			array( 'addField', 'user', 'user_newpass_time', 'patch-user_newpass_time.sql' ),
+			array( 'addTable', 'redirect', 'patch-redirect.sql' ),
+			array( 'addTable', 'querycachetwo', 'patch-querycachetwo.sql' ),
+			array( 'addField', 'ipblocks', 'ipb_enable_autoblock', 'patch-ipb_optional_autoblock.sql' ),
 			array( 'doBacklinkingIndicesUpdate' ),
-			array( 'addField', 'recentchanges', 'rc_old_len',        'patch-rc_len.sql' ),
-			array( 'addField', 'user',          'user_editcount',    'patch-user_editcount.sql' ),
+			array( 'addField', 'recentchanges', 'rc_old_len', 'patch-rc_len.sql' ),
+			array( 'addField', 'user', 'user_editcount', 'patch-user_editcount.sql' ),
 
 			// 1.10
 			array( 'doRestrictionsUpdate' ),
-			array( 'addField', 'logging',       'log_id',           'patch-log_id.sql' ),
-			array( 'addField', 'revision',      'rev_parent_id',    'patch-rev_parent_id.sql' ),
-			array( 'addField', 'page_restrictions', 'pr_id',        'patch-page_restrictions_sortkey.sql' ),
-			array( 'addField', 'revision',      'rev_len',          'patch-rev_len.sql' ),
-			array( 'addField', 'recentchanges', 'rc_deleted',       'patch-rc_deleted.sql' ),
-			array( 'addField', 'logging',       'log_deleted',      'patch-log_deleted.sql' ),
-			array( 'addField', 'archive',       'ar_deleted',       'patch-ar_deleted.sql' ),
-			array( 'addField', 'ipblocks',      'ipb_deleted',      'patch-ipb_deleted.sql' ),
-			array( 'addField', 'filearchive',   'fa_deleted',       'patch-fa_deleted.sql' ),
-			array( 'addField', 'archive',       'ar_len',           'patch-ar_len.sql' ),
+			array( 'addField', 'logging', 'log_id', 'patch-log_id.sql' ),
+			array( 'addField', 'revision', 'rev_parent_id', 'patch-rev_parent_id.sql' ),
+			array( 'addField', 'page_restrictions', 'pr_id', 'patch-page_restrictions_sortkey.sql' ),
+			array( 'addField', 'revision', 'rev_len', 'patch-rev_len.sql' ),
+			array( 'addField', 'recentchanges', 'rc_deleted', 'patch-rc_deleted.sql' ),
+			array( 'addField', 'logging', 'log_deleted', 'patch-log_deleted.sql' ),
+			array( 'addField', 'archive', 'ar_deleted', 'patch-ar_deleted.sql' ),
+			array( 'addField', 'ipblocks', 'ipb_deleted', 'patch-ipb_deleted.sql' ),
+			array( 'addField', 'filearchive', 'fa_deleted', 'patch-fa_deleted.sql' ),
+			array( 'addField', 'archive', 'ar_len', 'patch-ar_len.sql' ),
 
 			// 1.11
-			array( 'addField', 'ipblocks',      'ipb_block_email',  'patch-ipb_emailban.sql' ),
+			array( 'addField', 'ipblocks', 'ipb_block_email', 'patch-ipb_emailban.sql' ),
 			array( 'doCategorylinksIndicesUpdate' ),
-			array( 'addField', 'oldimage',      'oi_metadata',      'patch-oi_metadata.sql' ),
-			array( 'addIndex', 'archive',       'usertext_timestamp', 'patch-archive-user-index.sql' ),
-			array( 'addIndex', 'image',         'img_usertext_timestamp', 'patch-image-user-index.sql' ),
-			array( 'addIndex', 'oldimage',      'oi_usertext_timestamp', 'patch-oldimage-user-index.sql' ),
-			array( 'addField', 'archive',       'ar_page_id',       'patch-archive-page_id.sql' ),
-			array( 'addField', 'image',         'img_sha1',         'patch-img_sha1.sql' ),
+			array( 'addField', 'oldimage', 'oi_metadata', 'patch-oi_metadata.sql' ),
+			array( 'addIndex', 'archive', 'usertext_timestamp', 'patch-archive-user-index.sql' ),
+			array( 'addIndex', 'image', 'img_usertext_timestamp', 'patch-image-user-index.sql' ),
+			array( 'addIndex', 'oldimage', 'oi_usertext_timestamp', 'patch-oldimage-user-index.sql' ),
+			array( 'addField', 'archive', 'ar_page_id', 'patch-archive-page_id.sql' ),
+			array( 'addField', 'image', 'img_sha1', 'patch-img_sha1.sql' ),
 
 			// 1.12
-			array( 'addTable', 'protected_titles',                  'patch-protected_titles.sql' ),
+			array( 'addTable', 'protected_titles', 'patch-protected_titles.sql' ),
 
 			// 1.13
-			array( 'addField', 'ipblocks',      'ipb_by_text',      'patch-ipb_by_text.sql' ),
-			array( 'addTable', 'page_props',                        'patch-page_props.sql' ),
-			array( 'addTable', 'updatelog',                         'patch-updatelog.sql' ),
-			array( 'addTable', 'category',                          'patch-category.sql' ),
+			array( 'addField', 'ipblocks', 'ipb_by_text', 'patch-ipb_by_text.sql' ),
+			array( 'addTable', 'page_props', 'patch-page_props.sql' ),
+			array( 'addTable', 'updatelog', 'patch-updatelog.sql' ),
+			array( 'addTable', 'category', 'patch-category.sql' ),
 			array( 'doCategoryPopulation' ),
-			array( 'addField', 'archive',       'ar_parent_id',     'patch-ar_parent_id.sql' ),
-			array( 'addField', 'user_newtalk',  'user_last_timestamp', 'patch-user_last_timestamp.sql' ),
+			array( 'addField', 'archive', 'ar_parent_id', 'patch-ar_parent_id.sql' ),
+			array( 'addField', 'user_newtalk', 'user_last_timestamp', 'patch-user_last_timestamp.sql' ),
 			array( 'doPopulateParentId' ),
-			array( 'checkBin', 'protected_titles', 'pt_title',      'patch-pt_title-encoding.sql', ),
+			array( 'checkBin', 'protected_titles', 'pt_title', 'patch-pt_title-encoding.sql', ),
 			array( 'doMaybeProfilingMemoryUpdate' ),
 			array( 'doFilearchiveIndicesUpdate' ),
 
 			// 1.14
-			array( 'addField', 'site_stats',    'ss_active_users',  'patch-ss_active_users.sql' ),
+			array( 'addField', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ),
 			array( 'doActiveUsersInit' ),
-			array( 'addField', 'ipblocks',      'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
+			array( 'addField', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
 
 			// 1.15
 			array( 'doUniquePlTlIl' ),
-			array( 'addTable', 'change_tag',                        'patch-change_tag.sql' ),
-			/* array( 'addTable', 'tag_summary',                       'patch-change_tag.sql' ), */
-			/* array( 'addTable', 'valid_tag',                         'patch-change_tag.sql' ), */
+			array( 'addTable', 'change_tag', 'patch-change_tag.sql' ),
+			array( 'addTable', 'tag_summary', 'patch-tag_summary.sql' ),
+			array( 'addTable', 'valid_tag', 'patch-valid_tag.sql' ),
 
 			// 1.16
-			array( 'addTable', 'user_properties',                   'patch-user_properties.sql' ),
-			array( 'addTable', 'log_search',                        'patch-log_search.sql' ),
-			array( 'addField', 'logging',       'log_user_text',    'patch-log_user_text.sql' ),
-			array( 'doLogUsertextPopulation' ), # listed separately from the previous update because 1.16 was released without this update
+			array( 'addTable', 'user_properties', 'patch-user_properties.sql' ),
+			array( 'addTable', 'log_search', 'patch-log_search.sql' ),
+			array( 'addField', 'logging', 'log_user_text', 'patch-log_user_text.sql' ),
+			# listed separately from the previous update because 1.16 was released without this update
+			array( 'doLogUsertextPopulation' ),
 			array( 'doLogSearchPopulation' ),
-			array( 'addTable', 'l10n_cache',                        'patch-l10n_cache.sql' ),
-			array( 'addTable', 'external_user',                     'patch-external_user.sql' ),
-			array( 'addIndex', 'log_search',    'ls_field_val',     'patch-log_search-rename-index.sql' ),
-			array( 'addIndex', 'change_tag',    'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
-			array( 'addField', 'redirect',      'rd_interwiki',     'patch-rd_interwiki.sql' ),
+			array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ),
+			array( 'addIndex', 'log_search', 'ls_field_val', 'patch-log_search-rename-index.sql' ),
+			array( 'addIndex', 'change_tag', 'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
+			array( 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ),
 			array( 'doUpdateTranscacheField' ),
-			array( 'renameEuWikiId' ),
 			array( 'doUpdateMimeMinorField' ),
 
 			// 1.17
-			array( 'addTable', 'iwlinks',                           'patch-iwlinks.sql' ),
-			array( 'addIndex', 'iwlinks', 'iwl_prefix_title_from',  'patch-rename-iwl_prefix.sql' ),
-			array( 'addField', 'updatelog',     'ul_value',         'patch-ul_value.sql' ),
-			array( 'addField', 'interwiki',     'iw_api',           'patch-iw_api_and_wikiid.sql' ),
-			array( 'dropIndex', 'iwlinks',      'iwl_prefix',       'patch-kill-iwl_prefix.sql' ),
-			array( 'dropIndex', 'iwlinks',      'iwl_prefix_from_title', 'patch-kill-iwl_pft.sql' ),
-			array( 'addField', 'categorylinks', 'cl_collation',     'patch-categorylinks-better-collation.sql' ),
+			array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ),
+			array( 'addIndex', 'iwlinks', 'iwl_prefix_title_from', 'patch-rename-iwl_prefix.sql' ),
+			array( 'addField', 'updatelog', 'ul_value', 'patch-ul_value.sql' ),
+			array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api_and_wikiid.sql' ),
+			array( 'dropIndex', 'iwlinks', 'iwl_prefix', 'patch-kill-iwl_prefix.sql' ),
+			array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ),
 			array( 'doClFieldsUpdate' ),
 			array( 'doCollationUpdate' ),
-			array( 'addTable', 'msg_resource',                      'patch-msg_resource.sql' ),
-			array( 'addTable', 'module_deps',                       'patch-module_deps.sql' ),
-			array( 'dropIndex', 'archive',      'ar_page_revid',    'patch-archive_kill_ar_page_revid.sql' ),
-			array( 'addIndex', 'archive',       'ar_revid',         'patch-archive_ar_revid.sql' ),
+			array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
+			array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
+			array( 'dropIndex', 'archive', 'ar_page_revid', 'patch-archive_kill_ar_page_revid.sql' ),
+			array( 'addIndex', 'archive', 'ar_revid', 'patch-archive_ar_revid.sql' ),
 			array( 'doLangLinksLengthUpdate' ),
 
 			// 1.18
 			array( 'doUserNewTalkTimestampNotNull' ),
-			array( 'addIndex', 'user',          'user_email',       'patch-user_email_index.sql' ),
+			array( 'addIndex', 'user', 'user_email', 'patch-user_email_index.sql' ),
 			array( 'modifyField', 'user_properties', 'up_property', 'patch-up_property.sql' ),
-			array( 'addTable', 'uploadstash',                       'patch-uploadstash.sql' ),
-			array( 'addTable', 'user_former_groups',                'patch-user_former_groups.sql'),
+			array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
+			array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ),
 
 			// 1.19
-			array( 'addIndex', 'logging',       'type_action',      'patch-logging-type-action-index.sql'),
-			array( 'addField', 'revision',      'rev_sha1',         'patch-rev_sha1.sql' ),
+			array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.sql' ),
+			array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ),
 			array( 'doMigrateUserOptions' ),
-			array( 'dropField', 'user',         'user_options', 'patch-drop-user_options.sql' ),
-			array( 'addField', 'archive',       'ar_sha1',          'patch-ar_sha1.sql' ),
-			array( 'addIndex', 'page', 'page_redirect_namespace_len', 'patch-page_redirect_namespace_len.sql' ),
-			array( 'addField',	'uploadstash',	'us_chunk_inx',		'patch-uploadstash_chunk.sql' ),
-			array( 'addfield', 'job',           'job_timestamp',    'patch-jobs-add-timestamp.sql' ),
+			array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ),
+			array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ),
+			array( 'addIndex', 'page', 'page_redirect_namespace_len',
+				'patch-page_redirect_namespace_len.sql' ),
+			array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ),
+			array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ),
 
 			// 1.20
 			array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
-			array( 'addField', 'ipblocks',      'ipb_parent_block_id',           'patch-ipb-parent-block-id.sql' ),
-			array( 'addIndex', 'ipblocks',      'ipb_parent_block_id',           'patch-ipb-parent-block-id-index.sql' ),
-			array( 'dropField', 'category',     'cat_hidden',       'patch-cat_hidden.sql' ),
+			array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
+			array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
+			array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ),
 
 			// 1.21
-			array( 'addField',	'revision',	'rev_content_format',		'patch-revision-rev_content_format.sql' ),
-			array( 'addField',	'revision',	'rev_content_model',		'patch-revision-rev_content_model.sql' ),
-			array( 'addField',	'archive',	'ar_content_format',		'patch-archive-ar_content_format.sql' ),
-			array( 'addField',	'archive',	'ar_content_model',		    'patch-archive-ar_content_model.sql' ),
-			array( 'addField',	'page',     'page_content_model',		'patch-page-page_content_model.sql' ),
-			array( 'enableContentHandlerUseDB' ),
-
-			array( 'dropField', 'site_stats',   'ss_admins',        'patch-drop-ss_admins.sql' ),
-			array( 'dropField', 'recentchanges', 'rc_moved_to_title',            'patch-rc_moved.sql' ),
-			array( 'addTable', 'sites',                            'patch-sites.sql' ),
-			array( 'addField', 'filearchive',   'fa_sha1',          'patch-fa_sha1.sql' ),
-			array( 'addField', 'job',           'job_token',         'patch-job_token.sql' ),
-			array( 'addField', 'job',           'job_attempts',       'patch-job_attempts.sql' ),
+			array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ),
+			array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ),
+			array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ),
+			array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ),
+			array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ),
+			array( 'dropField', 'site_stats', 'ss_admins', 'patch-drop-ss_admins.sql' ),
+			array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
+			array( 'addTable', 'sites', 'patch-sites.sql' ),
+			array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
+			array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
+			array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
 			array( 'doEnableProfiling' ),
-			array( 'addField', 'uploadstash',      'us_props',      'patch-uploadstash-us_props.sql' ),
+			array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
 			array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
-			array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
-			array( 'addIndex', 'page_props', 'pp_propname_page',  'patch-page_props-propname-page-index.sql' ),
+			array( 'modifyField', 'user_former_groups', 'ufg_group',
+				'patch-ufg_group-length-increase-255.sql' ),
+			array( 'addIndex', 'page_props', 'pp_propname_page',
+				'patch-page_props-propname-page-index.sql' ),
 			array( 'addIndex', 'image', 'img_media_mime', 'patch-img_media_mime-index.sql' ),
+
+			// 1.22
+			array( 'doIwlinksIndexNonUnique' ),
+			array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title',
+				'patch-iwlinks-from-title-index.sql' ),
+			array( 'addField', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ),
+			array( 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.sql' ),
 		);
 	}
 
@@ -250,11 +255,8 @@ class MysqlUpdater extends DatabaseUpdater {
 			return true;
 		}
 
-		$tableName = $this->db->tableName( $table );
-		$res = $this->db->query( "SELECT $field FROM $tableName LIMIT 0", __METHOD__ );
-		$flags = explode( ' ', mysql_field_flags( $res->result, 0 ) );
-
-		if ( in_array( 'binary', $flags ) ) {
+		$fieldInfo = $this->db->fieldInfo( $table, $field );
+		if ( $fieldInfo->isBinary() ) {
 			$this->output( "...$table table has correct $field encoding.\n" );
 		} else {
 			$this->applyPatch( $patchFile, false, "Fixing $field encoding on $table table" );
@@ -279,11 +281,13 @@ class MysqlUpdater extends DatabaseUpdater {
 			foreach ( $info as $row ) {
 				if ( $row->Column_name == $field ) {
 					$this->output( "...index $index on table $table includes field $field.\n" );
+
 					return true;
 				}
 			}
 		}
 		$this->output( "...index $index on table $table has no field $field; added.\n" );
+
 		return false;
 	}
 
@@ -299,11 +303,16 @@ class MysqlUpdater extends DatabaseUpdater {
 
 		if ( $this->db->tableExists( "interwiki", __METHOD__ ) ) {
 			$this->output( "...already have interwiki table\n" );
+
 			return;
 		}
 
 		$this->applyPatch( 'patch-interwiki.sql', false, 'Creating interwiki table' );
-		$this->applyPatch( "$IP/maintenance/interwiki.sql", true, 'Adding default interwiki definitions' );
+		$this->applyPatch(
+			"$IP/maintenance/interwiki.sql",
+			true,
+			'Adding default interwiki definitions'
+		);
 	}
 
 	/**
@@ -316,6 +325,7 @@ class MysqlUpdater extends DatabaseUpdater {
 		}
 		if ( $meta->isMultipleKey() ) {
 			$this->output( "...indexes seem up to 20031107 standards.\n" );
+
 			return;
 		}
 
@@ -331,10 +341,17 @@ class MysqlUpdater extends DatabaseUpdater {
 		$info = $this->db->fieldInfo( 'imagelinks', 'il_from' );
 		if ( !$info || $info->type() !== 'string' ) {
 			$this->output( "...il_from OK\n" );
+
 			return;
 		}
 
-		if( $this->applyPatch( 'patch-fix-il_from.sql', false, "Fixing ancient broken imagelinks table." ) ) {
+		$applied = $this->applyPatch(
+			'patch-fix-il_from.sql',
+			false,
+			'Fixing ancient broken imagelinks table.'
+		);
+
+		if ( $applied ) {
 			$this->output( "NOTE: you will have to run maintenance/refreshLinks.php after this." );
 		}
 	}
@@ -344,9 +361,15 @@ class MysqlUpdater extends DatabaseUpdater {
 	 */
 	function doWatchlistUpdate() {
 		$talk = $this->db->selectField( 'watchlist', 'count(*)', 'wl_namespace & 1', __METHOD__ );
-		$nontalk = $this->db->selectField( 'watchlist', 'count(*)', 'NOT (wl_namespace & 1)', __METHOD__ );
+		$nontalk = $this->db->selectField(
+			'watchlist',
+			'count(*)',
+			'NOT (wl_namespace & 1)',
+			__METHOD__
+		);
 		if ( $talk == $nontalk ) {
 			$this->output( "...watchlist talk page rows already present.\n" );
+
 			return;
 		}
 
@@ -364,6 +387,7 @@ class MysqlUpdater extends DatabaseUpdater {
 	function doSchemaRestructuring() {
 		if ( $this->db->tableExists( 'page', __METHOD__ ) ) {
 			$this->output( "...page table already exists.\n" );
+
 			return;
 		}
 
@@ -371,10 +395,21 @@ class MysqlUpdater extends DatabaseUpdater {
 		$this->output( wfTimestamp( TS_DB ) );
 		$this->output( "......checking for duplicate entries.\n" );
 
-		list ( $cur, $old, $page, $revision, $text ) = $this->db->tableNamesN( 'cur', 'old', 'page', 'revision', 'text' );
+		list( $cur, $old, $page, $revision, $text ) = $this->db->tableNamesN(
+			'cur',
+			'old',
+			'page',
+			'revision',
+			'text'
+		);
 
-		$rows = $this->db->query( "SELECT cur_title, cur_namespace, COUNT(cur_namespace) AS c
-				FROM $cur GROUP BY cur_title, cur_namespace HAVING c>1", __METHOD__ );
+		$rows = $this->db->query( "
+			SELECT cur_title, cur_namespace, COUNT(cur_namespace) AS c
+			FROM $cur
+			GROUP BY cur_title, cur_namespace
+			HAVING c>1",
+			__METHOD__
+		);
 
 		if ( $rows->numRows() > 0 ) {
 			$this->output( wfTimestamp( TS_DB ) );
@@ -382,11 +417,16 @@ class MysqlUpdater extends DatabaseUpdater {
 			$this->output( sprintf( "<b>      %-60s %3s %5s</b>\n", 'Title', 'NS', 'Count' ) );
 			$duplicate = array();
 			foreach ( $rows as $row ) {
-				if ( ! isset( $duplicate[$row->cur_namespace] ) ) {
+				if ( !isset( $duplicate[$row->cur_namespace] ) ) {
 					$duplicate[$row->cur_namespace] = array();
 				}
+
 				$duplicate[$row->cur_namespace][] = $row->cur_title;
-				$this->output( sprintf( "      %-60s %3s %5s\n", $row->cur_title, $row->cur_namespace, $row->c ) );
+				$this->output( sprintf(
+					"      %-60s %3s %5s\n",
+					$row->cur_title, $row->cur_namespace,
+					$row->c
+				) );
 			}
 			$sql = "SELECT cur_title, cur_namespace, cur_id, cur_timestamp FROM $cur WHERE ";
 			$firstCond = true;
@@ -471,7 +511,10 @@ class MysqlUpdater extends DatabaseUpdater {
 
 		$this->output( wfTimestamp( TS_DB ) );
 		$this->output( "......Locking tables.\n" );
-		$this->db->query( "LOCK TABLES $page WRITE, $revision WRITE, $old WRITE, $cur WRITE", __METHOD__ );
+		$this->db->query(
+			"LOCK TABLES $page WRITE, $revision WRITE, $old WRITE, $cur WRITE",
+			__METHOD__
+		);
 
 		$maxold = intval( $this->db->selectField( 'old', 'max(old_id)', '', __METHOD__ ) );
 		$this->output( wfTimestamp( TS_DB ) );
@@ -492,27 +535,38 @@ class MysqlUpdater extends DatabaseUpdater {
 			$cur_text = 'cur_text';
 			$cur_flags = "''";
 		}
-		$this->db->query( "INSERT INTO $old (old_namespace, old_title, old_text, old_comment, old_user, old_user_text,
-					old_timestamp, old_minor_edit, old_flags)
-			SELECT cur_namespace, cur_title, $cur_text, cur_comment, cur_user, cur_user_text, cur_timestamp, cur_minor_edit, $cur_flags
-			FROM $cur", __METHOD__ );
+		$this->db->query(
+			"INSERT INTO $old (old_namespace, old_title, old_text, old_comment, old_user,
+				old_user_text, old_timestamp, old_minor_edit, old_flags)
+			SELECT cur_namespace, cur_title, $cur_text, cur_comment, cur_user, cur_user_text,
+				cur_timestamp, cur_minor_edit, $cur_flags
+			FROM $cur",
+			__METHOD__
+		);
 
 		$this->output( wfTimestamp( TS_DB ) );
 		$this->output( "......Setting up revision table.\n" );
-		$this->db->query( "INSERT INTO $revision (rev_id, rev_page, rev_comment, rev_user, rev_user_text, rev_timestamp,
-				rev_minor_edit)
+		$this->db->query(
+			"INSERT INTO $revision (rev_id, rev_page, rev_comment, rev_user,
+				rev_user_text, rev_timestamp, rev_minor_edit)
 			SELECT old_id, cur_id, old_comment, old_user, old_user_text,
 				old_timestamp, old_minor_edit
-			FROM $old,$cur WHERE old_namespace=cur_namespace AND old_title=cur_title", __METHOD__ );
+			FROM $old,$cur WHERE old_namespace=cur_namespace AND old_title=cur_title",
+			__METHOD__
+		);
 
 		$this->output( wfTimestamp( TS_DB ) );
 		$this->output( "......Setting up page table.\n" );
-		$this->db->query( "INSERT INTO $page (page_id, page_namespace, page_title, page_restrictions, page_counter,
-			page_is_redirect, page_is_new, page_random, page_touched, page_latest, page_len)
-			SELECT cur_id, cur_namespace, cur_title, cur_restrictions, cur_counter, cur_is_redirect, cur_is_new,
-				cur_random, cur_touched, rev_id, LENGTH(cur_text)
+		$this->db->query(
+			"INSERT INTO $page (page_id, page_namespace, page_title,
+				page_restrictions, page_counter, page_is_redirect, page_is_new, page_random,
+				page_touched, page_latest, page_len)
+			SELECT cur_id, cur_namespace, cur_title, cur_restrictions, cur_counter,
+				cur_is_redirect, cur_is_new, cur_random, cur_touched, rev_id, LENGTH(cur_text)
 			FROM $cur,$revision
-			WHERE cur_id=rev_page AND rev_timestamp=cur_timestamp AND rev_id > {$maxold}", __METHOD__ );
+			WHERE cur_id=rev_page AND rev_timestamp=cur_timestamp AND rev_id > {$maxold}",
+			__METHOD__
+		);
 
 		$this->output( wfTimestamp( TS_DB ) );
 		$this->output( "......Unlocking tables.\n" );
@@ -528,12 +582,12 @@ class MysqlUpdater extends DatabaseUpdater {
 
 	protected function doNamespaceSize() {
 		$tables = array(
-			'page'          => 'page',
-			'archive'       => 'ar',
+			'page' => 'page',
+			'archive' => 'ar',
 			'recentchanges' => 'rc',
-			'watchlist'     => 'wl',
-			'querycache'    => 'qc',
-			'logging'       => 'log',
+			'watchlist' => 'wl',
+			'querycache' => 'qc',
+			'logging' => 'log',
 		);
 		foreach ( $tables as $table => $prefix ) {
 			$field = $prefix . '_namespace';
@@ -555,10 +609,15 @@ class MysqlUpdater extends DatabaseUpdater {
 	protected function doPagelinksUpdate() {
 		if ( $this->db->tableExists( 'pagelinks', __METHOD__ ) ) {
 			$this->output( "...already have pagelinks table.\n" );
+
 			return;
 		}
 
-		$this->applyPatch( 'patch-pagelinks.sql', false, "Converting links and brokenlinks tables to pagelinks" );
+		$this->applyPatch(
+			'patch-pagelinks.sql',
+			false,
+			'Converting links and brokenlinks tables to pagelinks'
+		);
 
 		global $wgContLang;
 		foreach ( MWNamespace::getCanonicalNamespaces() as $ns => $name ) {
@@ -592,6 +651,7 @@ class MysqlUpdater extends DatabaseUpdater {
 		$duper = new UserDupes( $this->db, array( $this, 'output' ) );
 		if ( $duper->hasUniqueIndex() ) {
 			$this->output( "...already have unique user_name index.\n" );
+
 			return;
 		}
 
@@ -611,19 +671,22 @@ class MysqlUpdater extends DatabaseUpdater {
 			if ( $info->type() == 'int' ) {
 				$oldug = $this->db->tableName( 'user_groups' );
 				$newug = $this->db->tableName( 'user_groups_bogus' );
-				$this->output( "user_groups table exists but is in bogus intermediate format. Renaming to $newug... " );
+				$this->output( "user_groups table exists but is in bogus intermediate " .
+					"format. Renaming to $newug... " );
 				$this->db->query( "ALTER TABLE $oldug RENAME TO $newug", __METHOD__ );
 				$this->output( "done.\n" );
 
 				$this->applyPatch( 'patch-user_groups.sql', false, "Re-adding fresh user_groups table" );
 
 				$this->output( "***\n" );
-				$this->output( "*** WARNING: You will need to manually fix up user permissions in the user_groups\n" );
+				$this->output( "*** WARNING: You will need to manually fix up user " .
+					"permissions in the user_groups\n" );
 				$this->output( "*** table. Old 1.5 alpha versions did some pretty funky stuff...\n" );
 				$this->output( "***\n" );
 			} else {
 				$this->output( "...user_groups table exists and is in current format.\n" );
 			}
+
 			return;
 		}
 
@@ -631,11 +694,16 @@ class MysqlUpdater extends DatabaseUpdater {
 
 		if ( !$this->db->tableExists( 'user_rights', __METHOD__ ) ) {
 			if ( $this->db->fieldExists( 'user', 'user_rights', __METHOD__ ) ) {
-				$this->db->applyPatch( 'patch-user_rights.sql', false, "Upgrading from a 1.3 or older database? Breaking out user_rights for conversion" );
+				$this->applyPatch(
+					'patch-user_rights.sql',
+					false,
+					'Upgrading from a 1.3 or older database? Breaking out user_rights for conversion'
+				);
 			} else {
 				$this->output( "*** WARNING: couldn't locate user_rights table or field for upgrade.\n" );
 				$this->output( "*** You may need to manually configure some sysops by manipulating\n" );
 				$this->output( "*** the user_groups table.\n" );
+
 				return;
 			}
 		}
@@ -654,7 +722,7 @@ class MysqlUpdater extends DatabaseUpdater {
 			foreach ( $groups as $group ) {
 				$this->db->insert( 'user_groups',
 					array(
-						'ug_user'  => $row->ur_user,
+						'ug_user' => $row->ur_user,
 						'ug_group' => $group ),
 					__METHOD__ );
 			}
@@ -673,10 +741,15 @@ class MysqlUpdater extends DatabaseUpdater {
 		}
 		if ( $info->isNullable() ) {
 			$this->output( "...wl_notificationtimestamp is already nullable.\n" );
+
 			return;
 		}
 
-		$this->applyPatch( 'patch-watchlist-null.sql', false, "Making wl_notificationtimestamp nullable" );
+		$this->applyPatch(
+			'patch-watchlist-null.sql',
+			false,
+			'Making wl_notificationtimestamp nullable'
+		);
 	}
 
 	/**
@@ -689,7 +762,7 @@ class MysqlUpdater extends DatabaseUpdater {
 		$this->db->query( "UPDATE $page SET page_random = RAND() WHERE page_random = 0", __METHOD__ );
 		$rows = $this->db->affectedRows();
 
-		if( $rows ) {
+		if ( $rows ) {
 			$this->output( "Set page_random to a random value on $rows rows where it was set to 0\n" );
 		} else {
 			$this->output( "...no page_random rows needed to be set\n" );
@@ -699,6 +772,7 @@ class MysqlUpdater extends DatabaseUpdater {
 	protected function doTemplatelinksUpdate() {
 		if ( $this->db->tableExists( 'templatelinks', __METHOD__ ) ) {
 			$this->output( "...templatelinks table already exists\n" );
+
 			return;
 		}
 
@@ -722,7 +796,6 @@ class MysqlUpdater extends DatabaseUpdater {
 						'tl_title' => $row->pl_title,
 					), __METHOD__
 				);
-
 			}
 		} else {
 			// Fast update
@@ -736,14 +809,15 @@ class MysqlUpdater extends DatabaseUpdater {
 				), __METHOD__
 			);
 		}
-		$this->output( "Done. Please run maintenance/refreshLinks.php for a more thorough templatelinks update.\n" );
+		$this->output( "Done. Please run maintenance/refreshLinks.php for a more " .
+			"thorough templatelinks update.\n" );
 	}
 
 	protected function doBacklinkingIndicesUpdate() {
 		if ( !$this->indexHasField( 'pagelinks', 'pl_namespace', 'pl_from' ) ||
 			!$this->indexHasField( 'templatelinks', 'tl_namespace', 'tl_from' ) ||
-			!$this->indexHasField( 'imagelinks', 'il_to', 'il_from' ) )
-		{
+			!$this->indexHasField( 'imagelinks', 'il_to', 'il_from' )
+		) {
 			$this->applyPatch( 'patch-backlinkindexes.sql', false, "Updating backlinking indices" );
 		}
 	}
@@ -756,11 +830,20 @@ class MysqlUpdater extends DatabaseUpdater {
 	protected function doRestrictionsUpdate() {
 		if ( $this->db->tableExists( 'page_restrictions', __METHOD__ ) ) {
 			$this->output( "...page_restrictions table already exists.\n" );
+
 			return;
 		}
 
-		$this->applyPatch( 'patch-page_restrictions.sql', false, "Creating page_restrictions table (1/2)" );
-		$this->applyPatch( 'patch-page_restrictions_sortkey.sql', false, "Creating page_restrictions table (2/2)" );
+		$this->applyPatch(
+			'patch-page_restrictions.sql',
+			false,
+			'Creating page_restrictions table (1/2)'
+		);
+		$this->applyPatch(
+			'patch-page_restrictions_sortkey.sql',
+			false,
+			'Creating page_restrictions table (2/2)'
+		);
 		$this->output( "done.\n" );
 
 		$this->output( "Migrating old restrictions to new table...\n" );
@@ -777,6 +860,7 @@ class MysqlUpdater extends DatabaseUpdater {
 	protected function doCategoryPopulation() {
 		if ( $this->updateRowExists( 'populate category' ) ) {
 			$this->output( "...category table already populated.\n" );
+
 			return;
 		}
 
@@ -810,7 +894,7 @@ class MysqlUpdater extends DatabaseUpdater {
 			return true;
 		}
 
-		if ( $wgProfileToDatabase === true && ! $this->db->tableExists( 'profiling', __METHOD__ ) ) {
+		if ( $wgProfileToDatabase === true && !$this->db->tableExists( 'profiling', __METHOD__ ) ) {
 			$this->applyPatch( 'patch-profiling.sql', false, 'Add profiling table' );
 		}
 	}
@@ -824,9 +908,15 @@ class MysqlUpdater extends DatabaseUpdater {
 			return true;
 		} elseif ( $this->db->fieldExists( 'profiling', 'pf_memory', __METHOD__ ) ) {
 			$this->output( "...profiling table has pf_memory field.\n" );
+
 			return true;
 		}
-		return $this->applyPatch( 'patch-profiling-memory.sql', false, "Adding pf_memory field to table profiling" );
+
+		return $this->applyPatch(
+			'patch-profiling-memory.sql',
+			false,
+			'Adding pf_memory field to table profiling'
+		);
 	}
 
 	protected function doFilearchiveIndicesUpdate() {
@@ -834,6 +924,7 @@ class MysqlUpdater extends DatabaseUpdater {
 		if ( !$info ) {
 			$this->applyPatch( 'patch-filearchive-user-index.sql', false, "Updating filearchive indices" );
 		}
+
 		return true;
 	}
 
@@ -841,41 +932,49 @@ class MysqlUpdater extends DatabaseUpdater {
 		$info = $this->db->indexInfo( 'pagelinks', 'pl_namespace' );
 		if ( is_array( $info ) && !$info[0]->Non_unique ) {
 			$this->output( "...pl_namespace, tl_namespace, il_to indices are already UNIQUE.\n" );
+
 			return true;
 		}
 		if ( $this->skipSchema ) {
-			$this->output( "...skipping schema change (making pl_namespace, tl_namespace and il_to indices UNIQUE).\n" );
-			return false;
-		}
-
-		return $this->applyPatch( 'patch-pl-tl-il-unique.sql', false, "Making pl_namespace, tl_namespace and il_to indices UNIQUE" );
-	}
+			$this->output( "...skipping schema change (making pl_namespace, tl_namespace " .
+				"and il_to indices UNIQUE).\n" );
 
-	protected function renameEuWikiId() {
-		if ( $this->db->fieldExists( 'external_user', 'eu_local_id', __METHOD__ ) ) {
-			$this->output( "...eu_wiki_id already renamed to eu_local_id.\n" );
-			return;
+			return false;
 		}
 
-		$this->applyPatch( 'patch-eu_local_id.sql', false, "Renaming eu_wiki_id -> eu_local_id" );
+		return $this->applyPatch(
+			'patch-pl-tl-il-unique.sql',
+			false,
+			'Making pl_namespace, tl_namespace and il_to indices UNIQUE'
+		);
 	}
 
 	protected function doUpdateMimeMinorField() {
 		if ( $this->updateRowExists( 'mime_minor_length' ) ) {
 			$this->output( "...*_mime_minor fields are already long enough.\n" );
+
 			return;
 		}
 
-		$this->applyPatch( 'patch-mime_minor_length.sql', false, "Altering all *_mime_minor fields to 100 bytes in size" );
+		$this->applyPatch(
+			'patch-mime_minor_length.sql',
+			false,
+			'Altering all *_mime_minor fields to 100 bytes in size'
+		);
 	}
 
 	protected function doClFieldsUpdate() {
 		if ( $this->updateRowExists( 'cl_fields_update' ) ) {
 			$this->output( "...categorylinks up-to-date.\n" );
+
 			return;
 		}
 
-		$this->applyPatch( 'patch-categorylinks-better-collation2.sql', false, 'Updating categorylinks (again)' );
+		$this->applyPatch(
+			'patch-categorylinks-better-collation2.sql',
+			false,
+			'Updating categorylinks (again)'
+		);
 	}
 
 	protected function doLangLinksLengthUpdate() {
@@ -884,7 +983,11 @@ class MysqlUpdater extends DatabaseUpdater {
 		$row = $this->db->fetchObject( $res );
 
 		if ( $row && $row->Type == "varbinary(10)" ) {
-			$this->applyPatch( 'patch-langlinks-ll_lang-20.sql', false, 'Updating length of ll_lang in langlinks' );
+			$this->applyPatch(
+				'patch-langlinks-ll_lang-20.sql',
+				false,
+				'Updating length of ll_lang in langlinks'
+			);
 		} else {
 			$this->output( "...ll_lang is up-to-date.\n" );
 		}
@@ -901,9 +1004,34 @@ class MysqlUpdater extends DatabaseUpdater {
 		}
 		if ( $info->isNullable() ) {
 			$this->output( "...user_last_timestamp is already nullable.\n" );
+
 			return;
 		}
 
-		$this->applyPatch( 'patch-user-newtalk-timestamp-null.sql', false, "Making user_last_timestamp nullable" );
+		$this->applyPatch(
+			'patch-user-newtalk-timestamp-null.sql',
+			false,
+			'Making user_last_timestamp nullable'
+		);
+	}
+
+	protected function doIwlinksIndexNonUnique() {
+		$info = $this->db->indexInfo( 'iwlinks', 'iwl_prefix_title_from' );
+		if ( is_array( $info ) && $info[0]->Non_unique ) {
+			$this->output( "...iwl_prefix_title_from index is already non-UNIQUE.\n" );
+
+			return true;
+		}
+		if ( $this->skipSchema ) {
+			$this->output( "...skipping schema change (making iwl_prefix_title_from index non-UNIQUE).\n" );
+
+			return false;
+		}
+
+		return $this->applyPatch(
+			'patch-iwl_prefix_title_from-non-unique.sql',
+			false,
+			'Making iwl_prefix_title_from index non-UNIQUE'
+		);
 	}
 }
diff --git a/includes/installer/OracleInstaller.php b/includes/installer/OracleInstaller.php
index e8538890..77575100 100644
--- a/includes/installer/OracleInstaller.php
+++ b/includes/installer/OracleInstaller.php
@@ -59,35 +59,51 @@ class OracleInstaller extends DatabaseInstaller {
 		if ( $this->getVar( 'wgDBserver' ) == 'localhost' ) {
 			$this->parent->setVar( 'wgDBserver', '' );
 		}
-		return
-			$this->getTextBox( 'wgDBserver', 'config-db-host-oracle', array(), $this->parent->getHelpBox( 'config-db-host-oracle-help' ) ) .
+
+		return $this->getTextBox(
+			'wgDBserver',
+			'config-db-host-oracle',
+			array(),
+			$this->parent->getHelpBox( 'config-db-host-oracle-help' )
+		) .
 			Html::openElement( 'fieldset' ) .
 			Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
 			$this->getTextBox( 'wgDBprefix', 'config-db-prefix' ) .
 			$this->getTextBox( '_OracleDefTS', 'config-oracle-def-ts' ) .
-			$this->getTextBox( '_OracleTempTS', 'config-oracle-temp-ts', array(), $this->parent->getHelpBox( 'config-db-oracle-help' ) ) .
+			$this->getTextBox(
+				'_OracleTempTS',
+				'config-oracle-temp-ts',
+				array(),
+				$this->parent->getHelpBox( 'config-db-oracle-help' )
+			) .
 			Html::closeElement( 'fieldset' ) .
-			$this->parent->getWarningBox( wfMessage( 'config-db-account-oracle-warn' )->text() ).
-			$this->getInstallUserBox().
+			$this->parent->getWarningBox( wfMessage( 'config-db-account-oracle-warn' )->text() ) .
+			$this->getInstallUserBox() .
 			$this->getWebUserBox();
 	}
 
 	public function submitInstallUserBox() {
 		parent::submitInstallUserBox();
 		$this->parent->setVar( '_InstallDBname', $this->getVar( '_InstallUser' ) );
+
 		return Status::newGood();
 	}
 
 	public function submitConnectForm() {
 		// Get variables from the request
-		$newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBprefix', 'wgDBuser', 'wgDBpassword' ) );
+		$newValues = $this->setVarsFromRequest(
+			'wgDBserver',
+			'wgDBprefix',
+			'wgDBuser',
+			'wgDBpassword'
+		);
 		$this->parent->setVar( 'wgDBname', $this->getVar( 'wgDBuser' ) );
 
 		// Validate them
 		$status = Status::newGood();
 		if ( !strlen( $newValues['wgDBserver'] ) ) {
 			$status->fatal( 'config-missing-db-server-oracle' );
-		} elseif ( !preg_match( '/^[a-zA-Z0-9_\.]+$/', $newValues['wgDBserver'] ) ) {
+		} elseif ( !self::checkConnectStringFormat( $newValues['wgDBserver'] ) ) {
 			$status->fatal( 'config-invalid-db-server-oracle', $newValues['wgDBserver'] );
 		}
 		if ( !preg_match( '/^[a-zA-Z0-9_]*$/', $newValues['wgDBprefix'] ) ) {
@@ -163,6 +179,7 @@ class OracleInstaller extends DatabaseInstaller {
 			$this->connError = $e->db->lastErrno();
 			$status->fatal( 'config-connection-error', $e->getMessage() );
 		}
+
 		return $status;
 	}
 
@@ -182,6 +199,7 @@ class OracleInstaller extends DatabaseInstaller {
 			$this->connError = $e->db->lastErrno();
 			$status->fatal( 'config-connection-error', $e->getMessage() );
 		}
+
 		return $status;
 	}
 
@@ -190,6 +208,7 @@ class OracleInstaller extends DatabaseInstaller {
 		$this->parent->setVar( 'wgDBname', $this->getVar( 'wgDBuser' ) );
 		$retVal = parent::needsUpgrade();
 		$this->parent->setVar( 'wgDBname', $tempDBname );
+
 		return $retVal;
 	}
 
@@ -204,6 +223,7 @@ class OracleInstaller extends DatabaseInstaller {
 
 	public function setupDatabase() {
 		$status = Status::newGood();
+
 		return $status;
 	}
 
@@ -286,15 +306,38 @@ class OracleInstaller extends DatabaseInstaller {
 		foreach ( $varNames as $name ) {
 			$vars[$name] = $this->getVar( $name );
 		}
+
 		return $vars;
 	}
 
 	public function getLocalSettings() {
 		$prefix = $this->getVar( 'wgDBprefix' );
-		return
-"# Oracle specific settings
+
+		return "# Oracle specific settings
 \$wgDBprefix = \"{$prefix}\";
 ";
 	}
 
+	/**
+	 * Function checks the format of Oracle connect string
+	 * The actual validity of the string is checked by attempting to connect
+	 *
+	 * Regex should be able to validate all connect string formats
+	 * [//](host|tns_name)[:port][/service_name][:POOLED]
+	 * http://www.orafaq.com/wiki/EZCONNECT
+	 *
+	 * @since 1.22
+	 *
+	 * @param string $connect_string
+	 *
+	 * @return bool Whether the connection string is valid.
+	 */
+	public static function checkConnectStringFormat( $connect_string ) {
+		// @@codingStandardsIgnoreStart Long lines with regular expressions.
+		// @todo Very long regular expression. Make more readable?
+		$isValid = preg_match( '/^[[:alpha:]][\w\-]*(?:\.[[:alpha:]][\w\-]*){0,2}$/', $connect_string ); // TNS name
+		$isValid |= preg_match( '/^(?:\/\/)?[\w\-\.]+(?::[\d]+)?(?:\/(?:[\w\-\.]+(?::(pooled|dedicated|shared))?)?(?:\/[\w\-\.]+)?)?$/', $connect_string ); // EZConnect
+		// @@codingStandardsIgnoreEnd
+		return (bool)$isValid;
+	}
 }
diff --git a/includes/installer/OracleUpdater.php b/includes/installer/OracleUpdater.php
index 90b4c877..ec91e57b 100644
--- a/includes/installer/OracleUpdater.php
+++ b/includes/installer/OracleUpdater.php
@@ -38,8 +38,6 @@ class OracleUpdater extends DatabaseUpdater {
 
 	protected function getCoreUpdateList() {
 		return array(
-			array( 'disableContentHandlerUseDB' ),
-
 			// 1.17
 			array( 'doNamespaceDefaults' ),
 			array( 'doFKRenameDeferr' ),
@@ -50,13 +48,13 @@ class OracleUpdater extends DatabaseUpdater {
 			array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ),
 
 			//1.18
-			array( 'addIndex',	'user',          'i02',       'patch-user_email_index.sql' ),
+			array( 'addIndex', 'user', 'i02', 'patch-user_email_index.sql' ),
 			array( 'modifyField', 'user_properties', 'up_property', 'patch-up_property.sql' ),
 			array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
 			array( 'doRecentchangesFK2Cascade' ),
 
 			//1.19
-			array( 'addIndex', 'logging',       'i05',      'patch-logging_type_action_index.sql'),
+			array( 'addIndex', 'logging', 'i05', 'patch-logging_type_action_index.sql' ),
 			array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1_field.sql' ),
 			array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1_field.sql' ),
 			array( 'doRemoveNotNullEmptyDefaults2' ),
@@ -72,22 +70,25 @@ class OracleUpdater extends DatabaseUpdater {
 			array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ),
 
 			//1.21
-			array( 'addField',	'revision',	'rev_content_format',		'patch-revision-rev_content_format.sql' ),
-			array( 'addField',	'revision',	'rev_content_model',		'patch-revision-rev_content_model.sql' ),
-			array( 'addField',	'archive',	'ar_content_format',		'patch-archive-ar_content_format.sql' ),
-			array( 'addField',	'archive',	'ar_content_model',		    'patch-archive-ar_content_model.sql' ),
-			array( 'addField',	'page',     'page_content_model',		'patch-page-page_content_model.sql' ),
-			array( 'enableContentHandlerUseDB' ),
-
-			array( 'dropField', 'site_stats', 'ss_admins',  'patch-ss_admins.sql' ),
+			array( 'addField', 'revision', 'rev_content_format',
+				'patch-revision-rev_content_format.sql' ),
+			array( 'addField', 'revision', 'rev_content_model',
+				'patch-revision-rev_content_model.sql' ),
+			array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ),
+			array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ),
+			array( 'addField', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ),
+			array( 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.sql' ),
+			array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ),
+			array( 'dropField', 'site_stats', 'ss_admins', 'patch-ss_admins.sql' ),
 			array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
-			array( 'addTable', 'sites',                            'patch-sites.sql' ),
-			array( 'addField', 'filearchive',   'fa_sha1',          'patch-fa_sha1.sql' ),
-			array( 'addField', 'job',           'job_token',         'patch-job_token.sql' ),
-			array( 'addField', 'job',           'job_attempts',       'patch-job_attempts.sql' ),
-			array( 'addField', 'uploadstash',      'us_props',      'patch-uploadstash-us_props.sql' ),
+			array( 'addTable', 'sites', 'patch-sites.sql' ),
+			array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
+			array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
+			array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
+			array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
 			array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
-			array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
+			array( 'modifyField', 'user_former_groups', 'ufg_group',
+				'patch-ufg_group-length-increase-255.sql' ),
 
 			// KEEP THIS AT THE BOTTOM!!
 			array( 'doRebuildDuplicateFunction' ),
@@ -106,14 +107,22 @@ class OracleUpdater extends DatabaseUpdater {
 			return;
 		}
 
-		$this->applyPatch( 'patch_namespace_defaults.sql', false, "Altering namespace fields with default value" );
+		$this->applyPatch(
+			'patch_namespace_defaults.sql',
+			false,
+			'Altering namespace fields with default value'
+		);
 	}
 
 	/**
 	 * Uniform FK names + deferrable state
 	 */
 	protected function doFKRenameDeferr() {
-		$meta = $this->db->query( 'SELECT COUNT(*) cnt FROM user_constraints WHERE constraint_type = \'R\' AND deferrable = \'DEFERRABLE\'' );
+		$meta = $this->db->query( '
+			SELECT COUNT(*) cnt
+			FROM user_constraints
+			WHERE constraint_type = \'R\' AND deferrable = \'DEFERRABLE\''
+		);
 		$row = $meta->fetchRow();
 		if ( $row && $row['cnt'] > 0 ) {
 			return;
@@ -171,7 +180,11 @@ class OracleUpdater extends DatabaseUpdater {
 		if ( $meta->isNullable() ) {
 			return;
 		}
-		$this->applyPatch( 'patch_remove_not_null_empty_defs.sql', false, "Removing not null empty constraints" );
+		$this->applyPatch(
+			'patch_remove_not_null_empty_defs.sql',
+			false,
+			'Removing not null empty constraints'
+		);
 	}
 
 	protected function doRemoveNotNullEmptyDefaults2() {
@@ -179,7 +192,11 @@ class OracleUpdater extends DatabaseUpdater {
 		if ( $meta->isNullable() ) {
 			return;
 		}
-		$this->applyPatch( 'patch_remove_not_null_empty_defs2.sql', false, "Removing not null empty constraints" );
+		$this->applyPatch(
+			'patch_remove_not_null_empty_defs2.sql',
+			false,
+			'Removing not null empty constraints'
+		);
 	}
 
 	/**
@@ -187,7 +204,12 @@ class OracleUpdater extends DatabaseUpdater {
 	 * cascading taken in account in the deleting function
 	 */
 	protected function doRecentchangesFK2Cascade() {
-		$meta = $this->db->query( 'SELECT 1 FROM all_constraints WHERE owner = \''.strtoupper($this->db->getDBname()).'\' AND constraint_name = \''.$this->db->tablePrefix().'RECENTCHANGES_FK2\' AND delete_rule = \'CASCADE\'' );
+		$meta = $this->db->query( 'SELECT 1 FROM all_constraints WHERE owner = \'' .
+			strtoupper( $this->db->getDBname() ) .
+			'\' AND constraint_name = \'' .
+			$this->db->tablePrefix() .
+			'RECENTCHANGES_FK2\' AND delete_rule = \'CASCADE\''
+		);
 		$row = $meta->fetchRow();
 		if ( $row ) {
 			return;
@@ -211,6 +233,7 @@ class OracleUpdater extends DatabaseUpdater {
 		$row = $meta->fetchRow();
 		if ( $row['column_name'] == 'PR_ID' ) {
 			$this->output( "seems to be up to date.\n" );
+
 			return;
 		}
 
@@ -243,8 +266,7 @@ class OracleUpdater extends DatabaseUpdater {
 		# We can't guarantee that the user will be able to use TRUNCATE,
 		# but we know that DELETE is available to us
 		$this->output( "Purging caches..." );
-		$this->db->delete( '/*Q*/'.$this->db->tableName( 'objectcache' ), '*', __METHOD__ );
+		$this->db->delete( '/*Q*/' . $this->db->tableName( 'objectcache' ), '*', __METHOD__ );
 		$this->output( "done.\n" );
 	}
-
 }
diff --git a/includes/installer/PhpBugTests.php b/includes/installer/PhpBugTests.php
index 773debe0..54712644 100644
--- a/includes/installer/PhpBugTests.php
+++ b/includes/installer/PhpBugTests.php
@@ -30,6 +30,7 @@
 class PhpXmlBugTester {
 	private $parsedData = '';
 	public $ok = false;
+
 	public function __construct() {
 		$charData = '<b>c</b>';
 		$xml = '<a>' . htmlspecialchars( $charData ) . '</a>';
@@ -39,6 +40,7 @@ class PhpXmlBugTester {
 		$parsedOk = xml_parse( $parser, $xml, true );
 		$this->ok = $parsedOk && ( $this->parsedData == $charData );
 	}
+
 	public function chardata( $parser, $data ) {
 		$this->parsedData .= $data;
 	}
diff --git a/includes/installer/PostgresInstaller.php b/includes/installer/PostgresInstaller.php
index 4e5ae8cf..2cf41564 100644
--- a/includes/installer/PostgresInstaller.php
+++ b/includes/installer/PostgresInstaller.php
@@ -42,8 +42,8 @@ class PostgresInstaller extends DatabaseInstaller {
 		'_InstallUser' => 'postgres',
 	);
 
-	var $minimumVersion = '8.3';
-	var $maxRoleSearchDepth = 5;
+	public $minimumVersion = '8.3';
+	public $maxRoleSearchDepth = 5;
 
 	protected $pgConns = array();
 
@@ -56,13 +56,27 @@ class PostgresInstaller extends DatabaseInstaller {
 	}
 
 	function getConnectForm() {
-		return
-			$this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
+		return $this->getTextBox(
+			'wgDBserver',
+			'config-db-host',
+			array(),
+			$this->parent->getHelpBox( 'config-db-host-help' )
+		) .
 			$this->getTextBox( 'wgDBport', 'config-db-port' ) .
 			Html::openElement( 'fieldset' ) .
 			Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
-			$this->getTextBox( 'wgDBname', 'config-db-name', array(), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
-			$this->getTextBox( 'wgDBmwschema', 'config-db-schema', array(), $this->parent->getHelpBox( 'config-db-schema-help' ) ) .
+			$this->getTextBox(
+				'wgDBname',
+				'config-db-name',
+				array(),
+				$this->parent->getHelpBox( 'config-db-name-help' )
+			) .
+			$this->getTextBox(
+				'wgDBmwschema',
+				'config-db-schema',
+				array(),
+				$this->parent->getHelpBox( 'config-db-schema-help' )
+			) .
 			Html::closeElement( 'fieldset' ) .
 			$this->getInstallUserBox();
 	}
@@ -108,6 +122,7 @@ class PostgresInstaller extends DatabaseInstaller {
 
 		$this->setVar( 'wgDBuser', $this->getVar( '_InstallUser' ) );
 		$this->setVar( 'wgDBpassword', $this->getVar( '_InstallPassword' ) );
+
 		return Status::newGood();
 	}
 
@@ -116,6 +131,7 @@ class PostgresInstaller extends DatabaseInstaller {
 		if ( $status->isOK() ) {
 			$this->db = $status->value;
 		}
+
 		return $status;
 	}
 
@@ -137,11 +153,13 @@ class PostgresInstaller extends DatabaseInstaller {
 				$this->getVar( 'wgDBserver' ),
 				$user,
 				$password,
-				$dbName);
+				$dbName
+			);
 			$status->value = $db;
 		} catch ( DBConnectionError $e ) {
 			$status->fatal( 'config-connection-error', $e->getMessage() );
 		}
+
 		return $status;
 	}
 
@@ -165,6 +183,7 @@ class PostgresInstaller extends DatabaseInstaller {
 			$conn->commit( __METHOD__ );
 			$this->pgConns[$type] = $conn;
 		}
+
 		return $status;
 	}
 
@@ -215,6 +234,7 @@ class PostgresInstaller extends DatabaseInstaller {
 					$safeRole = $conn->addIdentifierQuotes( $this->getVar( 'wgDBuser' ) );
 					$conn->query( "SET ROLE $safeRole" );
 				}
+
 				return $status;
 			default:
 				throw new MWException( "Invalid special connection type: \"$type\"" );
@@ -267,6 +287,7 @@ class PostgresInstaller extends DatabaseInstaller {
 
 		$row = $conn->selectRow( '"pg_catalog"."pg_roles"', '*',
 			array( 'rolname' => $superuser ), __METHOD__ );
+
 		return $row;
 	}
 
@@ -275,6 +296,7 @@ class PostgresInstaller extends DatabaseInstaller {
 		if ( !$perms ) {
 			return false;
 		}
+
 		return $perms->rolsuper === 't' || $perms->rolcreaterole === 't';
 	}
 
@@ -283,6 +305,7 @@ class PostgresInstaller extends DatabaseInstaller {
 		if ( !$perms ) {
 			return false;
 		}
+
 		return $perms->rolsuper === 't';
 	}
 
@@ -331,6 +354,7 @@ class PostgresInstaller extends DatabaseInstaller {
 			} else {
 				$msg = 'config-install-user-missing';
 			}
+
 			return Status::newFatal( $msg, $this->getVar( 'wgDBuser' ) );
 		}
 
@@ -410,6 +434,7 @@ class PostgresInstaller extends DatabaseInstaller {
 				}
 			}
 		}
+
 		return false;
 	}
 
@@ -431,7 +456,7 @@ class PostgresInstaller extends DatabaseInstaller {
 			'callback' => array( $this, 'setupSchema' )
 		);
 
-		if( $this->getVar( '_CreateDBAccount' ) ) {
+		if ( $this->getVar( '_CreateDBAccount' ) ) {
 			$this->parent->addInstallStep( $createDbAccount, 'database' );
 		}
 		$this->parent->addInstallStep( $commitCB, 'interwiki' );
@@ -454,6 +479,7 @@ class PostgresInstaller extends DatabaseInstaller {
 			$safedb = $conn->addIdentifierQuotes( $dbName );
 			$conn->query( "CREATE DATABASE $safedb", __METHOD__ );
 		}
+
 		return Status::newGood();
 	}
 
@@ -469,7 +495,7 @@ class PostgresInstaller extends DatabaseInstaller {
 		$schema = $this->getVar( 'wgDBmwschema' );
 		$safeschema = $conn->addIdentifierQuotes( $schema );
 		$safeuser = $conn->addIdentifierQuotes( $this->getVar( 'wgDBuser' ) );
-		if( !$conn->schemaExists( $schema ) ) {
+		if ( !$conn->schemaExists( $schema ) ) {
 			try {
 				$conn->query( "CREATE SCHEMA $safeschema AUTHORIZATION $safeuser" );
 			} catch ( DBQueryError $e ) {
@@ -480,11 +506,13 @@ class PostgresInstaller extends DatabaseInstaller {
 
 		// Select the new schema in the current connection
 		$conn->determineCoreSchema( $schema );
+
 		return Status::newGood();
 	}
 
 	function commitChanges() {
 		$this->db->commit( __METHOD__ );
+
 		return Status::newGood();
 	}
 
@@ -529,8 +557,8 @@ class PostgresInstaller extends DatabaseInstaller {
 	function getLocalSettings() {
 		$port = $this->getVar( 'wgDBport' );
 		$schema = $this->getVar( 'wgDBmwschema' );
-		return
-"# Postgres specific settings
+
+		return "# Postgres specific settings
 \$wgDBport = \"{$port}\";
 \$wgDBmwschema = \"{$schema}\";";
 	}
@@ -557,20 +585,22 @@ class PostgresInstaller extends DatabaseInstaller {
 		 */
 		$conn = $status->value;
 
-		if( $conn->tableExists( 'archive' ) ) {
+		if ( $conn->tableExists( 'archive' ) ) {
 			$status->warning( 'config-install-tables-exist' );
 			$this->enableLB();
+
 			return $status;
 		}
 
 		$conn->begin( __METHOD__ );
 
-		if( !$conn->schemaExists( $schema ) ) {
+		if ( !$conn->schemaExists( $schema ) ) {
 			$status->fatal( 'config-install-pg-schema-not-exist' );
+
 			return $status;
 		}
 		$error = $conn->sourceFile( $conn->getSchemaPath() );
-		if( $error !== true ) {
+		if ( $error !== true ) {
 			$conn->reportQueryError( $error, 0, '', __METHOD__ );
 			$conn->rollback( __METHOD__ );
 			$status->fatal( 'config-install-tables-failed', $error );
@@ -578,9 +608,10 @@ class PostgresInstaller extends DatabaseInstaller {
 			$conn->commit( __METHOD__ );
 		}
 		// Resume normal operations
-		if( $status->isOk() ) {
+		if ( $status->isOk() ) {
 			$this->enableLB();
 		}
+
 		return $status;
 	}
 
@@ -623,6 +654,7 @@ class PostgresInstaller extends DatabaseInstaller {
 		} else {
 			return Status::newFatal( 'config-pg-no-plpgsql', $this->getVar( 'wgDBname' ) );
 		}
+
 		return Status::newGood();
 	}
 }
diff --git a/includes/installer/PostgresUpdater.php b/includes/installer/PostgresUpdater.php
index 0a4b5e65..599b523b 100644
--- a/includes/installer/PostgresUpdater.php
+++ b/includes/installer/PostgresUpdater.php
@@ -46,211 +46,240 @@ class PostgresUpdater extends DatabaseUpdater {
 			# r15791 Change reserved word table names "user" and "text"
 			array( 'renameTable', 'user', 'mwuser' ),
 			array( 'renameTable', 'text', 'pagecontent' ),
-			array( 'renameIndex', 'mwuser', 'user_pkey', 'mwuser_pkey'),
+			array( 'renameIndex', 'mwuser', 'user_pkey', 'mwuser_pkey' ),
 			array( 'renameIndex', 'mwuser', 'user_user_name_key', 'mwuser_user_name_key' ),
-			array( 'renameIndex', 'pagecontent','text_pkey', 'pagecontent_pkey' ),
+			array( 'renameIndex', 'pagecontent', 'text_pkey', 'pagecontent_pkey' ),
 
 			# renamed sequences
-			array( 'renameSequence', 'ipblocks_ipb_id_val', 'ipblocks_ipb_id_seq'         ),
-			array( 'renameSequence', 'rev_rev_id_val',      'revision_rev_id_seq'         ),
-			array( 'renameSequence', 'text_old_id_val',     'text_old_id_seq'             ),
-			array( 'renameSequence', 'rc_rc_id_seq',        'recentchanges_rc_id_seq'     ),
-			array( 'renameSequence', 'log_log_id_seq',      'logging_log_id_seq'          ),
-			array( 'renameSequence', 'pr_id_val',           'page_restrictions_pr_id_seq' ),
-			array( 'renameSequence', 'us_id_seq',           'uploadstash_us_id_seq' ),
+			array( 'renameSequence', 'ipblocks_ipb_id_val', 'ipblocks_ipb_id_seq' ),
+			array( 'renameSequence', 'rev_rev_id_val', 'revision_rev_id_seq' ),
+			array( 'renameSequence', 'text_old_id_val', 'text_old_id_seq' ),
+			array( 'renameSequence', 'rc_rc_id_seq', 'recentchanges_rc_id_seq' ),
+			array( 'renameSequence', 'log_log_id_seq', 'logging_log_id_seq' ),
+			array( 'renameSequence', 'pr_id_val', 'page_restrictions_pr_id_seq' ),
+			array( 'renameSequence', 'us_id_seq', 'uploadstash_us_id_seq' ),
 
 			# since r58263
-			array( 'renameSequence', 'category_id_seq', 'category_cat_id_seq'),
+			array( 'renameSequence', 'category_id_seq', 'category_cat_id_seq' ),
 
 			# new sequences if not renamed above
 			array( 'addSequence', 'logging', false, 'logging_log_id_seq' ),
 			array( 'addSequence', 'page_restrictions', false, 'page_restrictions_pr_id_seq' ),
 			array( 'addSequence', 'filearchive', 'fa_id', 'filearchive_fa_id_seq' ),
+			array( 'addSequence', 'archive', false, 'archive_ar_id_seq' ),
+			array( 'addSequence', 'externallinks', false, 'externallinks_el_id_seq' ),
 
 			# new tables
-			array( 'addTable', 'category',          'patch-category.sql' ),
-			array( 'addTable', 'page',              'patch-page.sql' ),
-			array( 'addTable', 'querycachetwo',     'patch-querycachetwo.sql' ),
-			array( 'addTable', 'page_props',        'patch-page_props.sql' ),
+			array( 'addTable', 'category', 'patch-category.sql' ),
+			array( 'addTable', 'page', 'patch-page.sql' ),
+			array( 'addTable', 'querycachetwo', 'patch-querycachetwo.sql' ),
+			array( 'addTable', 'page_props', 'patch-page_props.sql' ),
 			array( 'addTable', 'page_restrictions', 'patch-page_restrictions.sql' ),
-			array( 'addTable', 'profiling',         'patch-profiling.sql' ),
-			array( 'addTable', 'protected_titles',  'patch-protected_titles.sql' ),
-			array( 'addTable', 'redirect',          'patch-redirect.sql' ),
-			array( 'addTable', 'updatelog',         'patch-updatelog.sql' ),
-			array( 'addTable', 'change_tag',        'patch-change_tag.sql' ),
-			array( 'addTable', 'tag_summary',       'patch-tag_summary.sql' ),
-			array( 'addTable', 'valid_tag',         'patch-valid_tag.sql' ),
-			array( 'addTable', 'user_properties',   'patch-user_properties.sql' ),
-			array( 'addTable', 'log_search',        'patch-log_search.sql' ),
-			array( 'addTable', 'l10n_cache',        'patch-l10n_cache.sql' ),
-			array( 'addTable', 'iwlinks',           'patch-iwlinks.sql' ),
-			array( 'addTable', 'msg_resource',      'patch-msg_resource.sql' ),
-			array( 'addTable', 'msg_resource_links','patch-msg_resource_links.sql' ),
-			array( 'addTable', 'module_deps',       'patch-module_deps.sql' ),
-			array( 'addTable', 'uploadstash',       'patch-uploadstash.sql' ),
-			array( 'addTable', 'user_former_groups','patch-user_former_groups.sql' ),
-			array( 'addTable', 'external_user',     'patch-external_user.sql' ),
-			array( 'addTable', 'sites',             'patch-sites.sql' ),
+			array( 'addTable', 'profiling', 'patch-profiling.sql' ),
+			array( 'addTable', 'protected_titles', 'patch-protected_titles.sql' ),
+			array( 'addTable', 'redirect', 'patch-redirect.sql' ),
+			array( 'addTable', 'updatelog', 'patch-updatelog.sql' ),
+			array( 'addTable', 'change_tag', 'patch-change_tag.sql' ),
+			array( 'addTable', 'tag_summary', 'patch-tag_summary.sql' ),
+			array( 'addTable', 'valid_tag', 'patch-valid_tag.sql' ),
+			array( 'addTable', 'user_properties', 'patch-user_properties.sql' ),
+			array( 'addTable', 'log_search', 'patch-log_search.sql' ),
+			array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ),
+			array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ),
+			array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
+			array( 'addTable', 'msg_resource_links', 'patch-msg_resource_links.sql' ),
+			array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
+			array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
+			array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ),
+			array( 'addTable', 'sites', 'patch-sites.sql' ),
 
 			# Needed before new field
 			array( 'convertArchive2' ),
 
 			# new fields
-			array( 'addPgField', 'updatelog',     'ul_value',             'TEXT' ),
-			array( 'addPgField', 'archive',       'ar_deleted',           'SMALLINT NOT NULL DEFAULT 0' ),
-			array( 'addPgField', 'archive',       'ar_len',               'INTEGER' ),
-			array( 'addPgField', 'archive',       'ar_page_id',           'INTEGER' ),
-			array( 'addPgField', 'archive',       'ar_parent_id',         'INTEGER' ),
-			array( 'addPgField', 'archive',       'ar_content_model',     'TEXT' ),
-			array( 'addPgField', 'archive',       'ar_content_format',    'TEXT' ),
-			array( 'addPgField', 'categorylinks', 'cl_sortkey_prefix',    "TEXT NOT NULL DEFAULT ''"),
-			array( 'addPgField', 'categorylinks', 'cl_collation',         "TEXT NOT NULL DEFAULT 0"),
-			array( 'addPgField', 'categorylinks', 'cl_type',              "TEXT NOT NULL DEFAULT 'page'"),
-			array( 'addPgField', 'image',         'img_sha1',             "TEXT NOT NULL DEFAULT ''" ),
-			array( 'addPgField', 'ipblocks',      'ipb_allow_usertalk',   'SMALLINT NOT NULL DEFAULT 0' ),
-			array( 'addPgField', 'ipblocks',      'ipb_anon_only',        'SMALLINT NOT NULL DEFAULT 0' ),
-			array( 'addPgField', 'ipblocks',      'ipb_by_text',          "TEXT NOT NULL DEFAULT ''" ),
-			array( 'addPgField', 'ipblocks',      'ipb_block_email',      'SMALLINT NOT NULL DEFAULT 0' ),
-			array( 'addPgField', 'ipblocks',      'ipb_create_account',   'SMALLINT NOT NULL DEFAULT 1' ),
-			array( 'addPgField', 'ipblocks',      'ipb_deleted',          'SMALLINT NOT NULL DEFAULT 0' ),
-			array( 'addPgField', 'ipblocks',      'ipb_enable_autoblock', 'SMALLINT NOT NULL DEFAULT 1' ),
-			array( 'addPgField', 'ipblocks',      'ipb_parent_block_id',            'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ),
-			array( 'addPgField', 'filearchive',   'fa_deleted',           'SMALLINT NOT NULL DEFAULT 0' ),
-			array( 'addPgField', 'filearchive',   'fa_sha1',              "TEXT NOT NULL DEFAULT ''" ),
-			array( 'addPgField', 'logging',       'log_deleted',          'SMALLINT NOT NULL DEFAULT 0' ),
-			array( 'addPgField', 'logging',       'log_id',               "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')" ),
-			array( 'addPgField', 'logging',       'log_params',           'TEXT' ),
-			array( 'addPgField', 'mwuser',        'user_editcount',       'INTEGER' ),
-			array( 'addPgField', 'mwuser',        'user_newpass_time',    'TIMESTAMPTZ' ),
-			array( 'addPgField', 'oldimage',      'oi_deleted',           'SMALLINT NOT NULL DEFAULT 0' ),
-			array( 'addPgField', 'oldimage',      'oi_major_mime',        "TEXT NOT NULL DEFAULT 'unknown'" ),
-			array( 'addPgField', 'oldimage',      'oi_media_type',        'TEXT' ),
-			array( 'addPgField', 'oldimage',      'oi_metadata',          "BYTEA NOT NULL DEFAULT ''" ),
-			array( 'addPgField', 'oldimage',      'oi_minor_mime',        "TEXT NOT NULL DEFAULT 'unknown'" ),
-			array( 'addPgField', 'oldimage',      'oi_sha1',              "TEXT NOT NULL DEFAULT ''" ),
-			array( 'addPgField', 'page',          'page_content_model',   'TEXT' ),
-			array( 'addPgField', 'page_restrictions', 'pr_id',            "INTEGER NOT NULL UNIQUE DEFAULT nextval('page_restrictions_pr_id_seq')" ),
-			array( 'addPgField', 'profiling',     'pf_memory',            'NUMERIC(18,10) NOT NULL DEFAULT 0' ),
-			array( 'addPgField', 'recentchanges', 'rc_deleted',           'SMALLINT NOT NULL DEFAULT 0' ),
-			array( 'addPgField', 'recentchanges', 'rc_log_action',        'TEXT' ),
-			array( 'addPgField', 'recentchanges', 'rc_log_type',          'TEXT' ),
-			array( 'addPgField', 'recentchanges', 'rc_logid',             'INTEGER NOT NULL DEFAULT 0' ),
-			array( 'addPgField', 'recentchanges', 'rc_new_len',           'INTEGER' ),
-			array( 'addPgField', 'recentchanges', 'rc_old_len',           'INTEGER' ),
-			array( 'addPgField', 'recentchanges', 'rc_params',            'TEXT' ),
-			array( 'addPgField', 'redirect',      'rd_interwiki',         'TEXT NULL' ),
-			array( 'addPgField', 'redirect',      'rd_fragment',          'TEXT NULL' ),
-			array( 'addPgField', 'revision',      'rev_deleted',          'SMALLINT NOT NULL DEFAULT 0' ),
-			array( 'addPgField', 'revision',      'rev_len',              'INTEGER' ),
-			array( 'addPgField', 'revision',      'rev_parent_id',        'INTEGER DEFAULT NULL' ),
-			array( 'addPgField', 'revision',      'rev_content_model',    'TEXT' ),
-			array( 'addPgField', 'revision',      'rev_content_format',   'TEXT' ),
-			array( 'addPgField', 'site_stats',    'ss_active_users',      "INTEGER DEFAULT '-1'" ),
-			array( 'addPgField', 'user_newtalk',  'user_last_timestamp',  'TIMESTAMPTZ' ),
-			array( 'addPgField', 'logging',       'log_user_text',        "TEXT NOT NULL DEFAULT ''" ),
-			array( 'addPgField', 'logging',       'log_page',             'INTEGER' ),
-			array( 'addPgField', 'interwiki',     'iw_api',               "TEXT NOT NULL DEFAULT ''"),
-			array( 'addPgField', 'interwiki',     'iw_wikiid',            "TEXT NOT NULL DEFAULT ''"),
-			array( 'addPgField', 'revision',      'rev_sha1',             "TEXT NOT NULL DEFAULT ''" ),
-			array( 'addPgField', 'archive',       'ar_sha1',              "TEXT NOT NULL DEFAULT ''" ),
-			array( 'addPgField', 'uploadstash',   'us_chunk_inx',         "INTEGER NULL" ),
-			array( 'addPgField', 'job',           'job_timestamp',        "TIMESTAMPTZ" ),
-			array( 'addPgField', 'job',           'job_random',           "INTEGER NOT NULL DEFAULT 0" ),
-			array( 'addPgField', 'job',           'job_attempts',         "INTEGER NOT NULL DEFAULT 0" ),
-			array( 'addPgField', 'job',           'job_token',            "TEXT NOT NULL DEFAULT ''" ),
-			array( 'addPgField', 'job',           'job_token_timestamp',  "TIMESTAMPTZ" ),
-			array( 'addPgField', 'job',           'job_sha1',             "TEXT NOT NULL DEFAULT ''" ),
+			array( 'addPgField', 'updatelog', 'ul_value', 'TEXT' ),
+			array( 'addPgField', 'archive', 'ar_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+			array( 'addPgField', 'archive', 'ar_len', 'INTEGER' ),
+			array( 'addPgField', 'archive', 'ar_page_id', 'INTEGER' ),
+			array( 'addPgField', 'archive', 'ar_parent_id', 'INTEGER' ),
+			array( 'addPgField', 'archive', 'ar_content_model', 'TEXT' ),
+			array( 'addPgField', 'archive', 'ar_content_format', 'TEXT' ),
+			array( 'addPgField', 'categorylinks', 'cl_sortkey_prefix', "TEXT NOT NULL DEFAULT ''" ),
+			array( 'addPgField', 'categorylinks', 'cl_collation', "TEXT NOT NULL DEFAULT 0" ),
+			array( 'addPgField', 'categorylinks', 'cl_type', "TEXT NOT NULL DEFAULT 'page'" ),
+			array( 'addPgField', 'image', 'img_sha1', "TEXT NOT NULL DEFAULT ''" ),
+			array( 'addPgField', 'ipblocks', 'ipb_allow_usertalk', 'SMALLINT NOT NULL DEFAULT 0' ),
+			array( 'addPgField', 'ipblocks', 'ipb_anon_only', 'SMALLINT NOT NULL DEFAULT 0' ),
+			array( 'addPgField', 'ipblocks', 'ipb_by_text', "TEXT NOT NULL DEFAULT ''" ),
+			array( 'addPgField', 'ipblocks', 'ipb_block_email', 'SMALLINT NOT NULL DEFAULT 0' ),
+			array( 'addPgField', 'ipblocks', 'ipb_create_account', 'SMALLINT NOT NULL DEFAULT 1' ),
+			array( 'addPgField', 'ipblocks', 'ipb_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+			array( 'addPgField', 'ipblocks', 'ipb_enable_autoblock', 'SMALLINT NOT NULL DEFAULT 1' ),
+			array( 'addPgField', 'ipblocks', 'ipb_parent_block_id',
+				'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ' .
+				'ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ),
+			array( 'addPgField', 'filearchive', 'fa_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+			array( 'addPgField', 'filearchive', 'fa_sha1', "TEXT NOT NULL DEFAULT ''" ),
+			array( 'addPgField', 'logging', 'log_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+			array( 'addPgField', 'logging', 'log_id',
+				"INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')" ),
+			array( 'addPgField', 'logging', 'log_params', 'TEXT' ),
+			array( 'addPgField', 'mwuser', 'user_editcount', 'INTEGER' ),
+			array( 'addPgField', 'mwuser', 'user_newpass_time', 'TIMESTAMPTZ' ),
+			array( 'addPgField', 'oldimage', 'oi_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+			array( 'addPgField', 'oldimage', 'oi_major_mime', "TEXT NOT NULL DEFAULT 'unknown'" ),
+			array( 'addPgField', 'oldimage', 'oi_media_type', 'TEXT' ),
+			array( 'addPgField', 'oldimage', 'oi_metadata', "BYTEA NOT NULL DEFAULT ''" ),
+			array( 'addPgField', 'oldimage', 'oi_minor_mime', "TEXT NOT NULL DEFAULT 'unknown'" ),
+			array( 'addPgField', 'oldimage', 'oi_sha1', "TEXT NOT NULL DEFAULT ''" ),
+			array( 'addPgField', 'page', 'page_content_model', 'TEXT' ),
+			array( 'addPgField', 'page_restrictions', 'pr_id',
+				"INTEGER NOT NULL UNIQUE DEFAULT nextval('page_restrictions_pr_id_seq')" ),
+			array( 'addPgField', 'profiling', 'pf_memory', 'NUMERIC(18,10) NOT NULL DEFAULT 0' ),
+			array( 'addPgField', 'recentchanges', 'rc_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+			array( 'addPgField', 'recentchanges', 'rc_log_action', 'TEXT' ),
+			array( 'addPgField', 'recentchanges', 'rc_log_type', 'TEXT' ),
+			array( 'addPgField', 'recentchanges', 'rc_logid', 'INTEGER NOT NULL DEFAULT 0' ),
+			array( 'addPgField', 'recentchanges', 'rc_new_len', 'INTEGER' ),
+			array( 'addPgField', 'recentchanges', 'rc_old_len', 'INTEGER' ),
+			array( 'addPgField', 'recentchanges', 'rc_params', 'TEXT' ),
+			array( 'addPgField', 'redirect', 'rd_interwiki', 'TEXT NULL' ),
+			array( 'addPgField', 'redirect', 'rd_fragment', 'TEXT NULL' ),
+			array( 'addPgField', 'revision', 'rev_deleted', 'SMALLINT NOT NULL DEFAULT 0' ),
+			array( 'addPgField', 'revision', 'rev_len', 'INTEGER' ),
+			array( 'addPgField', 'revision', 'rev_parent_id', 'INTEGER DEFAULT NULL' ),
+			array( 'addPgField', 'revision', 'rev_content_model', 'TEXT' ),
+			array( 'addPgField', 'revision', 'rev_content_format', 'TEXT' ),
+			array( 'addPgField', 'site_stats', 'ss_active_users', "INTEGER DEFAULT '-1'" ),
+			array( 'addPgField', 'user_newtalk', 'user_last_timestamp', 'TIMESTAMPTZ' ),
+			array( 'addPgField', 'logging', 'log_user_text', "TEXT NOT NULL DEFAULT ''" ),
+			array( 'addPgField', 'logging', 'log_page', 'INTEGER' ),
+			array( 'addPgField', 'interwiki', 'iw_api', "TEXT NOT NULL DEFAULT ''" ),
+			array( 'addPgField', 'interwiki', 'iw_wikiid', "TEXT NOT NULL DEFAULT ''" ),
+			array( 'addPgField', 'revision', 'rev_sha1', "TEXT NOT NULL DEFAULT ''" ),
+			array( 'addPgField', 'archive', 'ar_sha1', "TEXT NOT NULL DEFAULT ''" ),
+			array( 'addPgField', 'uploadstash', 'us_chunk_inx', "INTEGER NULL" ),
+			array( 'addPgField', 'job', 'job_timestamp', "TIMESTAMPTZ" ),
+			array( 'addPgField', 'job', 'job_random', "INTEGER NOT NULL DEFAULT 0" ),
+			array( 'addPgField', 'job', 'job_attempts', "INTEGER NOT NULL DEFAULT 0" ),
+			array( 'addPgField', 'job', 'job_token', "TEXT NOT NULL DEFAULT ''" ),
+			array( 'addPgField', 'job', 'job_token_timestamp', "TIMESTAMPTZ" ),
+			array( 'addPgField', 'job', 'job_sha1', "TEXT NOT NULL DEFAULT ''" ),
+			array( 'addPgField', 'archive', 'ar_id',
+				"INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('archive_ar_id_seq')" ),
+			array( 'addPgField', 'externallinks', 'el_id',
+				"INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('externallinks_el_id_seq')" ),
 
 			# type changes
-			array( 'changeField', 'archive',       'ar_deleted',      'smallint', '' ),
-			array( 'changeField', 'archive',       'ar_minor_edit',   'smallint', 'ar_minor_edit::smallint DEFAULT 0' ),
-			array( 'changeField', 'filearchive',   'fa_deleted',      'smallint', '' ),
-			array( 'changeField', 'filearchive',   'fa_height',       'integer',  '' ),
-			array( 'changeField', 'filearchive',   'fa_metadata',     'bytea',    "decode(fa_metadata,'escape')" ),
-			array( 'changeField', 'filearchive',   'fa_size',         'integer',  '' ),
-			array( 'changeField', 'filearchive',   'fa_width',        'integer',  '' ),
-			array( 'changeField', 'filearchive',   'fa_storage_group', 'text',     '' ),
-			array( 'changeField', 'filearchive',   'fa_storage_key',  'text',     '' ),
-			array( 'changeField', 'image',         'img_metadata',    'bytea',    "decode(img_metadata,'escape')" ),
-			array( 'changeField', 'image',         'img_size',        'integer',  '' ),
-			array( 'changeField', 'image',         'img_width',       'integer',  '' ),
-			array( 'changeField', 'image',         'img_height',      'integer',  '' ),
-			array( 'changeField', 'interwiki',     'iw_local',        'smallint', 'iw_local::smallint' ),
-			array( 'changeField', 'interwiki',     'iw_trans',        'smallint', 'iw_trans::smallint DEFAULT 0' ),
-			array( 'changeField', 'ipblocks',      'ipb_auto',        'smallint', 'ipb_auto::smallint DEFAULT 0' ),
-			array( 'changeField', 'ipblocks',      'ipb_anon_only',   'smallint', "CASE WHEN ipb_anon_only=' ' THEN 0 ELSE ipb_anon_only::smallint END DEFAULT 0" ),
-			array( 'changeField', 'ipblocks',      'ipb_create_account', 'smallint', "CASE WHEN ipb_create_account=' ' THEN 0 ELSE ipb_create_account::smallint END DEFAULT 1" ),
-			array( 'changeField', 'ipblocks',      'ipb_enable_autoblock', 'smallint', "CASE WHEN ipb_enable_autoblock=' ' THEN 0 ELSE ipb_enable_autoblock::smallint END DEFAULT 1" ),
-			array( 'changeField', 'ipblocks',      'ipb_block_email', 'smallint', "CASE WHEN ipb_block_email=' ' THEN 0 ELSE ipb_block_email::smallint END DEFAULT 0" ),
-			array( 'changeField', 'ipblocks',      'ipb_address',     'text',     'ipb_address::text' ),
-			array( 'changeField', 'ipblocks',      'ipb_deleted',     'smallint', 'ipb_deleted::smallint DEFAULT 0' ),
-			array( 'changeField', 'mwuser',        'user_token',      'text',     '' ),
-			array( 'changeField', 'mwuser',        'user_email_token', 'text',     '' ),
-			array( 'changeField', 'objectcache',   'keyname',         'text',     '' ),
-			array( 'changeField', 'oldimage',      'oi_height',       'integer',  '' ),
-			array( 'changeField', 'oldimage',      'oi_metadata',     'bytea',    "decode(img_metadata,'escape')" ),
-			array( 'changeField', 'oldimage',      'oi_size',         'integer',  '' ),
-			array( 'changeField', 'oldimage',      'oi_width',        'integer',  '' ),
-			array( 'changeField', 'page',          'page_is_redirect', 'smallint', 'page_is_redirect::smallint DEFAULT 0' ),
-			array( 'changeField', 'page',          'page_is_new',     'smallint', 'page_is_new::smallint DEFAULT 0' ),
-			array( 'changeField', 'querycache',    'qc_value',        'integer',  '' ),
-			array( 'changeField', 'querycachetwo', 'qcc_value',       'integer',  '' ),
-			array( 'changeField', 'recentchanges', 'rc_bot',          'smallint', 'rc_bot::smallint DEFAULT 0' ),
-			array( 'changeField', 'recentchanges', 'rc_deleted',      'smallint', '' ),
-			array( 'changeField', 'recentchanges', 'rc_minor',        'smallint', 'rc_minor::smallint DEFAULT 0' ),
-			array( 'changeField', 'recentchanges', 'rc_new',          'smallint', 'rc_new::smallint DEFAULT 0' ),
-			array( 'changeField', 'recentchanges', 'rc_type',         'smallint', 'rc_type::smallint DEFAULT 0' ),
-			array( 'changeField', 'recentchanges', 'rc_patrolled',    'smallint', 'rc_patrolled::smallint DEFAULT 0' ),
-			array( 'changeField', 'revision',      'rev_deleted',     'smallint', 'rev_deleted::smallint DEFAULT 0' ),
-			array( 'changeField', 'revision',      'rev_minor_edit',  'smallint', 'rev_minor_edit::smallint DEFAULT 0' ),
-			array( 'changeField', 'templatelinks', 'tl_namespace',    'smallint', 'tl_namespace::smallint' ),
-			array( 'changeField', 'user_newtalk',  'user_ip',         'text',     'host(user_ip)' ),
-			array( 'changeField', 'uploadstash',   'us_image_bits',   'smallint', '' ),
+			array( 'changeField', 'archive', 'ar_deleted', 'smallint', '' ),
+			array( 'changeField', 'archive', 'ar_minor_edit', 'smallint',
+				'ar_minor_edit::smallint DEFAULT 0' ),
+			array( 'changeField', 'filearchive', 'fa_deleted', 'smallint', '' ),
+			array( 'changeField', 'filearchive', 'fa_height', 'integer', '' ),
+			array( 'changeField', 'filearchive', 'fa_metadata', 'bytea', "decode(fa_metadata,'escape')" ),
+			array( 'changeField', 'filearchive', 'fa_size', 'integer', '' ),
+			array( 'changeField', 'filearchive', 'fa_width', 'integer', '' ),
+			array( 'changeField', 'filearchive', 'fa_storage_group', 'text', '' ),
+			array( 'changeField', 'filearchive', 'fa_storage_key', 'text', '' ),
+			array( 'changeField', 'image', 'img_metadata', 'bytea', "decode(img_metadata,'escape')" ),
+			array( 'changeField', 'image', 'img_size', 'integer', '' ),
+			array( 'changeField', 'image', 'img_width', 'integer', '' ),
+			array( 'changeField', 'image', 'img_height', 'integer', '' ),
+			array( 'changeField', 'interwiki', 'iw_local', 'smallint', 'iw_local::smallint' ),
+			array( 'changeField', 'interwiki', 'iw_trans', 'smallint', 'iw_trans::smallint DEFAULT 0' ),
+			array( 'changeField', 'ipblocks', 'ipb_auto', 'smallint', 'ipb_auto::smallint DEFAULT 0' ),
+			array( 'changeField', 'ipblocks', 'ipb_anon_only', 'smallint',
+				"CASE WHEN ipb_anon_only=' ' THEN 0 ELSE ipb_anon_only::smallint END DEFAULT 0" ),
+			array( 'changeField', 'ipblocks', 'ipb_create_account', 'smallint',
+				"CASE WHEN ipb_create_account=' ' THEN 0 ELSE ipb_create_account::smallint END DEFAULT 1" ),
+			array( 'changeField', 'ipblocks', 'ipb_enable_autoblock', 'smallint',
+				"CASE WHEN ipb_enable_autoblock=' ' THEN 0 ELSE ipb_enable_autoblock::smallint END DEFAULT 1" ),
+			array( 'changeField', 'ipblocks', 'ipb_block_email', 'smallint',
+				"CASE WHEN ipb_block_email=' ' THEN 0 ELSE ipb_block_email::smallint END DEFAULT 0" ),
+			array( 'changeField', 'ipblocks', 'ipb_address', 'text', 'ipb_address::text' ),
+			array( 'changeField', 'ipblocks', 'ipb_deleted', 'smallint', 'ipb_deleted::smallint DEFAULT 0' ),
+			array( 'changeField', 'mwuser', 'user_token', 'text', '' ),
+			array( 'changeField', 'mwuser', 'user_email_token', 'text', '' ),
+			array( 'changeField', 'objectcache', 'keyname', 'text', '' ),
+			array( 'changeField', 'oldimage', 'oi_height', 'integer', '' ),
+			array( 'changeField', 'oldimage', 'oi_metadata', 'bytea', "decode(img_metadata,'escape')" ),
+			array( 'changeField', 'oldimage', 'oi_size', 'integer', '' ),
+			array( 'changeField', 'oldimage', 'oi_width', 'integer', '' ),
+			array( 'changeField', 'page', 'page_is_redirect', 'smallint',
+				'page_is_redirect::smallint DEFAULT 0' ),
+			array( 'changeField', 'page', 'page_is_new', 'smallint', 'page_is_new::smallint DEFAULT 0' ),
+			array( 'changeField', 'querycache', 'qc_value', 'integer', '' ),
+			array( 'changeField', 'querycachetwo', 'qcc_value', 'integer', '' ),
+			array( 'changeField', 'recentchanges', 'rc_bot', 'smallint', 'rc_bot::smallint DEFAULT 0' ),
+			array( 'changeField', 'recentchanges', 'rc_deleted', 'smallint', '' ),
+			array( 'changeField', 'recentchanges', 'rc_minor', 'smallint', 'rc_minor::smallint DEFAULT 0' ),
+			array( 'changeField', 'recentchanges', 'rc_new', 'smallint', 'rc_new::smallint DEFAULT 0' ),
+			array( 'changeField', 'recentchanges', 'rc_type', 'smallint', 'rc_type::smallint DEFAULT 0' ),
+			array( 'changeField', 'recentchanges', 'rc_patrolled', 'smallint',
+				'rc_patrolled::smallint DEFAULT 0' ),
+			array( 'changeField', 'revision', 'rev_deleted', 'smallint', 'rev_deleted::smallint DEFAULT 0' ),
+			array( 'changeField', 'revision', 'rev_minor_edit', 'smallint',
+				'rev_minor_edit::smallint DEFAULT 0' ),
+			array( 'changeField', 'templatelinks', 'tl_namespace', 'smallint', 'tl_namespace::smallint' ),
+			array( 'changeField', 'user_newtalk', 'user_ip', 'text', 'host(user_ip)' ),
+			array( 'changeField', 'uploadstash', 'us_image_bits', 'smallint', '' ),
+			array( 'changeField', 'profiling', 'pf_time', 'float', '' ),
+			array( 'changeField', 'profiling', 'pf_memory', 'float', '' ),
 
 			# null changes
-			array( 'changeNullableField', 'oldimage', 'oi_bits',       'NULL' ),
-			array( 'changeNullableField', 'oldimage', 'oi_timestamp',  'NULL' ),
+			array( 'changeNullableField', 'oldimage', 'oi_bits', 'NULL' ),
+			array( 'changeNullableField', 'oldimage', 'oi_timestamp', 'NULL' ),
 			array( 'changeNullableField', 'oldimage', 'oi_major_mime', 'NULL' ),
 			array( 'changeNullableField', 'oldimage', 'oi_minor_mime', 'NULL' ),
-			array( 'changeNullableField', 'image', 'img_metadata', 'NOT NULL'),
-			array( 'changeNullableField', 'filearchive', 'fa_metadata', 'NOT NULL'),
+			array( 'changeNullableField', 'image', 'img_metadata', 'NOT NULL' ),
+			array( 'changeNullableField', 'filearchive', 'fa_metadata', 'NOT NULL' ),
 			array( 'changeNullableField', 'recentchanges', 'rc_cur_id', 'NULL' ),
 
 			array( 'checkOiDeleted' ),
 
 			# New indexes
-			array( 'addPgIndex', 'archive',       'archive_user_text',      '(ar_user_text)' ),
-			array( 'addPgIndex', 'image',         'img_sha1',               '(img_sha1)' ),
-			array( 'addPgIndex', 'ipblocks',      'ipb_parent_block_id',              '(ipb_parent_block_id)' ),
-			array( 'addPgIndex', 'oldimage',      'oi_sha1',                '(oi_sha1)' ),
-			array( 'addPgIndex', 'page',          'page_mediawiki_title',   '(page_title) WHERE page_namespace = 8' ),
-			array( 'addPgIndex', 'pagelinks',     'pagelinks_title',        '(pl_title)' ),
-			array( 'addPgIndex', 'page_props',    'pp_propname_page',       '(pp_propname, pp_page)' ),
-			array( 'addPgIndex', 'revision',      'rev_text_id_idx',        '(rev_text_id)' ),
-			array( 'addPgIndex', 'recentchanges', 'rc_timestamp_bot',       '(rc_timestamp) WHERE rc_bot = 0' ),
-			array( 'addPgIndex', 'templatelinks', 'templatelinks_from',     '(tl_from)' ),
-			array( 'addPgIndex', 'watchlist',     'wl_user',                '(wl_user)' ),
-			array( 'addPgIndex', 'logging',       'logging_user_type_time', '(log_user, log_type, log_timestamp)' ),
-			array( 'addPgIndex', 'logging',       'logging_page_id_time',   '(log_page,log_timestamp)' ),
-			array( 'addPgIndex', 'iwlinks',       'iwl_prefix_title_from',  '(iwl_prefix, iwl_title, iwl_from)' ),
-			array( 'addPgIndex', 'job',           'job_timestamp_idx',      '(job_timestamp)' ),
-			array( 'addPgIndex', 'job',           'job_sha1',               '(job_sha1)' ),
-			array( 'addPgIndex', 'job',           'job_cmd_token',          '(job_cmd, job_token, job_random)' ),
-			array( 'addPgIndex', 'job',           'job_cmd_token_id',       '(job_cmd, job_token, job_id)' ),
-			array( 'addPgIndex', 'filearchive',   'fa_sha1',                '(fa_sha1)' ),
+			array( 'addPgIndex', 'archive', 'archive_user_text', '(ar_user_text)' ),
+			array( 'addPgIndex', 'image', 'img_sha1', '(img_sha1)' ),
+			array( 'addPgIndex', 'ipblocks', 'ipb_parent_block_id', '(ipb_parent_block_id)' ),
+			array( 'addPgIndex', 'oldimage', 'oi_sha1', '(oi_sha1)' ),
+			array( 'addPgIndex', 'page', 'page_mediawiki_title', '(page_title) WHERE page_namespace = 8' ),
+			array( 'addPgIndex', 'pagelinks', 'pagelinks_title', '(pl_title)' ),
+			array( 'addPgIndex', 'page_props', 'pp_propname_page', '(pp_propname, pp_page)' ),
+			array( 'addPgIndex', 'revision', 'rev_text_id_idx', '(rev_text_id)' ),
+			array( 'addPgIndex', 'recentchanges', 'rc_timestamp_bot', '(rc_timestamp) WHERE rc_bot = 0' ),
+			array( 'addPgIndex', 'templatelinks', 'templatelinks_from', '(tl_from)' ),
+			array( 'addPgIndex', 'watchlist', 'wl_user', '(wl_user)' ),
+			array( 'addPgIndex', 'logging', 'logging_user_type_time',
+				'(log_user, log_type, log_timestamp)' ),
+			array( 'addPgIndex', 'logging', 'logging_page_id_time', '(log_page,log_timestamp)' ),
+			array( 'addPgIndex', 'iwlinks', 'iwl_prefix_from_title', '(iwl_prefix, iwl_from, iwl_title)' ),
+			array( 'addPgIndex', 'iwlinks', 'iwl_prefix_title_from', '(iwl_prefix, iwl_title, iwl_from)' ),
+			array( 'addPgIndex', 'job', 'job_timestamp_idx', '(job_timestamp)' ),
+			array( 'addPgIndex', 'job', 'job_sha1', '(job_sha1)' ),
+			array( 'addPgIndex', 'job', 'job_cmd_token', '(job_cmd, job_token, job_random)' ),
+			array( 'addPgIndex', 'job', 'job_cmd_token_id', '(job_cmd, job_token, job_id)' ),
+			array( 'addPgIndex', 'filearchive', 'fa_sha1', '(fa_sha1)' ),
 
 			array( 'checkIndex', 'pagelink_unique', array(
 				array( 'pl_from', 'int4_ops', 'btree', 0 ),
 				array( 'pl_namespace', 'int2_ops', 'btree', 0 ),
 				array( 'pl_title', 'text_ops', 'btree', 0 ),
 			),
-			'CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title)' ),
+				'CREATE UNIQUE INDEX pagelink_unique ON pagelinks (pl_from,pl_namespace,pl_title)' ),
 			array( 'checkIndex', 'cl_sortkey', array(
 				array( 'cl_to', 'text_ops', 'btree', 0 ),
 				array( 'cl_sortkey', 'text_ops', 'btree', 0 ),
 				array( 'cl_from', 'int4_ops', 'btree', 0 ),
 			),
-			'CREATE INDEX cl_sortkey ON "categorylinks" USING "btree" ("cl_to", "cl_sortkey", "cl_from")' ),
+				'CREATE INDEX cl_sortkey ON "categorylinks" ' .
+					'USING "btree" ("cl_to", "cl_sortkey", "cl_from")' ),
+			array( 'checkIndex', 'iwl_prefix_title_from', array(
+				array( 'iwl_prefix', 'text_ops', 'btree', 0 ),
+				array( 'iwl_title', 'text_ops', 'btree', 0 ),
+				array( 'iwl_from', 'int4_ops', 'btree', 0 ),
+			),
+			'CREATE INDEX iwl_prefix_title_from ON "iwlinks" ' .
+				'USING "btree" ("iwl_prefix", "iwl_title", "iwl_from")' ),
 			array( 'checkIndex', 'logging_times', array(
 				array( 'log_timestamp', 'timestamptz_ops', 'btree', 0 ),
 			),
@@ -260,36 +289,48 @@ class PostgresUpdater extends DatabaseUpdater {
 				array( 'oi_name', 'text_ops', 'btree', 0 ),
 				array( 'oi_archive_name', 'text_ops', 'btree', 0 ),
 			),
-			'CREATE INDEX "oi_name_archive_name" ON "oldimage" USING "btree" ("oi_name", "oi_archive_name")' ),
+			'CREATE INDEX "oi_name_archive_name" ON "oldimage" ' .
+				'USING "btree" ("oi_name", "oi_archive_name")' ),
 			array( 'checkIndex', 'oi_name_timestamp', array(
 				array( 'oi_name', 'text_ops', 'btree', 0 ),
 				array( 'oi_timestamp', 'timestamptz_ops', 'btree', 0 ),
 			),
-			'CREATE INDEX "oi_name_timestamp" ON "oldimage" USING "btree" ("oi_name", "oi_timestamp")' ),
+			'CREATE INDEX "oi_name_timestamp" ON "oldimage" ' .
+				'USING "btree" ("oi_name", "oi_timestamp")' ),
 			array( 'checkIndex', 'page_main_title', array(
 				array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
 			),
-			'CREATE INDEX "page_main_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 0)' ),
+			'CREATE INDEX "page_main_title" ON "page" ' .
+				'USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 0)' ),
 			array( 'checkIndex', 'page_mediawiki_title', array(
 				array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
 			),
-			'CREATE INDEX "page_mediawiki_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 8)' ),
+			'CREATE INDEX "page_mediawiki_title" ON "page" ' .
+				'USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 8)' ),
 			array( 'checkIndex', 'page_project_title', array(
 				array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
 			),
-			'CREATE INDEX "page_project_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 4)' ),
+			'CREATE INDEX "page_project_title" ON "page" ' .
+				'USING "btree" ("page_title" "text_pattern_ops") ' .
+				'WHERE ("page_namespace" = 4)' ),
 			array( 'checkIndex', 'page_talk_title', array(
 				array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
 			),
-			'CREATE INDEX "page_talk_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 1)' ),
+			'CREATE INDEX "page_talk_title" ON "page" ' .
+				'USING "btree" ("page_title" "text_pattern_ops") ' .
+				'WHERE ("page_namespace" = 1)' ),
 			array( 'checkIndex', 'page_user_title', array(
 				array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
 			),
-			'CREATE INDEX "page_user_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 2)' ),
+			'CREATE INDEX "page_user_title" ON "page" ' .
+				'USING "btree" ("page_title" "text_pattern_ops") WHERE ' .
+				'("page_namespace" = 2)' ),
 			array( 'checkIndex', 'page_utalk_title', array(
 				array( 'page_title', 'text_pattern_ops', 'btree', 0 ),
 			),
-			'CREATE INDEX "page_utalk_title" ON "page" USING "btree" ("page_title" "text_pattern_ops") WHERE ("page_namespace" = 3)' ),
+			'CREATE INDEX "page_utalk_title" ON "page" ' .
+				'USING "btree" ("page_title" "text_pattern_ops") ' .
+				'WHERE ("page_namespace" = 3)' ),
 			array( 'checkIndex', 'ts2_page_text', array(
 				array( 'textvector', 'tsvector_ops', 'gist', 0 ),
 			),
@@ -302,46 +343,55 @@ class PostgresUpdater extends DatabaseUpdater {
 			array( 'checkOiNameConstraint' ),
 			array( 'checkPageDeletedTrigger' ),
 			array( 'checkRevUserFkey' ),
-			array( 'dropIndex', 'ipblocks', 'ipb_address'),
+			array( 'dropIndex', 'ipblocks', 'ipb_address' ),
 			array( 'checkIndex', 'ipb_address_unique', array(
 				array( 'ipb_address', 'text_ops', 'btree', 0 ),
-				array( 'ipb_user',    'int4_ops', 'btree', 0 ),
-				array( 'ipb_auto',    'int2_ops', 'btree', 0 ),
+				array( 'ipb_user', 'int4_ops', 'btree', 0 ),
+				array( 'ipb_auto', 'int2_ops', 'btree', 0 ),
 				array( 'ipb_anon_only', 'int2_ops', 'btree', 0 ),
 			),
-			'CREATE UNIQUE INDEX ipb_address_unique ON ipblocks (ipb_address,ipb_user,ipb_auto,ipb_anon_only)' ),
+			'CREATE UNIQUE INDEX ipb_address_unique ' .
+				'ON ipblocks (ipb_address,ipb_user,ipb_auto,ipb_anon_only)' ),
 
 			array( 'checkIwlPrefix' ),
 
 			# All FK columns should be deferred
-			array( 'changeFkeyDeferrable', 'archive',          'ar_user',         'mwuser(user_id) ON DELETE SET NULL' ),
-			array( 'changeFkeyDeferrable', 'categorylinks',    'cl_from',         'page(page_id) ON DELETE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'externallinks',    'el_from',         'page(page_id) ON DELETE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'filearchive',      'fa_deleted_user', 'mwuser(user_id) ON DELETE SET NULL' ),
-			array( 'changeFkeyDeferrable', 'filearchive',      'fa_user',         'mwuser(user_id) ON DELETE SET NULL' ),
-			array( 'changeFkeyDeferrable', 'image',            'img_user',        'mwuser(user_id) ON DELETE SET NULL' ),
-			array( 'changeFkeyDeferrable', 'imagelinks',       'il_from',         'page(page_id) ON DELETE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'ipblocks',         'ipb_by',          'mwuser(user_id) ON DELETE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'ipblocks',         'ipb_user',        'mwuser(user_id) ON DELETE SET NULL' ),
-			array( 'changeFkeyDeferrable', 'ipblocks',         'ipb_parent_block_id',       'ipblocks(ipb_id) ON DELETE SET NULL' ),
-			array( 'changeFkeyDeferrable', 'langlinks',        'll_from',         'page(page_id) ON DELETE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'logging',          'log_user',        'mwuser(user_id) ON DELETE SET NULL' ),
-			array( 'changeFkeyDeferrable', 'oldimage',         'oi_name',         'image(img_name) ON DELETE CASCADE ON UPDATE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'oldimage',         'oi_user',         'mwuser(user_id) ON DELETE SET NULL' ),
-			array( 'changeFkeyDeferrable', 'pagelinks',        'pl_from',         'page(page_id) ON DELETE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'page_props',       'pp_page',         'page (page_id) ON DELETE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'page_restrictions', 'pr_page',         'page(page_id) ON DELETE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'protected_titles', 'pt_user',         'mwuser(user_id) ON DELETE SET NULL' ),
-			array( 'changeFkeyDeferrable', 'recentchanges',    'rc_cur_id',       'page(page_id) ON DELETE SET NULL' ),
-			array( 'changeFkeyDeferrable', 'recentchanges',    'rc_user',         'mwuser(user_id) ON DELETE SET NULL' ),
-			array( 'changeFkeyDeferrable', 'redirect',         'rd_from',         'page(page_id) ON DELETE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'revision',         'rev_page',        'page (page_id) ON DELETE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'revision',         'rev_user',        'mwuser(user_id) ON DELETE RESTRICT' ),
-			array( 'changeFkeyDeferrable', 'templatelinks',    'tl_from',         'page(page_id) ON DELETE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'user_groups',      'ug_user',         'mwuser(user_id) ON DELETE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'user_newtalk',     'user_id',         'mwuser(user_id) ON DELETE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'user_properties',  'up_user',         'mwuser(user_id) ON DELETE CASCADE' ),
-			array( 'changeFkeyDeferrable', 'watchlist',        'wl_user',         'mwuser(user_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'archive', 'ar_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+			array( 'changeFkeyDeferrable', 'categorylinks', 'cl_from', 'page(page_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'externallinks', 'el_from', 'page(page_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'filearchive', 'fa_deleted_user',
+				'mwuser(user_id) ON DELETE SET NULL' ),
+			array( 'changeFkeyDeferrable', 'filearchive', 'fa_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+			array( 'changeFkeyDeferrable', 'image', 'img_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+			array( 'changeFkeyDeferrable', 'imagelinks', 'il_from', 'page(page_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_by', 'mwuser(user_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+			array( 'changeFkeyDeferrable', 'ipblocks', 'ipb_parent_block_id',
+				'ipblocks(ipb_id) ON DELETE SET NULL' ),
+			array( 'changeFkeyDeferrable', 'langlinks', 'll_from', 'page(page_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'logging', 'log_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+			array( 'changeFkeyDeferrable', 'oldimage', 'oi_name',
+				'image(img_name) ON DELETE CASCADE ON UPDATE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'oldimage', 'oi_user', 'mwuser(user_id) ON DELETE SET NULL' ),
+			array( 'changeFkeyDeferrable', 'pagelinks', 'pl_from', 'page(page_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'page_props', 'pp_page', 'page (page_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'page_restrictions', 'pr_page',
+				'page(page_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'protected_titles', 'pt_user',
+				'mwuser(user_id) ON DELETE SET NULL' ),
+			array( 'changeFkeyDeferrable', 'recentchanges', 'rc_cur_id',
+				'page(page_id) ON DELETE SET NULL' ),
+			array( 'changeFkeyDeferrable', 'recentchanges', 'rc_user',
+				'mwuser(user_id) ON DELETE SET NULL' ),
+			array( 'changeFkeyDeferrable', 'redirect', 'rd_from', 'page(page_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'revision', 'rev_page', 'page (page_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'revision', 'rev_user', 'mwuser(user_id) ON DELETE RESTRICT' ),
+			array( 'changeFkeyDeferrable', 'templatelinks', 'tl_from', 'page(page_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'user_groups', 'ug_user', 'mwuser(user_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'user_newtalk', 'user_id', 'mwuser(user_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'user_properties', 'up_user',
+				'mwuser(user_id) ON DELETE CASCADE' ),
+			array( 'changeFkeyDeferrable', 'watchlist', 'wl_user', 'mwuser(user_id) ON DELETE CASCADE' ),
 
 			# r81574
 			array( 'addInterwikiType' ),
@@ -365,25 +415,25 @@ class PostgresUpdater extends DatabaseUpdater {
 		# Add missing extension fields
 		foreach ( $wgExtPGNewFields as $fieldRecord ) {
 			$updates[] = array(
-					'addPgField', $fieldRecord[0], $fieldRecord[1],
-					$fieldRecord[2]
-				);
+				'addPgField', $fieldRecord[0], $fieldRecord[1],
+				$fieldRecord[2]
+			);
 		}
 
 		# Change altered columns
 		foreach ( $wgExtPGAlteredFields as $fieldRecord ) {
 			$updates[] = array(
-					'changeField', $fieldRecord[0], $fieldRecord[1],
-					$fieldRecord[2]
-				);
+				'changeField', $fieldRecord[0], $fieldRecord[1],
+				$fieldRecord[2]
+			);
 		}
 
 		# Add missing extension indexes
 		foreach ( $wgExtNewIndexes as $fieldRecord ) {
 			$updates[] = array(
-					'addPgExtIndex', $fieldRecord[0], $fieldRecord[1],
-					$fieldRecord[2]
-				);
+				'addPgExtIndex', $fieldRecord[0], $fieldRecord[1],
+				$fieldRecord[2]
+			);
 		}
 
 		return $updates;
@@ -397,8 +447,8 @@ SELECT attname, attnum FROM pg_namespace, pg_class, pg_attribute
 	  AND relname=%s AND nspname=%s
 END;
 		$res = $this->db->query( sprintf( $q,
-				$this->db->addQuotes( $table ),
-				$this->db->addQuotes( $this->db->getCoreSchema() ) ) );
+			$this->db->addQuotes( $table ),
+			$this->db->addQuotes( $this->db->getCoreSchema() ) ) );
 		if ( !$res ) {
 			return null;
 		}
@@ -406,10 +456,11 @@ END;
 		$cols = array();
 		foreach ( $res as $r ) {
 			$cols[] = array(
-					"name" => $r[0],
-					"ord" => $r[1],
-				);
+				"name" => $r[0],
+				"ord" => $r[1],
+			);
 		}
+
 		return $cols;
 	}
 
@@ -479,11 +530,12 @@ END;
 		if ( !( $row = $this->db->fetchRow( $r ) ) ) {
 			return null;
 		}
+
 		return $row[0];
 	}
 
 	function ruleDef( $table, $rule ) {
-	$q = <<<END
+		$q = <<<END
 SELECT definition FROM pg_rules
 	WHERE schemaname = %s
 	  AND tablename = %s
@@ -502,6 +554,7 @@ END;
 			return null;
 		}
 		$d = $row[0];
+
 		return $d;
 	}
 
@@ -509,7 +562,7 @@ END;
 		if ( !$this->db->sequenceExists( $ns ) ) {
 			$this->output( "Creating sequence $ns\n" );
 			$this->db->query( "CREATE SEQUENCE $ns" );
-			if( $pkey !== false ) {
+			if ( $pkey !== false ) {
 				$this->setDefault( $table, $pkey, '"nextval"(\'"' . $ns . '"\'::"regclass")' );
 			}
 		}
@@ -518,6 +571,7 @@ END;
 	protected function renameSequence( $old, $new ) {
 		if ( $this->db->sequenceExists( $new ) ) {
 			$this->output( "...sequence $new already exists.\n" );
+
 			return;
 		}
 		if ( $this->db->sequenceExists( $old ) ) {
@@ -532,7 +586,7 @@ END;
 			$old = $this->db->realTableName( $old, "quoted" );
 			$new = $this->db->realTableName( $new, "quoted" );
 			$this->db->query( "ALTER TABLE $old RENAME TO $new" );
-			if( $patch !== false ) {
+			if ( $patch !== false ) {
 				$this->applyPatch( $patch );
 			}
 		}
@@ -544,6 +598,7 @@ END;
 		// First requirement: the table must exist
 		if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
 			$this->output( "...skipping: '$table' table doesn't exist yet.\n" );
+
 			return;
 		}
 
@@ -551,17 +606,20 @@ END;
 		if ( $this->db->indexExists( $table, $new, __METHOD__ ) ) {
 			$this->output( "...index $new already set on $table table.\n" );
 			if ( !$skipBothIndexExistWarning
-				&& $this->db->indexExists( $table, $old, __METHOD__ ) )
-			{
-				$this->output( "...WARNING: $old still exists, despite it has been renamed into $new (which also exists).\n" .
+				&& $this->db->indexExists( $table, $old, __METHOD__ )
+			) {
+				$this->output( "...WARNING: $old still exists, despite it has been " .
+					"renamed into $new (which also exists).\n" .
 					"            $old should be manually removed if not needed anymore.\n" );
 			}
+
 			return;
 		}
 
 		// Third requirement: the old index must exist
 		if ( !$this->db->indexExists( $table, $old, __METHOD__ ) ) {
 			$this->output( "...skipping: index $old doesn't exist.\n" );
+
 			return;
 		}
 
@@ -572,6 +630,7 @@ END;
 		$fi = $this->db->fieldInfo( $table, $field );
 		if ( !is_null( $fi ) ) {
 			$this->output( "...column '$table.$field' already exists\n" );
+
 			return;
 		} else {
 			$this->output( "Adding column '$table.$field'\n" );
@@ -586,9 +645,9 @@ END;
 			exit( 1 );
 		}
 
-		if ( $fi->type() === $newtype )
+		if ( $fi->type() === $newtype ) {
 			$this->output( "...column '$table.$field' is already of type '$newtype'\n" );
-		else {
+		} else {
 			$this->output( "Changing column type of '$table.$field' from '{$fi->type()}' to '$newtype'\n" );
 			$sql = "ALTER TABLE $table ALTER $field TYPE $newtype";
 			if ( strlen( $default ) ) {
@@ -613,7 +672,7 @@ END;
 		}
 	}
 
-	protected function changeNullableField( $table, $field, $null) {
+	protected function changeNullableField( $table, $field, $null ) {
 		$fi = $this->db->fieldInfo( $table, $field );
 		if ( is_null( $fi ) ) {
 			$this->output( "...ERROR: expected column $table.$field to exist\n" );
@@ -632,8 +691,7 @@ END;
 			if ( 'NULL' === $null ) {
 				$this->output( "Changing '$table.$field' to allow NULLs\n" );
 				$this->db->query( "ALTER TABLE $table ALTER $field DROP NOT NULL" );
-			}
-			else {
+			} else {
 				$this->output( "...column '$table.$field' is already set as NOT NULL\n" );
 			}
 		}
@@ -664,7 +722,9 @@ END;
 	protected function changeFkeyDeferrable( $table, $field, $clause ) {
 		$fi = $this->db->fieldInfo( $table, $field );
 		if ( is_null( $fi ) ) {
-			$this->output( "WARNING! Column '$table.$field' does not exist but it should! Please report this.\n" );
+			$this->output( "WARNING! Column '$table.$field' does not exist but it should! " .
+				"Please report this.\n" );
+
 			return;
 		}
 		if ( $fi->is_deferred() && $fi->is_deferrable() ) {
@@ -677,10 +737,13 @@ END;
 			$command = "ALTER TABLE $table DROP CONSTRAINT $conname";
 			$this->db->query( $command );
 		} else {
-			$this->output( "Column '$table.$field' does not have a foreign key constraint, will be added\n" );
+			$this->output( "Column '$table.$field' does not have a foreign key " .
+				"constraint, will be added\n" );
 			$conclause = "";
 		}
-		$command = "ALTER TABLE $table ADD $conclause FOREIGN KEY ($field) REFERENCES $clause DEFERRABLE INITIALLY DEFERRED";
+		$command =
+			"ALTER TABLE $table ADD $conclause " .
+			"FOREIGN KEY ($field) REFERENCES $clause DEFERRABLE INITIALLY DEFERRED";
 		$this->db->query( $command );
 	}
 
@@ -694,7 +757,11 @@ END;
 				$this->output( "Dropping rule 'archive_delete'\n" );
 				$this->db->query( 'DROP RULE archive_delete ON archive' );
 			}
-			$this->applyPatch( 'patch-remove-archive2.sql', false, "Converting 'archive2' back to normal archive table" );
+			$this->applyPatch(
+				'patch-remove-archive2.sql',
+				false,
+				"Converting 'archive2' back to normal archive table"
+			);
 		} else {
 			$this->output( "...obsolete table 'archive2' does not exist\n" );
 		}
@@ -704,7 +771,8 @@ END;
 		if ( $this->db->fieldInfo( 'oldimage', 'oi_deleted' )->type() !== 'smallint' ) {
 			$this->output( "Changing 'oldimage.oi_deleted' to type 'smallint'\n" );
 			$this->db->query( "ALTER TABLE oldimage ALTER oi_deleted DROP DEFAULT" );
-			$this->db->query( "ALTER TABLE oldimage ALTER oi_deleted TYPE SMALLINT USING (oi_deleted::smallint)" );
+			$this->db->query(
+				"ALTER TABLE oldimage ALTER oi_deleted TYPE SMALLINT USING (oi_deleted::smallint)" );
 			$this->db->query( "ALTER TABLE oldimage ALTER oi_deleted SET DEFAULT 0" );
 		} else {
 			$this->output( "...column 'oldimage.oi_deleted' is already of type 'smallint'\n" );
@@ -713,23 +781,32 @@ END;
 
 	protected function checkOiNameConstraint() {
 		if ( $this->db->hasConstraint( "oldimage_oi_name_fkey_cascaded" ) ) {
-			$this->output( "...table 'oldimage' has correct cascading delete/update foreign key to image\n" );
+			$this->output( "...table 'oldimage' has correct cascading delete/update " .
+				"foreign key to image\n" );
 		} else {
 			if ( $this->db->hasConstraint( "oldimage_oi_name_fkey" ) ) {
-				$this->db->query( "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey" );
+				$this->db->query(
+					"ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey" );
 			}
 			if ( $this->db->hasConstraint( "oldimage_oi_name_fkey_cascade" ) ) {
-				$this->db->query( "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey_cascade" );
+				$this->db->query(
+					"ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey_cascade" );
 			}
 			$this->output( "Making foreign key on table 'oldimage' (to image) a cascade delete/update\n" );
-			$this->db->query( "ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascaded " .
-				"FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE ON UPDATE CASCADE" );
+			$this->db->query(
+				"ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascaded " .
+				"FOREIGN KEY (oi_name) REFERENCES image(img_name) " .
+				"ON DELETE CASCADE ON UPDATE CASCADE" );
 		}
 	}
 
 	protected function checkPageDeletedTrigger() {
 		if ( !$this->db->triggerExists( 'page', 'page_deleted' ) ) {
-			$this->applyPatch( 'patch-page_deleted.sql', false, "Adding function and trigger 'page_deleted' to table 'page'" );
+			$this->applyPatch(
+				'patch-page_deleted.sql',
+				false,
+				"Adding function and trigger 'page_deleted' to table 'page'"
+			);
 		} else {
 			$this->output( "...table 'page' has 'page_deleted' trigger\n" );
 		}
@@ -738,7 +815,7 @@ END;
 	protected function dropIndex( $table, $index, $patch = '', $fullpath = false ) {
 		if ( $this->db->indexExists( $table, $index ) ) {
 			$this->output( "Dropping obsolete index '$index'\n" );
-			$this->db->query( "DROP INDEX \"". $index ."\"" );
+			$this->db->query( "DROP INDEX \"" . $index . "\"" );
 		}
 	}
 
@@ -746,7 +823,7 @@ END;
 		$pu = $this->db->indexAttributes( $index );
 		if ( !empty( $pu ) && $pu != $should_be ) {
 			$this->output( "Dropping obsolete version of index '$index'\n" );
-			$this->db->query( "DROP INDEX \"". $index ."\"" );
+			$this->db->query( "DROP INDEX \"" . $index . "\"" );
 			$pu = array();
 		} else {
 			$this->output( "...no need to drop index '$index'\n" );
@@ -764,13 +841,21 @@ END;
 		if ( $this->fkeyDeltype( 'revision_rev_user_fkey' ) == 'r' ) {
 			$this->output( "...constraint 'revision_rev_user_fkey' is ON DELETE RESTRICT\n" );
 		} else {
-			$this->applyPatch( 'patch-revision_rev_user_fkey.sql', false, "Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT" );
+			$this->applyPatch(
+				'patch-revision_rev_user_fkey.sql',
+				false,
+				"Changing constraint 'revision_rev_user_fkey' to ON DELETE RESTRICT"
+			);
 		}
 	}
 
 	protected function checkIwlPrefix() {
 		if ( $this->db->indexExists( 'iwlinks', 'iwl_prefix' ) ) {
-			$this->applyPatch( 'patch-rename-iwl_prefix.sql', false, "Replacing index 'iwl_prefix' with 'iwl_prefix_from_title'" );
+			$this->applyPatch(
+				'patch-rename-iwl_prefix.sql',
+				false,
+				"Replacing index 'iwl_prefix' with 'iwl_prefix_title_from'"
+			);
 		}
 	}
 
diff --git a/includes/installer/SqliteInstaller.php b/includes/installer/SqliteInstaller.php
index 68df6ab2..19218c60 100644
--- a/includes/installer/SqliteInstaller.php
+++ b/includes/installer/SqliteInstaller.php
@@ -60,9 +60,10 @@ class SqliteInstaller extends DatabaseInstaller {
 			$result->fatal( 'config-outdated-sqlite', $db->getServerVersion(), self::MINIMUM_VERSION );
 		}
 		// Check for FTS3 full-text search module
-		if( DatabaseSqlite::getFulltextSearchModule() != 'FTS3' ) {
+		if ( DatabaseSqlite::getFulltextSearchModule() != 'FTS3' ) {
 			$result->warning( 'config-no-fts3' );
 		}
+
 		return $result;
 	}
 
@@ -73,6 +74,7 @@ class SqliteInstaller extends DatabaseInstaller {
 				DIRECTORY_SEPARATOR,
 				dirname( $_SERVER['DOCUMENT_ROOT'] ) . '/data'
 			);
+
 			return array( 'wgSQLiteDataDir' => $path );
 		} else {
 			return array();
@@ -80,8 +82,17 @@ class SqliteInstaller extends DatabaseInstaller {
 	}
 
 	public function getConnectForm() {
-		return $this->getTextBox( 'wgSQLiteDataDir', 'config-sqlite-dir', array(), $this->parent->getHelpBox( 'config-sqlite-dir-help' ) ) .
-			$this->getTextBox( 'wgDBname', 'config-db-name', array(), $this->parent->getHelpBox( 'config-sqlite-name-help' ) );
+		return $this->getTextBox(
+			'wgSQLiteDataDir',
+			'config-sqlite-dir', array(),
+			$this->parent->getHelpBox( 'config-sqlite-dir-help' )
+		) .
+		$this->getTextBox(
+			'wgDBname',
+			'config-db-name',
+			array(),
+			$this->parent->getHelpBox( 'config-sqlite-name-help' )
+		);
 	}
 
 	/**
@@ -96,6 +107,7 @@ class SqliteInstaller extends DatabaseInstaller {
 		if ( !$result ) {
 			return $path;
 		}
+
 		return $result;
 	}
 
@@ -115,6 +127,7 @@ class SqliteInstaller extends DatabaseInstaller {
 		}
 		# Table prefix is not used on SQLite, keep it empty
 		$this->setVar( 'wgDBprefix', '' );
+
 		return $result;
 	}
 
@@ -128,9 +141,16 @@ class SqliteInstaller extends DatabaseInstaller {
 			if ( !is_writable( dirname( $dir ) ) ) {
 				$webserverGroup = Installer::maybeGetWebserverPrimaryGroup();
 				if ( $webserverGroup !== null ) {
-					return Status::newFatal( 'config-sqlite-parent-unwritable-group', $dir, dirname( $dir ), basename( $dir ), $webserverGroup );
+					return Status::newFatal(
+						'config-sqlite-parent-unwritable-group',
+						$dir, dirname( $dir ), basename( $dir ),
+						$webserverGroup
+					);
 				} else {
-					return Status::newFatal( 'config-sqlite-parent-unwritable-nogroup', $dir, dirname( $dir ), basename( $dir ) );
+					return Status::newFatal(
+						'config-sqlite-parent-unwritable-nogroup',
+						$dir, dirname( $dir ), basename( $dir )
+					);
 				}
 			}
 
@@ -173,6 +193,7 @@ class SqliteInstaller extends DatabaseInstaller {
 		} catch ( DBConnectionError $e ) {
 			$status->fatal( 'config-sqlite-connection-error', $e->getMessage() );
 		}
+
 		return $status;
 	}
 
@@ -220,6 +241,7 @@ class SqliteInstaller extends DatabaseInstaller {
 		$this->setVar( 'wgDBuser', '' );
 		$this->setVar( 'wgDBpassword', '' );
 		$this->setupSchemaVars();
+
 		return $this->getConnection();
 	}
 
@@ -228,6 +250,7 @@ class SqliteInstaller extends DatabaseInstaller {
 	 */
 	public function createTables() {
 		$status = parent::createTables();
+
 		return $this->setupSearchIndex( $status );
 	}
 
@@ -246,6 +269,7 @@ class SqliteInstaller extends DatabaseInstaller {
 		} elseif ( !$fts3tTable && $module == 'FTS3' ) {
 			$this->db->sourceFile( "$IP/maintenance/sqlite/archives/searchindex-fts3.sql" );
 		}
+
 		return $status;
 	}
 
@@ -254,8 +278,8 @@ class SqliteInstaller extends DatabaseInstaller {
 	 */
 	public function getLocalSettings() {
 		$dir = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgSQLiteDataDir' ) );
-		return
-"# SQLite-specific settings
+
+		return "# SQLite-specific settings
 \$wgSQLiteDataDir = \"{$dir}\";";
 	}
 }
diff --git a/includes/installer/SqliteUpdater.php b/includes/installer/SqliteUpdater.php
index 2064842a..78ca5110 100644
--- a/includes/installer/SqliteUpdater.php
+++ b/includes/installer/SqliteUpdater.php
@@ -31,95 +31,100 @@ class SqliteUpdater extends DatabaseUpdater {
 
 	protected function getCoreUpdateList() {
 		return array(
-			array( 'disableContentHandlerUseDB' ),
-
 			// 1.14
-			array( 'addField', 'site_stats',    'ss_active_users',  'patch-ss_active_users.sql' ),
+			array( 'addField', 'site_stats', 'ss_active_users', 'patch-ss_active_users.sql' ),
 			array( 'doActiveUsersInit' ),
-			array( 'addField', 'ipblocks',      'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
+			array( 'addField', 'ipblocks', 'ipb_allow_usertalk', 'patch-ipb_allow_usertalk.sql' ),
 			array( 'sqliteInitialIndexes' ),
 
 			// 1.15
-			array( 'addTable', 'change_tag',                        'patch-change_tag.sql' ),
-			array( 'addTable', 'tag_summary',                       'patch-change_tag.sql' ),
-			array( 'addTable', 'valid_tag',                         'patch-change_tag.sql' ),
+			array( 'addTable', 'change_tag', 'patch-change_tag.sql' ),
+			array( 'addTable', 'tag_summary', 'patch-tag_summary.sql' ),
+			array( 'addTable', 'valid_tag', 'patch-valid_tag.sql' ),
 
 			// 1.16
-			array( 'addTable', 'user_properties',                   'patch-user_properties.sql' ),
-			array( 'addTable', 'log_search',                        'patch-log_search.sql' ),
-			array( 'addField', 'logging',       'log_user_text',    'patch-log_user_text.sql' ),
-			array( 'doLogUsertextPopulation' ), # listed separately from the previous update because 1.16 was released without this update
+			array( 'addTable', 'user_properties', 'patch-user_properties.sql' ),
+			array( 'addTable', 'log_search', 'patch-log_search.sql' ),
+			array( 'addField', 'logging', 'log_user_text', 'patch-log_user_text.sql' ),
+			# listed separately from the previous update because 1.16 was released without this update
+			array( 'doLogUsertextPopulation' ),
 			array( 'doLogSearchPopulation' ),
-			array( 'addTable', 'l10n_cache',                        'patch-l10n_cache.sql' ),
-			array( 'addTable', 'external_user',                     'patch-external_user.sql' ),
-			array( 'addIndex', 'log_search',    'ls_field_val',     'patch-log_search-rename-index.sql' ),
-			array( 'addIndex', 'change_tag',    'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
-			array( 'addField', 'redirect',      'rd_interwiki',     'patch-rd_interwiki.sql' ),
+			array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ),
+			array( 'addIndex', 'log_search', 'ls_field_val', 'patch-log_search-rename-index.sql' ),
+			array( 'addIndex', 'change_tag', 'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
+			array( 'addField', 'redirect', 'rd_interwiki', 'patch-rd_interwiki.sql' ),
 			array( 'doUpdateTranscacheField' ),
 			array( 'sqliteSetupSearchindex' ),
 
 			// 1.17
-			array( 'addTable', 'iwlinks',                           'patch-iwlinks.sql' ),
-			array( 'addIndex', 'iwlinks',   'iwl_prefix_title_from', 'patch-rename-iwl_prefix.sql' ),
-			array( 'addField', 'updatelog', 'ul_value',             'patch-ul_value.sql' ),
-			array( 'addField', 'interwiki',     'iw_api',           'patch-iw_api_and_wikiid.sql' ),
-			array( 'dropIndex', 'iwlinks', 'iwl_prefix',            'patch-kill-iwl_prefix.sql' ),
-			array( 'dropIndex', 'iwlinks', 'iwl_prefix_from_title', 'patch-kill-iwl_pft.sql' ),
-			array( 'addField', 'categorylinks', 'cl_collation',     'patch-categorylinks-better-collation.sql' ),
+			array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ),
+			array( 'addIndex', 'iwlinks', 'iwl_prefix_title_from', 'patch-rename-iwl_prefix.sql' ),
+			array( 'addField', 'updatelog', 'ul_value', 'patch-ul_value.sql' ),
+			array( 'addField', 'interwiki', 'iw_api', 'patch-iw_api_and_wikiid.sql' ),
+			array( 'dropIndex', 'iwlinks', 'iwl_prefix', 'patch-kill-iwl_prefix.sql' ),
+			array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ),
 			array( 'doCollationUpdate' ),
-			array( 'addTable', 'msg_resource',                      'patch-msg_resource.sql' ),
-			array( 'addTable', 'module_deps',                       'patch-module_deps.sql' ),
-			array( 'dropIndex', 'archive', 'ar_page_revid',         'patch-archive_kill_ar_page_revid.sql' ),
-			array( 'addIndex', 'archive', 'ar_revid',               'patch-archive_ar_revid.sql' ),
+			array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
+			array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
+			array( 'dropIndex', 'archive', 'ar_page_revid', 'patch-archive_kill_ar_page_revid.sql' ),
+			array( 'addIndex', 'archive', 'ar_revid', 'patch-archive_ar_revid.sql' ),
 
 			// 1.18
-			array( 'addIndex', 'user',          'user_email',       'patch-user_email_index.sql' ),
-			array( 'addTable', 'uploadstash',                       'patch-uploadstash.sql' ),
-			array( 'addTable', 'user_former_groups',                'patch-user_former_groups.sql'),
+			array( 'addIndex', 'user', 'user_email', 'patch-user_email_index.sql' ),
+			array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
+			array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ),
 
 			// 1.19
-			array( 'addIndex', 'logging',       'type_action',      'patch-logging-type-action-index.sql'),
+			array( 'addIndex', 'logging', 'type_action', 'patch-logging-type-action-index.sql' ),
 			array( 'doMigrateUserOptions' ),
-			array( 'dropField', 'user',         'user_options', 'patch-drop-user_options.sql' ),
-			array( 'addField', 'revision',      'rev_sha1',         'patch-rev_sha1.sql' ),
-			array( 'addField', 'archive',       'ar_sha1',          'patch-ar_sha1.sql' ),
-			array( 'addIndex', 'page', 'page_redirect_namespace_len', 'patch-page_redirect_namespace_len.sql' ),
-			array( 'addField',	'uploadstash',	'us_chunk_inx',		'patch-uploadstash_chunk.sql' ),
-			array( 'addfield', 'job',           'job_timestamp',    'patch-jobs-add-timestamp.sql' ),
+			array( 'dropField', 'user', 'user_options', 'patch-drop-user_options.sql' ),
+			array( 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1.sql' ),
+			array( 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1.sql' ),
+			array( 'addIndex', 'page', 'page_redirect_namespace_len',
+				'patch-page_redirect_namespace_len.sql' ),
+			array( 'addField', 'uploadstash', 'us_chunk_inx', 'patch-uploadstash_chunk.sql' ),
+			array( 'addfield', 'job', 'job_timestamp', 'patch-jobs-add-timestamp.sql' ),
 
 			// 1.20
 			array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
 			array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
 			array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
-			array( 'dropField', 'category',     'cat_hidden',       'patch-cat_hidden.sql' ),
+			array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ),
 
 			// 1.21
 			array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ),
-			array( 'addField', 'revision', 'rev_content_model',  'patch-revision-rev_content_model.sql' ),
-			array( 'addField', 'archive',  'ar_content_format',  'patch-archive-ar_content_format.sql' ),
-			array( 'addField', 'archive',  'ar_content_model',   'patch-archive-ar_content_model.sql' ),
-			array( 'addField', 'page',     'page_content_model', 'patch-page-page_content_model.sql' ),
-			array( 'enableContentHandlerUseDB' ),
-
-			array( 'dropField', 'site_stats',    'ss_admins',         'patch-drop-ss_admins.sql' ),
+			array( 'addField', 'revision', 'rev_content_model', 'patch-revision-rev_content_model.sql' ),
+			array( 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ),
+			array( 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ),
+			array( 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ),
+			array( 'dropField', 'site_stats', 'ss_admins', 'patch-drop-ss_admins.sql' ),
 			array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
-			array( 'addTable', 'sites',                            'patch-sites.sql' ),
-			array( 'addField', 'filearchive',   'fa_sha1',          'patch-fa_sha1.sql' ),
-			array( 'addField', 'job',           'job_token',         'patch-job_token.sql' ),
-			array( 'addField', 'job',           'job_attempts',      'patch-job_attempts.sql' ),
+			array( 'addTable', 'sites', 'patch-sites.sql' ),
+			array( 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ),
+			array( 'addField', 'job', 'job_token', 'patch-job_token.sql' ),
+			array( 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ),
 			array( 'doEnableProfiling' ),
-			array( 'addField', 'uploadstash',      'us_props',      'patch-uploadstash-us_props.sql' ),
+			array( 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ),
 			array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
-			array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
-			array( 'addIndex', 'page_props', 'pp_propname_page',  'patch-page_props-propname-page-index.sql' ),
+			array( 'modifyField', 'user_former_groups', 'ufg_group',
+				'patch-ufg_group-length-increase-255.sql' ),
+			array( 'addIndex', 'page_props', 'pp_propname_page',
+				'patch-page_props-propname-page-index.sql' ),
 			array( 'addIndex', 'image', 'img_media_mime', 'patch-img_media_mime-index.sql' ),
+			array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title', 'patch-iwlinks-from-title-index.sql' ),
+			array( 'addField', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ),
+			array( 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.sql' ),
 		);
 	}
 
 	protected function sqliteInitialIndexes() {
-		// initial-indexes.sql fails if the indexes are already present, so we perform a quick check if our database is newer.
-		if ( $this->updateRowExists( 'initial_indexes' ) || $this->db->indexExists( 'user', 'user_name', __METHOD__ ) ) {
+		// initial-indexes.sql fails if the indexes are already present,
+		// so we perform a quick check if our database is newer.
+		if ( $this->updateRowExists( 'initial_indexes' ) ||
+			$this->db->indexExists( 'user', 'user_name', __METHOD__ )
+		) {
 			$this->output( "...have initial indexes\n" );
+
 			return;
 		}
 		$this->applyPatch( 'initial-indexes.sql', false, "Adding initial indexes" );
@@ -129,7 +134,11 @@ class SqliteUpdater extends DatabaseUpdater {
 		$module = DatabaseSqlite::getFulltextSearchModule();
 		$fts3tTable = $this->updateRowExists( 'fts3' );
 		if ( $fts3tTable && !$module ) {
-			$this->applyPatch( 'searchindex-no-fts.sql', false, 'PHP is missing FTS3 support, downgrading tables' );
+			$this->applyPatch(
+				'searchindex-no-fts.sql',
+				false,
+				'PHP is missing FTS3 support, downgrading tables'
+			);
 		} elseif ( !$fts3tTable && $module == 'FTS3' ) {
 			$this->applyPatch( 'searchindex-fts3.sql', false, "Adding FTS3 search capabilities" );
 		} else {
@@ -139,7 +148,7 @@ class SqliteUpdater extends DatabaseUpdater {
 
 	protected function doEnableProfiling() {
 		global $wgProfileToDatabase;
-		if ( $wgProfileToDatabase === true && ! $this->db->tableExists( 'profiling', __METHOD__ ) ) {
+		if ( $wgProfileToDatabase === true && !$this->db->tableExists( 'profiling', __METHOD__ ) ) {
 			$this->applyPatch( 'patch-profiling.sql', false, 'Add profiling table' );
 		}
 	}
diff --git a/includes/installer/WebInstaller.php b/includes/installer/WebInstaller.php
index 35d649b2..95765259 100644
--- a/includes/installer/WebInstaller.php
+++ b/includes/installer/WebInstaller.php
@@ -154,9 +154,9 @@ class WebInstaller extends Installer {
 		$this->exportVars();
 		$this->setupLanguage();
 
-		if( ( $this->getVar( '_InstallDone' ) || $this->getVar( '_UpgradeDone' ) )
-			&& $this->request->getVal( 'localsettings' ) )
-		{
+		if ( ( $this->getVar( '_InstallDone' ) || $this->getVar( '_UpgradeDone' ) )
+			&& $this->request->getVal( 'localsettings' )
+		) {
 			$this->request->response()->header( 'Content-type: application/x-httpd-php' );
 			$this->request->response()->header(
 				'Content-Disposition: attachment; filename="LocalSettings.php"'
@@ -164,18 +164,20 @@ class WebInstaller extends Installer {
 
 			$ls = InstallerOverrides::getLocalSettingsGenerator( $this );
 			$rightsProfile = $this->rightsProfiles[$this->getVar( '_RightsProfile' )];
-			foreach( $rightsProfile as $group => $rightsArr ) {
+			foreach ( $rightsProfile as $group => $rightsArr ) {
 				$ls->setGroupRights( $group, $rightsArr );
 			}
 			echo $ls->getText();
+
 			return $this->session;
 		}
 
 		$cssDir = $this->request->getVal( 'css' );
-		if( $cssDir ) {
+		if ( $cssDir ) {
 			$cssDir = ( $cssDir == 'rtl' ? 'rtl' : 'ltr' );
 			$this->request->response()->header( 'Content-type: text/css' );
 			echo $this->output->getCSS( $cssDir );
+
 			return $this->session;
 		}
 
@@ -199,6 +201,7 @@ class WebInstaller extends Installer {
 			$this->output->useShortHeader();
 			$this->output->allowFrames();
 			$page->submitCC();
+
 			return $this->finish();
 		}
 
@@ -207,6 +210,7 @@ class WebInstaller extends Installer {
 			$this->output->useShortHeader();
 			$this->output->allowFrames();
 			$this->output->addHTML( $page->getCCDoneBox() );
+
 			return $this->finish();
 		}
 
@@ -250,12 +254,13 @@ class WebInstaller extends Installer {
 				do {
 					$nextPageId--;
 					$nextPage = $this->pageSequence[$nextPageId];
-				} while( isset( $this->skippedPages[$nextPage] ) );
+				} while ( isset( $this->skippedPages[$nextPage] ) );
 			} else {
 				$nextPage = $this->pageSequence[$lowestUnhappy];
 			}
 
 			$this->output->redirect( $this->getUrl( array( 'page' => $nextPage ) ) );
+
 			return $this->finish();
 		}
 
@@ -263,7 +268,7 @@ class WebInstaller extends Installer {
 		$this->currentPageName = $page->getName();
 		$this->startPageWrapper( $pageName );
 
-		if( $page->isSlow() ) {
+		if ( $page->isSlow() ) {
 			$this->disableTimeLimit();
 		}
 
@@ -324,7 +329,7 @@ class WebInstaller extends Installer {
 	 * @return bool
 	 */
 	public function startSession() {
-		if( wfIniGetBool( 'session.auto_start' ) || session_id() ) {
+		if ( wfIniGetBool( 'session.auto_start' ) || session_id() ) {
 			// Done already
 			return true;
 		}
@@ -336,6 +341,7 @@ class WebInstaller extends Installer {
 
 		if ( $this->phpErrors ) {
 			$this->showError( 'config-session-error', $this->phpErrors[0] );
+
 			return false;
 		}
 
@@ -353,7 +359,7 @@ class WebInstaller extends Installer {
 	public function getFingerprint() {
 		// Get the base URL of the installation
 		$url = $this->request->getFullRequestURL();
-		if ( preg_match( '!^(.*\?)!', $url, $m) ) {
+		if ( preg_match( '!^(.*\?)!', $url, $m ) ) {
 			// Trim query string
 			$url = $m[1];
 		}
@@ -362,6 +368,7 @@ class WebInstaller extends Installer {
 			// the /mw-config/index.php. Kinda scary though?
 			$url = $m[1];
 		}
+
 		return md5( serialize( array(
 			'local path' => dirname( __DIR__ ),
 			'url' => $url,
@@ -516,7 +523,7 @@ class WebInstaller extends Installer {
 	/**
 	 * Called by execute() before page output starts, to show a page list.
 	 *
-	 * @param $currentPageName String
+	 * @param $currentPageName string
 	 */
 	private function startPageWrapper( $currentPageName ) {
 		$s = "<div class=\"config-page-wrapper\">\n";
@@ -539,7 +546,14 @@ class WebInstaller extends Installer {
 
 		$s .= "</ul><br/><ul>\n";
 		$s .= $this->getPageListItem( 'Restart', true, $currentPageName );
-		$s .= "</ul></div>\n"; // end list pane
+		// End list pane
+		$s .= "</ul></div>\n";
+
+		// Messages:
+		// config-page-language, config-page-welcome, config-page-dbconnect, config-page-upgrade,
+		// config-page-dbsettings, config-page-name, config-page-options, config-page-install,
+		// config-page-complete, config-page-restart, config-page-readme, config-page-releasenotes,
+		// config-page-copying, config-page-upgradedoc, config-page-existingwiki
 		$s .= Html::element( 'h2', array(),
 			wfMessage( 'config-page-' . strtolower( $currentPageName ) )->text() );
 
@@ -549,14 +563,20 @@ class WebInstaller extends Installer {
 	/**
 	 * Get a list item for the page list.
 	 *
-	 * @param $pageName String
-	 * @param $enabled Boolean
-	 * @param $currentPageName String
+	 * @param $pageName string
+	 * @param $enabled boolean
+	 * @param $currentPageName string
 	 *
 	 * @return string
 	 */
 	private function getPageListItem( $pageName, $enabled, $currentPageName ) {
 		$s = "<li class=\"config-page-list-item\">";
+
+		// Messages:
+		// config-page-language, config-page-welcome, config-page-dbconnect, config-page-upgrade,
+		// config-page-dbsettings, config-page-name, config-page-options, config-page-install,
+		// config-page-complete, config-page-restart, config-page-readme, config-page-releasenotes,
+		// config-page-copying, config-page-upgradedoc, config-page-existingwiki
 		$name = wfMessage( 'config-page-' . strtolower( $pageName ) )->text();
 
 		if ( $enabled ) {
@@ -601,9 +621,9 @@ class WebInstaller extends Installer {
 	 */
 	private function endPageWrapper() {
 		$this->output->addHTMLNoFlush(
-					"<div class=\"visualClear\"></div>\n" .
-				"</div>\n" .
-				"<div class=\"visualClear\"></div>\n" .
+			"<div class=\"visualClear\"></div>\n" .
+			"</div>\n" .
+			"<div class=\"visualClear\"></div>\n" .
 			"</div>" );
 	}
 
@@ -640,8 +660,11 @@ class WebInstaller extends Installer {
 	 */
 	public function getInfoBox( $text, $icon = false, $class = false ) {
 		$text = $this->parse( $text, true );
-		$icon = ( $icon == false ) ? '../skins/common/images/info-32.png' : '../skins/common/images/'.$icon;
+		$icon = ( $icon == false ) ?
+			'../skins/common/images/info-32.png' :
+			'../skins/common/images/' . $icon;
 		$alt = wfMessage( 'config-information' )->text();
+
 		return Html::infoBox( $text, $icon, $alt, $class, false );
 	}
 
@@ -686,7 +709,7 @@ class WebInstaller extends Installer {
 		$args = func_get_args();
 		array_shift( $args );
 		$html = '<div class="config-message">' .
-		$this->parse( wfMessage( $msg, $args )->useDatabase( false )->plain() ) .
+			$this->parse( wfMessage( $msg, $args )->useDatabase( false )->plain() ) .
 			"</div>\n";
 		$this->output->addHTML( $html );
 	}
@@ -724,16 +747,16 @@ class WebInstaller extends Installer {
 			$attributes['for'] = $forId;
 		}
 
-		return
-			"<div class=\"config-block\">\n" .
+		return "<div class=\"config-block\">\n" .
 			"  <div class=\"config-block-label\">\n" .
 			Xml::tags( 'label',
 				$attributes,
-				$labelText ) . "\n" .
-				$helpData .
+				$labelText
+			) . "\n" .
+			$helpData .
 			"  </div>\n" .
 			"  <div class=\"config-block-elements\">\n" .
-				$contents .
+			$contents .
 			"  </div>\n" .
 			"</div>\n";
 	}
@@ -743,12 +766,12 @@ class WebInstaller extends Installer {
 	 *
 	 * @param $params Array
 	 *    Parameters are:
-	 *      var:        The variable to be configured (required)
-	 *      label:      The message name for the label (required)
-	 *      attribs:    Additional attributes for the input element (optional)
+	 *      var:         The variable to be configured (required)
+	 *      label:       The message name for the label (required)
+	 *      attribs:     Additional attributes for the input element (optional)
 	 *      controlName: The name for the input element (optional)
-	 *      value:      The current value of the variable (optional)
-	 *      help:		The html for the help text (optional)
+	 *      value:       The current value of the variable (optional)
+	 *      help:        The html for the help text (optional)
 	 *
 	 * @return string
 	 */
@@ -767,22 +790,22 @@ class WebInstaller extends Installer {
 		if ( !isset( $params['help'] ) ) {
 			$params['help'] = "";
 		}
-		return
-			$this->label(
-				$params['label'],
+
+		return $this->label(
+			$params['label'],
+			$params['controlName'],
+			Xml::input(
 				$params['controlName'],
-				Xml::input(
-					$params['controlName'],
-					30, // intended to be overridden by CSS
-					$params['value'],
-					$params['attribs'] + array(
-						'id' => $params['controlName'],
-						'class' => 'config-input-text',
-						'tabindex' => $this->nextTabIndex()
-					)
-				),
-				$params['help']
-			);
+				30, // intended to be overridden by CSS
+				$params['value'],
+				$params['attribs'] + array(
+					'id' => $params['controlName'],
+					'class' => 'config-input-text',
+					'tabindex' => $this->nextTabIndex()
+				)
+			),
+			$params['help']
+		);
 	}
 
 	/**
@@ -790,12 +813,12 @@ class WebInstaller extends Installer {
 	 *
 	 * @param $params Array
 	 *    Parameters are:
-	 *      var:        The variable to be configured (required)
-	 *      label:      The message name for the label (required)
-	 *      attribs:    Additional attributes for the input element (optional)
+	 *      var:         The variable to be configured (required)
+	 *      label:       The message name for the label (required)
+	 *      attribs:     Additional attributes for the input element (optional)
 	 *      controlName: The name for the input element (optional)
-	 *      value:      The current value of the variable (optional)
-	 *      help:		The html for the help text (optional)
+	 *      value:       The current value of the variable (optional)
+	 *      help:        The html for the help text (optional)
 	 *
 	 * @return string
 	 */
@@ -814,23 +837,23 @@ class WebInstaller extends Installer {
 		if ( !isset( $params['help'] ) ) {
 			$params['help'] = "";
 		}
-		return
-			$this->label(
-				$params['label'],
+
+		return $this->label(
+			$params['label'],
+			$params['controlName'],
+			Xml::textarea(
 				$params['controlName'],
-				Xml::textarea(
-					$params['controlName'],
-					$params['value'],
-					30,
-					5,
-					$params['attribs'] + array(
-						'id' => $params['controlName'],
-						'class' => 'config-input-text',
-						'tabindex' => $this->nextTabIndex()
-					)
-				),
-				$params['help']
-			);
+				$params['value'],
+				30,
+				5,
+				$params['attribs'] + array(
+					'id' => $params['controlName'],
+					'class' => 'config-input-text',
+					'tabindex' => $this->nextTabIndex()
+				)
+			),
+			$params['help']
+		);
 	}
 
 	/**
@@ -839,12 +862,12 @@ class WebInstaller extends Installer {
 	 * Implements password hiding
 	 * @param $params Array
 	 *    Parameters are:
-	 *      var:        The variable to be configured (required)
-	 *      label:      The message name for the label (required)
-	 *      attribs:    Additional attributes for the input element (optional)
+	 *      var:         The variable to be configured (required)
+	 *      label:       The message name for the label (required)
+	 *      attribs:     Additional attributes for the input element (optional)
 	 *      controlName: The name for the input element (optional)
-	 *      value:      The current value of the variable (optional)
-	 *      help:		The html for the help text (optional)
+	 *      value:       The current value of the variable (optional)
+	 *      help:        The html for the help text (optional)
 	 *
 	 * @return string
 	 */
@@ -868,12 +891,12 @@ class WebInstaller extends Installer {
 	 *
 	 * @param $params Array
 	 *    Parameters are:
-	 *      var:        The variable to be configured (required)
-	 *      label:      The message name for the label (required)
-	 *      attribs:    Additional attributes for the input element (optional)
+	 *      var:         The variable to be configured (required)
+	 *      label:       The message name for the label (required)
+	 *      attribs:     Additional attributes for the input element (optional)
 	 *      controlName: The name for the input element (optional)
-	 *      value:      The current value of the variable (optional)
-	 *      help:		The html for the help text (optional)
+	 *      value:       The current value of the variable (optional)
+	 *      help:        The html for the help text (optional)
 	 *
 	 * @return string
 	 */
@@ -892,14 +915,15 @@ class WebInstaller extends Installer {
 		if ( !isset( $params['help'] ) ) {
 			$params['help'] = "";
 		}
-		if( isset( $params['rawtext'] ) ) {
+		if ( isset( $params['rawtext'] ) ) {
 			$labelText = $params['rawtext'];
-		} else {
+		} else if ( isset( $params['label'] ) ) {
 			$labelText = $this->parse( wfMessage( $params['label'] )->text() );
+		} else {
+			$labelText = "";
 		}
 
-		return
-			"<div class=\"config-input-check\">\n" .
+		return "<div class=\"config-input-check\">\n" .
 			$params['help'] .
 			"<label>\n" .
 			Xml::check(
@@ -920,15 +944,15 @@ class WebInstaller extends Installer {
 	 *
 	 * @param $params Array
 	 *    Parameters are:
-	 *      var:            The variable to be configured (required)
-	 *      label:          The message name for the label (required)
+	 *      var:             The variable to be configured (required)
+	 *      label:           The message name for the label (required)
 	 *      itemLabelPrefix: The message name prefix for the item labels (required)
-	 *      values:         List of allowed values (required)
-	 *      itemAttribs     Array of attribute arrays, outer key is the value name (optional)
-	 *      commonAttribs   Attribute array applied to all items
-	 *      controlName:    The name for the input element (optional)
-	 *      value:          The current value of the variable (optional)
-	 *      help:		The html for the help text (optional)
+	 *      values:          List of allowed values (required)
+	 *      itemAttribs:     Array of attribute arrays, outer key is the value name (optional)
+	 *      commonAttribs:   Attribute array applied to all items
+	 *      controlName:     The name for the input element (optional)
+	 *      value:           The current value of the variable (optional)
+	 *      help:            The html for the help text (optional)
 	 *
 	 * @return string
 	 */
@@ -987,10 +1011,10 @@ class WebInstaller extends Installer {
 	 * @param $status Status
 	 */
 	public function showStatusBox( $status ) {
-		if( !$status->isGood() ) {
+		if ( !$status->isGood() ) {
 			$text = $status->getWikiText();
 
-			if( $status->isOk() ) {
+			if ( $status->isOk() ) {
 				$box = $this->getWarningBox( $text );
 			} else {
 				$box = $this->getErrorBox( $text );
@@ -1058,6 +1082,7 @@ class WebInstaller extends Installer {
 	 */
 	public function docLink( $linkText, $attribs, $parser ) {
 		$url = $this->getDocUrl( $attribs['href'] );
+
 		return '<a href="' . htmlspecialchars( $url ) . '">' .
 			htmlspecialchars( $linkText ) .
 			'</a>';
@@ -1071,7 +1096,7 @@ class WebInstaller extends Installer {
 	 * @param $parser
 	 * @return String Html for download link
 	 */
-	public function downloadLinkHook( $text, $attribs, $parser  ) {
+	public function downloadLinkHook( $text, $attribs, $parser ) {
 		$img = Html::element( 'img', array(
 			'src' => '../skins/common/images/download-32.png',
 			'width' => '32',
@@ -1080,6 +1105,7 @@ class WebInstaller extends Installer {
 		$anchor = Html::rawElement( 'a',
 			array( 'href' => $this->getURL( array( 'localsettings' => 1 ) ) ),
 			$img . ' ' . wfMessage( 'config-download-localsettings' )->parse() );
+
 		return Html::rawElement( 'div', array( 'class' => 'config-download-link' ), $anchor );
 	}
 
@@ -1101,8 +1127,10 @@ class WebInstaller extends Installer {
 			$this->setVar( 'wgScriptPath', $uri );
 		} else {
 			$this->showError( 'config-no-uri' );
+
 			return false;
 		}
+
 		return parent::envCheckPath();
 	}
 
diff --git a/includes/installer/WebInstallerOutput.php b/includes/installer/WebInstallerOutput.php
index d61d843f..f2dc37fe 100644
--- a/includes/installer/WebInstallerOutput.php
+++ b/includes/installer/WebInstallerOutput.php
@@ -104,49 +104,85 @@ class WebInstallerOutput {
 
 	/**
 	 * Get the raw vector CSS, flipping if needed
+	 *
+	 * @todo Possibly get rid of this function and use ResourceLoader in the manner it was
+	 *   designed to be used in, rather than just grabbing a list of filenames from it,
+	 *   and not properly handling such details as media types in module definitions.
+	 *
 	 * @param string $dir 'ltr' or 'rtl'
 	 * @return String
 	 */
 	public function getCSS( $dir ) {
-		$skinDir = dirname( dirname( __DIR__ ) ) . '/skins';
-
-		// All these files will be concatenated in sequence and loaded
-		// as one file.
-		// The string 'images/' in the files' contents will be replaced
-		// by '../skins/$skinName/images/', where $skinName is what appears
-		// before the last '/' in each of the strings.
-		$cssFileNames = array(
-
-			// Basically the "skins.vector" ResourceLoader module styles
-			'common/shared.css',
-			'common/commonElements.css',
-			'common/commonContent.css',
-			'common/commonInterface.css',
-			'vector/screen.css',
-
-			// mw-config specific
-			'common/config.css',
+		// All CSS files these modules reference will be concatenated in sequence
+		// and loaded as one file.
+		$moduleNames = array(
+			'mediawiki.legacy.shared',
+			'skins.vector',
+			'mediawiki.legacy.config',
 		);
 
+		$prepend = '';
 		$css = '';
 
-		wfSuppressWarnings();
-		foreach ( $cssFileNames as $cssFileName ) {
-			$fullCssFileName = "$skinDir/$cssFileName";
-			$cssFileContents = file_get_contents( $fullCssFileName );
-			if ( $cssFileContents ) {
-				preg_match( "/^(\w+)\//", $cssFileName, $match );
-				$skinName = $match[1];
-				$css .= str_replace( 'images/', "../skins/$skinName/images/", $cssFileContents );
-			} else {
-				$css .= "/** Your webserver cannot read $fullCssFileName. Please check file permissions. */";
+		$cssFileNames = array();
+		$resourceLoader = new ResourceLoader();
+		foreach ( $moduleNames as $moduleName ) {
+			$module = $resourceLoader->getModule( $moduleName );
+			$cssFileNames = $module->getAllStyleFiles();
+
+			wfSuppressWarnings();
+			foreach ( $cssFileNames as $cssFileName ) {
+				if ( !file_exists( $cssFileName ) ) {
+					$prepend .= ResourceLoader::makeComment( "Unable to find $cssFileName." );
+					continue;
+				}
+
+				if ( !is_readable( $cssFileName ) ) {
+					$prepend .= ResourceLoader::makeComment( "Unable to read $cssFileName. Please check file permissions." );
+					continue;
+				}
+
+				try {
+
+					if ( preg_match( '/\.less$/', $cssFileName ) ) {
+						// Run the LESS compiler for *.less files (bug 55589)
+						$compiler = ResourceLoader::getLessCompiler();
+						$cssFileContents = $compiler->compileFile( $cssFileName );
+					} else {
+						// Regular CSS file
+						$cssFileContents = file_get_contents( $cssFileName );
+					}
+
+					if ( $cssFileContents ) {
+						// Rewrite URLs, though don't bother embedding images. While static image
+						// files may be cached, CSS returned by this function is definitely not.
+						$cssDirName = dirname( $cssFileName );
+						$css .= CSSMin::remap(
+							/* source */ $cssFileContents,
+							/* local */ $cssDirName,
+							/* remote */ '..' . str_replace(
+								array( $GLOBALS['IP'], DIRECTORY_SEPARATOR ),
+								array( '', '/' ),
+								$cssDirName
+							),
+							/* embedData */ false
+						);
+					} else {
+						$prepend .= ResourceLoader::makeComment( "Unable to read $cssFileName." );
+					}
+
+				} catch ( Exception $e ) {
+					$prepend .= ResourceLoader::formatException( $e );
+				}
+
+				$css .= "\n";
 			}
-
-			$css .= "\n";
+			wfRestoreWarnings();
 		}
-		wfRestoreWarnings();
 
-		if( $dir == 'rtl' ) {
+		$css = $prepend . $css;
+
+		if ( $dir == 'rtl' ) {
 			$css = CSSJanus::transform( $css, true );
 		}
 
@@ -185,6 +221,7 @@ class WebInstallerOutput {
 	 */
 	public function getDir() {
 		global $wgLang;
+
 		return is_object( $wgLang ) ? $wgLang->getDir() : 'ltr';
 	}
 
@@ -193,6 +230,7 @@ class WebInstallerOutput {
 	 */
 	public function getLanguageCode() {
 		global $wgLang;
+
 		return is_object( $wgLang ) ? $wgLang->getCode() : 'en';
 	}
 
@@ -216,22 +254,23 @@ class WebInstallerOutput {
 
 	public function outputHeader() {
 		$this->headerDone = true;
-		$dbTypes = $this->parent->getDBTypes();
-
 		$this->parent->request->response()->header( 'Content-Type: text/html; charset=utf-8' );
+
 		if ( !$this->allowFrames ) {
 			$this->parent->request->response()->header( 'X-Frame-Options: DENY' );
 		}
+
 		if ( $this->redirectTarget ) {
-			$this->parent->request->response()->header( 'Location: '.$this->redirectTarget );
+			$this->parent->request->response()->header( 'Location: ' . $this->redirectTarget );
+
 			return;
 		}
 
 		if ( $this->useShortHeader ) {
 			$this->outputShortHeader();
+
 			return;
 		}
-
 ?>
 <?php echo Html::htmlHeader( $this->getHeadAttribs() ); ?>
 <head>
@@ -239,7 +278,6 @@ class WebInstallerOutput {
 	<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
 	<title><?php $this->outputTitle(); ?></title>
 	<?php echo $this->getCssUrl() . "\n"; ?>
-	<?php echo Html::inlineScript( "var dbTypes = " . Xml::encodeJsVar( $dbTypes ) ) . "\n"; ?>
 	<?php echo $this->getJQuery() . "\n"; ?>
 	<?php echo Html::linkedScript( '../skins/common/config.js' ) . "\n"; ?>
 </head>
diff --git a/includes/installer/WebInstallerPage.php b/includes/installer/WebInstallerPage.php
index 06d16a5a..7e8a3631 100644
--- a/includes/installer/WebInstallerPage.php
+++ b/includes/installer/WebInstallerPage.php
@@ -74,6 +74,10 @@ abstract class WebInstallerPage {
 		);
 	}
 
+	/**
+	 * @param string|bool $continue
+	 * @param string|bool $back
+	 */
 	public function endForm( $continue = 'continue', $back = 'back' ) {
 		$s = "<div class=\"config-submit\">\n";
 		$id = $this->getId();
@@ -84,25 +88,36 @@ abstract class WebInstallerPage {
 
 		if ( $continue ) {
 			// Fake submit button for enter keypress (bug 26267)
-			$s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
-				array( 'name' => "enter-$continue", 'style' =>
-					'visibility:hidden;overflow:hidden;width:1px;margin:0' ) ) . "\n";
+			// Messages: config-continue, config-restart, config-regenerate
+			$s .= Xml::submitButton(
+				wfMessage( "config-$continue" )->text(),
+				array(
+					'name' => "enter-$continue",
+					'style' => 'visibility:hidden;overflow:hidden;width:1px;margin:0'
+				)
+			) . "\n";
 		}
 
 		if ( $back ) {
-			$s .= Xml::submitButton( wfMessage( "config-$back" )->text(),
+			// Message: config-back
+			$s .= Xml::submitButton(
+				wfMessage( "config-$back" )->text(),
 				array(
 					'name' => "submit-$back",
 					'tabindex' => $this->parent->nextTabIndex()
-				) ) . "\n";
+				)
+			) . "\n";
 		}
 
 		if ( $continue ) {
-			$s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
+			// Messages: config-continue, config-restart, config-regenerate
+			$s .= Xml::submitButton(
+				wfMessage( "config-$continue" )->text(),
 				array(
 					'name' => "submit-$continue",
 					'tabindex' => $this->parent->nextTabIndex(),
-				) ) . "\n";
+				)
+			) . "\n";
 		}
 
 		$s .= "</div></form></div>\n";
@@ -204,6 +219,7 @@ class WebInstaller_Language extends WebInstallerPage {
 				if ( isset( $languages[$contLang] ) ) {
 					$this->setVar( 'wgLanguageCode', $contLang );
 				}
+
 				return 'continue';
 			}
 		} elseif ( $this->parent->showSessionWarning ) {
@@ -251,13 +267,15 @@ class WebInstaller_Language extends WebInstallerPage {
 		$languages = Language::fetchLanguageNames();
 		ksort( $languages );
 		foreach ( $languages as $code => $lang ) {
-			if ( isset( $wgDummyLanguageCodes[$code] ) ) continue;
+			if ( isset( $wgDummyLanguageCodes[$code] ) ) {
+				continue;
+			}
 			$s .= "\n" . Xml::option( "$code - $lang", $code, $code == $selectedCode );
 		}
 		$s .= "\n</select>\n";
+
 		return $this->parent->label( $label, $name, $s );
 	}
-
 }
 
 class WebInstaller_ExistingWiki extends WebInstallerPage {
@@ -271,8 +289,8 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 		// Check if the upgrade key supplied to the user has appeared in LocalSettings.php
 		if ( $vars['wgUpgradeKey'] !== false
 			&& $this->getVar( '_UpgradeKeySupplied' )
-			&& $this->getVar( 'wgUpgradeKey' ) === $vars['wgUpgradeKey'] )
-		{
+			&& $this->getVar( 'wgUpgradeKey' ) === $vars['wgUpgradeKey']
+		) {
 			// It's there, so the user is authorized
 			$status = $this->handleExistingUpgrade( $vars );
 			if ( $status->isOK() ) {
@@ -281,6 +299,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 				$this->startForm();
 				$this->parent->showStatusBox( $status );
 				$this->endForm( 'continue' );
+
 				return 'output';
 			}
 		}
@@ -299,6 +318,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 					$this->getVar( 'wgUpgradeKey' ) . "';</pre>" )->plain()
 			) );
 			$this->endForm( 'continue' );
+
 			return 'output';
 		}
 
@@ -307,9 +327,10 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 		$r = $this->parent->request;
 		if ( $r->wasPosted() ) {
 			$key = $r->getText( 'config_wgUpgradeKey' );
-			if( !$key || $key !== $vars['wgUpgradeKey'] ) {
+			if ( !$key || $key !== $vars['wgUpgradeKey'] ) {
 				$this->parent->showError( 'config-localsettings-badkey' );
 				$this->showKeyForm();
+
 				return 'output';
 			}
 			// Key was OK
@@ -319,10 +340,12 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 			} else {
 				$this->parent->showStatusBox( $status );
 				$this->showKeyForm();
+
 				return 'output';
 			}
 		} else {
 			$this->showKeyForm();
+
 			return 'output';
 		}
 	}
@@ -333,7 +356,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 	protected function showKeyForm() {
 		$this->startForm();
 		$this->addHTML(
-			$this->parent->getInfoBox( wfMessage( 'config-localsettings-upgrade' )->plain() ).
+			$this->parent->getInfoBox( wfMessage( 'config-localsettings-upgrade' )->plain() ) .
 			'<br />' .
 			$this->parent->getTextBox( array(
 				'var' => 'wgUpgradeKey',
@@ -352,6 +375,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 			}
 			$this->setVar( $name, $vars[$name] );
 		}
+
 		return $status;
 	}
 
@@ -363,7 +387,8 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 	protected function handleExistingUpgrade( $vars ) {
 		// Check $wgDBtype
 		if ( !isset( $vars['wgDBtype'] ) ||
-			 !in_array( $vars['wgDBtype'], Installer::getDBTypes() ) ) {
+			!in_array( $vars['wgDBtype'], Installer::getDBTypes() )
+		) {
 			return Status::newFatal( 'config-localsettings-connection-error', '' );
 		}
 
@@ -393,11 +418,13 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 			// Adjust the error message to explain things correctly
 			$status->replaceMessage( 'config-connection-error',
 				'config-localsettings-connection-error' );
+
 			return $status;
 		}
 
 		// All good
 		$this->setVar( '_ExistingDBSettings', true );
+
 		return $status;
 	}
 }
@@ -422,9 +449,9 @@ class WebInstaller_Welcome extends WebInstallerPage {
 		} else {
 			$this->parent->showStatusMessage( $status );
 		}
+
 		return '';
 	}
-
 }
 
 class WebInstaller_DBConnect extends WebInstallerPage {
@@ -440,6 +467,7 @@ class WebInstaller_DBConnect extends WebInstallerPage {
 
 			if ( $status->isGood() ) {
 				$this->setVar( '_UpgradeDone', false );
+
 				return 'continue';
 			} else {
 				$this->parent->showStatusBox( $status );
@@ -452,8 +480,10 @@ class WebInstaller_DBConnect extends WebInstallerPage {
 		$settings = '';
 		$defaultType = $this->getVar( 'wgDBtype' );
 
+		// Messages: config-support-mysql, config-support-postgres, config-support-oracle,
+		// config-support-sqlite
 		$dbSupport = '';
-		foreach( $this->parent->getDBTypes() as $type ) {
+		foreach ( $this->parent->getDBTypes() as $type ) {
 			$link = DatabaseBase::factory( $type )->getSoftwareLink();
 			$dbSupport .= wfMessage( "config-support-$type", $link )->plain() . "\n";
 		}
@@ -481,20 +511,23 @@ class WebInstaller_DBConnect extends WebInstallerPage {
 				) .
 				"</li>\n";
 
-			$settings .=
-				Html::openElement( 'div', array( 'id' => 'DB_wrapper_' . $type,
-						'class' => 'dbWrapper' ) ) .
+			// Messages: config-header-mysql, config-header-postgres, config-header-oracle,
+			// config-header-sqlite
+			$settings .= Html::openElement(
+					'div',
+					array(
+						'id' => 'DB_wrapper_' . $type,
+						'class' => 'dbWrapper'
+					)
+				) .
 				Html::element( 'h3', array(), wfMessage( 'config-header-' . $type )->text() ) .
 				$installer->getConnectForm() .
 				"</div>\n";
 		}
-		$types .= "</ul><br style=\"clear: left\"/>\n";
 
-		$this->addHTML(
-			$this->parent->label( 'config-db-type', false, $types ) .
-			$settings
-		);
+		$types .= "</ul><br style=\"clear: left\"/>\n";
 
+		$this->addHTML( $this->parent->label( 'config-db-type', false, $types ) . $settings );
 		$this->endForm();
 	}
 
@@ -509,9 +542,9 @@ class WebInstaller_DBConnect extends WebInstallerPage {
 		if ( !$installer ) {
 			return Status::newFatal( 'config-invalid-db-type' );
 		}
+
 		return $installer->submitConnectForm();
 	}
-
 }
 
 class WebInstaller_Upgrade extends WebInstallerPage {
@@ -532,6 +565,7 @@ class WebInstaller_Upgrade extends WebInstallerPage {
 				// Show the done message again
 				// Make them click back again if they want to do the upgrade again
 				$this->showDoneMessage();
+
 				return 'output';
 			}
 		}
@@ -555,11 +589,12 @@ class WebInstaller_Upgrade extends WebInstallerPage {
 			if ( $result ) {
 				// If they're going to possibly regenerate LocalSettings, we
 				// need to create the upgrade/secret keys. Bug 26481
-				if( !$this->getVar( '_ExistingDBSettings' ) ) {
+				if ( !$this->getVar( '_ExistingDBSettings' ) ) {
 					$this->parent->generateKeys();
 				}
 				$this->setVar( '_UpgradeDone', true );
 				$this->showDoneMessage();
+
 				return 'output';
 			}
 		}
@@ -583,15 +618,14 @@ class WebInstaller_Upgrade extends WebInstallerPage {
 			$this->parent->getInfoBox(
 				wfMessage( $msg,
 					$this->getVar( 'wgServer' ) .
-						$this->getVar( 'wgScriptPath' ) . '/index' .
-						$this->getVar( 'wgScriptExtension' )
+					$this->getVar( 'wgScriptPath' ) . '/index' .
+					$this->getVar( 'wgScriptExtension' )
 				)->plain(), 'tick-32.png'
 			)
 		);
 		$this->parent->restoreLinkPopups();
 		$this->endForm( $regenerate ? 'regenerate' : false, false );
 	}
-
 }
 
 class WebInstaller_DBSettings extends WebInstallerPage {
@@ -620,7 +654,6 @@ class WebInstaller_DBSettings extends WebInstallerPage {
 		$this->addHTML( $form );
 		$this->endForm();
 	}
-
 }
 
 class WebInstaller_Name extends WebInstallerPage {
@@ -657,6 +690,9 @@ class WebInstaller_Name extends WebInstallerPage {
 				'label' => 'config-site-name',
 				'help' => $this->parent->getHelpBox( 'config-site-name-help' )
 			) ) .
+			// getRadioSet() builds a set of labeled radio buttons.
+			// For grep: The following messages are used as the item labels:
+			// config-ns-site-name, config-ns-generic, config-ns-other
 			$this->parent->getRadioSet( array(
 				'var' => '_NamespaceType',
 				'label' => 'config-project-namespace',
@@ -668,9 +704,8 @@ class WebInstaller_Name extends WebInstallerPage {
 			) ) .
 			$this->parent->getTextBox( array(
 				'var' => 'wgMetaNamespace',
-				'label' => '', //TODO: Needs a label?
-				'attribs' => array( 'readonly' => 'readonly', 'class' => 'enabledByOther' ),
-
+				'label' => '', // @todo Needs a label?
+				'attribs' => array( 'readonly' => 'readonly', 'class' => 'enabledByOther' )
 			) ) .
 			$this->getFieldSetStart( 'config-admin-box' ) .
 			$this->parent->getTextBox( array(
@@ -698,6 +733,9 @@ class WebInstaller_Name extends WebInstallerPage {
 			) ) .
 			$this->getFieldSetEnd() .
 			$this->parent->getInfoBox( wfMessage( 'config-almost-done' )->text() ) .
+			// getRadioSet() builds a set of labeled radio buttons.
+			// For grep: The following messages are used as the item labels:
+			// config-optional-continue, config-optional-skip
 			$this->parent->getRadioSet( array(
 				'var' => '_SkipOptional',
 				'itemLabelPrefix' => 'config-optional-',
@@ -709,6 +747,7 @@ class WebInstaller_Name extends WebInstallerPage {
 		$this->setVar( 'wgMetaNamespace', $metaNS );
 
 		$this->endForm();
+
 		return 'output';
 	}
 
@@ -761,7 +800,7 @@ class WebInstaller_Name extends WebInstallerPage {
 		// Make sure it won't conflict with any existing namespaces
 		global $wgContLang;
 		$nsIndex = $wgContLang->getNsIndex( $name );
-		if( $nsIndex !== false && $nsIndex !== NS_PROJECT ) {
+		if ( $nsIndex !== false && $nsIndex !== NS_PROJECT ) {
 			$this->parent->showError( 'config-ns-conflict', $name );
 			$retVal = false;
 		}
@@ -809,24 +848,22 @@ class WebInstaller_Name extends WebInstallerPage {
 
 		// Validate e-mail if provided
 		$email = $this->getVar( '_AdminEmail' );
-		if( $email && !Sanitizer::validateEmail( $email ) ) {
+		if ( $email && !Sanitizer::validateEmail( $email ) ) {
 			$this->parent->showError( 'config-admin-error-bademail' );
 			$retVal = false;
 		}
 		// If they asked to subscribe to mediawiki-announce but didn't give
 		// an e-mail, show an error. Bug 29332
-		if( !$email && $this->getVar( '_Subscribe' ) ) {
+		if ( !$email && $this->getVar( '_Subscribe' ) ) {
 			$this->parent->showError( 'config-subscribe-noemail' );
 			$retVal = false;
 		}
 
 		return $retVal;
 	}
-
 }
 
 class WebInstaller_Options extends WebInstallerPage {
-
 	public function execute() {
 		if ( $this->getVar( '_SkipOptional' ) == 'skip' ) {
 			return 'skip';
@@ -841,6 +878,9 @@ class WebInstaller_Options extends WebInstallerPage {
 		$this->startForm();
 		$this->addHTML(
 			# User Rights
+			// getRadioSet() builds a set of labeled radio buttons.
+			// For grep: The following messages are used as the item labels:
+			// config-profile-wiki, config-profile-no-anon, config-profile-fishbowl, config-profile-private
 			$this->parent->getRadioSet( array(
 				'var' => '_RightsProfile',
 				'label' => 'config-profile',
@@ -850,6 +890,11 @@ class WebInstaller_Options extends WebInstallerPage {
 			$this->parent->getInfoBox( wfMessage( 'config-profile-help' )->plain() ) .
 
 			# Licensing
+			// getRadioSet() builds a set of labeled radio buttons.
+			// For grep: The following messages are used as the item labels:
+			// config-license-cc-by, config-license-cc-by-sa, config-license-cc-by-nc-sa,
+			// config-license-cc-0, config-license-pd, config-license-gfdl,
+			// config-license-none, config-license-cc-choose
 			$this->parent->getRadioSet( array(
 				'var' => '_LicenseCode',
 				'label' => 'config-license',
@@ -900,18 +945,27 @@ class WebInstaller_Options extends WebInstallerPage {
 
 		$extensions = $this->parent->findExtensions();
 
-		if( $extensions ) {
+		if ( $extensions ) {
 			$extHtml = $this->getFieldSetStart( 'config-extensions' );
 
-			foreach( $extensions as $ext ) {
+			/* Force a recache, so we load extensions descriptions */
+			global $wgLang;
+			$lc = Language::getLocalisationCache();
+			$lc->initialisedLangs = array();
+			$lc->getItem( $wgLang->mCode, '' );
+			LinkCache::singleton()->useDatabase( false );
+
+			foreach ( $extensions as $ext ) {
 				$extHtml .= $this->parent->getCheckBox( array(
-					'var' => "ext-$ext",
-					'rawtext' => $ext,
-				) );
+						'var' => "ext-{$ext['name']}",
+						'rawtext' => "<b>{$ext['name']}</b>: " .
+						wfMessage( $ext['descriptionmsg'] )->useDatabase( false )->parse(),
+					) );
+
 			}
 
 			$extHtml .= $this->parent->getHelpBox( 'config-extensions-help' ) .
-			$this->getFieldSetEnd();
+				$this->getFieldSetEnd();
 			$this->addHTML( $extHtml );
 		}
 
@@ -963,7 +1017,7 @@ class WebInstaller_Options extends WebInstallerPage {
 		);
 
 		$caches = array( 'none' );
-		if( count( $this->getVar( '_Caches' ) ) ) {
+		if ( count( $this->getVar( '_Caches' ) ) ) {
 			$caches[] = 'accel';
 		}
 		$caches[] = 'memcached';
@@ -976,11 +1030,14 @@ class WebInstaller_Options extends WebInstallerPage {
 			// or going back!
 			$cacheval = 'none';
 		}
-		$hidden = ($cacheval == 'memcached') ? '' : 'display: none';
+		$hidden = ( $cacheval == 'memcached' ) ? '' : 'display: none';
 		$this->addHTML(
 			# Advanced settings
 			$this->getFieldSetStart( 'config-advanced-settings' ) .
 			# Object cache settings
+			// getRadioSet() builds a set of labeled radio buttons.
+			// For grep: The following messages are used as the item labels:
+			// config-cache-none, config-cache-accel, config-cache-memcached
 			$this->parent->getRadioSet( array(
 				'var' => 'wgMainCacheType',
 				'label' => 'config-cache-options',
@@ -1023,6 +1080,7 @@ class WebInstaller_Options extends WebInstallerPage {
 				'lang' => $this->getVar( '_UserLang' ),
 				'stylesheet' => $styleUrl,
 			) );
+
 		return $iframeUrl;
 	}
 
@@ -1040,10 +1098,9 @@ class WebInstaller_Options extends WebInstallerPage {
 		} else {
 			$iframeAttribs['src'] = $this->getCCPartnerUrl();
 		}
-		$wrapperStyle = ($this->getVar( '_LicenseCode' ) == 'cc-choose') ? '' : 'display: none';
+		$wrapperStyle = ( $this->getVar( '_LicenseCode' ) == 'cc-choose' ) ? '' : 'display: none';
 
-		return
-			"<div class=\"config-cc-wrapper\" id=\"config-cc-wrapper\" style=\"$wrapperStyle\">\n" .
+		return "<div class=\"config-cc-wrapper\" id=\"config-cc-wrapper\" style=\"$wrapperStyle\">\n" .
 			Html::element( 'iframe', $iframeAttribs, '', false /* not short */ ) .
 			"</div>\n";
 	}
@@ -1053,13 +1110,13 @@ class WebInstaller_Options extends WebInstallerPage {
 		// If you change this height, also change it in config.css
 		$expandJs = str_replace( '$1', '54em', $js );
 		$reduceJs = str_replace( '$1', '70px', $js );
-		return
-			'<p>'.
+
+		return '<p>' .
 			Html::element( 'img', array( 'src' => $this->getVar( 'wgRightsIcon' ) ) ) .
 			'&#160;&#160;' .
 			htmlspecialchars( $this->getVar( 'wgRightsText' ) ) .
 			"</p>\n" .
-			"<p style=\"text-align: center\">" .
+			"<p style=\"text-align: center;\">" .
 			Html::element( 'a',
 				array(
 					'href' => $this->getCCPartnerUrl(),
@@ -1068,7 +1125,7 @@ class WebInstaller_Options extends WebInstallerPage {
 				wfMessage( 'config-cc-again' )->text()
 			) .
 			"</p>\n" .
-			"<script type=\"text/javascript\">\n" .
+			"<script>\n" .
 			# Reduce the wrapper div height
 			htmlspecialchars( $reduceJs ) .
 			"\n" .
@@ -1080,6 +1137,7 @@ class WebInstaller_Options extends WebInstallerPage {
 			array( 'wgRightsUrl', 'wgRightsText', 'wgRightsIcon' ) );
 		if ( count( $newValues ) != 3 ) {
 			$this->parent->showError( 'config-cc-error' );
+
 			return;
 		}
 		$this->setVar( '_CCDone', true );
@@ -1094,8 +1152,8 @@ class WebInstaller_Options extends WebInstallerPage {
 			'wgUseInstantCommons' ) );
 
 		if ( !in_array( $this->getVar( '_RightsProfile' ),
-			array_keys( $this->parent->rightsProfiles ) ) )
-		{
+			array_keys( $this->parent->rightsProfiles ) )
+		) {
 			reset( $this->parent->rightsProfiles );
 			$this->setVar( '_RightsProfile', key( $this->parent->rightsProfiles ) );
 		}
@@ -1104,9 +1162,14 @@ class WebInstaller_Options extends WebInstallerPage {
 		if ( $code == 'cc-choose' ) {
 			if ( !$this->getVar( '_CCDone' ) ) {
 				$this->parent->showError( 'config-cc-not-chosen' );
+
 				return false;
 			}
 		} elseif ( in_array( $code, array_keys( $this->parent->licenses ) ) ) {
+			// Messages:
+			// config-license-cc-by, config-license-cc-by-sa, config-license-cc-by-nc-sa,
+			// config-license-cc-0, config-license-pd, config-license-gfdl, config-license-none,
+			// config-license-cc-choose
 			$entry = $this->parent->licenses[$code];
 			if ( isset( $entry['text'] ) ) {
 				$this->setVar( 'wgRightsText', $entry['text'] );
@@ -1121,41 +1184,47 @@ class WebInstaller_Options extends WebInstallerPage {
 			$this->setVar( 'wgRightsIcon', '' );
 		}
 
-		$extsAvailable = $this->parent->findExtensions();
+		$extsAvailable = array_map( function($e) { if( isset($e['name']) ) return $e['name']; }, $this->parent->findExtensions() );
 		$extsToInstall = array();
-		foreach( $extsAvailable as $ext ) {
-			if( $this->parent->request->getCheck( 'config_ext-' . $ext ) ) {
-				$extsToInstall[] = $ext;
+		foreach ( $extsAvailable as $key => $ext ) {
+				var_dump("config_ext-$ext");
+			if ( $this->parent->request->getCheck( 'config_ext-' . $ext ) ) {
+				$extsToInstall[] = $extsAvailable[ $key ];
 			}
 		}
 		$this->parent->setVar( '_Extensions', $extsToInstall );
 
-		if( $this->getVar( 'wgMainCacheType' ) == 'memcached' ) {
+		if ( $this->getVar( 'wgMainCacheType' ) == 'memcached' ) {
 			$memcServers = explode( "\n", $this->getVar( '_MemCachedServers' ) );
-			if( !$memcServers ) {
+			if ( !$memcServers ) {
 				$this->parent->showError( 'config-memcache-needservers' );
+
 				return false;
 			}
 
-			foreach( $memcServers as $server ) {
+			foreach ( $memcServers as $server ) {
 				$memcParts = explode( ":", $server, 2 );
 				if ( !isset( $memcParts[0] )
-						|| ( !IP::isValid( $memcParts[0] )
-							&& ( gethostbyname( $memcParts[0] ) == $memcParts[0] ) ) ) {
+					|| ( !IP::isValid( $memcParts[0] )
+						&& ( gethostbyname( $memcParts[0] ) == $memcParts[0] ) )
+				) {
 					$this->parent->showError( 'config-memcache-badip', $memcParts[0] );
+
 					return false;
-				} elseif( !isset( $memcParts[1] )  ) {
+				} elseif ( !isset( $memcParts[1] ) ) {
 					$this->parent->showError( 'config-memcache-noport', $memcParts[0] );
+
 					return false;
-				} elseif( $memcParts[1] < 1 || $memcParts[1] > 65535 ) {
+				} elseif ( $memcParts[1] < 1 || $memcParts[1] > 65535 ) {
 					$this->parent->showError( 'config-memcache-badport', 1, 65535 );
+
 					return false;
 				}
 			}
 		}
+
 		return true;
 	}
-
 }
 
 class WebInstaller_Install extends WebInstallerPage {
@@ -1164,11 +1233,11 @@ class WebInstaller_Install extends WebInstallerPage {
 	}
 
 	public function execute() {
-		if( $this->getVar( '_UpgradeDone' ) ) {
+		if ( $this->getVar( '_UpgradeDone' ) ) {
 			return 'skip';
-		} elseif( $this->getVar( '_InstallDone' ) ) {
+		} elseif ( $this->getVar( '_InstallDone' ) ) {
 			return 'continue';
-		} elseif( $this->parent->request->wasPosted() ) {
+		} elseif ( $this->parent->request->wasPosted() ) {
 			$this->startForm();
 			$this->addHTML( "<ul>" );
 			$results = $this->parent->performInstallation(
@@ -1187,11 +1256,16 @@ class WebInstaller_Install extends WebInstallerPage {
 			$this->addHTML( $this->parent->getInfoBox( wfMessage( 'config-install-begin' )->plain() ) );
 			$this->endForm();
 		}
+
 		return true;
 	}
 
 	public function startStage( $step ) {
-		$this->addHTML( "<li>" . wfMessage( "config-install-$step" )->escaped() . wfMessage( 'ellipsis' )->escaped() );
+		// Messages: config-install-database, config-install-tables, config-install-interwiki,
+		// config-install-stats, config-install-keys, config-install-sysop, config-install-mainpage
+		$this->addHTML( "<li>" . wfMessage( "config-install-$step" )->escaped() .
+			wfMessage( 'ellipsis' )->escaped() );
+
 		if ( $step == 'extension-tables' ) {
 			$this->startLiveBox();
 		}
@@ -1211,25 +1285,23 @@ class WebInstaller_Install extends WebInstallerPage {
 			$html = "<span class=\"error\">$html</span>";
 		}
 		$this->addHTML( $html . "</li>\n" );
-		if( !$status->isGood() ) {
+		if ( !$status->isGood() ) {
 			$this->parent->showStatusBox( $status );
 		}
 	}
-
 }
 
 class WebInstaller_Complete extends WebInstallerPage {
-
 	public function execute() {
 		// Pop up a dialog box, to make it difficult for the user to forget
 		// to download the file
 		$lsUrl = $this->getVar( 'wgServer' ) . $this->parent->getURL( array( 'localsettings' => 1 ) );
 		if ( isset( $_SERVER['HTTP_USER_AGENT'] ) &&
-			 strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE' ) !== false ) {
-			// JS appears the only method that works consistently with IE7+
-			$this->addHtml( "\n<script type=\"" . $GLOBALS['wgJsMimeType'] .
-				'">jQuery( document ).ready( function() { document.location=' .
-				Xml::encodeJsVar( $lsUrl) . "; } );</script>\n" );
+			strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE' ) !== false
+		) {
+			// JS appears to be the only method that works consistently with IE7+
+			$this->addHtml( "\n<script>jQuery( function () { document.location = " .
+			Xml::encodeJsVar( $lsUrl ) . "; } );</script>\n" );
 		} else {
 			$this->parent->request->response()->header( "Refresh: 0;url=$lsUrl" );
 		}
@@ -1241,12 +1313,15 @@ class WebInstaller_Complete extends WebInstallerPage {
 				wfMessage( 'config-install-done',
 					$lsUrl,
 					$this->getVar( 'wgServer' ) .
-						$this->getVar( 'wgScriptPath' ) . '/index' .
-						$this->getVar( 'wgScriptExtension' ),
+					$this->getVar( 'wgScriptPath' ) . '/index' .
+					$this->getVar( 'wgScriptExtension' ),
 					'<downloadlink/>'
 				)->plain(), 'tick-32.png'
 			)
 		);
+		$this->addHTML( $this->parent->getInfoBox(
+			wfMessage( 'config-extension-link' )->text() ) );
+
 		$this->parent->restoreLinkPopups();
 		$this->endForm( false, false );
 	}
@@ -1261,6 +1336,7 @@ class WebInstaller_Restart extends WebInstallerPage {
 			if ( $really ) {
 				$this->parent->reset();
 			}
+
 			return 'continue';
 		}
 
@@ -1269,14 +1345,13 @@ class WebInstaller_Restart extends WebInstallerPage {
 		$this->addHTML( $s );
 		$this->endForm( 'restart' );
 	}
-
 }
 
 abstract class WebInstaller_Document extends WebInstallerPage {
 
 	abstract protected function getFileName();
 
-	public  function execute() {
+	public function execute() {
 		$text = $this->getFileContents();
 		$text = InstallDocFormatter::format( $text );
 		$this->parent->output->addWikiText( $text );
@@ -1286,23 +1361,25 @@ abstract class WebInstaller_Document extends WebInstallerPage {
 
 	public function getFileContents() {
 		$file = __DIR__ . '/../../' . $this->getFileName();
-		if( ! file_exists( $file ) ) {
+		if ( !file_exists( $file ) ) {
 			return wfMessage( 'config-nofile', $file )->plain();
 		}
+
 		return file_get_contents( $file );
 	}
-
 }
 
 class WebInstaller_Readme extends WebInstaller_Document {
-	protected function getFileName() { return 'README'; }
+	protected function getFileName() {
+		return 'README';
+	}
 }
 
 class WebInstaller_ReleaseNotes extends WebInstaller_Document {
 	protected function getFileName() {
 		global $wgVersion;
 
-		if( !preg_match( '/^(\d+)\.(\d+).*/i', $wgVersion, $result ) ) {
+		if ( !preg_match( '/^(\d+)\.(\d+).*/i', $wgVersion, $result ) ) {
 			throw new MWException( 'Variable $wgVersion has an invalid value.' );
 		}
 
@@ -1311,9 +1388,13 @@ class WebInstaller_ReleaseNotes extends WebInstaller_Document {
 }
 
 class WebInstaller_UpgradeDoc extends WebInstaller_Document {
-	protected function getFileName() { return 'UPGRADE'; }
+	protected function getFileName() {
+		return 'UPGRADE';
+	}
 }
 
 class WebInstaller_Copying extends WebInstaller_Document {
-	protected function getFileName() { return 'COPYING'; }
+	protected function getFileName() {
+		return 'COPYING';
+	}
 }
diff --git a/includes/job/Job.php b/includes/job/Job.php
index bcf582e7..ab7df5d2 100644
--- a/includes/job/Job.php
+++ b/includes/job/Job.php
@@ -68,7 +68,7 @@ abstract class Job {
 	 */
 	public static function factory( $command, Title $title, $params = false, $id = 0 ) {
 		global $wgJobClasses;
-		if( isset( $wgJobClasses[$command] ) ) {
+		if ( isset( $wgJobClasses[$command] ) ) {
 			$class = $wgJobClasses[$command];
 			return new $class( $title, $params, $id );
 		}
@@ -84,7 +84,7 @@ abstract class Job {
 	 *
 	 * @param array $jobs of Job objects
 	 * @return bool
-	 * @deprecated 1.21
+	 * @deprecated since 1.21
 	 */
 	public static function batchInsert( $jobs ) {
 		return JobQueueGroup::singleton()->push( $jobs );
@@ -99,10 +99,10 @@ abstract class Job {
 	 *
 	 * @param array $jobs of Job objects
 	 * @return bool
-	 * @deprecated 1.21
+	 * @deprecated since 1.21
 	 */
 	public static function safeBatchInsert( $jobs ) {
-		return JobQueueGroup::singleton()->push( $jobs, JobQueue::QoS_Atomic );
+		return JobQueueGroup::singleton()->push( $jobs, JobQueue::QOS_ATOMIC );
 	}
 
 	/**
@@ -112,7 +112,7 @@ abstract class Job {
 	 *
 	 * @param $type string
 	 * @return Job|bool Returns false if there are no jobs
-	 * @deprecated 1.21
+	 * @deprecated since 1.21
 	 */
 	public static function pop_type( $type ) {
 		return JobQueueGroup::singleton()->get( $type )->pop();
@@ -123,7 +123,7 @@ abstract class Job {
 	 * This is subject to $wgJobTypesExcludedFromDefaultQueue.
 	 *
 	 * @return Job or false if there's no jobs
-	 * @deprecated 1.21
+	 * @deprecated since 1.21
 	 */
 	public static function pop() {
 		return JobQueueGroup::singleton()->pop();
@@ -150,6 +150,7 @@ abstract class Job {
 
 	/**
 	 * @return integer May be 0 for jobs stored outside the DB
+	 * @deprecated since 1.22
 	 */
 	public function getId() {
 		return $this->id;
@@ -176,6 +177,16 @@ abstract class Job {
 		return $this->params;
 	}
 
+	/**
+	 * @return integer|null UNIX timestamp to delay running this job until, otherwise null
+	 * @since 1.22
+	 */
+	public function getReleaseTimestamp() {
+		return isset( $this->params['jobReleaseTimestamp'] )
+			? wfTimestampOrNull( TS_UNIX, $this->params['jobReleaseTimestamp'] )
+			: null;
+	}
+
 	/**
 	 * @return bool Whether only one of each identical set of jobs should be run
 	 */
@@ -185,34 +196,43 @@ abstract class Job {
 
 	/**
 	 * @return bool Whether this job can be retried on failure by job runners
+	 * @since 1.21
 	 */
 	public function allowRetries() {
 		return true;
 	}
 
 	/**
-	 * Subclasses may need to override this to make duplication detection work
+	 * Subclasses may need to override this to make duplication detection work.
+	 * The resulting map conveys everything that makes the job unique. This is
+	 * only checked if ignoreDuplicates() returns true, meaning that duplicate
+	 * jobs are supposed to be ignored.
 	 *
 	 * @return Array Map of key/values
+	 * @since 1.21
 	 */
 	public function getDeduplicationInfo() {
 		$info = array(
-			'type'      => $this->getType(),
+			'type' => $this->getType(),
 			'namespace' => $this->getTitle()->getNamespace(),
-			'title'     => $this->getTitle()->getDBkey(),
-			'params'    => $this->getParams()
+			'title' => $this->getTitle()->getDBkey(),
+			'params' => $this->getParams()
 		);
-		// Identical jobs with different "root" jobs should count as duplicates
 		if ( is_array( $info['params'] ) ) {
+			// Identical jobs with different "root" jobs should count as duplicates
 			unset( $info['params']['rootJobSignature'] );
 			unset( $info['params']['rootJobTimestamp'] );
+			// Likewise for jobs with different delay times
+			unset( $info['params']['jobReleaseTimestamp'] );
 		}
 		return $info;
 	}
 
 	/**
+	 * @see JobQueue::deduplicateRootJob()
 	 * @param string $key A key that identifies the task
 	 * @return Array
+	 * @since 1.21
 	 */
 	public static function newRootJobParams( $key ) {
 		return array(
@@ -222,7 +242,9 @@ abstract class Job {
 	}
 
 	/**
+	 * @see JobQueue::deduplicateRootJob()
 	 * @return Array
+	 * @since 1.21
 	 */
 	public function getRootJobParams() {
 		return array(
@@ -235,10 +257,20 @@ abstract class Job {
 		);
 	}
 
+	/**
+	 * @see JobQueue::deduplicateRootJob()
+	 * @return bool
+	 * @since 1.22
+	 */
+	public function hasRootJobParams() {
+		return isset( $this->params['rootJobSignature'] )
+			&& isset( $this->params['rootJobTimestamp'] );
+	}
+
 	/**
 	 * Insert a single job into the queue.
 	 * @return bool true on success
-	 * @deprecated 1.21
+	 * @deprecated since 1.21
 	 */
 	public function insert() {
 		return JobQueueGroup::singleton()->push( $this );
diff --git a/includes/job/JobQueue.php b/includes/job/JobQueue.php
index b0dd9258..6556ee85 100644
--- a/includes/job/JobQueue.php
+++ b/includes/job/JobQueue.php
@@ -34,8 +34,14 @@ abstract class JobQueue {
 	protected $order; // string; job priority for pop()
 	protected $claimTTL; // integer; seconds
 	protected $maxTries; // integer; maximum number of times to try a job
+	protected $checkDelay; // boolean; allow delayed jobs
 
-	const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions
+	/** @var BagOStuff */
+	protected $dupCache;
+
+	const QOS_ATOMIC = 1; // integer; "all-or-nothing" job insertions
+
+	const ROOTJOB_TTL = 2419200; // integer; seconds to remember root jobs (28 days)
 
 	/**
 	 * @param $params array
@@ -53,28 +59,37 @@ abstract class JobQueue {
 		if ( !in_array( $this->order, $this->supportedOrders() ) ) {
 			throw new MWException( __CLASS__ . " does not support '{$this->order}' order." );
 		}
+		$this->checkDelay = !empty( $params['checkDelay'] );
+		if ( $this->checkDelay && !$this->supportsDelayedJobs() ) {
+			throw new MWException( __CLASS__ . " does not support delayed jobs." );
+		}
+		$this->dupCache = wfGetCache( CACHE_ANYTHING );
 	}
 
 	/**
 	 * Get a job queue object of the specified type.
 	 * $params includes:
-	 *   - class    : What job class to use (determines job type)
-	 *   - wiki     : wiki ID of the wiki the jobs are for (defaults to current wiki)
-	 *   - type     : The name of the job types this queue handles
-	 *   - order    : Order that pop() selects jobs, one of "fifo", "timestamp" or "random".
-	 *                If "fifo" is used, the queue will effectively be FIFO. Note that
-	 *                job completion will not appear to be exactly FIFO if there are multiple
-	 *                job runners since jobs can take different times to finish once popped.
-	 *                If "timestamp" is used, the queue will at least be loosely ordered
-	 *                by timestamp, allowing for some jobs to be popped off out of order.
-	 *                If "random" is used, pop() will pick jobs in random order.
-	 *                Note that it may only be weakly random (e.g. a lottery of the oldest X).
-	 *                If "any" is choosen, the queue will use whatever order is the fastest.
-	 *                This might be useful for improving concurrency for job acquisition.
-	 *   - claimTTL : If supported, the queue will recycle jobs that have been popped
-	 *                but not acknowledged as completed after this many seconds. Recycling
-	 *                of jobs simple means re-inserting them into the queue. Jobs can be
-	 *                attempted up to three times before being discarded.
+	 *   - class      : What job class to use (determines job type)
+	 *   - wiki       : wiki ID of the wiki the jobs are for (defaults to current wiki)
+	 *   - type       : The name of the job types this queue handles
+	 *   - order      : Order that pop() selects jobs, one of "fifo", "timestamp" or "random".
+	 *                  If "fifo" is used, the queue will effectively be FIFO. Note that job
+	 *                  completion will not appear to be exactly FIFO if there are multiple
+	 *                  job runners since jobs can take different times to finish once popped.
+	 *                  If "timestamp" is used, the queue will at least be loosely ordered
+	 *                  by timestamp, allowing for some jobs to be popped off out of order.
+	 *                  If "random" is used, pop() will pick jobs in random order.
+	 *                  Note that it may only be weakly random (e.g. a lottery of the oldest X).
+	 *                  If "any" is choosen, the queue will use whatever order is the fastest.
+	 *                  This might be useful for improving concurrency for job acquisition.
+	 *   - claimTTL   : If supported, the queue will recycle jobs that have been popped
+	 *                  but not acknowledged as completed after this many seconds. Recycling
+	 *                  of jobs simple means re-inserting them into the queue. Jobs can be
+	 *                  attempted up to three times before being discarded.
+	 *   - checkDelay : If supported, respect Job::getReleaseTimestamp() in the push functions.
+	 *                  This lets delayed jobs wait in a staging area until a given timestamp is
+	 *                  reached, at which point they will enter the queue. If this is not enabled
+	 *                  or not supported, an exception will be thrown on delayed job insertion.
 	 *
 	 * Queue classes should throw an exception if they do not support the options given.
 	 *
@@ -84,7 +99,7 @@ abstract class JobQueue {
 	 */
 	final public static function factory( array $params ) {
 		$class = $params['class'];
-		if ( !MWInit::classExists( $class ) ) {
+		if ( !class_exists( $class ) ) {
 			throw new MWException( "Invalid job queue class '$class'." );
 		}
 		$obj = new $class( $params );
@@ -109,24 +124,45 @@ abstract class JobQueue {
 	}
 
 	/**
-	 * @return string One of (random, timestamp, fifo)
+	 * @return string One of (random, timestamp, fifo, undefined)
 	 */
 	final public function getOrder() {
 		return $this->order;
 	}
 
 	/**
-	 * @return Array Subset of (random, timestamp, fifo)
+	 * @return bool Whether delayed jobs are enabled
+	 * @since 1.22
+	 */
+	final public function delayedJobsEnabled() {
+		return $this->checkDelay;
+	}
+
+	/**
+	 * Get the allowed queue orders for configuration validation
+	 *
+	 * @return Array Subset of (random, timestamp, fifo, undefined)
 	 */
 	abstract protected function supportedOrders();
 
 	/**
-	 * @return string One of (random, timestamp, fifo)
+	 * Get the default queue order to use if configuration does not specify one
+	 *
+	 * @return string One of (random, timestamp, fifo, undefined)
 	 */
 	abstract protected function optimalOrder();
 
 	/**
-	 * Quickly check if the queue is empty (has no available jobs).
+	 * Find out if delayed jobs are supported for configuration validation
+	 *
+	 * @return boolean Whether delayed jobs are supported
+	 */
+	protected function supportsDelayedJobs() {
+		return false; // not implemented
+	}
+
+	/**
+	 * Quickly check if the queue has no available (unacquired, non-delayed) jobs.
 	 * Queue classes should use caching if they are any slower without memcached.
 	 *
 	 * If caching is used, this might return false when there are actually no jobs.
@@ -135,7 +171,7 @@ abstract class JobQueue {
 	 * not distinguishable from the race condition between isEmpty() and pop().
 	 *
 	 * @return bool
-	 * @throws MWException
+	 * @throws JobQueueError
 	 */
 	final public function isEmpty() {
 		wfProfileIn( __METHOD__ );
@@ -151,13 +187,13 @@ abstract class JobQueue {
 	abstract protected function doIsEmpty();
 
 	/**
-	 * Get the number of available (unacquired) jobs in the queue.
+	 * Get the number of available (unacquired, non-delayed) jobs in the queue.
 	 * Queue classes should use caching if they are any slower without memcached.
 	 *
 	 * If caching is used, this number might be out of date for a minute.
 	 *
 	 * @return integer
-	 * @throws MWException
+	 * @throws JobQueueError
 	 */
 	final public function getSize() {
 		wfProfileIn( __METHOD__ );
@@ -179,7 +215,7 @@ abstract class JobQueue {
 	 * If caching is used, this number might be out of date for a minute.
 	 *
 	 * @return integer
-	 * @throws MWException
+	 * @throws JobQueueError
 	 */
 	final public function getAcquiredCount() {
 		wfProfileIn( __METHOD__ );
@@ -194,15 +230,64 @@ abstract class JobQueue {
 	 */
 	abstract protected function doGetAcquiredCount();
 
+	/**
+	 * Get the number of delayed jobs (these are temporarily out of the queue).
+	 * Queue classes should use caching if they are any slower without memcached.
+	 *
+	 * If caching is used, this number might be out of date for a minute.
+	 *
+	 * @return integer
+	 * @throws JobQueueError
+	 * @since 1.22
+	 */
+	final public function getDelayedCount() {
+		wfProfileIn( __METHOD__ );
+		$res = $this->doGetDelayedCount();
+		wfProfileOut( __METHOD__ );
+		return $res;
+	}
+
+	/**
+	 * @see JobQueue::getDelayedCount()
+	 * @return integer
+	 */
+	protected function doGetDelayedCount() {
+		return 0; // not implemented
+	}
+
+	/**
+	 * Get the number of acquired jobs that can no longer be attempted.
+	 * Queue classes should use caching if they are any slower without memcached.
+	 *
+	 * If caching is used, this number might be out of date for a minute.
+	 *
+	 * @return integer
+	 * @throws JobQueueError
+	 */
+	final public function getAbandonedCount() {
+		wfProfileIn( __METHOD__ );
+		$res = $this->doGetAbandonedCount();
+		wfProfileOut( __METHOD__ );
+		return $res;
+	}
+
+	/**
+	 * @see JobQueue::getAbandonedCount()
+	 * @return integer
+	 */
+	protected function doGetAbandonedCount() {
+		return 0; // not implemented
+	}
+
 	/**
 	 * Push a single jobs into the queue.
 	 * This does not require $wgJobClasses to be set for the given job type.
 	 * Outside callers should use JobQueueGroup::push() instead of this function.
 	 *
 	 * @param $jobs Job|Array
-	 * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
+	 * @param $flags integer Bitfield (supports JobQueue::QOS_ATOMIC)
 	 * @return bool Returns false on failure
-	 * @throws MWException
+	 * @throws JobQueueError
 	 */
 	final public function push( $jobs, $flags = 0 ) {
 		return $this->batchPush( is_array( $jobs ) ? $jobs : array( $jobs ), $flags );
@@ -214,9 +299,9 @@ abstract class JobQueue {
 	 * Outside callers should use JobQueueGroup::push() instead of this function.
 	 *
 	 * @param array $jobs List of Jobs
-	 * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
+	 * @param $flags integer Bitfield (supports JobQueue::QOS_ATOMIC)
 	 * @return bool Returns false on failure
-	 * @throws MWException
+	 * @throws JobQueueError
 	 */
 	final public function batchPush( array $jobs, $flags = 0 ) {
 		if ( !count( $jobs ) ) {
@@ -225,7 +310,11 @@ abstract class JobQueue {
 
 		foreach ( $jobs as $job ) {
 			if ( $job->getType() !== $this->type ) {
-				throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+				throw new MWException(
+					"Got '{$job->getType()}' job; expected a '{$this->type}' job." );
+			} elseif ( $job->getReleaseTimestamp() && !$this->checkDelay ) {
+				throw new MWException(
+					"Got delayed '{$job->getType()}' job; delays are not supported." );
 			}
 		}
 
@@ -247,7 +336,7 @@ abstract class JobQueue {
 	 * Outside callers should use JobQueueGroup::pop() instead of this function.
 	 *
 	 * @return Job|bool Returns false if there are no jobs
-	 * @throws MWException
+	 * @throws JobQueueError
 	 */
 	final public function pop() {
 		global $wgJobClasses;
@@ -262,6 +351,15 @@ abstract class JobQueue {
 		wfProfileIn( __METHOD__ );
 		$job = $this->doPop();
 		wfProfileOut( __METHOD__ );
+
+		// Flag this job as an old duplicate based on its "root" job...
+		try {
+			if ( $job && $this->isRootJobOldDuplicate( $job ) ) {
+				JobQueue::incrStats( 'job-pop-duplicate', $this->type );
+				$job = DuplicateJob::newFromJob( $job ); // convert to a no-op
+			}
+		} catch ( MWException $e ) {} // don't lose jobs over this
+
 		return $job;
 	}
 
@@ -279,7 +377,7 @@ abstract class JobQueue {
 	 *
 	 * @param $job Job
 	 * @return bool
-	 * @throws MWException
+	 * @throws JobQueueError
 	 */
 	final public function ack( Job $job ) {
 		if ( $job->getType() !== $this->type ) {
@@ -326,7 +424,7 @@ abstract class JobQueue {
 	 *
 	 * @param $job Job
 	 * @return bool
-	 * @throws MWException
+	 * @throws JobQueueError
 	 */
 	final public function deduplicateRootJob( Job $job ) {
 		if ( $job->getType() !== $this->type ) {
@@ -344,7 +442,91 @@ abstract class JobQueue {
 	 * @return bool
 	 */
 	protected function doDeduplicateRootJob( Job $job ) {
-		return true;
+		if ( !$job->hasRootJobParams() ) {
+			throw new MWException( "Cannot register root job; missing parameters." );
+		}
+		$params = $job->getRootJobParams();
+
+		$key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
+		// Callers should call batchInsert() and then this function so that if the insert
+		// fails, the de-duplication registration will be aborted. Since the insert is
+		// deferred till "transaction idle", do the same here, so that the ordering is
+		// maintained. Having only the de-duplication registration succeed would cause
+		// jobs to become no-ops without any actual jobs that made them redundant.
+		$timestamp = $this->dupCache->get( $key ); // current last timestamp of this job
+		if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
+			return true; // a newer version of this root job was enqueued
+		}
+
+		// Update the timestamp of the last root job started at the location...
+		return $this->dupCache->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
+	}
+
+	/**
+	 * Check if the "root" job of a given job has been superseded by a newer one
+	 *
+	 * @param $job Job
+	 * @return bool
+	 * @throws JobQueueError
+	 */
+	final protected function isRootJobOldDuplicate( Job $job ) {
+		if ( $job->getType() !== $this->type ) {
+			throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+		}
+		wfProfileIn( __METHOD__ );
+		$isDuplicate = $this->doIsRootJobOldDuplicate( $job );
+		wfProfileOut( __METHOD__ );
+		return $isDuplicate;
+	}
+
+	/**
+	 * @see JobQueue::isRootJobOldDuplicate()
+	 * @param Job $job
+	 * @return bool
+	 */
+	protected function doIsRootJobOldDuplicate( Job $job ) {
+		if ( !$job->hasRootJobParams() ) {
+			return false; // job has no de-deplication info
+		}
+		$params = $job->getRootJobParams();
+
+		$key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
+		// Get the last time this root job was enqueued
+		$timestamp = $this->dupCache->get( $key );
+
+		// Check if a new root job was started at the location after this one's...
+		return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
+	}
+
+	/**
+	 * @param string $signature Hash identifier of the root job
+	 * @return string
+	 */
+	protected function getRootJobCacheKey( $signature ) {
+		list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+		return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'rootjob', $signature );
+	}
+
+	/**
+	 * Deleted all unclaimed and delayed jobs from the queue
+	 *
+	 * @return bool Success
+	 * @throws JobQueueError
+	 * @since 1.22
+	 */
+	final public function delete() {
+		wfProfileIn( __METHOD__ );
+		$res = $this->doDelete();
+		wfProfileOut( __METHOD__ );
+		return $res;
+	}
+
+	/**
+	 * @see JobQueue::delete()
+	 * @return bool Success
+	 */
+	protected function doDelete() {
+		throw new MWException( "This method is not implemented." );
 	}
 
 	/**
@@ -353,7 +535,7 @@ abstract class JobQueue {
 	 * This does nothing for certain queue classes.
 	 *
 	 * @return void
-	 * @throws MWException
+	 * @throws JobQueueError
 	 */
 	final public function waitForBackups() {
 		wfProfileIn( __METHOD__ );
@@ -413,15 +595,97 @@ abstract class JobQueue {
 	protected function doFlushCaches() {}
 
 	/**
-	 * Get an iterator to traverse over all of the jobs in this queue.
-	 * This does not include jobs that are current acquired. In general,
-	 * this should only be called on a queue that is no longer being popped.
+	 * Get an iterator to traverse over all available jobs in this queue.
+	 * This does not include jobs that are currently acquired or delayed.
+	 * Note: results may be stale if the queue is concurrently modified.
 	 *
-	 * @return Iterator|Traversable|Array
-	 * @throws MWException
+	 * @return Iterator
+	 * @throws JobQueueError
 	 */
 	abstract public function getAllQueuedJobs();
 
+	/**
+	 * Get an iterator to traverse over all delayed jobs in this queue.
+	 * Note: results may be stale if the queue is concurrently modified.
+	 *
+	 * @return Iterator
+	 * @throws JobQueueError
+	 * @since 1.22
+	 */
+	public function getAllDelayedJobs() {
+		return new ArrayIterator( array() ); // not implemented
+	}
+
+	/**
+	 * Do not use this function outside of JobQueue/JobQueueGroup
+	 *
+	 * @return string
+	 * @since 1.22
+	 */
+	public function getCoalesceLocationInternal() {
+		return null;
+	}
+
+	/**
+	 * Check whether each of the given queues are empty.
+	 * This is used for batching checks for queues stored at the same place.
+	 *
+	 * @param array $types List of queues types
+	 * @return array|null (list of non-empty queue types) or null if unsupported
+	 * @throws MWException
+	 * @since 1.22
+	 */
+	final public function getSiblingQueuesWithJobs( array $types ) {
+		$section = new ProfileSection( __METHOD__ );
+		return $this->doGetSiblingQueuesWithJobs( $types );
+	}
+
+	/**
+	 * @see JobQueue::getSiblingQueuesWithJobs()
+	 * @param array $types List of queues types
+	 * @return array|null (list of queue types) or null if unsupported
+	 */
+	protected function doGetSiblingQueuesWithJobs( array $types ) {
+		return null; // not supported
+	}
+
+	/**
+	 * Check the size of each of the given queues.
+	 * For queues not served by the same store as this one, 0 is returned.
+	 * This is used for batching checks for queues stored at the same place.
+	 *
+	 * @param array $types List of queues types
+	 * @return array|null (job type => whether queue is empty) or null if unsupported
+	 * @throws MWException
+	 * @since 1.22
+	 */
+	final public function getSiblingQueueSizes( array $types ) {
+		$section = new ProfileSection( __METHOD__ );
+		return $this->doGetSiblingQueueSizes( $types );
+	}
+
+	/**
+	 * @see JobQueue::getSiblingQueuesSize()
+	 * @param array $types List of queues types
+	 * @return array|null (list of queue types) or null if unsupported
+	 */
+	protected function doGetSiblingQueueSizes( array $types ) {
+		return null; // not supported
+	}
+
+	/**
+	 * Call wfIncrStats() for the queue overall and for the queue type
+	 *
+	 * @param string $key Event type
+	 * @param string $type Job type
+	 * @param integer $delta
+	 * @since 1.22
+	 */
+	public static function incrStats( $key, $type, $delta = 1 ) {
+		wfIncrStats( $key, $delta );
+		wfIncrStats( "{$key}-{$type}", $delta );
+	}
+
 	/**
 	 * Namespace the queue with a key to isolate it for testing
 	 *
@@ -433,3 +697,10 @@ abstract class JobQueue {
 		throw new MWException( "Queue namespacing not supported for this queue type." );
 	}
 }
+
+/**
+ * @ingroup JobQueue
+ * @since 1.22
+ */
+class JobQueueError extends MWException {}
+class JobQueueConnectionError extends JobQueueError {}
diff --git a/includes/job/JobQueueAggregator.php b/includes/job/JobQueueAggregator.php
deleted file mode 100644
index 3dba3c53..00000000
--- a/includes/job/JobQueueAggregator.php
+++ /dev/null
@@ -1,139 +0,0 @@
-<?php
-/**
- * Job queue aggregator code.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Aaron Schulz
- */
-
-/**
- * Class to handle tracking information about all queues
- *
- * @ingroup JobQueue
- * @since 1.21
- */
-abstract class JobQueueAggregator {
-	/** @var JobQueueAggregator */
-	protected static $instance = null;
-
-	/**
-	 * @param array $params
-	 */
-	protected function __construct( array $params ) {}
-
-	/**
-	 * @return JobQueueAggregator
-	 */
-	final public static function singleton() {
-		global $wgJobQueueAggregator;
-
-		if ( !isset( self::$instance ) ) {
-			$class = $wgJobQueueAggregator['class'];
-			$obj = new $class( $wgJobQueueAggregator );
-			if ( !( $obj instanceof JobQueueAggregator ) ) {
-				throw new MWException( "Class '$class' is not a JobQueueAggregator class." );
-			}
-			self::$instance = $obj;
-		}
-
-		return self::$instance;
-	}
-
-	/**
-	 * Destroy the singleton instance
-	 *
-	 * @return void
-	 */
-	final public static function destroySingleton() {
-		self::$instance = null;
-	}
-
-	/**
-	 * Mark a queue as being empty
-	 *
-	 * @param string $wiki
-	 * @param string $type
-	 * @return bool Success
-	 */
-	final public function notifyQueueEmpty( $wiki, $type ) {
-		wfProfileIn( __METHOD__ );
-		$ok = $this->doNotifyQueueEmpty( $wiki, $type );
-		wfProfileOut( __METHOD__ );
-		return $ok;
-	}
-
-	/**
-	 * @see JobQueueAggregator::notifyQueueEmpty()
-	 */
-	abstract protected function doNotifyQueueEmpty( $wiki, $type );
-
-	/**
-	 * Mark a queue as being non-empty
-	 *
-	 * @param string $wiki
-	 * @param string $type
-	 * @return bool Success
-	 */
-	final public function notifyQueueNonEmpty( $wiki, $type ) {
-		wfProfileIn( __METHOD__ );
-		$ok = $this->doNotifyQueueNonEmpty( $wiki, $type );
-		wfProfileOut( __METHOD__ );
-		return $ok;
-	}
-
-	/**
-	 * @see JobQueueAggregator::notifyQueueNonEmpty()
-	 */
-	abstract protected function doNotifyQueueNonEmpty( $wiki, $type );
-
-	/**
-	 * Get the list of all of the queues with jobs
-	 *
-	 * @return Array (job type => (list of wiki IDs))
-	 */
-	final public function getAllReadyWikiQueues() {
-		wfProfileIn( __METHOD__ );
-		$res = $this->doGetAllReadyWikiQueues();
-		wfProfileOut( __METHOD__ );
-		return $res;
-	}
-
-	/**
-	 * @see JobQueueAggregator::getAllReadyWikiQueues()
-	 */
-	abstract protected function doGetAllReadyWikiQueues();
-
-	/**
-	 * Get all databases that have a pending job.
-	 * This poll all the queues and is this expensive.
-	 *
-	 * @return Array (job type => (list of wiki IDs))
-	 */
-	protected function findPendingWikiQueues() {
-		global $wgLocalDatabases;
-
-		$pendingDBs = array(); // (job type => (db list))
-		foreach ( $wgLocalDatabases as $db ) {
-			foreach ( JobQueueGroup::singleton( $db )->getQueuesWithJobs() as $type ) {
-				$pendingDBs[$type][] = $db;
-			}
-		}
-
-		return $pendingDBs;
-	}
-}
diff --git a/includes/job/JobQueueAggregatorMemc.php b/includes/job/JobQueueAggregatorMemc.php
deleted file mode 100644
index 4b82cf92..00000000
--- a/includes/job/JobQueueAggregatorMemc.php
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-/**
- * Job queue aggregator code that uses BagOStuff.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Aaron Schulz
- */
-
-/**
- * Class to handle tracking information about all queues using BagOStuff
- *
- * @ingroup JobQueue
- * @since 1.21
- */
-class JobQueueAggregatorMemc extends JobQueueAggregator {
-	/** @var BagOStuff */
-	protected $cache;
-
-	protected $cacheTTL; // integer; seconds
-
-	/**
-	 * @params include:
-	 *   - objectCache : Name of an object cache registered in $wgObjectCaches.
-	 *                   This defaults to the one specified by $wgMainCacheType.
-	 *   - cacheTTL    : Seconds to cache the aggregate data before regenerating.
-	 * @param array $params
-	 */
-	protected function __construct( array $params ) {
-		parent::__construct( $params );
-		$this->cache = isset( $params['objectCache'] )
-			? wfGetCache( $params['objectCache'] )
-			: wfGetMainCache();
-		$this->cacheTTL = isset( $params['cacheTTL'] ) ? $params['cacheTTL'] : 180; // 3 min
-	}
-
-	/**
-	 * @see JobQueueAggregator::doNotifyQueueEmpty()
-	 */
-	protected function doNotifyQueueEmpty( $wiki, $type ) {
-		$key = $this->getReadyQueueCacheKey();
-		// Delist the queue from the "ready queue" list
-		if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
-			$curInfo = $this->cache->get( $key );
-			if ( is_array( $curInfo ) && isset( $curInfo['pendingDBs'][$type] ) ) {
-				if ( in_array( $wiki, $curInfo['pendingDBs'][$type] ) ) {
-					$curInfo['pendingDBs'][$type] = array_diff(
-						$curInfo['pendingDBs'][$type], array( $wiki ) );
-					$this->cache->set( $key, $curInfo );
-				}
-			}
-			$this->cache->delete( "$key:lock" ); // unlock
-		}
-		return true;
-	}
-
-	/**
-	 * @see JobQueueAggregator::doNotifyQueueNonEmpty()
-	 */
-	protected function doNotifyQueueNonEmpty( $wiki, $type ) {
-		return true; // updated periodically
-	}
-
-	/**
-	 * @see JobQueueAggregator::doAllGetReadyWikiQueues()
-	 */
-	protected function doGetAllReadyWikiQueues() {
-		$key = $this->getReadyQueueCacheKey();
-		// If the cache entry wasn't present, is stale, or in .1% of cases otherwise,
-		// regenerate the cache. Use any available stale cache if another process is
-		// currently regenerating the pending DB information.
-		$pendingDbInfo = $this->cache->get( $key );
-		if ( !is_array( $pendingDbInfo )
-			|| ( time() - $pendingDbInfo['timestamp'] ) > $this->cacheTTL
-			|| mt_rand( 0, 999 ) == 0
-		) {
-			if ( $this->cache->add( "$key:rebuild", 1, 1800 ) ) { // lock
-				$pendingDbInfo = array(
-					'pendingDBs' => $this->findPendingWikiQueues(),
-					'timestamp'  => time()
-				);
-				for ( $attempts=1; $attempts <= 25; ++$attempts ) {
-					if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
-						$this->cache->set( $key, $pendingDbInfo );
-						$this->cache->delete( "$key:lock" ); // unlock
-						break;
-					}
-				}
-				$this->cache->delete( "$key:rebuild" ); // unlock
-			}
-		}
-		return is_array( $pendingDbInfo )
-			? $pendingDbInfo['pendingDBs']
-			: array(); // cache is both empty and locked
-	}
-
-	/**
-	 * @return string
-	 */
-	private function getReadyQueueCacheKey() {
-		return "jobqueue:aggregator:ready-queues:v1"; // global
-	}
-}
diff --git a/includes/job/JobQueueAggregatorRedis.php b/includes/job/JobQueueAggregatorRedis.php
deleted file mode 100644
index 74e9171c..00000000
--- a/includes/job/JobQueueAggregatorRedis.php
+++ /dev/null
@@ -1,165 +0,0 @@
-<?php
-/**
- * Job queue aggregator code that uses PhpRedis.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Aaron Schulz
- */
-
-/**
- * Class to handle tracking information about all queues using PhpRedis
- *
- * @ingroup JobQueue
- * @since 1.21
- */
-class JobQueueAggregatorRedis extends JobQueueAggregator {
-	/** @var RedisConnectionPool */
-	protected $redisPool;
-
-	/**
-	 * @params include:
-	 *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
-	 *   - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
-	 *                   If a hostname is specified but no port, the standard port number
-	 *                   6379 will be used. Required.
-	 * @param array $params
-	 */
-	protected function __construct( array $params ) {
-		parent::__construct( $params );
-		$this->server = $params['redisServer'];
-		$this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
-	}
-
-	/**
-	 * @see JobQueueAggregator::doNotifyQueueEmpty()
-	 */
-	protected function doNotifyQueueEmpty( $wiki, $type ) {
-		$conn = $this->getConnection();
-		if ( !$conn ) {
-			return false;
-		}
-		try {
-			$conn->hDel( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ) );
-			return true;
-		} catch ( RedisException $e ) {
-			$this->handleException( $conn, $e );
-			return false;
-		}
-	}
-
-	/**
-	 * @see JobQueueAggregator::doNotifyQueueNonEmpty()
-	 */
-	protected function doNotifyQueueNonEmpty( $wiki, $type ) {
-		$conn = $this->getConnection();
-		if ( !$conn ) {
-			return false;
-		}
-		try {
-			$conn->hSet( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ), time() );
-			return true;
-		} catch ( RedisException $e ) {
-			$this->handleException( $conn, $e );
-			return false;
-		}
-	}
-
-	/**
-	 * @see JobQueueAggregator::doAllGetReadyWikiQueues()
-	 */
-	protected function doGetAllReadyWikiQueues() {
-		$conn = $this->getConnection();
-		if ( !$conn ) {
-			return array();
-		}
-		try {
-			$conn->multi( Redis::PIPELINE );
-			$conn->exists( $this->getReadyQueueKey() );
-			$conn->hGetAll( $this->getReadyQueueKey() );
-			list( $exists, $map ) = $conn->exec();
-
-			if ( $exists ) { // cache hit
-				$pendingDBs = array(); // (type => list of wikis)
-				foreach ( $map as $key => $time ) {
-					list( $type, $wiki ) = $this->dencQueueName( $key );
-					$pendingDBs[$type][] = $wiki;
-				}
-			} else { // cache miss
-				$pendingDBs = $this->findPendingWikiQueues(); // (type => list of wikis)
-
-				$now = time();
-				$map = array();
-				foreach ( $pendingDBs as $type => $wikis ) {
-					foreach ( $wikis as $wiki ) {
-						$map[$this->encQueueName( $type, $wiki )] = $now;
-					}
-				}
-				$conn->hMSet( $this->getReadyQueueKey(), $map );
-			}
-
-			return $pendingDBs;
-		} catch ( RedisException $e ) {
-			$this->handleException( $conn, $e );
-			return array();
-		}
-	}
-
-	/**
-	 * Get a connection to the server that handles all sub-queues for this queue
-	 *
-	 * @return Array (server name, Redis instance)
-	 * @throws MWException
-	 */
-	protected function getConnection() {
-		return $this->redisPool->getConnection( $this->server );
-	}
-
-	/**
-	 * @param RedisConnRef $conn
-	 * @param RedisException $e
-	 * @return void
-	 */
-	protected function handleException( RedisConnRef $conn, $e ) {
-		$this->redisPool->handleException( $this->server, $conn, $e );
-	}
-
-	/**
-	 * @return string
-	 */
-	private function getReadyQueueKey() {
-		return "jobqueue:aggregator:h-ready-queues:v1"; // global
-	}
-
-	/**
-	 * @param string $type
-	 * @param string $wiki
-	 * @return string
-	 */
-	private function encQueueName( $type, $wiki ) {
-		return rawurlencode( $type ) . '/' . rawurlencode( $wiki );
-	}
-
-	/**
-	 * @param string $name
-	 * @return string
-	 */
-	private function dencQueueName( $name ) {
-		list( $type, $wiki ) = explode( '/', $name, 2 );
-		return array( rawurldecode( $type ), rawurldecode( $wiki ) );
-	}
-}
diff --git a/includes/job/JobQueueDB.php b/includes/job/JobQueueDB.php
index ff7f7abc..c39083df 100644
--- a/includes/job/JobQueueDB.php
+++ b/includes/job/JobQueueDB.php
@@ -28,13 +28,15 @@
  * @since 1.21
  */
 class JobQueueDB extends JobQueue {
-	const ROOTJOB_TTL = 1209600; // integer; seconds to remember root jobs (14 days)
 	const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
 	const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
 	const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed
 	const MAX_JOB_RANDOM = 2147483647; // integer; 2^31 - 1, used for job_random
 	const MAX_OFFSET = 255; // integer; maximum number of rows to skip
 
+	/** @var BagOStuff */
+	protected $cache;
+
 	protected $cluster = false; // string; name of an external DB cluster
 
 	/**
@@ -46,8 +48,13 @@ class JobQueueDB extends JobQueue {
 	 * @param $params array
 	 */
 	protected function __construct( array $params ) {
+		global $wgMemc;
+
 		parent::__construct( $params );
+
 		$this->cluster = isset( $params['cluster'] ) ? $params['cluster'] : false;
+		// Make sure that we don't use the SQL cache, which would be harmful
+		$this->cache = ( $wgMemc instanceof SqlBagOStuff ) ? new EmptyBagOStuff() : $wgMemc;
 	}
 
 	protected function supportedOrders() {
@@ -63,22 +70,24 @@ class JobQueueDB extends JobQueue {
 	 * @return bool
 	 */
 	protected function doIsEmpty() {
-		global $wgMemc;
-
 		$key = $this->getCacheKey( 'empty' );
 
-		$isEmpty = $wgMemc->get( $key );
+		$isEmpty = $this->cache->get( $key );
 		if ( $isEmpty === 'true' ) {
 			return true;
 		} elseif ( $isEmpty === 'false' ) {
 			return false;
 		}
 
-		list( $dbr, $scope ) = $this->getSlaveDB();
-		$found = $dbr->selectField( // unclaimed job
-			'job', '1', array( 'job_cmd' => $this->type, 'job_token' => '' ), __METHOD__
-		);
-		$wgMemc->add( $key, $found ? 'false' : 'true', self::CACHE_TTL_LONG );
+		$dbr = $this->getSlaveDB();
+		try {
+			$found = $dbr->selectField( // unclaimed job
+				'job', '1', array( 'job_cmd' => $this->type, 'job_token' => '' ), __METHOD__
+			);
+		} catch ( DBError $e ) {
+			$this->throwDBException( $e );
+		}
+		$this->cache->add( $key, $found ? 'false' : 'true', self::CACHE_TTL_LONG );
 
 		return !$found;
 	}
@@ -88,21 +97,23 @@ class JobQueueDB extends JobQueue {
 	 * @return integer
 	 */
 	protected function doGetSize() {
-		global $wgMemc;
-
 		$key = $this->getCacheKey( 'size' );
 
-		$size = $wgMemc->get( $key );
+		$size = $this->cache->get( $key );
 		if ( is_int( $size ) ) {
 			return $size;
 		}
 
-		list( $dbr, $scope ) = $this->getSlaveDB();
-		$size = (int)$dbr->selectField( 'job', 'COUNT(*)',
-			array( 'job_cmd' => $this->type, 'job_token' => '' ),
-			__METHOD__
-		);
-		$wgMemc->set( $key, $size, self::CACHE_TTL_SHORT );
+		try {
+			$dbr = $this->getSlaveDB();
+			$size = (int)$dbr->selectField( 'job', 'COUNT(*)',
+				array( 'job_cmd' => $this->type, 'job_token' => '' ),
+				__METHOD__
+			);
+		} catch ( DBError $e ) {
+			$this->throwDBException( $e );
+		}
+		$this->cache->set( $key, $size, self::CACHE_TTL_SHORT );
 
 		return $size;
 	}
@@ -112,24 +123,63 @@ class JobQueueDB extends JobQueue {
 	 * @return integer
 	 */
 	protected function doGetAcquiredCount() {
+		if ( $this->claimTTL <= 0 ) {
+			return 0; // no acknowledgements
+		}
+
+		$key = $this->getCacheKey( 'acquiredcount' );
+
+		$count = $this->cache->get( $key );
+		if ( is_int( $count ) ) {
+			return $count;
+		}
+
+		$dbr = $this->getSlaveDB();
+		try {
+			$count = (int)$dbr->selectField( 'job', 'COUNT(*)',
+				array( 'job_cmd' => $this->type, "job_token != {$dbr->addQuotes( '' )}" ),
+				__METHOD__
+			);
+		} catch ( DBError $e ) {
+			$this->throwDBException( $e );
+		}
+		$this->cache->set( $key, $count, self::CACHE_TTL_SHORT );
+
+		return $count;
+	}
+
+	/**
+	 * @see JobQueue::doGetAbandonedCount()
+	 * @return integer
+	 * @throws MWException
+	 */
+	protected function doGetAbandonedCount() {
 		global $wgMemc;
 
 		if ( $this->claimTTL <= 0 ) {
 			return 0; // no acknowledgements
 		}
 
-		$key = $this->getCacheKey( 'acquiredcount' );
+		$key = $this->getCacheKey( 'abandonedcount' );
 
 		$count = $wgMemc->get( $key );
 		if ( is_int( $count ) ) {
 			return $count;
 		}
 
-		list( $dbr, $scope ) = $this->getSlaveDB();
-		$count = (int)$dbr->selectField( 'job', 'COUNT(*)',
-			array( 'job_cmd' => $this->type, "job_token != {$dbr->addQuotes( '' )}" ),
-			__METHOD__
-		);
+		$dbr = $this->getSlaveDB();
+		try {
+			$count = (int)$dbr->selectField( 'job', 'COUNT(*)',
+				array(
+					'job_cmd' => $this->type,
+					"job_token != {$dbr->addQuotes( '' )}",
+					"job_attempts >= " . $dbr->addQuotes( $this->maxTries )
+				),
+				__METHOD__
+			);
+		} catch ( DBError $e ) {
+			$this->throwDBException( $e );
+		}
 		$wgMemc->set( $key, $count, self::CACHE_TTL_SHORT );
 
 		return $count;
@@ -143,70 +193,84 @@ class JobQueueDB extends JobQueue {
 	 * @return bool
 	 */
 	protected function doBatchPush( array $jobs, $flags ) {
-		if ( count( $jobs ) ) {
-			list( $dbw, $scope ) = $this->getMasterDB();
-
-			$rowSet = array(); // (sha1 => job) map for jobs that are de-duplicated
-			$rowList = array(); // list of jobs for jobs that are are not de-duplicated
-
-			foreach ( $jobs as $job ) {
-				$row = $this->insertFields( $job );
-				if ( $job->ignoreDuplicates() ) {
-					$rowSet[$row['job_sha1']] = $row;
-				} else {
-					$rowList[] = $row;
-				}
+		$dbw = $this->getMasterDB();
+
+		$that = $this;
+		$method = __METHOD__;
+		$dbw->onTransactionIdle(
+			function() use ( $dbw, $that, $jobs, $flags, $method ) {
+				$that->doBatchPushInternal( $dbw, $jobs, $flags, $method );
 			}
+		);
 
-			$key = $this->getCacheKey( 'empty' );
-			$atomic = ( $flags & self::QoS_Atomic );
+		return true;
+	}
 
-			$dbw->onTransactionIdle(
-				function() use ( $dbw, $rowSet, $rowList, $atomic, $key, $scope
-			) {
-				global $wgMemc;
+	/**
+	 * This function should *not* be called outside of JobQueueDB
+	 *
+	 * @param DatabaseBase $dbw
+	 * @param array $jobs
+	 * @param int $flags
+	 * @param string $method
+	 * @return boolean
+	 * @throws type
+	 */
+	public function doBatchPushInternal( IDatabase $dbw, array $jobs, $flags, $method ) {
+		if ( !count( $jobs ) ) {
+			return true;
+		}
 
-				if ( $atomic ) {
-					$dbw->begin( __METHOD__ ); // wrap all the job additions in one transaction
-				}
-				try {
-					// Strip out any duplicate jobs that are already in the queue...
-					if ( count( $rowSet ) ) {
-						$res = $dbw->select( 'job', 'job_sha1',
-							array(
-								// No job_type condition since it's part of the job_sha1 hash
-								'job_sha1'  => array_keys( $rowSet ),
-								'job_token' => '' // unclaimed
-							),
-							__METHOD__
-						);
-						foreach ( $res as $row ) {
-							wfDebug( "Job with hash '{$row->job_sha1}' is a duplicate." );
-							unset( $rowSet[$row->job_sha1] ); // already enqueued
-						}
-					}
-					// Build the full list of job rows to insert
-					$rows = array_merge( $rowList, array_values( $rowSet ) );
-					// Insert the job rows in chunks to avoid slave lag...
-					foreach ( array_chunk( $rows, 50 ) as $rowBatch ) {
-						$dbw->insert( 'job', $rowBatch, __METHOD__ );
-					}
-					wfIncrStats( 'job-insert', count( $rows ) );
-					wfIncrStats( 'job-insert-duplicate',
-						count( $rowSet ) + count( $rowList ) - count( $rows ) );
-				} catch ( DBError $e ) {
-					if ( $atomic ) {
-						$dbw->rollback( __METHOD__ );
-					}
-					throw $e;
-				}
-				if ( $atomic ) {
-					$dbw->commit( __METHOD__ );
-				}
+		$rowSet = array(); // (sha1 => job) map for jobs that are de-duplicated
+		$rowList = array(); // list of jobs for jobs that are are not de-duplicated
+		foreach ( $jobs as $job ) {
+			$row = $this->insertFields( $job );
+			if ( $job->ignoreDuplicates() ) {
+				$rowSet[$row['job_sha1']] = $row;
+			} else {
+				$rowList[] = $row;
+			}
+		}
 
-				$wgMemc->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
-			} );
+		if ( $flags & self::QOS_ATOMIC ) {
+			$dbw->begin( $method ); // wrap all the job additions in one transaction
+		}
+		try {
+			// Strip out any duplicate jobs that are already in the queue...
+			if ( count( $rowSet ) ) {
+				$res = $dbw->select( 'job', 'job_sha1',
+					array(
+						// No job_type condition since it's part of the job_sha1 hash
+						'job_sha1' => array_keys( $rowSet ),
+						'job_token' => '' // unclaimed
+					),
+					$method
+				);
+				foreach ( $res as $row ) {
+					wfDebug( "Job with hash '{$row->job_sha1}' is a duplicate.\n" );
+					unset( $rowSet[$row->job_sha1] ); // already enqueued
+				}
+			}
+			// Build the full list of job rows to insert
+			$rows = array_merge( $rowList, array_values( $rowSet ) );
+			// Insert the job rows in chunks to avoid slave lag...
+			foreach ( array_chunk( $rows, 50 ) as $rowBatch ) {
+				$dbw->insert( 'job', $rowBatch, $method );
+			}
+			JobQueue::incrStats( 'job-insert', $this->type, count( $rows ) );
+			JobQueue::incrStats( 'job-insert-duplicate', $this->type,
+				count( $rowSet ) + count( $rowList ) - count( $rows ) );
+		} catch ( DBError $e ) {
+			if ( $flags & self::QOS_ATOMIC ) {
+				$dbw->rollback( $method );
+			}
+			throw $e;
 		}
+		if ( $flags & self::QOS_ATOMIC ) {
+			$dbw->commit( $method );
+		}
+
+		$this->cache->set( $this->getCacheKey( 'empty' ), 'false', JobQueueDB::CACHE_TTL_LONG );
 
 		return true;
 	}
@@ -216,54 +280,52 @@ class JobQueueDB extends JobQueue {
 	 * @return Job|bool
 	 */
 	protected function doPop() {
-		global $wgMemc;
-
-		if ( $wgMemc->get( $this->getCacheKey( 'empty' ) ) === 'true' ) {
+		if ( $this->cache->get( $this->getCacheKey( 'empty' ) ) === 'true' ) {
 			return false; // queue is empty
 		}
 
-		list( $dbw, $scope ) = $this->getMasterDB();
-		$dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
-		$autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
-		$dbw->clearFlag( DBO_TRX ); // make each query its own transaction
-		$scopedReset = new ScopedCallback( function() use ( $dbw, $autoTrx ) {
-			$dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
-		} );
+		$dbw = $this->getMasterDB();
+		try {
+			$dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+			$autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
+			$dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+			$scopedReset = new ScopedCallback( function() use ( $dbw, $autoTrx ) {
+				$dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
+			} );
 
-		$uuid = wfRandomString( 32 ); // pop attempt
-		$job = false; // job popped off
-		do { // retry when our row is invalid or deleted as a duplicate
-			// Try to reserve a row in the DB...
-			if ( in_array( $this->order, array( 'fifo', 'timestamp' ) ) ) {
-				$row = $this->claimOldest( $uuid );
-			} else { // random first
-				$rand = mt_rand( 0, self::MAX_JOB_RANDOM ); // encourage concurrent UPDATEs
-				$gte = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
-				$row = $this->claimRandom( $uuid, $rand, $gte );
-			}
-			// Check if we found a row to reserve...
-			if ( !$row ) {
-				$wgMemc->set( $this->getCacheKey( 'empty' ), 'true', self::CACHE_TTL_LONG );
-				break; // nothing to do
-			}
-			wfIncrStats( 'job-pop' );
-			// Get the job object from the row...
-			$title = Title::makeTitleSafe( $row->job_namespace, $row->job_title );
-			if ( !$title ) {
-				$dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-				wfDebugLog( 'JobQueueDB', "Row has invalid title '{$row->job_title}'." );
-				continue; // try again
-			}
-			$job = Job::factory( $row->job_cmd, $title,
-				self::extractBlob( $row->job_params ), $row->job_id );
-			$job->id = $row->job_id; // XXX: work around broken subclasses
-			// Flag this job as an old duplicate based on its "root" job...
-			if ( $this->isRootJobOldDuplicate( $job ) ) {
-				wfIncrStats( 'job-pop-duplicate' );
-				$job = DuplicateJob::newFromJob( $job ); // convert to a no-op
-			}
-			break; // done
-		} while( true );
+			$uuid = wfRandomString( 32 ); // pop attempt
+			$job = false; // job popped off
+			do { // retry when our row is invalid or deleted as a duplicate
+				// Try to reserve a row in the DB...
+				if ( in_array( $this->order, array( 'fifo', 'timestamp' ) ) ) {
+					$row = $this->claimOldest( $uuid );
+				} else { // random first
+					$rand = mt_rand( 0, self::MAX_JOB_RANDOM ); // encourage concurrent UPDATEs
+					$gte = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
+					$row = $this->claimRandom( $uuid, $rand, $gte );
+				}
+				// Check if we found a row to reserve...
+				if ( !$row ) {
+					$this->cache->set( $this->getCacheKey( 'empty' ), 'true', self::CACHE_TTL_LONG );
+					break; // nothing to do
+				}
+				JobQueue::incrStats( 'job-pop', $this->type );
+				// Get the job object from the row...
+				$title = Title::makeTitleSafe( $row->job_namespace, $row->job_title );
+				if ( !$title ) {
+					$dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
+					wfDebug( "Row has invalid title '{$row->job_title}'." );
+					continue; // try again
+				}
+				$job = Job::factory( $row->job_cmd, $title,
+					self::extractBlob( $row->job_params ), $row->job_id );
+				$job->metadata['id'] = $row->job_id;
+				$job->id = $row->job_id; // XXX: work around broken subclasses
+				break; // done
+			} while ( true );
+		} catch ( DBError $e ) {
+			$this->throwDBException( $e );
+		}
 
 		return $job;
 	}
@@ -277,11 +339,9 @@ class JobQueueDB extends JobQueue {
 	 * @return Row|false
 	 */
 	protected function claimRandom( $uuid, $rand, $gte ) {
-		global $wgMemc;
-
-		list( $dbw, $scope ) = $this->getMasterDB();
+		$dbw = $this->getMasterDB();
 		// Check cache to see if the queue has <= OFFSET items
-		$tinyQueue = $wgMemc->get( $this->getCacheKey( 'small' ) );
+		$tinyQueue = $this->cache->get( $this->getCacheKey( 'small' ) );
 
 		$row = false; // the row acquired
 		$invertedDirection = false; // whether one job_random direction was already scanned
@@ -297,7 +357,7 @@ class JobQueueDB extends JobQueue {
 				$dir = $gte ? 'ASC' : 'DESC';
 				$row = $dbw->selectRow( 'job', '*', // find a random job
 					array(
-						'job_cmd'   => $this->type,
+						'job_cmd' => $this->type,
 						'job_token' => '', // unclaimed
 						"job_random {$ineq} {$dbw->addQuotes( $rand )}" ),
 					__METHOD__,
@@ -314,7 +374,7 @@ class JobQueueDB extends JobQueue {
 				// instead of job_random for reducing excess claim retries.
 				$row = $dbw->selectRow( 'job', '*', // find a random job
 					array(
-						'job_cmd'   => $this->type,
+						'job_cmd' => $this->type,
 						'job_token' => '', // unclaimed
 					),
 					__METHOD__,
@@ -322,14 +382,14 @@ class JobQueueDB extends JobQueue {
 				);
 				if ( !$row ) {
 					$tinyQueue = true; // we know the queue must have <= MAX_OFFSET rows
-					$wgMemc->set( $this->getCacheKey( 'small' ), 1, 30 );
+					$this->cache->set( $this->getCacheKey( 'small' ), 1, 30 );
 					continue; // use job_random
 				}
 			}
 			if ( $row ) { // claim the job
 				$dbw->update( 'job', // update by PK
 					array(
-						'job_token'           => $uuid,
+						'job_token' => $uuid,
 						'job_token_timestamp' => $dbw->timestamp(),
 						'job_attempts = job_attempts+1' ),
 					array( 'job_cmd' => $this->type, 'job_id' => $row->job_id, 'job_token' => '' ),
@@ -355,7 +415,7 @@ class JobQueueDB extends JobQueue {
 	 * @return Row|false
 	 */
 	protected function claimOldest( $uuid ) {
-		list( $dbw, $scope ) = $this->getMasterDB();
+		$dbw = $this->getMasterDB();
 
 		$row = false; // the row acquired
 		do {
@@ -380,7 +440,7 @@ class JobQueueDB extends JobQueue {
 				// This uses as much of the DB wrapper functions as possible.
 				$dbw->update( 'job',
 					array(
-						'job_token'           => $uuid,
+						'job_token' => $uuid,
 						'job_token_timestamp' => $dbw->timestamp(),
 						'job_attempts = job_attempts+1' ),
 					array( 'job_id = (' .
@@ -399,7 +459,7 @@ class JobQueueDB extends JobQueue {
 					array( 'job_cmd' => $this->type, 'job_token' => $uuid ), __METHOD__
 				);
 				if ( !$row ) { // raced out by duplicate job removal
-					wfDebugLog( 'JobQueueDB', "Row deleted as duplicate by another process." );
+					wfDebug( "Row deleted as duplicate by another process." );
 				}
 			} else {
 				break; // nothing to do
@@ -409,79 +469,6 @@ class JobQueueDB extends JobQueue {
 		return $row;
 	}
 
-	/**
-	 * Recycle or destroy any jobs that have been claimed for too long
-	 *
-	 * @return integer Number of jobs recycled/deleted
-	 */
-	public function recycleAndDeleteStaleJobs() {
-		global $wgMemc;
-
-		$now = time();
-		list( $dbw, $scope ) = $this->getMasterDB();
-		$count = 0; // affected rows
-
-		if ( !$dbw->lock( "jobqueue-recycle-{$this->type}", __METHOD__, 1 ) ) {
-			return $count; // already in progress
-		}
-
-		// Remove claims on jobs acquired for too long if enabled...
-		if ( $this->claimTTL > 0 ) {
-			$claimCutoff = $dbw->timestamp( $now - $this->claimTTL );
-			// Get the IDs of jobs that have be claimed but not finished after too long.
-			// These jobs can be recycled into the queue by expiring the claim. Selecting
-			// the IDs first means that the UPDATE can be done by primary key (less deadlocks).
-			$res = $dbw->select( 'job', 'job_id',
-				array(
-					'job_cmd' => $this->type,
-					"job_token != {$dbw->addQuotes( '' )}", // was acquired
-					"job_token_timestamp < {$dbw->addQuotes( $claimCutoff )}", // stale
-					"job_attempts < {$dbw->addQuotes( $this->maxTries )}" ), // retries left
-				__METHOD__
-			);
-			$ids = array_map( function( $o ) { return $o->job_id; }, iterator_to_array( $res ) );
-			if ( count( $ids ) ) {
-				// Reset job_token for these jobs so that other runners will pick them up.
-				// Set the timestamp to the current time, as it is useful to now that the job
-				// was already tried before (the timestamp becomes the "released" time).
-				$dbw->update( 'job',
-					array(
-						'job_token' => '',
-						'job_token_timestamp' => $dbw->timestamp( $now ) ), // time of release
-					array(
-						'job_id' => $ids ),
-					__METHOD__
-				);
-				$count += $dbw->affectedRows();
-				wfIncrStats( 'job-recycle', $dbw->affectedRows() );
-				$wgMemc->set( $this->getCacheKey( 'empty' ), 'false', self::CACHE_TTL_LONG );
-			}
-		}
-
-		// Just destroy any stale jobs...
-		$pruneCutoff = $dbw->timestamp( $now - self::MAX_AGE_PRUNE );
-		$conds = array(
-			'job_cmd' => $this->type,
-			"job_token != {$dbw->addQuotes( '' )}", // was acquired
-			"job_token_timestamp < {$dbw->addQuotes( $pruneCutoff )}" // stale
-		);
-		if ( $this->claimTTL > 0 ) { // only prune jobs attempted too many times...
-			$conds[] = "job_attempts >= {$dbw->addQuotes( $this->maxTries )}";
-		}
-		// Get the IDs of jobs that are considered stale and should be removed. Selecting
-		// the IDs first means that the UPDATE can be done by primary key (less deadlocks).
-		$res = $dbw->select( 'job', 'job_id', $conds, __METHOD__ );
-		$ids = array_map( function( $o ) { return $o->job_id; }, iterator_to_array( $res ) );
-		if ( count( $ids ) ) {
-			$dbw->delete( 'job', array( 'job_id' => $ids ), __METHOD__ );
-			$count += $dbw->affectedRows();
-		}
-
-		$dbw->unlock( "jobqueue-recycle-{$this->type}", __METHOD__ );
-
-		return $count;
-	}
-
 	/**
 	 * @see JobQueue::doAck()
 	 * @param Job $job
@@ -489,21 +476,25 @@ class JobQueueDB extends JobQueue {
 	 * @return Job|bool
 	 */
 	protected function doAck( Job $job ) {
-		if ( !$job->getId() ) {
+		if ( !isset( $job->metadata['id'] ) ) {
 			throw new MWException( "Job of type '{$job->getType()}' has no ID." );
 		}
 
-		list( $dbw, $scope ) = $this->getMasterDB();
-		$dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
-		$autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
-		$dbw->clearFlag( DBO_TRX ); // make each query its own transaction
-		$scopedReset = new ScopedCallback( function() use ( $dbw, $autoTrx ) {
-			$dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
-		} );
+		$dbw = $this->getMasterDB();
+		try {
+			$dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+			$autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
+			$dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+			$scopedReset = new ScopedCallback( function() use ( $dbw, $autoTrx ) {
+				$dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
+			} );
 
-		// Delete a row with a single DELETE without holding row locks over RTTs...
-		$dbw->delete( 'job',
-			array( 'job_cmd' => $this->type, 'job_id' => $job->getId() ), __METHOD__ );
+			// Delete a row with a single DELETE without holding row locks over RTTs...
+			$dbw->delete( 'job',
+				array( 'job_cmd' => $this->type, 'job_id' => $job->metadata['id'] ), __METHOD__ );
+		} catch ( DBError $e ) {
+			$this->throwDBException( $e );
+		}
 
 		return true;
 	}
@@ -527,44 +518,33 @@ class JobQueueDB extends JobQueue {
 		// deferred till "transaction idle", do the same here, so that the ordering is
 		// maintained. Having only the de-duplication registration succeed would cause
 		// jobs to become no-ops without any actual jobs that made them redundant.
-		list( $dbw, $scope ) = $this->getMasterDB();
-		$dbw->onTransactionIdle( function() use ( $params, $key, $scope ) {
-			global $wgMemc;
-
-			$timestamp = $wgMemc->get( $key ); // current last timestamp of this job
+		$dbw = $this->getMasterDB();
+		$cache = $this->dupCache;
+		$dbw->onTransactionIdle( function() use ( $cache, $params, $key, $dbw ) {
+			$timestamp = $cache->get( $key ); // current last timestamp of this job
 			if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
 				return true; // a newer version of this root job was enqueued
 			}
 
 			// Update the timestamp of the last root job started at the location...
-			return $wgMemc->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
+			return $cache->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
 		} );
 
 		return true;
 	}
 
 	/**
-	 * Check if the "root" job of a given job has been superseded by a newer one
-	 *
-	 * @param $job Job
+	 * @see JobQueue::doDelete()
 	 * @return bool
 	 */
-	protected function isRootJobOldDuplicate( Job $job ) {
-		global $wgMemc;
-
-		$params = $job->getParams();
-		if ( !isset( $params['rootJobSignature'] ) ) {
-			return false; // job has no de-deplication info
-		} elseif ( !isset( $params['rootJobTimestamp'] ) ) {
-			trigger_error( "Cannot check root job; missing 'rootJobTimestamp'." );
-			return false;
+	protected function doDelete() {
+		$dbw = $this->getMasterDB();
+		try {
+			$dbw->delete( 'job', array( 'job_cmd' => $this->type ) );
+		} catch ( DBError $e ) {
+			$this->throwDBException( $e );
 		}
-
-		// Get the last time this root job was enqueued
-		$timestamp = $wgMemc->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
-
-		// Check if a new root job was started at the location after this one's...
-		return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
+		return true;
 	}
 
 	/**
@@ -582,7 +562,7 @@ class JobQueueDB extends JobQueue {
 		return array(
 			'recycleAndDeleteStaleJobs' => array(
 				'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
-				'period'   => ceil( $this->claimTTL / 2 )
+				'period' => ceil( $this->claimTTL / 2 )
 			)
 		);
 	}
@@ -591,10 +571,8 @@ class JobQueueDB extends JobQueue {
 	 * @return void
 	 */
 	protected function doFlushCaches() {
-		global $wgMemc;
-
 		foreach ( array( 'empty', 'size', 'acquiredcount' ) as $type ) {
-			$wgMemc->delete( $this->getCacheKey( $type ) );
+			$this->cache->delete( $this->getCacheKey( $type ) );
 		}
 	}
 
@@ -603,51 +581,140 @@ class JobQueueDB extends JobQueue {
 	 * @return Iterator
 	 */
 	public function getAllQueuedJobs() {
-		list( $dbr, $scope ) = $this->getSlaveDB();
-		return new MappedIterator(
-			$dbr->select( 'job', '*', array( 'job_cmd' => $this->getType(), 'job_token' => '' ) ),
-			function( $row ) use ( $scope ) {
-				$job = Job::factory(
-					$row->job_cmd,
-					Title::makeTitle( $row->job_namespace, $row->job_title ),
-					strlen( $row->job_params ) ? unserialize( $row->job_params ) : false,
-					$row->job_id
-				);
-				$job->id = $row->job_id; // XXX: work around broken subclasses
-				return $job;
-			}
-		);
+		$dbr = $this->getSlaveDB();
+		try {
+			return new MappedIterator(
+				$dbr->select( 'job', '*',
+					array( 'job_cmd' => $this->getType(), 'job_token' => '' ) ),
+				function( $row ) use ( $dbr ) {
+					$job = Job::factory(
+						$row->job_cmd,
+						Title::makeTitle( $row->job_namespace, $row->job_title ),
+						strlen( $row->job_params ) ? unserialize( $row->job_params ) : false,
+						$row->job_id
+					);
+					$job->metadata['id'] = $row->job_id;
+					$job->id = $row->job_id; // XXX: work around broken subclasses
+					return $job;
+				}
+			);
+		} catch ( DBError $e ) {
+			$this->throwDBException( $e );
+		}
 	}
 
-	/**
-	 * @return Array (DatabaseBase, ScopedCallback)
-	 */
-	protected function getSlaveDB() {
-		return $this->getDB( DB_SLAVE );
+	public function getCoalesceLocationInternal() {
+		return $this->cluster
+			? "DBCluster:{$this->cluster}:{$this->wiki}"
+			: "LBFactory:{$this->wiki}";
 	}
 
-	/**
-	 * @return Array (DatabaseBase, ScopedCallback)
-	 */
-	protected function getMasterDB() {
-		return $this->getDB( DB_MASTER );
+	protected function doGetSiblingQueuesWithJobs( array $types ) {
+		$dbr = $this->getSlaveDB();
+		$res = $dbr->select( 'job', 'DISTINCT job_cmd',
+			array( 'job_cmd' => $types ), __METHOD__ );
+
+		$types = array();
+		foreach ( $res as $row ) {
+			$types[] = $row->job_cmd;
+		}
+		return $types;
+	}
+
+	protected function doGetSiblingQueueSizes( array $types ) {
+		$dbr = $this->getSlaveDB();
+		$res = $dbr->select( 'job', array( 'job_cmd', 'COUNT(*) AS count' ),
+			array( 'job_cmd' => $types ), __METHOD__, array( 'GROUP BY' => 'job_cmd' ) );
+
+		$sizes = array();
+		foreach ( $res as $row ) {
+			$sizes[$row->job_cmd] = (int)$row->count;
+		}
+		return $sizes;
 	}
 
 	/**
-	 * @param $index integer (DB_SLAVE/DB_MASTER)
-	 * @return Array (DatabaseBase, ScopedCallback)
+	 * Recycle or destroy any jobs that have been claimed for too long
+	 *
+	 * @return integer Number of jobs recycled/deleted
 	 */
-	protected function getDB( $index ) {
-		$lb = ( $this->cluster !== false )
-			? wfGetLBFactory()->getExternalLB( $this->cluster, $this->wiki )
-			: wfGetLB( $this->wiki );
-		$conn = $lb->getConnection( $index, array(), $this->wiki );
-		return array(
-			$conn,
-			new ScopedCallback( function() use ( $lb, $conn ) {
-				$lb->reuseConnection( $conn );
-			} )
-		);
+	public function recycleAndDeleteStaleJobs() {
+		$now = time();
+		$count = 0; // affected rows
+		$dbw = $this->getMasterDB();
+
+		try {
+			if ( !$dbw->lock( "jobqueue-recycle-{$this->type}", __METHOD__, 1 ) ) {
+				return $count; // already in progress
+			}
+
+			// Remove claims on jobs acquired for too long if enabled...
+			if ( $this->claimTTL > 0 ) {
+				$claimCutoff = $dbw->timestamp( $now - $this->claimTTL );
+				// Get the IDs of jobs that have be claimed but not finished after too long.
+				// These jobs can be recycled into the queue by expiring the claim. Selecting
+				// the IDs first means that the UPDATE can be done by primary key (less deadlocks).
+				$res = $dbw->select( 'job', 'job_id',
+					array(
+						'job_cmd' => $this->type,
+						"job_token != {$dbw->addQuotes( '' )}", // was acquired
+						"job_token_timestamp < {$dbw->addQuotes( $claimCutoff )}", // stale
+						"job_attempts < {$dbw->addQuotes( $this->maxTries )}" ), // retries left
+					__METHOD__
+				);
+				$ids = array_map(
+					function( $o ) {
+						return $o->job_id;
+					}, iterator_to_array( $res )
+				);
+				if ( count( $ids ) ) {
+					// Reset job_token for these jobs so that other runners will pick them up.
+					// Set the timestamp to the current time, as it is useful to now that the job
+					// was already tried before (the timestamp becomes the "released" time).
+					$dbw->update( 'job',
+						array(
+							'job_token' => '',
+							'job_token_timestamp' => $dbw->timestamp( $now ) ), // time of release
+						array(
+							'job_id' => $ids ),
+						__METHOD__
+					);
+					$count += $dbw->affectedRows();
+					JobQueue::incrStats( 'job-recycle', $this->type, $dbw->affectedRows() );
+					$this->cache->set( $this->getCacheKey( 'empty' ), 'false', self::CACHE_TTL_LONG );
+				}
+			}
+
+			// Just destroy any stale jobs...
+			$pruneCutoff = $dbw->timestamp( $now - self::MAX_AGE_PRUNE );
+			$conds = array(
+				'job_cmd' => $this->type,
+				"job_token != {$dbw->addQuotes( '' )}", // was acquired
+				"job_token_timestamp < {$dbw->addQuotes( $pruneCutoff )}" // stale
+			);
+			if ( $this->claimTTL > 0 ) { // only prune jobs attempted too many times...
+				$conds[] = "job_attempts >= {$dbw->addQuotes( $this->maxTries )}";
+			}
+			// Get the IDs of jobs that are considered stale and should be removed. Selecting
+			// the IDs first means that the UPDATE can be done by primary key (less deadlocks).
+			$res = $dbw->select( 'job', 'job_id', $conds, __METHOD__ );
+			$ids = array_map(
+				function( $o ) {
+					return $o->job_id;
+				}, iterator_to_array( $res )
+			);
+			if ( count( $ids ) ) {
+				$dbw->delete( 'job', array( 'job_id' => $ids ), __METHOD__ );
+				$count += $dbw->affectedRows();
+				JobQueue::incrStats( 'job-abandon', $this->type, $dbw->affectedRows() );
+			}
+
+			$dbw->unlock( "jobqueue-recycle-{$this->type}", __METHOD__ );
+		} catch ( DBError $e ) {
+			$this->throwDBException( $e );
+		}
+
+		return $count;
 	}
 
 	/**
@@ -655,7 +722,7 @@ class JobQueueDB extends JobQueue {
 	 * @return array
 	 */
 	protected function insertFields( Job $job ) {
-		list( $dbw, $scope ) = $this->getMasterDB();
+		$dbw = $this->getMasterDB();
 		return array(
 			// Fields that describe the nature of the job
 			'job_cmd'       => $job->getType(),
@@ -674,20 +741,45 @@ class JobQueueDB extends JobQueue {
 	}
 
 	/**
-	 * @return string
+	 * @return DBConnRef
 	 */
-	private function getCacheKey( $property ) {
-		list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
-		return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $property );
+	protected function getSlaveDB() {
+		try {
+			return $this->getDB( DB_SLAVE );
+		} catch ( DBConnectionError $e ) {
+			throw new JobQueueConnectionError( "DBConnectionError:" . $e->getMessage() );
+		}
+	}
+
+	/**
+	 * @return DBConnRef
+	 */
+	protected function getMasterDB() {
+		try {
+			return $this->getDB( DB_MASTER );
+		} catch ( DBConnectionError $e ) {
+			throw new JobQueueConnectionError( "DBConnectionError:" . $e->getMessage() );
+		}
+	}
+
+	/**
+	 * @param $index integer (DB_SLAVE/DB_MASTER)
+	 * @return DBConnRef
+	 */
+	protected function getDB( $index ) {
+		$lb = ( $this->cluster !== false )
+			? wfGetLBFactory()->getExternalLB( $this->cluster, $this->wiki )
+			: wfGetLB( $this->wiki );
+		return $lb->getConnectionRef( $index, array(), $this->wiki );
 	}
 
 	/**
-	 * @param string $signature Hash identifier of the root job
 	 * @return string
 	 */
-	private function getRootJobCacheKey( $signature ) {
+	private function getCacheKey( $property ) {
 		list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
-		return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'rootjob', $signature );
+		$cluster = is_string( $this->cluster ) ? $this->cluster : 'main';
+		return wfForeignMemcKey( $db, $prefix, 'jobqueue', $cluster, $this->type, $property );
 	}
 
 	/**
@@ -713,4 +805,12 @@ class JobQueueDB extends JobQueue {
 			return false;
 		}
 	}
+
+	/**
+	 * @param DBError $e
+	 * @throws JobQueueError
+	 */
+	protected function throwDBException( DBError $e ) {
+		throw new JobQueueError( get_class( $e ) . ": " . $e->getMessage() );
+	}
 }
diff --git a/includes/job/JobQueueFederated.php b/includes/job/JobQueueFederated.php
new file mode 100644
index 00000000..d3ce164a
--- /dev/null
+++ b/includes/job/JobQueueFederated.php
@@ -0,0 +1,473 @@
+<?php
+/**
+ * Job queue code for federated queues.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle enqueueing and running of background jobs for federated queues
+ *
+ * This class allows for queues to be partitioned into smaller queues.
+ * A partition is defined by the configuration for a JobQueue instance.
+ * For example, one can set $wgJobTypeConf['refreshLinks'] to point to a
+ * JobQueueFederated instance, which itself would consist of three JobQueueRedis
+ * instances, each using their own redis server. This would allow for the jobs
+ * to be split (evenly or based on weights) accross multiple servers if a single
+ * server becomes impractical or expensive. Different JobQueue classes can be mixed.
+ *
+ * The basic queue configuration (e.g. "order", "claimTTL") of a federated queue
+ * is inherited by the partition queues. Additional configuration defines what
+ * section each wiki is in, what partition queues each section uses (and their weight),
+ * and the JobQueue configuration for each partition. Some sections might only need a
+ * single queue partition, like the sections for groups of small wikis.
+ *
+ * If used for performance, then $wgMainCacheType should be set to memcached/redis.
+ * Note that "fifo" cannot be used for the ordering, since the data is distributed.
+ * One can still use "timestamp" instead, as in "roughly timestamp ordered". Also,
+ * queue classes used by this should ignore down servers (with TTL) to avoid slowness.
+ *
+ * @ingroup JobQueue
+ * @since 1.22
+ */
+class JobQueueFederated extends JobQueue {
+	/** @var Array (partition name => weight) reverse sorted by weight */
+	protected $partitionMap = array();
+	/** @var Array (partition name => JobQueue) reverse sorted by weight */
+	protected $partitionQueues = array();
+	/** @var HashRing */
+	protected $partitionPushRing;
+	/** @var BagOStuff */
+	protected $cache;
+
+	const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
+	const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
+
+	/**
+	 * @params include:
+	 *  - sectionsByWiki      : A map of wiki IDs to section names.
+	 *                          Wikis will default to using the section "default".
+	 *  - partitionsBySection : Map of section names to maps of (partition name => weight).
+	 *                          A section called 'default' must be defined if not all wikis
+	 *                          have explicitly defined sections.
+	 *  - configByPartition   : Map of queue partition names to configuration arrays.
+	 *                          These configuration arrays are passed to JobQueue::factory().
+	 *                          The options set here are overriden by those passed to this
+	 *                          the federated queue itself (e.g. 'order' and 'claimTTL').
+	 *  - partitionsNoPush    : List of partition names that can handle pop() but not push().
+	 *                          This can be used to migrate away from a certain partition.
+	 * @param array $params
+	 */
+	protected function __construct( array $params ) {
+		parent::__construct( $params );
+		$section = isset( $params['sectionsByWiki'][$this->wiki] )
+			? $params['sectionsByWiki'][$this->wiki]
+			: 'default';
+		if ( !isset( $params['partitionsBySection'][$section] ) ) {
+			throw new MWException( "No configuration for section '$section'." );
+		}
+		// Get the full partition map
+		$this->partitionMap = $params['partitionsBySection'][$section];
+		arsort( $this->partitionMap, SORT_NUMERIC );
+		// Get the partitions jobs can actually be pushed to
+		$partitionPushMap = $this->partitionMap;
+		if ( isset( $params['partitionsNoPush'] ) ) {
+			foreach ( $params['partitionsNoPush'] as $partition ) {
+				unset( $partitionPushMap[$partition] );
+			}
+		}
+		// Get the config to pass to merge into each partition queue config
+		$baseConfig = $params;
+		foreach ( array( 'class', 'sectionsByWiki',
+			'partitionsBySection', 'configByPartition', 'partitionsNoPush' ) as $o )
+		{
+			unset( $baseConfig[$o] );
+		}
+		// Get the partition queue objects
+		foreach ( $this->partitionMap as $partition => $w ) {
+			if ( !isset( $params['configByPartition'][$partition] ) ) {
+				throw new MWException( "No configuration for partition '$partition'." );
+			}
+			$this->partitionQueues[$partition] = JobQueue::factory(
+				$baseConfig + $params['configByPartition'][$partition] );
+		}
+		// Get the ring of partitions to push jobs into
+		$this->partitionPushRing = new HashRing( $partitionPushMap );
+		// Aggregate cache some per-queue values if there are multiple partition queues
+		$this->cache = count( $this->partitionMap ) > 1 ? wfGetMainCache() : new EmptyBagOStuff();
+	}
+
+	protected function supportedOrders() {
+		// No FIFO due to partitioning, though "rough timestamp order" is supported
+		return array( 'undefined', 'random', 'timestamp' );
+	}
+
+	protected function optimalOrder() {
+		return 'undefined'; // defer to the partitions
+	}
+
+	protected function supportsDelayedJobs() {
+		return true; // defer checks to the partitions
+	}
+
+	protected function doIsEmpty() {
+		$key = $this->getCacheKey( 'empty' );
+
+		$isEmpty = $this->cache->get( $key );
+		if ( $isEmpty === 'true' ) {
+			return true;
+		} elseif ( $isEmpty === 'false' ) {
+			return false;
+		}
+
+		foreach ( $this->partitionQueues as $queue ) {
+			try {
+				if ( !$queue->doIsEmpty() ) {
+					$this->cache->add( $key, 'false', self::CACHE_TTL_LONG );
+					return false;
+				}
+			} catch ( JobQueueError $e ) {
+				MWExceptionHandler::logException( $e );
+			}
+		}
+
+		$this->cache->add( $key, 'true', self::CACHE_TTL_LONG );
+		return true;
+	}
+
+	protected function doGetSize() {
+		return $this->getCrossPartitionSum( 'size', 'doGetSize' );
+	}
+
+	protected function doGetAcquiredCount() {
+		return $this->getCrossPartitionSum( 'acquiredcount', 'doGetAcquiredCount' );
+	}
+
+	protected function doGetDelayedCount() {
+		return $this->getCrossPartitionSum( 'delayedcount', 'doGetDelayedCount' );
+	}
+
+	protected function doGetAbandonedCount() {
+		return $this->getCrossPartitionSum( 'abandonedcount', 'doGetAbandonedCount' );
+	}
+
+	/**
+	 * @param string $type
+	 * @param string $method
+	 * @return integer
+	 */
+	protected function getCrossPartitionSum( $type, $method ) {
+		$key = $this->getCacheKey( $type );
+
+		$count = $this->cache->get( $key );
+		if ( is_int( $count ) ) {
+			return $count;
+		}
+
+		$count = 0;
+		foreach ( $this->partitionQueues as $queue ) {
+			try {
+				$count += $queue->$method();
+			} catch ( JobQueueError $e ) {
+				MWExceptionHandler::logException( $e );
+			}
+		}
+
+		$this->cache->set( $key, $count, self::CACHE_TTL_SHORT );
+		return $count;
+	}
+
+	protected function doBatchPush( array $jobs, $flags ) {
+		if ( !count( $jobs ) ) {
+			return true; // nothing to do
+		}
+		// Local ring variable that may be changed to point to a new ring on failure
+		$partitionRing = $this->partitionPushRing;
+		// Try to insert the jobs and update $partitionsTry on any failures
+		$jobsLeft = $this->tryJobInsertions( $jobs, $partitionRing, $flags );
+		if ( count( $jobsLeft ) ) { // some jobs failed to insert?
+			// Try to insert the remaning jobs once more, ignoring the bad partitions
+			return !count( $this->tryJobInsertions( $jobsLeft, $partitionRing, $flags ) );
+		}
+		return true;
+	}
+
+	/**
+	 * @param array $jobs
+	 * @param HashRing $partitionRing
+	 * @param integer $flags
+	 * @return array List of Job object that could not be inserted
+	 */
+	protected function tryJobInsertions( array $jobs, HashRing &$partitionRing, $flags ) {
+		$jobsLeft = array();
+
+		// Because jobs are spread across partitions, per-job de-duplication needs
+		// to use a consistent hash to avoid allowing duplicate jobs per partition.
+		// When inserting a batch of de-duplicated jobs, QOS_ATOMIC is disregarded.
+		$uJobsByPartition = array(); // (partition name => job list)
+		foreach ( $jobs as $key => $job ) {
+			if ( $job->ignoreDuplicates() ) {
+				$sha1 = sha1( serialize( $job->getDeduplicationInfo() ) );
+				$uJobsByPartition[$partitionRing->getLocation( $sha1 )][] = $job;
+				unset( $jobs[$key] );
+			}
+		}
+		// Get the batches of jobs that are not de-duplicated
+		if ( $flags & self::QOS_ATOMIC ) {
+			$nuJobBatches = array( $jobs ); // all or nothing
+		} else {
+			// Split the jobs into batches and spread them out over servers if there
+			// are many jobs. This helps keep the partitions even. Otherwise, send all
+			// the jobs to a single partition queue to avoids the extra connections.
+			$nuJobBatches = array_chunk( $jobs, 300 );
+		}
+
+		// Insert the de-duplicated jobs into the queues...
+		foreach ( $uJobsByPartition as $partition => $jobBatch ) {
+			$queue = $this->partitionQueues[$partition];
+			try {
+				$ok = $queue->doBatchPush( $jobBatch, $flags | self::QOS_ATOMIC );
+			} catch ( JobQueueError $e ) {
+				$ok = false;
+				MWExceptionHandler::logException( $e );
+			}
+			if ( $ok ) {
+				$key = $this->getCacheKey( 'empty' );
+				$this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
+			} else {
+				$partitionRing = $partitionRing->newWithoutLocation( $partition ); // blacklist
+				if ( !$partitionRing ) {
+					throw new JobQueueError( "Could not insert job(s), all partitions are down." );
+				}
+				$jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
+			}
+		}
+
+		// Insert the jobs that are not de-duplicated into the queues...
+		foreach ( $nuJobBatches as $jobBatch ) {
+			$partition = ArrayUtils::pickRandom( $partitionRing->getLocationWeights() );
+			$queue = $this->partitionQueues[$partition];
+			try {
+				$ok = $queue->doBatchPush( $jobBatch, $flags | self::QOS_ATOMIC );
+			} catch ( JobQueueError $e ) {
+				$ok = false;
+				MWExceptionHandler::logException( $e );
+			}
+			if ( $ok ) {
+				$key = $this->getCacheKey( 'empty' );
+				$this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
+			} else {
+				$partitionRing = $partitionRing->newWithoutLocation( $partition ); // blacklist
+				if ( !$partitionRing ) {
+					throw new JobQueueError( "Could not insert job(s), all partitions are down." );
+				}
+				$jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
+			}
+		}
+
+		return $jobsLeft;
+	}
+
+	protected function doPop() {
+		$key = $this->getCacheKey( 'empty' );
+
+		$isEmpty = $this->cache->get( $key );
+		if ( $isEmpty === 'true' ) {
+			return false;
+		}
+
+		$partitionsTry = $this->partitionMap; // (partition => weight)
+
+		while ( count( $partitionsTry ) ) {
+			$partition = ArrayUtils::pickRandom( $partitionsTry );
+			if ( $partition === false ) {
+				break; // all partitions at 0 weight
+			}
+			$queue = $this->partitionQueues[$partition];
+			try {
+				$job = $queue->pop();
+			} catch ( JobQueueError $e ) {
+				$job = false;
+				MWExceptionHandler::logException( $e );
+			}
+			if ( $job ) {
+				$job->metadata['QueuePartition'] = $partition;
+				return $job;
+			} else {
+				unset( $partitionsTry[$partition] ); // blacklist partition
+			}
+		}
+
+		$this->cache->set( $key, 'true', JobQueueDB::CACHE_TTL_LONG );
+		return false;
+	}
+
+	protected function doAck( Job $job ) {
+		if ( !isset( $job->metadata['QueuePartition'] ) ) {
+			throw new MWException( "The given job has no defined partition name." );
+		}
+		return $this->partitionQueues[$job->metadata['QueuePartition']]->ack( $job );
+	}
+
+	protected function doIsRootJobOldDuplicate( Job $job ) {
+		$params = $job->getRootJobParams();
+		$partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 );
+		try {
+			return $this->partitionQueues[$partitions[0]]->doIsRootJobOldDuplicate( $job );
+		} catch ( JobQueueError $e ) {
+			if ( isset( $partitions[1] ) ) { // check fallback partition
+				return $this->partitionQueues[$partitions[1]]->doIsRootJobOldDuplicate( $job );
+			}
+		}
+		return false;
+	}
+
+	protected function doDeduplicateRootJob( Job $job ) {
+		$params = $job->getRootJobParams();
+		$partitions = $this->partitionPushRing->getLocations( $params['rootJobSignature'], 2 );
+		try {
+			return $this->partitionQueues[$partitions[0]]->doDeduplicateRootJob( $job );
+		} catch ( JobQueueError $e ) {
+			if ( isset( $partitions[1] ) ) { // check fallback partition
+				return $this->partitionQueues[$partitions[1]]->doDeduplicateRootJob( $job );
+			}
+		}
+		return false;
+	}
+
+	protected function doDelete() {
+		foreach ( $this->partitionQueues as $queue ) {
+			try {
+				$queue->doDelete();
+			} catch ( JobQueueError $e ) {
+				MWExceptionHandler::logException( $e );
+			}
+		}
+	}
+
+	protected function doWaitForBackups() {
+		foreach ( $this->partitionQueues as $queue ) {
+			try {
+				$queue->waitForBackups();
+			} catch ( JobQueueError $e ) {
+				MWExceptionHandler::logException( $e );
+			}
+		}
+	}
+
+	protected function doGetPeriodicTasks() {
+		$tasks = array();
+		foreach ( $this->partitionQueues as $partition => $queue ) {
+			foreach ( $queue->getPeriodicTasks() as $task => $def ) {
+				$tasks["{$partition}:{$task}"] = $def;
+			}
+		}
+		return $tasks;
+	}
+
+	protected function doFlushCaches() {
+		static $types = array(
+			'empty',
+			'size',
+			'acquiredcount',
+			'delayedcount',
+			'abandonedcount'
+		);
+		foreach ( $types as $type ) {
+			$this->cache->delete( $this->getCacheKey( $type ) );
+		}
+		foreach ( $this->partitionQueues as $queue ) {
+			$queue->doFlushCaches();
+		}
+	}
+
+	public function getAllQueuedJobs() {
+		$iterator = new AppendIterator();
+		foreach ( $this->partitionQueues as $queue ) {
+			$iterator->append( $queue->getAllQueuedJobs() );
+		}
+		return $iterator;
+	}
+
+	public function getAllDelayedJobs() {
+		$iterator = new AppendIterator();
+		foreach ( $this->partitionQueues as $queue ) {
+			$iterator->append( $queue->getAllDelayedJobs() );
+		}
+		return $iterator;
+	}
+
+	public function getCoalesceLocationInternal() {
+		return "JobQueueFederated:wiki:{$this->wiki}" .
+			sha1( serialize( array_keys( $this->partitionMap ) ) );
+	}
+
+	protected function doGetSiblingQueuesWithJobs( array $types ) {
+		$result = array();
+		foreach ( $this->partitionQueues as $queue ) {
+			try {
+				$nonEmpty = $queue->doGetSiblingQueuesWithJobs( $types );
+				if ( is_array( $nonEmpty ) ) {
+					$result = array_unique( array_merge( $result, $nonEmpty ) );
+				} else {
+					return null; // not supported on all partitions; bail
+				}
+				if ( count( $result ) == count( $types ) ) {
+					break; // short-circuit
+				}
+			} catch ( JobQueueError $e ) {
+				MWExceptionHandler::logException( $e );
+			}
+		}
+		return array_values( $result );
+	}
+
+	protected function doGetSiblingQueueSizes( array $types ) {
+		$result = array();
+		foreach ( $this->partitionQueues as $queue ) {
+			try {
+				$sizes = $queue->doGetSiblingQueueSizes( $types );
+				if ( is_array( $sizes ) ) {
+					foreach ( $sizes as $type => $size ) {
+						$result[$type] = isset( $result[$type] ) ? $result[$type] + $size : $size;
+					}
+				} else {
+					return null; // not supported on all partitions; bail
+				}
+			} catch ( JobQueueError $e ) {
+				MWExceptionHandler::logException( $e );
+			}
+		}
+		return $result;
+	}
+
+	public function setTestingPrefix( $key ) {
+		foreach ( $this->partitionQueues as $queue ) {
+			$queue->setTestingPrefix( $key );
+		}
+	}
+
+	/**
+	 * @return string
+	 */
+	private function getCacheKey( $property ) {
+		list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+		return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $property );
+	}
+}
diff --git a/includes/job/JobQueueGroup.php b/includes/job/JobQueueGroup.php
index 351c71a3..fa7fee5f 100644
--- a/includes/job/JobQueueGroup.php
+++ b/includes/job/JobQueueGroup.php
@@ -36,10 +36,14 @@ class JobQueueGroup {
 
 	protected $wiki; // string; wiki ID
 
+	/** @var array Map of (bucket => (queue => JobQueue, types => list of types) */
+	protected $coalescedQueues;
+
 	const TYPE_DEFAULT = 1; // integer; jobs popped by default
 	const TYPE_ANY = 2; // integer; any job
 
 	const USE_CACHE = 1; // integer; use process or persistent cache
+	const USE_PRIORITY = 2; // integer; respect deprioritization
 
 	const PROC_CACHE_TTL = 15; // integer; seconds
 
@@ -146,6 +150,9 @@ class JobQueueGroup {
 	 */
 	public function pop( $qtype = self::TYPE_DEFAULT, $flags = 0 ) {
 		if ( is_string( $qtype ) ) { // specific job type
+			if ( ( $flags & self::USE_PRIORITY ) && $this->isQueueDeprioritized( $qtype ) ) {
+				return false; // back off
+			}
 			$job = $this->get( $qtype )->pop();
 			if ( !$job ) {
 				JobQueueAggregator::singleton()->notifyQueueEmpty( $this->wiki, $qtype );
@@ -167,6 +174,9 @@ class JobQueueGroup {
 			shuffle( $types ); // avoid starvation
 
 			foreach ( $types as $type ) { // for each queue...
+				if ( ( $flags & self::USE_PRIORITY ) && $this->isQueueDeprioritized( $type ) ) {
+					continue; // back off
+				}
 				$job = $this->get( $type )->pop();
 				if ( $job ) { // found
 					return $job;
@@ -247,14 +257,71 @@ class JobQueueGroup {
 	 */
 	public function getQueuesWithJobs() {
 		$types = array();
-		foreach ( $this->getQueueTypes() as $type ) {
-			if ( !$this->get( $type )->isEmpty() ) {
-				$types[] = $type;
+		foreach ( $this->getCoalescedQueues() as $info ) {
+			$nonEmpty = $info['queue']->getSiblingQueuesWithJobs( $this->getQueueTypes() );
+			if ( is_array( $nonEmpty ) ) { // batching features supported
+				$types = array_merge( $types, $nonEmpty );
+			} else { // we have to go through the queues in the bucket one-by-one
+				foreach ( $info['types'] as $type ) {
+					if ( !$this->get( $type )->isEmpty() ) {
+						$types[] = $type;
+					}
+				}
 			}
 		}
 		return $types;
 	}
 
+	/**
+	 * Get the size of the queus for a list of job types
+	 *
+	 * @return Array Map of (job type => size)
+	 */
+	public function getQueueSizes() {
+		$sizeMap = array();
+		foreach ( $this->getCoalescedQueues() as $info ) {
+			$sizes = $info['queue']->getSiblingQueueSizes( $this->getQueueTypes() );
+			if ( is_array( $sizes ) ) { // batching features supported
+				$sizeMap = $sizeMap + $sizes;
+			} else { // we have to go through the queues in the bucket one-by-one
+				foreach ( $info['types'] as $type ) {
+					$sizeMap[$type] = $this->get( $type )->getSize();
+				}
+			}
+		}
+		return $sizeMap;
+	}
+
+	/**
+	 * @return array
+	 */
+	protected function getCoalescedQueues() {
+		global $wgJobTypeConf;
+
+		if ( $this->coalescedQueues === null ) {
+			$this->coalescedQueues = array();
+			foreach ( $wgJobTypeConf as $type => $conf ) {
+				$queue = JobQueue::factory(
+					array( 'wiki' => $this->wiki, 'type' => 'null' ) + $conf );
+				$loc = $queue->getCoalesceLocationInternal();
+				if ( !isset( $this->coalescedQueues[$loc] ) ) {
+					$this->coalescedQueues[$loc]['queue'] = $queue;
+					$this->coalescedQueues[$loc]['types'] = array();
+				}
+				if ( $type === 'default' ) {
+					$this->coalescedQueues[$loc]['types'] = array_merge(
+						$this->coalescedQueues[$loc]['types'],
+						array_diff( $this->getQueueTypes(), array_keys( $wgJobTypeConf ) )
+					);
+				} else {
+					$this->coalescedQueues[$loc]['types'][] = $type;
+				}
+			}
+		}
+
+		return $this->coalescedQueues;
+	}
+
 	/**
 	 * Check if jobs should not be popped of a queue right now.
 	 * This is only used for performance, such as to avoid spamming
@@ -264,10 +331,15 @@ class JobQueueGroup {
 	 * @return bool
 	 */
 	public function isQueueDeprioritized( $type ) {
+		if ( $this->cache->has( 'isDeprioritized', $type, 5 ) ) {
+			return $this->cache->get( 'isDeprioritized', $type );
+		}
 		if ( $type === 'refreshLinks2' ) {
 			// Don't keep converting refreshLinks2 => refreshLinks jobs if the
 			// later jobs have not been done yet. This helps throttle queue spam.
-			return !$this->get( 'refreshLinks' )->isEmpty();
+			$deprioritized = !$this->get( 'refreshLinks' )->isEmpty();
+			$this->cache->set( 'isDeprioritized', $type, $deprioritized );
+			return $deprioritized;
 		}
 		return false;
 	}
@@ -298,9 +370,13 @@ class JobQueueGroup {
 				} elseif ( !isset( $lastRuns[$type][$task] )
 					|| $lastRuns[$type][$task] < ( time() - $definition['period'] ) )
 				{
-					if ( call_user_func( $definition['callback'] ) !== null ) {
-						$tasksRun[$type][$task] = time();
-						++$count;
+					try {
+						if ( call_user_func( $definition['callback'] ) !== null ) {
+							$tasksRun[$type][$task] = time();
+							++$count;
+						}
+					} catch ( JobQueueError $e ) {
+						MWExceptionHandler::logException( $e );
 					}
 				}
 			}
diff --git a/includes/job/JobQueueRedis.php b/includes/job/JobQueueRedis.php
new file mode 100644
index 00000000..378e1755
--- /dev/null
+++ b/includes/job/JobQueueRedis.php
@@ -0,0 +1,856 @@
+<?php
+/**
+ * Redis-backed job queue code.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle job queues stored in Redis
+ *
+ * This is faster, less resource intensive, queue that JobQueueDB.
+ * All data for a queue using this class is placed into one redis server.
+ *
+ * There are eight main redis keys used to track jobs:
+ *   - l-unclaimed  : A list of job IDs used for ready unclaimed jobs
+ *   - z-claimed    : A sorted set of (job ID, UNIX timestamp as score) used for job retries
+ *   - z-abandoned  : A sorted set of (job ID, UNIX timestamp as score) used for broken jobs
+ *   - z-delayed    : A sorted set of (job ID, UNIX timestamp as score) used for delayed jobs
+ *   - h-idBySha1   : A hash of (SHA1 => job ID) for unclaimed jobs used for de-duplication
+ *   - h-sha1ById   : A hash of (job ID => SHA1) for unclaimed jobs used for de-duplication
+ *   - h-attempts   : A hash of (job ID => attempt count) used for job claiming/retries
+ *   - h-data       : A hash of (job ID => serialized blobs) for job storage
+ * A job ID can be in only one of z-delayed, l-unclaimed, z-claimed, and z-abandoned.
+ * If an ID appears in any of those lists, it should have a h-data entry for its ID.
+ * If a job has a SHA1 de-duplication value and its ID is in l-unclaimed or z-delayed, then
+ * there should be no other such jobs with that SHA1. Every h-idBySha1 entry has an h-sha1ById
+ * entry and every h-sha1ById must refer to an ID that is l-unclaimed. If a job has its
+ * ID in z-claimed or z-abandoned, then it must also have an h-attempts entry for its ID.
+ *
+ * Additionally, "rootjob:* keys track "root jobs" used for additional de-duplication.
+ * Aside from root job keys, all keys have no expiry, and are only removed when jobs are run.
+ * All the keys are prefixed with the relevant wiki ID information.
+ *
+ * This class requires Redis 2.6 as it makes use Lua scripts for fast atomic operations.
+ * Additionally, it should be noted that redis has different persistence modes, such
+ * as rdb snapshots, journaling, and no persistent. Appropriate configuration should be
+ * made on the servers based on what queues are using it and what tolerance they have.
+ *
+ * @ingroup JobQueue
+ * @ingroup Redis
+ * @since 1.22
+ */
+class JobQueueRedis extends JobQueue {
+	/** @var RedisConnectionPool */
+	protected $redisPool;
+
+	protected $server; // string; server address
+	protected $compression; // string; compression method to use
+
+	const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed (7 days)
+
+	protected $key; // string; key to prefix the queue keys with (used for testing)
+
+	/**
+	 * @params include:
+	 *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
+	 *                   Note that the serializer option is ignored "none" is always used.
+	 *   - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
+	 *                   If a hostname is specified but no port, the standard port number
+	 *                   6379 will be used. Required.
+	 *   - compression : The type of compression to use; one of (none,gzip).
+	 * @param array $params
+	 */
+	public function __construct( array $params ) {
+		parent::__construct( $params );
+		$params['redisConfig']['serializer'] = 'none'; // make it easy to use Lua
+		$this->server = $params['redisServer'];
+		$this->compression = isset( $params['compression'] ) ? $params['compression'] : 'none';
+		$this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
+	}
+
+	protected function supportedOrders() {
+		return array( 'timestamp', 'fifo' );
+	}
+
+	protected function optimalOrder() {
+		return 'fifo';
+	}
+
+	protected function supportsDelayedJobs() {
+		return true;
+	}
+
+	/**
+	 * @see JobQueue::doIsEmpty()
+	 * @return bool
+	 * @throws MWException
+	 */
+	protected function doIsEmpty() {
+		return $this->doGetSize() == 0;
+	}
+
+	/**
+	 * @see JobQueue::doGetSize()
+	 * @return integer
+	 * @throws MWException
+	 */
+	protected function doGetSize() {
+		$conn = $this->getConnection();
+		try {
+			return $conn->lSize( $this->getQueueKey( 'l-unclaimed' ) );
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+	}
+
+	/**
+	 * @see JobQueue::doGetAcquiredCount()
+	 * @return integer
+	 * @throws MWException
+	 */
+	protected function doGetAcquiredCount() {
+		if ( $this->claimTTL <= 0 ) {
+			return 0; // no acknowledgements
+		}
+		$conn = $this->getConnection();
+		try {
+			$conn->multi( Redis::PIPELINE );
+			$conn->zSize( $this->getQueueKey( 'z-claimed' ) );
+			$conn->zSize( $this->getQueueKey( 'z-abandoned' ) );
+			return array_sum( $conn->exec() );
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+	}
+
+	/**
+	 * @see JobQueue::doGetDelayedCount()
+	 * @return integer
+	 * @throws MWException
+	 */
+	protected function doGetDelayedCount() {
+		if ( !$this->checkDelay ) {
+			return 0; // no delayed jobs
+		}
+		$conn = $this->getConnection();
+		try {
+			return $conn->zSize( $this->getQueueKey( 'z-delayed' ) );
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+	}
+
+	/**
+	 * @see JobQueue::doGetAbandonedCount()
+	 * @return integer
+	 * @throws MWException
+	 */
+	protected function doGetAbandonedCount() {
+		if ( $this->claimTTL <= 0 ) {
+			return 0; // no acknowledgements
+		}
+		$conn = $this->getConnection();
+		try {
+			return $conn->zSize( $this->getQueueKey( 'z-abandoned' ) );
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+	}
+
+	/**
+	 * @see JobQueue::doBatchPush()
+	 * @param array $jobs
+	 * @param $flags
+	 * @return bool
+	 * @throws MWException
+	 */
+	protected function doBatchPush( array $jobs, $flags ) {
+		// Convert the jobs into field maps (de-duplicated against each other)
+		$items = array(); // (job ID => job fields map)
+		foreach ( $jobs as $job ) {
+			$item = $this->getNewJobFields( $job );
+			if ( strlen( $item['sha1'] ) ) { // hash identifier => de-duplicate
+				$items[$item['sha1']] = $item;
+			} else {
+				$items[$item['uuid']] = $item;
+			}
+		}
+
+		if ( !count( $items ) ) {
+			return true; // nothing to do
+		}
+
+		$conn = $this->getConnection();
+		try {
+			// Actually push the non-duplicate jobs into the queue...
+			if ( $flags & self::QOS_ATOMIC ) {
+				$batches = array( $items ); // all or nothing
+			} else {
+				$batches = array_chunk( $items, 500 ); // avoid tying up the server
+			}
+			$failed = 0;
+			$pushed = 0;
+			foreach ( $batches as $itemBatch ) {
+				$added = $this->pushBlobs( $conn, $itemBatch );
+				if ( is_int( $added ) ) {
+					$pushed += $added;
+				} else {
+					$failed += count( $itemBatch );
+				}
+			}
+			if ( $failed > 0 ) {
+				wfDebugLog( 'JobQueueRedis', "Could not insert {$failed} {$this->type} job(s)." );
+				return false;
+			}
+			JobQueue::incrStats( 'job-insert', $this->type, count( $items ) );
+			JobQueue::incrStats( 'job-insert-duplicate', $this->type,
+				count( $items ) - $failed - $pushed );
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+
+		return true;
+	}
+
+	/**
+	 * @param RedisConnRef $conn
+	 * @param array $items List of results from JobQueueRedis::getNewJobFields()
+	 * @return integer Number of jobs inserted (duplicates are ignored)
+	 * @throws RedisException
+	 */
+	protected function pushBlobs( RedisConnRef $conn, array $items ) {
+		$args = array(); // ([id, sha1, rtime, blob [, id, sha1, rtime, blob ... ] ] )
+		foreach ( $items as $item ) {
+			$args[] = (string)$item['uuid'];
+			$args[] = (string)$item['sha1'];
+			$args[] = (string)$item['rtimestamp'];
+			$args[] = (string)$this->serialize( $item );
+		}
+		static $script =
+<<<LUA
+		if #ARGV % 4 ~= 0 then return redis.error_reply('Unmatched arguments') end
+		local pushed = 0
+		for i = 1,#ARGV,4 do
+			local id,sha1,rtimestamp,blob = ARGV[i],ARGV[i+1],ARGV[i+2],ARGV[i+3]
+			if sha1 == '' or redis.call('hExists',KEYS[3],sha1) == 0 then
+				if 1*rtimestamp > 0 then
+					-- Insert into delayed queue (release time as score)
+					redis.call('zAdd',KEYS[4],rtimestamp,id)
+				else
+					-- Insert into unclaimed queue
+					redis.call('lPush',KEYS[1],id)
+				end
+				if sha1 ~= '' then
+					redis.call('hSet',KEYS[2],id,sha1)
+					redis.call('hSet',KEYS[3],sha1,id)
+				end
+				redis.call('hSet',KEYS[5],id,blob)
+				pushed = pushed + 1
+			end
+		end
+		return pushed
+LUA;
+		return $conn->luaEval( $script,
+			array_merge(
+				array(
+					$this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+					$this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+					$this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+					$this->getQueueKey( 'z-delayed' ), # KEYS[4]
+					$this->getQueueKey( 'h-data' ), # KEYS[5]
+				),
+				$args
+			),
+			5 # number of first argument(s) that are keys
+		);
+	}
+
+	/**
+	 * @see JobQueue::doPop()
+	 * @return Job|bool
+	 * @throws MWException
+	 */
+	protected function doPop() {
+		$job = false;
+
+		// Push ready delayed jobs into the queue every 10 jobs to spread the load.
+		// This is also done as a periodic task, but we don't want too much done at once.
+		if ( $this->checkDelay && mt_rand( 0, 9 ) == 0 ) {
+			$this->releaseReadyDelayedJobs();
+		}
+
+		$conn = $this->getConnection();
+		try {
+			do {
+				if ( $this->claimTTL > 0 ) {
+					// Keep the claimed job list down for high-traffic queues
+					if ( mt_rand( 0, 99 ) == 0 ) {
+						$this->recycleAndDeleteStaleJobs();
+					}
+					$blob = $this->popAndAcquireBlob( $conn );
+				} else {
+					$blob = $this->popAndDeleteBlob( $conn );
+				}
+				if ( $blob === false ) {
+					break; // no jobs; nothing to do
+				}
+
+				JobQueue::incrStats( 'job-pop', $this->type );
+				$item = $this->unserialize( $blob );
+				if ( $item === false ) {
+					wfDebugLog( 'JobQueueRedis', "Could not unserialize {$this->type} job." );
+					continue;
+				}
+
+				// If $item is invalid, recycleAndDeleteStaleJobs() will cleanup as needed
+				$job = $this->getJobFromFields( $item ); // may be false
+			} while ( !$job ); // job may be false if invalid
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+
+		return $job;
+	}
+
+	/**
+	 * @param RedisConnRef $conn
+	 * @return array serialized string or false
+	 * @throws RedisException
+	 */
+	protected function popAndDeleteBlob( RedisConnRef $conn ) {
+		static $script =
+<<<LUA
+		-- Pop an item off the queue
+		local id = redis.call('rpop',KEYS[1])
+		if not id then return false end
+		-- Get the job data and remove it
+		local item = redis.call('hGet',KEYS[4],id)
+		redis.call('hDel',KEYS[4],id)
+		-- Allow new duplicates of this job
+		local sha1 = redis.call('hGet',KEYS[2],id)
+		if sha1 then redis.call('hDel',KEYS[3],sha1) end
+		redis.call('hDel',KEYS[2],id)
+		-- Return the job data
+		return item
+LUA;
+		return $conn->luaEval( $script,
+			array(
+				$this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+				$this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+				$this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+				$this->getQueueKey( 'h-data' ), # KEYS[4]
+			),
+			4 # number of first argument(s) that are keys
+		);
+	}
+
+	/**
+	 * @param RedisConnRef $conn
+	 * @return array serialized string or false
+	 * @throws RedisException
+	 */
+	protected function popAndAcquireBlob( RedisConnRef $conn ) {
+		static $script =
+<<<LUA
+		-- Pop an item off the queue
+		local id = redis.call('rPop',KEYS[1])
+		if not id then return false end
+		-- Allow new duplicates of this job
+		local sha1 = redis.call('hGet',KEYS[2],id)
+		if sha1 then redis.call('hDel',KEYS[3],sha1) end
+		redis.call('hDel',KEYS[2],id)
+		-- Mark the jobs as claimed and return it
+		redis.call('zAdd',KEYS[4],ARGV[1],id)
+		redis.call('hIncrBy',KEYS[5],id,1)
+		return redis.call('hGet',KEYS[6],id)
+LUA;
+		return $conn->luaEval( $script,
+			array(
+				$this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+				$this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+				$this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+				$this->getQueueKey( 'z-claimed' ), # KEYS[4]
+				$this->getQueueKey( 'h-attempts' ), # KEYS[5]
+				$this->getQueueKey( 'h-data' ), # KEYS[6]
+				time(), # ARGV[1] (injected to be replication-safe)
+			),
+			6 # number of first argument(s) that are keys
+		);
+	}
+
+	/**
+	 * @see JobQueue::doAck()
+	 * @param Job $job
+	 * @return Job|bool
+	 * @throws MWException
+	 */
+	protected function doAck( Job $job ) {
+		if ( !isset( $job->metadata['uuid'] ) ) {
+			throw new MWException( "Job of type '{$job->getType()}' has no UUID." );
+		}
+		if ( $this->claimTTL > 0 ) {
+			$conn = $this->getConnection();
+			try {
+				static $script =
+<<<LUA
+				-- Unmark the job as claimed
+				redis.call('zRem',KEYS[1],ARGV[1])
+				redis.call('hDel',KEYS[2],ARGV[1])
+				-- Delete the job data itself
+				return redis.call('hDel',KEYS[3],ARGV[1])
+LUA;
+				$res = $conn->luaEval( $script,
+					array(
+						$this->getQueueKey( 'z-claimed' ), # KEYS[1]
+						$this->getQueueKey( 'h-attempts' ), # KEYS[2]
+						$this->getQueueKey( 'h-data' ), # KEYS[3]
+						$job->metadata['uuid'] # ARGV[1]
+					),
+					3 # number of first argument(s) that are keys
+				);
+
+				if ( !$res ) {
+					wfDebugLog( 'JobQueueRedis', "Could not acknowledge {$this->type} job." );
+					return false;
+				}
+			} catch ( RedisException $e ) {
+				$this->throwRedisException( $this->server, $conn, $e );
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * @see JobQueue::doDeduplicateRootJob()
+	 * @param Job $job
+	 * @return bool
+	 * @throws MWException
+	 */
+	protected function doDeduplicateRootJob( Job $job ) {
+		if ( !$job->hasRootJobParams() ) {
+			throw new MWException( "Cannot register root job; missing parameters." );
+		}
+		$params = $job->getRootJobParams();
+
+		$key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
+
+		$conn = $this->getConnection();
+		try {
+			$timestamp = $conn->get( $key ); // current last timestamp of this job
+			if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
+				return true; // a newer version of this root job was enqueued
+			}
+			// Update the timestamp of the last root job started at the location...
+			return $conn->set( $key, $params['rootJobTimestamp'], self::ROOTJOB_TTL ); // 2 weeks
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+	}
+
+	/**
+	 * @see JobQueue::doIsRootJobOldDuplicate()
+	 * @param Job $job
+	 * @return bool
+	 */
+	protected function doIsRootJobOldDuplicate( Job $job ) {
+		if ( !$job->hasRootJobParams() ) {
+			return false; // job has no de-deplication info
+		}
+		$params = $job->getRootJobParams();
+
+		$conn = $this->getConnection();
+		try {
+			// Get the last time this root job was enqueued
+			$timestamp = $conn->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+
+		// Check if a new root job was started at the location after this one's...
+		return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
+	}
+
+	/**
+	 * @see JobQueue::doDelete()
+	 * @return bool
+	 */
+	protected function doDelete() {
+		static $props = array( 'l-unclaimed', 'z-claimed', 'z-abandoned',
+			'z-delayed', 'h-idBySha1', 'h-sha1ById', 'h-attempts', 'h-data' );
+
+		$conn = $this->getConnection();
+		try {
+			$keys = array();
+			foreach ( $props as $prop ) {
+				$keys[] = $this->getQueueKey( $prop );
+			}
+			return ( $conn->delete( $keys ) !== false );
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+	}
+
+	/**
+	 * @see JobQueue::getAllQueuedJobs()
+	 * @return Iterator
+	 */
+	public function getAllQueuedJobs() {
+		$conn = $this->getConnection();
+		try {
+			$that = $this;
+			return new MappedIterator(
+				$conn->lRange( $this->getQueueKey( 'l-unclaimed' ), 0, -1 ),
+				function( $uid ) use ( $that, $conn ) {
+					return $that->getJobFromUidInternal( $uid, $conn );
+				},
+				array( 'accept' => function ( $job ) { return is_object( $job ); } )
+			);
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+	}
+
+	/**
+	 * @see JobQueue::getAllQueuedJobs()
+	 * @return Iterator
+	 */
+	public function getAllDelayedJobs() {
+		$conn = $this->getConnection();
+		try {
+			$that = $this;
+			return new MappedIterator( // delayed jobs
+				$conn->zRange( $this->getQueueKey( 'z-delayed' ), 0, -1 ),
+				function( $uid ) use ( $that, $conn ) {
+					return $that->getJobFromUidInternal( $uid, $conn );
+				},
+				array( 'accept' => function ( $job ) { return is_object( $job ); } )
+			);
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+	}
+
+	public function getCoalesceLocationInternal() {
+		return "RedisServer:" . $this->server;
+	}
+
+	protected function doGetSiblingQueuesWithJobs( array $types ) {
+		return array_keys( array_filter( $this->doGetSiblingQueueSizes( $types ) ) );
+	}
+
+	protected function doGetSiblingQueueSizes( array $types ) {
+		$sizes = array(); // (type => size)
+		$types = array_values( $types ); // reindex
+		try {
+			$conn = $this->getConnection();
+			$conn->multi( Redis::PIPELINE );
+			foreach ( $types as $type ) {
+				$conn->lSize( $this->getQueueKey( 'l-unclaimed', $type ) );
+			}
+			$res = $conn->exec();
+			if ( is_array( $res ) ) {
+				foreach ( $res as $i => $size ) {
+					$sizes[$types[$i]] = $size;
+				}
+			}
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+		return $sizes;
+	}
+
+	/**
+	 * This function should not be called outside JobQueueRedis
+	 *
+	 * @param $uid string
+	 * @param $conn RedisConnRef
+	 * @return Job|bool Returns false if the job does not exist
+	 * @throws MWException
+	 */
+	public function getJobFromUidInternal( $uid, RedisConnRef $conn ) {
+		try {
+			$data = $conn->hGet( $this->getQueueKey( 'h-data' ), $uid );
+			if ( $data === false ) {
+				return false; // not found
+			}
+			$item = $this->unserialize( $conn->hGet( $this->getQueueKey( 'h-data' ), $uid ) );
+			if ( !is_array( $item ) ) { // this shouldn't happen
+				throw new MWException( "Could not find job with ID '$uid'." );
+			}
+			$title = Title::makeTitle( $item['namespace'], $item['title'] );
+			$job = Job::factory( $item['type'], $title, $item['params'] );
+			$job->metadata['uuid'] = $item['uuid'];
+			return $job;
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+	}
+
+	/**
+	 * Release any ready delayed jobs into the queue
+	 *
+	 * @return integer Number of jobs released
+	 * @throws MWException
+	 */
+	public function releaseReadyDelayedJobs() {
+		$count = 0;
+
+		$conn = $this->getConnection();
+		try {
+			static $script =
+<<<LUA
+			-- Get the list of ready delayed jobs, sorted by readiness
+			local ids = redis.call('zRangeByScore',KEYS[1],0,ARGV[1])
+			-- Migrate the jobs from the "delayed" set to the "unclaimed" list
+			for k,id in ipairs(ids) do
+				redis.call('lPush',KEYS[2],id)
+				redis.call('zRem',KEYS[1],id)
+			end
+			return #ids
+LUA;
+			$count += (int)$conn->luaEval( $script,
+				array(
+					$this->getQueueKey( 'z-delayed' ), // KEYS[1]
+					$this->getQueueKey( 'l-unclaimed' ), // KEYS[2]
+					time() // ARGV[1]; max "delay until" UNIX timestamp
+				),
+				2 # first two arguments are keys
+			);
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+
+		return $count;
+	}
+
+	/**
+	 * Recycle or destroy any jobs that have been claimed for too long
+	 *
+	 * @return integer Number of jobs recycled/deleted
+	 * @throws MWException
+	 */
+	public function recycleAndDeleteStaleJobs() {
+		if ( $this->claimTTL <= 0 ) { // sanity
+			throw new MWException( "Cannot recycle jobs since acknowledgements are disabled." );
+		}
+		$count = 0;
+		// For each job item that can be retried, we need to add it back to the
+		// main queue and remove it from the list of currenty claimed job items.
+		// For those that cannot, they are marked as dead and kept around for
+		// investigation and manual job restoration but are eventually deleted.
+		$conn = $this->getConnection();
+		try {
+			$now = time();
+			static $script =
+<<<LUA
+			local released,abandoned,pruned = 0,0,0
+			-- Get all non-dead jobs that have an expired claim on them.
+			-- The score for each item is the last claim timestamp (UNIX).
+			local staleClaims = redis.call('zRangeByScore',KEYS[1],0,ARGV[1])
+			for k,id in ipairs(staleClaims) do
+				local timestamp = redis.call('zScore',KEYS[1],id)
+				local attempts = redis.call('hGet',KEYS[2],id)
+				if attempts < ARGV[3] then
+					-- Claim expired and retries left: re-enqueue the job
+					redis.call('lPush',KEYS[3],id)
+					redis.call('hIncrBy',KEYS[2],id,1)
+					released = released + 1
+				else
+					-- Claim expired and no retries left: mark the job as dead
+					redis.call('zAdd',KEYS[5],timestamp,id)
+					abandoned = abandoned + 1
+				end
+				redis.call('zRem',KEYS[1],id)
+			end
+			-- Get all of the dead jobs that have been marked as dead for too long.
+			-- The score for each item is the last claim timestamp (UNIX).
+			local deadClaims = redis.call('zRangeByScore',KEYS[5],0,ARGV[2])
+			for k,id in ipairs(deadClaims) do
+				-- Stale and out of retries: remove any traces of the job
+				redis.call('zRem',KEYS[5],id)
+				redis.call('hDel',KEYS[2],id)
+				redis.call('hDel',KEYS[4],id)
+				pruned = pruned + 1
+			end
+			return {released,abandoned,pruned}
+LUA;
+			$res = $conn->luaEval( $script,
+				array(
+					$this->getQueueKey( 'z-claimed' ), # KEYS[1]
+					$this->getQueueKey( 'h-attempts' ), # KEYS[2]
+					$this->getQueueKey( 'l-unclaimed' ), # KEYS[3]
+					$this->getQueueKey( 'h-data' ), # KEYS[4]
+					$this->getQueueKey( 'z-abandoned' ), # KEYS[5]
+					$now - $this->claimTTL, # ARGV[1]
+					$now - self::MAX_AGE_PRUNE, # ARGV[2]
+					$this->maxTries # ARGV[3]
+				),
+				5 # number of first argument(s) that are keys
+			);
+			if ( $res ) {
+				list( $released, $abandoned, $pruned ) = $res;
+				$count += $released + $pruned;
+				JobQueue::incrStats( 'job-recycle', $this->type, $released );
+				JobQueue::incrStats( 'job-abandon', $this->type, $abandoned );
+			}
+		} catch ( RedisException $e ) {
+			$this->throwRedisException( $this->server, $conn, $e );
+		}
+
+		return $count;
+	}
+
+	/**
+	 * @return Array
+	 */
+	protected function doGetPeriodicTasks() {
+		$tasks = array();
+		if ( $this->claimTTL > 0 ) {
+			$tasks['recycleAndDeleteStaleJobs'] = array(
+				'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
+				'period' => ceil( $this->claimTTL / 2 )
+			);
+		}
+		if ( $this->checkDelay ) {
+			$tasks['releaseReadyDelayedJobs'] = array(
+				'callback' => array( $this, 'releaseReadyDelayedJobs' ),
+				'period' => 300 // 5 minutes
+			);
+		}
+		return $tasks;
+	}
+
+	/**
+	 * @param $job Job
+	 * @return array
+	 */
+	protected function getNewJobFields( Job $job ) {
+		return array(
+			// Fields that describe the nature of the job
+			'type'       => $job->getType(),
+			'namespace'  => $job->getTitle()->getNamespace(),
+			'title'      => $job->getTitle()->getDBkey(),
+			'params'     => $job->getParams(),
+			// Some jobs cannot run until a "release timestamp"
+			'rtimestamp' => $job->getReleaseTimestamp() ?: 0,
+			// Additional job metadata
+			'uuid'       => UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND ),
+			'sha1'       => $job->ignoreDuplicates()
+				? wfBaseConvert( sha1( serialize( $job->getDeduplicationInfo() ) ), 16, 36, 31 )
+				: '',
+			'timestamp'  => time() // UNIX timestamp
+		);
+	}
+
+	/**
+	 * @param $fields array
+	 * @return Job|bool
+	 */
+	protected function getJobFromFields( array $fields ) {
+		$title = Title::makeTitleSafe( $fields['namespace'], $fields['title'] );
+		if ( $title ) {
+			$job = Job::factory( $fields['type'], $title, $fields['params'] );
+			$job->metadata['uuid'] = $fields['uuid'];
+			return $job;
+		}
+		return false;
+	}
+
+	/**
+	 * @param array $fields
+	 * @return string Serialized and possibly compressed version of $fields
+	 */
+	protected function serialize( array $fields ) {
+		$blob = serialize( $fields );
+		if ( $this->compression === 'gzip'
+			&& strlen( $blob ) >= 1024 && function_exists( 'gzdeflate' ) )
+		{
+			$object = (object)array( 'blob' => gzdeflate( $blob ), 'enc' => 'gzip' );
+			$blobz = serialize( $object );
+			return ( strlen( $blobz ) < strlen( $blob ) ) ? $blobz : $blob;
+		} else {
+			return $blob;
+		}
+	}
+
+	/**
+	 * @param string $blob
+	 * @return array|bool Unserialized version of $blob or false
+	 */
+	protected function unserialize( $blob ) {
+		$fields = unserialize( $blob );
+		if ( is_object( $fields ) ) {
+			if ( $fields->enc === 'gzip' && function_exists( 'gzinflate' ) ) {
+				$fields = unserialize( gzinflate( $fields->blob ) );
+			} else {
+				$fields = false;
+			}
+		}
+		return is_array( $fields ) ? $fields : false;
+	}
+
+	/**
+	 * Get a connection to the server that handles all sub-queues for this queue
+	 *
+	 * @return Array (server name, Redis instance)
+	 * @throws MWException
+	 */
+	protected function getConnection() {
+		$conn = $this->redisPool->getConnection( $this->server );
+		if ( !$conn ) {
+			throw new JobQueueConnectionError( "Unable to connect to redis server." );
+		}
+		return $conn;
+	}
+
+	/**
+	 * @param $server string
+	 * @param $conn RedisConnRef
+	 * @param $e RedisException
+	 * @throws MWException
+	 */
+	protected function throwRedisException( $server, RedisConnRef $conn, $e ) {
+		$this->redisPool->handleException( $server, $conn, $e );
+		throw new JobQueueError( "Redis server error: {$e->getMessage()}\n" );
+	}
+
+	/**
+	 * @param $prop string
+	 * @param $type string|null
+	 * @return string
+	 */
+	private function getQueueKey( $prop, $type = null ) {
+		$type = is_string( $type ) ? $type : $this->type;
+		list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+		if ( strlen( $this->key ) ) { // namespaced queue (for testing)
+			return wfForeignMemcKey( $db, $prefix, 'jobqueue', $type, $this->key, $prop );
+		} else {
+			return wfForeignMemcKey( $db, $prefix, 'jobqueue', $type, $prop );
+		}
+	}
+
+	/**
+	 * @param $key string
+	 * @return void
+	 */
+	public function setTestingPrefix( $key ) {
+		$this->key = $key;
+	}
+}
diff --git a/includes/job/aggregator/JobQueueAggregator.php b/includes/job/aggregator/JobQueueAggregator.php
new file mode 100644
index 00000000..a8186abd
--- /dev/null
+++ b/includes/job/aggregator/JobQueueAggregator.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * Job queue aggregator code.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+abstract class JobQueueAggregator {
+	/** @var JobQueueAggregator */
+	protected static $instance = null;
+
+	/**
+	 * @param array $params
+	 */
+	protected function __construct( array $params ) {}
+
+	/**
+	 * @return JobQueueAggregator
+	 */
+	final public static function singleton() {
+		global $wgJobQueueAggregator;
+
+		if ( !isset( self::$instance ) ) {
+			$class = $wgJobQueueAggregator['class'];
+			$obj = new $class( $wgJobQueueAggregator );
+			if ( !( $obj instanceof JobQueueAggregator ) ) {
+				throw new MWException( "Class '$class' is not a JobQueueAggregator class." );
+			}
+			self::$instance = $obj;
+		}
+
+		return self::$instance;
+	}
+
+	/**
+	 * Destroy the singleton instance
+	 *
+	 * @return void
+	 */
+	final public static function destroySingleton() {
+		self::$instance = null;
+	}
+
+	/**
+	 * Mark a queue as being empty
+	 *
+	 * @param string $wiki
+	 * @param string $type
+	 * @return bool Success
+	 */
+	final public function notifyQueueEmpty( $wiki, $type ) {
+		wfProfileIn( __METHOD__ );
+		$ok = $this->doNotifyQueueEmpty( $wiki, $type );
+		wfProfileOut( __METHOD__ );
+		return $ok;
+	}
+
+	/**
+	 * @see JobQueueAggregator::notifyQueueEmpty()
+	 */
+	abstract protected function doNotifyQueueEmpty( $wiki, $type );
+
+	/**
+	 * Mark a queue as being non-empty
+	 *
+	 * @param string $wiki
+	 * @param string $type
+	 * @return bool Success
+	 */
+	final public function notifyQueueNonEmpty( $wiki, $type ) {
+		wfProfileIn( __METHOD__ );
+		$ok = $this->doNotifyQueueNonEmpty( $wiki, $type );
+		wfProfileOut( __METHOD__ );
+		return $ok;
+	}
+
+	/**
+	 * @see JobQueueAggregator::notifyQueueNonEmpty()
+	 */
+	abstract protected function doNotifyQueueNonEmpty( $wiki, $type );
+
+	/**
+	 * Get the list of all of the queues with jobs
+	 *
+	 * @return Array (job type => (list of wiki IDs))
+	 */
+	final public function getAllReadyWikiQueues() {
+		wfProfileIn( __METHOD__ );
+		$res = $this->doGetAllReadyWikiQueues();
+		wfProfileOut( __METHOD__ );
+		return $res;
+	}
+
+	/**
+	 * @see JobQueueAggregator::getAllReadyWikiQueues()
+	 */
+	abstract protected function doGetAllReadyWikiQueues();
+
+	/**
+	 * Purge all of the aggregator information
+	 *
+	 * @return bool Success
+	 */
+	final public function purge() {
+		wfProfileIn( __METHOD__ );
+		$res = $this->doPurge();
+		wfProfileOut( __METHOD__ );
+		return $res;
+	}
+
+	/**
+	 * @see JobQueueAggregator::purge()
+	 */
+	abstract protected function doPurge();
+
+	/**
+	 * Get all databases that have a pending job.
+	 * This poll all the queues and is this expensive.
+	 *
+	 * @return Array (job type => (list of wiki IDs))
+	 */
+	protected function findPendingWikiQueues() {
+		global $wgLocalDatabases;
+
+		$pendingDBs = array(); // (job type => (db list))
+		foreach ( $wgLocalDatabases as $db ) {
+			foreach ( JobQueueGroup::singleton( $db )->getQueuesWithJobs() as $type ) {
+				$pendingDBs[$type][] = $db;
+			}
+		}
+
+		return $pendingDBs;
+	}
+}
diff --git a/includes/job/aggregator/JobQueueAggregatorMemc.php b/includes/job/aggregator/JobQueueAggregatorMemc.php
new file mode 100644
index 00000000..9434da04
--- /dev/null
+++ b/includes/job/aggregator/JobQueueAggregatorMemc.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Job queue aggregator code that uses BagOStuff.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues using BagOStuff
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueAggregatorMemc extends JobQueueAggregator {
+	/** @var BagOStuff */
+	protected $cache;
+
+	protected $cacheTTL; // integer; seconds
+
+	/**
+	 * @params include:
+	 *   - objectCache : Name of an object cache registered in $wgObjectCaches.
+	 *                   This defaults to the one specified by $wgMainCacheType.
+	 *   - cacheTTL    : Seconds to cache the aggregate data before regenerating.
+	 * @param array $params
+	 */
+	protected function __construct( array $params ) {
+		parent::__construct( $params );
+		$this->cache = isset( $params['objectCache'] )
+			? wfGetCache( $params['objectCache'] )
+			: wfGetMainCache();
+		$this->cacheTTL = isset( $params['cacheTTL'] ) ? $params['cacheTTL'] : 180; // 3 min
+	}
+
+	/**
+	 * @see JobQueueAggregator::doNotifyQueueEmpty()
+	 */
+	protected function doNotifyQueueEmpty( $wiki, $type ) {
+		$key = $this->getReadyQueueCacheKey();
+		// Delist the queue from the "ready queue" list
+		if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
+			$curInfo = $this->cache->get( $key );
+			if ( is_array( $curInfo ) && isset( $curInfo['pendingDBs'][$type] ) ) {
+				if ( in_array( $wiki, $curInfo['pendingDBs'][$type] ) ) {
+					$curInfo['pendingDBs'][$type] = array_diff(
+						$curInfo['pendingDBs'][$type], array( $wiki ) );
+					$this->cache->set( $key, $curInfo );
+				}
+			}
+			$this->cache->delete( "$key:lock" ); // unlock
+		}
+		return true;
+	}
+
+	/**
+	 * @see JobQueueAggregator::doNotifyQueueNonEmpty()
+	 */
+	protected function doNotifyQueueNonEmpty( $wiki, $type ) {
+		return true; // updated periodically
+	}
+
+	/**
+	 * @see JobQueueAggregator::doAllGetReadyWikiQueues()
+	 */
+	protected function doGetAllReadyWikiQueues() {
+		$key = $this->getReadyQueueCacheKey();
+		// If the cache entry wasn't present, is stale, or in .1% of cases otherwise,
+		// regenerate the cache. Use any available stale cache if another process is
+		// currently regenerating the pending DB information.
+		$pendingDbInfo = $this->cache->get( $key );
+		if ( !is_array( $pendingDbInfo )
+			|| ( time() - $pendingDbInfo['timestamp'] ) > $this->cacheTTL
+			|| mt_rand( 0, 999 ) == 0
+		) {
+			if ( $this->cache->add( "$key:rebuild", 1, 1800 ) ) { // lock
+				$pendingDbInfo = array(
+					'pendingDBs' => $this->findPendingWikiQueues(),
+					'timestamp' => time()
+				);
+				for ( $attempts = 1; $attempts <= 25; ++$attempts ) {
+					if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
+						$this->cache->set( $key, $pendingDbInfo );
+						$this->cache->delete( "$key:lock" ); // unlock
+						break;
+					}
+				}
+				$this->cache->delete( "$key:rebuild" ); // unlock
+			}
+		}
+		return is_array( $pendingDbInfo )
+			? $pendingDbInfo['pendingDBs']
+			: array(); // cache is both empty and locked
+	}
+
+	/**
+	 * @see JobQueueAggregator::doPurge()
+	 */
+	protected function doPurge() {
+		return $this->cache->delete( $this->getReadyQueueCacheKey() );
+	}
+
+	/**
+	 * @return string
+	 */
+	private function getReadyQueueCacheKey() {
+		return "jobqueue:aggregator:ready-queues:v1"; // global
+	}
+}
diff --git a/includes/job/aggregator/JobQueueAggregatorRedis.php b/includes/job/aggregator/JobQueueAggregatorRedis.php
new file mode 100644
index 00000000..c6a799df
--- /dev/null
+++ b/includes/job/aggregator/JobQueueAggregatorRedis.php
@@ -0,0 +1,193 @@
+<?php
+/**
+ * Job queue aggregator code that uses PhpRedis.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues using PhpRedis
+ *
+ * @ingroup JobQueue
+ * @ingroup Redis
+ * @since 1.21
+ */
+class JobQueueAggregatorRedis extends JobQueueAggregator {
+	/** @var RedisConnectionPool */
+	protected $redisPool;
+
+	/**
+	 * @params include:
+	 *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
+	 *   - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
+	 *                   If a hostname is specified but no port, the standard port number
+	 *                   6379 will be used. Required.
+	 * @param array $params
+	 */
+	protected function __construct( array $params ) {
+		parent::__construct( $params );
+		$this->server = $params['redisServer'];
+		$this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
+	}
+
+	/**
+	 * @see JobQueueAggregator::doNotifyQueueEmpty()
+	 */
+	protected function doNotifyQueueEmpty( $wiki, $type ) {
+		$conn = $this->getConnection();
+		if ( !$conn ) {
+			return false;
+		}
+		try {
+			$conn->hDel( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ) );
+			return true;
+		} catch ( RedisException $e ) {
+			$this->handleException( $conn, $e );
+			return false;
+		}
+	}
+
+	/**
+	 * @see JobQueueAggregator::doNotifyQueueNonEmpty()
+	 */
+	protected function doNotifyQueueNonEmpty( $wiki, $type ) {
+		$conn = $this->getConnection();
+		if ( !$conn ) {
+			return false;
+		}
+		try {
+			$conn->hSet( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ), time() );
+			return true;
+		} catch ( RedisException $e ) {
+			$this->handleException( $conn, $e );
+			return false;
+		}
+	}
+
+	/**
+	 * @see JobQueueAggregator::doAllGetReadyWikiQueues()
+	 */
+	protected function doGetAllReadyWikiQueues() {
+		$conn = $this->getConnection();
+		if ( !$conn ) {
+			return array();
+		}
+		try {
+			$conn->multi( Redis::PIPELINE );
+			$conn->exists( $this->getReadyQueueKey() );
+			$conn->hGetAll( $this->getReadyQueueKey() );
+			list( $exists, $map ) = $conn->exec();
+
+			if ( $exists ) { // cache hit
+				$pendingDBs = array(); // (type => list of wikis)
+				foreach ( $map as $key => $time ) {
+					list( $type, $wiki ) = $this->dencQueueName( $key );
+					$pendingDBs[$type][] = $wiki;
+				}
+			} else { // cache miss
+				// Avoid duplicated effort
+				$conn->multi( Redis::MULTI );
+				$conn->setnx( $this->getReadyQueueKey() . ":lock", 1 );
+				$conn->expire( $this->getReadyQueueKey() . ":lock", 3600 );
+				if ( $conn->exec() !== array( true, true ) ) { // lock
+					return array(); // already in progress
+				}
+
+				$pendingDBs = $this->findPendingWikiQueues(); // (type => list of wikis)
+
+				$conn->delete( $this->getReadyQueueKey() . ":lock" ); // unlock
+
+				$now = time();
+				$map = array();
+				foreach ( $pendingDBs as $type => $wikis ) {
+					foreach ( $wikis as $wiki ) {
+						$map[$this->encQueueName( $type, $wiki )] = $now;
+					}
+				}
+				$conn->hMSet( $this->getReadyQueueKey(), $map );
+			}
+
+			return $pendingDBs;
+		} catch ( RedisException $e ) {
+			$this->handleException( $conn, $e );
+			return array();
+		}
+	}
+
+	/**
+	 * @see JobQueueAggregator::doPurge()
+	 */
+	protected function doPurge() {
+		$conn = $this->getConnection();
+		if ( !$conn ) {
+			return false;
+		}
+		try {
+			$conn->delete( $this->getReadyQueueKey() );
+		} catch ( RedisException $e ) {
+			$this->handleException( $conn, $e );
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Get a connection to the server that handles all sub-queues for this queue
+	 *
+	 * @return Array (server name, Redis instance)
+	 * @throws MWException
+	 */
+	protected function getConnection() {
+		return $this->redisPool->getConnection( $this->server );
+	}
+
+	/**
+	 * @param RedisConnRef $conn
+	 * @param RedisException $e
+	 * @return void
+	 */
+	protected function handleException( RedisConnRef $conn, $e ) {
+		$this->redisPool->handleException( $this->server, $conn, $e );
+	}
+
+	/**
+	 * @return string
+	 */
+	private function getReadyQueueKey() {
+		return "jobqueue:aggregator:h-ready-queues:v1"; // global
+	}
+
+	/**
+	 * @param string $type
+	 * @param string $wiki
+	 * @return string
+	 */
+	private function encQueueName( $type, $wiki ) {
+		return rawurlencode( $type ) . '/' . rawurlencode( $wiki );
+	}
+
+	/**
+	 * @param string $name
+	 * @return string
+	 */
+	private function dencQueueName( $name ) {
+		list( $type, $wiki ) = explode( '/', $name, 2 );
+		return array( rawurldecode( $type ), rawurldecode( $wiki ) );
+	}
+}
diff --git a/includes/job/jobs/AssembleUploadChunksJob.php b/includes/job/jobs/AssembleUploadChunksJob.php
index c5dd9eaa..6237e568 100644
--- a/includes/job/jobs/AssembleUploadChunksJob.php
+++ b/includes/job/jobs/AssembleUploadChunksJob.php
@@ -42,6 +42,15 @@ class AssembleUploadChunksJob extends Job {
 				return false;
 			}
 
+			if ( count( $_SESSION ) === 0 ) {
+				// Empty session probably indicates that we didn't associate
+				// with the session correctly. Note that being able to load
+				// the user does not necessarily mean the session was loaded.
+				// Most likely cause by suhosin.session.encrypt = On.
+				$this->setLastError( "Error associating with user session. Try setting suhosin.session.encrypt = Off" );
+				return false;
+			}
+
 			UploadBase::setSessionStatus(
 				$this->params['filekey'],
 				array( 'result' => 'Poll', 'stage' => 'assembling', 'status' => Status::newGood() )
@@ -82,11 +91,11 @@ class AssembleUploadChunksJob extends Job {
 			UploadBase::setSessionStatus(
 				$this->params['filekey'],
 				array(
-					'result'    => 'Success',
-					'stage'     => 'assembling',
-					'filekey'   => $newFileKey,
+					'result' => 'Success',
+					'stage' => 'assembling',
+					'filekey' => $newFileKey,
 					'imageinfo' => $imageInfo,
-					'status'    => Status::newGood()
+					'status' => Status::newGood()
 				)
 			);
 		} catch ( MWException $e ) {
@@ -94,7 +103,7 @@ class AssembleUploadChunksJob extends Job {
 				$this->params['filekey'],
 				array(
 					'result' => 'Failure',
-					'stage'  => 'assembling',
+					'stage' => 'assembling',
 					'status' => Status::newFatal( 'api-error-stashfailed' )
 				)
 			);
diff --git a/includes/job/jobs/DoubleRedirectJob.php b/includes/job/jobs/DoubleRedirectJob.php
index 05abeeef..33e749b8 100644
--- a/includes/job/jobs/DoubleRedirectJob.php
+++ b/includes/job/jobs/DoubleRedirectJob.php
@@ -90,40 +90,40 @@ class DoubleRedirectJob extends Job {
 
 		$targetRev = Revision::newFromTitle( $this->title, false, Revision::READ_LATEST );
 		if ( !$targetRev ) {
-			wfDebug( __METHOD__.": target redirect already deleted, ignoring\n" );
+			wfDebug( __METHOD__ . ": target redirect already deleted, ignoring\n" );
 			return true;
 		}
 		$content = $targetRev->getContent();
 		$currentDest = $content ? $content->getRedirectTarget() : null;
 		if ( !$currentDest || !$currentDest->equals( $this->redirTitle ) ) {
-			wfDebug( __METHOD__.": Redirect has changed since the job was queued\n" );
+			wfDebug( __METHOD__ . ": Redirect has changed since the job was queued\n" );
 			return true;
 		}
 
-		# Check for a suppression tag (used e.g. in periodically archived discussions)
+		// Check for a suppression tag (used e.g. in periodically archived discussions)
 		$mw = MagicWord::get( 'staticredirect' );
 		if ( $content->matchMagicWord( $mw ) ) {
-			wfDebug( __METHOD__.": skipping: suppressed with __STATICREDIRECT__\n" );
+			wfDebug( __METHOD__ . ": skipping: suppressed with __STATICREDIRECT__\n" );
 			return true;
 		}
 
-		# Find the current final destination
+		// Find the current final destination
 		$newTitle = self::getFinalDestination( $this->redirTitle );
 		if ( !$newTitle ) {
-			wfDebug( __METHOD__.": skipping: single redirect, circular redirect or invalid redirect destination\n" );
+			wfDebug( __METHOD__ . ": skipping: single redirect, circular redirect or invalid redirect destination\n" );
 			return true;
 		}
 		if ( $newTitle->equals( $this->redirTitle ) ) {
-			# The redirect is already right, no need to change it
-			# This can happen if the page was moved back (say after vandalism)
-			wfDebug( __METHOD__.": skipping, already good\n" );
+			// The redirect is already right, no need to change it
+			// This can happen if the page was moved back (say after vandalism)
+			wfDebug( __METHOD__ . " : skipping, already good\n" );
 		}
 
-		# Preserve fragment (bug 14904)
+		// Preserve fragment (bug 14904)
 		$newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
 			$currentDest->getFragment(), $newTitle->getInterwiki() );
 
-		# Fix the text
+		// Fix the text
 		$newContent = $content->updateRedirect( $newTitle );
 
 		if ( $newContent->equals( $content ) ) {
@@ -137,11 +137,13 @@ class DoubleRedirectJob extends Job {
 			return false;
 		}
 
-		# Save it
+		// Save it
 		global $wgUser;
 		$oldUser = $wgUser;
 		$wgUser = $user;
 		$article = WikiPage::factory( $this->title );
+
+		// Messages: double-redirect-fixed-move, double-redirect-fixed-maintenance
 		$reason = wfMessage( 'double-redirect-fixed-' . $this->reason,
 			$this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText()
 		)->inContentLanguage()->text();
@@ -161,7 +163,8 @@ class DoubleRedirectJob extends Job {
 	public static function getFinalDestination( $title ) {
 		$dbw = wfGetDB( DB_MASTER );
 
-		$seenTitles = array(); # Circular redirect check
+		// Circular redirect check
+		$seenTitles = array();
 		$dest = false;
 
 		while ( true ) {
diff --git a/includes/job/jobs/DuplicateJob.php b/includes/job/jobs/DuplicateJob.php
index 524983b8..be1bfe5c 100644
--- a/includes/job/jobs/DuplicateJob.php
+++ b/includes/job/jobs/DuplicateJob.php
@@ -45,7 +45,7 @@ final class DuplicateJob extends Job {
 	 * @return Job
 	 */
 	public static function newFromJob( Job $job ) {
-		$djob = new self( $job->getTitle(), $job->getParams(), $job->getId() );
+		$djob = new self( $job->getTitle(), $job->getParams(), $job->id );
 		$djob->command = $job->getType();
 		$djob->params = is_array( $djob->params ) ? $djob->params : array();
 		$djob->params = array( 'isDuplicate' => true ) + $djob->params;
diff --git a/includes/job/jobs/EnotifNotifyJob.php b/includes/job/jobs/EnotifNotifyJob.php
index 2be05b63..bbe988d0 100644
--- a/includes/job/jobs/EnotifNotifyJob.php
+++ b/includes/job/jobs/EnotifNotifyJob.php
@@ -35,7 +35,7 @@ class EnotifNotifyJob extends Job {
 	function run() {
 		$enotif = new EmailNotification();
 		// Get the user from ID (rename safe). Anons are 0, so defer to name.
-		if( isset( $this->params['editorID'] ) && $this->params['editorID'] ) {
+		if ( isset( $this->params['editorID'] ) && $this->params['editorID'] ) {
 			$editor = User::newFromId( $this->params['editorID'] );
 		// B/C, only the name might be given.
 		} else {
diff --git a/includes/job/jobs/HTMLCacheUpdateJob.php b/includes/job/jobs/HTMLCacheUpdateJob.php
index 818c6abf..44c240bb 100644
--- a/includes/job/jobs/HTMLCacheUpdateJob.php
+++ b/includes/job/jobs/HTMLCacheUpdateJob.php
@@ -79,8 +79,16 @@ class HTMLCacheUpdateJob extends Job {
 	 * Update all of the backlinks
 	 */
 	protected function doFullUpdate() {
+		global $wgMaxBacklinksInvalidate;
+
 		# Get an estimate of the number of rows from the BacklinkCache
-		$numRows = $this->blCache->getNumLinks( $this->params['table'] );
+		$max = max( $this->rowsPerJob * 2, $wgMaxBacklinksInvalidate ) + 1;
+		$numRows = $this->blCache->getNumLinks( $this->params['table'], $max );
+		if ( $wgMaxBacklinksInvalidate !== false && $numRows > $wgMaxBacklinksInvalidate ) {
+			wfDebug( "Skipped HTML cache invalidation of {$this->title->getPrefixedText()}." );
+			return true;
+		}
+
 		if ( $numRows > $this->rowsPerJob * 2 ) {
 			# Do fast cached partition
 			$this->insertPartitionJobs();
@@ -90,12 +98,13 @@ class HTMLCacheUpdateJob extends Job {
 			# Check if the row count estimate was correct
 			if ( $titleArray->count() > $this->rowsPerJob * 2 ) {
 				# Not correct, do accurate partition
-				wfDebug( __METHOD__.": row count estimate was incorrect, repartitioning\n" );
+				wfDebug( __METHOD__ . ": row count estimate was incorrect, repartitioning\n" );
 				$this->insertJobsFromTitles( $titleArray );
 			} else {
 				$this->invalidateTitles( $titleArray ); // just do the query
 			}
 		}
+
 		return true;
 	}
 
@@ -145,7 +154,7 @@ class HTMLCacheUpdateJob extends Job {
 					array(
 						'table' => $this->params['table'],
 						'start' => $start,
-						'end'   => $id - 1
+						'end' => $id - 1
 					) + $rootJobParams // carry over information for de-duplication
 				);
 				$start = $id;
@@ -158,16 +167,16 @@ class HTMLCacheUpdateJob extends Job {
 			array(
 				'table' => $this->params['table'],
 				'start' => $start,
-				'end'   => $this->params['end']
+				'end' => $this->params['end']
 			) + $rootJobParams // carry over information for de-duplication
 		);
-		wfDebug( __METHOD__.": repartitioning into " . count( $jobs ) . " jobs\n" );
+		wfDebug( __METHOD__ . ": repartitioning into " . count( $jobs ) . " jobs\n" );
 
 		if ( count( $jobs ) < 2 ) {
 			# I don't think this is possible at present, but handling this case
 			# makes the code a bit more robust against future code updates and
 			# avoids a potential infinite loop of repartitioning
-			wfDebug( __METHOD__.": repartitioning failed!\n" );
+			wfDebug( __METHOD__ . ": repartitioning failed!\n" );
 			$this->invalidateTitles( $titleArray );
 		} else {
 			JobQueueGroup::singleton()->push( $jobs );
@@ -194,7 +203,7 @@ class HTMLCacheUpdateJob extends Job {
 				array(
 					'table' => $this->params['table'],
 					'start' => $start,
-					'end'   => $end,
+					'end' => $end,
 				) + $rootJobParams // carry over information for de-duplication
 			);
 		}
@@ -245,7 +254,7 @@ class HTMLCacheUpdateJob extends Job {
 		}
 
 		# Update file cache
-		if  ( $wgUseFileCache ) {
+		if ( $wgUseFileCache ) {
 			foreach ( $titleArray as $title ) {
 				HTMLFileCache::clearFileCache( $title );
 			}
diff --git a/includes/job/jobs/NullJob.php b/includes/job/jobs/NullJob.php
index d282a8e6..b6164a5d 100644
--- a/includes/job/jobs/NullJob.php
+++ b/includes/job/jobs/NullJob.php
@@ -26,6 +26,22 @@
  * in the queue and/or sleep for a brief time period. These can be used
  * to represent "no-op" jobs or test lock contention and performance.
  *
+ * @par Example:
+ * Inserting a null job in the configured job queue:
+ * @code
+ * $ php maintenance/eval.php
+ * > $queue = JobQueueGroup::singleton();
+ * > $job = new NullJob( Title::newMainPage(), array( 'lives' => 10 ) );
+ * > $queue->push( $job );
+ * @endcode
+ * You can then confirm the job has been enqueued by using the showJobs.php
+ * maintenance utility:
+ * @code
+ * $ php maintenance/showJobs.php --group
+ * null: 1 queue; 0 claimed (0 active, 0 abandoned)
+ * $
+ * @endcode
+ *
  * @ingroup JobQueue
  */
 class NullJob extends Job {
diff --git a/includes/job/jobs/PublishStashedFileJob.php b/includes/job/jobs/PublishStashedFileJob.php
index d3feda28..5a24f93c 100644
--- a/includes/job/jobs/PublishStashedFileJob.php
+++ b/includes/job/jobs/PublishStashedFileJob.php
@@ -42,13 +42,23 @@ class PublishStashedFileJob extends Job {
 				return false;
 			}
 
+			if ( count( $_SESSION ) === 0 ) {
+				// Empty session probably indicates that we didn't associate
+				// with the session correctly. Note that being able to load
+				// the user does not necessarily mean the session was loaded.
+				// Most likely cause by suhosin.session.encrypt = On.
+				$this->setLastError( "Error associating with user session. Try setting suhosin.session.encrypt = Off" );
+				return false;
+			}
+
+
 			UploadBase::setSessionStatus(
 				$this->params['filekey'],
 				array( 'result' => 'Poll', 'stage' => 'publish', 'status' => Status::newGood() )
 			);
 
 			$upload = new UploadFromStash( $user );
-			// @TODO: initialize() causes a GET, ideally we could frontload the antivirus
+			// @todo initialize() causes a GET, ideally we could frontload the antivirus
 			// checks and anything else to the stash stage (which includes concatenation and
 			// the local file is thus already there). That way, instead of GET+PUT, there could
 			// just be a COPY operation from the stash to the public zone.
@@ -94,11 +104,11 @@ class PublishStashedFileJob extends Job {
 			UploadBase::setSessionStatus(
 				$this->params['filekey'],
 				array(
-					'result'    => 'Success',
-					'stage'     => 'publish',
-					'filename'  => $upload->getLocalFile()->getName(),
+					'result' => 'Success',
+					'stage' => 'publish',
+					'filename' => $upload->getLocalFile()->getName(),
 					'imageinfo' => $imageInfo,
-					'status'    => Status::newGood()
+					'status' => Status::newGood()
 				)
 			);
 		} catch ( MWException $e ) {
@@ -106,7 +116,7 @@ class PublishStashedFileJob extends Job {
 				$this->params['filekey'],
 				array(
 					'result' => 'Failure',
-					'stage'  => 'publish',
+					'stage' => 'publish',
 					'status' => Status::newFatal( 'api-error-publishfailed' )
 				)
 			);
diff --git a/includes/job/jobs/RefreshLinksJob.php b/includes/job/jobs/RefreshLinksJob.php
index 9dbe8278..4fc8bac6 100644
--- a/includes/job/jobs/RefreshLinksJob.php
+++ b/includes/job/jobs/RefreshLinksJob.php
@@ -37,21 +37,18 @@ class RefreshLinksJob extends Job {
 	 * @return boolean success
 	 */
 	function run() {
-		wfProfileIn( __METHOD__ );
-
 		$linkCache = LinkCache::singleton();
 		$linkCache->clear();
 
 		if ( is_null( $this->title ) ) {
 			$this->error = "refreshLinks: Invalid title";
-			wfProfileOut( __METHOD__ );
 			return false;
 		}
 
 		# Wait for the DB of the current/next slave DB handle to catch up to the master.
 		# This way, we get the correct page_latest for templates or files that just changed
 		# milliseconds ago, having triggered this job to begin with.
-		if ( isset( $this->params['masterPos'] ) ) {
+		if ( isset( $this->params['masterPos'] ) && $this->params['masterPos'] !== false ) {
 			wfGetLB()->waitFor( $this->params['masterPos'] );
 		}
 
@@ -59,13 +56,11 @@ class RefreshLinksJob extends Job {
 		if ( !$revision ) {
 			$this->error = 'refreshLinks: Article not found "' .
 				$this->title->getPrefixedDBkey() . '"';
-			wfProfileOut( __METHOD__ );
 			return false; // XXX: what if it was just deleted?
 		}
 
 		self::runForTitleInternal( $this->title, $revision, __METHOD__ );
 
-		wfProfileOut( __METHOD__ );
 		return true;
 	}
 
@@ -101,6 +96,9 @@ class RefreshLinksJob extends Job {
 
 		$updates = $content->getSecondaryDataUpdates( $title, null, false, $parserOutput );
 		DataUpdate::runUpdates( $updates );
+
+		InfoAction::invalidateCache( $title );
+
 		wfProfileOut( $fname );
 	}
 }
@@ -114,6 +112,8 @@ class RefreshLinksJob extends Job {
 class RefreshLinksJob2 extends Job {
 	function __construct( $title, $params, $id = 0 ) {
 		parent::__construct( 'refreshLinks2', $title, $params, $id );
+		// Base jobs for large templates can easily be de-duplicated
+		$this->removeDuplicates = !isset( $params['start'] ) && !isset( $params['end'] );
 	}
 
 	/**
@@ -123,14 +123,11 @@ class RefreshLinksJob2 extends Job {
 	function run() {
 		global $wgUpdateRowsPerJob;
 
-		wfProfileIn( __METHOD__ );
-
 		$linkCache = LinkCache::singleton();
 		$linkCache->clear();
 
 		if ( is_null( $this->title ) ) {
 			$this->error = "refreshLinks2: Invalid title";
-			wfProfileOut( __METHOD__ );
 			return false;
 		}
 
@@ -144,7 +141,7 @@ class RefreshLinksJob2 extends Job {
 		// Hopefully, when leaf jobs are popped, the slaves will have reached that position.
 		if ( isset( $this->params['masterPos'] ) ) {
 			$masterPos = $this->params['masterPos'];
-		} elseif ( wfGetLB()->getServerCount() > 1  ) {
+		} elseif ( wfGetLB()->getServerCount() > 1 ) {
 			$masterPos = wfGetLB()->getMasterPos();
 		} else {
 			$masterPos = false;
@@ -158,7 +155,7 @@ class RefreshLinksJob2 extends Job {
 			$jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
 		} else {
 			# This is a base job to trigger the insertion of partitioned jobs...
-			if ( $tbc->getNumLinks( $table ) <= $wgUpdateRowsPerJob ) {
+			if ( $tbc->getNumLinks( $table, $wgUpdateRowsPerJob + 1 ) <= $wgUpdateRowsPerJob ) {
 				# Just directly insert the single per-title jobs
 				$jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
 			} else {
@@ -167,10 +164,10 @@ class RefreshLinksJob2 extends Job {
 					list( $start, $end ) = $batch;
 					$jobs[] = new RefreshLinksJob2( $this->title,
 						array(
-							'table'            => $table,
-							'start'            => $start,
-							'end'              => $end,
-							'masterPos'        => $masterPos,
+							'table' => $table,
+							'start' => $start,
+							'end' => $end,
+							'masterPos' => $masterPos,
 						) + $this->getRootJobParams() // carry over information for de-duplication
 					);
 				}
@@ -181,7 +178,6 @@ class RefreshLinksJob2 extends Job {
 			JobQueueGroup::singleton()->push( $jobs );
 		}
 
-		wfProfileOut( __METHOD__ );
 		return true;
 	}
 
diff --git a/includes/job/jobs/UploadFromUrlJob.php b/includes/job/jobs/UploadFromUrlJob.php
index 87549140..c993cfb4 100644
--- a/includes/job/jobs/UploadFromUrlJob.php
+++ b/includes/job/jobs/UploadFromUrlJob.php
@@ -48,6 +48,7 @@ class UploadFromUrlJob extends Job {
 	}
 
 	public function run() {
+		global $wgCopyUploadAsyncTimeout;
 		# Initialize this object and the upload object
 		$this->upload = new UploadFromUrl();
 		$this->upload->initialize(
@@ -58,7 +59,11 @@ class UploadFromUrlJob extends Job {
 		$this->user = User::newFromName( $this->params['userName'] );
 
 		# Fetch the file
-		$status = $this->upload->fetchFile();
+		$opts = array();
+		if ( $wgCopyUploadAsyncTimeout ) {
+			$opts['timeout'] = $wgCopyUploadAsyncTimeout;
+		}
+		$status = $this->upload->fetchFile( $opts );
 		if ( !$status->isOk() ) {
 			$this->leaveMessage( $status );
 			return true;
diff --git a/includes/json/FormatJson.php b/includes/json/FormatJson.php
index eececcba..d6116512 100644
--- a/includes/json/FormatJson.php
+++ b/includes/json/FormatJson.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Simple wrapper for json_encode and json_decode that falls back on Services_JSON class.
+ * Wrapper for json_encode and json_decode.
  *
  * 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
@@ -20,50 +20,217 @@
  * @file
  */
 
-require_once __DIR__ . '/Services_JSON.php';
-
 /**
  * JSON formatter wrapper class
  */
 class FormatJson {
 
+	/**
+	 * Skip escaping most characters above U+007F for readability and compactness.
+	 * This encoding option saves 3 to 8 bytes (uncompressed) for each such character;
+	 * however, it could break compatibility with systems that incorrectly handle UTF-8.
+	 *
+	 * @since 1.22
+	 */
+	const UTF8_OK = 1;
+
+	/**
+	 * Skip escaping the characters '<', '>', and '&', which have special meanings in
+	 * HTML and XML.
+	 *
+	 * @warning Do not use this option for JSON that could end up in inline scripts.
+	 * - HTML5, §4.3.1.2 Restrictions for contents of script elements
+	 * - XML 1.0 (5th Ed.), §2.4 Character Data and Markup
+	 *
+	 * @since 1.22
+	 */
+	const XMLMETA_OK = 2;
+
+	/**
+	 * Skip escaping as many characters as reasonably possible.
+	 *
+	 * @warning When generating inline script blocks, use FormatJson::UTF8_OK instead.
+	 *
+	 * @since 1.22
+	 */
+	const ALL_OK = 3;
+
+	/**
+	 * Regex that matches whitespace inside empty arrays and objects.
+	 *
+	 * This doesn't affect regular strings inside the JSON because those can't
+	 * have a real line break (\n) in them, at this point they are already escaped
+	 * as the string "\n" which this doesn't match.
+	 *
+	 * @private
+	 */
+	const WS_CLEANUP_REGEX = '/(?<=[\[{])\n\s*+(?=[\]}])/';
+
+	/**
+	 * Characters problematic in JavaScript.
+	 *
+	 * @note These are listed in ECMA-262 (5.1 Ed.), §7.3 Line Terminators along with U+000A (LF)
+	 *       and U+000D (CR). However, PHP already escapes LF and CR according to RFC 4627.
+	 */
+	private static $badChars = array(
+		"\xe2\x80\xa8", // U+2028 LINE SEPARATOR
+		"\xe2\x80\xa9", // U+2029 PARAGRAPH SEPARATOR
+	);
+
+	/**
+	 * Escape sequences for characters listed in FormatJson::$badChars.
+	 */
+	private static $badCharsEscaped = array(
+		'\u2028', // U+2028 LINE SEPARATOR
+		'\u2029', // U+2029 PARAGRAPH SEPARATOR
+	);
+
 	/**
 	 * Returns the JSON representation of a value.
 	 *
-	 * @param $value Mixed: the value being encoded. Can be any type except a resource.
-	 * @param $pretty Boolean: If true, adds non-significant whitespace to improve readability.
+	 * @note Empty arrays are encoded as numeric arrays, not as objects, so cast any associative
+	 *       array that might be empty to an object before encoding it.
 	 *
-	 * @return string
+	 * @note In pre-1.22 versions of MediaWiki, using this function for generating inline script
+	 *       blocks may result in an XSS vulnerability, and quite likely will in XML documents
+	 *       (cf. FormatJson::XMLMETA_OK). Use Xml::encodeJsVar() instead in such cases.
+	 *
+	 * @param mixed $value The value to encode. Can be any type except a resource.
+	 * @param bool $pretty If true, add non-significant whitespace to improve readability.
+	 * @param int $escaping Bitfield consisting of _OK class constants
+	 * @return string|bool: String if successful; false upon failure
 	 */
-	public static function encode( $value, $pretty = false ) {
-		if ( !function_exists( 'json_encode' ) || ( $pretty && version_compare( PHP_VERSION, '5.4.0', '<' ) ) ) {
-			$json = new Services_JSON();
-			return $json->encode( $value, $pretty );
-		} else {
-			return json_encode( $value, $pretty ? JSON_PRETTY_PRINT : 0 );
+	public static function encode( $value, $pretty = false, $escaping = 0 ) {
+		if ( defined( 'JSON_UNESCAPED_UNICODE' ) ) {
+			return self::encode54( $value, $pretty, $escaping );
 		}
+		return self::encode53( $value, $pretty, $escaping );
 	}
 
 	/**
 	 * Decodes a JSON string.
 	 *
-	 * @param string $value the json string being decoded.
-	 * @param $assoc Boolean: when true, returned objects will be converted into associative arrays.
+	 * @param string $value The JSON string being decoded
+	 * @param bool $assoc When true, returned objects will be converted into associative arrays.
 	 *
-	 * @return Mixed: the value encoded in json in appropriate PHP type.
-	 * Values true, false and null (case-insensitive) are returned as true, false
-	 * and "&null;" respectively. "&null;" is returned if the json cannot be
-	 * decoded or if the encoded data is deeper than the recursion limit.
+	 * @return mixed: the value encoded in JSON in appropriate PHP type.
+	 * `null` is returned if the JSON cannot be decoded or if the encoded data is deeper than
+	 * the recursion limit.
 	 */
 	public static function decode( $value, $assoc = false ) {
-		if ( !function_exists( 'json_decode' ) ) {
-			$json = $assoc ? new Services_JSON( SERVICES_JSON_LOOSE_TYPE ) :
-				new Services_JSON();
-			$jsonDec = $json->decode( $value );
-			return $jsonDec;
-		} else {
-			return json_decode( $value, $assoc );
+		return json_decode( $value, $assoc );
+	}
+
+	/**
+	 * JSON encoder wrapper for PHP >= 5.4, which supports useful encoding options.
+	 *
+	 * @param mixed $value
+	 * @param bool $pretty
+	 * @param int $escaping
+	 * @return string|bool
+	 */
+	private static function encode54( $value, $pretty, $escaping ) {
+		// PHP escapes '/' to prevent breaking out of inline script blocks using '</script>',
+		// which is hardly useful when '<' and '>' are escaped (and inadequate), and such
+		// escaping negatively impacts the human readability of URLs and similar strings.
+		$options = JSON_UNESCAPED_SLASHES;
+		$options |= $pretty ? JSON_PRETTY_PRINT : 0;
+		$options |= ( $escaping & self::UTF8_OK ) ? JSON_UNESCAPED_UNICODE : 0;
+		$options |= ( $escaping & self::XMLMETA_OK ) ? 0 : ( JSON_HEX_TAG | JSON_HEX_AMP );
+		$json = json_encode( $value, $options );
+		if ( $json === false ) {
+			return false;
 		}
+
+		if ( $pretty ) {
+			// Remove whitespace inside empty arrays/objects; different JSON encoders
+			// vary on this, and we want our output to be consistent across implementations.
+			$json = preg_replace( self::WS_CLEANUP_REGEX, '', $json );
+		}
+		if ( $escaping & self::UTF8_OK ) {
+			$json = str_replace( self::$badChars, self::$badCharsEscaped, $json );
+		}
+		return $json;
 	}
 
+	/**
+	 * JSON encoder wrapper for PHP 5.3, which lacks native support for some encoding options.
+	 * Therefore, the missing options are implemented here purely in PHP code.
+	 *
+	 * @param mixed $value
+	 * @param bool $pretty
+	 * @param int $escaping
+	 * @return string|bool
+	 */
+	private static function encode53( $value, $pretty, $escaping ) {
+		$options = ( $escaping & self::XMLMETA_OK ) ? 0 : ( JSON_HEX_TAG | JSON_HEX_AMP );
+		$json = json_encode( $value, $options );
+		if ( $json === false ) {
+			return false;
+		}
+
+		// Emulate JSON_UNESCAPED_SLASHES. Because the JSON contains no unescaped slashes
+		// (only escaped slashes), a simple string replacement works fine.
+		$json = str_replace( '\/', '/', $json );
+
+		if ( $escaping & self::UTF8_OK ) {
+			// JSON hex escape sequences follow the format \uDDDD, where DDDD is four hex digits
+			// indicating the equivalent UTF-16 code unit's value. To most efficiently unescape
+			// them, we exploit the JSON extension's built-in decoder.
+			// * We escape the input a second time, so any such sequence becomes \\uDDDD.
+			// * To avoid interpreting escape sequences that were in the original input,
+			//   each double-escaped backslash (\\\\) is replaced with \\\u005c.
+			// * We strip one of the backslashes from each of the escape sequences to unescape.
+			// * Then the JSON decoder can perform the actual unescaping.
+			$json = str_replace( "\\\\\\\\", "\\\\\\u005c", addcslashes( $json, '\"' ) );
+			$json = json_decode( preg_replace( "/\\\\\\\\u(?!00[0-7])/", "\\\\u", "\"$json\"" ) );
+			$json = str_replace( self::$badChars, self::$badCharsEscaped, $json );
+		}
+
+		if ( $pretty ) {
+			return self::prettyPrint( $json );
+		}
+		return $json;
+	}
+
+	/**
+	 * Adds non-significant whitespace to an existing JSON representation of an object.
+	 * Only needed for PHP < 5.4, which lacks the JSON_PRETTY_PRINT option.
+	 *
+	 * @param string $json
+	 * @return string
+	 */
+	private static function prettyPrint( $json ) {
+		$buf = '';
+		$indent = 0;
+		$json = strtr( $json, array( '\\\\' => '\\\\', '\"' => "\x01" ) );
+		for ( $i = 0, $n = strlen( $json ); $i < $n; $i += $skip ) {
+			$skip = 1;
+			switch ( $json[$i] ) {
+				case ':':
+					$buf .= ': ';
+					break;
+				case '[':
+				case '{':
+					++$indent;
+					// falls through
+				case ',':
+					$buf .= $json[$i] . "\n" . str_repeat( '    ', $indent );
+					break;
+				case ']':
+				case '}':
+					$buf .= "\n" . str_repeat( '    ', --$indent ) . $json[$i];
+					break;
+				case '"':
+					$skip = strcspn( $json, '"', $i + 1 ) + 2;
+					$buf .= substr( $json, $i, $skip );
+					break;
+				default:
+					$skip = strcspn( $json, ',]}"', $i + 1 ) + 1;
+					$buf .= substr( $json, $i, $skip );
+			}
+		}
+		$buf = preg_replace( self::WS_CLEANUP_REGEX, '', $buf );
+		return str_replace( "\x01", '\"', $buf );
+	}
 }
diff --git a/includes/json/Services_JSON.php b/includes/json/Services_JSON.php
deleted file mode 100644
index b7c101a1..00000000
--- a/includes/json/Services_JSON.php
+++ /dev/null
@@ -1,882 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
-* Converts to and from JSON format.
-*
-* JSON (JavaScript Object Notation) is a lightweight data-interchange
-* format. It is easy for humans to read and write. It is easy for machines
-* to parse and generate. It is based on a subset of the JavaScript
-* Programming Language, Standard ECMA-262 3rd Edition - December 1999.
-* This feature can also be found in  Python. JSON is a text format that is
-* completely language independent but uses conventions that are familiar
-* to programmers of the C-family of languages, including C, C++, C#, Java,
-* JavaScript, Perl, TCL, and many others. These properties make JSON an
-* ideal data-interchange language.
-*
-* This package provides a simple encoder and decoder for JSON notation. It
-* is intended for use with client-side Javascript applications that make
-* use of HTTPRequest to perform server communication functions - data can
-* be encoded into JSON notation for use in a client-side javascript, or
-* decoded from incoming Javascript requests. JSON format is native to
-* Javascript, and can be directly eval()'ed with no further parsing
-* overhead
-*
-* All strings should be in ASCII or UTF-8 format!
-*
-* LICENSE: Redistribution and use in source and binary forms, with or
-* without modification, are permitted provided that the following
-* conditions are met: Redistributions of source code must retain the
-* above copyright notice, this list of conditions and the following
-* disclaimer. Redistributions in binary form must reproduce the above
-* copyright notice, this list of conditions and the following disclaimer
-* in the documentation and/or other materials provided with the
-* distribution.
-*
-* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
-* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
-* NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
-* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
-* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
-* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-* DAMAGE.
-*
-* @file
-* @ingroup API
-* @author Michal Migurski <mike-json@teczno.com>
-* @author Matt Knapp <mdknapp[at]gmail[dot]com>
-* @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
-* @copyright 2005 Michal Migurski
-* @version CVS: $Id$
-* @license http://www.opensource.org/licenses/bsd-license.php
-* @see http://pear.php.net/pepr/pepr-proposal-show.php?id=198
-*/
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_SLICE',   1);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_STR',  2);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_ARR',  3);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_OBJ',  4);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_CMT', 5);
-
-/**
-* Behavior switch for Services_JSON::decode()
-*/
-define('SERVICES_JSON_LOOSE_TYPE', 16);
-
-/**
-* Behavior switch for Services_JSON::decode()
-*/
-define('SERVICES_JSON_SUPPRESS_ERRORS', 32);
-
-/**
- * Converts to and from JSON format.
- *
- * Brief example of use:
- *
- * <code>
- * // create a new instance of Services_JSON
- * $json = new Services_JSON();
- *
- * // convert a complex value to JSON notation, and send it to the browser
- * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
- * $output = $json->encode($value);
- *
- * print($output);
- * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
- *
- * // accept incoming POST data, assumed to be in JSON notation
- * $input = file_get_contents('php://input', 1000000);
- * $value = $json->decode($input);
- * </code>
- *
- * @ingroup API
- */
-class Services_JSON
-{
-	/**
-	 * constructs a new JSON instance
-	 *
-	 * @param $use Integer: object behavior flags; combine with boolean-OR
-	 *
-	 *	possible values:
-	 *	- SERVICES_JSON_LOOSE_TYPE:  loose typing.
-	 *			"{...}" syntax creates associative arrays
-	 *			instead of objects in decode().
-	 *	- SERVICES_JSON_SUPPRESS_ERRORS:  error suppression.
-	 *			Values which can't be encoded (e.g. resources)
-	 *			appear as NULL instead of throwing errors.
-	 *			By default, a deeply-nested resource will
-	 *			bubble up with an error, so all return values
-	 *			from encode() should be checked with isError()
-	 */
-	function __construct($use = 0)
-	{
-		$this->use = $use;
-	}
-
-	private static $mHavePear = null;
-	/**
-	 * Returns cached result of class_exists('pear'), to avoid calling AutoLoader numerous times
-	 * in cases when PEAR is not present.
-	 * @return boolean
-	 */
-	private static function pearInstalled() {
-		if ( self::$mHavePear === null ) {
-			self::$mHavePear = class_exists( 'pear' );
-		}
-		return self::$mHavePear;
-	}
-
-	/**
-	 * convert a string from one UTF-16 char to one UTF-8 char
-	 *
-	 * Normally should be handled by mb_convert_encoding, but
-	 * provides a slower PHP-only method for installations
-	 * that lack the multibyte string extension.
-	 *
-	 * @param string $utf16 UTF-16 character
-	 * @return String: UTF-8 character
-	 * @access private
-	 */
-	function utf162utf8($utf16)
-	{
-		// oh please oh please oh please oh please oh please
-		if(function_exists('mb_convert_encoding')) {
-			return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
-		}
-
-		$bytes = (ord($utf16[0]) << 8) | ord($utf16[1]);
-
-		switch(true) {
-			case ((0x7F & $bytes) == $bytes):
-				// this case should never be reached, because we are in ASCII range
-				// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-				return chr(0x7F & $bytes);
-
-			case (0x07FF & $bytes) == $bytes:
-				// return a 2-byte UTF-8 character
-				// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-				return chr(0xC0 | (($bytes >> 6) & 0x1F))
-					 . chr(0x80 | ($bytes & 0x3F));
-
-			case (0xFC00 & $bytes) == 0xD800 && strlen($utf16) >= 4 && (0xFC & ord($utf16[2])) == 0xDC:
-				// return a 4-byte UTF-8 character
-				$char = ((($bytes & 0x03FF) << 10)
-					   | ((ord($utf16[2]) & 0x03) << 8)
-					   | ord($utf16[3]));
-				$char += 0x10000;
-				return chr(0xF0 | (($char >> 18) & 0x07))
-					 . chr(0x80 | (($char >> 12) & 0x3F))
-					 . chr(0x80 | (($char >> 6) & 0x3F))
-					 . chr(0x80 | ($char & 0x3F));
-
-			case (0xFFFF & $bytes) == $bytes:
-				// return a 3-byte UTF-8 character
-				// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-				return chr(0xE0 | (($bytes >> 12) & 0x0F))
-					 . chr(0x80 | (($bytes >> 6) & 0x3F))
-					 . chr(0x80 | ($bytes & 0x3F));
-		}
-
-		// ignoring UTF-32 for now, sorry
-		return '';
-	}
-
-	/**
-	 * convert a string from one UTF-8 char to one UTF-16 char
-	 *
-	 * Normally should be handled by mb_convert_encoding, but
-	 * provides a slower PHP-only method for installations
-	 * that lack the multibyte string extension.
-	 *
-	 * @param string $utf8 UTF-8 character
-	 * @return String: UTF-16 character
-	 * @access private
-	 */
-	function utf82utf16($utf8)
-	{
-		// oh please oh please oh please oh please oh please
-		if(function_exists('mb_convert_encoding')) {
-			return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
-		}
-
-		switch(strlen($utf8)) {
-			case 1:
-				// this case should never be reached, because we are in ASCII range
-				// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-				return $utf8;
-
-			case 2:
-				// return a UTF-16 character from a 2-byte UTF-8 char
-				// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-				return chr(0x07 & (ord($utf8[0]) >> 2))
-					 . chr((0xC0 & (ord($utf8[0]) << 6))
-						 | (0x3F & ord($utf8[1])));
-
-			case 3:
-				// return a UTF-16 character from a 3-byte UTF-8 char
-				// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-				return chr((0xF0 & (ord($utf8[0]) << 4))
-						 | (0x0F & (ord($utf8[1]) >> 2)))
-					 . chr((0xC0 & (ord($utf8[1]) << 6))
-						 | (0x7F & ord($utf8[2])));
-
-			case 4:
-				// return a UTF-16 surrogate pair from a 4-byte UTF-8 char
-				if(ord($utf8[0]) > 0xF4) return ''; # invalid
-				$char = ((0x1C0000 & (ord($utf8[0]) << 18))
-					   | (0x03F000 & (ord($utf8[1]) << 12))
-					   | (0x000FC0 & (ord($utf8[2]) << 6))
-					   | (0x00003F & ord($utf8[3])));
-				if($char > 0x10FFFF) return ''; # invalid
-				$char -= 0x10000;
-				return chr(0xD8 | (($char >> 18) & 0x03))
-					 . chr(($char >> 10) & 0xFF)
-					 . chr(0xDC | (($char >> 8) & 0x03))
-					 . chr($char & 0xFF);
-		}
-
-		// ignoring UTF-32 for now, sorry
-		return '';
-	}
-
-	/**
-	 * encodes an arbitrary variable into JSON format
-	 *
-	 * @param $var Mixed: any number, boolean, string, array, or object to be encoded.
-	 *			see argument 1 to Services_JSON() above for array-parsing behavior.
-	 *			if var is a string, note that encode() always expects it
-	 *			to be in ASCII or UTF-8 format!
-	 * @param $pretty Boolean: pretty-print output with indents and newlines
-	 *
-	 * @return mixed JSON string representation of input var or an error if a problem occurs
-	 * @access public
-	 */
-	function encode($var, $pretty=false)
-	{
-		$this->indent = 0;
-		$this->pretty = $pretty;
-		$this->nameValSeparator = $pretty ? ': ' : ':';
-		return $this->encode2($var);
-	}
-
-	/**
-	 * encodes an arbitrary variable into JSON format
-	 *
-	 * @param $var Mixed: any number, boolean, string, array, or object to be encoded.
-	 *			see argument 1 to Services_JSON() above for array-parsing behavior.
-	 *			if var is a string, note that encode() always expects it
-	 *			to be in ASCII or UTF-8 format!
-	 *
-	 * @return mixed JSON string representation of input var or an error if a problem occurs
-	 * @access private
-	 */
-	function encode2($var)
-	{
-		if ($this->pretty) {
-			$close = "\n" . str_repeat("\t", $this->indent);
-			$open = $close . "\t";
-			$mid = ',' . $open;
-		}
-		else {
-			$open = $close = '';
-			$mid = ',';
-		}
-
-		switch (gettype($var)) {
-			case 'boolean':
-				return $var ? 'true' : 'false';
-
-			case 'NULL':
-				return 'null';
-
-			case 'integer':
-				return (int) $var;
-
-			case 'double':
-			case 'float':
-				return (float) $var;
-
-			case 'string':
-				// STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
-				$ascii = '';
-				$strlen_var = strlen($var);
-
-			   /*
-				* Iterate over every character in the string,
-				* escaping with a slash or encoding to UTF-8 where necessary
-				*/
-				for ($c = 0; $c < $strlen_var; ++$c) {
-
-					$ord_var_c = ord($var[$c]);
-
-					switch (true) {
-						case $ord_var_c == 0x08:
-							$ascii .= '\b';
-							break;
-						case $ord_var_c == 0x09:
-							$ascii .= '\t';
-							break;
-						case $ord_var_c == 0x0A:
-							$ascii .= '\n';
-							break;
-						case $ord_var_c == 0x0C:
-							$ascii .= '\f';
-							break;
-						case $ord_var_c == 0x0D:
-							$ascii .= '\r';
-							break;
-
-						case $ord_var_c == 0x22:
-						case $ord_var_c == 0x2F:
-						case $ord_var_c == 0x5C:
-							// double quote, slash, slosh
-							$ascii .= '\\'.$var[$c];
-							break;
-
-						case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
-							// characters U-00000000 - U-0000007F (same as ASCII)
-							$ascii .= $var[$c];
-							break;
-
-						case (($ord_var_c & 0xE0) == 0xC0):
-							// characters U-00000080 - U-000007FF, mask 110XXXXX
-							// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-							$char = pack('C*', $ord_var_c, ord($var[$c + 1]));
-							$c += 1;
-							$utf16 = $this->utf82utf16($char);
-							$ascii .= sprintf('\u%04s', bin2hex($utf16));
-							break;
-
-						case (($ord_var_c & 0xF0) == 0xE0):
-							// characters U-00000800 - U-0000FFFF, mask 1110XXXX
-							// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-							$char = pack('C*', $ord_var_c,
-									ord($var[$c + 1]),
-									ord($var[$c + 2]));
-							$c += 2;
-							$utf16 = $this->utf82utf16($char);
-							$ascii .= sprintf('\u%04s', bin2hex($utf16));
-							break;
-
-						case (($ord_var_c & 0xF8) == 0xF0):
-							// characters U-00010000 - U-001FFFFF, mask 11110XXX
-							// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-							// These will always return a surrogate pair
-							$char = pack('C*', $ord_var_c,
-									ord($var[$c + 1]),
-									ord($var[$c + 2]),
-									ord($var[$c + 3]));
-							$c += 3;
-							$utf16 = $this->utf82utf16($char);
-							if($utf16 == '') {
-								$ascii .= '\ufffd';
-							} else {
-								$utf16 = str_split($utf16, 2);
-								$ascii .= sprintf('\u%04s\u%04s', bin2hex($utf16[0]), bin2hex($utf16[1]));
-							}
-							break;
-					}
-				}
-
-				return '"'.$ascii.'"';
-
-			case 'array':
-			   /*
-				* As per JSON spec if any array key is not an integer
-				* we must treat the the whole array as an object. We
-				* also try to catch a sparsely populated associative
-				* array with numeric keys here because some JS engines
-				* will create an array with empty indexes up to
-				* max_index which can cause memory issues and because
-				* the keys, which may be relevant, will be remapped
-				* otherwise.
-				*
-				* As per the ECMA and JSON specification an object may
-				* have any string as a property. Unfortunately due to
-				* a hole in the ECMA specification if the key is a
-				* ECMA reserved word or starts with a digit the
-				* parameter is only accessible using ECMAScript's
-				* bracket notation.
-				*/
-
-				// treat as a JSON object
-				if (is_array($var) && count($var) && (array_keys($var) !== range(0, count($var) - 1))) {
-					$this->indent++;
-					$properties = array_map(array($this, 'name_value'),
-								array_keys($var),
-								array_values($var));
-					$this->indent--;
-
-					foreach($properties as $property) {
-						if($this->isError($property)) {
-							return $property;
-						}
-					}
-
-					return '{' . $open . join($mid, $properties) . $close . '}';
-				}
-
-				// treat it like a regular array
-				$this->indent++;
-				$elements = array_map(array($this, 'encode2'), $var);
-				$this->indent--;
-
-				foreach($elements as $element) {
-					if($this->isError($element)) {
-						return $element;
-					}
-				}
-
-				return '[' . $open . join($mid, $elements) . $close . ']';
-
-			case 'object':
-				$vars = get_object_vars($var);
-
-				$this->indent++;
-				$properties = array_map(array($this, 'name_value'),
-							array_keys($vars),
-							array_values($vars));
-				$this->indent--;
-
-				foreach($properties as $property) {
-					if($this->isError($property)) {
-						return $property;
-					}
-				}
-
-				return '{' . $open . join($mid, $properties) . $close . '}';
-
-			default:
-				return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)
-					? 'null'
-					: new Services_JSON_Error(gettype($var)." can not be encoded as JSON string");
-		}
-	}
-
-	/**
-	 * array-walking function for use in generating JSON-formatted name-value pairs
-	 *
-	 * @param string $name name of key to use
-	 * @param $value Mixed: reference to an array element to be encoded
-	 *
-	 * @return String: JSON-formatted name-value pair, like '"name":value'
-	 * @access private
-	 */
-	function name_value($name, $value)
-	{
-		$encoded_value = $this->encode2($value);
-
-		if($this->isError($encoded_value)) {
-			return $encoded_value;
-		}
-
-		return $this->encode2(strval($name)) . $this->nameValSeparator . $encoded_value;
-	}
-
-	/**
-	 * reduce a string by removing leading and trailing comments and whitespace
-	 *
-	 * @param string $str string value to strip of comments and whitespace
-	 *
-	 * @return String: string value stripped of comments and whitespace
-	 * @access private
-	 */
-	function reduce_string($str)
-	{
-		$str = preg_replace(array(
-
-				// eliminate single line comments in '// ...' form
-				'#^\s*//(.+)$#m',
-
-				// eliminate multi-line comments in '/* ... */' form, at start of string
-				'#^\s*/\*(.+)\*/#Us',
-
-				// eliminate multi-line comments in '/* ... */' form, at end of string
-				'#/\*(.+)\*/\s*$#Us'
-
-			), '', $str);
-
-		// eliminate extraneous space
-		return trim($str);
-	}
-
-	/**
-	 * decodes a JSON string into appropriate variable
-	 *
-	 * @param string $str JSON-formatted string
-	 *
-	 * @return mixed number, boolean, string, array, or object
-	 *		   corresponding to given JSON input string.
-	 *		   See argument 1 to Services_JSON() above for object-output behavior.
-	 *		   Note that decode() always returns strings
-	 *		   in ASCII or UTF-8 format!
-	 * @access public
-	 */
-	function decode($str)
-	{
-		$str = $this->reduce_string($str);
-
-		switch (strtolower($str)) {
-			case 'true':
-				return true;
-
-			case 'false':
-				return false;
-
-			case 'null':
-				return null;
-
-			default:
-				$m = array();
-
-				if (is_numeric($str)) {
-					// Lookie-loo, it's a number
-
-					// This would work on its own, but I'm trying to be
-					// good about returning integers where appropriate:
-					// return (float)$str;
-
-					// Return float or int, as appropriate
-					return ((float)$str == (integer)$str)
-						? (integer)$str
-						: (float)$str;
-
-				} elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
-					// STRINGS RETURNED IN UTF-8 FORMAT
-					$delim = substr($str, 0, 1);
-					$chrs = substr($str, 1, -1);
-					$utf8 = '';
-					$strlen_chrs = strlen($chrs);
-
-					for ($c = 0; $c < $strlen_chrs; ++$c) {
-
-						$substr_chrs_c_2 = substr($chrs, $c, 2);
-						$ord_chrs_c = ord($chrs[$c]);
-
-						switch (true) {
-							case $substr_chrs_c_2 == '\b':
-								$utf8 .= chr(0x08);
-								++$c;
-								break;
-							case $substr_chrs_c_2 == '\t':
-								$utf8 .= chr(0x09);
-								++$c;
-								break;
-							case $substr_chrs_c_2 == '\n':
-								$utf8 .= chr(0x0A);
-								++$c;
-								break;
-							case $substr_chrs_c_2 == '\f':
-								$utf8 .= chr(0x0C);
-								++$c;
-								break;
-							case $substr_chrs_c_2 == '\r':
-								$utf8 .= chr(0x0D);
-								++$c;
-								break;
-
-							case $substr_chrs_c_2 == '\\"':
-							case $substr_chrs_c_2 == '\\\'':
-							case $substr_chrs_c_2 == '\\\\':
-							case $substr_chrs_c_2 == '\\/':
-								if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
-								   ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
-									$utf8 .= $chrs[++$c];
-								}
-								break;
-
-							case preg_match('/\\\uD[89AB][0-9A-F]{2}\\\uD[C-F][0-9A-F]{2}/i', substr($chrs, $c, 12)):
-								// escaped unicode surrogate pair
-								$utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
-									   . chr(hexdec(substr($chrs, ($c + 4), 2)))
-									   . chr(hexdec(substr($chrs, ($c + 8), 2)))
-									   . chr(hexdec(substr($chrs, ($c + 10), 2)));
-								$utf8 .= $this->utf162utf8($utf16);
-								$c += 11;
-								break;
-
-							case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
-								// single, escaped unicode character
-								$utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
-									   . chr(hexdec(substr($chrs, ($c + 4), 2)));
-								$utf8 .= $this->utf162utf8($utf16);
-								$c += 5;
-								break;
-
-							case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
-								$utf8 .= $chrs[$c];
-								break;
-
-							case ($ord_chrs_c & 0xE0) == 0xC0:
-								// characters U-00000080 - U-000007FF, mask 110XXXXX
-								//see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-								$utf8 .= substr($chrs, $c, 2);
-								++$c;
-								break;
-
-							case ($ord_chrs_c & 0xF0) == 0xE0:
-								// characters U-00000800 - U-0000FFFF, mask 1110XXXX
-								// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-								$utf8 .= substr($chrs, $c, 3);
-								$c += 2;
-								break;
-
-							case ($ord_chrs_c & 0xF8) == 0xF0:
-								// characters U-00010000 - U-001FFFFF, mask 11110XXX
-								// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-								$utf8 .= substr($chrs, $c, 4);
-								$c += 3;
-								break;
-
-							case ($ord_chrs_c & 0xFC) == 0xF8:
-								// characters U-00200000 - U-03FFFFFF, mask 111110XX
-								// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-								$utf8 .= substr($chrs, $c, 5);
-								$c += 4;
-								break;
-
-							case ($ord_chrs_c & 0xFE) == 0xFC:
-								// characters U-04000000 - U-7FFFFFFF, mask 1111110X
-								// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-								$utf8 .= substr($chrs, $c, 6);
-								$c += 5;
-								break;
-
-						}
-
-					}
-
-					return $utf8;
-
-				} elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
-					// array, or object notation
-
-					if ($str[0] == '[') {
-						$stk = array(SERVICES_JSON_IN_ARR);
-						$arr = array();
-					} else {
-						if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
-							$stk = array(SERVICES_JSON_IN_OBJ);
-							$obj = array();
-						} else {
-							$stk = array(SERVICES_JSON_IN_OBJ);
-							$obj = new stdClass();
-						}
-					}
-
-					array_push($stk, array(	'what'  => SERVICES_JSON_SLICE,
-								'where' => 0,
-								'delim' => false));
-
-					$chrs = substr($str, 1, -1);
-					$chrs = $this->reduce_string($chrs);
-
-					if ($chrs == '') {
-						if (reset($stk) == SERVICES_JSON_IN_ARR) {
-							return $arr;
-
-						} else {
-							return $obj;
-
-						}
-					}
-
-					//print("\nparsing {$chrs}\n");
-
-					$strlen_chrs = strlen($chrs);
-
-					for ($c = 0; $c <= $strlen_chrs; ++$c) {
-
-						$top = end($stk);
-						$substr_chrs_c_2 = substr($chrs, $c, 2);
-
-						if (($c == $strlen_chrs) || (($chrs[$c] == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
-							// found a comma that is not inside a string, array, etc.,
-							// OR we've reached the end of the character list
-							$slice = substr($chrs, $top['where'], ($c - $top['where']));
-							array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
-							//print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-							if (reset($stk) == SERVICES_JSON_IN_ARR) {
-								// we are in an array, so just push an element onto the stack
-								array_push($arr, $this->decode($slice));
-
-							} elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
-								// we are in an object, so figure
-								// out the property name and set an
-								// element in an associative array,
-								// for now
-								$parts = array();
-
-								if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
-									// "name":value pair
-									$key = $this->decode($parts[1]);
-									$val = $this->decode($parts[2]);
-
-									if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
-										$obj[$key] = $val;
-									} else {
-										$obj->$key = $val;
-									}
-								} elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
-									// name:value pair, where name is unquoted
-									$key = $parts[1];
-									$val = $this->decode($parts[2]);
-
-									if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
-										$obj[$key] = $val;
-									} else {
-										$obj->$key = $val;
-									}
-								}
-
-							}
-
-						} elseif ((($chrs[$c] == '"') || ($chrs[$c] == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
-							// found a quote, and we are not inside a string
-							array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs[$c]));
-							//print("Found start of string at {$c}\n");
-
-						} elseif (($chrs[$c] == $top['delim']) &&
-								 ($top['what'] == SERVICES_JSON_IN_STR) &&
-								 (($chrs[$c - 1] != '\\') ||
-								 ($chrs[$c - 1] == '\\' && $chrs[$c - 2] == '\\'))) {
-							// found a quote, we're in a string, and it's not escaped
-							array_pop($stk);
-							//print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
-
-						} elseif (($chrs[$c] == '[') &&
-								 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-							// found a left-bracket, and we are in an array, object, or slice
-							array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
-							//print("Found start of array at {$c}\n");
-
-						} elseif (($chrs[$c] == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
-							// found a right-bracket, and we're in an array
-							array_pop($stk);
-							//print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-						} elseif (($chrs[$c] == '{') &&
-								 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-							// found a left-brace, and we are in an array, object, or slice
-							array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
-							//print("Found start of object at {$c}\n");
-
-						} elseif (($chrs[$c] == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
-							// found a right-brace, and we're in an object
-							array_pop($stk);
-							//print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-						} elseif (($substr_chrs_c_2 == '/*') &&
-								 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-							// found a comment start, and we are in an array, object, or slice
-							array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
-							$c++;
-							//print("Found start of comment at {$c}\n");
-
-						} elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {
-							// found a comment end, and we're in one now
-							array_pop($stk);
-							$c++;
-
-							for ($i = $top['where']; $i <= $c; ++$i)
-								$chrs = substr_replace($chrs, ' ', $i, 1);
-
-							//print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-						}
-
-					}
-
-					if (reset($stk) == SERVICES_JSON_IN_ARR) {
-						return $arr;
-
-					} elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
-						return $obj;
-
-					}
-
-				}
-		}
-	}
-
-	/**
-	 * @todo Ultimately, this should just call PEAR::isError()
-	 * @return bool
-	 */
-	function isError($data, $code = null)
-	{
-		if ( self::pearInstalled() ) {
-			//avoid some strict warnings on PEAR isError check (looks like http://pear.php.net/bugs/bug.php?id=9950 has been around for some time)
-			return @PEAR::isError($data, $code);
-		} elseif (is_object($data) && (get_class($data) == 'services_json_error' ||
-				is_subclass_of($data, 'services_json_error'))) {
-			return true;
-		}
-
-		return false;
-	}
-}
-
-
-// Hide the PEAR_Error variant from Doxygen
-/// @cond
-if (class_exists('PEAR_Error')) {
-
-	/**
-	 * @ingroup API
-	 */
-	class Services_JSON_Error extends PEAR_Error
-	{
-		function Services_JSON_Error($message = 'unknown error', $code = null,
-						$mode = null, $options = null, $userinfo = null)
-		{
-			parent::PEAR_Error($message, $code, $mode, $options, $userinfo);
-		}
-	}
-
-} else {
-/// @endcond
-
-	/**
-	 * @todo Ultimately, this class shall be descended from PEAR_Error
-	 * @ingroup API
-	 */
-	class Services_JSON_Error
-	{
-		function Services_JSON_Error($message = 'unknown error', $code = null,
-						$mode = null, $options = null, $userinfo = null)
-		{
-			$this->message = $message;
-		}
-
-		function __toString()
-		{
-			return $this->message;
-		}
-	}
-}
diff --git a/includes/libs/CSSJanus.php b/includes/libs/CSSJanus.php
index fb1e9a4c..5a52fc7c 100644
--- a/includes/libs/CSSJanus.php
+++ b/includes/libs/CSSJanus.php
@@ -76,6 +76,10 @@ class CSSJanus {
 		'cursor_west' => null,
 		'four_notation_quantity' => null,
 		'four_notation_color' => null,
+		'border_radius' => null,
+		'box_shadow' => null,
+		'text_shadow1' => null,
+		'text_shadow2' => null,
 		'bg_horizontal_percentage' => null,
 		'bg_horizontal_percentage_x' => null,
 	);
@@ -96,9 +100,9 @@ class CSSJanus {
 		$patterns['ident'] = "-?{$patterns['nmstart']}{$patterns['nmchar']}*";
 		$patterns['quantity'] = "{$patterns['num']}(?:\s*{$patterns['unit']}|{$patterns['ident']})?";
 		$patterns['possibly_negative_quantity'] = "((?:-?{$patterns['quantity']})|(?:inherit|auto))";
-		$patterns['color'] = "(#?{$patterns['nmchar']}+)";
+		$patterns['color'] = "(#?{$patterns['nmchar']}+|(?:rgba?|hsla?)\([ \d.,%-]+\))";
 		$patterns['url_chars'] = "(?:{$patterns['url_special_chars']}|{$patterns['nonAscii']}|{$patterns['escape']})*";
-		$patterns['lookahead_not_open_brace'] = "(?!({$patterns['nmchar']}|\r?\n|\s|#|\:|\.|\,|\+|>)*?{)";
+		$patterns['lookahead_not_open_brace'] = "(?!({$patterns['nmchar']}|\r?\n|\s|#|\:|\.|\,|\+|>|\(|\))*?{)";
 		$patterns['lookahead_not_closing_paren'] = "(?!{$patterns['url_chars']}?{$patterns['valid_after_uri_chars']}\))";
 		$patterns['lookahead_for_closing_paren'] = "(?={$patterns['url_chars']}?{$patterns['valid_after_uri_chars']}\))";
 		$patterns['noflip_single'] = "/({$patterns['noflip_annotation']}{$patterns['lookahead_not_open_brace']}[^;}]+;?)/i";
@@ -113,8 +117,12 @@ class CSSJanus {
 		$patterns['rtl_in_url'] = "/{$patterns['lookbehind_not_letter']}(rtl){$patterns['lookahead_for_closing_paren']}/i";
 		$patterns['cursor_east'] = "/{$patterns['lookbehind_not_letter']}([ns]?)e-resize/";
 		$patterns['cursor_west'] = "/{$patterns['lookbehind_not_letter']}([ns]?)w-resize/";
-		$patterns['four_notation_quantity'] = "/{$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}/i";
-		$patterns['four_notation_color'] = "/(-color\s*:\s*){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}/i";
+		$patterns['four_notation_quantity'] = "/(:\s*){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s*[;}])/i";
+		$patterns['four_notation_color'] = "/(-color\s*:\s*){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s*[;}])/i";
+		$patterns['border_radius'] = "/(border-radius\s*:\s*){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s*[;}])/i";
+		$patterns['box_shadow'] = "/(box-shadow\s*:\s*(?:inset\s*)?){$patterns['possibly_negative_quantity']}/i";
+		$patterns['text_shadow1'] = "/(text-shadow\s*:\s*){$patterns['color']}(\s*){$patterns['possibly_negative_quantity']}/i";
+		$patterns['text_shadow2'] = "/(text-shadow\s*:\s*){$patterns['possibly_negative_quantity']}/i";
 		// The two regexes below are parenthesized differently then in the original implementation to make the
 		// callback's job more straightforward
 		$patterns['bg_horizontal_percentage'] = "/(background(?:-position)?\s*:\s*[^%]*?)(-?{$patterns['num']})(%\s*(?:{$patterns['quantity']}|{$patterns['ident']}))/";
@@ -160,7 +168,9 @@ class CSSJanus {
 		$css = self::fixLeftAndRight( $css );
 		$css = self::fixCursorProperties( $css );
 		$css = self::fixFourPartNotation( $css );
+		$css = self::fixBorderRadius( $css );
 		$css = self::fixBackgroundPosition( $css );
+		$css = self::fixShadows( $css );
 
 		// Detokenize stuff we tokenized before
 		$css = $comments->detokenize( $css );
@@ -257,8 +267,58 @@ class CSSJanus {
 	 * @return string
 	 */
 	private static function fixFourPartNotation( $css ) {
-		$css = preg_replace( self::$patterns['four_notation_quantity'], '$1$2$7$4$5$6$3', $css );
-		$css = preg_replace( self::$patterns['four_notation_color'], '$1$2$3$8$5$6$7$4', $css );
+		$css = preg_replace( self::$patterns['four_notation_quantity'], '$1$2$3$8$5$6$7$4$9', $css );
+		$css = preg_replace( self::$patterns['four_notation_color'], '$1$2$3$8$5$6$7$4$9', $css );
+		return $css;
+	}
+
+	/**
+	 * Swaps appropriate corners in four-part border-radius rules.
+	 * Needs to undo the effect of fixFourPartNotation() on those rules, too.
+	 *
+	 * @param $css string
+	 * @return string
+	 */
+	private static function fixBorderRadius( $css ) {
+		// Undo four_notation_quantity
+		$css = preg_replace( self::$patterns['border_radius'], '$1$2$3$8$5$6$7$4$9', $css );
+		// Do the real thing
+		$css = preg_replace( self::$patterns['border_radius'], '$1$4$3$2$5$8$7$6$9', $css );
+
+		return $css;
+	}
+
+	/**
+	 * Negates horizontal offset in box-shadow and text-shadow rules.
+	 *
+	 * @param $css string
+	 * @return string
+	 */
+	private static function fixShadows( $css ) {
+		// Flips the sign of a CSS value, possibly with a unit.
+		// (We can't just negate the value with unary minus due to the units.)
+		$flipSign = function ( $cssValue ) {
+			// Don't mangle zeroes
+			if ( intval( $cssValue ) === 0 ) {
+				return $cssValue;
+			} elseif ( $cssValue[0] === '-' ) {
+				return substr( $cssValue, 1 );
+			} else {
+				return "-" . $cssValue;
+			}
+		};
+
+		$css = preg_replace_callback( self::$patterns['box_shadow'], function ( $matches ) use ( $flipSign ) {
+			return $matches[1] . $flipSign( $matches[2] );
+		}, $css );
+
+		$css = preg_replace_callback( self::$patterns['text_shadow1'], function ( $matches ) use ( $flipSign ) {
+			return $matches[1] . $matches[2] . $matches[3] . $flipSign( $matches[4] );
+		}, $css );
+
+		$css = preg_replace_callback( self::$patterns['text_shadow2'], function ( $matches ) use ( $flipSign ) {
+			return $matches[1] . $flipSign( $matches[2] );
+		}, $css );
 
 		return $css;
 	}
diff --git a/includes/libs/CSSMin.php b/includes/libs/CSSMin.php
index 8b0e2873..4f142fc7 100644
--- a/includes/libs/CSSMin.php
+++ b/includes/libs/CSSMin.php
@@ -81,11 +81,39 @@ class CSSMin {
 		return $files;
 	}
 
+	/**
+	 * Encode an image file as a base64 data URI.
+	 * If the image file has a suitable MIME type and size, encode it as a
+	 * base64 data URI. Return false if the image type is unfamiliar or exceeds
+	 * the size limit.
+	 *
+	 * @param string $file Image file to encode.
+	 * @param string|null $type File's MIME type or null. If null, CSSMin will
+	 *     try to autodetect the type.
+	 * @param int|bool $sizeLimit If the size of the target file is greater than
+	 *     this value, decline to encode the image file and return false
+	 *     instead. If $sizeLimit is false, no limit is enforced.
+	 * @return string|bool: Image contents encoded as a data URI or false.
+	 */
+	public static function encodeImageAsDataURI( $file, $type = null, $sizeLimit = self::EMBED_SIZE_LIMIT ) {
+		if ( $sizeLimit !== false && filesize( $file ) >= $sizeLimit ) {
+			return false;
+		}
+		if ( $type === null ) {
+			$type = self::getMimeType( $file );
+		}
+		if ( !$type ) {
+			return false;
+		}
+		$data = base64_encode( file_get_contents( $file ) );
+		return 'data:' . $type . ';base64,' . $data;
+	}
+
 	/**
 	 * @param $file string
 	 * @return bool|string
 	 */
-	protected static function getMimeType( $file ) {
+	public static function getMimeType( $file ) {
 		$realpath = realpath( $file );
 		// Try a couple of different ways to get the mime-type of a file, in order of
 		// preference
@@ -174,23 +202,14 @@ class CSSMin {
 				// using Z for the timezone, meaning GMT
 				$url .= '?' . gmdate( 'Y-m-d\TH:i:s\Z', round( filemtime( $file ), -2 ) );
 				// Embedding requires a bit of extra processing, so let's skip that if we can
-				if ( $embedData && $embed ) {
-					$type = self::getMimeType( $file );
-					// Detect when URLs were preceeded with embed tags, and also verify file size is
-					// below the limit
-					if (
-						$type
-						&& $match['embed'][1] > 0
-						&& filesize( $file ) < self::EMBED_SIZE_LIMIT
-					) {
-						// Strip off any trailing = symbols (makes browsers freak out)
-						$data = base64_encode( file_get_contents( $file ) );
+				if ( $embedData && $embed && $match['embed'][1] > 0 ) {
+					$data = self::encodeImageAsDataURI( $file );
+					if ( $data !== false ) {
 						// Build 2 CSS properties; one which uses a base64 encoded data URI in place
 						// of the @embed comment to try and retain line-number integrity, and the
 						// other with a remapped an versioned URL and an Internet Explorer hack
 						// making it ignored in all browsers that support data URIs
-						$replacement = "{$pre}url(data:{$type};base64,{$data}){$post};";
-						$replacement .= "{$pre}url({$url}){$post}!ie;";
+						$replacement = "{$pre}url({$data}){$post};{$pre}url({$url}){$post}!ie;";
 					}
 				}
 				if ( $replacement === false ) {
diff --git a/includes/libs/HttpStatus.php b/includes/libs/HttpStatus.php
index 78d81803..4f626b23 100644
--- a/includes/libs/HttpStatus.php
+++ b/includes/libs/HttpStatus.php
@@ -26,7 +26,7 @@
 class HttpStatus {
 
 	/**
-	 * Get the message associed with the HTTP response code $code
+	 * Get the message associated with HTTP response code $code
 	 *
 	 * Replace OutputPage::getStatusMessage( $code )
 	 *
diff --git a/includes/libs/lessc.inc.php b/includes/libs/lessc.inc.php
new file mode 100644
index 00000000..3dce961e
--- /dev/null
+++ b/includes/libs/lessc.inc.php
@@ -0,0 +1,3742 @@
+<?php
+
+/**
+ * lessphp v0.4.0@261f1bd28f
+ * http://leafo.net/lessphp
+ *
+ * LESS CSS compiler, adapted from http://lesscss.org
+ *
+ * For ease of distribution, lessphp 0.4.0 is under a dual license.
+ * You are free to pick which one suits your needs.
+ *
+ * MIT LICENSE
+ *
+ * Copyright 2013, Leaf Corcoran <leafot@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * GPL VERSION 3
+ *
+ * Please refer to http://www.gnu.org/licenses/gpl-3.0.html for the full
+ * text of the GPL version 3
+ */
+
+
+/**
+ * The LESS compiler and parser.
+ *
+ * Converting LESS to CSS is a three stage process. The incoming file is parsed
+ * by `lessc_parser` into a syntax tree, then it is compiled into another tree
+ * representing the CSS structure by `lessc`. The CSS tree is fed into a
+ * formatter, like `lessc_formatter` which then outputs CSS as a string.
+ *
+ * During the first compile, all values are *reduced*, which means that their
+ * types are brought to the lowest form before being dump as strings. This
+ * handles math equations, variable dereferences, and the like.
+ *
+ * The `parse` function of `lessc` is the entry point.
+ *
+ * In summary:
+ *
+ * The `lessc` class creates an instance of the parser, feeds it LESS code,
+ * then transforms the resulting tree to a CSS tree. This class also holds the
+ * evaluation context, such as all available mixins and variables at any given
+ * time.
+ *
+ * The `lessc_parser` class is only concerned with parsing its input.
+ *
+ * The `lessc_formatter` takes a CSS tree, and dumps it to a formatted string,
+ * handling things like indentation.
+ */
+class lessc {
+	static public $VERSION = "v0.4.0";
+
+	static public $TRUE = array("keyword", "true");
+	static public $FALSE = array("keyword", "false");
+
+	protected $libFunctions = array();
+	protected $registeredVars = array();
+	protected $preserveComments = false;
+
+	public $vPrefix = '@'; // prefix of abstract properties
+	public $mPrefix = '$'; // prefix of abstract blocks
+	public $parentSelector = '&';
+
+	public $importDisabled = false;
+	public $importDir = '';
+
+	protected $numberPrecision = null;
+
+	protected $allParsedFiles = array();
+
+	// set to the parser that generated the current line when compiling
+	// so we know how to create error messages
+	protected $sourceParser = null;
+	protected $sourceLoc = null;
+
+	static protected $nextImportId = 0; // uniquely identify imports
+
+	// attempts to find the path of an import url, returns null for css files
+	protected function findImport($url) {
+		foreach ((array)$this->importDir as $dir) {
+			$full = $dir.(substr($dir, -1) != '/' ? '/' : '').$url;
+			if ($this->fileExists($file = $full.'.less') || $this->fileExists($file = $full)) {
+				return $file;
+			}
+		}
+
+		return null;
+	}
+
+	protected function fileExists($name) {
+		return is_file($name);
+	}
+
+	static public function compressList($items, $delim) {
+		if (!isset($items[1]) && isset($items[0])) return $items[0];
+		else return array('list', $delim, $items);
+	}
+
+	static public function preg_quote($what) {
+		return preg_quote($what, '/');
+	}
+
+	protected function tryImport($importPath, $parentBlock, $out) {
+		if ($importPath[0] == "function" && $importPath[1] == "url") {
+			$importPath = $this->flattenList($importPath[2]);
+		}
+
+		$str = $this->coerceString($importPath);
+		if ($str === null) return false;
+
+		$url = $this->compileValue($this->lib_e($str));
+
+		// don't import if it ends in css
+		if (substr_compare($url, '.css', -4, 4) === 0) return false;
+
+		$realPath = $this->findImport($url);
+
+		if ($realPath === null) return false;
+
+		if ($this->importDisabled) {
+			return array(false, "/* import disabled */");
+		}
+
+		if (isset($this->allParsedFiles[realpath($realPath)])) {
+			return array(false, null);
+		}
+
+		$this->addParsedFile($realPath);
+		$parser = $this->makeParser($realPath);
+		$root = $parser->parse(file_get_contents($realPath));
+
+		// set the parents of all the block props
+		foreach ($root->props as $prop) {
+			if ($prop[0] == "block") {
+				$prop[1]->parent = $parentBlock;
+			}
+		}
+
+		// copy mixins into scope, set their parents
+		// bring blocks from import into current block
+		// TODO: need to mark the source parser	these came from this file
+		foreach ($root->children as $childName => $child) {
+			if (isset($parentBlock->children[$childName])) {
+				$parentBlock->children[$childName] = array_merge(
+					$parentBlock->children[$childName],
+					$child);
+			} else {
+				$parentBlock->children[$childName] = $child;
+			}
+		}
+
+		$pi = pathinfo($realPath);
+		$dir = $pi["dirname"];
+
+		list($top, $bottom) = $this->sortProps($root->props, true);
+		$this->compileImportedProps($top, $parentBlock, $out, $parser, $dir);
+
+		return array(true, $bottom, $parser, $dir);
+	}
+
+	protected function compileImportedProps($props, $block, $out, $sourceParser, $importDir) {
+		$oldSourceParser = $this->sourceParser;
+
+		$oldImport = $this->importDir;
+
+		// TODO: this is because the importDir api is stupid
+		$this->importDir = (array)$this->importDir;
+		array_unshift($this->importDir, $importDir);
+
+		foreach ($props as $prop) {
+			$this->compileProp($prop, $block, $out);
+		}
+
+		$this->importDir = $oldImport;
+		$this->sourceParser = $oldSourceParser;
+	}
+
+	/**
+	 * Recursively compiles a block.
+	 *
+	 * A block is analogous to a CSS block in most cases. A single LESS document
+	 * is encapsulated in a block when parsed, but it does not have parent tags
+	 * so all of it's children appear on the root level when compiled.
+	 *
+	 * Blocks are made up of props and children.
+	 *
+	 * Props are property instructions, array tuples which describe an action
+	 * to be taken, eg. write a property, set a variable, mixin a block.
+	 *
+	 * The children of a block are just all the blocks that are defined within.
+	 * This is used to look up mixins when performing a mixin.
+	 *
+	 * Compiling the block involves pushing a fresh environment on the stack,
+	 * and iterating through the props, compiling each one.
+	 *
+	 * See lessc::compileProp()
+	 *
+	 */
+	protected function compileBlock($block) {
+		switch ($block->type) {
+		case "root":
+			$this->compileRoot($block);
+			break;
+		case null:
+			$this->compileCSSBlock($block);
+			break;
+		case "media":
+			$this->compileMedia($block);
+			break;
+		case "directive":
+			$name = "@" . $block->name;
+			if (!empty($block->value)) {
+				$name .= " " . $this->compileValue($this->reduce($block->value));
+			}
+
+			$this->compileNestedBlock($block, array($name));
+			break;
+		default:
+			$this->throwError("unknown block type: $block->type\n");
+		}
+	}
+
+	protected function compileCSSBlock($block) {
+		$env = $this->pushEnv();
+
+		$selectors = $this->compileSelectors($block->tags);
+		$env->selectors = $this->multiplySelectors($selectors);
+		$out = $this->makeOutputBlock(null, $env->selectors);
+
+		$this->scope->children[] = $out;
+		$this->compileProps($block, $out);
+
+		$block->scope = $env; // mixins carry scope with them!
+		$this->popEnv();
+	}
+
+	protected function compileMedia($media) {
+		$env = $this->pushEnv($media);
+		$parentScope = $this->mediaParent($this->scope);
+
+		$query = $this->compileMediaQuery($this->multiplyMedia($env));
+
+		$this->scope = $this->makeOutputBlock($media->type, array($query));
+		$parentScope->children[] = $this->scope;
+
+		$this->compileProps($media, $this->scope);
+
+		if (count($this->scope->lines) > 0) {
+			$orphanSelelectors = $this->findClosestSelectors();
+			if (!is_null($orphanSelelectors)) {
+				$orphan = $this->makeOutputBlock(null, $orphanSelelectors);
+				$orphan->lines = $this->scope->lines;
+				array_unshift($this->scope->children, $orphan);
+				$this->scope->lines = array();
+			}
+		}
+
+		$this->scope = $this->scope->parent;
+		$this->popEnv();
+	}
+
+	protected function mediaParent($scope) {
+		while (!empty($scope->parent)) {
+			if (!empty($scope->type) && $scope->type != "media") {
+				break;
+			}
+			$scope = $scope->parent;
+		}
+
+		return $scope;
+	}
+
+	protected function compileNestedBlock($block, $selectors) {
+		$this->pushEnv($block);
+		$this->scope = $this->makeOutputBlock($block->type, $selectors);
+		$this->scope->parent->children[] = $this->scope;
+
+		$this->compileProps($block, $this->scope);
+
+		$this->scope = $this->scope->parent;
+		$this->popEnv();
+	}
+
+	protected function compileRoot($root) {
+		$this->pushEnv();
+		$this->scope = $this->makeOutputBlock($root->type);
+		$this->compileProps($root, $this->scope);
+		$this->popEnv();
+	}
+
+	protected function compileProps($block, $out) {
+		foreach ($this->sortProps($block->props) as $prop) {
+			$this->compileProp($prop, $block, $out);
+		}
+		$out->lines = $this->deduplicate($out->lines);
+	}
+
+	/**
+	 * Deduplicate lines in a block. Comments are not deduplicated. If a
+	 * duplicate rule is detected, the comments immediately preceding each
+	 * occurence are consolidated.
+	 */
+	protected function deduplicate($lines) {
+		$unique = array();
+		$comments = array();
+
+		foreach($lines as $line) {
+			if (strpos($line, '/*') === 0) {
+				$comments[] = $line;
+				continue;
+			}
+			if (!in_array($line, $unique)) {
+				$unique[] = $line;
+			}
+			array_splice($unique, array_search($line, $unique), 0, $comments);
+			$comments = array();
+		}
+		return array_merge($unique, $comments);
+	}
+
+	protected function sortProps($props, $split = false) {
+		$vars = array();
+		$imports = array();
+		$other = array();
+		$stack = array();
+
+		foreach ($props as $prop) {
+			switch ($prop[0]) {
+			case "comment":
+				$stack[] = $prop;
+				break;
+			case "assign":
+				$stack[] = $prop;
+				if (isset($prop[1][0]) && $prop[1][0] == $this->vPrefix) {
+					$vars = array_merge($vars, $stack);
+				} else {
+					$other = array_merge($other, $stack);
+				}
+				$stack = array();
+				break;
+			case "import":
+				$id = self::$nextImportId++;
+				$prop[] = $id;
+				$stack[] = $prop;
+				$imports = array_merge($imports, $stack);
+				$other[] = array("import_mixin", $id);
+				$stack = array();
+				break;
+			default:
+				$stack[] = $prop;
+				$other = array_merge($other, $stack);
+				$stack = array();
+				break;
+			}
+		}
+		$other = array_merge($other, $stack);
+
+		if ($split) {
+			return array(array_merge($vars, $imports), $other);
+		} else {
+			return array_merge($vars, $imports, $other);
+		}
+	}
+
+	protected function compileMediaQuery($queries) {
+		$compiledQueries = array();
+		foreach ($queries as $query) {
+			$parts = array();
+			foreach ($query as $q) {
+				switch ($q[0]) {
+				case "mediaType":
+					$parts[] = implode(" ", array_slice($q, 1));
+					break;
+				case "mediaExp":
+					if (isset($q[2])) {
+						$parts[] = "($q[1]: " .
+							$this->compileValue($this->reduce($q[2])) . ")";
+					} else {
+						$parts[] = "($q[1])";
+					}
+					break;
+				case "variable":
+					$parts[] = $this->compileValue($this->reduce($q));
+				break;
+				}
+			}
+
+			if (count($parts) > 0) {
+				$compiledQueries[] =  implode(" and ", $parts);
+			}
+		}
+
+		$out = "@media";
+		if (!empty($parts)) {
+			$out .= " " .
+				implode($this->formatter->selectorSeparator, $compiledQueries);
+		}
+		return $out;
+	}
+
+	protected function multiplyMedia($env, $childQueries = null) {
+		if (is_null($env) ||
+			!empty($env->block->type) && $env->block->type != "media")
+		{
+			return $childQueries;
+		}
+
+		// plain old block, skip
+		if (empty($env->block->type)) {
+			return $this->multiplyMedia($env->parent, $childQueries);
+		}
+
+		$out = array();
+		$queries = $env->block->queries;
+		if (is_null($childQueries)) {
+			$out = $queries;
+		} else {
+			foreach ($queries as $parent) {
+				foreach ($childQueries as $child) {
+					$out[] = array_merge($parent, $child);
+				}
+			}
+		}
+
+		return $this->multiplyMedia($env->parent, $out);
+	}
+
+	protected function expandParentSelectors(&$tag, $replace) {
+		$parts = explode("$&$", $tag);
+		$count = 0;
+		foreach ($parts as &$part) {
+			$part = str_replace($this->parentSelector, $replace, $part, $c);
+			$count += $c;
+		}
+		$tag = implode($this->parentSelector, $parts);
+		return $count;
+	}
+
+	protected function findClosestSelectors() {
+		$env = $this->env;
+		$selectors = null;
+		while ($env !== null) {
+			if (isset($env->selectors)) {
+				$selectors = $env->selectors;
+				break;
+			}
+			$env = $env->parent;
+		}
+
+		return $selectors;
+	}
+
+
+	// multiply $selectors against the nearest selectors in env
+	protected function multiplySelectors($selectors) {
+		// find parent selectors
+
+		$parentSelectors = $this->findClosestSelectors();
+		if (is_null($parentSelectors)) {
+			// kill parent reference in top level selector
+			foreach ($selectors as &$s) {
+				$this->expandParentSelectors($s, "");
+			}
+
+			return $selectors;
+		}
+
+		$out = array();
+		foreach ($parentSelectors as $parent) {
+			foreach ($selectors as $child) {
+				$count = $this->expandParentSelectors($child, $parent);
+
+				// don't prepend the parent tag if & was used
+				if ($count > 0) {
+					$out[] = trim($child);
+				} else {
+					$out[] = trim($parent . ' ' . $child);
+				}
+			}
+		}
+
+		return $out;
+	}
+
+	// reduces selector expressions
+	protected function compileSelectors($selectors) {
+		$out = array();
+
+		foreach ($selectors as $s) {
+			if (is_array($s)) {
+				list(, $value) = $s;
+				$out[] = trim($this->compileValue($this->reduce($value)));
+			} else {
+				$out[] = $s;
+			}
+		}
+
+		return $out;
+	}
+
+	protected function eq($left, $right) {
+		return $left == $right;
+	}
+
+	protected function patternMatch($block, $orderedArgs, $keywordArgs) {
+		// match the guards if it has them
+		// any one of the groups must have all its guards pass for a match
+		if (!empty($block->guards)) {
+			$groupPassed = false;
+			foreach ($block->guards as $guardGroup) {
+				foreach ($guardGroup as $guard) {
+					$this->pushEnv();
+					$this->zipSetArgs($block->args, $orderedArgs, $keywordArgs);
+
+					$negate = false;
+					if ($guard[0] == "negate") {
+						$guard = $guard[1];
+						$negate = true;
+					}
+
+					$passed = $this->reduce($guard) == self::$TRUE;
+					if ($negate) $passed = !$passed;
+
+					$this->popEnv();
+
+					if ($passed) {
+						$groupPassed = true;
+					} else {
+						$groupPassed = false;
+						break;
+					}
+				}
+
+				if ($groupPassed) break;
+			}
+
+			if (!$groupPassed) {
+				return false;
+			}
+		}
+
+		if (empty($block->args)) {
+			return $block->isVararg || empty($orderedArgs) && empty($keywordArgs);
+		}
+
+		$remainingArgs = $block->args;
+		if ($keywordArgs) {
+			$remainingArgs = array();
+			foreach ($block->args as $arg) {
+				if ($arg[0] == "arg" && isset($keywordArgs[$arg[1]])) {
+					continue;
+				}
+
+				$remainingArgs[] = $arg;
+			}
+		}
+
+		$i = -1; // no args
+		// try to match by arity or by argument literal
+		foreach ($remainingArgs as $i => $arg) {
+			switch ($arg[0]) {
+			case "lit":
+				if (empty($orderedArgs[$i]) || !$this->eq($arg[1], $orderedArgs[$i])) {
+					return false;
+				}
+				break;
+			case "arg":
+				// no arg and no default value
+				if (!isset($orderedArgs[$i]) && !isset($arg[2])) {
+					return false;
+				}
+				break;
+			case "rest":
+				$i--; // rest can be empty
+				break 2;
+			}
+		}
+
+		if ($block->isVararg) {
+			return true; // not having enough is handled above
+		} else {
+			$numMatched = $i + 1;
+			// greater than becuase default values always match
+			return $numMatched >= count($orderedArgs);
+		}
+	}
+
+	protected function patternMatchAll($blocks, $orderedArgs, $keywordArgs, $skip=array()) {
+		$matches = null;
+		foreach ($blocks as $block) {
+			// skip seen blocks that don't have arguments
+			if (isset($skip[$block->id]) && !isset($block->args)) {
+				continue;
+			}
+
+			if ($this->patternMatch($block, $orderedArgs, $keywordArgs)) {
+				$matches[] = $block;
+			}
+		}
+
+		return $matches;
+	}
+
+	// attempt to find blocks matched by path and args
+	protected function findBlocks($searchIn, $path, $orderedArgs, $keywordArgs, $seen=array()) {
+		if ($searchIn == null) return null;
+		if (isset($seen[$searchIn->id])) return null;
+		$seen[$searchIn->id] = true;
+
+		$name = $path[0];
+
+		if (isset($searchIn->children[$name])) {
+			$blocks = $searchIn->children[$name];
+			if (count($path) == 1) {
+				$matches = $this->patternMatchAll($blocks, $orderedArgs, $keywordArgs, $seen);
+				if (!empty($matches)) {
+					// This will return all blocks that match in the closest
+					// scope that has any matching block, like lessjs
+					return $matches;
+				}
+			} else {
+				$matches = array();
+				foreach ($blocks as $subBlock) {
+					$subMatches = $this->findBlocks($subBlock,
+						array_slice($path, 1), $orderedArgs, $keywordArgs, $seen);
+
+					if (!is_null($subMatches)) {
+						foreach ($subMatches as $sm) {
+							$matches[] = $sm;
+						}
+					}
+				}
+
+				return count($matches) > 0 ? $matches : null;
+			}
+		}
+		if ($searchIn->parent === $searchIn) return null;
+		return $this->findBlocks($searchIn->parent, $path, $orderedArgs, $keywordArgs, $seen);
+	}
+
+	// sets all argument names in $args to either the default value
+	// or the one passed in through $values
+	protected function zipSetArgs($args, $orderedValues, $keywordValues) {
+		$assignedValues = array();
+
+		$i = 0;
+		foreach ($args as  $a) {
+			if ($a[0] == "arg") {
+				if (isset($keywordValues[$a[1]])) {
+					// has keyword arg
+					$value = $keywordValues[$a[1]];
+				} elseif (isset($orderedValues[$i])) {
+					// has ordered arg
+					$value = $orderedValues[$i];
+					$i++;
+				} elseif (isset($a[2])) {
+					// has default value
+					$value = $a[2];
+				} else {
+					$this->throwError("Failed to assign arg " . $a[1]);
+					$value = null; // :(
+				}
+
+				$value = $this->reduce($value);
+				$this->set($a[1], $value);
+				$assignedValues[] = $value;
+			} else {
+				// a lit
+				$i++;
+			}
+		}
+
+		// check for a rest
+		$last = end($args);
+		if ($last[0] == "rest") {
+			$rest = array_slice($orderedValues, count($args) - 1);
+			$this->set($last[1], $this->reduce(array("list", " ", $rest)));
+		}
+
+		// wow is this the only true use of PHP's + operator for arrays?
+		$this->env->arguments = $assignedValues + $orderedValues;
+	}
+
+	// compile a prop and update $lines or $blocks appropriately
+	protected function compileProp($prop, $block, $out) {
+		// set error position context
+		$this->sourceLoc = isset($prop[-1]) ? $prop[-1] : -1;
+
+		switch ($prop[0]) {
+		case 'assign':
+			list(, $name, $value) = $prop;
+			if ($name[0] == $this->vPrefix) {
+				$this->set($name, $value);
+			} else {
+				$out->lines[] = $this->formatter->property($name,
+						$this->compileValue($this->reduce($value)));
+			}
+			break;
+		case 'block':
+			list(, $child) = $prop;
+			$this->compileBlock($child);
+			break;
+		case 'mixin':
+			list(, $path, $args, $suffix) = $prop;
+
+			$orderedArgs = array();
+			$keywordArgs = array();
+			foreach ((array)$args as $arg) {
+				$argval = null;
+				switch ($arg[0]) {
+				case "arg":
+					if (!isset($arg[2])) {
+						$orderedArgs[] = $this->reduce(array("variable", $arg[1]));
+					} else {
+						$keywordArgs[$arg[1]] = $this->reduce($arg[2]);
+					}
+					break;
+
+				case "lit":
+					$orderedArgs[] = $this->reduce($arg[1]);
+					break;
+				default:
+					$this->throwError("Unknown arg type: " . $arg[0]);
+				}
+			}
+
+			$mixins = $this->findBlocks($block, $path, $orderedArgs, $keywordArgs);
+
+			if ($mixins === null) {
+				$this->throwError("{$prop[1][0]} is undefined");
+			}
+
+			foreach ($mixins as $mixin) {
+				if ($mixin === $block && !$orderedArgs) {
+					continue;
+				}
+
+				$haveScope = false;
+				if (isset($mixin->parent->scope)) {
+					$haveScope = true;
+					$mixinParentEnv = $this->pushEnv();
+					$mixinParentEnv->storeParent = $mixin->parent->scope;
+				}
+
+				$haveArgs = false;
+				if (isset($mixin->args)) {
+					$haveArgs = true;
+					$this->pushEnv();
+					$this->zipSetArgs($mixin->args, $orderedArgs, $keywordArgs);
+				}
+
+				$oldParent = $mixin->parent;
+				if ($mixin != $block) $mixin->parent = $block;
+
+				foreach ($this->sortProps($mixin->props) as $subProp) {
+					if ($suffix !== null &&
+						$subProp[0] == "assign" &&
+						is_string($subProp[1]) &&
+						$subProp[1]{0} != $this->vPrefix)
+					{
+						$subProp[2] = array(
+							'list', ' ',
+							array($subProp[2], array('keyword', $suffix))
+						);
+					}
+
+					$this->compileProp($subProp, $mixin, $out);
+				}
+
+				$mixin->parent = $oldParent;
+
+				if ($haveArgs) $this->popEnv();
+				if ($haveScope) $this->popEnv();
+			}
+
+			break;
+		case 'raw':
+			$out->lines[] = $prop[1];
+			break;
+		case "directive":
+			list(, $name, $value) = $prop;
+			$out->lines[] = "@$name " . $this->compileValue($this->reduce($value)).';';
+			break;
+		case "comment":
+			$out->lines[] = $prop[1];
+			break;
+		case "import";
+			list(, $importPath, $importId) = $prop;
+			$importPath = $this->reduce($importPath);
+
+			if (!isset($this->env->imports)) {
+				$this->env->imports = array();
+			}
+
+			$result = $this->tryImport($importPath, $block, $out);
+
+			$this->env->imports[$importId] = $result === false ?
+				array(false, "@import " . $this->compileValue($importPath).";") :
+				$result;
+
+			break;
+		case "import_mixin":
+			list(,$importId) = $prop;
+			$import = $this->env->imports[$importId];
+			if ($import[0] === false) {
+				if (isset($import[1])) {
+					$out->lines[] = $import[1];
+				}
+			} else {
+				list(, $bottom, $parser, $importDir) = $import;
+				$this->compileImportedProps($bottom, $block, $out, $parser, $importDir);
+			}
+
+			break;
+		default:
+			$this->throwError("unknown op: {$prop[0]}\n");
+		}
+	}
+
+
+	/**
+	 * Compiles a primitive value into a CSS property value.
+	 *
+	 * Values in lessphp are typed by being wrapped in arrays, their format is
+	 * typically:
+	 *
+	 *     array(type, contents [, additional_contents]*)
+	 *
+	 * The input is expected to be reduced. This function will not work on
+	 * things like expressions and variables.
+	 */
+	protected function compileValue($value) {
+		switch ($value[0]) {
+		case 'list':
+			// [1] - delimiter
+			// [2] - array of values
+			return implode($value[1], array_map(array($this, 'compileValue'), $value[2]));
+		case 'raw_color':
+			if (!empty($this->formatter->compressColors)) {
+				return $this->compileValue($this->coerceColor($value));
+			}
+			return $value[1];
+		case 'keyword':
+			// [1] - the keyword
+			return $value[1];
+		case 'number':
+			list(, $num, $unit) = $value;
+			// [1] - the number
+			// [2] - the unit
+			if ($this->numberPrecision !== null) {
+				$num = round($num, $this->numberPrecision);
+			}
+			return $num . $unit;
+		case 'string':
+			// [1] - contents of string (includes quotes)
+			list(, $delim, $content) = $value;
+			foreach ($content as &$part) {
+				if (is_array($part)) {
+					$part = $this->compileValue($part);
+				}
+			}
+			return $delim . implode($content) . $delim;
+		case 'color':
+			// [1] - red component (either number or a %)
+			// [2] - green component
+			// [3] - blue component
+			// [4] - optional alpha component
+			list(, $r, $g, $b) = $value;
+			$r = round($r);
+			$g = round($g);
+			$b = round($b);
+
+			if (count($value) == 5 && $value[4] != 1) { // rgba
+				return 'rgba('.$r.','.$g.','.$b.','.$value[4].')';
+			}
+
+			$h = sprintf("#%02x%02x%02x", $r, $g, $b);
+
+			if (!empty($this->formatter->compressColors)) {
+				// Converting hex color to short notation (e.g. #003399 to #039)
+				if ($h[1] === $h[2] && $h[3] === $h[4] && $h[5] === $h[6]) {
+					$h = '#' . $h[1] . $h[3] . $h[5];
+				}
+			}
+
+			return $h;
+
+		case 'function':
+			list(, $name, $args) = $value;
+			return $name.'('.$this->compileValue($args).')';
+		default: // assumed to be unit
+			$this->throwError("unknown value type: $value[0]");
+		}
+	}
+
+	protected function lib_pow($args) {
+		list($base, $exp) = $this->assertArgs($args, 2, "pow");
+		return pow($this->assertNumber($base), $this->assertNumber($exp));
+	}
+
+	protected function lib_pi() {
+		return pi();
+	}
+
+	protected function lib_mod($args) {
+		list($a, $b) = $this->assertArgs($args, 2, "mod");
+		return $this->assertNumber($a) % $this->assertNumber($b);
+	}
+
+	protected function lib_tan($num) {
+		return tan($this->assertNumber($num));
+	}
+
+	protected function lib_sin($num) {
+		return sin($this->assertNumber($num));
+	}
+
+	protected function lib_cos($num) {
+		return cos($this->assertNumber($num));
+	}
+
+	protected function lib_atan($num) {
+		$num = atan($this->assertNumber($num));
+		return array("number", $num, "rad");
+	}
+
+	protected function lib_asin($num) {
+		$num = asin($this->assertNumber($num));
+		return array("number", $num, "rad");
+	}
+
+	protected function lib_acos($num) {
+		$num = acos($this->assertNumber($num));
+		return array("number", $num, "rad");
+	}
+
+	protected function lib_sqrt($num) {
+		return sqrt($this->assertNumber($num));
+	}
+
+	protected function lib_extract($value) {
+		list($list, $idx) = $this->assertArgs($value, 2, "extract");
+		$idx = $this->assertNumber($idx);
+		// 1 indexed
+		if ($list[0] == "list" && isset($list[2][$idx - 1])) {
+			return $list[2][$idx - 1];
+		}
+	}
+
+	protected function lib_isnumber($value) {
+		return $this->toBool($value[0] == "number");
+	}
+
+	protected function lib_isstring($value) {
+		return $this->toBool($value[0] == "string");
+	}
+
+	protected function lib_iscolor($value) {
+		return $this->toBool($this->coerceColor($value));
+	}
+
+	protected function lib_iskeyword($value) {
+		return $this->toBool($value[0] == "keyword");
+	}
+
+	protected function lib_ispixel($value) {
+		return $this->toBool($value[0] == "number" && $value[2] == "px");
+	}
+
+	protected function lib_ispercentage($value) {
+		return $this->toBool($value[0] == "number" && $value[2] == "%");
+	}
+
+	protected function lib_isem($value) {
+		return $this->toBool($value[0] == "number" && $value[2] == "em");
+	}
+
+	protected function lib_isrem($value) {
+		return $this->toBool($value[0] == "number" && $value[2] == "rem");
+	}
+
+	protected function lib_rgbahex($color) {
+		$color = $this->coerceColor($color);
+		if (is_null($color))
+			$this->throwError("color expected for rgbahex");
+
+		return sprintf("#%02x%02x%02x%02x",
+			isset($color[4]) ? $color[4]*255 : 255,
+			$color[1],$color[2], $color[3]);
+	}
+
+	protected function lib_argb($color){
+		return $this->lib_rgbahex($color);
+	}
+
+	// utility func to unquote a string
+	protected function lib_e($arg) {
+		switch ($arg[0]) {
+			case "list":
+				$items = $arg[2];
+				if (isset($items[0])) {
+					return $this->lib_e($items[0]);
+				}
+				$this->throwError("unrecognised input");
+			case "string":
+				$arg[1] = "";
+				return $arg;
+			case "keyword":
+				return $arg;
+			default:
+				return array("keyword", $this->compileValue($arg));
+		}
+	}
+
+	protected function lib__sprintf($args) {
+		if ($args[0] != "list") return $args;
+		$values = $args[2];
+		$string = array_shift($values);
+		$template = $this->compileValue($this->lib_e($string));
+
+		$i = 0;
+		if (preg_match_all('/%[dsa]/', $template, $m)) {
+			foreach ($m[0] as $match) {
+				$val = isset($values[$i]) ?
+					$this->reduce($values[$i]) : array('keyword', '');
+
+				// lessjs compat, renders fully expanded color, not raw color
+				if ($color = $this->coerceColor($val)) {
+					$val = $color;
+				}
+
+				$i++;
+				$rep = $this->compileValue($this->lib_e($val));
+				$template = preg_replace('/'.self::preg_quote($match).'/',
+					$rep, $template, 1);
+			}
+		}
+
+		$d = $string[0] == "string" ? $string[1] : '"';
+		return array("string", $d, array($template));
+	}
+
+	protected function lib_floor($arg) {
+		$value = $this->assertNumber($arg);
+		return array("number", floor($value), $arg[2]);
+	}
+
+	protected function lib_ceil($arg) {
+		$value = $this->assertNumber($arg);
+		return array("number", ceil($value), $arg[2]);
+	}
+
+	protected function lib_round($arg) {
+		if($arg[0] != "list") {
+			$value = $this->assertNumber($arg);
+			return array("number", round($value), $arg[2]);
+		} else {
+			$value = $this->assertNumber($arg[2][0]);
+			$precision = $this->assertNumber($arg[2][1]);
+			return array("number", round($value, $precision), $arg[2][0][2]);
+		}
+	}
+
+	protected function lib_unit($arg) {
+		if ($arg[0] == "list") {
+			list($number, $newUnit) = $arg[2];
+			return array("number", $this->assertNumber($number),
+				$this->compileValue($this->lib_e($newUnit)));
+		} else {
+			return array("number", $this->assertNumber($arg), "");
+		}
+	}
+
+	/**
+	 * Helper function to get arguments for color manipulation functions.
+	 * takes a list that contains a color like thing and a percentage
+	 */
+	public function colorArgs($args) {
+		if ($args[0] != 'list' || count($args[2]) < 2) {
+			return array(array('color', 0, 0, 0), 0);
+		}
+		list($color, $delta) = $args[2];
+		$color = $this->assertColor($color);
+		$delta = floatval($delta[1]);
+
+		return array($color, $delta);
+	}
+
+	protected function lib_darken($args) {
+		list($color, $delta) = $this->colorArgs($args);
+
+		$hsl = $this->toHSL($color);
+		$hsl[3] = $this->clamp($hsl[3] - $delta, 100);
+		return $this->toRGB($hsl);
+	}
+
+	protected function lib_lighten($args) {
+		list($color, $delta) = $this->colorArgs($args);
+
+		$hsl = $this->toHSL($color);
+		$hsl[3] = $this->clamp($hsl[3] + $delta, 100);
+		return $this->toRGB($hsl);
+	}
+
+	protected function lib_saturate($args) {
+		list($color, $delta) = $this->colorArgs($args);
+
+		$hsl = $this->toHSL($color);
+		$hsl[2] = $this->clamp($hsl[2] + $delta, 100);
+		return $this->toRGB($hsl);
+	}
+
+	protected function lib_desaturate($args) {
+		list($color, $delta) = $this->colorArgs($args);
+
+		$hsl = $this->toHSL($color);
+		$hsl[2] = $this->clamp($hsl[2] - $delta, 100);
+		return $this->toRGB($hsl);
+	}
+
+	protected function lib_spin($args) {
+		list($color, $delta) = $this->colorArgs($args);
+
+		$hsl = $this->toHSL($color);
+
+		$hsl[1] = $hsl[1] + $delta % 360;
+		if ($hsl[1] < 0) $hsl[1] += 360;
+
+		return $this->toRGB($hsl);
+	}
+
+	protected function lib_fadeout($args) {
+		list($color, $delta) = $this->colorArgs($args);
+		$color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) - $delta/100);
+		return $color;
+	}
+
+	protected function lib_fadein($args) {
+		list($color, $delta) = $this->colorArgs($args);
+		$color[4] = $this->clamp((isset($color[4]) ? $color[4] : 1) + $delta/100);
+		return $color;
+	}
+
+	protected function lib_hue($color) {
+		$hsl = $this->toHSL($this->assertColor($color));
+		return round($hsl[1]);
+	}
+
+	protected function lib_saturation($color) {
+		$hsl = $this->toHSL($this->assertColor($color));
+		return round($hsl[2]);
+	}
+
+	protected function lib_lightness($color) {
+		$hsl = $this->toHSL($this->assertColor($color));
+		return round($hsl[3]);
+	}
+
+	// get the alpha of a color
+	// defaults to 1 for non-colors or colors without an alpha
+	protected function lib_alpha($value) {
+		if (!is_null($color = $this->coerceColor($value))) {
+			return isset($color[4]) ? $color[4] : 1;
+		}
+	}
+
+	// set the alpha of the color
+	protected function lib_fade($args) {
+		list($color, $alpha) = $this->colorArgs($args);
+		$color[4] = $this->clamp($alpha / 100.0);
+		return $color;
+	}
+
+	protected function lib_percentage($arg) {
+		$num = $this->assertNumber($arg);
+		return array("number", $num*100, "%");
+	}
+
+	// mixes two colors by weight
+	// mix(@color1, @color2, [@weight: 50%]);
+	// http://sass-lang.com/docs/yardoc/Sass/Script/Functions.html#mix-instance_method
+	protected function lib_mix($args) {
+		if ($args[0] != "list" || count($args[2]) < 2)
+			$this->throwError("mix expects (color1, color2, weight)");
+
+		list($first, $second) = $args[2];
+		$first = $this->assertColor($first);
+		$second = $this->assertColor($second);
+
+		$first_a = $this->lib_alpha($first);
+		$second_a = $this->lib_alpha($second);
+
+		if (isset($args[2][2])) {
+			$weight = $args[2][2][1] / 100.0;
+		} else {
+			$weight = 0.5;
+		}
+
+		$w = $weight * 2 - 1;
+		$a = $first_a - $second_a;
+
+		$w1 = (($w * $a == -1 ? $w : ($w + $a)/(1 + $w * $a)) + 1) / 2.0;
+		$w2 = 1.0 - $w1;
+
+		$new = array('color',
+			$w1 * $first[1] + $w2 * $second[1],
+			$w1 * $first[2] + $w2 * $second[2],
+			$w1 * $first[3] + $w2 * $second[3],
+		);
+
+		if ($first_a != 1.0 || $second_a != 1.0) {
+			$new[] = $first_a * $weight + $second_a * ($weight - 1);
+		}
+
+		return $this->fixColor($new);
+	}
+
+	protected function lib_contrast($args) {
+		if ($args[0] != 'list' || count($args[2]) < 3) {
+			return array(array('color', 0, 0, 0), 0);
+		}
+
+		list($inputColor, $darkColor, $lightColor) = $args[2];
+
+		$inputColor = $this->assertColor($inputColor);
+		$darkColor = $this->assertColor($darkColor);
+		$lightColor = $this->assertColor($lightColor);
+		$hsl = $this->toHSL($inputColor);
+
+		if ($hsl[3] > 50) {
+			return $darkColor;
+		}
+
+		return $lightColor;
+	}
+
+	public function assertColor($value, $error = "expected color value") {
+		$color = $this->coerceColor($value);
+		if (is_null($color)) $this->throwError($error);
+		return $color;
+	}
+
+	public function assertNumber($value, $error = "expecting number") {
+		if ($value[0] == "number") return $value[1];
+		$this->throwError($error);
+	}
+
+	public function assertArgs($value, $expectedArgs, $name="") {
+		if ($expectedArgs == 1) {
+			return $value;
+		} else {
+			if ($value[0] !== "list" || $value[1] != ",") $this->throwError("expecting list");
+			$values = $value[2];
+			$numValues = count($values);
+			if ($expectedArgs != $numValues) {
+				if ($name) {
+					$name = $name . ": ";
+				}
+
+				$this->throwError("${name}expecting $expectedArgs arguments, got $numValues");
+			}
+
+			return $values;
+		}
+	}
+
+	protected function toHSL($color) {
+		if ($color[0] == 'hsl') return $color;
+
+		$r = $color[1] / 255;
+		$g = $color[2] / 255;
+		$b = $color[3] / 255;
+
+		$min = min($r, $g, $b);
+		$max = max($r, $g, $b);
+
+		$L = ($min + $max) / 2;
+		if ($min == $max) {
+			$S = $H = 0;
+		} else {
+			if ($L < 0.5)
+				$S = ($max - $min)/($max + $min);
+			else
+				$S = ($max - $min)/(2.0 - $max - $min);
+
+			if ($r == $max) $H = ($g - $b)/($max - $min);
+			elseif ($g == $max) $H = 2.0 + ($b - $r)/($max - $min);
+			elseif ($b == $max) $H = 4.0 + ($r - $g)/($max - $min);
+
+		}
+
+		$out = array('hsl',
+			($H < 0 ? $H + 6 : $H)*60,
+			$S*100,
+			$L*100,
+		);
+
+		if (count($color) > 4) $out[] = $color[4]; // copy alpha
+		return $out;
+	}
+
+	protected function toRGB_helper($comp, $temp1, $temp2) {
+		if ($comp < 0) $comp += 1.0;
+		elseif ($comp > 1) $comp -= 1.0;
+
+		if (6 * $comp < 1) return $temp1 + ($temp2 - $temp1) * 6 * $comp;
+		if (2 * $comp < 1) return $temp2;
+		if (3 * $comp < 2) return $temp1 + ($temp2 - $temp1)*((2/3) - $comp) * 6;
+
+		return $temp1;
+	}
+
+	/**
+	 * Converts a hsl array into a color value in rgb.
+	 * Expects H to be in range of 0 to 360, S and L in 0 to 100
+	 */
+	protected function toRGB($color) {
+		if ($color[0] == 'color') return $color;
+
+		$H = $color[1] / 360;
+		$S = $color[2] / 100;
+		$L = $color[3] / 100;
+
+		if ($S == 0) {
+			$r = $g = $b = $L;
+		} else {
+			$temp2 = $L < 0.5 ?
+				$L*(1.0 + $S) :
+				$L + $S - $L * $S;
+
+			$temp1 = 2.0 * $L - $temp2;
+
+			$r = $this->toRGB_helper($H + 1/3, $temp1, $temp2);
+			$g = $this->toRGB_helper($H, $temp1, $temp2);
+			$b = $this->toRGB_helper($H - 1/3, $temp1, $temp2);
+		}
+
+		// $out = array('color', round($r*255), round($g*255), round($b*255));
+		$out = array('color', $r*255, $g*255, $b*255);
+		if (count($color) > 4) $out[] = $color[4]; // copy alpha
+		return $out;
+	}
+
+	protected function clamp($v, $max = 1, $min = 0) {
+		return min($max, max($min, $v));
+	}
+
+	/**
+	 * Convert the rgb, rgba, hsl color literals of function type
+	 * as returned by the parser into values of color type.
+	 */
+	protected function funcToColor($func) {
+		$fname = $func[1];
+		if ($func[2][0] != 'list') return false; // need a list of arguments
+		$rawComponents = $func[2][2];
+
+		if ($fname == 'hsl' || $fname == 'hsla') {
+			$hsl = array('hsl');
+			$i = 0;
+			foreach ($rawComponents as $c) {
+				$val = $this->reduce($c);
+				$val = isset($val[1]) ? floatval($val[1]) : 0;
+
+				if ($i == 0) $clamp = 360;
+				elseif ($i < 3) $clamp = 100;
+				else $clamp = 1;
+
+				$hsl[] = $this->clamp($val, $clamp);
+				$i++;
+			}
+
+			while (count($hsl) < 4) $hsl[] = 0;
+			return $this->toRGB($hsl);
+
+		} elseif ($fname == 'rgb' || $fname == 'rgba') {
+			$components = array();
+			$i = 1;
+			foreach	($rawComponents as $c) {
+				$c = $this->reduce($c);
+				if ($i < 4) {
+					if ($c[0] == "number" && $c[2] == "%") {
+						$components[] = 255 * ($c[1] / 100);
+					} else {
+						$components[] = floatval($c[1]);
+					}
+				} elseif ($i == 4) {
+					if ($c[0] == "number" && $c[2] == "%") {
+						$components[] = 1.0 * ($c[1] / 100);
+					} else {
+						$components[] = floatval($c[1]);
+					}
+				} else break;
+
+				$i++;
+			}
+			while (count($components) < 3) $components[] = 0;
+			array_unshift($components, 'color');
+			return $this->fixColor($components);
+		}
+
+		return false;
+	}
+
+	protected function reduce($value, $forExpression = false) {
+		switch ($value[0]) {
+		case "interpolate":
+			$reduced = $this->reduce($value[1]);
+			$var = $this->compileValue($reduced);
+			$res = $this->reduce(array("variable", $this->vPrefix . $var));
+
+			if ($res[0] == "raw_color") {
+				$res = $this->coerceColor($res);
+			}
+
+			if (empty($value[2])) $res = $this->lib_e($res);
+
+			return $res;
+		case "variable":
+			$key = $value[1];
+			if (is_array($key)) {
+				$key = $this->reduce($key);
+				$key = $this->vPrefix . $this->compileValue($this->lib_e($key));
+			}
+
+			$seen =& $this->env->seenNames;
+
+			if (!empty($seen[$key])) {
+				$this->throwError("infinite loop detected: $key");
+			}
+
+			$seen[$key] = true;
+			$out = $this->reduce($this->get($key));
+			$seen[$key] = false;
+			return $out;
+		case "list":
+			foreach ($value[2] as &$item) {
+				$item = $this->reduce($item, $forExpression);
+			}
+			return $value;
+		case "expression":
+			return $this->evaluate($value);
+		case "string":
+			foreach ($value[2] as &$part) {
+				if (is_array($part)) {
+					$strip = $part[0] == "variable";
+					$part = $this->reduce($part);
+					if ($strip) $part = $this->lib_e($part);
+				}
+			}
+			return $value;
+		case "escape":
+			list(,$inner) = $value;
+			return $this->lib_e($this->reduce($inner));
+		case "function":
+			$color = $this->funcToColor($value);
+			if ($color) return $color;
+
+			list(, $name, $args) = $value;
+			if ($name == "%") $name = "_sprintf";
+			$f = isset($this->libFunctions[$name]) ?
+				$this->libFunctions[$name] : array($this, 'lib_'.$name);
+
+			if (is_callable($f)) {
+				if ($args[0] == 'list')
+					$args = self::compressList($args[2], $args[1]);
+
+				$ret = call_user_func($f, $this->reduce($args, true), $this);
+
+				if (is_null($ret)) {
+					return array("string", "", array(
+						$name, "(", $args, ")"
+					));
+				}
+
+				// convert to a typed value if the result is a php primitive
+				if (is_numeric($ret)) $ret = array('number', $ret, "");
+				elseif (!is_array($ret)) $ret = array('keyword', $ret);
+
+				return $ret;
+			}
+
+			// plain function, reduce args
+			$value[2] = $this->reduce($value[2]);
+			return $value;
+		case "unary":
+			list(, $op, $exp) = $value;
+			$exp = $this->reduce($exp);
+
+			if ($exp[0] == "number") {
+				switch ($op) {
+				case "+":
+					return $exp;
+				case "-":
+					$exp[1] *= -1;
+					return $exp;
+				}
+			}
+			return array("string", "", array($op, $exp));
+		}
+
+		if ($forExpression) {
+			switch ($value[0]) {
+			case "keyword":
+				if ($color = $this->coerceColor($value)) {
+					return $color;
+				}
+				break;
+			case "raw_color":
+				return $this->coerceColor($value);
+			}
+		}
+
+		return $value;
+	}
+
+
+	// coerce a value for use in color operation
+	protected function coerceColor($value) {
+		switch($value[0]) {
+			case 'color': return $value;
+			case 'raw_color':
+				$c = array("color", 0, 0, 0);
+				$colorStr = substr($value[1], 1);
+				$num = hexdec($colorStr);
+				$width = strlen($colorStr) == 3 ? 16 : 256;
+
+				for ($i = 3; $i > 0; $i--) { // 3 2 1
+					$t = $num % $width;
+					$num /= $width;
+
+					$c[$i] = $t * (256/$width) + $t * floor(16/$width);
+				}
+
+				return $c;
+			case 'keyword':
+				$name = $value[1];
+				if (isset(self::$cssColors[$name])) {
+					$rgba = explode(',', self::$cssColors[$name]);
+
+					if(isset($rgba[3]))
+						return array('color', $rgba[0], $rgba[1], $rgba[2], $rgba[3]);
+
+					return array('color', $rgba[0], $rgba[1], $rgba[2]);
+				}
+				return null;
+		}
+	}
+
+	// make something string like into a string
+	protected function coerceString($value) {
+		switch ($value[0]) {
+		case "string":
+			return $value;
+		case "keyword":
+			return array("string", "", array($value[1]));
+		}
+		return null;
+	}
+
+	// turn list of length 1 into value type
+	protected function flattenList($value) {
+		if ($value[0] == "list" && count($value[2]) == 1) {
+			return $this->flattenList($value[2][0]);
+		}
+		return $value;
+	}
+
+	public function toBool($a) {
+		if ($a) return self::$TRUE;
+		else return self::$FALSE;
+	}
+
+	// evaluate an expression
+	protected function evaluate($exp) {
+		list(, $op, $left, $right, $whiteBefore, $whiteAfter) = $exp;
+
+		$left = $this->reduce($left, true);
+		$right = $this->reduce($right, true);
+
+		if ($leftColor = $this->coerceColor($left)) {
+			$left = $leftColor;
+		}
+
+		if ($rightColor = $this->coerceColor($right)) {
+			$right = $rightColor;
+		}
+
+		$ltype = $left[0];
+		$rtype = $right[0];
+
+		// operators that work on all types
+		if ($op == "and") {
+			return $this->toBool($left == self::$TRUE && $right == self::$TRUE);
+		}
+
+		if ($op == "=") {
+			return $this->toBool($this->eq($left, $right) );
+		}
+
+		if ($op == "+" && !is_null($str = $this->stringConcatenate($left, $right))) {
+			return $str;
+		}
+
+		// type based operators
+		$fname = "op_${ltype}_${rtype}";
+		if (is_callable(array($this, $fname))) {
+			$out = $this->$fname($op, $left, $right);
+			if (!is_null($out)) return $out;
+		}
+
+		// make the expression look it did before being parsed
+		$paddedOp = $op;
+		if ($whiteBefore) $paddedOp = " " . $paddedOp;
+		if ($whiteAfter) $paddedOp .= " ";
+
+		return array("string", "", array($left, $paddedOp, $right));
+	}
+
+	protected function stringConcatenate($left, $right) {
+		if ($strLeft = $this->coerceString($left)) {
+			if ($right[0] == "string") {
+				$right[1] = "";
+			}
+			$strLeft[2][] = $right;
+			return $strLeft;
+		}
+
+		if ($strRight = $this->coerceString($right)) {
+			array_unshift($strRight[2], $left);
+			return $strRight;
+		}
+	}
+
+
+	// make sure a color's components don't go out of bounds
+	protected function fixColor($c) {
+		foreach (range(1, 3) as $i) {
+			if ($c[$i] < 0) $c[$i] = 0;
+			if ($c[$i] > 255) $c[$i] = 255;
+		}
+
+		return $c;
+	}
+
+	protected function op_number_color($op, $lft, $rgt) {
+		if ($op == '+' || $op == '*') {
+			return $this->op_color_number($op, $rgt, $lft);
+		}
+	}
+
+	protected function op_color_number($op, $lft, $rgt) {
+		if ($rgt[0] == '%') $rgt[1] /= 100;
+
+		return $this->op_color_color($op, $lft,
+			array_fill(1, count($lft) - 1, $rgt[1]));
+	}
+
+	protected function op_color_color($op, $left, $right) {
+		$out = array('color');
+		$max = count($left) > count($right) ? count($left) : count($right);
+		foreach (range(1, $max - 1) as $i) {
+			$lval = isset($left[$i]) ? $left[$i] : 0;
+			$rval = isset($right[$i]) ? $right[$i] : 0;
+			switch ($op) {
+			case '+':
+				$out[] = $lval + $rval;
+				break;
+			case '-':
+				$out[] = $lval - $rval;
+				break;
+			case '*':
+				$out[] = $lval * $rval;
+				break;
+			case '%':
+				$out[] = $lval % $rval;
+				break;
+			case '/':
+				if ($rval == 0) $this->throwError("evaluate error: can't divide by zero");
+				$out[] = $lval / $rval;
+				break;
+			default:
+				$this->throwError('evaluate error: color op number failed on op '.$op);
+			}
+		}
+		return $this->fixColor($out);
+	}
+
+	function lib_red($color){
+		$color = $this->coerceColor($color);
+		if (is_null($color)) {
+			$this->throwError('color expected for red()');
+		}
+
+		return $color[1];
+	}
+
+	function lib_green($color){
+		$color = $this->coerceColor($color);
+		if (is_null($color)) {
+			$this->throwError('color expected for green()');
+		}
+
+		return $color[2];
+	}
+
+	function lib_blue($color){
+		$color = $this->coerceColor($color);
+		if (is_null($color)) {
+			$this->throwError('color expected for blue()');
+		}
+
+		return $color[3];
+	}
+
+
+	// operator on two numbers
+	protected function op_number_number($op, $left, $right) {
+		$unit = empty($left[2]) ? $right[2] : $left[2];
+
+		$value = 0;
+		switch ($op) {
+		case '+':
+			$value = $left[1] + $right[1];
+			break;
+		case '*':
+			$value = $left[1] * $right[1];
+			break;
+		case '-':
+			$value = $left[1] - $right[1];
+			break;
+		case '%':
+			$value = $left[1] % $right[1];
+			break;
+		case '/':
+			if ($right[1] == 0) $this->throwError('parse error: divide by zero');
+			$value = $left[1] / $right[1];
+			break;
+		case '<':
+			return $this->toBool($left[1] < $right[1]);
+		case '>':
+			return $this->toBool($left[1] > $right[1]);
+		case '>=':
+			return $this->toBool($left[1] >= $right[1]);
+		case '=<':
+			return $this->toBool($left[1] <= $right[1]);
+		default:
+			$this->throwError('parse error: unknown number operator: '.$op);
+		}
+
+		return array("number", $value, $unit);
+	}
+
+
+	/* environment functions */
+
+	protected function makeOutputBlock($type, $selectors = null) {
+		$b = new stdclass;
+		$b->lines = array();
+		$b->children = array();
+		$b->selectors = $selectors;
+		$b->type = $type;
+		$b->parent = $this->scope;
+		return $b;
+	}
+
+	// the state of execution
+	protected function pushEnv($block = null) {
+		$e = new stdclass;
+		$e->parent = $this->env;
+		$e->store = array();
+		$e->block = $block;
+
+		$this->env = $e;
+		return $e;
+	}
+
+	// pop something off the stack
+	protected function popEnv() {
+		$old = $this->env;
+		$this->env = $this->env->parent;
+		return $old;
+	}
+
+	// set something in the current env
+	protected function set($name, $value) {
+		$this->env->store[$name] = $value;
+	}
+
+
+	// get the highest occurrence entry for a name
+	protected function get($name) {
+		$current = $this->env;
+
+		$isArguments = $name == $this->vPrefix . 'arguments';
+		while ($current) {
+			if ($isArguments && isset($current->arguments)) {
+				return array('list', ' ', $current->arguments);
+			}
+
+			if (isset($current->store[$name]))
+				return $current->store[$name];
+			else {
+				$current = isset($current->storeParent) ?
+					$current->storeParent : $current->parent;
+			}
+		}
+
+		$this->throwError("variable $name is undefined");
+	}
+
+	// inject array of unparsed strings into environment as variables
+	protected function injectVariables($args) {
+		$this->pushEnv();
+		$parser = new lessc_parser($this, __METHOD__);
+		foreach ($args as $name => $strValue) {
+			if ($name{0} != '@') $name = '@'.$name;
+			$parser->count = 0;
+			$parser->buffer = (string)$strValue;
+			if (!$parser->propertyValue($value)) {
+				throw new Exception("failed to parse passed in variable $name: $strValue");
+			}
+
+			$this->set($name, $value);
+		}
+	}
+
+	/**
+	 * Initialize any static state, can initialize parser for a file
+	 * $opts isn't used yet
+	 */
+	public function __construct($fname = null) {
+		if ($fname !== null) {
+			// used for deprecated parse method
+			$this->_parseFile = $fname;
+		}
+	}
+
+	public function compile($string, $name = null) {
+		$locale = setlocale(LC_NUMERIC, 0);
+		setlocale(LC_NUMERIC, "C");
+
+		$this->parser = $this->makeParser($name);
+		$root = $this->parser->parse($string);
+
+		$this->env = null;
+		$this->scope = null;
+
+		$this->formatter = $this->newFormatter();
+
+		if (!empty($this->registeredVars)) {
+			$this->injectVariables($this->registeredVars);
+		}
+
+		$this->sourceParser = $this->parser; // used for error messages
+		$this->compileBlock($root);
+
+		ob_start();
+		$this->formatter->block($this->scope);
+		$out = ob_get_clean();
+		setlocale(LC_NUMERIC, $locale);
+		return $out;
+	}
+
+	public function compileFile($fname, $outFname = null) {
+		if (!is_readable($fname)) {
+			throw new Exception('load error: failed to find '.$fname);
+		}
+
+		$pi = pathinfo($fname);
+
+		$oldImport = $this->importDir;
+
+		$this->importDir = (array)$this->importDir;
+		$this->importDir[] = $pi['dirname'].'/';
+
+		$this->addParsedFile($fname);
+
+		$out = $this->compile(file_get_contents($fname), $fname);
+
+		$this->importDir = $oldImport;
+
+		if ($outFname !== null) {
+			return file_put_contents($outFname, $out);
+		}
+
+		return $out;
+	}
+
+	// compile only if changed input has changed or output doesn't exist
+	public function checkedCompile($in, $out) {
+		if (!is_file($out) || filemtime($in) > filemtime($out)) {
+			$this->compileFile($in, $out);
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Execute lessphp on a .less file or a lessphp cache structure
+	 *
+	 * The lessphp cache structure contains information about a specific
+	 * less file having been parsed. It can be used as a hint for future
+	 * calls to determine whether or not a rebuild is required.
+	 *
+	 * The cache structure contains two important keys that may be used
+	 * externally:
+	 *
+	 * compiled: The final compiled CSS
+	 * updated: The time (in seconds) the CSS was last compiled
+	 *
+	 * The cache structure is a plain-ol' PHP associative array and can
+	 * be serialized and unserialized without a hitch.
+	 *
+	 * @param mixed $in Input
+	 * @param bool $force Force rebuild?
+	 * @return array lessphp cache structure
+	 */
+	public function cachedCompile($in, $force = false) {
+		// assume no root
+		$root = null;
+
+		if (is_string($in)) {
+			$root = $in;
+		} elseif (is_array($in) and isset($in['root'])) {
+			if ($force or ! isset($in['files'])) {
+				// If we are forcing a recompile or if for some reason the
+				// structure does not contain any file information we should
+				// specify the root to trigger a rebuild.
+				$root = $in['root'];
+			} elseif (isset($in['files']) and is_array($in['files'])) {
+				foreach ($in['files'] as $fname => $ftime ) {
+					if (!file_exists($fname) or filemtime($fname) > $ftime) {
+						// One of the files we knew about previously has changed
+						// so we should look at our incoming root again.
+						$root = $in['root'];
+						break;
+					}
+				}
+			}
+		} else {
+			// TODO: Throw an exception? We got neither a string nor something
+			// that looks like a compatible lessphp cache structure.
+			return null;
+		}
+
+		if ($root !== null) {
+			// If we have a root value which means we should rebuild.
+			$out = array();
+			$out['root'] = $root;
+			$out['compiled'] = $this->compileFile($root);
+			$out['files'] = $this->allParsedFiles();
+			$out['updated'] = time();
+			return $out;
+		} else {
+			// No changes, pass back the structure
+			// we were given initially.
+			return $in;
+		}
+
+	}
+
+	// parse and compile buffer
+	// This is deprecated
+	public function parse($str = null, $initialVariables = null) {
+		if (is_array($str)) {
+			$initialVariables = $str;
+			$str = null;
+		}
+
+		$oldVars = $this->registeredVars;
+		if ($initialVariables !== null) {
+			$this->setVariables($initialVariables);
+		}
+
+		if ($str == null) {
+			if (empty($this->_parseFile)) {
+				throw new exception("nothing to parse");
+			}
+
+			$out = $this->compileFile($this->_parseFile);
+		} else {
+			$out = $this->compile($str);
+		}
+
+		$this->registeredVars = $oldVars;
+		return $out;
+	}
+
+	protected function makeParser($name) {
+		$parser = new lessc_parser($this, $name);
+		$parser->writeComments = $this->preserveComments;
+
+		return $parser;
+	}
+
+	public function setFormatter($name) {
+		$this->formatterName = $name;
+	}
+
+	protected function newFormatter() {
+		$className = "lessc_formatter_lessjs";
+		if (!empty($this->formatterName)) {
+			if (!is_string($this->formatterName))
+				return $this->formatterName;
+			$className = "lessc_formatter_$this->formatterName";
+		}
+
+		return new $className;
+	}
+
+	public function setPreserveComments($preserve) {
+		$this->preserveComments = $preserve;
+	}
+
+	public function registerFunction($name, $func) {
+		$this->libFunctions[$name] = $func;
+	}
+
+	public function unregisterFunction($name) {
+		unset($this->libFunctions[$name]);
+	}
+
+	public function setVariables($variables) {
+		$this->registeredVars = array_merge($this->registeredVars, $variables);
+	}
+
+	public function unsetVariable($name) {
+		unset($this->registeredVars[$name]);
+	}
+
+	public function setImportDir($dirs) {
+		$this->importDir = (array)$dirs;
+	}
+
+	public function addImportDir($dir) {
+		$this->importDir = (array)$this->importDir;
+		$this->importDir[] = $dir;
+	}
+
+	public function allParsedFiles() {
+		return $this->allParsedFiles;
+	}
+
+	public function addParsedFile($file) {
+		$this->allParsedFiles[realpath($file)] = filemtime($file);
+	}
+
+	/**
+	 * Uses the current value of $this->count to show line and line number
+	 */
+	public function throwError($msg = null) {
+		if ($this->sourceLoc >= 0) {
+			$this->sourceParser->throwError($msg, $this->sourceLoc);
+		}
+		throw new exception($msg);
+	}
+
+	// compile file $in to file $out if $in is newer than $out
+	// returns true when it compiles, false otherwise
+	public static function ccompile($in, $out, $less = null) {
+		if ($less === null) {
+			$less = new self;
+		}
+		return $less->checkedCompile($in, $out);
+	}
+
+	public static function cexecute($in, $force = false, $less = null) {
+		if ($less === null) {
+			$less = new self;
+		}
+		return $less->cachedCompile($in, $force);
+	}
+
+	static protected $cssColors = array(
+		'aliceblue' => '240,248,255',
+		'antiquewhite' => '250,235,215',
+		'aqua' => '0,255,255',
+		'aquamarine' => '127,255,212',
+		'azure' => '240,255,255',
+		'beige' => '245,245,220',
+		'bisque' => '255,228,196',
+		'black' => '0,0,0',
+		'blanchedalmond' => '255,235,205',
+		'blue' => '0,0,255',
+		'blueviolet' => '138,43,226',
+		'brown' => '165,42,42',
+		'burlywood' => '222,184,135',
+		'cadetblue' => '95,158,160',
+		'chartreuse' => '127,255,0',
+		'chocolate' => '210,105,30',
+		'coral' => '255,127,80',
+		'cornflowerblue' => '100,149,237',
+		'cornsilk' => '255,248,220',
+		'crimson' => '220,20,60',
+		'cyan' => '0,255,255',
+		'darkblue' => '0,0,139',
+		'darkcyan' => '0,139,139',
+		'darkgoldenrod' => '184,134,11',
+		'darkgray' => '169,169,169',
+		'darkgreen' => '0,100,0',
+		'darkgrey' => '169,169,169',
+		'darkkhaki' => '189,183,107',
+		'darkmagenta' => '139,0,139',
+		'darkolivegreen' => '85,107,47',
+		'darkorange' => '255,140,0',
+		'darkorchid' => '153,50,204',
+		'darkred' => '139,0,0',
+		'darksalmon' => '233,150,122',
+		'darkseagreen' => '143,188,143',
+		'darkslateblue' => '72,61,139',
+		'darkslategray' => '47,79,79',
+		'darkslategrey' => '47,79,79',
+		'darkturquoise' => '0,206,209',
+		'darkviolet' => '148,0,211',
+		'deeppink' => '255,20,147',
+		'deepskyblue' => '0,191,255',
+		'dimgray' => '105,105,105',
+		'dimgrey' => '105,105,105',
+		'dodgerblue' => '30,144,255',
+		'firebrick' => '178,34,34',
+		'floralwhite' => '255,250,240',
+		'forestgreen' => '34,139,34',
+		'fuchsia' => '255,0,255',
+		'gainsboro' => '220,220,220',
+		'ghostwhite' => '248,248,255',
+		'gold' => '255,215,0',
+		'goldenrod' => '218,165,32',
+		'gray' => '128,128,128',
+		'green' => '0,128,0',
+		'greenyellow' => '173,255,47',
+		'grey' => '128,128,128',
+		'honeydew' => '240,255,240',
+		'hotpink' => '255,105,180',
+		'indianred' => '205,92,92',
+		'indigo' => '75,0,130',
+		'ivory' => '255,255,240',
+		'khaki' => '240,230,140',
+		'lavender' => '230,230,250',
+		'lavenderblush' => '255,240,245',
+		'lawngreen' => '124,252,0',
+		'lemonchiffon' => '255,250,205',
+		'lightblue' => '173,216,230',
+		'lightcoral' => '240,128,128',
+		'lightcyan' => '224,255,255',
+		'lightgoldenrodyellow' => '250,250,210',
+		'lightgray' => '211,211,211',
+		'lightgreen' => '144,238,144',
+		'lightgrey' => '211,211,211',
+		'lightpink' => '255,182,193',
+		'lightsalmon' => '255,160,122',
+		'lightseagreen' => '32,178,170',
+		'lightskyblue' => '135,206,250',
+		'lightslategray' => '119,136,153',
+		'lightslategrey' => '119,136,153',
+		'lightsteelblue' => '176,196,222',
+		'lightyellow' => '255,255,224',
+		'lime' => '0,255,0',
+		'limegreen' => '50,205,50',
+		'linen' => '250,240,230',
+		'magenta' => '255,0,255',
+		'maroon' => '128,0,0',
+		'mediumaquamarine' => '102,205,170',
+		'mediumblue' => '0,0,205',
+		'mediumorchid' => '186,85,211',
+		'mediumpurple' => '147,112,219',
+		'mediumseagreen' => '60,179,113',
+		'mediumslateblue' => '123,104,238',
+		'mediumspringgreen' => '0,250,154',
+		'mediumturquoise' => '72,209,204',
+		'mediumvioletred' => '199,21,133',
+		'midnightblue' => '25,25,112',
+		'mintcream' => '245,255,250',
+		'mistyrose' => '255,228,225',
+		'moccasin' => '255,228,181',
+		'navajowhite' => '255,222,173',
+		'navy' => '0,0,128',
+		'oldlace' => '253,245,230',
+		'olive' => '128,128,0',
+		'olivedrab' => '107,142,35',
+		'orange' => '255,165,0',
+		'orangered' => '255,69,0',
+		'orchid' => '218,112,214',
+		'palegoldenrod' => '238,232,170',
+		'palegreen' => '152,251,152',
+		'paleturquoise' => '175,238,238',
+		'palevioletred' => '219,112,147',
+		'papayawhip' => '255,239,213',
+		'peachpuff' => '255,218,185',
+		'peru' => '205,133,63',
+		'pink' => '255,192,203',
+		'plum' => '221,160,221',
+		'powderblue' => '176,224,230',
+		'purple' => '128,0,128',
+		'red' => '255,0,0',
+		'rosybrown' => '188,143,143',
+		'royalblue' => '65,105,225',
+		'saddlebrown' => '139,69,19',
+		'salmon' => '250,128,114',
+		'sandybrown' => '244,164,96',
+		'seagreen' => '46,139,87',
+		'seashell' => '255,245,238',
+		'sienna' => '160,82,45',
+		'silver' => '192,192,192',
+		'skyblue' => '135,206,235',
+		'slateblue' => '106,90,205',
+		'slategray' => '112,128,144',
+		'slategrey' => '112,128,144',
+		'snow' => '255,250,250',
+		'springgreen' => '0,255,127',
+		'steelblue' => '70,130,180',
+		'tan' => '210,180,140',
+		'teal' => '0,128,128',
+		'thistle' => '216,191,216',
+		'tomato' => '255,99,71',
+		'transparent' => '0,0,0,0',
+		'turquoise' => '64,224,208',
+		'violet' => '238,130,238',
+		'wheat' => '245,222,179',
+		'white' => '255,255,255',
+		'whitesmoke' => '245,245,245',
+		'yellow' => '255,255,0',
+		'yellowgreen' => '154,205,50'
+	);
+}
+
+// responsible for taking a string of LESS code and converting it into a
+// syntax tree
+class lessc_parser {
+	static protected $nextBlockId = 0; // used to uniquely identify blocks
+
+	static protected $precedence = array(
+		'=<' => 0,
+		'>=' => 0,
+		'=' => 0,
+		'<' => 0,
+		'>' => 0,
+
+		'+' => 1,
+		'-' => 1,
+		'*' => 2,
+		'/' => 2,
+		'%' => 2,
+	);
+
+	static protected $whitePattern;
+	static protected $commentMulti;
+
+	static protected $commentSingle = "//";
+	static protected $commentMultiLeft = "/*";
+	static protected $commentMultiRight = "*/";
+
+	// regex string to match any of the operators
+	static protected $operatorString;
+
+	// these properties will supress division unless it's inside parenthases
+	static protected $supressDivisionProps =
+		array('/border-radius$/i', '/^font$/i');
+
+	protected $blockDirectives = array("font-face", "keyframes", "page", "-moz-document", "viewport", "-moz-viewport", "-o-viewport", "-ms-viewport");
+	protected $lineDirectives = array("charset");
+
+	/**
+	 * if we are in parens we can be more liberal with whitespace around
+	 * operators because it must evaluate to a single value and thus is less
+	 * ambiguous.
+	 *
+	 * Consider:
+	 *     property1: 10 -5; // is two numbers, 10 and -5
+	 *     property2: (10 -5); // should evaluate to 5
+	 */
+	protected $inParens = false;
+
+	// caches preg escaped literals
+	static protected $literalCache = array();
+
+	public function __construct($lessc, $sourceName = null) {
+		$this->eatWhiteDefault = true;
+		// reference to less needed for vPrefix, mPrefix, and parentSelector
+		$this->lessc = $lessc;
+
+		$this->sourceName = $sourceName; // name used for error messages
+
+		$this->writeComments = false;
+
+		if (!self::$operatorString) {
+			self::$operatorString =
+				'('.implode('|', array_map(array('lessc', 'preg_quote'),
+					array_keys(self::$precedence))).')';
+
+			$commentSingle = lessc::preg_quote(self::$commentSingle);
+			$commentMultiLeft = lessc::preg_quote(self::$commentMultiLeft);
+			$commentMultiRight = lessc::preg_quote(self::$commentMultiRight);
+
+			self::$commentMulti = $commentMultiLeft.'.*?'.$commentMultiRight;
+			self::$whitePattern = '/'.$commentSingle.'[^\n]*\s*|('.self::$commentMulti.')\s*|\s+/Ais';
+		}
+	}
+
+	public function parse($buffer) {
+		$this->count = 0;
+		$this->line = 1;
+
+		$this->env = null; // block stack
+		$this->buffer = $this->writeComments ? $buffer : $this->removeComments($buffer);
+		$this->pushSpecialBlock("root");
+		$this->eatWhiteDefault = true;
+		$this->seenComments = array();
+
+		// trim whitespace on head
+		// if (preg_match('/^\s+/', $this->buffer, $m)) {
+		// 	$this->line += substr_count($m[0], "\n");
+		// 	$this->buffer = ltrim($this->buffer);
+		// }
+		$this->whitespace();
+
+		// parse the entire file
+		while (false !== $this->parseChunk());
+
+		if ($this->count != strlen($this->buffer))
+			$this->throwError();
+
+		// TODO report where the block was opened
+		if (!is_null($this->env->parent))
+			throw new exception('parse error: unclosed block');
+
+		return $this->env;
+	}
+
+	/**
+	 * Parse a single chunk off the head of the buffer and append it to the
+	 * current parse environment.
+	 * Returns false when the buffer is empty, or when there is an error.
+	 *
+	 * This function is called repeatedly until the entire document is
+	 * parsed.
+	 *
+	 * This parser is most similar to a recursive descent parser. Single
+	 * functions represent discrete grammatical rules for the language, and
+	 * they are able to capture the text that represents those rules.
+	 *
+	 * Consider the function lessc::keyword(). (all parse functions are
+	 * structured the same)
+	 *
+	 * The function takes a single reference argument. When calling the
+	 * function it will attempt to match a keyword on the head of the buffer.
+	 * If it is successful, it will place the keyword in the referenced
+	 * argument, advance the position in the buffer, and return true. If it
+	 * fails then it won't advance the buffer and it will return false.
+	 *
+	 * All of these parse functions are powered by lessc::match(), which behaves
+	 * the same way, but takes a literal regular expression. Sometimes it is
+	 * more convenient to use match instead of creating a new function.
+	 *
+	 * Because of the format of the functions, to parse an entire string of
+	 * grammatical rules, you can chain them together using &&.
+	 *
+	 * But, if some of the rules in the chain succeed before one fails, then
+	 * the buffer position will be left at an invalid state. In order to
+	 * avoid this, lessc::seek() is used to remember and set buffer positions.
+	 *
+	 * Before parsing a chain, use $s = $this->seek() to remember the current
+	 * position into $s. Then if a chain fails, use $this->seek($s) to
+	 * go back where we started.
+	 */
+	protected function parseChunk() {
+		if (empty($this->buffer)) return false;
+		$s = $this->seek();
+
+		if ($this->whitespace()) {
+			return true;
+		}
+
+		// setting a property
+		if ($this->keyword($key) && $this->assign() &&
+			$this->propertyValue($value, $key) && $this->end())
+		{
+			$this->append(array('assign', $key, $value), $s);
+			return true;
+		} else {
+			$this->seek($s);
+		}
+
+
+		// look for special css blocks
+		if ($this->literal('@', false)) {
+			$this->count--;
+
+			// media
+			if ($this->literal('@media')) {
+				if (($this->mediaQueryList($mediaQueries) || true)
+					&& $this->literal('{'))
+				{
+					$media = $this->pushSpecialBlock("media");
+					$media->queries = is_null($mediaQueries) ? array() : $mediaQueries;
+					return true;
+				} else {
+					$this->seek($s);
+					return false;
+				}
+			}
+
+			if ($this->literal("@", false) && $this->keyword($dirName)) {
+				if ($this->isDirective($dirName, $this->blockDirectives)) {
+					if (($this->openString("{", $dirValue, null, array(";")) || true) &&
+						$this->literal("{"))
+					{
+						$dir = $this->pushSpecialBlock("directive");
+						$dir->name = $dirName;
+						if (isset($dirValue)) $dir->value = $dirValue;
+						return true;
+					}
+				} elseif ($this->isDirective($dirName, $this->lineDirectives)) {
+					if ($this->propertyValue($dirValue) && $this->end()) {
+						$this->append(array("directive", $dirName, $dirValue));
+						return true;
+					}
+				}
+			}
+
+			$this->seek($s);
+		}
+
+		// setting a variable
+		if ($this->variable($var) && $this->assign() &&
+			$this->propertyValue($value) && $this->end())
+		{
+			$this->append(array('assign', $var, $value), $s);
+			return true;
+		} else {
+			$this->seek($s);
+		}
+
+		if ($this->import($importValue)) {
+			$this->append($importValue, $s);
+			return true;
+		}
+
+		// opening parametric mixin
+		if ($this->tag($tag, true) && $this->argumentDef($args, $isVararg) &&
+			($this->guards($guards) || true) &&
+			$this->literal('{'))
+		{
+			$block = $this->pushBlock($this->fixTags(array($tag)));
+			$block->args = $args;
+			$block->isVararg = $isVararg;
+			if (!empty($guards)) $block->guards = $guards;
+			return true;
+		} else {
+			$this->seek($s);
+		}
+
+		// opening a simple block
+		if ($this->tags($tags) && $this->literal('{', false)) {
+			$tags = $this->fixTags($tags);
+			$this->pushBlock($tags);
+			return true;
+		} else {
+			$this->seek($s);
+		}
+
+		// closing a block
+		if ($this->literal('}', false)) {
+			try {
+				$block = $this->pop();
+			} catch (exception $e) {
+				$this->seek($s);
+				$this->throwError($e->getMessage());
+			}
+
+			$hidden = false;
+			if (is_null($block->type)) {
+				$hidden = true;
+				if (!isset($block->args)) {
+					foreach ($block->tags as $tag) {
+						if (!is_string($tag) || $tag{0} != $this->lessc->mPrefix) {
+							$hidden = false;
+							break;
+						}
+					}
+				}
+
+				foreach ($block->tags as $tag) {
+					if (is_string($tag)) {
+						$this->env->children[$tag][] = $block;
+					}
+				}
+			}
+
+			if (!$hidden) {
+				$this->append(array('block', $block), $s);
+			}
+
+			// this is done here so comments aren't bundled into he block that
+			// was just closed
+			$this->whitespace();
+			return true;
+		}
+
+		// mixin
+		if ($this->mixinTags($tags) &&
+			($this->argumentDef($argv, $isVararg) || true) &&
+			($this->keyword($suffix) || true) && $this->end())
+		{
+			$tags = $this->fixTags($tags);
+			$this->append(array('mixin', $tags, $argv, $suffix), $s);
+			return true;
+		} else {
+			$this->seek($s);
+		}
+
+		// spare ;
+		if ($this->literal(';')) return true;
+
+		return false; // got nothing, throw error
+	}
+
+	protected function isDirective($dirname, $directives) {
+		// TODO: cache pattern in parser
+		$pattern = implode("|",
+			array_map(array("lessc", "preg_quote"), $directives));
+		$pattern = '/^(-[a-z-]+-)?(' . $pattern . ')$/i';
+
+		return preg_match($pattern, $dirname);
+	}
+
+	protected function fixTags($tags) {
+		// move @ tags out of variable namespace
+		foreach ($tags as &$tag) {
+			if ($tag{0} == $this->lessc->vPrefix)
+				$tag[0] = $this->lessc->mPrefix;
+		}
+		return $tags;
+	}
+
+	// a list of expressions
+	protected function expressionList(&$exps) {
+		$values = array();
+
+		while ($this->expression($exp)) {
+			$values[] = $exp;
+		}
+
+		if (count($values) == 0) return false;
+
+		$exps = lessc::compressList($values, ' ');
+		return true;
+	}
+
+	/**
+	 * Attempt to consume an expression.
+	 * @link http://en.wikipedia.org/wiki/Operator-precedence_parser#Pseudo-code
+	 */
+	protected function expression(&$out) {
+		if ($this->value($lhs)) {
+			$out = $this->expHelper($lhs, 0);
+
+			// look for / shorthand
+			if (!empty($this->env->supressedDivision)) {
+				unset($this->env->supressedDivision);
+				$s = $this->seek();
+				if ($this->literal("/") && $this->value($rhs)) {
+					$out = array("list", "",
+						array($out, array("keyword", "/"), $rhs));
+				} else {
+					$this->seek($s);
+				}
+			}
+
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * recursively parse infix equation with $lhs at precedence $minP
+	 */
+	protected function expHelper($lhs, $minP) {
+		$this->inExp = true;
+		$ss = $this->seek();
+
+		while (true) {
+			$whiteBefore = isset($this->buffer[$this->count - 1]) &&
+				ctype_space($this->buffer[$this->count - 1]);
+
+			// If there is whitespace before the operator, then we require
+			// whitespace after the operator for it to be an expression
+			$needWhite = $whiteBefore && !$this->inParens;
+
+			if ($this->match(self::$operatorString.($needWhite ? '\s' : ''), $m) && self::$precedence[$m[1]] >= $minP) {
+				if (!$this->inParens && isset($this->env->currentProperty) && $m[1] == "/" && empty($this->env->supressedDivision)) {
+					foreach (self::$supressDivisionProps as $pattern) {
+						if (preg_match($pattern, $this->env->currentProperty)) {
+							$this->env->supressedDivision = true;
+							break 2;
+						}
+					}
+				}
+
+
+				$whiteAfter = isset($this->buffer[$this->count - 1]) &&
+					ctype_space($this->buffer[$this->count - 1]);
+
+				if (!$this->value($rhs)) break;
+
+				// peek for next operator to see what to do with rhs
+				if ($this->peek(self::$operatorString, $next) && self::$precedence[$next[1]] > self::$precedence[$m[1]]) {
+					$rhs = $this->expHelper($rhs, self::$precedence[$next[1]]);
+				}
+
+				$lhs = array('expression', $m[1], $lhs, $rhs, $whiteBefore, $whiteAfter);
+				$ss = $this->seek();
+
+				continue;
+			}
+
+			break;
+		}
+
+		$this->seek($ss);
+
+		return $lhs;
+	}
+
+	// consume a list of values for a property
+	public function propertyValue(&$value, $keyName = null) {
+		$values = array();
+
+		if ($keyName !== null) $this->env->currentProperty = $keyName;
+
+		$s = null;
+		while ($this->expressionList($v)) {
+			$values[] = $v;
+			$s = $this->seek();
+			if (!$this->literal(',')) break;
+		}
+
+		if ($s) $this->seek($s);
+
+		if ($keyName !== null) unset($this->env->currentProperty);
+
+		if (count($values) == 0) return false;
+
+		$value = lessc::compressList($values, ', ');
+		return true;
+	}
+
+	protected function parenValue(&$out) {
+		$s = $this->seek();
+
+		// speed shortcut
+		if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "(") {
+			return false;
+		}
+
+		$inParens = $this->inParens;
+		if ($this->literal("(") &&
+			($this->inParens = true) && $this->expression($exp) &&
+			$this->literal(")"))
+		{
+			$out = $exp;
+			$this->inParens = $inParens;
+			return true;
+		} else {
+			$this->inParens = $inParens;
+			$this->seek($s);
+		}
+
+		return false;
+	}
+
+	// a single value
+	protected function value(&$value) {
+		$s = $this->seek();
+
+		// speed shortcut
+		if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "-") {
+			// negation
+			if ($this->literal("-", false) &&
+				(($this->variable($inner) && $inner = array("variable", $inner)) ||
+				$this->unit($inner) ||
+				$this->parenValue($inner)))
+			{
+				$value = array("unary", "-", $inner);
+				return true;
+			} else {
+				$this->seek($s);
+			}
+		}
+
+		if ($this->parenValue($value)) return true;
+		if ($this->unit($value)) return true;
+		if ($this->color($value)) return true;
+		if ($this->func($value)) return true;
+		if ($this->string($value)) return true;
+
+		if ($this->keyword($word)) {
+			$value = array('keyword', $word);
+			return true;
+		}
+
+		// try a variable
+		if ($this->variable($var)) {
+			$value = array('variable', $var);
+			return true;
+		}
+
+		// unquote string (should this work on any type?
+		if ($this->literal("~") && $this->string($str)) {
+			$value = array("escape", $str);
+			return true;
+		} else {
+			$this->seek($s);
+		}
+
+		// css hack: \0
+		if ($this->literal('\\') && $this->match('([0-9]+)', $m)) {
+			$value = array('keyword', '\\'.$m[1]);
+			return true;
+		} else {
+			$this->seek($s);
+		}
+
+		return false;
+	}
+
+	// an import statement
+	protected function import(&$out) {
+		if (!$this->literal('@import')) return false;
+
+		// @import "something.css" media;
+		// @import url("something.css") media;
+		// @import url(something.css) media;
+
+		if ($this->propertyValue($value)) {
+			$out = array("import", $value);
+			return true;
+		}
+	}
+
+	protected function mediaQueryList(&$out) {
+		if ($this->genericList($list, "mediaQuery", ",", false)) {
+			$out = $list[2];
+			return true;
+		}
+		return false;
+	}
+
+	protected function mediaQuery(&$out) {
+		$s = $this->seek();
+
+		$expressions = null;
+		$parts = array();
+
+		if (($this->literal("only") && ($only = true) || $this->literal("not") && ($not = true) || true) && $this->keyword($mediaType)) {
+			$prop = array("mediaType");
+			if (isset($only)) $prop[] = "only";
+			if (isset($not)) $prop[] = "not";
+			$prop[] = $mediaType;
+			$parts[] = $prop;
+		} else {
+			$this->seek($s);
+		}
+
+
+		if (!empty($mediaType) && !$this->literal("and")) {
+			// ~
+		} else {
+			$this->genericList($expressions, "mediaExpression", "and", false);
+			if (is_array($expressions)) $parts = array_merge($parts, $expressions[2]);
+		}
+
+		if (count($parts) == 0) {
+			$this->seek($s);
+			return false;
+		}
+
+		$out = $parts;
+		return true;
+	}
+
+	protected function mediaExpression(&$out) {
+		$s = $this->seek();
+		$value = null;
+		if ($this->literal("(") &&
+			$this->keyword($feature) &&
+			($this->literal(":") && $this->expression($value) || true) &&
+			$this->literal(")"))
+		{
+			$out = array("mediaExp", $feature);
+			if ($value) $out[] = $value;
+			return true;
+		} elseif ($this->variable($variable)) {
+			$out = array('variable', $variable);
+			return true;
+		}
+
+		$this->seek($s);
+		return false;
+	}
+
+	// an unbounded string stopped by $end
+	protected function openString($end, &$out, $nestingOpen=null, $rejectStrs = null) {
+		$oldWhite = $this->eatWhiteDefault;
+		$this->eatWhiteDefault = false;
+
+		$stop = array("'", '"', "@{", $end);
+		$stop = array_map(array("lessc", "preg_quote"), $stop);
+		// $stop[] = self::$commentMulti;
+
+		if (!is_null($rejectStrs)) {
+			$stop = array_merge($stop, $rejectStrs);
+		}
+
+		$patt = '(.*?)('.implode("|", $stop).')';
+
+		$nestingLevel = 0;
+
+		$content = array();
+		while ($this->match($patt, $m, false)) {
+			if (!empty($m[1])) {
+				$content[] = $m[1];
+				if ($nestingOpen) {
+					$nestingLevel += substr_count($m[1], $nestingOpen);
+				}
+			}
+
+			$tok = $m[2];
+
+			$this->count-= strlen($tok);
+			if ($tok == $end) {
+				if ($nestingLevel == 0) {
+					break;
+				} else {
+					$nestingLevel--;
+				}
+			}
+
+			if (($tok == "'" || $tok == '"') && $this->string($str)) {
+				$content[] = $str;
+				continue;
+			}
+
+			if ($tok == "@{" && $this->interpolation($inter)) {
+				$content[] = $inter;
+				continue;
+			}
+
+			if (!empty($rejectStrs) && in_array($tok, $rejectStrs)) {
+				break;
+			}
+
+			$content[] = $tok;
+			$this->count+= strlen($tok);
+		}
+
+		$this->eatWhiteDefault = $oldWhite;
+
+		if (count($content) == 0) return false;
+
+		// trim the end
+		if (is_string(end($content))) {
+			$content[count($content) - 1] = rtrim(end($content));
+		}
+
+		$out = array("string", "", $content);
+		return true;
+	}
+
+	protected function string(&$out) {
+		$s = $this->seek();
+		if ($this->literal('"', false)) {
+			$delim = '"';
+		} elseif ($this->literal("'", false)) {
+			$delim = "'";
+		} else {
+			return false;
+		}
+
+		$content = array();
+
+		// look for either ending delim , escape, or string interpolation
+		$patt = '([^\n]*?)(@\{|\\\\|' .
+			lessc::preg_quote($delim).')';
+
+		$oldWhite = $this->eatWhiteDefault;
+		$this->eatWhiteDefault = false;
+
+		while ($this->match($patt, $m, false)) {
+			$content[] = $m[1];
+			if ($m[2] == "@{") {
+				$this->count -= strlen($m[2]);
+				if ($this->interpolation($inter, false)) {
+					$content[] = $inter;
+				} else {
+					$this->count += strlen($m[2]);
+					$content[] = "@{"; // ignore it
+				}
+			} elseif ($m[2] == '\\') {
+				$content[] = $m[2];
+				if ($this->literal($delim, false)) {
+					$content[] = $delim;
+				}
+			} else {
+				$this->count -= strlen($delim);
+				break; // delim
+			}
+		}
+
+		$this->eatWhiteDefault = $oldWhite;
+
+		if ($this->literal($delim)) {
+			$out = array("string", $delim, $content);
+			return true;
+		}
+
+		$this->seek($s);
+		return false;
+	}
+
+	protected function interpolation(&$out) {
+		$oldWhite = $this->eatWhiteDefault;
+		$this->eatWhiteDefault = true;
+
+		$s = $this->seek();
+		if ($this->literal("@{") &&
+			$this->openString("}", $interp, null, array("'", '"', ";")) &&
+			$this->literal("}", false))
+		{
+			$out = array("interpolate", $interp);
+			$this->eatWhiteDefault = $oldWhite;
+			if ($this->eatWhiteDefault) $this->whitespace();
+			return true;
+		}
+
+		$this->eatWhiteDefault = $oldWhite;
+		$this->seek($s);
+		return false;
+	}
+
+	protected function unit(&$unit) {
+		// speed shortcut
+		if (isset($this->buffer[$this->count])) {
+			$char = $this->buffer[$this->count];
+			if (!ctype_digit($char) && $char != ".") return false;
+		}
+
+		if ($this->match('([0-9]+(?:\.[0-9]*)?|\.[0-9]+)([%a-zA-Z]+)?', $m)) {
+			$unit = array("number", $m[1], empty($m[2]) ? "" : $m[2]);
+			return true;
+		}
+		return false;
+	}
+
+	// a # color
+	protected function color(&$out) {
+		if ($this->match('(#(?:[0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{3}))', $m)) {
+			if (strlen($m[1]) > 7) {
+				$out = array("string", "", array($m[1]));
+			} else {
+				$out = array("raw_color", $m[1]);
+			}
+			return true;
+		}
+
+		return false;
+	}
+
+	// consume an argument definition list surrounded by ()
+	// each argument is a variable name with optional value
+	// or at the end a ... or a variable named followed by ...
+	// arguments are separated by , unless a ; is in the list, then ; is the
+	// delimiter.
+	protected function argumentDef(&$args, &$isVararg) {
+		$s = $this->seek();
+		if (!$this->literal('(')) return false;
+
+		$values = array();
+		$delim = ",";
+		$method = "expressionList";
+
+		$isVararg = false;
+		while (true) {
+			if ($this->literal("...")) {
+				$isVararg = true;
+				break;
+			}
+
+			if ($this->$method($value)) {
+				if ($value[0] == "variable") {
+					$arg = array("arg", $value[1]);
+					$ss = $this->seek();
+
+					if ($this->assign() && $this->$method($rhs)) {
+						$arg[] = $rhs;
+					} else {
+						$this->seek($ss);
+						if ($this->literal("...")) {
+							$arg[0] = "rest";
+							$isVararg = true;
+						}
+					}
+
+					$values[] = $arg;
+					if ($isVararg) break;
+					continue;
+				} else {
+					$values[] = array("lit", $value);
+				}
+			}
+
+
+			if (!$this->literal($delim)) {
+				if ($delim == "," && $this->literal(";")) {
+					// found new delim, convert existing args
+					$delim = ";";
+					$method = "propertyValue";
+
+					// transform arg list
+					if (isset($values[1])) { // 2 items
+						$newList = array();
+						foreach ($values as $i => $arg) {
+							switch($arg[0]) {
+							case "arg":
+								if ($i) {
+									$this->throwError("Cannot mix ; and , as delimiter types");
+								}
+								$newList[] = $arg[2];
+								break;
+							case "lit":
+								$newList[] = $arg[1];
+								break;
+							case "rest":
+								$this->throwError("Unexpected rest before semicolon");
+							}
+						}
+
+						$newList = array("list", ", ", $newList);
+
+						switch ($values[0][0]) {
+						case "arg":
+							$newArg = array("arg", $values[0][1], $newList);
+							break;
+						case "lit":
+							$newArg = array("lit", $newList);
+							break;
+						}
+
+					} elseif ($values) { // 1 item
+						$newArg = $values[0];
+					}
+
+					if ($newArg) {
+						$values = array($newArg);
+					}
+				} else {
+					break;
+				}
+			}
+		}
+
+		if (!$this->literal(')')) {
+			$this->seek($s);
+			return false;
+		}
+
+		$args = $values;
+
+		return true;
+	}
+
+	// consume a list of tags
+	// this accepts a hanging delimiter
+	protected function tags(&$tags, $simple = false, $delim = ',') {
+		$tags = array();
+		while ($this->tag($tt, $simple)) {
+			$tags[] = $tt;
+			if (!$this->literal($delim)) break;
+		}
+		if (count($tags) == 0) return false;
+
+		return true;
+	}
+
+	// list of tags of specifying mixin path
+	// optionally separated by > (lazy, accepts extra >)
+	protected function mixinTags(&$tags) {
+		$tags = array();
+		while ($this->tag($tt, true)) {
+			$tags[] = $tt;
+			$this->literal(">");
+		}
+
+		if (count($tags) == 0) return false;
+
+		return true;
+	}
+
+	// a bracketed value (contained within in a tag definition)
+	protected function tagBracket(&$parts, &$hasExpression) {
+		// speed shortcut
+		if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] != "[") {
+			return false;
+		}
+
+		$s = $this->seek();
+
+		$hasInterpolation = false;
+
+		if ($this->literal("[", false)) {
+			$attrParts = array("[");
+			// keyword, string, operator
+			while (true) {
+				if ($this->literal("]", false)) {
+					$this->count--;
+					break; // get out early
+				}
+
+				if ($this->match('\s+', $m)) {
+					$attrParts[] = " ";
+					continue;
+				}
+				if ($this->string($str)) {
+					// escape parent selector, (yuck)
+					foreach ($str[2] as &$chunk) {
+						$chunk = str_replace($this->lessc->parentSelector, "$&$", $chunk);
+					}
+
+					$attrParts[] = $str;
+					$hasInterpolation = true;
+					continue;
+				}
+
+				if ($this->keyword($word)) {
+					$attrParts[] = $word;
+					continue;
+				}
+
+				if ($this->interpolation($inter, false)) {
+					$attrParts[] = $inter;
+					$hasInterpolation = true;
+					continue;
+				}
+
+				// operator, handles attr namespace too
+				if ($this->match('[|-~\$\*\^=]+', $m)) {
+					$attrParts[] = $m[0];
+					continue;
+				}
+
+				break;
+			}
+
+			if ($this->literal("]", false)) {
+				$attrParts[] = "]";
+				foreach ($attrParts as $part) {
+					$parts[] = $part;
+				}
+				$hasExpression = $hasExpression || $hasInterpolation;
+				return true;
+			}
+			$this->seek($s);
+		}
+
+		$this->seek($s);
+		return false;
+	}
+
+	// a space separated list of selectors
+	protected function tag(&$tag, $simple = false) {
+		if ($simple)
+			$chars = '^@,:;{}\][>\(\) "\'';
+		else
+			$chars = '^@,;{}["\'';
+
+		$s = $this->seek();
+
+		$hasExpression = false;
+		$parts = array();
+		while ($this->tagBracket($parts, $hasExpression));
+
+		$oldWhite = $this->eatWhiteDefault;
+		$this->eatWhiteDefault = false;
+
+		while (true) {
+			if ($this->match('(['.$chars.'0-9]['.$chars.']*)', $m)) {
+				$parts[] = $m[1];
+				if ($simple) break;
+
+				while ($this->tagBracket($parts, $hasExpression));
+				continue;
+			}
+
+			if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] == "@") {
+				if ($this->interpolation($interp)) {
+					$hasExpression = true;
+					$interp[2] = true; // don't unescape
+					$parts[] = $interp;
+					continue;
+				}
+
+				if ($this->literal("@")) {
+					$parts[] = "@";
+					continue;
+				}
+			}
+
+			if ($this->unit($unit)) { // for keyframes
+				$parts[] = $unit[1];
+				$parts[] = $unit[2];
+				continue;
+			}
+
+			break;
+		}
+
+		$this->eatWhiteDefault = $oldWhite;
+		if (!$parts) {
+			$this->seek($s);
+			return false;
+		}
+
+		if ($hasExpression) {
+			$tag = array("exp", array("string", "", $parts));
+		} else {
+			$tag = trim(implode($parts));
+		}
+
+		$this->whitespace();
+		return true;
+	}
+
+	// a css function
+	protected function func(&$func) {
+		$s = $this->seek();
+
+		if ($this->match('(%|[\w\-_][\w\-_:\.]+|[\w_])', $m) && $this->literal('(')) {
+			$fname = $m[1];
+
+			$sPreArgs = $this->seek();
+
+			$args = array();
+			while (true) {
+				$ss = $this->seek();
+				// this ugly nonsense is for ie filter properties
+				if ($this->keyword($name) && $this->literal('=') && $this->expressionList($value)) {
+					$args[] = array("string", "", array($name, "=", $value));
+				} else {
+					$this->seek($ss);
+					if ($this->expressionList($value)) {
+						$args[] = $value;
+					}
+				}
+
+				if (!$this->literal(',')) break;
+			}
+			$args = array('list', ',', $args);
+
+			if ($this->literal(')')) {
+				$func = array('function', $fname, $args);
+				return true;
+			} elseif ($fname == 'url') {
+				// couldn't parse and in url? treat as string
+				$this->seek($sPreArgs);
+				if ($this->openString(")", $string) && $this->literal(")")) {
+					$func = array('function', $fname, $string);
+					return true;
+				}
+			}
+		}
+
+		$this->seek($s);
+		return false;
+	}
+
+	// consume a less variable
+	protected function variable(&$name) {
+		$s = $this->seek();
+		if ($this->literal($this->lessc->vPrefix, false) &&
+			($this->variable($sub) || $this->keyword($name)))
+		{
+			if (!empty($sub)) {
+				$name = array('variable', $sub);
+			} else {
+				$name = $this->lessc->vPrefix.$name;
+			}
+			return true;
+		}
+
+		$name = null;
+		$this->seek($s);
+		return false;
+	}
+
+	/**
+	 * Consume an assignment operator
+	 * Can optionally take a name that will be set to the current property name
+	 */
+	protected function assign($name = null) {
+		if ($name) $this->currentProperty = $name;
+		return $this->literal(':') || $this->literal('=');
+	}
+
+	// consume a keyword
+	protected function keyword(&$word) {
+		if ($this->match('([\w_\-\*!"][\w\-_"]*)', $m)) {
+			$word = $m[1];
+			return true;
+		}
+		return false;
+	}
+
+	// consume an end of statement delimiter
+	protected function end() {
+		if ($this->literal(';', false)) {
+			return true;
+		} elseif ($this->count == strlen($this->buffer) || $this->buffer[$this->count] == '}') {
+			// if there is end of file or a closing block next then we don't need a ;
+			return true;
+		}
+		return false;
+	}
+
+	protected function guards(&$guards) {
+		$s = $this->seek();
+
+		if (!$this->literal("when")) {
+			$this->seek($s);
+			return false;
+		}
+
+		$guards = array();
+
+		while ($this->guardGroup($g)) {
+			$guards[] = $g;
+			if (!$this->literal(",")) break;
+		}
+
+		if (count($guards) == 0) {
+			$guards = null;
+			$this->seek($s);
+			return false;
+		}
+
+		return true;
+	}
+
+	// a bunch of guards that are and'd together
+	// TODO rename to guardGroup
+	protected function guardGroup(&$guardGroup) {
+		$s = $this->seek();
+		$guardGroup = array();
+		while ($this->guard($guard)) {
+			$guardGroup[] = $guard;
+			if (!$this->literal("and")) break;
+		}
+
+		if (count($guardGroup) == 0) {
+			$guardGroup = null;
+			$this->seek($s);
+			return false;
+		}
+
+		return true;
+	}
+
+	protected function guard(&$guard) {
+		$s = $this->seek();
+		$negate = $this->literal("not");
+
+		if ($this->literal("(") && $this->expression($exp) && $this->literal(")")) {
+			$guard = $exp;
+			if ($negate) $guard = array("negate", $guard);
+			return true;
+		}
+
+		$this->seek($s);
+		return false;
+	}
+
+	/* raw parsing functions */
+
+	protected function literal($what, $eatWhitespace = null) {
+		if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault;
+
+		// shortcut on single letter
+		if (!isset($what[1]) && isset($this->buffer[$this->count])) {
+			if ($this->buffer[$this->count] == $what) {
+				if (!$eatWhitespace) {
+					$this->count++;
+					return true;
+				}
+				// goes below...
+			} else {
+				return false;
+			}
+		}
+
+		if (!isset(self::$literalCache[$what])) {
+			self::$literalCache[$what] = lessc::preg_quote($what);
+		}
+
+		return $this->match(self::$literalCache[$what], $m, $eatWhitespace);
+	}
+
+	protected function genericList(&$out, $parseItem, $delim="", $flatten=true) {
+		$s = $this->seek();
+		$items = array();
+		while ($this->$parseItem($value)) {
+			$items[] = $value;
+			if ($delim) {
+				if (!$this->literal($delim)) break;
+			}
+		}
+
+		if (count($items) == 0) {
+			$this->seek($s);
+			return false;
+		}
+
+		if ($flatten && count($items) == 1) {
+			$out = $items[0];
+		} else {
+			$out = array("list", $delim, $items);
+		}
+
+		return true;
+	}
+
+
+	// advance counter to next occurrence of $what
+	// $until - don't include $what in advance
+	// $allowNewline, if string, will be used as valid char set
+	protected function to($what, &$out, $until = false, $allowNewline = false) {
+		if (is_string($allowNewline)) {
+			$validChars = $allowNewline;
+		} else {
+			$validChars = $allowNewline ? "." : "[^\n]";
+		}
+		if (!$this->match('('.$validChars.'*?)'.lessc::preg_quote($what), $m, !$until)) return false;
+		if ($until) $this->count -= strlen($what); // give back $what
+		$out = $m[1];
+		return true;
+	}
+
+	// try to match something on head of buffer
+	protected function match($regex, &$out, $eatWhitespace = null) {
+		if ($eatWhitespace === null) $eatWhitespace = $this->eatWhiteDefault;
+
+		$r = '/'.$regex.($eatWhitespace && !$this->writeComments ? '\s*' : '').'/Ais';
+		if (preg_match($r, $this->buffer, $out, null, $this->count)) {
+			$this->count += strlen($out[0]);
+			if ($eatWhitespace && $this->writeComments) $this->whitespace();
+			return true;
+		}
+		return false;
+	}
+
+	// match some whitespace
+	protected function whitespace() {
+		if ($this->writeComments) {
+			$gotWhite = false;
+			while (preg_match(self::$whitePattern, $this->buffer, $m, null, $this->count)) {
+				if (isset($m[1]) && empty($this->seenComments[$this->count])) {
+					$this->append(array("comment", $m[1]));
+					$this->seenComments[$this->count] = true;
+				}
+				$this->count += strlen($m[0]);
+				$gotWhite = true;
+			}
+			return $gotWhite;
+		} else {
+			$this->match("", $m);
+			return strlen($m[0]) > 0;
+		}
+	}
+
+	// match something without consuming it
+	protected function peek($regex, &$out = null, $from=null) {
+		if (is_null($from)) $from = $this->count;
+		$r = '/'.$regex.'/Ais';
+		$result = preg_match($r, $this->buffer, $out, null, $from);
+
+		return $result;
+	}
+
+	// seek to a spot in the buffer or return where we are on no argument
+	protected function seek($where = null) {
+		if ($where === null) return $this->count;
+		else $this->count = $where;
+		return true;
+	}
+
+	/* misc functions */
+
+	public function throwError($msg = "parse error", $count = null) {
+		$count = is_null($count) ? $this->count : $count;
+
+		$line = $this->line +
+			substr_count(substr($this->buffer, 0, $count), "\n");
+
+		if (!empty($this->sourceName)) {
+			$loc = "$this->sourceName on line $line";
+		} else {
+			$loc = "line: $line";
+		}
+
+		// TODO this depends on $this->count
+		if ($this->peek("(.*?)(\n|$)", $m, $count)) {
+			throw new exception("$msg: failed at `$m[1]` $loc");
+		} else {
+			throw new exception("$msg: $loc");
+		}
+	}
+
+	protected function pushBlock($selectors=null, $type=null) {
+		$b = new stdclass;
+		$b->parent = $this->env;
+
+		$b->type = $type;
+		$b->id = self::$nextBlockId++;
+
+		$b->isVararg = false; // TODO: kill me from here
+		$b->tags = $selectors;
+
+		$b->props = array();
+		$b->children = array();
+
+		$this->env = $b;
+		return $b;
+	}
+
+	// push a block that doesn't multiply tags
+	protected function pushSpecialBlock($type) {
+		return $this->pushBlock(null, $type);
+	}
+
+	// append a property to the current block
+	protected function append($prop, $pos = null) {
+		if ($pos !== null) $prop[-1] = $pos;
+		$this->env->props[] = $prop;
+	}
+
+	// pop something off the stack
+	protected function pop() {
+		$old = $this->env;
+		$this->env = $this->env->parent;
+		return $old;
+	}
+
+	// remove comments from $text
+	// todo: make it work for all functions, not just url
+	protected function removeComments($text) {
+		$look = array(
+			'url(', '//', '/*', '"', "'"
+		);
+
+		$out = '';
+		$min = null;
+		while (true) {
+			// find the next item
+			foreach ($look as $token) {
+				$pos = strpos($text, $token);
+				if ($pos !== false) {
+					if (!isset($min) || $pos < $min[1]) $min = array($token, $pos);
+				}
+			}
+
+			if (is_null($min)) break;
+
+			$count = $min[1];
+			$skip = 0;
+			$newlines = 0;
+			switch ($min[0]) {
+			case 'url(':
+				if (preg_match('/url\(.*?\)/', $text, $m, 0, $count))
+					$count += strlen($m[0]) - strlen($min[0]);
+				break;
+			case '"':
+			case "'":
+				if (preg_match('/'.$min[0].'.*?(?<!\\\\)'.$min[0].'/', $text, $m, 0, $count))
+					$count += strlen($m[0]) - 1;
+				break;
+			case '//':
+				$skip = strpos($text, "\n", $count);
+				if ($skip === false) $skip = strlen($text) - $count;
+				else $skip -= $count;
+				break;
+			case '/*':
+				if (preg_match('/\/\*.*?\*\//s', $text, $m, 0, $count)) {
+					$skip = strlen($m[0]);
+					$newlines = substr_count($m[0], "\n");
+				}
+				break;
+			}
+
+			if ($skip == 0) $count += strlen($min[0]);
+
+			$out .= substr($text, 0, $count).str_repeat("\n", $newlines);
+			$text = substr($text, $count + $skip);
+
+			$min = null;
+		}
+
+		return $out.$text;
+	}
+
+}
+
+class lessc_formatter_classic {
+	public $indentChar = "  ";
+
+	public $break = "\n";
+	public $open = " {";
+	public $close = "}";
+	public $selectorSeparator = ", ";
+	public $assignSeparator = ":";
+
+	public $openSingle = " { ";
+	public $closeSingle = " }";
+
+	public $disableSingle = false;
+	public $breakSelectors = false;
+
+	public $compressColors = false;
+
+	public function __construct() {
+		$this->indentLevel = 0;
+	}
+
+	public function indentStr($n = 0) {
+		return str_repeat($this->indentChar, max($this->indentLevel + $n, 0));
+	}
+
+	public function property($name, $value) {
+		return $name . $this->assignSeparator . $value . ";";
+	}
+
+	protected function isEmpty($block) {
+		if (empty($block->lines)) {
+			foreach ($block->children as $child) {
+				if (!$this->isEmpty($child)) return false;
+			}
+
+			return true;
+		}
+		return false;
+	}
+
+	public function block($block) {
+		if ($this->isEmpty($block)) return;
+
+		$inner = $pre = $this->indentStr();
+
+		$isSingle = !$this->disableSingle &&
+			is_null($block->type) && count($block->lines) == 1;
+
+		if (!empty($block->selectors)) {
+			$this->indentLevel++;
+
+			if ($this->breakSelectors) {
+				$selectorSeparator = $this->selectorSeparator . $this->break . $pre;
+			} else {
+				$selectorSeparator = $this->selectorSeparator;
+			}
+
+			echo $pre .
+				implode($selectorSeparator, $block->selectors);
+			if ($isSingle) {
+				echo $this->openSingle;
+				$inner = "";
+			} else {
+				echo $this->open . $this->break;
+				$inner = $this->indentStr();
+			}
+
+		}
+
+		if (!empty($block->lines)) {
+			$glue = $this->break.$inner;
+			echo $inner . implode($glue, $block->lines);
+			if (!$isSingle && !empty($block->children)) {
+				echo $this->break;
+			}
+		}
+
+		foreach ($block->children as $child) {
+			$this->block($child);
+		}
+
+		if (!empty($block->selectors)) {
+			if (!$isSingle && empty($block->children)) echo $this->break;
+
+			if ($isSingle) {
+				echo $this->closeSingle . $this->break;
+			} else {
+				echo $pre . $this->close . $this->break;
+			}
+
+			$this->indentLevel--;
+		}
+	}
+}
+
+class lessc_formatter_compressed extends lessc_formatter_classic {
+	public $disableSingle = true;
+	public $open = "{";
+	public $selectorSeparator = ",";
+	public $assignSeparator = ":";
+	public $break = "";
+	public $compressColors = true;
+
+	public function indentStr($n = 0) {
+		return "";
+	}
+}
+
+class lessc_formatter_lessjs extends lessc_formatter_classic {
+	public $disableSingle = true;
+	public $breakSelectors = true;
+	public $assignSeparator = ": ";
+	public $selectorSeparator = ",";
+}
+
+
diff --git a/includes/limit.sh b/includes/limit.sh
index bc1988de..2a1545b6 100644
--- a/includes/limit.sh
+++ b/includes/limit.sh
@@ -6,6 +6,7 @@
 # and is available on most Linux systems. If Perl was distributed with
 # BSD::Resource included, we would happily use that instead, but it isn't.
 
+MW_INCLUDE_STDERR=
 MW_CPU_LIMIT=0
 MW_CGROUP=
 MW_MEM_LIMIT=0
@@ -15,6 +16,10 @@ MW_WALL_CLOCK_LIMIT=0
 # Override settings
 eval "$2"
 
+if [ -n "$MW_INCLUDE_STDERR" ]; then
+	exec 2>&1
+fi
+
 if [ "$MW_CPU_LIMIT" -gt 0 ]; then
 	ulimit -t "$MW_CPU_LIMIT"
 fi
@@ -55,7 +60,7 @@ fi
 
 # Clean up cgroup
 cleanup() {
-	# First we have to move the current task into a "garbage" group, otherwise 
+	# First we have to move the current task into a "garbage" group, otherwise
 	# the cgroup will not be empty, and attempting to remove it will fail with
 	# "Device or resource busy"
 	if [ -w "$MW_CGROUP"/tasks ]; then
@@ -84,7 +89,7 @@ if [ -n "$MW_CGROUP" ]; then
 	updateTaskCount
 
 	if [ $NUM_TASKS -gt 1 ]; then
-		# Spawn a monitor process which will continue to poll for completion 
+		# Spawn a monitor process which will continue to poll for completion
 		# of all processes in the cgroup after termination of the parent shell
 		(
 			while [ $NUM_TASKS -gt 1 ]; do
diff --git a/includes/logging/DeleteLogFormatter.php b/includes/logging/DeleteLogFormatter.php
new file mode 100644
index 00000000..01528b7e
--- /dev/null
+++ b/includes/logging/DeleteLogFormatter.php
@@ -0,0 +1,196 @@
+<?php
+/**
+ * Formatter for delete log entries.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.22
+ */
+
+/**
+ * This class formats delete log entries.
+ *
+ * @since 1.19
+ */
+class DeleteLogFormatter extends LogFormatter {
+	protected function getMessageKey() {
+		$key = parent::getMessageKey();
+		if ( in_array( $this->entry->getSubtype(), array( 'event', 'revision' ) ) ) {
+			if ( count( $this->getMessageParameters() ) < 5 ) {
+				return "$key-legacy";
+			}
+		}
+		return $key;
+	}
+
+	protected function getMessageParameters() {
+		if ( isset( $this->parsedParametersDeleteLog ) ) {
+			return $this->parsedParametersDeleteLog;
+		}
+
+		$params = parent::getMessageParameters();
+		$subtype = $this->entry->getSubtype();
+		if ( in_array( $subtype, array( 'event', 'revision' ) ) ) {
+			// $params[3] here is 'revision' for page revisions, 'oldimage' for file versions, or a comma-separated list of log_ids for log entries.
+			// $subtype here is 'revision' for page revisions and file versions, or 'event' for log entries.
+			if (
+				( $subtype === 'event' && count( $params ) === 6 ) ||
+				( $subtype === 'revision' && isset( $params[3] ) && ( $params[3] === 'revision' || $params[3] === 'oldimage' ) )
+			) {
+				$paramStart = $subtype === 'revision' ? 4 : 3;
+
+				$old = $this->parseBitField( $params[$paramStart + 1] );
+				$new = $this->parseBitField( $params[$paramStart + 2] );
+				list( $hid, $unhid, $extra ) = RevisionDeleter::getChanges( $new, $old );
+				$changes = array();
+				foreach ( $hid as $v ) {
+					$changes[] = $this->msg( "$v-hid" )->plain();
+				}
+				foreach ( $unhid as $v ) {
+					$changes[] = $this->msg( "$v-unhid" )->plain();
+				}
+				foreach ( $extra as $v ) {
+					$changes[] = $this->msg( $v )->plain();
+				}
+				$changeText = $this->context->getLanguage()->listToText( $changes );
+
+				$newParams = array_slice( $params, 0, 3 );
+				$newParams[3] = $changeText;
+				$count = count( explode( ',', $params[$paramStart] ) );
+				$newParams[4] = $this->context->getLanguage()->formatNum( $count );
+				return $this->parsedParametersDeleteLog = $newParams;
+			} else {
+				return $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 );
+			}
+		}
+
+		return $this->parsedParametersDeleteLog = $params;
+	}
+
+	protected function parseBitField( $string ) {
+		// Input is like ofield=2134 or just the number
+		if ( strpos( $string, 'field=' ) === 1 ) {
+			list( , $field ) = explode( '=', $string );
+			return (int)$field;
+		} else {
+			return (int)$string;
+		}
+	}
+
+	public function getActionLinks() {
+		$user = $this->context->getUser();
+		if ( !$user->isAllowed( 'deletedhistory' ) || $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
+			return '';
+		}
+
+		switch ( $this->entry->getSubtype() ) {
+		case 'delete': // Show undelete link
+			if ( $user->isAllowed( 'undelete' ) ) {
+				$message = 'undeletelink';
+			} else {
+				$message = 'undeleteviewlink';
+			}
+			$revert = Linker::linkKnown(
+				SpecialPage::getTitleFor( 'Undelete' ),
+				$this->msg( $message )->escaped(),
+				array(),
+				array( 'target' => $this->entry->getTarget()->getPrefixedDBkey() )
+			);
+			return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+
+		case 'revision': // If an edit was hidden from a page give a review link to the history
+			$params = $this->extractParameters();
+			if ( !isset( $params[3] ) || !isset( $params[4] ) ) {
+				return '';
+			}
+
+			// Different revision types use different URL params...
+			$key = $params[3];
+			// This is a CSV of the IDs
+			$ids = explode( ',', $params[4] );
+
+			$links = array();
+
+			// If there's only one item, we can show a diff link
+			if ( count( $ids ) == 1 ) {
+				// Live revision diffs...
+				if ( $key == 'oldid' || $key == 'revision' ) {
+					$links[] = Linker::linkKnown(
+						$this->entry->getTarget(),
+						$this->msg( 'diff' )->escaped(),
+						array(),
+						array(
+							'diff' => intval( $ids[0] ),
+							'unhide' => 1
+						)
+					);
+				// Deleted revision diffs...
+				} elseif ( $key == 'artimestamp' || $key == 'archive' ) {
+					$links[] = Linker::linkKnown(
+						SpecialPage::getTitleFor( 'Undelete' ),
+						$this->msg( 'diff' )->escaped(),
+						array(),
+						array(
+							'target' => $this->entry->getTarget()->getPrefixedDBkey(),
+							'diff' => 'prev',
+							'timestamp' => $ids[0]
+						)
+					);
+				}
+			}
+
+			// View/modify link...
+			$links[] = Linker::linkKnown(
+				SpecialPage::getTitleFor( 'Revisiondelete' ),
+				$this->msg( 'revdel-restore' )->escaped(),
+				array(),
+				array(
+					'target' => $this->entry->getTarget()->getPrefixedText(),
+					'type' => $key,
+					'ids' => implode( ',', $ids ),
+				)
+			);
+
+			return $this->msg( 'parentheses' )->rawParams(
+				$this->context->getLanguage()->pipeList( $links ) )->escaped();
+
+		case 'event': // Hidden log items, give review link
+			$params = $this->extractParameters();
+			if ( !isset( $params[3] ) ) {
+				return '';
+			}
+			// This is a CSV of the IDs
+			$query = $params[3];
+			// Link to each hidden object ID, $params[1] is the url param
+			$revert = Linker::linkKnown(
+				SpecialPage::getTitleFor( 'Revisiondelete' ),
+				$this->msg( 'revdel-restore' )->escaped(),
+				array(),
+				array(
+					'target' => $this->entry->getTarget()->getPrefixedText(),
+					'type' => 'logging',
+					'ids' => $query
+				)
+			);
+			return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+		default:
+			return '';
+		}
+	}
+}
diff --git a/includes/logging/LogEntry.php b/includes/logging/LogEntry.php
index 0f20ed16..b2a8e50d 100644
--- a/includes/logging/LogEntry.php
+++ b/includes/logging/LogEntry.php
@@ -151,7 +151,7 @@ class DatabaseLogEntry extends LogEntryBase {
 		return array(
 			'tables' => $tables,
 			'fields' => $fields,
-			'conds'  => array(),
+			'conds' => array(),
 			'options' => array(),
 			'join_conds' => $joins,
 		);
@@ -165,7 +165,7 @@ class DatabaseLogEntry extends LogEntryBase {
 	 */
 	public static function newFromRow( $row ) {
 		if ( is_array( $row ) && isset( $row['rc_logid'] ) ) {
-			return new RCDatabaseLogEntry( (object) $row );
+			return new RCDatabaseLogEntry( (object)$row );
 		} else {
 			return new self( $row );
 		}
@@ -233,8 +233,8 @@ class DatabaseLogEntry extends LogEntryBase {
 	}
 
 	public function getPerformer() {
-		if( !$this->performer ) {
-			$userId = (int) $this->row->log_user;
+		if ( !$this->performer ) {
+			$userId = (int)$this->row->log_user;
 			if ( $userId !== 0 ) { // logged-in users
 				if ( isset( $this->row->user_name ) ) {
 					$this->performer = User::newFromRow( $this->row );
@@ -291,8 +291,8 @@ class RCDatabaseLogEntry extends DatabaseLogEntry {
 	}
 
 	public function getPerformer() {
-		if( !$this->performer ) {
-			$userId = (int) $this->row->rc_user;
+		if ( !$this->performer ) {
+			$userId = (int)$this->row->rc_user;
 			if ( $userId !== 0 ) {
 				$this->performer = User::newFromId( $userId );
 			} else {
@@ -334,6 +334,7 @@ class ManualLogEntry extends LogEntryBase {
 	protected $type; ///!< @var string
 	protected $subtype; ///!< @var string
 	protected $parameters = array(); ///!< @var array
+	protected $relations = array(); ///!< @var array
 	protected $performer; ///!< @var User
 	protected $target; ///!< @var Title
 	protected $timestamp; ///!< @var string
@@ -373,6 +374,17 @@ class ManualLogEntry extends LogEntryBase {
 		$this->parameters = $parameters;
 	}
 
+	/**
+	 * Declare arbitrary tag/value relations to this log entry.
+	 * These can be used to filter log entries later on.
+	 *
+	 * @param array Map of (tag => (list of values))
+	 * @since 1.22
+	 */
+	public function setRelations( array $relations ) {
+		$this->relations = $relations;
+	}
+
 	/**
 	 * Set the user that performed the action being logged.
 	 *
@@ -430,12 +442,13 @@ class ManualLogEntry extends LogEntryBase {
 
 	/**
 	 * Inserts the entry into the logging table.
+	 * @param IDatabase $dbw
 	 * @return int If of the log entry
 	 */
-	public function insert() {
+	public function insert( IDatabase $dbw = null ) {
 		global $wgContLang;
 
-		$dbw = wfGetDB( DB_MASTER );
+		$dbw = $dbw ?: wfGetDB( DB_MASTER );
 		$id = $dbw->nextSequenceValue( 'logging_log_id_seq' );
 
 		if ( $this->timestamp === null ) {
@@ -459,10 +472,28 @@ class ManualLogEntry extends LogEntryBase {
 			'log_title' => $this->getTarget()->getDBkey(),
 			'log_page' => $this->getTarget()->getArticleID(),
 			'log_comment' => $comment,
-			'log_params' => serialize( (array) $this->getParameters() ),
+			'log_params' => serialize( (array)$this->getParameters() ),
 		);
 		$dbw->insert( 'logging', $data, __METHOD__ );
 		$this->id = !is_null( $id ) ? $id : $dbw->insertId();
+
+		$rows = array();
+		foreach ( $this->relations as $tag => $values ) {
+			if ( !strlen( $tag ) ) {
+				throw new MWException( "Got empty log search tag." );
+			}
+			foreach ( $values as $value ) {
+				$rows[] = array(
+					'ls_field'  => $tag,
+					'ls_value'  => $value,
+					'ls_log_id' => $this->id
+				);
+			}
+		}
+		if ( count( $rows ) ) {
+			$dbw->insert( 'log_search', $rows, __METHOD__, 'IGNORE' );
+		}
+
 		return $this->id;
 	}
 
@@ -503,7 +534,7 @@ class ManualLogEntry extends LogEntryBase {
 			$this->getSubtype(),
 			$this->getTarget(),
 			$this->getComment(),
-			serialize( (array) $this->getParameters() ),
+			serialize( (array)$this->getParameters() ),
 			$newId,
 			$formatter->getIRCActionComment() // Used for IRC feeds
 		);
@@ -513,7 +544,7 @@ class ManualLogEntry extends LogEntryBase {
 		}
 
 		if ( $to === 'udp' || $to === 'rcandudp' ) {
-			$rc->notifyRC2UDP();
+			$rc->notifyRCFeeds();
 		}
 	}
 
@@ -555,7 +586,7 @@ class ManualLogEntry extends LogEntryBase {
 	}
 
 	public function getDeleted() {
-		return (int) $this->deleted;
+		return (int)$this->deleted;
 	}
 
 }
diff --git a/includes/logging/LogEventsList.php b/includes/logging/LogEventsList.php
index 501af7d6..c27b57af 100644
--- a/includes/logging/LogEventsList.php
+++ b/includes/logging/LogEventsList.php
@@ -74,9 +74,9 @@ class LogEventsList extends ContextSource {
 	public function showHeader( $type ) {
 		wfDeprecated( __METHOD__, '1.19' );
 		// If only one log type is used, then show a special message...
-		$headerType = (count( $type ) == 1) ? $type[0] : '';
+		$headerType = count( $type ) == 1 ? $type[0] : '';
 		$out = $this->getOutput();
-		if( LogPage::isLogType( $headerType ) ) {
+		if ( LogPage::isLogType( $headerType ) ) {
 			$page = new LogPage( $headerType );
 			$out->setPageTitle( $page->getName()->text() );
 			$out->addHTML( $page->getDescription()->parseAsBlock() );
@@ -97,14 +97,14 @@ class LogEventsList extends ContextSource {
 	 * @param $filter: array
 	 * @param $tagFilter: array?
 	 */
-	public function showOptions( $types=array(), $user = '', $page = '', $pattern = '', $year = '',
+	public function showOptions( $types = array(), $user = '', $page = '', $pattern = '', $year = '',
 		$month = '', $filter = null, $tagFilter = '' ) {
 		global $wgScript, $wgMiserMode;
 
 		$title = SpecialPage::getTitleFor( 'Log' );
 
 		// For B/C, we take strings, but make sure they are converted...
-		$types = ($types === '') ? array() : (array)$types;
+		$types = ( $types === '' ) ? array() : (array)$types;
 
 		$tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter );
 
@@ -156,7 +156,7 @@ class LogEventsList extends ContextSource {
 		// Option value -> message mapping
 		$links = array();
 		$hiddens = ''; // keep track for "go" button
-		foreach( $filter as $type => $val ) {
+		foreach ( $filter as $type => $val ) {
 			// Should the below assignment be outside the foreach?
 			// Then it would have to be copied. Not certain what is more expensive.
 			$query = $this->getDefaultQuery();
@@ -172,6 +172,7 @@ class LogEventsList extends ContextSource {
 				$query
 			);
 
+			// Message: log-show-hide-patrol
 			$links[$type] = $this->msg( "log-show-hide-{$type}" )->rawParams( $link )->escaped();
 			$hiddens .= Html::hidden( "hide_{$type}_log", $val ) . "\n";
 		}
@@ -212,7 +213,7 @@ class LogEventsList extends ContextSource {
 	public function getTypeSelector() {
 		$typesByName = array(); // Temporary array
 		// First pass to load the log names
-		foreach( LogPage::validTypes() as $type ) {
+		foreach ( LogPage::validTypes() as $type ) {
 			$page = new LogPage( $type );
 			$restriction = $page->getRestriction();
 			if ( $this->getUser()->isAllowed( $restriction ) ) {
@@ -229,7 +230,7 @@ class LogEventsList extends ContextSource {
 		$typesByName = array( '' => $public ) + $typesByName;
 
 		$select = new XmlSelect( 'type' );
-		foreach( $typesByName as $type => $name ) {
+		foreach ( $typesByName as $type => $name ) {
 			$select->addOption( $name, $type );
 		}
 
@@ -273,10 +274,10 @@ class LogEventsList extends ContextSource {
 	private function getExtraInputs( $types ) {
 		$offender = $this->getRequest()->getVal( 'offender' );
 		$user = User::newFromName( $offender, false );
-		if( !$user || ( $user->getId() == 0 && !IP::isIPAddress( $offender ) ) ) {
+		if ( !$user || ( $user->getId() == 0 && !IP::isIPAddress( $offender ) ) ) {
 			$offender = ''; // Blank field if invalid
 		}
-		if( count( $types ) == 1 && $types[0] == 'suppress' ) {
+		if ( count( $types ) == 1 && $types[0] == 'suppress' ) {
 			return Xml::inputLabel( $this->msg( 'revdelete-offender' )->text(), 'offender',
 				'mw-log-offender', 20, $offender );
 		}
@@ -342,16 +343,16 @@ class LogEventsList extends ContextSource {
 	 * @return string
 	 */
 	private function getShowHideLinks( $row ) {
-		if( ( $this->flags == self::NO_ACTION_LINK ) // we don't want to see the links
+		if ( ( $this->flags == self::NO_ACTION_LINK ) // we don't want to see the links
 			|| $row->log_type == 'suppress' ) { // no one can hide items from the suppress log
 			return '';
 		}
 		$del = '';
 		$user = $this->getUser();
 		// Don't show useless checkbox to people who cannot hide log entries
-		if( $user->isAllowed( 'deletedhistory' ) ) {
+		if ( $user->isAllowed( 'deletedhistory' ) ) {
 			$canHide = $user->isAllowed( 'deletelogentry' );
-			if( $row->log_deleted || $canHide ) {
+			if ( $row->log_deleted || $canHide ) {
 				if ( $canHide && $this->flags & self::USE_REVDEL_CHECKBOXES ) { // Show checkboxes instead of links.
 					if ( !self::userCan( $row, LogPage::DELETED_RESTRICTED, $user ) ) { // If event was hidden from sysops
 						$del = Xml::check( 'deleterevisions', false, array( 'disabled' => 'disabled' ) );
@@ -364,8 +365,8 @@ class LogEventsList extends ContextSource {
 					} else {
 						$query = array(
 							'target' => SpecialPage::getTitleFor( 'Log', $row->log_type )->getPrefixedDBkey(),
-							'type'   => 'logging',
-							'ids'    => $row->log_id,
+							'type' => 'logging',
+							'ids' => $row->log_id,
 						);
 						$del = Linker::revDeleteLink( $query, self::isDeleted( $row, LogPage::DELETED_RESTRICTED ), $canHide );
 					}
@@ -385,10 +386,10 @@ class LogEventsList extends ContextSource {
 	public static function typeAction( $row, $type, $action, $right = '' ) {
 		$match = is_array( $type ) ?
 			in_array( $row->log_type, $type ) : $row->log_type == $type;
-		if( $match ) {
+		if ( $match ) {
 			$match = is_array( $action ) ?
 				in_array( $row->log_action, $action ) : $row->log_action == $action;
-			if( $match && $right ) {
+			if ( $match && $right ) {
 				global $wgUser;
 				$match = $wgUser->isAllowed( $right );
 			}
@@ -419,7 +420,7 @@ class LogEventsList extends ContextSource {
 	 * @return Boolean
 	 */
 	public static function userCanBitfield( $bitfield, $field, User $user = null ) {
-		if( $bitfield & $field ) {
+		if ( $bitfield & $field ) {
 			if ( $bitfield & LogPage::DELETED_RESTRICTED ) {
 				$permission = 'suppressrevision';
 			} else {
@@ -464,10 +465,11 @@ class LogEventsList extends ContextSource {
 	 *   set to '' to unset offset
 	 * - wrap String Wrap the message in html (usually something like "<div ...>$1</div>").
 	 * - flags Integer display flags (NO_ACTION_LINK,NO_EXTRA_USER_LINKS)
+	 * - useRequestParams boolean Set true to use Pager-related parameters in the WebRequest
 	 * @return Integer Number of total log items (not limited by $lim)
 	 */
 	public static function showLogExtract(
-		&$out, $types=array(), $page = '', $user = '', $param = array()
+		&$out, $types = array(), $page = '', $user = '', $param = array()
 	) {
 		$defaultParameters = array(
 			'lim' => 25,
@@ -475,7 +477,8 @@ class LogEventsList extends ContextSource {
 			'showIfEmpty' => true,
 			'msgKey' => array( '' ),
 			'wrap' => "$1",
-			'flags' => 0
+			'flags' => 0,
+			'useRequestParams' => false,
 		);
 		# The + operator appends elements of remaining keys from the right
 		# handed array to the left handed, whereas duplicated keys are NOT overwritten.
@@ -487,6 +490,7 @@ class LogEventsList extends ContextSource {
 		$msgKey = $param['msgKey'];
 		$wrap = $param['wrap'];
 		$flags = $param['flags'];
+		$useRequestParams = $param['useRequestParams'];
 		if ( !is_array( $msgKey ) ) {
 			$msgKey = array( $msgKey );
 		}
@@ -500,13 +504,22 @@ class LogEventsList extends ContextSource {
 		# Insert list of top 50 (or top $lim) items
 		$loglist = new LogEventsList( $context, null, $flags );
 		$pager = new LogPager( $loglist, $types, $user, $page, '', $conds );
+		if ( !$useRequestParams ) {
+			# Reset vars that may have been taken from the request
+			$pager->mLimit = 50;
+			$pager->mDefaultLimit = 50;
+			$pager->mOffset = "";
+			$pager->mIsBackwards = false;
+		}
 		if ( isset( $param['offset'] ) ) { # Tell pager to ignore WebRequest offset
 			$pager->setOffset( $param['offset'] );
 		}
-		if( $lim > 0 ) $pager->mLimit = $lim;
+		if ( $lim > 0 ) {
+			$pager->mLimit = $lim;
+		}
 		$logBody = $pager->getBody();
 		$s = '';
-		if( $logBody ) {
+		if ( $logBody ) {
 			if ( $msgKey[0] ) {
 				$s = '<div class="mw-warning-with-logexcerpt">';
 
@@ -521,26 +534,27 @@ class LogEventsList extends ContextSource {
 			$s .= $loglist->beginLogEventsList() .
 				$logBody .
 				$loglist->endLogEventsList();
-		} else {
-			if ( $showIfEmpty ) {
-				$s = Html::rawElement( 'div', array( 'class' => 'mw-warning-logempty' ),
-					$context->msg( 'logempty' )->parse() );
-			}
+		} elseif ( $showIfEmpty ) {
+			$s = Html::rawElement( 'div', array( 'class' => 'mw-warning-logempty' ),
+				$context->msg( 'logempty' )->parse() );
 		}
-		if( $pager->getNumRows() > $pager->mLimit ) { # Show "Full log" link
+		if ( $pager->getNumRows() > $pager->mLimit ) { # Show "Full log" link
 			$urlParam = array();
 			if ( $page instanceof Title ) {
 				$urlParam['page'] = $page->getPrefixedDBkey();
 			} elseif ( $page != '' ) {
 				$urlParam['page'] = $page;
 			}
-			if ( $user != '' )
+			if ( $user != '' ) {
 				$urlParam['user'] = $user;
-			if ( !is_array( $types ) ) # Make it an array, if it isn't
+			}
+			if ( !is_array( $types ) ) { # Make it an array, if it isn't
 				$types = array( $types );
+			}
 			# If there is exactly one log type, we can link to Special:Log?type=foo
-			if ( count( $types ) == 1 )
+			if ( count( $types ) == 1 ) {
 				$urlParam['type'] = $types[0];
+			}
 			$s .= Linker::link(
 				SpecialPage::getTitleFor( 'Log' ),
 				$context->msg( 'log-fulllog' )->escaped(),
@@ -589,14 +603,14 @@ class LogEventsList extends ContextSource {
 		$hiddenLogs = array();
 
 		// Don't show private logs to unprivileged users
-		foreach( $wgLogRestrictions as $logType => $right ) {
-			if( $audience == 'public' || !$user->isAllowed( $right ) ) {
+		foreach ( $wgLogRestrictions as $logType => $right ) {
+			if ( $audience == 'public' || !$user->isAllowed( $right ) ) {
 				$hiddenLogs[] = $logType;
 			}
 		}
-		if( count( $hiddenLogs ) == 1 ) {
+		if ( count( $hiddenLogs ) == 1 ) {
 			return 'log_type != ' . $db->addQuotes( $hiddenLogs[0] );
-		} elseif( $hiddenLogs ) {
+		} elseif ( $hiddenLogs ) {
 			return 'log_type NOT IN (' . $db->makeList( $hiddenLogs ) . ')';
 		}
 		return false;
diff --git a/includes/logging/LogFormatter.php b/includes/logging/LogFormatter.php
index ace26bbe..8f60aee1 100644
--- a/includes/logging/LogFormatter.php
+++ b/includes/logging/LogFormatter.php
@@ -194,9 +194,9 @@ class LogFormatter {
 		// Text of title the action is aimed at.
 		$target = $entry->getTarget()->getPrefixedText();
 		$text = null;
-		switch( $entry->getType() ) {
+		switch ( $entry->getType() ) {
 			case 'move':
-				switch( $entry->getSubtype() ) {
+				switch ( $entry->getSubtype() ) {
 					case 'move':
 						$movesource = $parameters['4::target'];
 						$text = wfMessage( '1movedto2' )
@@ -215,7 +215,7 @@ class LogFormatter {
 				break;
 
 			case 'delete':
-				switch( $entry->getSubtype() ) {
+				switch ( $entry->getSubtype() ) {
 					case 'delete':
 						$text = wfMessage( 'deletedarticle' )
 							->rawParams( $target )->inContentLanguage()->escaped();
@@ -246,7 +246,7 @@ class LogFormatter {
 				break;
 
 			case 'protect':
-				switch( $entry->getSubtype() ) {
+				switch ( $entry->getSubtype() ) {
 				case 'protect':
 					$text = wfMessage( 'protectedarticle' )
 						->rawParams( $target . ' ' . $parameters[0] )->inContentLanguage()->escaped();
@@ -263,7 +263,7 @@ class LogFormatter {
 				break;
 
 			case 'newusers':
-				switch( $entry->getSubtype() ) {
+				switch ( $entry->getSubtype() ) {
 					case 'newusers':
 					case 'create':
 						$text = wfMessage( 'newuserlog-create-entry' )
@@ -282,7 +282,7 @@ class LogFormatter {
 				break;
 
 			case 'upload':
-				switch( $entry->getSubtype() ) {
+				switch ( $entry->getSubtype() ) {
 					case 'upload':
 						$text = wfMessage( 'uploadedimage' )
 							->rawParams( $target )->inContentLanguage()->escaped();
@@ -305,7 +305,7 @@ class LogFormatter {
 				} else {
 					$newgroups = wfMessage( 'rightsnone' )->inContentLanguage()->escaped();
 				}
-				switch( $entry->getSubtype() ) {
+				switch ( $entry->getSubtype() ) {
 					case 'rights':
 						$text = wfMessage( 'rightslogentry' )
 							->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
@@ -320,7 +320,7 @@ class LogFormatter {
 			// case 'suppress' --private log -- aaron  (sign your messages so we know who to blame in a few years :-D)
 			// default:
 		}
-		if( is_null( $text ) ) {
+		if ( is_null( $text ) ) {
 			$text = $this->getPlainActionText();
 		}
 
@@ -479,7 +479,7 @@ class LogFormatter {
 	protected function formatParameterValue( $type, $value ) {
 		$saveLinkFlood = $this->linkFlood;
 
-		switch( strtolower( trim( $type ) ) ) {
+		switch ( strtolower( trim( $type ) ) ) {
 			case 'raw':
 				$value = Message::rawParam( $value );
 				break;
@@ -775,7 +775,7 @@ class LegacyLogFormatter extends LogFormatter {
 			return $this->msg( 'parentheses' )->rawParams(
 				$this->context->getLanguage()->pipeList( $links ) )->escaped();
 		// Show unmerge link
-		} elseif( $type == 'merge' && $subtype == 'merge' ) {
+		} elseif ( $type == 'merge' && $subtype == 'merge' ) {
 			if ( !$this->context->getUser()->isAllowed( 'mergehistory' ) ) {
 				return '';
 			}
@@ -814,395 +814,3 @@ class LegacyLogFormatter extends LogFormatter {
 	}
 }
 
-/**
- * This class formats move log entries.
- * @since 1.19
- */
-class MoveLogFormatter extends LogFormatter {
-	public function getPreloadTitles() {
-		$params = $this->extractParameters();
-		return array( Title::newFromText( $params[3] ) );
-	}
-
-	protected function getMessageKey() {
-		$key = parent::getMessageKey();
-		$params = $this->getMessageParameters();
-		if ( isset( $params[4] ) && $params[4] === '1' ) {
-			$key .= '-noredirect';
-		}
-		return $key;
-	}
-
-	protected function getMessageParameters() {
-		$params = parent::getMessageParameters();
-		$oldname = $this->makePageLink( $this->entry->getTarget(), array( 'redirect' => 'no' ) );
-		$newname = $this->makePageLink( Title::newFromText( $params[3] ) );
-		$params[2] = Message::rawParam( $oldname );
-		$params[3] = Message::rawParam( $newname );
-		return $params;
-	}
-
-	public function getActionLinks() {
-		if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
-			|| $this->entry->getSubtype() !== 'move'
-			|| !$this->context->getUser()->isAllowed( 'move' ) )
-		{
-			return '';
-		}
-
-		$params = $this->extractParameters();
-		$destTitle = Title::newFromText( $params[3] );
-		if ( !$destTitle ) {
-			return '';
-		}
-
-		$revert = Linker::linkKnown(
-			SpecialPage::getTitleFor( 'Movepage' ),
-			$this->msg( 'revertmove' )->escaped(),
-			array(),
-			array(
-				'wpOldTitle' => $destTitle->getPrefixedDBkey(),
-				'wpNewTitle' => $this->entry->getTarget()->getPrefixedDBkey(),
-				'wpReason'   => $this->msg( 'revertmove' )->inContentLanguage()->text(),
-				'wpMovetalk' => 0
-			)
-		);
-		return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
-	}
-}
-
-/**
- * This class formats delete log entries.
- * @since 1.19
- */
-class DeleteLogFormatter extends LogFormatter {
-	protected function getMessageKey() {
-		$key = parent::getMessageKey();
-		if ( in_array( $this->entry->getSubtype(), array( 'event', 'revision' ) ) ) {
-			if ( count( $this->getMessageParameters() ) < 5 ) {
-				return "$key-legacy";
-			}
-		}
-		return $key;
-	}
-
-	protected function getMessageParameters() {
-		if ( isset( $this->parsedParametersDeleteLog ) ) {
-			return $this->parsedParametersDeleteLog;
-		}
-
-		$params = parent::getMessageParameters();
-		$subtype = $this->entry->getSubtype();
-		if ( in_array( $subtype, array( 'event', 'revision' ) ) ) {
-			// $params[3] here is 'revision' for page revisions, 'oldimage' for file versions, or a comma-separated list of log_ids for log entries.
-			// $subtype here is 'revision' for page revisions and file versions, or 'event' for log entries.
-			if (
-				( $subtype === 'event' && count( $params ) === 6 ) ||
-				( $subtype === 'revision' && isset( $params[3] ) && ( $params[3] === 'revision' || $params[3] === 'oldimage' ) )
-			) {
-				$paramStart = $subtype === 'revision' ? 4 : 3;
-
-				$old = $this->parseBitField( $params[$paramStart+1] );
-				$new = $this->parseBitField( $params[$paramStart+2] );
-				list( $hid, $unhid, $extra ) = RevisionDeleter::getChanges( $new, $old );
-				$changes = array();
-				foreach ( $hid as $v ) {
-					$changes[] = $this->msg( "$v-hid" )->plain();
-				}
-				foreach ( $unhid as $v ) {
-					$changes[] = $this->msg( "$v-unhid" )->plain();
-				}
-				foreach ( $extra as $v ) {
-					$changes[] = $this->msg( $v )->plain();
-				}
-				$changeText = $this->context->getLanguage()->listToText( $changes );
-
-				$newParams = array_slice( $params, 0, 3 );
-				$newParams[3] = $changeText;
-				$count = count( explode( ',', $params[$paramStart] ) );
-				$newParams[4] = $this->context->getLanguage()->formatNum( $count );
-				return $this->parsedParametersDeleteLog = $newParams;
-			} else {
-				return $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 );
-			}
-		}
-
-		return $this->parsedParametersDeleteLog = $params;
-	}
-
-	protected function parseBitField( $string ) {
-		// Input is like ofield=2134 or just the number
-		if ( strpos( $string, 'field=' ) === 1 ) {
-			list( , $field ) = explode( '=', $string );
-			return (int) $field;
-		} else {
-			return (int) $string;
-		}
-	}
-
-	public function getActionLinks() {
-		$user = $this->context->getUser();
-		if ( !$user->isAllowed( 'deletedhistory' ) || $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
-			return '';
-		}
-
-		switch ( $this->entry->getSubtype() ) {
-		case 'delete': // Show undelete link
-			if( $user->isAllowed( 'undelete' ) ) {
-				$message = 'undeletelink';
-			} else {
-				$message = 'undeleteviewlink';
-			}
-			$revert = Linker::linkKnown(
-				SpecialPage::getTitleFor( 'Undelete' ),
-				$this->msg( $message )->escaped(),
-				array(),
-				array( 'target' => $this->entry->getTarget()->getPrefixedDBkey() )
-			);
-			return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
-
-		case 'revision': // If an edit was hidden from a page give a review link to the history
-			$params = $this->extractParameters();
-			if ( !isset( $params[3] ) || !isset( $params[4] ) ) {
-				return '';
-			}
-
-			// Different revision types use different URL params...
-			$key = $params[3];
-			// This is a CSV of the IDs
-			$ids = explode( ',', $params[4] );
-
-			$links = array();
-
-			// If there's only one item, we can show a diff link
-			if ( count( $ids ) == 1 ) {
-				// Live revision diffs...
-				if ( $key == 'oldid' || $key == 'revision' ) {
-					$links[] = Linker::linkKnown(
-						$this->entry->getTarget(),
-						$this->msg( 'diff' )->escaped(),
-						array(),
-						array(
-							'diff' => intval( $ids[0] ),
-							'unhide' => 1
-						)
-					);
-				// Deleted revision diffs...
-				} elseif ( $key == 'artimestamp' || $key == 'archive' ) {
-					$links[] = Linker::linkKnown(
-						SpecialPage::getTitleFor( 'Undelete' ),
-						$this->msg( 'diff' )->escaped(),
-						array(),
-						array(
-							'target'    => $this->entry->getTarget()->getPrefixedDBkey(),
-							'diff'      => 'prev',
-							'timestamp' => $ids[0]
-						)
-					);
-				}
-			}
-
-			// View/modify link...
-			$links[] = Linker::linkKnown(
-				SpecialPage::getTitleFor( 'Revisiondelete' ),
-				$this->msg( 'revdel-restore' )->escaped(),
-				array(),
-				array(
-					'target' => $this->entry->getTarget()->getPrefixedText(),
-					'type' => $key,
-					'ids' => implode( ',', $ids ),
-				)
-			);
-
-			return $this->msg( 'parentheses' )->rawParams(
-				$this->context->getLanguage()->pipeList( $links ) )->escaped();
-
-		case 'event': // Hidden log items, give review link
-			$params = $this->extractParameters();
-			if ( !isset( $params[3] ) ) {
-				return '';
-			}
-			// This is a CSV of the IDs
-			$query = $params[3];
-			// Link to each hidden object ID, $params[1] is the url param
-			$revert = Linker::linkKnown(
-				SpecialPage::getTitleFor( 'Revisiondelete' ),
-				$this->msg( 'revdel-restore' )->escaped(),
-				array(),
-				array(
-					'target' => $this->entry->getTarget()->getPrefixedText(),
-					'type' => 'logging',
-					'ids' => $query
-				)
-			);
-			return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
-		default:
-			return '';
-		}
-	}
-}
-
-/**
- * This class formats patrol log entries.
- * @since 1.19
- */
-class PatrolLogFormatter extends LogFormatter {
-	protected function getMessageKey() {
-		$key = parent::getMessageKey();
-		$params = $this->getMessageParameters();
-		if ( isset( $params[5] ) && $params[5] ) {
-			$key .= '-auto';
-		}
-		return $key;
-	}
-
-	protected function getMessageParameters() {
-		$params = parent::getMessageParameters();
-
-		$target = $this->entry->getTarget();
-		$oldid = $params[3];
-		$revision = $this->context->getLanguage()->formatNum( $oldid, true );
-
-		if ( $this->plaintext ) {
-			$revlink = $revision;
-		} elseif ( $target->exists() ) {
-			$query = array(
-				'oldid' => $oldid,
-				'diff' => 'prev'
-			);
-			$revlink = Linker::link( $target, htmlspecialchars( $revision ), array(), $query );
-		} else {
-			$revlink = htmlspecialchars( $revision );
-		}
-
-		$params[3] = Message::rawParam( $revlink );
-		return $params;
-	}
-}
-
-/**
- * This class formats new user log entries.
- * @since 1.19
- */
-class NewUsersLogFormatter extends LogFormatter {
-	protected function getMessageParameters() {
-		$params = parent::getMessageParameters();
-		$subtype = $this->entry->getSubtype();
-		if ( $subtype === 'create2' || $subtype === 'byemail' ) {
-			if ( isset( $params[3] ) ) {
-				$target = User::newFromId( $params[3] );
-			} else {
-				$target = User::newFromName( $this->entry->getTarget()->getText(), false );
-			}
-			$params[2] = Message::rawParam( $this->makeUserLink( $target ) );
-			$params[3] = $target->getName();
-		}
-		return $params;
-	}
-
-	public function getComment() {
-		$timestamp = wfTimestamp( TS_MW, $this->entry->getTimestamp() );
-		if ( $timestamp < '20080129000000' ) {
-			# Suppress $comment from old entries (before 2008-01-29),
-			# not needed and can contain incorrect links
-			return '';
-		}
-		return parent::getComment();
-	}
-
-	public function getPreloadTitles() {
-		$subtype = $this->entry->getSubtype();
-		if ( $subtype === 'create2' || $subtype === 'byemail' ) {
-			//add the user talk to LinkBatch for the userLink
-			return array( Title::makeTitle( NS_USER_TALK, $this->entry->getTarget()->getText() ) );
-		}
-		return array();
-	}
-}
-
-/**
- * This class formats rights log entries.
- * @since 1.21
- */
-class RightsLogFormatter extends LogFormatter {
-	protected function makePageLink( Title $title = null, $parameters = array() ) {
-		global $wgContLang, $wgUserrightsInterwikiDelimiter;
-
-		if ( !$this->plaintext ) {
-			$text = $wgContLang->ucfirst( $title->getText() );
-			$parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
-
-			if ( count( $parts ) === 2 ) {
-				$titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
-					htmlspecialchars( $title->getPrefixedText() ) );
-
-				if ( $titleLink !== false ) {
-					return $titleLink;
-				}
-			}
-		}
-
-		return parent::makePageLink( $title, $parameters );
-	}
-
-	protected function getMessageKey() {
-		$key = parent::getMessageKey();
-		$params = $this->getMessageParameters();
-		if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
-			$key .= '-legacy';
-		}
-		return $key;
-	}
-
-	protected function getMessageParameters() {
-		$params = parent::getMessageParameters();
-
-		// Really old entries
-		if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
-			return $params;
-		}
-
-		$oldGroups = $params[3];
-		$newGroups = $params[4];
-
-		// Less old entries
-		if ( $oldGroups === '' ) {
-			$oldGroups = array();
-		} elseif ( is_string( $oldGroups ) ) {
-			$oldGroups = array_map( 'trim', explode( ',', $oldGroups ) );
-		}
-		if ( $newGroups === '' ) {
-			$newGroups = array();
-		} elseif ( is_string( $newGroups ) ) {
-			$newGroups = array_map( 'trim', explode( ',', $newGroups ) );
-		}
-
-		$userName = $this->entry->getTarget()->getText();
-		if ( !$this->plaintext && count( $oldGroups ) ) {
-			foreach ( $oldGroups as &$group ) {
-				$group = User::getGroupMember( $group, $userName );
-			}
-		}
-		if ( !$this->plaintext && count( $newGroups ) ) {
-			foreach ( $newGroups as &$group ) {
-				$group = User::getGroupMember( $group, $userName );
-			}
-		}
-
-		$lang = $this->context->getLanguage();
-		if ( count( $oldGroups ) ) {
-			$params[3] = $lang->listToText( $oldGroups );
-		} else {
-			$params[3] = $this->msg( 'rightsnone' )->text();
-		}
-		if ( count( $newGroups ) ) {
-			// Array_values is used here because of bug 42211
-			// see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
-			$params[4] = $lang->listToText( array_values( $newGroups ) );
-		} else {
-			$params[4] = $this->msg( 'rightsnone' )->text();
-		}
-
-		return $params;
-	}
-}
diff --git a/includes/logging/LogPage.php b/includes/logging/LogPage.php
index 4191c577..cc473c18 100644
--- a/includes/logging/LogPage.php
+++ b/includes/logging/LogPage.php
@@ -94,7 +94,7 @@ class LogPage {
 		$newId = !is_null( $log_id ) ? $log_id : $dbw->insertId();
 
 		# And update recentchanges
-		if( $this->updateRecentChanges ) {
+		if ( $this->updateRecentChanges ) {
 			$titleObj = SpecialPage::getTitleFor( 'Log', $this->type );
 
 			RecentChange::notifyLog(
@@ -102,9 +102,9 @@ class LogPage {
 				$this->type, $this->action, $this->target, $this->comment,
 				$this->params, $newId, $this->getRcCommentIRC()
 			);
-		} elseif( $this->sendToUDP ) {
+		} elseif ( $this->sendToUDP ) {
 			# Don't send private logs to UDP
-			if( isset( $wgLogRestrictions[$this->type] ) && $wgLogRestrictions[$this->type] != '*' ) {
+			if ( isset( $wgLogRestrictions[$this->type] ) && $wgLogRestrictions[$this->type] != '*' ) {
 				return $newId;
 			}
 
@@ -129,7 +129,7 @@ class LogPage {
 	public function getRcComment() {
 		$rcComment = $this->actionText;
 
-		if( $this->comment != '' ) {
+		if ( $this->comment != '' ) {
 			if ( $rcComment == '' ) {
 				$rcComment = $this->comment;
 			} else {
@@ -149,7 +149,7 @@ class LogPage {
 	public function getRcCommentIRC() {
 		$rcComment = $this->ircActionText;
 
-		if( $this->comment != '' ) {
+		if ( $this->comment != '' ) {
 			if ( $rcComment == '' ) {
 				$rcComment = $this->comment;
 			} else {
@@ -198,7 +198,7 @@ class LogPage {
 	public static function logName( $type ) {
 		global $wgLogNames;
 
-		if( isset( $wgLogNames[$type] ) ) {
+		if ( isset( $wgLogNames[$type] ) ) {
 			return str_replace( '_', ' ', wfMessage( $wgLogNames[$type] )->text() );
 		} else {
 			// Bogus log types? Perhaps an extension was removed.
@@ -247,13 +247,13 @@ class LogPage {
 
 		$key = "$type/$action";
 
-		if( isset( $wgLogActions[$key] ) ) {
-			if( is_null( $title ) ) {
+		if ( isset( $wgLogActions[$key] ) ) {
+			if ( is_null( $title ) ) {
 				$rv = wfMessage( $wgLogActions[$key] )->inLanguage( $langObj )->escaped();
 			} else {
 				$titleLink = self::getTitleLink( $type, $langObjOrNull, $title, $params );
 
-				if( count( $params ) == 0 ) {
+				if ( count( $params ) == 0 ) {
 					$rv = wfMessage( $wgLogActions[$key] )->rawParams( $titleLink )->inLanguage( $langObj )->escaped();
 				} else {
 					$details = '';
@@ -262,7 +262,7 @@ class LogPage {
 					// User suppression
 					if ( preg_match( '/^(block|suppress)\/(block|reblock)$/', $key ) ) {
 						if ( $skin ) {
-							$params[1] = '<span class="blockExpiry" dir="ltr" title="' . htmlspecialchars( $params[1] ). '">' .
+							$params[1] = '<span class="blockExpiry" title="&lrm;' . htmlspecialchars( $params[1] ) . '">' .
 								$wgLang->translateBlockExpiry( $params[1] ) . '</span>';
 						} else {
 							$params[1] = $wgContLang->translateBlockExpiry( $params[1] );
@@ -273,14 +273,14 @@ class LogPage {
 					// Page protections
 					} elseif ( $type == 'protect' && count( $params ) == 3 ) {
 						// Restrictions and expiries
-						if( $skin ) {
+						if ( $skin ) {
 							$details .= $wgLang->getDirMark() . htmlspecialchars( " {$params[1]}" );
 						} else {
 							$details .= " {$params[1]}";
 						}
 
 						// Cascading flag...
-						if( $params[2] ) {
+						if ( $params[2] ) {
 							$details .= ' [' . wfMessage( 'protect-summary-cascade' )->inLanguage( $langObj )->text() . ']';
 						}
 					}
@@ -291,7 +291,7 @@ class LogPage {
 		} else {
 			global $wgLogActionsHandlers;
 
-			if( isset( $wgLogActionsHandlers[$key] ) ) {
+			if ( isset( $wgLogActionsHandlers[$key] ) ) {
 				$args = func_get_args();
 				$rv = call_user_func_array( $wgLogActionsHandlers[$key], $args );
 			} else {
@@ -310,7 +310,7 @@ class LogPage {
 		// you want to link to something OTHER than the title of the log entry.
 		// The real problem, which Erik was trying to fix (and it sort-of works now) is
 		// that the same messages are being treated as both wikitext *and* HTML.
-		if( $filterWikilinks ) {
+		if ( $filterWikilinks ) {
 			$rv = str_replace( '[[', '', $rv );
 			$rv = str_replace( ']]', '', $rv );
 		}
@@ -327,11 +327,11 @@ class LogPage {
 	 * @return String
 	 */
 	protected static function getTitleLink( $type, $lang, $title, &$params ) {
-		if( !$lang ) {
+		if ( !$lang ) {
 			return $title->getPrefixedText();
 		}
 
-		switch( $type ) {
+		switch ( $type ) {
 			case 'move':
 				$titleLink = Linker::link(
 					$title,
@@ -353,7 +353,7 @@ class LogPage {
 				}
 				break;
 			case 'block':
-				if( substr( $title->getText(), 0, 1 ) == '#' ) {
+				if ( substr( $title->getText(), 0, 1 ) == '#' ) {
 					$titleLink = $title->getText();
 				} else {
 					// @todo Store the user identifier in the parameters
@@ -377,11 +377,11 @@ class LogPage {
 				$params[1] = $lang->timeanddate( $params[1] );
 				break;
 			default:
-				if( $title->isSpecialPage() ) {
+				if ( $title->isSpecialPage() ) {
 					list( $name, $par ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
 
 					# Use the language name for log titles, rather than Log/X
-					if( $name == 'Log' ) {
+					if ( $name == 'Log' ) {
 						$logPage = new LogPage( $par );
 						$titleLink = Linker::link( $title, $logPage->getName()->escaped() );
 						$titleLink = wfMessage( 'parentheses' )
@@ -465,13 +465,13 @@ class LogPage {
 	 * @return Boolean
 	 */
 	public function addRelations( $field, $values, $logid ) {
-		if( !strlen( $field ) || empty( $values ) ) {
+		if ( !strlen( $field ) || empty( $values ) ) {
 			return false; // nothing
 		}
 
 		$data = array();
 
-		foreach( $values as $value ) {
+		foreach ( $values as $value ) {
 			$data[] = array(
 				'ls_field' => $field,
 				'ls_value' => $value,
@@ -518,17 +518,17 @@ class LogPage {
 	 * @return String
 	 */
 	public static function formatBlockFlags( $flags, $lang ) {
-		$flags = explode( ',', trim( $flags ) );
+		$flags = trim( $flags );
+		if ( $flags === '' ) {
+			return ''; //nothing to do
+		}
+		$flags = explode( ',', $flags );
 
-		if( count( $flags ) > 0 ) {
-			for( $i = 0; $i < count( $flags ); $i++ ) {
-				$flags[$i] = self::formatBlockFlag( $flags[$i], $lang );
-			}
-			return wfMessage( 'parentheses' )->inLanguage( $lang )
-				->rawParams( $lang->commaList( $flags ) )->escaped();
-		} else {
-			return '';
+		for ( $i = 0; $i < count( $flags ); $i++ ) {
+			$flags[$i] = self::formatBlockFlag( $flags[$i], $lang );
 		}
+		return wfMessage( 'parentheses' )->inLanguage( $lang )
+			->rawParams( $lang->commaList( $flags ) )->escaped();
 	}
 
 	/**
@@ -541,7 +541,7 @@ class LogPage {
 	public static function formatBlockFlag( $flag, $lang ) {
 		static $messages = array();
 
-		if( !isset( $messages[$flag] ) ) {
+		if ( !isset( $messages[$flag] ) ) {
 			$messages[$flag] = htmlspecialchars( $flag ); // Fallback
 
 			// For grepping. The following core messages can be used here:
diff --git a/includes/logging/LogPager.php b/includes/logging/LogPager.php
index 908755ed..09ae3b8c 100644
--- a/includes/logging/LogPager.php
+++ b/includes/logging/LogPager.php
@@ -34,14 +34,14 @@ class LogPager extends ReverseChronologicalPager {
 	/**
 	 * Constructor
 	 *
-	 * @param $list LogEventsList
+	 * @param LogEventsList $list
 	 * @param string $types or Array: log types to show
 	 * @param string $performer the user who made the log entries
 	 * @param string|Title $title the page title the log entries are for
 	 * @param string $pattern do a prefix search rather than an exact title match
 	 * @param array $conds extra conditions for the query
-	 * @param $year Integer: the year to start from
-	 * @param $month Integer: the month to start from
+	 * @param int $year The year to start from
+	 * @param int $month The month to start from
 	 * @param string $tagFilter tag
 	 */
 	public function __construct( $list, $types = array(), $performer = '', $title = '', $pattern = '',
@@ -71,16 +71,17 @@ class LogPager extends ReverseChronologicalPager {
 	public function getFilterParams() {
 		global $wgFilterLogTypes;
 		$filters = array();
-		if( count( $this->types ) ) {
+		if ( count( $this->types ) ) {
 			return $filters;
 		}
-		foreach( $wgFilterLogTypes as $type => $default ) {
+		foreach ( $wgFilterLogTypes as $type => $default ) {
 			// Avoid silly filtering
-			if( $type !== 'patrol' || $this->getUser()->useNPPatrol() ) {
+			if ( $type !== 'patrol' || $this->getUser()->useNPPatrol() ) {
 				$hide = $this->getRequest()->getInt( "hide_{$type}_log", $default );
 				$filters[$type] = $hide;
-				if( $hide )
+				if ( $hide ) {
 					$this->mConds[] = 'log_type != ' . $this->mDb->addQuotes( $type );
+				}
 			}
 		}
 		return $filters;
@@ -98,11 +99,11 @@ class LogPager extends ReverseChronologicalPager {
 
 		$user = $this->getUser();
 		// If $types is not an array, make it an array
-		$types = ($types === '') ? array() : (array)$types;
+		$types = ( $types === '' ) ? array() : (array)$types;
 		// Don't even show header for private logs; don't recognize it...
 		$needReindex = false;
 		foreach ( $types as $type ) {
-			if( isset( $wgLogRestrictions[$type] )
+			if ( isset( $wgLogRestrictions[$type] )
 				&& !$user->isAllowed( $wgLogRestrictions[$type] )
 			) {
 				$needReindex = true;
@@ -119,13 +120,15 @@ class LogPager extends ReverseChronologicalPager {
 		// Also, only show them upon specific request to avoid suprises.
 		$audience = $types ? 'user' : 'public';
 		$hideLogs = LogEventsList::getExcludeClause( $this->mDb, $audience, $user );
-		if( $hideLogs !== false ) {
+		if ( $hideLogs !== false ) {
 			$this->mConds[] = $hideLogs;
 		}
-		if( count( $types ) ) {
+		if ( count( $types ) ) {
 			$this->mConds['log_type'] = $types;
 			// Set typeCGI; used in url param for paging
-			if( count( $types ) == 1 ) $this->typeCGI = $types[0];
+			if ( count( $types ) == 1 ) {
+				$this->typeCGI = $types[0];
+			}
 		}
 	}
 
@@ -136,16 +139,16 @@ class LogPager extends ReverseChronologicalPager {
 	 * @return bool
 	 */
 	private function limitPerformer( $name ) {
-		if( $name == '' ) {
+		if ( $name == '' ) {
 			return false;
 		}
 		$usertitle = Title::makeTitleSafe( NS_USER, $name );
-		if( is_null( $usertitle ) ) {
+		if ( is_null( $usertitle ) ) {
 			return false;
 		}
 		/* Fetch userid at first, if known, provides awesome query plan afterwards */
 		$userid = User::idFromName( $name );
-		if( !$userid ) {
+		if ( !$userid ) {
 			/* It should be nicer to abort query at all,
 			   but for now it won't pass anywhere behind the optimizer */
 			$this->mConds[] = "NULL";
@@ -153,9 +156,9 @@ class LogPager extends ReverseChronologicalPager {
 			$this->mConds['log_user'] = $userid;
 			// Paranoia: avoid brute force searches (bug 17342)
 			$user = $this->getUser();
-			if( !$user->isAllowed( 'deletedhistory' ) ) {
+			if ( !$user->isAllowed( 'deletedhistory' ) ) {
 				$this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::DELETED_USER ) . ' = 0';
-			} elseif( !$user->isAllowed( 'suppressrevision' ) ) {
+			} elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
 				$this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::SUPPRESSED_USER ) .
 					' != ' . LogPage::SUPPRESSED_USER;
 			}
@@ -178,7 +181,7 @@ class LogPager extends ReverseChronologicalPager {
 			$title = $page;
 		} else {
 			$title = Title::newFromText( $page );
-			if( strlen( $page ) == 0 || !$title instanceof Title ) {
+			if ( strlen( $page ) == 0 || !$title instanceof Title ) {
 				return false;
 			}
 		}
@@ -198,7 +201,7 @@ class LogPager extends ReverseChronologicalPager {
 		# use the page_time index.  That should have no more than a few hundred
 		# log entries for even the busiest pages, so it can be safely scanned
 		# in full to satisfy an impossible condition on user or similar.
-		if( $pattern && !$wgMiserMode ) {
+		if ( $pattern && !$wgMiserMode ) {
 			$this->mConds['log_namespace'] = $ns;
 			$this->mConds[] = 'log_title ' . $db->buildLike( $title->getDBkey(), $db->anyString() );
 			$this->pattern = $pattern;
@@ -208,10 +211,10 @@ class LogPager extends ReverseChronologicalPager {
 		}
 		// Paranoia: avoid brute force searches (bug 17342)
 		$user = $this->getUser();
-		if( !$user->isAllowed( 'deletedhistory' ) ) {
-			$this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::DELETED_ACTION) . ' = 0';
-		} elseif( !$user->isAllowed( 'suppressrevision' ) ) {
-			$this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::SUPPRESSED_ACTION) .
+		if ( !$user->isAllowed( 'deletedhistory' ) ) {
+			$this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::DELETED_ACTION ) . ' = 0';
+		} elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+			$this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::SUPPRESSED_ACTION ) .
 				' != ' . LogPage::SUPPRESSED_ACTION;
 		}
 	}
@@ -234,7 +237,7 @@ class LogPager extends ReverseChronologicalPager {
 		# Add log_search table if there are conditions on it.
 		# This filters the results to only include log rows that have
 		# log_search records with the specified ls_field and ls_value values.
-		if( array_key_exists( 'ls_field', $this->mConds ) ) {
+		if ( array_key_exists( 'ls_field', $this->mConds ) ) {
 			$tables[] = 'log_search';
 			$index['log_search'] = 'ls_field_val';
 			$index['logging'] = 'PRIMARY';
@@ -246,28 +249,18 @@ class LogPager extends ReverseChronologicalPager {
 				# no duplicate log rows. Otherwise, we need to remove the duplicates.
 				$options[] = 'DISTINCT';
 			}
-		# Avoid usage of the wrong index by limiting
-		# the choices of available indexes. This mainly
-		# avoids site-breaking filesorts.
-		} elseif( $this->title || $this->pattern || $this->performer ) {
-			$index['logging'] = array( 'page_time', 'user_time' );
-			if( count( $this->types ) == 1 ) {
-				$index['logging'][] = 'log_user_type_time';
-			}
-		} elseif( count( $this->types ) == 1 ) {
-			$index['logging'] = 'type_time';
-		} else {
-			$index['logging'] = 'times';
 		}
-		$options['USE INDEX'] = $index;
+		if ( count( $index ) ) {
+			$options['USE INDEX'] = $index;
+		}
 		# Don't show duplicate rows when using log_search
 		$joins['log_search'] = array( 'INNER JOIN', 'ls_log_id=log_id' );
 
 		$info = array(
-			'tables'     => $tables,
-			'fields'     => $fields,
-			'conds'      => array_merge( $conds, $this->mConds ),
-			'options'    => $options,
+			'tables' => $tables,
+			'fields' => $fields,
+			'conds' => array_merge( $conds, $this->mConds ),
+			'options' => $options,
 			'join_conds' => $joins,
 		);
 		# Add ChangeTags filter query
@@ -295,7 +288,7 @@ class LogPager extends ReverseChronologicalPager {
 	public function getStartBody() {
 		wfProfileIn( __METHOD__ );
 		# Do a link batch query
-		if( $this->getNumRows() > 0 ) {
+		if ( $this->getNumRows() > 0 ) {
 			$lb = new LinkBatch;
 			foreach ( $this->mResult as $row ) {
 				$lb->add( $row->log_namespace, $row->log_title );
diff --git a/includes/logging/MoveLogFormatter.php b/includes/logging/MoveLogFormatter.php
new file mode 100644
index 00000000..0978f976
--- /dev/null
+++ b/includes/logging/MoveLogFormatter.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Formatter for move log entries.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.22
+ */
+
+/**
+ * This class formats move log entries.
+ *
+ * @since 1.19
+ */
+class MoveLogFormatter extends LogFormatter {
+	public function getPreloadTitles() {
+		$params = $this->extractParameters();
+		return array( Title::newFromText( $params[3] ) );
+	}
+
+	protected function getMessageKey() {
+		$key = parent::getMessageKey();
+		$params = $this->getMessageParameters();
+		if ( isset( $params[4] ) && $params[4] === '1' ) {
+			$key .= '-noredirect';
+		}
+		return $key;
+	}
+
+	protected function getMessageParameters() {
+		$params = parent::getMessageParameters();
+		$oldname = $this->makePageLink( $this->entry->getTarget(), array( 'redirect' => 'no' ) );
+		$newname = $this->makePageLink( Title::newFromText( $params[3] ) );
+		$params[2] = Message::rawParam( $oldname );
+		$params[3] = Message::rawParam( $newname );
+		return $params;
+	}
+
+	public function getActionLinks() {
+		if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
+			|| $this->entry->getSubtype() !== 'move'
+			|| !$this->context->getUser()->isAllowed( 'move' ) )
+		{
+			return '';
+		}
+
+		$params = $this->extractParameters();
+		$destTitle = Title::newFromText( $params[3] );
+		if ( !$destTitle ) {
+			return '';
+		}
+
+		$revert = Linker::linkKnown(
+			SpecialPage::getTitleFor( 'Movepage' ),
+			$this->msg( 'revertmove' )->escaped(),
+			array(),
+			array(
+				'wpOldTitle' => $destTitle->getPrefixedDBkey(),
+				'wpNewTitle' => $this->entry->getTarget()->getPrefixedDBkey(),
+				'wpReason' => $this->msg( 'revertmove' )->inContentLanguage()->text(),
+				'wpMovetalk' => 0
+			)
+		);
+		return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+	}
+}
diff --git a/includes/logging/NewUsersLogFormatter.php b/includes/logging/NewUsersLogFormatter.php
new file mode 100644
index 00000000..602728b4
--- /dev/null
+++ b/includes/logging/NewUsersLogFormatter.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Formatter for new user log entries.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.22
+ */
+
+/**
+ * This class formats new user log entries.
+ *
+ * @since 1.19
+ */
+class NewUsersLogFormatter extends LogFormatter {
+	protected function getMessageParameters() {
+		$params = parent::getMessageParameters();
+		$subtype = $this->entry->getSubtype();
+		if ( $subtype === 'create2' || $subtype === 'byemail' ) {
+			if ( isset( $params[3] ) ) {
+				$target = User::newFromId( $params[3] );
+			} else {
+				$target = User::newFromName( $this->entry->getTarget()->getText(), false );
+			}
+			$params[2] = Message::rawParam( $this->makeUserLink( $target ) );
+			$params[3] = $target->getName();
+		}
+		return $params;
+	}
+
+	public function getComment() {
+		$timestamp = wfTimestamp( TS_MW, $this->entry->getTimestamp() );
+		if ( $timestamp < '20080129000000' ) {
+			# Suppress $comment from old entries (before 2008-01-29),
+			# not needed and can contain incorrect links
+			return '';
+		}
+		return parent::getComment();
+	}
+
+	public function getPreloadTitles() {
+		$subtype = $this->entry->getSubtype();
+		if ( $subtype === 'create2' || $subtype === 'byemail' ) {
+			//add the user talk to LinkBatch for the userLink
+			return array( Title::makeTitle( NS_USER_TALK, $this->entry->getTarget()->getText() ) );
+		}
+		return array();
+	}
+}
diff --git a/includes/logging/PatrolLog.php b/includes/logging/PatrolLog.php
index 911fffc0..bb76d5a9 100644
--- a/includes/logging/PatrolLog.php
+++ b/includes/logging/PatrolLog.php
@@ -38,6 +38,13 @@ class PatrolLog {
 	 * @return bool
 	 */
 	public static function record( $rc, $auto = false, User $user = null ) {
+		global $wgLogAutopatrol;
+
+		// do not log autopatrolled edits if setting disables it
+		if ( $auto && !$wgLogAutopatrol ) {
+			return false;
+		}
+
 		if ( !$rc instanceof RecentChange ) {
 			$rc = RecentChange::newFromId( $rc );
 			if ( !is_object( $rc ) ) {
diff --git a/includes/logging/PatrolLogFormatter.php b/includes/logging/PatrolLogFormatter.php
new file mode 100644
index 00000000..507039ba
--- /dev/null
+++ b/includes/logging/PatrolLogFormatter.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Formatter for new user log entries.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.22
+ */
+
+/**
+ * This class formats patrol log entries.
+ *
+ * @since 1.19
+ */
+class PatrolLogFormatter extends LogFormatter {
+	protected function getMessageKey() {
+		$key = parent::getMessageKey();
+		$params = $this->getMessageParameters();
+		if ( isset( $params[5] ) && $params[5] ) {
+			$key .= '-auto';
+		}
+		return $key;
+	}
+
+	protected function getMessageParameters() {
+		$params = parent::getMessageParameters();
+
+		$target = $this->entry->getTarget();
+		$oldid = $params[3];
+		$revision = $this->context->getLanguage()->formatNum( $oldid, true );
+
+		if ( $this->plaintext ) {
+			$revlink = $revision;
+		} elseif ( $target->exists() ) {
+			$query = array(
+				'oldid' => $oldid,
+				'diff' => 'prev'
+			);
+			$revlink = Linker::link( $target, htmlspecialchars( $revision ), array(), $query );
+		} else {
+			$revlink = htmlspecialchars( $revision );
+		}
+
+		$params[3] = Message::rawParam( $revlink );
+		return $params;
+	}
+}
diff --git a/includes/logging/RightsLogFormatter.php b/includes/logging/RightsLogFormatter.php
new file mode 100644
index 00000000..d3daf6ee
--- /dev/null
+++ b/includes/logging/RightsLogFormatter.php
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Formatter for user rights log entries.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Alexandre Emsenhuber
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.22
+ */
+
+/**
+ * This class formats rights log entries.
+ *
+ * @since 1.21
+ */
+class RightsLogFormatter extends LogFormatter {
+	protected function makePageLink( Title $title = null, $parameters = array() ) {
+		global $wgContLang, $wgUserrightsInterwikiDelimiter;
+
+		if ( !$this->plaintext ) {
+			$text = $wgContLang->ucfirst( $title->getText() );
+			$parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
+
+			if ( count( $parts ) === 2 ) {
+				$titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
+					htmlspecialchars( $title->getPrefixedText() ) );
+
+				if ( $titleLink !== false ) {
+					return $titleLink;
+				}
+			}
+		}
+
+		return parent::makePageLink( $title, $parameters );
+	}
+
+	protected function getMessageKey() {
+		$key = parent::getMessageKey();
+		$params = $this->getMessageParameters();
+		if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
+			$key .= '-legacy';
+		}
+		return $key;
+	}
+
+	protected function getMessageParameters() {
+		$params = parent::getMessageParameters();
+
+		// Really old entries
+		if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
+			return $params;
+		}
+
+		$oldGroups = $params[3];
+		$newGroups = $params[4];
+
+		// Less old entries
+		if ( $oldGroups === '' ) {
+			$oldGroups = array();
+		} elseif ( is_string( $oldGroups ) ) {
+			$oldGroups = array_map( 'trim', explode( ',', $oldGroups ) );
+		}
+		if ( $newGroups === '' ) {
+			$newGroups = array();
+		} elseif ( is_string( $newGroups ) ) {
+			$newGroups = array_map( 'trim', explode( ',', $newGroups ) );
+		}
+
+		$userName = $this->entry->getTarget()->getText();
+		if ( !$this->plaintext && count( $oldGroups ) ) {
+			foreach ( $oldGroups as &$group ) {
+				$group = User::getGroupMember( $group, $userName );
+			}
+		}
+		if ( !$this->plaintext && count( $newGroups ) ) {
+			foreach ( $newGroups as &$group ) {
+				$group = User::getGroupMember( $group, $userName );
+			}
+		}
+
+		$lang = $this->context->getLanguage();
+		if ( count( $oldGroups ) ) {
+			$params[3] = $lang->listToText( $oldGroups );
+		} else {
+			$params[3] = $this->msg( 'rightsnone' )->text();
+		}
+		if ( count( $newGroups ) ) {
+			// Array_values is used here because of bug 42211
+			// see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
+			$params[4] = $lang->listToText( array_values( $newGroups ) );
+		} else {
+			$params[4] = $this->msg( 'rightsnone' )->text();
+		}
+
+		return $params;
+	}
+}
diff --git a/includes/media/BMP.php b/includes/media/BMP.php
index 46d1b95b..99b7741a 100644
--- a/includes/media/BMP.php
+++ b/includes/media/BMP.php
@@ -58,15 +58,15 @@ class BmpHandler extends BitmapHandler {
 	 */
 	function getImageSize( $image, $filename ) {
 		$f = fopen( $filename, 'rb' );
-		if( !$f ) {
+		if ( !$f ) {
 			return false;
 		}
 		$header = fread( $f, 54 );
 		fclose( $f );
 
 		// Extract binary form of width and height from the header
-		$w = substr( $header, 18, 4);
-		$h = substr( $header, 22, 4);
+		$w = substr( $header, 18, 4 );
+		$h = substr( $header, 22, 4 );
 
 		// Convert the unsigned long 32 bits (little endian):
 		try {
diff --git a/includes/media/Bitmap.php b/includes/media/Bitmap.php
index e2dc68b2..e2444a11 100644
--- a/includes/media/Bitmap.php
+++ b/includes/media/Bitmap.php
@@ -99,17 +99,6 @@ class BitmapHandler extends ImageHandler {
 		return array( $width, $height );
 	}
 
-	/**
-	 * Function that returns the number of pixels to be thumbnailed.
-	 * Intended for animated GIFs to multiply by the number of frames.
-	 *
-	 * @param File $image
-	 * @return int
-	 */
-	function getImageArea( $image ) {
-		return $image->getWidth() * $image->getHeight();
-	}
-
 	/**
 	 * @param $image File
 	 * @param  $dstPath
@@ -131,7 +120,7 @@ class BitmapHandler extends ImageHandler {
 			# The size of the image on the page
 			'clientWidth' => $params['width'],
 			'clientHeight' => $params['height'],
-			# Comment as will be added to the EXIF of the thumbnail
+			# Comment as will be added to the Exif of the thumbnail
 			'comment' => isset( $params['descriptionUrl'] ) ?
 				"File source: {$params['descriptionUrl']}" : '',
 			# Properties of the original image
@@ -357,12 +346,12 @@ class BitmapHandler extends ImageHandler {
 			" -depth 8 $sharpen " .
 			" -rotate -$rotation " .
 			" {$animation_post} " .
-			wfEscapeShellArg( $this->escapeMagickOutput( $params['dstPath'] ) ) . " 2>&1";
+			wfEscapeShellArg( $this->escapeMagickOutput( $params['dstPath'] ) );
 
 		wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" );
 		wfProfileIn( 'convert' );
 		$retval = 0;
-		$err = wfShellExec( $cmd, $retval, $env );
+		$err = wfShellExecWithStderr( $cmd, $retval, $env );
 		wfProfileOut( 'convert' );
 
 		if ( $retval !== 0 ) {
@@ -398,7 +387,7 @@ class BitmapHandler extends ImageHandler {
 					$im->sharpenImage( $radius, $sigma );
 				}
 				$im->setCompressionQuality( 80 );
-			} elseif( $params['mimeType'] == 'image/png' ) {
+			} elseif ( $params['mimeType'] == 'image/png' ) {
 				$im->setCompressionQuality( 95 );
 			} elseif ( $params['mimeType'] == 'image/gif' ) {
 				if ( $this->getImageArea( $image ) > $wgMaxAnimatedGifArea ) {
@@ -472,7 +461,7 @@ class BitmapHandler extends ImageHandler {
 		wfDebug( __METHOD__ . ": Running custom convert command $cmd\n" );
 		wfProfileIn( 'convert' );
 		$retval = 0;
-		$err = wfShellExec( $cmd, $retval );
+		$err = wfShellExecWithStderr( $cmd, $retval );
 		wfProfileOut( 'convert' );
 
 		if ( $retval !== 0 ) {
@@ -712,24 +701,6 @@ class BitmapHandler extends ImageHandler {
 		imagejpeg( $dst_image, $thumbPath, 95 );
 	}
 
-	/**
-	 * On supporting image formats, try to read out the low-level orientation
-	 * of the file and return the angle that the file needs to be rotated to
-	 * be viewed.
-	 *
-	 * This information is only useful when manipulating the original file;
-	 * the width and height we normally work with is logical, and will match
-	 * any produced output views.
-	 *
-	 * The base BitmapHandler doesn't understand any metadata formats, so this
-	 * is left up to child classes to implement.
-	 *
-	 * @param $file File
-	 * @return int 0, 90, 180 or 270
-	 */
-	public function getRotation( $file ) {
-		return 0;
-	}
 
 	/**
 	 * Returns whether the current scaler supports rotation (im and gd do)
@@ -765,20 +736,20 @@ class BitmapHandler extends ImageHandler {
 	public function rotate( $file, $params ) {
 		global $wgImageMagickConvertCommand;
 
-		$rotation = ( $params[ 'rotation' ] + $this->getRotation( $file ) ) % 360;
+		$rotation = ( $params['rotation'] + $this->getRotation( $file ) ) % 360;
 		$scene = false;
 
 		$scaler = self::getScalerType( null, false );
 		switch ( $scaler ) {
 			case 'im':
 				$cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " .
-					wfEscapeShellArg( $this->escapeMagickInput( $params[ 'srcPath' ], $scene ) ) .
+					wfEscapeShellArg( $this->escapeMagickInput( $params['srcPath'], $scene ) ) .
 					" -rotate -$rotation " .
-					wfEscapeShellArg( $this->escapeMagickOutput( $params[ 'dstPath' ] ) ) . " 2>&1";
+					wfEscapeShellArg( $this->escapeMagickOutput( $params['dstPath'] ) );
 				wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" );
 				wfProfileIn( 'convert' );
 				$retval = 0;
-				$err = wfShellExec( $cmd, $retval, $env );
+				$err = wfShellExecWithStderr( $cmd, $retval, $env );
 				wfProfileOut( 'convert' );
 				if ( $retval !== 0 ) {
 					$this->logErrorForExternalProcess( $retval, $err, $cmd );
diff --git a/includes/media/BitmapMetadataHandler.php b/includes/media/BitmapMetadataHandler.php
index 345e7869..7c39c814 100644
--- a/includes/media/BitmapMetadataHandler.php
+++ b/includes/media/BitmapMetadataHandler.php
@@ -54,7 +54,7 @@ class BitmapMetadataHandler {
 	 *
 	 * @param string $app13 String containing app13 block from jpeg file
 	 */
-	private function doApp13 ( $app13 ) {
+	private function doApp13( $app13 ) {
 		try {
 			$this->iptcType = JpegMetadataExtractor::doPSIR( $app13 );
 		} catch ( MWException $e ) {
@@ -79,7 +79,7 @@ class BitmapMetadataHandler {
 	 * @param $filename string
 	 * @param $byteOrder string
 	 */
-	function getExif ( $filename, $byteOrder ) {
+	function getExif( $filename, $byteOrder ) {
 		global $wgShowEXIF;
 		if ( file_exists( $filename ) && $wgShowEXIF ) {
 			$exif = new Exif( $filename, $byteOrder );
@@ -95,7 +95,7 @@ class BitmapMetadataHandler {
 	 * @param array $metaArray array of metadata values
 	 * @param string $type type. defaults to other. if two things have the same type they're merged
 	 */
-	function addMetadata ( $metaArray, $type = 'other' ) {
+	function addMetadata( $metaArray, $type = 'other' ) {
 		if ( isset( $this->metadata[$type] ) ) {
 			/* merge with old data */
 			$metaArray = $metaArray + $this->metadata[$type];
@@ -113,7 +113,7 @@ class BitmapMetadataHandler {
 	 *
 	 * @return Array metadata array
 	 */
-	function getMetadataArray () {
+	function getMetadataArray() {
 		// this seems a bit ugly... This is all so its merged in right order
 		// based on the MWG recomendation.
 		$temp = Array();
@@ -147,7 +147,7 @@ class BitmapMetadataHandler {
 	 * @return array metadata result array.
 	 * @throws MWException on invalid file.
 	 */
-	static function Jpeg ( $filename ) {
+	static function Jpeg( $filename ) {
 		$showXMP = function_exists( 'xml_parser_create_ns' );
 		$meta = new self();
 
@@ -156,7 +156,7 @@ class BitmapMetadataHandler {
 			$meta->addMetadata( Array( 'JPEGFileComment' => $seg['COM'] ), 'native' );
 		}
 		if ( isset( $seg['PSIR'] ) && count( $seg['PSIR'] ) > 0 ) {
-			foreach( $seg['PSIR'] as $curPSIRValue ) {
+			foreach ( $seg['PSIR'] as $curPSIRValue ) {
 				$meta->doApp13( $curPSIRValue );
 			}
 		}
@@ -189,7 +189,7 @@ class BitmapMetadataHandler {
 	 * @param string $filename full path to file
 	 * @return Array Array for storage in img_metadata.
 	 */
-	public static function PNG ( $filename ) {
+	public static function PNG( $filename ) {
 		$showXMP = function_exists( 'xml_parser_create_ns' );
 
 		$meta = new self();
@@ -218,7 +218,7 @@ class BitmapMetadataHandler {
 	 * @param string $filename full path to file
 	 * @return Array metadata array
 	 */
-	public static function GIF ( $filename ) {
+	public static function GIF( $filename ) {
 
 		$meta = new self();
 		$baseArray = GIFMetadataExtractor::getMetadata( $filename );
@@ -259,7 +259,7 @@ class BitmapMetadataHandler {
 	 * @throws MWException
 	 * @return Array The metadata.
 	 */
-	public static function Tiff ( $filename ) {
+	public static function Tiff( $filename ) {
 		if ( file_exists( $filename ) ) {
 			$byteOrder = self::getTiffByteOrder( $filename );
 			if ( !$byteOrder ) {
@@ -286,11 +286,13 @@ class BitmapMetadataHandler {
 	 */
 	static function getTiffByteOrder( $filename ) {
 		$fh = fopen( $filename, 'rb' );
-		if ( !$fh ) return false;
+		if ( !$fh ) {
+			return false;
+		}
 		$head = fread( $fh, 2 );
 		fclose( $fh );
 
-		switch( $head ) {
+		switch ( $head ) {
 			case 'II':
 				return 'LE'; // II for intel.
 			case 'MM':
diff --git a/includes/media/DjVu.php b/includes/media/DjVu.php
index 0a39a2cf..b9e89d9d 100644
--- a/includes/media/DjVu.php
+++ b/includes/media/DjVu.php
@@ -185,7 +185,7 @@ class DjVuHandler extends ImageHandler {
 		}
 		$cmd .= ' > ' . wfEscapeShellArg( $dstPath ) . ') 2>&1';
 		wfProfileIn( 'ddjvu' );
-		wfDebug( __METHOD__.": $cmd\n" );
+		wfDebug( __METHOD__ . ": $cmd\n" );
 		$retval = '';
 		$err = wfShellExec( $cmd, $retval );
 		wfProfileOut( 'ddjvu' );
@@ -246,24 +246,23 @@ class DjVuHandler extends ImageHandler {
 			$image->dejaMetaTree = false;
 			$image->djvuTextTree = false;
 			$tree = new SimpleXMLElement( $metadata );
-			if( $tree->getName() == 'mw-djvu' ) {
-				foreach( $tree->children() as $b ) {
-					if( $b->getName() == 'DjVuTxt' ) {
+			if ( $tree->getName() == 'mw-djvu' ) {
+				foreach ( $tree->children() as $b ) {
+					if ( $b->getName() == 'DjVuTxt' ) {
 						$image->djvuTextTree = $b;
-					}
-					elseif ( $b->getName() == 'DjVuXML' ) {
+					} elseif ( $b->getName() == 'DjVuXML' ) {
 						$image->dejaMetaTree = $b;
 					}
 				}
 			} else {
 				$image->dejaMetaTree = $tree;
 			}
-		} catch( Exception $e ) {
+		} catch ( Exception $e ) {
 			wfDebug( "Bogus multipage XML metadata on '{$image->getName()}'\n" );
 		}
 		wfRestoreWarnings();
 		wfProfileOut( __METHOD__ );
-		if( $gettext ) {
+		if ( $gettext ) {
 			return $image->djvuTextTree;
 		} else {
 			return $image->dejaMetaTree;
@@ -294,7 +293,7 @@ class DjVuHandler extends ImageHandler {
 	}
 
 	function isMetadataValid( $image, $metadata ) {
-		return !empty( $metadata ) && $metadata != serialize(array());
+		return !empty( $metadata ) && $metadata != serialize( array() );
 	}
 
 	function pageCount( $image ) {
@@ -311,7 +310,7 @@ class DjVuHandler extends ImageHandler {
 			return false;
 		}
 
-		$o = $tree->BODY[0]->OBJECT[$page-1];
+		$o = $tree->BODY[0]->OBJECT[$page - 1];
 		if ( $o ) {
 			return array(
 				'width' => intval( $o['width'] ),
@@ -328,7 +327,7 @@ class DjVuHandler extends ImageHandler {
 			return false;
 		}
 
-		$o = $tree->BODY[0]->PAGE[$page-1];
+		$o = $tree->BODY[0]->PAGE[$page - 1];
 		if ( $o ) {
 			$txt = $o['value'];
 			return $txt;
diff --git a/includes/media/DjVuImage.php b/includes/media/DjVuImage.php
index 46989668..54efe7a8 100644
--- a/includes/media/DjVuImage.php
+++ b/includes/media/DjVuImage.php
@@ -64,7 +64,7 @@ class DjVuImage {
 	public function getImageSize() {
 		$data = $this->getInfo();
 
-		if( $data !== false ) {
+		if ( $data !== false ) {
 			$width = $data['width'];
 			$height = $data['height'];
 
@@ -93,20 +93,20 @@ class DjVuImage {
 		$start = ftell( $file );
 		$secondary = fread( $file, 4 );
 		echo str_repeat( ' ', $indent * 4 ) . "($secondary)\n";
-		while( ftell( $file ) - $start < $length ) {
+		while ( ftell( $file ) - $start < $length ) {
 			$chunkHeader = fread( $file, 8 );
-			if( $chunkHeader == '' ) {
+			if ( $chunkHeader == '' ) {
 				break;
 			}
 			// @todo FIXME: Would be good to replace this extract() call with something that explicitly initializes local variables.
 			extract( unpack( 'a4chunk/NchunkLength', $chunkHeader ) );
 			echo str_repeat( ' ', $indent * 4 ) . "$chunk $chunkLength\n";
 
-			if( $chunk == 'FORM' ) {
+			if ( $chunk == 'FORM' ) {
 				$this->dumpForm( $file, $chunkLength, $indent + 1 );
 			} else {
 				fseek( $file, $chunkLength, SEEK_CUR );
-				if( $chunkLength & 1 == 1 ) {
+				if ( $chunkLength & 1 == 1 ) {
 					// Padding byte between chunks
 					fseek( $file, 1, SEEK_CUR );
 				}
@@ -118,7 +118,7 @@ class DjVuImage {
 		wfSuppressWarnings();
 		$file = fopen( $this->mFilename, 'rb' );
 		wfRestoreWarnings();
-		if( $file === false ) {
+		if ( $file === false ) {
 			wfDebug( __METHOD__ . ": missing or failed file read\n" );
 			return false;
 		}
@@ -126,21 +126,21 @@ class DjVuImage {
 		$header = fread( $file, 16 );
 		$info = false;
 
-		if( strlen( $header ) < 16 ) {
+		if ( strlen( $header ) < 16 ) {
 			wfDebug( __METHOD__ . ": too short file header\n" );
 		} else {
 			// @todo FIXME: Would be good to replace this extract() call with something that explicitly initializes local variables.
 			extract( unpack( 'a4magic/a4form/NformLength/a4subtype', $header ) );
 
-			if( $magic != 'AT&T' ) {
+			if ( $magic != 'AT&T' ) {
 				wfDebug( __METHOD__ . ": not a DjVu file\n" );
-			} elseif( $subtype == 'DJVU' ) {
+			} elseif ( $subtype == 'DJVU' ) {
 				// Single-page document
 				$info = $this->getPageInfo( $file, $formLength );
-			} elseif( $subtype == 'DJVM' ) {
+			} elseif ( $subtype == 'DJVM' ) {
 				// Multi-page document
 				$info = $this->getMultiPageInfo( $file, $formLength );
-			} else  {
+			} else {
 				wfDebug( __METHOD__ . ": unrecognized DJVU file type '$formType'\n" );
 			}
 		}
@@ -150,7 +150,7 @@ class DjVuImage {
 
 	private function readChunk( $file ) {
 		$header = fread( $file, 8 );
-		if( strlen( $header ) < 8 ) {
+		if ( strlen( $header ) < 8 ) {
 			return array( false, 0 );
 		} else {
 			// @todo FIXME: Would be good to replace this extract() call with something that explicitly initializes local variables.
@@ -162,7 +162,7 @@ class DjVuImage {
 	private function skipChunk( $file, $chunkLength ) {
 		fseek( $file, $chunkLength, SEEK_CUR );
 
-		if( $chunkLength & 0x01 == 1 && !feof( $file ) ) {
+		if ( $chunkLength & 0x01 == 1 && !feof( $file ) ) {
 			// padding byte
 			fseek( $file, 1, SEEK_CUR );
 		}
@@ -174,13 +174,13 @@ class DjVuImage {
 		$start = ftell( $file );
 		do {
 			list( $chunk, $length ) = $this->readChunk( $file );
-			if( !$chunk ) {
+			if ( !$chunk ) {
 				break;
 			}
 
-			if( $chunk == 'FORM' ) {
+			if ( $chunk == 'FORM' ) {
 				$subtype = fread( $file, 4 );
-				if( $subtype == 'DJVU' ) {
+				if ( $subtype == 'DJVU' ) {
 					wfDebug( __METHOD__ . ": found first subpage\n" );
 					return $this->getPageInfo( $file, $length );
 				}
@@ -189,7 +189,7 @@ class DjVuImage {
 				wfDebug( __METHOD__ . ": skipping '$chunk' chunk\n" );
 				$this->skipChunk( $file, $length );
 			}
-		} while( $length != 0 && !feof( $file ) && ftell( $file ) - $start < $formLength );
+		} while ( $length != 0 && !feof( $file ) && ftell( $file ) - $start < $formLength );
 
 		wfDebug( __METHOD__ . ": multi-page DJVU file contained no pages\n" );
 		return false;
@@ -197,17 +197,17 @@ class DjVuImage {
 
 	private function getPageInfo( $file, $formLength ) {
 		list( $chunk, $length ) = $this->readChunk( $file );
-		if( $chunk != 'INFO' ) {
+		if ( $chunk != 'INFO' ) {
 			wfDebug( __METHOD__ . ": expected INFO chunk, got '$chunk'\n" );
 			return false;
 		}
 
-		if( $length < 9 ) {
+		if ( $length < 9 ) {
 			wfDebug( __METHOD__ . ": INFO should be 9 or 10 bytes, found $length\n" );
 			return false;
 		}
 		$data = fread( $file, $length );
-		if( strlen( $data ) < $length ) {
+		if ( strlen( $data ) < $length ) {
 			wfDebug( __METHOD__ . ": INFO chunk cut off\n" );
 			return false;
 		}
@@ -263,7 +263,7 @@ class DjVuImage {
 			$retval = '';
 			$txt = wfShellExec( $cmd, $retval, array(), array( 'memory' => self::DJVUTXT_MEMORY_LIMIT ) );
 			wfProfileOut( 'djvutxt' );
-			if( $retval == 0) {
+			if ( $retval == 0 ) {
 				# Strip some control characters
 				$txt = preg_replace( "/[\013\035\037]/", "", $txt );
 				$reg = <<<EOR
@@ -280,7 +280,7 @@ EOR;
 				$txt = preg_replace_callback( $reg, array( $this, 'pageTextCallback' ), $txt );
 				$txt = "<DjVuTxt>\n<HEAD></HEAD>\n<BODY>\n" . $txt . "</BODY>\n</DjVuTxt>\n";
 				$xml = preg_replace( "/<DjVuXML>/", "<mw-djvu><DjVuXML>", $xml, 1 );
-				$xml = $xml . $txt. '</mw-djvu>';
+				$xml = $xml . $txt . '</mw-djvu>';
 			}
 		}
 		wfProfileOut( __METHOD__ );
diff --git a/includes/media/Exif.php b/includes/media/Exif.php
index 17671808..9a2794a5 100644
--- a/includes/media/Exif.php
+++ b/includes/media/Exif.php
@@ -36,6 +36,7 @@ class Exif {
 	const SHORT = 3; //!< A 16-bit (2-byte) unsigned integer.
 	const LONG = 4; //!< A 32-bit (4-byte) unsigned integer.
 	const RATIONAL = 5; //!< Two LONGs. The first LONG is the numerator and the second LONG expresses the denominator
+	const SHORT_OR_LONG = 6; //!< A 16-bit (2-byte) or 32-bit (4-byte) unsigned integer.
 	const UNDEFINED = 7; //!< An 8-bit byte that can take any value depending on the field definition
 	const SLONG = 9; //!< A 32-bit (4-byte) signed integer (2's complement notation),
 	const SRATIONAL = 10; //!< Two SLONGs. The first SLONG is the numerator and the second SLONG is the denominator.
@@ -113,7 +114,7 @@ class Exif {
 	 */
 	function __construct( $file, $byteOrder = '' ) {
 		/**
-		 * Page numbers here refer to pages in the EXIF 2.2 standard
+		 * Page numbers here refer to pages in the Exif 2.2 standard
 		 *
 		 * Note, Exif::UNDEFINED is treated as a string, not as an array of bytes
 		 * so don't put a count parameter for any UNDEFINED values.
@@ -124,8 +125,8 @@ class Exif {
 			# TIFF Rev. 6.0 Attribute Information (p22)
 			'IFD0' => array(
 				# Tags relating to image structure
-				'ImageWidth' => Exif::SHORT.','.Exif::LONG,		# Image width
-				'ImageLength' => Exif::SHORT.','.Exif::LONG,		# Image height
+				'ImageWidth' => Exif::SHORT_OR_LONG,		# Image width
+				'ImageLength' => Exif::SHORT_OR_LONG,		# Image height
 				'BitsPerSample' => array( Exif::SHORT, 3 ),		# Number of bits per component
 				# "When a primary image is JPEG compressed, this designation is not"
 				# "necessary and is omitted." (p23)
@@ -134,25 +135,25 @@ class Exif {
 				'Orientation' => Exif::SHORT,				# Orientation of image #p24
 				'SamplesPerPixel' => Exif::SHORT,			# Number of components
 				'PlanarConfiguration' => Exif::SHORT,			# Image data arrangement #p24
-				'YCbCrSubSampling' => array( Exif::SHORT, 2),		# Subsampling ratio of Y to C #p24
+				'YCbCrSubSampling' => array( Exif::SHORT, 2 ),		# Subsampling ratio of Y to C #p24
 				'YCbCrPositioning' => Exif::SHORT,			# Y and C positioning #p24-25
 				'XResolution' => Exif::RATIONAL,			# Image resolution in width direction
 				'YResolution' => Exif::RATIONAL,			# Image resolution in height direction
 				'ResolutionUnit' => Exif::SHORT,			# Unit of X and Y resolution #(p26)
 
 				# Tags relating to recording offset
-				'StripOffsets' => Exif::SHORT.','.Exif::LONG,			# Image data location
-				'RowsPerStrip' => Exif::SHORT.','.Exif::LONG,			# Number of rows per strip
-				'StripByteCounts' => Exif::SHORT.','.Exif::LONG,		# Bytes per compressed strip
-				'JPEGInterchangeFormat' => Exif::SHORT.','.Exif::LONG,		# Offset to JPEG SOI
-				'JPEGInterchangeFormatLength' => Exif::SHORT.','.Exif::LONG,	# Bytes of JPEG data
+				'StripOffsets' => Exif::SHORT_OR_LONG,			# Image data location
+				'RowsPerStrip' => Exif::SHORT_OR_LONG,			# Number of rows per strip
+				'StripByteCounts' => Exif::SHORT_OR_LONG,		# Bytes per compressed strip
+				'JPEGInterchangeFormat' => Exif::SHORT_OR_LONG,		# Offset to JPEG SOI
+				'JPEGInterchangeFormatLength' => Exif::SHORT_OR_LONG,	# Bytes of JPEG data
 
 				# Tags relating to image data characteristics
 				'TransferFunction' => Exif::IGNORE,			# Transfer function
-				'WhitePoint' => array( Exif::RATIONAL, 2),		# White point chromaticity
-				'PrimaryChromaticities' => array( Exif::RATIONAL, 6),	# Chromaticities of primarities
-				'YCbCrCoefficients' => array( Exif::RATIONAL, 3),	# Color space transformation matrix coefficients #p27
-				'ReferenceBlackWhite' => array( Exif::RATIONAL, 6),	# Pair of black and white reference values
+				'WhitePoint' => array( Exif::RATIONAL, 2 ),		# White point chromaticity
+				'PrimaryChromaticities' => array( Exif::RATIONAL, 6 ),	# Chromaticities of primarities
+				'YCbCrCoefficients' => array( Exif::RATIONAL, 3 ),	# Color space transformation matrix coefficients #p27
+				'ReferenceBlackWhite' => array( Exif::RATIONAL, 6 ),	# Pair of black and white reference values
 
 				# Other tags
 				'DateTime' => Exif::ASCII,				# File change date and time
@@ -167,8 +168,8 @@ class Exif {
 			# Exif IFD Attribute Information (p30-31)
 			'EXIF' => array(
 				# TODO: NOTE: Nonexistence of this field is taken to mean nonconformance
-				# to the EXIF 2.1 AND 2.2 standards
-				'ExifVersion' =>  Exif::UNDEFINED,			# Exif version
+				# to the Exif 2.1 AND 2.2 standards
+				'ExifVersion' => Exif::UNDEFINED,			# Exif version
 				'FlashPixVersion' => Exif::UNDEFINED,			# Supported Flashpix version #p32
 
 				# Tags relating to Image Data Characteristics
@@ -177,8 +178,8 @@ class Exif {
 				# Tags relating to image configuration
 				'ComponentsConfiguration' => Exif::UNDEFINED,			# Meaning of each component #p33
 				'CompressedBitsPerPixel' => Exif::RATIONAL,			# Image compression mode
-				'PixelYDimension' => Exif::SHORT.','.Exif::LONG,		# Valid image width
-				'PixelXDimension' => Exif::SHORT.','.Exif::LONG,		# Valid image height
+				'PixelYDimension' => Exif::SHORT_OR_LONG,		# Valid image width
+				'PixelXDimension' => Exif::SHORT_OR_LONG,		# Valid image height
 
 				# Tags relating to related user information
 				'MakerNote' => Exif::IGNORE,				# Manufacturer notes
@@ -218,7 +219,7 @@ class Exif {
 				'FocalPlaneXResolution' => Exif::RATIONAL,		# Focal plane X resolution
 				'FocalPlaneYResolution' => Exif::RATIONAL,		# Focal plane Y resolution
 				'FocalPlaneResolutionUnit' => Exif::SHORT,		# Focal plane resolution unit #p46
-				'SubjectLocation' => array( Exif::SHORT, 2),		# Subject location
+				'SubjectLocation' => array( Exif::SHORT, 2 ),		# Subject location
 				'ExposureIndex' => Exif::RATIONAL,			# Exposure index
 				'SensingMethod' => Exif::SHORT,				# Sensing method #p46
 				'FileSource' => Exif::UNDEFINED,			# File source #p47
@@ -250,12 +251,12 @@ class Exif {
 				'GPSLatitudeRef' => Exif::ASCII,			# North or South Latitude #p52-53
 				'GPSLatitude' => array( Exif::RATIONAL, 3 ),		# Latitude
 				'GPSLongitudeRef' => Exif::ASCII,			# East or West Longitude #p53
-				'GPSLongitude' => array( Exif::RATIONAL, 3),		# Longitude
+				'GPSLongitude' => array( Exif::RATIONAL, 3 ),		# Longitude
 				'GPSAltitudeRef' => Exif::UNDEFINED,
 				# Altitude reference. Note, the exif standard says this should be an EXIF::Byte,
 				# but php seems to disagree.
 				'GPSAltitude' => Exif::RATIONAL,			# Altitude
-				'GPSTimeStamp' => array( Exif::RATIONAL, 3),		# GPS time (atomic clock)
+				'GPSTimeStamp' => array( Exif::RATIONAL, 3 ),		# GPS time (atomic clock)
 				'GPSSatellites' => Exif::ASCII,				# Satellites used for measurement
 				'GPSStatus' => Exif::ASCII,				# Receiver status #p54
 				'GPSMeasureMode' => Exif::ASCII,			# Measurement mode #p54-55
@@ -296,7 +297,7 @@ class Exif {
 		}
 
 		$this->debugFile( $this->basename, __FUNCTION__, true );
-		if( function_exists( 'exif_read_data' ) ) {
+		if ( function_exists( 'exif_read_data' ) ) {
 			wfSuppressWarnings();
 			$data = exif_read_data( $this->file, 0, true );
 			wfRestoreWarnings();
@@ -393,7 +394,7 @@ class Exif {
 		//ComponentsConfiguration should really be an array instead of a string...
 		//This turns a string of binary numbers into an array of numbers.
 
-		if ( isset ( $this->mFilteredExifData['ComponentsConfiguration'] ) ) {
+		if ( isset( $this->mFilteredExifData['ComponentsConfiguration'] ) ) {
 			$val = $this->mFilteredExifData['ComponentsConfiguration'];
 			$ccVals = array();
 			for ( $i = 0; $i < strlen( $val ); $i++ ) {
@@ -410,7 +411,7 @@ class Exif {
 		//Also change exif tag name from GPSVersion (what php exif thinks it is)
 		//to GPSVersionID (what the exif standard thinks it is).
 
-		if ( isset ( $this->mFilteredExifData['GPSVersion'] ) ) {
+		if ( isset( $this->mFilteredExifData['GPSVersion'] ) ) {
 			$val = $this->mFilteredExifData['GPSVersion'];
 			$newVal = '';
 			for ( $i = 0; $i < strlen( $val ); $i++ ) {
@@ -439,7 +440,7 @@ class Exif {
 	 * This has not been tested on any shift-JIS strings.
 	 * @param string $prop prop name.
 	 */
-	private function charCodeString ( $prop ) {
+	private function charCodeString( $prop ) {
 		if ( isset( $this->mFilteredExifData[$prop] ) ) {
 
 			if ( strlen( $this->mFilteredExifData[$prop] ) <= 8 ) {
@@ -500,7 +501,7 @@ class Exif {
 	 * the type of UNDEFINED field
 	 * @param string $prop name of property
 	 */
-	private function exifPropToOrd ( $prop ) {
+	private function exifPropToOrd( $prop ) {
 		if ( isset( $this->mFilteredExifData[$prop] ) ) {
 			$this->mFilteredExifData[$prop] = ord( $this->mFilteredExifData[$prop] );
 		}
@@ -510,7 +511,7 @@ class Exif {
 	 * for example 10 degress 20`40`` S -> -10.34444
 	 * @param string $prop a gps coordinate exif tag name (like GPSLongitude)
 	 */
-	private function exifGPStoNumber ( $prop ) {
+	private function exifGPStoNumber( $prop ) {
 		$loc =& $this->mFilteredExifData[$prop];
 		$dir =& $this->mFilteredExifData[$prop . 'Ref'];
 		$res = false;
@@ -737,26 +738,27 @@ class Exif {
 		$debug = "tag is '$tag'";
 		$etype = $this->mExifTags[$section][$tag];
 		$ecount = 1;
-		if( is_array( $etype ) ) {
+		if ( is_array( $etype ) ) {
 			list( $etype, $ecount ) = $etype;
-			if ( $recursive )
+			if ( $recursive ) {
 				$ecount = 1; // checking individual elements
+			}
 		}
 		$count = count( $val );
-		if( $ecount != $count ) {
+		if ( $ecount != $count ) {
 			$this->debug( $val, __FUNCTION__, "Expected $ecount elements for $tag but got $count" );
 			return false;
 		}
-		if( $count > 1 ) {
-			foreach( $val as $v ) {
-				if( !$this->validate( $section, $tag, $v, true ) ) {
+		if ( $count > 1 ) {
+			foreach ( $val as $v ) {
+				if ( !$this->validate( $section, $tag, $v, true ) ) {
 					return false;
 				}
 			}
 			return true;
 		}
 		// Does not work if not typecast
-		switch( (string)$etype ) {
+		switch ( (string)$etype ) {
 			case (string)Exif::BYTE:
 				$this->debug( $val, __FUNCTION__, $debug );
 				return $this->isByte( $val );
@@ -772,6 +774,9 @@ class Exif {
 			case (string)Exif::RATIONAL:
 				$this->debug( $val, __FUNCTION__, $debug );
 				return $this->isRational( $val );
+			case (string)Exif::SHORT_OR_LONG:
+				$this->debug( $val, __FUNCTION__, $debug );
+				return $this->isShort( $val ) || $this->isLong( $val );
 			case (string)Exif::UNDEFINED:
 				$this->debug( $val, __FUNCTION__, $debug );
 				return $this->isUndefined( $val );
@@ -781,9 +786,6 @@ class Exif {
 			case (string)Exif::SRATIONAL:
 				$this->debug( $val, __FUNCTION__, $debug );
 				return $this->isSrational( $val );
-			case (string)Exif::SHORT.','.Exif::LONG:
-				$this->debug( $val, __FUNCTION__, $debug );
-				return $this->isShort( $val ) || $this->isLong( $val );
 			case (string)Exif::IGNORE:
 				$this->debug( $val, __FUNCTION__, $debug );
 				return false;
@@ -808,7 +810,7 @@ class Exif {
 		}
 		$type = gettype( $in );
 		$class = ucfirst( __CLASS__ );
-		if ( $type === 'array' ) {
+		if ( is_array( $in ) ) {
 			$in = print_r( $in, true );
 		}
 
diff --git a/includes/media/ExifBitmap.php b/includes/media/ExifBitmap.php
index 1671ab25..d8d0bede 100644
--- a/includes/media/ExifBitmap.php
+++ b/includes/media/ExifBitmap.php
@@ -51,11 +51,11 @@ class ExifBitmapHandler extends BitmapHandler {
 
 		// Treat Software as a special case because in can contain
 		// an array of (SoftwareName, Version).
-		if (isset( $metadata['Software'] )
+		if ( isset( $metadata['Software'] )
 			&& is_array( $metadata['Software'] )
-			&& is_array( $metadata['Software'][0])
+			&& is_array( $metadata['Software'][0] )
 			&& isset( $metadata['Software'][0][0] )
-			&& isset( $metadata['Software'][0][1])
+			&& isset( $metadata['Software'][0][1] )
 		) {
 			$metadata['Software'] = $metadata['Software'][0][0] . ' (Version '
 				. $metadata['Software'][0][1] . ')';
@@ -84,7 +84,7 @@ class ExifBitmapHandler extends BitmapHandler {
 			return self::METADATA_GOOD;
 		}
 		if ( $metadata === self::OLD_BROKEN_FILE ) {
-			# Old special value indicating that there is no EXIF data in the file.
+			# Old special value indicating that there is no Exif data in the file.
 			# or that there was an error well extracting the metadata.
 			wfDebug( __METHOD__ . ": back-compat version\n" );
 			return self::METADATA_COMPATIBLE;
diff --git a/includes/media/FormatMetadata.php b/includes/media/FormatMetadata.php
index 1a7d7723..1c5136f5 100644
--- a/includes/media/FormatMetadata.php
+++ b/includes/media/FormatMetadata.php
@@ -79,7 +79,7 @@ class FormatMetadata {
 			}
 
 			//This is done differently as the tag is an array.
-			if ( $tag == 'GPSTimeStamp' && count( $vals ) === 3) {
+			if ( $tag == 'GPSTimeStamp' && count( $vals ) === 3 ) {
 				//hour min sec array
 
 				$h = explode( '/', $vals[0] );
@@ -127,9 +127,9 @@ class FormatMetadata {
 
 			foreach ( $vals as &$val ) {
 
-				switch( $tag ) {
+				switch ( $tag ) {
 				case 'Compression':
-					switch( $val ) {
+					switch ( $val ) {
 					case 1: case 2: case 3: case 4:
 					case 5: case 6: case 7: case 8:
 					case 32773: case 32946: case 34712:
@@ -142,7 +142,7 @@ class FormatMetadata {
 					break;
 
 				case 'PhotometricInterpretation':
-					switch( $val ) {
+					switch ( $val ) {
 					case 2: case 6:
 						$val = self::msg( $tag, $val );
 						break;
@@ -153,7 +153,7 @@ class FormatMetadata {
 					break;
 
 				case 'Orientation':
-					switch( $val ) {
+					switch ( $val ) {
 					case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
 						$val = self::msg( $tag, $val );
 						break;
@@ -164,7 +164,7 @@ class FormatMetadata {
 					break;
 
 				case 'PlanarConfiguration':
-					switch( $val ) {
+					switch ( $val ) {
 					case 1: case 2:
 						$val = self::msg( $tag, $val );
 						break;
@@ -189,7 +189,7 @@ class FormatMetadata {
 
 				case 'XResolution':
 				case 'YResolution':
-					switch( $resolutionunit ) {
+					switch ( $resolutionunit ) {
 						case 2:
 							$val = self::msg( 'XYResolution', 'i', self::formatNum( $val ) );
 							break;
@@ -208,7 +208,7 @@ class FormatMetadata {
 					break;
 
 				case 'ColorSpace':
-					switch( $val ) {
+					switch ( $val ) {
 					case 1: case 65535:
 						$val = self::msg( $tag, $val );
 						break;
@@ -219,7 +219,7 @@ class FormatMetadata {
 					break;
 
 				case 'ComponentsConfiguration':
-					switch( $val ) {
+					switch ( $val ) {
 					case 0: case 1: case 2: case 3: case 4: case 5: case 6:
 						$val = self::msg( $tag, $val );
 						break;
@@ -267,7 +267,7 @@ class FormatMetadata {
 					break;
 
 				case 'ExposureProgram':
-					switch( $val ) {
+					switch ( $val ) {
 					case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
 						$val = self::msg( $tag, $val );
 						break;
@@ -282,7 +282,7 @@ class FormatMetadata {
 					break;
 
 				case 'MeteringMode':
-					switch( $val ) {
+					switch ( $val ) {
 					case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 255:
 						$val = self::msg( $tag, $val );
 						break;
@@ -293,7 +293,7 @@ class FormatMetadata {
 					break;
 
 				case 'LightSource':
-					switch( $val ) {
+					switch ( $val ) {
 					case 0: case 1: case 2: case 3: case 4: case 9: case 10: case 11:
 					case 12: case 13: case 14: case 15: case 17: case 18: case 19: case 20:
 					case 21: case 22: case 23: case 24: case 255:
@@ -307,11 +307,11 @@ class FormatMetadata {
 
 				case 'Flash':
 					$flashDecode = array(
-						'fired'    => $val & bindec( '00000001' ),
-						'return'   => ( $val & bindec( '00000110' ) ) >> 1,
-						'mode'     => ( $val & bindec( '00011000' ) ) >> 3,
+						'fired' => $val & bindec( '00000001' ),
+						'return' => ( $val & bindec( '00000110' ) ) >> 1,
+						'mode' => ( $val & bindec( '00011000' ) ) >> 3,
 						'function' => ( $val & bindec( '00100000' ) ) >> 5,
-						'redeye'   => ( $val & bindec( '01000000' ) ) >> 6,
+						'redeye' => ( $val & bindec( '01000000' ) ) >> 6,
 //						'reserved' => ($val & bindec( '10000000' )) >> 7,
 					);
 					$flashMsgs = array();
@@ -328,7 +328,7 @@ class FormatMetadata {
 					break;
 
 				case 'FocalPlaneResolutionUnit':
-					switch( $val ) {
+					switch ( $val ) {
 					case 2:
 						$val = self::msg( $tag, $val );
 						break;
@@ -339,7 +339,7 @@ class FormatMetadata {
 					break;
 
 				case 'SensingMethod':
-					switch( $val ) {
+					switch ( $val ) {
 					case 1: case 2: case 3: case 4: case 5: case 7: case 8:
 						$val = self::msg( $tag, $val );
 						break;
@@ -350,7 +350,7 @@ class FormatMetadata {
 					break;
 
 				case 'FileSource':
-					switch( $val ) {
+					switch ( $val ) {
 					case 3:
 						$val = self::msg( $tag, $val );
 						break;
@@ -361,7 +361,7 @@ class FormatMetadata {
 					break;
 
 				case 'SceneType':
-					switch( $val ) {
+					switch ( $val ) {
 					case 1:
 						$val = self::msg( $tag, $val );
 						break;
@@ -372,7 +372,7 @@ class FormatMetadata {
 					break;
 
 				case 'CustomRendered':
-					switch( $val ) {
+					switch ( $val ) {
 					case 0: case 1:
 						$val = self::msg( $tag, $val );
 						break;
@@ -383,7 +383,7 @@ class FormatMetadata {
 					break;
 
 				case 'ExposureMode':
-					switch( $val ) {
+					switch ( $val ) {
 					case 0: case 1: case 2:
 						$val = self::msg( $tag, $val );
 						break;
@@ -394,7 +394,7 @@ class FormatMetadata {
 					break;
 
 				case 'WhiteBalance':
-					switch( $val ) {
+					switch ( $val ) {
 					case 0: case 1:
 						$val = self::msg( $tag, $val );
 						break;
@@ -405,7 +405,7 @@ class FormatMetadata {
 					break;
 
 				case 'SceneCaptureType':
-					switch( $val ) {
+					switch ( $val ) {
 					case 0: case 1: case 2: case 3:
 						$val = self::msg( $tag, $val );
 						break;
@@ -416,7 +416,7 @@ class FormatMetadata {
 					break;
 
 				case 'GainControl':
-					switch( $val ) {
+					switch ( $val ) {
 					case 0: case 1: case 2: case 3: case 4:
 						$val = self::msg( $tag, $val );
 						break;
@@ -427,7 +427,7 @@ class FormatMetadata {
 					break;
 
 				case 'Contrast':
-					switch( $val ) {
+					switch ( $val ) {
 					case 0: case 1: case 2:
 						$val = self::msg( $tag, $val );
 						break;
@@ -438,7 +438,7 @@ class FormatMetadata {
 					break;
 
 				case 'Saturation':
-					switch( $val ) {
+					switch ( $val ) {
 					case 0: case 1: case 2:
 						$val = self::msg( $tag, $val );
 						break;
@@ -449,7 +449,7 @@ class FormatMetadata {
 					break;
 
 				case 'Sharpness':
-					switch( $val ) {
+					switch ( $val ) {
 					case 0: case 1: case 2:
 						$val = self::msg( $tag, $val );
 						break;
@@ -460,7 +460,7 @@ class FormatMetadata {
 					break;
 
 				case 'SubjectDistanceRange':
-					switch( $val ) {
+					switch ( $val ) {
 					case 0: case 1: case 2: case 3:
 						$val = self::msg( $tag, $val );
 						break;
@@ -473,7 +473,7 @@ class FormatMetadata {
 				//The GPS...Ref values are kept for compatibility, probably won't be reached.
 				case 'GPSLatitudeRef':
 				case 'GPSDestLatitudeRef':
-					switch( $val ) {
+					switch ( $val ) {
 					case 'N': case 'S':
 						$val = self::msg( 'GPSLatitude', $val );
 						break;
@@ -485,7 +485,7 @@ class FormatMetadata {
 
 				case 'GPSLongitudeRef':
 				case 'GPSDestLongitudeRef':
-					switch( $val ) {
+					switch ( $val ) {
 					case 'E': case 'W':
 						$val = self::msg( 'GPSLongitude', $val );
 						break;
@@ -504,7 +504,7 @@ class FormatMetadata {
 					break;
 
 				case 'GPSStatus':
-					switch( $val ) {
+					switch ( $val ) {
 					case 'A': case 'V':
 						$val = self::msg( $tag, $val );
 						break;
@@ -515,7 +515,7 @@ class FormatMetadata {
 					break;
 
 				case 'GPSMeasureMode':
-					switch( $val ) {
+					switch ( $val ) {
 					case 2: case 3:
 						$val = self::msg( $tag, $val );
 						break;
@@ -528,7 +528,7 @@ class FormatMetadata {
 				case 'GPSTrackRef':
 				case 'GPSImgDirectionRef':
 				case 'GPSDestBearingRef':
-					switch( $val ) {
+					switch ( $val ) {
 					case 'T': case 'M':
 						$val = self::msg( 'GPSDirection', $val );
 						break;
@@ -548,7 +548,7 @@ class FormatMetadata {
 					break;
 
 				case 'GPSSpeedRef':
-					switch( $val ) {
+					switch ( $val ) {
 					case 'K': case 'M': case 'N':
 						$val = self::msg( 'GPSSpeed', $val );
 						break;
@@ -559,7 +559,7 @@ class FormatMetadata {
 					break;
 
 				case 'GPSDestDistanceRef':
-					switch( $val ) {
+					switch ( $val ) {
 					case 'K': case 'M': case 'N':
 						$val = self::msg( 'GPSDestDistance', $val );
 						break;
@@ -646,7 +646,7 @@ class FormatMetadata {
 					break;
 
 				case 'iimCategory':
-					switch( strtolower( $val ) ) {
+					switch ( strtolower( $val ) ) {
 						// See pg 29 of IPTC photo
 						// metadata standard.
 						case 'ace': case 'clj':
@@ -682,7 +682,7 @@ class FormatMetadata {
 						$urgency = 'high';
 					} elseif ( $val == 5 ) {
 						$urgency = 'normal';
-					} elseif ( $val <= 8 && $val > 5) {
+					} elseif ( $val <= 8 && $val > 5 ) {
 						$urgency = 'low';
 					}
 
@@ -791,7 +791,7 @@ class FormatMetadata {
 					}
 					break;
 				case 'Copyrighted':
-					switch( $val ) {
+					switch ( $val ) {
 					case 'True': case 'False':
 						$val = self::msg( $tag, $val );
 						break;
@@ -854,7 +854,7 @@ class FormatMetadata {
 			return $vals[0];
 		}
 		elseif ( count( $vals ) === 0 ) {
-			wfDebug( __METHOD__ . ' metadata array with 0 elements!' );
+			wfDebug( __METHOD__ . " metadata array with 0 elements!\n" );
 			return ""; // paranoia. This should never happen
 		}
 		/* @todo FIXME: This should hide some of the list entries if there are
@@ -863,7 +863,7 @@ class FormatMetadata {
 		 */
 		else {
 			global $wgContLang;
-			switch( $type ) {
+			switch ( $type ) {
 			case 'lang':
 				// Display default, followed by ContLang,
 				// followed by the rest in no particular
@@ -948,7 +948,7 @@ class FormatMetadata {
 	 * this is treated as wikitext not html).
 	 */
 	private static function langItem( $value, $lang, $default = false, $noHtml = false ) {
-		if ( $lang === false && $default === false) {
+		if ( $lang === false && $default === false ) {
 			throw new MWException( '$lang and $default cannot both '
 				. 'be false.' );
 		}
@@ -1015,8 +1015,9 @@ class FormatMetadata {
 	static function msg( $tag, $val, $arg = null, $arg2 = null ) {
 		global $wgContLang;
 
-		if ( $val === '' )
+		if ( $val === '' ) {
 			$val = 'value';
+		}
 		return wfMessage( $wgContLang->lc( "exif-$tag-$val" ), $arg, $arg2 )->text();
 	}
 
@@ -1031,9 +1032,9 @@ class FormatMetadata {
 	static function formatNum( $num, $round = false ) {
 		global $wgLang;
 		$m = array();
-		if( is_array( $num ) ) {
+		if ( is_array( $num ) ) {
 			$out = array();
-			foreach( $num as $number ) {
+			foreach ( $num as $number ) {
 				$out[] = self::formatNum( $number );
 			}
 			return $wgLang->commaList( $out );
@@ -1071,7 +1072,7 @@ class FormatMetadata {
 			$numerator = intval( $m[1] );
 			$denominator = intval( $m[2] );
 			$gcd = self::gcd( abs( $numerator ), $denominator );
-			if( $gcd != 0 ) {
+			if ( $gcd != 0 ) {
 				// 0 shouldn't happen! ;)
 				return self::formatNum( $numerator / $gcd ) . '/' . self::formatNum( $denominator / $gcd );
 			}
@@ -1096,7 +1097,7 @@ class FormatMetadata {
 			else
 				return gcd( $b, $a % $b );
 		*/
-		while( $b != 0 ) {
+		while ( $b != 0 ) {
 			$remainder = $a % $b;
 
 			// tail recursion...
@@ -1124,7 +1125,7 @@ class FormatMetadata {
 			return $val;
 		}
 		$cat = '';
-		switch( substr( $val, 0, 2 ) ) {
+		switch ( substr( $val, 0, 2 ) ) {
 			case '01':
 				$cat = 'ace';
 				break;
@@ -1236,7 +1237,7 @@ class FormatMetadata {
 	 * @return String of html-ish looking wikitext
 	 */
 	public static function collapseContactInfo( $vals ) {
-		if( !( isset( $vals['CiAdrExtadr'] )
+		if ( !( isset( $vals['CiAdrExtadr'] )
 			|| isset( $vals['CiAdrCity'] )
 			|| isset( $vals['CiAdrCtry'] )
 			|| isset( $vals['CiEmailWork'] )
@@ -1254,7 +1255,7 @@ class FormatMetadata {
 			// because people often insert >, etc into
 			// the metadata which should not be interpreted
 			// but we still want to auto-link urls.
-			foreach( $vals as &$val ) {
+			foreach ( $vals as &$val ) {
 				$val = htmlspecialchars( $val );
 			}
 			return self::flattenArray( $vals );
diff --git a/includes/media/GIF.php b/includes/media/GIF.php
index 2e532feb..608fb257 100644
--- a/includes/media/GIF.php
+++ b/includes/media/GIF.php
@@ -33,7 +33,7 @@ class GIFHandler extends BitmapHandler {
 	function getMetadata( $image, $filename ) {
 		try {
 			$parsedGIFMetadata = BitmapMetadataHandler::GIF( $filename );
-		} catch( Exception $e ) {
+		} catch ( Exception $e ) {
 			// Broken file?
 			wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
 			return self::BROKEN_FILE;
@@ -86,7 +86,7 @@ class GIFHandler extends BitmapHandler {
 		$ser = $image->getMetadata();
 		if ( $ser ) {
 			$metadata = unserialize( $ser );
-			if( $metadata['frameCount'] > 1 ) {
+			if ( $metadata['frameCount'] > 1 ) {
 				return true;
 			}
 		}
@@ -119,13 +119,13 @@ class GIFHandler extends BitmapHandler {
 		wfRestoreWarnings();
 
 		if ( !$data || !is_array( $data ) ) {
-			wfDebug( __METHOD__ . ' invalid GIF metadata' );
+			wfDebug( __METHOD__ . " invalid GIF metadata\n" );
 			return self::METADATA_BAD;
 		}
 
 		if ( !isset( $data['metadata']['_MW_GIF_VERSION'] )
 			|| $data['metadata']['_MW_GIF_VERSION'] != GIFMetadataExtractor::VERSION ) {
-			wfDebug( __METHOD__ . ' old but compatible GIF metadata' );
+			wfDebug( __METHOD__ . " old but compatible GIF metadata\n" );
 			return self::METADATA_COMPATIBLE;
 		}
 		return self::METADATA_GOOD;
diff --git a/includes/media/GIFMetadataExtractor.php b/includes/media/GIFMetadataExtractor.php
index 6a4e753d..887afa3f 100644
--- a/includes/media/GIFMetadataExtractor.php
+++ b/includes/media/GIFMetadataExtractor.php
@@ -90,7 +90,7 @@ class GIFMetadataExtractor {
 		// Skip over the GCT
 		self::readGCT( $fh, $bpp );
 
-		while( !feof( $fh ) ) {
+		while ( !feof( $fh ) ) {
 			$buf = fread( $fh, 1 );
 
 			if ( $buf == self::$gif_frame_sep ) {
@@ -110,7 +110,9 @@ class GIFMetadataExtractor {
 				self::skipBlock( $fh );
 			} elseif ( $buf == self::$gif_extension_sep ) {
 				$buf = fread( $fh, 1 );
-				if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
+				if ( strlen( $buf ) < 1 ) {
+					throw new Exception( "Ran out of input" );
+				}
 				$extension_code = unpack( 'C', $buf );
 				$extension_code = $extension_code[1];
 
@@ -121,7 +123,9 @@ class GIFMetadataExtractor {
 					fread( $fh, 1 ); // Transparency, disposal method, user input
 
 					$buf = fread( $fh, 2 ); // Delay, in hundredths of seconds.
-					if ( strlen( $buf ) < 2 ) throw new Exception( "Ran out of input" );
+					if ( strlen( $buf ) < 2 ) {
+						throw new Exception( "Ran out of input" );
+					}
 					$delay = unpack( 'v', $buf );
 					$delay = $delay[1];
 					$duration += $delay * 0.01;
@@ -129,7 +133,9 @@ class GIFMetadataExtractor {
 					fread( $fh, 1 ); // Transparent colour index
 
 					$term = fread( $fh, 1 ); // Should be a terminator
-					if ( strlen( $term ) < 1 ) throw new Exception( "Ran out of input" );
+					if ( strlen( $term ) < 1 ) {
+						throw new Exception( "Ran out of input" );
+					}
 					$term = unpack( 'C', $term );
 					$term = $term[1];
 					if ( $term != 0 ) {
@@ -157,7 +163,7 @@ class GIFMetadataExtractor {
 
 					$commentCount = count( $comment );
 					if ( $commentCount === 0
-						|| $comment[$commentCount-1] !== $data )
+						|| $comment[$commentCount - 1] !== $data )
 					{
 						// Some applications repeat the same comment on each
 						// frame of an animated GIF image, so if this comment
@@ -168,14 +174,16 @@ class GIFMetadataExtractor {
 					// Application extension (Netscape info about the animated gif)
 					// or XMP (or theoretically any other type of extension block)
 					$blockLength = fread( $fh, 1 );
-					if ( strlen( $blockLength ) < 1 ) throw new Exception( "Ran out of input" );
+					if ( strlen( $blockLength ) < 1 ) {
+						throw new Exception( "Ran out of input" );
+					}
 					$blockLength = unpack( 'C', $blockLength );
 					$blockLength = $blockLength[1];
 					$data = fread( $fh, $blockLength );
 
 					if ( $blockLength != 11 ) {
-						wfDebug( __METHOD__ . ' GIF application block with wrong length' );
-						fseek( $fh, -($blockLength + 1), SEEK_CUR );
+						wfDebug( __METHOD__ . " GIF application block with wrong length\n" );
+						fseek( $fh, -( $blockLength + 1 ), SEEK_CUR );
 						self::skipBlock( $fh );
 						continue;
 					}
@@ -190,7 +198,9 @@ class GIFMetadataExtractor {
 
 						// Unsigned little-endian integer, loop count or zero for "forever"
 						$loopData = fread( $fh, 2 );
-						if ( strlen( $loopData ) < 2 ) throw new Exception( "Ran out of input" );
+						if ( strlen( $loopData ) < 2 ) {
+							throw new Exception( "Ran out of input" );
+						}
 						$loopData = unpack( 'v', $loopData );
 						$loopCount = $loopData[1];
 
@@ -218,7 +228,7 @@ class GIFMetadataExtractor {
 
 					} else {
 						// unrecognized extension block
-						fseek( $fh, -($blockLength + 1), SEEK_CUR );
+						fseek( $fh, -( $blockLength + 1 ), SEEK_CUR );
 						self::skipBlock( $fh );
 						continue;
 					}
@@ -228,7 +238,9 @@ class GIFMetadataExtractor {
 			} elseif ( $buf == self::$gif_term ) {
 				break;
 			} else {
-				if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
+				if ( strlen( $buf ) < 1 ) {
+					throw new Exception( "Ran out of input" );
+				}
 				$byte = unpack( 'C', $buf );
 				$byte = $byte[1];
 				throw new Exception( "At position: " . ftell( $fh ) . ", Unknown byte " . $byte );
@@ -251,7 +263,7 @@ class GIFMetadataExtractor {
 	 */
 	static function readGCT( $fh, $bpp ) {
 		if ( $bpp > 0 ) {
-			for( $i = 1; $i <= pow( 2, $bpp ); ++$i ) {
+			for ( $i = 1; $i <= pow( 2, $bpp ); ++$i ) {
 				fread( $fh, 3 );
 			}
 		}
@@ -263,7 +275,9 @@ class GIFMetadataExtractor {
 	 * @return int
 	 */
 	static function decodeBPP( $data ) {
-		if ( strlen( $data ) < 1 ) throw new Exception( "Ran out of input" );
+		if ( strlen( $data ) < 1 ) {
+			throw new Exception( "Ran out of input" );
+		}
 		$buf = unpack( 'C', $data );
 		$buf = $buf[1];
 		$bpp = ( $buf & 7 ) + 1;
@@ -281,7 +295,9 @@ class GIFMetadataExtractor {
 	static function skipBlock( $fh ) {
 		while ( !feof( $fh ) ) {
 			$buf = fread( $fh, 1 );
-			if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
+			if ( strlen( $buf ) < 1 ) {
+				throw new Exception( "Ran out of input" );
+			}
 			$block_len = unpack( 'C', $buf );
 			$block_len = $block_len[1];
 			if ( $block_len == 0 ) {
@@ -310,7 +326,7 @@ class GIFMetadataExtractor {
 		$subLength = fread( $fh, 1 );
 		$blocks = 0;
 
-		while( $subLength !== "\0" ) {
+		while ( $subLength !== "\0" ) {
 			$blocks++;
 			if ( $blocks > self::MAX_SUBBLOCKS ) {
 				throw new Exception( "MAX_SUBBLOCKS exceeded (over $blocks sub-blocks)" );
diff --git a/includes/media/IPTC.php b/includes/media/IPTC.php
index 4191cde0..544dd211 100644
--- a/includes/media/IPTC.php
+++ b/includes/media/IPTC.php
@@ -63,7 +63,7 @@ class IPTC {
 				wfDebugLog( 'iptc', "IPTC tag $tag had only whitespace as its value." );
 				continue;
 			}
-			switch( $tag ) {
+			switch ( $tag ) {
 				case '2#120': /*IPTC caption. mapped with exif ImageDescription*/
 					$data['ImageDescription'] = self::convIPTC( $val, $c );
 					break;
@@ -396,7 +396,7 @@ class IPTC {
 			return null;
 		}
 
-		$tz = ( intval( substr( $time, 7, 2 ) ) *60*60 )
+		$tz = ( intval( substr( $time, 7, 2 ) ) * 60 * 60 )
 			+ ( intval( substr( $time, 9, 2 ) ) * 60 );
 
 		if ( substr( $time, 6, 1 ) === '-' ) {
@@ -423,7 +423,7 @@ class IPTC {
 	 *
 	 * @return string|array
 	 */
-	private static function convIPTC ( $data, $charset ) {
+	private static function convIPTC( $data, $charset ) {
 		if ( is_array( $data ) ) {
 			foreach ( $data as &$val ) {
 				$val = self::convIPTCHelper( $val, $charset );
@@ -441,7 +441,7 @@ class IPTC {
 	 *
 	 * @return string
 	 */
-	private static function convIPTCHelper ( $data, $charset ) {
+	private static function convIPTCHelper( $data, $charset ) {
 		if ( $charset ) {
 			wfSuppressWarnings();
 			$data = iconv( $charset, "UTF-8//IGNORE", $data );
diff --git a/includes/media/ImageHandler.php b/includes/media/ImageHandler.php
index 419afeef..e079003b 100644
--- a/includes/media/ImageHandler.php
+++ b/includes/media/ImageHandler.php
@@ -58,7 +58,7 @@ abstract class ImageHandler extends MediaHandler {
 		} elseif ( isset( $params['width'] ) ) {
 			$width = $params['width'];
 		} else {
-			throw new MWException( 'No width specified to '.__METHOD__ );
+			throw new MWException( 'No width specified to ' . __METHOD__ );
 		}
 		# Removed for ProofreadPage
 		#$width = intval( $width );
@@ -92,7 +92,7 @@ abstract class ImageHandler extends MediaHandler {
 
 		if ( !isset( $params['page'] ) ) {
 			$params['page'] = 1;
-		} else  {
+		} else {
 			if ( $params['page'] > $image->pageCount() ) {
 				$params['page'] = $image->pageCount();
 			}
@@ -160,7 +160,7 @@ abstract class ImageHandler extends MediaHandler {
 		$width = intval( $width );
 
 		# Sanity check $width
-		if( $width <= 0) {
+		if ( $width <= 0 ) {
 			wfDebug( __METHOD__ . ": Invalid destination width: $width\n" );
 			return false;
 		}
@@ -187,9 +187,9 @@ abstract class ImageHandler extends MediaHandler {
 		if ( !$this->normaliseParams( $image, $params ) ) {
 			return false;
 		}
-		$url = $script . '&' . wfArrayToCgi( $this->getScriptParams( $params ) );
+		$url = wfAppendQuery( $script, $this->getScriptParams( $params ) );
 
-		if( $image->mustRender() || $params['width'] < $image->getWidth() ) {
+		if ( $image->mustRender() || $params['width'] < $image->getWidth() ) {
 			return new ThumbnailImage( $image, $url, false, $params );
 		}
 	}
@@ -200,6 +200,19 @@ abstract class ImageHandler extends MediaHandler {
 		wfRestoreWarnings();
 		return $gis;
 	}
+	/**
+	 * Function that returns the number of pixels to be thumbnailed.
+	 * Intended for animated GIFs to multiply by the number of frames.
+	 *
+	 * If the file doesn't support a notion of "area" return 0.
+	 *
+	 * @param File $image
+	 * @return int
+	 */
+	function getImageArea( $image ) {
+		return $image->getWidth() * $image->getHeight();
+	}
+
 
 	/**
 	 * @param $file File
diff --git a/includes/media/Jpeg.php b/includes/media/Jpeg.php
index 8b5d6513..fa763668 100644
--- a/includes/media/Jpeg.php
+++ b/includes/media/Jpeg.php
@@ -32,7 +32,7 @@
  */
 class JpegHandler extends ExifBitmapHandler {
 
-	function getMetadata ( $image, $filename ) {
+	function getMetadata( $image, $filename ) {
 		try {
 			$meta = BitmapMetadataHandler::Jpeg( $filename );
 			if ( !is_array( $meta ) ) {
@@ -69,18 +69,18 @@ class JpegHandler extends ExifBitmapHandler {
 	public function rotate( $file, $params ) {
 		global $wgJpegTran;
 
-		$rotation = ( $params[ 'rotation' ] + $this->getRotation( $file ) ) % 360;
+		$rotation = ( $params['rotation'] + $this->getRotation( $file ) ) % 360;
 
-		if( $wgJpegTran && is_file( $wgJpegTran ) ){
+		if ( $wgJpegTran && is_file( $wgJpegTran ) ) {
 			$cmd = wfEscapeShellArg( $wgJpegTran ) .
 				" -rotate " . wfEscapeShellArg( $rotation ) .
-				" -outfile " . wfEscapeShellArg( $params[ 'dstPath' ] ) .
-				" " . wfEscapeShellArg( $params[ 'srcPath' ] ) .  " 2>&1";
-				wfDebug( __METHOD__ . ": running jpgtran: $cmd\n" );
-				wfProfileIn( 'jpegtran' );
-				$retval = 0;
-				$err = wfShellExec( $cmd, $retval, $env );
-				wfProfileOut( 'jpegtran' );
+				" -outfile " . wfEscapeShellArg( $params['dstPath'] ) .
+				" " . wfEscapeShellArg( $params['srcPath'] );
+			wfDebug( __METHOD__ . ": running jpgtran: $cmd\n" );
+			wfProfileIn( 'jpegtran' );
+			$retval = 0;
+			$err = wfShellExecWithStderr( $cmd, $retval, $env );
+			wfProfileOut( 'jpegtran' );
 			if ( $retval !== 0 ) {
 				$this->logErrorForExternalProcess( $retval, $err, $cmd );
 				return new MediaTransformError( 'thumbnail_error', 0, 0, $err );
diff --git a/includes/media/JpegMetadataExtractor.php b/includes/media/JpegMetadataExtractor.php
index 6ff07ed2..c7030eba 100644
--- a/includes/media/JpegMetadataExtractor.php
+++ b/includes/media/JpegMetadataExtractor.php
@@ -47,7 +47,7 @@ class JpegMetadataExtractor {
 	 * @return Array of interesting segments.
 	 * @throws MWException if given invalid file.
 	 */
-	static function segmentSplitter ( $filename ) {
+	static function segmentSplitter( $filename ) {
 		$showXMP = function_exists( 'xml_parser_create_ns' );
 
 		$segmentCount = 0;
@@ -87,7 +87,7 @@ class JpegMetadataExtractor {
 			}
 
 			$buffer = fread( $fh, 1 );
-			while( $buffer === "\xFF" && !feof( $fh ) ) {
+			while ( $buffer === "\xFF" && !feof( $fh ) ) {
 				// Skip through any 0xFF padding bytes.
 				$buffer = fread( $fh, 1 );
 			}
@@ -111,7 +111,7 @@ class JpegMetadataExtractor {
 				if ( $com === $oldCom ) {
 					$segments["COM"][] = $oldCom;
 				} else {
-					wfDebug( __METHOD__ . ' Ignoring JPEG comment as is garbage.' );
+					wfDebug( __METHOD__ . " Ignoring JPEG comment as is garbage.\n" );
 				}
 
 			} elseif ( $buffer === "\xE1" ) {
@@ -140,7 +140,7 @@ class JpegMetadataExtractor {
 					} elseif ( $byteOrderMarker === 'II' ) {
 						$segments['byteOrder'] = 'LE';
 					} else {
-						wfDebug( __METHOD__ . ' Invalid byte ordering?!' );
+						wfDebug( __METHOD__ . " Invalid byte ordering?!\n" );
 					}
 				}
 			} elseif ( $buffer === "\xED" ) {
@@ -155,7 +155,9 @@ class JpegMetadataExtractor {
 			} else {
 				// segment we don't care about, so skip
 				$size = wfUnpack( "nint", fread( $fh, 2 ), 2 );
-				if ( $size['int'] <= 2 ) throw new MWException( "invalid marker size in jpeg" );
+				if ( $size['int'] <= 2 ) {
+					throw new MWException( "invalid marker size in jpeg" );
+				}
 				fseek( $fh, $size['int'] - 2, SEEK_CUR );
 			}
 
@@ -195,7 +197,7 @@ class JpegMetadataExtractor {
 	 * @throws MWException (It gets caught next level up though)
 	 * @return String if the iptc hash is good or not.
 	 */
-	public static function doPSIR ( $app13 ) {
+	public static function doPSIR( $app13 ) {
 		if ( !$app13 ) {
 			throw new MWException( "No App13 segment given" );
 		}
@@ -243,7 +245,9 @@ class JpegMetadataExtractor {
 			// PHP can take issue with very large unsigned ints and make them negative.
 			// Which should never ever happen, as this has to be inside a segment
 			// which is limited to a 16 bit number.
-			if ( $lenData['len'] < 0 ) throw new MWException( "Too big PSIR (" . $lenData['len'] . ')' );
+			if ( $lenData['len'] < 0 ) {
+				throw new MWException( "Too big PSIR (" . $lenData['len'] . ')' );
+			}
 
 			$offset += 4; // 4bytes length field;
 
@@ -267,7 +271,9 @@ class JpegMetadataExtractor {
 
 			// if odd, add 1 to length to account for
 			// null pad byte.
-			if ( $lenData['len'] % 2 == 1 ) $lenData['len']++;
+			if ( $lenData['len'] % 2 == 1 ) {
+				$lenData['len']++;
+			}
 			$offset += $lenData['len'];
 
 		}
diff --git a/includes/media/MediaHandler.php b/includes/media/MediaHandler.php
index 9a3f645b..779e23c9 100644
--- a/includes/media/MediaHandler.php
+++ b/includes/media/MediaHandler.php
@@ -78,14 +78,16 @@ abstract class MediaHandler {
 	/**
 	 * Merge a parameter array into a string appropriate for inclusion in filenames
 	 *
-	 * @param $params array
+	 * @param $params array Array of parameters that have been through normaliseParams.
+	 * @return String
 	 */
 	abstract function makeParamString( $params );
 
 	/**
 	 * Parse a param string made with makeParamString back into an array
 	 *
-	 * @param $str string
+	 * @param $str string The parameter string without file name (e.g. 122px)
+	 * @return Array|Boolean Array of parameters or false on failure.
 	 */
 	abstract function parseParamString( $str );
 
@@ -116,7 +118,9 @@ abstract class MediaHandler {
 	 * @param string $path the filename
 	 * @return String
 	 */
-	function getMetadata( $image, $path ) { return ''; }
+	function getMetadata( $image, $path ) {
+		return '';
+	}
 
 	/**
 	 * Get metadata version.
@@ -133,10 +137,10 @@ abstract class MediaHandler {
 	 *
 	 * @return string version string
 	 */
-	static function getMetadataVersion () {
+	static function getMetadataVersion() {
 		$version = Array( '2' ); // core metadata version
 		wfRunHooks( 'GetMetadataVersion', Array( &$version ) );
-		return implode( ';', $version);
+		return implode( ';', $version );
 	}
 
 	/**
@@ -166,7 +170,9 @@ abstract class MediaHandler {
 	 *
 	 * @return string
 	 */
-	function getMetadataType( $image ) { return false; }
+	function getMetadataType( $image ) {
+		return false;
+	}
 
 	/**
 	 * Check if the metadata string is valid for this handler.
@@ -216,6 +222,7 @@ abstract class MediaHandler {
 	 * @param string $dstPath filesystem destination path
 	 * @param string $dstUrl destination URL to use in output HTML
 	 * @param array $params arbitrary set of parameters validated by $this->validateParam()
+	 *   Note: These parameters have *not* gone through $this->normaliseParams()
 	 * @param $flags Integer: a bitfield, may contain self::TRANSFORM_LATER
 	 *
 	 * @return MediaTransformOutput
@@ -224,6 +231,10 @@ abstract class MediaHandler {
 
 	/**
 	 * Get the thumbnail extension and MIME type for a given source MIME type
+	 *
+	 * @param String $ext Extension of original file
+	 * @param String $mime Mime type of original file
+	 * @param Array $params Handler specific rendering parameters
 	 * @return array thumbnail extension and MIME type
 	 */
 	function getThumbType( $ext, $mime, $params = null ) {
@@ -255,63 +266,96 @@ abstract class MediaHandler {
 	 * True if the handled types can be transformed
 	 * @return bool
 	 */
-	function canRender( $file ) { return true; }
+	function canRender( $file ) {
+		return true;
+	}
+
 	/**
 	 * True if handled types cannot be displayed directly in a browser
 	 * but can be rendered
 	 * @return bool
 	 */
-	function mustRender( $file ) { return false; }
+	function mustRender( $file ) {
+		return false;
+	}
+
 	/**
 	 * True if the type has multi-page capabilities
 	 * @return bool
 	 */
-	function isMultiPage( $file ) { return false; }
+	function isMultiPage( $file ) {
+		return false;
+	}
+
 	/**
 	 * Page count for a multi-page document, false if unsupported or unknown
 	 * @return bool
 	 */
-	function pageCount( $file ) { return false; }
+	function pageCount( $file ) {
+		return false;
+	}
+
 	/**
 	 * The material is vectorized and thus scaling is lossless
 	 * @return bool
 	 */
-	function isVectorized( $file ) { return false; }
+	function isVectorized( $file ) {
+		return false;
+	}
+
 	/**
 	 * The material is an image, and is animated.
 	 * In particular, video material need not return true.
 	 * @note Before 1.20, this was a method of ImageHandler only
 	 * @return bool
 	 */
-	function isAnimatedImage( $file ) { return false; }
+	function isAnimatedImage( $file ) {
+		return false;
+	}
+
 	/**
 	 * If the material is animated, we can animate the thumbnail
 	 * @since 1.20
 	 * @return bool If material is not animated, handler may return any value.
 	 */
-	function canAnimateThumbnail( $file ) { return true; }
+	function canAnimateThumbnail( $file ) {
+		return true;
+	}
+
 	/**
 	 * False if the handler is disabled for all files
 	 * @return bool
 	 */
-	function isEnabled() { return true; }
+	function isEnabled() {
+		return true;
+	}
 
 	/**
 	 * Get an associative array of page dimensions
 	 * Currently "width" and "height" are understood, but this might be
 	 * expanded in the future.
-	 * Returns false if unknown or if the document is not multi-page.
+	 * Returns false if unknown.
+	 *
+	 * It is expected that handlers for paged media (e.g. DjVuHandler)
+	 * will override this method so that it gives the correct results
+	 * for each specific page of the file, using the $page argument.
+	 *
+	 * @note For non-paged media, use getImageSize.
 	 *
 	 * @param $image File
-	 * @param $page Unused, left for backcompatibility?
-	 * @return array
+	 * @param $page What page to get dimensions of
+	 * @return array|bool
 	 */
 	function getPageDimensions( $image, $page ) {
 		$gis = $this->getImageSize( $image, $image->getLocalRefPath() );
-		return array(
-			'width' => $gis[0],
-			'height' => $gis[1]
-		);
+		if ( $gis ) {
+			return array(
+				'width' => $gis[0],
+				'height' => $gis[1]
+			);
+		} else {
+			return false;
+		}
 	}
 
 	/**
@@ -394,9 +438,9 @@ abstract class MediaHandler {
 	function visibleMetadataFields() {
 		$fields = array();
 		$lines = explode( "\n", wfMessage( 'metadata-fields' )->inContentLanguage()->text() );
-		foreach( $lines as $line ) {
+		foreach ( $lines as $line ) {
 			$matches = array();
-			if( preg_match( '/^\\*\s*(.*?)\s*$/', $line, $matches ) ) {
+			if ( preg_match( '/^\\*\s*(.*?)\s*$/', $line, $matches ) ) {
 				$fields[] = $matches[1];
 			}
 		}
@@ -448,6 +492,8 @@ abstract class MediaHandler {
 	}
 
 	/**
+	 * Used instead of getLongDesc if there is no handler registered for file.
+	 *
 	 * @param $file File
 	 * @return string
 	 */
@@ -457,6 +503,8 @@ abstract class MediaHandler {
 	}
 
 	/**
+	 * Short description. Shown on Special:Search results.
+	 *
 	 * @param $file File
 	 * @return string
 	 */
@@ -467,6 +515,8 @@ abstract class MediaHandler {
 	}
 
 	/**
+	 * Long description. Shown under image on image description page surounded by ().
+	 *
 	 * @param $file File
 	 * @return string
 	 */
@@ -476,6 +526,8 @@ abstract class MediaHandler {
 	}
 
 	/**
+	 * Used instead of getShortDesc if there is no handler registered for file.
+	 *
 	 * @param $file File
 	 * @return string
 	 */
@@ -496,19 +548,32 @@ abstract class MediaHandler {
 	public static function fitBoxWidth( $boxWidth, $boxHeight, $maxHeight ) {
 		$idealWidth = $boxWidth * $maxHeight / $boxHeight;
 		$roundedUp = ceil( $idealWidth );
-		if( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight ) {
+		if ( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight ) {
 			return floor( $idealWidth );
 		} else {
 			return $roundedUp;
 		}
 	}
 
+	/**
+	 * Shown in file history box on image description page.
+	 *
+	 * @param File $file
+	 * @return String Dimensions
+	 */
 	function getDimensionsString( $file ) {
 		return '';
 	}
 
 	/**
-	 * Modify the parser object post-transform
+	 * Modify the parser object post-transform.
+	 *
+	 * This is often used to do $parser->addOutputHook(),
+	 * in order to add some javascript to render a viewer.
+	 * See TimedMediaHandler or OggHandler for an example.
+	 *
+	 * @param Parser $parser
+	 * @param File $file
 	 */
 	function parserTransformHook( $parser, $file ) {}
 
@@ -535,9 +600,9 @@ abstract class MediaHandler {
 	 * @return bool True if removed, false otherwise
 	 */
 	function removeBadFile( $dstPath, $retval = 0 ) {
-		if( file_exists( $dstPath ) ) {
+		if ( file_exists( $dstPath ) ) {
 			$thumbstat = stat( $dstPath );
-			if( $thumbstat['size'] == 0 || $retval != 0 ) {
+			if ( $thumbstat['size'] == 0 || $retval != 0 ) {
 				$result = unlink( $dstPath );
 
 				if ( $result ) {
@@ -556,10 +621,17 @@ abstract class MediaHandler {
 	}
 
 	/**
-	 * Remove files from the purge list
+	 * Remove files from the purge list.
+	 *
+	 * This is used by some video handlers to prevent ?action=purge
+	 * from removing a transcoded video, which is expensive to
+	 * regenerate.
+	 *
+	 * @see LocalFile::purgeThumbnails
 	 *
 	 * @param array $files
-	 * @param array $options
+	 * @param array $options Purge options. Currently will always be
+	 *  an array with a single key 'forThumbRefresh' set to true.
 	 */
 	public function filterThumbnailPurgeList( &$files, $options ) {
 		// Do nothing
@@ -573,4 +645,23 @@ abstract class MediaHandler {
 	public static function canRotate() {
 		return false;
 	}
+
+	/**
+	 * On supporting image formats, try to read out the low-level orientation
+	 * of the file and return the angle that the file needs to be rotated to
+	 * be viewed.
+	 *
+	 * This information is only useful when manipulating the original file;
+	 * the width and height we normally work with is logical, and will match
+	 * any produced output views.
+	 *
+	 * For files we don't know, we return 0.
+	 *
+	 * @param $file File
+	 * @return int 0, 90, 180 or 270
+	 */
+	public function getRotation( $file ) {
+		return 0;
+	}
+
 }
diff --git a/includes/media/MediaTransformOutput.php b/includes/media/MediaTransformOutput.php
index 1f95bc3b..c49d3f20 100644
--- a/includes/media/MediaTransformOutput.php
+++ b/includes/media/MediaTransformOutput.php
@@ -32,7 +32,7 @@ abstract class MediaTransformOutput {
 	 */
 	var $file;
 
-	var $width, $height, $url, $page, $path;
+	var $width, $height, $url, $page, $path, $lang;
 
 	/**
 	 * @var array Associative array mapping optional supplementary image files
@@ -151,7 +151,12 @@ abstract class MediaTransformOutput {
 		if ( $this->isError() ) {
 			return false;
 		} elseif ( $this->path === null ) {
-			return $this->file->getLocalRefPath();
+			return $this->file->getLocalRefPath(); // assume thumb was not scaled
+		} elseif ( FileBackend::isStoragePath( $this->path ) ) {
+			$be = $this->file->getRepo()->getBackend();
+			// The temp file will be process cached by FileBackend
+			$fsFile = $be->getLocalReference( array( 'src' => $this->path ) );
+			return $fsFile ? $fsFile->getPath() : false;
 		} else {
 			return $this->path; // may return false
 		}
@@ -192,17 +197,26 @@ abstract class MediaTransformOutput {
 
 	/**
 	 * @param $title string
-	 * @param $params array
+	 * @param $params string|array Query parameters to add
 	 * @return array
 	 */
-	public function getDescLinkAttribs( $title = null, $params = '' ) {
-		$query = '';
+	public function getDescLinkAttribs( $title = null, $params = array() ) {
+		if ( is_array( $params ) ) {
+			$query = $params;
+		} else {
+			$query = array();
+		}
 		if ( $this->page && $this->page !== 1 ) {
-			$query = 'page=' . urlencode( $this->page );
+			$query['page'] = $this->page;
 		}
-		if( $params ) {
-			$query .= $query ? '&' . $params : $params;
+		if ( $this->lang ) {
+			$query['lang'] = $this->lang;
 		}
+
+		if ( is_string( $params ) && $params !== '' ) {
+			$query = $params . '&' . wfArrayToCgi( $query );
+		}
+
 		$attribs = array(
 			'href' => $this->file->getTitle()->getLocalURL( $query ),
 			'class' => 'image',
@@ -237,10 +251,12 @@ class ThumbnailImage extends MediaTransformOutput {
 		# Previous parameters:
 		#   $file, $url, $width, $height, $path = false, $page = false
 
-		if( is_array( $parameters ) ) {
-			$defaults = array(
-				'page' => false
-			);
+		$defaults = array(
+			'page' => false,
+			'lang' => false
+		);
+
+		if ( is_array( $parameters ) ) {
 			$actualParams = $parameters + $defaults;
 		} else {
 			# Using old format, should convert. Later a warning could be added here.
@@ -249,7 +265,7 @@ class ThumbnailImage extends MediaTransformOutput {
 				'width' => $path,
 				'height' => $parameters,
 				'page' => ( $numArgs > 5 ) ? func_get_arg( 5 ) : false
-			);
+			) + $defaults;
 			$path = ( $numArgs > 4 ) ? func_get_arg( 4 ) : false;
 		}
 
@@ -264,6 +280,7 @@ class ThumbnailImage extends MediaTransformOutput {
 		$this->height = round( $actualParams['height'] );
 
 		$this->page = $actualParams['page'];
+		$this->lang = $actualParams['lang'];
 	}
 
 	/**
@@ -281,6 +298,8 @@ class ThumbnailImage extends MediaTransformOutput {
 	 *     valign       vertical-align property, if the output is an inline element
 	 *     img-class    Class applied to the \<img\> tag, if there is such a tag
 	 *     desc-query   String, description link query params
+	 *     override-width     Override width attribute. Should generally not set
+	 *     override-height    Override height attribute. Should generally not set
 	 *     custom-url-link    Custom URL to link to
 	 *     custom-title-link  Custom Title object to link to
 	 *     custom target-link Value of the target attribute, for custom-target-link
@@ -296,7 +315,7 @@ class ThumbnailImage extends MediaTransformOutput {
 	 */
 	function toHtml( $options = array() ) {
 		if ( count( func_get_args() ) == 2 ) {
-			throw new MWException( __METHOD__ .' called in the old style' );
+			throw new MWException( __METHOD__ . ' called in the old style' );
 		}
 
 		$alt = empty( $options['alt'] ) ? '' : $options['alt'];
@@ -342,6 +361,12 @@ class ThumbnailImage extends MediaTransformOutput {
 		if ( !empty( $options['img-class'] ) ) {
 			$attribs['class'] = $options['img-class'];
 		}
+		if ( isset( $options['override-height'] ) ) {
+			$attribs['height'] = $options['override-height'];
+		}
+		if ( isset( $options['override-width'] ) ) {
+			$attribs['width'] = $options['override-width'];
+		}
 
 		// Additional densities for responsive images, if specified.
 		if ( !empty( $this->responsiveUrls ) ) {
diff --git a/includes/media/PNG.php b/includes/media/PNG.php
index b8a5b40b..98f13861 100644
--- a/includes/media/PNG.php
+++ b/includes/media/PNG.php
@@ -38,7 +38,7 @@ class PNGHandler extends BitmapHandler {
 	function getMetadata( $image, $filename ) {
 		try {
 			$metadata = BitmapMetadataHandler::PNG( $filename );
-		} catch( Exception $e ) {
+		} catch ( Exception $e ) {
 			// Broken file?
 			wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
 			return self::BROKEN_FILE;
@@ -76,7 +76,9 @@ class PNGHandler extends BitmapHandler {
 		$ser = $image->getMetadata();
 		if ( $ser ) {
 			$metadata = unserialize( $ser );
-			if( $metadata['frameCount'] > 1 ) return true;
+			if ( $metadata['frameCount'] > 1 ) {
+				return true;
+			}
 		}
 		return false;
 	}
@@ -105,13 +107,13 @@ class PNGHandler extends BitmapHandler {
 		wfRestoreWarnings();
 
 		if ( !$data || !is_array( $data ) ) {
-			wfDebug( __METHOD__ . ' invalid png metadata' );
+			wfDebug( __METHOD__ . " invalid png metadata\n" );
 			return self::METADATA_BAD;
 		}
 
 		if ( !isset( $data['metadata']['_MW_PNG_VERSION'] )
 			|| $data['metadata']['_MW_PNG_VERSION'] != PNGMetadataExtractor::VERSION ) {
-			wfDebug( __METHOD__ . ' old but compatible png metadata' );
+			wfDebug( __METHOD__ . " old but compatible png metadata\n" );
 			return self::METADATA_COMPATIBLE;
 		}
 		return self::METADATA_GOOD;
@@ -129,8 +131,9 @@ class PNGHandler extends BitmapHandler {
 		$metadata = unserialize( $image->getMetadata() );
 		wfRestoreWarnings();
 
-		if( !$metadata || $metadata['frameCount'] <= 0 )
+		if ( !$metadata || $metadata['frameCount'] <= 0 ) {
 			return $original;
+		}
 
 		$info = array();
 		$info[] = $original;
diff --git a/includes/media/PNGMetadataExtractor.php b/includes/media/PNGMetadataExtractor.php
index 87f705ca..845d212a 100644
--- a/includes/media/PNGMetadataExtractor.php
+++ b/includes/media/PNGMetadataExtractor.php
@@ -142,7 +142,7 @@ class PNGMetadataExtractor {
 				}
 			} elseif ( $chunk_type == "acTL" ) {
 				$buf = fread( $fh, $chunk_size );
-				if( !$buf || strlen( $buf ) < $chunk_size || $chunk_size < 4 ) {
+				if ( !$buf || strlen( $buf ) < $chunk_size || $chunk_size < 4 ) {
 					throw new Exception( __METHOD__ . ": Read error" );
 				}
 
@@ -202,21 +202,21 @@ class PNGMetadataExtractor {
 
 							if ( $items[5] === false ) {
 								// decompression failed
-								wfDebug( __METHOD__ . ' Error decompressing iTxt chunk - ' . $items[1] );
+								wfDebug( __METHOD__ . ' Error decompressing iTxt chunk - ' . $items[1] . "\n" );
 								fseek( $fh, self::$CRC_size, SEEK_CUR );
 								continue;
 							}
 
 						} else {
 							wfDebug( __METHOD__ . ' Skipping compressed png iTXt chunk due to lack of zlib,'
-								. ' or potentially invalid compression method' );
+								. " or potentially invalid compression method\n" );
 							fseek( $fh, self::$CRC_size, SEEK_CUR );
 							continue;
 						}
 					}
-					$finalKeyword = self::$text_chunks[ $items[1] ];
-					$text[ $finalKeyword ][ $items[3] ] = $items[5];
-					$text[ $finalKeyword ]['_type'] = 'lang';
+					$finalKeyword = self::$text_chunks[$items[1]];
+					$text[$finalKeyword][$items[3]] = $items[5];
+					$text[$finalKeyword]['_type'] = 'lang';
 
 				} else {
 					// Error reading iTXt chunk
@@ -251,9 +251,9 @@ class PNGMetadataExtractor {
 					throw new Exception( __METHOD__ . ": Read error (error with iconv)" );
 				}
 
-				$finalKeyword = self::$text_chunks[ $keyword ];
-				$text[ $finalKeyword ][ 'x-default' ] = $content;
-				$text[ $finalKeyword ]['_type'] = 'lang';
+				$finalKeyword = self::$text_chunks[$keyword];
+				$text[$finalKeyword]['x-default'] = $content;
+				$text[$finalKeyword]['_type'] = 'lang';
 
 			} elseif ( $chunk_type == 'zTXt' ) {
 				if ( function_exists( 'gzuncompress' ) ) {
@@ -279,7 +279,7 @@ class PNGMetadataExtractor {
 					$compression = substr( $postKeyword, 0, 1 );
 					$content = substr( $postKeyword, 1 );
 					if ( $compression !== "\x00" ) {
-						wfDebug( __METHOD__ . " Unrecognized compression method in zTXt ($keyword). Skipping." );
+						wfDebug( __METHOD__ . " Unrecognized compression method in zTXt ($keyword). Skipping.\n" );
 						fseek( $fh, self::$CRC_size, SEEK_CUR );
 						continue;
 					}
@@ -290,7 +290,7 @@ class PNGMetadataExtractor {
 
 					if ( $content === false ) {
 						// decompression failed
-						wfDebug( __METHOD__ . ' Error decompressing zTXt chunk - ' . $keyword );
+						wfDebug( __METHOD__ . ' Error decompressing zTXt chunk - ' . $keyword . "\n" );
 						fseek( $fh, self::$CRC_size, SEEK_CUR );
 						continue;
 					}
@@ -303,12 +303,12 @@ class PNGMetadataExtractor {
 						throw new Exception( __METHOD__ . ": Read error (error with iconv)" );
 					}
 
-					$finalKeyword = self::$text_chunks[ $keyword ];
-					$text[ $finalKeyword ][ 'x-default' ] = $content;
-					$text[ $finalKeyword ]['_type'] = 'lang';
+					$finalKeyword = self::$text_chunks[$keyword];
+					$text[$finalKeyword]['x-default'] = $content;
+					$text[$finalKeyword]['_type'] = 'lang';
 
 				} else {
-					wfDebug( __METHOD__ . " Cannot decompress zTXt chunk due to lack of zlib. Skipping." );
+					wfDebug( __METHOD__ . " Cannot decompress zTXt chunk due to lack of zlib. Skipping.\n" );
 					fseek( $fh, $chunk_size, SEEK_CUR );
 				}
 			} elseif ( $chunk_type == 'tIME' ) {
diff --git a/includes/media/SVG.php b/includes/media/SVG.php
index cddab51d..72a9696c 100644
--- a/includes/media/SVG.php
+++ b/includes/media/SVG.php
@@ -56,7 +56,7 @@ class SvgHandler extends ImageHandler {
 		$metadata = $file->getMetadata();
 		if ( $metadata ) {
 			$metadata = $this->unpackMetadata( $metadata );
-			if( isset( $metadata['animated'] ) ) {
+			if ( isset( $metadata['animated'] ) ) {
 				return $metadata['animated'];
 			}
 		}
@@ -115,6 +115,7 @@ class SvgHandler extends ImageHandler {
 		$clientHeight = $params['height'];
 		$physicalWidth = $params['physicalWidth'];
 		$physicalHeight = $params['physicalHeight'];
+		$lang = isset( $params['lang'] ) ? $params['lang'] : 'en';
 
 		if ( $flags & self::TRANSFORM_LATER ) {
 			return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
@@ -132,7 +133,7 @@ class SvgHandler extends ImageHandler {
 		}
 
 		$srcPath = $image->getLocalRefPath();
-		$status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight );
+		$status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight, $lang );
 		if ( $status === true ) {
 			return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
 		} else {
@@ -147,10 +148,11 @@ class SvgHandler extends ImageHandler {
 	 * @param string $dstPath
 	 * @param string $width
 	 * @param string $height
+	 * @param string $lang Language code of the language to render the SVG in
 	 * @throws MWException
 	 * @return bool|MediaTransformError
 	 */
-	public function rasterize( $srcPath, $dstPath, $width, $height ) {
+	public function rasterize( $srcPath, $dstPath, $width, $height, $lang = false ) {
 		global $wgSVGConverters, $wgSVGConverter, $wgSVGConverterPath;
 		$err = false;
 		$retval = '';
@@ -158,7 +160,7 @@ class SvgHandler extends ImageHandler {
 			if ( is_array( $wgSVGConverters[$wgSVGConverter] ) ) {
 				// This is a PHP callable
 				$func = $wgSVGConverters[$wgSVGConverter][0];
-				$args = array_merge( array( $srcPath, $dstPath, $width, $height ),
+				$args = array_merge( array( $srcPath, $dstPath, $width, $height, $lang ),
 					array_slice( $wgSVGConverters[$wgSVGConverter], 1 ) );
 				if ( !is_callable( $func ) ) {
 					throw new MWException( "$func is not callable" );
@@ -175,10 +177,16 @@ class SvgHandler extends ImageHandler {
 						wfEscapeShellArg( $srcPath ),
 						wfEscapeShellArg( $dstPath ) ),
 					$wgSVGConverters[$wgSVGConverter]
-				) . " 2>&1";
+				);
+
+				$env = array();
+				if ( $lang !== false ) {
+					$env['LANG'] = $lang;
+				}
+
 				wfProfileIn( 'rsvg' );
 				wfDebug( __METHOD__ . ": $cmd\n" );
-				$err = wfShellExec( $cmd, $retval );
+				$err = wfShellExecWithStderr( $cmd, $retval, $env );
 				wfProfileOut( 'rsvg' );
 			}
 		}
@@ -263,11 +271,11 @@ class SvgHandler extends ImageHandler {
 		$metadata = array( 'version' => self::SVG_METADATA_VERSION );
 		try {
 			$metadata += SVGMetadataExtractor::getMetadata( $filename );
-		} catch( MWException $e ) { // @TODO: SVG specific exceptions
+		} catch ( MWException $e ) { // @todo SVG specific exceptions
 			// File not found, broken, etc.
 			$metadata['error'] = array(
 				'message' => $e->getMessage(),
-				'code'    => $e->getCode()
+				'code' => $e->getCode()
 			);
 			wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
 		}
@@ -340,6 +348,7 @@ class SvgHandler extends ImageHandler {
 			'description' => 'imagedescription',
 			'title' => 'objectname',
 		);
+		$showMeta = false;
 		foreach ( $metadata as $name => $value ) {
 			$tag = strtolower( $name );
 			if ( isset( $conversion[$tag] ) ) {
@@ -348,6 +357,7 @@ class SvgHandler extends ImageHandler {
 				// Do not output other metadata not in list
 				continue;
 			}
+			$showMeta = true;
 			self::addMeta( $result,
 				in_array( $tag, $visibleFields ) ? 'visible' : 'collapsed',
 				'exif',
@@ -355,6 +365,70 @@ class SvgHandler extends ImageHandler {
 				$value
 			);
 		}
-		return $result;
+		return $showMeta ? $result : false;
+	}
+
+
+	/**
+	 * @param string $name Parameter name
+	 * @param $string $value Parameter value
+	 * @return bool Validity
+	 */
+	function validateParam( $name, $value ) {
+		if ( in_array( $name, array( 'width', 'height' ) ) ) {
+			// Reject negative heights, widths
+			return ( $value > 0 );
+		} elseif ( $name == 'lang' ) {
+			// Validate $code
+			if ( !Language::isValidBuiltinCode( $value ) ) {
+				wfDebug( "Invalid user language code\n" );
+				return false;
+			}
+			return true;
+		}
+		// Only lang, width and height are acceptable keys
+		return false;
+	}
+
+	/**
+	 * @param array $params name=>value pairs of parameters
+	 * @return string Filename to use
+	 */
+	function makeParamString( $params ) {
+		$lang = '';
+		if ( isset( $params['lang'] ) && $params['lang'] !== 'en' ) {
+			$params['lang'] = mb_strtolower( $params['lang'] );
+			$lang = "lang{$params['lang']}-";
+		}
+		if ( !isset( $params['width'] ) ) {
+			return false;
+		}
+		return "$lang{$params['width']}px";
+	}
+
+	function parseParamString( $str ) {
+		$m = false;
+		if ( preg_match( '/^lang([a-z]+(?:-[a-z]+)*)-(\d+)px$/', $str, $m ) ) {
+			return array( 'width' => array_pop( $m ), 'lang' => $m[1] );
+		} elseif ( preg_match( '/^(\d+)px$/', $str, $m ) ) {
+			return array( 'width' => $m[1], 'lang' => 'en' );
+		} else {
+			return false;
+		}
+	}
+
+	function getParamMap() {
+		return array( 'img_lang' => 'lang', 'img_width' => 'width' );
+	}
+
+	/**
+	 * @param $params
+	 * @return array
+	 */
+	function getScriptParams( $params ) {
+		return array(
+			'width' => $params['width'],
+			'lang' => $params['lang'],
+		);
 	}
 }
diff --git a/includes/media/SVGMetadataExtractor.php b/includes/media/SVGMetadataExtractor.php
index 0de212b9..2e33bb98 100644
--- a/includes/media/SVGMetadataExtractor.php
+++ b/includes/media/SVGMetadataExtractor.php
@@ -101,7 +101,7 @@ class SVGReader {
 		wfSuppressWarnings();
 		try {
 			$this->read();
-		} catch( Exception $e ) {
+		} catch ( Exception $e ) {
 			// Note, if this happens, the width/height will be taken to be 0x0.
 			// Should we consider it the default 512x512 instead?
 			wfRestoreWarnings();
@@ -128,12 +128,12 @@ class SVGReader {
 		$keepReading = $this->reader->read();
 
 		/* Skip until first element */
-		while( $keepReading && $this->reader->nodeType != XmlReader::ELEMENT ) {
+		while ( $keepReading && $this->reader->nodeType != XmlReader::ELEMENT ) {
 			$keepReading = $this->reader->read();
 		}
 
 		if ( $this->reader->localName != 'svg' || $this->reader->namespaceURI != self::NS_SVG ) {
-			throw new MWException( "Expected <svg> tag, got ".
+			throw new MWException( "Expected <svg> tag, got " .
 				$this->reader->localName . " in NS " . $this->reader->namespaceURI );
 		}
 		$this->debug( "<svg> tag is correct." );
@@ -144,7 +144,7 @@ class SVGReader {
 		while ( $keepReading ) {
 			$tag = $this->reader->localName;
 			$type = $this->reader->nodeType;
-			$isSVG = ($this->reader->namespaceURI == self::NS_SVG);
+			$isSVG = ( $this->reader->namespaceURI == self::NS_SVG );
 
 			$this->debug( "$tag" );
 
@@ -185,16 +185,16 @@ class SVGReader {
 	 * @param string $name of the element that we are reading from
 	 * @param string $metafield that we will fill with the result
 	 */
-	private function readField( $name, $metafield=null ) {
-		$this->debug ( "Read field $metafield" );
-		if( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
+	private function readField( $name, $metafield = null ) {
+		$this->debug( "Read field $metafield" );
+		if ( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
 			return;
 		}
 		$keepReading = $this->reader->read();
-		while( $keepReading ) {
-			if( $this->reader->localName == $name && $this->reader->namespaceURI == self::NS_SVG && $this->reader->nodeType == XmlReader::END_ELEMENT ) {
+		while ( $keepReading ) {
+			if ( $this->reader->localName == $name && $this->reader->namespaceURI == self::NS_SVG && $this->reader->nodeType == XmlReader::END_ELEMENT ) {
 				break;
-			} elseif( $this->reader->nodeType == XmlReader::TEXT ) {
+			} elseif ( $this->reader->nodeType == XmlReader::TEXT ) {
 				$this->metadata[$metafield] = trim( $this->reader->value );
 			}
 			$keepReading = $this->reader->read();
@@ -207,13 +207,13 @@ class SVGReader {
 	 * @param string $metafield that we will fill with the result
 	 * @throws MWException
 	 */
-	private function readXml( $metafield=null ) {
-		$this->debug ( "Read top level metadata" );
-		if( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
+	private function readXml( $metafield = null ) {
+		$this->debug( "Read top level metadata" );
+		if ( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
 			return;
 		}
 		// TODO: find and store type of xml snippet. metadata['metadataType'] = "rdf"
-		if( method_exists( $this->reader, 'readInnerXML' ) ) {
+		if ( method_exists( $this->reader, 'readInnerXML' ) ) {
 			$this->metadata[$metafield] = trim( $this->reader->readInnerXML() );
 		} else {
 			throw new MWException( "The PHP XMLReader extension does not come with readInnerXML() method. Your libxml is probably out of date (need 2.6.20 or later)." );
@@ -227,8 +227,8 @@ class SVGReader {
 	 * @param string $name of the element that we are reading from
 	 */
 	private function animateFilter( $name ) {
-		$this->debug ( "animate filter for tag $name" );
-		if( $this->reader->nodeType != XmlReader::ELEMENT ) {
+		$this->debug( "animate filter for tag $name" );
+		if ( $this->reader->nodeType != XmlReader::ELEMENT ) {
 			return;
 		}
 		if ( $this->reader->isEmptyElement ) {
@@ -236,12 +236,12 @@ class SVGReader {
 		}
 		$exitDepth = $this->reader->depth;
 		$keepReading = $this->reader->read();
-		while( $keepReading ) {
-			if( $this->reader->localName == $name && $this->reader->depth <= $exitDepth
+		while ( $keepReading ) {
+			if ( $this->reader->localName == $name && $this->reader->depth <= $exitDepth
 				&& $this->reader->nodeType == XmlReader::END_ELEMENT ) {
 				break;
 			} elseif ( $this->reader->namespaceURI == self::NS_SVG && $this->reader->nodeType == XmlReader::ELEMENT ) {
-				switch( $this->reader->localName ) {
+				switch ( $this->reader->localName ) {
 					case 'script':
 						// Normally we disallow files with
 						// <script>, but its possible
@@ -267,7 +267,7 @@ class SVGReader {
 	}
 
 	private function debug( $data ) {
-		if( $this->mDebug ) {
+		if ( $this->mDebug ) {
 			wfDebug( "SVGReader: $data\n" );
 		}
 	}
@@ -292,37 +292,37 @@ class SVGReader {
 		$width = null;
 		$height = null;
 
-		if( $this->reader->getAttribute( 'viewBox' ) ) {
+		if ( $this->reader->getAttribute( 'viewBox' ) ) {
 			// min-x min-y width height
 			$viewBox = preg_split( '/\s+/', trim( $this->reader->getAttribute( 'viewBox' ) ) );
-			if( count( $viewBox ) == 4 ) {
+			if ( count( $viewBox ) == 4 ) {
 				$viewWidth = $this->scaleSVGUnit( $viewBox[2] );
 				$viewHeight = $this->scaleSVGUnit( $viewBox[3] );
-				if( $viewWidth > 0 && $viewHeight > 0 ) {
+				if ( $viewWidth > 0 && $viewHeight > 0 ) {
 					$aspect = $viewWidth / $viewHeight;
 					$defaultHeight = $defaultWidth / $aspect;
 				}
 			}
 		}
-		if( $this->reader->getAttribute( 'width' ) ) {
+		if ( $this->reader->getAttribute( 'width' ) ) {
 			$width = $this->scaleSVGUnit( $this->reader->getAttribute( 'width' ), $defaultWidth );
 			$this->metadata['originalWidth'] = $this->reader->getAttribute( 'width' );
 		}
-		if( $this->reader->getAttribute( 'height' ) ) {
+		if ( $this->reader->getAttribute( 'height' ) ) {
 			$height = $this->scaleSVGUnit( $this->reader->getAttribute( 'height' ), $defaultHeight );
 			$this->metadata['originalHeight'] = $this->reader->getAttribute( 'height' );
 		}
 
-		if( !isset( $width ) && !isset( $height ) ) {
+		if ( !isset( $width ) && !isset( $height ) ) {
 			$width = $defaultWidth;
 			$height = $width / $aspect;
-		} elseif( isset( $width ) && !isset( $height ) ) {
+		} elseif ( isset( $width ) && !isset( $height ) ) {
 			$height = $width / $aspect;
-		} elseif( isset( $height ) && !isset( $width ) ) {
+		} elseif ( isset( $height ) && !isset( $width ) ) {
 			$width = $height * $aspect;
 		}
 
-		if( $width > 0 && $height > 0 ) {
+		if ( $width > 0 && $height > 0 ) {
 			$this->metadata['width'] = intval( round( $width ) );
 			$this->metadata['height'] = intval( round( $height ) );
 		}
@@ -346,13 +346,13 @@ class SVGReader {
 			'in' => 90.0,
 			'em' => 16.0, // fake it?
 			'ex' => 12.0, // fake it?
-			''   => 1.0, // "User units" pixels by default
+			'' => 1.0, // "User units" pixels by default
 			);
 		$matches = array();
-		if( preg_match( '/^\s*(\d+(?:\.\d+)?)(em|ex|px|pt|pc|cm|mm|in|%|)\s*$/', $length, $matches ) ) {
+		if ( preg_match( '/^\s*(\d+(?:\.\d+)?)(em|ex|px|pt|pc|cm|mm|in|%|)\s*$/', $length, $matches ) ) {
 			$length = floatval( $matches[1] );
 			$unit = $matches[2];
-			if( $unit == '%' ) {
+			if ( $unit == '%' ) {
 				return $length * 0.01 * $viewportSize;
 			} else {
 				return $length * $unitLength[$unit];
diff --git a/includes/media/Tiff.php b/includes/media/Tiff.php
index 0042208b..55acb120 100644
--- a/includes/media/Tiff.php
+++ b/includes/media/Tiff.php
@@ -43,7 +43,7 @@ class TiffHandler extends ExifBitmapHandler {
 	function canRender( $file ) {
 		global $wgTiffThumbnailType;
 		return (bool)$wgTiffThumbnailType
-			|| ($file->getRepo() instanceof ForeignAPIRepo);
+			|| $file->getRepo() instanceof ForeignAPIRepo;
 	}
 
 	/**
diff --git a/includes/media/XCF.php b/includes/media/XCF.php
index ba38d158..e77d3842 100644
--- a/includes/media/XCF.php
+++ b/includes/media/XCF.php
@@ -78,7 +78,7 @@ class XCFHandler extends BitmapHandler {
 	static function getXCFMetaData( $filename ) {
 		# Decode master structure
 		$f = fopen( $filename, 'rb' );
-		if( !$f ) {
+		if ( !$f ) {
 			return false;
 		}
 		# The image structure always starts at offset 0 in the XCF file.
@@ -110,12 +110,12 @@ class XCFHandler extends BitmapHandler {
 				. "/Nbase_type" # /
 			, $binaryHeader
 			);
-		} catch( MWException $mwe ) {
+		} catch ( MWException $mwe ) {
 			return false;
 		}
 
 		# Check values
-		if( $header['magic'] !== 'gimp xcf' ) {
+		if ( $header['magic'] !== 'gimp xcf' ) {
 			wfDebug( __METHOD__ . " '$filename' has invalid magic signature.\n" );
 			return false;
 		}
diff --git a/includes/media/XMP.php b/includes/media/XMP.php
index 62738a00..7eb3d19e 100644
--- a/includes/media/XMP.php
+++ b/includes/media/XMP.php
@@ -180,12 +180,12 @@ class XMPReader {
 		) {
 			// the is_array is just paranoia. It should always
 			// be an array.
-			foreach( $data['xmp-special']['LocationShown'] as $loc ) {
+			foreach ( $data['xmp-special']['LocationShown'] as $loc ) {
 				if ( !is_array( $loc ) ) {
 					// To avoid copying over the _type meta-fields.
 					continue;
 				}
-				foreach( $loc as $field => $val ) {
+				foreach ( $loc as $field => $val ) {
 					$data['xmp-general'][$field . 'Dest'][] = $val;
 				}
 			}
@@ -195,12 +195,12 @@ class XMPReader {
 		) {
 			// the is_array is just paranoia. It should always
 			// be an array.
-			foreach( $data['xmp-special']['LocationCreated'] as $loc ) {
+			foreach ( $data['xmp-special']['LocationCreated'] as $loc ) {
 				if ( !is_array( $loc ) ) {
 					// To avoid copying over the _type meta-fields.
 					continue;
 				}
-				foreach( $loc as $field => $val ) {
+				foreach ( $loc as $field => $val ) {
 					$data['xmp-general'][$field . 'Created'][] = $val;
 				}
 			}
@@ -391,7 +391,9 @@ class XMPReader {
 			throw new MWException( 'Unexpected character data before first rdf:Description element' );
 		}
 
-		if ( $this->mode[0] === self::MODE_IGNORE ) return;
+		if ( $this->mode[0] === self::MODE_IGNORE ) {
+			return;
+		}
 
 		if ( $this->mode[0] !== self::MODE_SIMPLE
 			&& $this->mode[0] !== self::MODE_QDESC
@@ -414,7 +416,7 @@ class XMPReader {
 	 *
 	 * @param string $elm Namespace of element followed by a space and then tag name of element.
 	 */
-	private function endElementModeIgnore ( $elm ) {
+	private function endElementModeIgnore( $elm ) {
 		if ( $this->curItem[0] === $elm ) {
 			array_shift( $this->curItem );
 			array_shift( $this->mode );
@@ -436,7 +438,7 @@ class XMPReader {
 	 *
 	 * @param string $elm namespace, space, and tag name.
 	 */
-	private function endElementModeSimple ( $elm ) {
+	private function endElementModeSimple( $elm ) {
 		if ( $this->charContent !== false ) {
 			if ( $this->processingArray ) {
 				// if we're processing an array, use the original element
@@ -639,7 +641,7 @@ class XMPReader {
 			throw new MWException( "Hit end element </$elm> but no curItem" );
 		}
 
-		switch( $this->mode[0] ) {
+		switch ( $this->mode[0] ) {
 			case self::MODE_IGNORE:
 				$this->endElementModeIgnore( $elm );
 				break;
@@ -993,15 +995,15 @@ class XMPReader {
 		if ( $elm !== self::NS_RDF . ' li' ) {
 			throw new MWException( __METHOD__ . " <rdf:li> expected but got $elm." );
 		}
-		if ( !isset( $attribs[ self::NS_XML . ' lang'] )
-			|| !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $attribs[ self::NS_XML . ' lang' ] ) )
+		if ( !isset( $attribs[self::NS_XML . ' lang'] )
+			|| !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $attribs[self::NS_XML . ' lang'] ) )
 		{
 			throw new MWException( __METHOD__
 				. " <rdf:li> did not contain, or has invalid xml:lang attribute in lang alternative" );
 		}
 
 		// Lang is case-insensitive.
-		$this->itemLang = strtolower( $attribs[ self::NS_XML . ' lang' ] );
+		$this->itemLang = strtolower( $attribs[self::NS_XML . ' lang'] );
 
 		// need to add curItem[0] on again since one is for the specific item
 		// and one is for the entire group.
@@ -1058,7 +1060,7 @@ class XMPReader {
 				. "encountered <$elm> with no mode" );
 		}
 
-		switch( $this->mode[0] ) {
+		switch ( $this->mode[0] ) {
 			case self::MODE_IGNORE:
 				$this->startElementModeIgnore( $elm );
 				break;
diff --git a/includes/media/XMPInfo.php b/includes/media/XMPInfo.php
index 102547ff..f0b2cb5e 100644
--- a/includes/media/XMPInfo.php
+++ b/includes/media/XMPInfo.php
@@ -31,8 +31,8 @@ class XMPInfo {
 	/** get the items array
 	 * @return Array XMP item configuration array.
 	 */
-	public static function getItems () {
-		if( !self::$ranHooks ) {
+	public static function getItems() {
+		if ( !self::$ranHooks ) {
 			// This is for if someone makes a custom metadata extension.
 			// For example, a medical wiki might want to decode DICOM xmp properties.
 			wfRunHooks( 'XMPGetInfo', Array( &self::$items ) );
@@ -428,7 +428,7 @@ class XMPInfo {
 				'mode'      => XMPReader::MODE_SIMPLE,
 				'validate'  => 'validateClosed',
 				/* can't use a range, as it skips... */
-				'choices'   =>  array( '0' => true, '1' => true,
+				'choices'   => array( '0' => true, '1' => true,
 					'2' => true, '3' => true, '4' => true,
 					'9' => true, '10' => true, '11' => true,
 					'12' => true, '13' => true,
diff --git a/includes/media/XMPValidate.php b/includes/media/XMPValidate.php
index f98f0b57..87f8abfe 100644
--- a/includes/media/XMPValidate.php
+++ b/includes/media/XMPValidate.php
@@ -101,7 +101,7 @@ class XMPValidate {
 			$val = null;
 			return;
 		} else {
-			$nVal = (float) $val;
+			$nVal = (float)$val;
 			if ( $nVal < 0 ) {
 				// We do < 0 here instead of < -1 here, since
 				// the values between 0 and -1 are also illegal
@@ -214,7 +214,7 @@ class XMPValidate {
 			// this only validates standalone properties, not arrays, etc
 			return;
 		}
-		if ( !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $val) ) {
+		if ( !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $val ) ) {
 			//this is a rather naive check.
 			wfDebugLog( 'XMP', __METHOD__ . " Expected Lang code but got $val" );
 			$val = null;
@@ -335,7 +335,7 @@ class XMPValidate {
 	 *           or DDD,MM.mmk form
 	 * @param $standalone Boolean if its a simple prop (should always be true)
 	 */
-	public static function validateGPS ( $info, &$val, $standalone ) {
+	public static function validateGPS( $info, &$val, $standalone ) {
 		if ( !$standalone ) {
 			return;
 		}
@@ -346,8 +346,8 @@ class XMPValidate {
 			$val, $m )
 		) {
 			$coord = intval( $m[1] );
-			$coord += intval( $m[2] ) * (1/60);
-			$coord += intval( $m[3] ) * (1/3600);
+			$coord += intval( $m[2] ) * ( 1 / 60 );
+			$coord += intval( $m[3] ) * ( 1 / 3600 );
 			if ( $m[4] === 'S' || $m[4] === 'W' ) {
 				$coord = -$coord;
 			}
@@ -358,7 +358,7 @@ class XMPValidate {
 			$val, $m )
 		) {
 			$coord = intval( $m[1] );
-			$coord += floatval( $m[2] ) * (1/60);
+			$coord += floatval( $m[2] ) * ( 1 / 60 );
 			if ( $m[3] === 'S' || $m[3] === 'W' ) {
 				$coord = -$coord;
 			}
diff --git a/includes/mime.info b/includes/mime.info
index f7576e41..c7981871 100644
--- a/includes/mime.info
+++ b/includes/mime.info
@@ -30,6 +30,7 @@ application/x-dia-diagram [DRAWING]
 
 
 audio/mpeg audio/mp3 audio/mpeg3	[AUDIO]
+audio/mp4				[AUDIO]
 audio/wav audio/x-wav audio/wave	[AUDIO]
 audio/midi audio/mid	[AUDIO]
 audio/basic		[AUDIO]
@@ -39,6 +40,8 @@ audio/x-pn-realaudio	[AUDIO]
 audio/x-realaudio	[AUDIO]
 audio/webm		[AUDIO]
 audio/x-matroska	[AUDIO]
+audio/x-flac		[AUDIO]
+audio/flac		[AUDIO]
 
 video/mpeg application/mpeg	[VIDEO]
 video/ogg			[VIDEO]
@@ -46,6 +49,7 @@ video/x-sgi-video		[VIDEO]
 video/x-flv			[VIDEO]
 video/webm			[VIDEO]
 video/x-matroska		[VIDEO]
+video/mp4			[VIDEO]
 
 application/ogg application/x-ogg audio/ogg audio/x-ogg video/ogg video/x-ogg		[MULTIMEDIA]
 
diff --git a/includes/mime.types b/includes/mime.types
index a89d229a..61f7ff58 100644
--- a/includes/mime.types
+++ b/includes/mime.types
@@ -75,6 +75,9 @@ audio/x-pn-realaudio ram rm
 audio/x-pn-realaudio-plugin rpm
 audio/x-realaudio ra
 audio/x-wav wav
+audio/wav wav
+audio/x-flac flac
+audio/flac flac
 chemical/x-pdb pdb
 chemical/x-xyz xyz
 image/bmp bmp
@@ -118,6 +121,8 @@ text/xml xml xsl xslt rss rdf
 text/x-setext etx
 text/x-sawfish jl
 video/mpeg mpeg mpg mpe
+video/mp4 mp4 m4a m4p m4b m4r m4v
+audio/mp4 m4a
 video/ogg ogv ogm ogg
 video/quicktime qt mov
 video/vnd.mpegurl mxu
diff --git a/includes/normal/README b/includes/normal/README
index a17aa7da..0f718d2c 100644
--- a/includes/normal/README
+++ b/includes/normal/README
@@ -48,12 +48,12 @@ grains of salt.
 
 There's an experimental PHP extension module which wraps the ICU library's
 normalization functions. This is *MUCH* faster than doing this work in pure
-PHP code. This is in the 'normal' directory in MediaWiki's CVS extensions
-module. It is known to work with PHP 4.3.8 and 5.0.2 on Linux/x86 but hasn't
-been thoroughly tested on other configurations.
+PHP code. This is at https://git.wikimedia.org/summary/mediawiki%2Fextensions%2Fnormal.git.
+It is used by the WMF, which currently runs PHP 5.3.10 on Linux.  It hasn't been
+thoroughly tested on other configurations, but may work.
 
 If the php_normal.so module is loaded in php.ini, the normalization functions
 will automatically use it. If you can't (or don't want to) load it in php.ini,
-you may be able to load it using the dl() function before include()ing or
-require()ing UtfNormal.php, and it will be picked up.
+you may be able to load it using the dl() function before the inclusion of
+UtfNormal.php, and it will be picked up.
 
diff --git a/includes/normal/RandomTest.php b/includes/normal/RandomTest.php
index 9dc1c861..06029868 100644
--- a/includes/normal/RandomTest.php
+++ b/includes/normal/RandomTest.php
@@ -31,10 +31,10 @@ if( PHP_SAPI != 'cli' ) {
 }
 
 /** */
-require_once( 'UtfNormal.php' );
-require_once( '../diff/DifferenceEngine.php' );
+require_once 'UtfNormal.php';
+require_once '../diff/DifferenceEngine.php';
 
-dl('php_utfnormal.so' );
+dl( 'php_utfnormal.so' );
 
 # mt_srand( 99999 );
 
diff --git a/includes/normal/UtfNormal.php b/includes/normal/UtfNormal.php
index 77ddb79b..5a091afc 100644
--- a/includes/normal/UtfNormal.php
+++ b/includes/normal/UtfNormal.php
@@ -190,7 +190,7 @@ class UtfNormal {
 	 */
 	static function loadData() {
 		if( !isset( self::$utfCombiningClass ) ) {
-			require_once( __DIR__ . '/UtfNormalData.inc' );
+			require_once __DIR__ . '/UtfNormalData.inc';
 		}
 	}
 
@@ -491,7 +491,7 @@ class UtfNormal {
 	 */
 	static function NFKD( $string ) {
 		if( !isset( self::$utfCompatibilityDecomp ) ) {
-			require_once( 'UtfNormalDataK.inc' );
+			require_once 'UtfNormalDataK.inc';
 		}
 		return self::fastCombiningSort(
 			self::fastDecompose( $string, self::$utfCompatibilityDecomp ) );
diff --git a/includes/normal/UtfNormalTest.php b/includes/normal/UtfNormalTest.php
index 661e53fd..51183666 100644
--- a/includes/normal/UtfNormalTest.php
+++ b/includes/normal/UtfNormalTest.php
@@ -34,9 +34,7 @@ $verbose = true;
 
 if( defined( 'PRETTY_UTF8' ) ) {
 	function pretty( $string ) {
-		return preg_replace( '/([\x00-\xff])/e',
-			'sprintf("%02X", ord("$1"))',
-			$string );
+		return strtoupper( bin2hex( $string ) );
 	}
 } else {
 	/**
@@ -44,9 +42,7 @@ if( defined( 'PRETTY_UTF8' ) ) {
 	 * @return string
 	 */
 	function pretty( $string ) {
-		return trim( preg_replace( '/(.)/use',
-			'sprintf("%04X ", utf8ToCodepoint("$1"))',
-			$string ) );
+		return strtoupper( utf8ToHexSequence( $string ) );
 	}
 }
 
diff --git a/includes/normal/UtfNormalTest2.php b/includes/normal/UtfNormalTest2.php
index 2266696e..750c0099 100644
--- a/includes/normal/UtfNormalTest2.php
+++ b/includes/normal/UtfNormalTest2.php
@@ -65,7 +65,7 @@ $f = fopen($file, "r");
      later and slow down the runtime.
  */
 
-require_once("./UtfNormal.php");
+require_once './UtfNormal.php';
 function normalize_form_c($c)      { return UtfNormal::toNFC($c);  }
 function normalize_form_d($c)      { return UtfNormal::toNFD($c);  }
 function normalize_form_kc($c)     { return UtfNormal::toNFKC($c); }
diff --git a/includes/normal/UtfNormalUtil.php b/includes/normal/UtfNormalUtil.php
index 9b96a073..e8fec936 100644
--- a/includes/normal/UtfNormalUtil.php
+++ b/includes/normal/UtfNormalUtil.php
@@ -76,9 +76,11 @@ function hexSequenceToUtf8( $sequence ) {
  * @private
  */
 function utf8ToHexSequence( $str ) {
-	return rtrim( preg_replace( '/(.)/uSe',
-	                            'sprintf("%04x ", utf8ToCodepoint("$1"))',
-	                            $str ) );
+	$buf = '';
+	foreach ( preg_split( '//u', $str, -1, PREG_SPLIT_NO_EMPTY ) as $cp ) {
+		$buf .= sprintf( '%04x ', utf8ToCodepoint( $cp ) );
+	}
+	return rtrim( $buf );
 }
 
 /**
diff --git a/includes/objectcache/BagOStuff.php b/includes/objectcache/BagOStuff.php
index dd744672..857943ee 100644
--- a/includes/objectcache/BagOStuff.php
+++ b/includes/objectcache/BagOStuff.php
@@ -170,12 +170,12 @@ abstract class BagOStuff {
 	 */
 	public function lock( $key, $timeout = 60 ) {
 		$timestamp = microtime( true ); // starting UNIX timestamp
-		if ( $this->add( "{$key}:lock", $timeout ) ) {
+		if ( $this->add( "{$key}:lock", 1, $timeout ) ) {
 			return true;
 		}
 
 		$uRTT = ceil( 1e6 * ( microtime( true ) - $timestamp ) ); // estimate RTT (us)
-		$sleep = 2*$uRTT; // rough time to do get()+set()
+		$sleep = 2 * $uRTT; // rough time to do get()+set()
 
 		$locked = false; // lock acquired
 		$attempts = 0; // failed attempts
@@ -186,8 +186,8 @@ abstract class BagOStuff {
 				$sleep *= 2;
 			}
 			usleep( $sleep ); // back off
-			$locked = $this->add( "{$key}:lock", $timeout );
-		} while( !$locked );
+			$locked = $this->add( "{$key}:lock", 1, $timeout );
+		} while ( !$locked );
 
 		return $locked;
 	}
diff --git a/includes/objectcache/MemcachedBagOStuff.php b/includes/objectcache/MemcachedBagOStuff.php
index 3f1fa3a0..f1644edb 100644
--- a/includes/objectcache/MemcachedBagOStuff.php
+++ b/includes/objectcache/MemcachedBagOStuff.php
@@ -43,7 +43,7 @@ class MemcachedBagOStuff extends BagOStuff {
 		if ( !isset( $params['persistent'] ) ) {
 			$params['persistent'] = $GLOBALS['wgMemCachedPersistent'];
 		}
-		if  ( !isset( $params['compress_threshold'] ) ) {
+		if ( !isset( $params['compress_threshold'] ) ) {
 			$params['compress_threshold'] = 1500;
 		}
 		if ( !isset( $params['timeout'] ) ) {
diff --git a/includes/objectcache/MemcachedClient.php b/includes/objectcache/MemcachedClient.php
index 0d96ed6c..e5f60b55 100644
--- a/includes/objectcache/MemcachedClient.php
+++ b/includes/objectcache/MemcachedClient.php
@@ -55,9 +55,9 @@
  *              'compress_threshold' => 10240,
  *              'persistent' => true));
  *
- * $mc->add('key', array('some', 'array'));
- * $mc->replace('key', 'some random string');
- * $val = $mc->get('key');
+ * $mc->add( 'key', array( 'some', 'array' ) );
+ * $mc->replace( 'key', 'some random string' );
+ * $val = $mc->get( 'key' );
  *
  * @author  Ryan T. Dean <rtdean@cytherianage.net>
  * @version 0.1.2
@@ -329,7 +329,7 @@ class MWMemcached {
 			$this->stats['delete'] = 1;
 		}
 		$cmd = "delete $key $time\r\n";
-		if( !$this->_fwrite( $sock, $cmd ) ) {
+		if ( !$this->_fwrite( $sock, $cmd ) ) {
 			return false;
 		}
 		$res = $this->_fgets( $sock );
@@ -489,17 +489,17 @@ class MWMemcached {
 			}
 			$key = is_array( $key ) ? $key[1] : $key;
 			if ( !isset( $sock_keys[$sock] ) ) {
-				$sock_keys[ intval( $sock ) ] = array();
+				$sock_keys[intval( $sock )] = array();
 				$socks[] = $sock;
 			}
-			$sock_keys[ intval( $sock ) ][] = $key;
+			$sock_keys[intval( $sock )][] = $key;
 		}
 
 		$gather = array();
 		// Send out the requests
 		foreach ( $socks as $sock ) {
 			$cmd = 'gets';
-			foreach ( $sock_keys[ intval( $sock ) ] as $key ) {
+			foreach ( $sock_keys[intval( $sock )] as $key ) {
 				$cmd .= ' ' . $key;
 			}
 			$cmd .= "\r\n";
@@ -733,7 +733,7 @@ class MWMemcached {
 		$sock = false;
 		$timeout = $this->_connect_timeout;
 		$errno = $errstr = null;
-		for( $i = 0; !$sock && $i < $this->_connect_attempts; $i++ ) {
+		for ( $i = 0; !$sock && $i < $this->_connect_attempts; $i++ ) {
 			wfSuppressWarnings();
 			if ( $this->_persistent == 1 ) {
 				$sock = pfsockopen( $ip, $port, $errno, $errstr, $timeout );
@@ -810,7 +810,7 @@ class MWMemcached {
 			$bu = array();
 			foreach ( $this->_servers as $v ) {
 				if ( is_array( $v ) ) {
-					for( $i = 0; $i < $v[1]; $i++ ) {
+					for ( $i = 0; $i < $v[1]; $i++ ) {
 						$bu[] = $v[0];
 					}
 				} else {
@@ -822,7 +822,7 @@ class MWMemcached {
 		}
 
 		$realkey = is_array( $key ) ? $key[1] : $key;
-		for( $tries = 0; $tries < 20; $tries++ ) {
+		for ( $tries = 0; $tries < 20; $tries++ ) {
 			$host = $this->_buckets[$hv % $this->_bucketcount];
 			$sock = $this->sock_to_host( $host );
 			if ( is_resource( $sock ) ) {
@@ -912,7 +912,7 @@ class MWMemcached {
 		while ( 1 ) {
 			$decl = $this->_fgets( $sock );
 
-			if( $decl === false ) {
+			if ( $decl === false ) {
 				/*
 				 * If nothing can be read, something is wrong because we know exactly when
 				 * to stop reading (right after "END") and we return right after that.
@@ -1123,7 +1123,7 @@ class MWMemcached {
 	function _fwrite( $sock, $buf ) {
 		$bytesWritten = 0;
 		$bufSize = strlen( $buf );
-		while ( $bytesWritten < $bufSize  ) {
+		while ( $bytesWritten < $bufSize ) {
 			$result = fwrite( $sock, $buf );
 			$data = stream_get_meta_data( $sock );
 			if ( $data['timed_out'] ) {
diff --git a/includes/objectcache/MemcachedPeclBagOStuff.php b/includes/objectcache/MemcachedPeclBagOStuff.php
index 31924293..0c3b228f 100644
--- a/includes/objectcache/MemcachedPeclBagOStuff.php
+++ b/includes/objectcache/MemcachedPeclBagOStuff.php
@@ -37,6 +37,8 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 	 *   - compress_threshold:  The minimum size an object must be before it is compressed
 	 *   - timeout:             The read timeout in microseconds
 	 *   - connect_timeout:     The connect timeout in seconds
+	 *   - retry_timeout:       Time in seconds to wait before retrying a failed connect attempt
+	 *   - server_failure_limit:  Limit for server connect failures before it is removed
 	 *   - serializer:          May be either "php" or "igbinary". Igbinary produces more compact
 	 *                          values, but serialization is much slower unless the php.ini option
 	 *                          igbinary.compact_strings is off.
@@ -61,6 +63,14 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 			$params['serializer'] = 'php';
 		}
 
+		if ( isset( $params['retry_timeout'] ) ) {
+			$this->client->setOption( Memcached::OPT_RETRY_TIMEOUT, $params['retry_timeout'] );
+		}
+
+		if ( isset( $params['server_failure_limit'] ) ) {
+			$this->client->setOption( Memcached::OPT_SERVER_FAILURE_LIMIT, $params['server_failure_limit'] );
+		}
+
 		// The compression threshold is an undocumented php.ini option for some
 		// reason. There's probably not much harm in setting it globally, for
 		// compatibility with the settings for the PHP client.
@@ -87,13 +97,13 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 				break;
 			case 'igbinary':
 				if ( !Memcached::HAVE_IGBINARY ) {
-					throw new MWException( __CLASS__.': the igbinary extension is not available ' .
+					throw new MWException( __CLASS__ . ': the igbinary extension is not available ' .
 						'but igbinary serialization was requested.' );
 				}
 				$this->client->setOption( Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY );
 				break;
 			default:
-				throw new MWException( __CLASS__.': invalid value for serializer parameter' );
+				throw new MWException( __CLASS__ . ': invalid value for serializer parameter' );
 		}
 		$servers = array();
 		foreach ( $params['servers'] as $host ) {
diff --git a/includes/objectcache/MultiWriteBagOStuff.php b/includes/objectcache/MultiWriteBagOStuff.php
index 92afaacd..e550c0d0 100644
--- a/includes/objectcache/MultiWriteBagOStuff.php
+++ b/includes/objectcache/MultiWriteBagOStuff.php
@@ -43,7 +43,7 @@ class MultiWriteBagOStuff extends BagOStuff {
 	 */
 	public function __construct( $params ) {
 		if ( !isset( $params['caches'] ) ) {
-			throw new MWException( __METHOD__.': the caches parameter is required' );
+			throw new MWException( __METHOD__ . ': the caches parameter is required' );
 		}
 
 		$this->caches = array();
diff --git a/includes/objectcache/ObjectCache.php b/includes/objectcache/ObjectCache.php
index eafa836a..6c1433a9 100644
--- a/includes/objectcache/ObjectCache.php
+++ b/includes/objectcache/ObjectCache.php
@@ -34,7 +34,7 @@ class ObjectCache {
 	 *
 	 * @param $id string
 	 *
-	 * @return ObjectCache
+	 * @return BagOStuff
 	 */
 	static function getInstance( $id ) {
 		if ( isset( self::$instances[$id] ) ) {
@@ -59,7 +59,7 @@ class ObjectCache {
 	 * @param $id string
 	 *
 	 * @throws MWException
-	 * @return ObjectCache
+	 * @return BagOStuff
 	 */
 	static function newFromId( $id ) {
 		global $wgObjectCaches;
@@ -78,7 +78,7 @@ class ObjectCache {
 	 * @param $params array
 	 *
 	 * @throws MWException
-	 * @return ObjectCache
+	 * @return BagOStuff
 	 */
 	static function newFromParams( $params ) {
 		if ( isset( $params['factory'] ) ) {
@@ -102,7 +102,7 @@ class ObjectCache {
 	 * If no cache choice is configured (by default $wgMainCacheType is CACHE_NONE),
 	 * then CACHE_ANYTHING will forward to CACHE_DB.
 	 * @param $params array
-	 * @return ObjectCache
+	 * @return BagOStuff
 	 */
 	static function newAnything( $params ) {
 		global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType;
@@ -120,14 +120,14 @@ class ObjectCache {
 	 *
 	 * @param $params array
 	 * @throws MWException
-	 * @return ObjectCache
+	 * @return BagOStuff
 	 */
 	static function newAccelerator( $params ) {
 		if ( function_exists( 'apc_fetch' ) ) {
 			$id = 'apc';
-		} elseif( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) {
+		} elseif ( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) {
 			$id = 'xcache';
-		} elseif( function_exists( 'wincache_ucache_get' ) ) {
+		} elseif ( function_exists( 'wincache_ucache_get' ) ) {
 			$id = 'wincache';
 		} else {
 			throw new MWException( "CACHE_ACCEL requested but no suitable object " .
diff --git a/includes/objectcache/ObjectCacheSessionHandler.php b/includes/objectcache/ObjectCacheSessionHandler.php
index bc76294a..7cf960e7 100644
--- a/includes/objectcache/ObjectCacheSessionHandler.php
+++ b/includes/objectcache/ObjectCacheSessionHandler.php
@@ -94,7 +94,7 @@ class ObjectCacheSessionHandler {
 	 */
 	static function read( $id ) {
 		$data = self::getCache()->get( self::getKey( $id ) );
-		if( $data === false ) {
+		if ( $data === false ) {
 			return '';
 		}
 		return $data;
diff --git a/includes/objectcache/RedisBagOStuff.php b/includes/objectcache/RedisBagOStuff.php
index f9feaf9d..135e0e83 100644
--- a/includes/objectcache/RedisBagOStuff.php
+++ b/includes/objectcache/RedisBagOStuff.php
@@ -140,7 +140,13 @@ class RedisBagOStuff extends BagOStuff {
 				$conn->setex( $key, $expiry, $value );
 			}
 
-			$result = $conn->exec();
+			/*
+			 * multi()/exec() (transactional mode) allows multiple values to
+			 * be set/get at once and will return an array of results, in
+			 * the order they were set/get. In this case, we only set 1
+			 * value, which should (in case of success) result in true.
+			 */
+			$result = ( $conn->exec() == array( true ) );
 		} catch ( RedisException $e ) {
 			$result = false;
 			$this->handleException( $server, $conn, $e );
@@ -267,38 +273,6 @@ class RedisBagOStuff extends BagOStuff {
 		return $result;
 	}
 
-	/**
-	 * Non-atomic implementation of incr().
-	 *
-	 * Probably all callers actually want incr() to atomically initialise
-	 * values to zero if they don't exist, as provided by the Redis INCR
-	 * command. But we are constrained by the memcached-like interface to
-	 * return null in that case. Once the key exists, further increments are
-	 * atomic.
-	 */
-	public function incr( $key, $value = 1 ) {
-		wfProfileIn( __METHOD__ );
-		list( $server, $conn ) = $this->getConnection( $key );
-		if ( !$conn ) {
-			wfProfileOut( __METHOD__ );
-			return false;
-		}
-		if ( !$conn->exists( $key ) ) {
-			wfProfileOut( __METHOD__ );
-			return null;
-		}
-		try {
-			$result = $conn->incrBy( $key, $value );
-		} catch ( RedisException $e ) {
-			$result = false;
-			$this->handleException( $server, $conn, $e );
-		}
-
-		$this->logRequest( 'incr', $key, $server, $result );
-		wfProfileOut( __METHOD__ );
-		return $result;
-	}
-
 	/**
 	 * Get a Redis object with a connection suitable for fetching the specified key
 	 * @return Array (server, RedisConnRef) or (false, false)
diff --git a/includes/objectcache/SqlBagOStuff.php b/includes/objectcache/SqlBagOStuff.php
index 87f787d8..acf27036 100644
--- a/includes/objectcache/SqlBagOStuff.php
+++ b/includes/objectcache/SqlBagOStuff.php
@@ -222,8 +222,8 @@ class SqlBagOStuff extends BagOStuff {
 
 		$dataRows = array();
 		foreach ( $keysByTable as $serverIndex => $serverKeys ) {
-			$db = $this->getDB( $serverIndex );
 			try {
+				$db = $this->getDB( $serverIndex );
 				foreach ( $serverKeys as $tableName => $tableKeys ) {
 					$res = $db->select( $tableName,
 						array( 'keyname', 'value', 'exptime' ),
@@ -244,10 +244,10 @@ class SqlBagOStuff extends BagOStuff {
 			if ( isset( $dataRows[$key] ) ) { // HIT?
 				$row = $dataRows[$key];
 				$this->debug( "get: retrieved data; expiry time is " . $row->exptime );
-				$db = $this->getDB( $row->serverIndex );
-				if ( $this->isExpired( $db, $row->exptime ) ) { // MISS
-					$this->debug( "get: key has expired, deleting" );
-					try {
+				try {
+					$db = $this->getDB( $row->serverIndex );
+					if ( $this->isExpired( $db, $row->exptime ) ) { // MISS
+						$this->debug( "get: key has expired, deleting" );
 						$db->begin( __METHOD__ );
 						# Put the expiry time in the WHERE condition to avoid deleting a
 						# newly-inserted value
@@ -255,12 +255,12 @@ class SqlBagOStuff extends BagOStuff {
 							array( 'keyname' => $key, 'exptime' => $row->exptime ),
 							__METHOD__ );
 						$db->commit( __METHOD__ );
-					} catch ( DBQueryError $e ) {
-						$this->handleWriteError( $e, $row->serverIndex );
+						$values[$key] = false;
+					} else { // HIT
+						$values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
 					}
-					$values[$key] = false;
-				} else { // HIT
-					$values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
+				} catch ( DBQueryError $e ) {
+					$this->handleWriteError( $e, $row->serverIndex );
 				}
 			} else { // MISS
 				$values[$key] = false;
@@ -364,7 +364,7 @@ class SqlBagOStuff extends BagOStuff {
 			return false;
 		}
 
-		return (bool) $db->affectedRows();
+		return (bool)$db->affectedRows();
 	}
 
 	/**
diff --git a/includes/parser/CacheTime.php b/includes/parser/CacheTime.php
index 6b70e1da..8190a8a0 100644
--- a/includes/parser/CacheTime.php
+++ b/includes/parser/CacheTime.php
@@ -93,7 +93,7 @@ class CacheTime {
 			$expire = min( $expire, $wgParserCacheExpireTime );
 		}
 
-		if( $this->containsOldMagic() ) { //compatibility hack
+		if ( $this->containsOldMagic() ) { //compatibility hack
 			$expire = min( $expire, 3600 ); # 1 hour
 		}
 
diff --git a/includes/parser/CoreLinkFunctions.php b/includes/parser/CoreLinkFunctions.php
deleted file mode 100644
index 1cabf766..00000000
--- a/includes/parser/CoreLinkFunctions.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-/**
- * Link functions provided by MediaWiki core; experimental
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Parser
- */
-
-/**
- * Various core link functions, registered in Parser::firstCallInit()
- * @ingroup Parser
- */
-class CoreLinkFunctions {
-	/**
-	 * @param $parser Parser_LinkHooks
-	 * @return bool
-	 */
-	static function register( $parser ) {
-		$parser->setLinkHook( NS_CATEGORY, array( __CLASS__, 'categoryLinkHook' ) );
-		return true;
-	}
-
-	/**
-	 * @param $parser Parser
-	 * @param $holders LinkHolderArray
-	 * @param $markers LinkMarkerReplacer
-	 * @param Title $title
-	 * @param $titleText
-	 * @param null $displayText
-	 * @param bool $leadingColon
-	 * @return bool
-	 */
-	static function defaultLinkHook( $parser, $holders, $markers,
-			Title $title, $titleText, &$displayText = null, &$leadingColon = false ) {
-		if( isset( $displayText ) && $markers->findMarker( $displayText ) ) {
-			# There are links inside of the displayText
-			# For backwards compatibility the deepest links are dominant so this
-			# link should not be handled
-			$displayText = $markers->expand( $displayText );
-			# Return false so that this link is reverted back to WikiText
-			return false;
-		}
-		return $holders->makeHolder( $title, isset( $displayText ) ? $displayText : $titleText, array(), '', '' );
-	}
-
-	/**
-	 * @param  $parser Parser
-	 * @param  $holders LinkHolderArray
-	 * @param  $markers LinkMarkerReplacer
-	 * @param Title $title
-	 * @param  $titleText
-	 * @param null $sortText
-	 * @param bool $leadingColon
-	 * @return bool|string
-	 */
-	static function categoryLinkHook( $parser, $holders, $markers,
-			Title $title, $titleText, &$sortText = null, &$leadingColon = false ) {
-		global $wgContLang;
-		# When a category link starts with a : treat it as a normal link
-		if( $leadingColon ) return true;
-		if( isset( $sortText ) && $markers->findMarker( $sortText ) ) {
-			# There are links inside of the sortText
-			# For backwards compatibility the deepest links are dominant so this
-			# link should not be handled
-			$sortText = $markers->expand( $sortText );
-			# Return false so that this link is reverted back to WikiText
-			return false;
-		}
-		if( !isset( $sortText ) ) $sortText = $parser->getDefaultSort();
-		$sortText = Sanitizer::decodeCharReferences( $sortText );
-		$sortText = str_replace( "\n", '', $sortText );
-		$sortText = $wgContLang->convertCategoryKey( $sortText );
-		$parser->mOutput->addCategory( $title->getDBkey(), $sortText );
-		return '';
-	}
-
-}
diff --git a/includes/parser/CoreParserFunctions.php b/includes/parser/CoreParserFunctions.php
index cdd03aa4..4b6eeca2 100644
--- a/includes/parser/CoreParserFunctions.php
+++ b/includes/parser/CoreParserFunctions.php
@@ -88,6 +88,8 @@ class CoreParserFunctions {
 		$parser->setFunctionHook( 'pagenamee',        array( __CLASS__, 'pagenamee'        ), SFH_NO_HASH );
 		$parser->setFunctionHook( 'fullpagename',     array( __CLASS__, 'fullpagename'     ), SFH_NO_HASH );
 		$parser->setFunctionHook( 'fullpagenamee',    array( __CLASS__, 'fullpagenamee'    ), SFH_NO_HASH );
+		$parser->setFunctionHook( 'rootpagename',     array( __CLASS__, 'rootpagename'     ), SFH_NO_HASH );
+		$parser->setFunctionHook( 'rootpagenamee',    array( __CLASS__, 'rootpagenamee'    ), SFH_NO_HASH );
 		$parser->setFunctionHook( 'basepagename',     array( __CLASS__, 'basepagename'     ), SFH_NO_HASH );
 		$parser->setFunctionHook( 'basepagenamee',    array( __CLASS__, 'basepagenamee'    ), SFH_NO_HASH );
 		$parser->setFunctionHook( 'subpagename',      array( __CLASS__, 'subpagename'      ), SFH_NO_HASH );
@@ -137,9 +139,10 @@ class CoreParserFunctions {
 		$pref = $parser->getOptions()->getDateFormat();
 
 		// Specify a different default date format other than the the normal default
-		// iff the user has 'default' for their setting
-		if ( $pref == 'default' && $defaultPref )
+		// if the user has 'default' for their setting
+		if ( $pref == 'default' && $defaultPref ) {
 			$pref = $defaultPref;
+		}
 
 		$date = $df->reformat( $pref, $date, array( 'match-whole' ) );
 		return $date;
@@ -184,7 +187,7 @@ class CoreParserFunctions {
 		if ( is_null( $magicWords ) ) {
 			$magicWords = new MagicWordArray( array( 'url_path', 'url_query', 'url_wiki' ) );
 		}
-		switch( $magicWords->matchStartToEnd( $arg ) ) {
+		switch ( $magicWords->matchStartToEnd( $arg ) ) {
 
 			// Encode as though it's a wiki page, '_' for ' '.
 			case 'url_wiki':
@@ -248,14 +251,15 @@ class CoreParserFunctions {
 		# before arriving here; if that's true, then the title can't be created
 		# and the variable will fail. If we can't get a decent title from the first
 		# attempt, url-decode and try for a second.
-		if( is_null( $title ) )
+		if ( is_null( $title ) ) {
 			$title = Title::newFromURL( urldecode( $s ) );
-		if( !is_null( $title ) ) {
+		}
+		if ( !is_null( $title ) ) {
 			# Convert NS_MEDIA -> NS_FILE
-			if( $title->getNamespace() == NS_MEDIA ) {
+			if ( $title->getNamespace() == NS_MEDIA ) {
 				$title = Title::makeTitle( NS_FILE, $title->getDBkey() );
 			}
-			if( !is_null( $arg ) ) {
+			if ( !is_null( $arg ) ) {
 				$text = $title->$func( $arg );
 			} else {
 				$text = $title->$func();
@@ -359,30 +363,49 @@ class CoreParserFunctions {
 	static function displaytitle( $parser, $text = '' ) {
 		global $wgRestrictDisplayTitle;
 
-		#parse a limited subset of wiki markup (just the single quote items)
+		// parse a limited subset of wiki markup (just the single quote items)
 		$text = $parser->doQuotes( $text );
 
-		#remove stripped text (e.g. the UNIQ-QINU stuff) that was generated by tag extensions/whatever
+		// remove stripped text (e.g. the UNIQ-QINU stuff) that was generated by tag extensions/whatever
 		$text = preg_replace( '/' . preg_quote( $parser->uniqPrefix(), '/' ) . '.*?'
 			. preg_quote( Parser::MARKER_SUFFIX, '/' ) . '/', '', $text );
 
-		#list of disallowed tags for DISPLAYTITLE
-		#these will be escaped even though they are allowed in normal wiki text
+		// list of disallowed tags for DISPLAYTITLE
+		// these will be escaped even though they are allowed in normal wiki text
 		$bad = array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'blockquote', 'ol', 'ul', 'li', 'hr',
 			'table', 'tr', 'th', 'td', 'dl', 'dd', 'caption', 'p', 'ruby', 'rb', 'rt', 'rp', 'br' );
 
-		#only requested titles that normalize to the actual title are allowed through
-		#if $wgRestrictDisplayTitle is true (it is by default)
-		#mimic the escaping process that occurs in OutputPage::setPageTitle
-		$text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags( $text, null, array(), array(), $bad ) );
+		// disallow some styles that could be used to bypass $wgRestrictDisplayTitle
+		if ( $wgRestrictDisplayTitle ) {
+			$htmlTagsCallback = function ( &$params ) {
+				$decoded = Sanitizer::decodeTagAttributes( $params );
+
+				if ( isset( $decoded['style'] ) ) {
+					// this is called later anyway, but we need it right now for the regexes below to be safe
+					// calling it twice doesn't hurt
+					$decoded['style'] = Sanitizer::checkCss( $decoded['style'] );
+
+					if ( preg_match( '/(display|user-select|visibility)\s*:/i', $decoded['style'] ) ) {
+						$decoded['style'] = '/* attempt to bypass $wgRestrictDisplayTitle */';
+					}
+				}
+
+				$params = Sanitizer::safeEncodeTagAttributes( $decoded );
+			};
+		} else {
+			$htmlTagsCallback = null;
+		}
+
+		// only requested titles that normalize to the actual title are allowed through
+		// if $wgRestrictDisplayTitle is true (it is by default)
+		// mimic the escaping process that occurs in OutputPage::setPageTitle
+		$text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags( $text, $htmlTagsCallback, array(), array(), $bad ) );
 		$title = Title::newFromText( Sanitizer::stripAllTags( $text ) );
 
-		if( !$wgRestrictDisplayTitle ) {
+		if ( !$wgRestrictDisplayTitle ) {
+			$parser->mOutput->setDisplayTitle( $text );
+		} elseif ( $title instanceof Title && $title->getFragment() == '' && $title->equals( $parser->mTitle ) ) {
 			$parser->mOutput->setDisplayTitle( $text );
-		} else {
-			if ( $title instanceof Title && $title->getFragment() == '' && $title->equals( $parser->mTitle ) ) {
-				$parser->mOutput->setDisplayTitle( $text );
-			}
 		}
 
 		return '';
@@ -404,7 +427,7 @@ class CoreParserFunctions {
 	}
 
 	static function formatRaw( $num, $raw ) {
-		if( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
+		if ( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
 			return $num;
 		} else {
 			global $wgContLang;
@@ -433,12 +456,13 @@ class CoreParserFunctions {
 		return self::formatRaw( SiteStats::edits(), $raw );
 	}
 	static function numberofviews( $parser, $raw = null ) {
-		return self::formatRaw( SiteStats::views(), $raw );
+		global $wgDisableCounters;
+		return !$wgDisableCounters ? self::formatRaw( SiteStats::views(), $raw ) : '';
 	}
 	static function pagesinnamespace( $parser, $namespace = 0, $raw = null ) {
 		return self::formatRaw( SiteStats::pagesInNs( intval( $namespace ) ), $raw );
 	}
-	static function numberingroup( $parser, $name = '', $raw = null) {
+	static function numberingroup( $parser, $name = '', $raw = null ) {
 		return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), $raw );
 	}
 
@@ -451,44 +475,51 @@ class CoreParserFunctions {
 	 */
 	static function mwnamespace( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) )
+		if ( is_null( $t ) ) {
 			return '';
+		}
 		return str_replace( '_', ' ', $t->getNsText() );
 	}
 	static function namespacee( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) )
+		if ( is_null( $t ) ) {
 			return '';
+		}
 		return wfUrlencode( $t->getNsText() );
 	}
 	static function namespacenumber( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) )
+		if ( is_null( $t ) ) {
 			return '';
+		}
 		return $t->getNamespace();
 	}
 	static function talkspace( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) || !$t->canTalk() )
+		if ( is_null( $t ) || !$t->canTalk() ) {
 			return '';
+		}
 		return str_replace( '_', ' ', $t->getTalkNsText() );
 	}
 	static function talkspacee( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) || !$t->canTalk() )
+		if ( is_null( $t ) || !$t->canTalk() ) {
 			return '';
+		}
 		return wfUrlencode( $t->getTalkNsText() );
 	}
 	static function subjectspace( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) )
+		if ( is_null( $t ) ) {
 			return '';
+		}
 		return str_replace( '_', ' ', $t->getSubjectNsText() );
 	}
 	static function subjectspacee( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) )
+		if ( is_null( $t ) ) {
 			return '';
+		}
 		return wfUrlencode( $t->getSubjectNsText() );
 	}
 
@@ -499,75 +530,101 @@ class CoreParserFunctions {
 	 */
 	static function pagename( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) )
+		if ( is_null( $t ) ) {
 			return '';
+		}
 		return wfEscapeWikiText( $t->getText() );
 	}
 	static function pagenamee( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) )
+		if ( is_null( $t ) ) {
 			return '';
+		}
 		return wfEscapeWikiText( $t->getPartialURL() );
 	}
 	static function fullpagename( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) || !$t->canTalk() )
+		if ( is_null( $t ) || !$t->canTalk() ) {
 			return '';
+		}
 		return wfEscapeWikiText( $t->getPrefixedText() );
 	}
 	static function fullpagenamee( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) || !$t->canTalk() )
+		if ( is_null( $t ) || !$t->canTalk() ) {
 			return '';
+		}
 		return wfEscapeWikiText( $t->getPrefixedURL() );
 	}
 	static function subpagename( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) )
+		if ( is_null( $t ) ) {
 			return '';
+		}
 		return wfEscapeWikiText( $t->getSubpageText() );
 	}
 	static function subpagenamee( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) )
+		if ( is_null( $t ) ) {
 			return '';
+		}
 		return wfEscapeWikiText( $t->getSubpageUrlForm() );
 	}
+	static function rootpagename( $parser, $title = null ) {
+		$t = Title::newFromText( $title );
+		if ( is_null( $t ) ) {
+			return '';
+		}
+		return wfEscapeWikiText( $t->getRootText() );
+	}
+	static function rootpagenamee( $parser, $title = null ) {
+		$t = Title::newFromText( $title );
+		if ( is_null( $t ) ) {
+			return '';
+		}
+		return wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $t->getRootText() ) ) );
+	}
 	static function basepagename( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) )
+		if ( is_null( $t ) ) {
 			return '';
+		}
 		return wfEscapeWikiText( $t->getBaseText() );
 	}
 	static function basepagenamee( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) )
+		if ( is_null( $t ) ) {
 			return '';
+		}
 		return wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $t->getBaseText() ) ) );
 	}
 	static function talkpagename( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) || !$t->canTalk() )
+		if ( is_null( $t ) || !$t->canTalk() ) {
 			return '';
+		}
 		return wfEscapeWikiText( $t->getTalkPage()->getPrefixedText() );
 	}
 	static function talkpagenamee( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) || !$t->canTalk() )
+		if ( is_null( $t ) || !$t->canTalk() ) {
 			return '';
-		return wfEscapeWikiText( $t->getTalkPage()->getPrefixedUrl() );
+		}
+		return wfEscapeWikiText( $t->getTalkPage()->getPrefixedURL() );
 	}
 	static function subjectpagename( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) )
+		if ( is_null( $t ) ) {
 			return '';
+		}
 		return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedText() );
 	}
 	static function subjectpagenamee( $parser, $title = null ) {
 		$t = Title::newFromText( $title );
-		if ( is_null( $t ) )
+		if ( is_null( $t ) ) {
 			return '';
-		return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedUrl() );
+		}
+		return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedURL() );
 	}
 
 	/**
@@ -577,6 +634,7 @@ class CoreParserFunctions {
 	 * @return string
 	 */
 	static function pagesincategory( $parser, $name = '', $arg1 = null, $arg2 = null ) {
+		global $wgContLang;
 		static $magicWords = null;
 		if ( is_null( $magicWords ) ) {
 			$magicWords = new MagicWordArray( array(
@@ -589,7 +647,7 @@ class CoreParserFunctions {
 		static $cache = array();
 
 		// split the given option to its variable
-		if( self::matchAgainstMagicword( 'rawsuffix', $arg1 ) ) {
+		if ( self::matchAgainstMagicword( 'rawsuffix', $arg1 ) ) {
 			//{{pagesincategory:|raw[|type]}}
 			$raw = $arg1;
 			$type = $magicWords->matchStartToEnd( $arg2 );
@@ -598,23 +656,24 @@ class CoreParserFunctions {
 			$type = $magicWords->matchStartToEnd( $arg1 );
 			$raw = $arg2;
 		}
-		if( !$type ) { //backward compatibility
+		if ( !$type ) { //backward compatibility
 			$type = 'pagesincategory_all';
 		}
 
 		$title = Title::makeTitleSafe( NS_CATEGORY, $name );
-		if( !$title ) { # invalid title
+		if ( !$title ) { # invalid title
 			return self::formatRaw( 0, $raw );
 		}
+		$wgContLang->findVariantLink( $name, $title, true );
 
 		// Normalize name for cache
 		$name = $title->getDBkey();
 
-		if( !isset( $cache[$name] ) ) {
+		if ( !isset( $cache[$name] ) ) {
 			$category = Category::newFromTitle( $title );
 
 			$allCount = $subcatCount = $fileCount = $pagesCount = 0;
-			if( $parser->incrementExpensiveFunctionCount() ) {
+			if ( $parser->incrementExpensiveFunctionCount() ) {
 				// $allCount is the total number of cat members,
 				// not the count of how many members are normal pages.
 				$allCount = (int)$category->getPageCount();
@@ -636,8 +695,6 @@ class CoreParserFunctions {
 	 * Return the size of the given page, or 0 if it's nonexistent.  This is an
 	 * expensive parser function and can't be called too many times per page.
 	 *
-	 * @todo FIXME: This doesn't work correctly on preview for getting the size
-	 *   of the current page.
 	 * @todo FIXME: Title::getLength() documentation claims that it adds things
 	 *   to the link cache, so the local cache here should be unnecessary, but
 	 *   in fact calling getLength() repeatedly for the same $page does seem to
@@ -645,15 +702,15 @@ class CoreParserFunctions {
 	 * @todo Document parameters
 	 *
 	 * @param $parser Parser
-	 * @param string $page TODO DOCUMENT (Default: empty string)
-	 * @param $raw TODO DOCUMENT (Default: null)
+	 * @param $page String Name of page to check (Default: empty string)
+	 * @param $raw String Should number be human readable with commas or just number
 	 * @return string
 	 */
 	static function pagesize( $parser, $page = '', $raw = null ) {
 		static $cache = array();
 		$title = Title::newFromText( $page );
 
-		if( !is_object( $title ) ) {
+		if ( !is_object( $title ) ) {
 			$cache[$page] = 0;
 			return self::formatRaw( 0, $raw );
 		}
@@ -662,9 +719,9 @@ class CoreParserFunctions {
 		$page = $title->getPrefixedText();
 
 		$length = 0;
-		if( isset( $cache[$page] ) ) {
+		if ( isset( $cache[$page] ) ) {
 			$length = $cache[$page];
-		} elseif( $parser->incrementExpensiveFunctionCount() ) {
+		} elseif ( $parser->incrementExpensiveFunctionCount() ) {
 			$rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
 			$pageID = $rev ? $rev->getPage() : 0;
 			$revID = $rev ? $rev->getId() : 0;
@@ -717,7 +774,9 @@ class CoreParserFunctions {
 	static function pad( $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) {
 		$padding = $parser->killMarkers( $padding );
 		$lengthOfPadding = mb_strlen( $padding );
-		if ( $lengthOfPadding == 0 ) return $string;
+		if ( $lengthOfPadding == 0 ) {
+			return $string;
+		}
 
 		# The remaining length to add counts down to 0 as padding is added
 		$length = min( $length, 500 ) - mb_strlen( $string );
@@ -762,7 +821,9 @@ class CoreParserFunctions {
 			$title = SpecialPage::getTitleFor( $page, $subpage );
 			return $title->getPrefixedText();
 		} else {
-			return wfMessage( 'nosuchspecialpage' )->inContentLanguage()->text();
+			// unknown special page, just use the given text as its title, if at all possible
+			$title = Title::makeTitleSafe( NS_SPECIAL, $text );
+			return $title ? $title->getPrefixedText() : self::special( $parser, 'Badtitle' );
 		}
 	}
 
@@ -786,19 +847,25 @@ class CoreParserFunctions {
 		$arg = $magicWords->matchStartToEnd( $uarg );
 
 		$text = trim( $text );
-		if( strlen( $text ) == 0 )
+		if ( strlen( $text ) == 0 ) {
 			return '';
+		}
 		$old = $parser->getCustomDefaultSort();
 		if ( $old === false || $arg !== 'defaultsort_noreplace' ) {
 			$parser->setDefaultSort( $text );
 		}
 
-		if( $old === false || $old == $text || $arg ) {
+		if ( $old === false || $old == $text || $arg ) {
 			return '';
 		} else {
-			return( '<span class="error">' .
-				wfMessage( 'duplicate-defaultsort', $old, $text )->inContentLanguage()->escaped() .
-				'</span>' );
+			$converter = $parser->getConverterLanguage()->getConverter();
+			return '<span class="error">' .
+				wfMessage( 'duplicate-defaultsort',
+					// Message should be parsed, but these params should only be escaped.
+					$converter->markNoConversion( wfEscapeWikiText( $old ) ),
+					$converter->markNoConversion( wfEscapeWikiText( $text ) )
+				)->inContentLanguage()->text() .
+				'</span>';
 		}
 	}
 
@@ -807,14 +874,14 @@ class CoreParserFunctions {
 	public static function filepath( $parser, $name = '', $argA = '', $argB = '' ) {
 		$file = wfFindFile( $name );
 
-		if( $argA == 'nowiki' ) {
+		if ( $argA == 'nowiki' ) {
 			// {{filepath: | option [| size] }}
 			$isNowiki = true;
 			$parsedWidthParam = $parser->parseWidthParam( $argB );
 		} else {
 			// {{filepath: [| size [|option]] }}
 			$parsedWidthParam = $parser->parseWidthParam( $argA );
-			$isNowiki = ($argB == 'nowiki');
+			$isNowiki = ( $argB == 'nowiki' );
 		}
 
 		if ( $file ) {
diff --git a/includes/parser/CoreTagHooks.php b/includes/parser/CoreTagHooks.php
index 65051839..a2eb6987 100644
--- a/includes/parser/CoreTagHooks.php
+++ b/includes/parser/CoreTagHooks.php
@@ -77,7 +77,7 @@ class CoreTagHooks {
 	 */
 	static function html( $content, $attributes, $parser ) {
 		global $wgRawHtml;
-		if( $wgRawHtml ) {
+		if ( $wgRawHtml ) {
 			return array( $content, 'markerType' => 'nowiki' );
 		} else {
 			throw new MWException( '<html> extension tag encountered unexpectedly' );
diff --git a/includes/parser/DateFormatter.php b/includes/parser/DateFormatter.php
index a2da3074..0a69b045 100644
--- a/includes/parser/DateFormatter.php
+++ b/includes/parser/DateFormatter.php
@@ -156,10 +156,10 @@ class DateFormatter {
 		}
 		for ( $i = 1; $i <= self::LAST; $i++ ) {
 			$this->mSource = $i;
-			if ( isset ( $this->rules[$preference][$i] ) ) {
+			if ( isset( $this->rules[$preference][$i] ) ) {
 				# Specific rules
 				$this->mTarget = $this->rules[$preference][$i];
-			} elseif ( isset ( $this->rules[self::ALL][$i] ) ) {
+			} elseif ( isset( $this->rules[self::ALL][$i] ) ) {
 				# General rules
 				$this->mTarget = $this->rules[self::ALL][$i];
 			} elseif ( $preference ) {
@@ -198,14 +198,15 @@ class DateFormatter {
 	function replace( $matches ) {
 		# Extract information from $matches
 		$linked = true;
-		if ( isset( $this->mLinked ) )
+		if ( isset( $this->mLinked ) ) {
 			$linked = $this->mLinked;
+		}
 
 		$bits = array();
 		$key = $this->keys[$this->mSource];
 		for ( $p = 0; $p < strlen( $key ); $p++ ) {
 			if ( $key[$p] != ' ' ) {
-				$bits[$key[$p]] = $matches[$p+1];
+				$bits[$key[$p]] = $matches[$p + 1];
 			}
 		}
 
@@ -232,10 +233,12 @@ class DateFormatter {
 		$fail = false;
 
 		// Pre-generate y/Y stuff because we need the year for the <span> title.
-		if ( !isset( $bits['y'] ) && isset( $bits['Y'] ) )
+		if ( !isset( $bits['y'] ) && isset( $bits['Y'] ) ) {
 			$bits['y'] = $this->makeIsoYear( $bits['Y'] );
-		if ( !isset( $bits['Y'] ) && isset( $bits['y'] ) )
+		}
+		if ( !isset( $bits['Y'] ) && isset( $bits['y'] ) ) {
 			$bits['Y'] = $this->makeNormalYear( $bits['y'] );
+		}
 
 		if ( !isset( $bits['m'] ) ) {
 			$m = $this->makeIsoMonth( $bits['F'] );
@@ -293,8 +296,9 @@ class DateFormatter {
 		}
 
 		$isoBits = array();
-		if ( isset( $bits['y'] ) )
+		if ( isset( $bits['y'] ) ) {
 			$isoBits[] = $bits['y'];
+		}
 		$isoBits[] = $bits['m'];
 		$isoBits[] = $bits['d'];
 		$isoDate = implode( '-', $isoBits );
@@ -312,7 +316,7 @@ class DateFormatter {
 	 */
 	function getMonthRegex() {
 		$names = array();
-		for( $i = 1; $i <= 12; $i++ ) {
+		for ( $i = 1; $i <= 12; $i++ ) {
 			$names[] = $this->lang->getMonthName( $i );
 			$names[] = $this->lang->getMonthAbbreviation( $i );
 		}
@@ -337,7 +341,7 @@ class DateFormatter {
 	function makeIsoYear( $year ) {
 		# Assumes the year is in a nice format, as enforced by the regex
 		if ( substr( $year, -2 ) == 'BC' ) {
-			$num = intval(substr( $year, 0, -3 )) - 1;
+			$num = intval( substr( $year, 0, -3 ) ) - 1;
 			# PHP bug note: sprintf( "%04d", -1 ) fails poorly
 			$text = sprintf( '-%04d', $num );
 
@@ -353,7 +357,7 @@ class DateFormatter {
 	 */
 	function makeNormalYear( $iso ) {
 		if ( $iso[0] == '-' ) {
-			$text = (intval( substr( $iso, 1 ) ) + 1) . ' BC';
+			$text = ( intval( substr( $iso, 1 ) ) + 1 ) . ' BC';
 		} else {
 			$text = intval( $iso );
 		}
diff --git a/includes/parser/LinkHolderArray.php b/includes/parser/LinkHolderArray.php
index 49b2d333..27ff9e7d 100644
--- a/includes/parser/LinkHolderArray.php
+++ b/includes/parser/LinkHolderArray.php
@@ -281,88 +281,90 @@ class LinkHolderArray {
 		$linkCache = LinkCache::singleton();
 		$output = $this->parent->getOutput();
 
-		wfProfileIn( __METHOD__ . '-check' );
-		$dbr = wfGetDB( DB_SLAVE );
-		$threshold = $this->parent->getOptions()->getStubThreshold();
+		if( $linkCache->useDatabase() ) {
+			wfProfileIn( __METHOD__ . '-check' );
+			$dbr = wfGetDB( DB_SLAVE );
+			$threshold = $this->parent->getOptions()->getStubThreshold();
 
-		# Sort by namespace
-		ksort( $this->internals );
+			# Sort by namespace
+			ksort( $this->internals );
 
-		$linkcolour_ids = array();
+			$linkcolour_ids = array();
 
-		# Generate query
-		$queries = array();
-		foreach ( $this->internals as $ns => $entries ) {
-			foreach ( $entries as $entry ) {
-				$title = $entry['title'];
-				$pdbk = $entry['pdbk'];
+			# Generate query
+			$queries = array();
+			foreach ( $this->internals as $ns => $entries ) {
+				foreach ( $entries as $entry ) {
+					$title = $entry['title'];
+					$pdbk = $entry['pdbk'];
 
-				# Skip invalid entries.
-				# Result will be ugly, but prevents crash.
-				if ( is_null( $title ) ) {
-					continue;
-				}
+					# Skip invalid entries.
+					# Result will be ugly, but prevents crash.
+					if ( is_null( $title ) ) {
+						continue;
+					}
 
-				# Check if it's a static known link, e.g. interwiki
-				if ( $title->isAlwaysKnown() ) {
-					$colours[$pdbk] = '';
-				} elseif ( $ns == NS_SPECIAL ) {
-					$colours[$pdbk] = 'new';
-				} elseif ( ( $id = $linkCache->getGoodLinkID( $pdbk ) ) != 0 ) {
-					$colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
-					$output->addLink( $title, $id );
-					$linkcolour_ids[$id] = $pdbk;
-				} elseif ( $linkCache->isBadLink( $pdbk ) ) {
-					$colours[$pdbk] = 'new';
-				} else {
-					# Not in the link cache, add it to the query
-					$queries[$ns][] = $title->getDBkey();
+					# Check if it's a static known link, e.g. interwiki
+					if ( $title->isAlwaysKnown() ) {
+						$colours[$pdbk] = '';
+					} elseif ( $ns == NS_SPECIAL ) {
+						$colours[$pdbk] = 'new';
+					} elseif ( ( $id = $linkCache->getGoodLinkID( $pdbk ) ) != 0 ) {
+						$colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
+						$output->addLink( $title, $id );
+						$linkcolour_ids[$id] = $pdbk;
+					} elseif ( $linkCache->isBadLink( $pdbk ) ) {
+						$colours[$pdbk] = 'new';
+					} else {
+						# Not in the link cache, add it to the query
+						$queries[$ns][] = $title->getDBkey();
+					}
 				}
 			}
-		}
-		if ( $queries ) {
-			$where = array();
-			foreach( $queries as $ns => $pages ) {
-				$where[] = $dbr->makeList(
-					array(
-						'page_namespace' => $ns,
-						'page_title' => $pages,
-					),
-					LIST_AND
-				);
-			}
+			if ( $queries ) {
+				$where = array();
+				foreach ( $queries as $ns => $pages ) {
+					$where[] = $dbr->makeList(
+						array(
+							'page_namespace' => $ns,
+							'page_title' => $pages,
+						),
+						LIST_AND
+					);
+				}
 
-			$res = $dbr->select(
-				'page',
-				array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect', 'page_len', 'page_latest' ),
-				$dbr->makeList( $where, LIST_OR ),
-				__METHOD__
-			);
+				$res = $dbr->select(
+					'page',
+					array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect', 'page_len', 'page_latest' ),
+					$dbr->makeList( $where, LIST_OR ),
+					__METHOD__
+				);
 
-			# Fetch data and form into an associative array
-			# non-existent = broken
-			foreach ( $res as $s ) {
-				$title = Title::makeTitle( $s->page_namespace, $s->page_title );
-				$pdbk = $title->getPrefixedDBkey();
-				$linkCache->addGoodLinkObjFromRow( $title, $s );
-				$output->addLink( $title, $s->page_id );
-				# @todo FIXME: Convoluted data flow
-				# The redirect status and length is passed to getLinkColour via the LinkCache
-				# Use formal parameters instead
-				$colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
-				//add id to the extension todolist
-				$linkcolour_ids[$s->page_id] = $pdbk;
+				# Fetch data and form into an associative array
+				# non-existent = broken
+				foreach ( $res as $s ) {
+					$title = Title::makeTitle( $s->page_namespace, $s->page_title );
+					$pdbk = $title->getPrefixedDBkey();
+					$linkCache->addGoodLinkObjFromRow( $title, $s );
+					$output->addLink( $title, $s->page_id );
+					# @todo FIXME: Convoluted data flow
+					# The redirect status and length is passed to getLinkColour via the LinkCache
+					# Use formal parameters instead
+					$colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
+					//add id to the extension todolist
+					$linkcolour_ids[$s->page_id] = $pdbk;
+				}
+				unset( $res );
 			}
-			unset( $res );
-		}
-		if ( count( $linkcolour_ids ) ) {
-			//pass an array of page_ids to an extension
-			wfRunHooks( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
+			if ( count( $linkcolour_ids ) ) {
+				//pass an array of page_ids to an extension
+				wfRunHooks( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
+			}
+			wfProfileOut( __METHOD__ . '-check' );
 		}
-		wfProfileOut( __METHOD__ . '-check' );
 
 		# Do a second query for different language variants of links and categories
-		if( $wgContLang->hasVariants() ) {
+		if ( $wgContLang->hasVariants() ) {
 			$this->doVariants( $colours );
 		}
 
@@ -377,6 +379,10 @@ class LinkHolderArray {
 				$key = "$ns:$index";
 				$searchkey = "<!--LINK $key-->";
 				$displayText = $entry['text'];
+				if ( isset( $entry['selflink'] ) ) {
+					$replacePairs[$searchkey] = Linker::makeSelfLinkObj( $title, $displayText, $query );
+					continue;
+				}
 				if ( $displayText === '' ) {
 					$displayText = null;
 				}
@@ -406,7 +412,8 @@ class LinkHolderArray {
 		$text = preg_replace_callback(
 			'/(<!--LINK .*?-->)/',
 			$replacer->cb(),
-			$text);
+			$text
+		);
 
 		wfProfileOut( __METHOD__ . '-replace' );
 		wfProfileOut( __METHOD__ );
@@ -424,7 +431,7 @@ class LinkHolderArray {
 		# Make interwiki link HTML
 		$output = $this->parent->getOutput();
 		$replacePairs = array();
-		foreach( $this->interwikis as $key => $link ) {
+		foreach ( $this->interwikis as $key => $link ) {
 			$replacePairs[$key] = Linker::link( $link['title'], $link['text'] );
 			$output->addInterwikiLink( $link['title'] );
 		}
@@ -454,20 +461,17 @@ class LinkHolderArray {
 		// single string to all variants. This would improve parser's performance
 		// significantly.
 		foreach ( $this->internals as $ns => $entries ) {
+			if ( $ns == NS_SPECIAL ) {
+				continue;
+			}
 			foreach ( $entries as $index => $entry ) {
 				$pdbk = $entry['pdbk'];
 				// we only deal with new links (in its first query)
 				if ( !isset( $colours[$pdbk] ) || $colours[$pdbk] === 'new' ) {
-					$title = $entry['title'];
-					$titleText = $title->getText();
-					$titlesAttrs[] = array(
-						'ns' => $ns,
-						'key' => "$ns:$index",
-						'titleText' => $titleText,
-					);
+					$titlesAttrs[] = array( $index, $entry['title'] );
 					// separate titles with \0 because it would never appears
 					// in a valid title
-					$titlesToBeConverted .= $titleText . "\0";
+					$titlesToBeConverted .= $entry['title']->getText() . "\0";
 				}
 			}
 		}
@@ -478,19 +482,35 @@ class LinkHolderArray {
 		foreach ( $titlesAllVariants as &$titlesVariant ) {
 			$titlesVariant = explode( "\0", $titlesVariant );
 		}
-		$l = count( $titlesAttrs );
+
 		// Then add variants of links to link batch
-		for ( $i = 0; $i < $l; $i ++ ) {
+		$parentTitle = $this->parent->getTitle();
+		foreach ( $titlesAttrs as $i => $attrs ) {
+			list( $index, $title ) = $attrs;
+			$ns = $title->getNamespace();
+			$text = $title->getText();
+
 			foreach ( $allVariantsName as $variantName ) {
 				$textVariant = $titlesAllVariants[$variantName][$i];
-				if ( $textVariant != $titlesAttrs[$i]['titleText'] ) {
-					$variantTitle = Title::makeTitle( $titlesAttrs[$i]['ns'], $textVariant );
-					if( is_null( $variantTitle ) ) {
-						continue;
-					}
-					$linkBatch->addObj( $variantTitle );
-					$variantMap[$variantTitle->getPrefixedDBkey()][] = $titlesAttrs[$i]['key'];
+				if ( $textVariant === $text ) {
+					continue;
 				}
+
+				$variantTitle = Title::makeTitle( $ns, $textVariant );
+				if ( is_null( $variantTitle ) ) {
+					continue;
+				}
+
+				// Self-link checking for mixed/different variant titles. At this point, we
+				// already know the exact title does not exist, so the link cannot be to a
+				// variant of the current title that exists as a separate page.
+				if ( $variantTitle->equals( $parentTitle ) && $title->getFragment() === '' ) {
+					$this->internals[$ns][$index]['selflink'] = true;
+					continue 2;
+				}
+
+				$linkBatch->addObj( $variantTitle );
+				$variantMap[$variantTitle->getPrefixedDBkey()][] = "$ns:$index";
 			}
 		}
 
@@ -513,7 +533,7 @@ class LinkHolderArray {
 			}
 		}
 
-		if( !$linkBatch->isEmpty() ) {
+		if ( !$linkBatch->isEmpty() ) {
 			// construct query
 			$dbr = wfGetDB( DB_SLAVE );
 			$varRes = $dbr->select( 'page',
@@ -532,14 +552,14 @@ class LinkHolderArray {
 				$vardbk = $variantTitle->getDBkey();
 
 				$holderKeys = array();
-				if( isset( $variantMap[$varPdbk] ) ) {
+				if ( isset( $variantMap[$varPdbk] ) ) {
 					$holderKeys = $variantMap[$varPdbk];
 					$linkCache->addGoodLinkObjFromRow( $variantTitle, $s );
 					$output->addLink( $variantTitle, $s->page_id );
 				}
 
 				// loop over link holders
-				foreach( $holderKeys as $key ) {
+				foreach ( $holderKeys as $key ) {
 					list( $ns, $index ) = explode( ':', $key, 2 );
 					$entry =& $this->internals[$ns][$index];
 					$pdbk = $entry['pdbk'];
@@ -569,12 +589,12 @@ class LinkHolderArray {
 			wfRunHooks( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
 
 			// rebuild the categories in original order (if there are replacements)
-			if( count( $varCategories ) > 0 ) {
+			if ( count( $varCategories ) > 0 ) {
 				$newCats = array();
 				$originalCats = $output->getCategories();
-				foreach( $originalCats as $cat => $sortkey ) {
+				foreach ( $originalCats as $cat => $sortkey ) {
 					// make the replacement
-					if( array_key_exists( $cat, $varCategories ) ) {
+					if ( array_key_exists( $cat, $varCategories ) ) {
 						$newCats[$varCategories[$cat]] = $sortkey;
 					} else {
 						$newCats[$cat] = $sortkey;
@@ -614,13 +634,13 @@ class LinkHolderArray {
 	function replaceTextCallback( $matches ) {
 		$type = $matches[1];
 		$key = $matches[2];
-		if( $type == 'LINK' ) {
+		if ( $type == 'LINK' ) {
 			list( $ns, $index ) = explode( ':', $key, 2 );
-			if( isset( $this->internals[$ns][$index]['text'] ) ) {
+			if ( isset( $this->internals[$ns][$index]['text'] ) ) {
 				return $this->internals[$ns][$index]['text'];
 			}
-		} elseif( $type == 'IWLINK' ) {
-			if( isset( $this->interwikis[$key]['text'] ) ) {
+		} elseif ( $type == 'IWLINK' ) {
+			if ( isset( $this->interwikis[$key]['text'] ) ) {
 				return $this->interwikis[$key]['text'];
 			}
 		}
diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php
index 5ef0bc71..1f14223d 100644
--- a/includes/parser/Parser.php
+++ b/includes/parser/Parser.php
@@ -28,7 +28,7 @@
 /**
  * PHP Parser - Processes wiki markup (which uses a more user-friendly
  * syntax, such as "[[link]]" for making links), and provides a one-way
- * transformation of that wiki markup it into XHTML output / markup
+ * transformation of that wiki markup it into (X)HTML output / markup
  * (which in turn the browser understands, and can display).
  *
  * There are seven main entry points into the Parser class:
@@ -54,7 +54,6 @@
  * @warning $wgUser or $wgTitle or $wgRequest or $wgLang. Keep them away!
  *
  * @par Settings:
- * $wgLocaltimezone
  * $wgNamespacesWithSubpages
  *
  * @par Settings only within ParserOptions:
@@ -116,6 +115,10 @@ class Parser {
 	# Marker Suffix needs to be accessible staticly.
 	const MARKER_SUFFIX = "-QINU\x7f";
 
+	# Markers used for wrapping the table of contents
+	const TOC_START = '<mw:toc>';
+	const TOC_END = '</mw:toc>';
+
 	# Persistent:
 	var $mTagHooks = array();
 	var $mTransparentTagHooks = array();
@@ -192,7 +195,9 @@ class Parser {
 	var $mRevisionId;   # ID to display in {{REVISIONID}} tags
 	var $mRevisionTimestamp; # The timestamp of the specified revision ID
 	var $mRevisionUser; # User to display in {{REVISIONUSER}} tag
+	var $mRevisionSize; # Size to display in {{REVISIONSIZE}} variable
 	var $mRevIdForTs;   # The revision ID which was used to fetch the timestamp
+	var $mInputSize = false; # For {{PAGESIZE}} on current page.
 
 	/**
 	 * @var string
@@ -218,8 +223,8 @@ class Parser {
 			self::EXT_LINK_URL_CLASS . '+)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
 		if ( isset( $conf['preprocessorClass'] ) ) {
 			$this->mPreprocessorClass = $conf['preprocessorClass'];
-		} elseif ( defined( 'MW_COMPILED' ) ) {
-			# Preprocessor_Hash is much faster than Preprocessor_DOM in compiled mode
+		} elseif ( defined( 'HPHP_VERSION' ) ) {
+			# Preprocessor_Hash is much faster than Preprocessor_DOM under HipHop
 			$this->mPreprocessorClass = 'Preprocessor_Hash';
 		} elseif ( extension_loaded( 'domxml' ) ) {
 			# PECL extension that conflicts with the core DOM extension (bug 13770)
@@ -292,7 +297,7 @@ class Parser {
 		$this->mLinkHolders = new LinkHolderArray( $this );
 		$this->mLinkID = 0;
 		$this->mRevisionObject = $this->mRevisionTimestamp =
-			$this->mRevisionId = $this->mRevisionUser = null;
+			$this->mRevisionId = $this->mRevisionUser = $this->mRevisionSize = null;
 		$this->mVarCache = array();
 		$this->mUser = null;
 		$this->mLangLinkLanguages = array();
@@ -354,13 +359,18 @@ class Parser {
 		 * to internalParse() which does all the real work.
 		 */
 
-		global $wgUseTidy, $wgAlwaysUseTidy;
+		global $wgUseTidy, $wgAlwaysUseTidy, $wgShowHostnames;
 		$fname = __METHOD__ . '-' . wfGetCaller();
 		wfProfileIn( __METHOD__ );
 		wfProfileIn( $fname );
 
 		$this->startParse( $title, $options, self::OT_HTML, $clearState );
 
+		$this->mInputSize = strlen( $text );
+		if ( $this->mOptions->getEnableLimitReport() ) {
+			$this->mOutput->resetParseStartTime();
+		}
+
 		# Remove the strip marker tag prefix from the input, if present.
 		if ( $clearState ) {
 			$text = str_replace( $this->mUniqPrefix, '', $text );
@@ -370,11 +380,13 @@ class Parser {
 		$oldRevisionObject = $this->mRevisionObject;
 		$oldRevisionTimestamp = $this->mRevisionTimestamp;
 		$oldRevisionUser = $this->mRevisionUser;
+		$oldRevisionSize = $this->mRevisionSize;
 		if ( $revid !== null ) {
 			$this->mRevisionId = $revid;
 			$this->mRevisionObject = null;
 			$this->mRevisionTimestamp = null;
 			$this->mRevisionUser = null;
+			$this->mRevisionSize = null;
 		}
 
 		wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState ) );
@@ -490,22 +502,67 @@ class Parser {
 		# Information on include size limits, for the benefit of users who try to skirt them
 		if ( $this->mOptions->getEnableLimitReport() ) {
 			$max = $this->mOptions->getMaxIncludeSize();
-			$PFreport = "Expensive parser function count: {$this->mExpensiveFunctionCount}/{$this->mOptions->getExpensiveParserFunctionLimit()}\n";
-			$limitReport =
-				"NewPP limit report\n" .
-				"Preprocessor visited node count: {$this->mPPNodeCount}/{$this->mOptions->getMaxPPNodeCount()}\n" .
-				"Preprocessor generated node count: " .
-					"{$this->mGeneratedPPNodeCount}/{$this->mOptions->getMaxGeneratedPPNodeCount()}\n" .
-				"Post-expand include size: {$this->mIncludeSizes['post-expand']}/$max bytes\n" .
-				"Template argument size: {$this->mIncludeSizes['arg']}/$max bytes\n" .
-				"Highest expansion depth: {$this->mHighestExpansionDepth}/{$this->mOptions->getMaxPPExpandDepth()}\n" .
-				$PFreport;
+
+			$cpuTime = $this->mOutput->getTimeSinceStart( 'cpu' );
+			if ( $cpuTime !== null ) {
+				$this->mOutput->setLimitReportData( 'limitreport-cputime',
+					sprintf( "%.3f", $cpuTime )
+				);
+			}
+
+			$wallTime = $this->mOutput->getTimeSinceStart( 'wall' );
+			$this->mOutput->setLimitReportData( 'limitreport-walltime',
+				sprintf( "%.3f", $wallTime )
+			);
+
+			$this->mOutput->setLimitReportData( 'limitreport-ppvisitednodes',
+				array( $this->mPPNodeCount, $this->mOptions->getMaxPPNodeCount() )
+			);
+			$this->mOutput->setLimitReportData( 'limitreport-ppgeneratednodes',
+				array( $this->mGeneratedPPNodeCount, $this->mOptions->getMaxGeneratedPPNodeCount() )
+			);
+			$this->mOutput->setLimitReportData( 'limitreport-postexpandincludesize',
+				array( $this->mIncludeSizes['post-expand'], $max )
+			);
+			$this->mOutput->setLimitReportData( 'limitreport-templateargumentsize',
+				array( $this->mIncludeSizes['arg'], $max )
+			);
+			$this->mOutput->setLimitReportData( 'limitreport-expansiondepth',
+				array( $this->mHighestExpansionDepth, $this->mOptions->getMaxPPExpandDepth() )
+			);
+			$this->mOutput->setLimitReportData( 'limitreport-expensivefunctioncount',
+				array( $this->mExpensiveFunctionCount, $this->mOptions->getExpensiveParserFunctionLimit() )
+			);
+			wfRunHooks( 'ParserLimitReportPrepare', array( $this, $this->mOutput ) );
+
+			$limitReport = "NewPP limit report\n";
+			if ( $wgShowHostnames ) {
+				$limitReport .= 'Parsed by ' . wfHostname() . "\n";
+			}
+			foreach ( $this->mOutput->getLimitReportData() as $key => $value ) {
+				if ( wfRunHooks( 'ParserLimitReportFormat',
+					array( $key, $value, &$limitReport, false, false )
+				) ) {
+					$keyMsg = wfMessage( $key )->inLanguage( 'en' )->useDatabase( false );
+					$valueMsg = wfMessage( array( "$key-value-text", "$key-value" ) )
+						->inLanguage( 'en' )->useDatabase( false );
+					if ( !$valueMsg->exists() ) {
+						$valueMsg = new RawMessage( '$1' );
+					}
+					if ( !$keyMsg->isDisabled() && !$valueMsg->isDisabled() ) {
+						$valueMsg->params( $value );
+						$limitReport .= "{$keyMsg->text()}: {$valueMsg->text()}\n";
+					}
+				}
+			}
+			// Since we're not really outputting HTML, decode the entities and
+			// then re-encode the things that need hiding inside HTML comments.
+			$limitReport = htmlspecialchars_decode( $limitReport );
 			wfRunHooks( 'ParserLimitReport', array( $this, &$limitReport ) );
 
 			// Sanitize for comment. Note '‐' in the replacement is U+2010,
 			// which looks much like the problematic '-'.
 			$limitReport = str_replace( array( '-', '&' ), array( '‐', '&amp;' ), $limitReport );
-
 			$text .= "\n<!-- \n$limitReport-->\n";
 
 			if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) {
@@ -519,6 +576,8 @@ class Parser {
 		$this->mRevisionObject = $oldRevisionObject;
 		$this->mRevisionTimestamp = $oldRevisionTimestamp;
 		$this->mRevisionUser = $oldRevisionUser;
+		$this->mRevisionSize = $oldRevisionSize;
+		$this->mInputSize = false;
 		wfProfileOut( $fname );
 		wfProfileOut( __METHOD__ );
 
@@ -536,7 +595,7 @@ class Parser {
 	 *
 	 * @return string
 	 */
-	function recursiveTagParse( $text, $frame=false ) {
+	function recursiveTagParse( $text, $frame = false ) {
 		wfProfileIn( __METHOD__ );
 		wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState ) );
 		wfRunHooks( 'ParserAfterStrip', array( &$this, &$text, &$this->mStripState ) );
@@ -769,9 +828,9 @@ class Parser {
 
 		if ( $target !== null ) {
 			return $target;
-		} elseif( $this->mOptions->getInterfaceMessage() ) {
+		} elseif ( $this->mOptions->getInterfaceMessage() ) {
 			return $this->mOptions->getUserLangObj();
-		} elseif( is_null( $this->mTitle ) ) {
+		} elseif ( is_null( $this->mTitle ) ) {
 			throw new MWException( __METHOD__ . ': $this->mTitle is null' );
 		}
 
@@ -1256,8 +1315,8 @@ class Parser {
 				'x' => 'X',
 			));
 			$titleObj = SpecialPage::getTitleFor( 'Booksources', $num );
-			return'<a href="' .
-				htmlspecialchars( $titleObj->getLocalUrl() ) .
+			return '<a href="' .
+				htmlspecialchars( $titleObj->getLocalURL() ) .
 				"\" class=\"internal mw-magiclink-isbn\">ISBN $isbn</a>";
 		} else {
 			return $m[0];
@@ -1366,165 +1425,186 @@ class Parser {
 	 */
 	public function doQuotes( $text ) {
 		$arr = preg_split( "/(''+)/", $text, -1, PREG_SPLIT_DELIM_CAPTURE );
-		if ( count( $arr ) == 1 ) {
+		$countarr = count( $arr );
+		if ( $countarr == 1 ) {
 			return $text;
-		} else {
-			# First, do some preliminary work. This may shift some apostrophes from
-			# being mark-up to being text. It also counts the number of occurrences
-			# of bold and italics mark-ups.
-			$numbold = 0;
-			$numitalics = 0;
-			for ( $i = 0; $i < count( $arr ); $i++ ) {
-				if ( ( $i % 2 ) == 1 ) {
-					# If there are ever four apostrophes, assume the first is supposed to
-					# be text, and the remaining three constitute mark-up for bold text.
-					if ( strlen( $arr[$i] ) == 4 ) {
-						$arr[$i-1] .= "'";
-						$arr[$i] = "'''";
-					} elseif ( strlen( $arr[$i] ) > 5 ) {
-						# If there are more than 5 apostrophes in a row, assume they're all
-						# text except for the last 5.
-						$arr[$i-1] .= str_repeat( "'", strlen( $arr[$i] ) - 5 );
-						$arr[$i] = "'''''";
-					}
-					# Count the number of occurrences of bold and italics mark-ups.
-					# We are not counting sequences of five apostrophes.
-					if ( strlen( $arr[$i] ) == 2 ) {
-						$numitalics++;
-					} elseif ( strlen( $arr[$i] ) == 3 ) {
-						$numbold++;
-					} elseif ( strlen( $arr[$i] ) == 5 ) {
-						$numitalics++;
-						$numbold++;
-					}
-				}
+		}
+
+		// First, do some preliminary work. This may shift some apostrophes from
+		// being mark-up to being text. It also counts the number of occurrences
+		// of bold and italics mark-ups.
+		$numbold = 0;
+		$numitalics = 0;
+		for ( $i = 1; $i < $countarr; $i += 2 ) {
+			$thislen = strlen( $arr[$i] );
+			// If there are ever four apostrophes, assume the first is supposed to
+			// be text, and the remaining three constitute mark-up for bold text.
+			// (bug 13227: ''''foo'''' turns into ' ''' foo ' ''')
+			if ( $thislen == 4 ) {
+				$arr[$i - 1] .= "'";
+				$arr[$i] = "'''";
+				$thislen = 3;
+			} elseif ( $thislen > 5 ) {
+				// If there are more than 5 apostrophes in a row, assume they're all
+				// text except for the last 5.
+				// (bug 13227: ''''''foo'''''' turns into ' ''''' foo ' ''''')
+				$arr[$i - 1] .= str_repeat( "'", $thislen - 5 );
+				$arr[$i] = "'''''";
+				$thislen = 5;
 			}
+			// Count the number of occurrences of bold and italics mark-ups.
+			if ( $thislen == 2 ) {
+				$numitalics++;
+			} elseif ( $thislen == 3 ) {
+				$numbold++;
+			} elseif ( $thislen == 5 ) {
+				$numitalics++;
+				$numbold++;
+			}
+		}
 
-			# If there is an odd number of both bold and italics, it is likely
-			# that one of the bold ones was meant to be an apostrophe followed
-			# by italics. Which one we cannot know for certain, but it is more
-			# likely to be one that has a single-letter word before it.
-			if ( ( $numbold % 2 == 1 ) && ( $numitalics % 2 == 1 ) ) {
-				$i = 0;
-				$firstsingleletterword = -1;
-				$firstmultiletterword = -1;
-				$firstspace = -1;
-				foreach ( $arr as $r ) {
-					if ( ( $i % 2 == 1 ) and ( strlen( $r ) == 3 ) ) {
-						$x1 = substr( $arr[$i-1], -1 );
-						$x2 = substr( $arr[$i-1], -2, 1 );
-						if ( $x1 === ' ' ) {
-							if ( $firstspace == -1 ) {
-								$firstspace = $i;
-							}
-						} elseif ( $x2 === ' ' ) {
-							if ( $firstsingleletterword == -1 ) {
-								$firstsingleletterword = $i;
-							}
-						} else {
-							if ( $firstmultiletterword == -1 ) {
-								$firstmultiletterword = $i;
-							}
+		// If there is an odd number of both bold and italics, it is likely
+		// that one of the bold ones was meant to be an apostrophe followed
+		// by italics. Which one we cannot know for certain, but it is more
+		// likely to be one that has a single-letter word before it.
+		if ( ( $numbold % 2 == 1 ) && ( $numitalics % 2 == 1 ) ) {
+			$firstsingleletterword = -1;
+			$firstmultiletterword = -1;
+			$firstspace = -1;
+			for ( $i = 1; $i < $countarr; $i += 2 ) {
+				if ( strlen( $arr[$i] ) == 3 ) {
+					$x1 = substr( $arr[$i - 1], -1 );
+					$x2 = substr( $arr[$i - 1], -2, 1 );
+					if ( $x1 === ' ' ) {
+						if ( $firstspace == -1 ) {
+							$firstspace = $i;
+						}
+					} elseif ( $x2 === ' ' ) {
+						if ( $firstsingleletterword == -1 ) {
+							$firstsingleletterword = $i;
+							// if $firstsingleletterword is set, we don't
+							// look at the other options, so we can bail early.
+							break;
+						}
+					} else {
+						if ( $firstmultiletterword == -1 ) {
+							$firstmultiletterword = $i;
 						}
 					}
-					$i++;
 				}
+			}
 
-				# If there is a single-letter word, use it!
-				if ( $firstsingleletterword > -1 ) {
-					$arr[$firstsingleletterword] = "''";
-					$arr[$firstsingleletterword-1] .= "'";
-				} elseif ( $firstmultiletterword > -1 ) {
-					# If not, but there's a multi-letter word, use that one.
-					$arr[$firstmultiletterword] = "''";
-					$arr[$firstmultiletterword-1] .= "'";
-				} elseif ( $firstspace > -1 ) {
-					# ... otherwise use the first one that has neither.
-					# (notice that it is possible for all three to be -1 if, for example,
-					# there is only one pentuple-apostrophe in the line)
-					$arr[$firstspace] = "''";
-					$arr[$firstspace-1] .= "'";
-				}
+			// If there is a single-letter word, use it!
+			if ( $firstsingleletterword > -1 ) {
+				$arr[$firstsingleletterword] = "''";
+				$arr[$firstsingleletterword - 1] .= "'";
+			} elseif ( $firstmultiletterword > -1 ) {
+				// If not, but there's a multi-letter word, use that one.
+				$arr[$firstmultiletterword] = "''";
+				$arr[$firstmultiletterword - 1] .= "'";
+			} elseif ( $firstspace > -1 ) {
+				// ... otherwise use the first one that has neither.
+				// (notice that it is possible for all three to be -1 if, for example,
+				// there is only one pentuple-apostrophe in the line)
+				$arr[$firstspace] = "''";
+				$arr[$firstspace - 1] .= "'";
 			}
+		}
 
-			# Now let's actually convert our apostrophic mush to HTML!
-			$output = '';
-			$buffer = '';
-			$state = '';
-			$i = 0;
-			foreach ( $arr as $r ) {
-				if ( ( $i % 2 ) == 0 ) {
-					if ( $state === 'both' ) {
-						$buffer .= $r;
-					} else {
-						$output .= $r;
-					}
+		// Now let's actually convert our apostrophic mush to HTML!
+		$output = '';
+		$buffer = '';
+		$state = '';
+		$i = 0;
+		foreach ( $arr as $r ) {
+			if ( ( $i % 2 ) == 0 ) {
+				if ( $state === 'both' ) {
+					$buffer .= $r;
 				} else {
-					if ( strlen( $r ) == 2 ) {
-						if ( $state === 'i' ) {
-							$output .= '</i>'; $state = '';
-						} elseif ( $state === 'bi' ) {
-							$output .= '</i>'; $state = 'b';
-						} elseif ( $state === 'ib' ) {
-							$output .= '</b></i><b>'; $state = 'b';
-						} elseif ( $state === 'both' ) {
-							$output .= '<b><i>' . $buffer . '</i>'; $state = 'b';
-						} else { # $state can be 'b' or ''
-							$output .= '<i>'; $state .= 'i';
-						}
-					} elseif ( strlen( $r ) == 3 ) {
-						if ( $state === 'b' ) {
-							$output .= '</b>'; $state = '';
-						} elseif ( $state === 'bi' ) {
-							$output .= '</i></b><i>'; $state = 'i';
-						} elseif ( $state === 'ib' ) {
-							$output .= '</b>'; $state = 'i';
-						} elseif ( $state === 'both' ) {
-							$output .= '<i><b>' . $buffer . '</b>'; $state = 'i';
-						} else { # $state can be 'i' or ''
-							$output .= '<b>'; $state .= 'b';
-						}
-					} elseif ( strlen( $r ) == 5 ) {
-						if ( $state === 'b' ) {
-							$output .= '</b><i>'; $state = 'i';
-						} elseif ( $state === 'i' ) {
-							$output .= '</i><b>'; $state = 'b';
-						} elseif ( $state === 'bi' ) {
-							$output .= '</i></b>'; $state = '';
-						} elseif ( $state === 'ib' ) {
-							$output .= '</b></i>'; $state = '';
-						} elseif ( $state === 'both' ) {
-							$output .= '<i><b>' . $buffer . '</b></i>'; $state = '';
-						} else { # ($state == '')
-							$buffer = ''; $state = 'both';
-						}
+					$output .= $r;
+				}
+			} else {
+				$thislen = strlen( $r );
+				if ( $thislen == 2 ) {
+					if ( $state === 'i' ) {
+						$output .= '</i>';
+						$state = '';
+					} elseif ( $state === 'bi' ) {
+						$output .= '</i>';
+						$state = 'b';
+					} elseif ( $state === 'ib' ) {
+						$output .= '</b></i><b>';
+						$state = 'b';
+					} elseif ( $state === 'both' ) {
+						$output .= '<b><i>' . $buffer . '</i>';
+						$state = 'b';
+					} else { // $state can be 'b' or ''
+						$output .= '<i>';
+						$state .= 'i';
+					}
+				} elseif ( $thislen == 3 ) {
+					if ( $state === 'b' ) {
+						$output .= '</b>';
+						$state = '';
+					} elseif ( $state === 'bi' ) {
+						$output .= '</i></b><i>';
+						$state = 'i';
+					} elseif ( $state === 'ib' ) {
+						$output .= '</b>';
+						$state = 'i';
+					} elseif ( $state === 'both' ) {
+						$output .= '<i><b>' . $buffer . '</b>';
+						$state = 'i';
+					} else { // $state can be 'i' or ''
+						$output .= '<b>';
+						$state .= 'b';
+					}
+				} elseif ( $thislen == 5 ) {
+					if ( $state === 'b' ) {
+						$output .= '</b><i>';
+						$state = 'i';
+					} elseif ( $state === 'i' ) {
+						$output .= '</i><b>';
+						$state = 'b';
+					} elseif ( $state === 'bi' ) {
+						$output .= '</i></b>';
+						$state = '';
+					} elseif ( $state === 'ib' ) {
+						$output .= '</b></i>';
+						$state = '';
+					} elseif ( $state === 'both' ) {
+						$output .= '<i><b>' . $buffer . '</b></i>';
+						$state = '';
+					} else { // ($state == '')
+						$buffer = '';
+						$state = 'both';
 					}
 				}
-				$i++;
-			}
-			# Now close all remaining tags.  Notice that the order is important.
-			if ( $state === 'b' || $state === 'ib' ) {
-				$output .= '</b>';
 			}
-			if ( $state === 'i' || $state === 'bi' || $state === 'ib' ) {
-				$output .= '</i>';
-			}
-			if ( $state === 'bi' ) {
-				$output .= '</b>';
-			}
-			# There might be lonely ''''', so make sure we have a buffer
-			if ( $state === 'both' && $buffer ) {
-				$output .= '<b><i>' . $buffer . '</i></b>';
-			}
-			return $output;
+			$i++;
+		}
+		// Now close all remaining tags.  Notice that the order is important.
+		if ( $state === 'b' || $state === 'ib' ) {
+			$output .= '</b>';
+		}
+		if ( $state === 'i' || $state === 'bi' || $state === 'ib' ) {
+			$output .= '</i>';
+		}
+		if ( $state === 'bi' ) {
+			$output .= '</b>';
+		}
+		// There might be lonely ''''', so make sure we have a buffer
+		if ( $state === 'both' && $buffer ) {
+			$output .= '<b><i>' . $buffer . '</i></b>';
 		}
+		return $output;
 	}
 
 	/**
 	 * Replace external links (REL)
 	 *
 	 * Note: this is all very hackish and the order of execution matters a lot.
-	 * Make sure to run maintenance/parserTests.php if you change this code.
+	 * Make sure to run tests/parserTests.php if you change this code.
 	 *
 	 * @private
 	 *
@@ -1538,12 +1618,13 @@ class Parser {
 
 		$bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
 		if ( $bits === false ) {
+			wfProfileOut( __METHOD__ );
 			throw new MWException( "PCRE needs to be compiled with --enable-unicode-properties in order for MediaWiki to function" );
 		}
 		$s = array_shift( $bits );
 
 		$i = 0;
-		while ( $i<count( $bits ) ) {
+		while ( $i < count( $bits ) ) {
 			$url = $bits[$i++];
 			$i++; // protocol
 			$text = $bits[$i++];
@@ -2036,16 +2117,12 @@ class Parser {
 				}
 			}
 
-			# Self-link checking
-			if ( $nt->getFragment() === '' && $ns != NS_SPECIAL ) {
-				if ( $nt->equals( $this->mTitle ) || ( !$nt->isKnown() && in_array(
-					$this->mTitle->getPrefixedText(),
-					$this->getConverterLanguage()->autoConvertToAllVariants( $nt->getPrefixedText() ),
-					true
-				) ) ) {
-					$s .= $prefix . Linker::makeSelfLinkObj( $nt, $text, '', $trail );
-					continue;
-				}
+			# Self-link checking. For some languages, variants of the title are checked in
+			# LinkHolderArray::doVariants() to allow batching the existence checks necessary
+			# for linking to a different variant.
+			if ( $ns != NS_SPECIAL && $nt->equals( $this->mTitle ) && $nt->getFragment() === '' ) {
+				$s .= $prefix . Linker::makeSelfLinkObj( $nt, $text, '', $trail );
+				continue;
 			}
 
 			# NS_MEDIA is a pseudo-namespace for linking directly to a file
@@ -2159,7 +2236,7 @@ class Parser {
 	function closeParagraph() {
 		$result = '';
 		if ( $this->mLastSection != '' ) {
-			$result = '</' . $this->mLastSection  . ">\n";
+			$result = '</' . $this->mLastSection . ">\n";
 		}
 		$this->mInPre = false;
 		$this->mLastSection = '';
@@ -2204,13 +2281,13 @@ class Parser {
 		$result = $this->closeParagraph();
 
 		if ( '*' === $char ) {
-			$result .= '<ul><li>';
+			$result .= "<ul>\n<li>";
 		} elseif ( '#' === $char ) {
-			$result .= '<ol><li>';
+			$result .= "<ol>\n<li>";
 		} elseif ( ':' === $char ) {
-			$result .= '<dl><dd>';
+			$result .= "<dl>\n<dd>";
 		} elseif ( ';' === $char ) {
-			$result .= '<dl><dt>';
+			$result .= "<dl>\n<dt>";
 			$this->mDTopen = true;
 		} else {
 			$result = '<!-- ERR 1 -->';
@@ -2228,11 +2305,11 @@ class Parser {
 	 */
 	function nextItem( $char ) {
 		if ( '*' === $char || '#' === $char ) {
-			return '</li><li>';
+			return "</li>\n<li>";
 		} elseif ( ':' === $char || ';' === $char ) {
-			$close = '</dd>';
+			$close = "</dd>\n";
 			if ( $this->mDTopen ) {
-				$close = '</dt>';
+				$close = "</dt>\n";
 			}
 			if ( ';' === $char ) {
 				$this->mDTopen = true;
@@ -2254,15 +2331,15 @@ class Parser {
 	 */
 	function closeList( $char ) {
 		if ( '*' === $char ) {
-			$text = '</li></ul>';
+			$text = "</li>\n</ul>";
 		} elseif ( '#' === $char ) {
-			$text = '</li></ol>';
+			$text = "</li>\n</ol>";
 		} elseif ( ':' === $char ) {
 			if ( $this->mDTopen ) {
 				$this->mDTopen = false;
-				$text = '</dt></dl>';
+				$text = "</dt>\n</dl>";
 			} else {
-				$text = '</dd></dl>';
+				$text = "</dd>\n</dl>";
 			}
 		} else {
 			return '<!-- ERR 3 -->';
@@ -2292,6 +2369,7 @@ class Parser {
 		$this->mDTopen = $inBlockElem = false;
 		$prefixLength = 0;
 		$paragraphStack = false;
+		$inBlockquote = false;
 
 		foreach ( $textLines as $oLine ) {
 			# Fix up $linestart
@@ -2354,13 +2432,13 @@ class Parser {
 
 				# Close all the prefixes which aren't shared.
 				while ( $commonPrefixLength < $lastPrefixLength ) {
-					$output .= $this->closeList( $lastPrefix[$lastPrefixLength-1] );
+					$output .= $this->closeList( $lastPrefix[$lastPrefixLength - 1] );
 					--$lastPrefixLength;
 				}
 
 				# Continue the current prefix if appropriate.
 				if ( $prefixLength <= $commonPrefixLength && $commonPrefixLength > 0 ) {
-					$output .= $this->nextItem( $prefix[$commonPrefixLength-1] );
+					$output .= $this->nextItem( $prefix[$commonPrefixLength - 1] );
 				}
 
 				# Open prefixes where appropriate.
@@ -2385,10 +2463,10 @@ class Parser {
 				wfProfileIn( __METHOD__ . "-paragraph" );
 				# No prefix (not in list)--go to paragraph mode
 				# XXX: use a stack for nestable elements like span, table and div
-				$openmatch = preg_match( '/(?:<table|<blockquote|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
+				$openmatch = preg_match( '/(?:<table|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
 				$closematch = preg_match(
-					'/(?:<\\/table|<\\/blockquote|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'.
-					'<td|<th|<\\/?div|<hr|<\\/pre|<\\/p|'.$this->mUniqPrefix . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t );
+					'/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|' .
+					'<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|<\\/mw:|' . $this->mUniqPrefix . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t );
 				if ( $openmatch or $closematch ) {
 					$paragraphStack = false;
 					# TODO bug 5718: paragraph closed
@@ -2396,9 +2474,14 @@ class Parser {
 					if ( $preOpenMatch and !$preCloseMatch ) {
 						$this->mInPre = true;
 					}
+					$bqOffset = 0;
+					while ( preg_match( '/<(\\/?)blockquote[\s>]/i', $t, $bqMatch, PREG_OFFSET_CAPTURE, $bqOffset ) ) {
+						$inBlockquote = !$bqMatch[1][0]; // is this a close tag?
+						$bqOffset = $bqMatch[0][1] + strlen( $bqMatch[0][0] );
+					}
 					$inBlockElem = !$closematch;
 				} elseif ( !$inBlockElem && !$this->mInPre ) {
-					if ( ' ' == substr( $t, 0, 1 ) and ( $this->mLastSection === 'pre' || trim( $t ) != '' ) ) {
+					if ( ' ' == substr( $t, 0, 1 ) and ( $this->mLastSection === 'pre' || trim( $t ) != '' ) and !$inBlockquote ) {
 						# pre
 						if ( $this->mLastSection !== 'pre' ) {
 							$paragraphStack = false;
@@ -2445,7 +2528,7 @@ class Parser {
 			}
 		}
 		while ( $prefixLength ) {
-			$output .= $this->closeList( $prefix2[$prefixLength-1] );
+			$output .= $this->closeList( $prefix2[$prefixLength - 1] );
 			--$prefixLength;
 		}
 		if ( $this->mLastSection != '' ) {
@@ -2481,7 +2564,7 @@ class Parser {
 		if ( $lt === false || $lt > $pos ) {
 			# Easy; no tag nesting to worry about
 			$before = substr( $str, 0, $pos );
-			$after = substr( $str, $pos+1 );
+			$after = substr( $str, $pos + 1 );
 			wfProfileOut( __METHOD__ );
 			return $pos;
 		}
@@ -2490,13 +2573,13 @@ class Parser {
 		$state = self::COLON_STATE_TEXT;
 		$stack = 0;
 		$len = strlen( $str );
-		for( $i = 0; $i < $len; $i++ ) {
+		for ( $i = 0; $i < $len; $i++ ) {
 			$c = $str[$i];
 
-			switch( $state ) {
+			switch ( $state ) {
 			# (Using the number is a performance hack for common cases)
 			case 0: # self::COLON_STATE_TEXT:
-				switch( $c ) {
+				switch ( $c ) {
 				case "<":
 					# Could be either a <start> tag or an </end> tag
 					$state = self::COLON_STATE_TAGSTART;
@@ -2541,7 +2624,7 @@ class Parser {
 				break;
 			case 1: # self::COLON_STATE_TAG:
 				# In a <tag>
-				switch( $c ) {
+				switch ( $c ) {
 				case ">":
 					$stack++;
 					$state = self::COLON_STATE_TEXT;
@@ -2555,7 +2638,7 @@ class Parser {
 				}
 				break;
 			case 2: # self::COLON_STATE_TAGSTART:
-				switch( $c ) {
+				switch ( $c ) {
 				case "/":
 					$state = self::COLON_STATE_CLOSETAG;
 					break;
@@ -2611,6 +2694,7 @@ class Parser {
 				}
 				break;
 			default:
+				wfProfileOut( __METHOD__ );
 				throw new MWException( "State machine error in " . __METHOD__ );
 			}
 		}
@@ -2660,71 +2744,50 @@ class Parser {
 		$ts = wfTimestamp( TS_UNIX, $this->mOptions->getTimestamp() );
 		wfRunHooks( 'ParserGetVariableValueTs', array( &$this, &$ts ) );
 
-		# Use the time zone
-		global $wgLocaltimezone;
-		if ( isset( $wgLocaltimezone ) ) {
-			$oldtz = date_default_timezone_get();
-			date_default_timezone_set( $wgLocaltimezone );
-		}
-
-		$localTimestamp = date( 'YmdHis', $ts );
-		$localMonth = date( 'm', $ts );
-		$localMonth1 = date( 'n', $ts );
-		$localMonthName = date( 'n', $ts );
-		$localDay = date( 'j', $ts );
-		$localDay2 = date( 'd', $ts );
-		$localDayOfWeek = date( 'w', $ts );
-		$localWeek = date( 'W', $ts );
-		$localYear = date( 'Y', $ts );
-		$localHour = date( 'H', $ts );
-		if ( isset( $wgLocaltimezone ) ) {
-			date_default_timezone_set( $oldtz );
-		}
-
 		$pageLang = $this->getFunctionLang();
 
 		switch ( $index ) {
 			case 'currentmonth':
-				$value = $pageLang->formatNum( gmdate( 'm', $ts ) );
+				$value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'm' ) );
 				break;
 			case 'currentmonth1':
-				$value = $pageLang->formatNum( gmdate( 'n', $ts ) );
+				$value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'n' ) );
 				break;
 			case 'currentmonthname':
-				$value = $pageLang->getMonthName( gmdate( 'n', $ts ) );
+				$value = $pageLang->getMonthName( MWTimestamp::getInstance( $ts )->format( 'n' ) );
 				break;
 			case 'currentmonthnamegen':
-				$value = $pageLang->getMonthNameGen( gmdate( 'n', $ts ) );
+				$value = $pageLang->getMonthNameGen( MWTimestamp::getInstance( $ts )->format( 'n' ) );
 				break;
 			case 'currentmonthabbrev':
-				$value = $pageLang->getMonthAbbreviation( gmdate( 'n', $ts ) );
+				$value = $pageLang->getMonthAbbreviation( MWTimestamp::getInstance( $ts )->format( 'n' ) );
 				break;
 			case 'currentday':
-				$value = $pageLang->formatNum( gmdate( 'j', $ts ) );
+				$value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'j' ) );
 				break;
 			case 'currentday2':
-				$value = $pageLang->formatNum( gmdate( 'd', $ts ) );
+				$value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'd' ) );
 				break;
 			case 'localmonth':
-				$value = $pageLang->formatNum( $localMonth );
+				$value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'm' ) );
 				break;
 			case 'localmonth1':
-				$value = $pageLang->formatNum( $localMonth1 );
+				$value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'n' ) );
 				break;
 			case 'localmonthname':
-				$value = $pageLang->getMonthName( $localMonthName );
+				$value = $pageLang->getMonthName( MWTimestamp::getLocalInstance( $ts )->format( 'n' ) );
 				break;
 			case 'localmonthnamegen':
-				$value = $pageLang->getMonthNameGen( $localMonthName );
+				$value = $pageLang->getMonthNameGen( MWTimestamp::getLocalInstance( $ts )->format( 'n' ) );
 				break;
 			case 'localmonthabbrev':
-				$value = $pageLang->getMonthAbbreviation( $localMonthName );
+				$value = $pageLang->getMonthAbbreviation( MWTimestamp::getLocalInstance( $ts )->format( 'n' ) );
 				break;
 			case 'localday':
-				$value = $pageLang->formatNum( $localDay );
+				$value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'j' ) );
 				break;
 			case 'localday2':
-				$value = $pageLang->formatNum( $localDay2 );
+				$value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'd' ) );
 				break;
 			case 'pagename':
 				$value = wfEscapeWikiText( $this->mTitle->getText() );
@@ -2744,6 +2807,12 @@ class Parser {
 			case 'subpagenamee':
 				$value = wfEscapeWikiText( $this->mTitle->getSubpageUrlForm() );
 				break;
+			case 'rootpagename':
+				$value = wfEscapeWikiText( $this->mTitle->getRootText() );
+				break;
+			case 'rootpagenamee':
+				$value = wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $this->mTitle->getRootText() ) ) );
+				break;
 			case 'basepagename':
 				$value = wfEscapeWikiText( $this->mTitle->getBaseText() );
 				break;
@@ -2761,7 +2830,7 @@ class Parser {
 			case 'talkpagenamee':
 				if ( $this->mTitle->canTalk() ) {
 					$talkPage = $this->mTitle->getTalkPage();
-					$value = wfEscapeWikiText( $talkPage->getPrefixedUrl() );
+					$value = wfEscapeWikiText( $talkPage->getPrefixedURL() );
 				} else {
 					$value = '';
 				}
@@ -2772,11 +2841,11 @@ class Parser {
 				break;
 			case 'subjectpagenamee':
 				$subjPage = $this->mTitle->getSubjectPage();
-				$value = wfEscapeWikiText( $subjPage->getPrefixedUrl() );
+				$value = wfEscapeWikiText( $subjPage->getPrefixedURL() );
 				break;
 			case 'pageid': // requested in bug 23427
-				$pageid = $this->getTitle()->getArticleId();
-				if( $pageid == 0 ) {
+				$pageid = $this->getTitle()->getArticleID();
+				if ( $pageid == 0 ) {
 					# 0 means the page doesn't exist in the database,
 					# which means the user is previewing a new page.
 					# The vary-revision flag must be set, because the magic word
@@ -2842,6 +2911,13 @@ class Parser {
 				wfDebug( __METHOD__ . ": {{REVISIONUSER}} used, setting vary-revision...\n" );
 				$value = $this->getRevisionUser();
 				break;
+			case 'revisionsize':
+				# Let the edit saving system know we should parse the page
+				# *after* a revision ID has been assigned. This is for null edits.
+				$this->mOutput->setFlag( 'vary-revision' );
+				wfDebug( __METHOD__ . ": {{REVISIONSIZE}} used, setting vary-revision...\n" );
+				$value = $this->getRevisionSize();
+				break;
 			case 'namespace':
 				$value = str_replace( '_', ' ', $wgContLang->getNsText( $this->mTitle->getNamespace() ) );
 				break;
@@ -2858,50 +2934,50 @@ class Parser {
 				$value = $this->mTitle->canTalk() ? wfUrlencode( $this->mTitle->getTalkNsText() ) : '';
 				break;
 			case 'subjectspace':
-				$value = $this->mTitle->getSubjectNsText();
+				$value = str_replace( '_', ' ', $this->mTitle->getSubjectNsText() );
 				break;
 			case 'subjectspacee':
 				$value = ( wfUrlencode( $this->mTitle->getSubjectNsText() ) );
 				break;
 			case 'currentdayname':
-				$value = $pageLang->getWeekdayName( gmdate( 'w', $ts ) + 1 );
+				$value = $pageLang->getWeekdayName( MWTimestamp::getInstance( $ts )->format( 'w' ) + 1 );
 				break;
 			case 'currentyear':
-				$value = $pageLang->formatNum( gmdate( 'Y', $ts ), true );
+				$value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'Y' ), true );
 				break;
 			case 'currenttime':
 				$value = $pageLang->time( wfTimestamp( TS_MW, $ts ), false, false );
 				break;
 			case 'currenthour':
-				$value = $pageLang->formatNum( gmdate( 'H', $ts ), true );
+				$value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'H' ), true );
 				break;
 			case 'currentweek':
 				# @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
 				# int to remove the padding
-				$value = $pageLang->formatNum( (int)gmdate( 'W', $ts ) );
+				$value = $pageLang->formatNum( (int)MWTimestamp::getInstance( $ts )->format( 'W' ) );
 				break;
 			case 'currentdow':
-				$value = $pageLang->formatNum( gmdate( 'w', $ts ) );
+				$value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'w' ) );
 				break;
 			case 'localdayname':
-				$value = $pageLang->getWeekdayName( $localDayOfWeek + 1 );
+				$value = $pageLang->getWeekdayName( MWTimestamp::getLocalInstance( $ts )->format( 'w' ) + 1 );
 				break;
 			case 'localyear':
-				$value = $pageLang->formatNum( $localYear, true );
+				$value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'Y' ), true );
 				break;
 			case 'localtime':
-				$value = $pageLang->time( $localTimestamp, false, false );
+				$value = $pageLang->time( MWTimestamp::getLocalInstance( $ts )->format( 'YmdHis' ), false, false );
 				break;
 			case 'localhour':
-				$value = $pageLang->formatNum( $localHour, true );
+				$value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'H' ), true );
 				break;
 			case 'localweek':
 				# @bug 4594 PHP5 has it zero padded, PHP4 does not, cast to
 				# int to remove the padding
-				$value = $pageLang->formatNum( (int)$localWeek );
+				$value = $pageLang->formatNum( (int)MWTimestamp::getLocalInstance( $ts )->format( 'W' ) );
 				break;
 			case 'localdow':
-				$value = $pageLang->formatNum( $localDayOfWeek );
+				$value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'w' ) );
 				break;
 			case 'numberofarticles':
 				$value = $pageLang->formatNum( SiteStats::articles() );
@@ -2932,7 +3008,7 @@ class Parser {
 				$value = wfTimestamp( TS_MW, $ts );
 				break;
 			case 'localtimestamp':
-				$value = $localTimestamp;
+				$value = MWTimestamp::getLocalInstance( $ts )->format( 'YmdHis' );
 				break;
 			case 'currentversion':
 				$value = SpecialVersion::getVersion();
@@ -3092,7 +3168,7 @@ class Parser {
 				$assocArgs[$index++] = $arg;
 			} else {
 				$name = trim( substr( $arg, 0, $eqpos ) );
-				$value = trim( substr( $arg, $eqpos+1 ) );
+				$value = trim( substr( $arg, $eqpos + 1 ) );
 				if ( $value === false ) {
 					$value = '';
 				}
@@ -3119,6 +3195,12 @@ class Parser {
 	 *   'post-expand-template-inclusion' (corresponding messages:
 	 *       'post-expand-template-inclusion-warning',
 	 *       'post-expand-template-inclusion-category')
+	 *   'node-count-exceeded' (corresponding messages:
+	 *       'node-count-exceeded-warning',
+	 *       'node-count-exceeded-category')
+	 *   'expansion-depth-exceeded' (corresponding messages:
+	 *       'expansion-depth-exceeded-warning',
+	 *       'expansion-depth-exceeded-category')
 	 * @param int|null $current Current value
 	 * @param int|null $max Maximum allowed, when an explicit limit has been
 	 *	 exceeded, provide the values (optional)
@@ -3126,7 +3208,7 @@ class Parser {
 	function limitationWarn( $limitationType, $current = '', $max = '' ) {
 		# does no harm if $current and $max are present but are unnecessary for the message
 		$warning = wfMessage( "$limitationType-warning" )->numParams( $current, $max )
-			->inContentLanguage()->escaped();
+			->inLanguage( $this->mOptions->getUserLangObj() )->text();
 		$this->mOutput->addWarning( $warning );
 		$this->addTrackingCategory( "$limitationType-category" );
 	}
@@ -3145,7 +3227,6 @@ class Parser {
 	 * @private
 	 */
 	function braceSubstitution( $piece, $frame ) {
-		global $wgContLang;
 		wfProfileIn( __METHOD__ );
 		wfProfileIn( __METHOD__ . '-setup' );
 
@@ -3251,6 +3332,7 @@ class Parser {
 					$result = $this->callParserFunction( $frame, $func, $funcArgs );
 				} catch ( Exception $ex ) {
 					wfProfileOut( __METHOD__ . '-pfunc' );
+					wfProfileOut( __METHOD__ );
 					throw $ex;
 				}
 
@@ -3268,8 +3350,9 @@ class Parser {
 			$ns = NS_TEMPLATE;
 			# Split the title into page and subpage
 			$subpage = '';
-			$part1 = $this->maybeDoSubpageLink( $part1, $subpage );
-			if ( $subpage !== '' ) {
+			$relative = $this->maybeDoSubpageLink( $part1, $subpage );
+			if ( $part1 !== $relative ) {
+				$part1 = $relative;
 				$ns = $this->mTitle->getNamespace();
 			}
 			$title = Title::newFromText( $part1, $ns );
@@ -3295,7 +3378,7 @@ class Parser {
 		if ( !$found && $title ) {
 			if ( !Profiler::instance()->isPersistent() ) {
 				# Too many unique items can kill profiling DBs/collectors
-				$titleProfileIn = __METHOD__ . "-title-" . $title->getDBKey();
+				$titleProfileIn = __METHOD__ . "-title-" . $title->getPrefixedDBkey();
 				wfProfileIn( $titleProfileIn ); // template in
 			}
 			wfProfileIn( __METHOD__ . '-loadtpl' );
@@ -3598,7 +3681,7 @@ class Parser {
 		}
 
 		$dom = $this->preprocessToDom( $text, self::PTD_FOR_INCLUSION );
-		$this->mTplDomCache[ $titleText ] = $dom;
+		$this->mTplDomCache[$titleText] = $dom;
 
 		if ( !$title->equals( $cacheTitle ) ) {
 			$this->mTplRedirCache[$cacheTitle->getPrefixedDBkey()] =
@@ -3621,6 +3704,11 @@ class Parser {
 		if ( isset( $stuff['deps'] ) ) {
 			foreach ( $stuff['deps'] as $dep ) {
 				$this->mOutput->addTemplate( $dep['title'], $dep['page_id'], $dep['rev_id'] );
+				if ( $dep['title']->equals( $this->getTitle() ) ) {
+					// If we transclude ourselves, the final result
+					// will change based on the new version of the page
+					$this->mOutput->setFlag( 'vary-revision' );
+				}
 			}
 		}
 		return array( $text, $finalTitle );
@@ -3660,9 +3748,9 @@ class Parser {
 			if ( $skip ) {
 				$text = false;
 				$deps[] = array(
-					'title' 	=> $title,
-					'page_id' 	=> $title->getArticleID(),
-					'rev_id' 	=> null
+					'title' => $title,
+					'page_id' => $title->getArticleID(),
+					'rev_id' => null
 				);
 				break;
 			}
@@ -3678,15 +3766,15 @@ class Parser {
 			}
 
 			$deps[] = array(
-				'title' 	=> $title,
-				'page_id' 	=> $title->getArticleID(),
-				'rev_id' 	=> $rev_id );
+				'title' => $title,
+				'page_id' => $title->getArticleID(),
+				'rev_id' => $rev_id );
 			if ( $rev && !$title->equals( $rev->getTitle() ) ) {
 				# We fetched a rev from a different title; register it too...
 				$deps[] = array(
-					'title' 	=> $rev->getTitle(),
-					'page_id' 	=> $rev->getPage(),
-					'rev_id' 	=> $rev_id );
+					'title' => $rev->getTitle(),
+					'page_id' => $rev->getPage(),
+					'rev_id' => $rev_id );
 			}
 
 			if ( $rev ) {
@@ -3742,13 +3830,8 @@ class Parser {
 	 * @return Array ( File or false, Title of file )
 	 */
 	function fetchFileAndTitle( $title, $options = array() ) {
-		if ( isset( $options['broken'] ) ) {
-			$file = false; // broken thumbnail forced by hook
-		} elseif ( isset( $options['sha1'] ) ) { // get by (sha1,timestamp)
-			$file = RepoGroup::singleton()->findFileFromKey( $options['sha1'], $options );
-		} else { // get by (name,timestamp)
-			$file = wfFindFile( $title, $options );
-		}
+		$file = $this->fetchFileNoRegister( $title, $options );
+
 		$time = $file ? $file->getTimestamp() : false;
 		$sha1 = $file ? $file->getSha1() : false;
 		# Register the file as a dependency...
@@ -3766,6 +3849,27 @@ class Parser {
 		return array( $file, $title );
 	}
 
+	/**
+	 * Helper function for fetchFileAndTitle.
+	 *
+	 * Also useful if you need to fetch a file but not use it yet,
+	 * for example to get the file's handler.
+	 *
+	 * @param Title $title
+	 * @param array $options Array of options to RepoGroup::findFile
+	 * @return File or false
+	 */
+	protected function fetchFileNoRegister( $title, $options = array() ) {
+		if ( isset( $options['broken'] ) ) {
+			$file = false; // broken thumbnail forced by hook
+		} elseif ( isset( $options['sha1'] ) ) { // get by (sha1,timestamp)
+			$file = RepoGroup::singleton()->findFileFromKey( $options['sha1'], $options );
+		} else { // get by (name,timestamp)
+			$file = wfFindFile( $title, $options );
+		}
+		return $file;
+	}
+
 	/**
 	 * Transclude an interwiki link.
 	 *
@@ -3781,7 +3885,7 @@ class Parser {
 			return wfMessage( 'scarytranscludedisabled' )->inContentLanguage()->text();
 		}
 
-		$url = $title->getFullUrl( "action=$action" );
+		$url = $title->getFullURL( array( 'action' => $action ) );
 
 		if ( strlen( $url ) > 255 ) {
 			return wfMessage( 'scarytranscludetoolong' )->inContentLanguage()->text();
@@ -3817,8 +3921,8 @@ class Parser {
 		$dbw->replace( 'transcache', array( 'tc_url' ), array(
 			'tc_url' => $url,
 			'tc_time' => $dbw->timestamp( time() ),
-			'tc_contents' => $text)
-		);
+			'tc_contents' => $text
+		) );
 		return $text;
 	}
 
@@ -4097,8 +4201,8 @@ class Parser {
 	 * @return mixed|string
 	 * @private
 	 */
-	function formatHeadings( $text, $origText, $isMain=true ) {
-		global $wgMaxTocLevel, $wgHtml5, $wgExperimentalHtmlIds;
+	function formatHeadings( $text, $origText, $isMain = true ) {
+		global $wgMaxTocLevel, $wgExperimentalHtmlIds;
 
 		# Inhibit editsection links if requested in the page
 		if ( isset( $this->mDoubleUnderscores['noeditsection'] ) ) {
@@ -4114,7 +4218,7 @@ class Parser {
 		# Get all headlines for numbering them and adding funky stuff like [edit]
 		# links - this is for later, but we need the number of headlines right now
 		$matches = array();
-		$numMatches = preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?'.'>)(?P<header>.*?)<\/H[1-6] *>/i', $text, $matches );
+		$numMatches = preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?' . '>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i', $text, $matches );
 
 		# if there are fewer than 4 headlines in the article, do not show TOC
 		# unless it's been explicitly enabled.
@@ -4176,7 +4280,7 @@ class Parser {
 				$serial = $markerMatches[1];
 				list( $titleText, $sectionIndex ) = $this->mHeadings[$serial];
 				$isTemplate = ( $titleText != $baseTitleText );
-				$headline = preg_replace( "/^$markerRegex/", "", $headline );
+				$headline = preg_replace( "/^$markerRegex\\s*/", "", $headline );
 			}
 
 			if ( $toclevel ) {
@@ -4231,7 +4335,7 @@ class Parser {
 			# count number of headlines for each level
 			$sublevelCount[$toclevel]++;
 			$dot = 0;
-			for( $i = 1; $i <= $toclevel; $i++ ) {
+			for ( $i = 1; $i <= $toclevel; $i++ ) {
 				if ( !empty( $sublevelCount[$i] ) ) {
 					if ( $dot ) {
 						$numbering .= '.';
@@ -4263,20 +4367,20 @@ class Parser {
 			# We strip any parameter from accepted tags (second regex), except dir="rtl|ltr" from <span>,
 			# to allow setting directionality in toc items.
 			$tocline = preg_replace(
-				array( '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?'.'>#', '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?'.'>#' ),
+				array( '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?' . '>#', '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?' . '>#' ),
 				array( '', '<$1>' ),
 				$safeHeadline
 			);
 			$tocline = trim( $tocline );
 
 			# For the anchor, strip out HTML-y stuff period
-			$safeHeadline = preg_replace( '/<.*?'.'>/', '', $safeHeadline );
+			$safeHeadline = preg_replace( '/<.*?' . '>/', '', $safeHeadline );
 			$safeHeadline = Sanitizer::normalizeSectionNameWhitespace( $safeHeadline );
 
 			# Save headline for section edit hint before it's escaped
 			$headlineHint = $safeHeadline;
 
-			if ( $wgHtml5 && $wgExperimentalHtmlIds ) {
+			if ( $wgExperimentalHtmlIds ) {
 				# For reverse compatibility, provide an id that's
 				# HTML4-compatible, like we used to.
 				#
@@ -4346,7 +4450,8 @@ class Parser {
 
 			# Add the section to the section tree
 			# Find the DOM node for this header
-			while ( $node && !$isTemplate ) {
+			$noOffset = ( $isTemplate || $sectionIndex === false );
+			while ( $node && !$noOffset ) {
 				if ( $node->getName() === 'h' ) {
 					$bits = $node->splitHeading();
 					if ( $bits['i'] == $sectionIndex ) {
@@ -4364,7 +4469,7 @@ class Parser {
 				'number' => $numbering,
 				'index' => ( $isTemplate ? 'T-' : '' ) . $sectionIndex,
 				'fromtitle' => $titleText,
-				'byteoffset' => ( $isTemplate ? null : $byteOffset ),
+				'byteoffset' => ( $noOffset ? null : $byteOffset ),
 				'anchor' => $anchor,
 			);
 
@@ -4415,6 +4520,7 @@ class Parser {
 			}
 			$toc = Linker::tocList( $toc, $this->mOptions->getUserLangObj() );
 			$this->mOutput->setTOCHTML( $toc );
+			$toc = self::TOC_START . $toc . self::TOC_END;
 		}
 
 		if ( $isMain ) {
@@ -4422,7 +4528,7 @@ class Parser {
 		}
 
 		# split up and insert constructed headlines
-		$blocks = preg_split( '/<H[1-6].*?' . '>.*?<\/H[1-6]>/i', $text );
+		$blocks = preg_split( '/<H[1-6].*?' . '>[\s\S]*?<\/H[1-6]>/i', $text );
 		$i = 0;
 
 		// build an array of document sections
@@ -4484,7 +4590,7 @@ class Parser {
 			"\r\n" => "\n",
 		);
 		$text = str_replace( array_keys( $pairs ), array_values( $pairs ), $text );
-		if( $options->getPreSaveTransform() ) {
+		if ( $options->getPreSaveTransform() ) {
 			$text = $this->pstPass2( $text, $user );
 		}
 		$text = $this->mStripState->unstripBoth( $text );
@@ -4504,7 +4610,7 @@ class Parser {
 	 * @return string
 	 */
 	function pstPass2( $text, $user ) {
-		global $wgContLang, $wgLocaltimezone;
+		global $wgContLang;
 
 		# Note: This is the timestamp saved as hardcoded wikitext to
 		# the database, we use $wgContLang here in order to give
@@ -4512,19 +4618,11 @@ class Parser {
 		# than the one selected in each user's preferences.
 		# (see also bug 12815)
 		$ts = $this->mOptions->getTimestamp();
-		if ( isset( $wgLocaltimezone ) ) {
-			$tz = $wgLocaltimezone;
-		} else {
-			$tz = date_default_timezone_get();
-		}
+		$timestamp = MWTimestamp::getLocalInstance( $ts );
+		$ts = $timestamp->format( 'YmdHis' );
+		$tzMsg = $timestamp->format( 'T' );  # might vary on DST changeover!
 
-		$unixts = wfTimestamp( TS_UNIX, $ts );
-		$oldtz = date_default_timezone_get();
-		date_default_timezone_set( $tz );
-		$ts = date( 'YmdHis', $unixts );
-		$tzMsg = date( 'T', $unixts );  # might vary on DST changeover!
-
-		# Allow translation of timezones through wiki. date() can return
+		# Allow translation of timezones through wiki. format() can return
 		# whatever crap the system uses, localised or not, so we cannot
 		# ship premade translations.
 		$key = 'timezone-' . strtolower( trim( $tzMsg ) );
@@ -4533,8 +4631,6 @@ class Parser {
 			$tzMsg = $msg->text();
 		}
 
-		date_default_timezone_set( $oldtz );
-
 		$d = $wgContLang->timeanddate( $ts, false, false ) . " ($tzMsg)";
 
 		# Variable replacement
@@ -4603,8 +4699,9 @@ class Parser {
 		$username = $user->getName();
 
 		# If not given, retrieve from the user object.
-		if ( $nickname === false )
+		if ( $nickname === false ) {
 			$nickname = $user->getOption( 'nickname' );
+		}
 
 		if ( is_null( $fancySig ) ) {
 			$fancySig = $user->getBoolOption( 'fancysig' );
@@ -4645,7 +4742,7 @@ class Parser {
 	 * @return mixed An expanded string, or false if invalid.
 	 */
 	function validateSig( $text ) {
-		return( Xml::isWellFormedXmlFragment( $text ) ? $text : false );
+		return Xml::isWellFormedXmlFragment( $text ) ? $text : false;
 	}
 
 	/**
@@ -4883,8 +4980,9 @@ class Parser {
 
 		# Add to function cache
 		$mw = MagicWord::get( $id );
-		if ( !$mw )
+		if ( !$mw ) {
 			throw new MWException( __METHOD__ . '() expecting a magic word identifier.' );
+		}
 
 		$synonyms = $mw->getSynonyms();
 		$sensitive = intval( $mw->isCaseSensitive() );
@@ -4928,7 +5026,9 @@ class Parser {
 	 */
 	function setFunctionTagHook( $tag, $callback, $flags ) {
 		$tag = strtolower( $tag );
-		if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) throw new MWException( "Invalid character {$m[0]} in setFunctionTagHook('$tag', ...) call" );
+		if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) {
+			throw new MWException( "Invalid character {$m[0]} in setFunctionTagHook('$tag', ...) call" );
+		}
 		$old = isset( $this->mFunctionTagHooks[$tag] ) ?
 			$this->mFunctionTagHooks[$tag] : null;
 		$this->mFunctionTagHooks[$tag] = array( $callback, $flags );
@@ -4979,7 +5079,20 @@ class Parser {
 	 * @return string HTML
 	 */
 	function renderImageGallery( $text, $params ) {
-		$ig = new ImageGallery();
+		wfProfileIn( __METHOD__ );
+
+		$mode = false;
+		if ( isset( $params['mode'] ) ) {
+			$mode = $params['mode'];
+		}
+
+		try {
+			$ig = ImageGalleryBase::factory( $mode );
+		} catch ( MWException $e ) {
+			// If invalid type set, fallback to default.
+			$ig = ImageGalleryBase::factory( false );
+		}
+
 		$ig->setContextTitle( $this->mTitle );
 		$ig->setShowBytes( false );
 		$ig->setShowFilename( false );
@@ -5007,6 +5120,7 @@ class Parser {
 		if ( isset( $params['heights'] ) ) {
 			$ig->setHeights( $params['heights'] );
 		}
+		$ig->setAdditionalOptions( $params );
 
 		wfRunHooks( 'BeforeParserrenderImageGallery', array( &$this, &$ig ) );
 
@@ -5030,38 +5144,81 @@ class Parser {
 				continue;
 			}
 
+			# We need to get what handler the file uses, to figure out parameters.
+			# Note, a hook can overide the file name, and chose an entirely different
+			# file (which potentially could be of a different type and have different handler).
+			$options = array();
+			$descQuery = false;
+			wfRunHooks( 'BeforeParserFetchFileAndTitle',
+				array( $this, $title, &$options, &$descQuery ) );
+			# Don't register it now, as ImageGallery does that later.
+			$file = $this->fetchFileNoRegister( $title, $options );
+			$handler = $file ? $file->getHandler() : false;
+
+			wfProfileIn( __METHOD__ . '-getMagicWord' );
+			$paramMap = array(
+				'img_alt' => 'gallery-internal-alt',
+				'img_link' => 'gallery-internal-link',
+			);
+			if ( $handler ) {
+				$paramMap = $paramMap + $handler->getParamMap();
+				// We don't want people to specify per-image widths.
+				// Additionally the width parameter would need special casing anyhow.
+				unset( $paramMap['img_width'] );
+			}
+
+			$mwArray = new MagicWordArray( array_keys( $paramMap ) );
+			wfProfileOut( __METHOD__ . '-getMagicWord' );
+
 			$label = '';
 			$alt = '';
 			$link = '';
+			$handlerOptions = array();
 			if ( isset( $matches[3] ) ) {
 				// look for an |alt= definition while trying not to break existing
 				// captions with multiple pipes (|) in it, until a more sensible grammar
 				// is defined for images in galleries
 
+				// FIXME: Doing recursiveTagParse at this stage, and the trim before
+				// splitting on '|' is a bit odd, and different from makeImage.
 				$matches[3] = $this->recursiveTagParse( trim( $matches[3] ) );
 				$parameterMatches = StringUtils::explode( '|', $matches[3] );
-				$magicWordAlt = MagicWord::get( 'img_alt' );
-				$magicWordLink = MagicWord::get( 'img_link' );
 
 				foreach ( $parameterMatches as $parameterMatch ) {
-					if ( $match = $magicWordAlt->matchVariableStartToEnd( $parameterMatch ) ) {
-						$alt = $this->stripAltText( $match, false );
-					}
-					elseif( $match = $magicWordLink->matchVariableStartToEnd( $parameterMatch ) ) {
-						$linkValue = strip_tags( $this->replaceLinkHoldersText( $match ) );
-						$chars = self::EXT_LINK_URL_CLASS;
-						$prots = $this->mUrlProtocols;
-						//check to see if link matches an absolute url, if not then it must be a wiki link.
-						if ( preg_match( "/^($prots)$chars+$/u", $linkValue ) ) {
-							$link = $linkValue;
-						} else {
-							$localLinkTitle = Title::newFromText( $linkValue );
-							if ( $localLinkTitle !== null ) {
-								$link = $localLinkTitle->getLocalURL();
+					list( $magicName, $match ) = $mwArray->matchVariableStartToEnd( $parameterMatch );
+					if ( $magicName ) {
+						$paramName = $paramMap[$magicName];
+
+						switch ( $paramName ) {
+						case 'gallery-internal-alt':
+							$alt = $this->stripAltText( $match, false );
+							break;
+						case 'gallery-internal-link':
+							$linkValue = strip_tags( $this->replaceLinkHoldersText( $match ) );
+							$chars = self::EXT_LINK_URL_CLASS;
+							$prots = $this->mUrlProtocols;
+							//check to see if link matches an absolute url, if not then it must be a wiki link.
+							if ( preg_match( "/^($prots)$chars+$/u", $linkValue ) ) {
+								$link = $linkValue;
+							} else {
+								$localLinkTitle = Title::newFromText( $linkValue );
+								if ( $localLinkTitle !== null ) {
+									$link = $localLinkTitle->getLocalURL();
+								}
+							}
+							break;
+						default:
+							// Must be a handler specific parameter.
+							if ( $handler->validateParam( $paramName, $match ) ) {
+								$handlerOptions[$paramName] = $match;
+							} else {
+								// Guess not. Append it to the caption.
+								wfDebug( "$parameterMatch failed parameter validation" );
+								$label .= '|' . $parameterMatch;
 							}
 						}
-					}
-					else {
+
+					} else {
 						// concatenate all other pipes
 						$label .= '|' . $parameterMatch;
 					}
@@ -5070,9 +5227,11 @@ class Parser {
 				$label = substr( $label, 1 );
 			}
 
-			$ig->add( $title, $label, $alt, $link );
+			$ig->add( $title, $label, $alt, $link, $handlerOptions );
 		}
-		return $ig->toHTML();
+		$html = $ig->toHTML();
+		wfProfileOut( __METHOD__ );
+		return $html;
 	}
 
 	/**
@@ -5187,14 +5346,14 @@ class Parser {
 				# Special case; width and height come in one variable together
 				if ( $type === 'handler' && $paramName === 'width' ) {
 					$parsedWidthParam = $this->parseWidthParam( $value );
-					if( isset( $parsedWidthParam['width'] ) ) {
+					if ( isset( $parsedWidthParam['width'] ) ) {
 						$width = $parsedWidthParam['width'];
 						if ( $handler->validateParam( 'width', $width ) ) {
 							$params[$type]['width'] = $width;
 							$validated = true;
 						}
 					}
-					if( isset( $parsedWidthParam['height'] ) ) {
+					if ( isset( $parsedWidthParam['height'] ) ) {
 						$height = $parsedWidthParam['height'];
 						if ( $handler->validateParam( 'height', $height ) ) {
 							$params[$type]['height'] = $height;
@@ -5208,7 +5367,7 @@ class Parser {
 						$validated = $handler->validateParam( $paramName, $value );
 					} else {
 						# Validate internal parameters
-						switch( $paramName ) {
+						switch ( $paramName ) {
 						case 'manualthumb':
 						case 'alt':
 						case 'class':
@@ -5646,20 +5805,41 @@ class Parser {
 	 * @return String: user name
 	 */
 	function getRevisionUser() {
-		if( is_null( $this->mRevisionUser ) ) {
+		if ( is_null( $this->mRevisionUser ) ) {
 			$revObject = $this->getRevisionObject();
 
 			# if this template is subst: the revision id will be blank,
 			# so just use the current user's name
-			if( $revObject ) {
+			if ( $revObject ) {
 				$this->mRevisionUser = $revObject->getUserText();
-			} elseif( $this->ot['wiki'] || $this->mOptions->getIsPreview() ) {
+			} elseif ( $this->ot['wiki'] || $this->mOptions->getIsPreview() ) {
 				$this->mRevisionUser = $this->getUser()->getName();
 			}
 		}
 		return $this->mRevisionUser;
 	}
 
+	/**
+	 * Get the size of the revision
+	 *
+	 * @return int|null revision size
+	 */
+	function getRevisionSize() {
+		if ( is_null( $this->mRevisionSize ) ) {
+			$revObject = $this->getRevisionObject();
+
+			# if this variable is subst: the revision id will be blank,
+			# so just use the parser input size, because the own substituation
+			# will change the size.
+			if ( $revObject ) {
+				$this->mRevisionSize = $revObject->getSize();
+			} elseif ( $this->ot['wiki'] || $this->mOptions->getIsPreview() ) {
+				$this->mRevisionSize = $this->mInputSize;
+			}
+		}
+		return $this->mRevisionSize;
+	}
+
 	/**
 	 * Mutator for $mDefaultSort
 	 *
@@ -5933,7 +6113,7 @@ class Parser {
 	 */
 	public function parseWidthParam( $value ) {
 		$parsedWidthParam = array();
-		if( $value === '' ) {
+		if ( $value === '' ) {
 			return $parsedWidthParam;
 		}
 		$m = array();
diff --git a/includes/parser/ParserCache.php b/includes/parser/ParserCache.php
index 0faa40a8..7053f134 100644
--- a/includes/parser/ParserCache.php
+++ b/includes/parser/ParserCache.php
@@ -67,7 +67,7 @@ class ParserCache {
 
 		// idhash seem to mean 'page id' + 'rendering hash' (r3710)
 		$pageid = $article->getID();
-		$renderkey = (int)($wgRequest->getVal( 'action' ) == 'render');
+		$renderkey = (int)( $wgRequest->getVal( 'action' ) == 'render' );
 
 		$key = wfMemcKey( 'pcache', 'idhash', "{$pageid}-{$renderkey}!{$hash}" );
 		return $key;
@@ -128,7 +128,7 @@ class ParserCache {
 	public function getKey( $article, $popts, $useOutdated = true ) {
 		global $wgCacheEpoch;
 
-		if( $popts instanceof User ) {
+		if ( $popts instanceof User ) {
 			wfWarn( "Use of outdated prototype ParserCache::getKey( &\$article, &\$user )\n" );
 			$popts = ParserOptions::newFromUser( $popts );
 		}
@@ -223,19 +223,19 @@ class ParserCache {
 	 * @param $parserOutput ParserOutput
 	 * @param $article Article
 	 * @param $popts ParserOptions
+	 * @param $cacheTime Time when the cache was generated
 	 */
-	public function save( $parserOutput, $article, $popts ) {
+	public function save( $parserOutput, $article, $popts, $cacheTime = null ) {
 		$expire = $parserOutput->getCacheExpiry();
-
-		if( $expire > 0 ) {
-			$now = wfTimestampNow();
+		if ( $expire > 0 ) {
+			$cacheTime = $cacheTime ?: wfTimestampNow();
 
 			$optionsKey = new CacheTime;
 			$optionsKey->mUsedOptions = $parserOutput->getUsedOptions();
 			$optionsKey->updateCacheExpiry( $expire );
 
-			$optionsKey->setCacheTime( $now );
-			$parserOutput->setCacheTime( $now );
+			$optionsKey->setCacheTime( $cacheTime );
+			$parserOutput->setCacheTime( $cacheTime );
 
 			$optionsKey->setContainsOldMagic( $parserOutput->containsOldMagic() );
 
@@ -245,8 +245,8 @@ class ParserCache {
 			// Save the timestamp so that we don't have to load the revision row on view
 			$parserOutput->setTimestamp( $article->getTimestamp() );
 
-			$parserOutput->mText .= "\n<!-- Saved in parser cache with key $parserOutputKey and timestamp $now -->\n";
-			wfDebug( "Saved in parser cache with key $parserOutputKey and timestamp $now\n" );
+			$parserOutput->mText .= "\n<!-- Saved in parser cache with key $parserOutputKey and timestamp $cacheTime\n -->\n";
+			wfDebug( "Saved in parser cache with key $parserOutputKey and timestamp $cacheTime\n" );
 
 			// Save the parser output
 			$this->mMemc->set( $parserOutputKey, $parserOutput, $expire );
diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php
index 3eb83e36..e12f32d8 100644
--- a/includes/parser/ParserOptions.php
+++ b/includes/parser/ParserOptions.php
@@ -240,6 +240,7 @@ class ParserOptions {
 	function getExternalLinkTarget()            { return $this->mExternalLinkTarget; }
 	function getDisableContentConversion()      { return $this->mDisableContentConversion; }
 	function getDisableTitleConversion()        { return $this->mDisableTitleConversion; }
+	/** @deprecated since 1.22 use User::getOption('math') instead */
 	function getMath()                          { $this->optionUsed( 'math' );
 												  return $this->mMath; }
 	function getThumbSize()                     { $this->optionUsed( 'thumbsize' );
@@ -280,9 +281,17 @@ class ParserOptions {
 	}
 
 	/**
+	 * Get the user language used by the parser for this page.
+	 *
 	 * You shouldn't use this. Really. $parser->getFunctionLang() is all you need.
-	 * Using this fragments the cache and is discouraged. Yes, {{int: }} uses this,
-	 * producing inconsistent tables (Bug 14404).
+	 *
+	 * To avoid side-effects where the page will be rendered based on the language
+	 * of the user who last saved, this function will triger a cache fragmentation.
+	 * Usage of this method is discouraged for that reason.
+	 *
+	 * When saving, this will return the default language instead of the user's.
+	 *
+	 * {{int: }} uses this which used to produce inconsistent link tables (bug 14404).
 	 *
 	 * @return Language object
 	 * @since 1.19
@@ -312,7 +321,7 @@ class ParserOptions {
 	function setAllowSpecialInclusion( $x )     { return wfSetVar( $this->mAllowSpecialInclusion, $x ); }
 	function setTidy( $x )                      { return wfSetVar( $this->mTidy, $x ); }
 
-	/** @deprecated in 1.19; will be removed in 1.20 */
+	/** @deprecated in 1.19 */
 	function setSkin( $x )                      { wfDeprecated( __METHOD__, '1.19' ); }
 	function setInterfaceMessage( $x )          { return wfSetVar( $this->mInterfaceMessage, $x ); }
 	function setTargetLanguage( $x )            { return wfSetVar( $this->mTargetLanguage, $x, true ); }
@@ -330,6 +339,7 @@ class ParserOptions {
 	function setExternalLinkTarget( $x )        { return wfSetVar( $this->mExternalLinkTarget, $x ); }
 	function disableContentConversion( $x = true ) { return wfSetVar( $this->mDisableContentConversion, $x ); }
 	function disableTitleConversion( $x = true ) { return wfSetVar( $this->mDisableTitleConversion, $x ); }
+	/** @deprecated since 1.22 */
 	function setMath( $x )                      { return wfSetVar( $this->mMath, $x ); }
 	function setUserLang( $x )                  {
 		if ( is_string( $x ) ) {
@@ -538,7 +548,7 @@ class ParserOptions {
 
 		// add in language specific options, if any
 		// @todo FIXME: This is just a way of retrieving the url/user preferred variant
-		if( !is_null( $title ) ) {
+		if ( !is_null( $title ) ) {
 			$confstr .= $title->getPageLanguage()->getExtraHashOptions();
 		} else {
 			global $wgContLang;
@@ -557,8 +567,9 @@ class ParserOptions {
 			$confstr .= '!printable=1';
 		}
 
-		if ( $this->mExtraKey != '' )
+		if ( $this->mExtraKey != '' ) {
 			$confstr .= $this->mExtraKey;
+		}
 
 		// Give a chance for extensions to modify the hash, if they have
 		// extra options or other effects on the parser cache.
diff --git a/includes/parser/ParserOutput.php b/includes/parser/ParserOutput.php
index db649f11..502f0fd1 100644
--- a/includes/parser/ParserOutput.php
+++ b/includes/parser/ParserOutput.php
@@ -47,11 +47,14 @@ class ParserOutput extends CacheTime {
 		$mEditSectionTokens = false,  # prefix/suffix markers if edit sections were output as tokens
 		$mProperties = array(),       # Name/value pairs to be cached in the DB
 		$mTOCHTML = '',               # HTML of the TOC
-		$mTimestamp;                  # Timestamp of the revision
+		$mTimestamp,                  # Timestamp of the revision
+		$mTOCEnabled = true;          # Whether TOC should be shown, can't override __NOTOC__
 		private $mIndexPolicy = '';       # 'index' or 'noindex'?  Any other value will result in no change.
 		private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
 		private $mSecondaryDataUpdates = array(); # List of DataUpdate, used to save info from the page somewhere else.
 		private $mExtensionData = array(); # extra data used by extensions
+		private $mLimitReportData = array(); # Parser limit report data
+		private $mParseStartTime = array(); # Timestamps for getTimeSinceStart()
 
 	const EDITSECTION_REGEX = '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
 
@@ -66,11 +69,27 @@ class ParserOutput extends CacheTime {
 	}
 
 	function getText() {
+		wfProfileIn( __METHOD__ );
+		$text = $this->mText;
 		if ( $this->mEditSectionTokens ) {
-			return preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
-				array( &$this, 'replaceEditSectionLinksCallback' ), $this->mText );
+			$text = preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
+				array( &$this, 'replaceEditSectionLinksCallback' ), $text );
+		} else {
+			$text = preg_replace( ParserOutput::EDITSECTION_REGEX, '', $text );
+		}
+
+		// If you have an old cached version of this class - sorry, you can't disable the TOC
+		if ( isset( $this->mTOCEnabled ) && $this->mTOCEnabled ) {
+			$text = str_replace( array( Parser::TOC_START, Parser::TOC_END ), '', $text );
+		} else {
+			$text = preg_replace(
+				'#'. preg_quote( Parser::TOC_START ) . '.*?' . preg_quote( Parser::TOC_END ) . '#s',
+				'',
+				$text
+			);
 		}
-		return preg_replace( ParserOutput::EDITSECTION_REGEX, '', $this->mText );
+		wfProfileOut( __METHOD__ );
+		return $text;
 	}
 
 	/**
@@ -120,6 +139,8 @@ class ParserOutput extends CacheTime {
 	function getIndexPolicy()            { return $this->mIndexPolicy; }
 	function getTOCHTML()                { return $this->mTOCHTML; }
 	function getTimestamp()              { return $this->mTimestamp; }
+	function getLimitReportData()        { return $this->mLimitReportData; }
+	function getTOCEnabled()             { return $this->mTOCEnabled; }
 
 	function setText( $text )            { return wfSetVar( $this->mText, $text ); }
 	function setLanguageLinks( $ll )     { return wfSetVar( $this->mLanguageLinks, $ll ); }
@@ -131,6 +152,7 @@ class ParserOutput extends CacheTime {
 	function setIndexPolicy( $policy )   { return wfSetVar( $this->mIndexPolicy, $policy ); }
 	function setTOCHTML( $tochtml )      { return wfSetVar( $this->mTOCHTML, $tochtml ); }
 	function setTimestamp( $timestamp )  { return wfSetVar( $this->mTimestamp, $timestamp ); }
+	function setTOCEnabled( $flag )      { return wfSetVar( $this->mTOCEnabled, $flag ); }
 
 	function addCategory( $c, $sort )    { $this->mCategories[$c] = $sort; }
 	function addLanguageLink( $t )       { $this->mLanguageLinks[] = $t; }
@@ -143,10 +165,10 @@ class ParserOutput extends CacheTime {
 	function setNewSection( $value ) {
 		$this->mNewSection = (bool)$value;
 	}
-	function hideNewSection ( $value ) {
+	function hideNewSection( $value ) {
 		$this->mHideNewSection = (bool)$value;
 	}
-	function getHideNewSection () {
+	function getHideNewSection() {
 		return (bool)$this->mHideNewSection;
 	}
 	function getNewSection() {
@@ -176,10 +198,10 @@ class ParserOutput extends CacheTime {
 		global $wgServer, $wgRegisterInternalExternals;
 
 		$registerExternalLink = true;
-		if( !$wgRegisterInternalExternals ) {
+		if ( !$wgRegisterInternalExternals ) {
 			$registerExternalLink = !self::isLinkInternal( $wgServer, $url );
 		}
-		if( $registerExternalLink ) {
+		if ( $registerExternalLink ) {
 			$this->mExternalLinks[$url] = 1;
 		}
 	}
@@ -201,11 +223,11 @@ class ParserOutput extends CacheTime {
 		if ( $ns == NS_MEDIA ) {
 			// Normalize this pseudo-alias if it makes it down here...
 			$ns = NS_FILE;
-		} elseif( $ns == NS_SPECIAL ) {
+		} elseif ( $ns == NS_SPECIAL ) {
 			// We don't record Special: links currently
 			// It might actually be wise to, but we'd need to do some normalization.
 			return;
-		} elseif( $dbk === '' ) {
+		} elseif ( $dbk === '' ) {
 			// Don't record self links -  [[#Foo]]
 			return;
 		}
@@ -258,7 +280,7 @@ class ParserOutput extends CacheTime {
 	 */
 	function addInterwikiLink( $title ) {
 		$prefix = $title->getInterwiki();
-		if( $prefix == '' ) {
+		if ( $prefix == '' ) {
 			throw new MWException( 'Non-interwiki link passed, internal parser error.' );
 		}
 		if ( !isset( $this->mInterwikiLinks[$prefix] ) ) {
@@ -281,7 +303,7 @@ class ParserOutput extends CacheTime {
 	}
 
 	public function addModules( $modules ) {
-		$this->mModules = array_merge( $this->mModules, (array) $modules );
+		$this->mModules = array_merge( $this->mModules, (array)$modules );
 	}
 
 	public function addModuleScripts( $modules ) {
@@ -329,7 +351,7 @@ class ParserOutput extends CacheTime {
 	 */
 	public function getDisplayTitle() {
 		$t = $this->getTitleText();
-		if( $t === '' ) {
+		if ( $t === '' ) {
 			return false;
 		}
 		return $t;
@@ -544,4 +566,67 @@ class ParserOutput extends CacheTime {
 		return null;
 	}
 
+	private static function getTimes( $clock = null ) {
+		$ret = array();
+		if ( !$clock || $clock === 'wall' ) {
+			$ret['wall'] = microtime( true );
+		}
+		if ( ( !$clock || $clock === 'cpu' ) && function_exists( 'getrusage' ) ) {
+			$ru = getrusage();
+			$ret['cpu'] = $ru['ru_utime.tv_sec'] + $ru['ru_utime.tv_usec'] / 1e6;
+			$ret['cpu'] += $ru['ru_stime.tv_sec'] + $ru['ru_stime.tv_usec'] / 1e6;
+		}
+		return $ret;
+	}
+
+	/**
+	 * Resets the parse start timestamps for future calls to getTimeSinceStart()
+	 * @since 1.22
+	 */
+	function resetParseStartTime() {
+		$this->mParseStartTime = self::getTimes();
+	}
+
+	/**
+	 * Returns the time since resetParseStartTime() was last called
+	 *
+	 * Clocks available are:
+	 *  - wall: Wall clock time
+	 *  - cpu: CPU time (requires getrusage)
+	 *
+	 * @since 1.22
+	 * @param string $clock
+	 * @return float|null
+	 */
+	function getTimeSinceStart( $clock ) {
+		if ( !isset( $this->mParseStartTime[$clock] ) ) {
+			return null;
+		}
+
+		$end = self::getTimes( $clock );
+		return $end[$clock] - $this->mParseStartTime[$clock];
+	}
+
+	/**
+	 * Sets parser limit report data for a key
+	 *
+	 * The key is used as the prefix for various messages used for formatting:
+	 *  - $key: The label for the field in the limit report
+	 *  - $key-value-text: Message used to format the value in the "NewPP limit
+	 *      report" HTML comment. If missing, uses $key-format.
+	 *  - $key-value-html: Message used to format the value in the preview
+	 *      limit report table. If missing, uses $key-format.
+	 *  - $key-value: Message used to format the value. If missing, uses "$1".
+	 *
+	 * Note that all values are interpreted as wikitext, and so should be
+	 * encoded with htmlspecialchars() as necessary, but should avoid complex
+	 * HTML for sanity of display in the "NewPP limit report" comment.
+	 *
+	 * @since 1.22
+	 * @param string $key Message key
+	 * @param mixed $value Appropriate for Message::params()
+	 */
+	function setLimitReportData( $key, $value ) {
+		$this->mLimitReportData[$key] = $value;
+	}
 }
diff --git a/includes/parser/Parser_DiffTest.php b/includes/parser/Parser_DiffTest.php
index f25340fa..aeae234a 100644
--- a/includes/parser/Parser_DiffTest.php
+++ b/includes/parser/Parser_DiffTest.php
@@ -122,7 +122,7 @@ class Parser_DiffTest
 
 	function setFunctionHook( $id, $callback, $flags = 0 ) {
 		$this->init();
-		foreach  ( $this->parsers as $parser ) {
+		foreach ( $this->parsers as $parser ) {
 			$parser->setFunctionHook( $id, $callback, $flags );
 		}
 	}
diff --git a/includes/parser/Parser_LinkHooks.php b/includes/parser/Parser_LinkHooks.php
deleted file mode 100644
index b2cdc41a..00000000
--- a/includes/parser/Parser_LinkHooks.php
+++ /dev/null
@@ -1,326 +0,0 @@
-<?php
-/**
- * Modified version of the PHP parser with hooks for wiki links; experimental
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Parser
- */
-
-/**
- * Parser with LinkHooks experiment
- * @ingroup Parser
- */
-class Parser_LinkHooks extends Parser {
-	/**
-	 * Update this version number when the ParserOutput format
-	 * changes in an incompatible way, so the parser cache
-	 * can automatically discard old data.
-	 */
-	const VERSION = '1.6.4';
-
-	# Flags for Parser::setLinkHook
-	# Also available as global constants from Defines.php
-	const SLH_PATTERN = 1;
-
-	# Constants needed for external link processing
-	# Everything except bracket, space, or control characters
-	const EXT_LINK_URL_CLASS = '[^][<>"\\x00-\\x20\\x7F]';
-	const EXT_IMAGE_REGEX = '/^(http:\/\/|https:\/\/)([^][<>"\\x00-\\x20\\x7F]+)
-		\\/([A-Za-z0-9_.,~%\\-+&;#*?!=()@\\x80-\\xFF]+)\\.((?i)gif|png|jpg|jpeg)$/Sx';
-
-	/**#@+
-	 * @private
-	 */
-	# Persistent:
-	var $mLinkHooks;
-
-	/**#@-*/
-
-	/**
-	 * Constructor
-	 */
-	public function __construct( $conf = array() ) {
-		parent::__construct( $conf );
-		$this->mLinkHooks = array();
-	}
-
-	/**
-	 * Do various kinds of initialisation on the first call of the parser
-	 */
-	function firstCallInit() {
-		parent::__construct();
-		if ( !$this->mFirstCall ) {
-			return;
-		}
-		$this->mFirstCall = false;
-
-		wfProfileIn( __METHOD__ );
-
-		$this->setHook( 'pre', array( $this, 'renderPreTag' ) );
-		CoreParserFunctions::register( $this );
-		CoreLinkFunctions::register( $this );
-		$this->initialiseVariables();
-
-		wfRunHooks( 'ParserFirstCallInit', array( &$this ) );
-		wfProfileOut( __METHOD__ );
-	}
-
-	/**
-	 * Create a link hook, e.g. [[Namepsace:...|display}}
-	 * The callback function should have the form:
-	 *    function myLinkCallback( $parser, $holders, $markers,
-	 *      Title $title, $titleText, &$sortText = null, &$leadingColon = false ) { ... }
-	 *
-	 * Or with SLH_PATTERN:
-	 *    function myLinkCallback( $parser, $holders, $markers, )
-	 *      &$titleText, &$sortText = null, &$leadingColon = false ) { ... }
-	 *
-	 * The callback may either return a number of different possible values:
-	 * String) Text result of the link
-	 * True) (Treat as link) Parse the link according to normal link rules
-	 * False) (Bad link) Just output the raw wikitext (You may modify the text first)
-	 *
-	 * @param $ns Integer or String: the Namespace ID or regex pattern if SLH_PATTERN is set
-	 * @param $callback Mixed: the callback function (and object) to use
-	 * @param $flags Integer: a combination of the following flags:
-	 *     SLH_PATTERN   Use a regex link pattern rather than a namespace
-	 *
-	 * @throws MWException
-	 * @return callback|null The old callback function for this name, if any
-	 */
-	public function setLinkHook( $ns, $callback, $flags = 0 ) {
-		if( $flags & SLH_PATTERN && !is_string($ns) )
-			throw new MWException( __METHOD__ . '() expecting a regex string pattern.' );
-		elseif( $flags | ~SLH_PATTERN && !is_int( $ns ) )
-			throw new MWException( __METHOD__ . '() expecting a namespace index.' );
-		$oldVal = isset( $this->mLinkHooks[$ns] ) ? $this->mLinkHooks[$ns][0] : null;
-		$this->mLinkHooks[$ns] = array( $callback, $flags );
-		return $oldVal;
-	}
-
-	/**
-	 * Get all registered link hook identifiers
-	 *
-	 * @return array
-	 */
-	function getLinkHooks() {
-		return array_keys( $this->mLinkHooks );
-	}
-
-	/**
-	 * Process [[ ]] wikilinks
-	 * @param $s
-	 * @throws MWException
-	 * @return LinkHolderArray
-	 *
-	 * @private
-	 */
-	function replaceInternalLinks2( &$s ) {
-		wfProfileIn( __METHOD__ );
-
-		wfProfileIn( __METHOD__ . '-setup' );
-		static $tc = false, $titleRegex; //$e1, $e1_img;
-		if( !$tc ) {
-			# the % is needed to support urlencoded titles as well
-			$tc = Title::legalChars() . '#%';
-			# Match a link having the form [[namespace:link|alternate]]trail
-			//$e1 = "/^([{$tc}]+)(?:\\|(.+?))?]](.*)\$/sD";
-			# Match cases where there is no "]]", which might still be images
-			//$e1_img = "/^([{$tc}]+)\\|(.*)\$/sD";
-			# Match a valid plain title
-			$titleRegex = "/^([{$tc}]+)$/sD";
-		}
-
-		$holders = new LinkHolderArray( $this );
-
-		if( is_null( $this->mTitle ) ) {
-			wfProfileOut( __METHOD__ . '-setup' );
-			wfProfileOut( __METHOD__ );
-			throw new MWException( __METHOD__ . ": \$this->mTitle is null\n" );
-		}
-
-		wfProfileOut( __METHOD__ . '-setup' );
-
-		$offset = 0;
-		$offsetStack = array();
-		$markers = new LinkMarkerReplacer( $this, $holders, array( &$this, 'replaceInternalLinksCallback' ) );
-		while( true ) {
-			$startBracketOffset = strpos( $s, '[[', $offset );
-			$endBracketOffset   = strpos( $s, ']]', $offset );
-			# Finish when there are no more brackets
-			if( $startBracketOffset === false && $endBracketOffset === false ) break;
-			# Determine if the bracket is a starting or ending bracket
-			# When we find both, use the first one
-			elseif( $startBracketOffset !== false && $endBracketOffset !== false )
-				$isStart = $startBracketOffset <= $endBracketOffset;
-			# When we only found one, check which it is
-			else $isStart = $startBracketOffset !== false;
-			$bracketOffset = $isStart ? $startBracketOffset : $endBracketOffset;
-			if( $isStart ) {
-				/** Opening bracket **/
-				# Just push our current offset in the string onto the stack
-				$offsetStack[] = $startBracketOffset;
-			} else {
-				/** Closing bracket **/
-				# Pop the start pos for our current link zone off the stack
-				$startBracketOffset = array_pop( $offsetStack );
-				# Just to clean up the code, lets place offsets on the outer ends
-				$endBracketOffset += 2;
-
-				# Only do logic if we actually have a opening bracket for this
-				if( isset( $startBracketOffset ) ) {
-					# Extract text inside the link
-					@list( $titleText, $paramText ) = explode( '|',
-						substr( $s, $startBracketOffset + 2, $endBracketOffset - $startBracketOffset - 4 ), 2 );
-					# Create markers only for valid links
-					if( preg_match( $titleRegex, $titleText ) ) {
-						# Store the text for the marker
-						$marker = $markers->addMarker( $titleText, $paramText );
-						# Replace the current link with the marker
-						$s = substr( $s, 0, $startBracketOffset ) .
-							$marker .
-							substr( $s, $endBracketOffset );
-						# We have modified $s, because of this we need to set the
-						# offset manually since the end position is different now
-						$offset = $startBracketOffset+strlen( $marker );
-						continue;
-					}
-					# ToDo: Some LinkHooks may allow recursive links inside of
-					# the link text, create a regex that also matches our
-					# <!-- LINKMARKER ### --> sequence in titles
-					# ToDO: Some LinkHooks use patterns rather than namespaces
-					# these need to be tested at this point here
-				}
-			}
-			# Bump our offset to after our current bracket
-			$offset = $bracketOffset+2;
-		}
-
-		# Now expand our tree
-		wfProfileIn( __METHOD__ . '-expand' );
-		$s = $markers->expand( $s );
-		wfProfileOut( __METHOD__ . '-expand' );
-
-		wfProfileOut( __METHOD__ );
-		return $holders;
-	}
-
-	function replaceInternalLinksCallback( $parser, $holders, $markers, $titleText, $paramText ) {
-		wfProfileIn( __METHOD__ );
-		$wt = isset( $paramText ) ? "[[$titleText|$paramText]]" : "[[$titleText]]";
-		wfProfileIn( __METHOD__ . "-misc" );
-
-		# Don't allow internal links to pages containing
-		# PROTO: where PROTO is a valid URL protocol; these
-		# should be external links.
-		if( preg_match( '/^\b(?i:' . wfUrlProtocols() . ')/', $titleText ) ) {
-			wfProfileOut( __METHOD__ . "-misc" );
-			wfProfileOut( __METHOD__ );
-			return $wt;
-		}
-
-		# Make subpage if necessary
-		if( $this->areSubpagesAllowed() ) {
-			$titleText = $this->maybeDoSubpageLink( $titleText, $paramText );
-		}
-
-		# Check for a leading colon and strip it if it is there
-		$leadingColon = $titleText[0] == ':';
-		if( $leadingColon ) $titleText = substr( $titleText, 1 );
-
-		wfProfileOut( __METHOD__ . "-misc" );
-		# Make title object
-		wfProfileIn( __METHOD__ . "-title" );
-		$title = Title::newFromText( $this->mStripState->unstripNoWiki( $titleText ) );
-		if( !$title ) {
-			wfProfileOut( __METHOD__ . "-title" );
-			wfProfileOut( __METHOD__ );
-			return $wt;
-		}
-		$ns = $title->getNamespace();
-		wfProfileOut( __METHOD__ . "-title" );
-
-		# Default for Namespaces is a default link
-		# ToDo: Default for patterns is plain wikitext
-		$return = true;
-		if( isset( $this->mLinkHooks[$ns] ) ) {
-			list( $callback, $flags ) = $this->mLinkHooks[$ns];
-			if( $flags & SLH_PATTERN ) {
-				$args = array( $parser, $holders, $markers, $titleText, &$paramText, &$leadingColon );
-			} else {
-				$args = array( $parser, $holders, $markers, $title, $titleText, &$paramText, &$leadingColon );
-			}
-			# Workaround for PHP bug 35229 and similar
-			if ( !is_callable( $callback ) ) {
-				throw new MWException( "Tag hook for namespace $ns is not callable\n" );
-			}
-			$return = call_user_func_array( $callback, $args );
-		}
-		if( $return === true ) {
-			# True (treat as plain link) was returned, call the defaultLinkHook
-			$return = CoreLinkFunctions::defaultLinkHook( $parser, $holders, $markers, $title,
-				$titleText, $paramText, $leadingColon );
-		}
-		if( $return === false ) {
-			# False (no link) was returned, output plain wikitext
-			# Build it again as the hook is allowed to modify $paramText
-			$return = isset( $paramText ) ? "[[$titleText|$paramText]]" : "[[$titleText]]";
-		}
-		# Content was returned, return it
-		wfProfileOut( __METHOD__ );
-		return $return;
-	}
-
-}
-
-class LinkMarkerReplacer {
-
-	protected $markers, $nextId, $parser, $holders, $callback;
-
-	function __construct( $parser, $holders, $callback ) {
-		$this->nextId   = 0;
-		$this->markers  = array();
-		$this->parser   = $parser;
-		$this->holders  = $holders;
-		$this->callback = $callback;
-	}
-
-	function addMarker( $titleText, $paramText ) {
-		$id = $this->nextId++;
-		$this->markers[$id] = array( $titleText, $paramText );
-		return "<!-- LINKMARKER $id -->";
-	}
-
-	function findMarker( $string ) {
-		return (bool) preg_match( '/<!-- LINKMARKER [0-9]+ -->/', $string );
-	}
-
-	function expand( $string ) {
-		return StringUtils::delimiterReplaceCallback( "<!-- LINKMARKER ", " -->", array( &$this, 'callback' ), $string );
-	}
-
-	function callback( $m ) {
-		$id = intval( $m[1] );
-		if( !array_key_exists( $id, $this->markers ) ) return $m[0];
-		$args = $this->markers[$id];
-		array_unshift( $args, $this );
-		array_unshift( $args, $this->holders );
-		array_unshift( $args, $this->parser );
-		return call_user_func_array( $this->callback, $args );
-	}
-}
diff --git a/includes/parser/Preprocessor_DOM.php b/includes/parser/Preprocessor_DOM.php
index d0c57ab5..3138f483 100644
--- a/includes/parser/Preprocessor_DOM.php
+++ b/includes/parser/Preprocessor_DOM.php
@@ -72,9 +72,8 @@ class Preprocessor_DOM implements Preprocessor {
 		$xml = "<list>";
 
 		foreach ( $values as $k => $val ) {
-
 			if ( is_int( $k ) ) {
-				$xml .= "<part><name index=\"$k\"/><value>" . htmlspecialchars( $val ) ."</value></part>";
+				$xml .= "<part><name index=\"$k\"/><value>" . htmlspecialchars( $val ) . "</value></part>";
 			} else {
 				$xml .= "<part><name>" . htmlspecialchars( $k ) . "</name>=<value>" . htmlspecialchars( $val ) . "</value></part>";
 			}
@@ -149,26 +148,28 @@ class Preprocessor_DOM implements Preprocessor {
 					wfDebugLog( "Preprocessor", "Loaded preprocessor XML from memcached (key $cacheKey)" );
 				}
 			}
-		}
-		if ( $xml === false ) {
-			if ( $cacheable ) {
+			if ( $xml === false ) {
 				wfProfileIn( __METHOD__ . '-cache-miss' );
 				$xml = $this->preprocessToXml( $text, $flags );
 				$cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . $xml;
 				$wgMemc->set( $cacheKey, $cacheValue, 86400 );
 				wfProfileOut( __METHOD__ . '-cache-miss' );
 				wfDebugLog( "Preprocessor", "Saved preprocessor XML to memcached (key $cacheKey)" );
-			} else {
-				$xml = $this->preprocessToXml( $text, $flags );
 			}
-
+		} else {
+			$xml = $this->preprocessToXml( $text, $flags );
 		}
 
+
 		// Fail if the number of elements exceeds acceptable limits
 		// Do not attempt to generate the DOM
 		$this->parser->mGeneratedPPNodeCount += substr_count( $xml, '<' );
 		$max = $this->parser->mOptions->getMaxGeneratedPPNodeCount();
 		if ( $this->parser->mGeneratedPPNodeCount > $max ) {
+			if ( $cacheable ) {
+				wfProfileOut( __METHOD__ . '-cacheable' );
+			}
+			wfProfileOut( __METHOD__ );
 			throw new MWException( __METHOD__ . ': generated node count limit exceeded' );
 		}
 
@@ -182,16 +183,21 @@ class Preprocessor_DOM implements Preprocessor {
 			$xml = UtfNormal::cleanUp( $xml );
 			// 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2 don't barf when the XML is >256 levels deep
 			$result = $dom->loadXML( $xml, 1 << 19 );
-			if ( !$result ) {
-				throw new MWException( __METHOD__ . ' generated invalid XML' );
-			}
 		}
-		$obj = new PPNode_DOM( $dom->documentElement );
+		if ( $result ) {
+			$obj = new PPNode_DOM( $dom->documentElement );
+		}
 		wfProfileOut( __METHOD__ . '-loadXML' );
+
 		if ( $cacheable ) {
 			wfProfileOut( __METHOD__ . '-cacheable' );
 		}
+
 		wfProfileOut( __METHOD__ );
+
+		if ( !$result ) {
+			throw new MWException( __METHOD__ . ' generated invalid XML' );
+		}
 		return $obj;
 	}
 
@@ -355,9 +361,11 @@ class Preprocessor_DOM implements Preprocessor {
 				}
 				// Handle comments
 				if ( isset( $matches[2] ) && $matches[2] == '!--' ) {
-					// To avoid leaving blank lines, when a comment is both preceded
-					// and followed by a newline (ignoring spaces), trim leading and
-					// trailing spaces and one of the newlines.
+
+					// To avoid leaving blank lines, when a sequence of
+					// space-separated comments is both preceded and followed by
+					// a newline (ignoring spaces), then
+					// trim leading and trailing spaces and the trailing newline.
 
 					// Find the end
 					$endPos = strpos( $text, '-->', $i + 4 );
@@ -368,10 +376,25 @@ class Preprocessor_DOM implements Preprocessor {
 						$i = $lengthText;
 					} else {
 						// Search backwards for leading whitespace
-						$wsStart = $i ? ( $i - strspn( $revText, ' ', $lengthText - $i ) ) : 0;
+						$wsStart = $i ? ( $i - strspn( $revText, " \t", $lengthText - $i ) ) : 0;
+
 						// Search forwards for trailing whitespace
 						// $wsEnd will be the position of the last space (or the '>' if there's none)
-						$wsEnd = $endPos + 2 + strspn( $text, ' ', $endPos + 3 );
+						$wsEnd = $endPos + 2 + strspn( $text, " \t", $endPos + 3 );
+
+						// Keep looking forward as long as we're finding more
+						// comments.
+						$comments = array( array( $wsStart, $wsEnd ) );
+						while ( substr( $text, $wsEnd + 1, 4 ) == '<!--' ) {
+							$c = strpos( $text, '-->', $wsEnd + 4 );
+							if ( $c === false ) {
+								break;
+							}
+							$c = $c + 2 + strspn( $text, " \t", $c + 3 );
+							$comments[] = array( $wsEnd + 1, $c );
+							$wsEnd = $c;
+						}
+
 						// Eat the line if possible
 						// TODO: This could theoretically be done if $wsStart == 0, i.e. for comments at
 						// the overall start. That's not how Sanitizer::removeHTMLcomments() did it, but
@@ -379,14 +402,26 @@ class Preprocessor_DOM implements Preprocessor {
 						if ( $wsStart > 0 && substr( $text, $wsStart - 1, 1 ) == "\n"
 							&& substr( $text, $wsEnd + 1, 1 ) == "\n" )
 						{
-							$startPos = $wsStart;
-							$endPos = $wsEnd + 1;
 							// Remove leading whitespace from the end of the accumulator
 							// Sanity check first though
 							$wsLength = $i - $wsStart;
-							if ( $wsLength > 0 && substr( $accum, -$wsLength ) === str_repeat( ' ', $wsLength ) ) {
+							if ( $wsLength > 0
+								&& strspn( $accum, " \t", -$wsLength ) === $wsLength )
+							{
 								$accum = substr( $accum, 0, -$wsLength );
 							}
+
+							// Dump all but the last comment to the accumulator
+							foreach ( $comments as $j => $com ) {
+								$startPos = $com[0];
+								$endPos = $com[1] + 1;
+								if ( $j == ( count( $comments ) - 1 ) ) {
+									break;
+								}
+								$inner = substr( $text, $startPos, $endPos - $startPos );
+								$accum .= '<comment>' . htmlspecialchars( $inner ) . '</comment>';
+							}
+
 							// Do a line-start run next time to look for headings after the comment
 							$fakeLineStart = true;
 						} else {
@@ -397,7 +432,7 @@ class Preprocessor_DOM implements Preprocessor {
 
 						if ( $stack->top ) {
 							$part = $stack->top->getCurrentPart();
-							if ( !(isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 )) {
+							if ( !( isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 ) ) {
 								$part->visualEnd = $wsStart;
 							}
 							// Else comments abutting, no change in visual end
@@ -432,7 +467,7 @@ class Preprocessor_DOM implements Preprocessor {
 				}
 
 				$tagStartPos = $i;
-				if ( $text[$tagEndPos-1] == '/' ) {
+				if ( $text[$tagEndPos - 1] == '/' ) {
 					$attrEnd = $tagEndPos - 1;
 					$inner = null;
 					$i = $tagEndPos + 1;
@@ -569,7 +604,7 @@ class Preprocessor_DOM implements Preprocessor {
 						'open' => $curChar,
 						'close' => $rule['end'],
 						'count' => $count,
-						'lineStart' => ($i > 0 && $text[$i-1] == "\n"),
+						'lineStart' => ( $i > 0 && $text[$i - 1] == "\n" ),
 					);
 
 					$stack->push( $piece );
@@ -746,7 +781,7 @@ class PPDStack {
 			$class = $this->elementClass;
 			$this->stack[] = new $class( $data );
 		}
-		$this->top = $this->stack[ count( $this->stack ) - 1 ];
+		$this->top = $this->stack[count( $this->stack ) - 1];
 		$this->accum =& $this->top->getAccum();
 	}
 
@@ -757,7 +792,7 @@ class PPDStack {
 		$temp = array_pop( $this->stack );
 
 		if ( count( $this->stack ) ) {
-			$this->top = $this->stack[ count( $this->stack ) - 1 ];
+			$this->top = $this->stack[count( $this->stack ) - 1];
 			$this->accum =& $this->top->getAccum();
 		} else {
 			$this->top = self::$false;
@@ -1014,11 +1049,13 @@ class PPFrame_DOM implements PPFrame {
 
 		while ( count( $iteratorStack ) > 1 ) {
 			$level = count( $outStack ) - 1;
-			$iteratorNode =& $iteratorStack[ $level ];
+			$iteratorNode =& $iteratorStack[$level];
 			$out =& $outStack[$level];
 			$index =& $indexStack[$level];
 
-			if ( $iteratorNode instanceof PPNode_DOM ) $iteratorNode = $iteratorNode->node;
+			if ( $iteratorNode instanceof PPNode_DOM ) {
+				$iteratorNode = $iteratorNode->node;
+			}
 
 			if ( is_array( $iteratorNode ) ) {
 				if ( $index >= count( $iteratorNode ) ) {
@@ -1148,9 +1185,7 @@ class PPFrame_DOM implements PPFrame {
 
 					# Insert a heading marker only for <h> children of <root>
 					# This is to stop extractSections from going over multiple tree levels
-					if ( $contextNode->parentNode->nodeName == 'root'
-					  && $this->parser->ot['html'] )
-					{
+					if ( $contextNode->parentNode->nodeName == 'root' && $this->parser->ot['html'] ) {
 						# Insert heading index marker
 						$headingIndex = $contextNode->getAttribute( 'i' );
 						$titleText = $this->title->getPrefixedDBkey();
@@ -1206,7 +1241,9 @@ class PPFrame_DOM implements PPFrame {
 		$first = true;
 		$s = '';
 		foreach ( $args as $root ) {
-			if ( $root instanceof PPNode_DOM ) $root = $root->node;
+			if ( $root instanceof PPNode_DOM ) {
+				$root = $root->node;
+			}
 			if ( !is_array( $root ) && !( $root instanceof DOMNodeList ) ) {
 				$root = array( $root );
 			}
diff --git a/includes/parser/Preprocessor_Hash.php b/includes/parser/Preprocessor_Hash.php
index fad1adbb..2fc5e118 100644
--- a/includes/parser/Preprocessor_Hash.php
+++ b/includes/parser/Preprocessor_Hash.php
@@ -287,9 +287,11 @@ class Preprocessor_Hash implements Preprocessor {
 				}
 				// Handle comments
 				if ( isset( $matches[2] ) && $matches[2] == '!--' ) {
-					// To avoid leaving blank lines, when a comment is both preceded
-					// and followed by a newline (ignoring spaces), trim leading and
-					// trailing spaces and one of the newlines.
+
+					// To avoid leaving blank lines, when a sequence of
+					// space-separated comments is both preceded and followed by
+					// a newline (ignoring spaces), then
+					// trim leading and trailing spaces and the trailing newline.
 
 					// Find the end
 					$endPos = strpos( $text, '-->', $i + 4 );
@@ -300,10 +302,25 @@ class Preprocessor_Hash implements Preprocessor {
 						$i = $lengthText;
 					} else {
 						// Search backwards for leading whitespace
-						$wsStart = $i ? ( $i - strspn( $revText, ' ', $lengthText - $i ) ) : 0;
+						$wsStart = $i ? ( $i - strspn( $revText, " \t", $lengthText - $i ) ) : 0;
+
 						// Search forwards for trailing whitespace
 						// $wsEnd will be the position of the last space (or the '>' if there's none)
-						$wsEnd = $endPos + 2 + strspn( $text, ' ', $endPos + 3 );
+						$wsEnd = $endPos + 2 + strspn( $text, " \t", $endPos + 3 );
+
+						// Keep looking forward as long as we're finding more
+						// comments.
+						$comments = array( array( $wsStart, $wsEnd ) );
+						while ( substr( $text, $wsEnd + 1, 4 ) == '<!--' ) {
+							$c = strpos( $text, '-->', $wsEnd + 4 );
+							if ( $c === false ) {
+								break;
+							}
+							$c = $c + 2 + strspn( $text, " \t", $c + 3 );
+							$comments[] = array( $wsEnd + 1, $c );
+							$wsEnd = $c;
+						}
+
 						// Eat the line if possible
 						// TODO: This could theoretically be done if $wsStart == 0, i.e. for comments at
 						// the overall start. That's not how Sanitizer::removeHTMLcomments() did it, but
@@ -311,17 +328,27 @@ class Preprocessor_Hash implements Preprocessor {
 						if ( $wsStart > 0 && substr( $text, $wsStart - 1, 1 ) == "\n"
 							&& substr( $text, $wsEnd + 1, 1 ) == "\n" )
 						{
-							$startPos = $wsStart;
-							$endPos = $wsEnd + 1;
 							// Remove leading whitespace from the end of the accumulator
 							// Sanity check first though
 							$wsLength = $i - $wsStart;
 							if ( $wsLength > 0
 								&& $accum->lastNode instanceof PPNode_Hash_Text
-								&& substr( $accum->lastNode->value, -$wsLength ) === str_repeat( ' ', $wsLength ) )
+								&& strspn( $accum->lastNode->value, " \t", -$wsLength ) === $wsLength )
 							{
 								$accum->lastNode->value = substr( $accum->lastNode->value, 0, -$wsLength );
 							}
+
+							// Dump all but the last comment to the accumulator
+							foreach ( $comments as $j => $com ) {
+								$startPos = $com[0];
+								$endPos = $com[1] + 1;
+								if ( $j == ( count( $comments ) - 1 ) ) {
+									break;
+								}
+								$inner = substr( $text, $startPos, $endPos - $startPos );
+								$accum->addNodeWithText( 'comment', $inner );
+							}
+
 							// Do a line-start run next time to look for headings after the comment
 							$fakeLineStart = true;
 						} else {
@@ -332,7 +359,7 @@ class Preprocessor_Hash implements Preprocessor {
 
 						if ( $stack->top ) {
 							$part = $stack->top->getCurrentPart();
-							if ( !(isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 )) {
+							if ( !( isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 ) ) {
 								$part->visualEnd = $wsStart;
 							}
 							// Else comments abutting, no change in visual end
@@ -367,7 +394,7 @@ class Preprocessor_Hash implements Preprocessor {
 				}
 
 				$tagStartPos = $i;
-				if ( $text[$tagEndPos-1] == '/' ) {
+				if ( $text[$tagEndPos - 1] == '/' ) {
 					// Short end tag
 					$attrEnd = $tagEndPos - 1;
 					$inner = null;
@@ -515,7 +542,7 @@ class Preprocessor_Hash implements Preprocessor {
 						'open' => $curChar,
 						'close' => $rule['end'],
 						'count' => $count,
-						'lineStart' => ($i > 0 && $text[$i-1] == "\n"),
+						'lineStart' => ( $i > 0 && $text[$i - 1] == "\n" ),
 					);
 
 					$stack->push( $piece );
@@ -591,9 +618,19 @@ class Preprocessor_Hash implements Preprocessor {
 								$lastNode = $node;
 							}
 							if ( !$node ) {
+								if ( $cacheable ) {
+									wfProfileOut( __METHOD__ . '-cache-miss' );
+									wfProfileOut( __METHOD__ . '-cacheable' );
+								}
+								wfProfileOut( __METHOD__ );
 								throw new MWException( __METHOD__ . ': eqpos not found' );
 							}
 							if ( $node->name !== 'equals' ) {
+								if ( $cacheable ) {
+									wfProfileOut( __METHOD__ . '-cache-miss' );
+									wfProfileOut( __METHOD__ . '-cacheable' );
+								}
+								wfProfileOut( __METHOD__ );
 								throw new MWException( __METHOD__ . ': eqpos is not equals' );
 							}
 							$equalsNode = $node;
@@ -952,7 +989,7 @@ class PPFrame_Hash implements PPFrame {
 
 		while ( count( $iteratorStack ) > 1 ) {
 			$level = count( $outStack ) - 1;
-			$iteratorNode =& $iteratorStack[ $level ];
+			$iteratorNode =& $iteratorStack[$level];
 			$out =& $outStack[$level];
 			$index =& $indexStack[$level];
 
diff --git a/includes/parser/Tidy.php b/includes/parser/Tidy.php
index 0f7e0d31..32b16aaf 100644
--- a/includes/parser/Tidy.php
+++ b/includes/parser/Tidy.php
@@ -61,7 +61,10 @@ class MWTidyWrapper {
 
 		// Replace <mw:editsection> elements with placeholders
 		$wrappedtext = preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
-			array( &$this, 'replaceEditSectionLinksCallback' ), $text );
+			array( &$this, 'replaceCallback' ), $text );
+		// ...and <mw:toc> markers
+		$wrappedtext = preg_replace_callback( '/\<\\/?mw:toc\>/',
+			array( &$this, 'replaceCallback' ), $wrappedtext );
 
 		// Modify inline Microdata <link> and <meta> elements so they say <html-link> and <html-meta> so
 		// we can trick Tidy into not stripping them out by including them in tidy's new-empty-tags config
@@ -80,7 +83,7 @@ class MWTidyWrapper {
 	 *
 	 * @return string
 	 */
-	function replaceEditSectionLinksCallback( $m ) {
+	function replaceCallback( $m ) {
 		$marker = "{$this->mUniqPrefix}-item-{$this->mMarkerIndex}" . Parser::MARKER_SUFFIX;
 		$this->mMarkerIndex++;
 		$this->mTokens->setPair( $marker, $m[0] );
@@ -158,7 +161,7 @@ class MWTidy {
 		global $wgTidyInternal;
 
 		$retval = 0;
-		if( $wgTidyInternal ) {
+		if ( $wgTidyInternal ) {
 			$errorStr = self::execInternalTidy( $text, true, $retval );
 		} else {
 			$errorStr = self::execExternalTidy( $text, true, $retval );
@@ -244,7 +247,7 @@ class MWTidy {
 		global $wgTidyConf, $wgDebugTidy;
 		wfProfileIn( __METHOD__ );
 
-		if ( !MWInit::classExists( 'tidy' ) ) {
+		if ( !class_exists( 'tidy' ) ) {
 			wfWarn( "Unable to load internal tidy class." );
 			$retval = -1;
 
diff --git a/includes/profiler/Profiler.php b/includes/profiler/Profiler.php
index 5ecdc4f0..2282a3af 100644
--- a/includes/profiler/Profiler.php
+++ b/includes/profiler/Profiler.php
@@ -31,9 +31,11 @@
  * @param string $functionname name of the function we will profile
  */
 function wfProfileIn( $functionname ) {
-	global $wgProfiler;
-	if ( $wgProfiler instanceof Profiler || isset( $wgProfiler['class'] ) ) {
-		Profiler::instance()->profileIn( $functionname );
+	if ( Profiler::$__instance === null ) { // use this directly to reduce overhead
+		Profiler::instance();
+	}
+	if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
+		Profiler::$__instance->profileIn( $functionname );
 	}
 }
 
@@ -42,9 +44,49 @@ function wfProfileIn( $functionname ) {
  * @param string $functionname name of the function we have profiled
  */
 function wfProfileOut( $functionname = 'missing' ) {
-	global $wgProfiler;
-	if ( $wgProfiler instanceof Profiler || isset( $wgProfiler['class'] ) ) {
-		Profiler::instance()->profileOut( $functionname );
+	if ( Profiler::$__instance === null ) { // use this directly to reduce overhead
+		Profiler::instance();
+	}
+	if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
+		Profiler::$__instance->profileOut( $functionname );
+	}
+}
+
+/**
+ * Class for handling function-scope profiling
+ *
+ * @since 1.22
+ */
+class ProfileSection {
+	protected $name; // string; method name
+	protected $enabled = false; // boolean; whether profiling is enabled
+
+	/**
+	 * Begin profiling of a function and return an object that ends profiling of
+	 * the function when that object leaves scope. As long as the object is not
+	 * specifically linked to other objects, it will fall out of scope at the same
+	 * moment that the function to be profiled terminates.
+	 *
+	 * This is typically called like:
+	 * <code>$section = new ProfileSection( __METHOD__ );</code>
+	 *
+	 * @param string $name Name of the function to profile
+	 */
+	public function __construct( $name ) {
+		$this->name = $name;
+		if ( Profiler::$__instance === null ) { // use this directly to reduce overhead
+			Profiler::instance();
+		}
+		if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
+			$this->enabled = true;
+			Profiler::$__instance->profileIn( $this->name );
+		}
+	}
+
+	function __destruct() {
+		if ( $this->enabled ) {
+			Profiler::$__instance->profileOut( $this->name );
+		}
 	}
 }
 
@@ -53,11 +95,19 @@ function wfProfileOut( $functionname = 'missing' ) {
  * @todo document
  */
 class Profiler {
-	protected $mStack = array(), $mWorkStack = array (), $mCollated = array (),
-		$mCalls = array (), $mTotals = array ();
+	protected $mStack = array(), $mWorkStack = array(), $mCollated = array(),
+		$mCalls = array(), $mTotals = array();
 	protected $mTimeMetric = 'wall';
 	protected $mProfileID = false, $mCollateDone = false, $mTemplated = false;
-	private static $__instance = null;
+
+	protected $mDBLockThreshold = 5.0; // float; seconds
+	/** @var Array DB/server name => (active trx count,timestamp) */
+	protected $mDBTrxHoldingLocks = array();
+	/** @var Array DB/server name => list of (method, elapsed time) */
+	protected $mDBTrxMethodTimes = array();
+
+	/** @var Profiler */
+	public static $__instance = null; // do not call this outside Profiler and ProfileSection
 
 	function __construct( $params ) {
 		if ( isset( $params['timeMetric'] ) ) {
@@ -75,22 +125,18 @@ class Profiler {
 	 * @return Profiler
 	 */
 	public static function instance() {
-		if( is_null( self::$__instance ) ) {
+		if ( self::$__instance === null ) {
 			global $wgProfiler;
-			if( is_array( $wgProfiler ) ) {
-				if( !isset( $wgProfiler['class'] ) ) {
-					wfDebug( __METHOD__ . " called without \$wgProfiler['class']"
-						. " set, falling back to ProfilerStub for safety\n" );
+			if ( is_array( $wgProfiler ) ) {
+				if ( !isset( $wgProfiler['class'] ) ) {
 					$class = 'ProfilerStub';
 				} else {
 					$class = $wgProfiler['class'];
 				}
 				self::$__instance = new $class( $wgProfiler );
-			} elseif( $wgProfiler instanceof Profiler ) {
+			} elseif ( $wgProfiler instanceof Profiler ) {
 				self::$__instance = $wgProfiler; // back-compat
 			} else {
-				wfDebug( __METHOD__ . ' called with bogus $wgProfiler setting,'
-						. " falling back to ProfilerStub for safety\n" );
 				self::$__instance = new ProfilerStub( $wgProfiler );
 			}
 		}
@@ -157,7 +203,7 @@ class Profiler {
 	 */
 	public function profileIn( $functionname ) {
 		global $wgDebugFunctionEntry;
-		if( $wgDebugFunctionEntry ) {
+		if ( $wgDebugFunctionEntry ) {
 			$this->debug( str_repeat( ' ', count( $this->mWorkStack ) ) . 'Entering ' . $functionname . "\n" );
 		}
 
@@ -174,7 +220,7 @@ class Profiler {
 		$memory = memory_get_usage();
 		$time = $this->getTime();
 
-		if( $wgDebugFunctionEntry ) {
+		if ( $wgDebugFunctionEntry ) {
 			$this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) . 'Exiting ' . $functionname . "\n" );
 		}
 
@@ -183,21 +229,19 @@ class Profiler {
 		if ( !$bit ) {
 			$this->debug( "Profiling error, !\$bit: $functionname\n" );
 		} else {
-			//if( $wgDebugProfiling ) {
-				if( $functionname == 'close' ) {
-					$message = "Profile section ended by close(): {$bit[0]}";
-					$this->debug( "$message\n" );
-					$this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
-				}
-				elseif( $bit[0] != $functionname ) {
-					$message = "Profiling error: in({$bit[0]}), out($functionname)";
-					$this->debug( "$message\n" );
-					$this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
-				}
-			//}
+			if ( $functionname == 'close' ) {
+				$message = "Profile section ended by close(): {$bit[0]}";
+				$this->debug( "$message\n" );
+				$this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
+			} elseif ( $bit[0] != $functionname ) {
+				$message = "Profiling error: in({$bit[0]}), out($functionname)";
+				$this->debug( "$message\n" );
+				$this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
+			}
 			$bit[] = $time;
 			$bit[] = $memory;
 			$this->mStack[] = $bit;
+			$this->updateTrxProfiling( $functionname, $time );
 		}
 	}
 
@@ -205,11 +249,88 @@ class Profiler {
 	 * Close opened profiling sections
 	 */
 	public function close() {
-		while( count( $this->mWorkStack ) ) {
+		while ( count( $this->mWorkStack ) ) {
 			$this->profileOut( 'close' );
 		}
 	}
 
+	/**
+	 * Mark a DB as in a transaction with one or more writes pending
+	 *
+	 * Note that there can be multiple connections to a single DB.
+	 *
+	 * @param string $server DB server
+	 * @param string $db DB name
+	 */
+	public function transactionWritingIn( $server, $db ) {
+		$name = "{$server} ({$db})";
+		if ( isset( $this->mDBTrxHoldingLocks[$name] ) ) {
+			++$this->mDBTrxHoldingLocks[$name]['refs'];
+		} else {
+			$this->mDBTrxHoldingLocks[$name] = array( 'refs' => 1, 'start' => microtime( true ) );
+			$this->mDBTrxMethodTimes[$name] = array();
+		}
+	}
+
+	/**
+	 * Register the name and time of a method for slow DB trx detection
+	 *
+	 * @param string $method Function name
+	 * @param float $realtime Wal time ellapsed
+	 */
+	protected function updateTrxProfiling( $method, $realtime ) {
+		if ( !$this->mDBTrxHoldingLocks ) {
+			return; // short-circuit
+		// @TODO: hardcoded check is a tad janky (what about FOR UPDATE?)
+		} elseif ( !preg_match( '/^query-m: (?!SELECT)/', $method )
+			&& $realtime < $this->mDBLockThreshold )
+		{
+			return; // not a DB master query nor slow enough
+		}
+		$now = microtime( true );
+		foreach ( $this->mDBTrxHoldingLocks as $name => $info ) {
+			// Hacky check to exclude entries from before the first TRX write
+			if ( ( $now - $realtime ) >= $info['start'] ) {
+				$this->mDBTrxMethodTimes[$name][] = array( $method, $realtime );
+			}
+		}
+	}
+
+	/**
+	 * Mark a DB as no longer in a transaction
+	 *
+	 * This will check if locks are possibly held for longer than
+	 * needed and log any affected transactions to a special DB log.
+	 * Note that there can be multiple connections to a single DB.
+	 *
+	 * @param string $server DB server
+	 * @param string $db DB name
+	 */
+	public function transactionWritingOut( $server, $db ) {
+		$name = "{$server} ({$db})";
+		if ( --$this->mDBTrxHoldingLocks[$name]['refs'] <= 0 ) {
+			$slow = false;
+			foreach ( $this->mDBTrxMethodTimes[$name] as $info ) {
+				list( $method, $realtime ) = $info;
+				if ( $realtime >= $this->mDBLockThreshold ) {
+					$slow = true;
+					break;
+				}
+			}
+			if ( $slow ) {
+				$dbs = implode( ', ', array_keys( $this->mDBTrxHoldingLocks ) );
+				$msg = "Sub-optimal transaction on DB(s) {$dbs}:\n";
+				foreach ( $this->mDBTrxMethodTimes[$name] as $i => $info ) {
+					list( $method, $realtime ) = $info;
+					$msg .= sprintf( "%d\t%.6f\t%s\n", $i, $realtime, $method );
+				}
+				wfDebugLog( 'DBPerformance', $msg );
+			}
+			unset( $this->mDBTrxHoldingLocks[$name] );
+			unset( $this->mDBTrxMethodTimes[$name] );
+		}
+	}
+
 	/**
 	 * Mark this call as templated or not
 	 *
@@ -228,11 +349,11 @@ class Profiler {
 		global $wgDebugFunctionEntry, $wgProfileCallTree;
 		$wgDebugFunctionEntry = false;
 
-		if( !count( $this->mStack ) && !count( $this->mCollated ) ) {
+		if ( !count( $this->mStack ) && !count( $this->mCollated ) ) {
 			return "No profiling output\n";
 		}
 
-		if( $wgProfileCallTree ) {
+		if ( $wgProfileCallTree ) {
 			return $this->getCallTree();
 		} else {
 			return $this->getFunctionReport();
@@ -254,16 +375,16 @@ class Profiler {
 	 * @return array
 	 */
 	function remapCallTree( $stack ) {
-		if( count( $stack ) < 2 ) {
+		if ( count( $stack ) < 2 ) {
 			return $stack;
 		}
-		$outputs = array ();
-		for( $max = count( $stack ) - 1; $max > 0; ) {
+		$outputs = array();
+		for ( $max = count( $stack ) - 1; $max > 0; ) {
 			/* Find all items under this entry */
 			$level = $stack[$max][1];
-			$working = array ();
-			for( $i = $max -1; $i >= 0; $i-- ) {
-				if( $stack[$i][1] > $level ) {
+			$working = array();
+			for ( $i = $max -1; $i >= 0; $i-- ) {
+				if ( $stack[$i][1] > $level ) {
 					$working[] = $stack[$i];
 				} else {
 					break;
@@ -271,7 +392,7 @@ class Profiler {
 			}
 			$working = $this->remapCallTree( array_reverse( $working ) );
 			$output = array();
-			foreach( $working as $item ) {
+			foreach ( $working as $item ) {
 				array_push( $output, $item );
 			}
 			array_unshift( $output, $stack[$max] );
@@ -280,8 +401,8 @@ class Profiler {
 			array_unshift( $outputs, $output );
 		}
 		$final = array();
-		foreach( $outputs as $output ) {
-			foreach( $output as $item ) {
+		foreach ( $outputs as $output ) {
+			foreach ( $output as $item ) {
 				$final[] = $item;
 			}
 		}
@@ -391,18 +512,17 @@ class Profiler {
 
 		# First, subtract the overhead!
 		$overheadTotal = $overheadMemory = $overheadInternal = array();
-		foreach( $this->mStack as $entry ) {
+		foreach ( $this->mStack as $entry ) {
 			$fname = $entry[0];
 			$start = $entry[2];
 			$end = $entry[4];
 			$elapsed = $end - $start;
 			$memory = $entry[5] - $entry[3];
 
-			if( $fname == '-overhead-total' ) {
+			if ( $fname == '-overhead-total' ) {
 				$overheadTotal[] = $elapsed;
 				$overheadMemory[] = $memory;
-			}
-			elseif( $fname == '-overhead-internal' ) {
+			} elseif ( $fname == '-overhead-internal' ) {
 				$overheadInternal[] = $elapsed;
 			}
 		}
@@ -411,7 +531,7 @@ class Profiler {
 		$overheadInternal = $overheadInternal ? array_sum( $overheadInternal ) / count( $overheadInternal ) : 0;
 
 		# Collate
-		foreach( $this->mStack as $index => $entry ) {
+		foreach ( $this->mStack as $index => $entry ) {
 			$fname = $entry[0];
 			$start = $entry[2];
 			$end = $entry[4];
@@ -420,16 +540,16 @@ class Profiler {
 			$memory = $entry[5] - $entry[3];
 			$subcalls = $this->calltreeCount( $this->mStack, $index );
 
-			if( !preg_match( '/^-overhead/', $fname ) ) {
+			if ( !preg_match( '/^-overhead/', $fname ) ) {
 				# Adjust for profiling overhead (except special values with elapsed=0
-				if( $elapsed ) {
+				if ( $elapsed ) {
 					$elapsed -= $overheadInternal;
-					$elapsed -= ($subcalls * $overheadTotal);
-					$memory -= ($subcalls * $overheadMemory);
+					$elapsed -= ( $subcalls * $overheadTotal );
+					$memory -= ( $subcalls * $overheadMemory );
 				}
 			}
 
-			if( !array_key_exists( $fname, $this->mCollated ) ) {
+			if ( !array_key_exists( $fname, $this->mCollated ) ) {
 				$this->mCollated[$fname] = 0;
 				$this->mCalls[$fname] = 0;
 				$this->mMemory[$fname] = 0;
@@ -467,11 +587,21 @@ class Profiler {
 
 		$total = isset( $this->mCollated['-total'] ) ? $this->mCollated['-total'] : 0;
 
-		foreach( $this->mCollated as $fname => $elapsed ) {
+		foreach ( $this->mCollated as $fname => $elapsed ) {
 			$calls = $this->mCalls[$fname];
 			$percent = $total ? 100. * $elapsed / $total : 0;
 			$memory = $this->mMemory[$fname];
-			$prof .= sprintf( $format, substr( $fname, 0, $nameWidth ), $calls, (float) ($elapsed * 1000), (float) ($elapsed * 1000) / $calls, $percent, $memory, ( $this->mMin[$fname] * 1000.0 ), ( $this->mMax[$fname] * 1000.0 ), $this->mOverhead[$fname] );
+			$prof .= sprintf( $format,
+				substr( $fname, 0, $nameWidth ),
+				$calls,
+				(float)( $elapsed * 1000 ),
+				(float)( $elapsed * 1000 ) / $calls,
+				$percent,
+				$memory,
+				( $this->mMin[$fname] * 1000.0 ),
+				( $this->mMax[$fname] * 1000.0 ),
+				$this->mOverhead[$fname]
+			);
 		}
 		$prof .= "\nTotal: $total\n\n";
 
@@ -483,7 +613,7 @@ class Profiler {
 	 */
 	protected static function calculateOverhead( $profileCount ) {
 		wfProfileIn( '-overhead-total' );
-		for( $i = 0; $i < $profileCount; $i++ ) {
+		for ( $i = 0; $i < $profileCount; $i++ ) {
 			wfProfileIn( '-overhead-internal' );
 			wfProfileOut( '-overhead-internal' );
 		}
@@ -515,16 +645,16 @@ class Profiler {
 		global $wgProfilePerHost, $wgProfileToDatabase;
 
 		# Do not log anything if database is readonly (bug 5375)
-		if( wfReadOnly() || !$wgProfileToDatabase ) {
+		if ( wfReadOnly() || !$wgProfileToDatabase ) {
 			return;
 		}
 
 		$dbw = wfGetDB( DB_MASTER );
-		if( !is_object( $dbw ) ) {
+		if ( !is_object( $dbw ) ) {
 			return;
 		}
 
-		if( $wgProfilePerHost ) {
+		if ( $wgProfilePerHost ) {
 			$pfhost = wfHostname();
 		} else {
 			$pfhost = '';
@@ -533,15 +663,15 @@ class Profiler {
 		try {
 			$this->collateData();
 
-			foreach( $this->mCollated as $name => $elapsed ) {
+			foreach ( $this->mCollated as $name => $elapsed ) {
 				$eventCount = $this->mCalls[$name];
-				$timeSum = (float) ($elapsed * 1000);
+				$timeSum = (float)( $elapsed * 1000 );
 				$memorySum = (float)$this->mMemory[$name];
-				$name = substr($name, 0, 255);
+				$name = substr( $name, 0, 255 );
 
 				// Kludge
-				$timeSum = ($timeSum >= 0) ? $timeSum : 0;
-				$memorySum = ($memorySum >= 0) ? $memorySum : 0;
+				$timeSum = $timeSum >= 0 ? $timeSum : 0;
+				$memorySum = $memorySum >= 0 ? $memorySum : 0;
 
 				$dbw->update( 'profiling',
 					array(
@@ -557,9 +687,9 @@ class Profiler {
 
 				$rc = $dbw->affectedRows();
 				if ( $rc == 0 ) {
-					$dbw->insert( 'profiling', array ( 'pf_name' => $name, 'pf_count' => $eventCount,
+					$dbw->insert( 'profiling', array( 'pf_name' => $name, 'pf_count' => $eventCount,
 						'pf_time' => $timeSum, 'pf_memory' => $memorySum, 'pf_server' => $pfhost ),
-						__METHOD__, array ( 'IGNORE' ) );
+						__METHOD__, array( 'IGNORE' ) );
 				}
 				// When we upgrade to mysql 4.1, the insert+update
 				// can be merged into just a insert with this construct added:
@@ -585,7 +715,7 @@ class Profiler {
 	 * @param string $s to output
 	 */
 	function debug( $s ) {
-		if( defined( 'MW_COMPILED' ) || function_exists( 'wfDebug' ) ) {
+		if ( function_exists( 'wfDebug' ) ) {
 			wfDebug( $s );
 		}
 	}
diff --git a/includes/profiler/ProfilerSimple.php b/includes/profiler/ProfilerSimple.php
index 1d4873c6..805c60f4 100644
--- a/includes/profiler/ProfilerSimple.php
+++ b/includes/profiler/ProfilerSimple.php
@@ -96,11 +96,12 @@ class ProfilerSimple extends Profiler {
 				$this->mCollated[$functionname] =& $entry;
 			}
 			$entry['cpu'] += $elapsedcpu;
-			$entry['cpu_sq'] += $elapsedcpu*$elapsedcpu;
+			$entry['cpu_sq'] += $elapsedcpu * $elapsedcpu;
 			$entry['real'] += $elapsedreal;
-			$entry['real_sq'] += $elapsedreal*$elapsedreal;
+			$entry['real_sq'] += $elapsedreal * $elapsedreal;
 			$entry['count']++;
 
+			$this->updateTrxProfiling( $functionname, $elapsedreal );
 		}
 	}
 
diff --git a/includes/profiler/ProfilerSimpleText.php b/includes/profiler/ProfilerSimpleText.php
index 37350bf3..1d57ea8d 100644
--- a/includes/profiler/ProfilerSimpleText.php
+++ b/includes/profiler/ProfilerSimpleText.php
@@ -51,17 +51,17 @@ class ProfilerSimpleText extends ProfilerSimple {
 			uasort( $this->mCollated, array( 'self', 'sort' ) );
 			array_walk( $this->mCollated, array( 'self', 'format' ), $totalReal );
 			if ( PHP_SAPI === 'cli' ) {
-				print "<!--\n".self::$out."\n-->\n";
+				print "<!--\n" . self::$out . "\n-->\n";
 			} elseif ( $this->getContentType() === 'text/html' ) {
 				if ( $this->visible ) {
-					print '<pre>'.self::$out.'</pre>';
+					print '<pre>' . self::$out . '</pre>';
 				} else {
-					print "<!--\n".self::$out."\n-->\n";
+					print "<!--\n" . self::$out . "\n-->\n";
 				}
 			} elseif ( $this->getContentType() === 'text/javascript' ) {
-				print "\n/*\n".self::$out."*/\n";
+				print "\n/*\n" . self::$out . "*/\n";
 			} elseif ( $this->getContentType() === 'text/css' ) {
-				print "\n/*\n".self::$out."*/\n";
+				print "\n/*\n" . self::$out . "*/\n";
 			}
 		}
 	}
@@ -71,7 +71,7 @@ class ProfilerSimpleText extends ProfilerSimple {
 	}
 
 	static function format( $item, $key, $totalReal ) {
-		$perc = $totalReal ? $item['real']/$totalReal*100 : 0;
+		$perc = $totalReal ? $item['real'] / $totalReal * 100 : 0;
 		self::$out .= sprintf( "%6.2f%% %3.6f %6d - %s\n",
 			$perc, $item['real'], $item['count'], $key );
 	}
diff --git a/includes/profiler/ProfilerSimpleTrace.php b/includes/profiler/ProfilerSimpleTrace.php
index d44dfe1b..5588d1e2 100644
--- a/includes/profiler/ProfilerSimpleTrace.php
+++ b/includes/profiler/ProfilerSimpleTrace.php
@@ -59,6 +59,8 @@ class ProfilerSimpleTrace extends ProfilerSimple {
 			$elapsedreal = $this->getTime() - $ortime;
 			$this->trace .= sprintf( "%03.6f %6.1f", $elapsedreal, $this->memoryDiff() ) .
 					str_repeat( " ", count( $this->mWorkStack ) + 1 ) . " < " . $functionname . "\n";
+
+			$this->updateTrxProfiling( $functionname, $elapsedreal );
 		}
 	}
 
diff --git a/includes/profiler/ProfilerSimpleUDP.php b/includes/profiler/ProfilerSimpleUDP.php
index abefa811..0a1f3b10 100644
--- a/includes/profiler/ProfilerSimpleUDP.php
+++ b/includes/profiler/ProfilerSimpleUDP.php
@@ -32,7 +32,7 @@ class ProfilerSimpleUDP extends ProfilerSimple {
 	}
 
 	public function logData() {
-		global $wgUDPProfilerHost, $wgUDPProfilerPort;
+		global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgUDPProfilerFormatString;
 
 		$this->close();
 
@@ -41,24 +41,24 @@ class ProfilerSimpleUDP extends ProfilerSimple {
 			return;
 		}
 
-		if ( !MWInit::functionExists( 'socket_create' ) ) {
+		if ( !function_exists( 'socket_create' ) ) {
 			# Sockets are not enabled
 			return;
 		}
 
-		$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
+		$sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
 		$plength = 0;
 		$packet = "";
 		foreach ( $this->mCollated as $entry => $pfdata ) {
-			if( !isset( $pfdata['count'] )
+			if ( !isset( $pfdata['count'] )
 				|| !isset( $pfdata['cpu'] )
 				|| !isset( $pfdata['cpu_sq'] )
 				|| !isset( $pfdata['real'] )
 				|| !isset( $pfdata['real_sq'] ) ) {
 				continue;
 			}
-			$pfline = sprintf( "%s %s %d %f %f %f %f %s\n", $this->getProfileID(), "-", $pfdata['count'],
-				$pfdata['cpu'], $pfdata['cpu_sq'], $pfdata['real'], $pfdata['real_sq'], $entry);
+			$pfline = sprintf( $wgUDPProfilerFormatString, $this->getProfileID(), $pfdata['count'],
+				$pfdata['cpu'], $pfdata['cpu_sq'], $pfdata['real'], $pfdata['real_sq'], $entry );
 			$length = strlen( $pfline );
 			/* printf("<!-- $pfline -->"); */
 			if ( $length + $plength > 1400 ) {
diff --git a/includes/profiler/ProfilerStub.php b/includes/profiler/ProfilerStub.php
index c0eb0fb4..3697f352 100644
--- a/includes/profiler/ProfilerStub.php
+++ b/includes/profiler/ProfilerStub.php
@@ -39,4 +39,6 @@ class ProfilerStub extends Profiler {
 	public function close() {}
 	public function logData() {}
 	public function getCurrentSection() { return ''; }
+	public function transactionWritingIn( $server, $db ) {}
+	public function transactionWritingOut( $server, $db ) {}
 }
diff --git a/includes/rcfeed/IRCColourfulRCFeedFormatter.php b/includes/rcfeed/IRCColourfulRCFeedFormatter.php
new file mode 100644
index 00000000..507369f3
--- /dev/null
+++ b/includes/rcfeed/IRCColourfulRCFeedFormatter.php
@@ -0,0 +1,99 @@
+<?php
+class IRCColourfulRCFeedFormatter implements RCFeedFormatter {
+	/**
+	 * Generates a colourful notification intended for humans on IRC.
+	 * @see RCFeedFormatter::getLine
+	 */
+	public function getLine( array $feed, RecentChange $rc, $actionComment ) {
+		global $wgUseRCPatrol, $wgUseNPPatrol, $wgLocalInterwiki,
+			$wgCanonicalServer, $wgScript;
+		$attribs = $rc->getAttributes();
+		if ( $attribs['rc_type'] == RC_LOG ) {
+			// Don't use SpecialPage::getTitleFor, backwards compatibility with
+			// IRC API which expects "Log".
+			$titleObj = Title::newFromText( 'Log/' . $attribs['rc_log_type'], NS_SPECIAL );
+		} else {
+			$titleObj =& $rc->getTitle();
+		}
+		$title = $titleObj->getPrefixedText();
+		$title = self::cleanupForIRC( $title );
+
+		if ( $attribs['rc_type'] == RC_LOG ) {
+			$url = '';
+		} else {
+			$url = $wgCanonicalServer . $wgScript;
+			if ( $attribs['rc_type'] == RC_NEW ) {
+				$query = '?oldid=' . $attribs['rc_this_oldid'];
+			} else {
+				$query = '?diff=' . $attribs['rc_this_oldid'] . '&oldid=' . $attribs['rc_last_oldid'];
+			}
+			if ( $wgUseRCPatrol || ( $attribs['rc_type'] == RC_NEW && $wgUseNPPatrol ) ) {
+				$query .= '&rcid=' . $attribs['rc_id'];
+			}
+			// HACK: We need this hook for WMF's secure server setup
+			wfRunHooks( 'IRCLineURL', array( &$url, &$query ) );
+			$url .= $query;
+		}
+
+		if ( $attribs['rc_old_len'] !== null && $attribs['rc_new_len'] !== null ) {
+			$szdiff = $attribs['rc_new_len'] - $attribs['rc_old_len'];
+			if ( $szdiff < -500 ) {
+				$szdiff = "\002$szdiff\002";
+			} elseif ( $szdiff >= 0 ) {
+				$szdiff = '+' . $szdiff;
+			}
+			// @todo i18n with parentheses in content language?
+			$szdiff = '(' . $szdiff . ')';
+		} else {
+			$szdiff = '';
+		}
+
+		$user = self::cleanupForIRC( $attribs['rc_user_text'] );
+
+		if ( $attribs['rc_type'] == RC_LOG ) {
+			$targetText = $rc->getTitle()->getPrefixedText();
+			$comment = self::cleanupForIRC( str_replace( "[[$targetText]]", "[[\00302$targetText\00310]]", $actionComment ) );
+			$flag = $attribs['rc_log_action'];
+		} else {
+			$comment = self::cleanupForIRC( $attribs['rc_comment'] );
+			$flag = '';
+			if ( !$attribs['rc_patrolled'] && ( $wgUseRCPatrol || $attribs['rc_type'] == RC_NEW && $wgUseNPPatrol ) ) {
+				$flag .= '!';
+			}
+			$flag .= ( $attribs['rc_type'] == RC_NEW ? "N" : "" ) . ( $attribs['rc_minor'] ? "M" : "" ) . ( $attribs['rc_bot'] ? "B" : "" );
+		}
+
+		if ( $feed['add_interwiki_prefix'] === true && $wgLocalInterwiki !== false ) {
+			$prefix = $wgLocalInterwiki;
+		} elseif ( $feed['add_interwiki_prefix'] ) {
+			$prefix = $feed['add_interwiki_prefix'];
+		} else {
+			$prefix = false;
+		}
+		if ( $prefix !== false ) {
+			$titleString = "\00314[[\00303$prefix:\00307$title\00314]]";
+		} else {
+			$titleString = "\00314[[\00307$title\00314]]";
+		}
+
+		# see http://www.irssi.org/documentation/formats for some colour codes. prefix is \003,
+		# no colour (\003) switches back to the term default
+		$fullString = "$titleString\0034 $flag\00310 " .
+			"\00302$url\003 \0035*\003 \00303$user\003 \0035*\003 $szdiff \00310$comment\003\n";
+
+		return $fullString;
+	}
+
+	/**
+	 * Remove newlines, carriage returns and decode html entites
+	 * @param string $text
+	 * @return string
+	 */
+	public static function cleanupForIRC( $text ) {
+		return Sanitizer::decodeCharReferences( str_replace(
+			array( "\n", "\r" ),
+			array( " ", "" ),
+			$text
+		) );
+	}
+}
diff --git a/includes/rcfeed/JSONRCFeedFormatter.php b/includes/rcfeed/JSONRCFeedFormatter.php
new file mode 100644
index 00000000..f4cb9921
--- /dev/null
+++ b/includes/rcfeed/JSONRCFeedFormatter.php
@@ -0,0 +1,90 @@
+<?php
+
+class JSONRCFeedFormatter implements RCFeedFormatter {
+	/**
+	 * Generates a notification that can be easily interpreted by a machine.
+	 * @see RCFeedFormatter::getLine
+	 */
+	public function getLine( array $feed, RecentChange $rc, $actionComment ) {
+		global $wgCanonicalServer, $wgScriptPath, $wgDBname;
+		$attrib = $rc->getAttributes();
+
+		$packet = array(
+			// Usually, RC ID is exposed only for patrolling purposes,
+			// but there is no real reason not to expose it in other cases,
+			// and I can see how this may be potentially useful for clients.
+			'id' => $attrib['rc_id'],
+			'type' => $attrib['rc_type'],
+			'namespace' => $rc->getTitle()->getNamespace(),
+			'title' => $rc->getTitle()->getPrefixedText(),
+			'comment' => $attrib['rc_comment'],
+			'timestamp' => (int)wfTimestamp( TS_UNIX, $attrib['rc_timestamp'] ),
+			'user' => $attrib['rc_user_text'],
+			'bot' => (bool)$attrib['rc_bot'],
+		);
+
+		if ( isset( $feed['channel'] ) ) {
+			$packet['channel'] = $feed['channel'];
+		}
+
+		$type = $attrib['rc_type'];
+		if ( $type == RC_EDIT || $type == RC_NEW ) {
+			global $wgUseRCPatrol, $wgUseNPPatrol;
+
+			$packet['minor'] = $attrib['rc_minor'];
+			if ( $wgUseRCPatrol || ( $type == RC_NEW && $wgUseNPPatrol ) ) {
+				$packet['patrolled'] = $attrib['rc_patrolled'];
+			}
+		}
+
+		switch ( $type ) {
+			case RC_EDIT:
+				$packet['length'] = array( 'old' => $attrib['rc_old_len'], 'new' => $attrib['rc_new_len'] );
+				$packet['revision'] = array( 'old' => $attrib['rc_last_oldid'], 'new' => $attrib['rc_this_oldid'] );
+				break;
+
+			case RC_NEW:
+				$packet['length'] = array( 'old' => NULL, 'new' => $attrib['rc_new_len'] );
+				$packet['revision'] = array( 'old' => NULL, 'new' => $attrib['rc_this_oldid'] );
+				break;
+
+			case RC_LOG:
+				$packet['log_type'] = $attrib['rc_log_type'];
+				$packet['log_action'] = $attrib['rc_log_action'];
+				if ( $attrib['rc_params'] ) {
+					wfSuppressWarnings();
+					$params = unserialize( $attrib['rc_params'] );
+					wfRestoreWarnings();
+					if (
+						// If it's an actual serialised false...
+						$attrib['rc_params'] == serialize( false ) ||
+						// Or if we did not get false back when trying to unserialise
+						$params !== false
+					) {
+						// From ApiQueryLogEvents::addLogParams
+						$logParams = array();
+						// Keys like "4::paramname" can't be used for output so we change them to "paramname"
+						foreach ( $params as $key => $value ) {
+							if ( strpos( $key, ':' ) === false ) {
+								$logParams[$key] = $value;
+								continue;
+							}
+							$logParam = explode( ':', $key, 3 );
+							$logParams[$logParam[2]] = $value;
+						}
+						$packet['log_params'] = $logParams;
+					} else {
+						$packet['log_params'] = explode( "\n", $attrib['rc_params'] );
+					}
+				}
+				$packet['log_action_comment'] = $actionComment;
+				break;
+		}
+
+		$packet['server_url'] = $wgCanonicalServer;
+		$packet['server_script_path'] = $wgScriptPath ?: '/';
+		$packet['wiki'] = $wgDBname;
+
+		return FormatJson::encode( $packet );
+	}
+}
diff --git a/includes/rcfeed/RCFeedEngine.php b/includes/rcfeed/RCFeedEngine.php
new file mode 100644
index 00000000..f733bcb7
--- /dev/null
+++ b/includes/rcfeed/RCFeedEngine.php
@@ -0,0 +1,12 @@
+<?php
+interface RCFeedEngine {
+	/**
+	 * Sends some text to the specified live feed.
+	 *
+	 * @see RecentChange::cleanupForIRC
+	 * @param array $feed The feed, as configured in an associative array.
+	 * @param string $line The text to send.
+	 * @return boolean success
+	 */
+	public function send( array $feed, $line );
+}
diff --git a/includes/rcfeed/RCFeedFormatter.php b/includes/rcfeed/RCFeedFormatter.php
new file mode 100644
index 00000000..6c9f8042
--- /dev/null
+++ b/includes/rcfeed/RCFeedFormatter.php
@@ -0,0 +1,13 @@
+<?php
+interface RCFeedFormatter {
+	/**
+	 * Formats the line for the live feed.
+	 *
+	 * @param array $feed The feed, as configured in an associative array.
+	 * @param RecentChange $rc The RecentChange object showing what sort
+	 *                         of event has taken place.
+	 * @param string|null $actionComment
+	 * @return string The text to send.
+	 */
+	public function getLine( array $feed, RecentChange $rc, $actionComment );
+}
diff --git a/includes/rcfeed/RedisPubSubFeedEngine.php b/includes/rcfeed/RedisPubSubFeedEngine.php
new file mode 100644
index 00000000..4bcc1337
--- /dev/null
+++ b/includes/rcfeed/RedisPubSubFeedEngine.php
@@ -0,0 +1,41 @@
+<?php
+class RedisPubSubFeedEngine implements RCFeedEngine {
+	/**
+	 * Emit a recent change notification via Redis Pub/Sub
+	 *
+	 * If the feed URI contains a path component, it will be used to generate a
+	 * channel name by stripping the leading slash and replacing any remaining
+	 * slashes with '.'. If no path component is present, the channel is set to
+	 * 'rc'. If the URI contains a query string, its parameters will be parsed
+	 * as RedisConnectionPool options.
+	 *
+	 * @example $wgRCFeeds['redis'] = array(
+	 *      'formatter' => 'JSONRCFeedFormatter',
+	 *      'uri'       => "redis://127.0.0.1:6379/rc.$wgDBname",
+	 * );
+	 *
+	 * @since 1.22
+	 */
+	public function send( array $feed, $line ) {
+		$parsed = parse_url( $feed['uri'] );
+		$server = $parsed['host'];
+		$options = array( 'serializer' => 'none' );
+		$channel = 'rc';
+
+		if ( isset( $parsed['port'] ) ) {
+			$server .= ":{$parsed['port']}";
+		}
+		if ( isset( $parsed['query'] ) ) {
+			parse_str( $parsed['query'], $options );
+		}
+		if ( isset( $parsed['pass'] ) ) {
+			$options['password'] = $parsed['pass'];
+		}
+		if ( isset( $parsed['path'] ) ) {
+			$channel = str_replace( '/', '.', ltrim( $parsed['path'], '/' ) );
+		}
+		$pool = RedisConnectionPool::singleton( $options );
+		$conn = $pool->getConnection( $server );
+		$conn->publish( $channel, $line );
+	}
+}
diff --git a/includes/rcfeed/UDPRCFeedEngine.php b/includes/rcfeed/UDPRCFeedEngine.php
new file mode 100644
index 00000000..beeb73bd
--- /dev/null
+++ b/includes/rcfeed/UDPRCFeedEngine.php
@@ -0,0 +1,10 @@
+<?php
+class UDPRCFeedEngine implements RCFeedEngine {
+	/**
+	 * Sends the notification to the specified host in a UDP packet.
+	 * @see RCFeedEngine::send
+	 */
+	public function send( array $feed, $line ) {
+		wfErrorLog( $line, $feed['uri'] );
+	}
+}
diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php
index 4e047be4..6380efcf 100644
--- a/includes/resourceloader/ResourceLoader.php
+++ b/includes/resourceloader/ResourceLoader.php
@@ -47,6 +47,9 @@ class ResourceLoader {
 	/** array( 'source-id' => array( 'loadScript' => 'http://.../load.php' ) ) **/
 	protected $sources = array();
 
+	/** @var bool */
+	protected $hasErrors = false;
+
 	/* Protected Methods */
 
 	/**
@@ -150,6 +153,7 @@ class ResourceLoader {
 		$cache = wfGetCache( CACHE_ANYTHING );
 		$cacheEntry = $cache->get( $key );
 		if ( is_string( $cacheEntry ) ) {
+			wfIncrStats( "rl-$filter-cache-hits" );
 			wfProfileOut( __METHOD__ );
 			return $cacheEntry;
 		}
@@ -157,6 +161,7 @@ class ResourceLoader {
 		$result = '';
 		// Run the filter - we've already verified one of these will work
 		try {
+			wfIncrStats( "rl-$filter-cache-misses" );
 			switch ( $filter ) {
 				case 'minify-js':
 					$result = JavaScriptMinifier::minify( $data,
@@ -173,10 +178,12 @@ class ResourceLoader {
 
 			// Save filtered text to Memcached
 			$cache->set( $key, $result );
-		} catch ( Exception $exception ) {
-			// Return exception as a comment
-			$result = $this->formatException( $exception );
+		} catch ( Exception $e ) {
+			MWExceptionHandler::logException( $e );
+			wfDebugLog( 'resourceloader', __METHOD__ . ": minification failed: $e" );
 			$this->hasErrors = true;
+			// Return exception as a comment
+			$result = self::formatException( $e );
 		}
 
 		wfProfileOut( __METHOD__ );
@@ -201,7 +208,7 @@ class ResourceLoader {
 		$this->addSource( $wgResourceLoaderSources );
 
 		// Register core modules
-		$this->register( include( "$IP/resources/Resources.php" ) );
+		$this->register( include "$IP/resources/Resources.php" );
 		// Register extension modules
 		wfRunHooks( 'ResourceLoaderRegisterModules', array( &$this ) );
 		$this->register( $wgResourceModules );
@@ -234,6 +241,7 @@ class ResourceLoader {
 		foreach ( $registrations as $name => $info ) {
 			// Disallow duplicate registrations
 			if ( isset( $this->moduleInfos[$name] ) ) {
+				wfProfileOut( __METHOD__ );
 				// A module has already been registered by this name
 				throw new MWException(
 					'ResourceLoader duplicate registration error. ' .
@@ -243,6 +251,7 @@ class ResourceLoader {
 
 			// Check $name for validity
 			if ( !self::isValidModuleName( $name ) ) {
+				wfProfileOut( __METHOD__ );
 				throw new MWException( "ResourceLoader module name '$name' is invalid, see ResourceLoader::isValidModuleName()" );
 			}
 
@@ -251,6 +260,7 @@ class ResourceLoader {
 				// Old calling convention
 				// Validate the input
 				if ( !( $info instanceof ResourceLoaderModule ) ) {
+					wfProfileOut( __METHOD__ );
 					throw new MWException( 'ResourceLoader invalid module error. ' .
 						'Instances of ResourceLoaderModule expected.' );
 				}
@@ -273,24 +283,28 @@ class ResourceLoader {
 		global $IP, $wgEnableJavaScriptTest;
 
 		if ( $wgEnableJavaScriptTest !== true ) {
-			throw new MWException( 'Attempt to register JavaScript test modules but <tt>$wgEnableJavaScriptTest</tt> is false. Edit your <tt>LocalSettings.php</tt> to enable it.' );
+			throw new MWException( 'Attempt to register JavaScript test modules but <code>$wgEnableJavaScriptTest</code> is false. Edit your <code>LocalSettings.php</code> to enable it.' );
 		}
 
 		wfProfileIn( __METHOD__ );
 
 		// Get core test suites
 		$testModules = array();
-		$testModules['qunit'] = include( "$IP/tests/qunit/QUnitTestResources.php" );
+		$testModules['qunit'] = include "$IP/tests/qunit/QUnitTestResources.php";
 		// Get other test suites (e.g. from extensions)
 		wfRunHooks( 'ResourceLoaderTestModules', array( &$testModules, &$this ) );
 
 		// Add the testrunner (which configures QUnit) to the dependencies.
 		// Since it must be ready before any of the test suites are executed.
-		foreach( $testModules['qunit'] as $moduleName => $moduleProps ) {
-			$testModules['qunit'][$moduleName]['dependencies'][] = 'mediawiki.tests.qunit.testrunner';
+		foreach ( $testModules['qunit'] as &$module ) {
+			// Make sure all test modules are top-loading so that when QUnit starts
+			// on document-ready, it will run once and finish. If some tests arrive
+			// later (possibly after QUnit has already finished) they will be ignored.
+			$module['position'] = 'top';
+			$module['dependencies'][] = 'mediawiki.tests.qunit.testrunner';
 		}
 
-		foreach( $testModules as $id => $names ) {
+		foreach ( $testModules as $id => $names ) {
 			// Register test modules
 			$this->register( $testModules[$id] );
 
@@ -311,7 +325,7 @@ class ResourceLoader {
 	 * @param array $properties source properties
 	 * @throws MWException
 	 */
-	public function addSource( $id, $properties = null) {
+	public function addSource( $id, $properties = null ) {
 		// Allow multiple sources to be registered in one call
 		if ( is_array( $id ) ) {
 			foreach ( $id as $key => $value ) {
@@ -357,7 +371,7 @@ class ResourceLoader {
 	 * @return Array
 	 */
 	public function getTestModuleNames( $framework = 'all' ) {
-		/// @TODO: api siteinfo prop testmodulenames modulenames
+		/// @todo api siteinfo prop testmodulenames modulenames
 		if ( $framework == 'all' ) {
 			return $this->testModuleNames;
 		} elseif ( isset( $this->testModuleNames[$framework] ) && is_array( $this->testModuleNames[$framework] ) ) {
@@ -381,6 +395,7 @@ class ResourceLoader {
 			}
 			// Construct the requested object
 			$info = $this->moduleInfos[$name];
+			/** @var ResourceLoaderModule $object */
 			if ( isset( $info['object'] ) ) {
 				// Object given in info array
 				$object = $info['object'];
@@ -435,7 +450,6 @@ class ResourceLoader {
 
 		wfProfileIn( __METHOD__ );
 		$errors = '';
-		$this->hasErrors = false;
 
 		// Split requested modules into two groups, modules and missing
 		$modules = array();
@@ -446,8 +460,11 @@ class ResourceLoader {
 				// Do not allow private modules to be loaded from the web.
 				// This is a security issue, see bug 34907.
 				if ( $module->getGroup() === 'private' ) {
-					$errors .= $this->makeComment( "Cannot show private module \"$name\"" );
+					wfDebugLog( 'resourceloader', __METHOD__ . ": request for private module '$name' denied" );
 					$this->hasErrors = true;
+					// Add exception to the output as a comment
+					$errors .= self::makeComment( "Cannot show private module \"$name\"" );
+
 					continue;
 				}
 				$modules[$name] = $module;
@@ -459,13 +476,15 @@ class ResourceLoader {
 		// Preload information needed to the mtime calculation below
 		try {
 			$this->preloadModuleInfo( array_keys( $modules ), $context );
-		} catch( Exception $e ) {
-			// Add exception to the output as a comment
-			$errors .= $this->formatException( $e );
+		} catch ( Exception $e ) {
+			MWExceptionHandler::logException( $e );
+			wfDebugLog( 'resourceloader', __METHOD__ . ": preloading module info failed: $e" );
 			$this->hasErrors = true;
+			// Add exception to the output as a comment
+			$errors .= self::formatException( $e );
 		}
 
-		wfProfileIn( __METHOD__.'-getModifiedTime' );
+		wfProfileIn( __METHOD__ . '-getModifiedTime' );
 
 		// To send Last-Modified and support If-Modified-Since, we need to detect
 		// the last modified time
@@ -478,13 +497,15 @@ class ResourceLoader {
 				// Calculate maximum modified time
 				$mtime = max( $mtime, $module->getModifiedTime( $context ) );
 			} catch ( Exception $e ) {
-				// Add exception to the output as a comment
-				$errors .= $this->formatException( $e );
+				MWExceptionHandler::logException( $e );
+				wfDebugLog( 'resourceloader', __METHOD__ . ": calculating maximum modified time failed: $e" );
 				$this->hasErrors = true;
+				// Add exception to the output as a comment
+				$errors .= self::formatException( $e );
 			}
 		}
 
-		wfProfileOut( __METHOD__.'-getModifiedTime' );
+		wfProfileOut( __METHOD__ . '-getModifiedTime' );
 
 		// If there's an If-Modified-Since header, respond with a 304 appropriately
 		if ( $this->tryRespondLastModified( $context, $mtime ) ) {
@@ -501,7 +522,7 @@ class ResourceLoader {
 		// Capture any PHP warnings from the output buffer and append them to the
 		// response in a comment if we're in debug mode.
 		if ( $context->getDebug() && strlen( $warnings = ob_get_contents() ) ) {
-			$response = $this->makeComment( $warnings ) . $response;
+			$response = self::makeComment( $warnings ) . $response;
 			$this->hasErrors = true;
 		}
 
@@ -531,7 +552,7 @@ class ResourceLoader {
 	 * Send content type and last modified headers to the client.
 	 * @param $context ResourceLoaderContext
 	 * @param string $mtime TS_MW timestamp to use for last-modified
-	 * @param bool $error Whether there are commented-out errors in the response
+	 * @param bool $errors Whether there are commented-out errors in the response
 	 * @return void
 	 */
 	protected function sendResponseHeaders( ResourceLoaderContext $context, $mtime, $errors ) {
@@ -550,6 +571,7 @@ class ResourceLoader {
 		}
 		if ( $context->getOnly() === 'styles' ) {
 			header( 'Content-Type: text/css; charset=utf-8' );
+			header( 'Access-Control-Allow-Origin: *' );
 		} else {
 			header( 'Content-Type: text/javascript; charset=utf-8' );
 		}
@@ -570,7 +592,7 @@ class ResourceLoader {
 	 * and clear out the output buffer. If the client cache is too old then do nothing.
 	 * @param $context ResourceLoaderContext
 	 * @param string $mtime The TS_MW timestamp to check the header against
-	 * @return bool True iff 304 header sent and output handled
+	 * @return bool True if 304 header sent and output handled
 	 */
 	protected function tryRespondLastModified( ResourceLoaderContext $context, $mtime ) {
 		// If there's an If-Modified-Since header, respond with a 304 appropriately
@@ -590,13 +612,7 @@ class ResourceLoader {
 				// See also http://bugs.php.net/bug.php?id=51579
 				// To work around this, we tear down all output buffering before
 				// sending the 304.
-				// On some setups, ob_get_level() doesn't seem to go down to zero
-				// no matter how often we call ob_get_clean(), so instead of doing
-				// the more intuitive while ( ob_get_level() > 0 ) ob_get_clean();
-				// we have to be safe here and avoid an infinite loop.
-				for ( $i = 0; $i < ob_get_level(); $i++ ) {
-					ob_end_clean();
-				}
+				wfResetOutputBuffers( /* $resetGzipEncoding = */ true );
 
 				header( 'HTTP/1.0 304 Not Modified' );
 				header( 'Status: 304 Not Modified' );
@@ -628,7 +644,7 @@ class ResourceLoader {
 		if ( !$good ) {
 			try { // RL always hits the DB on file cache miss...
 				wfGetDB( DB_SLAVE );
-			} catch( DBConnectionError $e ) { // ...check if we need to fallback to cache
+			} catch ( DBConnectionError $e ) { // ...check if we need to fallback to cache
 				$good = $fileCache->isCacheGood(); // cache existence check
 			}
 		}
@@ -657,7 +673,14 @@ class ResourceLoader {
 		return false; // cache miss
 	}
 
-	protected function makeComment( $text ) {
+	/**
+	 * Generate a CSS or JS comment block. Only use this for public data,
+	 * not error message details.
+	 *
+	 * @param $text string
+	 * @return string
+	 */
+	public static function makeComment( $text ) {
 		$encText = str_replace( '*/', '* /', $text );
 		return "/*\n$encText\n*/\n";
 	}
@@ -668,13 +691,13 @@ class ResourceLoader {
 	 * @param Exception $e to be shown to the user
 	 * @return string sanitized text that can be returned to the user
 	 */
-	protected function formatException( $e ) {
+	public static function formatException( $e ) {
 		global $wgShowExceptionDetails;
 
 		if ( $wgShowExceptionDetails ) {
-			return $this->makeComment( $e->__toString() );
+			return self::makeComment( $e->__toString() );
 		} else {
-			return $this->makeComment( wfMessage( 'internalerror' )->text() );
+			return self::makeComment( wfMessage( 'internalerror' )->text() );
 		}
 	}
 
@@ -687,8 +710,8 @@ class ResourceLoader {
 	 * @return String: Response data
 	 */
 	public function makeModuleResponse( ResourceLoaderContext $context,
-		array $modules, $missing = array() )
-	{
+		array $modules, $missing = array()
+	) {
 		$out = '';
 		$exceptions = '';
 		if ( $modules === array() && $missing === array() ) {
@@ -701,9 +724,11 @@ class ResourceLoader {
 			try {
 				$blobs = MessageBlobStore::get( $this, $modules, $context->getLanguage() );
 			} catch ( Exception $e ) {
-				// Add exception to the output as a comment
-				$exceptions .= $this->formatException( $e );
+				MWExceptionHandler::logException( $e );
+				wfDebugLog( 'resourceloader', __METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e" );
 				$this->hasErrors = true;
+				// Add exception to the output as a comment
+				$exceptions .= self::formatException( $e );
 			}
 		} else {
 			$blobs = array();
@@ -807,9 +832,11 @@ class ResourceLoader {
 						break;
 				}
 			} catch ( Exception $e ) {
-				// Add exception to the output as a comment
-				$exceptions .= $this->formatException( $e );
+				MWExceptionHandler::logException( $e );
+				wfDebugLog( 'resourceloader', __METHOD__ . ": generating module package failed: $e" );
 				$this->hasErrors = true;
+				// Add exception to the output as a comment
+				$exceptions .= self::formatException( $e );
 
 				// Register module as missing
 				$missing[] = $name;
@@ -879,7 +906,9 @@ class ResourceLoader {
 				// output javascript "[]" instead of "{}". This fixes that.
 				(object)$styles,
 				(object)$messages
-			) );
+			),
+			ResourceLoader::inDebugMode()
+		);
 	}
 
 	/**
@@ -908,7 +937,7 @@ class ResourceLoader {
 			// ResourceLoaderFileModule::getStyle can return the styles
 			// as a string or an array of strings. This is to allow separation in
 			// the front-end.
-			$styles = (array) $styles;
+			$styles = (array)$styles;
 			foreach ( $styles as $style ) {
 				$style = trim( $style );
 				// Don't output an empty "@media print { }" block (bug 40498)
@@ -919,7 +948,7 @@ class ResourceLoader {
 
 					if ( $media === '' || $media == 'all' ) {
 						$out[] = $style;
-					} else if ( is_string( $media ) ) {
+					} elseif ( is_string( $media ) ) {
 						$out[] = "@media $media {\n" . str_replace( "\n", "\n\t", "\t" . $style ) . "}";
 					}
 					// else: skip
@@ -1000,12 +1029,12 @@ class ResourceLoader {
 	 * @return string
 	 */
 	public static function makeLoaderRegisterScript( $name, $version = null,
-		$dependencies = null, $group = null, $source = null )
-	{
+		$dependencies = null, $group = null, $source = null
+	) {
 		if ( is_array( $name ) ) {
 			return Xml::encodeJsCall( 'mw.loader.register', array( $name ) );
 		} else {
-			$version = (int) $version > 1 ? (int) $version : 1;
+			$version = (int)$version > 1 ? (int)$version : 1;
 			return Xml::encodeJsCall( 'mw.loader.register',
 				array( $name, $version, $dependencies, $group, $source ) );
 		}
@@ -1055,7 +1084,7 @@ class ResourceLoader {
 	 * @return string
 	 */
 	public static function makeConfigSetScript( array $configuration ) {
-		return Xml::encodeJsCall( 'mw.config.set', array( $configuration ) );
+		return Xml::encodeJsCall( 'mw.config.set', array( $configuration ), ResourceLoader::inDebugMode() );
 	}
 
 	/**
@@ -1128,6 +1157,18 @@ class ResourceLoader {
 	/**
 	 * Build a query array (array representation of query string) for load.php. Helper
 	 * function for makeLoaderURL().
+	 *
+	 * @param array $modules
+	 * @param string $lang
+	 * @param string $skin
+	 * @param string $user
+	 * @param string $version
+	 * @param bool $debug
+	 * @param string $only
+	 * @param bool $printable
+	 * @param bool $handheld
+	 * @param array $extraQuery
+	 *
 	 * @return array
 	 */
 	public static function makeLoaderQuery( $modules, $lang, $skin, $user = null, $version = null, $debug = false, $only = null,
@@ -1172,4 +1213,48 @@ class ResourceLoader {
 	public static function isValidModuleName( $moduleName ) {
 		return !preg_match( '/[|,!]/', $moduleName ) && strlen( $moduleName ) <= 255;
 	}
+
+	/**
+	 * Returns LESS compiler set up for use with MediaWiki
+	 *
+	 * @since 1.22
+	 * @return lessc
+	 */
+	public static function getLessCompiler() {
+		global $wgResourceLoaderLESSFunctions, $wgResourceLoaderLESSImportPaths;
+
+		// When called from the installer, it is possible that a required PHP extension
+		// is missing (at least for now; see bug 47564). If this is the case, throw an
+		// exception (caught by the installer) to prevent a fatal error later on.
+		if ( !function_exists( 'ctype_digit' ) ) {
+			throw new MWException( 'lessc requires the Ctype extension' );
+		}
+
+		$less = new lessc();
+		$less->setPreserveComments( true );
+		$less->setVariables( self::getLESSVars() );
+		$less->setImportDir( $wgResourceLoaderLESSImportPaths );
+		foreach ( $wgResourceLoaderLESSFunctions as $name => $func ) {
+			$less->registerFunction( $name, $func );
+		}
+		return $less;
+	}
+
+	/**
+	 * Get global LESS variables.
+	 *
+	 * $since 1.22
+	 * @return array: Map of variable names to string CSS values.
+	 */
+	public static function getLESSVars() {
+		global $wgResourceLoaderLESSVars;
+
+		static $lessVars = null;
+		if ( $lessVars === null ) {
+			$lessVars = $wgResourceLoaderLESSVars;
+			// Sort by key to ensure consistent hashing for cache lookups.
+			ksort( $lessVars );
+		}
+		return $lessVars;
+	}
 }
diff --git a/includes/resourceloader/ResourceLoaderContext.php b/includes/resourceloader/ResourceLoaderContext.php
index 4588015f..22ff6a7e 100644
--- a/includes/resourceloader/ResourceLoaderContext.php
+++ b/includes/resourceloader/ResourceLoaderContext.php
@@ -96,7 +96,7 @@ class ResourceLoaderContext {
 				$pos = strrpos( $group, '.' );
 				if ( $pos === false ) {
 					// Prefixless modules, i.e. without dots
-					$retval = explode( ',', $group );
+					$retval = array_merge( $retval, explode( ',', $group ) );
 				} else {
 					// We have a prefix and a bunch of suffixes
 					$prefix = substr( $group, 0, $pos ); // 'foo'
diff --git a/includes/resourceloader/ResourceLoaderFileModule.php b/includes/resourceloader/ResourceLoaderFileModule.php
index cedb5dcc..9ed181ed 100644
--- a/includes/resourceloader/ResourceLoaderFileModule.php
+++ b/includes/resourceloader/ResourceLoaderFileModule.php
@@ -115,6 +115,12 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	protected $raw = false;
 	protected $targets = array( 'desktop' );
 
+	/**
+	 * Boolean: Whether getStyleURLsForDebug should return raw file paths,
+	 * or return load.php urls
+	 */
+	protected $hasGeneratedStyles = false;
+
 	/**
 	 * Array: Cache for mtime
 	 * @par Usage:
@@ -187,8 +193,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	 * @endcode
 	 */
 	public function __construct( $options = array(), $localBasePath = null,
-		$remoteBasePath = null )
-	{
+		$remoteBasePath = null
+	) {
 		global $IP, $wgScriptPath, $wgResourceBasePath;
 		$this->localBasePath = $localBasePath === null ? $IP : $localBasePath;
 		if ( $remoteBasePath !== null ) {
@@ -209,7 +215,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 				case 'debugScripts':
 				case 'loaderScripts':
 				case 'styles':
-					$this->{$member} = (array) $option;
+					$this->{$member} = (array)$option;
 					break;
 				// Collated lists of file paths
 				case 'languageScripts':
@@ -228,26 +234,26 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 								"'$key' given, string expected."
 							);
 						}
-						$this->{$member}[$key] = (array) $value;
+						$this->{$member}[$key] = (array)$value;
 					}
 					break;
 				// Lists of strings
 				case 'dependencies':
 				case 'messages':
 				case 'targets':
-					$this->{$member} = (array) $option;
+					$this->{$member} = (array)$option;
 					break;
 				// Single strings
 				case 'group':
 				case 'position':
 				case 'localBasePath':
 				case 'remoteBasePath':
-					$this->{$member} = (string) $option;
+					$this->{$member} = (string)$option;
 					break;
 				// Single booleans
 				case 'debugRaw':
 				case 'raw':
-					$this->{$member} = (bool) $option;
+					$this->{$member} = (bool)$option;
 					break;
 			}
 		}
@@ -259,8 +265,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	/**
 	 * Gets all scripts for a given context concatenated together.
 	 *
-	 * @param $context ResourceLoaderContext: Context in which to generate script
-	 * @return String: JavaScript code for $context
+	 * @param ResourceLoaderContext $context Context in which to generate script
+	 * @return string: JavaScript code for $context
 	 */
 	public function getScript( ResourceLoaderContext $context ) {
 		$files = $this->getScriptFiles( $context );
@@ -268,7 +274,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	}
 
 	/**
-	 * @param $context ResourceLoaderContext
+	 * @param ResourceLoaderContext $context
 	 * @return array
 	 */
 	public function getScriptURLsForDebug( ResourceLoaderContext $context ) {
@@ -289,7 +295,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	/**
 	 * Gets loader script.
 	 *
-	 * @return String: JavaScript code to be added to startup module
+	 * @return string: JavaScript code to be added to startup module
 	 */
 	public function getLoaderScript() {
 		if ( count( $this->loaderScripts ) == 0 ) {
@@ -301,8 +307,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	/**
 	 * Gets all styles for a given context concatenated together.
 	 *
-	 * @param $context ResourceLoaderContext: Context in which to generate styles
-	 * @return String: CSS code for $context
+	 * @param ResourceLoaderContext $context Context in which to generate styles
+	 * @return string: CSS code for $context
 	 */
 	public function getStyles( ResourceLoaderContext $context ) {
 		$styles = $this->readStyleFiles(
@@ -324,16 +330,23 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 				);
 			}
 		} catch ( Exception $e ) {
-			wfDebug( __METHOD__ . " failed to update DB: $e\n" );
+			wfDebugLog( 'resourceloader', __METHOD__ . ": failed to update DB: $e" );
 		}
 		return $styles;
 	}
 
 	/**
-	 * @param $context ResourceLoaderContext
+	 * @param ResourceLoaderContext $context
 	 * @return array
 	 */
 	public function getStyleURLsForDebug( ResourceLoaderContext $context ) {
+		if ( $this->hasGeneratedStyles ) {
+			// Do the default behaviour of returning a url back to load.php
+			// but with only=styles.
+			return parent::getStyleURLsForDebug( $context );
+		}
+		// Our module consists entirely of real css files,
+		// in debug mode we can load those directly.
 		$urls = array();
 		foreach ( $this->getStyleFiles( $context ) as $mediaType => $list ) {
 			$urls[$mediaType] = array();
@@ -347,7 +360,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	/**
 	 * Gets list of message keys used by this module.
 	 *
-	 * @return Array: List of message keys
+	 * @return array: List of message keys
 	 */
 	public function getMessages() {
 		return $this->messages;
@@ -356,7 +369,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	/**
 	 * Gets the name of the group this module should be loaded in.
 	 *
-	 * @return String: Group name
+	 * @return string: Group name
 	 */
 	public function getGroup() {
 		return $this->group;
@@ -372,7 +385,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	/**
 	 * Gets list of names of modules this module depends on.
 	 *
-	 * @return Array: List of module names
+	 * @return array: List of module names
 	 */
 	public function getDependencies() {
 		return $this->dependencies;
@@ -394,9 +407,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	 * calculations on files relevant to the given language, skin and debug
 	 * mode.
 	 *
-	 * @param $context ResourceLoaderContext: Context in which to calculate
+	 * @param ResourceLoaderContext $context Context in which to calculate
 	 *     the modified time
-	 * @return Integer: UNIX timestamp
+	 * @return int: UNIX timestamp
 	 * @see ResourceLoaderModule::getFileDependencies
 	 */
 	public function getModifiedTime( ResourceLoaderContext $context ) {
@@ -455,7 +468,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	/* Protected Methods */
 
 	/**
-	 * @param $path string
+	 * @param string $path
 	 * @return string
 	 */
 	protected function getLocalPath( $path ) {
@@ -463,25 +476,36 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	}
 
 	/**
-	 * @param $path string
+	 * @param string $path
 	 * @return string
 	 */
 	protected function getRemotePath( $path ) {
 		return "{$this->remoteBasePath}/$path";
 	}
 
+	/**
+	 * Infer the stylesheet language from a stylesheet file path.
+	 *
+	 * @since 1.22
+	 * @param string $path
+	 * @return string: the stylesheet language name
+	 */
+	public function getStyleSheetLang( $path ) {
+		return preg_match( '/\.less$/i', $path ) ? 'less' : 'css';
+	}
+
 	/**
 	 * Collates file paths by option (where provided).
 	 *
 	 * @param array $list List of file paths in any combination of index/path
 	 *     or path/options pairs
 	 * @param string $option option name
-	 * @param $default Mixed: default value if the option isn't set
-	 * @return Array: List of file paths, collated by $option
+	 * @param mixed $default default value if the option isn't set
+	 * @return array: List of file paths, collated by $option
 	 */
 	protected static function collateFilePathListByOption( array $list, $option, $default ) {
 		$collatedFiles = array();
-		foreach ( (array) $list as $key => $value ) {
+		foreach ( (array)$list as $key => $value ) {
 			if ( is_int( $key ) ) {
 				// File name as the value
 				if ( !isset( $collatedFiles[$default] ) ) {
@@ -506,7 +530,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	 * @param array $list List of lists to select from
 	 * @param string $key Key to look for in $map
 	 * @param string $fallback Key to look for in $list if $key doesn't exist
-	 * @return Array: List of elements from $map which matched $key or $fallback,
+	 * @return array: List of elements from $map which matched $key or $fallback,
 	 *     or an empty list in case of no match
 	 */
 	protected static function tryForKey( array $list, $key, $fallback = null ) {
@@ -524,8 +548,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	/**
 	 * Gets a list of file paths for all scripts in this module, in order of propper execution.
 	 *
-	 * @param $context ResourceLoaderContext: Context
-	 * @return Array: List of file paths
+	 * @param ResourceLoaderContext $context
+	 * @return array: List of file paths
 	 */
 	protected function getScriptFiles( ResourceLoaderContext $context ) {
 		$files = array_merge(
@@ -543,8 +567,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	/**
 	 * Gets a list of file paths for all styles in this module, in order of propper inclusion.
 	 *
-	 * @param $context ResourceLoaderContext: Context
-	 * @return Array: List of file paths
+	 * @param ResourceLoaderContext $context
+	 * @return array: List of file paths
 	 */
 	protected function getStyleFiles( ResourceLoaderContext $context ) {
 		return array_merge_recursive(
@@ -555,12 +579,29 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 		);
 	}
 
+	/**
+	 * Returns all style files used by this module
+	 * @return array
+	 */
+	public function getAllStyleFiles() {
+		$files = array();
+		foreach( (array)$this->styles as $key => $value ) {
+			if ( is_array( $value ) ) {
+				$path = $key;
+			} else {
+				$path = $value;
+			}
+			$files[] = $this->getLocalPath( $path );
+		}
+		return $files;
+	}
+
 	/**
 	 * Gets the contents of a list of JavaScript files.
 	 *
 	 * @param array $scripts List of file paths to scripts to read, remap and concetenate
 	 * @throws MWException
-	 * @return String: Concatenated and remapped JavaScript data from $scripts
+	 * @return string: Concatenated and remapped JavaScript data from $scripts
 	 */
 	protected function readScriptFiles( array $scripts ) {
 		global $wgResourceLoaderValidateStaticJS;
@@ -591,9 +632,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	 * @param array $styles List of media type/list of file paths pairs, to read, remap and
 	 * concetenate
 	 *
-	 * @param $flip bool
+	 * @param bool $flip
 	 *
-	 * @return Array: List of concatenated and remapped CSS data from $styles,
+	 * @return array: List of concatenated and remapped CSS data from $styles,
 	 *     keyed by media type
 	 */
 	protected function readStyleFiles( array $styles, $flip ) {
@@ -620,9 +661,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 	 * This method can be used as a callback for array_map()
 	 *
 	 * @param string $path File path of style file to read
-	 * @param $flip bool
+	 * @param bool $flip
 	 *
-	 * @return String: CSS data in script file
+	 * @return string: CSS data in script file
 	 * @throws MWException if the file doesn't exist
 	 */
 	protected function readStyleFile( $path, $flip ) {
@@ -632,7 +673,14 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 			wfDebugLog( 'resourceloader', $msg );
 			throw new MWException( $msg );
 		}
-		$style = file_get_contents( $localPath );
+
+		if ( $this->getStyleSheetLang( $path ) === 'less' ) {
+			$style = $this->compileLESSFile( $localPath );
+			$this->hasGeneratedStyles = true;
+		} else {
+			$style = file_get_contents( $localPath );
+		}
+
 		if ( $flip ) {
 			$style = CSSJanus::transform( $style, true, false );
 		}
@@ -655,7 +703,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 
 	/**
 	 * Get whether CSS for this module should be flipped
-	 * @param $context ResourceLoaderContext
+	 * @param ResourceLoaderContext $context
 	 * @return bool
 	 */
 	public function getFlip( $context ) {
@@ -671,4 +719,58 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 		return $this->targets;
 	}
 
+	/**
+	 * Generate a cache key for a LESS file.
+	 *
+	 * The cache key varies on the file name and the names and values of global
+	 * LESS variables.
+	 *
+	 * @since 1.22
+	 * @param string $fileName File name of root LESS file.
+	 * @return string: Cache key
+	 */
+	protected static function getLESSCacheKey( $fileName ) {
+		$vars = json_encode( ResourceLoader::getLESSVars() );
+		$hash = md5( $fileName . $vars );
+		return wfMemcKey( 'resourceloader', 'less', $hash );
+	}
+
+	/**
+	 * Compile a LESS file into CSS.
+	 *
+	 * If invalid, returns replacement CSS source consisting of the compilation
+	 * error message encoded as a comment. To save work, we cache a result object
+	 * which comprises the compiled CSS and the names & mtimes of the files
+	 * that were processed. lessphp compares the cached & current mtimes and
+	 * recompiles as necessary.
+	 *
+	 * @since 1.22
+	 * @param string $fileName File path of LESS source
+	 * @return string: CSS source
+	 */
+	protected function compileLESSFile( $fileName ) {
+		$key = self::getLESSCacheKey( $fileName );
+		$cache = wfGetCache( CACHE_ANYTHING );
+
+		// The input to lessc. Either an associative array representing the
+		// cached results of a previous compilation, or the string file name if
+		// no cache result exists.
+		$source = $cache->get( $key );
+		if ( !is_array( $source ) || !isset( $source['root'] ) ) {
+			$source = $fileName;
+		}
+
+		$compiler = ResourceLoader::getLessCompiler();
+		$result = null;
+
+		$result = $compiler->cachedCompile( $source );
+
+		if ( !is_array( $result ) ) {
+			throw new MWException( 'LESS compiler result has type ' . gettype( $result ) . '; array expected.' );
+		}
+
+		$this->localFileRefs += array_keys( $result['files'] );
+		$cache->set( $key, $result );
+		return $result['compiled'];
+	}
 }
diff --git a/includes/resourceloader/ResourceLoaderLESSFunctions.php b/includes/resourceloader/ResourceLoaderLESSFunctions.php
new file mode 100644
index 00000000..c7570f64
--- /dev/null
+++ b/includes/resourceloader/ResourceLoaderLESSFunctions.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * PHP-provided functions for LESS; see docs for $wgResourceLoaderLESSFunctions
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class ResourceLoaderLESSFunctions {
+	/**
+	 * Check if an image file reference is suitable for embedding.
+	 * An image is embeddable if it (a) exists, (b) has a suitable MIME-type,
+	 * (c) does not exceed IE<9 size limit of 32kb. This is a LESS predicate
+	 * function; it returns a LESS boolean value and can thus be used as a
+	 * mixin guard.
+	 *
+	 * @par Example:
+	 * @code
+	 *   .background-image(@url) when(embeddable(@url)) {
+	 *       background-image: url(@url) !ie;
+	 *   }
+	 * @endcode
+	 */
+	public static function embeddable( $frame, $less ) {
+		$base = pathinfo( $less->parser->sourceName, PATHINFO_DIRNAME );
+		$url = $frame[2][0];
+		$file = realpath( $base . '/' . $url );
+		return $less->toBool( $file
+			&& strpos( $url, '//' ) === false
+			&& filesize( $file ) < CSSMin::EMBED_SIZE_LIMIT
+			&& CSSMin::getMimeType( $file ) !== false );
+	}
+
+	/**
+	 * Convert an image URI to a base64-encoded data URI.
+	 *
+	 * @par Example:
+	 * @code
+	 *   .fancy-button {
+	 *       background-image: embed('../images/button-bg.png');
+	 *   }
+	 * @endcode
+	 */
+	public static function embed( $frame, $less ) {
+		$base = pathinfo( $less->parser->sourceName, PATHINFO_DIRNAME );
+		$url = $frame[2][0];
+		$file = realpath( $base . '/' . $url );
+
+		$data = CSSMin::encodeImageAsDataURI( $file );
+		$less->addParsedFile( $file );
+		return 'url(' . $data . ')';
+	}
+}
diff --git a/includes/resourceloader/ResourceLoaderLanguageDataModule.php b/includes/resourceloader/ResourceLoaderLanguageDataModule.php
index 0f8e54ce..fa0fbf85 100644
--- a/includes/resourceloader/ResourceLoaderLanguageDataModule.php
+++ b/includes/resourceloader/ResourceLoaderLanguageDataModule.php
@@ -75,9 +75,10 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
 		return $this->language->separatorTransformTable();
 	}
 
-
 	/**
-	 * Get all the dynamic data for the content language to an array
+	 * Get all the dynamic data for the content language to an array.
+	 *
+	 * NOTE: Before calling this you HAVE to make sure $this->language is set.
 	 *
 	 * @return array
 	 */
@@ -105,26 +106,20 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
 
 	/**
 	 * @param $context ResourceLoaderContext
-	 * @return array|int|Mixed
+	 * @return int: UNIX timestamp
 	 */
 	public function getModifiedTime( ResourceLoaderContext $context ) {
-		$this->language = Language::factory( $context ->getLanguage() );
-		$cache = wfGetCache( CACHE_ANYTHING );
-		$key = wfMemcKey( 'resourceloader', 'langdatamodule', 'changeinfo' );
+		return max( 1, $this->getHashMtime( $context ) );
+	}
 
-		$data = $this->getData();
-		$hash = md5( serialize( $data ) );
+	/**
+	 * @param $context ResourceLoaderContext
+	 * @return string: Hash
+	 */
+	public function getModifiedHash( ResourceLoaderContext $context ) {
+		$this->language = Language::factory( $context->getLanguage() );
 
-		$result = $cache->get( $key );
-		if ( is_array( $result ) && $result['hash'] === $hash ) {
-			return $result['timestamp'];
-		}
-		$timestamp = wfTimestamp();
-		$cache->set( $key, array(
-			'hash' => $hash,
-			'timestamp' => $timestamp,
-		) );
-		return $timestamp;
+		return md5( serialize( $this->getData() ) );
 	}
 
 	/**
diff --git a/includes/resourceloader/ResourceLoaderModule.php b/includes/resourceloader/ResourceLoaderModule.php
index 03f3cc37..11264fc8 100644
--- a/includes/resourceloader/ResourceLoaderModule.php
+++ b/includes/resourceloader/ResourceLoaderModule.php
@@ -71,7 +71,7 @@ abstract class ResourceLoaderModule {
 	 * Get this module's name. This is set when the module is registered
 	 * with ResourceLoader::register()
 	 *
-	 * @return Mixed: Name (string) or null if no name was set
+	 * @return mixed: Name (string) or null if no name was set
 	 */
 	public function getName() {
 		return $this->name;
@@ -91,7 +91,7 @@ abstract class ResourceLoaderModule {
 	 * Get this module's origin. This is set when the module is registered
 	 * with ResourceLoader::register()
 	 *
-	 * @return Int ResourceLoaderModule class constant, the subclass default
+	 * @return int: ResourceLoaderModule class constant, the subclass default
 	 *     if not set manually
 	 */
 	public function getOrigin() {
@@ -109,7 +109,7 @@ abstract class ResourceLoaderModule {
 	}
 
 	/**
-	 * @param $context ResourceLoaderContext
+	 * @param ResourceLoaderContext $context
 	 * @return bool
 	 */
 	public function getFlip( $context ) {
@@ -122,8 +122,8 @@ abstract class ResourceLoaderModule {
 	 * Get all JS for this module for a given language and skin.
 	 * Includes all relevant JS except loader scripts.
 	 *
-	 * @param $context ResourceLoaderContext: Context object
-	 * @return String: JavaScript code
+	 * @param ResourceLoaderContext $context
+	 * @return string: JavaScript code
 	 */
 	public function getScript( ResourceLoaderContext $context ) {
 		// Stub, override expected
@@ -141,8 +141,8 @@ abstract class ResourceLoaderModule {
 	 * #2 is important to prevent an infinite loop, therefore this function
 	 * MUST return either an only= URL or a non-load.php URL.
 	 *
-	 * @param $context ResourceLoaderContext: Context object
-	 * @return Array of URLs
+	 * @param ResourceLoaderContext $context
+	 * @return array: Array of URLs
 	 */
 	public function getScriptURLsForDebug( ResourceLoaderContext $context ) {
 		$url = ResourceLoader::makeLoaderURL(
@@ -172,8 +172,8 @@ abstract class ResourceLoaderModule {
 	/**
 	 * Get all CSS for this module for a given skin.
 	 *
-	 * @param $context ResourceLoaderContext: Context object
-	 * @return Array: List of CSS strings or array of CSS strings keyed by media type.
+	 * @param ResourceLoaderContext $context
+	 * @return array: List of CSS strings or array of CSS strings keyed by media type.
 	 *  like array( 'screen' => '.foo { width: 0 }' );
 	 *  or array( 'screen' => array( '.foo { width: 0 }' ) );
 	 */
@@ -188,8 +188,8 @@ abstract class ResourceLoaderModule {
 	 * the module, but file-based modules will want to override this to
 	 * load the files directly. See also getScriptURLsForDebug()
 	 *
-	 * @param $context ResourceLoaderContext: Context object
-	 * @return Array: array( mediaType => array( URL1, URL2, ... ), ... )
+	 * @param ResourceLoaderContext $context
+	 * @return array: array( mediaType => array( URL1, URL2, ... ), ... )
 	 */
 	public function getStyleURLsForDebug( ResourceLoaderContext $context ) {
 		$url = ResourceLoader::makeLoaderURL(
@@ -211,7 +211,7 @@ abstract class ResourceLoaderModule {
 	 *
 	 * To get a JSON blob with messages, use MessageBlobStore::get()
 	 *
-	 * @return Array: List of message keys. Keys may occur more than once
+	 * @return array: List of message keys. Keys may occur more than once
 	 */
 	public function getMessages() {
 		// Stub, override expected
@@ -221,7 +221,7 @@ abstract class ResourceLoaderModule {
 	/**
 	 * Get the group this module is in.
 	 *
-	 * @return String: Group name
+	 * @return string: Group name
 	 */
 	public function getGroup() {
 		// Stub, override expected
@@ -231,7 +231,7 @@ abstract class ResourceLoaderModule {
 	/**
 	 * Get the origin of this module. Should only be overridden for foreign modules.
 	 *
-	 * @return String: Origin name, 'local' for local modules
+	 * @return string: Origin name, 'local' for local modules
 	 */
 	public function getSource() {
 		// Stub, override expected
@@ -263,7 +263,7 @@ abstract class ResourceLoaderModule {
 	/**
 	 * Get the loader JS for this module, if set.
 	 *
-	 * @return Mixed: JavaScript loader code as a string or boolean false if no custom loader set
+	 * @return mixed: JavaScript loader code as a string or boolean false if no custom loader set
 	 */
 	public function getLoaderScript() {
 		// Stub, override expected
@@ -274,16 +274,11 @@ abstract class ResourceLoaderModule {
 	 * Get a list of modules this module depends on.
 	 *
 	 * Dependency information is taken into account when loading a module
-	 * on the client side. When adding a module on the server side,
-	 * dependency information is NOT taken into account and YOU are
-	 * responsible for adding dependent modules as well. If you don't do
-	 * this, the client side loader will send a second request back to the
-	 * server to fetch the missing modules, which kind of defeats the
-	 * purpose of the resource loader.
+	 * on the client side.
 	 *
 	 * To add dependencies dynamically on the client side, use a custom
 	 * loader script, see getLoaderScript()
-	 * @return Array: List of module names as strings
+	 * @return array: List of module names as strings
 	 */
 	public function getDependencies() {
 		// Stub, override expected
@@ -293,7 +288,7 @@ abstract class ResourceLoaderModule {
 	/**
 	 * Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
 	 *
-	 * @return array of strings
+	 * @return array: Array of strings
 	 */
 	public function getTargets() {
 		return $this->targets;
@@ -304,7 +299,7 @@ abstract class ResourceLoaderModule {
 	 * Currently these are only image files referenced by the module's CSS.
 	 *
 	 * @param string $skin Skin name
-	 * @return Array: List of files
+	 * @return array: List of files
 	 */
 	public function getFileDependencies( $skin ) {
 		// Try in-object cache first
@@ -319,7 +314,7 @@ abstract class ResourceLoaderModule {
 			), __METHOD__
 		);
 		if ( !is_null( $deps ) ) {
-			$this->fileDeps[$skin] = (array) FormatJson::decode( $deps, true );
+			$this->fileDeps[$skin] = (array)FormatJson::decode( $deps, true );
 		} else {
 			$this->fileDeps[$skin] = array();
 		}
@@ -340,7 +335,7 @@ abstract class ResourceLoaderModule {
 	 * Get the last modification timestamp of the message blob for this
 	 * module in a given language.
 	 * @param string $lang Language code
-	 * @return Integer: UNIX timestamp, or 0 if the module doesn't have messages
+	 * @return int: UNIX timestamp, or 0 if the module doesn't have messages
 	 */
 	public function getMsgBlobMtime( $lang ) {
 		if ( !isset( $this->msgBlobMtime[$lang] ) ) {
@@ -387,22 +382,67 @@ abstract class ResourceLoaderModule {
 	 * If you want this to happen, you'll need to call getMsgBlobMtime()
 	 * yourself and take its result into consideration.
 	 *
-	 * @param $context ResourceLoaderContext: Context object
-	 * @return Integer: UNIX timestamp
+	 * NOTE: The mtime of the module's hash is NOT automatically included.
+	 * If your module provides a getModifiedHash() method, you'll need to call getHashMtime()
+	 * yourself and take its result into consideration.
+	 *
+	 * @param ResourceLoaderContext $context Context object
+	 * @return integer UNIX timestamp
 	 */
 	public function getModifiedTime( ResourceLoaderContext $context ) {
 		// 0 would mean now
 		return 1;
 	}
 
+	/**
+	 * Helper method for calculating when the module's hash (if it has one) changed.
+	 *
+	 * @param ResourceLoaderContext $context
+	 * @return integer: UNIX timestamp or 0 if there is no hash provided
+	 */
+	public function getHashMtime( ResourceLoaderContext $context ) {
+		$hash = $this->getModifiedHash( $context );
+		if ( !is_string( $hash ) ) {
+			return 0;
+		}
+
+		$cache = wfGetCache( CACHE_ANYTHING );
+		$key = wfMemcKey( 'resourceloader', 'modulemodifiedhash', $this->getName() );
+
+		$data = $cache->get( $key );
+		if ( is_array( $data ) && $data['hash'] === $hash ) {
+			// Hash is still the same, re-use the timestamp of when we first saw this hash.
+			return $data['timestamp'];
+		}
+
+		$timestamp = wfTimestamp();
+		$cache->set( $key, array(
+			'hash' => $hash,
+			'timestamp' => $timestamp,
+		) );
+
+		return $timestamp;
+	}
+
+	/**
+	 * Get the last modification timestamp of the message blob for this
+	 * module in a given language.
+	 *
+	 * @param ResourceLoaderContext $context
+	 * @return string|null: Hash
+	 */
+	public function getModifiedHash( ResourceLoaderContext $context ) {
+		return null;
+	}
+
 	/**
 	 * Check whether this module is known to be empty. If a child class
 	 * has an easy and cheap way to determine that this module is
 	 * definitely going to be empty, it should override this method to
 	 * return true in that case. Callers may optimize the request for this
 	 * module away if this function returns true.
-	 * @param $context ResourceLoaderContext: Context object
-	 * @return Boolean
+	 * @param ResourceLoaderContext $context
+	 * @return bool
 	 */
 	public function isKnownEmpty( ResourceLoaderContext $context ) {
 		return false;
@@ -418,7 +458,7 @@ abstract class ResourceLoaderModule {
 	 *
 	 * @param string $fileName
 	 * @param string $contents
-	 * @return string JS with the original, or a replacement error
+	 * @return string: JS with the original, or a replacement error
 	 */
 	protected function validateScriptFile( $fileName, $contents ) {
 		global $wgResourceLoaderValidateJS;
diff --git a/includes/resourceloader/ResourceLoaderSiteModule.php b/includes/resourceloader/ResourceLoaderSiteModule.php
index 1cc5c1a9..05754d37 100644
--- a/includes/resourceloader/ResourceLoaderSiteModule.php
+++ b/includes/resourceloader/ResourceLoaderSiteModule.php
@@ -37,20 +37,19 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
 	 * @return Array: List of pages
 	 */
 	protected function getPages( ResourceLoaderContext $context ) {
-		global $wgHandheldStyle;
+		global $wgUseSiteJs, $wgUseSiteCss;
 
-		$pages = array(
-			'MediaWiki:Common.js' => array( 'type' => 'script' ),
-			'MediaWiki:Common.css' => array( 'type' => 'style' ),
-			'MediaWiki:' . ucfirst( $context->getSkin() ) . '.js' => array( 'type' => 'script' ),
-			'MediaWiki:' . ucfirst( $context->getSkin() ) . '.css' => array( 'type' => 'style' ),
-			'MediaWiki:Print.css' => array( 'type' => 'style', 'media' => 'print' ),
-		);
-		if ( $wgHandheldStyle ) {
-			$pages['MediaWiki:Handheld.css'] = array(
-				'type' => 'style',
-				'media' => 'handheld' );
+		$pages = array();
+		if ( $wgUseSiteJs ) {
+			$pages['MediaWiki:Common.js'] = array( 'type' => 'script' );
+			$pages['MediaWiki:' . ucfirst( $context->getSkin() ) . '.js'] = array( 'type' => 'script' );
 		}
+		if ( $wgUseSiteCss ) {
+			$pages['MediaWiki:Common.css'] = array( 'type' => 'style' );
+			$pages['MediaWiki:' . ucfirst( $context->getSkin() ) . '.css'] = array( 'type' => 'style' );
+
+		}
+		$pages['MediaWiki:Print.css'] = array( 'type' => 'style', 'media' => 'print' );
 		return $pages;
 	}
 
diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php
index 32cf6b26..20f6e0ba 100644
--- a/includes/resourceloader/ResourceLoaderStartUpModule.php
+++ b/includes/resourceloader/ResourceLoaderStartUpModule.php
@@ -27,6 +27,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 	/* Protected Members */
 
 	protected $modifiedTime = array();
+	protected $targets = array( 'desktop', 'mobile' );
 
 	/* Protected Methods */
 
@@ -51,7 +52,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 		 */
 		$namespaceIds = $wgContLang->getNamespaceIds();
 		$caseSensitiveNamespaces = array();
-		foreach( MWNamespace::getCanonicalNamespaces() as $index => $name ) {
+		foreach ( MWNamespace::getCanonicalNamespaces() as $index => $name ) {
 			$namespaceIds[$wgContLang->lc( $name )] = $index;
 			if ( !MWNamespace::isCapitalized( $index ) ) {
 				$caseSensitiveNamespaces[] = $index;
@@ -83,7 +84,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 			'wgFormattedNamespaces' => $wgContLang->getFormattedNamespaces(),
 			'wgNamespaceIds' => $namespaceIds,
 			'wgSiteName' => $wgSitename,
-			'wgFileExtensions' => array_values( $wgFileExtensions ),
+			'wgFileExtensions' => array_values( array_unique( $wgFileExtensions ) ),
 			'wgDBname' => $wgDBname,
 			// This sucks, it is only needed on Special:Upload, but I could
 			// not find a way to add vars only for a certain module
@@ -94,6 +95,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 			'wgCookiePrefix' => $wgCookiePrefix,
 			'wgResourceLoaderMaxQueryLength' => $wgResourceLoaderMaxQueryLength,
 			'wgCaseSensitiveNamespaces' => $caseSensitiveNamespaces,
+			'wgLegalTitleChars' => Title::convertByteClassToUnicodeClass( Title::legalChars() ),
 		);
 
 		wfRunHooks( 'ResourceLoaderGetConfigVars', array( &$vars ) );
@@ -184,7 +186,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 	 * @return string
 	 */
 	public function getScript( ResourceLoaderContext $context ) {
-		global $IP, $wgLoadScript, $wgLegacyJavaScriptGlobals;
+		global $IP, $wgLegacyJavaScriptGlobals;
 
 		$out = file_get_contents( "$IP/resources/startup.js" );
 		if ( $context->getOnly() === 'scripts' ) {
@@ -224,7 +226,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 				"};\n";
 
 			// Conditional script injection
-			$scriptTag = Html::linkedScript( $wgLoadScript . '?' . wfArrayToCgi( $query ) );
+			$scriptTag = Html::linkedScript( wfAppendQuery( wfScript( 'load' ), $query ) );
 			$out .= "if ( isCompatible() ) {\n" .
 				"\t" . Xml::encodeJsCall( 'document.write', array( $scriptTag ) ) .
 				"}\n" .
diff --git a/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php b/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
index bdb240e0..bda86539 100644
--- a/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
+++ b/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
@@ -56,43 +56,44 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
 	public function getStyles( ResourceLoaderContext $context ) {
 		global $wgAllowUserCssPrefs, $wgUser;
 
-		if ( $wgAllowUserCssPrefs ) {
-			$options = $wgUser->getOptions();
+		if ( !$wgAllowUserCssPrefs ) {
+			return array();
+		}
 
-			// Build CSS rules
-			$rules = array();
+		$options = $wgUser->getOptions();
 
-			// Underline: 2 = browser default, 1 = always, 0 = never
-			if ( $options['underline'] < 2 ) {
-				$rules[] = "a { text-decoration: " .
-					( $options['underline'] ? 'underline' : 'none' ) . "; }";
-			} else {
-				# The scripts of these languages are very hard to read with underlines
-				$rules[] = 'a:lang(ar), a:lang(ckb), a:lang(fa),a:lang(kk-arab), ' .
-				'a:lang(mzn), a:lang(ps), a:lang(ur) { text-decoration: none; }';
-			}
-			if ( $options['justify'] ) {
-				$rules[] = "#article, #bodyContent, #mw_content { text-align: justify; }\n";
-			}
-			if ( !$options['showtoc'] ) {
-				$rules[] = "#toc { display: none; }\n";
-			}
-			if ( !$options['editsection'] ) {
-				$rules[] = ".editsection { display: none; }\n";
-			}
-			if ( $options['editfont'] !== 'default' ) {
-				// Double-check that $options['editfont'] consists of safe characters only
-				if ( preg_match( '/^[a-zA-Z0-9_, -]+$/', $options['editfont'] ) ) {
-					$rules[] = "textarea { font-family: {$options['editfont']}; }\n";
-				}
-			}
-			$style = implode( "\n", $rules );
-			if ( $this->getFlip( $context ) ) {
-				$style = CSSJanus::transform( $style, true, false );
+		// Build CSS rules
+		$rules = array();
+
+		// Underline: 2 = browser default, 1 = always, 0 = never
+		if ( $options['underline'] < 2 ) {
+			$rules[] = "a { text-decoration: " .
+				( $options['underline'] ? 'underline' : 'none' ) . "; }";
+		} else {
+			# The scripts of these languages are very hard to read with underlines
+			$rules[] = 'a:lang(ar), a:lang(ckb), a:lang(kk-arab), ' .
+			'a:lang(mzn), a:lang(ps), a:lang(ur) { text-decoration: none; }';
+		}
+		if ( $options['justify'] ) {
+			$rules[] = "#article, #bodyContent, #mw_content { text-align: justify; }\n";
+		}
+		if ( !$options['showtoc'] ) {
+			$rules[] = "#toc { display: none; }\n";
+		}
+		if ( !$options['editsection'] ) {
+			$rules[] = ".mw-editsection { display: none; }\n";
+		}
+		if ( $options['editfont'] !== 'default' ) {
+			// Double-check that $options['editfont'] consists of safe characters only
+			if ( preg_match( '/^[a-zA-Z0-9_, -]+$/', $options['editfont'] ) ) {
+				$rules[] = "textarea { font-family: {$options['editfont']}; }\n";
 			}
-			return array( 'all' => $style );
 		}
-		return array();
+		$style = implode( "\n", $rules );
+		if ( $this->getFlip( $context ) ) {
+			$style = CSSJanus::transform( $style, true, false );
+		}
+		return array( 'all' => $style );
 	}
 
 	/**
diff --git a/includes/resourceloader/ResourceLoaderUserGroupsModule.php b/includes/resourceloader/ResourceLoaderUserGroupsModule.php
index 1316f423..9064263f 100644
--- a/includes/resourceloader/ResourceLoaderUserGroupsModule.php
+++ b/includes/resourceloader/ResourceLoaderUserGroupsModule.php
@@ -33,12 +33,15 @@ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule {
 	 * @return array
 	 */
 	protected function getPages( ResourceLoaderContext $context ) {
-		global $wgUser;
+		global $wgUser, $wgUseSiteJs, $wgUseSiteCss;
 
 		$userName = $context->getUser();
 		if ( $userName === null ) {
 			return array();
 		}
+		if ( !$wgUseSiteJs && !$wgUseSiteCss ) {
+			return array();
+		}
 
 		// Use $wgUser is possible; allows to skip a lot of code
 		if ( is_object( $wgUser ) && $wgUser->getName() == $userName ) {
@@ -51,12 +54,16 @@ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule {
 		}
 
 		$pages = array();
-		foreach( $user->getEffectiveGroups() as $group ) {
+		foreach ( $user->getEffectiveGroups() as $group ) {
 			if ( in_array( $group, array( '*', 'user' ) ) ) {
 				continue;
 			}
-			$pages["MediaWiki:Group-$group.js"] = array( 'type' => 'script' );
-			$pages["MediaWiki:Group-$group.css"] = array( 'type' => 'style' );
+			if ( $wgUseSiteJs ) {
+				$pages["MediaWiki:Group-$group.js"] = array( 'type' => 'script' );
+			}
+			if ( $wgUseSiteCss ) {
+				$pages["MediaWiki:Group-$group.css"] = array( 'type' => 'style' );
+			}
 		}
 		return $pages;
 	}
diff --git a/includes/resourceloader/ResourceLoaderUserModule.php b/includes/resourceloader/ResourceLoaderUserModule.php
index 177302c5..7a04e473 100644
--- a/includes/resourceloader/ResourceLoaderUserModule.php
+++ b/includes/resourceloader/ResourceLoaderUserModule.php
@@ -35,11 +35,15 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
 	 * @return array
 	 */
 	protected function getPages( ResourceLoaderContext $context ) {
+		global $wgAllowUserJs, $wgAllowUserCss;
 		$username = $context->getUser();
 
 		if ( $username === null ) {
 			return array();
 		}
+		if ( !$wgAllowUserJs && !$wgAllowUserCss ) {
+			return array();
+		}
 
 		// Get the normalized title of the user's user page
 		$userpageTitle = Title::makeTitleSafe( NS_USER, $username );
@@ -50,14 +54,15 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
 
 		$userpage = $userpageTitle->getPrefixedDBkey(); // Needed so $excludepages works
 
-		$pages = array(
-			"$userpage/common.js" => array( 'type' => 'script' ),
-			"$userpage/" . $context->getSkin() . '.js' =>
-				array( 'type' => 'script' ),
-			"$userpage/common.css" => array( 'type' => 'style' ),
-			"$userpage/" . $context->getSkin() . '.css' =>
-				array( 'type' => 'style' ),
-		);
+		$pages = array();
+		if ( $wgAllowUserJs ) {
+			$pages["$userpage/common.js"] = array( 'type' => 'script' );
+			$pages["$userpage/" . $context->getSkin() . '.js'] = array( 'type' => 'script' );
+		}
+		if ( $wgAllowUserCss ) {
+			$pages["$userpage/common.css"] = array( 'type' => 'style' );
+			$pages["$userpage/" . $context->getSkin() . '.css'] = array( 'type' => 'style' );
+		}
 
 		// Hack for bug 26283: if we're on a preview page for a CSS/JS page,
 		// we need to exclude that page from this module. In that case, the excludepage
diff --git a/includes/resourceloader/ResourceLoaderUserOptionsModule.php b/includes/resourceloader/ResourceLoaderUserOptionsModule.php
index 4624cbce..0b7e1964 100644
--- a/includes/resourceloader/ResourceLoaderUserOptionsModule.php
+++ b/includes/resourceloader/ResourceLoaderUserOptionsModule.php
@@ -56,7 +56,9 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
 	public function getScript( ResourceLoaderContext $context ) {
 		global $wgUser;
 		return Xml::encodeJsCall( 'mw.user.options.set',
-			array( $wgUser->getOptions() ) );
+			array( $wgUser->getOptions() ),
+			ResourceLoader::inDebugMode()
+		);
 	}
 
 	/**
diff --git a/includes/resourceloader/ResourceLoaderUserTokensModule.php b/includes/resourceloader/ResourceLoaderUserTokensModule.php
index 6d787c50..92ebbe93 100644
--- a/includes/resourceloader/ResourceLoaderUserTokensModule.php
+++ b/includes/resourceloader/ResourceLoaderUserTokensModule.php
@@ -35,10 +35,9 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
 	/**
 	 * Fetch the tokens for the current user.
 	 *
-	 * @param $context ResourceLoaderContext: Context object
-	 * @return Array: List of tokens keyed by token type
+	 * @return array: List of tokens keyed by token type
 	 */
-	protected function contextUserTokens( ResourceLoaderContext $context ) {
+	protected function contextUserTokens() {
 		global $wgUser;
 
 		return array(
@@ -54,7 +53,9 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
 	 */
 	public function getScript( ResourceLoaderContext $context ) {
 		return Xml::encodeJsCall( 'mw.user.tokens.set',
-			array( $this->contextUserTokens( $context ) ) );
+			array( $this->contextUserTokens() ),
+			ResourceLoader::inDebugMode()
+		);
 	}
 
 	/**
diff --git a/includes/resourceloader/ResourceLoaderWikiModule.php b/includes/resourceloader/ResourceLoaderWikiModule.php
index 6c60d474..3f10ae53 100644
--- a/includes/resourceloader/ResourceLoaderWikiModule.php
+++ b/includes/resourceloader/ResourceLoaderWikiModule.php
@@ -92,14 +92,14 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
 		$content = $revision->getContent( Revision::RAW );
 
 		if ( !$content ) {
-			wfDebug( __METHOD__ . "failed to load content of JS/CSS page!\n" );
+			wfDebugLog( 'resourceloader', __METHOD__ . ': failed to load content of JS/CSS page!' );
 			return null;
 		}
 
 		$model = $content->getModel();
 
 		if ( $model !== CONTENT_MODEL_CSS && $model !== CONTENT_MODEL_JAVASCRIPT ) {
-			wfDebug( __METHOD__ . "bad content model $model for JS/CSS page!\n" );
+			wfDebugLog( 'resourceloader', __METHOD__ . ': bad content model $model for JS/CSS page!' );
 			return null;
 		}
 
diff --git a/includes/revisiondelete/RevisionDelete.php b/includes/revisiondelete/RevisionDelete.php
index f4c07968..71850877 100644
--- a/includes/revisiondelete/RevisionDelete.php
+++ b/includes/revisiondelete/RevisionDelete.php
@@ -41,6 +41,19 @@ class RevDel_RevisionList extends RevDel_List {
 		return 'rev_id';
 	}
 
+	public static function getRestriction() {
+		return 'deleterevision';
+	}
+
+	public static function getRevdelConstant() {
+		return Revision::DELETED_TEXT;
+	}
+
+	public static function suggestTarget( $target, array $ids ) {
+		$rev = Revision::newFromId( $ids[0] );
+		return $rev ? $rev->getTitle() : $target;
+	}
+
 	/**
 	 * @param $db DatabaseBase
 	 * @return mixed
@@ -52,7 +65,7 @@ class RevDel_RevisionList extends RevDel_List {
 			array_merge( Revision::selectFields(), Revision::selectUserFields() ),
 			array(
 				'rev_page' => $this->title->getArticleID(),
-				'rev_id'   => $ids,
+				'rev_id' => $ids,
 			),
 			__METHOD__,
 			array( 'ORDER BY' => 'rev_id DESC' ),
@@ -242,8 +255,7 @@ class RevDel_RevisionItem extends RevDel_Item {
 		if ( $this->isDeleted() && !$this->canViewContent() ) {
 			return $this->list->msg( 'diff' )->escaped();
 		} else {
-			return
-				Linker::linkKnown(
+			return Linker::linkKnown(
 					$this->list->title,
 					$this->list->msg( 'diff' )->escaped(),
 					array(),
@@ -293,7 +305,7 @@ class RevDel_ArchiveList extends RevDel_RevisionList {
 		return $db->select( 'archive', '*',
 				array(
 					'ar_namespace' => $this->title->getNamespace(),
-					'ar_title'     => $this->title->getDBkey(),
+					'ar_title' => $this->title->getDBkey(),
 					'ar_timestamp' => $timestamps
 				),
 				__METHOD__,
@@ -350,12 +362,12 @@ class RevDel_ArchiveItem extends RevDel_RevisionItem {
 		$dbw->update( 'archive',
 			array( 'ar_deleted' => $bits ),
 			array(
-				'ar_namespace' 	=> $this->list->title->getNamespace(),
-				'ar_title'     	=> $this->list->title->getDBkey(),
+				'ar_namespace' => $this->list->title->getNamespace(),
+				'ar_title' => $this->list->title->getDBkey(),
 				// use timestamp for index
-				'ar_timestamp' 	=> $this->row->ar_timestamp,
-				'ar_rev_id'    	=> $this->row->ar_rev_id,
-				'ar_deleted' 	=> $this->getBits()
+				'ar_timestamp' => $this->row->ar_timestamp,
+				'ar_rev_id' => $this->row->ar_rev_id,
+				'ar_deleted' => $this->getBits()
 			),
 			__METHOD__ );
 		return (bool)$dbw->affectedRows();
@@ -442,6 +454,14 @@ class RevDel_FileList extends RevDel_List {
 		return 'oi_archive_name';
 	}
 
+	public static function getRestriction() {
+		return 'deleterevision';
+	}
+
+	public static function getRevdelConstant() {
+		return File::DELETED_FILE;
+	}
+
 	var $storeBatch, $deleteBatch, $cleanupBatch;
 
 	/**
@@ -450,14 +470,14 @@ class RevDel_FileList extends RevDel_List {
 	 */
 	public function doQuery( $db ) {
 		$archiveNames = array();
-		foreach( $this->ids as $timestamp ) {
+		foreach ( $this->ids as $timestamp ) {
 			$archiveNames[] = $timestamp . '!' . $this->title->getDBkey();
 		}
 		return $db->select(
 			'oldimage',
 			OldLocalFile::selectFields(),
 			array(
-				'oi_name'         => $this->title->getDBkey(),
+				'oi_name' => $this->title->getDBkey(),
 				'oi_archive_name' => $archiveNames
 			),
 			__METHOD__,
@@ -635,8 +655,8 @@ class RevDel_FileItem extends RevDel_Item {
 				array(),
 				array(
 					'target' => $this->list->title->getPrefixedText(),
-					'file'   => $this->file->getArchiveName(),
-					'token'  => $this->list->getUser()->getEditToken(
+					'file' => $this->file->getArchiveName(),
+					'token' => $this->list->getUser()->getEditToken(
 						$this->file->getArchiveName() )
 				)
 			);
@@ -648,13 +668,13 @@ class RevDel_FileItem extends RevDel_Item {
 	 * @return string HTML
 	 */
 	protected function getUserTools() {
-		if( $this->file->userCan( Revision::DELETED_USER, $this->list->getUser() ) ) {
+		if ( $this->file->userCan( Revision::DELETED_USER, $this->list->getUser() ) ) {
 			$link = Linker::userLink( $this->file->user, $this->file->user_text ) .
 				Linker::userToolLinks( $this->file->user, $this->file->user_text );
 		} else {
 			$link = $this->list->msg( 'rev-deleted-user' )->escaped();
 		}
-		if( $this->file->isDeleted( Revision::DELETED_USER ) ) {
+		if ( $this->file->isDeleted( Revision::DELETED_USER ) ) {
 			return '<span class="history-deleted">' . $link . '</span>';
 		}
 		return $link;
@@ -667,12 +687,12 @@ class RevDel_FileItem extends RevDel_Item {
 	 * @return string HTML
 	 */
 	protected function getComment() {
-		if( $this->file->userCan( File::DELETED_COMMENT, $this->list->getUser() ) ) {
+		if ( $this->file->userCan( File::DELETED_COMMENT, $this->list->getUser() ) ) {
 			$block = Linker::commentBlock( $this->file->description );
 		} else {
 			$block = ' ' . $this->list->msg( 'rev-deleted-comment' )->escaped();
 		}
-		if( $this->file->isDeleted( File::DELETED_COMMENT ) ) {
+		if ( $this->file->isDeleted( File::DELETED_COMMENT ) ) {
 			return "<span class=\"history-deleted\">$block</span>";
 		}
 		return $block;
@@ -685,7 +705,7 @@ class RevDel_FileItem extends RevDel_Item {
 			' (' . $this->list->msg( 'nbytes' )->numParams( $this->file->getSize() )->text() . ')';
 
 		return '<li>' . $this->getLink() . ' ' . $this->getUserTools() . ' ' .
-			$data . ' ' . $this->getComment(). '</li>';
+			$data . ' ' . $this->getComment() . '</li>';
 	}
 }
 
@@ -712,7 +732,7 @@ class RevDel_ArchivedFileList extends RevDel_FileList {
 			ArchivedFile::selectFields(),
 			array(
 				'fa_name' => $this->title->getDBkey(),
-				'fa_id'   => $ids
+				'fa_id' => $ids
 			),
 			__METHOD__,
 			array( 'ORDER BY' => 'fa_id DESC' )
@@ -771,7 +791,7 @@ class RevDel_ArchivedFileItem extends RevDel_FileItem {
 			$this->file->getTimestamp(), $this->list->getUser() ) );
 
 		# Hidden files...
-		if( !$this->canViewContent() ) {
+		if ( !$this->canViewContent() ) {
 			$link = $date;
 		} else {
 			$undelete = SpecialPage::getTitleFor( 'Undelete' );
@@ -784,7 +804,7 @@ class RevDel_ArchivedFileItem extends RevDel_FileItem {
 				)
 			);
 		}
-		if( $this->isDeleted() ) {
+		if ( $this->isDeleted() ) {
 			$link = '<span class="history-deleted">' . $link . '</span>';
 		}
 		return $link;
@@ -803,6 +823,28 @@ class RevDel_LogList extends RevDel_List {
 		return 'log_id';
 	}
 
+	public static function getRestriction() {
+		return 'deletelogentry';
+	}
+
+	public static function getRevdelConstant() {
+		return LogPage::DELETED_ACTION;
+	}
+
+	public static function suggestTarget( $target, array $ids ) {
+		$result = wfGetDB( DB_SLAVE )->select( 'logging',
+			'log_type',
+			array( 'log_id' => $ids ),
+			__METHOD__,
+			array( 'DISTINCT' )
+		);
+		if ( $result->numRows() == 1 ) {
+			// If there's only one type, the target can be set to include it.
+			return SpecialPage::getTitleFor( 'Log', $result->current()->log_type );
+		}
+		return SpecialPage::getTitleFor( 'Log' );
+	}
+
 	/**
 	 * @param $db DatabaseBase
 	 * @return mixed
@@ -913,7 +955,7 @@ class RevDel_LogItem extends RevDel_Item {
 		$action = $formatter->getActionText();
 		// Comment
 		$comment = $this->list->getLanguage()->getDirMark() . Linker::commentBlock( $this->row->log_comment );
-		if( LogEventsList::isDeleted( $this->row, LogPage::DELETED_COMMENT ) ) {
+		if ( LogEventsList::isDeleted( $this->row, LogPage::DELETED_COMMENT ) ) {
 			$comment = '<span class="history-deleted">' . $comment . '</span>';
 		}
 
diff --git a/includes/revisiondelete/RevisionDeleteAbstracts.php b/includes/revisiondelete/RevisionDeleteAbstracts.php
index b2108de6..803467e6 100644
--- a/includes/revisiondelete/RevisionDeleteAbstracts.php
+++ b/includes/revisiondelete/RevisionDeleteAbstracts.php
@@ -37,12 +37,44 @@ abstract class RevDel_List extends RevisionListBase {
 	 * Get the DB field name associated with the ID list.
 	 * This used to populate the log_search table for finding log entries.
 	 * Override this function.
-	 * @return null
+	 * @return string|null
 	 */
 	public static function getRelationType() {
 		return null;
 	}
 
+	/**
+	 * Get the user right required for this list type
+	 * Override this function.
+	 * @since 1.22
+	 * @return string|null
+	 */
+	public static function getRestriction() {
+		return null;
+	}
+
+	/**
+	 * Get the revision deletion constant for this list type
+	 * Override this function.
+	 * @since 1.22
+	 * @return int|null
+	 */
+	public static function getRevdelConstant() {
+		return null;
+	}
+
+	/**
+	 * Suggest a target for the revision deletion
+	 * Optionally override this function.
+	 * @since 1.22
+	 * @param Title|null $target User-supplied target
+	 * @param array $ids
+	 * @return Title|null
+	 */
+	public static function suggestTarget( $target, array $ids ) {
+		return $target;
+	}
+
 	/**
 	 * Set the visibility for the revisions in this list. Logging and
 	 * transactions are done here.
@@ -68,11 +100,11 @@ abstract class RevDel_List extends RevisionListBase {
 
 		for ( $this->reset(); $this->current(); $this->next() ) {
 			$item = $this->current();
-			unset( $missing[ $item->getId() ] );
+			unset( $missing[$item->getId()] );
 
 			$oldBits = $item->getBits();
 			// Build the actual new rev_deleted bitfield
-			$newBits = SpecialRevisionDelete::extractBitfield( $bitPars, $oldBits );
+			$newBits = RevisionDeleter::extractBitfield( $bitPars, $oldBits );
 
 			if ( $oldBits == $newBits ) {
 				$status->warning( 'revdelete-no-change', $item->formatDate(), $item->formatTime() );
@@ -94,14 +126,14 @@ abstract class RevDel_List extends RevisionListBase {
 			}
 			if ( !$item->canView() ) {
 				// Cannot access this revision
-				$msg = ($opType == 'show') ?
+				$msg = ( $opType == 'show' ) ?
 					'revdelete-show-no-access' : 'revdelete-modify-no-access';
 				$status->error( $msg, $item->formatDate(), $item->formatTime() );
 				$status->failCount++;
 				continue;
 			}
 			// Cannot just "hide from Sysops" without hiding any fields
-			if( $newBits == Revision::DELETED_RESTRICTED ) {
+			if ( $newBits == Revision::DELETED_RESTRICTED ) {
 				$status->warning( 'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
 				$status->failCount++;
 				continue;
@@ -113,9 +145,9 @@ abstract class RevDel_List extends RevisionListBase {
 			if ( $ok ) {
 				$idsForLog[] = $item->getId();
 				$status->successCount++;
-				if( $item->getAuthorId() > 0 ) {
+				if ( $item->getAuthorId() > 0 ) {
 					$authorIds[] = $item->getAuthorId();
-				} elseif( IP::isIPAddress( $item->getAuthorName() ) ) {
+				} elseif ( IP::isIPAddress( $item->getAuthorName() ) ) {
 					$authorIPs[] = $item->getAuthorName();
 				}
 			} else {
@@ -189,7 +221,7 @@ abstract class RevDel_List extends RevisionListBase {
 	protected function updateLog( $params ) {
 		// Get the URL param's corresponding DB field
 		$field = RevisionDeleter::getRelationType( $this->getType() );
-		if( !$field ) {
+		if ( !$field ) {
 			throw new MWException( "Bad log URL param type!" );
 		}
 		// Put things hidden from sysops in the oversight log
@@ -203,7 +235,7 @@ abstract class RevDel_List extends RevisionListBase {
 		// Actually add the deletion log entry
 		$log = new LogPage( $logType );
 		$logid = $log->addEntry( $this->getLogAction(), $params['title'],
-			$params['comment'], $logParams );
+			$params['comment'], $logParams, $this->getUser() );
 		// Allow for easy searching of deletion log items for revision/log items
 		$log->addRelations( $field, $params['ids'], $logid );
 		$log->addRelations( 'target_author_id', $params['authorIds'], $logid );
diff --git a/includes/revisiondelete/RevisionDeleteUser.php b/includes/revisiondelete/RevisionDeleteUser.php
index c02e9c76..4505ee10 100644
--- a/includes/revisiondelete/RevisionDeleteUser.php
+++ b/includes/revisiondelete/RevisionDeleteUser.php
@@ -54,7 +54,7 @@ class RevisionDeleteUser {
 		# The same goes for the sysop-restricted *_deleted bit.
 		$delUser = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
 		$delAction = LogPage::DELETED_ACTION | Revision::DELETED_RESTRICTED;
-		if( $op == '&' ) {
+		if ( $op == '&' ) {
 			$delUser = "~{$delUser}";
 			$delAction = "~{$delAction}";
 		}
diff --git a/includes/revisiondelete/RevisionDeleter.php b/includes/revisiondelete/RevisionDeleter.php
index fe351c51..dbcb3d7d 100644
--- a/includes/revisiondelete/RevisionDeleter.php
+++ b/includes/revisiondelete/RevisionDeleter.php
@@ -22,11 +22,71 @@
  */
 
 /**
- * Temporary b/c interface, collection of static functions.
- * @ingroup SpecialPage
+ * General controller for RevDel, used by both SpecialRevisiondelete and
+ * ApiRevisionDelete.
  * @ingroup RevisionDelete
  */
 class RevisionDeleter {
+	/** List of known revdel types, with their corresponding list classes */
+	private static $allowedTypes = array(
+		'revision' => 'RevDel_RevisionList',
+		'archive' => 'RevDel_ArchiveList',
+		'oldimage' => 'RevDel_FileList',
+		'filearchive' => 'RevDel_ArchivedFileList',
+		'logging' => 'RevDel_LogList',
+	);
+
+	/** Type map to support old log entries */
+	private static $deprecatedTypeMap = array(
+		'oldid' => 'revision',
+		'artimestamp' => 'archive',
+		'oldimage' => 'oldimage',
+		'fileid' => 'filearchive',
+		'logid' => 'logging',
+	);
+
+	/**
+	 * Lists the valid possible types for revision deletion.
+	 *
+	 * @since 1.22
+	 * @return array
+	 */
+	public static function getTypes() {
+		return array_keys( self::$allowedTypes );
+	}
+
+	/**
+	 * Gets the canonical type name, if any.
+	 *
+	 * @since 1.22
+	 * @param string $typeName
+	 * @return string|null
+	 */
+	public static function getCanonicalTypeName( $typeName ) {
+		if ( isset( self::$deprecatedTypeMap[$typeName] ) ) {
+			$typeName = self::$deprecatedTypeMap[$typeName];
+		}
+		return isset( self::$allowedTypes[$typeName] ) ? $typeName : null;
+	}
+
+	/**
+	 * Instantiate the appropriate list class for a given list of IDs.
+	 *
+	 * @since 1.22
+	 * @param string $typeName RevDel type, see RevisionDeleter::getTypes()
+	 * @param IContextSource $context
+	 * @param Title $title
+	 * @param array $ids
+	 * @return RevDel_List
+	 */
+	public static function createList( $typeName, IContextSource $context, Title $title, array $ids ) {
+		$typeName = self::getCanonicalTypeName( $typeName );
+		if ( !$typeName ) {
+			throw new MWException( __METHOD__ . ": Unknown RevDel type '$typeName'" );
+		}
+		return new self::$allowedTypes[$typeName]( $context, $title, $ids );
+	}
+
 	/**
 	 * Checks for a change in the bitfield for a certain option and updates the
 	 * provided array accordingly.
@@ -39,8 +99,8 @@ class RevisionDeleter {
 	 * @param array $arr the array to update.
 	 */
 	protected static function checkItem( $desc, $field, $diff, $new, &$arr ) {
-		if( $diff & $field ) {
-			$arr[ ( $new & $field ) ? 0 : 1 ][] = $desc;
+		if ( $diff & $field ) {
+			$arr[( $new & $field ) ? 0 : 1][] = $desc;
 		}
 	}
 
@@ -73,11 +133,12 @@ class RevisionDeleter {
 		self::checkItem( 'revdelete-uname',
 			Revision::DELETED_USER, $diff, $n, $ret );
 		// Restriction application to sysops
-		if( $diff & Revision::DELETED_RESTRICTED ) {
-			if( $n & Revision::DELETED_RESTRICTED )
+		if ( $diff & Revision::DELETED_RESTRICTED ) {
+			if ( $n & Revision::DELETED_RESTRICTED ) {
 				$ret[2][] = 'revdelete-restricted';
-			else
+			} else {
 				$ret[2][] = 'revdelete-unrestricted';
+			}
 		}
 		return $ret;
 	}
@@ -85,20 +146,62 @@ class RevisionDeleter {
 	/** Get DB field name for URL param...
 	 * Future code for other things may also track
 	 * other types of revision-specific changes.
+	 * @param string $typeName
 	 * @return string One of log_id/rev_id/fa_id/ar_timestamp/oi_archive_name
 	 */
 	public static function getRelationType( $typeName ) {
-		if ( isset( SpecialRevisionDelete::$deprecatedTypeMap[$typeName] ) ) {
-			$typeName = SpecialRevisionDelete::$deprecatedTypeMap[$typeName];
+		$typeName = self::getCanonicalTypeName( $typeName );
+		if ( !$typeName ) {
+			return null;
 		}
-		if ( isset( SpecialRevisionDelete::$allowedTypes[$typeName] ) ) {
-			$class = SpecialRevisionDelete::$allowedTypes[$typeName]['list-class'];
-			return call_user_func( array( $class, 'getRelationType' ) );
-		} else {
+		return call_user_func( array( self::$allowedTypes[$typeName], 'getRelationType' ) );
+	}
+
+	/**
+	 * Get the user right required for the RevDel type
+	 * @since 1.22
+	 * @param string $typeName
+	 * @return string User right
+	 */
+	public static function getRestriction( $typeName ) {
+		$typeName = self::getCanonicalTypeName( $typeName );
+		if ( !$typeName ) {
+			return null;
+		}
+		return call_user_func( array( self::$allowedTypes[$typeName], 'getRestriction' ) );
+	}
+
+	/**
+	 * Get the revision deletion constant for the RevDel type
+	 * @since 1.22
+	 * @param string $typeName
+	 * @return int RevDel constant
+	 */
+	public static function getRevdelConstant( $typeName ) {
+		$typeName = self::getCanonicalTypeName( $typeName );
+		if ( !$typeName ) {
 			return null;
 		}
+		return call_user_func( array( self::$allowedTypes[$typeName], 'getRevdelConstant' ) );
+	}
+
+	/**
+	 * Suggest a target for the revision deletion
+	 * @since 1.22
+	 * @param string $typeName
+	 * @param Title|null $title User-supplied target
+	 * @param array $ids
+	 * @return Title|null
+	 */
+	public static function suggestTarget( $typeName, $target, array $ids ) {
+		$typeName = self::getCanonicalTypeName( $typeName );
+		if ( !$typeName ) {
+			return $target;
+		}
+		return call_user_func( array( self::$allowedTypes[$typeName], 'suggestTarget' ), $target, $ids );
 	}
 
+
 	/**
 	 * Checks if a revision still exists in the revision table.
 	 * If it doesn't, returns the corresponding ar_timestamp field
@@ -124,4 +227,24 @@ class RevisionDeleter {
 
 		return $timestamp;
 	}
+
+	/**
+	 * Put together a rev_deleted bitfield
+	 * @since 1.22
+	 * @param array $bitPars extractBitParams() params
+	 * @param int $oldfield current bitfield
+	 * @return array
+	 */
+	public static function extractBitfield( $bitPars, $oldfield ) {
+		// Build the actual new rev_deleted bitfield
+		$newBits = 0;
+		foreach ( $bitPars as $const => $val ) {
+			if ( $val == 1 ) {
+				$newBits |= $const; // $const is the *_deleted const
+			} elseif ( $val == -1 ) {
+				$newBits |= ( $oldfield & $const ); // use existing
+			}
+		}
+		return $newBits;
+	}
 }
diff --git a/includes/search/SearchEngine.php b/includes/search/SearchEngine.php
index 6b3e62b1..71c05d8b 100644
--- a/includes/search/SearchEngine.php
+++ b/includes/search/SearchEngine.php
@@ -59,7 +59,7 @@ class SearchEngine {
 	 * STUB
 	 *
 	 * @param string $term raw search term
-	 * @return SearchResultSet
+	 * @return SearchResultSet|Status|null
 	 */
 	function searchText( $term ) {
 		return null;
@@ -71,7 +71,7 @@ class SearchEngine {
 	 * STUB
 	 *
 	 * @param string $term raw search term
-	 * @return SearchResultSet
+	 * @return SearchResultSet|null
 	 */
 	function searchTitle( $term ) {
 		return null;
@@ -93,8 +93,9 @@ class SearchEngine {
 	 * @return Boolean
 	 */
 	public function supports( $feature ) {
-		switch( $feature ) {
+		switch ( $feature ) {
 		case 'list-redirects':
+		case 'search-update':
 			return true;
 		case 'title-suffix-filter':
 		default:
@@ -331,8 +332,9 @@ class SearchEngine {
 				$parsed = substr( $query, strlen( $prefix ) + 1 );
 			}
 		}
-		if ( trim( $parsed ) == '' )
+		if ( trim( $parsed ) == '' ) {
 			$parsed = $query; // prefix was the whole query
+		}
 
 		wfRunHooks( 'SearchEngineReplacePrefixesComplete', array( $this, $query, &$parsed ) );
 
@@ -420,8 +422,9 @@ class SearchEngine {
 
 		$formatted = array_map( array( $wgContLang, 'getFormattedNsText' ), $namespaces );
 		foreach ( $formatted as $key => $ns ) {
-			if ( empty( $ns ) )
+			if ( empty( $ns ) ) {
 				$formatted[$key] = wfMessage( 'blanknamespace' )->text();
+			}
 		}
 		return $formatted;
 	}
@@ -451,22 +454,45 @@ class SearchEngine {
 	 * Load up the appropriate search engine class for the currently
 	 * active database backend, and return a configured instance.
 	 *
+	 * @param String $type Type of search backend, if not the default
 	 * @return SearchEngine
 	 */
-	public static function create() {
+	public static function create( $type = null ) {
 		global $wgSearchType;
 		$dbr = null;
-		if ( $wgSearchType ) {
+
+		$alternatives = self::getSearchTypes();
+
+		if ( $type && in_array( $type, $alternatives ) ) {
+			$class = $type;
+		} elseif ( $wgSearchType !== null ) {
 			$class = $wgSearchType;
 		} else {
 			$dbr = wfGetDB( DB_SLAVE );
 			$class = $dbr->getSearchEngine();
 		}
+
 		$search = new $class( $dbr );
 		$search->setLimitOffset( 0, 0 );
 		return $search;
 	}
 
+	/**
+	 * Return the search engines we support. If only $wgSearchType
+	 * is set, it'll be an array of just that one item.
+	 *
+	 * @return array
+	 */
+	public static function getSearchTypes() {
+		global $wgSearchType, $wgSearchTypeAlternatives;
+		static $alternatives = null;
+		if ( $alternatives === null ) {
+			$alternatives = $wgSearchTypeAlternatives ?: array();
+			array_unshift( $alternatives, $wgSearchType );
+		}
+		return $alternatives;
+	}
+
 	/**
 	 * Create or update the search index record for the given page.
 	 * Title and text should be pre-processed.
@@ -492,6 +518,18 @@ class SearchEngine {
 		// no-op
 	}
 
+	/**
+	 * Delete an indexed page
+	 * Title should be pre-processed.
+	 * STUB
+	 *
+	 * @param Integer $id Page id that was deleted
+	 * @param String $title Title of page that was deleted
+	 */
+	function delete( $id, $title ) {
+		// no-op
+	}
+
 	/**
 	 * Get OpenSearch suggestion template
 	 *
@@ -509,6 +547,31 @@ class SearchEngine {
 			return $wgCanonicalServer . wfScript( 'api' ) . '?action=opensearch&search={searchTerms}&namespace=' . $ns;
 		}
 	}
+
+	/**
+	 * Get the raw text for updating the index from a content object
+	 * Nicer search backends could possibly do something cooler than
+	 * just returning raw text
+	 *
+	 * @todo This isn't ideal, we'd really like to have content-specific handling here
+	 * @param Title $t Title we're indexing
+	 * @param Content $c Content of the page to index
+	 * @return string
+	 */
+	public function getTextFromContent( Title $t, Content $c = null ) {
+		return $c ? $c->getTextForSearchIndex() : '';
+	}
+
+	/**
+	 * If an implementation of SearchEngine handles all of its own text processing
+	 * in getTextFromContent() and doesn't require SearchUpdate::updateText()'s
+	 * rather silly handling, it should return true here instead.
+	 *
+	 * @return bool
+	 */
+	public function textAlreadyUpdatedForIndex() {
+		return false;
+	}
 }
 
 /**
@@ -641,26 +704,30 @@ class SqlSearchResultSet extends SearchResultSet {
 	}
 
 	function numRows() {
-		if ( $this->mResultSet === false )
+		if ( $this->mResultSet === false ) {
 			return false;
+		}
 
 		return $this->mResultSet->numRows();
 	}
 
 	function next() {
-		if ( $this->mResultSet === false )
+		if ( $this->mResultSet === false ) {
 			return false;
+		}
 
 		$row = $this->mResultSet->fetchObject();
-		if ( $row === false )
+		if ( $row === false ) {
 			return false;
+		}
 
 		return SearchResult::newFromRow( $row );
 	}
 
 	function free() {
-		if ( $this->mResultSet === false )
+		if ( $this->mResultSet === false ) {
 			return false;
+		}
 
 		$this->mResultSet->free();
 	}
@@ -750,8 +817,9 @@ class SearchResult {
 			wfRunHooks( 'SearchResultInitFromTitle', array( $title, &$id ) );
 			$this->mRevision = Revision::newFromTitle(
 				$this->mTitle, $id, Revision::READ_NORMAL );
-			if ( $this->mTitle->getNamespace() === NS_FILE )
+			if ( $this->mTitle->getNamespace() === NS_FILE ) {
 				$this->mImage = wfFindFile( $this->mTitle );
+			}
 		}
 	}
 
@@ -761,8 +829,9 @@ class SearchResult {
 	 * @return Boolean
 	 */
 	function isBrokenTitle() {
-		if ( is_null( $this->mTitle ) )
+		if ( is_null( $this->mTitle ) ) {
 			return true;
+		}
 		return false;
 	}
 
@@ -795,10 +864,8 @@ class SearchResult {
 	protected function initText() {
 		if ( !isset( $this->mText ) ) {
 			if ( $this->mRevision != null ) {
-				//TODO: if we could plug in some code that knows about special content models *and* about
-				//      special features of the search engine, the search could benefit.
-				$content = $this->mRevision->getContent();
-				$this->mText = $content ? $content->getTextForSearchIndex() : '';
+				$this->mText = SearchEngine::create()
+					->getTextFromContent( $this->mTitle, $this->mRevision->getContent() );
 			} else { // TODO: can we fetch raw wikitext for commons images?
 				$this->mText = '';
 			}
@@ -810,16 +877,17 @@ class SearchResult {
 	 * @return String: highlighted text snippet, null (and not '') if not supported
 	 */
 	function getTextSnippet( $terms ) {
-		global $wgUser, $wgAdvancedSearchHighlighting;
+		global $wgAdvancedSearchHighlighting;
 		$this->initText();
 
 		// TODO: make highliter take a content object. Make ContentHandler a factory for SearchHighliter.
-		list( $contextlines, $contextchars ) = SearchEngine::userHighlightPrefs( $wgUser );
+		list( $contextlines, $contextchars ) = SearchEngine::userHighlightPrefs();
 		$h = new SearchHighlighter();
-		if ( $wgAdvancedSearchHighlighting )
+		if ( $wgAdvancedSearchHighlighting ) {
 			return $h->highlightText( $this->mText, $terms, $contextlines, $contextchars );
-		else
+		} else {
 			return $h->highlightSimple( $this->mText, $terms, $contextlines, $contextchars );
+		}
 	}
 
 	/**
@@ -863,10 +931,11 @@ class SearchResult {
 	 * @return String: timestamp
 	 */
 	function getTimestamp() {
-		if ( $this->mRevision )
+		if ( $this->mRevision ) {
 			return $this->mRevision->getTimestamp();
-		elseif ( $this->mImage )
+		} elseif ( $this->mImage ) {
 			return $this->mImage->getTimestamp();
+		}
 		return '';
 	}
 
@@ -952,8 +1021,9 @@ class SearchHighlighter {
 		global $wgSearchHighlightBoundaries;
 		$fname = __METHOD__;
 
-		if ( $text == '' )
+		if ( $text == '' ) {
 			return '';
+		}
 
 		// spli text into text + templates/links/tables
 		$spat = "/(\\{\\{)|(\\[\\[[^\\]:]+:)|(\n\\{\\|)";
@@ -984,8 +1054,9 @@ class SearchHighlighter {
 						if ( $key == 2 ) {
 							// see if this is an image link
 							$ns = substr( $val[0], 2, - 1 );
-							if ( $wgContLang->getNsIndex( $ns ) != NS_FILE )
+							if ( $wgContLang->getNsIndex( $ns ) != NS_FILE ) {
 								break;
+							}
 
 						}
 						$epat = $endPatterns[$key];
@@ -1006,7 +1077,7 @@ class SearchHighlighter {
 								$len = strlen( $endMatches[2][0] );
 								$off = $endMatches[2][1];
 								$this->splitAndAdd( $otherExt, $count,
-									substr( $text, $start, $off + $len  - $start ) );
+									substr( $text, $start, $off + $len - $start ) );
 								$start = $off + $len;
 								$found = true;
 								break;
@@ -1119,7 +1190,7 @@ class SearchHighlighter {
 			// if begin of the article contains the whole phrase, show only that !!
 			if ( array_key_exists( $first, $snippets ) && preg_match( $pat1, $snippets[$first] )
 				&& $offsets[$first] < $contextchars * 2 ) {
-				$snippets = array ( $first => $snippets[$first] );
+				$snippets = array( $first => $snippets[$first] );
 			}
 
 			// calc by how much to extend existing snippets
@@ -1155,17 +1226,19 @@ class SearchHighlighter {
 		$last = - 1;
 		$extract = '';
 		foreach ( $snippets as $index => $line ) {
-			if ( $last == - 1 )
+			if ( $last == - 1 ) {
 				$extract .= $line; // first line
-			elseif ( $last + 1 == $index && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] ) )
+			} elseif ( $last + 1 == $index && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] ) ) {
 				$extract .= " " . $line; // continous lines
-			else
+			} else {
 				$extract .= '<b> ... </b>' . $line;
+			}
 
 			$last = $index;
 		}
-		if ( $extract )
+		if ( $extract ) {
 			$extract .= '<b> ... </b>';
+		}
 
 		$processed = array();
 		foreach ( $terms as $term ) {
@@ -1193,8 +1266,9 @@ class SearchHighlighter {
 		$split = explode( "\n", $this->mCleanWikitext ? $this->removeWiki( $text ) : $text );
 		foreach ( $split as $line ) {
 			$tt = trim( $line );
-			if ( $tt )
+			if ( $tt ) {
 				$extracts[$count++] = $tt;
+			}
 		}
 	}
 
@@ -1268,8 +1342,9 @@ class SearchHighlighter {
 			while ( $char >= 0x80 && $char < 0xc0 ) {
 				// skip trailing bytes
 				$point++;
-				if ( $point >= strlen( $text ) )
+				if ( $point >= strlen( $text ) ) {
 					return strlen( $text );
+				}
 				$char = ord( $text[$point] );
 			}
 			return $point;
@@ -1289,24 +1364,28 @@ class SearchHighlighter {
 	 * @protected
 	 */
 	function process( $pattern, $extracts, &$linesleft, &$contextchars, &$out, &$offsets ) {
-		if ( $linesleft == 0 )
+		if ( $linesleft == 0 ) {
 			return; // nothing to do
+		}
 		foreach ( $extracts as $index => $line ) {
-			if ( array_key_exists( $index, $out ) )
+			if ( array_key_exists( $index, $out ) ) {
 				continue; // this line already highlighted
+			}
 
 			$m = array();
-			if ( !preg_match( $pattern, $line, $m, PREG_OFFSET_CAPTURE ) )
+			if ( !preg_match( $pattern, $line, $m, PREG_OFFSET_CAPTURE ) ) {
 				continue;
+			}
 
 			$offset = $m[0][1];
 			$len = strlen( $m[0][0] );
-			if ( $offset + $len < $contextchars )
+			if ( $offset + $len < $contextchars ) {
 				$begin = 0;
-			elseif ( $len > $contextchars )
+			} elseif ( $len > $contextchars ) {
 				$begin = $offset;
-			else
+			} else {
 				$begin = $offset + intval( ( $len - $contextchars ) / 2 );
+			}
 
 			$end = $begin + $contextchars;
 
@@ -1315,8 +1394,9 @@ class SearchHighlighter {
 			$out[$index] = $this->extract( $line, $begin, $end, $posBegin );
 			$offsets[$index] = $posBegin;
 			$linesleft--;
-			if ( $linesleft == 0 )
+			if ( $linesleft == 0 ) {
 				return;
+			}
 		}
 	}
 
@@ -1357,16 +1437,17 @@ class SearchHighlighter {
 	 */
 	function linkReplace( $matches ) {
 		$colon = strpos( $matches[1], ':' );
-		if ( $colon === false )
+		if ( $colon === false ) {
 			return $matches[2]; // replace with caption
+		}
 		global $wgContLang;
 		$ns = substr( $matches[1], 0, $colon );
 		$index = $wgContLang->getNsIndex( $ns );
-		if ( $index !== false && ( $index == NS_FILE || $index == NS_CATEGORY ) )
+		if ( $index !== false && ( $index == NS_FILE || $index == NS_CATEGORY ) ) {
 			return $matches[0]; // return the whole thing
-		else
+		} else {
 			return $matches[2];
-
+		}
 	}
 
 	/**
diff --git a/includes/search/SearchMssql.php b/includes/search/SearchMssql.php
index 163d9dc3..cbc1a7a7 100644
--- a/includes/search/SearchMssql.php
+++ b/includes/search/SearchMssql.php
@@ -170,8 +170,9 @@ class SearchMssql extends SearchEngine {
 
 				if ( !empty( $terms[3] ) ) {
 					$regexp = preg_quote( $terms[3], '/' );
-					if ( $terms[4] )
+					if ( $terms[4] ) {
 						$regexp .= "[0-9A-Za-z_]+";
+					}
 				} else {
 					$regexp = preg_quote( str_replace( '"', '', $terms[2] ), '/' );
 				}
@@ -247,8 +248,9 @@ class MssqlSearchResultSet extends SearchResultSet {
 
 	function next() {
 		$row = $this->mResultSet->fetchObject();
-		if ( $row === false )
+		if ( $row === false ) {
 			return false;
+		}
 		return new SearchResult( $row );
 	}
 }
diff --git a/includes/search/SearchMySQL.php b/includes/search/SearchMySQL.php
index 4a501fd0..b2bc1c26 100644
--- a/includes/search/SearchMySQL.php
+++ b/includes/search/SearchMySQL.php
@@ -57,12 +57,12 @@ class SearchMySQL extends SearchEngine {
 
 		# @todo FIXME: This doesn't handle parenthetical expressions.
 		$m = array();
-		if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
+		if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
 				$filteredText, $m, PREG_SET_ORDER ) ) {
-			foreach( $m as $bits ) {
+			foreach ( $m as $bits ) {
 				@list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
 
-				if( $nonQuoted != '' ) {
+				if ( $nonQuoted != '' ) {
 					$term = $nonQuoted;
 					$quote = '';
 				} else {
@@ -70,8 +70,10 @@ class SearchMySQL extends SearchEngine {
 					$quote = '"';
 				}
 
-				if( $searchon !== '' ) $searchon .= ' ';
-				if( $this->strictMatching && ($modifier == '') ) {
+				if ( $searchon !== '' ) {
+					$searchon .= ' ';
+				}
+				if ( $this->strictMatching && ( $modifier == '' ) ) {
 					// If we leave this out, boolean op defaults to OR which is rarely helpful.
 					$modifier = '+';
 				}
@@ -79,7 +81,7 @@ class SearchMySQL extends SearchEngine {
 				// Some languages such as Serbian store the input form in the search index,
 				// so we may need to search for matches in multiple writing system variants.
 				$convertedVariants = $wgContLang->autoConvertToAllVariants( $term );
-				if( is_array( $convertedVariants ) ) {
+				if ( is_array( $convertedVariants ) ) {
 					$variants = array_unique( array_values( $convertedVariants ) );
 				} else {
 					$variants = array( $term );
@@ -99,11 +101,12 @@ class SearchMySQL extends SearchEngine {
 				$strippedVariants = array_unique( $strippedVariants );
 
 				$searchon .= $modifier;
-				if( count( $strippedVariants) > 1 )
+				if ( count( $strippedVariants ) > 1 ) {
 					$searchon .= '(';
-				foreach( $strippedVariants as $stripped ) {
+				}
+				foreach ( $strippedVariants as $stripped ) {
 					$stripped = $this->normalizeText( $stripped );
-					if( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
+					if ( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
 						// Hack for Chinese: we need to toss in quotes for
 						// multiple-character phrases since normalizeForSearch()
 						// added spaces between them to make word breaks.
@@ -111,8 +114,9 @@ class SearchMySQL extends SearchEngine {
 					}
 					$searchon .= "$quote$stripped$quote$wildcard ";
 				}
-				if( count( $strippedVariants) > 1 )
+				if ( count( $strippedVariants ) > 1 ) {
 					$searchon .= ')';
+				}
 
 				// Match individual terms or quoted phrase in result highlighting...
 				// Note that variants will be introduced in a later stage for highlighting!
@@ -134,8 +138,8 @@ class SearchMySQL extends SearchEngine {
 		global $wgContLang;
 
 		$regex = preg_quote( $string, '/' );
-		if( $wgContLang->hasWordBreaks() ) {
-			if( $wildcard ) {
+		if ( $wgContLang->hasWordBreaks() ) {
+			if ( $wildcard ) {
 				// Don't cut off the final bit!
 				$regex = "\b$regex";
 			} else {
@@ -177,7 +181,9 @@ class SearchMySQL extends SearchEngine {
 		global $wgCountTotalSearchHits;
 
 		// This seems out of place, why is this called with empty term?
-		if ( trim( $term ) === '' ) return null;
+		if ( trim( $term ) === '' ) {
+			return null;
+		}
 
 		$filteredTerm = $this->filter( $term );
 		$query = $this->getQuery( $filteredTerm, $fulltext );
@@ -187,7 +193,7 @@ class SearchMySQL extends SearchEngine {
 		);
 
 		$total = null;
-		if( $wgCountTotalSearchHits ) {
+		if ( $wgCountTotalSearchHits ) {
 			$query = $this->getCountQuery( $filteredTerm, $fulltext );
 			$totalResult = $this->db->select(
 				$query['tables'], $query['fields'], $query['conds'],
@@ -195,7 +201,7 @@ class SearchMySQL extends SearchEngine {
 			);
 
 			$row = $totalResult->fetchObject();
-			if( $row ) {
+			if ( $row ) {
 				$total = intval( $row->c );
 			}
 			$totalResult->free();
@@ -205,12 +211,11 @@ class SearchMySQL extends SearchEngine {
 	}
 
 	public function supports( $feature ) {
-		switch( $feature ) {
-		case 'list-redirects':
+		switch ( $feature ) {
 		case 'title-suffix-filter':
 			return true;
 		default:
-			return false;
+			return parent::supports( $feature );
 		}
 	}
 
@@ -223,7 +228,7 @@ class SearchMySQL extends SearchEngine {
 		foreach ( $this->features as $feature => $value ) {
 			if ( $feature === 'list-redirects' && !$value ) {
 				$query['conds']['page_is_redirect'] = 0;
-			} elseif( $feature === 'title-suffix-filter' && $value ) {
+			} elseif ( $feature === 'title-suffix-filter' && $value ) {
 				$query['conds'][] = 'page_title' . $this->db->buildLike( $this->db->anyString(), $value );
 			}
 		}
@@ -358,11 +363,24 @@ class SearchMySQL extends SearchEngine {
 
 		$dbw->update( 'searchindex',
 			array( 'si_title' => $this->normalizeText( $title ) ),
-			array( 'si_page'  => $id ),
+			array( 'si_page' => $id ),
 			__METHOD__,
 			array( $dbw->lowPriorityOption() ) );
 	}
 
+	/**
+	 * Delete an indexed page
+	 * Title should be pre-processed.
+	 *
+	 * @param Integer $id Page id that was deleted
+	 * @param String $title Title of page that was deleted
+	 */
+	function delete( $id, $title ) {
+		$dbw = wfGetDB( DB_MASTER );
+
+		$dbw->delete( 'searchindex', array( 'si_page' => $id ), __METHOD__ );
+	}
+
 	/**
 	 * Converts some characters for MySQL's indexing to grok it correctly,
 	 * and pads short words to overcome limitations.
@@ -386,7 +404,7 @@ class SearchMySQL extends SearchEngine {
 		// ignores short words... Pad them so we can pass them
 		// through without reconfiguring the server...
 		$minLength = $this->minSearchLength();
-		if( $minLength > 1 ) {
+		if ( $minLength > 1 ) {
 			$n = $minLength - 1;
 			$out = preg_replace(
 				"/\b(\w{1,$n})\b/",
@@ -427,7 +445,7 @@ class SearchMySQL extends SearchEngine {
 	 * @return int
 	 */
 	protected function minSearchLength() {
-		if( is_null( self::$mMinSearchLength ) ) {
+		if ( is_null( self::$mMinSearchLength ) ) {
 			$sql = "SHOW GLOBAL VARIABLES LIKE 'ft\\_min\\_word\\_len'";
 
 			$dbr = wfGetDB( DB_SLAVE );
@@ -435,7 +453,7 @@ class SearchMySQL extends SearchEngine {
 			$row = $result->fetchObject();
 			$result->free();
 
-			if( $row && $row->Variable_name == 'ft_min_word_len' ) {
+			if ( $row && $row->Variable_name == 'ft_min_word_len' ) {
 				self::$mMinSearchLength = intval( $row->Value );
 			} else {
 				self::$mMinSearchLength = 0;
@@ -449,7 +467,7 @@ class SearchMySQL extends SearchEngine {
  * @ingroup Search
  */
 class MySQLSearchResultSet extends SqlSearchResultSet {
-	function __construct( $resultSet, $terms, $totalHits=null ) {
+	function __construct( $resultSet, $terms, $totalHits = null ) {
 		parent::__construct( $resultSet, $terms );
 		$this->mTotalHits = $totalHits;
 	}
diff --git a/includes/search/SearchOracle.php b/includes/search/SearchOracle.php
index b0ea97fe..a8479654 100644
--- a/includes/search/SearchOracle.php
+++ b/includes/search/SearchOracle.php
@@ -30,32 +30,34 @@
  */
 class SearchOracle extends SearchEngine {
 
-	private $reservedWords = array ('ABOUT' => 1,
-									'ACCUM' => 1,
-									'AND' => 1,
-									'BT' => 1,
-									'BTG' => 1,
-									'BTI' => 1,
-									'BTP' => 1,
-									'FUZZY' => 1,
-									'HASPATH' => 1,
-									'INPATH' => 1,
-									'MINUS' => 1,
-									'NEAR' => 1,
-									'NOT' => 1,
-									'NT' => 1,
-									'NTG' => 1,
-									'NTI' => 1,
-									'NTP' => 1,
-									'OR' => 1,
-									'PT' => 1,
-									'RT' => 1,
-									'SQE' => 1,
-									'SYN' => 1,
-									'TR' => 1,
-									'TRSYN' => 1,
-									'TT' => 1,
-									'WITHIN' => 1);
+	private $reservedWords = array(
+		'ABOUT' => 1,
+		'ACCUM' => 1,
+		'AND' => 1,
+		'BT' => 1,
+		'BTG' => 1,
+		'BTI' => 1,
+		'BTP' => 1,
+		'FUZZY' => 1,
+		'HASPATH' => 1,
+		'INPATH' => 1,
+		'MINUS' => 1,
+		'NEAR' => 1,
+		'NOT' => 1,
+		'NT' => 1,
+		'NTG' => 1,
+		'NTI' => 1,
+		'NTP' => 1,
+		'OR' => 1,
+		'PT' => 1,
+		'RT' => 1,
+		'SQE' => 1,
+		'SYN' => 1,
+		'TR' => 1,
+		'TRSYN' => 1,
+		'TT' => 1,
+		'WITHIN' => 1,
+	);
 
 	/**
 	 * Creates an instance of this class
@@ -72,8 +74,9 @@ class SearchOracle extends SearchEngine {
 	 * @return SqlSearchResultSet
 	 */
 	function searchText( $term ) {
-		if ( $term == '' )
+		if ( $term == '' ) {
 			return new SqlSearchResultSet( false, '' );
+		}
 
 		$resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), true ) ) );
 		return new SqlSearchResultSet( $resultSet, $this->searchTerms );
@@ -86,8 +89,9 @@ class SearchOracle extends SearchEngine {
 	 * @return SqlSearchResultSet
 	 */
 	function searchTitle( $term ) {
-		if ( $term == '' )
+		if ( $term == '' ) {
 			return new SqlSearchResultSet( false, '' );
+		}
 
 		$resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), false ) ) );
 		return new MySQLSearchResultSet( $resultSet, $this->searchTerms );
@@ -110,8 +114,9 @@ class SearchOracle extends SearchEngine {
 	 * @return String
 	 */
 	function queryNamespaces() {
-		if( is_null( $this->namespaces ) )
+		if ( is_null( $this->namespaces ) ) {
 			return '';
+		}
 		if ( !count( $this->namespaces ) ) {
 			$namespaces = '0';
 		} else {
@@ -195,23 +200,24 @@ class SearchOracle extends SearchEngine {
 		$searchon = '';
 		if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
 				$filteredText, $m, PREG_SET_ORDER ) ) {
-			foreach( $m as $terms ) {
+			foreach ( $m as $terms ) {
 				// Search terms in all variant forms, only
 				// apply on wiki with LanguageConverter
 				$temp_terms = $wgContLang->autoConvertToAllVariants( $terms[2] );
-				if( is_array( $temp_terms )) {
-					$temp_terms = array_unique( array_values( $temp_terms ));
-					foreach( $temp_terms as $t ) {
-						$searchon .= ($terms[1] == '-' ? ' ~' : ' & ') . $this->escapeTerm( $t );
+				if ( is_array( $temp_terms ) ) {
+					$temp_terms = array_unique( array_values( $temp_terms ) );
+					foreach ( $temp_terms as $t ) {
+						$searchon .= ( $terms[1] == '-' ? ' ~' : ' & ' ) . $this->escapeTerm( $t );
 					}
 				}
 				else {
-					$searchon .= ($terms[1] == '-' ? ' ~' : ' & ') . $this->escapeTerm( $terms[2] );
+					$searchon .= ( $terms[1] == '-' ? ' ~' : ' & ' ) . $this->escapeTerm( $terms[2] );
 				}
 				if ( !empty( $terms[3] ) ) {
 					$regexp = preg_quote( $terms[3], '/' );
-					if ( $terms[4] )
+					if ( $terms[4] ) {
 						$regexp .= "[0-9A-Za-z_]+";
+					}
 				} else {
 					$regexp = preg_quote( str_replace( '"', '', $terms[2] ), '/' );
 				}
@@ -227,9 +233,9 @@ class SearchOracle extends SearchEngine {
 	private function escapeTerm( $t ) {
 		global $wgContLang;
 		$t = $wgContLang->normalizeForSearch( $t );
-		$t = isset( $this->reservedWords[strtoupper( $t )] ) ? '{'.$t.'}' : $t;
-		$t = preg_replace('/^"(.*)"$/', '($1)', $t);
-		$t = preg_replace('/([-&|])/', '\\\\$1', $t);
+		$t = isset( $this->reservedWords[strtoupper( $t )] ) ? '{' . $t . '}' : $t;
+		$t = preg_replace( '/^"(.*)"$/', '($1)', $t );
+		$t = preg_replace( '/([-&|])/', '\\\\$1', $t );
 		return $t;
 	}
 	/**
@@ -273,7 +279,7 @@ class SearchOracle extends SearchEngine {
 
 		$dbw->update( 'searchindex',
 			array( 'si_title' => $title ),
-			array( 'si_page'  => $id ),
+			array( 'si_page' => $id ),
 			'SearchOracle::updateTitle',
 			array() );
 	}
diff --git a/includes/search/SearchPostgres.php b/includes/search/SearchPostgres.php
index 56464e98..7f19ed13 100644
--- a/includes/search/SearchPostgres.php
+++ b/includes/search/SearchPostgres.php
@@ -64,7 +64,7 @@ class SearchPostgres extends SearchEngine {
 
 	function searchText( $term ) {
 		$q = $this->searchQuery( $term, 'textvector', 'old_text' );
-		$olderror = error_reporting(E_ERROR);
+		$olderror = error_reporting( E_ERROR );
 		$resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) );
 		error_reporting( $olderror );
 		if ( !$resultSet ) {
@@ -86,19 +86,19 @@ class SearchPostgres extends SearchEngine {
 		wfDebug( "parseQuery received: $term \n" );
 
 		## No backslashes allowed
-		$term = preg_replace('/\\\/', '', $term);
+		$term = preg_replace( '/\\\/', '', $term );
 
 		## Collapse parens into nearby words:
-		$term = preg_replace('/\s*\(\s*/', ' (', $term);
-		$term = preg_replace('/\s*\)\s*/', ') ', $term);
+		$term = preg_replace( '/\s*\(\s*/', ' (', $term );
+		$term = preg_replace( '/\s*\)\s*/', ') ', $term );
 
 		## Treat colons as word separators:
-		$term = preg_replace('/:/', ' ', $term);
+		$term = preg_replace( '/:/', ' ', $term );
 
 		$searchstring = '';
 		$m = array();
-		if( preg_match_all('/([-!]?)(\S+)\s*/', $term, $m, PREG_SET_ORDER ) ) {
-			foreach( $m as $terms ) {
+		if ( preg_match_all( '/([-!]?)(\S+)\s*/', $term, $m, PREG_SET_ORDER ) ) {
+			foreach ( $m as $terms ) {
 				if ( strlen( $terms[1] ) ) {
 					$searchstring .= ' & !';
 				}
@@ -118,19 +118,19 @@ class SearchPostgres extends SearchEngine {
 		}
 
 		## Strip out leading junk
-		$searchstring = preg_replace('/^[\s\&\|]+/', '', $searchstring);
+		$searchstring = preg_replace( '/^[\s\&\|]+/', '', $searchstring );
 
 		## Remove any doubled-up operators
-		$searchstring = preg_replace('/([\!\&\|]) +(?:[\&\|] +)+/', "$1 ", $searchstring);
+		$searchstring = preg_replace( '/([\!\&\|]) +(?:[\&\|] +)+/', "$1 ", $searchstring );
 
 		## Remove any non-spaced operators (e.g. "Zounds!")
-		$searchstring = preg_replace('/([^ ])[\!\&\|]/', "$1", $searchstring);
+		$searchstring = preg_replace( '/([^ ])[\!\&\|]/', "$1", $searchstring );
 
 		## Remove any trailing whitespace or operators
-		$searchstring = preg_replace('/[\s\!\&\|]+$/', '', $searchstring);
+		$searchstring = preg_replace( '/[\s\!\&\|]+$/', '', $searchstring );
 
 		## Remove unnecessary quotes around everything
-		$searchstring = preg_replace('/^[\'"](.*)[\'"]$/', "$1", $searchstring);
+		$searchstring = preg_replace( '/^[\'"](.*)[\'"]$/', "$1", $searchstring );
 
 		## Quote the whole thing
 		$searchstring = $this->db->addQuotes( $searchstring );
@@ -163,30 +163,31 @@ class SearchPostgres extends SearchEngine {
 		$top = $top[0];
 
 		if ( $top === "" ) { ## e.g. if only stopwords are used XXX return something better
-			$query = "SELECT page_id, page_namespace, page_title, 0 AS score ".
+			$query = "SELECT page_id, page_namespace, page_title, 0 AS score " .
 				"FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
 				"AND r.rev_text_id = c.old_id AND 1=0";
 		}
 		else {
 			$m = array();
-			if( preg_match_all("/'([^']+)'/", $top, $m, PREG_SET_ORDER ) ) {
-				foreach( $m as $terms ) {
+			if ( preg_match_all( "/'([^']+)'/", $top, $m, PREG_SET_ORDER ) ) {
+				foreach ( $m as $terms ) {
 					$this->searchTerms[$terms[1]] = $terms[1];
 				}
 			}
 
-			$query = "SELECT page_id, page_namespace, page_title, ".
-			"ts_rank($fulltext, to_tsquery($searchstring), 5) AS score ".
+			$query = "SELECT page_id, page_namespace, page_title, " .
+			"ts_rank($fulltext, to_tsquery($searchstring), 5) AS score " .
 			"FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
 			"AND r.rev_text_id = c.old_id AND $fulltext @@ to_tsquery($searchstring)";
 		}
 
 		## Redirects
-		if ( !$this->showRedirects )
+		if ( !$this->showRedirects ) {
 			$query .= ' AND page_is_redirect = 0';
+		}
 
 		## Namespaces - defaults to 0
-		if( !is_null( $this->namespaces ) ) { // null -> search all
+		if ( !is_null( $this->namespaces ) ) { // null -> search all
 			if ( count( $this->namespaces ) < 1 ) {
 				$query .= ' AND page_namespace = 0';
 			} else {
@@ -208,7 +209,7 @@ class SearchPostgres extends SearchEngine {
 
 	function update( $pageid, $title, $text ) {
 		## We don't want to index older revisions
-		$SQL = "UPDATE pagecontent SET textvector = NULL WHERE old_id IN ".
+		$SQL = "UPDATE pagecontent SET textvector = NULL WHERE old_id IN " .
 				"(SELECT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) .
 				" ORDER BY rev_text_id DESC OFFSET 1)";
 		$this->db->query( $SQL );
@@ -244,7 +245,7 @@ class PostgresSearchResultSet extends SqlSearchResultSet {
 
 	function next() {
 		$row = $this->mResultSet->fetchObject();
-		if( $row === false ) {
+		if ( $row === false ) {
 			return false;
 		} else {
 			return new PostgresSearchResult( $row );
diff --git a/includes/search/SearchSqlite.php b/includes/search/SearchSqlite.php
index f3f4788c..554181f6 100644
--- a/includes/search/SearchSqlite.php
+++ b/includes/search/SearchSqlite.php
@@ -61,12 +61,12 @@ class SearchSqlite extends SearchEngine {
 		$this->searchTerms = array();
 
 		$m = array();
-		if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
+		if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
 				$filteredText, $m, PREG_SET_ORDER ) ) {
-			foreach( $m as $bits ) {
+			foreach ( $m as $bits ) {
 				@list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
 
-				if( $nonQuoted != '' ) {
+				if ( $nonQuoted != '' ) {
 					$term = $nonQuoted;
 					$quote = '';
 				} else {
@@ -74,14 +74,14 @@ class SearchSqlite extends SearchEngine {
 					$quote = '"';
 				}
 
-				if( $searchon !== '' ) {
+				if ( $searchon !== '' ) {
 					$searchon .= ' ';
 				}
 
 				// Some languages such as Serbian store the input form in the search index,
 				// so we may need to search for matches in multiple writing system variants.
 				$convertedVariants = $wgContLang->autoConvertToAllVariants( $term );
-				if( is_array( $convertedVariants ) ) {
+				if ( is_array( $convertedVariants ) ) {
 					$variants = array_unique( array_values( $convertedVariants ) );
 				} else {
 					$variants = array( $term );
@@ -101,10 +101,11 @@ class SearchSqlite extends SearchEngine {
 				$strippedVariants = array_unique( $strippedVariants );
 
 				$searchon .= $modifier;
-				if( count( $strippedVariants) > 1 )
+				if ( count( $strippedVariants ) > 1 ) {
 					$searchon .= '(';
-				foreach( $strippedVariants as $stripped ) {
-					if( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
+				}
+				foreach ( $strippedVariants as $stripped ) {
+					if ( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
 						// Hack for Chinese: we need to toss in quotes for
 						// multiple-character phrases since normalizeForSearch()
 						// added spaces between them to make word breaks.
@@ -112,8 +113,9 @@ class SearchSqlite extends SearchEngine {
 					}
 					$searchon .= "$quote$stripped$quote$wildcard ";
 				}
-				if( count( $strippedVariants) > 1 )
+				if ( count( $strippedVariants ) > 1 ) {
 					$searchon .= ')';
+				}
 
 				// Match individual terms or quoted phrase in result highlighting...
 				// Note that variants will be introduced in a later stage for highlighting!
@@ -134,8 +136,8 @@ class SearchSqlite extends SearchEngine {
 		global $wgContLang;
 
 		$regex = preg_quote( $string, '/' );
-		if( $wgContLang->hasWordBreaks() ) {
-			if( $wildcard ) {
+		if ( $wgContLang->hasWordBreaks() ) {
+			if ( $wildcard ) {
 				// Don't cut off the final bit!
 				$regex = "\b$regex";
 			} else {
@@ -184,10 +186,10 @@ class SearchSqlite extends SearchEngine {
 		$resultSet = $this->db->query( $this->getQuery( $filteredTerm, $fulltext ) );
 
 		$total = null;
-		if( $wgCountTotalSearchHits ) {
+		if ( $wgCountTotalSearchHits ) {
 			$totalResult = $this->db->query( $this->getCountQuery( $filteredTerm, $fulltext ) );
 			$row = $totalResult->fetchObject();
-			if( $row ) {
+			if ( $row ) {
 				$total = intval( $row->c );
 			}
 			$totalResult->free();
@@ -201,7 +203,7 @@ class SearchSqlite extends SearchEngine {
 	 * @return String
 	 */
 	function queryRedirect() {
-		if( $this->showRedirects ) {
+		if ( $this->showRedirects ) {
 			return '';
 		} else {
 			return 'AND page_is_redirect=0';
@@ -213,8 +215,9 @@ class SearchSqlite extends SearchEngine {
 	 * @return String
 	 */
 	function queryNamespaces() {
-		if( is_null( $this->namespaces ) )
+		if ( is_null( $this->namespaces ) ) {
 			return '';  # search all
+		}
 		if ( !count( $this->namespaces ) ) {
 			$namespaces = '0';
 		} else {
@@ -295,7 +298,7 @@ class SearchSqlite extends SearchEngine {
 		if ( !$this->fulltextSearchSupported() ) {
 			return;
 		}
-		// @todo: find a method to do it in a single request,
+		// @todo find a method to do it in a single request,
 		// couldn't do it so far due to typelessness of FTS3 tables.
 		$dbw = wfGetDB( DB_MASTER );
 
@@ -324,7 +327,7 @@ class SearchSqlite extends SearchEngine {
 
 		$dbw->update( 'searchindex',
 			array( 'si_title' => $title ),
-			array( 'rowid'  => $id ),
+			array( 'rowid' => $id ),
 			__METHOD__ );
 	}
 }
@@ -333,7 +336,7 @@ class SearchSqlite extends SearchEngine {
  * @ingroup Search
  */
 class SqliteSearchResultSet extends SqlSearchResultSet {
-	function __construct( $resultSet, $terms, $totalHits=null ) {
+	function __construct( $resultSet, $terms, $totalHits = null ) {
 		parent::__construct( $resultSet, $terms );
 		$this->mTotalHits = $totalHits;
 	}
diff --git a/includes/search/SearchUpdate.php b/includes/search/SearchUpdate.php
index eabcda3e..82a413e9 100644
--- a/includes/search/SearchUpdate.php
+++ b/includes/search/SearchUpdate.php
@@ -29,51 +29,108 @@
  * @ingroup Search
  */
 class SearchUpdate implements DeferrableUpdate {
-
-	private $mId = 0, $mNamespace, $mTitle, $mText;
-	private $mTitleWords;
-
-	function __construct( $id, $title, $text = false ) {
+	/**
+	 * Page id being updated
+	 * @var int
+	 */
+	private $id = 0;
+
+	/**
+	 * Title we're updating
+	 * @var Title
+	 */
+	private $title;
+
+	/**
+	 * Content of the page (not text)
+	 * @var Content|false
+	 */
+	private $content;
+
+	/**
+	 * Constructor
+	 *
+	 * @param int $id Page id to update
+	 * @param Title|string $title Title of page to update
+	 * @param Content|string|false $c Content of the page to update.
+	 *  If a Content object, text will be gotten from it. String is for back-compat.
+	 *  Passing false tells the backend to just update the title, not the content
+	 */
+	public function __construct( $id, $title, $c = false ) {
 		if ( is_string( $title ) ) {
 			$nt = Title::newFromText( $title );
 		} else {
 			$nt = $title;
 		}
 
-		if( $nt ) {
-			$this->mId = $id;
-			$this->mText = $text;
-
-			$this->mNamespace = $nt->getNamespace();
-			$this->mTitle = $nt->getText(); # Discard namespace
-
-			$this->mTitleWords = $this->mTextWords = array();
+		if ( $nt ) {
+			$this->id = $id;
+			// is_string() check is back-compat for ApprovedRevs
+			if ( is_string( $c ) ) {
+				$this->content = new TextContent( $c );
+			} else {
+				$this->content = $c ?: false;
+			}
+			$this->title = $nt;
 		} else {
 			wfDebug( "SearchUpdate object created with invalid title '$title'\n" );
 		}
 	}
 
-	function doUpdate() {
-		global $wgContLang, $wgDisableSearchUpdate;
+	/**
+	 * Perform actual update for the entry
+	 */
+	public function doUpdate() {
+		global $wgDisableSearchUpdate;
 
-		if( $wgDisableSearchUpdate || !$this->mId ) {
+		if ( $wgDisableSearchUpdate || !$this->id ) {
 			return;
 		}
 
 		wfProfileIn( __METHOD__ );
 
-		$search = SearchEngine::create();
-		$lc = SearchEngine::legalSearchChars() . '&#;';
+		$page = WikiPage::newFromId( $this->id, WikiPage::READ_LATEST );
+		$indexTitle = Title::indexTitle( $this->title->getNamespace(), $this->title->getText() );
 
-		if( $this->mText === false ) {
-			$search->updateTitle($this->mId,
-				$search->normalizeText( Title::indexTitle( $this->mNamespace, $this->mTitle ) ) );
-			wfProfileOut( __METHOD__ );
-			return;
+		foreach ( SearchEngine::getSearchTypes() as $type ) {
+			$search = SearchEngine::create( $type );
+			if ( !$search->supports( 'search-update' ) ) {
+				continue;
+			}
+
+			$normalTitle = $search->normalizeText( $indexTitle );
+
+			if ( $page === null ) {
+				$search->delete( $this->id, $normalTitle );
+				continue;
+			} elseif ( $this->content === false ) {
+				$search->updateTitle( $this->id, $normalTitle );
+				continue;
+			}
+
+			$text = $search->getTextFromContent( $this->title, $this->content );
+			if ( !$search->textAlreadyUpdatedForIndex() ) {
+				$text = self::updateText( $text );
+			}
+
+			# Perform the actual update
+			$search->update( $this->id, $normalTitle, $search->normalizeText( $text ) );
 		}
 
+		wfProfileOut( __METHOD__ );
+	}
+
+	/**
+	 * Clean text for indexing. Only really suitable for indexing in databases.
+	 * If you're using a real search engine, you'll probably want to override
+	 * this behavior and do something nicer with the original wikitext.
+	 */
+	public static function updateText( $text ) {
+		global $wgContLang;
+
 		# Language-specific strip/conversion
-		$text = $wgContLang->normalizeForSearch( $this->mText );
+		$text = $wgContLang->normalizeForSearch( $text );
+		$lc = SearchEngine::legalSearchChars() . '&#;';
 
 		wfProfileIn( __METHOD__ . '-regexps' );
 		$text = preg_replace( "/<\\/?\\s*[A-Za-z][^>]*?>/",
@@ -123,22 +180,6 @@ class SearchUpdate implements DeferrableUpdate {
 		# Strip wiki '' and '''
 		$text = preg_replace( "/''[']*/", " ", $text );
 		wfProfileOut( __METHOD__ . '-regexps' );
-
-		wfRunHooks( 'SearchUpdate', array( $this->mId, $this->mNamespace, $this->mTitle, &$text ) );
-
-		# Perform the actual update
-		$search->update( $this->mId, $search->normalizeText( Title::indexTitle( $this->mNamespace, $this->mTitle ) ),
-				$search->normalizeText( $text ) );
-
-		wfProfileOut( __METHOD__ );
+		return $text;
 	}
 }
-
-/**
- * Placeholder class
- *
- * @ingroup Search
- */
-class SearchUpdateMyISAM extends SearchUpdate {
-	# Inherits everything
-}
diff --git a/includes/site/MediaWikiSite.php b/includes/site/MediaWikiSite.php
index 05092723..f3b8a0c7 100644
--- a/includes/site/MediaWikiSite.php
+++ b/includes/site/MediaWikiSite.php
@@ -123,17 +123,17 @@ class MediaWikiSite extends Site {
 				'converttitles' => true,
 				'format' => 'json',
 				'titles' => $pageName,
-				//@todo: options for maxlag and maxage
+				// @todo options for maxlag and maxage
 				// Note that maxlag will lead to a long delay before a reply is made,
 				// but that maxage can avoid the extreme delay. On the other hand
 				// maxage could be nice to use anyhow as it stops unnecessary requests.
 				// Also consider smaxage if maxage is used.
 			);
 
-			$url = $this->getFileUrl( 'api.php' ) . '?' . wfArrayToCgi( $args );
+			$url = wfAppendQuery( $this->getFileUrl( 'api.php' ), $args );
 
 			// Go on call the external site
-			//@todo: we need a good way to specify a timeout here.
+			// @todo we need a good way to specify a timeout here.
 			$ret = Http::get( $url );
 		}
 
@@ -185,7 +185,7 @@ class MediaWikiSite extends Site {
 		// the single page in the "pages" substructure.
 		if ( isset( $externalData['query']['pages'] ) ) {
 			$pages = array_values( $externalData['query']['pages'] );
-			if ( count( $pages) === 1 ) {
+			if ( count( $pages ) === 1 ) {
 				return $pages[0];
 			}
 		}
diff --git a/includes/site/SiteSQLStore.php b/includes/site/SiteSQLStore.php
index 41238055..11141e07 100644
--- a/includes/site/SiteSQLStore.php
+++ b/includes/site/SiteSQLStore.php
@@ -188,6 +188,39 @@ class SiteSQLStore implements SiteStore {
 		return $site;
 	}
 
+	/**
+	 * Get a new ORMRow from a Site object
+	 *
+	 * @since 1.22
+	 *
+	 * @param Site
+	 *
+	 * @return ORMRow
+	 */
+	protected function getRowFromSite( Site $site ) {
+		$fields = array(
+			// Site data
+			'global_key' => $site->getGlobalId(), // TODO: check not null
+			'type' => $site->getType(),
+			'group' => $site->getGroup(),
+			'source' => $site->getSource(),
+			'language' => $site->getLanguageCode() === null ? '' : $site->getLanguageCode(),
+			'protocol' => $site->getProtocol(),
+			'domain' => strrev( $site->getDomain() ) . '.',
+			'data' => $site->getExtraData(),
+
+			// Site config
+			'forward' => $site->shouldForward(),
+			'config' => $site->getExtraConfig(),
+		);
+
+		if ( $site->getInternalId() !== null ) {
+			$fields['id'] = $site->getInternalId();
+		}
+
+		return new ORMRow( $this->sitesTable, $fields );
+	}
+
 	/**
 	 * Fetches the site from the database and loads them into the sites field.
 	 *
@@ -291,28 +324,11 @@ class SiteSQLStore implements SiteStore {
 		$localIds = array();
 
 		foreach ( $sites as $site ) {
-			$fields = array(
-				// Site data
-				'global_key' => $site->getGlobalId(), // TODO: check not null
-				'type' => $site->getType(),
-				'group' => $site->getGroup(),
-				'source' => $site->getSource(),
-				'language' => $site->getLanguageCode() === null ? '' : $site->getLanguageCode(),
-				'protocol' => $site->getProtocol(),
-				'domain' => strrev( $site->getDomain() ) . '.',
-				'data' => $site->getExtraData(),
-
-				// Site config
-				'forward' => $site->shouldForward(),
-				'config' => $site->getExtraConfig(),
-			);
-
 			if ( $site->getInternalId() !== null ) {
-				$fields['id'] = $site->getInternalId();
 				$internalIds[] = $site->getInternalId();
 			}
 
-			$siteRow = new ORMRow( $this->sitesTable, $fields );
+			$siteRow = $this->getRowFromSite( $site );
 			$success = $siteRow->save( __METHOD__ ) && $success;
 
 			foreach ( $site->getLocalIds() as $idType => $ids ) {
diff --git a/includes/specials/SpecialActiveusers.php b/includes/specials/SpecialActiveusers.php
index c9c82ada..705dab55 100644
--- a/includes/specials/SpecialActiveusers.php
+++ b/includes/specials/SpecialActiveusers.php
@@ -62,7 +62,7 @@ class ActiveUsersPager extends UsersPager {
 		$this->requestedUser = '';
 		if ( $un != '' ) {
 			$username = Title::makeTitleSafe( NS_USER, $un );
-			if( !is_null( $username ) ) {
+			if ( !is_null( $username ) ) {
 				$this->requestedUser = $username->getText();
 			}
 		}
@@ -91,42 +91,62 @@ class ActiveUsersPager extends UsersPager {
 	}
 
 	function getQueryInfo() {
-		$dbr = wfGetDB( DB_SLAVE );
+		$dbr = $this->getDatabase();
+
 		$conds = array( 'rc_user > 0' ); // Users - no anons
-		if( !$this->getUser()->isAllowed( 'hideuser' ) ) {
-			$conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0'; // don't show hidden names
-		}
 		$conds[] = 'rc_log_type IS NULL OR rc_log_type != ' . $dbr->addQuotes( 'newusers' );
 		$conds[] = 'rc_timestamp >= ' . $dbr->addQuotes(
-			$dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge*24*3600 ) );
+			$dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge * 24 * 3600 ) );
 
-		if( $this->requestedUser != '' ) {
+		if ( $this->requestedUser != '' ) {
 			$conds[] = 'rc_user_text >= ' . $dbr->addQuotes( $this->requestedUser );
 		}
 
+		if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+			$conds[] = 'NOT EXISTS (' . $dbr->selectSQLText(
+				'ipblocks', '1', array( 'rc_user=ipb_user', 'ipb_deleted' => 1 )
+			) . ')';
+		}
+
 		return array(
-			'tables' => array( 'recentchanges', 'ipblocks' ),
+			'tables' => array( 'recentchanges' ),
 			'fields' => array(
 				'user_name' => 'rc_user_text', // for Pager inheritance
 				'rc_user_text', // for Pager
-				'user_id' => 'rc_user',
-				'recentedits' => 'COUNT(*)',
-				'ipb_deleted' => 'MAX(ipb_deleted)'
+				'user_id' => 'MAX(rc_user)', // Postgres
+				'recentedits' => 'COUNT(*)'
 			),
 			'options' => array(
-				'GROUP BY' => array( 'rc_user_text', 'user_id' ),
+				'GROUP BY' => array( 'rc_user_text' ),
 				'USE INDEX' => array( 'recentchanges' => 'rc_user_text' )
 			),
-			'join_conds' => array( // check for suppression blocks
-				'ipblocks' => array( 'LEFT JOIN', array(
-					'rc_user=ipb_user',
-					'ipb_auto' => 0 # avoid duplicate blocks
-				)),
-			),
 			'conds' => $conds
 		);
 	}
 
+	function doBatchLookups() {
+		$uids = array();
+		foreach ( $this->mResult as $row ) {
+			$uids[] = $row->user_id;
+		}
+		// Fetch the block status of the user for showing "(blocked)" text and for
+		// striking out names of suppressed users when privileged user views the list.
+		// Although the first query already hits the block table for un-privileged, this
+		// is done in two queries to avoid huge quicksorts and to make COUNT(*) correct.
+		$dbr = $this->getDatabase();
+		$res = $dbr->select( 'ipblocks',
+			array( 'ipb_user', 'MAX(ipb_deleted) AS block_status' ),
+			array( 'ipb_user' => $uids ),
+			__METHOD__,
+			array( 'GROUP BY' => array( 'ipb_user' ) )
+		);
+		$this->blockStatusByUid = array();
+		foreach ( $res as $row ) {
+			$this->blockStatusByUid[$row->ipb_user] = $row->block_status; // 0 or 1
+		}
+		$this->mResult->seek( 0 );
+	}
+
 	function formatRow( $row ) {
 		$userName = $row->user_name;
 
@@ -139,7 +159,7 @@ class ActiveUsersPager extends UsersPager {
 		$user = User::newFromId( $row->user_id );
 
 		// User right filter
-		foreach( $this->hideRights as $right ) {
+		foreach ( $this->hideRights as $right ) {
 			// Calling User::getRights() within the loop so that
 			// if the hideRights() filter is empty, we don't have to
 			// trigger the lazy-init of the big userrights array in the
@@ -153,7 +173,7 @@ class ActiveUsersPager extends UsersPager {
 		// Note: This is a different loop than for user rights,
 		// because we're reusing it to build the group links
 		// at the same time
-		foreach( $user->getGroups() as $group ) {
+		foreach ( $user->getGroups() as $group ) {
 			if ( in_array( $group, $this->hideGroups ) ) {
 				return '';
 			}
@@ -163,12 +183,14 @@ class ActiveUsersPager extends UsersPager {
 		$groups = $lang->commaList( $list );
 
 		$item = $lang->specialList( $ulinks, $groups );
-		if( $row->ipb_deleted ) {
+
+		$isBlocked = isset( $this->blockStatusByUid[$row->user_id] );
+		if ( $isBlocked && $this->blockStatusByUid[$row->user_id] == 1 ) {
 			$item = "<span class=\"deleted\">$item</span>";
 		}
 		$count = $this->msg( 'activeusers-count' )->numParams( $row->recentedits )
 			->params( $userName )->numParams( $this->RCMaxAge )->escaped();
-		$blocked = !is_null( $row->ipb_deleted ) ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
+		$blocked = $isBlocked ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
 
 		return Html::rawElement( 'li', array(), "{$item} [{$count}]{$blocked}" );
 	}
@@ -184,15 +206,15 @@ class ActiveUsersPager extends UsersPager {
 		$out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n";
 
 		$out .= Xml::inputLabel( $this->msg( 'activeusers-from' )->text(),
-			'username', 'offset', 20, $this->requestedUser ) . '<br />';# Username field
+			'username', 'offset', 20, $this->requestedUser, array( 'tabindex' => 1 ) ) . '<br />';# Username field
 
 		$out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(),
-			'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ) );
+			'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ), array( 'tabindex' => 2 ) );
 
 		$out .= Xml::checkLabel( $this->msg( 'activeusers-hidesysops' )->text(),
-			'hidesysops', 'hidesysops', $this->opts->getValue( 'hidesysops' ) ) . '<br />';
+			'hidesysops', 'hidesysops', $this->opts->getValue( 'hidesysops' ), array( 'tabindex' => 3 ) ) . '<br />';
 
-		$out .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n";# Submit button and form bottom
+		$out .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text(), array( 'tabindex' => 4 ) ) . "\n";# Submit button and form bottom
 		$out .= Xml::closeElement( 'fieldset' );
 		$out .= Xml::closeElement( 'form' );
 
diff --git a/includes/specials/SpecialAllmessages.php b/includes/specials/SpecialAllmessages.php
index a60c8efe..35d6a0c0 100644
--- a/includes/specials/SpecialAllmessages.php
+++ b/includes/specials/SpecialAllmessages.php
@@ -28,7 +28,6 @@
  * @ingroup SpecialPage
  */
 class SpecialAllmessages extends SpecialPage {
-
 	/**
 	 * @var AllmessagesTablePager
 	 */
@@ -53,8 +52,9 @@ class SpecialAllmessages extends SpecialPage {
 		$this->setHeaders();
 
 		global $wgUseDatabaseMessages;
-		if( !$wgUseDatabaseMessages ) {
+		if ( !$wgUseDatabaseMessages ) {
 			$out->addWikiMsg( 'allmessagesnotsupportedDB' );
+
 			return;
 		} else {
 			$this->outputHeader( 'allmessagestext' );
@@ -74,7 +74,6 @@ class SpecialAllmessages extends SpecialPage {
 			$this->table->getNavigationBar() .
 			$this->table->getBody() .
 			$this->table->getNavigationBar() );
-
 	}
 
 	protected function getGroupName() {
@@ -87,7 +86,6 @@ class SpecialAllmessages extends SpecialPage {
  * getting data from a table when in fact not all of it comes from the database.
  */
 class AllmessagesTablePager extends TablePager {
-
 	protected $filter, $prefix, $langcode, $displayPrefix;
 
 	public $mLimitsShown;
@@ -121,15 +119,15 @@ class AllmessagesTablePager extends TablePager {
 		$request = $this->getRequest();
 
 		$this->filter = $request->getVal( 'filter', 'all' );
-		if( $this->filter === 'all' ) {
+		if ( $this->filter === 'all' ) {
 			$this->custom = null; // So won't match in either case
 		} else {
-			$this->custom = ($this->filter == 'unmodified');
+			$this->custom = ( $this->filter == 'unmodified' );
 		}
 
 		$prefix = $this->getLanguage()->ucfirst( $request->getVal( 'prefix', '' ) );
 		$prefix = $prefix != '' ? Title::makeTitleSafe( NS_MEDIAWIKI, $request->getVal( 'prefix', null ) ) : null;
-		if( $prefix !== null ) {
+		if ( $prefix !== null ) {
 			$this->displayPrefix = $prefix->getDBkey();
 			$this->prefix = '/^' . preg_quote( $this->displayPrefix ) . '/i';
 		} else {
@@ -139,7 +137,7 @@ class AllmessagesTablePager extends TablePager {
 
 		// The suffix that may be needed for message names if we're in a
 		// different language (eg [[MediaWiki:Foo/fr]]: $suffix = '/fr'
-		if( $this->foreign ) {
+		if ( $this->foreign ) {
 			$this->suffix = '/' . $this->langcode;
 		} else {
 			$this->suffix = '';
@@ -159,36 +157,36 @@ class AllmessagesTablePager extends TablePager {
 			Xml::openElement( 'table', array( 'class' => 'mw-allmessages-table' ) ) . "\n" .
 			'<tr>
 				<td class="mw-label">' .
-					Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) .
-				"</td>\n
-				<td class=\"mw-input\">" .
-					Xml::input( 'prefix', 20, str_replace( '_', ' ', $this->displayPrefix ), array( 'id' => 'mw-allmessages-form-prefix' ) ) .
-				"</td>\n
+			Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) .
+			"</td>\n
+			<td class=\"mw-input\">" .
+			Xml::input( 'prefix', 20, str_replace( '_', ' ', $this->displayPrefix ), array( 'id' => 'mw-allmessages-form-prefix' ) ) .
+			"</td>\n
 			</tr>
 			<tr>\n
-				<td class='mw-label'>" .
-					$this->msg( 'allmessages-filter' )->escaped() .
-				"</td>\n
+			<td class='mw-label'>" .
+			$this->msg( 'allmessages-filter' )->escaped() .
+			"</td>\n
 				<td class='mw-input'>" .
-					Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(),
-						'filter',
-						'unmodified',
-						'mw-allmessages-form-filter-unmodified',
-						( $this->filter == 'unmodified' )
-					) .
-					Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(),
-						'filter',
-						'all',
-						'mw-allmessages-form-filter-all',
-						( $this->filter == 'all' )
-					) .
-					Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(),
-						'filter',
-						'modified',
-						'mw-allmessages-form-filter-modified',
-					( $this->filter == 'modified' )
-				) .
-				"</td>\n
+			Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(),
+				'filter',
+				'unmodified',
+				'mw-allmessages-form-filter-unmodified',
+				( $this->filter == 'unmodified' )
+			) .
+			Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(),
+				'filter',
+				'all',
+				'mw-allmessages-form-filter-all',
+				( $this->filter == 'all' )
+			) .
+			Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(),
+				'filter',
+				'modified',
+				'mw-allmessages-form-filter-modified',
+				( $this->filter == 'modified' )
+			) .
+			"</td>\n
 			</tr>
 			<tr>\n
 				<td class=\"mw-label\">" . $langSelect[0] . "</td>\n
@@ -197,29 +195,30 @@ class AllmessagesTablePager extends TablePager {
 
 			'<tr>
 				<td class="mw-label">' .
-					Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) .
-				'</td>
-				<td class="mw-input">' .
-					$this->getLimitSelect() .
-				'</td>
+			Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) .
+			'</td>
+			<td class="mw-input">' .
+			$this->getLimitSelect() .
+			'</td>
 			<tr>
 				<td></td>
 				<td>' .
-					Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) .
-				"</td>\n
+			Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) .
+			"</td>\n
 			</tr>" .
 
 			Xml::closeElement( 'table' ) .
 			$this->getHiddenFields( array( 'title', 'prefix', 'filter', 'lang', 'limit' ) ) .
 			Xml::closeElement( 'fieldset' ) .
 			Xml::closeElement( 'form' );
+
 		return $out;
 	}
 
 	function getAllMessages( $descending ) {
 		wfProfileIn( __METHOD__ );
 		$messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' );
-		if( $descending ) {
+		if ( $descending ) {
 			rsort( $messageNames );
 		} else {
 			asort( $messageNames );
@@ -229,6 +228,7 @@ class AllmessagesTablePager extends TablePager {
 		$messageNames = array_map( array( $this->lang, 'ucfirst' ), $messageNames );
 
 		wfProfileOut( __METHOD__ );
+
 		return $messageNames;
 	}
 
@@ -260,18 +260,19 @@ class AllmessagesTablePager extends TablePager {
 
 		foreach ( $res as $s ) {
 			$exists = false;
-			if( $foreign ) {
+			if ( $foreign ) {
 				$title = explode( '/', $s->page_title );
-				if( count( $title ) === 2 && $langcode == $title[1]
-					&& isset( $xNames[$title[0]] ) ) {
+				if ( count( $title ) === 2 && $langcode == $title[1]
+					&& isset( $xNames[$title[0]] )
+				) {
 					$exists = $title[0];
 				}
-			} elseif( isset( $xNames[$s->page_title] ) ) {
+			} elseif ( isset( $xNames[$s->page_title] ) ) {
 				$exists = $s->page_title;
 			}
-			if( $exists && $s->page_namespace == NS_MEDIAWIKI ) {
+			if ( $exists && $s->page_namespace == NS_MEDIAWIKI ) {
 				$pageFlags[$exists] = true;
-			} elseif( $exists && $s->page_namespace == NS_MEDIAWIKI_TALK ) {
+			} elseif ( $exists && $s->page_namespace == NS_MEDIAWIKI_TALK ) {
 				$talkFlags[$exists] = true;
 			}
 		}
@@ -284,6 +285,9 @@ class AllmessagesTablePager extends TablePager {
 	/**
 	 *  This function normally does a database query to get the results; we need
 	 * to make a pretend result using a FakeResultWrapper.
+	 * @param string $offset
+	 * @param int $limit
+	 * @param bool $descending
 	 * @return FakeResultWrapper
 	 */
 	function reallyDoQuery( $offset, $limit, $descending ) {
@@ -293,27 +297,29 @@ class AllmessagesTablePager extends TablePager {
 		$statuses = self::getCustomisedStatuses( $messageNames, $this->langcode, $this->foreign );
 
 		$count = 0;
-		foreach( $messageNames as $key ) {
+		foreach ( $messageNames as $key ) {
 			$customised = isset( $statuses['pages'][$key] );
-			if( $customised !== $this->custom &&
+			if ( $customised !== $this->custom &&
 				( $descending && ( $key < $offset || !$offset ) || !$descending && $key > $offset ) &&
 				( ( $this->prefix && preg_match( $this->prefix, $key ) ) || $this->prefix === false )
 			) {
 				$actual = wfMessage( $key )->inLanguage( $this->langcode )->plain();
 				$default = wfMessage( $key )->inLanguage( $this->langcode )->useDatabase( false )->plain();
 				$result->result[] = array(
-					'am_title'      => $key,
-					'am_actual'     => $actual,
-					'am_default'    => $default,
+					'am_title' => $key,
+					'am_actual' => $actual,
+					'am_default' => $default,
 					'am_customised' => $customised,
 					'am_talk_exists' => isset( $statuses['talks'][$key] )
 				);
 				$count++;
 			}
-			if( $count == $limit ) {
+
+			if ( $count == $limit ) {
 				break;
 			}
 		}
+
 		return $result;
 	}
 
@@ -321,26 +327,26 @@ class AllmessagesTablePager extends TablePager {
 		return Xml::openElement( 'table', array( 'class' => 'mw-datatable TablePager', 'id' => 'mw-allmessagestable' ) ) . "\n" .
 			"<thead><tr>
 				<th rowspan=\"2\">" .
-					$this->msg( 'allmessagesname' )->escaped() . "
+			$this->msg( 'allmessagesname' )->escaped() . "
 				</th>
 				<th>" .
-					$this->msg( 'allmessagesdefault' )->escaped() .
-				"</th>
+			$this->msg( 'allmessagesdefault' )->escaped() .
+			"</th>
 			</tr>\n
 			<tr>
 				<th>" .
-					$this->msg( 'allmessagescurrent' )->escaped() .
-				"</th>
+			$this->msg( 'allmessagescurrent' )->escaped() .
+			"</th>
 			</tr></thead><tbody>\n";
 	}
 
 	function formatValue( $field, $value ) {
-		switch( $field ) {
+		switch ( $field ) {
 			case 'am_title' :
 				$title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix );
 				$talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
 
-				if( $this->mCurrentRow->am_customised ) {
+				if ( $this->mCurrentRow->am_customised ) {
 					$title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
 				} else {
 					$title = Linker::link(
@@ -362,6 +368,7 @@ class AllmessagesTablePager extends TablePager {
 						array( 'broken' )
 					);
 				}
+
 				return $title . ' ' . $this->msg( 'parentheses' )->rawParams( $talk )->escaped();
 
 			case 'am_default' :
@@ -376,7 +383,7 @@ class AllmessagesTablePager extends TablePager {
 		$s = parent::formatRow( $row );
 
 		// But if there's a customised message, add that too.
-		if( $row->am_customised ) {
+		if ( $row->am_customised ) {
 			$s .= Xml::openElement( 'tr', $this->getRowAttrs( $row, true ) );
 			$formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) );
 			if ( $formatted == '' ) {
@@ -385,24 +392,26 @@ class AllmessagesTablePager extends TablePager {
 			$s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
 				. "</tr>\n";
 		}
+
 		return $s;
 	}
 
 	function getRowAttrs( $row, $isSecond = false ) {
 		$arr = array();
-		if( $row->am_customised ) {
+		if ( $row->am_customised ) {
 			$arr['class'] = 'allmessages-customised';
 		}
-		if( !$isSecond ) {
+		if ( !$isSecond ) {
 			$arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) );
 		}
+
 		return $arr;
 	}
 
 	function getCellAttrs( $field, $value ) {
-		if( $this->mCurrentRow->am_customised && $field == 'am_title' ) {
+		if ( $this->mCurrentRow->am_customised && $field == 'am_title' ) {
 			return array( 'rowspan' => '2', 'class' => $field );
-		} elseif( $field == 'am_title' ) {
+		} elseif ( $field == 'am_title' ) {
 			return array( 'class' => $field );
 		} else {
 			return array( 'lang' => $this->langcode, 'dir' => $this->lang->getDir(), 'class' => $field );
diff --git a/includes/specials/SpecialAllpages.php b/includes/specials/SpecialAllpages.php
index f9cb5cd8..a0820493 100644
--- a/includes/specials/SpecialAllpages.php
+++ b/includes/specials/SpecialAllpages.php
@@ -71,7 +71,6 @@ class SpecialAllpages extends IncludableSpecialPage {
 	 * @param string $par becomes "FOO" when called like Special:Allpages/FOO (default NULL)
 	 */
 	function execute( $par ) {
-		global $wgContLang;
 		$request = $this->getRequest();
 		$out = $this->getOutput();
 
@@ -85,18 +84,18 @@ class SpecialAllpages extends IncludableSpecialPage {
 		$namespace = $request->getInt( 'namespace' );
 		$hideredirects = $request->getBool( 'hideredirects', false );
 
-		$namespaces = $wgContLang->getNamespaces();
+		$namespaces = $this->getContext()->getLanguage()->getNamespaces();
 
 		$out->setPageTitle(
-			( $namespace > 0 && in_array( $namespace, array_keys( $namespaces) ) ) ?
-			$this->msg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
-			$this->msg( 'allarticles' )
+			( $namespace > 0 && in_array( $namespace, array_keys( $namespaces ) ) ) ?
+				$this->msg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
+				$this->msg( 'allarticles' )
 		);
 		$out->addModuleStyles( 'mediawiki.special' );
 
-		if( $par !== null ) {
+		if ( $par !== null ) {
 			$this->showChunk( $namespace, $par, $to, $hideredirects );
-		} elseif( $from !== null && $to === null ) {
+		} elseif ( $from !== null && $to === null ) {
 			$this->showChunk( $namespace, $from, $to, $hideredirects );
 		} else {
 			$this->showToplevel( $namespace, $from, $to, $hideredirects );
@@ -160,6 +159,7 @@ class SpecialAllpages extends IncludableSpecialPage {
 		$out .= Xml::closeElement( 'fieldset' );
 		$out .= Xml::closeElement( 'form' );
 		$out .= Xml::closeElement( 'div' );
+
 		return $out;
 	}
 
@@ -188,10 +188,13 @@ class SpecialAllpages extends IncludableSpecialPage {
 		$from = ( $from && $from->isLocal() ) ? $from->getDBkey() : null;
 		$to = ( $to && $to->isLocal() ) ? $to->getDBkey() : null;
 
-		if( isset( $from ) )
+		if ( isset( $from ) ) {
 			$where[] = 'page_title >= ' . $dbr->addQuotes( $from );
-		if( isset( $to ) )
+		}
+
+		if ( isset( $to ) ) {
 			$where[] = 'page_title <= ' . $dbr->addQuotes( $to );
+		}
 
 		global $wgMemc;
 		$key = wfMemcKey( 'allpages', 'ns', $namespace, sha1( $from ), sha1( $to ) );
@@ -201,7 +204,7 @@ class SpecialAllpages extends IncludableSpecialPage {
 		$maxPerSubpage = intval( $count / $this->maxLineCount );
 		$maxPerSubpage = max( $maxPerSubpage, $this->maxPerPage );
 
-		if( !is_array( $lines ) ) {
+		if ( !is_array( $lines ) ) {
 			$options = array( 'LIMIT' => 1 );
 			$options['ORDER BY'] = 'page_title ASC';
 			$firstTitle = $dbr->selectField( 'page', 'page_title', $where, __METHOD__, $options );
@@ -210,7 +213,7 @@ class SpecialAllpages extends IncludableSpecialPage {
 			$lines = array( $firstTitle );
 			# If we are going to show n rows, we need n+1 queries to find the relevant titles.
 			$done = false;
-			while( !$done ) {
+			while ( !$done ) {
 				// Fetch the last title of this chunk and the first of the next
 				$chunk = ( $lastTitle === false )
 					? array()
@@ -223,7 +226,7 @@ class SpecialAllpages extends IncludableSpecialPage {
 				);
 
 				$s = $dbr->fetchObject( $res );
-				if( $s ) {
+				if ( $s ) {
 					array_push( $lines, $s->page_title );
 				} else {
 					// Final chunk, but ended prematurely. Go back and find the end.
@@ -233,8 +236,9 @@ class SpecialAllpages extends IncludableSpecialPage {
 					array_push( $lines, $endTitle );
 					$done = true;
 				}
+
 				$s = $res->fetchObject();
-				if( $s ) {
+				if ( $s ) {
 					array_push( $lines, $s->page_title );
 					$lastTitle = $s->page_title;
 				} else {
@@ -249,18 +253,19 @@ class SpecialAllpages extends IncludableSpecialPage {
 
 		// If there are only two or less sections, don't even display them.
 		// Instead, display the first section directly.
-		if( count( $lines ) <= 2 ) {
-			if( !empty( $lines ) ) {
+		if ( count( $lines ) <= 2 ) {
+			if ( !empty( $lines ) ) {
 				$this->showChunk( $namespace, $from, $to, $hideredirects );
 			} else {
 				$output->addHTML( $this->namespaceForm( $namespace, $from, $to, $hideredirects ) );
 			}
+
 			return;
 		}
 
 		# At this point, $lines should contain an even number of elements.
 		$out .= Xml::openElement( 'table', array( 'class' => 'allpageslist' ) );
-		while( count ( $lines ) > 0 ) {
+		while ( count( $lines ) > 0 ) {
 			$inpoint = array_shift( $lines );
 			$outpoint = array_shift( $lines );
 			$out .= $this->showline( $inpoint, $outpoint, $namespace, $hideredirects );
@@ -269,19 +274,19 @@ class SpecialAllpages extends IncludableSpecialPage {
 		$nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
 
 		# Is there more?
-		if( $this->including() ) {
+		if ( $this->including() ) {
 			$out2 = '';
 		} else {
-			if( isset( $from ) || isset( $to ) ) {
-				$out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ).
-						'<tr>
+			if ( isset( $from ) || isset( $to ) ) {
+				$out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
+					'<tr>
 							<td>' .
-								$nsForm .
-							'</td>
+					$nsForm .
+					'</td>
 							<td class="mw-allpages-nav">' .
-								Linker::link( $this->getTitle(), $this->msg( 'allpages' )->escaped(),
-									array(), array(), 'known' ) .
-							"</td>
+					Linker::link( $this->getTitle(), $this->msg( 'allpages' )->escaped(),
+						array(), array(), 'known' ) .
+					"</td>
 						</tr>" .
 					Xml::closeElement( 'table' );
 			} else {
@@ -297,47 +302,56 @@ class SpecialAllpages extends IncludableSpecialPage {
 	 * @param string $inpoint lower limit of pagenames
 	 * @param string $outpoint upper limit of pagenames
 	 * @param $namespace Integer (Default NS_MAIN)
-	 * @param bool $hideredirects dont show redirects (default FALSE)
+	 * @param bool $hideRedirects don't show redirects. Default: false
 	 * @return string
 	 */
-	function showline( $inpoint, $outpoint, $namespace = NS_MAIN, $hideredirects ) {
+	function showline( $inpoint, $outpoint, $namespace = NS_MAIN, $hideRedirects = false ) {
+		// Use content language since page titles are considered to use content language
 		global $wgContLang;
-		$inpointf = htmlspecialchars( str_replace( '_', ' ', $inpoint ) );
-		$outpointf = htmlspecialchars( str_replace( '_', ' ', $outpoint ) );
+
+		$inpointf = str_replace( '_', ' ', $inpoint );
+		$outpointf = str_replace( '_', ' ', $outpoint );
+
 		// Don't let the length runaway
 		$inpointf = $wgContLang->truncate( $inpointf, $this->maxPageLength );
 		$outpointf = $wgContLang->truncate( $outpointf, $this->maxPageLength );
 
-		$queryparams = $namespace ? "namespace=$namespace&" : '';
+		$queryParams = array(
+			'from' => $inpoint,
+			'to' => $outpoint,
+		);
 
-		$queryhideredirects = array();
-		if ( $hideredirects ) {
-			$queryhideredirects['hideredirects'] = 1;
+		if ( $namespace ) {
+			$queryParams['namespace'] = $namespace;
+		}
+		if ( $hideRedirects ) {
+			$queryParams['hideredirects'] = 1;
 		}
 
-		$special = $this->getTitle();
-		$link = htmlspecialchars( $special->getLocalUrl( $queryparams . 'from=' . urlencode( $inpoint ) . '&to=' . urlencode( $outpoint ), $queryhideredirects ) );
+		$url = $this->getTitle()->getLocalURL( $queryParams );
+		$inlink = Html::element( 'a', array( 'href' => $url ), $inpointf );
+		$outlink = Html::element( 'a', array( 'href' => $url ), $outpointf );
 
 		$out = $this->msg( 'alphaindexline' )->rawParams(
-			"<a href=\"$link\">$inpointf</a></td><td>",
-			"</td><td><a href=\"$link\">$outpointf</a>"
+			"$inlink</td><td>",
+			"</td><td>$outlink"
 		)->escaped();
+
 		return '<tr><td class="mw-allpages-alphaindexline">' . $out . '</td></tr>';
 	}
 
 	/**
-	 * @param $namespace Integer (Default NS_MAIN)
+	 * @param int $namespace Namespace (Default NS_MAIN)
 	 * @param string $from list all pages from this name (default FALSE)
 	 * @param string $to list all pages to this name (default FALSE)
 	 * @param bool $hideredirects dont show redirects (default FALSE)
 	 */
 	function showChunk( $namespace = NS_MAIN, $from = false, $to = false, $hideredirects = false ) {
-		global $wgContLang;
 		$output = $this->getOutput();
 
 		$fromList = $this->getNamespaceKeyAndText( $namespace, $from );
 		$toList = $this->getNamespaceKeyAndText( $namespace, $to );
-		$namespaces = $wgContLang->getNamespaces();
+		$namespaces = $this->getContext()->getLanguage()->getNamespaces();
 		$n = 0;
 
 		if ( !$fromList || !$toList ) {
@@ -360,7 +374,7 @@ class SpecialAllpages extends IncludableSpecialPage {
 				$conds['page_is_redirect'] = 0;
 			}
 
-			if( $toKey !== "" ) {
+			if ( $toKey !== "" ) {
 				$conds[] = 'page_title <= ' . $dbr->addQuotes( $toKey );
 			}
 
@@ -369,33 +383,36 @@ class SpecialAllpages extends IncludableSpecialPage {
 				$conds,
 				__METHOD__,
 				array(
-					'ORDER BY'  => 'page_title',
-					'LIMIT'     => $this->maxPerPage + 1,
+					'ORDER BY' => 'page_title',
+					'LIMIT' => $this->maxPerPage + 1,
 					'USE INDEX' => 'name_title',
 				)
 			);
 
-			if( $res->numRows() > 0 ) {
+			if ( $res->numRows() > 0 ) {
 				$out = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-chunk' ) );
-				while( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+				while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
 					$t = Title::newFromRow( $s );
-					if( $t ) {
+					if ( $t ) {
 						$link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
 							Linker::link( $t ) .
-							($s->page_is_redirect ? '</div>' : '' );
+							( $s->page_is_redirect ? '</div>' : '' );
 					} else {
 						$link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
 					}
-					if( $n % 3 == 0 ) {
+
+					if ( $n % 3 == 0 ) {
 						$out .= '<tr>';
 					}
+
 					$out .= "<td style=\"width:33%\">$link</td>";
 					$n++;
-					if( $n % 3 == 0 ) {
+					if ( $n % 3 == 0 ) {
 						$out .= "</tr>\n";
 					}
 				}
-				if( ($n % 3) != 0 ) {
+
+				if ( ( $n % 3 ) != 0 ) {
 					$out .= "</tr>\n";
 				}
 				$out .= Xml::closeElement( 'table' );
@@ -407,7 +424,7 @@ class SpecialAllpages extends IncludableSpecialPage {
 		if ( $this->including() ) {
 			$out2 = '';
 		} else {
-			if( $from == '' ) {
+			if ( $from == '' ) {
 				// First chunk; no previous link.
 				$prevTitle = null;
 			} else {
@@ -424,20 +441,20 @@ class SpecialAllpages extends IncludableSpecialPage {
 				);
 
 				# Get first title of previous complete chunk
-				if( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
+				if ( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
 					$pt = $dbr->fetchObject( $res_prev );
 					$prevTitle = Title::makeTitle( $namespace, $pt->page_title );
 				} else {
 					# The previous chunk is not complete, need to link to the very first title
 					# available in the database
 					$options = array( 'LIMIT' => 1 );
-					if ( ! $dbr->implicitOrderby() ) {
+					if ( !$dbr->implicitOrderby() ) {
 						$options['ORDER BY'] = 'page_title';
 					}
 					$reallyFirstPage_title = $dbr->selectField( 'page', 'page_title',
 						array( 'page_namespace' => $namespace ), __METHOD__, $options );
 					# Show the previous link if it s not the current requested chunk
-					if( $from != $reallyFirstPage_title ) {
+					if ( $from != $reallyFirstPage_title ) {
 						$prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
 					} else {
 						$prevTitle = null;
@@ -448,23 +465,25 @@ class SpecialAllpages extends IncludableSpecialPage {
 			$self = $this->getTitle();
 
 			$nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
-			$out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ).
-						'<tr>
+			$out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
+				'<tr>
 							<td>' .
-								$nsForm .
-							'</td>
+				$nsForm .
+				'</td>
 							<td class="mw-allpages-nav">' .
-								Linker::link( $self, $this->msg( 'allpages' )->escaped() );
+				Linker::link( $self, $this->msg( 'allpages' )->escaped() );
 
 			# Do we put a previous link ?
-			if( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
+			if ( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
 				$query = array( 'from' => $prevTitle->getText() );
 
-				if( $namespace )
+				if ( $namespace ) {
 					$query['namespace'] = $namespace;
+				}
 
-				if( $hideredirects )
+				if ( $hideredirects ) {
 					$query['hideredirects'] = $hideredirects;
+				}
 
 				$prevLink = Linker::linkKnown(
 					$self,
@@ -475,16 +494,18 @@ class SpecialAllpages extends IncludableSpecialPage {
 				$out2 = $this->getLanguage()->pipeList( array( $out2, $prevLink ) );
 			}
 
-			if( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
+			if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
 				# $s is the first link of the next chunk
 				$t = Title::makeTitle( $namespace, $s->page_title );
 				$query = array( 'from' => $t->getText() );
 
-				if( $namespace )
+				if ( $namespace ) {
 					$query['namespace'] = $namespace;
+				}
 
-				if( $hideredirects )
+				if ( $hideredirects ) {
 					$query['hideredirects'] = $hideredirects;
+				}
 
 				$nextLink = Linker::linkKnown(
 					$self,
@@ -500,17 +521,22 @@ class SpecialAllpages extends IncludableSpecialPage {
 		$output->addHTML( $out2 . $out );
 
 		$links = array();
-		if ( isset( $prevLink ) ) $links[] = $prevLink;
-		if ( isset( $nextLink ) ) $links[] = $nextLink;
+		if ( isset( $prevLink ) ) {
+			$links[] = $prevLink;
+		}
+
+		if ( isset( $nextLink ) ) {
+			$links[] = $nextLink;
+		}
 
 		if ( count( $links ) ) {
 			$output->addHTML(
 				Html::element( 'hr' ) .
-				Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
-					$this->getLanguage()->pipeList( $links )
-				) );
+					Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
+						$this->getLanguage()->pipeList( $links )
+					)
+			);
 		}
-
 	}
 
 	/**
@@ -519,8 +545,10 @@ class SpecialAllpages extends IncludableSpecialPage {
 	 * @return array( int namespace, string dbkey, string pagename ) or NULL on error
 	 */
 	protected function getNamespaceKeyAndText( $ns, $text ) {
-		if ( $text == '' )
-			return array( $ns, '', '' ); # shortcut for common case
+		if ( $text == '' ) {
+			# shortcut for common case
+			return array( $ns, '', '' );
+		}
 
 		$t = Title::makeTitleSafe( $ns, $text );
 		if ( $t && $t->isLocal() ) {
diff --git a/includes/specials/SpecialAncientpages.php b/includes/specials/SpecialAncientpages.php
index b0f333c4..b0830327 100644
--- a/includes/specials/SpecialAncientpages.php
+++ b/includes/specials/SpecialAncientpages.php
@@ -43,12 +43,16 @@ class AncientPagesPage extends QueryPage {
 	function getQueryInfo() {
 		return array(
 			'tables' => array( 'page', 'revision' ),
-			'fields' => array( 'namespace' => 'page_namespace',
-					'title' => 'page_title',
-					'value' => 'rev_timestamp' ),
-			'conds' => array( 'page_namespace' => MWNamespace::getContentNamespaces(),
-					'page_is_redirect' => 0,
-					'page_latest=rev_id' )
+			'fields' => array(
+				'namespace' => 'page_namespace',
+				'title' => 'page_title',
+				'value' => 'rev_timestamp'
+			),
+			'conds' => array(
+				'page_namespace' => MWNamespace::getContentNamespaces(),
+				'page_is_redirect' => 0,
+				'page_latest=rev_id'
+			)
 		);
 	}
 
@@ -60,6 +64,11 @@ class AncientPagesPage extends QueryPage {
 		return false;
 	}
 
+	/**
+	 * @param Skin $skin
+	 * @param object $result Result row
+	 * @return string
+	 */
 	function formatResult( $skin, $result ) {
 		global $wgContLang;
 
@@ -69,6 +78,7 @@ class AncientPagesPage extends QueryPage {
 			$title,
 			htmlspecialchars( $wgContLang->convert( $title->getPrefixedText() ) )
 		);
+
 		return $this->getLanguage()->specialList( $link, htmlspecialchars( $d ) );
 	}
 
diff --git a/includes/specials/SpecialBlankpage.php b/includes/specials/SpecialBlankpage.php
index bfa2f951..e61f12b9 100644
--- a/includes/specials/SpecialBlankpage.php
+++ b/includes/specials/SpecialBlankpage.php
@@ -31,6 +31,7 @@ class SpecialBlankpage extends UnlistedSpecialPage {
 	public function __construct() {
 		parent::__construct( 'Blankpage' );
 	}
+
 	public function execute( $par ) {
 		$this->setHeaders();
 		$this->getOutput()->addWikiMsg( 'intentionallyblankpage' );
diff --git a/includes/specials/SpecialBlock.php b/includes/specials/SpecialBlock.php
index 50fdbc26..3b73a374 100644
--- a/includes/specials/SpecialBlock.php
+++ b/includes/specials/SpecialBlock.php
@@ -110,10 +110,10 @@ class SpecialBlock extends FormSpecialPage {
 			$s = HTMLForm::formatErrors( $this->preErrors );
 			if ( $s ) {
 				$form->addHeaderText( Html::rawElement(
-						'div',
-						array( 'class' => 'error' ),
-						$s
-					) );
+					'div',
+					array( 'class' => 'error' ),
+					$s
+				) );
 			}
 		}
 	}
@@ -127,6 +127,8 @@ class SpecialBlock extends FormSpecialPage {
 
 		$user = $this->getUser();
 
+		$suggestedDurations = self::getSuggestedDurations();
+
 		$a = array(
 			'Target' => array(
 				'type' => 'text',
@@ -139,11 +141,11 @@ class SpecialBlock extends FormSpecialPage {
 				'validation-callback' => array( __CLASS__, 'validateTargetField' ),
 			),
 			'Expiry' => array(
-				'type' => !count( self::getSuggestedDurations() ) ? 'text' : 'selectorother',
+				'type' => !count( $suggestedDurations ) ? 'text' : 'selectorother',
 				'label-message' => 'ipbexpiry',
 				'required' => true,
 				'tabindex' => '2',
-				'options' => self::getSuggestedDurations(),
+				'options' => $suggestedDurations,
 				'other' => $this->msg( 'ipbother' )->text(),
 				'default' => $this->msg( 'ipb-default-expiry' )->inContentLanguage()->text(),
 			),
@@ -241,8 +243,7 @@ class SpecialBlock extends FormSpecialPage {
 		if ( $block instanceof Block && !$block->mAuto # The block exists and isn't an autoblock
 			&& ( $this->type != Block::TYPE_RANGE # The block isn't a rangeblock
 				|| $block->getTarget() == $this->target ) # or if it is, the range is what we're about to block
-			)
-		{
+		) {
 			$fields['HardBlock']['default'] = $block->isHardblock();
 			$fields['CreateAccount']['default'] = $block->prevents( 'createaccount' );
 			$fields['AutoBlock']['default'] = $block->isAutoblocking();
@@ -445,6 +446,7 @@ class SpecialBlock extends FormSpecialPage {
 		} elseif ( IP::isIPAddress( $target ) ) {
 			return Title::makeTitleSafe( NS_USER, $target );
 		}
+
 		return null;
 	}
 
@@ -460,8 +462,8 @@ class SpecialBlock extends FormSpecialPage {
 		$i = 0;
 		$target = null;
 
-		while( true ) {
-			switch( $i++ ) {
+		while ( true ) {
+			switch ( $i++ ) {
 				case 0:
 					# The HTMLForm will check wpTarget first and only if it doesn't get
 					# a value use the default, which will be generated from the options
@@ -511,6 +513,7 @@ class SpecialBlock extends FormSpecialPage {
 		$status = self::validateTarget( $value, $form->getUser() );
 		if ( !$status->isOK() ) {
 			$errors = $status->getErrorsArray();
+
 			return call_user_func_array( array( $form, 'msg' ), $errors[0] );
 		} else {
 			return true;
@@ -528,6 +531,7 @@ class SpecialBlock extends FormSpecialPage {
 	public static function validateTarget( $value, User $user ) {
 		global $wgBlockCIDRLimit;
 
+		/** @var User $target */
 		list( $target, $type ) = self::getTargetAndType( $value );
 		$status = Status::newGood( $target );
 
@@ -606,6 +610,7 @@ class SpecialBlock extends FormSpecialPage {
 		# can come from it
 		$data['Confirm'] = !in_array( $data['Confirm'], array( '', '0', null, false ), true );
 
+		/** @var User $target */
 		list( $target, $type ) = self::getTargetAndType( $data['Target'] );
 		if ( $type == Block::TYPE_USER ) {
 			$user = $target;
@@ -620,8 +625,8 @@ class SpecialBlock extends FormSpecialPage {
 			# but $data['target'] gets overriden by (non-normalized) request variable
 			# from previous request.
 			if ( $target === $performer->getName() &&
-				( $data['PreviousTarget'] !== $target || !$data['Confirm'] ) )
-			{
+				( $data['PreviousTarget'] !== $target || !$data['Confirm'] )
+			) {
 				return array( 'ipb-blockingself' );
 			}
 		} elseif ( $type == Block::TYPE_RANGE ) {
@@ -634,9 +639,9 @@ class SpecialBlock extends FormSpecialPage {
 			return array( 'badipaddress' );
 		}
 
-		if ( ( strlen( $data['Expiry'] ) == 0) || ( strlen( $data['Expiry'] ) > 50 )
-			|| !self::parseExpiryInput( $data['Expiry'] ) )
-		{
+		if ( ( strlen( $data['Expiry'] ) == 0 ) || ( strlen( $data['Expiry'] ) > 50 )
+			|| !self::parseExpiryInput( $data['Expiry'] )
+		) {
 			return array( 'ipb_expiry_invalid' );
 		}
 
@@ -703,9 +708,9 @@ class SpecialBlock extends FormSpecialPage {
 			$reblockNotAllowed = ( array_key_exists( 'Reblock', $data ) && !$data['Reblock'] );
 
 			# Show form unless the user is already aware of this...
-			if( $blockNotConfirmed || $reblockNotAllowed ) {
+			if ( $blockNotConfirmed || $reblockNotAllowed ) {
 				return array( array( 'ipb_already_blocked', $block->getTarget() ) );
-			# Otherwise, try to update the block...
+				# Otherwise, try to update the block...
 			} else {
 				# This returns direct blocks before autoblocks/rangeblocks, since we should
 				# be sure the user is blocked by now it should work for our purposes
@@ -748,7 +753,7 @@ class SpecialBlock extends FormSpecialPage {
 
 		# Can't watch a rangeblock
 		if ( $type != Block::TYPE_RANGE && $data['Watch'] ) {
-			$performer->addWatch( Title::makeTitle( NS_USER, $target ) );
+			WatchAction::doWatch( Title::makeTitle( NS_USER, $target ), $performer, WatchedItem::IGNORE_USER_RIGHTS );
 		}
 
 		# Block constructor sanitizes certain block options on insert
@@ -767,7 +772,8 @@ class SpecialBlock extends FormSpecialPage {
 			$logaction,
 			Title::makeTitle( NS_USER, $target ),
 			$data['Reason'][0],
-			$logParams
+			$logParams,
+			$performer
 		);
 		# Relate log ID to block IDs (bug 25763)
 		$blockIds = array_merge( array( $status['id'] ), $status['autoIds'] );
@@ -865,7 +871,7 @@ class SpecialBlock extends FormSpecialPage {
 				# User is trying to unblock themselves
 				if ( $performer->isAllowed( 'unblockself' ) ) {
 					return true;
-				# User blocked themselves and is now trying to reverse it
+					# User blocked themselves and is now trying to reverse it
 				} elseif ( $performer->blockedBy() === $performer->getName() ) {
 					return true;
 				} else {
@@ -953,4 +959,5 @@ class SpecialBlock extends FormSpecialPage {
 }
 
 # BC @since 1.18
-class IPBlockForm extends SpecialBlock {}
+class IPBlockForm extends SpecialBlock {
+}
diff --git a/includes/specials/SpecialBlockList.php b/includes/specials/SpecialBlockList.php
index e10df4fe..f1992c0f 100644
--- a/includes/specials/SpecialBlockList.php
+++ b/includes/specials/SpecialBlockList.php
@@ -55,10 +55,11 @@ class SpecialBlockList extends SpecialPage {
 
 		$action = $request->getText( 'action' );
 
-		if( $action == 'unblock' || $action == 'submit' && $request->wasPosted() ) {
+		if ( $action == 'unblock' || $action == 'submit' && $request->wasPosted() ) {
 			# B/C @since 1.18: Unblock interface is now at Special:Unblock
 			$title = SpecialPage::getTitleFor( 'Unblock', $this->target );
-			$out->redirect( $title->getFullUrl() );
+			$out->redirect( $title->getFullURL() );
+
 			return;
 		}
 
@@ -95,7 +96,9 @@ class SpecialBlockList extends SpecialPage {
 				'default' => 50,
 			),
 		);
-		$form = new HTMLForm( $fields, $this->getContext() );
+		$context = new DerivativeContext( $this->getContext() );
+		$context->setTitle( $this->getTitle() ); // Remove subpage
+		$form = new HTMLForm( $fields, $context );
 		$form->setMethod( 'get' );
 		$form->setWrapperLegendMsg( 'ipblocklist-legend' );
 		$form->setSubmitTextMsg( 'ipblocklist-submit' );
@@ -120,7 +123,7 @@ class SpecialBlockList extends SpecialPage {
 		if ( $this->target !== '' ) {
 			list( $target, $type ) = Block::parseTarget( $this->target );
 
-			switch( $type ) {
+			switch ( $type ) {
 				case Block::TYPE_ID:
 				case Block::TYPE_AUTO:
 					$conds['ipb_id'] = $target;
@@ -141,23 +144,23 @@ class SpecialBlockList extends SpecialPage {
 					break;
 
 				case Block::TYPE_USER:
-					$conds['ipb_address'] = (string)$this->target;
+					$conds['ipb_address'] = $target->getName();
 					$conds['ipb_auto'] = 0;
 					break;
 			}
 		}
 
 		# Apply filters
-		if( in_array( 'userblocks', $this->options ) ) {
+		if ( in_array( 'userblocks', $this->options ) ) {
 			$conds['ipb_user'] = 0;
 		}
-		if( in_array( 'tempblocks', $this->options ) ) {
+		if ( in_array( 'tempblocks', $this->options ) ) {
 			$conds['ipb_expiry'] = 'infinity';
 		}
-		if( in_array( 'addressblocks', $this->options ) ) {
+		if ( in_array( 'addressblocks', $this->options ) ) {
 			$conds[] = "ipb_user != 0 OR ipb_range_end > ipb_range_start";
 		}
-		if( in_array( 'rangeblocks', $this->options ) ) {
+		if ( in_array( 'rangeblocks', $this->options ) ) {
 			$conds[] = "ipb_range_end = ipb_range_start";
 		}
 
@@ -169,7 +172,7 @@ class SpecialBlockList extends SpecialPage {
 
 		# Show additional header for the local block only when other blocks exists.
 		# Not necessary in a standard installation without such extensions enabled
-		if( count( $otherBlockLink ) ) {
+		if ( count( $otherBlockLink ) ) {
 			$out->addHTML(
 				Html::element( 'h2', array(), $this->msg( 'ipblocklist-localblock' )->text() ) . "\n"
 			);
@@ -179,18 +182,16 @@ class SpecialBlockList extends SpecialPage {
 		if ( $pager->getNumRows() ) {
 			$out->addHTML(
 				$pager->getNavigationBar() .
-				$pager->getBody().
-				$pager->getNavigationBar()
+					$pager->getBody() .
+					$pager->getNavigationBar()
 			);
-
 		} elseif ( $this->target ) {
 			$out->addWikiMsg( 'ipblocklist-no-results' );
-
 		} else {
 			$out->addWikiMsg( 'ipblocklist-empty' );
 		}
 
-		if( count( $otherBlockLink ) ) {
+		if ( count( $otherBlockLink ) ) {
 			$out->addHTML(
 				Html::rawElement(
 					'h2',
@@ -199,7 +200,7 @@ class SpecialBlockList extends SpecialPage {
 				) . "\n"
 			);
 			$list = '';
-			foreach( $otherBlockLink as $link ) {
+			foreach ( $otherBlockLink as $link ) {
 				$list .= Html::rawElement( 'li', array(), $link ) . "\n";
 			}
 			$out->addHTML( Html::rawElement( 'ul', array( 'class' => 'mw-ipblocklist-otherblocks' ), $list ) . "\n" );
@@ -238,7 +239,7 @@ class BlockListPager extends TablePager {
 				'ipb_params' => 'blocklist-params',
 				'ipb_reason' => 'blocklist-reason',
 			);
-			foreach( $headers as $key => $val ) {
+			foreach ( $headers as $key => $val ) {
 				$headers[$key] = $this->msg( $val )->text();
 			}
 		}
@@ -267,17 +268,17 @@ class BlockListPager extends TablePager {
 
 		$formatted = '';
 
-		switch( $name ) {
+		switch ( $name ) {
 			case 'ipb_timestamp':
 				$formatted = $this->getLanguage()->userTimeAndDate( $value, $this->getUser() );
 				break;
 
 			case 'ipb_target':
-				if( $row->ipb_auto ) {
+				if ( $row->ipb_auto ) {
 					$formatted = $this->msg( 'autoblockid', $row->ipb_id )->parse();
 				} else {
 					list( $target, $type ) = Block::parseTarget( $row->ipb_address );
-					switch( $type ) {
+					switch ( $type ) {
 						case Block::TYPE_USER:
 						case Block::TYPE_IP:
 							$formatted = Linker::userLink( $target->getId(), $target );
@@ -295,9 +296,9 @@ class BlockListPager extends TablePager {
 				break;
 
 			case 'ipb_expiry':
-				$formatted = $this->getLanguage()->formatExpiry( $value, /* User preference timezone */ true );
-				if( $this->getUser()->isAllowed( 'block' ) ) {
-					if( $row->ipb_auto ) {
+				$formatted = $this->getLanguage()->formatExpiry( $value, /* User preference timezone */true );
+				if ( $this->getUser()->isAllowed( 'block' ) ) {
+					if ( $row->ipb_auto ) {
 						$links[] = Linker::linkKnown(
 							SpecialPage::getTitleFor( 'Unblock' ),
 							$msg['unblocklink'],
@@ -420,7 +421,7 @@ class BlockListPager extends TablePager {
 
 	/**
 	 * Do a LinkBatch query to minimise database load when generating all these links
-	 * @param $result
+	 * @param ResultWrapper $result
 	 */
 	function preprocessResults( $result ) {
 		wfProfileIn( __METHOD__ );
@@ -441,7 +442,7 @@ class BlockListPager extends TablePager {
 		}
 
 		$ua = UserArray::newFromIDs( $userids );
-		foreach( $ua as $user ) {
+		foreach ( $ua as $user ) {
 			$name = str_replace( ' ', '_', $user->getName() );
 			$lb->add( NS_USER, $name );
 			$lb->add( NS_USER_TALK, $name );
@@ -482,5 +483,4 @@ class HTMLBlockedUsersItemSelect extends HTMLSelectField {
 
 		return true;
 	}
-
 }
diff --git a/includes/specials/SpecialBlockme.php b/includes/specials/SpecialBlockme.php
deleted file mode 100644
index 85a3019e..00000000
--- a/includes/specials/SpecialBlockme.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-/**
- * Implements Special:Blockme
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup SpecialPage
- */
-
-/**
- * A special page called by proxyCheck.php to block open proxies
- *
- * @ingroup SpecialPage
- */
-class SpecialBlockme extends UnlistedSpecialPage {
-
-	function __construct() {
-		parent::__construct( 'Blockme' );
-	}
-
-	function execute( $par ) {
-		global $wgBlockOpenProxies, $wgProxyKey;
-
-		$this->setHeaders();
-		$this->outputHeader();
-
-		$ip = $this->getRequest()->getIP();
-		if( !$wgBlockOpenProxies || $this->getRequest()->getText( 'ip' ) != md5( $ip . $wgProxyKey ) ) {
-			$this->getOutput()->addWikiMsg( 'proxyblocker-disabled' );
-			return;
-		}
-
-		$user = User::newFromName( $this->msg( 'proxyblocker' )->inContentLanguage()->text() );
-		# FIXME: newFromName could return false on a badly configured wiki.
-		if ( !$user->isLoggedIn() ) {
-			$user->addToDatabase();
-		}
-
-		$block = new Block();
-		$block->setTarget( $ip );
-		$block->setBlocker( $user );
-		$block->mReason = $this->msg( 'proxyblockreason' )->inContentLanguage()->text();
-
-		$block->insert();
-
-		$this->getOutput()->addWikiMsg( 'proxyblocksuccess' );
-	}
-
-	protected function getGroupName() {
-		return 'other';
-	}
-}
diff --git a/includes/specials/SpecialBooksources.php b/includes/specials/SpecialBooksources.php
index bdbd77b8..5ad961c3 100644
--- a/includes/specials/SpecialBooksources.php
+++ b/includes/specials/SpecialBooksources.php
@@ -53,8 +53,8 @@ class SpecialBookSources extends SpecialPage {
 		$this->outputHeader();
 		$this->isbn = self::cleanIsbn( $isbn ? $isbn : $this->getRequest()->getText( 'isbn' ) );
 		$this->getOutput()->addHTML( $this->makeForm() );
-		if( strlen( $this->isbn ) > 0 ) {
-			if( !self::isValidISBN( $this->isbn ) ) {
+		if ( strlen( $this->isbn ) > 0 ) {
+			if ( !self::isValidISBN( $this->isbn ) ) {
 				$this->getOutput()->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>", 'booksources-invalid-isbn' );
 			}
 			$this->showList();
@@ -69,32 +69,33 @@ class SpecialBookSources extends SpecialPage {
 	public static function isValidISBN( $isbn ) {
 		$isbn = self::cleanIsbn( $isbn );
 		$sum = 0;
-		if( strlen( $isbn ) == 13 ) {
-			for( $i = 0; $i < 12; $i++ ) {
-				if( $i % 2 == 0 ) {
+		if ( strlen( $isbn ) == 13 ) {
+			for ( $i = 0; $i < 12; $i++ ) {
+				if ( $i % 2 == 0 ) {
 					$sum += $isbn[$i];
 				} else {
 					$sum += 3 * $isbn[$i];
 				}
 			}
 
-			$check = (10 - ($sum % 10)) % 10;
+			$check = ( 10 - ( $sum % 10 ) ) % 10;
 			if ( $check == $isbn[12] ) {
 				return true;
 			}
-		} elseif( strlen( $isbn ) == 10 ) {
-			for( $i = 0; $i < 9; $i++ ) {
-				$sum += $isbn[$i] * ($i + 1);
+		} elseif ( strlen( $isbn ) == 10 ) {
+			for ( $i = 0; $i < 9; $i++ ) {
+				$sum += $isbn[$i] * ( $i + 1 );
 			}
 
 			$check = $sum % 11;
-			if( $check == 10 ) {
+			if ( $check == 10 ) {
 				$check = "X";
 			}
-			if( $check == $isbn[9] ) {
+			if ( $check == $isbn[9] ) {
 				return true;
 			}
 		}
+
 		return false;
 	}
 
@@ -116,13 +117,14 @@ class SpecialBookSources extends SpecialPage {
 	private function makeForm() {
 		global $wgScript;
 
-		$form = '<fieldset><legend>' . $this->msg( 'booksources-search-legend' )->escaped() . '</legend>';
-		$form .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
-		$form .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() );
-		$form .= '<p>' . Xml::inputLabel( $this->msg( 'booksources-isbn' )->text(), 'isbn', 'isbn', 20, $this->isbn );
-		$form .= '&#160;' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . '</p>';
-		$form .= Xml::closeElement( 'form' );
-		$form .= '</fieldset>';
+		$form = Html::openElement( 'fieldset' ) . "\n";
+		$form .= Html::element( 'legend', array(), $this->msg( 'booksources-search-legend' )->text() ) . "\n";
+		$form .= Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) . "\n";
+		$form .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . "\n";
+		$form .= '<p>' . Xml::inputLabel( $this->msg( 'booksources-isbn' )->text(), 'isbn', 'isbn', 20, $this->isbn, array( 'autofocus' => true ) );
+		$form .= '&#160;' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . "</p>\n";
+		$form .= Html::closeElement( 'form' ) . "\n";
+		$form .= Html::closeElement( 'fieldset' ) . "\n";
 		return $form;
 	}
 
@@ -143,7 +145,7 @@ class SpecialBookSources extends SpecialPage {
 		# Check for a local page such as Project:Book_sources and use that if available
 		$page = $this->msg( 'booksources' )->inContentLanguage()->text();
 		$title = Title::makeTitleSafe( NS_PROJECT, $page ); # Show list in content language
-		if( is_object( $title ) && $title->exists() ) {
+		if ( is_object( $title ) && $title->exists() ) {
 			$rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
 			$content = $rev->getContent();
 
@@ -152,6 +154,7 @@ class SpecialBookSources extends SpecialPage {
 
 				$text = $content->getNativeData();
 				$this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $text ) );
+
 				return true;
 			} else {
 				throw new MWException( "Unexpected content type for book sources: " . $content->getModel() );
@@ -162,9 +165,11 @@ class SpecialBookSources extends SpecialPage {
 		$this->getOutput()->addWikiMsg( 'booksources-text' );
 		$this->getOutput()->addHTML( '<ul>' );
 		$items = $wgContLang->getBookstoreList();
-		foreach( $items as $label => $url )
+		foreach ( $items as $label => $url ) {
 			$this->getOutput()->addHTML( $this->makeListItem( $label, $url ) );
+		}
 		$this->getOutput()->addHTML( '</ul>' );
+
 		return true;
 	}
 
@@ -177,7 +182,9 @@ class SpecialBookSources extends SpecialPage {
 	 */
 	private function makeListItem( $label, $url ) {
 		$url = str_replace( '$1', $this->isbn, $url );
-		return '<li><a href="' . htmlspecialchars( $url ) . '" class="external">' . htmlspecialchars( $label ) . '</a></li>';
+
+		return Html::rawElement( 'li', array(),
+			Html::element( 'a', array( 'href' => $url, 'class' => 'external' ), $label ) );
 	}
 
 	protected function getGroupName() {
diff --git a/includes/specials/SpecialBrokenRedirects.php b/includes/specials/SpecialBrokenRedirects.php
index fac41236..b2ddc220 100644
--- a/includes/specials/SpecialBrokenRedirects.php
+++ b/includes/specials/SpecialBrokenRedirects.php
@@ -51,6 +51,7 @@ class BrokenRedirectsPage extends QueryPage {
 
 	function getQueryInfo() {
 		$dbr = wfGetDB( DB_SLAVE );
+
 		return array(
 			'tables' => array(
 				'redirect',
@@ -88,13 +89,13 @@ class BrokenRedirectsPage extends QueryPage {
 	 * @return array
 	 */
 	function getOrderFields() {
-		return array ( 'rd_namespace', 'rd_title', 'rd_from' );
+		return array( 'rd_namespace', 'rd_title', 'rd_from' );
 	}
 
 	/**
-	 * @param $skin Skin
-	 * @param $result
-	 * @return String
+	 * @param Skin $skin
+	 * @param object $result Result row
+	 * @return string
 	 */
 	function formatResult( $skin, $result ) {
 		$fromObj = Title::makeTitle( $result->namespace, $result->title );
@@ -138,7 +139,7 @@ class BrokenRedirectsPage extends QueryPage {
 
 		$out = $from . $this->msg( 'word-separator' )->escaped();
 
-		if( $this->getUser()->isAllowed( 'delete' ) ) {
+		if ( $this->getUser()->isAllowed( 'delete' ) ) {
 			$links[] = Linker::linkKnown(
 				$fromObj,
 				$this->msg( 'brokenredirects-delete' )->escaped(),
@@ -149,6 +150,7 @@ class BrokenRedirectsPage extends QueryPage {
 
 		$out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->pipeList( $links ) )->escaped();
 		$out .= " {$arr} {$to}";
+
 		return $out;
 	}
 
diff --git a/includes/specials/SpecialCachedPage.php b/includes/specials/SpecialCachedPage.php
index ddd11ad0..39305f01 100644
--- a/includes/specials/SpecialCachedPage.php
+++ b/includes/specials/SpecialCachedPage.php
@@ -194,5 +194,4 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
 			$this->getOutput()->setSubtitle( $this->cacheHelper->getCachedNotice( $this->getContext() ) );
 		}
 	}
-
 }
diff --git a/includes/specials/SpecialCategories.php b/includes/specials/SpecialCategories.php
index 9040c640..d01bfd7d 100644
--- a/includes/specials/SpecialCategories.php
+++ b/includes/specials/SpecialCategories.php
@@ -42,12 +42,12 @@ class SpecialCategories extends SpecialPage {
 
 		$this->getOutput()->addHTML(
 			Html::openElement( 'div', array( 'class' => 'mw-spcontent' ) ) .
-			$this->msg( 'categoriespagetext', $cap->getNumRows() )->parseAsBlock() .
-			$cap->getStartForm( $from ) .
-			$cap->getNavigationBar() .
-			'<ul>' . $cap->getBody() . '</ul>' .
-			$cap->getNavigationBar() .
-			Html::closeElement( 'div' )
+				$this->msg( 'categoriespagetext', $cap->getNumRows() )->parseAsBlock() .
+				$cap->getStartForm( $from ) .
+				$cap->getNavigationBar() .
+				'<ul>' . $cap->getBody() . '</ul>' .
+				$cap->getNavigationBar() .
+				Html::closeElement( 'div' )
 		);
 	}
 
@@ -66,7 +66,7 @@ class CategoryPager extends AlphabeticPager {
 	function __construct( IContextSource $context, $from ) {
 		parent::__construct( $context );
 		$from = str_replace( ' ', '_', $from );
-		if( $from !== '' ) {
+		if ( $from !== '' ) {
 			$from = Title::capitalize( $from, NS_CATEGORY );
 			$this->setOffset( $from );
 			$this->setIncludeOffset( true );
@@ -90,8 +90,10 @@ class CategoryPager extends AlphabeticPager {
 	function getDefaultQuery() {
 		parent::getDefaultQuery();
 		unset( $this->mDefaultQuery['from'] );
+
 		return $this->mDefaultQuery;
 	}
+
 #	protected function getOrderTypeMessages() {
 #		return array( 'abc' => 'special-categories-sort-abc',
 #			'count' => 'special-categories-sort-count' );
@@ -113,6 +115,7 @@ class CategoryPager extends AlphabeticPager {
 		}
 		$batch->execute();
 		$this->mResult->rewind();
+
 		return parent::getBody();
 	}
 
@@ -120,19 +123,26 @@ class CategoryPager extends AlphabeticPager {
 		$title = Title::makeTitle( NS_CATEGORY, $result->cat_title );
 		$titleText = Linker::link( $title, htmlspecialchars( $title->getText() ) );
 		$count = $this->msg( 'nmembers' )->numParams( $result->cat_pages )->escaped();
+
 		return Xml::tags( 'li', null, $this->getLanguage()->specialList( $titleText, $count ) ) . "\n";
 	}
 
 	public function getStartForm( $from ) {
 		global $wgScript;
 
-		return
-			Xml::tags( 'form', array( 'method' => 'get', 'action' => $wgScript ),
-				Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
-				Xml::fieldset( $this->msg( 'categories' )->text(),
-					Xml::inputLabel( $this->msg( 'categoriesfrom' )->text(),
+		return Xml::tags(
+			'form',
+			array( 'method' => 'get', 'action' => $wgScript ),
+			Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+				Xml::fieldset(
+					$this->msg( 'categories' )->text(),
+					Xml::inputLabel(
+						$this->msg( 'categoriesfrom' )->text(),
 						'from', 'from', 20, $from ) .
-					' ' .
-					Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) ) );
+						' ' .
+						Xml::submitButton( $this->msg( 'allpagessubmit' )->text()
+						)
+				)
+		);
 	}
 }
diff --git a/includes/specials/SpecialChangeEmail.php b/includes/specials/SpecialChangeEmail.php
index 59a02578..aab839fd 100644
--- a/includes/specials/SpecialChangeEmail.php
+++ b/includes/specials/SpecialChangeEmail.php
@@ -41,7 +41,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 	protected $mNewEmail;
 
 	public function __construct() {
-		parent::__construct( 'ChangeEmail' );
+		parent::__construct( 'ChangeEmail', 'editmyprivateinfo' );
 	}
 
 	/**
@@ -49,6 +49,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 	 */
 	function isListed() {
 		global $wgAuth;
+
 		return $wgAuth->allowPropChange( 'emailaddress' );
 	}
 
@@ -67,6 +68,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
 		if ( !$wgAuth->allowPropChange( 'emailaddress' ) ) {
 			$this->error( 'cannotchangeemail' );
+
 			return;
 		}
 
@@ -75,22 +77,31 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
 		if ( !$request->wasPosted() && !$user->isLoggedIn() ) {
 			$this->error( 'changeemail-no-info' );
+
 			return;
 		}
 
 		if ( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
 			$this->doReturnTo();
+
 			return;
 		}
 
 		$this->checkReadOnly();
+		$this->checkPermissions();
+
+		// This could also let someone check the current email address, so
+		// require both permissions.
+		if ( !$this->getUser()->isAllowed( 'viewmyprivateinfo' ) ) {
+			throw new PermissionsError( 'viewmyprivateinfo' );
+		}
 
 		$this->mPassword = $request->getVal( 'wpPassword' );
 		$this->mNewEmail = $request->getVal( 'wpNewEmail' );
 
 		if ( $request->wasPosted()
-			&& $user->matchEditToken( $request->getVal( 'token' ) ) )
-		{
+			&& $user->matchEditToken( $request->getVal( 'token' ) )
+		) {
 			$info = $this->attemptChange( $user, $this->mPassword, $this->mNewEmail );
 			if ( $info === true ) {
 				$this->doReturnTo();
@@ -138,15 +149,15 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
 		$this->getOutput()->addHTML(
 			Xml::fieldset( $this->msg( 'changeemail-header' )->text() ) .
-			Xml::openElement( 'form',
-				array(
-					'method' => 'post',
-					'action' => $this->getTitle()->getLocalUrl(),
-					'id' => 'mw-changeemail-form' ) ) . "\n" .
-			Html::hidden( 'token', $user->getEditToken() ) . "\n" .
-			Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" .
-			$this->msg( 'changeemail-text' )->parseAsBlock() . "\n" .
-			Xml::openElement( 'table', array( 'id' => 'mw-changeemail-table' ) ) . "\n"
+				Xml::openElement( 'form',
+					array(
+						'method' => 'post',
+						'action' => $this->getTitle()->getLocalURL(),
+						'id' => 'mw-changeemail-form' ) ) . "\n" .
+				Html::hidden( 'token', $user->getEditToken() ) . "\n" .
+				Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" .
+				$this->msg( 'changeemail-text' )->parseAsBlock() . "\n" .
+				Xml::openElement( 'table', array( 'id' => 'mw-changeemail-table' ) ) . "\n"
 		);
 		$items = array(
 			array( 'wpName', 'username', 'text', $user->getName() ),
@@ -159,17 +170,17 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
 		$this->getOutput()->addHTML(
 			$this->pretty( $items ) .
-			"\n" .
-			"<tr>\n" .
+				"\n" .
+				"<tr>\n" .
 				"<td></td>\n" .
 				'<td class="mw-input">' .
-					Xml::submitButton( $this->msg( 'changeemail-submit' )->text() ) .
-					Xml::submitButton( $this->msg( 'changeemail-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
+				Xml::submitButton( $this->msg( 'changeemail-submit' )->text() ) .
+				Xml::submitButton( $this->msg( 'changeemail-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
 				"</td>\n" .
-			"</tr>\n" .
-			Xml::closeElement( 'table' ) .
-			Xml::closeElement( 'form' ) .
-			Xml::closeElement( 'fieldset' ) . "\n"
+				"</tr>\n" .
+				Xml::closeElement( 'table' ) .
+				Xml::closeElement( 'form' ) .
+				Xml::closeElement( 'fieldset' ) . "\n"
 		);
 	}
 
@@ -181,7 +192,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 		$out = '';
 		foreach ( $fields as $list ) {
 			list( $name, $label, $type, $value ) = $list;
-			if( $type == 'text' ) {
+			if ( $type == 'text' ) {
 				$field = htmlspecialchars( $value );
 			} else {
 				$attribs = array( 'id' => $name );
@@ -203,6 +214,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 			$out .= "</td>\n";
 			$out .= "</tr>";
 		}
+
 		return $out;
 	}
 
@@ -213,22 +225,26 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 	 * @return bool|string true or string on success, false on failure
 	 */
 	protected function attemptChange( User $user, $pass, $newaddr ) {
-		global $wgAuth;
+		global $wgAuth, $wgPasswordAttemptThrottle;
 
 		if ( $newaddr != '' && !Sanitizer::validateEmail( $newaddr ) ) {
 			$this->error( 'invalidemailaddress' );
+
 			return false;
 		}
 
 		$throttleCount = LoginForm::incLoginThrottle( $user->getName() );
 		if ( $throttleCount === true ) {
-			$this->error( 'login-throttled' );
+			$lang = $this->getLanguage();
+			$this->error( array( 'login-throttled', $lang->formatDuration( $wgPasswordAttemptThrottle['seconds'] ) ) );
+
 			return false;
 		}
 
 		global $wgRequirePasswordforEmailChange;
 		if ( $wgRequirePasswordforEmailChange && !$user->checkTemporaryPassword( $pass ) && !$user->checkPassword( $pass ) ) {
 			$this->error( 'wrongpassword' );
+
 			return false;
 		}
 
@@ -241,8 +257,9 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 		if ( !$status->isGood() ) {
 			$this->getOutput()->addHTML(
 				'<p class="error">' .
-				$this->getOutput()->parseInline( $status->getWikiText( 'mailerror' ) ) .
-				'</p>' );
+					$this->getOutput()->parseInline( $status->getWikiText( 'mailerror' ) ) .
+					'</p>' );
+
 			return false;
 		}
 
diff --git a/includes/specials/SpecialChangePassword.php b/includes/specials/SpecialChangePassword.php
index e538caca..c54b5575 100644
--- a/includes/specials/SpecialChangePassword.php
+++ b/includes/specials/SpecialChangePassword.php
@@ -31,7 +31,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
 	protected $mUserName, $mOldpass, $mNewpass, $mRetype, $mDomain;
 
 	public function __construct() {
-		parent::__construct( 'ChangePassword' );
+		parent::__construct( 'ChangePassword', 'editmyprivateinfo' );
 	}
 
 	/**
@@ -52,62 +52,66 @@ class SpecialChangePassword extends UnlistedSpecialPage {
 		$this->mDomain = $request->getVal( 'wpDomain' );
 
 		$user = $this->getUser();
-		if( !$request->wasPosted() && !$user->isLoggedIn() ) {
+		if ( !$request->wasPosted() && !$user->isLoggedIn() ) {
 			$this->error( $this->msg( 'resetpass-no-info' )->text() );
+
 			return;
 		}
 
-		if( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
-			$this->doReturnTo();
+		if ( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
+			$titleObj = Title::newFromText( $request->getVal( 'returnto' ) );
+			if ( !$titleObj instanceof Title ) {
+				$titleObj = Title::newMainPage();
+			}
+			$query = $request->getVal( 'returntoquery' );
+			$this->getOutput()->redirect( $titleObj->getFullURL( $query ) );
+
 			return;
 		}
 
 		$this->checkReadOnly();
+		$this->checkPermissions();
 
-		if( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'token' ) ) ) {
+		if ( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'token' ) ) ) {
 			try {
 				$this->mDomain = $wgAuth->getDomain();
-				if( !$wgAuth->allowPasswordChange() ) {
+				if ( !$wgAuth->allowPasswordChange() ) {
 					$this->error( $this->msg( 'resetpass_forbidden' )->text() );
+
 					return;
 				}
 
 				$this->attemptReset( $this->mNewpass, $this->mRetype );
 
-				if( $user->isLoggedIn() ) {
-					$this->doReturnTo();
+				if ( $user->isLoggedIn() ) {
+					$this->getOutput()->wrapWikiMsg(
+							"<div class=\"successbox\">\n$1\n</div>",
+							'changepassword-success'
+					);
+					$this->getOutput()->returnToMain();
 				} else {
 					LoginForm::setLoginToken();
 					$token = LoginForm::getLoginToken();
 					$data = array(
-						'action'       => 'submitlogin',
-						'wpName'       => $this->mUserName,
-						'wpDomain'     => $this->mDomain,
+						'action' => 'submitlogin',
+						'wpName' => $this->mUserName,
+						'wpDomain' => $this->mDomain,
 						'wpLoginToken' => $token,
-						'wpPassword'   => $request->getVal( 'wpNewPassword' ),
+						'wpPassword' => $request->getVal( 'wpNewPassword' ),
 					) + $request->getValues( 'wpRemember', 'returnto', 'returntoquery' );
-					$login = new LoginForm( new FauxRequest( $data, true ) );
+					$login = new LoginForm( new DerivativeRequest( $request, $data, true ) );
 					$login->setContext( $this->getContext() );
 					$login->execute( null );
 				}
+
 				return;
-			} catch( PasswordError $e ) {
+			} catch ( PasswordError $e ) {
 				$this->error( $e->getMessage() );
 			}
 		}
 		$this->showForm();
 	}
 
-	function doReturnTo() {
-		$request = $this->getRequest();
-		$titleObj = Title::newFromText( $request->getVal( 'returnto' ) );
-		if ( !$titleObj instanceof Title ) {
-			$titleObj = Title::newMainPage();
-		}
-		$query = $request->getVal( 'returntoquery' );
-		$this->getOutput()->redirect( $titleObj->getFullURL( $query ) );
-	}
-
 	/**
 	 * @param $msg string
 	 */
@@ -127,12 +131,12 @@ class SpecialChangePassword extends UnlistedSpecialPage {
 			$rememberMe = '<tr>' .
 				'<td></td>' .
 				'<td class="mw-input">' .
-					Xml::checkLabel(
-						$this->msg( 'remembermypassword' )->numParams( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) )->text(),
-						'wpRemember', 'wpRemember',
-						$this->getRequest()->getCheck( 'wpRemember' ) ) .
+				Xml::checkLabel(
+					$this->msg( 'remembermypassword' )->numParams( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) )->text(),
+					'wpRemember', 'wpRemember',
+					$this->getRequest()->getCheck( 'wpRemember' ) ) .
 				'</td>' .
-			'</tr>';
+				'</tr>';
 			$submitMsg = 'resetpass_submit';
 			$oldpassMsg = 'resetpass-temp-password';
 		} else {
@@ -142,11 +146,11 @@ class SpecialChangePassword extends UnlistedSpecialPage {
 		$extraFields = array();
 		wfRunHooks( 'ChangePasswordForm', array( &$extraFields ) );
 		$prettyFields = array(
-					array( 'wpName', 'username', 'text', $this->mUserName ),
-					array( 'wpPassword', $oldpassMsg, 'password', $this->mOldpass ),
-					array( 'wpNewPassword', 'newpassword', 'password', null ),
-					array( 'wpRetype', 'retypenew', 'password', null ),
-				);
+			array( 'wpName', 'username', 'text', $this->mUserName ),
+			array( 'wpPassword', $oldpassMsg, 'password', $this->mOldpass ),
+			array( 'wpNewPassword', 'newpassword', 'password', null ),
+			array( 'wpRetype', 'retypenew', 'password', null ),
+		);
 		$prettyFields = array_merge( $prettyFields, $extraFields );
 		$hiddenFields = array(
 			'token' => $user->getEditToken(),
@@ -154,31 +158,31 @@ class SpecialChangePassword extends UnlistedSpecialPage {
 			'wpDomain' => $this->mDomain,
 		) + $this->getRequest()->getValues( 'returnto', 'returntoquery' );
 		$hiddenFieldsStr = '';
-		foreach( $hiddenFields as $fieldname => $fieldvalue ) {
+		foreach ( $hiddenFields as $fieldname => $fieldvalue ) {
 			$hiddenFieldsStr .= Html::hidden( $fieldname, $fieldvalue ) . "\n";
 		}
 		$this->getOutput()->addHTML(
 			Xml::fieldset( $this->msg( 'resetpass_header' )->text() ) .
-			Xml::openElement( 'form',
-				array(
-					'method' => 'post',
-					'action' => $this->getTitle()->getLocalUrl(),
-					'id' => 'mw-resetpass-form' ) ) . "\n" .
-			$hiddenFieldsStr .
-			$this->msg( 'resetpass_text' )->parseAsBlock() . "\n" .
-			Xml::openElement( 'table', array( 'id' => 'mw-resetpass-table' ) ) . "\n" .
-			$this->pretty( $prettyFields ) . "\n" .
-			$rememberMe .
-			"<tr>\n" .
+				Xml::openElement( 'form',
+					array(
+						'method' => 'post',
+						'action' => $this->getTitle()->getLocalURL(),
+						'id' => 'mw-resetpass-form' ) ) . "\n" .
+				$hiddenFieldsStr .
+				$this->msg( 'resetpass_text' )->parseAsBlock() . "\n" .
+				Xml::openElement( 'table', array( 'id' => 'mw-resetpass-table' ) ) . "\n" .
+				$this->pretty( $prettyFields ) . "\n" .
+				$rememberMe .
+				"<tr>\n" .
 				"<td></td>\n" .
 				'<td class="mw-input">' .
-					Xml::submitButton( $this->msg( $submitMsg )->text() ) .
-					Xml::submitButton( $this->msg( 'resetpass-submit-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
+				Xml::submitButton( $this->msg( $submitMsg )->text() ) .
+				Xml::submitButton( $this->msg( 'resetpass-submit-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
 				"</td>\n" .
-			"</tr>\n" .
-			Xml::closeElement( 'table' ) .
-			Xml::closeElement( 'form' ) .
-			Xml::closeElement( 'fieldset' ) . "\n"
+				"</tr>\n" .
+				Xml::closeElement( 'table' ) .
+				Xml::closeElement( 'form' ) .
+				Xml::closeElement( 'fieldset' ) . "\n"
 		);
 	}
 
@@ -190,7 +194,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
 		$out = '';
 		foreach ( $fields as $list ) {
 			list( $name, $label, $type, $value ) = $list;
-			if( $type == 'text' ) {
+			if ( $type == 'text' ) {
 				$field = htmlspecialchars( $value );
 			} else {
 				$attribs = array( 'id' => $name );
@@ -205,16 +209,20 @@ class SpecialChangePassword extends UnlistedSpecialPage {
 			}
 			$out .= "<tr>\n";
 			$out .= "\t<td class='mw-label'>";
-			if ( $type != 'text' )
+
+			if ( $type != 'text' ) {
 				$out .= Xml::label( $this->msg( $label )->text(), $name );
-			else
+			} else {
 				$out .= $this->msg( $label )->escaped();
+			}
+
 			$out .= "</td>\n";
 			$out .= "\t<td class='mw-input'>";
 			$out .= $field;
 			$out .= "</td>\n";
 			$out .= "</tr>";
 		}
+
 		return $out;
 	}
 
@@ -222,6 +230,8 @@ class SpecialChangePassword extends UnlistedSpecialPage {
 	 * @throws PasswordError when cannot set the new password because requirements not met.
 	 */
 	protected function attemptReset( $newpass, $retype ) {
+		global $wgPasswordAttemptThrottle;
+
 		$isSelf = ( $this->mUserName === $this->getUser()->getName() );
 		if ( $isSelf ) {
 			$user = $this->getUser();
@@ -229,18 +239,22 @@ class SpecialChangePassword extends UnlistedSpecialPage {
 			$user = User::newFromName( $this->mUserName );
 		}
 
-		if( !$user || $user->isAnon() ) {
+		if ( !$user || $user->isAnon() ) {
 			throw new PasswordError( $this->msg( 'nosuchusershort', $this->mUserName )->text() );
 		}
 
-		if( $newpass !== $retype ) {
+		if ( $newpass !== $retype ) {
 			wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'badretype' ) );
 			throw new PasswordError( $this->msg( 'badretype' )->text() );
 		}
 
 		$throttleCount = LoginForm::incLoginThrottle( $this->mUserName );
 		if ( $throttleCount === true ) {
-			throw new PasswordError( $this->msg( 'login-throttled' )->text() );
+			$lang = $this->getLanguage();
+			throw new PasswordError( $this->msg( 'login-throttled' )
+				->params( $lang->formatDuration( $wgPasswordAttemptThrottle['seconds'] ) )
+				->text()
+			);
 		}
 
 		$abortMsg = 'resetpass-abort-generic';
@@ -249,7 +263,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
 			throw new PasswordError( $this->msg( $abortMsg )->text() );
 		}
 
-		if( !$user->checkTemporaryPassword( $this->mOldpass ) && !$user->checkPassword( $this->mOldpass ) ) {
+		if ( !$user->checkTemporaryPassword( $this->mOldpass ) && !$user->checkPassword( $this->mOldpass ) ) {
 			wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'wrongpassword' ) );
 			throw new PasswordError( $this->msg( 'resetpass-wrong-oldpass' )->text() );
 		}
@@ -263,7 +277,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
 			$user->setPassword( $this->mNewpass );
 			wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'success' ) );
 			$this->mNewpass = $this->mOldpass = $this->mRetype = '';
-		} catch( PasswordError $e ) {
+		} catch ( PasswordError $e ) {
 			wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'error' ) );
 			throw new PasswordError( $e->getMessage() );
 		}
diff --git a/includes/specials/SpecialComparePages.php b/includes/specials/SpecialComparePages.php
index c3bd3fec..fc6b0c58 100644
--- a/includes/specials/SpecialComparePages.php
+++ b/includes/specials/SpecialComparePages.php
@@ -110,7 +110,7 @@ class SpecialComparePages extends SpecialPage {
 		$rev1 = self::revOrTitle( $data['Revision1'], $data['Page1'] );
 		$rev2 = self::revOrTitle( $data['Revision2'], $data['Page2'] );
 
-		if( $rev1 && $rev2 ) {
+		if ( $rev1 && $rev2 ) {
 			$revision = Revision::newFromId( $rev1 );
 
 			if ( $revision ) { // NOTE: $rev1 was already checked, should exist.
@@ -128,14 +128,15 @@ class SpecialComparePages extends SpecialPage {
 	}
 
 	public static function revOrTitle( $revision, $title ) {
-		if( $revision ) {
+		if ( $revision ) {
 			return $revision;
-		} elseif( $title ) {
+		} elseif ( $title ) {
 			$title = Title::newFromText( $title );
-			if( $title instanceof Title ) {
+			if ( $title instanceof Title ) {
 				return $title->getLatestRevID();
 			}
 		}
+
 		return null;
 	}
 
@@ -150,6 +151,7 @@ class SpecialComparePages extends SpecialPage {
 		if ( !$title->exists() ) {
 			return $this->msg( 'compare-title-not-exists' )->parseAsBlock();
 		}
+
 		return true;
 	}
 
@@ -161,6 +163,7 @@ class SpecialComparePages extends SpecialPage {
 		if ( $revision === null ) {
 			return $this->msg( 'compare-revision-not-exists' )->parseAsBlock();
 		}
+
 		return true;
 	}
 
diff --git a/includes/specials/SpecialConfirmemail.php b/includes/specials/SpecialConfirmemail.php
index 078c3865..3828b1c6 100644
--- a/includes/specials/SpecialConfirmemail.php
+++ b/includes/specials/SpecialConfirmemail.php
@@ -30,27 +30,30 @@
  * @author Rob Church <robchur@gmail.com>
  */
 class EmailConfirmation extends UnlistedSpecialPage {
-
-	/**
-	 * Constructor
-	 */
 	public function __construct() {
-		parent::__construct( 'Confirmemail' );
+		parent::__construct( 'Confirmemail', 'editmyprivateinfo' );
 	}
 
 	/**
 	 * Main execution point
 	 *
-	 * @param $code Confirmation code passed to the page
+	 * @param null|string $code Confirmation code passed to the page
 	 */
 	function execute( $code ) {
 		$this->setHeaders();
 
 		$this->checkReadOnly();
+		$this->checkPermissions();
 
-		if( $code === null || $code === '' ) {
-			if( $this->getUser()->isLoggedIn() ) {
-				if( Sanitizer::validateEmail( $this->getUser()->getEmail() ) ) {
+		// This could also let someone check the current email address, so
+		// require both permissions.
+		if ( !$this->getUser()->isAllowed( 'viewmyprivateinfo' ) ) {
+			throw new PermissionsError( 'viewmyprivateinfo' );
+		}
+
+		if ( $code === null || $code === '' ) {
+			if ( $this->getUser()->isLoggedIn() ) {
+				if ( Sanitizer::validateEmail( $this->getUser()->getEmail() ) ) {
 					$this->showRequestForm();
 				} else {
 					$this->getOutput()->addWikiMsg( 'confirmemail_noemail' );
@@ -62,7 +65,9 @@ class EmailConfirmation extends UnlistedSpecialPage {
 					array(),
 					array( 'returnto' => $this->getTitle()->getPrefixedText() )
 				);
-				$this->getOutput()->addHTML( $this->msg( 'confirmemail_needlogin' )->rawParams( $llink )->parse() );
+				$this->getOutput()->addHTML(
+					$this->msg( 'confirmemail_needlogin' )->rawParams( $llink )->parse()
+				);
 			}
 		} else {
 			$this->attemptConfirm( $code );
@@ -75,7 +80,10 @@ class EmailConfirmation extends UnlistedSpecialPage {
 	function showRequestForm() {
 		$user = $this->getUser();
 		$out = $this->getOutput();
-		if( $this->getRequest()->wasPosted() && $user->matchEditToken( $this->getRequest()->getText( 'token' ) ) ) {
+
+		if ( $this->getRequest()->wasPosted() &&
+			$user->matchEditToken( $this->getRequest()->getText( 'token' ) )
+		) {
 			$status = $user->sendConfirmationMail();
 			if ( $status->isGood() ) {
 				$out->addWikiMsg( 'confirmemail_sent' );
@@ -83,7 +91,7 @@ class EmailConfirmation extends UnlistedSpecialPage {
 				$out->addWikiText( $status->getWikiText( 'confirmemail_sendfailed' ) );
 			}
 		} else {
-			if( $user->isEmailConfirmed() ) {
+			if ( $user->isEmailConfirmed() ) {
 				// date and time are separate parameters to facilitate localisation.
 				// $time is kept for backward compat reasons.
 				// 'emailauthenticated' is also used in SpecialPreferences.php
@@ -94,14 +102,22 @@ class EmailConfirmation extends UnlistedSpecialPage {
 				$t = $lang->userTime( $emailAuthenticated, $user );
 				$out->addWikiMsg( 'emailauthenticated', $time, $d, $t );
 			}
-			if( $user->isEmailConfirmationPending() ) {
-				$out->wrapWikiMsg( "<div class=\"error mw-confirmemail-pending\">\n$1\n</div>", 'confirmemail_pending' );
+
+			if ( $user->isEmailConfirmationPending() ) {
+				$out->wrapWikiMsg(
+					"<div class=\"error mw-confirmemail-pending\">\n$1\n</div>",
+					'confirmemail_pending'
+				);
 			}
+
 			$out->addWikiMsg( 'confirmemail_text' );
-			$form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl() ) );
-			$form .= Html::hidden( 'token', $user->getEditToken() );
-			$form .= Xml::submitButton( $this->msg( 'confirmemail_send' )->text() );
-			$form .= Xml::closeElement( 'form' );
+			$form = Html::openElement(
+				'form',
+				array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL() )
+			) . "\n";
+			$form .= Html::hidden( 'token', $user->getEditToken() ) . "\n";
+			$form .= Xml::submitButton( $this->msg( 'confirmemail_send' )->text() ) . "\n";
+			$form .= Html::closeElement( 'form' ) . "\n";
 			$out->addHTML( $form );
 		}
 	}
@@ -114,20 +130,22 @@ class EmailConfirmation extends UnlistedSpecialPage {
 	 */
 	function attemptConfirm( $code ) {
 		$user = User::newFromConfirmationCode( $code );
-		if( is_object( $user ) ) {
-			$user->confirmEmail();
-			$user->saveSettings();
-			$message = $this->getUser()->isLoggedIn() ? 'confirmemail_loggedin' : 'confirmemail_success';
-			$this->getOutput()->addWikiMsg( $message );
-			if( !$this->getUser()->isLoggedIn() ) {
-				$title = SpecialPage::getTitleFor( 'Userlogin' );
-				$this->getOutput()->returnToMain( true, $title );
-			}
-		} else {
+		if ( !is_object( $user ) ) {
 			$this->getOutput()->addWikiMsg( 'confirmemail_invalid' );
+
+			return;
 		}
-	}
 
+		$user->confirmEmail();
+		$user->saveSettings();
+		$message = $this->getUser()->isLoggedIn() ? 'confirmemail_loggedin' : 'confirmemail_success';
+		$this->getOutput()->addWikiMsg( $message );
+
+		if ( !$this->getUser()->isLoggedIn() ) {
+			$title = SpecialPage::getTitleFor( 'Userlogin' );
+			$this->getOutput()->returnToMain( true, $title );
+		}
+	}
 }
 
 /**
@@ -137,16 +155,14 @@ class EmailConfirmation extends UnlistedSpecialPage {
  * @ingroup SpecialPage
  */
 class EmailInvalidation extends UnlistedSpecialPage {
-
 	public function __construct() {
-		parent::__construct( 'Invalidateemail' );
+		parent::__construct( 'Invalidateemail', 'editmyprivateinfo' );
 	}
 
 	function execute( $code ) {
 		$this->setHeaders();
-
 		$this->checkReadOnly();
-
+		$this->checkPermissions();
 		$this->attemptInvalidate( $code );
 	}
 
@@ -158,15 +174,18 @@ class EmailInvalidation extends UnlistedSpecialPage {
 	 */
 	function attemptInvalidate( $code ) {
 		$user = User::newFromConfirmationCode( $code );
-		if( is_object( $user ) ) {
-			$user->invalidateEmail();
-			$user->saveSettings();
-			$this->getOutput()->addWikiMsg( 'confirmemail_invalidated' );
-			if( !$this->getUser()->isLoggedIn() ) {
-				$this->getOutput()->returnToMain();
-			}
-		} else {
+		if ( !is_object( $user ) ) {
 			$this->getOutput()->addWikiMsg( 'confirmemail_invalid' );
+
+			return;
+		}
+
+		$user->invalidateEmail();
+		$user->saveSettings();
+		$this->getOutput()->addWikiMsg( 'confirmemail_invalidated' );
+
+		if ( !$this->getUser()->isLoggedIn() ) {
+			$this->getOutput()->returnToMain();
 		}
 	}
 }
diff --git a/includes/specials/SpecialContributions.php b/includes/specials/SpecialContributions.php
index b118059c..1fe98190 100644
--- a/includes/specials/SpecialContributions.php
+++ b/includes/specials/SpecialContributions.php
@@ -28,7 +28,6 @@
  */
 
 class SpecialContributions extends SpecialPage {
-
 	protected $opts;
 
 	public function __construct() {
@@ -65,6 +64,7 @@ class SpecialContributions extends SpecialPage {
 
 		if ( !strlen( $target ) ) {
 			$out->addHTML( $this->getForm() );
+
 			return;
 		}
 
@@ -77,11 +77,13 @@ class SpecialContributions extends SpecialPage {
 		$nt = Title::makeTitleSafe( NS_USER, $target );
 		if ( !$nt ) {
 			$out->addHTML( $this->getForm() );
+
 			return;
 		}
 		$userObj = User::newFromName( $nt->getText(), false );
 		if ( !$userObj ) {
 			$out->addHTML( $this->getForm() );
+
 			return;
 		}
 		$id = $userObj->getID();
@@ -89,11 +91,17 @@ class SpecialContributions extends SpecialPage {
 		if ( $this->opts['contribs'] != 'newbie' ) {
 			$target = $nt->getText();
 			$out->addSubtitle( $this->contributionsSub( $userObj ) );
-			$out->setHTMLTitle( $this->msg( 'pagetitle', $this->msg( 'contributions-title', $target )->plain() ) );
+			$out->setHTMLTitle( $this->msg(
+				'pagetitle',
+				$this->msg( 'contributions-title', $target )->plain()
+			) );
 			$this->getSkin()->setRelevantUser( $userObj );
 		} else {
 			$out->addSubtitle( $this->msg( 'sp-contributions-newbies-sub' ) );
-			$out->setHTMLTitle( $this->msg( 'pagetitle', $this->msg( 'sp-contributions-newbies-title' )->plain() ) );
+			$out->setHTMLTitle( $this->msg(
+				'pagetitle',
+				$this->msg( 'sp-contributions-newbies-title' )->plain()
+			) );
 		}
 
 		if ( ( $ns = $request->getVal( 'namespace', null ) ) !== null && $ns !== '' ) {
@@ -103,10 +111,8 @@ class SpecialContributions extends SpecialPage {
 		}
 
 		$this->opts['associated'] = $request->getBool( 'associated' );
-
-		$this->opts['nsInvert'] = (bool) $request->getVal( 'nsInvert' );
-
-		$this->opts['tagfilter'] = (string) $request->getVal( 'tagfilter' );
+		$this->opts['nsInvert'] = (bool)$request->getVal( 'nsInvert' );
+		$this->opts['tagfilter'] = (string)$request->getVal( 'tagfilter' );
 
 		// Allows reverts to have the bot flag in recent changes. It is just here to
 		// be passed in the form at the top of the page
@@ -152,9 +158,10 @@ class SpecialContributions extends SpecialPage {
 				$apiParams['month'] = $this->opts['month'];
 			}
 
-			$url = wfScript( 'api' ) . '?' . wfArrayToCgi( $apiParams );
+			$url = wfAppendQuery( wfScript( 'api' ), $apiParams );
 
 			$out->redirect( $url, '301' );
+
 			return;
 		}
 
@@ -162,13 +169,13 @@ class SpecialContributions extends SpecialPage {
 		$this->addFeedLinks( array( 'action' => 'feedcontributions', 'user' => $target ) );
 
 		if ( wfRunHooks( 'SpecialContributionsBeforeMainOutput', array( $id ) ) ) {
-
 			$out->addHTML( $this->getForm() );
 
 			$pager = new ContribsPager( $this->getContext(), array(
 				'target' => $target,
 				'contribs' => $this->opts['contribs'],
 				'namespace' => $this->opts['namespace'],
+				'tagfilter' => $this->opts['tagfilter'],
 				'year' => $this->opts['year'],
 				'month' => $this->opts['month'],
 				'deletedOnly' => $this->opts['deletedOnly'],
@@ -176,18 +183,20 @@ class SpecialContributions extends SpecialPage {
 				'nsInvert' => $this->opts['nsInvert'],
 				'associated' => $this->opts['associated'],
 			) );
+
 			if ( !$pager->getNumRows() ) {
 				$out->addWikiMsg( 'nocontribs', $target );
 			} else {
 				# Show a message about slave lag, if applicable
 				$lag = wfGetLB()->safeGetLag( $pager->getDatabase() );
-				if ( $lag > 0 )
+				if ( $lag > 0 ) {
 					$out->showLagWarning( $lag );
+				}
 
 				$out->addHTML(
 					'<p>' . $pager->getNavigationBar() . '</p>' .
-					$pager->getBody() .
-					'<p>' . $pager->getNavigationBar() . '</p>'
+						$pager->getBody() .
+						'<p>' . $pager->getNavigationBar() . '</p>'
 				);
 			}
 			$out->preventClickjacking( $pager->getPreventClickjacking() );
@@ -195,16 +204,16 @@ class SpecialContributions extends SpecialPage {
 			# Show the appropriate "footer" message - WHOIS tools, etc.
 			if ( $this->opts['contribs'] == 'newbie' ) {
 				$message = 'sp-contributions-footer-newbies';
-			} elseif( IP::isIPAddress( $target ) ) {
+			} elseif ( IP::isIPAddress( $target ) ) {
 				$message = 'sp-contributions-footer-anon';
-			} elseif( $userObj->isAnon() ) {
+			} elseif ( $userObj->isAnon() ) {
 				// No message for non-existing users
 				$message = '';
 			} else {
 				$message = 'sp-contributions-footer';
 			}
 
-			if( $message ) {
+			if ( $message ) {
 				if ( !$this->msg( $message, $target )->isDisabled() ) {
 					$out->wrapWikiMsg(
 						"<div class='mw-contributions-footer'>\n$1\n</div>",
@@ -218,7 +227,8 @@ class SpecialContributions extends SpecialPage {
 	 * Generates the subheading with links
 	 * @param $userObj User object for the target
 	 * @return String: appropriately-escaped HTML to be output literally
-	 * @todo FIXME: Almost the same as getSubTitle in SpecialDeletedContributions.php. Could be combined.
+	 * @todo FIXME: Almost the same as getSubTitle in SpecialDeletedContributions.php.
+	 * Could be combined.
 	 */
 	protected function contributionsSub( $userObj ) {
 		if ( $userObj->isAnon() ) {
@@ -258,18 +268,7 @@ class SpecialContributions extends SpecialPage {
 			}
 		}
 
-		// Old message 'contribsub' had one parameter, but that doesn't work for
-		// languages that want to put the "for" bit right after $user but before
-		// $links.  If 'contribsub' is around, use it for reverse compatibility,
-		// otherwise use 'contribsub2'.
-		// @todo Should this be removed at some point?
-		$oldMsg = $this->msg( 'contribsub' );
-		if ( $oldMsg->exists() ) {
-			$linksWithParentheses = $this->msg( 'parentheses' )->rawParams( $links )->escaped();
-			return $oldMsg->rawParams( "$user $linksWithParentheses" );
-		} else {
-			return $this->msg( 'contribsub2' )->rawParams( $user, $links );
-		}
+		return $this->msg( 'contribsub2' )->rawParams( $user, $links )->params( $userObj->getName() );
 	}
 
 	/**
@@ -288,7 +287,7 @@ class SpecialContributions extends SpecialPage {
 
 		if ( ( $id !== null ) || ( $id === null && IP::isIPAddress( $username ) ) ) {
 			if ( $this->getUser()->isAllowed( 'block' ) ) { # Block / Change block / Unblock links
-				if ( $target->isBlocked() ) {
+				if ( $target->isBlocked() && $target->getBlock()->getType() != Block::TYPE_AUTO ) {
 					$tools[] = Linker::linkKnown( # Change block link
 						SpecialPage::getTitleFor( 'Block', $username ),
 						$this->msg( 'change-blocklink' )->escaped()
@@ -304,14 +303,13 @@ class SpecialContributions extends SpecialPage {
 					);
 				}
 			}
+
 			# Block log link
 			$tools[] = Linker::linkKnown(
 				SpecialPage::getTitleFor( 'Log', 'block' ),
 				$this->msg( 'sp-contributions-blocklog' )->escaped(),
 				array(),
-				array(
-					'page' => $userpage->getPrefixedText()
-				)
+				array( 'page' => $userpage->getPrefixedText() )
 			);
 		}
 		# Uploads
@@ -345,6 +343,7 @@ class SpecialContributions extends SpecialPage {
 		}
 
 		wfRunHooks( 'ContributionsToolLinks', array( $id, $userpage, &$tools ) );
+
 		return $tools;
 	}
 
@@ -398,10 +397,28 @@ class SpecialContributions extends SpecialPage {
 			$this->opts['topOnly'] = false;
 		}
 
-		$form = Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'class' => 'mw-contributions-form' ) );
+		$form = Html::openElement(
+			'form',
+			array(
+				'method' => 'get',
+				'action' => $wgScript,
+				'class' => 'mw-contributions-form'
+			)
+		);
 
 		# Add hidden params for tracking except for parameters in $skipParameters
-		$skipParameters = array( 'namespace', 'nsInvert', 'deletedOnly', 'target', 'contribs', 'year', 'month', 'topOnly', 'associated' );
+		$skipParameters = array(
+			'namespace',
+			'nsInvert',
+			'deletedOnly',
+			'target',
+			'contribs',
+			'year',
+			'month',
+			'topOnly',
+			'associated'
+		);
+
 		foreach ( $this->opts as $name => $value ) {
 			if ( in_array( $name, $skipParameters ) ) {
 				continue;
@@ -412,65 +429,82 @@ class SpecialContributions extends SpecialPage {
 		$tagFilter = ChangeTags::buildTagFilterSelector( $this->opts['tagfilter'] );
 
 		if ( $tagFilter ) {
-			$filterSelection =
-				Html::rawElement( 'td', array( 'class' => 'mw-label' ), array_shift( $tagFilter ) ) .
-				Html::rawElement( 'td', array( 'class' => 'mw-input' ), implode( '&#160', $tagFilter ) );
+			$filterSelection = Html::rawElement(
+				'td',
+				array( 'class' => 'mw-label' ),
+				array_shift( $tagFilter )
+			);
+			$filterSelection .= Html::rawElement(
+				'td',
+				array( 'class' => 'mw-input' ),
+				implode( '&#160', $tagFilter )
+			);
 		} else {
 			$filterSelection = Html::rawElement( 'td', array( 'colspan' => 2 ), '' );
 		}
 
-		$targetSelection = Html::rawElement( 'td', array( 'colspan' => 2 ),
-			Xml::radioLabel(
-				$this->msg( 'sp-contributions-newbies' )->text(),
-				'contribs',
-				'newbie',
-				'newbie',
-				$this->opts['contribs'] == 'newbie',
-				array( 'class' => 'mw-input' )
-			) . '<br />' .
-			Xml::radioLabel(
-				$this->msg( 'sp-contributions-username' )->text(),
-				'contribs',
-				'user',
-				'user',
-				$this->opts['contribs'] == 'user',
-				array( 'class' => 'mw-input' )
-			) . ' ' .
-			Html::input(
-				'target',
-				$this->opts['target'],
-				'text',
-				array( 'size' => '40', 'required' => '', 'class' => 'mw-input' ) +
-					( $this->opts['target'] ? array() : array( 'autofocus' )
+		$labelNewbies = Xml::radioLabel(
+			$this->msg( 'sp-contributions-newbies' )->text(),
+			'contribs',
+			'newbie',
+			'newbie',
+			$this->opts['contribs'] == 'newbie',
+			array( 'class' => 'mw-input' )
+		);
+		$labelUsername = Xml::radioLabel(
+			$this->msg( 'sp-contributions-username' )->text(),
+			'contribs',
+			'user',
+			'user',
+			$this->opts['contribs'] == 'user',
+			array( 'class' => 'mw-input' )
+		);
+		$input = Html::input(
+			'target',
+			$this->opts['target'],
+			'text',
+			array( 'size' => '40', 'required' => '', 'class' => 'mw-input' ) +
+				( $this->opts['target'] ? array() : array( 'autofocus' )
 				)
-			) . ' '
+		);
+		$targetSelection = Html::rawElement(
+			'td',
+			array( 'colspan' => 2 ),
+			$labelNewbies . '<br />' . $labelUsername . ' ' . $input . ' '
 		);
 
-		$namespaceSelection =
-			Xml::tags( 'td', array( 'class' => 'mw-label' ),
-				Xml::label(
-					$this->msg( 'namespace' )->text(),
-					'namespace',
-					''
-				)
-			) .
-			Html::rawElement( 'td', null,
-				Html::namespaceSelector( array(
-					'selected' => $this->opts['namespace'],
-					'all'      => '',
-				), array(
-					'name'  => 'namespace',
-					'id'    => 'namespace',
+		$namespaceSelection = Xml::tags(
+			'td',
+			array( 'class' => 'mw-label' ),
+			Xml::label(
+				$this->msg( 'namespace' )->text(),
+				'namespace',
+				''
+			)
+		);
+		$namespaceSelection .= Html::rawElement(
+			'td',
+			null,
+			Html::namespaceSelector(
+				array( 'selected' => $this->opts['namespace'], 'all' => '' ),
+				array(
+					'name' => 'namespace',
+					'id' => 'namespace',
 					'class' => 'namespaceselector',
-				) ) .
-				'&#160;' .
-				Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
+				)
+			) . '&#160;' .
+				Html::rawElement(
+					'span',
+					array( 'style' => 'white-space: nowrap' ),
 					Xml::checkLabel(
 						$this->msg( 'invert' )->text(),
 						'nsInvert',
 						'nsInvert',
 						$this->opts['nsInvert'],
-						array( 'title' => $this->msg( 'tooltip-invert' )->text(), 'class' => 'mw-input' )
+						array(
+							'title' => $this->msg( 'tooltip-invert' )->text(),
+							'class' => 'mw-input'
+						)
 					) . '&#160;'
 				) .
 				Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
@@ -479,13 +513,18 @@ class SpecialContributions extends SpecialPage {
 						'associated',
 						'associated',
 						$this->opts['associated'],
-						array( 'title' => $this->msg( 'tooltip-namespace_association' )->text(), 'class' => 'mw-input' )
+						array(
+							'title' => $this->msg( 'tooltip-namespace_association' )->text(),
+							'class' => 'mw-input'
+						)
 					) . '&#160;'
 				)
-			);
+		);
 
 		if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
-			$deletedOnlyCheck = Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
+			$deletedOnlyCheck = Html::rawElement(
+				'span',
+				array( 'style' => 'white-space: nowrap' ),
 				Xml::checkLabel(
 					$this->msg( 'history-show-deleted' )->text(),
 					'deletedOnly',
@@ -498,46 +537,50 @@ class SpecialContributions extends SpecialPage {
 			$deletedOnlyCheck = '';
 		}
 
-		$extraOptions = Html::rawElement( 'td', array( 'colspan' => 2 ),
-			$deletedOnlyCheck .
-			Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
-				Xml::checkLabel(
-					$this->msg( 'sp-contributions-toponly' )->text(),
-					'topOnly',
-					'mw-show-top-only',
-					$this->opts['topOnly'],
-					array( 'class' => 'mw-input' )
-				)
+		$checkLabelTopOnly = Html::rawElement(
+			'span',
+			array( 'style' => 'white-space: nowrap' ),
+			Xml::checkLabel(
+				$this->msg( 'sp-contributions-toponly' )->text(),
+				'topOnly',
+				'mw-show-top-only',
+				$this->opts['topOnly'],
+				array( 'class' => 'mw-input' )
 			)
 		);
+		$extraOptions = Html::rawElement(
+			'td',
+			array( 'colspan' => 2 ),
+			$deletedOnlyCheck . $checkLabelTopOnly
+		);
 
 		$dateSelectionAndSubmit = Xml::tags( 'td', array( 'colspan' => 2 ),
 			Xml::dateMenu(
-				$this->opts['year'],
+				$this->opts['year'] === '' ? MWTimestamp::getInstance()->format( 'Y' ) : $this->opts['year'],
 				$this->opts['month']
 			) . ' ' .
-			Xml::submitButton(
-				$this->msg( 'sp-contributions-submit' )->text(),
-				array( 'class' => 'mw-submit' )
-			)
+				Xml::submitButton(
+					$this->msg( 'sp-contributions-submit' )->text(),
+					array( 'class' => 'mw-submit' )
+				)
 		);
 
-		$form .=
-			Xml::fieldset( $this->msg( 'sp-contributions-search' )->text() ) .
-			Html::rawElement( 'table', array( 'class' => 'mw-contributions-table' ), "\n" .
-				Html::rawElement( 'tr', array(), $targetSelection ) . "\n" .
-				Html::rawElement( 'tr', array(), $namespaceSelection ) . "\n" .
-				Html::rawElement( 'tr', array(), $filterSelection ) . "\n" .
-				Html::rawElement( 'tr', array(), $extraOptions ) . "\n" .
-				Html::rawElement( 'tr', array(), $dateSelectionAndSubmit ) . "\n"
-			);
+		$form .= Xml::fieldset( $this->msg( 'sp-contributions-search' )->text() );
+		$form .= Html::rawElement( 'table', array( 'class' => 'mw-contributions-table' ), "\n" .
+			Html::rawElement( 'tr', array(), $targetSelection ) . "\n" .
+			Html::rawElement( 'tr', array(), $namespaceSelection ) . "\n" .
+			Html::rawElement( 'tr', array(), $filterSelection ) . "\n" .
+			Html::rawElement( 'tr', array(), $extraOptions ) . "\n" .
+			Html::rawElement( 'tr', array(), $dateSelectionAndSubmit ) . "\n"
+		);
 
 		$explain = $this->msg( 'sp-contributions-explain' );
 		if ( !$explain->isBlank() ) {
 			$form .= "<p id='mw-sp-contributions-explain'>{$explain->parse()}</p>";
 		}
-		$form .= Xml::closeElement( 'fieldset' ) .
-			Xml::closeElement( 'form' );
+
+		$form .= Xml::closeElement( 'fieldset' ) . Xml::closeElement( 'form' );
+
 		return $form;
 	}
 
@@ -552,9 +595,11 @@ class SpecialContributions extends SpecialPage {
  */
 class ContribsPager extends ReverseChronologicalPager {
 	public $mDefaultDirection = true;
-	var $messages, $target;
-	var $namespace = '', $mDb;
-	var $preventClickjacking = false;
+	public $messages;
+	public $target;
+	public $namespace = '';
+	public $mDb;
+	public $preventClickjacking = false;
 
 	/**
 	 * @var array
@@ -564,7 +609,15 @@ class ContribsPager extends ReverseChronologicalPager {
 	function __construct( IContextSource $context, array $options ) {
 		parent::__construct( $context );
 
-		$msgs = array( 'uctop', 'diff', 'newarticle', 'rollbacklink', 'diff', 'hist', 'rev-delundel', 'pipe-separator' );
+		$msgs = array(
+			'diff',
+			'hist',
+			'newarticle',
+			'pipe-separator',
+			'rev-delundel',
+			'rollbacklink',
+			'uctop'
+		);
 
 		foreach ( $msgs as $msg ) {
 			$this->messages[$msg] = $this->msg( $msg )->escaped();
@@ -590,6 +643,7 @@ class ContribsPager extends ReverseChronologicalPager {
 	function getDefaultQuery() {
 		$query = parent::getDefaultQuery();
 		$query['target'] = $this->target;
+
 		return $query;
 	}
 
@@ -603,7 +657,11 @@ class ContribsPager extends ReverseChronologicalPager {
 	 * @return ResultWrapper
 	 */
 	function reallyDoQuery( $offset, $limit, $descending ) {
-		list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $descending );
+		list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo(
+			$offset,
+			$limit,
+			$descending
+		);
 		$pager = $this;
 
 		/*
@@ -624,8 +682,13 @@ class ContribsPager extends ReverseChronologicalPager {
 		 * $limit: see phpdoc above
 		 * $descending: see phpdoc above
 		 */
-		$data = array( $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds ) );
-		wfRunHooks( 'ContribsPager::reallyDoQuery', array( &$data, $pager, $offset, $limit, $descending ) );
+		$data = array( $this->mDb->select(
+			$tables, $fields, $conds, $fname, $options, $join_conds
+		) );
+		wfRunHooks(
+			'ContribsPager::reallyDoQuery',
+			array( &$data, $pager, $offset, $limit, $descending )
+		);
 
 		$result = array();
 
@@ -673,15 +736,15 @@ class ContribsPager extends ReverseChronologicalPager {
 		$join_cond['user'] = Revision::userJoinCond();
 
 		$queryInfo = array(
-			'tables'     => $tables,
-			'fields'     => array_merge(
+			'tables' => $tables,
+			'fields' => array_merge(
 				Revision::selectFields(),
 				Revision::selectUserFields(),
 				array( 'page_namespace', 'page_title', 'page_is_new',
 					'page_latest', 'page_is_redirect', 'page_len' )
 			),
-			'conds'      => $conds,
-			'options'    => array( 'USE INDEX' => array( 'revision' => $index ) ),
+			'conds' => $conds,
+			'options' => array( 'USE INDEX' => array( 'revision' => $index ) ),
 			'join_conds' => $join_cond
 		);
 
@@ -695,6 +758,7 @@ class ContribsPager extends ReverseChronologicalPager {
 		);
 
 		wfRunHooks( 'ContribsPager::getQueryInfo', array( &$this, &$queryInfo ) );
+
 		return $queryInfo;
 	}
 
@@ -709,7 +773,7 @@ class ContribsPager extends ReverseChronologicalPager {
 			# ignore local groups with the bot right
 			# @todo FIXME: Global groups may have 'bot' rights
 			$groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
-			if( count( $groupsWithBotPermission ) ) {
+			if ( count( $groupsWithBotPermission ) ) {
 				$tables[] = 'user_groups';
 				$condition[] = 'ug_group IS NULL';
 				$join_conds['user_groups'] = array(
@@ -729,12 +793,15 @@ class ContribsPager extends ReverseChronologicalPager {
 				$index = 'usertext_timestamp';
 			}
 		}
+
 		if ( $this->deletedOnly ) {
 			$condition[] = 'rev_deleted != 0';
 		}
+
 		if ( $this->topOnly ) {
 			$condition[] = 'rev_id = page_latest';
 		}
+
 		return array( $tables, $index, $condition, $join_conds );
 	}
 
@@ -746,20 +813,20 @@ class ContribsPager extends ReverseChronologicalPager {
 
 			if ( !$this->associated ) {
 				return array( "page_namespace $eq_op $selectedNS" );
-			} else {
-				$associatedNS = $this->mDb->addQuotes (
-					MWNamespace::getAssociated( $this->namespace )
-				);
-				return array(
-					"page_namespace $eq_op $selectedNS " .
-					$bool_op .
-					" page_namespace $eq_op $associatedNS"
-				);
 			}
 
-		} else {
-			return array();
+			$associatedNS = $this->mDb->addQuotes(
+				MWNamespace::getAssociated( $this->namespace )
+			);
+
+			return array(
+				"page_namespace $eq_op $selectedNS " .
+					$bool_op .
+					" page_namespace $eq_op $associatedNS"
+			);
 		}
+
+		return array();
 	}
 
 	function getIndexField() {
@@ -773,7 +840,7 @@ class ContribsPager extends ReverseChronologicalPager {
 		$batch = new LinkBatch();
 		# Give some pointers to make (last) links
 		foreach ( $this->mResult as $row ) {
-			if( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
+			if ( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
 				$revIds[] = $row->rev_parent_id;
 			}
 			if ( isset( $row->rev_id ) ) {
@@ -830,7 +897,7 @@ class ContribsPager extends ReverseChronologicalPager {
 		 */
 		wfSuppressWarnings();
 		$rev = new Revision( $row );
-		$validRevision = (bool) $rev->getId();
+		$validRevision = (bool)$rev->getId();
 		wfRestoreWarnings();
 
 		if ( $validRevision ) {
@@ -850,8 +917,8 @@ class ContribsPager extends ReverseChronologicalPager {
 				$topmarktext .= '<span class="mw-uctop">' . $this->messages['uctop'] . '</span>';
 				# Add rollback link
 				if ( !$row->page_is_new && $page->quickUserCan( 'rollback', $user )
-					&& $page->quickUserCan( 'edit', $user ) )
-				{
+					&& $page->quickUserCan( 'edit', $user )
+				) {
 					$this->preventClickjacking();
 					$topmarktext .= ' ' . Linker::generateRollback( $rev, $this->getContext() );
 				}
@@ -881,11 +948,22 @@ class ContribsPager extends ReverseChronologicalPager {
 				// For some reason rev_parent_id isn't populated for this row.
 				// Its rumoured this is true on wikipedia for some revisions (bug 34922).
 				// Next best thing is to have the total number of bytes.
-				$chardiff = ' <span class="mw-changeslist-separator">. .</span> ' . Linker::formatRevisionSize( $row->rev_len ) . ' <span class="mw-changeslist-separator">. .</span> ';
+				$chardiff = ' <span class="mw-changeslist-separator">. .</span> ';
+				$chardiff .= Linker::formatRevisionSize( $row->rev_len );
+				$chardiff .= ' <span class="mw-changeslist-separator">. .</span> ';
 			} else {
-				$parentLen = isset( $this->mParentLens[$row->rev_parent_id] ) ? $this->mParentLens[$row->rev_parent_id] : 0;
-				$chardiff = ' <span class="mw-changeslist-separator">. .</span> ' . ChangesList::showCharacterDifference(
-						$parentLen, $row->rev_len, $this->getContext() ) . ' <span class="mw-changeslist-separator">. .</span> ';
+				$parentLen = 0;
+				if ( isset( $this->mParentLens[$row->rev_parent_id] ) ) {
+					$parentLen = $this->mParentLens[$row->rev_parent_id];
+				}
+
+				$chardiff = ' <span class="mw-changeslist-separator">. .</span> ';
+				$chardiff .= ChangesList::showCharacterDifference(
+					$parentLen,
+					$row->rev_len,
+					$this->getContext()
+				);
+				$chardiff .= ' <span class="mw-changeslist-separator">. .</span> ';
 			}
 
 			$lang = $this->getLanguage();
@@ -908,7 +986,7 @@ class ContribsPager extends ReverseChronologicalPager {
 			# Show user names for /newbies as there may be different users.
 			# Note that we already excluded rows with hidden user names.
 			if ( $this->contribs == 'newbie' ) {
-				$userlink = ' . . ' . Linker::userLink( $rev->getUser(), $rev->getUserText() );
+				$userlink = ' . . ' . $lang->getDirMark() . Linker::userLink( $rev->getUser(), $rev->getUserText() );
 				$userlink .= ' ' . $this->msg( 'parentheses' )->rawParams(
 					Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' ';
 			} else {
@@ -932,16 +1010,24 @@ class ContribsPager extends ReverseChronologicalPager {
 				$del .= ' ';
 			}
 
-			$diffHistLinks = $this->msg( 'parentheses' )->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink )->escaped();
-			$ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} {$link}{$userlink} {$comment} {$topmarktext}";
+			$diffHistLinks = $this->msg( 'parentheses' )
+				->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink )
+				->escaped();
+			$ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} ";
+			$ret .= "{$link}{$userlink} {$comment} {$topmarktext}";
 
 			# Denote if username is redacted for this edit
 			if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
-				$ret .= " <strong>" . $this->msg( 'rev-deleted-user-contribs' )->escaped() . "</strong>";
+				$ret .= " <strong>" .
+					$this->msg( 'rev-deleted-user-contribs' )->escaped() .
+					"</strong>";
 			}
 
 			# Tags, if any.
-			list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $row->ts_tags, 'contributions' );
+			list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow(
+				$row->ts_tags,
+				'contributions'
+			);
 			$classes = array_merge( $classes, $newClasses );
 			$ret .= " $tagSummary";
 		}
@@ -957,6 +1043,7 @@ class ContribsPager extends ReverseChronologicalPager {
 		}
 
 		wfProfileOut( __METHOD__ );
+
 		return $ret;
 	}
 
@@ -966,7 +1053,8 @@ class ContribsPager extends ReverseChronologicalPager {
 	 */
 	function getSqlComment() {
 		if ( $this->namespace || $this->deletedOnly ) {
-			return 'contributions page filtered for namespace or RevisionDeleted edits'; // potentially slow, see CR r58153
+			// potentially slow, see CR r58153
+			return 'contributions page filtered for namespace or RevisionDeleted edits';
 		} else {
 			return 'contributions page unfiltered';
 		}
diff --git a/includes/specials/SpecialDeadendpages.php b/includes/specials/SpecialDeadendpages.php
index 6978d6bb..44137c1e 100644
--- a/includes/specials/SpecialDeadendpages.php
+++ b/includes/specials/SpecialDeadendpages.php
@@ -59,24 +59,29 @@ class DeadendPagesPage extends PageQueryPage {
 	function getQueryInfo() {
 		return array(
 			'tables' => array( 'page', 'pagelinks' ),
-			'fields' => array( 'namespace' => 'page_namespace',
-					'title' => 'page_title',
-					'value' => 'page_title'
+			'fields' => array(
+				'namespace' => 'page_namespace',
+				'title' => 'page_title',
+				'value' => 'page_title'
 			),
-			'conds' => array( 'pl_from IS NULL',
-					'page_namespace' => MWNamespace::getContentNamespaces(),
-					'page_is_redirect' => 0
+			'conds' => array(
+				'pl_from IS NULL',
+				'page_namespace' => MWNamespace::getContentNamespaces(),
+				'page_is_redirect' => 0
 			),
-			'join_conds' => array( 'pagelinks' => array( 'LEFT JOIN', array(
-					'page_id=pl_from'
-			) ) )
+			'join_conds' => array(
+				'pagelinks' => array(
+					'LEFT JOIN',
+					array( 'page_id=pl_from' )
+				)
+			)
 		);
 	}
 
 	function getOrderFields() {
 		// For some crazy reason ordering by a constant
 		// causes a filesort
-		if( count( MWNamespace::getContentNamespaces() ) > 1 ) {
+		if ( count( MWNamespace::getContentNamespaces() ) > 1 ) {
 			return array( 'page_namespace', 'page_title' );
 		} else {
 			return array( 'page_title' );
diff --git a/includes/specials/SpecialDeletedContributions.php b/includes/specials/SpecialDeletedContributions.php
index e374979e..9b9888ad 100644
--- a/includes/specials/SpecialDeletedContributions.php
+++ b/includes/specials/SpecialDeletedContributions.php
@@ -27,13 +27,20 @@
  */
 class DeletedContribsPager extends IndexPager {
 	public $mDefaultDirection = true;
-	var $messages, $target;
-	var $namespace = '', $mDb;
+	public $messages;
+	public $target;
+	public $namespace = '';
+	public $mDb;
+
+	/**
+	 * @var string Navigation bar with paging links.
+	 */
+	protected $mNavigationBar;
 
 	function __construct( IContextSource $context, $target, $namespace = false ) {
 		parent::__construct( $context );
 		$msgs = array( 'deletionlog', 'undeleteviewlink', 'diff' );
-		foreach( $msgs as $msg ) {
+		foreach ( $msgs as $msg ) {
 			$this->messages[$msg] = $this->msg( $msg )->escaped();
 		}
 		$this->target = $target;
@@ -44,6 +51,7 @@ class DeletedContribsPager extends IndexPager {
 	function getDefaultQuery() {
 		$query = parent::getDefaultQuery();
 		$query['target'] = $this->target;
+
 		return $query;
 	}
 
@@ -52,17 +60,18 @@ class DeletedContribsPager extends IndexPager {
 		$conds = array_merge( $userCond, $this->getNamespaceCond() );
 		$user = $this->getUser();
 		// Paranoia: avoid brute force searches (bug 17792)
-		if( !$user->isAllowed( 'deletedhistory' ) ) {
+		if ( !$user->isAllowed( 'deletedhistory' ) ) {
 			$conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::DELETED_USER ) . ' = 0';
-		} elseif( !$user->isAllowed( 'suppressrevision' ) ) {
+		} elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
 			$conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::SUPPRESSED_USER ) .
 				' != ' . Revision::SUPPRESSED_USER;
 		}
+
 		return array(
 			'tables' => array( 'archive' ),
 			'fields' => array(
-				'ar_rev_id', 'ar_namespace', 'ar_title', 'ar_timestamp', 'ar_comment', 'ar_minor_edit',
-				'ar_user', 'ar_user_text', 'ar_deleted'
+				'ar_rev_id', 'ar_namespace', 'ar_title', 'ar_timestamp', 'ar_comment',
+				'ar_minor_edit', 'ar_user', 'ar_user_text', 'ar_deleted'
 			),
 			'conds' => $conds,
 			'options' => array( 'USE INDEX' => $index )
@@ -107,8 +116,17 @@ class DeletedContribsPager extends IndexPager {
 		$lang = $this->getLanguage();
 		$limits = $lang->pipeList( $limitLinks );
 
-		$this->mNavigationBar = "(" . $lang->pipeList( array( $pagingLinks['first'], $pagingLinks['last'] ) ) . ") " .
-			$this->msg( 'viewprevnext' )->rawParams( $pagingLinks['prev'], $pagingLinks['next'], $limits )->escaped();
+		$firstLast = $lang->pipeList( array( $pagingLinks['first'], $pagingLinks['last'] ) );
+		$firstLast = $this->msg( 'parentheses' )->rawParams( $firstLast )->escaped();
+		$prevNext = $this->msg( 'viewprevnext' )
+			->rawParams(
+				$pagingLinks['prev'],
+				$pagingLinks['next'],
+				$limits
+			)->escaped();
+		$separator = $this->msg( 'word-separator' )->escaped();
+		$this->mNavigationBar = $firstLast . $separator . $prevNext;
+
 		return $this->mNavigationBar;
 	}
 
@@ -138,15 +156,15 @@ class DeletedContribsPager extends IndexPager {
 		$page = Title::makeTitle( $row->ar_namespace, $row->ar_title );
 
 		$rev = new Revision( array(
-				'title'      => $page,
-				'id'         => $row->ar_rev_id,
-				'comment'    => $row->ar_comment,
-				'user'       => $row->ar_user,
-				'user_text'  => $row->ar_user_text,
-				'timestamp'  => $row->ar_timestamp,
-				'minor_edit' => $row->ar_minor_edit,
-				'deleted'    => $row->ar_deleted,
-				) );
+			'title' => $page,
+			'id' => $row->ar_rev_id,
+			'comment' => $row->ar_comment,
+			'user' => $row->ar_user,
+			'user_text' => $row->ar_user_text,
+			'timestamp' => $row->ar_timestamp,
+			'minor_edit' => $row->ar_minor_edit,
+			'deleted' => $row->ar_deleted,
+		) );
 
 		$undelete = SpecialPage::getTitleFor( 'Undelete' );
 
@@ -168,7 +186,7 @@ class DeletedContribsPager extends IndexPager {
 
 		$user = $this->getUser();
 
-		if( $user->isAllowed( 'deletedtext' ) ) {
+		if ( $user->isAllowed( 'deletedtext' ) ) {
 			$last = Linker::linkKnown(
 				$undelete,
 				$this->messages['diff'],
@@ -184,9 +202,10 @@ class DeletedContribsPager extends IndexPager {
 		}
 
 		$comment = Linker::revComment( $rev );
-		$date = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user ) );
+		$date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user );
+		$date = htmlspecialchars( $date );
 
-		if( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+		if ( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
 			$link = $date; // unusable link
 		} else {
 			$link = Linker::linkKnown(
@@ -200,7 +219,7 @@ class DeletedContribsPager extends IndexPager {
 			);
 		}
 		// Style deleted items
-		if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+		if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
 			$link = '<span class="history-deleted">' . $link . '</span>';
 		}
 
@@ -210,7 +229,7 @@ class DeletedContribsPager extends IndexPager {
 			array( 'class' => 'mw-changeslist-title' )
 		);
 
-		if( $rev->isMinor() ) {
+		if ( $rev->isMinor() ) {
 			$mflag = ChangesList::flag( 'minor' );
 		} else {
 			$mflag = '';
@@ -218,7 +237,9 @@ class DeletedContribsPager extends IndexPager {
 
 		// Revision delete link
 		$del = Linker::getRevDeleteLink( $user, $rev, $page );
-		if ( $del ) $del .= ' ';
+		if ( $del ) {
+			$del .= ' ';
+		}
 
 		$tools = Html::rawElement(
 			'span',
@@ -231,13 +252,14 @@ class DeletedContribsPager extends IndexPager {
 		$ret = "{$del}{$link} {$tools} {$separator} {$mflag} {$pagelink} {$comment}";
 
 		# Denote if username is redacted for this edit
-		if( $rev->isDeleted( Revision::DELETED_USER ) ) {
+		if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
 			$ret .= " <strong>" . $this->msg( 'rev-deleted-user-contribs' )->escaped() . "</strong>";
 		}
 
 		$ret = Html::rawElement( 'li', array(), $ret ) . "\n";
 
 		wfProfileOut( __METHOD__ );
+
 		return $ret;
 	}
 
@@ -254,7 +276,7 @@ class DeletedContribsPager extends IndexPager {
 class DeletedContributionsPage extends SpecialPage {
 	function __construct() {
 		parent::__construct( 'DeletedContributions', 'deletedhistory',
-		/*listed*/ true, /*function*/ false, /*file*/ false );
+		/*listed*/true, /*function*/false, /*file*/false );
 	}
 
 	/**
@@ -265,6 +287,7 @@ class DeletedContributionsPage extends SpecialPage {
 	 */
 	function execute( $par ) {
 		global $wgQueryPageDefaultLimit;
+
 		$this->setHeaders();
 		$this->outputHeader();
 
@@ -272,6 +295,7 @@ class DeletedContributionsPage extends SpecialPage {
 
 		if ( !$this->userCanExecute( $user ) ) {
 			$this->displayRestrictionError();
+
 			return;
 		}
 
@@ -289,6 +313,7 @@ class DeletedContributionsPage extends SpecialPage {
 
 		if ( !strlen( $target ) ) {
 			$out->addHTML( $this->getForm( '' ) );
+
 			return;
 		}
 
@@ -298,6 +323,7 @@ class DeletedContributionsPage extends SpecialPage {
 		$userObj = User::newFromName( $target, false );
 		if ( !$userObj ) {
 			$out->addHTML( $this->getForm( '' ) );
+
 			return;
 		}
 		$this->getSkin()->setRelevantUser( $userObj );
@@ -316,28 +342,33 @@ class DeletedContributionsPage extends SpecialPage {
 		$pager = new DeletedContribsPager( $this->getContext(), $target, $options['namespace'] );
 		if ( !$pager->getNumRows() ) {
 			$out->addWikiMsg( 'nocontribs' );
+
 			return;
 		}
 
 		# Show a message about slave lag, if applicable
 		$lag = wfGetLB()->safeGetLag( $pager->getDatabase() );
-		if( $lag > 0 )
+		if ( $lag > 0 ) {
 			$out->showLagWarning( $lag );
+		}
 
 		$out->addHTML(
 			'<p>' . $pager->getNavigationBar() . '</p>' .
-			$pager->getBody() .
-			'<p>' . $pager->getNavigationBar() . '</p>' );
+				$pager->getBody() .
+				'<p>' . $pager->getNavigationBar() . '</p>' );
 
 		# If there were contributions, and it was a valid user or IP, show
 		# the appropriate "footer" message - WHOIS tools, etc.
-		if( $target != 'newbies' ) {
-			$message = IP::isIPAddress( $target )
-				? 'sp-contributions-footer-anon'
-				: 'sp-contributions-footer';
-
-			if( !$this->msg( $message )->isDisabled() ) {
-				$out->wrapWikiMsg( "<div class='mw-contributions-footer'>\n$1\n</div>", array( $message, $target ) );
+		if ( $target != 'newbies' ) {
+			$message = IP::isIPAddress( $target ) ?
+				'sp-contributions-footer-anon' :
+				'sp-contributions-footer';
+
+			if ( !$this->msg( $message )->isDisabled() ) {
+				$out->wrapWikiMsg(
+					"<div class='mw-contributions-footer'>\n$1\n</div>",
+					array( $message, $target )
+				);
 			}
 		}
 	}
@@ -358,11 +389,12 @@ class DeletedContributionsPage extends SpecialPage {
 		$nt = $userObj->getUserPage();
 		$id = $userObj->getID();
 		$talk = $nt->getTalkPage();
-		if( $talk ) {
+		if ( $talk ) {
 			# Talk page link
 			$tools[] = Linker::link( $talk, $this->msg( 'sp-contributions-talk' )->escaped() );
-			if( ( $id !== null ) || ( $id === null && IP::isIPAddress( $nt->getText() ) ) ) {
-				if( $this->getUser()->isAllowed( 'block' ) ) { # Block / Change block / Unblock links
+			if ( ( $id !== null ) || ( $id === null && IP::isIPAddress( $nt->getText() ) ) ) {
+				# Block / Change block / Unblock links
+				if ( $this->getUser()->isAllowed( 'block' ) ) {
 					if ( $userObj->isBlocked() ) {
 						$tools[] = Linker::linkKnown( # Change block link
 							SpecialPage::getTitleFor( 'Block', $nt->getDBkey() ),
@@ -377,8 +409,8 @@ class DeletedContributionsPage extends SpecialPage {
 								'ip' => $nt->getDBkey()
 							)
 						);
-					}
-					else { # User is not blocked
+					} else {
+						# User is not blocked
 						$tools[] = Linker::linkKnown( # Block link
 							SpecialPage::getTitleFor( 'Block', $nt->getDBkey() ),
 							$this->msg( 'blocklink' )->escaped()
@@ -419,7 +451,7 @@ class DeletedContributionsPage extends SpecialPage {
 			# Add a link to change user rights for privileged users
 			$userrightsPage = new UserrightsPage();
 			$userrightsPage->setContext( $this->getContext() );
-			if( $userrightsPage->userCanChangeRights( $userObj ) ) {
+			if ( $userrightsPage->userCanChangeRights( $userObj ) ) {
 				$tools[] = Linker::linkKnown(
 					SpecialPage::getTitleFor( 'Userrights', $nt->getDBkey() ),
 					$this->msg( 'sp-contributions-userrights' )->escaped()
@@ -432,7 +464,8 @@ class DeletedContributionsPage extends SpecialPage {
 
 			// Show a note if the user is blocked and display the last block log entry.
 			if ( $userObj->isBlocked() ) {
-				$out = $this->getOutput(); // LogEventsList::showLogExtract() wants the first parameter by ref
+				// LogEventsList::showLogExtract() wants the first parameter by ref
+				$out = $this->getOutput();
 				LogEventsList::showLogExtract(
 					$out,
 					'block',
@@ -451,16 +484,7 @@ class DeletedContributionsPage extends SpecialPage {
 			}
 		}
 
-		// Old message 'contribsub' had one parameter, but that doesn't work for
-		// languages that want to put the "for" bit right after $user but before
-		// $links.  If 'contribsub' is around, use it for reverse compatibility,
-		// otherwise use 'contribsub2'.
-		$oldMsg = $this->msg( 'contribsub' );
-		if ( $oldMsg->exists() ) {
-			return $oldMsg->rawParams( "$user ($links)" );
-		} else {
-			return $this->msg( 'contribsub2' )->rawParams( $user, $links );
-		}
+		return $this->msg( 'contribsub2' )->rawParams( $user, $links )->params( $userObj->getName() );
 	}
 
 	/**
@@ -499,27 +523,38 @@ class DeletedContributionsPage extends SpecialPage {
 			$f .= "\t" . Html::hidden( $name, $value ) . "\n";
 		}
 
-		$f .= Xml::openElement( 'fieldset' ) .
-			Xml::element( 'legend', array(), $this->msg( 'sp-contributions-search' )->text() ) .
-			Xml::tags( 'label', array( 'for' => 'target' ), $this->msg( 'sp-contributions-username' )->parse() ) . ' ' .
-			Html::input( 'target', $options['target'], 'text', array(
+		$f .= Xml::openElement( 'fieldset' );
+		$f .= Xml::element( 'legend', array(), $this->msg( 'sp-contributions-search' )->text() );
+		$f .= Xml::tags(
+			'label',
+			array( 'for' => 'target' ),
+			$this->msg( 'sp-contributions-username' )->parse()
+		) . ' ';
+		$f .= Html::input(
+			'target',
+			$options['target'],
+			'text',
+			array(
 				'size' => '20',
 				'required' => ''
-			) + ( $options['target'] ? array() : array( 'autofocus' ) ) ) . ' '.
-			Html::namespaceSelector(
-				array(
-					'selected' => $options['namespace'],
-					'all' => '',
-					'label' => $this->msg( 'namespace' )->text()
-				), array(
-					'name'  => 'namespace',
-					'id'    => 'namespace',
-					'class' => 'namespaceselector',
-				)
-			) . ' ' .
-			Xml::submitButton( $this->msg( 'sp-contributions-submit' )->text() ) .
-			Xml::closeElement( 'fieldset' ) .
-			Xml::closeElement( 'form' );
+			) + ( $options['target'] ? array() : array( 'autofocus' ) )
+		) . ' ';
+		$f .= Html::namespaceSelector(
+			array(
+				'selected' => $options['namespace'],
+				'all' => '',
+				'label' => $this->msg( 'namespace' )->text()
+			),
+			array(
+				'name' => 'namespace',
+				'id' => 'namespace',
+				'class' => 'namespaceselector',
+			)
+		) . ' ';
+		$f .= Xml::submitButton( $this->msg( 'sp-contributions-submit' )->text() );
+		$f .= Xml::closeElement( 'fieldset' );
+		$f .= Xml::closeElement( 'form' );
+
 		return $f;
 	}
 
diff --git a/includes/specials/SpecialDisambiguations.php b/includes/specials/SpecialDisambiguations.php
deleted file mode 100644
index 2126ca52..00000000
--- a/includes/specials/SpecialDisambiguations.php
+++ /dev/null
@@ -1,165 +0,0 @@
-<?php
-/**
- * Implements Special:Disambiguations
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup SpecialPage
- */
-
-/**
- * A special page that lists pages containing links to disambiguations pages
- *
- * @ingroup SpecialPage
- */
-class DisambiguationsPage extends QueryPage {
-
-	function __construct( $name = 'Disambiguations' ) {
-		parent::__construct( $name );
-	}
-
-	function isExpensive() {
-		return true;
-	}
-
-	function isSyndicated() {
-		return false;
-	}
-
-	function getPageHeader() {
-		return $this->msg( 'disambiguations-text' )->parseAsBlock();
-	}
-
-	/**
-	 * @return string|bool False on failure
-	 */
-	function getQueryFromLinkBatch() {
-		$dbr = wfGetDB( DB_SLAVE );
-		$dMsgText = $this->msg( 'disambiguationspage' )->inContentLanguage()->text();
-		$linkBatch = new LinkBatch;
-
-		# If the text can be treated as a title, use it verbatim.
-		# Otherwise, pull the titles from the links table
-		$dp = Title::newFromText( $dMsgText );
-		if( $dp ) {
-			if( $dp->getNamespace() != NS_TEMPLATE ) {
-				# @todo FIXME: We assume the disambiguation message is a template but
-				# the page can potentially be from another namespace :/
-				wfDebug( "Mediawiki:disambiguationspage message does not refer to a template!\n" );
-			}
-			$linkBatch->addObj( $dp );
-		} else {
-				# Get all the templates linked from the Mediawiki:Disambiguationspage
-				$disPageObj = Title::makeTitleSafe( NS_MEDIAWIKI, 'disambiguationspage' );
-				$res = $dbr->select(
-					array( 'pagelinks', 'page' ),
-					'pl_title',
-					array( 'page_id = pl_from',
-						'pl_namespace' => NS_TEMPLATE,
-						'page_namespace' => $disPageObj->getNamespace(),
-						'page_title' => $disPageObj->getDBkey()
-					), __METHOD__ );
-
-				foreach ( $res as $row ) {
-					$linkBatch->addObj( Title::makeTitle( NS_TEMPLATE, $row->pl_title ));
-				}
-		}
-		$set = $linkBatch->constructSet( 'tl', $dbr );
-
-		if( $set === false ) {
-			# We must always return a valid SQL query, but this way
-			# the DB will always quickly return an empty result
-			$set = 'FALSE';
-			wfDebug( "Mediawiki:disambiguationspage message does not link to any templates!\n" );
-		}
-		return $set;
-	}
-
-	function getQueryInfo() {
-		// @todo FIXME: What are pagelinks and p2 doing here?
-		return array (
-			'tables' => array(
-				'templatelinks',
-				'p1' => 'page',
-				'pagelinks',
-				'p2' => 'page'
-			),
-			'fields' => array(
-				'namespace' => 'p1.page_namespace',
-				'title' => 'p1.page_title',
-				'value' => 'pl_from'
-			),
-			'conds' => array(
-				$this->getQueryFromLinkBatch(),
-				'p1.page_id = tl_from',
-				'pl_namespace = p1.page_namespace',
-				'pl_title = p1.page_title',
-				'p2.page_id = pl_from',
-				'p2.page_namespace' => MWNamespace::getContentNamespaces()
-			)
-		);
-	}
-
-	function getOrderFields() {
-		return array( 'tl_namespace', 'tl_title', 'value' );
-	}
-
-	function sortDescending() {
-		return false;
-	}
-
-	/**
-	 * Fetch links and cache their existence
-	 *
-	 * @param $db DatabaseBase
-	 * @param $res
-	 */
-	function preprocessResults( $db, $res ) {
-		if ( !$res->numRows() ) {
-			return;
-		}
-
-		$batch = new LinkBatch;
-		foreach ( $res as $row ) {
-			$batch->add( $row->namespace, $row->title );
-		}
-		$batch->execute();
-
-		$res->seek( 0 );
-	}
-
-	function formatResult( $skin, $result ) {
-		$title = Title::newFromID( $result->value );
-		$dp = Title::makeTitle( $result->namespace, $result->title );
-
-		$from = Linker::link( $title );
-		$edit = Linker::link(
-			$title,
-			$this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->escaped(),
-			array(),
-			array( 'redirect' => 'no', 'action' => 'edit' )
-		);
-		$arr = $this->getLanguage()->getArrow();
-		$to = Linker::link( $dp );
-
-		return "$from $edit $arr $to";
-	}
-
-	protected function getGroupName() {
-		return 'pages';
-	}
-}
diff --git a/includes/specials/SpecialDoubleRedirects.php b/includes/specials/SpecialDoubleRedirects.php
index 5a5d749c..c364f70f 100644
--- a/includes/specials/SpecialDoubleRedirects.php
+++ b/includes/specials/SpecialDoubleRedirects.php
@@ -28,7 +28,6 @@
  * @ingroup SpecialPage
  */
 class DoubleRedirectsPage extends QueryPage {
-
 	function __construct( $name = 'DoubleRedirects' ) {
 		parent::__construct( $name );
 	}
@@ -52,8 +51,8 @@ class DoubleRedirectsPage extends QueryPage {
 	function reallyGetQueryInfo( $namespace = null, $title = null ) {
 		$limitToTitle = !( $namespace === null && $title === null );
 		$dbr = wfGetDB( DB_SLAVE );
-		$retval = array (
-			'tables' => array (
+		$retval = array(
+			'tables' => array(
 				'ra' => 'redirect',
 				'rb' => 'redirect',
 				'pa' => 'page',
@@ -91,10 +90,12 @@ class DoubleRedirectsPage extends QueryPage {
 				'rb.rd_from = pb.page_id',
 			)
 		);
+
 		if ( $limitToTitle ) {
 			$retval['conds']['pa.page_namespace'] = $namespace;
 			$retval['conds']['pa.page_title'] = $title;
 		}
+
 		return $retval;
 	}
 
@@ -103,9 +104,14 @@ class DoubleRedirectsPage extends QueryPage {
 	}
 
 	function getOrderFields() {
-		return array ( 'ra.rd_namespace', 'ra.rd_title' );
+		return array( 'ra.rd_namespace', 'ra.rd_title' );
 	}
 
+	/**
+	 * @param Skin $skin
+	 * @param object $result Result row
+	 * @return string
+	 */
 	function formatResult( $skin, $result ) {
 		$titleA = Title::makeTitle( $result->namespace, $result->title );
 
@@ -116,10 +122,17 @@ class DoubleRedirectsPage extends QueryPage {
 		// using the filter of reallyGetQueryInfo.
 		if ( $result && !isset( $result->nsb ) ) {
 			$dbr = wfGetDB( DB_SLAVE );
-			$qi = $this->reallyGetQueryInfo( $result->namespace,
-					$result->title );
-			$res = $dbr->select( $qi['tables'], $qi['fields'],
-					$qi['conds'], __METHOD__ );
+			$qi = $this->reallyGetQueryInfo(
+				$result->namespace,
+				$result->title
+			);
+			$res = $dbr->select(
+				$qi['tables'],
+				$qi['fields'],
+				$qi['conds'],
+				__METHOD__
+			);
+
 			if ( $res ) {
 				$result = $dbr->fetchObject( $res );
 			}
@@ -160,7 +173,7 @@ class DoubleRedirectsPage extends QueryPage {
 		$lang = $this->getLanguage();
 		$arr = $lang->getArrow() . $lang->getDirMark();
 
-		return( "{$linkA} {$edit} {$arr} {$linkB} {$arr} {$linkC}" );
+		return ( "{$linkA} {$edit} {$arr} {$linkB} {$arr} {$linkC}" );
 	}
 
 	protected function getGroupName() {
diff --git a/includes/specials/SpecialEditWatchlist.php b/includes/specials/SpecialEditWatchlist.php
index d2838e01..501552e9 100644
--- a/includes/specials/SpecialEditWatchlist.php
+++ b/includes/specials/SpecialEditWatchlist.php
@@ -35,7 +35,6 @@
  * @author Rob Church <robchur@gmail.com>
  */
 class SpecialEditWatchlist extends UnlistedSpecialPage {
-
 	/**
 	 * Editing modes
 	 */
@@ -50,7 +49,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 	private $badItems = array();
 
 	public function __construct() {
-		parent::__construct( 'EditWatchlist' );
+		parent::__construct( 'EditWatchlist', 'editmywatchlist' );
 	}
 
 	/**
@@ -64,7 +63,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 		$out = $this->getOutput();
 
 		# Anons don't get a watchlist
-		if( $this->getUser()->isAnon() ) {
+		if ( $this->getUser()->isAnon() ) {
 			$out->setPageTitle( $this->msg( 'watchnologin' ) );
 			$llink = Linker::linkKnown(
 				SpecialPage::getTitleFor( 'Userlogin' ),
@@ -73,6 +72,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 				array( 'returnto' => $this->getTitle()->getPrefixedText() )
 			);
 			$out->addHTML( $this->msg( 'watchlistanontext' )->rawParams( $llink )->parse() );
+
 			return;
 		}
 
@@ -81,20 +81,20 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 
 		$this->outputHeader();
 
-		$out->addSubtitle( $this->msg( 'watchlistfor2', $this->getUser()->getName()
-			)->rawParams( SpecialEditWatchlist::buildTools( null ) ) );
+		$out->addSubtitle( $this->msg( 'watchlistfor2', $this->getUser()->getName() )
+			->rawParams( SpecialEditWatchlist::buildTools( null ) ) );
 
 		# B/C: $mode used to be waaay down the parameter list, and the first parameter
 		# was $wgUser
-		if( $mode instanceof User ) {
+		if ( $mode instanceof User ) {
 			$args = func_get_args();
-			if( count( $args >= 4 ) ) {
+			if ( count( $args ) >= 4 ) {
 				$mode = $args[3];
 			}
 		}
 		$mode = self::getMode( $this->getRequest(), $mode );
 
-		switch( $mode ) {
+		switch ( $mode ) {
 			case self::EDIT_CLEAR:
 				// The "Clear" link scared people too much.
 				// Pass on to the raw editor, from which it's very easy to clear.
@@ -102,7 +102,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 			case self::EDIT_RAW:
 				$out->setPageTitle( $this->msg( 'watchlistedit-raw-title' ) );
 				$form = $this->getRawForm();
-				if( $form->show() ) {
+				if ( $form->show() ) {
 					$out->addHTML( $this->successMessage );
 					$out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
 				}
@@ -112,7 +112,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 			default:
 				$out->setPageTitle( $this->msg( 'watchlistedit-normal-title' ) );
 				$form = $this->getNormalForm();
-				if( $form->show() ) {
+				if ( $form->show() ) {
 					$out->addHTML( $this->successMessage );
 					$out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
 				} elseif ( $this->toc !== false ) {
@@ -131,15 +131,17 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 	 */
 	private function extractTitles( $list ) {
 		$list = explode( "\n", trim( $list ) );
-		if( !is_array( $list ) ) {
+		if ( !is_array( $list ) ) {
 			return array();
 		}
+
 		$titles = array();
-		foreach( $list as $text ) {
+
+		foreach ( $list as $text ) {
 			$text = trim( $text );
-			if( strlen( $text ) > 0 ) {
+			if ( strlen( $text ) > 0 ) {
 				$title = Title::newFromText( $text );
-				if( $title instanceof Title && $title->isWatchable() ) {
+				if ( $title instanceof Title && $title->isWatchable() ) {
 					$titles[] = $title;
 				}
 			}
@@ -148,9 +150,11 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 		GenderCache::singleton()->doTitlesArray( $titles );
 
 		$list = array();
-		foreach( $titles as $title ) {
+		/** @var Title $title */
+		foreach ( $titles as $title ) {
 			$list[] = $title->getPrefixedText();
 		}
+
 		return array_unique( $list );
 	}
 
@@ -158,44 +162,45 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 		$wanted = $this->extractTitles( $data['Titles'] );
 		$current = $this->getWatchlist();
 
-		if( count( $wanted ) > 0 ) {
+		if ( count( $wanted ) > 0 ) {
 			$toWatch = array_diff( $wanted, $current );
 			$toUnwatch = array_diff( $current, $wanted );
 			$this->watchTitles( $toWatch );
 			$this->unwatchTitles( $toUnwatch );
 			$this->getUser()->invalidateCache();
 
-			if( count( $toWatch ) > 0 || count( $toUnwatch ) > 0 ) {
+			if ( count( $toWatch ) > 0 || count( $toUnwatch ) > 0 ) {
 				$this->successMessage = $this->msg( 'watchlistedit-raw-done' )->parse();
 			} else {
 				return false;
 			}
 
-			if( count( $toWatch ) > 0 ) {
+			if ( count( $toWatch ) > 0 ) {
 				$this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-added'
-					)->numParams( count( $toWatch ) )->parse();
+				)->numParams( count( $toWatch ) )->parse();
 				$this->showTitles( $toWatch, $this->successMessage );
 			}
 
-			if( count( $toUnwatch ) > 0 ) {
+			if ( count( $toUnwatch ) > 0 ) {
 				$this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-removed'
-					)->numParams( count( $toUnwatch ) )->parse();
+				)->numParams( count( $toUnwatch ) )->parse();
 				$this->showTitles( $toUnwatch, $this->successMessage );
 			}
 		} else {
 			$this->clearWatchlist();
 			$this->getUser()->invalidateCache();
 
-			if( count( $current ) > 0 ) {
+			if ( count( $current ) > 0 ) {
 				$this->successMessage = $this->msg( 'watchlistedit-raw-done' )->parse();
 			} else {
 				return false;
 			}
 
-			$this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-removed'
-				)->numParams( count( $current ) )->parse();
+			$this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-removed' )
+				->numParams( count( $current ) )->parse();
 			$this->showTitles( $current, $this->successMessage );
 		}
+
 		return true;
 	}
 
@@ -212,29 +217,35 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 		$talk = $this->msg( 'talkpagelinktext' )->escaped();
 		// Do a batch existence check
 		$batch = new LinkBatch();
-		foreach( $titles as $title ) {
-			if( !$title instanceof Title ) {
+		foreach ( $titles as $title ) {
+			if ( !$title instanceof Title ) {
 				$title = Title::newFromText( $title );
 			}
-			if( $title instanceof Title ) {
+
+			if ( $title instanceof Title ) {
 				$batch->addObj( $title );
 				$batch->addObj( $title->getTalkPage() );
 			}
 		}
+
 		$batch->execute();
+
 		// Print out the list
 		$output .= "<ul>\n";
-		foreach( $titles as $title ) {
-			if( !$title instanceof Title ) {
+
+		foreach ( $titles as $title ) {
+			if ( !$title instanceof Title ) {
 				$title = Title::newFromText( $title );
 			}
-			if( $title instanceof Title ) {
+
+			if ( $title instanceof Title ) {
 				$output .= "<li>"
 					. Linker::link( $title )
 					. ' (' . Linker::link( $title->getTalkPage(), $talk )
 					. ")</li>\n";
 			}
 		}
+
 		$output .= "</ul>\n";
 	}
 
@@ -247,6 +258,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 	private function getWatchlist() {
 		$list = array();
 		$dbr = wfGetDB( DB_MASTER );
+
 		$res = $dbr->select(
 			'watchlist',
 			array(
@@ -256,10 +268,12 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 			),
 			__METHOD__
 		);
-		if( $res->numRows() > 0 ) {
+
+		if ( $res->numRows() > 0 ) {
 			$titles = array();
 			foreach ( $res as $row ) {
 				$title = Title::makeTitleSafe( $row->wl_namespace, $row->wl_title );
+
 				if ( $this->checkTitle( $title, $row->wl_namespace, $row->wl_title )
 					&& !$title->isTalkPage()
 				) {
@@ -270,11 +284,13 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 
 			GenderCache::singleton()->doTitlesArray( $titles );
 
-			foreach( $titles as $title ) {
+			foreach ( $titles as $title ) {
 				$list[] = $title->getPrefixedText();
 			}
 		}
+
 		$this->cleanupWatchlist();
+
 		return $list;
 	}
 
@@ -297,6 +313,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 		);
 
 		$lb = new LinkBatch();
+
 		foreach ( $res as $row ) {
 			$lb->add( $row->wl_namespace, $row->wl_title );
 			if ( !MWNamespace::isTalk( $row->wl_namespace ) ) {
@@ -305,6 +322,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 		}
 
 		$lb->execute();
+
 		return $titles;
 	}
 
@@ -324,12 +342,14 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 		) {
 			$title = false; // unrecoverable
 		}
+
 		if ( !$title
 			|| $title->getNamespace() != $namespace
 			|| $title->getDBkey() != $dbKey
 		) {
 			$this->badItems[] = array( $title, $namespace, $dbKey );
 		}
+
 		return (bool)$title;
 	}
 
@@ -337,16 +357,17 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 	 * Attempts to clean up broken items
 	 */
 	private function cleanupWatchlist() {
-		if( !count( $this->badItems ) ) {
+		if ( !count( $this->badItems ) ) {
 			return; //nothing to do
 		}
+
 		$dbw = wfGetDB( DB_MASTER );
 		$user = $this->getUser();
+
 		foreach ( $this->badItems as $row ) {
 			list( $title, $namespace, $dbKey ) = $row;
-			wfDebug( "User {$user->getName()} has broken watchlist item ns($namespace):$dbKey, "
-				. ( $title ? 'cleaning up' : 'deleting' ) . ".\n"
-			);
+			$action = $title ? 'cleaning up' : 'deleting';
+			wfDebug( "User {$user->getName()} has broken watchlist item ns($namespace):$dbKey, $action.\n" );
 
 			$dbw->delete( 'watchlist',
 				array(
@@ -387,11 +408,13 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 	private function watchTitles( $titles ) {
 		$dbw = wfGetDB( DB_MASTER );
 		$rows = array();
-		foreach( $titles as $title ) {
-			if( !$title instanceof Title ) {
+
+		foreach ( $titles as $title ) {
+			if ( !$title instanceof Title ) {
 				$title = Title::newFromText( $title );
 			}
-			if( $title instanceof Title ) {
+
+			if ( $title instanceof Title ) {
 				$rows[] = array(
 					'wl_user' => $this->getUser()->getId(),
 					'wl_namespace' => MWNamespace::getSubject( $title->getNamespace() ),
@@ -406,6 +429,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 				);
 			}
 		}
+
 		$dbw->insert( 'watchlist', $rows, __METHOD__, 'IGNORE' );
 	}
 
@@ -419,11 +443,13 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 	 */
 	private function unwatchTitles( $titles ) {
 		$dbw = wfGetDB( DB_MASTER );
-		foreach( $titles as $title ) {
-			if( !$title instanceof Title ) {
+
+		foreach ( $titles as $title ) {
+			if ( !$title instanceof Title ) {
 				$title = Title::newFromText( $title );
 			}
-			if( $title instanceof Title ) {
+
+			if ( $title instanceof Title ) {
 				$dbw->delete(
 					'watchlist',
 					array(
@@ -433,6 +459,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 					),
 					__METHOD__
 				);
+
 				$dbw->delete(
 					'watchlist',
 					array(
@@ -442,6 +469,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 					),
 					__METHOD__
 				);
+
 				$page = WikiPage::factory( $title );
 				wfRunHooks( 'UnwatchArticleComplete', array( $this->getUser(), &$page ) );
 			}
@@ -451,15 +479,16 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 	public function submitNormal( $data ) {
 		$removed = array();
 
-		foreach( $data as $titles ) {
+		foreach ( $data as $titles ) {
 			$this->unwatchTitles( $titles );
 			$removed = array_merge( $removed, $titles );
 		}
 
-		if( count( $removed ) > 0 ) {
+		if ( count( $removed ) > 0 ) {
 			$this->successMessage = $this->msg( 'watchlistedit-normal-done'
-				)->numParams( count( $removed ) )->parse();
+			)->numParams( count( $removed ) )->parse();
 			$this->showTitles( $removed, $this->successMessage );
+
 			return true;
 		} else {
 			return false;
@@ -477,7 +506,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 		$fields = array();
 		$count = 0;
 
-		foreach( $this->getWatchlistInfo() as $namespace => $pages ) {
+		foreach ( $this->getWatchlistInfo() as $namespace => $pages ) {
 			if ( $namespace >= 0 ) {
 				$fields['TitlesNs' . $namespace] = array(
 					'class' => 'EditWatchlistCheckboxSeriesField',
@@ -486,8 +515,9 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 				);
 			}
 
-			foreach( array_keys( $pages ) as $dbkey ) {
+			foreach ( array_keys( $pages ) as $dbkey ) {
 				$title = Title::makeTitleSafe( $namespace, $dbkey );
+
 				if ( $this->checkTitle( $title, $namespace, $dbkey ) ) {
 					$text = $this->buildRemoveLine( $title );
 					$fields['TitlesNs' . $namespace]['options'][$text] = $title->getPrefixedText();
@@ -500,30 +530,33 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 		if ( count( $fields ) > 1 && $count > 30 ) {
 			$this->toc = Linker::tocIndent();
 			$tocLength = 0;
-			foreach( $fields as $data ) {
 
+			foreach ( $fields as $data ) {
 				# strip out the 'ns' prefix from the section name:
 				$ns = substr( $data['section'], 2 );
 
-				$nsText = ($ns == NS_MAIN)
+				$nsText = ( $ns == NS_MAIN )
 					? $this->msg( 'blanknamespace' )->escaped()
 					: htmlspecialchars( $wgContLang->getFormattedNsText( $ns ) );
 				$this->toc .= Linker::tocLine( "editwatchlist-{$data['section']}", $nsText,
 					$this->getLanguage()->formatNum( ++$tocLength ), 1 ) . Linker::tocLineEnd();
 			}
+
 			$this->toc = Linker::tocList( $this->toc );
 		} else {
 			$this->toc = false;
 		}
 
-		$form = new EditWatchlistNormalHTMLForm( $fields, $this->getContext() );
-		$form->setTitle( $this->getTitle() );
+		$context = new DerivativeContext( $this->getContext() );
+		$context->setTitle( $this->getTitle() ); // Remove subpage
+		$form = new EditWatchlistNormalHTMLForm( $fields, $context );
 		$form->setSubmitTextMsg( 'watchlistedit-normal-submit' );
 		# Used message keys: 'accesskey-watchlistedit-normal-submit', 'tooltip-watchlistedit-normal-submit'
 		$form->setSubmitTooltip( 'watchlistedit-normal-submit' );
 		$form->setWrapperLegendMsg( 'watchlistedit-normal-legend' );
 		$form->addHeaderText( $this->msg( 'watchlistedit-normal-explain' )->parse() );
 		$form->setSubmitCallback( array( $this, 'submitNormal' ) );
+
 		return $form;
 	}
 
@@ -535,12 +568,15 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 	 */
 	private function buildRemoveLine( $title ) {
 		$link = Linker::link( $title );
-		if( $title->isRedirect() ) {
+
+		if ( $title->isRedirect() ) {
 			// Linker already makes class mw-redirect, so this is redundant
 			$link = '<span class="watchlistredir">' . $link . '</span>';
 		}
+
 		$tools[] = Linker::link( $title->getTalkPage(), $this->msg( 'talkpagelinktext' )->escaped() );
-		if( $title->exists() ) {
+
+		if ( $title->exists() ) {
 			$tools[] = Linker::linkKnown(
 				$title,
 				$this->msg( 'history_short' )->escaped(),
@@ -548,7 +584,8 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 				array( 'action' => 'history' )
 			);
 		}
-		if( $title->getNamespace() == NS_USER && !$title->isSubpage() ) {
+
+		if ( $title->getNamespace() == NS_USER && !$title->isSubpage() ) {
 			$tools[] = Linker::linkKnown(
 				SpecialPage::getTitleFor( 'Contributions', $title->getText() ),
 				$this->msg( 'contributions' )->escaped()
@@ -574,14 +611,16 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 				'default' => $titles,
 			),
 		);
-		$form = new HTMLForm( $fields, $this->getContext() );
-		$form->setTitle( $this->getTitle( 'raw' ) );
+		$context = new DerivativeContext( $this->getContext() );
+		$context->setTitle( $this->getTitle( 'raw' ) ); // Reset subpage
+		$form = new HTMLForm( $fields, $context );
 		$form->setSubmitTextMsg( 'watchlistedit-raw-submit' );
 		# Used message keys: 'accesskey-watchlistedit-raw-submit', 'tooltip-watchlistedit-raw-submit'
 		$form->setSubmitTooltip( 'watchlistedit-raw-submit' );
 		$form->setWrapperLegendMsg( 'watchlistedit-raw-legend' );
 		$form->addHeaderText( $this->msg( 'watchlistedit-raw-explain' )->parse() );
 		$form->setSubmitCallback( array( $this, 'submitRaw' ) );
+
 		return $form;
 	}
 
@@ -595,19 +634,17 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 	 */
 	public static function getMode( $request, $par ) {
 		$mode = strtolower( $request->getVal( 'action', $par ) );
-		switch( $mode ) {
+
+		switch ( $mode ) {
 			case 'clear':
 			case self::EDIT_CLEAR:
 				return self::EDIT_CLEAR;
-
 			case 'raw':
 			case self::EDIT_RAW:
 				return self::EDIT_RAW;
-
 			case 'edit':
 			case self::EDIT_NORMAL:
 				return self::EDIT_NORMAL;
-
 			default:
 				return false;
 		}
@@ -629,21 +666,26 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 			'edit' => array( 'EditWatchlist', false ),
 			'raw' => array( 'EditWatchlist', 'raw' ),
 		);
-		foreach( $modes as $mode => $arr ) {
+
+		foreach ( $modes as $mode => $arr ) {
 			// can use messages 'watchlisttools-view', 'watchlisttools-edit', 'watchlisttools-raw'
 			$tools[] = Linker::linkKnown(
 				SpecialPage::getTitleFor( $arr[0], $arr[1] ),
 				wfMessage( "watchlisttools-{$mode}" )->escaped()
 			);
 		}
-		return Html::rawElement( 'span',
-					array( 'class' => 'mw-watchlist-toollinks' ),
-					wfMessage( 'parentheses', $wgLang->pipeList( $tools ) )->text() );
+
+		return Html::rawElement(
+			'span',
+			array( 'class' => 'mw-watchlist-toollinks' ),
+			wfMessage( 'parentheses', $wgLang->pipeList( $tools ) )->text()
+		);
 	}
 }
 
 # B/C since 1.18
-class WatchlistEditor extends SpecialEditWatchlist {}
+class WatchlistEditor extends SpecialEditWatchlist {
+}
 
 /**
  * Extend HTMLForm purely so we can have a more sane way of getting the section headers
@@ -651,10 +693,12 @@ class WatchlistEditor extends SpecialEditWatchlist {}
 class EditWatchlistNormalHTMLForm extends HTMLForm {
 	public function getLegend( $namespace ) {
 		$namespace = substr( $namespace, 2 );
+
 		return $namespace == NS_MAIN
 			? $this->msg( 'blanknamespace' )->escaped()
 			: htmlspecialchars( $this->getContext()->getLanguage()->getFormattedNsText( $namespace ) );
 	}
+
 	public function getBody() {
 		return $this->displaySection( $this->mFieldTree, '', 'editwatchlist-' );
 	}
diff --git a/includes/specials/SpecialEmailuser.php b/includes/specials/SpecialEmailuser.php
index b5ad589e..2e90d996 100644
--- a/includes/specials/SpecialEmailuser.php
+++ b/includes/specials/SpecialEmailuser.php
@@ -29,13 +29,18 @@
 class SpecialEmailUser extends UnlistedSpecialPage {
 	protected $mTarget;
 
+	/**
+	 * @var User|string $mTargetObj
+	 */
+	protected $mTargetObj;
+
 	public function __construct() {
 		parent::__construct( 'Emailuser' );
 	}
 
 	public function getDescription() {
 		$target = self::getTarget( $this->mTarget );
-		if( !$target instanceof User ) {
+		if ( !$target instanceof User ) {
 			return $this->msg( 'emailuser-title-notarget' )->text();
 		}
 
@@ -106,7 +111,11 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 		$this->outputHeader();
 
 		// error out if sending user cannot do this
-		$error = self::getPermissionsError( $this->getUser(), $this->getRequest()->getVal( 'wpEditToken' ) );
+		$error = self::getPermissionsError(
+			$this->getUser(),
+			$this->getRequest()->getVal( 'wpEditToken' )
+		);
+
 		switch ( $error ) {
 			case null:
 				# Wahey!
@@ -119,43 +128,45 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 				throw new ThrottledError;
 			case 'mailnologin':
 			case 'usermaildisabled':
-				throw new  ErrorPageError( $error, "{$error}text" );
+				throw new ErrorPageError( $error, "{$error}text" );
 			default:
 				# It's a hook error
 				list( $title, $msg, $params ) = $error;
-				throw new  ErrorPageError( $title, $msg, $params );
+				throw new ErrorPageError( $title, $msg, $params );
 		}
 		// Got a valid target user name? Else ask for one.
 		$ret = self::getTarget( $this->mTarget );
-		if( !$ret instanceof User ) {
-			if( $this->mTarget != '' ) {
+		if ( !$ret instanceof User ) {
+			if ( $this->mTarget != '' ) {
 				$ret = ( $ret == 'notarget' ) ? 'emailnotarget' : ( $ret . 'text' );
 				$out->wrapWikiMsg( "<p class='error'>$1</p>", $ret );
 			}
 			$out->addHTML( $this->userForm( $this->mTarget ) );
+
 			return false;
 		}
 
 		$this->mTargetObj = $ret;
 
-		$form = new HTMLForm( $this->getFormFields(), $this->getContext() );
+		$context = new DerivativeContext( $this->getContext() );
+		$context->setTitle( $this->getTitle() ); // Remove subpage
+		$form = new HTMLForm( $this->getFormFields(), $context );
 		// By now we are supposed to be sure that $this->mTarget is a user name
 		$form->addPreText( $this->msg( 'emailpagetext', $this->mTarget )->parse() );
 		$form->setSubmitTextMsg( 'emailsend' );
-		$form->setTitle( $this->getTitle() );
 		$form->setSubmitCallback( array( __CLASS__, 'uiSubmit' ) );
 		$form->setWrapperLegendMsg( 'email-legend' );
 		$form->loadData();
 
-		if( !wfRunHooks( 'EmailUserForm', array( &$form ) ) ) {
+		if ( !wfRunHooks( 'EmailUserForm', array( &$form ) ) ) {
 			return false;
 		}
 
 		$result = $form->show();
 
-		if( $result === true || ( $result instanceof Status && $result->isGood() ) ) {
+		if ( $result === true || ( $result instanceof Status && $result->isGood() ) ) {
 			$out->setPageTitle( $this->msg( 'emailsent' ) );
-			$out->addWikiMsg( 'emailsenttext' );
+			$out->addWikiMsg( 'emailsenttext', $this->mTarget );
 			$out->returnToMain( false, $this->mTargetObj->getUserPage() );
 		}
 	}
@@ -169,18 +180,22 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 	public static function getTarget( $target ) {
 		if ( $target == '' ) {
 			wfDebug( "Target is empty.\n" );
+
 			return 'notarget';
 		}
 
 		$nu = User::newFromName( $target );
-		if( !$nu instanceof User || !$nu->getId() ) {
+		if ( !$nu instanceof User || !$nu->getId() ) {
 			wfDebug( "Target is invalid user.\n" );
+
 			return 'notarget';
 		} elseif ( !$nu->isEmailConfirmed() ) {
 			wfDebug( "User has no valid email.\n" );
+
 			return 'noemail';
 		} elseif ( !$nu->canReceiveEmail() ) {
 			wfDebug( "User does not allow user emails.\n" );
+
 			return 'nowikiemail';
 		}
 
@@ -196,31 +211,36 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 	 */
 	public static function getPermissionsError( $user, $editToken ) {
 		global $wgEnableEmail, $wgEnableUserEmail;
-		if( !$wgEnableEmail || !$wgEnableUserEmail ) {
+
+		if ( !$wgEnableEmail || !$wgEnableUserEmail ) {
 			return 'usermaildisabled';
 		}
 
-		if( !$user->isAllowed( 'sendemail' ) ) {
+		if ( !$user->isAllowed( 'sendemail' ) ) {
 			return 'badaccess';
 		}
 
-		if( !$user->isEmailConfirmed() ) {
+		if ( !$user->isEmailConfirmed() ) {
 			return 'mailnologin';
 		}
 
-		if( $user->isBlockedFromEmailuser() ) {
+		if ( $user->isBlockedFromEmailuser() ) {
 			wfDebug( "User is blocked from sending e-mail.\n" );
+
 			return "blockedemailuser";
 		}
 
-		if( $user->pingLimiter( 'emailuser' ) ) {
+		if ( $user->pingLimiter( 'emailuser' ) ) {
 			wfDebug( "Ping limiter triggered.\n" );
+
 			return 'actionthrottledtext';
 		}
 
 		$hookErr = false;
+
 		wfRunHooks( 'UserCanSendEmail', array( &$user, &$hookErr ) );
 		wfRunHooks( 'EmailUserPermissionsErrors', array( $user, $editToken, &$hookErr ) );
+
 		if ( $hookErr ) {
 			return $hookErr;
 		}
@@ -236,14 +256,25 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 	 */
 	protected function userForm( $name ) {
 		global $wgScript;
-		$string = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'askusername' ) ) .
+		$string = Xml::openElement(
+			'form',
+			array( 'method' => 'get', 'action' => $wgScript, 'id' => 'askusername' )
+		) .
 			Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
 			Xml::openElement( 'fieldset' ) .
 			Html::rawElement( 'legend', null, $this->msg( 'emailtarget' )->parse() ) .
-			Xml::inputLabel( $this->msg( 'emailusername' )->text(), 'target', 'emailusertarget', 30, $name ) . ' ' .
+			Xml::inputLabel(
+				$this->msg( 'emailusername' )->text(),
+				'target',
+				'emailusertarget',
+				30,
+				$name
+			) .
+			' ' .
 			Xml::submitButton( $this->msg( 'emailusernamesubmit' )->text() ) .
 			Xml::closeElement( 'fieldset' ) .
 			Xml::closeElement( 'form' ) . "\n";
+
 		return $string;
 	}
 
@@ -264,6 +295,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 	 * getPermissionsError(). It is probably also a good
 	 * idea to check the edit token and ping limiter in advance.
 	 *
+	 * @param array $data
+	 * @param IContextSource $context
 	 * @return Mixed: Status object, or potentially a String on error
 	 * or maybe even true on success if anything uses the EmailUser hook.
 	 */
@@ -271,9 +304,10 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 		global $wgUserEmailUseReplyTo;
 
 		$target = self::getTarget( $data['Target'] );
-		if( !$target instanceof User ) {
+		if ( !$target instanceof User ) {
 			return $context->msg( $target . 'text' )->parseAsBlock();
 		}
+
 		$to = new MailAddress( $target );
 		$from = new MailAddress( $context->getUser() );
 		$subject = $data['Subject'];
@@ -285,11 +319,11 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 			$from->name, $to->name )->inContentLanguage()->text();
 
 		$error = '';
-		if( !wfRunHooks( 'EmailUser', array( &$to, &$from, &$subject, &$text, &$error ) ) ) {
+		if ( !wfRunHooks( 'EmailUser', array( &$to, &$from, &$subject, &$text, &$error ) ) ) {
 			return $error;
 		}
 
-		if( $wgUserEmailUseReplyTo ) {
+		if ( $wgUserEmailUseReplyTo ) {
 			// Put the generic wiki autogenerated address in the From:
 			// header and reserve the user for Reply-To.
 			//
@@ -297,6 +331,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 			// wiki-borne mails from direct mails and protects against
 			// SPF and bounce problems with some mailers (see below).
 			global $wgPasswordSender, $wgPasswordSenderName;
+
 			$mailFrom = new MailAddress( $wgPasswordSender, $wgPasswordSenderName );
 			$replyTo = $from;
 		} else {
@@ -319,7 +354,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 
 		$status = UserMailer::send( $to, $mailFrom, $subject, $text, $replyTo );
 
-		if( !$status->isGood() ) {
+		if ( !$status->isGood() ) {
 			return $status;
 		} else {
 			// if the user requested a copy of this mail, do this now,
@@ -334,6 +369,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 			}
 
 			wfRunHooks( 'EmailUserComplete', array( $to, $from, $subject, $text ) );
+
 			return $status;
 		}
 	}
diff --git a/includes/specials/SpecialExport.php b/includes/specials/SpecialExport.php
index 7abfefe2..61ed34d4 100644
--- a/includes/specials/SpecialExport.php
+++ b/includes/specials/SpecialExport.php
@@ -29,7 +29,6 @@
  * @ingroup SpecialPage
  */
 class SpecialExport extends SpecialPage {
-
 	private $curonly, $doExport, $pageLinkDepth, $templates;
 	private $images;
 
@@ -75,8 +74,7 @@ class SpecialExport extends SpecialPage {
 					}
 				}
 			}
-		}
-		elseif( $request->getCheck( 'addns' ) && $wgExportFromNamespaces ) {
+		} elseif ( $request->getCheck( 'addns' ) && $wgExportFromNamespaces ) {
 			$page = $request->getText( 'pages' );
 			$nsindex = $request->getText( 'nsindex', '' );
 
@@ -89,8 +87,7 @@ class SpecialExport extends SpecialPage {
 					$page .= "\n" . implode( "\n", $nspages );
 				}
 			}
-		}
-		elseif( $request->getCheck( 'exportall' ) && $wgExportAllowAll ) {
+		} elseif ( $request->getCheck( 'exportall' ) && $wgExportAllowAll ) {
 			$this->doExport = true;
 			$exportall = true;
 
@@ -100,13 +97,12 @@ class SpecialExport extends SpecialPage {
 			doExport(...) further down) */
 			$page = '';
 			$history = '';
-		}
-		elseif( $request->wasPosted() && $par == '' ) {
+		} elseif ( $request->wasPosted() && $par == '' ) {
 			$page = $request->getText( 'pages' );
 			$this->curonly = $request->getCheck( 'curonly' );
 			$rawOffset = $request->getVal( 'offset' );
 
-			if( $rawOffset ) {
+			if ( $rawOffset ) {
 				$offset = wfTimestamp( TS_MW, $rawOffset );
 			} else {
 				$offset = null;
@@ -127,15 +123,17 @@ class SpecialExport extends SpecialPage {
 				if ( $limit > 0 && ( $wgExportMaxHistory == 0 || $limit < $wgExportMaxHistory ) ) {
 					$history['limit'] = $limit;
 				}
+
 				if ( !is_null( $offset ) ) {
 					$history['offset'] = $offset;
 				}
+
 				if ( strtolower( $dir ) == 'desc' ) {
 					$history['dir'] = 'desc';
 				}
 			}
 
-			if( $page != '' ) {
+			if ( $page != '' ) {
 				$this->doExport = true;
 			}
 		} else {
@@ -143,18 +141,18 @@ class SpecialExport extends SpecialPage {
 			$page = $request->getText( 'pages', $par );
 			$historyCheck = $request->getCheck( 'history' );
 
-			if( $historyCheck ) {
+			if ( $historyCheck ) {
 				$history = WikiExporter::FULL;
 			} else {
 				$history = WikiExporter::CURRENT;
 			}
 
-			if( $page != '' ) {
+			if ( $page != '' ) {
 				$this->doExport = true;
 			}
 		}
 
-		if( !$wgExportAllowHistory ) {
+		if ( !$wgExportAllowHistory ) {
 			// Override
 			$history = WikiExporter::CURRENT;
 		}
@@ -172,7 +170,7 @@ class SpecialExport extends SpecialPage {
 			wfResetOutputBuffers();
 			$request->response()->header( "Content-type: application/xml; charset=utf-8" );
 
-			if( $request->getCheck( 'wpDownload' ) ) {
+			if ( $request->getCheck( 'wpDownload' ) ) {
 				// Provide a sane filename suggestion
 				$filename = urlencode( $wgSitename . '-' . wfTimestampNow() . '.xml' );
 				$request->response()->header( "Content-disposition: attachment;filename={$filename}" );
@@ -187,9 +185,17 @@ class SpecialExport extends SpecialPage {
 		$out->addWikiMsg( 'exporttext' );
 
 		$form = Xml::openElement( 'form', array( 'method' => 'post',
-			'action' => $this->getTitle()->getLocalUrl( 'action=submit' ) ) );
-		$form .= Xml::inputLabel( $this->msg( 'export-addcattext' )->text(), 'catname', 'catname', 40 ) . '&#160;';
-		$form .= Xml::submitButton( $this->msg( 'export-addcat' )->text(), array( 'name' => 'addcat' ) ) . '<br />';
+			'action' => $this->getTitle()->getLocalURL( 'action=submit' ) ) );
+		$form .= Xml::inputLabel(
+			$this->msg( 'export-addcattext' )->text(),
+			'catname',
+			'catname',
+			40
+		) . '&#160;';
+		$form .= Xml::submitButton(
+			$this->msg( 'export-addcat' )->text(),
+			array( 'name' => 'addcat' )
+		) . '<br />';
 
 		if ( $wgExportFromNamespaces ) {
 			$form .= Html::namespaceSelector(
@@ -197,12 +203,15 @@ class SpecialExport extends SpecialPage {
 					'selected' => $nsindex,
 					'label' => $this->msg( 'export-addnstext' )->text()
 				), array(
-					'name'  => 'nsindex',
-					'id'    => 'namespace',
+					'name' => 'nsindex',
+					'id' => 'namespace',
 					'class' => 'namespaceselector',
 				)
 			) . '&#160;';
-			$form .= Xml::submitButton( $this->msg( 'export-addns' )->text(), array( 'name' => 'addns' ) ) . '<br />';
+			$form .= Xml::submitButton(
+				$this->msg( 'export-addns' )->text(),
+				array( 'name' => 'addns' )
+			) . '<br />';
 		}
 
 		if ( $wgExportAllowAll ) {
@@ -214,10 +223,15 @@ class SpecialExport extends SpecialPage {
 			) . '<br />';
 		}
 
-		$form .= Xml::element( 'textarea', array( 'name' => 'pages', 'cols' => 40, 'rows' => 10 ), $page, false );
+		$form .= Xml::element(
+			'textarea',
+			array( 'name' => 'pages', 'cols' => 40, 'rows' => 10 ),
+			$page,
+			false
+		);
 		$form .= '<br />';
 
-		if( $wgExportAllowHistory ) {
+		if ( $wgExportAllowHistory ) {
 			$form .= Xml::checkLabel(
 				$this->msg( 'exportcuronly' )->text(),
 				'curonly',
@@ -235,9 +249,16 @@ class SpecialExport extends SpecialPage {
 			$request->wasPosted() ? $request->getCheck( 'templates' ) : false
 		) . '<br />';
 
-		if( $wgExportMaxLinkDepth || $this->userCanOverrideExportDepth() ) {
-			$form .= Xml::inputLabel( $this->msg( 'export-pagelinks' )->text(), 'pagelink-depth', 'pagelink-depth', 20, 0 ) . '<br />';
+		if ( $wgExportMaxLinkDepth || $this->userCanOverrideExportDepth() ) {
+			$form .= Xml::inputLabel(
+				$this->msg( 'export-pagelinks' )->text(),
+				'pagelink-depth',
+				'pagelink-depth',
+				20,
+				0
+			) . '<br />';
 		}
+
 		// Enable this when we can do something useful exporting/importing image information. :)
 		//$form .= Xml::checkLabel( $this->msg( 'export-images' )->text(), 'images', 'wpExportImages', false ) . '<br />';
 		$form .= Xml::checkLabel(
@@ -256,7 +277,10 @@ class SpecialExport extends SpecialPage {
 			) . '<br />';
 		}
 
-		$form .= Xml::submitButton( $this->msg( 'export-submit' )->text(), Linker::tooltipAndAccesskeyAttribs( 'export' ) );
+		$form .= Xml::submitButton(
+			$this->msg( 'export-submit' )->text(),
+			Linker::tooltipAndAccesskeyAttribs( 'export' )
+		);
 		$form .= Xml::closeElement( 'form' );
 
 		$out->addHTML( $form );
@@ -288,10 +312,10 @@ class SpecialExport extends SpecialPage {
 			$pageSet = array(); // Inverted index of all pages to look up
 
 			// Split up and normalize input
-			foreach( explode( "\n", $page ) as $pageName ) {
+			foreach ( explode( "\n", $page ) as $pageName ) {
 				$pageName = trim( $pageName );
 				$title = Title::newFromText( $pageName );
-				if( $title && $title->getInterwiki() == '' && $title->getText() !== '' ) {
+				if ( $title && $title->getInterwiki() == '' && $title->getText() !== '' ) {
 					// Only record each page once!
 					$pageSet[$title->getPrefixedText()] = true;
 				}
@@ -301,25 +325,23 @@ class SpecialExport extends SpecialPage {
 			$inputPages = array_keys( $pageSet );
 
 			// Look up any linked pages if asked...
-			if( $this->templates ) {
+			if ( $this->templates ) {
 				$pageSet = $this->getTemplates( $inputPages, $pageSet );
 			}
 			$linkDepth = $this->pageLinkDepth;
-			if( $linkDepth ) {
+			if ( $linkDepth ) {
 				$pageSet = $this->getPageLinks( $inputPages, $pageSet, $linkDepth );
 			}
 
-			/*
-			 // Enable this when we can do something useful exporting/importing image information. :)
-			 if( $this->images ) ) {
-			 $pageSet = $this->getImages( $inputPages, $pageSet );
-			 }
-			*/
+			// Enable this when we can do something useful exporting/importing image information.
+			// if( $this->images ) ) {
+			// $pageSet = $this->getImages( $inputPages, $pageSet );
+			// }
 
 			$pages = array_keys( $pageSet );
 
 			// Normalize titles to the same format and remove dupes, see bug 17374
-			foreach( $pages as $k => $v ) {
+			foreach ( $pages as $k => $v ) {
 				$pages[$k] = str_replace( " ", "_", $v );
 			}
 
@@ -327,7 +349,7 @@ class SpecialExport extends SpecialPage {
 		}
 
 		/* Ok, let's get to it... */
-		if( $history == WikiExporter::CURRENT ) {
+		if ( $history == WikiExporter::CURRENT ) {
 			$lb = false;
 			$db = wfGetDB( DB_SLAVE );
 			$buffer = WikiExporter::BUFFER;
@@ -350,26 +372,17 @@ class SpecialExport extends SpecialPage {
 		if ( $exportall ) {
 			$exporter->allPages();
 		} else {
-			foreach( $pages as $page ) {
-			/*
-			 if( $wgExportMaxHistory && !$this->curonly ) {
-			 $title = Title::newFromText( $page );
-			 if( $title ) {
-			 $count = Revision::countByTitle( $db, $title );
-			 if( $count > $wgExportMaxHistory ) {
-			 wfDebug( __FUNCTION__ .
-			 ": Skipped $page, $count revisions too big\n" );
-			 continue;
-			 }
-			 }
-			 }*/
-			#Bug 8824: Only export pages the user can read
+			foreach ( $pages as $page ) {
+				#Bug 8824: Only export pages the user can read
 				$title = Title::newFromText( $page );
-				if( is_null( $title ) ) {
-					continue; #TODO: perhaps output an <error> tag or something.
+				if ( is_null( $title ) ) {
+					// @todo Perhaps output an <error> tag or something.
+					continue;
 				}
-				if( !$title->userCan( 'read', $this->getUser() ) ) {
-					continue; #TODO: perhaps output an <error> tag or something.
+
+				if ( !$title->userCan( 'read', $this->getUser() ) ) {
+					// @todo Perhaps output an <error> tag or something.
+					continue;
 				}
 
 				$exporter->pageByTitle( $title );
@@ -378,7 +391,7 @@ class SpecialExport extends SpecialPage {
 
 		$exporter->closeStream();
 
-		if( $lb ) {
+		if ( $lb ) {
 			$lb->closeAll();
 		}
 	}
@@ -412,6 +425,7 @@ class SpecialExport extends SpecialPage {
 
 			$pages[] = $n;
 		}
+
 		return $pages;
 	}
 
@@ -443,6 +457,7 @@ class SpecialExport extends SpecialPage {
 
 			$pages[] = $n;
 		}
+
 		return $pages;
 	}
 
@@ -468,12 +483,12 @@ class SpecialExport extends SpecialPage {
 	private function validateLinkDepth( $depth ) {
 		global $wgExportMaxLinkDepth;
 
-		if( $depth < 0 ) {
+		if ( $depth < 0 ) {
 			return 0;
 		}
 
 		if ( !$this->userCanOverrideExportDepth() ) {
-			if( $depth > $wgExportMaxLinkDepth ) {
+			if ( $depth > $wgExportMaxLinkDepth ) {
 				return $wgExportMaxLinkDepth;
 			}
 		}
@@ -483,6 +498,7 @@ class SpecialExport extends SpecialPage {
 		 * crazy-big export from being done by someone setting the depth
 		 * number too high. In other words, last resort safety net.
 		 */
+
 		return intval( min( $depth, 5 ) );
 	}
 
@@ -494,7 +510,7 @@ class SpecialExport extends SpecialPage {
 	 * @return array
 	 */
 	private function getPageLinks( $inputPages, $pageSet, $depth ) {
-		for( ; $depth > 0; --$depth ) {
+		for ( ; $depth > 0; --$depth ) {
 			$pageSet = $this->getLinks(
 				$inputPages, $pageSet, 'pagelinks',
 				array( 'namespace' => 'pl_namespace', 'title' => 'pl_title' ),
@@ -526,15 +542,20 @@ class SpecialExport extends SpecialPage {
 
 	/**
 	 * Expand a list of pages to include items used in those pages.
+	 * @param array $inputPages Array of page titles
+	 * @param array $pageSet
+	 * @param string $table
+	 * @param array $fields Array of field names
+	 * @param array $join
 	 * @return array
 	 */
 	private function getLinks( $inputPages, $pageSet, $table, $fields, $join ) {
 		$dbr = wfGetDB( DB_SLAVE );
 
-		foreach( $inputPages as $page ) {
+		foreach ( $inputPages as $page ) {
 			$title = Title::newFromText( $page );
 
-			if( $title ) {
+			if ( $title ) {
 				$pageSet[$title->getPrefixedText()] = true;
 				/// @todo FIXME: May or may not be more efficient to batch these
 				///        by namespace when given multiple input pages.
@@ -551,7 +572,7 @@ class SpecialExport extends SpecialPage {
 					__METHOD__
 				);
 
-				foreach( $result as $row ) {
+				foreach ( $result as $row ) {
 					$template = Title::makeTitle( $row->namespace, $row->title );
 					$pageSet[$template->getPrefixedText()] = true;
 				}
diff --git a/includes/specials/SpecialFewestrevisions.php b/includes/specials/SpecialFewestrevisions.php
index 5b7f353d..47a4d75f 100644
--- a/includes/specials/SpecialFewestrevisions.php
+++ b/includes/specials/SpecialFewestrevisions.php
@@ -28,7 +28,6 @@
  * @author Martin Drashkov
  */
 class FewestrevisionsPage extends QueryPage {
-
 	function __construct( $name = 'Fewestrevisions' ) {
 		parent::__construct( $name );
 	}
@@ -42,21 +41,26 @@ class FewestrevisionsPage extends QueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array ( 'revision', 'page' ),
-			'fields' => array ( 'namespace' => 'page_namespace',
-					'title' => 'page_title',
-					'value' => 'COUNT(*)',
-					'redirect' => 'page_is_redirect' ),
-			'conds' => array ( 'page_namespace' => MWNamespace::getContentNamespaces(),
-					'page_id = rev_page' ),
-			'options' => array ( 'HAVING' => 'COUNT(*) > 1',
-			// ^^^ This was probably here to weed out redirects.
-			// Since we mark them as such now, it might be
-			// useful to remove this. People _do_ create pages
-			// and never revise them, they aren't necessarily
-			// redirects.
-			'GROUP BY' => array( 'page_namespace', 'page_title', 'page_is_redirect' ) )
+		return array(
+			'tables' => array( 'revision', 'page' ),
+			'fields' => array(
+				'namespace' => 'page_namespace',
+				'title' => 'page_title',
+				'value' => 'COUNT(*)',
+				'redirect' => 'page_is_redirect'
+			),
+			'conds' => array(
+				'page_namespace' => MWNamespace::getContentNamespaces(),
+				'page_id = rev_page' ),
+			'options' => array(
+				'HAVING' => 'COUNT(*) > 1',
+				// ^^^ This was probably here to weed out redirects.
+				// Since we mark them as such now, it might be
+				// useful to remove this. People _do_ create pages
+				// and never revise them, they aren't necessarily
+				// redirects.
+				'GROUP BY' => array( 'page_namespace', 'page_title', 'page_is_redirect' )
+			)
 		);
 	}
 
@@ -65,17 +69,24 @@ class FewestrevisionsPage extends QueryPage {
 	}
 
 	/**
-	 * @param $skin Skin object
-	 * @param $result Object: database row
+	 * @param Skin $skin
+	 * @param object $result Database row
 	 * @return String
 	 */
 	function formatResult( $skin, $result ) {
 		global $wgContLang;
 
 		$nt = Title::makeTitleSafe( $result->namespace, $result->title );
-		if( !$nt ) {
-			return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-				Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+		if ( !$nt ) {
+			return Html::element(
+				'span',
+				array( 'class' => 'mw-invalidtitle' ),
+				Linker::getInvalidTitleDescription(
+					$this->getContext(),
+					$result->namespace,
+					$result->title
+				)
+			);
 		}
 
 		$text = htmlspecialchars( $wgContLang->convert( $nt->getPrefixedText() ) );
diff --git a/includes/specials/SpecialFileDuplicateSearch.php b/includes/specials/SpecialFileDuplicateSearch.php
index 3fe64e6f..4c6593b2 100644
--- a/includes/specials/SpecialFileDuplicateSearch.php
+++ b/includes/specials/SpecialFileDuplicateSearch.php
@@ -59,7 +59,7 @@ class FileDuplicateSearchPage extends QueryPage {
 	/**
 	 * Fetch dupes from all connected file repositories.
 	 *
-	 * @return Array of File objects
+	 * @return array of File objects
 	 */
 	function getDupes() {
 		return RepoGroup::singleton()->findBySha1( $this->hash );
@@ -101,11 +101,11 @@ class FileDuplicateSearchPage extends QueryPage {
 		$this->setHeaders();
 		$this->outputHeader();
 
-		$this->filename = isset( $par ) ?  $par : $this->getRequest()->getText( 'filename' );
+		$this->filename = isset( $par ) ? $par : $this->getRequest()->getText( 'filename' );
 		$this->file = null;
 		$this->hash = '';
 		$title = Title::newFromText( $this->filename, NS_FILE );
-		if( $title && $title->getText() != '' ) {
+		if ( $title && $title->getText() != '' ) {
 			$this->file = wfFindFile( $title );
 		}
 
@@ -113,37 +113,46 @@ class FileDuplicateSearchPage extends QueryPage {
 
 		# Create the input form
 		$out->addHTML(
-			Xml::openElement( 'form', array( 'id' => 'fileduplicatesearch', 'method' => 'get', 'action' => $wgScript ) ) .
-			Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
-			Xml::openElement( 'fieldset' ) .
-			Xml::element( 'legend', null, $this->msg( 'fileduplicatesearch-legend' )->text() ) .
-			Xml::inputLabel( $this->msg( 'fileduplicatesearch-filename' )->text(), 'filename', 'filename', 50, $this->filename ) . ' ' .
-			Xml::submitButton( $this->msg( 'fileduplicatesearch-submit' )->text() ) .
-			Xml::closeElement( 'fieldset' ) .
-			Xml::closeElement( 'form' )
+			Html::openElement(
+				'form',
+				array( 'id' => 'fileduplicatesearch', 'method' => 'get', 'action' => $wgScript )
+			) . "\n" .
+				Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" .
+				Html::openElement( 'fieldset' ) . "\n" .
+				Html::element( 'legend', null, $this->msg( 'fileduplicatesearch-legend' )->text() ) . "\n" .
+				Xml::inputLabel(
+					$this->msg( 'fileduplicatesearch-filename' )->text(),
+					'filename',
+					'filename',
+					50,
+					$this->filename
+				) . "\n" .
+				Xml::submitButton( $this->msg( 'fileduplicatesearch-submit' )->text() ) . "\n" .
+				Html::closeElement( 'fieldset' ) . "\n" .
+				Html::closeElement( 'form' )
 		);
 
-		if( $this->file ) {
+		if ( $this->file ) {
 			$this->hash = $this->file->getSha1();
-		} elseif( $this->filename !== '' ) {
+		} elseif ( $this->filename !== '' ) {
 			$out->wrapWikiMsg(
 				"<p class='mw-fileduplicatesearch-noresults'>\n$1\n</p>",
 				array( 'fileduplicatesearch-noresults', wfEscapeWikiText( $this->filename ) )
 			);
 		}
 
-		if( $this->hash != '' ) {
+		if ( $this->hash != '' ) {
 			# Show a thumbnail of the file
 			$img = $this->file;
 			if ( $img ) {
 				$thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) );
-				if( $thumb ) {
+				if ( $thumb ) {
 					$out->addHTML( '<div id="mw-fileduplicatesearch-icon">' .
 						$thumb->toHtml( array( 'desc-link' => false ) ) . '<br />' .
 						$this->msg( 'fileduplicatesearch-info' )->numParams(
 							$img->getWidth(), $img->getHeight() )->params(
-							$this->getLanguage()->formatSize( $img->getSize() ),
-							$img->getMimeType() )->parseAsBlock() .
+								$this->getLanguage()->formatSize( $img->getSize() ),
+								$img->getMimeType() )->parseAsBlock() .
 						'</div>' );
 				}
 			}
@@ -152,7 +161,7 @@ class FileDuplicateSearchPage extends QueryPage {
 			$numRows = count( $dupes );
 
 			# Show a short summary
-			if( $numRows == 1 ) {
+			if ( $numRows == 1 ) {
 				$out->wrapWikiMsg(
 					"<p class='mw-fileduplicatesearch-result-1'>\n$1\n</p>",
 					array( 'fileduplicatesearch-result-1', wfEscapeWikiText( $this->filename ) )
@@ -172,14 +181,16 @@ class FileDuplicateSearchPage extends QueryPage {
 
 	function doBatchLookups( $list ) {
 		$batch = new LinkBatch();
-		foreach( $list as $file ) {
+		/** @var File $file */
+		foreach ( $list as $file ) {
 			$batch->addObj( $file->getTitle() );
-			if( $file->isLocal() ) {
+			if ( $file->isLocal() ) {
 				$userName = $file->getUser( 'text' );
 				$batch->add( NS_USER, $userName );
 				$batch->add( NS_USER_TALK, $userName );
 			}
 		}
+
 		$batch->execute();
 	}
 
diff --git a/includes/specials/SpecialFilepath.php b/includes/specials/SpecialFilepath.php
index bbcced26..e7ced52a 100644
--- a/includes/specials/SpecialFilepath.php
+++ b/includes/specials/SpecialFilepath.php
@@ -2,6 +2,7 @@
 /**
  * Implements Special:Filepath
  *
+ * @section 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 2 of the License, or
@@ -26,65 +27,16 @@
  *
  * @ingroup SpecialPage
  */
-class SpecialFilepath extends SpecialPage {
-
+class SpecialFilepath extends RedirectSpecialPage {
 	function __construct() {
 		parent::__construct( 'Filepath' );
+		$this->mAllowedRedirectParams = array( 'width', 'height' );
 	}
 
-	function execute( $par ) {
-		$this->setHeaders();
-		$this->outputHeader();
-
-		$request = $this->getRequest();
-		$file = !is_null( $par ) ? $par : $request->getText( 'file' );
-
-		$title = Title::newFromText( $file, NS_FILE );
-
-		if ( ! $title instanceof Title || $title->getNamespace() != NS_FILE ) {
-			$this->showForm( $title );
-		} else {
-			$file = wfFindFile( $title );
-
-			if ( $file && $file->exists() ) {
-				// Default behavior: Use the direct link to the file.
-				$url = $file->getURL();
-				$width = $request->getInt( 'width', -1 );
-				$height = $request->getInt( 'height', -1 );
-
-				// If a width is requested...
-				if ( $width != -1 ) {
-					$mto = $file->transform( array( 'width' => $width, 'height' => $height ) );
-					// ... and we can
-					if ( $mto && !$mto->isError() ) {
-						// ... change the URL to point to a thumbnail.
-						$url = $mto->getURL();
-					}
-				}
-				$this->getOutput()->redirect( $url );
-			} else {
-				$this->getOutput()->setStatusCode( 404 );
-				$this->showForm( $title );
-			}
-		}
-	}
-
-	/**
-	 * @param $title Title
-	 */
-	function showForm( $title ) {
-		global $wgScript;
-
-		$this->getOutput()->addHTML(
-			Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'specialfilepath' ) ) .
-			Html::openElement( 'fieldset' ) .
-			Html::element( 'legend', null, $this->msg( 'filepath' )->text() ) .
-			Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
-			Xml::inputLabel( $this->msg( 'filepath-page' )->text(), 'file', 'file', 25, is_object( $title ) ? $title->getText() : '' ) . ' ' .
-			Xml::submitButton( $this->msg( 'filepath-submit' )->text() ) . "\n" .
-			Html::closeElement( 'fieldset' ) .
-			Html::closeElement( 'form' )
-		);
+	// implement by redirecting through Special:Redirect/file
+	function getRedirect( $par ) {
+		$file = $par ?: $this->getRequest()->getText( 'file' );
+		return SpecialPage::getSafeTitleFor( 'Redirect', 'file/' . $file );
 	}
 
 	protected function getGroupName() {
diff --git a/includes/specials/SpecialImport.php b/includes/specials/SpecialImport.php
index aa56041b..d7d860de 100644
--- a/includes/specials/SpecialImport.php
+++ b/includes/specials/SpecialImport.php
@@ -30,12 +30,11 @@
  * @ingroup SpecialPage
  */
 class SpecialImport extends SpecialPage {
-
 	private $interwiki = false;
 	private $namespace;
 	private $rootpage = '';
 	private $frompage = '';
-	private $logcomment= false;
+	private $logcomment = false;
 	private $history = true;
 	private $includeTemplates = false;
 	private $pageLinkDepth;
@@ -108,13 +107,13 @@ class SpecialImport extends SpecialPage {
 			$source = Status::newFatal( 'import-token-mismatch' );
 		} elseif ( $sourceName == 'upload' ) {
 			$isUpload = true;
-			if( $user->isAllowed( 'importupload' ) ) {
+			if ( $user->isAllowed( 'importupload' ) ) {
 				$source = ImportStreamSource::newFromUpload( "xmlimport" );
 			} else {
 				throw new PermissionsError( 'importupload' );
 			}
 		} elseif ( $sourceName == "interwiki" ) {
-			if( !$user->isAllowed( 'import' ) ) {
+			if ( !$user->isAllowed( 'import' ) ) {
 				throw new PermissionsError( 'import' );
 			}
 			$this->interwiki = $request->getVal( 'interwiki' );
@@ -136,24 +135,40 @@ class SpecialImport extends SpecialPage {
 		}
 
 		$out = $this->getOutput();
-		if( !$source->isGood() ) {
-			$out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $source->getWikiText() ) );
+		if ( !$source->isGood() ) {
+			$out->wrapWikiMsg(
+				"<p class=\"error\">\n$1\n</p>",
+				array( 'importfailed', $source->getWikiText() )
+			);
 		} else {
 			$importer = new WikiImporter( $source->value );
-			if( !is_null( $this->namespace ) ) {
+			if ( !is_null( $this->namespace ) ) {
 				$importer->setTargetNamespace( $this->namespace );
 			}
-			if( !is_null( $this->rootpage ) ) {
+			if ( !is_null( $this->rootpage ) ) {
 				$statusRootPage = $importer->setTargetRootPage( $this->rootpage );
-				if( !$statusRootPage->isGood() ) {
-					$out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'import-options-wrong', $statusRootPage->getWikiText(), count( $statusRootPage->getErrorsArray() ) ) );
+				if ( !$statusRootPage->isGood() ) {
+					$out->wrapWikiMsg(
+						"<p class=\"error\">\n$1\n</p>",
+						array(
+							'import-options-wrong',
+							$statusRootPage->getWikiText(),
+							count( $statusRootPage->getErrorsArray() )
+						)
+					);
+
 					return;
 				}
 			}
 
 			$out->addWikiMsg( "importstart" );
 
-			$reporter = new ImportReporter( $importer, $isUpload, $this->interwiki, $this->logcomment );
+			$reporter = new ImportReporter(
+				$importer,
+				$isUpload,
+				$this->interwiki,
+				$this->logcomment
+			);
 			$reporter->setContext( $this->getContext() );
 			$exception = false;
 
@@ -167,10 +182,16 @@ class SpecialImport extends SpecialPage {
 
 			if ( $exception ) {
 				# No source or XML parse error
-				$out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $exception->getMessage() ) );
-			} elseif( !$result->isGood() ) {
+				$out->wrapWikiMsg(
+					"<p class=\"error\">\n$1\n</p>",
+					array( 'importfailed', $exception->getMessage() )
+				);
+			} elseif ( !$result->isGood() ) {
 				# Zero revisions
-				$out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $result->getWikiText() ) );
+				$out->wrapWikiMsg(
+					"<p class=\"error\">\n$1\n</p>",
+					array( 'importfailed', $result->getWikiText() )
+				);
 			} else {
 				# Success!
 				$out->addWikiMsg( 'importsuccess' );
@@ -182,162 +203,195 @@ class SpecialImport extends SpecialPage {
 	private function showForm() {
 		global $wgImportSources, $wgExportMaxLinkDepth;
 
-		$action = $this->getTitle()->getLocalUrl( array( 'action' => 'submit' ) );
+		$action = $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) );
 		$user = $this->getUser();
 		$out = $this->getOutput();
 
-		if( $user->isAllowed( 'importupload' ) ) {
+		if ( $user->isAllowed( 'importupload' ) ) {
 			$out->addHTML(
-				Xml::fieldset( $this->msg( 'import-upload' )->text() ).
-				Xml::openElement( 'form', array( 'enctype' => 'multipart/form-data', 'method' => 'post',
-					'action' => $action, 'id' => 'mw-import-upload-form' ) ) .
-				$this->msg( 'importtext' )->parseAsBlock() .
-				Html::hidden( 'action', 'submit' ) .
-				Html::hidden( 'source', 'upload' ) .
-				Xml::openElement( 'table', array( 'id' => 'mw-import-table-upload' ) ) .
-
-				"<tr>
+				Xml::fieldset( $this->msg( 'import-upload' )->text() ) .
+					Xml::openElement(
+						'form',
+						array(
+							'enctype' => 'multipart/form-data',
+							'method' => 'post',
+							'action' => $action,
+							'id' => 'mw-import-upload-form'
+						)
+					) .
+					$this->msg( 'importtext' )->parseAsBlock() .
+					Html::hidden( 'action', 'submit' ) .
+					Html::hidden( 'source', 'upload' ) .
+					Xml::openElement( 'table', array( 'id' => 'mw-import-table-upload' ) ) .
+					"<tr>
 					<td class='mw-label'>" .
-						Xml::label( $this->msg( 'import-upload-filename' )->text(), 'xmlimport' ) .
+					Xml::label( $this->msg( 'import-upload-filename' )->text(), 'xmlimport' ) .
 					"</td>
 					<td class='mw-input'>" .
-						Html::input( 'xmlimport', '', 'file', array( 'id' => 'xmlimport' ) ) . ' ' .
+					Html::input( 'xmlimport', '', 'file', array( 'id' => 'xmlimport' ) ) . ' ' .
 					"</td>
 				</tr>
 				<tr>
 					<td class='mw-label'>" .
-						Xml::label( $this->msg( 'import-comment' )->text(), 'mw-import-comment' ) .
+					Xml::label( $this->msg( 'import-comment' )->text(), 'mw-import-comment' ) .
 					"</td>
 					<td class='mw-input'>" .
-						Xml::input( 'log-comment', 50, '',
-							array( 'id' => 'mw-import-comment', 'type' => 'text' ) ) . ' ' .
+					Xml::input( 'log-comment', 50, '',
+						array( 'id' => 'mw-import-comment', 'type' => 'text' ) ) . ' ' .
 					"</td>
 				</tr>
 				<tr>
 					<td class='mw-label'>" .
-						Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage-upload' ) .
+					Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage-upload' ) .
 					"</td>
 					<td class='mw-input'>" .
-						Xml::input( 'rootpage', 50, $this->rootpage,
-							array( 'id' => 'mw-interwiki-rootpage-upload', 'type' => 'text' ) ) . ' ' .
+					Xml::input( 'rootpage', 50, $this->rootpage,
+						array( 'id' => 'mw-interwiki-rootpage-upload', 'type' => 'text' ) ) . ' ' .
 					"</td>
 				</tr>
 				<tr>
 					<td></td>
 					<td class='mw-submit'>" .
-						Xml::submitButton( $this->msg( 'uploadbtn' )->text() ) .
+					Xml::submitButton( $this->msg( 'uploadbtn' )->text() ) .
 					"</td>
 				</tr>" .
-				Xml::closeElement( 'table' ).
-				Html::hidden( 'editToken', $user->getEditToken() ) .
-				Xml::closeElement( 'form' ) .
-				Xml::closeElement( 'fieldset' )
+					Xml::closeElement( 'table' ) .
+					Html::hidden( 'editToken', $user->getEditToken() ) .
+					Xml::closeElement( 'form' ) .
+					Xml::closeElement( 'fieldset' )
 			);
 		} else {
-			if( empty( $wgImportSources ) ) {
+			if ( empty( $wgImportSources ) ) {
 				$out->addWikiMsg( 'importnosources' );
 			}
 		}
 
-		if( $user->isAllowed( 'import' ) && !empty( $wgImportSources ) ) {
+		if ( $user->isAllowed( 'import' ) && !empty( $wgImportSources ) ) {
 			# Show input field for import depth only if $wgExportMaxLinkDepth > 0
 			$importDepth = '';
-			if( $wgExportMaxLinkDepth > 0 ) {
+			if ( $wgExportMaxLinkDepth > 0 ) {
 				$importDepth = "<tr>
 							<td class='mw-label'>" .
-								$this->msg( 'export-pagelinks' )->parse() .
-							"</td>
+					$this->msg( 'export-pagelinks' )->parse() .
+					"</td>
 							<td class='mw-input'>" .
-								Xml::input( 'pagelink-depth', 3, 0 ) .
-							"</td>
-						</tr>";
+					Xml::input( 'pagelink-depth', 3, 0 ) .
+					"</td>
+				</tr>";
 			}
 
 			$out->addHTML(
 				Xml::fieldset( $this->msg( 'importinterwiki' )->text() ) .
-				Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'mw-import-interwiki-form' ) ) .
-				$this->msg( 'import-interwiki-text' )->parseAsBlock() .
-				Html::hidden( 'action', 'submit' ) .
-				Html::hidden( 'source', 'interwiki' ) .
-				Html::hidden( 'editToken', $user->getEditToken() ) .
-				Xml::openElement( 'table', array( 'id' => 'mw-import-table-interwiki' ) ) .
-				"<tr>
+					Xml::openElement(
+						'form',
+						array(
+							'method' => 'post',
+							'action' => $action,
+							'id' => 'mw-import-interwiki-form'
+						)
+					) .
+					$this->msg( 'import-interwiki-text' )->parseAsBlock() .
+					Html::hidden( 'action', 'submit' ) .
+					Html::hidden( 'source', 'interwiki' ) .
+					Html::hidden( 'editToken', $user->getEditToken() ) .
+					Xml::openElement( 'table', array( 'id' => 'mw-import-table-interwiki' ) ) .
+					"<tr>
 					<td class='mw-label'>" .
-						Xml::label( $this->msg( 'import-interwiki-source' )->text(), 'interwiki' ) .
+					Xml::label( $this->msg( 'import-interwiki-source' )->text(), 'interwiki' ) .
 					"</td>
 					<td class='mw-input'>" .
-						Xml::openElement( 'select', array( 'name' => 'interwiki', 'id' => 'interwiki' ) )
+					Xml::openElement(
+						'select',
+						array( 'name' => 'interwiki', 'id' => 'interwiki' )
+					)
 			);
-			foreach( $wgImportSources as $prefix ) {
+
+			foreach ( $wgImportSources as $prefix ) {
 				$selected = ( $this->interwiki === $prefix ) ? ' selected="selected"' : '';
 				$out->addHTML( Xml::option( $prefix, $prefix, $selected ) );
 			}
 
 			$out->addHTML(
-						Xml::closeElement( 'select' ) .
-						Xml::input( 'frompage', 50, $this->frompage, array( 'id' => 'frompage' ) ) .
+				Xml::closeElement( 'select' ) .
+					Xml::input( 'frompage', 50, $this->frompage, array( 'id' => 'frompage' ) ) .
 					"</td>
 				</tr>
 				<tr>
 					<td>
 					</td>
 					<td class='mw-input'>" .
-						Xml::checkLabel( $this->msg( 'import-interwiki-history' )->text(), 'interwikiHistory', 'interwikiHistory', $this->history ) .
+					Xml::checkLabel(
+						$this->msg( 'import-interwiki-history' )->text(),
+						'interwikiHistory',
+						'interwikiHistory',
+						$this->history
+					) .
 					"</td>
 				</tr>
 				<tr>
 					<td>
 					</td>
 					<td class='mw-input'>" .
-						Xml::checkLabel( $this->msg( 'import-interwiki-templates' )->text(), 'interwikiTemplates', 'interwikiTemplates', $this->includeTemplates ) .
+					Xml::checkLabel(
+						$this->msg( 'import-interwiki-templates' )->text(),
+						'interwikiTemplates',
+						'interwikiTemplates',
+						$this->includeTemplates
+					) .
 					"</td>
 				</tr>
 				$importDepth
 				<tr>
 					<td class='mw-label'>" .
-						Xml::label( $this->msg( 'import-interwiki-namespace' )->text(), 'namespace' ) .
+					Xml::label( $this->msg( 'import-interwiki-namespace' )->text(), 'namespace' ) .
 					"</td>
 					<td class='mw-input'>" .
-						Html::namespaceSelector(
-							array(
-								'selected' => $this->namespace,
-								'all' => '',
-							), array(
-								'name'  => 'namespace',
-								'id'    => 'namespace',
-								'class' => 'namespaceselector',
-							)
-						) .
+					Html::namespaceSelector(
+						array(
+							'selected' => $this->namespace,
+							'all' => '',
+						), array(
+							'name' => 'namespace',
+							'id' => 'namespace',
+							'class' => 'namespaceselector',
+						)
+					) .
 					"</td>
 				</tr>
 				<tr>
 					<td class='mw-label'>" .
-						Xml::label( $this->msg( 'import-comment' )->text(), 'mw-interwiki-comment' ) .
+					Xml::label( $this->msg( 'import-comment' )->text(), 'mw-interwiki-comment' ) .
 					"</td>
 					<td class='mw-input'>" .
-						Xml::input( 'log-comment', 50, '',
-							array( 'id' => 'mw-interwiki-comment', 'type' => 'text' ) ) . ' ' .
+					Xml::input( 'log-comment', 50, '',
+						array( 'id' => 'mw-interwiki-comment', 'type' => 'text' ) ) . ' ' .
 					"</td>
 				</tr>
 				<tr>
 					<td class='mw-label'>" .
-						Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage-interwiki' ) .
+					Xml::label(
+						$this->msg( 'import-interwiki-rootpage' )->text(),
+						'mw-interwiki-rootpage-interwiki'
+					) .
 					"</td>
 					<td class='mw-input'>" .
-						Xml::input( 'rootpage', 50, $this->rootpage,
-							array( 'id' => 'mw-interwiki-rootpage-interwiki', 'type' => 'text' ) ) . ' ' .
+					Xml::input( 'rootpage', 50, $this->rootpage,
+						array( 'id' => 'mw-interwiki-rootpage-interwiki', 'type' => 'text' ) ) . ' ' .
 					"</td>
 				</tr>
 				<tr>
 					<td>
 					</td>
 					<td class='mw-submit'>" .
-						Xml::submitButton( $this->msg( 'import-interwiki-submit' )->text(), Linker::tooltipAndAccesskeyAttribs( 'import' ) ) .
+					Xml::submitButton(
+						$this->msg( 'import-interwiki-submit' )->text(),
+						Linker::tooltipAndAccesskeyAttribs( 'import' )
+					) .
 					"</td>
 				</tr>" .
-				Xml::closeElement( 'table' ).
-				Xml::closeElement( 'form' ) .
-				Xml::closeElement( 'fieldset' )
+					Xml::closeElement( 'table' ) .
+					Xml::closeElement( 'form' ) .
+					Xml::closeElement( 'fieldset' )
 			);
 		}
 	}
@@ -352,14 +406,21 @@ class SpecialImport extends SpecialPage {
  * @ingroup SpecialPage
  */
 class ImportReporter extends ContextSource {
-	private $reason=false;
+	private $reason = false;
 	private $mOriginalLogCallback = null;
 	private $mOriginalPageOutCallback = null;
 	private $mLogItemCount = 0;
 
+
+	/**
+	 * @param WikiImporter $importer
+	 * @param $upload
+	 * @param $interwiki
+	 * @param string|bool $reason
+	 */
 	function __construct( $importer, $upload, $interwiki, $reason = false ) {
 		$this->mOriginalPageOutCallback =
-				$importer->setPageOutCallback( array( $this, 'reportPage' ) );
+			$importer->setPageOutCallback( array( $this, 'reportPage' ) );
 		$this->mOriginalLogCallback =
 			$importer->setLogItemCallback( array( $this, 'reportLogItem' ) );
 		$importer->setNoticeCallback( array( $this, 'reportNotice' ) );
@@ -403,20 +464,21 @@ class ImportReporter extends ContextSource {
 
 		$this->mPageCount++;
 
-		if( $successCount > 0 ) {
-			$this->getOutput()->addHTML( "<li>" . Linker::linkKnown( $title ) . " " .
-				$this->msg( 'import-revision-count' )->numParams( $successCount )->escaped() .
-				"</li>\n"
+		if ( $successCount > 0 ) {
+			$this->getOutput()->addHTML(
+				"<li>" . Linker::linkKnown( $title ) . " " .
+					$this->msg( 'import-revision-count' )->numParams( $successCount )->escaped() .
+					"</li>\n"
 			);
 
 			$log = new LogPage( 'import' );
-			if( $this->mIsUpload ) {
+			if ( $this->mIsUpload ) {
 				$detail = $this->msg( 'import-logentry-upload-detail' )->numParams(
 					$successCount )->inContentLanguage()->text();
 				if ( $this->reason ) {
 					$detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
 				}
-				$log->addEntry( 'upload', $title, $detail );
+				$log->addEntry( 'upload', $title, $detail, array(), $this->getUser() );
 			} else {
 				$interwiki = '[[:' . $this->mInterwiki . ':' .
 					$origTitle->getPrefixedText() . ']]';
@@ -425,7 +487,7 @@ class ImportReporter extends ContextSource {
 				if ( $this->reason ) {
 					$detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
 				}
-				$log->addEntry( 'interwiki', $title, $detail );
+				$log->addEntry( 'interwiki', $title, $detail, array(), $this->getUser() );
 			}
 
 			$comment = $detail; // quick
@@ -450,8 +512,9 @@ class ImportReporter extends ContextSource {
 		if ( $this->mLogItemCount > 0 ) {
 			$msg = $this->msg( 'imported-log-entries' )->numParams( $this->mLogItemCount )->parse();
 			$out->addHTML( Xml::tags( 'li', null, $msg ) );
-		} elseif( $this->mPageCount == 0 && $this->mLogItemCount == 0 ) {
+		} elseif ( $this->mPageCount == 0 && $this->mLogItemCount == 0 ) {
 			$out->addHTML( "</ul>\n" );
+
 			return Status::newFatal( 'importnopages' );
 		}
 		$out->addHTML( "</ul>\n" );
diff --git a/includes/specials/SpecialJavaScriptTest.php b/includes/specials/SpecialJavaScriptTest.php
index d204d50c..7069d527 100644
--- a/includes/specials/SpecialJavaScriptTest.php
+++ b/includes/specials/SpecialJavaScriptTest.php
@@ -55,24 +55,29 @@ class SpecialJavaScriptTest extends SpecialPage {
 		if ( $par == '' ) {
 			$out->setPageTitle( $this->msg( 'javascripttest' ) );
 			$summary = $this->wrapSummaryHtml(
-				$this->msg( 'javascripttest-pagetext-noframework' )->escaped() . $this->getFrameworkListHtml(),
+				$this->msg( 'javascripttest-pagetext-noframework' )->escaped() .
+					$this->getFrameworkListHtml(),
 				'noframework'
 			);
 			$out->addHtml( $summary );
-
-		// Matched! Display proper title and initialize the framework
 		} elseif ( isset( self::$frameworks[$framework] ) ) {
-			$out->setPageTitle( $this->msg( 'javascripttest-title', $this->msg( "javascripttest-$framework-name" )->plain() ) );
-			$out->setSubtitle( $this->msg( 'javascripttest-backlink' )->rawParams( Linker::linkKnown( $this->getTitle() ) ) );
+			// Matched! Display proper title and initialize the framework
+			$out->setPageTitle( $this->msg(
+				'javascripttest-title',
+				// Messages: javascripttest-qunit-name
+				$this->msg( "javascripttest-$framework-name" )->plain()
+			) );
+			$out->setSubtitle( $this->msg( 'javascripttest-backlink' )
+				->rawParams( Linker::linkKnown( $this->getTitle() ) ) );
 			$this->{self::$frameworks[$framework]}();
-
-		// Framework not found, display error
 		} else {
+			// Framework not found, display error
 			$out->setPageTitle( $this->msg( 'javascripttest' ) );
-			$summary = $this->wrapSummaryHtml( '<p class="error">'
-				. $this->msg( 'javascripttest-pagetext-unknownframework', $par )->escaped()
-				. '</p>'
-				. $this->getFrameworkListHtml(),
+			$summary = $this->wrapSummaryHtml(
+				'<p class="error">' .
+					$this->msg( 'javascripttest-pagetext-unknownframework', $par )->escaped() .
+					'</p>' .
+					$this->getFrameworkListHtml(),
 				'unknownframework'
 			);
 			$out->addHtml( $summary );
@@ -80,22 +85,28 @@ class SpecialJavaScriptTest extends SpecialPage {
 	}
 
 	/**
-	 * Get a list of frameworks (including introduction paragraph and links to the framework run pages)
-	 * @return String: HTML
+	 * Get a list of frameworks (including introduction paragraph and links
+	 * to the framework run pages)
+	 *
+	 * @return string HTML
 	 */
 	private function getFrameworkListHtml() {
 		$list = '<ul>';
-		foreach( self::$frameworks as $framework => $initFn ) {
+		foreach ( self::$frameworks as $framework => $initFn ) {
 			$list .= Html::rawElement(
 				'li',
 				array(),
-				Linker::link( $this->getTitle( $framework ), $this->msg( "javascripttest-$framework-name" )->escaped() )
+				Linker::link(
+					$this->getTitle( $framework ),
+					// Message: javascripttest-qunit-name
+					$this->msg( "javascripttest-$framework-name" )->escaped()
+				)
 			);
 		}
 		$list .= '</ul>';
-		$msg = $this->msg( 'javascripttest-pagetext-frameworks' )->rawParams( $list )->parseAsBlock();
 
-		return $msg;
+		return $this->msg( 'javascripttest-pagetext-frameworks' )->rawParams( $list )
+			->parseAsBlock();
 	}
 
 	/**
@@ -109,12 +120,14 @@ class SpecialJavaScriptTest extends SpecialPage {
 	 */
 	private function wrapSummaryHtml( $html, $state ) {
 		$validStates = array( 'noframework', 'unknownframework', 'frameworkfound' );
-		if( !in_array( $state, $validStates ) ) {
+
+		if ( !in_array( $state, $validStates ) ) {
 			throw new MWException( __METHOD__
 				. ' given an invalid state. Must be one of "'
-				. join( '", "', $validStates) . '".'
+				. join( '", "', $validStates ) . '".'
 			);
 		}
+
 		return "<div id=\"mw-javascripttest-summary\" class=\"mw-javascripttest-$state\">$html</div>";
 	}
 
@@ -155,7 +168,10 @@ HTML;
 
 		// Used in ./tests/qunit/data/testrunner.js, see also documentation of
 		// $wgJavaScriptTestConfig in DefaultSettings.php
-		$out->addJsConfigVars( 'QUnitTestSwarmInjectJSPath', $wgJavaScriptTestConfig['qunit']['testswarm-injectjs'] );
+		$out->addJsConfigVars(
+			'QUnitTestSwarmInjectJSPath',
+			$wgJavaScriptTestConfig['qunit']['testswarm-injectjs']
+		);
 	}
 
 	protected function getGroupName() {
diff --git a/includes/specials/SpecialLinkSearch.php b/includes/specials/SpecialLinkSearch.php
index 030416fb..5b0c56e5 100644
--- a/includes/specials/SpecialLinkSearch.php
+++ b/includes/specials/SpecialLinkSearch.php
@@ -55,7 +55,7 @@ class LinkSearchPage extends QueryPage {
 		$namespace = $request->getIntorNull( 'namespace', null );
 
 		$protocols_list = array();
-		foreach( $wgUrlProtocols as $prot ) {
+		foreach ( $wgUrlProtocols as $prot ) {
 			if ( $prot !== '//' ) {
 				$protocols_list[] = $prot;
 			}
@@ -72,7 +72,7 @@ class LinkSearchPage extends QueryPage {
 		} elseif ( !$pr_sl && $pr_cl ) {
 			// For protocols without '//' like 'mailto:'
 			$protocol = substr( $target2, 0, $pr_cl + 1 );
-			$target2 = substr( $target2, $pr_cl+1 );
+			$target2 = substr( $target2, $pr_cl + 1 );
 		} elseif ( $protocol == '' && $target2 != '' ) {
 			// default
 			$protocol = 'http://';
@@ -88,11 +88,21 @@ class LinkSearchPage extends QueryPage {
 			'<nowiki>' . $this->getLanguage()->commaList( $protocols_list ) . '</nowiki>',
 			count( $protocols_list )
 		);
-		$s = Html::openElement( 'form', array( 'id' => 'mw-linksearch-form', 'method' => 'get', 'action' => $wgScript ) ) . "\n" .
+		$s = Html::openElement(
+			'form',
+			array( 'id' => 'mw-linksearch-form', 'method' => 'get', 'action' => $wgScript )
+		) . "\n" .
 			Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" .
 			Html::openElement( 'fieldset' ) . "\n" .
 			Html::element( 'legend', array(), $this->msg( 'linksearch' )->text() ) . "\n" .
-			Xml::inputLabel( $this->msg( 'linksearch-pat' )->text(), 'target', 'target', 50, $target ) . "\n";
+			Xml::inputLabel(
+				$this->msg( 'linksearch-pat' )->text(),
+				'target',
+				'target',
+				50,
+				$target
+			) . "\n";
+
 		if ( !$wgMiserMode ) {
 			$s .= Html::namespaceSelector(
 				array(
@@ -100,25 +110,27 @@ class LinkSearchPage extends QueryPage {
 					'all' => '',
 					'label' => $this->msg( 'linksearch-ns' )->text()
 				), array(
-					'name'  => 'namespace',
-					'id'    => 'namespace',
+					'name' => 'namespace',
+					'id' => 'namespace',
 					'class' => 'namespaceselector',
 				)
 			);
 		}
+
 		$s .= Xml::submitButton( $this->msg( 'linksearch-ok' )->text() ) . "\n" .
 			Html::closeElement( 'fieldset' ) . "\n" .
 			Html::closeElement( 'form' ) . "\n";
 		$out->addHTML( $s );
 
-		if( $target != '' ) {
+		if ( $target != '' ) {
 			$this->setParams( array(
 				'query' => $target2,
 				'namespace' => $namespace,
 				'protocol' => $protocol ) );
 			parent::execute( $par );
-			if( $this->mMungedQuery === false )
+			if ( $this->mMungedQuery === false ) {
 				$out->addWikiMsg( 'linksearch-error' );
+			}
 		}
 	}
 
@@ -133,6 +145,8 @@ class LinkSearchPage extends QueryPage {
 	/**
 	 * Return an appropriately formatted LIKE query and the clause
 	 *
+	 * @param string $query
+	 * @param string $prot
 	 * @return array
 	 */
 	static function mungeQuery( $query, $prot ) {
@@ -140,12 +154,14 @@ class LinkSearchPage extends QueryPage {
 		$rv = LinkFilter::makeLikeArray( $query, $prot );
 		if ( $rv === false ) {
 			// LinkFilter doesn't handle wildcard in IP, so we'll have to munge here.
-			if ( preg_match( '/^(:?[0-9]{1,3}\.)+\*\s*$|^(:?[0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]*\*\s*$/', $query ) ) {
+			$pattern = '/^(:?[0-9]{1,3}\.)+\*\s*$|^(:?[0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]*\*\s*$/';
+			if ( preg_match( $pattern, $query ) ) {
 				$dbr = wfGetDB( DB_SLAVE );
 				$rv = array( $prot . rtrim( $query, " \t*" ), $dbr->anyString() );
 				$field = 'el_to';
 			}
 		}
+
 		return array( $rv, $field );
 	}
 
@@ -153,9 +169,10 @@ class LinkSearchPage extends QueryPage {
 		global $wgMiserMode;
 		$params = array();
 		$params['target'] = $this->mProt . $this->mQuery;
-		if( isset( $this->mNs ) && !$wgMiserMode ) {
+		if ( isset( $this->mNs ) && !$wgMiserMode ) {
 			$params['namespace'] = $this->mNs;
 		}
+
 		return $params;
 	}
 
@@ -164,29 +181,41 @@ class LinkSearchPage extends QueryPage {
 		$dbr = wfGetDB( DB_SLAVE );
 		// strip everything past first wildcard, so that
 		// index-based-only lookup would be done
-		list( $this->mMungedQuery, $clause ) = self::mungeQuery(
-				$this->mQuery, $this->mProt );
-		if( $this->mMungedQuery === false )
+		list( $this->mMungedQuery, $clause ) = self::mungeQuery( $this->mQuery, $this->mProt );
+		if ( $this->mMungedQuery === false ) {
 			// Invalid query; return no results
 			return array( 'tables' => 'page', 'fields' => 'page_id', 'conds' => '0=1' );
+		}
 
 		$stripped = LinkFilter::keepOneWildcard( $this->mMungedQuery );
 		$like = $dbr->buildLike( $stripped );
-		$retval = array (
-			'tables' => array ( 'page', 'externallinks' ),
-			'fields' => array ( 'namespace' => 'page_namespace',
-					'title' => 'page_title',
-					'value' => 'el_index', 'url' => 'el_to' ),
-			'conds' => array ( 'page_id = el_from',
-					"$clause $like" ),
+		$retval = array(
+			'tables' => array( 'page', 'externallinks' ),
+			'fields' => array(
+				'namespace' => 'page_namespace',
+				'title' => 'page_title',
+				'value' => 'el_index',
+				'url' => 'el_to'
+			),
+			'conds' => array(
+				'page_id = el_from',
+				"$clause $like"
+			),
 			'options' => array( 'USE INDEX' => $clause )
 		);
+
 		if ( isset( $this->mNs ) && !$wgMiserMode ) {
 			$retval['conds']['page_namespace'] = $this->mNs;
 		}
+
 		return $retval;
 	}
 
+	/**
+	 * @param Skin $skin
+	 * @param object $result Result row
+	 * @return string
+	 */
 	function formatResult( $skin, $result ) {
 		$title = Title::makeTitle( $result->namespace, $result->title );
 		$url = $result->url;
@@ -201,7 +230,7 @@ class LinkSearchPage extends QueryPage {
 	 */
 	function doQuery( $offset = false, $limit = false ) {
 		list( $this->mMungedQuery, ) = LinkSearchPage::mungeQuery( $this->mQuery, $this->mProt );
-		if( $this->mMungedQuery === false ) {
+		if ( $this->mMungedQuery === false ) {
 			$this->getOutput()->addWikiMsg( 'linksearch-error' );
 		} else {
 			// For debugging
diff --git a/includes/specials/SpecialListfiles.php b/includes/specials/SpecialListfiles.php
index c864ae2a..dff1cf70 100644
--- a/includes/specials/SpecialListfiles.php
+++ b/includes/specials/SpecialListfiles.php
@@ -22,7 +22,6 @@
  */
 
 class SpecialListFiles extends IncludableSpecialPage {
-
 	public function __construct() {
 		parent::__construct( 'Listfiles' );
 	}
@@ -37,9 +36,16 @@ class SpecialListFiles extends IncludableSpecialPage {
 		} else {
 			$userName = $this->getRequest()->getText( 'user', $par );
 			$search = $this->getRequest()->getText( 'ilsearch', '' );
+			$showAll = $this->getRequest()->getBool( 'ilshowall', false );
 		}
 
-		$pager = new ImageListPager( $this->getContext(), $userName, $search, $this->including() );
+		$pager = new ImageListPager(
+			$this->getContext(),
+			$userName,
+			$search,
+			$this->including(),
+			$showAll
+		);
 
 		if ( $this->including() ) {
 			$html = $pager->getBody();
@@ -62,27 +68,33 @@ class SpecialListFiles extends IncludableSpecialPage {
  */
 class ImageListPager extends TablePager {
 	var $mFieldNames = null;
+	// Subclasses should override buildQueryConds instead of using $mQueryConds variable.
 	var $mQueryConds = array();
 	var $mUserName = null;
 	var $mSearch = '';
 	var $mIncluding = false;
+	var $mShowAll = false;
+	var $mTableName = 'image';
 
-	function __construct( IContextSource $context, $userName = null, $search = '', $including = false ) {
+	function __construct( IContextSource $context, $userName = null, $search = '',
+		$including = false, $showAll = false
+	) {
 		global $wgMiserMode;
 
 		$this->mIncluding = $including;
+		$this->mShowAll = $showAll;
 
 		if ( $userName ) {
 			$nt = Title::newFromText( $userName, NS_USER );
 			if ( !is_null( $nt ) ) {
 				$this->mUserName = $nt->getText();
-				$this->mQueryConds['img_user_text'] = $this->mUserName;
 			}
 		}
 
-		if ( $search != '' && !$wgMiserMode ) {
+		if ( $search !== '' && !$wgMiserMode ) {
 			$this->mSearch = $search;
 			$nt = Title::newFromURL( $this->mSearch );
+
 			if ( $nt ) {
 				$dbr = wfGetDB( DB_SLAVE );
 				$this->mQueryConds[] = 'LOWER(img_name)' .
@@ -104,6 +116,42 @@ class ImageListPager extends TablePager {
 		parent::__construct( $context );
 	}
 
+	/**
+	 * Build the where clause of the query.
+	 *
+	 * Replaces the older mQueryConds member variable.
+	 * @param $table String Either "image" or "oldimage"
+	 * @return array The query conditions.
+	 */
+	protected function buildQueryConds( $table ) {
+		$prefix = $table === 'image' ? 'img' : 'oi';
+		$conds = array();
+
+		if ( !is_null( $this->mUserName ) ) {
+			$conds[ $prefix . '_user_text' ] = $this->mUserName;
+		}
+
+		if ( $this->mSearch !== '' ) {
+			$nt = Title::newFromURL( $this->mSearch );
+			if ( $nt ) {
+				$dbr = wfGetDB( DB_SLAVE );
+				$conds[] = 'LOWER(' . $prefix . '_name)' .
+					$dbr->buildLike( $dbr->anyString(),
+						strtolower( $nt->getDBkey() ), $dbr->anyString() );
+			}
+		}
+
+		if ( $table === 'oldimage' ) {
+			// Don't want to deal with revdel.
+			// Future fixme: Show partial information as appropriate.
+			// Would have to be careful about filtering by username when username is deleted.
+			$conds['oi_deleted'] = 0;
+		}
+
+		// Add mQueryConds in case anyone was subclassing and using the old variable.
+		return $conds + $this->mQueryConds;
+	}
+
 	/**
 	 * @return Array
 	 */
@@ -118,34 +166,94 @@ class ImageListPager extends TablePager {
 				'img_user_text' => $this->msg( 'listfiles_user' )->text(),
 				'img_description' => $this->msg( 'listfiles_description' )->text(),
 			);
-			if( !$wgMiserMode ) {
+			if ( !$wgMiserMode && !$this->mShowAll ) {
 				$this->mFieldNames['count'] = $this->msg( 'listfiles_count' )->text();
 			}
+			if ( $this->mShowAll ) {
+				$this->mFieldNames['top'] = $this->msg( 'listfiles-latestversion' )->text();
+			}
 		}
+
 		return $this->mFieldNames;
 	}
 
 	function isFieldSortable( $field ) {
+		global $wgMiserMode;
 		if ( $this->mIncluding ) {
 			return false;
 		}
-		static $sortable = array( 'img_timestamp', 'img_name' );
-		if ( $field == 'img_size' ) {
-			# No index for both img_size and img_user_text
-			return !isset( $this->mQueryConds['img_user_text'] );
+		$sortable = array( 'img_timestamp', 'img_name', 'img_size' );
+		/* For reference, the indicies we can use for sorting are:
+		 * On the image table: img_usertext_timestamp, img_size, img_timestamp
+		 * On oldimage: oi_usertext_timestamp, oi_name_timestamp
+		 *
+		 * In particular that means we cannot sort by timestamp when not filtering
+		 * by user and including old images in the results. Which is sad.
+		 */
+		if ( $wgMiserMode && !is_null( $this->mUserName ) ) {
+			// If we're sorting by user, the index only supports sorting by time.
+			if ( $field === 'img_timestamp' ) {
+				return true;
+			} else {
+				return false;
+			}
+		} elseif ( $wgMiserMode && $this->mShowAll /* && mUserName === null */ ) {
+			// no oi_timestamp index, so only alphabetical sorting in this case.
+			if ( $field === 'img_name' ) {
+				return true;
+			} else {
+				return false;
+			}
 		}
+
 		return in_array( $field, $sortable );
 	}
 
 	function getQueryInfo() {
-		$tables = array( 'image' );
+		// Hacky Hacky Hacky - I want to get query info
+		// for two different tables, without reimplementing
+		// the pager class.
+		$qi = $this->getQueryInfoReal( $this->mTableName );
+		return $qi;
+	}
+
+	/**
+	 * Actually get the query info.
+	 *
+	 * This is to allow displaying both stuff from image and oldimage table.
+	 *
+	 * This is a bit hacky.
+	 *
+	 * @param $table String Either 'image' or 'oldimage'
+	 * @return array Query info
+	 */
+	protected function getQueryInfoReal( $table ) {
+		$prefix = $table === 'oldimage' ? 'oi' : 'img';
+
+		$tables = array( $table );
 		$fields = array_keys( $this->getFieldNames() );
-		$fields[] = 'img_user';
-		$fields[array_search( 'thumb', $fields )] = 'img_name AS thumb';
+
+		if ( $table === 'oldimage' ) {
+			foreach ( $fields as $id => &$field ) {
+				if ( substr( $field, 0, 4 ) !== 'img_' ) {
+					continue;
+				}
+				$field = $prefix . substr( $field, 3 ) . ' AS ' . $field;
+			}
+			$fields[array_search('top', $fields)] = "'no' AS top";
+		} else {
+			if ( $this->mShowAll ) {
+				$fields[array_search( 'top', $fields )] = "'yes' AS top";
+			}
+		}
+		$fields[] = $prefix . '_user AS img_user';
+		$fields[array_search( 'thumb', $fields )] = $prefix . '_name AS thumb';
+
 		$options = $join_conds = array();
 
 		# Depends on $wgMiserMode
-		if( isset( $this->mFieldNames['count'] ) ) {
+		# Will also not happen if mShowAll is true.
+		if ( isset( $this->mFieldNames['count'] ) ) {
 			$tables[] = 'oldimage';
 
 			# Need to rewrite this one
@@ -157,7 +265,7 @@ class ImageListPager extends TablePager {
 			unset( $field );
 
 			$dbr = wfGetDB( DB_SLAVE );
-			if( $dbr->implicitGroupby() ) {
+			if ( $dbr->implicitGroupby() ) {
 				$options = array( 'GROUP BY' => 'img_name' );
 			} else {
 				$columnlist = preg_grep( '/^img/', array_keys( $this->getFieldNames() ) );
@@ -165,17 +273,107 @@ class ImageListPager extends TablePager {
 			}
 			$join_conds = array( 'oldimage' => array( 'LEFT JOIN', 'oi_name = img_name' ) );
 		}
+
 		return array(
-			'tables'     => $tables,
-			'fields'     => $fields,
-			'conds'      => $this->mQueryConds,
-			'options'    => $options,
+			'tables' => $tables,
+			'fields' => $fields,
+			'conds' => $this->buildQueryConds( $table ),
+			'options' => $options,
 			'join_conds' => $join_conds
 		);
 	}
 
+	/**
+	 * Override reallyDoQuery to mix together two queries.
+	 *
+	 * @note $asc is named $descending in IndexPager base class. However
+	 *   it is true when the order is ascending, and false when the order
+	 *   is descending, so I renamed it to $asc here.
+	 */
+	function reallyDoQuery( $offset, $limit, $asc ) {
+		$prevTableName = $this->mTableName;
+		$this->mTableName = 'image';
+		list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $asc );
+		$imageRes = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
+		$this->mTableName = $prevTableName;
+
+		if ( !$this->mShowAll ) {
+			return $imageRes;
+		}
+
+		$this->mTableName = 'oldimage';
+
+		# Hacky...
+		$oldIndex = $this->mIndexField;
+		if ( substr( $this->mIndexField, 0, 4 ) !== 'img_' ) {
+			throw new MWException( "Expected to be sorting on an image table field" );
+		}
+		$this->mIndexField = 'oi_' . substr( $this->mIndexField, 4 );
+
+		list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $asc );
+		$oldimageRes = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
+
+		$this->mTableName = $prevTableName;
+		$this->mIndexField = $oldIndex;
+
+		return $this->combineResult( $imageRes, $oldimageRes, $limit, $asc );
+	}
+
+	/**
+	 * Combine results from 2 tables.
+	 *
+	 * Note: This will throw away some results
+	 *
+	 * @param $res1 ResultWrapper
+	 * @param $res2 ResultWrapper
+	 * @param $limit int
+	 * @param $ascending boolean See note about $asc in $this->reallyDoQuery
+	 * @return FakeResultWrapper $res1 and $res2 combined
+	 */
+	protected function combineResult( $res1, $res2, $limit, $ascending ) {
+		$res1->rewind();
+		$res2->rewind();
+		$topRes1 = $res1->next();
+		$topRes2 = $res2->next();
+		$resultArray = array();
+		for ( $i = 0; $i < $limit && $topRes1 && $topRes2; $i++ ) {
+			if ( strcmp( $topRes1->{ $this->mIndexField }, $topRes2->{ $this->mIndexField } ) > 0 ) {
+				if ( !$ascending ) {
+					$resultArray[] = $topRes1;
+					$topRes1 = $res1->next();
+				} else {
+					$resultArray[] = $topRes2;
+					$topRes2 = $res2->next();
+				}
+			} else {
+				if ( !$ascending ) {
+					$resultArray[] = $topRes2;
+					$topRes2 = $res2->next();
+				} else {
+					$resultArray[] = $topRes1;
+					$topRes1 = $res1->next();
+				}
+			}
+		}
+		for ( ; $i < $limit && $topRes1; $i++ ) {
+			$resultArray[] = $topRes1;
+			$topRes1 = $res1->next();
+		}
+		for ( ; $i < $limit && $topRes2; $i++ ) {
+			$resultArray[] = $topRes2;
+			$topRes2 = $res2->next();
+		}
+		return new FakeResultWrapper( $resultArray );
+	}
+
 	function getDefaultSort() {
-		return 'img_timestamp';
+		global $wgMiserMode;
+		if ( $this->mShowAll && $wgMiserMode && is_null( $this->mUserName ) ) {
+			// Unfortunately no index on oi_timestamp.
+			return 'img_name';
+		} else {
+			return 'img_timestamp';
+		}
 	}
 
 	function doBatchLookups() {
@@ -191,24 +389,37 @@ class ImageListPager extends TablePager {
 	function formatValue( $field, $value ) {
 		switch ( $field ) {
 			case 'thumb':
-				$file = wfLocalFile( $value );
-				$thumb = $file->transform( array( 'width' => 180, 'height' => 360 ) );
-				return $thumb->toHtml( array( 'desc-link' => true ) );
+				$opt = array( 'time' => $this->mCurrentRow->img_timestamp );
+				$file = RepoGroup::singleton()->getLocalRepo()->findFile( $value, $opt );
+				// If statement for paranoia
+				if ( $file ) {
+					$thumb = $file->transform( array( 'width' => 180, 'height' => 360 ) );
+					return $thumb->toHtml( array( 'desc-link' => true ) );
+				} else {
+					return htmlspecialchars( $value );
+				}
 			case 'img_timestamp':
+				// We may want to make this a link to the "old" version when displaying old files
 				return htmlspecialchars( $this->getLanguage()->userTimeAndDate( $value, $this->getUser() ) );
 			case 'img_name':
 				static $imgfile = null;
-				if ( $imgfile === null ) $imgfile = $this->msg( 'imgfile' )->text();
+				if ( $imgfile === null ) {
+					$imgfile = $this->msg( 'imgfile' )->text();
+				}
 
 				// Weird files can maybe exist? Bug 22227
 				$filePage = Title::makeTitleSafe( NS_FILE, $value );
-				if( $filePage ) {
-					$link = Linker::linkKnown( $filePage, htmlspecialchars( $filePage->getText() ) );
+				if ( $filePage ) {
+					$link = Linker::linkKnown(
+						$filePage,
+						htmlspecialchars( $filePage->getText() )
+					);
 					$download = Xml::element( 'a',
 						array( 'href' => wfLocalFile( $filePage )->getURL() ),
 						$imgfile
 					);
 					$download = $this->msg( 'parentheses' )->rawParams( $download )->escaped();
+
 					return "$link $download";
 				} else {
 					return htmlspecialchars( $value );
@@ -223,6 +434,7 @@ class ImageListPager extends TablePager {
 				} else {
 					$link = htmlspecialchars( $value );
 				}
+
 				return $link;
 			case 'img_size':
 				return htmlspecialchars( $this->getLanguage()->formatSize( $value ) );
@@ -230,32 +442,47 @@ class ImageListPager extends TablePager {
 				return Linker::formatComment( $value );
 			case 'count':
 				return intval( $value ) + 1;
+			case 'top':
+				// Messages: listfiles-latestversion-yes, listfiles-latestversion-no
+				return $this->msg( 'listfiles-latestversion-' . $value );
 		}
 	}
 
 	function getForm() {
 		global $wgScript, $wgMiserMode;
 		$inputForm = array();
-		$inputForm['table_pager_limit_label'] = $this->getLimitSelect();
+		$inputForm['table_pager_limit_label'] = $this->getLimitSelect( array( 'tabindex' => 1 ) );
 		if ( !$wgMiserMode ) {
-			$inputForm['listfiles_search_for'] = Html::input( 'ilsearch', $this->mSearch, 'text',
+			$inputForm['listfiles_search_for'] = Html::input(
+				'ilsearch',
+				$this->mSearch,
+				'text',
 				array(
-					'size' 		=> '40',
+					'size' => '40',
 					'maxlength' => '255',
-					'id' 		=> 'mw-ilsearch',
-			) );
+					'id' => 'mw-ilsearch',
+					'tabindex' => 2,
+				)
+			);
 		}
 		$inputForm['username'] = Html::input( 'user', $this->mUserName, 'text', array(
-			'size' 		=> '40',
+			'size' => '40',
 			'maxlength' => '255',
-			'id' 		=> 'mw-listfiles-user',
+			'id' => 'mw-listfiles-user',
+			'tabindex' => 3,
+		) );
+
+		$inputForm['listfiles-show-all'] = Html::input( 'ilshowall', 1, 'checkbox', array(
+			'checked' => $this->mShowAll,
+			'tabindex' => 4,
 		) );
 		return Html::openElement( 'form',
-				array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listfiles-form' ) ) .
+			array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listfiles-form' )
+		) .
 			Xml::fieldset( $this->msg( 'listfiles' )->text() ) .
 			Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
-			Xml::buildForm( $inputForm, 'table_pager_limit_submit' ) .
-			$this->getHiddenFields( array( 'limit', 'ilsearch', 'user', 'title' ) ) .
+			Xml::buildForm( $inputForm, 'table_pager_limit_submit', array( 'tabindex' => 5 ) ) .
+			$this->getHiddenFields( array( 'limit', 'ilsearch', 'user', 'title', 'ilshowall' ) ) .
 			Html::closeElement( 'fieldset' ) .
 			Html::closeElement( 'form' ) . "\n";
 	}
@@ -280,6 +507,7 @@ class ImageListPager extends TablePager {
 				$query['user'] = $this->mUserName;
 			}
 		}
+
 		return $queries;
 	}
 
@@ -288,6 +516,7 @@ class ImageListPager extends TablePager {
 		if ( !isset( $queries['user'] ) && !is_null( $this->mUserName ) ) {
 			$queries['user'] = $this->mUserName;
 		}
+
 		return $queries;
 	}
 
diff --git a/includes/specials/SpecialListgrouprights.php b/includes/specials/SpecialListgrouprights.php
index 7cccf887..82a4f70f 100644
--- a/includes/specials/SpecialListgrouprights.php
+++ b/includes/specials/SpecialListgrouprights.php
@@ -29,7 +29,6 @@
  * @author Petr Kadlec <mormegil@centrum.cz>
  */
 class SpecialListGroupRights extends SpecialPage {
-
 	/**
 	 * Constructor
 	 */
@@ -51,11 +50,13 @@ class SpecialListGroupRights extends SpecialPage {
 		$out = $this->getOutput();
 		$out->addModuleStyles( 'mediawiki.special' );
 
+		$out->wrapWikiMsg( "<div class=\"mw-listgrouprights-key\">\n$1\n</div>", 'listgrouprights-key' );
+
 		$out->addHTML(
 			Xml::openElement( 'table', array( 'class' => 'wikitable mw-listgrouprights-table' ) ) .
 				'<tr>' .
-					Xml::element( 'th', null, $this->msg( 'listgrouprights-group' )->text() ) .
-					Xml::element( 'th', null, $this->msg( 'listgrouprights-rights' )->text() ) .
+				Xml::element( 'th', null, $this->msg( 'listgrouprights-group' )->text() ) .
+				Xml::element( 'th', null, $this->msg( 'listgrouprights-rights' )->text() ) .
 				'</tr>'
 		);
 
@@ -85,7 +86,7 @@ class SpecialListGroupRights extends SpecialPage {
 				$msg->text() :
 				MWNamespace::getCanonicalName( NS_PROJECT ) . ':' . $groupname;
 
-			if( $group == '*' ) {
+			if ( $group == '*' ) {
 				// Do not make a link for the generic * group
 				$grouppage = htmlspecialchars( $groupnameLocalized );
 			} else {
@@ -124,16 +125,13 @@ class SpecialListGroupRights extends SpecialPage {
 				"
 				<td>$grouppage$grouplink</td>
 					<td>" .
-						$this->formatPermissions( $permissions, $revoke, $addgroups, $removegroups,
-							$addgroupsSelf, $removegroupsSelf ) .
+					$this->formatPermissions( $permissions, $revoke, $addgroups, $removegroups,
+						$addgroupsSelf, $removegroupsSelf ) .
 					'</td>
 				'
 			) );
 		}
-		$out->addHTML(
-			Xml::closeElement( 'table' ) . "\n<br /><hr />\n"
-		);
-		$out->wrapWikiMsg( "<div class=\"mw-listgrouprights-key\">\n$1\n</div>", 'listgrouprights-key' );
+		$out->addHTML( Xml::closeElement( 'table' ) );
 	}
 
 	/**
@@ -149,9 +147,9 @@ class SpecialListGroupRights extends SpecialPage {
 	 */
 	private function formatPermissions( $permissions, $revoke, $add, $remove, $addSelf, $removeSelf ) {
 		$r = array();
-		foreach( $permissions as $permission => $granted ) {
+		foreach ( $permissions as $permission => $granted ) {
 			//show as granted only if it isn't revoked to prevent duplicate display of permissions
-			if( $granted && ( !isset( $revoke[$permission] ) || !$revoke[$permission] ) ) {
+			if ( $granted && ( !isset( $revoke[$permission] ) || !$revoke[$permission] ) ) {
 				$description = $this->msg( 'listgrouprights-right-display',
 					User::getRightDescription( $permission ),
 					'<span class="mw-listgrouprights-right-name">' . $permission . '</span>'
@@ -159,8 +157,8 @@ class SpecialListGroupRights extends SpecialPage {
 				$r[] = $description;
 			}
 		}
-		foreach( $revoke as $permission => $revoked ) {
-			if( $revoked ) {
+		foreach ( $revoke as $permission => $revoked ) {
+			if ( $revoked ) {
 				$description = $this->msg( 'listgrouprights-right-revoked',
 					User::getRightDescription( $permission ),
 					'<span class="mw-listgrouprights-right-name">' . $permission . '</span>'
@@ -168,45 +166,52 @@ class SpecialListGroupRights extends SpecialPage {
 				$r[] = $description;
 			}
 		}
+
 		sort( $r );
+
 		$lang = $this->getLanguage();
-		if( $add === true ) {
+
+		if ( $add === true ) {
 			$r[] = $this->msg( 'listgrouprights-addgroup-all' )->escaped();
-		} elseif( is_array( $add ) && count( $add ) ) {
+		} elseif ( is_array( $add ) && count( $add ) ) {
 			$add = array_values( array_unique( $add ) );
 			$r[] = $this->msg( 'listgrouprights-addgroup',
 				$lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $add ) ),
 				count( $add )
 			)->parse();
 		}
-		if( $remove === true ) {
+
+		if ( $remove === true ) {
 			$r[] = $this->msg( 'listgrouprights-removegroup-all' )->escaped();
-		} elseif( is_array( $remove ) && count( $remove ) ) {
+		} elseif ( is_array( $remove ) && count( $remove ) ) {
 			$remove = array_values( array_unique( $remove ) );
 			$r[] = $this->msg( 'listgrouprights-removegroup',
 				$lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $remove ) ),
 				count( $remove )
 			)->parse();
 		}
-		if( $addSelf === true ) {
+
+		if ( $addSelf === true ) {
 			$r[] = $this->msg( 'listgrouprights-addgroup-self-all' )->escaped();
-		} elseif( is_array( $addSelf ) && count( $addSelf ) ) {
+		} elseif ( is_array( $addSelf ) && count( $addSelf ) ) {
 			$addSelf = array_values( array_unique( $addSelf ) );
 			$r[] = $this->msg( 'listgrouprights-addgroup-self',
 				$lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $addSelf ) ),
 				count( $addSelf )
 			)->parse();
 		}
-		if( $removeSelf === true ) {
+
+		if ( $removeSelf === true ) {
 			$r[] = $this->msg( 'listgrouprights-removegroup-self-all' )->parse();
-		} elseif( is_array( $removeSelf ) && count( $removeSelf ) ) {
+		} elseif ( is_array( $removeSelf ) && count( $removeSelf ) ) {
 			$removeSelf = array_values( array_unique( $removeSelf ) );
 			$r[] = $this->msg( 'listgrouprights-removegroup-self',
 				$lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $removeSelf ) ),
 				count( $removeSelf )
 			)->parse();
 		}
-		if( empty( $r ) ) {
+
+		if ( empty( $r ) ) {
 			return '';
 		} else {
 			return '<ul><li>' . implode( "</li>\n<li>", $r ) . '</li></ul>';
diff --git a/includes/specials/SpecialListredirects.php b/includes/specials/SpecialListredirects.php
index 0283767a..2c8792ff 100644
--- a/includes/specials/SpecialListredirects.php
+++ b/includes/specials/SpecialListredirects.php
@@ -29,7 +29,6 @@
  * @ingroup SpecialPage
  */
 class ListredirectsPage extends QueryPage {
-
 	function __construct( $name = 'Listredirects' ) {
 		parent::__construct( $name );
 	}
@@ -50,16 +49,16 @@ class ListredirectsPage extends QueryPage {
 		return array(
 			'tables' => array( 'p1' => 'page', 'redirect', 'p2' => 'page' ),
 			'fields' => array( 'namespace' => 'p1.page_namespace',
-					'title' => 'p1.page_title',
-					'value' => 'p1.page_title',
-					'rd_namespace',
-					'rd_title',
-					'rd_fragment',
-					'rd_interwiki',
-					'redirid' => 'p2.page_id' ),
+				'title' => 'p1.page_title',
+				'value' => 'p1.page_title',
+				'rd_namespace',
+				'rd_title',
+				'rd_fragment',
+				'rd_interwiki',
+				'redirid' => 'p2.page_id' ),
 			'conds' => array( 'p1.page_is_redirect' => 1 ),
 			'join_conds' => array( 'redirect' => array(
-					'LEFT JOIN', 'rd_from=p1.page_id' ),
+				'LEFT JOIN', 'rd_from=p1.page_id' ),
 				'p2' => array( 'LEFT JOIN', array(
 					'p2.page_namespace=rd_namespace',
 					'p2.page_title=rd_title' ) ) )
@@ -67,21 +66,23 @@ class ListredirectsPage extends QueryPage {
 	}
 
 	function getOrderFields() {
-		return array ( 'p1.page_namespace', 'p1.page_title' );
+		return array( 'p1.page_namespace', 'p1.page_title' );
 	}
 
 	/**
 	 * Cache page existence for performance
 	 *
-	 * @param $db DatabaseBase
-	 * @param $res ResultWrapper
+	 * @param DatabaseBase $db
+	 * @param ResultWrapper $res
 	 */
 	function preprocessResults( $db, $res ) {
 		$batch = new LinkBatch;
+
 		foreach ( $res as $row ) {
 			$batch->add( $row->namespace, $row->title );
 			$batch->addObj( $this->getRedirectTarget( $row ) );
 		}
+
 		$batch->execute();
 
 		// Back to start for display
@@ -100,10 +101,16 @@ class ListredirectsPage extends QueryPage {
 		} else {
 			$title = Title::makeTitle( $row->namespace, $row->title );
 			$article = WikiPage::factory( $title );
+
 			return $article->getRedirectTarget();
 		}
 	}
 
+	/**
+	 * @param Skin $skin
+	 * @param object $result Result row
+	 * @return string
+	 */
 	function formatResult( $skin, $result ) {
 		# Make a link to the redirect itself
 		$rd_title = Title::makeTitle( $result->namespace, $result->title );
@@ -116,11 +123,12 @@ class ListredirectsPage extends QueryPage {
 
 		# Find out where the redirect leads
 		$target = $this->getRedirectTarget( $result );
-		if( $target ) {
+		if ( $target ) {
 			# Make a link to the destination page
 			$lang = $this->getLanguage();
 			$arr = $lang->getArrow() . $lang->getDirMark();
 			$targetLink = Linker::link( $target );
+
 			return "$rd_link $arr $targetLink";
 		} else {
 			return "<del>$rd_link</del>";
diff --git a/includes/specials/SpecialListusers.php b/includes/specials/SpecialListusers.php
index d253a4d3..8cd9173c 100644
--- a/includes/specials/SpecialListusers.php
+++ b/includes/specials/SpecialListusers.php
@@ -49,7 +49,10 @@ class UsersPager extends AlphabeticPager {
 		$par = ( $par !== null ) ? $par : '';
 		$parms = explode( '/', $par );
 		$symsForAll = array( '*', 'user' );
-		if ( $parms[0] != '' && ( in_array( $par, User::getAllGroups() ) || in_array( $par, $symsForAll ) ) ) {
+
+		if ( $parms[0] != '' &&
+			( in_array( $par, User::getAllGroups() ) || in_array( $par, $symsForAll ) )
+		) {
 			$this->requestedGroup = $par;
 			$un = $request->getText( 'username' );
 		} elseif ( count( $parms ) == 2 ) {
@@ -59,20 +62,25 @@ class UsersPager extends AlphabeticPager {
 			$this->requestedGroup = $request->getVal( 'group' );
 			$un = ( $par != '' ) ? $par : $request->getText( 'username' );
 		}
+
 		if ( in_array( $this->requestedGroup, $symsForAll ) ) {
 			$this->requestedGroup = '';
 		}
 		$this->editsOnly = $request->getBool( 'editsOnly' );
 		$this->creationSort = $request->getBool( 'creationSort' );
 		$this->including = $including;
+		$this->mDefaultDirection = $request->getBool( 'desc' );
 
 		$this->requestedUser = '';
+
 		if ( $un != '' ) {
 			$username = Title::makeTitleSafe( NS_USER, $un );
-			if( ! is_null( $username ) ) {
+
+			if ( !is_null( $username ) ) {
 				$this->requestedUser = $username->getText();
 			}
 		}
+
 		parent::__construct();
 	}
 
@@ -89,27 +97,28 @@ class UsersPager extends AlphabeticPager {
 	function getQueryInfo() {
 		$dbr = wfGetDB( DB_SLAVE );
 		$conds = array();
+
 		// Don't show hidden names
-		if( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+		if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
 			$conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0';
 		}
 
 		$options = array();
 
-		if( $this->requestedGroup != '' ) {
+		if ( $this->requestedGroup != '' ) {
 			$conds['ug_group'] = $this->requestedGroup;
-		} else {
-			//$options['USE INDEX'] = $this->creationSort ? 'PRIMARY' : 'user_name';
 		}
-		if( $this->requestedUser != '' ) {
+
+		if ( $this->requestedUser != '' ) {
 			# Sorted either by account creation or name
-			if( $this->creationSort ) {
+			if ( $this->creationSort ) {
 				$conds[] = 'user_id >= ' . intval( User::idFromName( $this->requestedUser ) );
 			} else {
 				$conds[] = 'user_name >= ' . $dbr->addQuotes( $this->requestedUser );
 			}
 		}
-		if( $this->editsOnly ) {
+
+		if ( $this->editsOnly ) {
 			$conds[] = 'user_editcount > 0';
 		}
 
@@ -129,15 +138,18 @@ class UsersPager extends AlphabeticPager {
 			'options' => $options,
 			'join_conds' => array(
 				'user_groups' => array( 'LEFT JOIN', 'user_id=ug_user' ),
-				'ipblocks' => array( 'LEFT JOIN', array(
-					'user_id=ipb_user',
-					'ipb_auto' => 0
-				)),
+				'ipblocks' => array(
+					'LEFT JOIN', array(
+						'user_id=ipb_user',
+						'ipb_auto' => 0
+					)
+				),
 			),
 			'conds' => $conds
 		);
 
 		wfRunHooks( 'SpecialListusersQueryInfo', array( $this, &$query ) );
+
 		return $query;
 	}
 
@@ -153,42 +165,55 @@ class UsersPager extends AlphabeticPager {
 		$userName = $row->user_name;
 
 		$ulinks = Linker::userLink( $row->user_id, $userName );
-		$ulinks .= Linker::userToolLinksRedContribs( $row->user_id, $userName, intval( $row->edits ) );
+		$ulinks .= Linker::userToolLinksRedContribs(
+			$row->user_id,
+			$userName,
+			(int)$row->edits
+		);
 
 		$lang = $this->getLanguage();
 
 		$groups = '';
 		$groups_list = self::getGroups( $row->user_id );
-		if( !$this->including && count( $groups_list ) > 0 ) {
+
+		if ( !$this->including && count( $groups_list ) > 0 ) {
 			$list = array();
-			foreach( $groups_list as $group )
+			foreach ( $groups_list as $group ) {
 				$list[] = self::buildGroupLink( $group, $userName );
+			}
 			$groups = $lang->commaList( $list );
 		}
 
 		$item = $lang->specialList( $ulinks, $groups );
-		if( $row->ipb_deleted ) {
+
+		if ( $row->ipb_deleted ) {
 			$item = "<span class=\"deleted\">$item</span>";
 		}
 
 		$edits = '';
 		global $wgEdititis;
 		if ( !$this->including && $wgEdititis ) {
-			$edits = ' [' . $this->msg( 'usereditcount' )->numParams( $row->edits )->escaped() . ']';
+			// @fixme i18n issue: Hardcoded square brackets.
+			$edits = ' [' .
+				$this->msg( 'usereditcount' )->numParams( $row->edits )->escaped() .
+				']';
 		}
 
 		$created = '';
-		# Some rows may be NULL
-		if( !$this->including && $row->creation ) {
+		# Some rows may be null
+		if ( !$this->including && $row->creation ) {
 			$user = $this->getUser();
 			$d = $lang->userDate( $row->creation, $user );
 			$t = $lang->userTime( $row->creation, $user );
 			$created = $this->msg( 'usercreated', $d, $t, $row->user_name )->escaped();
 			$created = ' ' . $this->msg( 'parentheses' )->rawParams( $created )->escaped();
 		}
-		$blocked = !is_null( $row->ipb_deleted ) ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
+		$blocked = !is_null( $row->ipb_deleted ) ?
+			' ' . $this->msg( 'listusers-blocked', $userName )->escaped() :
+			'';
 
 		wfRunHooks( 'SpecialListusersFormatRow', array( &$item, $row ) );
+
 		return Html::rawElement( 'li', array(), "{$item}{$edits}{$created}{$blocked}" );
 	}
 
@@ -212,7 +237,10 @@ class UsersPager extends AlphabeticPager {
 		list( $self ) = explode( '/', $this->getTitle()->getPrefixedDBkey() );
 
 		# Form tag
-		$out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listusers-form' ) ) .
+		$out = Xml::openElement(
+			'form',
+			array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listusers-form' )
+		) .
 			Xml::fieldset( $this->msg( 'listusers' )->text() ) .
 			Html::hidden( 'title', $self );
 
@@ -233,12 +261,30 @@ class UsersPager extends AlphabeticPager {
 		$out .= Xml::label( $this->msg( 'group' )->text(), 'group' ) . ' ' .
 			Xml::openElement( 'select', array( 'name' => 'group', 'id' => 'group' ) ) .
 			Xml::option( $this->msg( 'group-all' )->text(), '' );
-		foreach( $this->getAllGroups() as $group => $groupText )
+		foreach ( $this->getAllGroups() as $group => $groupText ) {
 			$out .= Xml::option( $groupText, $group, $group == $this->requestedGroup );
+		}
 		$out .= Xml::closeElement( 'select' ) . '<br />';
-		$out .= Xml::checkLabel( $this->msg( 'listusers-editsonly' )->text(), 'editsOnly', 'editsOnly', $this->editsOnly );
+		$out .= Xml::checkLabel(
+			$this->msg( 'listusers-editsonly' )->text(),
+			'editsOnly',
+			'editsOnly',
+			$this->editsOnly
+		);
+		$out .= '&#160;';
+		$out .= Xml::checkLabel(
+			$this->msg( 'listusers-creationsort' )->text(),
+			'creationSort',
+			'creationSort',
+			$this->creationSort
+		);
 		$out .= '&#160;';
-		$out .= Xml::checkLabel( $this->msg( 'listusers-creationsort' )->text(), 'creationSort', 'creationSort', $this->creationSort );
+		$out .= Xml::checkLabel(
+			$this->msg( 'listusers-desc' )->text(),
+			'desc',
+			'desc',
+			$this->mDefaultDirection
+		);
 		$out .= '<br />';
 
 		wfRunHooks( 'SpecialListusersHeaderForm', array( $this, &$out ) );
@@ -259,10 +305,11 @@ class UsersPager extends AlphabeticPager {
 	 */
 	function getAllGroups() {
 		$result = array();
-		foreach( User::getAllGroups() as $group ) {
+		foreach ( User::getAllGroups() as $group ) {
 			$result[$group] = User::getGroupName( $group );
 		}
 		asort( $result );
+
 		return $result;
 	}
 
@@ -272,13 +319,14 @@ class UsersPager extends AlphabeticPager {
 	 */
 	function getDefaultQuery() {
 		$query = parent::getDefaultQuery();
-		if( $this->requestedGroup != '' ) {
+		if ( $this->requestedGroup != '' ) {
 			$query['group'] = $this->requestedGroup;
 		}
-		if( $this->requestedUser != '' ) {
+		if ( $this->requestedUser != '' ) {
 			$query['username'] = $this->requestedUser;
 		}
 		wfRunHooks( 'SpecialListusersDefaultQuery', array( $this, &$query ) );
+
 		return $query;
 	}
 
@@ -291,6 +339,7 @@ class UsersPager extends AlphabeticPager {
 	protected static function getGroups( $uid ) {
 		$user = User::newFromId( $uid );
 		$groups = array_diff( $user->getEffectiveGroups(), User::getImplicitGroups() );
+
 		return $groups;
 	}
 
@@ -302,7 +351,10 @@ class UsersPager extends AlphabeticPager {
 	 * @return string
 	 */
 	protected static function buildGroupLink( $group, $username ) {
-		return User::makeGroupLinkHtml( $group, htmlspecialchars( User::getGroupMember( $group, $username ) ) );
+		return User::makeGroupLinkHtml(
+			$group,
+			htmlspecialchars( User::getGroupMember( $group, $username ) )
+		);
 	}
 }
 
@@ -310,7 +362,6 @@ class UsersPager extends AlphabeticPager {
  * @ingroup SpecialPage
  */
 class SpecialListUsers extends IncludableSpecialPage {
-
 	/**
 	 * Constructor
 	 */
@@ -337,7 +388,7 @@ class SpecialListUsers extends IncludableSpecialPage {
 			$s = $up->getPageHeader();
 		}
 
-		if( $usersbody ) {
+		if ( $usersbody ) {
 			$s .= $up->getNavigationBar();
 			$s .= Html::rawElement( 'ul', array(), $usersbody );
 			$s .= $up->getNavigationBar();
diff --git a/includes/specials/SpecialLog.php b/includes/specials/SpecialLog.php
index 4fc0f6e8..2ffdd89d 100644
--- a/includes/specials/SpecialLog.php
+++ b/includes/specials/SpecialLog.php
@@ -29,7 +29,6 @@
  * @ingroup SpecialPage
  */
 class SpecialLog extends SpecialPage {
-
 	/**
 	 * List log type for which the target is a user
 	 * Thus if the given target is in NS_MAIN we can alter it to be an NS_USER
@@ -75,14 +74,14 @@ class SpecialLog extends SpecialPage {
 			$opts->setValue( 'month', '' );
 		}
 
-		// Reset the log type to default (nothing) if it's invalid or if the
-		// user does not possess the right to view it
+		// If the user doesn't have the right permission to view the specific
+		// log type, throw a PermissionsError
+		// If the log type is invalid, just show all public logs
 		$type = $opts->getValue( 'type' );
-		if ( !LogPage::isLogType( $type )
-			|| ( isset( $wgLogRestrictions[$type] )
-				&& !$this->getUser()->isAllowed( $wgLogRestrictions[$type] ) )
-		) {
+		if ( !LogPage::isLogType( $type ) ) {
 			$opts->setValue( 'type', '' );
+		} elseif ( isset( $wgLogRestrictions[$type] ) && !$this->getUser()->isAllowed( $wgLogRestrictions[$type] ) ) {
+			throw new PermissionsError( $wgLogRestrictions[$type] );
 		}
 
 		# Handle type-specific inputs
@@ -99,10 +98,10 @@ class SpecialLog extends SpecialPage {
 		# Some log types are only for a 'User:' title but we might have been given
 		# only the username instead of the full title 'User:username'. This part try
 		# to lookup for a user by that name and eventually fix user input. See bug 1697.
-		if( in_array( $opts->getValue( 'type' ), $this->typeOnUser ) ) {
+		if ( in_array( $opts->getValue( 'type' ), $this->typeOnUser ) ) {
 			# ok we have a type of log which expect a user title.
 			$target = Title::newFromText( $opts->getValue( 'page' ) );
-			if( $target && $target->getNamespace() === NS_MAIN ) {
+			if ( $target && $target->getNamespace() === NS_MAIN ) {
 				# User forgot to add 'User:', we are adding it for him
 				$opts->setValue( 'page',
 					Title::makeTitleSafe( NS_USER, $opts->getValue( 'page' ) )
@@ -117,9 +116,11 @@ class SpecialLog extends SpecialPage {
 		global $wgLogTypes;
 
 		# Get parameters
-		$parms = explode( '/', ($par = ( $par !== null ) ? $par : '' ) );
+		$parms = explode( '/', ( $par = ( $par !== null ) ? $par : '' ) );
 		$symsForAll = array( '*', 'all' );
-		if ( $parms[0] != '' && ( in_array( $par, $wgLogTypes ) || in_array( $par, $symsForAll ) ) ) {
+		if ( $parms[0] != '' &&
+			( in_array( $par, $wgLogTypes ) || in_array( $par, $symsForAll ) )
+		) {
 			$opts->setValue( 'type', $par );
 		} elseif ( count( $parms ) == 2 ) {
 			$opts->setValue( 'type', $parms[0] );
@@ -131,10 +132,22 @@ class SpecialLog extends SpecialPage {
 
 	private function show( FormOptions $opts, array $extraConds ) {
 		# Create a LogPager item to get the results and a LogEventsList item to format them...
-		$loglist = new LogEventsList( $this->getContext(), null, LogEventsList::USE_REVDEL_CHECKBOXES );
-		$pager = new LogPager( $loglist, $opts->getValue( 'type' ), $opts->getValue( 'user' ),
-			$opts->getValue( 'page' ), $opts->getValue( 'pattern' ), $extraConds, $opts->getValue( 'year' ),
-			$opts->getValue( 'month' ), $opts->getValue( 'tagfilter' ) );
+		$loglist = new LogEventsList(
+			$this->getContext(),
+			null,
+			LogEventsList::USE_REVDEL_CHECKBOXES
+		);
+		$pager = new LogPager(
+			$loglist,
+			$opts->getValue( 'type' ),
+			$opts->getValue( 'user' ),
+			$opts->getValue( 'page' ),
+			$opts->getValue( 'pattern' ),
+			$extraConds,
+			$opts->getValue( 'year' ),
+			$opts->getValue( 'month' ),
+			$opts->getValue( 'tagfilter' )
+		);
 
 		$this->addHeader( $opts->getValue( 'type' ) );
 
@@ -144,16 +157,28 @@ class SpecialLog extends SpecialPage {
 		}
 
 		# Show form options
-		$loglist->showOptions( $pager->getType(), $opts->getValue( 'user' ), $pager->getPage(), $pager->getPattern(),
-			$pager->getYear(), $pager->getMonth(), $pager->getFilterParams(), $opts->getValue( 'tagfilter' ) );
+		$loglist->showOptions(
+			$pager->getType(),
+			$opts->getValue( 'user' ),
+			$pager->getPage(),
+			$pager->getPattern(),
+			$pager->getYear(),
+			$pager->getMonth(),
+			$pager->getFilterParams(),
+			$opts->getValue( 'tagfilter' )
+		);
 
 		# Insert list
 		$logBody = $pager->getBody();
 		if ( $logBody ) {
 			$this->getOutput()->addHTML(
 				$pager->getNavigationBar() .
-				$this->getRevisionButton( $loglist->beginLogEventsList() . $logBody . $loglist->endLogEventsList() ) .
-				$pager->getNavigationBar()
+					$this->getRevisionButton(
+						$loglist->beginLogEventsList() .
+							$logBody .
+							$loglist->endLogEventsList()
+					) .
+					$pager->getNavigationBar()
 			);
 		} else {
 			$this->getOutput()->addWikiMsg( 'logempty' );
@@ -161,19 +186,27 @@ class SpecialLog extends SpecialPage {
 	}
 
 	private function getRevisionButton( $formcontents ) {
-		# If the user doesn't have the ability to delete log entries, don't bother showing him/her the button.
+		# If the user doesn't have the ability to delete log entries,
+		# don't bother showing them the button.
 		if ( !$this->getUser()->isAllowedAll( 'deletedhistory', 'deletelogentry' ) ) {
 			return $formcontents;
 		}
 
 		# Show button to hide log entries
 		global $wgScript;
-		$s = Html::openElement( 'form', array( 'action' => $wgScript, 'id' => 'mw-log-deleterevision-submit' ) ) . "\n";
+		$s = Html::openElement(
+			'form',
+			array( 'action' => $wgScript, 'id' => 'mw-log-deleterevision-submit' )
+		) . "\n";
 		$s .= Html::hidden( 'title', SpecialPage::getTitleFor( 'Revisiondelete' ) ) . "\n";
 		$s .= Html::hidden( 'target', SpecialPage::getTitleFor( 'Log' ) ) . "\n";
 		$s .= Html::hidden( 'type', 'logging' ) . "\n";
-		$button = Html::element( 'button',
-			array( 'type' => 'submit', 'class' => "deleterevision-log-submit mw-log-deleterevision-button" ),
+		$button = Html::element(
+			'button',
+			array(
+				'type' => 'submit',
+				'class' => "deleterevision-log-submit mw-log-deleterevision-button"
+			),
 			$this->msg( 'showhideselectedlogentries' )->text()
 		) . "\n";
 		$s .= $button . $formcontents . $button;
diff --git a/includes/specials/SpecialLonelypages.php b/includes/specials/SpecialLonelypages.php
index 8c6a88ac..7c7771d7 100644
--- a/includes/specials/SpecialLonelypages.php
+++ b/includes/specials/SpecialLonelypages.php
@@ -28,7 +28,6 @@
  * @ingroup SpecialPage
  */
 class LonelyPagesPage extends PageQueryPage {
-
 	function __construct( $name = 'Lonelypages' ) {
 		parent::__construct( $name );
 	}
@@ -50,32 +49,43 @@ class LonelyPagesPage extends PageQueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array ( 'page', 'pagelinks',
-					'templatelinks' ),
-			'fields' => array ( 'namespace' => 'page_namespace',
-					'title' => 'page_title',
-					'value' => 'page_title' ),
-			'conds' => array ( 'pl_namespace IS NULL',
-					'page_namespace' => MWNamespace::getContentNamespaces(),
-					'page_is_redirect' => 0,
-					'tl_namespace IS NULL' ),
-			'join_conds' => array (
-					'pagelinks' => array (
-						'LEFT JOIN', array (
+		return array(
+			'tables' => array(
+				'page', 'pagelinks',
+				'templatelinks'
+			),
+			'fields' => array(
+				'namespace' => 'page_namespace',
+				'title' => 'page_title',
+				'value' => 'page_title'
+			),
+			'conds' => array(
+				'pl_namespace IS NULL',
+				'page_namespace' => MWNamespace::getContentNamespaces(),
+				'page_is_redirect' => 0,
+				'tl_namespace IS NULL'
+			),
+			'join_conds' => array(
+				'pagelinks' => array(
+					'LEFT JOIN', array(
 						'pl_namespace = page_namespace',
-						'pl_title = page_title' ) ),
-					'templatelinks' => array (
-						'LEFT JOIN', array (
+						'pl_title = page_title'
+					)
+				),
+				'templatelinks' => array(
+					'LEFT JOIN', array(
 						'tl_namespace = page_namespace',
-						'tl_title = page_title' ) ) )
+						'tl_title = page_title'
+					)
+				)
+			)
 		);
 	}
 
 	function getOrderFields() {
 		// For some crazy reason ordering by a constant
 		// causes a filesort in MySQL 5
-		if( count( MWNamespace::getContentNamespaces() ) > 1 ) {
+		if ( count( MWNamespace::getContentNamespaces() ) > 1 ) {
 			return array( 'page_namespace', 'page_title' );
 		} else {
 			return array( 'page_title' );
diff --git a/includes/specials/SpecialLongpages.php b/includes/specials/SpecialLongpages.php
index c045f9e9..d90d2718 100644
--- a/includes/specials/SpecialLongpages.php
+++ b/includes/specials/SpecialLongpages.php
@@ -26,7 +26,6 @@
  * @ingroup SpecialPage
  */
 class LongPagesPage extends ShortPagesPage {
-
 	function __construct( $name = 'Longpages' ) {
 		parent::__construct( $name );
 	}
diff --git a/includes/specials/SpecialMIMEsearch.php b/includes/specials/SpecialMIMEsearch.php
index c5a109d4..3eeae310 100644
--- a/includes/specials/SpecialMIMEsearch.php
+++ b/includes/specials/SpecialMIMEsearch.php
@@ -35,7 +35,7 @@ class MIMEsearchPage extends QueryPage {
 	}
 
 	function isExpensive() {
-		return true;
+		return false;
 	}
 
 	function isSyndicated() {
@@ -51,19 +51,52 @@ class MIMEsearchPage extends QueryPage {
 	}
 
 	public function getQueryInfo() {
-		return array(
+		$qi = array(
 			'tables' => array( 'image' ),
-			'fields' => array( 'namespace' => NS_FILE,
-					'title' => 'img_name',
-					'value' => 'img_major_mime',
-					'img_size',
-					'img_width',
-					'img_height',
-					'img_user_text',
-					'img_timestamp' ),
-			'conds' => array( 'img_major_mime' => $this->major,
-					'img_minor_mime' => $this->minor )
+			'fields' => array(
+				'namespace' => NS_FILE,
+				'title' => 'img_name',
+				// Still have a value field just in case,
+				// but it isn't actually used for sorting.
+				'value' => 'img_name',
+				'img_size',
+				'img_width',
+				'img_height',
+				'img_user_text',
+				'img_timestamp'
+			),
+			'conds' => array(
+				'img_major_mime' => $this->major,
+				'img_minor_mime' => $this->minor,
+				// This is in order to trigger using
+				// the img_media_mime index in "range" mode.
+				'img_media_type' => array(
+					MEDIATYPE_BITMAP,
+					MEDIATYPE_DRAWING,
+					MEDIATYPE_AUDIO,
+					MEDIATYPE_VIDEO,
+					MEDIATYPE_MULTIMEDIA,
+					MEDIATYPE_UNKNOWN,
+					MEDIATYPE_OFFICE,
+					MEDIATYPE_TEXT,
+					MEDIATYPE_EXECUTABLE,
+					MEDIATYPE_ARCHIVE,
+				),
+			),
 		);
+		return $qi;
+	}
+
+	/**
+	 * The index is on (img_media_type, img_major_mime, img_minor_mime)
+	 * which unfortunately doesn't have img_name at the end for sorting.
+	 * So tell db to sort it however it wishes (Its not super important
+	 * that this report gives results in a logical order). As an aditional
+	 * note, mysql seems to by default order things by img_name ASC, which
+	 * is what we ideally want, so everything works out fine anyhow.
+	 */
+	function getOrderFields() {
+		return array();
 	}
 
 	function execute( $par ) {
@@ -74,24 +107,36 @@ class MIMEsearchPage extends QueryPage {
 		$this->setHeaders();
 		$this->outputHeader();
 		$this->getOutput()->addHTML(
-			Xml::openElement( 'form', array( 'id' => 'specialmimesearch', 'method' => 'get', 'action' => $wgScript ) ) .
-			Xml::openElement( 'fieldset' ) .
-			Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
-			Xml::element( 'legend', null, $this->msg( 'mimesearch' )->text() ) .
-			Xml::inputLabel( $this->msg( 'mimetype' )->text(), 'mime', 'mime', 20, $mime ) . ' ' .
-			Xml::submitButton( $this->msg( 'ilsubmit' )->text() ) .
-			Xml::closeElement( 'fieldset' ) .
-			Xml::closeElement( 'form' )
+			Xml::openElement(
+				'form',
+				array( 'id' => 'specialmimesearch', 'method' => 'get', 'action' => $wgScript )
+			) .
+				Xml::openElement( 'fieldset' ) .
+				Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+				Xml::element( 'legend', null, $this->msg( 'mimesearch' )->text() ) .
+				Xml::inputLabel( $this->msg( 'mimetype' )->text(), 'mime', 'mime', 20, $mime ) .
+				' ' .
+				Xml::submitButton( $this->msg( 'ilsubmit' )->text() ) .
+				Xml::closeElement( 'fieldset' ) .
+				Xml::closeElement( 'form' )
 		);
 
 		list( $this->major, $this->minor ) = File::splitMime( $mime );
+
 		if ( $this->major == '' || $this->minor == '' || $this->minor == 'unknown' ||
-			!self::isValidType( $this->major ) ) {
+			!self::isValidType( $this->major )
+		) {
 			return;
 		}
+
 		parent::execute( $par );
 	}
 
+	/**
+	 * @param Skin $skin
+	 * @param object $result Result row
+	 * @return string
+	 */
 	function formatResult( $skin, $result ) {
 		global $wgContLang;
 
@@ -108,8 +153,13 @@ class MIMEsearchPage extends QueryPage {
 		$bytes = htmlspecialchars( $lang->formatSize( $result->img_size ) );
 		$dimensions = $this->msg( 'widthheight' )->numParams( $result->img_width,
 			$result->img_height )->escaped();
-		$user = Linker::link( Title::makeTitle( NS_USER, $result->img_user_text ), htmlspecialchars( $result->img_user_text ) );
-		$time = htmlspecialchars( $lang->userTimeAndDate( $result->img_timestamp, $this->getUser() ) );
+		$user = Linker::link(
+			Title::makeTitle( NS_USER, $result->img_user_text ),
+			htmlspecialchars( $result->img_user_text )
+		);
+
+		$time = $lang->userTimeAndDate( $result->img_timestamp, $this->getUser() );
+		$time = htmlspecialchars( $time );
 
 		return "$download $plink . . $dimensions . . $bytes . . $user . . $time";
 	}
@@ -131,6 +181,7 @@ class MIMEsearchPage extends QueryPage {
 			'model',
 			'multipart'
 		);
+
 		return in_array( $type, $types );
 	}
 
diff --git a/includes/specials/SpecialMergeHistory.php b/includes/specials/SpecialMergeHistory.php
index 1476e156..fb5ea657 100644
--- a/includes/specials/SpecialMergeHistory.php
+++ b/includes/specials/SpecialMergeHistory.php
@@ -52,14 +52,14 @@ class SpecialMergeHistory extends SpecialPage {
 		$this->mTargetID = intval( $request->getVal( 'targetID' ) );
 		$this->mDestID = intval( $request->getVal( 'destID' ) );
 		$this->mTimestamp = $request->getVal( 'mergepoint' );
-		if( !preg_match( '/[0-9]{14}/', $this->mTimestamp ) ) {
+		if ( !preg_match( '/[0-9]{14}/', $this->mTimestamp ) ) {
 			$this->mTimestamp = '';
 		}
 		$this->mComment = $request->getText( 'wpComment' );
 
 		$this->mMerge = $request->wasPosted() && $this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) );
 		// target page
-		if( $this->mSubmitted ) {
+		if ( $this->mSubmitted ) {
 			$this->mTargetObj = Title::newFromURL( $this->mTarget );
 			$this->mDestObj = Title::newFromURL( $this->mDest );
 		} else {
@@ -75,7 +75,7 @@ class SpecialMergeHistory extends SpecialPage {
 	 */
 	function preCacheMessages() {
 		// Precache various messages
-		if( !isset( $this->message ) ) {
+		if ( !isset( $this->message ) ) {
 			$this->message['last'] = $this->msg( 'last' )->escaped();
 		}
 	}
@@ -89,20 +89,22 @@ class SpecialMergeHistory extends SpecialPage {
 		$this->setHeaders();
 		$this->outputHeader();
 
-		if( $this->mTargetID && $this->mDestID && $this->mAction == 'submit' && $this->mMerge ) {
+		if ( $this->mTargetID && $this->mDestID && $this->mAction == 'submit' && $this->mMerge ) {
 			$this->merge();
+
 			return;
 		}
 
 		if ( !$this->mSubmitted ) {
 			$this->showMergeForm();
+
 			return;
 		}
 
 		$errors = array();
 		if ( !$this->mTargetObj instanceof Title ) {
 			$errors[] = $this->msg( 'mergehistory-invalid-source' )->parseAsBlock();
-		} elseif( !$this->mTargetObj->exists() ) {
+		} elseif ( !$this->mTargetObj->exists() ) {
 			$errors[] = $this->msg( 'mergehistory-no-source', array( 'parse' ),
 				wfEscapeWikiText( $this->mTargetObj->getPrefixedText() )
 			)->parseAsBlock();
@@ -110,7 +112,7 @@ class SpecialMergeHistory extends SpecialPage {
 
 		if ( !$this->mDestObj instanceof Title ) {
 			$errors[] = $this->msg( 'mergehistory-invalid-destination' )->parseAsBlock();
-		} elseif( !$this->mDestObj->exists() ) {
+		} elseif ( !$this->mDestObj->exists() ) {
 			$errors[] = $this->msg( 'mergehistory-no-destination', array( 'parse' ),
 				wfEscapeWikiText( $this->mDestObj->getPrefixedText() )
 			)->parseAsBlock();
@@ -126,7 +128,6 @@ class SpecialMergeHistory extends SpecialPage {
 		} else {
 			$this->showHistory();
 		}
-
 	}
 
 	function showMergeForm() {
@@ -138,25 +139,25 @@ class SpecialMergeHistory extends SpecialPage {
 			Xml::openElement( 'form', array(
 				'method' => 'get',
 				'action' => $wgScript ) ) .
-			'<fieldset>' .
-			Xml::element( 'legend', array(),
-				$this->msg( 'mergehistory-box' )->text() ) .
-			Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
-			Html::hidden( 'submitted', '1' ) .
-			Html::hidden( 'mergepoint', $this->mTimestamp ) .
-			Xml::openElement( 'table' ) .
-			'<tr>
+				'<fieldset>' .
+				Xml::element( 'legend', array(),
+					$this->msg( 'mergehistory-box' )->text() ) .
+				Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
+				Html::hidden( 'submitted', '1' ) .
+				Html::hidden( 'mergepoint', $this->mTimestamp ) .
+				Xml::openElement( 'table' ) .
+				'<tr>
 				<td>' . Xml::label( $this->msg( 'mergehistory-from' )->text(), 'target' ) . '</td>
 				<td>' . Xml::input( 'target', 30, $this->mTarget, array( 'id' => 'target' ) ) . '</td>
 			</tr><tr>
 				<td>' . Xml::label( $this->msg( 'mergehistory-into' )->text(), 'dest' ) . '</td>
 				<td>' . Xml::input( 'dest', 30, $this->mDest, array( 'id' => 'dest' ) ) . '</td>
 			</tr><tr><td>' .
-			Xml::submitButton( $this->msg( 'mergehistory-go' )->text() ) .
-			'</td></tr>' .
-			Xml::closeElement( 'table' ) .
-			'</fieldset>' .
-			'</form>'
+				Xml::submitButton( $this->msg( 'mergehistory-go' )->text() ) .
+				'</td></tr>' .
+				Xml::closeElement( 'table' ) .
+				'</fieldset>' .
+				'</form>'
 		);
 	}
 
@@ -183,40 +184,40 @@ class SpecialMergeHistory extends SpecialPage {
 		);
 		$out->addHTML( $top );
 
-		if( $haveRevisions ) {
+		if ( $haveRevisions ) {
 			# Format the user-visible controls (comment field, submission button)
 			# in a nice little table
 			$table =
 				Xml::openElement( 'fieldset' ) .
-				$this->msg( 'mergehistory-merge', $this->mTargetObj->getPrefixedText(),
-					$this->mDestObj->getPrefixedText() )->parse() .
-				Xml::openElement( 'table', array( 'id' => 'mw-mergehistory-table' ) ) .
+					$this->msg( 'mergehistory-merge', $this->mTargetObj->getPrefixedText(),
+						$this->mDestObj->getPrefixedText() )->parse() .
+					Xml::openElement( 'table', array( 'id' => 'mw-mergehistory-table' ) ) .
 					'<tr>
 						<td class="mw-label">' .
-							Xml::label( $this->msg( 'mergehistory-reason' )->text(), 'wpComment' ) .
-						'</td>
-						<td class="mw-input">' .
-							Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
-						'</td>
+					Xml::label( $this->msg( 'mergehistory-reason' )->text(), 'wpComment' ) .
+					'</td>
+					<td class="mw-input">' .
+					Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
+					'</td>
 					</tr>
 					<tr>
 						<td>&#160;</td>
 						<td class="mw-submit">' .
-							Xml::submitButton( $this->msg( 'mergehistory-submit' )->text(), array( 'name' => 'merge', 'id' => 'mw-merge-submit' ) ) .
-						'</td>
+					Xml::submitButton( $this->msg( 'mergehistory-submit' )->text(), array( 'name' => 'merge', 'id' => 'mw-merge-submit' ) ) .
+					'</td>
 					</tr>' .
-				Xml::closeElement( 'table' ) .
-				Xml::closeElement( 'fieldset' );
+					Xml::closeElement( 'table' ) .
+					Xml::closeElement( 'fieldset' );
 
 			$out->addHTML( $table );
 		}
 
 		$out->addHTML(
 			'<h2 id="mw-mergehistory">' .
-			$this->msg( 'mergehistory-list' )->escaped() . "</h2>\n"
+				$this->msg( 'mergehistory-list' )->escaped() . "</h2>\n"
 		);
 
-		if( $haveRevisions ) {
+		if ( $haveRevisions ) {
 			$out->addHTML( $revisions->getNavigationBar() );
 			$out->addHTML( '<ul>' );
 			$out->addHTML( $revisions->getBody() );
@@ -261,14 +262,14 @@ class SpecialMergeHistory extends SpecialPage {
 			array(),
 			array( 'oldid' => $rev->getId() )
 		);
-		if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+		if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
 			$pageLink = '<span class="history-deleted">' . $pageLink . '</span>';
 		}
 
 		# Last link
-		if( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+		if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
 			$last = $this->message['last'];
-		} elseif( isset( $this->prevId[$row->rev_id] ) ) {
+		} elseif ( isset( $this->prevId[$row->rev_id] ) ) {
 			$last = Linker::linkKnown(
 				$rev->getTitle(),
 				$this->message['last'],
@@ -283,7 +284,7 @@ class SpecialMergeHistory extends SpecialPage {
 		$userLink = Linker::revUserTools( $rev );
 
 		$size = $row->rev_len;
-		if( !is_null( $size ) ) {
+		if ( !is_null( $size ) ) {
 			$stxt = Linker::formatRevisionSize( $size );
 		}
 		$comment = Linker::revComment( $rev );
@@ -298,10 +299,10 @@ class SpecialMergeHistory extends SpecialPage {
 		# keep it consistent...
 		$targetTitle = Title::newFromID( $this->mTargetID );
 		$destTitle = Title::newFromID( $this->mDestID );
-		if( is_null( $targetTitle ) || is_null( $destTitle ) ) {
+		if ( is_null( $targetTitle ) || is_null( $destTitle ) ) {
 			return false; // validate these
 		}
-		if( $targetTitle->getArticleID() == $destTitle->getArticleID() ) {
+		if ( $targetTitle->getArticleID() == $destTitle->getArticleID() ) {
 			return false;
 		}
 		# Verify that this timestamp is valid
@@ -317,8 +318,9 @@ class SpecialMergeHistory extends SpecialPage {
 			__METHOD__
 		);
 		# Destination page must exist with revisions
-		if( !$maxtimestamp ) {
+		if ( !$maxtimestamp ) {
 			$this->getOutput()->addWikiMsg( 'mergehistory-fail' );
+
 			return false;
 		}
 		# Get the latest timestamp of the source
@@ -329,12 +331,13 @@ class SpecialMergeHistory extends SpecialPage {
 			__METHOD__
 		);
 		# $this->mTimestamp must be older than $maxtimestamp
-		if( $this->mTimestamp >= $maxtimestamp ) {
+		if ( $this->mTimestamp >= $maxtimestamp ) {
 			$this->getOutput()->addWikiMsg( 'mergehistory-fail' );
+
 			return false;
 		}
 		# Update the revisions
-		if( $this->mTimestamp ) {
+		if ( $this->mTimestamp ) {
 			$timewhere = "rev_timestamp <= {$this->mTimestamp}";
 			$timestampLimit = wfTimestamp( TS_MW, $this->mTimestamp );
 		} else {
@@ -354,12 +357,12 @@ class SpecialMergeHistory extends SpecialPage {
 		$haveRevisions = $dbw->selectField(
 			'revision',
 			'rev_timestamp',
-			array( 'rev_page' => $this->mTargetID  ),
+			array( 'rev_page' => $this->mTargetID ),
 			__METHOD__,
 			array( 'FOR UPDATE' )
 		);
-		if( !$haveRevisions ) {
-			if( $this->mComment ) {
+		if ( !$haveRevisions ) {
+			if ( $this->mComment ) {
 				$comment = $this->msg(
 					'mergehistory-comment',
 					$targetTitle->getPrefixedText(),
@@ -380,8 +383,8 @@ class SpecialMergeHistory extends SpecialPage {
 			if ( $redirectContent ) {
 				$redirectPage = WikiPage::factory( $targetTitle );
 				$redirectRevision = new Revision( array(
-					'title'   => $targetTitle,
-					'page'    => $this->mTargetID,
+					'title' => $targetTitle,
+					'page' => $this->mTargetID,
 					'comment' => $comment,
 					'content' => $redirectContent ) );
 				$redirectRevision->insertOn( $dbw );
@@ -392,9 +395,9 @@ class SpecialMergeHistory extends SpecialPage {
 				$dbw->delete( 'pagelinks', array( 'pl_from' => $this->mDestID ), __METHOD__ );
 				$dbw->insert( 'pagelinks',
 					array(
-						'pl_from'      => $this->mDestID,
+						'pl_from' => $this->mDestID,
 						'pl_namespace' => $destTitle->getNamespace(),
-						'pl_title'     => $destTitle->getDBkey() ),
+						'pl_title' => $destTitle->getDBkey() ),
 					__METHOD__
 				);
 			} else {
@@ -405,15 +408,16 @@ class SpecialMergeHistory extends SpecialPage {
 		}
 		$destTitle->invalidateCache(); // update histories
 		# Check if this did anything
-		if( !$count ) {
+		if ( !$count ) {
 			$this->getOutput()->addWikiMsg( 'mergehistory-fail' );
+
 			return false;
 		}
 		# Update our logs
 		$log = new LogPage( 'merge' );
 		$log->addEntry(
 			'merge', $targetTitle, $this->mComment,
-			array( $destTitle->getPrefixedText(), $timestampLimit )
+			array( $destTitle->getPrefixedText(), $timestampLimit ), $this->getUser()
 		);
 
 		$this->getOutput()->addWikiMsg( 'mergehistory-success',
@@ -462,9 +466,9 @@ class MergeHistoryPager extends ReverseChronologicalPager {
 			$batch->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->user_name ) );
 
 			$rev_id = isset( $rev_id ) ? $rev_id : $row->rev_id;
-			if( $rev_id > $row->rev_id ) {
+			if ( $rev_id > $row->rev_id ) {
 				$this->mForm->prevId[$rev_id] = $row->rev_id;
-			} elseif( $rev_id < $row->rev_id ) {
+			} elseif ( $rev_id < $row->rev_id ) {
 				$this->mForm->prevId[$row->rev_id] = $rev_id;
 			}
 
@@ -475,6 +479,7 @@ class MergeHistoryPager extends ReverseChronologicalPager {
 		$this->mResult->seek( 0 );
 
 		wfProfileOut( __METHOD__ );
+
 		return '';
 	}
 
@@ -486,10 +491,11 @@ class MergeHistoryPager extends ReverseChronologicalPager {
 		$conds = $this->mConds;
 		$conds['rev_page'] = $this->articleID;
 		$conds[] = "rev_timestamp < {$this->maxTimestamp}";
+
 		return array(
 			'tables' => array( 'revision', 'page', 'user' ),
 			'fields' => array_merge( Revision::selectFields(), Revision::selectUserFields() ),
-			'conds'  => $conds,
+			'conds' => $conds,
 			'join_conds' => array(
 				'page' => Revision::pageJoinCond(),
 				'user' => Revision::userJoinCond() )
diff --git a/includes/specials/SpecialMostcategories.php b/includes/specials/SpecialMostcategories.php
index 11f26bd7..9b67f343 100644
--- a/includes/specials/SpecialMostcategories.php
+++ b/includes/specials/SpecialMostcategories.php
@@ -30,7 +30,6 @@
  * @ingroup SpecialPage
  */
 class MostcategoriesPage extends QueryPage {
-
 	function __construct( $name = 'Mostcategories' ) {
 		parent::__construct( $name );
 	}
@@ -44,22 +43,30 @@ class MostcategoriesPage extends QueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array ( 'categorylinks', 'page' ),
-			'fields' => array ( 'namespace' => 'page_namespace',
-					'title' => 'page_title',
-					'value' => 'COUNT(*)' ),
-			'conds' => array ( 'page_namespace' => MWNamespace::getContentNamespaces() ),
-			'options' => array ( 'HAVING' => 'COUNT(*) > 1',
-				'GROUP BY' => array( 'page_namespace', 'page_title' ) ),
-			'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
-					'page_id = cl_from' ) )
+		return array(
+			'tables' => array( 'categorylinks', 'page' ),
+			'fields' => array(
+				'namespace' => 'page_namespace',
+				'title' => 'page_title',
+				'value' => 'COUNT(*)'
+			),
+			'conds' => array( 'page_namespace' => MWNamespace::getContentNamespaces() ),
+			'options' => array(
+				'HAVING' => 'COUNT(*) > 1',
+				'GROUP BY' => array( 'page_namespace', 'page_title' )
+			),
+			'join_conds' => array(
+				'page' => array(
+					'LEFT JOIN',
+					'page_id = cl_from'
+				)
+			)
 		);
 	}
 
 	/**
-	 * @param $db DatabaseBase
-	 * @param $res
+	 * @param DatabaseBase $db
+	 * @param ResultWrapper $res
 	 */
 	function preprocessResults( $db, $res ) {
 		# There's no point doing a batch check if we aren't caching results;
@@ -78,15 +85,22 @@ class MostcategoriesPage extends QueryPage {
 	}
 
 	/**
-	 * @param $skin Skin
-	 * @param $result
+	 * @param Skin $skin
+	 * @param object $result Result row
 	 * @return string
 	 */
 	function formatResult( $skin, $result ) {
 		$title = Title::makeTitleSafe( $result->namespace, $result->title );
 		if ( !$title ) {
-			return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-				Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+			return Html::element(
+				'span',
+				array( 'class' => 'mw-invalidtitle' ),
+				Linker::getInvalidTitleDescription(
+					$this->getContext(),
+					$result->namespace,
+					$result->title
+				)
+			);
 		}
 
 		if ( $this->isCached() ) {
diff --git a/includes/specials/SpecialMostimages.php b/includes/specials/SpecialMostimages.php
index 78b2d911..98d8da3a 100644
--- a/includes/specials/SpecialMostimages.php
+++ b/includes/specials/SpecialMostimages.php
@@ -30,7 +30,6 @@
  * @ingroup SpecialPage
  */
 class MostimagesPage extends ImageQueryPage {
-
 	function __construct( $name = 'Mostimages' ) {
 		parent::__construct( $name );
 	}
@@ -44,13 +43,17 @@ class MostimagesPage extends ImageQueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array ( 'imagelinks' ),
-			'fields' => array ( 'namespace' => NS_FILE,
-					'title' => 'il_to',
-					'value' => 'COUNT(*)' ),
-			'options' => array ( 'GROUP BY' => 'il_to',
-					'HAVING' => 'COUNT(*) > 1' )
+		return array(
+			'tables' => array( 'imagelinks' ),
+			'fields' => array(
+				'namespace' => NS_FILE,
+				'title' => 'il_to',
+				'value' => 'COUNT(*)'
+			),
+			'options' => array(
+				'GROUP BY' => 'il_to',
+				'HAVING' => 'COUNT(*) > 1'
+			)
 		);
 	}
 
diff --git a/includes/specials/SpecialMostinterwikis.php b/includes/specials/SpecialMostinterwikis.php
index 574a9afb..98dd68e9 100644
--- a/includes/specials/SpecialMostinterwikis.php
+++ b/includes/specials/SpecialMostinterwikis.php
@@ -30,7 +30,6 @@
  * @ingroup SpecialPage
  */
 class MostinterwikisPage extends QueryPage {
-
 	function __construct( $name = 'Mostinterwikis' ) {
 		parent::__construct( $name );
 	}
@@ -44,24 +43,24 @@ class MostinterwikisPage extends QueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array (
+		return array(
+			'tables' => array(
 				'langlinks',
 				'page'
-			), 'fields' => array (
+			), 'fields' => array(
 				'namespace' => 'page_namespace',
 				'title' => 'page_title',
 				'value' => 'COUNT(*)'
-			), 'conds' => array (
+			), 'conds' => array(
 				'page_namespace' => MWNamespace::getContentNamespaces()
-			), 'options' => array (
+			), 'options' => array(
 				'HAVING' => 'COUNT(*) > 1',
-				'GROUP BY' => array (
+				'GROUP BY' => array(
 					'page_namespace',
 					'page_title'
 				)
-			), 'join_conds' => array (
-				'page' => array (
+			), 'join_conds' => array(
+				'page' => array(
 					'LEFT JOIN',
 					'page_id = ll_from'
 				)
@@ -72,8 +71,8 @@ class MostinterwikisPage extends QueryPage {
 	/**
 	 * Pre-fill the link cache
 	 *
-	 * @param $db DatabaseBase
-	 * @param $res
+	 * @param DatabaseBase $db
+	 * @param ResultWrapper $res
 	 */
 	function preprocessResults( $db, $res ) {
 		# There's no point doing a batch check if we aren't caching results;
@@ -100,8 +99,15 @@ class MostinterwikisPage extends QueryPage {
 	function formatResult( $skin, $result ) {
 		$title = Title::makeTitleSafe( $result->namespace, $result->title );
 		if ( !$title ) {
-			return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-				Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+			return Html::element(
+				'span',
+				array( 'class' => 'mw-invalidtitle' ),
+				Linker::getInvalidTitleDescription(
+					$this->getContext(),
+					$result->namespace,
+					$result->title
+				)
+			);
 		}
 
 		if ( $this->isCached() ) {
diff --git a/includes/specials/SpecialMostlinked.php b/includes/specials/SpecialMostlinked.php
index 4b6e5670..37593bf9 100644
--- a/includes/specials/SpecialMostlinked.php
+++ b/includes/specials/SpecialMostlinked.php
@@ -31,7 +31,6 @@
  * @ingroup SpecialPage
  */
 class MostlinkedPage extends QueryPage {
-
 	function __construct( $name = 'Mostlinked' ) {
 		parent::__construct( $name );
 	}
@@ -45,33 +44,47 @@ class MostlinkedPage extends QueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array ( 'pagelinks', 'page' ),
-			'fields' => array ( 'namespace' => 'pl_namespace',
-					'title' => 'pl_title',
-					'value' => 'COUNT(*)',
-					'page_namespace' ),
-			'options' => array ( 'HAVING' => 'COUNT(*) > 1',
-				'GROUP BY' => array( 'pl_namespace', 'pl_title',
-						'page_namespace' ) ),
-			'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
-					array ( 'page_namespace = pl_namespace',
-						'page_title = pl_title' ) ) )
+		return array(
+			'tables' => array( 'pagelinks', 'page' ),
+			'fields' => array(
+				'namespace' => 'pl_namespace',
+				'title' => 'pl_title',
+				'value' => 'COUNT(*)',
+				'page_namespace'
+			),
+			'options' => array(
+				'HAVING' => 'COUNT(*) > 1',
+				'GROUP BY' => array(
+					'pl_namespace', 'pl_title',
+					'page_namespace'
+				)
+			),
+			'join_conds' => array(
+				'page' => array(
+					'LEFT JOIN',
+					array(
+						'page_namespace = pl_namespace',
+						'page_title = pl_title'
+					)
+				)
+			)
 		);
 	}
 
 	/**
 	 * Pre-fill the link cache
 	 *
-	 * @param $db DatabaseBase
-	 * @param $res
+	 * @param DatabaseBase $db
+	 * @param ResultWrapper $res
 	 */
 	function preprocessResults( $db, $res ) {
 		if ( $res->numRows() > 0 ) {
 			$linkBatch = new LinkBatch();
+
 			foreach ( $res as $row ) {
 				$linkBatch->add( $row->namespace, $row->title );
 			}
+
 			$res->seek( 0 );
 			$linkBatch->execute();
 		}
@@ -86,25 +99,37 @@ class MostlinkedPage extends QueryPage {
 	 */
 	function makeWlhLink( $title, $caption ) {
 		$wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedDBkey() );
+
 		return Linker::linkKnown( $wlh, $caption );
 	}
 
 	/**
-	 * Make links to the page corresponding to the item, and the "what links here" page for it
+	 * Make links to the page corresponding to the item,
+	 * and the "what links here" page for it
 	 *
-	 * @param $skin Skin to be used
-	 * @param $result Result row
+	 * @param Skin $skin Skin to be used
+	 * @param object $result Result row
 	 * @return string
 	 */
 	function formatResult( $skin, $result ) {
 		$title = Title::makeTitleSafe( $result->namespace, $result->title );
 		if ( !$title ) {
-			return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-				Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+			return Html::element(
+				'span',
+				array( 'class' => 'mw-invalidtitle' ),
+				Linker::getInvalidTitleDescription(
+					$this->getContext(),
+					$result->namespace,
+					$result->title )
+			);
 		}
+
 		$link = Linker::link( $title );
-		$wlh = $this->makeWlhLink( $title,
-			$this->msg( 'nlinks' )->numParams( $result->value )->escaped() );
+		$wlh = $this->makeWlhLink(
+			$title,
+			$this->msg( 'nlinks' )->numParams( $result->value )->escaped()
+		);
+
 		return $this->getLanguage()->specialList( $link, $wlh );
 	}
 
diff --git a/includes/specials/SpecialMostlinkedcategories.php b/includes/specials/SpecialMostlinkedcategories.php
index a1bce45d..0d4641b1 100644
--- a/includes/specials/SpecialMostlinkedcategories.php
+++ b/includes/specials/SpecialMostlinkedcategories.php
@@ -30,7 +30,6 @@
  * @ingroup SpecialPage
  */
 class MostlinkedCategoriesPage extends QueryPage {
-
 	function __construct( $name = 'Mostlinkedcategories' ) {
 		parent::__construct( $name );
 	}
@@ -40,11 +39,11 @@ class MostlinkedCategoriesPage extends QueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array ( 'category' ),
-			'fields' => array ( 'title' => 'cat_title',
-					'namespace' => NS_CATEGORY,
-					'value' => 'cat_pages' ),
+		return array(
+			'tables' => array( 'category' ),
+			'fields' => array( 'title' => 'cat_title',
+				'namespace' => NS_CATEGORY,
+				'value' => 'cat_pages' ),
 		);
 	}
 
@@ -55,8 +54,8 @@ class MostlinkedCategoriesPage extends QueryPage {
 	/**
 	 * Fetch user page links and cache their existence
 	 *
-	 * @param $db DatabaseBase
-	 * @param $res DatabaseResult
+	 * @param DatabaseBase $db
+	 * @param ResultWrapper $res
 	 */
 	function preprocessResults( $db, $res ) {
 		if ( !$res->numRows() ) {
@@ -74,8 +73,8 @@ class MostlinkedCategoriesPage extends QueryPage {
 	}
 
 	/**
-	 * @param $skin Skin
-	 * @param  $result
+	 * @param Skin $skin
+	 * @param object $result Result row
 	 * @return string
 	 */
 	function formatResult( $skin, $result ) {
@@ -83,15 +82,20 @@ class MostlinkedCategoriesPage extends QueryPage {
 
 		$nt = Title::makeTitleSafe( NS_CATEGORY, $result->title );
 		if ( !$nt ) {
-			return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-				Linker::getInvalidTitleDescription( $this->getContext(), NS_CATEGORY, $result->title ) );
+			return Html::element(
+				'span',
+				array( 'class' => 'mw-invalidtitle' ),
+				Linker::getInvalidTitleDescription(
+					$this->getContext(),
+					NS_CATEGORY,
+					$result->title )
+			);
 		}
 
 		$text = $wgContLang->convert( $nt->getText() );
-
 		$plink = Linker::link( $nt, htmlspecialchars( $text ) );
-
 		$nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
+
 		return $this->getLanguage()->specialList( $plink, $nlinks );
 	}
 
diff --git a/includes/specials/SpecialMostlinkedtemplates.php b/includes/specials/SpecialMostlinkedtemplates.php
index 506e6b22..c90acb1f 100644
--- a/includes/specials/SpecialMostlinkedtemplates.php
+++ b/includes/specials/SpecialMostlinkedtemplates.php
@@ -29,7 +29,6 @@
  * @ingroup SpecialPage
  */
 class MostlinkedTemplatesPage extends QueryPage {
-
 	function __construct( $name = 'Mostlinkedtemplates' ) {
 		parent::__construct( $name );
 	}
@@ -62,12 +61,14 @@ class MostlinkedTemplatesPage extends QueryPage {
 	}
 
 	public function getQueryInfo() {
-		return array (
-			'tables' => array ( 'templatelinks' ),
-			'fields' => array ( 'namespace' => 'tl_namespace',
-					'title' => 'tl_title',
-					'value' => 'COUNT(*)' ),
-			'conds' => array ( 'tl_namespace' => NS_TEMPLATE ),
+		return array(
+			'tables' => array( 'templatelinks' ),
+			'fields' => array(
+				'namespace' => 'tl_namespace',
+				'title' => 'tl_title',
+				'value' => 'COUNT(*)'
+			),
+			'conds' => array( 'tl_namespace' => NS_TEMPLATE ),
 			'options' => array( 'GROUP BY' => array( 'tl_namespace', 'tl_title' ) )
 		);
 	}
@@ -76,7 +77,7 @@ class MostlinkedTemplatesPage extends QueryPage {
 	 * Pre-cache page existence to speed up link generation
 	 *
 	 * @param $db DatabaseBase connection
-	 * @param $res ResultWrapper
+	 * @param ResultWrapper $res
 	 */
 	public function preprocessResults( $db, $res ) {
 		if ( !$res->numRows() ) {
@@ -95,15 +96,22 @@ class MostlinkedTemplatesPage extends QueryPage {
 	/**
 	 * Format a result row
 	 *
-	 * @param $skin Skin to use for UI elements
-	 * @param $result Result row
-	 * @return String
+	 * @param Skin $skin
+	 * @param object $result Result row
+	 * @return string
 	 */
 	public function formatResult( $skin, $result ) {
 		$title = Title::makeTitleSafe( $result->namespace, $result->title );
 		if ( !$title ) {
-			return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-				Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+			return Html::element(
+				'span',
+				array( 'class' => 'mw-invalidtitle' ),
+				Linker::getInvalidTitleDescription(
+					$this->getContext(),
+					$result->namespace,
+					$result->title
+				)
+			);
 		}
 
 		return $this->getLanguage()->specialList(
@@ -115,13 +123,14 @@ class MostlinkedTemplatesPage extends QueryPage {
 	/**
 	 * Make a "what links here" link for a given title
 	 *
-	 * @param $title Title to make the link for
-	 * @param $result Result row
+	 * @param Title $title Title to make the link for
+	 * @param object $result Result row
 	 * @return String
 	 */
 	private function makeWlhLink( $title, $result ) {
 		$wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedText() );
 		$label = $this->msg( 'ntransclusions' )->numParams( $result->value )->escaped();
+
 		return Linker::link( $wlh, $label );
 	}
 
diff --git a/includes/specials/SpecialMovepage.php b/includes/specials/SpecialMovepage.php
index 4adb0371..253e6cc3 100644
--- a/includes/specials/SpecialMovepage.php
+++ b/includes/specials/SpecialMovepage.php
@@ -27,13 +27,15 @@
  * @ingroup SpecialPage
  */
 class MovePageForm extends UnlistedSpecialPage {
-
 	/**
+	 * Objects
 	 * @var Title
 	 */
-	var $oldTitle, $newTitle; # Objects
-	var $reason; # Text input
-	var $moveTalk, $deleteAndMove, $moveSubpages, $fixRedirects, $leaveRedirect, $moveOverShared; # Checks
+	var $oldTitle, $newTitle;
+	// Text input
+	var $reason;
+	// Checks
+	var $moveTalk, $deleteAndMove, $moveSubpages, $fixRedirects, $leaveRedirect, $moveOverShared;
 
 	private $watch = false;
 
@@ -55,10 +57,10 @@ class MovePageForm extends UnlistedSpecialPage {
 		$oldTitleText = $request->getVal( 'wpOldTitle', $target );
 		$this->oldTitle = Title::newFromText( $oldTitleText );
 
-		if( is_null( $this->oldTitle ) ) {
+		if ( is_null( $this->oldTitle ) ) {
 			throw new ErrorPageError( 'notargettitle', 'notargettext' );
 		}
-		if( !$this->oldTitle->exists() ) {
+		if ( !$this->oldTitle->exists() ) {
 			throw new ErrorPageError( 'nopagetitle', 'nopagetext' );
 		}
 
@@ -93,7 +95,8 @@ class MovePageForm extends UnlistedSpecialPage {
 		$this->watch = $request->getCheck( 'wpWatch' ) && $user->isLoggedIn();
 
 		if ( 'submit' == $request->getVal( 'action' ) && $request->wasPosted()
-			&& $user->matchEditToken( $request->getVal( 'wpEditToken' ) ) ) {
+			&& $user->matchEditToken( $request->getVal( 'wpEditToken' ) )
+		) {
 			$this->doSubmit();
 		} else {
 			$this->showForm( array() );
@@ -129,7 +132,7 @@ class MovePageForm extends UnlistedSpecialPage {
 			# link, check for validity. We can then show some diagnostic
 			# information and save a click.
 			$newerr = $this->oldTitle->isValidMoveOperation( $newTitle );
-			if( is_array( $newerr ) ) {
+			if ( is_array( $newerr ) ) {
 				$err = $newerr;
 			}
 		}
@@ -146,16 +149,26 @@ class MovePageForm extends UnlistedSpecialPage {
 				<tr>
 					<td></td>
 					<td class='mw-input'>" .
-						Xml::checkLabel( $this->msg( 'delete_and_move_confirm' )->text(), 'wpConfirm', 'wpConfirm' ) .
-					"</td>
+				Xml::checkLabel(
+					$this->msg( 'delete_and_move_confirm' )->text(),
+					'wpConfirm',
+					'wpConfirm'
+				) .
+				"</td>
 				</tr>";
 			$err = array();
 		} else {
 			if ( $this->oldTitle->getNamespace() == NS_USER && !$this->oldTitle->isSubpage() ) {
-				$out->wrapWikiMsg( "<div class=\"error mw-moveuserpage-warning\">\n$1\n</div>", 'moveuserpage-warning' );
+				$out->wrapWikiMsg(
+					"<div class=\"error mw-moveuserpage-warning\">\n$1\n</div>",
+					'moveuserpage-warning'
+				);
 			}
-			$out->addWikiMsg( $wgFixDoubleRedirects ? 'movepagetext' :
-				'movepagetext-noredirectfixer' );
+
+			$out->addWikiMsg( $wgFixDoubleRedirects ?
+				'movepagetext' :
+				'movepagetext-noredirectfixer'
+			);
 			$movepagebtn = $this->msg( 'movepagebtn' )->text();
 			$submitVar = 'wpMove';
 			$confirm = false;
@@ -205,6 +218,7 @@ class MovePageForm extends UnlistedSpecialPage {
 			if ( count( $err ) == 1 ) {
 				$errMsg = $err[0];
 				$errMsgName = array_shift( $errMsg );
+
 				if ( $errMsgName == 'hookaborted' ) {
 					$out->addHTML( "<p>{$errMsg[0]}</p>\n" );
 				} else {
@@ -212,8 +226,9 @@ class MovePageForm extends UnlistedSpecialPage {
 				}
 			} else {
 				$errStr = array();
-				foreach( $err as $errMsg ) {
-					if( $errMsg[0] == 'hookaborted' ) {
+
+				foreach ( $err as $errMsg ) {
+					if ( $errMsg[0] == 'hookaborted' ) {
 						$errStr[] = $errMsg[1];
 					} else {
 						$errMsgName = array_shift( $errMsg );
@@ -238,7 +253,13 @@ class MovePageForm extends UnlistedSpecialPage {
 			}
 			$out->addHTML( "<div class='mw-warning-with-logexcerpt'>\n" );
 			$out->addWikiMsg( $noticeMsg );
-			LogEventsList::showLogExtract( $out, 'protect', $this->oldTitle, '', array( 'lim' => 1 ) );
+			LogEventsList::showLogExtract(
+				$out,
+				'protect',
+				$this->oldTitle,
+				'',
+				array( 'lim' => 1 )
+			);
 			$out->addHTML( "</div>\n" );
 		}
 
@@ -256,13 +277,20 @@ class MovePageForm extends UnlistedSpecialPage {
 		$handler = ContentHandler::getForTitle( $this->oldTitle );
 
 		$out->addHTML(
-			Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL( 'action=submit' ), 'id' => 'movepage' ) ) .
-			Xml::openElement( 'fieldset' ) .
-			Xml::element( 'legend', null, $this->msg( 'move-page-legend' )->text() ) .
-			Xml::openElement( 'table', array( 'id' => 'mw-movepage-table' ) ) .
-			"<tr>
+			Xml::openElement(
+				'form',
+				array(
+					'method' => 'post',
+					'action' => $this->getTitle()->getLocalURL( 'action=submit' ),
+					'id' => 'movepage'
+				)
+			) .
+				Xml::openElement( 'fieldset' ) .
+				Xml::element( 'legend', null, $this->msg( 'move-page-legend' )->text() ) .
+				Xml::openElement( 'table', array( 'id' => 'mw-movepage-table' ) ) .
+				"<tr>
 				<td class='mw-label'>" .
-					$this->msg( 'movearticle' )->escaped() .
+				$this->msg( 'movearticle' )->escaped() .
 				"</td>
 				<td class='mw-input'>
 					<strong>{$oldTitleLink}</strong>
@@ -270,41 +298,54 @@ class MovePageForm extends UnlistedSpecialPage {
 			</tr>
 			<tr>
 				<td class='mw-label'>" .
-					Xml::label( $this->msg( 'newtitle' )->text(), 'wpNewTitleMain' ) .
+				Xml::label( $this->msg( 'newtitle' )->text(), 'wpNewTitleMain' ) .
 				"</td>
 				<td class='mw-input'>" .
-					Html::namespaceSelector(
-						array(
-							'selected' => $newTitle->getNamespace(),
-							'exclude' => $immovableNamespaces
-						),
-						array( 'name' => 'wpNewTitleNs', 'id' => 'wpNewTitleNs' )
-					) .
-					Xml::input( 'wpNewTitleMain', 60, $wgContLang->recodeForEdit( $newTitle->getText() ), array(
+				Html::namespaceSelector(
+					array(
+						'selected' => $newTitle->getNamespace(),
+						'exclude' => $immovableNamespaces
+					),
+					array( 'name' => 'wpNewTitleNs', 'id' => 'wpNewTitleNs' )
+				) .
+				Xml::input(
+					'wpNewTitleMain',
+					60,
+					$wgContLang->recodeForEdit( $newTitle->getText() ),
+					array(
 						'type' => 'text',
 						'id' => 'wpNewTitleMain',
-						'maxlength' => 255,
-					) ) .
-					Html::hidden( 'wpOldTitle', $this->oldTitle->getPrefixedText() ) .
+						'maxlength' => 255
+					)
+				) .
+				Html::hidden( 'wpOldTitle', $this->oldTitle->getPrefixedText() ) .
 				"</td>
 			</tr>
 			<tr>
 				<td class='mw-label'>" .
-					Xml::label( $this->msg( 'movereason' )->text(), 'wpReason' ) .
+				Xml::label( $this->msg( 'movereason' )->text(), 'wpReason' ) .
 				"</td>
 				<td class='mw-input'>" .
-					Html::element( 'textarea', array( 'name' => 'wpReason', 'id' => 'wpReason', 'cols' => 60, 'rows' => 2,
-					'maxlength' => 200 ), $this->reason ) .
+					Xml::input( 'wpReason', 60, $this->reason, array(
+						'type' => 'text',
+						'id' => 'wpReason',
+						'maxlength' => 200,
+					) ) .
 				"</td>
 			</tr>"
 		);
 
-		if( $considerTalk ) {
+		if ( $considerTalk ) {
 			$out->addHTML( "
 				<tr>
 					<td></td>
 					<td class='mw-input'>" .
-						Xml::checkLabel( $this->msg( 'movetalk' )->text(), 'wpMovetalk', 'wpMovetalk', $this->moveTalk ) .
+					Xml::checkLabel(
+						$this->msg( 'movetalk' )->text(),
+						'wpMovetalk',
+						'wpMovetalk',
+						$this->moveTalk
+					) .
 					"</td>
 				</tr>"
 			);
@@ -315,8 +356,12 @@ class MovePageForm extends UnlistedSpecialPage {
 				<tr>
 					<td></td>
 					<td class='mw-input' >" .
-						Xml::checkLabel( $this->msg( 'move-leave-redirect' )->text(), 'wpLeaveRedirect',
-							'wpLeaveRedirect', $this->leaveRedirect ) .
+					Xml::checkLabel(
+						$this->msg( 'move-leave-redirect' )->text(),
+						'wpLeaveRedirect',
+						'wpLeaveRedirect',
+						$this->leaveRedirect
+					) .
 					"</td>
 				</tr>"
 			);
@@ -327,32 +372,36 @@ class MovePageForm extends UnlistedSpecialPage {
 				<tr>
 					<td></td>
 					<td class='mw-input' >" .
-						Xml::checkLabel( $this->msg( 'fix-double-redirects' )->text(), 'wpFixRedirects',
-							'wpFixRedirects', $this->fixRedirects ) .
+					Xml::checkLabel(
+						$this->msg( 'fix-double-redirects' )->text(),
+						'wpFixRedirects',
+						'wpFixRedirects',
+						$this->fixRedirects
+					) .
 					"</td>
 				</tr>"
 			);
 		}
 
-		if( $canMoveSubpage ) {
+		if ( $canMoveSubpage ) {
 			$out->addHTML( "
 				<tr>
 					<td></td>
 					<td class=\"mw-input\">" .
-				Xml::check(
-					'wpMovesubpages',
-					# Don't check the box if we only have talk subpages to
-					# move and we aren't moving the talk page.
-					$this->moveSubpages && ( $this->oldTitle->hasSubpages() || $this->moveTalk ),
-					array( 'id' => 'wpMovesubpages' )
-				) . '&#160;' .
-				Xml::tags( 'label', array( 'for' => 'wpMovesubpages' ),
-					$this->msg(
-						( $this->oldTitle->hasSubpages()
-							? 'move-subpages'
-							: 'move-talk-subpages' )
+					Xml::check(
+						'wpMovesubpages',
+						# Don't check the box if we only have talk subpages to
+						# move and we aren't moving the talk page.
+						$this->moveSubpages && ( $this->oldTitle->hasSubpages() || $this->moveTalk ),
+						array( 'id' => 'wpMovesubpages' )
+					) . '&#160;' .
+					Xml::tags( 'label', array( 'for' => 'wpMovesubpages' ),
+						$this->msg(
+							( $this->oldTitle->hasSubpages()
+								? 'move-subpages'
+								: 'move-talk-subpages' )
 						)->numParams( $wgMaximumMovedPages )->params( $wgMaximumMovedPages )->parse()
-				) .
+					) .
 					"</td>
 				</tr>"
 			);
@@ -361,14 +410,19 @@ class MovePageForm extends UnlistedSpecialPage {
 		$watchChecked = $user->isLoggedIn() && ( $this->watch || $user->getBoolOption( 'watchmoves' )
 			|| $user->isWatched( $this->oldTitle ) );
 		# Don't allow watching if user is not logged in
-		if( $user->isLoggedIn() ) {
+		if ( $user->isLoggedIn() ) {
 			$out->addHTML( "
 			<tr>
 				<td></td>
 				<td class='mw-input'>" .
-					Xml::checkLabel( $this->msg( 'move-watch' )->text(), 'wpWatch', 'watch', $watchChecked ) .
+				Xml::checkLabel(
+					$this->msg( 'move-watch' )->text(),
+					'wpWatch',
+					'watch',
+					$watchChecked
+				) .
 				"</td>
-			</tr>");
+			</tr>" );
 		}
 
 		$out->addHTML( "
@@ -376,19 +430,18 @@ class MovePageForm extends UnlistedSpecialPage {
 			<tr>
 				<td>&#160;</td>
 				<td class='mw-submit'>" .
-					Xml::submitButton( $movepagebtn, array( 'name' => $submitVar ) ) .
+				Xml::submitButton( $movepagebtn, array( 'name' => $submitVar ) ) .
 				"</td>
 			</tr>" .
-			Xml::closeElement( 'table' ) .
-			Html::hidden( 'wpEditToken', $user->getEditToken() ) .
-			Xml::closeElement( 'fieldset' ) .
-			Xml::closeElement( 'form' ) .
-			"\n"
+				Xml::closeElement( 'table' ) .
+				Html::hidden( 'wpEditToken', $user->getEditToken() ) .
+				Xml::closeElement( 'fieldset' ) .
+				Xml::closeElement( 'form' ) .
+				"\n"
 		);
 
 		$this->showLogFragment( $this->oldTitle );
 		$this->showSubpages( $this->oldTitle );
-
 	}
 
 	function doSubmit() {
@@ -406,6 +459,7 @@ class MovePageForm extends UnlistedSpecialPage {
 		# don't allow moving to pages with # in
 		if ( !$nt || $nt->getFragment() != '' ) {
 			$this->showForm( array( array( 'badtitletext' ) ) );
+
 			return;
 		}
 
@@ -413,11 +467,11 @@ class MovePageForm extends UnlistedSpecialPage {
 		if ( $nt->getNamespace() == NS_FILE
 			&& !( $this->moveOverShared && $user->isAllowed( 'reupload-shared' ) )
 			&& !RepoGroup::singleton()->getLocalRepo()->findFile( $nt )
-			&& wfFindFile( $nt ) )
-		{
+			&& wfFindFile( $nt )
+		) {
 			$this->showForm( array( array( 'file-exists-sharedrepo' ) ) );
-			return;
 
+			return;
 		}
 
 		# Delete to make way if requested
@@ -426,6 +480,7 @@ class MovePageForm extends UnlistedSpecialPage {
 			if ( count( $permErrors ) ) {
 				# Only show the first error
 				$this->showForm( $permErrors );
+
 				return;
 			}
 
@@ -444,6 +499,7 @@ class MovePageForm extends UnlistedSpecialPage {
 			$deleteStatus = $page->doDeleteArticleReal( $reason, false, 0, true, $error, $user );
 			if ( !$deleteStatus->isGood() ) {
 				$this->showForm( $deleteStatus->getErrorsArray() );
+
 				return;
 			}
 		}
@@ -462,6 +518,7 @@ class MovePageForm extends UnlistedSpecialPage {
 		$error = $ot->moveTo( $nt, true, $this->reason, $createRedirect );
 		if ( $error !== true ) {
 			$this->showForm( $error );
+
 			return;
 		}
 
@@ -502,7 +559,7 @@ class MovePageForm extends UnlistedSpecialPage {
 		# Now we move extra pages we've been asked to move: subpages and talk
 		# pages.  First, if the old page or the new page is a talk page, we
 		# can't move any talk pages: cancel that.
-		if( $ot->isTalkPage() || $nt->isTalkPage() ) {
+		if ( $ot->isTalkPage() || $nt->isTalkPage() ) {
 			$this->moveTalk = false;
 		}
 
@@ -524,24 +581,26 @@ class MovePageForm extends UnlistedSpecialPage {
 
 		// @todo FIXME: Use Title::moveSubpages() here
 		$dbr = wfGetDB( DB_MASTER );
-		if( $this->moveSubpages && (
+		if ( $this->moveSubpages && (
 			MWNamespace::hasSubpages( $nt->getNamespace() ) || (
 				$this->moveTalk &&
-				MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() )
+					MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() )
 			)
 		) ) {
 			$conds = array(
 				'page_title' . $dbr->buildLike( $ot->getDBkey() . '/', $dbr->anyString() )
-					.' OR page_title = ' . $dbr->addQuotes( $ot->getDBkey() )
+					. ' OR page_title = ' . $dbr->addQuotes( $ot->getDBkey() )
 			);
 			$conds['page_namespace'] = array();
-			if( MWNamespace::hasSubpages( $nt->getNamespace() ) ) {
+			if ( MWNamespace::hasSubpages( $nt->getNamespace() ) ) {
 				$conds['page_namespace'][] = $ot->getNamespace();
 			}
-			if( $this->moveTalk && MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() ) ) {
+			if ( $this->moveTalk &&
+				MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() )
+			) {
 				$conds['page_namespace'][] = $ot->getTalkPage()->getNamespace();
 			}
-		} elseif( $this->moveTalk ) {
+		} elseif ( $this->moveTalk ) {
 			$conds = array(
 				'page_namespace' => $ot->getTalkPage()->getNamespace(),
 				'page_title' => $ot->getDBkey()
@@ -552,7 +611,7 @@ class MovePageForm extends UnlistedSpecialPage {
 		}
 
 		$extraPages = array();
-		if( !is_null( $conds ) ) {
+		if ( !is_null( $conds ) ) {
 			$extraPages = TitleArray::newFromResult(
 				$dbr->select( 'page',
 					array( 'page_id', 'page_namespace', 'page_title' ),
@@ -564,29 +623,31 @@ class MovePageForm extends UnlistedSpecialPage {
 
 		$extraOutput = array();
 		$count = 1;
-		foreach( $extraPages as $oldSubpage ) {
-			if( $ot->equals( $oldSubpage ) ) {
+		foreach ( $extraPages as $oldSubpage ) {
+			if ( $ot->equals( $oldSubpage ) || $nt->equals( $oldSubpage ) ) {
 				# Already did this one.
 				continue;
 			}
 
 			$newPageName = preg_replace(
-				'#^'.preg_quote( $ot->getDBkey(), '#' ).'#',
+				'#^' . preg_quote( $ot->getDBkey(), '#' ) . '#',
 				StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # bug 21234
 				$oldSubpage->getDBkey()
 			);
-			if( $oldSubpage->isTalkPage() ) {
+
+			if ( $oldSubpage->isTalkPage() ) {
 				$newNs = $nt->getTalkPage()->getNamespace();
 			} else {
 				$newNs = $nt->getSubjectPage()->getNamespace();
 			}
+
 			# Bug 14385: we need makeTitleSafe because the new page names may
 			# be longer than 255 characters.
 			$newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
-			if( !$newSubpage ) {
+			if ( !$newSubpage ) {
 				$oldLink = Linker::linkKnown( $oldSubpage );
-				$extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink
-					)->params( Title::makeName( $newNs, $newPageName ) )->escaped();
+				$extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink )
+					->params( Title::makeName( $newNs, $newPageName ) )->escaped();
 				continue;
 			}
 
@@ -596,7 +657,8 @@ class MovePageForm extends UnlistedSpecialPage {
 				$extraOutput[] = $this->msg( 'movepage-page-exists' )->rawParams( $link )->escaped();
 			} else {
 				$success = $oldSubpage->moveTo( $newSubpage, true, $this->reason, $createRedirect );
-				if( $success === true ) {
+
+				if ( $success === true ) {
 					if ( $this->fixRedirects ) {
 						DoubleRedirectJob::fixRedirects( 'move', $oldSubpage, $newSubpage );
 					}
@@ -606,10 +668,12 @@ class MovePageForm extends UnlistedSpecialPage {
 						array(),
 						array( 'redirect' => 'no' )
 					);
+
 					$newLink = Linker::linkKnown( $newSubpage );
 					$extraOutput[] = $this->msg( 'movepage-page-moved' )->rawParams( $oldLink, $newLink )->escaped();
 					++$count;
-					if( $count >= $wgMaximumMovedPages ) {
+
+					if ( $count >= $wgMaximumMovedPages ) {
 						$extraOutput[] = $this->msg( 'movepage-max-pages' )->numParams( $wgMaximumMovedPages )->escaped();
 						break;
 					}
@@ -619,28 +683,15 @@ class MovePageForm extends UnlistedSpecialPage {
 					$extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink, $newLink )->escaped();
 				}
 			}
-
 		}
 
-		if( $extraOutput !== array() ) {
+		if ( $extraOutput !== array() ) {
 			$out->addHTML( "<ul>\n<li>" . implode( "</li>\n<li>", $extraOutput ) . "</li>\n</ul>" );
 		}
 
 		# Deal with watches (we don't watch subpages)
-		if( $this->watch && $user->isLoggedIn() ) {
-			$user->addWatch( $ot );
-			$user->addWatch( $nt );
-		} else {
-			$user->removeWatch( $ot );
-			$user->removeWatch( $nt );
-		}
-
-		# Re-clear the file redirect cache, which may have been polluted by
-		# parsing in messages above. See CR r56745.
-		# @todo FIXME: Needs a more robust solution inside FileRepo.
-		if( $ot->getNamespace() == NS_FILE ) {
-			RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $ot );
-		}
+		WatchAction::doWatchOrUnwatch( $this->watch, $ot, $user );
+		WatchAction::doWatchOrUnwatch( $this->watch, $nt, $user );
 	}
 
 	function showLogFragment( $title ) {
@@ -651,8 +702,9 @@ class MovePageForm extends UnlistedSpecialPage {
 	}
 
 	function showSubpages( $title ) {
-		if( !MWNamespace::hasSubpages( $title->getNamespace() ) )
+		if ( !MWNamespace::hasSubpages( $title->getNamespace() ) ) {
 			return;
+		}
 
 		$subpages = $title->getSubpages();
 		$count = $subpages instanceof TitleArray ? $subpages->count() : 0;
@@ -663,13 +715,14 @@ class MovePageForm extends UnlistedSpecialPage {
 		# No subpages.
 		if ( $count == 0 ) {
 			$out->addWikiMsg( 'movenosubpage' );
+
 			return;
 		}
 
 		$out->addWikiMsg( 'movesubpagetext', $this->getLanguage()->formatNum( $count ) );
 		$out->addHTML( "<ul>\n" );
 
-		foreach( $subpages as $subpage ) {
+		foreach ( $subpages as $subpage ) {
 			$link = Linker::link( $subpage );
 			$out->addHTML( "<li>$link</li>\n" );
 		}
diff --git a/includes/specials/SpecialNewimages.php b/includes/specials/SpecialNewimages.php
index 52cbc3aa..37d29734 100644
--- a/includes/specials/SpecialNewimages.php
+++ b/includes/specials/SpecialNewimages.php
@@ -21,7 +21,6 @@
  * @ingroup SpecialPage
  */
 class SpecialNewFiles extends IncludableSpecialPage {
-
 	public function __construct() {
 		parent::__construct( 'Newimages' );
 	}
@@ -37,6 +36,7 @@ class SpecialNewFiles extends IncludableSpecialPage {
 			$form->prepareForm();
 			$form->displayForm( '' );
 		}
+
 		$this->getOutput()->addHTML( $pager->getBody() );
 		if ( !$this->including() ) {
 			$this->getOutput()->addHTML( $pager->getNavigationBar() );
@@ -52,7 +52,6 @@ class SpecialNewFiles extends IncludableSpecialPage {
  * @ingroup SpecialPage Pager
  */
 class NewFilesPager extends ReverseChronologicalPager {
-
 	/**
 	 * @var ImageGallery
 	 */
@@ -73,9 +72,10 @@ class NewFilesPager extends ReverseChronologicalPager {
 		$conds = $jconds = array();
 		$tables = array( 'image' );
 
-		if( !$this->showbots ) {
+		if ( !$this->showbots ) {
 			$groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
-			if( count( $groupsWithBotPermission ) ) {
+
+			if ( count( $groupsWithBotPermission ) ) {
 				$tables[] = 'user_groups';
 				$conds[] = 'ug_group IS NULL';
 				$jconds['user_groups'] = array(
@@ -88,11 +88,15 @@ class NewFilesPager extends ReverseChronologicalPager {
 			}
 		}
 
-		if( !$wgMiserMode && $this->like !== null ) {
+		if ( !$wgMiserMode && $this->like !== null ) {
 			$dbr = wfGetDB( DB_SLAVE );
 			$likeObj = Title::newFromURL( $this->like );
-			if( $likeObj instanceof Title ) {
-				$like = $dbr->buildLike( $dbr->anyString(), strtolower( $likeObj->getDBkey() ), $dbr->anyString() );
+			if ( $likeObj instanceof Title ) {
+				$like = $dbr->buildLike(
+					$dbr->anyString(),
+					strtolower( $likeObj->getDBkey() ),
+					$dbr->anyString()
+				);
 				$conds[] = "LOWER(img_name) $like";
 			}
 		}
@@ -113,8 +117,17 @@ class NewFilesPager extends ReverseChronologicalPager {
 
 	function getStartBody() {
 		if ( !$this->gallery ) {
-			$this->gallery = new ImageGallery();
+			// Note that null for mode is taken to mean use default.
+			$mode = $this->getRequest()->getVal( 'gallerymode', null );
+			try {
+				$this->gallery = ImageGalleryBase::factory( $mode );
+			} catch ( MWException $e ) {
+				// User specified something invalid, fallback to default.
+				$this->gallery = ImageGalleryBase::factory();
+			}
+			$this->gallery->setContext( $this->getContext() );
 		}
+
 		return '';
 	}
 
@@ -128,11 +141,12 @@ class NewFilesPager extends ReverseChronologicalPager {
 
 		$title = Title::makeTitle( NS_FILE, $name );
 		$ul = Linker::link( $user->getUserpage(), $user->getName() );
+		$time = $this->getLanguage()->userTimeAndDate( $row->img_timestamp, $this->getUser() );
 
 		$this->gallery->add(
 			$title,
 			"$ul<br />\n<i>"
-				. htmlspecialchars( $this->getLanguage()->userTimeAndDate( $row->img_timestamp, $this->getUser() ) )
+				. htmlspecialchars( $time )
 				. "</i><br />\n"
 		);
 	}
@@ -150,7 +164,6 @@ class NewFilesPager extends ReverseChronologicalPager {
 				'type' => 'check',
 				'label' => $this->msg( 'showhidebots', $this->msg( 'show' )->plain() )->escaped(),
 				'name' => 'showbots',
-			#	'default' => $this->getRequest()->getBool( 'showbots', 0 ),
 			),
 			'limit' => array(
 				'type' => 'hidden',
@@ -164,12 +177,13 @@ class NewFilesPager extends ReverseChronologicalPager {
 			),
 		);
 
-		if( $wgMiserMode ) {
+		if ( $wgMiserMode ) {
 			unset( $fields['like'] );
 		}
 
-		$form = new HTMLForm( $fields, $this->getContext() );
-		$form->setTitle( $this->getTitle() );
+		$context = new DerivativeContext( $this->getContext() );
+		$context->setTitle( $this->getTitle() ); // Remove subpage
+		$form = new HTMLForm( $fields, $context );
 		$form->setSubmitTextMsg( 'ilsubmit' );
 		$form->setMethod( 'get' );
 		$form->setWrapperLegendMsg( 'newimages-legend' );
diff --git a/includes/specials/SpecialNewpages.php b/includes/specials/SpecialNewpages.php
index ebb3021d..43d48558 100644
--- a/includes/specials/SpecialNewpages.php
+++ b/includes/specials/SpecialNewpages.php
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class SpecialNewpages extends IncludableSpecialPage {
-
 	// Stored objects
 
 	/**
@@ -63,17 +62,19 @@ class SpecialNewpages extends IncludableSpecialPage {
 
 		$this->customFilters = array();
 		wfRunHooks( 'SpecialNewPagesFilters', array( $this, &$this->customFilters ) );
-		foreach( $this->customFilters as $key => $params ) {
+		foreach ( $this->customFilters as $key => $params ) {
 			$opts->add( $key, $params['default'] );
 		}
 
 		// Set values
 		$opts->fetchValuesFromRequest( $this->getRequest() );
-		if ( $par ) $this->parseParams( $par );
+		if ( $par ) {
+			$this->parseParams( $par );
+		}
 
 		// Validate
 		$opts->validateIntBounds( 'limit', 0, 5000 );
-		if( !$wgEnableNewpagesUserFilter ) {
+		if ( !$wgEnableNewpagesUserFilter ) {
 			$opts->setValue( 'username', '' );
 		}
 	}
@@ -113,7 +114,7 @@ class SpecialNewpages extends IncludableSpecialPage {
 			}
 			if ( preg_match( '/^namespace=(.*)$/', $bit, $m ) ) {
 				$ns = $this->getLanguage()->getNsIndex( $m[1] );
-				if( $ns !== false ) {
+				if ( $ns !== false ) {
 					$this->opts->setValue( 'namespace', $ns );
 				}
 			}
@@ -135,13 +136,14 @@ class SpecialNewpages extends IncludableSpecialPage {
 		$this->showNavigation = !$this->including(); // Maybe changed in setup
 		$this->setup( $par );
 
-		if( !$this->including() ) {
+		if ( !$this->including() ) {
 			// Settings
 			$this->form();
 
 			$feedType = $this->opts->getValue( 'feed' );
-			if( $feedType ) {
+			if ( $feedType ) {
 				$this->feed( $feedType );
+
 				return;
 			}
 
@@ -154,7 +156,7 @@ class SpecialNewpages extends IncludableSpecialPage {
 		$pager->mLimit = $this->opts->getValue( 'limit' );
 		$pager->mOffset = $this->opts->getValue( 'offset' );
 
-		if( $pager->getNumRows() ) {
+		if ( $pager->getNumRows() ) {
 			$navigation = '';
 			if ( $this->showNavigation ) {
 				$navigation = $pager->getNavigationBar();
@@ -196,7 +198,7 @@ class SpecialNewpages extends IncludableSpecialPage {
 		foreach ( $filters as $key => $msg ) {
 			$onoff = 1 - $this->opts->getValue( $key );
 			$link = Linker::link( $self, $showhide[$onoff], array(),
-					array( $key => $onoff ) + $changed
+				array( $key => $onoff ) + $changed
 			);
 			$links[$key] = $this->msg( $msg )->rawParams( $link )->escaped();
 		}
@@ -236,55 +238,55 @@ class SpecialNewpages extends IncludableSpecialPage {
 			Xml::openElement( 'table', array( 'id' => 'mw-newpages-table' ) ) .
 			'<tr>
 				<td class="mw-label">' .
-					Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
-				'</td>
-				<td class="mw-input">' .
-					Html::namespaceSelector(
-						array(
-							'selected' => $namespace,
-							'all' => 'all',
-						), array(
-							'name'  => 'namespace',
-							'id'    => 'namespace',
-							'class' => 'namespaceselector',
-						)
-					) . '&#160;' .
-					Xml::checkLabel(
-						$this->msg( 'invert' )->text(),
-						'invert',
-						'nsinvert',
-						$nsinvert,
-						array( 'title' => $this->msg( 'tooltip-invert' )->text() )
-					) .
-				'</td>
+			Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
+			'</td>
+			<td class="mw-input">' .
+			Html::namespaceSelector(
+				array(
+					'selected' => $namespace,
+					'all' => 'all',
+				), array(
+					'name' => 'namespace',
+					'id' => 'namespace',
+					'class' => 'namespaceselector',
+				)
+			) . '&#160;' .
+			Xml::checkLabel(
+				$this->msg( 'invert' )->text(),
+				'invert',
+				'nsinvert',
+				$nsinvert,
+				array( 'title' => $this->msg( 'tooltip-invert' )->text() )
+			) .
+			'</td>
 			</tr>' . ( $tagFilter ? (
 			'<tr>
 				<td class="mw-label">' .
-					$tagFilterLabel .
+				$tagFilterLabel .
 				'</td>
 				<td class="mw-input">' .
-					$tagFilterSelector .
+				$tagFilterSelector .
 				'</td>
 			</tr>' ) : '' ) .
 			( $wgEnableNewpagesUserFilter ?
-			'<tr>
+				'<tr>
 				<td class="mw-label">' .
 					Xml::label( $this->msg( 'newpages-username' )->text(), 'mw-np-username' ) .
-				'</td>
+					'</td>
 				<td class="mw-input">' .
 					Xml::input( 'username', 30, $userText, array( 'id' => 'mw-np-username' ) ) .
-				'</td>
+					'</td>
 			</tr>' : '' ) .
 			'<tr> <td></td>
 				<td class="mw-submit">' .
-					Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
-				'</td>
-			</tr>' .
+			Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
+			'</td>
+		</tr>' .
 			'<tr>
 				<td></td>
 				<td class="mw-input">' .
-					$this->filterLinks() .
-				'</td>
+			$this->filterLinks() .
+			'</td>
 			</tr>' .
 			Xml::closeElement( 'table' ) .
 			Xml::closeElement( 'fieldset' ) .
@@ -295,9 +297,10 @@ class SpecialNewpages extends IncludableSpecialPage {
 	}
 
 	/**
-	 * Format a row, providing the timestamp, links to the page/history, size, user links, and a comment
+	 * Format a row, providing the timestamp, links to the page/history,
+	 * size, user links, and a comment
 	 *
-	 * @param $result Result row
+	 * @param object $result Result row
 	 * @return String
 	 */
 	public function formatRow( $result ) {
@@ -331,11 +334,8 @@ class SpecialNewpages extends IncludableSpecialPage {
 
 		$query = array( 'redirect' => 'no' );
 
-		if( $this->patrollable( $result ) ) {
-			$query['rcid'] = $result->rc_id;
-		}
-
-		// Linker::linkKnown() uses 'known' and 'noclasses' options. This breaks the colouration for stubs.
+		// Linker::linkKnown() uses 'known' and 'noclasses' options.
+		// This breaks the colouration for stubs.
 		$plink = Linker::link(
 			$title,
 			null,
@@ -352,8 +352,12 @@ class SpecialNewpages extends IncludableSpecialPage {
 		$hist = Html::rawElement( 'span', array( 'class' => 'mw-newpages-history' ),
 			$this->msg( 'parentheses' )->rawParams( $histLink )->escaped() );
 
-		$length = Html::element( 'span', array( 'class' => 'mw-newpages-length' ),
-			$this->msg( 'brackets' )->params( $this->msg( 'nbytes' )->numParams( $result->length )->text() )
+		$length = Html::element(
+			'span',
+			array( 'class' => 'mw-newpages-length' ),
+			$this->msg( 'brackets' )->params( $this->msg( 'nbytes' )
+				->numParams( $result->length )->text()
+			)
 		);
 
 		$ulink = Linker::revUserTools( $rev );
@@ -369,8 +373,11 @@ class SpecialNewpages extends IncludableSpecialPage {
 		}
 
 		# Tags, if any.
-		if( isset( $result->ts_tags ) ) {
-			list( $tagDisplay, $newClasses ) = ChangeTags::formatSummaryRow( $result->ts_tags, 'newpages' );
+		if ( isset( $result->ts_tags ) ) {
+			list( $tagDisplay, $newClasses ) = ChangeTags::formatSummaryRow(
+				$result->ts_tags,
+				'newpages'
+			);
 			$classes = array_merge( $classes, $newClasses );
 		} else {
 			$tagDisplay = '';
@@ -381,8 +388,10 @@ class SpecialNewpages extends IncludableSpecialPage {
 		# Display the old title if the namespace/title has been changed
 		$oldTitleText = '';
 		$oldTitle = Title::makeTitle( $result->rc_namespace, $result->rc_title );
+
 		if ( !$title->equals( $oldTitle ) ) {
-			$oldTitleText = $this->msg( 'rc-old-title' )->params( $oldTitle->getPrefixedText() )->escaped();
+			$oldTitleText = $oldTitle->getPrefixedText();
+			$oldTitleText = $this->msg( 'rc-old-title' )->params( $oldTitleText )->escaped();
 		}
 
 		return "<li{$css}>{$time} {$dm}{$plink} {$hist} {$dm}{$length} {$dm}{$ulink} {$comment} {$tagDisplay} {$oldTitleText}</li>\n";
@@ -391,7 +400,7 @@ class SpecialNewpages extends IncludableSpecialPage {
 	/**
 	 * Should a specific result row provide "patrollable" links?
 	 *
-	 * @param $result Result row
+	 * @param object $result Result row
 	 * @return Boolean
 	 */
 	protected function patrollable( $result ) {
@@ -408,18 +417,20 @@ class SpecialNewpages extends IncludableSpecialPage {
 
 		if ( !$wgFeed ) {
 			$this->getOutput()->addWikiMsg( 'feed-unavailable' );
+
 			return;
 		}
 
-		if( !isset( $wgFeedClasses[$type] ) ) {
+		if ( !isset( $wgFeedClasses[$type] ) ) {
 			$this->getOutput()->addWikiMsg( 'feed-invalid' );
+
 			return;
 		}
 
 		$feed = new $wgFeedClasses[$type](
 			$this->feedTitle(),
 			$this->msg( 'tagline' )->text(),
-			$this->getTitle()->getFullUrl()
+			$this->getTitle()->getFullURL()
 		);
 
 		$pager = new NewPagesPager( $this, $this->opts );
@@ -427,7 +438,7 @@ class SpecialNewpages extends IncludableSpecialPage {
 		$pager->mLimit = min( $limit, $wgFeedLimit );
 
 		$feed->outHeader();
-		if( $pager->getNumRows() > 0 ) {
+		if ( $pager->getNumRows() > 0 ) {
 			foreach ( $pager->mResult as $row ) {
 				$feed->outItem( $this->feedItem( $row ) );
 			}
@@ -438,12 +449,13 @@ class SpecialNewpages extends IncludableSpecialPage {
 	protected function feedTitle() {
 		global $wgLanguageCode, $wgSitename;
 		$desc = $this->getDescription();
+
 		return "$wgSitename - $desc [$wgLanguageCode]";
 	}
 
 	protected function feedItem( $row ) {
 		$title = Title::makeTitle( intval( $row->rc_namespace ), $row->rc_title );
-		if( $title ) {
+		if ( $title ) {
 			$date = $row->rc_timestamp;
 			$comments = $title->getTalkPage()->getFullURL();
 
@@ -466,7 +478,7 @@ class SpecialNewpages extends IncludableSpecialPage {
 
 	protected function feedItemDesc( $row ) {
 		$revision = Revision::newFromId( $row->rev_id );
-		if( $revision ) {
+		if ( $revision ) {
 			//XXX: include content model/type in feed item?
 			return '<p>' . htmlspecialchars( $revision->getUserText() ) .
 				$this->msg( 'colon-separator' )->inContentLanguage()->escaped() .
@@ -474,6 +486,7 @@ class SpecialNewpages extends IncludableSpecialPage {
 				"</p>\n<hr />\n<div>" .
 				nl2br( htmlspecialchars( $revision->getContent()->serialize() ) ) . "</div>";
 		}
+
 		return '';
 	}
 
@@ -511,7 +524,7 @@ class NewPagesPager extends ReverseChronologicalPager {
 		$username = $this->opts->getValue( 'username' );
 		$user = Title::makeTitleSafe( NS_USER, $username );
 
-		if( $namespace !== false ) {
+		if ( $namespace !== false ) {
 			if ( $this->opts->getValue( 'invert' ) ) {
 				$conds[] = 'rc_namespace != ' . $this->mDb->addQuotes( $namespace );
 			} else {
@@ -523,18 +536,22 @@ class NewPagesPager extends ReverseChronologicalPager {
 		}
 
 		# $wgEnableNewpagesUserFilter - temp WMF hack
-		if( $wgEnableNewpagesUserFilter && $user ) {
+		if ( $wgEnableNewpagesUserFilter && $user ) {
 			$conds['rc_user_text'] = $user->getText();
 			$rcIndexes = 'rc_user_text';
-		# If anons cannot make new pages, don't "exclude logged in users"!
-		} elseif( User::groupHasPermission( '*', 'createpage' ) && $this->opts->getValue( 'hideliu' ) ) {
+		} elseif ( User::groupHasPermission( '*', 'createpage' ) &&
+			$this->opts->getValue( 'hideliu' )
+		) {
+			# If anons cannot make new pages, don't "exclude logged in users"!
 			$conds['rc_user'] = 0;
 		}
+
 		# If this user cannot see patrolled edits or they are off, don't do dumb queries!
-		if( $this->opts->getValue( 'hidepatrolled' ) && $this->getUser()->useNPPatrol() ) {
+		if ( $this->opts->getValue( 'hidepatrolled' ) && $this->getUser()->useNPPatrol() ) {
 			$conds['rc_patrolled'] = 0;
 		}
-		if( $this->opts->getValue( 'hidebots' ) ) {
+
+		if ( $this->opts->getValue( 'hidebots' ) ) {
 			$conds['rc_bot'] = 0;
 		}
 
@@ -546,7 +563,7 @@ class NewPagesPager extends ReverseChronologicalPager {
 		$tables = array( 'recentchanges', 'page' );
 		$fields = array(
 			'rc_namespace', 'rc_title', 'rc_cur_id', 'rc_user', 'rc_user_text',
-			'rc_comment', 'rc_timestamp', 'rc_patrolled','rc_id', 'rc_deleted',
+			'rc_comment', 'rc_timestamp', 'rc_patrolled', 'rc_id', 'rc_deleted',
 			'length' => 'page_len', 'rev_id' => 'page_latest', 'rc_this_oldid',
 			'page_namespace', 'page_title'
 		);
@@ -556,10 +573,10 @@ class NewPagesPager extends ReverseChronologicalPager {
 			array( &$this, $this->opts, &$conds, &$tables, &$fields, &$join_conds ) );
 
 		$info = array(
-			'tables' 	 => $tables,
-			'fields' 	 => $fields,
-			'conds' 	 => $conds,
-			'options' 	 => array( 'USE INDEX' => array( 'recentchanges' => $rcIndexes ) ),
+			'tables' => $tables,
+			'fields' => $fields,
+			'conds' => $conds,
+			'options' => array( 'USE INDEX' => array( 'recentchanges' => $rcIndexes ) ),
 			'join_conds' => $join_conds
 		);
 
@@ -593,6 +610,7 @@ class NewPagesPager extends ReverseChronologicalPager {
 			$linkBatch->add( $row->rc_namespace, $row->rc_title );
 		}
 		$linkBatch->execute();
+
 		return '<ul>';
 	}
 
diff --git a/includes/specials/SpecialPagesWithProp.php b/includes/specials/SpecialPagesWithProp.php
index 8f8c981e..e22b42a3 100644
--- a/includes/specials/SpecialPagesWithProp.php
+++ b/includes/specials/SpecialPagesWithProp.php
@@ -23,7 +23,6 @@
  * @author Brad Jorsch
  */
 
-
 /**
  * Special:PagesWithProp to search the page_props table
  * @ingroup SpecialPage
@@ -43,6 +42,7 @@ class SpecialPagesWithProp extends QueryPage {
 	function execute( $par ) {
 		$this->setHeaders();
 		$this->outputHeader();
+		$this->getOutput()->addModuleStyles( 'mediawiki.special.pagesWithProp' );
 
 		$request = $this->getRequest();
 		$propname = $request->getVal( 'propname', $par );
@@ -55,6 +55,7 @@ class SpecialPagesWithProp extends QueryPage {
 			__METHOD__,
 			array( 'DISTINCT', 'ORDER BY' => 'pp_propname' )
 		);
+		$propnames = array();
 		foreach ( $res as $row ) {
 			$propnames[$row->pp_propname] = $row->pp_propname;
 		}
@@ -70,9 +71,8 @@ class SpecialPagesWithProp extends QueryPage {
 			),
 		), $this->getContext() );
 		$form->setMethod( 'get' );
-		$form->setAction( $this->getTitle()->getFullUrl() );
 		$form->setSubmitCallback( array( $this, 'onSubmit' ) );
-		$form->setWrapperLegend( $this->msg( 'pageswithprop-legend' ) );
+		$form->setWrapperLegendMsg( 'pageswithprop-legend' );
 		$form->addHeaderText( $this->msg( 'pageswithprop-text' )->parseAsBlock() );
 		$form->setSubmitTextMsg( 'pageswithprop-submit' );
 
@@ -120,15 +120,33 @@ class SpecialPagesWithProp extends QueryPage {
 		return array( 'page_id' );
 	}
 
+	/**
+	 * @param Skin $skin
+	 * @param object $result Result row
+	 * @return string
+	 */
 	function formatResult( $skin, $result ) {
 		$title = Title::newFromRow( $result );
 		$ret = Linker::link( $title, null, array(), array(), array( 'known' ) );
 		if ( $result->pp_value !== '' ) {
-			$value = $this->msg( 'parentheses' )
-				->rawParams( Xml::span( $result->pp_value, 'prop-value' ) )
-				->escaped();
-			$ret .= " $value";
+			// Do not show very long or binary values on the special page
+			$valueLength = strlen( $result->pp_value );
+			$isBinary = strpos( $result->pp_value, "\0" ) !== false;
+			$isTooLong = $valueLength > 1024;
+
+			if ( $isBinary || $isTooLong ) {
+				$message = $this
+					->msg( $isBinary ? 'pageswithprop-prophidden-binary' : 'pageswithprop-prophidden-long' )
+					->params( $this->getLanguage()->formatSize( $valueLength ) );
+
+				$propValue = Html::element( 'span', array( 'class' => 'prop-value-hidden' ), $message->text() );
+			} else {
+				$propValue = Html::element( 'span', array( 'class' => 'prop-value' ), $result->pp_value );
+			}
+
+			$ret .= $this->msg( 'colon-separator' )->escaped() . $propValue;
 		}
+
 		return $ret;
 	}
 
diff --git a/includes/specials/SpecialPasswordReset.php b/includes/specials/SpecialPasswordReset.php
index 90b0ac80..c486ba01 100644
--- a/includes/specials/SpecialPasswordReset.php
+++ b/includes/specials/SpecialPasswordReset.php
@@ -27,19 +27,23 @@
  * @ingroup SpecialPage
  */
 class SpecialPasswordReset extends FormSpecialPage {
-
 	/**
 	 * @var Message
 	 */
 	private $email;
 
+	/**
+	 * @var User
+	 */
+	private $firstUser;
+
 	/**
 	 * @var Status
 	 */
 	private $result;
 
 	public function __construct() {
-		parent::__construct( 'PasswordReset' );
+		parent::__construct( 'PasswordReset', 'editmyprivateinfo' );
 	}
 
 	public function userCanExecute( User $user ) {
@@ -65,7 +69,8 @@ class SpecialPasswordReset extends FormSpecialPage {
 				'type' => 'text',
 				'label-message' => 'passwordreset-username',
 			);
-			if( $this->getUser()->isLoggedIn() ) {
+
+			if ( $this->getUser()->isLoggedIn() ) {
 				$a['Username']['default'] = $this->getUser()->getName();
 			}
 		}
@@ -86,7 +91,7 @@ class SpecialPasswordReset extends FormSpecialPage {
 			);
 		}
 
-		if( $this->getUser()->isAllowed( 'passwordreset' ) ) {
+		if ( $this->getUser()->isAllowed( 'passwordreset' ) ) {
 			$a['Capture'] = array(
 				'type' => 'check',
 				'label-message' => 'passwordreset-capture',
@@ -98,11 +103,15 @@ class SpecialPasswordReset extends FormSpecialPage {
 	}
 
 	public function alterForm( HTMLForm $form ) {
-		$form->setSubmitTextMsg( 'mailmypassword' );
-	}
-
-	protected function preText() {
 		global $wgPasswordResetRoutes;
+
+		$form->setDisplayFormat( 'vform' );
+		// Turn the old-school line around the form off.
+		// XXX This wouldn't be necessary here if we could set the format of
+		// the HTMLForm to 'vform' at its creation, but there's no way to do so
+		// from a FormSpecialPage class.
+		$form->setWrapperLegend( false );
+
 		$i = 0;
 		if ( isset( $wgPasswordResetRoutes['username'] ) && $wgPasswordResetRoutes['username'] ) {
 			$i++;
@@ -113,7 +122,11 @@ class SpecialPasswordReset extends FormSpecialPage {
 		if ( isset( $wgPasswordResetRoutes['domain'] ) && $wgPasswordResetRoutes['domain'] ) {
 			$i++;
 		}
-		return $this->msg( 'passwordreset-pretext', $i )->parseAsBlock();
+
+		$message = ( $i > 1 ) ? 'passwordreset-text-many' : 'passwordreset-text-one';
+
+		$form->setHeaderText( $this->msg( $message, $i )->parseAsBlock() );
+		$form->setSubmitTextMsg( 'mailmypassword' );
 	}
 
 	/**
@@ -136,8 +149,9 @@ class SpecialPasswordReset extends FormSpecialPage {
 			}
 		}
 
-		if( isset( $data['Capture'] ) && !$this->getUser()->isAllowed( 'passwordreset' ) ) {
-			// The user knows they don't have the passwordreset permission, but they tried to spoof the form.  That's naughty
+		if ( isset( $data['Capture'] ) && !$this->getUser()->isAllowed( 'passwordreset' ) ) {
+			// The user knows they don't have the passwordreset permission,
+			// but they tried to spoof the form. That's naughty
 			throw new PermissionsError( 'passwordreset' );
 		}
 
@@ -151,8 +165,8 @@ class SpecialPasswordReset extends FormSpecialPage {
 			$users = array( User::newFromName( $data['Username'] ) );
 		} elseif ( isset( $data['Email'] )
 			&& $data['Email'] !== ''
-			&& Sanitizer::validateEmail( $data['Email'] ) )
-		{
+			&& Sanitizer::validateEmail( $data['Email'] )
+		) {
 			$method = 'email';
 			$res = wfGetDB( DB_SLAVE )->select(
 				'user',
@@ -160,9 +174,11 @@ class SpecialPasswordReset extends FormSpecialPage {
 				array( 'user_email' => $data['Email'] ),
 				__METHOD__
 			);
+
 			if ( $res ) {
 				$users = array();
-				foreach( $res as $row ) {
+
+				foreach ( $res as $row ) {
 					$users[] = User::newFromRow( $row );
 				}
 			} else {
@@ -180,8 +196,8 @@ class SpecialPasswordReset extends FormSpecialPage {
 			return array( $error );
 		}
 
-		if( count( $users ) == 0 ) {
-			if( $method == 'email' ) {
+		if ( count( $users ) == 0 ) {
+			if ( $method == 'email' ) {
 				// Don't reveal whether or not an email address is in use
 				return true;
 			} else {
@@ -204,9 +220,13 @@ class SpecialPasswordReset extends FormSpecialPage {
 		foreach ( $users as $user ) {
 			if ( $user->isPasswordReminderThrottled() ) {
 				global $wgPasswordReminderResendTime;
+
 				# Round the time in hours to 3 d.p., in case someone is specifying
 				# minutes or seconds.
-				return array( array( 'throttled-mailpassword', round( $wgPasswordReminderResendTime, 3 ) ) );
+				return array( array(
+					'throttled-mailpassword',
+					round( $wgPasswordReminderResendTime, 3 )
+				) );
 			}
 		}
 
@@ -239,8 +259,8 @@ class SpecialPasswordReset extends FormSpecialPage {
 			$password = $user->randomPassword();
 			$user->setNewpassword( $password );
 			$user->saveSettings();
-			$passwords[] = $this->msg( 'passwordreset-emailelement', $user->getName(), $password
-				)->inLanguage( $userLanguage )->text(); // We'll escape the whole thing later
+			$passwords[] = $this->msg( 'passwordreset-emailelement', $user->getName(), $password )
+				->inLanguage( $userLanguage )->text(); // We'll escape the whole thing later
 		}
 		$passwordBlock = implode( "\n\n", $passwords );
 
@@ -249,7 +269,7 @@ class SpecialPasswordReset extends FormSpecialPage {
 			$username,
 			$passwordBlock,
 			count( $passwords ),
-			'<' . Title::newMainPage()->getCanonicalUrl() . '>',
+			'<' . Title::newMainPage()->getCanonicalURL() . '>',
 			round( $wgNewPasswordExpiry / 86400 )
 		);
 
@@ -257,31 +277,36 @@ class SpecialPasswordReset extends FormSpecialPage {
 
 		$this->result = $firstUser->sendMail( $title->escaped(), $this->email->text() );
 
-		// Blank the email if the user is not supposed to see it
-		if( !isset( $data['Capture'] ) || !$data['Capture'] ) {
+		if ( isset( $data['Capture'] ) && $data['Capture'] ) {
+			// Save the user, will be used if an error occurs when sending the email
+			$this->firstUser = $firstUser;
+		} else {
+			// Blank the email if the user is not supposed to see it
 			$this->email = null;
 		}
 
 		if ( $this->result->isGood() ) {
 			return true;
-		} elseif( isset( $data['Capture'] ) && $data['Capture'] ) {
+		} elseif ( isset( $data['Capture'] ) && $data['Capture'] ) {
 			// The email didn't send, but maybe they knew that and that's why they captured it
 			return true;
 		} else {
-			// @todo FIXME: The email didn't send, but we have already set the password throttle
-			// timestamp, so they won't be able to try again until it expires...  :(
+			// @todo FIXME: The email wasn't sent, but we have already set
+			// the password throttle timestamp, so they won't be able to try
+			// again until it expires...  :(
 			return array( array( 'mailerror', $this->result->getMessage() ) );
 		}
 	}
 
 	public function onSuccess() {
-		if( $this->getUser()->isAllowed( 'passwordreset' ) && $this->email != null ) {
-			// @todo: Logging
+		if ( $this->getUser()->isAllowed( 'passwordreset' ) && $this->email != null ) {
+			// @todo Logging
 
-			if( $this->result->isGood() ) {
+			if ( $this->result->isGood() ) {
 				$this->getOutput()->addWikiMsg( 'passwordreset-emailsent-capture' );
 			} else {
-				$this->getOutput()->addWikiMsg( 'passwordreset-emailerror-capture', $this->result->getMessage() );
+				$this->getOutput()->addWikiMsg( 'passwordreset-emailerror-capture',
+					$this->result->getMessage(), $this->firstUser->getName() );
 			}
 
 			$this->getOutput()->addHTML( Html::rawElement( 'pre', array(), $this->email->escaped() ) );
@@ -292,12 +317,12 @@ class SpecialPasswordReset extends FormSpecialPage {
 	}
 
 	protected function canChangePassword( User $user ) {
-		global $wgPasswordResetRoutes, $wgAuth;
+		global $wgPasswordResetRoutes, $wgEnableEmail, $wgAuth;
 
 		// Maybe password resets are disabled, or there are no allowable routes
 		if ( !is_array( $wgPasswordResetRoutes ) ||
-			 !in_array( true, array_values( $wgPasswordResetRoutes ) ) )
-		{
+			!in_array( true, array_values( $wgPasswordResetRoutes ) )
+		) {
 			return 'passwordreset-disabled';
 		}
 
@@ -306,6 +331,11 @@ class SpecialPasswordReset extends FormSpecialPage {
 			return 'resetpass_forbidden';
 		}
 
+		// Maybe email features have been disabled
+		if ( !$wgEnableEmail ) {
+			return 'passwordreset-emaildisabled';
+		}
+
 		// Maybe the user is blocked (check this here rather than relying on the parent
 		// method as we have a more specific error message to use here
 		if ( $user->isBlocked() ) {
diff --git a/includes/specials/SpecialPopularpages.php b/includes/specials/SpecialPopularpages.php
index 7ce8c13f..2a80f651 100644
--- a/includes/specials/SpecialPopularpages.php
+++ b/includes/specials/SpecialPopularpages.php
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class PopularPagesPage extends QueryPage {
-
 	function __construct( $name = 'Popularpages' ) {
 		parent::__construct( $name );
 	}
@@ -42,27 +41,37 @@ class PopularPagesPage extends QueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
+		return array(
 			'tables' => array( 'page' ),
-			'fields' => array( 'namespace' => 'page_namespace',
-					'title' => 'page_title',
-					'value' => 'page_counter' ),
-			'conds' => array( 'page_is_redirect' => 0,
-					'page_namespace' => MWNamespace::getContentNamespaces() ) );
+			'fields' => array(
+				'namespace' => 'page_namespace',
+				'title' => 'page_title',
+				'value' => 'page_counter' ),
+			'conds' => array(
+				'page_is_redirect' => 0,
+				'page_namespace' => MWNamespace::getContentNamespaces()
+			)
+		);
 	}
 
 	/**
-	 * @param $skin Skin
-	 * @param $result
+	 * @param Skin $skin
+	 * @param object $result Result row
 	 * @return string
 	 */
 	function formatResult( $skin, $result ) {
 		global $wgContLang;
 
 		$title = Title::makeTitleSafe( $result->namespace, $result->title );
-		if( !$title ) {
-			return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-				Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+		if ( !$title ) {
+			return Html::element(
+				'span',
+				array( 'class' => 'mw-invalidtitle' ),
+				Linker::getInvalidTitleDescription(
+					$this->getContext(),
+					$result->namespace,
+					$result->title )
+			);
 		}
 
 		$link = Linker::linkKnown(
@@ -70,6 +79,7 @@ class PopularPagesPage extends QueryPage {
 			htmlspecialchars( $wgContLang->convert( $title->getPrefixedText() ) )
 		);
 		$nv = $this->msg( 'nviews' )->numParams( $result->value )->escaped();
+
 		return $this->getLanguage()->specialList( $link, $nv );
 	}
 
diff --git a/includes/specials/SpecialPreferences.php b/includes/specials/SpecialPreferences.php
index a50e7c18..ecee0bb7 100644
--- a/includes/specials/SpecialPreferences.php
+++ b/includes/specials/SpecialPreferences.php
@@ -35,16 +35,21 @@ class SpecialPreferences extends SpecialPage {
 		$this->setHeaders();
 		$this->outputHeader();
 		$out = $this->getOutput();
-		$out->disallowUserJs();  # Prevent hijacked user scripts from sniffing passwords etc.
+		$out->disallowUserJs(); # Prevent hijacked user scripts from sniffing passwords etc.
 
 		$user = $this->getUser();
 		if ( $user->isAnon() ) {
-			throw new ErrorPageError( 'prefsnologin', 'prefsnologintext', array( $this->getTitle()->getPrefixedDBkey() ) );
+			throw new ErrorPageError(
+				'prefsnologin',
+				'prefsnologintext',
+				array( $this->getTitle()->getPrefixedDBkey() )
+			);
 		}
 		$this->checkReadOnly();
 
 		if ( $par == 'reset' ) {
 			$this->showResetForm();
+
 			return;
 		}
 
@@ -52,7 +57,7 @@ class SpecialPreferences extends SpecialPage {
 
 		if ( $this->getRequest()->getCheck( 'success' ) ) {
 			$out->wrapWikiMsg(
-				"<div class=\"successbox\"><strong>\n$1\n</strong></div><div id=\"mw-pref-clear\"></div>",
+				"<div class=\"successbox\">\n$1\n</div>",
 				'savedprefs'
 			);
 		}
@@ -64,12 +69,17 @@ class SpecialPreferences extends SpecialPage {
 	}
 
 	private function showResetForm() {
+		if ( !$this->getUser()->isAllowed( 'editmyoptions' ) ) {
+			throw new PermissionsError( 'editmyoptions' );
+		}
+
 		$this->getOutput()->addWikiMsg( 'prefs-reset-intro' );
 
-		$htmlForm = new HTMLForm( array(), $this->getContext(), 'prefs-restore' );
+		$context = new DerivativeContext( $this->getContext() );
+		$context->setTitle( $this->getTitle( 'reset' ) ); // Reset subpage
+		$htmlForm = new HTMLForm( array(), $context, 'prefs-restore' );
 
 		$htmlForm->setSubmitTextMsg( 'restoreprefs' );
-		$htmlForm->setTitle( $this->getTitle( 'reset' ) );
 		$htmlForm->setSubmitCallback( array( $this, 'submitReset' ) );
 		$htmlForm->suppressReset();
 
@@ -77,8 +87,12 @@ class SpecialPreferences extends SpecialPage {
 	}
 
 	public function submitReset( $formData ) {
+		if ( !$this->getUser()->isAllowed( 'editmyoptions' ) ) {
+			throw new PermissionsError( 'editmyoptions' );
+		}
+
 		$user = $this->getUser();
-		$user->resetOptions( 'all' );
+		$user->resetOptions( 'all', $this->getContext() );
 		$user->saveSettings();
 
 		$url = $this->getTitle()->getFullURL( 'success' );
diff --git a/includes/specials/SpecialPrefixindex.php b/includes/specials/SpecialPrefixindex.php
index 6affa735..28d07ffc 100644
--- a/includes/specials/SpecialPrefixindex.php
+++ b/includes/specials/SpecialPrefixindex.php
@@ -27,6 +27,15 @@
  * @ingroup SpecialPage
  */
 class SpecialPrefixindex extends SpecialAllpages {
+
+	/**
+	 * Whether to remove the searched prefix from the displayed link. Useful
+	 * for inclusion of a set of sub pages in a root page.
+	 */
+	protected $stripPrefix = false;
+
+	protected $hideRedirects = false;
+
 	// Inherit $maxPerPage
 
 	function __construct() {
@@ -52,7 +61,8 @@ class SpecialPrefixindex extends SpecialAllpages {
 		$prefix = $request->getVal( 'prefix', '' );
 		$ns = $request->getIntOrNull( 'namespace' );
 		$namespace = (int)$ns; // if no namespace given, use 0 (NS_MAIN).
-		$hideredirects = $request->getBool( 'hideredirects', false );
+		$this->hideRedirects = $request->getBool( 'hideredirects', $this->hideRedirects );
+		$this->stripPrefix = $request->getBool( 'stripprefix', $this->stripPrefix );
 
 		$namespaces = $wgContLang->getNamespaces();
 		$out->setPageTitle(
@@ -62,11 +72,11 @@ class SpecialPrefixindex extends SpecialAllpages {
 		);
 
 		$showme = '';
-		if( isset( $par ) ) {
+		if ( isset( $par ) ) {
 			$showme = $par;
-		} elseif( $prefix != '' ) {
+		} elseif ( $prefix != '' ) {
 			$showme = $prefix;
-		} elseif( $from != '' && $ns === null ) {
+		} elseif ( $from != '' && $ns === null ) {
 			// For back-compat with Special:Allpages
 			// Don't do this if namespace is passed, so paging works when doing NS views.
 			$showme = $from;
@@ -74,9 +84,9 @@ class SpecialPrefixindex extends SpecialAllpages {
 
 		// Bug 27864: if transcluded, show all pages instead of the form.
 		if ( $this->including() || $showme != '' || $ns !== null ) {
-			$this->showPrefixChunk( $namespace, $showme, $from, $hideredirects );
+			$this->showPrefixChunk( $namespace, $showme, $from );
 		} else {
-			$out->addHTML( $this->namespacePrefixForm( $namespace, null, $hideredirects ) );
+			$out->addHTML( $this->namespacePrefixForm( $namespace, null ) );
 		}
 	}
 
@@ -84,10 +94,9 @@ class SpecialPrefixindex extends SpecialAllpages {
 	 * HTML for the top form
 	 * @param $namespace Integer: a namespace constant (default NS_MAIN).
 	 * @param string $from dbKey we are starting listing at.
-	 * @param bool $hideredirects hide redirects (default FALSE)
 	 * @return string
 	 */
-	function namespacePrefixForm( $namespace = NS_MAIN, $from = '', $hideredirects = false ) {
+	protected function namespacePrefixForm( $namespace = NS_MAIN, $from = '' ) {
 		global $wgScript;
 
 		$out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
@@ -98,37 +107,44 @@ class SpecialPrefixindex extends SpecialAllpages {
 		$out .= Xml::openElement( 'table', array( 'id' => 'nsselect', 'class' => 'allpages' ) );
 		$out .= "<tr>
 				<td class='mw-label'>" .
-				Xml::label( $this->msg( 'allpagesprefix' )->text(), 'nsfrom' ) .
-				"</td>
+			Xml::label( $this->msg( 'allpagesprefix' )->text(), 'nsfrom' ) .
+			"</td>
 				<td class='mw-input'>" .
-					Xml::input( 'prefix', 30, str_replace( '_', ' ', $from ), array( 'id' => 'nsfrom' ) ) .
-				"</td>
+			Xml::input( 'prefix', 30, str_replace( '_', ' ', $from ), array( 'id' => 'nsfrom' ) ) .
+			"</td>
 			</tr>
 			<tr>
-				<td class='mw-label'>" .
-					Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
-				"</td>
+			<td class='mw-label'>" .
+			Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
+			"</td>
 				<td class='mw-input'>" .
-				Html::namespaceSelector( array(
-						'selected' => $namespace,
-					), array(
-						'name'  => 'namespace',
-						'id'    => 'namespace',
-						'class' => 'namespaceselector',
-				) ) .
-				Xml::checkLabel(
-					$this->msg( 'allpages-hide-redirects' )->text(),
-					'hideredirects',
-					'hideredirects',
-					$hideredirects
-				) . ' ' .
-				Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
-				"</td>
+			Html::namespaceSelector( array(
+				'selected' => $namespace,
+			), array(
+				'name' => 'namespace',
+				'id' => 'namespace',
+				'class' => 'namespaceselector',
+			) ) .
+			Xml::checkLabel(
+				$this->msg( 'allpages-hide-redirects' )->text(),
+				'hideredirects',
+				'hideredirects',
+				$this->hideRedirects
+			) . ' ' .
+			Xml::checkLabel(
+				$this->msg( 'prefixindex-strip' )->text(),
+				'stripprefix',
+				'stripprefix',
+				$this->stripPrefix
+			) . ' ' .
+			Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
+			"</td>
 			</tr>";
 		$out .= Xml::closeElement( 'table' );
 		$out .= Xml::closeElement( 'fieldset' );
 		$out .= Xml::closeElement( 'form' );
 		$out .= Xml::closeElement( 'div' );
+
 		return $out;
 	}
 
@@ -136,9 +152,8 @@ class SpecialPrefixindex extends SpecialAllpages {
 	 * @param $namespace Integer, default NS_MAIN
 	 * @param $prefix String
 	 * @param string $from list all pages from this name (default FALSE)
-	 * @param bool $hideredirects hide redirects (default FALSE)
 	 */
-	function showPrefixChunk( $namespace = NS_MAIN, $prefix, $from = null, $hideredirects = false ) {
+	protected function showPrefixChunk( $namespace = NS_MAIN, $prefix, $from = null ) {
 		global $wgContLang;
 
 		if ( $from === null ) {
@@ -169,7 +184,7 @@ class SpecialPrefixindex extends SpecialAllpages {
 				'page_title >= ' . $dbr->addQuotes( $fromKey ),
 			);
 
-			if ( $hideredirects ) {
+			if ( $this->hideRedirects ) {
 				$conds['page_is_redirect'] = 0;
 			}
 
@@ -178,8 +193,8 @@ class SpecialPrefixindex extends SpecialAllpages {
 				$conds,
 				__METHOD__,
 				array(
-					'ORDER BY'  => 'page_title',
-					'LIMIT'     => $this->maxPerPage + 1,
+					'ORDER BY' => 'page_title',
+					'LIMIT' => $this->maxPerPage + 1,
 					'USE INDEX' => 'name_title',
 				)
 			);
@@ -187,34 +202,42 @@ class SpecialPrefixindex extends SpecialAllpages {
 			### @todo FIXME: Side link to previous
 
 			$n = 0;
-			if( $res->numRows() > 0 ) {
+			if ( $res->numRows() > 0 ) {
 				$out = Xml::openElement( 'table', array( 'id' => 'mw-prefixindex-list-table' ) );
 
-				while( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+				$prefixLength = strlen( $prefix );
+				while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
 					$t = Title::makeTitle( $s->page_namespace, $s->page_title );
-					if( $t ) {
-						$link = ($s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
+					if ( $t ) {
+						$displayed = $t->getText();
+						// Try not to generate unclickable links
+						if ( $this->stripPrefix && $prefixLength !== strlen( $displayed ) ) {
+							$displayed = substr( $displayed, $prefixLength );
+						}
+						$link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
 							Linker::linkKnown(
 								$t,
-								htmlspecialchars( $t->getText() ),
+								htmlspecialchars( $displayed ),
 								$s->page_is_redirect ? array( 'class' => 'mw-redirect' ) : array()
 							) .
-							($s->page_is_redirect ? '</div>' : '' );
+							( $s->page_is_redirect ? '</div>' : '' );
 					} else {
 						$link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
 					}
-					if( $n % 3 == 0 ) {
+					if ( $n % 3 == 0 ) {
 						$out .= '<tr>';
 					}
 					$out .= "<td>$link</td>";
 					$n++;
-					if( $n % 3 == 0 ) {
+					if ( $n % 3 == 0 ) {
 						$out .= '</tr>';
 					}
 				}
-				if( ($n % 3) != 0 ) {
+
+				if ( $n % 3 != 0 ) {
 					$out .= '</tr>';
 				}
+
 				$out .= Xml::closeElement( 'table' );
 			} else {
 				$out = '';
@@ -225,37 +248,45 @@ class SpecialPrefixindex extends SpecialAllpages {
 		if ( $this->including() ) {
 			$out2 = '';
 		} else {
-			$nsForm = $this->namespacePrefixForm( $namespace, $prefix, $hideredirects );
+			$nsForm = $this->namespacePrefixForm( $namespace, $prefix );
 			$self = $this->getTitle();
 			$out2 = Xml::openElement( 'table', array( 'id' => 'mw-prefixindex-nav-table' ) ) .
 				'<tr>
 					<td>' .
-						$nsForm .
-					'</td>
-					<td id="mw-prefixindex-nav-form" class="mw-prefixindex-nav">';
+				$nsForm .
+				'</td>
+				<td id="mw-prefixindex-nav-form" class="mw-prefixindex-nav">';
 
-			if( isset( $res ) && $res && ( $n == $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+			if ( isset( $res ) && $res && ( $n == $this->maxPerPage ) &&
+				( $s = $res->fetchObject() )
+			) {
 				$query = array(
 					'from' => $s->page_title,
 					'prefix' => $prefix,
-					'hideredirects' => $hideredirects,
+					'hideredirects' => $this->hideRedirects,
 				);
 
-				if( $namespace || $prefix == '' ) {
+				if ( $namespace || $prefix == '' ) {
 					// Keep the namespace even if it's 0 for empty prefixes.
 					// This tells us we're not just a holdover from old links.
 					$query['namespace'] = $namespace;
 				}
+
 				$nextLink = Linker::linkKnown(
-						$self,
-						$this->msg( 'nextpage', str_replace( '_', ' ', $s->page_title ) )->escaped(),
-						array(),
-						$query
-					);
+					$self,
+					$this->msg( 'nextpage', str_replace( '_', ' ', $s->page_title ) )->escaped(),
+					array(),
+					$query
+				);
+
 				$out2 .= $nextLink;
 
-				$footer = "\n" . Html::element( "hr" )
-					. Html::rawElement( "div", array( "class" => "mw-prefixindex-nav" ), $nextLink );
+				$footer = "\n" . Html::element( 'hr' ) .
+					Html::rawElement(
+						'div',
+						array( 'class' => 'mw-prefixindex-nav' ),
+						$nextLink
+					);
 			}
 			$out2 .= "</td></tr>" .
 				Xml::closeElement( 'table' );
diff --git a/includes/specials/SpecialProtectedpages.php b/includes/specials/SpecialProtectedpages.php
index cdf053ec..3de6ea24 100644
--- a/includes/specials/SpecialProtectedpages.php
+++ b/includes/specials/SpecialProtectedpages.php
@@ -40,7 +40,7 @@ class SpecialProtectedpages extends SpecialPage {
 		$this->outputHeader();
 
 		// Purge expired entries on one in every 10 queries
-		if( !mt_rand( 0, 10 ) ) {
+		if ( !mt_rand( 0, 10 ) ) {
 			Title::purgeExpiredRestrictions();
 		}
 
@@ -49,19 +49,37 @@ class SpecialProtectedpages extends SpecialPage {
 		$level = $request->getVal( $this->IdLevel );
 		$sizetype = $request->getVal( 'sizetype' );
 		$size = $request->getIntOrNull( 'size' );
-		$NS = $request->getIntOrNull( 'namespace' );
+		$ns = $request->getIntOrNull( 'namespace' );
 		$indefOnly = $request->getBool( 'indefonly' ) ? 1 : 0;
 		$cascadeOnly = $request->getBool( 'cascadeonly' ) ? 1 : 0;
 
-		$pager = new ProtectedPagesPager( $this, array(), $type, $level, $NS, $sizetype, $size, $indefOnly, $cascadeOnly );
-
-		$this->getOutput()->addHTML( $this->showOptions( $NS, $type, $level, $sizetype, $size, $indefOnly, $cascadeOnly ) );
+		$pager = new ProtectedPagesPager(
+			$this,
+			array(),
+			$type,
+			$level,
+			$ns,
+			$sizetype,
+			$size,
+			$indefOnly,
+			$cascadeOnly
+		);
 
-		if( $pager->getNumRows() ) {
+		$this->getOutput()->addHTML( $this->showOptions(
+			$ns,
+			$type,
+			$level,
+			$sizetype,
+			$size,
+			$indefOnly,
+			$cascadeOnly
+		) );
+
+		if ( $pager->getNumRows() ) {
 			$this->getOutput()->addHTML(
 				$pager->getNavigationBar() .
-				'<ul>' . $pager->getBody() . '</ul>' .
-				$pager->getNavigationBar()
+					'<ul>' . $pager->getBody() . '</ul>' .
+					$pager->getNavigationBar()
 			);
 		} else {
 			$this->getOutput()->addWikiMsg( 'protectedpagesempty' );
@@ -78,26 +96,39 @@ class SpecialProtectedpages extends SpecialPage {
 
 		static $infinity = null;
 
-		if( is_null( $infinity ) ) {
+		if ( is_null( $infinity ) ) {
 			$infinity = wfGetDB( DB_SLAVE )->getInfinity();
 		}
 
 		$title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-		if( !$title ) {
-			return Html::rawElement( 'li', array(),
-				Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-					Linker::getInvalidTitleDescription( $this->getContext(), $row->page_namespace, $row->page_title ) ) ) . "\n";
+		if ( !$title ) {
+			wfProfileOut( __METHOD__ );
+
+			return Html::rawElement(
+				'li',
+				array(),
+				Html::element(
+					'span',
+					array( 'class' => 'mw-invalidtitle' ),
+					Linker::getInvalidTitleDescription(
+						$this->getContext(),
+						$row->page_namespace,
+						$row->page_title
+					)
+				)
+			) . "\n";
 		}
 
 		$link = Linker::link( $title );
 
-		$description_items = array ();
+		$description_items = array();
 
+		// Messages: restriction-level-sysop, restriction-level-autoconfirmed
 		$protType = $this->msg( 'restriction-level-' . $row->pr_level )->escaped();
 
 		$description_items[] = $protType;
 
-		if( $row->pr_cascade ) {
+		if ( $row->pr_cascade ) {
 			$description_items[] = $this->msg( 'protect-summary-cascade' )->text();
 		}
 
@@ -105,7 +136,7 @@ class SpecialProtectedpages extends SpecialPage {
 		$lang = $this->getLanguage();
 
 		$expiry = $lang->formatExpiry( $row->pr_expiry, TS_MW );
-		if( $expiry != $infinity ) {
+		if ( $expiry != $infinity ) {
 			$user = $this->getUser();
 			$description_items[] = $this->msg(
 				'protect-expiring-local',
@@ -115,12 +146,13 @@ class SpecialProtectedpages extends SpecialPage {
 			)->escaped();
 		}
 
-		if( !is_null( $size = $row->page_len ) ) {
+		if ( !is_null( $size = $row->page_len ) ) {
 			$stxt = $lang->getDirMark() . ' ' . Linker::formatRevisionSize( $size );
 		}
 
-		# Show a link to the change protection form for allowed users otherwise a link to the protection log
-		if( $this->getUser()->isAllowed( 'protect' ) ) {
+		// Show a link to the change protection form for allowed users otherwise
+		// a link to the protection log
+		if ( $this->getUser()->isAllowed( 'protect' ) ) {
 			$changeProtection = Linker::linkKnown(
 				$title,
 				$this->msg( 'protect_change' )->escaped(),
@@ -140,14 +172,17 @@ class SpecialProtectedpages extends SpecialPage {
 			);
 		}
 
-		$changeProtection = ' ' . $this->msg( 'parentheses' )->rawParams( $changeProtection )->escaped();
+		$changeProtection = ' ' . $this->msg( 'parentheses' )->rawParams( $changeProtection )
+			->escaped();
 
 		wfProfileOut( __METHOD__ );
 
 		return Html::rawElement(
 			'li',
 			array(),
-			$lang->specialList( $link . $stxt, $lang->commaList( $description_items ), false ) . $changeProtection ) . "\n";
+			$lang->specialList( $link . $stxt, $lang->commaList( $description_items ), false ) .
+				$changeProtection
+		) . "\n";
 	}
 
 	/**
@@ -160,9 +195,13 @@ class SpecialProtectedpages extends SpecialPage {
 	 * @param $cascadeOnly Boolean: only cascading protection
 	 * @return String: input form
 	 */
-	protected function showOptions( $namespace, $type = 'edit', $level, $sizetype, $size, $indefOnly, $cascadeOnly ) {
+	protected function showOptions( $namespace, $type = 'edit', $level, $sizetype,
+		$size, $indefOnly, $cascadeOnly
+	) {
 		global $wgScript;
+
 		$title = $this->getTitle();
+
 		return Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
 			Xml::openElement( 'fieldset' ) .
 			Xml::element( 'legend', array(), $this->msg( 'protectedpages' )->text() ) .
@@ -196,8 +235,8 @@ class SpecialProtectedpages extends SpecialPage {
 					'all' => '',
 					'label' => $this->msg( 'namespace' )->text()
 				), array(
-					'name'  => 'namespace',
-					'id'    => 'namespace',
+					'name' => 'namespace',
+					'id' => 'namespace',
 					'class' => 'namespaceselector',
 				)
 			)
@@ -205,31 +244,54 @@ class SpecialProtectedpages extends SpecialPage {
 	}
 
 	/**
+	 * @param bool $indefOnly
 	 * @return string Formatted HTML
 	 */
 	protected function getExpiryCheck( $indefOnly ) {
-		return
-			Xml::checkLabel( $this->msg( 'protectedpages-indef' )->text(), 'indefonly', 'indefonly', $indefOnly ) . "\n";
+		return Xml::checkLabel(
+			$this->msg( 'protectedpages-indef' )->text(),
+			'indefonly',
+			'indefonly',
+			$indefOnly
+		) . "\n";
 	}
 
 	/**
+	 * @param bool $cascadeOnly
 	 * @return string Formatted HTML
 	 */
 	protected function getCascadeCheck( $cascadeOnly ) {
-		return
-			Xml::checkLabel( $this->msg( 'protectedpages-cascade' )->text(), 'cascadeonly', 'cascadeonly', $cascadeOnly ) . "\n";
+		return Xml::checkLabel(
+			$this->msg( 'protectedpages-cascade' )->text(),
+			'cascadeonly',
+			'cascadeonly',
+			$cascadeOnly
+		) . "\n";
 	}
 
 	/**
+	 * @param string $sizetype "min" or "max"
+	 * @param mixed $size
 	 * @return string Formatted HTML
 	 */
 	protected function getSizeLimit( $sizetype, $size ) {
 		$max = $sizetype === 'max';
 
-		return
-			Xml::radioLabel( $this->msg( 'minimum-size' )->text(), 'sizetype', 'min', 'wpmin', !$max ) .
+		return Xml::radioLabel(
+			$this->msg( 'minimum-size' )->text(),
+			'sizetype',
+			'min',
+			'wpmin',
+			!$max
+		) .
 			'&#160;' .
-			Xml::radioLabel( $this->msg( 'maximum-size' )->text(), 'sizetype', 'max', 'wpmax', $max ) .
+			Xml::radioLabel(
+				$this->msg( 'maximum-size' )->text(),
+				'sizetype',
+				'max',
+				'wpmax',
+				$max
+			) .
 			'&#160;' .
 			Xml::input( 'size', 9, $size, array( 'id' => 'wpsize' ) ) .
 			'&#160;' .
@@ -246,14 +308,15 @@ class SpecialProtectedpages extends SpecialPage {
 		$options = array();
 
 		// First pass to load the log names
-		foreach( Title::getFilteredRestrictionTypes( true ) as $type ) {
+		foreach ( Title::getFilteredRestrictionTypes( true ) as $type ) {
+			// Messages: restriction-edit, restriction-move, restriction-create, restriction-upload
 			$text = $this->msg( "restriction-$type" )->text();
 			$m[$text] = $type;
 		}
 
 		// Third pass generates sorted XHTML content
-		foreach( $m as $text => $type ) {
-			$selected = ($type == $pr_type );
+		foreach ( $m as $text => $type ) {
+			$selected = ( $type == $pr_type );
 			$options[] = Xml::option( $text, $type, $selected ) . "\n";
 		}
 
@@ -272,21 +335,22 @@ class SpecialProtectedpages extends SpecialPage {
 	protected function getLevelMenu( $pr_level ) {
 		global $wgRestrictionLevels;
 
-		$m = array( $this->msg( 'restriction-level-all' )->text() => 0 ); // Temporary array
+		// Temporary array
+		$m = array( $this->msg( 'restriction-level-all' )->text() => 0 );
 		$options = array();
 
 		// First pass to load the log names
-		foreach( $wgRestrictionLevels as $type ) {
+		foreach ( $wgRestrictionLevels as $type ) {
 			// Messages used can be 'restriction-level-sysop' and 'restriction-level-autoconfirmed'
-			if( $type != '' && $type != '*' ) {
+			if ( $type != '' && $type != '*' ) {
 				$text = $this->msg( "restriction-level-$type" )->text();
 				$m[$text] = $type;
 			}
 		}
 
 		// Third pass generates sorted XHTML content
-		foreach( $m as $text => $type ) {
-			$selected = ($type == $pr_level );
+		foreach ( $m as $text => $type ) {
+			$selected = ( $type == $pr_level );
 			$options[] = Xml::option( $text, $type, $selected );
 		}
 
@@ -310,9 +374,9 @@ class ProtectedPagesPager extends AlphabeticPager {
 	public $mForm, $mConds;
 	private $type, $level, $namespace, $sizetype, $size, $indefonly;
 
-	function __construct( $form, $conds = array(), $type, $level, $namespace, $sizetype = '', $size = 0,
-		$indefonly = false, $cascadeonly = false )
-	{
+	function __construct( $form, $conds = array(), $type, $level, $namespace,
+		$sizetype = '', $size = 0, $indefonly = false, $cascadeonly = false
+	) {
 		$this->mForm = $form;
 		$this->mConds = $conds;
 		$this->type = ( $type ) ? $type : 'edit';
@@ -332,6 +396,7 @@ class ProtectedPagesPager extends AlphabeticPager {
 			$lb->add( $row->page_namespace, $row->page_title );
 		}
 		$lb->execute();
+
 		return '';
 	}
 
@@ -342,27 +407,31 @@ class ProtectedPagesPager extends AlphabeticPager {
 	function getQueryInfo() {
 		$conds = $this->mConds;
 		$conds[] = '(pr_expiry>' . $this->mDb->addQuotes( $this->mDb->timestamp() ) .
-				'OR pr_expiry IS NULL)';
+			'OR pr_expiry IS NULL)';
 		$conds[] = 'page_id=pr_page';
 		$conds[] = 'pr_type=' . $this->mDb->addQuotes( $this->type );
 
-		if( $this->sizetype == 'min' ) {
+		if ( $this->sizetype == 'min' ) {
 			$conds[] = 'page_len>=' . $this->size;
-		} elseif( $this->sizetype == 'max' ) {
+		} elseif ( $this->sizetype == 'max' ) {
 			$conds[] = 'page_len<=' . $this->size;
 		}
 
-		if( $this->indefonly ) {
-			$conds[] = "pr_expiry = {$this->mDb->addQuotes( $this->mDb->getInfinity() )} OR pr_expiry IS NULL";
+		if ( $this->indefonly ) {
+			$infinity = $this->mDb->addQuotes( $this->mDb->getInfinity() );
+			$conds[] = "pr_expiry = $infinity OR pr_expiry IS NULL";
 		}
-		if( $this->cascadeonly ) {
+		if ( $this->cascadeonly ) {
 			$conds[] = 'pr_cascade = 1';
 		}
 
-		if( $this->level )
+		if ( $this->level ) {
 			$conds[] = 'pr_level=' . $this->mDb->addQuotes( $this->level );
-		if( !is_null( $this->namespace ) )
+		}
+		if ( !is_null( $this->namespace ) ) {
 			$conds[] = 'page_namespace=' . $this->mDb->addQuotes( $this->namespace );
+		}
+
 		return array(
 			'tables' => array( 'page_restrictions', 'page' ),
 			'fields' => array( 'pr_id', 'page_namespace', 'page_title', 'page_len',
diff --git a/includes/specials/SpecialProtectedtitles.php b/includes/specials/SpecialProtectedtitles.php
index 0cba5ebd..078e7b12 100644
--- a/includes/specials/SpecialProtectedtitles.php
+++ b/includes/specials/SpecialProtectedtitles.php
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class SpecialProtectedtitles extends SpecialPage {
-
 	protected $IdLevel = 'level';
 	protected $IdType = 'type';
 
@@ -58,8 +57,8 @@ class SpecialProtectedtitles extends SpecialPage {
 		if ( $pager->getNumRows() ) {
 			$this->getOutput()->addHTML(
 				$pager->getNavigationBar() .
-				'<ul>' . $pager->getBody() . '</ul>' .
-				$pager->getNavigationBar()
+					'<ul>' . $pager->getBody() . '</ul>' .
+					$pager->getNavigationBar()
 			);
 		} else {
 			$this->getOutput()->addWikiMsg( 'protectedtitlesempty' );
@@ -69,6 +68,7 @@ class SpecialProtectedtitles extends SpecialPage {
 	/**
 	 * Callback function to output a restriction
 	 *
+	 * @param object $row Database row
 	 * @return string
 	 */
 	function formatRow( $row ) {
@@ -76,28 +76,40 @@ class SpecialProtectedtitles extends SpecialPage {
 
 		static $infinity = null;
 
-		if( is_null( $infinity ) ) {
+		if ( is_null( $infinity ) ) {
 			$infinity = wfGetDB( DB_SLAVE )->getInfinity();
 		}
 
 		$title = Title::makeTitleSafe( $row->pt_namespace, $row->pt_title );
-		if( !$title ) {
-			return Html::rawElement( 'li', array(),
-				Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-					Linker::getInvalidTitleDescription( $this->getContext(), $row->pt_namespace, $row->pt_title ) ) ) . "\n";
+		if ( !$title ) {
+			wfProfileOut( __METHOD__ );
+
+			return Html::rawElement(
+				'li',
+				array(),
+				Html::element(
+					'span',
+					array( 'class' => 'mw-invalidtitle' ),
+					Linker::getInvalidTitleDescription(
+						$this->getContext(),
+						$row->pt_namespace,
+						$row->pt_title
+					)
+				)
+			) . "\n";
 		}
 
 		$link = Linker::link( $title );
-
-		$description_items = array ();
-
+		$description_items = array();
+		// Messages: restriction-level-sysop, restriction-level-autoconfirmed
 		$protType = $this->msg( 'restriction-level-' . $row->pt_create_perm )->escaped();
-
 		$description_items[] = $protType;
-
 		$lang = $this->getLanguage();
-		$expiry = strlen( $row->pt_expiry ) ? $lang->formatExpiry( $row->pt_expiry, TS_MW ) : $infinity;
-		if( $expiry != $infinity ) {
+		$expiry = strlen( $row->pt_expiry ) ?
+			$lang->formatExpiry( $row->pt_expiry, TS_MW ) :
+			$infinity;
+
+		if ( $expiry != $infinity ) {
 			$user = $this->getUser();
 			$description_items[] = $this->msg(
 				'protect-expiring-local',
@@ -109,6 +121,7 @@ class SpecialProtectedtitles extends SpecialPage {
 
 		wfProfileOut( __METHOD__ );
 
+		// @todo i18n: This should use a comma separator instead of a hard coded comma, right?
 		return '<li>' . $lang->specialList( $link, implode( $description_items, ', ' ) ) . "</li>\n";
 	}
 
@@ -124,6 +137,7 @@ class SpecialProtectedtitles extends SpecialPage {
 		$action = htmlspecialchars( $wgScript );
 		$title = $this->getTitle();
 		$special = htmlspecialchars( $title->getPrefixedDBkey() );
+
 		return "<form action=\"$action\" method=\"get\">\n" .
 			'<fieldset>' .
 			Xml::element( 'legend', array(), $this->msg( 'protectedtitles' )->text() ) .
@@ -148,42 +162,45 @@ class SpecialProtectedtitles extends SpecialPage {
 				'all' => '',
 				'label' => $this->msg( 'namespace' )->text()
 			), array(
-				'name'  => 'namespace',
-				'id'    => 'namespace',
+				'name' => 'namespace',
+				'id' => 'namespace',
 				'class' => 'namespaceselector',
 			)
 		);
 	}
 
 	/**
+	 * @param string $pr_level Determines which option is selected as default
 	 * @return string Formatted HTML
 	 * @private
 	 */
 	function getLevelMenu( $pr_level ) {
 		global $wgRestrictionLevels;
 
-		$m = array( $this->msg( 'restriction-level-all' )->text() => 0 ); // Temporary array
+		// Temporary array
+		$m = array( $this->msg( 'restriction-level-all' )->text() => 0 );
 		$options = array();
 
 		// First pass to load the log names
-		foreach( $wgRestrictionLevels as $type ) {
+		foreach ( $wgRestrictionLevels as $type ) {
 			if ( $type != '' && $type != '*' ) {
+				// Messages: restriction-level-sysop, restriction-level-autoconfirmed
 				$text = $this->msg( "restriction-level-$type" )->text();
 				$m[$text] = $type;
 			}
 		}
+
 		// Is there only one level (aside from "all")?
-		if( count( $m ) <= 2 ) {
+		if ( count( $m ) <= 2 ) {
 			return '';
 		}
 		// Third pass generates sorted XHTML content
-		foreach( $m as $text => $type ) {
-			$selected = ($type == $pr_level );
+		foreach ( $m as $text => $type ) {
+			$selected = ( $type == $pr_level );
 			$options[] = Xml::option( $text, $type, $selected );
 		}
 
-		return
-			Xml::label( $this->msg( 'restriction-level' )->text(), $this->IdLevel ) . '&#160;' .
+		return Xml::label( $this->msg( 'restriction-level' )->text(), $this->IdLevel ) . '&#160;' .
 			Xml::tags( 'select',
 				array( 'id' => $this->IdLevel, 'name' => $this->IdLevel ),
 				implode( "\n", $options ) );
@@ -201,12 +218,14 @@ class SpecialProtectedtitles extends SpecialPage {
 class ProtectedTitlesPager extends AlphabeticPager {
 	public $mForm, $mConds;
 
-	function __construct( $form, $conds = array(), $type, $level, $namespace, $sizetype = '', $size = 0 ) {
+	function __construct( $form, $conds = array(), $type, $level, $namespace,
+		$sizetype = '', $size = 0
+	) {
 		$this->mForm = $form;
 		$this->mConds = $conds;
 		$this->level = $level;
 		$this->namespace = $namespace;
-		$this->size = intval($size);
+		$this->size = intval( $size );
 		parent::__construct( $form->getContext() );
 	}
 
@@ -222,6 +241,7 @@ class ProtectedTitlesPager extends AlphabeticPager {
 
 		$lb->execute();
 		wfProfileOut( __METHOD__ );
+
 		return '';
 	}
 
@@ -242,10 +262,14 @@ class ProtectedTitlesPager extends AlphabeticPager {
 	function getQueryInfo() {
 		$conds = $this->mConds;
 		$conds[] = 'pt_expiry>' . $this->mDb->addQuotes( $this->mDb->timestamp() );
-		if( $this->level )
+		if ( $this->level ) {
 			$conds['pt_create_perm'] = $this->level;
-		if( !is_null( $this->namespace ) )
+		}
+
+		if ( !is_null( $this->namespace ) ) {
 			$conds[] = 'pt_namespace=' . $this->mDb->addQuotes( $this->namespace );
+		}
+
 		return array(
 			'tables' => 'protected_titles',
 			'fields' => array( 'pt_namespace', 'pt_title', 'pt_create_perm',
diff --git a/includes/specials/SpecialRandomInCategory.php b/includes/specials/SpecialRandomInCategory.php
new file mode 100644
index 00000000..0e022bfa
--- /dev/null
+++ b/includes/specials/SpecialRandomInCategory.php
@@ -0,0 +1,291 @@
+<?php
+/**
+ * Implements Special:RandomInCategory
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ * @author Brian Wolff
+ */
+
+/**
+ * Special page to direct the user to a random page
+ *
+ * @note The method used here is rather biased. It is assumed that
+ * the use of this page will be people wanting to get a random page
+ * out of a maintenance category, to fix it up. The method used by
+ * this page should return different pages in an unpredictable fashion
+ * which is hoped to be sufficient, even if some pages are selected
+ * more often than others.
+ *
+ * A more unbiased method could be achieved by adding a cl_random field
+ * to the categorylinks table.
+ *
+ * The method used here is as follows:
+ *  * Find the smallest and largest timestamp in the category
+ *  * Pick a random timestamp in between
+ *  * Pick an offset between 0 and 30
+ *  * Get the offset'ed page that is newer than the timestamp selected
+ * The offset is meant to counter the fact the timestamps aren't usually
+ * uniformly distributed, so if things are very non-uniform at least we
+ * won't have the same page selected 99% of the time.
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialRandomInCategory extends SpecialPage {
+	protected $extra = array(); // Extra SQL statements
+	protected $category = false; // Title object of category
+	protected $maxOffset = 30; // Max amount to fudge randomness by.
+	private $maxTimestamp = null;
+	private $minTimestamp = null;
+
+	public function __construct( $name = 'RandomInCategory' ) {
+		parent::__construct( $name );
+	}
+
+	/**
+	 * Set which category to use.
+	 * @param Title $cat
+	 */
+	public function setCategory( Title $cat ) {
+		$this->category = $cat;
+		$this->maxTimestamp = null;
+		$this->minTimestamp = null;
+	}
+
+	public function execute( $par ) {
+		global $wgScript;
+
+		$cat = false;
+
+		$categoryStr = $this->getRequest()->getText( 'category', $par );
+
+		if ( $categoryStr ) {
+			$cat = Title::newFromText( $categoryStr, NS_CATEGORY );
+		}
+
+		if ( $cat && $cat->getNamespace() !== NS_CATEGORY ) {
+			// Someone searching for something like "Wikipedia:Foo"
+			$cat = Title::makeTitleSafe( NS_CATEGORY, $categoryStr );
+		}
+
+		if ( $cat ) {
+			$this->setCategory( $cat );
+		}
+
+
+		if ( !$this->category && $categoryStr ) {
+			$this->setHeaders();
+			$this->getOutput()->addWikiMsg( 'randomincategory-invalidcategory',
+				wfEscapeWikiText( $categoryStr ) );
+
+			return;
+		} elseif ( !$this->category ) {
+			$this->setHeaders();
+			$input = Html::input( 'category' );
+			$submitText = $this->msg( 'randomincategory-selectcategory-submit' )->text();
+			$submit = Html::input( '', $submitText, 'submit' );
+
+			$msg = $this->msg( 'randomincategory-selectcategory' );
+			$form = Html::rawElement( 'form', array( 'action' => $wgScript ),
+				Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+				$msg->rawParams( $input, $submit )->parse()
+			);
+			$this->getOutput()->addHtml( $form );
+
+			return;
+		}
+
+		$title = $this->getRandomTitle();
+
+		if ( is_null( $title ) ) {
+			$this->setHeaders();
+			$this->getOutput()->addWikiMsg( 'randomincategory-nopages',
+				$this->category->getText() );
+
+			return;
+		}
+
+		$query = $this->getRequest()->getValues();
+		unset( $query['title'] );
+		unset( $query['category'] );
+		$this->getOutput()->redirect( $title->getFullURL( $query ) );
+	}
+
+	/**
+	 * Choose a random title.
+	 * @return Title object (or null if nothing to choose from)
+	 */
+	public function getRandomTitle() {
+		// Convert to float, since we do math with the random number.
+		$rand = (float)wfRandom();
+		$title = null;
+
+		// Given that timestamps are rather unevenly distributed, we also
+		// use an offset between 0 and 30 to make any biases less noticeable.
+		$offset = mt_rand( 0, $this->maxOffset );
+
+		if ( mt_rand( 0, 1 ) ) {
+			$up = true;
+		} else {
+			$up = false;
+		}
+
+		$row = $this->selectRandomPageFromDB( $rand, $offset, $up );
+
+		// Try again without the timestamp offset (wrap around the end)
+		if ( !$row ) {
+			$row = $this->selectRandomPageFromDB( false, $offset, $up );
+		}
+
+		// Maybe the category is really small and offset too high
+		if ( !$row ) {
+			$row = $this->selectRandomPageFromDB( $rand, 0, $up );
+		}
+
+		// Just get the first entry.
+		if ( !$row ) {
+			$row = $this->selectRandomPageFromDB( false, 0, true );
+		}
+
+		if ( $row ) {
+			return Title::makeTitle( $row->page_namespace, $row->page_title );
+		}
+
+		return null;
+	}
+
+	/**
+	 * @param float $rand Random number between 0 and 1
+	 * @param int $offset Extra offset to fudge randomness
+	 * @param bool $up True to get the result above the random number, false for below
+	 *
+	 * @note The $up parameter is supposed to counteract what would happen if there
+	 *   was a large gap in the distribution of cl_timestamp values. This way instead
+	 *   of things to the right of the gap being favoured, both sides of the gap
+	 *   are favoured.
+	 * @return Array Query information.
+	 */
+	protected function getQueryInfo( $rand, $offset, $up ) {
+		$op = $up ? '>=' : '<=';
+		$dir = $up ? 'ASC' : 'DESC';
+		if ( !$this->category instanceof Title ) {
+			throw new MWException( 'No category set' );
+		}
+		$qi = array(
+			'tables' => array( 'categorylinks', 'page' ),
+			'fields' => array( 'page_title', 'page_namespace' ),
+			'conds' => array_merge( array(
+				'cl_to' => $this->category->getDBKey(),
+			), $this->extra ),
+			'options' => array(
+				'ORDER BY' => 'cl_timestamp ' . $dir,
+				'LIMIT' => 1,
+				'OFFSET' => $offset
+			),
+			'join_conds' => array(
+				'page' => array( 'INNER JOIN', 'cl_from = page_id' )
+			)
+		);
+
+		$dbr = wfGetDB( DB_SLAVE );
+		$minClTime = $this->getTimestampOffset( $rand );
+		if ( $minClTime ) {
+			$qi['conds'][] = 'cl_timestamp ' . $op . ' ' .
+				$dbr->addQuotes( $dbr->timestamp( $minClTime ) );
+		}
+		return $qi;
+	}
+
+	/**
+	 * @param float $rand Random number between 0 and 1
+	 *
+	 * @return int|bool A random (unix) timestamp from the range of the category or false on failure
+	 */
+	protected function getTimestampOffset( $rand ) {
+		if ( $rand === false ) {
+			return false;
+		}
+		if ( !$this->minTimestamp || !$this->maxTimestamp ) {
+			try {
+				list( $this->minTimestamp, $this->maxTimestamp ) = $this->getMinAndMaxForCat( $this->category );
+			} catch ( MWException $e ) {
+				// Possibly no entries in category.
+				return false;
+			}
+		}
+
+		$ts = ( $this->maxTimestamp - $this->minTimestamp ) * $rand + $this->minTimestamp;
+		return intval( $ts );
+	}
+
+	/**
+	 * Get the lowest and highest timestamp for a category.
+	 *
+	 * @param Title $category
+	 * @return Array The lowest and highest timestamp
+	 * @throws MWException if category has no entries.
+	 */
+	protected function getMinAndMaxForCat( Title $category ) {
+		$dbr = wfGetDB( DB_SLAVE );
+		$res = $dbr->selectRow(
+			'categorylinks',
+			array(
+				'low' => 'MIN( cl_timestamp )',
+				'high' => 'MAX( cl_timestamp )'
+			),
+			array(
+				'cl_to' => $this->category->getDBKey(),
+			),
+			__METHOD__,
+			array(
+				'LIMIT' => 1
+			)
+		);
+		if ( !$res ) {
+			throw new MWException( 'No entries in category' );
+		}
+		return array( wfTimestamp( TS_UNIX, $res->low ), wfTimestamp( TS_UNIX, $res->high ) );
+	}
+
+	/**
+	 * @param float $rand A random number that is converted to a random timestamp
+	 * @param int $offset A small offset to make the result seem more "random"
+	 * @param bool $up Get the result above the random value
+	 * @param String $fname The name of the calling method
+	 * @return Array Info for the title selected.
+	 */
+	private function selectRandomPageFromDB( $rand, $offset, $up, $fname = __METHOD__ ) {
+		$dbr = wfGetDB( DB_SLAVE );
+
+		$query = $this->getQueryInfo( $rand, $offset, $up );
+		$res = $dbr->select(
+			$query['tables'],
+			$query['fields'],
+			$query['conds'],
+			$fname,
+			$query['options'],
+			$query['join_conds']
+		);
+
+		return $res->fetchObject();
+	}
+
+	protected function getGroupName() {
+		return 'redirects';
+	}
+}
diff --git a/includes/specials/SpecialRandompage.php b/includes/specials/SpecialRandompage.php
index b59f8349..c94d2b35 100644
--- a/includes/specials/SpecialRandompage.php
+++ b/includes/specials/SpecialRandompage.php
@@ -41,8 +41,8 @@ class RandomPage extends SpecialPage {
 		return $this->namespaces;
 	}
 
-	public function setNamespace ( $ns ) {
-		if( !$ns || $ns < NS_MAIN ) {
+	public function setNamespace( $ns ) {
+		if ( !$ns || $ns < NS_MAIN ) {
 			$ns = NS_MAIN;
 		}
 		$this->namespaces = array( $ns );
@@ -62,17 +62,19 @@ class RandomPage extends SpecialPage {
 
 		$title = $this->getRandomTitle();
 
-		if( is_null( $title ) ) {
+		if ( is_null( $title ) ) {
 			$this->setHeaders();
+			// Message: randompage-nopages, randomredirect-nopages
 			$this->getOutput()->addWikiMsg( strtolower( $this->getName() ) . '-nopages',
 				$this->getNsList(), count( $this->namespaces ) );
+
 			return;
 		}
 
 		$redirectParam = $this->isRedirect() ? array( 'redirect' => 'no' ) : array();
 		$query = array_merge( $this->getRequest()->getValues(), $redirectParam );
 		unset( $query['title'] );
-		$this->getOutput()->redirect( $title->getFullUrl( $query ) );
+		$this->getOutput()->redirect( $title->getFullURL( $query ) );
 	}
 
 	/**
@@ -83,13 +85,14 @@ class RandomPage extends SpecialPage {
 	private function getNsList() {
 		global $wgContLang;
 		$nsNames = array();
-		foreach( $this->namespaces as $n ) {
-			if( $n === NS_MAIN ) {
+		foreach ( $this->namespaces as $n ) {
+			if ( $n === NS_MAIN ) {
 				$nsNames[] = $this->msg( 'blanknamespace' )->plain();
 			} else {
 				$nsNames[] = $wgContLang->getNsText( $n );
 			}
 		}
+
 		return $wgContLang->commaList( $nsNames );
 	}
 
@@ -100,10 +103,14 @@ class RandomPage extends SpecialPage {
 	public function getRandomTitle() {
 		$randstr = wfRandom();
 		$title = null;
-		if ( !wfRunHooks( 'SpecialRandomGetRandomTitle', array( &$randstr, &$this->isRedir, &$this->namespaces,
-			&$this->extra, &$title ) ) ) {
+
+		if ( !wfRunHooks(
+			'SpecialRandomGetRandomTitle',
+			array( &$randstr, &$this->isRedir, &$this->namespaces, &$this->extra, &$title )
+		) ) {
 			return $title;
 		}
+
 		$row = $this->selectRandomPageFromDB( $randstr );
 
 		/* If we picked a value that was higher than any in
@@ -113,15 +120,15 @@ class RandomPage extends SpecialPage {
 		 * any more bias than what the page_random scheme
 		 * causes anyway.  Trust me, I'm a mathematician. :)
 		 */
-		if( !$row ) {
+		if ( !$row ) {
 			$row = $this->selectRandomPageFromDB( "0" );
 		}
 
-		if( $row ) {
+		if ( $row ) {
 			return Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-		} else {
-			return null;
 		}
+
+		return null;
 	}
 
 	protected function getQueryInfo( $randstr ) {
diff --git a/includes/specials/SpecialRandomredirect.php b/includes/specials/SpecialRandomredirect.php
index 51783a2f..7c36a28a 100644
--- a/includes/specials/SpecialRandomredirect.php
+++ b/includes/specials/SpecialRandomredirect.php
@@ -32,5 +32,4 @@ class SpecialRandomredirect extends RandomPage {
 		parent::__construct( 'Randomredirect' );
 		$this->isRedir = true;
 	}
-
 }
diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php
index 008678f7..a42a2171 100644
--- a/includes/specials/SpecialRecentchanges.php
+++ b/includes/specials/SpecialRecentchanges.php
@@ -41,16 +41,17 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 	 */
 	public function getDefaultOptions() {
 		$opts = new FormOptions();
+		$user = $this->getUser();
 
-		$opts->add( 'days', $this->getUser()->getIntOption( 'rcdays' ) );
-		$opts->add( 'limit', $this->getUser()->getIntOption( 'rclimit' ) );
+		$opts->add( 'days', $user->getIntOption( 'rcdays' ) );
+		$opts->add( 'limit', $user->getIntOption( 'rclimit' ) );
 		$opts->add( 'from', '' );
 
-		$opts->add( 'hideminor', $this->getUser()->getBoolOption( 'hideminor' ) );
-		$opts->add( 'hidebots', true  );
+		$opts->add( 'hideminor', $user->getBoolOption( 'hideminor' ) );
+		$opts->add( 'hidebots', true );
 		$opts->add( 'hideanons', false );
 		$opts->add( 'hideliu', false );
-		$opts->add( 'hidepatrolled', $this->getUser()->getBoolOption( 'hidepatrolled' ) );
+		$opts->add( 'hidepatrolled', $user->getBoolOption( 'hidepatrolled' ) );
 		$opts->add( 'hidemyself', false );
 
 		$opts->add( 'namespace', '', FormOptions::INTNULL );
@@ -60,44 +61,47 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		$opts->add( 'categories', '' );
 		$opts->add( 'categories_any', false );
 		$opts->add( 'tagfilter', '' );
+
 		return $opts;
 	}
 
 	/**
 	 * Create a FormOptions object with options as specified by the user
 	 *
-	 * @param $parameters array
+	 * @param array $parameters
 	 *
 	 * @return FormOptions
 	 */
 	public function setup( $parameters ) {
 		$opts = $this->getDefaultOptions();
 
-		foreach( $this->getCustomFilters() as $key => $params ) {
+		foreach ( $this->getCustomFilters() as $key => $params ) {
 			$opts->add( $key, $params['default'] );
 		}
 
 		$opts->fetchValuesFromRequest( $this->getRequest() );
 
 		// Give precedence to subpage syntax
-		if( $parameters !== null ) {
+		if ( $parameters !== null ) {
 			$this->parseParameters( $parameters, $opts );
 		}
 
 		$opts->validateIntBounds( 'limit', 0, 5000 );
+
 		return $opts;
 	}
 
 	/**
 	 * Get custom show/hide filters
 	 *
-	 * @return Array Map of filter URL param names to properties (msg/default)
+	 * @return array Map of filter URL param names to properties (msg/default)
 	 */
 	protected function getCustomFilters() {
 		if ( $this->customFilters === null ) {
 			$this->customFilters = array();
 			wfRunHooks( 'SpecialRecentChangesFilters', array( $this, &$this->customFilters ) );
 		}
+
 		return $this->customFilters;
 	}
 
@@ -111,6 +115,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		$opts = $this->getDefaultOptions();
 		$opts->fetchValuesFromRequest( $this->getRequest() );
 		$opts->validateIntBounds( 'limit', 0, $wgFeedLimit );
+
 		return $opts;
 	}
 
@@ -126,13 +131,14 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 			}
 			$this->rcOptions = $isFeed ? $this->feedSetup() : $this->setup( $this->rcSubpage );
 		}
+
 		return $this->rcOptions;
 	}
 
 	/**
 	 * Main execution point
 	 *
-	 * @param $subpage String
+	 * @param string $subpage
 	 */
 	public function execute( $subpage ) {
 		$this->rcSubpage = $subpage;
@@ -142,36 +148,38 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		$this->getOutput()->setSquidMaxage( 10 );
 		# Check if the client has a cached version
 		$lastmod = $this->checkLastModified( $feedFormat );
-		if( $lastmod === false ) {
+		if ( $lastmod === false ) {
 			return;
 		}
 
 		$opts = $this->getOptions();
 		$this->setHeaders();
 		$this->outputHeader();
-		$this->addRecentChangesJS();
+		$this->addModules();
 
 		// Fetch results, prepare a batch link existence check query
 		$conds = $this->buildMainQueryConds( $opts );
 		$rows = $this->doMainQuery( $conds, $opts );
-		if( $rows === false ) {
-			if( !$this->including() ) {
+		if ( $rows === false ) {
+			if ( !$this->including() ) {
 				$this->doHeader( $opts );
 			}
+
 			return;
 		}
 
-		if( !$feedFormat ) {
+		if ( !$feedFormat ) {
 			$batch = new LinkBatch;
-			foreach( $rows as $row ) {
+			foreach ( $rows as $row ) {
 				$batch->add( NS_USER, $row->rc_user_text );
 				$batch->add( NS_USER_TALK, $row->rc_user_text );
 				$batch->add( $row->rc_namespace, $row->rc_title );
 			}
 			$batch->execute();
 		}
-		if( $feedFormat ) {
+		if ( $feedFormat ) {
 			list( $changesFeed, $formatter ) = $this->getFeedObject( $feedFormat );
+			/** @var ChangesFeed $changesFeed */
 			$changesFeed->execute( $formatter, $rows, $lastmod, $opts );
 		} else {
 			$this->webOutput( $rows, $opts );
@@ -183,7 +191,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 	/**
 	 * Return an array with a ChangesFeed object and ChannelFeed object
 	 *
-	 * @return Array
+	 * @param string $feedFormat Feed's format (either 'rss' or 'atom')
+	 * @return array
 	 */
 	public function getFeedObject( $feedFormat ) {
 		$changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
@@ -192,6 +201,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 			$this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
 			$this->getTitle()->getFullURL()
 		);
+
 		return array( $changesFeed, $formatter );
 	}
 
@@ -199,49 +209,49 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 	 * Process $par and put options found if $opts
 	 * Mainly used when including the page
 	 *
-	 * @param $par String
-	 * @param $opts FormOptions
+	 * @param string $par
+	 * @param FormOptions $opts
 	 */
 	public function parseParameters( $par, FormOptions $opts ) {
 		$bits = preg_split( '/\s*,\s*/', trim( $par ) );
-		foreach( $bits as $bit ) {
-			if( 'hidebots' === $bit ) {
+		foreach ( $bits as $bit ) {
+			if ( 'hidebots' === $bit ) {
 				$opts['hidebots'] = true;
 			}
-			if( 'bots' === $bit ) {
+			if ( 'bots' === $bit ) {
 				$opts['hidebots'] = false;
 			}
-			if( 'hideminor' === $bit ) {
+			if ( 'hideminor' === $bit ) {
 				$opts['hideminor'] = true;
 			}
-			if( 'minor' === $bit ) {
+			if ( 'minor' === $bit ) {
 				$opts['hideminor'] = false;
 			}
-			if( 'hideliu' === $bit ) {
+			if ( 'hideliu' === $bit ) {
 				$opts['hideliu'] = true;
 			}
-			if( 'hidepatrolled' === $bit ) {
+			if ( 'hidepatrolled' === $bit ) {
 				$opts['hidepatrolled'] = true;
 			}
-			if( 'hideanons' === $bit ) {
+			if ( 'hideanons' === $bit ) {
 				$opts['hideanons'] = true;
 			}
-			if( 'hidemyself' === $bit ) {
+			if ( 'hidemyself' === $bit ) {
 				$opts['hidemyself'] = true;
 			}
 
-			if( is_numeric( $bit ) ) {
+			if ( is_numeric( $bit ) ) {
 				$opts['limit'] = $bit;
 			}
 
 			$m = array();
-			if( preg_match( '/^limit=(\d+)$/', $bit, $m ) ) {
+			if ( preg_match( '/^limit=(\d+)$/', $bit, $m ) ) {
 				$opts['limit'] = $m[1];
 			}
-			if( preg_match( '/^days=(\d+)$/', $bit, $m ) ) {
+			if ( preg_match( '/^days=(\d+)$/', $bit, $m ) ) {
 				$opts['days'] = $m[1];
 			}
-			if( preg_match( '/^namespace=(\d+)$/', $bit, $m ) ) {
+			if ( preg_match( '/^namespace=(\d+)$/', $bit, $m ) ) {
 				$opts['namespace'] = $m[1];
 			}
 		}
@@ -252,25 +262,26 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 	 * Don't use this if we are using the patrol feature, patrol changes don't
 	 * update the timestamp
 	 *
-	 * @param $feedFormat String
-	 * @return String or false
+	 * @param string $feedFormat
+	 * @return string|bool
 	 */
 	public function checkLastModified( $feedFormat ) {
 		$dbr = wfGetDB( DB_SLAVE );
 		$lastmod = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', false, __METHOD__ );
-		if( $feedFormat || !$this->getUser()->useRCPatrol() ) {
-			if( $lastmod && $this->getOutput()->checkLastModified( $lastmod ) ) {
+		if ( $feedFormat || !$this->getUser()->useRCPatrol() ) {
+			if ( $lastmod && $this->getOutput()->checkLastModified( $lastmod ) ) {
 				# Client cache fresh and headers sent, nothing more to do.
 				return false;
 			}
 		}
+
 		return $lastmod;
 	}
 
 	/**
 	 * Return an array of conditions depending of options set in $opts
 	 *
-	 * @param $opts FormOptions
+	 * @param FormOptions $opts
 	 * @return array
 	 */
 	public function buildMainQueryConds( FormOptions $opts ) {
@@ -280,9 +291,9 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		# It makes no sense to hide both anons and logged-in users
 		# Where this occurs, force anons to be shown
 		$forcebot = false;
-		if( $opts['hideanons'] && $opts['hideliu'] ) {
+		if ( $opts['hideanons'] && $opts['hideliu'] ) {
 			# Check if the user wants to show bots only
-			if( $opts['hidebots'] ) {
+			if ( $opts['hidebots'] ) {
 				$opts['hideanons'] = false;
 			} else {
 				$forcebot = true;
@@ -292,11 +303,11 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
 		// Calculate cutoff
 		$cutoff_unixtime = time() - ( $opts['days'] * 86400 );
-		$cutoff_unixtime = $cutoff_unixtime - ($cutoff_unixtime % 86400);
+		$cutoff_unixtime = $cutoff_unixtime - ( $cutoff_unixtime % 86400 );
 		$cutoff = $dbr->timestamp( $cutoff_unixtime );
 
 		$fromValid = preg_match( '/^[0-9]{14}$/', $opts['from'] );
-		if( $fromValid && $opts['from'] > wfTimestamp( TS_MW, $cutoff ) ) {
+		if ( $fromValid && $opts['from'] > wfTimestamp( TS_MW, $cutoff ) ) {
 			$cutoff = $dbr->timestamp( $opts['from'] );
 		} else {
 			$opts->reset( 'from' );
@@ -308,27 +319,27 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		$hideLoggedInUsers = $opts['hideliu'] && !$forcebot;
 		$hideAnonymousUsers = $opts['hideanons'] && !$forcebot;
 
-		if( $opts['hideminor'] ) {
+		if ( $opts['hideminor'] ) {
 			$conds['rc_minor'] = 0;
 		}
-		if( $opts['hidebots'] ) {
+		if ( $opts['hidebots'] ) {
 			$conds['rc_bot'] = 0;
 		}
-		if( $hidePatrol ) {
+		if ( $hidePatrol ) {
 			$conds['rc_patrolled'] = 0;
 		}
-		if( $forcebot ) {
+		if ( $forcebot ) {
 			$conds['rc_bot'] = 1;
 		}
-		if( $hideLoggedInUsers ) {
+		if ( $hideLoggedInUsers ) {
 			$conds[] = 'rc_user = 0';
 		}
-		if( $hideAnonymousUsers ) {
+		if ( $hideAnonymousUsers ) {
 			$conds[] = 'rc_user != 0';
 		}
 
-		if( $opts['hidemyself'] ) {
-			if( $this->getUser()->getId() ) {
+		if ( $opts['hidemyself'] ) {
+			if ( $this->getUser()->getId() ) {
 				$conds[] = 'rc_user != ' . $dbr->addQuotes( $this->getUser()->getId() );
 			} else {
 				$conds[] = 'rc_user_text != ' . $dbr->addQuotes( $this->getUser()->getName() );
@@ -336,13 +347,13 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		}
 
 		# Namespace filtering
-		if( $opts['namespace'] !== '' ) {
+		if ( $opts['namespace'] !== '' ) {
 			$selectedNS = $dbr->addQuotes( $opts['namespace'] );
-			$operator = $opts['invert'] ? '!='  : '=';
+			$operator = $opts['invert'] ? '!=' : '=';
 			$boolean = $opts['invert'] ? 'AND' : 'OR';
 
 			# namespace association (bug 2429)
-			if( !$opts['associated'] ) {
+			if ( !$opts['associated'] ) {
 				$condition = "rc_namespace $operator $selectedNS";
 			} else {
 				# Also add the associated namespace
@@ -356,15 +367,16 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
 			$conds[] = $condition;
 		}
+
 		return $conds;
 	}
 
 	/**
 	 * Process the query
 	 *
-	 * @param $conds Array
-	 * @param $opts FormOptions
-	 * @return bool|ResultWrapper result or false (for Recentchangeslinked only)
+	 * @param array $conds
+	 * @param FormOptions $opts
+	 * @return bool|ResultWrapper Result or false (for Recentchangeslinked only)
 	 */
 	public function doMainQuery( $conds, $opts ) {
 		$tables = array( 'recentchanges' );
@@ -382,7 +394,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
 		$fields = RecentChange::selectFields();
 		// JOIN on watchlist for users
-		if ( $uid ) {
+		if ( $uid && $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
 			$tables[] = 'watchlist';
 			$fields[] = 'wl_user';
 			$fields[] = 'wl_notificationtimestamp';
@@ -390,7 +402,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 				'wl_user' => $uid,
 				'wl_title=rc_title',
 				'wl_namespace=rc_namespace'
-			));
+			) );
 		}
 		if ( $this->getUser()->isAllowed( 'rollback' ) ) {
 			$tables[] = 'page';
@@ -408,91 +420,40 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		);
 
 		if ( !wfRunHooks( 'SpecialRecentChangesQuery',
-			array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$fields ) ) )
-		{
+			array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$fields ) )
+		) {
 			return false;
 		}
 
-		// Don't use the new_namespace_time timestamp index if:
-		// (a) "All namespaces" selected
-		// (b) We want pages in more than one namespace (inverted/associated)
-		// (c) There is a tag to filter on (use tag index instead)
-		// (d) UNION + sort/limit is not an option for the DBMS
-		if( $namespace === ''
-			|| ( $invert || $associated )
-			|| $opts['tagfilter'] != ''
-			|| !$dbr->unionSupportsOrderAndLimit() )
-		{
-			$res = $dbr->select( $tables, $fields, $conds, __METHOD__,
-				array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $limit ) +
-				$query_options,
-				$join_conds );
-		// We have a new_namespace_time index! UNION over new=(0,1) and sort result set!
-		} else {
-			// New pages
-			$sqlNew = $dbr->selectSQLText(
-				$tables,
-				$fields,
-				array( 'rc_new' => 1 ) + $conds,
-				__METHOD__,
-				array(
-					'ORDER BY' => 'rc_timestamp DESC',
-					'LIMIT' => $limit,
-					'USE INDEX' => array( 'recentchanges' => 'new_name_timestamp' )
-				),
-				$join_conds
-			);
-			// Old pages
-			$sqlOld = $dbr->selectSQLText(
-				$tables,
-				$fields,
-				array( 'rc_new' => 0 ) + $conds,
-				__METHOD__,
-				array(
-					'ORDER BY' => 'rc_timestamp DESC',
-					'LIMIT' => $limit,
-					'USE INDEX' => array( 'recentchanges' => 'new_name_timestamp' )
-				),
-				$join_conds
-			);
-			# Join the two fast queries, and sort the result set
-			$sql = $dbr->unionQueries( array( $sqlNew, $sqlOld ), false ) .
-				' ORDER BY rc_timestamp DESC';
-			$sql = $dbr->limitResult( $sql, $limit, false );
-			$res = $dbr->query( $sql, __METHOD__ );
-		}
-
-		return $res;
+		// rc_new is not an ENUM, but adding a redundant rc_new IN (0,1) gives mysql enough
+		// knowledge to use an index merge if it wants (it may use some other index though).
+		return $dbr->select(
+			$tables,
+			$fields,
+			$conds + array( 'rc_new' => array( 0, 1 ) ),
+			__METHOD__,
+			array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $limit ) + $query_options,
+			$join_conds
+		);
 	}
 
 	/**
 	 * Send output to the OutputPage object, only called if not used feeds
 	 *
-	 * @param array $rows of database rows
-	 * @param $opts FormOptions
+	 * @param array $rows Database rows
+	 * @param FormOptions $opts
 	 */
 	public function webOutput( $rows, $opts ) {
 		global $wgRCShowWatchingUsers, $wgShowUpdatedMarker, $wgAllowCategorizedRecentChanges;
 
-		$limit = $opts['limit'];
-
-		if( !$this->including() ) {
-			// Output options box
-			$this->doHeader( $opts );
-		}
-
-		// And now for the content
-		$feedQuery = $this->getFeedQuery();
-		if ( $feedQuery !== '' ) {
-			$this->getOutput()->setFeedAppendQuery( $feedQuery );
-		} else {
-			$this->getOutput()->setFeedAppendQuery( false );
-		}
+		// Build the final data
 
-		if( $wgAllowCategorizedRecentChanges ) {
+		if ( $wgAllowCategorizedRecentChanges ) {
 			$this->filterByCategories( $rows, $opts );
 		}
 
+		$limit = $opts['limit'];
+
 		$showWatcherCount = $wgRCShowWatchingUsers && $this->getUser()->getOption( 'shownumberswatching' );
 		$watcherCache = array();
 
@@ -501,23 +462,23 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		$counter = 1;
 		$list = ChangesList::newFromContext( $this->getContext() );
 
-		$s = $list->beginRecentChangesList();
-		foreach( $rows as $obj ) {
-			if( $limit == 0 ) {
+		$rclistOutput = $list->beginRecentChangesList();
+		foreach ( $rows as $obj ) {
+			if ( $limit == 0 ) {
 				break;
 			}
 			$rc = RecentChange::newFromRow( $obj );
 			$rc->counter = $counter++;
 			# Check if the page has been updated since the last visit
-			if( $wgShowUpdatedMarker && !empty( $obj->wl_notificationtimestamp ) ) {
+			if ( $wgShowUpdatedMarker && !empty( $obj->wl_notificationtimestamp ) ) {
 				$rc->notificationtimestamp = ( $obj->rc_timestamp >= $obj->wl_notificationtimestamp );
 			} else {
 				$rc->notificationtimestamp = false; // Default
 			}
 			# Check the number of users watching the page
 			$rc->numberofWatchingusers = 0; // Default
-			if( $showWatcherCount && $obj->rc_namespace >= 0 ) {
-				if( !isset( $watcherCache[$obj->rc_namespace][$obj->rc_title] ) ) {
+			if ( $showWatcherCount && $obj->rc_namespace >= 0 ) {
+				if ( !isset( $watcherCache[$obj->rc_namespace][$obj->rc_title] ) ) {
 					$watcherCache[$obj->rc_namespace][$obj->rc_title] =
 						$dbr->selectField(
 							'watchlist',
@@ -534,12 +495,34 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
 			$changeLine = $list->recentChangesLine( $rc, !empty( $obj->wl_user ), $counter );
 			if ( $changeLine !== false ) {
-				$s .= $changeLine;
+				$rclistOutput .= $changeLine;
 				--$limit;
 			}
 		}
-		$s .= $list->endRecentChangesList();
-		$this->getOutput()->addHTML( $s );
+		$rclistOutput .= $list->endRecentChangesList();
+
+		// Print things out
+
+		if ( !$this->including() ) {
+			// Output options box
+			$this->doHeader( $opts );
+		}
+
+		// And now for the content
+		$feedQuery = $this->getFeedQuery();
+		if ( $feedQuery !== '' ) {
+			$this->getOutput()->setFeedAppendQuery( $feedQuery );
+		} else {
+			$this->getOutput()->setFeedAppendQuery( false );
+		}
+
+		if ( $rows->numRows() === 0 ) {
+			$this->getOutput()->wrapWikiMsg(
+				"<div class='mw-changeslist-empty'>\n$1\n</div>", 'recentchanges-noresult'
+			);
+		} else {
+			$this->getOutput()->addHTML( $rclistOutput );
+		}
 	}
 
 	/**
@@ -567,8 +550,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 	/**
 	 * Return the text to be displayed above the changes
 	 *
-	 * @param $opts FormOptions
-	 * @return String: XHTML
+	 * @param FormOptions $opts
+	 * @return string XHTML
 	 */
 	public function doHeader( $opts ) {
 		global $wgScript;
@@ -577,10 +560,6 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
 		$defaults = $opts->getAllValues();
 		$nondefaults = $opts->getChangedValues();
-		$opts->consumeValues( array(
-			'namespace', 'invert', 'associated', 'tagfilter',
-			'categories', 'categories_any'
-		) );
 
 		$panel = array();
 		$panel[] = $this->optionsPanel( $defaults, $nondefaults );
@@ -592,24 +571,36 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		$submit = ' ' . Xml::submitbutton( $this->msg( 'allpagessubmit' )->text() );
 
 		$out = Xml::openElement( 'table', array( 'class' => 'mw-recentchanges-table' ) );
-		foreach( $extraOpts as $name => $optionRow ) {
+		foreach ( $extraOpts as $name => $optionRow ) {
 			# Add submit button to the last row only
 			++$count;
 			$addSubmit = ( $count === $extraOptsCount ) ? $submit : '';
 
 			$out .= Xml::openElement( 'tr' );
-			if( is_array( $optionRow ) ) {
-				$out .= Xml::tags( 'td', array( 'class' => 'mw-label mw-' . $name . '-label' ), $optionRow[0] );
-				$out .= Xml::tags( 'td', array( 'class' => 'mw-input' ), $optionRow[1] . $addSubmit );
+			if ( is_array( $optionRow ) ) {
+				$out .= Xml::tags(
+					'td',
+					array( 'class' => 'mw-label mw-' . $name . '-label' ),
+					$optionRow[0]
+				);
+				$out .= Xml::tags(
+					'td',
+					array( 'class' => 'mw-input' ),
+					$optionRow[1] . $addSubmit
+				);
 			} else {
-				$out .= Xml::tags( 'td', array( 'class' => 'mw-input', 'colspan' => 2 ), $optionRow . $addSubmit );
+				$out .= Xml::tags(
+					'td',
+					array( 'class' => 'mw-input', 'colspan' => 2 ),
+					$optionRow . $addSubmit
+				);
 			}
 			$out .= Xml::closeElement( 'tr' );
 		}
 		$out .= Xml::closeElement( 'table' );
 
 		$unconsumed = $opts->getUnconsumedValues();
-		foreach( $unconsumed as $key => $value ) {
+		foreach ( $unconsumed as $key => $value ) {
 			$out .= Html::hidden( $key, $value );
 		}
 
@@ -620,7 +611,11 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		$panelString = implode( "\n", $panel );
 
 		$this->getOutput()->addHTML(
-			Xml::fieldset( $this->msg( 'recentchanges-legend' )->text(), $panelString, array( 'class' => 'rcoptions' ) )
+			Xml::fieldset(
+				$this->msg( 'recentchanges-legend' )->text(),
+				$panelString,
+				array( 'class' => 'rcoptions' )
+			)
 		);
 
 		$this->setBottomText( $opts );
@@ -629,15 +624,19 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 	/**
 	 * Get options to be displayed in a form
 	 *
-	 * @param $opts FormOptions
-	 * @return Array
+	 * @param FormOptions $opts
+	 * @return array
 	 */
 	function getExtraOptions( $opts ) {
+		$opts->consumeValues( array(
+			'namespace', 'invert', 'associated', 'tagfilter', 'categories', 'categories_any'
+		) );
+
 		$extraOpts = array();
 		$extraOpts['namespace'] = $this->namespaceFilterForm( $opts );
 
 		global $wgAllowCategorizedRecentChanges;
-		if( $wgAllowCategorizedRecentChanges ) {
+		if ( $wgAllowCategorizedRecentChanges ) {
 			$extraOpts['category'] = $this->categoryFilterForm( $opts );
 		}
 
@@ -646,14 +645,18 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 			$extraOpts['tagfilter'] = $tagFilter;
 		}
 
-		wfRunHooks( 'SpecialRecentChangesPanel', array( &$extraOpts, $opts ) );
+		// Don't fire the hook for subclasses. (Or should we?)
+		if ( $this->getName() === 'Recentchanges' ) {
+			wfRunHooks( 'SpecialRecentChangesPanel', array( &$extraOpts, $opts ) );
+		}
+
 		return $extraOpts;
 	}
 
 	/**
 	 * Send the text to be displayed above the options
 	 *
-	 * @param $opts FormOptions
+	 * @param FormOptions $opts Unused
 	 */
 	function setTopText( FormOptions $opts ) {
 		global $wgContLang;
@@ -672,19 +675,19 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 	}
 
 	/**
-	 * Send the text to be displayed after the options, for use in
-	 * Recentchangeslinked
+	 * Send the text to be displayed after the options, for use in subclasses.
 	 *
-	 * @param $opts FormOptions
+	 * @param FormOptions $opts
 	 */
-	function setBottomText( FormOptions $opts ) {}
+	function setBottomText( FormOptions $opts ) {
+	}
 
 	/**
 	 * Creates the choose namespace selection
 	 *
 	 * @todo Uses radio buttons (HASHAR)
-	 * @param $opts FormOptions
-	 * @return String
+	 * @param FormOptions $opts
+	 * @return string
 	 */
 	protected function namespaceFilterForm( FormOptions $opts ) {
 		$nsSelect = Html::namespaceSelector(
@@ -702,14 +705,15 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 			$opts['associated'],
 			array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
 		);
+
 		return array( $nsLabel, "$nsSelect $invert $associated" );
 	}
 
 	/**
 	 * Create a input to filter changes by categories
 	 *
-	 * @param $opts FormOptions
-	 * @return Array
+	 * @param FormOptions $opts
+	 * @return array
 	 */
 	protected function categoryFilterForm( FormOptions $opts ) {
 		list( $label, $input ) = Xml::inputLabelSep( $this->msg( 'rc_categories' )->text(),
@@ -724,21 +728,21 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 	/**
 	 * Filter $rows by categories set in $opts
 	 *
-	 * @param array $rows of database rows
-	 * @param $opts FormOptions
+	 * @param array $rows Database rows
+	 * @param FormOptions $opts
 	 */
 	function filterByCategories( &$rows, FormOptions $opts ) {
 		$categories = array_map( 'trim', explode( '|', $opts['categories'] ) );
 
-		if( !count( $categories ) ) {
+		if ( !count( $categories ) ) {
 			return;
 		}
 
 		# Filter categories
 		$cats = array();
-		foreach( $categories as $cat ) {
+		foreach ( $categories as $cat ) {
 			$cat = trim( $cat );
-			if( $cat == '' ) {
+			if ( $cat == '' ) {
 				continue;
 			}
 			$cats[] = $cat;
@@ -748,16 +752,16 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		$articles = array();
 		$a2r = array();
 		$rowsarr = array();
-		foreach( $rows as $k => $r ) {
+		foreach ( $rows as $k => $r ) {
 			$nt = Title::makeTitle( $r->rc_namespace, $r->rc_title );
 			$id = $nt->getArticleID();
-			if( $id == 0 ) {
+			if ( $id == 0 ) {
 				continue; # Page might have been deleted...
 			}
-			if( !in_array( $id, $articles ) ) {
+			if ( !in_array( $id, $articles ) ) {
 				$articles[] = $id;
 			}
-			if( !isset( $a2r[$id] ) ) {
+			if ( !isset( $a2r[$id] ) ) {
 				$a2r[$id] = array();
 			}
 			$a2r[$id][] = $k;
@@ -765,7 +769,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		}
 
 		# Shortcut?
-		if( !count( $articles ) || !count( $cats ) ) {
+		if ( !count( $articles ) || !count( $cats ) ) {
 			return;
 		}
 
@@ -776,8 +780,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
 		# Filter
 		$newrows = array();
-		foreach( $match as $id ) {
-			foreach( $a2r[$id] as $rev ) {
+		foreach ( $match as $id ) {
+			foreach ( $a2r[$id] as $rev ) {
 				$k = $rev;
 				$newrows[$k] = $rowsarr[$k];
 			}
@@ -788,10 +792,10 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 	/**
 	 * Makes change an option link which carries all the other options
 	 *
-	 * @param $title Title
-	 * @param array $override options to override
-	 * @param array $options current options
-	 * @param $active Boolean: whether to show the link in bold
+	 * @param string $title Title
+	 * @param array $override Options to override
+	 * @param array $options Current options
+	 * @param bool $active Whether to show the link in bold
 	 * @return string
 	 */
 	function makeOptionsLink( $title, $override, $options, $active = false ) {
@@ -810,14 +814,15 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		if ( $active ) {
 			$text = '<strong>' . $text . '</strong>';
 		}
+
 		return Linker::linkKnown( $this->getTitle(), $text, array(), $params );
 	}
 
 	/**
 	 * Creates the options panel.
 	 *
-	 * @param $defaults Array
-	 * @param $nondefaults Array
+	 * @param array $defaults
+	 * @param array $nondefaults
 	 * @return string
 	 */
 	function optionsPanel( $defaults, $nondefaults ) {
@@ -827,13 +832,13 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
 		$note = '';
 		$msg = $this->msg( 'rclegend' );
-		if( !$msg->isDisabled() ) {
+		if ( !$msg->isDisabled() ) {
 			$note .= '<div class="mw-rclegend">' . $msg->parse() . "</div>\n";
 		}
 
 		$lang = $this->getLanguage();
 		$user = $this->getUser();
-		if( $options['from'] ) {
+		if ( $options['from'] ) {
 			$note .= $this->msg( 'rcnotefrom' )->numParams( $options['limit'] )->params(
 				$lang->userTimeAndDate( $options['from'], $user ),
 				$lang->userDate( $options['from'], $user ),
@@ -841,22 +846,27 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		}
 
 		# Sort data for display and make sure it's unique after we've added user data.
-		$wgRCLinkLimits[] = $options['limit'];
-		$wgRCLinkDays[] = $options['days'];
-		sort( $wgRCLinkLimits );
-		sort( $wgRCLinkDays );
-		$wgRCLinkLimits = array_unique( $wgRCLinkLimits );
-		$wgRCLinkDays = array_unique( $wgRCLinkDays );
+		$linkLimits = $wgRCLinkLimits;
+		$linkLimits[] = $options['limit'];
+		sort( $linkLimits );
+		$linkLimits = array_unique( $linkLimits );
+
+		$linkDays = $wgRCLinkDays;
+		$linkDays[] = $options['days'];
+		sort( $linkDays );
+		$linkDays = array_unique( $linkDays );
 
 		// limit links
-		foreach( $wgRCLinkLimits as $value ) {
+		$cl = array();
+		foreach ( $linkLimits as $value ) {
 			$cl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
 				array( 'limit' => $value ), $nondefaults, $value == $options['limit'] );
 		}
 		$cl = $lang->pipeList( $cl );
 
 		// day links, reset 'from' to none
-		foreach( $wgRCLinkDays as $value ) {
+		$dl = array();
+		foreach ( $linkDays as $value ) {
 			$dl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
 				array( 'days' => $value, 'from' => '' ), $nondefaults, $value == $options['days'] );
 		}
@@ -865,12 +875,12 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		// show/hide links
 		$showhide = array( $this->msg( 'show' )->text(), $this->msg( 'hide' )->text() );
 		$filters = array(
-			'hideminor'     => 'rcshowhideminor',
-			'hidebots'      => 'rcshowhidebots',
-			'hideanons'     => 'rcshowhideanons',
-			'hideliu'       => 'rcshowhideliu',
+			'hideminor' => 'rcshowhideminor',
+			'hidebots' => 'rcshowhidebots',
+			'hideanons' => 'rcshowhideanons',
+			'hideliu' => 'rcshowhideliu',
 			'hidepatrolled' => 'rcshowhidepatr',
-			'hidemyself'    => 'rcshowhidemine'
+			'hidemyself' => 'rcshowhidemine'
 		);
 		foreach ( $this->getCustomFilters() as $key => $params ) {
 			$filters[$key] = $params['msg'];
@@ -883,7 +893,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 		$links = array();
 		foreach ( $filters as $key => $msg ) {
 			$link = $this->makeOptionsLink( $showhide[1 - $options[$key]],
-				array( $key => 1-$options[$key] ), $nondefaults );
+				array( $key => 1 - $options[$key] ), $nondefaults );
 			$links[] = $this->msg( $msg )->rawParams( $link )->escaped();
 		}
 
@@ -894,15 +904,17 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 			$now, array( 'from' => $timestamp ), $nondefaults
 		);
 
-		$rclinks = $this->msg( 'rclinks' )->rawParams( $cl, $dl, $lang->pipeList( $links ) )->parse();
+		$rclinks = $this->msg( 'rclinks' )->rawParams( $cl, $dl, $lang->pipeList( $links ) )
+			->parse();
 		$rclistfrom = $this->msg( 'rclistfrom' )->rawParams( $tl )->parse();
+
 		return "{$note}$rclinks<br />$rclistfrom";
 	}
 
 	/**
-	 * add javascript specific to the [[Special:RecentChanges]] page
+	 * Add page-specific modules.
 	 */
-	function addRecentChangesJS() {
+	protected function addModules() {
 		$this->getOutput()->addModules( array(
 			'mediawiki.special.recentchanges',
 		) );
diff --git a/includes/specials/SpecialRecentchangeslinked.php b/includes/specials/SpecialRecentchangeslinked.php
index 391c4a7f..a8447046 100644
--- a/includes/specials/SpecialRecentchangeslinked.php
+++ b/includes/specials/SpecialRecentchangeslinked.php
@@ -56,7 +56,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 			$this->msg( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() )
 				->inContentLanguage()->text(),
 			$this->msg( 'recentchangeslinked-feed' )->inContentLanguage()->text(),
-			$this->getTitle()->getFullUrl()
+			$this->getTitle()->getFullURL()
 		);
 		return array( $feed, $feedObj );
 	}
@@ -71,8 +71,8 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 		}
 		$outputPage = $this->getOutput();
 		$title = Title::newFromURL( $target );
-		if( !$title || $title->getInterwiki() != '' ) {
-			$outputPage->wrapWikiMsg( "<div class=\"errorbox\">\n$1\n</div><br style=\"clear: both\" />", 'allpagesbadtitle' );
+		if ( !$title || $title->getInterwiki() != '' ) {
+			$outputPage->wrapWikiMsg( "<div class=\"errorbox\">\n$1\n</div>", 'allpagesbadtitle' );
 			return false;
 		}
 
@@ -99,7 +99,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 
 		// left join with watchlist table to highlight watched rows
 		$uid = $this->getUser()->getId();
-		if( $uid ) {
+		if ( $uid && $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
 			$tables[] = 'watchlist';
 			$select[] = 'wl_user';
 			$join_conds['watchlist'] = array( 'LEFT JOIN', array(
@@ -126,7 +126,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 			return false;
 		}
 
-		if( $ns == NS_CATEGORY && !$showlinkedto ) {
+		if ( $ns == NS_CATEGORY && !$showlinkedto ) {
 			// special handling for categories
 			// XXX: should try to make this less kludgy
 			$link_tables = array( 'categorylinks' );
@@ -135,12 +135,12 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 			// for now, always join on these tables; really should be configurable as in whatlinkshere
 			$link_tables = array( 'pagelinks', 'templatelinks' );
 			// imagelinks only contains links to pages in NS_FILE
-			if( $ns == NS_FILE || !$showlinkedto ) {
+			if ( $ns == NS_FILE || !$showlinkedto ) {
 				$link_tables[] = 'imagelinks';
 			}
 		}
 
-		if( $id == 0 && !$showlinkedto ) {
+		if ( $id == 0 && !$showlinkedto ) {
 			return false; // nonexistent pages can't link to any pages
 		}
 
@@ -149,22 +149,22 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 
 		$subsql = array(); // SELECT statements to combine with UNION
 
-		foreach( $link_tables as $link_table ) {
+		foreach ( $link_tables as $link_table ) {
 			$pfx = $prefix[$link_table];
 
 			// imagelinks and categorylinks tables have no xx_namespace field, and have xx_to instead of xx_title
-			if( $link_table == 'imagelinks' ) {
+			if ( $link_table == 'imagelinks' ) {
 				$link_ns = NS_FILE;
-			} elseif( $link_table == 'categorylinks' ) {
+			} elseif ( $link_table == 'categorylinks' ) {
 				$link_ns = NS_CATEGORY;
 			} else {
 				$link_ns = 0;
 			}
 
-			if( $showlinkedto ) {
+			if ( $showlinkedto ) {
 				// find changes to pages linking to this page
-				if( $link_ns ) {
-					if( $ns != $link_ns ) {
+				if ( $link_ns ) {
+					if ( $ns != $link_ns ) {
 						continue;
 					} // should never happen, but check anyway
 					$subconds = array( "{$pfx}_to" => $dbkey );
@@ -175,7 +175,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 			} else {
 				// find changes to pages linked from this page
 				$subconds = array( "{$pfx}_from" => $id );
-				if( $link_table == 'imagelinks' || $link_table == 'categorylinks' ) {
+				if ( $link_table == 'imagelinks' || $link_table == 'categorylinks' ) {
 					$subconds["rc_namespace"] = $link_ns;
 					$subjoin = "rc_title = {$pfx}_to";
 				} else {
@@ -183,7 +183,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 				}
 			}
 
-			if( $dbr->unionSupportsOrderAndLimit()) {
+			if ( $dbr->unionSupportsOrderAndLimit() ) {
 				$order = array( 'ORDER BY' => 'rc_timestamp DESC' );
 			} else {
 				$order = array();
@@ -198,16 +198,17 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 				$join_conds + array( $link_table => array( 'INNER JOIN', $subjoin ) )
 			);
 
-			if( $dbr->unionSupportsOrderAndLimit())
+			if ( $dbr->unionSupportsOrderAndLimit() ) {
 				$query = $dbr->limitResult( $query, $limit );
+			}
 
 			$subsql[] = $query;
 		}
 
-		if( count( $subsql ) == 0 ) {
+		if ( count( $subsql ) == 0 ) {
 			return false; // should never happen
 		}
-		if( count( $subsql ) == 1 && $dbr->unionSupportsOrderAndLimit() ) {
+		if ( count( $subsql ) == 1 && $dbr->unionSupportsOrderAndLimit() ) {
 			$sql = $subsql[0];
 		} else {
 			// need to resort and relimit after union
@@ -217,7 +218,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 
 		$res = $dbr->query( $sql, __METHOD__ );
 
-		if( $res->numRows() == 0 ) {
+		if ( $res->numRows() == 0 ) {
 			$this->mResultEmpty = true;
 		}
 
@@ -225,21 +226,21 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 	}
 
 	/**
-	 * @param $opts FormOptions
+	 * Get options to be displayed in a form
+	 *
+	 * @param FormOptions $opts
 	 * @return array
 	 */
 	function getExtraOptions( $opts ) {
-		$opts->consumeValues( array( 'showlinkedto', 'target', 'tagfilter' ) );
-		$extraOpts = array();
-		$extraOpts['namespace'] = $this->namespaceFilterForm( $opts );
+		$extraOpts = parent::getExtraOptions( $opts );
+
+		$opts->consumeValues( array( 'showlinkedto', 'target' ) );
+
 		$extraOpts['target'] = array( $this->msg( 'recentchangeslinked-page' )->escaped(),
 			Xml::input( 'target', 40, str_replace( '_', ' ', $opts['target'] ) ) .
 			Xml::check( 'showlinkedto', $opts['showlinkedto'], array( 'id' => 'showlinkedto' ) ) . ' ' .
 			Xml::label( $this->msg( 'recentchangeslinked-to' )->text(), 'showlinkedto' ) );
-		$tagFilter = ChangeTags::buildTagFilterSelector( $opts['tagfilter'] );
-		if ( $tagFilter ) {
-			$extraOpts['tagfilter'] = $tagFilter;
-		}
+
 		return $extraOpts;
 	}
 
@@ -260,14 +261,8 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 
 	function setTopText( FormOptions $opts ) {
 		$target = $this->getTargetTitle();
-		if( $target ) {
+		if ( $target ) {
 			$this->getOutput()->addBacklinkSubtitle( $target );
 		}
 	}
-
-	function setBottomText( FormOptions $opts ) {
-		if( isset( $this->mResultEmpty ) && $this->mResultEmpty ) {
-			$this->getOutput()->addWikiMsg( 'recentchangeslinked-noresult' );
-		}
-	}
 }
diff --git a/includes/specials/SpecialRedirect.php b/includes/specials/SpecialRedirect.php
new file mode 100644
index 00000000..f05dacbc
--- /dev/null
+++ b/includes/specials/SpecialRedirect.php
@@ -0,0 +1,235 @@
+<?php
+/**
+ * Implements Special:Redirect
+ *
+ * @section 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * A special page that redirects to: the user for a numeric user id,
+ * the file for a given filename, or the page for a given revision id.
+ *
+ * @ingroup SpecialPage
+ * @since 1.22
+ */
+class SpecialRedirect extends FormSpecialPage {
+
+	/**
+	 * The type of the redirect (user/file/revision)
+	 *
+	 * @var string $mType
+	 * @example 'user'
+	 */
+	protected $mType;
+
+	/**
+	 * The identifier/value for the redirect (which id, which file)
+	 *
+	 * @var string $mValue
+	 * @example '42'
+	 */
+	protected $mValue;
+
+	function __construct() {
+		parent::__construct( 'Redirect' );
+		$this->mType = null;
+		$this->mValue = null;
+	}
+
+	/**
+	 * Set $mType and $mValue based on parsed value of $subpage.
+	 */
+	function setParameter( $subpage ) {
+		// parse $subpage to pull out the parts
+		$parts = explode( '/', $subpage, 2 );
+		$this->mType = count( $parts ) > 0 ? $parts[0] : null;
+		$this->mValue = count( $parts ) > 1 ? $parts[1] : null;
+	}
+
+	/**
+	 * Handle Special:Redirect/user/xxxx (by redirecting to User:YYYY)
+	 *
+	 * @return string|null url to redirect to, or null if $mValue is invalid.
+	 */
+	function dispatchUser() {
+		if ( !ctype_digit( $this->mValue ) ) {
+			return null;
+		}
+		$user = User::newFromId( (int)$this->mValue );
+		$username = $user->getName(); // load User as side-effect
+		if ( $user->isAnon() ) {
+			return null;
+		}
+		$userpage = Title::makeTitle( NS_USER, $username );
+		return $userpage->getFullURL( '', false, PROTO_CURRENT );
+	}
+
+	/**
+	 * Handle Special:Redirect/file/xxxx
+	 *
+	 * @return string|null url to redirect to, or null if $mValue is not found.
+	 */
+	function dispatchFile() {
+		$title = Title::makeTitleSafe( NS_FILE, $this->mValue );
+
+		if ( ! $title instanceof Title ) {
+			return null;
+		}
+		$file = wfFindFile( $title );
+
+		if ( !$file || !$file->exists() ) {
+			return null;
+		}
+		// Default behavior: Use the direct link to the file.
+		$url = $file->getURL();
+		$request = $this->getRequest();
+		$width = $request->getInt( 'width', -1 );
+		$height = $request->getInt( 'height', -1 );
+
+		// If a width is requested...
+		if ( $width != -1 ) {
+			$mto = $file->transform( array( 'width' => $width, 'height' => $height ) );
+			// ... and we can
+			if ( $mto && !$mto->isError() ) {
+				// ... change the URL to point to a thumbnail.
+				$url = $mto->getURL();
+			}
+		}
+		return $url;
+	}
+
+	/**
+	 * Handle Special:Redirect/revision/xxx
+	 * (by redirecting to index.php?oldid=xxx)
+	 *
+	 * @return string|null url to redirect to, or null if $mValue is invalid.
+	 */
+	function dispatchRevision() {
+		$oldid = $this->mValue;
+		if ( !ctype_digit( $oldid ) ) {
+			return null;
+		}
+		$oldid = (int)$oldid;
+		if ( $oldid === 0 ) {
+			return null;
+		}
+		return wfAppendQuery( wfScript( 'index' ), array(
+			'oldid' => $oldid
+		) );
+	}
+
+	/**
+	 * Use appropriate dispatch* method to obtain a redirection URL,
+	 * and either: redirect, set a 404 error code and error message,
+	 * or do nothing (if $mValue wasn't set) allowing the form to be
+	 * displayed.
+	 *
+	 * @return bool true if a redirect was successfully handled.
+	 */
+	function dispatch() {
+		// the various namespaces supported by Special:Redirect
+		switch ( $this->mType ) {
+		case 'user':
+			$url = $this->dispatchUser();
+			break;
+		case 'file':
+			$url = $this->dispatchFile();
+			break;
+		case 'revision':
+			$url = $this->dispatchRevision();
+			break;
+		default:
+			$this->getOutput()->setStatusCode( 404 );
+			$url = null;
+			break;
+		}
+		if ( $url ) {
+			$this->getOutput()->redirect( $url );
+			return true;
+		}
+		if ( !is_null( $this->mValue ) ) {
+			$this->getOutput()->setStatusCode( 404 );
+			// Message: redirect-not-exists
+			$msg = $this->getMessagePrefix() . '-not-exists';
+			return Status::newFatal( $msg );
+		}
+		return false;
+	}
+
+	protected function getFormFields() {
+		$mp = $this->getMessagePrefix();
+		$ns = array(
+			// subpage => message
+			// Messages: redirect-user, redirect-revision, redirect-file
+			'user' => $mp . '-user',
+			'revision' => $mp . '-revision',
+			'file' => $mp . '-file',
+		);
+		$a = array();
+		$a['type'] = array(
+			'type' => 'select',
+			'label-message' => $mp . '-lookup', // Message: redirect-lookup
+			'options' => array(),
+			'default' => current( array_keys( $ns ) ),
+		);
+		foreach ( $ns as $n => $m ) {
+			$m = $this->msg( $m )->text();
+			$a['type']['options'][$m] = $n;
+		}
+		$a['value'] = array(
+			'type' => 'text',
+			'label-message' => $mp . '-value' // Message: redirect-value
+		);
+		// set the defaults according to the parsed subpage path
+		if ( !empty( $this->mType ) ) {
+			$a['type']['default'] = $this->mType;
+		}
+		if ( !empty( $this->mValue ) ) {
+			$a['value']['default'] = $this->mValue;
+		}
+		return $a;
+	}
+
+	public function onSubmit( array $data ) {
+		if ( !empty( $data['type'] ) && !empty( $data['value'] ) ) {
+			$this->setParameter( $data['type'] . '/' . $data['value'] );
+		}
+		/* if this returns false, will show the form */
+		return $this->dispatch();
+	}
+
+	public function onSuccess() {
+		/* do nothing, we redirect in $this->dispatch if successful. */
+	}
+
+	protected function alterForm( HTMLForm $form ) {
+		/* display summary at top of page */
+		$this->outputHeader();
+		// tweak label on submit button
+		// Message: redirect-submit
+		$form->setSubmitTextMsg( $this->getMessagePrefix() . '-submit' );
+		/* submit form every time */
+		$form->setMethod( 'get' );
+	}
+
+	protected function getGroupName() {
+		return 'redirects';
+	}
+}
diff --git a/includes/specials/SpecialResetTokens.php b/includes/specials/SpecialResetTokens.php
new file mode 100644
index 00000000..ef2a45da
--- /dev/null
+++ b/includes/specials/SpecialResetTokens.php
@@ -0,0 +1,145 @@
+<?php
+/**
+ * Implements Special:ResetTokens
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Let users reset tokens like the watchlist token.
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialResetTokens extends FormSpecialPage {
+	private $tokensList;
+
+	public function __construct() {
+		parent::__construct( 'ResetTokens' );
+	}
+
+	/**
+	 * Returns the token information list for this page after running
+	 * the hook and filtering out disabled preferences.
+	 *
+	 * @return array
+	 */
+	protected function getTokensList() {
+		global $wgHiddenPrefs;
+
+		if ( !isset( $this->tokensList ) ) {
+			$tokens = array(
+				array( 'preference' => 'watchlisttoken', 'label-message' => 'resettokens-watchlist-token' ),
+			);
+			wfRunHooks( 'SpecialResetTokensTokens', array( &$tokens ) );
+
+			$tokens = array_filter( $tokens, function ( $tok ) use ( $wgHiddenPrefs ) {
+				return !in_array( $tok['preference'], $wgHiddenPrefs );
+			} );
+
+			$this->tokensList = $tokens;
+		}
+
+		return $this->tokensList;
+	}
+
+	public function execute( $par ) {
+		// This is a preferences page, so no user JS for y'all.
+		$this->getOutput()->disallowUserJs();
+
+		parent::execute( $par );
+
+		$this->getOutput()->addReturnTo( SpecialPage::getTitleFor( 'Preferences' ) );
+	}
+
+	public function onSuccess() {
+		$this->getOutput()->wrapWikiMsg(
+			"<div class='successbox'>\n$1\n</div>",
+			'resettokens-done'
+		);
+	}
+
+	/**
+	 * Display appropriate message if there's nothing to do.
+	 * The submit button is also suppressed in this case (see alterForm()).
+	 */
+	protected function getFormFields() {
+		$user = $this->getUser();
+		$tokens = $this->getTokensList();
+
+		if ( $tokens ) {
+			$tokensForForm = array();
+			foreach ( $tokens as $tok ) {
+				$label = $this->msg( 'resettokens-token-label' )
+					->rawParams( $this->msg( $tok['label-message'] )->parse() )
+					->params( $user->getTokenFromOption( $tok['preference'] ) )
+					->escaped();
+				$tokensForForm[ $label ] = $tok['preference'];
+			}
+
+			$desc = array(
+				'label-message' => 'resettokens-tokens',
+				'type' => 'multiselect',
+				'options' => $tokensForForm,
+			);
+		} else {
+			$desc = array(
+				'label-message' => 'resettokens-no-tokens',
+				'type' => 'info',
+			);
+		}
+
+		return array(
+			'tokens' => $desc,
+		);
+	}
+
+	/**
+	 * Suppress the submit button if there's nothing to do;
+	 * provide additional message on it otherwise.
+	 */
+	protected function alterForm( HTMLForm $form ) {
+		if ( $this->getTokensList() ) {
+			$form->setSubmitTextMsg( 'resettokens-resetbutton' );
+		} else {
+			$form->suppressDefaultSubmit();
+		}
+	}
+
+	public function onSubmit( array $formData ) {
+		if ( $formData['tokens'] ) {
+			$user = $this->getUser();
+			foreach ( $formData['tokens'] as $tokenPref ) {
+				$user->resetTokenFromOption( $tokenPref );
+			}
+			$user->saveSettings();
+
+			return true;
+		}
+
+		return false;
+	}
+
+	protected function getGroupName() {
+		return 'users';
+	}
+
+	public function isListed() {
+		return (bool)$this->getTokensList();
+	}
+}
diff --git a/includes/specials/SpecialRevisiondelete.php b/includes/specials/SpecialRevisiondelete.php
index 5a5f8ffb..825be6c4 100644
--- a/includes/specials/SpecialRevisiondelete.php
+++ b/includes/specials/SpecialRevisiondelete.php
@@ -49,68 +49,43 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 	/** Array of checkbox specs (message, name, deletion bits) */
 	var $checks;
 
-	/** Information about the current type */
-	var $typeInfo;
+	/** UI Labels about the current type */
+	var $typeLabels;
 
 	/** The RevDel_List object, storing the list of items to be deleted/undeleted */
 	var $list;
 
 	/**
-	 * Assorted information about each type, needed by the special page.
-	 * TODO Move some of this to the list class
+	 * UI labels for each type.
 	 */
-	static $allowedTypes = array(
+	static $UILabels = array(
 		'revision' => array(
 			'check-label' 	=> 'revdelete-hide-text',
-			'deletion-bits' => Revision::DELETED_TEXT,
 			'success' 		=> 'revdelete-success',
 			'failure' 		=> 'revdelete-failure',
-			'list-class' 	=> 'RevDel_RevisionList',
-			'permission'	=> 'deleterevision',
 		),
 		'archive' => array(
 			'check-label' 	=> 'revdelete-hide-text',
-			'deletion-bits' => Revision::DELETED_TEXT,
 			'success' 		=> 'revdelete-success',
 			'failure' 		=> 'revdelete-failure',
-			'list-class' 	=> 'RevDel_ArchiveList',
-			'permission'	=> 'deleterevision',
 		),
-		'oldimage'=> array(
+		'oldimage' => array(
 			'check-label' 	=> 'revdelete-hide-image',
-			'deletion-bits' => File::DELETED_FILE,
 			'success' 		=> 'revdelete-success',
 			'failure' 		=> 'revdelete-failure',
-			'list-class' 	=> 'RevDel_FileList',
-			'permission'	=> 'deleterevision',
 		),
 		'filearchive' => array(
 			'check-label' 	=> 'revdelete-hide-image',
-			'deletion-bits' => File::DELETED_FILE,
 			'success' 		=> 'revdelete-success',
 			'failure' 		=> 'revdelete-failure',
-			'list-class' 	=> 'RevDel_ArchivedFileList',
-			'permission'	=> 'deleterevision',
 		),
 		'logging' => array(
 			'check-label'	=> 'revdelete-hide-name',
-			'deletion-bits' => LogPage::DELETED_ACTION,
 			'success' 		=> 'logdelete-success',
 			'failure' 		=> 'logdelete-failure',
-			'list-class'	=> 'RevDel_LogList',
-			'permission'	=> 'deletelogentry',
 		),
 	);
 
-	/** Type map to support old log entries */
-	static $deprecatedTypeMap = array(
-		'oldid' => 'revision',
-		'artimestamp' => 'archive',
-		'oldimage' => 'oldimage',
-		'fileid' => 'filearchive',
-		'logid' => 'logging',
-	);
-
 	public function __construct() {
 		parent::__construct( 'Revisiondelete', 'deletedhistory' );
 	}
@@ -147,19 +122,6 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 		} else {
 			$this->typeName = $request->getVal( 'type' );
 			$this->targetObj = Title::newFromText( $request->getText( 'target' ) );
-			if ( $this->targetObj && $this->targetObj->isSpecial( 'Log' ) && count( $this->ids ) !== 0 ) {
-				$result = wfGetDB( DB_SLAVE )->select( 'logging',
-					'log_type',
-					array( 'log_id' => $this->ids ),
-					__METHOD__,
-					array( 'DISTINCT' )
-				);
-
-				if ( $result->numRows() == 1 ) {
-					// If there's only one type, the target can be set to include it.
-					$this->targetObj = SpecialPage::getTitleFor( 'Log', $result->current()->log_type );
-				}
-			}
 		}
 
 		# For reviewing deleted files...
@@ -170,28 +132,21 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 			return;
 		}
 
-		if ( isset( self::$deprecatedTypeMap[$this->typeName] ) ) {
-			$this->typeName = self::$deprecatedTypeMap[$this->typeName];
-		}
+		$this->typeName = RevisionDeleter::getCanonicalTypeName( $this->typeName );
 
 		# No targets?
-		if( !isset( self::$allowedTypes[$this->typeName] ) || count( $this->ids ) == 0 ) {
+		if ( !$this->typeName || count( $this->ids ) == 0 ) {
 			throw new ErrorPageError( 'revdelete-nooldid-title', 'revdelete-nooldid-text' );
 		}
-		$this->typeInfo = self::$allowedTypes[$this->typeName];
-		$this->mIsAllowed = $user->isAllowed( $this->typeInfo['permission'] );
-
-		# If we have revisions, get the title from the first one
-		# since they should all be from the same page. This allows
-		# for more flexibility with page moves...
-		if( $this->typeName == 'revision' ) {
-			$rev = Revision::newFromId( $this->ids[0] );
-			$this->targetObj = $rev ? $rev->getTitle() : $this->targetObj;
-		}
+		$this->typeLabels = self::$UILabels[$this->typeName];
+		$this->mIsAllowed = $user->isAllowed( RevisionDeleter::getRestriction( $this->typeName ) );
+
+		# Allow the list type to adjust the passed target
+		$this->targetObj = RevisionDeleter::suggestTarget( $this->typeName, $this->targetObj, $this->ids );
 
 		$this->otherReason = $request->getVal( 'wpReason' );
 		# We need a target page!
-		if( is_null( $this->targetObj ) ) {
+		if ( is_null( $this->targetObj ) ) {
 			$output->addWikiMsg( 'undelete-header' );
 			return;
 		}
@@ -200,17 +155,19 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
 		# Initialise checkboxes
 		$this->checks = array(
-			array( $this->typeInfo['check-label'], 'wpHidePrimary', $this->typeInfo['deletion-bits'] ),
+			array( $this->typeLabels['check-label'], 'wpHidePrimary',
+				RevisionDeleter::getRevdelConstant( $this->typeName )
+			),
 			array( 'revdelete-hide-comment', 'wpHideComment', Revision::DELETED_COMMENT ),
 			array( 'revdelete-hide-user', 'wpHideUser', Revision::DELETED_USER )
 		);
-		if( $user->isAllowed( 'suppressrevision' ) ) {
+		if ( $user->isAllowed( 'suppressrevision' ) ) {
 			$this->checks[] = array( 'revdelete-hide-restricted',
 				'wpHideRestricted', Revision::DELETED_RESTRICTED );
 		}
 
 		# Either submit or create our form
-		if( $this->mIsAllowed && $this->submitClicked ) {
+		if ( $this->mIsAllowed && $this->submitClicked ) {
 			$this->submit( $request );
 		} else {
 			$this->showForm();
@@ -223,7 +180,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 		LogEventsList::showLogExtract( $output, 'delete',
 			$this->targetObj, '', array( 'lim' => 25, 'conds' => $qc ) );
 		# Show relevant lines from the suppression log
-		if( $user->isAllowed( 'suppressionlog' ) ) {
+		if ( $user->isAllowed( 'suppressionlog' ) ) {
 			$suppressLogPage = new LogPage( 'suppress' );
 			$output->addHTML( "<h2>" . $suppressLogPage->getName()->escaped() . "</h2>\n" );
 			LogEventsList::showLogExtract( $output, 'suppress',
@@ -236,7 +193,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 	 */
 	protected function showConvenienceLinks() {
 		# Give a link to the logs/hist for this page
-		if( $this->targetObj ) {
+		if ( $this->targetObj ) {
 			$links = array();
 			$links[] = Linker::linkKnown(
 				SpecialPage::getTitleFor( 'Log' ),
@@ -253,7 +210,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 					array( 'action' => 'history' )
 				);
 				# Link to deleted edits
-				if( $this->getUser()->isAllowed( 'undelete' ) ) {
+				if ( $this->getUser()->isAllowed( 'undelete' ) ) {
 					$undelete = SpecialPage::getTitleFor( 'Undelete' );
 					$links[] = Linker::linkKnown(
 						$undelete,
@@ -296,8 +253,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 			return;
 		}
 		$user = $this->getUser();
-		if( !$oimage->userCan( File::DELETED_FILE, $user ) ) {
-			if( $oimage->isDeleted( File::DELETED_RESTRICTED ) ) {
+		if ( !$oimage->userCan( File::DELETED_FILE, $user ) ) {
+			if ( $oimage->isDeleted( File::DELETED_RESTRICTED ) ) {
 				throw new PermissionsError( 'suppressrevision' );
 			} else {
 				throw new PermissionsError( 'deletedtext' );
@@ -312,10 +269,11 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 			$this->getOutput()->addHTML(
 				Xml::openElement( 'form', array(
 					'method' => 'POST',
-					'action' => $this->getTitle()->getLocalUrl(
-						'target=' . urlencode( $this->targetObj->getPrefixedDBkey() ) .
-						'&file=' . urlencode( $archiveName ) .
-						'&token=' . urlencode( $user->getEditToken( $archiveName ) ) )
+					'action' => $this->getTitle()->getLocalURL( array(
+							'target' => $this->targetObj->getPrefixedDBkey(),
+							'file' => $archiveName,
+							'token' => $user->getEditToken( $archiveName ),
+						) )
 					)
 				) .
 				Xml::submitButton( $this->msg( 'revdelete-show-file-submit' )->text() ) .
@@ -342,8 +300,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 	 */
 	protected function getList() {
 		if ( is_null( $this->list ) ) {
-			$class = $this->typeInfo['list-class'];
-			$this->list = new $class( $this->getContext(), $this->targetObj, $this->ids );
+			$this->list = RevisionDeleter::createList(
+				$this->typeName, $this->getContext(), $this->targetObj, $this->ids
+			);
 		}
 		return $this->list;
 	}
@@ -370,7 +329,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 		for ( $list->reset(); $list->current(); $list->next() ) {
 			$item = $list->current();
 			if ( !$item->canView() ) {
-				if( !$this->submitClicked ) {
+				if ( !$this->submitClicked ) {
 					throw new PermissionsError( 'suppressrevision' );
 				}
 				$UserAllowed = false;
@@ -379,7 +338,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 			$this->getOutput()->addHTML( $item->getHTML() );
 		}
 
-		if( !$numRevisions ) {
+		if ( !$numRevisions ) {
 			throw new ErrorPageError( 'revdelete-nooldid-title', 'revdelete-nooldid-text' );
 		}
 
@@ -388,12 +347,14 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 		$this->addUsageText();
 
 		// Normal sysops can always see what they did, but can't always change it
-		if( !$UserAllowed ) return;
+		if ( !$UserAllowed ) {
+			return;
+		}
 
 		// Show form if the user can submit
-		if( $this->mIsAllowed ) {
+		if ( $this->mIsAllowed ) {
 			$out = Xml::openElement( 'form', array( 'method' => 'post',
-					'action' => $this->getTitle()->getLocalUrl( array( 'action' => 'submit' ) ),
+					'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ),
 					'id' => 'mw-revdel-form-revisions' ) ) .
 				Xml::fieldset( $this->msg( 'revdelete-legend' )->text() ) .
 				$this->buildCheckBoxes() .
@@ -406,7 +367,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 						Xml::listDropDown( 'wpRevDeleteReasonList',
 							$this->msg( 'revdelete-reason-dropdown' )->inContentLanguage()->text(),
 							$this->msg( 'revdelete-reasonotherlist' )->inContentLanguage()->text(),
-							'', 'wpReasonDropDown', 1
+							$this->getRequest()->getText( 'wpRevDeleteReasonList', 'other' ), 'wpReasonDropDown', 1
 						) .
 					'</td>' .
 				"</tr><tr>\n" .
@@ -432,10 +393,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 		} else {
 			$out = '';
 		}
-		if( $this->mIsAllowed ) {
+		if ( $this->mIsAllowed ) {
 			$out .= Xml::closeElement( 'form' ) . "\n";
 			// Show link to edit the dropdown reasons
-			if( $this->getUser()->isAllowed( 'editinterface' ) ) {
+			if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
 				$title = Title::makeTitle( NS_MEDIAWIKI, 'Revdelete-reason-dropdown' );
 				$link = Linker::link(
 					$title,
@@ -455,10 +416,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 	 */
 	protected function addUsageText() {
 		$this->getOutput()->addWikiMsg( 'revdelete-text' );
-		if( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
+		if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
 			$this->getOutput()->addWikiMsg( 'revdelete-suppress-text' );
 		}
-		if( $this->mIsAllowed ) {
+		if ( $this->mIsAllowed ) {
 			$this->getOutput()->addWikiMsg( 'revdelete-confirm' );
 		}
 	}
@@ -470,17 +431,18 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 		$html = '<table>';
 		// If there is just one item, use checkboxes
 		$list = $this->getList();
-		if( $list->length() == 1 ) {
+		if ( $list->length() == 1 ) {
 			$list->reset();
 			$bitfield = $list->current()->getBits(); // existing field
-			if( $this->submitClicked ) {
+			if ( $this->submitClicked ) {
 				$bitfield = $this->extractBitfield( $this->extractBitParams(), $bitfield );
 			}
-			foreach( $this->checks as $item ) {
+			foreach ( $this->checks as $item ) {
 				list( $message, $name, $field ) = $item;
 				$innerHTML = Xml::checkLabel( $this->msg( $message )->text(), $name, $name, $bitfield & $field );
-				if( $field == Revision::DELETED_RESTRICTED )
+				if ( $field == Revision::DELETED_RESTRICTED ) {
 					$innerHTML = "<b>$innerHTML</b>";
+				}
 				$line = Xml::tags( 'td', array( 'class' => 'mw-input' ), $innerHTML );
 				$html .= "<tr>$line</tr>\n";
 			}
@@ -491,10 +453,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 			$html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-unset' )->escaped() . '</th>';
 			$html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-set' )->escaped() . '</th>';
 			$html .= "<th></th></tr>\n";
-			foreach( $this->checks as $item ) {
+			foreach ( $this->checks as $item ) {
 				list( $message, $name, $field ) = $item;
 				// If there are several items, use third state by default...
-				if( $this->submitClicked ) {
+				if ( $this->submitClicked ) {
 					$selected = $this->getRequest()->getInt( $name, 0 /* unchecked */ );
 				} else {
 					$selected = -1; // use existing field
@@ -503,7 +465,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 				$line .= '<td class="mw-revdel-checkbox">' . Xml::radio( $name, 0, $selected == 0 ) . '</td>';
 				$line .= '<td class="mw-revdel-checkbox">' . Xml::radio( $name, 1, $selected == 1 ) . '</td>';
 				$label = $this->msg( $message )->escaped();
-				if( $field == Revision::DELETED_RESTRICTED ) {
+				if ( $field == Revision::DELETED_RESTRICTED ) {
 					$label = "<b>$label</b>";
 				}
 				$line .= "<td>$label</td>";
@@ -523,21 +485,21 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 	protected function submit() {
 		# Check edit token on submission
 		$token = $this->getRequest()->getVal( 'wpEditToken' );
-		if( $this->submitClicked && !$this->getUser()->matchEditToken( $token ) ) {
+		if ( $this->submitClicked && !$this->getUser()->matchEditToken( $token ) ) {
 			$this->getOutput()->addWikiMsg( 'sessionfailure' );
 			return false;
 		}
 		$bitParams = $this->extractBitParams();
 		$listReason = $this->getRequest()->getText( 'wpRevDeleteReasonList', 'other' ); // from dropdown
 		$comment = $listReason;
-		if( $comment != 'other' && $this->otherReason != '' ) {
+		if ( $comment != 'other' && $this->otherReason != '' ) {
 			// Entry from drop down menu + additional comment
 			$comment .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->otherReason;
-		} elseif( $comment == 'other' ) {
+		} elseif ( $comment == 'other' ) {
 			$comment = $this->otherReason;
 		}
 		# Can the user set this field?
-		if( $bitParams[Revision::DELETED_RESTRICTED] == 1 && !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
+		if ( $bitParams[Revision::DELETED_RESTRICTED] == 1 && !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
 			throw new PermissionsError( 'suppressrevision' );
 		}
 		# If the save went through, go to success message...
@@ -557,7 +519,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 	 */
 	protected function success() {
 		$this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) );
-		$this->getOutput()->wrapWikiMsg( "<span class=\"success\">\n$1\n</span>", $this->typeInfo['success'] );
+		$this->getOutput()->wrapWikiMsg( "<span class=\"success\">\n$1\n</span>", $this->typeLabels['success'] );
 		$this->list->reloadFromMaster();
 		$this->showForm();
 	}
@@ -567,7 +529,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 	 */
 	protected function failure( $status ) {
 		$this->getOutput()->setPageTitle( $this->msg( 'actionfailed' ) );
-		$this->getOutput()->addWikiText( $status->getWikiText( $this->typeInfo['failure'] ) );
+		$this->getOutput()->addWikiText( $status->getWikiText( $this->typeLabels['failure'] ) );
 		$this->showForm();
 	}
 
@@ -578,15 +540,15 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 	 */
 	protected function extractBitParams() {
 		$bitfield = array();
-		foreach( $this->checks as $item ) {
+		foreach ( $this->checks as $item ) {
 			list( /* message */, $name, $field ) = $item;
 			$val = $this->getRequest()->getInt( $name, 0 /* unchecked */ );
-			if( $val < -1 || $val > 1) {
+			if ( $val < -1 || $val > 1 ) {
 				$val = -1; // -1 for existing value
 			}
 			$bitfield[$field] = $val;
 		}
-		if( !isset( $bitfield[Revision::DELETED_RESTRICTED] ) ) {
+		if ( !isset( $bitfield[Revision::DELETED_RESTRICTED] ) ) {
 			$bitfield[Revision::DELETED_RESTRICTED] = 0;
 		}
 		return $bitfield;
@@ -594,21 +556,13 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
 	/**
 	 * Put together a rev_deleted bitfield
+	 * @deprecated since 1.22, use RevisionDeleter::extractBitfield instead
 	 * @param array $bitPars extractBitParams() params
 	 * @param int $oldfield current bitfield
 	 * @return array
 	 */
 	public static function extractBitfield( $bitPars, $oldfield ) {
-		// Build the actual new rev_deleted bitfield
-		$newBits = 0;
-		foreach( $bitPars as $const => $val ) {
-			if( $val == 1 ) {
-				$newBits |= $const; // $const is the *_deleted const
-			} elseif( $val == -1 ) {
-				$newBits |= ($oldfield & $const); // use existing
-			}
-		}
-		return $newBits;
+		return RevisionDeleter::extractBitfield( $bitPars, $oldfield );
 	}
 
 	/**
diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php
index 6c401486..8609c740 100644
--- a/includes/specials/SpecialSearch.php
+++ b/includes/specials/SpecialSearch.php
@@ -42,6 +42,9 @@ class SpecialSearch extends SpecialPage {
 	/// Search engine
 	protected $searchEngine;
 
+	/// Search engine type, if not default
+	protected $searchEngineType;
+
 	/// For links
 	protected $extraParams = array();
 
@@ -98,6 +101,8 @@ class SpecialSearch extends SpecialPage {
 
 		$this->load();
 
+		$this->searchEngineType = $request->getVal( 'srbackend' );
+
 		if ( $request->getVal( 'fulltext' )
 			|| !is_null( $request->getVal( 'offset' ) )
 			|| !is_null( $request->getVal( 'searchx' ) ) )
@@ -137,7 +142,7 @@ class SpecialSearch extends SpecialPage {
 		if ( $profile === null ) {
 			// BC with old request format
 			$profile = 'advanced';
-			foreach( $profiles as $key => $data ) {
+			foreach ( $profiles as $key => $data ) {
 				if ( $nslist === $data['namespaces'] && $key !== 'advanced' ) {
 					$profile = $key;
 				}
@@ -173,7 +178,7 @@ class SpecialSearch extends SpecialPage {
 		# Try to go to page as entered.
 		$t = Title::newFromText( $term );
 		# If the string cannot be used to create a title
-		if( is_null( $t ) ) {
+		if ( is_null( $t ) ) {
 			$this->showResults( $term );
 			return;
 		}
@@ -185,19 +190,19 @@ class SpecialSearch extends SpecialPage {
 			return;
 		}
 
-		if( !is_null( $t ) ) {
+		if ( !is_null( $t ) ) {
 			$this->getOutput()->redirect( $t->getFullURL() );
 			return;
 		}
 		# No match, generate an edit URL
 		$t = Title::newFromText( $term );
-		if( !is_null( $t ) ) {
+		if ( !is_null( $t ) ) {
 			global $wgGoToEdit;
 			wfRunHooks( 'SpecialSearchNogomatch', array( &$t ) );
 			wfDebugLog( 'nogomatch', $t->getText(), false );
 
 			# If the feature is enabled, go straight to the edit page
-			if( $wgGoToEdit ) {
+			if ( $wgGoToEdit ) {
 				$this->getOutput()->redirect( $t->getFullURL( array( 'action' => 'edit' ) ) );
 				return;
 			}
@@ -253,18 +258,24 @@ class SpecialSearch extends SpecialPage {
 		$rewritten = $search->replacePrefixes( $term );
 
 		$titleMatches = $search->searchTitle( $rewritten );
-		if( !( $titleMatches instanceof SearchResultTooMany ) ) {
+		if ( !( $titleMatches instanceof SearchResultTooMany ) ) {
 			$textMatches = $search->searchText( $rewritten );
 		}
 
+		$textStatus = null;
+		if ( $textMatches instanceof Status ) {
+			$textStatus = $textMatches;
+			$textMatches = null;
+		}
+
 		// did you mean... suggestions
-		if( $textMatches && $textMatches->hasSuggestion() ) {
+		if ( $textMatches && !$textStatus && $textMatches->hasSuggestion() ) {
 			$st = SpecialPage::getTitleFor( 'Search' );
 
 			# mirror Go/Search behavior of original request ..
 			$didYouMeanParams = array( 'search' => $textMatches->getSuggestionQuery() );
 
-			if( $this->fulltext != null ) {
+			if ( $this->fulltext != null ) {
 				$didYouMeanParams['fulltext'] = $this->fulltext;
 			}
 
@@ -275,7 +286,7 @@ class SpecialSearch extends SpecialPage {
 
 			$suggestionSnippet = $textMatches->getSuggestionSnippet();
 
-			if( $suggestionSnippet == '' ) {
+			if ( $suggestionSnippet == '' ) {
 				$suggestionSnippet = null;
 			}
 
@@ -317,14 +328,14 @@ class SpecialSearch extends SpecialPage {
 		);
 
 		// Sometimes the search engine knows there are too many hits
-		if( $titleMatches instanceof SearchResultTooMany ) {
+		if ( $titleMatches instanceof SearchResultTooMany ) {
 			$out->wrapWikiMsg( "==$1==\n", 'toomanymatches' );
 			wfProfileOut( __METHOD__ );
 			return;
 		}
 
 		$filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
-		if( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
+		if ( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
 			$out->addHTML( $this->formHeader( $term, 0, 0 ) );
 			$out->addHtml( $this->getProfileForm( $this->profile, $term ) );
 			$out->addHTML( '</form>' );
@@ -347,10 +358,12 @@ class SpecialSearch extends SpecialPage {
 
 		// get total number of results if backend can calculate it
 		$totalRes = 0;
-		if( $titleMatches && !is_null( $titleMatches->getTotalHits() ) )
+		if ( $titleMatches && !is_null( $titleMatches->getTotalHits() ) ) {
 			$totalRes += $titleMatches->getTotalHits();
-		if( $textMatches && !is_null( $textMatches->getTotalHits() ) )
+		}
+		if ( $textMatches && !is_null( $textMatches->getTotalHits() ) ) {
 			$totalRes += $textMatches->getTotalHits();
+		}
 
 		// show number of results and current offset
 		$out->addHTML( $this->formHeader( $term, $num, $totalRes ) );
@@ -360,7 +373,7 @@ class SpecialSearch extends SpecialPage {
 		$out->addHtml( "<div class='searchresults'>" );
 
 		// prev/next links
-		if( $num || $this->offset ) {
+		if ( $num || $this->offset ) {
 			// Show the create link ahead
 			$this->showCreateLink( $t );
 			$prevnext = $this->getLanguage()->viewPrevNext( $this->getTitle(), $this->offset, $this->limit,
@@ -374,40 +387,46 @@ class SpecialSearch extends SpecialPage {
 		}
 
 		$out->parserOptions()->setEditSection( false );
-		if( $titleMatches ) {
-			if( $numTitleMatches > 0 ) {
+		if ( $titleMatches ) {
+			if ( $numTitleMatches > 0 ) {
 				$out->wrapWikiMsg( "==$1==\n", 'titlematches' );
 				$out->addHTML( $this->showMatches( $titleMatches ) );
 			}
 			$titleMatches->free();
 		}
-		if( $textMatches ) {
+		if ( $textMatches && !$textStatus ) {
 			// output appropriate heading
-			if( $numTextMatches > 0 && $numTitleMatches > 0 ) {
+			if ( $numTextMatches > 0 && $numTitleMatches > 0 ) {
 				// if no title matches the heading is redundant
 				$out->wrapWikiMsg( "==$1==\n", 'textmatches' );
-			} elseif( $totalRes == 0 ) {
+			} elseif ( $totalRes == 0 ) {
 				# Don't show the 'no text matches' if we received title matches
 				# $out->wrapWikiMsg( "==$1==\n", 'notextmatches' );
 			}
 			// show interwiki results if any
-			if( $textMatches->hasInterwikiResults() ) {
+			if ( $textMatches->hasInterwikiResults() ) {
 				$out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(), $term ) );
 			}
 			// show results
-			if( $numTextMatches > 0 ) {
+			if ( $numTextMatches > 0 ) {
 				$out->addHTML( $this->showMatches( $textMatches ) );
 			}
 
 			$textMatches->free();
 		}
-		if( $num === 0 ) {
-			$out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>", array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
-			$this->showCreateLink( $t );
+		if ( $num === 0 ) {
+			if ( $textStatus ) {
+				$out->addHTML( '<div class="error">' .
+					htmlspecialchars( $textStatus->getWikiText( 'search-error' ) ) . '</div>' );
+			} else {
+				$out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
+					array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
+				$this->showCreateLink( $t );
+			}
 		}
 		$out->addHtml( "</div>" );
 
-		if( $num || $this->offset ) {
+		if ( $num || $this->offset ) {
 			$out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
 		}
 		wfRunHooks( 'SpecialSearchResultsAppend', array( $this, $out, $term ) );
@@ -421,16 +440,16 @@ class SpecialSearch extends SpecialPage {
 		// show direct page/create link if applicable
 
 		// Check DBkey !== '' in case of fragment link only.
-		if( is_null( $t ) || $t->getDBkey() === '' ) {
+		if ( is_null( $t ) || $t->getDBkey() === '' ) {
 			// invalid title
 			// preserve the paragraph for margins etc...
 			$this->getOutput()->addHtml( '<p></p>' );
 			return;
 		}
 
-		if( $t->isKnown() ) {
+		if ( $t->isKnown() ) {
 			$messageName = 'searchmenu-exists';
-		} elseif( $t->userCan( 'create', $this->getUser() ) ) {
+		} elseif ( $t->userCan( 'create', $this->getUser() ) ) {
 			$messageName = 'searchmenu-new';
 		} else {
 			$messageName = 'searchmenu-new-nocreate';
@@ -439,7 +458,7 @@ class SpecialSearch extends SpecialPage {
 		wfRunHooks( 'SpecialSearchCreateLink', array( $t, &$params ) );
 
 		// Extensions using the hook might still return an empty $messageName
-		if( $messageName ) {
+		if ( $messageName ) {
 			$this->getOutput()->wrapWikiMsg( "<p class=\"mw-search-createlink\">\n$1</p>", $params );
 		} else {
 			// preserve the paragraph for margins etc...
@@ -452,9 +471,9 @@ class SpecialSearch extends SpecialPage {
 	 */
 	protected function setupPage( $term ) {
 		# Should advanced UI be used?
-		$this->searchAdvanced = ($this->profile === 'advanced');
+		$this->searchAdvanced = ( $this->profile === 'advanced' );
 		$out = $this->getOutput();
-		if( strval( $term ) !== '' ) {
+		if ( strval( $term ) !== '' ) {
 			$out->setPageTitle( $this->msg( 'searchresults' ) );
 			$out->setHTMLTitle( $this->msg( 'pagetitle' )->rawParams(
 				$this->msg( 'searchresults-title' )->rawParams( $term )->text()
@@ -473,8 +492,8 @@ class SpecialSearch extends SpecialPage {
 	 */
 	protected function powerSearch( &$request ) {
 		$arr = array();
-		foreach( SearchEngine::searchableNamespaces() as $ns => $name ) {
-			if( $request->getCheck( 'ns' . $ns ) ) {
+		foreach ( SearchEngine::searchableNamespaces() as $ns => $name ) {
+			if ( $request->getCheck( 'ns' . $ns ) ) {
 				$arr[] = $ns;
 			}
 		}
@@ -490,10 +509,10 @@ class SpecialSearch extends SpecialPage {
 	protected function powerSearchOptions() {
 		$opt = array();
 		$opt['redirs'] = $this->searchRedirects ? 1 : 0;
-		if( $this->profile !== 'advanced' ) {
+		if ( $this->profile !== 'advanced' ) {
 			$opt['profile'] = $this->profile;
 		} else {
-			foreach( $this->namespaces as $n ) {
+			foreach ( $this->namespaces as $n ) {
 				$opt['ns' . $n] = 1;
 			}
 		}
@@ -515,12 +534,12 @@ class SpecialSearch extends SpecialPage {
 
 		$out = "";
 		$infoLine = $matches->getInfo();
-		if( !is_null( $infoLine ) ) {
+		if ( !is_null( $infoLine ) ) {
 			$out .= "\n<!-- {$infoLine} -->\n";
 		}
 		$out .= "<ul class='mw-search-results'>\n";
 		$result = $matches->next();
-		while( $result ) {
+		while ( $result ) {
 			$out .= $this->showHit( $result, $terms );
 			$result = $matches->next();
 		}
@@ -543,7 +562,7 @@ class SpecialSearch extends SpecialPage {
 	protected function showHit( $result, $terms ) {
 		wfProfileIn( __METHOD__ );
 
-		if( $result->isBrokenTitle() ) {
+		if ( $result->isBrokenTitle() ) {
 			wfProfileOut( __METHOD__ );
 			return "<!-- Broken link in search result -->\n";
 		}
@@ -552,8 +571,9 @@ class SpecialSearch extends SpecialPage {
 
 		$titleSnippet = $result->getTitleSnippet( $terms );
 
-		if( $titleSnippet == '' )
+		if ( $titleSnippet == '' ) {
 			$titleSnippet = null;
+		}
 
 		$link_t = clone $t;
 
@@ -568,7 +588,7 @@ class SpecialSearch extends SpecialPage {
 		//If page content is not readable, just return the title.
 		//This is not quite safe, but better than showing excerpts from non-readable pages
 		//Note that hiding the entry entirely would screw up paging.
-		if( !$t->userCan( 'read', $this->getUser() ) ) {
+		if ( !$t->userCan( 'read', $this->getUser() ) ) {
 			wfProfileOut( __METHOD__ );
 			return "<li>{$link}</li>\n";
 		}
@@ -576,7 +596,7 @@ class SpecialSearch extends SpecialPage {
 		// If the page doesn't *exist*... our search index is out of date.
 		// The least confusing at this point is to drop the result.
 		// You may get less results, but... oh well. :P
-		if( $result->isMissingRevision() ) {
+		if ( $result->isMissingRevision() ) {
 			wfProfileOut( __METHOD__ );
 			return "<!-- missing page " . htmlspecialchars( $t->getPrefixedText() ) . "-->\n";
 		}
@@ -588,9 +608,10 @@ class SpecialSearch extends SpecialPage {
 		$sectionText = $result->getSectionSnippet( $terms );
 		$redirect = '';
 
-		if( !is_null( $redirectTitle ) ) {
-			if( $redirectText == '' )
+		if ( !is_null( $redirectTitle ) ) {
+			if ( $redirectText == '' ) {
 				$redirectText = null;
+			}
 
 			$redirect = "<span class='searchalttitle'>" .
 				$this->msg( 'search-redirect' )->rawParams(
@@ -600,9 +621,10 @@ class SpecialSearch extends SpecialPage {
 
 		$section = '';
 
-		if( !is_null( $sectionTitle ) ) {
-			if( $sectionText == '' )
+		if ( !is_null( $sectionTitle ) ) {
+			if ( $sectionText == '' ) {
 				$sectionText = null;
+			}
 
 			$section = "<span class='searchalttitle'>" .
 				$this->msg( 'search-section' )->rawParams(
@@ -616,7 +638,7 @@ class SpecialSearch extends SpecialPage {
 		$lang = $this->getLanguage();
 
 		// format score
-		if( is_null( $result->getScore() ) ) {
+		if ( is_null( $result->getScore() ) ) {
 			// Search engine doesn't report scoring info
 			$score = '';
 		} else {
@@ -632,7 +654,7 @@ class SpecialSearch extends SpecialPage {
 		$size = $this->msg( 'search-result-size', $lang->formatSize( $byteSize ) )
 			->numParams( $wordCount )->escaped();
 
-		if( $t->getNamespace() == NS_CATEGORY ) {
+		if ( $t->getNamespace() == NS_CATEGORY ) {
 			$cat = Category::newFromTitle( $t );
 			$size = $this->msg( 'search-result-category-size' )
 				->numParams( $cat->getPageCount(), $cat->getSubcatCount(), $cat->getFileCount() )
@@ -643,7 +665,7 @@ class SpecialSearch extends SpecialPage {
 
 		// link to related articles if supported
 		$related = '';
-		if( $result->hasRelated() ) {
+		if ( $result->hasRelated() ) {
 			$st = SpecialPage::getTitleFor( 'Search' );
 			$stParams = array_merge(
 				$this->powerSearchOptions(),
@@ -663,11 +685,11 @@ class SpecialSearch extends SpecialPage {
 		}
 
 		// Include a thumbnail for media files...
-		if( $t->getNamespace() == NS_FILE ) {
+		if ( $t->getNamespace() == NS_FILE ) {
 			$img = wfFindFile( $t );
-			if( $img ) {
+			if ( $img ) {
 				$thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) );
-				if( $thumb ) {
+				if ( $thumb ) {
 					$desc = $this->msg( 'parentheses' )->rawParams( $img->getShortDesc() )->escaped();
 					wfProfileOut( __METHOD__ );
 					// Float doesn't seem to interact well with the bullets.
@@ -693,7 +715,7 @@ class SpecialSearch extends SpecialPage {
 
 		$html = null;
 
-		if ( wfRunHooks( 'ShowSearchHit', array (
+		if ( wfRunHooks( 'ShowSearchHit', array(
 			$this, $result, $terms,
 			&$link, &$redirect, &$section, &$extract,
 			&$score, &$size, &$date, &$related,
@@ -721,23 +743,23 @@ class SpecialSearch extends SpecialPage {
 		wfProfileIn( __METHOD__ );
 		$terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
 
-		$out = "<div id='mw-search-interwiki'><div id='mw-search-interwiki-caption'>".
+		$out = "<div id='mw-search-interwiki'><div id='mw-search-interwiki-caption'>" .
 			$this->msg( 'search-interwiki-caption' )->text() . "</div>\n";
 		$out .= "<ul class='mw-search-iwresults'>\n";
 
 		// work out custom project captions
 		$customCaptions = array();
 		$customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() ); // format per line <iwprefix>:<caption>
-		foreach( $customLines as $line ) {
+		foreach ( $customLines as $line ) {
 			$parts = explode( ":", $line, 2 );
-			if( count( $parts ) == 2 ) { // validate line
+			if ( count( $parts ) == 2 ) { // validate line
 				$customCaptions[$parts[0]] = $parts[1];
 			}
 		}
 
 		$prev = null;
 		$result = $matches->next();
-		while( $result ) {
+		while ( $result ) {
 			$out .= $this->showInterwikiHit( $result, $prev, $terms, $query, $customCaptions );
 			$prev = $result->getInterwikiPrefix();
 			$result = $matches->next();
@@ -762,10 +784,10 @@ class SpecialSearch extends SpecialPage {
 	 *
 	 * @return string
 	 */
-	protected function showInterwikiHit( $result, $lastInterwiki, $terms, $query, $customCaptions) {
+	protected function showInterwikiHit( $result, $lastInterwiki, $terms, $query, $customCaptions ) {
 		wfProfileIn( __METHOD__ );
 
-		if( $result->isBrokenTitle() ) {
+		if ( $result->isBrokenTitle() ) {
 			wfProfileOut( __METHOD__ );
 			return "<!-- Broken link in search result -->\n";
 		}
@@ -774,8 +796,9 @@ class SpecialSearch extends SpecialPage {
 
 		$titleSnippet = $result->getTitleSnippet( $terms );
 
-		if( $titleSnippet == '' )
+		if ( $titleSnippet == '' ) {
 			$titleSnippet = null;
+		}
 
 		$link = Linker::linkKnown(
 			$t,
@@ -786,9 +809,10 @@ class SpecialSearch extends SpecialPage {
 		$redirectTitle = $result->getRedirectTitle();
 		$redirectText = $result->getRedirectSnippet( $terms );
 		$redirect = '';
-		if( !is_null( $redirectTitle ) ) {
-			if( $redirectText == '' )
+		if ( !is_null( $redirectTitle ) ) {
+			if ( $redirectText == '' ) {
 				$redirectText = null;
+			}
 
 			$redirect = "<span class='searchalttitle'>" .
 				$this->msg( 'search-redirect' )->rawParams(
@@ -798,8 +822,8 @@ class SpecialSearch extends SpecialPage {
 
 		$out = "";
 		// display project name
-		if( is_null( $lastInterwiki ) || $lastInterwiki != $t->getInterwiki() ) {
-			if( array_key_exists( $t->getInterwiki(), $customCaptions ) ) {
+		if ( is_null( $lastInterwiki ) || $lastInterwiki != $t->getInterwiki() ) {
+			if ( array_key_exists( $t->getInterwiki(), $customCaptions ) ) {
 				// captions from 'search-interwiki-custom'
 				$caption = $customCaptions[$t->getInterwiki()];
 			} else {
@@ -856,17 +880,21 @@ class SpecialSearch extends SpecialPage {
 	 * @return String: HTML form
 	 */
 	protected function powerSearchBox( $term, $opts ) {
+		global $wgContLang;
+
 		// Groups namespaces into rows according to subject
 		$rows = array();
-		foreach( SearchEngine::searchableNamespaces() as $namespace => $name ) {
+		foreach ( SearchEngine::searchableNamespaces() as $namespace => $name ) {
 			$subject = MWNamespace::getSubject( $namespace );
-			if( !array_key_exists( $subject, $rows ) ) {
+			if ( !array_key_exists( $subject, $rows ) ) {
 				$rows[$subject] = "";
 			}
-			$name = str_replace( '_', ' ', $name );
-			if( $name == '' ) {
+
+			$name = $wgContLang->getConverter()->convertNamespace( $namespace );
+			if ( $name == '' ) {
 				$name = $this->msg( 'blanknamespace' )->text();
 			}
+
 			$rows[$subject] .=
 				Xml::openElement(
 					'td', array( 'style' => 'white-space: nowrap' )
@@ -879,27 +907,30 @@ class SpecialSearch extends SpecialPage {
 				) .
 				Xml::closeElement( 'td' );
 		}
+
 		$rows = array_values( $rows );
 		$numRows = count( $rows );
 
 		// Lays out namespaces in multiple floating two-column tables so they'll
 		// be arranged nicely while still accommodating different screen widths
 		$namespaceTables = '';
-		for( $i = 0; $i < $numRows; $i += 4 ) {
+		for ( $i = 0; $i < $numRows; $i += 4 ) {
 			$namespaceTables .= Xml::openElement(
 				'table',
 				array( 'cellpadding' => 0, 'cellspacing' => 0 )
 			);
-			for( $j = $i; $j < $i + 4 && $j < $numRows; $j++ ) {
+
+			for ( $j = $i; $j < $i + 4 && $j < $numRows; $j++ ) {
 				$namespaceTables .= Xml::tags( 'tr', null, $rows[$j] );
 			}
+
 			$namespaceTables .= Xml::closeElement( 'table' );
 		}
 
 		$showSections = array( 'namespaceTables' => $namespaceTables );
 
 		// Show redirects check only if backend supports it
-		if( $this->getSearchEngine()->supports( 'list-redirects' ) ) {
+		if ( $this->getSearchEngine()->supports( 'list-redirects' ) ) {
 			$showSections['redirects'] =
 				Xml::checkLabel( $this->msg( 'powersearch-redir' )->text(), 'redirs', 'redirs', $this->searchRedirects );
 		}
@@ -908,12 +939,11 @@ class SpecialSearch extends SpecialPage {
 
 		$hidden = '';
 		unset( $opts['redirs'] );
-		foreach( $opts as $key => $value ) {
+		foreach ( $opts as $key => $value ) {
 			$hidden .= Html::hidden( $key, $value );
 		}
 		// Return final output
-		return
-			Xml::openElement(
+		return Xml::openElement(
 				'fieldset',
 				array( 'id' => 'mw-searchoptions', 'style' => 'margin:0em;' )
 			) .
@@ -969,8 +999,10 @@ class SpecialSearch extends SpecialPage {
 
 		wfRunHooks( 'SpecialSearchProfiles', array( &$profiles ) );
 
-		foreach( $profiles as &$data ) {
-			if ( !is_array( $data['namespaces'] ) ) continue;
+		foreach ( $profiles as &$data ) {
+			if ( !is_array( $data['namespaces'] ) ) {
+				continue;
+			}
 			sort( $data['namespaces'] );
 		}
 
@@ -987,7 +1019,7 @@ class SpecialSearch extends SpecialPage {
 		$out = Xml::openElement( 'div', array( 'class' => 'mw-search-formheader' ) );
 
 		$bareterm = $term;
-		if( $this->startsWithImage( $term ) ) {
+		if ( $this->startsWithImage( $term ) ) {
 			// Deletes prefixes
 			$bareterm = substr( $term, strpos( $term, ':' ) + 1 );
 		}
@@ -1081,7 +1113,7 @@ class SpecialSearch extends SpecialPage {
 	 */
 	protected function makeSearchLink( $term, $namespaces, $label, $tooltip, $params = array() ) {
 		$opt = $params;
-		foreach( $namespaces as $n ) {
+		foreach ( $namespaces as $n ) {
 			$opt['ns' . $n] = 1;
 		}
 		$opt['redirs'] = $this->searchRedirects;
@@ -1098,7 +1130,8 @@ class SpecialSearch extends SpecialPage {
 			'a',
 			array(
 				'href' => $this->getTitle()->getLocalURL( $stParams ),
-				'title' => $tooltip),
+				'title' => $tooltip
+			),
 			$label
 		);
 	}
@@ -1113,7 +1146,7 @@ class SpecialSearch extends SpecialPage {
 		global $wgContLang;
 
 		$p = explode( ':', $term );
-		if( count( $p ) > 1 ) {
+		if ( count( $p ) > 1 ) {
 			return $wgContLang->getNsIndex( $p[0] ) == NS_FILE;
 		}
 		return false;
@@ -1130,7 +1163,7 @@ class SpecialSearch extends SpecialPage {
 		$allkeyword = $this->msg( 'searchall' )->inContentLanguage()->text();
 
 		$p = explode( ':', $term );
-		if( count( $p ) > 1 ) {
+		if ( count( $p ) > 1 ) {
 			return $p[0] == $allkeyword;
 		}
 		return false;
@@ -1143,7 +1176,8 @@ class SpecialSearch extends SpecialPage {
 	 */
 	public function getSearchEngine() {
 		if ( $this->searchEngine === null ) {
-			$this->searchEngine = SearchEngine::create();
+			$this->searchEngine = $this->searchEngineType ?
+				SearchEngine::create( $this->searchEngineType ) : SearchEngine::create();
 		}
 		return $this->searchEngine;
 	}
@@ -1162,6 +1196,6 @@ class SpecialSearch extends SpecialPage {
 	}
 
 	protected function getGroupName() {
-		return 'redirects';
+		return 'pages';
 	}
 }
diff --git a/includes/specials/SpecialShortpages.php b/includes/specials/SpecialShortpages.php
index 1be7fbed..9b50875a 100644
--- a/includes/specials/SpecialShortpages.php
+++ b/includes/specials/SpecialShortpages.php
@@ -38,15 +38,15 @@ class ShortPagesPage extends QueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array ( 'page' ),
-			'fields' => array ( 'namespace' => 'page_namespace',
+		return array(
+			'tables' => array( 'page' ),
+			'fields' => array( 'namespace' => 'page_namespace',
 					'title' => 'page_title',
 					'value' => 'page_len' ),
-			'conds' => array ( 'page_namespace' =>
+			'conds' => array( 'page_namespace' =>
 					MWNamespace::getContentNamespaces(),
 					'page_is_redirect' => 0 ),
-			'options' => array ( 'USE INDEX' => 'page_redirect_namespace_len' )
+			'options' => array( 'USE INDEX' => 'page_redirect_namespace_len' )
 		);
 	}
 
@@ -56,8 +56,7 @@ class ShortPagesPage extends QueryPage {
 
 	/**
 	 * @param $db DatabaseBase
-	 * @param $res
-	 * @return void
+	 * @param ResultWrapper $res
 	 */
 	function preprocessResults( $db, $res ) {
 		# There's no point doing a batch check if we aren't caching results;
@@ -79,6 +78,11 @@ class ShortPagesPage extends QueryPage {
 		return false;
 	}
 
+	/**
+	 * @param Skin $skin
+	 * @param object $result Result row
+	 * @return string
+	 */
 	function formatResult( $skin, $result ) {
 		$dm = $this->getLanguage()->getDirMark();
 
diff --git a/includes/specials/SpecialSpecialpages.php b/includes/specials/SpecialSpecialpages.php
index 57fffb84..47c89d0d 100644
--- a/includes/specials/SpecialSpecialpages.php
+++ b/includes/specials/SpecialSpecialpages.php
@@ -53,17 +53,18 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
 
 		$pages = SpecialPageFactory::getUsablePages( $this->getUser() );
 
-		if( !count( $pages ) ) {
+		if ( !count( $pages ) ) {
 			# Yeah, that was pointless. Thanks for coming.
 			return false;
 		}
 
 		/** Put them into a sortable array */
 		$groups = array();
+		/** @var SpecialPage $page */
 		foreach ( $pages as $page ) {
 			if ( $page->isListed() ) {
 				$group = $page->getFinalGroupName();
-				if( !isset( $groups[$group] ) ) {
+				if ( !isset( $groups[$group] ) ) {
 					$groups[$group] = array();
 				}
 				$groups[$group][$page->getDescription()] = array(
@@ -76,13 +77,13 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
 
 		/** Sort */
 		if ( $wgSortSpecialPages ) {
-			foreach( $groups as $group => $sortedPages ) {
+			foreach ( $groups as $group => $sortedPages ) {
 				ksort( $groups[$group] );
 			}
 		}
 
 		/** Always move "other" to end */
-		if( array_key_exists( 'other', $groups ) ) {
+		if ( array_key_exists( 'other', $groups ) ) {
 			$other = $groups['other'];
 			unset( $groups['other'] );
 			$groups['other'] = $other;
@@ -104,12 +105,12 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
 
 			$out->wrapWikiMsg( "<h2 class=\"mw-specialpagesgroup\" id=\"mw-specialpagesgroup-$group\">$1</h2>\n", "specialpages-group-$group" );
 			$out->addHTML(
-				Html::openElement( 'table', array( 'style' => 'width:100%;', 'class' => 'mw-specialpages-table' ) ) ."\n" .
+				Html::openElement( 'table', array( 'style' => 'width:100%;', 'class' => 'mw-specialpages-table' ) ) . "\n" .
 				Html::openElement( 'tr' ) . "\n" .
 				Html::openElement( 'td', array( 'style' => 'width:30%;vertical-align:top' ) ) . "\n" .
 				Html::openElement( 'ul' ) . "\n"
 			);
-			foreach( $sortedPages as $desc => $specialpage ) {
+			foreach ( $sortedPages as $desc => $specialpage ) {
 				list( $title, $restricted, $cached ) = $specialpage;
 
 				$pageClasses = array();
@@ -117,7 +118,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
 					$includesCachedPages = true;
 					$pageClasses[] = 'mw-specialpagecached';
 				}
-				if( $restricted ) {
+				if ( $restricted ) {
 					$includesRestrictedPages = true;
 					$pageClasses[] = 'mw-specialpagerestricted';
 				}
@@ -127,7 +128,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
 
 				# Split up the larger groups
 				$count++;
-				if( $total > 3 && $count == $middle ) {
+				if ( $total > 3 && $count == $middle ) {
 					$out->addHTML(
 						Html::closeElement( 'ul' ) . Html::closeElement( 'td' ) .
 						Html::element( 'td', array( 'style' => 'width:10%' ), '' ) .
diff --git a/includes/specials/SpecialStatistics.php b/includes/specials/SpecialStatistics.php
index ee768263..f26d1a60 100644
--- a/includes/specials/SpecialStatistics.php
+++ b/includes/specials/SpecialStatistics.php
@@ -53,18 +53,18 @@ class SpecialStatistics extends SpecialPage {
 
 		# Staticic - views
 		$viewsStats = '';
-		if( !$wgDisableCounters ) {
+		if ( !$wgDisableCounters ) {
 			$viewsStats = $this->getViewsStats();
 		}
 
 		# Set active user count
-		if( !$wgMiserMode ) {
+		if ( !$wgMiserMode ) {
 			$key = wfMemcKey( 'sitestats', 'activeusers-updated' );
 			// Re-calculate the count if the last tally is old...
-			if( !$wgMemc->get( $key ) ) {
+			if ( !$wgMemc->get( $key ) ) {
 				$dbw = wfGetDB( DB_MASTER );
 				SiteStatsUpdate::cacheUpdate( $dbw );
-				$wgMemc->set( $key, '1', 24*3600 ); // don't update for 1 day
+				$wgMemc->set( $key, '1', 24 * 3600 ); // don't update for 1 day
 			}
 		}
 
@@ -84,13 +84,13 @@ class SpecialStatistics extends SpecialPage {
 		$text .= $viewsStats;
 
 		# Statistic - popular pages
-		if( !$wgDisableCounters && !$wgMiserMode ) {
+		if ( !$wgDisableCounters && !$wgMiserMode ) {
 			$text .= $this->getMostViewedPages();
 		}
 
 		# Statistic - other
 		$extraStats = array();
-		if( wfRunHooks( 'SpecialStatsAddExtra', array( &$extraStats ) ) ) {
+		if ( wfRunHooks( 'SpecialStatsAddExtra', array( &$extraStats ) ) ) {
 			$text .= $this->getOtherStats( $extraStats );
 		}
 
@@ -111,15 +111,15 @@ class SpecialStatistics extends SpecialPage {
 	 * @param $number  Float: a statistical number
 	 * @param $trExtraParams  Array: params to table row, see Html::elememt
 	 * @param $descMsg  String: message key
-	 * @param $descMsgParam  Array: message params
+	 * @param array|string $descMsgParam Message parameters
 	 * @return string table row in HTML format
 	 */
 	private function formatRow( $text, $number, $trExtraParams = array(), $descMsg = '', $descMsgParam = '' ) {
-		if( $descMsg ) {
+		if ( $descMsg ) {
 			$msg = $this->msg( $descMsg, $descMsgParam );
 			if ( $msg->exists() ) {
 				$descriptionText = $this->msg( 'parentheses' )->rawParams( $msg->parse() )->escaped();
-				$text .= "<br />" . Xml::element( 'small', array( 'class' => 'mw-statistic-desc'),
+				$text .= "<br />" . Xml::element( 'small', array( 'class' => 'mw-statistic-desc' ),
 					" $descriptionText" );
 			}
 		}
@@ -185,7 +185,7 @@ class SpecialStatistics extends SpecialPage {
 	private function getGroupStats() {
 		global $wgGroupPermissions, $wgImplicitGroups;
 		$text = '';
-		foreach( $wgGroupPermissions as $group => $permissions ) {
+		foreach ( $wgGroupPermissions as $group => $permissions ) {
 			# Skip generic * and implicit groups
 			if ( in_array( $group, $wgImplicitGroups ) || $group == '*' ) {
 				continue;
@@ -217,7 +217,7 @@ class SpecialStatistics extends SpecialPage {
 			# Add a class when a usergroup contains no members to allow hiding these rows
 			$classZero = '';
 			$countUsers = SiteStats::numberingroup( $groupname );
-			if( $countUsers == 0 ) {
+			if ( $countUsers == 0 ) {
 				$classZero = ' statistics-group-zero';
 			}
 			$text .= $this->formatRow( $grouppage . ' ' . $grouplink,
@@ -233,11 +233,11 @@ class SpecialStatistics extends SpecialPage {
 			Xml::closeElement( 'tr' ) .
 				$this->formatRow( $this->msg( 'statistics-views-total' )->parse(),
 					$this->getLanguage()->formatNum( $this->views ),
-						array ( 'class' => 'mw-statistics-views-total' ), 'statistics-views-total-desc' ) .
+						array( 'class' => 'mw-statistics-views-total' ), 'statistics-views-total-desc' ) .
 				$this->formatRow( $this->msg( 'statistics-views-peredit' )->parse(),
 					$this->getLanguage()->formatNum( sprintf( '%.2f', $this->edits ?
 						$this->views / $this->edits : 0 ) ),
-						array ( 'class' => 'mw-statistics-views-peredit' ) );
+						array( 'class' => 'mw-statistics-views-peredit' ) );
 	}
 
 	private function getMostViewedPages() {
@@ -260,13 +260,13 @@ class SpecialStatistics extends SpecialPage {
 					'LIMIT' => 10,
 				)
 			);
-			if( $res->numRows() > 0 ) {
+			if ( $res->numRows() > 0 ) {
 				$text .= Xml::openElement( 'tr' );
 				$text .= Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-mostpopular' )->parse() );
 				$text .= Xml::closeElement( 'tr' );
 				foreach ( $res as $row ) {
 					$title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-					if( $title instanceof Title ) {
+					if ( $title instanceof Title ) {
 						$text .= $this->formatRow( Linker::link( $title ),
 								$this->getLanguage()->formatNum( $row->page_counter ) );
 
@@ -287,8 +287,7 @@ class SpecialStatistics extends SpecialPage {
 	private function getOtherStats( array $stats ) {
 		$return = '';
 
-		foreach( $stats as $header => $items ) {
-
+		foreach ( $stats as $header => $items ) {
 			// Identify the structure used
 			if ( is_array( $items ) ) {
 
@@ -298,11 +297,11 @@ class SpecialStatistics extends SpecialPage {
 				}
 
 				// Collect all items that belong to the same header
-				foreach( $items as $key => $value ) {
+				foreach ( $items as $key => $value ) {
 					$name = $this->msg( $key )->parse();
 					$number = htmlspecialchars( $value );
 
-					$return .= $this->formatRow( $name, $this->getLanguage()->formatNum( $number ), array( 'class' => 'mw-statistics-hook' ) );
+					$return .= $this->formatRow( $name, $this->getLanguage()->formatNum( $number ), array( 'class' => 'mw-statistics-hook', 'id' => 'mw-' . $key ) );
 				}
 			} else {
 				// Create the legacy header only once
diff --git a/includes/specials/SpecialTags.php b/includes/specials/SpecialTags.php
index 6d161031..077e7cbc 100644
--- a/includes/specials/SpecialTags.php
+++ b/includes/specials/SpecialTags.php
@@ -27,6 +27,10 @@
  * @ingroup SpecialPage
  */
 class SpecialTags extends SpecialPage {
+	/**
+	 * @var array List of defined tags
+	 */
+	public $definedTags;
 
 	function __construct() {
 		parent::__construct( 'Tags' );
@@ -44,51 +48,66 @@ class SpecialTags extends SpecialPage {
 		$html = Xml::tags( 'tr', null, Xml::tags( 'th', null, $this->msg( 'tags-tag' )->parse() ) .
 				Xml::tags( 'th', null, $this->msg( 'tags-display-header' )->parse() ) .
 				Xml::tags( 'th', null, $this->msg( 'tags-description-header' )->parse() ) .
+				Xml::tags( 'th', null, $this->msg( 'tags-active-header' )->parse() ) .
 				Xml::tags( 'th', null, $this->msg( 'tags-hitcount-header' )->parse() )
 			);
-		$dbr = wfGetDB( DB_SLAVE );
-		$res = $dbr->select( 'change_tag', array( 'ct_tag', 'hitcount' => 'count(*)' ),
-			array(), __METHOD__, array( 'GROUP BY' => 'ct_tag', 'ORDER BY' => 'hitcount DESC' ) );
 
-		foreach ( $res as $row ) {
-			$html .= $this->doTagRow( $row->ct_tag, $row->hitcount );
-		}
+		// Used in #doTagRow()
+		$this->definedTags = array_fill_keys( ChangeTags::listDefinedTags(), true );
 
-		foreach( ChangeTags::listDefinedTags() as $tag ) {
-			$html .= $this->doTagRow( $tag, 0 );
+		foreach ( ChangeTags::tagUsageStatistics() as $tag => $hitcount ) {
+			$html .= $this->doTagRow( $tag, $hitcount );
 		}
 
-		$out->addHTML( Xml::tags( 'table', array( 'class' => 'wikitable mw-tags-table' ), $html ) );
+		$out->addHTML( Xml::tags(
+			'table',
+			array( 'class' => 'wikitable sortable mw-tags-table' ),
+			$html
+		) );
 	}
 
 	function doTagRow( $tag, $hitcount ) {
-		static $doneTags = array();
-
-		if ( in_array( $tag, $doneTags ) ) {
-			return '';
-		}
-
+		$user = $this->getUser();
 		$newRow = '';
 		$newRow .= Xml::tags( 'td', null, Xml::element( 'code', null, $tag ) );
 
 		$disp = ChangeTags::tagDescription( $tag );
-		$disp .= ' ';
-		$editLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag" ), $this->msg( 'tags-edit' )->escaped() );
-		$disp .= $this->msg( 'parentheses' )->rawParams( $editLink )->escaped();
+		if ( $user->isAllowed( 'editinterface' ) ) {
+			$disp .= ' ';
+			$editLink = Linker::link(
+				Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag" ),
+				$this->msg( 'tags-edit' )->escaped()
+			);
+			$disp .= $this->msg( 'parentheses' )->rawParams( $editLink )->escaped();
+		}
 		$newRow .= Xml::tags( 'td', null, $disp );
 
 		$msg = $this->msg( "tag-$tag-description" );
 		$desc = !$msg->exists() ? '' : $msg->parse();
-		$desc .= ' ';
-		$editDescLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag-description" ), $this->msg( 'tags-edit' )->escaped() );
-		$desc .= $this->msg( 'parentheses' )->rawParams( $editDescLink )->escaped();
+		if ( $user->isAllowed( 'editinterface' ) ) {
+			$desc .= ' ';
+			$editDescLink = Linker::link(
+				Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag-description" ),
+				$this->msg( 'tags-edit' )->escaped()
+			);
+			$desc .= $this->msg( 'parentheses' )->rawParams( $editDescLink )->escaped();
+		}
 		$newRow .= Xml::tags( 'td', null, $desc );
 
-		$hitcount = $this->msg( 'tags-hitcount' )->numParams( $hitcount )->escaped();
-		$hitcount = Linker::link( SpecialPage::getTitleFor( 'Recentchanges' ), $hitcount, array(), array( 'tagfilter' => $tag ) );
-		$newRow .= Xml::tags( 'td', null, $hitcount );
+		$active = isset( $this->definedTags[$tag] ) ? 'tags-active-yes' : 'tags-active-no';
+		$active = $this->msg( $active )->escaped();
+		$newRow .= Xml::tags( 'td', null, $active );
+
+		$hitcountLabel = $this->msg( 'tags-hitcount' )->numParams( $hitcount )->escaped();
+		$hitcountLink = Linker::link(
+			SpecialPage::getTitleFor( 'Recentchanges' ),
+			$hitcountLabel,
+			array(),
+			array( 'tagfilter' => $tag )
+		);
 
-		$doneTags[] = $tag;
+		// add raw $hitcount for sorting, because tags-hitcount contains numbers and letters
+		$newRow .= Xml::tags( 'td', array( 'data-sort-value' => $hitcount ), $hitcountLink );
 
 		return Xml::tags( 'tr', null, $newRow ) . "\n";
 	}
diff --git a/includes/specials/SpecialUnblock.php b/includes/specials/SpecialUnblock.php
index c4a53cf0..ca93b6d1 100644
--- a/includes/specials/SpecialUnblock.php
+++ b/includes/specials/SpecialUnblock.php
@@ -56,8 +56,8 @@ class SpecialUnblock extends SpecialPage {
 		$form->setSubmitTextMsg( 'ipusubmit' );
 		$form->addPreText( $this->msg( 'unblockiptext' )->parseAsBlock() );
 
-		if( $form->show() ) {
-			switch( $this->type ) {
+		if ( $form->show() ) {
+			switch ( $this->type ) {
 				case Block::TYPE_USER:
 				case Block::TYPE_IP:
 					$out->addWikiMsg( 'unblocked', wfEscapeWikiText( $this->target ) );
@@ -92,21 +92,21 @@ class SpecialUnblock extends SpecialPage {
 			)
 		);
 
-		if( $this->block instanceof Block ) {
+		if ( $this->block instanceof Block ) {
 			list( $target, $type ) = $this->block->getTargetAndType();
 
 			# Autoblocks are logged as "autoblock #123 because the IP was recently used by
 			# User:Foo, and we've just got any block, auto or not, that applies to a target
 			# the user has specified.  Someone could be fishing to connect IPs to autoblocks,
 			# so don't show any distinction between unblocked IPs and autoblocked IPs
-			if( $type == Block::TYPE_AUTO && $this->type == Block::TYPE_IP ) {
+			if ( $type == Block::TYPE_AUTO && $this->type == Block::TYPE_IP ) {
 				$fields['Target']['default'] = $this->target;
 				unset( $fields['Name'] );
 
 			} else {
 				$fields['Target']['default'] = $target;
 				$fields['Target']['type'] = 'hidden';
-				switch( $type ) {
+				switch ( $type ) {
 					case Block::TYPE_USER:
 					case Block::TYPE_IP:
 						$fields['Name']['default'] = Linker::link(
@@ -138,6 +138,8 @@ class SpecialUnblock extends SpecialPage {
 
 	/**
 	 * Submit callback for an HTMLForm object
+	 * @param array $data
+	 * @param HTMLForm $form
 	 * @return Array( Array(message key, parameters)
 	 */
 	public static function processUIUnblock( array $data, HTMLForm $form ) {
@@ -157,7 +159,7 @@ class SpecialUnblock extends SpecialPage {
 		$target = $data['Target'];
 		$block = Block::newFromTarget( $data['Target'] );
 
-		if( !$block instanceof Block ) {
+		if ( !$block instanceof Block ) {
 			return array( array( 'ipb_cant_unblock', $target ) );
 		}
 
@@ -172,14 +174,14 @@ class SpecialUnblock extends SpecialPage {
 		# If the specified IP is a single address, and the block is a range block, don't
 		# unblock the whole range.
 		list( $target, $type ) = SpecialBlock::getTargetAndType( $target );
-		if( $block->getType() == Block::TYPE_RANGE && $type == Block::TYPE_IP ) {
+		if ( $block->getType() == Block::TYPE_RANGE && $type == Block::TYPE_IP ) {
 			$range = $block->getTarget();
 			return array( array( 'ipb_blocked_as_range', $target, $range ) );
 		}
 
 		# If the name was hidden and the blocking user cannot hide
 		# names, then don't allow any block removals...
-		if( !$performer->isAllowed( 'hideuser' ) && $block->mHideName ) {
+		if ( !$performer->isAllowed( 'hideuser' ) && $block->mHideName ) {
 			return array( 'unblock-hideuser' );
 		}
 
@@ -189,7 +191,7 @@ class SpecialUnblock extends SpecialPage {
 		}
 
 		# Unset _deleted fields as needed
-		if( $block->mHideName ) {
+		if ( $block->mHideName ) {
 			# Something is deeply FUBAR if this is not a User object, but who knows?
 			$id = $block->getTarget() instanceof User
 				? $block->getTarget()->getID()
@@ -209,7 +211,7 @@ class SpecialUnblock extends SpecialPage {
 
 		# Make log entry
 		$log = new LogPage( 'block' );
-		$log->addEntry( 'unblock', $page, $data['Reason'] );
+		$log->addEntry( 'unblock', $page, $data['Reason'], array(), $performer );
 
 		return true;
 	}
diff --git a/includes/specials/SpecialUncategorizedcategories.php b/includes/specials/SpecialUncategorizedcategories.php
index 54b20dde..1cc40a9e 100644
--- a/includes/specials/SpecialUncategorizedcategories.php
+++ b/includes/specials/SpecialUncategorizedcategories.php
@@ -34,11 +34,11 @@ class UncategorizedCategoriesPage extends UncategorizedPagesPage {
 
 	/**
 	 * Formats the result
-	 * @param $skin The current skin
-	 * @param $result The query result
+	 * @param Skin $skin The current skin
+	 * @param object $result The query result
 	 * @return string The category link
 	 */
-	function formatResult ( $skin, $result ) {
+	function formatResult( $skin, $result ) {
 		$title = Title::makeTitle( NS_CATEGORY, $result->title );
 		$text = $title->getText();
 
diff --git a/includes/specials/SpecialUncategorizedimages.php b/includes/specials/SpecialUncategorizedimages.php
index 53aa3f34..3bfcedec 100644
--- a/includes/specials/SpecialUncategorizedimages.php
+++ b/includes/specials/SpecialUncategorizedimages.php
@@ -47,7 +47,7 @@ class UncategorizedImagesPage extends ImageQueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
+		return array(
 			'tables' => array( 'page', 'categorylinks' ),
 			'fields' => array( 'namespace' => 'page_namespace',
 					'title' => 'page_title',
diff --git a/includes/specials/SpecialUncategorizedpages.php b/includes/specials/SpecialUncategorizedpages.php
index b518e6fb..8bc9e489 100644
--- a/includes/specials/SpecialUncategorizedpages.php
+++ b/includes/specials/SpecialUncategorizedpages.php
@@ -47,17 +47,17 @@ class UncategorizedPagesPage extends PageQueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array ( 'page', 'categorylinks' ),
-			'fields' => array ( 'namespace' => 'page_namespace',
+		return array(
+			'tables' => array( 'page', 'categorylinks' ),
+			'fields' => array( 'namespace' => 'page_namespace',
 					'title' => 'page_title',
 					'value' => 'page_title' ),
 			// default for page_namespace is all content namespaces (if requestedNamespace is false)
 			// otherwise, page_namespace is requestedNamespace
-			'conds' => array ( 'cl_from IS NULL',
+			'conds' => array( 'cl_from IS NULL',
 					'page_namespace' => ( $this->requestedNamespace !== false ? $this->requestedNamespace : MWNamespace::getContentNamespaces() ),
 					'page_is_redirect' => 0 ),
-			'join_conds' => array ( 'categorylinks' => array (
+			'join_conds' => array( 'categorylinks' => array(
 					'LEFT JOIN', 'cl_from = page_id' ) )
 		);
 	}
@@ -65,8 +65,9 @@ class UncategorizedPagesPage extends PageQueryPage {
 	function getOrderFields() {
 		// For some crazy reason ordering by a constant
 		// causes a filesort
-		if( $this->requestedNamespace === false && count( MWNamespace::getContentNamespaces() ) > 1 )
+		if ( $this->requestedNamespace === false && count( MWNamespace::getContentNamespaces() ) > 1 ) {
 			return array( 'page_namespace', 'page_title' );
+		}
 		return array( 'page_title' );
 	}
 
diff --git a/includes/specials/SpecialUndelete.php b/includes/specials/SpecialUndelete.php
index e0363481..d4aed113 100644
--- a/includes/specials/SpecialUndelete.php
+++ b/includes/specials/SpecialUndelete.php
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class PageArchive {
-
 	/**
 	 * @var Title
 	 */
@@ -44,7 +43,7 @@ class PageArchive {
 	protected $revisionStatus;
 
 	function __construct( $title ) {
-		if( is_null( $title ) ) {
+		if ( is_null( $title ) ) {
 			throw new MWException( __METHOD__ . ' given a null title.' );
 		}
 		$this->title = $title;
@@ -67,14 +66,14 @@ class PageArchive {
 	 * given title prefix.
 	 * Returns result wrapper with (ar_namespace, ar_title, count) fields.
 	 *
-	 * @param string $prefix title prefix
+	 * @param string $prefix Title prefix
 	 * @return ResultWrapper
 	 */
 	public static function listPagesByPrefix( $prefix ) {
 		$dbr = wfGetDB( DB_SLAVE );
 
 		$title = Title::newFromText( $prefix );
-		if( $title ) {
+		if ( $title ) {
 			$ns = $title->getNamespace();
 			$prefix = $title->getDBkey();
 		} else {
@@ -82,36 +81,36 @@ class PageArchive {
 			// @todo handle bare namespace names cleanly?
 			$ns = 0;
 		}
+
 		$conds = array(
 			'ar_namespace' => $ns,
 			'ar_title' . $dbr->buildLike( $prefix, $dbr->anyString() ),
 		);
+
 		return self::listPages( $dbr, $conds );
 	}
 
 	/**
-	 * @param $dbr DatabaseBase
-	 * @param $condition
+	 * @param DatabaseBase $dbr
+	 * @param string|array $condition
 	 * @return bool|ResultWrapper
 	 */
 	protected static function listPages( $dbr, $condition ) {
-		return $dbr->resultObject(
-			$dbr->select(
-				array( 'archive' ),
-				array(
-					'ar_namespace',
-					'ar_title',
-					'count' => 'COUNT(*)'
-				),
-				$condition,
-				__METHOD__,
-				array(
-					'GROUP BY' => array( 'ar_namespace', 'ar_title' ),
-					'ORDER BY' => array( 'ar_namespace', 'ar_title' ),
-					'LIMIT' => 100,
-				)
+		return $dbr->resultObject( $dbr->select(
+			array( 'archive' ),
+			array(
+				'ar_namespace',
+				'ar_title',
+				'count' => 'COUNT(*)'
+			),
+			$condition,
+			__METHOD__,
+			array(
+				'GROUP BY' => array( 'ar_namespace', 'ar_title' ),
+				'ORDER BY' => array( 'ar_namespace', 'ar_title' ),
+				'LIMIT' => 100,
 			)
-		);
+		) );
 	}
 
 	/**
@@ -141,8 +140,8 @@ class PageArchive {
 				'ar_title' => $this->title->getDBkey() ),
 			__METHOD__,
 			array( 'ORDER BY' => 'ar_timestamp DESC' ) );
-		$ret = $dbr->resultObject( $res );
-		return $ret;
+
+		return $dbr->resultObject( $res );
 	}
 
 	/**
@@ -154,26 +153,28 @@ class PageArchive {
 	 * @todo Does this belong in Image for fuller encapsulation?
 	 */
 	function listFiles() {
-		if( $this->title->getNamespace() == NS_FILE ) {
-			$dbr = wfGetDB( DB_SLAVE );
-			$res = $dbr->select(
-				'filearchive',
-				ArchivedFile::selectFields(),
-				array( 'fa_name' => $this->title->getDBkey() ),
-				__METHOD__,
-				array( 'ORDER BY' => 'fa_timestamp DESC' ) );
-			$ret = $dbr->resultObject( $res );
-			return $ret;
+		if ( $this->title->getNamespace() != NS_FILE ) {
+			return null;
 		}
-		return null;
+
+		$dbr = wfGetDB( DB_SLAVE );
+		$res = $dbr->select(
+			'filearchive',
+			ArchivedFile::selectFields(),
+			array( 'fa_name' => $this->title->getDBkey() ),
+			__METHOD__,
+			array( 'ORDER BY' => 'fa_timestamp DESC' )
+		);
+
+		return $dbr->resultObject( $res );
 	}
 
 	/**
 	 * Return a Revision object containing data for the deleted revision.
 	 * Note that the result *may* or *may not* have a null page ID.
 	 *
-	 * @param $timestamp String
-	 * @return Revision
+	 * @param string $timestamp
+	 * @return Revision|null
 	 */
 	function getRevision( $timestamp ) {
 		global $wgContentHandlerUseDB;
@@ -203,14 +204,15 @@ class PageArchive {
 		$row = $dbr->selectRow( 'archive',
 			$fields,
 			array( 'ar_namespace' => $this->title->getNamespace(),
-					'ar_title' => $this->title->getDBkey(),
-					'ar_timestamp' => $dbr->timestamp( $timestamp ) ),
+				'ar_title' => $this->title->getDBkey(),
+				'ar_timestamp' => $dbr->timestamp( $timestamp ) ),
 			__METHOD__ );
-		if( $row ) {
+
+		if ( $row ) {
 			return Revision::newFromArchiveRow( $row, array( 'title' => $this->title ) );
-		} else {
-			return null;
 		}
+
+		return null;
 	}
 
 	/**
@@ -220,8 +222,8 @@ class PageArchive {
 	 * May produce unexpected results in case of history merges or other
 	 * unusual time issues.
 	 *
-	 * @param $timestamp String
-	 * @return Revision or null
+	 * @param string $timestamp
+	 * @return Revision|null Null when there is no previous revision
 	 */
 	function getPreviousRevision( $timestamp ) {
 		$dbr = wfGetDB( DB_SLAVE );
@@ -246,7 +248,7 @@ class PageArchive {
 				'page_title' => $this->title->getDBkey(),
 				'page_id = rev_page',
 				'rev_timestamp < ' .
-						$dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ),
+					$dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ),
 			__METHOD__,
 			array(
 				'ORDER BY' => 'rev_timestamp DESC',
@@ -254,38 +256,39 @@ class PageArchive {
 		$prevLive = $row ? wfTimestamp( TS_MW, $row->rev_timestamp ) : false;
 		$prevLiveId = $row ? intval( $row->rev_id ) : null;
 
-		if( $prevLive && $prevLive > $prevDeleted ) {
+		if ( $prevLive && $prevLive > $prevDeleted ) {
 			// Most prior revision was live
 			return Revision::newFromId( $prevLiveId );
-		} elseif( $prevDeleted ) {
+		} elseif ( $prevDeleted ) {
 			// Most prior revision was deleted
 			return $this->getRevision( $prevDeleted );
-		} else {
-			// No prior revision on this page.
-			return null;
 		}
+
+		// No prior revision on this page.
+		return null;
 	}
 
 	/**
 	 * Get the text from an archive row containing ar_text, ar_flags and ar_text_id
 	 *
-	 * @param $row Object: database row
-	 * @return Revision
+	 * @param object $row Database row
+	 * @return string
 	 */
 	function getTextFromRow( $row ) {
-		if( is_null( $row->ar_text_id ) ) {
+		if ( is_null( $row->ar_text_id ) ) {
 			// An old row from MediaWiki 1.4 or previous.
 			// Text is embedded in this row in classic compression format.
 			return Revision::getRevisionText( $row, 'ar_' );
-		} else {
-			// New-style: keyed to the text storage backend.
-			$dbr = wfGetDB( DB_SLAVE );
-			$text = $dbr->selectRow( 'text',
-				array( 'old_text', 'old_flags' ),
-				array( 'old_id' => $row->ar_text_id ),
-				__METHOD__ );
-			return Revision::getRevisionText( $text );
 		}
+
+		// New-style: keyed to the text storage backend.
+		$dbr = wfGetDB( DB_SLAVE );
+		$text = $dbr->selectRow( 'text',
+			array( 'old_text', 'old_flags' ),
+			array( 'old_id' => $row->ar_text_id ),
+			__METHOD__ );
+
+		return Revision::getRevisionText( $text );
 	}
 
 	/**
@@ -294,7 +297,7 @@ class PageArchive {
 	 *
 	 * If there are no archived revisions for the page, returns NULL.
 	 *
-	 * @return String
+	 * @return string|null
 	 */
 	function getLastRevisionText() {
 		$dbr = wfGetDB( DB_SLAVE );
@@ -304,17 +307,18 @@ class PageArchive {
 				'ar_title' => $this->title->getDBkey() ),
 			__METHOD__,
 			array( 'ORDER BY' => 'ar_timestamp DESC' ) );
-		if( $row ) {
+
+		if ( $row ) {
 			return $this->getTextFromRow( $row );
-		} else {
-			return null;
 		}
+
+		return null;
 	}
 
 	/**
 	 * Quick check if any archived revisions are present for the page.
 	 *
-	 * @return Boolean
+	 * @return boolean
 	 */
 	function isDeleted() {
 		$dbr = wfGetDB( DB_SLAVE );
@@ -323,6 +327,7 @@ class PageArchive {
 				'ar_title' => $this->title->getDBkey() ),
 			__METHOD__
 		);
+
 		return ( $n > 0 );
 	}
 
@@ -331,11 +336,11 @@ class PageArchive {
 	 * Once restored, the items will be removed from the archive tables.
 	 * The deletion log will be updated with an undeletion notice.
 	 *
-	 * @param array $timestamps pass an empty array to restore all revisions, otherwise list the ones to undelete.
-	 * @param $comment String
-	 * @param $fileVersions Array
-	 * @param $unsuppress Boolean
-	 * @param $user User doing the action, or null to use $wgUser
+	 * @param array $timestamps Pass an empty array to restore all revisions, otherwise list the ones to undelete.
+	 * @param string $comment
+	 * @param array $fileVersions
+	 * @param bool $unsuppress
+	 * @param User $user User performing the action, or null to use $wgUser
 	 *
 	 * @return array(number of file revisions restored, number of image revisions restored, log message)
 	 * on success, false on failure
@@ -348,7 +353,7 @@ class PageArchive {
 		$restoreText = $restoreAll || !empty( $timestamps );
 		$restoreFiles = $restoreAll || !empty( $fileVersions );
 
-		if( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
+		if ( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
 			$img = wfLocalFile( $this->title );
 			$this->fileStatus = $img->restore( $fileVersions, $unsuppress );
 			if ( !$this->fileStatus->isOK() ) {
@@ -359,9 +364,9 @@ class PageArchive {
 			$filesRestored = 0;
 		}
 
-		if( $restoreText ) {
+		if ( $restoreText ) {
 			$this->revisionStatus = $this->undeleteRevisions( $timestamps, $unsuppress, $comment );
-			if( !$this->revisionStatus->isOK() ) {
+			if ( !$this->revisionStatus->isOK() ) {
 				return false;
 			}
 
@@ -372,13 +377,13 @@ class PageArchive {
 
 		// Touch the log!
 
-		if( $textRestored && $filesRestored ) {
+		if ( $textRestored && $filesRestored ) {
 			$reason = wfMessage( 'undeletedrevisions-files' )
 				->numParams( $textRestored, $filesRestored )->inContentLanguage()->text();
-		} elseif( $textRestored ) {
+		} elseif ( $textRestored ) {
 			$reason = wfMessage( 'undeletedrevisions' )->numParams( $textRestored )
 				->inContentLanguage()->text();
-		} elseif( $filesRestored ) {
+		} elseif ( $filesRestored ) {
 			$reason = wfMessage( 'undeletedfiles' )->numParams( $filesRestored )
 				->inContentLanguage()->text();
 		} else {
@@ -386,7 +391,7 @@ class PageArchive {
 			return false;
 		}
 
-		if( trim( $comment ) != '' ) {
+		if ( trim( $comment ) != '' ) {
 			$reason .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
 		}
 
@@ -413,12 +418,11 @@ class PageArchive {
 	 * to the cur/old tables. If the page currently exists, all revisions will
 	 * be stuffed into old, otherwise the most recent will go into cur.
 	 *
-	 * @param array $timestamps pass an empty array to restore all revisions, otherwise list the ones to undelete.
-	 * @param $unsuppress Boolean: remove all ar_deleted/fa_deleted restrictions of seletected revs
-	 *
-	 * @param $comment String
+	 * @param array $timestamps Pass an empty array to restore all revisions, otherwise list the ones to undelete.
+	 * @param bool $unsuppress Remove all ar_deleted/fa_deleted restrictions of seletected revs
+	 * @param string $comment
 	 * @throws ReadOnlyError
-	 * @return Status, containing the number of revisions restored on success
+	 * @return Status Object containing the number of revisions restored on success
 	 */
 	private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
 		global $wgContentHandlerUseDB;
@@ -426,8 +430,8 @@ class PageArchive {
 		if ( wfReadOnly() ) {
 			throw new ReadOnlyError();
 		}
-		$restoreAll = empty( $timestamps );
 
+		$restoreAll = empty( $timestamps );
 		$dbw = wfGetDB( DB_MASTER );
 
 		# Does this page already exist? We'll have to update it...
@@ -443,7 +447,8 @@ class PageArchive {
 			__METHOD__,
 			array( 'FOR UPDATE' ) // lock page
 		);
-		if( $page ) {
+
+		if ( $page ) {
 			$makepage = false;
 			# Page already exists. Import the history, and if necessary
 			# we'll update the latest revision field in the record.
@@ -455,7 +460,7 @@ class PageArchive {
 				array( 'rev_id' => $previousRevId ),
 				__METHOD__ );
 
-			if( $previousTimestamp === false ) {
+			if ( $previousTimestamp === false ) {
 				wfDebug( __METHOD__ . ": existing page refers to a page_latest that does not exist\n" );
 
 				$status = Status::newGood( 0 );
@@ -470,7 +475,7 @@ class PageArchive {
 			$previousTimestamp = 0;
 		}
 
-		if( $restoreAll ) {
+		if ( $restoreAll ) {
 			$oldones = '1 = 1'; # All revisions...
 		} else {
 			$oldts = implode( ',',
@@ -509,14 +514,15 @@ class PageArchive {
 			$fields,
 			/* WHERE */ array(
 				'ar_namespace' => $this->title->getNamespace(),
-				'ar_title'     => $this->title->getDBkey(),
+				'ar_title' => $this->title->getDBkey(),
 				$oldones ),
 			__METHOD__,
 			/* options */ array( 'ORDER BY' => 'ar_timestamp' )
 		);
 		$ret = $dbw->resultObject( $result );
 		$rev_count = $dbw->numRows( $result );
-		if( !$rev_count ) {
+
+		if ( !$rev_count ) {
 			wfDebug( __METHOD__ . ": no revisions to restore\n" );
 
 			$status = Status::newGood( 0 );
@@ -544,9 +550,9 @@ class PageArchive {
 			return $status;
 		}
 
-		if( $makepage ) {
+		if ( $makepage ) {
 			// Check the state of the newest to-be version...
-			if( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
+			if ( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
 				return Status::newFatal( "undeleterevdel" );
 			}
 			// Safe to insert now...
@@ -554,9 +560,9 @@ class PageArchive {
 			$pageId = $newid;
 		} else {
 			// Check if a deleted revision will become the current revision...
-			if( $row->ar_timestamp > $previousTimestamp ) {
+			if ( $row->ar_timestamp > $previousTimestamp ) {
 				// Check the state of the newest to-be version...
-				if( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
+				if ( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
 					return Status::newFatal( "undeleterevdel" );
 				}
 			}
@@ -570,10 +576,10 @@ class PageArchive {
 
 		foreach ( $ret as $row ) {
 			// Check for key dupes due to shitty archive integrity.
-			if( $row->ar_rev_id ) {
+			if ( $row->ar_rev_id ) {
 				$exists = $dbw->selectField( 'revision', '1',
 					array( 'rev_id' => $row->ar_rev_id ), __METHOD__ );
-				if( $exists ) {
+				if ( $exists ) {
 					continue; // don't throw DB errors
 				}
 			}
@@ -616,7 +622,7 @@ class PageArchive {
 
 		wfRunHooks( 'ArticleUndelete', array( &$this->title, $created, $comment ) );
 
-		if( $this->title->getNamespace() == NS_FILE ) {
+		if ( $this->title->getNamespace() == NS_FILE ) {
 			$update = new HTMLCacheUpdate( $this->title, 'imagelinks' );
 			$update->doUpdate();
 		}
@@ -627,12 +633,16 @@ class PageArchive {
 	/**
 	 * @return Status
 	 */
-	function getFileStatus() { return $this->fileStatus; }
+	function getFileStatus() {
+		return $this->fileStatus;
+	}
 
 	/**
 	 * @return Status
 	 */
-	function getRevisionStatus() { return $this->revisionStatus; }
+	function getRevisionStatus() {
+		return $this->revisionStatus;
+	}
 }
 
 /**
@@ -664,10 +674,13 @@ class SpecialUndelete extends SpecialPage {
 		} else {
 			$this->mTarget = $request->getVal( 'target' );
 		}
+
 		$this->mTargetObj = null;
+
 		if ( $this->mTarget !== null && $this->mTarget !== '' ) {
 			$this->mTargetObj = Title::newFromURL( $this->mTarget );
 		}
+
 		$this->mSearchPrefix = $request->getText( 'prefix' );
 		$time = $request->getVal( 'timestamp' );
 		$this->mTimestamp = $time ? wfTimestamp( TS_MW, $time ) : '';
@@ -698,16 +711,16 @@ class SpecialUndelete extends SpecialPage {
 			$this->mRestore = false;
 		}
 
-		if( $this->mRestore || $this->mInvert ) {
+		if ( $this->mRestore || $this->mInvert ) {
 			$timestamps = array();
 			$this->mFileVersions = array();
-			foreach( $request->getValues() as $key => $val ) {
+			foreach ( $request->getValues() as $key => $val ) {
 				$matches = array();
-				if( preg_match( '/^ts(\d{14})$/', $key, $matches ) ) {
+				if ( preg_match( '/^ts(\d{14})$/', $key, $matches ) ) {
 					array_push( $timestamps, $matches[1] );
 				}
 
-				if( preg_match( '/^fileid(\d+)$/', $key, $matches ) ) {
+				if ( preg_match( '/^fileid(\d+)$/', $key, $matches ) ) {
 					$this->mFileVersions[] = intval( $matches[1] );
 				}
 			}
@@ -747,13 +760,13 @@ class SpecialUndelete extends SpecialPage {
 
 		if ( $this->mTimestamp !== '' ) {
 			$this->showRevision( $this->mTimestamp );
-		} elseif ( $this->mFilename !== null ) {
+		} elseif ( $this->mFilename !== null && $this->mTargetObj->inNamespace( NS_FILE ) ) {
 			$file = new ArchivedFile( $this->mTargetObj, '', $this->mFilename );
 			// Check if user is allowed to see this file
 			if ( !$file->exists() ) {
 				$out->addWikiMsg( 'filedelete-nofile', $this->mFilename );
 			} elseif ( !$file->userCan( File::DELETED_FILE, $user ) ) {
-				if( $file->isDeleted( File::DELETED_RESTRICTED ) ) {
+				if ( $file->isDeleted( File::DELETED_RESTRICTED ) ) {
 					throw new PermissionsError( 'suppressrevision' );
 				} else {
 					throw new PermissionsError( 'deletedtext' );
@@ -776,22 +789,27 @@ class SpecialUndelete extends SpecialPage {
 		$out = $this->getOutput();
 		$out->setPageTitle( $this->msg( 'undelete-search-title' ) );
 		$out->addHTML(
-			Xml::openElement( 'form', array(
-				'method' => 'get',
-				'action' => $wgScript ) ) .
-			Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) .
-			Html::hidden( 'title',
-				$this->getTitle()->getPrefixedDBkey() ) .
-			Xml::inputLabel( $this->msg( 'undelete-search-prefix' )->text(),
-				'prefix', 'prefix', 20,
-				$this->mSearchPrefix ) . ' ' .
-			Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) .
-			Xml::closeElement( 'fieldset' ) .
-			Xml::closeElement( 'form' )
+			Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
+				Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) .
+				Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
+				Html::rawElement(
+					'label',
+					array( 'for' => 'prefix' ),
+					$this->msg( 'undelete-search-prefix' )->parse()
+				) .
+				Xml::input(
+					'prefix',
+					20,
+					$this->mSearchPrefix,
+					array( 'id' => 'prefix', 'autofocus' => true )
+				) . ' ' .
+				Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) .
+				Xml::closeElement( 'fieldset' ) .
+				Xml::closeElement( 'form' )
 		);
 
 		# List undeletable articles
-		if( $this->mSearchPrefix ) {
+		if ( $this->mSearchPrefix ) {
 			$result = PageArchive::listPagesByPrefix( $this->mSearchPrefix );
 			$this->showList( $result );
 		}
@@ -800,13 +818,13 @@ class SpecialUndelete extends SpecialPage {
 	/**
 	 * Generic list of deleted pages
 	 *
-	 * @param $result ResultWrapper
+	 * @param ResultWrapper $result
 	 * @return bool
 	 */
 	private function showList( $result ) {
 		$out = $this->getOutput();
 
-		if( $result->numRows() == 0 ) {
+		if ( $result->numRows() == 0 ) {
 			$out->addWikiMsg( 'undelete-no-results' );
 			return false;
 		}
@@ -826,8 +844,15 @@ class SpecialUndelete extends SpecialPage {
 				);
 			} else {
 				// The title is no longer valid, show as text
-				$item = Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-					Linker::getInvalidTitleDescription( $this->getContext(), $row->ar_namespace, $row->ar_title ) );
+				$item = Html::element(
+					'span',
+					array( 'class' => 'mw-invalidtitle' ),
+					Linker::getInvalidTitleDescription(
+						$this->getContext(),
+						$row->ar_namespace,
+						$row->ar_title
+					)
+				);
 			}
 			$revs = $this->msg( 'undeleterevisions' )->numParams( $row->count )->parse();
 			$out->addHTML( "<li>{$item} ({$revs})</li>\n" );
@@ -839,7 +864,7 @@ class SpecialUndelete extends SpecialPage {
 	}
 
 	private function showRevision( $timestamp ) {
-		if( !preg_match( '/[0-9]{14}/', $timestamp ) ) {
+		if ( !preg_match( '/[0-9]{14}/', $timestamp ) ) {
 			return;
 		}
 
@@ -852,31 +877,37 @@ class SpecialUndelete extends SpecialPage {
 		$out = $this->getOutput();
 		$user = $this->getUser();
 
-		if( !$rev ) {
+		if ( !$rev ) {
 			$out->addWikiMsg( 'undeleterevision-missing' );
 			return;
 		}
 
-		if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
-			if( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
-				$out->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-permission' );
+		if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+			if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+				$out->wrapWikiMsg(
+					"<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+					'rev-deleted-text-permission'
+				);
 				return;
-			} else {
-				$out->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-view' );
-				$out->addHTML( '<br />' );
-				// and we are allowed to see...
 			}
+
+			$out->wrapWikiMsg(
+				"<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+				'rev-deleted-text-view'
+			);
+			$out->addHTML( '<br />' );
+			// and we are allowed to see...
 		}
 
-		if( $this->mDiff ) {
+		if ( $this->mDiff ) {
 			$previousRev = $archive->getPreviousRevision( $timestamp );
-			if( $previousRev ) {
+			if ( $previousRev ) {
 				$this->showDiff( $previousRev, $rev );
-				if( $this->mDiffOnly ) {
+				if ( $this->mDiffOnly ) {
 					return;
-				} else {
-					$out->addHTML( '<hr />' );
 				}
+
+				$out->addHTML( '<hr />' );
 			} else {
 				$out->addWikiMsg( 'undelete-nodiff' );
 			}
@@ -900,7 +931,7 @@ class SpecialUndelete extends SpecialPage {
 
 		$isText = ( $content instanceof TextContent );
 
-		if( $this->mPreview || $isText ) {
+		if ( $this->mPreview || $isText ) {
 			$openDiv = '<div id="mw-undelete-revision" class="mw-warning">';
 		} else {
 			$openDiv = '<div id="mw-undelete-revision">';
@@ -922,7 +953,7 @@ class SpecialUndelete extends SpecialPage {
 			return;
 		}
 
-		if( $this->mPreview || !$isText ) {
+		if ( $this->mPreview || !$isText ) {
 			// NOTE: non-text content has no source view, so always use rendered preview
 
 			// Hide [edit]s
@@ -935,16 +966,21 @@ class SpecialUndelete extends SpecialPage {
 
 		if ( $isText ) {
 			// source view for textual content
-			$sourceView = Xml::element( 'textarea', array(
-				'readonly' => 'readonly',
-				'cols' => $user->getIntOption( 'cols' ),
-				'rows' => $user->getIntOption( 'rows' ) ),
-				$content->getNativeData() . "\n" );
+			$sourceView = Xml::element(
+				'textarea',
+				array(
+					'readonly' => 'readonly',
+					'cols' => $user->getIntOption( 'cols' ),
+					'rows' => $user->getIntOption( 'rows' )
+				),
+				$content->getNativeData() . "\n"
+			);
 
 			$previewButton = Xml::element( 'input', array(
 				'type' => 'submit',
 				'name' => 'preview',
-				'value' => $this->msg( 'showpreview' )->text() ) );
+				'value' => $this->msg( 'showpreview' )->text()
+			) );
 		} else {
 			$sourceView = '';
 			$previewButton = '';
@@ -957,36 +993,37 @@ class SpecialUndelete extends SpecialPage {
 
 		$out->addHTML(
 			$sourceView .
-			Xml::openElement( 'div', array(
-				'style' => 'clear: both' ) ) .
-			Xml::openElement( 'form', array(
-				'method' => 'post',
-				'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ) ) ) .
-			Xml::element( 'input', array(
-				'type' => 'hidden',
-				'name' => 'target',
-				'value' => $this->mTargetObj->getPrefixedDBkey() ) ) .
-			Xml::element( 'input', array(
-				'type' => 'hidden',
-				'name' => 'timestamp',
-				'value' => $timestamp ) ) .
-			Xml::element( 'input', array(
-				'type' => 'hidden',
-				'name' => 'wpEditToken',
-				'value' => $user->getEditToken() ) ) .
-			$previewButton .
-			$diffButton .
-			Xml::closeElement( 'form' ) .
-			Xml::closeElement( 'div' ) );
+				Xml::openElement( 'div', array(
+					'style' => 'clear: both' ) ) .
+				Xml::openElement( 'form', array(
+					'method' => 'post',
+					'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ) ) ) .
+				Xml::element( 'input', array(
+					'type' => 'hidden',
+					'name' => 'target',
+					'value' => $this->mTargetObj->getPrefixedDBkey() ) ) .
+				Xml::element( 'input', array(
+					'type' => 'hidden',
+					'name' => 'timestamp',
+					'value' => $timestamp ) ) .
+				Xml::element( 'input', array(
+					'type' => 'hidden',
+					'name' => 'wpEditToken',
+					'value' => $user->getEditToken() ) ) .
+				$previewButton .
+				$diffButton .
+				Xml::closeElement( 'form' ) .
+				Xml::closeElement( 'div' )
+		);
 	}
 
 	/**
 	 * Build a diff display between this and the previous either deleted
 	 * or non-deleted edit.
 	 *
-	 * @param $previousRev Revision
-	 * @param $currentRev Revision
-	 * @return String: HTML
+	 * @param Revision $previousRev
+	 * @param Revision $currentRev
+	 * @return string HTML
 	 */
 	function showDiff( $previousRev, $currentRev ) {
 		$diffContext = clone $this->getContext();
@@ -995,20 +1032,19 @@ class SpecialUndelete extends SpecialPage {
 
 		$diffEngine = $currentRev->getContentHandler()->createDifferenceEngine( $diffContext );
 		$diffEngine->showDiffStyle();
-		$this->getOutput()->addHTML(
-			"<div>" .
+		$this->getOutput()->addHTML( "<div>" .
 			"<table style='width: 98%;' cellpadding='0' cellspacing='4' class='diff'>" .
 			"<col class='diff-marker' />" .
 			"<col class='diff-content' />" .
 			"<col class='diff-marker' />" .
 			"<col class='diff-content' />" .
 			"<tr>" .
-				"<td colspan='2' style='width: 50%; text-align: center' class='diff-otitle'>" .
-				$this->diffHeader( $previousRev, 'o' ) .
-				"</td>\n" .
-				"<td colspan='2' style='width: 50%;  text-align: center' class='diff-ntitle'>" .
-				$this->diffHeader( $currentRev, 'n' ) .
-				"</td>\n" .
+			"<td colspan='2' style='width: 50%; text-align: center' class='diff-otitle'>" .
+			$this->diffHeader( $previousRev, 'o' ) .
+			"</td>\n" .
+			"<td colspan='2' style='width: 50%;  text-align: center' class='diff-ntitle'>" .
+			$this->diffHeader( $currentRev, 'n' ) .
+			"</td>\n" .
 			"</tr>" .
 			$diffEngine->generateContentDiffBody(
 				$previousRev->getContent( Revision::FOR_THIS_USER, $this->getUser() ),
@@ -1019,13 +1055,13 @@ class SpecialUndelete extends SpecialPage {
 	}
 
 	/**
-	 * @param $rev Revision
-	 * @param $prefix
+	 * @param Revision $rev
+	 * @param string $prefix
 	 * @return string
 	 */
 	private function diffHeader( $rev, $prefix ) {
 		$isDeleted = !( $rev->getId() && $rev->getTitle() );
-		if( $isDeleted ) {
+		if ( $isDeleted ) {
 			/// @todo FIXME: $rev->getTitle() is null for deleted revs...?
 			$targetPage = $this->getTitle();
 			$targetQuery = array(
@@ -1037,30 +1073,34 @@ class SpecialUndelete extends SpecialPage {
 			$targetPage = $rev->getTitle();
 			$targetQuery = array( 'oldid' => $rev->getId() );
 		}
+
 		// Add show/hide deletion links if available
 		$user = $this->getUser();
 		$lang = $this->getLanguage();
 		$rdel = Linker::getRevDeleteLink( $user, $rev, $this->mTargetObj );
-		if ( $rdel ) $rdel = " $rdel";
-		return
-			'<div id="mw-diff-' . $prefix . 'title1"><strong>' .
-				Linker::link(
-					$targetPage,
-					$this->msg(
-						'revisionasof',
-						$lang->userTimeAndDate( $rev->getTimestamp(), $user ),
-						$lang->userDate( $rev->getTimestamp(), $user ),
-						$lang->userTime( $rev->getTimestamp(), $user )
-					)->escaped(),
-					array(),
-					$targetQuery
-				) .
+
+		if ( $rdel ) {
+			$rdel = " $rdel";
+		}
+
+		return '<div id="mw-diff-' . $prefix . 'title1"><strong>' .
+			Linker::link(
+				$targetPage,
+				$this->msg(
+					'revisionasof',
+					$lang->userTimeAndDate( $rev->getTimestamp(), $user ),
+					$lang->userDate( $rev->getTimestamp(), $user ),
+					$lang->userTime( $rev->getTimestamp(), $user )
+				)->escaped(),
+				array(),
+				$targetQuery
+			) .
 			'</strong></div>' .
 			'<div id="mw-diff-' . $prefix . 'title2">' .
-				Linker::revUserTools( $rev ) . '<br />' .
+			Linker::revUserTools( $rev ) . '<br />' .
 			'</div>' .
 			'<div id="mw-diff-' . $prefix . 'title3">' .
-				Linker::revComment( $rev ) . $rdel . '<br />' .
+			Linker::revComment( $rev ) . $rdel . '<br />' .
 			'</div>';
 	}
 
@@ -1078,15 +1118,16 @@ class SpecialUndelete extends SpecialPage {
 			$lang->userTime( $file->getTimestamp(), $user ) );
 		$out->addHTML(
 			Xml::openElement( 'form', array(
-				'method' => 'POST',
-				'action' => $this->getTitle()->getLocalURL(
-					'target=' . urlencode( $this->mTarget ) .
-					'&file=' . urlencode( $key ) .
-					'&token=' . urlencode( $user->getEditToken( $key ) ) )
+					'method' => 'POST',
+					'action' => $this->getTitle()->getLocalURL( array(
+						'target' => $this->mTarget,
+						'file' => $key,
+						'token' => $user->getEditToken( $key ),
+					) ),
 				)
 			) .
-			Xml::submitButton( $this->msg( 'undelete-show-file-submit' )->text() ) .
-			'</form>'
+				Xml::submitButton( $this->msg( 'undelete-show-file-submit' )->text() ) .
+				'</form>'
 		);
 	}
 
@@ -1112,7 +1153,7 @@ class SpecialUndelete extends SpecialPage {
 
 	private function showHistory() {
 		$out = $this->getOutput();
-		if( $this->mAllowed ) {
+		if ( $this->mAllowed ) {
 			$out->addModules( 'mediawiki.special.undelete' );
 		}
 		$out->wrapWikiMsg(
@@ -1146,7 +1187,7 @@ class SpecialUndelete extends SpecialPage {
 		$haveFiles = $files && $files->numRows() > 0;
 
 		# Batch existence check on user and talk pages
-		if( $haveRevisions ) {
+		if ( $haveRevisions ) {
 			$batch = new LinkBatch();
 			foreach ( $revisions as $row ) {
 				$batch->addObj( Title::makeTitleSafe( NS_USER, $row->ar_user_text ) );
@@ -1155,7 +1196,7 @@ class SpecialUndelete extends SpecialPage {
 			$batch->execute();
 			$revisions->seek( 0 );
 		}
-		if( $haveFiles ) {
+		if ( $haveFiles ) {
 			$batch = new LinkBatch();
 			foreach ( $files as $row ) {
 				$batch->addObj( Title::makeTitleSafe( NS_USER, $row->fa_user_text ) );
@@ -1168,7 +1209,10 @@ class SpecialUndelete extends SpecialPage {
 		if ( $this->mAllowed ) {
 			$action = $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) );
 			# Start the form here
-			$top = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'undelete' ) );
+			$top = Xml::openElement(
+				'form',
+				array( 'method' => 'post', 'action' => $action, 'id' => 'undelete' )
+			);
 			$out->addHTML( $top );
 		}
 
@@ -1178,59 +1222,60 @@ class SpecialUndelete extends SpecialPage {
 		LogEventsList::showLogExtract( $out, 'delete', $this->mTargetObj );
 		# Show relevant lines from the suppression log:
 		$suppressLogPage = new LogPage( 'suppress' );
-		if( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
+		if ( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
 			$out->addHTML( Xml::element( 'h2', null, $suppressLogPage->getName()->text() ) . "\n" );
 			LogEventsList::showLogExtract( $out, 'suppress', $this->mTargetObj );
 		}
 
-		if( $this->mAllowed && ( $haveRevisions || $haveFiles ) ) {
+		if ( $this->mAllowed && ( $haveRevisions || $haveFiles ) ) {
 			# Format the user-visible controls (comment field, submission button)
 			# in a nice little table
-			if( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
+			if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
 				$unsuppressBox =
 					"<tr>
 						<td>&#160;</td>
 						<td class='mw-input'>" .
-							Xml::checkLabel( $this->msg( 'revdelete-unsuppress' )->text(),
-								'wpUnsuppress', 'mw-undelete-unsuppress', $this->mUnsuppress ).
+						Xml::checkLabel( $this->msg( 'revdelete-unsuppress' )->text(),
+							'wpUnsuppress', 'mw-undelete-unsuppress', $this->mUnsuppress ) .
 						"</td>
 					</tr>";
 			} else {
 				$unsuppressBox = '';
 			}
+
 			$table =
 				Xml::fieldset( $this->msg( 'undelete-fieldset-title' )->text() ) .
-				Xml::openElement( 'table', array( 'id' => 'mw-undelete-table' ) ) .
+					Xml::openElement( 'table', array( 'id' => 'mw-undelete-table' ) ) .
 					"<tr>
 						<td colspan='2' class='mw-undelete-extrahelp'>" .
-							$this->msg( 'undeleteextrahelp' )->parseAsBlock() .
-						"</td>
-					</tr>
-					<tr>
-						<td class='mw-label'>" .
-							Xml::label( $this->msg( 'undeletecomment' )->text(), 'wpComment' ) .
-						"</td>
-						<td class='mw-input'>" .
-							Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
-						"</td>
-					</tr>
-					<tr>
-						<td>&#160;</td>
-						<td class='mw-submit'>" .
-							Xml::submitButton( $this->msg( 'undeletebtn' )->text(), array( 'name' => 'restore', 'id' => 'mw-undelete-submit' ) ) . ' ' .
-							Xml::submitButton( $this->msg( 'undeleteinvert' )->text(), array( 'name' => 'invert', 'id' => 'mw-undelete-invert' ) ) .
-						"</td>
-					</tr>" .
+					$this->msg( 'undeleteextrahelp' )->parseAsBlock() .
+					"</td>
+				</tr>
+				<tr>
+					<td class='mw-label'>" .
+					Xml::label( $this->msg( 'undeletecomment' )->text(), 'wpComment' ) .
+					"</td>
+					<td class='mw-input'>" .
+					Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment', 'autofocus' => true ) ) .
+					"</td>
+				</tr>
+				<tr>
+					<td>&#160;</td>
+					<td class='mw-submit'>" .
+					Xml::submitButton( $this->msg( 'undeletebtn' )->text(), array( 'name' => 'restore', 'id' => 'mw-undelete-submit' ) ) . ' ' .
+					Xml::submitButton( $this->msg( 'undeleteinvert' )->text(), array( 'name' => 'invert', 'id' => 'mw-undelete-invert' ) ) .
+					"</td>
+				</tr>" .
 					$unsuppressBox .
-				Xml::closeElement( 'table' ) .
-				Xml::closeElement( 'fieldset' );
+					Xml::closeElement( 'table' ) .
+					Xml::closeElement( 'fieldset' );
 
 			$out->addHTML( $table );
 		}
 
 		$out->addHTML( Xml::element( 'h2', null, $this->msg( 'history' )->text() ) . "\n" );
 
-		if( $haveRevisions ) {
+		if ( $haveRevisions ) {
 			# The page's stored (deleted) history:
 			$out->addHTML( '<ul>' );
 			$remaining = $revisions->numRows();
@@ -1246,7 +1291,7 @@ class SpecialUndelete extends SpecialPage {
 			$out->addWikiMsg( 'nohistory' );
 		}
 
-		if( $haveFiles ) {
+		if ( $haveFiles ) {
 			$out->addHTML( Xml::element( 'h2', null, $this->msg( 'filehist' )->text() ) . "\n" );
 			$out->addHTML( '<ul>' );
 			foreach ( $files as $row ) {
@@ -1276,9 +1321,9 @@ class SpecialUndelete extends SpecialPage {
 		$revTextSize = '';
 		$ts = wfTimestamp( TS_MW, $row->ar_timestamp );
 		// Build checkboxen...
-		if( $this->mAllowed ) {
-			if( $this->mInvert ) {
-				if( in_array( $ts, $this->mTargetTimestamp ) ) {
+		if ( $this->mAllowed ) {
+			if ( $this->mInvert ) {
+				if ( in_array( $ts, $this->mTargetTimestamp ) ) {
 					$checkBox = Xml::check( "ts$ts" );
 				} else {
 					$checkBox = Xml::check( "ts$ts", true );
@@ -1289,15 +1334,16 @@ class SpecialUndelete extends SpecialPage {
 		} else {
 			$checkBox = '';
 		}
-		$user = $this->getUser();
+
 		// Build page & diff links...
-		if( $this->mCanView ) {
+		$user = $this->getUser();
+		if ( $this->mCanView ) {
 			$titleObj = $this->getTitle();
 			# Last link
-			if( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+			if ( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
 				$pageLink = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $ts, $user ) );
 				$last = $this->msg( 'diff' )->escaped();
-			} elseif( $remaining > 0 || ( $earliestLiveTime && $ts > $earliestLiveTime ) ) {
+			} elseif ( $remaining > 0 || ( $earliestLiveTime && $ts > $earliestLiveTime ) ) {
 				$pageLink = $this->getPageLink( $rev, $titleObj, $ts );
 				$last = Linker::linkKnown(
 					$titleObj,
@@ -1317,28 +1363,35 @@ class SpecialUndelete extends SpecialPage {
 			$pageLink = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $ts, $user ) );
 			$last = $this->msg( 'diff' )->escaped();
 		}
+
 		// User links
 		$userLink = Linker::revUserTools( $rev );
+
 		// Revision text size
 		$size = $row->ar_len;
-		if( !is_null( $size ) ) {
+		if ( !is_null( $size ) ) {
 			$revTextSize = Linker::formatRevisionSize( $size );
 		}
+
 		// Edit summary
 		$comment = Linker::revComment( $rev );
+
 		// Revision delete links
 		$revdlink = Linker::getRevDeleteLink( $user, $rev, $this->mTargetObj );
 
-		$revisionRow = $this->msg( 'undelete-revisionrow' )->rawParams( $checkBox, $revdlink, $last, $pageLink, $userLink, $revTextSize, $comment )->escaped();
+		$revisionRow = $this->msg( 'undelete-revisionrow' )
+			->rawParams( $checkBox, $revdlink, $last, $pageLink, $userLink, $revTextSize, $comment )
+			->escaped();
+
 		return "<li>$revisionRow</li>";
 	}
 
 	private function formatFileRow( $row ) {
 		$file = ArchivedFile::newFromRow( $row );
-
 		$ts = wfTimestamp( TS_MW, $row->fa_timestamp );
 		$user = $this->getUser();
-		if( $this->mAllowed && $row->fa_storage_key ) {
+
+		if ( $this->mAllowed && $row->fa_storage_key ) {
 			$checkBox = Xml::check( 'fileid' . $row->fa_id );
 			$key = urlencode( $row->fa_storage_key );
 			$pageLink = $this->getFileLink( $file, $this->getTitle(), $ts, $key );
@@ -1348,15 +1401,18 @@ class SpecialUndelete extends SpecialPage {
 		}
 		$userLink = $this->getFileUser( $file );
 		$data = $this->msg( 'widthheight' )->numParams( $row->fa_width, $row->fa_height )->text();
-		$bytes = $this->msg( 'parentheses' )->rawParams( $this->msg( 'nbytes' )->numParams( $row->fa_size )->text() )->plain();
+		$bytes = $this->msg( 'parentheses' )
+			->rawParams( $this->msg( 'nbytes' )->numParams( $row->fa_size )->text() )
+			->plain();
 		$data = htmlspecialchars( $data . ' ' . $bytes );
 		$comment = $this->getFileComment( $file );
 
 		// Add show/hide deletion links if available
 		$canHide = $user->isAllowed( 'deleterevision' );
-		if( $canHide || ( $file->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
-			if( !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
-				$revdlink = Linker::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
+		if ( $canHide || ( $file->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
+			if ( !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
+				// Revision was hidden from sysops
+				$revdlink = Linker::revDeleteLinkDisabled( $canHide );
 			} else {
 				$query = array(
 					'type' => 'filearchive',
@@ -1376,8 +1432,8 @@ class SpecialUndelete extends SpecialPage {
 	/**
 	 * Fetch revision text link if it's available to all users
 	 *
-	 * @param $rev Revision
-	 * @param $titleObj Title
+	 * @param Revision $rev
+	 * @param Title $titleObj
 	 * @param string $ts Timestamp
 	 * @return string
 	 */
@@ -1385,95 +1441,105 @@ class SpecialUndelete extends SpecialPage {
 		$user = $this->getUser();
 		$time = $this->getLanguage()->userTimeAndDate( $ts, $user );
 
-		if( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+		if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
 			return '<span class="history-deleted">' . $time . '</span>';
-		} else {
-			$link = Linker::linkKnown(
-				$titleObj,
-				htmlspecialchars( $time ),
-				array(),
-				array(
-					'target' => $this->mTargetObj->getPrefixedText(),
-					'timestamp' => $ts
-				)
-			);
-			if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
-				$link = '<span class="history-deleted">' . $link . '</span>';
-			}
-			return $link;
 		}
+
+		$link = Linker::linkKnown(
+			$titleObj,
+			htmlspecialchars( $time ),
+			array(),
+			array(
+				'target' => $this->mTargetObj->getPrefixedText(),
+				'timestamp' => $ts
+			)
+		);
+
+		if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+			$link = '<span class="history-deleted">' . $link . '</span>';
+		}
+
+		return $link;
 	}
 
 	/**
 	 * Fetch image view link if it's available to all users
 	 *
-	 * @param $file File
-	 * @param $titleObj Title
+	 * @param File|ArchivedFile $file
+	 * @param Title $titleObj
 	 * @param string $ts A timestamp
 	 * @param string $key a storage key
 	 *
-	 * @return String: HTML fragment
+	 * @return string HTML fragment
 	 */
 	function getFileLink( $file, $titleObj, $ts, $key ) {
 		$user = $this->getUser();
 		$time = $this->getLanguage()->userTimeAndDate( $ts, $user );
 
-		if( !$file->userCan( File::DELETED_FILE, $user ) ) {
+		if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
 			return '<span class="history-deleted">' . $time . '</span>';
-		} else {
-			$link = Linker::linkKnown(
-				$titleObj,
-				htmlspecialchars( $time ),
-				array(),
-				array(
-					'target' => $this->mTargetObj->getPrefixedText(),
-					'file' => $key,
-					'token' => $user->getEditToken( $key )
-				)
-			);
-			if( $file->isDeleted( File::DELETED_FILE ) ) {
-				$link = '<span class="history-deleted">' . $link . '</span>';
-			}
-			return $link;
 		}
+
+		$link = Linker::linkKnown(
+			$titleObj,
+			htmlspecialchars( $time ),
+			array(),
+			array(
+				'target' => $this->mTargetObj->getPrefixedText(),
+				'file' => $key,
+				'token' => $user->getEditToken( $key )
+			)
+		);
+
+		if ( $file->isDeleted( File::DELETED_FILE ) ) {
+			$link = '<span class="history-deleted">' . $link . '</span>';
+		}
+
+		return $link;
 	}
 
 	/**
 	 * Fetch file's user id if it's available to this user
 	 *
-	 * @param $file File
-	 * @return String: HTML fragment
+	 * @param File|ArchivedFile $file
+	 * @return string HTML fragment
 	 */
 	function getFileUser( $file ) {
-		if( !$file->userCan( File::DELETED_USER, $this->getUser() ) ) {
-			return '<span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
-		} else {
-			$link = Linker::userLink( $file->getRawUser(), $file->getRawUserText() ) .
-				Linker::userToolLinks( $file->getRawUser(), $file->getRawUserText() );
-			if( $file->isDeleted( File::DELETED_USER ) ) {
-				$link = '<span class="history-deleted">' . $link . '</span>';
-			}
-			return $link;
+		if ( !$file->userCan( File::DELETED_USER, $this->getUser() ) ) {
+			return '<span class="history-deleted">' .
+				$this->msg( 'rev-deleted-user' )->escaped() .
+				'</span>';
 		}
+
+		$link = Linker::userLink( $file->getRawUser(), $file->getRawUserText() ) .
+			Linker::userToolLinks( $file->getRawUser(), $file->getRawUserText() );
+
+		if ( $file->isDeleted( File::DELETED_USER ) ) {
+			$link = '<span class="history-deleted">' . $link . '</span>';
+		}
+
+		return $link;
 	}
 
 	/**
 	 * Fetch file upload comment if it's available to this user
 	 *
-	 * @param $file File
-	 * @return String: HTML fragment
+	 * @param File|ArchivedFile $file
+	 * @return string HTML fragment
 	 */
 	function getFileComment( $file ) {
-		if( !$file->userCan( File::DELETED_COMMENT, $this->getUser() ) ) {
+		if ( !$file->userCan( File::DELETED_COMMENT, $this->getUser() ) ) {
 			return '<span class="history-deleted"><span class="comment">' .
 				$this->msg( 'rev-deleted-comment' )->escaped() . '</span></span>';
-		} else {
-			$link = Linker::commentBlock( $file->getRawDescription() );
-			if( $file->isDeleted( File::DELETED_COMMENT ) ) {
-				$link = '<span class="history-deleted">' . $link . '</span>';
-			}
-			return $link;
 		}
+
+		$link = Linker::commentBlock( $file->getRawDescription() );
+
+		if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
+			$link = '<span class="history-deleted">' . $link . '</span>';
+		}
+
+		return $link;
 	}
 
 	function undelete() {
@@ -1498,7 +1564,7 @@ class SpecialUndelete extends SpecialPage {
 			$this->getUser()
 		);
 
-		if( is_array( $ok ) ) {
+		if ( is_array( $ok ) ) {
 			if ( $ok[1] ) { // Undeleted file count
 				wfRunHooks( 'FileUndeleteComplete', array(
 					$this->mTargetObj, $this->mFileVersions,
@@ -1513,13 +1579,13 @@ class SpecialUndelete extends SpecialPage {
 
 		// Show revision undeletion warnings and errors
 		$status = $archive->getRevisionStatus();
-		if( $status && !$status->isGood() ) {
+		if ( $status && !$status->isGood() ) {
 			$out->addWikiText( '<div class="error">' . $status->getWikiText( 'cannotundelete', 'cannotundelete' ) . '</div>' );
 		}
 
 		// Show file undeletion warnings and errors
 		$status = $archive->getFileStatus();
-		if( $status && !$status->isGood() ) {
+		if ( $status && !$status->isGood() ) {
 			$out->addWikiText( '<div class="error">' . $status->getWikiText( 'undelete-error-short', 'undelete-error-long' ) . '</div>' );
 		}
 	}
diff --git a/includes/specials/SpecialUnusedcategories.php b/includes/specials/SpecialUnusedcategories.php
index 6b91dd39..b686a5b5 100644
--- a/includes/specials/SpecialUnusedcategories.php
+++ b/includes/specials/SpecialUnusedcategories.php
@@ -39,15 +39,15 @@ class UnusedCategoriesPage extends QueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array ( 'page', 'categorylinks' ),
-			'fields' => array ( 'namespace' => 'page_namespace',
+		return array(
+			'tables' => array( 'page', 'categorylinks' ),
+			'fields' => array( 'namespace' => 'page_namespace',
 					'title' => 'page_title',
 					'value' => 'page_title' ),
-			'conds' => array ( 'cl_from IS NULL',
+			'conds' => array( 'cl_from IS NULL',
 					'page_namespace' => NS_CATEGORY,
 					'page_is_redirect' => 0 ),
-			'join_conds' => array ( 'categorylinks' => array (
+			'join_conds' => array( 'categorylinks' => array(
 					'LEFT JOIN', 'cl_to = page_title' ) )
 		);
 	}
@@ -60,6 +60,11 @@ class UnusedCategoriesPage extends QueryPage {
 		return false;
 	}
 
+	/**
+	 * @param Skin $skin
+	 * @param object $result Result row
+	 * @return string
+	 */
 	function formatResult( $skin, $result ) {
 		$title = Title::makeTitle( NS_CATEGORY, $result->title );
 		return Linker::link( $title, htmlspecialchars( $title->getText() ) );
diff --git a/includes/specials/SpecialUnusedimages.php b/includes/specials/SpecialUnusedimages.php
index 69553282..d332db75 100644
--- a/includes/specials/SpecialUnusedimages.php
+++ b/includes/specials/SpecialUnusedimages.php
@@ -45,28 +45,28 @@ class UnusedimagesPage extends ImageQueryPage {
 
 	function getQueryInfo() {
 		global $wgCountCategorizedImagesAsUsed;
-		$retval = array (
-			'tables' => array ( 'image', 'imagelinks' ),
-			'fields' => array ( 'namespace' => NS_FILE,
+		$retval = array(
+			'tables' => array( 'image', 'imagelinks' ),
+			'fields' => array( 'namespace' => NS_FILE,
 					'title' => 'img_name',
 					'value' => 'img_timestamp',
 					'img_user', 'img_user_text',
 					'img_description' ),
-			'conds' => array ( 'il_to IS NULL' ),
-			'join_conds' => array ( 'imagelinks' => array (
+			'conds' => array( 'il_to IS NULL' ),
+			'join_conds' => array( 'imagelinks' => array(
 					'LEFT JOIN', 'il_to = img_name' ) )
 		);
 
 		if ( $wgCountCategorizedImagesAsUsed ) {
 			// Order is significant
-			$retval['tables'] = array ( 'image', 'page', 'categorylinks',
+			$retval['tables'] = array( 'image', 'page', 'categorylinks',
 					'imagelinks' );
 			$retval['conds']['page_namespace'] = NS_FILE;
 			$retval['conds'][] = 'cl_from IS NULL';
 			$retval['conds'][] = 'img_name = page_title';
-			$retval['join_conds']['categorylinks'] = array (
+			$retval['join_conds']['categorylinks'] = array(
 					'LEFT JOIN', 'cl_from = page_id' );
-			$retval['join_conds']['imagelinks'] = array (
+			$retval['join_conds']['imagelinks'] = array(
 					'LEFT JOIN', 'il_to = page_title' );
 		}
 		return $retval;
diff --git a/includes/specials/SpecialUnusedtemplates.php b/includes/specials/SpecialUnusedtemplates.php
index 493e936a..1dc9f420 100644
--- a/includes/specials/SpecialUnusedtemplates.php
+++ b/includes/specials/SpecialUnusedtemplates.php
@@ -48,23 +48,23 @@ class UnusedtemplatesPage extends QueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array ( 'page', 'templatelinks' ),
-			'fields' => array ( 'namespace' => 'page_namespace',
+		return array(
+			'tables' => array( 'page', 'templatelinks' ),
+			'fields' => array( 'namespace' => 'page_namespace',
 					'title' => 'page_title',
 					'value' => 'page_title' ),
-			'conds' => array ( 'page_namespace' => NS_TEMPLATE,
+			'conds' => array( 'page_namespace' => NS_TEMPLATE,
 					'tl_from IS NULL',
 					'page_is_redirect' => 0 ),
-			'join_conds' => array ( 'templatelinks' => array (
-				'LEFT JOIN', array ( 'tl_title = page_title',
+			'join_conds' => array( 'templatelinks' => array(
+				'LEFT JOIN', array( 'tl_title = page_title',
 					'tl_namespace = page_namespace' ) ) )
 		);
 	}
 
 	/**
-	 * @param $skin Skin
-	 * @param $result
+	 * @param Skin $skin
+	 * @param object $result Result row
 	 * @return string
 	 */
 	function formatResult( $skin, $result ) {
diff --git a/includes/specials/SpecialUnwatchedpages.php b/includes/specials/SpecialUnwatchedpages.php
index 05ec6b02..954e3ffe 100644
--- a/includes/specials/SpecialUnwatchedpages.php
+++ b/includes/specials/SpecialUnwatchedpages.php
@@ -44,17 +44,17 @@ class UnwatchedpagesPage extends QueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array ( 'page', 'watchlist' ),
-			'fields' => array ( 'namespace' => 'page_namespace',
+		return array(
+			'tables' => array( 'page', 'watchlist' ),
+			'fields' => array( 'namespace' => 'page_namespace',
 					'title' => 'page_title',
 					'value' => 'page_namespace' ),
-			'conds' => array ( 'wl_title IS NULL',
+			'conds' => array( 'wl_title IS NULL',
 					'page_is_redirect' => 0,
 					"page_namespace != '" . NS_MEDIAWIKI .
 					"'" ),
-			'join_conds' => array ( 'watchlist' => array (
-				'LEFT JOIN', array ( 'wl_title = page_title',
+			'join_conds' => array( 'watchlist' => array(
+				'LEFT JOIN', array( 'wl_title = page_title',
 					'wl_namespace = page_namespace' ) ) )
 		);
 	}
@@ -68,8 +68,8 @@ class UnwatchedpagesPage extends QueryPage {
 	}
 
 	/**
-	 * @param $skin Skin
-	 * @param $result
+	 * @param Skin $skin
+	 * @param object $result Result row
 	 * @return string
 	 */
 	function formatResult( $skin, $result ) {
diff --git a/includes/specials/SpecialUpload.php b/includes/specials/SpecialUpload.php
index 89c06b2a..09facf4f 100644
--- a/includes/specials/SpecialUpload.php
+++ b/includes/specials/SpecialUpload.php
@@ -90,10 +90,9 @@ class SpecialUpload extends SpecialPage {
 
 		// Guess the desired name from the filename if not provided
 		$this->mDesiredDestName = $request->getText( 'wpDestFile' );
-		if( !$this->mDesiredDestName && $request->getFileName( 'wpUploadFile' ) !== null ) {
+		if ( !$this->mDesiredDestName && $request->getFileName( 'wpUploadFile' ) !== null ) {
 			$this->mDesiredDestName = $request->getFileName( 'wpUploadFile' );
 		}
-		$this->mComment = $request->getText( 'wpUploadDescription' );
 		$this->mLicense = $request->getText( 'wpLicense' );
 
 		$this->mDestWarningAck = $request->getText( 'wpDestFileWarningAck' );
@@ -104,6 +103,14 @@ class SpecialUpload extends SpecialPage {
 		$this->mCopyrightSource = $request->getText( 'wpUploadSource' );
 
 		$this->mForReUpload = $request->getBool( 'wpForReUpload' ); // updating a file
+
+		$commentDefault = '';
+		$commentMsg = wfMessage( 'upload-default-description' )->inContentLanguage();
+		if ( !$this->mForReUpload && !$commentMsg->isDisabled() ) {
+			$commentDefault = $commentMsg->plain();
+		}
+		$this->mComment = $request->getText( 'wpUploadDescription', $commentDefault );
+
 		$this->mCancelUpload = $request->getCheck( 'wpCancelUpload' )
 			|| $request->getCheck( 'wpReUpload' ); // b/w compat
 
@@ -135,19 +142,19 @@ class SpecialUpload extends SpecialPage {
 		$this->outputHeader();
 
 		# Check uploading enabled
-		if( !UploadBase::isEnabled() ) {
+		if ( !UploadBase::isEnabled() ) {
 			throw new ErrorPageError( 'uploaddisabled', 'uploaddisabledtext' );
 		}
 
 		# Check permissions
 		$user = $this->getUser();
 		$permissionRequired = UploadBase::isAllowed( $user );
-		if( $permissionRequired !== true ) {
+		if ( $permissionRequired !== true ) {
 			throw new PermissionsError( $permissionRequired );
 		}
 
 		# Check blocks
-		if( $user->isBlocked() ) {
+		if ( $user->isBlocked() ) {
 			throw new UserBlockedError( $user->getBlock() );
 		}
 
@@ -172,7 +179,7 @@ class SpecialUpload extends SpecialPage {
 			$this->processUpload();
 		} else {
 			# Backwards compatibility hook
-			if( !wfRunHooks( 'UploadForm:initial', array( &$this ) ) ) {
+			if ( !wfRunHooks( 'UploadForm:initial', array( &$this ) ) ) {
 				wfDebug( "Hook 'UploadForm:initial' broke output of the upload form" );
 				return;
 			}
@@ -214,6 +221,8 @@ class SpecialUpload extends SpecialPage {
 	 */
 	protected function getUploadForm( $message = '', $sessionKey = '', $hideIgnoreWarning = false ) {
 		# Initialize form
+		$context = new DerivativeContext( $this->getContext() );
+		$context->setTitle( $this->getTitle() ); // Remove subpage
 		$form = new UploadForm( array(
 			'watch' => $this->getWatchCheck(),
 			'forreupload' => $this->mForReUpload,
@@ -225,11 +234,10 @@ class SpecialUpload extends SpecialPage {
 			'texttop' => $this->uploadFormTextTop,
 			'textaftersummary' => $this->uploadFormTextAfterSummary,
 			'destfile' => $this->mDesiredDestName,
-		), $this->getContext() );
-		$form->setTitle( $this->getTitle() );
+		), $context );
 
 		# Check the token, but only if necessary
-		if(
+		if (
 			!$this->mTokenOk && !$this->mCancelUpload &&
 			( $this->mUpload && $this->mUploadClicked )
 		) {
@@ -275,7 +283,7 @@ class SpecialUpload extends SpecialPage {
 		$title = Title::makeTitleSafe( NS_FILE, $this->mDesiredDestName );
 		$user = $this->getUser();
 		// Show a subtitle link to deleted revisions (to sysops et al only)
-		if( $title instanceof Title ) {
+		if ( $title instanceof Title ) {
 			$count = $title->isDeleted();
 			if ( $count > 0 && $user->isAllowed( 'deletedhistory' ) ) {
 				$restorelink = Linker::linkKnown(
@@ -333,15 +341,15 @@ class SpecialUpload extends SpecialPage {
 
 		$warningHtml = '<h2>' . $this->msg( 'uploadwarning' )->escaped() . "</h2>\n"
 			. '<ul class="warning">';
-		foreach( $warnings as $warning => $args ) {
-			if( $warning == 'badfilename' ) {
+		foreach ( $warnings as $warning => $args ) {
+			if ( $warning == 'badfilename' ) {
 				$this->mDesiredDestName = Title::makeTitle( NS_FILE, $args )->getText();
 			}
-			if( $warning == 'exists' ) {
+			if ( $warning == 'exists' ) {
 				$msg = "\t<li>" . self::getExistsWarning( $args ) . "</li>\n";
-			} elseif( $warning == 'duplicate' ) {
-				$msg = self::getDupeWarning( $args );
-			} elseif( $warning == 'duplicate-archive' ) {
+			} elseif ( $warning == 'duplicate' ) {
+				$msg = $this->getDupeWarning( $args );
+			} elseif ( $warning == 'duplicate-archive' ) {
 				$msg = "\t<li>" . $this->msg( 'file-deleted-duplicate',
 						Title::makeTitle( NS_FILE, $args )->getPrefixedText() )->parse()
 					. "</li>\n";
@@ -387,12 +395,12 @@ class SpecialUpload extends SpecialPage {
 	protected function processUpload() {
 		// Fetch the file if required
 		$status = $this->mUpload->fetchFile();
-		if( !$status->isOK() ) {
+		if ( !$status->isOK() ) {
 			$this->showUploadError( $this->getOutput()->parse( $status->getWikiText() ) );
 			return;
 		}
 
-		if( !wfRunHooks( 'UploadForm:BeforeProcessing', array( &$this ) ) ) {
+		if ( !wfRunHooks( 'UploadForm:BeforeProcessing', array( &$this ) ) ) {
 			wfDebug( "Hook 'UploadForm:BeforeProcessing' broke processing the file.\n" );
 			// This code path is deprecated. If you want to break upload processing
 			// do so by hooking into the appropriate hooks in UploadBase::verifyUpload
@@ -411,7 +419,7 @@ class SpecialUpload extends SpecialPage {
 
 		// Verify permissions for this title
 		$permErrors = $this->mUpload->verifyTitlePermissions( $this->getUser() );
-		if( $permErrors !== true ) {
+		if ( $permErrors !== true ) {
 			$code = array_shift( $permErrors[0] );
 			$this->showRecoverableUploadError( $this->msg( $code, $permErrors[0] )->parse() );
 			return;
@@ -420,15 +428,15 @@ class SpecialUpload extends SpecialPage {
 		$this->mLocalFile = $this->mUpload->getLocalFile();
 
 		// Check warnings if necessary
-		if( !$this->mIgnoreWarning ) {
+		if ( !$this->mIgnoreWarning ) {
 			$warnings = $this->mUpload->checkWarnings();
-			if( $this->showUploadWarning( $warnings ) ) {
+			if ( $this->showUploadWarning( $warnings ) ) {
 				return;
 			}
 		}
 
 		// Get the page text if this is not a reupload
-		if( !$this->mForReUpload ) {
+		if ( !$this->mForReUpload ) {
 			$pageText = self::getInitialPageText( $this->mComment, $this->mLicense,
 				$this->mCopyrightStatus, $this->mCopyrightSource );
 		} else {
@@ -456,15 +464,14 @@ class SpecialUpload extends SpecialPage {
 	 */
 	public static function getInitialPageText( $comment = '', $license = '', $copyStatus = '', $source = '' ) {
 		global $wgUseCopyrightUpload, $wgForceUIMsgAsContentMsg;
-		$wgForceUIMsgAsContentMsg = (array) $wgForceUIMsgAsContentMsg;
 
 		$msg = array();
 		/* These messages are transcluded into the actual text of the description page.
 		 * Thus, forcing them as content messages makes the upload to produce an int: template
 		 * instead of hardcoding it there in the uploader language.
 		 */
-		foreach( array( 'license-header', 'filedesc', 'filestatus', 'filesource' ) as $msgName ) {
-			if ( in_array( $msgName, $wgForceUIMsgAsContentMsg ) ) {
+		foreach ( array( 'license-header', 'filedesc', 'filestatus', 'filesource' ) as $msgName ) {
+			if ( in_array( $msgName, (array)$wgForceUIMsgAsContentMsg ) ) {
 				$msg[$msgName] = "{{int:$msgName}}";
 			} else {
 				$msg[$msgName] = wfMessage( $msgName )->inContentLanguage()->text();
@@ -505,13 +512,13 @@ class SpecialUpload extends SpecialPage {
 	 * @return Bool|String
 	 */
 	protected function getWatchCheck() {
-		if( $this->getUser()->getOption( 'watchdefault' ) ) {
+		if ( $this->getUser()->getOption( 'watchdefault' ) ) {
 			// Watch all edits!
 			return true;
 		}
 
 		$local = wfLocalFile( $this->mDesiredDestName );
-		if( $local && $local->exists() ) {
+		if ( $local && $local->exists() ) {
 			// We're uploading a new version of an existing file.
 			// No creation, so don't watch it if we're not already.
 			return $this->getUser()->isWatched( $local->getTitle() );
@@ -530,7 +537,7 @@ class SpecialUpload extends SpecialPage {
 	protected function processVerificationError( $details ) {
 		global $wgFileExtensions;
 
-		switch( $details['status'] ) {
+		switch ( $details['status'] ) {
 
 			/** Statuses that only require name changing **/
 			case UploadBase::MIN_LENGTH_PARTNAME:
@@ -564,8 +571,9 @@ class SpecialUpload extends SpecialPage {
 				} else {
 					$msg->params( $details['finalExt'] );
 				}
-				$msg->params( $this->getLanguage()->commaList( $wgFileExtensions ),
-					count( $wgFileExtensions ) );
+				$extensions = array_unique( $wgFileExtensions );
+				$msg->params( $this->getLanguage()->commaList( $extensions ),
+					count( $extensions ) );
 
 				// Add PLURAL support for the first parameter. This results
 				// in a bit unlogical parameter sequence, but does not break
@@ -635,10 +643,10 @@ class SpecialUpload extends SpecialPage {
 		$filename = $file->getTitle()->getPrefixedText();
 		$warning = '';
 
-		if( $exists['warning'] == 'exists' ) {
+		if ( $exists['warning'] == 'exists' ) {
 			// Exact match
 			$warning = wfMessage( 'fileexists', $filename )->parse();
-		} elseif( $exists['warning'] == 'page-exists' ) {
+		} elseif ( $exists['warning'] == 'page-exists' ) {
 			// Page exists but file does not
 			$warning = wfMessage( 'filepageexists', $filename )->parse();
 		} elseif ( $exists['warning'] == 'exists-normalized' ) {
@@ -673,43 +681,20 @@ class SpecialUpload extends SpecialPage {
 		return $warning;
 	}
 
-	/**
-	 * Get a list of warnings
-	 *
-	 * @param string $filename local filename, e.g. 'file exists', 'non-descriptive filename'
-	 * @return Array: list of warning messages
-	 */
-	public static function ajaxGetExistsWarning( $filename ) {
-		$file = wfFindFile( $filename );
-		if( !$file ) {
-			// Force local file so we have an object to do further checks against
-			// if there isn't an exact match...
-			$file = wfLocalFile( $filename );
-		}
-		$s = '&#160;';
-		if ( $file ) {
-			$exists = UploadBase::getExistsWarning( $file );
-			$warning = self::getExistsWarning( $exists );
-			if ( $warning !== '' ) {
-				$s = "<div>$warning</div>";
-			}
-		}
-		return $s;
-	}
-
 	/**
 	 * Construct a warning and a gallery from an array of duplicate files.
 	 * @param $dupes array
 	 * @return string
 	 */
-	public static function getDupeWarning( $dupes ) {
+	public function getDupeWarning( $dupes ) {
 		if ( !$dupes ) {
 			return '';
 		}
 
-		$gallery = new ImageGallery;
+		$gallery = ImageGalleryBase::factory();
+		$gallery->setContext( $this->getContext() );
 		$gallery->setShowBytes( false );
-		foreach( $dupes as $file ) {
+		foreach ( $dupes as $file ) {
 			$gallery->add( $file->getTitle() );
 		}
 		return '<li>' .
@@ -843,10 +828,13 @@ class UploadForm extends HTMLForm {
 			'upload-type' => 'File',
 			'radio' => &$radio,
 			'help' => $this->msg( 'upload-maxfilesize',
-					$this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] )
-				)->parse() . ' ' . $this->msg( 'upload_source_file' )->escaped(),
+				$this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] ) )
+				->parse() .
+				$this->msg( 'word-separator' )->escaped() .
+				$this->msg( 'upload_source_file' )->escaped(),
 			'checked' => $selectedSourceType == 'file',
 		);
+
 		if ( $canUploadByUrl ) {
 			$this->mMaxUploadSize['url'] = UploadBase::getMaxUploadSize( 'url' );
 			$descriptor['UploadFileURL'] = array(
@@ -857,8 +845,10 @@ class UploadForm extends HTMLForm {
 				'upload-type' => 'url',
 				'radio' => &$radio,
 				'help' => $this->msg( 'upload-maxfilesize',
-						$this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] )
-					)->parse() . ' ' . $this->msg( 'upload_source_url' )->escaped(),
+					$this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] ) )
+					->parse() .
+					$this->msg( 'word-separator' )->escaped() .
+					$this->msg( 'upload_source_url' )->escaped(),
 				'checked' => $selectedSourceType == 'url',
 			);
 		}
@@ -884,21 +874,21 @@ class UploadForm extends HTMLForm {
 		global $wgCheckFileExtensions, $wgStrictFileExtensions,
 		$wgFileExtensions, $wgFileBlacklist;
 
-		if( $wgCheckFileExtensions ) {
-			if( $wgStrictFileExtensions ) {
+		if ( $wgCheckFileExtensions ) {
+			if ( $wgStrictFileExtensions ) {
 				# Everything not permitted is banned
 				$extensionsList =
 					'<div id="mw-upload-permitted">' .
-					$this->msg( 'upload-permitted', $this->getContext()->getLanguage()->commaList( $wgFileExtensions ) )->parseAsBlock() .
+					$this->msg( 'upload-permitted', $this->getContext()->getLanguage()->commaList( array_unique( $wgFileExtensions ) ) )->parseAsBlock() .
 					"</div>\n";
 			} else {
 				# We have to list both preferred and prohibited
 				$extensionsList =
 					'<div id="mw-upload-preferred">' .
-						$this->msg( 'upload-preferred', $this->getContext()->getLanguage()->commaList( $wgFileExtensions ) )->parseAsBlock() .
+						$this->msg( 'upload-preferred', $this->getContext()->getLanguage()->commaList( array_unique( $wgFileExtensions ) ) )->parseAsBlock() .
 					"</div>\n" .
 					'<div id="mw-upload-prohibited">' .
-						$this->msg( 'upload-prohibited', $this->getContext()->getLanguage()->commaList( $wgFileBlacklist ) )->parseAsBlock() .
+						$this->msg( 'upload-prohibited', $this->getContext()->getLanguage()->commaList( array_unique( $wgFileBlacklist ) ) )->parseAsBlock() .
 					"</div>\n";
 			}
 		} else {
diff --git a/includes/specials/SpecialUploadStash.php b/includes/specials/SpecialUploadStash.php
index 066dcfc9..87b64428 100644
--- a/includes/specials/SpecialUploadStash.php
+++ b/includes/specials/SpecialUploadStash.php
@@ -88,19 +88,19 @@ class SpecialUploadStash extends UnlistedSpecialPage {
 			} else {
 				return $this->outputLocalFile( $params['file'] );
 			}
-		} catch( UploadStashFileNotFoundException $e ) {
+		} catch ( UploadStashFileNotFoundException $e ) {
 			$code = 404;
 			$message = $e->getMessage();
-		} catch( UploadStashZeroLengthFileException $e ) {
+		} catch ( UploadStashZeroLengthFileException $e ) {
 			$code = 500;
 			$message = $e->getMessage();
-		} catch( UploadStashBadPathException $e ) {
+		} catch ( UploadStashBadPathException $e ) {
 			$code = 500;
 			$message = $e->getMessage();
-		} catch( SpecialUploadStashTooLargeException $e ) {
+		} catch ( SpecialUploadStashTooLargeException $e ) {
 			$code = 500;
 			$message = 'Cannot serve a file larger than ' . self::MAX_SERVE_BYTES . ' bytes. ' . $e->getMessage();
-		} catch( Exception $e ) {
+		} catch ( Exception $e ) {
 			$code = 500;
 			$message = $e->getMessage();
 		}
@@ -134,8 +134,13 @@ class SpecialUploadStash extends UnlistedSpecialPage {
 			$paramString = substr( $thumbPart, 0, $srcNamePos - 1 );
 
 			$handler = $file->getHandler();
-			$params = $handler->parseParamString( $paramString );
-			return array( 'file' => $file, 'type' => $type, 'params' => $params );
+			if ( $handler ) {
+				$params = $handler->parseParamString( $paramString );
+				return array( 'file' => $file, 'type' => $type, 'params' => $params );
+			} else {
+				throw new UploadStashBadPathException( 'No handler found for ' .
+						"mime {$file->getMimeType()} of file {$file->getPath()}" );
+			}
 		}
 
 		return array( 'file' => $file, 'type' => $type );
@@ -222,7 +227,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
 		global $wgUploadStashScalerBaseUrl;
 		$scalerBaseUrl = $wgUploadStashScalerBaseUrl;
 
-		if( preg_match( '/^\/\//', $scalerBaseUrl ) ) {
+		if ( preg_match( '/^\/\//', $scalerBaseUrl ) ) {
 			// this is apparently a protocol-relative URL, which makes no sense in this context,
 			// since this is used for communication that's internal to the application.
 			// default to http.
@@ -303,8 +308,6 @@ class SpecialUploadStash extends UnlistedSpecialPage {
 		header( "Content-Type: $contentType", true );
 		header( 'Content-Transfer-Encoding: binary', true );
 		header( 'Expires: Sun, 17-Jan-2038 19:14:07 GMT', true );
-		// Bug 53032 - It shouldn't be a problem here, but let's be safe and not cache
-		header( 'Cache-Control: private' );
 		header( "Content-Length: $size", true );
 	}
 
@@ -313,6 +316,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
 	 * Note the stash has to be recreated since this is being called in a static context.
 	 * This works, because there really is only one stash per logged-in user, despite appearances.
 	 *
+	 * @param array $formData
 	 * @return Status
 	 */
 	public static function tryClearStashedUploads( $formData ) {
@@ -339,15 +343,16 @@ class SpecialUploadStash extends UnlistedSpecialPage {
 		// create the form, which will also be used to execute a callback to process incoming form data
 		// this design is extremely dubious, but supposedly HTMLForm is our standard now?
 
+		$context = new DerivativeContext( $this->getContext() );
+		$context->setTitle( $this->getTitle() ); // Remove subpage
 		$form = new HTMLForm( array(
 			'Clear' => array(
 				'type' => 'hidden',
 				'default' => true,
 				'name' => 'clear',
 			)
-		), $this->getContext(), 'clearStashedUploads' );
+		), $context, 'clearStashedUploads' );
 		$form->setSubmitCallback( array( __CLASS__, 'tryClearStashedUploads' ) );
-		$form->setTitle( $this->getTitle() );
 		$form->setSubmitTextMsg( 'uploadstash-clear' );
 
 		$form->prepareForm();
diff --git a/includes/specials/SpecialUserlogin.php b/includes/specials/SpecialUserlogin.php
index eef66914..5ac3e654 100644
--- a/includes/specials/SpecialUserlogin.php
+++ b/includes/specials/SpecialUserlogin.php
@@ -48,18 +48,21 @@ class LoginForm extends SpecialPage {
 	var $mLoginattempt, $mRemember, $mEmail, $mDomain, $mLanguage;
 	var $mSkipCookieCheck, $mReturnToQuery, $mToken, $mStickHTTPS;
 	var $mType, $mReason, $mRealName;
-	var $mAbortLoginErrorMsg = 'login-abort-generic';
+	var $mAbortLoginErrorMsg = null;
 	private $mLoaded = false;
+	private $mSecureLoginUrl;
 
 	/**
-	 * @var ExternalUser
+	 * @ var WebRequest
 	 */
-	private $mExtUser = null;
+	private $mOverrideRequest = null;
 
 	/**
-	 * @ var WebRequest
+	 * Effective request; set at the beginning of load
+	 *
+	 * @var WebRequest $mRequest
 	 */
-	private $mOverrideRequest = null;
+	private $mRequest = null;
 
 	/**
 	 * @param WebRequest $request
@@ -86,6 +89,7 @@ class LoginForm extends SpecialPage {
 		} else {
 			$request = $this->mOverrideRequest;
 		}
+		$this->mRequest = $request;
 
 		$this->mType = $request->getText( 'type' );
 		$this->mUsername = $request->getText( 'wpName' );
@@ -101,25 +105,26 @@ class LoginForm extends SpecialPage {
 		$this->mLoginattempt = $request->getCheck( 'wpLoginattempt' );
 		$this->mAction = $request->getVal( 'action' );
 		$this->mRemember = $request->getCheck( 'wpRemember' );
-		$this->mStickHTTPS = $request->getCheck( 'wpStickHTTPS' );
+		$this->mFromHTTP = $request->getBool( 'fromhttp', false );
+		$this->mStickHTTPS = ( !$this->mFromHTTP && $request->detectProtocol() === 'https' ) || $request->getBool( 'wpForceHttps', false );
 		$this->mLanguage = $request->getText( 'uselang' );
 		$this->mSkipCookieCheck = $request->getCheck( 'wpSkipCookieCheck' );
 		$this->mToken = ( $this->mType == 'signup' ) ? $request->getVal( 'wpCreateaccountToken' ) : $request->getVal( 'wpLoginToken' );
 		$this->mReturnTo = $request->getVal( 'returnto', '' );
 		$this->mReturnToQuery = $request->getVal( 'returntoquery', '' );
 
-		if( $wgEnableEmail ) {
+		if ( $wgEnableEmail ) {
 			$this->mEmail = $request->getText( 'wpEmail' );
 		} else {
 			$this->mEmail = '';
 		}
-		if( !in_array( 'realname', $wgHiddenPrefs ) ) {
+		if ( !in_array( 'realname', $wgHiddenPrefs ) ) {
 			$this->mRealName = $request->getText( 'wpRealName' );
 		} else {
 			$this->mRealName = '';
 		}
 
-		if( !$wgAuth->validDomain( $this->mDomain ) ) {
+		if ( !$wgAuth->validDomain( $this->mDomain ) ) {
 			$this->mDomain = $wgAuth->getDomain();
 		}
 		$wgAuth->setDomain( $this->mDomain );
@@ -128,7 +133,7 @@ class LoginForm extends SpecialPage {
 		# 2. Do not return to PasswordReset after a successful password change
 		#    but goto Wiki start page (Main_Page) instead ( bug 33997 )
 		$returnToTitle = Title::newFromText( $this->mReturnTo );
-		if( is_object( $returnToTitle ) && (
+		if ( is_object( $returnToTitle ) && (
 			$returnToTitle->isSpecial( 'Userlogout' )
 			|| $returnToTitle->isSpecial( 'PasswordReset' ) ) ) {
 			$this->mReturnTo = '';
@@ -137,44 +142,61 @@ class LoginForm extends SpecialPage {
 	}
 
 	function getDescription() {
-		return $this->msg( $this->getUser()->isAllowed( 'createaccount' ) ?
-			'userlogin' : 'userloginnocreate' )->text();
+		if ( $this->mType === 'signup' ) {
+			return $this->msg( 'createaccount' )->text();
+		} else {
+			return $this->msg( 'login' )->text();
+		}
 	}
 
-	public function execute( $par ) {
+	/*
+	 * @param $subPage string|null
+	 */
+	public function execute( $subPage ) {
 		if ( session_id() == '' ) {
 			wfSetupSession();
 		}
 
 		$this->load();
+
+		// Check for [[Special:Userlogin/signup]]. This affects form display and
+		// page title.
+		if ( $subPage == 'signup' ) {
+			$this->mType = 'signup';
+		}
 		$this->setHeaders();
 
+		// If logging in and not on HTTPS, either redirect to it or offer a link.
 		global $wgSecureLogin;
-		if (
-			$this->mType !== 'signup' &&
-			$wgSecureLogin &&
-			WebRequest::detectProtocol() !== 'https'
-		) {
+		if ( WebRequest::detectProtocol() !== 'https' ) {
 			$title = $this->getFullTitle();
 			$query = array(
 				'returnto' => $this->mReturnTo,
 				'returntoquery' => $this->mReturnToQuery,
-				'wpStickHTTPS' => $this->mStickHTTPS
-			);
+				'title' => null,
+			) + $this->mRequest->getQueryValues();
 			$url = $title->getFullURL( $query, false, PROTO_HTTPS );
-			$this->getOutput()->redirect( $url );
-			return;
-		}
-
-		if ( $par == 'signup' ) { # Check for [[Special:Userlogin/signup]]
-			$this->mType = 'signup';
+			if ( $wgSecureLogin && wfCanIPUseHTTPS( $this->getRequest()->getIP() ) ) {
+				$url = wfAppendQuery( $url, 'fromhttp=1' );
+				$this->getOutput()->redirect( $url );
+				// Since we only do this redir to change proto, always vary
+				$this->getOutput()->addVaryHeader( 'X-Forwarded-Proto' );
+				return;
+			} else {
+				// A wiki without HTTPS login support should set $wgServer to
+				// http://somehost, in which case the secure URL generated
+				// above won't actually start with https://
+				if ( substr( $url, 0, 8 ) === 'https://' ) {
+					$this->mSecureLoginUrl = $url;
+				}
+			}
 		}
 
 		if ( !is_null( $this->mCookieCheck ) ) {
 			$this->onCookieRedirectCheck( $this->mCookieCheck );
 			return;
-		} elseif( $this->mPosted ) {
-			if( $this->mCreateaccount ) {
+		} elseif ( $this->mPosted ) {
+			if ( $this->mCreateaccount ) {
 				$this->addNewAccount();
 				return;
 			} elseif ( $this->mCreateaccountMail ) {
@@ -198,9 +220,9 @@ class LoginForm extends SpecialPage {
 		}
 
 		$status = $this->addNewaccountInternal();
-		if( !$status->isGood() ) {
-			$error = $this->getOutput()->parse( $status->getWikiText() );
-			$this->mainLoginForm( $error );
+		if ( !$status->isGood() ) {
+			$error = $status->getMessage();
+			$this->mainLoginForm( $error->toString() );
 			return;
 		}
 
@@ -217,7 +239,7 @@ class LoginForm extends SpecialPage {
 		$out = $this->getOutput();
 		$out->setPageTitle( $this->msg( 'accmailtitle' ) );
 
-		if( !$result->isGood() ) {
+		if ( !$result->isGood() ) {
 			$this->mainLoginForm( $this->msg( 'mailerror', $result->getWikiText() )->text() );
 		} else {
 			$out->addWikiMsg( 'accmailtext', $u->getName(), $u->getEmail() );
@@ -234,9 +256,9 @@ class LoginForm extends SpecialPage {
 
 		# Create the account and abort if there's a problem doing so
 		$status = $this->addNewAccountInternal();
-		if( !$status->isGood() ) {
-			$error = $this->getOutput()->parse( $status->getWikiText() );
-			$this->mainLoginForm( $error );
+		if ( !$status->isGood() ) {
+			$error = $status->getMessage();
+			$this->mainLoginForm( $error->toString() );
 			return false;
 		}
 
@@ -246,7 +268,7 @@ class LoginForm extends SpecialPage {
 		if ( $this->getUser()->isAnon() ) {
 			# If we showed up language selection links, and one was in use, be
 			# smart (and sensible) and save that language as the user's preference
-			if( $wgLoginLanguageSelector && $this->mLanguage ) {
+			if ( $wgLoginLanguageSelector && $this->mLanguage ) {
 				$u->setOption( 'language', $this->mLanguage );
 			} else {
 
@@ -263,9 +285,9 @@ class LoginForm extends SpecialPage {
 		$out = $this->getOutput();
 
 		# Send out an email authentication message if needed
-		if( $wgEmailAuthentication && Sanitizer::validateEmail( $u->getEmail() ) ) {
+		if ( $wgEmailAuthentication && Sanitizer::validateEmail( $u->getEmail() ) ) {
 			$status = $u->sendConfirmationMail();
-			if( $status->isGood() ) {
+			if ( $status->isGood() ) {
 				$out->addWikiMsg( 'confirmemail_oncreate' );
 			} else {
 				$out->addWikiText( $status->getWikiText( 'confirmemail_sendfailed' ) );
@@ -278,7 +300,7 @@ class LoginForm extends SpecialPage {
 		# If not logged in, assume the new account as the current one and set
 		# session cookies then show a "welcome" message or a "need cookies"
 		# message as needed
-		if( $this->getUser()->isAnon() ) {
+		if ( $this->getUser()->isAnon() ) {
 			$u->setCookies();
 			$wgUser = $u;
 			// This should set it for OutputPage and the Skin
@@ -287,7 +309,7 @@ class LoginForm extends SpecialPage {
 			$this->getContext()->setUser( $u );
 			wfRunHooks( 'AddNewAccount', array( $u, false ) );
 			$u->addNewUserLogEntry( 'create' );
-			if( $this->hasSessionCookie() ) {
+			if ( $this->hasSessionCookie() ) {
 				$this->successfulCreation();
 			} else {
 				$this->cookieRedirectCheck( 'new' );
@@ -314,7 +336,7 @@ class LoginForm extends SpecialPage {
 			$wgMinimalPasswordLength, $wgEmailConfirmToEdit;
 
 		// If the user passes an invalid domain, something is fishy
-		if( !$wgAuth->validDomain( $this->mDomain ) ) {
+		if ( !$wgAuth->validDomain( $this->mDomain ) ) {
 			return Status::newFatal( 'wrongpassword' );
 		}
 
@@ -323,8 +345,8 @@ class LoginForm extends SpecialPage {
 		// cation server before they create an account (otherwise, they can
 		// create a local account and login as any domain user). We only need
 		// to check this for domains that aren't local.
-		if( 'local' != $this->mDomain && $this->mDomain != '' ) {
-			if(
+		if ( 'local' != $this->mDomain && $this->mDomain != '' ) {
+			if (
 				!$wgAuth->canCreateAccounts() &&
 				(
 					!$wgAuth->userExists( $this->mUsername ) ||
@@ -422,10 +444,12 @@ class LoginForm extends SpecialPage {
 		$u->setRealName( $this->mRealName );
 
 		$abortError = '';
-		if( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError ) ) ) {
+		if ( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError ) ) ) {
 			// Hook point to add extra creation throttles and blocks
 			wfDebug( "LoginForm::addNewAccountInternal: a hook blocked creation\n" );
-			return Status::newFatal( new RawMessage( $abortError ) );
+			$abortError = new RawMessage( $abortError );
+			$abortError->text();
+			return Status::newFatal( $abortError );
 		}
 
 		// Hook point to check for exempt from account creation throttle
@@ -445,7 +469,7 @@ class LoginForm extends SpecialPage {
 			}
 		}
 
-		if( !$wgAuth->addUser( $u, $this->mPassword, $this->mEmail, $this->mRealName ) ) {
+		if ( !$wgAuth->addUser( $u, $this->mPassword, $this->mEmail, $this->mRealName ) ) {
 			return Status::newFatal( 'externaldberror' );
 		}
 
@@ -480,14 +504,6 @@ class LoginForm extends SpecialPage {
 
 		$wgAuth->initUser( $u, $autocreate );
 
-		if ( $this->mExtUser ) {
-			$this->mExtUser->linkToLocal( $u->getId() );
-			$email = $this->mExtUser->getPref( 'emailaddress' );
-			if ( $email && !$this->mEmail ) {
-				$u->setEmail( $email );
-			}
-		}
-
 		$u->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 );
 		$u->saveSettings();
 
@@ -550,12 +566,8 @@ class LoginForm extends SpecialPage {
 			return self::SUCCESS;
 		}
 
-		$this->mExtUser = ExternalUser::newFromName( $this->mUsername );
-
-		# TODO: Allow some magic here for invalid external names, e.g., let the
-		# user choose a different wiki name.
 		$u = User::newFromName( $this->mUsername );
-		if( !( $u instanceof User ) || !User::isUsableName( $u->getName() ) ) {
+		if ( !( $u instanceof User ) || !User::isUsableName( $u->getName() ) ) {
 			return self::ILLEGAL;
 		}
 
@@ -568,28 +580,20 @@ class LoginForm extends SpecialPage {
 				$isAutoCreated = true;
 			}
 		} else {
-			global $wgExternalAuthType, $wgAutocreatePolicy;
-			if ( $wgExternalAuthType && $wgAutocreatePolicy != 'never'
-				&& is_object( $this->mExtUser )
-				&& $this->mExtUser->authenticate( $this->mPassword )
-			) {
-				# The external user and local user have the same name and
-				# password, so we assume they're the same.
-				$this->mExtUser->linkToLocal( $u->getID() );
-			}
-
 			$u->load();
 		}
 
 		// Give general extensions, such as a captcha, a chance to abort logins
 		$abort = self::ABORTED;
-		if( !wfRunHooks( 'AbortLogin', array( $u, $this->mPassword, &$abort, &$this->mAbortLoginErrorMsg ) ) ) {
+		$msg = null;
+		if ( !wfRunHooks( 'AbortLogin', array( $u, $this->mPassword, &$abort, &$msg ) ) ) {
+			$this->mAbortLoginErrorMsg = $msg;
 			return $abort;
 		}
 
 		global $wgBlockDisablesLogin;
 		if ( !$u->checkPassword( $this->mPassword ) ) {
-			if( $u->checkTemporaryPassword( $this->mPassword ) ) {
+			if ( $u->checkTemporaryPassword( $this->mPassword ) ) {
 				// The e-mailed temporary password should not be used for actu-
 				// al logins; that's a very sloppy habit, and insecure if an
 				// attacker has a few seconds to click "search" on someone's o-
@@ -606,7 +610,7 @@ class LoginForm extends SpecialPage {
 				// As a side-effect, we can authenticate the user's e-mail ad-
 				// dress if it's not already done, since the temporary password
 				// was sent via e-mail.
-				if( !$u->isEmailConfirmed() ) {
+				if ( !$u->isEmailConfirmed() ) {
 					$u->confirmEmail();
 					$u->saveSettings();
 				}
@@ -696,44 +700,26 @@ class LoginForm extends SpecialPage {
 	 * @return integer Status code
 	 */
 	function attemptAutoCreate( $user ) {
-		global $wgAuth, $wgAutocreatePolicy;
+		global $wgAuth;
 
 		if ( $this->getUser()->isBlockedFromCreateAccount() ) {
 			wfDebug( __METHOD__ . ": user is blocked from account creation\n" );
 			return self::CREATE_BLOCKED;
 		}
-
-		/**
-		 * If the external authentication plugin allows it, automatically cre-
-		 * ate a new account for users that are externally defined but have not
-		 * yet logged in.
-		 */
-		if ( $this->mExtUser ) {
-			# mExtUser is neither null nor false, so use the new ExternalAuth
-			# system.
-			if ( $wgAutocreatePolicy == 'never' ) {
-				return self::NOT_EXISTS;
-			}
-			if ( !$this->mExtUser->authenticate( $this->mPassword ) ) {
-				return self::WRONG_PLUGIN_PASS;
-			}
-		} else {
-			# Old AuthPlugin.
-			if ( !$wgAuth->autoCreate() ) {
-				return self::NOT_EXISTS;
-			}
-			if ( !$wgAuth->userExists( $user->getName() ) ) {
-				wfDebug( __METHOD__ . ": user does not exist\n" );
-				return self::NOT_EXISTS;
-			}
-			if ( !$wgAuth->authenticate( $user->getName(), $this->mPassword ) ) {
-				wfDebug( __METHOD__ . ": \$wgAuth->authenticate() returned false, aborting\n" );
-				return self::WRONG_PLUGIN_PASS;
-			}
+		if ( !$wgAuth->autoCreate() ) {
+			return self::NOT_EXISTS;
+		}
+		if ( !$wgAuth->userExists( $user->getName() ) ) {
+			wfDebug( __METHOD__ . ": user does not exist\n" );
+			return self::NOT_EXISTS;
+		}
+		if ( !$wgAuth->authenticate( $user->getName(), $this->mPassword ) ) {
+			wfDebug( __METHOD__ . ": \$wgAuth->authenticate() returned false, aborting\n" );
+			return self::WRONG_PLUGIN_PASS;
 		}
 
 		$abortError = '';
-		if( !wfRunHooks( 'AbortAutoAccount', array( $user, &$abortError ) ) ) {
+		if ( !wfRunHooks( 'AbortAutoAccount', array( $user, &$abortError ) ) ) {
 			// Hook point to add extra creation throttles and blocks
 			wfDebug( "LoginForm::attemptAutoCreate: a hook blocked creation: $abortError\n" );
 			$this->mAbortLoginErrorMsg = $abortError;
@@ -753,20 +739,24 @@ class LoginForm extends SpecialPage {
 	}
 
 	function processLogin() {
-		global $wgMemc, $wgLang, $wgSecureLogin;
+		global $wgMemc, $wgLang, $wgSecureLogin, $wgPasswordAttemptThrottle;
 
 		switch ( $this->authenticateUserData() ) {
 			case self::SUCCESS:
 				# We've verified now, update the real record
 				$user = $this->getUser();
-				if( (bool)$this->mRemember != $user->getBoolOption( 'rememberpassword' ) ) {
+				if ( (bool)$this->mRemember != $user->getBoolOption( 'rememberpassword' ) ) {
 					$user->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 );
 					$user->saveSettings();
 				} else {
 					$user->invalidateCache();
 				}
 
-				if( $wgSecureLogin && !$this->mStickHTTPS ) {
+				if ( $user->requiresHTTPS() ) {
+					$this->mStickHTTPS = true;
+				}
+
+				if ( $wgSecureLogin && !$this->mStickHTTPS ) {
 					$user->setCookies( null, false );
 				} else {
 					$user->setCookies();
@@ -778,7 +768,7 @@ class LoginForm extends SpecialPage {
 				$key = wfMemcKey( 'password-throttle', $request->getIP(), md5( $this->mUsername ) );
 				$wgMemc->delete( $key );
 
-				if( $this->hasSessionCookie() || $this->mSkipCookieCheck ) {
+				if ( $this->hasSessionCookie() || $this->mSkipCookieCheck ) {
 					/* Replace the language object to provide user interface in
 					 * correct language immediately on this first page load.
 					 */
@@ -795,48 +785,62 @@ class LoginForm extends SpecialPage {
 				break;
 
 			case self::NEED_TOKEN:
-				$this->mainLoginForm( $this->msg( 'nocookiesforlogin' )->parse() );
+				$error = $this->mAbortLoginErrorMsg ?: 'nocookiesforlogin';
+				$this->mainLoginForm( $this->msg( $error )->parse() );
 				break;
 			case self::WRONG_TOKEN:
-				$this->mainLoginForm( $this->msg( 'sessionfailure' )->text() );
+				$error = $this->mAbortLoginErrorMsg ?: 'sessionfailure';
+				$this->mainLoginForm( $this->msg( $error )->text() );
 				break;
 			case self::NO_NAME:
 			case self::ILLEGAL:
-				$this->mainLoginForm( $this->msg( 'noname' )->text() );
+				$error = $this->mAbortLoginErrorMsg ?: 'noname';
+				$this->mainLoginForm( $this->msg( $error )->text() );
 				break;
 			case self::WRONG_PLUGIN_PASS:
-				$this->mainLoginForm( $this->msg( 'wrongpassword' )->text() );
+				$error = $this->mAbortLoginErrorMsg ?: 'wrongpassword';
+				$this->mainLoginForm( $this->msg( $error )->text() );
 				break;
 			case self::NOT_EXISTS:
-				if( $this->getUser()->isAllowed( 'createaccount' ) ) {
-					$this->mainLoginForm( $this->msg( 'nosuchuser',
+				if ( $this->getUser()->isAllowed( 'createaccount' ) ) {
+					$error = $this->mAbortLoginErrorMsg ?: 'nosuchuser';
+					$this->mainLoginForm( $this->msg( $error,
 						wfEscapeWikiText( $this->mUsername ) )->parse() );
 				} else {
-					$this->mainLoginForm( $this->msg( 'nosuchusershort',
+					$error = $this->mAbortLoginErrorMsg ?: 'nosuchusershort';
+					$this->mainLoginForm( $this->msg( $error,
 						wfEscapeWikiText( $this->mUsername ) )->text() );
 				}
 				break;
 			case self::WRONG_PASS:
-				$this->mainLoginForm( $this->msg( 'wrongpassword' )->text() );
+				$error = $this->mAbortLoginErrorMsg ?: 'wrongpassword';
+				$this->mainLoginForm( $this->msg( $error )->text() );
 				break;
 			case self::EMPTY_PASS:
-				$this->mainLoginForm( $this->msg( 'wrongpasswordempty' )->text() );
+				$error = $this->mAbortLoginErrorMsg ?: 'wrongpasswordempty';
+				$this->mainLoginForm( $this->msg( $error )->text() );
 				break;
 			case self::RESET_PASS:
-				$this->resetLoginForm( $this->msg( 'resetpass_announce' )->text() );
+				$error = $this->mAbortLoginErrorMsg ?: 'resetpass_announce';
+				$this->resetLoginForm( $this->msg( $error )->text() );
 				break;
 			case self::CREATE_BLOCKED:
-				$this->userBlockedMessage( $this->getUser()->mBlock );
+				$this->userBlockedMessage( $this->getUser()->isBlockedFromCreateAccount() );
 				break;
 			case self::THROTTLED:
-				$this->mainLoginForm( $this->msg( 'login-throttled' )->text() );
+				$error = $this->mAbortLoginErrorMsg ?: 'login-throttled';
+				$this->mainLoginForm( $this->msg( $error )
+				->params ( $this->getLanguage()->formatDuration( $wgPasswordAttemptThrottle['seconds'] ) )
+				->text()
+				);
 				break;
 			case self::USER_BLOCKED:
-				$this->mainLoginForm( $this->msg( 'login-userblocked',
-					$this->mUsername )->escaped() );
+				$error = $this->mAbortLoginErrorMsg ?: 'login-userblocked';
+				$this->mainLoginForm( $this->msg( $error, $this->mUsername )->escaped() );
 				break;
 			case self::ABORTED:
-				$this->mainLoginForm( $this->msg( $this->mAbortLoginErrorMsg )->text() );
+				$error = $this->mAbortLoginErrorMsg ?: 'login-abort-generic';
+				$this->mainLoginForm( $this->msg( $error )->text() );
 				break;
 			default:
 				throw new MWException( 'Unhandled case value' );
@@ -867,7 +871,7 @@ class LoginForm extends SpecialPage {
 			return Status::newFatal( 'noemail', $u->getName() );
 		}
 		$ip = $this->getRequest()->getIP();
-		if( !$ip ) {
+		if ( !$ip ) {
 			return Status::newFatal( 'badipaddress' );
 		}
 
@@ -901,7 +905,7 @@ class LoginForm extends SpecialPage {
 		$injected_html = '';
 		wfRunHooks( 'UserLoginComplete', array( &$currentUser, &$injected_html ) );
 
-		if( $injected_html !== '' ) {
+		if ( $injected_html !== '' ) {
 			$this->displaySuccessfulAction( $this->msg( 'loginsuccesstitle' ),
 				'loginsuccess', $injected_html );
 		} else {
@@ -980,6 +984,29 @@ class LoginForm extends SpecialPage {
 		);
 	}
 
+	/**
+	 * Add a "return to" link or redirect to it.
+	 * Extensions can use this to reuse the "return to" logic after
+	 * inject steps (such as redirection) into the login process.
+	 *
+	 * @param $type string, one of the following:
+	 *    - error: display a return to link ignoring $wgRedirectOnLogin
+	 *    - success: display a return to link using $wgRedirectOnLogin if needed
+	 *    - successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
+	 * @param string $returnTo
+	 * @param array|string $returnToQuery
+	 * @param bool $stickHTTPs Keep redirect link on HTTPs
+	 * @since 1.22
+	 */
+	public function showReturnToPage(
+		$type, $returnTo = '', $returnToQuery = '', $stickHTTPs = false
+	) {
+		$this->mReturnTo = $returnTo;
+		$this->mReturnToQuery = $returnToQuery;
+		$this->mStickHTTPS = $stickHTTPs;
+		$this->executeReturnTo( $type );
+	}
+
 	/**
 	 * Add a "return to" link or redirect to it.
 	 *
@@ -1007,7 +1034,7 @@ class LoginForm extends SpecialPage {
 		if ( $wgSecureLogin && !$this->mStickHTTPS ) {
 			$options = array( 'http' );
 			$proto = PROTO_HTTP;
-		} elseif( $wgSecureLogin ) {
+		} elseif ( $wgSecureLogin ) {
 			$options = array( 'https' );
 			$proto = PROTO_HTTPS;
 		} else {
@@ -1030,10 +1057,11 @@ class LoginForm extends SpecialPage {
 		global $wgEnableEmail, $wgEnableUserEmail;
 		global $wgHiddenPrefs, $wgLoginLanguageSelector;
 		global $wgAuth, $wgEmailConfirmToEdit, $wgCookieExpiration;
-		global $wgSecureLogin, $wgSecureLoginDefaultHTTPS, $wgPasswordResetRoutes;
+		global $wgSecureLogin, $wgPasswordResetRoutes;
 
 		$titleObj = $this->getTitle();
 		$user = $this->getUser();
+		$out = $this->getOutput();
 
 		if ( $this->mType == 'signup' ) {
 			// Block signup here if in readonly. Keeps user from
@@ -1061,15 +1089,33 @@ class LoginForm extends SpecialPage {
 
 		if ( $this->mType == 'signup' ) {
 			$template = new UsercreateTemplate();
+
+			$out->addModuleStyles( array(
+				'mediawiki.ui',
+				'mediawiki.special.createaccount'
+			) );
+			// XXX hack pending RL or JS parse() support for complex content messages
+			// https://bugzilla.wikimedia.org/show_bug.cgi?id=25349
+			$out->addJsConfigVars( 'wgCreateacctImgcaptchaHelp',
+				$this->msg( 'createacct-imgcaptcha-help' )->parse() );
+			$out->addModules( array(
+				'mediawiki.special.createaccount.js'
+			) );
+			// Must match number of benefits defined in messages
+			$template->set( 'benefitCount', 3 );
+
 			$q = 'action=submitlogin&type=signup';
 			$linkq = 'type=login';
-			$linkmsg = 'gotaccount';
-			$this->getOutput()->addModules( 'mediawiki.special.userlogin.signup' );
 		} else {
 			$template = new UserloginTemplate();
+
+			$out->addModuleStyles( array(
+				'mediawiki.ui',
+				'mediawiki.special.userlogin'
+			) );
+
 			$q = 'action=submitlogin&type=login';
 			$linkq = 'type=signup';
-			$linkmsg = 'nologin';
 		}
 
 		if ( $this->mReturnTo !== '' ) {
@@ -1082,30 +1128,24 @@ class LoginForm extends SpecialPage {
 			$linkq .= $returnto;
 		}
 
-		# Don't show a "create account" link if the user can't
-		if( $this->showCreateOrLoginLink( $user ) ) {
+		# Don't show a "create account" link if the user can't.
+		if ( $this->showCreateOrLoginLink( $user ) ) {
 			# Pass any language selection on to the mode switch link
-			if( $wgLoginLanguageSelector && $this->mLanguage ) {
+			if ( $wgLoginLanguageSelector && $this->mLanguage ) {
 				$linkq .= '&uselang=' . $this->mLanguage;
 			}
-			$link = Html::element( 'a', array( 'href' => $titleObj->getLocalURL( $linkq ) ),
-				$this->msg( $linkmsg . 'link' )->text() ); # Calling either 'gotaccountlink' or 'nologinlink'
-
-			$template->set( 'link', $this->msg( $linkmsg )->rawParams( $link )->parse() );
+			// Supply URL, login template creates the button.
+			$template->set( 'createOrLoginHref', $titleObj->getLocalURL( $linkq ) );
 		} else {
 			$template->set( 'link', '' );
 		}
 
-		// Decide if we default stickHTTPS on
-		if ( $wgSecureLoginDefaultHTTPS && $this->mAction != 'submitlogin' && !$this->mLoginattempt ) {
-			$this->mStickHTTPS = true;
-		}
-
 		$resetLink = $this->mType == 'signup'
 			? null
 			: is_array( $wgPasswordResetRoutes ) && in_array( true, array_values( $wgPasswordResetRoutes ) );
 
 		$template->set( 'header', '' );
+		$template->set( 'skin', $this->getSkin() );
 		$template->set( 'name', $this->mUsername );
 		$template->set( 'password', $this->mPassword );
 		$template->set( 'retype', $this->mRetype );
@@ -1129,7 +1169,9 @@ class LoginForm extends SpecialPage {
 		$template->set( 'usereason', $user->isLoggedIn() );
 		$template->set( 'remember', $user->getOption( 'rememberpassword' ) || $this->mRemember );
 		$template->set( 'cansecurelogin', ( $wgSecureLogin === true ) );
-		$template->set( 'stickHTTPS', $this->mStickHTTPS );
+		$template->set( 'stickhttps', (int)$this->mStickHTTPS );
+		$template->set( 'loggedin', $user->isLoggedIn() );
+		$template->set( 'loggedinuser', $user->getName() );
 
 		if ( $this->mType == 'signup' ) {
 			if ( !self::getCreateaccountToken() ) {
@@ -1144,15 +1186,16 @@ class LoginForm extends SpecialPage {
 		}
 
 		# Prepare language selection links as needed
-		if( $wgLoginLanguageSelector ) {
+		if ( $wgLoginLanguageSelector ) {
 			$template->set( 'languages', $this->makeLanguageSelector() );
-			if( $this->mLanguage ) {
+			if ( $this->mLanguage ) {
 				$template->set( 'uselang', $this->mLanguage );
 			}
 		}
 
+		$template->set( 'secureLoginUrl', $this->mSecureLoginUrl );
 		// Use loginend-https for HTTPS requests if it's not blank, loginend otherwise
-		// Ditto for signupend
+		// Ditto for signupend.  New forms use neither.
 		$usingHTTPS = WebRequest::detectProtocol() == 'https';
 		$loginendHTTPS = $this->msg( 'loginend-https' );
 		$signupendHTTPS = $this->msg( 'signupend-https' );
@@ -1175,22 +1218,21 @@ class LoginForm extends SpecialPage {
 			wfRunHooks( 'UserLoginForm', array( &$template ) );
 		}
 
-		$out = $this->getOutput();
 		$out->disallowUserJs(); // just in case...
 		$out->addTemplate( $template );
 	}
 
 	/**
-	 * @private
+	 * Whether the login/create account form should display a link to the
+	 * other form (in addition to whatever the skin provides).
 	 *
 	 * @param $user User
-	 *
-	 * @return Boolean
+	 * @return bool
 	 */
-	function showCreateOrLoginLink( &$user ) {
-		if( $this->mType == 'signup' ) {
+	private function showCreateOrLoginLink( &$user ) {
+		if ( $this->mType == 'signup' ) {
 			return true;
-		} elseif( $user->isAllowed( 'createaccount' ) ) {
+		} elseif ( $user->isAllowed( 'createaccount' ) ) {
 			return true;
 		} else {
 			return false;
@@ -1269,22 +1311,11 @@ class LoginForm extends SpecialPage {
 	 */
 	private function renewSessionId() {
 		global $wgSecureLogin, $wgCookieSecure;
-		if( $wgSecureLogin && !$this->mStickHTTPS ) {
+		if ( $wgSecureLogin && !$this->mStickHTTPS ) {
 			$wgCookieSecure = false;
 		}
 
-		// If either we don't trust PHP's entropy, or if we need
-		// to change cookie settings when logging in because of
-		// wpStickHTTPS, then change the session ID manually.
-		$cookieParams = session_get_cookie_params();
-		if ( wfCheckEntropy() && $wgCookieSecure == $cookieParams['secure'] ) {
-			session_regenerate_id( false );
-		} else {
-			$tmp = $_SESSION;
-			session_destroy();
-			wfSetupSession( MWCryptRand::generateHex( 32 ) );
-			$_SESSION = $tmp;
-		}
+		wfResetSessionID();
 	}
 
 	/**
@@ -1328,10 +1359,10 @@ class LoginForm extends SpecialPage {
 	 */
 	function makeLanguageSelector() {
 		$msg = $this->msg( 'loginlanguagelinks' )->inContentLanguage();
-		if( !$msg->isBlank() ) {
+		if ( !$msg->isBlank() ) {
 			$langs = explode( "\n", $msg->text() );
 			$links = array();
-			foreach( $langs as $lang ) {
+			foreach ( $langs as $lang ) {
 				$lang = trim( $lang, '* ' );
 				$parts = explode( '|', $lang );
 				if ( count( $parts ) >= 2 ) {
@@ -1354,15 +1385,15 @@ class LoginForm extends SpecialPage {
 	 * @return string
 	 */
 	function makeLanguageSelectorLink( $text, $lang ) {
-		if( $this->getLanguage()->getCode() == $lang ) {
+		if ( $this->getLanguage()->getCode() == $lang ) {
 			// no link for currently used language
 			return htmlspecialchars( $text );
 		}
 		$query = array( 'uselang' => $lang );
-		if( $this->mType == 'signup' ) {
+		if ( $this->mType == 'signup' ) {
 			$query['type'] = 'signup';
 		}
-		if( $this->mReturnTo !== '' ) {
+		if ( $this->mReturnTo !== '' ) {
 			$query['returnto'] = $this->mReturnTo;
 			$query['returntoquery'] = $this->mReturnToQuery;
 		}
diff --git a/includes/specials/SpecialUserrights.php b/includes/specials/SpecialUserrights.php
index d4baae28..4501736f 100644
--- a/includes/specials/SpecialUserrights.php
+++ b/includes/specials/SpecialUserrights.php
@@ -45,6 +45,11 @@ class UserrightsPage extends SpecialPage {
 		return $this->userCanChangeRights( $user, false );
 	}
 
+	/**
+	 * @param User $user
+	 * @param bool $checkIfSelf
+	 * @return bool
+	 */
 	public function userCanChangeRights( $user, $checkIfSelf = true ) {
 		$available = $this->changeableGroups();
 		if ( $user->getId() == 0 ) {
@@ -75,13 +80,13 @@ class UserrightsPage extends SpecialPage {
 		 * (e.g. they don't have the userrights permission), then don't
 		 * allow them to use Special:UserRights.
 		 */
-		if( $user->isBlocked() && !$user->isAllowed( 'userrights' ) ) {
+		if ( $user->isBlocked() && !$user->isAllowed( 'userrights' ) ) {
 			throw new UserBlockedError( $user->getBlock() );
 		}
 
 		$request = $this->getRequest();
 
-		if( $par !== null ) {
+		if ( $par !== null ) {
 			$this->mTarget = $par;
 		} else {
 			$this->mTarget = $request->getVal( 'user' );
@@ -95,15 +100,27 @@ class UserrightsPage extends SpecialPage {
 			 * edit their own groups, automatically set them as the
 			 * target.
 			 */
-			if ( !count( $available['add'] ) && !count( $available['remove'] ) )
+			if ( !count( $available['add'] ) && !count( $available['remove'] ) ) {
 				$this->mTarget = $user->getName();
+			}
 		}
 
 		if ( User::getCanonicalName( $this->mTarget ) == $user->getName() ) {
 			$this->isself = true;
 		}
 
-		if( !$this->userCanChangeRights( $user, true ) ) {
+		if ( !$this->userCanChangeRights( $user, true ) ) {
+			if ( $this->isself && $request->getCheck( 'success' ) ) {
+				// bug 48609: if the user just removed its own rights, this would
+				// leads it in a "permissions error" page. In that case, show a
+				// message that it can't anymore use this page instead of an error
+				$this->setHeaders();
+				$out = $this->getOutput();
+				$out->wrapWikiMsg( "<div class=\"successbox\">\n$1\n</div>", 'userrights-removed-self' );
+				$out->returnToMain();
+				return;
+			}
+
 			// @todo FIXME: There may be intermediate groups we can mention.
 			$msg = $user->isAnon() ? 'userrights-nologin' : 'userrights-notallowed';
 			throw new PermissionsError( null, array( array( $msg ) ) );
@@ -122,31 +139,42 @@ class UserrightsPage extends SpecialPage {
 			$this->switchForm();
 		}
 
-		if( $request->wasPosted() ) {
+		if (
+			$request->wasPosted() &&
+			$request->getCheck( 'saveusergroups' ) &&
+			$user->matchEditToken( $request->getVal( 'wpEditToken' ), $this->mTarget )
+		) {
 			// save settings
-			if( $request->getCheck( 'saveusergroups' ) ) {
-				$reason = $request->getVal( 'user-reason' );
-				$tok = $request->getVal( 'wpEditToken' );
-				if( $user->matchEditToken( $tok, $this->mTarget ) ) {
-					$this->saveUserGroups(
-						$this->mTarget,
-						$reason
-					);
-
-					$out->redirect( $this->getSuccessURL() );
-					return;
-				}
+			$status = $this->fetchUser( $this->mTarget );
+			if ( !$status->isOK() ) {
+				$this->getOutput()->addWikiText( $status->getWikiText() );
+				return;
+			}
+
+			$targetUser = $status->value;
+
+			if ( $request->getVal( 'conflictcheck-originalgroups' ) !== implode( ',', $targetUser->getGroups() ) ) {
+				$out->addWikiMsg( 'userrights-conflict' );
+			} else {
+				$this->saveUserGroups(
+					$this->mTarget,
+					$request->getVal( 'user-reason' ),
+					$targetUser
+				);
+
+				$out->redirect( $this->getSuccessURL() );
+				return;
 			}
 		}
 
 		// show some more forms
-		if( $this->mTarget !== null ) {
+		if ( $this->mTarget !== null ) {
 			$this->editUserGroupsForm( $this->mTarget );
 		}
 	}
 
 	function getSuccessURL() {
-		return $this->getTitle( $this->mTarget )->getFullURL();
+		return $this->getTitle( $this->mTarget )->getFullURL( array( 'success' => 1 ) );
 	}
 
 	/**
@@ -155,17 +183,10 @@ class UserrightsPage extends SpecialPage {
 	 *
 	 * @param string $username username to apply changes to.
 	 * @param string $reason reason for group change
+	 * @param User|UserRightsProxy $user Target user object.
 	 * @return null
 	 */
-	function saveUserGroups( $username, $reason = '' ) {
-		$status = $this->fetchUser( $username );
-		if( !$status->isOK() ) {
-			$this->getOutput()->addWikiText( $status->getWikiText() );
-			return;
-		} else {
-			$user = $status->value;
-		}
-
+	function saveUserGroups( $username, $reason, $user ) {
 		$allgroups = $this->getAllGroups();
 		$addgroup = array();
 		$removegroup = array();
@@ -195,6 +216,8 @@ class UserrightsPage extends SpecialPage {
 	 * @return Array: Tuple of added, then removed groups
 	 */
 	function doSaveUserGroups( $user, $add, $remove, $reason = '' ) {
+		global $wgAuth;
+
 		// Validate input set...
 		$isself = ( $user->getName() == $this->getUser()->getName() );
 		$groups = $user->getGroups();
@@ -213,15 +236,15 @@ class UserrightsPage extends SpecialPage {
 		$newGroups = $oldGroups;
 
 		// remove then add groups
-		if( $remove ) {
+		if ( $remove ) {
 			$newGroups = array_diff( $newGroups, $remove );
-			foreach( $remove as $group ) {
+			foreach ( $remove as $group ) {
 				$user->removeGroup( $group );
 			}
 		}
-		if( $add ) {
+		if ( $add ) {
 			$newGroups = array_merge( $newGroups, $add );
-			foreach( $add as $group ) {
+			foreach ( $add as $group ) {
 				$user->addGroup( $group );
 			}
 		}
@@ -230,11 +253,14 @@ class UserrightsPage extends SpecialPage {
 		// Ensure that caches are cleared
 		$user->invalidateCache();
 
+		// update groups in external authentication database
+		$wgAuth->updateExternalDBGroups( $user, $add, $remove );
+
 		wfDebug( 'oldGroups: ' . print_r( $oldGroups, true ) );
 		wfDebug( 'newGroups: ' . print_r( $newGroups, true ) );
 		wfRunHooks( 'UserRights', array( &$user, $add, $remove ) );
 
-		if( $newGroups != $oldGroups ) {
+		if ( $newGroups != $oldGroups ) {
 			$this->addLogEntry( $user, $oldGroups, $newGroups, $reason );
 		}
 		return array( $add, $remove );
@@ -262,7 +288,7 @@ class UserrightsPage extends SpecialPage {
 	 */
 	function editUserGroupsForm( $username ) {
 		$status = $this->fetchUser( $username );
-		if( !$status->isOK() ) {
+		if ( !$status->isOK() ) {
 			$this->getOutput()->addWikiText( $status->getWikiText() );
 			return;
 		} else {
@@ -283,63 +309,64 @@ class UserrightsPage extends SpecialPage {
 	 * return a user (or proxy) object for manipulating it.
 	 *
 	 * Side effects: error output for invalid access
+	 * @param string $username
 	 * @return Status object
 	 */
 	public function fetchUser( $username ) {
 		global $wgUserrightsInterwikiDelimiter;
 
 		$parts = explode( $wgUserrightsInterwikiDelimiter, $username );
-		if( count( $parts ) < 2 ) {
+		if ( count( $parts ) < 2 ) {
 			$name = trim( $username );
 			$database = '';
 		} else {
 			list( $name, $database ) = array_map( 'trim', $parts );
 
-			if( $database == wfWikiID() ) {
+			if ( $database == wfWikiID() ) {
 				$database = '';
 			} else {
-				if( !$this->getUser()->isAllowed( 'userrights-interwiki' ) ) {
+				if ( !$this->getUser()->isAllowed( 'userrights-interwiki' ) ) {
 					return Status::newFatal( 'userrights-no-interwiki' );
 				}
-				if( !UserRightsProxy::validDatabase( $database ) ) {
+				if ( !UserRightsProxy::validDatabase( $database ) ) {
 					return Status::newFatal( 'userrights-nodatabase', $database );
 				}
 			}
 		}
 
-		if( $name === '' ) {
+		if ( $name === '' ) {
 			return Status::newFatal( 'nouserspecified' );
 		}
 
-		if( $name[0] == '#' ) {
+		if ( $name[0] == '#' ) {
 			// Numeric ID can be specified...
 			// We'll do a lookup for the name internally.
 			$id = intval( substr( $name, 1 ) );
 
-			if( $database == '' ) {
+			if ( $database == '' ) {
 				$name = User::whoIs( $id );
 			} else {
 				$name = UserRightsProxy::whoIs( $database, $id );
 			}
 
-			if( !$name ) {
+			if ( !$name ) {
 				return Status::newFatal( 'noname' );
 			}
 		} else {
 			$name = User::getCanonicalName( $name );
-			if( $name === false ) {
+			if ( $name === false ) {
 				// invalid name
 				return Status::newFatal( 'nosuchusershort', $username );
 			}
 		}
 
-		if( $database == '' ) {
+		if ( $database == '' ) {
 			$user = User::newFromName( $name );
 		} else {
 			$user = UserRightsProxy::newFromName( $database, $name );
 		}
 
-		if( !$user || $user->isAnon() ) {
+		if ( !$user || $user->isAnon() ) {
 			return Status::newFatal( 'nosuchusershort', $username );
 		}
 
@@ -347,7 +374,7 @@ class UserrightsPage extends SpecialPage {
 	}
 
 	function makeGroupNameList( $ids ) {
-		if( empty( $ids ) ) {
+		if ( empty( $ids ) ) {
 			return $this->msg( 'rightsnone' )->inContentLanguage()->text();
 		} else {
 			return implode( ', ', $ids );
@@ -364,7 +391,7 @@ class UserrightsPage extends SpecialPage {
 	function makeGroupNameListForLog( $ids ) {
 		wfDeprecated( __METHOD__, '1.21' );
 
-		if( empty( $ids ) ) {
+		if ( empty( $ids ) ) {
 			return '';
 		} else {
 			return $this->makeGroupNameList( $ids );
@@ -380,7 +407,7 @@ class UserrightsPage extends SpecialPage {
 			Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'name' => 'uluser', 'id' => 'mw-userrights-form1' ) ) .
 			Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
 			Xml::fieldset( $this->msg( 'userrights-lookup-user' )->text() ) .
-			Xml::inputLabel( $this->msg( 'userrights-user-editname' )->text(), 'user', 'username', 30, str_replace( '_', ' ', $this->mTarget ) ) . ' ' .
+			Xml::inputLabel( $this->msg( 'userrights-user-editname' )->text(), 'user', 'username', 30, str_replace( '_', ' ', $this->mTarget ), array( 'autofocus' => true ) ) . ' ' .
 			Xml::submitButton( $this->msg( 'editusergroup' )->text() ) .
 			Html::closeElement( 'fieldset' ) .
 			Html::closeElement( 'form' ) . "\n"
@@ -419,7 +446,7 @@ class UserrightsPage extends SpecialPage {
 	protected function showEditUserGroupsForm( $user, $groups ) {
 		$list = array();
 		$membersList = array();
-		foreach( $groups as $group ) {
+		foreach ( $groups as $group ) {
 			$list[] = self::buildGroupLink( $group );
 			$membersList[] = self::buildGroupMemberLink( $group );
 		}
@@ -427,7 +454,7 @@ class UserrightsPage extends SpecialPage {
 		$autoList = array();
 		$autoMembersList = array();
 		if ( $user instanceof User ) {
-			foreach( Autopromote::getAutopromoteGroups( $user ) as $group ) {
+			foreach ( Autopromote::getAutopromoteGroups( $user ) as $group ) {
 				$autoList[] = self::buildGroupLink( $group );
 				$autoMembersList[] = self::buildGroupMemberLink( $group );
 			}
@@ -447,12 +474,12 @@ class UserrightsPage extends SpecialPage {
 		$count = count( $list );
 		if ( $count > 0 ) {
 			$grouplist = $this->msg( 'userrights-groupsmember', $count, $user->getName() )->parse();
-			$grouplist = '<p>' . $grouplist  . ' ' . $displayedList . "</p>\n";
+			$grouplist = '<p>' . $grouplist . ' ' . $displayedList . "</p>\n";
 		}
 		$count = count( $autoList );
 		if ( $count > 0 ) {
 			$autogrouplistintro = $this->msg( 'userrights-groupsmember-auto', $count, $user->getName() )->parse();
-			$grouplist .= '<p>' . $autogrouplistintro  . ' ' . $displayedAutolist . "</p>\n";
+			$grouplist .= '<p>' . $autogrouplistintro . ' ' . $displayedAutolist . "</p>\n";
 		}
 
 		$userToolLinks = Linker::userToolLinks(
@@ -466,6 +493,7 @@ class UserrightsPage extends SpecialPage {
 			Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL(), 'name' => 'editGroup', 'id' => 'mw-userrights-form2' ) ) .
 			Html::hidden( 'user', $this->mTarget ) .
 			Html::hidden( 'wpEditToken', $this->getUser()->getEditToken( $this->mTarget ) ) .
+			Html::hidden( 'conflictcheck-originalgroups', implode( ',', $user->getGroups() ) ) . // Conflict detection
 			Xml::openElement( 'fieldset' ) .
 			Xml::element( 'legend', array(), $this->msg( 'userrights-editusergroup', $user->getName() )->text() ) .
 			$this->msg( 'editinguser' )->params( wfEscapeWikiText( $user->getName() ) )->rawParams( $userToolLinks )->parse() .
@@ -535,17 +563,17 @@ class UserrightsPage extends SpecialPage {
 		$allgroups = $this->getAllGroups();
 		$ret = '';
 
-		# Put all column info into an associative array so that extensions can
-		# more easily manage it.
+		// Put all column info into an associative array so that extensions can
+		// more easily manage it.
 		$columns = array( 'unchangeable' => array(), 'changeable' => array() );
 
-		foreach( $allgroups as $group ) {
+		foreach ( $allgroups as $group ) {
 			$set = in_array( $group, $usergroups );
-			# Should the checkbox be disabled?
+			// Should the checkbox be disabled?
 			$disabled = !(
 				( $set && $this->canRemove( $group ) ) ||
 				( !$set && $this->canAdd( $group ) ) );
-			# Do we need to point out that this action is irreversible?
+			// Do we need to point out that this action is irreversible?
 			$irreversible = !$disabled && (
 				( $set && !$this->canAdd( $group ) ) ||
 				( !$set && !$this->canRemove( $group ) ) );
@@ -556,27 +584,30 @@ class UserrightsPage extends SpecialPage {
 				'irreversible' => $irreversible
 			);
 
-			if( $disabled ) {
+			if ( $disabled ) {
 				$columns['unchangeable'][$group] = $checkbox;
 			} else {
 				$columns['changeable'][$group] = $checkbox;
 			}
 		}
 
-		# Build the HTML table
+		// Build the HTML table
 		$ret .= Xml::openElement( 'table', array( 'class' => 'mw-userrights-groups' ) ) .
 			"<tr>\n";
-		foreach( $columns as $name => $column ) {
-			if( $column === array() )
+		foreach ( $columns as $name => $column ) {
+			if ( $column === array() ) {
 				continue;
+			}
+			// Messages: userrights-changeable-col, userrights-unchangeable-col
 			$ret .= Xml::element( 'th', null, $this->msg( 'userrights-' . $name . '-col', count( $column ) )->text() );
 		}
 		$ret .= "</tr>\n<tr>\n";
-		foreach( $columns as $column ) {
-			if( $column === array() )
+		foreach ( $columns as $column ) {
+			if ( $column === array() ) {
 				continue;
+			}
 			$ret .= "\t<td style='vertical-align:top;'>\n";
-			foreach( $column as $group => $checkbox ) {
+			foreach ( $column as $group => $checkbox ) {
 				$attr = $checkbox['disabled'] ? array( 'disabled' => 'disabled' ) : array();
 
 				$member = User::getGroupMember( $group, $user->getName() );
@@ -604,8 +635,7 @@ class UserrightsPage extends SpecialPage {
 	 * @return bool Can we remove the group?
 	 */
 	private function canRemove( $group ) {
-		// $this->changeableGroups()['remove'] doesn't work, of course. Thanks,
-		// PHP.
+		// $this->changeableGroups()['remove'] doesn't work, of course. Thanks, PHP.
 		$groups = $this->changeableGroups();
 		return in_array( $group, $groups['remove'] ) || ( $this->isself && in_array( $group, $groups['remove-self'] ) );
 	}
diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php
index 81d17817..5ba785f5 100644
--- a/includes/specials/SpecialVersion.php
+++ b/includes/specials/SpecialVersion.php
@@ -55,7 +55,7 @@ class SpecialVersion extends SpecialPage {
 		$out = $this->getOutput();
 		$out->allowClickjacking();
 
-		if( $par !== 'Credits' ) {
+		if ( $par !== 'Credits' ) {
 			$text =
 				$this->getMediaWikiCredits() .
 				$this->softwareInformation() .
@@ -69,9 +69,7 @@ class SpecialVersion extends SpecialPage {
 			$out->addHTML( $this->IPInfo() );
 
 			if ( $this->getRequest()->getVal( 'easteregg' ) ) {
-				if ( $this->showEasterEgg() ) {
-					// TODO: put something interesting here
-				}
+				// TODO: put something interesting here
 			}
 		} else {
 			// Credits sub page
@@ -115,11 +113,13 @@ class SpecialVersion extends SpecialPage {
 		global $wgLang;
 
 		if ( defined( 'MEDIAWIKI_INSTALL' ) ) {
-			$othersLink = '[http://www.mediawiki.org/wiki/Special:Version/Credits ' .	wfMessage( 'version-poweredby-others' )->text() . ']';
+			$othersLink = '[//www.mediawiki.org/wiki/Special:Version/Credits ' . wfMessage( 'version-poweredby-others' )->text() . ']';
 		} else {
 			$othersLink = '[[Special:Version/Credits|' . wfMessage( 'version-poweredby-others' )->text() . ']]';
 		}
 
+		$translatorsLink = '[//translatewiki.net/wiki/Translating:MediaWiki/Credits ' . wfMessage( 'version-poweredby-translators' )->text() . ']';
+
 		$authorList = array(
 			'Magnus Manske', 'Brion Vibber', 'Lee Daniel Crocker',
 			'Tim Starling', 'Erik Möller', 'Gabriel Wicke', 'Ævar Arnfjörð Bjarmason',
@@ -128,10 +128,11 @@ class SpecialVersion extends SpecialPage {
 			'Alexandre Emsenhuber', 'Siebrand Mazeland', 'Chad Horohoe',
 			'Roan Kattouw', 'Trevor Parscal', 'Bryan Tong Minh', 'Sam Reed',
 			'Victor Vasiliev', 'Rotem Liss', 'Platonides', 'Antoine Musso',
-			'Timo Tijhof', 'Daniel Kinzler', 'Jeroen De Dauw', $othersLink
+			'Timo Tijhof', 'Daniel Kinzler', 'Jeroen De Dauw', $othersLink,
+			$translatorsLink
 		);
 
-		return wfMessage( 'version-poweredby-credits', date( 'Y' ),
+		return wfMessage( 'version-poweredby-credits', MWTimestamp::getLocalInstance()->format( 'Y' ),
 			$wgLang->listToText( $authorList ) )->text();
 	}
 
@@ -161,7 +162,7 @@ class SpecialVersion extends SpecialPage {
 					<th>" . wfMessage( 'version-software-version' )->text() . "</th>
 				</tr>\n";
 
-		foreach( $software as $name => $version ) {
+		foreach ( $software as $name => $version ) {
 			$out .= "<tr>
 					<td>" . $name . "</td>
 					<td dir=\"ltr\">" . $version . "</td>
@@ -220,11 +221,11 @@ class SpecialVersion extends SpecialPage {
 		wfProfileIn( __METHOD__ );
 
 		$gitVersion = self::getVersionLinkedGit();
-		if( $gitVersion ) {
+		if ( $gitVersion ) {
 			$v = $gitVersion;
 		} else {
 			$svnVersion = self::getVersionLinkedSvn();
-			if( $svnVersion ) {
+			if ( $svnVersion ) {
 				$v = $svnVersion;
 			} else {
 				$v = $wgVersion; // fallback
@@ -242,7 +243,7 @@ class SpecialVersion extends SpecialPage {
 		global $IP;
 
 		$info = self::getSvnInfo( $IP );
-		if( !isset( $info['checkout-rev'] ) ) {
+		if ( !isset( $info['checkout-rev'] ) ) {
 			return false;
 		}
 
@@ -267,7 +268,7 @@ class SpecialVersion extends SpecialPage {
 	private static function getwgVersionLinked() {
 		global $wgVersion;
 		$versionUrl = "";
-		if( wfRunHooks( 'SpecialVersionVersionUrl', array( $wgVersion, &$versionUrl ) ) ) {
+		if ( wfRunHooks( 'SpecialVersionVersionUrl', array( $wgVersion, &$versionUrl ) ) ) {
 			$versionParts = array();
 			preg_match( "/^(\d+\.\d+)/", $wgVersion, $versionParts );
 			$versionUrl = "https://www.mediawiki.org/wiki/MediaWiki_{$versionParts[1]}";
@@ -276,22 +277,30 @@ class SpecialVersion extends SpecialPage {
 	}
 
 	/**
-	 * @return bool|string wgVersion + HEAD sha1 stripped to the first 7 chars. False on failure
+	 * @since 1.22 Returns the HEAD date in addition to the sha1 and link
+	 * @return bool|string wgVersion + HEAD sha1 stripped to the first 7 chars with link and date, or false on failure
 	 */
 	private static function getVersionLinkedGit() {
-		global $IP;
+		global $IP, $wgLang;
 
 		$gitInfo = new GitInfo( $IP );
 		$headSHA1 = $gitInfo->getHeadSHA1();
-		if( !$headSHA1 ) {
+		if ( !$headSHA1 ) {
 			return false;
 		}
 
 		$shortSHA1 = '(' . substr( $headSHA1, 0, 7 ) . ')';
-		$viewerUrl = $gitInfo->getHeadViewUrl();
-		if ( $viewerUrl !== false ) {
-			$shortSHA1 = "[$viewerUrl $shortSHA1]";
+
+		$gitHeadUrl = $gitInfo->getHeadViewUrl();
+		if ( $gitHeadUrl !== false ) {
+			$shortSHA1 = "[$gitHeadUrl $shortSHA1]";
 		}
+
+		$gitHeadCommitDate = $gitInfo->getHeadCommitDate();
+		if ( $gitHeadCommitDate ) {
+			$shortSHA1 .= "<br/>" . $wgLang->timeanddate( $gitHeadCommitDate, true );
+		}
+
 		return self::getwgVersionLinked() . " $shortSHA1";
 	}
 
@@ -384,11 +393,6 @@ class SpecialVersion extends SpecialPage {
 		// We want the 'other' type to be last in the list.
 		$out .= $this->getExtensionCategory( 'other', $extensionTypes['other'] );
 
-		if ( count( $wgExtensionFunctions ) ) {
-			$out .= $this->openExtType( $this->msg( 'version-extension-functions' )->text(), 'extension-functions' );
-			$out .= '<tr><td colspan="4">' . $this->listToText( $wgExtensionFunctions ) . "</td></tr>\n";
-		}
-
 		$tags = $wgParser->getTags();
 		$cnt = count( $tags );
 
@@ -397,11 +401,11 @@ class SpecialVersion extends SpecialPage {
 				$tags[$i] = "&lt;{$tags[$i]}&gt;";
 			}
 			$out .= $this->openExtType( $this->msg( 'version-parser-extensiontags' )->text(), 'parser-tags' );
-			$out .= '<tr><td colspan="4">' . $this->listToText( $tags ). "</td></tr>\n";
+			$out .= '<tr><td colspan="4">' . $this->listToText( $tags ) . "</td></tr>\n";
 		}
 
 		$fhooks = $wgParser->getFunctionHooks();
-		if( count( $fhooks ) ) {
+		if ( count( $fhooks ) ) {
 			$out .= $this->openExtType( $this->msg( 'version-parser-function-hooks' )->text(), 'parser-function-hooks' );
 			$out .= '<tr><td colspan="4">' . $this->listToText( $fhooks ) . "</td></tr>\n";
 		}
@@ -446,7 +450,7 @@ class SpecialVersion extends SpecialPage {
 	 * @return int
 	 */
 	function compare( $a, $b ) {
-		if( $a['name'] === $b['name'] ) {
+		if ( $a['name'] === $b['name'] ) {
 			return 0;
 		} else {
 			return $this->getLanguage()->lc( $a['name'] ) > $this->getLanguage()->lc( $b['name'] )
@@ -463,6 +467,8 @@ class SpecialVersion extends SpecialPage {
 	 * @return string
 	 */
 	function getCreditsForExtension( array $extension ) {
+		global $wgLang;
+
 		$name = isset( $extension['name'] ) ? $extension['name'] : '[no name]';
 
 		$vcsText = false;
@@ -476,6 +482,10 @@ class SpecialVersion extends SpecialPage {
 				if ( $gitViewerUrl !== false ) {
 					$vcsText = "[$gitViewerUrl $vcsText]";
 				}
+				$gitHeadCommitDate = $gitInfo->getHeadCommitDate();
+				if ( $gitHeadCommitDate ) {
+					$vcsText .= "<br/>" . $wgLang->timeanddate( $gitHeadCommitDate, true );
+				}
 			} else {
 				$svnInfo = self::getSvnInfo( dirname( $extension['path'] ) );
 				# Make subversion text/link.
@@ -503,13 +513,13 @@ class SpecialVersion extends SpecialPage {
 		}
 
 		# Make description text.
-		$description = isset ( $extension['description'] ) ? $extension['description'] : '';
+		$description = isset( $extension['description'] ) ? $extension['description'] : '';
 
-		if( isset ( $extension['descriptionmsg'] ) ) {
+		if ( isset( $extension['descriptionmsg'] ) ) {
 			# Look for a localized description.
 			$descriptionMsg = $extension['descriptionmsg'];
 
-			if( is_array( $descriptionMsg ) ) {
+			if ( is_array( $descriptionMsg ) ) {
 				$descriptionMsgKey = $descriptionMsg[0]; // Get the message key
 				array_shift( $descriptionMsg ); // Shift out the message key to get the parameters only
 				array_map( "htmlspecialchars", $descriptionMsg ); // For sanity
@@ -528,7 +538,7 @@ class SpecialVersion extends SpecialPage {
 				<td colspan=\"2\"><em>$mainLink $versionText</em></td>";
 		}
 
-		$author = isset ( $extension['author'] ) ? $extension['author'] : array();
+		$author = isset( $extension['author'] ) ? $extension['author'] : array();
 		$extDescAuthor = "<td>$description</td>
 			<td>" . $this->listAuthors( $author, false ) . "</td>
 			</tr>\n";
@@ -564,21 +574,22 @@ class SpecialVersion extends SpecialPage {
 
 			$ret .= Xml::closeElement( 'table' );
 			return $ret;
-		} else
+		} else {
 			return '';
+		}
 	}
 
 	private function openExtType( $text, $name = null ) {
 		$opt = array( 'colspan' => 4 );
 		$out = '';
 
-		if( $this->firstExtOpened ) {
+		if ( $this->firstExtOpened ) {
 			// Insert a spacing line
 			$out .= '<tr class="sv-space">' . Html::element( 'td', $opt ) . "</tr>\n";
 		}
 		$this->firstExtOpened = true;
 
-		if( $name ) {
+		if ( $name ) {
 			$opt['id'] = "sv-$name";
 		}
 
@@ -605,7 +616,7 @@ class SpecialVersion extends SpecialPage {
 	 */
 	function listAuthors( $authors ) {
 		$list = array();
-		foreach( (array)$authors as $item ) {
+		foreach ( (array)$authors as $item ) {
 			if ( $item == '...' ) {
 				$list[] = $this->msg( 'version-poweredby-others' )->text();
 			} elseif ( substr( $item, -5 ) == ' ...]' ) {
@@ -650,16 +661,16 @@ class SpecialVersion extends SpecialPage {
 	 * @return Mixed
 	 */
 	public static function arrayToString( $list ) {
-		if( is_array( $list ) && count( $list ) == 1 ) {
+		if ( is_array( $list ) && count( $list ) == 1 ) {
 			$list = $list[0];
 		}
-		if( is_object( $list ) ) {
+		if ( is_object( $list ) ) {
 			$class = wfMessage( 'parentheses' )->params( get_class( $list ) )->escaped();
 			return $class;
 		} elseif ( !is_array( $list ) ) {
 			return $list;
 		} else {
-			if( is_object( $list[0] ) ) {
+			if ( is_object( $list[0] ) ) {
 				$class = get_class( $list[0] );
 			} else {
 				$class = $list[0];
@@ -688,7 +699,7 @@ class SpecialVersion extends SpecialPage {
 		// http://svnbook.red-bean.com/nightly/en/svn.developer.insidewc.html
 		$entries = $dir . '/.svn/entries';
 
-		if( !file_exists( $entries ) ) {
+		if ( !file_exists( $entries ) ) {
 			return false;
 		}
 
@@ -698,9 +709,9 @@ class SpecialVersion extends SpecialPage {
 		}
 
 		// check if file is xml (subversion release <= 1.3) or not (subversion release = 1.4)
-		if( preg_match( '/^<\?xml/', $lines[0] ) ) {
+		if ( preg_match( '/^<\?xml/', $lines[0] ) ) {
 			// subversion is release <= 1.3
-			if( !function_exists( 'simplexml_load_file' ) ) {
+			if ( !function_exists( 'simplexml_load_file' ) ) {
 				// We could fall back to expat... YUCK
 				return false;
 			}
@@ -710,11 +721,11 @@ class SpecialVersion extends SpecialPage {
 			$xml = simplexml_load_file( $entries );
 			wfRestoreWarnings();
 
-			if( $xml ) {
-				foreach( $xml->entry as $entry ) {
-					if( $xml->entry[0]['name'] == '' ) {
+			if ( $xml ) {
+				foreach ( $xml->entry as $entry ) {
+					if ( $xml->entry[0]['name'] == '' ) {
 						// The directory entry should always have a revision marker.
-						if( $entry['revision'] ) {
+						if ( $entry['revision'] ) {
 							return array( 'checkout-rev' => intval( $entry['revision'] ) );
 						}
 					}
@@ -831,108 +842,4 @@ class SpecialVersion extends SpecialPage {
 		return 'wiki';
 	}
 
-	function showEasterEgg() {
-		$rx = $rp = $xe = '';
-		$alpha = array( "", "kbQW", "\$\n()" );
-		$beta = implode( "', '", $alpha);
-		$juliet = 'echo $delta + strrev( $foxtrot ) - $alfa + $wgVersion . base64_decode( $bravo ) * $charlie';
-		for ( $i = 1; $i <= 4; $i++ ) {
-			$rx .= '([^j]*)J';
-			$rp .= "+(\\$i)";
-		}
-
-		$rx = "/$rx/Sei";
-		$O = substr( "$alpha')", 1 );
-		for ( $i = 1; $i <= strlen( $rx ) / 3; $i++ ) {
-			$rx[$i-1] = strtolower( $rx[$i-1] );
-		}
-		$ry = ".*?(.((.)(.))).{1,3}(.)(.{1,$i})(\\4.\\3)(.).*";
-		$ry = "/$ry/Sei";
-		$O = substr( "$beta')", 1 );
-		preg_match_all( '/(?<=\$)[[:alnum:]]*/', substr( $juliet, 0, $i<<1 ), $charlie );
-		foreach( $charlie[0] as $bravo ) {
-			$$bravo =& $xe;
-		}
-		$xe = 'xe=<<<mo/./hfromowoxv=<<<m
-쵍潅旅𞗎왎캎𐺆ߨ趥䲀쫥𒯡𚦄𚬀Ꝍ螃䤎꤯溃𔱢櫅褡䞠⽬✡栠迤⾏𐵥쾃𜜧줏袏浣।궇䬃꼁꿤𘐧
-𞛁윥桯䦎䵎Ꞅ𚠣涁쭀讀撠蝠讄伣𞫡枮ⵇ𚥣𐡃𐭏沢𞜄𞴏𞻧⠤쳯蒣䮎𒵬컡豣ۅ𐯥⦇𐫁漅蛁꼤从楆
-⥀䡦𚭅沢⠬輁䲯좡梇䟇伄육较촅䥃要𞝄迯쟠꺃ⶥ栆궀撠満ꐣ𞦇좧𐠅𞫠𐠧𚮣讇輤亀➏欣첡쮧⽬
-氀쮧跧𐫥䪀⬬⾅𞼀ⵏ괬ত櫤䭀楦𚫃𐣂괥챣𐥇楀귧읠죯쒡ۅ𐾤䳄䤄𞽀괬躏譇䮄搥𚬁䯄津䶮⾅𐫅
-𐴂௧쮯궣輥ߡ亀𞪀氀诤𐯢⿅諃⫤𞦁䮣⦬죄椎貧𞛄ඇ쿇亏跤⦌术থۏ仆䛇枡䪄𐵇곁謠𞿯ⶏⶃ䞣
-궥螏蝁ꤣ⟬极涇𞴧伢𞼯ଅ𚣡즡⡌浣䯇쿃ⳇ궏ས⢃曦⦥蛧갠컡楧𘬧袏⦏⢠䳠챤⽧𚠧⬣⼀潧⭅椤
-𞟯軁종쵃䬆𞮀𞮅꤇𞣅溎楯곡⢡꾥첥쫧Ⱨ균檏辀䭮⡄𐞯쿁䱤𐠠柅迠웏𚟯⾅豠𐡀𐡅䱀轡⾯쥃⥁溆
-䢣䞮柄ꠌⶡ𞒯𐳣𞳅蛤椏𞯀✠귬ຄ𐷡𞜠䶃𞭀毥𞡯桥ꐥ❣쳀𞾧⡧𖥢꽧죄ത𖴧ޥ歠ແ위䯎撯쬁䮣浅
-쾇泮𐢁켄𞧧𞦏䦯꾯迡𞐯曎䢦쿣杦궯⡀䤦䷢𐭢쟁쯯⧤蟯䡏氇𒭯𔜧𞢣𞱏蝤𒬧궧ߢ𐭆䛃찃쭣沠𚬀𞿏
-䴃𐣣䣎𐺃ꥅ轃⣄蟧⦡𒛧蟃毣洇䞎Ҡ潄仆𐲃𞧥철䢤俎譯泠쮄␥栏쾯ⳏ짡𞾯⥡𚠬߂𚥯ކ澥䲀ⵀ𞻃
-ⵡ𚦣𒯣✬𐟯𞥥輄䱀굡榏❡첄⦄ꡥⶣ𞡤⺁𞞡ݣ𐢅𒷤⤡꿄蝡𞱁ⴄ贁𒛬氃𞞇𞶡ޅ짣߁𞱃𐫄ۥ𞰣𐱅欤
-梢蝡柧䥏仏撣𐳣𞠅좇𞐣蒣䰤྅𚪏࿂ಇ濤䞦쮅𚬁𚭧𚬬𒴯𐵣𚥌沮潁좤澅𐻯杣棦ꤤ洯𐳃𚭀콅궧쭠𔥢
-𞱠桎䝆겡쭄𞵁겯䥂ⶀ𐥂𚧬⽬䠇쳄❬Ⰼ𞵀䐦⿌웃𒿠첏𐛡浣涆𒯌⢤অ䭎𚜧갣𞾏䴮⡃꤯죠䰀쬯༄䫏
-𐱂ꢅ䬦賧𐯡유辇➥佃仮귣젏𒴯⭅ꢡ각컄⒤⻠讁涅䠃跥袏佄𞝄𐳇泄껧𚮡𞱏棇满གྷ𐻯輤괅𚠬❥겠
-𒐧䣂ꤏ襃𞼧𜰧伎襡웅𞳧걯䳣𚟡켁쭄洠컥❅⿏亂𚯧𚯯쯅𞮅⢁𐠦𒮠𚯣𞞥诤꣏辀𖥢椯겇毣濢𞝣𚢀➠
-䮮浥겁沣졣䜦泇歏𐾄搯曯柆ۇۇ䞀泆𐾧武𚭠況꽌𐧢ꝅ軀⬠쾣𞡀榧𞣏𚦤Ⱡ䠦Ⲥ𞰯𞻥쿇䬄貃柅涢
-갏⼁𐿧ݏౠ𐿣褀涡𘼧𞮏༅𞵡𐥆䮄𐮥➇ꝣݥ䡏䯎梢𚟇輇ꤠ䫣䵀ण漂𞬯⢡軀𚭅𐯆௦𚠤襁쫇⾡濧沤
-䜇伢ۇ汧첏䤎잤䛯Ⰱ俇𞵃ꢧ殂궏榮ޣ𞼧涂氏𞬇滦즤蜀⠥𐺏쐣⾏껬콇漯Ꝡ柦櫇읁梠仇장滦⟠꿯
-쮁搥櫢𐫣ꠏ𒮬椥𐛤誅栮朥迣⺄ඇ𞣣⿏䬂쾏⫠⒧✏궇襤⡁𞯇濃𚣠Ⱐ𚫤歯䛠𒛥𞫇쮠𞟤컃𞢯⬣濡䦣
-衏貣柂𞳁森챏ಇ고𚫠蟄䤏젯𒮡⫯楀䞄䳣쮅궤轧껯𞥤𐪃𞶡潇ބ𚥣𐵇浣𐬀蝤⽧쐣쾇➣𞝀𐡦䮠䤣𐠄
-Ꝡ𐾁蠤𞛡𞵀䬦覯搦⥯쥏梂걯𐾧ⵁ೦챁𚣌躄轡𐯣𞻥䢦𐝂財䲧𐦁䬎첁棏␣౦잧棆젥襁젃䤏⢏榀ⵁ
-螅赡𒿯ⶣ赧꾤𚬅濁𒛏涆𐴂ॡ䳦ߢ赁䯇䢃ꠌ泄柠泡찇𐛢𞰏䪂𐝢櫇𚰧漥𐣄𞜤𐥁⟤淣ഡ䳮த谀ཡ𞾧
-➁血꽧蟧辧게⻣𚣣쳏ഡ䠄杮𞣠죃汦諤య毠蝅𐦄謄殯𞱄䳀ⳏ𞶁쟇ආ𐻢잏𐿡䳃ۂ𞭥䝇䦇⥌켏쥯춏
-𖽢𐳃𒷡𚫥𚟇𐿧𚦧𐝢䥦𚯀棇潡⥄歡찁朆⻠䤆𖤧漢𜐧ꡅ⽄쾠𐥣衏𚥠𐥆䤣অ𞛇䤣𐡡𐢏䞦𖐧ߣ裏𚫁𐵤
-ཅۄ춁䲃欆귬𐺀诀滁𞫇𐯇䝃𞧡챃첥𞭤꺏쫅𞫡䱮𞼤અ𒭤견Ф𐫁𐾧佣𖱢澢쿏𞛧⽅侮榅𐾄य쥏蜏䣣
-𚥌𐫏쵥𚥡➤跡殃䰣䯤𞳥읤ⴏ굄𚬧⥇줡걬০켃𜼧𚧯첣䜂𞵇𚟀찃궀谀Ɽ伎䢮𒛄𚦀ꤥ⾣𐭁沅䬇䧠𐱇
-沀濡ठ𞰄쟠𐺅ꐣ𐴂躄佇⦇毄计賀䢎澡𒮌䲄𒠧캀䟣𐷧褀𞻅蠤൯棏蜃𞮤澄❧⾥撦⽬ⶥ𐪄ய𔼧ބ躄
-䬎챯𚫇⽯𐾠𞛠𚛧䬎Ꞅ굥𐢂𚠣⠥䝧朄𞧥࿏웥꽬གྷ浅⦁❬𐺆侢栦⧠𞛯궠ඦ𚭧趤谥此𐲂𐬃軠𚪅𐞦𞷤
-蛄俧袥补榏읠⤁⠀豇俢쮯꤇➏𐴁ⶤ涮찣𒮇읁榠跣𜤧⦅ໃಆ𞛯䵣谠𞰅ꢯ⡧淯柤궡✠䮎괯𒮣❅朎
-⥅웣䯮첀𚫣꒤𐣠쭏洀蛡楆𚮣ൡ䮮ү氠𐜏濆䜢䷯潣歃䷯𞣡웁쭄椥䟂➅𒯣𒯤ૡༀ䭧ܣ죅𐯠ए軯䧣
-Ⱔ䐢⬥檂䠮⫤䛠꜡䛆讠𚭄✠꿏欣蠡𐵆켏豣譄𞣇춣𒭯𐻢䠃䰠撦朅䮄榦溃貀𒯅䶇⾁𞬧澡𐻦䲮榀𞯧
-𐪄䢆侄𞾏朦꜇𐮢ཏ𐯣췧꺁𞱃枠櫧桠괬枇ꜯ곇𐰂𘜧𐦄컡濦汥줠𞲡輀𞫃𐠣쥇⣃𞴏䳂⟤漇쯣껃𐾀衃
-𚮄쯇𒼧𐝄浥洄楠৯춥蒧⾯𐫆༂ꤌ毮䤆⺄༠०袀䢂죃ⴣ𐿯梇溄毦𞼄螄櫤쳃栅満걌毠𞞏ⱌ𚮡꒧䢆
-ꥁ泎𞭅仧궀辯諯웅𞳇津趃অ꿏伏𐵤캁⠃𐦂𐶀ꝣ䛂贤济杧𐝁撠䱤殥歡躇楄꒧꽧𞽧䡣쵧𒯃𐱆ꜯ위
-ཀ谠諃𐬃軅␥𞰇贠撣߅꽤⠥ಡ𐝀궥윁𞳁Ⰴܯ즡歎𞷥ⵅഏ蝁𞟇구ꝧ܅䱦껡䛦߅蒯俧콣𚭅梧䛠ꡇ
-ݧ𚮏웥Т⬠䬦榀𐢂貤𞰅𚭠謣䱦⒡췧𐥀濇⧣⤀좯殧𞬣줤⣀楏楎굏ݤ滁ۇ𘐧𚯯䒯Ⰰ𞼤ҡ䰦𚣠椯❏
-趯𐣯豀쵅춀⳥䷠읡ۯ⺄ۅ䶏춤枂櫅ۅ𞥅䱃䭣𒳯汮澃𞢃谥ⵤ구𚣄콡曤𞣏ই߂읅蠠𜰧䞦ꞇⲏ𚮌諧
-趯첏䬎𐡏李겠⥇𞻥曢汥𞳡浆欠躅𐦁𞲯谡𞦏袧襃棧𚦁𞡡蟀侠𒛏찇챠쪇洠܀쯤䝇螏𞿣蜏俄𞦡⼀ལ
-谥촯䲦⥁ඤ𞛡𐐧⤃궅༡褡䭏毆濆⧡蛣Ф𞵇蠏ݤ賯꜁溅⡡ߡ𞥧䮄榆䵄求謥𐐧Ꞁ쯏⧡貇䛇䐢撦袥
-쮇䫀𞜄দ굯𞦁⻤襇줅⬅ہఠ⻀𔠧쒠䫆𐡅梄梯輤䥣읏⤄ⶡ诃䮢譡𞻠ߤ枤櫥𐢥伦袠ꢃ쳀裣𞼅䰄𞻡
-𒯇槥淠䯃ඏ⒯𚫣𚠯𞠣𚛄椦泮汣赃潥𚫇ദ𞛤𞿣䰏쮡𖭢蝏毁䶂䦧档䪂𞾃쟀𚪄𞞃𞳥𞼀𐿯졇웄䳎汀𐫣
-漠𚫄ꐡଥ认꽡𐱏𐭏𚼧⦄梎આ枀䠦楇쒤ꞃꤡⴅꞅ𞯁අҡ𞞤氣즤裀𞜅𐵥櫁𐵀༦𐳃쳣𐡯桧𞿠权굁죁
-짤𖤧蟃澀𒭏𞲯ߏ⣣⬁Ⱔ졥𚦌潆ꐡ⽤웁浥𞞃𐫄棆갤濧⼣겅쬄൧젣此潆⻯䜃꤯궠쮥𘬧曀⿅譅槣䞂
-䝎ꡏ𚟣䰀梥⾬ܡ𞿇𞠥𐮠𞺃䢮આ䧮쮃誅櫆𚪃죯诠䵀䯀跥𐾣⻥䤆Ⰰ꜄棧枃⻇థ誃𚛁࿇贄𞡣欎⽡𞱁
-𞲄⬏杇𐠅𐱃𞢤➁𐵤𐢄꒥즏亀쭁𚭡漆𞮇첁𐢦殎쮁滠𐠥榯𐮧𒵬⡀䮆䣠준讥𞼃䶇⪅껃泃𖱢楀갠複撮
-✡𐭢ແ𞮧𞛥쫃⽤規䥇沁轁𐡅ಢ䧮椁⬇𐤁𞡯杅武楥歎䟄溇䯢𒵬𐢣迃䪎䳤满ଅⱇ쭀ಥ𞥄䥆⧥𚞧좃
-유栤༡𐰃俇Ⰵ殇蠄⽏⾠܇𒮄澄𚦅⡤䪎榮Я견濂賣쮠仠䝮䶢𞦏𐫆ݏ襅褥찯𞤤ݥ象侯쵇궥𞠃윀웧
-𖰧殀蛡⫥亃觯潥蠀补ⴄ觧𐡇𐾆ꐯ䡣췡潏⻯⾁諏య꿧䱠𚭯찥ꞅ⪃콄즯쳣覧𞰄Ⲅ𞿣𚬧𞵤쐯⬃ඤ겤
-ⵃ蟥𞟧谣轇䛂𐮄佀߁氣𒯧榡𒷬桇䷯觠椄챥ꠌ蒯꜌䭤➡侦䣤𚦬䲀쥁⒤𐦄Ꝭ䢮𐣅ꡌ歡䝯䢣괯𚮣⥀
-줣०𚭀殣𚬥𒮇⟄趥좠洦ꢬ装䠆𒝠曧➁𒿧椃䠀𞡅𖼧䳇ງ줄ধ𞳁Ⱜ覠ꝃ殣𚯤涡䳠귥𐯁⫤覯𞲡𞼄༦
-䢦쥥줤ꡤড젃ಧꢥ諤𔭢ඥ𒛌枅𖜧줄躀ఏ䦎𞯄졯譄➇仄䰏蛏촡䞣춅涧⡄滀ଢ䮇每𘠧𚯧侇澀ꐡ杣
-𒷧槧߅䶠윥귡귧⤯𚪃𐷢ཆ裁毧𐥣𐯥⬤蝧첀⭁𞻡潤𞟃䝎池𞦀殤Ҡ𞵏䝯ཁ쟧𒰧氢귡𚛧𒿯ꥄ⭌䜇ۥ
-ꝡ𞯯棄⣏ꤥ০𐯠𒷤𞦣쮁𞰠𚧡桧𐐧ⴤꠡ軅𞟃衄䠦ߤ܅ⲃଢ蛄溎椀𞠀䛃𞡣𞟣澅𚭬䧤⡇贤⫌쪄ށ朣
-⻏켅𐽢⼡𐲀잠௧𞬥𞥀౧䦤ས誇漎譠迄䦂䳇𞣡正𐵤계楧ޅ✬𞿯棅𞳧𞛤𞜀쭯𞮀诠𐥀枢䥮䭆楆컧ଆ
-𞶇➬అ䤦誃𐠅𐿤䟀洀⡤𚟣滤𞥇𞾣즀𐠁⼃䰎溄꽅웇✡𐾥䲀⡏ܣ讣𞿥⼤覄𚯇䡇అ蝀⥌侧껄Ꝭ流贀
-漁쒤첧죏곡⣃趃賄撠।읠ⶌ𚣅⾥춧𞞠쒡쿀𞦠䵯毁涠𞫀⣡ꡄ䢀満棃䡯𐛣୯䳯ⵡୡ䥃❇⠅䣆杧𐳃
-귧覀𞼠漎𞴁𞤡ཇ䰦𞲣❃歆콣꿇朏𞢄𞵠Ꝍ𞡅賡𞧠曏꼃𞻯꼬ಇ𞴯资榎쮯輤ॡ䜎⦌𞶅𐠏𚧧⡃쳁𐵅࿀
-𞒧𞝤쯣껧쪃𞣠椃쐡⟤߇웅䱧䛣𞷧𐳤𚬠쮀䠏𞭇꽣𞿇⠣쟣𞢅ദ洅촥컇𚦁쵡ꞅ䠆𐥇⒥涯䐢ⴅ𒭡쮤꺅
-𞥇컠ⳁ漃𐲃윇诤겣𞥄伣䜠⻇𞡀修꜡𞻣䳎❄켇꽡𘼧쭄洂𞟏꜠𐮦Ⰳ쵅𐬂梀櫯䜯꜡䛣༏杇⪀캄𞰠⼌
-条𐳄没ⳅ➏𒮀첡❬侯캅检𞡧棡𞬄𞥧𞒠𞶄䥧𐳃𞻧𐝁ཧ謏𐫇𚯅讄枥𚞬첡쾀欎육웠𐭤୯濧譁챤䶢껤
-𞯤쒤𐾂辧𞮡𚭏褡⼣𞼃䳃␠𞝁豁ߡ櫦𒮬极𞱥ⶠઇꝠ𐭤𞝇沣棁柄𐳂䠯楅곅⼣⥃ༀ螡ߥ柤褣曠沧꒬
-𐴃䵂䲇蠀𐿧䲇ඦ𒯇⺁커謁𚣣𚫃컁漢䠀调ⲃ䢢ބ辅毡갯𚮁䤣椦𞲯१𞞠輯𘜧𐯣𐳅⽄𞽤𚧤𚬡䴆𞷠ଦ
-䱠䒮諃ఏ𐠡桦𞟇𚭧谁𞻤𐡁쥡浣𞼇譀⫌쮥ꢅ컁曅ꥅ𞟅ଏ찀汅𐷦ೡ谠𞦥䬀𞴡䢠쳀⡏𐵃ߠߠඅ겧淤
-쥣每譄꼠𒮣쫁쭥讥ॡ쿇𐾡ஆ伃⫠汇䜢衯楥济俏极𚣣撮쬅蜏⧤蛥쮁⥃𚯣것ஃ줠䣇迅泆𞟯𞰥⤯𐧣
-𚥯萠泎ଡ蠄涣త⾏⻌䝧ༀ榮ү𐳃歂浅𞬄ꡥ첤⬇유𐶃讏欤俤잧⡌𞭥ⱁ춥氤𐠧修流쫤䵆𞠃܀웣𞶏
-곧萡ꠀ걁𞟠认쮀𐽢谥잡𞼣佮𞺏軡⾁쮯ߡ⧯쟡䰆⽀굇촤认䵄輥𞦤𞲇䡮侢朆쬣搢⽃濃𞾄⣧𞶥柁༢
-⼅𞦀ॠ軀浯ܡ𒯡컡谤ඤ曢⧠짠컠𚠯꿡𐺀𒬧곌濂ণ웧⾡栅䞠괬ܤ䦄伏曀了ཡ榧䭦𒭯⛃衧濠𚐧읥
-쵁𐛣⪅蜤𞤁装고𒯬쳅⻁ݣ䳆ৠ䐦𐮡ऄ⫏𐶁쿧䜎𐿣젡귧棥櫁쿣泯俣佦⾥朦潏ꢤ𞫣ꙧ𞂎𐺆ڦՈ췥
-췧䙭䶍澥𞜅쨯쵥Ⱕ쵥䗌쵍潅旅暬Ոⵤ旆𞗎줭젠ৡ쮠┢𚴧𐵣潧𞾥𜔧𞑢贮𞽅跣쓄䔭𞷥⽇𞾅𞴥ꔥ䓭
-₎챍澥엇𞗎곭贇Ԇ쬡쩯䘠䯃𐯤湁𚚭Ո꽤엇𞗎ꔭ₎谥𐗇䗌쳭䙭䟍◎쳭䙍侭쾇쵤蓄䕍췥췧䓭◎쳭
-䒭𞗎ߏ䓭亭è청𞻥䙭侭䷤擏䕍췤⽇䐍䕍ⵤ摆位ཧ𞗅暬è춍찤ⲥ䙭䔭𚚭è谥𐗇䗌첍䙭䟍◎䕍𐗄
-엎ߏ◎첍⒬䓭亭è效𐱅궤◄虬䶭侄䗌꾄쓅䕍췥췧╂旄◌첍𞗂旌藂꾄쓅䕍ⵤ檦첍𞗂旌暬è𞂆效
-꽤엇虬䕍𐱅궤⚤è챍澥엇𞗎춍찤ⲥ₎𞂆찭𞽇䙭侭쾇൧蓇䕍꽤엇暬೨藅䗌ⳇ查䗌찭𞽇䓭䙭𞙮䔭
-枅ද𞝅➥赏𒶯ⵯඏ춥쟅ⵅ쟥𐵥螥ⴅ춯䟏췯淯䴏ꗍ旌₆效ꡁ𚦀桁⪣꼭𚠥𞽇𚩭𞘌ⱅ𞷥𐣇졣쓀暬è
-줭젠ৡ쮠┢𚴧꽠𜔧𞑢跮쵅䭀𞡀䗌è斈쳮𞴤侭ට𞩎𐵍潅暅汤津𞐥࿄𞴥ⶎ澥𞜅쑏𐗍肌惨澈漥𞾇쵤
-趤굄𞓅䶍澥𞜅쨯𞰅Ⱕ쵥䗌찭𞽇䓭䓭䐍è惨𐩍Э薎è擨₎𞗆
-mowoxf=<<<moDzk=hgs8GbPbqrcbvagDdJkbe zk=zk>0kssss?zk-0k10000:zk kbe zk=DDzk<<3&0kssssJ|Dzk>>13JJ^3658 kbe zk=pueDzk&0kssJ.pueDzk>>8JJ?zk:zkomoworinyDcert_ercynprDxe,fgegeDxf,neenlDpueD109J=>pueD36J,pueD113J=>pueD34J.pueD92J. 0 .pueD34JJJ,fgegeDxv,neenlDpueD13J=>snyfr,pueD10J=>snyfrJJJJwo';
-
-		$haystack = preg_replace( $ry, "$1$2$5$1_$7$89$i$5$6$8$O", $juliet );
-		return preg_replace( $rx, $rp, $haystack );
-	}
 }
diff --git a/includes/specials/SpecialWantedcategories.php b/includes/specials/SpecialWantedcategories.php
index 0035bfab..d2ffdb94 100644
--- a/includes/specials/SpecialWantedcategories.php
+++ b/includes/specials/SpecialWantedcategories.php
@@ -35,22 +35,22 @@ class WantedCategoriesPage extends WantedQueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array ( 'categorylinks', 'page' ),
-			'fields' => array ( 'namespace' => NS_CATEGORY,
+		return array(
+			'tables' => array( 'categorylinks', 'page' ),
+			'fields' => array( 'namespace' => NS_CATEGORY,
 					'title' => 'cl_to',
 					'value' => 'COUNT(*)' ),
-			'conds' => array ( 'page_title IS NULL' ),
-			'options' => array ( 'GROUP BY' => 'cl_to' ),
-			'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
-				array ( 'page_title = cl_to',
+			'conds' => array( 'page_title IS NULL' ),
+			'options' => array( 'GROUP BY' => 'cl_to' ),
+			'join_conds' => array( 'page' => array( 'LEFT JOIN',
+				array( 'page_title = cl_to',
 					'page_namespace' => NS_CATEGORY ) ) )
 		);
 	}
 
 	/**
-	 * @param $skin Skin
-	 * @param $result
+	 * @param Skin $skin
+	 * @param object $result Result row
 	 * @return string
 	 */
 	function formatResult( $skin, $result ) {
diff --git a/includes/specials/SpecialWantedfiles.php b/includes/specials/SpecialWantedfiles.php
index 9a2d30a3..b5c1fdbe 100644
--- a/includes/specials/SpecialWantedfiles.php
+++ b/includes/specials/SpecialWantedfiles.php
@@ -73,16 +73,16 @@ class WantedFilesPage extends WantedQueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array ( 'imagelinks', 'image' ),
-			'fields' => array ( 'namespace' => NS_FILE,
+		return array(
+			'tables' => array( 'imagelinks', 'image' ),
+			'fields' => array( 'namespace' => NS_FILE,
 					'title' => 'il_to',
 					'value' => 'COUNT(*)' ),
-			'conds' => array ( 'img_name IS NULL' ),
-			'options' => array ( 'GROUP BY' => 'il_to' ),
-			'join_conds' => array ( 'image' =>
-				array ( 'LEFT JOIN',
-					array ( 'il_to = img_name' )
+			'conds' => array( 'img_name IS NULL' ),
+			'options' => array( 'GROUP BY' => 'il_to' ),
+			'join_conds' => array( 'image' =>
+				array( 'LEFT JOIN',
+					array( 'il_to = img_name' )
 				)
 			)
 		);
diff --git a/includes/specials/SpecialWantedtemplates.php b/includes/specials/SpecialWantedtemplates.php
index f5539c18..d13fa031 100644
--- a/includes/specials/SpecialWantedtemplates.php
+++ b/includes/specials/SpecialWantedtemplates.php
@@ -38,17 +38,17 @@ class WantedTemplatesPage extends WantedQueryPage {
 	}
 
 	function getQueryInfo() {
-		return array (
-			'tables' => array ( 'templatelinks', 'page' ),
-			'fields' => array ( 'namespace' => 'tl_namespace',
+		return array(
+			'tables' => array( 'templatelinks', 'page' ),
+			'fields' => array( 'namespace' => 'tl_namespace',
 					'title' => 'tl_title',
 					'value' => 'COUNT(*)' ),
-			'conds' => array ( 'page_title IS NULL',
+			'conds' => array( 'page_title IS NULL',
 					'tl_namespace' => NS_TEMPLATE ),
-			'options' => array (
+			'options' => array(
 				'GROUP BY' => array( 'tl_namespace', 'tl_title' ) ),
-			'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
-					array ( 'page_namespace = tl_namespace',
+			'join_conds' => array( 'page' => array( 'LEFT JOIN',
+					array( 'page_namespace = tl_namespace',
 						'page_title = tl_title' ) ) )
 		);
 	}
diff --git a/includes/specials/SpecialWatchlist.php b/includes/specials/SpecialWatchlist.php
index c7f122b8..4afa279e 100644
--- a/includes/specials/SpecialWatchlist.php
+++ b/includes/specials/SpecialWatchlist.php
@@ -26,8 +26,8 @@ class SpecialWatchlist extends SpecialPage {
 	/**
 	 * Constructor
 	 */
-	public function __construct( $page = 'Watchlist' ) {
-		parent::__construct( $page );
+	public function __construct( $page = 'Watchlist', $restriction = 'viewmywatchlist' ) {
+		parent::__construct( $page, $restriction );
 	}
 
 	/**
@@ -41,7 +41,7 @@ class SpecialWatchlist extends SpecialPage {
 		$output = $this->getOutput();
 
 		# Anons don't get a watchlist
-		if( $user->isAnon() ) {
+		if ( $user->isAnon() ) {
 			$output->setPageTitle( $this->msg( 'watchnologin' ) );
 			$output->setRobotPolicy( 'noindex,nofollow' );
 			$llink = Linker::linkKnown(
@@ -54,17 +54,16 @@ class SpecialWatchlist extends SpecialPage {
 			return;
 		}
 
+		// Check permissions
+		$this->checkPermissions();
+
 		// Add feed links
-		$wlToken = $user->getOption( 'watchlisttoken' );
-		if ( !$wlToken ) {
-			$wlToken = MWCryptRand::generateHex( 40 );
-			$user->setOption( 'watchlisttoken', $wlToken );
-			$user->saveSettings();
+		$wlToken = $user->getTokenFromOption( 'watchlisttoken' );
+		if ( $wlToken ) {
+			$this->addFeedLinks( array( 'action' => 'feedwatchlist', 'allrev' => 'allrev',
+								'wlowner' => $user->getName(), 'wltoken' => $wlToken ) );
 		}
 
-		$this->addFeedLinks( array( 'action' => 'feedwatchlist', 'allrev' => 'allrev',
-							'wlowner' => $user->getName(), 'wltoken' => $wlToken ) );
-
 		$this->setHeaders();
 		$this->outputHeader();
 
@@ -74,9 +73,9 @@ class SpecialWatchlist extends SpecialPage {
 		$request = $this->getRequest();
 
 		$mode = SpecialEditWatchlist::getMode( $request, $par );
-		if( $mode !== false ) {
+		if ( $mode !== false ) {
 			# TODO: localise?
-			switch( $mode ) {
+			switch ( $mode ) {
 				case SpecialEditWatchlist::EDIT_CLEAR:
 					$mode = 'clear';
 					break;
@@ -87,7 +86,7 @@ class SpecialWatchlist extends SpecialPage {
 					$mode = null;
 			}
 			$title = SpecialPage::getTitleFor( 'EditWatchlist', $mode );
-			$output->redirect( $title->getLocalUrl() );
+			$output->redirect( $title->getLocalURL() );
 			return;
 		}
 
@@ -99,30 +98,30 @@ class SpecialWatchlist extends SpecialPage {
 			return;
 		}
 
-		// @TODO: use FormOptions!
+		// @todo use FormOptions!
 		$defaults = array(
-		/* float */ 'days'      => floatval( $user->getOption( 'watchlistdays' ) ), /* 3.0 or 0.5, watch further below */
+		/* float */ 'days' => floatval( $user->getOption( 'watchlistdays' ) ),
 		/* bool  */ 'hideMinor' => (int)$user->getBoolOption( 'watchlisthideminor' ),
-		/* bool  */ 'hideBots'  => (int)$user->getBoolOption( 'watchlisthidebots' ),
+		/* bool  */ 'hideBots' => (int)$user->getBoolOption( 'watchlisthidebots' ),
 		/* bool  */ 'hideAnons' => (int)$user->getBoolOption( 'watchlisthideanons' ),
-		/* bool  */ 'hideLiu'   => (int)$user->getBoolOption( 'watchlisthideliu' ),
+		/* bool  */ 'hideLiu' => (int)$user->getBoolOption( 'watchlisthideliu' ),
 		/* bool  */ 'hidePatrolled' => (int)$user->getBoolOption( 'watchlisthidepatrolled' ),
-		/* bool  */ 'hideOwn'   => (int)$user->getBoolOption( 'watchlisthideown' ),
-		/* bool  */ 'extended'   => (int)$user->getBoolOption( 'extendwatchlist' ),
+		/* bool  */ 'hideOwn' => (int)$user->getBoolOption( 'watchlisthideown' ),
+		/* bool  */ 'extended' => (int)$user->getBoolOption( 'extendwatchlist' ),
 		/* ?     */ 'namespace' => '', //means all
-		/* ?     */ 'invert'    => false,
+		/* ?     */ 'invert' => false,
 		/* bool  */ 'associated' => false,
 		);
 		$this->customFilters = array();
 		wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
-		foreach( $this->customFilters as $key => $params ) {
+		foreach ( $this->customFilters as $key => $params ) {
 			$defaults[$key] = $params['default'];
 		}
 
 		# Extract variables from the request, falling back to user preferences or
 		# other default values if these don't exist
 		$values = array();
-		$values['days'] = $request->getVal( 'days', $defaults['days'] );
+		$values['days'] = floatval( $request->getVal( 'days', $defaults['days'] ) );
 		$values['hideMinor'] = (int)$request->getBool( 'hideMinor', $defaults['hideMinor'] );
 		$values['hideBots'] = (int)$request->getBool( 'hideBots', $defaults['hideBots'] );
 		$values['hideAnons'] = (int)$request->getBool( 'hideAnons', $defaults['hideAnons'] );
@@ -130,7 +129,7 @@ class SpecialWatchlist extends SpecialPage {
 		$values['hideOwn'] = (int)$request->getBool( 'hideOwn', $defaults['hideOwn'] );
 		$values['hidePatrolled'] = (int)$request->getBool( 'hidePatrolled', $defaults['hidePatrolled'] );
 		$values['extended'] = (int)$request->getBool( 'extended', $defaults['extended'] );
-		foreach( $this->customFilters as $key => $params ) {
+		foreach ( $this->customFilters as $key => $params ) {
 			$values[$key] = (int)$request->getBool( $key, $defaults[$key] );
 		}
 
@@ -159,61 +158,41 @@ class SpecialWatchlist extends SpecialPage {
 		$values['invert'] = $invert;
 		$values['associated'] = $associated;
 
-		if( is_null( $values['days'] ) || !is_numeric( $values['days'] ) ) {
-			$big = 1000; /* The magical big */
-			if( $nitems > $big ) {
-				# Set default cutoff shorter
-				$values['days'] = $defaults['days'] = (12.0 / 24.0); # 12 hours...
-			} else {
-				$values['days'] = $defaults['days']; # default cutoff for shortlisters
-			}
-		} else {
-			$values['days'] = floatval( $values['days'] );
-		}
-
 		// Dump everything here
 		$nondefaults = array();
 		foreach ( $defaults as $name => $defValue ) {
 			wfAppendToArrayIfNotDefault( $name, $values[$name], $defaults, $nondefaults );
 		}
 
-		if( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' ) &&
+		if ( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' ) &&
 			$request->wasPosted() )
 		{
 			$user->clearAllNotifications();
-			$output->redirect( $this->getTitle()->getFullUrl( $nondefaults ) );
+			$output->redirect( $this->getTitle()->getFullURL( $nondefaults ) );
 			return;
 		}
 
 		# Possible where conditions
 		$conds = array();
 
-		if( $values['days'] > 0 ) {
+		if ( $values['days'] > 0 ) {
 			$conds[] = 'rc_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( time() - intval( $values['days'] * 86400 ) ) );
 		}
 
-		# If the watchlist is relatively short, it's simplest to zip
-		# down its entirety and then sort the results.
-
-		# If it's relatively long, it may be worth our while to zip
-		# through the time-sorted page list checking for watched items.
-
-		# Up estimate of watched items by 15% to compensate for talk pages...
-
 		# Toggles
-		if( $values['hideOwn'] ) {
+		if ( $values['hideOwn'] ) {
 			$conds[] = 'rc_user != ' . $user->getId();
 		}
-		if( $values['hideBots'] ) {
+		if ( $values['hideBots'] ) {
 			$conds[] = 'rc_bot = 0';
 		}
-		if( $values['hideMinor'] ) {
+		if ( $values['hideMinor'] ) {
 			$conds[] = 'rc_minor = 0';
 		}
-		if( $values['hideLiu'] ) {
+		if ( $values['hideLiu'] ) {
 			$conds[] = 'rc_user = 0';
 		}
-		if( $values['hideAnons'] ) {
+		if ( $values['hideAnons'] ) {
 			$conds[] = 'rc_user != 0';
 		}
 		if ( $user->useRCPatrol() && $values['hidePatrolled'] ) {
@@ -224,44 +203,72 @@ class SpecialWatchlist extends SpecialPage {
 		}
 
 		# Toggle watchlist content (all recent edits or just the latest)
-		if( $values['extended'] ) {
+		if ( $values['extended'] ) {
 			$limitWatchlist = $user->getIntOption( 'wllimit' );
 			$usePage = false;
 		} else {
 			# Top log Ids for a page are not stored
-			$conds[] = 'rc_this_oldid=page_latest OR rc_type=' . RC_LOG;
+			$nonRevisionTypes = array( RC_LOG );
+			wfRunHooks( 'SpecialWatchlistGetNonRevisionTypes', array( &$nonRevisionTypes ) );
+			if ( $nonRevisionTypes ) {
+				if ( count( $nonRevisionTypes ) === 1 ) {
+					// if only one use an equality instead of IN condition
+					$nonRevisionTypes = reset( $nonRevisionTypes );
+				}
+				$conds[] = $dbr->makeList(
+					array(
+						'rc_this_oldid=page_latest',
+						'rc_type' => $nonRevisionTypes,
+					),
+					LIST_OR
+				);
+			}
 			$limitWatchlist = 0;
 			$usePage = true;
 		}
 
 		# Show a message about slave lag, if applicable
 		$lag = wfGetLB()->safeGetLag( $dbr );
-		if( $lag > 0 ) {
+		if ( $lag > 0 ) {
 			$output->showLagWarning( $lag );
 		}
 
-		# Create output form
-		$form = Xml::fieldset( $this->msg( 'watchlist-options' )->text(), false, array( 'id' => 'mw-watchlist-options' ) );
+		# Create output
+		$form = '';
 
 		# Show watchlist header
+		$form .= "<p>";
 		$form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse() . "\n";
-
-		if( $user->getOption( 'enotifwatchlistpages' ) && $wgEnotifWatchlist) {
-			$form .= $this->msg( 'wlheader-enotif' )->parseAsBlock() . "\n";
+		if ( $wgEnotifWatchlist && $user->getOption( 'enotifwatchlistpages' ) ) {
+			$form .= $this->msg( 'wlheader-enotif' )->parse() . "\n";
+		}
+		if ( $wgShowUpdatedMarker ) {
+			$form .= $this->msg( 'wlheader-showupdated' )->parse() . "\n";
 		}
-		if( $wgShowUpdatedMarker ) {
+		$form .= "</p>";
+
+		if ( $wgShowUpdatedMarker ) {
 			$form .= Xml::openElement( 'form', array( 'method' => 'post',
-						'action' => $this->getTitle()->getLocalUrl(),
-						'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
-					$this->msg( 'wlheader-showupdated' )->parse() .
-					Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
-					Html::hidden( 'reset', 'all' ) . "\n";
-					foreach ( $nondefaults as $key => $value ) {
-						$form .= Html::hidden( $key, $value ) . "\n";
-					}
-					$form .= Xml::closeElement( 'form' ) . "\n";
-		}
-		$form .= "<hr />\n";
+				'action' => $this->getTitle()->getLocalURL(),
+				'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
+			Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
+			Html::hidden( 'reset', 'all' ) . "\n";
+			foreach ( $nondefaults as $key => $value ) {
+				$form .= Html::hidden( $key, $value ) . "\n";
+			}
+			$form .= Xml::closeElement( 'form' ) . "\n";
+		}
+
+		$form .= Xml::openElement( 'form', array(
+			'method' => 'post',
+			'action' => $this->getTitle()->getLocalURL(),
+			'id' => 'mw-watchlist-form'
+		) );
+		$form .= Xml::fieldset(
+			$this->msg( 'watchlist-options' )->text(),
+			false,
+			array( 'id' => 'mw-watchlist-options' )
+		);
 
 		$tables = array( 'recentchanges', 'watchlist' );
 		$fields = RecentChange::selectFields();
@@ -276,10 +283,10 @@ class SpecialWatchlist extends SpecialPage {
 			),
 		);
 		$options = array( 'ORDER BY' => 'rc_timestamp DESC' );
-		if( $wgShowUpdatedMarker ) {
+		if ( $wgShowUpdatedMarker ) {
 			$fields[] = 'wl_notificationtimestamp';
 		}
-		if( $limitWatchlist ) {
+		if ( $limitWatchlist ) {
 			$options['LIMIT'] = $limitWatchlist;
 		}
 
@@ -302,7 +309,7 @@ class SpecialWatchlist extends SpecialPage {
 
 		$lang = $this->getLanguage();
 		$wlInfo = '';
-		if( $values['days'] > 0 ) {
+		if ( $values['days'] > 0 ) {
 			$timestamp = wfTimestampNow();
 			$wlInfo = $this->msg( 'wlnote' )->numParams( $numRows, round( $values['days'] * 24 ) )->params(
 				$lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user ) )->parse() . "<br />\n";
@@ -312,11 +319,11 @@ class SpecialWatchlist extends SpecialPage {
 
 		# Spit out some control panel links
 		$filters = array(
-			'hideMinor' 	=> 'rcshowhideminor',
-			'hideBots' 		=> 'rcshowhidebots',
-			'hideAnons' 	=> 'rcshowhideanons',
-			'hideLiu' 		=> 'rcshowhideliu',
-			'hideOwn' 		=> 'rcshowhidemine',
+			'hideMinor' => 'rcshowhideminor',
+			'hideBots' => 'rcshowhidebots',
+			'hideAnons' => 'rcshowhideanons',
+			'hideLiu' => 'rcshowhideliu',
+			'hideOwn' => 'rcshowhidemine',
 			'hidePatrolled' => 'rcshowhidepatr'
 		);
 		foreach ( $this->customFilters as $key => $params ) {
@@ -328,7 +335,7 @@ class SpecialWatchlist extends SpecialPage {
 		}
 
 		$links = array();
-		foreach( $filters as $name => $msg ) {
+		foreach ( $filters as $name => $msg ) {
 			$links[] = $this->showHideLink( $nondefaults, $msg, $name, $values[$name] );
 		}
 
@@ -341,7 +348,6 @@ class SpecialWatchlist extends SpecialPage {
 		$form .= $wlInfo;
 		$form .= $cutofflinks;
 		$form .= $lang->pipeList( $links ) . "\n";
-		$form .= Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl(), 'id' => 'mw-watchlist-form-namespaceselector' ) ) . "\n";
 		$form .= "<hr />\n<p>";
 		$form .= Html::namespaceSelector(
 			array(
@@ -349,8 +355,8 @@ class SpecialWatchlist extends SpecialPage {
 				'all' => '',
 				'label' => $this->msg( 'namespace' )->text()
 			), array(
-				'name'  => 'namespace',
-				'id'    => 'namespace',
+				'name' => 'namespace',
+				'id' => 'namespace',
 				'class' => 'namespaceselector',
 			)
 		) . '&#160;';
@@ -372,13 +378,15 @@ class SpecialWatchlist extends SpecialPage {
 		foreach ( $hiddenFields as $key => $value ) {
 			$form .= Html::hidden( $key, $value ) . "\n";
 		}
-		$form .= Xml::closeElement( 'form' ) . "\n";
 		$form .= Xml::closeElement( 'fieldset' ) . "\n";
+		$form .= Xml::closeElement( 'form' ) . "\n";
 		$output->addHTML( $form );
 
 		# If there's nothing to show, stop here
-		if( $numRows == 0 ) {
-			$output->addWikiMsg( 'watchnochange' );
+		if ( $numRows == 0 ) {
+			$output->wrapWikiMsg(
+				"<div class='mw-changeslist-empty'>\n$1\n</div>", 'recentchanges-noresult'
+			);
 			return;
 		}
 
@@ -438,7 +446,7 @@ class SpecialWatchlist extends SpecialPage {
 
 	protected function showHideLink( $options, $message, $name, $value ) {
 		$label = $this->msg( $value ? 'show' : 'hide' )->escaped();
-		$options[$name] = 1 - (int) $value;
+		$options[$name] = 1 - (int)$value;
 
 		return $this->msg( $message )->rawParams( Linker::linkKnown( $this->getTitle(), $label, array(), $options ) )->escaped();
 	}
@@ -469,17 +477,19 @@ class SpecialWatchlist extends SpecialPage {
 	/**
 	 * Returns html
 	 *
+	 * @param int $days This gets overwritten, so is not used
+	 * @param array $options Query parameters for URL
 	 * @return string
 	 */
 	protected function cutoffLinks( $days, $options = array() ) {
 		$hours = array( 1, 2, 6, 12 );
 		$days = array( 1, 3, 7 );
 		$i = 0;
-		foreach( $hours as $h ) {
+		foreach ( $hours as $h ) {
 			$hours[$i++] = $this->hoursLink( $h, $options );
 		}
 		$i = 0;
-		foreach( $days as $d ) {
+		foreach ( $days as $d ) {
 			$days[$i++] = $this->daysLink( $d, $options );
 		}
 		return $this->msg( 'wlshowlast' )->rawParams(
@@ -491,7 +501,7 @@ class SpecialWatchlist extends SpecialPage {
 	/**
 	 * Count the number of items on a user's watchlist
 	 *
-	 * @param $dbr A database connection
+	 * @param DatabaseBase $dbr A database connection
 	 * @return Integer
 	 */
 	protected function countItems( $dbr ) {
diff --git a/includes/specials/SpecialWhatlinkshere.php b/includes/specials/SpecialWhatlinkshere.php
index cb3e985c..05c7dd5f 100644
--- a/includes/specials/SpecialWhatlinkshere.php
+++ b/includes/specials/SpecialWhatlinkshere.php
@@ -77,7 +77,7 @@ class SpecialWhatLinksHere extends SpecialPage {
 		$this->opts = $opts;
 
 		$this->target = Title::newFromURL( $opts->getValue( 'target' ) );
-		if( !$this->target ) {
+		if ( !$this->target ) {
 			$out->addHTML( $this->whatlinkshereForm() );
 			return;
 		}
@@ -94,11 +94,11 @@ class SpecialWhatLinksHere extends SpecialPage {
 	}
 
 	/**
-	 * @param int $level     Recursion level
-	 * @param $target Title   Target title
-	 * @param int $limit     Number of entries to display
-	 * @param $from Title   Display from this article ID
-	 * @param $back Title   Display from this article ID at backwards scrolling
+	 * @param int $level Recursion level
+	 * @param Title $target Target title
+	 * @param int $limit Number of entries to display
+	 * @param int $from Display from this article ID (default: 0)
+	 * @param int $back Display from this article ID at backwards scrolling (default: 0)
 	 */
 	function showIndirectLinks( $level, $target, $limit, $from = 0, $back = 0 ) {
 		global $wgMaxRedirectLinksRetrieved;
@@ -111,7 +111,7 @@ class SpecialWhatLinksHere extends SpecialPage {
 		$hidetrans = $this->opts->getValue( 'hidetrans' );
 		$hideimages = $target->getNamespace() != NS_FILE || $this->opts->getValue( 'hideimages' );
 
-		$fetchlinks = (!$hidelinks || !$hideredirs);
+		$fetchlinks = ( !$hidelinks || !$hideredirs );
 
 		// Make the query
 		$plConds = array(
@@ -119,9 +119,9 @@ class SpecialWhatLinksHere extends SpecialPage {
 			'pl_namespace' => $target->getNamespace(),
 			'pl_title' => $target->getDBkey(),
 		);
-		if( $hideredirs ) {
+		if ( $hideredirs ) {
 			$plConds['rd_from'] = null;
-		} elseif( $hidelinks ) {
+		} elseif ( $hidelinks ) {
 			$plConds[] = 'rd_from is NOT NULL';
 		}
 
@@ -166,34 +166,38 @@ class SpecialWhatLinksHere extends SpecialPage {
 			'rd_interwiki = ' . $dbr->addQuotes( '' ) . ' OR rd_interwiki IS NULL'
 		)));
 
-		if( $fetchlinks ) {
+		if ( $fetchlinks ) {
 			$options['ORDER BY'] = 'pl_from';
 			$plRes = $dbr->select( array( 'pagelinks', 'page', 'redirect' ), $fields,
 				$plConds, __METHOD__, $options,
-				$joinConds);
+				$joinConds
+			);
 		}
 
-		if( !$hidetrans ) {
+		if ( !$hidetrans ) {
 			$options['ORDER BY'] = 'tl_from';
 			$tlRes = $dbr->select( array( 'templatelinks', 'page', 'redirect' ), $fields,
 				$tlConds, __METHOD__, $options,
-				$joinConds);
+				$joinConds
+			);
 		}
 
-		if( !$hideimages ) {
+		if ( !$hideimages ) {
 			$options['ORDER BY'] = 'il_from';
 			$ilRes = $dbr->select( array( 'imagelinks', 'page', 'redirect' ), $fields,
 				$ilConds, __METHOD__, $options,
-				$joinConds);
+				$joinConds
+			);
 		}
 
-		if( ( !$fetchlinks || !$plRes->numRows() ) && ( $hidetrans || !$tlRes->numRows() ) && ( $hideimages || !$ilRes->numRows() ) ) {
+		if ( ( !$fetchlinks || !$plRes->numRows() ) && ( $hidetrans || !$tlRes->numRows() ) && ( $hideimages || !$ilRes->numRows() ) ) {
 			if ( 0 == $level ) {
 				$out->addHTML( $this->whatlinkshereForm() );
 
 				// Show filters only if there are links
-				if( $hidelinks || $hidetrans || $hideredirs || $hideimages )
+				if ( $hidelinks || $hidetrans || $hideredirs || $hideimages ) {
 					$out->addHTML( $this->getFilterPanel() );
+				}
 
 				$errMsg = is_int( $namespace ) ? 'nolinkshere-ns' : 'nolinkshere';
 				$out->addWikiMsg( $errMsg, $this->target->getPrefixedText() );
@@ -204,21 +208,21 @@ class SpecialWhatLinksHere extends SpecialPage {
 		// Read the rows into an array and remove duplicates
 		// templatelinks comes second so that the templatelinks row overwrites the
 		// pagelinks row, so we get (inclusion) rather than nothing
-		if( $fetchlinks ) {
+		if ( $fetchlinks ) {
 			foreach ( $plRes as $row ) {
 				$row->is_template = 0;
 				$row->is_image = 0;
 				$rows[$row->page_id] = $row;
 			}
 		}
-		if( !$hidetrans ) {
+		if ( !$hidetrans ) {
 			foreach ( $tlRes as $row ) {
 				$row->is_template = 1;
 				$row->is_image = 0;
 				$rows[$row->page_id] = $row;
 			}
 		}
-		if( !$hideimages ) {
+		if ( !$hideimages ) {
 			foreach ( $ilRes as $row ) {
 				$row->is_template = 0;
 				$row->is_image = 1;
@@ -269,7 +273,7 @@ class SpecialWhatLinksHere extends SpecialPage {
 
 		$out->addHTML( $this->listEnd() );
 
-		if( $level == 0 ) {
+		if ( $level == 0 ) {
 			$out->addHTML( $prevnext );
 		}
 	}
@@ -292,7 +296,7 @@ class SpecialWhatLinksHere extends SpecialPage {
 			}
 		}
 
-		if( $row->rd_from ) {
+		if ( $row->rd_from ) {
 			$query = array( 'redirect' => 'no' );
 		} else {
 			$query = array();
@@ -308,12 +312,15 @@ class SpecialWhatLinksHere extends SpecialPage {
 		// Display properties (redirect or template)
 		$propsText = '';
 		$props = array();
-		if ( $row->rd_from )
+		if ( $row->rd_from ) {
 			$props[] = $msgcache['isredirect'];
-		if ( $row->is_template )
+		}
+		if ( $row->is_template ) {
 			$props[] = $msgcache['istemplate'];
-		if( $row->is_image )
+		}
+		if ( $row->is_image ) {
 			$props[] = $msgcache['isimage'];
+		}
 
 		if ( count( $props ) ) {
 			$propsText = $this->msg( 'parentheses' )->rawParams( implode( $msgcache['semicolon-separator'], $props ) )->escaped();
@@ -334,8 +341,9 @@ class SpecialWhatLinksHere extends SpecialPage {
 
 	protected function wlhLink( Title $target, $text ) {
 		static $title = null;
-		if ( $title === null )
+		if ( $title === null ) {
 			$title = $this->getTitle();
+		}
 
 		return Linker::linkKnown(
 			$title,
@@ -419,8 +427,8 @@ class SpecialWhatLinksHere extends SpecialPage {
 				'all' => '',
 				'label' => $this->msg( 'namespace' )->text()
 			), array(
-				'name'  => 'namespace',
-				'id'    => 'namespace',
+				'name' => 'namespace',
+				'id' => 'namespace',
 				'class' => 'namespaceselector',
 			)
 		);
@@ -450,12 +458,13 @@ class SpecialWhatLinksHere extends SpecialPage {
 
 		$links = array();
 		$types = array( 'hidetrans', 'hidelinks', 'hideredirs' );
-		if( $this->target->getNamespace() == NS_FILE )
+		if ( $this->target->getNamespace() == NS_FILE ) {
 			$types[] = 'hideimages';
+		}
 
 		// Combined message keys: 'whatlinkshere-hideredirs', 'whatlinkshere-hidetrans', 'whatlinkshere-hidelinks', 'whatlinkshere-hideimages'
 		// To be sure they will be found by grep
-		foreach( $types as $type ) {
+		foreach ( $types as $type ) {
 			$chosen = $this->opts->getValue( $type );
 			$msg = $chosen ? $show : $hide;
 			$overrides = array( $type => !$chosen );
diff --git a/includes/specials/SpecialWithoutinterwiki.php b/includes/specials/SpecialWithoutinterwiki.php
index 37237407..9d23499f 100644
--- a/includes/specials/SpecialWithoutinterwiki.php
+++ b/includes/specials/SpecialWithoutinterwiki.php
@@ -44,21 +44,21 @@ class WithoutInterwikiPage extends PageQueryPage {
 		global $wgScript;
 
 		# Do not show useless input form if special page is cached
-		if( $this->isCached() ) {
+		if ( $this->isCached() ) {
 			return '';
 		}
 
 		$prefix = $this->prefix;
 		$t = $this->getTitle();
 
-		return Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
-			Xml::openElement( 'fieldset' ) .
-			Xml::element( 'legend', null, $this->msg( 'withoutinterwiki-legend' )->text() ) .
-			Html::hidden( 'title', $t->getPrefixedText() ) .
-			Xml::inputLabel( $this->msg( 'allpagesprefix' )->text(), 'prefix', 'wiprefix', 20, $prefix ) . ' ' .
-			Xml::submitButton( $this->msg( 'withoutinterwiki-submit' )->text() ) .
-			Xml::closeElement( 'fieldset' ) .
-			Xml::closeElement( 'form' );
+		return Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) . "\n" .
+			Html::openElement( 'fieldset' ) . "\n" .
+			Html::element( 'legend', null, $this->msg( 'withoutinterwiki-legend' )->text() ) . "\n" .
+			Html::hidden( 'title', $t->getPrefixedText() ) . "\n" .
+			Xml::inputLabel( $this->msg( 'allpagesprefix' )->text(), 'prefix', 'wiprefix', 20, $prefix ) . "\n" .
+			Xml::submitButton( $this->msg( 'withoutinterwiki-submit' )->text() ) . "\n" .
+			Html::closeElement( 'fieldset' ) . "\n" .
+			Html::closeElement( 'form' );
 	}
 
 	function sortDescending() {
@@ -78,15 +78,15 @@ class WithoutInterwikiPage extends PageQueryPage {
 	}
 
 	function getQueryInfo() {
-		$query = array (
-			'tables' => array ( 'page', 'langlinks' ),
-			'fields' => array ( 'namespace' => 'page_namespace',
+		$query = array(
+			'tables' => array( 'page', 'langlinks' ),
+			'fields' => array( 'namespace' => 'page_namespace',
 					'title' => 'page_title',
 					'value' => 'page_title' ),
-			'conds' => array ( 'll_title IS NULL',
+			'conds' => array( 'll_title IS NULL',
 					'page_namespace' => MWNamespace::getContentNamespaces(),
 					'page_is_redirect' => 0 ),
-			'join_conds' => array ( 'langlinks' => array (
+			'join_conds' => array( 'langlinks' => array(
 					'LEFT JOIN', 'll_from = page_id' ) )
 		);
 		if ( $this->prefix ) {
diff --git a/includes/templates/NoLocalSettings.php b/includes/templates/NoLocalSettings.php
index 2483e58c..0006df40 100644
--- a/includes/templates/NoLocalSettings.php
+++ b/includes/templates/NoLocalSettings.php
@@ -22,7 +22,7 @@
  */
 
 if ( !defined( 'MEDIAWIKI' ) ) {
-        die( "NoLocalSettings.php is not a valid MediaWiki entry point\n" );
+	die( "NoLocalSettings.php is not a valid MediaWiki entry point\n" );
 }
 
 if ( !isset( $wgVersion ) ) {
@@ -52,12 +52,12 @@ if ( !function_exists( 'session_name' ) ) {
 	$installerStarted = ( $success && isset( $_SESSION['installData'] ) );
 }
 ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns='http://www.w3.org/1999/xhtml' lang='en'>
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
 	<head>
+		<meta charset="UTF-8" />
 		<title>MediaWiki <?php echo htmlspecialchars( $wgVersion ) ?></title>
-		<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
-		<style type='text/css' media='screen'>
+		<style media='screen'>
 			html, body {
 				color: #000;
 				background-color: #fff;
@@ -79,9 +79,9 @@ if ( !function_exists( 'session_name' ) ) {
 		<p>
 		<?php
 		if ( $installerStarted ) {
-			echo( "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> complete the installation</a> and download LocalSettings.php." );
+			echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> complete the installation</a> and download LocalSettings.php.";
 		} else {
-			echo( "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> set up the wiki</a> first." );
+			echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> set up the wiki</a> first.";
 		}
 		?>
 		</p>
diff --git a/includes/templates/Usercreate.php b/includes/templates/Usercreate.php
index 541d9e40..fcd492cb 100644
--- a/includes/templates/Usercreate.php
+++ b/includes/templates/Usercreate.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Html form for account creation.
+ * Html form for account creation (since 1.22 with VForm appearance).
  *
  * 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
@@ -21,16 +21,12 @@
  * @ingroup Templates
  */
 
-/**
- * @defgroup Templates Templates
- */
+class UsercreateTemplate extends BaseTemplate {
 
-if( !defined( 'MEDIAWIKI' ) ) die( -1 );
-
-/**
- * @ingroup Templates
- */
-class UsercreateTemplate extends QuickTemplate {
+	/**
+	 * Extensions (AntiSpoof and TitleBlacklist) call this in response to
+	 * UserCreateForm hook to add checkboxes to the create account form.
+	 */
 	function addInputItem( $name, $value, $type, $msg, $helptext = false ) {
 		$this->data['extraInput'][] = array(
 			'name' => $name,
@@ -42,220 +38,253 @@ class UsercreateTemplate extends QuickTemplate {
 	}
 
 	function execute() {
-		if( $this->data['message'] ) {
+		global $wgCookieExpiration;
+		$expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
 ?>
-	<div class="<?php $this->text('messagetype') ?>box">
-		<?php if ( $this->data['messagetype'] == 'error' ) { ?>
-			<strong><?php $this->msg( 'loginerror' )?></strong><br />
-		<?php } ?>
-		<?php $this->html('message') ?>
-	</div>
-	<div class="visualClear"></div>
-<?php } ?>
+<div class="mw-ui-container">
+	<?php if ( $this->haveData( 'languages' ) ) { ?>
+		<div id="languagelinks">
+			<p><?php $this->html( 'languages' ); ?></p>
+		</div>
+	<?php }
+	      if ( !wfMessage( 'signupstart' )->isDisabled() ) { ?>
+		<div id="signupstart"><?php $this->msgWiki( 'signupstart' ); ?></div>
+	<?php } ?>
+	<div id="userloginForm">
+		<h2 class="createaccount-join">
+			<?php $this->msg( $this->data['loggedin'] ? 'createacct-another-join' : 'createacct-join' ); ?>
+		</h2>
+		<form name="userlogin2" id="userlogin2" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
+			<section class="mw-form-header">
+				<?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
+			</section>
+			<?php if ( $this->data['message'] ) { ?>
+				<div class="<?php $this->text( 'messagetype' ); ?>box">
+					<?php if ( $this->data['messagetype'] == 'error' ) { ?>
+						<strong><?php $this->msg( 'createacct-error' ); ?></strong>
+						<br />
+					<?php } ?>
+					<?php $this->html( 'message' ); ?>
+				</div>
+			<?php } ?>
 
-<div id="signupstart"><?php $this->msgWiki( 'signupstart' ); ?></div>
-<div id="userlogin">
+			<div>
+				<label for='wpName2'>
+					<?php $this->msg( 'userlogin-yourname' ); ?>
 
-<form name="userlogin2" id="userlogin2" method="post" action="<?php $this->text('action') ?>">
-	<h2><?php $this->msg('createaccount') ?></h2>
-	<p id="userloginlink"><?php $this->html('link') ?></p>
-	<?php $this->html('header'); /* pre-table point for form plugins... */ ?>
-	<?php if( $this->haveData( 'languages' ) ) { ?><div id="languagelinks"><p><?php $this->html( 'languages' ); ?></p></div><?php } ?>
-	<table>
-		<tr>
-			<td class="mw-label"><label for='wpName2'><?php $this->msg('yourname') ?></label></td>
-			<td class="mw-input">
+					<span class="mw-ui-flush-right"><?php echo $this->getMsg( 'createacct-helpusername' )->parse(); ?></span>
+				</label>
 				<?php
-			echo Html::input( 'wpName', $this->data['name'], 'text', array(
-				'class' => 'loginText',
-				'id' => 'wpName2',
-				'tabindex' => '1',
-				'size' => '20',
-				'required',
-				'autofocus'
-			) ); ?>
-			</td>
-		</tr>
-		<tr>
-			<td></td>
-			<td class="mw-input">
-				<?php if( $this->data['createemail'] ) {
-					echo Xml::checkLabel(
-						wfMessage( 'createaccountmail' )->text(),
-						'wpCreateaccountMail',
-						'wpCreateaccountMail',
-						$this->data['createemailset'],
-						array( 'tabindex' => '2' )
-					);
-				} ?>
-			</td>
-		</tr>
-		<tr class="mw-row-password">
-			<td class="mw-label"><label for='wpPassword2'><?php $this->msg('yourpassword') ?></label></td>
-			<td class="mw-input">
-<?php
-			echo Html::input( 'wpPassword', null, 'password', array(
-				'class' => 'loginPassword',
-				'id' => 'wpPassword2',
-				'tabindex' => '3',
-				'size' => '20'
-			) + User::passwordChangeInputAttribs() ); ?>
-			</td>
-		</tr>
-	<?php if( $this->data['usedomain'] ) {
-		$doms = "";
-		foreach( $this->data['domainnames'] as $dom ) {
-			$doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
-		}
-	?>
-		<tr id="mw-user-domain-section">
-			<td class="mw-label"><?php $this->msg( 'yourdomainname' ) ?></td>
-			<td class="mw-input">
-				<select name="wpDomain" value="<?php $this->text( 'domain' ) ?>"
-					tabindex="4">
-					<?php echo $doms ?>
-				</select>
-			</td>
-		</tr>
-	<?php } ?>
-		<tr class="mw-row-password">
-			<td class="mw-label"><label for='wpRetype'><?php $this->msg('yourpasswordagain') ?></label></td>
-			<td class="mw-input">
+				echo Html::input( 'wpName', $this->data['name'], 'text', array(
+					'class' => 'mw-input loginText',
+					'id' => 'wpName2',
+					'tabindex' => '1',
+					'size' => '20',
+					'required',
+					'placeholder' => $this->getMsg( $this->data['loggedin'] ?
+						'createacct-another-username-ph' : 'userlogin-yourname-ph' )->text(),
+				) );
+				?>
+			</div>
+
+			<div>
+				<?php if ( $this->data['createemail'] ) { ?>
+					<label class="mw-ui-checkbox-label">
+						<input name="wpCreateaccountMail" type="checkbox" value="1" id="wpCreateaccountMail" tabindex="2"
+							<?php if ( $this->data['createemailset'] ) {
+								echo 'checked="checked"';
+							} ?>
+						>
+						<?php $this->msg( 'createaccountmail' ); ?>
+					</label>
+				<?php } ?>
+			</div>
+
+			<div class="mw-row-password">
+				<label for='wpPassword2'><?php $this->msg( 'userlogin-yourpassword' ); ?></label>
+				<?php
+				echo Html::input( 'wpPassword', null, 'password', array(
+					'class' => 'mw-input loginPassword',
+					'id' => 'wpPassword2',
+					'tabindex' => '3',
+					'size' => '20',
+					'required',
+					'placeholder' => $this->getMsg( 'createacct-yourpassword-ph' )->text()
+				) + User::passwordChangeInputAttribs() );
+				?>
+			</div>
+
+			<?php
+			if ( $this->data['usedomain'] ) {
+				$doms = "";
+				foreach ( $this->data['domainnames'] as $dom ) {
+					$doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
+				}
+			?>
+				<div id="mw-user-domain-section">
+					<label for="wpDomain"><?php $this->msg( 'yourdomainname' ); ?></label>
+					<div class="mw-input">
+						<select name="wpDomain" value="<?php $this->text( 'domain' ); ?>" tabindex="4">
+							<?php echo $doms ?>
+						</select>
+					</div>
+				</div>
+			<?php } ?>
+
+			<div class="mw-row-password">
+				<label for='wpRetype'><?php $this->msg( 'createacct-yourpasswordagain' ); ?></label>
 				<?php
-		echo Html::input( 'wpRetype', null, 'password', array(
-			'class' => 'loginPassword',
-			'id' => 'wpRetype',
-			'tabindex' => '5',
-			'size' => '20'
-		) + User::passwordChangeInputAttribs() ); ?>
-			</td>
-		</tr>
-		<tr>
-			<?php if( $this->data['useemail'] ) { ?>
-				<td class="mw-label"><label for='wpEmail'><?php $this->msg('youremail') ?></label></td>
-				<td class="mw-input">
+				echo Html::input( 'wpRetype', null, 'password', array(
+					'class' => 'mw-input loginPassword',
+					'id' => 'wpRetype',
+					'tabindex' => '5',
+					'size' => '20',
+					'required',
+					'placeholder' => $this->getMsg( 'createacct-yourpasswordagain-ph' )->text()
+					) + User::passwordChangeInputAttribs() );
+				?>
+			</div>
+
+			<div>
+				<?php if ( $this->data['useemail'] ) { ?>
+					<label for='wpEmail'>
+						<?php
+							$this->msg( $this->data['emailrequired'] ?
+								'createacct-emailrequired' :
+								'createacct-emailoptional'
+							);
+						?>
+					</label>
 					<?php
-		echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
-			'class' => 'loginText',
-			'id' => 'wpEmail',
-			'tabindex' => '6',
-			'size' => '20'
-		) ); ?>
+						echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
+							'class' => 'mw-input loginText',
+							'id' => 'wpEmail',
+							'tabindex' => '6',
+							'size' => '20',
+							'required' => $this->data['emailrequired'],
+							'placeholder' => $this->getMsg( $this->data['loggedin'] ?
+								'createacct-another-email-ph' : 'createacct-email-ph' )->text()
+						) );
+					?>
+				<?php } ?>
+			</div>
+
+			<?php if ( $this->data['userealname'] ) { ?>
+				<div>
+					<label for='wpRealName'><?php $this->msg( 'createacct-realname' ); ?></label>
+					<input type='text' class='mw-input loginText' name="wpRealName" id="wpRealName"
+						tabindex="7"
+						value="<?php $this->text( 'realname' ); ?>" size='20' />
 					<div class="prefsectiontip">
-						<?php  // duplicated in Preferences.php profilePreferences()
-							if( $this->data['emailrequired'] ) {
-								$this->msgWiki('prefs-help-email-required');
-							} else {
-								$this->msgWiki('prefs-help-email');
-							}
-							if( $this->data['emailothers'] ) {
-								$this->msgWiki('prefs-help-email-others');
-							} ?>
+						<?php $this->msgWiki( $this->data['loggedin'] ? 'createacct-another-realname-tip' : 'prefs-help-realname' ); ?>
 					</div>
-				</td>
-			<?php } ?>
-			<?php if( $this->data['userealname'] ) { ?>
-				</tr>
-				<tr>
-					<td class="mw-label"><label for='wpRealName'><?php $this->msg('yourrealname') ?></label></td>
-					<td class="mw-input">
-						<input type='text' class='loginText' name="wpRealName" id="wpRealName"
-							tabindex="7"
-							value="<?php $this->text('realname') ?>" size='20' />
-						<div class="prefsectiontip">
-							<?php $this->msgWiki('prefs-help-realname'); ?>
-						</div>
-					</td>
+				</div>
 			<?php } ?>
-			<?php if( $this->data['usereason'] ) { ?>
-				</tr>
-				<tr>
-					<td class="mw-label"><label for='wpReason'><?php $this->msg('createaccountreason') ?></label></td>
-					<td class="mw-input">
-						<input type='text' class='loginText' name="wpReason" id="wpReason"
-							tabindex="8"
-							value="<?php $this->text('reason') ?>" size='20' />
-					</td>
+
+			<?php if ( $this->data['usereason'] ) { ?>
+				<div>
+					<label for='wpReason'><?php $this->msg( 'createacct-reason' ); ?></label>
+					<?php echo Html::input( 'wpReason', $this->data['reason'], 'text', array(
+						'class' => 'mw-input loginText',
+						'id' => 'wpReason',
+						'tabindex' => '8',
+						'size' => '20',
+						'placeholder' => $this->getMsg( 'createacct-reason-ph' )->text()
+					) ); ?>
+				</div>
 			<?php } ?>
-		</tr>
-		<?php if( $this->data['canremember'] ) { ?>
-		<tr>
-			<td></td>
-			<td class="mw-input">
-				<?php
-				global $wgCookieExpiration;
-				$expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
-				echo Xml::checkLabel(
-					wfMessage( 'remembermypassword' )->numParams( $expirationDays )->text(),
-					'wpRemember',
-					'wpRemember',
-					$this->data['remember'],
-					array( 'tabindex' => '9' )
-				)
-				?>
-			</td>
-		</tr>
-<?php   }
 
-		$tabIndex = 10;
-		if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
-			foreach ( $this->data['extraInput'] as $inputItem ) { ?>
-		<tr>
 			<?php
-				if ( !empty( $inputItem['msg'] ) && $inputItem['type'] != 'checkbox' ) {
-					?><td class="mw-label"><label for="<?php
-					echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
-					$this->msgWiki( $inputItem['msg'] ) ?></label><?php
-				} else {
-					?><td><?php
-				}
-			?></td>
-			<td class="mw-input">
-				<input type="<?php echo htmlspecialchars( $inputItem['type'] ) ?>" name="<?php
-				echo htmlspecialchars( $inputItem['name'] ); ?>"
-					tabindex="<?php echo $tabIndex++; ?>"
-					value="<?php
-				if ( $inputItem['type'] != 'checkbox' ) {
-					echo htmlspecialchars( $inputItem['value'] );
-				} else {
-					echo '1';
-				}
-					?>" id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
-					<?php
-				if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['value'] ) )
-					echo 'checked="checked"';
-					?> /> <?php
-					if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['msg'] ) ) {
+			$tabIndex = 9;
+			if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
+				foreach ( $this->data['extraInput'] as $inputItem ) { ?>
+					<div>
+						<?php
+						// If it's a checkbox, output the whole thing (assume it has a msg).
+						if ( $inputItem['type'] == 'checkbox' ) {
+						?>
+							<label class="mw-ui-checkbox-label">
+								<input
+									name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+									id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+									type="checkbox" value="1"
+									tabindex="<?php echo $tabIndex++; ?>"
+									<?php if ( !empty( $inputItem['value'] ) ) {
+										echo 'checked="checked"';
+									} ?>
+								>
+								<?php $this->msg( $inputItem['msg'] ); ?>
+							</label>
+						<?php
+						} else {
+							// Not a checkbox.
+							// TODO (bug 31909) support other input types, e.g. select boxes.
 						?>
-				<label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
-					$this->msgHtml( $inputItem['msg'] ) ?></label><?php
-					}
-				if( $inputItem['helptext'] !== false ) {
+							<?php if ( !empty( $inputItem['msg'] ) ) { ?>
+								<label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>">
+									<?php $this->msgWiki( $inputItem['msg'] ); ?>
+								</label>
+							<?php } ?>
+							<input
+								type="<?php echo htmlspecialchars( $inputItem['type'] ); ?>"
+								class="mw-input"
+								name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+								tabindex="<?php echo $tabIndex++; ?>"
+								value="<?php echo htmlspecialchars( $inputItem['value'] ); ?>"
+								id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+							/>
+						<?php } ?>
+						<?php if ( $inputItem['helptext'] !== false ) { ?>
+							<div class="prefsectiontip">
+								<?php $this->msgWiki( $inputItem['helptext'] ); ?>
+							</div>
+						<?php } ?>
+					</div>
+				<?php
+				}
+			}
+
+			// JS attempts to move the image CAPTCHA below this part of the form,
+			// so skip one index.
+			$tabIndex++;
+			?>
+			<div class="mw-submit">
+				<?php
+				echo Html::input(
+					'wpCreateaccount',
+					$this->getMsg( $this->data['loggedin'] ? 'createacct-another-submit' : 'createacct-submit' ),
+					'submit',
+					array(
+						'class' => "mw-ui-button mw-ui-big mw-ui-block mw-ui-primary",
+						'id' => 'wpCreateaccount',
+						'tabindex' => $tabIndex++
+					)
+				);
 				?>
-				<div class="prefsectiontip">
-					<?php $this->msgWiki( $inputItem['helptext'] ); ?>
+			</div>
+			<?php if ( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
+			<?php if ( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpCreateaccountToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+		</form>
+		<?php if ( !wfMessage( 'signupend' )->isDisabled() ) { ?>
+			<div id="signupend"><?php $this->html( 'signupend' ); ?></div>
+		<?php } ?>
+	</div>
+	<div class="mw-createacct-benefits-container">
+		<h2><?php $this->msg( 'createacct-benefit-heading' ); ?></h2>
+		<div class="mw-createacct-benefits-list">
+			<?php
+			for ( $benefitIdx = 1; $benefitIdx <= $this->data['benefitCount']; $benefitIdx++ ) {
+				// Pass each benefit's head text (by default a number) as a parameter to the body's message for PLURAL handling.
+				$headUnescaped = $this->getMsg( "createacct-benefit-head$benefitIdx" )->text();
+			?>
+				<div class="mw-number-text <?php $this->msg( "createacct-benefit-icon$benefitIdx" ); ?>">
+					<h3><?php $this->msg( "createacct-benefit-head$benefitIdx" ); ?></h3>
+					<p><?php echo $this->getMsg( "createacct-benefit-body$benefitIdx" )->params( $headUnescaped )->escaped(); ?></p>
 				</div>
-				<?php } ?>
-			</td>
-		</tr>
-<?php
-			}
-		}
-?>
-		<tr>
-			<td></td>
-			<td class="mw-submit">
-				<input type='submit' name="wpCreateaccount" id="wpCreateaccount"
-					tabindex="<?php echo $tabIndex++; ?>"
-					value="<?php $this->msg('createaccount') ?>" />
-			</td>
-		</tr>
-	</table>
-<?php if( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
-<?php if( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpCreateaccountToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
-</form>
+			<?php } ?>
+		</div>
+	</div>
 </div>
-<div id="signupend"><?php $this->html( 'signupend' ); ?></div>
 <?php
 
 	}
diff --git a/includes/templates/Userlogin.php b/includes/templates/Userlogin.php
index 7bc0241a..5eb60948 100644
--- a/includes/templates/Userlogin.php
+++ b/includes/templates/Userlogin.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Html form for user login.
+ * Html form for user login (since 1.22 with VForm appearance).
  *
  * 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
@@ -21,156 +21,160 @@
  * @ingroup Templates
  */
 
-/**
- * @defgroup Templates Templates
- */
+class UserloginTemplate extends BaseTemplate {
 
-/**
- * HTML template for Special:Userlogin form
- * @ingroup Templates
- */
-class UserloginTemplate extends QuickTemplate {
 	function execute() {
-		if( $this->data['message'] ) {
+		global $wgCookieExpiration;
+		$expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
 ?>
-	<div class="<?php $this->text('messagetype') ?>box">
-		<?php if ( $this->data['messagetype'] == 'error' ) { ?>
-			<strong><?php $this->msg( 'loginerror' )?></strong><br />
-		<?php } ?>
-		<?php $this->html('message') ?>
-	</div>
-	<div class="visualClear"></div>
-<?php } ?>
+<div class="mw-ui-container">
+	<?php if ( $this->haveData( 'languages' ) ) { ?>
+		<div id="languagelinks">
+			<p><?php $this->html( 'languages' ); ?></p>
+		</div>
+	<?php } ?>
+	<div id="userloginForm">
+		<form name="userlogin" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
+			<?php if ( $this->data['loggedin'] ) { ?>
+				<div class="warningbox">
+					<?php echo $this->getMsg( 'userlogin-loggedin' )->params( $this->data['loggedinuser'] )->parse(); ?>
+				</div>
+			<?php } ?>
+			<section class="mw-form-header">
+				<?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
+			</section>
 
-<div id="loginstart"><?php $this->msgWiki( 'loginstart' ); ?></div>
-<div id="userloginForm">
-<form name="userlogin" method="post" action="<?php $this->text('action') ?>">
-	<h2><?php $this->msg('login') ?></h2>
-	<p id="userloginlink"><?php $this->html('link') ?></p>
-	<?php $this->html('header'); /* pre-table point for form plugins... */ ?>
-	<div id="userloginprompt"><?php  $this->msgWiki('loginprompt') ?></div>
-	<?php if( $this->haveData( 'languages' ) ) { ?><div id="languagelinks"><p><?php $this->html( 'languages' ); ?></p></div><?php } ?>
-	<table>
-		<tr>
-			<td class="mw-label"><label for='wpName1'><?php $this->msg('yourname') ?></label></td>
-			<td class="mw-input">
-				<?php
-			echo Html::input( 'wpName', $this->data['name'], 'text', array(
-				'class' => 'loginText',
-				'id' => 'wpName1',
-				'tabindex' => '1',
-				'size' => '20',
-				'required'
-				# Can't do + array( 'autofocus' ) because + for arrays in PHP
-				# only works right for associative arrays!  Thanks, PHP.
-			) + ( $this->data['name'] ? array() : array( 'autofocus' => '' ) ) ); ?>
+			<?php if ( $this->data['message'] ) { ?>
+				<div class="<?php $this->text( 'messagetype' ); ?>box">
+					<?php if ( $this->data['messagetype'] == 'error' ) { ?>
+						<strong><?php $this->msg( 'loginerror' ); ?></strong>
+						<br />
+					<?php } ?>
+					<?php $this->html( 'message' ); ?>
+				</div>
+			<?php } ?>
 
-			</td>
-		</tr>
-		<tr>
-			<td class="mw-label"><label for='wpPassword1'><?php $this->msg('yourpassword') ?></label></td>
-			<td class="mw-input">
-				<?php
-			echo Html::input( 'wpPassword', null, 'password', array(
-				'class' => 'loginPassword',
-				'id' => 'wpPassword1',
-				'tabindex' => '2',
-				'size' => '20'
-			) + ( $this->data['name'] ? array( 'autofocus' ) : array() ) ); ?>
+			<div>
+				<label for='wpName1'>
+					<?php
+					$this->msg( 'userlogin-yourname' );
 
-			</td>
-		</tr>
-	<?php if( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
-		$doms = "";
-		foreach( $this->data['domainnames'] as $dom ) {
-			$doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
-		}
-	?>
-		<tr id="mw-user-domain-section">
-			<td class="mw-label"><?php $this->msg( 'yourdomainname' ) ?></td>
-			<td class="mw-input">
-				<select name="wpDomain" value="<?php $this->text( 'domain' ) ?>"
-					tabindex="3">
-					<?php echo $doms ?>
-				</select>
-			</td>
-		</tr>
-	<?php }
+					if ( $this->data['secureLoginUrl'] ) {
+						echo Html::element( 'a', array(
+							'href' => $this->data['secureLoginUrl'],
+							'class' => 'mw-ui-flush-right mw-secure',
+						), $this->getMsg( 'userlogin-signwithsecure' )->text() );
+					}
+					?>
+				</label>
+				<?php
+				$extraAttrs = array();
+				echo Html::input( 'wpName', $this->data['name'], 'text', array(
+					'class' => 'loginText',
+					'id' => 'wpName1',
+					'tabindex' => '1',
+					'size' => '20',
+					// 'required' is blacklisted for now in Html.php due to browser issues.
+					// Keeping here in case that changes.
+					'required' => true,
+					// Set focus to this field if it's blank.
+					'autofocus' => !$this->data['name'],
+					'placeholder' => $this->getMsg( 'userlogin-yourname-ph' )->text()
+				) );
+				?>
+			</div>
 
-	if( $this->haveData( 'extrafields' ) ) {
-		echo $this->data['extrafields'];
-	}
+			<div>
+				<label for='wpPassword1'>
+					<?php
+					$this->msg( 'userlogin-yourpassword' );
 
-	if( $this->data['canremember'] ) { ?>
-		<tr>
-			<td></td>
-			<td class="mw-input">
+					if ( $this->data['useemail'] && $this->data['canreset'] && $this->data['resetlink'] === true ) {
+						echo ' ' . Linker::link(
+							SpecialPage::getTitleFor( 'PasswordReset' ),
+							$this->getMsg( 'userlogin-resetpassword-link' )->parse(),
+							array( 'class' => 'mw-ui-flush-right' )
+						);
+					}
+					?>
+				</label>
 				<?php
-				global $wgCookieExpiration;
-				$expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
-				echo Xml::checkLabel(
-					wfMessage( 'remembermypassword' )->numParams( $expirationDays )->text(),
-					'wpRemember',
-					'wpRemember',
-					$this->data['remember'],
-					array( 'tabindex' => '8' )
-				)
+				echo Html::input( 'wpPassword', null, 'password', array(
+					'class' => 'loginPassword',
+					'id' => 'wpPassword1',
+					'tabindex' => '2',
+					'size' => '20',
+					// Set focus to this field if username is filled in.
+					'autofocus' => (bool)$this->data['name'],
+					'placeholder' => $this->getMsg( 'userlogin-yourpassword-ph' )->text()
+				) );
 				?>
-			</td>
-		</tr>
-<?php } ?>
-<?php if( $this->data['cansecurelogin'] ) { ?>
-		<tr>
-			<td></td>
-			<td class="mw-input">
+			</div>
+
 			<?php
-			echo Xml::checkLabel(
-				wfMessage( 'securelogin-stick-https' )->text(),
-				'wpStickHTTPS',
-				'wpStickHTTPS',
-				$this->data['stickHTTPS'],
-				array( 'tabindex' => '9' )
-			);
-		?>
-			</td>
-		</tr>
-<?php } ?>
-		<tr>
-			<td></td>
-			<td class="mw-submit">
-				<?php
-		echo Html::input( 'wpLoginAttempt', wfMessage( 'login' )->text(), 'submit', array(
-			'id' => 'wpLoginAttempt',
-			'tabindex' => '9'
-		) );
-		if ( $this->data['useemail'] && $this->data['canreset'] ) {
-			if( $this->data['resetlink'] === true ) {
-				echo '&#160;';
-				echo Linker::link(
-					SpecialPage::getTitleFor( 'PasswordReset' ),
-					wfMessage( 'userlogin-resetlink' )
-				);
-			} elseif( $this->data['resetlink'] === null ) {
-				echo '&#160;';
-				echo Html::input(
-					'wpMailmypassword',
-					wfMessage( 'mailmypassword' )->text(),
-					'submit', array(
-						'id' => 'wpMailmypassword',
-						'tabindex' => '10'
-					)
-				);
+			if ( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
+				$doms = "";
+				foreach ( $this->data['domainnames'] as $dom ) {
+					$doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
+				}
+			?>
+				<div id="mw-user-domain-section">
+					<label for='wpDomain'><?php $this->msg( 'yourdomainname' ); ?></label>
+					<select name="wpDomain" value="<?php $this->text( 'domain' ); ?>" tabindex="3">
+						<?php echo $doms; ?>
+					</select>
+				</div>
+			<?php } ?>
+
+			<?php
+			if ( $this->haveData( 'extrafields' ) ) {
+				echo $this->data['extrafields'];
 			}
-		} ?>
+			?>
 
-			</td>
-		</tr>
-	</table>
-<?php if( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
-<?php if( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpLoginToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
-</form>
+			<div>
+				<?php if ( $this->data['canremember'] ) { ?>
+					<label class="mw-ui-checkbox-label">
+						<input name="wpRemember" type="checkbox" value="1" id="wpRemember" tabindex="4"
+							<?php if ( $this->data['remember'] ) {
+								echo 'checked="checked"';
+							} ?>
+						>
+						<?php echo $this->getMsg( 'userlogin-remembermypassword' )->numParams( $expirationDays )->escaped(); ?>
+					</label>
+				<?php } ?>
+			</div>
+
+			<div>
+				<?php
+				echo Html::input( 'wpLoginAttempt', $this->getMsg( 'login' )->text(), 'submit', array(
+					'id' => 'wpLoginAttempt',
+					'tabindex' => '6',
+					'class' => 'mw-ui-button mw-ui-big mw-ui-block mw-ui-primary'
+				) );
+				?>
+			</div>
+
+			<div id="mw-userlogin-help">
+				<?php echo $this->getMsg( 'userlogin-helplink' )->parse(); ?>
+			</div>
+			<?php if ( $this->haveData( 'createOrLoginHref' ) ) { ?>
+				<?php if ( $this->data['loggedin'] ) { ?>
+					<div id="mw-createaccount-another">
+						<h3 id="mw-userloginlink"><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"  class="mw-ui-button"><?php $this->msg( 'userlogin-createanother' ); ?></a></h3>
+					</div>
+				<?php } else { ?>
+					<div id="mw-createaccount-cta">
+						<h3 id="mw-userloginlink"><?php $this->msg( 'userlogin-noaccount' ); ?><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"  class="mw-ui-button mw-ui-constructive"><?php $this->msg( 'userlogin-joinproject' ); ?></a></h3>
+					</div>
+				<?php } ?>
+			<?php } ?>
+			<?php if ( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
+			<?php if ( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpLoginToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+			<?php if ( $this->data['cansecurelogin'] ) {?><input type="hidden" name="wpForceHttps" value="<?php $this->text( 'stickhttps' ); ?>" /><?php } ?>
+		</form>
+	</div>
 </div>
-<div id="loginend"><?php $this->html( 'loginend' ); ?></div>
 <?php
 
 	}
diff --git a/includes/tidy.conf b/includes/tidy.conf
index 6c947295..4c4daed5 100644
--- a/includes/tidy.conf
+++ b/includes/tidy.conf
@@ -18,5 +18,5 @@ fix-backslash: no
 fix-uri: no
 # Don't strip html5 elements we support
 # html-{meta,link} is a hack we use to prevent Tidy from stripping <meta> and <link> used in the body for Microdata
-new-empty-tags: html-meta, html-link
+new-empty-tags: html-meta, html-link, wbr
 new-inline-tags: video, audio, source, track, bdi, data, time, mark
diff --git a/includes/upload/UploadBase.php b/includes/upload/UploadBase.php
index e72669d4..2260241d 100644
--- a/includes/upload/UploadBase.php
+++ b/includes/upload/UploadBase.php
@@ -72,19 +72,20 @@ abstract class UploadBase {
 	 * @return string
 	 */
 	public function getVerificationErrorCode( $error ) {
-		$code_to_status = array(self::EMPTY_FILE => 'empty-file',
-								self::FILE_TOO_LARGE => 'file-too-large',
-								self::FILETYPE_MISSING => 'filetype-missing',
-								self::FILETYPE_BADTYPE => 'filetype-banned',
-								self::MIN_LENGTH_PARTNAME => 'filename-tooshort',
-								self::ILLEGAL_FILENAME => 'illegal-filename',
-								self::OVERWRITE_EXISTING_FILE => 'overwrite',
-								self::VERIFICATION_ERROR => 'verification-error',
-								self::HOOK_ABORTED => 'hookaborted',
-								self::WINDOWS_NONASCII_FILENAME => 'windows-nonascii-filename',
-								self::FILENAME_TOO_LONG => 'filename-toolong',
+		$code_to_status = array(
+			self::EMPTY_FILE => 'empty-file',
+			self::FILE_TOO_LARGE => 'file-too-large',
+			self::FILETYPE_MISSING => 'filetype-missing',
+			self::FILETYPE_BADTYPE => 'filetype-banned',
+			self::MIN_LENGTH_PARTNAME => 'filename-tooshort',
+			self::ILLEGAL_FILENAME => 'illegal-filename',
+			self::OVERWRITE_EXISTING_FILE => 'overwrite',
+			self::VERIFICATION_ERROR => 'verification-error',
+			self::HOOK_ABORTED => 'hookaborted',
+			self::WINDOWS_NONASCII_FILENAME => 'windows-nonascii-filename',
+			self::FILENAME_TOO_LONG => 'filename-toolong',
 		);
-		if( isset( $code_to_status[$error] ) ) {
+		if ( isset( $code_to_status[$error] ) ) {
 			return $code_to_status[$error];
 		}
 
@@ -137,7 +138,7 @@ abstract class UploadBase {
 	public static function createFromRequest( &$request, $type = null ) {
 		$type = $type ? $type : $request->getVal( 'wpSourceType', 'File' );
 
-		if( !$type ) {
+		if ( !$type ) {
 			return null;
 		}
 
@@ -150,18 +151,18 @@ abstract class UploadBase {
 		if ( is_null( $className ) ) {
 			$className = 'UploadFrom' . $type;
 			wfDebug( __METHOD__ . ": class name: $className\n" );
-			if( !in_array( $type, self::$uploadHandlers ) ) {
+			if ( !in_array( $type, self::$uploadHandlers ) ) {
 				return null;
 			}
 		}
 
 		// Check whether this upload class is enabled
-		if( !call_user_func( array( $className, 'isEnabled' ) ) ) {
+		if ( !call_user_func( array( $className, 'isEnabled' ) ) ) {
 			return null;
 		}
 
 		// Check whether the request is valid
-		if( !call_user_func( array( $className, 'isValidRequest' ), $request ) ) {
+		if ( !call_user_func( array( $className, 'isValidRequest' ), $request ) ) {
 			return null;
 		}
 
@@ -188,7 +189,9 @@ abstract class UploadBase {
 	 * @since 1.18
 	 * @return string
 	 */
-	public function getSourceType() { return null; }
+	public function getSourceType() {
+		return null;
+	}
 
 	/**
 	 * Initialize the path information
@@ -253,7 +256,7 @@ abstract class UploadBase {
 		wfProfileIn( __METHOD__ );
 		$repo = RepoGroup::singleton()->getLocalRepo();
 		if ( $repo->isVirtualUrl( $srcPath ) ) {
-			// @TODO: just make uploads work with storage paths
+			// @todo just make uploads work with storage paths
 			// UploadFromStash loads files via virtual URLs
 			$tmpFile = $repo->getLocalCopy( $srcPath );
 			$tmpFile->bind( $this ); // keep alive with $this
@@ -274,7 +277,7 @@ abstract class UploadBase {
 		/**
 		 * If there was no filename or a zero size given, give up quick.
 		 */
-		if( $this->isEmptyFile() ) {
+		if ( $this->isEmptyFile() ) {
 			wfProfileOut( __METHOD__ );
 			return array( 'status' => self::EMPTY_FILE );
 		}
@@ -283,7 +286,7 @@ abstract class UploadBase {
 		 * Honor $wgMaxUploadSize
 		 */
 		$maxSize = self::getMaxUploadSize( $this->getSourceType() );
-		if( $this->mFileSize > $maxSize ) {
+		if ( $this->mFileSize > $maxSize ) {
 			wfProfileOut( __METHOD__ );
 			return array(
 				'status' => self::FILE_TOO_LARGE,
@@ -297,7 +300,7 @@ abstract class UploadBase {
 		 * probably not accept it.
 		 */
 		$verification = $this->verifyFile();
-		if( $verification !== true ) {
+		if ( $verification !== true ) {
 			wfProfileOut( __METHOD__ );
 			return array(
 				'status' => self::VERIFICATION_ERROR,
@@ -309,13 +312,13 @@ abstract class UploadBase {
 		 * Make sure this file can be created
 		 */
 		$result = $this->validateName();
-		if( $result !== true ) {
+		if ( $result !== true ) {
 			wfProfileOut( __METHOD__ );
 			return $result;
 		}
 
 		$error = '';
-		if( !wfRunHooks( 'UploadVerification',
+		if ( !wfRunHooks( 'UploadVerification',
 			array( $this->mDestName, $this->mTempPath, &$error ) ) )
 		{
 			wfProfileOut( __METHOD__ );
@@ -332,11 +335,11 @@ abstract class UploadBase {
 	 * @return mixed true if valid, otherwise and array with 'status'
 	 * and other keys
 	 **/
-	protected function validateName() {
+	public function validateName() {
 		$nt = $this->getTitle();
-		if( is_null( $nt ) ) {
+		if ( is_null( $nt ) ) {
 			$result = array( 'status' => $this->mTitleError );
-			if( $this->mTitleError == self::ILLEGAL_FILENAME ) {
+			if ( $this->mTitleError == self::ILLEGAL_FILENAME ) {
 				$result['filtered'] = $this->mFilteredName;
 			}
 			if ( $this->mTitleError == self::FILETYPE_BADTYPE ) {
@@ -353,7 +356,7 @@ abstract class UploadBase {
 	}
 
 	/**
-	 * Verify the mime type
+	 * Verify the mime type.
 	 *
 	 * @note Only checks that it is not an evil mime. The does it have
 	 *  correct extension given its mime type check is in verifyFile.
@@ -364,7 +367,7 @@ abstract class UploadBase {
 		global $wgVerifyMimeType;
 		wfProfileIn( __METHOD__ );
 		if ( $wgVerifyMimeType ) {
-			wfDebug ( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n" );
+			wfDebug( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n" );
 			global $wgMimeTypeBlacklist;
 			if ( $this->checkFileExtension( $mime, $wgMimeTypeBlacklist ) ) {
 				wfProfileOut( __METHOD__ );
@@ -391,6 +394,7 @@ abstract class UploadBase {
 		return true;
 	}
 
+
 	/**
 	 * Verifies that it's ok to include the uploaded file
 	 *
@@ -417,6 +421,7 @@ abstract class UploadBase {
 			}
 		}
 
+
 		$handler = MediaHandler::getHandler( $mime );
 		if ( $handler ) {
 			$handlerStatus = $handler->verifyUpload( $this->mTempPath );
@@ -450,8 +455,7 @@ abstract class UploadBase {
 		global $wgAllowJavaUploads, $wgDisableUploadScriptChecks;
 		wfProfileIn( __METHOD__ );
 
-		# get the title, even though we are doing nothing with it, because
-		# we need to populate mFinalExtension
+		# getTitle() sets some internal parameters like $this->mFinalExtension
 		$this->getTitle();
 
 		$this->mFileProps = FSFile::getPropsFromPath( $this->mTempPath, $this->mFinalExtension );
@@ -466,12 +470,12 @@ abstract class UploadBase {
 
 		# check for htmlish code and javascript
 		if ( !$wgDisableUploadScriptChecks ) {
-			if( self::detectScript( $this->mTempPath, $mime, $this->mFinalExtension ) ) {
+			if ( self::detectScript( $this->mTempPath, $mime, $this->mFinalExtension ) ) {
 				wfProfileOut( __METHOD__ );
 				return array( 'uploadscripted' );
 			}
-			if( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
-				if( $this->detectScriptInSvg( $this->mTempPath ) ) {
+			if ( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
+				if ( $this->detectScriptInSvg( $this->mTempPath ) ) {
 					wfProfileOut( __METHOD__ );
 					return array( 'uploadscripted' );
 				}
@@ -560,7 +564,7 @@ abstract class UploadBase {
 		 * to modify it by uploading a new revision.
 		 */
 		$nt = $this->getTitle();
-		if( is_null( $nt ) ) {
+		if ( is_null( $nt ) ) {
 			return true;
 		}
 		$permErrors = $nt->getUserPermissionsErrors( 'edit', $user );
@@ -570,7 +574,7 @@ abstract class UploadBase {
 		} else {
 			$permErrorsCreate = array();
 		}
-		if( $permErrors || $permErrorsUpload || $permErrorsCreate ) {
+		if ( $permErrors || $permErrorsUpload || $permErrorsCreate ) {
 			$permErrors = array_merge( $permErrors, wfArrayDiff2( $permErrorsUpload, $permErrors ) );
 			$permErrors = array_merge( $permErrors, wfArrayDiff2( $permErrorsCreate, $permErrors ) );
 			return $permErrors;
@@ -607,16 +611,17 @@ abstract class UploadBase {
 		$comparableName = str_replace( ' ', '_', $this->mDesiredDestName );
 		$comparableName = Title::capitalize( $comparableName, NS_FILE );
 
-		if( $this->mDesiredDestName != $filename && $comparableName != $filename ) {
+		if ( $this->mDesiredDestName != $filename && $comparableName != $filename ) {
 			$warnings['badfilename'] = $filename;
 		}
 
 		// Check whether the file extension is on the unwanted list
 		global $wgCheckFileExtensions, $wgFileExtensions;
 		if ( $wgCheckFileExtensions ) {
-			if ( !$this->checkFileExtension( $this->mFinalExtension, $wgFileExtensions ) ) {
+			$extensions = array_unique( $wgFileExtensions );
+			if ( !$this->checkFileExtension( $this->mFinalExtension, $extensions ) ) {
 				$warnings['filetype-unwanted-type'] = array( $this->mFinalExtension,
-					$wgLang->commaList( $wgFileExtensions ), count( $wgFileExtensions ) );
+					$wgLang->commaList( $extensions ), count( $extensions ) );
 			}
 		}
 
@@ -630,7 +635,7 @@ abstract class UploadBase {
 		}
 
 		$exists = self::getExistsWarning( $localFile );
-		if( $exists !== false ) {
+		if ( $exists !== false ) {
 			$warnings['exists'] = $exists;
 		}
 
@@ -640,11 +645,11 @@ abstract class UploadBase {
 		$title = $this->getTitle();
 		// Remove all matches against self
 		foreach ( $dupes as $key => $dupe ) {
-			if( $title->equals( $dupe->getTitle() ) ) {
+			if ( $title->equals( $dupe->getTitle() ) ) {
 				unset( $dupes[$key] );
 			}
 		}
-		if( $dupes ) {
+		if ( $dupes ) {
 			$warnings['duplicate'] = $dupes;
 		}
 
@@ -682,9 +687,9 @@ abstract class UploadBase {
 			$user
 		);
 
-		if( $status->isGood() ) {
+		if ( $status->isGood() ) {
 			if ( $watch ) {
-				$user->addWatch( $this->getLocalFile()->getTitle() );
+				WatchAction::doWatch( $this->getLocalFile()->getTitle(), $user, WatchedItem::IGNORE_USER_RIGHTS );
 			}
 			wfRunHooks( 'UploadComplete', array( &$this ) );
 		}
@@ -703,7 +708,6 @@ abstract class UploadBase {
 		if ( $this->mTitle !== false ) {
 			return $this->mTitle;
 		}
-
 		/* Assume that if a user specified File:Something.jpg, this is an error
 		 * and that the namespace prefix needs to be stripped of.
 		 */
@@ -729,7 +733,7 @@ abstract class UploadBase {
 		$this->mFilteredName = wfStripIllegalFilenameChars( $this->mFilteredName );
 		/* Normalize to title form before we do any further processing */
 		$nt = Title::makeTitleSafe( NS_FILE, $this->mFilteredName );
-		if( is_null( $nt ) ) {
+		if ( is_null( $nt ) ) {
 			$this->mTitleError = self::ILLEGAL_FILENAME;
 			return $this->mTitle = null;
 		}
@@ -741,7 +745,7 @@ abstract class UploadBase {
 		 */
 		list( $partname, $ext ) = $this->splitExtensions( $this->mFilteredName );
 
-		if( count( $ext ) ) {
+		if ( count( $ext ) ) {
 			$this->mFinalExtension = trim( $ext[count( $ext ) - 1] );
 		} else {
 			$this->mFinalExtension = '';
@@ -789,13 +793,13 @@ abstract class UploadBase {
 
 		# If there was more than one "extension", reassemble the base
 		# filename to prevent bogus complaints about length
-		if( count( $ext ) > 1 ) {
-			for( $i = 0; $i < count( $ext ) - 1; $i++ ) {
+		if ( count( $ext ) > 1 ) {
+			for ( $i = 0; $i < count( $ext ) - 1; $i++ ) {
 				$partname .= '.' . $ext[$i];
 			}
 		}
 
-		if( strlen( $partname ) < 1 ) {
+		if ( strlen( $partname ) < 1 ) {
 			$this->mTitleError = self::MIN_LENGTH_PARTNAME;
 			return $this->mTitle = null;
 		}
@@ -809,7 +813,7 @@ abstract class UploadBase {
 	 * @return LocalFile|null
 	 */
 	public function getLocalFile() {
-		if( is_null( $this->mLocalFile ) ) {
+		if ( is_null( $this->mLocalFile ) ) {
 			$nt = $this->getTitle();
 			$this->mLocalFile = is_null( $nt ) ? null : wfLocalFile( $nt );
 		}
@@ -922,23 +926,29 @@ abstract class UploadBase {
 	public static function verifyExtension( $mime, $extension ) {
 		$magic = MimeMagic::singleton();
 
-		if ( !$mime || $mime == 'unknown' || $mime == 'unknown/unknown' )
+		if ( !$mime || $mime == 'unknown' || $mime == 'unknown/unknown' ) {
 			if ( !$magic->isRecognizableExtension( $extension ) ) {
 				wfDebug( __METHOD__ . ": passing file with unknown detected mime type; " .
 					"unrecognized extension '$extension', can't verify\n" );
 				return true;
 			} else {
-				wfDebug( __METHOD__ . ": rejecting file with unknown detected mime type; ".
+				wfDebug( __METHOD__ . ": rejecting file with unknown detected mime type; " .
 					"recognized extension '$extension', so probably invalid file\n" );
 				return false;
 			}
+		}
 
 		$match = $magic->isMatchingExtension( $extension, $mime );
 
 		if ( $match === null ) {
-			wfDebug( __METHOD__ . ": no file extension known for mime type $mime, passing file\n" );
-			return true;
-		} elseif( $match === true ) {
+			if ( $magic->getTypesForExtension( $extension ) !== null ) {
+				wfDebug( __METHOD__ . ": No extension known for $mime, but we know a mime for $extension\n" );
+				return false;
+			} else {
+				wfDebug( __METHOD__ . ": no file extension known for mime type $mime, passing file\n" );
+				return true;
+			}
+		} elseif ( $match === true ) {
 			wfDebug( __METHOD__ . ": mime type $mime matches extension $extension, passing file\n" );
 
 			#TODO: if it's a bitmap, make sure PHP or ImageMagic resp. can handle it!
@@ -968,7 +978,7 @@ abstract class UploadBase {
 		# ugly hack: for text files, always look at the entire file.
 		# For binary field, just check the first K.
 
-		if( strpos( $mime, 'text/' ) === 0 ) {
+		if ( strpos( $mime, 'text/' ) === 0 ) {
 			$chunk = file_get_contents( $file );
 		} else {
 			$fp = fopen( $file, 'rb' );
@@ -978,21 +988,21 @@ abstract class UploadBase {
 
 		$chunk = strtolower( $chunk );
 
-		if( !$chunk ) {
+		if ( !$chunk ) {
 			wfProfileOut( __METHOD__ );
 			return false;
 		}
 
 		# decode from UTF-16 if needed (could be used for obfuscation).
-		if( substr( $chunk, 0, 2 ) == "\xfe\xff" ) {
+		if ( substr( $chunk, 0, 2 ) == "\xfe\xff" ) {
 			$enc = 'UTF-16BE';
-		} elseif( substr( $chunk, 0, 2 ) == "\xff\xfe" ) {
+		} elseif ( substr( $chunk, 0, 2 ) == "\xff\xfe" ) {
 			$enc = 'UTF-16LE';
 		} else {
 			$enc = null;
 		}
 
-		if( $enc ) {
+		if ( $enc ) {
 			$chunk = iconv( $enc, "ASCII//IGNORE", $chunk );
 		}
 
@@ -1042,12 +1052,12 @@ abstract class UploadBase {
 			'<table'
 		);
 
-		if( !$wgAllowTitlesInSVG && $extension !== 'svg' && $mime !== 'image/svg' ) {
+		if ( !$wgAllowTitlesInSVG && $extension !== 'svg' && $mime !== 'image/svg' ) {
 			$tags[] = '<title';
 		}
 
-		foreach( $tags as $tag ) {
-			if( false !== strpos( $chunk, $tag ) ) {
+		foreach ( $tags as $tag ) {
+			if ( false !== strpos( $chunk, $tag ) ) {
 				wfDebug( __METHOD__ . ": found something that may make it be mistaken for html: $tag\n" );
 				wfProfileOut( __METHOD__ );
 				return true;
@@ -1062,21 +1072,21 @@ abstract class UploadBase {
 		$chunk = Sanitizer::decodeCharReferences( $chunk );
 
 		# look for script-types
-		if( preg_match( '!type\s*=\s*[\'"]?\s*(?:\w*/)?(?:ecma|java)!sim', $chunk ) ) {
+		if ( preg_match( '!type\s*=\s*[\'"]?\s*(?:\w*/)?(?:ecma|java)!sim', $chunk ) ) {
 			wfDebug( __METHOD__ . ": found script types\n" );
 			wfProfileOut( __METHOD__ );
 			return true;
 		}
 
 		# look for html-style script-urls
-		if( preg_match( '!(?:href|src|data)\s*=\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
+		if ( preg_match( '!(?:href|src|data)\s*=\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
 			wfDebug( __METHOD__ . ": found html-style script urls\n" );
 			wfProfileOut( __METHOD__ );
 			return true;
 		}
 
 		# look for css-style script-urls
-		if( preg_match( '!url\s*\(\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
+		if ( preg_match( '!url\s*\(\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
 			wfDebug( __METHOD__ . ": found css-style script urls\n" );
 			wfProfileOut( __METHOD__ );
 			return true;
@@ -1112,7 +1122,7 @@ abstract class UploadBase {
 			// bytes. There shouldn't be a legitimate reason for this to happen.
 			wfDebug( __METHOD__ . ": Unmatched XML declaration start\n" );
 			return true;
-		} elseif ( substr( $contents, 0, 4) == "\x4C\x6F\xA7\x94" ) {
+		} elseif ( substr( $contents, 0, 4 ) == "\x4C\x6F\xA7\x94" ) {
 			// EBCDIC encoded XML
 			wfDebug( __METHOD__ . ": EBCDIC Encoded XML\n" );
 			return true;
@@ -1164,77 +1174,77 @@ abstract class UploadBase {
 		/*
 		 * check for elements that can contain javascript
 		 */
-		if( $strippedElement == 'script' ) {
+		if ( $strippedElement == 'script' ) {
 			wfDebug( __METHOD__ . ": Found script element '$element' in uploaded file.\n" );
 			return true;
 		}
 
 		# e.g., <svg xmlns="http://www.w3.org/2000/svg"> <handler xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="load">alert(1)</handler> </svg>
-		if( $strippedElement == 'handler' ) {
+		if ( $strippedElement == 'handler' ) {
 			wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
 			return true;
 		}
 
 		# SVG reported in Feb '12 that used xml:stylesheet to generate javascript block
-		if( $strippedElement == 'stylesheet' ) {
+		if ( $strippedElement == 'stylesheet' ) {
 			wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
 			return true;
 		}
 
-		foreach( $attribs as $attrib => $value ) {
+		foreach ( $attribs as $attrib => $value ) {
 			$stripped = $this->stripXmlNamespace( $attrib );
 			$value = strtolower( $value );
 
-			if( substr( $stripped, 0, 2 ) == 'on' ) {
+			if ( substr( $stripped, 0, 2 ) == 'on' ) {
 				wfDebug( __METHOD__ . ": Found event-handler attribute '$attrib'='$value' in uploaded file.\n" );
 				return true;
 			}
 
 			# href with javascript target
-			if( $stripped == 'href' && strpos( strtolower( $value ), 'javascript:' ) !== false ) {
+			if ( $stripped == 'href' && strpos( strtolower( $value ), 'javascript:' ) !== false ) {
 				wfDebug( __METHOD__ . ": Found script in href attribute '$attrib'='$value' in uploaded file.\n" );
 				return true;
 			}
 
 			# href with embedded svg as target
-			if( $stripped == 'href' && preg_match( '!data:[^,]*image/svg[^,]*,!sim', $value ) ) {
+			if ( $stripped == 'href' && preg_match( '!data:[^,]*image/svg[^,]*,!sim', $value ) ) {
 				wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
 				return true;
 			}
 
 			# href with embedded (text/xml) svg as target
-			if( $stripped == 'href' && preg_match( '!data:[^,]*text/xml[^,]*,!sim', $value ) ) {
+			if ( $stripped == 'href' && preg_match( '!data:[^,]*text/xml[^,]*,!sim', $value ) ) {
 				wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
 				return true;
 			}
 
 			# use set/animate to add event-handler attribute to parent
-			if( ( $strippedElement == 'set' || $strippedElement == 'animate' ) && $stripped == 'attributename' && substr( $value, 0, 2 ) == 'on' ) {
+			if ( ( $strippedElement == 'set' || $strippedElement == 'animate' ) && $stripped == 'attributename' && substr( $value, 0, 2 ) == 'on' ) {
 				wfDebug( __METHOD__ . ": Found svg setting event-handler attribute with \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
 				return true;
 			}
 
 			# use set to add href attribute to parent element
-			if( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
+			if ( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
 				wfDebug( __METHOD__ . ": Found svg setting href attribute '$value' in uploaded file.\n" );
 				return true;
 			}
 
 			# use set to add a remote / data / script target to an element
-			if( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+			if ( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
 				wfDebug( __METHOD__ . ": Found svg setting attribute to '$value' in uploaded file.\n" );
 				return true;
 			}
 
 			# use handler attribute with remote / data / script
-			if( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+			if ( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
 				wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script '$attrib'='$value' in uploaded file.\n" );
 				return true;
 			}
 
 			# use CSS styles to bring in remote code
 			# catch url("http:..., url('http:..., url(http:..., but not url("#..., url('#..., url(#....
-			if( $stripped == 'style' && preg_match_all( '!((?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim', $value, $matches ) ) {
+			if ( $stripped == 'style' && preg_match_all( '!((?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim', $value, $matches ) ) {
 				foreach ( $matches[1] as $match ) {
 					if ( !preg_match( '!(?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
 						wfDebug( __METHOD__ . ": Found svg setting a style with remote url '$attrib'='$value' in uploaded file.\n" );
@@ -1244,7 +1254,7 @@ abstract class UploadBase {
 			}
 
 			# image filters can pull in url, which could be svg that executes scripts
-			if( $strippedElement == 'image' && $stripped == 'filter' && preg_match( '!url\s*\(!sim', $value ) ) {
+			if ( $strippedElement == 'image' && $stripped == 'filter' && preg_match( '!url\s*\(!sim', $value ) ) {
 				wfDebug( __METHOD__ . ": Found image filter with url: \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
 				return true;
 			}
@@ -1314,7 +1324,7 @@ abstract class UploadBase {
 		# NOTE: there's a 50 line workaround to make stderr redirection work on windows, too.
 		#      that does not seem to be worth the pain.
 		#      Ask me (Duesentrieb) about it if it's ever needed.
-		$output = wfShellExec( "$command 2>&1", $exitCode );
+		$output = wfShellExecWithStderr( $command, $exitCode );
 
 		# map exit code to AV_xxx constants.
 		$mappedCode = $exitCode;
@@ -1374,8 +1384,8 @@ abstract class UploadBase {
 	private function checkOverwrite( $user ) {
 		// First check whether the local file can be overwritten
 		$file = $this->getLocalFile();
-		if( $file->exists() ) {
-			if( !self::userCanReUpload( $user, $file ) ) {
+		if ( $file->exists() ) {
+			if ( !self::userCanReUpload( $user, $file ) ) {
 				return array( 'fileexists-forbidden', $file->getName() );
 			} else {
 				return true;
@@ -1401,13 +1411,13 @@ abstract class UploadBase {
 	 * @return Boolean
 	 */
 	public static function userCanReUpload( User $user, $img ) {
-		if( $user->isAllowed( 'reupload' ) ) {
+		if ( $user->isAllowed( 'reupload' ) ) {
 			return true; // non-conditional
 		}
-		if( !$user->isAllowed( 'reupload-own' ) ) {
+		if ( !$user->isAllowed( 'reupload-own' ) ) {
 			return false;
 		}
-		if( is_string( $img ) ) {
+		if ( is_string( $img ) ) {
 			$img = wfLocalFile( $img );
 		}
 		if ( !( $img instanceof LocalFile ) ) {
@@ -1429,11 +1439,11 @@ abstract class UploadBase {
 	 * @return mixed False if the file does not exists, else an array
 	 */
 	public static function getExistsWarning( $file ) {
-		if( $file->exists() ) {
+		if ( $file->exists() ) {
 			return array( 'warning' => 'exists', 'file' => $file );
 		}
 
-		if( $file->getTitle()->getArticleID() ) {
+		if ( $file->getTitle()->getArticleID() ) {
 			return array( 'warning' => 'page-exists', 'file' => $file );
 		}
 
@@ -1441,7 +1451,7 @@ abstract class UploadBase {
 			return array( 'warning' => 'was-deleted', 'file' => $file );
 		}
 
-		if( strpos( $file->getName(), '.' ) == false ) {
+		if ( strpos( $file->getName(), '.' ) == false ) {
 			$partname = $file->getName();
 			$extension = '';
 		} else {
@@ -1460,7 +1470,7 @@ abstract class UploadBase {
 			$nt_lc = Title::makeTitle( NS_FILE, "{$partname}.{$normalizedExtension}" );
 			$file_lc = wfLocalFile( $nt_lc );
 
-			if( $file_lc->exists() ) {
+			if ( $file_lc->exists() ) {
 				return array(
 					'warning' => 'exists-normalized',
 					'file' => $file,
@@ -1484,7 +1494,7 @@ abstract class UploadBase {
 			# Check for filenames like 50px- or 180px-, these are mostly thumbnails
 			$nt_thb = Title::newFromText( substr( $partname, strpos( $partname, '-' ) + 1 ) . '.' . $extension, NS_FILE );
 			$file_thb = wfLocalFile( $nt_thb );
-			if( $file_thb->exists() ) {
+			if ( $file_thb->exists() ) {
 				return array(
 					'warning' => 'thumb',
 					'file' => $file,
@@ -1500,7 +1510,7 @@ abstract class UploadBase {
 			}
 		}
 
-		foreach( self::getFilenamePrefixBlacklist() as $prefix ) {
+		foreach ( self::getFilenamePrefixBlacklist() as $prefix ) {
 			if ( substr( $partname, 0, strlen( $prefix ) ) == $prefix ) {
 				return array(
 					'warning' => 'bad-prefix',
@@ -1536,9 +1546,9 @@ abstract class UploadBase {
 	public static function getFilenamePrefixBlacklist() {
 		$blacklist = array();
 		$message = wfMessage( 'filename-prefix-blacklist' )->inContentLanguage();
-		if( !$message->isDisabled() ) {
+		if ( !$message->isDisabled() ) {
 			$lines = explode( "\n", $message->plain() );
-			foreach( $lines as $line ) {
+			foreach ( $lines as $line ) {
 				// Remove comment lines
 				$comment = substr( trim( $line ), 0, 1 );
 				if ( $comment == '#' || $comment == '' ) {
@@ -1547,7 +1557,7 @@ abstract class UploadBase {
 				// Remove additional comments after a prefix
 				$comment = strpos( $line, '#' );
 				if ( $comment > 0 ) {
-					$line = substr( $line, 0, $comment-1 );
+					$line = substr( $line, 0, $comment - 1 );
 				}
 				$blacklist[] = trim( $line );
 			}
diff --git a/includes/upload/UploadFromChunks.php b/includes/upload/UploadFromChunks.php
index 4b331e98..2e0b9444 100644
--- a/includes/upload/UploadFromChunks.php
+++ b/includes/upload/UploadFromChunks.php
@@ -31,7 +31,7 @@ class UploadFromChunks extends UploadFromFile {
 	protected $mOffset, $mChunkIndex, $mFileKey, $mVirtualTempPath;
 
 	/**
-	 * Setup local pointers to stash, repo and user ( similar to UploadFromStash )
+	 * Setup local pointers to stash, repo and user (similar to UploadFromStash)
 	 *
 	 * @param $user User
 	 * @param $stash UploadStash
@@ -41,16 +41,16 @@ class UploadFromChunks extends UploadFromFile {
 		// user object. sometimes this won't exist, as when running from cron.
 		$this->user = $user;
 
-		if( $repo ) {
+		if ( $repo ) {
 			$this->repo = $repo;
 		} else {
 			$this->repo = RepoGroup::singleton()->getLocalRepo();
 		}
 
-		if( $stash ) {
+		if ( $stash ) {
 			$this->stash = $stash;
 		} else {
-			if( $user ) {
+			if ( $user ) {
 				wfDebug( __METHOD__ . " creating new UploadFromChunks instance for " . $user->getId() . "\n" );
 			} else {
 				wfDebug( __METHOD__ . " creating new UploadFromChunks instance with no user\n" );
@@ -74,7 +74,7 @@ class UploadFromChunks extends UploadFromFile {
 		$this->verifyChunk();
 		// Create a local stash target
 		$this->mLocalFile = parent::stashFile();
-		// Update the initial file offset ( based on file size )
+		// Update the initial file offset (based on file size)
 		$this->mOffset = $this->mLocalFile->getSize();
 		$this->mFileKey = $this->mLocalFile->getFileKey();
 
@@ -114,7 +114,7 @@ class UploadFromChunks extends UploadFromFile {
 		// Concatenate all the chunks to mVirtualTempPath
 		$fileList = Array();
 		// The first chunk is stored at the mVirtualTempPath path so we start on "chunk 1"
-		for( $i = 0; $i <= $this->getChunkIndex(); $i++ ) {
+		for ( $i = 0; $i <= $this->getChunkIndex(); $i++ ) {
 			$fileList[] = $this->getVirtualChunkLocation( $i );
 		}
 
@@ -129,7 +129,7 @@ class UploadFromChunks extends UploadFromFile {
 		$tStart = microtime( true );
 		$status = $this->repo->concatenate( $fileList, $tmpPath, FileRepo::DELETE_SOURCE );
 		$tAmount = microtime( true ) - $tStart;
-		if( !$status->isOk() ) {
+		if ( !$status->isOk() ) {
 			return $status;
 		}
 		wfDebugLog( 'fileconcatenate', "Combined $i chunks in $tAmount seconds.\n" );
@@ -144,7 +144,7 @@ class UploadFromChunks extends UploadFromFile {
 		}
 
 		// Update the mTempPath and mLocalFile
-		// ( for FileUpload or normal Stash to take over )
+		// (for FileUpload or normal Stash to take over)
 		$tStart = microtime( true );
 		$this->mLocalFile = parent::stashFile( $this->user );
 		$tAmount = microtime( true ) - $tStart;
@@ -193,7 +193,7 @@ class UploadFromChunks extends UploadFromFile {
 		// Get the offset before we add the chunk to the file system
 		$preAppendOffset = $this->getOffset();
 
-		if ( $preAppendOffset + $chunkSize > $this->getMaxUploadSize()) {
+		if ( $preAppendOffset + $chunkSize > $this->getMaxUploadSize() ) {
 			$status = Status::newFatal( 'file-too-large' );
 		} else {
 			// Make sure the client is uploading the correct chunk with a matching offset.
@@ -210,7 +210,7 @@ class UploadFromChunks extends UploadFromFile {
 					return Status::newFatal( $e->getMessage() );
 				}
 				$status = $this->outputChunk( $chunkPath );
-				if( $status->isGood() ) {
+				if ( $status->isGood() ) {
 					// Update local offset:
 					$this->mOffset = $preAppendOffset + $chunkSize;
 					// Update chunk table status db
@@ -277,7 +277,7 @@ class UploadFromChunks extends UploadFromFile {
 	 * @return Integer index of the current chunk
 	 */
 	private function getChunkIndex() {
-		if( $this->mChunkIndex !== null ) {
+		if ( $this->mChunkIndex !== null ) {
 			return $this->mChunkIndex;
 		}
 		return 0;
@@ -327,7 +327,7 @@ class UploadFromChunks extends UploadFromFile {
 	}
 
 	private function getChunkFileKey( $index = null ) {
-		if( $index === null ) {
+		if ( $index === null ) {
 			$index = $this->getChunkIndex();
 		}
 		return $this->mFileKey . '.' . $index;
@@ -346,7 +346,7 @@ class UploadFromChunks extends UploadFromFile {
 		$res = $this->verifyPartialFile();
 		$this->mDesiredDestName = $oldDesiredDestName;
 		$this->mTitle = false;
-		if( is_array( $res ) ) {
+		if ( is_array( $res ) ) {
 			throw new UploadChunkVerificationException( $res[0] );
 		}
 	}
diff --git a/includes/upload/UploadFromFile.php b/includes/upload/UploadFromFile.php
index ab2a7a39..a00ed327 100644
--- a/includes/upload/UploadFromFile.php
+++ b/includes/upload/UploadFromFile.php
@@ -40,7 +40,7 @@ class UploadFromFile extends UploadBase {
 	function initializeFromRequest( &$request ) {
 		$upload = $request->getUpload( 'wpUploadFile' );
 		$desiredDestName = $request->getText( 'wpDestFile' );
-		if( !$desiredDestName ) {
+		if ( !$desiredDestName ) {
 			$desiredDestName = $upload->getName();
 		}
 
diff --git a/includes/upload/UploadFromStash.php b/includes/upload/UploadFromStash.php
index c82103cb..cb85fc63 100644
--- a/includes/upload/UploadFromStash.php
+++ b/includes/upload/UploadFromStash.php
@@ -45,16 +45,16 @@ class UploadFromStash extends UploadBase {
 		// user object. sometimes this won't exist, as when running from cron.
 		$this->user = $user;
 
-		if( $repo ) {
+		if ( $repo ) {
 			$this->repo = $repo;
 		} else {
 			$this->repo = RepoGroup::singleton()->getLocalRepo();
 		}
 
-		if( $stash ) {
+		if ( $stash ) {
 			$this->stash = $stash;
 		} else {
-			if( $user ) {
+			if ( $user ) {
 				wfDebug( __METHOD__ . " creating new UploadStash instance for " . $user->getId() . "\n" );
 			} else {
 				wfDebug( __METHOD__ . " creating new UploadStash instance with no user\n" );
diff --git a/includes/upload/UploadFromUrl.php b/includes/upload/UploadFromUrl.php
index 70b69034..0201d5f4 100644
--- a/includes/upload/UploadFromUrl.php
+++ b/includes/upload/UploadFromUrl.php
@@ -34,6 +34,8 @@ class UploadFromUrl extends UploadBase {
 
 	protected $mTempPath, $mTmpHandle;
 
+	protected static $allowedUrls = array();
+
 	/**
 	 * Checks if the user is allowed to use the upload-by-URL feature. If the
 	 * user is not allowed, return the name of the user right as a string. If
@@ -77,7 +79,7 @@ class UploadFromUrl extends UploadBase {
 			return false;
 		}
 		$valid = false;
-		foreach( $wgCopyUploadsDomains as $domain ) {
+		foreach ( $wgCopyUploadsDomains as $domain ) {
 			// See if the domain for the upload matches this whitelisted domain
 			$whitelistedDomainPieces = explode( '.', $domain );
 			$uploadDomainPieces = explode( '.', $parsedUrl['host'] );
@@ -104,6 +106,21 @@ class UploadFromUrl extends UploadBase {
 		return $valid;
 	}
 
+	/**
+	 * Checks whether the URL is not allowed.
+	 *
+	 * @param $url string
+	 * @return bool
+	 */
+	public static function isAllowedUrl( $url ) {
+		if ( !isset( self::$allowedUrls[$url] ) ) {
+			$allowed = true;
+			wfRunHooks( 'IsUploadAllowedFromUrl', array( $url, &$allowed ) );
+			self::$allowedUrls[$url] = $allowed;
+		}
+		return self::$allowedUrls[$url];
+	}
+
 	/**
 	 * Entry point for API upload
 	 *
@@ -160,21 +177,30 @@ class UploadFromUrl extends UploadBase {
 	/**
 	 * @return string
 	 */
-	public function getSourceType() { return 'url'; }
+	public function getSourceType() {
+		return 'url';
+	}
 
 	/**
+	 * Download the file (if not async)
+	 *
+	 * @param Array $httpOptions Array of options for MWHttpRequest. Ignored if async.
+	 *   This could be used to override the timeout on the http request.
 	 * @return Status
 	 */
-	public function fetchFile() {
+	public function fetchFile( $httpOptions = array() ) {
 		if ( !Http::isValidURI( $this->mUrl ) ) {
 			return Status::newFatal( 'http-invalid-url' );
 		}
 
-		if( !self::isAllowedHost( $this->mUrl ) ) {
+		if ( !self::isAllowedHost( $this->mUrl ) ) {
 			return Status::newFatal( 'upload-copy-upload-invalid-domain' );
 		}
+		if ( !self::isAllowedUrl( $this->mUrl ) ) {
+			return Status::newFatal( 'upload-copy-upload-invalid-url' );
+		}
 		if ( !$this->mAsync ) {
-			return $this->reallyFetchFile();
+			return $this->reallyFetchFile( $httpOptions );
 		}
 		return Status::newGood();
 	}
@@ -211,9 +237,12 @@ class UploadFromUrl extends UploadBase {
 	/**
 	 * Download the file, save it to the temporary file and update the file
 	 * size and set $mRemoveTempFile to true.
+	 *
+	 * @param Array $httpOptions Array of options for MWHttpRequest
 	 * @return Status
 	 */
-	protected function reallyFetchFile() {
+	protected function reallyFetchFile( $httpOptions = array() ) {
+		global $wgCopyUploadProxy, $wgCopyUploadTimeout;
 		if ( $this->mTempPath === false ) {
 			return Status::newFatal( 'tmp-create-error' );
 		}
@@ -227,13 +256,15 @@ class UploadFromUrl extends UploadBase {
 		$this->mRemoveTempFile = true;
 		$this->mFileSize = 0;
 
-		$options = array(
-			'followRedirects' => true
+		$options = $httpOptions + array(
+			'followRedirects' => true,
 		);
-		global $wgCopyUploadProxy;
 		if ( $wgCopyUploadProxy !== false ) {
 			$options['proxy'] = $wgCopyUploadProxy;
 		}
+		if ( $wgCopyUploadTimeout && !isset( $options['timeout'] ) ) {
+			$options['timeout'] = $wgCopyUploadTimeout;
+		}
 		$req = MWHttpRequest::factory( $this->mUrl, $options );
 		$req->setCallback( array( $this, 'saveTempFileChunk' ) );
 		$status = $req->execute();
diff --git a/includes/upload/UploadStash.php b/includes/upload/UploadStash.php
index 089bd8b7..7db6c64b 100644
--- a/includes/upload/UploadStash.php
+++ b/includes/upload/UploadStash.php
@@ -158,7 +158,7 @@ class UploadStash {
 	 * @param string $key key under which file information is stored
 	 * @return Array
 	 */
-	public function getMetadata ( $key ) {
+	public function getMetadata( $key ) {
 		$this->getFile( $key );
 		return $this->fileMetadata[$key];
 	}
@@ -169,7 +169,7 @@ class UploadStash {
 	 * @param string $key key under which file information is stored
 	 * @return Array
 	 */
-	public function getFileProps ( $key ) {
+	public function getFileProps( $key ) {
 		$this->getFile( $key );
 		return $this->fileProps[$key];
 	}
@@ -209,7 +209,7 @@ class UploadStash {
 		list( $usec, $sec ) = explode( ' ', microtime() );
 		$usec = substr( $usec, 2 );
 		$key = wfBaseConvert( $sec . $usec, 10, 36 ) . '.' .
-			wfBaseConvert( mt_rand(), 10, 36 ) . '.'.
+			wfBaseConvert( mt_rand(), 10, 36 ) . '.' .
 			$this->userId . '.' .
 			$extension;
 
@@ -338,7 +338,7 @@ class UploadStash {
 			__METHOD__
 		);
 
-		if( !$row ) {
+		if ( !$row ) {
 			throw new UploadStashNoSuchKeyException( "No such key ($key), cannot remove" );
 		}
 
@@ -358,7 +358,7 @@ class UploadStash {
 		wfDebug( __METHOD__ . " clearing row $key\n" );
 
 		// Ensure we have the UploadStashFile loaded for this key
-		$this->getFile( $key );
+		$this->getFile( $key, true );
 
 		$dbw = $this->repo->getMasterDb();
 
@@ -463,7 +463,7 @@ class UploadStash {
 	protected function fetchFileMetadata( $key, $readFromDB = DB_SLAVE ) {
 		// populate $fileMetadata[$key]
 		$dbr = null;
-		if( $readFromDB === DB_MASTER ) {
+		if ( $readFromDB === DB_MASTER ) {
 			// sometimes reading from the master is necessary, if there's replication lag.
 			$dbr = $this->repo->getMasterDb();
 		} else {
@@ -675,11 +675,12 @@ class UploadStashFile extends UnregisteredLocalFile {
 
 }
 
-class UploadStashNotAvailableException extends MWException {};
-class UploadStashFileNotFoundException extends MWException {};
-class UploadStashBadPathException extends MWException {};
-class UploadStashFileException extends MWException {};
-class UploadStashZeroLengthFileException extends MWException {};
-class UploadStashNotLoggedInException extends MWException {};
-class UploadStashWrongOwnerException extends MWException {};
-class UploadStashNoSuchKeyException extends MWException {};
+class UploadStashException extends MWException {};
+class UploadStashNotAvailableException extends UploadStashException {};
+class UploadStashFileNotFoundException extends UploadStashException {};
+class UploadStashBadPathException extends UploadStashException {};
+class UploadStashFileException extends UploadStashException {};
+class UploadStashZeroLengthFileException extends UploadStashException {};
+class UploadStashNotLoggedInException extends UploadStashException {};
+class UploadStashWrongOwnerException extends UploadStashException {};
+class UploadStashNoSuchKeyException extends UploadStashException {};
diff --git a/index.php b/index.php
index 0e9676da..b18fb806 100644
--- a/index.php
+++ b/index.php
@@ -8,16 +8,10 @@
  * See the README, INSTALL, and UPGRADE files for basic setup instructions
  * and pointers to the online documentation.
  *
- * http://www.mediawiki.org/
+ * https://www.mediawiki.org/
  *
  * ----------
  *
- * Copyright (C) 2001-2011 Magnus Manske, Brion Vibber, Lee Daniel Crocker,
- * Tim Starling, Erik Möller, Gabriel Wicke, Ævar Arnfjörð Bjarmason,
- * Niklas Laxström, Domas Mituzas, Rob Church, Yuri Astrakhan, Aryeh Gregor,
- * Aaron Schulz, Andrew Garrett, Raimond Spekking, Alexandre Emsenhuber
- * Siebrand Mazeland, Chad Horohoe, Roan Kattouw and others.
- *
  * 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 2 of the License, or
@@ -42,18 +36,14 @@
 # 5.1, respectively.
 if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
 	// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
-	require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
+	require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
 	wfPHPVersionError( 'index.php' );
 }
 
 # Initialise common code.  This gives us access to GlobalFunctions, the
 # AutoLoader, and the globals $wgRequest, $wgOut, $wgUser, $wgLang and
 # $wgContLang, amongst others; it does *not* load $wgTitle
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-	require ( 'phase3/includes/WebStart.php' );
-} else {
-	require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
 
 $mediaWiki = new MediaWiki();
 $mediaWiki->run();
diff --git a/languages/Language.php b/languages/Language.php
index 1d2e7164..c24dc180 100644
--- a/languages/Language.php
+++ b/languages/Language.php
@@ -30,10 +30,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 	exit( 1 );
 }
 
-# Read language names
-global $wgLanguageNames;
-require_once( __DIR__ . '/Names.php' );
-
 if ( function_exists( 'mb_strtoupper' ) ) {
 	mb_internal_encoding( 'UTF-8' );
 }
@@ -44,18 +40,19 @@ if ( function_exists( 'mb_strtoupper' ) ) {
  * @ingroup Language
  */
 class FakeConverter {
-
 	/**
 	 * @var Language
 	 */
 	public $mLang;
 	function __construct( $langobj ) { $this->mLang = $langobj; }
+	function autoConvert( $text, $variant = false ) { return $text; }
 	function autoConvertToAllVariants( $text ) { return array( $this->mLang->getCode() => $text ); }
 	function convert( $t ) { return $t; }
 	function convertTo( $text, $variant ) { return $text; }
 	function convertTitle( $t ) { return $t->getPrefixedText(); }
 	function convertNamespace( $ns ) { return $this->mLang->getFormattedNsText( $ns ); }
 	function getVariants() { return array( $this->mLang->getCode() ); }
+	function getVariantFallbacks( $variant ) { return $this->mLang->getCode(); }
 	function getPreferredVariant() { return $this->mLang->getCode(); }
 	function getDefaultVariant() { return $this->mLang->getCode(); }
 	function getURLVariant() { return ''; }
@@ -66,7 +63,10 @@ class FakeConverter {
 	function markNoConversion( $text, $noParse = false ) { return $text; }
 	function convertCategoryKey( $key ) { return $key; }
 	function convertLinkToAllVariants( $text ) { return $this->autoConvertToAllVariants( $text ); }
+	/** @deprecated since 1.22 is no longer used */
 	function armourMath( $text ) { return $text; }
+	function validateVariant( $variant = null ) { return $variant === $this->mLang->getCode() ? $variant : null; }
+	function translate( $text, $variant ) { return $text; }
 }
 
 /**
@@ -82,7 +82,7 @@ class Language {
 
 	public $mVariants, $mCode, $mLoaded = false;
 	public $mMagicExtensions = array(), $mMagicHookDone = false;
-	private $mHtmlCode = null;
+	private $mHtmlCode = null, $mParentLanguage = false;
 
 	public $dateFormatStrings = array();
 	public $mExtendedSpecialPageAliases;
@@ -171,6 +171,14 @@ class Language {
 		'seconds' => 1,
 	);
 
+	/**
+	 * Cache for language fallbacks.
+	 * @see Language::getFallbacksIncludingSiteLanguage
+	 * @since 1.21
+	 * @var array
+	 */
+	static private $fallbackLanguageCache = array();
+
 	/**
 	 * Get a cached or new language object for a given language code
 	 * @param $code String
@@ -221,7 +229,7 @@ class Language {
 		// Check if there is a language class for the code
 		$class = self::classFromCode( $code );
 		self::preloadLanguageClass( $class );
-		if ( MWInit::classExists( $class ) ) {
+		if ( class_exists( $class ) ) {
 			$lang = new $class;
 			return $lang;
 		}
@@ -235,7 +243,7 @@ class Language {
 
 			$class = self::classFromCode( $fallbackCode );
 			self::preloadLanguageClass( $class );
-			if ( MWInit::classExists( $class ) ) {
+			if ( class_exists( $class ) ) {
 				$lang = Language::newFromCode( $fallbackCode );
 				$lang->setCode( $code );
 				return $lang;
@@ -276,7 +284,7 @@ class Language {
 		$alpha = '[a-z]';
 		$digit = '[0-9]';
 		$alphanum = '[a-z0-9]';
-		$x = 'x' ; # private use singleton
+		$x = 'x'; # private use singleton
 		$singleton = '[a-wy-z]'; # other singleton
 		$s = $lenient ? '[-_]' : '-';
 
@@ -327,13 +335,19 @@ class Language {
 	 * @return bool
 	 */
 	public static function isValidCode( $code ) {
-		return
-			// People think language codes are html safe, so enforce it.
-			// Ideally we should only allow a-zA-Z0-9-
-			// but, .+ and other chars are often used for {{int:}} hacks
-			// see bugs 37564, 37587, 36938
+		static $cache = array();
+		if ( isset( $cache[$code] ) ) {
+			return $cache[$code];
+		}
+		// People think language codes are html safe, so enforce it.
+		// Ideally we should only allow a-zA-Z0-9-
+		// but, .+ and other chars are often used for {{int:}} hacks
+		// see bugs 37564, 37587, 36938
+		$cache[$code] =
 			strcspn( $code, ":/\\\000&<>'\"" ) === strlen( $code )
 			&& !preg_match( Title::getTitleInvalidRegex(), $code );
+
+		return $cache[$code];
 	}
 
 	/**
@@ -349,16 +363,16 @@ class Language {
 	public static function isValidBuiltInCode( $code ) {
 
 		if ( !is_string( $code ) ) {
-			$type = gettype( $code );
-			if ( $type === 'object' ) {
+			if ( is_object( $code ) ) {
 				$addmsg = " of class " . get_class( $code );
 			} else {
 				$addmsg = '';
 			}
+			$type = gettype( $code );
 			throw new MWException( __METHOD__ . " must be passed a string, $type given$addmsg" );
 		}
 
-		return (bool)preg_match( '/^[a-z0-9-]+$/i', $code );
+		return (bool)preg_match( '/^[a-z0-9-]{2,}$/i', $code );
 	}
 
 	/**
@@ -372,8 +386,15 @@ class Language {
 	public static function isKnownLanguageTag( $tag ) {
 		static $coreLanguageNames;
 
+		// Quick escape for invalid input to avoid exceptions down the line
+		// when code tries to process tags which are not valid at all.
+		if ( !self::isValidBuiltInCode( $tag ) ) {
+			return false;
+		}
+
 		if ( $coreLanguageNames === null ) {
-			include( MWInit::compiledPath( 'languages/Names.php' ) );
+			global $IP;
+			include "$IP/languages/Names.php";
 		}
 
 		if ( isset( $coreLanguageNames[$tag] )
@@ -409,10 +430,8 @@ class Language {
 			return;
 		}
 
-		if ( !defined( 'MW_COMPILED' ) ) {
-			if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
-				include_once( "$IP/languages/classes/$class.php" );
-			}
+		if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
+			include_once "$IP/languages/classes/$class.php";
 		}
 	}
 
@@ -483,6 +502,9 @@ class Language {
 	}
 
 	/**
+	 * Returns an array of localised namespaces indexed by their numbers. If the namespace is not
+	 * available in localised form, it will be included in English.
+	 *
 	 * @return array
 	 */
 	public function getNamespaces() {
@@ -662,7 +684,18 @@ class Language {
 				}
 			}
 
-			$this->namespaceAliases = $aliases;
+			# Also add converted namespace names as aliases, to avoid confusion.
+			$convertedNames = array();
+			foreach ( $this->getVariants() as $variant ) {
+				if ( $variant === $this->mCode ) {
+					continue;
+				}
+				foreach ( $this->getNamespaces() as $ns => $_ ) {
+					$convertedNames[$this->getConverter()->convertNamespace( $ns, $variant )] = $ns;
+				}
+			}
+
+			$this->namespaceAliases = $aliases + $convertedNames;
 		}
 		return $this->namespaceAliases;
 	}
@@ -743,20 +776,6 @@ class Language {
 		return $this->getNsText( NS_SPECIAL ) . ':' . $name;
 	}
 
-	/**
-	 * @return array
-	 */
-	function getQuickbarSettings() {
-		return array(
-			$this->getMessage( 'qbsettings-none' ),
-			$this->getMessage( 'qbsettings-fixedleft' ),
-			$this->getMessage( 'qbsettings-fixedright' ),
-			$this->getMessage( 'qbsettings-floatingleft' ),
-			$this->getMessage( 'qbsettings-floatingright' ),
-			$this->getMessage( 'qbsettings-directionality' )
-		);
-	}
-
 	/**
 	 * @return array
 	 */
@@ -857,7 +876,8 @@ class Language {
 		static $coreLanguageNames;
 
 		if ( $coreLanguageNames === null ) {
-			include( MWInit::compiledPath( 'languages/Names.php' ) );
+			global $IP;
+			include "$IP/languages/Names.php";
 		}
 
 		$names = array();
@@ -1033,8 +1053,8 @@ class Language {
 	 * internationalisation, a reduced set of format characters, and a better
 	 * escaping format.
 	 *
-	 * Supported format characters are dDjlNwzWFmMntLoYyaAgGhHiscrU. See the
-	 * PHP manual for definitions. There are a number of extensions, which
+	 * Supported format characters are dDjlNwzWFmMntLoYyaAgGhHiscrUeIOPTZ. See
+	 * the PHP manual for definitions. There are a number of extensions, which
 	 * start with "x":
 	 *
 	 *    xn   Do not translate digits of the next numeric format character
@@ -1080,22 +1100,25 @@ class Language {
 	 * Backslash escaping is also supported.
 	 *
 	 * Input timestamp is assumed to be pre-normalized to the desired local
-	 * time zone, if any.
+	 * time zone, if any. Note that the format characters crUeIOPTZ will assume
+	 * $ts is UTC if $zone is not given.
 	 *
 	 * @param $format String
 	 * @param $ts String: 14-character timestamp
 	 *      YYYYMMDDHHMMSS
 	 *      01234567890123
+	 * @param $zone DateTimeZone: Timezone of $ts
 	 * @todo handling of "o" format character for Iranian, Hebrew, Hijri & Thai?
 	 *
+	 * @throws MWException
 	 * @return string
 	 */
-	function sprintfDate( $format, $ts ) {
+	function sprintfDate( $format, $ts, DateTimeZone $zone = null ) {
 		$s = '';
 		$raw = false;
 		$roman = false;
 		$hebrewNum = false;
-		$unix = false;
+		$dateTimeObj = false;
 		$rawToggle = false;
 		$iranian = false;
 		$hebrew = false;
@@ -1103,6 +1126,15 @@ class Language {
 		$thai = false;
 		$minguo = false;
 		$tenno = false;
+
+		if ( strlen( $ts ) !== 14 ) {
+			throw new MWException( __METHOD__ . ": The timestamp $ts should have 14 characters" );
+		}
+
+		if ( !ctype_digit( $ts ) ) {
+			throw new MWException( __METHOD__ . ": The timestamp $ts should be a number" );
+		}
+
 		for ( $p = 0; $p < strlen( $format ); $p++ ) {
 			$num = false;
 			$code = $format[$p];
@@ -1134,15 +1166,21 @@ class Language {
 					$s .= $this->getMonthNameGen( substr( $ts, 4, 2 ) );
 					break;
 				case 'xjx':
-					if ( !$hebrew ) $hebrew = self::tsToHebrew( $ts );
+					if ( !$hebrew ) {
+						$hebrew = self::tsToHebrew( $ts );
+					}
 					$s .= $this->getHebrewCalendarMonthNameGen( $hebrew[1] );
 					break;
 				case 'd':
 					$num = substr( $ts, 6, 2 );
 					break;
 				case 'D':
-					if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
-					$s .= $this->getWeekdayAbbreviation( gmdate( 'w', $unix ) + 1 );
+					if ( !$dateTimeObj ) {
+						$dateTimeObj = DateTime::createFromFormat(
+							'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+						);
+					}
+					$s .= $this->getWeekdayAbbreviation( $dateTimeObj->format( 'w' ) + 1 );
 					break;
 				case 'j':
 					$num = intval( substr( $ts, 6, 2 ) );
@@ -1166,35 +1204,12 @@ class Language {
 					$num = $hebrew[2];
 					break;
 				case 'l':
-					if ( !$unix ) {
-						$unix = wfTimestamp( TS_UNIX, $ts );
-					}
-					$s .= $this->getWeekdayName( gmdate( 'w', $unix ) + 1 );
-					break;
-				case 'N':
-					if ( !$unix ) {
-						$unix = wfTimestamp( TS_UNIX, $ts );
+					if ( !$dateTimeObj ) {
+						$dateTimeObj = DateTime::createFromFormat(
+							'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+						);
 					}
-					$w = gmdate( 'w', $unix );
-					$num = $w ? $w : 7;
-					break;
-				case 'w':
-					if ( !$unix ) {
-						$unix = wfTimestamp( TS_UNIX, $ts );
-					}
-					$num = gmdate( 'w', $unix );
-					break;
-				case 'z':
-					if ( !$unix ) {
-						$unix = wfTimestamp( TS_UNIX, $ts );
-					}
-					$num = gmdate( 'z', $unix );
-					break;
-				case 'W':
-					if ( !$unix ) {
-						$unix = wfTimestamp( TS_UNIX, $ts );
-					}
-					$num = gmdate( 'W', $unix );
+					$s .= $this->getWeekdayName( $dateTimeObj->format( 'w' ) + 1 );
 					break;
 				case 'F':
 					$s .= $this->getMonthName( substr( $ts, 4, 2 ) );
@@ -1244,30 +1259,12 @@ class Language {
 					}
 					$num = $hebrew[1];
 					break;
-				case 't':
-					if ( !$unix ) {
-						$unix = wfTimestamp( TS_UNIX, $ts );
-					}
-					$num = gmdate( 't', $unix );
-					break;
 				case 'xjt':
 					if ( !$hebrew ) {
 						$hebrew = self::tsToHebrew( $ts );
 					}
 					$num = $hebrew[3];
 					break;
-				case 'L':
-					if ( !$unix ) {
-						$unix = wfTimestamp( TS_UNIX, $ts );
-					}
-					$num = gmdate( 'L', $unix );
-					break;
-				case 'o':
-					if ( !$unix ) {
-						$unix = wfTimestamp( TS_UNIX, $ts );
-					}
-					$num = gmdate( 'o', $unix );
-					break;
 				case 'Y':
 					$num = substr( $ts, 0, 4 );
 					break;
@@ -1343,22 +1340,36 @@ class Language {
 					$num = substr( $ts, 12, 2 );
 					break;
 				case 'c':
-					if ( !$unix ) {
-						$unix = wfTimestamp( TS_UNIX, $ts );
-					}
-					$s .= gmdate( 'c', $unix );
-					break;
 				case 'r':
-					if ( !$unix ) {
-						$unix = wfTimestamp( TS_UNIX, $ts );
+				case 'e':
+				case 'O':
+				case 'P':
+				case 'T':
+					// Pass through string from $dateTimeObj->format()
+					if ( !$dateTimeObj ) {
+						$dateTimeObj = DateTime::createFromFormat(
+							'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+						);
 					}
-					$s .= gmdate( 'r', $unix );
+					$s .= $dateTimeObj->format( $code );
 					break;
+				case 'w':
+				case 'N':
+				case 'z':
+				case 'W':
+				case 't':
+				case 'L':
+				case 'o':
 				case 'U':
-					if ( !$unix ) {
-						$unix = wfTimestamp( TS_UNIX, $ts );
+				case 'I':
+				case 'Z':
+					// Pass through number from $dateTimeObj->format()
+					if ( !$dateTimeObj ) {
+						$dateTimeObj = DateTime::createFromFormat(
+							'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+						);
 					}
-					$num = $unix;
+					$num = $dateTimeObj->format( $code );
 					break;
 				case '\\':
 					# Backslash escaping
@@ -1673,7 +1684,7 @@ class Language {
 	private static function hebrewYearStart( $year ) {
 		$a = intval( ( 12 * ( $year - 1 ) + 17 ) % 19 );
 		$b = intval( ( $year - 1 ) % 4 );
-		$m = 32.044093161144 + 1.5542417966212 * $a +  $b / 4.0 - 0.0031777940220923 * ( $year - 1 );
+		$m = 32.044093161144 + 1.5542417966212 * $a + $b / 4.0 - 0.0031777940220923 * ( $year - 1 );
 		if ( $m < 0 ) {
 			$m--;
 		}
@@ -1847,13 +1858,13 @@ class Language {
 		}
 		if ( strlen( $s ) == 2 ) {
 			$str = $s . "'";
-		} else  {
+		} else {
 			$str = substr( $s, 0, strlen( $s ) - 2 ) . '"';
 			$str .= substr( $s, strlen( $s ) - 2, 2 );
 		}
 		$start = substr( $str, 0, strlen( $str ) - 2 );
 		$end = substr( $str, strlen( $str ) - 2 );
-		switch( $end ) {
+		switch ( $end ) {
 			case 'כ':
 				$str = $start . 'ך';
 				break;
@@ -1936,12 +1947,12 @@ class Language {
 		# will normalize out-of-range values so we don't have to split $minDiff
 		# into hours and minutes.
 		$t = mktime( (
-		  (int)substr( $ts, 8, 2 ) ), # Hours
-		  (int)substr( $ts, 10, 2 ) + $minDiff, # Minutes
-		  (int)substr( $ts, 12, 2 ), # Seconds
-		  (int)substr( $ts, 4, 2 ), # Month
-		  (int)substr( $ts, 6, 2 ), # Day
-		  (int)substr( $ts, 0, 4 ) ); # Year
+			(int)substr( $ts, 8, 2 ) ), # Hours
+			(int)substr( $ts, 10, 2 ) + $minDiff, # Minutes
+			(int)substr( $ts, 12, 2 ), # Seconds
+			(int)substr( $ts, 4, 2 ), # Month
+			(int)substr( $ts, 6, 2 ), # Day
+			(int)substr( $ts, 0, 4 ) ); # Year
 
 		$date = date( 'YmdHis', $t );
 		wfRestoreWarnings();
@@ -1992,6 +2003,8 @@ class Language {
 	 * @param $type string May be date, time or both
 	 * @param $pref string The format name as it appears in Messages*.php
 	 *
+	 * @since 1.22 New type 'pretty' that provides a more readable timestamp format
+	 *
 	 * @return string
 	 */
 	function getDateFormatString( $type, $pref ) {
@@ -2001,7 +2014,12 @@ class Language {
 				$df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
 			} else {
 				$df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
-				if ( is_null( $df ) ) {
+
+				if ( $type === 'pretty' && $df === null ) {
+					$df = $this->getDateFormatString( 'date', $pref );
+				}
+
+				if ( $df === null ) {
 					$pref = $this->getDefaultDateFormat();
 					$df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
 				}
@@ -2085,6 +2103,8 @@ class Language {
 		$segments = array();
 
 		foreach ( $intervals as $intervalName => $intervalValue ) {
+			// Messages: duration-seconds, duration-minutes, duration-hours, duration-days, duration-weeks,
+			// duration-years, duration-decades, duration-centuries, duration-millennia
 			$message = wfMessage( 'duration-' . $intervalName )->numParams( $intervalValue );
 			$segments[] = $message->inLanguage( $this )->escaped();
 		}
@@ -2234,6 +2254,81 @@ class Language {
 		return $this->internalUserTimeAndDate( 'both', $ts, $user, $options );
 	}
 
+	/**
+	 * Convert an MWTimestamp into a pretty human-readable timestamp using
+	 * the given user preferences and relative base time.
+	 *
+	 * DO NOT USE THIS FUNCTION DIRECTLY. Instead, call MWTimestamp::getHumanTimestamp
+	 * on your timestamp object, which will then call this function. Calling
+	 * this function directly will cause hooks to be skipped over.
+	 *
+	 * @see MWTimestamp::getHumanTimestamp
+	 * @param MWTimestamp $ts Timestamp to prettify
+	 * @param MWTimestamp $relativeTo Base timestamp
+	 * @param User $user User preferences to use
+	 * @return string Human timestamp
+	 * @since 1.22
+	 */
+	public function getHumanTimestamp( MWTimestamp $ts, MWTimestamp $relativeTo, User $user ) {
+		$diff = $ts->diff( $relativeTo );
+		$diffDay = (bool)( (int)$ts->timestamp->format( 'w' ) - (int)$relativeTo->timestamp->format( 'w' ) );
+		$days = $diff->days ?: (int)$diffDay;
+		if ( $diff->invert || $days > 5 && $ts->timestamp->format( 'Y' ) !== $relativeTo->timestamp->format( 'Y' ) ) {
+			// Timestamps are in different years: use full timestamp
+			// Also do full timestamp for future dates
+			/**
+			 * @FIXME Add better handling of future timestamps.
+			 */
+			$format = $this->getDateFormatString( 'both', $user->getDatePreference() ?: 'default' );
+			$ts = $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) );
+		} elseif ( $days > 5 ) {
+			// Timestamps are in same year,  but more than 5 days ago: show day and month only.
+			$format = $this->getDateFormatString( 'pretty', $user->getDatePreference() ?: 'default' );
+			$ts = $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) );
+		} elseif ( $days > 1 ) {
+			// Timestamp within the past week: show the day of the week and time
+			$format = $this->getDateFormatString( 'time', $user->getDatePreference() ?: 'default' );
+			$weekday = self::$mWeekdayMsgs[$ts->timestamp->format( 'w' )];
+			// Messages:
+			// sunday-at, monday-at, tuesday-at, wednesday-at, thursday-at, friday-at, saturday-at
+			$ts = wfMessage( "$weekday-at" )
+				->inLanguage( $this )
+				->params( $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) ) )
+				->text();
+		} elseif ( $days == 1 ) {
+			// Timestamp was yesterday: say 'yesterday' and the time.
+			$format = $this->getDateFormatString( 'time', $user->getDatePreference() ?: 'default' );
+			$ts = wfMessage( 'yesterday-at' )
+				->inLanguage( $this )
+				->params( $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) ) )
+				->text();
+		} elseif ( $diff->h > 1 || $diff->h == 1 && $diff->i > 30 ) {
+			// Timestamp was today, but more than 90 minutes ago: say 'today' and the time.
+			$format = $this->getDateFormatString( 'time', $user->getDatePreference() ?: 'default' );
+			$ts = wfMessage( 'today-at' )
+				->inLanguage( $this )
+				->params( $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) ) )
+				->text();
+
+		// From here on in, the timestamp was soon enough ago so that we can simply say
+		// XX units ago, e.g., "2 hours ago" or "5 minutes ago"
+		} elseif ( $diff->h == 1 ) {
+			// Less than 90 minutes, but more than an hour ago.
+			$ts = wfMessage( 'hours-ago' )->inLanguage( $this )->numParams( 1 )->text();
+		} elseif ( $diff->i >= 1 ) {
+			// A few minutes ago.
+			$ts = wfMessage( 'minutes-ago' )->inLanguage( $this )->numParams( $diff->i )->text();
+		} elseif ( $diff->s >= 30 ) {
+			// Less than a minute, but more than 30 sec ago.
+			$ts = wfMessage( 'seconds-ago' )->inLanguage( $this )->numParams( $diff->s )->text();
+		} else {
+			// Less than 30 seconds ago.
+			$ts = wfMessage( 'just-now' )->text();
+		}
+
+		return $ts;
+	}
+
 	/**
 	 * @param $key string
 	 * @return array|null
@@ -2523,7 +2618,7 @@ class Language {
 	 */
 	function checkTitleEncoding( $s ) {
 		if ( is_array( $s ) ) {
-			wfDebugDieBacktrace( 'Given array to checkTitleEncoding.' );
+			throw new MWException( 'Given array to checkTitleEncoding.' );
 		}
 		if ( StringUtils::isUtf8( $s ) ) {
 			return $s;
@@ -2817,7 +2912,9 @@ class Language {
 	 * @since 1.20
 	 */
 	function getDirMarkEntity( $opposite = false ) {
-		if ( $opposite ) { return $this->isRTL() ? '&lrm;' : '&rlm;'; }
+		if ( $opposite ) {
+			return $this->isRTL() ? '&lrm;' : '&rlm;';
+		}
 		return $this->isRTL() ? '&rlm;' : '&lrm;';
 	}
 
@@ -2834,7 +2931,9 @@ class Language {
 	function getDirMark( $opposite = false ) {
 		$lrm = "\xE2\x80\x8E"; # LEFT-TO-RIGHT MARK, commonly abbreviated LRM
 		$rlm = "\xE2\x80\x8F"; # RIGHT-TO-LEFT MARK, commonly abbreviated RLM
-		if ( $opposite ) { return $this->isRTL() ? $lrm : $rlm; }
+		if ( $opposite ) {
+			return $this->isRTL() ? $lrm : $rlm;
+		}
 		return $this->isRTL() ? $rlm : $lrm;
 	}
 
@@ -2878,12 +2977,16 @@ class Language {
 	}
 
 	/**
+	 * Get all magic words from cache.
 	 * @return array
 	 */
 	function getMagicWords() {
 		return self::$dataCache->getItem( $this->mCode, 'magicWords' );
 	}
 
+	/**
+	 * Run the LanguageGetMagic hook once.
+	 */
 	protected function doMagicHook() {
 		if ( $this->mMagicHookDone ) {
 			return;
@@ -2900,17 +3003,16 @@ class Language {
 	 * @param $mw
 	 */
 	function getMagic( $mw ) {
-		$this->doMagicHook();
+		// Saves a function call
+		if ( ! $this->mMagicHookDone ) {
+			$this->doMagicHook();
+		}
 
 		if ( isset( $this->mMagicExtensions[$mw->mId] ) ) {
 			$rawEntry = $this->mMagicExtensions[$mw->mId];
 		} else {
-			$magicWords = $this->getMagicWords();
-			if ( isset( $magicWords[$mw->mId] ) ) {
-				$rawEntry = $magicWords[$mw->mId];
-			} else {
-				$rawEntry = false;
-			}
+			$rawEntry = self::$dataCache->getSubitem(
+				$this->mCode, 'magicWords', $mw->mId );
 		}
 
 		if ( !is_array( $rawEntry ) ) {
@@ -2967,7 +3069,7 @@ class Language {
 	 * Normally we output all numbers in plain en_US style, that is
 	 * 293,291.235 for twohundredninetythreethousand-twohundredninetyone
 	 * point twohundredthirtyfive. However this is not suitable for all
-	 * languages, some such as Pakaran want ੨੯੩,੨੯੫.੨੩੫ and others such as
+	 * languages, some such as Punjabi want ੨੯੩,੨੯੫.੨੩੫ and others such as
 	 * Icelandic just want to use commas instead of dots, and dots instead
 	 * of commas like "293.291,235".
 	 *
@@ -3058,7 +3160,7 @@ class Language {
 			$sign = "";
 			if ( intval( $number ) < 0 ) {
 				// For negative numbers apply the algorithm like positive number and add sign.
-				$sign =  "-";
+				$sign = "-";
 				$number = substr( $number, 1 );
 			}
 			$integerPart = array();
@@ -3066,20 +3168,20 @@ class Language {
 			$numMatches = preg_match_all( "/(#+)/", $digitGroupingPattern, $matches );
 			preg_match( "/\d+/", $number, $integerPart );
 			preg_match( "/\.\d*/", $number, $decimalPart );
-			$groupedNumber = ( count( $decimalPart ) > 0 ) ? $decimalPart[0]:"";
-			if ( $groupedNumber  === $number ) {
+			$groupedNumber = ( count( $decimalPart ) > 0 ) ? $decimalPart[0] : "";
+			if ( $groupedNumber === $number ) {
 				// the string does not have any number part. Eg: .12345
 				return $sign . $groupedNumber;
 			}
 			$start = $end = strlen( $integerPart[0] );
 			while ( $start > 0 ) {
-				$match = $matches[0][$numMatches -1] ;
+				$match = $matches[0][$numMatches - 1];
 				$matchLen = strlen( $match );
 				$start = $end - $matchLen;
 				if ( $start < 0 ) {
 					$start = 0;
 				}
-				$groupedNumber = substr( $number, $start, $end -$start ) . $groupedNumber ;
+				$groupedNumber = substr( $number, $start, $end -$start ) . $groupedNumber;
 				$end = $start;
 				if ( $numMatches > 1 ) {
 					// use the last pattern for the rest of the number
@@ -3256,9 +3358,9 @@ class Language {
 				# We got the first byte only of a multibyte char; remove it.
 				$string = substr( $string, 0, -1 );
 			} elseif ( $char >= 0x80 &&
-				  preg_match( '/^(.*)(?:[\xe0-\xef][\x80-\xbf]|' .
-							  '[\xf0-\xf7][\x80-\xbf]{1,2})$/', $string, $m ) )
-			{
+				preg_match( '/^(.*)(?:[\xe0-\xef][\x80-\xbf]|' .
+					'[\xf0-\xf7][\x80-\xbf]{1,2})$/', $string, $m )
+			) {
 				# We chopped in the middle of a character; remove it
 				$string = $m[1];
 			}
@@ -3342,7 +3444,9 @@ class Language {
 					break;
 				}
 			}
-			if ( $pos >= $textLen ) break; // extra iteration just for above checks
+			if ( $pos >= $textLen ) {
+				break; // extra iteration just for above checks
+			}
 
 			# Read the next char...
 			$ch = $text[$pos];
@@ -3475,7 +3579,7 @@ class Language {
 	function getGrammarForms() {
 		global $wgGrammarForms;
 		if ( isset( $wgGrammarForms[$this->getCode()] ) && is_array( $wgGrammarForms[$this->getCode()] ) ) {
-			 return $wgGrammarForms[$this->getCode()];
+			return $wgGrammarForms[$this->getCode()];
 		}
 		return array();
 	}
@@ -3528,23 +3632,23 @@ class Language {
 	 * @return string Correct form of plural for $count in this language
 	 */
 	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) {
-			return '';
-		}
-
 		// Handle explicit n=pluralform cases
 		foreach ( $forms as $index => $form ) {
-			if ( preg_match( '/\d+=/i', $form ) ) {
+			if ( preg_match( '/^\d+=/i', $form ) ) {
 				$pos = strpos( $form, '=' );
-				if ( substr( $form, 0, $pos ) === (string) $count ) {
+				if ( substr( $form, 0, $pos ) === (string)$count ) {
 					return substr( $form, $pos + 1 );
 				}
 				unset( $forms[$index] );
 			}
 		}
+
 		$forms = array_values( $forms );
+		if ( !count( $forms ) ) {
+			return '';
+		}
 
-		$pluralForm = $this->getPluralForm( $count );
+		$pluralForm = $this->getPluralRuleIndexNumber( $count );
 		$pluralForm = min( $pluralForm, count( $forms ) - 1 );
 		return $forms[$pluralForm];
 	}
@@ -3708,6 +3812,7 @@ class Language {
 	 *
 	 * @param $text string
 	 * @return string
+	 * @deprecated since 1.22 is no longer used
 	 */
 	public function armourMath( $text ) {
 		return $this->mConverter->armourMath( $text );
@@ -3853,6 +3958,34 @@ class Language {
 		return $this;
 	}
 
+	/**
+	 * Get the "parent" language which has a converter to convert a "compatible" language
+	 * (in another variant) to this language (eg. zh for zh-cn, but not en for en-gb).
+	 *
+	 * @return Language|null
+	 * @since 1.22
+	 */
+	public function getParentLanguage() {
+		if ( $this->mParentLanguage !== false ) {
+			return $this->mParentLanguage;
+		}
+
+		$pieces = explode( '-', $this->getCode() );
+		$code = $pieces[0];
+		if ( !in_array( $code, LanguageConverter::$languagesWithVariants ) ) {
+			$this->mParentLanguage = null;
+			return null;
+		}
+		$lang = Language::factory( $code );
+		if ( !$lang->hasVariant( $this->getCode() ) ) {
+			$this->mParentLanguage = null;
+			return null;
+		}
+
+		$this->mParentLanguage = $lang;
+		return $lang;
+	}
+
 	/**
 	 * Get the RFC 3066 code for this language object
 	 *
@@ -3887,8 +4020,9 @@ class Language {
 	 */
 	public function setCode( $code ) {
 		$this->mCode = $code;
-		// Ensure we don't leave an incorrect html code lying around
+		// Ensure we don't leave incorrect cached data lying around
 		$this->mHtmlCode = null;
+		$this->mParentLanguage = false;
 	}
 
 	/**
@@ -3984,6 +4118,36 @@ class Language {
 		}
 	}
 
+	/**
+	 * Get the ordered list of fallback languages, ending with the fallback
+	 * language chain for the site language.
+	 *
+	 * @since 1.22
+	 * @param string $code Language code
+	 * @return array array( fallbacks, site fallbacks )
+	 */
+	public static function getFallbacksIncludingSiteLanguage( $code ) {
+		global $wgLanguageCode;
+
+		// Usually, we will only store a tiny number of fallback chains, so we
+		// keep them in static memory.
+		$cacheKey = "{$code}-{$wgLanguageCode}";
+
+		if ( !array_key_exists( $cacheKey, self::$fallbackLanguageCache ) ) {
+			$fallbacks = self::getFallbacksFor( $code );
+
+			// Append the site's fallback chain, including the site language itself
+			$siteFallbacks = self::getFallbacksFor( $wgLanguageCode );
+			array_unshift( $siteFallbacks, $wgLanguageCode );
+
+			// Eliminate any languages already included in the chain
+			$siteFallbacks = array_diff( $siteFallbacks, $fallbacks );
+
+			self::$fallbackLanguageCache[$cacheKey] = array( $fallbacks, $siteFallbacks );
+		}
+		return self::$fallbackLanguageCache[$cacheKey];
+	}
+
 	/**
 	 * Get all messages for a given language
 	 * WARNING: this may take a long time. If you just need all message *keys*
@@ -4084,15 +4248,14 @@ class Language {
 	 * @since 1.18
 	 */
 	public function formatExpiry( $expiry, $format = true ) {
-		static $infinity, $infinityMsg;
+		static $infinity;
 		if ( $infinity === null ) {
-			$infinityMsg = wfMessage( 'infiniteblock' );
 			$infinity = wfGetDB( DB_SLAVE )->getInfinity();
 		}
 
 		if ( $expiry == '' || $expiry == $infinity ) {
 			return $format === true
-				? $infinityMsg
+				? $this->getMessageFromDB( 'infiniteblock' )
 				: $infinity;
 		} else {
 			return $format === true
@@ -4307,7 +4470,7 @@ class Language {
 			$nlink = htmlspecialchars( $next );
 		} else {
 			$nlink = $this->numLink( $title, $offset + $limit, $limit,
-				$query, $next, 'prevn-title', 'mw-nextlink' );
+				$query, $next, 'nextn-title', 'mw-nextlink' );
 		}
 
 		# Make links to set number of items per page
@@ -4371,7 +4534,7 @@ class Language {
 	/**
 	 * Get the plural rules for the language
 	 * @since 1.20
-	 * @return array Associative array with plural form, and plural rule as key-value pairs
+	 * @return array Associative array with plural form number and plural rule as key-value pairs
 	 */
 	public function getPluralRules() {
 		$pluralRules = self::$dataCache->getItem( strtolower( $this->mCode ), 'pluralRules' );
@@ -4388,13 +4551,48 @@ class Language {
 	}
 
 	/**
-	 * Find the plural form matching to the given number
-	 * It return the form index.
-	 * @return int The index of the plural form
+	 * Get the plural rule types for the language
+	 * @since 1.22
+	 * @return array Associative array with plural form number and plural rule type as key-value pairs
 	 */
-	private function getPluralForm( $number ) {
+	public function getPluralRuleTypes() {
+		$pluralRuleTypes = self::$dataCache->getItem( strtolower( $this->mCode ), 'pluralRuleTypes' );
+		$fallbacks = Language::getFallbacksFor( $this->mCode );
+		if ( !$pluralRuleTypes ) {
+			foreach ( $fallbacks as $fallbackCode ) {
+				$pluralRuleTypes = self::$dataCache->getItem( strtolower( $fallbackCode ), 'pluralRuleTypes' );
+				if ( $pluralRuleTypes ) {
+					break;
+				}
+			}
+		}
+		return $pluralRuleTypes;
+	}
+
+	/**
+	 * Find the index number of the plural rule appropriate for the given number
+	 * @return int The index number of the plural rule
+	 */
+	public function getPluralRuleIndexNumber( $number ) {
 		$pluralRules = $this->getCompiledPluralRules();
 		$form = CLDRPluralRuleEvaluator::evaluateCompiled( $number, $pluralRules );
 		return $form;
 	}
+
+	/**
+	 * Find the plural rule type appropriate for the given number
+	 * For example, if the language is set to Arabic, getPluralType(5) should
+	 * return 'few'.
+	 * @since 1.22
+	 * @return string The name of the plural rule type, e.g. one, two, few, many
+	 */
+	public function getPluralRuleType( $number ) {
+		$index = $this->getPluralRuleIndexNumber( $number );
+		$pluralRuleTypes = $this->getPluralRuleTypes();
+		if ( isset( $pluralRuleTypes[$index] ) ) {
+			return $pluralRuleTypes[$index];
+		} else {
+			return 'other';
+		}
+	}
 }
diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php
index 43afe653..96a71a09 100644
--- a/languages/LanguageConverter.php
+++ b/languages/LanguageConverter.php
@@ -246,7 +246,7 @@ class LanguageConverter {
 	 * @return Mixed: variant if one found, false otherwise.
 	 */
 	protected function getUserVariant() {
-		global $wgUser;
+		global $wgUser, $wgContLang;
 
 		// memoizing this function wreaks havoc on parserTest.php
 		/*
@@ -258,8 +258,12 @@ class LanguageConverter {
 		// Get language variant preference from logged in users
 		// Don't call this on stub objects because that causes infinite
 		// recursion during initialisation
-		if ( $wgUser->isLoggedIn() )  {
-			$ret = $wgUser->getOption( 'variant' );
+		if ( $wgUser->isLoggedIn() ) {
+			if ( $this->mMainLanguageCode == $wgContLang->getCode() ) {
+				$ret = $wgUser->getOption( 'variant' );
+			} else {
+				$ret = $wgUser->getOption( 'variant-' . $this->mMainLanguageCode );
+			}
 		} else {
 			// figure out user lang without constructing wgLang to avoid
 			// infinite recursion
@@ -344,7 +348,7 @@ class LanguageConverter {
 			}
 		}
 
-		if( $this->guessVariant( $text, $toVariant ) ) {
+		if ( $this->guessVariant( $text, $toVariant ) ) {
 			wfProfileOut( __METHOD__ );
 			return $text;
 		}
@@ -364,11 +368,11 @@ class LanguageConverter {
 		// this one is needed when the text is inside an HTML markup
 		$htmlfix = '|<[^>]+$|^[^<>]*>';
 
-		// disable convert to variants between <code></code> tags
+		// disable convert to variants between <code> tags
 		$codefix = '<code>.+?<\/code>|';
-		// disable convertsion of <script type="text/javascript"> ... </script>
+		// disable conversion of <script> tags
 		$scriptfix = '<script.*?>.*?<\/script>|';
-		// disable conversion of <pre xxxx> ... </pre>
+		// disable conversion of <pre> tags
 		$prefix = '<pre.*?>.*?<\/pre>|';
 
 		$reg = '/' . $codefix . $scriptfix . $prefix .
@@ -551,7 +555,7 @@ class LanguageConverter {
 		$variant = $this->getPreferredVariant();
 		$index = $title->getNamespace();
 		if ( $index !== NS_MAIN ) {
-			$text = $this->convertNamespace( $index ) . ':';
+			$text = $this->convertNamespace( $index, $variant ) . ':';
 		} else {
 			$text = '';
 		}
@@ -563,10 +567,13 @@ class LanguageConverter {
 	 * Get the namespace display name in the preferred variant.
 	 *
 	 * @param $index int namespace id
+	 * @param $variant string|null variant code or null for preferred variant
 	 * @return String: namespace name for display
 	 */
-	public function convertNamespace( $index ) {
-		$variant = $this->getPreferredVariant();
+	public function convertNamespace( $index, $variant = null ) {
+		if ( $variant === null ) {
+			$variant = $this->getPreferredVariant();
+		}
 		if ( $index === NS_MAIN ) {
 			return '';
 		} else {
@@ -644,14 +651,14 @@ class LanguageConverter {
 			if ( $pos === false ) {
 				// No more markup, append final segment
 				$fragment = substr( $text, $startPos );
-				$out .= $shouldConvert? $this->autoConvert( $fragment, $variant ): $fragment;
+				$out .= $shouldConvert ? $this->autoConvert( $fragment, $variant ) : $fragment;
 				return $out;
 			}
 
 			// Markup found
 			// Append initial segment
 			$fragment = substr( $text, $startPos, $pos - $startPos );
-			$out .= $shouldConvert? $this->autoConvert( $fragment, $variant ): $fragment;
+			$out .= $shouldConvert ? $this->autoConvert( $fragment, $variant ) : $fragment;
 
 			// Advance position
 			$startPos = $pos;
@@ -687,7 +694,7 @@ class LanguageConverter {
 
 		while ( $startPos < $length ) {
 			$m = false;
-			preg_match( '/-\{|\}-/', $text, $m,  PREG_OFFSET_CAPTURE, $startPos );
+			preg_match( '/-\{|\}-/', $text, $m, PREG_OFFSET_CAPTURE, $startPos );
 			if ( !$m ) {
 				// Unclosed rule
 				break;
@@ -833,7 +840,7 @@ class LanguageConverter {
 	 * @author Nikola Smolenski <smolensk@eunet.rs>
 	 * @since 1.19
 	 */
-	public function guessVariant($text, $variant) {
+	public function guessVariant( $text, $variant ) {
 		return false;
 	}
 
@@ -941,7 +948,7 @@ class LanguageConverter {
 		$parsed[$key] = true;
 
 		if ( $subpage === '' ) {
-			$txt = MessageCache::singleton()->get( 'conversiontable', true, $code );
+			$txt = MessageCache::singleton()->getMsgFromNamespace( $key, $code );
 		} else {
 			$txt = false;
 			$title = Title::makeTitleSafe( NS_MEDIAWIKI, $key );
@@ -952,7 +959,7 @@ class LanguageConverter {
 						$txt = $revision->getContent( Revision::RAW )->getNativeData();
 					}
 
-					//@todo: in the future, use a specialized content model, perhaps based on json!
+					// @todo in the future, use a specialized content model, perhaps based on json!
 				}
 			}
 		}
@@ -1096,6 +1103,7 @@ class LanguageConverter {
 	 * @param $text String: text to armour against conversion
 	 * @return String: armoured text where { and } have been converted to
 	 *                 &#123; and &#125;
+	 * @deprecated since 1.22 is no longer used
 	 */
 	public function armourMath( $text ) {
 		// convert '-{' and '}-' to '-&#123;' and '&#125;-' to prevent
@@ -1256,17 +1264,20 @@ class ConverterRule {
 		$variants = $this->mConverter->mVariants;
 		$varsep_pattern = $this->mConverter->getVarSeparatorPattern();
 
+		// Split according to $varsep_pattern, but ignore semicolons from HTML entities
+		$rules = preg_replace( '/(&[#a-zA-Z0-9]+);/', "$1\x01", $rules );
 		$choice = preg_split( $varsep_pattern, $rules );
+		$choice = str_replace( "\x01", ';', $choice );
 
 		foreach ( $choice as $c ) {
-			$v  = explode( ':', $c, 2 );
+			$v = explode( ':', $c, 2 );
 			if ( count( $v ) != 2 ) {
 				// syntax error, skip
 				continue;
 			}
 			$to = trim( $v[1] );
-			$v  = trim( $v[0] );
-			$u  = explode( '=>', $v, 2 );
+			$v = trim( $v[0] );
+			$u = explode( '=>', $v, 2 );
 			// if $to is empty, strtr() could return a wrong result
 			if ( count( $u ) == 1 && $to && in_array( $v, $variants ) ) {
 				$bidtable[$v] = $to;
@@ -1357,6 +1368,37 @@ class ConverterRule {
 		}
 	}
 
+	/**
+	 * Similar to getRuleConvertedStr(), but this prefers to use original
+	 * page title if $variant === $this->mConverter->mMainLanguageCode
+	 * and may return false in this case (so this title conversion rule
+	 * will be ignored and the original title is shown).
+	 *
+	 * @since 1.22
+	 * @param $variant The variant code to display page title in
+	 * @return String|false The converted title or false if just page name
+	 */
+	function getRuleConvertedTitle( $variant ) {
+		if ( $variant === $this->mConverter->mMainLanguageCode ) {
+			// If a string targeting exactly this variant is set,
+			// use it. Otherwise, just return false, so the real
+			// page name can be shown (and because variant === main,
+			// there'll be no further automatic conversion).
+			$disp = $this->getTextInBidtable( $variant );
+			if ( $disp ) {
+				return $disp;
+			}
+			if ( array_key_exists( $variant, $this->mUnidtable ) ) {
+				$disp = array_values( $this->mUnidtable[$variant] );
+				$disp = $disp[0];
+			}
+			// Assigned above or still false.
+			return $disp;
+		} else {
+			return $this->getRuleConvertedStr( $variant );
+		}
+	}
+
 	/**
 	 * Generate conversion table for all text.
 	 * @private
@@ -1439,7 +1481,7 @@ class ConverterRule {
 				   // then we check its fallback variants.
 				$variantFallbacks =
 					$this->mConverter->getVariantFallbacks( $variant );
-				if( is_array( $variantFallbacks ) ) {
+				if ( is_array( $variantFallbacks ) ) {
 					foreach ( $variantFallbacks as $variantFallback ) {
 						// if current variant's fallback exist in flags
 						if ( isset( $this->mVariantFlags[$variantFallback] ) ) {
@@ -1509,7 +1551,7 @@ class ConverterRule {
 					$this->mRuleDisplay = $this->getRuleConvertedStr( $variant );
 					break;
 				case 'T':
-					$this->mRuleTitle = $this->getRuleConvertedStr( $variant );
+					$this->mRuleTitle = $this->getRuleConvertedTitle( $variant );
 					$this->mRuleDisplay = '';
 					break;
 				default:
diff --git a/languages/Names.php b/languages/Names.php
index bce1663e..929c513d 100644
--- a/languages/Names.php
+++ b/languages/Names.php
@@ -22,21 +22,21 @@
  */
 
 /**
-  * These determine things like interwikis, language selectors, and so on.
-  * Safe to change without running scripts on the respective sites.
-  *
-  * \xE2\x80\x8E is the left-to-right marker and
-  * \xE2\x80\x8F is the right-to-left marker.
-  * They are required for ensuring the correct display of brackets in
-  * mixed rtl/ltr environment.
-  *
-  * Some writing systems require some line-height fixes. This includes
-  * most Indic scripts, like Devanagari.
-  * If you are adding support for such a language, add it also to
-  * the relevant section in skins/common/shared.css.
-  *
-  * @ingroup Language
-  */
+ * These determine things like interwikis, language selectors, and so on.
+ * Safe to change without running scripts on the respective sites.
+ *
+ * \xE2\x80\x8E is the left-to-right marker and
+ * \xE2\x80\x8F is the right-to-left marker.
+ * They are required for ensuring the correct display of brackets in
+ * mixed rtl/ltr environment.
+ *
+ * Some writing systems require some line-height fixes. This includes
+ * most Indic scripts, like Devanagari.
+ * If you are adding support for such a language, add it also to
+ * the relevant section in skins/common/shared.css.
+ *
+ * @ingroup Language
+ */
 /* private */ $coreLanguageNames = array(
 	'aa' => 'Qafár af',	# Afar
 	'ab' => 'Аҧсшәа',	# Abkhaz
@@ -54,7 +54,7 @@
 	'arn' => 'mapudungun',	# Mapuche, Mapudungu, Araucanian (Araucano)
 	'ary' => 'Maġribi',	# Moroccan Spoken Arabic
 	'arz' => 'مصرى',	# Egyptian Spoken Arabic
-	'as' => 'অসমীয়া',	# Assamese
+	'as' => 'অসমীয়া',	# Assamese
 	'ast' => 'asturianu',	# Asturian
 	'av' => 'авар',	# Avar
 	'avk' => 'Kotava', # Kotava
@@ -64,6 +64,8 @@
 	'ba' => 'башҡортса',	# Bashkir
 	'bar' => 'Boarisch',	# Bavarian (Austro-Bavarian and South Tyrolean)
 	'bat-smg' => 'žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 693-3 since 2010-06-30 )
+	'bbc' => 'Batak Toba', # Batak Toba (falls back to bbc-latn)
+	'bbc-latn' => 'Batak Toba', # Batak Toba
 	'bcc' => 'بلوچی مکرانی', # Southern Balochi
 	'bcl' => 'Bikol Central', # Bikol: Central Bicolano language
 	'be' => 'беларуская',	#  Belarusian normative
@@ -155,7 +157,7 @@
 	'gu' => 'ગુજરાતી',	# Gujarati
 	'gv' => 'Gaelg',		# Manx
 	'ha' => 'Hausa',	# Hausa
-	'hak' => 'Hak-kâ-fa',	# Hakka
+	'hak' => '客家語/Hak-kâ-ngî',	# Hakka
 	'haw' => 'Hawai`i',		# Hawaiian
 	'he' => 'עברית',	# Hebrew
 	'hi' => 'हिन्दी',	# Hindi
@@ -165,7 +167,7 @@
 	'ho' => 'Hiri Motu',	# Hiri Motu
 	'hr' => 'hrvatski',		# Croatian
 	'hsb' => 'hornjoserbsce',	# Upper Sorbian
-	'ht'  => 'Kreyòl ayisyen',		# Haitian Creole French
+	'ht' => 'Kreyòl ayisyen',		# Haitian Creole French
 	'hu' => 'magyar',		# Hungarian
 	'hy' => 'Հայերեն',	# Armenian
 	'hz' => 'Otsiherero',	# Herero
@@ -219,7 +221,7 @@
 	'ks-arab' => 'کٲشُر',	# Kashmiri (Perso-Arabic script)
 	'ks-deva' => 'कॉशुर',	# Kashmiri (Devanagari script)
 	'ksh' => 'Ripoarisch',	# Ripuarian
-	'ku'  => 'Kurdî',	# Kurdish (multiple scripts - defaults to Latin)
+	'ku' => 'Kurdî',	# Kurdish (multiple scripts - defaults to Latin)
 	'ku-latn' => "Kurdî (latînî)\xE2\x80\x8E",	# Northern Kurdish (Latin script)
 	'ku-arab' => "كوردي (عەرەبی)\xE2\x80\x8F",	# Northern Kurdish (Arabic script) (falls back to ckb)
 	'kv' => 'коми',	# Komi-Zyrian (Cyrillic is common script but also written in Latin script)
@@ -237,7 +239,7 @@
 	'liv' => 'Līvõ kēļ',	# Livonian
 	'lmo' => 'lumbaart',	# Lombard
 	'ln' => 'lingála',		# Lingala
-	'lo' => 'ລາວ',# Laotian
+	'lo' => 'ລາວ',	# Laotian
 	'loz' => 'Silozi', # Lozi
 	'lt' => 'lietuvių',	# Lithuanian
 	'ltg' => 'latgaļu', 	# Latgalian
@@ -269,7 +271,7 @@
 	'na' => 'Dorerin Naoero',		# Nauruan
 	'nah' => 'Nāhuatl',		# Nahuatl, en:Wikipedia writes Nahuatlahtolli, while another form is Náhuatl
 	'nan' => 'Bân-lâm-gú', # Min-nan -- (bug 8217) nan instead of zh-min-nan, http://www.sil.org/iso639-3/codes.asp?order=639_3&letter=n
-	'nap' => 'Nnapulitano',	# Neapolitan
+	'nap' => 'Napulitano',	# Neapolitan, bug 43793
 	'nb' => "norsk bokmål",		# Norwegian (Bokmal)
 	'nds' => 'Plattdüütsch',	# Low German ''or'' Low Saxon
 	'nds-nl' => 'Nedersaksies',	# aka Nedersaksisch: Dutch Low Saxon
@@ -288,7 +290,7 @@
 	'ny' => 'Chi-Chewa',	# Chichewa
 	'oc' => 'occitan',		# Occitan
 	'om' => 'Oromoo',		# Oromo
-	'or' => 'ଓଡ଼ିଆ',		# Oriya
+	'or' => 'ଓଡ଼ିଆ',		# Oriya
 	'os' => 'Ирон', # Ossetic -- fixed per bug 29091
 	'pa' => 'ਪੰਜਾਬੀ', # Eastern Punjabi (Gurmukhi script) (pan)
 	'pag' => 'Pangasinan',	# Pangasinan
diff --git a/languages/classes/LanguageAz.php b/languages/classes/LanguageAz.php
index 0956dc42..48f70e85 100644
--- a/languages/classes/LanguageAz.php
+++ b/languages/classes/LanguageAz.php
@@ -32,7 +32,7 @@ class LanguageAz extends Language {
 	 * @param $string string
 	 * @return mixed|string
 	 */
-	function ucfirst ( $string ) {
+	function ucfirst( $string ) {
 		if ( $string[0] == 'i' ) {
 			return 'İ' . substr( $string, 1 );
 		} else {
diff --git a/languages/classes/LanguageBe_tarask.php b/languages/classes/LanguageBe_tarask.php
index b781d7a6..6497b50c 100644
--- a/languages/classes/LanguageBe_tarask.php
+++ b/languages/classes/LanguageBe_tarask.php
@@ -46,13 +46,17 @@ class LanguageBe_tarask extends Language {
 	 * @return string
 	 */
 	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
+		if ( !count( $forms ) ) {
+			return '';
+		}
 
 		// If the actual number is not mentioned in the expression, then just two forms are enough:
 		// singular for $count == 1
 		// plural   for $count != 1
 		// For example, "This user belongs to {{PLURAL:$1|one group|several groups}}."
-		if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+		if ( count( $forms ) === 2 ) {
+			return $count == 1 ? $forms[0] : $forms[1];
+		}
 
 		// @todo FIXME: CLDR defines 4 plural forms instead of 3
 		//        http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
@@ -62,10 +66,10 @@ class LanguageBe_tarask extends Language {
 			return $forms[2];
 		} else {
 			switch ( $count % 10 ) {
-				case 1:  return $forms[0];
+				case 1: return $forms[0];
 				case 2:
 				case 3:
-				case 4:  return $forms[1];
+				case 4: return $forms[1];
 				default: return $forms[2];
 			}
 		}
diff --git a/languages/classes/LanguageCu.php b/languages/classes/LanguageCu.php
index 2016a43c..60cf2b1a 100644
--- a/languages/classes/LanguageCu.php
+++ b/languages/classes/LanguageCu.php
@@ -48,36 +48,19 @@ class LanguageCu extends Language {
 		# join and array_slice instead mb_substr
 		$ar = array();
 		preg_match_all( '/./us', $word, $ar );
-		if ( !preg_match( "/[a-zA-Z_]/us", $word ) )
+		if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
 			switch ( $case ) {
 				case 'genitive': # родительный падеж
-					if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вики' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вики' ) )
-						{ }
-					elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ї' )
+					if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вики' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вики' ) ) {
+					} elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ї' ) {
 						$word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'їѩ';
+					}
 					break;
 				case 'accusative': # винительный падеж
 					# stub
 					break;
 			}
-		return $word;
-	}
-
-	/**
-	 * @param $count int
-	 * @param $forms array
-	 * @return string
-	 */
-	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
-		$forms = $this->preConvertPlural( $forms, 4 );
-
-		switch ( $count % 10 ) {
-			case 1:  return $forms[0];
-			case 2:  return $forms[1];
-			case 3:
-			case 4:  return $forms[2];
-			default: return $forms[3];
 		}
+		return $word;
 	}
 }
diff --git a/languages/classes/LanguageEo.php b/languages/classes/LanguageEo.php
index 8f843224..0e2d8b4a 100644
--- a/languages/classes/LanguageEo.php
+++ b/languages/classes/LanguageEo.php
@@ -78,14 +78,14 @@ class LanguageEo extends Language {
 	 * @return string
 	 */
 	function strrtuxCallback( $matches ) {
-		static $ux = array (
-			'x' => 'xx' , 'X' => 'Xx' ,
-			"\xc4\x88" => "Cx" , "\xc4\x89" => "cx" ,
-			"\xc4\x9c" => "Gx" , "\xc4\x9d" => "gx" ,
-			"\xc4\xa4" => "Hx" , "\xc4\xa5" => "hx" ,
-			"\xc4\xb4" => "Jx" , "\xc4\xb5" => "jx" ,
-			"\xc5\x9c" => "Sx" , "\xc5\x9d" => "sx" ,
-			"\xc5\xac" => "Ux" , "\xc5\xad" => "ux"
+		static $ux = array(
+			'x' => 'xx', 'X' => 'Xx',
+			"\xc4\x88" => "Cx", "\xc4\x89" => "cx",
+			"\xc4\x9c" => "Gx", "\xc4\x9d" => "gx",
+			"\xc4\xa4" => "Hx", "\xc4\xa5" => "hx",
+			"\xc4\xb4" => "Jx", "\xc4\xb5" => "jx",
+			"\xc5\x9c" => "Sx", "\xc5\x9d" => "sx",
+			"\xc5\xac" => "Ux", "\xc5\xad" => "ux",
 		);
 		return strtr( $matches[1], $ux );
 	}
@@ -95,49 +95,25 @@ class LanguageEo extends Language {
 	 * @return string
 	 */
 	function strrtxuCallback( $matches ) {
-		static $xu = array (
-			'xx' => 'x' , 'xX' => 'x' ,
-			'Xx' => 'X' , 'XX' => 'X' ,
-			"Cx" => "\xc4\x88" , "CX" => "\xc4\x88" ,
-			"cx" => "\xc4\x89" , "cX" => "\xc4\x89" ,
-			"Gx" => "\xc4\x9c" , "GX" => "\xc4\x9c" ,
-			"gx" => "\xc4\x9d" , "gX" => "\xc4\x9d" ,
-			"Hx" => "\xc4\xa4" , "HX" => "\xc4\xa4" ,
-			"hx" => "\xc4\xa5" , "hX" => "\xc4\xa5" ,
-			"Jx" => "\xc4\xb4" , "JX" => "\xc4\xb4" ,
-			"jx" => "\xc4\xb5" , "jX" => "\xc4\xb5" ,
-			"Sx" => "\xc5\x9c" , "SX" => "\xc5\x9c" ,
-			"sx" => "\xc5\x9d" , "sX" => "\xc5\x9d" ,
-			"Ux" => "\xc5\xac" , "UX" => "\xc5\xac" ,
-			"ux" => "\xc5\xad" , "uX" => "\xc5\xad"
+		static $xu = array(
+			'xx' => 'x', 'xX' => 'x',
+			'Xx' => 'X', 'XX' => 'X',
+			"Cx" => "\xc4\x88", "CX" => "\xc4\x88",
+			"cx" => "\xc4\x89", "cX" => "\xc4\x89",
+			"Gx" => "\xc4\x9c", "GX" => "\xc4\x9c",
+			"gx" => "\xc4\x9d", "gX" => "\xc4\x9d",
+			"Hx" => "\xc4\xa4", "HX" => "\xc4\xa4",
+			"hx" => "\xc4\xa5", "hX" => "\xc4\xa5",
+			"Jx" => "\xc4\xb4", "JX" => "\xc4\xb4",
+			"jx" => "\xc4\xb5", "jX" => "\xc4\xb5",
+			"Sx" => "\xc5\x9c", "SX" => "\xc5\x9c",
+			"sx" => "\xc5\x9d", "sX" => "\xc5\x9d",
+			"Ux" => "\xc5\xac", "UX" => "\xc5\xac",
+			"ux" => "\xc5\xad", "uX" => "\xc5\xad",
 		);
 		return strtr( $matches[1], $xu ) . strtr( $matches[2], $xu );
 	}
 
-	/**
-	 * @param $s string
-	 * @return string
-	 */
-	function checkTitleEncoding( $s ) {
-		# Check for X-system backwards-compatibility URLs
-		$ishigh = preg_match( '/[\x80-\xff]/', $s );
-		$isutf = preg_match( '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
-			'[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
-
-		if ( $ishigh and !$isutf ) {
-			# Assume Latin1
-			$s = utf8_encode( $s );
-		} else {
-			if ( preg_match( '/(\xc4[\x88\x89\x9c\x9d\xa4\xa5\xb4\xb5]' .
-				'|\xc5[\x9c\x9d\xac\xad])/', $s ) )
-			return $s;
-		}
-
-		// if( preg_match( '/[cghjsu]x/i', $s ) )
-		//	return $this->iconv( 'x', 'utf-8', $s );
-		return $s;
-	}
-
 	function initEncoding() {
 		global $wgEditEncoding;
 		$wgEditEncoding = 'x';
diff --git a/languages/classes/LanguageEs.php b/languages/classes/LanguageEs.php
new file mode 100644
index 00000000..f55c2e43
--- /dev/null
+++ b/languages/classes/LanguageEs.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Spanish (español) specific code.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Language
+ */
+
+/**
+ * Spanish (español)
+ *
+ * @ingroup Language
+ */
+class LanguageEs extends Language {
+
+	/**
+	 * @param $_ string
+	 * @return string
+	 */
+	function commafy( $_ ) {
+		if ( !preg_match( '/^-?\d{1,4}(\.\d+)?$/', $_ ) ) {
+			return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
+		} else {
+			return $_;
+		}
+	}
+}
diff --git a/languages/classes/LanguageFi.php b/languages/classes/LanguageFi.php
index 6a2820d1..ee1d1b52 100644
--- a/languages/classes/LanguageFi.php
+++ b/languages/classes/LanguageFi.php
@@ -53,12 +53,14 @@ class LanguageFi extends Language {
 		# The general case cannot be handled without a dictionary, but there's at least one notable
 		# special case we should check for:
 
-		if ( preg_match( '/wiki$/i', $word ) )
+		if ( preg_match( '/wiki$/i', $word ) ) {
 			$aou = false;
+		}
 
 		# append i after final consonant
-		if ( preg_match( '/[bcdfghjklmnpqrstvwxz]$/i', $word ) )
+		if ( preg_match( '/[bcdfghjklmnpqrstvwxz]$/i', $word ) ) {
 			$word .= 'i';
+		}
 
 		switch ( $case ) {
 			case 'genitive':
diff --git a/languages/classes/LanguageGa.php b/languages/classes/LanguageGa.php
index 2f58384a..339ad4de 100644
--- a/languages/classes/LanguageGa.php
+++ b/languages/classes/LanguageGa.php
@@ -46,19 +46,26 @@ class LanguageGa extends Language {
 		case 'ainmlae':
 			switch ( $word ) {
 			case 'an Domhnach':
-				$word = 'Dé Domhnaigh'; break;
+				$word = 'Dé Domhnaigh';
+				break;
 			case 'an Luan':
-				$word = 'Dé Luain'; break;
+				$word = 'Dé Luain';
+				break;
 			case 'an Mháirt':
-				$word = 'Dé Mháirt'; break;
+				$word = 'Dé Mháirt';
+				break;
 			case 'an Chéadaoin':
-				$word = 'Dé Chéadaoin'; break;
+				$word = 'Dé Chéadaoin';
+				break;
 			case 'an Déardaoin':
-				$word = 'Déardaoin'; break;
+				$word = 'Déardaoin';
+				break;
 			case 'an Aoine':
-				$word = 'Dé hAoine'; break;
+				$word = 'Dé hAoine';
+				break;
 			case 'an Satharn':
-				$word = 'Dé Sathairn'; break;
+				$word = 'Dé Sathairn';
+				break;
 			}
 		}
 		return $word;
diff --git a/languages/classes/LanguageGan.php b/languages/classes/LanguageGan.php
index 0d652d43..d81574d1 100644
--- a/languages/classes/LanguageGan.php
+++ b/languages/classes/LanguageGan.php
@@ -21,8 +21,8 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageZh.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageZh.php';
 
 /**
  * @ingroup Language
@@ -50,7 +50,7 @@ class GanConverter extends LanguageConverter {
 									$flags,
 									$manualLevel );
 		$names = array(
-			'gan'      => '原文',
+			'gan' => '原文',
 			'gan-hans' => '简体',
 			'gan-hant' => '繁體',
 		);
@@ -58,11 +58,11 @@ class GanConverter extends LanguageConverter {
 	}
 
 	function loadDefaultTables() {
-		require( __DIR__ . "/../../includes/ZhConversion.php" );
+		require __DIR__ . '/../../includes/ZhConversion.php';
 		$this->mTables = array(
 			'gan-hans' => new ReplacementArray( $zh2Hans ),
 			'gan-hant' => new ReplacementArray( $zh2Hant ),
-			'gan'      => new ReplacementArray
+			'gan' => new ReplacementArray
 		);
 	}
 
@@ -89,12 +89,12 @@ class LanguageGan extends LanguageZh {
 
 		$variants = array( 'gan', 'gan-hans', 'gan-hant' );
 		$variantfallbacks = array(
-			'gan'      => array( 'gan-hans', 'gan-hant' ),
+			'gan' => array( 'gan-hans', 'gan-hant' ),
 			'gan-hans' => array( 'gan' ),
 			'gan-hant' => array( 'gan' ),
 		);
 		$ml = array(
-			'gan'      => 'disable',
+			'gan' => 'disable',
 		);
 
 		$this->mConverter = new GanConverter( $this, 'gan',
@@ -105,28 +105,6 @@ class LanguageGan extends LanguageZh {
 		$wgHooks['PageContentSaveComplete'][] = $this->mConverter;
 	}
 
-	/**
-	 * this should give much better diff info
-	 *
-	 * @param $text string
-	 * @return string
-	 */
-	function segmentForDiff( $text ) {
-		return preg_replace(
-			"/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
-			"' ' .\"$1\"", $text );
-	}
-
-	/**
-	 * @param $text string
-	 * @return string
-	 */
-	function unsegmentForDiff( $text ) {
-		return preg_replace(
-			"/ ([\\xc0-\\xff][\\x80-\\xbf]*)/e",
-			"\"$1\"", $text );
-	}
-
 	/**
 	 * word segmentation
 	 *
@@ -139,15 +117,4 @@ class LanguageGan extends LanguageZh {
 		return parent::normalizeForSearch( $string, $autoVariant );
 	}
 
-	/**
-	 * @param $termsArray array
-	 * @return array
-	 */
-	function convertForSearchResult( $termsArray ) {
-		$terms = implode( '|', $termsArray );
-		$terms = self::convertDoubleWidth( $terms );
-		$terms = implode( '|', $this->mConverter->autoConvertToAllVariants( $terms ) );
-		$ret = array_unique( explode( '|', $terms ) );
-		return $ret;
-	}
 }
diff --git a/languages/classes/LanguageGv.php b/languages/classes/LanguageGv.php
index 70b80ad6..ba8a53ce 100644
--- a/languages/classes/LanguageGv.php
+++ b/languages/classes/LanguageGv.php
@@ -35,7 +35,9 @@ class LanguageGv extends Language {
 	 * @return string
 	 */
 	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
+		if ( !count( $forms ) ) {
+			return '';
+		}
 
 		$forms = $this->preConvertPlural( $forms, 4 );
 
diff --git a/languages/classes/LanguageHi.php b/languages/classes/LanguageHi.php
deleted file mode 100644
index 6a2302c0..00000000
--- a/languages/classes/LanguageHi.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Hindi (हिन्दी) specific code.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Hindi (हिन्दी)
- *
- * @ingroup Language
- */
-class LanguageHi extends Language {
-	/**
-	 * Use singular form for zero
-	 *
-	 * @param $count int
-	 * @param $forms array
-	 *
-	 * @return string
-	 */
-	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
-		$forms = $this->preConvertPlural( $forms, 2 );
-
-		return ( $count <= 1 ) ? $forms[0] : $forms[1];
-	}
-}
diff --git a/languages/classes/LanguageHr.php b/languages/classes/LanguageHr.php
index a0e9a87a..910bc100 100644
--- a/languages/classes/LanguageHr.php
+++ b/languages/classes/LanguageHr.php
@@ -34,7 +34,9 @@ class LanguageHr extends Language {
 	 * @return string
 	 */
 	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
+		if ( !count( $forms ) ) {
+			return '';
+		}
 		// @todo FIXME: CLDR defines 4 plural forms instead of 3. Plural for for decimals is missing.
 		//        http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
 		$forms = $this->preConvertPlural( $forms, 3 );
@@ -43,10 +45,10 @@ class LanguageHr extends Language {
 			return $forms[2];
 		} else {
 			switch ( $count % 10 ) {
-				case 1:  return $forms[0];
+				case 1: return $forms[0];
 				case 2:
 				case 3:
-				case 4:  return $forms[1];
+				case 4: return $forms[1];
 				default: return $forms[2];
 			}
 		}
diff --git a/languages/classes/LanguageHy.php b/languages/classes/LanguageHy.php
index 50798131..24068296 100644
--- a/languages/classes/LanguageHy.php
+++ b/languages/classes/LanguageHy.php
@@ -49,17 +49,18 @@ class LanguageHy extends Language {
 		# join and array_slice instead mb_substr
 		$ar = array();
 		preg_match_all( '/./us', $word, $ar );
-		if ( !preg_match( "/[a-zA-Z_]/us", $word ) )
+		if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
 			switch ( $case ) {
 				case 'genitive': # սեռական հոլով
-					if ( join( '', array_slice( $ar[0], -1 ) ) == 'ա' )
+					if ( join( '', array_slice( $ar[0], -1 ) ) == 'ա' ) {
 						$word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'այի';
-					elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'ո' )
+					} elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'ո' ) {
 						$word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'ոյի';
-					elseif ( join( '', array_slice( $ar[0], -4 ) ) == 'գիրք' )
+					} elseif ( join( '', array_slice( $ar[0], -4 ) ) == 'գիրք' ) {
 						$word = join( '', array_slice( $ar[0], 0, -4 ) ) . 'գրքի';
-					else
+					} else {
 						$word .= 'ի';
+					}
 					break;
 				case 'dative':  # Տրական հոլով
 					# stub
@@ -74,6 +75,7 @@ class LanguageHy extends Language {
 					# stub
 					break;
 			}
+		}
 		return $word;
 	}
 
diff --git a/languages/classes/LanguageIu.php b/languages/classes/LanguageIu.php
index fe5cdf8d..abd2e7c8 100644
--- a/languages/classes/LanguageIu.php
+++ b/languages/classes/LanguageIu.php
@@ -21,7 +21,7 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
 
 /**
  * Conversion script between Latin and Syllabics for Inuktitut.
@@ -92,7 +92,7 @@ class IuConverter extends LanguageConverter {
 			'lowercase' => new ReplacementArray( $this->mUpperToLowerCaseLatin ),
 			'ike-cans' => new ReplacementArray( $this->mToSyllabics ),
 			'ike-latn' => new ReplacementArray( $this->mToLatin ),
-			'iu'    => new ReplacementArray()
+			'iu' => new ReplacementArray()
 		);
 	}
 
@@ -144,17 +144,19 @@ class IuConverter extends LanguageConverter {
 	 * @param $ignoreOtherCond bool
 	 */
 	function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
-		 // check for user namespace
+		// check for user namespace
 		if ( is_object( $nt ) ) {
 			$ns = $nt->getNamespace();
-			if ( $ns == NS_USER || $ns == NS_USER_TALK )
+			if ( $ns == NS_USER || $ns == NS_USER_TALK ) {
 				return;
+			}
 		}
 
 		$oldlink = $link;
 		parent::findVariantLink( $link, $nt, $ignoreOtherCond );
-		if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+		if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
 			$link = $oldlink;
+		}
 	}
 
 	/**
@@ -168,9 +170,11 @@ class IuConverter extends LanguageConverter {
 	 */
 	function autoConvert( $text, $toVariant = false ) {
 		global $wgTitle;
-		if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+		if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
 			$imagename = $wgTitle->getNsText();
-			if ( preg_match( "/^$imagename:/", $text ) ) return $text;
+			if ( preg_match( "/^$imagename:/", $text ) ) {
+				return $text;
+			}
 		}
 		return parent::autoConvert( $text, $toVariant );
 	}
@@ -189,7 +193,7 @@ class IuConverter extends LanguageConverter {
 		if ( trim( $text ) ) {
 			$this->loadTables();
 			// To syllabics, first translate uppercase to lowercase Latin
-			if($toVariant == 'ike-cans') {
+			if ( $toVariant == 'ike-cans' ) {
 				$text = $this->mTables['lowercase']->replace( $text );
 			}
 			$text = $this->mTables[$toVariant]->replace( $text );
diff --git a/languages/classes/LanguageKaa.php b/languages/classes/LanguageKaa.php
index a397bc0f..6203b4ba 100644
--- a/languages/classes/LanguageKaa.php
+++ b/languages/classes/LanguageKaa.php
@@ -41,7 +41,7 @@ class LanguageKaa extends Language {
 	function convertGrammar( $word, $case ) {
 		global $wgGrammarForms;
 		if ( isset( $wgGrammarForms['kaa'][$case][$word] ) ) {
-		     return $wgGrammarForms['kaa'][$case][$word];
+			return $wgGrammarForms['kaa'][$case][$word];
 		}
 		/* Full code of function convertGrammar() is in development. Updates coming soon. */
 		return $word;
@@ -54,7 +54,7 @@ class LanguageKaa extends Language {
 	 *
 	 * @return string
 	 */
-	function ucfirst ( $string ) {
+	function ucfirst( $string ) {
 		if ( substr( $string, 0, 1 ) === 'i' ) {
 			return 'İ' . substr( $string, 1 );
 		} else {
@@ -69,7 +69,7 @@ class LanguageKaa extends Language {
 	 *
 	 * @return mixed|string
 	 */
-	function lcfirst ( $string ) {
+	function lcfirst( $string ) {
 		if ( substr( $string, 0, 1 ) === 'I' ) {
 			return 'ı' . substr( $string, 1 );
 		} else {
diff --git a/languages/classes/LanguageKk.php b/languages/classes/LanguageKk.php
index 6dd6959f..f96b0d92 100644
--- a/languages/classes/LanguageKk.php
+++ b/languages/classes/LanguageKk.php
@@ -21,8 +21,8 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageKk_cyrl.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageKk_cyrl.php';
 
 define( 'KK_C_UC', 'АӘБВГҒДЕЁЖЗИЙКҚЛМНҢОӨПРСТУҰҮФХҺЦЧШЩЪЫІЬЭЮЯ' ); # Kazakh Cyrillic uppercase
 define( 'KK_C_LC', 'аәбвгғдеёжзийкқлмнңоөпрстуұүфхһцчшщъыіьэюя' ); # Kazakh Cyrillic lowercase
@@ -62,24 +62,24 @@ class KkConverter extends LanguageConverter {
 	}
 
 	function loadDefaultTables() {
-		// require( __DIR__."/../../includes/KkConversion.php" );
+		// require __DIR__."/../../includes/KkConversion.php";
 		// Placeholder for future implementing. Remove variables declarations
 		// after generating KkConversion.php
 		$kk2Cyrl = array();
 		$kk2Latn = array();
 		$kk2Arab = array();
-		$kk2KZ   = array();
-		$kk2TR   = array();
-		$kk2CN   = array();
+		$kk2KZ = array();
+		$kk2TR = array();
+		$kk2CN = array();
 
 		$this->mTables = array(
 			'kk-cyrl' => new ReplacementArray( $kk2Cyrl ),
 			'kk-latn' => new ReplacementArray( $kk2Latn ),
 			'kk-arab' => new ReplacementArray( $kk2Arab ),
-			'kk-kz'   => new ReplacementArray( array_merge( $kk2Cyrl, $kk2KZ ) ),
-			'kk-tr'   => new ReplacementArray( array_merge( $kk2Latn, $kk2TR ) ),
-			'kk-cn'   => new ReplacementArray( array_merge( $kk2Arab, $kk2CN ) ),
-			'kk'      => new ReplacementArray()
+			'kk-kz' => new ReplacementArray( array_merge( $kk2Cyrl, $kk2KZ ) ),
+			'kk-tr' => new ReplacementArray( array_merge( $kk2Latn, $kk2TR ) ),
+			'kk-cn' => new ReplacementArray( array_merge( $kk2Arab, $kk2CN ) ),
+			'kk' => new ReplacementArray()
 		);
 	}
 
@@ -173,9 +173,9 @@ class KkConverter extends LanguageConverter {
 			# # Punctuation -> Arabic
 			'/#|№|No\./u' => '؀', # &#x0600;
 			'/\,/' => '،', # &#x060C;
-			'/;/'  => '؛', # &#x061B;
+			'/;/' => '؛', # &#x061B;
 			'/\?/' => '؟', # &#x061F;
-			'/%/'  => '٪', # &#x066A;
+			'/%/' => '٪', # &#x066A;
 			'/\*/' => '٭', # &#x066D;
 			# # Digits -> Arabic
 			'/0/' => '۰', # &#x06F0;
@@ -259,14 +259,16 @@ class KkConverter extends LanguageConverter {
 		// check for user namespace
 		if ( is_object( $nt ) ) {
 			$ns = $nt->getNamespace();
-			if ( $ns == NS_USER || $ns == NS_USER_TALK )
+			if ( $ns == NS_USER || $ns == NS_USER_TALK ) {
 				return;
+			}
 		}
 
 		$oldlink = $link;
 		parent::findVariantLink( $link, $nt, $ignoreOtherCond );
-		if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+		if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
 			$link = $oldlink;
+		}
 	}
 
 	/**
@@ -280,9 +282,11 @@ class KkConverter extends LanguageConverter {
 	 */
 	function autoConvert( $text, $toVariant = false ) {
 		global $wgTitle;
-		if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+		if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
 			$imagename = $wgTitle->getNsText();
-			if ( preg_match( "/^$imagename:/", $text ) ) return $text;
+			if ( preg_match( "/^$imagename:/", $text ) ) {
+				return $text;
+			}
 		}
 		return parent::autoConvert( $text, $toVariant );
 	}
@@ -299,7 +303,7 @@ class KkConverter extends LanguageConverter {
 		global $wgLanguageCode;
 		$text = parent::translate( $text, $toVariant );
 
-		switch( $toVariant ) {
+		switch ( $toVariant ) {
 			case 'kk-cyrl':
 			case 'kk-kz':
 				$letters = KK_L_UC . KK_L_LC . 'ʺʹ#0123456789';
@@ -343,7 +347,7 @@ class KkConverter extends LanguageConverter {
 			return $text;
 		}
 
-		switch( $toVariant ) {
+		switch ( $toVariant ) {
 			case 'kk-arab':
 			case 'kk-cn':
 				$letters = KK_C_LC . KK_C_UC/*.KK_L_LC.KK_L_UC*/;
@@ -414,13 +418,13 @@ class LanguageKk extends LanguageKk_cyrl {
 
 		$variants = array( 'kk', 'kk-cyrl', 'kk-latn', 'kk-arab', 'kk-kz', 'kk-tr', 'kk-cn' );
 		$variantfallbacks = array(
-			'kk'      => 'kk-cyrl',
+			'kk' => 'kk-cyrl',
 			'kk-cyrl' => 'kk',
 			'kk-latn' => 'kk',
 			'kk-arab' => 'kk',
-			'kk-kz'   => 'kk-cyrl',
-			'kk-tr'   => 'kk-latn',
-			'kk-cn'   => 'kk-arab'
+			'kk-kz' => 'kk-cyrl',
+			'kk-tr' => 'kk-latn',
+			'kk-cn' => 'kk-arab'
 		);
 
 		$this->mConverter = new KkConverter( $this, 'kk', $variants, $variantfallbacks );
@@ -435,7 +439,7 @@ class LanguageKk extends LanguageKk_cyrl {
 	 *
 	 * @return string
 	 */
-	function ucfirst ( $string ) {
+	function ucfirst( $string ) {
 		$variant = $this->getPreferredVariant();
 		if ( ( $variant == 'kk-latn' || $variant == 'kk-tr' ) && $string[0] == 'i' ) {
 			$string = 'İ' . substr( $string, 1 );
@@ -452,7 +456,7 @@ class LanguageKk extends LanguageKk_cyrl {
 	 *
 	 * @return string
 	 */
-	function lcfirst ( $string ) {
+	function lcfirst( $string ) {
 		$variant = $this->getPreferredVariant();
 		if ( ( $variant == 'kk-latn' || $variant == 'kk-tr' ) && $string[0] == 'I' ) {
 			$string = 'ı' . substr( $string, 1 );
diff --git a/languages/classes/LanguageKk_cyrl.php b/languages/classes/LanguageKk_cyrl.php
index 081a20f8..5a7bbf36 100644
--- a/languages/classes/LanguageKk_cyrl.php
+++ b/languages/classes/LanguageKk_cyrl.php
@@ -115,14 +115,14 @@ class LanguageKk_cyrl extends Language {
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "а";
 					}
-				} elseif ( in_array( $wordEnding, $secondPerson  ) ) {
+				} elseif ( in_array( $wordEnding, $secondPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "ге";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "ға";
 					}
-				} elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
-				  if ( in_array( $wordLastVowel, $frontVowels ) ) {
+				} elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "не";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "на";
@@ -153,13 +153,13 @@ class LanguageKk_cyrl extends Language {
 				break;
 			case "dc31":
 			case "possessive accusative": # täweldık + tabıs
-				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson  ) ) {
+				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "ді";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "ды";
 					}
-				} elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
+				} elseif ( in_array( $wordEnding, $thirdPerson ) ) {
 						$word = $word . "н";
 				}
 				break;
@@ -181,13 +181,13 @@ class LanguageKk_cyrl extends Language {
 				break;
 			case "dc41":
 			case "possessive locative": # täweldık + jatıs
-				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson  ) ) {
+				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "де";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "да";
 					}
-				} elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
+				} elseif ( in_array( $wordEnding, $thirdPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "нде";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -209,7 +209,7 @@ class LanguageKk_cyrl extends Language {
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "дан";
 					}
-				}  elseif ( in_array( $wordEnding, $Nasals ) ) {
+				} elseif ( in_array( $wordEnding, $Nasals ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "нен";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -219,13 +219,13 @@ class LanguageKk_cyrl extends Language {
 				break;
 			case "dc51":
 			case "possessive ablative": # täweldık + şığıs
-				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson  ) ) {
+				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "нен";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "нан";
 					}
-				} elseif ( in_array( $wordEnding, $secondPerson  ) ) {
+				} elseif ( in_array( $wordEnding, $secondPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "ден";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -340,14 +340,14 @@ class LanguageKk_cyrl extends Language {
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "a";
 					}
-				} elseif ( in_array( $wordEnding, $secondPerson  ) ) {
+				} elseif ( in_array( $wordEnding, $secondPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "ge";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "ğa";
 					}
-				} elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
-				  if ( in_array( $wordLastVowel, $frontVowels ) ) {
+				} elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "ne";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "na";
@@ -378,13 +378,13 @@ class LanguageKk_cyrl extends Language {
 				break;
 			case "dc31":
 			case "possessive accusative": # täweldık + tabıs
-				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson  ) ) {
+				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "di";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "dı";
 					}
-				} elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
+				} elseif ( in_array( $wordEnding, $thirdPerson ) ) {
 						$word = $word . "n";
 				}
 				break;
@@ -406,13 +406,13 @@ class LanguageKk_cyrl extends Language {
 				break;
 			case "dc41":
 			case "possessive locative": # täweldık + jatıs
-				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson  ) ) {
+				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "de";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "da";
 					}
-				} elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
+				} elseif ( in_array( $wordEnding, $thirdPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "nde";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -434,7 +434,7 @@ class LanguageKk_cyrl extends Language {
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "dan";
 					}
-				}  elseif ( in_array( $wordEnding, $Nasals ) ) {
+				} elseif ( in_array( $wordEnding, $Nasals ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "nen";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -444,13 +444,13 @@ class LanguageKk_cyrl extends Language {
 				break;
 			case "dc51":
 			case "possessive ablative": # täweldık + şığıs
-				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson  ) ) {
+				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "nen";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "nan";
 					}
-				} elseif ( in_array( $wordEnding, $secondPerson  ) ) {
+				} elseif ( in_array( $wordEnding, $secondPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "den";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -499,7 +499,7 @@ class LanguageKk_cyrl extends Language {
 		// Set up some constants...
 		// Vowels in last syllable
 		$frontVowels = array( "ە", "ٶ", "ٷ", "ٸ", "ٵ", "ە" );
-		$backVowels = array( "ا", "و", "ۇ", "ى"  );
+		$backVowels = array( "ا", "و", "ۇ", "ى" );
 		$allVowels = array( "ە", "ٶ", "ٷ", "ٸ", "ٵ", "ە", "ا", "و", "ۇ", "ى" );
 		// Preceding letters
 		$Nasals = array( "م", "ن", "ڭ" );
@@ -565,14 +565,14 @@ class LanguageKk_cyrl extends Language {
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "ا";
 					}
-				} elseif ( in_array( $wordEnding, $secondPerson  ) ) {
+				} elseif ( in_array( $wordEnding, $secondPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "گە";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "عا";
 					}
-				} elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
-				  if ( in_array( $wordLastVowel, $frontVowels ) ) {
+				} elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "نە";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "نا";
@@ -603,13 +603,13 @@ class LanguageKk_cyrl extends Language {
 				break;
 			case "dc31":
 			case "possessive accusative": # täweldık + tabıs
-				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson  ) ) {
+				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "دٸ";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "دى";
 					}
-				} elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
+				} elseif ( in_array( $wordEnding, $thirdPerson ) ) {
 						$word = $word . "ن";
 				}
 				break;
@@ -631,13 +631,13 @@ class LanguageKk_cyrl extends Language {
 				break;
 			case "dc41":
 			case "possessive locative": # täweldık + jatıs
-				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson  ) ) {
+				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "دە";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "دا";
 					}
-				} elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
+				} elseif ( in_array( $wordEnding, $thirdPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "ندە";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -659,7 +659,7 @@ class LanguageKk_cyrl extends Language {
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "دان";
 					}
-				}  elseif ( in_array( $wordEnding, $Nasals ) ) {
+				} elseif ( in_array( $wordEnding, $Nasals ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "نەن";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -669,13 +669,13 @@ class LanguageKk_cyrl extends Language {
 				break;
 			case "dc51":
 			case "possessive ablative": # täweldık + şığıs
-				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson  ) ) {
+				if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "نەن";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
 						$word = $word . "نان";
 					}
-				} elseif ( in_array( $wordEnding, $secondPerson  ) ) {
+				} elseif ( in_array( $wordEnding, $secondPerson ) ) {
 					if ( in_array( $wordLastVowel, $frontVowels ) ) {
 						$word = $word . "دەن";
 					} elseif ( in_array( $wordLastVowel, $backVowels ) ) {
diff --git a/languages/classes/LanguageKsh.php b/languages/classes/LanguageKsh.php
index 074ad139..09c57279 100644
--- a/languages/classes/LanguageKsh.php
+++ b/languages/classes/LanguageKsh.php
@@ -104,17 +104,17 @@ class LanguageKsh extends Language {
 			# däm WikiMaatplaz sing, dä Wikipeedija ier, däm Wikiwööterbooch sing
 			# dem/em WikiMaatplaz sing, de Wikipeedija ier, dem/em Wikiwööterbooch sing
 			$word = ( preg_match( '/ b/', $case )
-						? ( $gender=='f' ? 'dä' : 'däm' )
-						: ( $gender=='f' ? 'de' : 'dem' )
+						? ( $gender == 'f' ? 'dä' : 'däm' )
+						: ( $gender == 'f' ? 'de' : 'dem' )
 					) . ' ' . $word . ' ' .
-					( $gender=='f' ? 'ier' : 'sing' ) .
+					( $gender == 'f' ? 'ier' : 'sing' ) .
 					( preg_match( '/ m/', $case ) ? 'e' : ''
 				);
 		} elseif ( preg_match( '/ e/', $case ) ) {
 			# en dämm WikiMaatPlaz, en dä Wikipeedija, en dämm Wikiwööterbooch
 			# em WikiMaatplaz, en de Wikipeedija, em Wikiwööterbooch
 			if ( preg_match( '/ b/', $case ) ) {
-				$word = 'en '.( $gender == 'f' ? 'dä' : 'däm' ) . ' ' . $word;
+				$word = 'en ' . ( $gender == 'f' ? 'dä' : 'däm' ) . ' ' . $word;
 			} else {
 				$word = ( $gender == 'f' ? 'en de' : 'em' ) . ' ' . $word;
 			}
@@ -124,13 +124,13 @@ class LanguageKsh extends Language {
 			if ( preg_match( '/ b/', $case ) ) {
 				$word = 'vun ' . ( $gender == 'f' ? 'dä' : 'däm' ) . ' ' . $word;
 			} else {
-				$word = ( $gender== 'f' ? 'vun de' : 'vum' ) . ' ' . $word;
+				$word = ( $gender == 'f' ? 'vun de' : 'vum' ) . ' ' . $word;
 			}
 		} elseif ( preg_match( '/ [3d]/', $case ) ) {
 			# dämm WikiMaatPlaz, dä Wikipeedija, dämm Wikiwööterbooch
 			# dem/em WikiMaatplaz, de Wikipeedija, dem/em Wikiwööterbooch
 			if ( preg_match( '/ b/', $case ) ) {
-				$word = ( $gender == 'f' ? 'dää' : 'dämm' ) .' ' . $word;
+				$word = ( $gender == 'f' ? 'dää' : 'dämm' ) . ' ' . $word;
 			} else {
 				$word = ( $gender == 'f' ? 'de' : 'dem' ) . ' ' . $word;
 			}
@@ -141,7 +141,7 @@ class LanguageKsh extends Language {
 				switch ( $gender ) {
 					case 'm':
 						$lord = 'dä';
-						break ;
+						break;
 					case 'f':
 						$lord = 'di';
 						break;
@@ -160,7 +160,7 @@ class LanguageKsh extends Language {
 						$lord = 'et';
 				}
 			}
-			$word = $lord.' '.$word;
+			$word = $lord . ' ' . $word;
 		}
 		return $word;
 	}
@@ -189,7 +189,9 @@ class LanguageKsh extends Language {
 	 * @return string
 	 */
 	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
+		if ( !count( $forms ) ) {
+			return '';
+		}
 		$forms = $this->preConvertPlural( $forms, 3 );
 
 		if ( $count == 1 ) {
diff --git a/languages/classes/LanguageKu.php b/languages/classes/LanguageKu.php
index 56a52ccb..75ac1c77 100644
--- a/languages/classes/LanguageKu.php
+++ b/languages/classes/LanguageKu.php
@@ -21,8 +21,8 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageKu_ku.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageKu_ku.php';
 
 /**
  * Kurdish converter routines
@@ -41,23 +41,23 @@ class KuConverter extends LanguageConverter {
 
 		/* Doppel- und Halbvokale */
 		'ڵ' => 'll', # ll
-		'ڕ'  => 'rr', # rr
-		'ا'  => 'a',
+		'ڕ' => 'rr', # rr
+		'ا' => 'a',
 		# 'ئێ' => 'ê', # initial e
-		'ە'  => 'e',
-		'ه‌'  => 'e', # with one non-joiner
-		'ه‌‌'  => 'e', # with two non-joiner
-		'ة'  => 'e',
+		'ە' => 'e',
+		'ه‌' => 'e', # with one non-joiner
+		'ه‌‌' => 'e', # with two non-joiner
+		'ة' => 'e',
 		'ێ' => 'ê',
-		'ي'  => 'î',
-		'ی'  => 'î', # U+06CC  db 8c  ARABIC LETTER FARSI YEH
-		'ى'  => 'î', # U+0649  d9 89  ARABIC LETTER ALEF MAKSURA
-		'ۆ'  => 'o',
-		'و'  => 'w',
-		'ئ'  => '', # initial hemze should not be shown
-		'،'  => ',',
-		'ع'  => '\'', # ayn
-		'؟'  => '?',
+		'ي' => 'î',
+		'ی' => 'î', # U+06CC  db 8c  ARABIC LETTER FARSI YEH
+		'ى' => 'î', # U+0649  d9 89  ARABIC LETTER ALEF MAKSURA
+		'ۆ' => 'o',
+		'و' => 'w',
+		'ئ' => '', # initial hemze should not be shown
+		'،' => ',',
+		'ع' => '\'', # ayn
+		'؟' => '?',
 
 		# digits
 		'٠' => '0', # &#x0660;
@@ -113,13 +113,13 @@ class KuConverter extends LanguageConverter {
 		' o' => 'ئۆ ',
 		' u' => 'ئو ',
 		' û' => 'ئوو ',
-		'A'  => 'ئا',
-		'E'  => 'ئە',
-		'Ê'  => 'ئێ',
-		'Î'  => 'ئی',
-		'O'  => 'ئۆ',
-		'U'  => 'ئو',
-		'Û'  => 'ئوو',
+		'A' => 'ئا',
+		'E' => 'ئە',
+		'Ê' => 'ئێ',
+		'Î' => 'ئی',
+		'O' => 'ئۆ',
+		'U' => 'ئو',
+		'Û' => 'ئوو',
 		' A' => 'ئا ',
 		' E' => 'ئە ',
 		' Ê' => 'ئێ ',
@@ -149,7 +149,7 @@ class KuConverter extends LanguageConverter {
 		$this->mTables = array(
 			'ku-latn' => new ReplacementArray( $this->mArabicToLatin ),
 			'ku-arab' => new ReplacementArray( $this->mLatinToArabic ),
-			'ku'      => new ReplacementArray()
+			'ku' => new ReplacementArray()
 		);
 	}
 
@@ -167,14 +167,16 @@ class KuConverter extends LanguageConverter {
 		// check for user namespace
 		if ( is_object( $nt ) ) {
 			$ns = $nt->getNamespace();
-			if ( $ns == NS_USER || $ns == NS_USER_TALK )
+			if ( $ns == NS_USER || $ns == NS_USER_TALK ) {
 				return;
+			}
 		}
 
 		$oldlink = $link;
 		parent::findVariantLink( $link, $nt, $ignoreOtherCond );
-		if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+		if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
 			$link = $oldlink;
+		}
 	}
 
 	/**
@@ -188,9 +190,11 @@ class KuConverter extends LanguageConverter {
 	 */
 	function autoConvert( $text, $toVariant = false ) {
 		global $wgTitle;
-		if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+		if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
 			$imagename = $wgTitle->getNsText();
-			if ( preg_match( "/^$imagename:/", $text ) ) return $text;
+			if ( preg_match( "/^$imagename:/", $text ) ) {
+				return $text;
+			}
 		}
 		return parent::autoConvert( $text, $toVariant );
 	}
@@ -253,7 +257,7 @@ class LanguageKu extends LanguageKu_ku {
 
 		$variants = array( 'ku', 'ku-arab', 'ku-latn' );
 		$variantfallbacks = array(
-			'ku'      => 'ku-latn',
+			'ku' => 'ku-latn',
 			'ku-arab' => 'ku-latn',
 			'ku-latn' => 'ku-arab',
 		);
diff --git a/languages/classes/LanguageLa.php b/languages/classes/LanguageLa.php
index ba0f1404..9c778782 100644
--- a/languages/classes/LanguageLa.php
+++ b/languages/classes/LanguageLa.php
@@ -49,54 +49,60 @@ class LanguageLa extends Language {
 		switch ( $case ) {
 		case 'genitive':
 			// only a few declensions, and even for those mostly the singular only
-			$in  = array(	'/u[ms]$/',                	# 2nd declension singular
-					'/ommunia$/',              	# 3rd declension neuter plural (partly)
-					'/a$/',                    	# 1st declension singular
-					'/libri$/', '/nuntii$/',   	# 2nd declension plural (partly)
-					'/tio$/', '/ns$/', '/as$/',	# 3rd declension singular (partly)
-					'/es$/'                    	# 5th declension singular
-					);
-			$out = array(	'i',
-					'ommunium',
-					'ae',
-					'librorum', 'nuntiorum',
-					'tionis', 'ntis', 'atis',
-					'ei'
-					);
+			$in = array(
+				'/u[ms]$/',                	# 2nd declension singular
+				'/ommunia$/',              	# 3rd declension neuter plural (partly)
+				'/a$/',                    	# 1st declension singular
+				'/libri$/', '/nuntii$/',   	# 2nd declension plural (partly)
+				'/tio$/', '/ns$/', '/as$/',	# 3rd declension singular (partly)
+				'/es$/'                    	# 5th declension singular
+			);
+			$out = array(
+				'i',
+				'ommunium',
+				'ae',
+				'librorum', 'nuntiorum',
+				'tionis', 'ntis', 'atis',
+				'ei'
+			);
 			return preg_replace( $in, $out, $word );
 		case 'accusative':
 			// only a few declensions, and even for those mostly the singular only
-			$in  = array(	'/u[ms]$/',                	# 2nd declension singular
-					'/a$/',                    	# 1st declension singular
-					'/ommuniam$/',              	# 3rd declension neuter plural (partly)
-					'/libri$/', '/nuntii$/',   	# 2nd declension plural (partly)
-					'/tio$/', '/ns$/', '/as$/',	# 3rd declension singular (partly)
-					'/es$/'                    	# 5th declension singular
-					);
-			$out = array(	'um',
-					'am',
-					'ommunia',
-					'libros', 'nuntios',
-					'tionem', 'ntem', 'atem',
-					'em'
-					);
+			$in = array(
+				'/u[ms]$/',                	# 2nd declension singular
+				'/a$/',                    	# 1st declension singular
+				'/ommuniam$/',              # 3rd declension neuter plural (partly)
+				'/libri$/', '/nuntii$/',   	# 2nd declension plural (partly)
+				'/tio$/', '/ns$/', '/as$/',	# 3rd declension singular (partly)
+				'/es$/'                    	# 5th declension singular
+			);
+			$out = array(
+				'um',
+				'am',
+				'ommunia',
+				'libros', 'nuntios',
+				'tionem', 'ntem', 'atem',
+				'em'
+			);
 			return preg_replace( $in, $out, $word );
 		case 'ablative':
 			// only a few declensions, and even for those mostly the singular only
-			$in  = array(	'/u[ms]$/',                	# 2nd declension singular
-					'/ommunia$/',              	# 3rd declension neuter plural (partly)
-					'/a$/',                    	# 1st declension singular
-					'/libri$/', '/nuntii$/',   	# 2nd declension plural (partly)
-					'/tio$/', '/ns$/', '/as$/',	# 3rd declension singular (partly)
-					'/es$/'                    	# 5th declension singular
-					);
-			$out = array(	'o',
-					'ommunibus',
-					'a',
-					'libris', 'nuntiis',
-					'tione', 'nte', 'ate',
-					'e'
-					);
+			$in = array(
+				'/u[ms]$/',                	# 2nd declension singular
+				'/ommunia$/',              	# 3rd declension neuter plural (partly)
+				'/a$/',                    	# 1st declension singular
+				'/libri$/', '/nuntii$/',   	# 2nd declension plural (partly)
+				'/tio$/', '/ns$/', '/as$/',	# 3rd declension singular (partly)
+				'/es$/'                    	# 5th declension singular
+			);
+			$out = array(
+				'o',
+				'ommunibus',
+				'a',
+				'libris', 'nuntiis',
+				'tione', 'nte', 'ate',
+				'e'
+			);
 			return preg_replace( $in, $out, $word );
 		default:
 			return $word;
diff --git a/languages/classes/LanguageMg.php b/languages/classes/LanguageMg.php
deleted file mode 100644
index ace0a4c3..00000000
--- a/languages/classes/LanguageMg.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Malagasy (Malagasy) specific code.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Malagasy (Malagasy)
- *
- * @ingroup Language
- */
-class LanguageMg extends Language {
-	/**
-	 * Use singular form for zero
-	 *
-	 * @param $count int
-	 * @param $forms array
-	 *
-	 * @return string
-	 */
-	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
-		$forms = $this->preConvertPlural( $forms, 2 );
-
-		return ( $count <= 1 ) ? $forms[0] : $forms[1];
-	}
-}
diff --git a/languages/classes/LanguageMk.php b/languages/classes/LanguageMk.php
deleted file mode 100644
index 968fe265..00000000
--- a/languages/classes/LanguageMk.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/**
- * Macedonian (Македонски) specific code.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Macedonian (Македонски)
- *
- * @ingroup Language
- */
-class LanguageMk extends Language {
-	/**
-	 * Plural forms per
-	 * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#mk
-	 *
-	 * @param $count int
-	 * @param $forms array
-	 *
-	 * @return string
-	 */
-	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
-		$forms = $this->preConvertPlural( $forms, 2 );
-		// TODO CLDR defines forms[0] for n != 11 and not for n%100 !== 11
-		if ( $count % 10 === 1 && $count % 100 !== 11 ) {
-			return $forms[0];
-		} else {
-			return $forms[1];
-		}
-	}
-}
diff --git a/languages/classes/LanguageMt.php b/languages/classes/LanguageMt.php
deleted file mode 100644
index 68bd7ca9..00000000
--- a/languages/classes/LanguageMt.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-/**
- * Maltese (Malti) specific code.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Niklas Laxström
- * @ingroup Language
- */
-
-/**
- * Maltese (Malti)
- *
- * @ingroup Language
- */
-class LanguageMt extends Language {
-
-	/**
-	 * @param $count int
-	 * @param $forms array
-	 * @return string
-	 */
-	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
-
-		$forms = $this->preConvertPlural( $forms, 4 );
-
-		if ( $count == 1 ) $index = 0;
-		elseif ( $count == 0 || ( $count % 100 > 1 && $count % 100 < 11 ) ) $index = 1;
-		elseif ( $count % 100 > 10 && $count % 100 < 20 ) $index = 2;
-		else $index = 3;
-		return $forms[$index];
-	}
-}
diff --git a/languages/classes/LanguageNso.php b/languages/classes/LanguageNso.php
deleted file mode 100644
index 0c086750..00000000
--- a/languages/classes/LanguageNso.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Northern Sotho (Sesotho sa Leboa) specific code.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Northern Sotho (Sesotho sa Leboa)
- *
- * @ingroup Language
- */
-class LanguageNso extends Language {
-	/**
-	 * Use singular form for zero
-	 *
-	 * @param $count int
-	 * @param $forms array
-	 *
-	 * @return string
-	 */
-	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
-		$forms = $this->preConvertPlural( $forms, 2 );
-
-		return ( $count <= 1 ) ? $forms[0] : $forms[1];
-	}
-}
diff --git a/languages/classes/LanguageOs.php b/languages/classes/LanguageOs.php
index a808840f..f37e2d54 100644
--- a/languages/classes/LanguageOs.php
+++ b/languages/classes/LanguageOs.php
@@ -81,27 +81,41 @@ class LanguageOs extends Language {
 		# Checking if $word ends on 'у'. 'У' can be either consonant 'W' or vowel 'U' in cyrillic Ossetic.
 		# Examples: {{grammar:genitive|аунеу}} = аунеуы, {{grammar:genitive|лæппу}} = лæппуйы.
 		elseif ( preg_match( "/у$/u", $word ) ) {
-			if ( !preg_match( "/[аæеёиоыэюя]$/u", mb_substr( $word, -2, 1 ) ) )
+			if ( !preg_match( "/[аæеёиоыэюя]$/u", mb_substr( $word, -2, 1 ) ) ) {
 				$jot = 'й';
+			}
 		} elseif ( !preg_match( "/[бвгджзйклмнопрстфхцчшщьъ]$/u", $word ) ) {
 			$hyphen = '-';
 		}
 
 		switch ( $case ) {
-			case 'genitive': $ending = $hyphen . $jot . 'ы'; break;
-			case 'dative': $ending = $hyphen . $jot . 'æн'; break;
-			case 'allative': $ending = $hyphen . $end_allative; break;
+			case 'genitive':
+				$ending = $hyphen . $jot . 'ы';
+				break;
+			case 'dative':
+				$ending = $hyphen . $jot . 'æн';
+				break;
+			case 'allative':
+				$ending = $hyphen . $end_allative;
+				break;
 			case 'ablative':
 				if ( $jot == 'й' ) {
-					$ending = $hyphen . $jot . 'æ'; break;
+					$ending = $hyphen . $jot . 'æ';
+				} else {
+					$ending = $hyphen . $jot . 'æй';
 				}
-				else {
-					$ending = $hyphen . $jot . 'æй'; break;
-				}
-			case 'inessive': break;
-			case 'superessive': $ending = $hyphen . $jot . 'ыл'; break;
-			case 'equative': $ending = $hyphen . $jot . 'ау'; break;
-			case 'comitative': $ending = $hyphen . 'имæ'; break;
+				break;
+			case 'inessive':
+				break;
+			case 'superessive':
+				$ending = $hyphen . $jot . 'ыл';
+				break;
+			case 'equative':
+				$ending = $hyphen . $jot . 'ау';
+				break;
+			case 'comitative':
+				$ending = $hyphen . 'имæ';
+				break;
 		}
 		return $word . $ending;
 	}
diff --git a/languages/classes/LanguagePl.php b/languages/classes/LanguagePl.php
index 68bf0208..8e286c94 100644
--- a/languages/classes/LanguagePl.php
+++ b/languages/classes/LanguagePl.php
@@ -27,31 +27,6 @@
  * @ingroup Language
  */
 class LanguagePl extends Language {
-
-	/**
-	 * @param $count string
-	 * @param $forms array
-	 * @return string
-	 */
-	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
-		$forms = $this->preConvertPlural( $forms, 3 );
-		$count = abs( $count );
-		if ( $count == 1 ) {
-			return $forms[0]; // singular
-		}
-		switch ( $count % 10 ) {
-			case 2:
-			case 3:
-			case 4:
-				if ( $count / 10 % 10 != 1 ) {
-					return $forms[1]; // plural
-				}
-			default:
-				return $forms[2];   // plural genitive
-		}
-	}
-
 	/**
 	 * @param $_ string
 	 * @return string
diff --git a/languages/classes/LanguageSh.php b/languages/classes/LanguageSh.php
deleted file mode 100644
index 1fcddfc1..00000000
--- a/languages/classes/LanguageSh.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * Serbo-Croatian (Srpskohrvatski / Српскохрватски) specific code.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Serbo-Croatian (Srpskohrvatski / Српскохрватски)
- *
- * @ingroup Language
- */
-class LanguageSh extends Language {
-
-	/**
-	 * @param $count string
-	 * @param $forms array
-	 * @return string
-	 */
-	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
-
-		// if no number with word, then use $form[0] for singular and $form[1] for plural or zero
-		if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
-
-		// @todo FIXME: CLDR defines 4 plural forms. Form with decimals missing.
-		// See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#sh
-		$forms = $this->preConvertPlural( $forms, 3 );
-
-		if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
-			return $forms[2];
-		} else {
-			switch ( $count % 10 ) {
-				case 1:  return $forms[0];
-				case 2:
-				case 3:
-				case 4:  return $forms[1];
-				default: return $forms[2];
-			}
-		}
-	}
-}
diff --git a/languages/classes/LanguageShi.php b/languages/classes/LanguageShi.php
index 5ddcfdef..f4180cb8 100644
--- a/languages/classes/LanguageShi.php
+++ b/languages/classes/LanguageShi.php
@@ -21,7 +21,7 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
 
 /**
  * Conversion script between Latin and Tifinagh for Tachelhit.
@@ -42,25 +42,25 @@ class ShiConverter extends LanguageConverter {
 	public $mToLatin = array(
 		'ⴰ' => 'a', 'ⴱ' => 'b', 'ⴳ' => 'g', 'ⴷ' => 'd', 'ⴹ' => 'ḍ', 'ⴻ' => 'e',
 		'ⴼ' => 'f', 'ⴽ' => 'k', 'ⵀ' => 'h', 'ⵃ' => 'ḥ', 'ⵄ' => 'ε', 'ⵅ' => 'x',
-		'ⵇ' => 'q', 'ⵉ' => 'i', 'ⵊ' => 'j',  'ⵍ' => 'l', 'ⵎ' => 'm', 'ⵏ' => 'n',
+		'ⵇ' => 'q', 'ⵉ' => 'i', 'ⵊ' => 'j', 'ⵍ' => 'l', 'ⵎ' => 'm', 'ⵏ' => 'n',
 		'ⵓ' => 'u', 'ⵔ' => 'r', 'ⵕ' => 'ṛ', 'ⵖ' => 'γ', 'ⵙ' => 's', 'ⵚ' => 'ṣ',
 		'ⵛ' => 'š', 'ⵜ' => 't', 'ⵟ' => 'ṭ', 'ⵡ' => 'w', 'ⵢ' => 'y', 'ⵣ' => 'z',
 		'ⵥ' => 'ẓ', 'ⵯ' => 'ʷ', 'ⵖ' => 'ɣ', 'ⵠ' => 'v', 'ⵒ' => 'p',
 	);
 
 	public $mUpperToLowerCaseLatin = array(
-		'A' => 'a',	'B' => 'b',	'C' => 'c',	'D' => 'd',	'E' => 'e',
-		'F' => 'f',	'G' => 'g',	'H' => 'h',	'I' => 'i',	'J' => 'j',
-		'K' => 'k',	'L' => 'l',	'M' => 'm',	'N' => 'n',	'O' => 'o',
-		'P' => 'p',	'Q' => 'q',	'R' => 'r',	'S' => 's',	'T' => 't',
-		'U' => 'u',	'V' => 'v',	'W' => 'w',	'X' => 'x',	'Y' => 'y',
+		'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e',
+		'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j',
+		'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o',
+		'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't',
+		'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y',
 		'Z' => 'z', 'Ɣ' => 'ɣ',
 	);
 
 	public $mToTifinagh = array(
 		'a' => 'ⴰ', 'b' => 'ⴱ', 'g' => 'ⴳ', 'd' => 'ⴷ', 'ḍ' => 'ⴹ', 'e' => 'ⴻ',
 		'f' => 'ⴼ', 'k' => 'ⴽ', 'h' => 'ⵀ', 'ḥ' => 'ⵃ', 'ε' => 'ⵄ', 'x' => 'ⵅ',
-		'q' => 'ⵇ', 'i' => 'ⵉ', 'j' => 'ⵊ',  'l' => 'ⵍ', 'm' => 'ⵎ', 'n' => 'ⵏ',
+		'q' => 'ⵇ', 'i' => 'ⵉ', 'j' => 'ⵊ', 'l' => 'ⵍ', 'm' => 'ⵎ', 'n' => 'ⵏ',
 		'u' => 'ⵓ', 'r' => 'ⵔ', 'ṛ' => 'ⵕ', 'γ' => 'ⵖ', 's' => 'ⵙ', 'ṣ' => 'ⵚ',
 		'š' => 'ⵛ', 't' => 'ⵜ', 'ṭ' => 'ⵟ', 'w' => 'ⵡ', 'y' => 'ⵢ', 'z' => 'ⵣ',
 		'ẓ' => 'ⵥ', 'ʷ' => 'ⵯ', 'ɣ' => 'ⵖ', 'v' => 'ⵠ', 'p' => 'ⵒ',
@@ -71,7 +71,7 @@ class ShiConverter extends LanguageConverter {
 			'lowercase' => new ReplacementArray( $this->mUpperToLowerCaseLatin ),
 			'shi-tfng' => new ReplacementArray( $this->mToTifinagh ),
 			'shi-latn' => new ReplacementArray( $this->mToLatin ),
-			'shi'    => new ReplacementArray()
+			'shi' => new ReplacementArray()
 		);
 	}
 
@@ -123,17 +123,19 @@ class ShiConverter extends LanguageConverter {
 	 * @param $ignoreOtherCond bool
 	 */
 	function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
-		 // check for user namespace
+		// check for user namespace
 		if ( is_object( $nt ) ) {
 			$ns = $nt->getNamespace();
-			if ( $ns == NS_USER || $ns == NS_USER_TALK )
+			if ( $ns == NS_USER || $ns == NS_USER_TALK ) {
 				return;
+			}
 		}
 
 		$oldlink = $link;
 		parent::findVariantLink( $link, $nt, $ignoreOtherCond );
-		if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+		if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
 			$link = $oldlink;
+		}
 	}
 
 	/**
@@ -147,9 +149,11 @@ class ShiConverter extends LanguageConverter {
 	 */
 	function autoConvert( $text, $toVariant = false ) {
 		global $wgTitle;
-		if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+		if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
 			$imagename = $wgTitle->getNsText();
-			if ( preg_match( "/^$imagename:/", $text ) ) return $text;
+			if ( preg_match( "/^$imagename:/", $text ) ) {
+				return $text;
+			}
 		}
 		return parent::autoConvert( $text, $toVariant );
 	}
@@ -168,7 +172,7 @@ class ShiConverter extends LanguageConverter {
 		if ( trim( $text ) ) {
 			$this->loadTables();
 			// To Tifinagh, first translate uppercase to lowercase Latin
-			if( $toVariant == 'shi-tfng' ) {
+			if ( $toVariant == 'shi-tfng' ) {
 				$text = $this->mTables['lowercase']->replace( $text );
 			}
 			$text = $this->mTables[$toVariant]->replace( $text );
@@ -190,7 +194,7 @@ class LanguageShi extends Language {
 
 		$variants = array( 'shi', 'shi-tfng', 'shi-latn' );
 		$variantfallbacks = array(
-			'shi'    => 'shi-tfng',
+			'shi' => 'shi-tfng',
 			'shi-tfng' => 'shi',
 			'shi-latn' => 'shi',
 		);
diff --git a/languages/classes/LanguageSk.php b/languages/classes/LanguageSk.php
deleted file mode 100644
index b1da70e6..00000000
--- a/languages/classes/LanguageSk.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/**
- * Slovak (Slovenčina) specific code.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Slovak (Slovenčina)
- *
- * @ingroup Language
- */
-class LanguageSk extends Language {
-
-	/**
-	 * @param $count int
-	 * @param $forms array
-	 * @return string
-	 */
-	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
-		$forms = $this->preConvertPlural( $forms, 3 );
-
-		if ( $count == 1 ) {
-			$index = 0;
-		} elseif ( $count == 2 || $count == 3 || $count == 4 ) {
-			$index = 1;
-		} else {
-			$index = 2;
-		}
-		return $forms[$index];
-	}
-}
diff --git a/languages/classes/LanguageSl.php b/languages/classes/LanguageSl.php
index c075e515..06c75c95 100644
--- a/languages/classes/LanguageSl.php
+++ b/languages/classes/LanguageSl.php
@@ -45,35 +45,14 @@ class LanguageSl extends Language {
 
 		switch ( $case ) {
 			case 'mestnik': # locative
-				$word = 'o ' . $word; break;
+				$word = 'o ' . $word;
+				break;
 			case 'orodnik': # instrumental
 				$word = 'z ' . $word;
+				break;
 		}
 
 		return $word; # this will return the original value for 'imenovalnik' (nominativ) and all undefined case values
 	}
 
-	/**
-	 * @param $count int
-	 * @param $forms array
-	 *
-	 * @return string
-	 */
-	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
-		$forms = $this->preConvertPlural( $forms, 5 );
-
-		if ( $count % 100 == 1 ) {
-			$index = 0;
-		} elseif ( $count % 100 == 2 ) {
-			$index = 1;
-		} elseif ( $count % 100 == 3 || $count % 100 == 4 ) {
-			$index = 2;
-		} elseif ( $count != 0 ) {
-			$index = 3;
-		} else {
-			$index = 4;
-		}
-		return $forms[$index];
-	}
 }
diff --git a/languages/classes/LanguageSr.php b/languages/classes/LanguageSr.php
index 55aec32e..6f0ff4b5 100644
--- a/languages/classes/LanguageSr.php
+++ b/languages/classes/LanguageSr.php
@@ -21,9 +21,9 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageSr_ec.php' );
-require_once( __DIR__ . '/LanguageSr_el.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageSr_ec.php';
+require_once __DIR__ . '/LanguageSr_el.php';
 
 /**
  * There are two levels of conversion for Serbian: the script level
@@ -75,7 +75,7 @@ class SrConverter extends LanguageConverter {
 		$this->mTables = array(
 			'sr-ec' => new ReplacementArray( $this->mToCyrillics ),
 			'sr-el' => new ReplacementArray( $this->mToLatin ),
-			'sr'    => new ReplacementArray()
+			'sr' => new ReplacementArray()
 		);
 	}
 
@@ -118,14 +118,16 @@ class SrConverter extends LanguageConverter {
 		// check for user namespace
 		if ( is_object( $nt ) ) {
 			$ns = $nt->getNamespace();
-			if ( $ns == NS_USER || $ns == NS_USER_TALK )
+			if ( $ns == NS_USER || $ns == NS_USER_TALK ) {
 				return;
+			}
 		}
 
 		$oldlink = $link;
 		parent::findVariantLink( $link, $nt, $ignoreOtherCond );
-		if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+		if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
 			$link = $oldlink;
+		}
 	}
 
 	/**
@@ -139,9 +141,11 @@ class SrConverter extends LanguageConverter {
 	 */
 	function autoConvert( $text, $toVariant = false ) {
 		global $wgTitle;
-		if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+		if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
 			$imagename = $wgTitle->getNsText();
-			if ( preg_match( "/^$imagename:/", $text ) ) return $text;
+			if ( preg_match( "/^$imagename:/", $text ) ) {
+				return $text;
+			}
 		}
 		return parent::autoConvert( $text, $toVariant );
 	}
@@ -194,13 +198,13 @@ class SrConverter extends LanguageConverter {
 	 * @since 1.19
 	 */
 	public function guessVariant( $text, $variant ) {
-		$numCyrillic = preg_match_all("/[шђчћжШЂЧЋЖ]/u", $text, $dummy);
-		$numLatin = preg_match_all("/[šđčćžŠĐČĆŽ]/u", $text, $dummy);
+		$numCyrillic = preg_match_all( "/[шђчћжШЂЧЋЖ]/u", $text, $dummy );
+		$numLatin = preg_match_all( "/[šđčćžŠĐČĆŽ]/u", $text, $dummy );
 
-		if( $variant == 'sr-ec' ) {
-			return (boolean) ($numCyrillic > $numLatin);
-		} elseif( $variant == 'sr-el' ) {
-			return (boolean) ($numLatin > $numCyrillic);
+		if ( $variant == 'sr-ec' ) {
+			return $numCyrillic > $numLatin;
+		} elseif ( $variant == 'sr-el' ) {
+			return $numLatin > $numCyrillic;
 		} else {
 			return false;
 		}
@@ -222,14 +226,14 @@ class LanguageSr extends LanguageSr_ec {
 
 		$variants = array( 'sr', 'sr-ec', 'sr-el' );
 		$variantfallbacks = array(
-			'sr'    => 'sr-ec',
+			'sr' => 'sr-ec',
 			'sr-ec' => 'sr',
 			'sr-el' => 'sr',
 		);
 
 		$flags = array(
 			'S' => 'S', 'писмо' => 'S', 'pismo' => 'S',
-			'W' => 'W', 'реч'   => 'W', 'reč'   => 'W', 'ријеч' => 'W', 'riječ' => 'W'
+			'W' => 'W', 'реч' => 'W', 'reč' => 'W', 'ријеч' => 'W', 'riječ' => 'W'
 		);
 		$this->mConverter = new SrConverter( $this, 'sr', $variants, $variantfallbacks, $flags );
 		$wgHooks['PageContentSaveComplete'][] = $this->mConverter;
@@ -262,10 +266,10 @@ class LanguageSr extends LanguageSr_ec {
 			return $forms[2];
 		} else {
 			switch ( $count % 10 ) {
-				case 1:  return $forms[0];
+				case 1: return $forms[0];
 				case 2:
 				case 3:
-				case 4:  return $forms[1];
+				case 4: return $forms[1];
 				default: return $forms[2];
 			}
 		}
diff --git a/languages/classes/LanguageSr_ec.php b/languages/classes/LanguageSr_ec.php
index 352e2930..cb9e8191 100644
--- a/languages/classes/LanguageSr_ec.php
+++ b/languages/classes/LanguageSr_ec.php
@@ -34,17 +34,19 @@ class LanguageSr_ec extends Language {
 	 * @return string
 	 */
 	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
+		if ( !count( $forms ) ) {
+			return '';
+		}
 		$forms = $this->preConvertPlural( $forms, 3 );
 
 		if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
 			return $forms[2];
 		} else {
 			switch ( $count % 10 ) {
-				case 1:  return $forms[0];
+				case 1: return $forms[0];
 				case 2:
 				case 3:
-				case 4:  return $forms[1];
+				case 4: return $forms[1];
 				default: return $forms[2];
 			}
 		}
diff --git a/languages/classes/LanguageSr_el.php b/languages/classes/LanguageSr_el.php
index 0e36d6c3..99d12935 100644
--- a/languages/classes/LanguageSr_el.php
+++ b/languages/classes/LanguageSr_el.php
@@ -34,17 +34,19 @@ class LanguageSr_el extends Language {
 	 * @return string
 	 */
 	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
+		if ( !count( $forms ) ) {
+			return '';
+		}
 		$forms = $this->preConvertPlural( $forms, 3 );
 
 		if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
 			return $forms[2];
 		} else {
 			switch ( $count % 10 ) {
-				case 1:  return $forms[0];
+				case 1: return $forms[0];
 				case 2:
 				case 3:
-				case 4:  return $forms[1];
+				case 4: return $forms[1];
 				default: return $forms[2];
 			}
 		}
diff --git a/languages/classes/LanguageTg.php b/languages/classes/LanguageTg.php
index 3ec14763..10755b48 100644
--- a/languages/classes/LanguageTg.php
+++ b/languages/classes/LanguageTg.php
@@ -21,7 +21,7 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
 
 /**
  * Converts Tajiki to latin orthography
@@ -108,7 +108,7 @@ class TgConverter extends LanguageConverter {
 	function loadDefaultTables() {
 		$this->mTables = array(
 			'tg-latn' => new ReplacementArray( $this->table ),
-			'tg'      => new ReplacementArray()
+			'tg' => new ReplacementArray()
 		);
 	}
 
diff --git a/languages/classes/LanguageTi.php b/languages/classes/LanguageTi.php
deleted file mode 100644
index 27331cc9..00000000
--- a/languages/classes/LanguageTi.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Tigrinya (ትግርኛ) specific code.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Tigrinya (ትግርኛ)
- *
- * @ingroup Language
- */
-class LanguageTi extends Language {
-	/**
-	 * Use singular form for zero
-	 *
-	 * @param $count int
-	 * @param $forms array
-	 *
-	 * @return string
-	 */
-	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
-		$forms = $this->preConvertPlural( $forms, 2 );
-
-		return ( $count <= 1 ) ? $forms[0] : $forms[1];
-	}
-}
diff --git a/languages/classes/LanguageTl.php b/languages/classes/LanguageTl.php
deleted file mode 100644
index 15bce760..00000000
--- a/languages/classes/LanguageTl.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Tagalog (Tagalog) specific code.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Tagalog (Tagalog)
- *
- * @ingroup Language
- */
-class LanguageTl extends Language {
-	/**
-	 * Use singular form for zero
-	 *
-	 * @param $count int
-	 * @param $forms array
-	 *
-	 * @return string
-	 */
-	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
-		$forms = $this->preConvertPlural( $forms, 2 );
-
-		return ( $count <= 1 ) ? $forms[0] : $forms[1];
-	}
-}
diff --git a/languages/classes/LanguageTr.php b/languages/classes/LanguageTr.php
index 6a015667..887f05c8 100644
--- a/languages/classes/LanguageTr.php
+++ b/languages/classes/LanguageTr.php
@@ -38,7 +38,7 @@ class LanguageTr extends Language {
 	 * @param $string string
 	 * @return string
 	 */
-	function ucfirst ( $string ) {
+	function ucfirst( $string ) {
 		if ( strlen( $string ) && $string[0] == 'i' ) {
 			return 'İ' . substr( $string, 1 );
 		} else {
@@ -50,7 +50,7 @@ class LanguageTr extends Language {
 	 * @param $string string
 	 * @return mixed|string
 	 */
-	function lcfirst ( $string ) {
+	function lcfirst( $string ) {
 		if ( strlen( $string ) && $string[0] == 'I' ) {
 			return 'ı' . substr( $string, 1 );
 		} else {
diff --git a/languages/classes/LanguageTyv.php b/languages/classes/LanguageTyv.php
index 6d147c87..fc1e8a81 100644
--- a/languages/classes/LanguageTyv.php
+++ b/languages/classes/LanguageTyv.php
@@ -150,7 +150,7 @@ class LanguageTyv extends Language {
 						$word = implode( "", $ar[0] ) . "ты";
 					} else {
 					}
-				} elseif ( $wordEnding === "л"  || $wordEnding === "l" ) {
+				} elseif ( $wordEnding === "л" || $wordEnding === "l" ) {
 					if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
 						$word = implode( "", $ar[0] ) . "дү";
 					} elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
diff --git a/languages/classes/LanguageUk.php b/languages/classes/LanguageUk.php
index ce9ed33c..4ad272ba 100644
--- a/languages/classes/LanguageUk.php
+++ b/languages/classes/LanguageUk.php
@@ -48,32 +48,32 @@ class LanguageUk extends Language {
 		# join and array_slice instead mb_substr
 		$ar = array();
 		preg_match_all( '/./us', $word, $ar );
-		if ( !preg_match( "/[a-zA-Z_]/us", $word ) )
+		if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
 			switch ( $case ) {
 				case 'genitive': # родовий відмінок
-					if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вікі' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' ) )
-						{ }
-					elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'ь' )
+					if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вікі' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' ) ) {
+					} elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'ь' ) {
 						$word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'я';
-					elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ія' )
+					} elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ія' ) {
 						$word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ії';
-					elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ка' )
+					} elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ка' ) {
 						$word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ки';
-					elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ти' )
+					} elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ти' ) {
 						$word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'тей';
-					elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ди' )
+					} elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ди' ) {
 						$word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'дів';
-					elseif ( join( '', array_slice( $ar[0], -3 ) ) == 'ник' )
+					} elseif ( join( '', array_slice( $ar[0], -3 ) ) == 'ник' ) {
 						$word = join( '', array_slice( $ar[0], 0, -3 ) ) . 'ника';
+					}
 					break;
 				case 'dative':  # давальний відмінок
 					# stub
 					break;
 				case 'accusative': # знахідний відмінок
-					if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вікі' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' ) )
-						{ }
-					elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ія' )
+					if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вікі' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' ) ) {
+					} elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ія' ) {
 						$word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ію';
+					}
 					break;
 				case 'instrumental':  # орудний відмінок
 					# stub
@@ -82,6 +82,7 @@ class LanguageUk extends Language {
 					# stub
 					break;
 			}
+		}
 		return $word;
 	}
 
@@ -91,13 +92,17 @@ class LanguageUk extends Language {
 	 * @return string
 	 */
 	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
+		if ( !count( $forms ) ) {
+			return '';
+		}
 
 		// If the actual number is not mentioned in the expression, then just two forms are enough:
 		// singular for $count == 1
 		// plural   for $count != 1
 		// For example, "This user belongs to {{PLURAL:$1|one group|several groups}}."
-		if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+		if ( count( $forms ) === 2 ) {
+			return $count == 1 ? $forms[0] : $forms[1];
+		}
 
 		// @todo FIXME: CLDR defines 4 plural forms. Form for decimals is missing/
 		// See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#uk
@@ -107,10 +112,10 @@ class LanguageUk extends Language {
 			return $forms[2];
 		} else {
 			switch ( $count % 10 ) {
-				case 1:  return $forms[0];
+				case 1: return $forms[0];
 				case 2:
 				case 3:
-				case 4:  return $forms[1];
+				case 4: return $forms[1];
 				default: return $forms[2];
 			}
 		}
diff --git a/languages/classes/LanguageUz.php b/languages/classes/LanguageUz.php
index a2c917cd..aa3e4f24 100644
--- a/languages/classes/LanguageUz.php
+++ b/languages/classes/LanguageUz.php
@@ -21,7 +21,7 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
 
 /**
  * @ingroup Language
@@ -75,9 +75,9 @@ class UzConverter extends LanguageConverter {
 		'f' => 'ф', 'F' => 'Ф',
 		'g' => 'г', 'G' => 'Г',
 		'g‘' => 'ғ', 'G‘' => 'Ғ', 'gʻ' => 'ғ', 'Gʻ' => 'Ғ',
-		'h'  => 'ҳ', 'H' => 'Ҳ',
+		'h' => 'ҳ', 'H' => 'Ҳ',
 		'i' => 'и', 'I' => 'И',
-		'k'  => 'к', 'K' => 'К',
+		'k' => 'к', 'K' => 'К',
 		'l' => 'л', 'L' => 'Л',
 		'm' => 'м', 'M' => 'М',
 		'n' => 'н', 'N' => 'Н',
@@ -108,7 +108,7 @@ class UzConverter extends LanguageConverter {
 		$this->mTables = array(
 			'uz-cyrl' => new ReplacementArray( $this->toCyrillic ),
 			'uz-latn' => new ReplacementArray( $this->toLatin ),
-			'uz'      => new ReplacementArray()
+			'uz' => new ReplacementArray()
 		);
 	}
 
@@ -126,7 +126,7 @@ class LanguageUz extends Language {
 
 		$variants = array( 'uz', 'uz-latn', 'uz-cyrl' );
 		$variantfallbacks = array(
-			'uz'    => 'uz-latn',
+			'uz' => 'uz-latn',
 			'uz-cyrl' => 'uz',
 			'uz-latn' => 'uz',
 		);
diff --git a/languages/classes/LanguageWa.php b/languages/classes/LanguageWa.php
index 9e90c7f4..e5f7438f 100644
--- a/languages/classes/LanguageWa.php
+++ b/languages/classes/LanguageWa.php
@@ -30,20 +30,6 @@
  * @ingroup Language
  */
 class LanguageWa extends Language {
-	/**
-	 * Use singular form for zero
-	 *
-	 * @param $count int
-	 * @param $forms array
-	 *
-	 * @return string
-	 */
-	function convertPlural( $count, $forms ) {
-		if ( !count( $forms ) ) { return ''; }
-		$forms = $this->preConvertPlural( $forms, 2 );
-
-		return ( $count <= 1 ) ? $forms[0] : $forms[1];
-	}
 
 	/**
 	 * Dates in Walloon are "1î d' <monthname>" for 1st of the month,
@@ -67,14 +53,14 @@ class LanguageWa extends Language {
 		#
 		# we also output this format for YMD (eg: 2001 January 15)
 		if ( $datePreference == 'ISO 8601' ) {
-		       $d = substr( $ts, 0, 4 ) . '-' . substr( $ts, 4, 2 ) . '-' . substr( $ts, 6, 2 );
-		       return $d;
+			$d = substr( $ts, 0, 4 ) . '-' . substr( $ts, 4, 2 ) . '-' . substr( $ts, 6, 2 );
+			return $d;
 		}
 
 		# dd/mm/YYYY format
 		if ( $datePreference == 'walloon short' ) {
-		       $d = substr( $ts, 6, 2 ) . '/' . substr( $ts, 4, 2 ) . '/' . substr( $ts, 0, 4 );
-		       return $d;
+			$d = substr( $ts, 6, 2 ) . '/' . substr( $ts, 4, 2 ) . '/' . substr( $ts, 0, 4 );
+			return $d;
 		}
 
 		# Walloon format
@@ -83,17 +69,17 @@ class LanguageWa extends Language {
 		$m = substr( $ts, 4, 2 );
 		$n = substr( $ts, 6, 2 );
 		if ( $n == 1 ) {
-		    $d = "1î d' " . $this->getMonthName( $m ) .
-			" " .  substr( $ts, 0, 4 );
+			$d = "1î d' " . $this->getMonthName( $m ) .
+				" " . substr( $ts, 0, 4 );
 		} elseif ( $n == 2 || $n == 3 || $n == 20 || $n == 22 || $n == 23 ) {
-		    $d = ( 0 + $n ) . " d' " . $this->getMonthName( $m ) .
-			" " .  substr( $ts, 0, 4 );
+			$d = ( 0 + $n ) . " d' " . $this->getMonthName( $m ) .
+				" " . substr( $ts, 0, 4 );
 		} elseif ( $m == 4 || $m == 8 || $m == 10 ) {
-		    $d = ( 0 + $n ) . " d' " . $this->getMonthName( $m ) .
-			" " .  substr( $ts, 0, 4 );
+			$d = ( 0 + $n ) . " d' " . $this->getMonthName( $m ) .
+				" " . substr( $ts, 0, 4 );
 		} else {
-		    $d = ( 0 + $n ) . " di " . $this->getMonthName( $m ) .
-			" " .  substr( $ts, 0, 4 );
+			$d = ( 0 + $n ) . " di " . $this->getMonthName( $m ) .
+				" " . substr( $ts, 0, 4 );
 		}
 		return $d;
 	}
@@ -106,7 +92,9 @@ class LanguageWa extends Language {
 	 * @return string
 	 */
 	function timeanddate( $ts, $adj = false, $format = true, $tc = false ) {
-		if ( $adj ) { $ts = $this->userAdjust( $ts, $tc ); }
+		if ( $adj ) {
+			$ts = $this->userAdjust( $ts, $tc );
+		}
 		$datePreference = $this->dateFormat( $format );
 		if ( $datePreference == 'ISO 8601' ) {
 			return parent::timeanddate( $ts, $adj, $format, $tc );
diff --git a/languages/classes/LanguageZh.php b/languages/classes/LanguageZh.php
index 04767f2d..d4130183 100644
--- a/languages/classes/LanguageZh.php
+++ b/languages/classes/LanguageZh.php
@@ -21,8 +21,8 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageZh_hans.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageZh_hans.php';
 
 /**
  * @ingroup Language
@@ -50,31 +50,31 @@ class ZhConverter extends LanguageConverter {
 									$flags,
 									$manualLevel );
 		$names = array(
-			'zh'      => '原文',
+			'zh' => '原文',
 			'zh-hans' => '简体',
 			'zh-hant' => '繁體',
-			'zh-cn'   => '大陆',
-			'zh-tw'   => '台灣',
-			'zh-hk'   => '香港',
-			'zh-mo'   => '澳門',
-			'zh-sg'   => '新加坡',
-			'zh-my'   => '大马',
+			'zh-cn' => '大陆',
+			'zh-tw' => '台灣',
+			'zh-hk' => '香港',
+			'zh-mo' => '澳門',
+			'zh-sg' => '新加坡',
+			'zh-my' => '大马',
 		);
 		$this->mVariantNames = array_merge( $this->mVariantNames, $names );
 	}
 
 	function loadDefaultTables() {
-		require( __DIR__ . "/../../includes/ZhConversion.php" );
+		require __DIR__ . "/../../includes/ZhConversion.php";
 		$this->mTables = array(
 			'zh-hans' => new ReplacementArray( $zh2Hans ),
 			'zh-hant' => new ReplacementArray( $zh2Hant ),
-			'zh-cn'   => new ReplacementArray( array_merge( $zh2Hans, $zh2CN ) ),
-			'zh-hk'   => new ReplacementArray( array_merge( $zh2Hant, $zh2HK ) ),
-			'zh-mo'   => new ReplacementArray( array_merge( $zh2Hant, $zh2HK ) ),
-			'zh-my'   => new ReplacementArray( array_merge( $zh2Hans, $zh2SG ) ),
-			'zh-sg'   => new ReplacementArray( array_merge( $zh2Hans, $zh2SG ) ),
-			'zh-tw'   => new ReplacementArray( array_merge( $zh2Hant, $zh2TW ) ),
-			'zh'      => new ReplacementArray
+			'zh-cn' => new ReplacementArray( array_merge( $zh2Hans, $zh2CN ) ),
+			'zh-hk' => new ReplacementArray( array_merge( $zh2Hant, $zh2HK ) ),
+			'zh-mo' => new ReplacementArray( array_merge( $zh2Hant, $zh2HK ) ),
+			'zh-my' => new ReplacementArray( array_merge( $zh2Hans, $zh2SG ) ),
+			'zh-sg' => new ReplacementArray( array_merge( $zh2Hans, $zh2SG ) ),
+			'zh-tw' => new ReplacementArray( array_merge( $zh2Hant, $zh2TW ) ),
+			'zh' => new ReplacementArray
 		);
 	}
 
@@ -111,18 +111,18 @@ class LanguageZh extends LanguageZh_hans {
 		$variants = array( 'zh', 'zh-hans', 'zh-hant', 'zh-cn', 'zh-hk', 'zh-mo', 'zh-my', 'zh-sg', 'zh-tw' );
 
 		$variantfallbacks = array(
-			'zh'      => array( 'zh-hans', 'zh-hant', 'zh-cn', 'zh-tw', 'zh-hk', 'zh-sg', 'zh-mo', 'zh-my' ),
+			'zh' => array( 'zh-hans', 'zh-hant', 'zh-cn', 'zh-tw', 'zh-hk', 'zh-sg', 'zh-mo', 'zh-my' ),
 			'zh-hans' => array( 'zh-cn', 'zh-sg', 'zh-my' ),
 			'zh-hant' => array( 'zh-tw', 'zh-hk', 'zh-mo' ),
-			'zh-cn'   => array( 'zh-hans', 'zh-sg', 'zh-my' ),
-			'zh-sg'   => array( 'zh-hans', 'zh-cn', 'zh-my' ),
-			'zh-my'   => array( 'zh-hans', 'zh-sg', 'zh-cn' ),
-			'zh-tw'   => array( 'zh-hant', 'zh-hk', 'zh-mo' ),
-			'zh-hk'   => array( 'zh-hant', 'zh-mo', 'zh-tw' ),
-			'zh-mo'   => array( 'zh-hant', 'zh-hk', 'zh-tw' ),
+			'zh-cn' => array( 'zh-hans', 'zh-sg', 'zh-my' ),
+			'zh-sg' => array( 'zh-hans', 'zh-cn', 'zh-my' ),
+			'zh-my' => array( 'zh-hans', 'zh-sg', 'zh-cn' ),
+			'zh-tw' => array( 'zh-hant', 'zh-hk', 'zh-mo' ),
+			'zh-hk' => array( 'zh-hant', 'zh-mo', 'zh-tw' ),
+			'zh-mo' => array( 'zh-hant', 'zh-hk', 'zh-tw' ),
 		);
 		$ml = array(
-			'zh'      => 'disable',
+			'zh' => 'disable',
 			'zh-hans' => 'unidirectional',
 			'zh-hant' => 'unidirectional',
 		);
@@ -142,9 +142,7 @@ class LanguageZh extends LanguageZh_hans {
 	 * @return string
 	 */
 	function segmentForDiff( $text ) {
-		return preg_replace(
-			"/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
-			"' ' .\"$1\"", $text );
+		return preg_replace( '/[\xc0-\xff][\x80-\xbf]*/', ' $0', $text );
 	}
 
 	/**
@@ -152,9 +150,7 @@ class LanguageZh extends LanguageZh_hans {
 	 * @return string
 	 */
 	function unsegmentForDiff( $text ) {
-		return preg_replace(
-			"/ ([\\xc0-\\xff][\\x80-\\xbf]*)/e",
-			"\"$1\"", $text );
+		return preg_replace( '/ ([\xc0-\xff][\x80-\xbf]*)/', '$1', $text );
 	}
 
 	/**
diff --git a/languages/classes/LanguageZh_hans.php b/languages/classes/LanguageZh_hans.php
index 04b2e16a..3851c8fe 100644
--- a/languages/classes/LanguageZh_hans.php
+++ b/languages/classes/LanguageZh_hans.php
@@ -86,6 +86,8 @@ class LanguageZh_hans extends Language {
 		$segments = array();
 
 		foreach ( $intervals as $intervalName => $intervalValue ) {
+			// Messages: duration-seconds, duration-minutes, duration-hours, duration-days, duration-weeks,
+			// duration-years, duration-decades, duration-centuries, duration-millennia
 			$message = wfMessage( 'duration-' . $intervalName )->numParams( $intervalValue );
 			$segments[] = $message->inLanguage( $this )->escaped();
 		}
diff --git a/languages/data/plurals-mediawiki.xml b/languages/data/plurals-mediawiki.xml
index 07e157a3..70d45a3c 100644
--- a/languages/data/plurals-mediawiki.xml
+++ b/languages/data/plurals-mediawiki.xml
@@ -2,9 +2,16 @@
 <!DOCTYPE supplementalData SYSTEM "../../common/dtd/ldmlSupplemental.dtd">
 <supplementalData>
 	<plurals>
+		<!--
+		The "one" and "two" rules are copied directly from CLDR.
+		The "many" rule overrides CLDR, because CLDR seems to have a mistake:
+		it's sometimes needed for multiples of 10, but not for 10 itself.
+		When the CLDR is fixed, this should be removed.
+		-->
 		<pluralRules locales="he">
 			<pluralRule count="one">n is 1</pluralRule>
 			<pluralRule count="two">n is 2</pluralRule>
+			<pluralRule count="many">n is not 0 AND n is not 10 AND n mod 10 is 0</pluralRule>
 		</pluralRules>
 		<pluralRules locales="dsb hsb">
 			<pluralRule count="one">n mod 100 is 1</pluralRule>
diff --git a/languages/data/plurals.xml b/languages/data/plurals.xml
index d1a403dc..d5a1cfe2 100644
--- a/languages/data/plurals.xml
+++ b/languages/data/plurals.xml
@@ -5,7 +5,7 @@
     <generation date="$Date: 2013-01-03 07:17:41 +0530 (Thu, 03 Jan 2013) $"/>
     <plurals>
         <!-- if locale is known to have no plurals, there are no rules -->
-        <pluralRules locales="az bm bo dz fa id ig ii hu ja jv ka kde kea km kn ko lo ms my sah ses sg th to tr vi wo yo zh"/> 
+        <pluralRules locales="az bm bo dz fa id ig ii hu ja jv ka kde kea km kn ko lo ms my sah ses sg th to tr vi wo yo zh"/>
         <pluralRules locales="ar">
             <pluralRule count="zero">n is 0</pluralRule>
             <pluralRule count="one">n is 1</pluralRule>
diff --git a/languages/messages/MessagesAce.php b/languages/messages/MessagesAce.php
index 9d5a33af..c0878910 100644
--- a/languages/messages/MessagesAce.php
+++ b/languages/messages/MessagesAce.php
@@ -187,12 +187,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Peuleumah jumeulah ureueng kalon',
 'tog-oldsig' => 'Tanda jaroe jinoe:',
 'tog-fancysig' => 'Peujeuet tanda jaroe sibagoe naseukah wiki (hana hubong keudroe)',
-'tog-externaleditor' => 'Nguy editor eksternal nyang ka na (keu nyang utoih khong, peureulee neuato kusuih bak kompute droeneuh.
-
-[//www.mediawiki.org/wiki/Manual:External_editors Haba leubeh leungkap.])',
-'tog-externaldiff' => 'Nguy diff eksternal nyang ka na (keu nyang utoih mantong, peureulee neuato kusuih bak kompute droeneuh
-[//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => 'Peuudep hubong keu ngon bantu "langsong u"',
 'tog-uselivepreview' => 'Nguy peuleumah hase langsong (baci)',
 'tog-forceeditsummary' => 'Peuingat lon meunyo plok neuringkaih neuandam mantong soh',
 'tog-watchlisthideown' => 'Peusöm nyang lôn andam nibak dapeuta keunalön',
@@ -205,6 +199,8 @@ $messages = array(
 'tog-diffonly' => 'Bek peuleumah asoe halaman di yup beunida neuandam',
 'tog-showhiddencats' => 'Peuleumah kawan teusom',
 'tog-norollbackdiff' => "Bek peudeuh beunida 'oh lheueh geupeuriwang",
+'tog-useeditwarning' => 'Neupeuingat lôn meunyoë meukubah ôn andam ngon hana teukeubah',
+'tog-prefershttps' => 'Sabè neunguy seunambông teulindông meunyoë neutamöng log',
 
 'underline-always' => 'Sabe',
 'underline-never' => "H'an tom",
@@ -268,6 +264,18 @@ $messages = array(
 'oct' => 'Siplôh',
 'nov' => 'Siblaih',
 'dec' => 'Duwa Blaih',
+'january-date' => '$1 Buleuën Sa',
+'february-date' => '$1 Buleuën Duwa',
+'march-date' => '$1 Buleuën Lhèë',
+'april-date' => '$1 Buleuën Peuët',
+'may-date' => '$1 Buleuën Limong',
+'june-date' => '$1 Buleuën Nam',
+'july-date' => '$1 Buleuën Tujôh',
+'august-date' => '$1 Buleuën Lapan',
+'september-date' => '$1 Buleuën Sikureuëng',
+'october-date' => '$1 Buleuën Siplôh',
+'november-date' => '$1 Buleuën Siblaih',
+'december-date' => '$1 Buleuën Duwa Blaih',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kawan|Kawan}}',
@@ -349,6 +357,7 @@ $messages = array(
 'create-this-page' => 'Peugèt ôn nyoe',
 'delete' => 'Sampôh',
 'deletethispage' => 'Sampôh ôn nyoe',
+'undeletethispage' => 'Bèk neusampôh ôn nyoë',
 'undelete_short' => 'Bateuë sampôh {{PLURAL:$1|one edit|$1 edits}}',
 'viewdeleted_short' => 'Eu {{PLURAL:$1|saboh neuandam|$1 neuandam}} nyang geusampoh',
 'protect' => 'Peulindông',
@@ -392,7 +401,7 @@ $1",
 'pool-queuefull' => 'Seunapat neupreh peunoh',
 'pool-errorunknown' => 'Salah hana meukon',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Bhaih {{SITENAME}}',
 'aboutpage' => 'Project:Bhaih',
 'copyright' => "Asoë na meunurot $1 keucuali meunyo na hay la'en nyang geupeugah",
@@ -402,7 +411,6 @@ $1",
 'disclaimers' => 'Beunantah',
 'disclaimerpage' => 'Project:Beunantah umom',
 'edithelp' => 'Bantu andam',
-'edithelppage' => 'Help:Andam',
 'helppage' => 'Help:Asoë',
 'mainpage' => 'Ôn Keuë',
 'mainpage-description' => 'Ôn Keuë',
@@ -476,17 +484,11 @@ Dapeuta on kusuih nyang sah jeuet neu'eu bak [[Special:SpecialPages|{{int:specia
 # General errors
 'error' => 'Seunalah',
 'databaseerror' => 'Kesalahan basis data',
-'dberrortext' => 'Na salah bak syntax neulakee basis data.
-Nyoe kadang tanda na saboh bug lam alat leumiek.
-Neulakee basis data keuneulheueh nakeuh:
-<blockquote><code>$1</code></blockquote>
-nibak function "<code>$2</code>".
-Basis data na salah "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Na salah sintaks bak neulakee basis data.
-Neulakee basis data nyang keuneulheueh nakeuh:
-"$1"
-nibak fungsi "$2"
-Basis data geupeuhase salah "$3: $4".',
+'databaseerror-text' => 'Saboh salah bak nè data ka teujadi. Nyoë meuhat na nyang han paih bak peukakaih droëneuh',
+'databaseerror-textcl' => 'Teunanyong basis data teungoh kacho',
+'databaseerror-query' => 'Teunanyong: $1',
+'databaseerror-function' => 'Guna: $1',
+'databaseerror-error' => 'Salah: $1',
 'laggedslavemode' => 'Peuneugah: On nyoe kadang hana neuubah baro',
 'readonly' => 'Basis data geurok',
 'enterlockreason' => 'Pasoe daleh neurok ngon pajan jeuet geupeuhah',
@@ -519,6 +521,7 @@ Kadang ka na soe sampoh.',
 'cannotdelete-title' => 'H\'an jeuet sampoh on "$1"',
 'delete-hook-aborted' => "Seunampoh geupeubateue le kaw'et parser.
 Hana jeuneulaih.",
+'no-null-revision' => 'H\'an jeuet peugot revisi null baro keu halaman "$1"',
 'badtitle' => 'Nan hana sah',
 'badtitletext' => 'Nan ôn nyang neulakèë hana sah, soh, atawa nan antarabahsa atawa antarawiki nyang salah sambông.',
 'perfcached' => 'Data di yup nyoe geupeusom ngon kadang kon data baro. {{PLURAL:$1|saboh hase|$1 hase}} maksimum na lam beujana.',
@@ -543,6 +546,7 @@ Keu neuk tamah atawa ubah teujeumah keu ban dum wiki, neungui [//translatewiki.n
 
 # Login and logout pages
 'yourname' => 'Ureuëng nguy:',
+'userlogin-yourname-ph' => 'Peutamöng nan ureuëng nguy droëneuh',
 'yourpassword' => 'Lageuëm:',
 'yourpasswordagain' => 'Pasoë lom lageuëm:',
 'remembermypassword' => 'Ingat lôn tamong bak peuramban nyoë (keu paleng trep $1 {{PLURAL:$1|uroë|uroë}})',
@@ -716,7 +720,6 @@ Alasan-alasan nyan hana geupeureumeuen.",
 'viewprevnext' => 'Eu ($1 {{int:pipe-separator}} $2)($3)',
 'searchmenu-exists' => "'''Na on ngon nan \"[[:\$1]]\" bak wiki nyoe.'''",
 'searchmenu-new' => "'''Peugöt ôn \"[[:\$1]]\" bak wiki nyoë!'''",
-'searchhelp-url' => 'Help:Asoë',
 'searchprofile-articles' => 'Ôn asoë',
 'searchprofile-project' => 'Ôn Beunantu ngön Buët',
 'searchprofile-images' => 'Multimedia',
@@ -811,7 +814,6 @@ Ceunatat: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = ôn barô,
 'recentchangeslinked-feed' => 'Neuubah meuhubông',
 'recentchangeslinked-toolbox' => 'Neuubah meuhubông',
 'recentchangeslinked-title' => 'Neuubah nyang meuhubông ngön $1',
-'recentchangeslinked-noresult' => 'Hana neu’ubah bak ôn-ôn meuhubông silawét masa nyang ka geupeuteuntèë.',
 'recentchangeslinked-summary' => "Nyoë nakeuh dapeuta neuubah nyang geupeugèt ban-ban nyoë keu on-on nyang meuhubông nibak ôn ka kusuih (atawa keu anggèëta kawan kusuih).
 Ôn-ôn bak [[Special:Watchlist|keunalon droeneuh]] geucitak '''teubay'''.",
 'recentchangeslinked-page' => 'Nan ôn:',
@@ -869,9 +871,6 @@ Teuneurang bak [$2 on teuneurangjih] geupeuleumah di yup nyoe.",
 # Statistics
 'statistics' => 'Keunira',
 
-'disambiguations' => 'Ôn disambiguasi',
-'disambiguationspage' => 'Template:disambig',
-
 'doubleredirects' => 'Peuninah ganda',
 
 'brokenredirects' => 'Peuninah reulöh',
@@ -1022,7 +1021,7 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 'contributions' => 'Beuneuri {{GENDER:$1|ureuëng nguy}}',
 'contributions-title' => 'Beuneuri ureuëng nguy keu $1',
 'mycontris' => 'Beuneuri',
-'contribsub2' => 'Keu $1 ($2)',
+'contribsub2' => 'Keu {{GENDER:$3|$1}} ($2)',
 'uctop' => '(jinoë)',
 'month' => 'Yôh buleuën (ngön yôh goh lom nyan)',
 'year' => 'Yôh thôn (ngön yôh goh lom nyan)',
diff --git a/languages/messages/MessagesAeb.php b/languages/messages/MessagesAeb.php
index dd485ef4..b777cdba 100644
--- a/languages/messages/MessagesAeb.php
+++ b/languages/messages/MessagesAeb.php
@@ -46,9 +46,6 @@ $messages = array(
 'tog-shownumberswatching' => 'اعرض عدد المستخدمين المراقبين',
 'tog-oldsig' => 'التوقيع الحالي:',
 'tog-fancysig' => 'عامل التوقيع كنص ويكي (بدون وصلة أوتوماتيكية)',
-'tog-externaleditor' => 'استخدم محررا خارجيا بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors مزيد من المعلومات.])',
-'tog-externaldiff' => 'استخدم فرقا خارجيا بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors للمزيد من المعلومات.])',
-'tog-showjumplinks' => 'مكن وصلات "اذهب إلى" المساعدة',
 'tog-uselivepreview' => 'استخدم الاستعراض السريع (جافاسكريبت) (تجريبي)',
 'tog-forceeditsummary' => 'نبهني عند إدخال ملخص تعديل فارغ',
 'tog-watchlisthideown' => 'أخف تعديلاتي من قائمة المراقبة',
@@ -246,7 +243,7 @@ $1',
 'pool-queuefull' => 'طابور الاقتراع ملئ',
 'pool-errorunknown' => 'خطأ غير معروف',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'عن {{SITENAME}}',
 'aboutpage' => 'Project:عن',
 'copyright' => 'المحتوى متوفر تحت $1.',
@@ -256,7 +253,6 @@ $1',
 'disclaimers' => 'عدم مسؤولية',
 'disclaimerpage' => 'Project:عدم مسؤولية عام',
 'edithelp' => 'مساعدة التحرير',
-'edithelppage' => 'Help:تحرير',
 'helppage' => 'Help:محتويات',
 'mainpage' => 'الصفحة الرئيسية',
 'mainpage-description' => 'الصفحة الرئيسية',
@@ -329,17 +325,6 @@ $1',
 # General errors
 'error' => 'ghalath',
 'databaseerror' => 'خطأ في قاعدة البيانات',
-'dberrortext' => 'حدث خطأ في صيغة استعلام قاعدة البيانات.
-ربما يكون هذا عيب بالبرنامج.
-آخر استعلام طلب من قاعدة البيانات كان:
-<blockquote><tt>$1</tt></blockquote>
-من داخل الدالة "<tt>$2</tt>".
-أرجعت قاعدة البيانات الخطأ "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'حدث خطأ في صيغة استعلام قاعدة البيانات.
-آخر استعلام طلب من قاعدة البيانات كان:
-"$1"
-من داخل الدالة "$2".
-أرجعت قاعدة البيانات الخطأ "$3: $4"',
 'laggedslavemode' => "'''تحذير:''' الصفحة قد لا تحتوي على أحدث التحديثات.",
 'readonly' => 'قاعدة البيانات مغلقة',
 'enterlockreason' => 'أدخل سببا للغلق، متضمنا تقديرا لوقت رفع الغلق',
@@ -395,7 +380,6 @@ mahouwech mobarrar',
 'editinginterface' => "'''تحذير:''' أنت تقوم بتحرير صفحة تستخدم في الواجهة النصية للبرنامج.
 سوف تؤثر التغييرات على هذه الصفحة على مظهر واجهة المستخدم للمستخدمين الآخرين.
 للترجمات، من فضلك استخدم مشروع ترجمة ميدياويكي [//translatewiki.net/wiki/Main_Page?setlang=ar translatewiki.net].",
-'sqlhidden' => '(استعلام SQL مخفي)',
 'cascadeprotected' => 'تمت حماية هذه الصفحة من التعديل لأنها مدمجة في {{PLURAL:$1||الصفحة التالية، والتي|الصفحتين التاليتين، واللتين|الصفحات التالية، والتي}} تم استعمال خاصية "حماية الصفحات المدمجة" {{PLURAL:$1||بها|بهما|بها}}:
 $2',
 'namespaceprotected' => "لا تمتلك الصلاحية لتعديل الصفحات في نطاق '''$1'''.",
@@ -426,7 +410,6 @@ $2',
 'yourpassword' => 'كلمة السر:',
 'yourpasswordagain' => 'أعد كتابة كلمة السر:',
 'remembermypassword' => 'تذكر دخولي على هذا الحاسوب (إلى {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}} كحد أقصى)',
-'securelogin-stick-https' => 'ابقَ في اتصال HTTPS بعد الدخول.',
 'yourdomainname' => 'نطاقك:',
 'externaldberror' => 'هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.',
 'login' => 'ادخل',
@@ -532,7 +515,7 @@ $2',
 'newpassword' => 'كلمة السر الجديدة:',
 'retypenew' => 'أعد كتابة كلمة السر الجديدة:',
 'resetpass_submit' => 'ضبط كلمة السر والدخول',
-'resetpass_success' => 'تم تغيير كلمة السر الخاصة بك بنجاح! يتم تسجيل دخولك الآن...',
+'changepassword-success' => 'تم تغيير كلمة السر الخاصة بك بنجاح! يتم تسجيل دخولك الآن...',
 'resetpass_forbidden' => 'كلمات السر لا يمكن تغييرها',
 'resetpass-no-info' => 'يجب أن تكون مسجل الدخول للوصول إلى هذه الصفحة مباشرة.',
 'resetpass-submit-loggedin' => 'تغيير كلمة السر',
@@ -543,10 +526,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'إعادة ضبط كلمة السر',
-'passwordreset-text' => 'أكمل هذا النموذج لتتلقى بريدا إلكترونيا يذكر بتفاصيل حسابك.',
 'passwordreset-legend' => 'إعادة تعيين كلمة السر',
 'passwordreset-disabled' => 'عُطّلت إعادة تعيين كلمة السر على هذه الويكي.',
-'passwordreset-pretext' => '{{PLURAL:$1||أدخل أحد أجزاء البيانات أدناه}}',
 'passwordreset-username' => 'اسم المستخدم:',
 'passwordreset-domain' => 'النطاق:',
 'passwordreset-capture' => 'أأعرض البريد الإلكتروني الناتج؟',
@@ -1079,7 +1060,6 @@ $1",
 'recentchangeslinked' => 'تغييرات ذات علاقة',
 'recentchangeslinked-toolbox' => 'تغييرات ذات علاقة',
 'recentchangeslinked-title' => 'التغييرات المرتبطة ب "$1"',
-'recentchangeslinked-noresult' => 'لم تحدث تعديلات في الصفحات التي لها وصلات هنا خلال الفترة المحددة.',
 'recentchangeslinked-summary' => "هذه قائمة بالتغييرات التي تمت حديثا للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).
 الصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''عريضة'''",
 'recentchangeslinked-page' => 'اسم الصفحة:',
@@ -1118,8 +1098,6 @@ $1",
 # Statistics
 'statistics' => 'إحصاءات',
 
-'disambiguationspage' => 'Template:توضيح',
-
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|بايت|بايت}}',
 'nmembers' => '{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوا|$1 عضو}}',
diff --git a/languages/messages/MessagesAf.php b/languages/messages/MessagesAf.php
index c6dad08f..14433092 100644
--- a/languages/messages/MessagesAf.php
+++ b/languages/messages/MessagesAf.php
@@ -15,6 +15,7 @@
  * @author Kaganer
  * @author Manie
  * @author Naudefj
+ * @author Nemo bis
  * @author Purodha
  * @author Reedy
  * @author SPQRobin
@@ -218,8 +219,8 @@ $messages = array(
 'tog-extendwatchlist' => 'Brei dophoulys uit om alle wysigings te wys, nie slegs die nuutste nie',
 'tog-usenewrc' => 'Groepeer wysigings per bladsy in onlangse wysigings en dophoulys (benodig JavaScript)',
 'tog-numberheadings' => 'Nommer opskrifte outomaties',
-'tog-showtoolbar' => 'Wys redigeergereedskap (benodig JavaScript)',
-'tog-editondblclick' => 'Dubbelkliek om blaaie te wysig (benodig JavaScript)',
+'tog-showtoolbar' => 'Wys redigeergereedskap',
+'tog-editondblclick' => 'Dubbelkliek om te wysig',
 'tog-editsection' => 'Wys [wysig]-skakels vir elke afdeling',
 'tog-editsectiononrightclick' => 'Wysig afdeling met regskliek op afdeling se titel (JavaScript)',
 'tog-showtoc' => 'Wys inhoudsopgawe (by bladsye met meer as drie opskrifte)',
@@ -239,9 +240,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Wys die aantal gebruikers wat dophou',
 'tog-oldsig' => 'Bestaande handtekening:',
 'tog-fancysig' => 'Doodgewone handtekening (sonder outomatiese skakel)',
-'tog-externaleditor' => "Gebruik outomaties 'n eksterne redigeringsprogram (vir kundiges; [//www.mediawiki.org/wiki/Manual:External_editors benodig verdere verstellings])",
-'tog-externaldiff' => "Gebruik outomaties 'n eksterne vergelykingsprogram (net vir kundiges - benodig spesiale verstellings op u rekenaar)",
-'tog-showjumplinks' => 'Wys "spring na"-skakels vir toeganklikheid',
 'tog-uselivepreview' => 'Gebruik lewendige voorskou (JavaScript) (eksperimenteel)',
 'tog-forceeditsummary' => "Let my daarop as ek nie 'n opsomming van my wysiging gee nie",
 'tog-watchlisthideown' => 'Versteek my wysigings in dophoulys',
@@ -254,6 +252,8 @@ $messages = array(
 'tog-diffonly' => "Moenie 'n bladsy se inhoud onder die wysigingsverskil wys nie",
 'tog-showhiddencats' => 'Wys versteekte kategorië',
 'tog-norollbackdiff' => 'Laat verskille weg na terugrol',
+'tog-useeditwarning' => "Waarsku my as ek 'n gewysigde bladsy verlaat voordat dit gestoor is",
+'tog-prefershttps' => "Gebruik altyd 'n beveiligde verbinding wanneer aangemeld is",
 
 'underline-always' => 'Altyd',
 'underline-never' => 'Nooit',
@@ -317,6 +317,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Des',
+'january-date' => '$1 Januarie',
+'february-date' => '$1 Februarie',
+'march-date' => '$1 Maart',
+'april-date' => '$1 April',
+'may-date' => '$1 Mei',
+'june-date' => '$1 Junie',
+'july-date' => '$1 Julie',
+'august-date' => '$1 Augustus',
+'september-date' => '$1 September',
+'october-date' => '$1 Oktober',
+'november-date' => '$1 November',
+'december-date' => '$1 Desember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorieë}}',
@@ -398,6 +410,7 @@ $messages = array(
 'create-this-page' => 'Skep hierdie bladsy',
 'delete' => 'Skrap',
 'deletethispage' => 'Skrap die bladsy',
+'undeletethispage' => 'Ontskrap die bladsy',
 'undelete_short' => 'Herstel {{PLURAL:$1|een wysiging|$1 wysigings}}',
 'viewdeleted_short' => 'Wys {{PLURAL:$1|een geskrapte wysiging|$1 geskrapte wysigings}}',
 'protect' => 'Beskerm',
@@ -441,7 +454,7 @@ $1",
 'pool-queuefull' => 'Die poel se wagtou is vol',
 'pool-errorunknown' => 'Onbekende fout',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Inligting oor {{SITENAME}}',
 'aboutpage' => 'Project:Omtrent',
 'copyright' => 'Inhoud is onderhewig aan $1, tensy anders vermeld',
@@ -451,7 +464,6 @@ $1",
 'disclaimers' => 'Voorbehoud',
 'disclaimerpage' => 'Project:Voorwaardes',
 'edithelp' => 'Wysigingshulp',
-'edithelppage' => 'Help:Wysig',
 'helppage' => 'Help:Inhoud',
 'mainpage' => 'Tuisblad',
 'mainpage-description' => 'Tuisblad',
@@ -528,17 +540,10 @@ Dit kan ook dui op 'n fout in die sagteware van {{SITENAME}}.",
 # General errors
 'error' => 'Fout',
 'databaseerror' => 'Databasisfout',
-'dberrortext' => 'Daar was \'n sintaksisfout in die databasisnavraag.
-Dit kan moontlik dui op \'n fout in die sagteware.
-Die laaste navraag was:
-<blockquote><code>$1</code></blockquote>
-vanuit funksie "<code>$2</code>".
-Databasis gee foutboodskap "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Sintaksisfout in databasisnavraag.
-Die laaste navraag was:
-"$1"
-vanuit funksie "$2".
-Databasis gee foutboodskap: "$3: $4".',
+'databaseerror-textcl' => "'n Databasis-versoek het gefaal.",
+'databaseerror-query' => 'SQL: $1',
+'databaseerror-function' => 'Funksie: $1',
+'databaseerror-error' => 'Fout: $1',
 'laggedslavemode' => 'Waarskuwing: Onlangse wysigings dalk nie in bladsy vervat nie.',
 'readonly' => 'Databasis gesluit',
 'enterlockreason' => 'Rede vir die sluiting,
@@ -593,11 +598,14 @@ Probeer asseblief weer oor 'n paar minute.",
 'protectedinterface' => 'Hierdie bladsy verskaf teks vir die koppelvlak van die sagteware, en is beskerm om misbruik te voorkom.
 Gebruik asseblief [//translatewiki.net/ translatewiki.net] om vertalings by te voeg of te wysig.',
 'editinginterface' => "'''Waarskuwing:''' U is besig om 'n bladsy te redigeer wat koppelvlakinligting aan die programmatuur voorsien. Wysigings aan hierdie bladsy sal die voorkoms van die gebruikerskoppelvlak vir ander gebruikers beïnvloed. Vir vertalings, oorweeg om eerder [//translatewiki.net/wiki/Main_Page?setlang=af translatewiki.net] (die vertalingsprojek vir MediaWiki) te gebruik.",
-'sqlhidden' => '(SQL navraag versteek)',
 'cascadeprotected' => 'Hierdie bladsy is beskerm teen redigering omdat dit ingesluit is in die volgende {{PLURAL:$1|bladsy|bladsye}} wat beskerm is met die "kaskade" opsie aangeskakel: $2',
 'namespaceprotected' => "U het nie toestemming om bladsye in die '''$1'''-naamruimte te wysig nie.",
 'customcssprotected' => "U het nie toestemming om hierdie CSS-bladsy te redigeer nie, want dit bevat 'n ander gebruiker se persoonlike verstellings.",
 'customjsprotected' => "U het nie toestemming om hierdie JavaScript-bladsy te redigeer nie, want dit bevat 'n ander gebruiker se persoonlike verstellings.",
+'mycustomcssprotected' => 'U het nie regte om die CSS-bladsy te wysig nie.',
+'mycustomjsprotected' => 'U het nie regte om die JavaScript-bladsy te wysig nie.',
+'myprivateinfoprotected' => 'U het nie regte om u persoonlike inligting te wysig nie.',
+'mypreferencesprotected' => 'U het nie regte om u voorkeure te wysig nie.',
 'ns-specialprotected' => 'Spesiale bladsye kan nie geredigeer word nie.',
 'titleprotected' => "Hierdie titel is beskerm teen skepping deur [[User:$1|$1]].
 Die rede gegee is ''$2''.",
@@ -623,10 +631,19 @@ Dit is moontlik dat sommige bladsye nog sal aandui dat u steeds aangemeld is tot
 'welcomecreation-msg' => 'U gebruiker is geskep.
 Moenie vergeet om u [[Special:Preferences|voorkeure vir {{SITENAME}}]] te stel nie.',
 'yourname' => 'Gebruikersnaam:',
+'userlogin-yourname' => 'Gebruikersnaam',
+'userlogin-yourname-ph' => 'Sleutel u gebruikersnaam in',
+'createacct-another-username-ph' => 'Verskaf gebruikersnaam',
 'yourpassword' => 'Wagwoord:',
+'userlogin-yourpassword' => 'Wagwoord',
+'userlogin-yourpassword-ph' => 'Sleutel u wagwoord in',
+'createacct-yourpassword-ph' => "Sleutel 'n wagwoord in",
 'yourpasswordagain' => 'Herhaal wagwoord',
+'createacct-yourpasswordagain' => 'Bevestig wagwoord',
+'createacct-yourpasswordagain-ph' => 'Sleutel weer u wagwoord in',
 'remembermypassword' => "Onthou dat ek op hierdie rekenaar ingeteken het (vir 'n maksimum van $1 {{PLURAL:$1|dag|dae}})",
-'securelogin-stick-https' => 'Bly verbind met HTTPS na aanmelding',
+'userlogin-remembermypassword' => 'Hou my aangemeld',
+'userlogin-signwithsecure' => 'Gebruik veilige verbinding',
 'yourdomainname' => 'U domein:',
 'password-change-forbidden' => 'U kan nie wagwoorde op hierdie wiki verander nie.',
 'externaldberror' => "'n Databasisfout het tydens aanmelding voorgekom of u het nie toestemming om u eksterne rekening op te dateer nie.",
@@ -638,18 +655,42 @@ Moenie vergeet om u [[Special:Preferences|voorkeure vir {{SITENAME}}]] te stel n
 'logout' => 'Teken uit',
 'userlogout' => 'Teken uit',
 'notloggedin' => 'Nie ingeteken nie',
+'userlogin-noaccount' => 'Nog nie geregistreer nie?',
+'userlogin-joinproject' => 'Word lid van {{SITENAME}}',
 'nologin' => 'Nog nie geregistreer nie? $1.',
 'nologinlink' => "Skep gerus 'n gebruiker",
 'createaccount' => 'Skep nuwe rekening',
 'gotaccount' => "Het u reeds 'n rekening? $1.",
 'gotaccountlink' => 'Meld aan',
 'userlogin-resetlink' => 'U besonderhede vergeet?',
+'userlogin-resetpassword-link' => 'Herstel u wagwoord',
+'helplogin-url' => 'Help:Aanmelding',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hulp met aanmelding]]',
+'userlogin-createanother' => "Skep nog 'n rekening",
+'createacct-join' => 'Verskaf u gegewens hieronder.',
+'createacct-another-join' => 'Sleutel die nuwe rekening se inligting hier onder in:',
+'createacct-emailrequired' => 'E-posadres',
+'createacct-emailoptional' => 'E-posadres (opsioneel)',
+'createacct-email-ph' => 'Sleutel u e-posadres in',
+'createacct-another-email-ph' => 'Verskaf e-posadres',
 'createaccountmail' => "Gebruik 'n tydelike lukrake wagwoord en stuur dit na die e-posadres hier onder",
+'createacct-realname' => 'Regte naam (opsioneel)',
 'createaccountreason' => 'Rede:',
+'createacct-reason' => 'Rede',
+'createacct-reason-ph' => "Hoekom u nog 'n rekening skep",
+'createacct-captcha' => 'Veiligheidskontrole',
+'createacct-imgcaptcha-ph' => 'Sleutel die teks hierbo in',
+'createacct-submit' => 'Skep u rekening',
+'createacct-another-submit' => "Skep nog 'n rekening",
+'createacct-benefit-heading' => '{{SITENAME}} word deur mense soos u geskep.',
+'createacct-benefit-body1' => '{{PLURAL:$1|wysiging|wysigings}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|bladsy|bladsye}}',
+'createacct-benefit-body3' => 'onlangse {{PLURAL:$1|bydraer|bydraers}}',
 'badretype' => 'Die ingetikte wagwoorde is nie dieselfde nie.',
 'userexists' => "Die gebruikersnaam wat u gekies het is beset.
 Kies asseblief 'n ander naam.",
 'loginerror' => 'Intekenfout',
+'createacct-error' => 'Fout tydens skep van gebruiker',
 'createaccounterror' => "Kon nie 'n rekening skep nie: $1",
 'nocookiesnew' => 'Die gebruiker is geregistreer, maar is nie aangemeld nie.
 {{SITENAME}} gebruik koekies vir die aanmeld van gebruikers.
@@ -709,7 +750,7 @@ U word aangeraai om so gou as moontlik aan te meld en u wagwoord te verander.
 
 Ignoreer die boodskap as die gebruiker sonder u medewete geskep is.',
 'usernamehasherror' => "'n Gebruikersnaam mag nie 'n hekkie-karakter (#) in hê nie",
-'login-throttled' => "U het al te veel kere met 'n ongeldige wagwoord probeer aanteken.
+'login-throttled' => "U het al te veel kere met 'n ongeldige wagwoord probeer aanmeld.
 Wag asseblief alvorens u weer probeer.",
 'login-abort-generic' => 'U is nie aangemeld nie. Die prosedure is gestaak.',
 'loginlanguagelabel' => 'Taal: $1',
@@ -730,7 +771,8 @@ Om voort te gaan moet u 'n nuwe wagwoord hier kies:",
 'newpassword' => 'Nuwe wagwoord',
 'retypenew' => 'Tik nuwe wagwoord weer in',
 'resetpass_submit' => 'Stel wagwoord en meld aan',
-'resetpass_success' => 'U wagwoord is suksesvol gewysig! Besig om u in te teken ...',
+'changepassword-success' => 'U wagwoord is suksesvol gewysig!
+Besig om u aan te meld...',
 'resetpass_forbidden' => 'Wagwoorde kannie gewysig word nie.',
 'resetpass-no-info' => 'U moet ingeteken wees om hierdie bladsy direk te kan gebruik.',
 'resetpass-submit-loggedin' => 'Verander wagwoord',
@@ -742,10 +784,11 @@ U het moontlik reeds u wagwoord gewysig of 'n nuwe tydelike wagwoord aangevra.",
 
 # Special:PasswordReset
 'passwordreset' => 'Wagwoord herstel',
-'passwordreset-text' => 'Voltooi hierdie vorm om u wagwoord te herstel.',
+'passwordreset-text-one' => 'Voltooi hierdie vorm om u wagwoord te herstel.',
+'passwordreset-text-many' => '{{PLURAL:$1|Vul een van die velde in om u wagwoord te herstel.}}',
 'passwordreset-legend' => 'Kry nuwe wagwoord',
 'passwordreset-disabled' => 'Die herskik van U wagwoord is gedeaktiveer op hierdie wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Voer een van die onderstaande velde in}}',
+'passwordreset-emaildisabled' => 'E-posfunksies is afgeskakel op hierdie wiki.',
 'passwordreset-username' => 'Gebruiker:',
 'passwordreset-domain' => 'Domein:',
 'passwordreset-capture' => 'Wys resulterende e-pos?',
@@ -770,7 +813,7 @@ Meld asseblief aan en verander u wagwoord nou. As u dit nie versoek het nie, of
 Tydelike wagwoord: $2',
 'passwordreset-emailsent' => "'n E-pos is gestuur om u wagwoord te herstel.",
 'passwordreset-emailsent-capture' => "'n E-pos vir die herstel van 'n wagwoord is gestuur. Dit word hieronder vertoon.",
-'passwordreset-emailerror-capture' => "'n E-pos ter herinnering is geskep en word hieronder vertoon. Die uitstuur daarvan het egter gefaal: $1",
+'passwordreset-emailerror-capture' => "'n E-pos vir die herstel van 'n wagwoord is saamgestel. Dit word hieronder vertoon. Die uitstuur daarvan na die {{GENDER:$2|gebruiker}} het egter gefaal: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Wysig E-posadres',
@@ -784,6 +827,9 @@ Tydelike wagwoord: $2',
 'changeemail-submit' => 'Wysig E-posadres',
 'changeemail-cancel' => 'Kanselleer',
 
+# Special:ResetTokens
+'resettokens-token-label' => '$1 (huidige waarde: $2)',
+
 # Edit page toolbar
 'bold_sample' => 'Vetgedrukte teks',
 'bold_tip' => 'Vetdruk',
@@ -983,12 +1029,15 @@ Geen verduideliking is verskaf nie.",
 Dit lyk of dit verwyder is.',
 'edit-conflict' => 'Wysigingskonflik',
 'edit-no-change' => 'U wysiging was geignoreer omdat die teks nie verander is nie.',
+'postedit-confirmation' => 'U wysigings is gestoor.',
 'edit-already-exists' => 'Die bladsy is nie geskep nie.
 Dit bestaan alreeds.',
 'defaultmessagetext' => 'Verstekteks',
 'content-failed-to-parse' => 'Dit was nie moontlik om die inhoud van die MIME-tipe $2 vir die model $1 te verwerk nie: $3.',
 'invalid-content-data' => 'Ongeldige inhoud',
 'content-not-allowed-here' => '"$1" word nie op bladsy [[$2]] toegelaat nie.',
+'editwarning-warning' => 'As u hierdie bladsy verlaat, verloor u moontlik al die wysigings wat u aangebring het.
+Indien u aangemeld is, kan u hierdie waarskuwing in die "Wysigings"-afdeling van u voorkeure afskakel.',
 
 # Content models
 'content-model-wikitext' => 'Wikiteks',
@@ -1024,6 +1073,7 @@ Kontroleer die vergelyking hieronder om seker te maak dis wat u wil doen, en sto
 'undo-failure' => 'Die wysiging kan nie ongedaan gemaak word nie omdat dit met intermediêre wysigings bots.',
 'undo-norev' => 'Die wysiging kon nie ongedaan gemaak word nie omdat dit nie bestaan nie of reeds verwyder is.',
 'undo-summary' => 'Rol weergawe $1 deur [[Special:Contributions/$2|$2]] ([[User talk:$2|bespreek]]) terug.',
+'undo-summary-username-hidden' => "Rol weergawe $1 deur 'n versteekte gebruiker terug",
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Kan nie rekening skep nie',
@@ -1203,6 +1253,7 @@ Let op dat die gebruik van navigasieskakels hierdie kolom se waardes sal herstel
 'compareselectedversions' => 'Vergelyk gekose weergawes',
 'showhideselectedversions' => 'Wys/versteek gekose weergawes',
 'editundo' => 'maak ongedaan',
+'diff-empty' => '(Geen verskil)',
 'diff-multi' => '({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur {{PLURAL:$2|een gebruiker|$2 gebruikers}} word nie gewys nie)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Een tussenin wysiging|$1 tussenin wysigings}} deur meer as $2 {{PLURAL:$2|gebruiker|gebruikers}} nie gewys nie)',
 'difference-missing-revision' => "{{PLURAL:$2|'n Weergawe|$2 weergawes}} van die verskil ($1) {{PLURAL:$2|is|is}} nie gevind nie.
@@ -1230,7 +1281,6 @@ Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} s
 'searchmenu-legend' => 'Soekopsies',
 'searchmenu-exists' => "'''Daar is reeds 'n bladsy genaamd \"[[:\$1]]\" op die wiki'''",
 'searchmenu-new' => "'''Skep die bladsy \"[[:\$1]]\" op hierdie wiki'''",
-'searchhelp-url' => 'Help:Inhoud',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Wys bladsye wat met die voorvoegsel begin]]',
 'searchprofile-articles' => 'Inhoudelike bladsye',
 'searchprofile-project' => 'Hulp- en projekbladsye',
@@ -1273,15 +1323,7 @@ U kan ook 'n naamruimte as voorvoegsel gebruik.",
 'powersearch-togglenone' => 'Geen',
 'search-external' => 'Eksterne soektog',
 'searchdisabled' => '{{SITENAME}} se soekfunksie is tans afgeskakel ter wille van werkverrigting. Gebruik gerus intussen Google of Yahoo! Let daarop dat hulle indekse van die {{SITENAME}}-inhoud verouderd mag wees.',
-
-# Quickbar
-'qbsettings' => 'Snelbalkvoorkeure',
-'qbsettings-none' => 'Geen',
-'qbsettings-fixedleft' => 'Links vas.',
-'qbsettings-fixedright' => 'Regs vas.',
-'qbsettings-floatingleft' => 'Dryf links.',
-'qbsettings-floatingright' => 'Dryf regs.',
-'qbsettings-directionality' => 'Vas, afhanklik van die skryfrigting van u taal',
+'search-error' => "'n Fout het tydens die soektog voorgekom: $1",
 
 # Preferences page
 'preferences' => 'Voorkeure',
@@ -1315,7 +1357,6 @@ U kan ook 'n naamruimte as voorvoegsel gebruik.",
 'resetprefs' => 'Herstel voorkeure',
 'restoreprefs' => 'Herstel voorkeure',
 'prefs-editing' => 'Wysigings',
-'prefs-edit-boxsize' => 'Afmetings van die wysigingsvenster.',
 'rows' => 'Rye',
 'columns' => 'Kolomme',
 'searchresultshead' => 'Soekresultate',
@@ -1326,9 +1367,6 @@ U kan ook 'n naamruimte as voorvoegsel gebruik.",
 'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|dag|dae}}',
 'recentchangescount' => 'Aantal wysigings om by verstek te vertoon:',
 'prefs-help-recentchangescount' => 'Dit geld vir onlangse wysigings, bladsygeskiedenis en logboekbladsye.',
-'prefs-help-watchlist-token' => "Deur 'n geheime sleutel hier in te sleutel word 'n RSS-voer vir u dophoulys geskep.
-Enige een wat die sleutel ken sal u dophoulys kan lees. Kies dus 'n veilige sleutel.
-Hier volg 'n lukraak gegenereerde waarde wat u kan gebruik: $1",
 'savedprefs' => 'U voorkeure is gestoor.',
 'timezonelegend' => 'Tydsone:',
 'localtime' => 'Plaaslike tyd:',
@@ -1359,7 +1397,6 @@ Hier volg 'n lukraak gegenereerde waarde wat u kan gebruik: $1",
 'prefs-reset-intro' => 'U kan die blad gebruik om u voorkeure terug te stel na die webwerf se verstekwaardes.
 Die aksie kan nie ongedaan gemaak word nie.',
 'prefs-emailconfirm-label' => 'E-posbevestiging:',
-'prefs-textboxsize' => 'Afmetings van die wysigingsvenster',
 'youremail' => 'E-posadres:',
 'username' => '{{GENDER:$1|Gebruikersnaam}}:',
 'uid' => '{{GENDER:$1|Gebruiker-ID}}:',
@@ -1393,6 +1430,8 @@ As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
 'prefs-dateformat' => 'Datumformaat',
 'prefs-timeoffset' => 'Tydsverskil',
 'prefs-advancedediting' => 'Algemeen',
+'prefs-editor' => 'Redigeerder',
+'prefs-preview' => 'Voorskou',
 'prefs-advancedrc' => 'Gevorderde instellings',
 'prefs-advancedrendering' => 'Gevorderde instellings',
 'prefs-advancedsearchoptions' => 'Gevorderde instellings',
@@ -1427,6 +1466,8 @@ As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
 'userrights-notallowed' => 'U het nie magtiging om gebruikersregte by te sit of weg te neem nie.',
 'userrights-changeable-col' => 'Groepe wat u kan verander',
 'userrights-unchangeable-col' => 'Groepe wat u nie kan verander nie',
+'userrights-conflict' => 'Konflik met gebruikersregte! Pas asseblief weer u wysigings toe.',
+'userrights-removed-self' => 'U het u eie regte suksesvol verwyder. Gevolglik het u nie meer toegang tot hierdie bladsy nie.',
 
 # Groups
 'group' => 'Groep:',
@@ -1492,11 +1533,19 @@ As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
 'right-proxyunbannable' => "Blokkades vir instaanbedieners (proxy's) geld nie",
 'right-unblockself' => 'Eie gebruiker deblokkeer',
 'right-protect' => 'Verander beveiligingsvlakke en wysig kaskade-beskermde bladsye',
-'right-editprotected' => 'Wysig beskermde bladsye (sonder kaskade-beskerming)',
+'right-editprotected' => 'Wysig bladsye beskermd as "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Wysig bladsye wat as "{{int:protect-level-autoconfirmed}}" beskerm is',
 'right-editinterface' => 'Wysig die gebruikerskoppelvlak',
 'right-editusercssjs' => 'Wysig ander gebruikers se CSS- en JS-lêers',
 'right-editusercss' => 'Wysig ander gebruikers se CSS-lêers',
 'right-edituserjs' => 'Wysig ander gebruikers se JS-lêers',
+'right-editmyusercss' => 'Wysig u persoonlike CSS-bladsy',
+'right-editmyuserjs' => 'Wysig u persoonlike JavaScript-bladsy',
+'right-viewmywatchlist' => 'Wys u persoonlike dophoulys',
+'right-editmywatchlist' => 'Wysig u persoonlike dophoulys. Sommige aksies sal steeds bladsye byvoeg, selfs sonder die bevoegdheid.',
+'right-viewmyprivateinfo' => 'Wys u eie privaat data (bv. e-posadres, regte naam)',
+'right-editmyprivateinfo' => 'Wysig u eie privaat data (bv. e-posadres, regte naam)',
+'right-editmyoptions' => 'Wysig u eie voorkeure',
 'right-rollback' => "Rol wysigings van die laaste gebruiker wat 'n bladsy gewysig het vinnig terug",
 'right-markbotedits' => 'Merk teruggerolde wysigings as botbywerkings',
 'right-noratelimit' => 'Negeer tydsafhanklike beperkings',
@@ -1558,12 +1607,19 @@ As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
 'action-userrights-interwiki' => 'wysig gebruikersregte van gebruikers op ander wikis',
 'action-siteadmin' => 'sluit of ontsluit die databasis',
 'action-sendemail' => 'stuur e-posse',
+'action-editmywatchlist' => 'wysig u dophoulys',
+'action-viewmywatchlist' => 'wys u dophoulys',
+'action-viewmyprivateinfo' => 'wys u privaat inligting',
+'action-editmyprivateinfo' => 'wysig u privaat inligting',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|wysiging|wysigings}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sedert u laaste besoek}}',
+'enhancedrc-history' => 'geskiedenis',
 'recentchanges' => 'Onlangse wysigings',
 'recentchanges-legend' => 'Opsies vir onlangse wysigings',
 'recentchanges-summary' => 'Volg die mees onlangse wysigings aan die wiki op die bladsy.',
+'recentchanges-noresult' => 'Geen wysigings gedurende die tydperk pas die kriteria nie.',
 'recentchanges-feed-description' => 'Hierdie voer laat u toe om die mees onlangse wysigings aan die wiki te volg.',
 'recentchanges-label-newpage' => "Met die wysiging is 'n nuwe bladsy geskep",
 'recentchanges-label-minor' => "Hierdie is 'n klein wysiging",
@@ -1600,7 +1656,6 @@ As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
 'recentchangeslinked-feed' => 'Verwante veranderings',
 'recentchangeslinked-toolbox' => 'Verwante veranderings',
 'recentchangeslinked-title' => 'Wysigings verwant aan "$1"',
-'recentchangeslinked-noresult' => 'Geen veranderinge op geskakelde bladsye gedurende die periode nie.',
 'recentchangeslinked-summary' => "Hier volg 'n lys van wysigings wat onlangs gemaak is aan bladsye wat van die gespesifiseerde bladsy geskakel word (of van bladsye van die gespesifiseerde kategorie).
 Bladsye op [[Special:Watchlist|u dophoulys]] word in '''vetdruk''' uitgewys.",
 'recentchangeslinked-page' => 'Bladsynaam:',
@@ -1612,8 +1667,7 @@ Bladsye op [[Special:Watchlist|u dophoulys]] word in '''vetdruk''' uitgewys.",
 'reuploaddesc' => 'Keer terug na die laaivorm.',
 'upload-tryagain' => 'Stuur gewysigde lêerbeskrywing',
 'uploadnologin' => 'Nie ingeteken nie',
-'uploadnologintext' => 'Teken eers in [[Special:UserLogin|logged in]]
-om lêers te laai.',
+'uploadnologintext' => 'U moet $1 alvorens u lêers kan laai.',
 'upload_directory_missing' => 'Die oplaaigids ($1) bestaan nie en kon nie deur die webbediener geskep word nie.',
 'upload_directory_read_only' => 'Die webbediener kan nie na die oplaai gids ($1) skryf nie.',
 'uploaderror' => 'Laaifout',
@@ -1843,7 +1897,6 @@ Vir veiligheidsredes is img_auth.php gedeaktiveer.",
 'http-read-error' => 'Fout met die lees van HTTP.',
 'http-timed-out' => 'HTTP-versoek se tyd is verstreke.',
 'http-curl-error' => 'Fout met die ophaal van URL: $1',
-'http-host-unreachable' => 'Die URL is nie bereikbaar nie.',
 'http-bad-status' => "Daar was 'n probleem tydens die HTTP-versoek: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1876,6 +1929,9 @@ Kliek op die opskrifte om die tabel te hersorteer.',
 'listfiles_size' => 'Grootte',
 'listfiles_description' => 'Beskrywing',
 'listfiles_count' => 'Weergawes',
+'listfiles-latestversion' => 'Huidige weergawe',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nee',
 
 # File description page
 'file-anchor-link' => 'Lêer',
@@ -1970,6 +2026,11 @@ Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
 'randompage' => 'Lukrake bladsy',
 'randompage-nopages' => 'Daar is geen bladsye in die volgende {{PLURAL:$2|naamruimte|naamruimtes}} nie: $1.',
 
+# Random page in category
+'randomincategory-invalidcategory' => '"$1" is nie \'n geldige kategorienaam nie.',
+'randomincategory-nopages' => 'Daar is geen bladsye in kategorie [[:Category:$1|$1]].',
+'randomincategory-selectcategory-submit' => 'Gaan',
+
 # Random redirect
 'randomredirect' => 'Lukrake aanstuur',
 'randomredirect-nopages' => 'Daar is geen aansture in naamruimte "$1" nie.',
@@ -1995,12 +2056,6 @@ Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
 'statistics-users-active-desc' => "Gebruikers wat in die afgelope {{PLURAL:$1|dag|$1 dae}} 'n handeling uitgevoer het",
 'statistics-mostpopular' => 'Mees bekykte bladsye',
 
-'disambiguations' => 'Bladsye wat na dubbelsinnigheidsbladsye skakel',
-'disambiguationspage' => 'Template:Dubbelsinnig',
-'disambiguations-text' => "Die volgende bladsye het ten minste een skakel na 'n '''dubbelsinnigheidsbladsy'''.
-Hulle moet gewysig word om eerder direk na die regte onderwerpe te skakel.<br />
-'n Bladsy word beskou as 'n dubbelsinnigheidsbladsy as dit 'n sjabloon bevat wat geskakel is vanaf [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop' => "Blaaie met 'n bladsy-eienskap",
 'pageswithprop-legend' => "Blaaie met 'n bladsy-eienskap",
 'pageswithprop-text' => "Hierdie bladsy lys blaaie met 'n bepaalde blady-eienskap.",
@@ -2255,10 +2310,9 @@ Toekomstige wysigings aan hierdie bladsy en sy bybehorende besprekingsblad sal h
 'unwatchthispage' => 'Moenie meer dophou',
 'notanarticle' => "Nie 'n artikel",
 'notvisiblerev' => 'Weergawe is verwyder',
-'watchnochange' => 'Geen item op die dophoulys is geredigeer in die gekose periode nie.',
 'watchlist-details' => '{{PLURAL:$1|$1 bladsy|$1 bladsye}} in u dophoulys, besprekingsbladsye uitgesluit.',
-'wlheader-enotif' => '* E-pos notifikasie is aangeskakel.',
-'wlheader-showupdated' => "* Bladsye wat verander is sedert u hulle laas besoek het word in '''vetdruk''' uitgewys",
+'wlheader-enotif' => 'E-pos kennisgewings is aangeskakel.',
+'wlheader-showupdated' => "Bladsye wat verander is sedert u hulle laas besoek het word in '''vetdruk''' uitgewys.",
 'watchmethod-recent' => 'Kontroleer onlangse wysigings aan bladsye op dophoulys',
 'watchmethod-list' => 'kontroleer bladsye op dophoulys vir wysigings',
 'watchlistcontains' => 'Jou dophoulys bevat $1 {{PLURAL:$1|bladsy|bladsye}}.',
@@ -2510,7 +2564,7 @@ $1',
 'contributions' => '{{GENDER:$1|Gebruikersbydraes}}',
 'contributions-title' => '$1 se bydraes',
 'mycontris' => 'Bydraes',
-'contribsub2' => 'Vir $1 ($2)',
+'contribsub2' => 'Vir {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Geen veranderinge wat by hierdie kriteria pas, is gevind nie.',
 'uctop' => '(laaste wysiging)',
 'month' => 'Vanaf maand (en vroeër):',
@@ -2669,15 +2723,13 @@ Die blokkade is moontlik reeds opgehef.',
 Die blokkade is 'n onderdeel van die reeks $2, waarvan die blokkade wel opgehef kan word.",
 'ip_range_invalid' => 'Ongeldige IP waardegebied.',
 'ip_range_toolarge' => 'Reeks-blokkades groter as /$1 word nie toegelaat nie.',
-'blockme' => 'Versper my',
 'proxyblocker' => 'Proxyblokker',
-'proxyblocker-disabled' => 'Die funksie is gedeaktiveer.',
 'proxyblockreason' => "U IP-adres is geblokkeer omdat dit van 'n oop instaanbediener (proxy) gebruik maak.
 Kontak asseblief u internet-diensverskaffer of tegniese ondersteuning en lig hulle van hierdie ernstige sekuriteitsprobleem in.",
-'proxyblocksuccess' => 'Voltooi.',
 'sorbsreason' => "U IP-adres is gelys as 'n oop instaanbediener (proxy) in die DNS-swartlys wat op {{SITENAME}} gebruik word.",
 'sorbs_create_account_reason' => "U IP-adres is gelys as 'n oop instaanbediener (proxy) in die DNS-swartlys wat op {{SITENAME}} gebruik word.
 U kan nie 'n rekening skep nie.",
+'xffblockreason' => "'n IP-adres wat u gebruik is geblokkeer. Dit kom in die opskrif 'X-Forwarded-For' voor. Die oorspronklike rede vir die blokkade is: $1",
 'cant-block-while-blocked' => 'U kan nie ander gebruikers blokkeer terwyl u self geblokkeer is nie.',
 'cant-see-hidden-user' => "Die gebruiker wat u probeer blokkeer is reeds geblokkeer en weggesteek.
 Aangesien u nie die 'hideuser'-reg het nie, kan u nie die blokkade van die gebruiker sien of wysig nie.",
@@ -2839,6 +2891,8 @@ Gaan na [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisasie] en [//tran
 'thumbnail-more' => 'Vergroot',
 'filemissing' => 'Lêer is weg',
 'thumbnail_error' => 'Fout met die skep van duimnaelsketse: $1',
+'thumbnail_error_remote' => 'Fout vanaf $1:
+$2',
 'djvu_page_error' => 'DjVu-bladsy buite bereik',
 'djvu_no_xml' => 'Die XML vir die DjVu-lêer kon nie bekom word nie',
 'thumbnail-temp-create' => "Kon nie 'n tydelike duimnaellêer skep nie.",
@@ -2991,10 +3045,6 @@ U kan daar \'n wysigingsopsomming byvoeg.',
 
 # Stylesheets
 'common.css' => '/** Gemeenskaplike CSS vir alle omslae */',
-'nostalgia.css' => '/* CSS wat hier geplaas word sal slegs die Nostalgie-omslag beïnvloed */',
-
-# Scripts
-'nostalgia.js' => '/* JavaScript wat hier geplaas word sal slegs gebruikers van die Nostalgie-omslag beïnvloed */',
 
 # Metadata
 'notacceptable' => "Die wikibediener kan nie data in 'n formaat wat jou kliënt kan lees verskaf nie.",
@@ -3068,8 +3118,6 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons
 'pageinfo-category-files' => 'Aantal lêers',
 
 # Skin names
-'skinname-standard' => 'Standaard',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Keulen blou',
 
 # Patrolling
@@ -3146,11 +3194,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minuut|$1 minute}}',
 'hours' => '{{PLURAL:$1|$1 uur|$1 ure}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dae}}',
+'weeks' => '{{PLURAL: $1|één week|$1 weke}}',
 'months' => '{{PLURAL:$1|een maand|$1 maande}}',
 'years' => '{{PLURAL:$1|een jaar|$1 jaar}}',
 'ago' => '$1 gelede',
 'just-now' => 'Nou net',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|uur}} gelede',
+'minutes-ago' => '$1 {{PLURAL:$1|minuut|minute}} gelede',
+'seconds-ago' => '$1 {{PLURAL:$1|sekonde|sekondes}} gelede',
+'monday-at' => 'Maandag om $1',
+'tuesday-at' => 'Dinsdag om $1',
+'wednesday-at' => 'Woensdag om $1',
+'thursday-at' => 'Donderdag om $1',
+'friday-at' => 'Vrydag om $1',
+'saturday-at' => 'Saterdag om $1',
+'sunday-at' => 'Sondag om $1',
+'yesterday-at' => 'Gister om $1',
+
 # Bad image list
 'bad_image_list' => "Die formaat is as volg:
 
@@ -3180,7 +3242,7 @@ Ander velde sal versteek wees.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breedte',
 'exif-imagelength' => 'Hoogte',
 'exif-bitspersample' => 'Grepe per komponent',
@@ -3358,7 +3420,7 @@ Ander velde sal versteek wees.
 'exif-originalimageheight' => 'Hoogte van beeld voor dit besny is',
 'exif-originalimagewidth' => 'Wydte van beeld voor dit besny is',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ongekompakteerd',
 'exif-compression-2' => 'CCITT Groep 3 1-dimensionale aangepaste "Huffman run length"-kodering',
 'exif-compression-3' => 'CCITT Groep 3 fakskodering',
@@ -3752,7 +3814,6 @@ U kan ook die [[Special:EditWatchlist|standaard opdaterigskerm gebruik]].',
 'version-other' => 'Ander',
 'version-mediahandlers' => 'Mediaverwerkers',
 'version-hooks' => 'Hoeke',
-'version-extension-functions' => 'Uitbreidingsfunksies',
 'version-parser-extensiontags' => 'Ontleder-uitbreidingsetikette',
 'version-parser-function-hooks' => 'Ontleder-funksiehoeke',
 'version-hook-name' => 'Hoek naam',
@@ -3761,6 +3822,7 @@ U kan ook die [[Special:EditWatchlist|standaard opdaterigskerm gebruik]].',
 'version-license' => 'Lisensie',
 'version-poweredby-credits' => "Hierdie wiki word aangedryf deur '''[//www.mediawiki.org/ MediaWiki]''', kopiereg © 2001-$1 $2.",
 'version-poweredby-others' => 'andere',
+'version-poweredby-translators' => 'translatewiki.net-vertalers',
 'version-credits-summary' => 'Ons erken graag die volgende persone vir hul bydrae aan [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki is vrye sagteware, u kan MediaWiki versprei en/of wysig onder die voorwaardes van die "GNU Algemene Publieke Lisensie", soos deur die "Free Software Foundation" gepubliseer; óf weergawe 2 van die lisensie, of (as u wil) enige latere weergawe daarvan.
 
@@ -3774,12 +3836,17 @@ Saam met die program moes u \'n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van van
 'version-entrypoints-header-entrypoint' => 'Ingang',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Lêerpad',
-'filepath-page' => 'Lêer:',
-'filepath-submit' => 'OK',
-'filepath-summary' => "Die spesiale bladsy wys die volledige pad vir 'n lêer.
-Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hulle MIME-geskakelde programme geopen.",
+# Special:Redirect
+'redirect' => 'Aanstuur volgens lêer, gebruiker of weergawenommer',
+'redirect-legend' => "Aanstuur na 'n lêer of bladsy",
+'redirect-summary' => "Hierdie spesiale bladsy stuur aan na 'n lêer (as 'n lêernaam verskaf word), 'n bladsy (as 'n weergawe-nommer verskaf word) of 'n gebruikersblad (as 'n gebruiker-ID verskaf word).",
+'redirect-submit' => 'OK',
+'redirect-lookup' => 'Soek volgens:',
+'redirect-value' => 'Waarde:',
+'redirect-user' => 'Gebruiker-ID',
+'redirect-revision' => 'Bladsy-weergawe',
+'redirect-file' => 'Lêernaam',
+'redirect-not-exists' => 'Waarde nie gevind nie',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Soek duplikaat lêers',
@@ -3829,12 +3896,16 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'tags' => 'Geldige wysigings-etikette',
 'tag-filter' => '[[Special:Tags|Etiketfilter]]:',
 'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiket|Etikette}}]]: $2)',
 'tags-title' => 'Etikette',
 'tags-intro' => 'Hierdie bladsy bevat die etikette waarmee die sagteware wysigings mee kan merk, en hul betekenis.',
 'tags-tag' => 'Etiketnaam',
 'tags-display-header' => 'Weergawe in wysigingslyste',
 'tags-description-header' => 'Volledige beskrywing van betekenis',
+'tags-active-header' => 'Aktief?',
 'tags-hitcount-header' => 'Geëtiketteerde veranderings',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nee',
 'tags-edit' => 'wysig',
 'tags-hitcount' => '$1 {{PLURAL:$1|wysiging|wysigings}}',
 
@@ -3855,6 +3926,7 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'dberr-problems' => 'Jammer! Die webwerf ondervind op die oomblik tegniese probleme.',
 'dberr-again' => "Wag 'n paar minute en probeer dan weer.",
 'dberr-info' => '(Kan nie die databasisbediener kontak nie: $1)',
+'dberr-info-hidden' => '(Kan nie die databasisbediener kontak nie)',
 'dberr-usegoogle' => 'Tot tyd en wyl kan u inligting op Google soek.',
 'dberr-outofdate' => 'Let daarop dat hulle indekse van ons inhoud moontlik verouderd mag wees.',
 'dberr-cachederror' => "Hierdie is 'n gekaste kopie van die aangevraagde blad, en dit mag moontlik nie op datum wees nie.",
@@ -3870,6 +3942,9 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'htmlform-submit' => 'Dien in',
 'htmlform-reset' => 'Maak wysigings ongedaan',
 'htmlform-selectorother-other' => 'Ander',
+'htmlform-no' => 'Nee',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => "Kies 'n opsie",
 
 # SQLite database support
 'sqlite-has-fts' => 'Weergawe $1 met ondersteuning vir vol-teks soektogte ("full-text search")',
@@ -3987,4 +4062,17 @@ Anders kan u die eenvoudige vorm hieronder gebruik. U kommentaar sal by die blad
 # Image rotation
 'rotate-comment' => 'Beeld $1 {{PLURAL:$1|graad|grade}} kloksgewys gedraai',
 
+# Limit report
+'limitreport-title' => 'Ontleder se prestasie:',
+'limitreport-cputime' => 'Tydsgebruik van SVE',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekonde|sekondes}}',
+'limitreport-walltime' => 'Reëel tydsgebruik',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekonde|sekondes}}',
+'limitreport-ppvisitednodes' => 'Aantal nodes besoek tydens voorverwerking:',
+'limitreport-ppgeneratednodes' => 'Aantal nodes geskep tydens voorverwerking:',
+'limitreport-postexpandincludesize' => 'Inklusiegrootte na uitbreiding',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|greep|grepe}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|greep|grepe}}',
+'limitreport-expansiondepth' => 'Hoogste uitbreidingsdiepte',
+
 );
diff --git a/languages/messages/MessagesAln.php b/languages/messages/MessagesAln.php
index d34721f4..c5c19e2d 100644
--- a/languages/messages/MessagesAln.php
+++ b/languages/messages/MessagesAln.php
@@ -97,9 +97,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Shfaqe numrin e përdoruesve mbikëqyrës',
 'tog-oldsig' => 'Parapamja e nënshkrimit ekzistues:',
 'tog-fancysig' => 'Trajto nënshkrimin si tekst (pa vegëz automatike)',
-'tog-externaleditor' => 'Përdor program të jashtëm për redaktim (vetëm për eksperta, lyp përcaktime speciale në kompjuterin tuej)',
-'tog-externaldiff' => 'Përdor program të jashtëm për dallime (vetëm për eksperta, lyp përcaktime speciale në kompjuterin tuej)',
-'tog-showjumplinks' => 'Lejo lidhjet é afrueshmerisë "kapërce tek"',
 'tog-uselivepreview' => 'Trego parapamjén meniheré (JavaScript) (Eksperimentale)',
 'tog-forceeditsummary' => 'Pyetem kur e le përmbledhjen e redaktimit zbrazt',
 'tog-watchlisthideown' => "M'sheh redaktimet e mia nga lista mbikqyrëse",
@@ -113,6 +110,7 @@ $messages = array(
 'tog-showhiddencats' => 'Trego kategoritë e mshefta',
 'tog-noconvertlink' => 'Mos lejo konvertimin e titullit vegëz',
 'tog-norollbackdiff' => 'Trego ndryshimin mbas procedurës së kthimit mbrapa',
+'tog-useeditwarning' => 'Paralajmëron mua kur unë të lë një redakto faqe me ndryshimet e para shpëtimit',
 
 'underline-always' => 'gjithmonë',
 'underline-never' => 'kurrë',
@@ -292,7 +290,7 @@ Ju lutem pritni pak para se me tentue me iu qasë faqes prap.
 
 $1',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Rreth {{SITENAME}}',
 'aboutpage' => 'Project:Rreth',
 'copyright' => 'Përmbajtja mundësohet simbas $1.',
@@ -302,7 +300,6 @@ $1',
 'disclaimers' => 'Shfajsime',
 'disclaimerpage' => 'Project:Shfajsimet e përgjithshme',
 'edithelp' => 'Ndihmë për redaktim',
-'edithelppage' => 'Help:Redaktimi',
 'helppage' => 'Help:Përmbajtja',
 'mainpage' => 'Faqja kryesore',
 'mainpage-description' => 'Faqja Kryesore',
@@ -374,17 +371,6 @@ Lista e faqeve speciale valide gjindet te [[Special:SpecialPages|{{int:specialpa
 # General errors
 'error' => 'Gabim',
 'databaseerror' => 'Gabim në databazë',
-'dberrortext' => 'Ka ndodh nji gabim sintaksor në kërkesën në databazë.
-Kjo mundet me tregue gabim në software.
-Kërkesa e fundit në databazë ishte:
-<blockquote><tt>$1</tt></blockquote>
-mbrenda funksionit "<tt>$2</tt>".
-Databaza ktheu gabimin "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Ka ndodh nji gabim sintaksor në kërkesën në databazë.
-Kërkesa e fundit në databazë ishte:
-"$1"
-mbrenda funksionit "$2".
-Databaza ktheu gabimin "$3: $4".',
 'laggedslavemode' => "'''Kujdes:''' Kjo faqe mundet mos me përmbajtë ndryshime të reja.",
 'readonly' => 'Databaza âsht e bllokueme',
 'enterlockreason' => 'Futni një arsye për bllokimin, gjithashtu futni edhe kohën se kur pritet të çbllokohet',
@@ -434,7 +420,6 @@ Ju lutemi provoni prap mbas disa minutave.',
 'editinginterface' => "'''Kujdes:''' Po redaktoni nji faqe që përdoret për me ofrue tekst të interfaceit të softwareit.
 Ndryshimet në këtë faqe do të prekin pamjen e interfaceit për të gjithë përdoruesit tjerë.
 Për përkthim, konsideroni ju lutem përdorimin e [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], projektin e MediaWiki për përshtatje gjuhësore.",
-'sqlhidden' => '(Kërkesa SQL e msheftë)',
 'cascadeprotected' => 'Kjo faqe âsht e mbrojtun prej redaktimit, për shkak se âsht e përfshime në {{PLURAL:$1|faqen, e cila âsht e mbrojtun|faqet, të cilat janë të mbrojtuna}} me opcionin "zinxhir" të zgjedhun:
 $2',
 'namespaceprotected' => "Nuk keni tagër me redaktue faqe në hapësinën '''$1'''.",
@@ -554,7 +539,7 @@ Për me krye kyçjen, specifikoni fjalëkalimin e ri këtu:',
 'newpassword' => 'Fajlëkalimi i ri:',
 'retypenew' => 'Fjalëkalimi i ri përsëdyti',
 'resetpass_submit' => 'Vendos fjalëkalimin dhe kyçu',
-'resetpass_success' => 'Fjalëkalimi juej u ndryshue me sukses! Tash po kyçeni...',
+'changepassword-success' => 'Fjalëkalimi juej u ndryshue me sukses! Tash po kyçeni...',
 'resetpass_forbidden' => 'Fjalëkalimet nuk mujnë me u ndryshue',
 'resetpass-no-info' => 'Duheni me qenë të kyçun për me iu qasë kësaj faqeje direkt.',
 'resetpass-submit-loggedin' => 'Ndrysho fjalëkalimin',
@@ -750,6 +735,7 @@ Duket se është grisur.',
 'edit-no-change' => 'Redaktimi juaj është anashkaluar pasi që asnjë ndryshim nuk u bë në tekst.',
 'edit-already-exists' => 'Faqja nuk mundej të hapet.
 Ajo tanimë ekziston.',
+'editwarning-warning' => 'Duke e lënë këtë faqe mund të bëjë që ju të humbni ndonjë ndryshim që keni bërë. Nëse ju jeni regjistruar, ju mund ta çaktivizoni këtë paralajmërim në "Tue redaktue" seksionin e preferencave tuaja.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Kujdes: Kjo faqe ka shumë kërkesa që kërkojnë analizë gramatikore të kushtueshme për sistemin.
@@ -903,7 +889,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'searchmenu-legend' => 'Opcionet e kërkimit',
 'searchmenu-exists' => "'''Në këtë wiki âsht nji faqe me titullin \"[[:\$1]]\"'''",
 'searchmenu-new' => "'''Krijo faqen \"[[:\$1]]\" në këtë wiki!'''",
-'searchhelp-url' => 'Help:Përmbajtja',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Shfleto faqet me këtë prefiks]]',
 'searchprofile-articles' => 'Faqet me përmbajtje',
 'searchprofile-project' => 'Faqet e ndihmës dhe projekteve',
@@ -947,14 +932,6 @@ Provoni me ia parashtue kërkesës tuej ''tâna:'' që me lypë tânë përmbajt
 Ndërkohë mundeni me lypë me Google.
 Vini re se indeksat e tyne të përmbajtjes së {{SITENAME}} munden me qenë të vjetëruem.',
 
-# Quickbar
-'qbsettings' => 'Vegla të shpejta',
-'qbsettings-none' => 'Asnji',
-'qbsettings-fixedleft' => 'Lidhun majtas',
-'qbsettings-fixedright' => 'Lidhun djathtas',
-'qbsettings-floatingleft' => 'Pezull majtas',
-'qbsettings-floatingright' => 'Pezull djathtas',
-
 # Preferences page
 'preferences' => 'Parapëlqimet',
 'mypreferences' => 'Parapëlqimet e mija',
@@ -983,7 +960,6 @@ Vini re se indeksat e tyne të përmbajtjes së {{SITENAME}} munden me qenë të
 'resetprefs' => 'Fshij ndryshimet e paruejtuna',
 'restoreprefs' => 'Kthe tâna përcaktimet si në fillim',
 'prefs-editing' => 'Tue redaktue',
-'prefs-edit-boxsize' => 'Madhësia e dritares redaktuese.',
 'rows' => 'Rreshta:',
 'columns' => 'Kolona:',
 'searchresultshead' => 'Kërkimi',
@@ -1503,27 +1479,16 @@ Lejon dhânien e arsyes në përmbledhje.',
 
 # Stylesheets
 'common.css' => '/* CSSi i vendosun këtu ka me u zbatue në tâna dukjet */',
-'standard.css' => '/* CSSi i vendosun këtu ka me i prekë përdoruesit e dukjes standarde */',
-'nostalgia.css' => '/* CSS i vendosun këtu ka me i prekë shfrytëzuesit e dukjes Nostalgia */',
 'cologneblue.css' => '/* CSS i vendosun këtu ka me i prekë shfrytëzuesit e dukjes Cologne Blue */',
 'monobook.css' => '/* CSS i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Monobook */',
-'myskin.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes MySkin */',
-'chick.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Chick */',
-'simple.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Simple */',
 'modern.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Modern */',
 'vector.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Vector */',
 'print.css' => '/* CSSi i vednosun këtu ka me e prekë pamjen e shtypjes */',
-'handheld.css' => '/* CSSi i vednosun këtu ka me i prekë shfletuesit mobil (të dorës) në dukje e konfigurueme në $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Çdo JavaScript këtu ka me u ngarkue për të gjithë përdoruesit në secilën thirrje të faqes. */',
-'standard.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Standard */',
-'nostalgia.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Nostalgia */',
 'cologneblue.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Cologne Blue */',
 'monobook.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen MonoBook */',
-'myskin.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen MySkin */',
-'chick.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Chick */',
-'simple.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Simple */',
 'modern.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Modern */',
 'vector.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Vector */',
 
diff --git a/languages/messages/MessagesAm.php b/languages/messages/MessagesAm.php
index b4336586..da80c4f1 100644
--- a/languages/messages/MessagesAm.php
+++ b/languages/messages/MessagesAm.php
@@ -77,9 +77,6 @@ $messages = array(
 'tog-shownumberswatching' => 'የሚከታተሉ ተጠቃሚዎችን ቁጥር አሳይ',
 'tog-oldsig' => 'የቀድሞው ፊርማ ቅደመ እይታ',
 'tog-fancysig' => 'ጥሬ ፊርማ (ያለራስገዝ ማያያዣ)',
-'tog-externaleditor' => 'በቀዳሚነት ውጪያዊ አራሚን ተጠቀም',
-'tog-externaldiff' => 'በቀዳሚነት የውጭ ልዩነት-ማሳያን ተጠቀም',
-'tog-showjumplinks' => 'የ«ዝለል» አቅላይ መያያዣዎችን አስችል',
 'tog-uselivepreview' => 'ቀጥታ ቅድመ-ዕይታን ይጠቀሙ (JavaScript ያስፈልጋል) (የሙከራ)',
 'tog-forceeditsummary' => 'ማጠቃለያው ባዶ ከሆነ ማስታወሻ ይስጠኝ',
 'tog-watchlisthideown' => 'የራስዎ ለውጦች ከሚከታተሉት ገጾች ይደበቁ',
@@ -91,6 +88,7 @@ $messages = array(
 'tog-diffonly' => 'ከለውጦቹ ስር የገጽ ይዞታ አታሳይ',
 'tog-showhiddencats' => 'የተደበቁ መደቦች ይታዩ',
 'tog-norollbackdiff' => 'ROLLBACK ከማድረግ በኋላ ልዩነቱ ማሳየት ይቅር',
+'tog-useeditwarning' => 'እርማቶችን ሳልቆጥብ የእርማት ገጽ ልዘጋ ስል አስጠንቅቀኝ',
 
 'underline-always' => 'ሁሌም ይህን',
 'underline-never' => 'ሁሌም አይሁን',
@@ -267,7 +265,7 @@ $messages = array(
 $1',
 'pool-errorunknown' => 'የማይታወቅ ስኅተት',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'ስለ {{SITENAME}}',
 'aboutpage' => 'Project:ስለ',
 'copyright' => 'ይዘቱ በ$1 ሥር ይገኛል።',
@@ -277,7 +275,6 @@ $1',
 'disclaimers' => 'የኃላፊነት ማስታወቂያ',
 'disclaimerpage' => 'Project:አጠቃላይ የሕግ ነጥቦች',
 'edithelp' => 'የማረም መመሪያ',
-'edithelppage' => 'Help:የማዘጋጀት እርዳታ',
 'helppage' => 'Help:ይዞታ',
 'mainpage' => 'ዋናው ገጽ',
 'mainpage-description' => 'ዋና ገጽ',
@@ -350,8 +347,6 @@ $1',
 # General errors
 'error' => 'ስኅተት',
 'databaseerror' => 'የመረጃ-ቤት ስህተት',
-'dberrortext' => 'የመረጃ-ቤት ጥያቄ ስዋሰው ስህተት ሆኗል። ይህ ምናልባት በሶፍትዌሩ ወስጥ ያለ ተውሳክ ሊጠቆም ይችላል። መጨረሻ የተሞከረው መረጃ-ቤት ጥያቄ <blockquote><tt>$1</tt></blockquote> ከተግባሩ «<tt>$2</tt>» ውስጥ ነበረ። MySQL ስህተት «<tt>$3: $4</tt>» መለሰ።',
-'dberrortextcl' => 'የመረጃ-ቤት ጥያቄ ስዋሰው ስህተት ሆኗል። መጨረሻ የተሞከረው መረጃ-ቤት ጥያቄ <blockquote><tt>$1</tt></blockquote> ከተግባሩ «<tt>$2</tt>» ውስጥ ነበረ። MySQL ስህተት «<tt>$3: $4</tt>» መለሰ።',
 'laggedslavemode' => 'ማስጠንቀቂያ፦ ምናልባት የቅርብ ለውጦች በገጹ ላይ አይታዩም።',
 'readonly' => 'መረጃ-ቤት ተቆልፏል',
 'enterlockreason' => 'የመቆለፉን ምክንያትና የሚያልቅበትን ሰዓት (በግምት) ይጻፉ።',
@@ -393,7 +388,6 @@ $1',
 'viewsourcetext' => 'የዚህን ገጽ ምንጭ ማየትና መቅዳት ይችላሉ።',
 'protectedinterface' => 'ይህ ገጽ ለስልቱ ገጽታ ጽሑፍን ያቀርባል፣፡ ስለዚህ እንዳይበላሽ ተጠብቋል።',
 'editinginterface' => "'''ማስጠንቀቂያ፦''' ይህ ገጽ ለድረገጹ መልክ ጽሕፈት ይሰጣል። በዊኪ ሁሉ ላይ መላውን የድረገጽ መልክ በቀላል ለማስተርጎም [//translatewiki.net/wiki/Main_Page?setlang=am translatewiki.net] ይጎብኙ።",
-'sqlhidden' => '(የመደበኛ-የመጠይቅ-ቋንቋ (SQL) ጥያቄ ተደበቀ)',
 'cascadeprotected' => "'''ማስጠንቀቂያ፦''' ይህ አርእስት ሊፈጠር ወይም ሊቀየር አይቻልም። ምክንያቱም ወደ {{PLURAL:$1|ተከታተለው አርዕስት|ተከታተሉት አርእስቶች}} ተጨምሯል።
 $2",
 'namespaceprotected' => "በ'''$1''' ክፍለ-ዊኪ ያሉትን ገጾች ለማዘጋጀት ፈቃድ የለዎም።",
@@ -412,8 +406,14 @@ $2",
 በጥቂት ሴኮንድ ውስጥ ወደሚከተለው ገጽ በቀጥታ ይመለሳል፦",
 'welcomeuser' => 'ሰላምታ $1!  እንኳን ደህናመጡ።',
 'yourname' => 'Username / የብዕር ስም:',
+'userlogin-yourname' => 'የብዕር ስም',
+'userlogin-yourname-ph' => 'የብዕር ስም ያስገቡ',
+'createacct-another-username-ph' => 'የብዕር ስም ያስገቡ',
 'yourpassword' => 'Password / መግቢያ ቃል',
+'userlogin-yourpassword-ph' => 'የመግቢያ ቃል ያስገቡ',
 'yourpasswordagain' => 'መግቢያ ቃልዎን ዳግመኛ ይስጡ',
+'createacct-yourpasswordagain' => 'የመግቢያ ቃሉን ይድገሙ',
+'createacct-yourpasswordagain-ph' => 'የመግቢያ ቃሉን ይድገሙ',
 'remembermypassword' => 'ለሚቀጥለው ጊዜ በዚ ኮምፒውተር ላይ በአባልነት ስሜ መግባቴን ( ቢባዛ ለ $1 {{PLURAL:$1|ቀን|ቀናት}}) አስታውስ።',
 'yourdomainname' => 'የእርስዎ ከባቢ (domain)፦',
 'password-change-forbidden' => 'በዚሁ ዊኪ መግቢያ ቃልን መቀይር አልተፈቀደም።',
@@ -432,11 +432,23 @@ $2",
 'gotaccount' => "(አባልነት አሁን ካለዎ፥ '''$1''' ይግቡ)",
 'gotaccountlink' => 'በዚህ',
 'userlogin-resetlink' => 'የመግቢያ ዝርዝርዎን ረተዋልን?',
+'createacct-join' => 'ከዚህ በታች ይመዝገቡ።',
+'createacct-emailrequired' => 'ኢ-ሜይል አድራሻ',
+'createacct-email-ph' => 'ኢ-ሜይል አድራሻዎን ያስገቡ',
 'createaccountmail' => 'በኢ-ሜል',
 'createaccountreason' => 'ምክንያት:',
+'createacct-reason' => 'ምክንያት',
+'createacct-reason-ph' => 'ለምን ሌላ የብዕር ስም ሊያወጡ እንደሆነ',
+'createacct-imgcaptcha-ph' => 'ከላይ የሚታየውን ጽሁፍ ያስገቡ',
+'createacct-submit' => 'የብዕር ስም ለማውጣት',
+'createacct-another-submit' => 'ሌላ የብዕር ስም ለማውጣት',
+'createacct-benefit-heading' => '{{SITENAME}} እንደ እርስዎ ባሉ ሰዎች ነው የሚጻፈው።',
+'createacct-benefit-body1' => '{{PLURAL:$1|እርማት|እርማቶችS}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ገጽ|ገጾችS}}',
 'badretype' => 'የጻፉት መግቢያ ቃሎች አይስማሙም።',
 'userexists' => 'ይህ ብዕር ስም ተይዟል። እባክዎ፣ ሌላ ብዕር ስም ይምረጡ።',
 'loginerror' => 'የመግባት ስኅተት',
+'createacct-error' => 'የብዕር ስም መፍጠር ስህተት',
 'createaccounterror' => 'ይህን አባልነት ለመፍጠር አልተቻለም፦ $1',
 'nocookiesnew' => 'ብዕር ስም ተፈጠረ፣ እርስዎ ግን ገና አልገቡም። በ{{SITENAME}} ተጠቃሚዎች ለመግባት የቃኚ-ማስታወሻ (cookie) ይጠቀማል። በርስዎ ኮምፒውተር ግን የቃኚ-ማስታወሻ እንዳይሠራ ተደርጓል። እባክዎ እንዲሠራ ያድርጉና በአዲስ ብዕር ስምና መግቢያ ቃልዎ ይግቡ።።',
 'nocookieslogin' => 'በ{{SITENAME}} ተጠቃሚዎች ለመግባት የቃኚ-ማስታወሻ (cookie) ይጠቀማል። በርስዎ ኮምፒውተር ግን የቃኚ-ማስታወሻ እንዳይሠራ ተደርጓል። እባክዎ እንዲሠራ ያድርጉና እንደገና ይሞክሩ።',
@@ -495,7 +507,7 @@ $2",
 'newpassword' => 'አዲስ መግቢያ ቃል',
 'retypenew' => 'አዲስ መግቢያ ቃል ዳግመኛ',
 'resetpass_submit' => 'መግቢያ ቃል ለመቀየርና ለመግባት',
-'resetpass_success' => 'የመግቢያ ቃልዎ መቀየሩ ተከናወነ! አሁን መግባት ይደረግልዎታል......',
+'changepassword-success' => 'የመግቢያ ቃልዎ መቀየሩ ተከናወነ! አሁን መግባት ይደረግልዎታል......',
 'resetpass_forbidden' => 'በ{{SITENAME}} የመግቢያ ቃል መቀየር አይቻልም።',
 'resetpass-no-info' => 'ይህንን ገጽ በቀጥታ ለማግኘት አስቀድሞ መግባት ያስፈልጋል።',
 'resetpass-submit-loggedin' => 'ቃልዎ ይቀየር',
@@ -810,7 +822,6 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 'searchmenu-legend' => 'የፍለጋ ምርጫዎች',
 'searchmenu-exists' => "'''\"[[:\$1]]\" የሚባል መጣጥፍ በዚሁ ዊኪ ላይ አለ።'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" የሚባል መጣጥፍ ይፈጠር?'''",
-'searchhelp-url' => 'Help:ይዞታ',
 'searchprofile-articles' => 'ይዞታ ያላቸው መጣጥፎች',
 'searchprofile-project' => 'የዕርዳታ እና የመርሃግብሩ ገጾች',
 'searchprofile-images' => 'ፋይሎች',
@@ -849,13 +860,6 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 'search-external' => 'አፍአዊ ፍለጋ',
 'searchdisabled' => '{{SITENAME}} ፍለጋ አሁን እንዳይሠራ ተደርጓል። ለጊዜው ግን በGoogle ላይ መፈልግ ይችላሉ። የ{{SITENAME}} ይዞታ ማውጫ በዚያ እንዳልታደሰ ማቻሉ ያስታውሱ።',
 
-# Quickbar
-'qbsettings-none' => ' ምንም',
-'qbsettings-fixedleft' => 'በግራ የተለጠፈ',
-'qbsettings-fixedright' => 'በቀኝ የተለጠፈ',
-'qbsettings-floatingleft' => 'በግራ ተንሳፋፊ',
-'qbsettings-floatingright' => 'በቀኝ ተንሳፋፊ',
-
 # Preferences page
 'preferences' => 'ምርጫዎች፤',
 'mypreferences' => 'ምርጫዎች፤',
@@ -883,7 +887,6 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 'saveprefs' => 'ይቆጠብ',
 'resetprefs' => 'እንደ በፊቱ ይታደስ',
 'prefs-editing' => 'የማዘጋጀት ምርጫዎች',
-'prefs-edit-boxsize' => 'ይህ የማዘጋጀት ሳጥን ስፋት ለመወሰን ነው።',
 'rows' => 'በማዘጋጀቱ ሰንጠረዥ ስንት ተርታዎች?',
 'columns' => 'ስንት ዓምዶችስ?',
 'searchresultshead' => 'ፍለጋ',
@@ -917,7 +920,6 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 'prefs-custom-css' => 'ልዩ CSS',
 'prefs-custom-js' => 'ልዩ ጃቫ ስክሪፕት',
 'prefs-emailconfirm-label' => 'የኢ-ሜል ማረጋገጫ',
-'prefs-textboxsize' => 'የማዘጋጀት መስኮት መጠን',
 'youremail' => 'ኢ-ሜል *',
 'username' => 'የብዕር ስም:',
 'uid' => 'የገባበት ቁ.: #',
@@ -1099,7 +1101,6 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 'recentchangeslinked-feed' => 'የተዛመዱ ለውጦች',
 'recentchangeslinked-toolbox' => 'የተዛመዱ ለውጦች',
 'recentchangeslinked-title' => 'በ«$1» በተዛመዱ ገጾች ቅርብ ለውጦች',
-'recentchangeslinked-noresult' => 'በተመለከተው ጊዜ ውስጥ ከዚህ በተያየዙት ገጾች ላይ ምንም ለውጥ አልነበረም።',
 'recentchangeslinked-summary' => "ከዚሁ ገጽ የተያየዙት ሌሎች ጽሑፎች ቅርብ ለውጦች ከታች ይዘረዝራሉ።
 
 በሚከታተሉት ገጾች መካከል ያሉት ሁሉ በ'''ጉልህ ፊደላት''' ይታያሉ።",
@@ -1336,11 +1337,6 @@ $1',
 'statistics-users-active-desc' => 'ባለፈው {{PLURAL:$1|ቀን|$1 ቀን}} ማንኛውንም ድርጊት የሠሩት ተጠቃሚዎች',
 'statistics-mostpopular' => 'ከሁሉ የታዩት ገጾች',
 
-'disambiguations' => 'ወደ መንታ መንገድ የሚያያይዝ',
-'disambiguationspage' => 'Template:መንታ',
-'disambiguations-text' => "የሚከተሉት ጽሑፎች ወደ '''መንታ መንገድ''' እየተያያዙ ነውና ብዙ ጊዜ እንዲህ ሳይሆን ወደሚገባው ርዕስ ቢወስዱ ይሻላል። <br />
-መንታ መንገድ ማለት የመንታ መለጠፊያ ([[MediaWiki:Disambiguationspage]]) ሲኖርበት ነው።",
-
 'doubleredirects' => 'ድርብ መምሪያ መንገዶች',
 'doubleredirectstext' => 'ይህ ድርብ መምሪያ መንገዶች ይዘርዘራል።
 
@@ -1542,10 +1538,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatchthispage' => 'መከታተል ይቅር',
 'notanarticle' => 'መጣጥፍ አይደለም',
 'notvisiblerev' => 'ዕትሙ ጠፍቷል',
-'watchnochange' => 'ከተካከሉት ገጾች አንዳችም በተወሰነው ጊዜ ውስጥ አልተለወጠም።',
 'watchlist-details' => 'አሁን {{PLURAL:$1|$1 ገፅ|$1 ገፆች}} በምትከታተላቸው ገፆች ላይ አሉ (የውይይት ገፅ ሳይጨመር)።',
-'wlheader-enotif' => '* የ-ኢሜል ማስታወቂያ እንዲሠራ ተደርጓል።',
-'wlheader-showupdated' => "* መጨረሻ ከጎበኟቸው ጀምሮ የተቀየሩት ገጾች በ'''ጉልህ ፊደላት''' ይታያሉ",
+'wlheader-enotif' => 'የ-ኢሜል ማስታወቂያ እንዲሠራ ተደርጓል።',
+'wlheader-showupdated' => "መጨረሻ ከጎበኟቸው ጀምሮ የተቀየሩት ገጾች በ'''ጉልህ ፊደላት''' ይታያሉ",
 'watchmethod-recent' => 'የቅርብ ለውጦችን ለሚከታተሉት ገጾች በመፈለግ',
 'watchmethod-list' => 'የሚከታተሉትን ገጾች ለቅርብ ለውጦች በመፈለግ',
 'watchlistcontains' => 'አሁን በሙሉ $1 ገጾች እየተከታተሉ ነው።',
@@ -1853,9 +1848,6 @@ $1',
 'ipb_expiry_invalid' => 'የሚያልቅበት ግዜ አይሆንም።',
 'ipb_already_blocked' => '«$1» ገና ከዚህ በፊት ታግዶ ነው።',
 'ipb-needreblock' => '$1 አሁን ገና ታግዷል። ዝርዝሩን ማስተካከል ፈለጉ?',
-'blockme' => 'ልታገድ',
-'proxyblocker-disabled' => 'ይህ ተግባር እንደማይሠራ ተደርጓል።',
-'proxyblocksuccess' => 'ተደርጓል።',
 'cant-block-while-blocked' => 'እርስዎ እየታገዱ ሌላ ተጠቃሚ ለማገድ አይችሉም።',
 
 # Developer tools
@@ -2160,7 +2152,7 @@ $1',
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ስፋት',
 'exif-imagelength' => 'ቁመት',
 'exif-compression' => 'የመጨመቅ ዘዴ',
@@ -2267,7 +2259,7 @@ $1',
 'exif-cameraownername' => 'ባለ ካሜራ',
 'exif-personinimage' => 'የታየው ሰው',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ያልተጨመቀ',
 
 'exif-unknowndate' => 'ያልታወቀ ቀን',
@@ -2524,7 +2516,6 @@ $3
 'version-variables' => 'ተለዋጮች',
 'version-other' => 'ሌላ',
 'version-hooks' => 'ሜንጦዎች',
-'version-extension-functions' => 'የቅጥያ ሥራዎች',
 'version-parser-extensiontags' => 'የዝርዛሪ ቅጥያ ምልክቶች',
 'version-parser-function-hooks' => 'የዘርዛሪ ተግባር ሜጦዎች',
 'version-hook-name' => 'የሜንጦ ስም',
@@ -2535,13 +2526,6 @@ $3
 'version-software-product' => 'ሶፍትዌር',
 'version-software-version' => 'ዝርያ',
 
-# Special:FilePath
-'filepath' => 'የፋይል መንገድ',
-'filepath-page' => 'ፋይሉ፦',
-'filepath-submit' => 'መንገድ',
-'filepath-summary' => 'ይህ ልዩ ገጽ ለ1 ፋይል ሙሉ መንገድ ይሰጣል።<br />
-ስዕል በሙሉ ማጉላት ይታያል፤ ሌላ አይነት ፋይል በሚገባው ፕሮግራም በቀጥታ ይጀመራል።',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ለቅጂ ፋይሎች መፈልግ',
 'fileduplicatesearch-legend' => 'ለቅጂ ለመፈልግ',
diff --git a/languages/messages/MessagesAn.php b/languages/messages/MessagesAn.php
index f0ed12aa..c180c9fa 100644
--- a/languages/messages/MessagesAn.php
+++ b/languages/messages/MessagesAn.php
@@ -161,9 +161,6 @@ $messages = array(
 'tog-shownumberswatching' => "Amostrar o numero d'usuarios que cosiran un articlo",
 'tog-oldsig' => 'Sinyadura actual',
 'tog-fancysig' => 'Tratar as sinyaduras como wikitexto (sin de vinclo automatico)',
-'tog-externaleditor' => "Fer servir l'editor externo por defecto (nomás ta espiertos, cal que faiga achustes especials en o suyo ordenador.  [//www.mediawiki.org/wiki/Manual:External_editors Mas información.])",
-'tog-externaldiff' => 'Fer servir o visualizador de diferencias externo por defecto (nomás ta expertos, cal que faiga achustes especials en o suyo ordenador.  [//www.mediawiki.org/wiki/Manual:External_editors Mas información.])',
-'tog-showjumplinks' => 'Activar vinclos d\'accesibilidat "blincar enta"',
 'tog-uselivepreview' => 'Activar previsualización automatica (cal JavaScript) (Esperimental)',
 'tog-forceeditsummary' => 'Avisar-me quan o campo de resumen siga buedo.',
 'tog-watchlisthideown' => 'Amagar as mías edicions en a lista de seguimiento',
@@ -177,6 +174,7 @@ $messages = array(
 'tog-showhiddencats' => 'Amostrar categorías amagatas',
 'tog-noconvertlink' => 'Desactivar a conversión de titol de vinclo',
 'tog-norollbackdiff' => 'No amostrar as diferencias dimpués de revertir',
+'tog-useeditwarning' => "Alvertir-me quan salga d'una pachina d'edición sin alzar os cambios",
 
 'underline-always' => 'Siempre',
 'underline-never' => 'Nunca',
@@ -362,7 +360,7 @@ $1",
 'pool-queuefull' => 'A coda de treballo ye plena',
 'pool-errorunknown' => 'Error desconoixida',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Información sobre {{SITENAME}}',
 'aboutpage' => 'Project:Sobre',
 'copyright' => 'O conteniu ye disponible baixo a licencia $1.',
@@ -372,7 +370,6 @@ $1",
 'disclaimers' => 'Alvertencias chenerals',
 'disclaimerpage' => 'Project:Alvertencias chenerals',
 'edithelp' => 'Aduya ta editar pachinas',
-'edithelppage' => "Help:Cómo s'edita una pachina",
 'helppage' => 'Help:Aduya',
 'mainpage' => 'Portalada',
 'mainpage-description' => 'Portalada',
@@ -446,17 +443,6 @@ Puede trobar una lista de pachinas especials en [[Special:SpecialPages|{{int:spe
 # General errors
 'error' => 'Error',
 'databaseerror' => "Error d'a base de datos",
-'dberrortext' => 'Ha sucedito una error de sintaxi en una consulta a la base de datos.
-Isto podría marcar una error en o programa.
-A zaguera consulta estió:
-<blockquote><tt>$1</tt></blockquote>
-dende adintro d\'a función "<tt>$2</tt>".
-A error retornata por a base de datos estió "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'S\'ha producito una error de sintaxi en una consulta a la base de datos.
-A zaguera consulta estió:
-"$1"
-dende adintro d\'a función "$2".
-A base de datos retornó a error "$3: $4"',
 'laggedslavemode' => "Pare cuenta: podrían faltar as zagueras edicions d'ista pachina.",
 'readonly' => 'Base de datos bloqueyata',
 'enterlockreason' => "Esplique a causa d'o bloqueyo, incluyendo una estimación de quán se producirá o desbloqueyo",
@@ -504,7 +490,6 @@ Consulta: $2',
 'viewyourtext' => "Puet veyer y copiar o codigo d''''as suyas edicions''' en ista pachina:",
 'protectedinterface' => "Ista pachina furne o texto d'a interfaz ta o software. Ye protechita ta privar o vandalismo. Si creye que bi ha bella error, contacte con un administrador.",
 'editinginterface' => "'''Pare cuenta:''' Ye editando una pachina emplegata ta furnir o texto d'a interfaz de {{SITENAME}}. Os cambeos en ista pachina tendrán efecto en l'aparencia d'a interfaz ta os atros usuarios. Ta fer traduccions d'a interfaz, puede considerar fer servir [//translatewiki.net/wiki/Main_Page?setlang=an translatewiki.net], o prochecto de localización de MediaWiki.",
-'sqlhidden' => '(Consulta SQL amagata)',
 'cascadeprotected' => 'Ista pachina ye protechita y no se puede editar porque ye incluyita en {{PLURAL:$1|a siguient pachina|as siguients pachinas}}, que son protechitas con a opción de "cascada": $2',
 'namespaceprotected' => "No tiene premiso ta editar as pachinas d'o espacio de nombres '''$1'''.",
 'customcssprotected' => 'No tiene permisos ta editar a pachina CSS porque contién parametros personal de belatro usuario.',
@@ -526,7 +511,6 @@ Puede continar navegando por {{SITENAME}} anonimament, u puede <span class='plai
 'yourpassword' => "Clau d'acceso:",
 'yourpasswordagain' => 'Torne a escribir a clau:',
 'remembermypassword' => "Remerar o mío nombre d'usuario y a clau entre sesions en iste navegador (como muito por $1 {{PLURAL:$1|día|días}})",
-'securelogin-stick-https' => "Continar connectau con HTTPS dimpués d'encetar sesión",
 'yourdomainname' => 'Dominio:',
 'externaldberror' => "Bi habió una error d'autenticación externa d'a base de datos u bien no tiene premisos ta esviellar a suya cuenta externa.",
 'login' => 'Encetar sesión',
@@ -615,7 +599,7 @@ Si a cuenta s\'ha creyato por error, simplament ignore iste mensache.',
 'newpassword' => 'Nueva clau:',
 'retypenew' => 'Torne a escribir a nueva clau:',
 'resetpass_submit' => 'Cambiar a clau y identificar-se',
-'resetpass_success' => 'A suya clau ya ye cambiata. Agora ya puede dentrar-ie...',
+'changepassword-success' => 'A suya clau ya ye cambiata. Agora ya puede dentrar-ie...',
 'resetpass_forbidden' => "No se puede cambiar as claus d'acceso",
 'resetpass-no-info' => 'Debe identificar-se como usuario ta poder acceder dreitament ta ista pachina.',
 'resetpass-submit-loggedin' => 'Cambiar a clau',
@@ -626,10 +610,8 @@ Talment ya ha cambiato a suya clau u ha demandato una nueva clau temporal.',
 
 # Special:PasswordReset
 'passwordreset' => "Restablir a clau d'acceso",
-'passwordreset-text' => "Completar ista forma ta recibir un recordatorio por correu con os detalles d'a suya cuenta.",
 'passwordreset-legend' => "Restablir a clau d'acceso",
 'passwordreset-disabled' => "S'ha desactivau o restablimiento de claus en ista wiki.",
-'passwordreset-pretext' => "{{PLURAL:$1||Introduzca uno d'os siguients datos}}",
 'passwordreset-username' => "Nombre d'usuario:",
 'passwordreset-domain' => 'Dominio:',
 'passwordreset-capture' => 'Veyer o mensache resultant?',
@@ -840,6 +822,7 @@ Pareix que la hesen borrau.",
 'edit-no-change' => "S'ha ignorato a suya edición, pos no s'ha feito garra cambeo ta o texto.",
 'edit-already-exists' => "No s'ha puesto creyar una pachina nueva.
 Ya existe.",
+'editwarning-warning' => "Si sale d'ista pachina perderá totz os cambios que haiga feito. Si tiene una cuenta d'usuario, puet eliminar ista alvertencia en a sección «Caixa d'edición» d'as suyas preferencies.",
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Pare cuenta: Ista pachina tiene masiadas cridas ta funcions de preproceso (parser functions) costosas.
@@ -1059,7 +1042,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
 'searchmenu-legend' => 'Opcions de busca',
 'searchmenu-exists' => "'''Bi ha una pachina clamada \"[[\$1]]\" en ista wiki'''",
 'searchmenu-new' => "'''Creyar a pachina \"[[:\$1]]\" en ista wiki!'''",
-'searchhelp-url' => 'Help:Aduya',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Veyer pachinas con iste prefixo]]',
 'searchprofile-articles' => 'Pachinas de conteniu',
 'searchprofile-project' => "Pachinas d'aduya y d'o prochecto",
@@ -1101,15 +1083,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
 'search-external' => 'Busca externa',
 'searchdisabled' => 'A busca en {{SITENAME}} ye temporalment desactivata. Entremistanto, puede mirar en {{SITENAME}} fendo servir buscadors externos, pero pare cuenta que os suyos endices de {{SITENAME}} puede no estar esviellatos.',
 
-# Quickbar
-'qbsettings' => 'Preferencias de "Quickbar"',
-'qbsettings-none' => 'Garra',
-'qbsettings-fixedleft' => 'Fixa a la zurda',
-'qbsettings-fixedright' => 'Fixa a la dreita',
-'qbsettings-floatingleft' => 'Flotant a la zurda',
-'qbsettings-floatingright' => 'Flotant a la dreita',
-'qbsettings-directionality' => "Fixato, pendendo en a direccionalidat d'o suyo script y o suyo luengache",
-
 # Preferences page
 'preferences' => 'Preferencias',
 'mypreferences' => 'Preferencias',
@@ -1141,7 +1114,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
 'resetprefs' => "Tornar t'as preferencias por defecto",
 'restoreprefs' => 'Restaure todas as confeguracions por defecto',
 'prefs-editing' => 'Edición',
-'prefs-edit-boxsize' => "Grandaria d'a finestra d'edición.",
 'rows' => 'Ringleras:',
 'columns' => 'Columnas:',
 'searchresultshead' => 'Mirar',
@@ -1152,9 +1124,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
 'recentchangesdays-max' => '(masimo $1 {{PLURAL:$1|día|días}})',
 'recentchangescount' => "Numero d'edicions a amostrar, por defecto:",
 'prefs-help-recentchangescount' => 'Inclui os zaguers cambeos, historials de pachina y rechistros.',
-'prefs-help-watchlist-token' => "Si plena iste campo con una clau secreta se chenerará n filo RSS t'a suya lista de seguimeinto.
-Qui conoixca ista clau podrá leyer a suya lista de seguimiento, asinas que esliya una clau segura.
-Contino se i amuestra una calu chenerata de traza aleatoria que puede fer servir si quiere: $1",
 'savedprefs' => "S'han alzato as suyas preferencias.",
 'timezonelegend' => 'Fuso horario:',
 'localtime' => 'Hora local:',
@@ -1185,7 +1154,6 @@ Contino se i amuestra una calu chenerata de traza aleatoria que puede fer servir
 'prefs-reset-intro' => "Puet emplegar ista pachina ta restaurar as suyas preferencias a las valuras por defecto d'o sitio.
 No se podrá desfer iste cambio.",
 'prefs-emailconfirm-label' => 'Confirmación de correu electronico:',
-'prefs-textboxsize' => "Mida d'a pachina d'edición",
 'youremail' => 'Adreza de correu electronico:',
 'username' => "Nombre d'usuario:",
 'uid' => "ID d'usuario:",
@@ -1423,7 +1391,6 @@ Habría de tener menos de $1 {{PLURAL:$1|carácter|carácters}}.',
 'recentchangeslinked-feed' => 'Cambeos relacionatos',
 'recentchangeslinked-toolbox' => 'Cambios relacionatos',
 'recentchangeslinked-title' => 'Cambeos relacionatos con "$1"',
-'recentchangeslinked-noresult' => 'No bi habió cambeos en as pachinas vinculatas en o intervalo de tiempo indicato.',
 'recentchangeslinked-summary' => "Ista ye una lista d'os zaguers cambios feitos en pachinas con vinclos dende una pachina especifica (u ta miembros d'una categoría especificata).  S'amuestran en '''negreta''' as pachinas d'a suya [[Special:Watchlist|lista de seguimiento]].",
 'recentchangeslinked-page' => "Nombre d'a pachina:",
 'recentchangeslinked-to' => "En cuentas d'ixo, amostrar os cambios en pachinas con vinclos enta a pachina data",
@@ -1646,7 +1613,6 @@ Por seguridat, s'ha desactivau img_auth.php.",
 'http-read-error' => 'Error de lectura HTTP.',
 'http-timed-out' => 'A requesta HTTP ha circumducito.',
 'http-curl-error' => 'Error en recuperar a URL: $1',
-'http-host-unreachable' => "No s'ha puesto acceder t'a URL.",
 'http-bad-status' => 'Ha habiu un problema en a requesta HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1790,12 +1756,6 @@ Debaixo s'amuestra a descripción d'a suya [$2 pachina de descripción].",
 'statistics-users-active-desc' => 'Usuarios que han feito qualsiquier acción en {{PLURAL:$1|o zaguer día|os zaguers $1 días}}',
 'statistics-mostpopular' => 'Pachinas más vistas',
 
-'disambiguations' => 'Pachinas con vinclos enta pachinas de desambigación',
-'disambiguationspage' => 'Template:Desambigación',
-'disambiguations-text' => "As siguients pachinas tienen vinclos ta una '''pachina de desambigación'''.
-Ixos vinclos habrían de ir millor t'a pachina especifica apropiada.<br />
-Una pachina se considera pachina de desambigación si fa servir una plantilla provenient de  [[MediaWiki:Disambiguationspage]].",
-
 'doubleredirects' => 'Reendreceras dobles',
 'doubleredirectstext' => "En ista pachina s'amuestran as pachinas que son reendreceras enta atras pachinas reendrezatas.
 Cada ringlera contién o vinclo t'a primer y segunda reendreceras, y tamién o destino d'a segunda reendrecera, que ye a ormino a pachina obchectivo \"reyal\" a la que a primer pachina habría d'endrezar.",
@@ -2028,10 +1988,9 @@ L\'adreza de correu-e que endicó en as suyas [[Special:Preferences|preferencias
 'unwatchthispage' => 'Deixar de cosirar',
 'notanarticle' => 'No ye una pachina de conteniu',
 'notvisiblerev' => "S'ha borrato a revisión",
-'watchnochange' => "Dengún d'os articlos d'a suya lista de seguimiento no s'ha editato en o periodo de tiempo amostrato.",
 'watchlist-details' => '{{PLURAL:$1|$1 pachina|$1 pachinas}} en a suya lista de seguimiento, sin contar-ie as pachinas de descusión.',
-'wlheader-enotif' => '* A notificación por correu electronico ye activata',
-'wlheader-showupdated' => "* Las pachinas cambiadas dende a suya zaguer vesita s'amuestran en '''negreta'''",
+'wlheader-enotif' => 'A notificación por correu electronico ye activata',
+'wlheader-showupdated' => "Las pachinas cambiadas dende a suya zaguer vesita s'amuestran en '''negreta'''",
 'watchmethod-recent' => 'Mirando pachinas cosiratas en os zaguers cambeos',
 'watchmethod-list' => 'mirando edicions recients en as pachinas cosiratas',
 'watchlistcontains' => 'A suya lista de seguimiento tiene $1 {{PLURAL:$1|pachina|pachinas}}.',
@@ -2256,7 +2215,7 @@ $1",
 'contributions' => "Contribucions de {{GENDER:$1|l'usuario|la usuaria}}",
 'contributions-title' => "Contribucions de l'usuario $1",
 'mycontris' => 'Contribucions',
-'contribsub2' => 'De $1 ($2)',
+'contribsub2' => 'Ta {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "No s'han trobato cambeos que concordasen con ixos criterios",
 'uctop' => '(zaguer cambeo)',
 'month' => 'Dende o mes (y anteriors):',
@@ -2412,11 +2371,8 @@ Ta más detalles, debaixo s'amuestra o rechistro de supresions:",
 'ipb_blocked_as_range' => "Error: L'adreza IP $1 no s'ha bloqueyato dreitament y por ixo no se puede desbloqueyar. Manimenos, ye bloqueyata por estar parte d'o rango $2, que sí puede desbloqueyar-se de conchunta.",
 'ip_range_invalid' => "O rango d'adrezas IP no ye conforme.",
 'ip_range_toolarge' => 'No se permiten os bloqueyos de rangos más grans que /$1.',
-'blockme' => 'bloqueyar-me',
 'proxyblocker' => 'bloqueyador de proxies',
-'proxyblocker-disabled' => 'Ista función ye desactivata.',
 'proxyblockreason' => "S'ha bloqueyato a suya adreza IP porque ye un proxy ubierto. Por favor, contaute on o suyo furnidor de servicios d'Internet u con o suyo servicio d'asistencia tecnica e informe-les d'iste grau problema de seguridat.",
-'proxyblocksuccess' => 'Feito.',
 'sorbsreason' => 'A suya adreza IP ye en a lista de proxies ubiertos en a DNSBL de {{SITENAME}}.',
 'sorbs_create_account_reason' => 'A suya adreza IP ye en a lista de proxies ubiertos en a DNSBL de {{SITENAME}}. No puede creyar una cuenta',
 'cant-block-while-blocked' => 'No puet bloqueyar a atros usuarios en o tiempo que ye bloqueyato.',
@@ -2718,17 +2674,11 @@ Puede veyer-ne, manimenos, o codigo fuent.',
 
 # Stylesheets
 'common.css' => '/* Os estilos CSS definius aquí aplicarán a todas as apariencias (skins) */',
-'standard.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Standard */",
-'nostalgia.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Nostalgia */",
 'cologneblue.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Cologne Blue */",
 'monobook.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Monobook */",
-'myskin.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que que faigan servir l'apariencia MySkin */",
-'chick.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Chick */",
-'simple.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Simpla */",
 'modern.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Modern */",
 'vector.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Vector */",
 'print.css' => '/* Os estilos CSS colocaus aquí afectarán a la impresión */',
-'handheld.css' => '/* Os estilos CSS colocaus aquí afectarán a os dispositivos mobils basaus en as apariencias configuradas en $wgHandheldStyle */',
 'noscript.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que tiengan desactivato JavaScript */",
 'group-autoconfirmed.css' => "/* Os estilos CSS colocaus aquí s'aplicarán nomás a os usuarios autoconfirmatos*/",
 'group-bot.css' => "/* Os estilos CSS colocaus aquí s'aplicarán nomás a os bots*/",
@@ -2737,13 +2687,8 @@ Puede veyer-ne, manimenos, o codigo fuent.',
 
 # Scripts
 'common.js' => '/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios en cada carga de pachina */',
-'standard.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Estandar */",
-'nostalgia.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Nostalgia. */",
 'cologneblue.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Colonia azul */",
 'monobook.js' => "/* O codigo Javascript que se meta aquí será cargau por os usuarios faigan servir l'apariencia MonoBook */",
-'myskin.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia MySkin */",
-'chick.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Chick */",
-'simple.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Simple */",
 'modern.js' => "/* O codigo Javascript que se meta aquí será cargau por os usuarios faigan servir l'apariencia Modern */",
 'vector.js' => '/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que usen a piel Vector */',
 'group-autoconfirmed.js' => '/* Qualsiquier codigo Javascript escrito aquí se cargará nomás ta os usuarios autoconfirmatos */',
@@ -2783,13 +2728,8 @@ Puede veyer-ne, manimenos, o codigo fuent.',
 'pageinfo-authors' => "Numero d'autors diferents",
 
 # Skin names
-'skinname-standard' => 'Clasica (Classic)',
-'skinname-nostalgia' => 'Recosiros (Nostalgia)',
 'skinname-cologneblue' => 'Colonia Azul (Cologne Blue)',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'A mía aparencia (MySkin)',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Simpla (Simple)',
 'skinname-modern' => 'Moderna',
 'skinname-vector' => 'Vector',
 
@@ -2890,7 +2830,7 @@ Os campos de metadatos d'a imachen que amaneixen en iste mensache s'amostrarán
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Amplaria',
 'exif-imagelength' => 'Altaria',
 'exif-bitspersample' => 'Bits por component',
@@ -3068,7 +3008,7 @@ Os campos de metadatos d'a imachen que amaneixen en iste mensache s'amostrarán
 'exif-originalimageheight' => "Altaria d'a imachen antes d'estar retallada",
 'exif-originalimagewidth' => "Amplaria d'a imachen antes d'estar retallada",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sin de compresión',
 'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
 'exif-compression-3' => 'Codificación de fax CCITT grupo 3',
@@ -3452,7 +3392,6 @@ Tamién puede fer servir o [[Special:EditWatchlist|editor estándar]].",
 'version-other' => 'Atros',
 'version-mediahandlers' => 'Maneyador de fichers multimedia',
 'version-hooks' => 'Grifios (Hooks)',
-'version-extension-functions' => "Funcions d'a estensión",
 'version-parser-extensiontags' => "Etiquetas d'estensión d'o parseyador",
 'version-parser-function-hooks' => "Grifios d'as funcions d'o parseyador",
 'version-hook-name' => "Nombre d'o grifio",
@@ -3470,13 +3409,6 @@ Con iste programa ha d'haber recibiu [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia
 'version-software-product' => 'Producto',
 'version-software-version' => 'Versión',
 
-# Special:FilePath
-'filepath' => "Camín d'o fichero",
-'filepath-page' => 'Fichero:',
-'filepath-submit' => 'Ir-ie',
-'filepath-summary' => "Ista pachina especial le retorna o camín completo d'un fichero.
-As imachens s'amuestran en resolución completa, a resta de fichers fan encetar dreitament os suyos programas asociatos.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Mirar fichers duplicatos',
 'fileduplicatesearch-summary' => 'Mirar archivos duplicatos basatos en a suya valura hash.',
diff --git a/languages/messages/MessagesAng.php b/languages/messages/MessagesAng.php
index 429a5fab..c2bc3743 100644
--- a/languages/messages/MessagesAng.php
+++ b/languages/messages/MessagesAng.php
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Altai uul
  * @author Espreon
  * @author Gott wisst
  * @author JJohnson
@@ -60,9 +61,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Īwan þæt rīm behealdendra brūcenda',
 'tog-oldsig' => 'Genge selfmearc:',
 'tog-fancysig' => 'Dōn selfmearce tō wikitexte (lēas ǣr gedōnes hlencan)',
-'tog-externaleditor' => 'Nota ūtƿeardne ādihttōl tō ȝeƿunelicre ȝesetednesse (synderlīce tō sƿīðe cræftiȝum mannum - þearf ānlica ȝesetednessa on þīnum spearctelle)',
-'tog-externaldiff' => 'Nota ūtƿearde scādunȝe tō ȝeƿunelicre ȝesetednesse (synderlīce tō sƿīðe cræftiȝum mannum - þearf ānlica ȝesetednesse on þīnum spearctelle)',
-'tog-showjumplinks' => 'Þafian "gān tō" gefērra hlencena',
 'tog-uselivepreview' => 'Notian rihte īwde fōrebysene (on costnunge)',
 'tog-forceeditsummary' => 'Cȳðan mē þǣr ic ne wrīte adihtunge sceortnesse',
 'tog-watchlisthideown' => 'Hȳdan mīna adihtunga wiþ þæt behealdungtæl',
@@ -76,6 +74,8 @@ $messages = array(
 'tog-showhiddencats' => 'Īwan gehȳdede floccas',
 'tog-noconvertlink' => 'Ne lǣt hlencena titula āwendunge',
 'tog-norollbackdiff' => 'Forlǣtan scādunge siþþan edweorc sīe gedōn',
+'tog-useeditwarning' => 'Cȳðan mē þǣr ic afare fram adihtunge tramete þe gīet hæbbe unhordoda andwendunga.',
+'tog-prefershttps' => 'Brūc ā sicore þēodednesse þā þū sī inmeldod',
 
 'underline-always' => 'Ǣfre',
 'underline-never' => 'Nǣfre',
@@ -139,6 +139,18 @@ $messages = array(
 'oct' => 'Winterf',
 'nov' => 'Blō',
 'dec' => 'Æf Gē',
+'january-date' => '$1. Æfterran Gēolan',
+'february-date' => '$1. Solmōnaðes',
+'march-date' => '$1. Hrēðmōnaðes',
+'april-date' => '$1. Ēastermōnaðes',
+'may-date' => '$1. Þrimilces',
+'june-date' => '$1. Ǣrran Līðan',
+'july-date' => '$1. Æfterran Līðan',
+'august-date' => '$1. Wēodmōnaðes',
+'september-date' => '$1. Hāligmōnaðes',
+'october-date' => '$1. Winterfylleðes',
+'november-date' => '$1. Blōtmōnaðes',
+'december-date' => '$1. Ǣrran Gēolan',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Flocc|Floccas}}',
@@ -260,7 +272,7 @@ Wē biddaþ þæt þū abīde scortne tīman ǣr þū gesēce to sēonne þisne
 $1',
 'pool-errorunknown' => 'Uncūþ wōh',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Gecȳþness ymbe {{SITENAME}}',
 'aboutpage' => 'Project:Gecȳþness',
 'copyright' => 'Man mæg innunge under $1 findan.',
@@ -270,7 +282,6 @@ $1',
 'disclaimers' => 'Ætsacunga',
 'disclaimerpage' => 'Project:Gemǣne ætsacung',
 'edithelp' => 'Help on adihtunge',
-'edithelppage' => 'Help:Ādihtung',
 'helppage' => 'Help:Innung',
 'mainpage' => 'Hēafodtramet',
 'mainpage-description' => 'Hēafodtramet',
@@ -343,12 +354,6 @@ Getæl gengra syndrigra trameta cann man findan be [[Special:SpecialPages|þǣm
 # General errors
 'error' => 'Wōh',
 'databaseerror' => 'Cȳþþuhordes wōh',
-'dberrortext' => 'Cȳþþuhordes bēne endebyrdnesse wōh gelamp.
-Þis mæg mǣnan wōh on þǣre weorcwrithyrste.
-Sēo nīwoste gesōhte cȳþþuhordes bēn wæs:
-<blockquote><code>$1</code></blockquote>
-fram innan wyrcunge "<code>$2</code>".
-Cȳþþuhord ageaf wōh "<code>$3: $4</code>"',
 'laggedslavemode' => "'''Warnung:''' Wēnunga næbbe se tramet nīwlīca nīwunga.",
 'enterlockreason' => 'Wrīt race þǣre forwiernunge and apinsunge þæs tīman on þǣm bēo sēo forwiernung forlǣten',
 'missingarticle-rev' => '(nīwung#: $1)',
@@ -375,9 +380,17 @@ Cȳþþuhord ageaf wōh "<code>$3: $4</code>"',
 Cnāw þæt sume trametas mihten gīet wesan geīwde swā þū wǣre gīet inmeldod, oþ þæt þū clǣnsie þīnes sēcendtōles hord.",
 'welcomeuser' => 'Wilcume, $1!',
 'yourname' => 'Þīn brūcendnama:',
+'userlogin-yourname' => 'Brūcendnama:',
+'userlogin-yourname-ph' => 'Inwrīt þīnne brūcendnaman',
 'yourpassword' => 'Þafungword:',
+'userlogin-yourpassword' => 'Þafungword',
+'userlogin-yourpassword-ph' => 'Inwrīt þīn þafungword',
+'createacct-yourpassword-ph' => 'Inwrīt þafungword',
 'yourpasswordagain' => 'Wrītan þafungword eft:',
+'createacct-yourpasswordagain' => 'Asēð þafungword',
+'createacct-yourpasswordagain-ph' => 'Wrīt þafungword eft',
 'remembermypassword' => 'Gemynan mīne inmeldunge on þissum webbsēcende (oþ $1 {{PLURAL:$1|dæg|daga}} lengest)',
+'userlogin-remembermypassword' => 'Ætfeolan mīnre inmeldunge',
 'yourdomainname' => 'Þīn geweald:',
 'password-change-forbidden' => 'Þū ne canst awendan þafungword on þissum wiki.',
 'login' => 'Inmeldian',
@@ -388,6 +401,8 @@ Cnāw þæt sume trametas mihten gīet wesan geīwde swā þū wǣre gīet inmel
 'logout' => 'Ūtmeldian',
 'userlogout' => 'Ūtmeldian',
 'notloggedin' => 'Nā ingemeldod',
+'userlogin-noaccount' => '',
+'userlogin-joinproject' => '',
 'nologin' => 'Næfst þū reccinge? $1',
 'nologinlink' => 'Scieppan reccinge',
 'createaccount' => 'Scieppan reccinge',
@@ -565,7 +580,6 @@ folclicum āgnunge oþþe gelīcum frēom horde (sēo $1 for āscungum).
 'nextn' => 'nīehst {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Sēon ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-new' => "'''Scieppan þone tramet \"[[:\$1]]\" on þissum wiki!'''",
-'searchhelp-url' => 'Help:Innung',
 'searchprofile-articles' => 'Innunge trametas',
 'searchprofile-project' => 'Helpes and Weorca trametas',
 'searchprofile-images' => 'Missenendebyrdness',
@@ -591,9 +605,6 @@ folclicum āgnunge oþþe gelīcum frēom horde (sēo $1 for āscungum).
 'powersearch-field' => 'Sēcan',
 'search-external' => 'Ūtanweard sōcn',
 
-# Quickbar
-'qbsettings-none' => 'Nān',
-
 # Preferences page
 'preferences' => 'Fōreberunga',
 'mypreferences' => 'Mīna fōreberunga',
@@ -1013,7 +1024,6 @@ Gif se brūcend asifte hine. synderlīce sind ymelan geīwda þǣre þe se brūc
 'contribslink' => 'forðunga',
 'unblocklogentry' => 'unfortȳnde $1',
 'block-log-flags-nocreate' => 'Forbēad tō scieppenne reccinge',
-'proxyblocksuccess' => 'Gedōn.',
 
 # Move page
 'movearticle' => 'Wegan tramet:',
@@ -1142,7 +1152,7 @@ Cēos ōðerne naman lā.',
 'metadata-expand' => 'Īwan ēacnode stafas',
 'metadata-collapse' => 'Hȳdan ēacnode stafas',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Wīdnes',
 'exif-imagelength' => 'Hīehþ',
 'exif-compression' => 'Ȝeþryccungmōd',
@@ -1162,7 +1172,7 @@ Cēos ōðerne naman lā.',
 'exif-gpsmeasuremode' => 'Mētungmōd',
 'exif-gpsimgdirection' => 'Rihtung þæs biliðes',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Unȝeþrycced',
 
 'exif-meteringmode-0' => 'Uncūþ',
@@ -1268,11 +1278,6 @@ $5
 'version-hook-name' => 'Angelnama',
 'version-version' => '($1. fadung)',
 
-# Special:FilePath
-'filepath' => 'Ymelan pæþ',
-'filepath-page' => 'Ymele:',
-'filepath-submit' => 'Gān',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Ymelan nama:',
 'fileduplicatesearch-submit' => 'Sēcan',
diff --git a/languages/messages/MessagesAr.php b/languages/messages/MessagesAr.php
index 1bbaffc7..1e82ec51 100644
--- a/languages/messages/MessagesAr.php
+++ b/languages/messages/MessagesAr.php
@@ -9,6 +9,7 @@
  *
  * @author ;Hiba;1
  * @author Abanima
+ * @author Achraf94
  * @author AhmadSherif
  * @author Aiman titi
  * @author Alexknight12
@@ -41,6 +42,7 @@
  * @author Mido
  * @author Mimouni
  * @author Mo7amedsalim
+ * @author Nemo bis
  * @author Obayd
  * @author OsamaK
  * @author Ouda
@@ -503,9 +505,6 @@ $messages = array(
 'tog-shownumberswatching' => 'اعرض عدد المستخدمين المراقبين',
 'tog-oldsig' => 'التوقيع الحالي:',
 'tog-fancysig' => 'وضع الوصلة يدويا واستعمال نص الويكي',
-'tog-externaleditor' => 'استخدم محررًا خارجيًا مبدئيا (للخبراء فقط، يتطلب إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors لمزيد من المعلومات].)',
-'tog-externaldiff' => 'استخدم مستعرض فروقات خارجيًا مبدئيا (للخبراء فقط، يتطلّب إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors للمزيد من المعلومات].)',
-'tog-showjumplinks' => 'فعّل روابط "اذهب إلى" المعاونة',
 'tog-uselivepreview' => 'استعمال المعاينة المباشرة (تجريبي)',
 'tog-forceeditsummary' => 'نبهني عند عدم إدخال ملخص تعديل',
 'tog-watchlisthideown' => 'أخف تعديلاتي من قائمة المراقبة',
@@ -519,6 +518,8 @@ $messages = array(
 'tog-showhiddencats' => 'أظهر التصنيفات المخفية',
 'tog-noconvertlink' => 'عطل تحويل عناوين الروابط',
 'tog-norollbackdiff' => 'أزل الفرق بعد إحداث استرجاع',
+'tog-useeditwarning' => 'حذّرني عندما أغادر تحرير صفحة فيها تغييرات لم أحفظها',
+'tog-prefershttps' => 'دائما استخدم اتصالا آمنا بعد الدخول',
 
 'underline-always' => 'دائما',
 'underline-never' => 'أبدا',
@@ -582,6 +583,18 @@ $messages = array(
 'oct' => 'تشرين الأول',
 'nov' => 'تشرين الثاني',
 'dec' => 'كانون الأول',
+'january-date' => 'كانون الثاني/يناير $1',
+'february-date' => 'شباط/فبراير $1',
+'march-date' => 'آذار/مارس $1',
+'april-date' => 'نيسان/أبريل $1',
+'may-date' => 'أيار/مايو $1',
+'june-date' => 'حزيران/يونيو $1',
+'july-date' => 'تموز/يوليو $1',
+'august-date' => 'آب/أغسطس $1',
+'september-date' => 'أيلول/سبتمبر $1',
+'october-date' => 'تشرين الأول/أكتوبر $1',
+'november-date' => 'تشرين الثاني/نوفمبر $1',
+'december-date' => 'كانون الأول/ديسمبر $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|بلا تصنيف|تصنيف|تصنيفان|تصنيفات}}',
@@ -663,6 +676,7 @@ $messages = array(
 'create-this-page' => 'أنشئ صفحة بهذا العنوان',
 'delete' => 'حذف',
 'deletethispage' => 'احذف هذه الصفحة',
+'undeletethispage' => 'استرجع هذه الصفحة',
 'undelete_short' => 'استرجاع {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}',
 'viewdeleted_short' => 'استعرض {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}',
 'protect' => 'حماية',
@@ -679,7 +693,7 @@ $messages = array(
 'articlepage' => 'اعرض صفحة المحتوى',
 'talk' => 'نقاش',
 'views' => 'معاينة',
-'toolbox' => 'صندوق الأدوات',
+'toolbox' => 'الأدوات',
 'userpage' => 'طالع صفحة المستخدم',
 'projectpage' => 'طالع صفحة المشروع',
 'imagepage' => 'طالع صفحة الملف',
@@ -706,7 +720,7 @@ $1',
 'pool-queuefull' => 'الطابور ملآن',
 'pool-errorunknown' => 'خطأ غير معروف',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'عن {{SITENAME}}',
 'aboutpage' => 'Project:عن',
 'copyright' => 'المحتوى منشور وفق $1 إن لم يرد خلاف ذلك.',
@@ -716,7 +730,6 @@ $1',
 'disclaimers' => 'إخلاء مسؤولية',
 'disclaimerpage' => 'Project:إخلاء مسؤولية عام',
 'edithelp' => 'مساعدة التحرير',
-'edithelppage' => 'Help:تحرير',
 'helppage' => 'Help:محتويات',
 'mainpage' => 'الصفحة الرئيسية',
 'mainpage-description' => 'الصفحة الرئيسية',
@@ -795,17 +808,11 @@ $1',
 # General errors
 'error' => 'عطل',
 'databaseerror' => 'عطل في قاعدة البيانات',
-'dberrortext' => 'حدث عطل في نحو استعلام قاعدة البيانات.
-قد يكون مرجع هذا علّة في البرمجية.
-آخر استعلام أجري في قاعدة البيانات كان:
-<blockquote><tt>$1</tt></blockquote>
-من الدالة "<tt>$2</tt>".
-أرجعت قاعدة البيانات العطل "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'حدث خطأ في صيغة استعلام قاعدة البيانات.
-آخر استعلام طلب من قاعدة البيانات كان:
-"$1"
-من داخل الدالة "$2".
-أرجعت قاعدة البيانات الخطأ "$3: $4"',
+'databaseerror-text' => 'حدث خطأ في إستعلام قاعدة البيانات. قد يشير هذا إلى خطأ في البرنامج.',
+'databaseerror-textcl' => 'حدث خطأ في إستعلام قاعدة البيانات.',
+'databaseerror-query' => 'إستعلام: $1',
+'databaseerror-function' => 'دالة: $1',
+'databaseerror-error' => 'خطأ: $1',
 'laggedslavemode' => "'''تحذير:''' الصفحة قد لا تحتوي على أحدث التحديثات.",
 'readonly' => 'قاعدة البيانات مقفلة',
 'enterlockreason' => 'أدخل سببا للقفل ذاكرا تقديرا لوقت إزالة الغلق',
@@ -839,6 +846,7 @@ $1',
 'cannotdelete-title' => 'تعذّر حذف الصفحة "$1"',
 'delete-hook-aborted' => 'أجهض خطّاف الحذف.
 لم يقدم أي توضيح.',
+'no-null-revision' => 'تعذر إنشاء مراجعة جديدة فارغة لصفحة "$1"',
 'badtitle' => 'عنوان سيء',
 'badtitletext' => 'عنوان الصفحة المطلوب إما غير صحيح أو فارغ، وربما الرابط بين اللغات أو بين المشاريع خاطئ.
 ربما يحوي محارف لا تصلح للاستخدام في العناوين.',
@@ -862,12 +870,15 @@ $1',
 'editinginterface' => "'''تحذير:''' أنت تقوم بتحرير صفحة تستخدم في الواجهة النصية للبرنامج.
 سوف تؤثر التغييرات في هذه الصفحة على مظهر واجهة المستخدم للمستخدمين الآخرين على هذا الويكي.
 لإضافة أو تغيير الترجمات في جميع مشاريع الويكي، رجاءً استخدم [//translatewiki.net/ translatewiki.net]، مشروع الترجمة الخاص بميدياويكي.",
-'sqlhidden' => '(استعلام SQL مخفي)',
 'cascadeprotected' => 'تمت حماية هذه الصفحة من التعديل لأنها مدمجة في {{PLURAL:$1||الصفحة التالية، والتي|الصفحتين التاليتين، واللتين|الصفحات التالية، والتي}} تم استعمال خاصية "حماية الصفحات المدمجة" {{PLURAL:$1||بها|بهما|بها}}:
 $2',
 'namespaceprotected' => "لا تمتلك الصلاحية لتعديل الصفحات في نطاق '''$1'''.",
 'customcssprotected' => 'أنت لا تمتلك السماح لتعديل صفحة الCSS هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.',
 'customjsprotected' => 'أنت لا تمتلك السماح لتعديل صفحة الجافاسكريبت هذه، لأنها تحتوي على الإعدادات الشخصية لمستخدم آخر.',
+'mycustomcssprotected' => 'ليس لديك صلاحية تعديل هذه الصفحة للطرز المتراصة.',
+'mycustomjsprotected' => 'ليس لديك صلاحية تعديل صفحة جافاسكربت هذه.',
+'myprivateinfoprotected' => 'ليس لديك صلاحية تعديل معلوماتك الخاصة.',
+'mypreferencesprotected' => 'ليس لديك صلاحية تعديل تفضيلاتك.',
 'ns-specialprotected' => 'الصفحات الخاصة لا يمكن تعديلها.',
 'titleprotected' => "{{GENDER:$1|حمى|حمت}} [[User:$1|$1]] هذا العنوان من الإنشاء.
 السبب المعطى هو ''$2''.",
@@ -892,10 +903,19 @@ $2',
 'welcomecreation-msg' => 'تم إنشاء حسابك.
 لا تنس تعديل [[Special:Preferences|تفضيلاتك في {{SITENAME}}]].',
 'yourname' => 'اسم المستخدم:',
+'userlogin-yourname' => 'اسم المستخدم',
+'userlogin-yourname-ph' => 'أدخل اسم المستخدم الخاص بك',
+'createacct-another-username-ph' => 'أدخل اسم المستخدم',
 'yourpassword' => 'كلمة السر:',
+'userlogin-yourpassword' => 'كلمة السر',
+'userlogin-yourpassword-ph' => 'أدخل كلمة السر الخاصة بك',
+'createacct-yourpassword-ph' => 'أدخل كلمة السر',
 'yourpasswordagain' => 'أعد كتابة كلمة السر:',
+'createacct-yourpasswordagain' => 'أكد كلمة السر',
+'createacct-yourpasswordagain-ph' => 'أدخل كلمة المرور مرة أخرى',
 'remembermypassword' => 'تذكر دخولي بهذا المتصفح (لمدة أقصاها {{PLURAL:$1||يوم واحد|يومان|$1 أيام|$1 يوما|$1 يوم}})',
-'securelogin-stick-https' => 'ابقَ في اتصال HTTPS بعد الدخول.',
+'userlogin-remembermypassword' => 'أبقني مسجلا للدخول',
+'userlogin-signwithsecure' => 'الولوج باتصّال مؤمّن',
 'yourdomainname' => 'نطاقك:',
 'password-change-forbidden' => 'أنت لا يمكنك تغيير كلمات السر على هذا الويكي.',
 'externaldberror' => 'هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.',
@@ -907,18 +927,43 @@ $2',
 'logout' => 'تسجيل الخروج',
 'userlogout' => 'اخرج',
 'notloggedin' => 'غير مسجل الدخول',
+'userlogin-noaccount' => 'ليس لديك حساب؟',
+'userlogin-joinproject' => 'انضم إلى {{SITENAME}}',
 'nologin' => "ليس لديك حساب؟ '''$1'''.",
 'nologinlink' => 'أنشئ حسابا',
 'createaccount' => 'أنشئ حسابا',
 'gotaccount' => "لديك حساب؟ '''$1'''.",
 'gotaccountlink' => 'تسجيل الدخول',
 'userlogin-resetlink' => 'نسيت تفاصيل الدخول؟',
+'userlogin-resetpassword-link' => 'صفّر كلمة سرّك',
+'helplogin-url' => 'Help:تسجيل الدخول',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|المساعدة في تسجيل الدخول]]',
+'userlogin-loggedin' => 'أنت {{GENDER:$1|مسجل|مسجلة}} الدخول مسبقًا باسم $1. {{GENDER:$1|استخدم|استخدمي}} النموذج بالأسفل لتسجيل الدخول بحساب آخر.',
+'userlogin-createanother' => 'إنشاء حساب آخر',
+'createacct-join' => 'قم بإدخال المعلومات الخاصة بك أدناه.',
+'createacct-another-join' => 'أدخل معلومات الحساب الجديد أدناه.',
+'createacct-emailrequired' => 'عنوان البريد الإلكتروني',
+'createacct-emailoptional' => 'البريد الإلكتروني (اختياري)',
+'createacct-email-ph' => 'أدخل عنوان بريدك الإلكتروني',
+'createacct-another-email-ph' => 'أدخل عنوان البريد الإلكتروني',
 'createaccountmail' => 'استخدم كلمة سر عشوائية مؤقتة وارسلها إلى عنوان البريد الإلكتروني المحدد أدناه',
+'createacct-realname' => 'الاسم الحقيقي (اختياري)',
 'createaccountreason' => 'السبب:',
+'createacct-reason' => 'السبب',
+'createacct-reason-ph' => 'لماذا تقوم بإنشاء حساب آخر',
+'createacct-captcha' => 'تحقق أمني',
+'createacct-imgcaptcha-ph' => 'أدخل النص الذي تراه في الأعلى',
+'createacct-submit' => 'افتح الحساب',
+'createacct-another-submit' => 'أنشئ حسابا آخرا',
+'createacct-benefit-heading' => 'موقع {{SITENAME}} أنشأه أشخاص مثلك.',
+'createacct-benefit-body1' => '{{PLURAL:$1|تحريرا|تحريرات}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|صفحة}}',
+'createacct-benefit-body3' => 'آخر {{PLURAL:$1|مساهم|مساهمين}}',
 'badretype' => 'كلمات السر التي أدخلتها لا تتطابق.',
 'userexists' => 'اسم المستخدم الذي تم إدخاله مستعمل بالفعل.
 الرجاء اختيار اسم مختلف.',
 'loginerror' => 'خطأ في الدخول',
+'createacct-error' => 'خطأ في إنشاء حساب',
 'createaccounterror' => 'تعذر إنشاء حساب المستخدم: $1',
 'nocookiesnew' => 'تم إنشاء حساب المستخدم، ولكنك لست مسجل الدخول بعد.
 يستخدم {{SITENAME}} كوكيز لتسجيل الدخول.
@@ -984,10 +1029,12 @@ $2',
 يمكنك تجاهل هذه الرسالة، لو تم إنشاء هذا الحساب بالخطأ.',
 'usernamehasherror' => 'لا يمكن أن يحتوي اسم المستخدم على محارف هاش',
 'login-throttled' => 'لقد قمت بمحاولات دخول كثيرة جدا مؤخرا.
-من فضلك انتظر قبل المحاولة مرة أخرى.',
+من فضلك انتظر $1 قبل المحاولة مرة أخرى.',
 'login-abort-generic' => 'لم ينجح ولوجك - تم إجهاضه',
 'loginlanguagelabel' => 'اللغة: $1',
 'suspicious-userlogout' => 'رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.',
+'createacct-another-realname-tip' => 'الاسم الحقيقي اختياري.
+إذا اخترت توفيره فسيستخدم لنسبة عمل المستخدم إليه.',
 
 # Email sending
 'php-mail-error-unknown' => "خطأ غير معروف في وظيفة البريد PHP's mail()",
@@ -1004,8 +1051,7 @@ $2',
 'newpassword' => 'كلمة السر الجديدة:',
 'retypenew' => 'أعد كتابة كلمة السر الجديدة:',
 'resetpass_submit' => 'ضبط كلمة السر والدخول',
-'resetpass_success' => 'تم تغيير كلمة المرور الخاصة بك بنجاح!
-يجري تسجيل دخولك...',
+'changepassword-success' => 'تم تغيير كلمة السر بنجاح!',
 'resetpass_forbidden' => 'كلمات السر لا يمكن تغييرها',
 'resetpass-no-info' => 'يجب أن تكون مسجل الدخول للوصول إلى هذه الصفحة مباشرة.',
 'resetpass-submit-loggedin' => 'تغيير كلمة السر',
@@ -1017,10 +1063,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'إعادة ضبط كلمة السر',
-'passwordreset-text' => 'أكمل هذا النموذج لإعادة ضبط كلمة السر الخاصة بك.',
+'passwordreset-text-one' => 'أكمل هذا النموذج لإعادة ضبط كلمة السر الخاصة بك.',
+'passwordreset-text-many' => '{{PLURAL:$1||املأ الحقل لتستعيد كلمة السر|املأ أحد الحقلين لتستعيد كلمة السر|املأ أحد الحقول لتستعيد كلمة السر}}.',
 'passwordreset-legend' => 'إعادة تعيين كلمة السر',
 'passwordreset-disabled' => 'عُطّلت إعادة تعيين كلمة السر على هذه الويكي.',
-'passwordreset-pretext' => '{{PLURAL:$1||أدخل أحد أجزاء البيانات أدناه}}',
+'passwordreset-emaildisabled' => 'تم تعطيل ميزات البريد الإلكتروني على هذه الويكي.',
 'passwordreset-username' => 'اسم المستخدم:',
 'passwordreset-domain' => 'النطاق:',
 'passwordreset-capture' => 'أأعرض البريد الإلكتروني الناتج؟',
@@ -1043,7 +1090,7 @@ $2
 كلمة السر المؤقتة: $2',
 'passwordreset-emailsent' => 'أُرسل بريد إلكتروني لإعادة ضبط كلمة السر.',
 'passwordreset-emailsent-capture' => 'أُرسل بريد إلكتروني لإعادة ضبط كلمة السر، وهو معروض بالأسفل.',
-'passwordreset-emailerror-capture' => 'ولّد بريد إلكتروني تذكيري وهو معروض بالأسفل لكن فشل إرساله للمستخدم: $1',
+'passwordreset-emailerror-capture' => 'تم توليد رسالة بريد إلكتروني لتصفير كلمة السر نصّه التالي، إلا أنه تعذّر إرسال الرّسالة إلى {{GENDER:$2|المستخدم|المستخدمة}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'تغيير عنوان البريد الإلكتروني',
@@ -1057,6 +1104,17 @@ $2
 'changeemail-submit' => 'غيّر البريد الإلكتروني',
 'changeemail-cancel' => 'إلغاء',
 
+# Special:ResetTokens
+'resettokens' => 'غير المفاتيح',
+'resettokens-text' => ' يمكن تغيير المفاتيح من الاطلاع على البيانات الخصوصية المتعلقة بحسابك.
+غير المفاتيح إذا أطلعت عليها أحدهم عن طريف الخطأ أو إذا كان حسابك قد اخترق.',
+'resettokens-no-tokens' => 'ما من مفاتيح للتغيير.',
+'resettokens-legend' => 'غير المفاتيح',
+'resettokens-tokens' => 'مفاتيح:',
+'resettokens-token-label' => '$1 (القيمة الحالية: $2)',
+'resettokens-done' => 'تغيير المفاتيح',
+'resettokens-resetbutton' => 'غير المفاتيح المختارة',
+
 # Edit page toolbar
 'bold_sample' => 'نص غليظ',
 'bold_tip' => 'نص غليظ',
@@ -1261,12 +1319,15 @@ $2
 يبدو أنه تم حذفها.',
 'edit-conflict' => 'تضارب تحريري.',
 'edit-no-change' => 'تعديلك تم تجاهله، لأنه لم يحدث أي تعديل للنص.',
+'postedit-confirmation' => 'تعديلك حفظ.',
 'edit-already-exists' => 'لم يمكن إنشاء صفحة جديدة.
 هي موجودة بالفعل.',
 'defaultmessagetext' => 'نص الرسالة الافتراضي',
 'content-failed-to-parse' => 'فشل في تحليل $2 محتوى لـ $1 نموذج: $3',
 'invalid-content-data' => 'بيانات المحتوى غير صالحة',
 'content-not-allowed-here' => '"$1" المحتوى غير مسموح على صفحة [[$2]]',
+'editwarning-warning' => 'قد تتسبب مغادرة هذه الصفحة بخسارتك لأي تغييرات أجريتها.
+يمكنك تعطيل هذا التحذير إذا كنت والجًا في قسم "التحرير" في تفضيلاتك.',
 
 # Content models
 'content-model-wikitext' => 'نص ويكي',
@@ -1302,6 +1363,7 @@ $2
 'undo-failure' => 'لم يمكن استرجاع التعديل بسبب تعديلات متعارضة تمت على الصفحة.',
 'undo-norev' => 'فشل في الرجوع عن التعديل حيث أنه غير موجود أو تم حذفه.',
 'undo-summary' => 'الرجوع عن التعديل $1 بواسطة [[Special:Contributions/$2|$2]] ([[User talk:$2|نقاش]])',
+'undo-summary-username-hidden' => 'الرجوع عن المراجعة $1 التي أجراها مستخدمي مخفي',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'لا يمكن إنشاء حساب',
@@ -1484,6 +1546,7 @@ $1",
 'compareselectedversions' => 'قارن بين النسختين المختارتين',
 'showhideselectedversions' => 'أظهر/أخف المراجعات المختارة',
 'editundo' => 'رجوع',
+'diff-empty' => '(لا فرق)',
 'diff-multi' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتين أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} {{PLURAL:$2||مستخدم واحد|مستخدمان|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
 'diff-multi-manyusers' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
 'difference-missing-revision' => '{{PLURAL:$2|مراجعة واحدة|$2 مراجعات}} لهذا الفرق ($1) {{PLURAL:$2|لم|لم}} يتم إيجادها.
@@ -1511,7 +1574,6 @@ $1",
 'searchmenu-legend' => 'خيارات البحث',
 'searchmenu-exists' => "*الصفحة '''[[$1]]'''",
 'searchmenu-new' => "'''أنشئ الصفحة \"[[:\$1]]\" في هذا الويكي!'''",
-'searchhelp-url' => 'Help:محتويات',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|تصفح الصفحات بهذه البادئة]]',
 'searchprofile-articles' => 'صفحات المحتوى',
 'searchprofile-project' => 'صفحات المساعدة والمشروع',
@@ -1555,15 +1617,7 @@ $1",
 'searchdisabled' => 'البحث في {{SITENAME}} معطل.
 يمكنك البحث من خلال جوجل في الوقت الحالي.
 لاحظ أن فهارسه لمحتوى {{SITENAME}} ربما تكون غير محدثة.',
-
-# Quickbar
-'qbsettings' => 'لوح سريع',
-'qbsettings-none' => 'بلا تحديد',
-'qbsettings-fixedleft' => 'مثبت لليسار',
-'qbsettings-fixedright' => 'مثبت لليمين',
-'qbsettings-floatingleft' => 'حر لليسار',
-'qbsettings-floatingright' => 'حر لليمين',
-'qbsettings-directionality' => 'ثابت، بناءً على اتجاه كتابة لغتك',
+'search-error' => 'حدث خطأ ما أثناء البحث: $1',
 
 # Preferences page
 'preferences' => 'تفضيلات',
@@ -1597,7 +1651,6 @@ $1",
 'resetprefs' => 'أزل التغييرات غير المحفوظة',
 'restoreprefs' => 'إسترجع كل الإعدادات الافتراضية',
 'prefs-editing' => 'التحرير',
-'prefs-edit-boxsize' => 'حجم نافذة التحرير.',
 'rows' => 'صفوف:',
 'columns' => 'أعمدة:',
 'searchresultshead' => 'بحث',
@@ -1608,9 +1661,8 @@ $1",
 'recentchangesdays-max' => 'الحد الأقصى {{PLURAL:$1|أقل من يوم|يوم واحد|يومان|$1 أيام|$1 يوما|$1 يوم}}',
 'recentchangescount' => 'عدد التعديلات الظاهرة مبدئيا:',
 'prefs-help-recentchangescount' => 'بما في ذلك أحدث التغييرات وتاريخ الصفحات والسجلات.',
-'prefs-help-watchlist-token' => 'سوف يولد ملء هذا الحقل بمفتاح سري تغذية RSS لقائمة مراقبتك.
-سوف يتمكن أي شخص يعرف مفتاح هذا الحقل من قراءة قائمة مراقبتك، لذا فاختر قيمة منيعة.
-هنا قيمة مولدة تلقائيا تستطيع استخدامها: $1',
+'prefs-help-watchlist-token2' => 'هذا هو المفتاح السري لتغذية الوِب لقائمة مراقبتك.
+يمكن لأي شخص يعرفه أن يقرأ قائمة مراقبتك، ولذا لا تتشاركه مع أحد. [[Special:ResetTokens|انقر هنا إذا أردت إعادة ضبطه]].',
 'savedprefs' => 'تم حفظ تفضيلاتك.',
 'timezonelegend' => 'المنطقة الزمنية:',
 'localtime' => 'الوقت المحلي:',
@@ -1641,7 +1693,6 @@ $1",
 'prefs-reset-intro' => 'يمكنك استخدام هذه الصفحة لإعادة تفضيلاتك للحالة الافتراضية للموقع.
 لن تستطيع استرجاع الحالة السابقة.',
 'prefs-emailconfirm-label' => 'تأكيد البريد الإلكتروني:',
-'prefs-textboxsize' => 'حجم نافذة التحرير',
 'youremail' => 'البريد:',
 'username' => '{{GENDER:$1|اسم المستخدم|اسم المستخدمة}}:',
 'uid' => 'رقم {{GENDER:$1|المستخدم|المستخدمة}}:',
@@ -1675,6 +1726,8 @@ $1",
 'prefs-dateformat' => 'صيغة الوقت',
 'prefs-timeoffset' => 'المنطقة الزمنية',
 'prefs-advancedediting' => 'خيارات عامة',
+'prefs-editor' => 'محرر',
+'prefs-preview' => 'عرض مسبق',
 'prefs-advancedrc' => 'خيارات متقدمة',
 'prefs-advancedrendering' => 'خيارات متقدمة',
 'prefs-advancedsearchoptions' => 'خيارات متقدمة',
@@ -1682,7 +1735,9 @@ $1",
 'prefs-displayrc' => 'خيارات العرض',
 'prefs-displaysearchoptions' => 'خصائص العرض',
 'prefs-displaywatchlist' => 'خصائص العرض',
+'prefs-tokenwatchlist' => 'مفتاح',
 'prefs-diffs' => 'فروقات',
+'prefs-help-prefershttps' => 'سيتم تفعيل هذا التفضيل عند ولوجوك في المرة القادمة.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'يبدو أن عنوان البريد الإلكتروني صالح',
@@ -1709,6 +1764,8 @@ $1",
 'userrights-notallowed' => 'ليس لديك إذن لإضافة أو إزالة صلاحيات المستخدمين.',
 'userrights-changeable-col' => 'المجموعات التي يمكنك تغييرها',
 'userrights-unchangeable-col' => 'المجموعات التي لا يمكنك تغييرها',
+'userrights-conflict' => 'تضارب في تغيير صلاحيات المستخدم! الرجاء مراجعة تغييراتك مجدّدا وتأكيدها.',
+'userrights-removed-self' => 'أزلت بنجاح صلاحياتك، ولن تتمكن من الوصول لهذه الصفحة مجددا.',
 
 # Groups
 'group' => 'المجموعة:',
@@ -1774,11 +1831,18 @@ $1",
 'right-proxyunbannable' => 'تفادي عمليات المنع الأوتوماتيكية للبروكسيهات',
 'right-unblockself' => 'رفع المنع عن أنفسهم',
 'right-protect' => 'تغيير مستويات الحماية وتعديل الصفحات المحمية',
-'right-editprotected' => 'تعديل الصفحات المحمية (بدون الحماية المضمنة)',
+'right-editprotected' => 'تعديل الصفحات التي حمايتها "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'تعديل الصفحات التي حمايتها "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'تعديل واجهة المستخدم',
 'right-editusercssjs' => 'تعديل ملفات CSS و JS للمستخدمين الآخرين',
 'right-editusercss' => 'تعديل ملفات CSS للمستخدمين الآخرين',
 'right-edituserjs' => 'تعديل ملفات JS للمستخدمين الآخرين',
+'right-editmyusercss' => 'تعديل ملفات CSS للمستخدم نفسه',
+'right-editmyuserjs' => 'تعديل ملفات جافاسكربت للمستخدم نفسه',
+'right-viewmywatchlist' => 'عرض قائمة مراقبتك',
+'right-viewmyprivateinfo' => 'إستعرض بياناتك الشخصية (مثل البريد الإلكتروني والإسم الحقيقي)',
+'right-editmyprivateinfo' => 'حرر بياناتك الشخصية (مثل البريد الإلكتروني والإسم الحقيقي)',
+'right-editmyoptions' => 'تعديل تفضيلاتك',
 'right-rollback' => 'استرجاع تعديلات آخر مستخدم عدل صفحة معينة سريعا',
 'right-markbotedits' => 'التعليم على تعديلات الاسترجاع كتعديلات بوت',
 'right-noratelimit' => 'غير متأثر بحدود المعدل',
@@ -1830,8 +1894,8 @@ $1",
 'action-block' => 'منع هذا المستخدم من التعديل',
 'action-protect' => 'تغيير مستويات الحماية لهذه الصفحة',
 'action-rollback' => 'استرجاع تعديلات آخر مستخدم عدل صفحة معينة سريعا',
-'action-import' => 'استيراد هذه الصفحة من ويكي آخر',
-'action-importupload' => 'استيراد هذه الصفحة من ملف مرفوع',
+'action-import' => 'استيراد صفحات من ويكي آخر',
+'action-importupload' => 'استيراد صفحات من ملف مرفوع',
 'action-patrol' => 'تعليم تعديلات الآخرين بعلامة المراجعة',
 'action-autopatrol' => 'جعل تعديلك معلم عليه كمراجع',
 'action-unwatchedpages' => 'رؤية قائمة الصفحات غير المراقبة',
@@ -1840,12 +1904,19 @@ $1",
 'action-userrights-interwiki' => 'تعديل صلاحيات المستخدم للمستخدمين في الويكيات الأخرى',
 'action-siteadmin' => 'غلق أو رفع غلق قاعدة البيانات',
 'action-sendemail' => 'إرسال رسائل بريد إلكتروني',
+'action-editmywatchlist' => 'تعديل قائمة مراقبتك',
+'action-viewmywatchlist' => 'مشاهدة قائمة مراقبتك',
+'action-viewmyprivateinfo' => 'مشاهدة معلوماتك الخاصة',
+'action-editmyprivateinfo' => 'تعديل معلوماتك الخاصة',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|منذ الزيارة الأخيرة}}',
+'enhancedrc-history' => 'تاريخ',
 'recentchanges' => 'أحدث التغييرات',
 'recentchanges-legend' => 'خيارات أحدث التغييرات',
 'recentchanges-summary' => 'تابع آخر التغييرات في الويكي من هذه الصفحة.',
+'recentchanges-noresult' => 'لا توجد تغييرات خلال الفترة المحددة تطابق هذه المعايير.',
 'recentchanges-feed-description' => 'تابع أحدث التغييرات للويكي عبر هذه التلقيمة.',
 'recentchanges-label-newpage' => 'أنشأ هذا التعديل صفحة جديدة',
 'recentchanges-label-minor' => 'هذا تعديل طفيف',
@@ -1882,7 +1953,6 @@ $1",
 'recentchangeslinked-feed' => 'تغييرات ذات علاقة',
 'recentchangeslinked-toolbox' => 'تغييرات ذات علاقة',
 'recentchangeslinked-title' => 'التغييرات المرتبطة ب "$1"',
-'recentchangeslinked-noresult' => 'لم تحدث تعديلات في الصفحات التي لها وصلات هنا خلال الفترة المحددة.',
 'recentchangeslinked-summary' => "هذه قائمة بالتغييرات التي تمت حديثا للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).
 الصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''مغلظة'''",
 'recentchangeslinked-page' => 'اسم الصفحة:',
@@ -1894,7 +1964,7 @@ $1",
 'reuploaddesc' => 'إلغاء الرفع والرجوع إلى استمارة الرفع',
 'upload-tryagain' => 'أرسل وصف ملف معدل',
 'uploadnologin' => 'غير مسجل الدخول',
-'uploadnologintext' => 'يتوجب عليك [[Special:UserLogin|تسجيل الدخول]] لرفع الملفات.',
+'uploadnologintext' => 'يجب عليك $1 لترفع الملفات.',
 'upload_directory_missing' => 'مجلد الرفع ($1) مفقود ولم يمكن إنشاؤه بواسطة خادوم الوب.',
 'upload_directory_read_only' => 'مجلد الرفع ($1) لا يمكن الكتابة عليه بواسطة خادوم الوب.',
 'uploaderror' => 'خطأ في الرفع',
@@ -2127,7 +2197,6 @@ $1',
 'http-read-error' => 'خطأ قراءة HTTP.',
 'http-timed-out' => 'انتهت مهلة طلب HTTP.',
 'http-curl-error' => 'فشل جلب المسار: $1',
-'http-host-unreachable' => 'تعذر الوصول إلى المسار.',
 'http-bad-status' => 'ثمة مشكلة أثناء طلب HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2158,6 +2227,10 @@ $1',
 'listfiles_size' => 'الحجم',
 'listfiles_description' => 'الوصف',
 'listfiles_count' => 'نسخ',
+'listfiles-show-all' => 'أدرج النسخ القديمة من الصور',
+'listfiles-latestversion' => 'النسخة الحالية',
+'listfiles-latestversion-yes' => 'نعم',
+'listfiles-latestversion-no' => 'لا',
 
 # File description page
 'file-anchor-link' => 'ملف',
@@ -2257,6 +2330,13 @@ $1',
 'randompage' => 'صفحة عشوائية',
 'randompage-nopages' => 'لا توجد صفحات في {{PLURAL:$2||النطاق التالي|النطاقين التاليين|النطاقات التالية}}: $1.',
 
+# Random page in category
+'randomincategory' => 'صفحة عشوائية في التصنيف',
+'randomincategory-invalidcategory' => '"$1" ليس اسم تصنيف صالح.',
+'randomincategory-nopages' => 'لا توجد صفحات في التصنيف [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => 'عرض صفحة عشوائية من التصنيف:  $1   $2',
+'randomincategory-selectcategory-submit' => 'اذهب',
+
 # Random redirect
 'randomredirect' => 'تحويلة عشوائية',
 'randomredirect-nopages' => 'لا توجد تحويلات في النطاق "$1".',
@@ -2282,12 +2362,6 @@ $1',
 'statistics-users-active-desc' => 'المستخدمون الذين قاموا بفعل في آخر {{PLURAL:$1||يوم|يومين|$1 أيام|$1 يوماً|$1 يوم}}',
 'statistics-mostpopular' => 'أكثر الصفحات مشاهدة',
 
-'disambiguations' => 'الصفحات التي ترتبط بصفحات توضيح',
-'disambiguationspage' => 'Template:توضيح',
-'disambiguations-text' => "الصفحات التالية تحتوي على وصلة واحدة على الأقل إلى '''صفحة توضيح'''.
-ربما ينبغي أن تصل إلى صفحة أكثر ملائمة. <br />
-تعامل الصفحة كصفحة توضيح إذا كان بها قالب موجود في [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop' => 'صفحات مع خاصية الصفحة',
 'pageswithprop-legend' => 'صفحات مع خاصية الصفحة',
 'pageswithprop-text' => 'تسرد هذه الصفحة الصفحات التي تستخدم خاصية صفحة معينة.',
@@ -2350,6 +2424,7 @@ $1',
 'mostrevisions' => 'أكثر الصفحات تعديلا',
 'prefixindex' => 'كل الصفحات بالبادئة',
 'prefixindex-namespace' => 'كل الصفحات مع بادئة ($1 مساحة الأسم)',
+'prefixindex-strip' => 'أخف البادئة من القائمة',
 'shortpages' => 'صفحات قصيرة',
 'longpages' => 'صفحات طويلة',
 'deadendpages' => 'صفحات نهاية مسدودة',
@@ -2365,6 +2440,7 @@ $1',
 'listusers' => 'قائمة الأعضاء',
 'listusers-editsonly' => 'اعرض المستخدمين الذين أجروا تعديلات فقط',
 'listusers-creationsort' => 'رتب حسب تاريخ الإنشاء',
+'listusers-desc' => 'رتب تنازليا',
 'usereditcount' => '{{PLURAL:$1|لا تعديلات|تعديل واحد|تعديلان|$1 تعديلات|$1 تعديلًا|$1 تعديل}}',
 'usercreated' => '{{GENDER:$3|أنشأه|أنشأته}} في $1 الساعة $2',
 'newpages' => 'صفحات جديدة',
@@ -2542,10 +2618,9 @@ $1',
 'unwatchthispage' => 'أوقف المراقبة',
 'notanarticle' => 'ليست صفحة محتوى',
 'notvisiblerev' => 'المراجعة تم حذفها',
-'watchnochange' => 'لم تُعدّل أي صفحة في قائمة مراقبتك خلال الفترة الزمنية المحددة.',
 'watchlist-details' => '{{PLURAL:$1||صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}} في قائمة مراقبتك، بدون عد صفحات النقاش.',
-'wlheader-enotif' => '* الإخطار بالبريد الإلكتروني مفعل.',
-'wlheader-showupdated' => "* الصفحات التي تم تحريرها بعد زيارتك لها لآخر مرة معروضة بالخط '''الغليظ'''",
+'wlheader-enotif' => 'الإخطار بالبريد الإلكتروني مُفعّل.',
+'wlheader-showupdated' => "الصفحات التي تم تحريرها بعد مطالعتك إياها آخر مرة عناوينها بالخط '''الغليظ'''",
 'watchmethod-recent' => 'فحص التعديلات الأخيرة للصفحات المراقبة',
 'watchmethod-list' => 'فحص الصفحات المراقبة للتعديلات الحديثة',
 'watchlistcontains' => 'تحتوي قائمة مراقبتك على {{PLURAL:$1|لا صفحات|صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}}.',
@@ -2958,16 +3033,14 @@ $1',
 لكنه ممنوع كجزء من النطاق $2، والذي يمكن رفع المنع عنه.',
 'ip_range_invalid' => 'نطاق عناوين الأيبي المدخل غير صحيح.',
 'ip_range_toolarge' => 'لا يسمح بنطاقات المنع الأكبر من /$1',
-'blockme' => 'امنعني',
 'proxyblocker' => 'مانع البروكسي',
-'proxyblocker-disabled' => 'هذه الخاصية معطلة.',
 'proxyblockreason' => 'تم منع عنوان الأيبي الخاص بك لكونه بروكسي مفتوح.
 من فضلك اتصل بمزود خدمة الإنترنت الخاص بك أو الدعم الفني وأعلمهم بهذه المشكلة الأمنية الخطيرة.',
-'proxyblocksuccess' => 'تم.',
 'sorbs' => 'دي إن إس بي إل',
 'sorbsreason' => 'عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}.',
 'sorbs_create_account_reason' => 'عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}.
 لا يمكنك إنشاء حساب.',
+'xffblockreason' => 'عنوان آي‌بي مذكور في ترويسة X-Forwarded-For، الذي ربما يخصّك أو يخصّ خادوما وسيطا تستخدمه، قد حُظِر. السبب الأصلي للحظر كان: $1',
 'cant-block-while-blocked' => 'أنت لا يمكنك منع المستخدمين الآخرين بينما أنت ممنوع.',
 'cant-see-hidden-user' => 'المستخدم الذي تحاول منعه تم منعه سابقاً وإخفاؤه. بما أنك لا تمتلك صلاحية إخفاء المستخدم، لا يمكنك مشاهدة المنع أو تعديله.',
 'ipbblocked' => 'لا يمكنك منع أو رفع منع مستخدمين آخرين لأنك ممنوع',
@@ -3134,6 +3207,8 @@ $1',
 'thumbnail-more' => 'كبّر',
 'filemissing' => 'الملف مفقود',
 'thumbnail_error' => 'خطأ في إنشاء صورة مصغرة: $1',
+'thumbnail_error_remote' => 'رسالة عطل من $1:
+$2',
 'djvu_page_error' => 'صفحة DjVu خارج النطاق',
 'djvu_no_xml' => 'لا يمكن جلب XML لملف DjVu',
 'thumbnail-temp-create' => 'تعذر إنشاء ملف الصورة المصغرة المؤقت',
@@ -3286,17 +3361,11 @@ $1',
 
 # Stylesheets
 'common.css' => '/* ستؤثر الأنماط المتراصة (CSS) المعروضة هنا على كل الواجهات */',
-'standard.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة ستاندرد */',
-'nostalgia.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة نوستالشيا */',
 'cologneblue.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة كولون بلو */',
 'monobook.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة مونوبوك */',
-'myskin.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة ماي سكين */',
-'chick.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة تشيك */',
-'simple.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة سيمبل */',
 'modern.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة مودرن */',
 'vector.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة فكتور */',
 'print.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */',
-'handheld.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على الأجهزة المحمولة بالاعتماد على الواجهة المضبوطة في $wgHandheldStyle */',
 'noscript.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على المستخدمين الذين الجافاسكريبت لديهم معطلة */',
 'group-autoconfirmed.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على المستخدمين المؤكدين تلقائيا فقط */',
 'group-bot.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على البوتات فقط */',
@@ -3305,13 +3374,8 @@ $1',
 
 # Scripts
 'common.js' => '/* الجافاسكريبت الموضوع هنا سيتم تحميله لكل المستخدمين مع كل تحميل للصفحة. */',
-'standard.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة ستاندرد */',
-'nostalgia.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة نوستالشيا */',
 'cologneblue.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة كولون بلو */',
 'monobook.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة مونوبوك */',
-'myskin.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة ماي سكين */',
-'chick.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة تشيك */',
-'simple.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة سيمبل */',
 'modern.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة مودرن */',
 'vector.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة فكتور */',
 'group-autoconfirmed.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين المؤكدين تلقائيا فقط */',
@@ -3391,13 +3455,8 @@ $1',
 'pageinfo-category-files' => 'عدد الملفات',
 
 # Skin names
-'skinname-standard' => 'كلاسيك',
-'skinname-nostalgia' => 'نوستالجيا',
 'skinname-cologneblue' => 'كولون بلو',
 'skinname-monobook' => 'مونوبوك',
-'skinname-myskin' => 'ماي سكين',
-'skinname-chick' => 'تشيك',
-'skinname-simple' => 'سيمبل',
 'skinname-modern' => 'مودرن',
 'skinname-vector' => 'فكتور',
 
@@ -3480,11 +3539,25 @@ $1',
 'minutes' => '{{PLURAL:$1||دقيقة واحدة|دقيقتين|$1 دقائق|$1 دقيقة}}',
 'hours' => '{{PLURAL:$1||ساعة واحدة|ساعتين|$1 ساعات|$1 ساعة}}',
 'days' => '{{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}}',
+'weeks' => '{{PLURAL:$1|أسبوع|$1 أسابيع}}',
 'months' => '{{PLURAL:$1||شهر واحد|شهرين|$1 شهور|$1 شهرا|$1 شهر}}',
 'years' => '{{PLURAL:$1||سنة واحدة|سنتين|$1 سنين|$1 سنة}}',
 'ago' => 'قبل $1',
 'just-now' => 'الآن فقط',
 
+# Human-readable timestamps
+'hours-ago' => 'منذ {{PLURAL:$1|ساعة|$1 ساعات}}',
+'minutes-ago' => 'منذ {{PLURAL:$1|دقيقة|$1 دقائق}}',
+'seconds-ago' => 'منذ {{PLURAL:$1|ثانية|$1 ثوان}}',
+'monday-at' => 'يوم الاثنين الساعة $1',
+'tuesday-at' => 'يوم الثلاثاء الساعة $1',
+'wednesday-at' => 'يوم الأربعاء الساعة $1',
+'thursday-at' => 'يوم الخميس الساعة $1',
+'friday-at' => 'يوم الجمعة الساعة $1',
+'saturday-at' => 'يوم السبت الساعة $1',
+'sunday-at' => 'يوم الأحد الساعة $1',
+'yesterday-at' => 'يوم أمس الساعة $1',
+
 # Bad image list
 'bad_image_list' => 'الصيغة كالتالي:
 
@@ -3514,7 +3587,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'العرض',
 'exif-imagelength' => 'الارتفاع',
 'exif-bitspersample' => 'بت لكل مكونة',
@@ -3697,7 +3770,7 @@ $1',
 # Make & model, can be wikified in order to link to the camera and model name
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'غير مضغوط',
 'exif-compression-2' => 'CCITT المجموعة 3 -1 تعديل طول تشغيل ترميز هوفمان البعدي',
 'exif-compression-3' => 'ترميز فاكس المجموعة 3 CCITT',
@@ -4206,7 +4279,6 @@ $5
 'version-other' => 'أخرى',
 'version-mediahandlers' => 'متحكمات الميديا',
 'version-hooks' => 'الخطاطيف',
-'version-extension-functions' => 'وظائف الامتداد',
 'version-parser-extensiontags' => 'وسوم امتداد المحلل',
 'version-parser-function-hooks' => 'خطاطيف دالة المحلل',
 'version-hook-name' => 'اسم الخطاف',
@@ -4216,6 +4288,7 @@ $5
 'version-license' => 'الرخصة',
 'version-poweredby-credits' => "تدار هذه الويكي بواسطة '''[//www.mediawiki.org/ ميدياويكي]'''، حقوق النشر © 2001-$1 $2.",
 'version-poweredby-others' => 'آخرون',
+'version-poweredby-translators' => 'مترجمو translatewiki.net',
 'version-credits-summary' => 'نود أن نعرف بالأشخاص التالية أسماؤهم لمساهمتهم في [[Special:Version|ميدياويكي]].',
 'version-license-info' => "ميدياويكي برنامج حر، يحق لك توزيعه و/أو تعديله وفقاً لبنود رخصة غنو العمومية كما نشرتها مؤسسة البرمجيات الحرة، الإصدار الثاني أو (وفقا لاختيارك أنت) أي إصدار لاحق.
 
@@ -4231,12 +4304,17 @@ $5
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath مسار المقالات]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath مسار السكريبت]',
 
-# Special:FilePath
-'filepath' => 'مسار ملف',
-'filepath-page' => 'الملف:',
-'filepath-submit' => 'اذهب',
-'filepath-summary' => 'هذه الصفحة الخاصة تعرض المسار الكامل لملف.
-ستعرض الصور بأقصى دقة، ستعمل أنواع الملفات الأخرى بالبرنامج المخصص لهم مباشرة.',
+# Special:Redirect
+'redirect' => 'تحويل باسم ملف أو اسم مستخدم أو رقم مراجعة',
+'redirect-legend' => 'تحويل إلى ملف أو صفحة',
+'redirect-summary' => 'هذه الصفحة الخاصة تحوّل إلى ملف (باسمه) أو صفحة (برقم إحدى مراجعاتها) أو إلى صفحة مستخدم (برقمه التعريفي).',
+'redirect-submit' => 'حوّل',
+'redirect-lookup' => 'ابحث في:',
+'redirect-value' => 'الوجهة',
+'redirect-user' => 'رقم مستخدم',
+'redirect-revision' => 'مراجعة صفحة',
+'redirect-file' => 'اسم ملف',
+'redirect-not-exists' => 'المطلوب غير موجود',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'بحث عن ملفات مكررة',
@@ -4286,12 +4364,16 @@ $5
 'tags' => 'وسوم التغيير الصحيحة',
 'tag-filter' => 'مرشح [[Special:Tags|الوسوم]]:',
 'tag-filter-submit' => 'مرشح',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1||وسم|وسمان|وسوم}}]]: $2)',
 'tags-title' => 'وسوم',
 'tags-intro' => 'هذه الصفحة تعرض الوسوم التي ربما يعلم البرنامج تعديلا بها، ومعانيها.',
 'tags-tag' => 'اسم الوسم',
 'tags-display-header' => 'الظهور في قوائم التغييرات',
 'tags-description-header' => 'وصف كامل للمعنى',
+'tags-active-header' => 'نشط؟',
 'tags-hitcount-header' => 'تغييرات موسومة',
+'tags-active-yes' => 'نعم',
+'tags-active-no' => 'لا',
 'tags-edit' => 'عدل',
 'tags-hitcount' => '{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}',
 
@@ -4312,6 +4394,7 @@ $5
 'dberr-problems' => 'عذرا! هذا الموقع يعاني من صعوبات تقنية.',
 'dberr-again' => 'جرب الانتظار بضع دقائق وإعادة التحميل.',
 'dberr-info' => '(غير قادر على الاتصال بخادوم قاعدة البيانات: $1)',
+'dberr-info-hidden' => '(لا يمكن الإتصال بخادم قاعدة البيانات)',
 'dberr-usegoogle' => 'يمكنك محاولة البحث من خلال جوجل في الوقت الحاضر.',
 'dberr-outofdate' => 'لاحظ أن فهارسهم لمحتوانا ربما تكون غير محدثة.',
 'dberr-cachederror' => 'التالي نسخة مخزنة من الصفحة المطلوبة، وربما لا تكون محدثة.',
@@ -4327,6 +4410,9 @@ $5
 'htmlform-submit' => 'إرسال',
 'htmlform-reset' => 'الرجوع عن التغييرات',
 'htmlform-selectorother-other' => 'أخرى',
+'htmlform-no' => 'لا',
+'htmlform-yes' => 'نعم',
+'htmlform-chosen-placeholder' => 'اختر',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 بدعم البحث في كامل النص',
@@ -4444,4 +4530,12 @@ $5
 # Image rotation
 'rotate-comment' => 'تدوير الصورة  {{PLURAL:$1||درجة واحدة|درجتان|$1 درجات|$1 درجة}} باتجاه عقارب الساعة',
 
+# Limit report
+'limitreport-cputime' => 'زمن المعالجة المستغرق',
+'limitreport-cputime-value' => '{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوان|$1 ثانية}}',
+'limitreport-walltime' => 'الزمن الحقيقي المستغرق',
+'limitreport-walltime-value' => '{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوان|$1 ثانية}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 بايت',
+'limitreport-templateargumentsize-value' => '$1/$2 بايت',
+
 );
diff --git a/languages/messages/MessagesArc.php b/languages/messages/MessagesArc.php
index be03e5fa..33b463c6 100644
--- a/languages/messages/MessagesArc.php
+++ b/languages/messages/MessagesArc.php
@@ -159,6 +159,7 @@ $messages = array(
 'tog-watchlisthideanons' => 'ܛܫܝ ܫܘܚܠܦ̈ܐ ܕܡܦܠܚܢ̈ܐ ܠܐ ܝܕ̈ܝܥܐ ܡܢ ܪ̈ܗܝܬܐ',
 'tog-ccmeonemails' => 'ܫܕܪ ܠܝ ܨܚܚ̈ܐ ܕܒܝܠܕܪ̈ܐ ܐܠܩܛܪ̈ܘܢܝܐ ܕܫܕܪ ܐܢܐ ܠܡܦܠܚܢ̈ܐ ܐܚܪ̈ܢܐ',
 'tog-showhiddencats' => 'ܚܘܝ ܣܕܪ̈ܐ ܛܘܫܝ̈ܐ',
+'tog-useeditwarning' => 'ܙܗܪ ܠܝ ܐܡܬܝ ܫܒܩ ܐܢܐ ܦܐܬܐ ܕܫܘܚܠܦܐ ܕܐܝܬ ܒܗ ܫܘܚܠܦ̈ܐ ܠܐ ܠܒܝܟ̈ܐ',
 
 'underline-always' => 'ܐܡܝܢ',
 'underline-never' => 'ܠܐ ܡܡܬܘܡ',
@@ -333,7 +334,7 @@ $1',
 'pool-queuefull' => 'ܣܕܪܐ ܕܦܘܣܣܐ ܡܠܝܐ',
 'pool-errorunknown' => 'ܦܘܕܐ ܠܐ ܝܕܝܥܐ',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'ܡܢܘ {{SITENAME}}',
 'aboutpage' => 'Project:ܡܢܘ',
 'copyright' => 'ܚܒܝܫܬ̈ܐ ܐܝܬ ܬܚܝܬ $1 ܐܢ ܠܝܬ ܠܩܘܒܠܐ.',
@@ -343,7 +344,6 @@ $1',
 'disclaimers' => 'ܠܐ ܡܫܬܐܠܢܘܬܐ',
 'disclaimerpage' => 'Project:ܠܐ ܡܫܬܐܠܢܘܬܐ ܓܘܢܝܬܐ',
 'edithelp' => 'ܥܘܕܪܢܐ ܠܫܚܠܦܬܐ',
-'edithelppage' => 'Help:ܫܚܠܦܬܐ',
 'helppage' => 'Help:ܚܒܝܫܬ̈ܐ',
 'mainpage' => 'ܦܐܬܐ ܪܝܫܝܬܐ',
 'mainpage-description' => 'ܦܐܬܐ ܪܝܫܝܬܐ',
@@ -422,7 +422,6 @@ $1',
 'editinginterface' => "'''ܙܘܗܪܐ:''' ܐܢܬ ܬܫܚܠܦ ܦܐܬܐ ܕܡܬܦܠܚܬ ܒܚܙܝܐ ܟܬܝܒܝܐ ܕܬܚܪܙܬܐ.
 ܟܠ ܫܘܚܠܦܐ ܒܦܐܬܐ ܗܕܐ ܢܗܘܐ ܠܗ ܡܥܒܕܢܘܬܐ ܥܠ ܐܣܟܡ ܦܐܬܐ ܕܡܦܠܚܢܐ ܕܡܦܠܚܢ̈ܐ ܐܚܪ̈ܢܐ ܒܘܝܩܝ ܗܢܐ.
 ܠܡܘܣܦ ܐܘ ܫܘܚܠܦ ܬܘܪ̈ܓܡܐ ܕܟܠܗܘܢ ܘܝܩܝ، ܐܦܠܚ [//translatewiki.net/ translatewiki.net]، ܬܪܡܝܬܐ ܕܬܘܪܓܡܐ ܕܡܝܕܝܐܘܝܩܝ.",
-'sqlhidden' => '(ܒܘܬܬܐ SQL ܛܫܝܐ)',
 'namespaceprotected' => "ܠܝܬ ܠܟ ܦܣܣܐ ܠܫܚܠܦܬܐ ܕܦܐܬܬ̈ܐ ܒܚܩܠܐ ܕ'''$1'''.",
 'exception-nologin' => 'ܠܝܬܝܟ ܥܠܝܠܐ',
 
@@ -434,9 +433,18 @@ $1',
 ܚܕ ܟܡܐ ܡܢ ܦܐܬܬ̈ܐ ܡܬܚܙܝܢ ܐܝܟ ܕܗܘ ܐܢܬ ܥܠܝܠܐ ܐܝܬܝܟ ܥܕܡܐ ܕܐܣܦܩܬ ܠܦܐܬܬ̈ܐ ܠܒܝܟܬ̈ܐ ܕܡܦܐܬܢܐ ܕܝܠܟ.",
 'welcomeuser' => 'ܒܫܝܢܐ $1!',
 'yourname' => 'ܫܡܐ ܕܡܦܠܚܢܐ:',
+'userlogin-yourname' => 'ܫܡܐ ܕܡܦܠܚܢܐ',
+'userlogin-yourname-ph' => 'ܐܥܠ ܫܡܐ ܕܡܦܠܚܢܐ ܕܝܠܟ',
 'yourpassword' => 'ܡܠܬܐ ܕܥܠܠܐ:',
+'userlogin-yourpassword' => 'ܡܠܬܐ ܕܥܠܠܐ',
+'userlogin-yourpassword-ph' => 'ܐܥܠ ܡܠܬܐ ܕܥܠܠܐ ܕܝܠܟ',
+'createacct-yourpassword-ph' => 'ܐܥܠ ܡܠܬܐ ܕܥܠܠܐ',
 'yourpasswordagain' => 'ܟܬܘܒ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܬܐ ܐܚܪܬܐ:',
+'createacct-yourpasswordagain' => 'ܫܪܪ ܡܠܬܐ ܕܥܠܠܐ',
+'createacct-yourpasswordagain-ph' => 'ܐܥܠ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢ ܐܚܪܝܢ',
 'remembermypassword' => 'ܕܟܘܪ ܥܠܠܬܝ ܥܠ ܡܦܐܬܢܐ ܗܢܐ (ܠܡܬܚܐ ܥܠܝܐ ܕ $1 {{PLURAL:$1|ܝܘܡܐ|ܝܘܡܬ̈ܐ}})',
+'userlogin-remembermypassword' => 'ܫܒܘܩ ܠܝ ܥܠܝܠܐ ܒܚܘܫܒܢܝ',
+'userlogin-signwithsecure' => 'ܐܚܫܚ ܕܒܝܩܘܬܐ ܡܫܝܢܢܬܐ',
 'login' => 'ܥܘܠ',
 'nav-login-createaccount' => 'ܥܘܠ / ܒܪܝ ܚܘܫܒܢܐ',
 'loginprompt' => 'ܐܠܨܐ ܠܡܦܐܬܢܐ ܕܝܠܟ ܕܣܡܟ ܠܩܘܩܝܙ (cookies) ܠܥܠܠܬܐ ܒ {{SITENAME}}.',
@@ -445,14 +453,25 @@ $1',
 'logout' => 'ܦܠܘܛ',
 'userlogout' => 'ܦܠܘܛ',
 'notloggedin' => 'ܠܝܬܝܟ ܥܠܝܠܐ',
+'userlogin-noaccount' => 'ܠܝܬ ܠܟ ܚܘܫܒܢܐ؟',
+'userlogin-joinproject' => 'ܢܩܦ ܥܡ {{SITENAME}}',
 'nologin' => "ܠܝܬ ܠܟ ܚܘܫܒܢܐ؟ '''$1'''.",
 'nologinlink' => 'ܒܪܝ ܚܘܫܒܢܐ',
 'createaccount' => 'ܒܪܝ ܚܘܫܒܢܐ',
 'gotaccount' => "ܐܝܬ ܠܟ ܚܘܫܒܢܐ؟ '''$1'''.",
 'gotaccountlink' => 'ܥܘܠ',
 'userlogin-resetlink' => 'ܐܬܢܫܝܬ ܝܕ̈ܥܬܐ ܕܥܠܠܐ؟',
+'userlogin-resetpassword-link' => 'ܫܚܠܦ ܡܠܬܐ ܕܥܠܠܐ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ܥܘܕܪܢܐ ܒܥܠܠܐ ܠܚܘܫܒܢܐ]]',
+'createacct-join' => 'ܐܥܠ ܝܕ̈ܥܬܐ ܕܝܠܟ ܠܬܚܬ',
+'createacct-emailrequired' => 'ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
 'createaccountmail' => 'ܐܦܠܚ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܢܝܬܐ ܘܫܕܪ ܠܗ ܥܠ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܬܘܚܡܐ ܠܬܚܬ',
 'createaccountreason' => 'ܥܠܬܐ',
+'createacct-submit' => 'ܒܪܝ ܚܘܫܒܢܐ ܕܝܠܟ',
+'createacct-benefit-heading' => 'ܝܬܒܐ ܕ{{SITENAME}} ܐܣܬܝܡ ܒܝܕ ܐܢܫ̈ܐ ܐܟܘܬܟ.',
+'createacct-benefit-body1' => '{{PLURAL:$1|ܫܘܚܠܦܐ|ܫܘܚܠܦ̈ܐ}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ܦܐܬܐ|ܦܐܬܬ̈ܐ}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|ܫܘܬܦܢܐ ܚܕܬܐ|ܫܘܬܦܢ̈ܐ ܚܕ̈ܬܐ}}',
 'badretype' => 'ܡܠܬܐ ܕܥܠܠܐ ܟܬܒܬ ܐܢܬ ܠܐ ܐܘܝܢܬܐ.',
 'userexists' => 'ܫܡܐ ܕܡܦܠܚܢܐ ܕܐܥܠܬ ܫܩܝܠܐ ܐܝܬܘܗܝ.
 ܫܦܝܪܐܝܬ ܓܒܝ ܫܡܐ ܐܚܪܢܐ.',
@@ -491,7 +510,6 @@ $1',
 # Special:PasswordReset
 'passwordreset' => 'ܣܘܡ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢ ܐܚܪܝܢ',
 'passwordreset-legend' => 'ܣܘܡ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢ ܐܚܪܝܢ',
-'passwordreset-pretext' => '{{PLURAL:$1||ܐܥܠ ܚܕ ܡܢ ܡܢܘܬ̈ܐ ܕܝܕ̈ܥܬܐ ܠܬܬܚܬ}}',
 'passwordreset-username' => 'ܫܡܐ ܕܡܦܠܚܢܐ:',
 'passwordreset-domain' => 'ܪܘܚܬܐ:',
 'passwordreset-email' => 'ܡܘܢܥܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:',
@@ -558,8 +576,11 @@ $1',
 'permissionserrors' => 'ܦܘܕܐ ܕܦܣܣܐ',
 'permissionserrorstext-withaction' => 'ܠܝܬ ܠܟ ܦܣܣܐ ܠ$2, ܒ{{PLURAL:$1|ܥܠܬܐ|ܥܠܬ̈ܐ}} ܕ:',
 'log-fulllog' => 'ܚܙܝ ܣܓܠܐ ܓܡܝܪܐ',
+'postedit-confirmation' => 'ܫܘܚܠܦܟ ܐܬܠܒܟ.',
 'edit-already-exists' => 'ܒܪܝܐ ܕܦܐܬܐ ܚܕܬܐ ܠܐ ܡܬܡܨܝܢܐ.
 ܗܕܐ ܦܐܬܐ ܐܝܬ ܡܢ ܟܕܘ.',
+'editwarning-warning' => 'ܐܢ ܫܒܩܬ ܦܐܬܐ ܗܕܐ ܡܬܡܨܝܢܬܐ ܐܝܬܝܗ ܕܚܣܪܬ ܟܠ ܫܘܚܠܦ̈ܐ ܕܥܒܝܕܬ ܗܪܟܐ.
+ܡܨܬ ܕܬܒܛܠ ܙܘܗܪܐ ܗܢܐ ܐܢ ܥܠܝܠܐ ܐܝܬܝܟ ܒܡܢܬܐ ܕ"ܫܚܠܦܬܐ" ܒܨܒܝܢܝܘܬ̈ܐ.',
 
 # "Undo" feature
 'undo-summary' => 'ܠܐ ܬܥܒܕ $1 ܒܝܕ [[Special:Contributions/$2|$2]] ([[User talk:$2|ܡܡܠܠܐ]])',
@@ -668,7 +689,6 @@ $1',
 'searchmenu-legend' => 'ܓܒܝܬ̈ܐ ܕܒܨܝܐ',
 'searchmenu-exists' => "'''ܐܝܬ ܦܐܬܐ ܒܫܡ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ'''",
 'searchmenu-new' => "'''ܒܪܝ ܦܐܬܐ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ!'''",
-'searchhelp-url' => 'Help:ܚܒܝܫܬ̈ܐ',
 'searchprofile-articles' => 'ܦܐܬܬ̈ܐ ܕܚܒܝܫܬ̈ܐ',
 'searchprofile-project' => 'ܦܐܬܬ̈ܐ ܕܬܪ̈ܡܝܬܐ ܘܕܥܘܕܪܢܐ',
 'searchprofile-images' => 'ܡܝܕ̈ܝܐ ܣܓܝܐ̈ܐ (Multimedia)',
@@ -703,9 +723,6 @@ $1',
 'powersearch-togglenone' => 'ܠܐ ܡܕܡ',
 'search-external' => 'ܒܨܝܐ ܒܪܝܐ',
 
-# Quickbar
-'qbsettings-none' => 'ܠܐ ܡܕܡ',
-
 # Preferences page
 'preferences' => 'ܨܒܝܢܝܘܬ̈ܐ',
 'mypreferences' => 'ܨܒܝܢܝܘܬ̈ܐ',
@@ -1043,9 +1060,6 @@ $1',
 'statistics-users-active' => 'ܡܦܠܚܢ̈ܐ ܙܪ̄ܝܙܐ',
 'statistics-mostpopular' => 'ܦܐܬܬ̈ܐ ܚܙܝ̈ܐ ܝܬܝܪ ܡܢ ܟܠ',
 
-'disambiguations' => 'ܦܐܬܬ̈ܐ ܐܣܝܪ̈ܬܐ ܒܦܐܬܬ̈ܐ ܕܬܘܚܡܐ ܐܚܪܢܐ',
-'disambiguationspage' => 'Template:ܬܘܚܡܐ ܐܚܪܢܐ',
-
 'pageswithprop' => 'ܦܐܬܬ̈ܐ ܥܡ ܕܝܠܝܬܐ ܕܦܐܬܐ',
 'pageswithprop-legend' => 'ܦܐܬܬ̈ܐ ܥܡ ܕܝܠܝܬܐ ܕܦܐܬܐ',
 'pageswithprop-prop' => 'ܫܡܐ ܕܕܝܠܝܬܐ',
@@ -1240,9 +1254,8 @@ $1',
 'watchthispage' => 'ܪܗܝ ܗܕܐ ܦܐܬܐ',
 'unwatch' => 'ܠܐ ܪܗܝ',
 'unwatchthispage' => 'ܟܠܝ ܪܗܝܐ',
-'watchnochange' => 'ܐܦܠܐ ܚܕ ܡܢ ܦܐܬܬ̈ܐ ܒܪ̈ܗܝܬܟ ܐܫܬܚܠܦܬ ܒܡܬܚܐ ܕܙܒܢܐ ܓܠܝܚܐ.',
 'watchlist-details' => '{{PLURAL:$1|$1 ܦܐܬܐ|$1 ܦܐܬܬ̈ܐ}} ܒܪ̈ܗܝܬܟ, ܫܒܘܩ ܡܢ ܦܐܬܬ̈ܐ ܕܡܡܠܠܐ.',
-'wlheader-showupdated' => "* ܦܐܬܬ̈ܐ ܕܐܫܬܚܠܦܢ ܡܢ ܒܬܪ ܣܘܥܪܢܟ ܐܚܪܝܐ ܡܬܓܠܚܢ ܒܣܪܛܐ '''ܚܠܝܡܐ'''",
+'wlheader-showupdated' => "ܦܐܬܬ̈ܐ ܕܐܫܬܚܠܦܢ ܡܢ ܒܬܪ ܣܘܥܪܢܐ ܐܚܪܝܐ ܠܗܝܢ ܡܬܓܠܚܢ ܒܣܪܛܐ '''ܚܠܝܡܐ'''",
 'wlnote' => "ܠܬܚܬ {{PLURAL:$1|ܫܘܚܠܦܐ ܐܚܪܝܐ| '''$1''' ܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ}} {{PLURAL:$2|ܒܫܥܬܐ ܐܚܪܝܬܐ|'''$2''' ܒܫܥܬ̈ܐ ܐܚܪ̈ܝܬܐ}}, ܠܦܘܬ $3, $4.",
 'wlshowlast' => 'ܚܘܝ $1 ܫܥܬ̈ܐ $2 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ $3',
 'watchlist-options' => 'ܨܒܝܢܝܘܬ̈ܐ ܕܪ̈ܗܝܬܐ',
@@ -1448,8 +1461,6 @@ $1',
 'ipb_already_blocked' => '"$1" ܡܚܪܡܐ ܗܘ ܡܢ ܟܕܘ',
 'ipb-needreblock' => '"$1" ܡܚܪܡܐ ܗܘ ܡܢ ܟܕܘ
 Do you want to change the settings?',
-'blockme' => 'ܚܪܘܡ ܠܝ',
-'proxyblocksuccess' => 'ܒܪܐ',
 
 # Move page
 'move-page' => 'ܫܢܝ $1',
@@ -1644,7 +1655,7 @@ $1',
 'metadata-expand' => 'ܚܘܝ ܐܪ̈ܝܟܬܐ ܪ̈ܘܝܚܬܐ',
 'metadata-collapse' => 'ܛܫܝ ܐܪ̈ܝܟܬܐ ܪ̈ܘܝܚܬܐ',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ܦܬܘܐ',
 'exif-imagelength' => 'ܐܘܪܟܐ',
 'exif-xresolution' => 'ܢܩܕܘܬܐ ܐܘܦܩܝܬܐ',
@@ -1774,11 +1785,6 @@ $1',
 'version-poweredby-others' => 'ܐܚܪ̈ܢܐ',
 'version-software-version' => 'ܨܚܚܐ',
 
-# Special:FilePath
-'filepath' => 'ܫܒܝܠܐ ܕܠܦܦܐ',
-'filepath-page' => 'ܠܦܦܐ',
-'filepath-submit' => 'ܙܠ',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ܒܨܝ ܥܠ ܠܦܦ̈ܐ ܥܦܝܦ̈ܐ',
 'fileduplicatesearch-legend' => 'ܒܨܝܐ ܥܠ ܥܘܦܦܐ',
diff --git a/languages/messages/MessagesArn.php b/languages/messages/MessagesArn.php
index 25fa236b..fe0312a6 100644
--- a/languages/messages/MessagesArn.php
+++ b/languages/messages/MessagesArn.php
@@ -183,7 +183,7 @@ $messages = array(
 'jumptosearch' => 'kintun',
 'pool-errorunknown' => 'Kimnoelchi welulkan',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} ñi dungu',
 'aboutpage' => 'Project:Dungu',
 'copyrightpage' => '{{ns:project}}:Norkülelu ñi ngenngelu ñi deumakelu',
@@ -192,7 +192,6 @@ $messages = array(
 'disclaimers' => 'Tukuldungun ñi pin ley',
 'disclaimerpage' => 'Project:Katrütuwün ñi llowdüngun',
 'edithelp' => 'Kellü wirin',
-'edithelppage' => 'Help:Chum wiringekey pakina',
 'helppage' => 'Help:Trokiñdungu',
 'mainpage' => 'Ñidol Wülngiñ',
 'mainpage-description' => 'Ñidol Wülngiñ',
@@ -407,7 +406,6 @@ Rulpakünuy feychi kangelkülelu dungu.",
 'viewprevnext' => 'Pen ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Müley kiñe wülngiñ «[[:$1]]» pingelu feychi wiki mew'''",
 'searchmenu-new' => "'''¡Llitun pakina «[[:$1]]» tüfachi wiki mew!'''",
-'searchhelp-url' => 'Help:Trokiñdungu',
 'searchprofile-articles' => 'Trokiñdungu wülngiñ',
 'searchprofile-project' => 'Kellu wülngiñ ka Deumandungu wülngiñ',
 'searchprofile-images' => 'Fill dungu (adentun, dungun, fidew)',
@@ -522,7 +520,6 @@ Rulpakünuy feychi kangelkülelu dungu.",
 'recentchangeslinked' => 'Koneltuyelelu kalekünulu wirin',
 'recentchangeslinked-toolbox' => 'Koneltuyelelu kalekünulu wirin',
 'recentchangeslinked-title' => 'Koneltuyelelu kalekünun tuwküleyelu "$1"',
-'recentchangeslinked-noresult' => 'Nülkükawlelu wülngiñ kalekünulay.',
 'recentchangeslinked-summary' => "Tüfachi wif niey pu wülngiñ kalekünulu ka nülkükawlelu kiñe feypingechi wülngiñ (kam nülkükawlelu feypingechi trokiñ).
 [[Special:Watchlist|Tami llaytun wif]] ñi pu wülngiñ '''kurükünuley'''.",
 'recentchangeslinked-page' => 'Wülngiñ ñi üy:',
@@ -585,8 +582,6 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
 'statistics' => 'Chuntelen',
 'statistics-pages' => 'Pakina',
 
-'disambiguationspage' => 'Template:Kiñeduamngelu dungu',
-
 'brokenredirects-edit' => 'pepikan',
 'brokenredirects-delete' => 'ñamümün',
 
@@ -757,7 +752,6 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
 'blocklogentry' => 'Katrüntukufi [[$1]] $2 antü/ora mew, $3',
 'block-log-flags-nocreate' => 'Pepi dewmangelay konün',
 'block-log-flags-hiddenname' => 'Üy kellufe ellkan',
-'proxyblocksuccess' => 'Dewmangey.',
 
 # Move page
 'move-page' => 'Nengümün $1',
@@ -888,7 +882,7 @@ Ka dungu ellkangeay wünedullin reke.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-artist' => 'Che llitun mew',
 'exif-exposuretime-format' => '$1 sek ($2)',
 
diff --git a/languages/messages/MessagesAry.php b/languages/messages/MessagesAry.php
index 4bf86e03..ceadcf3f 100644
--- a/languages/messages/MessagesAry.php
+++ b/languages/messages/MessagesAry.php
@@ -46,9 +46,6 @@ $messages = array(
 'tog-shownumberswatching' => 'biyn aadad lmostakhdimin lmoraqibin',
 'tog-oldsig' => 'moaayana litawqia lmawjod',
 'tog-fancysig' => 'aaml nass bhal nass wiki (bla wsla otomatikia)',
-'tog-externaleditor' => 'stakhdm moharrir khariji iftiradiyan(faqat lilkhobaraa, kaybghi iaadadat khassa f lordinator dyalk)',
-'tog-externaldiff' => 'stakhdm farq khariji iftiradiyan(faqat lilkhobaraa, kaybghi iaadadat khassa f lordinator dyalk)',
-'tog-showjumplinks' => 'mkkn wassalat "sir l" lmossaaida',
 'tog-uselivepreview' => 'staml listiarad saria (khasso javascipt) (tjribi)',
 'tog-forceeditsummary' => 'nbhni ila kandkhl molkhass taadil khawi',
 'tog-watchlisthideown' => 'khbi tadilat dyali mn qaaimat lmoraqaba',
@@ -145,7 +142,7 @@ $messages = array(
 'noindex-category' => 'shat mamfhtsach',
 'broken-file-category' => 'ṣfaḫi fiha wṣlat milffaṫ mhrrsa',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'ala',
 'article' => 'sfht mohtawa',
@@ -249,7 +246,7 @@ $1',
 'pool-queuefull' => 'Ṣeff l-ĥedma ĝamṛa',
 'pool-errorunknown' => 'khata mjhol',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Kolċi ĝla {{SITENAME}}',
 'aboutpage' => 'Project:Meĝlomaṫ',
 'copyright' => 'L-moḫṫawa mojod fe $1',
@@ -259,7 +256,6 @@ $1',
 'disclaimers' => 'Inḍaraṫ',
 'disclaimerpage' => 'Project:Inḍaraṫ ĝammin',
 'edithelp' => 'Mosaĝada',
-'edithelppage' => 'Help:Kifaċ tṣayeb ċi ṣ-ṣefḫa',
 'helppage' => 'Help:Meḍmon',
 'mainpage' => 'Ṣ-Ṣefḫa l-owla',
 'mainpage-description' => 'Ṣ-Ṣefḫa l-owla',
@@ -286,7 +282,6 @@ chof [[Special:Version|sfht lversion]]',
 'newmessagesdifflink' => 'ṫ-ṫeġyir l-leĥĥer',
 'youhavenewmessagesmulti' => 'Jawek méṣajaṫ jdad fe $1',
 'editsection' => 'Ṣayeb',
-'editsection-brackets' => '[$1]',
 'editold' => 'ṣayeb',
 'viewsourceold' => 'Ċof l-masdar',
 'editlink' => 'ṣayeb',
@@ -337,21 +332,6 @@ lista dyal safahat lkhassa ghatlgaha f [[Special:SpecialPages|{{int:specialpages
 # General errors
 'error' => "ĥata'",
 'databaseerror' => 'khataaa f qaaaidat lbayanat',
-'dberrortext' => 'khata fsight amr qaaaidat lbayanat
-hadchi iqdr ikon raja lchi khataa f lbrnamaj
-akhir amr dyal qaaidat lbayanat kan
-<blockquote><tt>$1</tt></blockquote>
-dakhl had dalla "<tt>$2</tt>".
-qaaidat lbayant rddat bhad lkhataa "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'wqĝ waḫd lmoċkil f siġt istiĝlam qaĝidat lbayanat
-
-aĥir talab istiĝlam qaĝidat lbayanat kan
-
-"$1"
-
-li hwa mn daĥl ddala "$2".
-
-qaĝidat lbayanat rjĝat lĥata\' "$3: $4"',
 'laggedslavemode' => "'''attansyo''' sfḫa iqdr mafihach aĥir tḫditaṫ",
 'readonly' => 'qaĝidat lbayanat msdoda',
 'enterlockreason' => 'dĥl sabab lli ĥllak tsdha, okadalik lwaqt li momkin thll bqdha',
@@ -399,7 +379,6 @@ Query: $2',
 'viewsourcetext' => 'imkn lik  tchof otcopie lmasdar dyak had sfha',
 'protectedinterface' => 'had ṣfḫa ka-ṫĝti n-naṣṣ dl-interface dial l-logiciel, o-raḫa mḫmiyya baċ maymknċ ṫṫĥrab.',
 'editinginterface' => "'''ṫḫdir:''' rak ka-ĝddal waḫd ṣ-ṣfḫa lli msṫĝmla baċ ṫĝti n-naṣṣ dl-interface dial l-logiciel. ṫĥyiraṫ fiha ġadi ṫ'aṫṫar ĝla l-mḍhr dial l-interface dl-mosṫaĥdim ĝnd l-mosṫaĥdimin l-aĥrin. l-ttarjamaṫ, ċoflik mĝa [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden' => '(talab SQL mĥfi)',
 'cascadeprotected' => 'had ṣfḫa mḫmiyya mn ṫĝdil, ḫqaċ fiha {{PLURAL:$1|ṣfḫa|ṣfaḫi}} mḫmiyya mĝa l-option "cascading" ĥḍḍama:
 $2',
 'namespaceprotected' => "ma msmoh-likċ baċ ṫĝddl ṣfahi mn n-nitaq '''$1'''.",
@@ -424,7 +403,6 @@ tqdr tchof baad sfahi bhal ila msjl hta tfrgh lcache dyalk",
 'yourpassword' => 'Saroṫ:',
 'yourpasswordagain' => 'aaawd ktb lmot de passe dyalk',
 'remembermypassword' => 'Ĝqel ĝla smiyṫ l-ḫsab dyali fe had l-ordinaṫør (ġir limoddaṫ {{PLURAL:$1|yom waḫed|$1 iyyam}})',
-'securelogin-stick-https' => 'bqa mṫṫasl bl-HTTPS moṛa d-doĥol',
 'yourdomainname' => 'domain dyalk',
 'externaldberror' => "kayn imma ċi ĥata' f-doĥol qaĝidaṫ l-bayanaṫ wlla rah ma msmoḫ-likċ baċ ṫḫddṫ l-ḫisab l-ĥariji taĝk.",
 'login' => 'Dĥel',
@@ -531,7 +509,7 @@ baċ ṫsali d-doĥol, ĥask ddir ċi klmṫ s-srr jdida hna:",
 'newpassword' => 'lmot de passe jdida :',
 'retypenew' => 'aaawd ktb lmot de passe jdida :',
 'resetpass_submit' => 'rigler lmot de pass odkhl',
-'resetpass_success' => 'klmṫ s-srr taĝk rah ṫbddlaṫ!
+'changepassword-success' => 'klmṫ s-srr taĝk rah ṫbddlaṫ!
 daba hanta ka-tdĥol...',
 'resetpass_forbidden' => 'ma ymkn-ċ ṫbddal klmaṫ s-srr',
 'resetpass-no-info' => 'ĥaṣṣ tkon daĥol baĥ tqdr twṣl l-had ṣfḫa niċan.',
@@ -543,10 +521,8 @@ ymkn ṫkon bddalṫiha bĝda wlla ṫlbti klmṫ srr mo'qaṫa jdida.",
 
 # Special:PasswordReset
 'passwordreset' => 'ĝawd klmṫ s-srr',
-'passwordreset-text' => 'ĝmmer had l-istimara baċ iwṣlek email ṫaĝ ṫdkir b-ṫṫafaṣil dl-ḫisab ṫaĝk.',
 'passwordreset-legend' => 'ĝawd klmṫ s-srr',
 'passwordreset-disabled' => 'maymkn-ċ ṫĝawd klmṫ s-srr f-had l-wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||kṫb wḫda mn l-bayanaṫ l-ṫḫṫ}}',
 'passwordreset-username' => 'smiṫ l-mosṫĥdim:',
 'passwordreset-email' => 'ĝonwan l-email:',
 'passwordreset-emailtitle' => 'ṫafaṣil l-ḫisab f-{{SITENAME}}',
@@ -931,7 +907,6 @@ $1",
 'searchmenu-legend' => 'khiyarat lbaht',
 'searchmenu-exists' => "'''ḫṫṫa ṣfḫa f-had l-wiki ma smiṫha \"[[:\$1]]\".'''",
 'searchmenu-new' => "'''ṣayb f-had l-wiki ṣfḫṫ \"[[:\$1]]\"!'''",
-'searchhelp-url' => 'Help:Meḍmon',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ṫṣffeh ṣfaḫi b-had ṣ-ṣabiqa]]',
 'searchprofile-articles' => 'sfht mohtawa',
 'searchprofile-project' => 'sfhai dyal lmossada ol mchroa',
@@ -976,15 +951,6 @@ Jerreb be l-préfiks \"all:\" baċ ṫqelleb ĝla l-meḍmon kollo (o ḫṫa 
 Imken lik ṫqeleb fe google.
 Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫin.',
 
-# Quickbar
-'qbsettings' => "L-lawḫa 's-sariĝa",
-'qbsettings-none' => 'Ma kaynċ',
-'qbsettings-fixedleft' => "Meḫbos fe 'ċ-ċmal",
-'qbsettings-fixedright' => "Meḫbos fe 'l-limin",
-'qbsettings-floatingleft' => "Ḫor fe 'ċ-ċmal",
-'qbsettings-floatingright' => "Ḫor fe 'l-limen",
-'qbsettings-directionality' => 'ṫabṫ, ĝla ḫasab ṫṫijah l-kṫaba b-loġṫk',
-
 # Preferences page
 'preferences' => 'ṫfḍilaṫ',
 'mypreferences' => 'Ḫajaṫ li kanfeḍḍel',
@@ -1014,7 +980,6 @@ Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫi
 'resetprefs' => 'hiyd tgyirat li mamsjlach',
 'restoreprefs' => 'rjaa kaml liadadat liftiradiya',
 'prefs-editing' => 'thrir',
-'prefs-edit-boxsize' => 'hajm nafidat thrir',
 'rows' => 'sofof:',
 'columns' => 'aaamida:',
 'searchresultshead' => 'Qelleb',
@@ -1053,7 +1018,6 @@ Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫi
 'prefs-custom-js' => 'personalisé JavaScript',
 'prefs-common-css-js' => 'CSS/JavaScript l-moċṫarak bin jmiĝ s-skinaṫ:',
 'prefs-emailconfirm-label' => "konfirmi l'email:",
-'prefs-textboxsize' => 'hajm nafidat tahrir',
 'youremail' => 'I-Méyl',
 'username' => 'smiṫ l-mosṫĥdim:',
 'uid' => 'raqm lmostakhdim :',
@@ -1269,7 +1233,6 @@ Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫi
 'recentchangeslinked-feed' => 'L-mṫidad dyal ṣ-ṣefḫaṫ l-li mlaqyin',
 'recentchangeslinked-toolbox' => 'L-mṫidad dyal ṣ-ṣefḫaṫ l-li mlaqyin',
 'recentchangeslinked-title' => 'Ṫ-Ṫeġyiraṫ li mlaqyin mĝa "$1"',
-'recentchangeslinked-noresult' => 'ta tghyir f sfahi mrtabta f lmodda li drtiha',
 'recentchangeslinked-summary' => "Hadi lista dial 'ṫ-ṫeġyiraṫ li ṫdaro mo'aĥarane le 'ṣ-ṣefḫaṫ li mlaqyin mĝa 'ṣ-ṣefḫa l-meĝniya (ola le 'aĝda' dial ċi ṣefa mĝayana). 'Ṣ-Ṣefḫaṫ li [[Special:Watchlist|mṫebeĝ]] mekṫobine be ḫrof ġlaḍ.",
 'recentchangeslinked-page' => 'Smiyṫ ṣ-ṣefḫa',
 'recentchangeslinked-to' => 'Ċof ṫ-ṫeġyiraṫ dyal ṣ-ṣefḫaṫ li fihom ċi lyan kayddik le ṣ-ṣefḫa li bġiṫi fe blaṣt ma ṫdir l-ĝeks',
@@ -1374,7 +1337,6 @@ $1',
 'http-read-error' => "khata' qira'at HTTP.",
 'http-timed-out' => 'salat moddat mohlat talab dyal HTTp.',
 'http-curl-error' => "khata' f jalb lmassar: $1",
-'http-host-unreachable' => 'manqdroch nwslo l had lmassar.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'manqdroch nwslo l had lmassar.',
@@ -1480,9 +1442,6 @@ $1',
 'statistics-users-active' => 'mostakhdimon nachtin',
 'statistics-mostpopular' => 'aktar sfahi mochahada',
 
-'disambiguations' => 'sfahi dyal tawdih',
-'disambiguationspage' => 'Template:tawdih',
-
 'doubleredirects' => 'ṫḫwila mḍoḅla',
 'double-redirect-fixed-move' => '[[$1]] ṫnqlaṫ.
 daba ka ṫḫwwal l-[[$2]].',
@@ -1676,8 +1635,8 @@ L-Kṫaba dyal had ṣ-ṣefḫa ġaṫban '''ġliḍa''' fe [[Special:RecentCha
 'unwatchthispage' => 'hiyd mn list dyal s-suivi dyali',
 'notanarticle' => 'Hadi maċi ṣefḫaṫ meḍmon',
 'watchlist-details' => '{{PLURAL:$1|ṣefḫa weḫda|$1 de ṣ-ṣefḫaṫ}} kaynin fe l-lista dyal s-suivi dyalṫek, bla ma nḫesbo ṣ-ṣefḫaṫ dyal n-niqaċ.',
-'wlheader-enotif' => '* l-iĝlam bl-email mtloq.',
-'wlheader-showupdated' => "* ṣ-ṣfaḫi lli ṫġyyeraṫ mn aĥir ẓiyaṛa ṫaĝk mkṫoba b-ĥatt '''ġliḍ'''",
+'wlheader-enotif' => 'l-iĝlam bl-email mtloq.',
+'wlheader-showupdated' => "ṣ-ṣfaḫi lli ṫġyyeraṫ mn aĥir ẓiyaṛa ṫaĝk mkṫoba b-ĥatt '''ġliḍ'''",
 'iteminvalidname' => "moċkil mĝa l-madda '$1', smia ma ṣḫiḫa-ċ...",
 'wlshowlast' => 'Werri  l-$1 de s-swayeĝ o l-$2 iyam l-leĥĥrin, ola werri $3',
 'watchlist-options' => 'Lé-Opsyon de l-lista dyal s-suivi',
@@ -1914,10 +1873,7 @@ Imken lek ṫbeddel l-mosṫawa de l-ḫimaya dyal had ṣ-ṣefḫa bla ma i\'e
 'ipb_expiry_temp' => 'L-Blokaj dyal s-smiyyaṫ dyal l-mosṫeĥdimin l-mĥebbyin ĥaṣṣo ybqa dima.',
 'ipb_already_blocked' => '"$1" rah fayeṫ mbloki',
 'ipb-otherblocks-header' => 'Blokaj {{PLURAL:$1|weḫdaĥor|weḫdaĥrin}}',
-'blockme' => 'blokini',
 'proxyblocker' => 'blokør dl-proksi',
-'proxyblocker-disabled' => 'had l-ĥaṣṣiyya ma mtloqa-ċ',
-'proxyblocksuccess' => 'ṣafi.',
 'sorbs' => 'DNSBL',
 
 # Developer tools
@@ -2220,7 +2176,7 @@ Ila ṫbeddel l-fiċyé men ḫalṫo l-'aṣliya, kaynin ċi ṫafaṣil ma mna
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'laard',
 'exif-imagelength' => 'lirtifaa',
 'exif-bitspersample' => 'bit lkol mokawwin',
@@ -2612,7 +2568,6 @@ jrreb l-ĝṛḍ l-ĝadi.',
 'version-other' => 'okhra',
 'version-mediahandlers' => 'motahakkimat lmedia',
 'version-hooks' => 'lkhtatif',
-'version-extension-functions' => 'wadaif lmohallil',
 'version-parser-extensiontags' => 'wossom imtidad lmohallil',
 'version-parser-function-hooks' => 'khtatif dyal dalat lmohllil',
 'version-hook-name' => 'smiyt lkhttaf',
@@ -2624,11 +2579,6 @@ jrreb l-ĝṛḍ l-ĝadi.',
 'version-software-product' => 'lmntoj',
 'version-software-version' => 'noskha',
 
-# Special:FilePath
-'filepath' => 'massar lfichier',
-'filepath-page' => 'mileff:',
-'filepath-submit' => 'Sir',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'qlleb ĝla milffaṫ mḍoḅla',
 'fileduplicatesearch-summary' => 'qlleb ĝla milffaṫ mḍoḅla ĝla asas l-qyam dl-haċ.',
diff --git a/languages/messages/MessagesArz.php b/languages/messages/MessagesArz.php
index 8352e270..13b3f373 100644
--- a/languages/messages/MessagesArz.php
+++ b/languages/messages/MessagesArz.php
@@ -334,9 +334,6 @@ $messages = array(
 'tog-shownumberswatching' => 'بين عدد اليوزرز المراقبين',
 'tog-oldsig' => 'الامضا دلوقتى:',
 'tog-fancysig' => 'امضا خام (من غير لينك أوتوماتيك)',
-'tog-externaleditor' => 'استخدم محرر خارجى بشكل افتراضى (للخبرا بس، يحتاج إعدادات خاصة على كومبيوترك) ([//www.mediawiki.org/wiki/Manual:External_editors لمزيد من المعلومات].)',
-'tog-externaldiff' => 'استخدم فرق خارجى بشكل افتراضى (للخبرا بس، يحتاج إعدادات خاصة على كومبيوترك) ([//www.mediawiki.org/wiki/Manual:External_editors لمعلومات اكتر].)',
-'tog-showjumplinks' => 'خلى وصلات "روح لـ" تكون شغالة.',
 'tog-uselivepreview' => 'استخدم البروفة السريعة (جافاسكريبت) (تجريبي)',
 'tog-forceeditsummary' => 'نبهنى عند تدخيل ملخص للتعديل  فاضي',
 'tog-watchlisthideown' => 'خبى التعديلات بتاعتى من لستة المراقبة',
@@ -350,6 +347,7 @@ $messages = array(
 'tog-showhiddencats' => 'بين التّصنيفات المستخبية',
 'tog-noconvertlink' => 'عطل تحويل عناوين الوصلات',
 'tog-norollbackdiff' => 'الغى الاختلافات بعد ما تعمل الرول باك',
+'tog-useeditwarning' => 'حذّرنى لما اسيب صفحة تعديل فيها تغييرات مش متسييڤه',
 
 'underline-always' => 'دايما',
 'underline-never' => 'ابدا',
@@ -531,7 +529,7 @@ $1',
 'pool-queuefull' => 'طابور الانتخاب مليان',
 'pool-errorunknown' => 'غلط مش معروف',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'عن {{SITENAME}}',
 'aboutpage' => 'Project:معلومات عن',
 'copyright' => 'المحتوى موجود تحت $1.',
@@ -541,7 +539,6 @@ $1',
 'disclaimers' => 'تنازل عن مسئوليه',
 'disclaimerpage' => 'Project:تنازل عن مسئوليه عمومى',
 'edithelp' => 'مساعده فى التعديل',
-'edithelppage' => 'Help:تعديل',
 'helppage' => 'Help:محتويات',
 'mainpage' => 'الصفحه الرئيسيه',
 'mainpage-description' => 'الصفحه الرئيسيه',
@@ -611,17 +608,6 @@ $1',
 # General errors
 'error' => 'غلطه',
 'databaseerror' => 'غلط فى قاعدة البيانات (database)',
-'dberrortext' => 'حصل غلط فى صيغة الاستعلام فى قاعدة البيانات (database).
-ممكن يكون بسبب عيب فى البرنامج.
-آخر محاوله استعلام اتطلبت من قاعدة البيانات كانت:
-<blockquote><tt>$1</tt></blockquote>
-من جوه الخاصيه "<tt>$2</tt>".
-قاعدة البيانات رجعت الغلط "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'حصل غلط فى صيغة الاستعلام فى قاعدة البيانات (database).
-آخر محاوله استعلام اتطلبت من قاعدة البيانات كانت:
-"$1"
-من جوه الخاصيه "$2".
-قاعدة البيانات رجعت الغلط "$3: $4"',
 'laggedslavemode' => "'''تحذير:''' الصفحه يمكن ما يكونش فيها تحديثات جديده.",
 'readonly' => 'قاعدة البيانات (الـ database) مقفوله',
 'enterlockreason' => 'اكتب سبب القفل, و قول امتى تقريبا ح يتلغى القفل',
@@ -669,7 +655,6 @@ $1',
 'viewsourcetext' => 'ممكن تشوف وتنسخ مصدر  الصفحه دى:',
 'protectedinterface' => 'الصفحة دى هى اللى بتوفر نص الواجهة بتاعة البرنامج،وهى مقفولة لمنع التخريب.',
 'editinginterface' => "'''تحذير''': أنت بتعدل صفحة بتستخدم فى الواجهة النصية  بتاعة البرنامج. التغييرات فى الصفحة دى ها تأثر على مظهر واجهة اليوزر لليوزرز التانيين. للترجمات، لو سمحت استخدم [//translatewiki.net/wiki/Main_Page?setlang=ar بيتاويكى]، مشروع ترجمة الميدياويكى.",
-'sqlhidden' => '(استعلام إس‌كيو‌إل متخبي)',
 'cascadeprotected' => 'الصفحة دى محمية من التعديل، بسبب انها مدمجة فى {{PLURAL:$1|الصفحة|الصفحات}} دي، اللى مستعمل فيها خاصية "حماية الصفحات المدمجة" :
 $2',
 'namespaceprotected' => "ما عندكش صلاحية تعديل الصفحات  اللى فى نطاق '''$1'''.",
@@ -783,7 +768,7 @@ $2',
 'newpassword' => 'الباسورد جديدة:',
 'retypenew' => 'اكتب الباسورد الجديده تانى:',
 'resetpass_submit' => 'اظبط الباسورد و ادخل',
-'resetpass_success' => 'الباسورد بتاعتك اتغيرت بنجاح! دلوقتى  بنسجل دخولك...',
+'changepassword-success' => 'الباسورد بتاعتك اتغيرت بنجاح! دلوقتى  بنسجل دخولك...',
 'resetpass_forbidden' => 'مش ممكن تغيير الباسورد',
 'resetpass-no-info' => 'لازم تسجل دخولك علشان تقدر توصل للصفحة دى على طول.',
 'resetpass-submit-loggedin' => 'غير الباسورد',
@@ -981,6 +966,8 @@ $2',
 'edit-no-change' => 'تعديلك تم تجاهله، لأن ما حصلش أى تعديل للنص.',
 'edit-already-exists' => 'لم يمكن إنشاء صفحة جديدة.
 هى موجودة بالفعل.',
+'editwarning-warning' => 'لو سيبت الصفحه دى ممكن يخلّيك تضيّع اى تغييرات عملتها.
+لو انت مسجّل دخولك, ممكن تعطّل التحذير ده من الجزء بتاع "تعديل" فى تفضيلاتك.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'تحذير: الصفحه دى فيهااستدعاءات دالة محلل كثيرة مكلفة.
@@ -1201,7 +1188,6 @@ $1",
 'searchmenu-legend' => 'اختيارات التدوير',
 'searchmenu-exists' => "*الصفحة '''[[$1]]'''",
 'searchmenu-new' => "'''ابتدى الصفحه \"[[:\$1]]\" ع الويكى دا!'''",
-'searchhelp-url' => 'Help:محتويات',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|استعرض الصفحات اللى بتبتدى بالبريفيكس دا]]',
 'searchprofile-articles' => 'صفحات محتوى',
 'searchprofile-project' => 'صفحات  المساعده و المشروع',
@@ -1246,14 +1232,6 @@ $1",
 ممكن تدور فى جوجل دلوقتي.
 لاحظ أن فهارسه لمحتوى {{SITENAME}} يمكن تكون مش متحدثة.',
 
-# Quickbar
-'qbsettings' => 'البار السريع',
-'qbsettings-none' => 'ما فى ش',
-'qbsettings-fixedleft' => 'متثبت فى الشمال',
-'qbsettings-fixedright' => 'متثبت فى اليمين',
-'qbsettings-floatingleft' => 'عايم على الشمال',
-'qbsettings-floatingright' => 'عايم على اليمين',
-
 # Preferences page
 'preferences' => 'تفضيلات',
 'mypreferences' => 'تفضيلاتى',
@@ -1283,7 +1261,6 @@ $1",
 'resetprefs' => 'امسح التغييرات اللى مش المحفوظة',
 'restoreprefs' => 'استرجع التظبيطات الاصليه',
 'prefs-editing' => 'تعديل',
-'prefs-edit-boxsize' => 'كُبر الويندو بتاعة التحرير',
 'rows' => 'صفوف:',
 'columns' => 'عمدان:',
 'searchresultshead' => 'تدوير',
@@ -1294,9 +1271,6 @@ $1",
 'recentchangesdays-max' => '(الحد الاقصى $1 {{PLURAL:$1|يوم|ايام}})',
 'recentchangescount' => 'عدد التعديلات اللى بتظهر اوتوماتيكى فى اخر التغييرات, تواريخ الصفحه, و فى السجلات, :',
 'prefs-help-recentchangescount' => 'بيحتوى على احدث التغييرات ، تواريخ الصفحات و السجلات.',
-'prefs-help-watchlist-token' => 'ملى الحقل ده بمفتاح سرى حيعمل تلقيم RSS لقايمه مراقبتك.
-اى واحد بعرف المفتاح فى الحقل ده ممكن يقرأ قايمه مراقبتك، علشان كده اختار قيمه متأمنه.
-دى قيمه متولده عشوائى وممكن تستخدمها: $1',
 'savedprefs' => 'التفضيلات بتاعتك اتحفظت.',
 'timezonelegend' => 'منطقة التوقيت',
 'localtime' => 'التوقيت المحلى',
@@ -1326,7 +1300,6 @@ $1",
 'prefs-reset-intro' => 'ممكن تستعمل الصفحه دى عشان تعيد ظبط التفضيلات بتاعتك و تخليها زى الحاله الافتراضيه للموقع.
 ماينفعش الرجوع فى التعديل دا.',
 'prefs-emailconfirm-label' => 'التأكد من الايميل:',
-'prefs-textboxsize' => 'حجم شباك التعديل',
 'youremail' => 'الايميل:',
 'username' => 'اسم اليوزر:',
 'uid' => 'رقم اليوزر:',
@@ -1560,7 +1533,6 @@ $1",
 'recentchangeslinked-feed' => 'تعديلات  ليها علاقه',
 'recentchangeslinked-toolbox' => 'تعديلات  ليها علاقه',
 'recentchangeslinked-title' => 'التعديلات المرتبطه  ب "$1"',
-'recentchangeslinked-noresult' => 'مافيش تعديلات حصلت فى الصفحات اللى ليها وصلات هنا خلال الفترة المحدده.',
 'recentchangeslinked-summary' => "دى ليستة تغييرات اتعملت قريب فى صفح معمول ليها لينك من صفح مخصوصه (او لاعضاء فى تصنيف معين).
 الصفح اللى فى [[Special:Watchlist|لستة الصفح اللى بتراقبها]] معروضه '''بالـbold'''",
 'recentchangeslinked-page' => 'اسم الصفحه :',
@@ -1572,7 +1544,7 @@ $1",
 'reuploaddesc' => 'إلغى التحميل وارجع لاستمارة التحميل',
 'upload-tryagain' => 'نفذ وصف الملف المتعدل',
 'uploadnologin' => 'ما سجلتش الدخول',
-'uploadnologintext' => 'لازم تكون [[Special:UserLogin|مسجل الدخول]] علشان تقدر تحمل الملفات.',
+'uploadnologintext' => 'لازم تكون  $1 علشان تقدر تحمل الملفات.',
 'upload_directory_missing' => 'مجلد التحميل($1) ضايع السيرفير وماقدرش يعمل واحد تاني.',
 'upload_directory_read_only' => 'مجلد التحميل ($1) مش ممكن الكتابة عليه بواسطة سيرڨر الويب.',
 'uploaderror' => 'غلطه فى التحميل',
@@ -1717,7 +1689,6 @@ PICT # misc.
 'http-read-error' => 'فى غلط فى قراية ال HTTP',
 'http-timed-out' => 'طلب ال HTTP خلص وقته',
 'http-curl-error' => 'حصل غلط و احنا بنجيب الURL : $1',
-'http-host-unreachable' => 'ما قدرناش نوصل لل URL.',
 'http-bad-status' => 'HTTP : حصلت مشكله وقت طلب ال $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1865,12 +1836,6 @@ PICT # misc.
 'statistics-users-active-desc' => 'اليوزرز اللى نفذو عمليه فى الـ {{PLURAL:$1|يوم|$1 ايام}} اللى فاتو',
 'statistics-mostpopular' => 'اكتر صفحات اتشافت',
 
-'disambiguations' => 'صفحات التوضيح',
-'disambiguationspage' => 'Template:توضيح',
-'disambiguations-text' => "الصفحات دى بتوصل لـ '''صفحة توضيح'''.
-المفروض على العكس انهم يوصلو ل للصفحات المناسبة. <br />
-أى صفحة بتتعامل على انها صفحة توضيح إذا كانت بتستعمل قالب موجود فى [[MediaWiki:Disambiguationspage]]",
-
 'doubleredirects' => 'تحويلات مزدوجه',
 'doubleredirectstext' => 'الصفحة دى فيها لستة الصفحات اللى فيها تحويلة لصفحة تانية فيها تحويلة.
 كل سطر فى اللستة دى  فيه لينك للتحويلة الأولانية والتانية و كمان للصفحة بتاعة التحويلة التانية و اللى غالبا هى الصفحة الاصلية اللى المفروض التحويلة الاولانية توصل ليها.
@@ -2087,10 +2052,9 @@ PICT # misc.
 'unwatchthispage' => 'اتوقف عن المراقبة',
 'notanarticle' => 'دى مش صفحة بتاعة محتوى',
 'notvisiblerev' => 'النسحة اتمسحت',
-'watchnochange' => 'مافيش ولا صفحة اتعدلت فى لستة مراقبتك فى الفترة الزمنية اللى حددتها.',
 'watchlist-details' => '{{PLURAL:$1|$1 صفحه|$1 صفحه}} فى قايمه مراقبتك، بدون عد صفحات المناقشه.',
 'wlheader-enotif' => '*خاصية الاعلام بالايميل متفعلة',
-'wlheader-showupdated' => "* الصفحات اللى اتغيرت  بعد زيارتك ليها اخر مرة معروضة بالخط '''العريض'''",
+'wlheader-showupdated' => "الصفحات اللى اتغيرت  بعد زيارتك ليها اخر مرة معروضة بالخط '''العريض'''",
 'watchmethod-recent' => 'التشييك على التعديلات الاخيرة للصفحات المتراقبة',
 'watchmethod-list' => 'التشييك فى الصفحات المتراقبة على التعديلات الاخيرة',
 'watchlistcontains' => 'لستة المراقبة بتاعتك فيها $1 {{PLURAL:$1|صفحة|صفحات}}.',
@@ -2459,12 +2423,9 @@ $1',
 بس هو، على الرغم من كدا،ممنوع لانه جزء من النطاق $2، و اللى ممكن رفع المنع عنه.',
 'ip_range_invalid' => 'نطاق عناوين الأيبى مش صحيح.',
 'ip_range_toolarge' => 'حدود المنع اللى اكبر من /$1 مش مسموح بيها.',
-'blockme' => 'امنعنى',
 'proxyblocker' => 'مانع البروكسي',
-'proxyblocker-disabled' => 'الخاصية دى متعطلة.',
 'proxyblockreason' => 'عنوان الأيبى بتاعك اتمنع لانه بروكسى مفتوح.
 لو سمحت تتصل بمزود خدمة الإنترنت بتاعك أو الدعم الفنى و قولهم على المشكلة الامنية الخطيرة دي.',
-'proxyblocksuccess' => 'خلاص.',
 'sorbs' => 'دى إن إس بى إل',
 'sorbsreason' => 'عنوان الأيبى بتاعك موجود كبروكسى مفتوح فى DNSBL اللى بيستعمله{{SITENAME}}.',
 'sorbs_create_account_reason' => 'عنوان الأيبى بتاعك موجود كبروكسى مفتوح فى ال DNSBL اللى بيستعمله {{SITENAME}}.
@@ -2739,27 +2700,16 @@ $1',
 
 # Stylesheets
 'common.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على كل الواجهات */',
-'standard.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة ستاندرد */',
-'nostalgia.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة نوستالشيا */',
 'cologneblue.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة كولون بلو */',
 'monobook.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة مونوبوك */',
-'myskin.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة ماى سكين */',
-'chick.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة تشيك */',
-'simple.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة سيمبل */',
 'modern.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة مودرن */',
 'vector.css' => '/* CSS اللى هنا حتأثر على اليوزرز اللى بيستخدموا واجهة فكتور */',
 'print.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */',
-'handheld.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على الأجهزة المحمولة بالاعتماد على الواجهة المضبوطة فى $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/*  أى جافاسكريبت  هناح يتحمل لكل اليوزرز مع كل تحميل للصفحة. */',
-'standard.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة ستاندرد */',
-'nostalgia.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة نوستالجيا */',
 'cologneblue.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة كولون بلو */',
 'monobook.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة مونوبوك */',
-'myskin.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة ماى سكين */',
-'chick.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة تشيك */',
-'simple.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة سيمبل */',
 'modern.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة مودرن */',
 'vector.js' => '/* اى جافاسكريبت هنا حتتحمل لكل يوزر بيستخدم واجهة فكتور */',
 
@@ -2788,13 +2738,8 @@ $1',
 'spam_blanking' => 'كل النسخ فيها لينكات ل $1، فضيها',
 
 # Skin names
-'skinname-standard' => 'كلاسيك',
-'skinname-nostalgia' => 'نوستالجيا',
 'skinname-cologneblue' => 'كولون بلو',
 'skinname-monobook' => 'مونوبوك',
-'skinname-myskin' => 'ماى سكين',
-'skinname-chick' => 'تشيك',
-'skinname-simple' => 'سيمبل',
 'skinname-modern' => 'مودرن',
 
 # Patrolling
@@ -2889,7 +2834,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'العرض',
 'exif-imagelength' => 'الطول',
 'exif-bitspersample' => 'بتس لكل مكون',
@@ -3005,7 +2950,7 @@ $1',
 'exif-gpsdatestamp' => 'تاريخ GPS',
 'exif-gpsdifferential' => 'تصحيح GPS التفاضلي',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'مش مضغوط',
 'exif-compression-6' => 'جيه بى إى جي',
 
@@ -3375,7 +3320,6 @@ $5
 'version-other' => 'تانية',
 'version-mediahandlers' => 'متحكمات الميديا',
 'version-hooks' => 'الخطاطيف',
-'version-extension-functions' => 'وظايف الامتداد',
 'version-parser-extensiontags' => 'التاجز بتوع امتداد البريزر',
 'version-parser-function-hooks' => 'خطاطيف دالة المحلل',
 'version-hook-name' => 'اسم الخطاف',
@@ -3386,13 +3330,6 @@ $5
 'version-software-product' => 'المنتج',
 'version-software-version' => 'النسخه',
 
-# Special:FilePath
-'filepath' => 'مسار ملف',
-'filepath-page' => 'الملف:',
-'filepath-submit' => 'المسار',
-'filepath-summary' => 'الصفحة المخصوصة دى بتعرض المسار الكامل  بتاع ملف.
-الصور بتتعرض  بدقة كاملة، أنواع الملفات التانية ح تشتغل فى البرنامج بتاعهم مباشرة.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'دور على الملفات المتكررة',
 'fileduplicatesearch-summary' => 'دور على الملفات المتكررة على اساس قيمة الهاش بتاعتها.',
diff --git a/languages/messages/MessagesAs.php b/languages/messages/MessagesAs.php
index cf7ab619..ada0998e 100644
--- a/languages/messages/MessagesAs.php
+++ b/languages/messages/MessagesAs.php
@@ -213,9 +213,6 @@ $messages = array(
 'tog-shownumberswatching' => 'লক্ষ্য কৰি থকা সদস্য সমূহৰ সংখ্যা দেখুৱাওক',
 'tog-oldsig' => 'বৰ্তমানৰ স্বাক্ষৰ:',
 'tog-fancysig' => 'স্বাক্ষৰ ৱিকিটেক্সট হিচাপে ব্যৱহাৰ কৰক (স্বয়ংক্ৰিয় সংযোগ অবিহনে)',
-'tog-externaleditor' => 'ডিফ’ল্ট ভাবে বাহ্যিক সম্পাদন-সঁজুলি ব্যৱহাৰ কৰক (দক্ষ জনৰ বাবেহে, আপোনাৰ কম্পিউটাৰত বিশেষ ব্যৱস্থা থাকিব লাগিব । [//www.mediawiki.org/wiki/Manual:External_editors সবিশেষ ।])',
-'tog-externaldiff' => 'ডিফ’ল্ট ভাবে বাহ্যিক তফাৎ (diff) ব্যৱহাৰ কৰক (দক্ষ জনৰ বাবেহে, আপোনাৰ কম্পিউটাৰত বিশেষ ব্যৱস্থা থাকিব লাগিব । [//www.mediawiki.org/wiki/Manual:External_editors সবিশেষ ।])',
-'tog-showjumplinks' => '"জঁপিয়াই যাওক" সংযোগ সক্ৰিয় কৰক',
 'tog-uselivepreview' => 'সম্পাদনাৰ লগে লগে খচৰা দেখুৱাওক (পৰীক্ষামূলক)',
 'tog-forceeditsummary' => 'সম্পাদনাৰ সাৰাংশ নিদিলে মোক জনাব',
 'tog-watchlisthideown' => 'মোৰ লক্ষ্য-তালিকাত মোৰ সম্পাদনা নেদেখুৱাব',
@@ -228,6 +225,8 @@ $messages = array(
 'tog-diffonly' => 'পার্থক্যৰ তলত পৃষ্ঠাৰ বিষয়বস্তু নেদেখুৱাব',
 'tog-showhiddencats' => 'নিহিত শ্ৰেণী সমূহ দেখুৱাওক',
 'tog-norollbackdiff' => 'পূৰ্বৱত কৰা পাছত পাৰ্থক্য নেদেখুৱাব',
+'tog-useeditwarning' => 'সালসলনি সংৰক্ষণ নকৰাকৈ সম্পাদনা পৃষ্ঠা ত্যাগৰ সময়ত মোক সাৱধান কৰক',
+'tog-prefershttps' => 'প্ৰৱেশ কৰোঁতে সদায় সুৰক্ষিত সংযোগ ব্যৱহাৰ কৰক',
 
 'underline-always' => 'সদায়',
 'underline-never' => 'কেতিয়াও নহয়',
@@ -291,6 +290,18 @@ $messages = array(
 'oct' => 'অক্টোবৰ:',
 'nov' => 'নৱেম্বৰ:',
 'dec' => 'ডিচেম্বৰ:',
+'january-date' => 'জানুৱাৰী $1',
+'february-date' => 'ফেব্ৰুৱাৰী $1',
+'march-date' => 'মাৰ্চ $1',
+'april-date' => 'এপ্ৰিল $1',
+'may-date' => "মে' $1",
+'june-date' => 'জুন $1',
+'july-date' => 'জুলাই $1',
+'august-date' => 'আগষ্ট $1',
+'september-date' => 'ছেপ্টেম্বৰ $1',
+'october-date' => 'অক্টোবৰ $1',
+'november-date' => 'নৱেম্বৰ $1',
+'december-date' => 'ডিচেম্বৰ $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|শ্ৰেণী|শ্ৰেণীসমূহ}}',
@@ -372,6 +383,7 @@ $messages = array(
 'create-this-page' => 'নতুন পৃষ্ঠা সৃষ্টি কৰক',
 'delete' => 'বিলোপ',
 'deletethispage' => 'এই পৃষ্ঠাখন বিলোপ কৰক',
+'undeletethispage' => 'এই পৃষ্ঠা পুনৰুদ্ধাৰ কৰক',
 'undelete_short' => '{{PLURAL:$1|বিলোপিত পৃষ্ঠাৰ|$1 সংখ্যক বিলোপিত পৃষ্ঠাৰ}} পূৰ্ববৎকৰণ',
 'viewdeleted_short' => '{{PLURAL:$1| এটা বিলুপ্ত সম্পাদনা|$1 টা বিলুপ্ত সম্পাদনা}} দেখুৱাওক',
 'protect' => 'সুৰক্ষিত কৰক',
@@ -415,7 +427,7 @@ $1',
 'pool-queuefull' => 'পোল কিউ (pool queue) সমূল',
 'pool-errorunknown' => 'অপৰিচিত ত্ৰুটি',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}ৰ বিষয়ে',
 'aboutpage' => 'Project:ইতিবৃত্ত',
 'copyright' => 'এই বিষয়বস্তু $1 ৰ আওতাত উপলব্ধ।',
@@ -425,7 +437,6 @@ $1',
 'disclaimers' => 'দায়লুপ্তি',
 'disclaimerpage' => 'Project:সাধাৰণ দায়লুপ্তি',
 'edithelp' => 'সম্পাদনাৰ বাবে সহায়',
-'edithelppage' => 'Help:সম্পাদনা',
 'helppage' => 'Help:সমল',
 'mainpage' => 'বেটুপাত',
 'mainpage-description' => 'বেটুপাত',
@@ -502,17 +513,11 @@ $1',
 # General errors
 'error' => 'ভুল',
 'databaseerror' => 'তথ্যকোষৰ ভুল',
-'dberrortext' => 'Database query syntaxত ত্ৰুটি হৈছে।
-ছফ্টৱেৰত থকা কোনো বাগৰ বাবে এনে হব পাৰে।
-অন্তিমবাৰ চেষ্টা কৰা ডাটাবেচ কুৱেৰীটো আছিল এনেধৰণৰ:
-<blockquote><code>$1</code></blockquote>
-"<code>$2</code>" ফাংচনৰ পৰা।
-ডাটাবেচে প্ৰেৰণ কৰা ত্ৰুটি: "<samp>$3: $4</samp>"।',
-'dberrortextcl' => 'এক ডাটাবেচ চিণ্টেক্স ত্ৰুটি ঘটিছে।
-অন্তিমবাৰ চেষ্টা কৰা ডাটাবেচ কুৱেৰীটো আছিল এনেধৰণৰ:
-"$1"
-"$2" ফাংচনৰ পৰা
-ডাটাবেচে প্ৰেৰণ কৰা ত্ৰুটি "$3: $4"',
+'databaseerror-text' => "এটা ডেটাবে'ছ কুৱেৰী ত্ৰুটি হৈছে।
+ইয়ে ছফ্টৱেৰটোত কিবা বাগ্‌ থকাটো সূচাব পাৰে।",
+'databaseerror-textcl' => "এটা ডেটাবে'ছ কুৱেৰী ত্ৰুটি হৈছে।",
+'databaseerror-function' => 'ফাংচন: $1',
+'databaseerror-error' => 'ত্ৰুটি: $1',
 'laggedslavemode' => 'সাৱধানবাণী: ইয়াত সাম্প্ৰতিক সাল-সলনি নাথাকিব পাৰে',
 'readonly' => 'তথ্যকোষ বন্ধ কৰা আছে',
 'enterlockreason' => 'বন্ধ কৰাৰ কাৰণ দিয়ক, লগতে কেতিয়ামানে খোলা হব তাকো জনাব।',
@@ -546,6 +551,7 @@ $1',
 'cannotdelete-title' => '"$1" পৃষ্ঠা বিলোপ কৰিব নোৱাৰি',
 'delete-hook-aborted' => 'হুকৰ দ্বাৰা সম্পাদনা প্ৰত্যাখ্যান কৰা হৈছে ।
 ইয়াৰ কোনো ব্যাখ্যা নাই ।',
+'no-null-revision' => '"$1" পৃষ্ঠাৰ বাবে নতুন শূন্য সংশোধন সৃষ্টি কৰিব পৰা নগ\'ল',
 'badtitle' => 'অগ্ৰহণীয় শিৰোনামা',
 'badtitletext' => 'আপুনি বিচৰা পৃষ্ঠাটোৰ শিৰোনামা অযোগ্য, খালী বা ভুলকৈ জড়িত আন্তৰ্ভাষিক বা আন্তৰ্ৱিকি শিৰোনামা। ইয়াত এক বা ততোধিক বৰ্ণ আছে যাক শিৰোনামাত ব্যৱহাৰ কৰিব নোৱাৰি।',
 'perfcached' => "তলত দিয়া তথ্যখিনি আগতে জমা কৰি থোৱা (cached) আৰু সাম্প্ৰতিক নহ'ব পাৰে। এই তথ্যখিনিত সৰ্বোচ্চ {{PLURAL:$1|এটা ফলাফল|$1টা ফলাফল}} উপলব্ধ।",
@@ -566,12 +572,15 @@ $1',
 'editinginterface' => "'''সাৱধানবাণী:''' আপুনি যিখন পৃষ্ঠা সম্পাদনা কৰিছে সেইখন এই ছফ্টৱেৰৰ ইণ্টাৰফে’চ বাৰ্তা দিবলৈ ব্যৱহাৰ হয়।
 এই পৃষ্ঠাৰ সাল-সলনিয়ে আন ব্যৱহাৰকাৰীৰ বাবে ইণ্টাৰফে’চত প্ৰভাৱ পেলাব।
 সকলো ৱিকিৰ বাবে অনুবাদৰ বাবে অনুগ্ৰহ কৰি মিডিয়াৱিকি স্থানীয়কৰণ প্ৰকল্প [//translatewiki.net/ translatewiki.net] ব্যৱহাৰ কৰক ।",
-'sqlhidden' => '(নিহিত SQL query)',
 'cascadeprotected' => 'এই পৃষ্ঠাখন সম্পাদনাৰ পৰা সুৰক্ষিত কাৰণ এই {{PLURAL:$1|পৃষ্ঠা, যিখন|পৃষ্ঠা, যিবোৰ}} "প্ৰপাতাকাৰ" (cascading) বিকল্পৰ সহযোগত সুৰক্ষিত কৰা হৈছে: 
 $2',
 'namespaceprotected' => "আপোনাৰ '''$1''' নামস্থানৰ পৃষ্ঠাসমূহ সম্পাদনা কৰাৰ অধিকাৰ নাই।",
 'customcssprotected' => 'এই CSS পৃষ্ঠা সম্পাদনা কৰাৰ অধিকাৰ আপোনাৰ নাই, কাৰণ ইয়াত আন সদস্যৰ ব্যক্তিগত পছন্দসমূহত আছে ।',
 'customjsprotected' => 'এই জাভালিপিৰ পৃষ্ঠা সম্পাদনা কৰাৰ অধিকাৰ আপোনাৰ নাই, কাৰণ ইয়াত আন সদস্যৰ ব্যক্তিগত পছন্দসমূহত আছে ।',
+'mycustomcssprotected' => 'এই CSS পৃষ্ঠা সম্পাদনা কৰিবলৈ আপোনাৰ অনুমতি নাই।',
+'mycustomjsprotected' => 'এই JavaScript পৃষ্ঠা সম্পাদনা কৰিবলৈ আপোনাৰ অনুমতি নাই।',
+'myprivateinfoprotected' => 'ব্যক্তিগত তথ্য সম্পাদনা কৰিবলৈ আপোনাৰ অনুমতি নাই।',
+'mypreferencesprotected' => 'পছন্দসমূহ সম্পাদনা কৰিবলৈ আপোনাৰ অনুমতি  নাই।',
 'ns-specialprotected' => 'বিশেষ পৃষ্ঠা সম্পাদিত কৰিব নোৱাৰি।',
 'titleprotected' => "[[User:$1|$1]] সদস্যজনে এই শিৰোনাণমাৰ লিখনী লিখা ৰোধ কৰিছে ।
 ইয়াৰ কাৰণ হৈছে ''$2'' ।",
@@ -596,10 +605,19 @@ $2',
 আপোনাৰ সদস্যভুক্তি হৈ গ’ল ।
 [[Special:Preferences|{{SITENAME}}ৰ পছন্দসমূহ]]ত আপোনাৰ পছন্দমতে ব্যক্তিগতকৰণ কৰি ল’বলৈ নাপাহৰে যেন ।',
 'yourname' => 'সদস্যনাম:',
+'userlogin-yourname' => 'সদস্যনাম',
+'userlogin-yourname-ph' => 'আপোনাৰ সদস্যনাম লিখক',
+'createacct-another-username-ph' => 'সদস্যনাম লিখক',
 'yourpassword' => 'আপোনাৰ গুপ্তশব্দ',
+'userlogin-yourpassword' => 'গুপ্তশব্দ',
+'userlogin-yourpassword-ph' => 'আপোনাৰ গুপ্তশব্দ লিখক',
+'createacct-yourpassword-ph' => 'এটা গুপ্তশব্দ লিখক',
 'yourpasswordagain' => 'গুপ্তশব্দ আকৌ এবাৰ লিখক',
+'createacct-yourpasswordagain' => 'গুপ্তশব্দ নিশ্চিত কৰক',
+'createacct-yourpasswordagain-ph' => 'গুপ্তশব্দ আকৌ লিখক',
 'remembermypassword' => 'মোৰ প্ৰৱেশ এই কম্পিউটাৰত মনত ৰাখিব (সৰ্বাধিক $1 {{PLURAL:$1|দিনলৈ|দিনলৈ}})',
-'securelogin-stick-https' => 'প্ৰৱেশ কৰা পাছত HTTPS-ৰ দ্বাৰা সংযোগ ৰাখক',
+'userlogin-remembermypassword' => 'মোক লগ্‌-ইন কৰাই ৰাখক',
+'userlogin-signwithsecure' => 'নিৰাপদ সংযোগ ব্যৱহাৰ কৰক',
 'yourdomainname' => 'আপোনাৰ ডমেইন:',
 'password-change-forbidden' => 'আপুনি এই ৱিকিত গুপ্তশব্দ সলাব নোৱাৰে।',
 'externaldberror' => 'কোনো প্ৰামাণ্যকৰণ তথ্যকোষৰ ত্ৰুটি ঘটিছে নতুবা আপোনাৰ বৰ্হি-একাউণ্ট নৱীকৰণ কৰাৰ অনুমতি নাই ।',
@@ -611,18 +629,41 @@ $2',
 'logout' => 'প্ৰস্থান',
 'userlogout' => 'প্ৰস্থান',
 'notloggedin' => 'প্ৰৱেশ কৰা নাই',
+'userlogin-noaccount' => 'কোনো একাউণ্ট নাই?',
+'userlogin-joinproject' => '{{SITENAME}}ত যোগদান কৰক',
 'nologin' => "ৱিকিপিডিয়াত আপোনাৰ একাউণ্ট নাই নেকি? তেনে '''$1'''।",
 'nologinlink' => 'নতুন একাউণ্ট খোলক',
 'createaccount' => 'সভ্যভুক্ত হবলৈ',
 'gotaccount' => "আপুনি সদস্য হয়নে? '''$1'''",
 'gotaccountlink' => 'প্ৰৱেশ',
 'userlogin-resetlink' => 'আপোনাৰ প্ৰৱেশ তথ্য পাহৰিছে?',
+'userlogin-resetpassword-link' => 'আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাওক',
+'helplogin-url' => 'Help:প্ৰৱেশ/লগ্‌-ইন',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|প্ৰৱেশ সম্পৰ্কীয় সাহায্য]]',
+'createacct-join' => 'আপোনাৰ তথ্যসমূহ তলত লিখক।',
+'createacct-another-join' => 'নতুন একাউণ্টৰ তথ্যসমূহ তলত লিখক।',
+'createacct-emailrequired' => 'ই-মেইল ঠিকনা',
+'createacct-emailoptional' => 'ই-মেইল ঠিকনা (বৈকল্পিক)',
+'createacct-email-ph' => 'আপোনাৰ ই-মেইল ঠিকনা লিখক',
+'createacct-another-email-ph' => 'ইমেইল ঠিকনা লিখক',
 'createaccountmail' => 'এটা যাদৃচ্ছিক অস্থায়ী গুপ্তশব্দ ব্যৱহাৰ কৰক আৰু ইয়াক তলত দিয়া ইমেইল ঠিকনাটোলৈ পঠিয়াই দিয়ক',
+'createacct-realname' => 'প্ৰকৃত নাম (বৈকল্পিক)',
 'createaccountreason' => 'কাৰণ:',
+'createacct-reason' => 'কাৰণ',
+'createacct-reason-ph' => 'আপুনি কিয় আন এটা একাউণ্ট সৃষ্টি কৰিছে',
+'createacct-captcha' => 'সুৰক্ষা পৰীক্ষা',
+'createacct-imgcaptcha-ph' => 'ওপৰত দেখা পোৱা পাঠ্য লিখক',
+'createacct-submit' => 'আপোনাৰ একাউণ্ট সৃষ্টি কৰক',
+'createacct-another-submit' => 'আন এটা একাউণ্ট সৃষ্টি কৰক',
+'createacct-benefit-heading' => 'আপোনাৰ দৰে মানুহেই {{SITENAME}} তৈয়াৰ কৰিছে',
+'createacct-benefit-body1' => '{{PLURAL:$1|সম্পাদনা}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|পৃষ্ঠা|পৃষ্ঠাসমূহ}}',
+'createacct-benefit-body3' => 'শেহতীয়া {{PLURAL:$1|অৱদানকাৰী|অৱদানকাৰীসকল}}',
 'badretype' => 'আপুনি দিয়া গুপ্ত শব্দ দুটা মিলা নাই।',
 'userexists' => 'আপুনি দিয়া সদস্যনাম আগৰে পৰাই ব্যৱহাৰ হৈ আছে।
 অনুগ্ৰহ কৰি বেলেগ সদস্যনাম এটা নিৰ্বাচন কৰক।',
 'loginerror' => 'প্ৰৱেশ সমস্যা',
+'createacct-error' => 'একাউণ্ট সৃষ্টিত ত্ৰুটি',
 'createaccounterror' => "একাউন্ট সৃষ্টি কৰা নহ'ল: $1",
 'nocookiesnew' => 'আপোনাৰ সদস্যভুক্তি হৈ গৈছে, কিন্তু আপুনি প্ৰৱেশ কৰা নাই।
 {{SITENAME}}ত প্ৰৱেশ কৰিবলৈ কুকি সক্ৰিয় থাকিব লাগিব।
@@ -685,10 +726,12 @@ $2',
 যদি এইয়া ভুলতে হৈছে, তেনেহলে আপুনি এই বাৰ্তাটো অবজ্ঞা কৰিব পাৰে ।',
 'usernamehasherror' => 'সদস্যনামত হেচ্‌ চিহ্ন থাকিব নোৱাৰে',
 'login-throttled' => 'আপুনি স‍ম্প্ৰতি অজস্ৰবাৰ লগ্‌-ইনৰ প্ৰয়াস কৰিছে ।
-অনুগ্ৰহ কৰি কিছু সময় অপেক্ষা কৰি আকৌ প্ৰয়াস কৰক ।',
+অনুগ্ৰহ কৰি $1 সময়ৰ পিছত আকৌ চেষ্টা কৰক ।',
 'login-abort-generic' => 'আপোনাৰ প্ৰৱেশ অসফল হৈছে- বাতিল কৰা হ’ল',
 'loginlanguagelabel' => 'ভাষা: $1',
 'suspicious-userlogout' => 'আপোনাৰ প্ৰস্থানৰ অনুৰোধ বাতিল কৰা হৈছে কাৰণ হয়তো আপোনাৰ ব্ৰাউজাৰ অসম্পূৰ্ণ নতুবা পূৰ্বৱতী তথ্য পঠাইছে ।',
+'createacct-another-realname-tip' => "প্ৰকৃত নাম দিয়াটো বৈকল্পিক।
+আপুনি নামটো দিলে সেইটো আপোনাৰ বৰঙণিসমূহৰ বাবে স্বীকৃতি প্ৰদানত ব্যৱহাৰ কৰা হ'ব।",
 
 # Email sending
 'php-mail-error-unknown' => 'পি.এইছ.পি মেইল () কাৰ্যত অজ্ঞাত ত্ৰুটি ।',
@@ -704,7 +747,7 @@ $2',
 'newpassword' => 'নতুন গুপ্তশব্দ:',
 'retypenew' => 'নতুন গুপ্তশব্দ আকৌ লিখক',
 'resetpass_submit' => 'গুপ্তশব্দ বহুৱাওক আৰু প্ৰৱেশ কৰক',
-'resetpass_success' => 'আপোনাৰ গুপ্তশব্দ সফলতাৰে সলনি কৰা হৈছে, এতিয়া আপুনি প্ৰৱেশ কৰি আছে...',
+'changepassword-success' => 'আপোনাৰ গুপ্তশব্দ সফলতাৰে সলনি কৰা হৈছে!',
 'resetpass_forbidden' => 'গুপ্তশব্দ সলনি কৰিব নোৱাৰি',
 'resetpass-no-info' => 'এই পৃষ্ঠা প্ৰত্যক্ষ ভাৱে ঢুকি পাবলৈ আপুনি প্ৰৱেশ কৰিব লাগিব ।',
 'resetpass-submit-loggedin' => 'গুপ্তশব্দ সলনি কৰক',
@@ -716,10 +759,10 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'গুপ্তশব্দ ন-কৈ বহুৱাওক',
-'passwordreset-text' => ' আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ তলৰ প্ৰপত্ৰ সম্পূৰ্ণ কৰক।',
+'passwordreset-text-one' => 'আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ এই প্ৰপত্ৰ পূৰণ কৰক।',
 'passwordreset-legend' => 'গুপ্তশব্দ ন-কৈ বহাওক',
 'passwordreset-disabled' => 'এই ৱিকিত গুপ্তশব্দ নবীকৰণ নিষ্ক্ৰিয় কৰা হৈছে ।',
-'passwordreset-pretext' => '{{PLURAL:$1||তলত উল্লেখ কৰা তথ্যৰ কোনো অংশ ভৰাওক}}',
+'passwordreset-emaildisabled' => 'এই ৱিকিত ই-মেইল বৈশিষ্টসমূহ নিষ্ক্ৰিয় কৰা হৈছে।',
 'passwordreset-username' => 'সদস্যনাম',
 'passwordreset-domain' => 'ডমেইন :',
 'passwordreset-capture' => 'ফলাফল ই-মেইলখন চাবলৈ বিচাৰিছে ?',
@@ -740,7 +783,7 @@ $2
 অস্থায়ী গুপ্তশব্দ: $2',
 'passwordreset-emailsent' => 'এখন গুপ্তশব্দ উদ্ধাৰ ই-মেইল পঠিওৱা হৈছে।',
 'passwordreset-emailsent-capture' => 'এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল পঠিওৱা হৈছে, এইখন তলত দেখা পাব।',
-'passwordreset-emailerror-capture' => "এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল সৃষ্টি কৰা হ'ল কিন্তু সদস্যজনলৈ পঠিয়াব পৰা নগ'ল, এইখন তলত দেখুওৱা হৈছে: $1",
+'passwordreset-emailerror-capture' => "এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল সৃষ্টি কৰা হ'ল, কিন্তু {{GENDER:$2|সদস্যজনলৈ}} পঠিয়াব পৰা নগ'ল। সেইখন তলত দেখুওৱা হৈছে: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'ই-মেইল ঠিকনা সলনি কৰক',
@@ -754,6 +797,9 @@ $2
 'changeemail-submit' => 'ই-মেইল ঠিকনা সলনি কৰক',
 'changeemail-cancel' => 'বাতিল কৰক',
 
+# Special:ResetTokens
+'resettokens' => "ট'কেন ৰিছে'ট কৰক",
+
 # Edit page toolbar
 'bold_sample' => 'গাঢ় পাঠ্য',
 'bold_tip' => 'গাঢ় পাঠ্য',
@@ -961,12 +1007,14 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 সম্ভৱতঃ পৃষ্ঠাখন বিলোপ কৰা হৈছে ।',
 'edit-conflict' => 'সম্পাদনা দ্বন্দ্ব ।',
 'edit-no-change' => 'আপোনাৰ সম্পাদনা আওকাণ কৰা হৈছে, কাৰণ লেখাত কোনো তফাৎ নাই',
+'postedit-confirmation' => "আপোনাৰ সম্পাদনা সংৰক্ষিত কৰা হ'ল ।",
 'edit-already-exists' => "নতুন পৃষ্ঠা সৃষ্টি কৰা নহ'ল ।
 পৃষ্ঠাখন ইতিমধ্যে আছেই ।",
 'defaultmessagetext' => 'সাধাৰণ বাৰ্তা পাঠ্য',
 'content-failed-to-parse' => '$1 মডেলৰ বাবে $2ৰ তথ্য নিকা কৰিব পৰা নগ’ল: $3',
 'invalid-content-data' => 'অবৈধ সমল তথ্য',
 'content-not-allowed-here' => '[[$2]] পৃষ্ঠাত "$1" সমল অনুমোদিত নহয়',
+'editwarning-warning' => 'এই পৃষ্ঠাটো এৰিলে আপুনি কৰা পৰিবৰ্তনসমূহ হেৰাব পাৰে। যদি আপুনি প্ৰৱেশ কৰা অৱস্থাত আছে, আপুনি এই সতৰ্কবাৰ্তাক আপোনাৰ পছন্দসমূহৰ "সম্পাদনা" অংশত অসামৰ্থবান কৰিব পাৰিব।',
 
 # Content models
 'content-model-wikitext' => 'ৱিকিপাঠ্য',
@@ -1212,7 +1260,6 @@ $1",
 'searchmenu-legend' => 'সন্ধান বিকল্পসমূহ',
 'searchmenu-exists' => 'এই ৱিকিত "[[:$1]]" নামৰ পৃষ্ঠা এখন আছে ।',
 'searchmenu-new' => "'''এই ৱিকিত \"[[:\$1]]\" পৃষ্ঠাখন সৃষ্টি কৰক!'''",
-'searchhelp-url' => 'Help:সমল',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|এই উপসৰ্গ থকা পৃষ্ঠাসমূহ ব্ৰাউজ কৰক]]',
 'searchprofile-articles' => 'বিষয়বস্তুৰ পৃষ্ঠা',
 'searchprofile-project' => 'সহায় আৰু প্ৰকল্প পৃষ্ঠাসমূহ',
@@ -1256,15 +1303,7 @@ $1",
 'searchdisabled' => '{{SITENAME}} ত অনুসন্ধান কৰা সাময়িক ভাবে নিষ্ক্ৰিয় কৰা হৈছে।
 তেতিয়ালৈকে গুগলত অনুসন্ধান কৰক।
 মনত ৰাখিব যে তেঁওলোকৰ {{SITENAME}}ৰ ইণ্ডেক্স পুৰণি হব পাৰে।',
-
-# Quickbar
-'qbsettings' => 'শীঘ্ৰদণ্ডিকা',
-'qbsettings-none' => 'একেবাৰে নহয়',
-'qbsettings-fixedleft' => 'বাঁওফাল স্থিৰ',
-'qbsettings-fixedright' => 'সোঁফাল স্থিৰ',
-'qbsettings-floatingleft' => 'বাঁওফাল অস্থিৰ',
-'qbsettings-floatingright' => 'সোঁফাল অস্থিৰ',
-'qbsettings-directionality' => 'আপোনাৰ ভাষাৰ আৰু লিপিৰ দিশৰ ওপৰত নিৰ্ভৰ কৰি ঠিক কৰা হ’ল',
+'search-error' => 'অনুসন্ধানৰ সময়ত এটা ত্ৰুটি হৈছে: $1',
 
 # Preferences page
 'preferences' => 'পছন্দসমূহ',
@@ -1298,7 +1337,6 @@ $1",
 'resetprefs' => 'অসঞ্চিত সাল-সলনি বাতিল কৰক',
 'restoreprefs' => 'সকলো পূৰ্বনিৰ্ধাৰিত ছেটিং ঘূৰাই আনক',
 'prefs-editing' => 'সম্পাদন',
-'prefs-edit-boxsize' => "সম্পাদনা ৱিণ্ড'ৰ আকাৰ",
 'rows' => 'পথালী শাৰী:',
 'columns' => 'ঠিয় শাৰী:',
 'searchresultshead' => 'অনুসন্ধান',
@@ -1309,8 +1347,6 @@ $1",
 'recentchangesdays-max' => 'সৰ্বোচ্চ $1 {{PLURAL:$1|দিন|দিন}}',
 'recentchangescount' => 'শেহতীয়া সাল-সলনি, ইতিহাস আৰু লগ পৃষ্ঠাত দেখুৱাব লগা সম্পাদনাৰ সংখ্যা:',
 'prefs-help-recentchangescount' => 'ইয়াত শেহতীয়া সাল-সলনি, পৃষ্ঠাৰ ইতিহাস আৰু লগ অন্তৰ্ভুক্ত ।',
-'prefs-help-watchlist-token' => 'এই ঘৰটো এটা গোপন শব্দ চাবিৰে পূৰণ কৰিলে আপোনাৰ লক্ষ্য-তালিকাৰ বাবে এটা আৰ.এচ.এচ. ফিড তৈয়াৰ হ’ব । এই শব্দচাবি জনা সদস্যই আপোনাৰ লক্ষ্য-তালিকা চাব পাৰিব, সেয়ে এটা সুৰক্ষিত মান ব্যৱহাৰ কৰক ।
-আপুনি ব্যৱহাৰ কৰিব পৰাকৈ এটা যাদৃচ্ছিক মান দিয়া হ’ল: $1',
 'savedprefs' => 'আপোনাৰ পছন্দসমূহ সাঁচি ৰখা হ’ল।',
 'timezonelegend' => 'সময় স্থান:',
 'localtime' => 'স্থানীয় সময়:',
@@ -1341,7 +1377,6 @@ $1",
 'prefs-reset-intro' => 'আপুনি এই পৃষ্ঠা ব্যৱহাৰ কৰি আপোনাৰ পছন্দসমূহক চাইটৰ পূৰ্বনিৰ্ধাৰিত ছেটঙলৈ ঘূৰাই নিব পাৰে ।
 এই পৰিৱৰ্তন পিছত সলাব পৰা নাযাব ।',
 'prefs-emailconfirm-label' => 'ইমেইল নিশ্চিতকৰণ:',
-'prefs-textboxsize' => 'সম্পাদনা ৱিণ্ড’ৰ আকাৰ',
 'youremail' => 'আপোনাৰ ই-মেইল *',
 'username' => '{{GENDER:$1|সদস্যনাম}}:',
 'uid' => '{{GENDER:$1|User}} চিহ্ন:',
@@ -1408,6 +1443,8 @@ $1",
 'userrights-notallowed' => 'সদস্যৰ অধিকাৰ যোগ কৰিবলৈ বা আঁতৰ কৰিবলৈ আপোনাৰ একাউণ্টৰ অনুমতি নাই ।',
 'userrights-changeable-col' => 'আপুনি সলনি কৰিব পৰা গোটসমূহ',
 'userrights-unchangeable-col' => 'আপুনি সলনি কৰিব নোৱাৰা গোটসমূহ',
+'userrights-conflict' => 'সদস্য অধিকাৰ দ্বন্দ্ব! অনুগ্ৰহ কৰি আপোনাৰ সালসলনি আকৌ এবাৰ প্ৰয়োগ কৰক।',
+'userrights-removed-self' => 'আপুনি সফলতাৰে নিজৰ অধিকাৰসমূহ আঁতৰ কৰিলে। গতিকে আপুনি এতিয়া এই পৃষ্ঠা চাব নোৱাৰে।',
 
 # Groups
 'group' => 'গোট:',
@@ -1478,6 +1515,9 @@ $1",
 'right-editusercssjs' => 'আন সদস্যৰ CSS আৰু JavaScript  সম্পাদনা কৰক',
 'right-editusercss' => 'আন সদস্যৰ CSS ফাইল সম্পাদনা কৰক',
 'right-edituserjs' => 'আন সদস্যৰ JavaScript ফাইল  সম্পাদনা কৰক',
+'right-editmyusercss' => 'আপোনাৰ নিজৰ সদস্য CSS ফাইলসমূহ সম্পাদনা কৰক।',
+'right-editmyuserjs' => 'আপোনাৰ নিজৰ সদস্য JavaScript ফাইলসমূহ সম্পাদনা কৰক',
+'right-viewmywatchlist' => 'আপোনাৰ নিজৰ লক্ষ্য-তালিকা চাওক',
 'right-rollback' => 'শেষৰজন সদস্যই এখন নিৰ্দিষ্ট পৃষ্টাত কৰা সম্পাদনা পূৰ্বৰ অৱস্থালৈ ঘূৰাই আনক',
 'right-markbotedits' => 'ৰ’ল্ড-বেক সম্পাদনাসমূহ বট সম্পাদনা বুলি চিহ্নিত কৰক',
 'right-noratelimit' => 'গতি সীমাৰ দ্বাৰা প্ৰভাৱিত নহ’ব',
@@ -1581,7 +1621,6 @@ $1",
 'recentchangeslinked-feed' => 'প্ৰাসংগিক সালসলনিসমূহ',
 'recentchangeslinked-toolbox' => 'প্ৰাসংগিক সালসলনিসমূহ',
 'recentchangeslinked-title' => '"$1"ৰ লগত জড়িত সাল-সলনি',
-'recentchangeslinked-noresult' => 'দিয়া সময়ৰ ভিতৰত সংযোজিত পৃষ্ঠা সমূহত সাল-সলনি হোৱা নাই ।',
 'recentchangeslinked-summary' => "এখন নিৰ্দিষ্ট পৃষ্ঠাৰ লগত সংযুক্ত পৃষ্ঠাসমূহৰ( বা এটা নিৰ্দিষ্ট শ্ৰেণীৰ সদস্যসমূহৰ) শেহতীয়া সালসলনিৰ তালিকা তলত দিয়া হৈছে ।
 [[Special:Watchlist|আপুনি চকু ৰখা পৃষ্ঠাসমূহৰ তালিকা]] ত থকা পৃষ্ঠাসমূহ '''গাঢ়''' দেখা পাব ।",
 'recentchangeslinked-page' => 'পৃষ্ঠাৰ নাম:',
@@ -1817,7 +1856,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'http-read-error' => 'HTTP পঠন ত্ৰুটি ।',
 'http-timed-out' => 'HTTP অনুৰোধৰ সময় পাৰ হৈছে ।',
 'http-curl-error' => 'URL অনাত ত্ৰুটি হৈছে: $1',
-'http-host-unreachable' => 'URL পাব পৰা নগ’ল ।',
 'http-bad-status' => 'HTTP অনুৰোধৰ সময়ত কোনো সমস্যা হৈছে: $1, $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1971,12 +2009,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'statistics-users-active-desc' => 'শেষ {{PLURAL:$1|দিনত|$1 দিনত}} কোনো কাম কৰা সদস্যসমূহ',
 'statistics-mostpopular' => 'সৰ্বোচ্চ দৰ্শন কৰা পৃষ্ঠাসমূহ',
 
-'disambiguations' => 'দ্ব্যৰ্থতা-দূৰীকৰণ পৃষ্ঠাসমূহলৈ সংযোগ থকা পৃষ্ঠাসমূহ',
-'disambiguationspage' => 'সাঁচ:দ্ব্যৰ্থতা-দূৰীকৰণ',
-'disambiguations-text' => "তলৰ পৃষ্ঠাখনসমূহত অন্ততঃ এটা হ'লেই '''দ্ব্যৰ্থতা দূৰীকৰণ পৃষ্ঠা'''ৰ সংযোগ আছে।
-তাৰ সলনি সেইবোৰত উপযুক্ত পৃষ্ঠাৰ লগত সংযোগ থাকিব পাৰে।
-[[MediaWiki:Disambiguationspage]]ৰ পৰা সংযোগ থকা কোনো সাঁচ ব্যৱহাৰ কৰিলে এখন পৃষ্ঠাক দ্ব্যৰ্থতা দূৰীকৰণ পৃষ্ঠা হিছাপে গণ্য কৰা হয়।",
-
 'pageswithprop' => 'পৃষ্ঠা উপাদান সম্বলিত পৃষ্ঠাসমূহ',
 'pageswithprop-legend' => 'পৃষ্ঠা উপাদান সম্বলিত পৃষ্ঠাসমূহ',
 'pageswithprop-text' => 'বিশেষ পৃষ্ঠা উপাদান ব্যৱহাৰ কৰা পৃষ্ঠাসমূহ ইয়াত তালিকাভুক্ত কৰা হৈছে।',
@@ -2230,10 +2262,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'unwatchthispage' => 'চকু দিয়া বন্ধ কৰক',
 'notanarticle' => 'বিষয়বস্তু পৃষ্ঠা নহয়',
 'notvisiblerev' => 'অন্য কোনো সদস্যই কৰা সংশোধনী বিলোপ কৰা হৈছে',
-'watchnochange' => 'আপুনি চকু ৰখা আইটেমসমূহ প্ৰদৰ্শিত সময়সীমাৰ ভিতৰত সম্পাদনা কৰা হোৱা নাই ।',
 'watchlist-details' => 'আলোচনা পৃষ্ঠা সমূহ লেখত নধৰি {{PLURAL:$1|$1 খন পৃষ্ঠা|$1 খন পৃষ্ঠা}} আপোনাৰ লক্ষ্য-তালিকাত আছে ।',
-'wlheader-enotif' => '* ই-পত্ৰ জাননী সক্ৰিয় কৰা হৈছে ।',
-'wlheader-showupdated' => "* আপোনাৰ শেষ পৰিদৰ্শনৰ পিছত হোৱা পৰিৱৰ্তনসমূহ '''গাঢ়''' আখৰত দেখুওৱা হৈছে",
+'wlheader-enotif' => 'ইমেইল জাননী সক্ৰিয় কৰা হৈছে।',
+'wlheader-showupdated' => "আপোনাৰ শেষ পৰিদৰ্শনৰ পিছত সলনি হোৱা পৃষ্ঠাসমূহ '''গাঢ়''' আখৰত দেখুওৱা হৈছে।",
 'watchmethod-recent' => 'লক্ষ্য কৰা পৃষ্ঠাসমূহ শেহতীয়া সম্পাদনাৰ বাবে পৰীক্ষা কৰা হৈছে',
 'watchmethod-list' => 'লক্ষ্য কৰা পৃষ্ঠাসমূহ শেহতীয়া সম্পাদনাৰ বাবে পৰীক্ষা কৰা হৈছে',
 'watchlistcontains' => 'আপোনাৰ লক্ষ্য-তালিকাত $1 খন {{PLURAL:$1|পৃষ্ঠা|পৃষ্ঠা}} আছে ।',
@@ -2645,12 +2676,9 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 কিন্তু এইটো $2 পৰিসীমাৰ অন্তৰ্গত যাৰ বাধা আঁতৰাব পাৰি ।',
 'ip_range_invalid' => 'অবৈধ আই.পি. পৰিসৰ ।',
 'ip_range_toolarge' => '/$1তকৈ ডাঙৰ প্ৰতিবন্ধক পৰিসৰ অনুমোদিত নহয় ।',
-'blockme' => 'মোক বাৰণ কৰক',
 'proxyblocker' => 'প্ৰক্সী অৱৰোধকাৰী',
-'proxyblocker-disabled' => 'এই ফাংচনটো নিষ্ক্ৰিয়',
 'proxyblockreason' => 'আপোনাৰ আই.পি. ঠিকনা অৱৰোধ কৰা হৈছে কাৰণ এইটো এটা মুক্ত প্ৰক্সী ।
 অনুগ্ৰহ কৰি আপোনাৰ ইণ্টাৰনেট সেৱা প্ৰদানকাৰী বা কাৰিকৰী সহায়কৰ্তাৰ লগত যোগাযোগ কৰক আৰু এই গুৰুতৰ সুৰক্ষা সমস্যাৰ বিষয়ে জনাওক ।',
-'proxyblocksuccess' => 'সম্পন্ন কৰা হ’ল ।',
 'sorbsreason' => '{{SITENAME}}ত ব্যৱহাৰ কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মুক্ত প্ৰক্সী হিছাপে তালিকাভুক্ত হৈ আছে ।',
 'sorbs_create_account_reason' => '{{SITENAME}}ত ব্যৱহাৰ কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মুক্ত প্ৰক্সী হিছাপে তালিকাভুক্ত হৈ আছে ।
 আপুনি একাউণ্ট সৃষ্টি কৰিব নোৱাৰে',
@@ -2821,6 +2849,8 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'thumbnail-more' => 'ডাঙৰকৈ চাওক',
 'filemissing' => 'ফাইল বিচাৰি পোৱা নগ’ল',
 'thumbnail_error' => 'ক্ষুদ্ৰ প্ৰতিকৃতি সৃষ্টি কৰাত অসুবিধা হৈছে: $1',
+'thumbnail_error_remote' => '$1ৰপৰা ত্ৰুটি বাৰ্তা:
+$2',
 'djvu_page_error' => 'DjVu পৃষ্ঠা পৰিসীমাৰ বাহিৰত',
 'djvu_no_xml' => "DjVu ফাইলৰ বাবে XML আনিব পৰা নগ'ল",
 'thumbnail-temp-create' => 'অস্থায়ী থাম্বনেইল নথিপত্ৰ সৃষ্টি কৰিবলে অক্ষম',
@@ -3117,11 +3147,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 মিনিট|$1 মিনিট}}',
 'hours' => '{{PLURAL:$1|$1 ঘন্টা|$1 ঘন্টা}}',
 'days' => '{{PLURAL:$1|$1 দিন|$1 দিন}}',
+'weeks' => '{{PLURAL:$1|$1 সপ্তাহ}}',
 'months' => '{{PLURAL:$1|$1 মাহ}}',
 'years' => '{{PLURAL:$1|$1বছৰ|$1 বছৰ}}',
 'ago' => '$1 আগেয়ে',
 'just-now' => 'এইমাত্ৰ',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ঘন্টা}} আগেয়ে',
+'minutes-ago' => '$1 {{PLURAL:$1|মাহ}} আগেয়ে',
+'seconds-ago' => '$1 {{PLURAL:$1|ছেকেন্ড}} আগতে',
+'monday-at' => 'সোমবাৰে $1ত',
+'tuesday-at' => 'মঙ্গলবাৰে  $1’ত',
+'wednesday-at' => 'বুধবাৰে $1’ত',
+'thursday-at' => 'বৃহস্পতিবাৰে $1’ত',
+'friday-at' => 'শুক্ৰবাৰে $1’ত',
+'saturday-at' => 'শনিবাৰে $1’ত',
+'sunday-at' => 'দেওবাৰে $1’ত',
+'yesterday-at' => 'কালি $1’ত',
+
 # Bad image list
 'bad_image_list' => 'The format is as follows:
 
@@ -3151,7 +3195,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'প্ৰস্থ',
 'exif-imagelength' => 'উচ্চতা',
 'exif-bitspersample' => 'প্ৰতি অংশৰ বিট',
@@ -3329,7 +3373,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-originalimageheight' => "ক্ৰ'প কৰাৰ আগত ছবিৰ উচ্চতা",
 'exif-originalimagewidth' => "ক্ৰ'প কৰাৰ আগত ছবিৰ প্ৰস্থতা",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'অসংকুচিত',
 'exif-compression-2' => "CCITT দল ৩ ১-পৰিসৰ পৰিৱৰ্তীত Huffman চলন দৈৰ্ঘ্য এনক'ডিং",
 'exif-compression-3' => "CCITT দল ৩ ফেক্স এনক'ডিং",
@@ -3725,7 +3769,6 @@ $5
 'version-other' => 'অন্য',
 'version-mediahandlers' => 'মাধ্যম ব্যৱস্থাপকসমূহ',
 'version-hooks' => 'হুকসমূহ',
-'version-extension-functions' => 'সম্প্ৰসাৰন ফলনসমূহ',
 'version-parser-extensiontags' => 'পাৰ্চাৰ এক্সটেনচন টেগসমূহ',
 'version-parser-function-hooks' => 'পাৰ্চাৰ ফাংচন হুকসমূহ',
 'version-hook-name' => 'হুক নাম',
@@ -3749,12 +3792,17 @@ $5
 'version-entrypoints-header-entrypoint' => 'প্ৰৱেশ পইণ্ট',
 'version-entrypoints-header-url' => 'ইউআৰএল',
 
-# Special:FilePath
-'filepath' => 'নথিৰ পথ',
-'filepath-page' => 'নথি:',
-'filepath-submit' => 'যাওক',
-'filepath-summary' => 'এই বিশেষ পৃষ্ঠায় এটা নথিপত্ৰৰ বাবে সম্পূৰ্ণ পথ ঘুৰাই পঠায়।
-ছবিসমূহক সম্পূৰ্ণ বিভেদনত দেখুৱা হয়, অন্য নথিপত্ৰ ধৰণসমূহ সিহতৰ সংলঘ্ন প্ৰগ্ৰামৰ সৈতে প্ৰত্যক্ষভাৱে আৰম্ভ হয়।',
+# Special:Redirect
+'redirect' => 'ফাইল, সদস্য, বা সংশোধন আই ডিৰে পুনঃনিৰ্দেশ',
+'redirect-legend' => 'এটা ফাইল বা এখন এখন পৃষ্ঠালৈ পুনঃনিৰ্দেশ',
+'redirect-summary' => 'এই বিশেষ পৃষ্ঠাটোৱে আপোনাক পুনঃনির্দেশিত কৰিছে অন্য এটা নথিপত্রলৈ (নথিপত্রৰ নাম), এটা পৃষ্ঠালৈ (পৃষ্ঠাৰ নাম), অথবা অন্য সদস্যৰ পৃষ্ঠালৈ(সংখ্যাৰে লিখা সদস্যৰ আইডি) ।',
+'redirect-submit' => 'যাওক',
+'redirect-lookup' => 'চাওক:',
+'redirect-value' => 'মূল্য:',
+'redirect-user' => 'সদস্য আই ডি',
+'redirect-revision' => 'পৃষ্ঠা সংশোধন',
+'redirect-file' => 'ফাইলৰ নাম',
+'redirect-not-exists' => "মূল্য পোৱা নগ'ল",
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'প্ৰতিলিপি পৃষ্ঠাসমূহ অনুসন্ধান কৰক',
@@ -3845,6 +3893,9 @@ $5
 'htmlform-submit' => 'দাখিল কৰক',
 'htmlform-reset' => 'সাল-সলনি বাতিল কৰক',
 'htmlform-selectorother-other' => 'অন্য',
+'htmlform-no' => 'নহয়',
+'htmlform-yes' => 'হয়',
+'htmlform-chosen-placeholder' => 'এটা বিকল্প বাছনি কৰক',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 সম্পূৰ্ণ-পাঠ অনুসন্ধান সমৰ্থন সহ',
diff --git a/languages/messages/MessagesAst.php b/languages/messages/MessagesAst.php
index f954f71b..89236424 100644
--- a/languages/messages/MessagesAst.php
+++ b/languages/messages/MessagesAst.php
@@ -18,43 +18,47 @@
  */
 
 $namespaceNames = array(
-	NS_MEDIA            => 'Media',
+	NS_MEDIA            => 'Medios',
 	NS_SPECIAL          => 'Especial',
 	NS_TALK             => 'Alderique',
 	NS_USER             => 'Usuariu',
 	NS_USER_TALK        => 'Usuariu_alderique',
 	NS_PROJECT_TALK     => '$1_alderique',
-	NS_FILE             => 'Archivu',
-	NS_FILE_TALK        => 'Archivu_alderique',
+	NS_FILE             => 'Ficheru',
+	NS_FILE_TALK        => 'Ficheru_alderique',
 	NS_MEDIAWIKI        => 'MediaWiki',
 	NS_MEDIAWIKI_TALK   => 'MediaWiki_alderique',
 	NS_TEMPLATE         => 'Plantía',
 	NS_TEMPLATE_TALK    => 'Plantía_alderique',
-	NS_HELP             => 'Aida',
-	NS_HELP_TALK        => 'Aida_alderique',
+	NS_HELP             => 'Ayuda',
+	NS_HELP_TALK        => 'Ayuda_alderique',
 	NS_CATEGORY         => 'Categoría',
 	NS_CATEGORY_TALK    => 'Categoría_alderique',
 );
 
 $namespaceAliases = array(
-	'Imaxe' => NS_FILE,
-	'Imaxe alderique' => NS_FILE_TALK,
+	'Imaxe'               => NS_FILE,
+	'Imaxe alderique'     => NS_FILE_TALK,
 	'Discusión'           => NS_TALK,
 	'Usuariu_discusión'   => NS_USER_TALK,
 	'$1_discusión'        => NS_PROJECT_TALK,
 	'Imaxen'              => NS_FILE,
 	'Imaxen_discusión'    => NS_FILE_TALK,
+	'Archivu'             => NS_FILE,
+	'Archivu_alderique'   => NS_FILE_TALK,
 	'MediaWiki_discusión' => NS_MEDIAWIKI_TALK,
 	'Plantilla'           => NS_TEMPLATE,
 	'Plantilla_discusión' => NS_TEMPLATE_TALK,
-	'Ayuda'               => NS_HELP,
 	'Ayuda_discusión'     => NS_HELP_TALK,
+	'Aida'                => NS_HELP,
+	'Aida_alderique'      => NS_HELP_TALK,
 	'Categoría_discusión' => NS_CATEGORY_TALK,
 );
 
 $specialPageAliases = array(
 	'Block'                     => array( 'Bloquiar', 'BloquiarIP', 'BloquiarUsuariu' ),
-	'Log'                       => array( 'Rexistru' ),
+	'Log'                       => array( 'Rexistru', 'Rexistros' ),
+	'Search'                    => array( 'Gueta' ),
 	'Statistics'                => array( 'Estadístiques' ),
 );
 
@@ -89,9 +93,6 @@ $messages = array(
 'tog-shownumberswatching' => "Amosar el númberu d'usuarios que tán vixilando la páxina",
 'tog-oldsig' => 'Firma esistente:',
 'tog-fancysig' => 'Tratar la firma como testu wiki (ensin enllaz automáticu)',
-'tog-externaleditor' => 'Usar un editor esternu por defeutu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
-'tog-externaldiff' => 'Usar un diff esternu por defutu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
-'tog-showjumplinks' => 'Activar los enllaces d\'accesibilidá "saltar a"',
 'tog-uselivepreview' => 'Usar vista previa en tiempu real (experimental)',
 'tog-forceeditsummary' => "Avisame cuando grabe col resume d'edición en blanco",
 'tog-watchlisthideown' => 'Anubrir les mios ediciones na llista de vixilancia',
@@ -105,6 +106,8 @@ $messages = array(
 'tog-showhiddencats' => 'Amosar categoríes anubríes',
 'tog-noconvertlink' => 'Desactivar la conversión del títulu del enllaz',
 'tog-norollbackdiff' => 'Desaniciar les diferencies depués de facer una restauración',
+'tog-useeditwarning' => "Avisame cuando salga d'una páxina d'edición con cambios ensin guardar",
+'tog-prefershttps' => 'Usar siempre una conexón segura en aniciando sesión',
 
 'underline-always' => 'Siempre',
 'underline-never' => 'Nunca',
@@ -168,6 +171,18 @@ $messages = array(
 'oct' => 'och',
 'nov' => 'pay',
 'dec' => 'avi',
+'january-date' => '$1 de xineru',
+'february-date' => '$1 de febreru',
+'march-date' => '$1 de marzu',
+'april-date' => "$1 d'abril",
+'may-date' => '$1 de mayu',
+'june-date' => '$1 de xunu',
+'july-date' => '$1 de xunetu',
+'august-date' => "$1 d'agostu",
+'september-date' => '$1 de setiembre',
+'october-date' => "$1 d'ochobre",
+'november-date' => '$1 de payares',
+'december-date' => "$1 d'avientu",
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoría|Categoríes}}',
@@ -249,6 +264,7 @@ $messages = array(
 'create-this-page' => 'Crear esta páxina',
 'delete' => 'Desaniciar',
 'deletethispage' => 'Desaniciar esta páxina',
+'undeletethispage' => 'Restaurar esta páxina',
 'undelete_short' => 'Restaurar {{PLURAL:$1|una edición|$1 ediciones}}',
 'viewdeleted_short' => 'Ver {{PLURAL:$1|una edición desaniciada|$1 ediciones desaniciaes}}',
 'protect' => 'Protexer',
@@ -292,7 +308,7 @@ $1",
 'pool-queuefull' => 'La cola de trabayu ta enllena',
 'pool-errorunknown' => 'Fallu desconocíu',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Tocante a {{SITENAME}}',
 'aboutpage' => 'Project:Tocante a',
 'copyright' => "El conteníu ta disponible baxo los términos de la $1 si nun s'indica otra cosa.",
@@ -302,7 +318,6 @@ $1",
 'disclaimers' => 'Avisu llegal',
 'disclaimerpage' => 'Project:Avisu xeneral',
 'edithelp' => "Ayuda d'edición",
-'edithelppage' => 'Help:Cómo editar una páxina',
 'helppage' => 'Help:Conteníu',
 'mainpage' => 'Portada',
 'mainpage-description' => 'Portada',
@@ -379,17 +394,12 @@ Pues atopar una llista de les páxines especiales válides en [[Special:SpecialP
 # General errors
 'error' => 'Error',
 'databaseerror' => 'Fallu na base de datos',
-'dberrortext' => "Hebo un fallu de sintaxis nuna consulta a la base de datos.
-Esti fallu pue ser por un problema del software.
-La postrer consulta a la base de datos que s'intentó foi:
-<blockquote><code>$1</code></blockquote>
-dende la función «<code>$2</code>».
-La base datos dio'l fallu «<samp>$3: $4</samp>».",
-'dberrortextcl' => "Hebo un error de sintaxis nuna consulta a la base de datos.
-La última consulta a la base de datos que s'intentó foi:
-«$1»
-dende la función «$2».
-La base de datos devolvió l'error «$3: $4».",
+'databaseerror-text' => 'Hebo un error na consulta a la base de datos.
+Esto pue indicar un fallu nel software.',
+'databaseerror-textcl' => 'Hebo un error na consulta a la base de datos.',
+'databaseerror-query' => 'Consulta: $1',
+'databaseerror-function' => 'Función: $1',
+'databaseerror-error' => 'Error: $1',
 'laggedslavemode' => "'''Avisu:''' Esta páxina pue que nun tenga actualizaciones recientes.",
 'readonly' => 'Base de datos candada',
 'enterlockreason' => 'Introduz un motivu pal candáu, amestando una estimación de cuándo va tener llugar el descandáu',
@@ -423,6 +433,7 @@ Seique daquién yá lo desaniciara.",
 'cannotdelete-title' => 'Nun se pue desaniciar la páxina «$1»',
 'delete-hook-aborted' => 'Desaniciu albortáu pol hook.
 Nun conseñó esplicación.',
+'no-null-revision' => 'Nun pudo crease una nueva revisión nula pa la páxina «$1»',
 'badtitle' => 'Títulu incorreutu',
 'badtitletext' => 'El títulu de páxina solicitáu nun ye válidu, ta baleru o tien enllaces interllingua o interwiki incorreutos.
 Pue contener un caráuter o más que nun puen usase nos títulos.',
@@ -446,12 +457,15 @@ P'amestar o cambiar les traducciones de toles wikis, por favor usa [//translatew
 'editinginterface' => "'''Avisu:''' Tas editando una páxina que s'usa pa proporcionar el testu d'interfaz del programa.
 Los cambeos nesta páxina van afeutar l'apariencia de la interfaz pa otros usuarios d'esta wiki.
 P'amestar o camudar traducciones pa toles wikis, por favor, usa [//translatewiki.net/ translatewiki.net], el proyeutu de traducción de MediaWiki.",
-'sqlhidden' => '(consulta SQL anubrida)',
 'cascadeprotected' => "Esta páxina ta protexida d'ediciones porque ta inxerta {{PLURAL:$1|na siguiente páxina, protexida|nes siguientes páxines, protexíes}} cola opción «en cascada» activada:
 $2",
 'namespaceprotected' => "Nun tienes permisu pa editar páxines nel espaciu de nomes '''$1'''.",
 'customcssprotected' => "Nun tienes permisu pa editar esta páxina CSS porque contién preferencies personales d'otru usuariu.",
 'customjsprotected' => "Nun tienes permisu pa editar esta páxina de JavaScript porque contién preferencies personales d'otru usuariu.",
+'mycustomcssprotected' => 'Nun tien permisu pa editar esta páxina CSS.',
+'mycustomjsprotected' => 'Nun tien permisu pa editar esta páxina JavaScript.',
+'myprivateinfoprotected' => 'Nun tien permisu pa editar la so información privada.',
+'mypreferencesprotected' => 'Nun tien permisu pa editar les sos preferencies.',
 'ns-specialprotected' => 'Les páxines especiales nun se puen editar.',
 'titleprotected' => "Esti títulu ta protexíu escontra creación por [[User:$1|$1]].
 El motivu conseñáu ye «''$2''».",
@@ -476,10 +490,19 @@ Tenga en cuenta que dalgunes páxines puen siguir apaeciendo como si inda tuvier
 'welcomecreation-msg' => "Creóse la to cuenta.
 Nun t'escaezas de camudar les tos [[Special:Preferences|preferencies de {{SITENAME}}]].",
 'yourname' => "Nome d'usuariu:",
+'userlogin-yourname' => "Nome d'usuariu",
+'userlogin-yourname-ph' => "Escriba'l so nome d'usuariu",
+'createacct-another-username-ph' => "Escriba'l nome d'usuariu",
 'yourpassword' => 'Contraseña:',
+'userlogin-yourpassword' => 'Contraseña',
+'userlogin-yourpassword-ph' => 'Escriba la so contraseña',
+'createacct-yourpassword-ph' => 'Escriba una contraseña',
 'yourpasswordagain' => 'Escribi otra vuelta la contraseña:',
+'createacct-yourpasswordagain' => 'Confirmar la contraseña',
+'createacct-yourpasswordagain-ph' => 'Escriba nuevamente la contraseña',
 'remembermypassword' => "Recordar la mio identificación nesti restolador (un máximu {{PLURAL:$1|d'un día|de $1 díes}})",
-'securelogin-stick-https' => "Siguir coneutáu con HTTPS dempués d'aniciar sesión",
+'userlogin-remembermypassword' => 'Caltener abierta la sesión',
+'userlogin-signwithsecure' => 'Usar una conexón segura',
 'yourdomainname' => 'El to dominiu:',
 'password-change-forbidden' => 'Nun se pueden camudar les contraseñes nesta wiki.',
 'externaldberror' => "O hebo un fallu d'autenticación de la base de datos o nun tienes permisu p'anovar la to cuenta esterna.",
@@ -491,18 +514,44 @@ Nun t'escaezas de camudar les tos [[Special:Preferences|preferencies de {{SITENA
 'logout' => 'Salir',
 'userlogout' => 'Salir',
 'notloggedin' => 'Nun anició sesión',
+'userlogin-noaccount' => '¿Nun tien una cuenta?',
+'userlogin-joinproject' => 'Xunise a {{SITENAME}}',
 'nologin' => '¿Nun tienes una cuenta? $1.',
 'nologinlink' => 'Crear una cuenta',
 'createaccount' => 'Crear una cuenta',
 'gotaccount' => '¿Yá tienes una cuenta? $1.',
 'gotaccountlink' => 'Entrar',
 'userlogin-resetlink' => "¿Escaeció los datos d'accesu?",
+'userlogin-resetpassword-link' => 'Reaniciar la contraseña',
+'helplogin-url' => 'Help:Aniciar sesión',
+'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Ayuda p'aniciar sesión]]",
+'userlogin-loggedin' => "Yá anició sesión como {{GENDER:$1|$1}}.
+Utilice'l formulariu de más abaxo p'aniciar sesión como otru usuariu.",
+'userlogin-createanother' => 'Crear otra cuenta',
+'createacct-join' => 'Escriba abaxo la so información.',
+'createacct-another-join' => 'Escriba abaxo la información de la cuenta nueva.',
+'createacct-emailrequired' => 'Direición de corréu electrónicu',
+'createacct-emailoptional' => 'Direición de corréu electrónicu (opcional)',
+'createacct-email-ph' => 'Escriba la so direición de corréu electrónicu',
+'createacct-another-email-ph' => 'Escriba la direición de corréu electrónicu',
 'createaccountmail' => 'Usar una contraseña al debalu temporal y unviala a la direición de corréu electrónicu conseñada',
+'createacct-realname' => 'Nome real (opcional)',
 'createaccountreason' => 'Motivu:',
+'createacct-reason' => 'Motivu',
+'createacct-reason-ph' => 'Por qué quier crear otra cuenta',
+'createacct-captcha' => 'Comprobación de seguridá',
+'createacct-imgcaptcha-ph' => "Escriba'l testu qu'apaez arriba",
+'createacct-submit' => 'Crear la cuenta',
+'createacct-another-submit' => 'Crear otra cuenta',
+'createacct-benefit-heading' => '{{SITENAME}} failu xente como vusté.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edición|ediciones}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|páxina|páxines}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|collaborador|collaboradores}} de recién',
 'badretype' => "Les contraseñes qu'escribisti nun concuayen.",
 'userexists' => "El nome d'usuariu conseñáu yá ta usándose.
 Por favor escueyi un nome diferente.",
 'loginerror' => "Error d'aniciu de sesión",
+'createacct-error' => 'Error de creación de cuenta',
 'createaccounterror' => 'Nun se pudo crear la cuenta: $1',
 'nocookiesnew' => "La cuenta d'usuariu ta creada, pero nun anició sesión.
 {{SITENAME}} usa «cookies» pa identificar a los usuarios.
@@ -571,10 +620,12 @@ Agora tendríes d'aniciar sesión y camudar la contraseña.
 Pues escaecer esti mensaxe si esta cuenta creóse por error.",
 'usernamehasherror' => "El nome d'usuariu nun pue contener caráuteres «hash»",
 'login-throttled' => "Ficisti demasiaos intentos d'aniciu de sesión recientes.
-Por favor, espera enantes d'intentalo otra vuelta.",
+Por favor espera $1 enantes d'intentalo otra vuelta.",
 'login-abort-generic' => 'Falló la identificación - Encaboxao',
 'loginlanguagelabel' => 'Llingua: $1',
 'suspicious-userlogout' => "La to solicitú de zarrar sesión refugose porque paez qu'unvióla un restolador frañíu o un proxy de caché.",
+'createacct-another-realname-tip' => "El nome real ye opcional.
+Si decide conseñalu, va usase p'atribuir el trabayu al usuariu.",
 
 # Email sending
 'php-mail-error-unknown' => 'Fallu desconocíu na función mail() de PHP.',
@@ -591,8 +642,7 @@ P'acabar d'aniciar sesión, tienes de configurar equí una contraseña nueva:",
 'newpassword' => 'Contraseña nueva:',
 'retypenew' => 'Vuelvi a escribir la contraseña nueva:',
 'resetpass_submit' => 'Configurar la contraseña y aniciar sesión',
-'resetpass_success' => '¡La contraseña camudó correutamente!
-Aniciando sesión agora...',
+'changepassword-success' => '¡Camudóse la contraseña correutamente!',
 'resetpass_forbidden' => 'Nun puen camudase les contraseñes',
 'resetpass-no-info' => "Tienes d'aniciar sesión pa entrar direutamente a esta páxina.",
 'resetpass-submit-loggedin' => 'Camudar la contraseña',
@@ -604,10 +654,11 @@ Seique yá camudaras correutamente la contraseña o que pidieras una nueva contr
 
 # Special:PasswordReset
 'passwordreset' => 'Reaniciar contraseña',
-'passwordreset-text' => 'Complete esti formulariu pa reaniciar la contraseña.',
+'passwordreset-text-one' => 'Complete esti formulariu pa reaniciar la contraseña.',
+'passwordreset-text-many' => '{{PLURAL:$1|Rellene unu de los campos pa reaniciar la contraseña.}}',
 'passwordreset-legend' => 'Reaniciar contraseña',
 'passwordreset-disabled' => 'Los reanicios de contraseña tán desactivaos nesta wiki.',
-'passwordreset-pretext' => "{{PLURAL:$1||Escribi unu de los elementos de los datos d'abaxo}}",
+'passwordreset-emaildisabled' => 'Les funciones de corréu electrónicu tan desactivaes nesta wiki.',
 'passwordreset-username' => "Nome d'usuariu:",
 'passwordreset-domain' => 'Dominiu:',
 'passwordreset-capture' => '¿Ver el corréu electrónicu resultante?',
@@ -634,7 +685,7 @@ Tendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solici
 Contraseña temporal: $2",
 'passwordreset-emailsent' => 'Unvióse un corréu electrónicu pa reaniciar la contraseña.',
 'passwordreset-emailsent-capture' => "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo.",
-'passwordreset-emailerror-capture' => "Xeneróse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu al usuariu: $1",
+'passwordreset-emailerror-capture' => "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu {{GENDER:$2|al usuariu|a la usuaria}}: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Camudar la direición de corréu electrónicu',
@@ -648,6 +699,19 @@ Contraseña temporal: $2",
 'changeemail-submit' => 'Camudar el corréu electrónicu',
 'changeemail-cancel' => 'Encaboxar',
 
+# Special:ResetTokens
+'resettokens' => 'Reaniciar los pases',
+'resettokens-text' => "Equí pue reaniciar los pases que permiten l'accesu a ciertos datos privaos asociaos cola so cuenta.
+
+Tendría de facelo si los compartió con alguién de mou accidental o si la so cuenta quedó comprometida.",
+'resettokens-no-tokens' => 'Nun hai dengún pase que reaniciar.',
+'resettokens-legend' => 'Reaniciar los pases',
+'resettokens-tokens' => 'Pases:',
+'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => 'Pase pa la canal de noticies web (Atom/RSS) de los [[Special:Watchlist|cambios en páxines de la llista de vixilancia]]',
+'resettokens-done' => 'Reaniciaronse los pases.',
+'resettokens-resetbutton' => 'Reaniciar los pases seleicionaos',
+
 # Edit page toolbar
 'bold_sample' => 'Testu en negrina',
 'bold_tip' => 'Testu en negrina',
@@ -851,12 +915,15 @@ Nun dio esplicación.',
 Paez que se desanició.',
 'edit-conflict' => "Conflictu d'edición.",
 'edit-no-change' => "S'inoró la to edición, porque nun se fizo nengún cambéu nel testu.",
+'postedit-confirmation' => 'Guardose la edición.',
 'edit-already-exists' => 'Nun pudo crease una páxina nueva.
 Esta yá esiste.',
 'defaultmessagetext' => 'Testu predetermináu',
 'content-failed-to-parse' => 'Fallu al analizar el conteníu $2 pal modelu $1: $3',
 'invalid-content-data' => 'Datos del conteníu inválidos',
 'content-not-allowed-here' => 'El conteníu «$1» nun se permite na páxina [[$2]]',
+'editwarning-warning' => 'Salir d\'esta páxina pue causar la perda de cualesquier cambiu fechu.
+Si aniciasti sesión, pue desactivase esti avisu na seición "Edición" de les tos preferencies.',
 
 # Content models
 'content-model-wikitext' => 'testu wiki',
@@ -892,6 +959,7 @@ Por favor comprueba la comparanza d'abaxo pa confirmar que ye eso lo que quies f
 'undo-failure' => "Nun pudo esfacese la edición por aciu d'ediciones intermedies conflictives.",
 'undo-norev' => 'Nun se pudo esfacer la edición porque nun esiste o se desanició.',
 'undo-summary' => 'Esfacer la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]])',
+'undo-summary-username-hidden' => "Desfacer la revisión $1 d'un usuariu tapecíu",
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Nun pue crease la cuenta',
@@ -1071,6 +1139,7 @@ Asegúrate de qu'esti cambéu caltenga la continuidá del históricu de la páxi
 'compareselectedversions' => 'Comparar les revisiones seleicionaes',
 'showhideselectedversions' => 'Amosar/anubrir les versiones seleicionaes',
 'editundo' => 'desfacer',
+'diff-empty' => '(Nun hai diferencies)',
 'diff-multi' => "({{PLURAL:$1|Nun s'amuesa 1 revisión intermedia|Nun s'amuesen $1 revisiones intermedies}} {{PLURAL:$2|d'un usuariu|de $2 usuarios}} )",
 'diff-multi-manyusers' => "({{PLURAL:$1|Nun s'amuesa una revisión intermedia|Nun s'amuesen $1 revisiones intermedies}} de más de $2 {{PLURAL:$2|usuariu|usuarios}})",
 'difference-missing-revision' => "{{PLURAL:$2|Nun s'alcontró|Nun s'alcontraron}} {{PLURAL:$2|una revisión|$2 revisiones}} d'esta diferencia ($1).
@@ -1098,7 +1167,6 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'searchmenu-legend' => 'Opciones de busca',
 'searchmenu-exists' => "'''Hai una páxina nomada \"[[\$1]]\" nesta wiki'''",
 'searchmenu-new' => "'''¡Crear la páxina \"[[:\$1]]\" nesta wiki!'''",
-'searchhelp-url' => 'Help:Conteníos',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Restolar páxines con esti prefixu]]',
 'searchprofile-articles' => 'Páxines de conteníu',
 'searchprofile-project' => 'Páxines de proyeutu y ayuda',
@@ -1139,15 +1207,7 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'powersearch-togglenone' => 'Dengún',
 'search-external' => 'Busca esterna',
 'searchdisabled' => "La busca en {{SITENAME}} ta desactivada. Mentanto, pues buscar en Google. Has fixate en que'l conteníu de los sos índices de {{SITENAME}} pue tar desfasáu.",
-
-# Quickbar
-'qbsettings' => 'Barra rápida',
-'qbsettings-none' => 'Nenguna',
-'qbsettings-fixedleft' => 'Fixa a manzorga',
-'qbsettings-fixedright' => 'Fixa a mandrecha',
-'qbsettings-floatingleft' => 'Flotante a manzorga',
-'qbsettings-floatingright' => 'Flotante a mandrecha',
-'qbsettings-directionality' => "Fixa, según la direición d'escritura de la to llingua",
+'search-error' => 'Hebo un error al buscar: $1',
 
 # Preferences page
 'preferences' => 'Preferencies',
@@ -1181,7 +1241,6 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'resetprefs' => 'Llimpiar los cambios ensin guardar',
 'restoreprefs' => 'Restaurar tolos axustes predeterminaos (en toles seiciones)',
 'prefs-editing' => 'Edición',
-'prefs-edit-boxsize' => "Tamañu de la ventana d'edición.",
 'rows' => 'Fileres:',
 'columns' => 'Columnes:',
 'searchresultshead' => 'Buscar',
@@ -1192,9 +1251,9 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'recentchangesdays-max' => '(máximo $1 {{PLURAL:$1|día|díes}})',
 'recentchangescount' => "Númberu d'ediciones p'amosar de mou predetermináu:",
 'prefs-help-recentchangescount' => 'Incluye los cambios recientes, los historiales de páxines y los rexistros.',
-'prefs-help-watchlist-token' => "Rellenando esti campu con una clave secreta se xenerará una canal RSS pa la to llista de vixilancia.
-Quien sepa la clave d'esti campu podrá lleer la to llista de vixilancia, poro, escueyi un valor seguru.
-Equí tienes un valor al debalu que pues usar: $1",
+'prefs-help-watchlist-token2' => 'Esta ye la clave secreta pa la canal de noticies web de la so llista de vixilancia.
+Cualquiera que la sepa podrá lleer la so llista de vixilancia; nun la comparta.
+[[Special:ResetTokens|Calque equí si necesita reaniciala]].',
 'savedprefs' => 'Les tos preferencies quedaron grabaes.',
 'timezonelegend' => 'Estaya horaria:',
 'localtime' => 'Hora llocal:',
@@ -1225,7 +1284,6 @@ Equí tienes un valor al debalu que pues usar: $1",
 'prefs-reset-intro' => 'Pues usar esta páxina pa reaniciar les preferencies a los valores predeterminaos del sitiu.
 Esto nun se pue desfacer.',
 'prefs-emailconfirm-label' => 'Confirmación del corréu:',
-'prefs-textboxsize' => "Tamañu de la ventana d'edición",
 'youremail' => 'Corréu electrónicu:',
 'username' => "Nome d'{{GENDER:$1|usuariu|usuaria}}:",
 'uid' => 'ID {{GENDER:$1|del usuariu|de la usuaria}}:',
@@ -1257,6 +1315,8 @@ Esta información sedrá pública.',
 'prefs-dateformat' => 'Formatu de data',
 'prefs-timeoffset' => 'Diferencia horaria',
 'prefs-advancedediting' => 'Opciones xenerales',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Vista previa',
 'prefs-advancedrc' => 'Opciones avanzaes',
 'prefs-advancedrendering' => 'Opciones avanzaes',
 'prefs-advancedsearchoptions' => 'Opciones avanzaes',
@@ -1264,7 +1324,9 @@ Esta información sedrá pública.',
 'prefs-displayrc' => 'Opciones de vista',
 'prefs-displaysearchoptions' => 'Opciones de vista',
 'prefs-displaywatchlist' => 'Opciones de vista',
+'prefs-tokenwatchlist' => 'Pase',
 'prefs-diffs' => 'Diferencies',
+'prefs-help-prefershttps' => 'Esta preferencia aplicaráse nel siguiente aniciu de sesión.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'La direición de corréu paez válida',
@@ -1291,6 +1353,8 @@ Esta información sedrá pública.',
 'userrights-notallowed' => "Nun tien autorización p'amestar o desaniciar permisos d'usuariu.",
 'userrights-changeable-col' => 'Grupos que pues camudar',
 'userrights-unchangeable-col' => 'Grupos que nun pues camudar',
+'userrights-conflict' => "¡Conflictu de cambiu de permisos d'usuariu! Por favor, revise y confirme los cambios.",
+'userrights-removed-self' => 'Retiró correutamente los sos propios drechos. Poro, yá nun tendrá accesu a esta páxina.',
 
 # Groups
 'group' => 'Grupu:',
@@ -1356,11 +1420,19 @@ Esta información sedrá pública.',
 'right-proxyunbannable' => 'Saltar los bloqueos automáticos de los proxys',
 'right-unblockself' => 'Desbloquiase ún mesmu',
 'right-protect' => 'Camudar los niveles de proteición y editar páxines protexíes en cascada',
-'right-editprotected' => 'Editar páxines protexíes (ensin proteición en cascada)',
+'right-editprotected' => 'Editar les páxines protexíes como "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Editar les páxines protexíes como "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => "Editar la interfaz d'usuariu",
 'right-editusercssjs' => "Editar los archivos CSS y JS d'otros usuarios",
 'right-editusercss' => "Editar los archivos CSS d'otros usuarios",
 'right-edituserjs' => "Editar los archivos JS d'otros usuarios",
+'right-editmyusercss' => "Editar los propios ficheros CSS d'usuariu",
+'right-editmyuserjs' => "Editar los propios ficheros JavaScript d'usuariu",
+'right-viewmywatchlist' => 'Ver la llista de vixilancia propia',
+'right-editmywatchlist' => 'Editar la llista de vixilancia propia. Tenga en cuenta que dalgunes aiciones amestarán páxines igual, inda ensin esti permisu.',
+'right-viewmyprivateinfo' => 'Ver los datos privaos propios (p. ex. direición de corréu, nome real)',
+'right-editmyprivateinfo' => 'Editar los datos privaos propios (p. ex. direición de corréu, nome real)',
+'right-editmyoptions' => 'Editar les preferencies propies',
 'right-rollback' => "Revertir rápido a un usuariu qu'editó una páxina determinada",
 'right-markbotedits' => 'Marcar les ediciones revertíes como ediciones de bot',
 'right-noratelimit' => 'Nun tar afeutáu polos llímites de tasa',
@@ -1422,12 +1494,19 @@ Esta información sedrá pública.',
 'action-userrights-interwiki' => "editar los drechos d'usuariu d'usuarios d'otres wikis",
 'action-siteadmin' => 'candar o descandar la base de datos',
 'action-sendemail' => 'unviar correos',
+'action-editmywatchlist' => 'editar la llista de vixilancia',
+'action-viewmywatchlist' => 'ver la llista de vixilancia propia',
+'action-viewmyprivateinfo' => 'ver la so información privada',
+'action-editmyprivateinfo' => 'editar la so información privada',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|un cambiu|$1 cambios}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|dende la última visita}}',
+'enhancedrc-history' => 'historial',
 'recentchanges' => 'Cambios recientes',
 'recentchanges-legend' => 'Opciones de cambios recientes',
 'recentchanges-summary' => 'Sigui los cambios más recientes na wiki nesta páxina.',
+'recentchanges-noresult' => 'Nengún cambiu nel periodu conseñáu coincide con esos criterios.',
 'recentchanges-feed-description' => 'Sigui nesta canal los últimos cambios de la wiki.',
 'recentchanges-label-newpage' => 'Esta edición creó una páxina nueva',
 'recentchanges-label-minor' => 'Esta ye una edición menor',
@@ -1464,7 +1543,6 @@ Esta información sedrá pública.',
 'recentchangeslinked-feed' => 'Cambios rellacionaos',
 'recentchangeslinked-toolbox' => 'Cambios rellacionaos',
 'recentchangeslinked-title' => 'Cambios rellacionaos con "$1"',
-'recentchangeslinked-noresult' => 'Nun hebo cambios nes páxines enllaciaes nel periodu conseñáu.',
 'recentchangeslinked-summary' => "Esta ye una llista de los caberos cambios fechos nes páxines enllaciaes dende una páxina determinada (o nos miembros d'una categoría determinada). Les páxines de [[Special:Watchlist|la to llista de vixilancia]] tán en '''negrina'''.",
 'recentchangeslinked-page' => 'Nome de la páxina:',
 'recentchangeslinked-to' => "Amosar los cambios de les páxines qu'enllacen en cuenta de los de la páxina dada",
@@ -1475,7 +1553,7 @@ Esta información sedrá pública.',
 'reuploaddesc' => 'Cancelar la xubida y tornar al formulariu de xubíes',
 'upload-tryagain' => 'Unviar descripción camudada del ficheru',
 'uploadnologin' => 'Nun anició sesión',
-'uploadnologintext' => "Tien d'[[Special:UserLogin|aniciar sesión]] pa xubir ficheros.",
+'uploadnologintext' => "Tien d'$1 pa xubir ficheros.",
 'upload_directory_missing' => 'El direutoriu de xubida ($1) nun esiste y nun pudo ser creáu pol sirvidor de web.',
 'upload_directory_read_only' => "El sirvidor nun pue modificar el direutoriu de xubida d'archivos ($1).",
 'uploaderror' => 'Error de xubida',
@@ -1713,7 +1791,6 @@ Pa una meyor seguridá, img_auth.php ta desactiváu.",
 'http-read-error' => 'Error de llectura HTTP.',
 'http-timed-out' => "La llamada HTTP escosó'l tiempu.",
 'http-curl-error' => 'Error al baxar la URL: $1',
-'http-host-unreachable' => 'Nun se pudo acceder a la URL.',
 'http-bad-status' => 'Hebo un problema demientres la llamada HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1741,6 +1818,10 @@ Pa una meyor seguridá, img_auth.php ta desactiváu.",
 'listfiles_size' => 'Tamañu',
 'listfiles_description' => 'Descripción',
 'listfiles_count' => 'Versiones',
+'listfiles-show-all' => 'Incluir les versiones antigües de les imaxes',
+'listfiles-latestversion' => 'Versión actual',
+'listfiles-latestversion-yes' => 'Sí',
+'listfiles-latestversion-no' => 'Non',
 
 # File description page
 'file-anchor-link' => 'Ficheru',
@@ -1837,6 +1918,13 @@ Alcuérdate de comprobar otros enllaces a les plantíes enantes d'esborrales.",
 'randompage' => 'Páxina al debalu',
 'randompage-nopages' => 'Nun hai páxines {{PLURAL:$2|nel espaciu|nos espacios}} de nomes darréu: "$1".',
 
+# Random page in category
+'randomincategory' => 'Páxina al debalu de la categoría',
+'randomincategory-invalidcategory' => '"$1" nun ye un nome de categoría válidu.',
+'randomincategory-nopages' => 'Nun hai páxines en [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Ver una páxina al debalu de la categoría: $1. $2',
+'randomincategory-selectcategory-submit' => 'Dir',
+
 # Random redirect
 'randomredirect' => 'Redireición al debalu',
 'randomredirect-nopages' => 'Nun hai redireiciones nel espaciu de nomes "$1".',
@@ -1862,16 +1950,13 @@ Alcuérdate de comprobar otros enllaces a les plantíes enantes d'esborrales.",
 'statistics-users-active-desc' => 'Usuarios que realizaron una aición {{PLURAL:$1|nel caberu día|nos caberos $1 díes}}',
 'statistics-mostpopular' => 'Páxines más vistes',
 
-'disambiguations' => "Páxines qu'enllacen con páxines de dixebra",
-'disambiguationspage' => 'Template:dixebra',
-'disambiguations-text' => "Les siguientes páxines contienen polo menos un enllaz a una '''páxina de dixebra'''. En cuenta d'ello habríen enllaciar a una páxina más apropiada.<br />
-Una páxina tratase como una páxina de dixebra si usa una plantía que tea enllaciada dende [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop' => 'Páxines con una propiedá de páxina',
 'pageswithprop-legend' => 'Páxines con una propiedá de páxina',
 'pageswithprop-text' => "Esta páxina llista les páxines qu'usen una propiedá de páxina determinada.",
 'pageswithprop-prop' => 'Nome de la propiedá:',
 'pageswithprop-submit' => 'Dir',
+'pageswithprop-prophidden-long' => 'valor de propiedá de testu llargu tapecíu ($1)',
+'pageswithprop-prophidden-binary' => 'valor de propiedá binaria tapecíu ($1)',
 
 'doubleredirects' => 'Redireiciones dobles',
 'doubleredirectstext' => 'Esta páxina llista páxines que redireicionen a otres páxines de redireición.
@@ -1929,6 +2014,7 @@ Les entraes <del>tachaes</del> tan resueltes.',
 'mostrevisions' => 'Páxines con más revisiones',
 'prefixindex' => 'Toles páxines col prefixu',
 'prefixindex-namespace' => 'Toles páxines col prefixu (espaciu de nomes $1)',
+'prefixindex-strip' => 'Cortar el prefixu na llista',
 'shortpages' => 'Páxines curties',
 'longpages' => 'Páxines llargues',
 'deadendpages' => 'Páxines ensin salida',
@@ -1944,6 +2030,7 @@ Les entraes <del>tachaes</del> tan resueltes.',
 'listusers' => "Llista d'usuarios",
 'listusers-editsonly' => 'Amosar namái usuarios con ediciones',
 'listusers-creationsort' => 'Ordenar por data de creación',
+'listusers-desc' => "Ordenar n'orde descendente",
 'usereditcount' => '$1 {{PLURAL:$1|edición|ediciones}}',
 'usercreated' => "{{GENDER:$3|Creáu el|Creada'l}} $1 a les $2",
 'newpages' => 'Páxines nueves',
@@ -2120,10 +2207,9 @@ Los futuro cambeos nesta páxina y na so páxina d\'alderique asociada apaecerá
 'unwatchthispage' => 'Dexar de vixilar',
 'notanarticle' => 'Nun ye un artículu',
 'notvisiblerev' => 'Esborróse la revisión',
-'watchnochange' => 'Nenguna de les tos páxines vixilaes foi editada nel periodu escoyíu.',
 'watchlist-details' => "{{PLURAL:$1|$1 páxina|$1 páxines}} na to llista de vixilancia ensin cuntar les páxines d'alderique.",
-'wlheader-enotif' => '* La notificación per corréu electrónicu ta activada.',
-'wlheader-showupdated' => "* Les páxines camudaes dende la to última visita amuésense en '''negrina'''",
+'wlheader-enotif' => 'La notificación per corréu electrónicu ta activada.',
+'wlheader-showupdated' => "Les páxines que camudaron dende que les visitasti anteriormente amuesense en '''negrina'''",
 'watchmethod-recent' => 'comprobando páxines vixilaes nos cambios recientes',
 'watchmethod-list' => 'comprobando ediciones recientes nes páxines vixilaes',
 'watchlistcontains' => 'La to llista de vixilancia tien $1 {{PLURAL:$1|páxina|páxines}}.',
@@ -2374,7 +2460,7 @@ $1",
 'contributions' => 'Collaboraciones {{GENDER:$1|del usuariu|de la usuaria}}',
 'contributions-title' => "Contribuciones d'usuariu pa $1",
 'mycontris' => 'Collaboraciones',
-'contribsub2' => 'Pa $1 ($2)',
+'contribsub2' => 'Pa {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "Nun s'atoparon cambeos que coincidan con esi criteriu.",
 'uctop' => '(actual)',
 'month' => "Dende'l mes (y anteriores):",
@@ -2530,13 +2616,11 @@ Pa ver los bloqueos qu'hai agora mesmo, mira na [[Special:BlockList|llista de bl
 'ipb_blocked_as_range' => 'Error: La IP $1 nun ta bloquiada direutamente, polo que nun pue ser desloquiada. Sicasí, foi bloquiada como parte del intervalu $2, que pue ser desbloquiáu.',
 'ip_range_invalid' => 'Rangu IP non válidu.',
 'ip_range_toolarge' => 'Nun se permiten bloqueos mayores de /$1.',
-'blockme' => 'Blóquiame',
 'proxyblocker' => 'Bloquiador de proxys',
-'proxyblocker-disabled' => 'Esta función ta desactivada.',
 'proxyblockreason' => "La to direición IP foi bloquiada porque ye un proxy abiertu. Por favor contauta col to proveedor de serviciones d'Internet o col to servicio d'asistencia téunica y infórmalos d'esti seriu problema de seguridá.",
-'proxyblocksuccess' => 'Fecho.',
 'sorbsreason' => 'La to direición IP sal na llista de proxys abiertos en DNSBL usada por {{SITENAME}}.',
 'sorbs_create_account_reason' => 'La to direición IP sal na llista de proxys abiertos en DNSBL usada por {{SITENAME}}. Nun pues crear una cuenta',
+'xffblockreason' => "Una direición IP presente na testera X-Forwarded-For, o suya o d'un sirvidor proxy que ta usando, ta bloquiada. El motivu orixinal del bloquéu foi: $1",
 'cant-block-while-blocked' => 'Nun pues bloquiar a otros usuarios mentes tu teas bloquiáu.',
 'cant-see-hidden-user' => "L'usuariu que tentes bloquiar yá ta bloquiáu y anubríu.
 Como nun tienes permisos p'anubrir usuarios, nun pues ver o editar el bloquéu del usuariu.",
@@ -2700,6 +2784,8 @@ Por favor visita [//www.mediawiki.org/wiki/Localisation Llocalización de MediaW
 'thumbnail-more' => 'Agrandar',
 'filemissing' => 'Falta archivu',
 'thumbnail_error' => 'Error al crear la miniatura: $1',
+'thumbnail_error_remote' => "Mensaxe d'error de $1:
+$2",
 'djvu_page_error' => 'Páxina DjVu fuera de llímites',
 'djvu_no_xml' => 'Nun se pudo obtener el XML pal archivu DjVu',
 'thumbnail-temp-create' => 'Nun se pudo crear el ficheru temporal de miniatura',
@@ -2849,17 +2935,11 @@ Pues ver el so códigu fonte.',
 
 # Stylesheets
 'common.css' => "/* Los CSS allugaos equí s'aplicarán a tolos aspeutos */",
-'standard.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Standard */',
-'nostalgia.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Nostalgia */',
 'cologneblue.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Cologne Blue */',
 'monobook.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Monobook */',
-'myskin.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu MySkin */',
-'chick.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Chick */',
-'simple.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Simple */',
 'modern.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Modern */',
 'vector.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Vector */',
 'print.css' => '/* Los CSS allugaos equí afeutarán a la salida pola imprentadora */',
-'handheld.css' => '/* Los CSS allugaos equí afeutarán a los preseos portátiles basaos nel aspeutu configuráu en $wgHandheldStyle */',
 'noscript.css' => '/* Los CSS allugaos equí afeutarán a los usuarios col JavaScript desactiváu */',
 'group-autoconfirmed.css' => '/* Los CSS allugaos equí afeutarán a los usuarios autoconfirmaos namái */',
 'group-bot.css' => '/* Los CSS allugaos equí afeutarán a los bots namái */',
@@ -2868,13 +2948,8 @@ Pues ver el so códigu fonte.',
 
 # Scripts
 'common.js' => '/* Cualesquier JavaScript que tea equí se cargará pa tolos usuarios en cada carga de páxina. */',
-'standard.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Standard */',
-'nostalgia.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Nostalgia */',
 'cologneblue.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Cologne Blue */',
 'monobook.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu MonoBook */',
-'myskin.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu MySkin */',
-'chick.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Chick */',
-'simple.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Simple */',
 'modern.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Modern */',
 'vector.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Vector */',
 'group-autoconfirmed.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios autoconfirmaos namái */',
@@ -2954,10 +3029,7 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
 'pageinfo-category-files' => 'Númberu de ficheros',
 
 # Skin names
-'skinname-standard' => 'Clásicu',
-'skinname-nostalgia' => 'Señardá',
 'skinname-cologneblue' => 'Azul Colonia',
-'skinname-myskin' => 'MySkin',
 'skinname-modern' => 'Modernu',
 
 # Patrolling
@@ -3035,11 +3107,25 @@ Al executalu pues comprometer el to sistema.",
 'minutes' => '{{PLURAL:$1|$1 minutu|$1 minutos}}',
 'hours' => '{{PLURAL:$1|$1 hora|$1 hores}}',
 'days' => '{{PLURAL:$1|$1 día|$1 díes}}',
+'weeks' => '{{PLURAL: $1|$1 selmana|$1 selmanes}}',
 'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
 'years' => '{{PLURAL:$1|$1 añu|$1 años}}',
 'ago' => 'hai $1',
 'just-now' => 'agora mesmo',
 
+# Human-readable timestamps
+'hours-ago' => 'hai $1 {{PLURAL:$1|hora|hores}}',
+'minutes-ago' => 'hai $1 {{PLURAL:$1|minutu|minutos}}',
+'seconds-ago' => 'hai $1 {{PLURAL:$1|segundu|segundos}}',
+'monday-at' => 'El llunes a les $1',
+'tuesday-at' => 'El martes a les $1',
+'wednesday-at' => 'El miércoles a les $1',
+'thursday-at' => 'El xueves a les $1',
+'friday-at' => 'El vienres a les $1',
+'saturday-at' => 'El sábadu a les $1',
+'sunday-at' => 'El domingu a les $1',
+'yesterday-at' => 'Ayeri a les $1',
+
 # Bad image list
 'bad_image_list' => "El formatu ye'l que sigue:
 
@@ -3069,7 +3155,7 @@ Los demás tarán anubríos de mou predetermináu.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Anchor',
 'exif-imagelength' => 'Altor',
 'exif-bitspersample' => 'Bits por componente',
@@ -3247,7 +3333,7 @@ Los demás tarán anubríos de mou predetermináu.
 'exif-originalimageheight' => 'Altor de la imaxe enantes de cortase',
 'exif-originalimagewidth' => 'Anchor de la imaxe enantes de cortase',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Non comprimida',
 'exif-compression-2' => 'CCITT Grupu 3 codificación Huffman RLE con Modificación 1-Dimensional',
 'exif-compression-3' => 'Codificación de fax CCITT Grupu 3',
@@ -3645,7 +3731,6 @@ Tamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
 'version-other' => 'Otros',
 'version-mediahandlers' => "Remanadores d'archivos multimedia",
 'version-hooks' => 'Hooks',
-'version-extension-functions' => "Funciones d'estensiones",
 'version-parser-extensiontags' => "Etiquetes d'estensiones d'análisis",
 'version-parser-function-hooks' => "Hooks de les funciones d'análisis sintáuticu",
 'version-hook-name' => 'Nome del hook',
@@ -3654,6 +3739,7 @@ Tamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
 'version-license' => 'Llicencia',
 'version-poweredby-credits' => "Esta wiki funciona con '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'otros',
+'version-poweredby-translators' => 'los traductores de translatewiki.net',
 'version-credits-summary' => 'Nos prestaría dar reconocimientu a les siguientes persones pola so contribución a [[Special:Version|MediaWiki]].',
 'version-license-info' => "MediaWiki ye software llibre; pue redistribuilu y/o camudalu baxo los términos de la Llicencia Pública Xeneral GNU tal como ta asoleyada pola Free Software Foundation; o la versión 2 de la Llicencia, o (como prefieras) cualesquier versión posterior.
 
@@ -3667,12 +3753,17 @@ Tendría d'haber recibío [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Llic
 'version-entrypoints-header-entrypoint' => "Puntu d'entrada",
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => "Ruta d'archivu",
-'filepath-page' => 'Ficheru:',
-'filepath-submit' => 'Dir',
-'filepath-summary' => "Esta páxina especial devuelve la ruta completa d'un archivu.
-Les imáxenes amuésense a resolución completa; les demás tribes d'archivu execútense direutamente col so programa asociáu.",
+# Special:Redirect
+'redirect' => "Redireición por nome de ficheru, o ID d'usuariu o de revisión",
+'redirect-legend' => 'Redirixir a un ficheru o una páxina',
+'redirect-summary' => "Esta páxina especial redirixe a un ficheru (dando'l nome), una páxina (dando una ID de revisión) o una páxina d'usuariu (dando una ID d'usuariu).",
+'redirect-submit' => 'Dir',
+'redirect-lookup' => 'Buscar:',
+'redirect-value' => 'Valor:',
+'redirect-user' => "ID d'usuariu:",
+'redirect-revision' => 'Revisión de páxina',
+'redirect-file' => 'Nome del ficheru',
+'redirect-not-exists' => "Nun s'alcontró'l valor",
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Buscar archivos duplicaos',
@@ -3722,12 +3813,16 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 'tags' => 'Etiquetes de cambiu válides',
 'tag-filter' => "Filtru d'[[Special:Tags|etiquetes]]:",
 'tag-filter-submit' => 'Peñera',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetes}}]]: $2)',
 'tags-title' => 'Etiquetes',
 'tags-intro' => "Esta páxina llista les etiquetes coles que'l software pue marcar una edición, y el so significáu.",
 'tags-tag' => "Nome d'etiqueta",
 'tags-display-header' => 'Aspeutu nes llistes de cambios',
 'tags-description-header' => 'Descripción completa del significáu',
+'tags-active-header' => '¿Activu?',
 'tags-hitcount-header' => 'Cambios etiquetaos',
+'tags-active-yes' => 'Sí',
+'tags-active-no' => 'Non',
 'tags-edit' => 'editar',
 'tags-hitcount' => '$1 {{PLURAL:$1|cambiu|cambios}}',
 
@@ -3748,6 +3843,7 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 'dberr-problems' => '¡Sentímoslo! Esti sitiu ta esperimentando dificultaes téuniques.',
 'dberr-again' => 'Tenta esperar dellos minutos y recargar.',
 'dberr-info' => '(Nun se pue contautar cola base de datos del sirvidor: $1)',
+'dberr-info-hidden' => '(Nun se pue comunicar col sirvidor de base de datos)',
 'dberr-usegoogle' => 'Pue probar a buscar con Google mentanto.',
 'dberr-outofdate' => 'Atalanta que los sos índices del nuesu conteníu seique nun tean actualizaos.',
 'dberr-cachederror' => 'Esta ye una copia na caché de la páxina que se pidiera, y pue que nun tea actualizada.',
@@ -3763,6 +3859,9 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 'htmlform-submit' => 'Unviar',
 'htmlform-reset' => 'Desfacer los cambios',
 'htmlform-selectorother-other' => 'Otros',
+'htmlform-no' => 'Non',
+'htmlform-yes' => 'Sí',
+'htmlform-chosen-placeholder' => 'Seleicione una opción',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con sofitu pa busca de testu completu',
@@ -3880,4 +3979,19 @@ D\'otra miente, pues usar el formulariu cenciellu d\'abaxo. El to comentariu apa
 # Image rotation
 'rotate-comment' => 'Imaxe xirada $1 {{PLURAL:$1|grau|graos}} en sentíu horariu',
 
+# Limit report
+'limitreport-title' => 'Datos de perfiláu del analizador:',
+'limitreport-cputime' => 'Usu de tiempu de CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL: $1|segundu|segundos}}',
+'limitreport-walltime' => 'Usu de tiempu real',
+'limitreport-walltime-value' => '$1 {{PLURAL: $1|segundu|segundos}}',
+'limitreport-ppvisitednodes' => 'Cuenta de noyos visitaos pol preprocesador',
+'limitreport-ppgeneratednodes' => 'Cuenta de noyos xeneraos pol preprocesador',
+'limitreport-postexpandincludesize' => "Tamañu d'inclusión de post-espansión",
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Tamañu del argumentu de plantía',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => "Máxima fondura d'espansión",
+'limitreport-expensivefunctioncount' => "Cuenta de funciones d'analís costoses",
+
 );
diff --git a/languages/messages/MessagesAvk.php b/languages/messages/MessagesAvk.php
index 8a0d281f..32591155 100644
--- a/languages/messages/MessagesAvk.php
+++ b/languages/messages/MessagesAvk.php
@@ -129,9 +129,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Va ota va rupes favesik nedir !',
 'tog-oldsig' => 'Tisa sugdara',
 'tog-fancysig' => 'Krafiara va sugdaks wetce wikitext (a mivaskafi gluyasiki)',
-'tog-externaleditor' => 'Favera va divefi betasiki (anton gan aptacik, moe vusiko va yona aptafa vertara olegar)',
-'tog-externaldiff' => 'Omavafa favera va divefa "diff" xeka (anton gan aptacik, moe vusiko va yona aptafa vertara olegar)',
-'tog-showjumplinks' => 'Tutegirara va "grablera" vansarafi gluyasiki',
 'tog-uselivepreview' => 'Favera va abdiwira (JavaScript) (bagalon)',
 'tog-forceeditsummary' => 'Zo walzé viele betaravildeks tir vlardaf !',
 'tog-watchlisthideown' => 'Palsera va jinaf suzdasikif betakseem',
@@ -303,7 +300,7 @@ $messages = array(
 'jumptonavigation' => 'exulera',
 'jumptosearch' => 'aneyara',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Icde {{SITENAME}}',
 'aboutpage' => 'Project:Icdeuca',
 'copyright' => 'Deraykan cek kare $1.',
@@ -313,7 +310,6 @@ $messages = array(
 'disclaimers' => 'Walzera',
 'disclaimerpage' => 'Project:Jadif walzereem',
 'edithelp' => 'Pomara',
-'edithelppage' => 'Help:Tokinde bubetat',
 'helppage' => 'Help:Pomara',
 'mainpage' => 'Emudexo',
 'mainpage-description' => 'Emudexo',
@@ -381,14 +377,6 @@ Vexala dem enafu aptafu bu tir rotrasina dene [[Special:SpecialPages|{{int:speci
 # General errors
 'error' => 'Rokla',
 'databaseerror' => 'Origakrokla',
-'dberrortext' => 'Vurarokla pu origak. Ironokafa kucilara suleyena gan origak tiyir :
-<blockquote><tt>$1</tt></blockquote>
-mal fliok « <tt>$2</tt> ».
-MySQL va « <tt>$3: $4</tt> » rokla al katacer.',
-'dberrortextcl' => 'Bibera va origak tir roklakirafa. Ironokafa stakseyena bibera tiyir:
-« $1 »
-skuyuna gan « $2 » fliok
-MySQL va « $3 : $4 » rokla al dimstakser.',
 'laggedslavemode' => 'Obral : bu va ironakaf tuenakseem rotir meruldar',
 'readonly' => 'Beta elekana nuskera va origak',
 'enterlockreason' => 'Va elekaradanda is uldinera va elekaracek bazel',
@@ -430,7 +418,6 @@ Erura : $2',
 'viewyourtext' => "Rowil va klita ke '''rinafa betara''' ise ko batu bu roksudal :",
 'protectedinterface' => 'Batu bu va walasikikrent ke talpeyot dafur nume ta djira va favejera zo ixatcar.',
 'editinginterface' => "'''Obral !''' Rin va bu favenu koe talpeyotwalasiki betal. Betara va batu bu va laviuca ke favesikafi walasiki dolge ar favesik vanolatar. Kalavason, va [//translatewiki.net/wiki/Main_Page?setlang=avk translatewiki.net], va MediaWiki abdumimaks va tulizukara, vay favel.",
-'sqlhidden' => '(SQL kucilara palsena)',
 'cascadeprotected' => 'Batu bu icde betara zo nendar, kire va vlevefu {{PLURAL:$1|bu|bu}} pasur, danu kan tegisa "stoyakorafa" rotisaca zo nendad : $2',
 'namespaceprotected' => "Va bu koe '''$1''' yoltxo me robetal !",
 'ns-specialprotected' => 'Aptafu bu tir merobetanu.',
@@ -523,7 +510,7 @@ Ta da wan zo pilkomodal, va warzaf remravlem batlize gobazel :",
 'newpassword' => 'Warzaf remravlem',
 'retypenew' => 'Va warzaf remravlem gruyel',
 'resetpass_submit' => 'Va beksa bazel nume zo dogluyatal !',
-'resetpass_success' => 'Rinaf remravlem kiewatcon su zo betar ! Nume rinafa dogluyara tir...',
+'changepassword-success' => 'Rinaf remravlem kiewatcon su zo betar ! Nume rinafa dogluyara tir...',
 'resetpass_forbidden' => 'Kona beksa tir merobetana',
 'resetpass-submit-loggedin' => 'Betara va remravlem',
 'resetpass-submit-cancel' => 'Kuidera',
@@ -823,7 +810,6 @@ Ta ropasusu warzafu bu yo va [[Special:Search|aneyara ko wiki]] yawal.',
 'viewprevnext' => 'Va ($1 {{int:pipe-separator}} $2) ik ($3) disukel.',
 'searchmenu-exists' => "'''Ixam bu yoltkirafu gu \"[[:\$1]]\" dene bati wiki.'''",
 'searchmenu-new' => "'''Redura va bu \"[[:\$1]]\" den bati wiki!'''",
-'searchhelp-url' => 'Help:Pomara',
 'searchprofile-articles' => 'Teliz',
 'searchprofile-project' => 'Pomarabu ik abdumimaksbu',
 'searchprofile-images' => 'Jonkanaca',
@@ -864,14 +850,6 @@ Kan ''all:'' laganeyal ta varafa exulera (gon keyaksexo is teza ikz-), oke wetce
 'search-external' => 'Divafa aneyara',
 'searchdisabled' => "<p>La fonction de recherche sur l'intégralité du texte a été temporairement désactivée à cause de la grande charge que cela impose au serveur. Nous espérons la rétablir prochainement lorsque nous disposerons d'un serveur plus puissant. En attendant, vous pouvez faire la recherche avec Google:</p>",
 
-# Quickbar
-'qbsettings' => 'Tuweltara va xekobla',
-'qbsettings-none' => 'Mek',
-'qbsettings-fixedleft' => 'Roneon titickanaf',
-'qbsettings-fixedright' => 'Talteon titickanaf',
-'qbsettings-floatingleft' => 'Roneon ezas',
-'qbsettings-floatingright' => 'Talteon ezas',
-
 # Preferences page
 'preferences' => 'Lodamaceem',
 'mypreferences' => 'Jinaf lodamaceem',
@@ -896,7 +874,6 @@ Kan ''all:'' laganeyal ta varafa exulera (gon keyaksexo is teza ikz-), oke wetce
 'saveprefs' => 'Va lodamaceem tuená',
 'resetprefs' => 'Va lodamceem dimplekú',
 'prefs-editing' => 'Sutelaxo',
-'prefs-edit-boxsize' => 'Lum ke betaradilk.',
 'rows' => 'Emacekeem',
 'columns' => 'Brizeem',
 'searchresultshead' => 'Nedira va aneyaratrasikseem',
@@ -1097,7 +1074,6 @@ Rinafe e-mail mane me zo razdar viele ar webesik uzerar.',
 'recentchangeslinked-feed' => 'Gluyasikisuzdara',
 'recentchangeslinked-toolbox' => 'Gluyasikisuzdara',
 'recentchangeslinked-title' => 'Betakseem skedas va "$1"',
-'recentchangeslinked-noresult' => 'Meka betara va gluyasikikirafu bu remi bata rekola.',
 'recentchangeslinked-summary' => "Batu aptafu bu va ironokaf betakseem va gluyasikikirafu bu vexalar.
 Bu koe [[Special:Watchlist|rinafi suzdasiki]] tid '''vastaakorafu'''.",
 'recentchangeslinked-page' => 'Buyolt :',
@@ -1288,9 +1264,6 @@ Abdi sulara, setikel da va ari skedasiki va teza stujel.',
 'statistics-users-active' => 'Tegiraf pakesikeem',
 'statistics-mostpopular' => 'Tel lorupen bueem',
 
-'disambiguations' => 'Bu dem milyoltaca yo',
-'disambiguationspage' => '{{ns:template}}:Milyoltaca',
-
 'doubleredirects' => 'Jontolafa graskara',
 'doubleredirectstext' => "<b>Attention:</b> cette liste peut contenir des « faux positifs ». Dans ce cas, c'est probablement la page du premier #REDIRECT contient aussi du texte.<br />Chaque ligne contient les liens à la 1re et 2e page de redirection, ainsi que la première ligne de cette dernière, qui donne normalement la « vraie » destination. Le premier #REDIRECT devrait lier vers cette destination.",
 'double-redirect-fixed-move' => 'arrundayan [[$1]], dure graskan kal [[$2]]',
@@ -1470,10 +1443,9 @@ Ta sulara va batu bu div rinafi suzdasiki, koe grablexo va « Mea suzdá » vule
 'unwatchthispage' => 'Va batu bu mea suzdá',
 'notanarticle' => 'Nedoy teliz',
 'notvisiblerev' => 'Betaks sulayan',
-'watchnochange' => 'Nedoyu rinafu suzdanu bu al zo betar bak bazena rekola',
 'watchlist-details' => '{{PLURAL:$1|$1 bu|$1 bu}} koe rinafi suzdasiki rade prilarabueem.',
-'wlheader-enotif' => '* Email walzera tir tegisa.',
-'wlheader-showupdated' => "* Bu betayanu vielu rin ironokon worayal tir '''sulatcalakorafu'''.",
+'wlheader-enotif' => 'Email walzera tir tegisa.',
+'wlheader-showupdated' => "Bu betayanu vielu rin ironokon worayal tir '''sulatcalakorafu'''.",
 'watchmethod-recent' => 'ageltara va noeltaf betakseem va suzdan bueem',
 'watchmethod-list' => 'ageltara va suzdan bueem icde noeltafa betara',
 'watchlistcontains' => 'Rinafi suzdasiki va $1 bu ruldar',
@@ -1744,11 +1716,8 @@ male abdion elekayane IP mane.',
 'ipb_expiry_invalid' => "temps d'expiration invalide.",
 'ipb_already_blocked' => '"$1" ixam tir elekan',
 'ip_range_invalid' => 'IP elega mewadafa.',
-'blockme' => 'Zo eleká !',
 'proxyblocker' => 'Elekasiki va proxy',
-'proxyblocker-disabled' => 'Bati fli tir metegirafi.',
 'proxyblockreason' => "Votre ip a été bloquée car c'est un proxy ouvert. Merci de contacter votre fournisseur d'accès internet ou votre support technique et de l'informer de ce problème de sécurité.",
-'proxyblocksuccess' => 'Tenuweyes.',
 'sorbsreason' => "Rinafe IP mane wetce fenkunafi 'proxy' koe DNSBL faveni gan {{SITENAME}} zo vexalar.",
 
 # Developer tools
@@ -2046,7 +2015,7 @@ Kotari milconyafi gluyasiki roklon zo krafiar.',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Mantuca',
 'exif-imagelength' => 'Ontinuca',
 'exif-compression' => 'Raxivaracave',
@@ -2121,7 +2090,7 @@ Kotari milconyafi gluyasiki roklon zo krafiar.',
 'exif-gpsdestdistance' => 'Kofa soluma',
 'exif-gpsdatestamp' => 'GPS evla',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Raxivariskafa',
 
 'exif-unknowndate' => 'Megrupena evla',
@@ -2340,7 +2309,6 @@ This confirmation code will expire at $4.',
 'version-variables' => 'Remvodeem',
 'version-other' => 'Ar',
 'version-hooks' => 'Demi se',
-'version-extension-functions' => 'Divatces fliok se',
 'version-parser-extensiontags' => 'Exulerafa divatcenafa tcala',
 'version-parser-function-hooks' => 'Exuleraflidemi',
 'version-hook-name' => 'Demiyolt',
@@ -2351,11 +2319,6 @@ This confirmation code will expire at $4.',
 'version-software-product' => 'Warzeks',
 'version-software-version' => 'Siatos',
 
-# Special:FilePath
-'filepath' => 'Iyeltakkelda',
-'filepath-page' => 'Iyeltak :',
-'filepath-submit' => 'Kelda',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Aneyara va jontolaf iyeltak',
 'fileduplicatesearch-legend' => 'Aneyara va jontolaca',
diff --git a/languages/messages/MessagesAy.php b/languages/messages/MessagesAy.php
index b5581498..119c65b4 100644
--- a/languages/messages/MessagesAy.php
+++ b/languages/messages/MessagesAy.php
@@ -127,6 +127,7 @@ $messages = array(
 'qbbrowse' => 'Wampuña',
 'qbedit' => 'Turkaña',
 'qbpageoptions' => 'Uñstawitaki ajllita',
+'qbpageinfo' => "Uñstawxat uñt'ayawi",
 'qbmyoptions' => 'Ajllitanakaja',
 
 'errorpagetitle' => 'Pantja',
diff --git a/languages/messages/MessagesAz.php b/languages/messages/MessagesAz.php
index b6bc6070..33ef132b 100644
--- a/languages/messages/MessagesAz.php
+++ b/languages/messages/MessagesAz.php
@@ -111,9 +111,6 @@ $messages = array(
 'tog-shownumberswatching' => 'İzləyən istifadəçilərin sayını göstər',
 'tog-oldsig' => 'Hazırkı imza:',
 'tog-fancysig' => 'Vikimətn şəklində imza (avtomatik keçid yaratmadan)',
-'tog-externaleditor' => 'Susmaya görə xarici müqayisə proqramlarından istifadə et',
-'tog-externaldiff' => 'Susmaya görə xarici müqayisə proqramlarından istifadə et',
-'tog-showjumplinks' => '"Keçid et:" linklərini aktivləşdir',
 'tog-uselivepreview' => 'Canlı sınaq baxışı xüsusiyyətindən istifadə et (JavaScript tələb edir, sınaq mərhələsindədir)',
 'tog-forceeditsummary' => 'Qısa məzmunu boş saxladıqda mənə bildir',
 'tog-watchlisthideown' => 'Mənim redaktələrimi izləmə siyahısında gizlət',
@@ -209,7 +206,7 @@ $messages = array(
 'noindex-category' => 'İndeksləşdirilməyən səhifələr',
 'broken-file-category' => 'İşləməyən fayl keçidləri olan səhifələr',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Haqqında',
 'article' => 'Mündəricat',
@@ -314,7 +311,7 @@ $1',
 'pool-queuefull' => 'Çıxarış səhifəsi doludur',
 'pool-errorunknown' => 'naməlum xəta',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} haqqında',
 'aboutpage' => 'Project:İzah',
 'copyright' => 'Bu məzmun $1 əhatəsindədir.',
@@ -324,7 +321,6 @@ $1',
 'disclaimers' => 'Məsuliyyətdən imtina',
 'disclaimerpage' => 'Project:Məsuliyyətdən imtina',
 'edithelp' => 'Redaktə kömək',
-'edithelppage' => 'Help:Redaktə',
 'helppage' => 'Help:Mündəricat',
 'mainpage' => 'Ana Səhifə',
 'mainpage-description' => 'Ana Səhifə',
@@ -351,7 +347,6 @@ Bax: [[Special:Version|Versiyalar]].',
 'newmessagesdifflink' => 'Sonuncu və əvvəlki versiya arasındakı fərq',
 'youhavenewmessagesmulti' => '"$1"da yeni mesajınız var.',
 'editsection' => 'redaktə',
-'editsection-brackets' => '[$1]',
 'editold' => 'redaktə',
 'viewsourceold' => 'başlanğıc kodu nəzərdən keçir',
 'editlink' => 'redaktə',
@@ -403,16 +398,6 @@ Mövcud xüsusi səhifələrin siyahısı: [[Special:SpecialPages|Xüsusi səhif
 # General errors
 'error' => 'Xəta',
 'databaseerror' => 'Verilənlər bazası xətası',
-'dberrortext' => 'Verilənlər bazası sorğusunda sintaksis xətası yarandı.
-Bu proqram təminatındakı xəta ilə əlaqədar ola bilər.
-Verilənlər bazasına sonuncu sorğu "<tt>$2</tt>" funksiyasından 
-yaranan <blockquote><tt>$1</tt></blockquote>.
-Verilənlər bazasının göstərdiyi xəta "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Verilənlər bazası sorğusunda sintaksis xətası yarandı.
-Verilənlər bazasına sonuncu sorğu:
-"$1"
-"$2" funksiyasından yaranmışdır.
-Verilənlər bazasının göstərdiyi xəta "$3: $4"',
 'laggedslavemode' => "'''Xəbərdarlıq:''' Səhifə son əlavələri əks etdirməyə bilər.",
 'readonly' => 'Verilənlər bazası bloklanıb',
 'enterlockreason' => 'Bloklamanın səbəbini və nəzərdə tutulan müddətini qeyd edin',
@@ -462,7 +447,6 @@ Sorğu: $2',
 'editinginterface' => "'''Diqqət!''' Siz proqram təminatı interfeysinin mətn olan səhifəsini redaktə edirsiniz.
 Onun dəyişdirilməsi digər istifadəçilərin interfeysinin xarici görünüşünə təsir göstərir.
 Tərcümə üçün daha yaxşı olar ki, MediaWiki-nin lokallaşması üçün olan [//translatewiki.net/wiki/Main_Page?setlang=az translatewiki.net]  layihəsindən istifadə edəsiniz.",
-'sqlhidden' => '(SQL gizli sorğu)',
 'cascadeprotected' => 'Səhifə mühafizə olunub, çünki o kaskad mühafizə olunan {{PLURAL:$1|növbəti səhifəyə|növbəti səhifələrə}} qoşulub:
 $2',
 'namespaceprotected' => 'Sizin adlarında $1 olan məqalələrdə redaktə etməyə icazəniz yoxdur.',
@@ -486,7 +470,6 @@ Siz {{SITENAME}} saytını anonim olaraq istifadə etməyə davam edə bilər v
 'yourpassword' => 'Parol:',
 'yourpasswordagain' => 'Parolu təkrar yazın:',
 'remembermypassword' => 'Məni bu kompyuterdə xatırla (maksimum $1 {{PLURAL:$1|gün|gün}})',
-'securelogin-stick-https' => 'Daxil olduqdan sonra HTTPS-lə əlaqədə qal',
 'yourdomainname' => 'Sizin domain',
 'password-change-forbidden' => 'Bu vikidə parolunuzu dəyişdirə bilməzsiniz.',
 'externaldberror' => 'Verilənlər bazasının doğruluğunu yoxlamada xəta baş verib və yaxud sizin xarici istifadəçi qeydiyyatını yeniləmək hüququnuz yoxdur.',
@@ -574,7 +557,7 @@ Sistemə daxil olmanı yekunlaşdırmaq üçün yeni parolu bura yazmalısınız
 'newpassword' => 'Yeni parol:',
 'retypenew' => 'Yeni parolu təkrar yazın:',
 'resetpass_submit' => 'Parol yaradın və sistemə daxil olun',
-'resetpass_success' => 'Parolunuz dəyişdirldi! Hazırda sistemə daxil olursunuz...',
+'changepassword-success' => 'Parolunuz dəyişdirldi! Hazırda sistemə daxil olursunuz...',
 'resetpass_forbidden' => 'Parolu dəyişmək mümkün deyil',
 'resetpass-no-info' => 'Bu səhifəni birbaşa açmaq üçün sistemə daxil olmalısınız.',
 'resetpass-submit-loggedin' => 'Parolu dəyiş',
@@ -585,10 +568,8 @@ Ola bilər siz parolu müvəffəqiyyətlə dəyişmisiniz yaxud müvəqqəti par
 
 # Special:PasswordReset
 'passwordreset' => 'Parolu yenilə',
-'passwordreset-text' => 'Akkauntunuz haqqında xatırlatmanı elektron poçt vasitəsilə ala bilməniz üçün bu formanı doldurun.',
 'passwordreset-legend' => 'Parolu yenilə',
 'passwordreset-disabled' => 'Yenidən qurulma parolu bu vikidə işləmir',
-'passwordreset-pretext' => '{{PLURAL:$1||Enter one of the pieces of data below}}',
 'passwordreset-username' => 'İstifadəçi adı:',
 'passwordreset-domain' => 'Domen:',
 'passwordreset-email' => 'E-mail ünvanı:',
@@ -733,6 +714,7 @@ Məlumat üçün aşağıda bu səhifənin tarixçəsindən müvafiq silmə qeyd
 Çox güman ki, səhifə silinmişdir.',
 'edit-conflict' => 'Düzəlişlər münaqişəsi',
 'edit-no-change' => 'Sizin redaktələr qeydə alınmamışdır. Belə ki, mətndə heç bir düzəliş edilməmişdir.',
+'postedit-confirmation' => 'Redaktəniz qeyd edildi.',
 'edit-already-exists' => 'Yeni səhifəni yaratmaq mümkün deyil.
 Belə ki, bu adda səhifə artıq mövcuddur.',
 
@@ -911,7 +893,6 @@ $1",
 'searchmenu-legend' => 'Axtarış kriteriyaları',
 'searchmenu-exists' => "'''Bu vikidə \"[[:\$1]]\" adında səhifə mövcuddur'''",
 'searchmenu-new' => "'''Bu vikidə \"[[:\$1]]\" səhifəsini yarat!'''",
-'searchhelp-url' => 'Help:Mündəricət',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bu cür prefiksli səhifələri göstər]]',
 'searchprofile-articles' => 'Məqalələr',
 'searchprofile-project' => 'Kömək və Layihə səhifələri',
@@ -952,14 +933,6 @@ $1",
 'powersearch-togglenone' => 'Heç biri',
 'search-external' => 'Xarici axtarış',
 
-# Quickbar
-'qbsettings' => 'Naviqasiya paneli',
-'qbsettings-none' => 'Heç biri',
-'qbsettings-fixedleft' => 'Sola sabitləndi',
-'qbsettings-fixedright' => 'Sağa sabitləndi',
-'qbsettings-floatingleft' => 'Sola əyilir',
-'qbsettings-floatingright' => 'Sağa əyilir',
-
 # Preferences page
 'preferences' => 'Nizamlamalar',
 'mypreferences' => 'Nizamlamalar',
@@ -991,7 +964,6 @@ $1",
 'resetprefs' => 'Yarat',
 'restoreprefs' => 'Bütün nizamlamaları bərpa et (bütün bölmələrdə)',
 'prefs-editing' => 'Redaktə',
-'prefs-edit-boxsize' => 'Redaktə pəncərəsinin həcmi',
 'rows' => 'Sıralar:',
 'columns' => 'Sütunlar:',
 'searchresultshead' => 'Axtar',
@@ -1002,9 +974,6 @@ $1",
 'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|gün|gün}}',
 'recentchangescount' => 'Son dəyişikliklərdə başlıq sayı:',
 'prefs-help-recentchangescount' => 'Buraya yeni dəyişikliklər, səhifələrin və jurnalların tarixçəsi daxildir.',
-'prefs-help-watchlist-token' => 'Bu sahəni gizli parolla doldurmağınız sizin izləmə siyahınız üçün RSS yayım kanalı yaradacaqdır.
-Bu parolu bilən hər kəs izləmə siyahınızı oxuya bilər, bu səbəbdən etibarlı parol seçin.
-Təsadüfi yolla seçilmiş bu paroldan istifadə edə bilərsiniz: $1',
 'savedprefs' => 'Seçiminiz qeyd edildi.',
 'timezonelegend' => 'Vaxt zonası:',
 'localtime' => 'Yerli vaxt:',
@@ -1033,7 +1002,6 @@ Təsadüfi yolla seçilmiş bu paroldan istifadə edə bilərsiniz: $1',
 'prefs-custom-js' => 'Xüsusi JavaScript',
 'prefs-common-css-js' => 'Bütün skinlər üçün ümumi CSS/JavaScript:',
 'prefs-emailconfirm-label' => 'E-poçtun təsdiqlənməsi:',
-'prefs-textboxsize' => 'Redaktə pəncərəsinin ölçüsü',
 'youremail' => 'E-məktub *',
 'username' => 'İstifadəçi adı:',
 'uid' => 'İstifadəçi ID:',
@@ -1261,7 +1229,6 @@ Həmçinin kimliyinizi gostərmədən belə, başqalarının sizinlə istifadə
 'recentchangeslinked-feed' => 'Əlaqəli redaktələr',
 'recentchangeslinked-toolbox' => 'Əlaqəli redaktələr',
 'recentchangeslinked-title' => "''$1'' ilə əlaqəli dəyişikliklər",
-'recentchangeslinked-noresult' => 'Qeyd olunan dövrdə əlaqədar səhifələrdə heç bir dəyişiklik yoxdur.',
 'recentchangeslinked-summary' => "Aşağıdakı siyahı, qeyd olunan səhifəyə (və ya qeyd olunan kateqoriyadakı səhifələrə) daxili keçid verən səhifələrdə edilmiş son dəyişikliklərin siyahısıdır.
 [[Special:Watchlist|İzləmə siyahınızdakı]] səhifələr '''qalın''' şriftlə göstərilmişdir.",
 'recentchangeslinked-page' => 'Səhifə adı:',
@@ -1393,7 +1360,6 @@ $1',
 'http-read-error' => 'HTTP oxuma xətası',
 'http-timed-out' => 'HTTP istəyinin vaxtı bitdi.',
 'http-curl-error' => 'URL-ə yanlış müraciət: $1',
-'http-host-unreachable' => 'URL-ə çatmaq olmadı.',
 'http-bad-status' => 'HTTP müraciətin yoxlanması zamanı problem aşkarlanmışdır: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1515,11 +1481,6 @@ $1',
 'statistics-users-active-desc' => 'Son {{PLURAL:$1|gün|$1 gündə}} iş görən istifadəçilər',
 'statistics-mostpopular' => 'Ən çox baxılan səhifələr',
 
-'disambiguations' => 'Dəqiqləşdirmə səhifələrinə keçid verən səhifələr',
-'disambiguationspage' => 'Template:dəqiqləşdirmə',
-'disambiguations-text' => "Aşağıdakı səhifələr '''dəqiqləşdirmə səhifələrinə''' keçid verir. Bunun əvəzinə onlar çox guman ki, müvafiq konkret bir məqaləni göstərməlidirlər.
-<br />Səhifə o zaman dəqiqləşdirmə səhifəsi hesab edilir ki, onda  [[MediaWiki:Disambiguationspage]]-dən keçid verilmiş şablon istifadə edilir.",
-
 'doubleredirects' => 'İkiqat istiqamətləndirmələr',
 'double-redirect-fixed-move' => '[[$1]] dəyişdirilib.
 Hazırda [[$2]]-yə istiqamətlənib.',
@@ -1726,10 +1687,9 @@ Fərdi hüquqlar haqqında əlavə məlumatı [[{{MediaWiki:Listgrouprights-help
 'unwatchthispage' => 'İzləmə',
 'notanarticle' => 'Səhifə boşdur',
 'notvisiblerev' => 'Başqa istifadıçinin son dəyişikliyi silinib',
-'watchnochange' => 'Verilən vaxt ərzində heç bir izlədiyiniz səhifə redaktə edilməmişdir.',
 'watchlist-details' => 'Müzakirə səhifələrini çıxmaq şərtilə {{PLURAL:$1|$1 səhifəni|$1 səhifəni}} izləyirsiniz.',
-'wlheader-enotif' => '*  E-məktubla bildiriş aktivdir.',
-'wlheader-showupdated' => "* Son ziyarətinizdən sonra edilən dəyişikliklər '''qalın şriftlərlə''' göstərilmişdir.",
+'wlheader-enotif' => ' E-məktubla bildiriş aktivdir.',
+'wlheader-showupdated' => "Son ziyarətinizdən sonra edilən dəyişikliklər '''qalın şriftlərlə''' göstərilmişdir.",
 'watchmethod-recent' => 'yeni dəyişikliklər izlənilən səhifələr üçün yoxlanılır',
 'watchmethod-list' => 'izlənilən səhifələr yeni dəyişikliklər üçün yoxlanılır',
 'watchlistcontains' => 'İzləmə siyahınızda $1 {{PLURAL:$1|səhifə|səhifə}} var.',
@@ -2068,10 +2028,7 @@ Bloklama şərtlərini dəyişmək istəyirsiniz?',
 'unblock-hideuser' => 'İstifadəçi adı gizli olduğu üçün, bi bloku götürə bilməzsiniz.',
 'ipb_cant_unblock' => 'Xəta: Bloklama IDsi $1 tapılmadı. Bloklamanın götürülməsi mümkündür.',
 'ip_range_invalid' => 'Yanlış IP',
-'blockme' => 'Məni blokla',
 'proxyblocker' => 'Proksi bloklayıcı',
-'proxyblocker-disabled' => 'Bu funksiya əngəlləndi.',
-'proxyblocksuccess' => 'Oldu.',
 'sorbs' => 'DNSBL',
 
 # Developer tools
@@ -2281,13 +2238,8 @@ Zəhmət olmasa başqa ad seçin.',
 
 # Stylesheets
 'common.css' => '/* Burada yerləşən CSS bütün skinlərə tətbiq olunur */',
-'standard.css' => '/* Burada yerləşən CSS Standard skin istifadəçilərinə tətbiq olunur */',
-'nostalgia.css' => '/* Burada yerləşən CSS Nostalgia skin istifadəçilərinə tətbiq olunur */',
 'cologneblue.css' => '/* Burada yerləşən CSS Cologne Blue skin istifadəçilərinə tətbiq olunur */',
 'monobook.css' => '/* Burada yerləşən CSS Monobook skin istifadəçilərinə tətbiq olunur */',
-'myskin.css' => '/* Burada yerləşən CSS MySkin skin istifadəçilərinə tətbiq olunur */',
-'chick.css' => '/* Burada yerləşən CSS Chick skin istifadəçilərinə tətbiq olunur */',
-'simple.css' => '/* Burada yerləşən CSS Simple skin istifadəçilərinə tətbiq olunur */',
 'modern.css' => '/* Burada yerləşən CSS Modern skin istifadəçilərinə tətbiq olunur */',
 'vector.css' => '/* Burada yerləşən CSS Vector istifadəçilərinə tətbiq olunur */',
 'group-autoconfirmed.css' => '/* Burada yerləşən CSS yalnız avtotəsdiqlənmiş istifadəçilərə şamil olunur */',
@@ -2297,13 +2249,8 @@ Zəhmət olmasa başqa ad seçin.',
 
 # Scripts
 'common.js' => '/* Burada istifadəçilərin hamısı üçün bütün səhifələrdə istənilən JavaScript yüklənəcək */',
-'standard.js' => '/* Burada Standard skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
-'nostalgia.js' => '/* Burada Nostalgia skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
 'cologneblue.js' => '/* Burada Cologne Blue skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
 'monobook.js' => '/* Burada MonoBook skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
-'myskin.js' => '/* Burada MySkin skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
-'chick.js' => '/* Burada Chick skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
-'simple.js' => '/* Burada Simple skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
 'modern.js' => '/* Burada Modern skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
 'vector.js' => '/* Burada Vector skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
 'group-autoconfirmed.js' => '/* Burada istənilən JavaScript yalnız avtotəsdiqlənmiş istifadəçilər üçün yüklənəcək */',
@@ -2344,13 +2291,8 @@ Zəhmət olmasa başqa ad seçin.',
 'pageinfo-authors' => 'Fərqli müəlliflərin sayı',
 
 # Skin names
-'skinname-standard' => 'Classic',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Cologne Blue',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -2473,7 +2415,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Genişlik',
 'exif-imagelength' => 'Hündürlük',
 'exif-compression' => 'Sıxılmamış',
@@ -2599,7 +2541,7 @@ Variants for Chinese language
 'exif-organisationinimage' => 'Təsvir edilmiş təşkilat',
 'exif-personinimage' => 'Təsvir edilmiş şəxs',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sıxılmış',
 
 'exif-copyrighted-true' => 'Müəlliflik hüququ ilə qorunur',
@@ -2892,7 +2834,6 @@ Variants for Chinese language
 'version-skins' => 'Üzlük',
 'version-other' => 'Digər',
 'version-hooks' => 'Çəngəllər',
-'version-extension-functions' => 'Əlavə fubksiyalar',
 'version-hook-name' => 'Çəngəlin adı',
 'version-hook-subscribedby' => 'Abunə olan',
 'version-version' => '(Versiya $1)',
@@ -2903,11 +2844,6 @@ Variants for Chinese language
 'version-software-version' => 'Versiya',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Fayl yolu',
-'filepath-page' => 'Fayl:',
-'filepath-submit' => 'Get',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dublikat fayl axtarışı',
 'fileduplicatesearch-legend' => 'Dublikatı axtar',
@@ -2941,7 +2877,10 @@ Variants for Chinese language
 'tags-title' => 'Etiketlər',
 'tags-tag' => 'Etiket adı',
 'tags-description-header' => 'Anlamının tam açıqlaması',
+'tags-active-header' => 'Aktiv?',
 'tags-hitcount-header' => 'Etiketli dəyişikliklər',
+'tags-active-yes' => 'Bəli',
+'tags-active-no' => 'Xeyr',
 'tags-edit' => 'redaktə',
 'tags-hitcount' => '$1 {{PLURAL:$1|dəyişiklik|dəyişiklik}}',
 
diff --git a/languages/messages/MessagesAzb.php b/languages/messages/MessagesAzb.php
index 09f72ae7..e9423fb2 100644
--- a/languages/messages/MessagesAzb.php
+++ b/languages/messages/MessagesAzb.php
@@ -116,9 +116,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ایزله‌ين ایستیفاده‌چیلرین سایینی گؤستر',
 'tog-oldsig' => 'ایندی‌کی ایمضا:',
 'tog-fancysig' => 'ویکی متن کیمی ایمضا (اوتوماتیک باغلانتی‌سیز)',
-'tog-externaleditor' => 'دَییشدیرمک اوچون ائشیک یازیلیم ایشلد (یالنیز چوخ باشارانلار اوچون، بیلگی‌سایارینیزدا مخصوص تنظیملر لازیم‌دیر. [//www.mediawiki.org/wiki/Manual:External_editors آرتیق بیلگیلر])',
-'tog-externaldiff' => 'موقاییسه ائتمک اوچون ائشیک یازیلیم ایشلد (یالنیز چوخ باشارانلار اوچون، بیلگی‌سایارینیزدا مخصوص تنظیملر لازیم‌دیر. [//www.mediawiki.org/wiki/Manual:External_editors آرتیق بیلگیلر])',
-'tog-showjumplinks' => '«آتلان:» یاردیم باغلانتیلارینی آچ',
 'tog-uselivepreview' => 'دیری اؤن‌گؤستریش ایشلد (جاوااسکریپت لازیم‌دیر)(تست مرحله‌سینده)',
 'tog-forceeditsummary' => 'دَییشیکلیک قیساسی بوش قالاندا منی بیلدیر',
 'tog-watchlisthideown' => 'منیم دَییشیکلیکلریمی ایزله‌دیکلردن گیزلت',
@@ -131,6 +128,7 @@ $messages = array(
 'tog-diffonly' => 'موقاییسه‌لر آلیتندا صحیفه‌لرین ایچینده‌کیلرینی گؤسترمه',
 'tog-showhiddencats' => 'گیزلی بؤلمه‌لری گؤستر',
 'tog-norollbackdiff' => 'قایتاراندان سونرا موقاییسه گؤسترمه',
+'tog-useeditwarning' => 'دَییشدیرمه صحیفه‌سینده چیخیش زامانی، آچیق و قئید اولمایان دَییشدیرمه صحیفه وارسا منه هشدار وئریلسین',
 
 'underline-always' => 'همیشه',
 'underline-never' => 'هئچ واخت',
@@ -194,6 +192,14 @@ $messages = array(
 'oct' => 'اوکتوبر',
 'nov' => 'نووامبر',
 'dec' => 'دئسامبر',
+'february-date' => '$1 فئوریه',
+'may-date' => '$1 مئی',
+'july-date' => '$1 ژولای',
+'august-date' => '$1 آقوست',
+'september-date' => '$1 سئپتامبر',
+'october-date' => '$1 اوکتوبر',
+'november-date' => '$1 نووامبر',
+'december-date' => '$1 دئسامبر',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|بؤلمه|بؤلمه‌لر}}',
@@ -275,6 +281,7 @@ $messages = array(
 'create-this-page' => 'بو صحیفه‌‌نی يارات',
 'delete' => 'سیل',
 'deletethispage' => 'بو صحیفه‌‌نی سیل',
+'undeletethispage' => 'بو صحیفه‌نی دیریلت',
 'undelete_short' => '{{PLURAL:$1|بیر دَییشیکلیگی|$1 دَییشیکلیگی}} برپا ائت',
 'viewdeleted_short' => '{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیگی گؤستر',
 'protect' => 'قوروماق',
@@ -318,7 +325,7 @@ $1',
 'pool-queuefull' => 'مخزن صفی دولودور',
 'pool-errorunknown' => 'تانینمامیش خطا',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}-ا گؤره',
 'aboutpage' => 'Project:حاقیندا',
 'copyright' => 'ایچینده‌کیلر $1 لیسانسی احاطه‌سینده‌دیلر.',
@@ -328,7 +335,6 @@ $1',
 'disclaimers' => 'رد ائتمک',
 'disclaimerpage' => 'Project:عمومی رد ائتمک',
 'edithelp' => 'ديَیشیکلیک‌لر اوچون یاردیم',
-'edithelppage' => 'Help:دَییشدیرمه',
 'helppage' => 'Help:ایچینده‌کیلر',
 'mainpage' => 'آنا صحیفه',
 'mainpage-description' => 'آنا صحیفه',
@@ -405,17 +411,6 @@ $1',
 # General errors
 'error' => 'خطا',
 'databaseerror' => 'دیتابیس خطاسی',
-'dberrortext' => 'بیر دیتابیس سورغو سینتکس خطاسی قاباغا گلدی.
-بو، یازیلیم‌دا بیر خطانی گؤستره بیلر.
-سون قصد ائدیلن دیتابیس سورغوسو بو ایدی:
-<blockquote><code>$1</code></blockquote>
-"<code>$2</code>" فونکسیاسی ایچیندن.
-دیتابیس بو خطانی قایتاردی: "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'بیر دیتابیس سورغو سینتکس خطاسی قاباغا گلدی.
-سون قصد ائدیلن دیتابیس سورغوسو بو ایدی:
-"$1"
-"$2" فونکسیاسی ایچیندن.
-دیتابیس بو خطانی قایتاردی: "$3: $4"',
 'laggedslavemode' => "'''دیقت:''' یارپاق‌دا، سون دَییشیکلیکلرین اولماماسی ایمکانی وار.",
 'readonly' => 'دیتابیس باغلانیب',
 'enterlockreason' => 'باغلاما نَدَن‌لیگی و آچیلماغین تخمینی واختینی یازین',
@@ -470,12 +465,15 @@ $1',
 'editinginterface' => "'''دیقت:''' سیز بیر یازیلیم آرا-اوزونه یازی تعمین ائدن صحیفه‌نی دَییشدیرمک‌ده‌سینیز.
 بو صحیفه‌نی دَییشدیرمک، بو ویکی‌نی ایستیفاده ائدن باشقا ایستیفاده‌چیلرین گؤرونوشونو دَییشه‌جک‌دیر.
 چئویرمه‌لری بوتون ویکی‌لره آرتیریب یوخسا دَییشدیرمک اوچون لوطفاً [//translatewiki.net/ translatewiki.net]، مئدیاویکی‌نین یئرلیلشدیرمه پروژه‌سیندن ایستیفاده ائدین.",
-'sqlhidden' => '(اس‌کیوال سورغوسو گیزلی)',
 'cascadeprotected' => 'بو صحیفه دَییشیکلیکلر قاباغیندا قورونوب‌دور، چونکو بو آشاغیداکی، آبشاری {{PLURAL:$1|سئچمه‌سی|سئچمه‌لری}} سئچیلن، قورونان {{PLURAL:$1|صحیفه|صحیفه‌لر}} ایچینده‌دیر:
 $2',
 'namespaceprotected' => "سیز '''$1''' آدفضاسینداکی صحیفه‌لرین دَییشمه‌سینه ایجازه‌نیز یوخدور.",
 'customcssprotected' => 'سیز بو CSS صفحه‌سینین دَییشمه‌سینه ایجازه‌نیز یوخدور نییه کی اون‌دا باشقا ایشلدنین شخصی تنظیملری واردیر.',
 'customjsprotected' => 'سیز بو جاوااسکریپت صفحه‌سینین دَییشمه‌سینه ایجازه‌نیز یوخدور، نییه کی اون‌دا باشقا ایشلدنین شخصی تنظیملری واردیر.',
+'mycustomcssprotected' => 'بو CSS صحیفه‌سینی دَییشدیرمگه ایجازه‌نیز یوخدور.',
+'mycustomjsprotected' => 'بو جاوااسکریپت صحیفه‌سینی دَییشدیرمگه ایجازه‌نیز یوخدور.',
+'myprivateinfoprotected' => 'اؤز گیزلی بیلگیلرینیزی دَییشدیرمگه ایجازه‌نیز یوخدور.',
+'mypreferencesprotected' => 'اؤز ترجیحلرینیزی دَییشدیرمگه ایجازه‌نیز یوخدور.',
 'ns-specialprotected' => 'اؤزل یارپاقلاری دَییشمک اولماز.',
 'titleprotected' => 'بو آددا یارپاغین یارادیلماسی [[User:$1|$1]] ایشلدن طرفیندن باغلانیب‌دیر.
 اونون نَدَن‌لیگی بودور: "\'\'$2\'\'"',
@@ -501,10 +499,18 @@ $2',
 'welcomecreation-msg' => 'حسابینیز آچیلدی.
 [[Special:Preferences|{{SITENAME}}ترجیحلر]] دییشدیرمیی اونوتمایین.',
 'yourname' => 'ایستیفاده‌چی آدی:',
+'userlogin-yourname' => 'ایستیفاده‌چی آدی',
+'userlogin-yourname-ph' => 'ایستیفاده‌چی آدینیزی دَییشدیرین',
 'yourpassword' => 'رمز:',
+'userlogin-yourpassword' => 'رمز',
+'userlogin-yourpassword-ph' => 'رمزینیزی داخیل ائدین',
+'createacct-yourpassword-ph' => 'بیر رمز داخیل ائدین',
 'yourpasswordagain' => 'رمزی یئنی‌دن یازین:',
+'createacct-yourpasswordagain' => 'رمزی دوغرولایین',
+'createacct-yourpasswordagain-ph' => 'رمزی یئنی‌دن داخیل ائدین',
 'remembermypassword' => 'بو بیلگی‌سایاردا منیم گیریشیمی (چوخو $1 {{PLURAL:$1|گون}}ه قدر) یاددا ساخلا',
-'securelogin-stick-https' => 'گیرندن سونرا، HTTPS-ه باغلی قال',
+'userlogin-remembermypassword' => 'منی ایچری‌ده ساخلا',
+'userlogin-signwithsecure' => 'آرخایین باغلانتی ایشلدین',
 'yourdomainname' => 'سیزین دامنه:',
 'password-change-forbidden' => 'بو ویکی‌ده رمزلری دَییشه بیلنمه‌سینیز.',
 'externaldberror' => 'بیر دیتابیس دوغرولاما خطاسی اولدو، یوخسا سیزین ائشیک حسابینیزی گونجل‌لدمگه ایجازه‌نیز یوخدور.',
@@ -516,18 +522,38 @@ $2',
 'logout' => 'چیخیش',
 'userlogout' => 'چیخیش',
 'notloggedin' => 'گیرمه‌میسینیز',
+'userlogin-noaccount' => 'حسابینیز یوخدورمو؟',
+'userlogin-joinproject' => '{{SITENAME}}-ه قوشولون',
 'nologin' => 'حسابینیز یوخدومو؟ $1.',
 'nologinlink' => 'حساب یارات',
 'createaccount' => 'حساب یارات',
 'gotaccount' => 'اؤنجه‌دن حسابینیز وارمی؟ $1.',
 'gotaccountlink' => 'گیریش',
 'userlogin-resetlink' => 'گیریش بیلگیلرینیزی اونوتموسونوز؟',
+'userlogin-resetpassword-link' => 'رمزینیزی صیفیرلایین',
+'helplogin-url' => 'Help:ایچری گیرمک',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ایچری گیرمگه یاردیم]]',
+'createacct-join' => 'آشاغیدا بیلگیلرینیزی داخیل ائدین.',
+'createacct-emailrequired' => 'ایمیل آدرسی',
+'createacct-emailoptional' => 'ایمیل آدرسی (ایستگه باغلی)',
+'createacct-email-ph' => 'ایمیل آدرسینیزی داخیل ائدین',
 'createaccountmail' => 'بیر گئچیجی راست‌گله رمز ایشلت و اونو آشاغیدا بللندیرن ایمیل آدرسینه گؤندر',
+'createacct-realname' => 'دوغرو آد (ایستگه باغلی)',
 'createaccountreason' => 'نَدَن‌لیک:',
+'createacct-reason' => 'سبب',
+'createacct-reason-ph' => 'ندن سیز باشقا حساب یارادیرسینیز',
+'createacct-captcha' => 'امنیت یوخلاماسی',
+'createacct-imgcaptcha-ph' => 'اوست‌ده‌کی گؤردوگونوز یازی‌نی داخیل ائدین',
+'createacct-submit' => 'حسابینیزی یارادین',
+'createacct-benefit-heading' => '{{SITENAME}} سیزین کیمی آدام‌لارین الی ایله یارانیب‌دیر.',
+'createacct-benefit-body1' => '{{PLURAL:$1|دَییشیکلیک}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|صحیفه}}',
+'createacct-benefit-body3' => 'سون {{PLURAL:$1|قاتیلان|قاتیلانلار}}',
 'badretype' => 'یازدیغینیز رمزلر بیر دئییل‌لر.',
 'userexists' => 'یازدیغینیز آد، اؤنجه‌دن ایشده‌دیر.
 لوطفاً باشقا بیر آد سئچین.',
 'loginerror' => 'گیریش خطاسی',
+'createacct-error' => 'حساب یاراتما خطاسی',
 'createaccounterror' => 'بو حساب یارادیلانمادیر: $1',
 'nocookiesnew' => 'ایستیفاده‌چی حسابی یارادیلدی، اما سیز گیرمه‌میسینیز.
 {{SITENAME}} ایستیفاده‌چیلری گیردیرمک اوچون، کوکی‌لری ایشلدیر.
@@ -609,7 +635,7 @@ $2',
 'newpassword' => 'یئنی رمز',
 'retypenew' => 'یئنی رمزی یئنی‌دن یازین:',
 'resetpass_submit' => 'رمز یارادین و گیریش ائدین',
-'resetpass_success' => 'رمزینیز باشاری‌لا دَییشدیرلدی! ایندی گیریرسینیز...',
+'changepassword-success' => 'رمزینیز باشاری‌لا دَییشدیرلدی! ایندی گیریرسینیز...',
 'resetpass_forbidden' => 'رمزلر دَییشیلمز',
 'resetpass-no-info' => 'بو صحیفه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.',
 'resetpass-submit-loggedin' => 'رمزی دَییشدیر',
@@ -621,10 +647,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'رمزی یئنی‌له',
-'passwordreset-text' => 'رمزینیزی یئنیله‌مک اوچون بو فورمو دولدورون.',
+'passwordreset-text-one' => 'رمزینیزی صیفیرلاماق اوچون بو فورمو باشا چاتدیرین.',
+'passwordreset-text-many' => '{{PLURAL:$1|رمزینیزی صیفیرلاماق اوچون، بیرینی دولدورون.}}',
 'passwordreset-legend' => 'رمزی یئنی‌له',
 'passwordreset-disabled' => 'بو ویکی‌ده رمزی یئنی‌له‌مک باغلانیب‌دیر.',
-'passwordreset-pretext' => '{{PLURAL:$1|آشاغیداکی وئری پارچالارینین بیرینی وئرین}}',
+'passwordreset-emaildisabled' => 'ایمیل اؤزل‌لیکلری بو ویکی‌ده باغلانیب‌دیر.',
 'passwordreset-username' => 'ایستیفاده‌چی آدی:',
 'passwordreset-domain' => 'دامنه:',
 'passwordreset-capture' => 'سون نتیجه ایمیل گؤستریلسین؟',
@@ -647,7 +674,7 @@ $2
 گئچیجی رمز: $2',
 'passwordreset-emailsent' => 'بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.',
 'passwordreset-emailsent-capture' => 'آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.',
-'passwordreset-emailerror-capture' => 'آشاغیدا گؤستریلن کیمی بیر یادا سالما ایمیل یارادیلیب‌دیر، اما ایستیفاده‌چی‌یه گؤندرمگی باشاریلی اولمادی: $1',
+'passwordreset-emailerror-capture' => 'آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی یارادیلیب‌دیر، اما {{GENDER:$2ایستیفاده‌چی}}‌یه گؤندرمگی باشاریلی اولمادی: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ایمیل آدرسینی دَییشدیر',
@@ -854,12 +881,14 @@ $2
 چوخ گومان کی، صحیفه سیلینمیش‌دیر.',
 'edit-conflict' => 'سیزله برابر دییشدیرمه',
 'edit-no-change' => 'سیزین دییشدیر قئیده آلینمامیش‌دیر. بئله کی، متنده هئچ بیر دییشدیر ائدیلممیش‌دیر.',
+'postedit-confirmation' => 'سیزین دَییشدیرمه‌نیز قئید اولونوب‌دور.',
 'edit-already-exists' => 'یئنی صحیفنی یاراتماق مومکون دئییل.
 بئله کی، بو آددا صحیفه آرتیق مؤوجوددور.',
 'defaultmessagetext' => 'دفالت دانیشیق متنی',
 'content-failed-to-parse' => 'تجزیه محتوای $2  مدل اوچون $1: $3 موفقیت اله گلمه دی',
 'invalid-content-data' => 'اعتبارسیز مضمون معلوماتی',
 'content-not-allowed-here' => '"$1" مقاله‌سینه، [[$2]] صحیفه‌سینده ایجازه وئریلممیش دیر.',
+'editwarning-warning' => 'بو صحیفه‌نی ترک ائتمک، دَییشدیرمه‌لرینیزی الدن وئرمگه سبب اولا بیلر. اگر گیریش ائتمیسینیز بو ایخطاری، ترجیحلرینیزین «دَییشدیرمک» بؤلوموندن، ایشدن سالا بیلرسینیز.',
 
 # Content models
 'content-model-wikitext' => 'ویکی‌یازی',
@@ -894,6 +923,7 @@ $2
 'undo-failure' => 'دییشیک‌لیک‌لرین توققوشماسی نتیجه‌سینده گئرییه قایتارما ایشی اوغورسوز اولدو.',
 'undo-norev' => 'دوزلیش‌لر گئری قایتاریلا بیلینمیر، چونکی اونلار یا مؤوجود دئییل، یا دا سیلینیب.',
 'undo-summary' => '$1 دییشیک‌لیک [[Special:Contributions/$2|$2]] ([[User talk:$2|دانیشیق]]) طرفین‌دن گئری آلیندی​​.',
+'undo-summary-username-hidden' => 'گیزلی ایستیفاده‌چی ایله ائدیلمیش $1 نوسخه‌سینی قایتارماق',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'حساب یارادماق اولمور',
@@ -1096,7 +1126,6 @@ $1",
 'searchmenu-legend' => 'آختارماق تنظیملری',
 'searchmenu-exists' => "'''بو ویکی‌ده «[[:$1]]» آدلی صحیفه واردیر.'''",
 'searchmenu-new' => "'''بو ویکی‌ده «[[:$1]]» صحیفه‌‌سینی يارات!'''",
-'searchhelp-url' => 'Help:ایچینده‌کیلر',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1| بو اؤن‌اک ایله اولان صحیفه‌لری آختار]]',
 'searchprofile-articles' => 'مقاله‌لر',
 'searchprofile-project' => 'یاردیم و پروژه صحیفه‌لری',
@@ -1139,15 +1168,7 @@ $1",
 'searchdisabled' => '{{SITENAME}} آختاریشی باغلانیب‌دیر.
 ایندی گوگل ایله آختارا بیلرسینیز.
 دیقت ائدین کی اونون {{SITENAME}} ایندئکسی، کؤهنه اولا بیلر.',
-
-# Quickbar
-'qbsettings' => 'سورعت پانئلی',
-'qbsettings-none' => 'هئچ بیری',
-'qbsettings-fixedleft' => 'سولا ثابیت',
-'qbsettings-fixedright' => 'ساغا ثابیت',
-'qbsettings-floatingleft' => 'سولا اوزن',
-'qbsettings-floatingright' => 'ساغا اوزن',
-'qbsettings-directionality' => 'ثابیت، سیزین دیل یازینیزین یولویلا',
+'search-error' => 'آختاراندا بیر خطا قاباغا گلدی: $1',
 
 # Preferences page
 'preferences' => 'ترجیحلر',
@@ -1181,7 +1202,6 @@ $1",
 'resetprefs' => 'قئید ائدیلمه‌میش ترجیحلری صیفیرله',
 'restoreprefs' => 'بوتون ایلک ترجیحلری قایتار',
 'prefs-editing' => 'دَییشدیرمک‌ده',
-'prefs-edit-boxsize' => 'دَییشدیرمه پنجره‌سینین اؤلچو',
 'rows' => 'سطرلر:',
 'columns' => 'سوتونلار',
 'searchresultshead' => 'آختار',
@@ -1192,9 +1212,6 @@ $1",
 'recentchangesdays-max' => 'ماکسیموم $1 {{PLURAL:$1|گون |گون}}',
 'recentchangescount' => 'سون ديَیشیکلیکلرده باشلیق سايی:',
 'prefs-help-recentchangescount' => 'بورایا یئنی دییشیک‌لیک‌لر، صحیفه‌لرین و ژورنال‌لارین تاریخچه‌سی داخیل‌دیر.',
-'prefs-help-watchlist-token' => 'بو ساحنی گیزلی پاروللا دولدورماغینیز سیزین ایزلمه سیاهینیز اوچون آراس‌اس یاییم کانا‌لی یارادا‌جاق‌دیر.
-بو پارولو بیلن هر کس ایزلمه سیاهینیزی اوخویا بیلر، بو سبب‌دن اعتبارلی پارول سئچین.
-تصادفی یوللا سئچیلمیش بو پارول‌دان ایستیفاده ائده بیلرسینیز: $1',
 'savedprefs' => 'سئچیمینیز قئيد ائدیلدی.',
 'timezonelegend' => 'چاغ بؤلگه‌سی:',
 'localtime' => 'یئرلی چاغ:',
@@ -1225,7 +1242,6 @@ $1",
 'prefs-reset-intro' => 'ترجیحلرینیزی سایتین ایلک فرض ائدیلنلرینه دؤندرمک اوچون، بو صحیفه‌دن ایستیفاده ائده بیلرسینیز.
 بو ایش قایتاریلا بیلمز.',
 'prefs-emailconfirm-label' => 'ایمیل دوغرولاماسی:',
-'prefs-textboxsize' => 'دَییشدیرمه قوتوسونون اؤلچو',
 'youremail' => 'ایمیل:',
 'username' => '{{GENDER:$1|ایستیفاده‌چی آدی}}:',
 'uid' => '{{GENDER:$1|ایستیفاده‌چی}} ID:',
@@ -1260,6 +1276,8 @@ $1",
 'prefs-dateformat' => 'تاریخ فورمتی',
 'prefs-timeoffset' => 'ساعات قورشاغینین فرقی',
 'prefs-advancedediting' => 'عمومی',
+'prefs-editor' => 'دَییشدیرن',
+'prefs-preview' => 'اؤن‌گؤستریش',
 'prefs-advancedrc' => 'گلیشمیش سئچَنکلر',
 'prefs-advancedrendering' => 'گلیشمیش سئچَنکلر',
 'prefs-advancedsearchoptions' => 'گلیشمیش سئچَنکلر',
@@ -1294,6 +1312,8 @@ $1",
 'userrights-notallowed' => 'سیزین ایستیفاده‌چی حسابینیزا دیگر ایستیفاده‌چی‌لره حقوق‌لار وئرمک و یا آلماغا ایجازه وئریلمه‌ییب.',
 'userrights-changeable-col' => 'ديَیشدیره بیلدیگینیز قروپلار',
 'userrights-unchangeable-col' => 'ديَیشدیره بیلمه‌دیگینیز قروپلار',
+'userrights-conflict' => 'ایستیفاده‌چی حاقلاری توققوشماسی! لوطفاً دَییشدیرمه‌لرینیزی یئنی‌دن ائدین.',
+'userrights-removed-self' => 'سیز باشاریلیق‌لا اؤز حاق‌لارینیزی قالدیردینیز. اونا گؤره داها بو صحیفه‌یه یول تاپماغا قادیر دئییل‌سینیز.',
 
 # Groups
 'group' => 'قروپ:',
@@ -1359,11 +1379,19 @@ $1",
 'right-proxyunbannable' => 'پروکسیلرین اوتوماتیک باغلاماقلاریندان گئچ',
 'right-unblockself' => 'اؤزلرینی آچسینلار',
 'right-protect' => 'قوروماق سطحینی و شلاله‌لی قورونموش صحیفه‌لری دَییشدیر',
-'right-editprotected' => 'قورونموش صحیفه‌لری (قورونماقلاری مونتشیر اولمایان) دَییشدیر',
+'right-editprotected' => '«{{int:protect-level-sysop}}» جوره قورونموش صحیفه‌لری دَییشدیر',
+'right-editsemiprotected' => '«{{int:protect-level-autoconfirmed}}» جوره قورونموش صحیفه‌لری دَییشدیر',
 'right-editinterface' => 'ایستیفاده‌چی آرا-اوزونو دَییشدیر',
 'right-editusercssjs' => 'باشقا ایستیفاده‌چیلرین سی‌اس‌اس و جاوااسکریپت فایل‌لارینی دَییشدیر',
 'right-editusercss' => 'باشقا ایستفاده‌چیلرین سی‌اس‌اس فایل‌لارینی دَییشدیر',
 'right-edituserjs' => 'باشقا ایستیفاده‌چیلرین جاوااسکریپت فایل‌لارینی دَییشدیر',
+'right-editmyusercss' => 'اؤز ایستیفاده‌چی CSS فایل‌لارینی دَییشدیر',
+'right-editmyuserjs' => 'اؤز ایستیفاده‌چی جاوااسکریپت فایل‌لارینی دَییشدیر',
+'right-viewmywatchlist' => 'اؤز ایزله‌دیکلرینی گؤر',
+'right-editmywatchlist' => 'اؤز ایزله‌دیکلرینی دَییشدیر. دیقت ائدین بعضی ایشلر حتی بو حاقسیزلیق ایله ده صحیفه آرتیراجاقلار.',
+'right-viewmyprivateinfo' => 'اؤز گیزلی بیلگیلرینی گؤر (میثال اوچون ایمیل آدرسی، دوغرو آد)',
+'right-editmyprivateinfo' => 'اؤز گیزلی بیلگیلرینی دَییشدیر (میثال اوچون ایمیل آدرسی، دوغرو آد)',
+'right-editmyoptions' => 'اؤز ترجیحلرینی دَییشدیر',
 'right-rollback' => 'بیر خاص صحیفه‌نی سون دفعه دَییشدیرن ایستیفاده‌چینین دَییشیکلیکلرینی تئزلیکله قایتار',
 'right-markbotedits' => 'قایتاریلان دَییشیکلیکلری، بوت دَییشیکلیگی اولاراق نیشانلا',
 'right-noratelimit' => 'سورعت محدودیتلریندن گئچ',
@@ -1425,12 +1453,17 @@ $1",
 'action-userrights-interwiki' => 'باشقا ویکیلرده‌کی ایستیفاده‌چیلرین ایستیفاده‌چی حاقلارینی دَییشدیر',
 'action-siteadmin' => 'دیتابیسی قیفیل‌لا یا قیفیلینی آچ',
 'action-sendemail' => 'ایمیل گؤندر',
+'action-editmywatchlist' => 'ایزله‌دیکلرینی دَییشدیر',
+'action-viewmywatchlist' => 'ایزله‌دیکلرینی گؤر',
+'action-viewmyprivateinfo' => 'گیزلی بیلگیلرینی گؤر',
+'action-editmyprivateinfo' => 'گیزلی بیلگیلرینی دَییشدیر',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|دَییشیکلیک}}',
 'recentchanges' => 'سون دَییشیکلیکلر',
 'recentchanges-legend' => 'سون دَییشیکلیکلر سئچمه‌لری',
 'recentchanges-summary' => 'بو صحیفه‌ده، بو ویکی‌ده وئریلن ان سون دَییشیکلیکلری ایزله‌یین.',
+'recentchanges-noresult' => 'وئریلمیش دؤنم‌ده، بو معیارلارا تطبیق اولان دَییشدیرمه یوخدور.',
 'recentchanges-feed-description' => 'ویکی‌ده‌کی ان سون ديَیشیکلیک‌لری بو يايیم کانالیندان ایزله‌يین.',
 'recentchanges-label-newpage' => 'بو دییشیک یئنی بیر صحیفه یاراتدی',
 'recentchanges-label-minor' => 'بو بیر کیچیک دَییشدیرمه‌دیر',
@@ -1467,7 +1500,6 @@ $1",
 'recentchangeslinked-feed' => 'ایلگیلی دَییشیکلیکلر',
 'recentchangeslinked-toolbox' => 'ایلگیلی دَییشیکلیکلر',
 'recentchangeslinked-title' => "''$1'' ایله ایلگی‌لی دییشیکلر",
-'recentchangeslinked-noresult' => 'قئيد اوْلونان دؤورده ایلگیلی صحیفه‌‌لرده هئچ بیر ديَیشیکلیک يوْخدور.',
 'recentchangeslinked-summary' => "آشاغیداکی سیياهی، قئيد اوْلونان صحیفه‌‌يه (و يا قئيد اوْلونان کاتئقوْرياداکی صحیفه‌‌لره) داخیلی کئچید وئرن صحیفه‌‌لرده ائدیلمیش سوْن ديَیشیکلیکلرین سیياهیسیدیر. 
 [[Special:Watchlist|ایزله‌مه سیياهینیزداکی]] صحیفه‌‌لر '''قالین''' شریفتله گؤستریلمیشدیر.",
 'recentchangeslinked-page' => 'صحیفه آدی:',
@@ -1479,7 +1511,7 @@ $1",
 'reuploaddesc' => 'يوکلئمئ فورمونا گئری دؤن.',
 'upload-tryagain' => 'ديَشدیریلمیش فايل ایضاهینی گؤندر',
 'uploadnologin' => 'گیریش ائتمه‌میسینیز',
-'uploadnologintext' => 'فايل يوکله‌مک اوچون [[Special:UserLogin|گیریش ائتمه‌میسینیز]].',
+'uploadnologintext' => 'فايل يوکله‌مک اوچون گرک $1.',
 'upload_directory_missing' => '($1) یوکلمه قایداسی آختاریلیر و وئبسئروئرده یارادیلماسی قئیری-مومکون‌دور.',
 'upload_directory_read_only' => '"$1" کاتالوقونون آرشیوی وئب-سئروئر یازی‌لاری اوچون باغلی‌دیر.',
 'uploaderror' => 'یوکلمه خطاسی',
@@ -1699,7 +1731,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization صحیفه‌‌سین
 'http-read-error' => 'اچ‌تی‌تی‌پی اوخوما ختاسی',
 'http-timed-out' => 'اچ‌تی‌تی‌پی ایستیی‌نین واختی بیتدی.',
 'http-curl-error' => 'مراجعت نشانی ده یانلیش : $1',
-'http-host-unreachable' => 'آدرسه چاتماق اولمادی (خطا).',
 'http-bad-status' => 'اچ‌تی‌تی‌پی مراجعتین یوخلانماسی زامانی پروبلئم آشکارلانمیش‌دیر: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1857,12 +1888,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization صحیفه‌‌سین
 'statistics-users-active-desc' => 'سون {{PLURAL:$1|بیر|$1}} گون‌ده بیر ایش گؤرن ایستیفاده‌چیلر',
 'statistics-mostpopular' => 'ان چوخ گؤرونموش صحیفه‌لر',
 
-'disambiguations' => 'آیدین‌لاشدیرما صحیفه‌لرینه باغلانتیلاری اولان صحیفه‌لر',
-'disambiguationspage' => 'Template:دقیقلشدیرمه',
-'disambiguations-text' => "آشاغیداکی صحیفه‌لرده آزی بیر باغلانتی، '''بلیرلیندیمه صحیفه‌لری'''نه واردیر.
-اولا بیلر اونلاری داها اویغون صحیفه‌یه باغلاماق لازیم اولا.<br />
-بیر صحیفه، بلیرلندیرمه صحیفه‌سی کیمی اولار، اگر [[MediaWiki:Disambiguationspage]] صحیفه‌سینه باغلانمیش بیر شابلون‌دان ایستیفاده ائتسه.",
-
 'pageswithprop' => 'صحیفه اؤزل‌لیگی اولان صحیفه‌لر',
 'pageswithprop-legend' => 'صحیفه اؤزل‌لیگی اولان صحیفه‌لر',
 'pageswithprop-text' => 'بو صحیفه‌ده، بیر خاص صحیفه اؤزل‌لیگی ایشلدن صحیفه‌لرین لیستی واردیر.',
@@ -2115,10 +2140,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization صحیفه‌‌سین
 'unwatchthispage' => 'صحیفه ایزلمیی دایان‌دیر',
 'notanarticle' => 'مضمون صحیفه‌سی دئییل',
 'notvisiblerev' => 'باشقا ایستیفادی‌چی‌نین سون دییشیک‌لیگی سیلینیب',
-'watchnochange' => 'گؤستریلن واخت‌دا هئچ بیر ایزله‌دیگینیز صحیفه دَییشدیریلمه‌ییبدیر.',
 'watchlist-details' => 'دانیشیق صفحه‌لرینی سایمایاراق، {{PLURAL:$1|$1 صفحه‌نی}} ایزله‌ییرسینیز.',
-'wlheader-enotif' => '* ایمیل مکتوبلا بیلدیریش اولا بیلر.',
-'wlheader-showupdated' => "* سون گؤروشونوزدن سونرا ائدیلن دییشیکلیکلر '''قالین''' گؤستریلیبدیلر.",
+'wlheader-enotif' => 'ایمیل ایله بیلدیریش آچیلیب‌دیر.',
+'wlheader-showupdated' => "سون گؤروشونوزدن سونرا ائدیلن دییشیکلیکلر '''قالین''' گؤستریلیبدیلر.",
 'watchmethod-recent' => 'یئنی دییشیک‌لیک‌لر ایزلنیلن صحیفه‌لر اوچون یوخلانیلیر',
 'watchmethod-list' => 'ایزلنیلن صحیفه‌لر یئنی دییشیک‌لیک‌لر اوچون یوخلانیلیر',
 'watchlistcontains' => 'ایزلمه سیاهینیزدا $1 {{PLURAL:$1|صحیفه}} وار.',
@@ -2518,15 +2542,13 @@ $1 آدلی ایستیفاده‌چی‌نین باغلانما سببی: "$2"',
 آنجاق، بو عنوان $2 آرا‌لیغینین پارچاسی اولا‌راق مانعه تؤردیلمیش، دئکابر مانعه تؤرتمه‌سینی قال‌دیرا.',
 'ip_range_invalid' => 'یانلیش ای پی',
 'ip_range_toolarge' => '/ $1 بلوک‌دان داها بؤیوک بازه باغلانمالارینا ایجازه وئریلمیر.',
-'blockme' => 'منی باغلا',
 'proxyblocker' => 'پروکسی باغلییان',
-'proxyblocker-disabled' => 'بو ایش باغلانیب دیر.',
 'proxyblockreason' => 'ای پی آدرئسینیز آچیق بیر پروکسی اولدوغو اوچون مانعه تؤردیلدی.
 خاهیش ائدیریک اینتئرنئت سئویش تعمین ایله یا دا تئکنیکی دستک ایله علاقه قورون و بو جدی تهلوکه‌سیزلیک پروبلئمین‌دن خبردار ائدین.',
-'proxyblocksuccess' => 'اولدو.',
 'sorbsreason' => 'ای پی عنوانینیز، {{SITENAME}} سایتی طرفین‌دن ایستیفاده ائدیلن DNSBL آچیق پروکسی اولا‌راق اولونموش.',
 'sorbs_create_account_reason' => 'ایپ اونوانینیز {{SITENAME}} سایتی طرفین‌دن ایستیفاده ائدیلن DNSBL آچیق پروکسی اولا‌راق اولونموش.
 حساب میدانا گتیره بیلمز',
+'xffblockreason' => 'X-Forwarded-For باشلیغیندا، سیزین یا بیر ایشلتدیگینیز پروکسی خیدمتچی‌نین بلوکلانمیش آی‌پی آدرسی وار. ایلکین بلوکلاما سببی: $1',
 'cant-block-while-blocked' => 'سیز ائنگئللیيکئن باشقا ایستیفاده‌چیلری مانعه تؤره‌ده بیلمزسینیز.',
 'cant-see-hidden-user' => 'قارشیسینی آلماق ایسته‌دیگینیز ایستیفاده‌چی اونسوز دا مانعه تؤره‌دیلمیش و گیزلنمیش. کوللانیجیگیزلئ ایجازه‌نیز اولمادیغی اوچون، ایستیفاده‌چی‌نین قارشیسی‌نین آلینماسینی گؤره بیلمز يا دا ديَیشدیره.',
 'ipbblocked' => 'دیگر ایستیفاده‌چیلری مانعه تؤره‌ده بیلمز يا دا مانعه تؤرتمه‌سینی قالدیرا بیلمز، چونکی اؤزونوز ائنگئللئنمیشسیز',
@@ -2685,6 +2707,8 @@ $1 آدلی ایستیفاده‌چی‌نین باغلانما سببی: "$2"',
 'thumbnail-more' => 'بؤیوت',
 'filemissing' => 'فایل تاپیلمادی',
 'thumbnail_error' => 'کیچیک شکیل یاراتما خطاسی: $1',
+'thumbnail_error_remote' => '$1 طرفین‌دن خطا مئساژی:
+$2',
 'djvu_page_error' => 'DjVu صحیفه‌سی الچاتمازدیر',
 'djvu_no_xml' => 'DjVu اوچون XML فایلی آلماق مومکون دئییل.',
 'thumbnail-temp-create' => 'ائلمک اولماز بارماق اولچوسوجه موقت فایل دوزتمک اولا',
@@ -2906,9 +2930,6 @@ $1 آدلی ایستیفاده‌چی‌نین باغلانما سببی: "$2"',
 'pageinfo-category-subcats' => 'آلت‌بؤلمه‌لرین سایی',
 'pageinfo-category-files' => 'فایل‌لارین سایی',
 
-# Skin names
-'skinname-myskin' => 'منیم قابیغیم',
-
 # Patrolling
 'markaspatrolleddiff' => 'ایداره ائدیلمیش اولا‌راق ایشاره‌له',
 'markaspatrolledtext' => 'صحیفنی پاتروللانمیش کیمی ایشاره‌له',
@@ -2984,11 +3005,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 دقیقه}}',
 'hours' => '{{PLURAL:$1|$1 ساعت |$1 ساعت}}',
 'days' => '{{PLURAL:$1|$1 گون |$1 گون}}',
+'weeks' => '{{PLURAL:$1|$1 هفته}}',
 'months' => '{{PLURAL:$1|$1}} آی',
 'years' => '{{PLURAL:$1|$1}} ایل',
 'ago' => '$1 اؤنجه',
 'just-now' => 'ایندی',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ساعات|اؤنجه}}',
+'minutes-ago' => '$1 {{PLURAL:$1|دقیقه}} اؤنجه',
+'seconds-ago' => '$1 {{PLURAL:$1|ثانیه}} اؤنجه',
+'monday-at' => 'دوشنبه، $1',
+'tuesday-at' => 'سه‌شنبه، $1',
+'wednesday-at' => 'چهارشنبه، $1',
+'thursday-at' => 'پنجشنبه، $1',
+'friday-at' => 'جومعه، $1',
+'saturday-at' => 'شنبه، $1',
+'sunday-at' => 'یکشنبه، $1',
+'yesterday-at' => 'دونن $1',
+
 # Bad image list
 'bad_image_list' => 'فورمت بئله اولمالیدیر:
 
@@ -3016,7 +3051,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'گئنیش‌لیک',
 'exif-imagelength' => 'اوزوناسی',
 'exif-bitspersample' => 'هر جز دا نقطه',
@@ -3194,7 +3229,7 @@ $1',
 'exif-originalimageheight' => 'شکیلین کسیلمه دن اوولکی اوجالیقی',
 'exif-originalimagewidth' => 'شکیلین کسیلمه دن اوولکی گئنیش‌لیگی',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'سیخیلمامیش',
 'exif-compression-2' => 'پسوورد قویماق سی‌سی‌آی‌تی‌تی ۳  گروه دا بیر بعدی هافمن روشی ایله اوزوناسی اوستونده دییشیلیب',
 'exif-compression-3' => 'رمز قرار وئرمک سی‌سی‌آی‌تی‌تی قروپ ۳',
@@ -3584,7 +3619,6 @@ $5
 'version-other' => 'آیری',
 'version-mediahandlers' => 'مئدیا ایشلدنلری',
 'version-hooks' => 'چنگل‌لر',
-'version-extension-functions' => 'علاوه‌‌ فوبکسیيالار',
 'version-parser-extensiontags' => 'آیریشدیران گنیشلندیرمه اِتیکِتلری',
 'version-parser-function-hooks' => 'آیریشدیران فونکسیا چنگل‌لری',
 'version-hook-name' => 'چنگه‌لین آدی',
@@ -3606,12 +3640,17 @@ $5
 'version-entrypoints-header-entrypoint' => 'گیریش نقطه‌‌سی',
 'version-entrypoints-header-url' => 'اینترنت آدرسی',
 
-# Special:FilePath
-'filepath' => 'فايل يولو',
-'filepath-page' => 'فایل:',
-'filepath-submit' => 'گئت',
-'filepath-summary' => 'بو اؤزل صحیفه‌‌ بیر فايل اوچون تام يولو گتیرر. 
-شکیللر تام تصویرین گؤستریلیر، دیگر فايل نؤولری ایله باغلی پروقراملاری بیرباشا ایشه باشلايیر.',
+# Special:Redirect
+'redirect' => 'فایل، ایستیفاده‌چی یا نوسخه ID-سی ایله یول‌لاندیرما',
+'redirect-legend' => 'بیر فایل یا صحیفه‌یه یول‌لاندیرما',
+'redirect-summary' => 'بو اؤزل صحیفه، بیر فایلا (فایل آدی ایله)، صحیفه‌یه (نوسخه ID-سی ایله) یا ایستیفاده‌چی صحیفه‌سینه (ایستیفاده‌چی نومره ID-سی ایله) یول‌لاندیریر.',
+'redirect-submit' => 'گئت',
+'redirect-lookup' => 'آختار:',
+'redirect-value' => 'دَگَر:',
+'redirect-user' => 'ایستیفاده‌چی ID',
+'redirect-revision' => 'صحیفه نوسخه‌سی',
+'redirect-file' => 'فایل آدی',
+'redirect-not-exists' => 'دَگَر تاپیلمادی',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'دوبلیکات فايل آختاریشی',
@@ -3660,6 +3699,7 @@ $5
 'tags' => 'مومکون دییشیک‌لیک ائتیکئت‌لری',
 'tag-filter' => '[[Special:Tags|اِتیکِت]] سۆزگُجی:',
 'tag-filter-submit' => 'سۆزگَج',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|اِتیکِت|اِتیکِتلر}}]]: $2)',
 'tags-title' => 'یاپیشقان',
 'tags-intro' => 'بو صحیفه، یازیلیم دَییشدیرمه‌لری نیشانلایان اِتیکِتلری و اونلارین آنلاملارینی گؤستریر.',
 'tags-tag' => 'یاپیشقان آدی',
@@ -3701,6 +3741,9 @@ $5
 'htmlform-submit' => 'گؤندر',
 'htmlform-reset' => 'دَییشیکلیکلری قایتار',
 'htmlform-selectorother-other' => 'باشقا',
+'htmlform-no' => 'یوخ',
+'htmlform-yes' => 'بلی',
+'htmlform-chosen-placeholder' => 'بیر سئچمه سئچین',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 بوتون یازی آختارما دستگی‌له',
diff --git a/languages/messages/MessagesBa.php b/languages/messages/MessagesBa.php
index 075fca46..848a9b3f 100644
--- a/languages/messages/MessagesBa.php
+++ b/languages/messages/MessagesBa.php
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author AiseluRB
  * @author Alfiya55
  * @author Assele
  * @author Comp1089
@@ -156,7 +157,7 @@ $messages = array(
 'tog-newpageshidepatrolled' => 'Яңы биттәр исемлегендә тикшерелгән үҙгәртеүҙәрҙе йәшер',
 'tog-extendwatchlist' => 'Барлыҡ үҙгәртеүҙәрҙе үҙ эсенә алған, киңәйтелгән күҙәтеү исемлеге',
 'tog-usenewrc' => 'Һуңғы төҙәтеүҙәр һәм күҙәтеү исемлегендәге үҙгәрештәрҙе төркөмдәргә бүлергә',
-'tog-numberheadings' => 'Башисемдәрҙе автоматик рәүештә номерландыр',
+'tog-numberheadings' => 'Башисемдәрҙе автоматик рәүештә номерлаe',
 'tog-showtoolbar' => 'Мөхәррирләгән ваҡытта өҫкө ҡоралдар панелен күрһәтергә (JavaScript кәрәк)',
 'tog-editondblclick' => 'Биттәрҙе ике сиртеү менән мөхәррирләргә',
 'tog-editsection' => 'Һәр бүлек өсөн «үҙгәртеү» һылтанмаһын күрһәтергә',
@@ -178,9 +179,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Битте күҙәтеү исемлегенә өҫтәгән ҡулланыусылар һанын күрһәтергә',
 'tog-oldsig' => 'Хәҙерге имза:',
 'tog-fancysig' => 'Имзаның үҙ вики-тамғаһы (автоматик һылтанмаһыҙ)',
-'tog-externaleditor' => 'Махсус билдәләнмәһә, тышҡы мөхәррирләүсе ҡулланырға (белгестәр өсөн генә, компьютер махсус көйләнгән булырға тейеш)',
-'tog-externaldiff' => 'Махсус билдәләнмәһә, версияларҙы сағыштырыу өсөн тышҡы программа ҡулланырға (белгестәр өсөн генә, компьютер махсус көйләнгән булырға тейеш)',
-'tog-showjumplinks' => '«Күс» ярҙамсы һылтанмалары асылһын',
 'tog-uselivepreview' => 'Тиҙ ҡарап алыуҙы ҡулланырға (JavaScript, эксперименталь)',
 'tog-forceeditsummary' => 'Төҙәтеүҙе тасуирлау юлы тултырылмаһа, мине киҫәт',
 'tog-watchlisthideown' => 'Үҙгәртеүҙеремде күҙәтеү исемлегенән йәшерергә',
@@ -193,6 +191,8 @@ $messages = array(
 'tog-diffonly' => 'Версия сағыштырыу аҫтында бит эстәлеге күрһәтелмәһен',
 'tog-showhiddencats' => 'Йәшерен категорияларҙы күрһәтергә',
 'tog-norollbackdiff' => 'Кире ҡайтарыуҙан һуң версия айырмалары күрһәтелмәһен',
+'tog-useeditwarning' => 'Мөхәррирләү битенән үҙгәртеүҙәрҙе һаҡламайынса сыҡҡан ваҡытта мине киҫәтергә',
+'tog-prefershttps' => 'Системаға танытылғандан һуң һәр ваҡыт һаҡланыулы тоташыу ҡулланырға',
 
 'underline-always' => 'Һәр ваҡыт',
 'underline-never' => 'Бер ҡасан да',
@@ -256,6 +256,18 @@ $messages = array(
 'oct' => 'окт',
 'nov' => 'ноя',
 'dec' => 'дек',
+'january-date' => 'Ғинуар $1',
+'february-date' => 'Февраль $1',
+'march-date' => 'Март $1',
+'april-date' => 'Апрель $1',
+'may-date' => 'Май $1',
+'june-date' => 'Июнь $1',
+'july-date' => 'Июль $1',
+'august-date' => 'Август $1',
+'september-date' => 'Сентябрь $1',
+'october-date' => 'Октябрь $1',
+'november-date' => 'Ноябрь $1',
+'december-date' => 'Сентябрь $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категория|Категория}}',
@@ -337,6 +349,7 @@ $messages = array(
 'create-this-page' => 'Был битте яһарға',
 'delete' => 'Юҡ  итергә',
 'deletethispage' => 'Был битте юйырға',
+'undeletethispage' => 'Юйылған был битте ҡабат тергеҙеү',
 'undelete_short' => '$1 {{PLURAL:$1|үҙгәртеүҙе}} тергеҙергә',
 'viewdeleted_short' => '{{PLURAL:$1|1 юйылған үҙгәртеүҙе|$1 юйылған үҙгәртеүҙе}} ҡарау',
 'protect' => 'Һаҡларға',
@@ -380,7 +393,7 @@ $1',
 'pool-queuefull' => 'Һорауҙар сираты тулы',
 'pool-errorunknown' => 'Билдәһеҙ хата',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} тураһында',
 'aboutpage' => 'Project:Тасуирлама',
 'copyright' => '$1 лицензияһына ярашлы, эстәлеге менән һәр кем файҙалана ала (башҡаһы күрһәтелмәһә)',
@@ -390,7 +403,6 @@ $1',
 'disclaimers' => 'Яуаплылыҡтан баш тартыу',
 'disclaimerpage' => 'Project:Яуаплылыҡтан баш тартыу',
 'edithelp' => 'Төҙәтеү белешмәһе',
-'edithelppage' => 'Help:Төҙәтеү белешмәһе',
 'helppage' => 'Help:Белешмә',
 'mainpage' => 'Баш бит',
 'mainpage-description' => 'Баш бит',
@@ -468,17 +480,12 @@ $1',
 # General errors
 'error' => 'Хата',
 'databaseerror' => 'Мәғлүмәттәр базаһы хатаһы',
-'dberrortext' => 'Мәғлүмәттәр базаһына ебәрелгән һорауҙа синтаксис хатаһы табылды.
-Был программала хата булыу мөмкинлеген күрһәтә.
-Мәғлүмәттәр базаһына ебәрелгән һуңғы һорау:
-<blockquote><tt>$1</tt></blockquote>
-<tt>«$2»</tt> функцияһынан.
-База <tt>«$3: $4»</tt> хатаһын кире ҡайтарҙы.',
-'dberrortextcl' => 'Мәғлүмәттәр базаһына ебәрелгән һорауҙа синтаксис хатаһы табылды.
-Мәғлүмәттәр базаһына ебәрелгән һуңғы һорау:
-$1
-«$2» функцияһынан килә.
-База «$3: $4» хатаһын кире ҡайтарҙы.',
+'databaseerror-text' => 'Бирелмәләр базаһында хата киткән.
+Был программа тәьминәтендә хата барлығы күрһәткесе булырға мөмкин.',
+'databaseerror-textcl' => 'Бирелмәләр базаһында хата бар.',
+'databaseerror-query' => 'Һоратыу: $1',
+'databaseerror-function' => 'Функция:$1',
+'databaseerror-error' => 'Хата: $1',
 'laggedslavemode' => "'''Иғтибар:''' биттә һуңғы үҙгәртеүҙәр күрһәтелмәгән булырға мөмкин.",
 'readonly' => 'Мәғлүмәттәр базаһы бикләнгән',
 'enterlockreason' => 'Ябылыу сәбәбен һәм ваҡытын белдерегеҙ.',
@@ -513,6 +520,7 @@ $1',
 'cannotdelete-title' => '"$1" битен юйып булмай',
 'delete-hook-aborted' => 'Үҙгәртеүҙе махсус-процедура кире ҡаҡты.
 Өҫтәмә аңлатма килтерелмәй.',
+'no-null-revision' => '«$1» бите өсөн яңы нулле төҙәтеү яһап булманы',
 'badtitle' => 'Ярамаған исем',
 'badtitletext' => 'Биттең һоратылған исеме дөрөҫ түгел, буш йәки телдәр араһы йәки интервики исеме яңылыш күрһәтелгән. Исемдә тыйылған символдар булыуы ла мөмкин.',
 'perfcached' => 'Был мәғлүмәттәр кэштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. Кэшта иң күбе {{PLURAL:$1|язма}} һаҡлана.',
@@ -534,12 +542,15 @@ $1',
 'editinginterface' => "'''Иғтибар.''' Һеҙ программаның арайөҙ тексты булған битте мөхәррирләйһегеҙ.
 Уны үҙгәртеү, башҡа ҡулланыусыларҙын арайөҙ күренешен үҙгәртәсәктер.
 Тәржемә өсөн [//translatewiki.net/wiki/Main_Page?setlang=ba translatewiki.net] адресын, MediaWiki-ны локалләштереү проектын ҡулланыу яҡшыраҡ буласаҡтыр.",
-'sqlhidden' => '(SQL-һорау йәшерелгән)',
 'cascadeprotected' => 'Был бит үҙгәртеүҙәрҙән һаҡланған, сөнки ул эҙмә-эҙлекле һаҡлау ҡуйылған {{PLURAL:$1|биткә|биттәргә}} керә:
 $2',
 'namespaceprotected' => '«$1» исем арауығындағы биттәрҙе мөхәррирләү өсөн хоҡуҡтарығыҙ юҡ.',
 'customcssprotected' => 'Был CSS-битте үҙгәртеү хоҡуғығыҙ юҡ, сөнки унда башҡа ҡулланыусының шәхси көйләүҙәре бар.',
 'customjsprotected' => 'Был JavaScript-битте үҙгәртеү хоҡуғығыҙ юҡ, сөнки унда башҡа ҡулланыусының шәхси көйләүҙәре бар.',
+'mycustomcssprotected' => 'Биттең был CSS-ын  мөхәррирләргә хоҡуғығыҙ юҡ.',
+'mycustomjsprotected' => 'Был биттәге  JavaScript-ты мөхәррирләргә хоҡуғығыҙ юҡ.',
+'myprivateinfoprotected' => 'Һеҙгә шәхси мәғлүмәттәрегеҙҙе үҙгәртергә рөхсәт юҡ',
+'mypreferencesprotected' => 'Һеҙҙең көйләүҙәрегеҙҙе мөхәррирләргә хоҡуғығыҙ юҡ.',
 'ns-specialprotected' => '«{{ns:special}}» исем арауығындағы биттәрҙе үҙгәртеп булмай.',
 'titleprotected' => "Был исем менән бит яһау [[User:$1|$1]] тарафынан тыйылған.
 Белдерелгән сәбәп: ''$2''.",
@@ -564,10 +575,19 @@ $2',
 'welcomecreation-msg' => 'Иҫәп яҙыуығыҙ яһалды.
 Шәхси [[Special:Preferences|{{SITENAME}} көйләүҙәрен]] үҙегеҙгә уңайлы итеп үҙгәртергә онотмағыҙ.',
 'yourname' => 'Ҡатнашыусы исеме',
+'userlogin-yourname' => 'Ҡулланыусы исеме',
+'userlogin-yourname-ph' => 'Иҫәп яҙмағыҙҙың исемен яҙығыҙ',
+'createacct-another-username-ph' => 'Иҫәп яҙмағыҙҙың исемен яҙығыҙ',
 'yourpassword' => 'Серһүҙ',
+'userlogin-yourpassword' => 'Серһүҙ',
+'userlogin-yourpassword-ph' => 'Яңы серһүҙҙе яҙығыҙ',
+'createacct-yourpassword-ph' => 'Серһүҙҙе яҙығыҙ',
 'yourpasswordagain' => 'Серһүҙҙе ҡабаттан яҙыу',
+'createacct-yourpasswordagain' => 'Серһүҙҙе раҫлағыҙ',
+'createacct-yourpasswordagain-ph' => 'Серһүҙҙе тағы бер тапҡыр яҙығыҙ',
 'remembermypassword' => 'Был браузерҙа (иң күбендә $1 {{PLURAL:$1|көнгә}}) иҫәп яҙыуым хәтерләнһен',
-'securelogin-stick-https' => 'Танылғандан һуң HTTPS менән бәйләнеште ҡалдырырға',
+'userlogin-remembermypassword' => 'Системала ҡалырға',
+'userlogin-signwithsecure' => 'Һаҡланыулы тоташыу',
 'yourdomainname' => 'Һеҙҙең домен',
 'password-change-forbidden' => 'Был викила серһүҙегеҙҙе үҙгәртә алмайһығыҙ.',
 'externaldberror' => 'Тышҡы мәғлүмәт базаһы менән танылғанда хата барлыҡҡа килде йәки тышҡы үҙ көйләүҙәрегеҙҙе үҙгәртер өсөн хоҡуҡтарығыҙ етәрле түгел.',
@@ -579,18 +599,43 @@ $2',
 'logout' => 'Тамамлау',
 'userlogout' => 'Тамамлау',
 'notloggedin' => 'Танылмағанһығыҙ',
+'userlogin-noaccount' => 'Иҫәп яҙмағыҙ юҡмы?',
+'userlogin-joinproject' => 'Проектҡа ҡушылырға',
 'nologin' => "Һеҙ теркәлмәгәнһегеҙме әле? '''$1'''.",
 'nologinlink' => 'Иҫәп яҙыуын булдырырға',
 'createaccount' => 'Яңы ҡатнашыусыны теркәү',
 'gotaccount' => "Әгәр Һеҙ теркәлеү үткән булһағыҙ? '''$1'''.",
 'gotaccountlink' => 'Үҙегеҙ менән таныштырығыҙ',
 'userlogin-resetlink' => 'Танылыу мәғлүмәттәрен оноттоғоҙмо?',
+'userlogin-resetpassword-link' => 'Серһүҙҙе ҡабул итмәү',
+'helplogin-url' => 'Help:Системаға танылыу',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Help with logging in]]Системаға инеүҙә ярҙам',
+'userlogin-loggedin' => ' Һеҙ {{GENDER:$1|$1}} булараҡ индегеҙ инде. Башҡа файҙаланыусы булып инер өсөн аҫтағы ҡалыпты ҡулланығыҙ.',
+'userlogin-createanother' => 'Башҡа иҫәп яҙмаһын булдырырға',
+'createacct-join' => 'Аҫта мәғлүмәттәрегеҙҙе яҙығыҙ.',
+'createacct-another-join' => 'Аҫта яңы иҫәп яҙмағыҙҙың мәғлүмәттәрен яҙығыҙ.',
+'createacct-emailrequired' => 'Электрон почта адресы',
+'createacct-emailoptional' => 'Электрон почта адресы (мотлаҡ түгел)',
+'createacct-email-ph' => 'Электрон почта адресығыҙҙы яҙығыҙ',
+'createacct-another-email-ph' => 'Электрон почта адресығыҙҙы яҙығыҙ',
 'createaccountmail' => 'Осраҡлы рәүештә хасил ителгән ваҡытлыса серһүҙҙе файҙаланырға һәм уны миңә ошо электрон почтаһы адресына ебәрергә',
+'createacct-realname' => 'Ысын исемегеҙ (мотлаҡ түгел)',
 'createaccountreason' => 'Сәбәп:',
+'createacct-reason' => 'Сәбәп',
+'createacct-reason-ph' => 'Икенсе иҫәп яҙмаһы һеҙгә ни өсөн кәрәк?',
+'createacct-captcha' => 'Һаҡлылыҡты тикшереү',
+'createacct-imgcaptcha-ph' => 'Өҫтәге тексты индерегеҙ',
+'createacct-submit' => 'Иҫәп яҙмаһын булдырырға',
+'createacct-another-submit' => 'Тағы бер иҫәп яҙмаһын булдырырға',
+'createacct-benefit-heading' => '{{SITENAME}} һеҙҙең кеүек үк кешеләр тарафынан булдырылған',
+'createacct-benefit-body1' => '{{PLURAL:$1|үҙгәртеү}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|мәҡәлә|мәҡәлә|мәҡәләнең}}',
+'createacct-benefit-body3' => 'һуңғы ваҡытта {{PLURAL:$1|ҡатнашыусы|}}',
 'badretype' => 'Һеҙ кереткән серһүҙҙәр тап килмәй.',
 'userexists' => 'Керетелгән исем ҡулланыла инде.
 Зинһар, башҡа исем һайлағыҙ.',
 'loginerror' => 'Танылыу хатаһы',
+'createacct-error' => 'Иҫәп яҙмаһын булдырғандағы хата',
 'createaccounterror' => 'Иҫәп яҙыуын яһап булмай: $1',
 'nocookiesnew' => 'Иҫәп яҙыуы яһалды, ләкин һеҙ танылмағанһығыҙ. {{SITENAME}} ҡатнашыусыны таныу өсөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уларға рөхсәт бирегеҙ, шунан яңынан ҡатнашыусы исеме һәм серһүҙ менән танылығыҙ.',
 'nocookieslogin' => '{{SITENAME}} ҡатнашыусыны таныу өсөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уға рөхсәт бирегеҙ һәм яңынан керегеҙ.',
@@ -641,11 +686,13 @@ $2',
 
 Иҫәп яҙыуы яңылыш яһалһа, был хатҡа иғтибар итмәгеҙ.',
 'usernamehasherror' => 'Ҡулланыусы исемендә "#" символы була алмай',
-'login-throttled' => 'Һеҙ системала артыҡ күп танылырға тырыштығыҙ.
-Зинһар, ҡабатламаҫтан алда бераҙ көтөгөҙ.',
+'login-throttled' => 'Һеҙ системаға ҡат-ҡат танылырға тырыштығыҙ.
+Тағы бер танылырҙан алда, зинһар, $1 көтөгөҙ.',
 'login-abort-generic' => 'Танылыу уңышһыҙ тамамланды',
 'loginlanguagelabel' => 'Тел: $1',
 'suspicious-userlogout' => 'Һеҙҙең сеансты тамамлау тураһында һорауығыҙ кире ҡағылды, сөнки ул төҙөк булмаған браузер йәки кэшлаусы прокси тарафынан ебәрелгән һорауға оҡшаған.',
+'createacct-another-realname-tip' => 'Ысын исемегеҙ (мотлаҡ түгел).
+Уны яҙып ҡуйһағыҙ, ул биткә кем төҙәтеү индергәнен күрһәтеү өсөн ҡулланыласаҡ.',
 
 # Email sending
 'php-mail-error-unknown' => 'PHP-ның mail() функцияһында билдәһеҙ хата',
@@ -660,8 +707,7 @@ $2',
 'newpassword' => 'Яңы серһүҙ:',
 'retypenew' => 'Серһүҙҙе яңынан керетегеҙ:',
 'resetpass_submit' => 'Серһүҙ ҡуйырға һәм танышырға',
-'resetpass_success' => 'Серһүҙегеҙ уңышлы үҙгәртелде!
-Системаға инеү башҡарыла...',
+'changepassword-success' => 'Серһүҙегеҙ уңышлы үҙгәртелде!',
 'resetpass_forbidden' => 'Серһүҙҙе үҙгәртеп булмай',
 'resetpass-no-info' => 'Был битте туранан ҡарау өсөн һеҙгә системала танылырға кәрәк.',
 'resetpass-submit-loggedin' => 'Серһүҙҙе үҙгәртергә',
@@ -673,10 +719,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Серһүҙҙе ташлатыу',
-'passwordreset-text' => 'Серһүҙегеҙҙе ташлау өсөн, ошо ҡалыпты тултырығыҙ.',
+'passwordreset-text-one' => 'Серһүҙегеҙҙе ташлар өсөн ош ҡалыпты тултырығыҙ.',
+'passwordreset-text-many' => '{{PLURAL:$1|Серһүҙҙе ташлар өсөн яландарҙың береһен тултырығыҙ.}}',
 'passwordreset-legend' => 'Серһүҙҙе ташлатыу',
 'passwordreset-disabled' => 'Был викила серһүҙҙе ташлатыу ғәмәлдә түгел',
-'passwordreset-pretext' => '{{PLURAL:$1||аҫта күрһәтелгән мәғлүмәттәрҙең бер киҫәген керетегеҙ}}',
+'passwordreset-emaildisabled' => 'Был викиҙа электрон почта функцияһы һүндерелгән.',
 'passwordreset-username' => 'Ҡулланыусы исеме:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Хәбәрҙең һуңғы хәлен ҡарарғамы?',
@@ -702,7 +749,7 @@ $2
 Ваҡытлыса серһүҙ: $2',
 'passwordreset-emailsent' => 'Серһүҙҙе ташлау тураһындағы мәғлүмәт менән электрон почта аша хат ебәрелде.',
 'passwordreset-emailsent-capture' => 'Серһүҙҙе ташлау тураһындағы мәғлүмәт менән электрон хат ебәрелде, уның тексы түбәндә бирелә:',
-'passwordreset-emailerror-capture' => 'Килеп сыҡҡан хәтерләтеү хәбәре түбәндә күрһәтелгән, тик уны ебәреү уңышһыҙ тамамланды. Сәбәбе:$1',
+'passwordreset-emailerror-capture' => 'Серһүҙҙе ташлау тураһында хәбәр итеүсе электрон хат булдырылғайны, ләкин уны  {{GENDER:$2|kullanıcıya}} түбәндәге сәбәп арҡаһында ебәреп булманы: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Электрон почта адресын үҙгәртергә',
@@ -716,6 +763,19 @@ $2
 'changeemail-submit' => 'Адресты үҙгәртергә',
 'changeemail-cancel' => 'Кире алырға',
 
+# Special:ResetTokens
+'resettokens' => 'Токендарҙы ташларға',
+'resettokens-text' => 'Иҫәп яҙмағыҙ менән бәйләнгән ҡайһы бер шәхси мәғлүмәттәрегеҙгә инеүгә юл асыусы токендарҙы ташлай алаһығыҙ.
+
+Яңылыштан уларҙы берәйһе менән уртаҡлашҡан  йәки аккаунтығыҙ ваттырылған осраҡта быны эшләү мотлаҡ.',
+'resettokens-no-tokens' => 'Ташлар өсөн токендар юҡ.',
+'resettokens-legend' => 'Токендарҙы ташларға',
+'resettokens-tokens' => 'Токендар:',
+'resettokens-token-label' => '$1 (ағымдағы мәғәнә: $2)',
+'resettokens-watchlist-token' => ' [[Special:Watchlist|күҙәтеүҙәрегеҙ исемлегендә биттәрҙең үҙгәрештәре]] веб-каналы өсөн токен(Atom/RSS)',
+'resettokens-done' => 'Токендар ташланды.',
+'resettokens-resetbutton' => 'Һайланған токендарҙы ташларға',
+
 # Edit page toolbar
 'bold_sample' => 'Ҡалын яҙылыш',
 'bold_tip' => 'Ҡалын яҙылыш',
@@ -910,12 +970,15 @@ $2
 Бәлки ул юйылғандыр.',
 'edit-conflict' => 'Төҙәтеүҙәр конфликты',
 'edit-no-change' => 'Текста үҙгәртеүҙер булмау сәбәпле үҙгәртеүегеҙгә иғтибар ителмәне.',
+'postedit-confirmation' => 'Үҙгәртеүегеҙ һаҡланды.',
 'edit-already-exists' => 'Яңы бит яһап булмай.
 Ул былай ҙа бар.',
 'defaultmessagetext' => 'Алдан билдәләнгән яҙма',
 'content-failed-to-parse' => '$2 эстәлеге $1 төрөнә тура килмәй: $3.',
 'invalid-content-data' => 'Ярамаған мәғлүмәт',
 'content-not-allowed-here' => '"$1" эстәлеге [[$2]] бит өсөн ярамай',
+'editwarning-warning' => 'Икенсе биткә күсеү һеҙ индергән үҙгәрештәрҙең юғалыуына килтереүе мөмкин.
+Әгәр системала танылыу үтһәгеҙ, көйләүҙәрегеҙ битенең "Мөхәррирләү" бүлегендә был киҫәтеүҙе һүндерә алаһығыҙ.',
 
 # Content models
 'content-model-wikitext' => 'викияҙма',
@@ -950,6 +1013,7 @@ $2
 'undo-failure' => 'Ара үҙгәртеүҙәр тура килмәү сәбәпле төҙәтеүҙе кире алып булмай.',
 'undo-norev' => 'Үҙгәртеүҙе кире алып булмай, сөнки юҡ йәки юйылған.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ҡулланыусыһының ([[User talk:$2|фекер алышыу]]) $1 үҙгәртеүенән баш тартыу',
+'undo-summary-username-hidden' => 'Исеме йәшерелгән ҡатнашыусының төҙәтеүен  $1 кире ҡағыу',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Иҫәп яҙыуын яһап булмай',
@@ -1129,6 +1193,7 @@ $1",
 'compareselectedversions' => 'Һайланған версияларҙы сағыштырыу',
 'showhideselectedversions' => 'Һайланған версияларҙы күрһәтергә/йәшерергә',
 'editundo' => 'кире алыу',
+'diff-empty' => '(айырмалар юҡ)',
 'diff-multi' => '({{PLURAL:$2|$2 ҡатнашыусының}} {{PLURAL:$1|ваҡытлы версияһы}} күрһәтелмәгән)',
 'diff-multi-manyusers' => '(Кәмендә {{PLURAL:$2|$2 ҡатнашыусының}} {{PLURAL:$1|ваҡытлы версияһы}} күрһәтелмәгән)',
 'difference-missing-revision' => '$1 айырмаһының {{PLURAL:$2|бер өлгөһө|$2 өлгөһө}} табылманы.
@@ -1156,7 +1221,6 @@ $1",
 'searchmenu-legend' => 'Эҙләү көйләүҙәре',
 'searchmenu-exists' => "'''Был вики-проектта «[[:$1]]» бите бар'''",
 'searchmenu-new' => "'''Был википроектта \"[[:\$1]]\" бите булдырырға.'''",
-'searchhelp-url' => 'Help:Эстәлек',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Был префикслы биттәрҙе күрһәтергә]]',
 'searchprofile-articles' => 'Эстәлек биттәре',
 'searchprofile-project' => 'Ярҙамсы һәм проект биттәре',
@@ -1199,15 +1263,7 @@ $1",
 'searchdisabled' => '{{SITENAME}} эҙләүе ябыҡ.
 Хәҙергә эҙләүҙе Google менән үтәй алаһығыҙ.
 Тик унда {{SITENAME}} өсөн индекслауҙың иҫке булыуы мөмкинлеген онотмағыҙ.',
-
-# Quickbar
-'qbsettings' => 'Тиҙ күсеү',
-'qbsettings-none' => 'Һис бере',
-'qbsettings-fixedleft' => 'Һулда нығытылған',
-'qbsettings-fixedright' => 'Уңда нығытылған',
-'qbsettings-floatingleft' => 'Һулда күсеүсе',
-'qbsettings-floatingright' => 'Уңда күсеүсе',
-'qbsettings-directionality' => 'Беркетелгән, телегеҙҙең яҙыу йүнәлешенә бәйле',
+'search-error' => 'Эҙләүҙә хата китте: $1',
 
 # Preferences page
 'preferences' => 'Көйләүҙәр',
@@ -1241,7 +1297,6 @@ $1",
 'resetprefs' => 'Һаҡланмаған үҙгәрештерҙе таҙартырға',
 'restoreprefs' => 'Алдан ҡуйылған көйләүҙәрҙе тергеҙергә',
 'prefs-editing' => 'Мөхәррирләү',
-'prefs-edit-boxsize' => 'Мөхәррирләү бите дәүмәле',
 'rows' => 'Юлдар:',
 'columns' => 'Бағаналар:',
 'searchresultshead' => 'Эҙләү',
@@ -1252,9 +1307,8 @@ $1",
 'recentchangesdays-max' => 'Иң күбендә $1 {{PLURAL:$1|көн}}',
 'recentchangescount' => 'Ғәҙәттә күрһәтелгән үҙгәртеүҙәр һаны:',
 'prefs-help-recentchangescount' => 'Һуңғы үҙгәртеүҙәрҙе, биттәр тарихын, журналдарҙы үҙ эсенә ала.',
-'prefs-help-watchlist-token' => 'Был юлды серле асҡыс менән тултырыу, күҙәтеү исемлегегеҙ өсөн RSS-таҫма яһаясаҡ.
-Был юлдағы асҡысты белгән һәр кем, күҙәтеү исемлегегеҙҙе уҡый аласаҡ, шуның өсөн ышаныслы ҡиммәт һайлағыҙ.
-Осраҡлы рәүештә һайланған ҡиммәтте лә ҡуллана алаһығыҙ: $1',
+'prefs-help-watchlist-token2' => 'Был - күҙәтеүҙәрегеҙ исемлегенең веб-каналы өсөн йәшерен асҡыс.
+Уны белеүселәр күҙәтеүҙәрегеҙ исемлеген уҡый аласаҡ, шуға уны бер кемгә лә әйтмәгеҙ. [[Special:ResetTokens|Уны ташларға теләһәгеҙ, ошонда баҫығыҙ]].',
 'savedprefs' => 'Һеҙҙең көйләүҙәрегеҙ һаҡланды.',
 'timezonelegend' => 'Ваҡыт бүлкәте:',
 'localtime' => 'Урындағы ваҡыт:',
@@ -1285,7 +1339,6 @@ $1",
 'prefs-reset-intro' => 'Был битте, көйләүҙәрегеҙҙе ғәҙәттәге көйләүҙәргә ташлатыу өсөн ҡулланып була.
 Раҫлағандан һуң ғәмәлде кире ҡайтарып булмаясаҡ.',
 'prefs-emailconfirm-label' => 'Электрон почтаны раҫлау:',
-'prefs-textboxsize' => 'Мөхәррирләү тәҙрәһе дәүмәле',
 'youremail' => 'Электрон почта *',
 'username' => '{{GENDER:$1|Ҡулланыусы исеме}}:',
 'uid' => '{{GENDER:$1|Ҡатнашыусы}} номеры:',
@@ -1320,6 +1373,8 @@ $1",
 'prefs-dateformat' => 'Ваҡыт форматы',
 'prefs-timeoffset' => 'Ваҡыт күсереү:',
 'prefs-advancedediting' => 'Дөйөм көйләүҙәр',
+'prefs-editor' => 'мөхәррир',
+'prefs-preview' => 'алдан байҡау',
 'prefs-advancedrc' => 'Киңәйтелгән көйләүҙәр',
 'prefs-advancedrendering' => 'Киңәйтелгән көйләүҙәр',
 'prefs-advancedsearchoptions' => 'Киңәйтелгән көйләүҙәр',
@@ -1328,6 +1383,7 @@ $1",
 'prefs-displaysearchoptions' => 'Күренеш көйләүҙәре',
 'prefs-displaywatchlist' => 'Күренеш көйләүҙәре',
 'prefs-diffs' => 'Айырмалар',
+'prefs-help-prefershttps' => 'Был көйләү системаға киләһе танылыуҙан һуң ҡулланыласаҡ.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mail адрес дөрөҫ булғанға оҡшаған',
@@ -1354,6 +1410,8 @@ $1",
 'userrights-notallowed' => 'Һеҙгә ҡатнашыусыларҙың хоҡуҡтарын өҫтәргә йәки юҡ итергә рөхсәт ителмәгән.',
 'userrights-changeable-col' => 'Һеҙ үҙгәртә алған төркөмдәр',
 'userrights-unchangeable-col' => 'Һеҙ үҙгәртә алмаған төркөмдәр',
+'userrights-conflict' => 'Ҡатнашыусының хоҡуҡтарын үҙгәртеү яраманы! Зинһар, үҙгәрештәрҙе тикшерегеҙ һәм яңынан индерегеҙ.',
+'userrights-removed-self' => 'Һеҙ үҙ хоҡуҡтарығыҙҙы уңышлы юҡ иттегеҙ. Шулай итеп, был биткә башҡаса инә алмаясаҡһығыҙ.',
 
 # Groups
 'group' => 'Төркөм:',
@@ -1419,11 +1477,20 @@ $1",
 'right-proxyunbannable' => 'Прокси серверҙарҙы авто-бикләүҙе урап үтеү',
 'right-unblockself' => 'Үҙ бигеңде асырға',
 'right-protect' => 'Биттәрҙең һаҡланыу кимәлен үҙгәртеү һәм баҫҡыслап һаҡланған биттәрҙе төҙәтеү',
-'right-editprotected' => 'Һаҡланған биттәрҙе мөхәррирләү(эҙмә-эҙлекле һаҡлауһыҙ)',
+'right-editprotected' => '"{{int:protect-level-sysop}}" булараҡ һаҡланған биттәрҙе төҙәтеү',
+'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}" булараҡ һаҡланған биттәрҙе төҙәтеү',
 'right-editinterface' => 'Ҡулланыусы интерфейсын үҙгәртеү',
 'right-editusercssjs' => 'Башҡа ҡатнашыусыларҙың CSS һәм JS файлдарын мөхәррирләү',
 'right-editusercss' => 'Башҡа ҡатнашыусыларҙың CSS файлдарын мөхәррирләү',
 'right-edituserjs' => 'Башҡа ҡатнашыусыларҙың JS файлдарын мөхәррирләү',
+'right-editmyusercss' => 'Файҙаланыусының CSS файлдарын мөхәррирләү',
+'right-editmyuserjs' => 'Үҙеңдең файҙаланыуҙағы JavaScript-файлдарын мөхәррирләргә',
+'right-viewmywatchlist' => 'Үҙеңдең күҙәтеү исемлеген ҡарарға',
+'right-editmywatchlist' => 'Үҙеңдең күҙәтеү исемлеген мөхәррирләргә.
+Ҡайһы бер ғәмәлдәрҙең, быға хоҡуғы булмаһа ла, биттәр өҫтәүенә иғтибар итегеҙ.',
+'right-viewmyprivateinfo' => 'Үҙеңдең шәхси мәғлүмәттәреңде (мәҫәлән, электрон почта адресын, ысын исемеңде) байҡау',
+'right-editmyprivateinfo' => 'Үҙ шәхси мәғлүмәттәреңде (мәҫәлән, электрон почта адресын, ысын исемеңде) төҙәтеү',
+'right-editmyoptions' => 'Үҙ өҫтөнлөктәреңде мөхәррирләргә',
 'right-rollback' => 'Ниндәйҙер битте мөхәррирләгән һуңғы ҡатнашыусының үҙгәртеүҙәрен тиҙ кире алыу',
 'right-markbotedits' => 'Кире алынған үҙгәртеүҙәрҙе бот үҙгәртеүе тип билдәләү',
 'right-noratelimit' => 'Тиҙлек сикләнмәгән',
@@ -1485,12 +1552,19 @@ $1",
 'action-userrights-interwiki' => 'Ҡатнашыусыларҙың башҡа Викиларҙағы хоҡуҡтарын үҙгәртеү',
 'action-siteadmin' => 'Мәғлүмәттәр базаһын асыу һәм ябыу',
 'action-sendemail' => 'электрон хат ебәреү',
+'action-editmywatchlist' => 'һеҙҙең күҙәтеүҙәр исемелеген мөхәррирләү',
+'action-viewmywatchlist' => 'һеҙҙең күҙәтеүҙәр исемлеген байҡау',
+'action-viewmyprivateinfo' => 'һеҙҙең шәхси мәғлүмәтте байҡау',
+'action-editmyprivateinfo' => 'һеҙҙең шәхси мәғлүмәтте мөхәррирләү',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|үҙгәртеү|үҙгәртеү}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|һеҙҙең һуңғы визит}}',
+'enhancedrc-history' => 'тарих',
 'recentchanges' => 'Һуңғы үҙгәртеүҙәр',
 'recentchanges-legend' => 'Һуңғы үҙгәртеүҙәр көйләүҙәре',
 'recentchanges-summary' => 'Төрлө биттәрҙә эшләнгән һуңғы үҙгәртеүҙәр исемлеге',
+'recentchanges-noresult' => 'Был осорҙа тейешле шарттарға тап килгән үҙгәрештәр юҡ.',
 'recentchanges-feed-description' => 'Был таҫмалағы һуңғы үҙгәртеүҙәрҙе күҙәтеп барырға',
 'recentchanges-label-newpage' => 'Был үҙгәртеү яңы бит яһаны',
 'recentchanges-label-minor' => 'Был әҙ үҙгәреш',
@@ -1527,7 +1601,6 @@ $1",
 'recentchangeslinked-feed' => 'Бәйле үҙгәртеүҙәр',
 'recentchangeslinked-toolbox' => 'Бәйле үҙгәртеүҙәр',
 'recentchangeslinked-title' => '"$1" битенә бәйле үҙгәртеүҙәр',
-'recentchangeslinked-noresult' => 'Күрһәтелгән арауыҡта бәйле биттәрҙә үҙгәртеүҙәр булмаған.',
 'recentchangeslinked-summary' => "Был күрһәтелгән бит һылтанма яһаған (йәки күрһәтелгән категорияға кергән) һуңғы үҙгәртеүҙәр исемлеге.
 [[Special:Watchlist|Күҙәтеү исемлегегеҙгә]] керә торған биттәр '''ҡалын''' итеп күрһәтелгән.",
 'recentchangeslinked-page' => 'Бит исеме:',
@@ -1539,7 +1612,7 @@ $1",
 'reuploaddesc' => 'Тейәү формаһына кире ҡайтырға',
 'upload-tryagain' => 'Файлдың үҙгәртелгән  тасуирламаһын ебәрергә',
 'uploadnologin' => 'Танылмағанһығыҙ',
-'uploadnologintext' => 'Файлдар тейәү өсөн, һеҙгә [[Special:UserLogin|танылырға]] кәрәк.',
+'uploadnologintext' => 'Серверға файлдар тейәү өсөн һеҙ тейешһегеҙ $1',
 'upload_directory_missing' => 'Тейәү өсөн директория ($1) юҡ йәки веб-сервер уны булдыра алмай.',
 'upload_directory_read_only' => 'Тейәү өсөн директорияға ($1) веб-сервер яҙҙыра алмай.',
 'uploaderror' => 'Тейәү хатаһы',
@@ -1758,7 +1831,6 @@ $1',
 'http-read-error' => 'HTTP уҡыу хатаһы.',
 'http-timed-out' => 'HTTP-һорауҙы көтөү ваҡыты үтте.',
 'http-curl-error' => 'URL адрес буйынса мөрәжәғәт итеү хатаһы: $1',
-'http-host-unreachable' => 'URL адрес буйынса мөрәжәғәт итеү мөмкин түгел.',
 'http-bad-status' => 'HTTP-һорауҙы эшкәрткән ваҡытта ҡыйынлыҡтар тыуҙы: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1790,6 +1862,10 @@ $1',
 'listfiles_size' => 'Күләм',
 'listfiles_description' => 'Тасуирлау',
 'listfiles_count' => 'Версиялар',
+'listfiles-show-all' => 'Рәсемдәрҙең иҫке версияларын индерергә',
+'listfiles-latestversion' => 'Ағымдағы версия',
+'listfiles-latestversion-yes' => 'Эйе',
+'listfiles-latestversion-no' => 'Юҡ',
 
 # File description page
 'file-anchor-link' => 'Файл',
@@ -1886,6 +1962,13 @@ $1',
 'randompage' => 'Осраҡлы мәҡәлә',
 'randompage-nopages' => 'Түбәндәге {{PLURAL:$2|исемдәр арауығында|исемдәр арауыҡтарында}} биттәр юҡ: $1.',
 
+# Random page in category
+'randomincategory' => 'Категориялағы осраҡлы бит',
+'randomincategory-invalidcategory' => '$1 тигән категория юҡ.',
+'randomincategory-nopages' => '[[:Category:$1|$1]] категорияһында биттәр юҡ.',
+'randomincategory-selectcategory' => '$1 $2 категорияһынан осраҡлы биткә күсергә.',
+'randomincategory-selectcategory-submit' => 'Күсергә',
+
 # Random redirect
 'randomredirect' => 'Осраҡлы биткә күсеү',
 'randomredirect-nopages' => '"$1" исемдәр арауығында йүнәлтеүҙәр юҡ.',
@@ -1911,17 +1994,13 @@ $1',
 'statistics-users-active-desc' => 'Һуңғы {{PLURAL:$1|көндә|$1 көндә}} ниндәйҙер эшмәкәрлек башҡарған ҡатнашыусылар',
 'statistics-mostpopular' => 'Иң күп ҡаралған биттәр',
 
-'disambiguations' => 'Күп мәғәнәле төшөнсәләр биттәренә һылтанған биттәр',
-'disambiguationspage' => 'Template:Күп_мәғәнәлелек',
-'disambiguations-text' => "Киләһе биттәрҙә кәмендә бер '''күп мәғәнәле биттәргә''' һылтанма бар.
-Бының урынына улар фәҡәт үҙенә кәрәкле мәҡәләгә һылтанырға тейеш.<br />
-Әгәр биттә исеме [[MediaWiki:Disambiguationspage]] битендә күрһәтелгән ҡалып ҡулланылһа, ул күп мәғәнәле тип иҫәпләнә.",
-
 'pageswithprop' => 'Үҙенсәлектәре ҡайтанан билдәләнгән биттәр',
 'pageswithprop-legend' => 'Үҙенсәлектәре ҡайтанан билдәләнгән биттәр',
 'pageswithprop-text' => 'Бында айырым үҙенсәлектәре ҡулдан яңыртып билдәләнгән биттәр һанала.',
 'pageswithprop-prop' => 'Үҙенсәлектең атамаһы:',
 'pageswithprop-submit' => 'Табырға',
+'pageswithprop-prophidden-long' => 'Текст үҙенсәлегенең оҙон мәғәнәһе йәшерелгән ($1)',
+'pageswithprop-prophidden-binary' => 'ике тармаҡлы үҙенсәлектең мәғәнәһе йәшерелгән ($1)',
 
 'doubleredirects' => 'Икеле йүнәлтеүҙәр',
 'doubleredirectstext' => 'Был биттә икенсе йүнәлтеү биттәренә йүнәлткән биттәр исемлеге килтерелгән.
@@ -1980,6 +2059,7 @@ $1',
 'mostrevisions' => 'Иң күп үҙгәртеү яһалған биттәр',
 'prefixindex' => 'Исемдәре башында ҡушымта торған биттәр',
 'prefixindex-namespace' => 'Префикслы бар биттәр ( $1 исемдәр арауығы)',
+'prefixindex-strip' => 'Һөҙөмтәләр исемлегендә префиксты йәшерергә',
 'shortpages' => 'Ҡыҫҡа биттәр',
 'longpages' => 'Оҙон биттәр',
 'deadendpages' => 'Көрсөк биттәр',
@@ -1995,6 +2075,7 @@ $1',
 'listusers' => 'Ҡатнашыусылар исемлеге',
 'listusers-editsonly' => 'Кәмендә бер үҙгәртеү индергән ҡатнашыусыларҙы ғына күрһәтергә',
 'listusers-creationsort' => 'Булдырыу көнө буйынса тәртипкә килтерергә',
+'listusers-desc' => 'Кәмеү буйынса айырырға',
 'usereditcount' => '$1 {{PLURAL:$1|үҙгәртеү}}',
 'usercreated' => '$3 ҡулланыусыһының теркәлеү ваҡыты: $1 $2',
 'newpages' => 'Яңы биттәр',
@@ -2171,10 +2252,9 @@ $1',
 'unwatchthispage' => 'Күҙәтеүҙе туҡтатырға',
 'notanarticle' => 'Мәҡәлә түгел',
 'notvisiblerev' => 'Башҡа ҡатнашыусы тарафынан керетелгән һуңғы өлгө юйылған',
-'watchnochange' => 'Күрһәтелгән арауыҡта күҙәтеүҙәр исемлегенән бер ни ҙә үҙгәрмәгән.',
 'watchlist-details' => 'Һеҙҙең күҙәтеү исемлегегеҙҙә, фекерләшеү биттәрен һанамағанда, {{PLURAL:$1|$1 бит}} бар.',
-'wlheader-enotif' => '* Электрон почта аша белдереү һайланған',
-'wlheader-showupdated' => "* Һеҙҙең аҙаҡҡы кереүегеҙҙән һуң үҙгәргән биттәр '''ҡалын''' шрифт менән күрһәтелгән.",
+'wlheader-enotif' => 'Электрон почта аша белдереү индерелгән.',
+'wlheader-showupdated' => "Һеҙҙең аҙаҡҡы кереүегеҙҙән һуң үҙгәргән биттәр '''ҡалын''' шрифт менән күрһәтелгән.",
 'watchmethod-recent' => 'күҙәтелгән биттәр өсөн аҙаҡҡы үҙгәртеүҙәрҙе ҡарау',
 'watchmethod-list' => 'аҙаҡҡы үҙгәртеүҙәр өсөн күҙәтелгән биттәрҙе ҡарау',
 'watchlistcontains' => 'Һеҙҙең күҙәтеү исемлегендә $1 {{PLURAL:$1|бит|бит}}бар.',
@@ -2426,7 +2506,7 @@ $1',
 'contributions' => '{{GENDER:$1|Ҡатнашыусы}} өлөшө',
 'contributions-title' => '$1 исемле ҡулланыусының кереткән өлөшө',
 'mycontris' => 'Өлөш',
-'contribsub2' => '$1 ($2) өсөн',
+'contribsub2' => '{{GENDER:$3|$1}} өлөшө ($2)',
 'nocontribs' => 'Күрһәтелгән шарттарға яуап биргән үҙгәртеүҙәр табылманы.',
 'uctop' => '(ағымдағы)',
 'month' => 'Айҙан башлап (һәм элегерәк):',
@@ -2587,15 +2667,13 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 Әммә ул $2 бикләү арауығына керә һәм был арауыҡтың биге алына ала.',
 'ip_range_invalid' => 'IP адрестар арауығы дөрөҫ түгел.',
 'ip_range_toolarge' => '/$1 арауығынан ҙурыраҡ адрестар арауығын бикләү рөхсәт ителмәй.',
-'blockme' => 'Мине биклә',
 'proxyblocker' => 'Проксины бикләү',
-'proxyblocker-disabled' => 'Был мөмкинлек һүндерелгән.',
 'proxyblockreason' => 'Һеҙҙең IP адресығыҙ бикләнгән, сөнки ул — асыҡ прокси.
 Зинһар, Интернет менән тәъмин итеүсегеҙгә йәки ярҙам хеҙмәтенә мөрәжәғәт итегеҙ һәм уларға был едти хәүефһеҙлек хатаһы тураһында хәбәр итегеҙ.',
-'proxyblocksuccess' => 'Үтәлде',
 'sorbsreason' => 'Һеҙҙең IP адресығыҙ {{SITENAME}} проекты ҡулланған DNSBL исемлегендә асыҡ прокси тип иҫәпләнә.',
 'sorbs_create_account_reason' => 'Һеҙҙең IP адресығыҙ {{SITENAME}} проекты ҡулланған DNSBL исемлегендә асыҡ прокси тип иҫәпләнә.
 Һеҙ иҫәп яҙмаһы булдыра алмайһығыҙ.',
+'xffblockreason' => 'X-Forwarded-For атамаһы эсенә ингән һәм һеҙҙекеме, һеҙ ҡулланған прокси-серверҙыҡымы булған IP-адрес бикләнде. Бикләүҙең тәүсәбәбе ошо ине: $1',
 'cant-block-while-blocked' => 'Үҙегеҙ бикләнгән ваҡытта һеҙ башҡа ҡатнашыусыларҙы бикләй алмайһығыҙ.',
 'cant-see-hidden-user' => 'Һеҙ бикләргә тырышҡан ҡатнашыусы әлеге ваҡытта бикләнгән һәм йәшерелгән.
 Ҡатнашыусыларҙы йәшереү хоҡуғығыҙ булмағанға күрә, һеҙ был бикләүҙе ҡарай йәки үҙгәртә алмайһығыҙ.',
@@ -2757,6 +2835,8 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 'thumbnail-more' => 'Ҙурайтырға',
 'filemissing' => 'Файл юҡ',
 'thumbnail_error' => 'Шартлы рәсем булдырыу хатаһы: $1',
+'thumbnail_error_remote' => '$1 хата тураһында хәбәр итә:
+$2',
 'djvu_page_error' => 'DjVu битенең һаны биттәр һанынан ашҡан',
 'djvu_no_xml' => 'DjVu файлы өсөн XML сығарып булмай',
 'thumbnail-temp-create' => 'Эскиздың ваҡытлыса файлын яһап булмай',
@@ -2981,11 +3061,7 @@ The wiki server cannot provide data in a format your client can read.',
 'pageinfo-category-files' => 'Файлдар һаны',
 
 # Skin names
-'skinname-standard' => 'Классик',
 'skinname-cologneblue' => 'Кёльн һағышы',
-'skinname-myskin' => 'Шәхси',
-'skinname-chick' => 'Себеш',
-'skinname-simple' => 'Ябай',
 'skinname-modern' => 'Заманса',
 'skinname-vector' => 'Векторлы',
 
@@ -3065,11 +3141,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 минут|$1 минут}}',
 'hours' => '{{PLURAL:$1|$1 сәғәт|$1 сәғәт}}',
 'days' => '{{PLURAL:$1|$1 көн|$1 көн}}',
+'weeks' => '{{PLURAL:$1|$1 аҙна|$1 аҙна|}}',
 'months' => '{{PLURAL:$1|$1 ай}}',
 'years' => '{{PLURAL:$1|$1 йыл}}',
 'ago' => '$1 элек',
 'just-now' => 'яңы ғына',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|сәғәт}} элек',
+'minutes-ago' => '$1 {{PLURAL:$1|минут}} элек',
+'seconds-ago' => '$1 {{PLURAL:$1|секунд}} элек',
+'monday-at' => 'дүшәмбе $1',
+'tuesday-at' => 'шишәмбе $1',
+'wednesday-at' => 'шаршамбы $1',
+'thursday-at' => 'кесе йома $1',
+'friday-at' => 'йома $1',
+'saturday-at' => 'шәмбе $1',
+'sunday-at' => 'йәкшәмбе $1',
+'yesterday-at' => 'Кисә $1',
+
 # Bad image list
 'bad_image_list' => 'Формат киләһе рәүештә булырға тейеш:
 
@@ -3097,7 +3187,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Киңлек',
 'exif-imagelength' => 'Бейеклек',
 'exif-bitspersample' => 'Төҫтәрҙең тәрәнлеге',
@@ -3275,7 +3365,7 @@ $1',
 'exif-originalimageheight' => 'Кадрлауға тиклемге рәсем бейеклеге',
 'exif-originalimagewidth' => 'Кадрлауға тиклемге рәсем киңлеге',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ҡыҫылмаған',
 'exif-compression-2' => 'CCITT Group 3, Хаффман сериялары оҙонлоҡтарын кодлауҙың 1 үлсәмле модификацияһы',
 'exif-compression-3' => 'CCITT Group 3, факслы кодлау',
@@ -3667,7 +3757,6 @@ $5
 'version-other' => 'Башҡалар',
 'version-mediahandlers' => 'Медиа эшкәртеүсе ҡоралдар',
 'version-hooks' => 'Эләктереп алыусылар',
-'version-extension-functions' => 'Киңәйтеү функциялары',
 'version-parser-extensiontags' => 'Уҡыу ҡоралдары киңәйтеүҙәре тегтары',
 'version-parser-function-hooks' => 'Уҡыу ҡоралдары функцияларын эләктереп алыусылар',
 'version-hook-name' => 'Эләктереп алыусы исеме',
@@ -3676,6 +3765,7 @@ $5
 'version-license' => 'Рөхсәтнамә',
 'version-poweredby-credits' => "Был вики проект '''[//www.mediawiki.org/ MediaWiki]''' нигеҙендә эшләй, copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'башҡалар',
+'version-poweredby-translators' => 'translatewiki.net тәржемәселәре',
 'version-credits-summary' => '[[Special:Version|MediaWiki]] үҫешенә өлөш индергәндәре өсөн киләһе ҡатнашыусыларға рәхмәт әйтәбеҙ.',
 'version-license-info' => 'MediaWiki — ирекле программа, һеҙ уны Ирекле программалар фонды тарафынан баҫтырылған GNU General Public License рөхсәтнамәһенә ярашлы тарата һәм/йәки үҙгәртә алаһығыҙ (рөхсәтнамәнең йә исенсе өлгөһө, йә унан һуңғы өлгөләре).
 
@@ -3689,12 +3779,17 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'version-entrypoints-header-entrypoint' => 'Инеш урыны',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Файлға юл',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Күсеү',
-'filepath-summary' => 'Был махсус бит файлдың тулы юлын ҡайтара.
-Рәсемдәр тулы асыҡлыҡта күрһәтелә, башҡа файлдар билдәләнгән программалары аша турана-тура асыла.',
+# Special:Redirect
+'redirect' => 'Файлдан, файҙаланыусынан йә версияның тиңләштереүсеһенән артабан йүнәлтеү',
+'redirect-legend' => 'Файлға йәки биткә йүнәлтеү',
+'redirect-summary' => 'Был махсус бит файлға (файлдың исеменән), биткә (версияның тиңләштереүсеһенән) йәки ҡатнашыусының битенә (ҡатнашыусының һанлы тиңләштереүсеһенән) йүнәлтә.',
+'redirect-submit' => 'Күсергә',
+'redirect-lookup' => 'Эҙләү',
+'redirect-value' => 'Мәғәнәһе:',
+'redirect-user' => 'Ҡатнашыусының тиңләштереүсеһе',
+'redirect-revision' => 'Биттең версияһы',
+'redirect-file' => 'Файлдың исеме',
+'redirect-not-exists' => 'Мәғәнәһе табылманы',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Бер иш файлдарҙы эҙләү',
@@ -3744,12 +3839,16 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'tags' => 'Ҡулланылған үҙгәртеү билдәләре',
 'tag-filter' => '[[Special:Tags|Билдәләрҙе]] һайлау:',
 'tag-filter-submit' => 'Һайлау',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Тамғалар}}]]: $2)',
 'tags-title' => 'Билдәләр',
 'tags-intro' => 'Был биттә программа үҙгәртеүҙәрҙе билдәләү өсөн ҡулланған билдәләр һәм уларҙың мәғәнәләре исемлеге килтерелгән.',
 'tags-tag' => 'Билдә исеме',
 'tags-display-header' => 'Үҙгәртеүҙәр исемлегендә күрһәтеү',
 'tags-description-header' => 'Мәғәнәһенең тулы тасуирламаһы',
+'tags-active-header' => 'Әүҙемме?',
 'tags-hitcount-header' => 'Билдәләнгән үҙгәртеүҙәр',
+'tags-active-yes' => 'Эйе',
+'tags-active-no' => 'Юҡ',
 'tags-edit' => 'үҙгәртергә',
 'tags-hitcount' => '$1 {{PLURAL:$1|үҙгәртеү|үҙгәртеү}}',
 
@@ -3770,6 +3869,7 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'dberr-problems' => 'Ғәфү итегеҙ! Был сайтта техник ҡыйынлыҡтар тыуҙы.',
 'dberr-again' => 'Битте бер нисә минуттан яңыртып ҡарағыҙ.',
 'dberr-info' => '(Мәғлүмәттәр базаһы серверы менән тоташтырылып булмай: $1)',
+'dberr-info-hidden' => '(Мәғлүмәт базаларының серверына тоташып булмай)',
 'dberr-usegoogle' => 'Әлегә һеҙ Google ярҙамында эҙләп ҡарай алһығыҙ.',
 'dberr-outofdate' => 'Әммә уның индекстары иҫекргән булыуы мөмкинлеген күҙ уңында тотоғоҙ.',
 'dberr-cachederror' => 'Түбәндә һоралған биттең кэшта һаҡланған өлгөһө күрһәтелгән, унда аҙаҡҡы үҙгәртеүҙәр булмауы мөмкин.',
@@ -3785,6 +3885,9 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'htmlform-submit' => 'Ебәрергә',
 'htmlform-reset' => 'Үҙгәртеүҙәрҙе кире алырға',
 'htmlform-selectorother-other' => 'Башҡа',
+'htmlform-no' => 'Юҡ',
+'htmlform-yes' => 'Эйе',
+'htmlform-chosen-placeholder' => 'Вариант һайлағыҙ',
 
 # SQLite database support
 'sqlite-has-fts' => '$1, тулы текст буйынса эҙләү мөмкинлеге менән',
@@ -3902,4 +4005,19 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 # Image rotation
 'rotate-comment' => 'Рәсем сәғәт йөрөшө буйынса $1{{PLURAL:$1|}} градусҡа боролдо',
 
+# Limit report
+'limitreport-title' => 'Анализатор мәғлүмәттәре:',
+'limitreport-cputime' => 'Процессорҙың ваҡытын ҡулланыу',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|секунд}}',
+'limitreport-walltime' => 'Ғәмәлдәге ваҡыт режимында ҡулланыу',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунд}}',
+'limitreport-ppvisitednodes' => 'Процессор инеп ҡараған төйөндәр һаны',
+'limitreport-ppgeneratednodes' => 'Процессор эшләп сығарған төйөндәр һаны',
+'limitreport-postexpandincludesize' => 'Асылған өлөштәр һаны',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт}}',
+'limitreport-templateargumentsize' => 'Ҡалып аргументының үлсәмдәре',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт}}',
+'limitreport-expansiondepth' => 'Киңәйеүҙең иң ҙур тәрәнлеге',
+'limitreport-expensivefunctioncount' => 'Анализаторҙың "ҡиммәтле" функцияларының һаны',
+
 );
diff --git a/languages/messages/MessagesBar.php b/languages/messages/MessagesBar.php
index b14dedf2..1277b9a4 100644
--- a/languages/messages/MessagesBar.php
+++ b/languages/messages/MessagesBar.php
@@ -89,9 +89,6 @@ $messages = array(
 'tog-shownumberswatching' => "D' Åzoi voh dé beówochterden Benutzer åzoang",
 'tog-oldsig' => 'Existente Unterschrift',
 'tog-fancysig' => 'Unterschrift ois Wikitext bhåndln (óne autómaatische Valinkung)',
-'tog-externaleditor' => "An externen Editor ois Standard bnutzen (netter fyr Experten, braucht spezielle Eihstellungen auf'm eigernen Computer)",
-'tog-externaldiff' => "A externs Programm fyr Versionsunterschiad ois Standard bnutzen (netter fyr Experten, dafordert spezielle Eihstellungen auf'm eiganen Computer)",
-'tog-showjumplinks' => '„Wexeln zu“-Links aktivirn',
 'tog-uselivepreview' => 'Live-Vurschau nutzen (dodafyr braucht ma JavaScript) (experimentoy)',
 'tog-forceeditsummary' => 'Warnen, wånn ban Speichern dé Zåmmerfossung fööd',
 'tog-watchlisthideown' => 'Eigerne Beorweitungen in da Beówochtungslisten ausblenden',
@@ -104,6 +101,7 @@ $messages = array(
 'tog-diffonly' => "Zoag beim Versiónsvagleich netter dé Unterschiad und néd d' voiständige Seiten",
 'tog-showhiddencats' => 'Vasteckte Kategorien åzoang',
 'tog-norollbackdiff' => "Unterschiad noch'm Zrucksetzen unterdrucker",
+'tog-useeditwarning' => ' A Warung geem, sofern a zur da Beorweitung geffnate Seiten valossen werd, de ned gspeicherde Änderrungen enthoit.',
 
 'underline-always' => 'oiwei',
 'underline-never' => 'nia',
@@ -289,7 +287,7 @@ $1",
 'pool-queuefull' => 'Poolworteschlång is vói',
 'pool-errorunknown' => 'Unbekånnter Feeler',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Iba {{SITENAME}}',
 'aboutpage' => 'Project:Iba',
 'copyright' => 'Da Inhoid is unter da $1 vafiagbor.',
@@ -299,7 +297,6 @@ $1",
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Huif fias Werkln',
-'edithelppage' => 'Help:Werkln',
 'helppage' => 'Help:Inhoidsvazeichnis',
 'mainpage' => 'Hoamseitn',
 'mainpage-description' => 'Hoamseitn',
@@ -373,15 +370,6 @@ Olle vafiagborn Speziaalseiten san in da [[Special:SpecialPages|Listen voh dé S
 # General errors
 'error' => 'Feeler',
 'databaseerror' => 'Feeler in da Daatenbånk',
-'dberrortext' => "Es is a Daatenbånkfeeler auftreeden!
-Da Grund kå a Prógrammierfeeler seih.
-D' létzde Daatenbånkobfrog wor:
-<blockquote><tt>$1</tt></blockquote>
-aus da Funkzión „<tt>$2</tt>“.
-Dé Daatenbånk hod an Feeler „<tt>$3: $4</tt>“ gmödt.",
-'dberrortextcl' => "Tschuidigung! Es hod an Syntaxfeeler in da Daatenbånkobfrog geem.
-D' letzte Daatenbånkobfrog hod  „$1“ aus da Funkzion „<tt>$2</tt>“ glautt.
-De Daatenbånk möidt 'n Feeler: „<tt>$3: $4</tt>“.",
 'laggedslavemode' => "'''Ochtung:''' De åzoagte Seiten kunnterd unter Umständ ned d' letzden Beorweitungen enthoiden.",
 'readonly' => 'Daatenbånk gsperrd',
 'enterlockreason' => 'Bittscheh gib an Grund å, warum de Daatenbånk gsperrd wern soi und a Obschätzung ywer de Dauer voh da Sperrung',
@@ -432,7 +420,6 @@ Bittscheh vasuachs in a por Minunten nuamoi.',
 'editinginterface' => "'''Ówocht:''' Dé Seiten do enthoit voh da MediaWiki-Software gnutzden Text. 
 Änderrungen auf derer Seiten wirken sé auf d' Benutzerówerflächen aus.
 Ziag bittscheh im Foi voh Ywersétzungen in Betrocht, dé bei [//translatewiki.net/wiki/Main_Page?setlang=de translatewiki.net], da Lókaalisiarungsblottform fyr MediaWiki, durchzfyrn.",
-'sqlhidden' => '(SQL-Obfrog vastéckt)',
 'cascadeprotected' => "Dé Seiten is zua da Beorweitung gsperrd worn. Sie is in d' {{PLURAL:$1|fóigande Seiten|fóiganden Seiten}} eihbunden, dé mid da Kaskaadensperrópzión gschytzd {{PLURAL:$1|is|san}}:
 $2",
 'namespaceprotected' => "Du host néd d' daforderliche Berechtigung, Seiten im Náumensraum '''$1''' b'orweiden z' kenner.",
@@ -455,7 +442,6 @@ Beochtt ower, daas oanige Seiten noh åzoang kennern, daas du ågmödt bist, só
 'yourpassword' => 'Passwort:',
 'yourpasswordagain' => 'Es Passwort no amoi eigebm',
 'remembermypassword' => 'Mitm Brausa dauahoft ogmejd bleibm (maximoi $1 {{PLURAL:$1|Dog|Dog}})',
-'securelogin-stick-https' => "Noch'm Auhmöden mid HTTPS vabunden bleim",
 'yourdomainname' => 'Eanerne Domain:',
 'externaldberror' => 'Entweder es ligt a Feeler bai da externen Authentifiziarung vur oder du derfst dai externs Benytzerkonto ned aktualisirn.',
 'login' => 'Eilogga',
@@ -615,6 +601,8 @@ Bittschee ibaleg da genau, obs sinnvoi is de Seitn ozlegn.
 Des Lesch- und Vaschiab-Logbuach dazua findsd do:",
 'moveddeleted-notice' => 'De Seitn do is glescht worn. Es foigt a Auszug ausm Lesch- und Vaschiabungs-Logbuch vo dea Seitn.',
 'edit-conflict' => 'Konflikt ban Beorwaten.',
+'editwarning-warning' => "'s Valossen vo derer Seiten kå dodazua fyrn, daas d' Änderrungen valurn geengan.
+Ois ågmödter Benutzer kå's Åzoang vo derer Warnung im \"Beorweiten\"-Bereich vo de Eistellungen obgschoiden wern.",
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => 'Obocht: De Gress vo eibundne Vorlong is z gross.
@@ -739,7 +727,6 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
 'mypreferences' => 'Mei Preferenz',
 'changepassword' => 'Posswort ändern',
 'prefs-editing' => 'Beorweiten',
-'prefs-edit-boxsize' => 'Gress vom Beorweitungsfenster',
 'rows' => 'Zeiln:',
 'columns' => 'Spoiten',
 'searchresultshead' => 'Suachen',
@@ -843,7 +830,6 @@ Stand: $4, $5 Uhr.",
 'recentchangeslinked-feed' => 'Valinkts priaffm',
 'recentchangeslinked-toolbox' => 'Endarunga af valinktn Seitn',
 'recentchangeslinked-title' => 'Endarunga wo vo „$1“ valinkt san',
-'recentchangeslinked-noresult' => 'Im ausgwejtn Zeidraum san an dena valinkdn Seitn koane Endarunga vorgnumma worn.',
 'recentchangeslinked-summary' => "Des is a Listn vo de letztn Endarunga af Seitn, de wo vo ana bstimmtn Seitn valinkt san (bzw. za ana bstimmtn Kategorie ghean).
 Seitn af [[Special:Watchlist|deina Beobochtungslistn]] san '''fett'''.",
 'recentchangeslinked-page' => 'Seitn:',
@@ -973,12 +959,6 @@ A [[Special:WhatLinksHere/$2|voiständige Listn]] gibt's aa.",
 'statistics-views-total' => 'Seitenaufruaff gsåmmt',
 'statistics-mostpopular' => 'Dé am moastbsuachten Seiten',
 
-'disambiguationspage' => 'Template:Begriffsklearung',
-'disambiguations-text' => "D' fóigernden Seiten valinken af a Seiten za ner Begiefsklärung. Du sóiderst stott dém af d' oagerntlich gmoahde Seiten valinken.
-
-A Seiten gijt ois Begriefsklärungsseiten, waunns oane vah dé af [[MediaWiki:Disambiguationspage]] afgfyrde Vurloog(ng) eihbindt.</br>
-Links as Naumensraim wern do néd afglistt.",
-
 'doubleredirects' => 'Doppede Weiderloatungen',
 
 'brokenredirects-edit' => 'werkeln',
@@ -1143,10 +1123,9 @@ Waunnst dé Seiten wieder voh deiner Beówochtungslisten weggerddoah mechst, dru
 'unwatchthispage' => 'Nimmer beówochten',
 'notanarticle' => 'Koah Seiten',
 'notvisiblerev' => 'Versión is gléschd worn',
-'watchnochange' => 'Koahne dé voh dir beówochterden Seiten san wärnd dém auhzoagten Zeidraum beorwatt worn.',
 'watchlist-details' => 'Du beoochst {{PLURAL:$1|$1 Seitn}}, Dischkriaseitn ned mitgrechnad',
-'wlheader-enotif' => '* Da E-Mail-Benoochrichtigungsdeanst is aktivierd.',
-'wlheader-showupdated' => "* Seiten mid noh néd gseengne Änderrungen wern '''fett''' dorgstöd.",
+'wlheader-enotif' => 'Da E-Mail-Benoochrichtigungsdeanst is aktivierd.',
+'wlheader-showupdated' => "Seiten mid noh néd gseengne Änderrungen wern '''fett''' dorgstöd.",
 'watchmethod-recent' => "Ywerpriaff d' létzden Beorwatungen fyr d' Beówochtungslisten",
 'watchmethod-list' => 'Ywerpriaffm voh da Beówochtungslisten auf létzde Beorwatungen',
 'watchlistcontains' => 'Deih Beówochtungslisten enthoitt $1 {{PLURAL:$1|Seiten|Seiten}}.',
@@ -1581,7 +1560,7 @@ Weidane wean standardmassi ned ozoagt.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-gpsspeed' => 'Gschwindigkeid vom GPS-Empfänger',
 
 'exif-componentsconfiguration-0' => 'Gibts néd',
@@ -1668,7 +1647,6 @@ Bittscheh d' noraale Vurschau bnutzen.",
 'version-other' => 'Ånders',
 'version-mediahandlers' => 'Meediennutzung',
 'version-hooks' => "Schnidstön ''(Hooks)''",
-'version-extension-functions' => 'Funkziónsaufruaffe',
 'version-parser-extensiontags' => "Parserdaweiterrungen ''(tags)''",
 'version-parser-function-hooks' => 'Parserfunkziónen',
 'version-hook-name' => 'Schnidstönnaum',
diff --git a/languages/messages/MessagesBbc.php b/languages/messages/MessagesBbc.php
new file mode 100644
index 00000000..e5072e9c
--- /dev/null
+++ b/languages/messages/MessagesBbc.php
@@ -0,0 +1,12 @@
+<?php
+/** Batak Toba (Batak Toba)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ * @comment falls back to Batak Toba (Latin)
+ */
+
+$fallback = 'bbc-latn';
diff --git a/languages/messages/MessagesBbc_latn.php b/languages/messages/MessagesBbc_latn.php
new file mode 100644
index 00000000..f70e65e0
--- /dev/null
+++ b/languages/messages/MessagesBbc_latn.php
@@ -0,0 +1,734 @@
+<?php
+/** Batak Toba (Batak Toba)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Daniel Harahap
+ * @author Marvel manalu
+ * @author Naval Scene
+ * @author Stephensuleeman
+ * @author WBT001Erin
+ * @author WBT003Bugari
+ * @author WBT004Togu
+ * @author WBT006Hendra
+ * @author WBT009Anju
+ */
+
+$fallback = 'id';
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'Ondolhon panait',
+'tog-justify' => 'Padasip paragrap',
+'tog-hideminor' => 'Tabunihon editing na metmet di parubaan na imbaru',
+'tog-hidepatrolled' => 'Bunihon panotaan na metmet di parubaan na imbaru',
+'tog-numberheadings' => 'Bahen nomor judul otomatis',
+'tog-showtoolbar' => 'Pataridahon molo ula-ula haubaon',
+'tog-editondblclick' => 'Klik dua hali laho patotahon alaman (ringkot do JavaScript)',
+'tog-minordefault' => 'Tandai sude panotaan na metmet songon naung dipamasa',
+'tog-previewontop' => 'Patuduon preview andorang so kotak edit',
+'tog-previewonfirst' => 'Patudu pratayang di panotaan na parjolo',
+'tog-enotifwatchlistpages' => 'Tongoshon tu ahu surat elektronik molo muba sada alaman na humanat-manati',
+'tog-enotifusertalkpages' => 'Tongoshon tu ahu surat elektronik molo muba alaman panghataionku',
+'tog-enotifminoredits' => 'Tong ma tongoshon surat elektronik tu ahu diparubaan na metmet',
+'tog-enotifrevealaddr' => 'Papatar alamat surat elektronikku tikki notifikasi surat elektronik',
+'tog-shownumberswatching' => 'Patuduhon godang ni pamareso',
+'tog-oldsig' => 'Tandatangani saonari:',
+'tog-forceeditsummary' => 'Paingot ahu molo bongot tu poti panotaan na rumar',
+'tog-watchlisthideown' => 'Bunihon na hupatota sian pamareso',
+'tog-showhiddencats' => 'Papatar angka kategori na buni',
+
+'underline-always' => 'Tongtong',
+'underline-never' => 'Ndang hea masa',
+
+# Dates
+'sunday' => 'Ari Minggu',
+'monday' => 'Ari Senen',
+'tuesday' => 'Ari Selasa',
+'wednesday' => 'Ari Rabu',
+'thursday' => 'Ari Kamis',
+'friday' => 'Ari Jumat',
+'saturday' => 'Ari Sabtu',
+'sun' => 'Mgg',
+'mon' => 'Snn',
+'tue' => 'Sls',
+'wed' => 'Rb',
+'thu' => 'Kms',
+'fri' => 'Jmt',
+'sat' => 'Sbt',
+'january' => 'Sipaha Sampulu',
+'february' => 'Li',
+'march' => 'Hurung',
+'april' => 'Sipaha Sada',
+'may_long' => 'Sipaha Dua',
+'june' => 'Sipaha Tolu',
+'july' => 'Sipaha Opat',
+'august' => 'Sipaha Lima',
+'september' => 'Sipaha Onom',
+'october' => 'Sipaha Pitu',
+'november' => 'Sipaha Uwalu',
+'december' => 'Sipaha Sia',
+'january-gen' => 'Sipaha Sampulu',
+'february-gen' => 'Li',
+'march-gen' => 'Hurung',
+'april-gen' => 'Sipaha Sada',
+'may-gen' => 'Sipaha Dua',
+'june-gen' => 'Sipaha Tolu',
+'july-gen' => 'Sipaha Opat',
+'august-gen' => 'Sipaha Lima',
+'september-gen' => 'Sipaha Onom',
+'october-gen' => 'Sipaha Pitu',
+'november-gen' => 'Sipaha Uwalu',
+'december-gen' => 'Sipaha Sia',
+'jan' => 'Sipaha Sampulu',
+'feb' => 'Li',
+'mar' => 'Hurung',
+'apr' => 'Sipaha Sada',
+'may' => 'Sipaha Dua',
+'jun' => 'Sipaha Tolu',
+'jul' => 'Sipaha Opat',
+'aug' => 'Sipaha Lima',
+'sep' => 'Sipaha Onom',
+'oct' => 'Sipaha Pitu',
+'nov' => 'Sipaha Uwalu',
+'dec' => 'Sipaha Sia',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Horong|Angka horong}}',
+'category_header' => 'Angka alaman di horong "$1"',
+'subcategories' => 'Horong na metmet',
+'category-media-header' => 'Media dibagasan horong  "$1"',
+'category-empty' => '"Ndang adong alaman manang media di horong on nuaeng."',
+'hidden-categories' => '{{PLURAL:$1|Horong na buni|Angka horong na buni}}',
+'hidden-category-category' => 'Kategori na buni',
+'category-subcat-count' => '{{PLURAL:$2|Horong on marisi {{PLURAL:$1|$1 horong na metmet}} sian sude $2.}}',
+'category-article-count' => '{{PLURAL:$2|Horong on marisi {{PLURAL:$1|$1 alaman}}, sian sude $2.}}',
+'category-file-count' => '{{PLURAL:$2|Horong on holan marisi berkas{{PLURAL:$1|$1 alaman}}, sian sude $2.}}',
+'listingcontinuesabbrev' => 'udut.',
+'broken-file-category' => 'Alaman dohot gombaran na sega',
+
+'about' => 'Taringot',
+'article' => 'alaman isi',
+'newwindow' => '(ungkap ni pandiloi na imbaru)',
+'cancel' => 'Sundati',
+'moredotdotdot' => 'Tambai',
+'mypage' => 'Alaman',
+'mytalk' => 'Pangkataion',
+'navigation' => 'Angka ula-ula laho patuduhon dalan dohot luat',
+'and' => '&#32;dohot',
+
+# Cologne Blue skin
+'qbfind' => 'Jumpangi',
+'qbedit' => 'Patota',
+'qbpageoptions' => 'Alaman on',
+'qbmyoptions' => 'Alaman niiba',
+'faq' => 'FAQ',
+'faqpage' => 'Project:FAQ',
+
+# Vector skin
+'vector-action-addsection' => 'Bagian na imbaru',
+'vector-action-delete' => 'Sesa',
+'vector-action-move' => 'Pahusor',
+'vector-action-protect' => 'Ramoti',
+'vector-action-undelete' => 'unang sesa',
+'vector-action-unprotect' => 'Uba parlindungan',
+'vector-view-create' => 'Tompa',
+'vector-view-edit' => 'Paubah',
+'vector-view-history' => 'Patudu andorang na',
+'vector-view-view' => 'Jaha',
+'vector-view-viewsource' => 'Ida haroanna',
+'actions' => 'Pangulahonon',
+'namespaces' => 'Inganan ni goar',
+'variants' => 'Angka ragam',
+
+'errorpagetitle' => 'Sega',
+'returnto' => 'Mulak tu $1.',
+'tagline' => 'Sian {{SITENAME}}',
+'help' => 'Urupi',
+'search' => 'Diori',
+'searchbutton' => 'Diori',
+'go' => 'Laho tu',
+'searcharticle' => 'Laho tu',
+'history' => 'Alaman turiturian',
+'history_short' => 'Angka siingoton',
+'printableversion' => 'versi na boi dicetak',
+'permalink' => 'Pangait na togu',
+'view' => 'Ida',
+'edit' => 'Patota',
+'create' => 'Tompa',
+'editthispage' => 'Patota alaman on',
+'create-this-page' => 'Bahen alaman on',
+'delete' => 'Sesa',
+'deletethispage' => 'Sesa alaman on',
+'undelete_short' => 'Sundat sesa $1 {{PLURAL:$1|panotaan|panotaan}}',
+'protect' => 'Ramoti',
+'protect_change' => 'Pauba',
+'newpage' => 'Alaman na imbaru',
+'talkpage' => 'Hatahon alaman on',
+'talkpagelinktext' => 'Pangkataion',
+'personaltools' => 'Ula-ula ni sasahalak',
+'postcomment' => 'Bagian imbaru',
+'talk' => 'Panghataion',
+'views' => 'Hataridaan',
+'toolbox' => 'Poti ulaula',
+'userpage' => 'Ida alaman ni pamangke',
+'viewhelppage' => 'Ida alaman pangurupion',
+'viewtalkpage' => 'Ida alaman panghataion',
+'otherlanguages' => 'Di bagasan parhataan na asing',
+'redirectedfrom' => '(Ulanghon sian $1)',
+'lastmodifiedat' => 'Alaman on parpudi di uba ari $2, topet $1.',
+'viewcount' => 'Alaman on nungga dibongoti {{PLURAL:$1|sahali|$1 hali}}',
+'protectedpage' => 'Alaman na di jaga',
+'jumpto' => 'Manimbung tu:',
+'jumptonavigation' => 'angka ula-ula laho patuduhon dalan dohot luat',
+'jumptosearch' => 'Diori',
+'pool-timeout' => 'Suda tingki paimahon hincu',
+'pool-errorunknown' => 'Hasalaan na so binoto',
+
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
+'aboutsite' => 'Taringot {{SITENAME}}',
+'aboutpage' => 'Project:Taringot tu',
+'copyright' => 'Sude siguriton rade saguru tu $1.',
+'copyrightpage' => '{{ns:project}}:Hak manopa',
+'currentevents' => 'Na tongon masa',
+'currentevents-url' => 'Project:Na masa nuaeng',
+'disclaimers' => 'Panyakalon',
+'disclaimerpage' => 'Project:Pamorsoon umum',
+'edithelp' => 'Pangurupion laho patotahon',
+'helppage' => 'Help:Isi',
+'mainpage' => 'Pogu ni Alaman',
+'mainpage-description' => 'Pogu ni alaman',
+'portal' => 'Harbangan ni punguan',
+'portal-url' => 'Project:Harbangan ni punguan',
+
+'badaccess-group0' => 'Dang diloas hamu laho mangulahon na pinangidomu',
+
+'ok' => 'OK',
+'retrievedfrom' => 'Dijalo sian "$1"',
+'youhavenewmessages' => 'Adong di ho $1 ($2).',
+'newmessageslink' => 'Tona na imbaru',
+'newmessagesdifflink' => 'Parubaan na parpudi',
+'youhavenewmessagesmulti' => 'Adong tu ho tona na imbaru di $1',
+'editsection' => 'Patota',
+'editold' => 'patota',
+'viewsourceold' => 'Bereng harorona',
+'editlink' => 'Patota',
+'viewsourcelink' => 'Ida ma mual',
+'editsectionhint' => 'Patota ponggol: $1',
+'toc' => 'Isi',
+'showtoc' => 'Papatar',
+'hidetoc' => 'Bunihon',
+'collapsible-collapse' => 'Pagelleng',
+'collapsible-expand' => 'Paherbang',
+'thisisdeleted' => 'Ida manang Paulak $1?',
+'viewdeleted' => 'Ida $1?',
+'page-atom-feed' => 'Pele atom "$1"',
+'red-link-title' => '$1 (alaman naso adong dope)',
+'sort-descending' => 'Pajojor lam toru',
+'sort-ascending' => 'Pajojor lam timbo',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Alaman',
+'nstab-user' => 'Pamangke',
+'nstab-special' => 'Alaman na marhasurungan',
+'nstab-project' => 'Alaman ulaon',
+'nstab-image' => 'Berkas',
+'nstab-mediawiki' => 'Tona',
+'nstab-template' => 'Templat',
+'nstab-help' => 'Alaman pangurupion',
+'nstab-category' => 'Hategori',
+
+# General errors
+'error' => 'Hasesega',
+'fileappenderror' => 'Ndang boi pamasuhon "$1" tu "$2".',
+'badarticleerror' => 'Ulaon on dang boi i ulahon di alaman on',
+'cannotdelete-title' => 'Ndang boi manesa alaman "$1"',
+'badtitle' => 'Ulu ni surat na rumar',
+'viewsource' => 'Ida haroanna',
+'namespaceprotected' => "Ndang diloas hamu laho patotahon alaman di '''$1''' inganan ni goar",
+
+# Virus scanner
+'virus-unknownscanner' => 'Antivirus ndang ditanda:',
+
+# Login and logout pages
+'welcomeuser' => 'Horas, $1 !',
+'yourname' => 'Goar pamangke',
+'userlogin-yourname' => 'Siparhaseang',
+'userlogin-yourname-ph' => 'Pamasuk goarmu',
+'yourpassword' => 'Hata hincu:',
+'userlogin-yourpassword' => 'HAta hinsu',
+'userlogin-yourpassword-ph' => 'Pamasuk hata hinsu',
+'yourpasswordagain' => 'Ulanghon surat hata hincu:',
+'userlogin-remembermypassword' => 'Paingot ahu',
+'password-change-forbidden' => 'Ndang boi ubaonmu hata hincu di wiki on',
+'login' => 'Bongot tu log',
+'nav-login-createaccount' => 'Bongot tu log/ bahen akun',
+'loginprompt' => 'Ikkon dipangolu do "cookies" laho bongot log tu {{SINTENAME}}.',
+'userlogin' => 'Bongot tu log/ bahen akun',
+'userlogout' => 'Haruar log',
+'userlogin-noaccount' => 'Ndang adong akun',
+'userlogin-joinproject' => 'Parsidohot',
+'nologin' => 'Ndang adong akun? $1.',
+'nologinlink' => 'Bahen sada akun',
+'createaccount' => 'Bahen akun na imbaru',
+'gotaccount' => 'Nungga adong akunmu? $1',
+'gotaccountlink' => 'Bongot tu log',
+'helplogin-url' => 'Pangurupion: Masuk tu bagasan',
+'userlogin-helplink' => 'MediaWiki:pangurupion bongot tu bagas',
+'createaccountreason' => 'Alanan',
+'createaccounterror' => 'Ndang boi manopa akun: $1',
+'nouserspecified' => 'Ingkon pamasukonmuna goar ni pamangke',
+'mailmypassword' => 'Tongoshon hata hincu na imbaru',
+'emailnotauthenticated' => 'Alamat ni surat elektronikmuna ndang dope dipareso. Andorang so dipareso ndang boi pangkeonmuna rumang surat elektronik.',
+'emailconfirmlink' => 'Tolopi alamat surat elektronikmuna',
+'emaildisabled' => 'Ndang boi situs on manongos surat elekronik',
+'accountcreated' => 'Akun nunga ditopa',
+'login-abort-generic' => 'Ndang marhasil bongot - Dipaso ma',
+'loginlanguagelabel' => 'Hata: $1',
+
+# Change password dialog
+'resetpass' => 'Pauba hata hinsu',
+'oldpassword' => 'Hata hinsu na leleng',
+'newpassword' => 'Password naimbaru',
+'resetpass-submit-loggedin' => 'Pauba hata hinsu',
+'resetpass-submit-cancel' => 'Sundati',
+'resetpass-temp-password' => 'Hata hinsu parsatongkinan',
+
+# Special:PasswordReset
+'passwordreset-username' => 'Goar pamangke',
+'passwordreset-domain' => 'Domain:',
+
+# Special:ChangeEmail
+'changeemail-none' => '(Ndada)',
+'changeemail-cancel' => 'Sundati',
+
+# Edit page toolbar
+'bold_sample' => 'Surat tobal',
+'bold_tip' => 'Surat na hapal',
+'italic_sample' => 'Guratan Italic',
+'italic_tip' => 'surat teleng',
+'link_sample' => 'Goar ni pangait',
+'link_tip' => 'Pangait di bagasan',
+'extlink_sample' => 'http://www.example.com goar ni pangait',
+'extlink_tip' => 'Pangait parduru (ingot mulai dohot http:// )',
+'headline_sample' => 'Ulu ni surat',
+'nowiki_sample' => 'Pamasuk siguraton na so boi ubaon',
+'media_tip' => 'Pangait ni berkas',
+'sig_tip' => 'Tanda tangan pake pananda tingki',
+'hr_tip' => 'Garis na adar',
+
+# Edit pages
+'minoredit' => 'Panotaan na metmet',
+'watchthis' => 'Parrohahon alaman on',
+'savearticle' => 'Simpan alaman',
+'preview' => 'Andorang pataridahon',
+'showpreview' => 'Patudu pratayang',
+'showdiff' => 'Ida parubahan',
+'anoneditwarning' => "'''Paminsangon:''' Ndang bongot tu log dope hamu.
+Di surathon do alamat IP mu di turiturian ni alaman on.",
+'blockednoreason' => 'ndang adong alana na dilehon',
+'loginreqpagetext' => 'Ingkon $1 do hamu laho mamereng alaman na asing.',
+'accmailtitle' => 'Hata hincu nunga ditongos.',
+'newarticle' => '(Imbaru)',
+'noarticletext' => 'Ndang adong siguriton di alaman on saonari. Parhaseang ma[[Special:Search/{{PAGENAME}}|laho mandiori judul ni alaman on]] di alaman na asing, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mandiori log na mardomu], manang [{{fullurl:{{FULLPAGENAME}}|action=edit}} laho manota alaman on]</span>.',
+'noarticletext-nopermission' => 'Ndang adong siguriton di alaman on saonari. Parhaseang ma[[Special:Search/{{PAGENAME}}|laho mandiori goar ni alaman on]] di alaman na asing, manang <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mandiori angka log na mardomu]</span>, alai dang diloas hamu lahon mamungka alaman on.',
+'previewnote' => "'''Ingot ma holan sada andoramg pataridahon do on.'''
+Parubaan na binahenmu dang di simpan dope!",
+'editing' => 'Manota $1',
+'creating' => 'mambahen',
+'editingsection' => 'Manota $1 (ponggol)',
+'templatesused' => '{{PLURAL:$1|Templat|Angka templat}} na diparhaseang di alaman on:',
+'template-protected' => '(dijaga)',
+'template-semiprotected' => '(ndang apala sude diramoti)',
+'hiddencategories' => 'Alaman on ima sada sian {{PLURAL:$1|1 horong na buni|$1 horong na buni}}:',
+'moveddeleted-notice' => 'Alaman on nungnga disesa.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => 'Pinsangpinsang: Lobi do balga ni templat on. Pigapiga templat gabe dipasiding.',
+'post-expand-template-inclusion-category' => 'Angka alaman na balgana lobi',
+
+# History pages
+'viewpagelogs' => 'Pataridahon angka log ni alaman on',
+'currentrev-asof' => 'Panotaan parpudi ni $1',
+'revisionasof' => 'Panotaan songon $1',
+'revision-info' => 'Parubaan ni $1; $2',
+'previousrevision' => '←Revisi andorang na',
+'nextrevision' => 'Panotaan na mangihut→',
+'currentrevisionlink' => 'Panotaan na parpudi',
+'cur' => 'nuaeng',
+'next' => 'udutna',
+'last' => 'andorang',
+'page_first' => 'parjolo',
+'page_last' => 'parpudi',
+'history-show-deleted' => 'Holan na disesa',
+'histfirst' => 'Parjolo sahali',
+'histlast' => 'parpudi sahali',
+
+# Revision feed
+'history-feed-item-nocomment' => '$1 di $2',
+
+# Revision deletion
+'rev-delundel' => 'patarida/tabunihon',
+'rev-showdeleted' => 'Paida',
+'revdelete-log' => 'Alana',
+'revdel-restore' => 'Pauba pardompahan',
+'revdel-restore-deleted' => 'Patota naung di sesa',
+'revdel-restore-visible' => 'revisi na tarbereng',
+
+# Merge log
+'revertmerge' => 'Sundati Pardomuan',
+
+# Diffs
+'lineno' => 'Baris $1:',
+'editundo' => 'Paulak',
+
+# Search results
+'searchresults' => 'Hasil na niluluan',
+'searchresults-title' => 'Hasil mandiori tu "$1"',
+'prevn' => 'andorang so {{PLURAL:$1|$1}}',
+'nextn' => 'Ulaon na naen sitoruson {{PLURAL:$1|$1}}',
+'prevn-title' => 'Andorang so $1 {{PLURAL:$1|hasil|angka hasil}}',
+'nextn-title' => 'Ulaon na naen sitoruson tu $1 {{PLURAL:$1|result|results}}',
+'shown-title' => 'Patuduhon $1 {{PLURAL:$1|hasil|angka hasil}} ganup alaman',
+'viewprevnext' => 'Bereng ($1{{int:pipe-separator}}$2)($3)',
+'searchmenu-exists' => "'''Adong sada alaman na digoari \"[[:\$1]]\" di wiki on.'''",
+'searchmenu-new' => "'''Bahen alaman \"[[:\$1]]\" di wiki on!'''",
+'searchprofile-articles' => 'Alaman isi',
+'searchprofile-project' => 'Alaman pangurupion dohot proyek',
+'searchprofile-images' => 'Akat na godang gunana',
+'searchprofile-everything' => 'Sasude',
+'searchprofile-advanced' => 'Timbul',
+'searchprofile-articles-tooltip' => 'Mandiori di $1',
+'searchprofile-project-tooltip' => 'Mandiori di $1',
+'searchprofile-images-tooltip' => 'Mandiori berkas',
+'searchprofile-everything-tooltip' => 'Mandiori di sude inganan (dohot di alaman panghataion)',
+'searchprofile-advanced-tooltip' => 'Mandiori pake inganan ni goar',
+'search-result-size' => '$1 ({{PLURAL:$2|1 hata|$2 hata}})',
+'search-redirect' => '(ualanghon $1)',
+'search-section' => '(ponggol $1)',
+'search-suggest' => 'On do ra maksudmu: $1',
+'searchrelated' => 'marpandomuan',
+'searchall' => 'sude',
+'showingresultsheader' => "{{PLURAL:$5|Hasil '''$1''' sian '''$3'''|Hasil '''$1 - $2''' sian '''$3'''}} tu '''$4'''",
+'search-nonefound' => 'Ndang adong hasil na suman tu pangidoan',
+'powersearch-toggleall' => 'Sude',
+'powersearch-togglenone' => 'Ndang adong',
+
+# Preferences page
+'mypreferences' => 'Preferensi',
+'searchresultshead' => 'diori',
+'youremail' => 'Tongos surel:',
+'yourrealname' => 'Goar na toho',
+'gender-male' => 'Baoa',
+'gender-female' => 'borua',
+
+# Rights
+'right-read' => 'Manjaha alaman',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Log pamarhaseang na imbaru',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'Patota alaman on',
+
+# Recent changes
+'nchanges' => '$1 {{PLURAL:$1|parubaan}}',
+'recentchanges' => 'Parubahan naimbaru',
+'recentchanges-legend' => 'sipilliton sian parubaan na imbaru',
+'recentchanges-label-newpage' => 'Panotaan on mamungka alaman na imbaru',
+'recentchanges-label-minor' => 'Sada panotaan na metmet',
+'recentchanges-label-bot' => 'Panotaan on diulahon bot',
+'recentchanges-label-unpatrolled' => 'Panotaan on ndang dipamanat dope',
+'rcnote' => "Na di toru on ima {{PLURAL:$1|'''1'''|'''$1'''}} perubaan  di bagasan {{PLURAL:$2|'''1''' ari|'''$2''' ari}} na parpudi, olat ni $4 pukul $5.",
+'rclistfrom' => 'Patuduhon parubaan na imbaru mamungka sian $1',
+'rcshowhideminor' => '$1 panotaan na metmet',
+'rcshowhidebots' => '$1 bot',
+'rcshowhideliu' => '$1 pamarhaseang bongot tu log',
+'rcshowhideanons' => '$1 pamarhaseang ndang margoar',
+'rcshowhidepatr' => '$1 panotaan na dipamanat',
+'rcshowhidemine' => '$1 na hupatota',
+'rclinks' => 'Patuduhon $1 parubaan na imbaru dibagasan na $2 ari on<br />$3',
+'diff' => 'duru',
+'hist' => 'turi',
+'hide' => 'Bunihon',
+'show' => 'Patuduhon',
+'minoreditletter' => 'm',
+'newpageletter' => 'I',
+'boteditletter' => 'b',
+'rc-enhanced-expand' => 'Pataridahon panjamotan (ringkot do JavaScript)',
+'rc-enhanced-hide' => 'Bunihon panjamotan',
+
+# Recent changes linked
+'recentchangeslinked' => 'Angka parubaan na mardomu tu',
+'recentchangeslinked-toolbox' => 'Angka parubaan na mardomu tu',
+'recentchangeslinked-title' => 'Parubaan na mardomu tu "$1"',
+'recentchangeslinked-page' => 'Goar ni alaman:',
+'recentchangeslinked-to' => 'Pataridahon parubaan ni angka alaman na marpandomuan dohot alaman on',
+
+# Upload
+'upload' => 'Tambahon berkas',
+'filedesc' => 'Panimpulan',
+
+'license' => 'Ragam ni lisensi:',
+'license-header' => 'Ragam ni lisensi',
+'nolicense' => 'Ndang adong na i pillit',
+
+# File description page
+'file-anchor-link' => 'Berkas',
+'filehist' => 'Turiturian ni berkas',
+'filehist-help' => 'Piltik di sada tanggal/tingki laho mamereng berkas on di tingki i.',
+'filehist-revert' => 'Sundati',
+'filehist-current' => 'masa nuaeng',
+'filehist-datetime' => 'Pukkul',
+'filehist-thumb' => 'Thumbnail',
+'filehist-thumbtext' => 'Ganaganaan tu versi songon $1',
+'filehist-user' => 'Pamangke',
+'filehist-dimensions' => 'Dimensi',
+'filehist-comment' => 'Hata panambai',
+'imagelinks' => 'Parhaseangon ni berkas',
+'linkstoimage' => '{{PLURAL:$1|alaman pangait|$1 angka alaman na marpangait}} tu berkas on:',
+'nolinkstoimage' => 'Ndang adong alaman na marpangait tu berkas on.',
+'sharedupload-desc-here' => 'Berkas on sian $1 jala olo do diparhaseang angka proyek na asing. Hatorangan na ima [$2 alaman hatoranganna] dipatorang di toru on.',
+
+# Random page
+'randompage' => 'Alaman sursar',
+
+# Statistics
+'statistics' => 'Statistik',
+
+'pageswithprop-submit' => 'Laho tu',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|byte|bites}}',
+'nmembers' => '$1 {{PLURAL:$1|isi|angka isi}}',
+'usercreated' => '{{GENDER:$3|Dipungka}} ari $1 topet $2',
+'newpages' => 'Angka alaman na imbaru',
+'move' => 'Paorot',
+'pager-newer-n' => '{{PLURAL:$1|na imbaru|na imbaru $1}}',
+'pager-older-n' => '{{PLURAL:$1|na leleng|$1 na lumeleng}}',
+
+# Book sources
+'booksources-go' => 'Torushon',
+
+# Special:Log
+'log' => 'Angka log',
+
+# Special:AllPages
+'allpages' => 'Sude alaman',
+'alphaindexline' => '$1 tu $2',
+'allarticles' => 'Sude alaman',
+'allpagessubmit' => 'Torushon',
+
+# Special:Categories
+'categories' => 'Angka horong',
+
+# Special:LinkSearch
+'linksearch-line' => '$1 marpangait sian $2',
+
+# Special:ListGroupRights
+'listgrouprights-members' => '(daftar ni parsidohot)',
+
+# Email user
+'emailuser' => 'Surel pamarhaseang on',
+'emailfrom' => 'Sian',
+'emailto' => 'Tu',
+
+# Watchlist
+'watchlist' => 'Daftar na pinarrohahon',
+'mywatchlist' => 'Daftar na pinarrohahon',
+'watchlistfor2' => 'Laho tu $1 $2',
+'watch' => 'Parrohahon',
+'unwatch' => 'Sundat mamarrohahon',
+'wlshowlast' => 'Pataridahon $1 jom $2 ari $3 na parpudi',
+
+# Delete
+'actioncomplete' => 'Sae ulaon',
+'actionfailed' => 'Ulaon sundat',
+'dellogpage' => 'Log pasesaan',
+
+# Rollback
+'rollbacklink' => 'Paundur',
+
+# Protect
+'protectlogpage' => 'Log panghokhop',
+'protectedarticle' => 'manjaga "[[$1]]"',
+
+# Undelete
+'undeletelink' => 'Ida/paulak',
+'undeleteviewlink' => 'Ida',
+'undelete-show-file-submit' => 'Olo',
+
+# Namespace form on various pages
+'namespace' => 'Inganan ni goar:',
+'invert' => 'Paulak napinillit',
+'blanknamespace' => '(Rumingkot)',
+
+# Contributions
+'contributions' => 'Na niula {{GENDER:$1|pamarhaseang}}',
+'mycontris' => 'Angka silua',
+'contribsub2' => 'Laho tu $1 ($2)',
+'uctop' => 'di ginjang',
+'month' => 'Sian bulan (dohot andorang na)',
+'year' => 'Sian taon (dohot andorang na):',
+
+'sp-contributions-blocklog' => 'olati log',
+'sp-contributions-logs' => 'log',
+'sp-contributions-talk' => 'Pangkataion',
+'sp-contributions-username' => 'Alamat IP manang goar:',
+'sp-contributions-toponly' => 'Pataridahon holan panotaan parginjang',
+'sp-contributions-submit' => 'Diori',
+
+# What links here
+'whatlinkshere-title' => 'Angka alaman na marpangait tu "$1"',
+'whatlinkshere-page' => 'Alaman:',
+'linkshere' => "Angka alaman on marpangait tu '''[[:$1]]''':",
+'nolinkshere' => "Ndang adong alaman na marpangait tu '''[[:$1]]'''.",
+'isimage' => 'pangait berkas',
+'whatlinkshere-prev' => '{{PLURAL:$1|andorang so $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|udut na|udut na $1}}',
+'whatlinkshere-links' => '← angka pangait',
+'whatlinkshere-hideredirs' => '$1 manguba dalan',
+'whatlinkshere-hidelinks' => '$1 pangait',
+'whatlinkshere-hideimages' => '$1 pangait berkas',
+'whatlinkshere-filters' => 'Saringan',
+
+# Block/unblock
+'ipboptions' => '2 jom:2 hours,1 ari:1 day,3 ari:3 days,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 taon:1 year,salelengna:infinite',
+'ipblocklist' => 'Angka pamarhaseang na diolati',
+'blocklink' => 'ambati',
+'unblocklink' => 'Pamago Blokir',
+'change-blocklink' => 'Paubah blokir',
+'contribslink' => 'silehon-lehon',
+'blocklogpage' => 'Olati log',
+'block-log-flags-nocreate' => 'Ndang boi mamungka akun',
+
+# Move page
+'move-page-legend' => 'Papinda alaman',
+'movelogpage' => 'Log paorothon',
+'revertmove' => 'Sundati',
+
+# Export
+'export' => 'Ekspor alaman',
+
+# Namespace 8 related
+'allmessagesname' => 'Goar',
+'allmessages-filter-submit' => 'Laho tu',
+
+# Thumbnails
+'thumbnail-more' => 'Paheba',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Alaman ni na marparhaseang',
+'tooltip-pt-mytalk' => 'Alaman Pangkataionmuna',
+'tooltip-pt-preferences' => 'Pinillit ni hamu',
+'tooltip-pt-watchlist' => 'punguan angka goar ni alaman',
+'tooltip-pt-mycontris' => 'Daftar ni silua mu',
+'tooltip-pt-login' => 'Disosoi do hamu asa bongot tu log, alai dang pola di gogohon.',
+'tooltip-pt-logout' => 'Haruar Log',
+'tooltip-ca-talk' => 'Panghataion taringot tu alaman isi',
+'tooltip-ca-edit' => 'Boi do patotaonmu alaman on. Parhaseang tombol pratayang andorang so manimpan.',
+'tooltip-ca-addsection' => 'Mamungka bogas na imbaru',
+'tooltip-ca-viewsource' => 'Alaman on dijaga. Holan haroanna do boi berengon mu',
+'tooltip-ca-history' => 'Parubaan na parpudi di alaman on',
+'tooltip-ca-protect' => 'Hophop alamana on',
+'tooltip-ca-delete' => 'Sesa alaman on',
+'tooltip-ca-move' => 'Pindahon alaman on',
+'tooltip-ca-watch' => 'Tambahon alaman on tu daftar pamberengan hamu',
+'tooltip-ca-unwatch' => 'Sesa alaman on sian daftar na diparrohahon',
+'tooltip-search' => 'lului di bagasan wiki on',
+'tooltip-search-go' => 'Diori alaman na marnampunahon goar na tangkas molo adong',
+'tooltip-search-fulltext' => 'diori alaman na margurithon songonon',
+'tooltip-p-logo' => 'Duloi pogu ni alaman',
+'tooltip-n-mainpage' => 'Duloi pogu ni alaman',
+'tooltip-n-mainpage-description' => 'Duloi pogu ni alaman',
+'tooltip-n-portal' => 'Taringot tu ulaon, aha na boi ulaonmu,ima namandiori na adong',
+'tooltip-n-currentevents' => 'Dapoti informasi taringot tu na masa nuaeng',
+'tooltip-n-recentchanges' => 'Angka parubaan na imbaru di wiki',
+'tooltip-n-randompage' => 'Patudu Alaman na Asing',
+'tooltip-n-help' => 'Inganan mandiori alus',
+'tooltip-t-whatlinkshere' => 'Daftar ni sude alaman  wiki na marnampunahon pangait tu alaman on',
+'tooltip-t-recentchangeslinked' => 'Angka parubaan ni alaman na imbaru na marpangait tu alaman on',
+'tooltip-feed-atom' => 'Pele Atom hu alaman on',
+'tooltip-t-contributions' => 'Daftar ni tumpak ni pamarhaseang on',
+'tooltip-t-emailuser' => 'Tongoshon sada surel tu pamarhaseang on',
+'tooltip-t-upload' => 'Tambahaon angka berkas',
+'tooltip-t-specialpages' => 'Sude Alaman na Istimewa',
+'tooltip-t-permalink' => 'Pangait na togu tu parubaan ni alaman on',
+'tooltip-ca-nstab-main' => 'Dulo alaman isi',
+'tooltip-ca-nstab-user' => 'Bereng alaman ni pamarhaseang',
+'tooltip-ca-nstab-special' => 'On alaman na marhasurungan, ndang boi dipatota',
+'tooltip-ca-nstab-project' => 'Bereng alaman proyek',
+'tooltip-ca-nstab-image' => 'Bereng alaman berkas',
+'tooltip-ca-nstab-template' => 'Ida templat',
+'tooltip-ca-nstab-category' => 'Bereng alaman horong',
+'tooltip-minoredit' => 'Tandai on songon sada panotaan na metmet',
+'tooltip-save' => 'Simpan parubaan mu',
+'tooltip-preview' => 'Parrohahon parubaan mu, parhaseang on andorang so manimpan',
+'tooltip-diff' => 'Bereng parubaan na binahenmu tu siguraton',
+'tooltip-compareselectedversions' => 'Bereng aha ubana sian na dua ragam ni alaman na dipillit.',
+'tooltip-watch' => 'Tambahon alaman on tu daftar na diparrohahonmu',
+'tooltip-summary' => 'Pamasuk ringkasan pendek',
+
+# Browsing diffs
+'previousdiff' => '← Panotaan na salpu',
+'nextdiff' => 'Parubaan na imbaru →',
+
+# Media information
+'file-info-size' => '$1 × $2 piksel, balga ni berkas: $3, rumang na MIME: $4',
+'file-nohires' => 'Ndang adong resolusi natumimbo.',
+'svg-long-desc' => 'Berkas SVG, nominal $1 × $2 piksel, balga ni berkas: $3',
+'show-big-image' => 'Resolusi na umbalga',
+
+# Special:NewFiles
+'noimages' => 'Ndang adong na ni ida',
+'ilsubmit' => 'Diori',
+
+# Bad image list
+'bad_image_list' => 'Songon on ma rumangna:
+
+Holan daftar (baris na dimulai dohot tanda *) na masuk etongan. Pangait na parjolo di sada-sada baris ikkon do gabe pangait tu berkas na buruk. Pangait na manghihut di nasabaris i dietong do i pulik,ima alaman na patuduhon berkas i.',
+
+# Metadata
+'metadata' => 'Metadata',
+'metadata-help' => 'Berkas on marnampunahon informasi na asing, olo do sian kamera digital manang sian ula-ula na asing. Molo nungga dipauneune berkas on, hatoranganna olo do ndang apala toho songon informasi siang gombaran naung dipauneune on.',
+'metadata-fields' => 'Angka bidang metadata gombar na dipajojor di bagasan tona on naeng dipamasuk di hataridaan ni alaman gombar tingki tabel metadata dipametmet. Data na asing gabe dibunihon songon naung ditontuhon.
+ * make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength
+* artist
+* copyright
+* imagedescription
+* gpslatitude
+* gpslongitude
+* gpsaltitude',
+
+# Exif tags
+'exif-imagewidth' => 'Bolak',
+'exif-imagelength' => 'Timbo',
+
+# External editor support
+'edit-externally' => 'Patota berkas on mamarhaseanghon ulaula parduru',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'Sasude',
+'namespacesall' => 'sude',
+'monthsall' => 'Sasude',
+
+# Watchlist editing tools
+'watchlisttools-edit' => 'Pataridahon jala patota daftar siparrohahonon',
+
+# Special:SpecialPages
+'specialpages' => 'Alaman na marhasurungan',
+
+# Special:Tags
+'tag-filter' => 'Saringan [[Special:Tags|tag]]:',
+
+);
diff --git a/languages/messages/MessagesBcc.php b/languages/messages/MessagesBcc.php
index d79ee65c..62d92e97 100644
--- a/languages/messages/MessagesBcc.php
+++ b/languages/messages/MessagesBcc.php
@@ -172,9 +172,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'منی ایمیل پیش دار ته ایمیل أن هوژاری',
 'tog-shownumberswatching' => 'پیش دار تعداد کاربرانی که چارگتن',
 'tog-fancysig' => 'امضاءَ په داب ویکی متنی بزان(بی اتوماتیکی لینک)',
-'tog-externaleditor' => 'به طور پیش فرض اصلاح کنوک حارجی استفاده کن',
-'tog-externaldiff' => 'به طور پیش فرض چه حارجی تمایز استفاده کن',
-'tog-showjumplinks' => 'فعال کن "jump to" لینکان دست رسی آ',
 'tog-uselivepreview' => 'چه زنده این بازبین استفاده کن(جاوا)(تجربی)',
 'tog-forceeditsummary' => 'من آ هال دی وهدی وارد کتن یک هالیکین خلاصه ی اصلاح',
 'tog-watchlisthideown' => 'منی اصلاحات آ چه لیست چارگ پناه کن',
@@ -356,7 +353,7 @@ $messages = array(
 
 $1',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'باره {{SITENAME}}',
 'aboutpage' => 'Project:باره',
 'copyright' => 'محتوا موجودانت تحت $1.',
@@ -366,7 +363,6 @@ $1',
 'disclaimers' => 'بی میاری گیان',
 'disclaimerpage' => 'Project:عمومی بی میاریگان',
 'edithelp' => 'کمک اصلاح',
-'edithelppage' => 'Help:اصلاح',
 'helppage' => 'Help:محتوا',
 'mainpage' => 'صفحه اصلی',
 'mainpage-description' => 'صفحه اصلی',
@@ -437,17 +433,6 @@ $1',
 # General errors
 'error' => 'حطا',
 'databaseerror' => 'حطا دیتابیس',
-'dberrortext' => 'یک اشتباه ته درخواست دیتابیس پیش آتک.
-شی شاید یک باگی ته نرم افزار پیش داریت.
-آهرین تلاش درخواست دیتابیس بوته:
-<blockquote><tt>$1</tt></blockquote>
-"<tt>$2</tt>".
-ته ای عملگر ما اس کیو ال ای حطا پیش داشتت "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'یک اشتباه ته درخواست دیتابیس پیش آتک.
-آهری تلاش درخواست دیتابیس بوتت:
-"$1"
-چه ای عملگر"$2".
-مای اس کیو ال ای حطا پیش داشتت  "$3: $4"',
 'laggedslavemode' => 'هوژاری: صفحه شاید نوکین په روچ بییگان داشته می بیت',
 'readonly' => 'دیتابیس کبلنت',
 'enterlockreason' => 'یک دلیلی په کبل وارد کنیت، شامل یک برآوردی چه وهد کبل ویل بیت',
@@ -494,7 +479,6 @@ Query: $2',
 'editinginterface' => "'''هوژاری:''' شما یک صفحه ای اصلاح کنیت که به عنوان مداخله گر متنی برنامه استفاده بیت.
 تغییرات ای صفحه کاربرد مداخله گر په دگه کابران تاثیر هلیت.
   [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net],  په ترجمه یان لطفا توجه کنیت په استفاده پروژه ملکی کتن مدیا وی کی",
-'sqlhidden' => '(SQL درخواست پناهین)',
 'cascadeprotected' => 'ای صفحه محافظت بیت چه اصلاح چرا که آیی شامل جهلیگین {{PLURAL:$1|صفحه, که|صفحات, که}} محافظتی گون the "cascading" option turned on:
 $2',
 'namespaceprotected' => "شما اجازت په اصلاح صفحات ته  '''$1'' نام فضا نیست",
@@ -602,7 +586,7 @@ $2',
 'newpassword' => 'نوکین کلمه رمز:',
 'retypenew' => 'کلمه رمز دگه بنویس',
 'resetpass_submit' => 'تنظیم کلمه رمز و ورود',
-'resetpass_success' => 'شمی کلمه رمز گون موفقیت عوض بون! هنو شما وارد بیگیت...',
+'changepassword-success' => 'شمی کلمه رمز گون موفقیت عوض بون! هنو شما وارد بیگیت...',
 'resetpass_forbidden' => 'کلمات رمز نه توننت عوض بنت.',
 'resetpass-no-info' => 'په مستقیمین دسترسی په ای صفحه شما بایدن وارد سایت بیت',
 'resetpass-submit-loggedin' => 'عوض کتن کلمه رمز',
@@ -959,7 +943,6 @@ $1",
 'searchmenu-legend' => 'گزینه یان گردگ',
 'searchmenu-exists' => "'''صفحه گون نام \"[[\$1]]\" ته ای ویکی نیستن'''",
 'searchmenu-new' => "'''شر کن صفحه ای \"[[:\$1]]\" ته ای ویکی!'''",
-'searchhelp-url' => 'Help:محتوا',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|بروز صفحات گون پیش وند]]',
 'searchprofile-articles' => 'صفحات محتوا',
 'searchprofile-project' => 'کمک و صفحات پروژه ای',
@@ -1002,14 +985,6 @@ $1",
 شما نونیت بگردیت چه طرق گوگل هم زمان.
 توجه که اندیکس آن {{SITENAME}} محتوا شاید تاریح گوستگین بنت.',
 
-# Quickbar
-'qbsettings' => 'میله سریع',
-'qbsettings-none' => 'هچ یک',
-'qbsettings-fixedleft' => 'چپ ثابت',
-'qbsettings-fixedright' => 'راست ثابت',
-'qbsettings-floatingleft' => 'چپ شناور',
-'qbsettings-floatingright' => 'راست شناور',
-
 # Preferences page
 'preferences' => 'ترجیحات',
 'mypreferences' => 'منی ترجیحات',
@@ -1036,7 +1011,6 @@ $1",
 'resetprefs' => 'پاکن تغییرات ذخیره نه بوتگین',
 'restoreprefs' => 'کل پیش فرضین تنظیمات برگردین',
 'prefs-editing' => 'اصلاح',
-'prefs-edit-boxsize' => 'حد پنجره اصلاح.',
 'rows' => 'ردیفآن«',
 'columns' => 'ستون‌ان:',
 'searchresultshead' => 'گردگ',
@@ -1074,7 +1048,6 @@ $1",
 'prefs-custom-js' => 'رسمی جی‌اس',
 'prefs-reset-intro' => 'شما توانت چه ای  صفحه په واترینگ تنظیمات وت په پیش‌فرض استفاده کنیت. ای کار بازگشت‌ناپذیر انت.',
 'prefs-emailconfirm-label' => 'تایید کتن پست الکترونیک:',
-'prefs-textboxsize' => 'اندازه پنجره اصلاح',
 'youremail' => 'ایمیل:',
 'username' => 'نام کاربری:',
 'uid' => 'کاربر شناسگ:',
@@ -1290,7 +1263,6 @@ $1",
 'recentchangeslinked-feed' => 'مربوطین تغییرات',
 'recentchangeslinked-toolbox' => 'مربوطین تغییرات',
 'recentchangeslinked-title' => 'تغییراتی مربوط په "$1"',
-'recentchangeslinked-noresult' => 'هچ تغییری ته صفحات لینک بوتگین ته داتگین دوره نیست',
 'recentchangeslinked-summary' => "شی یک لیستی چه تغییراتی هستنت که نوکی اعمال بوتگنت په صفحاتی که چه یک صفحه خاصی لینک بوته( یا په اعضای یک خاصین دسته).
 صفحات ته [[Special:Watchlist| شمی لیست چارگ]] '''' پررنگنت''''",
 'recentchangeslinked-page' => 'صفحه نام:',
@@ -1550,12 +1522,6 @@ PICT # misc.
 'statistics-users-active-desc' => 'کاربرانی که ته پیشگین {{PLURAL:$1|روچ|$1 روچان}} کاری اش کتت',
 'statistics-mostpopular' => 'باز چار تگین صفحات',
 
-'disambiguations' => 'صفحات رفع ابهام',
-'disambiguationspage' => 'Template:رفع ابهام',
-'disambiguations-text' => "جهلیگین صفحه لینک انت په یک '''صفحه رفع ابهام'''.
-شما بایدن په جاه آیی په یک مناسبین موضوعی لینک دهیت.<br />
-یک صفحه ای که په داب صفحه رفع ابهام چارگ بیت اگر آیء چه یک تمپلتی که لینک بیت چه [[MediaWiki:Disambiguationspage|صفحه رفع ابهام]] استفاده کنت.",
-
 'doubleredirects' => 'دوبل غیر مستقیم',
 'doubleredirectstext' => 'ای صفحه لیست کنت صفحاتی که غیر مستقیم رونت په دگه صفحات. هر ردیف شامل لینکانی انت به اولی و دومی غیر مستقیم، و هدف دومی غیر مستقیم، که معمولا استفاده بیت "real" صفحه هدف، که بایدن اولی غیر مستقیم پیش داریت.',
 'double-redirect-fixed-move' => '[[$1]] انتقال دهگ بوتت، و الان تغییر مسیری په [[$2]] انت',
@@ -1766,10 +1732,9 @@ PICT # misc.
 'unwatchthispage' => 'چارگ بند کن',
 'notanarticle' => 'یک صفحه محتوا نهت',
 'notvisiblerev' => 'بازبینی حذف بوتت',
-'watchnochange' => 'هچ یک چه شمی چارتگین آیتم اصلاح نه بوتت ته ای دوره زمانی که پیش دارگ بیت.',
 'watchlist-details' => '{{PLURAL:$1|$1 صفحه|$1 صفحات}} چارتگ بیت صفحات گپ حساب نه بیگن',
-'wlheader-enotif' => '* اخطار ایمیل فعالنت.',
-'wlheader-showupdated' => "* صفحات که عوض بوتگنت چه شمی آهری چارتن '''پررنگ''' پیش دراگ بنت.",
+'wlheader-enotif' => 'اخطار ایمیل فعالنت.',
+'wlheader-showupdated' => "صفحات که عوض بوتگنت چه شمی آهری چارتن '''پررنگ''' پیش دراگ بنت.",
 'watchmethod-recent' => 'کنترل نوکین اصلاحات په صفحاتی که چارگ بنت',
 'watchmethod-list' => 'کنترل صفحاتی که چارگ بنت په نوکین اصلاحات',
 'watchlistcontains' => 'شمی لیست چارگ شامل  $1 {{PLURAL:$1|صفحه|صفحات}}.',
@@ -2115,12 +2080,9 @@ $1',
 'ipb_blocked_as_range' => 'حطا: ای پی  $1 مستقیما محدود نهنت و نه تونیت رفع محدودیت بیت.
 بله آی جزی چه محدوده  $2 محدود بوتت که تونیت رفع محدودیت بیت.',
 'ip_range_invalid' => 'نامعتبر محدوده آی پی',
-'blockme' => 'مناء محدود کن',
 'proxyblocker' => 'محدود کننده ی پروکسی',
-'proxyblocker-disabled' => 'ای عمگر غیرفعالنت.',
 'proxyblockreason' => 'شمی آدرس آی پی محدود بوتت په چی که ایء یک پچین پروکسی ات.
 لطفا گون وتی اینترنتی شرکت تماس گریت یا حمایت تکنیکی و آیانا چی ای مشکل امنیتی شدید سهی کنیت.',
-'proxyblocksuccess' => 'انجام بوت.',
 'sorbs' => 'دی ان اس بی ال',
 'sorbsreason' => 'شمی آدرس آی پی لیست بوتت په داب پچین پروکسی ته  DNSBL که استفاده بیت گون {{SITENAME}}.',
 'sorbs_create_account_reason' => 'شمی آدرس آی پی لیست بوتت په داب پچین پروکسی ته  دی ان ای بی ال که استفاده بیت گون {{SITENAME}}.
@@ -2410,13 +2372,8 @@ $1',
 'spam_blanking' => 'کل بازبینی آن شامل لینکان په $1, بوتت  هالیکی',
 
 # Skin names
-'skinname-standard' => 'کلاسیک',
-'skinname-nostalgia' => 'نوستالجیک',
 'skinname-cologneblue' => 'نیلی کولاجن',
 'skinname-monobook' => 'منوبوک',
-'skinname-myskin' => 'منی جلد',
-'skinname-chick' => 'شیک',
-'skinname-simple' => 'ساده',
 'skinname-modern' => 'مدرن',
 
 # Patrolling
@@ -2543,7 +2500,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'پهنات',
 'exif-imagelength' => 'بلندی',
 'exif-bitspersample' => 'بیت ته جز',
@@ -2659,7 +2616,7 @@ Variants for Chinese language
 'exif-gpsdatestamp' => 'تاریح جی پی اس',
 'exif-gpsdifferential' => 'اصلاح متفاوت جی پی اس',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'کمپرس نه بوتت',
 'exif-compression-6' => 'جیی پی ای جی',
 
@@ -2901,7 +2858,6 @@ $5
 # Separators for various lists, etc.
 'semicolon-separator' => ';',
 'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-',
 
 # Multipage image navigation
 'imgmultipageprev' => '← پیشگین صفحه',
@@ -3026,7 +2982,6 @@ $5
 'version-other' => 'دگر',
 'version-mediahandlers' => 'دست گروک مدیا',
 'version-hooks' => 'گیر کنت',
-'version-extension-functions' => 'عملگران الحاقی',
 'version-parser-extensiontags' => 'برچسپان الحاقی تجزیه گر',
 'version-parser-function-hooks' => 'عمل گر تجزیه کنوک گیر کت',
 'version-hook-name' => 'نام گیر',
@@ -3037,13 +2992,6 @@ $5
 'version-software-product' => 'محصول',
 'version-software-version' => 'نسخه',
 
-# Special:FilePath
-'filepath' => 'مسیر فایل',
-'filepath-page' => 'فایل:',
-'filepath-submit' => 'مسیر',
-'filepath-summary' => 'ای حاصین صفحه مسیر کامل په یک فایل پیش داریت.
-تصاویر گون وضوح کامل پیش دارگ بنت و دگه نوع فایلان گون وتی برنامه یانش مستقیما پچ بنت.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'گردگ په کپی  فایلان',
 'fileduplicatesearch-summary' => 'گردگ په کپی فایلان په اساس درهمین ارزش.',
diff --git a/languages/messages/MessagesBcl.php b/languages/messages/MessagesBcl.php
index 27eb70f4..fee44413 100644
--- a/languages/messages/MessagesBcl.php
+++ b/languages/messages/MessagesBcl.php
@@ -127,11 +127,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ihayag an numero kan nagbabantay na mga parágamit',
 'tog-oldsig' => 'Tugmadong pirma',
 'tog-fancysig' => 'Trataron an pirma na wiki-teksto (mayo nin awtomatikong kilyaw)',
-'tog-externaleditor' => 'Gamiton an pirmihan na panluwas na editor (para sa mga eksperto sana, minakaipo nin espesyal na mga panuytoy sa saimong kompyuter.
-[//www.mediawiki.org/wiki/Manual:External_editors Mga dagdag na impormasyon.])',
-'tog-externaldiff' => 'Gamíta an panluwas na diff nguna (para sa mga eksperto sana, minakaipo nin espesyal na mga panuytoy (settings) sa saimong kompyuter.
-[//www.mediawiki.org/wiki/Manual:External_editors Kadagdagang impormasyon.])',
-'tog-showjumplinks' => 'Paganaha an "luksó sa" kilyaw nin kalangkayan',
 'tog-uselivepreview' => 'Gamíta an buhay na patànaw (eksperimental)',
 'tog-forceeditsummary' => 'Ibunyaw sako kun maglalaog sa blangkong kalanyang nin paghirá',
 'tog-watchlisthideown' => 'Tagóa an sakong mga pagliwat gikan sa bantay-listahan',
@@ -144,6 +139,8 @@ $messages = array(
 'tog-diffonly' => 'Dai tabi ihayag an laog kan pahina sa ibaba nin mga diffs',
 'tog-showhiddencats' => 'Ihayag an nakatagong mga kategorya',
 'tog-norollbackdiff' => 'Omidohon an diff matapos himoon an pagbalikot',
+'tog-useeditwarning' => 'Patanidan ako kunsoarin na ako nagbaya sa pahinang pigliliwat na dae naitatagama an mga kaliwatan',
+'tog-prefershttps' => 'Pirmeng gumamit nin sarong seguradong koneksyon kunsoarin na ika nakalaog na',
 
 'underline-always' => 'Pirmi',
 'underline-never' => 'Nungka',
@@ -207,6 +204,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nob',
 'dec' => 'Des',
+'january-date' => 'Enero $1',
+'february-date' => 'Pebrero $1',
+'march-date' => 'Marso $1',
+'april-date' => 'Abril $1',
+'may-date' => 'Mayo $1',
+'june-date' => 'Hunyo $1',
+'july-date' => 'Hulyo $1',
+'august-date' => 'Agosto $1',
+'september-date' => 'Septiyembre $1',
+'october-date' => 'Oktubre $1',
+'november-date' => 'Nobyembre $1',
+'december-date' => 'Disyembre $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorya|Mga kategorya}}',
@@ -288,6 +297,7 @@ $messages = array(
 'create-this-page' => 'Muknaon ining pahina',
 'delete' => 'Puraon',
 'deletethispage' => 'Puraon ining pahina',
+'undeletethispage' => 'Balikon sa pagkapura ining pahina',
 'undelete_short' => 'Bawia an pagpurà kan {{PLURAL:$1|sarong pagliwat|$1 mga pagliwat}}',
 'viewdeleted_short' => 'Hilngon {{PLURAL:$1|sarong pinara na pagliwat|$1 mga pinara na pagliwat}}',
 'protect' => 'Protektari',
@@ -331,7 +341,7 @@ $1',
 'pool-queuefull' => 'An grupong panproseso panoon',
 'pool-errorunknown' => 'Bakong bistadong sala',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Dapít sa {{SITENAME}}',
 'aboutpage' => 'Project:Mapanonongód',
 'copyright' => 'An kalamnan manunumpungan sa laog kan $1.',
@@ -341,7 +351,6 @@ $1',
 'disclaimers' => 'Mga Pangindahan',
 'disclaimerpage' => 'Project:Pangkagabsán na pangindahan',
 'edithelp' => 'Pantabang sa pagliliwat',
-'edithelppage' => 'Help:Pagliwát',
 'helppage' => 'Help:Mga Kalamnan',
 'mainpage' => 'Panginot na Pahina',
 'mainpage-description' => 'Panginot na Pahina',
@@ -419,17 +428,12 @@ Pwede mong mahiling an lista nin mga marhay na pahina sa [[Special:SpecialPages|
 # General errors
 'error' => 'Salâ',
 'databaseerror' => 'Salâ sa base nin datos',
-'dberrortext' => 'May kahaputan sa datos-sarayan sa napasalang sintaks an nangyari.
-Ini puwedeng minapanungod nin sarong kubol na yaon sa kasungatan .
-An pinakahuring pagprubar sa datos-sarayan naghahapot nin:
-<blockquote><tt>$1</tt></blockquote>
-gikan sa laog kan punksyon na "<tt>$2</tt>".
-An pinagbalik na kasalaan sa datos-sarayan "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Sarong datos-sarayan na may napasalang sintaks an nangyari.
-An pinakahuring pagprubar sa datos-sarayan naghahapot nin:
-"$1"
-na hale sa laog kan punksyon na "$2".
-An datos-sarayan nagbalik nin sala na "<tt>$3: $4</tt>".',
+'databaseerror-text' => 'Sarong hapot sa datos-sarayan na kasalaan an nangyari.
+Ini puwedeng minapasabot nin sarong kudol sa panuklob.',
+'databaseerror-textcl' => 'Sarong hapot sa datos-sarayan na kasalaan an nangyari.',
+'databaseerror-query' => 'Hapot: $1',
+'databaseerror-function' => 'Punksyon: $1',
+'databaseerror-error' => 'Kasalaan: $1',
 'laggedslavemode' => 'Patanid: An pahina pwedeng dai nin pagbabâgo sa ngonyan.',
 'readonly' => 'Nakakandado na datos-sarayan',
 'enterlockreason' => 'Magkaag tabì nin rason sa pagkandado, asin ikalkulo kun nuarin bubukasón an kandado',
@@ -463,6 +467,7 @@ Ini puwede nang napura kan iba.',
 'cannotdelete-title' => 'Dae mapura an pahina na "$1"',
 'delete-hook-aborted' => 'An pagpura pinundo kan pangawit.
 Ini dae nagtao nin kapaliwanagan.',
+'no-null-revision' => 'Dae makakamukna nin baguhong bunyaw na rebisyon para sa pahina "$1"',
 'badtitle' => 'Raot na titulo',
 'badtitletext' => 'An pinaghagad na titulo kan pahina imbalido, daeng laog, o sarong salaon na sinugpunan na titulo kan inter-lengguwahe o inter-wiki.
 Ini gayod may laog nin o dakol na mga karakter na dae pinaggagamit sa mga titulo.',
@@ -485,12 +490,15 @@ Sa pagdagdag or pagliwat nin mga dakit-taramon para sa bilog na wiki, gamita tab
 'editinginterface' => "'''Patanid:''' Ika nagliliwat kan pahina na ginagamit sa pagtao nin pantahaw-olay na teksto para sa software.
 An mga pagbabago kaining pahina makaka-apekto sa hitsura kan pantahaw-olay nin paragamit para sa iba man na paragamit.
 Para sa mga pagdadakit-taramon, pakikonsidera man tabi an paggagamit kan [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], an MediaWiking lokalisasyon kan proyekto.",
-'sqlhidden' => '(nakatagô an hapót nin SQL)',
 'cascadeprotected' => 'Pinoprotehirán ining páhina sa mga paghirá, ta sarô ini sa mga minasunod na {{PLURAL:$1|páhina|mga páhina}} na pinoprotehiran kan opsyón na "katarata" na nakabuká:
 $2',
 'namespaceprotected' => "Mayô kang permisong maghirá kan mga páhina sa '''$1''' ngaran-espacio.",
 'customcssprotected' => 'Ika mayong permiso sa pagliwat kaining pahinang CSS, nin huli ta ini naglalaman kan personal na panuytoy (settings) kan ibang paragamit.',
 'customjsprotected' => 'Ika mayong permiso sa pagliwat kaining pahinang JavaScript, nin huli ta ini naglalaman kan personal na panuytoy (settings) kan ibang paragamit.',
+'mycustomcssprotected' => 'Ika mayo nin permiso sa pagliwat kaining CSS na pahina.',
+'mycustomjsprotected' => 'Ika mayo nin permiso sa pagliwat kaining JavaScript na pahina.',
+'myprivateinfoprotected' => 'Ika daeng permiso na magliliwat kan pribado mong impormasyon.',
+'mypreferencesprotected' => 'Ika daeng permiso na magliliwat kan saimong mga kamuyahan.',
 'ns-specialprotected' => 'An mga pahinang nasa {{ns:special}} na liang-liang dai pwedeng hirahón.',
 'titleprotected' => 'Ining titulo pinagprotektaran poon pagkamukna ni [[User:$1|$1]].
 An rason na pinagtao iyo na "\'\'$2\'\'".',
@@ -515,10 +523,19 @@ Tandai tabi na an nagkapirang mga pahina puwedeng maipagpapadagos na ipagpapahil
 'welcomecreation-msg' => 'An saimong panindog pinagmukna na.
 Dae malingaw na liwaton an saimong [[Special:Preferences|{{SITENAME}} mga kamuyahan]].',
 'yourname' => 'Pangaran kan paragamit:',
+'userlogin-yourname' => 'Paragamit-na-Ngaran',
+'userlogin-yourname-ph' => 'Ikaag an saimong paragamit-na-ngaran',
+'createacct-another-username-ph' => 'Ikaag an paragamit-na-ngaran',
 'yourpassword' => 'Pasa-taramon:',
+'userlogin-yourpassword' => 'Sikretong panlaog',
+'userlogin-yourpassword-ph' => 'Ikaag an saimong sekretong panlaog',
+'createacct-yourpassword-ph' => 'Ikaag an sekretong panlaog',
 'yourpasswordagain' => 'Pakilaog giraray kan sekretong panlaog:',
+'createacct-yourpasswordagain' => 'Kumpirmaron an sekretong panlaog',
+'createacct-yourpasswordagain-ph' => 'Pakikaag otro an sekretong panlaog',
 'remembermypassword' => 'Giromdoma an sakong paglaog sa kilyaw (browser) na ini (para sa maksimum na $1 {{PLURAL:$1|aldaw|mga aldaw}})',
-'securelogin-stick-https' => 'Magpirmeng konektado sa HTTPS matapos kang maglaog',
+'userlogin-remembermypassword' => 'Dagos mo akong giromdomon na nakalaog',
+'userlogin-signwithsecure' => 'Gamiton an seguradong koneksyon',
 'yourdomainname' => 'An saimong kasakupan:',
 'password-change-forbidden' => 'Ika dae makapagliwat nin sekretong panlaog sa wiking ini.',
 'externaldberror' => 'Igwa gayod sala sa arinman kan patunay sa datos-sarayan o ika dae pinagtugutan na bâgohon an saimong panluwas na panindog.',
@@ -530,18 +547,41 @@ Dae malingaw na liwaton an saimong [[Special:Preferences|{{SITENAME}} mga kamuya
 'logout' => 'Magluwas',
 'userlogout' => 'Magluwás',
 'notloggedin' => 'Dae ka nakalaog',
+'userlogin-noaccount' => 'Mayo ka nin panindog?',
+'userlogin-joinproject' => 'Mag-ayon{{SITENAME}}',
 'nologin' => 'Mayò ka pa nin panindog (account)? $1.',
 'nologinlink' => 'Magmukna nin panindog',
 'createaccount' => 'Magmukna nin panindog',
 'gotaccount' => 'Igwa ka na tabi nin panindog? $1.',
 'gotaccountlink' => 'Maglaog',
 'userlogin-resetlink' => 'Nakalingaw ka sa panlaog mong detalye?',
+'userlogin-resetpassword-link' => 'Pakibaguha an saimong sekretong panlaog',
+'helplogin-url' => 'Help:Paglalaog',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Tabang sa paglalaog]]',
+'createacct-join' => 'Pakikaag an saimong impormasyon sa ibaba.',
+'createacct-another-join' => 'Ikaag an impormasyon kan baguhong panindog sa ibaba.',
+'createacct-emailrequired' => 'Estada kan e-surat',
+'createacct-emailoptional' => 'E-surat na estada (opsyonal)',
+'createacct-email-ph' => 'Pakikaag an saimong e-surat na estada',
+'createacct-another-email-ph' => 'Ikaag an estada kan e-surat',
 'createaccountmail' => 'Gumamit nin sarong temporaryong pampurak na pasa-taramon asin ipadara ini sa pinagsambit na estada kan e-surat',
+'createacct-realname' => 'Totoong pangaran (opsyonal)',
 'createaccountreason' => 'Rason:',
+'createacct-reason' => 'Rason',
+'createacct-reason-ph' => 'Tadaw ta ika magmumukna nin ibang panindog',
+'createacct-captcha' => 'Rikisang panseguridad',
+'createacct-imgcaptcha-ph' => 'Pakikaag an tekstong nahihiling mo sa ibabaw',
+'createacct-submit' => 'Muknaon an saimong panindog',
+'createacct-another-submit' => 'Magmukna nin ibang panindog',
+'createacct-benefit-heading' => '{{SITENAME}} pinaghimo kan mga tawong siring mo.',
+'createacct-benefit-body1' => '{{PLURAL:$1|niliwat|mga niliwat}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pahina|mga pahina}}',
+'createacct-benefit-body3' => 'pinakahuring {{PLURAL:$1|paraambag|mga paraambag}}',
 'badretype' => 'An mga sekretong panlaog mong pinagtatak bakong pareho.',
 'userexists' => 'Paragamit na ngarang piglaog may naggagamit na.
 Pakipili nin ibang ngaran tabi.',
 'loginerror' => 'An paglaog napasalâ',
+'createacct-error' => 'Kasalaan sa pagmumukna nin panindog',
 'createaccounterror' => 'Dae tabi maimukna an panindog: $1.',
 'nocookiesnew' => 'An panindog kan paragamit namukna na, pero ika dae pa tabi nakalaog.
 {{SITENAME}} naggagamit nin cookies tanganing makalaog an mga paragamit.
@@ -601,10 +641,12 @@ Pakilaog sana tabi nin sarong tugmadong koreo o pabayae na mayong laman an surat
 'createaccount-title' => 'Panindog na pagmukna para sa {{SITENAME}}',
 'createaccount-text' => 'May tawong nagmukna nin sarong panindog na gamit an saimong address na e-surat sa {{SITENAME}} ($4) na may ngaran na "$2, na may sikretong panlaog na "$3".',
 'usernamehasherror' => 'Paragamit na ngaran dae puwede na igwang simbolikong mga kabtang',
-'login-throttled' => 'Nakapaghimo ka na nin kadakulon na pagprubar sa paglaog dae pa sana nahaloy. Mapuwede lang po na maghalat bago magprubar giraray.',
+'login-throttled' => 'Nakapaghimo ka na nin grabe kadakol na pagprubar na maglaog sa dae pa sana nahahaloy. Tabi man pakihalat nin $1 bago ka magprubar giraray.',
 'login-abort-generic' => 'An saimong paglaog dae nakadagos - Pinundo',
 'loginlanguagelabel' => 'Lengguwahe: $1',
 'suspicious-userlogout' => 'An hinahagad mong magluwas pinagpundo nin huli ta ini gayod pinagpadara sa paagi nin sarong pasang kilyaw o proksing hilom.',
+'createacct-another-realname-tip' => 'An totoong pangaran opsyonal.
+Kun gustuhon mong itao ini, ini paggagamiton sa pagtatao nin pagkakabistohan kan paragamit para sa saindang mga kaggibohan.',
 
 # Email sending
 'php-mail-error-unknown' => 'Bakong bantog na kasalaan sa PHP mail() function.',
@@ -621,8 +663,7 @@ Tanganing tapuson an paglalaog, ika kaipong magkaag nin sarong baguhon na sekret
 'newpassword' => 'Bàguhon na sekretong panlaog:',
 'retypenew' => 'Itaták giraray an bàgong panlaog:',
 'resetpass_submit' => 'Ipwesto an sekretong panlaog dangan maglaog',
-'resetpass_success' => 'An saimong pasa-taramon matrayumpong pinagliwat na!
-Ngunyan pinagpapalaog ka na...',
+'changepassword-success' => 'An saimong pasa-taramon matrayumpong pinagliwat na!',
 'resetpass_forbidden' => 'An mga sekretong panlaog dae puwedeng maribayan',
 'resetpass-no-info' => 'Ika dapat nakalaog na tanganing direktang makagamit kaining pahina.',
 'resetpass-submit-loggedin' => 'Ribayan an sekretong panlaog',
@@ -634,10 +675,11 @@ Matriumpo mo nang nailaog an sekretong panlaog o nakua an bàgong temporaryong s
 
 # Special:PasswordReset
 'passwordreset' => 'Pakibago kan sekretong panlaog',
-'passwordreset-text' => 'Kumpletoha ining porma tangarig liwatong an saimong sekretong panlaog.',
+'passwordreset-text-one' => 'Kumpletuhon ining porma sa pagliwat otro kan saimong pasa-taramon.',
+'passwordreset-text-many' => '{{PLURAL:$1|Palamanan an saro sa mga kaaganan tanganing mailuwat-otro an saimong pasa-taramon.}}',
 'passwordreset-legend' => 'Pakibago kan sekretong panlaog',
 'passwordreset-disabled' => 'An pagbago kan sekretong panlaog pinagpundo sa wiking ini.',
-'passwordreset-pretext' => '{{PLURAL:$1||Pakilaog kan saro sa mga pedaso nin datos sa ibaba}}',
+'passwordreset-emaildisabled' => 'E-surat na mga estima pinag-uruntok sa wiking ini.',
 'passwordreset-username' => 'Paragamit-ngaran:',
 'passwordreset-domain' => 'Kasakupan:',
 'passwordreset-capture' => 'Hilngon an kinaluwasang e-koreo?',
@@ -662,7 +704,7 @@ Ika dapat na maglaog asin magpili nin sarong bagong sekretong panlaog ngunyan. K
 Temporaryong sekretong panlaog: $2',
 'passwordreset-emailsent' => 'Sarong e-surat sa pagliliwat kan sekretong panlaog an ipinadara na.',
 'passwordreset-emailsent-capture' => 'Sarong e-surat sa pagliliwat kan sekretong panlaog an ipinadara na, yaon ipinapahiling sa ibaba.',
-'passwordreset-emailerror-capture' => 'Sarong pampagiromdom na e-koreo pinaghimo na, ipinapahiling sa may ibaba, alagad an pagpapadara kaini sa paragamit nagpalya: $1',
+'passwordreset-emailerror-capture' => 'Sarong e-surat sa pagliliwat kan sekretong panlaog an pinagpuyos na, yaon ipinapahiling sa ibaba, alagad sa pagpapadara kaini sa {{GENDER:$2|paragamit}} nagpalya: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ribayan an e-koreong address',
@@ -676,6 +718,19 @@ Temporaryong sekretong panlaog: $2',
 'changeemail-submit' => 'Ribayan an e-koreo',
 'changeemail-cancel' => 'Kanselaha',
 
+# Special:ResetTokens
+'resettokens' => 'Pakibaguha an mga paduos',
+'resettokens-text' => 'Ika makakapagbago kan ma paduos na magtutugot nin kalangkayan pasiring sa siyertong datos na pribado na asosyado sa saimong panindog digde.
+
+Gibohon mo ini kun aksidente mong naipagheras sinda sa kiisay man o kun an saimong panindog kompromitido na.',
+'resettokens-no-tokens' => 'Mayo nin mga paduos na babaguhon.',
+'resettokens-legend' => 'Pakibaguha an mga paduos',
+'resettokens-tokens' => 'Mga Paduos:',
+'resettokens-token-label' => '$1 (na ngunyan na halaga: $2)',
+'resettokens-watchlist-token' => 'Paduos para sa hungitan nin web (Atom/RSS) kan [[Special:Watchlist|mga kaliwatan sa mga pahina nin saimong bantay-listahan]]',
+'resettokens-done' => 'Mga paduos pinagbago na.',
+'resettokens-resetbutton' => 'Pakibaguha an pinagpiling mga paduos',
+
 # Edit page toolbar
 'bold_sample' => 'Mahìbog na teksto',
 'bold_tip' => 'Mahìbog na teksto',
@@ -872,12 +927,14 @@ Ini dae tabi nagtao nin kapaliwanagan.',
 Ini minapahiwatig tabi na pinagpura na.',
 'edit-conflict' => 'Igwang iregularidad sa pagliwat.',
 'edit-no-change' => 'An saimong pagliwat pinagbalewala, nin huli ta mayong pagbabago an pinaghimo sa teksto.',
+'postedit-confirmation' => 'An saimong niliwat ipinagtagama na.',
 'edit-already-exists' => 'Dai maggibo an bàgong pahina.
 Igwa na kaini.',
 'defaultmessagetext' => 'Tugmadong mensahe sa teksto',
 'content-failed-to-parse' => 'Nagpalya sa paglunhay an $2 na laman para sa $1 na modelo: $3',
 'invalid-content-data' => 'Imbalidong datos nin laman',
 'content-not-allowed-here' => '"$1" na laman dae pinagtutugutan sa pahina [[$2]]',
+'editwarning-warning' => 'Sa pagbaya kaining pahina magkakausa saimo na mawara an anuman na mga kaliwatan na saimong ginibo. Kun ika maglaog, mapuwede mong untukon ining patanid sa "Pagliliwat" na seksyon kan saimong mga kamuyahan.',
 
 # Content models
 'content-model-wikitext' => 'wiki-teksto',
@@ -912,6 +969,7 @@ Ining mga argumento tabi pinagharali na.",
 'undo-failure' => 'Dai napogol an paghirá ta igwa pang ibang paghirá sa tahaw na nagkokomplikto.',
 'undo-norev' => 'An pagliwat dae tabi magigibo nin huli ta ini bakong eksistido o pinagpura na.',
 'undo-summary' => 'Dae idagos an rebisyon $1 sa [[Special:Contributions/$2|$2]] ([[User talk:$2|olay]])',
+'undo-summary-username-hidden' => 'Dae idagos an rebisyon sa $1 nin sarong nakatago na paragamit',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Dai makagibo nin account',
@@ -1094,6 +1152,7 @@ Tandaan na an paggagamit kan nabigasyong nin mga kasurugponan makakapagliwat kai
 'compareselectedversions' => 'Kompararon an pinagpiling mga rebisyon',
 'showhideselectedversions' => 'Ihayag/itago mga piniling pagbabago',
 'editundo' => 'sulíton',
+'diff-empty' => '(Mayong kalaenan)',
 'diff-multi' => '({{PLURAL:$1|Saro intermediate na pagbabago|$1 mga intermediate na mga pagbabago}} by {{PLURAL:$2|sarong paragamit|$2 mga paragamit}} dae pinaghahayag)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Sarong intermediate na pagbabago|$1 mga intermediate na mga pagbabago}} na sobra sa $2 {{PLURAL:$2|paragamit|mga paragamit}} dae pinaghahayag)',
 'difference-missing-revision' => '{{PLURAL:$2|sarong rebisyon|$2 mga rebisyon}} kaining diperensiya ($1) {{PLURAL:$2|na iyo an|kaidto na iyo an}} dae nanagboan.
@@ -1121,7 +1180,6 @@ An mga detalye mapuwedeng matatagboan sa [{{fullurl:{{#Special:Log}}/delete|page
 'searchmenu-legend' => 'Opsyon sa paghahanap',
 'searchmenu-exists' => "'''Igwa nin sarong pahina na pinagngaranan na \"[[:\$1]]\" sa wiking ini.'''",
 'searchmenu-new' => "'''Muknaon an pahina \"[[:\$1]]\" sa wiking ini!'''",
-'searchhelp-url' => 'Help:Mga laog',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Kilyawon an mga pahina sa paagi kainin enotang panigmit]]',
 'searchprofile-articles' => 'Mga pahina nin laog',
 'searchprofile-project' => 'Mga pahina nin Tabang asin Proyekto',
@@ -1163,15 +1221,7 @@ Prubaran na panigmitan an saimong kahaputan nin ''all:'' sa paghanap kan gabos n
 'powersearch-togglenone' => 'Wara',
 'search-external' => 'Panluwas na paghahanap',
 'searchdisabled' => 'Pigpopogolan mûna an paghanap sa {{SITENAME}}. Mientras tanto, pwede ka man maghanap sa Google. Giromdomon tabî na an mga indise kan laog ninda sa {{SITENAME}} pwede ser na lumâ na.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Mayô',
-'qbsettings-fixedleft' => 'Nakatakód sa walá',
-'qbsettings-fixedright' => 'Nakatakód sa tûo',
-'qbsettings-floatingleft' => 'Naglálatáw sa walá',
-'qbsettings-floatingright' => 'Naglálatáw sa tûo',
-'qbsettings-directionality' => 'Nakadukot, minadepende sa skrip panukdoan kan saimong lengguwahe',
+'search-error' => 'May salang nangyari habang naghahanap:$1',
 
 # Preferences page
 'preferences' => 'Mga kabòtan',
@@ -1205,7 +1255,6 @@ Prubaran na panigmitan an saimong kahaputan nin ''all:'' sa paghanap kan gabos n
 'resetprefs' => 'Linigan an dae naitagamang mga kaliwatan',
 'restoreprefs' => 'Balikon an gabos na panugmad na mga panuytoy (sa gabos na mga seksyon)',
 'prefs-editing' => 'Pighihira',
-'prefs-edit-boxsize' => 'Sukol kan bintana sa pagliwat.',
 'rows' => 'Mga hilera:',
 'columns' => 'Mga taytay:',
 'searchresultshead' => 'Hanápon',
@@ -1216,9 +1265,9 @@ Prubaran na panigmitan an saimong kahaputan nin ''all:'' sa paghanap kan gabos n
 'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|aldaw|mga aldaw}}',
 'recentchangescount' => 'Numero kan mga pagliliwat na ipapahiling na pirmihan:',
 'prefs-help-recentchangescount' => 'Kabali kaini an dae pa nahaloy na mga kaliwatan, mga historiyang pahina, asin mga talaan.',
-'prefs-help-watchlist-token' => 'An pagpapano sa parteng ini nin sarong sekretong susi magbubuswang nin RSS feed para sa saimong bantay-listahan.
-Siisay man na nakakaaram kan suri sa parteng ini makakabasa kan saimong bantay-listahan, kaya magpili nin sarong seguradong halaga.
-Uya an halaga sa random na pagbuswang na puwede mong magamit: $1',
+'prefs-help-watchlist-token2' => 'Ini an sikretong susi sa bahugan kan web sa saimong bantay-listahan.
+An siisay man na makaaram kaini makakapagbasa kan saimong bantay-listahan, kaya dae mo ipagheras ini.
+[[Special:ResetTokens|I-klik digde kun kaipo mong baguhon it]].',
 'savedprefs' => 'Itinagama na an mga kabôtan mo.',
 'timezonelegend' => 'Pan-oras na sona:',
 'localtime' => 'Panlokal na oras:',
@@ -1249,7 +1298,6 @@ Uya an halaga sa random na pagbuswang na puwede mong magamit: $1',
 'prefs-reset-intro' => 'Ika makakagamit kaining pahina tanganing ilapat giraray an saimong mga kabotan sa panugmad kan sayt.
 Ini dae tabi matitingkog.',
 'prefs-emailconfirm-label' => 'Kumpirmasyon sa E-koreo',
-'prefs-textboxsize' => 'Sukol kan bintana sa pagliliwat',
 'youremail' => 'E-surat:',
 'username' => '{{GENDER:$1|Pangaran nin paragamit}}:',
 'uid' => '{{GENDER:$1|Paragamit}} ID:',
@@ -1283,6 +1331,8 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
 'prefs-dateformat' => 'Pampetsang pormat',
 'prefs-timeoffset' => 'Pan-oras na tapal',
 'prefs-advancedediting' => 'Pankagabsan na mga Pagpipilian',
+'prefs-editor' => 'Paraliwat',
+'prefs-preview' => 'Patânaw',
 'prefs-advancedrc' => 'Pangenot na mga pagpipilian',
 'prefs-advancedrendering' => 'Abantidong mga pagpipilian',
 'prefs-advancedsearchoptions' => 'Abantidong mga pagpipilian',
@@ -1290,7 +1340,9 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
 'prefs-displayrc' => 'Ihayag an mga pagpipilian',
 'prefs-displaysearchoptions' => 'Ipahiling ang mga pagpipilian',
 'prefs-displaywatchlist' => 'Ipahiling ang mga pagpipilian',
+'prefs-tokenwatchlist' => 'Paduos',
 'prefs-diffs' => 'Diffs',
+'prefs-help-prefershttps' => 'Ining kamuyahan magkaka-epekto sa masunod mong paglaog.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'An e-koreo nagpapahiling na balido',
@@ -1317,6 +1369,8 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
 'userrights-notallowed' => 'Ika mayo tabing permiso na magdugang o magtangkas nin mga katanosan kan paragamit.',
 'userrights-changeable-col' => 'Mga grupo na mapuwede mong baguhon',
 'userrights-unchangeable-col' => 'Mga grupo na dae mo mapuwedeng baguhon',
+'userrights-conflict' => 'Kumplikto sa mga kaliwatan nin mga katanosan kan paragamit! Tabi man pakirikisa asin kumpirmaron an saimong mga kaliwatan.',
+'userrights-removed-self' => 'Saimong matrayumpong pinagtangkas an sadire mong mga katanosan. Sa siring, ika dae na tabi makakalaog sa pahinang ini.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1382,11 +1436,19 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
 'right-proxyunbannable' => 'Sampawan an awtomatikong mga kubkob kan mga proksi',
 'right-unblockself' => 'Dae pagkubkubon an sadire',
 'right-protect' => 'Baguhon an mga kad-at nin proteksyon asin liwaton an mga pahina nin protektadong surunsunan',
-'right-editprotected' => 'Liwaton an protektadong mga pahina (na bakong pinagsasalansan an proteksyon)',
+'right-editprotected' => 'Liwaton an mga pahina na protektado bilang "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Liwaton an mga pahina na protektado bilang "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Liwaton an paragamit na olay-panlaog',
 'right-editusercssjs' => 'Liwaton an CSS asin JavaScript na mga sagunson kan ibang mga paragamit',
 'right-editusercss' => 'Liwaton an CSS na mga sagunson kan ibang mga paragamit',
 'right-edituserjs' => 'Liwaton an JavaScript na mga sagunson kan ibang mga paragamit',
+'right-editmyusercss' => 'Liwaton an saimong sadireng paragamit na sagunson sa CSS',
+'right-editmyuserjs' => 'Liwaton an saimong sadireng paragamit na sagunson sa JavaScript',
+'right-viewmywatchlist' => 'Tanawon an saimong sadireng bantay-listahan',
+'right-editmywatchlist' => 'Liwaton an saimong sadireng bantay-listahan. Tandai baya na an nagkapirang mga aksyon magdudugang pa man nin mga pahina dawa mayo kaining katanosan.',
+'right-viewmyprivateinfo' => 'Tanawon an sadire mong datos pribado (e.g. estada kan e-surat, tunay na pangaran)',
+'right-editmyprivateinfo' => 'Liwaton an sadire mong datos pribado (e.g. estada kan e-surat, tunay na pangaran)',
+'right-editmyoptions' => 'Liwaton an sadire mong mga kamuyahan',
 'right-rollback' => 'Hidaling ibalik an mga niliwat kan huring paragamit na nagliwat nin sarong partikular na pahina',
 'right-markbotedits' => 'Markahan an pinagbalik na mga niliwat bilang bot na panliwat',
 'right-noratelimit' => 'Dae magin apektado sa paagi kan rata nin mga sagkodan',
@@ -1448,12 +1510,19 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
 'action-userrights-interwiki' => 'liwaton an paragamit na mga karapatan kan mga paragamit nin ibang wikis',
 'action-siteadmin' => 'ikandado o dae ikandado an datos-sarayan',
 'action-sendemail' => 'magpadara nin mga e-koreo',
+'action-editmywatchlist' => 'liwaton an saimong bantay-listahan',
+'action-viewmywatchlist' => 'tanawon an saimong bantay-listahan',
+'action-viewmyprivateinfo' => 'tanawon an saimong pribadong impormasyon',
+'action-editmyprivateinfo' => 'liwaton an saimong pribadong impormasyon',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|kaliwatan|mga kaliwatan}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|poon kaidtong huring bisita}}',
+'enhancedrc-history' => 'historiya',
 'recentchanges' => 'Dae pa sana nahahaloy na mga kaliwatan',
 'recentchanges-legend' => 'Pinakahuring mga option kan mga pagbabago',
 'recentchanges-summary' => 'Hanapon an mga pinahuring pagbabâgo sa wiki digdi sa páhinang ini.',
+'recentchanges-noresult' => 'Mayong mga kaliwatan sa laog kan itinaong peryodo na nagtutugmad kaining krayterya.',
 'recentchanges-feed-description' => 'Antabayon an pinakahuring dae pa sana nahaloy na mga kaliwatan sa wiki na yaon sa panhungit na ini.',
 'recentchanges-label-newpage' => 'Ining pagliwat nakapagmukna nin sarong baguhon na pahina',
 'recentchanges-label-minor' => 'Ini saro sanang menor na pagliwat',
@@ -1490,7 +1559,6 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
 'recentchangeslinked-feed' => 'Mga angay na pagbabàgo',
 'recentchangeslinked-toolbox' => 'Kasurugpon na mga kaliwatan',
 'recentchangeslinked-title' => 'Mga kaliwatan na katakod sa "$1"',
-'recentchangeslinked-noresult' => 'Warang mga pagbabago sa mga pahinang nakatakod sa itinaong pagkalawig.',
 'recentchangeslinked-summary' => "Ini an listahan kan mga pagbabagong ginibo kan dae pa sana nahaloy sa mga pahina na nakatakod gikan sa sarong pinagsambit na pahina (o sa mga miyembro kan sarong pinagsambit na kategorya).
 An mga pahina na yaon sa [[Special:Watchlist|saimong Bantay-listahan]] na '''tekstong mahibog'''.",
 'recentchangeslinked-page' => 'Pahinang ngaran:',
@@ -1502,8 +1570,7 @@ An mga pahina na yaon sa [[Special:Watchlist|saimong Bantay-listahan]] na '''tek
 'reuploaddesc' => 'Ikansela an pagkarga asin magbalik sa porma kan pagkakarga',
 'upload-tryagain' => 'Isumite an modipikadong deskripsyon kan sagunson',
 'uploadnologin' => 'Dai nakalaog',
-'uploadnologintext' => "Kaipuhan ika si [[Special:UserLogin|nakadagos]]
-para makakarga nin mga ''file''.",
+'uploadnologintext' => 'Kaipo kang $1 tanganing makapagkarga nin mga sagunson.',
 'upload_directory_missing' => 'An direktoriyo nin pagkarga ($1) nawawara tabi asin dae maikapagmukna sa paagi kan webserver.',
 'upload_directory_read_only' => 'An directoriong pagkarga na ($1) dai puedeng suratan kan serbidor nin web.',
 'uploaderror' => 'Salâ an pagkarga',
@@ -1719,7 +1786,6 @@ Para sa pinakamakusog na seguridad, img_auth.php nganay pinagpundo.',
 'http-read-error' => 'HTTP na pagbabasa nasasala.',
 'http-timed-out' => 'HTTP na kahagadan naubos na an oras.',
 'http-curl-error' => 'An kasalaan nagsusungko sa kilyawan: $1',
-'http-host-unreachable' => 'Dae nakakaabot sa kilyawan.',
 'http-bad-status' => 'Igwa nin sarong problema habang yaon sa HTTP na kahagadan: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1747,6 +1813,10 @@ Para sa pinakamakusog na seguridad, img_auth.php nganay pinagpundo.',
 'listfiles_size' => 'Sukol',
 'listfiles_description' => 'Deskripsión',
 'listfiles_count' => 'Mga Bersyon',
+'listfiles-show-all' => 'Minabali kan lumang mga bersyon nin mga imahe',
+'listfiles-latestversion' => 'Sa ngunyan na bersyon',
+'listfiles-latestversion-yes' => 'Iyo',
+'listfiles-latestversion-no' => 'Dae',
 
 # File description page
 'file-anchor-link' => 'Sagunson',
@@ -1842,6 +1912,13 @@ Giromdoma baya na mag-tsek para sa iba pang kasugpon sa mga templato bago mo pag
 'randompage' => 'Purakan na pahina',
 'randompage-nopages' => 'Dae tabi nin mga pahina sa minasunod na {{PLURAL:$2|espasyong-ngaran|mga espasyong-ngaran}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Purakan na pahina sa kategoriya',
+'randomincategory-invalidcategory' => '"$1" bako sarong balidong pangaran nin kategoriya.',
+'randomincategory-nopages' => 'Mayo nin mga pahina sa [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Magkua nin purakan na pahina gikan sa kategoriya: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Magduman',
+
 # Random redirect
 'randomredirect' => 'Random na pagredirekta',
 'randomredirect-nopages' => 'Mayo nin panukdo-liwat sa espasyong-ngaran na "$1".',
@@ -1867,17 +1944,13 @@ Giromdoma baya na mag-tsek para sa iba pang kasugpon sa mga templato bago mo pag
 'statistics-users-active-desc' => 'Mga paragamit na may ginibong aksyon sa nakaaging {{PLURAL:$1|aldaw|$1 mga aldaw}}',
 'statistics-mostpopular' => 'mga pinaka pighiling na pahina',
 
-'disambiguations' => 'Mga pahinang minatulay pasiring sa pampalinaw na mga pahina',
-'disambiguationspage' => 'Template:kapaliwanagan',
-'disambiguations-text' => "An mga minasunod na mga pahina igwang laog nin kisera sarong tulay pasiring sa '''pampalinaw na pahina'''.
-Sinda mapuwedeng makipagsugpon pasiring sa sarong mas manigong pahina nanggad.<br />
-An sarong pahina tratado bilang pampalinaw na pahina kun ini minagamit nin sarong templato na nakasugpon gikan sa [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Mga pahina na igwang pahina nin kagrugaring',
 'pageswithprop-legend' => 'Mga pahina na igwang pahina nin kagrugaring',
 'pageswithprop-text' => 'Ining mahina naglilista kan mga pahina na minagamit nin partikular na pahina nin kagrugaring.',
 'pageswithprop-prop' => 'Kagrugaring na pangaran:',
 'pageswithprop-submit' => 'Larga',
+'pageswithprop-prophidden-long' => 'halawigon na pampropriyedad na tekstong halaga na ipinagtago ($1)',
+'pageswithprop-prophidden-binary' => 'binaryong propriyedad na an halaga ipinagtago ($1)',
 
 'doubleredirects' => 'Dobleng mga redirekta',
 'doubleredirectstext' => 'Ining pahina minalista nin mga pahina na minatukdo liwat pasiring sa pinagtukdong-liwat na mga pahina.
@@ -1936,6 +2009,7 @@ Ini ngunyan minatukdo-liwat pasiring sa [[$2]].',
 'mostrevisions' => 'Mga artikulong may pinakadakol na pagpakarháy',
 'prefixindex' => 'Gabos na mga pahina na igwa nin enotang panigmit',
 'prefixindex-namespace' => 'Gabos na mga pahina na igwa nin enotang panigmit ($1 espasyong ngaran)',
+'prefixindex-strip' => 'Waknison an pangenot na panigmit na yaon sa listahan',
 'shortpages' => 'Haralìpot na pahina',
 'longpages' => 'Mga halabang pahina',
 'deadendpages' => 'Mga pahinang mayong luwasan',
@@ -2129,10 +2203,9 @@ An maabot na mga pagbabâgo sa páhinang ini asin sa asosyadong páhina nin olay
 'unwatchthispage' => 'Pondohon an pagbantay',
 'notanarticle' => 'Bakong páhina nin laog',
 'notvisiblerev' => 'An huring rebisyon kan ibang paragamit pinagpura na',
-'watchnochange' => 'Mayo sa saimong mga pigbabantayan an nahira sa laog nin pinahiling na pagkalawig.',
 'watchlist-details' => '{{PLURAL:$1|$1 pahina|$1 mga pahina}} sa saimong bantay-listahan, dae binibilang an mga pahina nin orolayan.',
-'wlheader-enotif' => "* Nakaandar an paising ''e''-surat.",
-'wlheader-showupdated' => "* An mga páhinang pigbâgo poon kan huri mong bisita nakasurat nin '''mahîbog'''",
+'wlheader-enotif' => 'E-surat na paisi pinagpaandar na.',
+'wlheader-showupdated' => "Mga pahina na pinagriliwat poon kaidtong huri kang nagbisita sainda ipinapatanaw na '''mahîbog'''",
 'watchmethod-recent' => 'Pigsososog an mga kaaagi pa sanang hirá sa mga pigbabantayan na páhina',
 'watchmethod-list' => 'Pigsososog an mga pigbabantayan na páhina para mahiling an mga kaaagi pa sanan paghirá',
 'watchlistcontains' => 'An saimong lista nin pigbabantayan igwang $1 na {{PLURAL:$1|páhina|mga páhina}}.',
@@ -2380,7 +2453,7 @@ $1",
 'contributions' => '{{GENDER:$1|Paragamit}} na mga kaambagan',
 'contributions-title' => 'Mga kontribusyon kan paragamit para sa $1',
 'mycontris' => 'Mga Kaarambagan',
-'contribsub2' => 'Para sa $1 ($2)',
+'contribsub2' => 'Para ki $1($2)',
 'nocontribs' => 'Mayong mga pagbabago na nahanap na kapadis sa ining mga criteria.',
 'uctop' => '(sa ngunyan)',
 'month' => 'Poon bulan (asin mas amay):',
@@ -2538,14 +2611,12 @@ Hilngon sa [[Special:BlockList|listahan nin kubkob]] para sa listahan kan presen
 Ini, baya, pinagkubkob bilang parte kan hidwas $2, na mapuwedeng daemakukubkob.',
 'ip_range_invalid' => 'Dai pwede ining serye nin IP.',
 'ip_range_toolarge' => 'An hidwas kan mga kubkob dakulaon kesa /$1 dae pinagtutugutan.',
-'blockme' => 'Kubkuba ako',
 'proxyblocker' => 'Parabagát na karibay',
-'proxyblocker-disabled' => 'Ining punksyon pinag-untok.',
 'proxyblockreason' => 'Binagat an saimong direccion nin IP ta ini sarong bukas na proxy. Apodon tabi an saimong Internet service provider o tech support asin ipaaram sainda ining seriosong problema nin seguridad.',
-'proxyblocksuccess' => 'Tapos.',
 'sorbsreason' => 'An saimong IP na estada pinaglista bilang sarong bukas na proksi sa lang kan DNSBL na ginagamit kan {{SITENAME}}.',
 'sorbs_create_account_reason' => 'An saimong IP na estada pinaglista bilang sarong bukas na proksi sa laog kan DNSBL na ginagamit kan {{SITENAME}}.
 Ika dae makakamukna nin sarong panindog.',
+'xffblockreason' => 'An yaong IP adres sa laog nin X-Pinagtulod-Para sa kapamayuhan, dawa saimo o idtong proksing serbidor na saimong ginagamit, pinagkubkob. An orihinal na rason sa pagkubkob iyo na:$1',
 'cant-block-while-blocked' => 'Ika dae makakakubkob kan ibang mga paragamit mantang ika nakukubkob pa.',
 'cant-see-hidden-user' => 'An paragamit na pinagpubaran mong kubkubon pinagkubkob asin pinagtago na. Mala ta ika mayo nin karapatan na magtago nin paragamit, ika dae makakahiling or makakaliwat kan kinubkob na paragamit.',
 'ipbblocked' => 'Ika da makakakubkob or maghale nin kubkob sa ibang mga paragamit, nin huli ta ika mismo sa sadiri mo pinagkubkob na',
@@ -2704,6 +2775,8 @@ Pakibisita an [//www.mediawiki.org/wiki/Localisation Mediawiki Lokalisasyon] asi
 'thumbnail-more' => 'Padakuláon',
 'filemissing' => "Nawawarâ an ''file''",
 'thumbnail_error' => 'Kasalaan sa pagmumukna kan sadit na litrato: $1',
+'thumbnail_error_remote' => 'Mensahe nin kasalaan gikan sa $1: 
+$2',
 'djvu_page_error' => 'luwas sa serye an páhina kan DjVu',
 'djvu_no_xml' => 'Dai makua an XML para sa DjVu file',
 'thumbnail-temp-create' => 'Dae nakamukna nin temporaryong sagunson kan retrato',
@@ -2935,8 +3008,6 @@ Ini hurot na pinagkausa nin sarong sugpunan pasiring sa sarong pinagbawal na pan
 'pageinfo-category-files' => 'Bilang nin mga sagunson',
 
 # Skin names
-'skinname-standard' => 'Klasiko',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Bago',
 
 # Patrolling
@@ -3014,11 +3085,25 @@ Sa pagpapa-andar kaini, an saimong sistema mapupuwedeng makompromiso.",
 'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|$1 oras}}',
 'days' => '{{PLURAL:$1|$1 aldaw|$1 mga aldaw}}',
+'weeks' => '{{PLURAL:$1|$1 semana|$1 mga semana}}',
 'months' => '{{PLURAL:$1|$1 bulan|$1 mga bulan}}',
 'years' => '{{PLURAL:$1|$1 taon|$1 mga taon}}',
 'ago' => '$1 nakaagi',
 'just-now' => 'ngunyan sana',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|oras|mga oras}} na nakaagi pa sana',
+'minutes-ago' => '$1 {{PLURAL:$1|minuto|minutos}} na nakaagi pa sana',
+'seconds-ago' => '$1 {{PLURAL:$1|segundo|mga segundo}} na nakaagi pa sana',
+'monday-at' => 'Lunes mga $1',
+'tuesday-at' => 'Martes mga $1',
+'wednesday-at' => 'Miyerkules mga $1',
+'thursday-at' => 'Huwebes mga $1',
+'friday-at' => 'Biyernes mga $1',
+'saturday-at' => 'Sabado mga $1',
+'sunday-at' => 'Domingo mga $1',
+'yesterday-at' => 'Kasuodma mga $1',
+
 # Bad image list
 'bad_image_list' => 'An pormat iyo ining minasunod:
 
@@ -3048,7 +3133,7 @@ An mga iba pagtatagoon sa paagi nin pirmehan.
 * gpspalaba
 * gpspalangkaw',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lakbáng',
 'exif-imagelength' => 'Langkáw',
 'exif-bitspersample' => 'Panaradit kada komponente',
@@ -3227,7 +3312,7 @@ Sublokas kan siyudad na ipinahiling',
 'exif-originalimageheight' => 'Langkaw kan imahe bago ini pinagkrap',
 'exif-originalimagewidth' => 'Lakbang kan imahe bago ini pinagkrap',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Pinaghalugaan',
 'exif-compression-2' => 'CCITT Grupong 3 1-Dimensyonal na pagbabago ni Huffman nagdadalagan nin halawig na pag-enkod',
 'exif-compression-3' => 'CCITT Grupong 3 pinag-enkod sa fax',
@@ -3618,7 +3703,6 @@ Pwede mo man [[Special:EditWatchlist|gamiton an standard editor]].',
 'version-other' => 'An iba pa',
 'version-mediahandlers' => 'Mga Midyang Tagakapot',
 'version-hooks' => 'Mga pangawil',
-'version-extension-functions' => 'Mga punksyon kan ekstensyon',
 'version-parser-extensiontags' => 'Mga ekstensyong panmarka kan Parser',
 'version-parser-function-hooks' => 'Mga panpunksyong pangawil kan Parser',
 'version-hook-name' => 'Ngaran kan pangawil',
@@ -3627,6 +3711,7 @@ Pwede mo man [[Special:EditWatchlist|gamiton an standard editor]].',
 'version-license' => 'Lisensiya',
 'version-poweredby-credits' => "An wiking ini pinagpagana kan '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'mga iba pa',
+'version-poweredby-translators' => 'translatewiki.net na mga paradakit-taramon',
 'version-credits-summary' => 'Gusto niyamong rekonosiron an minasunod na mga persona nin huli kan saindang ambag sa [[Special:Version|Mediawiki]].',
 'version-license-info' => 'An MediaWiki sarong libreng kasungatan; puwede mong ipanao ini asin/o baguhon ini sa irarom kan termino nin HNU (Heneral na Pampublikong Lisensiya) bilang publisado kan Free Software Foundation; maski sa arin na bersyon 2 kan lisensiya, o (saimong pansadireng pagpipilian) arinman na huring bersyon.
 
@@ -3640,12 +3725,17 @@ Ika dapat na nakapagresibe na kan [{{SERVER}}{{SCRIPTPATH}}/COPYING sarong kopya
 'version-entrypoints-header-entrypoint' => 'Puntong pan-entrada',
 'version-entrypoints-header-url' => 'Kilyawan',
 
-# Special:FilePath
-'filepath' => 'Pansagunsong agihan',
-'filepath-page' => 'Sagunson:',
-'filepath-submit' => 'Magduman',
-'filepath-summary' => 'Ining espesyal na pahina minapabalik kan kumpletong agihan para sa sarong sagunson.
-Mga imahe ipinapahiling sa bilog na resolusyon, an iba pang tipo nin mga sagunson pinagpapoon nin direkta kan saindang asosyadong programa.',
+# Special:Redirect
+'redirect' => 'Palikwatong sa paagi nin sagunson, paragamit, or rebisyon kan ID',
+'redirect-legend' => 'Palikwatong pasiring sa sarong sagunson o pahina',
+'redirect-summary' => 'Ining espesyal na pahina minalikwat pasiring sa sarong sagunson (ipinagtao an ngaran kan sagunson), sarong pahina (ipinagtao an sarong rebisyon kan ID), o sarong pahina nin paragamit (ipinagtao an numerikong ID nin paragamit).',
+'redirect-submit' => 'Dumani',
+'redirect-lookup' => 'Hanapon mo',
+'redirect-value' => 'Halaga:',
+'redirect-user' => 'ID nin Paragamit',
+'redirect-revision' => 'Rebisyon kan Pahina',
+'redirect-file' => 'Ngaran nin Sagunson',
+'redirect-not-exists' => 'Halaga dae nanagboan',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Maghanap kan duplikadong mga sagunson',
@@ -3694,6 +3784,7 @@ Mga imahe ipinapahiling sa bilog na resolusyon, an iba pang tipo nin mga sagunso
 'tags' => 'Balidong mga marka nin kaliwatan',
 'tag-filter' => '[[Special:Tags|Tag]] saraon:',
 'tag-filter-submit' => 'Saraan',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tatak|Mga Tatak}}]]: $2)',
 'tags-title' => 'Mga marka',
 'tags-intro' => 'Ining pahina minalista kan mga marka na an kasungatan mapuwedeng maimarka an pagliwat kaini, asin an saindang mga kahulugan.',
 'tags-tag' => 'Ngarang panmarka',
@@ -3720,6 +3811,7 @@ Mga imahe ipinapahiling sa bilog na resolusyon, an iba pang tipo nin mga sagunso
 'dberr-problems' => 'Sori! Ining sityo igwang naeksperiyensiyahan na mga kakundian sa teknikal.',
 'dberr-again' => 'Prubaring maghalat tabi nin nagkapirang minutos asin otrohon ikarga.',
 'dberr-info' => '(Dae makakontak sa serbidor kan datos-sarayan: $1)',
+'dberr-info-hidden' => '(Dae makakontak sa serbidor kan datos-sarayan)',
 'dberr-usegoogle' => 'Ika puwedeng magprubar na maghanap sa Google nguna.',
 'dberr-outofdate' => 'Pasinon mo tabi na an saindang mga indekso kan satuyang laog puwedeng luwas na sa petsa.',
 'dberr-cachederror' => 'Ini sarong nakasaray na kopya kan pinaghahagad na pahina, asin puwedeng bakong angat sa petsa.',
@@ -3735,6 +3827,9 @@ Mga imahe ipinapahiling sa bilog na resolusyon, an iba pang tipo nin mga sagunso
 'htmlform-submit' => 'Sumitiron',
 'htmlform-reset' => 'Dae idagos an mga kaliwatan',
 'htmlform-selectorother-other' => 'An iba',
+'htmlform-no' => 'Habó',
+'htmlform-yes' => 'Iyo',
+'htmlform-chosen-placeholder' => 'Magpili nin sarong opsyon',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 na igwang suporta sa kabilogang-teksto nin paghahanap',
@@ -3852,4 +3947,19 @@ Kun bako man, ika makakagamit nin sayon na porma sa ibaba. An saimong komento id
 # Image rotation
 'rotate-comment' => 'An imahe pinagbirik ni $1 {{PLURAL:$1|grado|mga grado}} hitsado',
 
+# Limit report
+'limitreport-title' => 'Datos panungdanan kan parabangay:',
+'limitreport-cputime' => 'Oras na ginagamit kan CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-walltime' => 'Tunay na oras na ginagamit',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-ppvisitednodes' => 'Bilang kan tagapagsumpay sa pangenot na tagapagprosesong pinagbisita',
+'limitreport-ppgeneratednodes' => 'Bilang kan tagapagsumpay sa pangenot na tagapagprosesong pinagpuyos',
+'limitreport-postexpandincludesize' => 'Bigak kan paskil kabali an sukol',
+'limitreport-postexpandincludesize-value' => '$1/$2 mga bayta',
+'limitreport-templateargumentsize' => 'Sukol kan argumentong panguyog',
+'limitreport-templateargumentsize-value' => '$1/$2 mga bayta',
+'limitreport-expansiondepth' => 'Kinatugmadan kan pinakahalangkaw na kahiwasan',
+'limitreport-expensivefunctioncount' => 'Bilang kan hiro nin mamahalon na parabangay',
+
 );
diff --git a/languages/messages/MessagesBe.php b/languages/messages/MessagesBe.php
index aed573ad..85dab072 100644
--- a/languages/messages/MessagesBe.php
+++ b/languages/messages/MessagesBe.php
@@ -120,9 +120,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Паказваць колькасць назіральнікаў',
 'tog-oldsig' => 'Існуючы подпіс:',
 'tog-fancysig' => 'Апрацоўваць подпіс як вікі-тэкст (без аўтаматычнай спасылкі)',
-'tog-externaleditor' => "Карыстацца вонкавай праграмай для праўкі (edit); рэкамендуецца толькі для спецыялістаў, бо патрабуе адмысловых настаўленняў на камп'ютары; [//www.mediawiki.org/wiki/Manual:External_editors гл. падрабязна.]",
-'tog-externaldiff' => "Карыстацца вонкавай праграмай для параўнання (diff); рэкамендуецца толькі для спецыялістаў, бо патрабуе адмысловых настаўленняў на камп'ютары; [//www.mediawiki.org/wiki/Manual:External_editors гл. падрабязна.]",
-'tog-showjumplinks' => 'Дазволіць дапаможныя спасылкі "jump to"',
 'tog-uselivepreview' => 'Жывы перадпаказ (Яваскрыпт, эксперыментальн.)',
 'tog-forceeditsummary' => 'Папярэджваць пра пустое поле тлумачэння праўкі',
 'tog-watchlisthideown' => 'Не паказваць у назіраным сваіх правак',
@@ -135,6 +132,7 @@ $messages = array(
 'tog-diffonly' => 'Не паказваць рэшты старонкі пад розніцай',
 'tog-showhiddencats' => 'Паказаць схаваныя катэгорыі',
 'tog-norollbackdiff' => 'Не паказваць розніцу ў выніку адкату',
+'tog-useeditwarning' => 'Папярэдзіць мяне, калі я пакідаю старонку з незахаванымі праўкамі',
 
 'underline-always' => 'Заўсёды',
 'underline-never' => 'Ніколі',
@@ -198,6 +196,18 @@ $messages = array(
 'oct' => 'Кас',
 'nov' => 'Ліс',
 'dec' => 'Сне',
+'january-date' => '$1 студзеня',
+'february-date' => '$1 лютага',
+'march-date' => '$1 сакавіка',
+'april-date' => '$1 красавіка',
+'may-date' => '$1 мая',
+'june-date' => '$1 чэрвеня',
+'july-date' => '$1 ліпеня',
+'august-date' => '$1 жніўня',
+'september-date' => '$1 верасня',
+'october-date' => '$1 кастрычніка',
+'november-date' => '$1 лістапада',
+'december-date' => '$1 снежня',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Катэгорыя|Катэгорыі}}',
@@ -279,6 +289,7 @@ $messages = array(
 'create-this-page' => 'Стварыць старонку',
 'delete' => 'сцерці',
 'deletethispage' => 'Сцерці гэту старонку',
+'undeletethispage' => 'Аднавіць гэту старонку',
 'undelete_short' => 'Аднавіць {{PLURAL:$1|адну праўку|$1 правак}}',
 'viewdeleted_short' => 'Паказаць {{PLURAL:$1|адну сцёртую праўку|$1 сцёртыя праўкі}}',
 'protect' => 'Ахова',
@@ -322,7 +333,7 @@ $1',
 'pool-queuefull' => 'Чарга запытаў перапоўнена',
 'pool-errorunknown' => 'Невядомая памылка',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Пра {{GRAMMAR:вінавальны|{{SITENAME}}}}',
 'aboutpage' => 'Project:Пра {{GRAMMAR:вінавальны|{{SITENAME}}}}',
 'copyright' => 'Матэрыял даступны на ўмовах $1.',
@@ -332,7 +343,6 @@ $1',
 'disclaimers' => 'Адмова ад адказнасці',
 'disclaimerpage' => 'Project:Агульная адмова ад адказнасці',
 'edithelp' => 'Даведка рэдактарскага акна',
-'edithelppage' => 'Help:Праўка',
 'helppage' => 'Help:Змест',
 'mainpage' => 'Галоўная старонка',
 'mainpage-description' => 'Першая старонка',
@@ -407,18 +417,6 @@ $1',
 # General errors
 'error' => 'Памылка',
 'databaseerror' => 'Памылка базы дадзеных',
-'dberrortext' => 'Памылка ў сінтаксісе звароту ў базу даных.
-Магчыма, прычына ў памылцы ў праграмным забеспячэнні.
-Апошні зварот у базу, які спрабаваўся:
-
-<blockquote><tt>$1</tt></blockquote>
-з функцыі "<tt>$2</tt>".
-Памылка, вернутая з БД: "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Памылка ў сінтаксісе звароту ў базу даных.
-Апошні зварот у базу, які спрабаваўся:
-"$1"
-з функцыі "$2".
-Памылка, вернутая з БД: "$3: $4"',
 'laggedslavemode' => 'Увага: Старонка можа не ўтрымліваць апошніх зменаў.',
 'readonly' => 'База звестак заблакаваная',
 'enterlockreason' => 'Упішыце прычыну зачынення, а таксама меркаваны час адчынення',
@@ -469,7 +467,6 @@ $1',
 'editinginterface' => "'''Увага:''' Вы правіце старонку, якая ўтрымлівае тэкст карыстальніцкага інтэрфейсу.
 Яе змяненне паўплывае на вонкавы выгляд праграмы для ўсіх удзельнікаў.
 Праект лакалізацыі MediaWiki: [//translatewiki.net/wiki/Main_Page?setlang=be translatewiki.net].",
-'sqlhidden' => '(зварот SQL не паказаны)',
 'cascadeprotected' => 'Старонка знаходзіцца пад аховай ад правак, таму што яна ўлучана ў наступн{{PLURAL:$1|ую старонку|ыя старонкі}}, якія ахоўваюцца з магчымасцю "каскаднага распаўсюджвання" аховы:
 $2',
 'namespaceprotected' => "Вам не дазволена правіць старонкі ў прасторы назваў '''$1'''.",
@@ -492,10 +489,18 @@ $2',
 'welcomecreation-msg' => 'Ваш рахунак быў створаны.
 Не забудзьцеся дапасаваць [[Special:Preferences|персанальныя настаўленні]] для {{SITENAME}}.',
 'yourname' => 'Імя ўдзельніка',
+'userlogin-yourname' => 'Імя ўліковага запісу',
+'userlogin-yourname-ph' => 'Увядзіце імя вашага ўліковага запісу',
 'yourpassword' => 'Пароль',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Увядзіце ваш пароль',
+'createacct-yourpassword-ph' => 'Увядзіце пароль',
 'yourpasswordagain' => 'Паўтарыце пароль',
+'createacct-yourpasswordagain' => 'Пацвердзіце пароль',
+'createacct-yourpasswordagain-ph' => 'Увядзіце пароль яшчэ раз',
 'remembermypassword' => "Памятаць мяне на гэтым камп'ютары (не даўжэй за $1 {{PLURAL:$1|дзень|дзён}})",
-'securelogin-stick-https' => 'Працягваць злучэнне па HTTPS пасля ўвахода',
+'userlogin-remembermypassword' => 'Заставацца ў сістэме',
+'userlogin-signwithsecure' => 'Выкарыстоўваць абароненае злучэнне',
 'yourdomainname' => 'Ваш дамен',
 'externaldberror' => 'Або памылка вонкавай аўтэнтыкацыі ў базе дадзеных, або вам не дазволена абнаўляць свой вонкавы рахунак.',
 'login' => 'Увайсці ў сістэму',
@@ -582,7 +587,7 @@ $2',
 'newpassword' => 'Новы пароль:',
 'retypenew' => 'Новы пароль паўторна:',
 'resetpass_submit' => 'Наставіць пароль і ўвайсці',
-'resetpass_success' => 'Ваш пароль паспяхова зменены! Цяпер уваходзім...',
+'changepassword-success' => 'Ваш пароль паспяхова зменены! Цяпер уваходзім...',
 'resetpass_forbidden' => 'Не дазволена мяняць паролі',
 'resetpass-no-info' => 'Трэба ўвайсці ў сістэму, каб звяртацца да гэтай старонкі наўпрост.',
 'resetpass-submit-loggedin' => 'Змяніць пароль',
@@ -593,10 +598,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Выслаць мне новы пароль',
-'passwordreset-text' => 'Запоўніце гэтую форму, каб атрымаць па электроннай пошце напамін вашага акаўнта.',
 'passwordreset-legend' => 'Пераўстанавіць пароль',
 'passwordreset-disabled' => 'Функцыя пераўсталёўкі пароля адключаная на гэтай вікі.',
-'passwordreset-pretext' => '{{PLURAL:$1||Калі ласка, увядзіце адзін з фрагментаў дадзеных ніжэй}}',
 'passwordreset-username' => 'Імя ўдзельніка',
 'passwordreset-domain' => 'Дамен:',
 'passwordreset-capture' => 'Праглядзець напісаны ліст?',
@@ -819,8 +822,11 @@ $2
 Здаецца, што яна была сцёртая.',
 'edit-conflict' => 'Канфлікт правак.',
 'edit-no-change' => 'Вашая праўка была праігнараваная, таму што не мяняўся тэкст.',
+'postedit-confirmation' => 'Вашая праўка была захаваная.',
 'edit-already-exists' => 'Не ўдалося стварыць новую старонку.
 Такая ўжо існуе.',
+'editwarning-warning' => 'Выхад з гэтай старонкі прывядзе да страты правак, якія вы зрабілі. 
+Калі Вы зарэгістраваныя ў сістэме, Вы можаце адключыць гэта папярэджанне ў закладцы "Праца" Вашых настаўленняў.',
 
 # Content models
 'content-model-wikitext' => 'вікі-тэкст',
@@ -1045,7 +1051,6 @@ $1",
 'searchmenu-legend' => 'Настаўленні пошуку',
 'searchmenu-exists' => "'''На вікі ёсць старонка \"[[:\$1]]\"'''",
 'searchmenu-new' => "'''Стварыць на гэтай вікі старонку \"[[:\$1]]\"'''",
-'searchhelp-url' => 'Help:Змест',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Паказаць старонкі з гэтым прэфіксам]]',
 'searchprofile-articles' => 'Артыкулы',
 'searchprofile-project' => 'Старонкі даведкі і праекта',
@@ -1087,15 +1092,6 @@ $1",
 'search-external' => 'Вонкавы пошук',
 'searchdisabled' => 'Функцыя пошуку {{SITENAME}} не працуе. Тымчасова можна шукаць з дапамогай Google. Заўважце, што тамтэйшыя індэксы зместу {{SITENAME}} могуць не быць актуальнымі.',
 
-# Quickbar
-'qbsettings' => 'Хуткая стужка',
-'qbsettings-none' => 'Няма',
-'qbsettings-fixedleft' => 'Прымацавана злева',
-'qbsettings-fixedright' => 'Прымацавана справа',
-'qbsettings-floatingleft' => 'Плавае злева',
-'qbsettings-floatingright' => 'Плавае справа',
-'qbsettings-directionality' => 'Фіксаваная, у залежнасці ад накіравання вашай мовы',
-
 # Preferences page
 'preferences' => 'Настаўленні',
 'mypreferences' => 'Настáўленні',
@@ -1127,7 +1123,6 @@ $1",
 'resetprefs' => 'Да пачатковых',
 'restoreprefs' => 'Аднавіць усе прадвызначэнні',
 'prefs-editing' => 'Праца',
-'prefs-edit-boxsize' => 'Памер рэдактарскага акна.',
 'rows' => 'Радкі:',
 'columns' => 'Калонкі:',
 'searchresultshead' => 'Пошук',
@@ -1138,9 +1133,6 @@ $1",
 'recentchangesdays-max' => '(найбольш $1 {{PLURAL:$1|дзень|дзён}})',
 'recentchangescount' => 'Прадвызначаная колькасць правак дзеля паказу:',
 'prefs-help-recentchangescount' => 'Гэта ўключае ў сябе апошнія змены, гісторыі старонак, журналы.',
-'prefs-help-watchlist-token' => 'Упісанне сакрэтнага ключа ў гэтае поле створыць RSS-струмень з вашага спісу назіранага. 
-Кожны, каму вядомы гэты ключ, зможа чытаць ваш спіс назіранага, таму выбірайце бяспечныя ключы. 
-Вось аўта-згенераваны ключ, які можна выкарыстаць: $1',
 'savedprefs' => 'Настáўленні замацаваныя.',
 'timezonelegend' => 'Часавы пояс:',
 'localtime' => 'Мясцовы час:',
@@ -1171,7 +1163,6 @@ $1",
 'prefs-reset-intro' => 'Тут можна вярнуць свае настаўленні да прадвызначэнняў, прынятых на гэтай пляцоўцы.
 Адкаціць гэтае дзеянне нельга.',
 'prefs-emailconfirm-label' => 'Пацверджанне адрасу эл.пошты:',
-'prefs-textboxsize' => 'Памер акна рэдагавання',
 'youremail' => 'Эл.пошта *',
 'username' => 'Імя ўдзельніка:',
 'uid' => 'ID удзельніка:',
@@ -1406,7 +1397,6 @@ $1",
 'recentchangeslinked-feed' => 'Звязаныя праўкі',
 'recentchangeslinked-toolbox' => 'Звязаныя праўкі',
 'recentchangeslinked-title' => 'Змяненні, якія датычаць "$1"',
-'recentchangeslinked-noresult' => 'Без змяненняў на далучаных старонках за азначаны перыяд.',
 'recentchangeslinked-summary' => "Гэта пералік нядаўніх змяненняў старонак, на якія спасылаецца азначаная старонка, або змяненняў складнікаў азначанай катэгорыі.
 Старонкі, якія ўваходзяць у [[Special:Watchlist|лік назіраных вамі]], выдзелены '''стылем'''.",
 'recentchangeslinked-page' => 'Назва старонкі:',
@@ -1612,7 +1602,6 @@ $1',
 'http-read-error' => 'Памылка чытання HTTP',
 'http-timed-out' => 'Мінуў час чакання HTTP-запыту.',
 'http-curl-error' => 'Памылка звароту да URL: $1',
-'http-host-unreachable' => 'Не ўдалося адкрыць URL',
 'http-bad-status' => 'Пад час апрацоўкі HTTP-запыту выяўлена праблема: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1754,12 +1743,6 @@ $1',
 'statistics-users-active-desc' => 'Удзельнікі, якія хоць нешта зрабілі за апошн{{PLURAL:$1|і дзень|ія $1 дзён}}',
 'statistics-mostpopular' => 'Самыя папулярныя старонкі',
 
-'disambiguations' => 'Старонкі, якія спасылаюцца на старонкі вырашэння неадназначнасцяў',
-'disambiguationspage' => 'Template:Неадназначнасць',
-'disambiguations-text' => "Гэтыя старонкі спасылаюцца на '''старонкі развязкі неадназначнасцяў'''.
-Лепей, каб яны спасылаліся на канкрэтныя тэматычныя старонкі.<br />
-Старонка лічыцца старонкай развязкі, калі ў яе ўлучаецца такі шаблон, на які спасылаецца [[MediaWiki:Disambiguationspage]]",
-
 'doubleredirects' => 'Падвойныя перасылкі',
 'doubleredirectstext' => 'Тут пералічаныя старонкі-перасылкі, якія паказваюць на іншыя перасылкі.
 Кожны радок утрымлівае спасылкі на першую і другую перасылкі, а таксама мэту другой перасылкі, якая звычайна і ёсць "сапраўдная" мэтавая старонка, на якую павінна была паказваць першая перасылка.
@@ -1998,10 +1981,9 @@ $1',
 'unwatchthispage' => 'Спыніць назіранне',
 'notanarticle' => 'Гэта не змястоўная старонка',
 'notvisiblerev' => 'Версія сцёртая',
-'watchnochange' => 'Ніводзін з назіраных складнікаў не быў зменены за паказаны перыяд.',
 'watchlist-details' => 'Назіраю {{PLURAL:$1|$1 старонку|$1 старонак}} без уліку размоўных.',
-'wlheader-enotif' => '* Працуе апавяшчанне праз эл.пошту.',
-'wlheader-showupdated' => "* Старонкі, якія былі зменены пасля вашага апошняга іх наведвання, паказаны '''абрысам шрыфту'''.",
+'wlheader-enotif' => 'Працуе апавяшчанне праз эл.пошту.',
+'wlheader-showupdated' => "Старонкі, якія былі зменены пасля вашага апошняга іх наведвання, паказаны '''абрысам шрыфту'''.",
 'watchmethod-recent' => 'правяраем нядаўнія праўкі ў назіраных старонках',
 'watchmethod-list' => 'правяраем наяўнасць нядаўніх правак ў назіраных старонках',
 'watchlistcontains' => 'У вашым спісе назіранага $1 {{PLURAL:$1|старонка|старонак}}.',
@@ -2381,12 +2363,9 @@ $1',
 'ipb_blocked_as_range' => 'Нельга зняць блок з IP-адрасу $1, таму што ён заблакаваны не наўпрост, але як частка абсягу $2; той абсяг, у сваю чаргу, можна разблакоўваць.',
 'ip_range_invalid' => 'Няправільны абсяг IP.',
 'ip_range_toolarge' => 'Блакіроўкі дыяпазонаў звыш /$1 забаронены.',
-'blockme' => 'Заблакаваць сябе',
 'proxyblocker' => 'Блакіратар проксі',
-'proxyblocker-disabled' => 'Гэта функцыя выключаная.',
 'proxyblockreason' => "Ваш адрас IP заблакаваны, таму што ён належыць да ліку адкрытых проксі.
 Гэта сур'ёзная праблема бяспекі; паведамце пра гэта свайму Інтэрнет-правайдэру або ў службу тэхнічнай падтрымкі.",
-'proxyblocksuccess' => 'Зроблена.',
 'sorbsreason' => 'Ваш адрас IP знаходзіцца ў спісе забароненых адкрытых проксі, якім карыстаецца {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Ваш адрас IP знаходзіцца ў спісе забароненых адкрытых проксі, якім карыстаецца {{SITENAME}}.
 Вы не можаце рэгістравацца',
@@ -2735,13 +2714,8 @@ $1',
 'pageinfo-authors' => 'Агульная колькасць розных аўтараў',
 
 # Skin names
-'skinname-standard' => 'Класіка',
-'skinname-nostalgia' => 'Настальгія',
 'skinname-cologneblue' => 'Сіні Кёльн',
 'skinname-monobook' => 'Манабук',
-'skinname-myskin' => 'Майскін',
-'skinname-chick' => 'Чык',
-'skinname-simple' => 'Проста',
 'skinname-modern' => 'Сучаснасць',
 
 # Patrolling
@@ -2841,7 +2815,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Шырыня',
 'exif-imagelength' => 'Вышыня',
 'exif-bitspersample' => 'Бітаў на кампанент',
@@ -3020,7 +2994,7 @@ $1',
 'exif-originalimageheight' => 'Вышыня малюнка да кадравання',
 'exif-originalimagewidth' => 'Шырыня малюнка да кадравання',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Нясціснута',
 'exif-compression-2' => 'CCITT Group 3, 1-мерная мадыфікацыя кадзіравання даўжынь серый Хафмана',
 'exif-compression-3' => 'CCITT Group 3, факсавае кадзіраванне',
@@ -3396,7 +3370,6 @@ $5
 'version-other' => 'Рознае',
 'version-mediahandlers' => 'Апрацоўнікі мультымедый',
 'version-hooks' => 'Хукі',
-'version-extension-functions' => 'Функцыі прыстаўкі',
 'version-parser-extensiontags' => 'Тагі прыстаўкі да парсера',
 'version-parser-function-hooks' => 'Хукі функцый парсера',
 'version-hook-name' => 'Назва хука',
@@ -3416,13 +3389,6 @@ MediaWiki распаўсюджваецца, спадзеючыся на прыд
 'version-entrypoints-header-entrypoint' => 'Кропка ўваходу',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Шлях да файла',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Пуск',
-'filepath-summary' => 'Гэтая адмысловая старонка вяртае поўны шлях да файла.
-Выявы паказваюцца ў поўным памеры, іншыя тыпы файлаў адкрываюцца ў прыпісаных да іх праграмах.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Пошук дублікатных файлаў',
 'fileduplicatesearch-summary' => 'Пошук дублікатных файлах на падставе іх хэшаў.',
diff --git a/languages/messages/MessagesBe_tarask.php b/languages/messages/MessagesBe_tarask.php
index a3e4e74c..f3e431f7 100644
--- a/languages/messages/MessagesBe_tarask.php
+++ b/languages/messages/MessagesBe_tarask.php
@@ -13,6 +13,7 @@
  * @author Geitost
  * @author Jim-by
  * @author Kaganer
+ * @author Nemo bis
  * @author Red Winged Duck
  * @author Renessaince
  * @author Wizardist
@@ -100,6 +101,7 @@ $specialPageAliases = array(
 	'Uncategorizedpages'        => array( 'Некатэгарызаваныя_старонкі' ),
 	'Uncategorizedtemplates'    => array( 'Некатэгарызаваныя_шаблёны' ),
 	'Upload'                    => array( 'Загрузка' ),
+	'Userlogin'                 => array( 'Уваход_у_сыстэму' ),
 	'Version'                   => array( 'Вэрсія' ),
 	'Wantedcategories'          => array( 'Запатрабаваныя_катэгорыі' ),
 	'Wantedfiles'               => array( 'Запатрабаваныя_файлы' ),
@@ -290,9 +292,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Паказваць колькасьць назіральнікаў',
 'tog-oldsig' => 'Цяперашні подпіс:',
 'tog-fancysig' => 'Апрацоўваць подпіс як вікі-тэкст (без аўтаматычнай спасылкі)',
-'tog-externaleditor' => 'Выкарыстоўваць вонкавы рэдактар па змоўчваньні (толькі для адмыслоўцаў, патрабуе спэцыяльных наладак на вашым кампутары. [//www.mediawiki.org/wiki/Manual:External_editors Падрабязнасьці.])',
-'tog-externaldiff' => 'Выкарыстоўваць вонкавую праграму параўнаньня вэрсіяў па змоўчваньні (толькі для адмыслоўцаў, патрабуе спэцыяльных наладак на вашым кампутары. [//www.mediawiki.org/wiki/Manual:External_editors Падрабязнасьці.])',
-'tog-showjumplinks' => 'Актываваць дапаможныя спасылкі «перайсьці да»',
 'tog-uselivepreview' => 'Выкарыстоўваць хуткі папярэдні прагляд (экспэрымэнтальна)',
 'tog-forceeditsummary' => 'Папярэджваць пра адсутнасьць кароткага апісаньня зьменаў',
 'tog-watchlisthideown' => 'Хаваць мае праўкі ў сьпісе назіраньня',
@@ -306,6 +305,8 @@ $messages = array(
 'tog-showhiddencats' => 'Паказваць схаваныя катэгорыі',
 'tog-noconvertlink' => 'Забараніць канвэртацыю назваў спасылак',
 'tog-norollbackdiff' => 'Не паказваць зьмены пасьля выкарыстаньня функцыі адкату',
+'tog-useeditwarning' => 'Папярэджваць мяне, калі я буду пакідаць старонку рэдагаваньня зь незахаванымі зьменамі',
+'tog-prefershttps' => 'Заўсёды карыстацца бясьпечным злучэньнем па ўваходзе ў сыстэму',
 
 'underline-always' => 'Заўсёды',
 'underline-never' => 'Ніколі',
@@ -369,6 +370,18 @@ $messages = array(
 'oct' => 'кас',
 'nov' => 'ліс',
 'dec' => 'сьн',
+'january-date' => '$1 студзеня',
+'february-date' => '$1 лютага',
+'march-date' => '$1 сакавіка',
+'april-date' => '$1 красавіка',
+'may-date' => '$1 траўня',
+'june-date' => '$1 чэрвеня',
+'july-date' => '$1 ліпеня',
+'august-date' => '$1 жніўня',
+'september-date' => '$1 верасьня',
+'october-date' => '$1 кастрычніка',
+'november-date' => '$1 лістапада',
+'december-date' => '$1 сьнежня',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Катэгорыя|Катэгорыі|Катэгорыі}}',
@@ -450,6 +463,7 @@ $messages = array(
 'create-this-page' => 'Стварыць гэтую старонку',
 'delete' => 'Выдаліць',
 'deletethispage' => 'Выдаліць гэтую старонку',
+'undeletethispage' => 'Аднавіць гэту старонку',
 'undelete_short' => 'Аднавіць $1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}',
 'viewdeleted_short' => 'Паказаць $1 {{PLURAL:$1|выдаленае рэдагаваньне|выдаленыя рэдагаваньні|выдаленых рэдагаваньняў}}',
 'protect' => 'Абараніць',
@@ -493,7 +507,7 @@ $1',
 'pool-queuefull' => 'Чарга запытаў поўная',
 'pool-errorunknown' => 'Невядомая памылка',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Пра {{GRAMMAR:вінавальны|{{SITENAME}}}}',
 'aboutpage' => 'Project:Пра {{GRAMMAR:вінавальны|{{SITENAME}}}}',
 'copyright' => 'Зьмест даступны на ўмовах $1, калі не пазначана іншае.',
@@ -503,7 +517,6 @@ $1',
 'disclaimers' => 'Адмова ад адказнасьці',
 'disclaimerpage' => 'Project:Адмова ад адказнасьці',
 'edithelp' => 'Дапамога ў рэдагаваньні',
-'edithelppage' => 'Help:Рэдагаваньне',
 'helppage' => 'Help:Зьмест',
 'mainpage' => 'Галоўная старонка',
 'mainpage-description' => 'Галоўная старонка',
@@ -582,17 +595,12 @@ $1',
 # General errors
 'error' => 'Памылка',
 'databaseerror' => 'Памылка базы зьвестак',
-'dberrortext' => 'Выяўленая памылка сынтаксісу ў звароце да базы зьвестак.
-Магчыма, гэта памылка праграмнага забесьпячэньня.
-Апошні запыт да базы:
-<blockquote><code>$1</code></blockquote>
-адбыўся з функцыі «<code>$2</code>».
-База зьвестак вярнула памылку «<samp>$3: $4</samp>».',
-'dberrortextcl' => 'Выяўлена памылка сынтаксісу ў звароце да базы зьвестак.
-Апошні запыт да базы:
-«$1»
-адбыўся з функцыі «$2».
-База зьвестак вярнула памылку «$3: $4»',
+'databaseerror-text' => 'Пры запыце базы зьвестак узьнікла памылка.
+Гэта можа сьведчыць пра няспраўнасьць апраграмаваньня.',
+'databaseerror-textcl' => 'Узьнікла памылка запыту базы зьвестак.',
+'databaseerror-query' => 'Запыт: $1',
+'databaseerror-function' => 'Функцыя: $1',
+'databaseerror-error' => 'Памылка: $1',
 'laggedslavemode' => "'''Увага:''' старонка можа ня ўтрымліваць апошніх зьменаў.",
 'readonly' => 'База зьвестак заблякаваная',
 'enterlockreason' => 'Пазначце прычыну блякаваньня і заплянаваны час разблякаваньня',
@@ -625,6 +633,7 @@ $1',
 'cannotdelete-title' => 'Немагчыма выдаліць старонку «$1»',
 'delete-hook-aborted' => 'Выдаленьне скасаванае працэдурай-перахопнікам.
 Тлумачэньняў не было.',
+'no-null-revision' => 'Немагчыма стварыць нулявую вэрсію для старонкі «$1»',
 'badtitle' => 'Няслушная назва',
 'badtitletext' => 'Запытаная назва старонкі няслушная ці пустая, альбо няслушна ўказаная міжмоўная ці інтэрвікі-назва. Яна можа ўтрымліваць сымбалі, якія нельга ўжываць у назвах.',
 'perfcached' => 'Наступныя зьвесткі кэшаваныя і могуць быць састарэлымі. У кэшы {{PLURAL:$1|даступны|даступныя}} ня больш за $1 {{PLURAL:$1|вынік|вынікі|вынікаў}}.',
@@ -644,12 +653,15 @@ $1',
 'editinginterface' => "'''Увага:''' Вы рэдагуеце старонку, якая ўтрымлівае сыстэмнае паведамленьне MediaWiki.
 Яе зьмена паўплывае на вонкавы выгляд інтэрфэйсу іншых удзельнікаў у гэтай вікі.
 Каб дадаць ці зьмяніць пераклад ва ўсіх праектах, зьвярніцеся на [//translatewiki.net/wiki/Main_Page?setlang=be-tarask translatewiki.net] — праект для лякалізацыі MediaWiki.",
-'sqlhidden' => '(SQL-запыт схаваны)',
 'cascadeprotected' => 'Гэтая старонка абароненая ад рэдагаваньня, таму што яна ўключаная ў {{PLURAL:$1|наступную старонку, якая была абароненая|наступныя старонкі, якія былі абароненыя}} з актывізаванай опцыяй «каскаднай абароны»:
 $2',
 'namespaceprotected' => "Вы ня маеце правоў на рэдагаваньне старонак у прасторы назваў '''$1'''.",
 'customcssprotected' => 'Вы ня маеце правоў на рэдагаваньне гэтай CSS-старонкі, таму што яна ўтрымлівае пэрсанальныя налады іншага ўдзельніка.',
 'customjsprotected' => 'Вы ня маеце правоў на рэдагаваньне гэтай старонкі JavaScript, таму што яна ўтрымлівае пэрсанальныя налады іншага ўдзельніка.',
+'mycustomcssprotected' => 'Вы ня маеце дазволу рэдагаваць гэтую CSS-старонку.',
+'mycustomjsprotected' => 'Вы ня маеце дазволу рэдагаваць гэтую JavaScript-старонку.',
+'myprivateinfoprotected' => 'Вы ня маеце дазволу на зьмяненьне ўласных прыватных зьвестак.',
+'mypreferencesprotected' => 'Вы ня маеце дазволу на зьмяненьне сваіх наладаў.',
 'ns-specialprotected' => 'Немагчыма рэдагаваць спэцыяльныя старонкі.',
 'titleprotected' => "Стварэньне старонкі з такой назвай было забароненае ўдзельнікам [[User:$1|$1]].
 Прычына забароны: ''$2''.",
@@ -674,10 +686,19 @@ $2',
 'welcomecreation-msg' => 'Ваш рахунак быў створаны.
 Не забудзьцеся зьмяніць Вашыя [[Special:Preferences|налады ў {{GRAMMAR:месны|{{SITENAME}}}}]].',
 'yourname' => 'Імя ўдзельніка:',
+'userlogin-yourname' => 'Імя ўдзельніка',
+'userlogin-yourname-ph' => 'Увядзіце вашае імя ўдзельніка',
+'createacct-another-username-ph' => 'Увядзіце імя ўдзельніка',
 'yourpassword' => 'Пароль:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Увядзіце ваш пароль',
+'createacct-yourpassword-ph' => 'Увядзіце пароль',
 'yourpasswordagain' => 'Паўтарыце пароль:',
+'createacct-yourpasswordagain' => 'Пацьвердзіце пароль',
+'createacct-yourpasswordagain-ph' => 'Увядзіце пароль зноў',
 'remembermypassword' => 'Запомніць мяне на гэтым кампутары (ня больш за $1 {{PLURAL:$1|дзень|дні|дзён}})',
-'securelogin-stick-https' => 'Утрымліваць злучэньне праз HTTPS пасьля ўваходу ў сыстэму',
+'userlogin-remembermypassword' => 'Запомніць мяне',
+'userlogin-signwithsecure' => 'Скарыстацца бясьпечным злучэньнем',
 'yourdomainname' => 'Ваш дамэн:',
 'password-change-forbidden' => 'Вы ня можаце зьмяняць паролі ў гэтай вікі.',
 'externaldberror' => 'Адбылася памылка аўтэнтыфікацыі з дапамогай вонкавай базы зьвестак, ці Вам не дазволена абнаўляць свой рахунак.',
@@ -689,18 +710,44 @@ $2',
 'logout' => 'Выйсьці',
 'userlogout' => 'Выйсьці',
 'notloggedin' => 'Вы не ўвайшлі ў сыстэму',
+'userlogin-noaccount' => 'Ня маеце рахунку?',
+'userlogin-joinproject' => 'Далучайцеся да {{GRAMMAR:родны|{{SITENAME}}}}',
 'nologin' => 'Ня маеце рахунку? $1.',
 'nologinlink' => 'Стварыце рахунак',
 'createaccount' => 'Стварэньне рахунку',
 'gotaccount' => 'Ужо маеце рахунак? $1.',
 'gotaccountlink' => 'Увайдзіце',
 'userlogin-resetlink' => 'Забыліся на зьвесткі для ўваходу?',
+'userlogin-resetpassword-link' => 'Забылі пароль?',
+'helplogin-url' => 'Help:Уваход у сыстэму',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Дапамога па ўваходзе ў сыстэму]]',
+'userlogin-loggedin' => 'Вы ўжо ўвайшлі як {{GENDER:$1|$1}}.
+Для ўваходу пад іншым удзельнікам скарыстайцеся формай унізе.',
+'userlogin-createanother' => 'Стварыць іншы рахунак',
+'createacct-join' => 'Увядзіце свае зьвесткі ніжэй.',
+'createacct-another-join' => 'Увядзіце зьвесткі для новага рахунку ніжэй.',
+'createacct-emailrequired' => 'E-mail адрас',
+'createacct-emailoptional' => 'E-mail адрас (неабавязкова)',
+'createacct-email-ph' => 'Увядзіце ваш e-mail адрас',
+'createacct-another-email-ph' => 'Увядзіце адрас e-mail',
 'createaccountmail' => 'Стварыць часовы адвольны пароль і даслаць яго на e-mail адрас, пазначаны ніжэй',
+'createacct-realname' => 'Сапраўднае імя (неабавязкова)',
 'createaccountreason' => 'Прычына:',
+'createacct-reason' => 'Прычына',
+'createacct-reason-ph' => 'Зь якой мэтай вы ствараеце іншы рахунак',
+'createacct-captcha' => 'Праверка бясьпекі',
+'createacct-imgcaptcha-ph' => 'Увядзіце тэкст, што бачыце вышэй',
+'createacct-submit' => 'Стварыць рахунак',
+'createacct-another-submit' => 'Стварыць іншы рахунак',
+'createacct-benefit-heading' => '{{SITENAME}} створаная людзьмі, такімі як вы.',
+'createacct-benefit-body1' => '{{PLURAL:$1|праўка|праўкі|правак}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|старонка|старонкі|старонак}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|удзельнік|удзельніка|удзельнікаў}} за апошні час',
 'badretype' => 'Уведзеныя Вамі паролі не супадаюць.',
 'userexists' => 'Уведзенае Вамі імя ўдзельніка ўжо выкарыстоўваецца кімсьці іншым. 
 Калі ласка, выберыце іншае імя.',
 'loginerror' => 'Памылка ўваходу',
+'createacct-error' => 'Памылка стварэньня рахунку',
 'createaccounterror' => 'Немагчыма стварыць рахунак: $1',
 'nocookiesnew' => 'Рахунак быў створаны, але ў сыстэму Вы не ўвайшлі.
 {{SITENAME}} выкарыстоўвае cookie для ўваходу ў сыстэму.
@@ -758,11 +805,13 @@ $2',
 
 Вы можаце праігнараваць гэты ліст, калі гэты рахунак быў створаны памылкова.',
 'usernamehasherror' => 'Імя ўдзельніка ня можа ўтрымліваць сымбаль #',
-'login-throttled' => 'Вы зрабілі занадта шмат спробаў уваходу ў сыстэму.
-Калі ласка, пачакайце, перад тым, як паспрабаваць ізноў.',
+'login-throttled' => 'Вы зрабілі надта шмат спробаў уваходу ў сыстэму.
+Калі ласка, пачакайце $1 перад тым як паспрабаваць ізноў.',
 'login-abort-generic' => 'Не атрымалася ўвайсьці ў сыстэму, скасавана',
 'loginlanguagelabel' => 'Мова: $1',
 'suspicious-userlogout' => 'Ваш запыт на выхад з сыстэмы быў адхілены, таму што выглядае, што ён быў дасланы пашкоджаным браўзэрам альбо кэшаваным проксі-сэрвэрам.',
+'createacct-another-realname-tip' => 'Сапраўднае імя паведамляць неабавязкова.
+Калі Вы яго пазначыце, яно будзе выкарыстоўвацца для пазначэньня Вашай працы.',
 
 # Email sending
 'php-mail-error-unknown' => 'Узьнікла невядомая памылка ў функцыі PHP mail()',
@@ -778,8 +827,7 @@ $2',
 'newpassword' => 'Новы пароль:',
 'retypenew' => 'Паўтарыце новы пароль:',
 'resetpass_submit' => 'Наставіць пароль і увайсьці',
-'resetpass_success' => 'Ваш пароль быў пасьпяхова зьменены!
-Цяпер уваходзім...',
+'changepassword-success' => 'Ваш пароль быў пасьпяхова зьменены!',
 'resetpass_forbidden' => 'Пароль ня можа быць зьменены',
 'resetpass-no-info' => 'Для непасрэднага доступу да гэтай старонкі Вам неабходна ўвайсьці ў сыстэму.',
 'resetpass-submit-loggedin' => 'Зьмяніць пароль',
@@ -791,10 +839,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Ачыстка паролю',
-'passwordreset-text' => 'Запоўніце гэтую форму, каб скінуць пароль.',
+'passwordreset-text-one' => 'Запоўніце гэтую форму, каб скінуць пароль.',
+'passwordreset-text-many' => '{{PLURAL:$1|Запоўніце адно з гэтых палёў, каб скінуць пароль.}}',
 'passwordreset-legend' => 'Ачысьціць пароль',
 'passwordreset-disabled' => 'Магчымасьць ачысткі паролю была забароненая ў {{GRAMMAR:месны|{{SITENAME}}}}.',
-'passwordreset-pretext' => '{{PLURAL:$1||Увядзіце ніжэй частку зьвестак}}',
+'passwordreset-emaildisabled' => 'Функцыі e-mail у гэтай вікі былі адключаныя.',
 'passwordreset-username' => 'Імя ўдзельніка:',
 'passwordreset-domain' => 'Дамэн:',
 'passwordreset-capture' => 'Паказаць канчатковы электронны ліст?',
@@ -821,7 +870,7 @@ $2
 Часовы пароль: $2',
 'passwordreset-emailsent' => 'Ліст пра скіданьне паролю быў дасланы.',
 'passwordreset-emailsent-capture' => 'Ліст пра скіданьне паролю быў дасланы, што паказана ніжэй.',
-'passwordreset-emailerror-capture' => 'Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго карыстальніку: $1',
+'passwordreset-emailerror-capture' => 'Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго {{GENDER:$2|ўдзельніку|ўдзельніцы}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Зьмяніць адрас электроннай пошты',
@@ -835,6 +884,19 @@ $2
 'changeemail-submit' => 'Зьмяніць адрас электроннай пошты',
 'changeemail-cancel' => 'Скасаваць',
 
+# Special:ResetTokens
+'resettokens' => 'Скідваньне токенаў',
+'resettokens-text' => 'Тут вы можаце скінуць токены, якія даюць вамд доступ да пэўных прыватных зьвестак, асацыяваных з вашым рахункам.
+
+Калі вы выпадкова падзяліліся токенамі зь іншымі, або калі ваш рахунак быў скампрамэтаваны, скарыстайцеся гэтай магчымасьцю і скіньце токены.',
+'resettokens-no-tokens' => 'Няма што скідаць.',
+'resettokens-legend' => 'Скінуць токены',
+'resettokens-tokens' => 'Токены:',
+'resettokens-token-label' => '$1 (бягучае значэньне: $2)',
+'resettokens-watchlist-token' => 'Токен стужкі (Atom/RSS) [[Special:Watchlist|зьменаў у вашым сьпісе назіраньня]]',
+'resettokens-done' => 'Токены скінутыя.',
+'resettokens-resetbutton' => 'Скінуць вылучаныя токены',
+
 # Edit page toolbar
 'bold_sample' => 'Тоўсты тэкст',
 'bold_tip' => 'Тоўсты тэкст',
@@ -1027,12 +1089,15 @@ $2
 Падобна, што яна была выдаленая.',
 'edit-conflict' => 'Канфлікт рэдагаваньняў.',
 'edit-no-change' => 'Вашае рэдагаваньне было праігнараванае, таму што ў тэкст не былі ўнесеныя зьмены.',
+'postedit-confirmation' => 'Вашая праўка была захаваная.',
 'edit-already-exists' => 'Немагчыма стварыць новую старонку.
 Яна ўжо існуе.',
 'defaultmessagetext' => 'Перадвызначаны тэкст паведамленьня',
 'content-failed-to-parse' => 'Зьмест «$2» не адпавядае тыпу $1: $3.',
 'invalid-content-data' => 'Няслушныя зьвесткі',
 'content-not-allowed-here' => 'Зьмест тыпу «$1» на старонцы [[$2]] не дазволены',
+'editwarning-warning' => 'Пакінуўшы гэтую старонку, вы можаце страціць усе ўнесеныя зьмены.
+Калі вы ўвайшлі ў сыстэму, Вы можаце адключыць гэтае папярэджаньне ў сэкцыі «Рэдагаваньне» вашых наладаў.',
 
 # Content models
 'content-model-wikitext' => 'вікі-тэкст',
@@ -1067,6 +1132,7 @@ $2
 'undo-failure' => 'Рэдагаваньне ня можа быць скасаванае праз канфлікт паміж папярэднімі рэдагаваньнямі.',
 'undo-norev' => 'Рэдагаваньне ня можа быць адмененае, таму што яно не існуе альбо было выдаленае.',
 'undo-summary' => 'Скасаваньне праўкі $1 {{GENDER:$2|удзельніка|удзельніцы}} [[Special:Contributions/$2|$2]] ([[User talk:$2|гутаркі]])',
+'undo-summary-username-hidden' => 'Вэрсія $1 скасаваная схаваным удзельнікам',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Немагчыма стварыць рахунак',
@@ -1247,6 +1313,7 @@ $1",
 'compareselectedversions' => 'Параўнаць выбраныя вэрсіі',
 'showhideselectedversions' => 'Паказаць/схаваць вызначаныя вэрсіі',
 'editundo' => 'скасаваць',
+'diff-empty' => '(Розьніцы няма)',
 'diff-multi' => '($1 {{PLURAL:$1|прамежная вэрсія|прамежныя вэрсіі|прамежных вэрсіяў}} $2 {{PLURAL:$2|удзельніка|удзельнікаў|удзельнікаў}} {{PLURAL:$1|не паказаная|не паказаныя|не паказаныя}})',
 'diff-multi-manyusers' => '($1 {{PLURAL:$1|прамежная вэрсія|прамежныя вэрсіі|прамежных вэрсіяў}} $2 {{PLURAL:$2|удзельніка|удзельнікаў|удзельнікаў}} {{PLURAL:$1|не паказаная|не паказаныя|не паказаныя}})',
 'difference-missing-revision' => '{{PLURAL:$2|Адна вэрсія|$2 вэрсіі}} з гэтымі адрозьненьнямі ($1) {{PLURAL:$2|не была|не былі}} знойдзеныя.
@@ -1274,7 +1341,6 @@ $1",
 'searchmenu-legend' => 'Налады пошуку',
 'searchmenu-exists' => "* Старонка '''[[$1]]'''",
 'searchmenu-new' => "'''Стварыць старонку «[[:$1|$1]]» у {{GRAMMAR:месны|{{SITENAME}}}}!'''",
-'searchhelp-url' => 'Help:Зьмест',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Праглядзець старонкі з гэтым прэфіксам]]',
 'searchprofile-articles' => 'Старонкі са зьместам',
 'searchprofile-project' => 'Старонкі дапамогі і праекту',
@@ -1316,15 +1382,7 @@ $1",
 'search-external' => 'Вонкавы пошук',
 'searchdisabled' => 'Функцыя пошуку ў {{GRAMMAR:месны|{{SITENAME}}}} адключаная.
 Вы можаце пашукаць з дапамогай Google, але заўважце, што там інфармацыя пра старонкі {{GRAMMAR:родны|{{SITENAME}}}} можа быць састарэлай.',
-
-# Quickbar
-'qbsettings' => 'Панэль хуткага доступу',
-'qbsettings-none' => 'Не паказваць',
-'qbsettings-fixedleft' => 'Замацаваная зьлева',
-'qbsettings-fixedright' => 'Замацаваная справа',
-'qbsettings-floatingleft' => 'Плавае зьлева',
-'qbsettings-floatingright' => 'Плавае справа',
-'qbsettings-directionality' => 'Замацаваная, у залежнасьці ад накірунку напісаньня ў Вашай мове',
+'search-error' => 'Узьнікла памылка пры пошуку: $1',
 
 # Preferences page
 'preferences' => 'Налады',
@@ -1358,7 +1416,6 @@ $1",
 'resetprefs' => 'Скінуць',
 'restoreprefs' => 'Аднавіць усе стандартныя налады (ва ўсіх разьдзелах)',
 'prefs-editing' => 'Рэдагаваньне',
-'prefs-edit-boxsize' => 'Памер акна рэдагаваньня.',
 'rows' => 'Радкоў:',
 'columns' => 'Слупкоў:',
 'searchresultshead' => 'Пошук',
@@ -1369,9 +1426,9 @@ $1",
 'recentchangesdays-max' => '(максымальна $1 {{PLURAL:$1|дзень|дні|дзён}})',
 'recentchangescount' => 'Колькасьць рэдагаваньняў для паказу па змоўчваньні:',
 'prefs-help-recentchangescount' => 'Гэта датычыцца апошніх зьменах, гісторый старонак і журналаў.',
-'prefs-help-watchlist-token' => 'Запаўненьне гэтага поля сакрэтным ключом створыць RSS-стужку для Вашага сьпісу назіраньня.
-Кожны, хто ведае ключ у гэтым полі, зможа чытаць Ваш сьпіс назіраньня, таму выбірайце сакрэтнае значэньне.
-Тут Вы зможаце выкарыстоўваць выпадковае значэньне: $1',
+'prefs-help-watchlist-token2' => 'Гэта сакрэтны ключ да стужкі вашага сьпісу назіраньня.
+Кожны, хто ведае яго, можа набыць доступ да вашага сьпісу назіраньня, таму не дзяліцеся ім.
+[[Special:ResetTokens|Пстрыкніце тут, калі вам трэба скінуць яго]].',
 'savedprefs' => 'Вашыя налады былі захаваныя.',
 'timezonelegend' => 'Часавы пояс:',
 'localtime' => 'Мясцовы час:',
@@ -1402,7 +1459,6 @@ $1",
 'prefs-reset-intro' => 'Вы можаце выкарыстоўваць гэтую старонку для замены Вашых наладаў на налады сайта па змоўчваньні.
 Гэтае дзеяньне не можа быць адмененае.',
 'prefs-emailconfirm-label' => 'Пацьверджаньне адрасу электроннай пошты:',
-'prefs-textboxsize' => 'Памеры акна рэдагаваньня',
 'youremail' => 'Адрас электроннай пошты:',
 'username' => 'Імя {{GENDER:$1|ўдзельніка|ўдзельніцы}}:',
 'uid' => 'ID {{GENDER:$1|удзельніка|удзельніцы}}:',
@@ -1436,6 +1492,8 @@ $1",
 'prefs-dateformat' => 'Фармат даты',
 'prefs-timeoffset' => 'Розьніца ў часе',
 'prefs-advancedediting' => 'Агульныя налады',
+'prefs-editor' => 'Рэдактар',
+'prefs-preview' => 'Папярэдні прагляд',
 'prefs-advancedrc' => 'Дадатковыя налады',
 'prefs-advancedrendering' => 'Дадатковыя налады',
 'prefs-advancedsearchoptions' => 'Дадатковыя налады',
@@ -1443,7 +1501,9 @@ $1",
 'prefs-displayrc' => 'Налады паказу',
 'prefs-displaysearchoptions' => 'Налады паказу',
 'prefs-displaywatchlist' => 'Налады паказу',
+'prefs-tokenwatchlist' => 'Токен',
 'prefs-diffs' => 'Розьніцы вэрсіяў',
+'prefs-help-prefershttps' => 'Гэтая налада набудзе моц пры наступным уваходзе ў сыстэму.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Выглядае слушна',
@@ -1470,6 +1530,8 @@ $1",
 'userrights-notallowed' => 'Вы ня маеце права прызначаць ці выдаляць правы ўдзельнікам.',
 'userrights-changeable-col' => 'Групы, якія Вы можаце мяняць',
 'userrights-unchangeable-col' => 'Групы, якія Вы ня можаце мяняць',
+'userrights-conflict' => 'Канфлікт пры зьмене правоў удзельнікаў! Калі ласка, праверце і захавайце вашыя зьмены.',
+'userrights-removed-self' => 'Вы пасьпяхова пазбавілі сябе ўласных правоў. З гэтай прычыны вы больш ня маеце доступу да гэтай старонкі.',
 
 # Groups
 'group' => 'Група:',
@@ -1535,11 +1597,19 @@ $1",
 'right-proxyunbannable' => 'абход аўтаматычных блякаваньняў проксі',
 'right-unblockself' => 'разблякаваньне самога сябе',
 'right-protect' => 'зьмена ўзроўню абароны старонак і рэдагаваньне каскадна абароненых старонак',
-'right-editprotected' => 'рэдагаваньне абароненых старонак (без каскаднай абароны)',
+'right-editprotected' => 'рэдагаваньне старонак, абароненых у рэжыме «{{int:protect-level-sysop}}»',
+'right-editsemiprotected' => 'рэдагаваньне старонак, абароненых у рэжыме «{{int:protect-level-autoconfirmed}}»',
 'right-editinterface' => 'рэдагаваньне інтэрфэйса карыстальніка',
 'right-editusercssjs' => 'рэдагаваньне CSS і JS файлаў іншых удзельнікаў',
 'right-editusercss' => 'рэдагаваньне CSS файлаў іншых удзельнікаў',
 'right-edituserjs' => 'рэдагаваньне JS файлаў іншых удзельнікаў',
+'right-editmyusercss' => 'рэдагаваць уласныя карыстальніцкія CSS-файлы',
+'right-editmyuserjs' => 'рэдагаваць уласныя карыстальніцкія JavaScript-файлы',
+'right-viewmywatchlist' => 'праглядаць уласны сьпіс назіраньня',
+'right-editmywatchlist' => 'рэдагаваць уласны сьпіс назіраньня (некаторыя дзеяньні будуць дадаваць туды старонкі нават бяз гэтага права)',
+'right-viewmyprivateinfo' => 'праглядаць уласныя прыватныя зьвесткі (напр., адрас e-mail, сапраўднае імя)',
+'right-editmyprivateinfo' => 'рэдагаваць уласныя прыватныя зьвесткі (напр., адрас e-mail, сапраўднае імя)',
+'right-editmyoptions' => 'рэдагаваць уласныя налады',
 'right-rollback' => 'хуткі адкат правак апошняга ўдзельніка, які рэдагаваў старонку',
 'right-markbotedits' => 'пазначэньне адкатаў як рэдагаваньне робатам',
 'right-noratelimit' => 'няма абмежаваньняў па хуткасьці',
@@ -1601,12 +1671,19 @@ $1",
 'action-userrights-interwiki' => 'рэдагаваньне правоў удзельнікаў у іншых вікі',
 'action-siteadmin' => 'блякаваньне і разблякаваньне базы зьвестак',
 'action-sendemail' => 'адпраўляць лісты іншым удзельнікам',
+'action-editmywatchlist' => 'рэдагаваць ваш сьпіс назіраньня',
+'action-viewmywatchlist' => 'праглядаць ваш сьпіс назіраньня',
+'action-viewmyprivateinfo' => 'прагляд вашых прыватных зьвестак',
+'action-editmyprivateinfo' => 'рэдагаваньне вашых прыватных зьвестак',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|з апошняга візыту}}',
+'enhancedrc-history' => 'гісторыя',
 'recentchanges' => 'Апошнія зьмены',
 'recentchanges-legend' => 'Налады апошніх зьменаў',
 'recentchanges-summary' => 'Сачыце за апошнімі зьменамі ў {{GRAMMAR:месны|{{SITENAME}}}} на гэтай старонцы.',
+'recentchanges-noresult' => 'Зьмены, што пасуюць дадзенаму пэрыяду і крытэрам, ня знойдзеныя.',
 'recentchanges-feed-description' => 'Сачыце за апошнімі зьменамі ў {{GRAMMAR:месны|{{SITENAME}}}} праз гэтую стужку.',
 'recentchanges-label-newpage' => 'Гэтым рэдагаваньнем была створаная новая старонка',
 'recentchanges-label-minor' => 'Гэтае рэдагаваньне — дробнае',
@@ -1643,7 +1720,6 @@ $1",
 'recentchangeslinked-feed' => 'Зьвязаныя праўкі',
 'recentchangeslinked-toolbox' => 'Зьвязаныя праўкі',
 'recentchangeslinked-title' => 'Зьвязаныя праўкі для «$1»',
-'recentchangeslinked-noresult' => 'Не было ніякіх зьменаў на зьвязаных старонках за вызначаны пэрыяд.',
 'recentchangeslinked-summary' => "Гэта сьпіс апошніх зьменаў старонак, на якія спасылаецца азначаная старонка (ці ўсіх старонак, якія належаць азначанай катэгорыі).
 Старонкі з [[Special:Watchlist|Вашага сьпісу назіраньня]] пазначаныя '''тлустым шрыфтам'''.",
 'recentchangeslinked-page' => 'Назва старонкі:',
@@ -1655,7 +1731,7 @@ $1",
 'reuploaddesc' => 'Скасаваць загрузку і вярнуцца да формы загрузкі',
 'upload-tryagain' => 'Даслаць зьмененае апісаньне файла',
 'uploadnologin' => 'Вы не ўвайшлі ў сыстэму',
-'uploadnologintext' => 'Вам трэба [[Special:UserLogin|ўвайсьці ў сыстэму]] для загрузкі файлаў.',
+'uploadnologintext' => 'Вам трэба $1, каб загружаць файлы.',
 'upload_directory_missing' => 'Загрузачная дырэкторыя ($1) адсутнічае і ня можа быць створаная сэрвэрам.',
 'upload_directory_read_only' => 'Сэрвэр ня мае правоў на запіс у дырэкторыю загружаных файлаў ($1).',
 'uploaderror' => 'Памылка загрузкі',
@@ -1869,7 +1945,6 @@ $1',
 'http-read-error' => 'Памылка чытаньня HTTP.',
 'http-timed-out' => 'Скончыўся час чаканьня HTTP-запыту.',
 'http-curl-error' => 'Памылка выбаркі URL-адрасу: $1',
-'http-host-unreachable' => 'Немагчыма дасягнуць URL-адрас',
 'http-bad-status' => 'Адбылася памылка пад час выкананьня HTTP-запыту: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1900,6 +1975,10 @@ $1',
 'listfiles_size' => 'Памер',
 'listfiles_description' => 'Апісаньне',
 'listfiles_count' => 'Вэрсіі',
+'listfiles-show-all' => 'Уключаць старыя вэрсіі выяў',
+'listfiles-latestversion' => 'Бягучая вэрсія',
+'listfiles-latestversion-yes' => 'Так',
+'listfiles-latestversion-no' => 'Не',
 
 # File description page
 'file-anchor-link' => 'Файл',
@@ -1997,6 +2076,13 @@ $1',
 'randompage' => 'Выпадковая старонка',
 'randompage-nopages' => 'Няма старонак у {{PLURAL:$2|наступнай прасторы|наступных прасторах}} назваў: $1.',
 
+# Random page in category
+'randomincategory' => 'Выпадковая старонка ў катэгорыі',
+'randomincategory-invalidcategory' => '«$1» — ня слушная назва катэгорыі.',
+'randomincategory-nopages' => 'У катэгорыі «[[:Category:$1|$1]]» старонак няма.',
+'randomincategory-selectcategory' => 'Узяць адвольную старонку з катэгорыі: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Паказаць',
+
 # Random redirect
 'randomredirect' => 'Выпадковае перанакіраваньне',
 'randomredirect-nopages' => 'У прасторы назваў «$1» няма перанакіраваньняў.',
@@ -2022,17 +2108,13 @@ $1',
 'statistics-users-active-desc' => 'Удзельнікі, якія выканалі нейкае дзеяньне цягам {{PLURAL:$1|апошняга $1 дня|апошніх $1 дзён|апошніх $1 дзён}}',
 'statistics-mostpopular' => 'Найпапулярнейшыя старонкі',
 
-'disambiguations' => 'Старонкі, якія спасылаюцца на старонкі-неадназначнасьці',
-'disambiguationspage' => 'Template:Неадназначнасьць',
-'disambiguations-text' => "Наступныя старонкі спасылаюцца на '''старонкі-неадназначнасьці'''.
-Замест гэтага, яны павінны спасылацца на пэўныя старонкі.<br />
-Старонка лічыцца шматзначнай, калі яна ўтрымлівае шаблён назва якога знаходзіцца на старонцы [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop' => 'Старонкі з уласьцівасьцямі старонак',
 'pageswithprop-legend' => 'Старонкі з уласьцівасьцямі старонак',
 'pageswithprop-text' => 'На гэтай старонцы адлюстроўваюцца старонкі, якія ўжываюць пэўныя ўласьцівасьці старонак',
 'pageswithprop-prop' => 'Імя ўласьцівасьці:',
 'pageswithprop-submit' => 'Паказаць',
+'pageswithprop-prophidden-long' => 'доўгае тэкставае значэньне ўласьцівасьці схавана ($1)',
+'pageswithprop-prophidden-binary' => 'двайковае значэньне ўласьцівасьці схавана ($1)',
 
 'doubleredirects' => 'Двайныя перанакіраваньні',
 'doubleredirectstext' => 'На гэтай старонцы пададзены сьпіс перанакіраваньняў на іншыя перанакіраваньні. Кожны радок утрымлівае спасылкі на першае і другое перанакіраваньне, а таксама мэтавую старонку другога перанакіраваньня, якая звычайна зьяўляецца «сапраўднай» мэтавай старонкай, куды павіннае спасылацца першае перанакіраваньне.
@@ -2089,6 +2171,7 @@ $1',
 'mostrevisions' => 'Старонкі з найбольшай колькасьцю рэдагаваньняў',
 'prefixindex' => 'Усе старонкі з пачаткам назваў',
 'prefixindex-namespace' => 'Усе старонкі з прэфіксам (прастора назваў $1)',
+'prefixindex-strip' => 'Прыбраць прэфікс у сьпісе',
 'shortpages' => 'Кароткія старонкі',
 'longpages' => 'Доўгія старонкі',
 'deadendpages' => 'Тупіковыя старонкі',
@@ -2104,6 +2187,7 @@ $1',
 'listusers' => 'Сьпіс удзельнікаў і ўдзельніц',
 'listusers-editsonly' => 'Паказаць толькі ўдзельнікаў, якія маюць рэдагаваньні',
 'listusers-creationsort' => 'Адсартаваць па даце стварэньня',
+'listusers-desc' => 'Сартаваць па зьмяншэньні',
 'usereditcount' => '$1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}',
 'usercreated' => '{{GENDER:$3|Створаны|Створаная}} $1 у $2',
 'newpages' => 'Новыя старонкі',
@@ -2281,10 +2365,9 @@ $1',
 'unwatchthispage' => 'Перастаць назіраць',
 'notanarticle' => 'Не старонка зьместу',
 'notvisiblerev' => 'Вэрсія была выдаленая',
-'watchnochange' => 'Нічога з Вашага сьпісу назіраньня не зьмянілася за паказаны пэрыяд.',
 'watchlist-details' => 'У Вашым сьпісе назіраньня $1 {{PLURAL:$1|старонка|старонкі|старонак}} за выключэньнем старонак абмеркаваньня.',
-'wlheader-enotif' => '* Дасылка паведамленьняў па электроннай пошце ўключаная.',
-'wlheader-showupdated' => "* Старонкі, якія былі зьмененыя пасьля Вашага апошняга візыту, вылучаныя '''тоўстым''' шрыфтам",
+'wlheader-enotif' => 'Апавяшчэньне па e-mail уключанае.',
+'wlheader-showupdated' => "Старонкі, зьмененыя з часу вашага апошняга візыту, вылучаныя '''тоўстым''' шрыфтам.",
 'watchmethod-recent' => 'прагляд апошніх зьменаў у старонках са сьпісу назіраньня',
 'watchmethod-list' => 'прагляд старонак са сьпісу назіраньня дзеля апошніх зьменах',
 'watchlistcontains' => 'Ваш сьпіс назіраньня зьмяшчае $1 {{PLURAL:$1|старонка|старонкі|старонак}}.',
@@ -2537,7 +2620,7 @@ $1',
 'contributions' => 'Унёсак {{GENDER:$1|удзельніка|удзельніцы}}',
 'contributions-title' => 'Унёсак {{GENDER:$1|удзельніка|удзельніцы}} $1',
 'mycontris' => 'Унёсак',
-'contribsub2' => 'Для $1 ($2)',
+'contribsub2' => 'Для {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Ня знойдзена зьменаў, якія адпавядаюць гэтым крытэрыям.',
 'uctop' => '(апошняя)',
 'month' => 'Ад месяца (і раней):',
@@ -2690,15 +2773,13 @@ $1',
 Тым ня менш, ён належыць да дыяпазону $2, які можа быць разблякаваны.',
 'ip_range_invalid' => 'Некарэктны дыяпазон IP-адрасоў.',
 'ip_range_toolarge' => 'Блякаваньні дыяпазонаў, большых за /$1, не дазволеныя.',
-'blockme' => 'Заблякуйце мяне',
 'proxyblocker' => 'Блякаваньне проксі',
-'proxyblocker-disabled' => 'Гэта функцыя выключаная.',
 'proxyblockreason' => "Ваш IP-адрас быў заблякаваны таму што ён належыць адкрытаму проксі.
 Калі ласка, зьвяжыцеся з Вашым Інтэрнэт-правайдарам альбо са службай тэхнічнай падтрымкі і паведаміце ім пра гэтую сур'ёзную праблему бясьпекі.",
-'proxyblocksuccess' => 'Зроблена.',
 'sorbsreason' => 'Ваш IP-адрас знаходзіцца ў сьпісе адкрытых проксі ў DNSBL, якім карыстаецца {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Ваш IP-адрас знаходзіцца ў сьпісе адкрытых проксі ў DNSBL, якім карыстаецца {{SITENAME}}.
 Вы ня зможаце стварыць рахунак',
+'xffblockreason' => 'IP-адрас, прыведзены ў загалоўку X-Forwarded-For, які належыць або вам, або проксі-сэрвэру, быў заблякаваны. Прычынай блякаваньня было: $1',
 'cant-block-while-blocked' => 'Вы ня можаце блякаваць іншых удзельнікаў, пакуль Вы самі заблякаваныя.',
 'cant-see-hidden-user' => 'Удзельнік, якога Вы спрабуеце заблякаваць, ужо заблякаваны і схаваны. З-за таго, што Вы ня маеце правоў хаваньня ўдзельнікаў, Вы ня можаце бачыць альбо зьмяняць блякаваньне удзельніка.',
 'ipbblocked' => 'Вы ня можаце блякаваць ці раблякоўваць іншых удзельнікаў, таму што заблякаваныя самі',
@@ -2862,6 +2943,8 @@ $1',
 'thumbnail-more' => 'Павялічыць',
 'filemissing' => 'Файл адсутны',
 'thumbnail_error' => 'Памылка стварэньня мініятуры: $1',
+'thumbnail_error_remote' => 'Паведамленьне пра памылку з {{GRAMMAR:родны|$1}}:
+$2',
 'djvu_page_error' => 'Старонка DjVu па-за прамежкам',
 'djvu_no_xml' => 'Немагчыма атрымаць XML для DjVu-файла',
 'thumbnail-temp-create' => 'Немагчыма стварыць часовы файл мініятуры',
@@ -3013,12 +3096,6 @@ $1',
 'tooltip-preferences-save' => 'Захаваць налады',
 'tooltip-summary' => 'Увядзіце кароткае апісаньне',
 
-# Stylesheets
-'nostalgia.css' => '/* Зьмешчаны тут CSS будзе ўжыты ў тэме афармленьня Nostalgia */',
-
-# Scripts
-'nostalgia.js' => '/* Зьмешчаны тут JavaScript будзе ўжыты ў тэме афармленьня Nostalgia */',
-
 # Metadata
 'notacceptable' => 'Вікі-сэрвэр ня можа адлюстраваць зьвесткі ў выглядзе, які здольны прачытаць Ваш браўзэр.',
 
@@ -3091,13 +3168,8 @@ $1',
 'pageinfo-category-files' => 'Колькасьць файлаў',
 
 # Skin names
-'skinname-standard' => 'Клясычнае',
-'skinname-nostalgia' => 'Настальгія',
 'skinname-cologneblue' => 'Кёльнскі смутак',
 'skinname-monobook' => 'Монакніга',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Цыпа',
-'skinname-simple' => 'Простае',
 'skinname-modern' => 'Сучаснае',
 'skinname-vector' => 'Вэктар',
 
@@ -3179,11 +3251,25 @@ $1',
 'minutes' => '$1 {{PLURAL:$1|хвіліна|хвіліны|хвілінаў}}',
 'hours' => '$1 {{PLURAL:$1|гадзіна|гадзіны|гадзінаў}}',
 'days' => '$1 {{PLURAL:$1|дзень|дні|дзён}}',
+'weeks' => '{{PLURAL:$1|$1 тыдзень|$1 тыдні|$1 тыдняў}}',
 'months' => '{{PLURAL:$1|$1 месяц|$1 месяцы|$1 месяцаў}}',
 'years' => '{{PLURAL:$1|$1 год|$1 гады|$1 гадоў}}',
 'ago' => '$1 таму',
 'just-now' => 'толькі што',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|гадзіну|гадзіны|гадзінаў}} таму',
+'minutes-ago' => '$1 {{PLURAL:$1|хвіліну|хвіліны|хвілінаў}} таму',
+'seconds-ago' => '$1 {{PLURAL:$1|сэкунду|сэкунды|сэкундаў}} таму',
+'monday-at' => 'Панядзелак, $1',
+'tuesday-at' => 'Аўторак, $1',
+'wednesday-at' => 'Серада, $1',
+'thursday-at' => 'Чацьвер, $1',
+'friday-at' => 'Пятніца, $1',
+'saturday-at' => 'Субота, $1',
+'sunday-at' => 'Нядзеля, $1',
+'yesterday-at' => 'Учора, $1',
+
 # Bad image list
 'bad_image_list' => 'Фармат наступны:
 
@@ -3212,7 +3298,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Шырыня',
 'exif-imagelength' => 'Вышыня',
 'exif-bitspersample' => 'Глыбіня колеру',
@@ -3391,7 +3477,7 @@ $1',
 'exif-originalimageheight' => 'Вышыня выявы да кадраваньня',
 'exif-originalimagewidth' => 'Шырыня выявы да кадраваньня',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Нясьціснуты',
 'exif-compression-2' => 'CCITT Група 3 аднамернае абноўленае кадаваньне адлегласьці Хафмана',
 'exif-compression-3' => 'CCITT Група 3 факсымільнае кадаваньне',
@@ -3791,7 +3877,6 @@ $5
 'version-other' => 'Іншыя',
 'version-mediahandlers' => 'Апрацоўшчыкі мэдыя',
 'version-hooks' => 'Працэдуры-перахопнікі',
-'version-extension-functions' => 'Функцыі пашырэньняў',
 'version-parser-extensiontags' => 'Тэгі пашырэньняў парсэра',
 'version-parser-function-hooks' => 'Перахопнікі функцыяў парсэра',
 'version-hook-name' => 'Назва працэдуры-перахопніка',
@@ -3801,6 +3886,7 @@ $5
 'version-license' => 'Ліцэнзія',
 'version-poweredby-credits' => "{{SITENAME}} працуе на праграмным забесьпячэньні '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'іншыя',
+'version-poweredby-translators' => 'перакладчыкі з translatewiki.net',
 'version-credits-summary' => 'Нам вельмі хацелася б адзначыць наступных асобаў, што зрабілі ўнёсак у [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki зьяўляецца вольным праграмным забесьпячэньнем, якое Вы можаце распаўсюджваць і/ці зьмяняць на ўмовах ліцэнзіі GNU General Public License вэрсіі 2 ці болей позьняй, апублікаванай Фундацыяй вольнага праграмнага забесьпячэньня (Free Software Foundation).
 
@@ -3816,12 +3902,17 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Шлях да артыкула]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Пуць да скрыпту]',
 
-# Special:FilePath
-'filepath' => 'Шлях да файла',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Перайсьці',
-'filepath-summary' => 'Гэтая спэцыяльная старонка вяртае поўны шлях да файла.
-Выявы паказаныя ў поўным выглядзе, астатнія тыпы файлаў адкрываюцца прыпісанымі да іх праграмамі.',
+# Special:Redirect
+'redirect' => 'Перанакіраваньне да файла, удзельніка або вэрсіі старонкі',
+'redirect-legend' => 'Перанакіраваньне да файла або старонкі',
+'redirect-summary' => 'Гэтая спэцыяльная старонка перанакіруе да файла (паводле імя файла), старонкі (паводле нумара вэрсіі) або старонкі ўдзельніка (паводле нумара ўдзельніка).',
+'redirect-submit' => 'Перайсьці',
+'redirect-lookup' => 'Шукаць паводле:',
+'redirect-value' => 'Значэньне:',
+'redirect-user' => 'Ідэнтыфікатара ўдзельніка',
+'redirect-revision' => 'Вэрсіі старонкі',
+'redirect-file' => 'Імя файла',
+'redirect-not-exists' => 'Значэньне ня знойдзена',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Пошук дублікатаў файлаў',
@@ -3871,12 +3962,16 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'tags' => 'Слушныя тэгі зьменаў',
 'tag-filter' => 'Фільтар [[Special:Tags|тэгаў]]:',
 'tag-filter-submit' => 'Фільтар',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Тэг|Тэгі}}]]: $2)',
 'tags-title' => 'Тэгі',
 'tags-intro' => 'На гэтай старонцы знаходзіцца сьпіс тэгаў, якімі праграмнае забесьпячэньне можа пазначыць рэдагаваньне, і іх значэньне.',
 'tags-tag' => 'Назва тэга',
 'tags-display-header' => 'Новыя запісы ў сьпісе зьменаў',
 'tags-description-header' => 'Поўнае апісаньне значэньня',
+'tags-active-header' => 'Актыўны?',
 'tags-hitcount-header' => 'Пазначаныя зьмены',
+'tags-active-yes' => 'Так',
+'tags-active-no' => 'Не',
 'tags-edit' => 'рэдагаваць',
 'tags-hitcount' => '$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}',
 
@@ -3897,6 +3992,7 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'dberr-problems' => 'Прабачце! На гэтым сайце ўзьніклі тэхнічныя цяжкасьці.',
 'dberr-again' => 'Паспрабуйце пачакаць некалькі хвілінаў і абнавіць.',
 'dberr-info' => '(Немагчыма злучыцца з сэрвэрам базы зьвестак: $1)',
+'dberr-info-hidden' => '(немагчыма злучыцца з сэрвэрам базы зьвестак)',
 'dberr-usegoogle' => 'Вы можаце пакуль паспрабаваць пашукаць праз Google.',
 'dberr-outofdate' => 'Увага, індэксы нашага зьместу могуць быць састарэлымі.',
 'dberr-cachederror' => 'Наступная старонка была загружана з кэшу і можа быць састарэлай.',
@@ -3912,6 +4008,9 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'htmlform-submit' => 'Захаваць',
 'htmlform-reset' => 'Адмяніць зьмены',
 'htmlform-selectorother-other' => 'Іншае',
+'htmlform-no' => 'Не',
+'htmlform-yes' => 'Так',
+'htmlform-chosen-placeholder' => 'Выберыце варыянт',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 з падтрымкай поўнатэкстнага пошуку',
@@ -4029,4 +4128,19 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 # Image rotation
 'rotate-comment' => 'Выява павернутая на $1{{PLURAL:$1|°}} па гадзіньнікавай стрэлцы',
 
+# Limit report
+'limitreport-title' => 'Зьвесткі прафіляваньня парсэра:',
+'limitreport-cputime' => 'Працэсарны час',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|сэкунда|сэкунды|сэкундаў}}',
+'limitreport-walltime' => 'Сапраўдны час',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|сэкунда|сэкунды|сэкундаў}}',
+'limitreport-ppvisitednodes' => 'Колькасьць наведаных прэпрацэсарам вузлоў',
+'limitreport-ppgeneratednodes' => 'Колькасьць створаных прэпрацэсарам вузлоў',
+'limitreport-postexpandincludesize' => 'Памер уключэньняў па разгортваньні',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт}}',
+'limitreport-templateargumentsize' => 'Памер аргумэнтаў шаблёнаў',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт}}',
+'limitreport-expansiondepth' => 'Найбольшая глыбіня разгортваньня',
+'limitreport-expensivefunctioncount' => 'Колькасьць дарагіх функцыяў парсэра',
+
 );
diff --git a/languages/messages/MessagesBg.php b/languages/messages/MessagesBg.php
index 581b70c3..f3db6e5f 100644
--- a/languages/messages/MessagesBg.php
+++ b/languages/messages/MessagesBg.php
@@ -14,8 +14,10 @@
  * @author Dimi z
  * @author Geitost
  * @author Kaganer
+ * @author Simona
  * @author Spiritia
  * @author Stanqo
+ * @author Termininja
  * @author Turin
  * @author Urhixidur
  * @author Vladimir Penov
@@ -267,11 +269,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Показване на броя на потребителите, наблюдаващи дадена страница',
 'tog-oldsig' => 'Текущ подпис:',
 'tog-fancysig' => 'Без превръщане на подписа в препратка към потребителската страница',
-'tog-externaleditor' => 'Използване на външен редактор по подразбиране (само за експерти, необходими са специални настройки на компютъра.
-[//www.mediawiki.org/wiki/Manual:External_editors Повече информация.])',
-'tog-externaldiff' => 'Използване на външна програма за разлики по подразбиране (само за експерти, необходими са специални настройки на компютъра.
-[//www.mediawiki.org/wiki/Manual:External_editors Повече информация.])',
-'tog-showjumplinks' => 'Показване на препратки за достъпност от типа „Към…“',
 'tog-uselivepreview' => 'Използване на бърз предварителен преглед (експериментално)',
 'tog-forceeditsummary' => 'Предупреждаване при празно поле за резюме на редакцията',
 'tog-watchlisthideown' => 'Скриване на моите редакции в списъка ми за наблюдение',
@@ -284,6 +281,8 @@ $messages = array(
 'tog-diffonly' => 'Без показване на съдържанието на страницата при преглед на разлики',
 'tog-showhiddencats' => 'Показване на скритите категории',
 'tog-norollbackdiff' => 'Пропускане на разликовата връзка след извършване на отмяна на редакции',
+'tog-useeditwarning' => 'Предупреждаване при опит за напускане на страница, отворена в режим на редактиране, без да са запазени промените',
+'tog-prefershttps' => 'Да се използва винаги защитена връзка след влизане',
 
 'underline-always' => 'Винаги',
 'underline-never' => 'Никога',
@@ -347,6 +346,18 @@ $messages = array(
 'oct' => 'окт',
 'nov' => 'ное',
 'dec' => 'дек',
+'january-date' => '$1 януари',
+'february-date' => '$1 февруари',
+'march-date' => '$1 март',
+'april-date' => '$1 април',
+'may-date' => '$1 май',
+'june-date' => '$1 юни',
+'july-date' => '$1 юли',
+'august-date' => '$1 август',
+'september-date' => '$1 септември',
+'october-date' => '$1 октомври',
+'november-date' => '$1 ноември',
+'december-date' => '$1 декември',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категория|Категории}}',
@@ -428,6 +439,7 @@ $messages = array(
 'create-this-page' => 'Създаване на страницата',
 'delete' => 'Изтриване',
 'deletethispage' => 'Изтриване',
+'undeletethispage' => 'Възстановяване на страницата',
 'undelete_short' => 'Възстановяване на {{PLURAL:$1|една редакция|$1 редакции}}',
 'viewdeleted_short' => 'Преглед на {{PLURAL:$1|една изтрита редакция|$1 изтрити редакции}}',
 'protect' => 'Защита',
@@ -471,7 +483,7 @@ $1',
 'pool-queuefull' => 'Опашката за заявки е пълна',
 'pool-errorunknown' => 'Непозната грешка',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'За {{SITENAME}}',
 'aboutpage' => 'Project:За {{SITENAME}}',
 'copyright' => 'Освен ако не е посочено друго, съдържанието е достъпно при условията на $1.',
@@ -481,7 +493,6 @@ $1',
 'disclaimers' => 'Условия за ползване',
 'disclaimerpage' => 'Project:Условия за ползване',
 'edithelp' => 'Помощ при редактиране',
-'edithelppage' => 'Help:Редактиране',
 'helppage' => 'Help:Съдържание',
 'mainpage' => 'Начална страница',
 'mainpage-description' => 'Начална страница',
@@ -559,17 +570,12 @@ $1',
 # General errors
 'error' => 'Грешка',
 'databaseerror' => 'Грешка при работа с базата от данни',
-'dberrortext' => 'Възникна синтактична грешка при заявка към базата данни.
-Това може да означава грешка в софтуера.
-Последната заявка към базата данни беше:
-<blockquote><code>$1</code></blockquote>
-при функцията „<code>$2</code>“.
-Базата от данни върна грешка „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Възникна синтактична грешка при заявка към базата данни.
-Последната заявка към базата данни беше:
-„$1“
-при функцията „$2“.
-MySQL върна грешка „$3: $4“',
+'databaseerror-text' => 'Възникна грешка при заявката за базата данни.
+Това може да означава бъг в софтуера.',
+'databaseerror-textcl' => 'Възникна грешка при заявка за базата данни.',
+'databaseerror-query' => 'Заявка: $1',
+'databaseerror-function' => 'Функция: $1',
+'databaseerror-error' => 'Грешка: $1',
 'laggedslavemode' => 'Внимание: Страницата може да не съдържа последните обновявания.',
 'readonly' => 'Базата от данни е затворена за промени',
 'enterlockreason' => 'Посочете причина за затварянето, като дадете и приблизителна оценка кога базата от данни ще бъде отново отворена',
@@ -600,6 +606,7 @@ $1',
 'badarticleerror' => 'Действието не може да се изпълни върху страницата.',
 'cannotdelete' => 'Указаната страница или файл "$1" не можа да бъде изтрит(а). Възможно е вече да е бил(а) изтрит(а) от някой друг.',
 'cannotdelete-title' => 'Страницата „$1“ не може да бъде изтрита',
+'no-null-revision' => 'Не може да бъде създадена празна версия на страницата „$1“',
 'badtitle' => 'Невалидно заглавие',
 'badtitletext' => 'Желаното заглавие на страница е невалидно, празно или неправилна препратка към друго уики. Възможно е да съдържа знаци, които не са позволени в заглавия.',
 'perfcached' => 'Следните данни са извлечени от склада и затова може да не отговарят на текущото състояние. В складираното копие {{PLURAL:$1|е допустим най-много един резултат|са допустими най-много $1 резултата}}.',
@@ -619,12 +626,15 @@ $1',
 За извършване на промяна за всички уикита, посетете [//translatewiki.net/ translatewiki.net], проектът за локализация на MediaWiki.',
 'editinginterface' => "'''Внимание:''' Редактирате страница, която се използва за интерфейса на софтуера. Промяната й ще повлияе на външния вид на уикито.
 За превеждане, обмислете използването на [//translatewiki.net/ translatewiki.net], проектът за локализиране на MediaWiki.",
-'sqlhidden' => '(Заявка на SQL — скрита)',
 'cascadeprotected' => 'Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} каскадна защита:
 $2',
 'namespaceprotected' => "Нямате права за редактиране на страници в именно пространство '''$1'''.",
 'customcssprotected' => 'Нямате права за редактиране на тази CSS страница, защото тя съдържа чужди потребителски настройки.',
 'customjsprotected' => 'Нямате права за редактиране на тази Джаваскрипт страница, защото тя съдържа чужди потребителски настройки.',
+'mycustomcssprotected' => 'Нямате права за редактиране на тази CSS страница.',
+'mycustomjsprotected' => 'Нямате права за редактиране на тази JavaScript страница.',
+'myprivateinfoprotected' => 'Нямате права да редактирате личната си информация.',
+'mypreferencesprotected' => 'Нямате права да редактирате настройките си.',
 'ns-specialprotected' => 'Специалните страници не могат да бъдат редактирани.',
 'titleprotected' => "Тази страница е била защитена срещу създаване от [[User:$1|$1]].
 Посочената причина е ''$2''.",
@@ -647,10 +657,18 @@ $2',
 'welcomecreation-msg' => 'Вашата сметка беше създадена.
 Можете да промените [[Special:Preferences|настройките на {{SITENAME}}]] според предпочитанията си.',
 'yourname' => 'Потребителско име:',
+'userlogin-yourname' => 'Потребителско име',
+'userlogin-yourname-ph' => 'Въведете вашето потребителско име',
+'createacct-another-username-ph' => 'Въвежда се потребителското име',
 'yourpassword' => 'Парола:',
+'userlogin-yourpassword' => 'Парола',
+'userlogin-yourpassword-ph' => 'Въведете вашата парола',
+'createacct-yourpassword-ph' => 'Въведете парола',
 'yourpasswordagain' => 'Парола (повторно):',
+'createacct-yourpasswordagain' => 'Потвърждаване на паролата',
+'createacct-yourpasswordagain-ph' => 'Въвежда се паролата (повторно)',
 'remembermypassword' => 'Запомняне на паролата на този компютър (най-много за $1 {{PLURAL:$1|ден|дни}})',
-'securelogin-stick-https' => 'Запазване на връзката през HTTPS след влизане',
+'userlogin-signwithsecure' => 'Използване на защитена връзка',
 'yourdomainname' => 'Домейн:',
 'password-change-forbidden' => 'Не можете да променяте пароли в това уики.',
 'externaldberror' => 'Или е станала грешка в базата от данни при външното удостоверяване, или не ви е позволено да обновявате външната си сметка.',
@@ -664,18 +682,42 @@ $2',
 'logout' => 'Излизане',
 'userlogout' => 'Излизане',
 'notloggedin' => 'Не сте влезли',
+'userlogin-noaccount' => 'Нямате сметка?',
+'userlogin-joinproject' => 'Присъединяване към {{SITENAME}}',
 'nologin' => 'Нямате потребителско име? $1.',
 'nologinlink' => 'Създаване на сметка',
 'createaccount' => 'Регистриране',
 'gotaccount' => "Имате ли вече сметка? '''$1'''.",
 'gotaccountlink' => 'Влизане',
 'userlogin-resetlink' => 'Забравени данни за влизане в системата?',
+'userlogin-resetpassword-link' => 'Възстановяване на паролата',
+'helplogin-url' => 'Help:Влизане',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помощ за влизане]] в системата',
+'userlogin-loggedin' => 'Вече сте влезли в системата като {{GENDER:$1|$1}}.
+Чрез формуляра по-долу можете да влезете като друг потребител.',
+'userlogin-createanother' => 'Създаване на друга сметка',
+'createacct-join' => 'Въведете своите данни по-долу.',
+'createacct-another-join' => 'Попълване на информацията за новата сметка',
+'createacct-emailrequired' => 'Адрес за електронна поща',
+'createacct-emailoptional' => 'Адрес за електронна поща (незадължително)',
+'createacct-another-email-ph' => 'Въвежда се електронна поща',
 'createaccountmail' => 'Използване на случайна временна парола, която се изпраща на електронната поща, посочена по-долу',
+'createacct-realname' => 'Истинско име (незадължително)',
 'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-reason-ph' => 'Защо създавате друга сметка',
+'createacct-captcha' => 'Проверка за сигурност',
+'createacct-imgcaptcha-ph' => 'Въведете текста, който виждате по-горе',
+'createacct-submit' => 'Създаване на сметката',
+'createacct-another-submit' => 'Създаване на друга сметка',
+'createacct-benefit-heading' => '{{SITENAME}} се създава от хора като вас.',
+'createacct-benefit-body1' => '{{PLURAL:$1|редакция|редакции}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|страница|страници}}',
 'badretype' => 'Въведените пароли не съвпадат.',
 'userexists' => 'Въведеното потребителско име вече се използва.
 Изберете друго име.',
 'loginerror' => 'Грешка при влизане',
+'createacct-error' => 'Грешка при създаване на сметка',
 'createaccounterror' => 'Не може да бъде създадена сметка: $1',
 'nocookiesnew' => 'Потребителската сметка беше създадена, но все още не сте влезли. {{SITENAME}} използва бисквитки при влизането на потребителите. Разрешете бисквитките в браузъра си, тъй като те са забранени, а след това влезте с потребителското си име и парола.',
 'nocookieslogin' => '{{SITENAME}} използва бисквитки (cookies) за запис на влизанията. Разрешете бисквитките в браузъра си, тъй като те са забранени, и опитайте отново.',
@@ -747,7 +789,7 @@ $2',
 'newpassword' => 'Нова парола:',
 'retypenew' => 'Нова парола повторно:',
 'resetpass_submit' => 'Избиране на парола и влизане',
-'resetpass_success' => 'Паролата ви беше сменена! Сега влизате…',
+'changepassword-success' => 'Паролата ви беше променена успешно!',
 'resetpass_forbidden' => 'Не е разрешена смяна на паролата',
 'resetpass-no-info' => 'За да достъпвате тази страница директно, необходимо е да влезете в системата.',
 'resetpass-submit-loggedin' => 'Промяна на паролата',
@@ -759,10 +801,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Възстановяване на парола',
-'passwordreset-text' => 'Попълването на формуляра ще доведе до възстановяване на паролата.',
+'passwordreset-text-one' => 'Попълването на формуляра ще доведе до възстановяване на паролата.',
+'passwordreset-text-many' => '{{PLURAL:$1|За възстановяване на паролата е необходимо да се попълни едно от полетата.}}',
 'passwordreset-legend' => 'Възстановяване на парола',
 'passwordreset-disabled' => 'Възстановяването на паролата е изключено в това уики.',
-'passwordreset-pretext' => '{{PLURAL:$1||Въведете някоя от информациите по-долу}}',
+'passwordreset-emaildisabled' => 'Функционалността за електронна поща е изключена в това уики.',
 'passwordreset-username' => 'Потребителско име:',
 'passwordreset-domain' => 'Домейн:',
 'passwordreset-capture' => 'Преглеждане на електронното писмо?',
@@ -789,7 +832,7 @@ $2
 Временна парола: $2',
 'passwordreset-emailsent' => 'На електронната поща беше испратено писмо за възстановяване на паролата.',
 'passwordreset-emailsent-capture' => 'По-долу е показано електронното писмо за възстановяване на паролата, което беше изпратено.',
-'passwordreset-emailerror-capture' => 'По-долу е показано създадено електронно писмо за напомняне, което не беше изпратено на потребителя: $1',
+'passwordreset-emailerror-capture' => 'По-долу е показано създадено електронно писмо за възстановяване на паролата, което не беше изпратено на {{GENDER:$2|потребителя}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Промяна на адреса за е-поща',
@@ -803,6 +846,9 @@ $2
 'changeemail-submit' => 'Промяна на е-пощата',
 'changeemail-cancel' => 'Отказване',
 
+# Special:ResetTokens
+'resettokens-token-label' => '$1 (текуща стойност: $2)',
+
 # Edit page toolbar
 'bold_sample' => 'Получер текст',
 'bold_tip' => 'Получер (удебелен) текст',
@@ -879,9 +925,7 @@ $2
 'loginreqlink' => 'влизане',
 'loginreqpagetext' => 'Необходимо е $1, за да можете да разглеждате други страници.',
 'accmailtitle' => 'Паролата беше изпратена.',
-'accmailtext' => "Случайно генерирана парола за [[User talk:$1|$1]] беше изпратена на $2.
-
-Паролата за тази нова потребителска сметка може да бъде променена от специалната страница ''[[Special:ChangePassword|„Промяна на парола“]]'' след влизане в системата.",
+'accmailtext' => "Случайно генерирана парола за [[User talk:$1|$1]] беше изпратена на $2. Паролата може да бъде променена от страницата ''[[Special:ChangePassword|„Промяна на паролата“]]'' след влизане в системата.",
 'newarticle' => '(нова)',
 'newarticletext' => 'Последвахте препратка към страница, която все още не съществува.
 За да я създадете, просто започнете да пишете в долната текстова кутия
@@ -979,7 +1023,7 @@ $2
 'nocreate-loggedin' => 'Нямате необходимите права да създавате нови страници.',
 'sectioneditnotsupported-title' => 'Не се поддържа редактиране на раздели',
 'sectioneditnotsupported-text' => 'Не се поддържа редактиране на раздели на тази страница.',
-'permissionserrors' => 'Грешки при правата на достъп',
+'permissionserrors' => 'Грешка при правата на достъп',
 'permissionserrorstext' => 'Нямате правата да извършите това действие по {{PLURAL:$1|следната причина|следните причини}}:',
 'permissionserrorstext-withaction' => 'Нямате разрешение за $2 поради {{PLURAL:$1|следната причина|следните причини}}:',
 'recreate-moveddeleted-warn' => "'''Внимание: Създавате страница, която по-рано вече е била изтрита.'''
@@ -994,6 +1038,7 @@ $2
 Вероятно междувременно е била изтрита.',
 'edit-conflict' => 'Редакционен конфликт.',
 'edit-no-change' => 'Вашата редакция беше игнорирана, тъй като не съдържа промени по текста.',
+'postedit-confirmation' => 'Вашата редакция беше съхранена',
 'edit-already-exists' => 'Не можа да се създаде нова страница.
 Такава вече съществува.',
 'defaultmessagetext' => 'Текст на съобщението по подразбиране',
@@ -1001,6 +1046,8 @@ $2
 'invalid-content-data' => 'Невалидни данни за съдържание',
 'content-not-allowed-here' => '
 На страницата [[$2]] не е позволено използването на $1',
+'editwarning-warning' => 'Ако излезете от тази страница, може да загубите всички незапазени промени, които сте направили. 
+Ако сте влезли в системата, можете да изключите това предупреждение през меню "Редактиране" във вашите лични настройки.',
 
 # Content models
 'content-model-wikitext' => 'уикитекст',
@@ -1206,6 +1253,7 @@ $1",
 'compareselectedversions' => 'Сравнение на избраните версии',
 'showhideselectedversions' => 'Показване/скриване на избрани версии',
 'editundo' => 'връщане',
+'diff-empty' => '(Няма разлика)',
 'diff-multi' => '({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от {{PLURAL:$2|един потребител|$2 потребителя}}.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от повече от $2 {{PLURAL:$2|потребител|потребителя}})',
 'difference-missing-revision' => '{{PLURAL:$2|Не беше открита|Не бяха открити}} {{PLURAL:$2|една версия|$2 версии}} от тази разликова препратка ($1).
@@ -1233,7 +1281,6 @@ $1",
 'searchmenu-legend' => 'Настройки на търсенето',
 'searchmenu-exists' => "'''Съществува страница с името „[[:$1]]“ в това уики.'''",
 'searchmenu-new' => "'''Създаване на страницата „[[:$1]]“ в това уики!'''",
-'searchhelp-url' => 'Help:Съдържание',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Преглеждане на страниците с тази представка]]',
 'searchprofile-articles' => 'Съдържателни страници',
 'searchprofile-project' => 'Помощни и проектни страници',
@@ -1276,15 +1323,6 @@ $1",
 'search-external' => 'Външно търсене',
 'searchdisabled' => 'Търсенето в {{SITENAME}} е временно изключено. Междувременно можете да търсите чрез Google. Обърнете внимание, че съхранените при тях страници най-вероятно са остарели.',
 
-# Quickbar
-'qbsettings' => 'Лента за бърз избор',
-'qbsettings-none' => 'Без меню',
-'qbsettings-fixedleft' => 'Неподвижно вляво',
-'qbsettings-fixedright' => 'Неподвижно вдясно',
-'qbsettings-floatingleft' => 'Плаващо вляво',
-'qbsettings-floatingright' => 'Плаващо вдясно',
-'qbsettings-directionality' => 'Фиксирана, в зависимост от посоката на писане на вашия език',
-
 # Preferences page
 'preferences' => 'Настройки',
 'mypreferences' => 'Настройки',
@@ -1315,9 +1353,8 @@ $1",
 'prefs-rendering' => 'Облик',
 'saveprefs' => 'Съхраняване',
 'resetprefs' => 'Отмяна на текущите промени',
-'restoreprefs' => 'Възстановяване на всички настройки по подразбиране',
+'restoreprefs' => 'Възстановяване на всички настройки по подразбиране (за всички раздели)',
 'prefs-editing' => 'Редактиране',
-'prefs-edit-boxsize' => 'Размер на прозореца за редактиране.',
 'rows' => 'Редове:',
 'columns' => 'Колони:',
 'searchresultshead' => 'Търсене',
@@ -1328,9 +1365,6 @@ $1",
 'recentchangesdays-max' => '(най-много $1 {{PLURAL:$1|ден|дни}})',
 'recentchangescount' => 'Брой показвани редакции по подразбиране:',
 'prefs-help-recentchangescount' => 'Това включва последните промени, историите на страниците и дневниците.',
-'prefs-help-watchlist-token' => 'Вписването на таен ключ в това поле ще генерира RSS емисия за вашия списък за наблюдение.
-Всеки, който знае тази парола, ще може да чете списъка ви за наблюдение, затова изберете някаква сигурна комбинация.
-Можете да използвате следната случайно генерирана комбинация: $1',
 'savedprefs' => 'Настройките ви бяха съхранени.',
 'timezonelegend' => 'Часова зона:',
 'localtime' => 'Местно време:',
@@ -1361,7 +1395,6 @@ $1",
 'prefs-reset-intro' => 'Тази страница може да се използва за възстановяване на потребителските настройки към стандартните за сайта.
 Това действие е необратимо.',
 'prefs-emailconfirm-label' => 'Потвърждаване на адрес за е-поща:',
-'prefs-textboxsize' => 'Размер на кутията за редактиране',
 'youremail' => 'Е-поща:',
 'username' => '{{GENDER:$1|Потребителско име}}:',
 'uid' => '{{GENDER:$1|Потребителски}} номер:',
@@ -1392,6 +1425,7 @@ $1",
 'prefs-dateformat' => 'Формат на датата',
 'prefs-timeoffset' => 'Часово отместване',
 'prefs-advancedediting' => 'Общи настройки',
+'prefs-preview' => 'Преглед',
 'prefs-advancedrc' => 'Разширени настройки',
 'prefs-advancedrendering' => 'Разширени настройки',
 'prefs-advancedsearchoptions' => 'Разширени настройки',
@@ -1400,6 +1434,7 @@ $1",
 'prefs-displaysearchoptions' => 'Настройки на изгледа',
 'prefs-displaywatchlist' => 'Видими настройки',
 'prefs-diffs' => 'Разлики',
+'prefs-help-prefershttps' => 'Това предпочитание ще бъде активирано при следващото влизане.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Адресът за е-поща изглежда валиден',
@@ -1558,6 +1593,8 @@ $1",
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|промяна|промени}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|от последното посещение}}',
+'enhancedrc-history' => 'история',
 'recentchanges' => 'Последни промени',
 'recentchanges-legend' => 'Опции на списъка с последни промени',
 'recentchanges-summary' => "Проследяване на последните промени в {{SITENAME}}.
@@ -1600,7 +1637,6 @@ $1",
 'recentchangeslinked-feed' => 'Свързани промени',
 'recentchangeslinked-toolbox' => 'Свързани промени',
 'recentchangeslinked-title' => 'Промени, свързани с „$1“',
-'recentchangeslinked-noresult' => 'Няма промени в свързаните страници за дадения период.',
 'recentchangeslinked-summary' => "Тук се показват последните промени на страниците, към които се препраща от дадена страница. При избиране на категория, се показват промените по страниците, влизащи в нея. ''Пример:'' Ако изберете страницата '''А''', която съдържа препратки към '''Б''' и '''В''', тогава ще можете да прегледате промените по '''Б''' и '''В'''.
 
 Ако пък сложите отметка пред '''Обръщане на релацията''', ще можете да прегледате промените в обратна посока: ще се включат тези страници, които съдържат препратки към посочената страница.
@@ -1615,7 +1651,7 @@ $1",
 'reuploaddesc' => 'Връщане към формуляра за качване.',
 'upload-tryagain' => 'Съхраняване на промененото описание на файла',
 'uploadnologin' => 'Не сте влезли',
-'uploadnologintext' => 'Необходимо е да [[Special:UserLogin|влезете]], за да може да качвате файлове.',
+'uploadnologintext' => 'За да могат да бъдат качвани файлове е необходимо $1 в системата.',
 'upload_directory_missing' => 'Директорията за качване ($1) липсва и не може да бъде създадена на сървъра.',
 'upload_directory_read_only' => 'Сървърът няма достъп за писане в директорията за качване „$1“.',
 'uploaderror' => 'Грешка при качване',
@@ -1784,7 +1820,6 @@ $1',
 'http-read-error' => 'HTTP грешка при четене.',
 'http-timed-out' => 'Пресрочено време за HTTP заявка.',
 'http-curl-error' => 'Грешка при извличането на URL: $1',
-'http-host-unreachable' => 'Недостъпен URL.',
 'http-bad-status' => 'Настъпи проблем по време на HTTP заявката: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1813,6 +1848,10 @@ $1',
 'listfiles_size' => 'Размер',
 'listfiles_description' => 'Описание',
 'listfiles_count' => 'Версии',
+'listfiles-show-all' => 'Включване на старите версии на изображенията',
+'listfiles-latestversion' => 'Текущата версия',
+'listfiles-latestversion-yes' => 'Да',
+'listfiles-latestversion-no' => 'Не',
 
 # File description page
 'file-anchor-link' => 'Файл',
@@ -1929,10 +1968,6 @@ $1',
 'statistics-users-active-desc' => 'Потребители, направили редакция през {{PLURAL:$1|последния ден|последните $1 дни}}',
 'statistics-mostpopular' => 'Най-преглеждани страници',
 
-'disambiguations' => 'Страници, сочещи към пояснителни страници',
-'disambiguationspage' => 'Template:Пояснение',
-'disambiguations-text' => "Следните страници сочат към '''пояснителна страница''', вместо към истинската тематична страница.<br />Една страница се смята за пояснителна, ако ползва шаблон, към който се препраща от [[MediaWiki:Disambiguationspage]].",
-
 'doubleredirects' => 'Двойни пренасочвания',
 'doubleredirectstext' => 'Тази страница съдържа списък със страници, които пренасочват към друга пренасочваща страница.
 Всеки ред съдържа препратки към първото и второто пренасочване, както и целта на второто пренасочване, която обикновено е „истинската“ целева страница, към която първото пренасочване би трябвало да сочи.
@@ -2169,10 +2204,9 @@ $1',
 'unwatchthispage' => 'Спиране на наблюдение',
 'notanarticle' => 'Не е страница',
 'notvisiblerev' => 'Версията беше изтрита',
-'watchnochange' => 'Никоя от наблюдаваните страници не е била редактирана в показаното време.',
 'watchlist-details' => '{{PLURAL:$1|Една наблюдавана страница|$1 наблюдавани страници}} от списъка ви за наблюдение (без беседи).',
-'wlheader-enotif' => '* Известяването по електронна поща е включено.',
-'wlheader-showupdated' => "* Страниците, които са били променени след последния път, когато сте ги посетили, са показани с '''получер''' шрифт.",
+'wlheader-enotif' => 'Известяването по е-поща е включено.',
+'wlheader-showupdated' => "Страниците, които са били променени след последния път, когато сте ги посетили, са показани в '''получер'''.",
 'watchmethod-recent' => 'проверка на последните редакции за наблюдавани страници',
 'watchmethod-list' => 'проверка на наблюдаваните страници за скорошни редакции',
 'watchlistcontains' => 'Списъкът ви за наблюдение съдържа {{PLURAL:$1|една страница|$1 страници}}.',
@@ -2407,7 +2441,7 @@ $1',
 'contributions' => '{{GENDER:$1|Потребителски}} приноси',
 'contributions-title' => 'Потребителски приноси за $1',
 'mycontris' => 'Приноси',
-'contribsub2' => 'За $1 ($2)',
+'contribsub2' => 'За {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Не са намерени промени, отговарящи на критерия.',
 'uctop' => '(текуща)',
 'month' => 'Месец:',
@@ -2564,11 +2598,8 @@ $1',
 'ipb_blocked_as_range' => 'Грешка: IP-адресът $1 не може да бъде разблокиран, тъй като е част от блокирания регистър $2. Можете да разблокирате адреса, като разблокирате целия регистър.',
 'ip_range_invalid' => 'Невалиден интервал за IP-адреси.',
 'ip_range_toolarge' => 'Забранено е блокиране на диапазони от IP адреси по-големи от /$1.',
-'blockme' => 'Самоблокиране',
 'proxyblocker' => 'Блокировач на проксита',
-'proxyblocker-disabled' => 'Тази функция е деактивирана.',
 'proxyblockreason' => 'IP-адресът ви беше блокиран, тъй като е анонимно достъпен междинен сървър. Свържете се с доставчика ви на интернет и го информирайте за този сериозен проблем в сигурността.',
-'proxyblocksuccess' => 'Готово.',
 'sorbsreason' => 'IP-адресът ви е записан като анонимно достъпен междинен сървър в DNSBL на {{SITENAME}}.',
 'sorbs_create_account_reason' => 'IP-адресът ви е записан като анонимно достъпен междинен сървър в DNSBL на {{SITENAME}}. Не може да създадете сметка.',
 'cant-block-while-blocked' => 'Не можете да блокирате други потребители, докато сам(а) сте блокиран(а).',
@@ -2938,13 +2969,8 @@ $1',
 'pageinfo-category-files' => 'Брой файлове',
 
 # Skin names
-'skinname-standard' => 'Класика',
-'skinname-nostalgia' => 'Носталгия',
 'skinname-cologneblue' => 'Кьолнско синьо',
 'skinname-monobook' => 'Монобук',
-'skinname-myskin' => 'Моят облик',
-'skinname-chick' => 'Пиленце',
-'skinname-simple' => 'Семпъл',
 'skinname-modern' => 'Модерен',
 
 # Patrolling
@@ -3020,11 +3046,17 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 минута|$1 минути}}',
 'hours' => '{{PLURAL:$1|$1 час|$1 часа}}',
 'days' => '{{PLURAL:$1|$1 ден|$1 дни}}',
+'weeks' => '{{PLURAL:$1|$1 седмица|$1 седмици}}',
 'months' => '{{PLURAL:$1|един месец|$1 месеца}}',
 'years' => '{{PLURAL:$1|една година|$1 години}}',
 'ago' => 'преди $1',
 'just-now' => 'току що',
 
+# Human-readable timestamps
+'hours-ago' => 'преди $1 {{PLURAL:$1|час|часа}}',
+'minutes-ago' => 'преди $1 {{PLURAL:$1|минута|минути}}',
+'seconds-ago' => 'преди $1 {{PLURAL:$1|секунда|секунди}}',
+
 # Bad image list
 'bad_image_list' => 'Спазва се следният формат:
 
@@ -3050,7 +3082,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Височина',
 'exif-bitspersample' => 'Дълбочина на цвета (битове)',
@@ -3207,7 +3239,7 @@ $1',
 'exif-originalimageheight' => 'Височина на изображението преди намаляването',
 'exif-originalimagewidth' => 'Ширина на изображението преди намаляването',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Некомпресиран',
 
 'exif-copyrighted-true' => 'С авторски права',
@@ -3570,7 +3602,6 @@ $5
 'version-other' => 'Други',
 'version-mediahandlers' => 'Обработчици на медия',
 'version-hooks' => 'Куки',
-'version-extension-functions' => 'Допълнителни функции',
 'version-parser-extensiontags' => 'Етикети от парсерни разширения',
 'version-parser-function-hooks' => 'Куки в парсерни функции',
 'version-hook-name' => 'Име на куката',
@@ -3579,6 +3610,7 @@ $5
 'version-license' => 'Лиценз',
 'version-poweredby-credits' => "Това уики се задвиждва от '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'други',
+'version-poweredby-translators' => 'преводачи в translatewiki.net',
 'version-credits-summary' => 'Бихме искали да изкажем признателност на следните хора за техните приноси към [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki е свободен софтуер, можете да го разпространявате и/или променяте съгласно условията на GNU General Public License, както е публикуван от Free Software Foundation, версия 2 на лиценза или (по ваше усмотрение) която и да е следваща версия.
 
@@ -3592,12 +3624,9 @@ MediaWiki се разпространява с надеждата, че ще б
 'version-entrypoints-header-entrypoint' => 'Входна точка',
 'version-entrypoints-header-url' => 'Адрес',
 
-# Special:FilePath
-'filepath' => 'Път към файл',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Отваряне',
-'filepath-summary' => 'Тази специална страница връща пълния път до даден файл.
-Изображенията се показват в пълната им разделителна способност, а други типове файлове се отварят направо с приложенията, с които са асоциирани.',
+# Special:Redirect
+'redirect-user' => 'Потребителски номер',
+'redirect-file' => 'Име на файл',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Търсене на повтарящи се файлове',
@@ -3653,6 +3682,8 @@ MediaWiki се разпространява с надеждата, че ще б
 'tags-display-header' => 'Изглед в списъците с промени',
 'tags-description-header' => 'Пълно описание на значението',
 'tags-hitcount-header' => 'Отбелязани промени',
+'tags-active-yes' => 'Да',
+'tags-active-no' => 'Не',
 'tags-edit' => 'редактиране',
 'tags-hitcount' => '$1 {{PLURAL:$1|промяна|промени}}',
 
@@ -3688,6 +3719,9 @@ MediaWiki се разпространява с надеждата, че ще б
 'htmlform-submit' => 'Изпращане',
 'htmlform-reset' => 'Отказване на промените',
 'htmlform-selectorother-other' => 'Друга',
+'htmlform-no' => 'Не',
+'htmlform-yes' => 'Да',
+'htmlform-chosen-placeholder' => 'Избиране',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 с поддръжка на пълнотекстово търсене',
@@ -3795,4 +3829,10 @@ $1 е автоматично повишен от $4 до $5',
 # Image rotation
 'rotate-comment' => 'Изображението е завъртяно на $1 {{PLURAL:$1|градус|градуса}} по часовниковата стрелка',
 
+# Limit report
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|секунда|секунди}}',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунда|секунди}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт|байта}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт|байта}}',
+
 );
diff --git a/languages/messages/MessagesBho.php b/languages/messages/MessagesBho.php
index 598824f8..3cc32d82 100644
--- a/languages/messages/MessagesBho.php
+++ b/languages/messages/MessagesBho.php
@@ -88,6 +88,8 @@ $messages = array(
 'tog-diffonly' => 'अवतरणं में अन्तर दर्शाते समय पुरान अवतरण न दिखाईं',
 'tog-showhiddencats' => 'छुपल श्रेणीयन के दिखाईं',
 'tog-norollbackdiff' => 'सम्पादन वापस लेला के बाद अन्तर न दिखाईं',
+'tog-useeditwarning' => 'यदि कउनो पन्ना पर सम्पादन करते समय परिवर्तन के बिना सुरक्षित कइले छोड़ दिं त हमके खबर करब।',
+'tog-prefershttps' => 'जब खाता में प्रवेश करीं त हमेशा सुरक्षित कनेक्शन के प्रयोग करीं',
 
 'underline-always' => 'हमेशा',
 'underline-never' => 'कभी ना',
@@ -151,6 +153,18 @@ $messages = array(
 'oct' => 'अक्टू',
 'nov' => 'नव',
 'dec' => 'दिस',
+'january-date' => 'जनवरी $1',
+'february-date' => 'फ़रवरी $1',
+'march-date' => 'मार्च $1',
+'april-date' => 'अप्रैल $1',
+'may-date' => 'मई $1',
+'june-date' => 'जून $1',
+'july-date' => 'जुलाई $1',
+'august-date' => 'अगस्त $1',
+'september-date' => 'सितम्बर $1',
+'october-date' => 'अक्टूबर $1',
+'november-date' => 'नवम्बर $1',
+'december-date' => 'दिसम्बर $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|श्रेणी|श्रेणी}}',
@@ -232,6 +246,7 @@ $messages = array(
 'create-this-page' => 'ई पन्ना के निर्माण करीं',
 'delete' => 'मिटाईं',
 'deletethispage' => 'ई पन्ना के मिटाईं',
+'undeletethispage' => 'ई पन्ना के फिर से स्थापित करीं',
 'undelete_short' => '{{PLURAL:$1|एगो हटावल गईल|$1 हटावल गईलं}} बदलाव वापस लाईं',
 'viewdeleted_short' => 'देखें {{PLURAL:$1|एगो हटावल गईल सम्पादन|$1 हटावल गईल कुल सम्पादन}}',
 'protect' => 'संरक्षण करीं',
@@ -275,7 +290,7 @@ $1',
 'pool-queuefull' => 'पूल पंक्ति भर गइल',
 'pool-errorunknown' => 'अज्ञात त्रुटि',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} के बारे में',
 'aboutpage' => 'Project:बारे में',
 'copyright' => 'सामग्री $1 के तहत उपलब्ध बा।',
@@ -285,7 +300,6 @@ $1',
 'disclaimers' => 'अस्विकरण',
 'disclaimerpage' => 'Project:सामान्य अस्विकरण',
 'edithelp' => 'मदद सम्पादन',
-'edithelppage' => 'Help:सम्पादन',
 'helppage' => 'Help:सामग्री',
 'mainpage' => 'मुख्य पन्ना',
 'mainpage-description' => 'मुख्य पन्ना',
@@ -363,17 +377,6 @@ $1',
 # General errors
 'error' => 'त्रुटी',
 'databaseerror' => 'डेटाबेस त्रुटी',
-'dberrortext' => 'डाटाबेस प्रश्न वाक्यरचना में त्रुटि मिलल बा।
-संभव बा कि इ सॉफ़्टवेयर में त्रुटि के कारण से भइल होखे।
-पिछलका डाटाबेस प्रश्न रहल:
-<blockquote><code>$1</code></blockquote>
- "<code>$2</code>" कार्य समूह से।
-डाटाबेस के त्रुटि रहल "<samp>$3: $4</samp>"।',
-'dberrortextcl' => 'डाटाबेस प्रश्न के वाक्यरचना में त्रुटि मिलल।
-डाटाबेस में पिछलका प्रश्न रहल:
-"$1"
-कार्यसमूह "$2" से।
-डाटाबेस से त्रुटि आईल "$3: $4"',
 'laggedslavemode' => "'''चेतावनी:''' इ पन्ना पर हाल के बदलाव ना होखे के आशंका बा।",
 'readonly' => 'डेटाबेस लॉक बा',
 'enterlockreason' => 'लॉक करे के कारण दिहीं, साथे लॉक खुले के समय के लगभग आकलन दिहीं।',
@@ -406,6 +409,7 @@ $1',
 'cannotdelete-title' => '"$1" पन्ना के हटावल नइखे जा सकत',
 'delete-hook-aborted' => 'हुक द्वारा हटायेके क्रिया बीचे में छोड़ल गईल।
 इ कउनो कारण नईखे बतवले।',
+'no-null-revision' => 'पन्ना "$1" खातिर नया अशक्त संशोधन ना बन सकल',
 'badtitle' => 'खराब शीर्षक',
 'badtitletext' => 'रउआ द्वारा अनुरोधित शीर्षक अयोग्य, ख़ाली या गलत जुड़ल अंतर-भाषीय या अंतर-विकि शीर्षक बा।
 इ में एक या एक से अधिक अइसन कॅरेक्टर हो सकत बा जउन शीर्षक में प्रयोग नइखे करल जा सकत।',
@@ -428,12 +432,15 @@ $1',
 'editinginterface' => "'''चेतावनी:''' रउआ एगो अइसन पन्ना के बदल रहल बानी जउन सॉफ़्टवेयर के इंटरफ़ेस पाठ्य प्रदान करेला।
 इ पन्ना के बदलला से अन्य सदस्यन के प्रदर्शित इंटरफ़ेस के शक्ल-सूरत में बदलाव आइ।
 सभे विकियन के खातिर अनुवाद बदले या जोड़े खातिर कृपया मीडियाविकि के क्षेत्रीयकरण परियोजना [//translatewiki.net/wiki/Main_Page?setlang=hi translatewiki.net] के प्रयोग करीं।",
-'sqlhidden' => '(छुपावल गइल SQL क्वेरी)',
 'cascadeprotected' => 'इ पन्ना पर सम्पादन करे के अधिकार खत्म कर दिहल गइल बा काहे कि इ निम्न में शामिल बा {{PLURAL:$1|पन्ना, जउन|पन्नां, जउन}} "व्यापक" विकल्प के चालू कइला के साथ सुरक्षित कर दिहल गइल बा:
 $2',
 'namespaceprotected' => "रउआ के '''$1''' नामस्थान के पन्नं में सम्पादन करे के अधिकार नइखे दिहल गइल।",
 'customcssprotected' => 'रउआ के इ CSS पन्ना के संपादित करे के अनुमति नइखे, काहे कि इ में अन्य सदस्यं के व्यक्तिगत सेटिंग्स समाविष्ट बा।',
 'customjsprotected' => 'रउआ इ जावास्क्रिप्ट पन्ना के संपादित करे के अनुमति नइखे, काहे कि इ में अन्य सदस्यं के व्यक्तिगत सेटिंग्स समाविष्ट बा।',
+'mycustomcssprotected' => 'रउआ इ CSS के पन्ना के सम्पादित करे के अधिकार नइखे।',
+'mycustomjsprotected' => 'रउआ इ जावास्क्रिप्ट पन्ना के सम्पादित करे के अधिकार नइखे।',
+'myprivateinfoprotected' => 'रउआ लगे आपन व्यक्तिगत जानकारी बदले के अनुमति नइखे।',
+'mypreferencesprotected' => 'रउआ लगे आपन वरियतां ‍‍‍‍(पसंद) बदले के अधिकार नइखे।',
 'ns-specialprotected' => 'विशेष पन्ना के सम्पादन सम्भव नइखे',
 'titleprotected' => 'सदस्य [[User:$1|$1]] द्वारा इ शीर्षक के पन्ना बनावे से बचाव खातिर इ के सुरक्षित कर दिहल गइल बा।
 इ खातिर निम्न कारण दिहल गइल बा: "\'\'$2\'\'"',
@@ -458,9 +465,19 @@ $2',
 'welcomecreation-msg' => 'राउर खाता बना दिहल गईल बा।
 आपन [[Special:Preferences|{{SITENAME}} वरीयतां]] के बदले के ना भूलब।',
 'yourname' => 'सदस्यनाम:',
+'userlogin-yourname' => 'सदस्यनाम',
+'userlogin-yourname-ph' => 'आपन सदस्यनाम लिखीं',
+'createacct-another-username-ph' => 'सदस्यनाम लिखीं',
 'yourpassword' => 'गुप्त शब्द',
+'userlogin-yourpassword' => 'गुप्तशब्द (पासवर्ड)',
+'userlogin-yourpassword-ph' => 'आपन गुप्तशब्द लिखीं',
+'createacct-yourpassword-ph' => 'एगो गुप्तशब्द प्रवेश करीं',
 'yourpasswordagain' => 'गुप्त-शब्द पुन:डालीं:',
+'createacct-yourpasswordagain' => 'गुप्तशब्द के पुष्टि करीं',
+'createacct-yourpasswordagain-ph' => 'गुप्तशब्द फेर से प्रवेश करीं',
 'remembermypassword' => 'इ ब्राउजर पर हमार प्रवेश याद रखीं (अधिकतम $1 {{PLURAL:$1|दिन|दिनं}} तक)',
+'userlogin-remembermypassword' => 'हमके प्रवेशित रहे दिं',
+'userlogin-signwithsecure' => 'सुरक्षित कनेक्शन के प्रयोग करीं',
 'yourdomainname' => 'राउर डोमेनः',
 'password-change-forbidden' => 'रउआ इ विकी पर गुप्तशब्द नइखीं बदल सकत।',
 'externaldberror' => 'या त प्रमाणिकरण डाटाबेस में भइल बा या फिर रउआ के आपन बाह्य खाता अपडेट करे के अनुमति नइखे।',
@@ -472,17 +489,40 @@ $2',
 'logout' => 'खाता से बाहर',
 'userlogout' => 'खाता से बाहर',
 'notloggedin' => 'खाता में प्रवेश नईखीं भईल',
+'userlogin-noaccount' => 'का एगो खाता नईखे?',
+'userlogin-joinproject' => '{{SITENAME}} से जुड़ीं',
 'nologin' => 'का एगो खाता नईखे? $1.',
 'nologinlink' => 'एगो खाता बनाईं',
 'createaccount' => 'खाता बनाईं',
 'gotaccount' => 'का पहिले से एगो खाता बा? $1.',
 'gotaccountlink' => 'खाता में प्रवेश',
 'userlogin-resetlink' => 'का रउआ आपन प्रवेश जानकारी भूला गइल बानी?',
+'userlogin-resetpassword-link' => 'आपन गुप्तशब्द के फिर से बहाल करीं',
+'helplogin-url' => 'Help:खाता प्रवेश',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|खाता प्रवेश में सहायता]]',
+'createacct-join' => 'अपना बारे में जानकारी नीचे लिखीं',
+'createacct-another-join' => 'नयका खाता के जानकारी नीचे लिखीं',
+'createacct-emailrequired' => 'ई-मेल पता',
+'createacct-emailoptional' => 'ई-मेल पता (वैकल्पिक)',
+'createacct-email-ph' => 'आपन ई-मेल पता लिखीं',
+'createacct-another-email-ph' => 'ई-मेल पता लिखीं',
 'createaccountmail' => 'एगो अस्थायी यादृच्छिक (रैन्डम) गुप्तशब्द के प्रयोग करीं आ निर्दिष्ट ई-मेल पता पर भेजीं',
+'createacct-realname' => 'असली नाम (वैकल्पिक)',
 'createaccountreason' => 'कारण:',
+'createacct-reason' => 'कारण',
+'createacct-reason-ph' => 'रउआ एगो अन्य खाता काहे बना रहल बानी',
+'createacct-captcha' => 'सुरक्षा जाँच',
+'createacct-imgcaptcha-ph' => 'उपर लिखल पाठ्य लिखीं',
+'createacct-submit' => 'आपन खाता बनाईं',
+'createacct-another-submit' => 'एगो दोसर खाता बनाईं',
+'createacct-benefit-heading' => '{{SITENAME}} रउआ जइसन लोगन द्वारा बनावल गईल बा।',
+'createacct-benefit-body1' => '{{PLURAL:$1|सम्पादन}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|पन्ना}}',
+'createacct-benefit-body3' => 'हाल के {{PLURAL:$1|योगदानकर्ता}}',
 'badretype' => 'रउआ जौन गुप्त शब्द डालत बानी उ नईखे मेल खात।',
 'userexists' => 'लिखल गईल सदस्य नाम पहिले से प्रयोग में बा। कृपया कौनो दोसर नाम चुनीं।',
 'loginerror' => 'खाता प्रवेश में त्रुटि',
+'createacct-error' => 'खाता निर्माण त्रुटि',
 'createaccounterror' => 'ई खाता ना बन पाईल: $1',
 'nocookiesnew' => 'प्रयोगकर्ता खाता त बन गईल, बाँकी रउआ प्रवेश नईखीं भईल।
 {{SITENAME}} प्रयोगकर्ता लोग के खाता में प्रवेश करावे खातिर कुकिज के प्रयोग करेला।
@@ -543,9 +583,13 @@ $2',
 
 यदि इ खाता गलती से खोलल गईल बा, त रउआ इ संदेश के अनदेखा कर सकत बानी।',
 'usernamehasherror' => 'सदस्यनाम में हैश कैरेक्टर वर्जित बा',
+'login-throttled' => 'रउआ हाले में कईयन बार खाता में प्रवेश करे के कोशिश कर चुकल बानी।
+कृपया $1 प्रतिक्षा करला के बाद फिर से प्रयास करब।',
 'login-abort-generic' => 'राउर खाता में प्रवेश असफल रहल - निष्फलित',
 'loginlanguagelabel' => 'भाषा: $1',
 'suspicious-userlogout' => 'राउर खाता से बाहर जाये के अनुरोध अस्वीकृत कर दिहल गइल बा काहे कि  अइसन लग रहल बा कि इ कउनो खराब ब्राउज़र या कैश करे वाली प्रॉक्सी द्वारा भेजल गईल रहल।',
+'createacct-another-realname-tip' => 'असली नाम वैकल्पिक बा।
+यदि रउआ इ के उपलब्ध करावे के चुनत बानी त, एकर प्रयोग सदस्य के ओकरा काम के अधिकार देवे खातिर होखी।',
 
 # Email sending
 'php-mail-error-unknown' => 'PHP के mail() फ़ंक्शन में अज्ञात त्रुटि बा।',
@@ -561,6 +605,7 @@ $2',
 'newpassword' => 'नया गुप्त-शब्द:',
 'retypenew' => 'नया गुप्त-शब्द पुन: डालीं:',
 'resetpass_submit' => 'गुप्तशब्द बनाईं आ खाता में प्रवेश करीं',
+'changepassword-success' => 'राउर गुप्तशब्द सफलतापुर्वक बदल दिहल गईल बा!',
 'resetpass_forbidden' => 'गुप्तशब्द बदलल नइखे जा सकत',
 'resetpass-no-info' => 'इ पन्ना के सिधे प्रयोग करे खातिर रउआ पहिले खाता में प्रवेश करे के पड़ी।',
 'resetpass-submit-loggedin' => 'गुप्त शब्द बदलीं',
@@ -572,8 +617,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'गुप्तशब्द रिसेट करीं',
+'passwordreset-text-one' => 'आपन गुप्तशब्द के पुनर्स्थापित करे खातिर इ फॉर्म भरीं।',
+'passwordreset-text-many' => '{{PLURAL:$1|आपन गुप्तशब्द पुनर्स्थापित करे खातिर निम्न में से कउनो एगो स्थान भरीं।}}',
 'passwordreset-legend' => 'गुप्तशब्द रिसेट करीं',
 'passwordreset-disabled' => 'इ विकी पर पासवर्ड पुनर्स्थापन अक्षम बा।',
+'passwordreset-emaildisabled' => 'इ विकि पर ई-मेल सुविधा अक्षम कर दिहल गईल बा।',
 'passwordreset-username' => 'प्रयोगकर्ता नाम',
 'passwordreset-domain' => 'डोमेन:',
 'passwordreset-capture' => 'परिणामस्वरूप बनल ई-मेल देखब?',
@@ -595,6 +643,8 @@ $2
 अस्थायी गुप्तशब्द: $2',
 'passwordreset-emailsent' => 'एगो गुप्तशब्द रिसेट ई-मेल भेजल जा चुकल बा।',
 'passwordreset-emailsent-capture' => 'नीचे दिखावल गईल गुप्तशब्द पुनर्स्थापना ई-मेल भेज दिहल गईल बा।',
+'passwordreset-emailerror-capture' => 'नीचे दिखावल गईल गुप्तशब्द पुनर्स्थापना ई-मेल उत्पन्न करल गईल रहल, परंतु उ के {{GENDER:$2|सदस्य}} के भेजे के क्रिया असफल रहल।
+त्रुटि: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ई-मेल पता बदलीं',
@@ -711,6 +761,7 @@ $2
 'permissionserrors' => 'अनुमति त्रुटी',
 'log-fulllog' => 'पूरा लॉग देखीं',
 'edit-conflict' => 'संपादन अंतर्विरोध',
+'postedit-confirmation' => 'राउर सम्पादन सुरक्षित कर दिहल गईल।',
 'invalid-content-data' => 'अवैध डाटा सामग्री',
 
 # Content models
@@ -815,7 +866,6 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'searchmenu-legend' => 'खोज विकल्प',
 'searchmenu-exists' => "'''इ विकि पर ''[[:$1]]'' नाम से एगो पन्ना उपलब्ध बा'''",
 'searchmenu-new' => "'''इ विकि पर ''[[:$1]]'' नाम से पन्ना बनाईं'''",
-'searchhelp-url' => 'Help:सामग्री',
 'searchmenu-prefix' => '[[विशेष:उपसर्ग सूची/$1|इ उपसर्ग साथे पन्ना ब्राउज करीं]]',
 'searchprofile-articles' => 'सामग्री पन्ना',
 'searchprofile-project' => 'मदद आ परियोजना पन्ना',
@@ -853,9 +903,6 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'powersearch-togglenone' => 'कउनो ना',
 'search-external' => 'बाहरी खोज',
 
-# Quickbar
-'qbsettings-none' => 'कउनो ना',
-
 # Preferences page
 'preferences' => 'वरीयता',
 'mypreferences' => 'राउर पसन्द',
@@ -882,6 +929,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'prefs-namespaces' => 'नामस्थान',
 'yourrealname' => 'असली नाम',
 'yourlanguage' => 'भाषा:',
+'prefs-preview' => 'पूर्वावलोकन',
 
 # Recent changes
 'recentchanges' => 'तुरंत भईल परिवर्तन',
@@ -1114,7 +1162,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'metadata-expand' => 'विस्तृत विवरण देखाईं',
 'metadata-collapse' => 'विस्तृत विवरण छुपाँईं',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'चौड़ाई',
 'exif-imagelength' => 'ऊँचाई',
 'exif-bitspersample' => 'अवयव प्रति बीट',
diff --git a/languages/messages/MessagesBi.php b/languages/messages/MessagesBi.php
index fcb5014a..4b28f496 100644
--- a/languages/messages/MessagesBi.php
+++ b/languages/messages/MessagesBi.php
@@ -8,7 +8,6 @@
  * @file
  *
  * @author Iketsi
- * @author Sotiale
  * @author Ushanka
  */
 
@@ -72,14 +71,6 @@ $messages = array(
 'qbmyoptions' => 'Ol pej blong mi',
 'qbspecialpages' => 'Ol spesel pej',
 
-# Vector skin
-'vector-action-move' => 'Muv',
-'vector-view-history' => 'Lukluk histri',
-'vector-view-view' => 'Rid',
-
-'search' => 'Faenem samting',
-'history' => 'Pej histri',
-'history_short' => 'Histri',
 'edit' => 'Jenisim hem',
 'newpage' => 'Mekem niu pej',
 'talkpagelinktext' => 'Toktok',
@@ -89,18 +80,14 @@ $messages = array(
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'mainpage' => 'Nambawan Pej',
 'mainpage-description' => 'Nambawan Pej',
-'portal' => 'Haus blong toktok‎',
-'portal-url' => 'Project:Haus blong toktok‎',
 
 'retrievedfrom' => 'Kam long "$1"',
 'editsection' => 'jenisim hem',
 'editold' => 'jenisim hem',
-'red-link-title' => '$1 (pej i no stap)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Atikel',
-'nstab-special' => 'Spesel pej',
-'nstab-project' => 'Projek pej',
+'nstab-special' => 'Spesel',
 
 # Edit pages
 'minoredit' => 'Mi bin mekem wan smol jenis',
@@ -108,9 +95,6 @@ $messages = array(
 # Preferences page
 'servertime' => 'Taem blong server',
 
-# Recent changes
-'recentchanges' => 'Niu jenis',
-
 # Special:ListFiles
 'listfiles_name' => 'Nem',
 
@@ -122,7 +106,7 @@ $messages = array(
 # Special:AllPages
 'allarticles' => 'Olgeta atikel',
 
-# Email user
+# E-mail user
 'emailfrom' => 'Kam long',
 'emailto' => 'Go long:',
 
@@ -165,7 +149,4 @@ $messages = array(
 # Auto-summaries
 'autosumm-new' => 'Niu pej: $1',
 
-# Special:SpecialPages
-'specialpages' => 'Spesel pej',
-
 );
diff --git a/languages/messages/MessagesBjn.php b/languages/messages/MessagesBjn.php
index a5841939..fe44b3a7 100644
--- a/languages/messages/MessagesBjn.php
+++ b/languages/messages/MessagesBjn.php
@@ -173,9 +173,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Tampaiakan barapa pamakai nang maitihi',
 'tog-oldsig' => 'Tandateken nang sudah ada:',
 'tog-fancysig' => 'Tapsirakan tandatangan sawagai naskah wiki (kada batautan utumatis)',
-'tog-externaleditor' => 'Puruk pambabak luar sawagai default (hagan nang harat haja, musti ada setélan istimiwa pada komputer Pian.[//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Puruk palainan luar sawagai default (hagan nang harat haja, musti ada setélan istimiwa pada komputer Pian. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => 'Kawa\'akan "lacung ka" tautan kakawaan-masuk',
 'tog-uselivepreview' => 'Puruk titilikan langsung (parlu ada JavaScript) (cacubaan)',
 'tog-forceeditsummary' => 'Ingatakan ulun wayah babuat sabuting kasimpulan babakan puang',
 'tog-watchlisthideown' => 'Sungkupakan babakan ulun di daptar itihan',
@@ -188,6 +185,7 @@ $messages = array(
 'tog-diffonly' => 'Kada usah manampaiakan isi tungkaran di bawah balain',
 'tog-showhiddencats' => 'Tampaiakan tutumbung tasungkup',
 'tog-norollbackdiff' => 'Kada usah manampaiakan lainan imbah mambulikakan',
+'tog-useeditwarning' => 'Ingatakan ulun pabila maninggalakan tungkaran pambabakan sabalum manyimpan parubahan',
 
 'underline-always' => 'Tarus',
 'underline-never' => 'Kada suah',
@@ -375,7 +373,7 @@ $1",
 'pool-queuefull' => 'Antrian hibak',
 'pool-errorunknown' => 'Kada tahu napa nang salah',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Pasal {{SITENAME}}',
 'aboutpage' => 'Project:Pasal',
 'copyright' => 'Isi tasadia sasuai lawan $1.',
@@ -385,7 +383,6 @@ $1",
 'disclaimers' => 'Panyangkalan',
 'disclaimerpage' => 'Project:Panyangkalan umum',
 'edithelp' => 'Patulung mambabak',
-'edithelppage' => 'Help:Pambabakan',
 'helppage' => 'Help:Isi',
 'mainpage' => 'Tungkaran Tatambaian',
 'mainpage-description' => 'Tungkaran Tatambaian',
@@ -462,17 +459,6 @@ Daptar tungkaran istimiwa sah kawa diugai pada [[Special:SpecialPages|{{int:spec
 # General errors
 'error' => 'Kasalahan',
 'databaseerror' => 'Kasalahan Basisdata',
-'dberrortext' => 'Ada kasalahan sintaks pada parmintaan basisdata.
-Kasalahan ngini pina manandai adanya sabuting bug dalam parangkat lunak.
-Parmintaan basisdata yang tadudi adalah:
-<blockquote><tt>$1</tt></blockquote>
-matan dalam pungsi "<tt>$2</tt>".
-Basisdata kasalahan  babulik "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Ada kasalahan sintaks pada parmintaan basisdata.
-Parmintaan basisdata nang tadudi adalah:
-"$1"
-matan dalam pungsi "$2".
-Basisdata kasalahan  babulik "$3: $4".',
 'laggedslavemode' => "'''Paringatan:''' Tungkaran ngini tagasnya kada baisi paubahan pahanyarnya.",
 'readonly' => 'Basisdata tasunduk',
 'enterlockreason' => 'Buati sabuting alasan manyunduk, tamasuk jua wayah kapan handak dibuka pulang sundukannya.',
@@ -526,7 +512,6 @@ Muhun cubai pulang dalam babarapa minit.',
 'editinginterface' => "'''Paringatan:''' Pian mambabak sabuting tungkaran nang dipuruk hagan manyadiakan naskah antarmuha gasan parangkat lunak.
 Paubahan ka tungkaran ngini akan bapangaruh matan tampaian antarmuha gasan pamakai lain.
 Gasan tarjamahan, muhun pakai [//translatewiki.net/wiki/Main_Page?setlang=bjn translatewiki.net], rangka gawian palokalan MediaWiki.",
-'sqlhidden' => '(Parmintaan SQL disungkupakan)',
 'cascadeprotected' => 'Tungkaran ini sudah dilindungi matan pambabakan, marga nangini tamasuk dalam {{PLURAL:$1|tungkaran|tutungkaran}} dudi nang dilindungi "barénténg": $2',
 'namespaceprotected' => "Pian kada baisi ijin hagan mambabak tutungkaran dalam ngaran kamar '''$1'''.",
 'customcssprotected' => 'Pian kada baisi ijin mambabak tungkaran CSS ngini, karana ngini baisi setelan paribadi pamakai lain.',
@@ -560,7 +545,6 @@ Jangan kada ingat hagan maubah [[Special:Preferences|kakatujuan {{SITENAME}}]] P
 'yourpassword' => 'Katasunduk:',
 'yourpasswordagain' => 'Katik pulang katasunduk:',
 'remembermypassword' => 'Ingatakan log babuat ulun dalam komputer naya (salawas $1 {{PLURAL:$1|hari|hari}})',
-'securelogin-stick-https' => 'Tatap tasambung awan HTTPS imbah babuat-log',
 'yourdomainname' => 'Domain Pian:',
 'password-change-forbidden' => 'Pian kada kawa ma-ubah kata sunduk pada wiki ngini.',
 'externaldberror' => 'Ada kasalahan apakah kacucukan basis data atawa Pian kada bulih mamutakhirakan akun luar.',
@@ -663,7 +647,7 @@ Hagan manuntungakan babuat log, Pian musti manyetel sabuting katasunduk hanyar d
 'newpassword' => 'Katasunduk hanyar:',
 'retypenew' => 'Katik pulang katasunduk hanyar:',
 'resetpass_submit' => 'Setel katasunduk wan babuat log',
-'resetpass_success' => 'Katasunduk Pian bahasil diubah!
+'changepassword-success' => 'Katasunduk Pian bahasil diubah!
 Wayah ni Pian sudah babuat log...',
 'resetpass_forbidden' => 'Katasunduk kada kawa diubah',
 'resetpass-no-info' => 'Pian musti babuat log hagan babuat ka tungkaran ini langsung.',
@@ -675,10 +659,8 @@ Pian pinanya sudah barhasil maubah katasunduk Pian atawa maminta sabuting katasu
 
 # Special:PasswordReset
 'passwordreset' => 'Bulikakan setelan katasunduk',
-'passwordreset-text' => 'Tuntungakan purmulir ngini gasan manarima sabuting suril pangingat rarincian akun Pian.',
 'passwordreset-legend' => 'Bulikakan setelan katasunduk',
 'passwordreset-disabled' => 'Mambulikakan setelan katasunduk dipajahakan hagan wiki ngini.',
-'passwordreset-pretext' => '{{PLURAL:$1||Buati asa data di bawah ngini}}',
 'passwordreset-username' => 'Ngaran pamakai:',
 'passwordreset-domain' => 'Dumain:',
 'passwordreset-capture' => 'Tiringikah kulihan suril?',
@@ -1149,7 +1131,6 @@ Catatan bahwasa mamuruk tautan napigasi akan mambulikakan setelan kolum ngini.',
 'searchmenu-legend' => 'Papilihan manggagai',
 'searchmenu-exists' => "'''Ada tungkaran bangaran \"[[:\$1]]\" dalam wiki ini.'''",
 'searchmenu-new' => "'''Maulah tungkaran \"[[:\$1]]\" dalam wiki ngini!'''",
-'searchhelp-url' => 'Help:Isi',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Janaki daptar tungkaran lawan awalan ngini]]',
 'searchprofile-articles' => 'Tungkaran isi',
 'searchprofile-project' => 'Tutungkaran Patulung wan Rangka gawian',
@@ -1194,15 +1175,6 @@ Tarai pamintaan Pian lawan ''all:'' gasan manggagai samunyaan isi (tamasuk tungk
 Pian kawa manggagai lung Google parhatan ini.
 Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
 
-# Quickbar
-'qbsettings' => 'Bilahhancap',
-'qbsettings-none' => 'Kadada',
-'qbsettings-fixedleft' => 'Tatap di kiwa',
-'qbsettings-fixedright' => 'Tatap di kanan',
-'qbsettings-floatingleft' => 'Mangambang sabalah kiwa',
-'qbsettings-floatingright' => 'Mangambang sabalah kanan',
-'qbsettings-directionality' => 'Tatap, tagantung pada ampah skrip matan bahasa Pian',
-
 # Preferences page
 'preferences' => 'Kakatujuan',
 'mypreferences' => 'Nang ulun katuju',
@@ -1234,7 +1206,6 @@ Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
 'resetprefs' => 'Walangakan paubahan',
 'restoreprefs' => 'Bulikakan samunyaan sesetélan default',
 'prefs-editing' => 'Pambabakan',
-'prefs-edit-boxsize' => 'Ukuran lalungkang babakan',
 'rows' => 'Baris:',
 'columns' => 'Kolom:',
 'searchresultshead' => 'Gagai',
@@ -1245,8 +1216,6 @@ Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
 'recentchangesdays-max' => 'Paling lawas $1 {{PLURAL:$1|hari|hahari}}',
 'recentchangescount' => 'Rikinan babakan nang ditampaiakan default:',
 'prefs-help-recentchangescount' => 'Ngini tamasuk paubahan pahanyarnya, sajarah halam tungkaran, wan log-log.',
-'prefs-help-watchlist-token' => 'Maisi kutak ngini lawan kunci rahasia (PIN) akan mahasilakan sindikasi RSS hagan daptar pantauan Anda. Siapa gin nang tahu kunci ngini kawa mambaca daptar itihan Pian, jadi pilihi nilainya bahati-hati
-Barikut ngini adalah nilai acak nang kawa Pian puruk: $1',
 'savedprefs' => 'Kakatujuan Pian sudah ham disimpan.',
 'timezonelegend' => 'Waktu banua:',
 'localtime' => 'Waktu damintu:',
@@ -1277,7 +1246,6 @@ Barikut ngini adalah nilai acak nang kawa Pian puruk: $1',
 'prefs-reset-intro' => 'Pian kawa mamuruk tungkaran ini hagan setel bulik kakatujuan Pian ka default situs.
 Ini kada kawa diwalangi.',
 'prefs-emailconfirm-label' => 'Payakinakan suril:',
-'prefs-textboxsize' => 'Ukuran kutak ubahan',
 'youremail' => 'Suril:',
 'username' => 'Ngaran pamuruk:',
 'uid' => 'ID pamuruk:',
@@ -1516,7 +1484,6 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'recentchangeslinked-feed' => 'Paubahan tarait',
 'recentchangeslinked-toolbox' => 'Paubahan tarait',
 'recentchangeslinked-title' => 'Paubahan nang tarait lawan "$1"',
-'recentchangeslinked-noresult' => 'Kadada paubahan pada tautan tutungkaran salawas wayah ditantuakan',
 'recentchangeslinked-summary' => "Ngini sabuting daptar paubahan nang diulah hahanyar ngini pada tungkaran batautan matan sabuting tungkaran tartantu (atawa ka angguta matan sabuah tumbung tartantu).
 Tutungkaran dalam [[Special:Watchlist|daptar itihan Pian]] ditandai '''kandal'''.",
 'recentchangeslinked-page' => 'Ngaran tungkaran:',
@@ -1739,7 +1706,6 @@ Gasan kaamanan baik, img_auth.php dipajahakan.',
 'http-read-error' => 'Kasalahan baca HTTP.',
 'http-timed-out' => 'Maminta HTTP habis waktunya.',
 'http-curl-error' => 'Kasalahan pas maambil URL: $1',
-'http-host-unreachable' => 'Kada kawa mancapai URL.',
 'http-bad-status' => 'Ada sabuah masalah pas maminta HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1887,12 +1853,6 @@ Pariksa 'hulu tautan lain ka citakan itu sabalum mahapusnya.",
 'statistics-users-active-desc' => 'Pamuruk nang sudah malakukan suatu aksi dalam {{PLURAL:$1|sahari|$1 hari}} tauncit.',
 'statistics-mostpopular' => 'Tungkaran nang paling banyak ditampaiakan',
 
-'disambiguations' => 'Tungkaran nang tahubung ka tungkaran disambiguasi',
-'disambiguationspage' => 'Template:Disambigu',
-'disambiguations-text' => "Tutungkaran barikut bataut ka sabuah '''tungkaran disambigu'''.
-Tutungkaran ngitu harusnya ka tupik nang sasuai.<br />
-Sabuah tungkaran dianggap sawagai tungkaran disambigu amun ngini mamuruk sabuah citakan nang tataut matan [[MediaWiki:Disambiguationspage]]",
-
 'doubleredirects' => 'Paugahan ganda',
 'doubleredirectstext' => 'Tungkaran ngini mandaptar tutungkaran nang maugah ka tutungkaran ugahan lain.
 Tiap baris mangandung tautan ka ugahan panambaian wan kadua, sasarannya adalah ugahn kadua, nang biasanya tungkaran sasaran "sabujurnya", nang ugahan partama tuju.
@@ -2137,10 +2097,9 @@ Paubahan-paubahan salanjutnya pada tungkaran ngini dan tungkaran pamandiran tara
 'unwatchthispage' => 'Mandak maitihi',
 'notanarticle' => 'Lainan sabuting tungkaran isi',
 'notvisiblerev' => 'Ralatan tauncit ulih saurang pamuruk babida sudah dihapus',
-'watchnochange' => 'Kadada nang Pian itihi dibabak parhatan jangka wayah ngitu.',
 'watchlist-details' => '{{PLURAL:$1|$1 tungkaran|$1 tungkaran}} dalam daptar itihan Pian, kada mahitung tungkaran pamandiran.',
 'wlheader-enotif' => 'Suril pamadahan dipajahi.',
-'wlheader-showupdated' => "* Tutungkaran nang ba-ubah tumatan ilangan tauncit Pian ditampaiakan dalam '''hurup kandal'''",
+'wlheader-showupdated' => "Tutungkaran nang ba-ubah tumatan ilangan tauncit Pian ditampaiakan dalam '''hurup kandal'''",
 'watchmethod-recent' => 'pariksa bababakan pahanyarnya gasan tungkaran nang diitihi.',
 'watchmethod-list' => 'pariksa tutungkaran nang diitihi gasan bababakan pahanyarnya',
 'watchlistcontains' => 'Paitihan Pian mangandung $1 {{PLURAL:$1|tungkaran|tutungkaran}}.',
@@ -2550,12 +2509,9 @@ Janaki [[Special:BlockList|daptar diblukir]] gasan daptar uprasi dibabat wan pam
 Ngini, kayapa pun, diblukir sawagai palihan wilayah $2, nang kawa-ai dilapas-blukirnya.',
 'ip_range_invalid' => 'Jarak IP kada sah.',
 'ip_range_toolarge' => 'Jarak blukir taganal pada /$1 kada dibulihakan.',
-'blockme' => 'Blokir ulun',
 'proxyblocker' => 'Pamblukir pruksi',
-'proxyblocker-disabled' => 'Pungsi ngini dipajahakan.',
 'proxyblockreason' => 'Alamat IP Pian diblukir karana ngini sabuah pruksi tabuka.
 Muhun hubungi Panyadia Layan Internet Pian atawa sukungan tiknik wan padahi sidin pasal masalah ka-amanan sarius ngini.',
-'proxyblocksuccess' => 'Sudah.',
 'sorbsreason' => 'Alamat IP Pian tadaptar sawagai pruksi tabuka dalam DNSBL dipuruk ulih {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Alamat IP Pian tadaptar sawagai pruksi tabuka dalam DNSBL dipuruk ulih {{SITENAME}}.
 Pian kada kawa maulah sabuah akun',
@@ -3022,7 +2978,7 @@ Tautan-tautan abis tu pada baris sama dipartimbangkan sabagai pangacualian, nang
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Libar',
 'exif-imagelength' => 'Pancau',
 'exif-bitspersample' => 'Bit par kumpunin',
@@ -3200,7 +3156,7 @@ Tautan-tautan abis tu pada baris sama dipartimbangkan sabagai pangacualian, nang
 'exif-originalimageheight' => 'Pancau gambar sabalum dihandapi',
 'exif-originalimagewidth' => 'Lingai gambar sabalum dihandapi',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Kada dikumpris',
 'exif-compression-2' => 'Galambang CCITT 3 1-Dimensional Modified Huffman manjalankan panjang encoding',
 'exif-compression-3' => 'Galambang CCITT 3 paks encoding',
@@ -3596,7 +3552,6 @@ Pian kawa jua [[Special:EditWatchlist|mamuruk si pambabak standar]].',
 'version-other' => 'Lain-lain',
 'version-mediahandlers' => 'Pananganan madia',
 'version-hooks' => 'Kait',
-'version-extension-functions' => 'Pungsi ekstensi',
 'version-parser-extensiontags' => 'Tag ekstensi parser',
 'version-parser-function-hooks' => 'Kait pungsi parser',
 'version-hook-name' => 'Ngaran kait',
@@ -3616,13 +3571,6 @@ Pian saharusnya [{{SERVER}}{{SCRIPTPATH}}/COPYING sabuting salinan Lisansi Publi
 'version-software-version' => 'Virsi',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Wadah barakas',
-'filepath-page' => 'Barakas:',
-'filepath-submit' => 'Gagai',
-'filepath-summary' => 'Tungkaran istimiwa ngini mambulikakan jalur panuntungan sabuah barakas.
-Gambar ditampaiakan dalam risulusi hibak, janis barakas lain dimula lawan prugram taraitnya langsung.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Gagai gasan babarakas baganda',
 'fileduplicatesearch-summary' => 'Gagai gasan babarakas baganda bapandal nilai hash.',
diff --git a/languages/messages/MessagesBn.php b/languages/messages/MessagesBn.php
index f97bb94c..e9a6f9ee 100644
--- a/languages/messages/MessagesBn.php
+++ b/languages/messages/MessagesBn.php
@@ -101,9 +101,6 @@ $messages = array(
 'tog-shownumberswatching' => 'নজরদারী করছে, এমন ব্যবহারকারীর সংখ্যা দেখানো হোক',
 'tog-oldsig' => 'বর্তমান স্বাক্ষর:',
 'tog-fancysig' => 'স্বাক্ষরকে উইকিটেক্সট হিসেবে মনে করুন (কোন সয়ংক্রিয় লিঙ্ক ছাড়া)',
-'tog-externaleditor' => 'শুরুতেই বহিঃস্থ সম্পাদক ব্যবহার করা হোক (শুধুমাত্র দক্ষ ব্যবহারকারীদের জন্য, কম্পিউটারে বিশেষ সেটিংস এর প্রয়জোন। [//www.mediawiki.org/wiki/Manual:External_editors বিস্তারিত তথ্য।])',
-'tog-externaldiff' => 'শুরুতেই বহিঃস্থ পার্থক্য ব্যবহার করা হোক (শুধুমাত্র দক্ষ ব্যবহারকারীদের জন্য, কম্পিউটারে বিশেষ সেটিংস এর প্রয়জোন। [//www.mediawiki.org/wiki/Manual:External_editors বিস্তারিত তথ্য।])',
-'tog-showjumplinks' => '"ঝাঁপ দিন" বৈশিষ্ট্যের সংযোগ চালু করা হোক',
 'tog-uselivepreview' => 'তাৎক্ষণিক প্রাকদর্শনের ক্ষমতা চালু করা হোক (পরীক্ষামূলক)',
 'tog-forceeditsummary' => 'খালি সম্পাদনা সারাংশ প্রবেশ করানোর সময় আমাকে জানানো হোক',
 'tog-watchlisthideown' => 'আমার সম্পাদনাগুলি আমার নজরতালিকায় না দেখানো হোক',
@@ -116,6 +113,8 @@ $messages = array(
 'tog-diffonly' => 'পার্থক্যের নিচে পাতার বিষয়বস্তু না দেখানো হোক',
 'tog-showhiddencats' => 'লুকায়িত বিষয়শ্রেণীসমূহ দেখাও',
 'tog-norollbackdiff' => 'রোলব্যাকের পরে পার্থক্য দেখিও না',
+'tog-useeditwarning' => 'অসংরক্ষিত পরিবর্তনসহ কোনো পাতা ত্যাগের সময় সাবধান করো',
+'tog-prefershttps' => 'যখনই প্রবেশ করবেন সবসময় নিরাপদ সংযোগ ব্যবহার করুন',
 
 'underline-always' => 'সব সময়',
 'underline-never' => 'কখনো নয়',
@@ -179,6 +178,18 @@ $messages = array(
 'oct' => 'অক্টো',
 'nov' => 'নভে',
 'dec' => 'ডিসে',
+'january-date' => 'জানুয়ারি $1',
+'february-date' => 'ফেব্রুয়ারি $1',
+'march-date' => 'মার্চ $1',
+'april-date' => 'এপ্রিল $1',
+'may-date' => 'মে $1',
+'june-date' => 'জুন $1',
+'july-date' => 'জুলাই $1',
+'august-date' => 'আগস্ট $1',
+'september-date' => 'সেপ্টেম্বর $1',
+'october-date' => 'অক্টোবর $1',
+'november-date' => 'নভেম্বর $1',
+'december-date' => 'ডিসেম্বর $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|বিষয়শ্রেণী|বিষয়শ্রেণীসমূহ}}',
@@ -260,6 +271,7 @@ $messages = array(
 'create-this-page' => 'পাতাটি তৈরি করো',
 'delete' => 'অপসারণ',
 'deletethispage' => 'এই পাতাটি মুছে ফেলুন',
+'undeletethispage' => 'পাতাটি পুনরুদ্ধার করো',
 'undelete_short' => 'পুনঃস্থাপন {{PLURAL:$1|১টি সম্পাদনা|$1টি সম্পাদনাসমূহ}}',
 'viewdeleted_short' => '{{PLURAL:$1| টি অপসারিত সম্পাদনা|$1 টি অপসারিত সম্পাদনা}} দেখাও',
 'protect' => 'সুরক্ষা',
@@ -303,7 +315,7 @@ $1',
 'pool-queuefull' => 'পুলের লাইন পূর্ণ',
 'pool-errorunknown' => 'অজানা ত্রুটি',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} বৃত্তান্ত',
 'aboutpage' => 'Project:বৃত্তান্ত',
 'copyright' => '$1 এর আওতায় প্রকাশিত যদি অন্য কিছু নির্ধারিত না থাকে।',
@@ -313,7 +325,6 @@ $1',
 'disclaimers' => 'দাবিত্যাগ',
 'disclaimerpage' => 'Project:সাধারণ দাবিত্যাগ',
 'edithelp' => 'সম্পাদনা সহায়িকা',
-'edithelppage' => 'Help:কিভাবে একটি পাতা সম্পাদনা করবেন',
 'helppage' => 'Help:সূচী',
 'mainpage' => 'প্রধান পাতা',
 'mainpage-description' => 'প্রধান পাতা',
@@ -391,17 +402,12 @@ $1',
 # General errors
 'error' => 'ত্রুটি',
 'databaseerror' => 'ডাটাবেস ত্রুটি',
-'dberrortext' => 'ডাটাবেজ কোয়েরি সিন্ট্যাক্সে ত্রুটি ঘটেছে।
-সফটওয়্যারে কোন বাগের কারণে এমন হতে পারে।
-সর্বশেষ ডাটাবেজ কোয়েরিটি ছিল এরকম:
-<blockquote><tt>$1</tt></blockquote>
-"<code>$2</code>" ফাংশনের ভিতর থেকে।
-ডাটাবেজ যে ত্রুটি পাঠিয়েছে: "<samp>$3: $4</samp>"।',
-'dberrortextcl' => 'ডাটাবেজ কোয়েরি সিনট্যাক্স ত্রুটি ঘটেছে।
-সর্বশেষ ডাটাবেজ কোয়েরিটি ছিল:
-"$1"
-"$2" ফাংশনের ভিতর থেকে।
-ডাটাবেজ যে ত্রুটি পাঠিয়েছে: "$3: $4"',
+'databaseerror-text' => 'ডাটাবেজ অনুসন্ধান ত্রুটি।
+এটি সফটওয়্যারের একটি ত্রুটি হতে পারে।',
+'databaseerror-textcl' => 'ডাটাবেজ অনুসন্ধান ত্রুটি।',
+'databaseerror-query' => 'অনুসন্ধান: $1',
+'databaseerror-function' => 'ফাংশন: $1',
+'databaseerror-error' => 'ত্রুটি: $1',
 'laggedslavemode' => 'সতর্কীকরণ: পাতাটি সম্ভবত সম্প্রতি হালনাগাদকৃত নয়।',
 'readonly' => 'ডেটাবেজের ব্যবহার সীমাবদ্ধ',
 'enterlockreason' => 'তালাবদ্ধ করার কারণ কি তা বলুন, সাথে কখন তালা খুলবেন তার আনুমানিক সময় উল্লখ্য করুন',
@@ -435,6 +441,7 @@ $1',
 'cannotdelete-title' => '"$1" পৃষ্ঠা মুছে ফেলা যাচ্ছে না।',
 'delete-hook-aborted' => 'হূক দ্বারা সম্পাদনা পরিত্যক্ত হয়েছে।
 এর কোন ব্যাখ্যা নাই।',
+'no-null-revision' => '"$1" এর জন্য নাল রিভিশন তৈরী করা যায়নি',
 'badtitle' => 'শিরোনামটি গ্রহনযোগ্য নয়।',
 'badtitletext' => 'অনুরোধকৃত পাতার শিরোনামটি অবৈধ, খালি কিংবা কোন ভুল আন্তঃভাষা বা আন্তঃউইকি শিরোনাম সংযোগ ছিল। এটিতে সম্ভবত এমন এক (একাধিক) ক্যারেক্টার আছে, যা (যেগুলি) শিরোনামে ব্যবহারযোগ্য নয়।',
 'perfcached' => 'নিচের উপাত্তগুলো ক্যাশ থেকে নেয়া এবং সম্পূর্ণ হালনাগাদকৃত না-ও হতে পারে। সর্বোচ্চ {{PLURAL:$1|একটি ফলাফল|$1 টি ফলাফল}} ক্যাশে থাকতে পারে।',
@@ -455,12 +462,15 @@ $1',
 'editinginterface' => "'''সতর্কীকরণ:''' আপনি এমন একটি পাতা সম্পাদনা করছেন যা সফটওয়্যারের জন্য ইন্টারফেস টেক্সট প্রদান করে।
 এই পাতাতে সংঘটিত পরিবর্তন এই উইকির ব্যবহারকারীদের ইন্টারফেসে প্রভাব ফেলবে, যা অন্য ব্যবহারকারীরা দেখতে পাবেন।
 সকল উইকির অনুবাদে কোনো ধরনের সংযোজন বা পরিবর্তন করতে, অনুগ্রহ করে মিডিয়াউইকি স্থানীয়করন প্রকল্প [//translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
-'sqlhidden' => '(এস কিউ এল কোয়েরি লুকানো আছে)',
 'cascadeprotected' => 'এই পাতাটি সম্পাদনা থেকে সুরক্ষিত, কারণ পাতাটি নিচের {{PLURAL:$1|টি পাতার|টি পাতার}} অন্তর্গত, যে পাতা(গুলি) "প্রপাতাকার" (cascading) বৈশিষ্ট্য সহযোগে সুরক্ষিত করা হয়েছে:
 $2',
 'namespaceprotected' => "'''$1''' নামস্থানে কোন পাতা আপনার সম্পাদনা করার অনুমতি নেই।",
 'customcssprotected' => 'আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।',
 'customjsprotected' => 'আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।',
+'mycustomcssprotected' => 'আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই।',
+'mycustomjsprotected' => 'আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই।',
+'myprivateinfoprotected' => 'আপনার ব্যক্তিগত তথ্য সম্পাদনা করতে আপনার অনুমতি নেই',
+'mypreferencesprotected' => 'আপনার পছন্দসমূহ সম্পাদনা করতে আপনার অনুমতি নেই',
 'ns-specialprotected' => '{{ns:special}} নামস্থানে পাতাসমূহ সম্পাদনা করা যাবে না।',
 'titleprotected' => "[[User:$1|$1]]-কে এই শিরোনামের পাতা সৃষ্টি করতে বাধা দেয়া হচ্ছে। কারণ: ''$2''।",
 'filereadonlyerror' => '"$1" ফাইলটিকে পরিবর্তন করা সম্ভব হচ্ছে না কারন "$2" ফাইল রিপোসিটোরি রিড-অনলি-মোডে আছে।
@@ -484,10 +494,19 @@ $2',
 'welcomecreation-msg' => 'আপনার অ্যাকাউন্ট তৈরী হয়েছে।
 আপনার [[Special:Preferences|{{SITENAME}} পছন্দসমূহ]]  পরিবর্তন করে নিতে ভুলবেন না।',
 'yourname' => 'ব্যবহারকারী নাম:',
+'userlogin-yourname' => 'ব্যবহারকারী নাম',
+'userlogin-yourname-ph' => 'আপনার ব্যবহাকারী নাম প্রবেশ করান',
+'createacct-another-username-ph' => 'আপনার ব্যবহাকারী নাম প্রবেশ করান',
 'yourpassword' => 'শব্দচাবি:',
+'userlogin-yourpassword' => 'শব্দচাবি (Password)',
+'userlogin-yourpassword-ph' => 'আপনার শব্দচাবি (পাসওয়ার্ড) লিখুন',
+'createacct-yourpassword-ph' => 'শব্দচাবি প্রদান করুন',
 'yourpasswordagain' => 'শব্দচাবিটি (password) আবার লিখুন',
+'createacct-yourpasswordagain' => 'শব্দচাবি নিশ্চিত করুন',
+'createacct-yourpasswordagain-ph' => 'আবারও শব্দচাবি প্রদান করুন',
 'remembermypassword' => 'একাধিক সেশনের জন্য শব্দচাবি মনে রাখা হোক (সর্বোচ্চ $1 {{PLURAL:$1|দিনের|দিনের}} জন্য)',
-'securelogin-stick-https' => 'লগইনের পর এইচটিটিপিএস-এর সাথে সংযোগকৃত থাকুন',
+'userlogin-remembermypassword' => 'আমাকে প্রবেশ অবস্থায় রাখো',
+'userlogin-signwithsecure' => 'নিরাপদ সংযোগ ব্যবহার করুন',
 'yourdomainname' => 'আপনার ডোমেইন',
 'password-change-forbidden' => 'আপনি এই উইকিতে পাসওয়ার্ড পরিবর্তন করতে পারবেন না।',
 'externaldberror' => 'হয় কোন বহিঃস্থ যাচাইকরণ ডাটাবেজ ত্রুটি ঘটেছে অথবা আপনার বহিঃস্থ অ্যাকাউন্ট হালনাগাদ করার অনুমতি নেই।',
@@ -499,18 +518,44 @@ $2',
 'logout' => 'প্রস্থান করুন',
 'userlogout' => 'প্রস্থান',
 'notloggedin' => 'আপনি সংযুক্ত নন',
+'userlogin-noaccount' => 'কোনও অ্যাকাউন্ট নেই?',
+'userlogin-joinproject' => '{{SITENAME}}-এ যোগ দিন',
 'nologin' => "আপনার কি উইকিপিডিয়াতে অ্যাকাউন্ট নেই? তাহলে '''$1'''।",
 'nologinlink' => 'অ্যাকাউন্ট তৈরি করুন',
 'createaccount' => 'নতুন অ্যাকাউন্ট খুলুন',
 'gotaccount' => "আপনার কি ইতিমধ্যে একটি অ্যাকাউন্ট তৈরি করা আছে? '''$1''' করুন।",
 'gotaccountlink' => 'প্রবেশ',
 'userlogin-resetlink' => 'আপনার লগইনের বিস্তারিত তথ্যাদি ভুলে গেছেন?',
+'userlogin-resetpassword-link' => 'শব্দচাবি পুনরায় ধার্য করুন',
+'helplogin-url' => 'Help:প্রবেশ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|লগইন সংক্রান্ত সাহায্য]]',
+'userlogin-loggedin' => 'আপনি বর্তমানে {{GENDER:$1|$1}} হিসাবে লগইন আছেন।
+অন্য ব্যবহারকারী নামে লগইন করতে চাইলে নিচের ফর্মটি ব্যবহার করুন।',
+'userlogin-createanother' => 'আরেকটি অ্যাকাউন্ট তৈরি করুন',
+'createacct-join' => 'আপনার সম্পর্কিত তথ্য নিচে যোগ করুন।',
+'createacct-another-join' => 'নিচে আপনার নতুন অ্যাকাউন্টের তথ্য দিন।',
+'createacct-emailrequired' => 'ইমেইল ঠিকানা',
+'createacct-emailoptional' => 'ইমেইল ঠিকানা (ঐচ্ছিক)',
+'createacct-email-ph' => 'আপনার ইমেইল ঠিকানা যোগ করুন',
+'createacct-another-email-ph' => 'আপনার ইমেইল ঠিকানা প্রবেশ করান',
 'createaccountmail' => 'একটি র‌্যান্ডম পাসওয়ার্ড নির্বাচন করুন এবং নির্ধারিত ইমেইল ঠিকানায় পাঠিয়ে দিন',
+'createacct-realname' => 'আসল নাম (ঐচ্ছিক)',
 'createaccountreason' => 'কারণ:',
+'createacct-reason' => 'কারণ',
+'createacct-reason-ph' => 'কেন আপনি আরেকটি অ্যাকাউন্ট তৈরি করছেন',
+'createacct-captcha' => 'নিরাপত্তা পরীক্ষা',
+'createacct-imgcaptcha-ph' => 'উপরে যে লেখা দেখতে পাচ্ছেন তা লিখুন',
+'createacct-submit' => 'আপনার অ্যাকাউন্ট তৈরি করুন',
+'createacct-another-submit' => 'আরেকটি অ্যাকাউন্ট তৈরি করুন',
+'createacct-benefit-heading' => '{{SITENAME}} আপনার মত লোকেরই তৈরি।',
+'createacct-benefit-body1' => '{{PLURAL:$1|টি সম্পাদনা}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|টি পাতা}}',
+'createacct-benefit-body3' => 'জন সাম্প্রতিক {{PLURAL:$1|অবদানকারী}}',
 'badretype' => "আপনার প্রবেশ করানো শব্দচাবি'টি মিলছেনা।",
 'userexists' => 'এই ব্যবহারকারী নামটি ইতমধ্যে ব্যবহার করা হয়েছে।
 অনুগ্রহ করে অন্য নাম বেছে নিন।',
 'loginerror' => 'প্রবেশ করতে সমস্যা হয়েছে',
+'createacct-error' => 'অ্যাকাউন্ট তৈরি ত্রুটি',
 'createaccounterror' => 'অ্যাকাউন্ট তৈরি হয়নি: $1',
 'nocookiesnew' => 'ব্যবহারকারীর অ্যাকাউন্টটি সৃষ্টি করা হয়েছে, কিন্তু আপনি এখনও অ্যাকাউন্টে প্রবেশ করেননি। {{SITENAME}}-তে কুকি ব্যবহার করে ব্যবহারকারীদের অ্যাকাউন্টে প্রবেশ করানো হয়। আপনার ব্রাউজারে কুকিগুলি নিষ্ক্রিয় করা আছে। অনুগ্রহ করে কুকিগুলি সক্রিয় করুন এবং আপনার নতুন ব্যবহারকারী নাম ও শব্দচাবি ব্যবহার করে অ্যাকাউন্টে প্রবেশ করুন।',
 'nocookieslogin' => '{{SITENAME}} এ কুকি (cookies) এর মাধ্যমে ব্যবহারকারীদের লগ-ইন সম্পন্ন করা হয়। আপনার ব্রাঊজারে কুকি বন্ধ করে দেওয়া আছে। কুকি চালু করে আবার চেষ্টা করুন।',
@@ -561,11 +606,13 @@ $2',
 
 যদি ভুল করে অ্যাকাউন্টটি সৃষ্টি হয়ে থাকে, তাহলে এই বার্তাটি উপেক্ষা করুন।',
 'usernamehasherror' => 'ব্যবকারকারী নামে হ্যাশ বর্ণ থাকতে পারবে না',
-'login-throttled' => 'আপনি সাম্প্রতিক পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন।
-পুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে কিছুক্ষণ অপেক্ষা করুন।',
+'login-throttled' => 'আপনি সাম্প্রতিক সময়ে পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন।
+পুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে $1 অপেক্ষা করুন।',
 'login-abort-generic' => 'আপনার লগইন সফল ছিলো না - বাতিল করা হয়েছে',
 'loginlanguagelabel' => 'ভাষা: $1',
 'suspicious-userlogout' => 'আপনার প্রস্থানের অনুরোধ বাতিল হয়েছে কারণ অনুমিত যে আপনার ব্রাউজার অসম্পূর্ণ অথবা পূবর্বতী তথ্য প্রেরণ করেছে।',
+'createacct-another-realname-tip' => 'আসল নাম ঐচ্ছিক।
+আপনি যদি তা দিতে চান, তাহলে তা ব্যবহারকারীকে তাদের কাজের জন্য স্বীকৃতিদানে ব্যবহার করা হবে।',
 
 # Email sending
 'php-mail-error-unknown' => 'পিএইচপি এর মেইল () কার্যে অজ্ঞাত ভুল',
@@ -581,8 +628,7 @@ $2',
 'newpassword' => 'নতুন শব্দচাবি:',
 'retypenew' => 'নতুন শব্দচাবি আবার লিখুন:',
 'resetpass_submit' => 'শব্দচাবি দাও এবং লগ-ইন করো',
-'resetpass_success' => 'আপনার পার্সওয়ার্ড সফলভাবে পরিবর্তন করা হয়েছে!
-আপনি এখন লগইন করতে পারেন...',
+'changepassword-success' => 'আপনার শব্দচাবি সাফলভাবে পরিবর্তীত হয়েছে।',
 'resetpass_forbidden' => 'শব্দচাবি পরিবর্তন করা সম্ভব নয়',
 'resetpass-no-info' => 'এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই লগইন করতে হবে।',
 'resetpass-submit-loggedin' => 'শব্দচাবি পরিবর্তন',
@@ -594,10 +640,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'শব্দচাবি রিসেট',
-'passwordreset-text' => 'আপনার শব্দচাবি বদলের জন্য নিচের ফর্মটি পূরণ করুন।',
+'passwordreset-text-one' => 'আপনার পাসওয়ার্ড পুনরায় সেট করতে এই ফর্মটি পূরণ করুন।',
+'passwordreset-text-many' => '{{PLURAL:$1|আপনার পাসওয়ার্ড রিসেট করতে এই তথ্যগুলোর যেকোন একটা প্রবেশ করান।}}',
 'passwordreset-legend' => 'শব্দচাবি রিসেট',
 'passwordreset-disabled' => 'এই উইকিতে শব্দচাবি রিসেটের সুবিধা নিষ্ক্রিয় রয়েছে।',
-'passwordreset-pretext' => '{{PLURAL:$1||নিচে উল্লেখিত ডেটাগুলোর কোনো একটি প্রবেশ করান}}',
+'passwordreset-emaildisabled' => 'এই উইকিতে ইমেইল অপশনটি বন্ধ করা হয়েছে।',
 'passwordreset-username' => 'ব্যবহারকারী নাম:',
 'passwordreset-domain' => 'ডোমেইন:',
 'passwordreset-capture' => 'অনুসন্ধানের ফলাফলের ইমেইল দেখুন?',
@@ -627,7 +674,7 @@ $2
 অস্থায়ী শব্দচাবি: $2',
 'passwordreset-emailsent' => 'শব্দচাবি বদলের একটি ই-মেইল পাঠানো হয়েছে।',
 'passwordreset-emailsent-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।',
-'passwordreset-emailerror-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 ব্যবহারকারীকে এটি পাঠানো যায়নি',
+'passwordreset-emailerror-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!',
 
 # Special:ChangeEmail
 'changeemail' => 'ই-মেইল ঠিকানা পরিবর্তন',
@@ -641,6 +688,17 @@ $2
 'changeemail-submit' => 'ই-মেইল পরিবর্তন',
 'changeemail-cancel' => 'বাতিল',
 
+# Special:ResetTokens
+'resettokens' => 'রিসেট টোকেন',
+'resettokens-text' => 'আপনি টোকেন রিসেট করতে পারেন, যা অ্যাকাউন্টের সাথে সম্পর্কিত আপনার ব্যক্তিগত তথ্য দেখার কাজে ব্যবহার করা হয়।',
+'resettokens-no-tokens' => 'রিসেট করার মত কোনো টোকেন নেই।',
+'resettokens-legend' => 'রিসেট টোকেন',
+'resettokens-tokens' => 'টোকেন:',
+'resettokens-token-label' => '$1 (বর্তমান: $2)',
+'resettokens-watchlist-token' => 'ওয়েব ফিড (Atom/RSS) টোকেন পরিবর্তনের জন্য [[Special:Watchlist|নজরতালিকায় থাকা পাতাগুলোতে পরিবর্তন এসেছে]]',
+'resettokens-done' => 'টোকেন রিসেট।',
+'resettokens-resetbutton' => 'নির্বাচিত টোকেন রিসেট',
+
 # Edit page toolbar
 'bold_sample' => 'গাঢ় লেখা',
 'bold_tip' => 'গাঢ় লেখা',
@@ -831,12 +889,15 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 সম্ভবতঃ পাতাটি মুছে ফেলা হয়েছে।',
 'edit-conflict' => 'সম্পাদনা সংঘাত।',
 'edit-no-change' => 'আপনার সম্পাদনাটি উপেক্ষা করা হয়েছে, কারণ লেখাতে কোনো পরিবর্তন করা হয়নি।',
+'postedit-confirmation' => 'আপনার সম্পাদনা সংরক্ষিত হয়েছে।',
 'edit-already-exists' => 'নতুন পাতা সৃষ্টি করা যায়নি।
 পাতাটি ইতিমধ্যেই বিদ্যমান।',
 'defaultmessagetext' => 'আদি টেক্সট',
 'content-failed-to-parse' => '$1 মডেলের জন্য $2 কন্টেন্ট পার্স করা যাচ্ছে না: $3',
 'invalid-content-data' => 'ভুল কন্টেন্ট ডাটা',
 'content-not-allowed-here' => '"$1" কন্টেন্টটি [[$2]] পাতায় অনুমোদিত নয়',
+'editwarning-warning' => 'এই পাতাটি ত্যাগ করলে আপনার আপনার করা পরিবর্তনগুলো হারিয়ে যেতে পারে।
+আপনি যদি লগইন করা থাকেন, আপনি এই সতর্কীকরণ বার্তাটি আপনার পছন্দের "সম্পাদনা" অনুচ্ছেদ থেকে নিস্ক্রিয় করতে পারেন।',
 
 # Content models
 'content-model-wikitext' => 'উইকিটেক্সট',
@@ -871,6 +932,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'undo-failure' => 'এ সম্পাদনা মধ্যবর্তী সম্পাদনাসমূহের কারণে পূর্বাবস্থায় ফিরিয়ে নেওয়া যাবে না।',
 'undo-norev' => 'সম্পাদনাটি বাতিল করা যাচ্ছেনা কারণ এটি আর নেই বা মুছে ফেলা হয়েছে।',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]])-এর সম্পাদিত $1 নম্বর সংশোধনটি বাতিল করা হয়েছে',
+'undo-summary-username-hidden' => 'একজন লুকানো ব্যবহারকারী $1 রিভিশন পুনরায় ফিরিয়ে এনেছেন',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'অ্যাকাউন্ট তৈরি করা যাবে না',
@@ -1051,6 +1113,7 @@ $1",
 'compareselectedversions' => 'নির্বাচিত সংস্করণগুলো তুলনা করো',
 'showhideselectedversions' => 'নির্বাচিত সংশোধনগুলো দেখাও/লুকাও',
 'editundo' => 'পূর্বাবস্থায় আনো',
+'diff-empty' => '(কোন পার্থক্য নেই)',
 'diff-multi' => '({{PLURAL:$2|একজন ব্যবহারকারী |$2 জন ব্যবহারকারী}} সম্পাদিত {{PLURAL:$1|একটি অন্তর্বর্তীকালীন সংশোধন|$1টি অন্তর্বর্তীকালীন সংশোধন}} দেখানো হয়নি।)',
 'diff-multi-manyusers' => '($2 জন {{PLURAL:$2|ব্যবহারাকারীর}} সম্পাদিত {{PLURAL:$1|একটি সাম্প্রতিক সংস্করণ|$1 টি সাম্প্রতিক সংস্করণ}} প্রদর্শিত হচ্ছে না)',
 'difference-missing-revision' => '$1 পার্থক্যের {{PLURAL:$2|একটি সংস্করণ|$2টি সংস্করণসমূহ}} খুজে পাওয়া যাচ্ছে না।
@@ -1078,7 +1141,6 @@ $1",
 'searchmenu-legend' => 'অনুসন্ধান অপশন',
 'searchmenu-exists' => "'''এই উইকিতে \"[[:\$1]]\" নামে একটি পাতা রয়েছে'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" পাতাটি এই উইকিতে তৈরি করুন!'''",
-'searchhelp-url' => 'Help:সহায়িকা',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|এই প্রিফিক্স রয়েছে এমন পাতা দেখুন]]',
 'searchprofile-articles' => 'বিষয়বস্তুর পাতা',
 'searchprofile-project' => 'সহায়িকা এবং প্রকল্প পাতা',
@@ -1120,15 +1182,7 @@ $1",
 'powersearch-togglenone' => 'কিছু নয়',
 'search-external' => 'বহিঃস্থ অনুসন্ধান',
 'searchdisabled' => '{{SITENAME}} অনুসন্ধান এখন নিষ্ক্রিয় আছে। আপনি গুগলের মাধ্যমে অনুসন্ধান চালাতে পারেন। লক্ষ্য করুন যে {{SITENAME}}-এর বিষয়বস্তুর উপর গুগলের ইন্ডেক্সগুলি হালনাগাদ না-ও করা থাকতে পারে।',
-
-# Quickbar
-'qbsettings' => 'কুইকবার',
-'qbsettings-none' => 'কিছুই না',
-'qbsettings-fixedleft' => 'স্থায়ী বাম',
-'qbsettings-fixedright' => 'স্থায়ী ডান',
-'qbsettings-floatingleft' => 'ভাসমান বাম',
-'qbsettings-floatingright' => 'ভাসমান ডান',
-'qbsettings-directionality' => 'ফিক্সড, আপনার ভাষার লেখা শুরুর দিকের উপর ভিত্তি করে',
+'search-error' => 'অনুসন্ধানের সময় একটি ত্রুটি হয়েছে: $1',
 
 # Preferences page
 'preferences' => 'আমার পছন্দ',
@@ -1162,7 +1216,6 @@ $1",
 'resetprefs' => 'অসংরক্ষিত পরিবর্তনগুলো পরিস্কার করো',
 'restoreprefs' => 'সকল পূর্বনির্ধারিত সেটিং ফিরিয়ে আনো (সকল সেকশনে)',
 'prefs-editing' => 'সম্পাদনা',
-'prefs-edit-boxsize' => 'সম্পাদনা উইন্ডোর আকার।',
 'rows' => 'সারি:',
 'columns' => 'কলাম:',
 'searchresultshead' => 'অনুসন্ধান',
@@ -1173,7 +1226,7 @@ $1",
 'recentchangesdays-max' => 'সর্বোচ্চ $1 {{PLURAL:$1|দিন|দিন}}',
 'recentchangescount' => 'সাম্প্রতিক পরিবর্তনে প্রদর্শিত সম্পাদনার সংখ্যা:',
 'prefs-help-recentchangescount' => 'এতে সাম্প্রতিক পরিবর্তনসমূহ, পাতার ইতিহাস এবং লগ অন্তর্ভুক্ত।',
-'prefs-help-watchlist-token' => 'এই ঘরটি একটি গোপন শব্দ চাবি দ্বারা পূরণ করলে আপনার নজর তালিকার জন্য একটি আরএসএস ফিড তৈরী হবে। যারা এই ঘরের চাবি জানবে তারা আপনার নজর তালিকা দেখতে পারবে, তাই একটি গোপন মান ব্যবহার করুন। এখানে এলোমেলোভাবে তৈরী একটি মান দেখানো হয়েছে যা আপনি ব্যবহার করতে পারেন: $1',
+'prefs-help-watchlist-token2' => 'এটি আপনার নজরতালিকার ওয়েব ফিডের গোপন চাবি। যে কেউ যিনি এটা জানেন তিনি আপনার নজরতালিকা পড়তে সক্ষম হবেন, তাই এটি প্রকাশ করবেন না। [[Special:ResetTokens|আপনার এটি পুনরায় সেট করার প্রয়োজন হলে এখানে ক্লিক করুন]]।',
 'savedprefs' => 'আপনার পছন্দগুলো সংরক্ষণ করা হয়েছে।',
 'timezonelegend' => 'সময়স্থান:',
 'localtime' => 'স্থানীয় সময়:',
@@ -1204,7 +1257,6 @@ $1",
 'prefs-reset-intro' => 'আপনি এই পাতা ব্যবহার করে আপনার পছন্দসমূহকে সাইটের পূর্বপ্রদত্ত সেটিংসে পরিবর্তন করতে পারেন।
 পরিবর্তন করার পর এটা  আর ফিরিয়ে আনা যাবে না।',
 'prefs-emailconfirm-label' => 'ই-মেইল নিশ্চিতকরণ:',
-'prefs-textboxsize' => 'সম্পাদনা উইন্ডোর আকার',
 'youremail' => 'ইমেইল *',
 'username' => '{{GENDER:$1|ব্যবহারকারী নাম}}:',
 'uid' => '{{GENDER:$1|ব্যবহারকারী}} নং (ID):',
@@ -1237,6 +1289,8 @@ $1",
 'prefs-dateformat' => 'তারিখ বিন্যাস',
 'prefs-timeoffset' => 'সময় অফসেট',
 'prefs-advancedediting' => 'সাধারণ অপশন',
+'prefs-editor' => 'সম্পাদক',
+'prefs-preview' => 'প্রাকদর্শন',
 'prefs-advancedrc' => 'উচ্চতর অপশন',
 'prefs-advancedrendering' => 'উচ্চতর অপশন',
 'prefs-advancedsearchoptions' => 'উচ্চতর অপশন',
@@ -1244,7 +1298,9 @@ $1",
 'prefs-displayrc' => 'প্রদর্শনী অপশন',
 'prefs-displaysearchoptions' => 'প্রদর্শনী অপশন',
 'prefs-displaywatchlist' => 'প্রদর্শনী অপশন',
+'prefs-tokenwatchlist' => 'টোকেন',
 'prefs-diffs' => 'পার্থক্য',
+'prefs-help-prefershttps' => 'পরবর্তী লগইনের পর থেকে এই পরিবর্তনগুলো কার্যকর হবে।',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'ইমেইল ঠিকানাটি সঠিক',
@@ -1271,6 +1327,8 @@ $1",
 'userrights-notallowed' => 'আপনার, ব্যবহারকারী অধিকার যুক্ত বা অপসারণ করার অনুমতি নেই।',
 'userrights-changeable-col' => 'দল যা আপনি পরিবর্তন করতে পারেন',
 'userrights-unchangeable-col' => 'দল যা আপনি পরিবর্তন করতে পারবেন না',
+'userrights-conflict' => 'ব্যবহারকারী অধিকার দ্বন্দ্ব! অনুগ্রহ করে নিশ্চিত হোন এবং পুনরায় চেষ্টা করুন।',
+'userrights-removed-self' => 'আপনি সফলভাবে আপনার নিজের অধিকার পরিবর্তন করেছেন। এর ফলে এখন থেকে আপনি আর এই পাতায় প্রবেশ করতে পারবেন না।',
 
 # Groups
 'group' => 'দল:',
@@ -1337,10 +1395,18 @@ $1",
 'right-unblockself' => 'একজনকে আনব্লক করুন',
 'right-protect' => 'পাতাটির সুরক্ষা সীমা পরিবর্তন করুন এবং সুরক্ষিত পাতটি সম্পাদনা করুন',
 'right-editprotected' => 'সুরক্ষিত পাতা সম্পাদনা (ক্যাসকাডিং সুরক্ষা ছাড়া)',
+'right-editsemiprotected' => 'পাতা সম্পাদনা সুরক্ষিত রয়েছে,  "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'ব্যবহারকারী ইন্টারফেস সম্পাদনা',
 'right-editusercssjs' => 'অন্য ব্যবহারকারীগণের CSS এবং JS ফাইল সম্পাদনা',
 'right-editusercss' => 'অন্য ব্যবহারকারীগণের CSS ফাইল সম্পাদনা',
 'right-edituserjs' => 'অন্য ব্যবহারকারীগণের JS ফাইল সম্পাদনা',
+'right-editmyusercss' => 'আপনার নিজস্ব ব্যবহারকারী সিএসএস ফাইল সম্পাদনা করুন',
+'right-editmyuserjs' => 'আপনার নিজস্ব ব্যবহারকারী জাভাস্ক্রিপ্ট ফাইল সম্পাদনা করুন',
+'right-viewmywatchlist' => 'আপনার নজরতালিকা দেখুন',
+'right-editmywatchlist' => 'আপনার নজরতালিকা সম্পাদনা করুন। মনে রাখবেন, এই পরিবর্তনের পরও বিভিন্ন পাতা তালিকায় যুক্ত হয়ে থেতে পারে।',
+'right-viewmyprivateinfo' => 'আপনার ব্যক্তিগত তথ্য দেখুন (যেমন ইমেইল ঠিকানা, আসল নাম)',
+'right-editmyprivateinfo' => 'আপনার ব্যক্তিগত তথ্য সম্পাদনা করুন (যেমন ইমেইল ঠিকানা, আসল নাম)',
+'right-editmyoptions' => 'আপনার পছন্দসমূহ পরিবর্তন করুন',
 'right-rollback' => 'একটি নির্দিষ্ট পাতার সর্বশেষ ব্যবহারকারীর সম্পদনা পূর্বাবস্থায় ফিরিয়ে আনুন',
 'right-markbotedits' => 'রোলড-ব্যাক সম্পাদনাসমূহকে বট সম্পাদনা হিসেবে চিহ্নিত করো',
 'right-noratelimit' => 'রেট লিমিটের ভিত্তিতে পরিবর্তন হবে না',
@@ -1402,12 +1468,19 @@ $1",
 'action-userrights-interwiki' => 'অন্যান্য উইকির ব্যবহারকারীদের অধিকারসমূহ সম্পাদনা করুন',
 'action-siteadmin' => 'ডাটাবেজ বন্ধ অথবা খুলুন',
 'action-sendemail' => 'ই-মেইল পাঠাও',
+'action-editmywatchlist' => 'আপনার নজরতালিকা পরিবর্তন করুন',
+'action-viewmywatchlist' => 'আপনার নজরতালিকা দেখুন',
+'action-viewmyprivateinfo' => 'আপনার ব্যক্তিগত তথ্য দেখুন',
+'action-editmyprivateinfo' => 'আপনার ব্যক্তিগত তথ্য সম্পাদনা করুন',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|পরিবর্তন|পরিবর্তনসমূহ}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|সর্বশেষ প্রদর্শনের পর}}',
+'enhancedrc-history' => 'ইতিহাস',
 'recentchanges' => 'সাম্প্রতিক পরিবর্তনসমূহ',
 'recentchanges-legend' => 'সাম্প্রতিক পরিবর্তনের পছন্দসমূহ',
 'recentchanges-summary' => 'এই পাতায় উইকিটির সবচেয়ে সাম্প্রতিক পরিবর্তনগুলি অনুসরণ করুন।',
+'recentchanges-noresult' => 'নির্ধারিত সময়ের মধ্যে কোনো পরিবর্তন পাওয়া যায়নি।',
 'recentchanges-feed-description' => 'এই ফিডে উইকিটির সবচেয়ে সাম্প্রতিক পরিবর্তনগুলি অনুসরণ করুন।',
 'recentchanges-label-newpage' => 'এই সম্পাদনায় একটি নতুন পাতা তৈরি হয়েছে',
 'recentchanges-label-minor' => 'এটি একটি অনুল্লেখিত সম্পাদনা',
@@ -1446,7 +1519,6 @@ $1",
 'recentchangeslinked-feed' => 'সম্পর্কিত পরিবর্তন',
 'recentchangeslinked-toolbox' => 'সম্পর্কিত পরিবর্তন',
 'recentchangeslinked-title' => '"$1"-এর সাথে সম্পর্কিত পরিবর্তনসমূহ',
-'recentchangeslinked-noresult' => 'সংযোগকৃত পাতাগুলিতে প্রদত্ত সময়সীমার জন্য কোন পরিবর্তন হয়নি।',
 'recentchangeslinked-summary' => "একটি নির্দিষ্ট পাতা (অথবা নির্দিষ্ট বিষয়শ্রেণীতে) থেকে সংযুক্ত এ পাতার সাম্প্রতিক পরিবর্তনের তালিকা দেওয়া হয়েছে। আপনার [[Special:Watchlist|আপনার নজরতালিকায়]] রাখা পাতাগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
 'recentchangeslinked-page' => 'পাতার নাম:',
 'recentchangeslinked-to' => 'প্রদত্ত পাতায় সংযুক্ত আছে এমন পাতাগুলোর পরিবর্তন দেখাও',
@@ -1457,7 +1529,7 @@ $1",
 'reuploaddesc' => 'আপলোড বাতিল করো এবং আপলোড ফর্মে ফেরত যাও।',
 'upload-tryagain' => 'পরিবর্তিত ফাইল বর্ণনা জমা দিন',
 'uploadnologin' => 'আপনি লগ-ইন করেননি।',
-'uploadnologintext' => 'আপলোড করতে হলে আপনাকে অবশ্যই আগে [[Special:UserLogin|লগ-ইন]] করতে হবে।',
+'uploadnologintext' => 'ফাইল আপলোড করতে হলে আপনাকে অবশ্যই $1 করতে হবে।',
 'upload_directory_missing' => 'আপলোড ডাইরেক্টরি ($1) পাওয়া যাচ্ছে না এবং ওয়েব সার্ভার কর্তৃক তৈরি করা যাচ্ছে না।',
 'upload_directory_read_only' => 'আপলোড ডিরেক্টরিটি ($1) ওয়েবসার্ভার কর্তৃক লিখনযোগ্য নয়।',
 'uploaderror' => 'আপলোড এ সমস্যা হয়েছে',
@@ -1672,7 +1744,6 @@ $1',
 'http-read-error' => 'HTTP পঠন ত্রুটি।',
 'http-timed-out' => 'HTTP অনুরোধের সময় পার হয়েছে।',
 'http-curl-error' => 'ইউআরএল নিয়ে আসার ক্ষেত্রে ত্রুটি: $1',
-'http-host-unreachable' => 'URL-এ পৌঁছানো যায়নি',
 'http-bad-status' => 'HTTP অনুরোধের সময় কোন সমস্যা হয়েছে: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1700,6 +1771,10 @@ $1',
 'listfiles_size' => 'আকার',
 'listfiles_description' => 'বিবরণ',
 'listfiles_count' => 'সংস্করণ',
+'listfiles-show-all' => 'ছবির পুরাতন সংস্করণ সংযোজন',
+'listfiles-latestversion' => 'বর্তমান সংস্করণ',
+'listfiles-latestversion-yes' => 'হ্যাঁ',
+'listfiles-latestversion-no' => 'না',
 
 # File description page
 'file-anchor-link' => 'ফাইল',
@@ -1795,6 +1870,13 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'randompage' => 'অজানা যেকোনো পাতা',
 'randompage-nopages' => 'যে {{PLURAL:$2|নামস্থানে|নামস্থানসমূহে}} কোন পাতা নেই: $1।',
 
+# Random page in category
+'randomincategory' => 'বিষয়শ্রেণীর অজানা যেকোনো পাতা',
+'randomincategory-invalidcategory' => '"$1" একটি ত্রুটিপূর্ণ বিষয়শ্রেণীর নাম।',
+'randomincategory-nopages' => '[[:Category:$1]]-এ কোন পাতা নেই।',
+'randomincategory-selectcategory' => 'এই বিষয়শ্রেণীর একটি অজানা যেকোনো পাতা: $1 $2।',
+'randomincategory-selectcategory-submit' => 'যাও',
+
 # Random redirect
 'randomredirect' => 'অনির্ধারিত পুনর্নির্দেশ',
 'randomredirect-nopages' => '"$1" এই নামস্থানে কোন পুনর্নির্দেশ নেই।',
@@ -1820,17 +1902,13 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'statistics-users-active-desc' => 'ব্যবহারকারী যারা বিগত {{PLURAL:$1|দিনে|$1 দিনে}} একটি কাজ করেছেন।',
 'statistics-mostpopular' => 'সবচেয়ে বেশী বার দেখা পাতাসমূহ',
 
-'disambiguations' => 'দ্ব্যর্থতা-দূরীকরণ পাতাসমূহে সংযোগকৃত পাতাসমূহ',
-'disambiguationspage' => 'Template:দ্ব্যর্থতা_নিরসন',
-'disambiguations-text' => "নিচের পাতাগুলিতে অন্তত একটি '''দ্ব্যর্থতা নিরসন পাতা'''-তে সংযোগ আছে।
-এর পরিবর্তে এগুলি থেকে একটি উপযুক্ত বিষয়ে সংযোগ থাকা আবশ্যক।<br />
-যদি কোন পাতায় এমন কোন টেমপ্লেট থাকে যেটিতে [[MediaWiki:Disambiguationspage]] থেকে সংযোগ আছে, তবে সেই পাতাটিকে একটি দ্ব্যর্থতা নিরসন পাতা হিসেবে গণ্য করা হয়।",
-
 'pageswithprop' => 'পাতার উপাদান সম্বলিত পৃষ্ঠাসমূহ',
 'pageswithprop-legend' => 'পাতার উপাদান সম্বলিত পৃষ্ঠাসমূহ',
 'pageswithprop-text' => 'একটি নির্দিষ্ট পাতার বৈশিষ্ট রয়েছে এমন পাতাসমূহের তালিকা।',
 'pageswithprop-prop' => 'বৈশিষ্টের নাম:',
 'pageswithprop-submit' => 'চলো',
+'pageswithprop-prophidden-long' => 'দীর্ঘ প্রোপার্টি টেক্সটগুলো লুকানো রয়েছে ($1)',
+'pageswithprop-prophidden-binary' => 'বাইনারি প্রোপার্টি টেক্সটগুলো লুকানো রয়েছে ($1)',
 
 'doubleredirects' => 'দুইবার করা পুনর্নির্দেশনাগুলি',
 'doubleredirectstext' => 'এই পাতায় এমন পাতাগুলোর তালিকা আছে, যেগুলো অন্য কোন পুনর্নির্দেশনা পাতায় পুনর্নির্দেশিত হয়েছে। প্রতিটি সারিতে প্রথম ও দ্বিতীয় পুনর্নির্দেশনার জন্য সংযোগ আছে এবং দ্বিতীয় পুনর্নির্দেশনাটির লক্ষ্য সংযোগটিও দেওয়া আছে। এই লক্ষ্য সংযোগটিই সাধারণত "আসল" লক্ষ্য পাতা, যেটিতে প্রথম পুনর্নির্দেশনাটি থেকে সংযোগ থাকা উচিত।
@@ -1888,6 +1966,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'mostrevisions' => 'সবচেয়ে বেশী বার সম্পাদিত নিবন্ধসমূহ',
 'prefixindex' => 'উপসর্গ সহ সমস্ত পাতা',
 'prefixindex-namespace' => 'প্রিফিক্স সম্পবলিত সকল পাতা ($1 নামস্থান)',
+'prefixindex-strip' => 'তালিকা থেকে প্রিফিক্স সরাও',
 'shortpages' => 'সংক্ষিপ্ত পাতাসমূহ',
 'longpages' => 'দীর্ঘ পাতাসমূহ',
 'deadendpages' => 'যেসব পাতা থেকে কোনো সংযোগ নেই',
@@ -1903,6 +1982,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'listusers' => 'ব্যবহারকারীর তালিকা',
 'listusers-editsonly' => 'শুধুমাত্র এমন ব্যবহারকারীদের দেখাও যাদের অবদান আছে',
 'listusers-creationsort' => 'তৈরির তারিখ অনুসারে সাজাও',
+'listusers-desc' => 'বড় থেকে ছোট ক্রম অনুযায়ী সাজাও',
 'usereditcount' => '$1 {{PLURAL:$1|সম্পাদনা|সম্পাদনা}}',
 'usercreated' => '{{GENDER:$3|তৈরি হয়েছে}} $1 তারিখ, সময়: $2',
 'newpages' => 'নতুন পাতাসমূহ',
@@ -2080,10 +2160,9 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'unwatchthispage' => 'নজর সরিয়ে নিন',
 'notanarticle' => 'বিষয়বস্তু পাতা নয়',
 'notvisiblerev' => 'অপর একজন ব্যবহারকারী কর্তৃক প্রণীত সর্বশেষ সংস্করণটি অপসারিত হয়েছে',
-'watchnochange' => 'প্রদর্শিত সময়সীমার মধ্যে আপনার নজরতালিকায় রাখা কোন পাতায় কোন রকম সম্পাদনা ঘটেনি।',
 'watchlist-details' => 'নজরতালিকাতে {{PLURAL:$1|$1টি পাতা|$1টি পাতা}} আছে (আলাপ পাতাগুলি গণনায় না ধরে)।',
-'wlheader-enotif' => '* ই-মেইল এর মাধমে নির্দেশনার ব্যবস্থা চালু করা আছে।',
-'wlheader-showupdated' => "* আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে",
+'wlheader-enotif' => 'ইমেল বিজ্ঞপ্তি সক্রিয় করা আছে।',
+'wlheader-showupdated' => "আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
 'watchmethod-recent' => 'নজরে রাখা পাতাগুলিতে সাম্প্রতিক পরিবর্তন পরীক্ষা করা হচ্ছে',
 'watchmethod-list' => 'নজরে রাখা পাতাগুলিতে সাম্প্রতিক পরিবর্তন পরীক্ষা করা হচ্ছে',
 'watchlistcontains' => 'আপনার নজরতালিকায় $1 টি {{PLURAL:$1|পাতা|পাতা}} রয়েছে।',
@@ -2329,7 +2408,7 @@ $1',
 'contributions' => '{{GENDER:$1|ব্যবহারকারীর}} অবদান',
 'contributions-title' => '$1 ব্যবহারকারীর অবদানসমূহ',
 'mycontris' => 'অবদান',
-'contribsub2' => '$1 ($2)-এর জন্য',
+'contribsub2' => '{{GENDER:$3|$1}} ($2)-এর জন্য',
 'nocontribs' => 'এই শর্তগুলির সাথে মিলে যায়, এমন কোন পরিবর্তন খুঁজে পাওয়া যায়নি।',
 'uctop' => '(বর্তমান)',
 'month' => 'এই মাস (বা তার আগে) থেকে:',
@@ -2486,13 +2565,11 @@ $1',
 'ipb_blocked_as_range' => 'ত্রুটি: $1 আইপি ঠিকানাটিকে সরাসরি বাধা দেওয়া হয়নি এবং বাধা তুলে নেওয়া যাবে না। তবে ঠিকানাটি $2 সীমার অন্তর্ভুক্ত এবং সেটি থেকে বাধা তুলে নেওয়া সম্ভব।',
 'ip_range_invalid' => 'অবৈধ আইপি শ্রেণী',
 'ip_range_toolarge' => '/$1 এর বড় রেঞ্জব্লক ব্যবহার অনুমদিত নয়।',
-'blockme' => 'আমাকে বাধা দেওয়া হোক',
 'proxyblocker' => 'প্রক্সি বাধাদানকারী',
-'proxyblocker-disabled' => 'এই ফাংশনটি নিষ্ক্রিয়।',
 'proxyblockreason' => 'আপনার আইপি ঠিকানাকে বাধা দেয়া হয়েছে কারণ এটি একটি উন্মুক্ত প্রক্সি। অনুগ্রহ করে আপনার ইন্টারনেট সেবা প্রদানকারী কোম্পানির সাথে কারিগরি সহায়তার ব্যাপারে যোগাযোগ করুন এবং এই গুরুত্বপূর্ণ নিরাপত্তা সমস্যার ব্যাপারে তাদেরকে অবহিত করুন।',
-'proxyblocksuccess' => 'নিষ্পন্ন হয়েছে।',
 'sorbsreason' => 'আপনার আইপি ঠিকানাটি {{SITENAME}}-এর ব্যবহার করা DNSBL-এ উন্মুক্ত প্রক্সি হিসেবে তালিকাভুক্ত আছে।',
 'sorbs_create_account_reason' => 'আপনার আইপি ঠিকানাটি {{SITENAME}}-এর ব্যবহার করা DNSBL-এ উন্মুক্ত প্রক্সি হিসেবে তালিকাভুক্ত আছে। আপনি কোন অ্যাকাউন্ট সৃষ্টি করতে পারবেন না।',
+'xffblockreason' => 'X-Forwarded-For হেডারে থাকা আইপি ঠিকানাটি ব্লক করা হয়েছে, হয় এটি আপনার নিজের অথবা আপনার ব্যবহৃত প্রক্সি সার্ভারের আইপি ঠিকানা। ব্লক করার কারণ হল: $1',
 'cant-block-while-blocked' => 'আপনি নিজে ব্লক থাকা অবস্থায় অন্যন্য ব্যবহারকারীকে ব্লক করতে পারবেন না।',
 'cant-see-hidden-user' => 'আপনি যে ব্যবহারকারীকে ব্লক বা লুকিয়ে রাখতে চাচ্ছেন তাকে আগে থেকেই ব্লক বা লুকিয়ে রাখা হয়েছে। এছাড়া আপনার Hideuser অধিকার নেই, তাই আপনি ব্যবহারকারীর অবস্থা পরিবর্তন করতে পারবেন না।',
 'ipbblocked' => 'আপনি অন্য কোন ব্যবহারকরীকে ব্লক বা আনব্লক করতে পারবেন না, কারণ আপনি নিজেই ব্লক রয়েছেন',
@@ -2652,6 +2729,8 @@ $1',
 'thumbnail-more' => 'বড় করো',
 'filemissing' => 'ফাইল হারিয়ে গেছে',
 'thumbnail_error' => 'থাম্বনেইল সৃষ্টি করতে গিয়ে ত্রুটি: $1',
+'thumbnail_error_remote' => '$1 থেকে ত্রুটির বার্তা:
+$2',
 'djvu_page_error' => 'DjVu পাতা সীমার বাইরে',
 'djvu_no_xml' => 'DjVu ফাইলের জন্য XML আনতে পারা যায়নি।',
 'thumbnail-temp-create' => 'অস্থায়ী থাম্বনেইল ফাইল তৈরী করা সম্ভব নয়',
@@ -2799,12 +2878,6 @@ $1',
 'tooltip-preferences-save' => 'পছন্দ সংরক্ষণ',
 'tooltip-summary' => 'একটি সংক্ষিপ্ত সারাংশ দিন',
 
-# Stylesheets
-'nostalgia.css' => '/* সিএসএস এখানে স্থাপন করা নস্টালজিয়া স্কিন ব্যবহারকারীদের প্রভাবিত করবে */',
-
-# Scripts
-'nostalgia.js' => '/* এখানে যেকোন কোন জাভাস্ক্রিপ্ট নস্টালজিয়া স্কিন ব্যবহার করা ব্যবহারকারীদের জন্য লোড করা হবে*/',
-
 # Metadata
 'notacceptable' => 'আপনার ক্লায়েন্ট পড়তে পারে এমন ফরম্যাটে উইকি সার্ভার উপাত্ত সরবরাহ করতে পারছে না।',
 
@@ -2876,8 +2949,6 @@ $1',
 'pageinfo-category-files' => 'ফাইলের সংখ্যা',
 
 # Skin names
-'skinname-standard' => 'ক্লাসিক',
-'skinname-nostalgia' => 'নস্টালজিয়া',
 'skinname-cologneblue' => 'কলোন ব্লু',
 'skinname-monobook' => 'মনোবুক',
 'skinname-modern' => 'মডার্ন',
@@ -2958,11 +3029,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 মিনিট|$1 মিনিট}}',
 'hours' => '{{PLURAL:$1|$1 ঘণ্টা|$1 ঘণ্টা}}',
 'days' => '{{PLURAL:$1|$1 দিন|$1 দিন}}',
+'weeks' => '{{PLURAL:$1|$1 সপ্তাহ}}',
 'months' => '{{PLURAL:$1|$1 মাস}}',
 'years' => '{{PLURAL:$1|$1 বছর}}',
 'ago' => '$1 আগে',
 'just-now' => 'এখনই',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ঘন্টা}} পূর্বে',
+'minutes-ago' => '$1 {{PLURAL:$1|মিনিট}} পূর্বে',
+'seconds-ago' => '$1 {{PLURAL:$1|সেকেন্ড}} পূর্বে',
+'monday-at' => 'সোমবার, $1',
+'tuesday-at' => 'মঙ্গলবার, $1',
+'wednesday-at' => 'বুধবার, $1',
+'thursday-at' => 'বৃহস্পতিবার, $1',
+'friday-at' => 'শুক্রবার, $1',
+'saturday-at' => 'শনিবার, $1',
+'sunday-at' => 'রবিবার, $1',
+'yesterday-at' => 'গতকাল, $1',
+
 # Bad image list
 'bad_image_list' => 'ফরম্যাটটি এরকম:
 
@@ -2989,7 +3074,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'চওড়া',
 'exif-imagelength' => 'লম্বা',
 'exif-bitspersample' => 'উপাদানপ্রতি বিট',
@@ -3168,7 +3253,7 @@ $1',
 'exif-originalimageheight' => 'ক্রপ করার পূর্বে চিত্রটির উচ্চতা',
 'exif-originalimagewidth' => 'ক্রপ করার পূর্বে চিত্রটির প্রস্থ',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'অসংকুচিত',
 'exif-compression-2' => 'সিসিআইটিটি গ্রুপ ৩ ১-ডাইমেনশনাম মডিফাইড হাফম্যান রান লেংক্থ এনকোডিং',
 'exif-compression-3' => 'সিসিআইটিটি গ্রুপ ৩ ফ্যাক্স এনকোডিং',
@@ -3598,7 +3683,6 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'version-other' => 'অন্য',
 'version-mediahandlers' => 'মিডিয়া ব্যবস্থাপক',
 'version-hooks' => 'হুক',
-'version-extension-functions' => 'এক্সটেনশনের কাজ',
 'version-parser-extensiontags' => 'পার্সার এক্সটেনশন ট্যাগ',
 'version-parser-function-hooks' => 'পার্সার ফাংশন হুক',
 'version-hook-name' => 'হুকের নাম',
@@ -3607,6 +3691,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'version-license' => 'লাইসেন্স',
 'version-poweredby-credits' => "এইক উইকিটি পরিচালিত হচ্ছে '''[//www.mediawiki.org/ মিডিয়াউইকি]'''-এর মাধ্যমে, কপিরাইট © ২০০১-$1 $2।",
 'version-poweredby-others' => 'অন্যান্য',
+'version-poweredby-translators' => 'translatewiki.net অনুবাদকগণ',
 'version-credits-summary' => '[[Special:Version|মিডিয়াউইকি]] সফটওয়্যারে অবদানের জন্য আমরা এই ব্যক্তিকে স্বীকৃতি দিতে চাই।',
 'version-license-info' => 'মিডিয়াউইকি এ++++কটি ফ্রি সফটওয়্যার, আপনি এটি বিতরণ করতে পারবেন এবং/অথবা সম্পদানা করতে পারবেন, এক্ষেত্রে ফ্রি সফটওয়্যার ফাউন্ডেশনের প্রকাশিত গনু জেনারেল পাবলিক লাইসেন্সের ২য় অথবা সাম্প্রতিকতম কোনো সংস্করণ মেনে চলতে হবে। 
 
@@ -3620,12 +3705,17 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'version-entrypoints-header-entrypoint' => 'শুরু',
 'version-entrypoints-header-url' => 'ইউআরএল',
 
-# Special:FilePath
-'filepath' => 'ফাইলের পাথ',
-'filepath-page' => 'ফাইল:',
-'filepath-submit' => 'চলো',
-'filepath-summary' => 'এই বিশেষ পাতায় ফাইলের পূর্ণাঙ্গ পাথ দেখা যাবে।
-চিত্রগুলো পূর্ণ রেজ্যুলেশনে প্রদর্শিত হবে, অন্যান্য ধরনের ফাইলগুলো তার নির্ধারিত প্রোগ্রামের মাধ্যমে ওপেন হবে।',
+# Special:Redirect
+'redirect' => 'ফাইল, ব্যবহারকরী, অথবা রিভিশন আইডি দ্বারা পুনঃনির্দেশ করা হয়েছে',
+'redirect-legend' => 'একটি ফাইল অথবা পাতায় পুনঃনির্দেশ করা হয়েছে',
+'redirect-summary' => 'এই বিশেষ পাতাটি পুনঃনির্দেশিত হয়েছে একটি ফাইলে (ফাইলের নাম), একটি পাতা (রিভিশন আইডি), অথবা একটি ব্যবহারকরী পাতায় (সংখ্যায় লেখা ব্যবহারকারী আইডি)।',
+'redirect-submit' => 'যাও',
+'redirect-lookup' => 'দেখুন:',
+'redirect-value' => 'মান:',
+'redirect-user' => 'ব্যবহারকারী আইডি',
+'redirect-revision' => 'পাতা সংস্করণ',
+'redirect-file' => 'ফাইলের নাম',
+'redirect-not-exists' => 'মান পাওয়া যায়নি',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ডুপ্লিকেট ফাইলের জন্য অনুসন্ধান',
@@ -3674,12 +3764,16 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'tags' => 'সঠিক চেঞ্জ ট্যাগ',
 'tag-filter' => '[[Special:Tags|ট্যাগ]] ছাকনী:',
 'tag-filter-submit' => 'ছাকনী',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|ট্যাগ}}]]: $2)',
 'tags-title' => 'ট্যাগসমূহ',
 'tags-intro' => 'এই পাতায় সফটওয়্যারটি একটি সম্পাদনা চিহ্নিত করার জন্য যে সকল ট্যাগ ব্যবহার করে তার তালিকা ও বর্ণনা রয়েছে।',
 'tags-tag' => 'ট্যাগ নাম',
 'tags-display-header' => 'পরিনর্তন পাতার বৈশিষ্ট',
 'tags-description-header' => 'অর্থের পূর্ণ বণনা',
+'tags-active-header' => 'সক্রিয়?',
 'tags-hitcount-header' => 'ট্যাগকৃত পরিবর্সতনমূহ',
+'tags-active-yes' => 'হ্যাঁ',
+'tags-active-no' => 'না',
 'tags-edit' => 'সম্পাদনা',
 'tags-hitcount' => '$1 {{PLURAL:$1|পরিবর্তন|পরিবর্তনসমূহ}}',
 
@@ -3700,6 +3794,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'dberr-problems' => ' দুঃখিত! এই সাইটটি বর্তমানে কারীগরী অসুবিধার মুখোমুখি হয়েছে।',
 'dberr-again' => 'কয়েক মিনিট পর পুনরায় পরিদর্শনের চেষ্টা করুন।',
 'dberr-info' => '(ডেটাবেজ সার্ভার $1-এর সাথে যোগাযোগ করা সম্ভব হয়নি)',
+'dberr-info-hidden' => '(ডাটাবেজ সার্ভারের সাথে সংযোগ দেয়া সম্ভব হচ্ছে না)',
 'dberr-usegoogle' => 'এই পরিস্থিতিতে আপনি গুগলের মাধ্যমে অনুসন্ধান করার চেষ্টা করতে পারেন।',
 'dberr-outofdate' => 'খেয়াল করুন যে, আমাদের বিষয়বস্তু সম্পর্কিত তাদের সূচি মেয়াদ উত্তীর্ণ হতে পারে।',
 'dberr-cachederror' => 'এটি অনুরোধকৃত পাতার ক্যাশে লিপি, যা হালনাগাতকৃত নাও হতে পারে।',
@@ -3715,6 +3810,9 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'htmlform-submit' => 'জমা দাও',
 'htmlform-reset' => 'পরিবর্তন বাতিল',
 'htmlform-selectorother-other' => 'অন্য',
+'htmlform-no' => 'না',
+'htmlform-yes' => 'হ্যাঁ',
+'htmlform-chosen-placeholder' => 'অপশন নির্বাচন করুন',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 সহ পূর্ণ টেক্সট সার্চ সমর্থন',
@@ -3832,4 +3930,19 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 # Image rotation
 'rotate-comment' => 'ছবিটি ঘড়ির কাটার দিকে  $1 {{PLURAL:$1|ডিগ্রি}} ঘুরানো হয়েছে',
 
+# Limit report
+'limitreport-title' => 'পার্সার প্রোফাইলিং তথ্য:',
+'limitreport-cputime' => 'সিপিইউ সময় ব্যবহার',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|সেকেন্ড}}',
+'limitreport-walltime' => 'প্রকৃত সময় ব্যবহার',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|সেকেন্ড}}',
+'limitreport-ppvisitednodes' => 'প্রাক প্রসেসর পরিদর্শন সংযোগ গণনা',
+'limitreport-ppgeneratednodes' => 'প্রাক প্রসেসর উৎপন্ন সংযোগ গণনা',
+'limitreport-postexpandincludesize' => 'পরবর্তী-প্রসারিত অন্তর্ভুক্ত আকার',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|বাইট}}',
+'limitreport-templateargumentsize' => 'টেমপ্লেট প্যারামিটারের আকার',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|বাইট}}',
+'limitreport-expansiondepth' => 'সর্বোচ্চ গভীরতা বিস্তার',
+'limitreport-expensivefunctioncount' => 'ব্যয়বহুল পার্সার ফাংশন গণনা',
+
 );
diff --git a/languages/messages/MessagesBo.php b/languages/messages/MessagesBo.php
index 926ac408..8beff878 100644
--- a/languages/messages/MessagesBo.php
+++ b/languages/messages/MessagesBo.php
@@ -221,7 +221,7 @@ $messages = array(
 'jumptosearch' => 'འཚོལ།',
 'pool-errorunknown' => 'ངོས་མ་ཟིན་པའི་ནོར་འཁྲུལ།',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}ངེད་ཀྱི་སྐོར།',
 'aboutpage' => 'Project: ཡི་སྐོར།',
 'copyright' => 'དྲ་བའི་ནང་དོན་$1སྟེང་དུ་ཡོད།',
@@ -231,7 +231,6 @@ $messages = array(
 'disclaimers' => 'དགག་བྱ།',
 'disclaimerpage' => 'Project:སྤྱིའི་དགག་བྱ།',
 'edithelp' => 'རྩོམ་སྒྲིག་རོགས་རམ།',
-'edithelppage' => 'Help:རྩོམ་སྒྲིག',
 'helppage' => 'Help:ནང་དོན་',
 'mainpage' => 'གཙོ་ངོས།',
 'mainpage-description' => 'གཙོ་ངོས།',
@@ -333,7 +332,7 @@ $messages = array(
 'newpassword' => 'ལམ་ཡིག་གསར་བ།',
 'retypenew' => 'ལམ་ཡིག་གསར་བ་བསྐྱར་འཇུག་བྱོས།',
 'resetpass_submit' => 'ལམ་ཡིག་བསྒྲིགས་ནས་ནང་འཛུལ་བྱེད་པ།',
-'resetpass_success' => 'ལམ་ཡིག་བདེ་ལེགས་ངང་བརྗེས་ཟིན། ད་ནི་ནང་འཛུལ་བྱེད་བཞིན་པ་་་',
+'changepassword-success' => 'ལམ་ཡིག་བདེ་ལེགས་ངང་བརྗེས་ཟིན། ད་ནི་ནང་འཛུལ་བྱེད་བཞིན་པ་་་',
 'resetpass_forbidden' => 'ལམ་ཡིག་བརྗེ་མི་ཐུབ།',
 'resetpass-submit-loggedin' => 'ལམ་ཡིག་བརྗེ་བ།',
 'resetpass-submit-cancel' => 'རྩིས་མེད་ཐོངས།',
diff --git a/languages/messages/MessagesBpy.php b/languages/messages/MessagesBpy.php
index 6b088dba..8025ce8a 100644
--- a/languages/messages/MessagesBpy.php
+++ b/languages/messages/MessagesBpy.php
@@ -76,9 +76,6 @@ $messages = array(
 'tog-shownumberswatching' => 'চাকুরার সংখ্যাহান দেহাদে',
 'tog-oldsig' => 'আগেত্তর আসে স্বাক্ষররহান:',
 'tog-fancysig' => 'স্বাক্ষরহানরে উইকিটেক্সট বুলিয়া নিংকর (নিজেত্ত লিঙ্ক নেইকরিয়া)',
-'tog-externaleditor' => 'অকরাতই বারেদের সম্পাদক ব্যবহার কর (হুদ্দা দক্ষ ব্যবহারকারীরকা, কম্পিউটারর মা বিশেষ সেটিংস দরকার। [//www.mediawiki.org/wiki/Manual:External_editors বিস্তারিত পৌ।])',
-'tog-externaldiff' => 'অকরাতই বারেদের সম্পাদক ব্যবহার কর (হুদ্দা দক্ষ ব্যবহারকারীরকা, কম্পিউটারর মা বিশেষ সেটিংস দরকার। [//www.mediawiki.org/wiki/Manual:External_editors বিস্তারিত পৌ।])',
-'tog-showjumplinks' => '"চঙদে" বুলতারা মিলাপর য়্যাথাঙদে',
 'tog-uselivepreview' => 'লগে লগে মিল্লেঙ আহান দেহাদে (জাভাস্ক্রিপ্ট) (লইনাসে)',
 'tog-forceeditsummary' => 'খালি পতা সারমর্ম হমিলে মরে হারপুৱাদে',
 'tog-watchlisthideown' => 'মি পতাসু অতা গুর মর তালাবিত্ত',
@@ -91,6 +88,7 @@ $messages = array(
 'tog-diffonly' => 'ফারাকর তলে পাতাহানর বিষয়বস্তু নাদেখাদি',
 'tog-showhiddencats' => 'আরুমে আসে থাকহানি ফংকর',
 'tog-norollbackdiff' => 'রোলব্যাকর পিসে ফারাক না দেখাদি',
+'tog-useeditwarning' => 'পতানির সময় ইতু নাকরিয়া বেলিয়া গেলেগা মরে সিঙকরেদিস',
 
 'underline-always' => 'হারি সময়',
 'underline-never' => 'সুপৌনা',
@@ -276,7 +274,7 @@ $1',
 'pool-queuefull' => 'পুলর লাইনহান বুঝেসে',
 'pool-errorunknown' => 'হারনাপাসি লালহান',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}র বারে',
 'aboutpage' => 'Project:বারে',
 'copyright' => '$1-র মাতুঙে এহানর মেথেলহানি পানা একরের।',
@@ -286,7 +284,6 @@ $1',
 'disclaimers' => 'দাবি বেলানি',
 'disclaimerpage' => 'Project:ইজ্জু দাবি বেলানি',
 'edithelp' => 'পতানি পাংলাক',
-'edithelppage' => 'Help:কিসাদে_পাতা_আহান_পতানি',
 'helppage' => 'Help:পাংলাক',
 'mainpage' => 'পয়লা পাতা',
 'mainpage-description' => 'পয়লা পাতা',
@@ -359,17 +356,6 @@ $1',
 # General errors
 'error' => 'লালুইসে',
 'databaseerror' => 'ডাটাবেসর লাল',
-'dberrortext' => 'ডাটাবেজ কোয়েরি সিন্ট্যাক্সর মা লালুইসে।
-সফটওয়্যারে কোন বাগর কা এহান ইতে পারে।
-লমিলগা ডাটাবেজ কোয়েরিহান এসারে আসিল:
-<blockquote><tt>$1</tt></blockquote>
-"<tt>$2</tt>" ফাংশনর ভিতরেত্ত।
-ডাটাবেজ লাল হান দিল: "<tt>$3: $4</tt>"।',
-'dberrortextcl' => 'ডাটাবেজ কোয়েরি সিন্ট্যাক্সর মা লালুইসে।
-লমিলগা ডাটাবেজ কোয়েরিহান এসারে আসিল:
-"$1"
-"$2" ফাংশনর ভিতরেত্ত।
-ডাটাবেজ লাল হান দিল: "$3: $4"।',
 'laggedslavemode' => "'''সিঙুইস:''' পাতা এহানাত হাদি এহানার পতানি নেই।",
 'readonly' => 'ডাটাবেস গাথি লাগিসে',
 'enterlockreason' => 'তালা দেনার কারণহান মাত, লগে কুম্পাগা মুকিতেই অহান মাত',
@@ -416,7 +402,6 @@ $1',
 'viewsourcetext' => 'পাতা এহানর উত্স চা বারো কপি করে পারর:',
 'protectedinterface' => 'পাতা এহানর মেথেল উইকি সফটওয়্যারর ইন্টারফেসর পৌহান দের, অহানে এহানরে ইতু করিয়া থনা অসে এবিউসেত্ত ঙাক্করানির কাজে।',
 'editinginterface' => "'''সিঙুইস:''' তি এমন পাতা আহান পতার যেহান সফটওয়্যারর কা ইন্টারফেস টেক্সট দের হানে। পাতা এহার পতানিহান আতাকুরার ইন্টারফেস সিল পরতইগা, যেহান আর আ আতাকুরাইদেখতাই। অনুবাদর কা [//translatewiki.net/wiki/Main_Page?setlang=bpy translatewiki.net] ব্যবহার করানির বারে খালকর। এহান মিডিয়াউইকির স্থানীয়করণ প্রকল্পহান।",
-'sqlhidden' => '(এস কিউ এল কোয়েরি গুরিয়া আসে)',
 'cascadeprotected' => 'পাতা এহান পতানি থা নেই, কিদিয়া বুল্লে {{PLURAL:$1|হান পাতা|হান পাতার}}  মা তিলুইসে, যে পাতা/পাতাহানিরতা cascading অপশন অহান লয়া সুরক্ষিত অসে।
 $2',
 'namespaceprotected' => "'''$1''' নাঙর থাকে কোন পাতা পতানিরকা তরতা য়্যাথাং নেই।",
@@ -439,7 +424,6 @@ $2',
 'yourpassword' => 'খন্তাচাবিগ (password)',
 'yourpasswordagain' => 'খন্তাচাবিগ (password) আরাকমু ইকর',
 'remembermypassword' => 'আহার গজে সেশনর কা খন্তাচাবি মনে থ(সর্বোচ্চ $1 {{PLURAL:$1|দিনর|দিনর}} কা)',
-'securelogin-stick-https' => 'লগইন করানির পিছে এইচটিটিপিএস-র লগে সংযোগ থ',
 'yourdomainname' => 'তর ডোমেইনগ',
 'externaldberror' => 'ডাটেবেজর মা বেসেপ আহান ইসে নাইলে তরতা বারেদের একাউন্ট বদালানির য়্যাথাং নেই।',
 'login' => 'হমানি',
@@ -535,7 +519,7 @@ $2',
 'newpassword' => 'নুৱা খন্তাচাবি:',
 'retypenew' => 'নুৱা খন্তাচাবি বারো টাইপ কর:',
 'resetpass_submit' => 'খন্তাচাবি লেপকর বারো লগ-ইন কর',
-'resetpass_success' => 'তর খন্তা চাবি হবাই বালাই পতিল। তি এপাগা ভিতরে হমারগা...',
+'changepassword-success' => 'তর খন্তা চাবি হবাই বালাই পতিল। তি এপাগা ভিতরে হমারগা...',
 'resetpass_forbidden' => 'খন্তাচাবিগ সিলকরানি নুৱারলাঙ',
 'resetpass-no-info' => 'পাতা এহানাত হমিতে গেলেগা তি যেসারেউ লগইন করানি লাগতই।',
 'resetpass-submit-loggedin' => 'খন্তাচাবি সিলকর',
@@ -711,6 +695,8 @@ $2',
 'edit-conflict' => 'পতানিত বেসেপ ইসে',
 'edit-already-exists' => 'নুৱা পাতাহান হঙকরানি নাইল।
 পাতাএহান আগেত্তর আসে।',
+'editwarning-warning' => 'পাতা এহান বেলিয়া গেলেগা তি সিলকরিসত অতা মাঙুইতে পারে।
+তি লগইন করিসতগ ইলে, এরে সিঙকরানির পৌ এহান তর "পতানি" থাকেত্ত আরুম করানি পারর।',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''সিঙুইস:''' টেমপ্লেটের ইনক্লুড অংতাহান ডাঙর অসে। টেমপ্লেট কতহান তিলকরানি নুওয়ারতে পারে।",
@@ -840,7 +826,6 @@ $2',
 'searchmenu-legend' => 'বিসারানির অপশনহানি',
 'searchmenu-exists' => "'''উইকি এহাত \"[[:\$1]]\" নাঙে পাতা আহান আসে'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" নাঙর পাতাহান এরে উইকিত হঙকর!'''",
-'searchhelp-url' => 'Help:পাংলাক',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|এরে prefix এতাল আসে পাতাহানি]]',
 'searchprofile-articles' => 'কন্টেন্টর পাতাহানি',
 'searchprofile-project' => 'পাঙলাক বারো প্রকল্পর পাতা',
@@ -880,14 +865,6 @@ $2',
 'powersearch-togglenone' => 'কিত্তাউ নেই',
 'search-external' => 'বারেদে বিসারা',
 
-# Quickbar
-'qbsettings' => 'কুইকবার',
-'qbsettings-none' => 'কিত্তাউ নেই',
-'qbsettings-fixedleft' => 'লেপ্পা বিঙ',
-'qbsettings-fixedright' => 'লেপ্পা বাত',
-'qbsettings-floatingleft' => 'বাহের বিঙ',
-'qbsettings-floatingright' => 'বাহের বাত',
-
 # Preferences page
 'preferences' => 'পছনহানি',
 'mypreferences' => 'মর পছন',
@@ -1018,7 +995,6 @@ $2',
 'recentchangeslinked-feed' => 'সাকেই আসে পতা',
 'recentchangeslinked-toolbox' => 'সাকেই আসে পতা',
 'recentchangeslinked-title' => 'পতানিহান "$1"র লগে সর্ম্পক আসে',
-'recentchangeslinked-noresult' => 'দেনা অসে খেন্তামর ভিতরে পতাসিতা নেই।',
 'recentchangeslinked-summary' => "লেপকরা পাতা আহান (অথবা লেপকরা বিষয়শ্রেণী)ত্ত তিলসে এরে পাতা এহানর হাদি এহান পতাসি অহানর লাতঙ দেনা অইল। তর [[Special:Watchlist|তর চালাতঙ]]এ থসি পাতাহানি '''গাঢ়''' করিয়া দেহাদেনা অসে।",
 'recentchangeslinked-page' => 'পাতার নাঙ:',
 'recentchangeslinked-to' => 'দিয়াসি পাতাহানর বদালা মিলাপ আসে পাতাহানির পতানিহানি দেহাদে',
@@ -1138,9 +1114,6 @@ $2',
 'statistics-articles' => 'পাতার কন্টেনহানি',
 'statistics-pages' => 'পাতাহানি',
 
-'disambiguations' => 'সন্দই চুমকরের পাতাহানি',
-'disambiguationspage' => 'Template:সন্দই চুম',
-
 'doubleredirects' => 'আলথকে যানা দ্বিমাউ মাতের',
 
 'brokenredirects' => 'বারো-নির্দেশ কামনাকরের',
@@ -1676,11 +1649,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'version-software-product' => 'পণ্য',
 'version-software-version' => 'সংস্করণ',
 
-# Special:FilePath
-'filepath' => 'ফাইলর পথহান:',
-'filepath-page' => 'ফাইল:',
-'filepath-submit' => 'পথ',
-
 # Special:SpecialPages
 'specialpages' => 'বিশেষ পাতাহানি',
 'specialpages-group-login' => 'একাউন্টহাত হমানি/মিহানি',
diff --git a/languages/messages/MessagesBqi.php b/languages/messages/MessagesBqi.php
index 36cac436..d0ac8c4c 100644
--- a/languages/messages/MessagesBqi.php
+++ b/languages/messages/MessagesBqi.php
@@ -45,8 +45,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'نشودادن امیل مو درامیلهای آگاهی-خبری',
 'tog-shownumberswatching' => 'نشودادن شماره کاربران درحال کار یاتماشا',
 'tog-fancysig' => 'امضاهای ناتمام - بدون لینکهای اتوماتیک',
-'tog-externaleditor' => 'بی دقتی در استفاده از اصلاح کننده های خارجی',
-'tog-externaldiff' => 'استفاده زه برنامه های مختلف خارجی بوسیله پیش نمایش(سی تجربه کردن فقط نیاز به تنظیم خاص کامپیوترتان دارین)',
 'tog-showjumplinks' => 'قادر ساختن "پرش به" لینکهای دردسترس',
 'tog-uselivepreview' => 'استفاده زه پیش نمایش زنده(جاوااسکریپ) (تجربی )',
 'tog-forceeditsummary' => 'یادآوری سریع به مو هنگام اصلاح عقیم وخلاصه',
diff --git a/languages/messages/MessagesBr.php b/languages/messages/MessagesBr.php
index 20e49e2b..daab6d47 100644
--- a/languages/messages/MessagesBr.php
+++ b/languages/messages/MessagesBr.php
@@ -16,6 +16,7 @@
  * @author Gwenn-Ael
  * @author Kaganer
  * @author Malafaya
+ * @author Nemo bis
  * @author VIGNERON
  * @author Y-M D
  * @author לערי ריינהארט
@@ -209,9 +210,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Diskouez an niver a lennerien',
 'tog-oldsig' => 'Ar sinadur zo evit poent :',
 'tog-fancysig' => 'Ober gant ar sinadur evel pa vefe wikitestenn (hep liamm emgefre)',
-'tog-externaleditor' => "Ober gant ur skridaozer diavaez dre ziouer (evit arbennigourien hepken rak ezhomm zo arventenniñ hoc'h urzhiataer evit se. [//www.mediawiki.org/wiki/Manual:External_editors Titouroù all.])",
-'tog-externaldiff' => "Ober gant ur c'heñverier diavaez dre ziouer (evit arbennigourien hepken rak ezhomm zo arventenniñ hoc'h urzhiataer evit se. [//www.mediawiki.org/wiki/Manual:External_editors Titouroù all.])",
-'tog-showjumplinks' => 'Gweredekaat al liammoù moned "lammat da"',
 'tog-uselivepreview' => 'Implijout Rakwelet prim (taol-arnod)',
 'tog-forceeditsummary' => 'Kemenn din pa ne skrivan netra er stern diverrañ',
 'tog-watchlisthideown' => "Kuzhat ma c'hemmoù er rollad evezhiañ",
@@ -225,6 +223,8 @@ $messages = array(
 'tog-showhiddencats' => 'Diskouez ar rummadoù kuzhet',
 'tog-noconvertlink' => 'Diweredekaat amdroadur an titloù',
 'tog-norollbackdiff' => 'Na ziskouez an diff goude un distaoladenn',
+'tog-useeditwarning' => 'Kas keloù din pa guitaan ur bajenn degaset kemmoù enni hep enrollañ',
+'tog-prefershttps' => "Implijout bepred ur c'hevreadur suraet pa vezit kevreet",
 
 'underline-always' => 'Atav',
 'underline-never' => 'Morse',
@@ -288,6 +288,18 @@ $messages = array(
 'oct' => 'Her',
 'nov' => 'Du',
 'dec' => 'Kzu',
+'january-date' => '$1 a viz Genver',
+'february-date' => "$1 a viz C'hwevrer",
+'march-date' => '$1 a viz Meurzh',
+'april-date' => '$1 a viz Ebrel',
+'may-date' => '$1 a viz Mae',
+'june-date' => '$1 a viz Even',
+'july-date' => '$1 a viz Gouere',
+'august-date' => '$1 a viz Eost',
+'september-date' => '$1 a viz Gwengolo',
+'october-date' => '$1 a viz Here',
+'november-date' => '$1 a viz Du',
+'december-date' => '$1 a viz Kerzu',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Rummad |Rummad }}',
@@ -369,6 +381,7 @@ $messages = array(
 'create-this-page' => 'Krouiñ ar bajenn-mañ',
 'delete' => 'Diverkañ',
 'deletethispage' => 'Diverkañ ar bajenn-mañ',
+'undeletethispage' => 'Diziverkañ ar bajenn-mañ',
 'undelete_short' => "Diziverkañ {{PLURAL:$1|ur c'hemm|$1 kemm}}",
 'viewdeleted_short' => "Gwelet {{PLURAL:$1|ur c'hemm diverket|$1 kemm diverket}}",
 'protect' => 'Gwareziñ',
@@ -412,7 +425,7 @@ $1',
 'pool-queuefull' => 'Soulgarget eo ar servijerioù',
 'pool-errorunknown' => 'Fazi dianav',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Diwar-benn {{SITENAME}}',
 'aboutpage' => 'Project:Diwar-benn',
 'copyright' => "Danvez a c'haller implijout dindan $1.",
@@ -422,7 +435,6 @@ $1',
 'disclaimers' => 'Kemennoù',
 'disclaimerpage' => 'Project:Kemenn hollek',
 'edithelp' => 'Skoazell',
-'edithelppage' => 'Help:Penaos kemmañ traoù er pennadoù',
 'helppage' => 'Help:Skoazell',
 'mainpage' => 'Degemer',
 'mainpage-description' => 'Degemer',
@@ -499,16 +511,12 @@ Ur roll eus ar pajennoù dibar reizh a c'hallit kavour war [[Special:SpecialPage
 # General errors
 'error' => 'Fazi',
 'databaseerror' => 'Fazi bank roadennoù',
-'dberrortext' => 'C\'hoarvezet ez eus ur fazi ereadur eus ar reked er bank roadennoù, ar pezh a c\'hall talvezout ez eus un draen er meziant.
-Setu ar goulenn bet pledet gantañ da ziwezhañ :
-<blockquote><code>$1</code></blockquote>
-adal an arc\'hwel "<code>$2</code>".
-Adkaset eo bet ar fazi "<samp>$3: $4</samp>" gant ar bank roadennoù.',
-'dberrortextcl' => 'Ur fazi ereadur zo en ur reked savet ouzh ar bank roadennoù.
-Setu ar goulenn bet pledet gantañ da ziwezhañ :
-"$1"
-adal an arc\'hwel "$2"
-Adkaset eo bet ar fazi "$3 : $4" gant ar bank roadennoù.',
+'databaseerror-text' => 'Ur fazi zo bet er reked diaz roadennoù.
+Marteze ez eus un draen er meziant.',
+'databaseerror-textcl' => 'Ur fazi zo bet er reked diaz roadennoù.',
+'databaseerror-query' => 'Reked : $1',
+'databaseerror-function' => "Arc'hwel : $1",
+'databaseerror-error' => 'Fazi : $1',
 'laggedslavemode' => "Diwallit : marteze a-walc'h n'emañ ket ar c'hemmoù diwezhañ war ar bajenn-mañ",
 'readonly' => 'Hizivadurioù stanket war ar bank roadennoù',
 'enterlockreason' => 'Merkit perak eo stanket hag istimit pegeit e chomo evel-henn',
@@ -560,12 +568,15 @@ Goulenn : $2",
 'viewyourtext' => "Gallout a rit gwelet hag eilañ mammenn ho '''kemmoù''' d'ar bajenn-mañ :",
 'protectedinterface' => 'Testenn ar bajenn-mañ a dalvez evit etrefas ar meziant er wiki-mañ. Setu perak eo bet gwarezet ar bajenn.',
 'editinginterface' => "'''Diwallit :''' Emaoc'h o kempenn ur bajenn a dalvez da sevel skridoù evit etrefas ar meziant. Ar c'hemmoù graet d'ar bajenn-mañ a cheñcho etrefas an holl implijerien. Mar fell deoc'h skoazellañ evit treiñ traoù, soñjit kentoc'h implijout [//translatewiki.net/wiki/Main_Page?setlang=br translatewiki.net], ar raktres evit lec'helaat MediaWiki.",
-'sqlhidden' => '(Reked SQL kuzhet)',
 'cascadeprotected' => 'Gwarezet eo ar bajenn-mañ; n\'haller ket kemmañ anezhi ken p\'he c\'haver {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh "skalierad" :
 $2',
 'namespaceprotected' => "N'oc'h ket aotreet da gemmañ pajennoù an esaouenn anv '''$1'''.",
 'customcssprotected' => "N'oc'h ket aotreet da gemmañ ar bajenn CSS-mañ rak kavout a reer enni arventennoù personel un implijer all.",
 'customjsprotected' => "N'oc'h ket aotreet da gemmañ ar bajenn JavaScript-mañ rak kavout a reer enni arventennoù personel un implijer all.",
+'mycustomcssprotected' => "N'oc'h ket aotreet da gemmañ d'ar bajenn CSS-mañ.",
+'mycustomjsprotected' => "N'oc'h ket aotreet da gemmañ d'ar bajenn JavaScript-mañ.",
+'myprivateinfoprotected' => "N'ho peus ket ar gwirioù evit kemmañ ho titouroù personel.",
+'mypreferencesprotected' => "N'ho peus ket ar gwirioù evit kemmañ ho Penndibaboù.",
 'ns-specialprotected' => "N'haller ket kemmañ ar pajennoù en esaouenn anv {{ns:special}}.",
 'titleprotected' => "Gwarezet eo bet an titl-mañ p'eo bet krouet gant [[User:$1|$1]].
 Setu amañ perak ''$2''.",
@@ -590,10 +601,19 @@ Notit mat e c'hallo pajennoù zo kenderc'hel da vezañ diskwelet evel pa vefec'h
 'welcomecreation-msg' => 'Krouet eo bet ho kont implijer.
 Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}}]].',
 'yourname' => 'Anv implijer :',
+'userlogin-yourname' => 'Anv implijer',
+'userlogin-yourname-ph' => "Merkit hoc'h anv implijer",
+'createacct-another-username-ph' => 'Ebarzhiñ an anv implijer',
 'yourpassword' => 'Ger-tremen :',
+'userlogin-yourpassword' => 'Ger-tremen',
+'userlogin-yourpassword-ph' => 'Merkit ho ker-tremen',
+'createacct-yourpassword-ph' => 'Skrivit ur ger-tremen',
 'yourpasswordagain' => 'Skrivit ho ker-tremen en-dro',
+'createacct-yourpasswordagain' => 'Kadarnaat ar ger-tremen',
+'createacct-yourpasswordagain-ph' => 'Skrivit ar ger-tremen adarre',
 'remembermypassword' => "Derc'hel soñj eus ma ger-tremen war an urzhiataer-mañ (evit $1 devezh{{PLURAL:$1||}} d'ar muiañ)",
-'securelogin-stick-https' => 'Chom kevreet da HTTPS goude bezañ bet kevreet',
+'userlogin-remembermypassword' => "Derc'hel ac'hanon kevreet",
+'userlogin-signwithsecure' => 'Implijout ur gevreadenn suraet',
 'yourdomainname' => 'Ho tomani',
 'password-change-forbidden' => "Ne c'hallit ket kemmañ ar gerioù-tremen er wiki-mañ.",
 'externaldberror' => "Pe ez eus bet ur fazi gwiriekaat diavaez er bank titouroù pe n'oc'h ket aotreet da nevesaat ho kont diavaez.",
@@ -605,18 +625,41 @@ Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}
 'logout' => 'Digevreañ',
 'userlogout' => 'Digevreañ',
 'notloggedin' => 'Digevreet',
+'userlogin-noaccount' => "Kont ebet ganeoc'h c'hoazh ?",
+'userlogin-joinproject' => 'Kemer perzh e {{SITENAME}}',
 'nologin' => "N'hoc'h eus kont ebet ? $1.",
 'nologinlink' => 'Krouiñ ur gont',
 'createaccount' => 'Krouiñ ur gont nevez',
 'gotaccount' => "Ur gont zo ganeoc'h dija ? '''$1'''.",
 'gotaccountlink' => 'Kevreañ',
 'userlogin-resetlink' => "Ha disoñjet eo bet ho titouroù kevreañ ganeoc'h ?",
+'userlogin-resetpassword-link' => 'Adderaouekaat ho ker-tremen',
+'helplogin-url' => 'Help:Kevreañ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Skoazell evit kevreañ]]',
+'createacct-join' => 'Skrivit ho titouroù amañ dindan.',
+'createacct-another-join' => 'Ebarzhiñ titouroù ar gont nevez amañ dindan.',
+'createacct-emailrequired' => "Chomlec'h postel",
+'createacct-emailoptional' => "Chomlec'h postel (direizh)",
+'createacct-email-ph' => "Skrivit ho chomlec'h postel",
+'createacct-another-email-ph' => "Ebarzhiñ ur chomlec'h postel",
 'createaccountmail' => 'Dre bostel',
+'createacct-realname' => 'Anv gwir (diret)',
 'createaccountreason' => 'Abeg :',
+'createacct-reason' => 'Abeg',
+'createacct-reason-ph' => "Perak emaoc'h o krouiñ ur gont all",
+'createacct-captcha' => 'Kontroll surentez',
+'createacct-imgcaptcha-ph' => 'Ebarzhit an destenn a welit a-us',
+'createacct-submit' => 'Krouiñ ho kont',
+'createacct-another-submit' => 'Krouiñ ur gont all',
+'createacct-benefit-heading' => "{{SITENAME}} zo graet gant tud eveldoc'h.",
+'createacct-benefit-body1' => '$1 {{PLURAL:$1|kemm}}',
+'createacct-benefit-body2' => 'pajenn{{PLURAL:$1|}}',
+'createacct-benefit-body3' => "{{PLURAL:$1|c'henlabourer|kenlabourer}} nevez",
 'badretype' => 'Ne glot ket ar gerioù-tremen an eil gant egile.',
 'userexists' => "Implijet eo an anv implijer lakaet ganeoc'h dija.
 Dibabit un anv all mar plij.",
 'loginerror' => 'Kudenn gevreañ',
+'createacct-error' => "Ur fazi 'zo bet o krouiñ ar gont",
 'createaccounterror' => 'Dibosupl krouiñ ar gont : $1',
 'nocookiesnew' => "Krouet eo bet ar gont implijer met n'oc'h ket kevreet. {{SITENAME}} a implij toupinoù evit ar c'hevreañ met diweredekaet eo an toupinoù ganeoc'h. Trugarez da weredekaat anezho ha da gevreañ en-dro.",
 'nocookieslogin' => "{{SITENAME}} a implij toupinoù evit kevreañ met diweredekaet eo an toupinoù ganeoc'h. Trugarez da weredekaat anezho ha da gevreañ en-dro.",
@@ -673,10 +716,11 @@ Mat e vefe deoc\'h kevreañ ha cheñch ho ker-tremen bremañ.
 Na daolit ket evezh ouzh ar c\'hemenn-mañ m\'eo bet krouet ar gont dre fazi.',
 'usernamehasherror' => "N'haller ket ober gant an arouezenn # en anvioù an implijerien",
 'login-throttled' => "Betek re oc'h heus klasket kevreañ en aner.
-Gortozit a-raok klask en-dro.",
+Gortozit $1, mar plij, a-raok esaeañ en-dro.",
 'login-abort-generic' => 'Dibosupl ho kevreañ - Dilezet',
 'loginlanguagelabel' => 'Yezh : $1',
 'suspicious-userlogout' => 'Distaolet eo bet ho koulenn digevreañ rak kaset e oa bet gant ur merdeer direizhet pe krubuilhadenn ur proksi, evit doare.',
+'createacct-another-realname-tip' => "Diret eo skrivañ hoc'h anv gwir. Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset ganeoc'h.",
 
 # Email sending
 'php-mail-error-unknown' => "Fazi dianav en arc'hwel postel () PHP",
@@ -692,8 +736,7 @@ Gortozit a-raok klask en-dro.",
 'newpassword' => 'Ger-tremen nevez :',
 'retypenew' => 'Adskrivañ ar ger-tremen nevez :',
 'resetpass_submit' => 'Cheñch ar ger-tremen ha kevreañ',
-'resetpass_success' => "Cheñchet eo bet ho ker-tremen.
-Kevreet e vioc'h bremañ...",
+'changepassword-success' => 'Cheñchet eo bet ho ker-tremen !',
 'resetpass_forbidden' => "N'haller ket cheñch ar gerioù-termen",
 'resetpass-no-info' => "Ret eo deoc'h bezañ kevreet a-benn mont d'ar bajenn-se war-eeun.",
 'resetpass-submit-loggedin' => 'Cheñch ger-tremen',
@@ -704,10 +747,11 @@ Kevreet e vioc'h bremañ...",
 
 # Special:PasswordReset
 'passwordreset' => 'Adderaouekaat ar ger-tremen',
-'passwordreset-text' => 'Leuniañ ar furmskrid-mañ da adderaouekaat ho ker-tremen.',
+'passwordreset-text-one' => 'Leugnit ar furmskrid-mañ evit adderaouekaat ho ker-tremen.',
+'passwordreset-text-many' => '{{PLURAL:$1|Leugnit unan eus ar maeziennoù da adderaouekaat ho ker-tremen.}}',
 'passwordreset-legend' => 'Adsevel ar ger-tremen',
 'passwordreset-disabled' => 'Diweredekaet eo bet an adsevel gerioù-tremen war ar wiki-mañ.',
-'passwordreset-pretext' => '{{PLURAL:$1||Merkit unan eus an tammoù roadennoù dindan}}',
+'passwordreset-emaildisabled' => "Ne c'haller ket ober gant posteloù er wiki-mañ.",
 'passwordreset-username' => 'Anv implijer :',
 'passwordreset-domain' => 'Domani :',
 'passwordreset-capture' => 'Gwelet ar postel ?',
@@ -744,6 +788,15 @@ Ger-tremen da c'hortoz : $2",
 'changeemail-submit' => "Cheñch chomlec'h postel",
 'changeemail-cancel' => 'Nullañ',
 
+# Special:ResetTokens
+'resettokens' => 'Adderaouekaat ar jedoueroù',
+'resettokens-no-tokens' => "N'eus jedouer ebet da adderaouekaat.",
+'resettokens-legend' => 'Adderaouekaat ar jedoureoù',
+'resettokens-tokens' => 'Jedoueroù :',
+'resettokens-token-label' => '$1 (talvoud bremañ : $2)',
+'resettokens-done' => 'Jedoueroù adderaouekaet.',
+'resettokens-resetbutton' => 'Adderaouekaat ar jedoueroù diuzet',
+
 # Edit page toolbar
 'bold_sample' => 'Testenn dev',
 'bold_tip' => 'Testenn dev',
@@ -941,12 +994,15 @@ Abeg dianav.",
 Diverket eo bet evit doare.',
 'edit-conflict' => 'Tabut kemmañ.',
 'edit-no-change' => "N'eo ket bet kemeret ho tegasadenn e kont rak ne oa ket bet kemmet netra en destenn.",
+'postedit-confirmation' => 'Enrollet eo bet ho kemmoù.',
 'edit-already-exists' => "N'eus ket bet gallet krouiñ ur bajenn nevez.
 Krouet e oa bet c'hoazh.",
 'defaultmessagetext' => 'Testenn dre ziouer',
 'content-failed-to-parse' => "C'hwitet eo dielfennadur endalc'had $2 evit ar patrom $1: $3",
 'invalid-content-data' => "n'eo ket mat roadennoù an endalc'had",
 'content-not-allowed-here' => 'N\'eo ket aotreet an endalc\'had "$1" er bajenn [[$2]]',
+'editwarning-warning' => "Mar kuitait ar bajenn-mañ e c'hallit koll ar c'hemmoù degaset ganeoc'h.
+Ma'z oc'h kevreet e c'hallit diweredekaat ar c'hemenn-diwall-mañ e rann \"Aozañ\" en ho penndibaboù.",
 
 # Content models
 'content-model-wikitext' => 'wikitestenn',
@@ -981,6 +1037,7 @@ A-gostez eo bet lezet an arventenn-se.',
 'undo-failure' => "N'eus ket bet tu da zisteuler ar c'hemm-mañ abalamour d'un tabut gant kemmoù degaset e-keit-se.",
 'undo-norev' => "N'eus ket bet gallet degas ar c'hemmoù-mañ rak pe n'eus ket anezho pe int bet diverket.",
 'undo-summary' => 'Dizober kemmoù $1 a-berzh [[Special:Contributions/$2|$2]] ([[User talk:$2|kaozeal]])',
+'undo-summary-username-hidden' => 'Dizober ar reizhadenn $1 gant un implijer kuzhet',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Dibosupl krouiñ ar gont',
@@ -1158,6 +1215,7 @@ Gwiriit ne vo ket torret red istor ar bajenn gant ar c'hemm-mañ.",
 'compareselectedversions' => 'Keñveriañ ar stummoù diuzet',
 'showhideselectedversions' => 'Diskouez/Kuzhat ar stummoù diuzet',
 'editundo' => 'dizober',
+'diff-empty' => '(Disheñvelder ebet)',
 'diff-multi' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant {{PLURAL:$2|un implijer|$2 implijer}} kuzhet.)",
 'diff-multi-manyusers' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant muioc'h eget $2 {{PLURAL:$2|implijer|implijer}} kuzhet.)",
 'difference-missing-revision' => "!!{{PLURAL:$2|Un adweladur|$2 adweladurioù}} eus an disheñvelder ($1) {{PLURAL:$2|n'eo ket bet kavet|n'int ket bet adkavet}}.
@@ -1185,7 +1243,6 @@ Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'searchmenu-legend' => 'Dibarzhioù klask',
 'searchmenu-exists' => "'''Ur bajenn anvet\"[[:\$1]]\" zo war ar wiki-mañ'''",
 'searchmenu-new' => "'''Krouiñ ar bajenn \"[[:\$1]]\" war ar wiki-mañ !'''",
-'searchhelp-url' => 'Help:Skoazell',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Furchal er pajennoù a grog gant ar rakger-mañ]]',
 'searchprofile-articles' => 'Pajennoù gant boued',
 'searchprofile-project' => 'Pajennoù skoazell ha pajennoù ar raktres',
@@ -1226,15 +1283,7 @@ Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'powersearch-togglenone' => 'Hini ebet',
 'search-external' => 'Klask diavaez',
 'searchdisabled' => "<p>Diweredekaet eo bet an arc'hwel klask war an destenn a-bezh evit ur frapad rak ur samm re vras e oa evit ar servijer. Emichañs e vo tu d'e adlakaat pa vo ur servijer galloudusoc'h ganeomp. Da c'hortoz e c'hallit klask gant Google:</p>",
-
-# Quickbar
-'qbsettings' => 'Personelaat ar varrenn ostilhoù',
-'qbsettings-none' => 'Hini ebet',
-'qbsettings-fixedleft' => 'Kleiz',
-'qbsettings-fixedright' => 'Dehou',
-'qbsettings-floatingleft' => 'War-neuñv a-gleiz',
-'qbsettings-floatingright' => 'War-neuñv a-zehou',
-'qbsettings-directionality' => 'Difiñv, hervez an tu ma vez skrivet ho yezh',
+'search-error' => 'Ur fazi a zo bet e-ser klask : $1',
 
 # Preferences page
 'preferences' => 'Penndibaboù',
@@ -1268,7 +1317,6 @@ Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'resetprefs' => 'Adlakaat ar penndibaboù kent',
 'restoreprefs' => 'Adlakaat an holl arventennoù dre ziouer (en holl gevrennoù)',
 'prefs-editing' => 'Prenestr skridaozañ',
-'prefs-edit-boxsize' => 'Ment ar prenestr skridaozañ.',
 'rows' => 'Linennoù :',
 'columns' => 'Bannoù',
 'searchresultshead' => 'Klask',
@@ -1279,9 +1327,6 @@ Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'recentchangesdays-max' => "D'ar muiañ $1 {{PLURAL:$1|deiz|deiz}}",
 'recentchangescount' => 'Niver a gemmoù da ziskouez dre ziouer',
 'prefs-help-recentchangescount' => "Kemer a ra an dra-mañ e kont ar c'hemmoù diwezhañ, istor ar pajennoù hag ar marilhoù.",
-'prefs-help-watchlist-token' => "Leuniañ ar c'hombod-mañ gant un dalvoudenn guzh a lakaio ul lanvad RSS war-sav evit ho rollad evezhiañ.
-Kement den hag a ouio eus ho jedouer a c'hallo lenn ho rollad evezhiañ, dibabit un dalvoudegezh suraet.
-Setu aze un dalvoudenn ganet dre zegouezh hag a c'hallfec'h implijout : $1",
 'savedprefs' => 'Enrollet eo bet ar penndibaboù.',
 'timezonelegend' => 'Takad eur :',
 'localtime' => "Eur lec'hel :",
@@ -1311,7 +1356,6 @@ Setu aze un dalvoudenn ganet dre zegouezh hag a c'hallfec'h implijout : $1",
 'prefs-common-css-js' => 'JavaScript ha CSS kenrannet evit an holl wiskadurioù :',
 'prefs-reset-intro' => "Ober gant ar bajenn-mañ a c'hallit evit adlakaat ho penndibaboù dre ziouer evit al lec'hienn-mañ. Kement-se n'hallo ket bezañ disc'hraet da c'houde.",
 'prefs-emailconfirm-label' => 'Kadarnaat ar postel :',
-'prefs-textboxsize' => 'Ment ar prenestr skridaozañ',
 'youremail' => 'Postel :',
 'username' => '{{GENDER:$1|Anv implijer|Anv implijerez}}:',
 'uid' => '{{GENDER:$1|Niv. identelezh an implijer|Niv. identelezh an implijerez}}:',
@@ -1344,6 +1388,8 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'prefs-dateformat' => 'Furmad an deiziadoù',
 'prefs-timeoffset' => 'Linkadur eur',
 'prefs-advancedediting' => 'Dibarzhioù araokaet',
+'prefs-editor' => 'Aozer',
+'prefs-preview' => 'Rakwelet',
 'prefs-advancedrc' => 'Dibarzhioù araokaet',
 'prefs-advancedrendering' => 'Dibarzhioù araokaet',
 'prefs-advancedsearchoptions' => 'Dibarzhioù araokaet',
@@ -1351,7 +1397,9 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'prefs-displayrc' => 'Dibarzhioù diskwel',
 'prefs-displaysearchoptions' => 'Dibarzhioù diskwel',
 'prefs-displaywatchlist' => 'Dibarzhioù diskwel',
+'prefs-tokenwatchlist' => 'Jedouer',
 'prefs-diffs' => "Diforc'hioù",
+'prefs-help-prefershttps' => "Efediñ a ray an dibarzh-mañ kentañ gwech ma kevreoc'h.",
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => "Reizh eo ar chomlec'h postel war a seblant",
@@ -1378,6 +1426,7 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'userrights-notallowed' => "N'oc'h ket aotreet da ouzhpennañ na da lemel gwirioù an implijerien.",
 'userrights-changeable-col' => "Ar strolladoù a c'hallit cheñch",
 'userrights-unchangeable-col' => "Ar strolladoù n'hallit ket cheñch",
+'userrights-removed-self' => "Lamet ho peus ho kwirioù deoc'h-c'hwi. Dre se ne c'hallit ket ken mont d'ar bajenn-mañ.",
 
 # Groups
 'group' => 'Strollad :',
@@ -1443,11 +1492,18 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'right-proxyunbannable' => 'Tremen dreist stankadennoù emgefre ar proksioù',
 'right-unblockself' => 'En em zistankañ',
 'right-protect' => 'Kemmañ live gwareziñ ar pajennoù ha kemmañ ar pajennoù gwarezet',
-'right-editprotected' => 'Kemmañ ar pajennoù gwarezet (hep gwarez dre skalierad)',
+'right-editprotected' => 'Aozañ ar pajennoù gwarezet evel "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Aozañ ar pajennoù gwarezet evel "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Kemmañ an etrefas implijer',
 'right-editusercssjs' => 'Kemmañ restroù CSS ha JS implijerien all',
 'right-editusercss' => 'Kemmañ restroù CSS implijerien all',
 'right-edituserjs' => 'Kemmañ restroù JS implijerien all',
+'right-editmyusercss' => "Aozañ ho restroù implijer CSS deoc'h-c'hwi",
+'right-editmyuserjs' => "Aoazañ ho restroù JavaScript implijer deoc'h-c'hwi",
+'right-viewmywatchlist' => "Gwelet ho roll-evezhiañ deoc'h-c'hwi",
+'right-viewmyprivateinfo' => "Gwelet ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
+'right-editmyprivateinfo' => "Aozañ ho roadennoù prevez deoc'h-c'hwi (da sk. chomlec'h postel, anv gwirion)",
+'right-editmyoptions' => 'Kemmañ ho penndibaboù',
 'right-rollback' => 'Disteuler prim kemmoù an implijer diwezhañ kemmet gantañ ur bajenn resis',
 'right-markbotedits' => "Merkañ ar c'hemmoù distaolet evel kemmoù bet graet gant robotoù.",
 'right-noratelimit' => 'Na sell ket ar bevennoù feurioù outañ',
@@ -1509,12 +1565,19 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'action-userrights-interwiki' => 'Kemmañ gwirioù an implijerien war wikioù all',
 'action-siteadmin' => 'Prennañ pe dibrennañ ar bank roadennoù',
 'action-sendemail' => 'Kas posteloù',
+'action-editmywatchlist' => 'kemmañ ho roll evezhiañ',
+'action-viewmywatchlist' => 'gwelet ho roll evezhiañ',
+'action-viewmyprivateinfo' => 'Gwelet ho titouroù prevez',
+'action-editmyprivateinfo' => 'aozañ ho titouroù prevez',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|kemm|kemm}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|abaoe ho kweladenn diwezhañ}}',
+'enhancedrc-history' => 'istor',
 'recentchanges' => 'Kemmoù diwezhañ',
 'recentchanges-legend' => "Dibarzhioù ar c'hemmoù diwezhañ",
 'recentchanges-summary' => "Dre ar bajenn-mañ e c'hallit heuliañ ar c'hemmoù diwezhañ bet degaset d'ar wiki.",
+'recentchanges-noresult' => "N'eus bet kemm ebet a glot gant an dezverkoù-se e-pad ar prantad diferet.",
 'recentchanges-feed-description' => "Heuilhit ar c'hemmoù diwezhañ er wiki el lusk-mañ.",
 'recentchanges-label-newpage' => "Gant ar c'hemm-mañ e vo krouet ur bajenn nevez.",
 'recentchanges-label-minor' => "Ur c'hemm dister eo hemañ",
@@ -1551,7 +1614,6 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'recentchangeslinked-feed' => 'Heuliañ ar pajennoù liammet',
 'recentchangeslinked-toolbox' => 'Heuliañ ar pajennoù liammet',
 'recentchangeslinked-title' => 'Kemmoù a denn da "$1"',
-'recentchangeslinked-noresult' => 'Kemm ebet war ar pajennoù liammet e-pad an amzer spisaet.',
 'recentchangeslinked-summary' => "Rollet eo war ar bajenn dibar-mañ ar c'hemmoù diwezhañ bet degaset war ar pajennoù liammet ouzh ur bajenn lakaet (pe ouzh izili ur rummad lakaet).
 E '''tev''' emañ ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
 'recentchangeslinked-page' => 'Anv ar bajenn :',
@@ -1563,7 +1625,7 @@ E '''tev''' emañ ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
 'reuploaddesc' => "Distreiñ d'ar furmskrid.",
 'upload-tryagain' => 'Kas deskrivadur ar restr kemmet',
 'uploadnologin' => 'Digevreet',
-'uploadnologintext' => "Ret eo deoc'h bezañ [[Special:UserLogin|kevreetet]] a-benn gellout enporzhiañ restroù war ar servijer.",
+'uploadnologintext' => "Ret eo deoc'h $1 evit gallout enporzhiañ restroù war ar servijer.",
 'upload_directory_missing' => "Mankout a ra ar c'havlec'h enporzhiañ ($1) ha n'eo ket bet ar servijer Web evit e grouiñ.",
 'upload_directory_read_only' => "N'hall ket ar servijer skrivañ e renkell ar c'hargadennoù ($1).",
 'uploaderror' => 'Fazi enporzhiañ',
@@ -1790,7 +1852,6 @@ Diweredekaet eo bet img_auth.php evit ur surentez eus ar gwellañ",
 'http-read-error' => 'Fazi lenn HTTP.',
 'http-timed-out' => 'Erru eo termen ar reked HTTP.',
 'http-curl-error' => 'Fazi adtapout an URL : $1',
-'http-host-unreachable' => "N'eus ket bet gallet tizhout an URL.",
 'http-bad-status' => 'Ur gudenn a zo bet e-pad ar reked HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1818,6 +1879,10 @@ Diweredekaet eo bet img_auth.php evit ur surentez eus ar gwellañ",
 'listfiles_size' => 'Ment (e bitoù)',
 'listfiles_description' => 'Deskrivadur',
 'listfiles_count' => 'Stummoù',
+'listfiles-show-all' => 'Stummoù kozh eus skeudennoù e-barzh',
+'listfiles-latestversion' => 'Stumm diwezhañ',
+'listfiles-latestversion-yes' => 'Ya',
+'listfiles-latestversion-no' => 'Ket',
 
 # File description page
 'file-anchor-link' => 'Skeudenn',
@@ -1912,6 +1977,13 @@ Marteze a-walc'h e fell deoc'h kemmañ an deskrivadur anezhi war ar [$2 bajenn d
 'randompage' => 'Ur bajenn dre zegouezh',
 'randompage-nopages' => 'N\'eus pajenn ebet en {{PLURAL:$2|esaouennn anv|esaouennoù anv}} da-heul : "$1".',
 
+# Random page in category
+'randomincategory' => 'Ur bajenn dre zegouezh er rummad',
+'randomincategory-invalidcategory' => '"$1" n\'eo ket un anv rummad reizh.',
+'randomincategory-nopages' => "N'eus pajenn ebet e [[:Category:$1]].",
+'randomincategory-selectcategory' => 'Tapout ur bajenn dre zegouezh eus ar rummad : $1 $2.',
+'randomincategory-selectcategory-submit' => 'Mont',
+
 # Random redirect
 'randomredirect' => 'Ur bajenn adkas dre zegouezh',
 'randomredirect-nopages' => 'N\'eus pajenn adkas ebet en esaouenn anv "$1".',
@@ -1937,12 +2009,6 @@ Marteze a-walc'h e fell deoc'h kemmañ an deskrivadur anezhi war ar [$2 bajenn d
 'statistics-users-active-desc' => "Implijerien o deus degaset da nebeutañ ur c'hemm {{PLURAL:$1|an deiz paseet|e-kerzh an $1 deiz diwezhañ}}",
 'statistics-mostpopular' => 'Pajennoù muiañ sellet',
 
-'disambiguations' => 'Pajennoù enno liammoù war-zu pajennoù disheñvelout',
-'disambiguationspage' => 'Template:Disheñvelout',
-'disambiguations-text' => "Liammet eo ar pajennoù da-heul ouzh ur '''bajenn disheñvelout'''.
-Padal e tlefent kas war-eeun d'an danvez anezho.<br />
-Sellet e vez ouzh ur bajenn evel ouzh ur bajenn disheñvelout ma ra gant ur patrom liammet ouzh [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop' => 'Pajennoù gant ur perzh pajenn',
 'pageswithprop-legend' => 'Pajennoù gant ur perzh pajenn',
 'pageswithprop-prop' => 'Anv ar perzh :',
@@ -2005,6 +2071,7 @@ $1 {{PLURAL:$1|rummad|rummad}}',
 'mostrevisions' => 'Pennadoù bet kemmet ar muiañ',
 'prefixindex' => 'An holl bajennoù a grog gant...',
 'prefixindex-namespace' => 'An holl bajennoù enno ur rakger (esaouenn anv $1)',
+'prefixindex-strip' => 'Lemel ar rakger er roll',
 'shortpages' => 'Pennadoù berr',
 'longpages' => 'Pennadoù hir',
 'deadendpages' => 'Pajennoù dall (hep liamm diabarzh)',
@@ -2200,10 +2267,9 @@ Amañ e vo rollet ar c\'hemmoù da zont evit ar bajenn-mañ hag ar bajenn gaozea
 'unwatchthispage' => 'Paouez da evezhiañ',
 'notanarticle' => 'Pennad ebet',
 'notvisiblerev' => 'Stumm diverket',
-'watchnochange' => "N'ez eus elfenn ebet eus ar re evezhiet ganeoc'h a zo bet kemmet e-pad ar prantad spisaet",
 'watchlist-details' => "Lakaet hoc'h eus {{PLURAL:$1|$1 bajenn|$1 pajenn}} dindan evezh, anez kontañ ar pajennoù kaozeal.",
-'wlheader-enotif' => "* War enaou emañ ar c'has posteloù.",
-'wlheader-showupdated' => "* E '''tev''' emañ merket ar pajennoù bet kemmet abaoe ar wezh ziwezhañ hoc'h eus sellet outo",
+'wlheader-enotif' => "Gweredekaet eo ar c'has posteloù.",
+'wlheader-showupdated' => "E '''tev''' emañ merket ar pajennoù bet kemmet abaoe ar wezh ziwezhañ hoc'h eus sellet outo",
 'watchmethod-recent' => "Gwiriañ ar c'hemmoù diwezhañ er pajennoù dindan evezh",
 'watchmethod-list' => "Gwiriañ ar c'hemmoù diwezhañ evit ar pajennoù evezhiet",
 'watchlistcontains' => '$1 {{PLURAL:$1|pajenn|pajenn}} zo en ho rollad evezhiañ',
@@ -2451,7 +2517,7 @@ $1',
 'contributions' => 'Degasadennoù an {{GENDER:$1|implijer|implijerez}}',
 'contributions-title' => 'Degasadennoù an implijer evit $1',
 'mycontris' => 'Ma degasadennoù',
-'contribsub2' => 'Evit $1 ($2)',
+'contribsub2' => 'Evit {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "N'eus bet kavet kemm ebet o klotañ gant an dezverkoù-se.",
 'uctop' => '(red)',
 'month' => 'Abaoe miz (hag a-raok) :',
@@ -2604,11 +2670,8 @@ Setu aze an abeg(où) m\'eo bet stanket $1 : "\'\'$2\'\'"',
 'ipb_blocked_as_range' => "Fazi : N'eo ket bet stanket ar chomlec'h IP $1 war-eeun, setu n'hall ket bezañ distanket. Stanket eo bet dre al live $2 avat, hag a c'hall bezañ distanket.",
 'ip_range_invalid' => 'Stankañ IP direizh.',
 'ip_range_toolarge' => "N'eo ket aotreet stankañ pajennoù brasoc'h evit /$1.",
-'blockme' => "Stankit ac'hanon",
 'proxyblocker' => 'Stanker proksi',
-'proxyblocker-disabled' => "Diweredekaet eo an arc'hwel-mañ.",
 'proxyblockreason' => "Stanket eo bet hoc'h IP rak ur proksi digor eo. Trugarez da gelaouiñ ho pourvezer moned ouzh ar Genrouedad pe ho skoazell deknikel eus ar gudenn surentez-mañ.",
-'proxyblocksuccess' => 'Echu.',
 'sorbsreason' => "Rollet eo ho chomlec'h IP evel ur proksi digor en DNSBL implijet gant {{SITENAME}}.",
 'sorbs_create_account_reason' => "Rollet eo ho chomlec'h IP evel ur proksi digor war an DNSBL implijet gant {{SITENAME}}. N'hallit ket krouiñ ur gont",
 'cant-block-while-blocked' => "N'hallit ket stankañ implijerien all ma'z oc'h stanket c'hwi hoc'h-unan.",
@@ -2773,6 +2836,7 @@ Kit da welet [//www.mediawiki.org/wiki/Localisation Lec'heladur MediaWiki] ha [/
 'thumbnail-more' => 'Brasaat',
 'filemissing' => 'Restr ezvezant',
 'thumbnail_error' => 'Fazi e-ser krouiñ an alberz : $1',
+'thumbnail_error_remote' => 'Kemennadenn fazi gant $1 : $2',
 'djvu_page_error' => 'Pajenn DjVu er-maez ar bevennoù',
 'djvu_no_xml' => 'Dibosupl da dapout an XML evit ar restr DjVu',
 'thumbnail-temp-create' => 'Dibosupl krouiñ ur restr vunut padennek',
@@ -2921,17 +2985,11 @@ Talvezout a ra da ouzhpennañ un displegadenn er c\'hombod diverrañ.',
 
 # Stylesheets
 'common.css' => '/** Talvezout a raio ar CSS lakaet amañ evit an holl wiskadurioù */',
-'standard.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Standard */',
-'nostalgia.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Melkoni */',
 'cologneblue.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Glaz Kologn */',
 'monobook.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Monobook */',
-'myskin.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur MySkin */',
-'chick.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Plogig */',
-'simple.css' => '/* Talvezout a raio ar CSS lakaet amañ implijerien ar gwiskadur Eeun */',
 'modern.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Modern */',
 'vector.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Vektor */',
 'print.css' => '/* Talvezout a raio ar CSS lakaet amañ evit ar moullañ */',
-'handheld.css' => '/* Talvezout a raio ar CSS lakaet amañ evit an ardivinkoù hezoug diouzh ar gwiskadur kefluniet e $wgHandheldStyle */',
 'noscript.css' => '/* Talvezout a raio ar CSS lakaet amañ evit an implijerien o deus diweredekaet JavaScript */',
 'group-autoconfirmed.css' => '/* Talvezout a raio ar CSS lakaet amañ evit an impjerien bet kadarnaet ent emgefre hepken */',
 'group-bot.css' => '/* Talvezout a raio ar CSS lakaet amañ evit ar robotoù hepken */',
@@ -2940,13 +2998,8 @@ Talvezout a ra da ouzhpennañ un displegadenn er c\'hombod diverrañ.',
 
 # Scripts
 'common.js' => '/* Kement JavaScript amañ a vo karget evit an holl implijerien war kement pajenn lennet ganto. */',
-'standard.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Standard */',
-'nostalgia.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Melkoni */',
 'cologneblue.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Glaz Kologn */',
 'monobook.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur MonoBook */',
-'myskin.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur MySkin */',
-'chick.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Plogig */',
-'simple.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Eeun */',
 'modern.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Modern */',
 'vector.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Vektor */',
 
@@ -3019,13 +3072,8 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 'pageinfo-category-files' => 'Niver a restroù',
 
 # Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Melkoni',
 'skinname-cologneblue' => 'Glaz Kologn',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Plogig',
-'skinname-simple' => 'Eeun',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vektor',
 
@@ -3103,11 +3151,25 @@ Ma vez erounezet ganeoc'h e c'hallje tagañ ho reizhiad.",
 'minutes' => '{{PLURAL:$1|$1 vunutenn|$1 munutenn}}',
 'hours' => '{{PLURAL:$1|$1 eurvezh|$1 eurvezh}}',
 'days' => '{{PLURAL:$1|$1 deiz|$1 deiz}}',
+'weeks' => '{{PLURAL:$1|$1 sizhun}}',
 'months' => '{{PLURAL:$1|$1 miz}}',
 'years' => '{{PLURAL:$1|$1 bloaz|$1 vloaz}}',
 'ago' => '$1 zo',
 'just-now' => 'bremañ diouzhtu',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|eur}} zo',
+'minutes-ago' => '$1 {{PLURAL:$1|vunutenn|munut}} zo',
+'seconds-ago' => '$1 {{PLURAL:$1|eiladenn}} zo',
+'monday-at' => 'Dilun da $1',
+'tuesday-at' => 'Dimeurzh da $1',
+'wednesday-at' => "Dimerc'her da $1",
+'thursday-at' => 'Diriaou da $1',
+'friday-at' => 'Digwener da $1',
+'saturday-at' => 'Disadorn da $1',
+'sunday-at' => 'Disul da $1',
+'yesterday-at' => "Dec'h da $1",
+
 # Bad image list
 'bad_image_list' => "Setu doare ar furmad :
 
@@ -3135,7 +3197,7 @@ Kuzhet e vo ar re all dre ziouer.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ledander',
 'exif-imagelength' => 'Hed',
 'exif-bitspersample' => 'Niv. a vitoù dre barzhioù',
@@ -3313,7 +3375,7 @@ Kuzhet e vo ar re all dre ziouer.
 'exif-originalimageheight' => 'Sav ar skeudenn a-raok na vije bet krennet',
 'exif-originalimagewidth' => 'Ledander ar skeudenn a-raok na vije bet krennet',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Hep gwaskañ',
 'exif-compression-2' => 'CCITT Strollad 3 1 Hirder kodañ Huffman kemmet a vent 1',
 'exif-compression-3' => 'CCITT Strollad 3 kodañ ar pelleiler',
@@ -3723,7 +3785,6 @@ Gallout a rit [[Special:EditWatchlist|implijout an aozer boutin ivez]].',
 'version-other' => 'Diseurt',
 'version-mediahandlers' => 'Merer danvez liesvedia',
 'version-hooks' => 'Galvoù',
-'version-extension-functions' => "Arc'hwelioù an astennoù",
 'version-parser-extensiontags' => 'Balizenn dielfennañ o tont eus an astennoù',
 'version-parser-function-hooks' => "Galv an arc'hwelioù dielfennañ",
 'version-hook-name' => 'Anv ar galv',
@@ -3732,6 +3793,7 @@ Gallout a rit [[Special:EditWatchlist|implijout an aozer boutin ivez]].',
 'version-license' => 'Aotre-implijout',
 'version-poweredby-credits' => "Mont a ra ar wiki-mañ en-dro a-drugarez da '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 're all',
+'version-poweredby-translators' => 'troerien translatewiki.net',
 'version-credits-summary' => 'Karout a rafemp trugarekaat an dud-mañ evit ho kenlabour e [[Special:Version|MediaWiki]].',
 'version-license-info' => "Ur meziant frank eo MediaWiki; gallout a rit skignañ anezhañ ha/pe kemmañ anezhañ dindan termenoù ar GNU Aotre-implijout Foran Hollek evel m'emañ embannet gant Diazezadur ar Meziantoù Frank; pe diouzh stumm 2 an aotre-implijout, pe (evel mar karit) ne vern pe stumm nevesoc'h.
 
@@ -3745,12 +3807,15 @@ Sañset oc'h bezañ resevet [{{SERVER}}{{SCRIPTPATH}}/COPYING un eilskrid eus ar
 'version-entrypoints-header-entrypoint' => 'Poent mont e-barzh',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Hent moned ur restr',
-'filepath-page' => 'Restr :',
-'filepath-submit' => 'Mont',
-'filepath-summary' => 'Diskouez a ra ar bajenn-mañ hent moned klok ur restr.
-Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all war-eeun gant o frogramm stag.',
+# Special:Redirect
+'redirect-legend' => "Adkas d'ur restr pe d'ur bajenn",
+'redirect-submit' => 'Mont',
+'redirect-lookup' => 'Klask :',
+'redirect-value' => 'Talvoud :',
+'redirect-user' => 'ID an implijer',
+'redirect-revision' => 'Adwel ar bajenn',
+'redirect-file' => 'Anv ar restr',
+'redirect-not-exists' => "Talvoud n'eo ket bet kavet",
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Klask ar restroù e doubl',
@@ -3805,7 +3870,10 @@ Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all
 'tags-tag' => 'Anv ar valizenn',
 'tags-display-header' => "Neuz e rolloù ar c'hemmoù",
 'tags-description-header' => 'Deskrivadur klok ar valizenn',
+'tags-active-header' => 'Oberiant ?',
 'tags-hitcount-header' => 'Kemmoù balizennet',
+'tags-active-yes' => 'Ya',
+'tags-active-no' => 'Ket',
 'tags-edit' => 'aozañ',
 'tags-hitcount' => '$1 {{PLURAL:$1|kemm|kemm}}',
 
@@ -3826,6 +3894,7 @@ Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all
 'dberr-problems' => "Ho tigarez ! Kudennoù teknikel zo gant al lec'hienn-mañ.",
 'dberr-again' => 'Gortozit un nebeud munutennoù a-raok adkargañ.',
 'dberr-info' => '(Dibosupl kevreañ ouzh servijer an diaz roadennoù: $1)',
+'dberr-info-hidden' => "(Ne c'haller ket mont da servijer an diaz roadennoù)",
 'dberr-usegoogle' => "E-keit-se esaeit klask dre c'hGoogle.",
 'dberr-outofdate' => "Notit mat e c'hall o menegerioù dezho bezañ dispredet e-keñver ar boued zo ganeomp.",
 'dberr-cachederror' => 'Un eilstumm memoret eus ar bajenn goulennet eo hemañ, gallout a ra bezañ dispredet.',
@@ -3841,6 +3910,9 @@ Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all
 'htmlform-submit' => 'Kas',
 'htmlform-reset' => "Dizober ar c'hemmoù",
 'htmlform-selectorother-other' => 'Unan all',
+'htmlform-no' => 'Ket',
+'htmlform-yes' => 'Ya',
+'htmlform-chosen-placeholder' => 'Diuzañ un dibarzh',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 gant enklask eus an destenn a-bezh embreget',
@@ -3953,4 +4025,13 @@ A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc
 'duration-centuries' => "$1 {{PLURAL:$1|c'hantved|kantved}}",
 'duration-millennia' => '$1 {{PLURAL:$1|milvloaz|milvoaz}}',
 
+# Limit report
+'limitreport-cputime' => 'Amzer implij ar CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|eiladenn}}',
+'limitreport-walltime' => 'Amzer implij gwirion',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|eiladenn}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|okted}}',
+'limitreport-templateargumentsize' => 'Ment arguzenn ar patrom',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|okted}}',
+
 );
diff --git a/languages/messages/MessagesBrh.php b/languages/messages/MessagesBrh.php
index 78ac968a..089112cd 100644
--- a/languages/messages/MessagesBrh.php
+++ b/languages/messages/MessagesBrh.php
@@ -8,7 +8,6 @@
  * @file
  *
  * @author Imdadb
- * @author Southparkfan
  */
 
 $messages = array(
@@ -114,7 +113,6 @@ $messages = array(
 'delete' => 'Mesa',
 'protect' => 'Rakk',
 'protect_change' => 'badal kar',
-'protectthispage' => '',
 'newpage' => 'Púskuno panna',
 'talkpage' => 'Dá panna ná bárav aŧ ítgap kabo',
 'talkpagelinktext' => 'Ítgap',
diff --git a/languages/messages/MessagesBs.php b/languages/messages/MessagesBs.php
index d1c100d2..0db0d0c4 100644
--- a/languages/messages/MessagesBs.php
+++ b/languages/messages/MessagesBs.php
@@ -17,6 +17,7 @@
  * @author Kaganer
  * @author Kal-El
  * @author Malafaya
+ * @author Nemo bis
  * @author Palapa
  * @author Seha
  * @author Smooth O
@@ -309,9 +310,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži broj korisnika koji prate',
 'tog-oldsig' => 'Postojeći potpis:',
 'tog-fancysig' => 'Smatraj potpis kao wikitekst (bez automatskog linka)',
-'tog-externaleditor' => 'Koristi vanjski program za uređivanje po postavkama (samo za naprednije korisnike, potrebne su posebne postavke na vašem računaru)',
-'tog-externaldiff' => 'Koristi vanjski (diff) program po pretpostavljenom za prikaz razlika (samo za naprednije korisnike, potrebne su posebne postavke na vašem računaru)',
-'tog-showjumplinks' => 'Omogući "skoči na" linkove',
 'tog-uselivepreview' => 'Koristite pregled uživo (eksperimentalno)',
 'tog-forceeditsummary' => 'Opomeni me pri unosu praznog sažetka',
 'tog-watchlisthideown' => 'Sakrij moje izmjene sa spiska praćenih članaka',
@@ -325,6 +323,8 @@ $messages = array(
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
 'tog-noconvertlink' => 'Onemogući konverziju naslova linkova',
 'tog-norollbackdiff' => 'Nakon vraćanja zanemari prikaz razlika',
+'tog-useeditwarning' => 'Upozori me kada napustim stranicu za izmjene bez spašenih promjena',
+'tog-prefershttps' => 'Uvijek koristi sigurnu konekciju kada sam prijavljen.',
 
 'underline-always' => 'Uvijek',
 'underline-never' => 'Nikad',
@@ -388,6 +388,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. mart',
+'april-date' => '$1. april',
+'may-date' => '$1. maj',
+'june-date' => '$1. juni',
+'july-date' => '$1. juli',
+'august-date' => '$1. august',
+'september-date' => '$1. septembar',
+'october-date' => '$1. oktobar',
+'november-date' => '$1. novembar',
+'december-date' => '$1. decembar',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorije}}',
@@ -469,6 +481,7 @@ $messages = array(
 'create-this-page' => 'Napravi ovu stranicu',
 'delete' => 'Obriši',
 'deletethispage' => 'Obriši ovu stranicu',
+'undeletethispage' => 'Povrati ovu stranicu',
 'undelete_short' => 'Vrati obrisanih {{PLURAL:$1|$1 izmjenu|$1 izmjene|$1 izmjena}}',
 'viewdeleted_short' => 'Pogledaj {{PLURAL:$1|jednu obrisanu izmjenu|$1 obrisane izmjene|$1 obrisanih izmjena}}',
 'protect' => 'Zaštitite',
@@ -512,7 +525,7 @@ $1',
 'pool-queuefull' => 'Red na pool je prenapunjen',
 'pool-errorunknown' => 'Nepoznata greška',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'O projektu {{SITENAME}}',
 'aboutpage' => 'Project:O_projektu_{{SITENAME}}',
 'copyright' => 'Svi sadržaji podliježu "$1" licenci.',
@@ -522,7 +535,6 @@ $1',
 'disclaimers' => 'Odricanje odgovornosti',
 'disclaimerpage' => 'Project:Uslovi korištenja, pravne napomene i odricanje odgovornosti',
 'edithelp' => 'Pomoć pri uređivanju stranice',
-'edithelppage' => 'Help:Uređivanje',
 'helppage' => 'Help:Sadržaj',
 'mainpage' => 'Početna strana',
 'mainpage-description' => 'Početna strana',
@@ -550,7 +562,6 @@ $1',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|posljednja izmjena|posljednje izmjene}}',
 'youhavenewmessagesmulti' => 'Imate nove poruke na $1',
 'editsection' => 'uredi',
-'editsection-brackets' => '[$1]',
 'editold' => 'uredi',
 'viewsourceold' => 'pogledaj izvor',
 'editlink' => 'uredi',
@@ -600,15 +611,8 @@ Spisak valjanih posebnih stranica se može naći na [[Special:SpecialPages|{{int
 # General errors
 'error' => 'Greška',
 'databaseerror' => 'Greška u bazi',
-'dberrortext' => 'Desila je se sintaksna greška kod upita prema bazi podataka.
-Ovo je se desilo zbog moguće greške u softveru.
-Posljednji pokušani upit je bio: <blockquote><code>$1</code></blockquote> iz funkcije "<code>$2</code>".
-Baza podataka je vratila grešku "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Desila se sintaksna greška upita baze.
-Posljednji pokušani upit je bio:
-"$1"
-iz funkcije "$2".
-Baza podataka je vratila grešku "$3: $4".',
+'databaseerror-function' => 'Funkcija: $1',
+'databaseerror-error' => 'Greška: $1',
 'laggedslavemode' => "'''Upozorenje''': Stranica, možda, nije ažurirana.",
 'readonly' => 'Baza je zaključana',
 'enterlockreason' => 'Unesite razlog za zaključavanje, uključujući procjenu vremena otključavanja',
@@ -664,12 +668,15 @@ Da biste dodali ili izmjenili prijevode svih wikija, posjetite [//translatewiki.
 'editinginterface' => "'''Upozorenje:''' Mijenjate stranicu koja sadrži aktivan tekst programa.
 Promjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.
 Za dodavanje ili promjene prijevoda svih wikija, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
-'sqlhidden' => '(SQL pretraga sakrivena)',
 'cascadeprotected' => 'Uređivanje ove stranice je zabranjeno jer sadrži {{PLURAL:$1|stranicu zaštićenu|stranice zaštićene}} od uređivanja iz razloga:
 $2',
 'namespaceprotected' => "Vi nemate dozvulu da mijenjate stranicu '''$1'''.",
 'customcssprotected' => 'Nemate dozvolu za mijenjanje ove CSS stranice jer sadrži osobne postavke nekog drugog korisnika.',
 'customjsprotected' => 'Nemate dozvolu za mijenjanje ove JavaScript stranice jer sadrži osobne postavke nekog drugog korisnika.',
+'mycustomcssprotected' => 'Nemate dozvolu da uređujete ovu CSS stranicu.',
+'mycustomjsprotected' => 'Nemate dozvolu da uređujete ovu stranicu sa JavaScriptom.',
+'myprivateinfoprotected' => 'Nemate dozvolu da uređujete svoje privatne informacije.',
+'mypreferencesprotected' => 'Nemate dozvolu da uređujete svoje postavke.',
 'ns-specialprotected' => 'Specijalne stranice se ne mogu uređivati.',
 'titleprotected' => 'Naslov stranice je zaštićen od postavljanja od strane korisnika [[User:$1|$1]].
 Iz razloga "\'\'$2\'\'".',
@@ -691,10 +698,19 @@ Obratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još
 'welcomecreation-msg' => 'Vaš nalog je napravljen.
 Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} podešavanja]].',
 'yourname' => 'Korisničko ime:',
+'userlogin-yourname' => 'Korisničko ime',
+'userlogin-yourname-ph' => 'Unesite Vaše korisničko ime',
+'createacct-another-username-ph' => 'Unesite korisničko ime',
 'yourpassword' => 'Šifra:',
+'userlogin-yourpassword' => 'Šifra',
+'userlogin-yourpassword-ph' => 'Unesite Vašu šifru/lozinku',
+'createacct-yourpassword-ph' => 'Unesite šifru/lozinku',
 'yourpasswordagain' => 'Ponovite šifru:',
+'createacct-yourpasswordagain' => 'Potvrdite šifru/lozinku',
+'createacct-yourpasswordagain-ph' => 'Unesite šifru/lozinku opet',
 'remembermypassword' => 'Zapamti moju šifru na ovom računaru (najviše $1 {{PLURAL:$1|dan|dana|dana}})',
-'securelogin-stick-https' => 'Ostani povezan na HTTPS nakon prijave',
+'userlogin-remembermypassword' => 'Ostavi me prijavljen',
+'userlogin-signwithsecure' => 'Koristite sigurnu konekciju',
 'yourdomainname' => 'Vaš domen:',
 'password-change-forbidden' => 'Ne možete da promjenite lozinku na ovom wikiju.',
 'externaldberror' => 'Došlo je do greške pri vanjskoj autorizaciji baze podataka ili vam nije dopušteno osvježavanje Vašeg vanjskog korisničkog računa.',
@@ -706,14 +722,37 @@ Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} pode
 'logout' => 'Odjavi me',
 'userlogout' => 'Odjavi me',
 'notloggedin' => 'Niste prijavljeni',
+'userlogin-noaccount' => 'Nemate korisnički račun?',
+'userlogin-joinproject' => 'Pridružite se {{GRAMMAR:dativ|{{SITENAME}}}}',
 'nologin' => 'Nemate korisničko ime? $1.',
 'nologinlink' => 'Napravite nalog',
 'createaccount' => 'Napravi korisnički račun',
 'gotaccount' => 'Već imate korisnički račun? $1.',
 'gotaccountlink' => 'Prijavi se',
 'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
+'userlogin-resetpassword-link' => 'Resetirajte svoju šifru/lozinku',
+'helplogin-url' => 'Help:Prijavljivanje',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavljivanju]]',
+'userlogin-createanother' => 'Napravi još jedan račun',
+'createacct-join' => 'Unesite svoje podatke ispod.',
+'createacct-another-join' => 'Unesite informacije o novom računu ispod.',
+'createacct-emailrequired' => 'Adresa e-pošte',
+'createacct-emailoptional' => 'Adresa e-pošte (opcionalno)',
+'createacct-email-ph' => 'Unesite Vašu adresu e-pоšte',
+'createacct-another-email-ph' => 'Unesite adresu e-pošte',
 'createaccountmail' => 'Koristite privremenu, slučajno stvorenu šifru/lozinku i pošaljite na navedenu adrеsu e-pošte',
+'createacct-realname' => 'Pravo ime (opcionalno)',
 'createaccountreason' => 'Razlog:',
+'createacct-reason' => 'Razlog',
+'createacct-reason-ph' => 'Zašto pravite još jedan korisnički račun?',
+'createacct-captcha' => 'Sigurnosna provjera',
+'createacct-imgcaptcha-ph' => 'Unesite tekst koji vidite iznad',
+'createacct-submit' => 'Napravite svoj korisnički račun',
+'createacct-another-submit' => 'Napravi još jedan korisnički račun',
+'createacct-benefit-heading' => '{{SITENAME}} je napravljen od strane ljudi kao što ste Vi.',
+'createacct-benefit-body1' => '{{PLURAL:$1|izmjena|izmjene}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|stranica|stranice|stranica}}',
+'createacct-benefit-body3' => 'nedavni {{PLURAL:$1|doprinosa}}',
 'badretype' => 'Šifre koje ste unijeli se ne poklapaju.',
 'userexists' => 'Korisničko ime koje ste unijeli je već u upotrebi.
 Molimo Vas da izaberete drugo ime.',
@@ -776,10 +815,12 @@ Trebali biste se prijaviti i promjeniti šifru.
 Možete ignorisati ovu poruku, ako je korisnički račun napravljen greškom.',
 'usernamehasherror' => 'Korisničko ime ne može sadržavati haš znakove',
 'login-throttled' => 'Previše puta ste se pokušali prijaviti.
-Molimo Vas da sačekate prije nego što pokušate ponovo.',
+Molimo Vas da sačekate $1 prije nego što pokušate ponovo.',
 'login-abort-generic' => 'Vaša prijava nije bila uspješna – Prekinuto',
 'loginlanguagelabel' => 'Jezik: $1',
 'suspicious-userlogout' => 'Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.',
+'createacct-another-realname-tip' => 'Pravo ime nije obavezno.
+Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 
 # Email sending
 'php-mail-error-unknown' => 'Nepoznata greška u PHP funkciji mail()',
@@ -796,8 +837,7 @@ Da biste završili prijavu, morate unijeti novu šifru ovdje:',
 'newpassword' => 'Nova šifra:',
 'retypenew' => 'Unesite ponovo novu šifru:',
 'resetpass_submit' => 'Odredi šifru i prijavi se',
-'resetpass_success' => 'Vaša šifra/lozinka je uspiješno promjenjena!
-Prijavljujem vas...',
+'changepassword-success' => 'Vaša šifra/lozinka je uspiješno promjenjena!',
 'resetpass_forbidden' => 'Šifre ne mogu biti promjenjene',
 'resetpass-no-info' => 'Morate biti prijavljeni da bi ste pristupili ovoj stranici direktno.',
 'resetpass-submit-loggedin' => 'Promijeni šifru',
@@ -809,10 +849,11 @@ Možda ste već uspješno promijenili Vašu šifru ili ste tražili novu privrem
 
 # Special:PasswordReset
 'passwordreset' => 'Poništavanje šifre',
-'passwordreset-text' => 'Ispunite ovaj obrazac da biste resetovali Vašu šifru/lozinku.',
+'passwordreset-text-one' => 'Ispunite ovaj obrazac da biste resetovali Vašu šifru/lozinku.',
+'passwordreset-text-many' => '{{PLURAL:$1|Ispunite jedno od polja kako bi ste resetirali svoju šifru/lozinku.}}',
 'passwordreset-legend' => 'Poništi šifru',
 'passwordreset-disabled' => 'Poništavanje šifre  je onemogućeno na ovoj wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Unesite jedan dio podataka ispod}}',
+'passwordreset-emaildisabled' => 'E-pošta je onemogućena na ovom wikiju.',
 'passwordreset-username' => 'Korisničko ime:',
 'passwordreset-domain' => 'Domen:',
 'passwordreset-capture' => 'Pogledati krajnji e-mail?',
@@ -835,7 +876,7 @@ Trebate se prijaviti i odabrati novu šifru. Ako je neko drugi napravio ovaj zah
 Privremena šifra: $2',
 'passwordreset-emailsent' => 'Podsjetnik o šifri/lozinci je poslat na Vašu E-mail adresu.',
 'passwordreset-emailsent-capture' => 'Poslat je podsjetnik preko e-pošte (prikazan dole).',
-'passwordreset-emailerror-capture' => 'Napravljen je podsjetnik preko e-pošte (prikazan dole), ali ga ne mogu poslati korisniku zbog sljedećeg razloga: $1',
+'passwordreset-emailerror-capture' => 'E-poruka za resetiranje šifre/lozinke, prikazan ispod, je poslan, ali slanje {{GENDER:$2|korisniku|korisnici}} nije uspjelo: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Promijeni e-mail adresu',
@@ -1057,11 +1098,14 @@ Nije ponuđeno nikakvo objašnjenje.',
 Izgleda da je obrisana.',
 'edit-conflict' => 'Sukob izmjena.',
 'edit-no-change' => 'Vaša izmjena je ignorirana, jer nije bilo promjena teksta stranice.',
+'postedit-confirmation' => 'Vaša izmjena je sačuvana.',
 'edit-already-exists' => 'Stranica nije mogla biti kreirana.
 Izgleda da već postoji.',
 'defaultmessagetext' => 'Uobičajeni tekst poruke',
 'invalid-content-data' => 'Nevaljani podaci sadržaja',
 'content-not-allowed-here' => 'Sadržaj napisan u obliku "$1" nije dozvoljen na stranici [[$2]]',
+'editwarning-warning' => 'Napuštanje ove stranice može dovesti do gubitka svih promjena koje ste načinili.
+Ako ste prijavljeni, možete isključiti ovo upozorenje u Sekciji za "Uređivanje" vaših opcija.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1097,6 +1141,7 @@ Molimo da provjerite usporedbu ispod da budete sigurni da to želite učiniti, a
 'undo-failure' => 'Izmjene se ne mogu vratiti zbog konflikta sa izmjenama u međuvremenu.',
 'undo-norev' => 'Izmjena se ne može vratiti jer ne postoji ranija ili je obrisana.',
 'undo-summary' => 'Vraćena izmjena $1 [[Special:Contributions/$2|korisnika $2]] ([[User talk:$2|razgovor]])',
+'undo-summary-username-hidden' => 'Poništi izmjenu $1 od skrivenog korisnika',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Nije moguće napraviti korisnički račun',
@@ -1277,6 +1322,7 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
 'compareselectedversions' => 'Uporedite označene verzije',
 'showhideselectedversions' => 'Pokaži/sakrij odabrane verzije',
 'editundo' => 'ukloni ovu izmjenu',
+'diff-empty' => '(Nema razlike)',
 'diff-multi' => '({{plural:$1|Nije prikazana jedna međurevizija|Nisu prikazane $1 međurevizije|Nije prikazano $1 međurevizija}} od {{PLURAL:$2|jednog korisnika|$2 korisnika}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Jedna međurevizija|$1 međurevizije|$1 međurevizija}} od više od $2 {{PLURAL:$2|korisnika|korisnika}} {{PLURAL:$1|nije prikazana|nisu prikazane}})',
 'difference-missing-revision' => '{{PLURAL:$2|Jedna izmjena|$2 izmjene}} od ove razlike ($1) ne {{PLURAL:$2|postoji|postoje}}.
@@ -1304,7 +1350,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Opcije pretrage',
 'searchmenu-exists' => "'''Postoji stranica pod nazivom \"[[:\$1]]\" na ovoj wiki'''",
 'searchmenu-new' => "'''Napravi stranicu \"[[:\$1|\$1]]\" na ovoj wiki!'''",
-'searchhelp-url' => 'Help:Sadržaj',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Pregledaj stranice sa ovim prefiksom]]',
 'searchprofile-articles' => 'Stranice sadržaja',
 'searchprofile-project' => 'Stranice pomoći i projekta',
@@ -1347,15 +1392,6 @@ Pokušajte u Vaš upit uključiti prefiks ''all:'' da bi ste pretražili sav sad
 'search-external' => 'Vanjska pretraga',
 'searchdisabled' => '<p>Izvinjavamo se!  Puno pretraga teksta je privremeno onemogućena.  U međuvremenu, možete koristiti Google za pretragu.  Indeks može biti stariji.',
 
-# Quickbar
-'qbsettings' => 'Podešavanja brze palete',
-'qbsettings-none' => 'Nikakva',
-'qbsettings-fixedleft' => 'Pričvršćena lijevo',
-'qbsettings-fixedright' => 'Pričvršćena desno',
-'qbsettings-floatingleft' => 'Plutajuća lijevo',
-'qbsettings-floatingright' => 'Plutajući desno',
-'qbsettings-directionality' => 'Čvrsto, u zavisnosti od usmjerenosti pisma Vašeg jezika',
-
 # Preferences page
 'preferences' => 'Postavke',
 'mypreferences' => 'Postavke',
@@ -1388,7 +1424,6 @@ Pokušajte u Vaš upit uključiti prefiks ''all:'' da bi ste pretražili sav sad
 'resetprefs' => 'Vrati podešavanja',
 'restoreprefs' => 'Vrati sve pretpostavljene postavke',
 'prefs-editing' => 'Veličine tekstualnog polja',
-'prefs-edit-boxsize' => 'Veličina prozora za uređivanje.',
 'rows' => 'Redova',
 'columns' => 'Kolona',
 'searchresultshead' => 'Podešavanja rezultata pretrage',
@@ -1399,9 +1434,6 @@ Pokušajte u Vaš upit uključiti prefiks ''all:'' da bi ste pretražili sav sad
 'recentchangesdays-max' => '(najviše $1 {{PLURAL:$1|dan|dana}})',
 'recentchangescount' => 'Broj uređivanja za prikaz po pretpostavkama:',
 'prefs-help-recentchangescount' => 'Ovo uključuje nedavne izmjene, historije stranice i zapise.',
-'prefs-help-watchlist-token' => 'Popunjavanjem ovog polja tajnim ključem će generisati RSS fid za Vaš spisak praćenja.
-Svako ko zna ključ u ovom polju će biti u mogućnosti da pročita Vaš spisak praćenja, tako da trebate izabrati sigurnu vrijednost.
-Ovdje su navedene neke nasumično odabrane vrijednosti koje možete koristiti: $1',
 'savedprefs' => 'Vaše postavke su sačuvane.',
 'timezonelegend' => 'Vremenska zona:',
 'localtime' => 'Lokalno vrijeme:',
@@ -1432,7 +1464,6 @@ Ovdje su navedene neke nasumično odabrane vrijednosti koje možete koristiti: $
 'prefs-reset-intro' => 'Možete koristiti ovu stranicu da poništite Vaše postavke na ovom sajtu na pretpostavljene vrijednosti.
 Ovo se ne može vratiti unazad.',
 'prefs-emailconfirm-label' => 'E-mail potvrda:',
-'prefs-textboxsize' => 'Veličina prozora za uređivanje',
 'youremail' => 'E-mail:',
 'username' => '{{GENDER:$1|Korisničko}} ime:',
 'uid' => '{{GENDER:$1|Korisnički}} ID:',
@@ -1465,6 +1496,8 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'prefs-dateformat' => 'Format datuma',
 'prefs-timeoffset' => 'Vremenska razlika',
 'prefs-advancedediting' => 'Opće opcije',
+'prefs-editor' => 'Urednik',
+'prefs-preview' => 'Prethodni pregled',
 'prefs-advancedrc' => 'Napredne opcije',
 'prefs-advancedrendering' => 'Napredne opcije',
 'prefs-advancedsearchoptions' => 'Napredne opcije',
@@ -1499,6 +1532,8 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'userrights-notallowed' => 'Vaš račun nema privilegije da dodaje ili oduzima prava korisnika.',
 'userrights-changeable-col' => 'Grupe koje možete mijenjati',
 'userrights-unchangeable-col' => 'Grupe koje ne možete mijenjati',
+'userrights-conflict' => 'Sukob u korisničkim pravima! Molimo pošaljite Vaše promjene ponovno.',
+'userrights-removed-self' => 'Uspješno ste uklonili vlastite prava. Zbog toga više niste u stanju pristupiti ovoj stranici.',
 
 # Groups
 'group' => 'Grupa:',
@@ -1564,11 +1599,18 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'right-proxyunbannable' => 'Zaobilaženje automatskih blokada proxy-ja',
 'right-unblockself' => 'Deblokiraj samog sebe',
 'right-protect' => 'Promjena nivoa zaštite i uređivanje kaskadno zaštićenih stranica',
-'right-editprotected' => 'Uređivanje zaštićenih stranica (bez povezanih zaštita)',
+'right-editprotected' => 'Uređivanje stranice zaštićenih kao "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Uređivanje stranica zaštićenih kao  "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Uređivanje korisničkog interfejsa',
 'right-editusercssjs' => 'Uređivanje CSS i JS datoteka drugih korisnika',
 'right-editusercss' => 'Uređivanje CSS datoteka drugih korisnika',
 'right-edituserjs' => 'Uređivanje JS datoteka drugih korisnika',
+'right-editmyusercss' => 'Uredite svoje vlastite korisničke CSS datoteke',
+'right-editmyuserjs' => 'Uredite vlastite korisničke JavaScript datoteke',
+'right-viewmywatchlist' => 'Pogledaj svoj spisak praćenih stranica',
+'right-viewmyprivateinfo' => 'Vidite svoje privatne podatke (npr. adresa e-pošte, pravo ime)',
+'right-editmyprivateinfo' => 'Uredite svoje privatne podatke (npr. adresa e-pošte, pravo ime)',
+'right-editmyoptions' => 'Uredite svoje postavke',
 'right-rollback' => 'Brzo vraćanje izmjena na zadnjeg korisnika koji je uređivao određenu stranicu',
 'right-markbotedits' => 'Označavanje vraćenih izmjena kao izmjene bota',
 'right-noratelimit' => 'Izbjegavanje ograničenja uzrokovanih brzinom',
@@ -1630,9 +1672,14 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'action-userrights-interwiki' => 'uređujete korisnička prava korisnika na drugim wikijima',
 'action-siteadmin' => 'zaključavate ili otključavate bazu podataka',
 'action-sendemail' => 'pošalji e-mail poruke',
+'action-editmywatchlist' => 'uredite svoj spisak praćenih stranica',
+'action-viewmywatchlist' => 'pogledajte svoj spisak praćenih stranica',
+'action-viewmyprivateinfo' => 'pogledajte svoje privatne informacije',
+'action-editmyprivateinfo' => 'uredite svoje privatne podatke',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|promjena|promjene|promjena}}',
+'enhancedrc-history' => 'historija',
 'recentchanges' => 'Nedavne izmjene',
 'recentchanges-legend' => 'Postavke nedavnih izmjena',
 'recentchanges-summary' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
@@ -1672,7 +1719,6 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'recentchangeslinked-feed' => 'Srodne izmjene',
 'recentchangeslinked-toolbox' => 'Srodne izmjene',
 'recentchangeslinked-title' => 'Srodne promjene sa "$1"',
-'recentchangeslinked-noresult' => 'Nema izmjena na povezanim stranicama u zadanom periodu.',
 'recentchangeslinked-summary' => "Ova posebna stranica prikazuje promjene na povezanim stranicama.
 Stranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podebljane'''.",
 'recentchangeslinked-page' => 'Naslov stranice:',
@@ -1684,7 +1730,7 @@ Stranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podeblja
 'reuploaddesc' => 'Vratite se na upitnik za slanje.',
 'upload-tryagain' => 'Pošaljite izmijenjeni opis datoteke',
 'uploadnologin' => 'Niste prijavljeni',
-'uploadnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] da bi ste slali datoteke.',
+'uploadnologintext' => 'Morate biti $1 da bi ste slali datoteke.',
 'upload_directory_missing' => 'Folder za postavljanje ($1) nedostaje i webserver ga ne može napraviti.',
 'upload_directory_read_only' => 'Folder za postavljanje ($1) na webserveru je postavljen samo za čitanje.',
 'uploaderror' => 'Greška pri slanju',
@@ -1904,7 +1950,6 @@ Za optimalnu sigurnost, img_auth.php je onemogućena.',
 'http-read-error' => 'Greška pri čitanju HTTP.',
 'http-timed-out' => 'Istekao HTTP zahtjev.',
 'http-curl-error' => 'Greška pri otvaranju URLa: $1',
-'http-host-unreachable' => 'Ovaj URL nije bilo moguće otvoriti',
 'http-bad-status' => 'Nastao je problem tokom HTTP zahtjeva: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1935,6 +1980,9 @@ Možda možete pokušati kada bude manje opterećenje.',
 'listfiles_size' => 'Veličina',
 'listfiles_description' => 'Opis',
 'listfiles_count' => 'Verzije',
+'listfiles-latestversion' => 'Trenutna verzija',
+'listfiles-latestversion-yes' => 'Da',
+'listfiles-latestversion-no' => 'Ne',
 
 # File description page
 'file-anchor-link' => 'Datoteka',
@@ -2031,6 +2079,10 @@ Prije brisanja provjerite da li druge stranice vode na te šablone.',
 'randompage' => 'Slučajna stranica',
 'randompage-nopages' => 'Nema stranica u {{PLURAL:$2|slijedećem imenskom prostoru|slijedećim imenskim prostorima}}: "$1".',
 
+# Random page in category
+'randomincategory' => 'Slučajna stranica u kategoriji',
+'randomincategory-selectcategory-submit' => 'Idi',
+
 # Random redirect
 'randomredirect' => 'Slučajno preusmjerenje',
 'randomredirect-nopages' => 'Ne postoje preusmjerenja u imenskom prostoru "$1".',
@@ -2056,12 +2108,6 @@ Prije brisanja provjerite da li druge stranice vode na te šablone.',
 'statistics-users-active-desc' => 'Korisnici koju su izvršili akciju u toku {{PLURAL:$1|zadnjeg dana|zadnja $1 dana|zadnjih $1 dana}}',
 'statistics-mostpopular' => 'Najviše pregledane stranice',
 
-'disambiguations' => 'Stranice koje vode na čvor članke',
-'disambiguationspage' => '{{ns:template}}:Čvor',
-'disambiguations-text' => "Slijedeće stranice sadrže najmanje jedan link na '''čvor stranicom'''.
-Umjesto toga, one se trebaju povezati sa konkretnim konkretnim stranicom.<br />
-Stranica se smatra čvorom, ukoliko koristi šablon koji je povezan sa spiskom [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop-prop' => 'Naziv svojstva:',
 'pageswithprop-submit' => 'Idi',
 
@@ -2315,10 +2361,9 @@ Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti n
 'unwatchthispage' => 'Ukinite praćenje',
 'notanarticle' => 'Nije članak',
 'notvisiblerev' => 'Revizija je obrisana',
-'watchnochange' => 'Ništa što pratite nije promjenjeno u prikazanom vremenu.',
 'watchlist-details' => '{{PLURAL:$1|$1 stranica praćena|$1 stranice praćene|$1 stranica praćeno}} ne računajući stranice za razgovor.',
-'wlheader-enotif' => '* Obavještavanje e-poštom je omogućeno.',
-'wlheader-showupdated' => "* Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
+'wlheader-enotif' => 'Obavještavanje e-poštom je omogućeno.',
+'wlheader-showupdated' => "Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
 'watchmethod-recent' => 'provjerava se da li ima praćenih stranica u nedavnim izmjenama',
 'watchmethod-list' => 'provjerava se da li ima nedavnih izmjena u praćenim stranicama',
 'watchlistcontains' => 'Vaš spisak praćenih članaka sadrži $1 {{PLURAL:$1|stranicu|stranica}}.',
@@ -2566,7 +2611,7 @@ $1',
 'contributions' => 'Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}',
 'contributions-title' => 'Doprinosi korisnika $1',
 'mycontris' => 'Doprinos',
-'contribsub2' => 'Za $1 ($2)',
+'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Nisu nađene promjene koje zadovoljavaju ove uslove.',
 'uctop' => '(trenutno)',
 'month' => 'Od mjeseca (i ranije):',
@@ -2723,11 +2768,8 @@ Možda je već deblokirana.',
 Međutim, možda je blokirana kao dio bloka $2, koji se ne može deblokirati.',
 'ip_range_invalid' => 'Netačan raspon IP adresa.',
 'ip_range_toolarge' => 'Nisu dopuštene blokade veće od /$1.',
-'blockme' => 'Blokiraj me',
 'proxyblocker' => 'Bloker proksija',
-'proxyblocker-disabled' => 'Ova funkcija je onemogućena.',
 'proxyblockreason' => 'Vaša IP adresa je blokirana jer je ona otvoreni proksi.  Molimo vas da kontaktirate vašeg davatelja internetskih usluga (Internet Service Provider-a) ili tehničku podršku i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.',
-'proxyblocksuccess' => 'Proksi uspješno blokiran.',
 'sorbsreason' => 'Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL koji koristi {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL korišten od {{SITENAME}}.
 Ne možete napraviti račun',
@@ -2898,6 +2940,8 @@ Molimo posjetite [//www.mediawiki.org/wiki/Localisation MediaWiki lokalizaciju]
 'thumbnail-more' => 'uvećajte',
 'filemissing' => 'Nedostaje datoteka',
 'thumbnail_error' => 'Greška pri pravljenju umanjene slike: $1',
+'thumbnail_error_remote' => 'Poruka o grešci iz $1:
+$2',
 'djvu_page_error' => 'DjVu stranica je van opsega',
 'djvu_no_xml' => 'Za XML-datoteku se ne može pozvati DjVu datoteka',
 'thumbnail-temp-create' => 'Ne mogu da napravim privremenu smanjenu sliku',
@@ -3049,26 +3093,15 @@ Dopušta unos razloga u sažetak.',
 
 # Stylesheets
 'common.css' => '/* CSS umetnut ovdje primijenit će se na sve skinove */',
-'standard.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Standard skin */',
-'nostalgia.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Nostalgia skin */',
 'cologneblue.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Cologne Blue skin */',
 'monobook.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Monobook skin */',
-'myskin.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste MySkin skin */',
-'chick.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Chick skin */',
-'simple.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Simple skin */',
 'modern.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Modern skin */',
 'print.css' => '/* CSS umetnut ovdje uticat će na izgled isprintane stranice */',
-'handheld.css' => '/* CSS umetnut ovdje uticat će na ručne sprave koji rade na skinu konfigurisanom u $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike pri svakom učitavanju stranice. */',
-'standard.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Standard skin */',
-'nostalgia.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Nostalgia skin */',
 'cologneblue.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Cologne Blue skin */',
 'monobook.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste MonoBook skin */',
-'myskin.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste MySkin skin */',
-'chick.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Chick skin */',
-'simple.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Simple skin */',
 'modern.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Modern skin */',
 
 # Metadata
@@ -3141,13 +3174,8 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-category-files' => 'Broj datoteka',
 
 # Skin names
-'skinname-standard' => 'Klasično',
-'skinname-nostalgia' => 'Nostalgija',
 'skinname-cologneblue' => 'Kelnsko plavo',
 'skinname-monobook' => 'MonoKnjiga',
-'skinname-myskin' => 'MojaKoža',
-'skinname-chick' => 'Pile (chick)',
-'skinname-simple' => 'Jednostavna',
 'skinname-modern' => 'Moderna',
 
 # Patrolling
@@ -3224,11 +3252,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minute|$1 minuta}}',
 'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
 'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
+'weeks' => '{{PLURAL:$1|$1 sedmica}}',
 'months' => '{{PLURAL:$1|$1 mjesec|$1 mjeseci}}',
 'years' => '{{PLURAL:$1|$1 godina|$1 godine|$1 godina}}',
 'ago' => 'prije $1',
 'just-now' => 'upravo sad',
 
+# Human-readable timestamps
+'hours-ago' => 'prije $1 {{PLURAL:$1|sat|sata|sati}}',
+'minutes-ago' => 'prije $1 {{PLURAL:$1|minute|minute|minuta}}',
+'seconds-ago' => 'prije $1 {{PLURAL:$1|sekunde|sekunde|sekundi}}',
+'monday-at' => 'Ponedeljak u $1',
+'tuesday-at' => 'Utorak u $1',
+'wednesday-at' => 'Srijeda u $1',
+'thursday-at' => 'Četvrtak u $1',
+'friday-at' => 'Petak u $1',
+'saturday-at' => 'Subota u $1',
+'sunday-at' => 'Nedjelja u $1',
+'yesterday-at' => 'Jučer u $1',
+
 # Bad image list
 'bad_image_list' => "Koristi se sljedeći format:
 
@@ -3257,7 +3299,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Širina',
 'exif-imagelength' => 'Visina',
 'exif-bitspersample' => 'Bita po komponenti',
@@ -3435,7 +3477,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
 'exif-originalimageheight' => 'Visina slike prije nego što je odrezana',
 'exif-originalimagewidth' => 'Širina slike prije nego što je odrezana',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nekompresovano',
 'exif-compression-2' => 'CCITT Grupa 3 1 — Dimenzionalno izmijenjeo Huffmanovo šifriranje po dužini',
 'exif-compression-3' => 'CCITT Grupa 3 faks šifriranje',
@@ -3888,7 +3930,6 @@ Također možete [[Special:EditWatchlist|koristiti standardni uređivač]].',
 'version-other' => 'Ostalo',
 'version-mediahandlers' => 'Upravljači medije',
 'version-hooks' => 'Kuke',
-'version-extension-functions' => 'Funkcije proširenja (ekstenzije)',
 'version-parser-extensiontags' => "Parser proširenja (''tagovi'')",
 'version-parser-function-hooks' => 'Kuke parserske funkcije',
 'version-hook-name' => 'Naziv kuke',
@@ -3910,12 +3951,13 @@ Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] z
 'version-entrypoints-header-entrypoint' => 'Ulazna tačka',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Putanja datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Idi',
-'filepath-summary' => 'Ova posebna stranica prikazuje potpunu putanju za datoteku.
-Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktno sa, s njima povezanim, programom.',
+# Special:Redirect
+'redirect-submit' => 'Idi',
+'redirect-value' => 'Vrijednost:',
+'redirect-user' => 'Korisnički ID',
+'redirect-revision' => 'Verzija stranice',
+'redirect-file' => 'Naziv datoteke',
+'redirect-not-exists' => 'Vrijednost nije pronađena',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Pretraga za duplim datotekama',
@@ -3964,12 +4006,15 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'tags' => 'Oznake valjane izmjene',
 'tag-filter' => 'Filter [[Special:Tags|oznaka]]:',
 'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake}}]]: $2)',
 'tags-title' => 'Oznake',
 'tags-intro' => 'Ova stranica prikazuje spisak oznaka koje softver može staviti na svaku izmjenu i njihovo značenje.',
 'tags-tag' => 'Naziv oznake',
 'tags-display-header' => 'Vidljivost na spisku izmjena',
 'tags-description-header' => 'Puni opis značenja',
 'tags-hitcount-header' => 'Označene izmjene',
+'tags-active-yes' => 'Da',
+'tags-active-no' => 'Ne',
 'tags-edit' => 'uređivanje',
 'tags-hitcount' => '$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}',
 
@@ -4005,6 +4050,9 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'htmlform-submit' => 'Pošalji',
 'htmlform-reset' => 'Vrati izmjene',
 'htmlform-selectorother-other' => 'Ostalo',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Izaberite opciju',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 sa podrškom pretrage cijelog teksta',
@@ -4122,4 +4170,7 @@ Inače, možete ispuniti jednostavan obrazac ispod. Vaš komentar biti će dodan
 # Image rotation
 'rotate-comment' => 'Slika rotirana za $1 {{PLURAL:$1|stepen|stepeni}} u smjeru kazaljke na satu',
 
+# Limit report
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}',
+
 );
diff --git a/languages/messages/MessagesBug.php b/languages/messages/MessagesBug.php
index 64eb16bd..a8d0f1d5 100644
--- a/languages/messages/MessagesBug.php
+++ b/languages/messages/MessagesBug.php
@@ -248,9 +248,6 @@ $messages = array(
 'search-result-size' => '$1 ({{PLURAL:$2|1 ada|$2 ada}})',
 'search-redirect' => '(redirect $1)',
 
-# Quickbar
-'qbsettings-none' => 'Dégaga',
-
 # Preferences page
 'mypreferences' => 'Bérékkeŋeŋna iyya',
 'prefsnologin' => "Déppa ma'log attama'",
diff --git a/languages/messages/MessagesBxr.php b/languages/messages/MessagesBxr.php
new file mode 100644
index 00000000..88bc5d93
--- /dev/null
+++ b/languages/messages/MessagesBxr.php
@@ -0,0 +1,72 @@
+<?php
+/** Buryat (Russia) (буряад)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ * @comment falls back to Russian
+ *
+ */
+
+$fallback = 'ru';
+
+$namespaceNames = array(
+	NS_MEDIA            => 'Меди',
+	NS_SPECIAL          => 'Тусхай',
+	NS_TALK             => 'Хэлэлсэхэ',
+	NS_USER             => 'Хэрэглэгшэ',
+	NS_USER_TALK        => 'Хэрэглэгшые_хэлэлсэхэ',
+	NS_PROJECT_TALK     => '$1_тухай_хэлэлсэхэ',
+	NS_FILE             => 'Файл',
+	NS_FILE_TALK        => 'Файл_хэлэлсэхэ',
+	NS_MEDIAWIKI_TALK   => 'MediaWiki_хэлэлсэхэ',
+	NS_TEMPLATE         => 'Загбар',
+	NS_TEMPLATE_TALK    => 'Загбар_хэлэлсэхэ',
+	NS_HELP             => 'Туһаламжа',
+	NS_HELP_TALK        => 'Туһаламжа_хэлэлсэл',
+	NS_CATEGORY         => 'Категори',
+	NS_CATEGORY_TALK    => 'Категори_хэлэлсэхэ',
+);
+
+$namespaceAliases = array(
+	# Russian namespaces
+	'Обсуждение'                         => NS_TALK,
+	'Участник'                           => NS_USER,
+	'Обсуждение_участника'               => NS_USER_TALK,
+	'Обсуждение_{{GRAMMAR:genitive|$1}}' => NS_PROJECT_TALK,
+	'Обсуждение_файла'                   => NS_FILE_TALK,
+	'Обсуждение_MediaWiki'               => NS_MEDIAWIKI_TALK,
+	'Обсуждение_шаблона'                 => NS_TEMPLATE_TALK,
+	'Справка'                            => NS_HELP,
+	'Обсуждение_справки'                 => NS_HELP_TALK,
+	'Категория'                          => NS_CATEGORY,
+	'Обсуждение_категории'               => NS_CATEGORY_TALK,
+);
+
+// Remove Russian gender aliases
+$namespaceGenderAliases = array();
+
+$specialPageAliases = array(
+	'Activeusers'               => array( 'Эдэбхитэй_хэрэглэгшэд' ),
+	'Allmessages'               => array( 'Бүхы_зурбас' ),
+	'Allpages'                  => array( 'Соохи_бүхы_хуудаһан' ),
+	'Ancientpages'              => array( 'Хуушарһан_хуудаһан' ),
+	'Categories'                => array( 'Категоринууд' ),
+	'ComparePages'              => array( 'Хуудаһа_харисуулха' ),
+	'Confirmemail'              => array( 'Сахим_хаяг_баталха' ),
+	'CreateAccount'             => array( 'Данса_үүсхэхэ' ),
+	'Mypage'                    => array( 'Минии_хуудаһан' ),
+	'Mytalk'                    => array( 'Минии_хэлэлсэл' ),
+	'Myuploads'                 => array( 'Минии_ашаалһан_зүйл' ),
+	'Newpages'                  => array( 'Шэнэ_хуудаһан' ),
+	'Popularpages'              => array( 'Оло_уншагдаһан_хуудаһан' ),
+	'Protectedpages'            => array( 'Хамгаалалтатай_хуудаһан' ),
+	'Protectedtitles'           => array( 'Хамгаалалтатай_гаршаг' ),
+	'Recentchanges'             => array( 'Сайтдахи_хубилалтанууд' ),
+	'Upload'                    => array( 'Ашаалха' ),
+	'Userlogin'                 => array( 'Нэбтэрхэ' ),
+	'Userlogout'                => array( 'Гараха' ),
+);
+
diff --git a/languages/messages/MessagesCa.php b/languages/messages/MessagesCa.php
index 9db64c4c..759a4c10 100644
--- a/languages/messages/MessagesCa.php
+++ b/languages/messages/MessagesCa.php
@@ -18,12 +18,14 @@
  * @author Gemmaa
  * @author Grondin
  * @author Iradigalesc
+ * @author Jmarchn
  * @author Jordi Roqué
  * @author Juanpabl
  * @author Kaganer
  * @author Marcmpujol
  * @author Martorell
  * @author McDutchie
+ * @author Nemo bis
  * @author Pasqual (ca)
  * @author Paucabot
  * @author PerroVerd
@@ -31,6 +33,7 @@
  * @author Pitort
  * @author Pérez
  * @author Qllach
+ * @author QuimGil
  * @author SMP
  * @author Smeira
  * @author Solde
@@ -38,6 +41,7 @@
  * @author Ssola
  * @author Toniher
  * @author Vriullop
+ * @author XVEC
  * @author Àlex
  * @author לערי ריינהארט
  */
@@ -228,9 +232,6 @@ $messages = array(
 'tog-shownumberswatching' => "Mostra el nombre d'usuaris que hi vigilen",
 'tog-oldsig' => 'Signatura actual:',
 'tog-fancysig' => 'Tractar la signatura com a text wiki (sense enllaç automàtic)',
-'tog-externaleditor' => "Utilitza per defecte un editor extern (opció per a experts, requereix la configuració adient de l'ordinador, [//www.mediawiki.org/wiki/Manual:External_editors consulteu-ho al manual])",
-'tog-externaldiff' => "Utilitza per defecte un altre visualitzador de diferències (opció per a experts, requereix la configuració adient de l'ordinador, [//www.mediawiki.org/wiki/Manual:External_editors consulteu-ho al manual])",
-'tog-showjumplinks' => "Habilita els enllaços de dreceres d'accessibilitat",
 'tog-uselivepreview' => 'Utilitza la previsualització automàtica (cal JavaScript) (experimental)',
 'tog-forceeditsummary' => "Avisa'm en deixar el resum de la modificació en blanc",
 'tog-watchlisthideown' => 'Amaga les meues edicions de la llista de seguiment',
@@ -244,6 +245,8 @@ $messages = array(
 'tog-showhiddencats' => 'Mostra les categories ocultes',
 'tog-noconvertlink' => 'Inhabilita la conversió dels títols dels enllaços',
 'tog-norollbackdiff' => 'Omet la pàgina de diferències després de realitzar una reversió',
+'tog-useeditwarning' => "Avisa'm quan surti d'una pàgina d'edició amb canvis sense desar",
+'tog-prefershttps' => 'Utilitza sempre una connexió segura en iniciar una sessió',
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Mai',
@@ -307,6 +310,18 @@ $messages = array(
 'oct' => 'oct',
 'nov' => 'nov',
 'dec' => 'des',
+'january-date' => '$1 de gener',
+'february-date' => '$1 de febrer',
+'march-date' => '$1 de març',
+'april-date' => "$1 d'abril",
+'may-date' => '$1 de maig',
+'june-date' => '$1 de juny',
+'july-date' => '$1 de juliol',
+'august-date' => "$1 d'agost",
+'september-date' => '$1 de setembre',
+'october-date' => "$1 d'octubre",
+'november-date' => '$1 de novembre',
+'december-date' => '$1 de desembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categories}}',
@@ -389,6 +404,7 @@ $messages = array(
 'create-this-page' => 'Crea aquesta pàgina',
 'delete' => 'Elimina',
 'deletethispage' => 'Elimina la pàgina',
+'undeletethispage' => "Desfés l'eliminació d'aquesta pàgina",
 'undelete_short' => "Restaura {{PLURAL:$1|l'edició eliminada|$1 edicions eliminades}}",
 'viewdeleted_short' => 'Mostra {{PLURAL:$1|una edició eliminada|$1 edicions eliminades}}',
 'protect' => 'Protecció',
@@ -432,7 +448,7 @@ $1",
 'pool-queuefull' => 'La cua de treball és plena',
 'pool-errorunknown' => 'Error desconegut',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Quant al projecte {{SITENAME}}',
 'aboutpage' => 'Project:Quant a',
 'copyright' => "El contingut està disponible sota la llicència $1 si no s'indica el contrari.",
@@ -442,7 +458,6 @@ $1",
 'disclaimers' => 'Avís general',
 'disclaimerpage' => 'Project:Avís general',
 'edithelp' => 'Ajuda',
-'edithelppage' => "Help:Com s'edita una pàgina",
 'helppage' => 'Help:Índex',
 'mainpage' => 'Pàgina principal',
 'mainpage-description' => 'Pàgina principal',
@@ -519,17 +534,11 @@ Vegeu la llista de pàgines especials a [[Special:SpecialPages]].',
 # General errors
 'error' => 'Error',
 'databaseerror' => "S'ha produït un error en la base de dades",
-'dberrortext' => "S'ha produït un error de sintaxi en una consulta a la base de dades.
-Açò podria indicar un error en el programari.
-La darrera consulta que s'ha intentat fer ha estat:
-<blockquote><code>$1</code></blockquote>
-des de la funció «<code>$2</code>».
-L'error de retorn ha estat «<samp>$3: $4</samp>».",
-'dberrortextcl' => "S'ha produït un error de sintaxi en una consulta a la base de dades.
-La darrera consulta que s'ha intentat fer ha estat:
-<blockquote><tt>$1</tt></blockquote>
-des de la funció «<tt>$2</tt>».
-L'error de retorn ha estat «<tt>$3: $4</tt>».",
+'databaseerror-text' => "S'ha produït un error en la consulta de la base de dades.
+Això pot indicar un error en el programari.",
+'databaseerror-textcl' => "S'ha produït un error en la consulta de la base de dades.",
+'databaseerror-query' => 'Consulta: $1',
+'databaseerror-function' => 'Funció: $1',
 'laggedslavemode' => 'Avís: La pàgina podria mancar de modificacions recents.',
 'readonly' => 'La base de dades es troba bloquejada',
 'enterlockreason' => 'Escriviu una raó pel bloqueig, així com una estimació de quan tindrà lloc el desbloqueig',
@@ -563,6 +572,7 @@ Potser ja ha estat esborrat per algú altre.",
 'cannotdelete-title' => 'No es pot suprimir la pàgina " $1 "',
 'delete-hook-aborted' => 'Un «hook» ha interromput la supressió.
 No ha donat cap explicació.',
+'no-null-revision' => "No s'ha pogut crear una nova revisió nul·la de la pàgina «$1»",
 'badtitle' => 'El títol no és correcte',
 'badtitletext' => 'El títol de la pàgina que heu introduït no és correcte, és en blanc o conté un enllaç trencat amb un altre projecte. També podria contenir algun caràcter no acceptat als títols de pàgina.',
 'perfcached' => "Les dades següents es troben a la memòria cau i podrien no estar al dia. Hi ha un màxim {{PLURAL:$1|d'un resultat|de $1 resultats}} disponibles a la memòria cau.",
@@ -581,12 +591,15 @@ Consulta: $2',
 'protectedinterface' => "Aquesta pàgina proporciona el text de la interfície del software d'aquest wiki i està protegida per evitar els abusos.
 Per agregar o canviar les traduccions per a tots els wikis, si us plau fes servir [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
 'editinginterface' => "'''Avís:''' Esteu editant una pàgina que conté cadenes de text per a la interfície d'aquest programari. Tingueu en compte que els canvis que es fan a aquesta pàgina afecten a l'aparença de la interfície d'altres usuaris. Per afegir o modificar traduccions a totes les wikis, plantegeu-vos utilitzar la [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
-'sqlhidden' => '(consulta SQL oculta)',
 'cascadeprotected' => "Aquesta pàgina està protegida i no es pot modificar perquè està inclosa en {{PLURAL:$1|la següent pàgina, que té|les següents pàgines, que tenen}} activada l'opció de «protecció en cascada»:
 $2",
 'namespaceprotected' => "No teniu permís per a modificar pàgines en l'espai de noms '''$1'''.",
 'customcssprotected' => "No teniu permisos per editar la pàgina CSS perquè conté els paràmetres personals d'un altre usuari.",
 'customjsprotected' => "No teniu permisos per editar la pàgina JavaScript perquè conté els paràmetres personals d'un altre usuari.",
+'mycustomcssprotected' => 'No tens permís per editar aquesta pàgina CSS.',
+'mycustomjsprotected' => 'No tens permís per editar aquesta pàgina JavaScript.',
+'myprivateinfoprotected' => 'No tens permís per editar la teva informació privada.',
+'mypreferencesprotected' => 'No tens permís per editar les teves preferències.',
 'ns-specialprotected' => 'No es poden modificar les pàgines especials.',
 'titleprotected' => "La creació d'aquesta pàgina està protegida per [[User:$1|$1]].
 Els seus motius han estat: «''$2''».",
@@ -610,10 +623,19 @@ Tingueu en compte que, fins que buideu la memòria cau del navegador, algunes p
 'welcomecreation-msg' => 'El vostre compte ha estat creat.
 No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITENAME}}]].',
 'yourname' => "Nom d'usuari",
+'userlogin-yourname' => 'Usuari',
+'userlogin-yourname-ph' => "Introduïu el vostre nom d'usuari",
+'createacct-another-username-ph' => "Introdueix el nom d'usuari",
 'yourpassword' => 'Contrasenya',
+'userlogin-yourpassword' => 'Contrasenya',
+'userlogin-yourpassword-ph' => 'Introduïu la vostra contrasenya',
+'createacct-yourpassword-ph' => 'Introduïu una contrasenya',
 'yourpasswordagain' => 'Escriviu una altra vegada la contrasenya',
+'createacct-yourpasswordagain' => 'Confirmeu la contrasenya',
+'createacct-yourpasswordagain-ph' => 'Introduïu de nou la contrasenya',
 'remembermypassword' => 'Recorda la contrasenya entre sessions (per un màxim de $1 {{PLURAL:$1|dia|dies}})',
-'securelogin-stick-https' => "Roman connectat via HTTPS desprès d'autenticar-se",
+'userlogin-remembermypassword' => 'Mantén-me connectat',
+'userlogin-signwithsecure' => 'Connexió segura',
 'yourdomainname' => 'El vostre domini',
 'password-change-forbidden' => 'No podeu canviar les contrasenyes en aquest wiki.',
 'externaldberror' => "Hi ha hagut una fallida en el servidor d'autenticació externa de la base de dades i no teniu permís per a actualitzar el vostre compte d'accès extern.",
@@ -625,18 +647,44 @@ No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITEN
 'logout' => 'Finalitza la sessió',
 'userlogout' => 'Finalitza la sessió',
 'notloggedin' => 'No us heu identificat',
+'userlogin-noaccount' => 'No teniu cap compte?',
+'userlogin-joinproject' => 'Uniu-vos a {{SITENAME}}',
 'nologin' => "No teniu un compte? '''$1'''.",
 'nologinlink' => 'Crea un compte',
 'createaccount' => 'Crea un compte',
 'gotaccount' => 'Ja teniu un compte? $1.',
 'gotaccountlink' => 'Inicia una sessió',
 'userlogin-resetlink' => "Heu oblidat les vostres dades d'accés?",
+'userlogin-resetpassword-link' => 'Reinicia la contrasenya',
+'helplogin-url' => 'Help:Registrar-se',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda]]',
+'userlogin-loggedin' => 'Heu iniciat una sessió com {{GENDER:$1|$1}}.
+Feu servir el formulari de sota per iniciar la sessió com un altre usuari.',
+'userlogin-createanother' => 'Crea un altre compte',
+'createacct-join' => 'Introduïu les vostres dades.',
+'createacct-another-join' => 'Introdueix la informació del nou compte a continuació:',
+'createacct-emailrequired' => 'Adreça de correu electrònic',
+'createacct-emailoptional' => 'Adreça de correu electrònic (opcional)',
+'createacct-email-ph' => 'Introduïu la vostra adreça de correu electrònic',
+'createacct-another-email-ph' => 'Introdueix una adreça de correu electrònic',
 'createaccountmail' => "Utilitza una contrasenya aleatòria temporal i envia-la a l'adreça de correu indicada",
+'createacct-realname' => 'Nom real (opcional)',
 'createaccountreason' => 'Motiu:',
+'createacct-reason' => 'Motiu',
+'createacct-reason-ph' => 'Per què creeu un altre compte',
+'createacct-captcha' => 'Control de seguretat',
+'createacct-imgcaptcha-ph' => 'Introduïu el text que apareix a dalt',
+'createacct-submit' => 'Crea el meu compte',
+'createacct-another-submit' => 'Crea un altre compte',
+'createacct-benefit-heading' => '{{SITENAME}} és feta per gent com tu.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edició|edicions}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pàgina|pàgines}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|col·laborador recent|col·laboradors recents}}',
 'badretype' => 'Les contrasenyes que heu introduït no coincideixen.',
 'userexists' => 'El nom que heu entrat ja és en ús.
 Escolliu-ne un de diferent.',
 'loginerror' => "Error d'inici de sessió",
+'createacct-error' => 'Error de creació de compte',
 'createaccounterror' => "No s'ha pogut crear el compte: $1",
 'nocookiesnew' => "S'ha creat el compte d'usuari, però no esteu enregistrat. El projecte {{SITENAME}} usa galetes per enregistrar els usuaris. Si us plau activeu-les, per a poder enregistrar-vos amb el vostre nom d'usuari i la clau.",
 'nocookieslogin' => 'El programari {{SITENAME}} utilitza galetes per enregistrar usuaris. Teniu les galetes desactivades. Activeu-les i torneu a provar.',
@@ -691,10 +739,12 @@ Introduïu una adreça amb un format adequat o bé buideu el camp.",
 Si no hi teniu cap relació i aquest compte ha estat creat per error, simplement ignoreu el missatge.",
 'usernamehasherror' => "El nom d'usuari no pot contenir caràcters hash",
 'login-throttled' => "Heu realitzat massa intents d'accés a la sessió.
-Si us plau, esperi abans de tornar-ho a intentar.",
+Espereu $1 abans de tornar-ho a provar.",
 'login-abort-generic' => "L'entrada al compte d'usuari no ha reeixit - Abortada",
 'loginlanguagelabel' => 'Llengua: $1',
 'suspicious-userlogout' => "S'ha denegat la vostra petició per tancar la sessió ja què sembla que va ser enviada per un navegador defectuós o un proxy cau.",
+'createacct-another-realname-tip' => "El nom real és opcional.
+Si decidiu proporcionar-lo, s'utilitzarà per a reconèixer a l'usuari el seu treball.",
 
 # Email sending
 'php-mail-error-unknown' => 'Error desconegut en la funció mail() de PHP',
@@ -710,8 +760,7 @@ Si us plau, esperi abans de tornar-ho a intentar.",
 'newpassword' => 'Contrasenya nova',
 'retypenew' => 'Torneu a escriure la nova contrasenya:',
 'resetpass_submit' => 'Definiu una contrasenya i inicieu una sessió',
-'resetpass_success' => "La vostra contrasenya s'ha canviat correctament!
-Ara s'està iniciant la sessió...",
+'changepassword-success' => "S'ha canviat la vostra contrasenya amb èxit!",
 'resetpass_forbidden' => 'No poden canviar-se les contrasenyes',
 'resetpass-no-info' => "Heu d'estar registrats en un compte per a poder accedir directament a aquesta pàgina.",
 'resetpass-submit-loggedin' => 'Canvia la contrasenya',
@@ -723,10 +772,11 @@ Deveu haver canviat la vostra contrasenya o demanat una nova contrasenya tempora
 
 # Special:PasswordReset
 'passwordreset' => 'Restablir contrasenya',
-'passwordreset-text' => 'Completeu el següent formulari per reinicialitzar la vostra contrasenya',
+'passwordreset-text-one' => 'Cal completar aquest formulari per reiniciar la contrasenya',
+'passwordreset-text-many' => '{{PLURAL:$1|Ompliu un dels camps per a reiniciar la vostra contrasenya.}}',
 'passwordreset-legend' => 'Restablir contrasenya',
 'passwordreset-disabled' => "S'ha desactivat el restabliment de contranyes en aquest wiki.",
-'passwordreset-pretext' => '{{PLURAL:$1||Introduïu un dels elements de dades següents}}',
+'passwordreset-emaildisabled' => 'Les opcions de correu electrònic no estan habilitades en aquest wiki.',
 'passwordreset-username' => "Nom d'usuari:",
 'passwordreset-domain' => 'Domini',
 'passwordreset-capture' => 'Veure el missatge de correu electrònic?',
@@ -749,7 +799,7 @@ Hauríeu d'entrar ara per fixar una nova contrasenya. Si algú que no sou vós 
 Contrasenya temporal: $2",
 'passwordreset-emailsent' => "S'ha enviat un correu de reinicialització de contrasenya.",
 'passwordreset-emailsent-capture' => "S'ha enviat un correu electrònic de reinicialització de contrasenya, tal com es mostra a continuació.",
-'passwordreset-emailerror-capture' => "S'ha generat un missatge recordatori de correu electrònic, que es mostra a continuació, però ha fallat l'enviament a l'usuari: $1",
+'passwordreset-emailerror-capture' => "S'ha generat un correu electrònic de renovació de contrasenya, que es mostra a continuació, però ha fallat l'enviament a {{GENDER:$2:l'usuari|la usuària}}: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Canvi de correu electrònic',
@@ -763,6 +813,19 @@ Contrasenya temporal: $2",
 'changeemail-submit' => 'Canvia de correu electrònic',
 'changeemail-cancel' => 'Cancel·la',
 
+# Special:ResetTokens
+'resettokens' => 'Reinicia els testimonis',
+'resettokens-text' => "Des d'aquí podeu reiniciar els testimonis que permeten l'accés a certes dades privades associades amb el vostre compte.
+
+Ho hauríeu de fer si accidentalment els heu compartit amb algú o si el vostre compte ha estat compromès.",
+'resettokens-no-tokens' => 'No hi ha testimonis per reiniciar.',
+'resettokens-legend' => 'Reinicia els testimonis',
+'resettokens-tokens' => 'Testimonis:',
+'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => 'Testimoni del canal web (Atom/RSS) dels [[Special:Watchlist|canvis a la llista de seguiment]]',
+'resettokens-done' => "S'han reiniciat els testimonis.",
+'resettokens-resetbutton' => 'Reinicia els testimonis seleccionats',
+
 # Edit page toolbar
 'bold_sample' => 'Text en negreta',
 'bold_tip' => 'Text en negreta',
@@ -957,12 +1020,15 @@ No s'ha donat cap explicació.",
 Sembla haver estat esborrada.",
 'edit-conflict' => "Conflicte d'edició.",
 'edit-no-change' => 'La vostra modificació ha estat ignorada perquè no feia cap canvi al text.',
+'postedit-confirmation' => 'La modificació ha estat desada.',
 'edit-already-exists' => "No s'ha pogut crear una pàgina.
 Ja existeix.",
 'defaultmessagetext' => 'Missatge per defecte',
 'content-failed-to-parse' => "Ha fallat l'anàlisi del contingut de $2 per al model $1: $3",
 'invalid-content-data' => 'Dades de contingut no vàlides',
 'content-not-allowed-here' => 'No és permés el contingut "$1" a la pàgina [[$2]]',
+'editwarning-warning' => "Si sortiu d'aquesta pàgina perdreu tots els canvis que hàgiu fet.
+Si teniu un compte d'usuari, podeu eliminar aquest avís a la secció «Caixa d'edició» de les vostres preferències.",
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -997,6 +1063,7 @@ Se n'han omès els arguments.",
 'undo-failure' => 'No pot desfer-se la modificació perquè hi ha edicions entre mig que hi entren en conflicte.',
 'undo-norev' => "No s'ha pogut desfer l'edició perquè no existeix o ha estat esborrada.",
 'undo-summary' => 'Es desfà la revisió $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussió]])',
+'undo-summary-username-hidden' => "Desfés la revisió $1 d'un usuari ocult",
 
 # Account creation failure
 'cantcreateaccounttitle' => 'No es pot crear el compte',
@@ -1176,6 +1243,7 @@ Assegureu-vos que aquest canvi mantindrà la continuïtat històrica de la pàgi
 'compareselectedversions' => 'Compara les versions seleccionades',
 'showhideselectedversions' => 'Mostra/oculta les versions seleccionades',
 'editundo' => 'desfés',
+'diff-empty' => '(Cap diferència)',
 'diff-multi' => '({{PLURAL:$1|Hi ha una revisió intermèdia |Hi ha $1 revisions intermèdies}} sense mostrar fetes per {{PLURAL:$2|un usuari|$2 usuaris}})',
 'diff-multi-manyusers' => "({{PLURAL:$1|Hi ha una revisió intermèdia|Hi ha $1 revisions intermèdies}} sense mostrar fetes per més {{PLURAL:$2|d'un usuari|de $2 usuaris}})",
 'difference-missing-revision' => "{{PLURAL:$2|Una revisió|$2 revisions}} d'aquesta diferència ($1) no {{PLURAL:$2|s'ha|s'han}} trobat.
@@ -1203,7 +1271,6 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Opcions de cerca',
 'searchmenu-exists' => "'''Hi ha una pàgina anomenada «[[:$1]]» en aquest wiki'''",
 'searchmenu-new' => "'''Creeu la pàgina «[[:$1]]» en aquest wiki!'''",
-'searchhelp-url' => 'Help:Ajuda',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Mostra pàgines amb aquest prefix]]',
 'searchprofile-articles' => 'Pàgines de contingut',
 'searchprofile-project' => "Pàgines d'ajuda i de projecte",
@@ -1244,15 +1311,7 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
 'powersearch-togglenone' => 'Cap',
 'search-external' => 'Cerca externa',
 'searchdisabled' => 'La cerca dins el projecte {{SITENAME}} està inhabilitada. Mentrestant, podeu cercar a través de Google, però tingueu en compte que la seua base de dades no estarà actualitzada.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Cap',
-'qbsettings-fixedleft' => "Fixa a l'esquerra",
-'qbsettings-fixedright' => 'Fixa a la dreta',
-'qbsettings-floatingleft' => "Surant a l'esquerra",
-'qbsettings-floatingright' => 'Surant a la dreta',
-'qbsettings-directionality' => "Fix, segons la direcció d'escriptura del vostre idioma",
+'search-error' => "S'ha produït un error durant la recerca: $1",
 
 # Preferences page
 'preferences' => 'Preferències',
@@ -1286,7 +1345,6 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
 'resetprefs' => 'Esborra els canvis no guardats',
 'restoreprefs' => 'Restaura les preferències per defecte',
 'prefs-editing' => "Caixa d'edició",
-'prefs-edit-boxsize' => "Mida de la finestra d'edició.",
 'rows' => 'Files',
 'columns' => 'Columnes',
 'searchresultshead' => 'Preferències de la cerca',
@@ -1297,9 +1355,9 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
 'recentchangesdays-max' => '(màxim $1 {{PLURAL:$1|dia|dies}})',
 'recentchangescount' => "Nombre d'edicions a mostrar per defecte:",
 'prefs-help-recentchangescount' => 'Inclou els canvis recents, els historials de pàgines i els registres.',
-'prefs-help-watchlist-token' => 'Si ompliu aquest camp amb una clau secreta es generarà un fil RSS per a la vostra llista de seguiment.
-Aquell qui conegui aquesta clau serà capaç de llegir la vostra llista de seguiment, per tant esculliu un valor segur.
-A continuació es mostra un valor generat de forma aleatòria que podeu fer servir: $1',
+'prefs-help-watchlist-token2' => 'Aquesta és la clau secreta pel canal de continguts de la vostra llista de seguiment.
+Qualsevol que la conegui podria llegir la vostra llista de seguiment, així que no la compartiu.
+[[Special:ResetTokens|Cliqueu aquí si voleu restaurar-la]].',
 'savedprefs' => "S'han desat les vostres preferències",
 'timezonelegend' => 'Fus horari:',
 'localtime' => 'Hora local:',
@@ -1330,7 +1388,6 @@ A continuació es mostra un valor generat de forma aleatòria que podeu fer serv
 'prefs-reset-intro' => 'Podeu usar aquesta pàgina per a restablir les vostres preferències als valors per defecte.
 No es podrà desfer el canvi.',
 'prefs-emailconfirm-label' => 'Confirmació de correu electrònic:',
-'prefs-textboxsize' => "Mida de la caixa d'edició",
 'youremail' => 'Correu electrònic:',
 'username' => "{{GENDER:$1|Nom d'usuari}}:",
 'uid' => "{{GENDER:$1|Usuari}} Identificador d'usuari:",
@@ -1361,6 +1418,8 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'prefs-dateformat' => 'Format de la data',
 'prefs-timeoffset' => 'Decalatge horari',
 'prefs-advancedediting' => 'Opcions generals',
+'prefs-editor' => 'Edició',
+'prefs-preview' => 'Previsualització',
 'prefs-advancedrc' => 'Opcions avançades',
 'prefs-advancedrendering' => 'Opcions avançades',
 'prefs-advancedsearchoptions' => 'Opcions avançades',
@@ -1368,7 +1427,9 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'prefs-displayrc' => "Opcions d'aparença",
 'prefs-displaysearchoptions' => 'Opcions de visualització',
 'prefs-displaywatchlist' => 'Opcions de visualització',
+'prefs-tokenwatchlist' => 'Testimoni',
 'prefs-diffs' => 'Difs',
+'prefs-help-prefershttps' => 'Aquesta preferència tindrà efecte quan inicieu una nova sessió.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => "L'adreça de correu electrònic sembla vàlida",
@@ -1395,6 +1456,8 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'userrights-notallowed' => "No teniu autorització per concedir o retirar permisos d'usuari.",
 'userrights-changeable-col' => 'Grups que podeu canviar',
 'userrights-unchangeable-col' => 'Grups que no podeu canviar',
+'userrights-conflict' => "Conflicte de canvis dels permisos d'usuari. Reviseu i confirmeu els canvis.",
+'userrights-removed-self' => 'Heu suprimit els propis permisos correctament. Per tant, ja no podreu tornar a accedir a aquesta pàgina.',
 
 # Groups
 'group' => 'Grup:',
@@ -1460,11 +1523,19 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'right-proxyunbannable' => 'Evitar els blocatges automàtics a proxies',
 'right-unblockself' => 'Desblocar-se a si mateixos',
 'right-protect' => 'Canviar el nivell de protecció i modificar pàgines protegides',
-'right-editprotected' => 'Editar pàgines protegides (sense protecció de cascada)',
+'right-editprotected' => 'Modificar pàgines protegides (sense protecció de cascada)',
+'right-editsemiprotected' => 'Edita les pàgines protegides com «{{int:protect-level-autoconfirmed}}»',
 'right-editinterface' => "Editar la interfície d'usuari",
 'right-editusercssjs' => "Editar els fitxers de configuració CSS i JS d'altres usuaris",
 'right-editusercss' => "Editar els fitxers de configuració CSS d'altres usuaris",
 'right-edituserjs' => "Editar els fitxers de configuració JS d'altres usuaris",
+'right-editmyusercss' => 'Editeu els fitxers CSS propis',
+'right-editmyuserjs' => 'Editeu els propis fitxers de JavaScript',
+'right-viewmywatchlist' => 'Mostra la llista de seguiment pròpia',
+'right-editmywatchlist' => 'Edita la llista de seguiment pròpia. Tingueu en compte que algunes accions encara afegiran pàgina fins i tot sense aquest permís.',
+'right-viewmyprivateinfo' => 'Mostra les dades privades (p. ex., adreça electrònica o nom real)',
+'right-editmyprivateinfo' => 'Modifica les dades privades  (p. ex., adreça electrònica o nom real)',
+'right-editmyoptions' => 'Edita les pròpies preferències',
 'right-rollback' => "Revertir ràpidament l'últim editor d'una pàgina particular",
 'right-markbotedits' => 'Marcar les reversions com a edicions de bot',
 'right-noratelimit' => "No veure's afectat pels límits d'accions",
@@ -1526,12 +1597,19 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'action-userrights-interwiki' => "modificar permisos d'usuari en altres wikis",
 'action-siteadmin' => 'bloquejar o desbloquejar la base de dades',
 'action-sendemail' => 'enviar missatges de correu',
+'action-editmywatchlist' => 'edita la llista de seguiment',
+'action-viewmywatchlist' => 'mostra la llista de seguiment',
+'action-viewmyprivateinfo' => 'mostra la informació personal',
+'action-editmyprivateinfo' => 'edita la informació personal',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|canvi|canvis}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|des de la darrera visita}}',
+'enhancedrc-history' => 'historial',
 'recentchanges' => 'Canvis recents',
 'recentchanges-legend' => 'Opcions de canvis recents',
 'recentchanges-summary' => 'Seguiu els canvis recents del projecte {{SITENAME}} en aquesta pàgina.',
+'recentchanges-noresult' => 'Cap canvi corresponent a aquests criteris en el període indicat.',
 'recentchanges-feed-description' => 'Segueix en aquest canal els canvis més recents del wiki.',
 'recentchanges-label-newpage' => 'Aquesta modificació inicià una pàgina',
 'recentchanges-label-minor' => 'Aquesta és una modificació menor',
@@ -1568,7 +1646,6 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'recentchangeslinked-feed' => 'Canvis relacionats',
 'recentchangeslinked-toolbox' => "Seguiment d'enllaços",
 'recentchangeslinked-title' => 'Canvis relacionats amb «$1»',
-'recentchangeslinked-noresult' => 'No ha hagut cap canvi a les pàgines enllaçades durant el període de temps.',
 'recentchangeslinked-summary' => "A continuació trobareu una llista dels canvis recents a les pàgines enllaçades des de la pàgina donada (o entre els membres d'una categoria especificada).
 Les pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en '''negreta'''.",
 'recentchangeslinked-page' => 'Nom de la pàgina:',
@@ -1580,8 +1657,7 @@ Les pàgines de la vostra [[Special:Watchlist|llista de seguiment]] apareixen en
 'reuploaddesc' => 'Torna al formulari per apujar.',
 'upload-tryagain' => 'Envia la descripció del fitxer modificat',
 'uploadnologin' => 'No heu iniciat una sessió',
-'uploadnologintext' => "Heu d'[[Special:UserLogin|iniciar una sessió]]
-per a penjar-hi fitxers.",
+'uploadnologintext' => 'Heu de $1 per a penjar-hi fitxers.',
 'upload_directory_missing' => "No s'ha trobat el directori de càrrega ($1) i tampoc no ha pogut ser creat pel servidor web.",
 'upload_directory_read_only' => 'El servidor web no pot escriure al directori de càrrega ($1)',
 'uploaderror' => "S'ha produït un error en l'intent de carregar",
@@ -1787,7 +1863,6 @@ Per seguretat, img_auth.php està desactivat.",
 'http-read-error' => 'Error de lectura HTTP.',
 'http-timed-out' => 'La petició HTTP ha expirat.',
 'http-curl-error' => "Error en recuperar l'URL: $1",
-'http-host-unreachable' => "No s'ha pogut accedir a l'URL.",
 'http-bad-status' => 'Hi ha hagut un problema durant la petició HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1816,6 +1891,9 @@ Si filtreu per usuari només es mostraran els fitxers la versió més recent del
 'listfiles_size' => 'Mida (octets)',
 'listfiles_description' => 'Descripció',
 'listfiles_count' => 'Versions',
+'listfiles-show-all' => 'Inclou versions antigues de les imatges',
+'listfiles-latestversion' => 'Versió actual',
+'listfiles-latestversion-yes' => 'Sí',
 
 # File description page
 'file-anchor-link' => 'Fitxer',
@@ -1910,6 +1988,13 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
 'randompage' => "Pàgina a l'atzar",
 'randompage-nopages' => "No hi ha cap pàgina en {{PLURAL:$2|l'espai de noms següent|els espais de noms següents}}: $1.",
 
+# Random page in category
+'randomincategory' => 'Pàgina aleatòria en la categoria',
+'randomincategory-invalidcategory' => '«$1» no és un nom de categoria vàlid.',
+'randomincategory-nopages' => 'No hi ha pàgines a la categoria [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => "Obté una pàgina a l'atzar de la categoria: $1 $2.",
+'randomincategory-selectcategory-submit' => 'Vés-hi',
+
 # Random redirect
 'randomredirect' => "Redirecció a l'atzar",
 'randomredirect-nopages' => "No hi ha cap redirecció a l'espai de noms «$1».",
@@ -1935,17 +2020,13 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
 'statistics-users-active-desc' => "Usuaris que han dut a terme alguna acció en {{PLURAL:$1|l'últim dia|els últims $1 dies}}",
 'statistics-mostpopular' => 'Pàgines més visualitzades',
 
-'disambiguations' => 'Pàgines que enllacen a pàgines de desambiguació',
-'disambiguationspage' => 'Template:Desambiguació',
-'disambiguations-text' => "Les següents pàgines tenen algun enllaç a una '''pàgina de desambiguació'''.
-És possible que hagin d'enllaçar a una altra pàgina més apropiada.<br />
-Una pàgina es tracta com de desambiguació si utilitza una plantilla que està enllaçada a [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Pàgines amb una propietat de pàgina',
 'pageswithprop-legend' => 'Pàgines amb una propietat de pàgina',
 'pageswithprop-text' => 'Aquesta pàgina llista les pàgines que utilitzen una propietat de pàgina en particular.',
 'pageswithprop-prop' => 'Nom de la propietat:',
 'pageswithprop-submit' => 'Vés',
+'pageswithprop-prophidden-long' => 'valor de propietat text llarg ocult ($1)',
+'pageswithprop-prophidden-binary' => 'valor de propietat binària oculta ($1)',
 
 'doubleredirects' => 'Redireccions dobles',
 'doubleredirectstext' => 'Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.
@@ -2003,6 +2084,7 @@ Les entrades <del>ratllades</del> s\'han resolt.',
 'mostrevisions' => 'Pàgines més modificades',
 'prefixindex' => 'Totes les pàgines per prefix',
 'prefixindex-namespace' => 'Totes les pàgines amb prefix (espai de noms $1)',
+'prefixindex-strip' => 'Suprimeix el prefix a la llista',
 'shortpages' => 'Pàgines curtes',
 'longpages' => 'Pàgines llargues',
 'deadendpages' => 'Pàgines atzucac',
@@ -2018,6 +2100,7 @@ Les entrades <del>ratllades</del> s\'han resolt.',
 'listusers' => "Llista d'usuaris",
 'listusers-editsonly' => 'Mostra només usuaris amb edicions',
 'listusers-creationsort' => 'Ordena per data de creació',
+'listusers-desc' => 'Ordena en ordre descendent',
 'usereditcount' => '$1 {{PLURAL:$1|modificació|modificacions}}',
 'usercreated' => '{{GENDER:$3|Creat}}: $1 a les $2',
 'newpages' => 'Pàgines noves',
@@ -2194,10 +2277,9 @@ S\'hi mostraran els canvis futurs que tinguin lloc en aquesta pàgina i la corre
 'unwatchthispage' => 'Desatén',
 'notanarticle' => 'No és una pàgina amb contingut',
 'notvisiblerev' => 'La versió ha estat esborrada',
-'watchnochange' => "No s'ha editat cap dels elements que vigileu en el període de temps que es mostra.",
 'watchlist-details' => 'Teniu $1 {{PLURAL:$1|pàgina vigilada|pàgines vigilades}}, sense comptar les pàgines de discussió.',
-'wlheader-enotif' => "* S'ha habilitat la notificació per correu electrònic.",
-'wlheader-showupdated' => "* Les pàgines que s'han canviat des de la vostra darrera visita es mostren '''en negreta'''",
+'wlheader-enotif' => 'La notificació per correu electrònic està habilitada.',
+'wlheader-showupdated' => "Les pàgines que s'han canviat des de la vostra darrera visita es mostren en '''negreta'''.",
 'watchmethod-recent' => "s'està comprovant si hi ha pàgines vigilades en les edicions recents",
 'watchmethod-list' => "s'està comprovant si hi ha edicions recents en les pàgines vigilades",
 'watchlistcontains' => 'La vostra llista de seguiment conté {{PLURAL:$1|una única pàgina|$1 pàgines}}.',
@@ -2445,7 +2527,7 @@ $1",
 'contributions' => "Contribucions de {{GENDER:$1|l'usuari|la usuària}}",
 'contributions-title' => "Contribucions de l'usuari $1",
 'mycontris' => 'Contribucions',
-'contribsub2' => 'Per $1 ($2)',
+'contribsub2' => 'Per a {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "No s'ha trobat canvis que encaixessin amb aquests criteris.",
 'uctop' => '(actual)',
 'month' => 'Mes (i anteriors):',
@@ -2605,13 +2687,11 @@ Per més detalls, a sota es mostra el registre de supressions:',
 'ipb_blocked_as_range' => "Error: L'adreça IP $1 no està blocada directament i per tant no pot ésser desbloquejada. Ara bé, sí que ho està per formar part del rang $2 que sí que pot ser desblocat.",
 'ip_range_invalid' => 'Rang de IP no vàlid.',
 'ip_range_toolarge' => 'No estan permesos el bloquejos de rangs més grans que /$1.',
-'blockme' => "Bloca'm",
 'proxyblocker' => 'Bloqueig de proxy',
-'proxyblocker-disabled' => "S'ha inhabilitat la funció.",
 'proxyblockreason' => "La vostra adreça IP ha estat bloquejada perquè és un proxy obert. Si us plau contactau el vostre proveïdor d'Internet o servei tècnic i informau-los d'aquest seriós problema de seguretat.",
-'proxyblocksuccess' => 'Fet.',
 'sorbsreason' => "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert dins la llista negra de DNS que fa servir el projecte {{SITENAME}}.",
 'sorbs_create_account_reason' => "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert a la llista negra de DNS que utilitza el projecte {{SITENAME}}. No podeu crear-vos-hi un compte",
+'xffblockreason' => "Una adreça IP present en la capçalera X-Forwarded-For, ja sigui vostra o la d'un servidor proxy que esteu utilitzant, ha estat blocada. El motiu inicial del bloqueig és: $1",
 'cant-block-while-blocked' => 'No podeu blocar altres usuaris quan esteu bloquejat.',
 'cant-see-hidden-user' => "L'usuari que esteu intentant blocar ja ha estat blocat i ocultat. Com que no teniu el permís hideuser no podeu veure ni modificar el seu blocatge.",
 'ipbblocked' => 'No podeu blocar o desblocar altres usuaris, perquè vós {{GENDER:|mateix|mateixa|mateix}} esteu {{GENDER:|blocat|blocada|blocat}}.',
@@ -2776,6 +2856,8 @@ En el darrer cas, podeu fer servir un enllaç com ara [[{{#Special:Export}}/{{Me
 'thumbnail-more' => 'Amplia',
 'filemissing' => 'Fitxer inexistent',
 'thumbnail_error' => "S'ha produït un error en crear la miniatura: $1",
+'thumbnail_error_remote' => "Missatge d'error de $1:
+$2",
 'djvu_page_error' => "La pàgina DjVu està fora de l'abast",
 'djvu_no_xml' => "No s'ha pogut recollir l'XML per al fitxer DjVu",
 'thumbnail-temp-create' => "No s'ha pogut creat el fitxer de miniatura temporal",
@@ -3002,8 +3084,6 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
 'pageinfo-category-files' => "Nombre d'arxius",
 
 # Skin names
-'skinname-standard' => 'Clàssic',
-'skinname-nostalgia' => 'Nostàlgia',
 'skinname-cologneblue' => 'Colònia blava',
 
 # Patrolling
@@ -3082,11 +3162,25 @@ Si l'executeu, podeu comprometre la seguretat del vostre sistema.",
 'minutes' => '{{PLURAL:$1|$1 minut|$1 minuts}}',
 'hours' => '{{PLURAL:$1|$1 hora|$1 hores}}',
 'days' => '{{PLURAL:$1|$1 dia|$1 dies}}',
+'weeks' => '{{PLURAL:$1|$1 setmana|$1 setmanes}}',
 'months' => '{{PLURAL:$1|$1 mes|$1 mesos}}',
 'years' => '{{PLURAL:$1|$1 any|$1 anys}}',
 'ago' => 'fa $1',
 'just-now' => 'ara mateix',
 
+# Human-readable timestamps
+'hours-ago' => 'fa $1 {{PLURAL:$1|hora|hores}}',
+'minutes-ago' => 'fa $1 {{PLURAL:$1|minut|minuts}}',
+'seconds-ago' => 'fa $1 {{PLURAL:$1|segon|segons}}',
+'monday-at' => 'Dilluns a les $1',
+'tuesday-at' => 'Dimarts a les $1',
+'wednesday-at' => 'Dimecres a les $1',
+'thursday-at' => 'Dijous a les $1',
+'friday-at' => 'Divendres a les $1',
+'saturday-at' => 'Dissabte a les $1',
+'sunday-at' => 'Diumenge a les $1',
+'yesterday-at' => 'Ahir a les $1',
+
 # Bad image list
 'bad_image_list' => "El format ha de ser el següent:
 
@@ -3113,7 +3207,7 @@ La resta d'enllaços de la línia són les excepcions, és a dir, les pàgines o
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Amplada',
 'exif-imagelength' => 'Alçada',
 'exif-bitspersample' => 'Octets per component',
@@ -3291,7 +3385,7 @@ La resta d'enllaços de la línia són les excepcions, és a dir, les pàgines o
 'exif-originalimageheight' => 'Alçada de la imatge abans que fos retallada',
 'exif-originalimagewidth' => 'Amplada de la imatge abans que fos retallada',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sense compressió',
 'exif-compression-2' => 'Codificació CCITT Grup 3 longitud monodimensional de Huffman modificat',
 'exif-compression-3' => 'Codificació de fax CCITT grup 3',
@@ -3689,7 +3783,6 @@ També podeu [[Special:EditWatchlist|utilitzar l'editor estàndard]].",
 'version-other' => 'Altres',
 'version-mediahandlers' => 'Connectors multimèdia',
 'version-hooks' => 'Lligams',
-'version-extension-functions' => "Funcions d'extensió",
 'version-parser-extensiontags' => "Etiquetes d'extensió de l'analitzador",
 'version-parser-function-hooks' => "Lligams funcionals de l'analitzador",
 'version-hook-name' => 'Nom del lligam',
@@ -3698,6 +3791,7 @@ També podeu [[Special:EditWatchlist|utilitzar l'editor estàndard]].",
 'version-license' => 'Llicència',
 'version-poweredby-credits' => "El wiki funciona gràcies a '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'altres',
+'version-poweredby-translators' => 'Traductors de translatewiki.net',
 'version-credits-summary' => 'El nostre reconeixement a les següents persones per la seva aportació a [[Special:Version|MediaWiki]]',
 'version-license-info' => "MediaWiki és programari lliure, podeu redistribuir-lo i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, ja sigui de la seva versió 2 o (a elecció vostra) qualsevol versió posterior. 
 
@@ -3711,12 +3805,17 @@ Amb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còp
 'version-entrypoints-header-entrypoint' => "Punt d'entrada",
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Camí del fitxer',
-'filepath-page' => 'Fitxer:',
-'filepath-submit' => 'Vés-hi',
-'filepath-summary' => "Aquesta pàgina especial retorna un camí complet d'un fitxer.
-Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien directament amb el seu programa associat.",
+# Special:Redirect
+'redirect' => 'Redirigeix per fitxer, usuari o ID de la revisió',
+'redirect-legend' => 'Redirigeix a un fitxer o a una pàgina',
+'redirect-summary' => "Aquesta pàgina especial redirigeix a un fitxer (donat el nom del fitxer), una pàgina (donada un ID de la revisió), o a una pàgina d'usuari (donat un ID numèric d'usuari).",
+'redirect-submit' => 'Vés-hi',
+'redirect-lookup' => 'Consulta:',
+'redirect-value' => 'Valor:',
+'redirect-user' => "ID d'usuari",
+'redirect-revision' => 'Revisió de la pàgina',
+'redirect-file' => 'Nom del fitxer',
+'redirect-not-exists' => "No s'ha trobat el valor",
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Cerca fitxers duplicats',
@@ -3766,12 +3865,15 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
 'tags' => 'Etiquetes de canvi vàlides',
 'tag-filter' => "Filtre d'[[Special:Tags|etiquetes]]:",
 'tag-filter-submit' => 'Filtra',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetes}}]]: $2)',
 'tags-title' => 'Etiquetes',
 'tags-intro' => 'Aquesta pàgina llista les etiquetes amb les què el programari pot marcar una modificació, i llur significat.',
 'tags-tag' => "Nom de l'etiqueta",
 'tags-display-header' => 'Aparença de la llista de canvis',
 'tags-description-header' => 'Descripció completa del significat',
+'tags-active-header' => 'Actiu?',
 'tags-hitcount-header' => 'Canvis etiquetats',
+'tags-active-yes' => 'Sí',
 'tags-edit' => 'modifica',
 'tags-hitcount' => '$1 {{PLURAL:$1|canvi|canvis}}',
 
@@ -3792,6 +3894,7 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
 'dberr-problems' => 'Ho sentim. Aquest lloc web està experimentant dificultats tècniques.',
 'dberr-again' => 'Intenteu esperar uns minuts i tornar a carregar.',
 'dberr-info' => '(No es pot contactar amb el servidor de dades: $1)',
+'dberr-info-hidden' => '(No es pot contactar amb el servidor de la base de dades)',
 'dberr-usegoogle' => 'Podeu intentar fer la cerca via Google mentrestant.',
 'dberr-outofdate' => 'Tingueu en compte que la seva indexació del nostre contingut pot no estar actualitzada.',
 'dberr-cachederror' => 'A continuació hi ha una còpia emmagatzemada de la pàgina demanada, que pot no estar actualitzada.',
@@ -3807,6 +3910,9 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
 'htmlform-submit' => 'Tramet',
 'htmlform-reset' => 'Desfés els canvis',
 'htmlform-selectorother-other' => 'Altres',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Sí',
+'htmlform-chosen-placeholder' => 'Seleccioneu una opció',
 
 # SQLite database support
 'sqlite-has-fts' => '$1, amb suport de búsqueda de text íntegre',
@@ -3924,4 +4030,19 @@ Altrament, podeu fer servir un senzill formulari a continuació. El vostre comen
 # Image rotation
 'rotate-comment' => 'Imatge girada $1 {{PLURAL:$1|grau|graus}} en el sentit de les agulles del rellotge',
 
+# Limit report
+'limitreport-title' => "Perfil de dades de l'analitzador:",
+'limitreport-cputime' => "Temps d'ús de CPU",
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segon|segons}}',
+'limitreport-walltime' => "Temps real d'ús",
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|segon|segons}}',
+'limitreport-ppvisitednodes' => 'Nombre de nodes visitats pel preprocessador',
+'limitreport-ppgeneratednodes' => 'Nombre de nodes generats pel preprocessador',
+'limitreport-postexpandincludesize' => "Mida d'inclusió post-expansió",
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => "Mida de l'argument de plantilla",
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => "Profunditat màxima d'expansió",
+'limitreport-expensivefunctioncount' => "Número de funcions d'anàlisi dispendioses",
+
 );
diff --git a/languages/messages/MessagesCbk_zam.php b/languages/messages/MessagesCbk_zam.php
index 3273f677..b58427e2 100644
--- a/languages/messages/MessagesCbk_zam.php
+++ b/languages/messages/MessagesCbk_zam.php
@@ -115,8 +115,8 @@ Por favor mira tambien el maga [[Special:WantedCategories|categoria requeridas]]
 # Watchlist
 'watch' => 'Vicia',
 
-'created' => 'creao',
 'changed' => 'cambiao',
+'created' => 'creao',
 
 # Delete
 'actioncomplete' => 'Completo el accion',
diff --git a/languages/messages/MessagesCdo.php b/languages/messages/MessagesCdo.php
index da6ad8ca..7c96e25d 100644
--- a/languages/messages/MessagesCdo.php
+++ b/languages/messages/MessagesCdo.php
@@ -45,7 +45,6 @@ $messages = array(
 'tog-shownumberswatching' => '顯示監視用戶其數量',
 'tog-oldsig' => '存在其簽名',
 'tog-fancysig' => '共簽名當成維基文本（無自動鏈接）',
-'tog-showjumplinks' => '允許「跳遘」可訪問其鏈接',
 'tog-uselivepreview' => '使即時預覽（敆𡅏實驗）',
 'tog-forceeditsummary' => '提醒我行遘蜀萆空白其編輯總結',
 'tog-watchlisthideown' => '趁監視單𡅏藏起我其修改',
@@ -58,6 +57,7 @@ $messages = array(
 'tog-diffonly' => '伓使敆下底其顯示𣍐蜀様其地方顯示頁面內容',
 'tog-showhiddencats' => '㪗藏類別',
 'tog-norollbackdiff' => '敆回滾其時候，無叕𣍐蜀様其地方',
+'tog-useeditwarning' => '我編輯頁面其時候離開，起動警告我蜀下',
 
 'underline-always' => '直頭',
 'underline-never' => '頭𡅏無',
@@ -121,6 +121,18 @@ $messages = array(
 'oct' => '十月',
 'nov' => '十一月',
 'dec' => '十二月',
+'january-date' => '一月$1號',
+'february-date' => '二月$1號',
+'march-date' => '三月$1號',
+'april-date' => '四月$1號',
+'may-date' => '五月$1號',
+'june-date' => '六月$1號',
+'july-date' => '七月$1號',
+'august-date' => '八月$1號',
+'september-date' => '九月$1號',
+'october-date' => '十月$1號',
+'november-date' => '十一月$1號',
+'december-date' => '十二月$1號',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1}}類別',
@@ -201,6 +213,7 @@ $messages = array(
 'create-this-page' => '創建茲蜀頁',
 'delete' => '刪除',
 'deletethispage' => '刪除茲頁',
+'undeletethispage' => '恢復茲蜀頁',
 'undelete_short' => '恢復$1回修改{{PLURAL:$1}}',
 'viewdeleted_short' => '覷蜀覷$1回刪掉其修改{{PLURAL:$1}}',
 'protect' => '保護',
@@ -244,7 +257,7 @@ $1',
 'pool-queuefull' => '隊列池已經滿了',
 'pool-errorunknown' => '𣍐八什乇鄭咯',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '關於{{SITENAME}}',
 'aboutpage' => 'Project:關於',
 'copyright' => '內容敆$1下底會使獲得。',
@@ -254,7 +267,6 @@ $1',
 'disclaimers' => '無負責聲明',
 'disclaimerpage' => 'Project:無負責聲明',
 'edithelp' => '修改保護',
-'edithelppage' => 'Help:Siŭ-gāi',
 'helppage' => 'Help:目錄',
 'mainpage' => '頭頁',
 'mainpage-description' => '頭頁',
@@ -330,17 +342,6 @@ $1',
 # General errors
 'error' => '鄭咯',
 'databaseerror' => '數據庫有鄭',
-'dberrortext' => '蜀萆數據庫查詢其語法錯誤發生咯。
-茲可能代表茲軟件其蜀萆漏洞。
-最後嘗試其數據庫查詢是：
-<blockquote><code>$1</code></blockquote>
-趁函數「<code>$2</code>」來其。
-數據庫返回錯誤「<samp>$3: $4</samp>」。',
-'dberrortextcl' => '蜀萆數據庫查詢語法錯誤發生咯。
-最後蜀回嘗試其數據庫查詢是：
-「$1」
-趁函數「$2」來其。
-數據庫返回錯誤「$3: $4」',
 'laggedslavemode' => "'''警告：'''頁面可能無最近其更新。",
 'readonly' => '數據庫乞鎖起咯',
 'readonlytext' => 'Só-gé̤ṳ-kó cī-buàng ké̤ṳk nè̤ng sō̤ kī lāu, mâ̤-sāi siā sĭng dèu-mĕ̤k hĕ̤k có̤ siŭ-gāi, ô kō̤-nèng sê ôi-lāu nĭk-siòng mì-hô, cĭ-hâiu cêu â̤ ciáng-siòng.
@@ -380,10 +381,11 @@ Sō̤ kī só-gé̤ṳ-kó gì guāng-lī-uòng cūng-kuāng gāi-sék: $1',
 'editinginterface' => "'''警告：'''汝敆𡅏修改其頁面廮𡅏提供茲蜀萆軟件其界面文本。
 茲蜀頁其改變會影響遘其它用戶其用戶界面其顯示。
 如果蔔想修改維基其翻譯，起動遘媒體維基本地化計劃[//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]。",
-'sqlhidden' => '（SQL查詢藏起咯）',
 'namespaceprotected' => "汝𣍐使修改敆'''$1'''命名空間其頁面。",
 'customcssprotected' => '汝𣍐使修改茲蜀萆CSS頁面，因為伊有別蜀隻用戶其設定。',
 'customjsprotected' => '汝𣍐使修改茲蜀萆JavaScript頁面，因為伊有別蜀隻用戶其設定。',
+'mycustomcssprotected' => '汝𣍐使修改茲蜀萆CSS頁面。',
+'mycustomjsprotected' => '汝𣍐使修改茲蜀萆JavaScript頁面。',
 'ns-specialprotected' => '𣍐使修改特殊頁面。',
 'titleprotected' => "茲蜀萆標題共[[User:$1|$1]]保護其咯。
 原因是「''$2''」。",
@@ -404,10 +406,18 @@ Sō̤ kī só-gé̤ṳ-kó gì guāng-lī-uòng cūng-kuāng gāi-sék: $1',
 'welcomecreation-msg' => '汝其賬戶已經開好了。
 伓嗵𣍐記改蜀改汝其[[Special:Preferences|{{SITENAME}}設定]]。',
 'yourname' => '用戶名：',
+'userlogin-yourname' => '用戶名',
+'userlogin-yourname-ph' => '輸底汝其用戶名',
 'yourpassword' => '密碼：',
+'userlogin-yourpassword' => '密碼',
+'userlogin-yourpassword-ph' => '輸底汝其密碼',
+'createacct-yourpassword-ph' => '輸底蜀萆密碼',
 'yourpasswordagain' => '重新拍囇密碼：',
+'createacct-yourpasswordagain' => '確定密碼',
+'createacct-yourpasswordagain-ph' => '再輸入蜀回密碼',
 'remembermypassword' => '共我敆茲蜀萆瀏覽器其躒底記錄記定幾日（最価$1日）{{PLURAL:$1}}',
-'securelogin-stick-https' => '躒底以後保持HTTPS連接',
+'userlogin-remembermypassword' => '保持我躒底其',
+'userlogin-signwithsecure' => '使安全其連接',
 'yourdomainname' => '汝其域名：',
 'password-change-forbidden' => '汝𣍐使敆茲蜀萆維基百科𡅏修改密碼。',
 'externaldberror' => '可能是驗證數據庫鄭咯，或者是汝𣍐使升級汝其外部賬戶。',
@@ -419,18 +429,38 @@ Sō̤ kī só-gé̤ṳ-kó gì guāng-lī-uòng cūng-kuāng gāi-sék: $1',
 'logout' => '躒出',
 'userlogout' => '躒出',
 'notloggedin' => '未躒底',
+'userlogin-noaccount' => '汝無賬戶？',
+'userlogin-joinproject' => '共{{SITENAME}}加底其',
 'nologin' => '汝無賬戶？$1',
 'nologinlink' => '開蜀隻賬戶',
 'createaccount' => '開賬戶',
 'gotaccount' => "已經有賬戶了？'''$1'''。",
 'gotaccountlink' => '躒底',
 'userlogin-resetlink' => '躒底其資料𣍐記咯？',
+'userlogin-resetpassword-link' => '重置汝其密碼',
+'helplogin-url' => 'Help: 躒底',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|幫助躒底]]',
+'createacct-join' => '敆下底輸底汝其信息。',
+'createacct-emailrequired' => '電子郵件地址',
+'createacct-emailoptional' => '電子郵件地址（愛寫就寫）',
+'createacct-email-ph' => '輸底汝其電子郵件地址',
 'createaccountmail' => '使臨時其隨機密碼，共伊送遘指定其電子郵件地址',
+'createacct-realname' => '實際其名字（愛寫就寫）',
 'createaccountreason' => '原因：',
+'createacct-reason' => '原因',
+'createacct-reason-ph' => '汝奚勢復開蜀隻賬戶',
+'createacct-captcha' => '安全檢查',
+'createacct-imgcaptcha-ph' => '輸底汝敆懸頂看見其文字',
+'createacct-submit' => '開賬戶',
+'createacct-benefit-heading' => '{{SITENAME}}是共汝蜀様其儂做其。',
+'createacct-benefit-body1' => '{{PLURAL:$1|修改}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|頁面}}',
+'createacct-benefit-body3' => '最近其{{PLURAL:$1|貢獻者}}',
 'badretype' => '汝輸底其密碼𣍐蜀様。',
 'userexists' => '用戶名已經乞別人使去了。
 起動另外再起蜀萆名字。',
 'loginerror' => '躒底有鄭',
+'createacct-error' => '賬戶開出毛病咯',
 'createaccounterror' => '無能獃開賬戶：$1',
 'noname' => '汝未指定蜀萆合法其用戶名。',
 'loginsuccesstitle' => '躒底成功',
@@ -643,7 +673,6 @@ Sō̤ kī só-gé̤ṳ-kó gì guāng-lī-uòng cūng-kuāng gāi-sék: $1',
 'nextn' => '後{{PLURAL:$1}}$1萆',
 'shown-title' => '每頁顯示$1{{PLURAL:$1|萆結果}}',
 'viewprevnext' => '看（$1 {{int:pipe-separator}} $2）（$3）。',
-'searchhelp-url' => 'Help:目錄',
 'searchprofile-articles' => '內容頁',
 'searchprofile-images' => '多媒體',
 'searchprofile-everything' => '所有乇',
@@ -769,7 +798,7 @@ Sō̤ kī só-gé̤ṳ-kó gì guāng-lī-uòng cūng-kuāng gāi-sék: $1',
 'uploadbtn' => '上傳文件',
 'reuploaddesc' => '取消上傳，轉去上傳頁面',
 'uploadnologin' => '未躒底',
-'uploadnologintext' => 'Sĕng [[Special:UserLogin|láuk-diē]] ciáh â̤-sāi siông-duòng ùng-giông.',
+'uploadnologintext' => '汝著$1才會使上傳文件。',
 'uploaderror' => '上傳有鄭',
 'uploadlog' => '上傳日誌',
 'uploadlogpage' => '上傳日誌',
@@ -840,8 +869,6 @@ Sō̤ kī só-gé̤ṳ-kó gì guāng-lī-uòng cūng-kuāng gāi-sék: $1',
 'statistics' => '統計',
 'statistics-header-users' => '用戶統計',
 
-'disambiguationspage' => 'Template:歧義',
-
 'brokenredirects-edit' => '改',
 'brokenredirects-delete' => '刪',
 
@@ -937,7 +964,6 @@ Sō̤ kī só-gé̤ṳ-kó gì guāng-lī-uòng cūng-kuāng gāi-sék: $1',
 'watchthispage' => '監視茲頁',
 'unwatch' => '伓使監視',
 'unwatchthispage' => '停止監視',
-'watchnochange' => '汝其監視頁面全部都無儂定動。',
 'watchlist-details' => '{{PLURAL:$1}}$1頁敆汝其監視單𡅏，無算討論頁。',
 'wlshowlast' => '顯示最$1點鐘$2日$3',
 'watchlist-options' => '監視單選項',
@@ -1301,9 +1327,6 @@ $5
 'watchlisttools-edit' => '看共修改監視單',
 'watchlisttools-raw' => '修改原始監視單',
 
-# Special:FilePath
-'filepath-page' => '文件：',
-
 # Special:SpecialPages
 'specialpages' => '特殊頁',
 
diff --git a/languages/messages/MessagesCe.php b/languages/messages/MessagesCe.php
index f5bb2d1e..0533b951 100644
--- a/languages/messages/MessagesCe.php
+++ b/languages/messages/MessagesCe.php
@@ -22,18 +22,18 @@ $namespaceNames = array(
 	NS_SPECIAL          => 'Белхан',
 	NS_TALK             => 'Дийцаре',
 	NS_USER             => 'Декъашхо',
-	NS_USER_TALK        => 'Декъашхон_дийцаре',
+	NS_USER_TALK        => 'Декъашхочун_дийцаре',
 	NS_PROJECT_TALK     => '{{GRAMMAR:genitive|$1}}_дийцаре',
-	NS_FILE             => 'Хlум',
-	NS_FILE_TALK        => 'Хlуман_дийцаре',
+	NS_FILE             => 'Файл',
+	NS_FILE_TALK        => 'Файлан_дийцаре',
 	NS_MEDIAWIKI        => 'MediaWiki',
 	NS_MEDIAWIKI_TALK   => 'MediaWiki_дийцаре',
-	NS_TEMPLATE         => 'Куцкеп',
-	NS_TEMPLATE_TALK    => 'Куцкеп_дийцаре',
-	NS_HELP             => 'Гlо',
-	NS_HELP_TALK        => 'Гlон_дийцаре',
-	NS_CATEGORY         => 'Кадегар',
-	NS_CATEGORY_TALK    => 'Кадегар_дийцаре',
+	NS_TEMPLATE         => 'Кеп',
+	NS_TEMPLATE_TALK    => 'Кепан_дийцаре',
+	NS_HELP             => 'ГӀо',
+	NS_HELP_TALK        => 'ГӀо_дийцаре',
+	NS_CATEGORY         => 'Категори',
+	NS_CATEGORY_TALK    => 'Категорин_дийцаре',
 );
 
 $namespaceAliases = array(
@@ -43,25 +43,134 @@ $namespaceAliases = array(
 	'Юзер'             => NS_USER,
 	'Юзери_дийца'      => NS_USER_TALK,
 	'Дийцаре_декъашхо' => NS_USER_TALK,
+	'Декъашхон_дийцаре' => NS_USER_TALK,
 	'$1_Дийца'         => NS_PROJECT_TALK,
 	'Дийцаре_{{GRAMMAR:genitive|$1}}' => NS_PROJECT_TALK,
 	'Сурт'             => NS_FILE,
 	'Сурти_дийца'      => NS_FILE_TALK,
+	'Хlум'             => NS_FILE,
+	'Хlуман_дийцаре'   => NS_FILE_TALK,
 	'Дийцаре_хlуман'   => NS_FILE_TALK,
 	'МедйаВики'        => NS_MEDIAWIKI,
 	'МедйаВики_дийца'  => NS_MEDIAWIKI_TALK,
 	'MediaWiki_Дийцаре' => NS_MEDIAWIKI_TALK,
 	'Дакъан'           => NS_TEMPLATE,
 	'Дакъан_дийца'     => NS_TEMPLATE_TALK,
+	'Куцкеп'           => NS_TEMPLATE,
+	'Куцкеп_дийцаре'   => NS_TEMPLATE_TALK,
 	'ГІо'              => NS_HELP,
 	'ГІодан_дийца'     => NS_HELP_TALK,
+	'Гlо'              => NS_HELP,
+	'Гlон_дийцаре'     => NS_HELP_TALK,
 	'Тоба'             => NS_CATEGORY,
-	'Тобан_дийца'      => NS_CATEGORY_TALK
+	'Тобан_дийца'      => NS_CATEGORY_TALK,
+	'Кадегар'          => NS_CATEGORY,
+	'Кадегар_дийцаре'  => NS_CATEGORY_TALK,
 );
 
 // Remove Russian aliases
 $namespaceGenderAliases = array();
 
+$specialPageAliases = array(
+	'Activeusers'               => array( 'Жигара_декъашхой' ),
+	'Allmessages'               => array( 'ГӀирса_хаамаш' ),
+	'Allpages'                  => array( 'Массо_агӀонаш' ),
+	'Ancientpages'              => array( 'Яззамаш_оцу_терахьца_тяххьара_тадар_дина_долу' ),
+	'Badtitle'                  => array( 'Хилийта_йиш_йоцу_цӀе' ),
+	'Blankpage'                 => array( 'Еса_агӀо' ),
+	'Block'                     => array( 'Блоктоха' ),
+	'Blockme'                   => array( 'Блоктоха_суна' ),
+	'Booksources'               => array( 'Жайнашан_хьосташ' ),
+	'BrokenRedirects'           => array( 'ДIахаьдна_долу_дIасахьажораш' ),
+	'Categories'                => array( 'Категореш' ),
+	'ChangeEmail'               => array( 'Хийца_e-mail' ),
+	'ChangePassword'            => array( 'Хийца_ишар' ),
+	'ComparePages'              => array( 'АгӀонаш_юстар' ),
+	'Confirmemail'              => array( 'Бакъе_e-mail' ),
+	'Contributions'             => array( 'Къинхьегам' ),
+	'CreateAccount'             => array( 'Кхолла_декъашхон_дӀаяздар' ),
+	'Deadendpages'              => array( 'Дика_йоцу_агӀонаш' ),
+	'DeletedContributions'      => array( 'ДӀабяхкина_къинхьегам' ),
+	'Disambiguations'           => array( 'Цхьатера_маьӀна_дерш' ),
+	'DoubleRedirects'           => array( 'ШалгӀа_дӀасахьажийнарш' ),
+	'EditWatchlist'             => array( 'Табе_тергаме_могӀам' ),
+	'Emailuser'                 => array( 'Декъашхочунга_кехат' ),
+	'Export'                    => array( 'Экспорт' ),
+	'Fewestrevisions'           => array( 'Наггахь_беш_болу_хицамаш' ),
+	'FileDuplicateSearch'       => array( 'Цхьатера_файлаш_лахар' ),
+	'Filepath'                  => array( 'Файл_йолче' ),
+	'Import'                    => array( 'Импорт' ),
+	'Invalidateemail'           => array( 'Адрес_бакъдар_юхадаккха' ),
+	'JavaScriptTest'            => array( 'JavaScript_тестировать_ян' ),
+	'BlockList'                 => array( 'Блоктоьхнарш' ),
+	'LinkSearch'                => array( 'Хьажоригаш_лахар' ),
+	'Listadmins'                => array( 'Куьгалхойн_могӀам' ),
+	'Listbots'                  => array( 'Шаболх_бечара_могӀам' ),
+	'Listfiles'                 => array( 'Файланши_могӀам' ),
+	'Listgrouprights'           => array( 'Декъашхошан_бакъонаш' ),
+	'Listredirects'             => array( 'ДIасахьажоран_могIам' ),
+	'Listusers'                 => array( 'Декъашхойн_могӀам' ),
+	'Lockdb'                    => array( 'Хааман_базан_блоктохар' ),
+	'Log'                       => array( 'Тептарш' ),
+	'Lonelypages'               => array( 'Байлахь_йисина_агIонаш' ),
+	'Longpages'                 => array( 'Беха_яззамаш' ),
+	'MergeHistory'              => array( 'Цхьаьнатоьхна_категореш' ),
+	'MIMEsearch'                => array( 'MIME_чухула_лахар' ),
+	'Mostcategories'            => array( 'Дуккха_категореш_тӀе_тоьхна_йолу_агӀонаш' ),
+	'Mostimages'                => array( 'Массарел_дуккха_лелайо_файлаш' ),
+	'Mostinterwikis'            => array( 'Дукха_юкъарвики_хьажоригаш' ),
+	'Mostlinked'                => array( 'Дуккха_хьажоригаш_тIе_тоьхна_йолу_агIонаш' ),
+	'Mostlinkedcategories'      => array( 'Дуккха_тӀе_хьажораш_йолу_категореш' ),
+	'Mostlinkedtemplates'       => array( 'Массарел_дуккха_а_леладо_кепаш' ),
+	'Mostrevisions'             => array( 'Сих_сиха_нисйина_йолу_агIонаш' ),
+	'Movepage'                  => array( 'АгӀона_цӀе_хийцар' ),
+	'Mycontributions'           => array( 'Сан_къинхьегам' ),
+	'Mypage'                    => array( 'Сан_агӀо' ),
+	'Mytalk'                    => array( 'Сан_дийцаре' ),
+	'Myuploads'                 => array( 'Сан_файлаш' ),
+	'Newimages'                 => array( 'Керла_файлаш' ),
+	'Newpages'                  => array( 'Керла_агӀонаш' ),
+	'PermanentLink'             => array( 'Гуттарлера_хьажориг' ),
+	'Popularpages'              => array( 'ГӀарялла_агӀонаш' ),
+	'Preferences'               => array( 'ГӀирсаш' ),
+	'Prefixindex'               => array( 'Хьалха_агIонашан_цIераш_хIотто_йеза' ),
+	'Protectedpages'            => array( 'ГIаролла_дина_агIонаш' ),
+	'Protectedtitles'           => array( 'ГIаролла_дина_цIераш' ),
+	'Randompage'                => array( 'Цахууш_нисйелла_агIо' ),
+	'Randomredirect'            => array( 'Цахууш_нисделла_дIасахьажор' ),
+	'Recentchanges'             => array( 'Керла_нисдарш' ),
+	'Recentchangeslinked'       => array( 'Кхуьнца_долу_нисдарш' ),
+	'Revisiondelete'            => array( 'ДӀадяхна_нисдарш' ),
+	'Search'                    => array( 'Лахар' ),
+	'Shortpages'                => array( 'Боцоа_яззамаш' ),
+	'Specialpages'              => array( 'Леррина_агӀонаш' ),
+	'Statistics'                => array( 'Бухехьдерг' ),
+	'Tags'                      => array( 'Билгалонаш' ),
+	'Unblock'                   => array( 'БлокдӀаякхар' ),
+	'Uncategorizedcategories'   => array( 'Категореш_йоцу_категореш' ),
+	'Uncategorizedimages'       => array( 'Категореш_йоцу_файлаш' ),
+	'Uncategorizedpages'        => array( 'Категореш_йоцу_агIонаш' ),
+	'Uncategorizedtemplates'    => array( 'Категореш_йоцу_кепаш' ),
+	'Undelete'                  => array( 'МеттахӀоттор' ),
+	'Unlockdb'                  => array( 'БлокдӀаякхар_ХБ' ),
+	'Unusedcategories'          => array( 'Лелош_доцу_категореш' ),
+	'Unusedimages'              => array( 'Лелош_доцу_файлаш' ),
+	'Unusedtemplates'           => array( 'Лелош_доцу_кепаш' ),
+	'Upload'                    => array( 'Файл_чуяккхар' ),
+	'UploadStash'               => array( 'ДӀахьулйина_файл_чуяккхар' ),
+	'Userlogin'                 => array( 'Чувалар/ялар' ),
+	'Userlogout'                => array( 'Аравалар/ялар' ),
+	'Userrights'                => array( 'Бакъона_урхалладар' ),
+	'Version'                   => array( 'Верси' ),
+	'Wantedcategories'          => array( 'Оьшуш_йолу_категореш' ),
+	'Wantedfiles'               => array( 'Оьшуш_йолу_файлаш' ),
+	'Wantedpages'               => array( 'Оьшуш_йолу_агIонаш' ),
+	'Wantedtemplates'           => array( 'Оьшуш_йолу_кепаш' ),
+	'Watchlist'                 => array( 'Тергаме_могӀам' ),
+	'Whatlinkshere'             => array( 'Хьажоригаш_кхузе' ),
+	'Withoutinterwiki'          => array( 'Кхечу_меттанашан_хьажориг_йоцу_агIонаш' ),
+);
+
 $magicWords = array(
 	'redirect'                  => array( '0', '#дlасахьажайар\'', '\'#хьажайо\'', '\'#REDIRECT', '#перенаправление', '#перенапр', '#REDIRECT' ),
 	'notoc'                     => array( '0', '__БАЦ_ЧУЛАЦАМ__', '__БАЦ_ЧУЛ__', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
@@ -239,9 +348,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Гайта декъашхойн терахь, агlо латийна болу шай тергаме могlам юкъа',
 'tog-oldsig' => 'Хьалххьажар долучу куьгтаlорна:',
 'tog-fancysig' => 'Шен вики-къастаман куьгтаlдар (ша шех хьажориг йоцуш)',
-'tog-externaleditor' => 'Лелайан арахьара рéдаккхар (гlулкхдириг леррина нисйина хила йеза, [//www.mediawiki.org/wiki/Manual:External_editors кхин дlа.])',
-'tog-externaldiff' => 'Лелабан арахьара диллагlарам башхо тарйо гlирс (гlулкхдириг леррина нисйина хила йеза, [//www.mediawiki.org/wiki/Manual:External_editors кхин дlа.])',
-'tog-showjumplinks' => 'Латайе гӀодарна хьажорагаш «дехьа гӀо оцу»',
 'tog-uselivepreview' => 'Лелайа чехка хьалха хьажа (JavaScript, муха ю хьажарна)',
 'tog-forceeditsummary' => 'Дага даийта, нагахь нисйарх лаьцна чохь язйина яцахь',
 'tog-watchlisthideown' => 'Къайлаяха ас нисйинарш оцу тергаме могlам чура',
@@ -255,6 +361,7 @@ $messages = array(
 'tog-showhiddencats' => 'Гайта къайлаха йолу категореш',
 'tog-noconvertlink' => 'Хааман хьажориг кхуллу гlирс дlабайа',
 'tog-norollbackdiff' => 'Юха яккхиначул тӀаьхьа ма гайта версешан башхо',
+'tog-useeditwarning' => 'Хаамбе бина хийцамаш дӀаязцабеш аса болх дӀатосучу хенахь',
 
 'underline-always' => 'Даимна',
 'underline-never' => 'Цкъа а',
@@ -318,6 +425,18 @@ $messages = array(
 'oct' => 'октябрь',
 'nov' => 'ноябрь',
 'dec' => 'декабрь',
+'january-date' => 'Январь $1',
+'february-date' => 'Февраль $1',
+'march-date' => 'Март $1',
+'april-date' => 'Апрель $1',
+'may-date' => 'Май $1',
+'june-date' => 'Июнь $1',
+'july-date' => 'Июль $1',
+'august-date' => 'Август  $1',
+'september-date' => 'Сентябрь $1',
+'october-date' => 'Октябрь $1',
+'november-date' => 'Ноябрь $1',
+'december-date' => 'Декабрь $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категори|Категореш}}',
@@ -339,7 +458,7 @@ $messages = array(
 'broken-file-category' => '{{#switch:{{NAMESPACE}}
  |{{ns:0}}=Болх цабеш файлийн хьажорагаш йолу агӀонаш}}',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Цуьнах лаьцна',
 'article' => 'Яззам',
@@ -402,6 +521,7 @@ $messages = array(
 'create-this-page' => 'Кхолла хlара агlо',
 'delete' => 'ДӀаяккха',
 'deletethispage' => 'ДӀаяккха хӀара агӀо',
+'undeletethispage' => 'ХӀара агӀо меттахӀоттор',
 'undelete_short' => 'Меттахlоттайé $1 {{PLURAL:$1|нисйинарг|нисйинарш|нисйинарш}}',
 'viewdeleted_short' => 'Хьажар {{PLURAL:$1|$1 дlадаьккхина нийсдар|$1 дlадаьхна нийсдарш|$1 дlадаьхна нийсдарш}}',
 'protect' => 'Гlаролла дé',
@@ -445,7 +565,7 @@ $1',
 'pool-queuefull' => 'Дехаршан чоь юьззина ю',
 'pool-errorunknown' => 'Дойзаш доцу гlалат',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} лаьцна',
 'aboutpage' => 'Project:Цуьнах лаьцна',
 'copyright' => 'Чулацам лело мега догӀуш хиларца оцу $1.',
@@ -455,7 +575,6 @@ $1',
 'disclaimers' => 'Бехк тӀе ца эцар',
 'disclaimerpage' => 'Project:Бяхк тӀецалацар',
 'edithelp' => 'ГӀо оцу тадарна',
-'edithelppage' => 'Help:Нисвохаам оцу редаккхарна',
 'helppage' => 'Help:Чулацам',
 'mainpage' => 'Коьрта агӀо',
 'mainpage-description' => 'Коьрта агӀо',
@@ -485,7 +604,6 @@ $1',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|тӀаьхьара бина хийцамаш}}',
 'youhavenewmessagesmulti' => 'Хьуна кхаьчна керла хаам оцу $1',
 'editsection' => 'нисйé',
-'editsection-brackets' => '[$1]',
 'editold' => 'нисйé',
 'viewsourceold' => 'хьажа йолш йолучу ишаре',
 'editlink' => 'нисйé',
@@ -580,10 +698,11 @@ $1',
 'editinginterface' => "'''Тергам бе:''' Ахьа таеш ю интерфейсан йоза долу агӀо програмин латторан.
 Цуна бина хийцам хьокху википедин кхечу декъашхошна гур бу.
 Хьокху хаамийн гочдар тӀетоха я хийца лела йе сайт MediaWiki [//translatewiki.net/ translatewiki.net].",
-'sqlhidden' => '(SQL жоп дехар къайладаккха)',
 'namespaceprotected' => 'ХӀан бакъо яц анна цӀераш чохь тадарш да «$1».',
 'customcssprotected' => 'Хьан бакъо яц хӀара CSS-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.',
 'customjsprotected' => 'Хьан бакъо яц хӀара JavaScript-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.',
+'mycustomcssprotected' => 'Хьан бакъо яц хӀара CSS агӀо тая.',
+'mycustomjsprotected' => 'Хьан бакъо яц JavaScript агӀо тая.',
 'exception-nologin' => 'Ахьа хӀой вовзийтина/йовзийтина вац/яц',
 
 # Virus scanner
@@ -596,9 +715,18 @@ $1',
 Цхьа йолу агӀонаш чохь хьо хьай цӀарца болх беш сана хила тарло ишта ца хилийта керлаякха браузеран кэш.",
 'welcomeuser' => 'Марша ДогӀийла, $1!',
 'yourname' => 'Декъашхочун цӀе:',
+'userlogin-yourname' => 'Декъашхочун цӀе',
+'userlogin-yourname-ph' => 'Язъе декъашхочун цӀе',
 'yourpassword' => 'Пароль:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Язъе хьай пароль',
+'createacct-yourpassword-ph' => 'Язъе пароль',
 'yourpasswordagain' => 'Юха язъе пароль:',
+'createacct-yourpasswordagain' => 'Бакъе пароль',
+'createacct-yourpasswordagain-ph' => 'Кхин цкъа язъе пароль',
 'remembermypassword' => 'Даглаца сан дӀавазвалар/ялар хӀокху гӀулкхдечу гӀирса тӀяхь (цхьан $1 {{PLURAL:$1|ден|динахь|динахь}})',
+'userlogin-remembermypassword' => 'Дагахь латт ве/е со',
+'userlogin-signwithsecure' => 'Ларийна цхьаьнакхетар',
 'yourdomainname' => 'Хьан машан меттиг:',
 'password-change-forbidden' => 'Хьан йиш яц хӀокху вики чохь пароль хийца.',
 'login' => 'Системин чугӀо',
@@ -609,17 +737,37 @@ $1',
 'logout' => 'Болх дӀаберзор',
 'userlogout' => 'Болх дӀаберзор',
 'notloggedin' => 'Хьо вовзийта/йовзийта гlирсан',
+'userlogin-noaccount' => 'Декъашхочун дӀаяздар дац хьа?',
+'userlogin-joinproject' => '{{grammar:genitive|{{SITENAME}}}} юкъахӀотта',
 'nologin' => "Декъашхочун дӀаяздар дац хьа? '''$1'''.",
 'nologinlink' => 'Кхолла декъашхочун дӀаяздар',
 'createaccount' => 'Кхолла декъашхочун дӀаяздар',
 'gotaccount' => "Дlавазвелла вуй хьо? '''$1'''.",
 'gotaccountlink' => 'Довзийта',
 'userlogin-resetlink' => 'Чуволу/йолу хаам биц бела?',
+'userlogin-resetpassword-link' => 'Пароль кхоссар',
+'helplogin-url' => 'Help:Системин довзийтар',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Системин чудаха гӀодар]]',
+'createacct-join' => 'ДӀаязбе лахахь хай хаам.',
+'createacct-emailrequired' => 'Электронни почтан адрес',
+'createacct-emailoptional' => 'Электронни почтан адрес (ца яздича мега)',
+'createacct-email-ph' => 'ДӀаязде электронни почтан адрес',
 'createaccountmail' => 'хааман зӀене хула',
+'createacct-realname' => 'Хьан цӀе (ца язйича мега)',
 'createaccountreason' => 'Бахьан:',
+'createacct-reason' => 'Бахьна',
+'createacct-reason-ph' => '{{PLURAL:$1|агӀо|агӀонаш}}‎',
+'createacct-captcha' => 'Кхерамзалла хьажар',
+'createacct-imgcaptcha-ph' => 'ДӀаязде хьайна лакхахь гуш долу йоза',
+'createacct-submit' => 'Кхолла декъашхочун дӀаяздар',
+'createacct-benefit-heading' => '{{SITENAME}} кхолийна хьо санначу наха.',
+'createacct-benefit-body1' => '{{PLURAL:$1|нисдар|нисдарш}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|яззам|яззамаш}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|декъашхо|декъашхой}} тӀаьхьарачу хенахь',
 'badretype' => 'Ахьа язъен ишарш цхьатера яц',
 'userexists' => 'Ахьа язъен декъашхочун цӀе йолуш ю, дехар до кхин цӀе харжар.',
 'loginerror' => 'Гlалат ду декъашхо вовзарехь/йовзарехь',
+'createacct-error' => 'ДӀаяздар кхуллуш гӀалат ду',
 'createaccounterror' => 'Декъашхочун дӀаяздар кхолла йиш яц: $1',
 'nocookieslogin' => '{{SITENAME}} лелош ю «cookies» декъашхой системин  чуболучу хенахь. Ахьа иш дӀайаьйина.',
 'nocookiesforlogin' => '{{int:nocookieslogin}}',
@@ -661,6 +809,7 @@ $1',
 
 # Special:PasswordReset
 'passwordreset' => 'Пароль кхоссар',
+'passwordreset-text-many' => '{{PLURAL:$1|Пароль кхосса юза лахара цхьа меттиг.}}',
 'passwordreset-legend' => 'Пароль кхоссар',
 'passwordreset-username' => 'Декъашхочун цӀе:',
 'passwordreset-domain' => 'Домен:',
@@ -678,6 +827,18 @@ $1',
 'changeemail-submit' => 'Хийца email',
 'changeemail-cancel' => 'Цаоьшу',
 
+# Special:ResetTokens
+'resettokens' => 'Токенаш кхоссар',
+'resettokens-text' => 'Хьан йиш ю токенаш кхосса, цара йиш хуьлуьйту цхьаболу долара хаамашна тӀекхача, уьш ю хьан дӀаяздар ца вовшахтесна. 
+
+Хьона иза оьшу, ахьа хьай токенаш цхьам гучу яьхна елахь я хьан аккаунт йохийна елахь.',
+'resettokens-legend' => 'Токенаш кхоссар',
+'resettokens-tokens' => 'Токенаш:',
+'resettokens-token-label' => '$1 (карара маьӀна: $2)',
+'resettokens-watchlist-token' => 'Веб-каналан (Atom/RSS) токен  [[Special:Watchlist|хьан тергаме могӀам чура агӀонашна хийцамаш бар]]',
+'resettokens-done' => 'Токенаш кхиссина.',
+'resettokens-resetbutton' => 'Къастина токенаш кхоссар',
+
 # Edit page toolbar
 'bold_sample' => 'Дерстино до йоза',
 'bold_tip' => 'Дерстино до йоза',
@@ -711,6 +872,8 @@ $1',
 'summary-preview' => 'Цуьнах лаьцна хирду:',
 'blockedtitle' => 'Декъашхочун блоктоьхана',
 'nosuchsectiontitle' => 'Дакъа каро йиш яц.',
+'nosuchsectiontext' => 'Хьо гӀерта дуцу дакъа тадан.
+Хьо хӀокху агӀоне хьоьжучу хенахь иза кхечухьа деккхина я дӀадаьккхина хела тарло.',
 'loginreqtitle' => 'Хьай цӀарца чугӀо',
 'loginreqlink' => 'Логин',
 'accmailtitle' => 'Пароль дlаяхьийтина.',
@@ -792,6 +955,7 @@ $1',
 'moveddeleted-notice' => 'Иза агӀо дӀаяккхина яра.
 Хаийтарна лахахьа гойту, цуьнца долу дӀаяздарш кху тептар чура дӀаяхарш а цӀе хийцарш а.',
 'log-fulllog' => 'Хьажа деригге тептаре',
+'postedit-confirmation' => 'Хьан нисдар дӏайазъдина.',
 
 # Content models
 'content-model-javascript' => 'JavaScript',
@@ -807,6 +971,7 @@ $1',
 # "Undo" feature
 'undo-success' => 'Нисйинарг а тlе цалаца мега. Дехар до, хьажа цхьатерра йуй башхо, тешна хила, баккъалла иза хийцам буйте хьуна безарг, тlакха тlе таlайе «дlайазйе агlо», хийцам хlотта ба.',
 'undo-summary' => 'Юхадаьккхина {{GENDER:$2|декъашхочун}} [[Special:Contributions/$2|$2]] ([[User talk:$2|дийц.]]) нисдар $1',
+'undo-summary-username-hidden' => 'Юхадаьккхина декъашхочун нисдарш $1, цунна цӀе дӀахьулйина',
 
 # History pages
 'viewpagelogs' => 'Гайта хlокху агlонан тептар',
@@ -905,7 +1070,6 @@ $1',
 'searchmenu-legend' => 'Лахарна гlирс нисба',
 'searchmenu-exists' => "'''ХӀокху вики чохь йолуш ю ишта агӀо «[[:$1]]»'''",
 'searchmenu-new' => "'''Кхолла ишта агlо «[[:$1]]» хlокху вики-кхолламашчохь!'''",
-'searchhelp-url' => 'Help:Чулацам',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Гайта агlонаш ишта хlоттам болуш]]',
 'searchprofile-articles' => 'Къаьстина агlонаш',
 'searchprofile-project' => 'ГӀона а проектан а агӀонаш',
@@ -942,6 +1106,7 @@ $1',
 'powersearch-toggleall' => 'Массо',
 'powersearch-togglenone' => 'Хlумма цаоьшу',
 'search-external' => 'Арахула лахар',
+'search-error' => 'Лохуш гӀалат даьлла: $1',
 
 # Preferences page
 'preferences' => 'Гlирс нисбан',
@@ -969,6 +1134,7 @@ $1',
 'prefs-email' => 'Электронан почтан параметраш',
 'prefs-rendering' => 'Арахьара хатl',
 'saveprefs' => 'lалашдан',
+'resetprefs' => 'Кхоссар',
 'restoreprefs' => 'МеттахӀоттабе гӀирс Iад битарца',
 'prefs-editing' => 'Тадар',
 'rows' => 'МогӀанаш:',
@@ -980,9 +1146,6 @@ $1',
 'recentchangesdays-max' => 'Къезиг  $1 {{PLURAL:$1|дена}}',
 'recentchangescount' => 'Iад йитарца гойтуш долу нисдаршан дукхалла',
 'prefs-help-recentchangescount' => 'Гойту керла нисдарш, агӀонашан истори, тептарш.',
-'prefs-help-watchlist-token' => 'Кхуза къайлах догӀа яздича хьан тергаме спискан RSS-трансляци кхуллур ю. 
-Массо а догӀа хууш верг трансляци еша йиш йолуш ву. 
-Цундела цхьанне а ца хуу догӀа харжа деза. Хьан йиш ю ца хууш кхоьллина догӀа лелада: $1',
 'savedprefs' => 'Хьан гӀирс Ӏалашбина.',
 'timezonelegend' => 'Сахьатан аса:',
 'localtime' => 'Меттигера хан:',
@@ -1005,7 +1168,6 @@ $1',
 'prefs-reset-intro' => 'ХӀара агӀо лело мега ахьа нисбина гӀирс Ӏад битарца юха бокхуш.
 ХӀара дешдерг кхочушъ динчул  тӀехьа хьан йиш хир-яц и юха меттахӀотто.',
 'prefs-emailconfirm-label' => 'Бакъ яр электрони почт:',
-'prefs-textboxsize' => 'Тадаран коран барам',
 'youremail' => 'Кехат яздо зlе цlе:',
 'username' => '{{GENDER:$1|Декъашхочун цӀе}}:',
 'uid' => 'Декъашхочун {{GENDER:$1|код}}:',
@@ -1031,6 +1193,7 @@ $1',
 'prefs-dateformat' => 'Терахьан формат',
 'prefs-timeoffset' => 'Хенан  гӀирс',
 'prefs-advancedediting' => 'Юкъара параметреш',
+'prefs-preview' => 'Хьалха муха ю хьажар',
 'prefs-advancedrc' => 'Кхин гӀирс нисбар',
 'prefs-advancedrendering' => 'Кхин гӀирс нисбар',
 'prefs-advancedsearchoptions' => 'Кхин гӀирс нисбар',
@@ -1124,10 +1287,19 @@ $1',
 'right-proxyunbannable' => 'проксен автоматически блоктохаран чекхбовлар',
 'right-unblockself' => 'ша шин блокдӀаяккхар',
 'right-protect' => 'АгӀона гӀоралла хийцар а гӀоралла дина агӀо нисяр а',
+'right-editprotected' => '«{{int:protect-level-sysop}}» бахьанца гӀоралла дина агӀонаш нисяр',
+'right-editsemiprotected' => '«{{int:protect-level-autoconfirmed}}» бахьанца гӀоралла дина агӀонаш нисяр',
 'right-editinterface' => 'лелош йолу интерфейсан хийцам бар',
 'right-editusercssjs' => 'кхечу декъашхойн CSS- а JS- а файлаш нисяр',
 'right-editusercss' => 'кхечу декъашхойн CSS-файлаш нсяр',
 'right-edituserjs' => 'кхечу декъашхойн JavaScript-файлаш нисяр',
+'right-editmyusercss' => 'Декъашхочун CSS файлаш таяр',
+'right-editmyuserjs' => 'Лелош йолу шен JavaScript-файлаш таяр',
+'right-viewmywatchlist' => 'Шен тергаме могӀане хьажар',
+'right-editmywatchlist' => 'Хьайн тергаме могӀам табар. Тидам бе, цхьадолу динарш могӀам юкъа шаш кхетар ду.',
+'right-viewmyprivateinfo' => 'Хьан долара хаамашка хьажар (масала, электронан адрес, бакъ цӀе)',
+'right-editmyprivateinfo' => 'Хьан долара хаамаш нисбар (масала, электронан адрес, бакъ цӀе)',
+'right-editmyoptions' => 'Тае хьайн гӀоли хетарг',
 'right-rollback' => 'билгала агӀона тӀехьарчу декъашхочо дина нисдарш сиха юхадахар',
 'right-markbotedits' => 'юхудохучу нисдаршан шаболх бечунна нисдарш аьлла билгало ян',
 'right-noratelimit' => 'чехкалин доза дац',
@@ -1167,6 +1339,7 @@ $1',
 'recentchanges' => 'Керла нисдарш',
 'recentchanges-legend' => 'Гlирс нисбарна керла нисдарш',
 'recentchanges-summary' => 'Лахахь гайтина хене хьаьжна Википедин агӀонашкахь тӀаьхьара бина хийцамаш',
+'recentchanges-noresult' => 'Билгал йинчу хенахь цӀа хийцамаш бина бац.',
 'recentchanges-feed-description' => 'Тергам бе тlаьхьара вики хийцаман хlокху ларца.',
 'recentchanges-label-newpage' => 'Оцу нисдарца кхоллина керла агlо.',
 'recentchanges-label-minor' => 'Хlара нисдинарг къастийна жимо долушсан',
@@ -1210,6 +1383,7 @@ $1',
 'uploadbtn' => 'Файл чуяккхар',
 'reuploaddesc' => 'Юху гӀо файл чуйоккху агӀоне',
 'upload-tryagain' => 'ДӀадахьийта хийцина файлах лаьцнарг',
+'uploadnologintext' => 'Серверан чу файлаш яха хьо $1.',
 'upload-permitted' => 'Магийна файлашан тайпанаш: $1.',
 'uploadlogpage' => 'Чуяхаран тéптар',
 'uploadlogpagetext' => 'Лахахьа гойтуш бу могlам тlаьххьара чуяхна файлаши. Ишта хьажа. [[Special:ImageList|файлаши могlам]] йа [[Special:NewImages|галеларе файлаши]].',
@@ -1333,6 +1507,11 @@ PICT # тайп тайпан
 # Random page
 'randompage' => 'Цахууш нисйелла агӀо',
 
+# Random page in category
+'randomincategory' => 'Категори чу цахууш нийса елла агӀо',
+'randomincategory-selectcategory' => 'Категори чу цахууш нийса елла агӀона чу гӀо: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Дехьа гӀо',
+
 # Random redirect
 'randomredirect' => 'Цахууш нисделла дIасахьажор',
 
@@ -1351,9 +1530,6 @@ PICT # тайп тайпан
 'statistics-users-active' => 'Жигара декъашхой',
 'statistics-users-active-desc' => 'Декъашхой, муьлха цхьа хlум дина болу, кху {{PLURAL:$1|тlаьххьара $1 динахь|тlаьххьара $1 дийнахь}}',
 
-'disambiguations' => 'Дуккха маьӀнаш долу хьажорца йолу агӀонаш',
-'disambiguationspage' => 'Кеп:цхьатера маьӀна доцуш',
-
 'pageswithprop' => 'АгӀонаш цхьадолу къастамашца',
 'pageswithprop-legend' => 'АгӀонаш цхьадолу къастамашца',
 'pageswithprop-text' => 'Кхузахь гойтуш ю агӀонаш цхьадолу къастамаш куьйга юху билгал даьхнарш.',
@@ -1404,6 +1580,7 @@ PICT # тайп тайпан
 'mostrevisions' => 'Сих сиха нисйина йолу агIонаш',
 'prefixindex' => 'Хьалха агlонашан цlераш хlотто йеза',
 'prefixindex-namespace' => 'Хьалха агӀонашан цӀераш хӀотто еза («{{ns:$1}}»)',
+'prefixindex-strip' => 'Хиламийн могӀам чура префикс къайлаяккха',
 'shortpages' => 'Боцоа яззамаш',
 'longpages' => 'Беха яззамаш',
 'deadendpages' => 'Дика йоцу агIонаш',
@@ -1412,6 +1589,7 @@ PICT # тайп тайпан
 'listusers' => 'Декъашхой могlам',
 'listusers-editsonly' => 'Цхаъ мукъане а хийцам бина декъашхой гайта',
 'listusers-creationsort' => 'Кхолларан хене хьаьжна нисъяр',
+'listusers-desc' => 'Харжа къезиг хиларца',
 'usercreated' => '{{GENDER:$3|дӀавазвелла|дӀаязелла}} $1 $2',
 'newpages' => 'Керла агlонаш',
 'newpages-username' => 'Декъашхо:',
@@ -1527,6 +1705,7 @@ PICT # тайп тайпан
 'unwatch' => 'Тергамах къаста',
 'notanarticle' => 'Бац яззам',
 'watchlist-details' => 'Хьан тергаме могlамца $1 {{PLURAL:$1|агlо|агlонаш|агlонаш}} ю, дийцаре агlонаша йоцуш.',
+'wlheader-showupdated' => "Хийцам бина агӀонаш '''Ӏаьржа''' шрифтцан билгальяха ю.",
 'wlnote' => 'Лахахьа {{PLURAL:$1|тlаьхьа богlу $1 хийцам|тlаьхьа богlу $1 хийцамаш|тlаьхьа богlу $1 хийцамаш}} хlокху {{PLURAL:$2|тlаьхьар|тlаьхьара|тlаьхьара}} <strong>$2</strong> {{plural:$2|сохьт|сохьатехь|сохьташкахь}}.',
 'wlshowlast' => 'Гайта тlаьххьара $1 сахьташ $2 денош $3',
 'watchlist-options' => 'Тергаме могlаман гlирс нисбар',
@@ -1971,7 +2150,6 @@ PICT # тайп тайпан
 'common.css' => '/** Чуйиллина йолу кхузе CSS хир йу лелош масхьа кечйечу чохь */',
 'monobook.css' => '/* Чуйиллина йолу кхузе CSS хир йу лелош масхьа Monobook чохь */',
 'print.css' => '/* Чуйиллина йолу кхузе CSS хир йу лелош масхьа зорба тухучуче чохь */',
-'handheld.css' => '/* Чуйиллина йолу кхузе CSS хир йу лелош масхьа койнаш чохь, дукхах ерг хатl нисдеш оцу $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Чуйиллина йолу кхузе JavaScript код гучу ера ю массо декъашхошна оцара схьаелларца хlора агlо */',
@@ -1995,7 +2173,6 @@ PICT # тайп тайпан
 'pageinfo-toolboxlink' => 'Агlонах болу бовзам',
 
 # Skin names
-'skinname-standard' => 'Лела ма ярра',
 'skinname-cologneblue' => 'Кёльнин сингаттам',
 'skinname-modern' => 'Кхузаманан',
 'skinname-vector' => 'Векторни',
@@ -2031,6 +2208,7 @@ PICT # тайп тайпан
 'newimages' => 'Керлачу файлийн галерий',
 'newimages-summary' => 'ХӀокху белхан агӀона чохь гойтуш ю дукха хан йоццуш чуйаьхна файлаш.',
 'newimages-legend' => 'Литтар',
+'showhidebots' => '$1 шабелхалой',
 'ilsubmit' => 'Лаха',
 'sp-newimages-showfrom' => 'Гайта керла файлаш $2, $1 тӀера дуьйна',
 
@@ -2064,7 +2242,7 @@ PICT # тайп тайпан
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Шоралла',
 'exif-imagelength' => 'Локхалла',
 'exif-bitspersample' => 'Бесан кIоргалла',
@@ -2108,7 +2286,7 @@ PICT # тайп тайпан
 'exif-pngfilecomment' => 'PNG-файлан билгалдаккхар',
 'exif-giffilecomment' => 'GIF-файлан билгалдаккхар',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ТIеIовдан яц',
 
 'exif-copyrighted-false' => 'Юкъараллин хьал',
@@ -2205,10 +2383,16 @@ PICT # тайп тайпан
 'version-other' => 'Кхин',
 'version-license' => 'Бакъо',
 
-# Special:FilePath
-'filepath' => 'ХIуман тIе болу некъ',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Дехьа гӀо',
+# Special:Redirect
+'redirect' => 'Декъашхочун файлан тӀера дӀасхьажор',
+'redirect-legend' => 'Файлан я агӀона тӀера дӀасхьажор',
+'redirect-summary' => 'ХӀара агӀо лело йиш ю файлан я агӀона тӀера дӀасхьажош.',
+'redirect-submit' => 'Дехьа гӀо',
+'redirect-lookup' => 'Лаха:',
+'redirect-value' => 'МаьӀна:',
+'redirect-user' => 'Декъашхочун ID',
+'redirect-revision' => 'АгӀона верси',
+'redirect-file' => 'Файлан цӀе',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Лаха цхьатера йолу файлаш',
@@ -2243,6 +2427,7 @@ PICT # тайп тайпан
 'tags' => 'Болш болу хийцаман къастам',
 'tag-filter' => 'Къастам [[Special:Tags|хьажар]]:',
 'tag-filter-submit' => 'Литта',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Билгало|Билгалонаш}}]]: $2)',
 'tags-title' => 'Билгалонаш',
 'tags-intro' => 'ХӀокху агӀона чохь гойтуш бу билгалошан могӀам царца программин латторо билгал доху нисдарш, кхин билгалошан маьӀна а.',
 'tags-tag' => 'Билгалона цӀе',
@@ -2295,4 +2480,17 @@ PICT # тайп тайпан
 # Search suggestions
 'searchsuggest-search' => 'Лаха',
 
+# Limit report
+'limitreport-title' => 'АгӀона хӀоттам къасторан хаамаш:',
+'limitreport-cputime' => 'Процессоран хан лелор',
+'limitreport-walltime' => 'Йодуш йолу хенахь лелор',
+'limitreport-ppvisitednodes' => 'Препроцессор хьаьжна шадин дукхалла',
+'limitreport-ppgeneratednodes' => 'Препроцессорс сгенерировать бина шадин дукхалла',
+'limitreport-postexpandincludesize' => 'Схьаяьстина юккъерчаран барам',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт|байташ}}',
+'limitreport-templateargumentsize' => 'Кепан аргументан барам',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт|байташ}}',
+'limitreport-expansiondepth' => 'Шордаларан уггар йокха кӀоргалла',
+'limitreport-expensivefunctioncount' => 'АгӀона хӀоттам къасторан «еза» функцеш',
+
 );
diff --git a/languages/messages/MessagesCeb.php b/languages/messages/MessagesCeb.php
index f8910a16..7bb494f2 100644
--- a/languages/messages/MessagesCeb.php
+++ b/languages/messages/MessagesCeb.php
@@ -97,9 +97,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ipakita ang gidaghanon sa mga gumagamit nga nagbantay usab',
 'tog-oldsig' => 'Paunang tan-aw sa eksisting nga pirma:',
 'tog-fancysig' => 'Hilaw nga pirma (walay awtomatikong sumpay)',
-'tog-externaleditor' => 'Gamita ang eksternal nga editor isip default (para sa mga eksperto lamang, kinahanglan og espesyal nga setting sa imong kompyuter)',
-'tog-externaldiff' => 'Gamita ang eksternal nga diff isip default (para sa mga eksperto lamang, kinahanglan og espesyal nga setting sa imong kompyuter)',
-'tog-showjumplinks' => 'I-enable ang "ambak sa" nga sumpay sa aksesibilidad',
 'tog-uselivepreview' => 'Gamita ang live nga paunang tan-aw (JavaScript kinahanglan) (Eksperimental)',
 'tog-forceeditsummary' => 'Pahibaloi ako kon blangko ang mubong sugid alang sa pag-usab',
 'tog-watchlisthideown' => 'Tagoa ang akong mga giusab',
@@ -288,7 +285,7 @@ Palihog paghulat bag-o nimo sulayan pag-akses og usab ang kining panid.
 
 $1',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Mahitungod sa {{SITENAME}}',
 'aboutpage' => 'Project:Mahitungod sa',
 'copyright' => 'Mga sulod makita sa $1.',
@@ -298,7 +295,6 @@ $1',
 'disclaimers' => 'Mga pagpasabot',
 'disclaimerpage' => 'Project:Mga pagpasabot',
 'edithelp' => 'Tabang sa pag-usab',
-'edithelppage' => 'Help:Pag-usab',
 'helppage' => 'Help:Mga sulod',
 'mainpage' => 'Unang Panid',
 'mainpage-description' => 'Unang Panid',
@@ -365,17 +361,6 @@ Ang lista sa mga balidong espesyal nga mga panid makita sa [[Special:SpecialPage
 # General errors
 'error' => 'Sayop',
 'databaseerror' => 'Sayop sa database',
-'dberrortext' => 'May nahitabong sayop sa database query syntax.
-Mahimong nagpakita kini og bug sa software.
-Ang naulahing gi-attempt nga database query mao ang:
-<blockquote><tt>$1</tt></blockquote>
-from within function "<tt>$2</tt>".
-MySQL returned error "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'May nahitabong sayop sa database query syntax.
-Ang naulahing gi-attempt nga database query mao ang:
-"$1"
-from within function "$2".
-MySQL returned error "$3: $4"',
 'laggedslavemode' => 'Pahibalo: Mahimong dili mahiapil sa panid ang mga bag-ong kausaban.',
 'readonly' => 'Gitrangkahan ang database',
 'enterlockreason' => 'Pagbutang og rason para sa lock, apil ang banabana kon kanus-a ma-release ang lock',
@@ -426,7 +411,6 @@ Palihog sulayi'g usab sa pipila ka minutos.",
 'editinginterface' => "'''Pahibalo:''' Imo nang usbon ang panid nga gigamit sa paghatag og interface text para sa software.
 Ang mga pag-usab niining panid moapekto sa appearance sa user interface nga alang sa ubang gumagamit.
 Para sa mga paghubad, palihog ikonsider ang paggamit sa [//translatewiki.net/wiki/Main_Page?setlang=ceb translatewiki.net], ang MediaWiki localisation project.",
-'sqlhidden' => '(nakatagong SQL query)',
 'cascadeprotected' => 'Ang kining panid giprotektahan sa pag-usab tungod kay nahiapil kini sa mosunod nga {{PLURAL:$1|panid, nga|mga panid, nga}} giprotektahan pinaagi sa pag-turn on gamit ang "cascading" nga opsyon:
 $2',
 'namespaceprotected' => "Wala kay permiso nga mag-usab sa mga panid sa '''$1''' nga ngalang espasyo.",
@@ -711,7 +695,6 @@ Hinumdomi nga ang paggamit sa mga sumpay sa nabigasyon mo-reset sa column.',
 'prevn' => 'miaging {{PLURAL:$1|$1}}',
 'nextn' => 'sunod {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Tan-awa sa ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Mga sulod',
 'searchprofile-everything' => 'Tanan ng bagay',
 'search-result-size' => '$1 ({{PLURAL:$2|1 pulong|$2 ka mga pulong}})',
 'search-redirect' => '(redirek $1)',
@@ -737,14 +720,6 @@ Sulayi'g prefix ang imong gipangita gamit ang ''all:'' alang mangita sa tanang s
 Puyde ka mangita gamit ang Google sa kasamtangan.
 Hinumdomi nga ang ilang indeks sa sulod sa {{SITENAME}} mahimong dugay-dugay na.',
 
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Wala',
-'qbsettings-fixedleft' => 'Naka-fix sa wala',
-'qbsettings-fixedright' => 'Naka-fix sa tuo',
-'qbsettings-floatingleft' => 'Floating sa wala',
-'qbsettings-floatingright' => 'Floating sa tuo',
-
 # Preferences page
 'preferences' => 'Mga preperensiya',
 'mypreferences' => 'Akong preperensiya',
@@ -772,7 +747,6 @@ Hinumdomi nga ang ilang indeks sa sulod sa {{SITENAME}} mahimong dugay-dugay na.
 'resetprefs' => 'Limpyohi ang wala matipigi nga mga kausaban',
 'restoreprefs' => 'Ibalik ang tanang default settings',
 'prefs-editing' => 'Nagausab',
-'prefs-edit-boxsize' => 'Size sa edit window.',
 'rows' => 'Mga row:',
 'columns' => 'Mga kolum:',
 'searchresultshead' => 'Pangitaa',
@@ -811,7 +785,6 @@ Hinumdomi nga ang ilang indeks sa sulod sa {{SITENAME}} mahimong dugay-dugay na.
 'prefs-reset-intro' => 'Puyde nimo gamiton ang kining panid aron ma-reset ang imong mga preprensiya ngadto sa default sa sayt.
 Dili kini puyde mabalik.',
 'prefs-emailconfirm-label' => 'Kompirmasyon sa e-mail:',
-'prefs-textboxsize' => 'Size sa editing window',
 'youremail' => 'E-mail:',
 'username' => 'Username:',
 'uid' => 'ID sa gumagamit:',
diff --git a/languages/messages/MessagesCh.php b/languages/messages/MessagesCh.php
index 19117a7f..53e43065 100644
--- a/languages/messages/MessagesCh.php
+++ b/languages/messages/MessagesCh.php
@@ -49,7 +49,6 @@ $messages = array(
 'tog-enotifminoredits' => "E-mail yu' lokkue' ni mandikike' na tinilaika gi påhina siha.",
 'tog-enotifrevealaddr' => "Na'annok iyo-ku e-mail address gi notifikasion e-mail.",
 'tog-shownumberswatching' => "Na'annok i numirun muna'sesetbi siha ni mana'atan.",
-'tog-showjumplinks' => "Na'sedi i ina'chetton ni \"ta'yoki guatu\"",
 'tog-forceeditsummary' => "Na'tungo' yu' annai mamo'lu yu' summaria gueku",
 'tog-watchlisthideown' => "Nå'na' tinilaika-hu gi listan pinilan",
 'tog-watchlisthidebots' => "Nå'na' i tinilaikan bot gi listan pinilan",
@@ -203,7 +202,7 @@ $messages = array(
 'jumptonavigation' => 'nabegasion',
 'jumptosearch' => 'aligao',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Pot {{SITENAME}}',
 'aboutpage' => 'Project:Pot',
 'copyright' => 'Guåha i sinahguan gi halom $1.',
@@ -213,7 +212,6 @@ $messages = array(
 'disclaimers' => 'Diklarasion Inadahi',
 'disclaimerpage' => 'Project:Diklarasion inadahi henerat',
 'edithelp' => 'Ayudo tumulaika',
-'edithelppage' => 'Help:Tumulaika',
 'helppage' => 'Help:Guinaha',
 'mainpage' => 'Fanhaluman',
 'mainpage-description' => 'Fanhaluman',
@@ -631,7 +629,6 @@ Fanapunta na para u na'nuebu i kolumna anggen un usa i inachetton nabegasion.",
 'prevn' => "{{PLURAL:$1|$1}} ni manmå'pos",
 'nextn' => "{{PLURAL:$1|$1}} ni manmamaila'",
 'viewprevnext' => 'Atan i ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Guinaha',
 'search-result-size' => '$1 ({{PLURAL:$2|1 na palabra|$2 na palabra siha}})',
 'search-result-score' => 'Prinisisu: $1%',
 'search-redirect' => "(na'dirihi $1)",
@@ -657,13 +654,6 @@ Fanapunta na para u na'nuebu i kolumna anggen un usa i inachetton nabegasion.",
 Siña hao manaligao gi Google gi entretanto.
 Fanapunta na fana'an ti gus nuebu i listan-ñiha i guinahan {{SITENAME}}.",
 
-# Quickbar
-'qbsettings-none' => "Tåya'",
-'qbsettings-fixedleft' => 'Maplanta gi akague',
-'qbsettings-fixedright' => "Maplanta gi agapa'",
-'qbsettings-floatingleft' => "Mamå'ya gi akague",
-'qbsettings-floatingright' => "Mamå'ya gi agapa'",
-
 # Preferences page
 'preferences' => "I ga'ña-mu",
 'mypreferences' => "I ga'ña-hu",
@@ -755,7 +745,6 @@ Yanggen un decidi mamo'lu, ma'usa ha' sempre para muna'i hao ni kreditu ni che'c
 'recentchangeslinked-feed' => 'Umachetton na tinilaika siha',
 'recentchangeslinked-toolbox' => 'Umachetton na tinilaika siha',
 'recentchangeslinked-title' => 'Tinilaika pumarehu yan "$1"',
-'recentchangeslinked-noresult' => "Tåya' na tinilaika siha ni maninachetton na påhina gi tiempon ma'ayek.",
 'recentchangeslinked-summary' => "Lista este ni tinilaika siha gi halacha ginen un påhina ma'ayek (pat ni miembro siha ginen un katigoria ma'ayek).
 '''Potpot''' i påhina siha ginen [[Special:Watchlist|Listan pinilan-mu]].",
 'recentchangeslinked-page' => "Nå'an i påhina:",
@@ -803,9 +792,6 @@ Yanggen un decidi mamo'lu, ma'usa ha' sempre para muna'i hao ni kreditu ni che'c
 # Statistics
 'statistics-mostpopular' => "Påhina siha ni mas ma'atan",
 
-'disambiguations' => "Ti mania'abak na påhina siha",
-'disambiguationspage' => 'Template:disambig',
-
 'doubleredirects' => "Mandoble na inachetton ma'dirihi siha",
 
 'brokenredirects' => "Manmayulang na muna'dirihi siha",
diff --git a/languages/messages/MessagesChr.php b/languages/messages/MessagesChr.php
index 845ae8c9..9867ae2b 100644
--- a/languages/messages/MessagesChr.php
+++ b/languages/messages/MessagesChr.php
@@ -46,6 +46,7 @@ $messages = array(
 'navigation' => 'ᎠᏂᎩᏍᏗ ᏥᏳ',
 
 # Cologne Blue skin
+'qbpageinfo' => 'ᎦᎷᎯᏍᏗ',
 'qbspecialpages' => 'ᎤᏤᎵᏛ',
 
 'help' => 'ᎠᎵᏍᏕᎸᏗ',
diff --git a/languages/messages/MessagesCkb.php b/languages/messages/MessagesCkb.php
index ef5852bc..6716b784 100644
--- a/languages/messages/MessagesCkb.php
+++ b/languages/messages/MessagesCkb.php
@@ -61,17 +61,20 @@ $specialPageAliases = array(
 	'Allmessages'               => array( 'ھەموو_پەیامەکان' ),
 	'Allpages'                  => array( 'ھەموو_پەڕەکان' ),
 	'Ancientpages'              => array( 'پەڕە_کۆنەکان' ),
+	'Blankpage'                 => array( 'پەڕەی_واڵا' ),
+	'Booksources'               => array( 'سەرچاوەکانی_کتێب' ),
 	'BrokenRedirects'           => array( 'ڕەوانکەرە_شکاوەکان' ),
 	'Categories'                => array( 'پۆلەکان' ),
 	'ChangePassword'            => array( 'تێپەڕوشەگۆڕان،_تێپەڕەوشە_ڕێکخستنەوە' ),
 	'Confirmemail'              => array( 'بڕواکردن_ئیمەیل' ),
 	'Contributions'             => array( 'بەشدارییەکان' ),
-	'CreateAccount'             => array( 'ھەژمار_دروستکردن' ),
+	'CreateAccount'             => array( 'دروستکردنی_ھەژمار' ),
 	'Deadendpages'              => array( 'پەڕە_بەربەستراوەکان' ),
 	'DoubleRedirects'           => array( 'ڕەوانکەرە_دووپاتکراوەکان' ),
 	'Emailuser'                 => array( 'ئیمەیل_بەکارھێنەر' ),
 	'Export'                    => array( 'ھەناردن' ),
 	'Fewestrevisions'           => array( 'کەمترین__پێداچوونەوەکان' ),
+	'Import'                    => array( 'ھاوردن' ),
 	'Listadmins'                => array( 'لیستی_بەڕێوبەران' ),
 	'Listbots'                  => array( 'لیستی_بۆتەکان' ),
 	'Listfiles'                 => array( 'لیستی_پەڕگەکان' ),
@@ -176,9 +179,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ژمارەی بەکارھێنەرە چاودێڕەکان نیشان بدە',
 'tog-oldsig' => 'واژووی ئێستا:',
 'tog-fancysig' => 'وەکوو ویکیدەق واژووەکە لەبەر چاو بگرە (بێ بەستەرێکی خۆگەڕ)',
-'tog-externaleditor' => 'دەستکاریکەری دەرەکی بەکاربێنە لە حاڵەتی دیفاڵتدا (تەنھا بۆ شارەزایان، ڕێکخستنی تایبەتی پێویستە لە سەر کۆمپیوتەرەکەت [//www.mediawiki.org/wiki/Manual:External_editors زانیاریی زۆرتر.])',
-'tog-externaldiff' => 'لە پرۆگرامێکی دەرەکی بۆ بینینی جیاوازیەکان کەڵک وەرگرە لە دیفاڵتدا (تەنها بۆ شارەزایان، ڕێکخستنی تایبەتی پێویستە لە سەر کۆمپیوتەرەکەت. [//www.mediawiki.org/wiki/Manual:External_editors زانیاریی زۆرتر.])',
-'tog-showjumplinks' => 'ڕێگە بدە بۆ بەستەرەکانی «{{int:jumpto}}»',
 'tog-uselivepreview' => 'لە پێشبینینی زیندوو کەڵک وەرگرە (جاڤاسکریپت پێویستە) (تاقیکاری‌)',
 'tog-forceeditsummary' => 'ئەگەر کورتەی دەستکاریم نەنووسی پێم بڵێ',
 'tog-watchlisthideown' => 'دەستکارییەکانم بشارەوە لە پێرستی چاودێری',
@@ -192,6 +192,7 @@ $messages = array(
 'tog-showhiddencats' => 'پۆلە شاردراوەکان نیشان بدە',
 'tog-noconvertlink' => 'لەکارخستنی ئاڵوگۆڕی سەرناوی بەستەر',
 'tog-norollbackdiff' => 'لە دوای گەڕاندنەوە جیاوازی نیشان مەدە',
+'tog-useeditwarning' => 'ھۆشیارم بکەوە کاتێک لە پەڕەیەکی دەستکاری بە گۆڕانکاریی پاشەکەوت‌نەکراو دەردەچم',
 
 'underline-always' => 'ھەمیشە',
 'underline-never' => 'قەت',
@@ -255,6 +256,18 @@ $messages = array(
 'oct' => 'تشرینی یەکەم',
 'nov' => 'تشرینی دووەم',
 'dec' => 'کانوونی یەکەم',
+'january-date' => '$1ی کانوونی دووەم',
+'february-date' => '$1ی شوبات',
+'march-date' => '$1ی ئازار',
+'april-date' => '$1ی نیسان',
+'may-date' => '$1ی ئایار',
+'june-date' => '$1ی حوزەیران',
+'july-date' => '$1ی تەممووز',
+'august-date' => '$1ی ئاب',
+'september-date' => '$1ی ئەیلوول',
+'october-date' => '$1ی تشرینی یەکەم',
+'november-date' => '$1ی تشرینی دووەم',
+'december-date' => '$1ی کانوونی یەکەم',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|پۆل|پۆلەکان}}',
@@ -337,6 +350,7 @@ $messages = array(
 'create-this-page' => 'ئەم پەڕە دروست بکە',
 'delete' => 'سڕینەوە',
 'deletethispage' => 'سڕینه‌وه‌ی ئه‌م په‌ڕه‌یه‌',
+'undeletethispage' => 'ئەم پەڕەیە بھێنەوە',
 'undelete_short' => '{{PLURAL:$1|یەک گۆڕانکاریی|$1 گۆڕانکاریی}} سڕاوە بەجێبھێنەرەوە',
 'viewdeleted_short' => '{{PLURAL:$1|یەک گۆڕانکاریی سڕاو|$1 گۆڕانکاریی سڕاو}} ببینە',
 'protect' => 'پاراستن',
@@ -378,7 +392,7 @@ $messages = array(
 $1',
 'pool-errorunknown' => 'هەڵەی نەزانراو',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'سەبارەت بە {{SITENAME}}',
 'aboutpage' => 'Project:سەبارەت',
 'copyright' => 'ناوەرۆک لە ژێر $1 لەبەردەستدایە.',
@@ -388,7 +402,6 @@ $1',
 'disclaimers' => 'نابەرپرسییەکان',
 'disclaimerpage' => 'Project:بەرپرسنەبوون',
 'edithelp' => 'ڕێنوێنیی دەستکاریکردن',
-'edithelppage' => 'Help:دەستکاریکردن',
 'helppage' => 'Help:ناوەرۆک',
 'mainpage' => 'دەستپێک',
 'mainpage-description' => 'دەستپێک',
@@ -470,17 +483,6 @@ $1',
 # General errors
 'error' => 'هه‌ڵه‌',
 'databaseerror' => 'ھەڵەی بنکەدراوه',
-'dberrortext' => 'ھەڵەیەکی ڕستەنووسی لە داواکاریی بنکەیدراو ڕووی داوە.
-لەوانەیە ئەوە نیشاندەری کەلێنێک لە نەرمامێرەکەدا بێت.
-دوایین تێکۆشان بۆ داواکاری بنکەیدراو:	
-<blockquote><code>$1</code></blockquote>
-لە ناو کرداری "<code>$2</code>".
-بنکەیدراو ھەڵەی "<samp>$3: $4</samp>" گەڕاندووەتەوە.',
-'dberrortextcl' => 'هەڵەیەکی ڕستەنووسی لە داواکاریی بنکە‌یدراو ڕوویداوە.
-دوایین تێکۆشان بۆ داواکاری بنکەیدراو ئەمە بووە:
-"$1"
-لە نێو کرداری "$2".
-بنکەیدراو ھەڵەی "$3: $4" گەڕاندووەتەوە',
 'laggedslavemode' => 'ئاگاداری: لەوانەیە لاپەڕەکە نوێکردنەکان لە بەر نەگرێت.',
 'readonly' => 'بنکەدراوە داخراوە',
 'enterlockreason' => 'هۆیەک بۆ قوفڵ‌کردنەکە بنووسە کە  تێیدا کاتی کردنەوەی قۆفڵەکە باس کرابێت',
@@ -536,7 +538,6 @@ $1',
 'editinginterface' => "'''ئاگاداری:''' تۆ خەریکی دەستکاریی پەڕەیەکی کە بۆ دابینکردنی دەقی ڕواڵەتی نەرمامێر بە کار دەھێنرێت.
 گۆڕانکاریی  ئەم پەڕەیە کاریگەر دەبێت لە سەر ڕواڵەتی پەڕەکانی بەکارھێنەرانی تر لەم ویکییەدا.
 بۆ زیادکردن یان گۆڕینی وەرگێڕانەکان بۆ ھەموو ویکییەکان، تکایە لە [//translatewiki.net/ translatewiki.net]، پرۆژەی ناوچەیی کردنی میدیاویکی کەڵک وەربگرە.",
-'sqlhidden' => '(داواکاریی SQL شاراوەیە)',
 'cascadeprotected' => 'ئەم لاپەڕە پارێزراوە لە دەستکاریی، چونکا خراوەتە سەر ڕیزی ئەم {{PLURAL:$1|لاپەڕانه‌، کە}} که‌ به‌ هه‌ڵکردنی بژارده‌ی داڕژان هه‌ڵکراوه‌:
 $2',
 'namespaceprotected' => "تۆ ناتوانی لاپەڕەکانی ناو نەیمسپەیسی '''$1''' بگۆڕی.",
@@ -559,10 +560,19 @@ $2',
 'welcomecreation-msg' => 'ھەژمارەکەت دروست کرا.
 لە بیرت نەچێت [[Special:Preferences|ھەڵبژاردەکانی {{SITENAME}}]]ت بگۆڕی.',
 'yourname' => 'ناوی بەکارھێنەری:',
+'userlogin-yourname' => 'ناوی بەکارھێنەر',
+'userlogin-yourname-ph' => 'ناوی بەکارھێنەریت بنووسە',
+'createacct-another-username-ph' => 'ناوی بەکارھێنەریت بنووسە',
 'yourpassword' => 'تێپەڕوشە:',
+'userlogin-yourpassword' => 'تێپەڕوشە',
+'userlogin-yourpassword-ph' => 'تێپەڕوشەکەت بنووسە',
+'createacct-yourpassword-ph' => 'تێپەروشەیەک بنووسە',
 'yourpasswordagain' => 'دیسان تێپەڕوشەکە بنووسەوە:',
+'createacct-yourpasswordagain' => 'تێپەروشە پشتڕاست بکەرەوە',
+'createacct-yourpasswordagain-ph' => 'تێپەروشە دیسان بنووسەوە',
 'remembermypassword' => 'چوونە ژوورەوەم لەسەر ئەم کۆمپیوتەرە پاشەکەوت بکە (ئەو پەڕی $1 {{PLURAL:$1|ڕۆژ}}ە)',
-'securelogin-stick-https' => 'پاش چوونەژوورەوە پەیوەندیی لەگەڵ HTTPS بھێڵەوە',
+'userlogin-remembermypassword' => 'چوونەژوورەوەکەم ڕابگرە',
+'userlogin-signwithsecure' => 'پەیوەندیی دڵنیا بەکاربھێنە',
 'yourdomainname' => 'دۆمەینەکەت:',
 'password-change-forbidden' => 'ناتوانیت تێپەڕوشەکانت لەم ویکییەدا بگۆڕیت.',
 'externaldberror' => 'یان هەڵەی ڕێگەپێدانی بنکەدراو هەیە یان ڕێگات پێ نادرێت بۆ نوێ کردنی هەژماری دەرەکیت.',
@@ -574,18 +584,38 @@ $2',
 'logout' => 'بچۆ دەرەوە',
 'userlogout' => 'بچۆ دەرەوە',
 'notloggedin' => 'لە ژوورەوە نیت',
+'userlogin-noaccount' => 'ھەژمارت نییە؟',
+'userlogin-joinproject' => 'ڕەگەڵ {{SITENAME}} کەوە',
 'nologin' => 'ھەژمارت نییە؟  $1.',
 'nologinlink' => 'ھەژمارێک دروست بکە',
 'createaccount' => 'ھەژمار دروست بکە',
 'gotaccount' => 'ھەژمارت ھەیە لێرە؟ $1.',
 'gotaccountlink' => 'بچۆ ژوورەوە',
 'userlogin-resetlink' => 'وردەکارییەکانی چوونەژوورەوەتت لە بیر کردووە؟',
+'userlogin-resetpassword-link' => 'تێپەڕوشە ڕیسێت بکەوە',
+'helplogin-url' => 'Help:چوونەژوورەوە',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|یارمەتی بۆ چوونەژوورەوە]]',
+'createacct-join' => 'زانیارییەکەت لە ژێرەوە بنووسە.',
+'createacct-emailrequired' => 'ناونیشانی ئیمەیل',
+'createacct-emailoptional' => 'ناونیشانی ئیمەیل (دڵخوازانە)',
+'createacct-email-ph' => 'ناونیشانی ئیمەیلەکەت بنووسە',
 'createaccountmail' => 'تێپەڕوشەیەکی ڕەمەکیی کاتی بەکاربھێنە و بینێرە بۆ ناونیشانی ئیمەیلی دیاری‌کراوی ژێرەوە',
+'createacct-realname' => 'ناوی ڕاستی (دڵخوازانە)',
 'createaccountreason' => 'هۆکار:',
+'createacct-reason' => 'ھۆکار',
+'createacct-reason-ph' => 'بۆ ھەژمارێکی تر دروست دەکەی',
+'createacct-captcha' => 'تاوتوێی ئاسایشی',
+'createacct-imgcaptcha-ph' => 'دەقەکەی لە ژێرەوە دەیبینی بینووسە',
+'createacct-submit' => 'ھەژمارەکەت دروست بکە',
+'createacct-benefit-heading' => '{{SITENAME}} لە لایەن کەسانێک وەکوو خۆت دروست کراوە.',
+'createacct-benefit-body1' => '{{PLURAL:$1|دەستکاری}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|پەڕە}}',
+'createacct-benefit-body3' => 'دوایین {{PLURAL:$1|بەشداربوو|بەشداربووان}}',
 'badretype' => 'تێپەڕوشەکان لەیەک ناچن.',
 'userexists' => 'ئەو ناوەی تۆ داوتە پێشتر بەکارھێنراوە.
 ناوێکی دیکە ھەڵبژێرە.',
 'loginerror' => 'ھەڵەی چوونەژوورەوە',
+'createacct-error' => 'ھەڵە لە دروستکردنی ھەژمار',
 'createaccounterror' => 'ناتوانیت هەژماری بەکارهێنەر دروست بکەیت: $1',
 'nocookiesnew' => 'ھەژماری بەکارھێنەر دروست‌کرا، بەڵام بە سەرکەوتوویی نەچوویتەوە ژوورەوە.
 {{SITENAME}} بۆ چوونەوە ژوورەوەی بەکارھێنەر لە شەکرۆکە کەڵک وەردەگرێت.
@@ -657,7 +687,7 @@ $2',
 'newpassword' => 'تێپەڕوشەی نوێ:',
 'retypenew' => 'تێپەڕوشەی نوێ دوبارە بنووسەوە:',
 'resetpass_submit' => 'تێپەڕوشە رێکخە و بچۆ ژوورەوە',
-'resetpass_success' => 'تێپەروشەکەت بە سەرکەوتوویی گۆڕدرا. ئێستا چوونە ژوورەوەت...',
+'changepassword-success' => 'تێپەروشەکەت بە سەرکەوتوویی گۆڕدرا. ئێستا چوونە ژوورەوەت...',
 'resetpass_forbidden' => 'تێپەڕوشەکە ناگۆڕدرێت',
 'resetpass-no-info' => 'بۆ گەیشتنی راستەوخۆ بەم پەڕە ئەشێ بچیتە ژوورەوە.',
 'resetpass-submit-loggedin' => 'تێپەڕوشە بگۆڕە',
@@ -668,7 +698,6 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'دووبارە ڕێکخستنەوەی تێپەڕوشە',
-'passwordreset-text' => 'ئەم فۆرمە پڕ بکەوە بۆ گرتنی ئیمەیلێکی بیرخەرەوەی وردەکارییەکانی ھەژمارەکەت.',
 'passwordreset-legend' => 'دووبارە ڕێکخستنەوەی تێپەڕوشە',
 'passwordreset-username' => 'ناوی بەکارھێنەری:',
 'passwordreset-domain' => 'پاوان:',
@@ -693,7 +722,7 @@ $2
 تێپەڕوشەی کاتی: $2',
 'passwordreset-emailsent' => 'ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا.',
 'passwordreset-emailsent-capture' => 'ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا، کە لە ژێرەوە نیشان دراوە.',
-'passwordreset-emailerror-capture' => 'ئیمەیلێکی بیرخەرەوە نێردرا کە لە خوارەوە نیشاندراوە، بەڵام ناردنی بۆ بەکارھێنەر تووشی ھەڵە بووە: $1',
+'passwordreset-emailerror-capture' => 'ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا، کە لە ژێرەوە نیشان دراوە، بەڵام ناردنەکەی بۆ {{GENDER:$2|بەکارھێنەر}} سەرکەوتوو نەبوو: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ئەدرەسی ئیمەیڵ بگۆڕە',
@@ -906,10 +935,12 @@ $2
 لەوە دەچی سڕدرابێتەوه.‌',
 'edit-conflict' => 'کێشەی دەستکاری.',
 'edit-no-change' => 'دەستکاریەکەت بەرچاو نەخرا، لەبەر ئەوەی هیچ گۆڕانکارییەکت لەسەر دەقەکە نەکردووە.',
+'postedit-confirmation' => 'دەستکارییەکەت پاشەکەوت کرا.',
 'edit-already-exists' => 'تواناییی دروستکردنی پەڕەی نوێ نییە.
 ئەمە پەڕەیە پێشتر هەبووە.',
 'defaultmessagetext' => 'دەقی پەیامی هەمیشەیی',
 'invalid-content-data' => 'دراوەی ناوەرۆکی نادروست',
+'editwarning-warning' => 'بەجێ‌هێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەست چوونی هەموو ئەو گۆڕانکاریانەی کردووتە.',
 
 # Content models
 'content-model-wikitext' => 'ویکیدەق',
@@ -1137,7 +1168,6 @@ $1",
 'searchmenu-legend' => 'ھەڵبژاردەکانی گەڕان',
 'searchmenu-exists' => "'''پەڕەیەک بە ناوی «[[:$1]]» لەم ویکییەدا ھەیە.'''",
 'searchmenu-new' => "'''لەم ویکییەدا پەڕەی « [[:$1]] » دروست بکە!'''",
-'searchhelp-url' => 'Help:پێرست',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|گەڕیان لە پەڕەکانی بەم پێشگرەوە]]',
 'searchprofile-articles' => 'پەڕە بە ناوەڕۆکەکان',
 'searchprofile-project' => 'پەڕەکانی یارمەتی و پڕۆژە',
@@ -1182,14 +1212,6 @@ $1",
 دەتوانی بۆ ئێستا لە گەڕانی گووگڵ کەڵک وەرگری.
 لەیادت بێت لەوانەیە پێرستەکانیان بۆ گەڕانی ناو {{SITENAME}}، کات‌بەسەرچوو بێت.',
 
-# Quickbar
-'qbsettings' => 'خێرا-تووڵ',
-'qbsettings-none' => 'هیچ',
-'qbsettings-fixedleft' => 'چەپ‌ سەپێندراو',
-'qbsettings-fixedright' => 'ڕاست سەپێندراو',
-'qbsettings-floatingleft' => 'سەراوی چەپ',
-'qbsettings-floatingright' => 'سەراوی ڕاست',
-
 # Preferences page
 'preferences' => 'ھەڵبژاردەکان',
 'mypreferences' => 'ھەڵبژاردەکان',
@@ -1222,7 +1244,6 @@ $1",
 'resetprefs' => 'گۆڕانکارییە پاشەکەوت نەکراوەکان پاک بکەرەوە',
 'restoreprefs' => 'ھەموو ڕێکخستنەکان ببەرەوە بۆ باری بنچینەیی',
 'prefs-editing' => 'دەستکاریکردن',
-'prefs-edit-boxsize' => 'قەبارەی پەنجەرەی دەستکاریکردن.',
 'rows' => 'ڕیزەکان:',
 'columns' => 'ستوونەکان:',
 'searchresultshead' => 'گەڕان',
@@ -1233,9 +1254,6 @@ $1",
 'recentchangesdays-max' => '(ئەوپەڕی $1 {{PLURAL:$1|ڕۆژە|ڕۆژە}})',
 'recentchangescount' => 'ژمارەی گۆڕانکارییەکان کە نیشان ئەدرێن لە حاڵەتی دیفاڵت:',
 'prefs-help-recentchangescount' => 'ئەمە دوایین گۆڕانکارییەکان، مێژووی پەڕەکان و لۆگەکانیش لەبەردەگرێت.',
-'prefs-help-watchlist-token' => 'بە پڕ کردنەوەی ئەم شوێنە بۆشاییە بە وشەیەکی نهێنی، فیدی RSS بۆ لیستی چاودێریەکەت درووست دەکرێت.
- هەر کەس ئەو وشە نهێنیەی هەبێ دەتوانێ چاو لە لیستی چاودێریەکەت بکات، بۆیە دراوەیەکی پارێزراو هەڵیبژێرە.
-فەرموو ئەمە دراوەیەکی بە هەڵکەوت درووست‌کراو کە دەتوانی کەڵکی لێ‌وەرگری: $1',
 'savedprefs' => 'ھەڵبژاردەکانت پاشەکەوت کران',
 'timezonelegend' => 'ناوچەکات:',
 'localtime' => 'کاتی ناوچەیی:',
@@ -1266,7 +1284,6 @@ $1",
 'prefs-reset-intro' => 'دەتوانی لەم لاپەڕە بۆ گەڕانەوەی هەڵبژاردەکانت بۆ بنچینەیی ماڵپەر کەڵک وەرگریت.
 گەر ئەوە بکەی ئیتر گۆڕانەکەت ناگەڕێتەوە.',
 'prefs-emailconfirm-label' => 'پشتڕاست کردنەوەی ئیمەیل:',
-'prefs-textboxsize' => 'قەبارەی پەنجەرەی دەستکاریکردن',
 'youremail' => 'ئیمەیل:',
 'username' => '{{GENDER:$1|ناوی به‌کارھێنەر}}:',
 'uid' => 'پێناسەی {{GENDER:$1|به‌کارھێنەر}}:',
@@ -1397,11 +1414,19 @@ $1",
 'right-proxyunbannable' => 'لادان لە بەربەستنە خۆگەڕەکانی پرۆکسییەکان',
 'right-unblockself' => 'کردنەوەی خۆیان',
 'right-protect' => 'گۆڕینی ئاستەکانی پاراستن و دەستکاریی پەڕە پارێزراوە تاڤگەیییەکان',
-'right-editprotected' => 'دەستکاری لاپەڕە پارێزراوەکان (بێ پاراستنی زنجیری)',
+'right-editprotected' => 'دەستکاریی پەڕە پارێزراوەکانی وەک «{{int:protect-level-sysop}}»',
+'right-editsemiprotected' => 'دەستکاریی پەڕە پارێزراوەکانی وەک «{{int:protect-level-autoconfirmed}}»',
 'right-editinterface' => 'دەستکاریی ڕووکاری بەکارھێنەر',
 'right-editusercssjs' => 'دەستکاریی پەڕگەکانی جاڤاسکریپت و CSSی بەکارھێنەرانی تر',
 'right-editusercss' => 'دەستکاریی پەڕگەکانی CSSی بەکارھێنەرانی تر',
 'right-edituserjs' => 'دەستکاریی پەڕگەکانی جاڤاسکریپتی بەکارھێنەرانی تر',
+'right-editmyusercss' => 'دەستکاریی پەڕگەکانی CSSی بەکارھێنەریی خۆی',
+'right-editmyuserjs' => 'دەستکاریی پەڕگەکانی جاڤاسکریپتی بەکارھێنەریی خۆی',
+'right-viewmywatchlist' => 'دیتنی پێرستی چاودێریی خۆی',
+'right-editmywatchlist' => 'دەستکاریی پێرستی چاودێریی خۆی. تکایە لەبەر چاو بگرە ھەندێک کردەوە ھێشتا پەڕەکان زیاد دەکا تەنانەت بەبێ ئەم مافە.',
+'right-viewmyprivateinfo' => 'دیتنی دراوە تایبەتییەکانی خۆی (وەک ناونیشانی ئیمەیل، ناوی ڕاستی)',
+'right-editmyprivateinfo' => 'دەستکاریی دراوە تایبەتییەکانی خۆی (وەک ناونیشانی ئیمەیل، ناوی ڕاستی)',
+'right-editmyoptions' => 'دەستکاریی ھەڵبژاردەکانی خۆی',
 'right-rollback' => 'گەڕاندنەوەی خێرای دەستکاریەکانی دوایین بەکارھێنەر کە پەڕەیەکی دیاریکراوی دەستکاری کردووە',
 'right-markbotedits' => 'نیشانکردنی دەستکارییە گەڕێنراوەکان وەک دەستکارییەکانی بۆت',
 'right-noratelimit' => 'کاریگەری وەرنەگرتن لە سنوورەکانی خێرایی',
@@ -1504,7 +1529,6 @@ $1",
 'recentchangeslinked-feed' => 'گۆڕانکارییە پەیوەندیدارەکان',
 'recentchangeslinked-toolbox' => 'گۆڕانکارییە پەیوەندیدارەکان',
 'recentchangeslinked-title' => 'گۆڕانکارییە پەیوەندیدارەکان بە "$1" ـەوە',
-'recentchangeslinked-noresult' => 'هیچ گۆڕانکارییەک لە لاپەڕەکانی بەستەر پێ‌دراو، لە درێژەی ماوەی دراوە.',
 'recentchangeslinked-summary' => "ئەمە لیستێکی گۆڕانکارییەکانی ئەم دوایییانەی ئەو پەڕانەیە کە بەستەریان ھەیە لە پەڕەیەکی دیاریکراو (یان بۆ ئەندامەکانی پۆلێکی دیاریکراو)
 پەڕەکانی [[Special:Watchlist|لیستی چاودێرییەکەت]] '''ئەستوورن'''.",
 'recentchangeslinked-page' => 'ناوی پەڕە:',
@@ -1516,7 +1540,7 @@ $1",
 'reuploaddesc' => 'هەڵوەشانەوەی بارکردن و گەڕانەوە بۆ فۆرمی بارکردن',
 'upload-tryagain' => 'پێناسەی گۆڕدراوی پەڕگە بنێرە',
 'uploadnologin' => 'لەژوورەوە نیت',
-'uploadnologintext' => 'بۆ بارکردنی پەڕگەکان ئەشێ [[Special:UserLogin|لە ژوورەوە بیت]].',
+'uploadnologintext' => 'بۆ بارکردنی پەڕگەکان دەبێ $1.',
 'upload_directory_missing' => 'لقی بارکردن ($1) ون بووە و ڕاژەکاری‌وێب بۆی درووست ناکرێت.',
 'upload_directory_read_only' => 'ڕاژەکاری‌وێب دەسەڵاتی نووسینی سەر لقی بارکردنی ($1) نیە.',
 'uploaderror' => 'ھەڵە لە بارکردن دا',
@@ -1658,9 +1682,6 @@ $1',
 'img-auth-nofile' => 'فایلی "$1" بوونی نیه‌',
 'img-auth-isdir' => 'هه‌وڵ ده‌ده‌ی بۆ کردنه‌وه‌ی بوخچه‌ی "$1" له‌ کاتێکدا ته‌نیا کردنه‌وه‌ی فایل رێپێدراوه‌',
 
-# HTTP errors
-'http-host-unreachable' => 'توانای دەست‌پێ‌گەیشتنی URL نیە',
-
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'توانای دەست‌پێ‌گەیشتنی URL نیە',
 'upload-curl-error6-text' => 'ئەو URL کە ڕاچاوت کردووە توانای دەست‌پێ‌گەیشتنی نییە.
@@ -1805,12 +1826,6 @@ $1',
 'statistics-users-active-desc' => 'ئەو بەکارھێنەرانە کە لە {{PLURAL:$1|ڕۆژ|$1 ڕۆژ}}ی ڕابردوودا کارێکیان جێبەجێ کردبێت.',
 'statistics-mostpopular' => 'زۆرترین لاپەڕە بینراوەکان',
 
-'disambiguations' => 'پەڕەکانی بەستەردراو بۆ پەڕەکانی ڕوونکردنەوە',
-'disambiguationspage' => 'Template:ڕوونکردنەوە',
-'disambiguations-text' => "ئەم پەڕانە لانی کەم یەک بەستەریان بۆ '''پەڕەی ڕوونکردنەوە''' ھەیە.
-لەوانەیە لە جیاتی ئەو، بەستەریان ھەبێت  بۆ بابەتەکانیی گونجاو.<br />
-ئەگەر پەڕەیەک لە داڕێژەیەک کەڵک وەرگرێت کە بەستەری ھەبێت بۆ [[MediaWiki:Disambiguationspage]]، وەک پەڕەی ڕوونکردنەوە لەبەر چاو دەگیرێت.",
-
 'pageswithprop' => 'پەڕەکان بە تایبەتمەندیی پەڕە',
 'pageswithprop-legend' => 'پەڕەکان بە تایبەتمەندیی پەڕە',
 'pageswithprop-text' => 'ئەم پەڕەیە ئەو پەڕانەی تایبەتمەندییەکی پەرەیەکی دیاریکراو بەکاردەھێنن پێرست دەکا.',
@@ -2057,10 +2072,9 @@ $1',
 'unwatchthispage' => 'ئیتر چاودێری مەکە',
 'notanarticle' => 'پەڕەی بێ ناوەڕۆک',
 'notvisiblerev' => 'پیاچوونەوە سڕاوەتەوە',
-'watchnochange' => 'ھیچکام لەو بابەتانە چاودێڕییان دەکەیت، لە ماوەی نیشاندراودا دەستکاری نەکراون.',
 'watchlist-details' => '{{PLURAL:$1|$1 پەڕە|$1 پەڕە}} لە لیستی چاودێریەکەتدایە، بێجگە پەڕەکانی لێدوان.',
-'wlheader-enotif' => '* ئەکرێ بە E-mail ئاگاداری بدەی',
-'wlheader-showupdated' => "* ‏ئەو پەڕانە کە لە پاش دواین سەردانت دەستکاری کراون بە '''ئەستوور''' نیشان دراون",
+'wlheader-enotif' => 'ئاگاداری بە ئیمەیل چالاکە.',
+'wlheader-showupdated' => "‏ئەو پەڕانە کە لە پاش دواین سەردانت دەستکاری کراون بە '''ئەستوور''' نیشان دراون",
 'watchmethod-recent' => 'سەرنج‌دانی دوایین دەستکاریەکان بۆ لاپەڕە چاودێری‌کراوەکان',
 'watchmethod-list' => 'سەرنج‌دانی لاپەڕە چاودێری‌کراوەکان بۆ دوایین دەستکاریەکان',
 'watchlistcontains' => 'لیستی چاودێڕییەکانت $1 {{PLURAL:$1|پەڕە|پەڕە}}ی تێدایە.',
@@ -2447,12 +2461,9 @@ $1',
 'ipb_blocked_as_range' => 'هەڵە: ئای‌پی $1 ڕاستەوخۆ بەربەست نەکراوە بۆیە ناکڕێت لە بەربەست لای‌ بەیت.
 ئەوە وەک بەشێک لە زنجیرە ئای‌پیی $2 بەربەست کراوە و هەر بەو شێوە دەکرێ لە بەربەست دەرچێ.',
 'ip_range_invalid' => 'زنجیرە ئای‌پی نەگونجاو.',
-'blockme' => 'بەربەست‌کردنی من',
 'proxyblocker' => 'بەربەست‌کەری پرۆکسی',
-'proxyblocker-disabled' => 'ئەم فەنکشێنە لەکار خستراوە.',
 'proxyblockreason' => 'ناونیشانی ئای‌پی تۆ بەربەست‌کراوە لەبەر ئەوەی پرۆکسیەکی کراوەیە.
 تکایە پەیوەندی بکە بە دابینکەری خزمەتی ئینتەرنەتی خۆت یان پاڵپشتی تەکنیکی و ئاگادریان کەوە لەو کێشە ئەمنیە گرینگە.',
-'proxyblocksuccess' => 'جێ‌بەجێ‌کرا.',
 'sorbsreason' => 'ناونیشانی ئای‌پی تۆ لە DNSBLدا کە {{SITENAME}} کەڵکی لێ‌وەر دەگرێ، وەک پرۆکسیەکی کراوە لیست کراوە.',
 'sorbs_create_account_reason' => 'ناونیشانی ئای‌پی تۆ لە DNSBLدا کە {{SITENAME}} کەڵکی لێ‌وەر دەگرێ، وەک پرۆکسیەکی کراوە لیست کراوە.
 بۆیە ناتوانی هەژمارە درووست‌بکەی.',
@@ -2811,13 +2822,8 @@ $1',
 'pageinfo-category-files' => 'ژمارەی پەڕگەکان',
 
 # Skin names
-'skinname-standard' => 'کلاسیک',
-'skinname-nostalgia' => 'غەریبی',
 'skinname-cologneblue' => 'شینی کۆلۆن',
 'skinname-monobook' => 'مۆنۆ',
-'skinname-myskin' => 'پێستی خۆم',
-'skinname-chick' => 'جووچک',
-'skinname-simple' => 'ساکار',
 'skinname-modern' => 'مۆدێڕن',
 'skinname-vector' => 'ڤێکتۆر',
 
@@ -2888,11 +2894,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 خولەک}}',
 'hours' => '{{PLURAL:$1|$1 کاتژمێر}}',
 'days' => '{{PLURAL:$1|$1 ڕۆژ}}',
+'weeks' => '{{PLURAL:$1|$1 حەفتە}}',
 'months' => '{{PLURAL:$1|$1 مانگ}}',
 'years' => '{{PLURAL: $1|$1 ساڵ}}',
 'ago' => '$1 لەمە پێش',
 'just-now' => 'ھەرئێستا',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|کاتژمێر}} لەمه پێش',
+'minutes-ago' => '$1 {{PLURAL:$1|خولەک}} لەمە پێش',
+'seconds-ago' => '$1 {{PLURAL:$1|چرکە}} لەمە پێش',
+'monday-at' => 'دووشەممە $1',
+'tuesday-at' => 'سێشەممە $1',
+'wednesday-at' => 'چوارشەممە $1',
+'thursday-at' => 'پێنجشەممە $1',
+'friday-at' => 'ھەینی $1',
+'saturday-at' => 'شەممە $1',
+'sunday-at' => 'یەکشەممە $1',
+'yesterday-at' => 'دوێنێ $1',
+
 # Bad image list
 'bad_image_list' => 'فۆرمات بەم شێوەی خوارەوەیە:
 
@@ -2925,7 +2945,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'پانی',
 'exif-imagelength' => 'بەرزی',
 'exif-ycbcrpositioning' => 'شوێنی Y و C',
@@ -2992,7 +3012,7 @@ $1',
 # Make & model, can be wikified in order to link to the camera and model name
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'نەپەستێنراو',
 
 'exif-copyrighted-true' => 'خاوەنی مافی بڵاوکردنەوە',
@@ -3363,7 +3383,6 @@ $5
 'version-other' => 'Other',
 'version-mediahandlers' => 'Media handlers',
 'version-hooks' => 'قولاپەکان',
-'version-extension-functions' => 'Extension functions',
 'version-parser-extensiontags' => 'Parser extension tags',
 'version-parser-function-hooks' => 'Parser function hooks',
 'version-hook-name' => 'ناوی قولاپ',
@@ -3376,13 +3395,6 @@ $5
 'version-software-version' => 'وەشان',
 'version-entrypoints-header-url' => 'ناونیشانی ئینتەرنێتی',
 
-# Special:FilePath
-'filepath' => 'ڕێڕەوی پەڕگە',
-'filepath-page' => 'پەڕگە:',
-'filepath-submit' => 'بڕۆ',
-'filepath-summary' => 'ئەم لاپەڕە تایبەتە ڕێڕەوی تەواو بۆ پەڕگەیەک دەگەڕێنێتەوە.
-وێنەکان لە قەبارەی تەواو‌دا نیشان‌ دەدرێن و جۆرە پەڕگەکانی دیکە بە پڕۆگرامی هاوپەیوەندی خۆی ڕاستەوخۆ دەست‌پێ‌دەکات.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'گەڕان بۆ پەڕگە دووپات کراوەکان',
 'fileduplicatesearch-summary' => 'گەڕان بۆ پەڕگە دووبارەکراوەکان لەسەر بنەمای نرخی hash.',
diff --git a/languages/messages/MessagesCo.php b/languages/messages/MessagesCo.php
index d54e0306..198345f4 100644
--- a/languages/messages/MessagesCo.php
+++ b/languages/messages/MessagesCo.php
@@ -491,7 +491,7 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'ilsubmit' => 'Ricerca',
 'bydate' => 'per data',
 
-# EXIF tags
+# Exif tags
 'exif-orientation' => 'Orientazione',
 'exif-imagedescription' => "Titulu di l'imagine",
 'exif-artist' => 'Autore',
@@ -532,9 +532,6 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 # Special:Version
 'version' => 'Versione',
 
-# Special:FilePath
-'filepath-page' => 'Schedariu:',
-
 # Special:SpecialPages
 'specialpages' => 'Pagine spiciale',
 
diff --git a/languages/messages/MessagesCps.php b/languages/messages/MessagesCps.php
index 5184de1f..17de57f0 100644
--- a/languages/messages/MessagesCps.php
+++ b/languages/messages/MessagesCps.php
@@ -43,10 +43,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ipakita ang mga numero sang mga gatan-aw nga manug-usar',
 'tog-oldsig' => 'Nagkayara nga pirma:',
 'tog-fancysig' => 'Ituring ang pirma bilang teksto sang wiki (wala sang automatik nga link)',
-'tog-externaleditor' => 'Maggamit sang panggwa nga manug-ilis paagi sa default ( para sa mga ekspeto lang, kinanglan ang espesyal nga mga setting sa imo kompyuter)',
-'tog-externaldiff' => 'Maggamit sang panggwa nga kinala-in paagi sa default ( para sa mga ekspeto lang, kinanglan ang espesyal nga setting sa imo kumpyuter.
-[//www.mediawiki.org/wiki/Manual:External_editors Mas madamu pa nga impormasyon.])',
-'tog-showjumplinks' => 'Pasugtan ang mga "tumbo sa" kadali-an nga mga link',
 'tog-uselivepreview' => 'Maggamit sang buhi nga prebyu (kinanglan ang Javascript) (Eksperimental)',
 'tog-forceeditsummary' => 'Hambalan ako kung nagapasulod sang wala unod nga pag-ilis kabilugan',
 'tog-watchlisthideown' => 'Itago ang akon mga pagbag-o halin sa listahan sang mga ginabantayan',
@@ -244,7 +240,7 @@ $1',
 'pool-queuefull' => 'Puno na ang pisan sang mga pila',
 'pool-errorunknown' => 'Wala nabal-an nga kasal-anan',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Tuhoy sa {{SITENAME}}',
 'aboutpage' => 'Project:Nahanungod sa',
 'copyright' => 'Ang unod bakante sa idalum sang $1',
@@ -254,7 +250,6 @@ $1',
 'disclaimers' => 'Mga pagpangindi',
 'disclaimerpage' => 'Project:Pangkabilugan nga pagpangindi',
 'edithelp' => 'Bulig sa pag-ilis',
-'edithelppage' => 'Help:Pag-ilis',
 'helppage' => 'Help:Mga ka-undan',
 'mainpage' => 'Panguna nga pahina',
 'mainpage-description' => 'Panguna nga pahina',
@@ -328,17 +323,6 @@ Ang listahan sang inbalido nga mga pinasahi nga pahina makit-an sa [[Special:Spe
 # General errors
 'error' => 'Sala',
 'databaseerror' => 'Diperensya sa database',
-'dberrortext' => 'May sala sa database query syntax.
-Posible tungod mini sa depekto sa software.
-Ang nagligad nga database query mini:
-<blockquote><tt>$1</tt></blockquote>
-nga halin sa ulubrahon nga "<tt>$2</tt>".
-Nagbalik sang sala nga "<tt>$3: $4</tt>" ang MySQL.',
-'dberrortextcl' => 'May ara sang kasal-anan sa usisa nga pangpapagpaangot sa kalipunan sang datos.
-Ang ulihi nga pagtisting pagusisa sa kalipunan sang datos amu ang:
-"$1"
-halin sa ulubrahon nga "$2".
-Ginbalik sang kalipunan sang datos ang kasal-anan nga "$3: $4"',
 'laggedslavemode' => 'Pahibalo: Posible nga wala unod ang pahina sang mga yanda nga bag-ong nadugang.',
 'readonly' => 'Nakakandado ang database',
 'enterlockreason' => 'Maghatag sang kabangdanan sa pagkakandado, upod ang bana-bana kung san-o ang kandado ibuy-an',
@@ -391,7 +375,6 @@ Palihog tistingan liwat sa pila ka minutos.',
 'editinginterface' => "'''Paandam:''' gin-islan mo ang pahina nga gina-usar nga nagahatag teksto sang interface sa sopwer.
 Makaapekto ang mga gin-islan sa mini nga pahina sa gwaan nga itsura ka interface sang manug-usar sa iban nga mga manug-usar.
 Para sa mga pagtransleyt, palihog konsidera gamit ang [http://translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], ang MediaWiki proyekto sa paglokalisa.",
-'sqlhidden' => '(nakatago ang pamangkot sang SQL)',
 'cascadeprotected' => 'Ginprotektahan ang mini nga pahina sa pagpangilis, tungod naupod ini sa mga gasunod nga {{PLURAL:$1|pahina, nga|mga pahina, nga}} protektado upod ang "cascading" nga pilili-an nga naga-andar:
 $2',
 'namespaceprotected' => "Wala ka sang permiso nga magliwat sang mga pahina nga ara sa namespace nga '''$1'''.",
diff --git a/languages/messages/MessagesCrh_cyrl.php b/languages/messages/MessagesCrh_cyrl.php
index fce5ba82..1d8cf70a 100644
--- a/languages/messages/MessagesCrh_cyrl.php
+++ b/languages/messages/MessagesCrh_cyrl.php
@@ -135,9 +135,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Козеткен къулланыджы сайысыны косьтер',
 'tog-oldsig' => 'Шимдики имза:',
 'tog-fancysig' => 'Имза викиметин киби олсун (автоматик багъланты олмаз)',
-'tog-externaleditor' => 'Тыш тюрлендиргич (редактор) къуллан (теджрибели къулланыджылар ичюн; компьютеринъизни махсус сазламакъ керек. [ //www.mediawiki.org/wiki/Manual:External_editors тафсилятлы малюмат мында])',
-'tog-externaldiff' => 'Тенъештирмек ичюн тыш бир программа къуллан (теджрибели къулланыджылар ичюн; компьютеринъизни махсус сазламакъ керек. [ //www.mediawiki.org/wiki/Manual:External_editors тафсилятлы малюмат мында])',
-'tog-showjumplinks' => '«Бар» багълантысыны фааллештир',
 'tog-uselivepreview' => 'Джанлы бакъып чыкъув хусусиетини къуллан (JavaScript) (даа денъеме алында)',
 'tog-forceeditsummary' => 'Денъиштирменинъ къыскъа тарифини бош ташласам мени тенбиле',
 'tog-watchlisthideown' => 'Козетюв джедвелимден меним денъиштирмелеримни гизле',
@@ -233,7 +230,7 @@ $messages = array(
 'noindex-category' => 'Индекссиз саифелер',
 'broken-file-category' => 'Ичинде бозукъ файл багълантылары олгъан саифелер',
 
-'linkprefix' => '/^(.*?)([a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„])))(.+)$/sDu',
 
 'about' => 'Акъкъында',
 'article' => 'Саифе',
@@ -336,7 +333,7 @@ $1',
 'pool-queuefull' => 'Соратма топлайыджысы толу',
 'pool-errorunknown' => 'Билинмеген хата',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} акъкъында',
 'aboutpage' => 'Project:Акъкъында',
 'copyright' => 'Малюмат $1 бинаэн кечилип ола.',
@@ -346,7 +343,6 @@ $1',
 'disclaimers' => 'Джевапкярлыкъ реди',
 'disclaimerpage' => 'Project:Умумий Малюмат Мукъавелеси',
 'edithelp' => 'Саифелер насыл денъиштирилир?',
-'edithelppage' => 'Help:Саифе насыл денъиштирилир',
 'helppage' => 'Help:Мундеридже',
 'mainpage' => 'Баш Саифе',
 'mainpage-description' => 'Баш Саифе',
@@ -423,16 +419,6 @@ $1',
 # General errors
 'error' => 'Хата',
 'databaseerror' => 'Малюмат базасынынъ хатасы',
-'dberrortext' => 'Малюмат базасындан сораткъанда синтаксис хатасы олды.
-Бу программадаки бир хата ола биле.
-"<tt>$2</tt>" функциясындан олгъан малюмат базасындан сонъки соратма:
-<blockquote><tt>$1</tt></blockquote>.
-Малюмат базасынынъ бильдирген хатасы "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Малюмат базасындан сораткъанда синтаксис хатасы олды.
-Малюмат базасындан сонъки соратма:
-«$1»
-Къулланылгъан функция «$2».
-Малюмат базасынынъ бильдирген хатасы «$3: $4».',
 'laggedslavemode' => 'Дикъкъат! Бу саифеде сонъки янъарув олмай биле.',
 'readonly' => 'Малюмат базасы килитленди',
 'enterlockreason' => 'Блок этювнинъ себебини ве девамыны кирсетинъиз.',
@@ -481,7 +467,6 @@ $1',
 'viewsourcetext' => 'Саифенинъ кодуны козьден кечирип копиялай билесинъиз:',
 'protectedinterface' => 'Бу саифеде система интерфейсининъ метни бар. Онынъ ичюн мында бир хата чыкъмасын деп оны денъиштирмек ясакъ.',
 'editinginterface' => "'''Тенби''': MediaWiki системасынынъ интерфейс саифесини денъиштиреятасыз. Бу саифедеки денъиштирмелер интерфейснинъ корюнишини бу викининъ башкъа къулланыджылары ичюн де денъиштиреджек. Лютфен, вики интерфейсини терджиме этмек ичюн [//translatewiki.net/wiki/Main_Page?setlang=crh translatewiki.net] сайтыны (MediaWiki ресмий локализация лейхасы) къулланынъыз.",
-'sqlhidden' => '(SQL истинтагъы сакълы)',
 'cascadeprotected' => 'Бу саифени денъиштирип оламазсынъыз, чюнки каскад къорчалав алтында булунгъан {{PLURAL:$1|саифеге|саифелерге}} менсюптир:
 $2',
 'namespaceprotected' => "'''$1''' исим фезасында саифелер денъиштирмеге акъкъынъыз ёкъ.",
@@ -502,7 +487,6 @@ $2',
 'yourpassword' => 'Паролинъиз',
 'yourpasswordagain' => 'Парольни бир даа язынъыз:',
 'remembermypassword' => 'Киришимни бу компьютерде хатырла (энъ чокъ $1 {{PLURAL:$1|кунь|кунь}} ичюн)',
-'securelogin-stick-https' => 'Кирген сонъ HTTPS-ге багъланып тур',
 'yourdomainname' => 'Домен адынъыз',
 'externaldberror' => 'Сайткъа киргенде бир хата олды. Бу тыш эсабынъызны денъиштирмек акъкъынъыз олмагъанындан себеп мейдангъа келип ола.',
 'login' => 'Кириш',
@@ -585,7 +569,7 @@ $2 къулланыджысына вакътынджа <code>$3</code> паро
 'newpassword' => 'Янъы пароль',
 'retypenew' => 'Янъы парольни текрар язынъыз',
 'resetpass_submit' => 'Пароль къойып кир',
-'resetpass_success' => 'Паролинъиз мувафакъиетнен денъиштирильди! Отурымынъыз ачылмакъта...',
+'changepassword-success' => 'Паролинъиз мувафакъиетнен денъиштирильди! Отурымынъыз ачылмакъта...',
 'resetpass_forbidden' => 'Пароль денъиштирмек ясакъ',
 'resetpass-no-info' => 'Бу саифеге догърудан иришмек ичюн отурым ачмакъ керексинъиз.',
 'resetpass-submit-loggedin' => 'Парольни денъиштир',
@@ -853,7 +837,6 @@ $3 мына бу себепни бильдирди: ''$2''",
 'searchmenu-legend' => 'Къыдырув сазламалары',
 'searchmenu-exists' => "'''Бу викиде \"[[:\$1]]\" адлы бир саифе бар'''",
 'searchmenu-new' => "'''Бу викиде \"[[:\$1]]\" саифесини ярат!'''",
-'searchhelp-url' => 'Help:Мундеридже',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Бу префиксли саифелерни косьтер]]',
 'searchprofile-articles' => 'Малюмат саифелери',
 'searchprofile-project' => 'Ярдым ве лейха саифелери',
@@ -893,9 +876,6 @@ $3 мына бу себепни бильдирди: ''$2''",
 'search-external' => 'Тыш къыдырув',
 'searchdisabled' => '{{SITENAME}} сайтында къыдырув япма вакътынджа токътатылды. Бу арада Google къулланып {{SITENAME}} ичинде къыдырув япып оласынъыз. Къыдырув сайтларында индекслемелерининъ бираз эски къалгъан ола биледжегини козь огюне алынъыз.',
 
-# Quickbar
-'qbsettings' => 'Вызлы иришим сутун сазламалары',
-
 # Preferences page
 'preferences' => 'Сазламалар',
 'mypreferences' => 'Сазламалар',
@@ -923,7 +903,6 @@ $3 мына бу себепни бильдирди: ''$2''",
 'resetprefs' => 'Сакъланмагъан сазламаларны ильк алына кетир',
 'restoreprefs' => 'Бутюн ог бельгиленген сазламаларны къайтар',
 'prefs-editing' => 'Саифелерни денъиштирюв',
-'prefs-edit-boxsize' => 'Язув пенджересининъ ольчюлери.',
 'rows' => 'Сатыр',
 'columns' => 'Сутун',
 'searchresultshead' => 'Къыдырув',
@@ -958,7 +937,6 @@ $3 мына бу себепни бильдирди: ''$2''",
 'prefs-files' => 'Файллар',
 'prefs-reset-intro' => 'Бу саифени сазламаларынъызны сайт ог бельгиленгенине къайтармакъ ичюн къуллана билесинъиз. Бу лягъу этилип оламаз.',
 'prefs-emailconfirm-label' => 'E-mail тасдыкъланмасы:',
-'prefs-textboxsize' => 'Язув пенджересининъ ольчюлери',
 'youremail' => 'E-mail адресинъиз:',
 'username' => 'Къулланыджы ады:',
 'uid' => 'Къайд номери:',
@@ -1079,7 +1057,6 @@ $3 мына бу себепни бильдирди: ''$2''",
 'recentchangeslinked-feed' => 'Багълы денъиштирмелер',
 'recentchangeslinked-toolbox' => 'Багълы денъиштирмелер',
 'recentchangeslinked-title' => '"$1" иле багълы денъиштирмелер',
-'recentchangeslinked-noresult' => 'Сайлангъан вакъытта багълы саифелерде ич бир денъиштирме олмады.',
 'recentchangeslinked-summary' => "Бу махсус саифеде багълы саифелерде сонъки япылгъан денъиштирмелер джедвели бар. [[Special:Watchlist|Козетюв джедвелинъиз]]деки саифелер '''къалын''' оларакъ косьтериле.",
 'recentchangeslinked-page' => 'Саифе ады:',
 'recentchangeslinked-to' => 'Берильген саифе ерине берильген саифеге багъланты берген олгъан саифелерини косьтер',
@@ -1270,12 +1247,6 @@ $3 мына бу себепни бильдирди: ''$2''",
 'statistics-header-hooks' => 'Дигер статистика',
 'statistics-mostpopular' => 'Энъ сыкъ бакъылгъан саифелер',
 
-'disambiguations' => 'Чокъ маналы терминлер саифелери',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Ашагъыдыки саифелер '''чокъ маналы саифелер'''ге багъланты ола.
-Бельки де олар бир конкрет саифеге багъланты олмалы.<br />
-Эгер саифеде, [[MediaWiki:Disambiguationspage]] саифесинде ады кечкен шаблон ерлештирильген олса, о саифе чокъ маналыдыр.",
-
 'doubleredirects' => 'Ёлламагъа олгъан ёлламалар',
 'doubleredirectstext' => 'Бу саифеде дигер ёллама саифелерине ёлланма олгъан саифелери косьтериле.
 Эр сатырда биринджи ве экинджи ёлламагъа багълантылар да, экинджи ёлламанынъ макъсат саифеси (адетиндже о биринджи ёлламанынъ керекли макъсады ола) да бар.
@@ -1426,10 +1397,9 @@ $3 мына бу себепни бильдирди: ''$2''",
 'unwatch' => 'Козетме',
 'unwatchthispage' => 'Бу саифени козетме',
 'notanarticle' => 'Малюмат саифеси дегиль',
-'watchnochange' => 'Косьтерильген заман аралыгъында козетюв джедвелинъиздеки саифелернинъ ич бири денъиштирильмеген.',
 'watchlist-details' => 'Музакере саифелерини эсапкъа алмайып, козетюв джедвелинъизде {{PLURAL:$1|1|$1}} саифе бар.',
-'wlheader-enotif' => '* E-mail иле хабер берюв ачылды.',
-'wlheader-showupdated' => "* Сонъки зияретинъизден сонъ денъиштирильген саифелер '''къалын арифлернен''' косьтерильди.",
+'wlheader-enotif' => 'E-mail иле хабер берюв ачылды.',
+'wlheader-showupdated' => "Сонъки зияретинъизден сонъ денъиштирильген саифелер '''къалын арифлернен''' косьтерильди.",
 'watchmethod-recent' => 'сонъки денъиштирмелер арасында козеткен саифелеринъиз къыдырыла',
 'watchmethod-list' => 'козетюв джедвелиндеки саифелер тешкериле',
 'watchlistcontains' => 'Сизинъ козетюв джедвелинъизде {{PLURAL:$1|1|$1}} саифе бар.',
@@ -1818,13 +1788,8 @@ MediaWiki интерфейсининъ чешит тиллерге терджи
 'spam_blanking' => 'Бар олгъан версияларда $1 сайтына багълантылар бар, темизлев',
 
 # Skin names
-'skinname-standard' => 'Стандарт',
-'skinname-nostalgia' => 'Ностальгия',
 'skinname-cologneblue' => 'Кёльн асретлиги',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Озь ресимлеме',
-'skinname-chick' => 'Чипче',
-'skinname-simple' => 'Адий',
 
 # Patrol log
 'patrol-log-page' => 'Тешкерюв журналы',
@@ -1897,7 +1862,7 @@ MediaWiki интерфейсининъ чешит тиллерге терджи
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-make' => 'Камера маркасы',
 'exif-model' => 'Камера модели',
 'exif-artist' => 'Яратыджысы',
@@ -1922,7 +1887,7 @@ MediaWiki интерфейсининъ чешит тиллерге терджи
 'exif-gpstimestamp' => 'GPS сааты (атом сааты)',
 'exif-gpssatellites' => 'Ольчемек ичюн къуллангъаны спутниклер',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Сыкъыштырылмагъан',
 
 'exif-orientation-3' => '180° айландырылгъан',
diff --git a/languages/messages/MessagesCrh_latn.php b/languages/messages/MessagesCrh_latn.php
index e6a763e0..9b516380 100644
--- a/languages/messages/MessagesCrh_latn.php
+++ b/languages/messages/MessagesCrh_latn.php
@@ -129,9 +129,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Közetken qullanıcı sayısını köster',
 'tog-oldsig' => 'Şimdiki imza:',
 'tog-fancysig' => 'İmza vikimetin kibi olsun (avtomatik bağlantı olmaz)',
-'tog-externaleditor' => 'Tış türlendirgiç (redaktor) qullan (tecribeli qullanıcılar içün; kompyuteriñizni mahsus sazlamaq kerek. [ //www.mediawiki.org/wiki/Manual:External_editors tafsilâtlı malümat mında])',
-'tog-externaldiff' => 'Teñeştimek içün tış bir programma qullan (tecribeli qullanıcılar içün; kompyuteriñizni mahsus sazlamaq kerek. [ //www.mediawiki.org/wiki/Manual:External_editors tafsilâtlı malümat mında])',
-'tog-showjumplinks' => '"Bar" bağlantısını faalleştir',
 'tog-uselivepreview' => 'Canlı baqıp çıquv hususiyetini qullan (JavaScript) (daa deñeme alında)',
 'tog-forceeditsummary' => 'Deñiştirmeniñ qısqa tarifini boş taşlasam meni tenbile',
 'tog-watchlisthideown' => 'Közetüv cedvelimden menim deñiştirmelerimni gizle',
@@ -227,7 +224,7 @@ $messages = array(
 'noindex-category' => 'İndekssiz saifeler',
 'broken-file-category' => 'İçinde bozuq fayl bağlantıları olğan saifeler',
 
-'linkprefix' => '/^(.*?)([a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![a-zâçğıñöşüA-ZÂÇĞİÑÖŞÜa-яёА-ЯЁ«„])))(.+)$/sDu',
 
 'about' => 'Aqqında',
 'article' => 'Saife',
@@ -331,7 +328,7 @@ $1',
 'pool-queuefull' => 'Soratma toplayıcısı tolu',
 'pool-errorunknown' => 'Bilinmegen hata',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} aqqında',
 'aboutpage' => 'Project:Aqqında',
 'copyright' => 'Malümat $1 binaen keçilip ola.',
@@ -341,7 +338,6 @@ $1',
 'disclaimers' => 'Cevapkârlıq redi',
 'disclaimerpage' => 'Project:Umumiy Malümat Muqavelesi',
 'edithelp' => 'Saifeler nasıl deñiştirilir?',
-'edithelppage' => 'Help:Saife nasıl deñiştirilir',
 'helppage' => 'Help:Münderice',
 'mainpage' => 'Baş Saife',
 'mainpage-description' => 'Baş Saife',
@@ -418,16 +414,6 @@ Bar olğan bütün mahsus saifelerni [[Special:SpecialPages|{{int:specialpages}}
 # General errors
 'error' => 'Hata',
 'databaseerror' => 'Malümat bazasınıñ hatası',
-'dberrortext' => 'Malümat bazasından soratqanda sintaksis hatası oldı.
-Bu programmadaki bir hata ola bile.
-"<tt>$2</tt>" funktsiyasından olğan malümat bazasından soñki soratma:
-<blockquote><tt>$1</tt></blockquote>.
-Malümat bazasınıñ bildirgen hatası "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Malümat bazasından soratqanda sintaksis hatası oldı.
-Malümat bazasından soñki soratma:
-"$1"
-Qullanılğan funktsiya "$2".
-Malümat bazasınıñ bildirgen hatası "$3: $4".',
 'laggedslavemode' => 'Diqqat! Bu saifede soñki yañaruv olmay bile.',
 'readonly' => 'Malümat bazası kilitlendi',
 'enterlockreason' => 'Blok etüvniñ sebebini ve devamını kirsetiñiz.',
@@ -476,7 +462,6 @@ Soratma: $2',
 'viewsourcetext' => 'Saifeniñ kodunı közden keçirip kopiyalay bilesiñiz:',
 'protectedinterface' => 'Bu saifede viki interfeysiniñ metni bar. Onıñ içün mında bir hata çıqmasın dep onı deñiştirmek yasaq.',
 'editinginterface' => "'''Tenbi''': MediaWiki sistemasınıñ interfeys saifesini deñiştireyatasız. Bu saifedeki deñiştirmeler interfeysniñ körünişini bu vikiniñ başqa qullanıcıları içün de deñiştirecek. Lütfen, viki interfeysini tercime etmek içün [//translatewiki.net/wiki/Main_Page?setlang=crh translatewiki.net] saytını (MediaWiki resmiy lokalizatsiya leyhası) qullanıñız.",
-'sqlhidden' => '(SQL istintağı saqlı)',
 'cascadeprotected' => 'Bu saifeni deñiştirip olamazsıñız, çünki kaskad qorçalav altında bulunğan {{PLURAL:$1|saifege|saifelerge}} mensüptir:
 $2',
 'namespaceprotected' => "'''$1''' isim fezasında saifeler deñiştirmege aqqıñız yoq.",
@@ -497,7 +482,6 @@ Sebep: ''$2''.",
 'yourpassword' => 'Paroliñiz',
 'yourpasswordagain' => 'Parolni bir daa yazıñız:',
 'remembermypassword' => 'Kirişimni bu kompyuterde hatırla (eñ çoq $1 {{PLURAL:$1|kün|kün}} içün)',
-'securelogin-stick-https' => 'Kirgen soñ HTTPS-ge bağlanıp tur',
 'yourdomainname' => 'Domen adıñız',
 'externaldberror' => 'Saytqa kirgende bir hata oldı. Bu tış esabıñıznı deñiştirmek aqqıñız olmağanından sebep meydanğa kelip ola.',
 'login' => 'Kiriş',
@@ -581,7 +565,7 @@ Lütfen, qayta kirmezden evel biraz bekleñiz.',
 'newpassword' => 'Yañı parol',
 'retypenew' => 'Yañı parolni tekrar yazıñız',
 'resetpass_submit' => 'Parol qoyıp kir',
-'resetpass_success' => 'Paroliñiz muvafaqiyetnen deñiştirildi! Oturımıñız açılmaqta...',
+'changepassword-success' => 'Paroliñiz muvafaqiyetnen deñiştirildi! Oturımıñız açılmaqta...',
 'resetpass_forbidden' => 'Parol deñiştirmek yasaq',
 'resetpass-no-info' => 'Bu saifege doğrudan irişmek içün oturım açmaq kereksiñiz.',
 'resetpass-submit-loggedin' => 'Parolni deñiştir',
@@ -849,7 +833,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
 'searchmenu-legend' => 'Qıdıruv sazlamaları',
 'searchmenu-exists' => "'''Bu vikide \"[[:\$1]]\" adlı bir saife bar'''",
 'searchmenu-new' => "'''Bu vikide \"[[:\$1]]\" saifesini yarat!'''",
-'searchhelp-url' => 'Help:Münderice',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bu prefiksli saifelerni köster]]',
 'searchprofile-articles' => 'Malümat saifeleri',
 'searchprofile-project' => 'Yardım ve leyha saifeleri',
@@ -889,9 +872,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
 'search-external' => 'Tış qıdıruv',
 'searchdisabled' => '{{SITENAME}} saytında qıdıruv yapma vaqtınca toqtatıldı. Bu arada Google qullanıp {{SITENAME}} içinde qıdıruv yapıp olasıñız. Qıdıruv saytlarında indekslemeleriniñ biraz eski qalğan ola bilecegini köz ögüne alıñız.',
 
-# Quickbar
-'qbsettings' => 'Vızlı irişim sutun sazlamaları',
-
 # Preferences page
 'preferences' => 'Sazlamalar',
 'mypreferences' => 'Sazlamalar',
@@ -919,7 +899,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
 'resetprefs' => 'Saqlanmağan sazlamalarnı ilk alına ketir',
 'restoreprefs' => 'Bütün ög belgilengen sazlamalarnı qaytar',
 'prefs-editing' => 'Saifelerni deñiştirüv',
-'prefs-edit-boxsize' => 'Yazuv penceresiniñ ölçüleri.',
 'rows' => 'Satır',
 'columns' => 'Sutun',
 'searchresultshead' => 'Qıdıruv',
@@ -954,7 +933,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
 'prefs-files' => 'Fayllar',
 'prefs-reset-intro' => 'Bu saifeni sazlamalarıñıznı sayt ög belgilengenine qaytarmaq içün qullana bilesiñiz. Bu lâğu etilip olamaz.',
 'prefs-emailconfirm-label' => 'E-mail tasdıqlanması:',
-'prefs-textboxsize' => 'Yazuv penceresiniñ ölçüleri',
 'youremail' => 'E-mail adresiñiz:',
 'username' => 'Qullanıcı adı:',
 'uid' => 'Qayd nomeri:',
@@ -1075,7 +1053,6 @@ Eger bildirseñiz, saifelerdeki deñiştirmelerni kimniñ yapqanını köstermek
 'recentchangeslinked-feed' => 'Bağlı deñiştirmeler',
 'recentchangeslinked-toolbox' => 'Bağlı deñiştirmeler',
 'recentchangeslinked-title' => '"$1" ile bağlı deñiştirmeler',
-'recentchangeslinked-noresult' => 'Saylanğan vaqıtta bağlı saifelerde iç bir deñiştirme olmadı.',
 'recentchangeslinked-summary' => "Bu mahsus saifede bağlı saifelerde soñki yapılğan deñiştirmeler cedveli bar. [[Special:Watchlist|Közetüv cedveliñiz]]deki saifeler '''qalın''' olaraq kösterile.",
 'recentchangeslinked-page' => 'Saife adı:',
 'recentchangeslinked-to' => 'Berilgen saife yerine berilgen saifege bağlantı bergen olğan saifelerni köster',
@@ -1265,12 +1242,6 @@ Sutun serlevasına bir basuv sortirlemeniñ tertibini deñiştirir.',
 'statistics-header-hooks' => 'Diger statistika',
 'statistics-mostpopular' => 'Eñ sıq baqılğan saifeler',
 
-'disambiguations' => 'Çoq manalı terminler saifeleri',
-'disambiguationspage' => '{{ns:template}}:disambig',
-'disambiguations-text' => "Aşağıdıki saifeler '''çoq manalı saifeler'''ge bağlantı ola.
-Belki de olar bir konkret saifege bağlantı olmalı.<br />
-Eger saifede, [[MediaWiki:Disambiguationspage]] saifesinde adı keçken şablon yerleştirilgen olsa, o saife çoq manalıdır.",
-
 'doubleredirects' => 'Yollamağa olğan yollamalar',
 'doubleredirectstext' => 'Bu saifede diger yollama saifelerine yollanma olğan saifeleri kösterile.
 Er satırda birinci ve ekinci yollamağa bağlantılar da, ekinci yollamanıñ maqsat saifesi (adetince o birinci yollamanıñ kerekli maqsadı ola) da bar.
@@ -1421,10 +1392,9 @@ Bundan soñ, bu saifede ve onıñ muzakere saifesinde yapılacaq deñiştirmeler
 'unwatch' => 'Közetme',
 'unwatchthispage' => 'Bu saifeni közetme',
 'notanarticle' => 'Malümat saifesi degil',
-'watchnochange' => 'Kösterilgen zaman aralığında közetüv cedveliñizdeki saifelerniñ iç biri deñiştirilmegen.',
 'watchlist-details' => 'Muzakere saifelerini esapqa almayıp, közetüv cedveliñizde {{PLURAL:$1|1|$1}} saife bar.',
-'wlheader-enotif' => '* E-mail ile haber berüv açıldı.',
-'wlheader-showupdated' => "* Soñki ziyaretiñizden soñ deñiştirilgen saifeler '''qalın ariflernen''' kösterildi.",
+'wlheader-enotif' => 'E-mail ile haber berüv açıldı.',
+'wlheader-showupdated' => "Soñki ziyaretiñizden soñ deñiştirilgen saifeler '''qalın ariflernen''' kösterildi.",
 'watchmethod-recent' => 'soñki deñiştirmeler arasında közetken saifeleriñiz qıdırıla',
 'watchmethod-list' => 'közetüv cedvelindeki saifeler teşkerile',
 'watchlistcontains' => 'Siziñ közetüv cedveliñizde {{PLURAL:$1|1|$1}} saife bar.',
@@ -1812,13 +1782,8 @@ MediaWiki interfeysiniñ çeşit tillerge tercime etüvde iştirak etmege istese
 'spam_blanking' => 'Bar olğan versiyalarda $1 saytına bağlantılar bar, temizlev',
 
 # Skin names
-'skinname-standard' => 'Standart',
-'skinname-nostalgia' => 'Nostalgiya',
 'skinname-cologneblue' => 'Köln asretligi',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Öz resimleme',
-'skinname-chick' => 'Çipçe',
-'skinname-simple' => 'Adiy',
 
 # Patrol log
 'patrol-log-page' => 'Teşkerüv jurnalı',
@@ -1891,7 +1856,7 @@ Er satır * işaretinen başlamalı. Satırnıñ birinci bağlantısı qоşmağ
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-make' => 'Kamera markası',
 'exif-model' => 'Kamera modeli',
 'exif-artist' => 'Yaratıcısı',
@@ -1916,7 +1881,7 @@ Er satır * işaretinen başlamalı. Satırnıñ birinci bağlantısı qоşmağ
 'exif-gpstimestamp' => 'GPS saatı (atom saatı)',
 'exif-gpssatellites' => 'Ölçemek içün qullanğanı sputnikler',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sıqıştırılmağan',
 
 'exif-orientation-3' => '180° aylandırılğan',
diff --git a/languages/messages/MessagesCs.php b/languages/messages/MessagesCs.php
index bb5d992b..c4277c26 100644
--- a/languages/messages/MessagesCs.php
+++ b/languages/messages/MessagesCs.php
@@ -392,9 +392,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Zobrazovat počet sledujících uživatelů',
 'tog-oldsig' => 'Stávající podpis:',
 'tog-fancysig' => 'Používat v podpisu wikitext (bez automatického odkazu)',
-'tog-externaleditor' => 'Implicitně používat externí editor (pouze pro pokročilé, vyžaduje speciální nastavení počítače; [//www.mediawiki.org/wiki/Manual:External_editors další informace])',
-'tog-externaldiff' => 'Implicitně používat externí porovnávací program (pouze pro pokročilé, vyžaduje speciální nastavení počítače; [//www.mediawiki.org/wiki/Manual:External_editors další informace])',
-'tog-showjumplinks' => 'Používat odkazy „skočit na“ pro vyšší přístupnost',
 'tog-uselivepreview' => 'Používat rychlý náhled (experimentální)',
 'tog-forceeditsummary' => 'Upozornit, když nevyplním shrnutí editace',
 'tog-watchlisthideown' => 'Na seznamu sledovaných stránek skrýt moje editace',
@@ -408,6 +405,8 @@ $messages = array(
 'tog-showhiddencats' => 'Zobrazit skryté kategorie',
 'tog-noconvertlink' => 'Vypnout konverzi názvů',
 'tog-norollbackdiff' => 'Po vrácení změny nezobrazovat porovnání rozdílů',
+'tog-useeditwarning' => 'Upozornit, když budu opouštět editaci bez uložení změn',
+'tog-prefershttps' => 'Po přihlášení používat vždy zabezpečené spojení',
 
 'underline-always' => 'Vždy',
 'underline-never' => 'Nikdy',
@@ -471,6 +470,18 @@ $messages = array(
 'oct' => '10.',
 'nov' => '11.',
 'dec' => '12.',
+'january-date' => '$1. ledna',
+'february-date' => '$1. února',
+'march-date' => '$1. března',
+'april-date' => '$1. dubna',
+'may-date' => '$1. května',
+'june-date' => '$1. června',
+'july-date' => '$1. července',
+'august-date' => '$1. srpna',
+'september-date' => '$1. září',
+'october-date' => '$1. října',
+'november-date' => '$1. listopadu',
+'december-date' => '$1. prosince',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorie|Kategorie}}',
@@ -552,6 +563,7 @@ $messages = array(
 'create-this-page' => 'Vytvořit tuto stránku',
 'delete' => 'Smazat',
 'deletethispage' => 'Smazat stránku',
+'undeletethispage' => 'Obnovit tuto stránku',
 'undelete_short' => 'Obnovit $1 {{PLURAL:$1|verzi|verze|verzí}}',
 'viewdeleted_short' => 'Zobrazit {{PLURAL:$1|smazanou editaci|$1 smazané editace|$1 smazaných editací}}',
 'protect' => 'Zamknout',
@@ -595,7 +607,7 @@ $1',
 'pool-queuefull' => 'Fronta ve fondu je plná',
 'pool-errorunknown' => 'Neznámá chyba',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'O&nbsp;{{grammar:6sg|{{SITENAME}}}}',
 'aboutpage' => 'Project:{{SITENAME}}',
 'copyright' => 'Obsah je dostupný pod $1, pokud není uvedeno jinak.',
@@ -605,7 +617,6 @@ $1',
 'disclaimers' => 'Vyloučení odpovědnosti',
 'disclaimerpage' => 'Project:Vyloučení odpovědnosti',
 'edithelp' => 'Pomoc při editování',
-'edithelppage' => 'Help:Jak editovat stránku',
 'helppage' => 'Help:Obsah',
 'mainpage' => 'Hlavní strana',
 'mainpage-description' => 'Hlavní strana',
@@ -683,17 +694,12 @@ Zkuste se podívat na [[Special:SpecialPages|seznam všech existujících speci
 # General errors
 'error' => 'Chyba',
 'databaseerror' => 'Chyba databáze',
-'dberrortext' => 'Při dotazu do databáze došlo k syntaktické chybě.
-Příčinou může být chyba v programu.
-Poslední dotaz byl:
-<blockquote><code>$1</code></blockquote>
-z funkce „<code>$2</code>“.
-Databáze vrátila chybu „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Při dotazu do databáze došlo k syntaktické chybě.
-Poslední dotaz byl:
-„$1“
-z funkce „$2“.
-Databáze vrátila chybu „$3: $4“',
+'databaseerror-text' => 'Došlo k chybě při dotazu do databáze.
+Může to být způsobeno chybou v softwaru.',
+'databaseerror-textcl' => 'Došlo k chybě při dotazu do databáze.',
+'databaseerror-query' => 'Dotaz: $1',
+'databaseerror-function' => 'Funkce: $1',
+'databaseerror-error' => 'Chyba: $1',
 'laggedslavemode' => 'Upozornění: Stránka nemusí být zcela aktuální.',
 'readonly' => 'Databáze je uzamčena',
 'enterlockreason' => 'Udejte důvod zamčení, včetně odhadu, za jak dlouho dojde k odemčení.',
@@ -725,6 +731,7 @@ Pokud toto není váš případ, možná jste nalezli chybu v software. Prosíme
 Možná už byl(a) smazán(a) někým jiným.',
 'cannotdelete-title' => 'Stránku „$1“ nelze smazat',
 'delete-hook-aborted' => 'Smazání bylo bez bližšího vysvětlení zrušeno přípojným bodem.',
+'no-null-revision' => 'Nepodařilo se vytvořit novou prázdnou revizi stránky „$1“',
 'badtitle' => 'Neplatný název',
 'badtitletext' => 'Požadovaný název stránky byl neplatný, prázdný nebo obsahoval nesprávnou předponu mezijazykového či interwiki odkazu. Možná obsahoval znaky, které v názvu nejsou dovoleny.',
 'perfcached' => 'Následující data jsou z cache a nemusí být plně aktuální. Cache může obsahovat maximálně {{PLURAL:$1|jeden výsledek|$1 výsledky|$1 výsledků}}.',
@@ -745,12 +752,15 @@ Pro přidávání a změny překladů pro všechny wiki použijte [//translatewi
 'editinginterface' => "'''Upozornění:''' Editujete stránku, která definuje texty rozhraní.
 Změny této stránky ovlivní vzhled uživatelského rozhraní všem uživatelům této wiki.
 Pro přidávání a změny překladů pro všechny wiki použijte [//translatewiki.net/ translatewiki.net], projekt pro lokalizaci MediaWiki.",
-'sqlhidden' => '(SQL dotaz skryt)',
 'cascadeprotected' => 'Tato stránka je zamčena, neboť je vložena do {{PLURAL:$1|následující stránky zamčené|následujících stránek zamčených|následujících stránek zamčených}} kaskádovým zámkem:
 $2',
 'namespaceprotected' => "Nemáte povoleno editovat stránky ve jmenném prostoru '''$1'''.",
 'customcssprotected' => 'Nemáte povoleno editovat tuto stránku s CSS, protože obsahuje osobní nastavení jiného uživatele.',
 'customjsprotected' => 'Nemáte povoleno editovat tuto stránku s JavaScriptem, protože obsahuje osobní nastavení jiného uživatele.',
+'mycustomcssprotected' => 'Nemáte oprávnění editovat tuto stránku s CSS.',
+'mycustomjsprotected' => 'Nemáte oprávnění editovat tuto stránku s JavaScriptem.',
+'myprivateinfoprotected' => 'Nemáte oprávnění měnit své soukromé údaje.',
+'mypreferencesprotected' => 'Nemáte oprávnění změnit svá nastavení.',
 'ns-specialprotected' => 'Stránky ve jmenném prostoru {{ns:special}} nelze editovat.',
 'titleprotected' => "Stránku s tímto názvem nelze založit, protože název zamknul uživatel [[User:$1|$1]] s odůvodněním: ''$2''.",
 'filereadonlyerror' => "Nelze změnit soubor „$1“, protože úložiště souborů „$2“ je momentálně pouze pro čtení.
@@ -774,10 +784,19 @@ Uvědomte si, že některé stránky se mohou i nadále zobrazovat, jako byste b
 'welcomecreation-msg' => 'Váš účet byl vytvořen.
 Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SITENAME}}}}]].',
 'yourname' => 'Uživatelské jméno:',
+'userlogin-yourname' => 'Uživatelské jméno',
+'userlogin-yourname-ph' => 'Zadejte své uživatelské jméno',
+'createacct-another-username-ph' => 'Zadejte uživatelské jméno',
 'yourpassword' => 'Heslo:',
+'userlogin-yourpassword' => 'Heslo',
+'userlogin-yourpassword-ph' => 'Zadejte své heslo',
+'createacct-yourpassword-ph' => 'Zadejte heslo',
 'yourpasswordagain' => 'Zopakujte heslo:',
+'createacct-yourpasswordagain' => 'Potvrzení hesla',
+'createacct-yourpasswordagain-ph' => 'Zadejte heslo ještě jednou',
 'remembermypassword' => 'Zapamatovat si mé přihlášení na tomto počítači (maximálně $1 {{PLURAL:$1|den|dny|dní}})',
-'securelogin-stick-https' => 'Zůstat po přihlášení připojen přes HTTPS',
+'userlogin-remembermypassword' => 'Přihlásit trvale',
+'userlogin-signwithsecure' => 'Používat zabezpečené připojení',
 'yourdomainname' => 'Vaše doména',
 'password-change-forbidden' => 'Na této wiki nemůžete měnit hesla.',
 'externaldberror' => 'Buď nastala chyba externí autentizační databáze, nebo nemáte dovoleno měnit svůj externí účet.',
@@ -789,18 +808,44 @@ Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SI
 'logout' => 'Odhlásit se',
 'userlogout' => 'Odhlášení',
 'notloggedin' => 'Nejste přihlášen(a)',
+'userlogin-noaccount' => 'Nemáte účet?',
+'userlogin-joinproject' => 'Přidejte se k {{grammar:3sg|{{SITENAME}}}}',
 'nologin' => 'Dosud nemáte účet? $1.',
 'nologinlink' => 'Zaregistrujte se',
 'createaccount' => 'Vytvořit účet',
 'gotaccount' => "Už jste registrováni? '''$1'''.",
 'gotaccountlink' => 'Přihlaste se',
 'userlogin-resetlink' => 'Zapomněli jste přihlašovací údaje?',
+'userlogin-resetpassword-link' => 'Obnovit heslo',
+'helplogin-url' => 'Help:Přihlášení',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Nápověda k přihlašování]]',
+'userlogin-loggedin' => 'Již jste {{GENDER:$1|přihlášen|přihlášena}} jako $1.
+Pomocí formuláře níže se můžete přihlásit jako jiný uživatel.',
+'userlogin-createanother' => 'Vytvořit jiný účet',
+'createacct-join' => 'Níže zadejte své údaje.',
+'createacct-another-join' => 'Níže zadejte údaje nového účtu.',
+'createacct-emailrequired' => 'E-mailová adresa',
+'createacct-emailoptional' => 'E-mailová adresa (nepovinné)',
+'createacct-email-ph' => 'Zadejte svou e-mailovou adresu',
+'createacct-another-email-ph' => 'Zadejte e-mailovou adresu',
 'createaccountmail' => 'Použít dočasné náhodné heslo a odeslat ho na uvedenou e-mailovou adresu',
+'createacct-realname' => 'Skutečné jméno (nepovinné)',
 'createaccountreason' => 'Důvod:',
+'createacct-reason' => 'Důvod',
+'createacct-reason-ph' => 'Proč si vytváříte další účet',
+'createacct-captcha' => 'Bezpečnostní kontrola',
+'createacct-imgcaptcha-ph' => 'Opište výše zobrazený text',
+'createacct-submit' => 'Vytvořit účet',
+'createacct-another-submit' => 'Vytvořit jiný účet',
+'createacct-benefit-heading' => '{{grammar:4sg|{{SITENAME}}}} tvoří lidé jako vy.',
+'createacct-benefit-body1' => '{{PLURAL:$1|editace|editace|editací}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|stránka|stránky|stránek}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nedávný přispěvatel|nedávní přispěvatelé|nedávných přispěvatelů}}',
 'badretype' => 'Vámi napsaná hesla nesouhlasí.',
 'userexists' => 'Zadané uživatelské jméno se již používá.
 Zvolte si prosím jiné jméno.',
 'loginerror' => 'Chyba při přihlašování',
+'createacct-error' => 'Chyba při zakládání účtu',
 'createaccounterror' => 'Nepodařilo se vytvořit uživatelský účet: $1',
 'nocookiesnew' => 'Uživatelský účet byl vytvořen, ale nejste přihlášeni. {{SITENAME}} používá cookies k přihlášení uživatelů. Vy máte cookies vypnuty. Prosím zapněte je a přihlaste se znovu s vaším novým uživatelským jménem a heslem.',
 'nocookieslogin' => '{{SITENAME}} používá cookies k přihlášení uživatelů. Vy máte cookies vypnuty. Prosím zapněte je a zkuste znovu.',
@@ -858,10 +903,12 @@ Měli byste se co nejdřív přihlásit a změnit si heslo.
 Pokud byl účet vytvořen omylem, považujte tuto zprávu za bezpředmětnou.',
 'usernamehasherror' => 'Uživatelské jméno nemůže obsahovat znak mřížka (#)',
 'login-throttled' => 'Provedli jste příliš mnoho pokusů o přihlášení.
-Počkejte chvíli, než to zkusíte znovu.',
+Než to zkusíte znovu, musíte počkat na vypršení lhůty $1.',
 'login-abort-generic' => 'Vaše přihlášení se nezdařilo – přerušeno',
 'loginlanguagelabel' => 'Jazyk: $1',
 'suspicious-userlogout' => 'Váš požadavek na odhlášení byl odmítnut, neboť to vypadá, že ho poslal rozbitý prohlížeč nebo cachující proxy.',
+'createacct-another-realname-tip' => 'Skutečné jméno je nepovinné.
+Pokud se ho rozhodnete uvést, bude použito pro označení autorství vaší práce.',
 
 # Email sending
 'php-mail-error-unknown' => 'Neznámá chyba v PHP funkci mail()',
@@ -877,8 +924,7 @@ Počkejte chvíli, než to zkusíte znovu.',
 'newpassword' => 'Nové heslo:',
 'retypenew' => 'Napište znovu nové heslo',
 'resetpass_submit' => 'Nastavit heslo a přihlásit se',
-'resetpass_success' => 'Vaše heslo bylo úspěšně změněno!
-Probíhá přihlašování…',
+'changepassword-success' => 'Vaše heslo bylo úspěšně změněno!',
 'resetpass_forbidden' => 'Hesla nelze změnit.',
 'resetpass-no-info' => 'K této stránce mají přímý přístup jen přihlášení uživatelé.',
 'resetpass-submit-loggedin' => 'Změnit heslo',
@@ -890,10 +936,11 @@ Možná jste si již úspěšně heslo změnili, nebo jste si vyžádali nové d
 
 # Special:PasswordReset
 'passwordreset' => 'Reset hesla',
-'passwordreset-text' => 'Pro získání nového hesla vyplňte tento formulář.',
+'passwordreset-text-one' => 'Pro získání nového hesla vyplňte tento formulář.',
+'passwordreset-text-many' => '{{PLURAL:$1|Pro získání nového hesla zadejte jeden z údajů.}}',
 'passwordreset-legend' => 'Znovu nastavit heslo',
 'passwordreset-disabled' => 'Znovunastavení hesla je na této wiki zakázáno.',
-'passwordreset-pretext' => '{{PLURAL:$1||Zadejte jeden z údajů níže}}',
+'passwordreset-emaildisabled' => 'E-mailové funkce byly na této wiki vypnuty.',
 'passwordreset-username' => 'Uživatelské jméno:',
 'passwordreset-domain' => 'Doména:',
 'passwordreset-capture' => 'Prohlédnout si výsledný e-mail?',
@@ -921,7 +968,7 @@ tedy změnit, můžete tuto zprávu ignorovat a nadále používat původní hes
 Dočasné heslo: $2',
 'passwordreset-emailsent' => 'E-mail pro získání nového hesla byl odeslán.',
 'passwordreset-emailsent-capture' => 'Byl odeslán e-mail pro získání nového hesla, který je zobrazen níže.',
-'passwordreset-emailerror-capture' => 'Byl vygenerován připomínací e-mail, který je zobrazen níže, ale nepodařilo se ho odeslat uživateli: $1',
+'passwordreset-emailerror-capture' => 'Byl vygenerován e-mail pro získání nového hesla, který je zobrazen níže, ale nepodařilo se ho odeslat {{GENDER:$2|uživateli|uživatelce}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Změna e-mailové adresy',
@@ -935,6 +982,19 @@ Dočasné heslo: $2',
 'changeemail-submit' => 'Změnit e-mail',
 'changeemail-cancel' => 'Storno',
 
+# Special:ResetTokens
+'resettokens' => 'Reinicializace klíčů',
+'resettokens-text' => 'Na této stránce můžete reinicializovat klíče, které umožňují přístup k jistým soukromým údajům spojeným s vaším účtem.
+
+{{GENDER:|Měl|Měla|Měli}} byste to provést v případě, že jste je omylem někomu {{GENDER:|prozradil|prozradila|prozradili}}, nebo byl váš účet narušen.',
+'resettokens-no-tokens' => 'Neexistují žádné klíče, které by bylo možno reinicializovat.',
+'resettokens-legend' => 'Reinicializace klíčů',
+'resettokens-tokens' => 'Klíče:',
+'resettokens-token-label' => '$1 (aktuální hodnota: $2)',
+'resettokens-watchlist-token' => 'Klíč k webovému kanálu (Atom/RSS) [[Special:Watchlist|změn sledovaných stránek]]',
+'resettokens-done' => 'Klíče reinicializovány',
+'resettokens-resetbutton' => 'Reinicializovat vybrané klíče',
+
 # Edit page toolbar
 'bold_sample' => 'Tučný text',
 'bold_tip' => 'Tučný text',
@@ -1123,11 +1183,14 @@ Podrobnosti si můžete prohlédnout v níže zobrazeném seznamu provedených p
 Zřejmě byla smazána.',
 'edit-conflict' => 'Editační konflikt.',
 'edit-no-change' => 'Vaše editace byla ignorována, protože nedošlo k žádné změně textu.',
+'postedit-confirmation' => 'Vaše změny byly uloženy.',
 'edit-already-exists' => 'Nepodařilo se vytvořit novou stránku, protože již existuje.',
 'defaultmessagetext' => 'Výchozí text hlášení',
 'content-failed-to-parse' => 'Nepodařilo se zpracovat data $2 do modelu $1: $3',
 'invalid-content-data' => 'Obsažená data jsou chybná',
 'content-not-allowed-here' => 'Obsah typu $1 není na stránce [[$2]] dovolen.',
+'editwarning-warning' => 'Opuštěním této stránky se mohou veškeré provedené změny ztratit.
+Přihlášení uživatelé si mohou toto varování vypnout na záložce „Editace“ v uživatelském nastavení.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1162,6 +1225,7 @@ Tyto argumenty byly vynechány.',
 'undo-failure' => 'Editace nemohla být zrušena kvůli konfliktu mezilehlých editací.',
 'undo-norev' => 'Tuto editaci není možné vrátit, protože neexistuje nebo byla smazána.',
 'undo-summary' => 'Zrušena verze $1 od uživatele [[Special:Contributions/$2|$2]] ([[User talk:$2|diskuse]])',
+'undo-summary-username-hidden' => 'Zrušena verze $1 od skrytého uživatele',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Nelze vytvořit uživatelský účet',
@@ -1341,6 +1405,7 @@ Ujistěte se, že tato změna udrží souvislost a posloupnost verzí v historii
 'compareselectedversions' => 'Porovnat vybrané verze',
 'showhideselectedversions' => 'Zobrazit/skrýt vybrané revize',
 'editundo' => 'zrušit editaci',
+'diff-empty' => '(Žádný rozdíl)',
 'diff-multi' => '({{PLURAL:$1|Není zobrazena 1 mezilehlá verze|Nejsou zobrazeny $1 mezilehlé verze|Není zobrazeno $1 mezilehlých verzí}} od {{PLURAL:$2|1 uživatele|$2 uživatelů}}.)',
 'diff-multi-manyusers' => '(Není zobrazeno $1 mezilehlých verzí od více než $2 {{PLURAL:$2|uživatele|uživatelů}}.)',
 'difference-missing-revision' => '{{PLURAL:$2|Jedna z revizí|$2 revize|$2 revizí}} k požadovanému porovnání ($1) {{PLURAL:$2|neexistuje|neexistují|neexistuje}}.
@@ -1368,7 +1433,6 @@ Podrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'searchmenu-legend' => 'Možnosti hledání',
 'searchmenu-exists' => "'''Na této wiki existuje stránka nazvaná „[[:$1]]“.'''",
 'searchmenu-new' => "'''Vytvořte na této wiki stránku „[[:$1]]“!'''",
-'searchhelp-url' => 'Help:Obsah',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zobrazit stránky, jejichž název začíná „$1“]]',
 'searchprofile-articles' => 'Články',
 'searchprofile-project' => 'Nápověda a projektové stránky',
@@ -1410,15 +1474,7 @@ Pokud na začátek dotazu přidáte ''all:'', bude se hledat všude (včetně di
 'powersearch-togglenone' => 'Nic',
 'search-external' => 'Externí hledání',
 'searchdisabled' => '<p>Omlouváme se. Plnotextové vyhledávání je dočasně nedostupné. Zatím můžete zkusit vyhledávání Googlem; je ale možné, že jeho výsledky nemusí být aktuální.</p>',
-
-# Quickbar
-'qbsettings' => 'Nastavení lišty nástrojů',
-'qbsettings-none' => 'Žádný',
-'qbsettings-fixedleft' => 'Leží vlevo',
-'qbsettings-fixedright' => 'Leží vpravo',
-'qbsettings-floatingleft' => 'Plovoucí vlevo',
-'qbsettings-floatingright' => 'Plovoucí vpravo',
-'qbsettings-directionality' => 'Pevný v závislosti na směrovosti vašeho písma',
+'search-error' => 'Při hledání došlo k chybě: $1',
 
 # Preferences page
 'preferences' => 'Nastavení',
@@ -1452,7 +1508,6 @@ Pokud na začátek dotazu přidáte ''all:'', bude se hledat všude (včetně di
 'resetprefs' => 'Vrátit původní nastavení',
 'restoreprefs' => 'Obnovit všechna výchozí nastavení (ve všech sekcích)',
 'prefs-editing' => 'Editace',
-'prefs-edit-boxsize' => 'Velikost editačního okna:',
 'rows' => 'Řádky',
 'columns' => 'Sloupce',
 'searchresultshead' => 'Vyhledávání',
@@ -1463,9 +1518,8 @@ Pokud na začátek dotazu přidáte ''all:'', bude se hledat všude (včetně di
 'recentchangesdays-max' => 'Maximálně $1 {{PLURAL:$1|den|dny|dní}}',
 'recentchangescount' => 'Počet implicitně zobrazovaných záznamů:',
 'prefs-help-recentchangescount' => 'Týká se posledních změn, historie stránek a protokolovacích záznamů.',
-'prefs-help-watchlist-token' => 'Pokud do tohoto pole vyplníte tajný klíč, bude vytvořen RSS kanál vašich sledovaných stránek.
-Kdokoli, kdo bude tento klíč znát, pak bude moci váš seznam sledovaných stránek číst, takže dbejte na bezpečnost.
-Můžete použít tuto náhodně vygenerovanou hodnotu: $1',
+'prefs-help-watchlist-token2' => 'Toto je tajný klíč k webovému kanálu vašich sledovaných stránek. Kdokoli, kdo bude tento klíč znát, bude moci váš seznam sledovaných stránek číst, takže ho nešiřte.
+[[Special:ResetTokens|Kliknutím sem ho můžete reinicializovat.]]',
 'savedprefs' => 'Vaše nastavení bylo uloženo.',
 'timezonelegend' => 'Časové pásmo:',
 'localtime' => 'Místní čas:',
@@ -1496,7 +1550,6 @@ Můžete použít tuto náhodně vygenerovanou hodnotu: $1',
 'prefs-reset-intro' => 'Pomocí této stránky můžete všechna nastavení vrátit na implicitní hodnoty.
 Tuto operaci nelze vrátit zpět.',
 'prefs-emailconfirm-label' => 'Ověření e-mailu:',
-'prefs-textboxsize' => 'Velikost editačního okna',
 'youremail' => 'E-mail:',
 'username' => '{{GENDER:$1|Uživatelské jméno}}:',
 'uid' => '{{GENDER:$1|Uživatelské}} ID:',
@@ -1530,6 +1583,8 @@ Vaše adresa v takovém případě není prozrazena.',
 'prefs-dateformat' => 'Formát data',
 'prefs-timeoffset' => 'Časový posun',
 'prefs-advancedediting' => 'Obecné nastavení',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Náhled',
 'prefs-advancedrc' => 'Rozšířené možnosti',
 'prefs-advancedrendering' => 'Rozšířené možnosti',
 'prefs-advancedsearchoptions' => 'Rozšířené možnosti',
@@ -1537,7 +1592,9 @@ Vaše adresa v takovém případě není prozrazena.',
 'prefs-displayrc' => 'Možnosti zobrazení',
 'prefs-displaysearchoptions' => 'Možnosti zobrazení',
 'prefs-displaywatchlist' => 'Možnosti zobrazení',
+'prefs-tokenwatchlist' => 'Klíč',
 'prefs-diffs' => 'Porovnání verzí',
+'prefs-help-prefershttps' => 'Toto nastavení se projeví při příštím přihlášení.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mailová adresa vypadá jako platná',
@@ -1564,6 +1621,8 @@ Vaše adresa v takovém případě není prozrazena.',
 'userrights-notallowed' => 'Nemáte oprávnění měnit uživatelská práva.',
 'userrights-changeable-col' => 'Skupiny, které můžete měnit',
 'userrights-unchangeable-col' => 'Skupiny, které nemůžete měnit',
+'userrights-conflict' => 'Konflikt změn uživatelských práv! Zkontrolujte a potvrďte požadované změny.',
+'userrights-removed-self' => 'Úspěšně jste si odebrali vlastní práva. Tudíž už nemáte k této stránce přístup.',
 
 # Groups
 'group' => 'Skupina:',
@@ -1629,11 +1688,19 @@ Vaše adresa v takovém případě není prozrazena.',
 'right-proxyunbannable' => 'Obcházení automatického blokování proxy serverů',
 'right-unblockself' => 'Odblokování sebe sama',
 'right-protect' => 'Měnění úrovně zámku a editace kaskádově zamčených stránek',
-'right-editprotected' => 'Editace zamčených stránek (bez kaskádového zámku)',
+'right-editprotected' => 'Editace stránek zamčených na „{{int:protect-level-sysop}}“',
+'right-editsemiprotected' => 'Editace stránek zamčených na „{{int:protect-level-autoconfirmed}}“',
 'right-editinterface' => 'Editace zpráv uživatelského rozhraní',
 'right-editusercssjs' => 'Editace CSS a JS souborů jiných uživatelů',
 'right-editusercss' => 'Editace CSS souborů jiných uživatelů',
 'right-edituserjs' => 'Editace JavaScriptových souborů jiných uživatelů',
+'right-editmyusercss' => 'Editace vašich uživatelských CSS souborů',
+'right-editmyuserjs' => 'Editace vašich uživatelských JavaScriptových souborů',
+'right-viewmywatchlist' => 'Prohlížení vlastního seznamu sledovaných stránek',
+'right-editmywatchlist' => 'Editace vlastního seznamu sledovaných stránek. Uvědomte si, že některé akce do něj mohou přidat stránky i bez tohoto oprávnění.',
+'right-viewmyprivateinfo' => 'Prohlížení vlastních soukromých údajů (např. e-mailová adresa, skutečné jméno)',
+'right-editmyprivateinfo' => 'Změna vašich soukromých údajů (např. e-mailová adresa, skutečné jméno)',
+'right-editmyoptions' => 'Změna vašich uživatelských nastavení',
 'right-rollback' => 'Rychlý revert úprav posledního uživatele editujícího danou stránku',
 'right-markbotedits' => 'Označování revertů jako editace bota',
 'right-noratelimit' => 'Imunita vůči rychlostním limitům',
@@ -1695,12 +1762,19 @@ Vaše adresa v takovém případě není prozrazena.',
 'action-userrights-interwiki' => 'upravovat práva uživatelů na jiných wiki',
 'action-siteadmin' => 'zamykat nebo odemykat databázi',
 'action-sendemail' => 'posílat e-maily',
+'action-editmywatchlist' => 'upravovat vlastní seznam sledovaných stránek',
+'action-viewmywatchlist' => 'prohlížet vlastní seznam sledovaných stránek',
+'action-viewmyprivateinfo' => 'prohlížet si své soukromé údaje',
+'action-editmyprivateinfo' => 'změnit své soukromé údaje',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|změna|změny|změn}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|od poslední návštěvy}}',
+'enhancedrc-history' => 'historie',
 'recentchanges' => 'Poslední změny',
 'recentchanges-legend' => 'Možnosti posledních změn',
 'recentchanges-summary' => 'Sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}} na této stránce.',
+'recentchanges-noresult' => 'V daném období neodpovídaly zadaným kritériím žádné změny.',
 'recentchanges-feed-description' => 'Na tomto kanále sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}}.',
 'recentchanges-label-newpage' => 'Touto editací byla založena nová stránka',
 'recentchanges-label-minor' => 'Toto je malá editace',
@@ -1738,7 +1812,6 @@ $3',
 'recentchangeslinked-feed' => 'Související změny',
 'recentchangeslinked-toolbox' => 'Související změny',
 'recentchangeslinked-title' => 'Související změny pro stránku „$1“',
-'recentchangeslinked-noresult' => 'V zadaném období nebyly na odkazovaných stránkách provedeny žádné změny.',
 'recentchangeslinked-summary' => "Níže je seznam nedávných změn stránek odkazovaných ze zadané stránky (nebo patřících do dané kategorie). Vaše [[Special:Watchlist|sledované stránky]] jsou '''zvýrazněny'''.",
 'recentchangeslinked-page' => 'Název stránky:',
 'recentchangeslinked-to' => 'Zobrazit změny na stránkách odkazujících na zadanou stránku',
@@ -1749,7 +1822,7 @@ $3',
 'reuploaddesc' => 'Zrušit načítání a vrátit se do formuláře.',
 'upload-tryagain' => 'Uložit upravený popis souboru',
 'uploadnologin' => 'Nejste přihlášen(a)',
-'uploadnologintext' => 'Pro načtení souboru se musíte [[Special:UserLogin|přihlásit]].',
+'uploadnologintext' => 'Pro načtení souboru se musíte $1.',
 'upload_directory_missing' => 'Adresář pro nahrávání souborů ($1) chybí a webový server ho nedokáže vytvořit.',
 'upload_directory_read_only' => 'Do adresáře pro načítané soubory ($1) nemá webserver právo zápisu.',
 'uploaderror' => 'Při načítání došlo k chybě',
@@ -1970,7 +2043,6 @@ Z bezpečnostních důvodů je img_auth.php vypnuto.',
 'http-read-error' => 'Chyba při čtení HTTP.',
 'http-timed-out' => 'Čas pro HTTP požadavek vypršel.',
 'http-curl-error' => 'Chyba při čtení z URL: $1',
-'http-host-unreachable' => 'Nepodařilo se kontaktovat URL',
 'http-bad-status' => 'Při provádění HTTP požadavku nastal problém: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1998,6 +2070,10 @@ Z bezpečnostních důvodů je img_auth.php vypnuto.',
 'listfiles_size' => 'Velikost (bajtů)',
 'listfiles_description' => 'Popis',
 'listfiles_count' => 'Verze',
+'listfiles-show-all' => 'Zahrnout staré verze obrázků',
+'listfiles-latestversion' => 'Aktuální verze',
+'listfiles-latestversion-yes' => 'Ano',
+'listfiles-latestversion-no' => 'Ne',
 
 # File description page
 'file-anchor-link' => 'Soubor',
@@ -2094,6 +2170,13 @@ Vstup: <code>typ obsahu/podtyp</code>, např. <code>image/jpeg</code>.',
 'randompage' => 'Náhodná stránka',
 'randompage-nopages' => 'V {{PLURAL:$2|následujícím jmenném prostoru|následujících jmenných prostorech}} nejsou žádné stránky: $1.',
 
+# Random page in category
+'randomincategory' => 'Náhodná stránka z kategorie',
+'randomincategory-invalidcategory' => '„$1“ není platný název kategorie.',
+'randomincategory-nopages' => 'V [[:Category:$1|kategorii $1]] žádné stránky nejsou.',
+'randomincategory-selectcategory' => 'Získat náhodnou stránku z kategorie: $1 $2',
+'randomincategory-selectcategory-submit' => 'Přejít',
+
 # Random redirect
 'randomredirect' => 'Náhodné přesměrování',
 'randomredirect-nopages' => 'Ve jmenném prostoru „$1“ nejsou žádná přesměrování.',
@@ -2119,17 +2202,13 @@ Vstup: <code>typ obsahu/podtyp</code>, např. <code>image/jpeg</code>.',
 'statistics-users-active-desc' => 'Uživatelé, kteří v {{plural:$1|posledním dni|posledních $1 dnech}} provedli nějakou operaci',
 'statistics-mostpopular' => 'Nejčtenější stránky',
 
-'disambiguations' => 'Stránky odkazující na rozcestníky',
-'disambiguationspage' => 'Template:Rozcestník',
-'disambiguations-text' => "Následující stránky obsahují nejméně jeden odkaz na '''rozcestník'''.
-Asi by místo toho měly odkazovat na konkrétnější stránku.<br />
-Stránka je považována za rozcestník, pokud používá některou ze šablon odkazovaných na [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Stránky s vlastností',
 'pageswithprop-legend' => 'Stránky s vlastností',
 'pageswithprop-text' => 'Tato stránka obsahuje seznam stránek, které používají zadanou vlastnost stránky.',
 'pageswithprop-prop' => 'Název vlastnosti:',
 'pageswithprop-submit' => 'Provést',
+'pageswithprop-prophidden-long' => 'dlouhá hodnota textové vlastnosti skryta ($1)',
+'pageswithprop-prophidden-binary' => 'hodnota binární vlastnosti skryta ($1)',
 
 'doubleredirects' => 'Dvojitá přesměrování',
 'doubleredirectstext' => 'Na této stránce je seznam přesměrování vedoucích na další přesměrování.
@@ -2187,6 +2266,7 @@ Každý řádek obsahuje odkaz na první a druhé přesměrování a k tomu cíl
 'mostrevisions' => 'Stránky s nejvíce revizemi',
 'prefixindex' => 'Seznam stránek dle začátku názvu',
 'prefixindex-namespace' => 'Seznam stránek dle začátku názvu (jmenný prostor $1)',
+'prefixindex-strip' => 'Začátek názvu v seznamu odříznout',
 'shortpages' => 'Nejkratší stránky',
 'longpages' => 'Nejdelší stránky',
 'deadendpages' => 'Slepé stránky',
@@ -2202,6 +2282,7 @@ Každý řádek obsahuje odkaz na první a druhé přesměrování a k tomu cíl
 'listusers' => 'Uživatelé',
 'listusers-editsonly' => 'Zobrazit pouze uživatele s editacemi',
 'listusers-creationsort' => 'Seřadit podle data registrace',
+'listusers-desc' => 'Řadit sestupně',
 'usereditcount' => '$1 {{PLURAL:$1|editace|editace|editací}}',
 'usercreated' => '{{GENDER:$3|Registrován|Registrována|Registrován(a)}} $1 v $2',
 'newpages' => 'Nejnovější stránky',
@@ -2379,10 +2460,9 @@ Ve [[Special:Watchlist|sledovaných stránkách]] se tak budou objevovat budouc
 'unwatchthispage' => 'Nesledovat tuto stránku',
 'notanarticle' => 'Toto není stránka',
 'notvisiblerev' => 'Verze byla smazána',
-'watchnochange' => 'Žádná ze sledovaných položek nebyla editována v době, která je zobrazena.',
 'watchlist-details' => 'Na vašem seznamu sledovaných stránek {{PLURAL:$1|je $1 stránka|jsou $1 stránky|je $1 stránek}}, nepočítají se diskusní stránky.',
-'wlheader-enotif' => '* Upozorňování e-mailem je zapnuto.',
-'wlheader-showupdated' => "* Stránky, které se změnily od vaší poslední návštěvy, jsou zobrazeny '''tučně'''",
+'wlheader-enotif' => 'Upozorňování e-mailem je zapnuto.',
+'wlheader-showupdated' => "Stránky, které se změnily od vaší poslední návštěvy, jsou zobrazeny '''tučně'''.",
 'watchmethod-recent' => 'hledají se sledované stránky mezi posledními změnami',
 'watchmethod-list' => 'hledají se nejnovější editace sledovaných stránek',
 'watchlistcontains' => 'Na vašem seznamu sledovaných stránek {{PLURAL:$1|je $1 položka|jsou $1 položky|je $1 položek}}.',
@@ -2622,7 +2702,7 @@ $1',
 'contributions' => 'Příspěvky {{GENDER:$1|uživatele|uživatelky}}',
 'contributions-title' => 'Příspěvky uživatele $1',
 'mycontris' => 'Příspěvky',
-'contribsub2' => '$1 ($2)',
+'contribsub2' => '{{GENDER:$3|uživatele|uživatelky}} $1 ($2)',
 'nocontribs' => 'Nenalezeny žádné změny vyhovující kritériím.',
 'uctop' => '(aktuální)',
 'month' => 'Do měsíce:',
@@ -2777,13 +2857,11 @@ Vizte též [[Special:BlockList|seznam všech probíhajících bloků]].',
 'ipb_blocked_as_range' => 'Chyba: IP adresa $1 není blokována přímo a tak ji nelze odblokovat. Je částí zablokovaného rozsahu $2, který může být odblokován.',
 'ip_range_invalid' => 'Neplatný IP rozsah.',
 'ip_range_toolarge' => 'Blokování rozsahů větších než /$1 není dovoleno.',
-'blockme' => 'Zablokuj mě',
 'proxyblocker' => 'Blokování proxy serverů',
-'proxyblocker-disabled' => 'Tato funkce je vypnuta.',
 'proxyblockreason' => 'Vaše IP adresa byla zablokována, protože funguje jako otevřený proxy server. Kontaktujte svého poskytovatele internetového připojení nebo technickou podporu a informujte je o tomto vážném bezpečnostním problému.',
-'proxyblocksuccess' => 'Hotovo.',
 'sorbsreason' => 'Vaše IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server.',
 'sorbs_create_account_reason' => 'Vaše IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server. Z této adresy si nemůžete založit účet',
+'xffblockreason' => 'IP adresa uvedená v hlavičce X-Forwarded-For, ať už vaše, nebo patřící proxy serveru, který používáte, byla zablokována. Zdůvodnění tohoto zablokování: $1',
 'cant-block-while-blocked' => 'Nemůžete blokovat jiné uživatele, když jste zablokován(a).',
 'cant-see-hidden-user' => 'Uživatel, kterého se snažíte blokovat, už byl zablokován a skryt. Jelikož nemáte oprávnění hideuser, nemůžete si nastavení bloku tohoto uživatele prohlédnout ani ho změnit.',
 'ipbblocked' => 'Nemůžete blokovat nebo odblokovávat jiné uživatele, {{GENDER:|sám|sama|sám}} jste {{GENDER:|zablokován|zablokována|zablokován}}',
@@ -2941,6 +3019,8 @@ Pokud si přejete přispívat k lokalizaci softwaru MediaWiki, navštivte [//www
 'thumbnail-more' => 'Zvětšit',
 'filemissing' => 'Chybějící soubor',
 'thumbnail_error' => 'Chyba při vytváření náhledu: $1',
+'thumbnail_error_remote' => 'Chybové hlášení z {{grammar:2sg|$1}}:
+$2',
 'djvu_page_error' => 'Stránka DjVu mimo rozsah',
 'djvu_no_xml' => 'Vytvoření XML pro soubor DjVu se nezdařilo.',
 'thumbnail-temp-create' => 'Dočasný soubor náhledu nelze vytvořit.',
@@ -3087,17 +3167,11 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 
 # Stylesheets
 'common.css' => '/* Zde uvedené CSS bude ovlivňovat všechny styly */',
-'standard.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Klasický“  */',
-'nostalgia.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Nostalgie“  */',
 'cologneblue.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Kolínská modř“  */',
 'monobook.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Monobook“ */',
-'myskin.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Můj vzhled“ */',
-'chick.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Kuře“ */',
-'simple.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Jednoduchý“ */',
 'modern.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Moderní“ */',
 'vector.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Vektor“ */',
 'print.css' => '/* Zde uvedené CSS bude ovlivňovat tiskový výstup */',
-'handheld.css' => '/* Zde uvedené CSS bude ovlivňovat přenosná zařízení vycházející ze stylu nastaveného v proměnné $wgHandheldStyle */',
 'noscript.css' => '/* Zde uvedené CSS bude ovlivňovat uživatele s vypnutým JavaScriptem */',
 'group-autoconfirmed.css' => '/* Zde uvedené CSS bude ovlivňovat pouze automaticky schválené uživatele */',
 'group-bot.css' => '/* Zde uvedené CSS bude ovlivňovat pouze boty */',
@@ -3106,13 +3180,8 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 
 # Scripts
 'common.js' => '/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky.  */',
-'standard.js' => '/* JavaScript pro uživatele používající vzhled „Klasický“ */',
-'nostalgia.js' => '/* JavaScript pro uživatele používající vzhled „Nostalgie“  */',
 'cologneblue.js' => '/* JavaScript pro uživatele používající vzhled „Kolínská modř“  */',
 'monobook.js' => '/* JavaScript pro uživatele používající vzhled MonoBook */',
-'myskin.js' => '/* JavaScript pro uživatele používající vzhled „Můj vzhled“ */',
-'chick.js' => '/* JavaScript pro uživatele používající vzhled „Kuře“ */',
-'simple.js' => '/* JavaScript pro uživatele používající vzhled „Jednoduchý“ */',
 'modern.js' => '/* JavaScript pro uživatele používající vzhled „Moderní“ */',
 'vector.js' => '/* JavaScript pro uživatele používající vzhled „Vektor“ */',
 'group-autoconfirmed.js' => '/* Zde uvedený JavaScript bude použit pouze pro automaticky schválené uživatele */',
@@ -3191,12 +3260,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'pageinfo-category-files' => 'Počet souborů',
 
 # Skin names
-'skinname-standard' => 'Klasický',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Kolínská modř',
-'skinname-myskin' => 'Můj vzhled',
-'skinname-chick' => 'Kuře',
-'skinname-simple' => 'Jednoduchý',
 'skinname-modern' => 'Moderní',
 'skinname-vector' => 'Vektor',
 
@@ -3276,11 +3340,25 @@ Otevřením souboru můžete ohrozit svůj počítač.",
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minuty|$1 minut}}',
 'hours' => '{{PLURAL:$1|$1 hodina|$1 hodiny|$1 hodin}}',
 'days' => '{{PLURAL:$1|$1 den|$1 dny|$1 dní}}',
+'weeks' => '{{PLURAL:$1|$1 týden|$1 týdny|$1 týdnů}}',
 'months' => '{{PLURAL:$1|$1 měsíc|$1 měsíce|$1 měsíců}}',
 'years' => '{{PLURAL:$1|$1 rok|$1 roky|$1 let}}',
 'ago' => 'před $1',
 'just-now' => 'právě teď',
 
+# Human-readable timestamps
+'hours-ago' => 'před $1 {{PLURAL:$1|hodinou|hodinami}}',
+'minutes-ago' => 'před $1 {{PLURAL:$1|minutou|minutami}}',
+'seconds-ago' => 'před $1 {{PLURAL:$1|sekundou|sekundami}}',
+'monday-at' => 'v pondělí v $1',
+'tuesday-at' => 'v úterý v $1',
+'wednesday-at' => 've středu v $1',
+'thursday-at' => 've čtvrtek v $1',
+'friday-at' => 'v pátek v $1',
+'saturday-at' => 'v sobotu v $1',
+'sunday-at' => 'v neděli v $1',
+'yesterday-at' => 'včera v $1',
+
 # Bad image list
 'bad_image_list' => 'Tato stránka má následující formát:
 
@@ -3306,7 +3384,7 @@ Obsahuje pouze seznam s odrážkami (řádka začíná s *). První odkaz na ř
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Šířka',
 'exif-imagelength' => 'Výška',
 'exif-bitspersample' => 'Bitů na složku',
@@ -3484,7 +3562,7 @@ Obsahuje pouze seznam s odrážkami (řádka začíná s *). První odkaz na ř
 'exif-originalimageheight' => 'Výška obrázku před oříznutím',
 'exif-originalimagewidth' => 'Šířka obrázku před oříznutím',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nekomprimovaný',
 'exif-compression-2' => '1-rozměrné modifikované Huffmanovo kódování délky běhu CCITT Group 3',
 'exif-compression-3' => 'Kódování faxů CCITT Group 3',
@@ -3798,7 +3876,6 @@ Opravdu si přejete znovu tuto stránku založit?',
 'confirm-unwatch-top' => 'Vyjmout tuto stránku ze sledovaných?',
 
 # Separators for various lists, etc.
-'autocomment-prefix' => '–&#32;',
 'ellipsis' => '…',
 'percent' => '$1&#160;%',
 
@@ -3938,7 +4015,6 @@ Seznam editovaných stránek můžete také [[Special:EditWatchlist|editovat ve
 'version-other' => 'Jiné',
 'version-mediahandlers' => 'Obsluha médií',
 'version-hooks' => 'Přípojné body',
-'version-extension-functions' => 'Rozšiřující funkce',
 'version-parser-extensiontags' => 'Přidané syntaktické značky',
 'version-parser-function-hooks' => 'Funkce parseru',
 'version-hook-name' => 'Název přípojného bodu',
@@ -3947,6 +4023,7 @@ Seznam editovaných stránek můžete také [[Special:EditWatchlist|editovat ve
 'version-license' => 'Licence',
 'version-poweredby-credits' => "Tato wiki běží na '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'další',
+'version-poweredby-translators' => 'překladatelé na translatewiki.net',
 'version-credits-summary' => 'Následujícím lidem bychom rádi poděkovali za jejich příspěvky [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki je svobodný software; můžete jej šířit nebo modifikovat podle podmínek GNU General Public License, vydávané Free Software Foundation; buď verze 2 této licence anebo (podle vašeho uvážení) kterékoli pozdější verze.
 
@@ -3962,12 +4039,17 @@ MediaWiki je distribuována v naději, že bude užitečná, avšak BEZ JAKÉKOL
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Cesta k článkům]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Cesta ke skriptům]',
 
-# Special:FilePath
-'filepath' => 'Cesta k souboru',
-'filepath-page' => 'Soubor:',
-'filepath-submit' => 'Přejít',
-'filepath-summary' => 'Tato speciální stránka vrátí úplnou cestu k souboru.
-Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v přiřazených programech.',
+# Special:Redirect
+'redirect' => 'Přesměrování podle souboru, uživatele nebo ID revize',
+'redirect-legend' => 'Přesměrování na soubor či stránku',
+'redirect-summary' => 'Tato speciální stránka přesměrovává na soubor (podle názvu), stránku (podle ID revize) nebo uživatele (podle číselného uživatelského ID).',
+'redirect-submit' => 'Přejít',
+'redirect-lookup' => 'Najít:',
+'redirect-value' => 'Hodnota:',
+'redirect-user' => 'Uživatelské ID',
+'redirect-revision' => 'Revizi stránky',
+'redirect-file' => 'Jméno souboru',
+'redirect-not-exists' => 'Hodnota nenalezena',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Hledání duplicitních souborů',
@@ -4016,12 +4098,16 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
 'tags' => 'Platné značky pro změny',
 'tag-filter' => 'Filtr podle [[Special:Tags|značek]]:',
 'tag-filter-submit' => 'Filtrovat',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Značka|Značky}}]]: $2)',
 'tags-title' => 'Značky',
 'tags-intro' => 'Tato stránka obsahuje seznam značek, kterými může software označovat jednotlivé editace, a jejich významy.',
 'tags-tag' => 'Název značky',
 'tags-display-header' => 'Zobrazení na seznamech změn',
 'tags-description-header' => 'Úplný popis významu',
+'tags-active-header' => 'Aktivní?',
 'tags-hitcount-header' => 'Označené změny',
+'tags-active-yes' => 'Ano',
+'tags-active-no' => 'Ne',
 'tags-edit' => 'editovat',
 'tags-hitcount' => '$1 {{PLURAL:$1|změna|změny|změn}}',
 
@@ -4042,6 +4128,7 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
 'dberr-problems' => 'Promiňte! Tento server má v tuto chvíli technické problémy.',
 'dberr-again' => 'Zkuste několik minut počkat a poté znovu načíst stránku.',
 'dberr-info' => '(Nelze navázat spojení s databázovým serverem: $1)',
+'dberr-info-hidden' => '(Nelze navázat spojení s databázovým serverem)',
 'dberr-usegoogle' => 'Mezitím můžete zkusit hledat pomocí Google.',
 'dberr-outofdate' => 'Uvědomte si, že jejich vyhledávací index našeho obsahu může být zastaralý.',
 'dberr-cachederror' => 'Následující stránka je kopie z cache a nemusí být aktuální.',
@@ -4057,6 +4144,9 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
 'htmlform-submit' => 'Odeslat',
 'htmlform-reset' => 'Vrátit změny',
 'htmlform-selectorother-other' => 'Jiná hodnota',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Ano',
+'htmlform-chosen-placeholder' => 'Zvolte možnost',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 s podporou plnotextového vyhledávání',
@@ -4174,4 +4264,19 @@ Jinak můžete využít jednoduchý formulář níže. Váš komentář bude př
 # Image rotation
 'rotate-comment' => 'Obrázek otočen o $1 {{PLURAL:$1|stupeň|stupně|stupňů}} po směru hodinových ručiček',
 
+# Limit report
+'limitreport-title' => 'Data profilování parseru:',
+'limitreport-cputime' => 'Využití času procesoru',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekunda|sekundy|sekund}}',
+'limitreport-walltime' => 'Využití reálného času',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunda|sekundy|sekund}}',
+'limitreport-ppvisitednodes' => 'Počet uzlů navštívených preprocesorem',
+'limitreport-ppgeneratednodes' => 'Počet uzlů vygenerovaných preprocesorem',
+'limitreport-postexpandincludesize' => 'Velikost vložení po expanzi',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtů}}',
+'limitreport-templateargumentsize' => 'Velikost argumentů šablon',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtů}}',
+'limitreport-expansiondepth' => 'Největší hloubka expanze',
+'limitreport-expensivefunctioncount' => 'Počet náročných funkcí parseru',
+
 );
diff --git a/languages/messages/MessagesCsb.php b/languages/messages/MessagesCsb.php
index 759a487d..2d2d4bfa 100644
--- a/languages/messages/MessagesCsb.php
+++ b/languages/messages/MessagesCsb.php
@@ -68,9 +68,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Pòkażë lëczba ùzérającëch brëkòwników',
 'tog-oldsig' => 'Pòdzérk wëzdrzatkù twòjegò pòdpisënka',
 'tog-fancysig' => 'Wzérôj na pòdpisënk jakno na wikikòd (bez aùtomatnych lënków)',
-'tog-externaleditor' => 'Brëkùjë domëslno bùtnowégò editora (blós dlô ekspertów, je nót ekstra nastôwów w twòjim kòmpùtrze)',
-'tog-externaldiff' => 'Brëkùjë domëslno bùtnowégò nôrzãdza diff (blós dlô ekspertów.je nót ekstra nastôwów w twòjim kòmpùtrze)',
-'tog-showjumplinks' => 'Włączë lënczi przëstãpù "òbaczë téż"',
 'tog-uselivepreview' => 'Brëkùjë wtimczasnegò pòdzérkù (JavaScript) (eksperimentalné)',
 'tog-forceeditsummary' => 'Pëtôj przed wéńdzenim do pùstégò pòdrechòwania edicëji',
 'tog-watchlisthideown' => 'Zatacë mòjé edicëje z lëstë ùzérónëch artiklów',
@@ -253,7 +250,7 @@ $messages = array(
 'jumptonavigation' => 'nawigacëji',
 'jumptosearch' => 'szëkbë',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Ò {{SITENAME}}',
 'aboutpage' => 'Project:Ò_{{SITENAME}}',
 'copyright' => 'Zamkłosc hewòtny starnë je ùżëczónô wedle reglów $1.',
@@ -263,7 +260,6 @@ $messages = array(
 'disclaimers' => 'Prawné zastrzedżi',
 'disclaimerpage' => 'Project:Prawné zastrzedżi',
 'edithelp' => 'Pòmòc do edicëji',
-'edithelppage' => 'Help:Editowanié starnë',
 'helppage' => 'Help:Spisënk zamkłoscë',
 'mainpage' => 'Przédnô starna',
 'mainpage-description' => 'Przédnô starna',
@@ -583,9 +579,6 @@ Spróbùjë szëkbë z przëdôwkã ''all:'' dlô całowny zamkłoscë starnów
 'powersearch-redir' => 'Lësta przeczerowaniów',
 'powersearch-field' => 'Szëkba za',
 
-# Quickbar
-'qbsettings' => 'Sztrépk chùtczégò przistãpù',
-
 # Preferences page
 'preferences' => 'Preferencëje',
 'mypreferences' => 'Mòje nastôwë',
@@ -642,7 +635,6 @@ Spróbùjë szëkbë z przëdôwkã ''all:'' dlô całowny zamkłoscë starnów
 'prefs-reset-intro' => 'Na ti starnie mòże doprowôdzëc nazôd domëslné nastôwë dlô ti starnë.
 Negò dzéjaniô ni mòżé pòzdze ju copnąc.',
 'prefs-emailconfirm-label' => 'Pòcwierdzenié e-mailowi adresë:',
-'prefs-textboxsize' => 'Miara edicjowégò òkna',
 'youremail' => 'E-mail:',
 'username' => 'Miono brëkòwnika:',
 'uid' => 'ID brëkòwnika:',
@@ -819,8 +811,6 @@ Wszëtczé gòdzënë tikają conë ùniwersalnégò czasë.',
 'statistics' => 'Statisticzi',
 'statistics-header-users' => 'Statistika brëkòwników',
 
-'disambiguationspage' => 'Template:Starnë_ùjednoznacznieniô',
-
 'doubleredirects' => 'Dëbeltné przeczérowania',
 
 'brokenredirects' => 'Zerwóné przeczerowania',
@@ -917,7 +907,7 @@ Czej chcesz remôc starnã z lëste ùzéronëch artiklów, klikni ''Òprzestôj
 'unwatchthispage' => 'Òprzestôj ùzerac ną starnã',
 'notanarticle' => 'To nie je artikel',
 'watchlist-details' => 'Ùzérôsz {{PLURAL:$1|$1 artikel|$1 artikle/-ów}}, nie rechùjąc diskùsëjów.',
-'wlheader-showupdated' => "* Artiklë jakczé òsta zmienioné òd Twòji slédny wizytë są wëapratnioné '''pògrëbieniém'''",
+'wlheader-showupdated' => "Artiklë jakczé òsta zmienioné òd Twòji slédny wizytë są wëapratnioné '''pògrëbieniém'''",
 'watchmethod-list' => 'szëkba ùzérónëch artiklów westrzód pòslédnëch edicëjów',
 'watchlistcontains' => 'Na twòji lësce ùzérónëch artiklów {{PLURAL:$1|je 1 strana|są $1 starnë|je $1 starnów}}.',
 'wlnote' => "Niżi môsz wëskrzënioné {{PLURAL:$1|slédną zmianã|'''$1''' slédnëch zmianów}} zrobioné òb {{PLURAL:$2|gòdzënã|'''$2''' gòdzënë/gòdzënów}}.",
@@ -1051,7 +1041,6 @@ Biéj do [[Special:BlockList|lëstë zascëgónëch adresów IP]] abë òbaczëc
 'blocklogentry' => 'zablokòwôł [[$1]], czas blokadë: $2 $3',
 'unblocklogentry' => 'òdblokòwôł $1',
 'block-log-flags-nocreate' => 'blokada ùsôdzaniô kònta',
-'proxyblocksuccess' => 'Fertich.',
 
 # Developer tools
 'lockbtn' => 'Zascëgôj bazã pòdôwków',
@@ -1227,7 +1216,7 @@ Jinszé pòla bãdą domëslno zataconé.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-source' => 'Zdrój',
 'exif-languagecode' => 'Jãzëk',
 
diff --git a/languages/messages/MessagesCu.php b/languages/messages/MessagesCu.php
index ba529576..8a6738d0 100644
--- a/languages/messages/MessagesCu.php
+++ b/languages/messages/MessagesCu.php
@@ -156,6 +156,18 @@ $messages = array(
 'oct' => 'ок҃т',
 'nov' => 'но҃є',
 'dec' => 'дє҃к',
+'january-date' => 'ꙗноуарїꙗ $1 числа',
+'february-date' => 'фєвроуарїꙗ $1 числа',
+'march-date' => 'мартїꙗ $1 числа',
+'april-date' => 'апрїлїꙗ $1 числа',
+'may-date' => 'маїꙗ $1 числа',
+'june-date' => 'їоунїꙗ $1 числа',
+'july-date' => 'їоулїꙗ $1 числа',
+'august-date' => 'аѷгоуста $1 числа',
+'september-date' => 'сєптємврїꙗ $1 числа',
+'october-date' => 'октѡврїꙗ $1 числа',
+'november-date' => 'ноємврїꙗ $1 числа',
+'december-date' => 'дєкємврїꙗ $1 числа',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Катигорїꙗ|Катигорїи|Катигорїѩ|Катигорїѩ}}',
@@ -168,7 +180,7 @@ $messages = array(
 'category-subcat-count' => '{{PLURAL:$2|Сѥи катигорїи тъкъмо сꙗ подъкатигорїꙗ ѥстъ|Сѥи катигорїи {{PLURAL:$1|ѥдина подъкатигорїꙗ ѥстъ|2 подъкатигорїи ѥстє|$1 подъкатигорїѩ сѫтъ}} · а вьсѩ жє подъкатигорїѩ число $2 ѥстъ}}',
 'listingcontinuesabbrev' => '· вѧщє',
 
-'linkprefix' => '/^(.*?)(„|«)$/sD',
+'linkprefix' => '/^((?>.*(?<!(?:„|«)$)))(.+)$/sDu',
 
 'about' => 'опьсаниѥ',
 'article' => 'члѣнъ',
@@ -240,7 +252,7 @@ $messages = array(
 'jumptosearch' => 'исканиѥ',
 'pool-errorunknown' => 'нєвѣдома блаꙁна',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'О {{grammar:instrumental|{{SITENAME}}}}',
 'aboutpage' => 'Project:О сѥмь опꙑтьствовании',
 'copyright' => 'подъ прощєниѥмь $1 пьсано ѥстъ',
@@ -248,7 +260,6 @@ $messages = array(
 'currentevents' => 'сѫщѧѩ вѣщи',
 'currentevents-url' => 'Project:Сѫщѧѩ вѣщи',
 'edithelp' => 'помощь по исправлѥниѭ',
-'edithelppage' => 'Help:Исправлѥниѥ страницѧ',
 'helppage' => 'Help:Каталогъ',
 'mainpage' => 'главьна страница',
 'mainpage-description' => 'главьна страница',
@@ -302,8 +313,15 @@ $messages = array(
 'welcomecreation-msg' => 'твоѥ польꙃєватєльско мѣсто сътворєно ѥстъ ⁙
 нꙑнѣ иꙁмѣнити [[Special:Preferences|{{GRAMMAR:genitive|{{SITENAME}}}} строи]] можєши',
 'yourname' => 'твоѥ имѧ',
+'userlogin-yourname' => 'польꙃєватєлꙗ имѧ',
+'userlogin-yourname-ph' => 'твоѥ польꙃєватєлꙗ имѧ напьши',
 'yourpassword' => 'таино слово напиши',
+'userlogin-yourpassword' => 'таино слово',
+'userlogin-yourpassword-ph' => 'твоѥ таино слово напьши',
+'createacct-yourpassword-ph' => 'таино слово напьши',
 'yourpasswordagain' => 'опакꙑ таиноѥ слово напиши',
+'createacct-yourpasswordagain' => 'таина слова оувѣрѥниѥ',
+'createacct-yourpasswordagain-ph' => 'опакꙑ жє таино слово напьши',
 'login' => 'въниди',
 'nav-login-createaccount' => 'въниди / съꙁижди си мѣсто',
 'userlogin' => 'въниди / съꙁижди си мѣсто',
@@ -315,10 +333,17 @@ $messages = array(
 'createaccount' => 'съꙁижди си мѣсто',
 'gotaccount' => 'мѣсто ти ѥстъ ли? $1',
 'gotaccountlink' => 'въниди',
+'helplogin-url' => 'Help:Въниждѥниѥ',
 'createaccountreason' => 'какъ съмꙑслъ :',
+'createacct-reason' => 'какъ съмꙑслъ',
+'createacct-submit' => 'съꙁижди си мѣсто',
+'createacct-benefit-heading' => '{{SITENAME}} съꙁьдаѥтъ сѧ чьловѣкꙑ · ижє ꙗко тꙑ сѫтъ',
+'createacct-benefit-body1' => '{{PLURAL:$1|мѣна|мѣнꙑ|мѣнъ}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|страница|страници|страницѧ}}',
 'userexists' => 'сѫщє польꙃєватєлꙗ имѧ пьса ⁙
 бѫди добръ · ино сѥ иꙁобрѧщи',
 'loginerror' => 'въхода блаꙁна',
+'createacct-error' => 'мѣста сътворѥниꙗ блаꙁна',
 'loginsuccess' => "'''нꙑнѣ тꙑ {{GENDER|въшьлъ|въшьла}} въ {{grammar:locative|{{SITENAME}}}} подь имьньмъ ⁖ $1 ⁖.'''",
 'mailmypassword' => 'посъли ново таино слово',
 'accountcreated' => 'мѣсто сътворєно ѥстъ',
@@ -382,6 +407,7 @@ $messages = array(
 'template-protected' => '(ꙁабранєно ѥстъ)',
 'template-semiprotected' => '(чѧстьно ꙁабранѥно)',
 'hiddencategories' => 'сꙗ страница въ {{PLURAL:$1|1 съкрꙑтѣи катигорїи|$1 съкрꙑтѣхъ катигорїѩ}} сѧ авлꙗѥтъ :',
+'postedit-confirmation' => 'твоꙗ мѣна съхранѥна ѥстъ',
 
 # History pages
 'viewpagelogs' => 'си страницѧ їсторїѩ',
@@ -423,7 +449,6 @@ $messages = array(
 'viewprevnext' => 'виждь ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''страница имєньмь ⁖ [[:$1]] ⁖ ѥстъ створѥна ю'''",
 'searchmenu-new' => "'''страницѫ ⁖ [[:$1]] ⁖ сътворити можєши'''",
-'searchhelp-url' => 'Help:Каталогъ',
 'searchprofile-articles' => 'члѣни',
 'searchprofile-project' => 'опꙑтьствовании и помощи страницѧ',
 'searchprofile-images' => 'дѣла',
@@ -623,9 +648,6 @@ $messages = array(
 'statistics-files' => 'положєнꙑ дѣла',
 'statistics-users-active' => 'дѣꙗтєльнꙑ польꙃєватєлє',
 
-'disambiguations' => 'страницѧ ижє съвѧꙁи съ мъногосъмꙑслиꙗ имѫтъ',
-'disambiguationspage' => 'Template:мъногосъмꙑслиѥ',
-
 'brokenredirects-edit' => 'исправи',
 'brokenredirects-delete' => 'поничьжєниѥ',
 
@@ -876,7 +898,17 @@ $messages = array(
 'showhidebots' => '($1 аѵтоматъ)',
 'ilsubmit' => 'ищи',
 
-# EXIF tags
+# Human-readable timestamps
+'monday-at' => 'понєдѣл҄ьникъ · $1',
+'tuesday-at' => 'въторьникъ · $1',
+'wednesday-at' => 'срѣда · $1',
+'thursday-at' => 'чєтврьтъкъ · $1',
+'friday-at' => 'пѧтъкъ · $1',
+'saturday-at' => 'сѫбота · $1',
+'sunday-at' => 'нєдѣлꙗ · $1',
+'yesterday-at' => 'вьчєра · $1',
+
+# Exif tags
 'exif-artist' => 'творьць',
 'exif-languagecode' => 'ѩꙁꙑкъ',
 'exif-iimcategory' => 'катигорїꙗ',
@@ -928,8 +960,9 @@ $messages = array(
 'version-license' => 'прощєниѥ',
 'version-software-version' => 'обраꙁъ',
 
-# Special:FilePath
-'filepath-page' => 'дѣло :',
+# Special:Redirect
+'redirect-submit' => 'прѣиди',
+'redirect-file' => 'дѣла имѧ',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'дѣла имѧ :',
@@ -945,6 +978,10 @@ $messages = array(
 # Database error messages
 'dberr-header' => 'Вики тєхнїчьнꙑ отѧжєниꙗ имѣтъ',
 
+# HTML forms
+'htmlform-no' => 'нѣтъ',
+'htmlform-yes' => 'да',
+
 # New logging system
 'logentry-delete-delete' => '$1 {{GENDER:$2|поничьжилъ|поничьжила}} страницѫ ⁖ $3 ⁖',
 'logentry-move-move' => '$1 {{GENDER:$2|нарєчє}} страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖',
diff --git a/languages/messages/MessagesCv.php b/languages/messages/MessagesCv.php
index aca61206..0bbb896f 100644
--- a/languages/messages/MessagesCv.php
+++ b/languages/messages/MessagesCv.php
@@ -72,9 +72,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Страницăна миçе хутшăнакан сăнав списокне кĕртнине кăтартмалла',
 'tog-oldsig' => 'Хальхи алӑ пусни:',
 'tog-fancysig' => 'Хăвăр тунă алă пуснин вики-паллисем',
-'tog-externaleditor' => 'Палăртман чухне тулашри редактора усă курмалла',
-'tog-externaldiff' => 'Палăртман чухне версисене танлаштарма тулашри программăна усă курмалла',
-'tog-showjumplinks' => '«... патне куç» хушма каçăсене усă курмалла',
 'tog-uselivepreview' => 'Хăвăрт кăтартакан малтанхи курăнăва усă курмалла (JavaScript, экспериментлă)',
 'tog-forceeditsummary' => 'Тӳрлетӳсен кĕске ăнлантарăвне кăтартман чухне асăрхаттармалла',
 'tog-watchlisthideown' => 'Сăнав списокĕнче эпĕ тунă тӳрлетӳсене кăтартмалла мар',
@@ -156,7 +153,7 @@ $messages = array(
 'category-file-count-limited' => 'Ку категоринче $1 файл.',
 'listingcontinuesabbrev' => '(малалли)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff«"]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff«"])))(.+)$/sD',
 
 'about' => 'Ăнлантаркăч',
 'article' => 'Статья',
@@ -244,7 +241,7 @@ $messages = array(
 'jumptonavigation' => 'çӳрев',
 'jumptosearch' => 'Шырав',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} çинчен',
 'aboutpage' => 'Project:çинчен',
 'copyright' => 'Ку ăшлăх $1 килĕшӳллĕн сарăлать.',
@@ -254,7 +251,6 @@ $messages = array(
 'disclaimers' => 'Яваплăха тивĕçтерменни',
 'disclaimerpage' => 'Project:Яваплăха тивĕçтерменни',
 'edithelp' => 'Улшăнусене кĕртме пулăшакан пулăшу',
-'edithelppage' => 'Help:Улшăнусене кĕртме пулăшакан пулăшу',
 'helppage' => 'Help:Пулăшу',
 'mainpage' => 'Тĕп страница',
 'mainpage-description' => 'Тĕп страницă',
@@ -318,16 +314,6 @@ $messages = array(
 # General errors
 'error' => 'Йăнăш',
 'databaseerror' => 'Пĕлĕм пуххин йăнăшĕ',
-'dberrortext' => 'Пĕлĕм пуххине янă ыйтăвĕнче синтаксис йăнăшĕ пур.
-Пĕлĕм пуххине янă юлашки ыйту:
-<blockquote><tt>$1</tt></blockquote>
-<tt>«$2»</tt> функци ыйтнă.
-MySQL çак йăнăша тавăрнă <tt>«$3: $4»</tt>.',
-'dberrortextcl' => 'Пĕлĕм пуххине янă ыйтăвĕнче синтаксис йăнăшĕ пур.
-Пĕлĕм пуххине янă юлашки ыйту:
-«$1»
-«$2» функци ыйтнă.
-MySQL çак йăнăша тавăрнă «$3: $4».',
 'laggedslavemode' => 'Асăрхăр! Страница çинче юлашки улшăнусене кăтартмасăр пултарнă.',
 'readonly' => 'Пĕлĕм пуххине çырассине чарса хунă',
 'enterlockreason' => 'Чарнин сăлтавне тата палăртнă вăхăта кăтартăр.',
@@ -368,7 +354,6 @@ $1',
 'protectedpagetext' => 'Ку страницăна тӳрлетме май çук, хӳтĕленĕ.',
 'viewsourcetext' => 'Эсир ку страницăн малтанхи текстне пăхма тата копилеме пултаратăр:',
 'protectedinterface' => "Ку страница çинче MediaWiki'н системлă çырăвĕ вырнаçнă, ăна проект администраторĕсем çеç улăштарма пултараççĕ.",
-'sqlhidden' => '(SQL ыйтăва пытарнă)',
 'namespaceprotected' => 'Сирĕн «$1» ят уçлăхĕнчи статьясене тӳрлетмелли май çук..',
 'ns-specialprotected' => '«{{ns:special}}» ят уçлăхĕнчи страницăсене эсир тӳрлетейместĕр.',
 'titleprotected' => "Ку ятлă страницăна хатĕрлессине [[Хутшăнакан:$1|$1]] хутшăнакан чарса хунă.
@@ -581,16 +566,12 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
 'textmatches' => 'Статьясенчи текст пĕрпеклĕхĕ',
 'prevn' => 'малтанхи {{PLURAL:$1|$1}}',
 'nextn' => 'малалли {{PLURAL:$1|$1}}',
-'searchhelp-url' => 'Help:Пулăшу',
 'search-result-size' => '$1 ({{PLURAL:$2|1 сăмах|$2 сăмах}})',
 'showingresults' => 'Аяларах эсир <b>#$2</b> пуçласа кăтартнă <b>$1</b> йĕркене куратăр.',
 'showingresultsheader' => "{{PLURAL:$5|Результат '''$1'''  '''$3''' хушшинчен|Результатсем'''$1 - $2''' '''$3''' хушшинчен}}  '''$4''' валли",
 'powersearch' => 'Анлă шырав',
 'powersearch-legend' => 'Анлă шырав',
 
-# Quickbar
-'qbsettings' => 'Навигаци хăми',
-
 # Preferences page
 'preferences' => 'Ĕнерлевсем',
 'mypreferences' => 'Ман ĕнерлевсем',
@@ -797,12 +778,6 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
 'statistics-header-users' => 'Хутшăнакансен статистики',
 'statistics-mostpopular' => 'Чи нумай пăхакан страницăсем',
 
-'disambiguations' => 'Нумай пĕлтерĕшлĕ статьясене кăтартакан страницăсем',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => "Çак статьясем '''нумай пĕлтерĕшле страницăсем'''çине куçараççĕ.
-Унта куçарас вырăнне вĕсем кирлĕ страницăсем çине куçармалла пулĕ.<br />
-Енчен те страница çинче [[MediaWiki:Disambiguationspage]] страницăра кăтартнă шаблон ятне вырнаçтарнă пулсан вăл нумай пĕлтерĕшлĕ страница шутланать.",
-
 'doubleredirects' => 'Икĕ хут куçаракансем',
 
 'brokenredirects' => 'Татăк куçару страницисем',
@@ -1129,7 +1104,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Metadata
 'metadata' => 'Метаданнăйсем:',
 
-# EXIF tags
+# Exif tags
 'exif-exifversion' => 'Exif версийĕ',
 'exif-flashpixversion' => 'Ĕçлеме пултаракан FlashPix версийĕ',
 'exif-gpsversionid' => 'GPS-информаци блокĕн версийĕ',
@@ -1194,10 +1169,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:Version
 'version' => 'MediaWiki версийĕ',
 
-# Special:FilePath
-'filepath' => 'Файл çулĕ',
-'filepath-submit' => 'Çул',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Пĕр пек файлсен шыравĕ',
 'fileduplicatesearch-legend' => 'Дубликатсен шыравĕ',
diff --git a/languages/messages/MessagesCy.php b/languages/messages/MessagesCy.php
index 7ca2a513..e7c38184 100644
--- a/languages/messages/MessagesCy.php
+++ b/languages/messages/MessagesCy.php
@@ -147,9 +147,6 @@ $messages = array(
 'tog-shownumberswatching' => "Dangos y nifer o ddefnyddwyr sy'n gwylio",
 'tog-oldsig' => 'Y llofnod cyfredol:',
 'tog-fancysig' => 'Trin y llofnod fel testun wici (heb gyswllt wici awtomatig)',
-'tog-externaleditor' => 'Defnyddio golygydd allanol trwy ragosodiad (ar gyfer arbenigwyr yn unig; mae arno angen gosodiadau arbennig ar eich cyfrifiadur. [//www.mediawiki.org/wiki/Manual:External_editors Rhagor o wybodaeth.])',
-'tog-externaldiff' => 'Defnyddio "external diff" trwy ragosodiad (ar gyfer arbenigwyr yn unig; mae arno angen gosodiadau arbennig ar eich cyfrifiadur. [//www.mediawiki.org/wiki/Manual:External_editors Rhagor o wybodaeth.])',
-'tog-showjumplinks' => 'Galluogi dolenni hygyrchedd "neidio i"',
 'tog-uselivepreview' => 'Defnyddio rhagolwg byw (arbrofol)',
 'tog-forceeditsummary' => 'Tynnu fy sylw pan adawaf flwch crynodeb golygu yn wag',
 'tog-watchlisthideown' => 'Cuddio fy ngolygiadau fy hunan yn fy rhestr wylio',
@@ -162,6 +159,8 @@ $messages = array(
 'tog-diffonly' => "Peidio â dangos cynnwys y dudalen islaw'r gymhariaeth ar dudalennau cymharu",
 'tog-showhiddencats' => 'Dangos categorïau cuddiedig',
 'tog-norollbackdiff' => 'Hepgor dangos cymhariaeth ar ôl gwrthdroi golygiad',
+'tog-useeditwarning' => "Tynnwch fy sylw pan wyf ar fin gadael tudalen olygu heb roi'r newidiadau ar gadw",
+'tog-prefershttps' => 'Defnyddio cysylltiad diogel bob amser tra fy mod wedi mewngofnodi',
 
 'underline-always' => 'Bob amser',
 'underline-never' => 'Byth',
@@ -225,6 +224,18 @@ $messages = array(
 'oct' => 'Hyd',
 'nov' => 'Tach',
 'dec' => 'Rhag',
+'january-date' => '$1 Ionawr',
+'february-date' => '$1 Chwefror',
+'march-date' => '$1 Mawrth',
+'april-date' => '$1 Ebrill',
+'may-date' => '$1 Mai',
+'june-date' => '$1 Mehefin',
+'july-date' => '$1 Gorffennaf',
+'august-date' => '$1 Awst',
+'september-date' => '$1 Medi',
+'october-date' => '$1 Hydref',
+'november-date' => '$1 Tachwedd',
+'december-date' => '$1 Rhagfyr',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categori|Categori|Categorïau|Categorïau|Categorïau|Categorïau}}',
@@ -306,6 +317,7 @@ $messages = array(
 'create-this-page' => "Creu'r dudalen",
 'delete' => 'Dileu',
 'deletethispage' => 'Dileer y dudalen hon',
+'undeletethispage' => 'Adfer y dudalen hon',
 'undelete_short' => 'Adfer $1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad}}',
 'viewdeleted_short' => "Edrych ar y {{PLURAL:$1|golygiad sydd wedi'i ddileu|golygiad sydd wedi'i ddileu|$1 olygiad sydd wedi'u dileu|$1 golygiad sydd wedi'u dileu|$1 golygiad sydd wedi'u dileu|$1 golygiad sydd wedi'u dileu}}",
 'protect' => 'Diogelu',
@@ -349,7 +361,7 @@ $1',
 'pool-queuefull' => 'Mae cwt y gronfa brosesu yn llawn',
 'pool-errorunknown' => 'Gwall anhysbys',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Ynglŷn â {{SITENAME}}',
 'aboutpage' => 'Project:Amdanom',
 'copyright' => "Rhoddir y cynnwys ar gael ar delerau'r drwydded $1, heblaw ei fod wedi nodi'n wahanol.",
@@ -359,7 +371,6 @@ $1',
 'disclaimers' => 'Gwadiadau',
 'disclaimerpage' => 'Project:Gwadiad Cyffredinol',
 'edithelp' => 'Help gyda golygu',
-'edithelppage' => 'Help:Golygu',
 'helppage' => 'Help:Cymorth',
 'mainpage' => 'Hafan',
 'mainpage-description' => 'Hafan',
@@ -388,7 +399,7 @@ $1',
 'youhavenewmessagesmulti' => 'Mae negeseuon newydd gennych ar $1',
 'editsection' => 'golygu',
 'editold' => 'golygu',
-'viewsourceold' => 'dangos y tarddiad',
+'viewsourceold' => 'dangos côd y dudalen',
 'editlink' => 'golygu',
 'viewsourcelink' => 'dangos côd y dudalen',
 'editsectionhint' => "Golygu'r adran: $1",
@@ -436,17 +447,12 @@ Mae rhestr o'r tudalennau arbennig dilys i'w gael [[Special:SpecialPages|yma]]."
 # General errors
 'error' => 'Gwall',
 'databaseerror' => 'Gwall databas',
-'dberrortext' => 'Mae gwall cystrawen ymholi wedi taro\'r gronfa ddata.
-Efallai fod gwall yn y meddalwedd.
-Y gofyniad diwethaf a ofynwyd i\'r gronfa ddata oedd:
-<blockquote><code>$1</code></blockquote>
-o\'r ffwythiant "<code>$2</code>".
-Rhoddwyd y côd gwall "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Mae gwall cystrawen wedi taro\'r databas.
-Y gofyniad olaf y trïodd y databas oedd:
-"$1"
-o\'r ffwythiant "$2".
-Rhoddwyd y côd gwall "$3: $4<".',
+'databaseerror-text' => "Cafwyd gwall wrth ymholi'r gronfa ddata.
+Efallai bod byg yn y meddalwedd.",
+'databaseerror-textcl' => "Cafwyd gwall wrth ymholi'r gronfa ddata.",
+'databaseerror-query' => 'Ymholiad: $1',
+'databaseerror-function' => 'Ffwythiant: $1',
+'databaseerror-error' => 'Gwall: $1',
 'laggedslavemode' => "Rhybudd: hwyrach nad yw'r dudalen yn cynnwys diwygiadau diweddar.",
 'readonly' => 'Databas ar glo',
 'enterlockreason' => "Rhowch eglurhad dros gloi'r databas, ac amcangyfrif hyd at pa bryd y bydd y databas dan glo",
@@ -480,6 +486,7 @@ Efallai fod rhywun arall eisoes wedi'i dileu.",
 'cannotdelete-title' => "Ni ellir dileu'r dudalen '$1'",
 'delete-hook-aborted' => 'Terfynwyd y dilead cyn pryd gan fachyn.
 Ni roddodd eglurhad.',
+'no-null-revision' => 'Ni lwyddwyd i wneud diwygiad newydd heb unrhyw newid ynddo, i\'r dudalen "$1"',
 'badtitle' => 'Teitl gwael',
 'badtitletext' => "Mae'r teitl a ofynnwyd amdano yn annilys, yn wag, neu cysylltu'n anghywir rhwng ieithoedd neu wicïau. Gall fod ynddo un nod neu ragor na ellir eu defnyddio mewn teitlau.",
 'perfcached' => "Mae'r wybodaeth ganlynol yn gopi cadw; mae'n bosib nad y fersiwn diweddaraf ydyw. Cedwir hyd at {{PLURAL:$1||un canlyniad yn unig|ddau ganlyniad|dri canlyniad|$1 chanlyniad|$1 canlyniad}} yn y copi cadw.",
@@ -498,12 +505,15 @@ Ceisiwch eto ymhen rhai munudau.",
 'viewyourtext' => "Cewch weld a copïo ffynhonnell ''eich golygiadau'' i'r dudalen hon:",
 'protectedinterface' => "Testun ar gyfer rhyngwyneb y wici yw cynnwys y dudalen hon. Clowyd y dudalen er mwyn ei diogeli. Os am gyfieithu'r neges neu ei newid ym mhob wici yn hytrach nag yn hwn yn unig, defnyddiwch [//translatewiki.net/ translatewiki.net], y prosiect MediaWiki sy'n hyrwyddo'r gwaith cyfieithu.",
 'editinginterface' => "'''Dalier sylw:''' Rydych yn golygu tudalen sy'n rhan o destun rhyngwyneb y meddalwedd. Bydd newidiadau i'r dudalen hon yn effeithio ar y rhyngwyneb a ddefnyddir ar y wici hwn yn unig. Os am gyfieithu'r neges rhagosodedig a ddefnyddir ar bob wici, ystyriwch ddefnyddio [//translatewiki.net/ translatewiki.net], sef y prosiect MediaWiki sy'n hyrwyddo creu rhyngwyneb amlieithog ar wicïau.",
-'sqlhidden' => '(cuddiwyd chwiliad SQL)',
 'cascadeprotected' => "Diogelwyd y dudalen hon rhag ei newid, oherwydd ei bod wedi ei chynnwys yn y {{PLURAL:$1|dudalen ganlynol|dudalen ganlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol}}, a {{PLURAL:$1|honno yn ei thro wedi ei|honno yn ei thro wedi ei|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu}} diogelu, a'r dewisiad 'sgydol' ynghynn:
 $2",
 'namespaceprotected' => "Nid oes caniatâd gennych i olygu tudalennau yn y parth '''$1'''.",
 'customcssprotected' => "Nid oes caniatâd ganddoch i olygu'r dudalen CSS hon oherwydd bod gosodiadau personol defnyddiwr arall arno.",
 'customjsprotected' => "Nid oes caniatâd ganddoch i olygu'r dudalen JavaScript hon oherwydd bod gosodiadau personol defnyddiwr arall arno.",
+'mycustomcssprotected' => "Does dim caniatad gennych i olygu'r dudalen CSS hon.",
+'mycustomjsprotected' => "Does dim caniatad gennych i olygu'r dudalen JavaScript hon.",
+'myprivateinfoprotected' => 'Nid oes caniatad gennych i olygu eich manylion personol preifat.',
+'mypreferencesprotected' => 'Nid oes caniatad gennych i olygu eich dewisiadau eich hunan.',
 'ns-specialprotected' => 'Ni ellir golygu tudalennau arbennig.',
 'titleprotected' => "Diogelwyd y teitl hwn rhag ei greu gan [[User:$1|$1]].
 Rhoddwyd y rheswm hwn - ''$2''.",
@@ -527,10 +537,19 @@ Sylwer y bydd rhai tudalennau yn parhau i ymddangos fel ag yr oeddent pan oeddec
 'welcomeuser' => 'Croeso, $1!',
 'welcomecreation-msg' => 'Peidiwch ag anghofio newid eich [[Special:Preferences|{{SITENAME}} preferences]].',
 'yourname' => 'Eich enw defnyddiwr:',
+'userlogin-yourname' => 'Enw Defnyddiwr',
+'userlogin-yourname-ph' => 'Rhowch eich enw defnyddiwr',
+'createacct-another-username-ph' => "Rhowch enw'r defnyddiwr",
 'yourpassword' => 'Cyfrinair:',
+'userlogin-yourpassword' => 'Cyfrinair',
+'userlogin-yourpassword-ph' => 'Teipiwch eich cyfrinair',
+'createacct-yourpassword-ph' => 'Rhowch gyfrinair',
 'yourpasswordagain' => 'Ail-deipiwch y cyfrinair:',
+'createacct-yourpasswordagain' => 'Gwirwch eich cyfrinair',
+'createacct-yourpasswordagain-ph' => 'Rhowch eich cyfrinair eto',
 'remembermypassword' => "Y porwr hwn i gofio'r manylion mewngofnodi (am hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod}})",
-'securelogin-stick-https' => "Cadw'r cyswllt â HTTPS ar ôl mewngofnodi",
+'userlogin-remembermypassword' => "Cadw'r sesiwn yn fyw tan i mi allgofnodi",
+'userlogin-signwithsecure' => 'Defnyddio cysylltiad diogel',
 'yourdomainname' => 'Eich parth:',
 'password-change-forbidden' => 'Ni allwch newid cyfrineiriau ar y wici hwn.',
 'externaldberror' => "Naill ai: cafwyd gwall dilysu allanol ar databas neu: ar y llaw arall efallai nad oes hawl gennych chi i ddiwygio'ch cyfrif allanol.",
@@ -539,21 +558,47 @@ Sylwer y bydd rhai tudalennau yn parhau i ymddangos fel ag yr oeddent pan oeddec
 'loginprompt' => "Mae'n rhaid galluogi cwcis er mwyn mewngofnodi i {{SITENAME}}.",
 'userlogin' => 'Mewngofnodi / creu cyfrif',
 'userloginnocreate' => 'Mewngofnodi',
-'logout' => 'Allgofnodi',
+'logout' => 'Allgofnoder',
 'userlogout' => 'Allgofnodi',
 'notloggedin' => 'Nid ydych wedi mewngofnodi',
-'nologin' => "Dim cyfrif gennych? '''$1'''.",
+'userlogin-noaccount' => 'Dim cyfrif gennych?',
+'userlogin-joinproject' => 'Ymuno â {{SITENAME}}',
+'nologin' => 'Dim cyfrif gennych? $1.',
 'nologinlink' => 'Crëwch gyfrif',
 'createaccount' => 'Creu cyfrif newydd',
-'gotaccount' => "Oes cyfrif gennych eisoes? '''$1'''.",
-'gotaccountlink' => 'Mewngofnodwch',
+'gotaccount' => 'Oes cyfrif gennych eisoes? $1.',
+'gotaccountlink' => 'Mewngofnodi',
 'userlogin-resetlink' => 'Ydych chi wedi anghofio eich manylion mewngofnodi?',
+'userlogin-resetpassword-link' => 'Ailosod eich cyfrinair',
+'helplogin-url' => 'Help:Mewngofnodi',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Cymorth i fewngofnodi]]',
+'userlogin-loggedin' => 'Rydych eisoes wedi mewngofnodi wrth yr enw {{GENDER:$1|$1}}.
+Defnyddiwch y ffurflen isod i fewngofnodi wrth rhyw enw arall.',
+'userlogin-createanother' => 'Creu cyfrif ychwanegol',
+'createacct-join' => 'Rhowch eich manylion isod',
+'createacct-another-join' => 'Rhowch fanylion y cyfrif newydd isod.',
+'createacct-emailrequired' => 'Cyfeiriad ebost',
+'createacct-emailoptional' => 'Cyfeiriad ebost (dewisol)',
+'createacct-email-ph' => 'Rhowch eich cyfeiriad ebost',
+'createacct-another-email-ph' => 'Rhowch y cyfeiriad e-bost',
 'createaccountmail' => "Defnyddio cyfrinair ar hap dros dro a'i anfon i'r cyfeiriad e-bost a roddwyd",
+'createacct-realname' => 'Enw cywir (dewisiol)',
 'createaccountreason' => 'Rheswm:',
+'createacct-reason' => 'Rheswm',
+'createacct-reason-ph' => 'Pam ydych yn creu cyfrif arall?',
+'createacct-captcha' => 'Gwiriad diogelwch',
+'createacct-imgcaptcha-ph' => 'Nodwch y testun a welwch uchod',
+'createacct-submit' => 'Creer y cyfrif',
+'createacct-another-submit' => 'Creer y cyfrif ychwanegol',
+'createacct-benefit-heading' => 'Ffrwyth llafur pobl fel chi yw {{SITENAME}}.',
+'createacct-benefit-body1' => '{{PLURAL:$1|golygiad|golygiad|olygiad|golygiad}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|tudalen|dudalen|dudalen|tudalen|thudalen|tudalen}}',
+'createacct-benefit-body3' => "{{PLURAL:$1|cyfranwyr yn|wedi cyfrannu'n}} ddiweddar",
 'badretype' => "Nid yw'r cyfrineiriau'n union yr un fath.",
 'userexists' => 'Mae rhywun arall wedi dewis yr enw defnyddiwr hwn. 
 Dewiswch un arall os gwelwch yn dda.',
 'loginerror' => 'Problem mewngofnodi',
+'createacct-error' => 'Nam wrth greu cyfrif',
 'createaccounterror' => "Ni lwyddwyd i greu'r cyfrif: $1",
 'nocookiesnew' => "Mae'r cyfrif defnyddiwr wedi cael ei greu, ond nid ydych wedi mewngofnodi. Mae {{SITENAME}} yn defnyddio cwcis wrth i ddefnyddwyr fewngofnodi. Rydych chi wedi analluogi cwcis. Mewngofnodwch eto gyda'ch enw defnyddiwr a'ch cyfrinair newydd os gwelwch yn dda, ar ôl galluogi cwcis.",
 'nocookieslogin' => 'Mae {{SITENAME}} yn defnyddio cwcis wrth i ddefnyddwyr fewngofnodi. Rydych chi wedi analluogi cwcis. Trïwch eto os gwelwch yn dda, ar ôl galluogi cwcis.',
@@ -604,11 +649,13 @@ Felly ni chaiff defnyddwyr sy'n defnyddio'r cyfeiriad IP hwn greu rhagor o gyfri
 
 Rhydd ichi anwybyddu\'r neges hon os mai camgymeriad oedd creu\'r cyfrif.',
 'usernamehasherror' => 'Ni all enw defnyddiwr gynnwys symbolau stwnsh',
-'login-throttled' => 'Rydych wedi ceisio mewngofnodi gormod o weithiau ar unwaith.
-Oedwch ychydig cyn mentro eto.',
+'login-throttled' => 'Rydych wedi ceisio mewngofnodi gormod o weithiau ar ben ei gilydd.
+Oedwch $1 cyn mentro eto.',
 'login-abort-generic' => 'Ni lwyddodd y mewngofnodi - Rhoddwyd y gorau iddo',
 'loginlanguagelabel' => 'Iaith: $1',
 'suspicious-userlogout' => 'Gwrthodwyd eich cais i allgofnodi oherwydd ei fod yn ymddangos mai gweinydd wedi torri neu ddirprwy gelc a anfonodd y cais.',
+'createacct-another-realname-tip' => "Gallwch ddewis roi eich enw go iawn.
+Os y gwnewch, fe gaiff yr enw go iawn ei defnyddio wrth dadogi'ch gwaith.",
 
 # Email sending
 'php-mail-error-unknown' => 'Gwall anhysbys yng ngweithrediad post() PHP',
@@ -624,8 +671,7 @@ Er mwyn cwblhau'r mewngofnodi, rhaid i chi osod cyfrinair newydd fel hyn:",
 'newpassword' => 'Cyfrinair newydd:',
 'retypenew' => 'Ail-deipiwch y cyfrinair newydd:',
 'resetpass_submit' => 'Gosod y cyfrinair a mewngofnodi',
-'resetpass_success' => "Llwyddodd y newid i'ch cyfrinair!
-Wrthi'n eich mewngofnodi...",
+'changepassword-success' => "Llwyddodd y newid i'ch cyfrinair!",
 'resetpass_forbidden' => 'Ni ellir newid cyfrineiriau',
 'resetpass-no-info' => 'Ni allwch fynd at y dudalen hon yn uniongyrchol heblaw eich bod wedi mewngofnodi.',
 'resetpass-submit-loggedin' => 'Newidier y cyfrinair',
@@ -637,10 +683,11 @@ Gall fod eich bod wedi llwyddo newid eich cyfrinair eisoes neu eich bod wedi gof
 
 # Special:PasswordReset
 'passwordreset' => 'Ailosod cyfrinair',
-'passwordreset-text' => 'Cwblhewch y ffurflen hon er mwyn ailosod eich cyfrinair.',
+'passwordreset-text-one' => 'Cwblhewch y ffurflen hon er mwyn ailosod eich cyfrinair.',
+'passwordreset-text-many' => "{{PLURAL:$1|Llanwch un o'r blychau er mwyn ailosod eich cyfrinair.}}",
 'passwordreset-legend' => 'Ailosod y cyfrinair',
 'passwordreset-disabled' => 'Analluogwyd ailosod cyfrineiriau ar y wici hwn.',
-'passwordreset-pretext' => "{{PLURAL:$1|||Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod}}",
+'passwordreset-emaildisabled' => 'Analluogwyd offer e-bost ar y wici hwn.',
 'passwordreset-username' => 'Eich enw defnyddiwr:',
 'passwordreset-domain' => 'Parth:',
 'passwordreset-capture' => 'Gweld yr e-bost a gaiff ei anfon?',
@@ -663,7 +710,7 @@ Dylech fewngofnodi nawr a dewis cyfrinair newydd. Os mai rhywun arall a ofynodd
 Y cyfrinair dros dro: $2",
 'passwordreset-emailsent' => 'Anfonwyd e-bost i ailosod eich cyfrinair atoch.',
 'passwordreset-emailsent-capture' => "Anfonwyd e-bost i ailosod cyfrinair, ac fe'i ddangosir isod.",
-'passwordreset-emailerror-capture' => "Lluniwyd e-bost atgoffa fel ag a welir isod, ond ni lwyddwyd i'w anfon at y defnyddiwr: $1",
+'passwordreset-emailerror-capture' => "Lluniwyd e-bost i ailosod cyfrinair fel ag a welir isod, ond ni lwyddwyd i'w anfon at y {{GENDER:$2|defnyddiwr}}: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Newid y cyfeiriad e-bost',
@@ -675,7 +722,20 @@ Y cyfrinair dros dro: $2",
 'changeemail-none' => '(dim)',
 'changeemail-password' => 'Eich cyfrinair ar {{SITENAME}}:',
 'changeemail-submit' => 'Newidier y cyfeiriad e-bost',
-'changeemail-cancel' => 'Dileer',
+'changeemail-cancel' => 'Diddymer',
+
+# Special:ResetTokens
+'resettokens' => 'Ailosod tocynnau',
+'resettokens-text' => "Gallwch ailosod tocynnau sy'n galluogi mynediad at rai manylion preifat sydd ynghlwm wrth y cyfrif yma.
+
+Dylech wneud hyn os wnaethoch rannu'r manylion hyn gyda rhywun ar ddamwain neu os oes problem wedi codi gyda diogelwch eich cyfrif.",
+'resettokens-no-tokens' => "Nid oes unrhyw docynnau i'w hailosod.",
+'resettokens-legend' => 'Ailosod tocynnau',
+'resettokens-tokens' => 'Tocynnau:',
+'resettokens-token-label' => '$1 (gwerth presennol: $2)',
+'resettokens-watchlist-token' => "Tocyn i borthiant gwe (Atom/RSS) y [[Special:Watchlist|newidiadau i'r tudalennau ar eich rhestr wylio]]",
+'resettokens-done' => 'Ailosodwyd y tocynnau.',
+'resettokens-resetbutton' => 'Ailosoder y tocynnau a ddewiswyd',
 
 # Edit page toolbar
 'bold_sample' => 'Testun cryf',
@@ -867,12 +927,15 @@ Ni roddodd eglurhad.',
 Ymddengys iddi gael ei dileu.",
 'edit-conflict' => 'Cyd-ddigwyddiad golygu.',
 'edit-no-change' => 'Anwybyddwyd eich golygiad, gan na newidiwyd y testun.',
+'postedit-confirmation' => 'Rhoddwyd eich golygiad ar gadw.',
 'edit-already-exists' => 'Ni ellid creu tudalen newydd.
 Mae ar gael yn barod.',
 'defaultmessagetext' => 'Y testun rhagosodedig',
 'content-failed-to-parse' => "Ni lwyddwyd i ddosrannu'r cynnwys sydd ar ffurf $2 yn ôl y model $1: $3",
 'invalid-content-data' => "Data annilys i'r cynnwys",
 'content-not-allowed-here' => 'Nid yw cynnwys ar ffurf "$1" yn cael ei ganiatau ar y dudalen [[$2]]',
+'editwarning-warning' => 'Os y gadewch y dudalen hon mae\'n bosib y collwch eich newidiadau iddi.
+Os ydych wedi mewngofnodi gallwch ddiddymu\'r rhybudd hwn yn yr adran "Golygu" yn eich dewisiadau.',
 
 # Content models
 'content-model-wikitext' => 'cystrawen wici',
@@ -907,6 +970,7 @@ Cafodd yr argiau hyn eu hepgor.",
 'undo-failure' => 'Methwyd a dadwneud y golygiad oherwydd gwrthdaro â golygiadau cyfamserol.',
 'undo-norev' => "Ni ellid dadwneud y golygiad oherwydd nad yw'n bod neu iddo gael ei ddileu.",
 'undo-summary' => 'Dadwneud y golygiad $1 gan [[Special:Contributions/$2|$2]] ([[User talk:$2|Sgwrs]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])',
+'undo-summary-username-hidden' => 'Dadwneud y golygiad $1 gan ddefnyddiwr cudd',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Yn methu creu cyfrif',
@@ -1086,6 +1150,7 @@ Pan yn gwneud hyn dylid sicrhau nad yw dilyniant hanes tudalennau yn cael ei ddi
 'compareselectedversions' => 'Cymharer y fersiynau dewisedig',
 'showhideselectedversions' => 'Dangos/cuddio y diwygiadau dewisedig',
 'editundo' => 'dadwneud',
+'diff-empty' => '(Dim gwahaniaeth)',
 'diff-multi' => '(Ni ddangosir {{PLURAL:$1|yr $1 diwygiad|yr $1 diwygiad|y $1 ddiwygiad|y $1 diwygiad|y $1 diwygiad|y $1 diwygiad}} rhyngol gan {{PLURAL:$2||un defnyddiwr|$2 ddefnyddiwr|$2 defnyddiwr|$2 o ddefnyddwyr|$2 o ddefnyddwyr}}.)',
 'diff-multi-manyusers' => '(Ni ddangosir {{PLURAL:$1|yr $1 diwygiad|yr $1 diwygiad|y $1 ddiwygiad|y $1 diwygiad|y $1 diwygiad|y $1 diwygiad}} rhyngol gan mwy na $2 {{PLURAL:$2|o ddefnyddwyr}}.)',
 'difference-missing-revision' => "Ni chafwyd hyd i $1 {{PLURAL:$2|diwygiad|diwygiad|ddiwygiad|diwygiad}} o'r gwahaniaeth ($1) {{PLURAL:$2|hwn}}.
@@ -1113,7 +1178,6 @@ Mae manylion pellach i'w cael yn [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'searchmenu-legend' => 'Dewisiadau chwilio',
 'searchmenu-exists' => "'''Mae tudalen o'r enw \"[[\$1]]\" ar y wici hwn'''",
 'searchmenu-new' => "'''Creu'r dudalen \"[[:\$1]]\" ar y wici hwn!'''",
-'searchhelp-url' => 'Help:Cymorth',
 'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Chwilio drwy tudalennau gyda'r rhagddodiad hwn]]",
 'searchprofile-articles' => 'Tudalennau pwnc (erthyglau/ffeiliau)',
 'searchprofile-project' => 'Tudalennau Cymorth a Phrosiect',
@@ -1156,15 +1220,7 @@ Mae manylion pellach i'w cael yn [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'searchdisabled' => "Mae'r teclyn chwilio ar {{SITENAME}} wedi'i analluogi dros dro.
 Yn y cyfamser gallwch chwilio drwy Google.
 Cofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
-
-# Quickbar
-'qbsettings' => 'Panel llywio',
-'qbsettings-none' => 'Dim',
-'qbsettings-fixedleft' => 'Sefydlog ar y chwith',
-'qbsettings-fixedright' => 'Sefydlog ar y dde',
-'qbsettings-floatingleft' => 'Yn arnofio ar y chwith',
-'qbsettings-floatingright' => 'Yn arnofio ar y dde',
-'qbsettings-directionality' => "Yn sefydlog, ar yr ochr o'r ddalen lle rydych yn dechrau ysgrifennu eich iaith",
+'search-error' => 'Cafwyd gwall wrth chwilio: $1',
 
 # Preferences page
 'preferences' => 'Dewisiadau',
@@ -1198,7 +1254,6 @@ Cofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
 'resetprefs' => "Clirio'r darpar newidiadau",
 'restoreprefs' => 'Adfer yr holl osodiadau diofyn (ymhob adran)',
 'prefs-editing' => 'Golygu',
-'prefs-edit-boxsize' => 'Maint y blwch testun.',
 'rows' => 'Rhesi:',
 'columns' => 'Colofnau:',
 'searchresultshead' => 'Chwilio',
@@ -1209,9 +1264,9 @@ Cofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
 'recentchangesdays-max' => '(hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}})',
 'recentchangescount' => "Nifer y golygiadau i'w dangos yn ddiofyn:",
 'prefs-help-recentchangescount' => 'Mae hwn yn cynnwys newidiadau diweddar, hanesion tudalennau, a logiau.',
-'prefs-help-watchlist-token' => "Gallwch gynhyrchu porthiant RSS ar gyfer eich rhestr wylio drwy osod allwedd gudd yn y blwch hwn.
-Gall unrhywun sy'n gwybod yr allwedd ddarllen eich rhestr wylio, felly gofalwch ddewis allwedd ddiogel.
-Dyma allwedd wedi ei chreu ar hap y gallwch ei defnyddio: $1",
+'prefs-help-watchlist-token2' => "Dyma'r tocyn cudd i borthiant gwe eich rhestr wylio.
+Bydd unrhyw un sy'n gwybod hwn yn gallu darllen eich rhestr wylio, felly peidiwch a'i roi i neb.
+[[Special:ResetTokens|Cliciwch fan hyn os oes angen ailosod y tocyn]].",
 'savedprefs' => 'Mae eich dewisiadau wedi cael eu cadw.',
 'timezonelegend' => 'Ardal amser:',
 'localtime' => 'Amser lleol:',
@@ -1242,7 +1297,6 @@ Dyma allwedd wedi ei chreu ar hap y gallwch ei defnyddio: $1",
 'prefs-reset-intro' => "Gallwch ddefnyddio'r dudalen hon i ailosod eich dewisiadau i'r rhai diofyn.
 Ni allwch ddadwneud y weithred hon.",
 'prefs-emailconfirm-label' => "Cadarnhau'r e-bost:",
-'prefs-textboxsize' => 'Maint y ffenestr olygu',
 'youremail' => 'Eich cyfeiriad e-bost',
 'username' => '{{GENDER:$1|Enw defnyddiwr}}:',
 'uid' => '{{GENDER:$1|ID y defnyddiwr}}:',
@@ -1275,6 +1329,8 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'prefs-dateformat' => 'Fformat dyddiad',
 'prefs-timeoffset' => 'Atred amser',
 'prefs-advancedediting' => 'Dewisiadau cyffredinol',
+'prefs-editor' => 'Golygydd',
+'prefs-preview' => 'Rhagolwg',
 'prefs-advancedrc' => 'Dewisiadau uwch',
 'prefs-advancedrendering' => 'Dewisiadau uwch',
 'prefs-advancedsearchoptions' => 'Dewisiadau uwch',
@@ -1282,7 +1338,9 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'prefs-displayrc' => 'Dewisiadau arddangos',
 'prefs-displaysearchoptions' => 'Dewisiadau arddangos',
 'prefs-displaywatchlist' => 'Dewisiadau arddangos',
+'prefs-tokenwatchlist' => 'Tocyn',
 'prefs-diffs' => "Cymharu golygiadau ('gwahan')",
+'prefs-help-prefershttps' => "Bydd y dewis yma'n cael ei roi ar waith y tro nesaf i chi fewngofnodi.",
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Y cyfeiriad e-bost yn ymddangos yn un dilys',
@@ -1309,6 +1367,8 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'userrights-notallowed' => 'Nid oes ganiatâd priodol gennych i ychwanegu neu dynnu hawliau defnyddwyr.',
 'userrights-changeable-col' => 'Grwpiau y gallwch eu newid',
 'userrights-unchangeable-col' => 'Grwpiau na allwch eu newid',
+'userrights-conflict' => "Gwrthdaro oherwydd newid i hawliau defnyddiwr! Adolygwch eich newidiadau a'u cadarnhau.",
+'userrights-removed-self' => "Rydych wedi llwyddo rhoi'r gorau i'ch galluoedd. Gan hynny, nid ydych yn cael myned i'r dudalen hon bellach.",
 
 # Groups
 'group' => 'Grŵp:',
@@ -1374,11 +1434,19 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'right-proxyunbannable' => 'Mynd heibio i flociau awtomatig gan weinyddion dirprwyol',
 'right-unblockself' => 'Dad-flocio ei hunan',
 'right-protect' => 'Newid lefelau diogelu a golygu tudalennau a sgydol-ddiogelwyd',
-'right-editprotected' => 'Golygu tudalennau sydd wedi eu diogelu (ond bod hebddynt ddiogelu sgydol)',
+'right-editprotected' => 'Golygu tudalennau sydd wedi eu diogelu ond mai "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Golygu tudalennau sydd wedi eu diogelu, ond "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => "Golygu'r rhyngwyneb",
 'right-editusercssjs' => 'Golygu ffeiliau CSS a JS yn perthyn i ddefnyddwyr eraill',
 'right-editusercss' => 'Golygu ffeiliau CSS yn perthyn i ddefnyddwyr eraill',
 'right-edituserjs' => 'Golygu ffeiliau JS yn perthyn i ddefnyddwyr eraill',
+'right-editmyusercss' => 'Golygu eich ffeiliau defnyddiwr CSS eich hunan.',
+'right-editmyuserjs' => 'Golygu eich ffeiliau defnyddiwr JavaScript eich hunan.',
+'right-viewmywatchlist' => 'Gweld eich rhestr wylio',
+'right-editmywatchlist' => 'Golygu eich rhestr wylio. Sylwer bod rhai gweithredoedd yn arwain at ychwanegu tudalennau hyd yn oed heb yr hawl hon.',
+'right-viewmyprivateinfo' => 'Gweld eich manylion personol preifat eich hunan (e.e. cyfeiriad ebost, enw cywir)',
+'right-editmyprivateinfo' => 'Golygu eich manylion personol preifat eich hunan (e.e. cyfeiriad ebost, enw cywir)',
+'right-editmyoptions' => 'Golygu eich dewisiadau',
 'right-rollback' => 'Gwrthdroi golygiadau defnyddiwr diwethaf rhyw dudalen yn sydyn',
 'right-markbotedits' => 'Marcio golygiadau wedi eu gwrthdroi yn olygiadau bot',
 'right-noratelimit' => 'Bod heb gyfyngiad ar gyflymder eich gweithredoedd',
@@ -1440,12 +1508,19 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'action-userrights-interwiki' => 'golygu galluoedd y defnyddwyr ar wicïau eraill',
 'action-siteadmin' => "cloi neu ddatgloi'r databas",
 'action-sendemail' => 'anfon e-bost',
+'action-editmywatchlist' => 'golygu eich rhestr wylio',
+'action-viewmywatchlist' => 'gweld eich rhestr wylio',
+'action-viewmyprivateinfo' => 'gweld eich manylion personol preifat',
+'action-editmyprivateinfo' => 'golygu eich manylion personol preifat',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|newid|newid|newid|newid|newid|o newidiadau}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|ers eich ymweliad diwethaf}}',
+'enhancedrc-history' => 'hanes',
 'recentchanges' => 'Newidiadau diweddar',
 'recentchanges-legend' => "Dewisiadau'r newidiadau diweddar",
 'recentchanges-summary' => "Dilynwch y newidiadau diweddaraf i'r wici ar y dudalen hon.",
+'recentchanges-noresult' => "Ni chafwyd unrhyw newidiadau yn ystod y cyfnod oedd yn cyfateb i'r gofyniad.",
 'recentchanges-feed-description' => "Dilynwch y newidiadau diweddaraf i'r wici gyda'r porthiant hwn.",
 'recentchanges-label-newpage' => 'Dechreuwyd tudalen newydd wrth olygu',
 'recentchanges-label-minor' => 'Mân olygiad',
@@ -1482,7 +1557,6 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'recentchangeslinked-feed' => 'Newidiadau perthnasol',
 'recentchangeslinked-toolbox' => 'Newidiadau perthnasol',
 'recentchangeslinked-title' => 'Newidiadau cysylltiedig â "$1"',
-'recentchangeslinked-noresult' => 'Ni chafwyd unrhyw newidiadau i dudalennau cysylltiedig yn ystod cyfnod yr ymholiad.',
 'recentchangeslinked-summary' => "Mae'r dudalen arbennig hon yn dangos y newidiadau diweddaraf i'r tudalennau hynny y mae cyswllt yn arwain atynt ar y dudalen a enwir (neu newidiadau i dudalennau sy'n aelodau o'r categori a enwir). Dangosir tudalennau sydd ar [[Special:Watchlist|eich rhestr wylio]] mewn print '''trwm'''.",
 'recentchangeslinked-page' => 'Tudalen:',
 'recentchangeslinked-to' => "Dangos newidiadau i'r tudalennau â chyswllt arnynt sy'n arwain at y dudalen a enwir",
@@ -1493,7 +1567,7 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'reuploaddesc' => "Dileu'r uwchlwytho a dychwelyd i'r ffurflen uwchlwytho",
 'upload-tryagain' => "Uwchlwyther disgrifiad newydd o'r ffeil",
 'uploadnologin' => 'Nid ydych wedi mewngofnodi',
-'uploadnologintext' => "Mae'n rhaid i chi [[Special:UserLogin|fewngofnodi]] er mwyn uwchlwytho ffeiliau.",
+'uploadnologintext' => "Mae'n rhaid $1 er mwyn uwchlwytho ffeiliau.",
 'upload_directory_missing' => "Mae'r cyfeiriadur uwchlwytho ($1) yn eisiau, ac ni allai'r gweinydd gwe ei greu.",
 'upload_directory_read_only' => "Ni all y gweinydd ysgrifennu i'r cyfeiriadur uwchlwytho ($1).",
 'uploaderror' => "Gwall tra'n uwchlwytho ffeil",
@@ -1709,7 +1783,6 @@ Er mwyn sicrhau'r diogelwch gorau posib, analluogwyd img_auth.php.",
 'http-read-error' => 'Cafwyd gwall wrth ddarllen yr HTTP.',
 'http-timed-out' => 'Goroedi wedi digwydd ar y cais HTTP.',
 'http-curl-error' => 'Cafwyd gwall wrth nôl yr URL: $1',
-'http-host-unreachable' => 'Wedi methu cyrraedd yr URL.',
 'http-bad-status' => 'Cafwyd trafferth yn ystod y cais HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1740,6 +1813,10 @@ Efallai yr hoffech rhoi cynnig arni ar adeg llai prysur.',
 'listfiles_size' => 'Maint',
 'listfiles_description' => 'Disgrifiad',
 'listfiles_count' => 'Fersiynau',
+'listfiles-show-all' => "Cynnwys hen fersiynau o'r delweddau",
+'listfiles-latestversion' => 'Y fersiwn diweddaraf',
+'listfiles-latestversion-yes' => 'Ie',
+'listfiles-latestversion-no' => 'Na',
 
 # File description page
 'file-anchor-link' => 'Ffeil',
@@ -1836,6 +1913,13 @@ Cofiwch chwilio am gysylltiadau eraill at nodyn a'u hystyried cyn ei ddileu.",
 'randompage' => 'Tudalen ar hap',
 'randompage-nopages' => 'Does dim tudalennau yn y {{PLURAL:$2|parth hwn|parth hwn|parthau hyn|parthau hyn|parthau hyn|parthau hyn}}: $1.',
 
+# Random page in category
+'randomincategory' => "Tudalen ar hap o blith tudalennau'r categori",
+'randomincategory-invalidcategory' => 'Nid yw "$1" yn enw dilys i gategori.',
+'randomincategory-nopages' => 'Nid oes unrhyw dudalennau yn y categori [[:Category:$1]].',
+'randomincategory-selectcategory' => "Nôl tudalen ar hap o'r categori: $1 $2.",
+'randomincategory-selectcategory-submit' => 'Gwneler',
+
 # Random redirect
 'randomredirect' => 'Tudalen ailgyfeirio ar hap',
 'randomredirect-nopages' => 'Does dim tudalennau ailgyfeirio yn y parth "$1".',
@@ -1861,16 +1945,13 @@ Cofiwch chwilio am gysylltiadau eraill at nodyn a'u hystyried cyn ei ddileu.",
 'statistics-users-active-desc' => 'Defnyddwyr sydd wedi gweithredu unwaith neu ragor yn ystod y {{PLURAL:$1||diwrnod|deuddydd|tridiau|$1 diwrnod|$1 diwrnod}} diwethaf',
 'statistics-mostpopular' => "Tudalennau sy'n derbyn ymweliad amlaf",
 
-'disambiguations' => "Tudalennau sy'n cysylltu â thudalennau gwahaniaethu",
-'disambiguationspage' => 'Template:Gwahaniaethu',
-'disambiguations-text' => "Mae'r tudalennau canlynol yn cynnwys un neu ragor o gysylltau, sydd yn arwain at '''dudalennau gwahaniaethu'''. Hwyrach y byddai'n hwylusach petai'r cyswllt yn arwain yn syth at y dudalen briodol.<br />
-Diffinir tudalen yn dudalen gwahaniaethu pan mae'n cynnwys un o'r nodiadau '[[MediaWiki:Disambiguationspage|tudalen gwahaniaethu]]'.",
-
 'pageswithprop' => 'Tudalennau a chanddynt nodwedd arbennig',
 'pageswithprop-legend' => 'Tudalennau a chanddynt nodwedd arbennig',
 'pageswithprop-text' => "Mae'r dudalen hon yn rhestru tudalennau sydd yn defnyddio nodwedd arbennig yn y dudalen.",
 'pageswithprop-prop' => "Enw'r nodwedd:",
 'pageswithprop-submit' => 'Gwneler',
+'pageswithprop-prophidden-long' => 'gwerth priodwedd ar destun hir, a guddiwyd ($1)',
+'pageswithprop-prophidden-binary' => 'gwerth y briodwedd ddeuol, a guddiwyd ($1)',
 
 'doubleredirects' => 'Ailgyfeiriadau dwbl',
 'doubleredirectstext' => "Mae pob rhes yn cynnwys cysylltiad i'r ddau ail-gyfeiriad cyntaf, ynghyd â chyrchfan yr ail ailgyfeiriad. Fel arfer bydd hyn yn rhoi'r gwir dudalen y dylai'r tudalennau cynt gyfeirio ati.
@@ -1927,6 +2008,7 @@ Gosodwyd <del>llinell</del> drwy'r eitemau sydd eisoes wedi eu datrys.",
 'mostrevisions' => 'Tudalennau yn nhrefn nifer y newidiadau iddynt',
 'prefixindex' => 'Pob tudalen yn ôl parth',
 'prefixindex-namespace' => 'Pob tudalen â rhagddodiad penodol (y parth $1)',
+'prefixindex-strip' => 'Diosg y rhagddodiad wrth restru',
 'shortpages' => 'Erthyglau byr',
 'longpages' => 'Tudalennau hirion',
 'deadendpages' => 'Tudalennau heb gysylltiadau ynddynt',
@@ -1942,6 +2024,7 @@ Gosodwyd <del>llinell</del> drwy'r eitemau sydd eisoes wedi eu datrys.",
 'listusers' => 'Rhestr defnyddwyr',
 'listusers-editsonly' => 'Dangos y defnyddwyr hynny sydd wedi golygu rhywbeth yn unig',
 'listusers-creationsort' => 'Trefnwch yn ôl dyddiad creu',
+'listusers-desc' => 'Trefnu gan ddisgyn',
 'usereditcount' => '$1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad|golygiad|o olygiadau}}',
 'usercreated' => '{{GENDER:$3|Crëwyd}} ar $1 am $2',
 'newpages' => 'Erthyglau newydd',
@@ -2120,10 +2203,9 @@ Pan fydd y dudalen hon, neu ei thudalen sgwrs, yn newid, fe fyddant yn ymddangos
 'unwatchthispage' => 'Stopio gwylio',
 'notanarticle' => 'Ddim yn erthygl/ffeil',
 'notvisiblerev' => 'Y diwygiad wedi cael ei ddileu',
-'watchnochange' => "Ni olygwyd dim o'r erthyglau yr ydych yn cadw golwg arnynt yn ystod y cyfnod uchod.",
 'watchlist-details' => '{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio, heb gynnwys tudalennau sgwrs.',
-'wlheader-enotif' => '*Galluogwyd hysbysiadau trwy e-bost.',
-'wlheader-showupdated' => "*Mae tudalennau sydd wedi newid ers i chi eu gweld ddiwethaf wedi'u '''hamlygu'''",
+'wlheader-enotif' => 'Galluogwyd hysbysiadau trwy e-bost.',
+'wlheader-showupdated' => "Mae tudalennau sydd wedi newid ers i chi eu gweld ddiwethaf wedi'u '''hamlygu'''.",
 'watchmethod-recent' => "yn chwilio'r diwygiadau diweddar am dudalennau ar y rhestr wylio",
 'watchmethod-list' => "yn chwilio'r tudalennau ar y rhestr wylio am ddiwygiadau diweddar",
 'watchlistcontains' => '{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio.',
@@ -2371,7 +2453,7 @@ $1',
 'contributions' => "{{GENDER:$1|Cyfraniadau'r defnyddiwr}}",
 'contributions-title' => "Cyfraniadau'r defnyddiwr am $1",
 'mycontris' => 'Cyfraniadau',
-'contribsub2' => 'Dros $1 ($2)',
+'contribsub2' => 'Gan {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "Heb ddod o hyd i newidiadau gyda'r meini prawf hyn.",
 'uctop' => '(cyfredol)',
 'month' => 'Cyfraniadau hyd at fis (ac yn gynharach):',
@@ -2529,14 +2611,12 @@ Gallwch weld rhestr y rhwystrau a'r gwaharddiadau sydd yn weithredol ar hyn o br
 'ipb_blocked_as_range' => "Gwall: Nid yw'r cyfeiriad IP $1 wedi'n rwystro'n uniongyrchol ac felly ni ellir ei ddadrwystro. Wedi dweud hynny, y mae'n rhan o'r amrediad $2 sydd wedi'i rwystro; gellir dadrwystro'r amrediad.",
 'ip_range_invalid' => 'Ystod IP annilys.',
 'ip_range_toolarge' => "Ni chaniateir rhwystrau ystod sy'n fwy na /$1.",
-'blockme' => 'Rhwystro fi',
 'proxyblocker' => 'Dirprwy-flociwr',
-'proxyblocker-disabled' => 'Analluogwyd y swyddogaeth hon.',
 'proxyblockreason' => "Mae eich cyfeiriad IP wedi'i rwystro gan ei fod yn ddirprwy agored. Cysylltwch â'ch Cyflenwr Gwasanaeth Rhyngrwyd neu gymorth technegol er mwyn eu hysbysu am y broblem ddiogelwch ddifrifol yma.",
-'proxyblocksuccess' => 'Gwnaethpwyd.',
 'sorbsreason' => 'Mae eich cyfeiriad IP wedi cael ei osod ymhlith y dirprwyon agored ar y Rhestr DNS Gwaharddedig a ddefnyddir gan {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Mae eich cyfeiriad IP wedi cael ei osod ymhlith y dirprwyon agored ar y Rhestr DNS Gwaharddedig a ddefnyddir gan {{SITENAME}}.
 Ni allwch greu cyfrif',
+'xffblockreason' => "Mae un o'r cyfeiriadau IP yn y pennyn 'X-Forwarded-For' wedi cael ei atal; naill ai eich cyfeiriad chi neu un o'r gweinyddion dirprwyol a ddefnyddiwyd gennych. Y rheswm gwreiddiol dros atal oedd: $1",
 'cant-block-while-blocked' => 'Ni allwch flocio defnyddwyr eraill tra bod rhwystr arnoch chithau.',
 'cant-see-hidden-user' => "Mae'r defnyddiwr yr ydych yn ceisio'i rwystro wedi ei rwystro a'i guddio'n barod.
 Gan nad yw'r gallu i guddio defnyddwyr gennych, ni allwch weld y rhwystr sydd ar y defnyddiwr na'i olygu.",
@@ -2701,6 +2781,8 @@ Os ydych am gyfrannu at y gwaith o gyfieithu ar gyfer holl prosiectau MediaWiki
 'thumbnail-more' => 'Chwyddo',
 'filemissing' => 'Ffeil yn eisiau',
 'thumbnail_error' => "Cafwyd gwall wrth greu'r mân-lun: $1",
+'thumbnail_error_remote' => 'Neges am y gwall o $1:
+$2',
 'djvu_page_error' => 'Y dudalen DjVu allan o amrediad',
 'djvu_no_xml' => 'Ddim yn gallu mofyn XML ar gyfer ffeil DjVu',
 'thumbnail-temp-create' => 'Wedi methu gwneud ffeil mân-lun dros dro',
@@ -2849,6 +2931,7 @@ Mae ffolder dros dro yn eisiau.',
 Gellir ychwanegu rheswm dros y dadwneud yn y crynodeb.',
 'tooltip-preferences-save' => 'Rhodder y dewisiadau ar gadw',
 'tooltip-summary' => 'Rhowch grynodeb byr',
+'tooltip-iwiki' => '$1 - $2',
 
 # Metadata
 'notacceptable' => "Dydy gweinydd y wici ddim yn medru rhoi'r data mewn fformat darllenadwy i'ch cleient.",
@@ -2922,8 +3005,6 @@ Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr wahardd
 'pageinfo-category-files' => 'Nifer y ffeiliau',
 
 # Skin names
-'skinname-standard' => 'Safonol',
-'skinname-nostalgia' => 'Hiraeth',
 'skinname-cologneblue' => 'Glas Cwlen',
 
 # Patrolling
@@ -3004,11 +3085,25 @@ Mae'n bosib y bydd eich cyfrifiadur yn cael ei danseilio wrth ddefnyddio'r ffeil
 'minutes' => '{{PLURAL:$1||$1 munud|$1 funud|$1 munud|$1 munud|$1 munud}}',
 'hours' => '{{PLURAL:$1|$1 awr}}',
 'days' => '{{PLURAL:$1||$1 diwrnod|$1 ddiwrnod|$1 diwrnod|$1 diwrnod|$1 diwrnod}}',
+'weeks' => '{{PLURAL:$1|$1 wythnos|$1 wythnosau}}',
 'months' => '{{PLURAL:$1|$1 mis|mis|deufis|$1 mis}}',
 'years' => '{{PLURAL:$1|$1 blwyddyn|blwyddyn|$1 flynedd|$1 blynedd|$1 blynedd|$1 mlynedd}}',
 'ago' => '$1 yn ôl',
 'just-now' => 'nawr',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|awr}} yn ôl',
+'minutes-ago' => '$1 {{PLURAL:$1|munud|munud|funud|munud}} yn ôl',
+'seconds-ago' => '$1 {{PLURAL:$1|eiliad}} yn ôl',
+'monday-at' => 'Dydd Llun am $1',
+'tuesday-at' => 'Dydd Mawrth am $1',
+'wednesday-at' => 'Dydd Mercher am $1',
+'thursday-at' => 'Dydd Iau am $1',
+'friday-at' => 'Dydd Gwener am $1',
+'saturday-at' => 'Dydd Sadwrn am $1',
+'sunday-at' => 'Dydd Sul am $1',
+'yesterday-at' => 'Ddoe am $1',
+
 # Bad image list
 'bad_image_list' => "Dyma'r fformat:
 
@@ -3037,7 +3132,7 @@ Cuddir y meysydd eraill trwy ragosodiad.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lled',
 'exif-imagelength' => 'Uchder',
 'exif-bitspersample' => 'Nifer y didau i bob cydran',
@@ -3215,7 +3310,7 @@ Cuddir y meysydd eraill trwy ragosodiad.
 'exif-originalimageheight' => 'Uchder y ddelwedd cyn iddi gael ei thocio',
 'exif-originalimagewidth' => 'Lled y ddelwedd cyn iddi gael ei thocio',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Heb ei gywasgu',
 'exif-compression-2' => 'Amgodio hyd rhediad Huffman Addasedig 1-Dimensiwn Grŵp 3 y CCITT',
 'exif-compression-3' => 'Amgodio ffacs Grŵp 3 CCITT',
@@ -3594,7 +3689,6 @@ Gallwch hefyd [[Special:EditWatchlist|ddefnyddio\'r rhestr arferol]].',
 'version-other' => 'Arall',
 'version-mediahandlers' => 'Trinyddion cyfryngau',
 'version-hooks' => 'Bachau',
-'version-extension-functions' => 'Ffwythiannau estyn',
 'version-parser-extensiontags' => 'Tagiau estyn dosrannydd',
 'version-parser-function-hooks' => 'Bachau ffwythiant dosrannu',
 'version-hook-name' => "Enw'r bachyn",
@@ -3603,6 +3697,7 @@ Gallwch hefyd [[Special:EditWatchlist|ddefnyddio\'r rhestr arferol]].',
 'version-license' => 'Trwydded',
 'version-poweredby-credits' => "Mae'r wici hwn wedi'i nerthu gan '''[//www.mediawiki.org/ MediaWiki]''', hawlfraint © 2001 - $1 $2.",
 'version-poweredby-others' => 'eraill',
+'version-poweredby-translators' => 'cyfieithwyr translatewiki.net',
 'version-credits-summary' => 'Hoffem gydnabod cyfraniad y bobl canlynol i [[Special:Version|MediaWiki]].',
 'version-license-info' => "Meddalwedd rhydd yw MediaWiki; gallwch ei ddefnyddio a'i addasu yn ôl termau'r GNU General Public License a gyhoeddir gan Free Software Foundation; naill ai fersiwn 2 o'r Drwydded, neu unrhyw fersiwn diweddarach o'ch dewis.
 
@@ -3616,12 +3711,17 @@ Dylech fod wedi derbyn [{{SERVER}}{{SCRIPTPATH}}/COPYING gopi o GNU General Publ
 'version-entrypoints-header-entrypoint' => 'Man cyflwyno',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Llwybr y ffeil',
-'filepath-page' => 'Ffeil:',
-'filepath-submit' => 'Eler',
-'filepath-summary' => "Mae'r dudalen arbennig hon yn adrodd llwybr ffeil yn gyfan.
-Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn uniongyrchol gan y rhaglen gysylltiedig.",
+# Special:Redirect
+'redirect' => 'Ailgyfeirio yn ôl enw ffeil, ID defnyddiwr neu ID diwygiad tudalen',
+'redirect-legend' => 'Ailgyfeirio i ffeil neu dudalen',
+'redirect-summary' => "Mae'r dudalen arbennig hon yn arwain at ffeil (o roi enw'r ffeil), at dudalen (o roi ID rhyw ddidwygiad o'r dudalen), neu at dudalen defnyddiwr (o roi rhif y defnyddiwr).",
+'redirect-submit' => 'Ati',
+'redirect-lookup' => 'Chwilio drwy:',
+'redirect-value' => 'Chwilio am:',
+'redirect-user' => 'ID defnyddwyr',
+'redirect-revision' => 'Rhifau diwygiadau tudalennau',
+'redirect-file' => 'Enwau ffeiliau',
+'redirect-not-exists' => "Heb lwyddo i'w ganfod",
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Chwilio am ffeiliau dyblyg',
@@ -3671,12 +3771,16 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'tags' => 'Tagiau newidiadau',
 'tag-filter' => 'Hidl [[Special:Tags|tagiau]]:',
 'tag-filter-submit' => 'Hidlo',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tag|Tagiau}}]]: $2)',
 'tags-title' => 'Tagiau',
 'tags-intro' => "Dyma restr o'r tagiau y mae'r meddalwedd yn defnyddio i farcio golygiad, ynghyd â'r rhesymau dros eu defnyddio.",
 'tags-tag' => "Enw'r tag",
 'tags-display-header' => 'Y nodyn a welir ar logiau',
 'tags-description-header' => 'Disgrifiad llawn y tag',
+'tags-active-header' => 'Yn weithredol?',
 'tags-hitcount-header' => 'Nifer wedi tagio',
+'tags-active-yes' => 'Ydy',
+'tags-active-no' => 'Nacydy',
 'tags-edit' => 'golygu',
 'tags-hitcount' => '$1 {{PLURAL:$1|newid}}',
 
@@ -3697,6 +3801,7 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'dberr-problems' => "Mae'n ddrwg gennym! Mae'r wefan hon yn dioddef anawsterau technegol.",
 'dberr-again' => 'Oedwch am ychydig funudau cyn ceisio ail-lwytho.',
 'dberr-info' => '(Ni ellir cysylltu â gweinydd y bas data: $1)',
+'dberr-info-hidden' => '(Ni ellir cysylltu â gweinydd y gronfa ddata)',
 'dberr-usegoogle' => 'Yn y cyfamser gallwch geisio chwilio gyda Google.',
 'dberr-outofdate' => "Sylwch y gall eu mynegeion o'n cynnwys fod ar ei hôl hi.",
 'dberr-cachederror' => "Dyma gopi o'r dudalen a ofynnwyd amdani, a dynnwyd o'r celc. Mae'n bosib nad y fersiwn diweddaraf yw'r copi hwn.",
@@ -3712,6 +3817,9 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'htmlform-submit' => 'Gosoder',
 'htmlform-reset' => 'Datod y newidiadau',
 'htmlform-selectorother-other' => 'Arall',
+'htmlform-no' => 'Na/Nac ydw/Na fydd...',
+'htmlform-yes' => 'Ie/Iawn/Ydw/Oes...',
+'htmlform-chosen-placeholder' => 'Dewiswch opsiwn',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 gyda chymorth chwilio yr holl destun',
@@ -3828,4 +3936,19 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 # Image rotation
 'rotate-comment' => "Trowyd y llun $1 {{PLURAL:$1|gradd|radd|radd|gradd}} gyda'r cloc",
 
+# Limit report
+'limitreport-title' => 'Data proffil y dosrannwr:',
+'limitreport-cputime' => 'Defnydd amser CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|eiliad}}',
+'limitreport-walltime' => 'Defnydd amser real',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|eiliad}}',
+'limitreport-ppvisitednodes' => "Rhif y nodau ar ymweliadau'r rhagbrosesydd",
+'limitreport-ppgeneratednodes' => 'Rhif y nodau a gynhyrchodd y rhagbrosesydd',
+'limitreport-postexpandincludesize' => 'Uchafswm maint y nodiadau ar ôl eu chwyddo',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|beit|beit|feit|beit}}',
+'limitreport-templateargumentsize' => 'Maint arg y nodyn',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|beit|beit|feit|beit}}',
+'limitreport-expansiondepth' => 'Uchafswm dyfnder yr ehangu',
+'limitreport-expensivefunctioncount' => "Nifer y ffwythiannau dosrannu sy'n dreth ar adnoddau",
+
 );
diff --git a/languages/messages/MessagesDa.php b/languages/messages/MessagesDa.php
index 3dec03f9..d0900898 100644
--- a/languages/messages/MessagesDa.php
+++ b/languages/messages/MessagesDa.php
@@ -42,6 +42,7 @@
  * @author Qaqqalik
  * @author Remember the dot
  * @author Sarrus
+ * @author Simeondahl
  * @author Sir48
  * @author Slomox
  * @author Steenth
@@ -222,9 +223,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Vis antal brugere, der overvåger',
 'tog-oldsig' => 'Nuværende signatur:',
 'tog-fancysig' => 'Behandl signatur som wikitekst uden automatisk henvisning',
-'tog-externaleditor' => 'Brug ekstern editor automatisk (kun for rutinerede brugere, da det kræver særlige indstillinger på din computer. [//www.mediawiki.org/wiki/Manual:External_editors Flere oplysninger.])',
-'tog-externaldiff' => 'Brug ekstern forskelsvisning automatisk (kun for rutinerede brugere, da det kræver særlige indstillinger på din computer. [//www.mediawiki.org/wiki/Manual:External_editors Flere oplysninger.])',
-'tog-showjumplinks' => 'Vis tilgængeligheds-henvisninger',
 'tog-uselivepreview' => 'Brug automatisk forhåndsvisning (er på forsøgsstadiet)',
 'tog-forceeditsummary' => 'Advar mig hvis jeg ikke udfylder beskrivelsesfeltet',
 'tog-watchlisthideown' => 'Skjul egne ændringer i overvågningslisten',
@@ -238,6 +236,8 @@ $messages = array(
 'tog-showhiddencats' => 'Vis skjulte kategorier',
 'tog-noconvertlink' => 'Slå konvertering af sidetitler fra',
 'tog-norollbackdiff' => 'Vis ikke forskel efter tilbagerulning',
+'tog-useeditwarning' => 'Advar mig, hvis jeg forlader en redigeringsside med ændringer, der ikke er gemt.',
+'tog-prefershttps' => 'Brug altid en sikker forbindelse, når du er logget ind',
 
 'underline-always' => 'Altid',
 'underline-never' => 'Aldrig',
@@ -301,6 +301,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. marts',
+'april-date' => '$1. april',
+'may-date' => '$1. maj',
+'june-date' => '$1. juni',
+'july-date' => '$1. juli',
+'august-date' => '$1. august',
+'september-date' => '$1. september',
+'october-date' => '$1. oktober',
+'november-date' => '$1. november',
+'december-date' => '$1. december',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategorier}}',
@@ -382,6 +394,7 @@ $messages = array(
 'create-this-page' => 'Opret denne side',
 'delete' => 'Slet',
 'deletethispage' => 'Slet side',
+'undeletethispage' => 'Gendan denne side',
 'undelete_short' => 'Fortryd sletning af {{PLURAL:$1|én version|$1 versioner}}',
 'viewdeleted_short' => 'Vis {{PLURAL:$1|en slettet redigering|$1 slettede redigeringer}}',
 'protect' => 'Beskyt',
@@ -425,7 +438,7 @@ $1',
 'pool-queuefull' => 'Pool køen er fuld',
 'pool-errorunknown' => 'Ukendt fejl',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Om {{SITENAME}}',
 'aboutpage' => 'Project:Om',
 'copyright' => 'Indholdet er udgivet under $1 medmindre andet er angivet.',
@@ -435,7 +448,6 @@ $1',
 'disclaimers' => 'Forbehold',
 'disclaimerpage' => 'Project:Generelle forbehold',
 'edithelp' => 'Hjælp til redigering',
-'edithelppage' => 'Help:Hvordan redigerer jeg en side',
 'helppage' => 'Help:Hjælp',
 'mainpage' => 'Forside',
 'mainpage-description' => 'Forside',
@@ -511,17 +523,12 @@ En liste over gyldige specialsider findes på [[Special:SpecialPages|{{int:speci
 # General errors
 'error' => 'Fejl',
 'databaseerror' => 'Databasefejl',
-'dberrortext' => 'Der er opstået en syntaksfejl i en databaseforespørgsel.
-Det kan tyde på en fejl i softwaren.
-Den sidst forsøgte databaseforespørgsel var:
-<blockquote><code>$1</code></blockquote>
-fra funktionen "<code>$2</code>".
-Databasen returnerede fejlen "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Der er opstået en syntaksfejl i en databaseforespørgsel.
-Den seneste forsøgte databaseforespørgsel var:
-"$1"
-fra funktionen "$2".
-Databasen returnerede fejlen "$3: $4"',
+'databaseerror-text' => 'Der opstod fejl i en forespørgsel til databasen.
+Dette kan indikere en fejl i softwaren.',
+'databaseerror-textcl' => 'Der opstod fejl i en forespørgsel til databasen.',
+'databaseerror-query' => 'Forespørgsel: $1',
+'databaseerror-function' => 'Funktion: $1',
+'databaseerror-error' => 'Fejl: $1',
 'laggedslavemode' => "'''Bemærk:''' Den viste side indeholder muligvis ikke de nyeste ændringer.",
 'readonly' => 'Databasen er skrivebeskyttet',
 'enterlockreason' => 'Skriv en begrundelse for skrivebeskyttelsen, med samt en vurdering af, hvornår skrivebeskyttelsen ophæves igen',
@@ -555,6 +562,7 @@ Den kan være blevet slettet af en anden.',
 'cannotdelete-title' => 'Kan ikke slette siden "$1"',
 'delete-hook-aborted' => 'Sletningen blev afbrudt af en programfunktion.
 Der var ikke nogen forklaring.',
+'no-null-revision' => 'Kunne ikke oprette nye tom revision for side "$1"',
 'badtitle' => 'Forkert titel',
 'badtitletext' => 'Den ønskede sides titel var ikke tilladt, tom eller siden er forkert henvist fra en {{SITENAME}} på et andet sprog.
 Den kan indeholde et eller flere tegn, som ikke kan anvendes i titler.',
@@ -575,12 +583,15 @@ Forespørgsel: $2',
 Hvis du vil tilføje eller ændre oversættelser til alle wiki-websteder, brug venligst [//translatewiki.net/ translatewiki.net], MediaWiki lokalisering projektet.',
 'editinginterface' => "'''Advarsel:''' Du redigerer en side som bruges i programmets grænseflade. Ændringer på denne side vil påvirke udseendet af grænsefladen for andre brugere af denne wiki.
 For at tilføje eller ændre oversættelser på alle wikier bedes du benytte [//translatewiki.net/ translatewiki.net], projektet for oversættelse af MediaWiki.",
-'sqlhidden' => '(SQL forespørgsel skjult)',
 'cascadeprotected' => 'Denne side er skrivebeskyttet, da den er indeholdt i nedenstående {{PLURAL:$1|side|sider}}, som er skrivebeskyttet med tilvalg af "nedarvende sidebeskyttelse":
 $2',
 'namespaceprotected' => 'Du har ikke rettigheder til at redigere sider i $1-navnerummet.',
 'customcssprotected' => 'Du har ikke tilladelse til at redigere denne CSS-side, da den indeholder en anden brugers personlige indstillinger.',
 'customjsprotected' => 'Du har ikke tilladelse til at redigere denne JavaScript-side, da den indeholder en anden brugers personlige indstillinger.',
+'mycustomcssprotected' => 'Du har ikke rettigheder til at redigere denne CSS-side.',
+'mycustomjsprotected' => 'Du har ikke rettigheder til at redigere denne JavaScript-side.',
+'myprivateinfoprotected' => 'Du har ikke tilladelse til at redigere dine private oplysninger.',
+'mypreferencesprotected' => 'Du har ikke tilladelse til at redigere dine præferencer.',
 'ns-specialprotected' => 'Sider i navnerummet {{ns:special}} kan ikke redigeres.',
 'titleprotected' => "Dette sidenavn er beskyttet mod oprettelse af [[User:$1|$1]]. Begrundelsen for beskyttelsen er ''$2''.",
 'filereadonlyerror' => 'Ude af stand til at redigere filen "$1", fordi fildatabasen "$2" er skrivebeskyttet.
@@ -604,10 +615,19 @@ Bemærk, at nogle sider stadigvæk kan vises som om du var logget på, indtil du
 'welcomecreation-msg' => 'Din konto er blevet oprettet.
 Glem ikke at ændre dine [[Special:Preferences|{{SITENAME}} indstillinger]].',
 'yourname' => 'Dit brugernavn:',
+'userlogin-yourname' => 'Brugernavn',
+'userlogin-yourname-ph' => 'Indtast dit brugernavn',
+'createacct-another-username-ph' => 'Indtast Brugernavn',
 'yourpassword' => 'Din adgangskode:',
+'userlogin-yourpassword' => 'Adgangskode',
+'userlogin-yourpassword-ph' => 'Indtast din adgangskode',
+'createacct-yourpassword-ph' => 'Indtast kodeord',
 'yourpasswordagain' => 'Gentag adgangskode',
+'createacct-yourpasswordagain' => 'Bekræft kodeord',
+'createacct-yourpasswordagain-ph' => 'Indtast kodeord igen',
 'remembermypassword' => 'Husk mit brugernavn i denne browser (højst $1 {{PLURAL:$1|dag|dage}})',
-'securelogin-stick-https' => 'Behold forbindelsen til HTTPS efter login',
+'userlogin-remembermypassword' => 'Husk mig',
+'userlogin-signwithsecure' => 'Brug sikker forbindelse',
 'yourdomainname' => 'Dit domænenavn:',
 'password-change-forbidden' => 'Du kan ikke ændre adgangskoder på denne wiki.',
 'externaldberror' => 'Der er opstået en fejl i en ekstern adgangsdatabase, eller du har ikke rettigheder til at opdatere denne.',
@@ -619,18 +639,44 @@ Glem ikke at ændre dine [[Special:Preferences|{{SITENAME}} indstillinger]].',
 'logout' => 'Log af',
 'userlogout' => 'Log af',
 'notloggedin' => 'Ikke logget på',
+'userlogin-noaccount' => 'Har du ikke en konto?',
+'userlogin-joinproject' => 'Slut dig til {{SITENAME}}',
 'nologin' => 'Har du ingen konto? $1.',
 'nologinlink' => 'Opret en ny brugerkonto',
 'createaccount' => 'Opret en ny brugerkonto',
 'gotaccount' => 'Har du allerede en konto? $1.',
 'gotaccountlink' => 'Log på',
 'userlogin-resetlink' => 'Har du glemt dine login oplysninger?',
+'userlogin-resetpassword-link' => 'Nulstil din adgangskode',
+'helplogin-url' => 'Help:Logge på',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjælp til at logge på]]',
+'userlogin-loggedin' => 'Du er allerede logget på som {{GENDER:$1|$1}}.
+Brug formularen nedenfor til at logge på som en anden bruger.',
+'userlogin-createanother' => 'Opret en anden konto',
+'createacct-join' => 'Indtast dine oplysninger nedenfor.',
+'createacct-another-join' => 'Angiv den nye kontos oplysninger nedenfor.',
+'createacct-emailrequired' => 'Mailadresse',
+'createacct-emailoptional' => 'Mailadresse (valgfri)',
+'createacct-email-ph' => 'Indtast din mailadresse',
+'createacct-another-email-ph' => 'Indtast e-mailadresse',
 'createaccountmail' => 'Brug en midlertidig tilfældig adgangskode og send den til den angivne e-mailadresse',
+'createacct-realname' => 'Dit rigtige navn',
 'createaccountreason' => 'Begrundelse:',
+'createacct-reason' => 'Årsag',
+'createacct-reason-ph' => 'Hvorfor vil du oprette endnu en konto',
+'createacct-captcha' => 'Sikkerhedskontrol',
+'createacct-imgcaptcha-ph' => 'Indtast venligst ovenstående tekst',
+'createacct-submit' => 'Opret din konto',
+'createacct-another-submit' => 'Oprette en anden konto',
+'createacct-benefit-heading' => '{{SITENAME}} laves af mennesker som dig.',
+'createacct-benefit-body1' => '{{PLURAL:$1|redigering|redigeringer}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|side|sider}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nylig bidragyder|nylige bidragydere}}',
 'badretype' => 'De indtastede adgangskoder er ikke ens.',
 'userexists' => 'Det brugernavn, du har valgt, er allerede i brug.
 Vælg venligst et andet brugernavn.',
 'loginerror' => 'Logon mislykket',
+'createacct-error' => 'Fejl ved kontooprettelse',
 'createaccounterror' => 'Kunne ikke oprette brugerkonto: $1',
 'nocookiesnew' => 'Din brugerkonto er nu oprettet, men du er ikke logget på. {{SITENAME}} bruger cookies til at logge brugere på. Du har slået cookies fra. Vær venlig at slå cookies til, og derefter kan du logge på med dit nye brugernavn og kodeord.',
 'nocookieslogin' => '{{SITENAME}} bruger cookies til at logge brugere på. Du har slået cookies fra. Slå dem venligst til og prøv igen.',
@@ -662,8 +708,7 @@ Hvis en anden har bestilt den nye adgangskode, eller hvis du er kommet i tanke o
 kan du bare ignorere denne e-mail og fortsætte med at bruge din gamle adgangskode.',
 'noemail' => 'Der er ikke oplyst en e-mailadresse for bruger "$1".',
 'noemailcreate' => 'Du skal angive en gyldig e-mailadresse',
-'passwordsent' => 'En ny adgangskode er sendt til e-mail-adressen,
-som er registreret for "$1".
+'passwordsent' => 'En ny adgangskode er sendt til e-mailadressen, som er registreret for "$1".
 Du bør logge på og ændre din adgangskode straks efter du har modtaget e-mailen.',
 'blocked-mailpassword' => 'Din IP-adresse er spærret for ændring af sider. For at forhindre misbrug, er det heller ikke muligt, at bestille et nyt password.',
 'eauthentsent' => 'En bekræftelsesmail er sendt til den angivne e-mailadresse.
@@ -673,12 +718,12 @@ Før en e-mail kan modtages af andre brugere af {{SITENAME}}-mailfunktionen, ska
 'mailerror' => 'Fejl ved afsendelse af e-mail: $1',
 'acct_creation_throttle_hit' => 'Besøgende med samme IP-adresse som dig har oprettet {{PLURAL:$1|en konto|$1 kontoer}} det sidste døgn, og det er ikke tilladt at oprette flere.
 Derfor kan besøgende ikke oprette flere kontoer fra denne IP-adresse i øjeblikket.',
-'emailauthenticated' => 'Din e-mail-adresse blev bekræftet $2 $3.',
+'emailauthenticated' => 'Din e-mailadresse blev bekræftet $2 $3.',
 'emailnotauthenticated' => 'Din e-mail-adresse er endnu ikke bekræftet og de avancerede e-mail-funktioner er slået fra indtil bekræftelse har fundet sted (d.u.a.). Log ind med den midlertidige adgangskode, der er blevet sendt til dig, for at bekræfte, eller bestil et nyt på loginsiden.',
 'noemailprefs' => 'Angiv en e-mailadresse, så følgende funktioner er til rådighed.',
-'emailconfirmlink' => 'Bekræft e-mail-adressen (autentificering).',
+'emailconfirmlink' => 'Bekræft din e-mailadresse',
 'invalidemailaddress' => 'E-mailadressen kan ikke accepteres da den tilsyneladende har et ugyldigt format. Skriv venligst en e-mailadresse med et korrekt format eller tøm feltet.',
-'cannotchangeemail' => 'De email-adresser, der er tilknyttet brugerkontoer, kan ikke ændres på denne wiki.',
+'cannotchangeemail' => 'De e-mailadresser, der er tilknyttet brugerkontoer, kan ikke ændres på denne wiki.',
 'emaildisabled' => 'Denne hjemmeside kan ikke sende emails.',
 'accountcreated' => 'Brugerkonto oprettet',
 'accountcreatedtext' => 'Brugerkontoen for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskussion]]) er oprettet.',
@@ -689,10 +734,12 @@ Du opfordres til at logge ind og ændre adgangskoden med det samme.
 Du kan ignorere denne besked hvis kontoen blev oprettet ved en fejl.',
 'usernamehasherror' => 'Brugernavn må ikke indeholde #',
 'login-throttled' => 'Du har forsøgt at logge på for mange gange.
-Vent venligst før du prøver igen.',
+Vent venligst $1, før du prøver igen.',
 'login-abort-generic' => 'Det lykkedes dig ikke at logge på - afbrudt',
 'loginlanguagelabel' => 'Sprog: $1',
 'suspicious-userlogout' => 'Din anmodning om at logge ud blev nægtet, fordi det ser ud som den blev sendt af en ødelagt browser eller caching proxy.',
+'createacct-another-realname-tip' => 'Angivelse af rigtigt navn er valgfrit.
+Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit arbejde.',
 
 # Email sending
 'php-mail-error-unknown' => "Ukendt fejl i PHP's mail()-funtion",
@@ -708,8 +755,7 @@ Vent venligst før du prøver igen.',
 'newpassword' => 'Ny adgangskode:',
 'retypenew' => 'Gentag ny adgangskode:',
 'resetpass_submit' => 'Gem adgangskode og log på',
-'resetpass_success' => 'Din adgangskode er blevet ændret med succes!
-Logger dig på nu...',
+'changepassword-success' => 'Din adgangskode er nu ændret!',
 'resetpass_forbidden' => 'Adgangskoder kan ikke ændres',
 'resetpass-no-info' => 'Du skal være logget på for at komme direkte til denne side.',
 'resetpass-submit-loggedin' => 'Skift adgangskode',
@@ -721,33 +767,34 @@ Du har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlerti
 
 # Special:PasswordReset
 'passwordreset' => 'Nulstil adgangskode',
-'passwordreset-text' => 'Udfyld denne formular for at nulstille din adgangskode.',
+'passwordreset-text-one' => 'Udfyld denne formular for at nulstille din adgangskode.',
+'passwordreset-text-many' => '{{PLURAL:$1|Udfyld en af felterne nedenfor for at nulstille din adgangskode.}}',
 'passwordreset-legend' => 'Nulstil adgangskode',
 'passwordreset-disabled' => 'Nulstilling af kodeord er slået fra på denne wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Indtast en af de nedenstående oplysninger}}',
+'passwordreset-emaildisabled' => 'E-mailfunktioner er slået fra på denne wiki.',
 'passwordreset-username' => 'Brugernavn:',
 'passwordreset-domain' => 'Domæne:',
 'passwordreset-capture' => 'Se den resulterende e-mail?',
 'passwordreset-capture-help' => 'Hvis du krydser dette felt af, vil emailen (med den midlertidige adgangskode) blive vist til dig i tillæg til at blive sendt til brugeren.',
 'passwordreset-email' => 'E-mailadresse:',
 'passwordreset-emailtitle' => 'Kontooplysninger på {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mail-adresse:
+'passwordreset-emailtext-ip' => 'Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:
 
 $2
 
 {{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.
-Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har gjort denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.',
-'passwordreset-emailtext-user' => 'Brugeren $1 på {{SITENAME}} har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mail-adresse:
+Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.',
+'passwordreset-emailtext-user' => 'Brugeren $1 på {{SITENAME}} har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:
 
 $2
 
 {{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.
-Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har gjort denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.',
+Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.',
 'passwordreset-emailelement' => 'Brugernavn: $1
 Midlertidig adgangskode: $2',
 'passwordreset-emailsent' => 'En e-mail om nulstilling af adgangskode er blevet sendt.',
 'passwordreset-emailsent-capture' => 'En e-mail om nulstilling af adgangskode, som vist nedenfor, er blevet sendt.',
-'passwordreset-emailerror-capture' => 'En påmindelsesemail, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til brugeren: $1',
+'passwordreset-emailerror-capture' => 'En mail om nulstilling af adgangskode, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til {{GENDER:$2|bruger}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ændre e-mailadresse',
@@ -758,9 +805,22 @@ Midlertidig adgangskode: $2',
 'changeemail-newemail' => 'Ny e-mailadresse:',
 'changeemail-none' => '(ingen)',
 'changeemail-password' => 'Din adgangskode til {{SITENAME}}:',
-'changeemail-submit' => 'Ændre email',
+'changeemail-submit' => 'Ændre e-mail',
 'changeemail-cancel' => 'Afbryd',
 
+# Special:ResetTokens
+'resettokens' => 'Nulstil nøgler',
+'resettokens-text' => 'Du kan nulstille nøgler, som giver adgang til visse private data i forbindelse med din konto her.
+
+Du bør gøre det, hvis du ved et uheld deler dem med nogen, eller hvis din konto er blevet kompromitteret.',
+'resettokens-no-tokens' => 'Der er ingen nøgler at nulstille.',
+'resettokens-legend' => 'Nulstil nøgler',
+'resettokens-tokens' => 'Nøgler:',
+'resettokens-token-label' => '$1(aktuel værdi: $2)',
+'resettokens-watchlist-token' => 'Nøgle for web-feed (Atom/RSS) af [[Special:Watchlist|ændringer af sider på din overvågningsliste]]',
+'resettokens-done' => 'Nøgler er nulstillet.',
+'resettokens-resetbutton' => 'Nulstil valgte nøgler',
+
 # Edit page toolbar
 'bold_sample' => 'Fed tekst',
 'bold_tip' => 'Fed tekst',
@@ -957,11 +1017,14 @@ Sletnings- og flytteloggerne for siden er vist nedenfor.',
 Den ser du til at være slettet.',
 'edit-conflict' => 'Redigeringskonflikt.',
 'edit-no-change' => 'Din ændring ignoreredes, fordi der ikke var ændring af teksten.',
+'postedit-confirmation' => 'Din redigering er gemt.',
 'edit-already-exists' => 'En ny side kunne ikke oprettes, fordi den allerede findes.',
 'defaultmessagetext' => 'Standardtekst',
 'content-failed-to-parse' => 'Kunne ikke fortolke $2-indholdet af $1-modellen: $3',
 'invalid-content-data' => 'Ugyldig indholdsdata',
 'content-not-allowed-here' => '"$1" indhold er ikke tilladt på siden [[$2]]',
+'editwarning-warning' => 'Hvis du forlader siden nu, risikerer du at miste alle ændringer, som du har lavet.
+Denne advarsel kan slås fra under "Redigering" i dine indstillinger.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -995,6 +1058,7 @@ Kontroller venligst sammenligningen herunder for at bekræfte at det er hvad du
 'undo-failure' => 'Redigeringen kunne ikke fjernes på grund af konflikter med efterfølgende redigeringer.',
 'undo-norev' => 'Redigeringen kunne ikke fjernes fordi den ikke findes eller er blevet slettet.',
 'undo-summary' => 'Fjerner version $1 af [[Special:Contributions/$2|$2]] ([[User talk:$2|diskussion]])',
+'undo-summary-username-hidden' => 'Fortryde revision $1 af en skjult bruger',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Brugerkontoen kan ikke oprettes.',
@@ -1171,6 +1235,7 @@ Vær opmæksom på at bevare kontinuiteten i sidehistorikken.
 'compareselectedversions' => 'Sammenlign valgte versioner',
 'showhideselectedversions' => 'Vis/skjul udvalgte versioner',
 'editundo' => 'fjern redigering',
+'diff-empty' => '(Ingen forskel)',
 'diff-multi' => '({{PLURAL:$1|En mellemliggende version|$1 mellemliggende versioner}} af {{PLURAL:$2|en bruger|$2 brugere}} ikke vist)',
 'diff-multi-manyusers' => '({{PLURAL:$1|En mellemliggende version|$1 mellemliggende versioner}} af mere end $2 {{PLURAL:$2|bruger|brugere}} ikke vist)',
 'difference-missing-revision' => '{{PLURAL:$2|En revision|$2 revisioner}} af denne forskel ($1) {{PLURAL:$2|blev|blev}} ikke fundet.
@@ -1198,7 +1263,6 @@ Detaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchmenu-legend' => 'Søgemuligheder',
 'searchmenu-exists' => "'''Der er en side med navnet \"[[:\$1]]\" på denne wiki'''",
 'searchmenu-new' => "'''Opret siden \"[[:\$1]]\" i denne wiki'''",
-'searchhelp-url' => 'Help:Hjælp',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Vis alle sider som begynder med dette præfiks]]',
 'searchprofile-articles' => 'Indholdssider',
 'searchprofile-project' => 'Hjælpe- og projektsider',
@@ -1240,15 +1304,7 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d
 'powersearch-togglenone' => 'Ingen',
 'search-external' => 'Brug anden søgemaskine',
 'searchdisabled' => '<p>Beklager! Fuldtekstsøgningen er midlertidigt afbrudt på grund af for stor belastning på serverne. I mellemtidem kan du anvende Google- eller Yahoo!-søgefelterne herunder. Bemærk at deres kopier af {{SITENAME}}s indhold kan være forældet.</p>',
-
-# Quickbar
-'qbsettings' => 'Hurtigmenu',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Fast venstre',
-'qbsettings-fixedright' => 'Fast højre',
-'qbsettings-floatingleft' => 'Flydende venstre',
-'qbsettings-floatingright' => 'Flydende højre',
-'qbsettings-directionality' => 'Fast, afhængigt af dit sprogs skriveretning',
+'search-error' => 'Der opstod en fejl under søgning: $1',
 
 # Preferences page
 'preferences' => 'Indstillinger',
@@ -1282,7 +1338,6 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d
 'resetprefs' => 'Gendan indstillinger',
 'restoreprefs' => 'Gendan alle standardindstillinger (i alle sektioner)',
 'prefs-editing' => 'Redigering',
-'prefs-edit-boxsize' => 'Størrelse på redigeringsvinduet.',
 'rows' => 'Rækker',
 'columns' => 'Kolonner',
 'searchresultshead' => 'Søgeresultater',
@@ -1293,9 +1348,9 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d
 'recentchangesdays-max' => '(maks. $1 {{PLURAL:$1|dag|dage}})',
 'recentchangescount' => 'Antal redigeringer som skal vises som standard:',
 'prefs-help-recentchangescount' => 'Det gælder for seneste ændringer, historikker og logger.',
-'prefs-help-watchlist-token' => 'Hvis du udfylder dette felt med en hemmelig værdi, vil der laves et RSS-feed for din overvågningsliste.
-Alle som kender nøglen i feltet vil være i stand til at læse din overvågningsliste, så vælg en sikker værdi.
-Her er en tilfældig genereret værdi som du kan bruge: $1',
+'prefs-help-watchlist-token2' => 'Dette er den hemmelige nøgle til web-feed af din overvågningsliste.
+Hvis andre kender den, man vil være i stand til at læse din overvågningsliste, så del den ikke.
+[[Special:ResetTokens|Klik her hvis du har brug at nulstille den]].',
 'savedprefs' => 'Dine indstillinger er blevet gemt.',
 'timezonelegend' => 'Tidszone:',
 'localtime' => 'Lokaltid:',
@@ -1326,7 +1381,6 @@ Her er en tilfældig genereret værdi som du kan bruge: $1',
 'prefs-reset-intro' => 'Du kan bruge denne side til at tilbagestille alle dine indstillinger til standardindstillingerne.
 Det kan ikke gøres om.',
 'prefs-emailconfirm-label' => 'Bekræftelse af e-mail:',
-'prefs-textboxsize' => 'Størrelse på redigeringsvindue',
 'youremail' => 'Din e-mailadresse:',
 'username' => '{{GENDER:$1|Brugernavn}}:',
 'uid' => '{{GENDER:$1|Brugernummer}}:',
@@ -1352,13 +1406,15 @@ Informationen vil være offentlig.',
 Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit arbejde.',
 'prefs-help-email' => 'Angivelse af e-mailadresse er valgfrit, men den gør det muligt at sende dig en ny adgangskode hvis du glemmer den.',
 'prefs-help-email-others' => 'Du kan også vælge at lade andre kontakte dig gennem din bruger eller diskussions side uden at behøve at afsløre din identitet.',
-'prefs-help-email-required' => 'E-mail-adresse er krævet.',
+'prefs-help-email-required' => 'E-mailadresse er krævet.',
 'prefs-info' => 'Grundlæggende information',
 'prefs-i18n' => 'Internationalisering:',
 'prefs-signature' => 'Signatur',
 'prefs-dateformat' => 'Formatering af datoer',
 'prefs-timeoffset' => 'Tidsforskel',
 'prefs-advancedediting' => 'Generelle indstillinger',
+'prefs-editor' => 'Redaktør',
+'prefs-preview' => 'Forhåndsvisning',
 'prefs-advancedrc' => 'Avancerede indstillinger',
 'prefs-advancedrendering' => 'Avancerede indstillinger',
 'prefs-advancedsearchoptions' => 'Avancerede indstillinger',
@@ -1366,7 +1422,9 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'prefs-displayrc' => 'Indstillinger for visning',
 'prefs-displaysearchoptions' => 'Visningsmuligheder',
 'prefs-displaywatchlist' => 'Visningsmuligheder',
+'prefs-tokenwatchlist' => 'Mærke',
 'prefs-diffs' => 'Forskelle',
+'prefs-help-prefershttps' => 'Denne indstilling træder i kraft næste gang du logger på.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mailadressen ser ud til at være gyldig',
@@ -1393,6 +1451,9 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'userrights-notallowed' => 'Du har ikke tilladelse til at tilføje eller fjerne brugerrettigheder.',
 'userrights-changeable-col' => 'Redigerbare grupper',
 'userrights-unchangeable-col' => 'Uredigerbare grupper',
+'userrights-conflict' => 'Konflikt i ændringer af brugerrettigheder!
+Vær venlig at gennemse og bekræft dine ændringer.',
+'userrights-removed-self' => 'Du har fjernet dine egne rettigheder. Du har derfor ikke længere adgang til denne side.',
 
 # Groups
 'group' => 'Gruppe:',
@@ -1458,11 +1519,19 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'right-proxyunbannable' => 'Redigere gennem automatisk blokeret proxy',
 'right-unblockself' => 'Fjerne blokering af dig selv',
 'right-protect' => 'Ændre beskyttelsesniveauer og redigere cascade-beskyttede sider',
-'right-editprotected' => 'Ændre beskyttede sider (uden nedarvet sidebeskyttelse)',
+'right-editprotected' => 'Redigere sider beskyttet som "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Rediger sider, der er beskyttet som "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Ændre brugergrænsefladens tekster',
 'right-editusercssjs' => 'Ændre andre brugeres JS og CSS filer',
 'right-editusercss' => 'Ændre andre brugeres CSS filer',
 'right-edituserjs' => 'Ændre andre brugeres JS filer',
+'right-editmyusercss' => 'Redigere dine egne CSS-filer',
+'right-editmyuserjs' => 'Redigere dine egne JavaScript-filer',
+'right-viewmywatchlist' => 'Se din egen overvågningsliste',
+'right-editmywatchlist' => 'Redigere din egen overvågningsliste. Bemærk nogle handlinger tilføjer sider selv uden denne rettelse.',
+'right-viewmyprivateinfo' => 'Se dine egne private data (f.eks. e-mailadresse, rigtige navn)',
+'right-editmyprivateinfo' => 'Redigere dine egne private data (f.eks. e-mailadresse, rigtige navn)',
+'right-editmyoptions' => 'Redigere dine egne indstillinger',
 'right-rollback' => 'Hurtig gendannelse af alle redigeringer foretaget af den seneste bruger',
 'right-markbotedits' => 'Markere gendannelser som ændringer foretaget af en robot',
 'right-noratelimit' => 'Upåvirket af hastighedsgrænser',
@@ -1523,13 +1592,20 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'action-userrights' => 'ændre alle brugerrettigheder',
 'action-userrights-interwiki' => 'ændre brugerrettigheder for brugere på andre wikier',
 'action-siteadmin' => 'låse eller låse databasen op',
-'action-sendemail' => 'sende email',
+'action-sendemail' => 'sende e-mail',
+'action-editmywatchlist' => 'rediger din overvågningsliste',
+'action-viewmywatchlist' => 'se din overvågningsliste',
+'action-viewmyprivateinfo' => 'se din private information',
+'action-editmyprivateinfo' => 'rediger dine private oplysninger',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|ændring|ændringer}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|siden sidste besøg}}',
+'enhancedrc-history' => 'historik',
 'recentchanges' => 'Seneste ændringer',
 'recentchanges-legend' => 'Indstillinger for seneste ændringer',
 'recentchanges-summary' => "På denne side kan du følge de seneste ændringer på '''{{SITENAME}}'''.",
+'recentchanges-noresult' => 'Ingen ændringer i den angivne periode matcher disse kriterier.',
 'recentchanges-feed-description' => 'Med dette feed kan du følge de seneste ændringer på {{SITENAME}}.',
 'recentchanges-label-newpage' => 'Denne redigering oprettede en ny side',
 'recentchanges-label-minor' => 'Dette er en mindre ændring',
@@ -1567,7 +1643,6 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'recentchangeslinked-feed' => 'Relaterede ændringer',
 'recentchangeslinked-toolbox' => 'Relaterede ændringer',
 'recentchangeslinked-title' => 'Ændringer der relaterer til $1',
-'recentchangeslinked-noresult' => 'I det valgte tidsrum blev der ikke foretaget ændringer på sider der henvises til.',
 'recentchangeslinked-summary' => "Denne specialside viser de seneste ændringer på de sider der henvises til. Sider på din overvågningsliste er vist med '''fed''' skrift.",
 'recentchangeslinked-page' => 'Side:',
 'recentchangeslinked-to' => 'Vis ændringer i sider der henviser til den angivne side i stedet',
@@ -1578,7 +1653,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'reuploaddesc' => 'Tilbage til formularen til at lægge filer op.',
 'upload-tryagain' => 'Gem modificeret filbeskrivelse',
 'uploadnologin' => 'Ikke logget på',
-'uploadnologintext' => 'Du skal være [[Special:UserLogin|logget på]] for at kunne lægge filer op.',
+'uploadnologintext' => 'Du skal $1 for at kunne lægge filer op.',
 'upload_directory_missing' => 'upload-kataloget ($1) findes ikke. Webserveren har ikke mulighed for at oprette kataloget.',
 'upload_directory_read_only' => 'Webserveren har ingen skriverettigheder for upload-kataloget ($1).',
 'uploaderror' => 'Fejl under oplægning af fil',
@@ -1802,7 +1877,6 @@ For optimal sikkerhed er img_auth.php deaktiveret.",
 'http-read-error' => 'HTTP-læsefejl.',
 'http-timed-out' => 'HTTP-forespørgslen tog for lang tid.',
 'http-curl-error' => 'Fejl under hentning af URL: $1',
-'http-host-unreachable' => 'Webadresse er ikke tilgængelig.',
 'http-bad-status' => 'Der opstod et problem under HTTP-forespørgslen: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1830,6 +1904,10 @@ For optimal sikkerhed er img_auth.php deaktiveret.",
 'listfiles_size' => 'Størrelse (Byte)',
 'listfiles_description' => 'Beskrivelse',
 'listfiles_count' => 'Versioner',
+'listfiles-show-all' => 'Vis også gamle versioner af billeder',
+'listfiles-latestversion' => 'Nuværende version',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nej',
 
 # File description page
 'file-anchor-link' => 'Fil',
@@ -1926,6 +2004,13 @@ Husk at kontrollere for andre henvisninger til skabelonerne før de slettes.',
 'randompage' => 'Tilfældig side',
 'randompage-nopages' => 'Der er ingen sider i {{PLURAL:$2|navnerummet|disse navnerum:}} $1.',
 
+# Random page in category
+'randomincategory' => 'Tilfældig side i kategori',
+'randomincategory-invalidcategory' => '"$1" er ikke et gyldigt kategorinavn.',
+'randomincategory-nopages' => 'Der er ingen sider i [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Få tilfældig side fra kategori: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Gå til',
+
 # Random redirect
 'randomredirect' => 'Tilfældige henvisninger',
 'randomredirect-nopages' => 'Der er ingen omdirigeringer i navnerummet $1.',
@@ -1951,17 +2036,13 @@ Husk at kontrollere for andre henvisninger til skabelonerne før de slettes.',
 'statistics-users-active-desc' => 'Brugere som har udført handlinger i {{PLURAL:$1|det sidste døgn|de sidste $1 dage}}',
 'statistics-mostpopular' => 'Mest besøgte sider',
 
-'disambiguations' => 'Sider, der henviser til flertydige titler',
-'disambiguationspage' => 'Template:Flertydig',
-'disambiguations-text' => "De følgende sider henviser til mindst en side med en '''flertydig titel'''.
-De bør henvise direkte til et mere passende emne i stedet.<br />
-En side behandles som en side med en flertydig titel hvis den bruger en skabelon som der er henvist til fra [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Sider med en sideegenskab',
 'pageswithprop-legend' => 'Sider med en sideegenskab',
 'pageswithprop-text' => 'Denne side viser en liste over sider, der har en bestemt sideegenskab.',
 'pageswithprop-prop' => 'Egenskabsnavn:',
 'pageswithprop-submit' => 'Vis',
+'pageswithprop-prophidden-long' => 'lang tekst værdi for egenskaben skjult ($1)',
+'pageswithprop-prophidden-binary' => 'binær værdi for egenskaben skjult ($1)',
 
 'doubleredirects' => 'Dobbelte omdirigeringer',
 'doubleredirectstext' => 'Dette er en liste over sider som omdirigerer til andre omdirigeringssider.
@@ -2019,6 +2100,7 @@ Hver linje indeholder henvisninger til den første og den anden omdirigering, s
 'mostrevisions' => 'Sider med de fleste ændringer',
 'prefixindex' => 'Alle sider med præfiks',
 'prefixindex-namespace' => 'Alle sider med præfiks (navnerummet $1)',
+'prefixindex-strip' => 'Strip præfiks i listen',
 'shortpages' => 'Korte sider',
 'longpages' => 'Lange sider',
 'deadendpages' => 'Blindgydesider',
@@ -2034,6 +2116,7 @@ Hver linje indeholder henvisninger til den første og den anden omdirigering, s
 'listusers' => 'Brugerliste',
 'listusers-editsonly' => 'Vis kun brugere med redigeringer',
 'listusers-creationsort' => 'Sorter efter oprettelsesdato',
+'listusers-desc' => 'Sortér i faldende rækkefølge',
 'usereditcount' => '{{PLURAL:$1|én redigering|$1 redigeringer}}',
 'usercreated' => '{{GENDER:$3|Oprettet}} den $1 $2',
 'newpages' => 'Nyeste sider',
@@ -2169,7 +2252,7 @@ Den e-mail-adresse, du har angivet i [[Special:Preferences|dine indstillinger]],
 'usermaildisabled' => 'Bruger-e-mail deaktiveret',
 'usermaildisabledtext' => 'Du kan ikke sende e-mails til andre brugere på denne wiki',
 'noemailtitle' => 'Ingen e-mailadresse',
-'noemailtext' => 'Denne bruger har ikke angivet en gyldig e-mail-adresse.',
+'noemailtext' => 'Denne bruger har ikke angivet en gyldig e-mailadresse.',
 'nowikiemailtitle' => 'E-mail er ikke tilladt',
 'nowikiemailtext' => 'Denne bruger har valgt ikke at modtage e-mail fra andre brugere.',
 'emailnotarget' => 'Ikke-eksisterende eller ugyldigt brugernavn for modtageren.',
@@ -2211,10 +2294,9 @@ Fremtidige ændringer af denne side og dens tilknyttede diskussionsside vil bliv
 'unwatchthispage' => 'Fjern overvågning',
 'notanarticle' => 'Ikke en artikel',
 'notvisiblerev' => 'Versionen er blevet slettet',
-'watchnochange' => 'Ingen af siderne i din overvågningsliste er ændret i den valgte periode.',
 'watchlist-details' => 'Du har $1 {{PLURAL:$1|side|sider}} på din overvågningsliste (ekskl. diskussionssider).',
-'wlheader-enotif' => '* E-mail-underretning er slået til.',
-'wlheader-showupdated' => "* Sider der er ændret siden dit sidste besøg, er '''fremhævet'''",
+'wlheader-enotif' => 'E-mail-underretning er slået til.',
+'wlheader-showupdated' => "Sider, der er ændret siden dit sidste besøg, er vist med '''fed skrift'''.",
 'watchmethod-recent' => 'Tjekker seneste ændringer for sider i din overvågningsliste',
 'watchmethod-list' => 'Tjekker seneste ændringer for sider i din overvågningsliste',
 'watchlistcontains' => 'Din overvågningsliste indeholder $1 {{PLURAL:$1|side|sider}}.',
@@ -2457,7 +2539,7 @@ $1',
 'contributions' => '{{GENDER:$1|Brugerbidrag}}',
 'contributions-title' => 'Brugerbidrag for $1',
 'mycontris' => 'Bidrag',
-'contribsub2' => 'For $1 ($2)',
+'contribsub2' => 'For {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Ingen ændringer er fundet som opfylder disse kriterier.',
 'uctop' => '(seneste)',
 'month' => 'Måned:',
@@ -2614,13 +2696,11 @@ Se [[Special:BlockList|blokeringslisten]] for den nuværende liste med aktuelle
 'ipb_blocked_as_range' => 'Fejl: IP-adressen $1 er ikke direkte blokeret. Derfor kan en blokering ikke ophæves. Adressen er blokeret som en del af intervallet $2. Denne blokering kan ophæves.',
 'ip_range_invalid' => 'Ugyldigt IP-interval.',
 'ip_range_toolarge' => 'Blokeringer af IP-serier større end /$1 er ikke tilladte.',
-'blockme' => 'Bloker mig',
 'proxyblocker' => 'Proxy-blokering',
-'proxyblocker-disabled' => 'Denne funktion er ikke i brug.',
 'proxyblockreason' => "Din IP-adresse er blevet blokeret fordi den er en såkaldt ''åben proxy''. Kontakt din Internet-udbyder eller tekniske hotline og oplyse dem om dette alvorlige sikkerhedsproblem.",
-'proxyblocksuccess' => 'Færdig.',
 'sorbsreason' => 'IP-adressen er opført i DNSBL på {{SITENAME}} som åben PROXY.',
 'sorbs_create_account_reason' => 'IP-adressen er opført i DNSBL på {{SITENAME}} som åben PROXY. Oprettelse af nye brugere er ikke mulig.',
+'xffblockreason' => 'En IP-adresse der er indeholdt i X-Fremsendt-Til hovedet, enten din egen eller en på en proxy-server, du bruger, er blevet blokeret. Den oprindelige grund til blokeringen var:$1',
 'cant-block-while-blocked' => 'Du kan ikke blokkere andre brugere mens du selv er blokkeret.',
 'cant-see-hidden-user' => 'Brugeren du prøver at blokerer er allerede blokeret og skjult. Siden du ikke har rettigheden til at skjule brugere, kan du ikke se eller ændre brugerens blokering.',
 'ipbblocked' => 'Du kan ikke ændre blokeringer, da du selv er blokeret',
@@ -2778,6 +2858,8 @@ Besøg venligst [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisering] o
 'thumbnail-more' => 'Forstør',
 'filemissing' => 'Filen mangler',
 'thumbnail_error' => 'Fejl ved oprettelse af thumbnail: $1',
+'thumbnail_error_remote' => 'Fejlbesked fra $1:
+$2',
 'djvu_page_error' => 'DjVu-side udenfor sideområdet',
 'djvu_no_xml' => 'XML-data kan ikke hentes til DjVu-filen',
 'thumbnail-temp-create' => 'Kunne ikke oprette midlertidig miniaturefil',
@@ -3005,13 +3087,8 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 'pageinfo-category-files' => 'Antal filer',
 
 # Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'Nostalgi',
 'skinname-cologneblue' => 'Kølnerblå',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Eget udseende',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Enkelt',
 'skinname-modern' => 'Moderne',
 
 # Patrolling
@@ -3090,11 +3167,25 @@ Du kan beskadige dit system hvis du udfører den.",
 'minutes' => '{{PLURAL: $1|$1 minut|$1 minutter}}',
 'hours' => '{{PLURAL: $1|$1 time|$1 timer}}',
 'days' => '{{PLURAL: $1|$1 dag|$1 dage}}',
+'weeks' => '{{PLURAL:$1|$1 uge|$1 uger}}',
 'months' => '{{PLURAL:$1|$1 måned|$1 måneder}}',
 'years' => '{{PLURAL:$1|$1 år}}',
 'ago' => '$1 siden',
 'just-now' => 'lige nu',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|time|timer}} siden',
+'minutes-ago' => '$1 {{PLURAL:$1|minut|minutter}} siden',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund|sekunder}} siden',
+'monday-at' => 'Mandag kl. $1',
+'tuesday-at' => 'Tirsdag kl. $1',
+'wednesday-at' => 'Onsdag  kl. $1',
+'thursday-at' => 'Torsdag kl. $1',
+'friday-at' => 'Fredag kl. $1',
+'saturday-at' => 'Lørdag kl. $1',
+'sunday-at' => 'Søndag kl. $1',
+'yesterday-at' => 'Igår kl. $1',
+
 # Bad image list
 'bad_image_list' => 'Formatet er:
 
@@ -3121,7 +3212,7 @@ Kun indholdet af lister (linjer startende med *) bliver brugt. Den første henvi
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Bredde',
 'exif-imagelength' => 'Længde',
 'exif-bitspersample' => 'Bits pr. farvekomponent',
@@ -3299,7 +3390,7 @@ Kun indholdet af lister (linjer startende med *) bliver brugt. Den første henvi
 'exif-originalimageheight' => 'Højden af billedet inden det blev beskåret',
 'exif-originalimagewidth' => 'Bredden af billedet inden det blev beskåret',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ukomprimeret',
 'exif-compression-2' => 'CCITT Gruppe 3 1-dimensionel modificeret Huffman run length encoding',
 'exif-compression-3' => 'CCITT Gruppe 3 fax-kodning',
@@ -3522,22 +3613,24 @@ Kun indholdet af lister (linjer startende med *) bliver brugt. Den første henvi
 'limitall' => 'alle',
 
 # Email address confirmation
-'confirmemail' => 'Bekræft e-mail-adressen',
+'confirmemail' => 'Bekræft e-mailadresse',
 'confirmemail_noemail' => 'Du har ikke angivet en gyldig e-mailadresse i din [[Special:Preferences|brugerprofil]].',
-'confirmemail_text' => '{{SITENAME}} kræver, at du bekræfter en e-mail-adresse (autentificering), før du kan bruge de udvidede e-mail-funktioner. Med et klik på kontrolfeltet forneden sendes en e-mail til dig. Denne e-mail indeholder et link med en bekræftelseskode. Med et klik på dette link bekræftes, at e-mail-adressen er gyldig.',
+'confirmemail_text' => '{{SITENAME}} kræver, at du bekræfter en e-mailadresse (autentificering), før du kan bruge de udvidede e-mailfunktioner. Med et klik på kontrolfeltet forneden sendes en e-mail til dig. Denne e-mail indeholder et link med en bekræftelseskode. Med et klik på dette link bekræftes, at e-mailadressen er gyldig.',
 'confirmemail_pending' => 'En bekræftelsesmail er allerede sendt til dig. Hvis du først for nylig har oprettet brugerkontoen, vent da et par minutter på denne e-mail, før du bestiller en ny kode.',
 'confirmemail_send' => 'Send bekræftelseskode',
 'confirmemail_sent' => 'Bekræftelses-e-mail afsendt.',
 'confirmemail_oncreate' => 'En bekræftelseskode er sendt til din e-mailadresse. Denne kode skal ikke bruges til at logge på, den kræves til aktivering af e-mailfunktionerne i Wikien.',
-'confirmemail_sendfailed' => 'Bekræftelsesmailen kunne ikke afsendes. Kontroller at e-mail-adressen er korrekt.
+'confirmemail_sendfailed' => '{{SITENAME}} kunne ikke afsende din bekræftelsesmail.
+Kontroller at e-mailadressen er korrekt.
 
-Svarbesked fra mailserveren: $1',
+Besked fra mailserveren: $1',
 'confirmemail_invalid' => 'Ugyldig bekræftelseskode. Kodens gyldighed er muligvis udløbet.',
-'confirmemail_needlogin' => 'Du skal $1 for at bekræfte e-mail-adressen.',
-'confirmemail_success' => 'E-mail-adressen er nu bekræftet. Du kan nu logge på.',
-'confirmemail_loggedin' => 'E-mail-adressen er nu bekræftet.',
-'confirmemail_error' => 'Der skete en fejl ved bekræftelsen af e-mail-adressen.',
-'confirmemail_subject' => '[{{SITENAME}}] - bekræftelse af e-mail-adressen',
+'confirmemail_needlogin' => 'Du skal $1 for at bekræfte din e-mailadresse.',
+'confirmemail_success' => 'E-mailadressen er blevet bekræftet.
+Du kan nu [[Special:UserLogin|logge på]].',
+'confirmemail_loggedin' => 'Din e-mailadresse er nu bekræftet.',
+'confirmemail_error' => 'Der skete en fejl under lagring af din bekræftelse.',
+'confirmemail_subject' => '[{{SITENAME}}] - bekræftelse af e-mailadresse',
 'confirmemail_body' => 'Hej,
 
 Nogen med IP-adresse $1, sandsynligvis dig, har bestilt en bekræftelse af denne e-mailadresse til brugerkontoen "$2" på {{SITENAME}}.
@@ -3550,9 +3643,9 @@ Hvis denne e-mailadresse *ikke* hører til den anførte brugerkonto, skal du i s
 
 --
 {{SITENAME}}: {{fullurl:{{Mediawiki:mainpage}}}}',
-'confirmemail_body_changed' => 'Der er nogen, sandsynligvis dig, fra ip-adressen $1, der har ændret emailadressen for kontoen "$2" til denne adresse på {{SITENAME}}.
+'confirmemail_body_changed' => 'Der er nogen, sandsynligvis dig, fra ip-adressen $1, der har ændret e-mailadressen for kontoen "$2" til denne adresse på {{SITENAME}}.
 
-For at bekræfte, at denne konto virkeligt tilhører dig og for at genaktivere emailfunktionerne på {{SITENAME}}, bedes du åbne følgende link i en browser:
+For at bekræfte, at denne konto virkeligt tilhører dig og for at genaktivere e-mailfunktionerne på {{SITENAME}}, bedes du åbne følgende link i en browser:
 
 $3
 
@@ -3684,7 +3777,6 @@ Du kan også [[Special:EditWatchlist|bruge standard editoren]].',
 'version-other' => 'Andet',
 'version-mediahandlers' => 'Specialhåndtering af mediefiler',
 'version-hooks' => 'Funktionstilføjelser',
-'version-extension-functions' => 'Udvidelsesfunktioner',
 'version-parser-extensiontags' => 'Tilføjede tags',
 'version-parser-function-hooks' => 'Oversætter-funktioner',
 'version-hook-name' => 'Navn',
@@ -3693,6 +3785,7 @@ Du kan også [[Special:EditWatchlist|bruge standard editoren]].',
 'version-license' => 'Licens',
 'version-poweredby-credits' => "Denne wiki er drevet af '''[//www.mediawiki.org/ MediaWiki ]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'andre',
+'version-poweredby-translators' => 'translatewiki.net oversættere',
 'version-credits-summary' => 'Vi vil gerne anerkende følgende personer for deres bidrag til [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki er fri software; du kan redistribuere det og/eller ændre det under betingelserne i GNU General Public License som offentliggjort af Free Software Foundation; enten version 2 af licensen eller (efter eget valg) enhver senere version. 
 
@@ -3706,12 +3799,17 @@ Du skulle have modtaget [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi af GNU General
 'version-entrypoints-header-entrypoint' => 'Indgangspunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Filsti',
-'filepath-page' => 'Fil:',
-'filepath-submit' => 'Vis sti',
-'filepath-summary' => 'Denne specialside giver et direkte link til en fil.
-Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med deres tilhørende program.',
+# Special:Redirect
+'redirect' => 'Omdirigering pga. fil, bruger eller udgave ID',
+'redirect-legend' => 'Omstilling til en fil eller en side',
+'redirect-summary' => "Denne side omdirigerer en (hvis filnavnet er angivet), en side (hvis udgave ID'et er angivet) eller en brugerside (hvis et numerisk brugernummer er angivet).",
+'redirect-submit' => 'Kør',
+'redirect-lookup' => 'Slå op:',
+'redirect-value' => 'Værdi:',
+'redirect-user' => 'Bruger ID',
+'redirect-revision' => 'Sideversion',
+'redirect-file' => 'Filnavn',
+'redirect-not-exists' => 'Værdi ej fundet',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Find dubletfiler',
@@ -3765,7 +3863,10 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
 'tags-tag' => 'Tagnavn',
 'tags-display-header' => 'Udseende på ændringslister',
 'tags-description-header' => 'Beskrivelse af betydning',
+'tags-active-header' => 'Aktivt?',
 'tags-hitcount-header' => 'Taggede ændringer',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nej',
 'tags-edit' => 'Redigér',
 'tags-hitcount' => '{{PLURAL:$1|en ændring|$1 ændringer}}',
 
@@ -3786,6 +3887,7 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
 'dberr-problems' => 'Undskyld! Siden har tekniske problemer.',
 'dberr-again' => 'Prøv at vente et par minutter og opdater så siden igen.',
 'dberr-info' => '(Kan ikke komme i kontakt med databaseserveren: $1)',
+'dberr-info-hidden' => '(Kan ikke komme i kontakt med databaseserveren)',
 'dberr-usegoogle' => 'Du kan prøve at søge med Google imens.',
 'dberr-outofdate' => 'Bemærk at deres indeks over vores sider kan være forældet.',
 'dberr-cachederror' => 'Det følgende er en mellemlagret kopi af den forespurgte side. Den kan være forældet.',
@@ -3801,6 +3903,9 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
 'htmlform-submit' => 'Gem',
 'htmlform-reset' => 'Annuller ændringer',
 'htmlform-selectorother-other' => 'Anden',
+'htmlform-no' => 'Nej',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Vælg en mulighed',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 med fuld-tekst søgnings support',
@@ -3918,4 +4023,17 @@ Ellers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføj
 # Image rotation
 'rotate-comment' => 'Billedet roteres med $1 {{PLURAL:$1| grad|grader}} med uret',
 
+# Limit report
+'limitreport-title' => 'Profildata for parser:',
+'limitreport-cputime' => 'Brugt CPU-tid',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'limitreport-walltime' => 'Brugt reel tid',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'limitreport-ppvisitednodes' => 'Antal nodebesøg for preprocessor',
+'limitreport-ppgeneratednodes' => 'Antal noder genereret af preprocessor',
+'limitreport-postexpandincludesize' => 'Inkluderet størrelse efter udvidelse',
+'limitreport-templateargumentsize' => 'Skabelon argumentstørrelse',
+'limitreport-expansiondepth' => 'Største udvidelsesdybde',
+'limitreport-expensivefunctioncount' => 'Antal dyre parserfunktioner',
+
 );
diff --git a/languages/messages/MessagesDe.php b/languages/messages/MessagesDe.php
index e840e815..baba6967 100644
--- a/languages/messages/MessagesDe.php
+++ b/languages/messages/MessagesDe.php
@@ -13,6 +13,7 @@
  * @author Church of emacs
  * @author DaSch
  * @author Das Schäfchen
+ * @author DerHexer
  * @author Dschwen
  * @author Duesentrieb
  * @author Filzstift
@@ -55,6 +56,7 @@
  * @author Rillke
  * @author SVG
  * @author Saibo
+ * @author Se4598
  * @author Sebastian Wallroth
  * @author Shirayuki
  * @author Spacebirdy
@@ -165,6 +167,7 @@ $specialPageAliases = array(
 	'Myuploads'                 => array( 'Meine_hochgeladenen_Dateien' ),
 	'Newimages'                 => array( 'Neue_Dateien' ),
 	'Newpages'                  => array( 'Neue_Seiten' ),
+	'PagesWithProp'             => array( 'Seiten_mit_Eigenschaften' ),
 	'PasswordReset'             => array( 'Passwort_neu_vergeben' ),
 	'PermanentLink'             => array( 'Permanenter_Link', 'Permalink' ),
 	'Popularpages'              => array( 'Beliebteste_Seiten' ),
@@ -176,6 +179,7 @@ $specialPageAliases = array(
 	'Randomredirect'            => array( 'Zufällige_Weiterleitung' ),
 	'Recentchanges'             => array( 'Letzte_Änderungen' ),
 	'Recentchangeslinked'       => array( 'Änderungen_an_verlinkten_Seiten' ),
+	'Redirect'                  => array( 'Weiterleitung' ),
 	'Revisiondelete'            => array( 'Versionslöschung' ),
 	'Search'                    => array( 'Suche' ),
 	'Shortpages'                => array( 'Kürzeste_Seiten' ),
@@ -256,6 +260,8 @@ $magicWords = array(
 	'fullpagenamee'             => array( '1', 'VOLLER_SEITENNAME_URL', 'FULLPAGENAMEE' ),
 	'subpagename'               => array( '1', 'UNTERSEITE', 'SUBPAGENAME' ),
 	'subpagenamee'              => array( '1', 'UNTERSEITE_URL', 'SUBPAGENAMEE' ),
+	'rootpagename'              => array( '1', 'STAMMSEITE', 'ROOTPAGENAME' ),
+	'rootpagenamee'             => array( '1', 'STAMMSEITE_URL', 'ROOTPAGENAMEE' ),
 	'basepagename'              => array( '1', 'OBERSEITE', 'BASEPAGENAME' ),
 	'basepagenamee'             => array( '1', 'OBERSEITE_URL', 'BASEPAGENAMEE' ),
 	'talkpagename'              => array( '1', 'DISKUSSIONSSEITE', 'DISK', 'TALKPAGENAME' ),
@@ -442,9 +448,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Anzahl der beobachtenden Benutzer anzeigen',
 'tog-oldsig' => 'Vorhandene Signatur:',
 'tog-fancysig' => 'Signatur als Wikitext behandeln (ohne automatische Verlinkung)',
-'tog-externaleditor' => 'Externen Editor standardmäßig nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
-'tog-externaldiff' => 'Externes Programm standardmäßig für Versionsunterschiede nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
-'tog-showjumplinks' => '„Wechseln-zu“-Links aktivieren',
 'tog-uselivepreview' => 'Vorschau sofort anzeigen (experimentell)',
 'tog-forceeditsummary' => 'Warnen, sofern beim Speichern die Zusammenfassung fehlt',
 'tog-watchlisthideown' => 'Eigene Bearbeitungen in der Beobachtungsliste ausblenden',
@@ -458,6 +461,8 @@ $messages = array(
 'tog-showhiddencats' => 'Anzeige versteckter Kategorien',
 'tog-noconvertlink' => 'Konvertierung des Titels deaktivieren',
 'tog-norollbackdiff' => 'Unterschied nach dem Zurücksetzen unterdrücken',
+'tog-useeditwarning' => 'Warnen, sofern eine zur Bearbeitung geöffnete Seite verlassen wird, die nicht gespeicherte Änderungen enthält',
+'tog-prefershttps' => 'Wenn angemeldet, immer eine sichere Verbindung benutzen.',
 
 'underline-always' => 'immer',
 'underline-never' => 'nie',
@@ -521,6 +526,18 @@ $messages = array(
 'oct' => 'Okt.',
 'nov' => 'Nov.',
 'dec' => 'Dez.',
+'january-date' => '$1. Januar',
+'february-date' => '$1. Februar',
+'march-date' => '$1. März',
+'april-date' => '$1. April',
+'may-date' => '$1. Mai',
+'june-date' => '$1. Juni',
+'july-date' => '$1. Juli',
+'august-date' => '$1. August',
+'september-date' => '$1. September',
+'october-date' => '$1. Oktober',
+'november-date' => '$1. November',
+'december-date' => '$1. Dezember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorien}}',
@@ -602,6 +619,7 @@ $messages = array(
 'create-this-page' => 'Seite erstellen',
 'delete' => 'Löschen',
 'deletethispage' => 'Diese Seite löschen',
+'undeletethispage' => 'Diese Seite wiederherstellen',
 'undelete_short' => '{{PLURAL:$1|1 Version|$1 Versionen}} wiederherstellen',
 'viewdeleted_short' => '{{PLURAL:$1|Eine gelöschte Version|$1 gelöschte Versionen}} ansehen',
 'protect' => 'Schützen',
@@ -645,7 +663,7 @@ $1',
 'pool-queuefull' => 'Poolwarteschlange ist voll',
 'pool-errorunknown' => 'Unbekannter Fehler',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Über {{SITENAME}}',
 'aboutpage' => 'Project:Über_{{SITENAME}}',
 'copyright' => 'Der Inhalt ist verfügbar unter der Lizenz $1, sofern nicht anders angegeben.',
@@ -655,7 +673,6 @@ $1',
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Bearbeitungshilfe',
-'edithelppage' => 'Help:Bearbeiten',
 'helppage' => 'Help:Inhaltsverzeichnis',
 'mainpage' => 'Hauptseite',
 'mainpage-description' => 'Hauptseite',
@@ -734,15 +751,12 @@ Alle verfügbaren Spezialseiten sind in der [[Special:SpecialPages|Liste der Spe
 # General errors
 'error' => 'Fehler',
 'databaseerror' => 'Datenbankfehler',
-'dberrortext' => 'Es ist ein Datenbankfehler aufgetreten.
-Der Grund kann ein Programmierfehler sein.
-Die letzte Datenbankabfrage lautete:
-<blockquote><code>$1</code></blockquote>
-aus der Funktion „<code>$2</code>“.
-Die Datenbank meldete den Fehler „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Es gab einen Syntaxfehler in der Datenbankabfrage.
-Die letzte Datenbankabfrage lautete: „$1“ aus der Funktion „<tt>$2</tt>“.
-Die Datenbank meldete den Fehler: „<tt>$3: $4</tt>“.',
+'databaseerror-text' => 'Es ist ein Datenbankabfragefehler aufgetreten.
+Dies könnte auf einen Fehler in der Software hindeuten.',
+'databaseerror-textcl' => 'Es ist ein Datenbankabfragefehler aufgetreten.',
+'databaseerror-query' => 'Abfrage: $1',
+'databaseerror-function' => 'Funktion: $1',
+'databaseerror-error' => 'Fehler: $1',
 'laggedslavemode' => "'''Achtung:''' Die angezeigte Seite könnte unter Umständen nicht die letzten Bearbeitungen enthalten.",
 'readonly' => 'Datenbank gesperrt',
 'enterlockreason' => 'Bitte gib einen Grund ein, warum die Datenbank gesperrt werden soll und eine Abschätzung über die Dauer der Sperrung',
@@ -775,6 +789,7 @@ Möglicherweise wurde sie bereits von jemand anderem gelöscht.',
 'cannotdelete-title' => 'Seite „$1“ kann nicht gelöscht werden',
 'delete-hook-aborted' => 'Die Löschung wurde von einer Programmerweiterung zu MediaWiki verhindert.
 Es ist hierzu keine Erklärung verfügbar.',
+'no-null-revision' => 'Die neue Nullversion für die Seite „$1“ konnte nicht erstellt werden',
 'badtitle' => 'Ungültiger Titel',
 'badtitletext' => 'Der Titel der angeforderten Seite ist ungültig, leer oder ein ungültiger Sprachlink von einem anderen Wiki.',
 'perfcached' => 'Die folgenden Daten stammen aus dem Cache und sind möglicherweise nicht aktuell. Maximal {{PLURAL:$1|ein Ergebnis ist|$1 Ergebnisse sind}} im Cache verfügbar.',
@@ -797,12 +812,15 @@ Nutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt
 'editinginterface' => "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.
 Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche dieses Wikis aus.
 Nutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.",
-'sqlhidden' => '(Die SQL-Datenbankabfrage ist verborgen.)',
 'cascadeprotected' => 'Diese Seite ist zur Bearbeitung gesperrt. Sie ist in die {{PLURAL:$1|folgende Seite|folgenden Seiten}} eingebunden, die mittels der Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}:
 $2',
 'namespaceprotected' => "Du hast nicht die erforderliche Berechtigung, um Seiten im Namensraum '''$1''' bearbeiten zu können.",
 'customcssprotected' => 'Du hast nicht die Berechtigung, diese CSS enthaltende Seite zu bearbeiten, da sie die persönlichen Einstellungen eines anderen Benutzers enthält.',
 'customjsprotected' => 'Du hast nicht die Berechtigung, diese JavaScript enthaltende Seite zu bearbeiten, da es sich hierbei um die persönlichen Einstellungen eines anderen Benutzers handelt.',
+'mycustomcssprotected' => 'Du hast keine Berechtigung, diese CSS-Seite zu bearbeiten.',
+'mycustomjsprotected' => 'Du hast keine Berechtigung, diese JavaScript-Seite zu bearbeiten.',
+'myprivateinfoprotected' => 'Du hast keine Berechtigung, deine privaten Informationen zu bearbeiten.',
+'mypreferencesprotected' => 'Du hast keine Berechtigung, deine Einstellungen zu bearbeiten.',
 'ns-specialprotected' => 'Spezialseiten können nicht bearbeitet werden.',
 'titleprotected' => "Eine Seite mit diesem Namen kann nicht angelegt werden.
 Die Sperre wurde durch [[User:$1|$1]] mit der Begründung ''„$2“'' eingerichtet.",
@@ -827,10 +845,19 @@ Beachte, dass einige Seiten noch anzeigen können, dass du angemeldet bist, sola
 'welcomecreation-msg' => 'Dein Benutzerkonto wurde erstellt.
 Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ändern.',
 'yourname' => 'Benutzername:',
+'userlogin-yourname' => 'Benutzername',
+'userlogin-yourname-ph' => 'Gib deinen Benutzernamen ein',
+'createacct-another-username-ph' => 'Benutzername',
 'yourpassword' => 'Passwort:',
+'userlogin-yourpassword' => 'Passwort',
+'userlogin-yourpassword-ph' => 'Gib dein Passwort ein',
+'createacct-yourpassword-ph' => 'Gib dein Passwort ein',
 'yourpasswordagain' => 'Passwort wiederholen:',
+'createacct-yourpasswordagain' => 'Passwort bestätigen',
+'createacct-yourpasswordagain-ph' => 'Gib das Passwort erneut ein',
 'remembermypassword' => 'Mit diesem Browser dauerhaft angemeldet bleiben (maximal $1 {{PLURAL:$1|Tag|Tage}})',
-'securelogin-stick-https' => 'Nach dem Anmelden mit HTTPS verbunden bleiben',
+'userlogin-remembermypassword' => 'Angemeldet bleiben',
+'userlogin-signwithsecure' => 'Sichere Verbindung verwenden',
 'yourdomainname' => 'Deine Domain:',
 'password-change-forbidden' => 'Du kannst auf diesem Wiki keine Passwörter ändern.',
 'externaldberror' => 'Entweder es liegt ein Fehler bei der externen Authentifizierung vor oder du darfst dein externes Benutzerkonto nicht aktualisieren.',
@@ -842,18 +869,44 @@ Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ände
 'logout' => 'Abmelden',
 'userlogout' => 'Abmelden',
 'notloggedin' => 'Nicht angemeldet',
+'userlogin-noaccount' => 'Du hast noch kein Benutzerkonto?',
+'userlogin-joinproject' => '{{SITENAME}} beitreten',
 'nologin' => 'Du hast kein Benutzerkonto? $1.',
 'nologinlink' => 'Neues Benutzerkonto anlegen',
 'createaccount' => 'Benutzerkonto anlegen',
 'gotaccount' => "Du hast bereits ein Benutzerkonto? '''$1'''.",
 'gotaccountlink' => 'Anmelden',
 'userlogin-resetlink' => 'Die Anmeldedaten vergessen?',
+'userlogin-resetpassword-link' => 'Passwort zurücksetzen',
+'helplogin-url' => 'Help:Anmelden',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hilfe beim Anmelden]]',
+'userlogin-loggedin' => 'Du bist bereits als {{GENDER:$1|$1}} angemeldet.
+Benutze das unten stehende Formular, um sich unter einem anderen Benutzer anzumelden.',
+'userlogin-createanother' => 'Ein weiteres Benutzerkonto erstellen',
+'createacct-join' => 'Gib unten deine Informationen ein.',
+'createacct-another-join' => 'Gib unten die Informationen des neuen Benutzerkontos ein.',
+'createacct-emailrequired' => 'E-Mail-Adresse',
+'createacct-emailoptional' => 'E-Mail-Adresse (optional)',
+'createacct-email-ph' => 'Gib deine E-Mail-Adresse ein',
+'createacct-another-email-ph' => 'E-Mail-Adresse',
 'createaccountmail' => 'Ein temporäres Zufallspasswort verwenden und an die angegebene E-Mail-Adresse versenden',
+'createacct-realname' => 'Bürgerlicher Name (optional)',
 'createaccountreason' => 'Grund:',
+'createacct-reason' => 'Begründung',
+'createacct-reason-ph' => 'Warum erstellst du ein anderes Benutzerkonto?',
+'createacct-captcha' => 'Sicherheitsprüfung',
+'createacct-imgcaptcha-ph' => 'Gib den Text ein, den du oben siehst.',
+'createacct-submit' => 'Dein Benutzerkonto erstellen',
+'createacct-another-submit' => 'Anderes Benutzerkonto erstellen',
+'createacct-benefit-heading' => '{{SITENAME}} wird von Menschen wie dir geschaffen.',
+'createacct-benefit-body1' => '{{PLURAL:$1|Bearbeitung|Bearbeitungen}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Seite|Seiten}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|aktiver Autor|aktive Autoren}}',
 'badretype' => 'Die beiden Passwörter stimmen nicht überein.',
 'userexists' => 'Dieser Benutzername ist schon vergeben.
 Bitte wähle einen anderen.',
 'loginerror' => 'Fehler bei der Anmeldung',
+'createacct-error' => 'Fehler beim Erstellen des Benutzerkontos',
 'createaccounterror' => 'Benutzerkonto konnte nicht erstellt werden: $1',
 'nocookiesnew' => 'Der Benutzerzugang wurde erstellt, aber du bist nicht angemeldet. {{SITENAME}} benötigt für diese Funktion Cookies, bitte aktiviere diese und melde dich dann mit deinem neuen Benutzernamen und dem zugehörigen Passwort an.',
 'nocookieslogin' => '{{SITENAME}} benutzt Cookies zur Anmeldung der Benutzer. Du hast Cookies deaktiviert, bitte aktiviere diese und versuche es erneut.',
@@ -909,11 +962,13 @@ Besucher, die diese IP-Adresse verwenden, können momentan keine Benutzerkonten
 
 Falls das Benutzerkonto irrtümlich angelegt wurde, kannst du diese Nachricht ignorieren.',
 'usernamehasherror' => 'Benutzernamen dürfen kein Rautenzeichen enthalten',
-'login-throttled' => 'Du hast zu oft vergeblich versucht, dich anzumelden.
-Bitte warte etwas, bevor du es erneut versuchst.',
+'login-throttled' => 'Du hast zu oft versucht, dich anzumelden.
+Bitte warte $1, bevor du es erneut probierst.',
 'login-abort-generic' => 'Deine Anmeldung war nicht erfolgreich – Abgebrochen',
 'loginlanguagelabel' => 'Sprache: $1',
 'suspicious-userlogout' => 'Deine Abmeldeanfrage wurde verweigert, da sie vermutlich von einem defekten Browser oder einem Cache-Proxy gesendet wurde.',
+'createacct-another-realname-tip' => 'Der bürgerliche Name ist optional.
+Wenn du ihn angibst, wird er für die Zuordnung der Beiträge verwendet.',
 
 # Email sending
 'php-mail-error-unknown' => 'Unbekannter Fehler mit der Funktion mail() von PHP',
@@ -929,8 +984,7 @@ Bitte warte etwas, bevor du es erneut versuchst.',
 'newpassword' => 'Neues Passwort:',
 'retypenew' => 'Neues Passwort (nochmal):',
 'resetpass_submit' => 'Passwort übermitteln und anmelden',
-'resetpass_success' => 'Dein Passwort wurde erfolgreich geändert!
-Du wirst nun angemeldet …',
+'changepassword-success' => 'Dein Passwort wurde erfolgreich geändert!',
 'resetpass_forbidden' => 'Das Passwort kann nicht geändert werden.',
 'resetpass-no-info' => 'Du musst dich anmelden, um auf diese Seite direkt zuzugreifen.',
 'resetpass-submit-loggedin' => 'Passwort ändern',
@@ -942,10 +996,11 @@ Möglicherweise hast du dein Passwort bereits erfolgreich geändert oder ein neu
 
 # Special:PasswordReset
 'passwordreset' => 'Passwort zurücksetzen',
-'passwordreset-text' => 'Bitte dieses Formular ausfüllen, um dein Passwort zurückzusetzen.',
+'passwordreset-text-one' => 'Fülle dieses Formular aus, um dein Passwort zurückzusetzen.',
+'passwordreset-text-many' => '{{PLURAL:$1|Füll eines der Felder aus, um dein Passwort zurückzusetzen.}}',
 'passwordreset-legend' => 'Passwort zurücksetzen',
 'passwordreset-disabled' => 'Das Zurücksetzen von Passwörtern wurde in diesem Wiki deaktiviert.',
-'passwordreset-pretext' => '{{PLURAL:$1||Gib eines der folgenden Daten ein.}}',
+'passwordreset-emaildisabled' => 'Die E-Mail-Funktionen wurden auf diesem Wiki deaktiviert.',
 'passwordreset-username' => 'Benutzername:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Die E-Mail-Nachricht ansehen?',
@@ -972,7 +1027,7 @@ $2
 Temporäres Passwort: $2',
 'passwordreset-emailsent' => 'Eine Passwortzurücksetzungs-E-Mail wurde versandt.',
 'passwordreset-emailsent-capture' => 'Eine Passwortzurücksetzungs-E-Mail wurde versandt, die unten angezeigt wird.',
-'passwordreset-emailerror-capture' => 'Die unten angezeigte Passwortzurücksetzungs-E-Mail wurde generiert, allerdings ist der Versand an den Benutzer gescheitert: $1',
+'passwordreset-emailerror-capture' => 'Die unten angezeigte Passwortzurücksetzungs-E-Mail wurde generiert, allerdings ist der Versand an {{GENDER:$2|den Benutzer|die Benutzerin}} gescheitert: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-Mail-Adresse ändern',
@@ -986,6 +1041,19 @@ Temporäres Passwort: $2',
 'changeemail-submit' => 'E-Mail-Adresse ändern',
 'changeemail-cancel' => 'Abbrechen',
 
+# Special:ResetTokens
+'resettokens' => 'Tokens zurücksetzen',
+'resettokens-text' => 'Du kannst Tokens zurücksetzen, die dir den Zugriff auf bestimmte private Daten ermöglichen, die mit deinem Benutzerkonto hier verknüpft sind.
+
+Du solltest dies nur machen, wenn du die Tokens versehentlich mit jemandem geteilt hast oder dein Konto gefährdet ist.',
+'resettokens-no-tokens' => 'Es gibt keine Tokens zum Zurücksetzen.',
+'resettokens-legend' => 'Tokens zurücksetzen',
+'resettokens-tokens' => 'Tokens:',
+'resettokens-token-label' => '$1 (aktueller Wert: $2)',
+'resettokens-watchlist-token' => 'Token für den Webfeed (Atom/RSS) der [[Special:Watchlist|Änderungen an Seiten auf deiner Beobachtungsliste]]',
+'resettokens-done' => 'Tokens zurückgesetzt.',
+'resettokens-resetbutton' => 'Ausgewählte Tokens zurücksetzen',
+
 # Edit page toolbar
 'bold_sample' => 'Fetter Text',
 'bold_tip' => 'Fetter Text',
@@ -1178,11 +1246,14 @@ Zu deiner Information folgt das Lösch- und Verschiebungs-Logbuch mit der Begrü
 Sie wurde anscheinend gelöscht.',
 'edit-conflict' => 'Bearbeitungskonflikt.',
 'edit-no-change' => 'Deine Bearbeitung wurde ignoriert, da keine Änderung an dem Text vorgenommen wurde.',
+'postedit-confirmation' => 'Deine Bearbeitung wurde gespeichert.',
 'edit-already-exists' => 'Die neue Seite konnte nicht erstellt werden, da sie bereits vorhanden ist.',
 'defaultmessagetext' => 'Standardtext',
 'content-failed-to-parse' => 'Parsen des Inhalts $2 für Modell $1 fehlgeschlagen: $3',
 'invalid-content-data' => 'Ungültige Inhaltsdaten',
 'content-not-allowed-here' => 'Der Inhalt „$1“ ist auf der Seite [[$2]] nicht erlaubt',
+'editwarning-warning' => 'Das Verlassen dieser Seite kann dazu führen, dass deine Änderungen verloren gehen.
+Wenn du angemeldet bist, kannst du das Anzeigen dieser Warnung im Bereich „Bearbeiten“ deiner Einstellungen abschalten.',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -1216,6 +1287,7 @@ Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest
 'undo-failure' => 'Die Änderung konnte nicht rückgängig gemacht werden, da der betroffene Abschnitt zwischenzeitlich verändert wurde.',
 'undo-norev' => 'Die Bearbeitung konnte nicht rückgängig gemacht werden, da sie nicht vorhanden ist oder gelöscht wurde.',
 'undo-summary' => 'Änderung $1 von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) rückgängig gemacht.',
+'undo-summary-username-hidden' => 'Änderung $1 eines versteckten Benutzers rückgängig gemacht.',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Das Benutzerkonto kann nicht erstellt werden',
@@ -1393,6 +1465,7 @@ Stelle sicher, dass die Versionsgeschichte einer Seite historisch korrekt ist.',
 'compareselectedversions' => 'Gewählte Versionen vergleichen',
 'showhideselectedversions' => 'Gewählte Versionen zeigen/verstecken',
 'editundo' => 'rückgängig machen',
+'diff-empty' => '(kein Unterschied)',
 'diff-multi' => '({{PLURAL:$1|Eine dazwischenliegende Version|$1 dazwischenliegende Versionen}} von {{PLURAL:$2|einem Benutzer|$2 Benutzern}} {{PLURAL:$1|wird|werden}} nicht angezeigt)',
 'diff-multi-manyusers' => '({{PLURAL:$1|$1 dazwischenliegende Versionen}} von mehr als {{PLURAL:$2|$2 Benutzern}}, die nicht angezeigt werden)',
 'difference-missing-revision' => '{{PLURAL:$2|Eine Version|$2 Versionen}} dieser Unterschiedsanzeige ($1) {{PLURAL:$2|wurde|wurden}} nicht gefunden.
@@ -1420,7 +1493,6 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'searchmenu-legend' => 'Suchoptionen',
 'searchmenu-exists' => "'''Es gibt eine Seite, die den Namen „[[:$1]]“ hat.'''",
 'searchmenu-new' => "'''Erstelle die Seite „[[:$1]]“ in diesem Wiki.'''",
-'searchhelp-url' => 'Help:Hilfe',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zeige alle Seiten, die mit dem Suchbegriff anfangen]]',
 'searchprofile-articles' => 'Inhaltsseiten',
 'searchprofile-project' => 'Hilfe- und Projektseiten',
@@ -1461,15 +1533,7 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'powersearch-togglenone' => 'Keine',
 'search-external' => 'Externe Suche',
 'searchdisabled' => 'Die {{SITENAME}}-Suche ist deaktiviert. Du kannst unterdessen mit Google suchen. Bitte bedenke, dass der Suchindex von {{SITENAME}} veraltet sein kann.',
-
-# Quickbar
-'qbsettings' => 'Seitenleiste',
-'qbsettings-none' => 'Keine',
-'qbsettings-fixedleft' => 'Links, fest',
-'qbsettings-fixedright' => 'Rechts, fest',
-'qbsettings-floatingleft' => 'Links, schwebend',
-'qbsettings-floatingright' => 'Rechts, schwebend',
-'qbsettings-directionality' => 'Fest, abhängig von der Schreibrichtung der gewählten Sprache',
+'search-error' => 'Bei der Suche ist ein Fehler aufgetreten: $1',
 
 # Preferences page
 'preferences' => 'Einstellungen',
@@ -1503,7 +1567,6 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'resetprefs' => 'Eingaben verwerfen',
 'restoreprefs' => 'Alle Standardeinstellungen wiederherstellen (in allen Abschnitten)',
 'prefs-editing' => 'Bearbeiten',
-'prefs-edit-boxsize' => 'Größe des Bearbeitungsfensters:',
 'rows' => 'Zeilen:',
 'columns' => 'Spalten:',
 'searchresultshead' => 'Suche',
@@ -1514,9 +1577,9 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'recentchangesdays-max' => 'Maximal $1 {{PLURAL:$1|Tag|Tage}}',
 'recentchangescount' => 'Anzahl der standardmäßig angezeigten Bearbeitungen:',
 'prefs-help-recentchangescount' => 'Dies umfasst die Liste der letzten Änderungen, die Versionsgeschichte und die Logbücher.',
-'prefs-help-watchlist-token' => 'Das Ausfüllen dieses Feldes mit einem geheimen Schlüssel generiert einen RSS-Feed für deine Beobachtungsliste.
-Jeder, der diesen Schlüssel kennt, kann deine Beobachtungsliste einsehen. Wähle also einen sicheren Wert.
-Hier ein zufällig generierter Wert, den du verwenden kannst: $1',
+'prefs-help-watchlist-token2' => 'Dies ist der geheime Schlüssel zum Webfeed deiner Beobachtungsliste.
+Jeder, der ihn kennt, kann deine Beobachtungsliste lesen. Teile ihn deshalb nicht.
+[[Special:ResetTokens|Klicke hier, wenn du ihn zurücksetzen musst]].',
 'savedprefs' => 'Deine Einstellungen wurden gespeichert.',
 'timezonelegend' => 'Zeitzone:',
 'localtime' => 'Ortszeit:',
@@ -1547,7 +1610,6 @@ Hier ein zufällig generierter Wert, den du verwenden kannst: $1',
 'prefs-reset-intro' => 'Du kannst diese Seite verwenden, um die Einstellungen auf die Standards zurückzusetzen.
 Dies kann nicht mehr rückgängig gemacht werden.',
 'prefs-emailconfirm-label' => 'E-Mail-Bestätigung:',
-'prefs-textboxsize' => 'Größe des Bearbeitungsfensters',
 'youremail' => 'E-Mail-Adresse:',
 'username' => '{{GENDER:$1|Benutzername}}:',
 'uid' => '{{GENDER:$1|Benutzerkennung}}:',
@@ -1581,6 +1643,8 @@ Diese Information ist öffentlich.',
 'prefs-dateformat' => 'Datumsformat',
 'prefs-timeoffset' => 'Zeitunterschied',
 'prefs-advancedediting' => 'Allgemeine Optionen',
+'prefs-editor' => 'Bearbeitungsprogramm',
+'prefs-preview' => 'Vorschau',
 'prefs-advancedrc' => 'Erweiterte Optionen',
 'prefs-advancedrendering' => 'Erweiterte Optionen',
 'prefs-advancedsearchoptions' => 'Erweiterte Optionen',
@@ -1588,7 +1652,9 @@ Diese Information ist öffentlich.',
 'prefs-displayrc' => 'Anzeigeoptionen',
 'prefs-displaysearchoptions' => 'Anzeigeoptionen',
 'prefs-displaywatchlist' => 'Anzeigeoptionen',
+'prefs-tokenwatchlist' => 'Token',
 'prefs-diffs' => 'Versionsvergleich',
+'prefs-help-prefershttps' => 'Diese Einstellung wird bei deiner nächsten Anmeldung wirksam',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Diese E-Mail-Adresse scheint gültig zu sein.',
@@ -1616,6 +1682,8 @@ Diese Information ist öffentlich.',
 'userrights-notallowed' => 'Du verfügst nicht über die erforderlichen Berechtigungen, um Benutzerrechte vergeben oder entziehen zu können.',
 'userrights-changeable-col' => 'Gruppenzugehörigkeit, die du ändern kannst',
 'userrights-unchangeable-col' => 'Gruppenzugehörigkeit, die du nicht ändern kannst',
+'userrights-conflict' => 'Benutzerrechteänderungskonflikt! Bitte überprüfe und bestätige deine Änderungen.',
+'userrights-removed-self' => 'Du hast deine eigenen Rechte erfolgreich entfernt. Du kannst nicht länger auf diese Seite zugreifen.',
 
 # Groups
 'group' => 'Gruppe:',
@@ -1681,11 +1749,19 @@ Diese Information ist öffentlich.',
 'right-proxyunbannable' => 'Ausnahme von automatischen Proxysperren',
 'right-unblockself' => 'Sich entsperren',
 'right-protect' => 'Seitenschutzstatus ändern und kaskadengeschützte Seiten bearbeiten',
-'right-editprotected' => 'Geschützte Seiten bearbeiten (ohne Kaskadenschutz)',
+'right-editprotected' => 'Seiten bearbeiten, die als „{{int:protect-level-sysop}}“ geschützt sind',
+'right-editsemiprotected' => 'Seiten bearbeiten, die als „{{int:protect-level-autoconfirmed}}“ geschützt sind',
 'right-editinterface' => 'Benutzeroberfläche bearbeiten',
 'right-editusercssjs' => 'Fremde CSS- und JavaScript-Dateien bearbeiten',
 'right-editusercss' => 'Fremde CSS-Dateien bearbeiten',
 'right-edituserjs' => 'Fremde JavaScript-Dateien bearbeiten',
+'right-editmyusercss' => 'Eigene Benutzer-CSS-Dateien bearbeiten',
+'right-editmyuserjs' => 'Eigene Benutzer-JavaScript-Dateien bearbeiten',
+'right-viewmywatchlist' => 'Eigene Beobachtungsliste ansehen',
+'right-editmywatchlist' => 'Eigene Beobachtungsliste bearbeiten. Einige Aktionen ermöglichen das Hinzufügen von Seiten ohne dieses Recht.',
+'right-viewmyprivateinfo' => 'Eigene private Daten ansehen (beispielsweise E-Mail-Adresse, bürgerlicher Name)',
+'right-editmyprivateinfo' => 'Eigene private Daten bearbeiten (beispielsweise E-Mail-Adresse, bürgerlicher Name)',
+'right-editmyoptions' => 'Eigene Einstellungen bearbeiten',
 'right-rollback' => 'Schnelles Zurücksetzen',
 'right-markbotedits' => 'Schnell zurückgesetzte Bearbeitungen als Bot-Bearbeitung markieren',
 'right-noratelimit' => 'Keine Beschränkung durch Limits',
@@ -1747,12 +1823,19 @@ Diese Information ist öffentlich.',
 'action-userrights-interwiki' => 'die Rechte von Benutzern in anderen Wikis zu ändern',
 'action-siteadmin' => 'die Datenbank zu sperren oder freizugeben',
 'action-sendemail' => 'E-Mails zu senden',
+'action-editmywatchlist' => 'deine Beobachtungsliste zu bearbeiten',
+'action-viewmywatchlist' => 'deine Beobachtungsliste anzusehen',
+'action-viewmyprivateinfo' => 'deine privaten Informationen einzusehen',
+'action-editmyprivateinfo' => 'deine privaten Informationen zu bearbeiten',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|Änderung|Änderungen}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|seit dem letzten Besuch}}',
+'enhancedrc-history' => 'Versionsgeschichte',
 'recentchanges' => 'Letzte Änderungen',
 'recentchanges-legend' => 'Anzeigeoptionen',
 'recentchanges-summary' => 'Auf dieser Seite kannst du die letzten Änderungen in diesem Wiki nachverfolgen.',
+'recentchanges-noresult' => 'Keine Änderungen während des angegebenen Zeitraums entsprechen diesen Kriterien.',
 'recentchanges-feed-description' => 'Verfolge mit diesem Feed die letzten Änderungen in {{SITENAME}}.',
 'recentchanges-label-newpage' => 'Neue Seite',
 'recentchanges-label-minor' => 'Kleine Änderung',
@@ -1791,7 +1874,6 @@ Stand: $4, $5 Uhr.",
 'recentchangeslinked-feed' => 'Änderungen an verlinkten Seiten',
 'recentchangeslinked-toolbox' => 'Änderungen an verlinkten Seiten',
 'recentchangeslinked-title' => 'Änderungen an Seiten, die von „$1“ verlinkt sind',
-'recentchangeslinked-noresult' => 'Im ausgewählten Zeitraum wurden an den verlinkten Seiten keine Änderungen vorgenommen.',
 'recentchangeslinked-summary' => "Diese Spezialseite listet die letzten Änderungen an den verlinkten Seiten auf (bzw. bei Kategorien an den Mitgliedern dieser Kategorie). Seiten auf deiner [[Special:Watchlist|Beobachtungsliste]] sind '''fett''' dargestellt.",
 'recentchangeslinked-page' => 'Seite:',
 'recentchangeslinked-to' => 'Zeige Änderungen auf Seiten, die hierher verlinken',
@@ -1802,7 +1884,7 @@ Stand: $4, $5 Uhr.",
 'reuploaddesc' => 'Abbrechen und zurück zur Hochladen-Seite',
 'upload-tryagain' => 'Geänderte Dateibeschreibung abschicken',
 'uploadnologin' => 'Nicht angemeldet',
-'uploadnologintext' => 'Du musst [[Special:UserLogin|angemeldet]] sein, um Dateien hochladen zu können.',
+'uploadnologintext' => 'Du musst dich $1, um Dateien hochladen zu können.',
 'upload_directory_missing' => 'Das Upload-Verzeichnis ($1) fehlt und konnte durch den Webserver auch nicht erstellt werden.',
 'upload_directory_read_only' => 'Der Webserver hat keine Schreibrechte für das Upload-Verzeichnis ($1).',
 'uploaderror' => 'Fehler beim Hochladen',
@@ -2029,7 +2111,6 @@ Aus Sicherheitsgründen ist img_auth.php deaktiviert.',
 'http-read-error' => 'HTTP-Lesefehler.',
 'http-timed-out' => 'Zeitüberschreitung bei der HTTP-Anfrage.',
 'http-curl-error' => 'Fehler beim Abruf der URL: $1',
-'http-host-unreachable' => 'URL konnte nicht erreicht werden.',
 'http-bad-status' => 'Während der HTTP-Anfrage ist ein Fehler aufgetreten: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2057,6 +2138,10 @@ Aus Sicherheitsgründen ist img_auth.php deaktiviert.',
 'listfiles_size' => 'Größe',
 'listfiles_description' => 'Beschreibung',
 'listfiles_count' => 'Versionen',
+'listfiles-show-all' => 'Alte Bildversionen einschließen',
+'listfiles-latestversion' => 'Aktuelle Version',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nein',
 
 # File description page
 'file-anchor-link' => 'Datei',
@@ -2151,6 +2236,13 @@ Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungs
 'randompage' => 'Zufällige Seite',
 'randompage-nopages' => 'Es sind keine Seiten {{PLURAL:$2|im folgenden Namensraum|in den folgenden Namensräumen}} enthalten: „$1“',
 
+# Random page in category
+'randomincategory' => 'Zufällige Seite einer Kategorie',
+'randomincategory-invalidcategory' => '„$1“ ist kein gültiger Kategorienname.',
+'randomincategory-nopages' => 'Es gibt keine Seiten in [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Zufällige Seite aus der Kategorie: $1 $2',
+'randomincategory-selectcategory-submit' => 'Los',
+
 # Random redirect
 'randomredirect' => 'Zufällige Weiterleitung',
 'randomredirect-nopages' => 'Im Namensraum „$1“ sind keine Weiterleitungen vorhanden.',
@@ -2176,17 +2268,13 @@ Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungs
 'statistics-users-active-desc' => 'Benutzer mit Bearbeitungen {{PLURAL:$1|während der letzten 24 Stunden|während der vergangenen $1 Tage}}',
 'statistics-mostpopular' => 'Meistbesuchte Seiten',
 
-'disambiguations' => 'Seiten die auf Begriffsklärungsseiten verlinken',
-'disambiguationspage' => 'Template:Begriffsklärung',
-'disambiguations-text' => "Die folgenden Seiten enthalten mindestens einen Link zur einer '''Begriffsklärungsseite'''. Stattdessen sollten sie möglicherweise auf die eigentlich gemeinte Seite verlinken.
-
-Eine Seite gilt als Begriffsklärungsseite, wenn sie mindestens eine der auf der Seite [[MediaWiki:Disambiguationspage|Disambiguationspage]] aufgeführten Vorlagen enthält.",
-
 'pageswithprop' => 'Seiten mit einer Seiteneigenschaft',
 'pageswithprop-legend' => 'Seiten mit einer Seiteneigenschaft',
 'pageswithprop-text' => 'Diese Spezialseite listet Seiten auf, die eine bestimmte Seiteneigenschaft verwenden.',
 'pageswithprop-prop' => 'Eigenschaftsname:',
 'pageswithprop-submit' => 'Los',
+'pageswithprop-prophidden-long' => 'Langtexteigenschaftswert versteckt ($1)',
+'pageswithprop-prophidden-binary' => 'Binäreigenschaftswert versteckt ($1)',
 
 'doubleredirects' => 'Doppelte Weiterleitungen',
 'doubleredirectstext' => 'Diese Liste enthält Weiterleitungen, die auf Weiterleitungen verlinken.
@@ -2244,6 +2332,7 @@ Jede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel de
 'mostrevisions' => 'Seiten mit den meisten Versionen',
 'prefixindex' => 'Alle Seiten (mit Präfix)',
 'prefixindex-namespace' => 'Alle Seiten mit Präfix (Namensraum $1)',
+'prefixindex-strip' => 'Präfix in der Liste abschneiden',
 'shortpages' => 'Kurze Seiten',
 'longpages' => 'Lange Seiten',
 'deadendpages' => 'Nicht verlinkende Seiten',
@@ -2259,6 +2348,7 @@ Jede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel de
 'listusers' => 'Benutzerverzeichnis',
 'listusers-editsonly' => 'Zeige nur Benutzer mit Beiträgen',
 'listusers-creationsort' => 'Nach Erstelldatum sortieren',
+'listusers-desc' => 'In absteigender Reihenfolge sortieren',
 'usereditcount' => '$1 {{PLURAL:$1|Bearbeitung|Bearbeitungen}}',
 'usercreated' => '{{GENDER:$3|Erstellt}} am $1 um $2 Uhr',
 'newpages' => 'Neue Seiten',
@@ -2434,10 +2524,9 @@ Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werde
 'unwatchthispage' => 'Nicht mehr beobachten',
 'notanarticle' => 'Keine Seite',
 'notvisiblerev' => 'Version wurde gelöscht',
-'watchnochange' => 'Keine der von dir beobachteten Seiten wurde während des angezeigten Zeitraums bearbeitet.',
 'watchlist-details' => 'Du beobachtest {{PLURAL:$1|eine Seite|$1 Seiten}}, ohne dass Diskussionsseiten gezählt werden.',
-'wlheader-enotif' => '* Der E-Mail-Benachrichtigungsdienst ist aktiviert.',
-'wlheader-showupdated' => "* Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt",
+'wlheader-enotif' => 'Der E-Mail-Benachrichtigungsdienst ist aktiviert.',
+'wlheader-showupdated' => "Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt.",
 'watchmethod-recent' => 'Überprüfen der letzten Bearbeitungen für die Beobachtungsliste',
 'watchmethod-list' => 'Überprüfen der Beobachtungsliste nach letzten Bearbeitungen',
 'watchlistcontains' => 'Deine Beobachtungsliste enthält $1 {{PLURAL:$1|Seite|Seiten}}.',
@@ -2675,7 +2764,7 @@ $1',
 'contributions' => '{{GENDER:$1|Benutzerbeiträge}}',
 'contributions-title' => 'Benutzerbeiträge von „$1“',
 'mycontris' => 'Beiträge',
-'contribsub2' => 'Für $1 ($2)',
+'contribsub2' => 'Von {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Es wurden keine Benutzerbeiträge mit diesen Kriterien gefunden.',
 'uctop' => '(aktuell)',
 'month' => 'und Monat:',
@@ -2830,13 +2919,11 @@ Siehe die [[Special:BlockList|Liste der gesperrten IP-Adressen und Benutzernamen
 'ipb_blocked_as_range' => 'Fehler: Die IP-Adresse $1 wurde als Teil der Bereichssperre $2 indirekt gesperrt. Eine Entsperrung von $1 alleine ist nicht möglich.',
 'ip_range_invalid' => 'Ungültiger IP-Adressbereich.',
 'ip_range_toolarge' => 'Adressbereiche, die größer als /$1 sind, sind nicht erlaubt.',
-'blockme' => 'Sperre mich',
 'proxyblocker' => 'Proxy blocker',
-'proxyblocker-disabled' => 'Diese Funktion ist deaktiviert.',
 'proxyblockreason' => 'Deine IP-Adresse wurde gesperrt, da sie ein offener Proxy ist. Bitte kontaktiere deinen Internet-Provider oder deine Systemadministratoren und informiere sie über dieses mögliche Sicherheitsproblem.',
-'proxyblocksuccess' => 'Erledigt.',
 'sorbsreason' => 'Die IP-Adresse ist in der DNSBL von {{SITENAME}} als offener PROXY gelistet.',
 'sorbs_create_account_reason' => 'Die IP-Adresse ist in der DNSBL von {{SITENAME}} als offener PROXY gelistet. Das Anlegen neuer Benutzer ist nicht möglich.',
+'xffblockreason' => 'Eine IP-Adresse im X-Forwarded-For-Header wurde gesperrt, entweder deine oder die des benutzten Proxyservers. Der ursprüngliche Sperrgrund war: $1',
 'cant-block-while-blocked' => 'Du kannst keine anderen Benutzer sperren, während du selbst gesperrt bist.',
 'cant-see-hidden-user' => 'Der Benutzer, den du versuchst zu sperren, wurde bereits gesperrt und verborgen. Da du das „hideuser“-Recht nicht hast, kannst du die Benutzersperre nicht sehen und nicht bearbeiten.',
 'ipbblocked' => 'Du kannst keine anderen Benutzer sperren oder entsperren, da du selbst gesperrt bist',
@@ -2998,6 +3085,8 @@ Bitte besuche die Seiten [//www.mediawiki.org/wiki/Localisation MediaWiki-Lokali
 'thumbnail-more' => 'vergrößern',
 'filemissing' => 'Datei fehlt',
 'thumbnail_error' => 'Fehler beim Erstellen des Vorschaubildes: $1',
+'thumbnail_error_remote' => 'Fehlermeldung von $1:
+$2',
 'djvu_page_error' => 'DjVu-Seite außerhalb des Seitenbereichs',
 'djvu_no_xml' => 'XML-Daten können für die DjVu-Datei nicht abgerufen werden',
 'thumbnail-temp-create' => 'Die Datei für die temporäre Miniaturansicht konnte nicht erstellt werden',
@@ -3143,20 +3232,15 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 'tooltip-undo' => 'Macht lediglich diese eine Änderung rückgängig und zeigt das Resultat in der Vorschau an, damit in der Zusammenfassungszeile eine Begründung angegeben werden kann.',
 'tooltip-preferences-save' => 'Einstellungen speichern',
 'tooltip-summary' => 'Gib eine kurze Zusammenfassung ein.',
+'tooltip-iwiki' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/* Das folgende CSS wird für alle Benutzeroberflächen geladen. */',
-'standard.css' => '/* Das folgende CSS wird für Benutzer der Klassik-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
-'nostalgia.css' => '/* Das folgende CSS wird für Benutzer der Nostalgie-Benutzeroberfläche geladen. */',
 'cologneblue.css' => '/* Das folgende CSS wird für Benutzer der Kölnisch-Blau-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'monobook.css' => '/* Das folgende CSS wird für Benutzer der MonoBook-Benutzeroberfläche geladen */',
-'myskin.css' => '/* Das folgende CSS wird für Benutzer der MySkin-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
-'chick.css' => '/* Das folgende CSS wird für Benutzer der Küken-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
-'simple.css' => '/* Das folgende CSS wird für Benutzer der Einfach-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'modern.css' => '/* Das folgende CSS wird für Benutzer der Modern-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte MediaWiki:Common.css bearbeiten. */',
 'vector.css' => '/* Das folgende CSS wird für Benutzer der Vector-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'print.css' => '/* Das folgende CSS wird in der Druckausgabe geladen. */',
-'handheld.css' => '/* Das folgende CSS wird für Handheld-Geräte, basierend auf der in $wgHandheldStyle konfigurierten Benutzeroberfläche, geladen. */',
 'noscript.css' => '/* Das folgende CSS wirkt sich für Benutzer aus, die JavaScript deaktiviert haben */',
 'group-autoconfirmed.css' => '/* CSS an dieser Stelle wirkt sich nur auf automatisch bestätigte Benutzer aus */',
 'group-bot.css' => '/* CSS an dieser Stelle wirkt sich nur auf Bots aus */',
@@ -3165,13 +3249,8 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 
 # Scripts
 'common.js' => '/* Das folgende JavaScript wird für alle Benutzer geladen. */',
-'standard.js' => '/* Das folgende JavaScript wird für Benutzer der Klassik-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
-'nostalgia.js' => '/* Das folgende JavaScript wird für Benutzer der Nostalgie-Benutzeroberfläche geladen. */',
 'cologneblue.js' => '/* Das folgende JavaScript wird für Benutzer der Kölnisch-Blau-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'monobook.js' => '/* Das folgende JavaScript wird für Benutzer der Monobook-Benutzeroberfläche geladen. */',
-'myskin.js' => '/* Das folgende JavaScript wird für Benutzer der MySkin-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
-'chick.js' => '/* Das folgende JavaScript wird für Benutzer der Küken-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
-'simple.js' => '/* Das folgende JavaScript wird für Benutzer der Einfach-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'modern.js' => '/* Das folgende JavaScript wird für Benutzer der Modern-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'vector.js' => '/* Das folgende JavaScript wird für Benutzer der Vector-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'group-autoconfirmed.js' => '/* Das folgende JavaScript wird nur für automatisch bestätigte Benutzer geladen. */',
@@ -3252,13 +3331,8 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 'pageinfo-category-files' => 'Anzahl der Dateien',
 
 # Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Kölnisch Blau',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Küken',
-'skinname-simple' => 'Einfach',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -3337,11 +3411,25 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
 'minutes' => '{{PLURAL:$1|$1 Minute|$1 Minuten}}',
 'hours' => '{{PLURAL:$1|1 Stunde|$1 Stunden}}',
 'days' => '{{PLURAL:$1|$1 Tag|$1 Tage}}',
+'weeks' => '{{PLURAL:$1|$1 Woche|$1 Wochen}}',
 'months' => '{{PLURAL:$1|1 Monat|$1 Monate}}',
 'years' => '{{PLURAL:$1|1 Jahr|$1 Jahre}}',
 'ago' => 'vor $1',
 'just-now' => 'gerade eben',
 
+# Human-readable timestamps
+'hours-ago' => 'vor {{PLURAL:$1|einer Stunde|$1 Stunden}}',
+'minutes-ago' => 'vor {{PLURAL:$1|einer Minute|$1 Minuten}}',
+'seconds-ago' => 'vor {{PLURAL:$1|einer Sekunde|$1 Sekunden}}',
+'monday-at' => 'Montag um $1',
+'tuesday-at' => 'Dienstag um $1',
+'wednesday-at' => 'Mittwoch um $1',
+'thursday-at' => 'Donnerstag um $1',
+'friday-at' => 'Freitag um $1',
+'saturday-at' => 'Samstag um $1',
+'sunday-at' => 'Sonntag um $1',
+'yesterday-at' => 'Gestern um $1',
+
 # Bad image list
 'bad_image_list' => 'Format:
 
@@ -3369,7 +3457,7 @@ Weitere werden standardmäßig nicht angezeigt.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breite',
 'exif-imagelength' => 'Höhe',
 'exif-bitspersample' => 'Bits pro Farbkomponente',
@@ -3547,7 +3635,7 @@ Weitere werden standardmäßig nicht angezeigt.
 'exif-originalimageheight' => 'Bildhöhe vor dem Zuschneiden',
 'exif-originalimagewidth' => 'Bildbreite vor dem Zuschneiden',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Unkomprimiert',
 'exif-compression-2' => 'CCITT Gruppe 3 1-dimensionale modifizierte Huffman-Lauflängenkodierung',
 'exif-compression-3' => 'CCITT Gruppe 3 Faxcodierung',
@@ -3956,7 +4044,6 @@ Du kannst auch die [[Special:EditWatchlist|Standardseite]] zum Bearbeiten benutz
 'version-other' => 'Sonstige Erweiterungen',
 'version-mediahandlers' => 'Mediennutzungserweiterungen',
 'version-hooks' => "Schnittstellen ''(Hooks)''",
-'version-extension-functions' => 'Funktionsaufrufe',
 'version-parser-extensiontags' => "Parsererweiterungen ''(Tags)''",
 'version-parser-function-hooks' => "Parsererweiterungen ''(Funktionen)''",
 'version-hook-name' => 'Schnittstellenname',
@@ -3966,6 +4053,7 @@ Du kannst auch die [[Special:EditWatchlist|Standardseite]] zum Bearbeiten benutz
 'version-license' => 'Lizenz',
 'version-poweredby-credits' => "Diese Website nutzt '''[//www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'andere',
+'version-poweredby-translators' => 'Übersetzer von translatewiki.net',
 'version-credits-summary' => 'Wir danken folgenden Personen für ihre Beiträge zu [[Special:Version|MediaWiki]].',
 'version-license-info' => "MediaWiki ist eine Freie Software, d. h. sie kann, gemäß den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.
 
@@ -3981,11 +4069,17 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikelpfad]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skriptpfad]',
 
-# Special:FilePath
-'filepath' => 'Dateipfad',
-'filepath-page' => 'Datei:',
-'filepath-submit' => 'Los',
-'filepath-summary' => 'Mit dieser Spezialseite lässt sich der komplette Pfad der aktuellen Version einer Datei ohne Umweg abfragen. Die angefragte Datei wird direkt dargestellt bzw. mit der verknüpften Anwendung gestartet.',
+# Special:Redirect
+'redirect' => 'Weiterleitung auf Benutzerseite, Seitenversion oder Datei',
+'redirect-legend' => 'Weiterleitung auf eine Benutzerseite, Seitenversion oder Datei',
+'redirect-summary' => 'Diese Spezialseite leitet auf eine Benutzerseite (numerische Benutzerkennung angegeben), Seitenversion (Versionskennung angegeben) oder Datei (Dateiname angegeben) weiter.',
+'redirect-submit' => 'Los',
+'redirect-lookup' => 'Suchen:',
+'redirect-value' => 'Kennung oder Dateiname:',
+'redirect-user' => 'Benutzerseite',
+'redirect-revision' => 'Seitenversion',
+'redirect-file' => 'Datei',
+'redirect-not-exists' => 'Der Wert wurde nicht gefunden',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dateiduplikatsuche',
@@ -4035,6 +4129,7 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
 'tags' => 'Gültige Änderungsmarkierungen',
 'tag-filter' => '[[Special:Tags|Markierungs]]-Filter:',
 'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Markierung|Markierungen}}]]: $2)',
 'tags-title' => 'Markierungen',
 'tags-intro' => 'Diese Seite zeigt alle Markierungen, die für Bearbeitungen verwendet wurden, sowie deren Bedeutung. 
 
@@ -4042,7 +4137,10 @@ Bei entsprechender Einstellung können die Missbrauchfilter beliebige Markierung
 'tags-tag' => 'Markierungsname',
 'tags-display-header' => 'Benennung auf den Änderungslisten',
 'tags-description-header' => 'Vollständige Beschreibung',
+'tags-active-header' => 'Aktiv?',
 'tags-hitcount-header' => 'Markierte Änderungen',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nein',
 'tags-edit' => 'bearbeiten',
 'tags-hitcount' => '$1 {{PLURAL:$1|Änderung|Änderungen}}',
 
@@ -4063,6 +4161,7 @@ Bei entsprechender Einstellung können die Missbrauchfilter beliebige Markierung
 'dberr-problems' => 'Entschuldigung. Diese Seite hat momentan technische Schwierigkeiten.',
 'dberr-again' => 'Warte einige Minuten und versuche dann neu zu laden.',
 'dberr-info' => '(Kann keine Verbindung zum Datenbank-Server herstellen: $1)',
+'dberr-info-hidden' => '(Es konnte keine Verbindung mit dem Datenbankserver hergestellt werden)',
 'dberr-usegoogle' => 'Du könntest in der Zwischenzeit mit Google suchen.',
 'dberr-outofdate' => 'Beachte, dass der Suchindex unserer Inhalte bei Google veraltet sein kann.',
 'dberr-cachederror' => 'Folgendes ist eine Kopie des Caches der angeforderten Seite und kann veraltet sein.',
@@ -4078,6 +4177,9 @@ Bei entsprechender Einstellung können die Missbrauchfilter beliebige Markierung
 'htmlform-submit' => 'Speichern',
 'htmlform-reset' => 'Änderungen rückgängig machen',
 'htmlform-selectorother-other' => 'Andere',
+'htmlform-no' => 'Nein',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Wähle eine Option',
 
 # SQLite database support
 'sqlite-has-fts' => 'Version $1 mit Unterstützung für die Volltextsuche',
@@ -4195,4 +4297,22 @@ Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kom
 # Image rotation
 'rotate-comment' => 'Bild um $1 {{PLURAL:$1|Grad}} im Uhrzeigersinn gedreht',
 
+# Limit report
+'limitreport-title' => 'Parser-Profiling-Daten:',
+'limitreport-cputime' => 'CPU-Zeit-Nutzung',
+'limitreport-cputime-value' => '{{PLURAL:$1|Eine Sekunde|$1 Sekunden}}',
+'limitreport-walltime' => 'Echtzeitnutzung',
+'limitreport-walltime-value' => '{{PLURAL:$1|Eine Sekunde|$1 Sekunden}}',
+'limitreport-ppvisitednodes' => 'Besuchte Knotenanzahl des Präprozessors',
+'limitreport-ppvisitednodes-value' => '$1/$2',
+'limitreport-ppgeneratednodes' => 'Erzeugte Knotenanzahl des Präprozessors',
+'limitreport-ppgeneratednodes-value' => '$1/$2',
+'limitreport-postexpandincludesize' => 'Einbindungsgröße nach dem Expandieren',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|Byte|Bytes}}',
+'limitreport-templateargumentsize' => 'Vorlagenargumentgröße',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|Byte|Bytes}}',
+'limitreport-expansiondepth' => 'Höchste Expansionstiefe',
+'limitreport-expansiondepth-value' => '$1/$2',
+'limitreport-expensivefunctioncount' => 'Anzahl aufwändiger Parserfunktionen',
+
 );
diff --git a/languages/messages/MessagesDe_at.php b/languages/messages/MessagesDe_at.php
index 5e185b6e..cdd2bb06 100644
--- a/languages/messages/MessagesDe_at.php
+++ b/languages/messages/MessagesDe_at.php
@@ -19,11 +19,11 @@ $fallback = 'de';
 
 $messages = array(
 # Dates
-'january' => 'Jänner',
-'february' => 'Februar',
-'december' => 'Dezember',
-'january-gen' => 'Jänners',
-'february-gen' => 'Febers',
-'jan' => 'Jän',
+'january'      => 'Jänner',
+'february'     => 'Februar',
+'december'     => 'Dezember',
+'january-gen'  => 'Jänners',
+'february-gen' => 'Februars',
+'jan'          => 'Jän',
 
 );
diff --git a/languages/messages/MessagesDe_ch.php b/languages/messages/MessagesDe_ch.php
index e293a784..a4fabf95 100644
--- a/languages/messages/MessagesDe_ch.php
+++ b/languages/messages/MessagesDe_ch.php
@@ -24,7 +24,7 @@ $messages = array(
 'tog-hideminor' => 'Kleine Änderungen in den «Letzten Änderungen» ausblenden',
 'tog-hidepatrolled' => 'Kontrollierte Änderungen in den «Letzten Änderungen» ausblenden',
 'tog-newpageshidepatrolled' => 'Kontrollierte Seiten bei den «Neuen Seiten» ausblenden',
-'tog-usenewrc' => 'Seitenbezogene Gruppierung in den «Letzten Änderungen» und auf der Beobachtungsliste (benötigt JavaScript)',
+'tog-usenewrc' => 'Erweiterte Darstellung der «Letzten Änderungen» (benötigt JavaScript)',
 'tog-minordefault' => 'Eigene Änderungen standardmässig als minim markieren',
 'tog-externaleditor' => 'Externen Editor standardmässig nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
 'tog-externaldiff' => 'Externes Programm standardmässig für Versionsunterschiede nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
@@ -45,9 +45,9 @@ $messages = array(
 'dberrortext' => 'Es ist ein Datenbankfehler aufgetreten.
 Der Grund kann ein Programmierfehler sein.
 Die letzte Datenbankabfrage lautete:
-<blockquote><code>$1</code></blockquote>
-aus der Funktion «<code>$2</code>».
-Die Datenbank meldete den Fehler «<samp>$3: $4</samp>».',
+<blockquote><tt>$1</tt></blockquote>
+aus der Funktion «<tt>$2</tt>».
+Die Datenbank meldete den Fehler «<tt>$3: $4</tt>».',
 'dberrortextcl' => 'Es gab einen Syntaxfehler in der Datenbankabfrage.
 Die letzte Datenbankabfrage lautete: «$1» aus der Funktion «<tt>$2</tt>».
 Die Datenbank meldete den Fehler: «<tt>$3: $4</tt>».',
@@ -71,8 +71,8 @@ Möglicherweise wurde sie bereits von jemand anderem gelöscht.',
 'actionthrottledtext' => 'Im Rahmen einer Anti-Spam-Massnahme oder aufgrund eines Missbrauchsfilters kann diese Aktion in einem kurzen Zeitabstand nur begrenzt oft ausgeführt werden. Diese Grenze hast du überschritten.
 Bitte versuche es in ein paar Minuten erneut.',
 'editinginterface' => "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.
-Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche dieses Wikis aus.
-Nutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.",
+Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche aus.
+Ziehe bitte im Fall von Übersetzungen in Betracht, diese bei [//translatewiki.net/wiki/Main_Page?setlang=de-ch translatewiki.net], der Lokalisierungsplattform für MediaWiki, durchzuführen.",
 'titleprotected' => "Eine Seite mit diesem Namen kann nicht angelegt werden.
 Die Sperre wurde durch [[User:$1|$1]] mit der Begründung ''«$2»'' eingerichtet.",
 'filereadonlyerror' => 'Die Datei «$1» kann nicht verändert werden, da auf das Dateirepositorium «$2» nur Lesezugriff möglich ist.
@@ -86,35 +86,29 @@ Der Administrator, der den Schreibzugriff sperrte, gab folgenden Grund an: «$3
 'nosuchusershort' => 'Der Benutzername «$1» ist nicht vorhanden. Bitte überprüfe die Schreibweise.',
 'passwordremindertext' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat ein neues Passwort für die Anmeldung bei {{SITENAME}} ($4) angefordert.
 
-Das automatisch generierte Passwort für Benutzer «$2» lautet nun: $3
+Das automatisch generierte Passwort für Benutzer „$2“ lautet nun: $3
 
 Falls du dies wirklich gewünscht hast, solltest du dich jetzt anmelden und das Passwort ändern.
 Das neue Passwort ist {{PLURAL:$5|1 Tag|$5 Tage}} gültig.
 
-Bitte ignoriere dieses E-Mail, falls du es nicht selbst angefordert hast. Das alte Passwort bleibt weiterhin gültig.',
+Bitte ignoriere dieses E-Mail, falls du sie nicht selbst angefordert hast. Das alte Passwort bleibt weiterhin gültig.',
 'noemail' => '{{GENDER:$1|Benutzer|Benutzerin|Benutzer}} «$1» hat keine E-Mail-Adresse angegeben.',
 'passwordsent' => 'Ein neues, temporäres Passwort wurde an die E-Mail-Adresse von Benutzer «$1» gesandt.
 Bitte melde dich damit an, sobald du es erhalten hast. Das alte Passwort bleibt weiterhin gültig.',
 'eauthentsent' => 'Ein Bestätigungs-E-Mail wurde an die angegebene Adresse verschickt.
 
 Bevor ein E-Mail von anderen Benutzern über die E-Mail-Funktion empfangen werden kann, muss die Adresse und ihre tatsächliche Zugehörigkeit zu diesem Benutzerkonto erst bestätigt werden. Bitte befolge die Hinweise im Bestätigungs-E-Mail.',
-'throttled-mailpassword' => 'Es wurde innerhalb der letzten {{PLURAL:$1|Stunde|$1 Stunden}} bereits ein Passwortzurücksetzungs-E-Mail angefordert. Um einen Missbrauch der Funktion zu verhindern, kann nur {{PLURAL:$1|einmal pro Stunde|alle $1 Stunden}} ein Passwortzurücksetzungs-E-Mail angefordert werden.',
 'mailerror' => 'Fehler beim Senden des E-Mails: $1',
 'createaccount-text' => 'Es wurde für dich ein Benutzerkonto «$2» auf {{SITENAME}} ($4) erstellt. Das automatisch generierte Passwort für «$2» ist «$3». Du solltest dich nun anmelden und das Passwort ändern.
 
 Falls das Benutzerkonto irrtümlich angelegt wurde, kannst du diese Nachricht ignorieren.',
 
-# Email sending
+# E-mail sending
 'user-mail-no-addy' => 'Versuchte ein E-Mail ohne Angabe einer E-Mail-Adresse zu versenden',
-'user-mail-no-body' => 'Es wurde versucht, ein E-Mail mit einem leeren oder zu kurzen Textkörper zu versenden.',
 
 # Change password dialog
 'resetpass_announce' => 'Anmeldung mit dem per E-Mail zugesandten Code. Um die Anmeldung abzuschliessen, musst du jetzt ein neues Passwort wählen.',
 
-# Special:PasswordReset
-'passwordreset-emailsent' => 'Ein Passwortzurücksetzungs-E-Mail wurde versandt.',
-'passwordreset-emailsent-capture' => 'Ein Passwortzurücksetzungs-E-Mail wurde versandt, das unten angezeigt wird.',
-
 # Edit pages
 'missingsummary' => "'''Hinweis:''' Du hast keine Zusammenfassung angegeben. Wenn du erneut auf «{{int:savearticle}}» klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
 'missingcommentheader' => "'''Achtung:''' Du hast kein Betreff/Überschrift eingegeben. Wenn du erneut auf «{{int:savearticle}}» klickst, wird deine Bearbeitung ohne Überschrift gespeichert.",
@@ -161,7 +155,6 @@ Das Passwort für dieses neue Benutzerkonto kann auf der Spezialseite «[[Specia
 'userjsyoucanpreview' => "'''Tipp:''' Benutze den «{{int:showpreview}}»-Button, um dein neues JavaScript vor dem Speichern zu testen.",
 'userinvalidcssjstitle' => "'''Achtung:''' Die Benutzeroberfläche «$1» existiert nicht. Bedenke, dass benutzerspezifische .css- und .js-Seiten mit einem Kleinbuchstaben anfangen müssen, also beispielsweise ''{{ns:user}}:Mustermann/vector.css'' an Stelle von ''{{ns:user}}:Mustermann/Vector.css''.",
 'editing' => 'Bearbeiten von «$1»',
-'creating' => 'Erstellen von «$1»',
 'editingsection' => 'Bearbeiten von «$1» (Abschnitt)',
 'editingcomment' => 'Bearbeiten von «$1» (Neuer Abschnitt)',
 'explainconflict' => "Jemand anders hat diese Seite geändert, nachdem du angefangen hast sie zu bearbeiten.
@@ -201,7 +194,7 @@ Du hast darauf keinen Zugriff.',
 'mergehistory-comment' => '«[[:$1]]» vereinigt nach «[[:$2]]»: $3',
 
 # Diffs
-'history-title' => '$1: Versionsgeschichte',
+'history-title' => 'Versionsgeschichte von «$1»',
 
 # Search results
 'searchresults-title' => 'Suchergebnisse für «$1»',
@@ -230,6 +223,10 @@ Du hast darauf keinen Zugriff.',
 'right-override-export-depth' => 'Exportiere Seiten einschliesslich verlinkter Seiten bis zu einer Tiefe von 5',
 'right-passwordreset' => 'Passwort eines Benutzers zurücksetzen und das dazu verschickte E-Mail einsehen',
 
+# User rights log
+'rightslogentry' => 'änderte die Benutzerrechte für «$1» von «$2» auf «$3»',
+'rightslogentry-autopromote' => 'wurde automatisch von «$2» nach «$3» zugeordnet',
+
 # Recent changes
 'rc_categories' => 'Nur Seiten aus den Kategorien (getrennt mit «|»):',
 'rc-old-title' => 'ursprünglich erstellt als «$1»',
@@ -277,7 +274,7 @@ Bitte gib der Datei einen Namen, der den Inhalt besser beschreibt.",
 'upload-unknown-size' => 'Unbekannte Grösse',
 
 # File backend
-'backend-fail-maxsize' => 'Die Datei $1 konnte nicht gespeichert werden, da sie grösser als {{PLURAL:$2|ein Byte|$2 Bytes}} ist.',
+'backend-fail-maxsize' => 'Die Datei $1 konnte nicht erstellt werden, da sie grösser als {{PLURAL:$2|ein Byte|$2 Byte}} ist.',
 'backend-fail-readonly' => 'Das Speicher-Backend «$1» befindet sich derzeit im Lesemodus. Der angegebene Grund lautet: «$2»',
 'backend-fail-synced' => 'Die Datei «$1» befindet sich, innerhalb des internen Speicher-Backends, in einem inkonsistenten Zustand.',
 'backend-fail-connect' => 'Es konnte keine Verbindung zum Speicher-Backend «$1» hergestellt werden.',
@@ -349,11 +346,11 @@ Die Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seite
 'allpages-bad-ns' => 'Der Namensraum «$1» ist in {{SITENAME}} nicht vorhanden.',
 
 # Special:LinkSearch
-'linksearch-text' => 'Diese Spezialseite ermöglicht die Suche nach Seiten, in denen bestimmte Weblinks enthalten sind. Dabei können Platzhalter wie beispielsweise <code>*.beispiel.ch</code> benutzt werden. Es muss mindestens eine Top-Level-Domain, z. B. «*.org». angegeben werden. <br />{{PLURAL:$2|Unterstütztes Protokoll|Unterstützte Protokolle}}: <code>$1</code> (Standard ist http, falls kein Protokoll angegeben ist.)',
+'linksearch-text' => 'Diese Spezialseite ermöglicht die Suche nach Seiten, in denen bestimmte Weblinks enthalten sind. Dabei können Platzhalter wie beispielsweise <code>*.beispiel.ch</code> benutzt werden. Es muss mindestens eine Top-Level-Domain, z. B. «*.org». angegeben werden. <br />Unterstützte Protokolle: <code>$1</code> (Diese bitte nicht bei der Suchanfrage angeben.)',
 
-# Email user
-'emailpagetext' => 'Du kannst {{GENDER:$1|dem Benutzer|der Benutzerin}} mit dem unten stehenden Formular ein E-Mail senden.
-Als Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellungen]] eingetragen, damit {{GENDER:$1|der Benutzer|die Benutzerin}} dir direkt antworten kann.',
+# E-mail user
+'emailpagetext' => 'Du kannst dem Benutzer mit dem unten stehenden Formular ein E-Mail senden.
+Als Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellungen]] eingetragen, damit der Benutzer dir antworten kann.',
 'defemailsubject' => '{{SITENAME}} - E-Mail von Benutzer «$1»',
 'emailnotarget' => 'Nicht vorhandener oder ungültiger Benutzername für den Empfang eines E-Mails.',
 'emailccme' => 'Sende eine Kopie des E-Mails an mich',
@@ -362,7 +359,7 @@ Als Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellun
 
 # Watchlist
 'addedwatchtext' => 'Die Seite «[[:$1]]» wurde zu deiner [[Special:Watchlist|Beobachtungsliste]] hinzugefügt.
-Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werden dort gelistet.',
+Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werden dort gelistet und die Seite wird in der [[Special:RecentChanges|Liste der letzten Änderungen]] in Fettschrift angezeigt.',
 'removedwatchtext' => 'Die Seite «[[:$1]]» wurde von deiner [[Special:Watchlist|Beobachtungsliste]] entfernt.',
 'iteminvalidname' => 'Problem mit dem Eintrag «$1», ungültiger Name.',
 
@@ -390,7 +387,7 @@ Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werde
 'protect-locked-blocked' => "Du kannst den Seitenschutz nicht ändern, da dein Benutzerkonto gesperrt ist. Hier sind die aktuellen Seitenschutz-Einstellungen der Seite '''«$1»:'''",
 'protect-locked-dblock' => "Die Datenbank ist gesperrt, der Seitenschutz kann daher nicht geändert werden. Hier sind die aktuellen Seitenschutz-Einstellungen der Seite '''«$1»:'''",
 'protect-locked-access' => "Dein Benutzerkonto verfügt nicht über die notwendigen Rechte zur Änderung des Seitenschutzes. Hier sind die aktuellen Seitenschutzeinstellungen der Seite '''«$1»:'''",
-'protect-fallback' => 'Nur Benutzern mit der «$1»-Berechtigung erlauben.',
+'protect-fallback' => 'Es wird die «$1»-Berechtigung benötigt.',
 'minimum-size' => 'Mindestgrösse',
 'maximum-size' => 'Maximalgrösse:',
 
@@ -511,39 +508,36 @@ Weitere werden standardmässig nicht angezeigt.
 
 'exif-isospeedratings-overflow' => 'Grösser als 65535',
 
-# Email address confirmation
+# E-mail address confirmation
 'confirmemail_text' => '{{SITENAME}} erfordert, dass du deine E-Mail-Adresse bestätigst (authentifizierst), bevor du die erweiterten E-Mail-Funktionen benutzen kannst. Klicke bitte auf die unten stehende, mit «Bestätigungscode zuschicken» beschriftete Schaltfläche, damit ein automatisch erstelltes E-Mail an die angegebene Adresse geschickt wird. Dieses E-Mail enthält eine Web-Adresse mit einem Bestätigungscode. Indem du diese Webseite in deinem Webbrowser öffnest, bestätigst du, dass die angegebene E-Mail-Adresse korrekt und gültig ist.',
 'confirmemail_pending' => 'Es wurde dir bereits ein Bestätigungscode per E-Mail zugeschickt.
 Wenn du dein Benutzerkonto erst vor kurzem erstellt hast, warte bitte noch ein paar Minuten auf das E-Mail, bevor du einen neuen Code anforderst.',
-'confirmemail_sent' => 'Das Bestätigungs-E-Mail wurde verschickt.',
-'confirmemail_sendfailed' => '{{SITENAME}} konnte das Bestätigungs-E-Mail nicht an dich versenden.
-Bitte prüfe die E-Mail-Adresse auf ungültige Zeichen.
-
-Rückmeldung des Mailservers: $1',
 'confirmemail_body' => 'Hallo,
 
-jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat das Benutzerkonto «$2» bei {{SITENAME}} registriert.
+jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat das Benutzerkonto «$2» in {{SITENAME}} registriert.
 
-Um die E-Mail-Funktionen von {{SITENAME}} (wieder) zu aktivieren und um zu bestätigen,
-dass dieses Benutzerkonto wirklich zu deiner E-Mail-Adresse und damit zu dir gehört, öffne bitte folgenden Link in deinem Browser:
+Um die E-Mail-Funktion von {{SITENAME}} (wieder) zu aktivieren und um zu bestätigen,
+dass dieses Benutzerkonto wirklich zu deiner E-Mail-Adresse und damit zu dir gehört, öffne bitte die folgende Web-Adresse:
 
 $3
 
+Sollte die vorstehende Adresse in deinem E-Mail-Programm über mehrere Zeilen gehen, musst du sie allenfalls per Hand in die Adresszeile deines Web-Browsers einfügen.
+
 Wenn du das genannte Benutzerkonto *nicht* registriert hast, folge diesem Link, um den Bestätigungsprozess abzubrechen:
 
 $5
 
-Dieser Bestätigungscode ist gültig bis zum $6, $7 Uhr.',
+Dieser Bestätigungscode ist gültig bis $6, $7 Uhr.',
 'confirmemail_body_changed' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst,
-hat die E-Mail-Adresse des Benutzerkontos «$2» zu dieser Adresse bei {{SITENAME}} geändert.
+hat die E-Mail-Adresse des Benutzerkontos «$2» zu dieser Adresse auf {{SITENAME}} geändert.
 
-Um zu bestätigen, dass dieses Benutzerkonto wirklich dir gehört,
-und um die E-Mail-Features bei {{SITENAME}} zu reaktivieren, öffne diesen Link in deinem Browser:
+Um zu bestätigen, dass dieses Benutzerkonto wirklich dir gehört
+und um die E-Mail-Features auf {{SITENAME}} zu reaktivieren, öffne diesen Link in deinem Browser:
 
 $3
 
 Falls das Konto *nicht* dir gehört, folge diesem Link,
-um die E-Mail-Bestätigung abzubrechen:
+um die E-Mail-Adress-Bestätigung abzubrechen:
 
 $5
 
@@ -568,7 +562,7 @@ Dieser Bestätigungscode ist gültig bis $4.',
 'autosumm-new' => 'Die Seite wurde neu angelegt: «$1»',
 
 # Live preview
-'livepreview-error' => 'Verbindung nicht möglich: $1 «$2». Bitte die normale Vorschau benutzen.',
+'livepreview-error' => 'Verbindung nicht möglich: $1 «$1». Bitte die normale Vorschau benutzen.',
 
 # Watchlist editor
 'watchlistedit-normal-explain' => 'Dies sind die Einträge deiner Beobachtungsliste. Um Einträge zu entfernen, markiere die Kästchen neben den Einträgen und klicke am Ende der Seite auf «{{int:Watchlistedit-normal-submit}}». Du kannst deine Beobachtungsliste auch im [[Special:EditWatchlist/raw|Listenformat bearbeiten]].',
diff --git a/languages/messages/MessagesDe_formal.php b/languages/messages/MessagesDe_formal.php
index ad7e1c9f..31a782a0 100644
--- a/languages/messages/MessagesDe_formal.php
+++ b/languages/messages/MessagesDe_formal.php
@@ -71,8 +71,12 @@ Nutzen Sie bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungspro
 # Login and logout pages
 'logouttext' => "'''Sie sind nun abgemeldet.'''
 
-Sie können {{SITENAME}} jetzt anonym weiternutzen, oder sich erneut unter demselben oder einem anderen Benutzernamen <span class='plainlinks'>[$1 anmelden]</span>.
+Sie können {{SITENAME}} jetzt anonym weiternutzen, oder sich erneut unter demselben oder einem anderen Benutzernamen [[Special:UserLogin|anmelden]].
 Beachten Sie, dass einige Seiten noch anzeigen können, dass Sie angemeldet sind, solange Sie nicht Ihren Browsercache geleert haben.",
+'welcomecreation' => '== Willkommen, $1! ==
+
+Ihr Benutzerkonto wurde soeben eingerichtet.
+Vergessen Sie nicht, Ihre [[Special:Preferences|Einstellungen]] anzupassen.',
 'yourdomainname' => 'Ihre Domain:',
 'password-change-forbidden' => 'Sie können auf diesem Wiki keine Passwörter ändern.',
 'externaldberror' => 'Entweder es liegt ein Fehler bei der externen Authentifizierung vor oder Sie dürfen Ihr externes Benutzerkonto nicht aktualisieren.',
@@ -130,21 +134,16 @@ Bitte warten Sie, bevor Sie es erneut probieren.',
 Möglicherweise haben Sie Ihr Passwort bereits erfolgreich geändert oder ein neues temporäres Passwort beantragt.',
 
 # Special:PasswordReset
-'passwordreset-text' => 'Bitte dieses Formular ausfüllen, um Ihr Passwort zurückzusetzen.',
+'passwordreset-text' => 'Bitte dieses Formular ausfüllen, um per E-Mail eine Erinnerung zu den Anmeldeinformationen Ihres Benutzerkontos zu erhalten.',
 'passwordreset-pretext' => '{{PLURAL:$1||Geben Sie eines der folgenden Daten ein.}}',
-'passwordreset-capture-help' => 'Wenn Sie dieses Kästchen ankreuzen, wird die E-Mail-Nachricht mit dem temporären Passwort sowohl Ihnen angezeigt als auch dem Benutzer zugesandt.',
-'passwordreset-emailtext-ip' => 'Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat eine Zurücksetzung Ihres
-Passworts bei {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}}
-mit dieser E-Mail-Adresse verknüpft:
+'passwordreset-capture-help' => 'Sofern Sie dieses Kästchen ankreuzen, wird die E-Mail-Nachricht mit dem temporären Passwort, sowohl Ihnen angezeigt, als auch dem Benutzer zugesandt.',
+'passwordreset-emailtext-ip' => 'Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat eine Erinnerung an Ihre Benutzerkonteninformationen für {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:
 
 $2
 
 {{PLURAL:$3|Dieses temporäre Passwort läuft|Diese temporären Passwörter laufen}} innerhalb von {{PLURAL:$5|einem Tag|$5 Tagen}} ab.
-Sie sollten sich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese
-Anfrage getätigt hat oder Sie sich wieder an Ihr ursprüngliches Passwort erinnern können und es nicht länger
-ändern möchten, können Sie diese Nachricht ignorieren und weiterhin Ihr altes
-Passwort benutzen.',
-'passwordreset-emailtext-user' => 'Benutzer $1 bei {{SITENAME}} hat eine Zurücksetzung Ihres Passworts bei {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:
+Sie sollten sich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese Anfrage getätigt hat oder Sie sich wieder an Ihr ursprüngliches Passwort erinnern können und es nicht länger ändern möchten, können Sie diese Nachricht ignorieren und weiterhin Ihr altes Passwort benutzen.',
+'passwordreset-emailtext-user' => 'Benutzer $1 auf {{SITENAME}} hat eine Erinnerung an Ihre Benutzerkonteninformationen für {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:
 
 $2
 
@@ -158,7 +157,7 @@ $2
 'sig_tip' => 'Ihre Signatur mit Zeitstempel',
 
 # Edit pages
-'anoneditwarning' => "Sie bearbeiten diese Seite unangemeldet. Wenn Sie sie abspeichern, wird Ihre aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
+'anoneditwarning' => "Sie bearbeiten diese Seite unangemeldet. Wenn Sie sie speichern, wird Ihre aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
 'missingsummary' => "'''Hinweis:''' Sie haben keine Zusammenfassung angegeben. Wenn Sie erneut auf „{{int:savearticle}}“ klicken, wird Ihre Änderung ohne Zusammenfassung übernommen.",
 'missingcommenttext' => 'Ihr Abschnitt enthält keinen Text.',
 'missingcommentheader' => "'''Achtung:''' Sie haben kein Betreff/Überschrift eingegeben. Wenn Sie erneut auf „{{int:savearticle}}“ klicken, wird Ihre Bearbeitung ohne Überschrift gespeichert.",
@@ -452,10 +451,10 @@ Bitte prüfen Sie, ob sie korrekt von der Quelle übertragen wurde.',
 'cachedspecial-viewing-cached-ttl' => 'Sie sehen die gecachte Version dieser Seite, die bis zu $1 alt sein kann.',
 'cachedspecial-viewing-cached-ts' => 'Sie sehen die gecachte Version dieser Seite, die möglicherweise nicht aktuell ist.',
 
-# Email user
+# E-mail user
 'mailnologintext' => 'Sie müssen [[Special:UserLogin|angemeldet sein]] und eine bestätigte E-Mail-Adresse in Ihren [[Special:Preferences|Einstellungen]] eingetragen haben, um anderen Benutzern E-Mails schicken zu können.',
-'emailpagetext' => 'Sie können {{GENDER:$1|dem Benutzer|der Benutzerin}} mit dem unten stehenden Formular eine E-Mail senden.
-Als Absender wird die E-Mail-Adresse aus Ihren [[Special:Preferences|Einstellungen]] eingetragen, damit {{GENDER:$1|der Benutzer|die Benutzerin}} Ihnen direkt antworten kann.',
+'emailpagetext' => 'Sie könnent dem Benutzer mit dem unten stehenden Formular eine E-Mail senden.
+Als Absender wird die E-Mail-Adresse aus ihren [[Special:Preferences|Einstellungen]] eingetragen, damit der Benutzer Ihnen antworten kann.',
 'emailccsubject' => 'Kopie Ihrer Nachricht an $1: $2',
 'emailsenttext' => 'Ihre E-Mail wurde verschickt.',
 
@@ -466,7 +465,8 @@ Als Absender wird die E-Mail-Adresse aus Ihren [[Special:Preferences|Einstellung
 'watchnologintext' => 'Sie müssen [[Special:UserLogin|angemeldet]] sein, um Ihre Beobachtungsliste bearbeiten zu können.',
 'addedwatchtext' => 'Die Seite „[[:$1]]“ wurde zu Ihrer [[Special:Watchlist|Beobachtungsliste]] hinzugefügt.
 
-Spätere Änderungen an dieser Seite und der dazugehörigen Diskussionsseite werden dort gelistet.',
+Spätere Änderungen an dieser Seite und der dazugehörigen Diskussionsseite werden dort gelistet und
+in der Übersicht der [[Special:RecentChanges|letzten Änderungen]] in Fettschrift dargestellt.',
 'removedwatchtext' => 'Die Seite „[[:$1]]“ wurde von Ihrer [[Special:Watchlist|Beobachtungsliste]] entfernt.',
 'watchnochange' => 'Keine der von Ihnen beobachteten Seiten wurde während des angezeigten Zeitraums bearbeitet.',
 'watchlist-details' => 'Sie beobachten {{PLURAL:$1|1 Seite|$1 Seiten}}.',
@@ -474,7 +474,11 @@ Spätere Änderungen an dieser Seite und der dazugehörigen Diskussionsseite wer
 
 'enotif_body' => 'Hallo $WATCHINGUSERNAME,
 
-$PAGEINTRO $NEWPAGE
+die {{SITENAME}}-Seite „$PAGETITLE“ wurde von $PAGEEDITOR am $PAGEEDITDATE um $PAGEEDITTIME Uhr $CHANGEDORCREATED.
+
+Aktuelle Version: $PAGETITLE_URL
+
+$NEWPAGE
 
 Zusammenfassung des Bearbeiters: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -482,17 +486,16 @@ Kontakt zum Bearbeiter:
 E-Mail: $PAGEEDITOR_EMAIL
 Wiki: $PAGEEDITOR_WIKI
 
-Bei weiterer Aktivität auf der Seite werden Ihnen so lange keine weiteren Benachrichtigungs-E-Mails gesendet, bis Sie die Seite wieder besucht haben.
-Auf Ihrer Beobachtungsliste können Sie alle Benachrichtigungsmarkierungen zusammen zurücksetzen.
+Es werden Ihnen solange keine weiteren Benachrichtigungs-E-Mails gesendet, bis Sie die Seite wieder besucht haben. Auf Ihrer Beobachtungsliste können Sie alle Benachrichtigungsmarkierungen zusammen zurücksetzen.
 
-Ihr freundliches {{SITENAME}}-Benachrichtigungssystem
+             Das freundliche {{SITENAME}}-Benachrichtigungssystem
 
 --
-Um die Einstellungen der E-Mail-Benachrichtigung anzupassen, besuchen Sie {{canonicalurl:{{#special:Preferences}}}}.
+Um die Einstellungen der E-Mail-Benachrichtigung anzupassen, besuchen Sie {{canonicalurl:{{#special:Preferences}}}}
 
-Um die Einstellungen Ihrer Beobachtungsliste anzupassen, besuchen Sie {{canonicalurl:{{#special:EditWatchlist}}}}.
+Um die Einstellungen Ihrer Beobachtungsliste anzupassen, besuchen Sie {{canonicalurl:{{#special:EditWatchlist}}}}
 
-Um diese Seite von Ihrer Beobachtungsliste zu entfernen, besuchen Sie $UNWATCHURL.
+Um diese Seite von Ihrer Beobachtungsliste zu entfernen, besuchen Sie $UNWATCHURL
 
 Rückmeldungen und weitere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
@@ -551,22 +554,22 @@ Bitte geben Sie den Grund für die Sperre an.',
 'movepagetext' => "Mit untenstehendem Formular können Sie eine Seite umbenennen, indem Sie sie mitsamt allen Versionen auf einen neuen Titel verschieben.
 Der alte Titel wird danach zum neuen weiterleiten.
 Sie können Weiterleitungen, die auf den Originaltitel verlinken, automatisch korrigieren lassen.
-Stellen Sie sicher, dass Sie im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfen.
+Stellen Sie sicher, dass Sie im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|kaputten Weiterleitungen]] überprüfen.
 Sie sind dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.
 
-Die Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, letztere ist eine Weiterleitung ohne Versionsgeschichte.
-Dies bedeutet, dass Sie die Umbenennung rückgängig machen können, sofern Sie einen Fehler gemacht haben. Sie können hingegen keine existierende Seite überschreiben.
+Die Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist leer oder eine Weiterleitung ohne Versionsgeschichte.
+Dies bedeutet, dass Sie die Umbenennung rückgängig machen können, sofern Sie einen Fehler gemacht haben. Sie können hingegen keine Seite überschreiben.
 
 '''Warnung!'''
 Die Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.
 Sie sollten daher die Konsequenzen verstanden haben, bevor Sie jetzt fortfahren.",
 'movepagetext-noredirectfixer' => "Mit untenstehendem Formular können Sie eine Seite umbenennen, indem Sie sie mitsamt allen Versionen auf einen neuen Titel verschieben.
 Der alte Titel wird danach zum neuen weiterleiten.
-Stellen Sie sicher, dass Sie im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfen.
+Stellen Sie sicher, dass Sie im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|kaputten Weiterleitungen]] überprüfen.
 Sie sind dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.
 
-Die Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist eine Weiterleitung ohne Versionsgeschichte.
-Dies bedeutet, dass Sie die Umbenennung rückgängig machen können, sofern Sie einen Fehler gemacht haben. Sie können hingegen keine existierende Seite überschreiben.
+Die Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist leer oder eine Weiterleitung ohne Versionsgeschichte.
+Dies bedeutet, dass Sie die Umbenennung rückgängig machen können, sofern Sie einen Fehler gemacht haben. Sie können hingegen keine Seite überschreiben.
 
 '''Warnung!'''
 Die Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.
@@ -642,7 +645,7 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 'mediawarning' => "'''Warnung:''' Dieser Dateityp kann böswilligen Programmcode enthalten.
 Durch das Herunterladen und Öffnen der Datei kann Ihr Computer beschädigt werden.",
 
-# Email address confirmation
+# E-mail address confirmation
 'confirmemail_noemail' => 'Sie haben keine gültige E-Mail-Adresse in Ihren [[Special:Preferences|persönlichen Einstellungen]] eingetragen.',
 'confirmemail_text' => '{{SITENAME}} erfordert, dass Sie Ihre E-Mail-Adresse bestätigen (authentifizieren), bevor Sie die erweiterten E-Mail-Funktionen benutzen können. Klicken Sie bitte auf die unten stehende, mit „Bestätigungscode zuschicken“ beschriftete Schaltfläche, damit eine automatisch erstellte E-Mail an die angegebene Adresse geschickt wird. Diese E-Mail enthält eine Web-Adresse mit einem Bestätigungscode. Indem Sie diese Webseite in Ihrem Webbrowser öffnen, bestätigen Sie, dass die angegebene E-Mail-Adresse korrekt und gültig ist.',
 'confirmemail_pending' => 'Es wurde Ihnen bereits ein Bestätigungscode per E-Mail zugeschickt.
@@ -659,18 +662,20 @@ Rückmeldung des Mailservers: $1',
 'confirmemail_error' => 'Es gab einen Fehler bei der Bestätigung Ihrer E-Mail-Adresse.',
 'confirmemail_body' => 'Hallo,
 
-jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat das Benutzerkonto „$2“ bei {{SITENAME}} registriert.
+jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat das Benutzerkonto „$2“ in {{SITENAME}} registriert.
 
-Um die E-Mail-Funktionen von {{SITENAME}} (wieder) zu aktivieren und um zu bestätigen,
-dass dieses Benutzerkonto wirklich zu Ihrer E-Mail-Adresse und damit zu Ihnen gehört, öffnen Sie bitte folgenden Link in Ihrem Browser:
+Um die E-Mail-Funktion von {{SITENAME}} (wieder) zu aktivieren und um zu bestätigen,
+dass dieses Benutzerkonto wirklich zu Ihrer E-Mail-Adresse und damit zu Ihnen gehört, öffnen Sie bitte die folgende Web-Adresse:
 
 $3
 
+Sollte die vorstehende Adresse in Ihrem E-Mail-Programm über mehrere Zeilen gehen, müssen Sie diese eventuell per Hand in die Adresszeile Ihres Web-Browsers einfügen.
+
 Wenn Sie das genannte Benutzerkonto *nicht* registriert haben, folgen Sie diesem Link, um den Bestätigungsprozess abzubrechen:
 
 $5
 
-Dieser Bestätigungscode ist gültig bis zum $6, $7 Uhr.',
+Dieser Bestätigungscode ist gültig bis $6, $7 Uhr.',
 'confirmemail_body_set' => 'Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst,
 hat die E-Mail-Adresse des Benutzerkontos „$2“ auf {{SITENAME}} zu dieser E-Mail-Adresse abgeändert.
 
diff --git a/languages/messages/MessagesDiq.php b/languages/messages/MessagesDiq.php
index f21854b1..bf37f545 100644
--- a/languages/messages/MessagesDiq.php
+++ b/languages/messages/MessagesDiq.php
@@ -16,6 +16,7 @@
  * @author Kaganer
  * @author Mirzali
  * @author Nemo bis
+ * @author Neribij
  * @author Olvörg
  * @author Reedy
  * @author Sahim
@@ -25,129 +26,137 @@
 $namespaceNames = array(
 	NS_MEDIA            => 'Medya',
 	NS_SPECIAL          => 'Xısusi',
-	NS_TALK             => 'Werênayış',
+	NS_TALK             => 'Mesac',
 	NS_USER             => 'Karber',
-	NS_USER_TALK        => 'Karber_werênayış',
-	NS_PROJECT_TALK     => '$1_werênayış',
+	NS_USER_TALK        => 'Karber_mesac',
+	NS_PROJECT_TALK     => '$1_mesac',
 	NS_FILE             => 'Dosya',
-	NS_FILE_TALK        => 'Dosya_werênayış',
+	NS_FILE_TALK        => 'Dosya_mesac',
 	NS_MEDIAWIKI        => 'MediaWiki',
-	NS_MEDIAWIKI_TALK   => 'MediaWiki_werênayış',
+	NS_MEDIAWIKI_TALK   => 'MediaWiki_mesac',
 	NS_TEMPLATE         => 'Şablon',
-	NS_TEMPLATE_TALK    => 'Şablon_werênayış',
+	NS_TEMPLATE_TALK    => 'Şablon_mesac',
 	NS_HELP             => 'Peşti',
-	NS_HELP_TALK        => 'Peşti_werênayış',
+	NS_HELP_TALK        => 'Peşti_mesac',
 	NS_CATEGORY         => 'Kategoriye',
-	NS_CATEGORY_TALK    => 'Kategoriye_werênayış',
+	NS_CATEGORY_TALK    => 'Kategoriye_mesac',
 );
 
 $namespaceAliases = array(
-	'Karber_mesac'       => NS_USER_TALK,
-	'Desteg'             => NS_HELP,
-	'Desteg_werênayış'   => NS_HELP_TALK,
-	'Kategori'           => NS_CATEGORY,
-	'Kategori_werênayış' => NS_CATEGORY_TALK,
+	'Werênayış'            => NS_TALK,
+	'Karber_werênayış'     => NS_USER_TALK,
+	'$1_werênayış'         => NS_PROJECT_TALK,
+	'Dosya_werênayış'      => NS_FILE_TALK,
+	'MediaWiki_werênayış'  => NS_MEDIAWIKI_TALK,
+	'Şablon_werênayış'     => NS_TEMPLATE_TALK,
+	'Desteg'               => NS_HELP,
+	'Desteg_werênayış'     => NS_HELP_TALK,
+	'Peşti_werênayış'      => NS_HELP_TALK,
+	'Kategori'             => NS_CATEGORY,
+	'Kategori_werênayış'   => NS_CATEGORY_TALK,
+	'Kategoriye_werênayış' => NS_CATEGORY_TALK,
 );
 
 $specialPageAliases = array(
-	'Activeusers'               => array( 'KarberêAktivi', 'AktivKarberi' ),
-	'Allmessages'               => array( 'MesaciPêro' ),
-	'Allpages'                  => array( 'PeleyPêro' ),
+	'Activeusers'               => array( 'KarberéAktivi', 'AktivKarberi' ),
+	'Allmessages'               => array( 'MesaciPéro' ),
+	'Allpages'                  => array( 'PeleyPéro' ),
 	'Ancientpages'              => array( 'PeleyKehani' ),
 	'Badtitle'                  => array( 'SernameyoXırab' ),
-	'Blankpage'                 => array( 'PelêVengi' ),
-	'Block'                     => array( 'Bloqe', 'BloqeIP', 'BloqeyêKarber' ),
-	'Blockme'                   => array( 'BloqeyêMe' ),
+	'Blankpage'                 => array( 'PeréVengi' ),
+	'Block'                     => array( 'Bloqe', 'BloqeIP', 'BloqeyéKarber' ),
+	'Blockme'                   => array( 'BloqeyéMe' ),
 	'Booksources'               => array( 'KıtabeÇıme' ),
-	'BrokenRedirects'           => array( 'HetênayışoXırab' ),
-	'Categories'                => array( 'Kategoriy' ),
-	'ChangeEmail'               => array( 'EpostaVurnayış' ),
-	'ChangePassword'            => array( 'ParolaBıvurnê', 'ParolaResetke' ),
-	'ComparePages'              => array( 'PelaPêverke' ),
+	'BrokenRedirects'           => array( 'HeténayışoXırab' ),
+	'Categories'                => array( 'Kategoriyan' ),
+	'ChangeEmail'               => array( 'EpostaVırnayış' ),
+	'ChangePassword'            => array( 'ParolaBıvırné', 'ParolaResetke' ),
+	'ComparePages'              => array( 'PeraPéverke' ),
 	'Confirmemail'              => array( 'EpostayAraştke' ),
-	'Contributions'             => array( 'İştiraqi' ),
-	'CreateAccount'             => array( 'HesabVırazê' ),
-	'Deadendpages'              => array( 'PelaBıgirê' ),
-	'DeletedContributions'      => array( 'İştıraqêkeBesterneyayê' ),
-	'Disambiguations'           => array( 'Arêzekerdış' ),
+	'Contributions'             => array( 'Dekerdışi' ),
+	'CreateAccount'             => array( 'HesabVırazé' ),
+	'Deadendpages'              => array( 'PeraBıgiré' ),
+	'DeletedContributions'      => array( 'DekerdışékeBesterneyayé' ),
+	'Disambiguations'           => array( 'Arézekerdış' ),
 	'DoubleRedirects'           => array( 'HetanayışoDılet' ),
-	'EditWatchlist'             => array( 'ListeyaSeyrkerdışiVurnayış' ),
+	'EditWatchlist'             => array( 'ListeyaSeyrkerdışiVırnayış' ),
 	'Emailuser'                 => array( 'EpostayaKarberi' ),
 	'Export'                    => array( 'Ateberde' ),
-	'Fewestrevisions'           => array( 'TewrtaynRevizyon' ),
+	'Fewestrevisions'           => array( 'TewrtaynRewizyon' ),
 	'FileDuplicateSearch'       => array( 'KopyaydosyaCıgeyrayış', 'DıletdosyaCıgeyrayış' ),
 	'Filepath'                  => array( 'RayaDosya', 'HerunaDosya', 'CayêDosya' ),
-	'Import'                    => array( 'Azeredê', 'Atewrke' ),
-	'Invalidateemail'           => array( 'EpostaAraştkerdışiBıterknê' ),
-	'BlockList'                 => array( 'ListeyêBloqi', 'IPBloqi', 'Blokqeyê_IP' ),
+	'Import'                    => array( 'Azeredé', 'Atewrke' ),
+	'Invalidateemail'           => array( 'EpostaAraştkerdışiBıterkné' ),
+	'BlockList'                 => array( 'ListeyéBloqan', 'IPBloqi', 'Blokqeyé_IP' ),
 	'LinkSearch'                => array( 'GreCıgeyrayış' ),
-	'Listadmins'                => array( 'ListeyaSerkaran' ),
+	'Listadmins'                => array( 'Listeyaİdarekaran' ),
 	'Listbots'                  => array( 'ListeyaBotan' ),
-	'Listfiles'                 => array( 'ListeyaDosyayan', 'DosyayaListeke', 'ListeyêResiman' ),
-	'Listgrouprights'           => array( 'ListeyaHeqandêGruban', 'HeqêGrubdeKarberan' ),
-	'Listredirects'             => array( 'ListeyaArêzekerdışan' ),
+	'Listfiles'                 => array( 'ListeyaDosyayan', 'DosyayaListeke', 'ListeyéResiman' ),
+	'Listgrouprights'           => array( 'ListeyaHeqandéGruban', 'HeqéGrubdeKarberan' ),
+	'Listredirects'             => array( 'ListeyaArézekerdışan' ),
 	'Listusers'                 => array( 'ListeyaKarberan', 'KarberaListeke' ),
 	'Lockdb'                    => array( 'DBKilitke' ),
 	'Log'                       => array( 'Qeyd', 'Qeydi' ),
-	'Lonelypages'               => array( 'PeleyêBêwayıri' ),
-	'Longpages'                 => array( 'PeleyêDergi' ),
-	'MergeHistory'              => array( 'VerênanPêtewrke' ),
+	'Lonelypages'               => array( 'PeréBéwayıri' ),
+	'Longpages'                 => array( 'PeréDergi' ),
+	'MergeHistory'              => array( 'VerénanPétewrke' ),
 	'MIMEsearch'                => array( 'NIMECıgeyrayış' ),
-	'Mostcategories'            => array( 'TewrvêşiKategoriyıni' ),
-	'Mostimages'                => array( 'DosyeyêkeCırêvêşiGreDeyayo' ),
-	'Mostinterwikis'            => array( 'TewrvêşiTeberwiki' ),
-	'Mostlinked'                => array( 'PeleyêkeCırêvêşiGreDeyayo' ),
-	'Mostlinkedcategories'      => array( 'KategoriyêkeCırêvêşiGreDeyayo' ),
-	'Mostlinkedtemplates'       => array( 'ŞablonêkeCırêvêşiGreDeyayo' ),
-	'Mostrevisions'             => array( 'TewrvêşiRevizyon' ),
-	'Movepage'                  => array( 'PelerBerê' ),
-	'Mycontributions'           => array( 'İştıraqêMe' ),
-	'Mypage'                    => array( 'PeleyêMe' ),
-	'Mytalk'                    => array( 'WerênayışêMe' ),
-	'Myuploads'                 => array( 'BarkerdışeMe' ),
-	'Newimages'                 => array( 'DosyeyêNewey', 'ResimêNewey' ),
-	'Newpages'                  => array( 'PeleyêNewey' ),
+	'Mostcategories'            => array( 'TewrvéşiKategoriyıni' ),
+	'Mostimages'                => array( 'DosyeyékeCırévéşiGreDeyayo' ),
+	'Mostinterwikis'            => array( 'TewrvéşiTeberwiki' ),
+	'Mostlinked'                => array( 'PerékeCırévéşiGreDeyayo' ),
+	'Mostlinkedcategories'      => array( 'KategoriyayékeCırévéşiGreDeyayo' ),
+	'Mostlinkedtemplates'       => array( 'ŞablonékeCırévéşiGreDeyayo' ),
+	'Mostrevisions'             => array( 'TewrvéşiRevizyon' ),
+	'Movepage'                  => array( 'PelerBeré' ),
+	'Mycontributions'           => array( 'DekerdenéMe' ),
+	'Mypage'                    => array( 'PeréMe' ),
+	'Mytalk'                    => array( 'VatenayışéMe' ),
+	'Myuploads'                 => array( 'BarkerdışéMe' ),
+	'Newimages'                 => array( 'DosyeyéNewey', 'ResiméNewey' ),
+	'Newpages'                  => array( 'PeréNewey' ),
 	'PasswordReset'             => array( 'ParolaResetkerdış' ),
 	'PermanentLink'             => array( 'GreyoDaimi' ),
-	'Popularpages'              => array( 'PeleyêPopuleri' ),
+	'Popularpages'              => array( 'PeréPopuleri' ),
 	'Preferences'               => array( 'Tercihi' ),
 	'Prefixindex'               => array( 'SerVerole' ),
-	'Protectedpages'            => array( 'PeleyêkeStaryayê' ),
-	'Protectedtitles'           => array( 'SernameyêkeStaryayê' ),
-	'Randompage'                => array( 'Raştamê', 'PelayakeRaştamê' ),
-	'Randomredirect'            => array( 'HetenayışoRaştame' ),
-	'Recentchanges'             => array( 'VurnayışêPeyêni' ),
-	'Recentchangeslinked'       => array( 'GreyêVurnayışêPeyêni' ),
-	'Revisiondelete'            => array( 'RevizyoniBesterne' ),
+	'Protectedpages'            => array( 'PerékeStaryayé' ),
+	'Protectedtitles'           => array( 'SernameyékeStaryayé' ),
+	'Randompage'                => array( 'Raştameye', 'PelayakeRaştamé' ),
+	'Randomredirect'            => array( 'HetenayışoRaştameye' ),
+	'Recentchanges'             => array( 'VırnayışéPeyéni' ),
+	'Recentchangeslinked'       => array( 'GreyéVırnayışéPeyénan' ),
+	'Redirect'                  => array( 'Hetenayış' ),
+	'Revisiondelete'            => array( 'RewizyoniBesterne' ),
 	'Search'                    => array( 'Cıgeyre' ),
-	'Shortpages'                => array( 'PeleyêKılmi' ),
-	'Specialpages'              => array( 'PeleyêXısusi' ),
+	'Shortpages'                => array( 'PeleyéKılmi' ),
+	'Specialpages'              => array( 'PeréBexsey' ),
 	'Statistics'                => array( 'İstatistiki' ),
 	'Tags'                      => array( 'Etiketi' ),
 	'Unblock'                   => array( 'BloqiWedarne' ),
-	'Uncategorizedcategories'   => array( 'KategoriyêkeKategorinêbiyê' ),
-	'Uncategorizedimages'       => array( 'DosyeyêkeKategorinêbiyê' ),
-	'Uncategorizedpages'        => array( 'PeleyêkeKategorinêbiyê' ),
-	'Uncategorizedtemplates'    => array( 'ŞablonêkeKategorinêbiyê' ),
+	'Uncategorizedcategories'   => array( 'KategoriyayékeKategoriyanébiyé' ),
+	'Uncategorizedimages'       => array( 'DosyeyékeKategoriyanébiyé' ),
+	'Uncategorizedpages'        => array( 'PeleyékeKategoriyanébiyé' ),
+	'Uncategorizedtemplates'    => array( 'ŞablonékeKategoriyanébiyé' ),
 	'Undelete'                  => array( 'Peyserbiya' ),
 	'Unlockdb'                  => array( 'DBKılitiAke' ),
-	'Unusedcategories'          => array( 'KategoriyêkeNêkaryayê' ),
-	'Unusedimages'              => array( 'DosyeyêkeNêkaryayê' ),
-	'Unusedtemplates'           => array( 'ŞablonêkeNêkaryayê' ),
-	'Unwatchedpages'            => array( 'PeleyêkeNêweyneyênê' ),
+	'Unusedcategories'          => array( 'KategoriyayékeNékariyayé' ),
+	'Unusedimages'              => array( 'DosyeyékeNékariyayé' ),
+	'Unusedtemplates'           => array( 'ŞablonékeNékariyayé' ),
+	'Unwatchedpages'            => array( 'PeleyékeNéweyneyéné' ),
 	'Upload'                    => array( 'Barkerdış' ),
-	'UploadStash'               => array( 'BarkerdışêNımtey' ),
+	'UploadStash'               => array( 'BarkerdışéNımıtey' ),
 	'Userlogin'                 => array( 'KarberCıkewtış' ),
 	'Userlogout'                => array( 'KarberVıcyayış' ),
-	'Userrights'                => array( 'HeqêKarberan', 'SysopKerdış', 'BotKerdış' ),
+	'Userrights'                => array( 'HeqéKarberan', 'SysopKerdış', 'BotKerdış' ),
 	'Version'                   => array( 'Versiyon' ),
-	'Wantedcategories'          => array( 'KategoriyêkeWazênê' ),
-	'Wantedfiles'               => array( 'DosyeyêkeWazênê' ),
-	'Wantedpages'               => array( 'PeleyêkeWazênê' ),
-	'Wantedtemplates'           => array( 'ŞablonêkeWazênê' ),
-	'Watchlist'                 => array( 'ListaSeyri' ),
-	'Whatlinkshere'             => array( 'PelarêGre' ),
-	'Withoutinterwiki'          => array( 'Bêİnterwiki' ),
+	'Wantedcategories'          => array( 'KategoriyayékeWazéné' ),
+	'Wantedfiles'               => array( 'DosyeyékeWazéné' ),
+	'Wantedpages'               => array( 'PerékeWazéné' ),
+	'Wantedtemplates'           => array( 'ŞablonékeWazéné' ),
+	'Watchlist'                 => array( 'ListeySeyran' ),
+	'Whatlinkshere'             => array( 'PerarêGre' ),
+	'Withoutinterwiki'          => array( 'Béİnterwiki' ),
 );
 
 $magicWords = array(
@@ -338,9 +347,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Amarê karberanê seyrkerdoğan bımocne',
 'tog-oldsig' => 'İmzaya mewcude:',
 'tog-fancysig' => 'İmza rê mameleyê wikimeqaley bıke (bê gıreyo otomatik)',
-'tog-externaleditor' => 'Editorê teberi standard bıxebetne (tenya seba ekspertano, komputerê şıma de eyarê xısusiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato vêşêr.])',
-'tog-externaldiff' => 'Têverşanayışan pê programê teberi vıraze (tenya seba ekspertano, komputerê şıma de eyarê xısusiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato vêşêr.])',
-'tog-showjumplinks' => 'Gıreyê "şo"y aktif ke',
 'tog-uselivepreview' => 'Verqayt di weseye  karneno (JavaScript lazım o) (Cerbino)',
 'tog-forceeditsummary' => 'Mı ke xulasa kerde cı vira, hay be mı ser de',
 'tog-watchlisthideown' => 'Vurnayışanê mı lista mına seyrkerdışi de bınımne',
@@ -354,6 +360,7 @@ $messages = array(
 'tog-showhiddencats' => 'Kategoriyanê dızdiye bımocne',
 'tog-noconvertlink' => 'Greyê sernami çerx kerdışi bıqefılne',
 'tog-norollbackdiff' => 'Peyserardışi ra dıme ferqi caverde',
+'tog-useeditwarning' => 'Wexto ke mı yew pela nizami be vurnayışanê nêqeydbiyayeyan caverdê, hay be mı ser de',
 
 'underline-always' => 'Tım',
 'underline-never' => 'Qet',
@@ -417,6 +424,18 @@ $messages = array(
 'oct' => 'Tşv',
 'nov' => 'Tşp',
 'dec' => 'Kan',
+'january-date' => 'Çele  $1',
+'february-date' => 'Şıbate $1',
+'march-date' => 'Adar $1',
+'april-date' => 'Nisane $1',
+'may-date' => 'Gulane $1',
+'june-date' => 'Hezirane $1',
+'july-date' => 'Temuze $1',
+'august-date' => 'Tebaxe $1',
+'september-date' => 'Keşkelun $1',
+'october-date' => 'Cıtan $1',
+'november-date' => 'Qasım $1',
+'december-date' => 'Kanun $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategoriye|Kategoriy}}',
@@ -502,6 +521,7 @@ $messages = array(
 'create-this-page' => 'Na pele bınuse',
 'delete' => 'Bestere',
 'deletethispage' => 'Ena perer besternê',
+'undeletethispage' => 'Na perer mebesterne',
 'undelete_short' => '{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere',
 'viewdeleted_short' => '{{PLURAL:$1|Yew vurnayışo esterıte|$1 Vurnayışanê esterıtan}} bımocne',
 'protect' => 'Bıpawe',
@@ -545,7 +565,7 @@ $1',
 'pool-queuefull' => 'Rêza hewze pırra',
 'pool-errorunknown' => 'Xeta nêzanıtiye',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Heqa {{SITENAME}}i de',
 'aboutpage' => 'Project:Heqdê cı',
 'copyright' => 'Zerrekacı $1 bındı not biya.',
@@ -555,7 +575,6 @@ $1',
 'disclaimers' => 'Redê mesuliyeti',
 'disclaimerpage' => 'Project:Reddê mesuliyetê bıngey',
 'edithelp' => 'Peştdariya vurnayışi',
-'edithelppage' => 'Help:Vurnayış',
 'helppage' => 'Help:Estêni',
 'mainpage' => 'Pera Seri',
 'mainpage-description' => 'Pela Seri',
@@ -587,7 +606,6 @@ $1',
 'newmessagesdifflinkplural' => 'peyni {{PLURAL:$1|vurnayış|vurnayışi}}',
 'youhavenewmessagesmulti' => '$1 mesaco newe esto',
 'editsection' => 'bıvurne',
-'editsection-brackets' => '[$1]',
 'editold' => 'bıvurne',
 'viewsourceold' => 'çımey cı bıvinê',
 'editlink' => 'bıvurne',
@@ -639,16 +657,9 @@ Seba lista pelanê xasanê vêrdeyan reca kena: [[Special:SpecialPages|{{int:spe
 # General errors
 'error' => 'Xırab',
 'databaseerror' => 'Xeta serveri',
-'dberrortext' => 'Rêzê vateyê malumati de xeta bı.
-No xeta belka software ra yo.
-"<blockquote><tt>$1</tt></blockquote>.
-<tt>$2</tt>" ra pers kerdışê peyin:
-Malumatê yo ke xeta dayo "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Persê rêzê vateyê database de xeta bı.
-Persê databaseyê peyin:
-"$1"
-Fonksiyono ke şuxulyo "$2".
-Mesacê ke database dayo "$3: $4"',
+'databaseerror-query' => 'Perskerdış:$1',
+'databaseerror-function' => 'Fonksiyon: $1',
+'databaseerror-error' => 'Xırab: $1',
 'laggedslavemode' => 'Diqet: Pel de newe vıraşteyi belka çini .',
 'readonly' => 'database kılit biyo',
 'enterlockreason' => 'Database kılit biyo',
@@ -701,12 +712,13 @@ Perse: $2',
 'editinginterface' => "'''İqaz:''' Şıma hayo yew pela ke seba nuşteyê meqalanê cayanê bırnayeyan dana, vurnenê.
 Vurnayışê na pele karberanê binan rê serpela karberi kena ke bımocno.
 Seba çarnayışi, yardımê [//translatewiki.net/wiki/Main_Page?setlang=diq translatewiki.net]i ra procêdoşkerdışi rê diqet kerên.",
-'sqlhidden' => '(SQL pers kerdışê nımıte)',
 'cascadeprotected' => 'No pel de vurnayiş qedexe biyo, çunke şıma tuşa "kademeyın" aqtif kerdo u no {{PLURAL:$1|pelo|pelo}} pawıteyo de xebıtyeno:
 $2',
 'namespaceprotected' => "No '''$1''' ca de icazetê şıma çino şıma pel rêz keri.",
 'customcssprotected' => 'Mısadeyê şıma çıniyo ke na pela CSSi bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.',
 'customjsprotected' => 'Mısadeyê şıma çıniyo ke na pela Java Scripti bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.',
+'mycustomcssprotected' => "Na pera CSS'i re tenya idarekari şene bıvurne",
+'mycustomjsprotected' => "Na pera JavaScript'i re tenya idarekari şene bıvurne",
 'ns-specialprotected' => 'Pelê xısusiy nênê vurnayış.',
 'titleprotected' => 'Eno [[User:$1|$1]] zerreyê ena peli nişeno vuriye.
 Sebeb: "\'\'$2\'\'".',
@@ -731,10 +743,19 @@ Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de he
 'welcomecreation-msg' => 'Hesabê şıma abiyo.
 [[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.',
 'yourname' => 'Nameyê karberi:',
+'userlogin-yourname' => 'Nameyê karberi',
+'userlogin-yourname-ph' => 'Nameyê xoye karberi cıkewe',
+'createacct-another-username-ph' => 'Namey karberi de fi',
 'yourpassword' => 'Parola',
+'userlogin-yourpassword' => 'Parola',
+'userlogin-yourpassword-ph' => 'Parolaya xo cıkewe',
+'createacct-yourpassword-ph' => 'Parola cıkewe',
 'yourpasswordagain' => 'Parola reyna bınusne:',
+'createacct-yourpasswordagain' => 'Parola tesdiq ke',
+'createacct-yourpasswordagain-ph' => 'Parola fına cıkewe',
 'remembermypassword' => 'Parola mı nê cıgeyrayoği de bia xo viri (seba tewr zêde $1 {{PLURAL:$1|roce|rocan}})',
-'securelogin-stick-https' => "Dekewtış kerdışi dıma HTTPS'i dı grêdaye bıman",
+'userlogin-remembermypassword' => 'Mı biya xo viri',
+'userlogin-signwithsecure' => 'Ebe teqdimkerê asayişın cıkewe',
 'yourdomainname' => 'Nameyê şıma yo meydani',
 'password-change-forbidden' => 'Şıma na wiki de nêşenê parola bıvurnê.',
 'externaldberror' => 'Ya database de xeta esta ya zi heqê şıma çino şıma no hesab bıvurni.',
@@ -746,18 +767,40 @@ Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de he
 'logout' => 'Bıveciye',
 'userlogout' => 'Bıveciye',
 'notloggedin' => 'Şıma cıkewtış nêvıraşto',
+'userlogin-noaccount' => 'Hesabê şıma çıniyo?',
+'userlogin-joinproject' => 'Cıkewe {{SITENAME}}',
 'nologin' => "Hesabê şıma çıniyo? '''$1'''.",
 'nologinlink' => 'Yew hesab ake',
 'createaccount' => 'Hesab vıraze',
 'gotaccount' => "Hesabê şıma esto? '''$1'''.",
 'gotaccountlink' => 'Cı kewe',
 'userlogin-resetlink' => 'Melumatê cıkewtışi xo vira kerdê?',
+'userlogin-resetpassword-link' => 'Parolaya xo reset ke',
+'helplogin-url' => 'Help:Qeydbiyayış',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Desteg be qeydbiyayış ra]]',
+'createacct-join' => 'Cêr melumatê xo cı ke',
+'createacct-emailrequired' => 'Adresa e-postey',
+'createacct-emailoptional' => 'Adresa e-postey (mecburi niya)',
+'createacct-email-ph' => 'Adresa e-posteyê xo cıkewe',
+'createacct-another-email-ph' => 'Adresa e-posta de fi',
 'createaccountmail' => 'Yew parolaya rastameyiya ravêrdiye bıgurene û parola ena adresa e-postey rê bırışe',
+'createacct-realname' => 'Nameyo raştıkên (mecburi niyo)',
 'createaccountreason' => 'Sebeb:',
+'createacct-reason' => 'Sebeb',
+'createacct-reason-ph' => 'Şımaye çı xo re zewbi hesab vırazeni?',
+'createacct-captcha' => 'Qontrolê asayişi',
+'createacct-imgcaptcha-ph' => 'Nuşteyo ke cor aseno ey cı ke',
+'createacct-submit' => 'Hesabê xo vıraze',
+'createacct-another-submit' => 'Zewbi hesab vıraz',
+'createacct-benefit-heading' => '{{SITENAME}} meş de merduman şi',
+'createacct-benefit-body1' => '{{PLURAL:$1|vurnayış|vurnayışi}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pele|peli}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|iştıraqkerdoğo nıkayên|iştıraqkerdoğê nıkayêni}}',
 'badretype' => 'Parolayê ke şıma nuşti yewbini nêtepışneni.',
 'userexists' => 'Jewna karber enê nami karneno.
 Mara reca xorê jewna name bınusnê.',
 'loginerror' => 'Xetayê hesab ekerdışi',
+'createacct-error' => 'Xetaya vıraştışê hesabi',
 'createaccounterror' => 'Hesab nêvırazyeno: $1',
 'nocookiesnew' => 'Hesabê karberi vıraziya, labelê şıma nêşay cı kewê.
 Semedê akerdışê hesabi çerezê {{SITENAME}}i gurêniyenê.
@@ -813,7 +856,7 @@ Yew formato meqbul de adresê e-posta bınuse ya zi veng bıverde.',
 'createaccount-text' => 'Kesê, be e-posteyê şıma ra {{SITENAME}} ($4) de, ebe nameyê "$2" u parola "$3" ra yew hesab vıraşto.
 Şıma gani cı kewê u parola xo nıka bıvurnê.',
 'usernamehasherror' => 'Namey karberi de karakteri gani têmiyan ra mebê',
-'login-throttled' => 'Demekê cıwa ver de şıma zah teşebbusê hesab akerdış kerd.
+'login-throttled' => 'Demekê $1 cıwa ver de şıma zah teşebbusê hesab akerdış kerd.
 Bıne vındere u newe ra dest pê bıkere.',
 'login-abort-generic' => 'Dekewtışê şıma xırabo-terkneyayo',
 'loginlanguagelabel' => 'Zıwan: $1',
@@ -833,8 +876,7 @@ Bıne vındere u newe ra dest pê bıkere.',
 'newpassword' => 'Parola newiye:',
 'retypenew' => 'Parola newiye tekrar ke:',
 'resetpass_submit' => 'Parola eyar kere u newe ra dekewe',
-'resetpass_success' => 'Parolaya sima newke viriye!
-Newke  dekewe...',
+'changepassword-success' => 'Parola şıma be serkewtış vuriye!',
 'resetpass_forbidden' => 'parolayi nêvuryayi',
 'resetpass-no-info' => 'şıma gani hesab akere u hona bıeşke bırese cı',
 'resetpass-submit-loggedin' => 'Parola bıvurne',
@@ -846,10 +888,10 @@ Newke  dekewe...',
 
 # Special:PasswordReset
 'passwordreset' => 'Parola reset ke',
-'passwordreset-text' => 'Seba eyarkerdışê parolaya xo ra nê formi pır kerê.',
+'passwordreset-text-one' => 'Na form de parola reset kerdış temamiye',
+'passwordreset-text-many' => '{{PLURAL:$1|Qande parola reset kerdışi cayanra taynın pırkeri}}',
 'passwordreset-legend' => 'Parola reset ke',
 'passwordreset-disabled' => 'Parola reset kerdış ena viki sera qefılneyayo.',
-'passwordreset-pretext' => '{{PLURAL:$1||Enê cerenan ra jeweri defiye de}}',
 'passwordreset-username' => 'Nameyê karberi:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'neticey e-postay bımocne?',
@@ -872,7 +914,7 @@ Ena parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emay
 Parola vêrdiye: $2',
 'passwordreset-emailsent' => 'Yew e-posteyê esterıtışê parola rışiya.',
 'passwordreset-emailsent-capture' => 'Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo.',
-'passwordreset-emailerror-capture' => 'ey cêri e-postay xo vira kerdışi vıraziyê lakin merdum dê $1 rê nêrışiyê.',
+'passwordreset-emailerror-capture' => 'Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo, ema {{GENDER:$2|karber}}i rê rıştış de mıwefeq nêbi: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-posta adresa xo bıvurnê',
@@ -886,6 +928,15 @@ Parola vêrdiye: $2',
 'changeemail-submit' => 'E-postay xo bıvurne',
 'changeemail-cancel' => 'Bıtexelne',
 
+# Special:ResetTokens
+'resettokens' => 'Reset fi ye',
+'resettokens-no-tokens' => 'Ena reset nefina',
+'resettokens-legend' => 'Reset fi ye',
+'resettokens-tokens' => 'Beli kerdeni:',
+'resettokens-token-label' => '$1 (weziyeta newki: $2)',
+'resettokens-done' => 'Reset fi',
+'resettokens-resetbutton' => 'Reset fiyayış weçin',
+
 # Edit page toolbar
 'bold_sample' => 'Metno qalın',
 'bold_tip' => 'Metno qalın',
@@ -1076,12 +1127,15 @@ Yew sebeb beyan nibı.',
 Hewna kerde aseno.',
 'edit-conflict' => 'Vurnayişê pêverdiyaye .',
 'edit-no-change' => 'Vurnayişê şıma qebul nêbı, çunke nuşte de yew vurnayiş n3evıraziya.',
+'postedit-confirmation' => 'Vurnayış qeyd be',
 'edit-already-exists' => 'Pelo newe nêvıraziyeno.
 Pel ca ra esto.',
 'defaultmessagetext' => 'Hesıbyaye metne mesaci',
 'content-failed-to-parse' => 'Qandê madela $3 zereyê $1, $2 sero nêagozyayo',
 'invalid-content-data' => 'Zerrey malumati nêravêrdeyo',
 'content-not-allowed-here' => '"$1" sero per da [[$2]] rê mısade nêdeyêno',
+'editwarning-warning' => 'ihtimal o ke wexta şıma peli ra bıveci, vurnayiş o ke şıma kerdo, hewna şiyêro .
+eke şıma kewtê hesabê xo, no hişyari tercihanê xo ra şıma eşkeni "{{int:prefs-editing}}" bıvındarnî .',
 
 # Content models
 'content-model-wikitext' => 'wikimetin',
@@ -1115,6 +1169,7 @@ Taye şabloni zerre pel de nêmociyayeni.',
 'undo-failure' => 'Sebayê pêverameyişê vurnayişan karo tepêya gırewtış nêbı.',
 'undo-norev' => 'Vurnayiş tepêya nêgeryeno çunke ya vere cû hewna biyo ya zi ca ra çino.',
 'undo-summary' => 'Peysergırewtışê teshisê $1i be terefê [[Special:Contributions/$2|$2i]] ([[User talk:$2|Werênayış]])',
+'undo-summary-username-hidden' => "Rewizyona veri $1'i hewada",
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Nêşenay hesab rakerê',
@@ -1295,6 +1350,7 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'compareselectedversions' => 'Rewizyonanê weçineyan pêver ke',
 'showhideselectedversions' => 'Revizyonanê weçinıtan bımocne/bınımne',
 'editundo' => 'peyser bia',
+'diff-empty' => '(Babetna niyo)',
 'diff-multi' => '({{PLURAL:$1|Yew revizyono miyanên|$1 revizyonê miyanêni}} terefê {{PLURAL:$2|yew karberi|$2 karberan}} nêmocno)',
 'diff-multi-manyusers' => '({{PLURAL:$1|jew timar kerdışo qıckeko|$1 timar kerdışo qıckeko}} timar kerdo, $2 {{PLURAL:$2|Karber|karberi}} memocne)',
 'difference-missing-revision' => 'Ferqê {{PLURAL:$2|Yew rewizyonê|$2 rewizyonê}} {{PLURAL:$2|dı|dı}} ($1) sero çıniyo.
@@ -1322,7 +1378,6 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'searchmenu-legend' => 'bıgeyre tercihan (sae bıke)',
 'searchmenu-exists' => "''Ena 'Wikipediya de ser \"[[:\$1]]\" yew pel esto'''",
 'searchmenu-new' => "''Na Wiki de pelay \"[[:\$1]]\" vıraze!'''",
-'searchhelp-url' => 'Help:Tedeestey',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|pê eno prefix ser pelan de bigêre]]',
 'searchprofile-articles' => 'Pelê tedeestey',
 'searchprofile-project' => 'Pelê yardım u procey',
@@ -1365,15 +1420,6 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'search-external' => 'Cıgeyrayışê teberi',
 'searchdisabled' => '{{SITENAME}} no keyepel de cıgerayiş muweqqet bıryayo. no benatê de şıma pê Google eşkeni zerreyê {{SITENAME}} de cıgerayiş bıkeri.',
 
-# Quickbar
-'qbsettings' => 'Çûwo pêt',
-'qbsettings-none' => 'Çıniyo',
-'qbsettings-fixedleft' => 'Rêcaene çhep',
-'qbsettings-fixedright' => 'Rêcaene raşt',
-'qbsettings-floatingleft' => 'rêcaene çhep',
-'qbsettings-floatingright' => 'rêcaene raşt',
-'qbsettings-directionality' => 'Sabito, hereket de dosya da zıwan de şımaya gıredayeyo',
-
 # Preferences page
 'preferences' => 'Tercihi',
 'mypreferences' => 'Tercihi',
@@ -1406,7 +1452,6 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'resetprefs' => 'Vurnayışê ke qeyd nêbiy, pak ke',
 'restoreprefs' => 'Sazanê hesıbyaya pêron newe ke',
 'prefs-editing' => 'Cay pela nustısi',
-'prefs-edit-boxsize' => 'Ebatê pencereyê vurnayîşî.',
 'rows' => 'Xeti:',
 'columns' => 'Estûni:',
 'searchresultshead' => 'Cı geyre',
@@ -1417,9 +1462,6 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'recentchangesdays-max' => 'Tewr zaf $1 {{PLURAL:$1|roc|roci}}',
 'recentchangescount' => 'Amarê vurnayışê ke hesıbyaye deye bımocneyê:',
 'prefs-help-recentchangescount' => 'Ney de vurnayışê peyêni, tarixê pelan u cıkewteni asenê.',
-'prefs-help-watchlist-token' => 'Eke no ca pê kılito dızdeni/miyanki pırr bo, lista şımawa seyrkerdışi rê yew cıresnayışê RSSi vıraziyeno.
-Her kamo ke nê kılitê nê cay zaneno, şeno lista şımawa seyrkerdışi ki bıwano, coke ra yewo sağlem weçine.
-Etıya şıma rê yew kılito raştameo ke şıma şenê bıgurenê/bıxebetnê: $1',
 'savedprefs' => 'Tecihê şıma qeyd biy.',
 'timezonelegend' => 'Warey saete:',
 'localtime' => 'saeta mehelliye:',
@@ -1450,7 +1492,6 @@ Etıya şıma rê yew kılito raştameo ke şıma şenê bıgurenê/bıxebetnê:
 'prefs-reset-intro' => 'ena pele de şıma tercihanê xo şenê bıçarnê be tercihanê keyepelê ke verê coy eyar biy.
 Na game tepeya nêerziyena.',
 'prefs-emailconfirm-label' => 'Tesdiqiya E-posta:',
-'prefs-textboxsize' => 'Ebatê pencerey vurnayışi',
 'youremail' => 'E-Mail (mecbur niyo) *:',
 'username' => '{{GENDER:$1|Nameyê karberi}}:',
 'uid' => 'Kamiya {{GENDER:$1|karberi}}:',
@@ -1487,6 +1528,8 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'prefs-dateformat' => 'Formatê tarixi',
 'prefs-timeoffset' => 'Wext offset',
 'prefs-advancedediting' => 'Herayen weçinayış',
+'prefs-editor' => 'Timarkar',
+'prefs-preview' => 'Verqayt',
 'prefs-advancedrc' => 'Tercihê raverberdey',
 'prefs-advancedrendering' => 'Tercihê raverberdey',
 'prefs-advancedsearchoptions' => 'Tercihê raverberdey',
@@ -1494,6 +1537,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'prefs-displayrc' => 'Tercihan bımocne',
 'prefs-displaysearchoptions' => 'Weçinayışê mocnayışi',
 'prefs-displaywatchlist' => 'Weçinayışê mocnayışi',
+'prefs-tokenwatchlist' => 'Morge',
 'prefs-diffs' => 'Ferqi',
 
 # User preference: email validation using jQuery
@@ -1587,11 +1631,13 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'right-proxyunbannable' => 'Blokanê otomatikiê proksiyan ra ravêre',
 'right-unblockself' => 'Blokeyınan ake',
 'right-protect' => 'Sewiyanê pawıtışi (mıhafezey) bıvurne u pelanê kılitbiyaiyan sero bıgureye.',
-'right-editprotected' => 'Pelanê pawıtiyan sero bıgureye (bê pawıtena kaskadi (game be game))',
+'right-editprotected' => 'Pera pawıtiyan sero bıxebteye (bê pawıtena kaskadi (game be game))',
+'right-editsemiprotected' => 'Xısusi pera timaryayış "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Interfaceê karberi sero bıgureye',
 'right-editusercssjs' => 'CSS u dosyanê JSiê karberanê binan sero bıgureye',
 'right-editusercss' => 'Dosyanê CSSiê karberanê binan sero bıgureye',
 'right-edituserjs' => 'Dosyanê JSiê karberanê binan sero bıgureye',
+'right-viewmywatchlist' => 'Lista seyr de xo bıvin',
 'right-rollback' => 'Lez/herbi vurnayışanê karberê peyêni tekrar bıke, oyo ke yew be yew pelê sero gureyao',
 'right-markbotedits' => 'Vurnayışanê peyd ameyan, vurnayışê boti deye nışan kerê',
 'right-noratelimit' => 'Sinoranê xızi (rate limit) ra tesir nêbi',
@@ -1653,9 +1699,15 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'action-userrights-interwiki' => 'heqqa karberanê ke wikiyê binî de hemî bivurne',
 'action-siteadmin' => 'database kilit bike ya zi a bike',
 'action-sendemail' => 'e-posta bırşe',
+'action-editmywatchlist' => 'Listeyseyran de xo bıvırne',
+'action-viewmywatchlist' => 'Listeyseyran de xo bıvin',
+'action-viewmyprivateinfo' => 'Xısusi tercihane xo bıvin',
+'action-editmyprivateinfo' => 'Xısusi malumate xo bıvurne',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|fın vurna|fıni vurna}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|ra yok wazino}}',
+'enhancedrc-history' => 'verenayış',
 'recentchanges' => 'Vurnayışê peyêni',
 'recentchanges-legend' => 'Tercihê vurnayışanê peyênan',
 'recentchanges-summary' => 'Ena pele de wiki sero vurnayışanê peyênan teqib ke.',
@@ -1697,7 +1749,6 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'recentchangeslinked-feed' => 'Vurnayışê elaqeyıni',
 'recentchangeslinked-toolbox' => 'Vurnayışê elaqeyıni',
 'recentchangeslinked-title' => 'vurnayışan ser "$1"',
-'recentchangeslinked-noresult' => 'Pelanê ke link biye ey vurnayîşî çino.',
 'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdayoğan de lista de vurnayışê peyênana.
 [[Special:Watchlist|Lista şımaya seyrkedışi de]] peli be nuşteyo '''qolınd''' bêli kerdê.",
 'recentchangeslinked-page' => 'Nameyê pele:',
@@ -1709,7 +1760,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'reuploaddesc' => 'Barkerdışi iptal ke u peyser şo formê barkerdışi',
 'upload-tryagain' => 'Deskripyonê dosyayî ke vurîya ey qeyd bike',
 'uploadnologin' => 'Şıma cıkewtış nêvıraşto',
-'uploadnologintext' => 'Ti gani [[Special:UserLogin|cikewte]] biyo ke dosya bar bike.',
+'uploadnologintext' => 'Ti şeni $1 dosya bar bikere.',
 'upload_directory_missing' => 'Direktorê dosyayê ($1)î biyo vînî u webserver de nieşkeno viraziye.',
 'upload_directory_read_only' => 'Direktorê dosyayê ($1)î webserver de nieşkeno binuse.',
 'uploaderror' => 'Ğeletê bar kerdişî',
@@ -1931,7 +1982,6 @@ qey pawıtışi, img_auth.php battal verdiyayo.",
 'http-read-error' => 'Wendişê HTTP de xeta esta.',
 'http-timed-out' => 'Waştişê HTTP qediya.',
 'http-curl-error' => 'Xetayê URLi: $1',
-'http-host-unreachable' => 'URL rê niresa.',
 'http-bad-status' => 'Waştişê tu HTTP yew problem biya: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1962,6 +2012,9 @@ keyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.',
 'listfiles_size' => 'Gırdiye',
 'listfiles_description' => 'Sılasnayış',
 'listfiles_count' => 'Versiyoni',
+'listfiles-latestversion' => 'Versiyono verin',
+'listfiles-latestversion-yes' => 'E',
+'listfiles-latestversion-no' => 'Nê',
 
 # File description page
 'file-anchor-link' => 'Dosya',
@@ -2056,6 +2109,11 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'randompage' => 'Pela raştameyiye',
 'randompage-nopages' => 'Ena {{PLURAL:$2|cayêname|cayênameyî}} de enê pelan çin o: $1.',
 
+# Random page in category
+'randomincategory' => 'Ğoseri pera kategoriya',
+'randomincategory-invalidcategory' => '"$1" namedı kategori çıniya',
+'randomincategory-selectcategory-submit' => 'Şo',
+
 # Random redirect
 'randomredirect' => 'Xoseri hetenayış',
 'randomredirect-nopages' => 'Ena cayênameyê "$1"î de redereksiyonî çin o.',
@@ -2081,10 +2139,6 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'statistics-users-active-desc' => '{{PLURAL:$1|roco peyin de|$1 roco peyin de}} karber ê ke kar kerdê.',
 'statistics-mostpopular' => 'Pelayanê ke tewr zafî vînî biye',
 
-'disambiguations' => 'Pelayê ke maneyo bini rê gırey cı esto',
-'disambiguationspage' => 'Template:Maneo bin',
-'disambiguations-text' => "Peleyê ke satır da sıteyên dı pelanê '''maneo bin'''i rê esteyina zeregri mocnenê. Nara satırda dıdın dı zi <br />tiya de [[MediaWiki:Disambiguationspage|Pelaya Maneo do bini ]] gani heme gıreyê şablonê ciya-manayan re gıre dayış icab keno.",
-
 'pageswithprop' => 'Peli be yew xısusiyetê pele',
 'pageswithprop-legend' => 'Peli be yew xısusiyetê pele',
 'pageswithprop-text' => 'Na per pimanen pera kena liste.',
@@ -2341,10 +2395,9 @@ Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.',
 'unwatchthispage' => 'temaşa kerdışê peli vındarn.',
 'notanarticle' => 'mebhesê peli niyo',
 'notvisiblerev' => 'Revizyon esteriyayo',
-'watchnochange' => 'pelê listeya temaşakerdışê şıma ye wextê nişane biyaye de rocane nêbiyo.',
 'watchlist-details' => '{{PLURAL:$1|$1 pele|$1 peleyan}} listeyê seyr-kerdışi şıma dı, peleyanê vurnayışi dahil niyo.',
-'wlheader-enotif' => 'pê * E-mail xeber dayiş biyo a.',
-'wlheader-showupdated' => "* ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
+'wlheader-enotif' => 'E-mail xeber dayiş abiyo.',
+'wlheader-showupdated' => "ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
 'watchmethod-recent' => 'pel ê ke şıma temaşa kenî vuryayişê peyinê ey konrol beno',
 'watchmethod-list' => 'pel ê ke şıma temaşa kenî vuryayişê peyinê ey konrol beno',
 'watchlistcontains' => 'listeya seyrkerdışê şıma de $1 tene {{PLURAL:$1|peli|peli}} estî.',
@@ -2596,7 +2649,7 @@ $1',
 'contributions' => 'İştıraqê {{GENDER:$1|karber}}i',
 'contributions-title' => 'Dekerdenê karber de $1',
 'mycontris' => 'İştıraqi',
-'contribsub2' => 'Qandê $1 ($2)',
+'contribsub2' => 'Qandê {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Ena kriteriya de vurnayîş çini yo.',
 'uctop' => '(weziyet)',
 'month' => 'Aşm:',
@@ -2752,11 +2805,8 @@ belka ver-grewtış wedariyayo.',
 labele parçeya benateyê na $2 adresibi u ey ra ver-geryayo u şıma eşkeni no wedari.',
 'ip_range_invalid' => 'Rêza IPi nêvêrena.',
 'ip_range_toolarge' => 'Menzilan ke /$1 ra girdêrê inan rê izin nidano.',
-'blockme' => 'Mi blok bik',
 'proxyblocker' => 'blokarê proxyi',
-'proxyblocker-disabled' => 'Eno fonksiyon nêxebetiyeno.',
 'proxyblockreason' => 'IPadresa şıma yew proxyo akerdeyo u ey ra verniyê ey geriya.',
-'proxyblocksuccess' => 'Qeyd ke.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'IP adresa şıma, hetê no {{SITENAME}} keyepeli ra  DNSBL de proxy hesibyayo u liste biyo.',
 'sorbs_create_account_reason' => 'IP adresa şıma, hetê no translatewiki.net keyepeli ra DNSBL de proxy hesibyayo u liste biyo.
@@ -2924,6 +2974,7 @@ eke şıma qayili paşt bıdi mahalli kerdışê wikimedyayi, kerem kerê pelê
 'thumbnail-more' => 'Gırd ke',
 'filemissing' => 'Dosya biya vini',
 'thumbnail_error' => 'Thumbnail niviraziya: $1',
+'thumbnail_error_remote' => '$1 ra mesaco xırab: $2',
 'djvu_page_error' => 'pelê DjVuyi bêşumulo',
 'djvu_no_xml' => 'Qe DjVu nieşkenî XML fetch bikî',
 'thumbnail-temp-create' => 'İdare dosyay resimiya nêvırazêna',
@@ -3150,13 +3201,8 @@ Tı eşkeno yew sebeb bınus.',
 'pageinfo-category-files' => 'Amarê dosyeyan',
 
 # Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalciya',
 'skinname-cologneblue' => 'Cologne Blue',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Şıq',
-'skinname-simple' => 'Rehat',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vektor',
 
@@ -3241,11 +3287,25 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 'minutes' => '{{PLURAL:$1|$1 deqa|$1 deqan}}',
 'hours' => '{{PLURAL:$1|$1 saete|$1 saetan}}',
 'days' => '{{PLURAL:$1|$1 roce|$1 rocan}}',
+'weeks' => '{{PLURAL:$1|$1 hefte|$1 hefteyan}}',
 'months' => '{{PLURAL:$1|aşme|$1 aşman}}',
 'years' => '{{PLURAL:$1|$1 serre|$1 serran}}',
 'ago' => 'Verê $1',
 'just-now' => 'Hema newke',
 
+# Human-readable timestamps
+'hours-ago' => 'Verê $1 {{PLURAL:$1|saete|saetan}}',
+'minutes-ago' => 'Verê $1 {{PLURAL:$1|deqa|deqan}}',
+'seconds-ago' => 'Verê $1 {{PLURAL:$1|saniya|saniyeyan}}',
+'monday-at' => 'Dışeme $1 de',
+'tuesday-at' => 'Sêşeme $1 de',
+'wednesday-at' => 'Çarşeme $1 de',
+'thursday-at' => 'Pancşeme $1 de',
+'friday-at' => 'Êne $1 de',
+'saturday-at' => 'Şeme $1 de',
+'sunday-at' => 'Kırê $1 de',
+'yesterday-at' => 'Vızêri $1 de',
+
 # Bad image list
 'bad_image_list' => 'Şeklo umumi wınayo:
 
@@ -3330,7 +3390,7 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Herayey',
 'exif-imagelength' => 'Dergi',
 'exif-bitspersample' => 'yew parçe de biti',
@@ -3523,7 +3583,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nêdegusneyayo',
 'exif-compression-2' => 'CCITT Grube 3 1-ebadın kodkerdışê dergiya gurenayışê Huffmanio modifiyekerde',
 'exif-compression-3' => 'CCITT Group 3 fax kodkerdış',
@@ -3865,7 +3925,6 @@ Ma rica keno tesdiq bike ke ti raştî wazeno eno pel bivirazo.",
 'semicolon-separator' => '&#32;',
 'comma-separator' => ',&#32;',
 'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
 'pipe-separator' => '&#32;|&#32;',
 'word-separator' => '&#32;',
 'ellipsis' => '...',
@@ -4034,7 +4093,6 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 'version-other' => 'Bin',
 'version-mediahandlers' => 'Kulbê medyayî',
 'version-hooks' => 'Çengelî',
-'version-extension-functions' => 'Funksiyonê ekstensiyonî',
 'version-parser-extensiontags' => 'Etiketê ekstensiyon ê parserî',
 'version-parser-function-hooks' => 'Çengelê ekstensiyon ê parserî',
 'version-hook-name' => 'Nameyê çengelî',
@@ -4044,6 +4102,7 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 'version-license' => 'Lisans',
 'version-poweredby-credits' => "Ena wiki, dezginda '''[//www.mediawiki.org/ MediaWiki]''' ya piya vıraziyaya, heqê telifi © 2001-$1 $2.",
 'version-poweredby-others' => 'Zewmi',
+'version-poweredby-translators' => "Açernere translatewiki.net'i",
 'version-credits-summary' => 'Ma qayılime ke [[Special:Version|MediaWiki]] rê ke kami destek dayo wa mayê vanime inan bışınasne.',
 'version-license-info' => "MediaWiki xoseri jew nuştereno; MediaWiki'yer, weqfê xoseri nuşteren GNU lisansiya merdumi şene ke vıla kerê, bıvurnê u timar kerê.
 
@@ -4059,12 +4118,16 @@ enê programiya piya [{{SERVER}}{{SCRIPTPATH}}/COPYING jew kopyay lisans dê GNU
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]',
 
-# Special:FilePath
-'filepath' => 'Heruna dosyayer',
-'filepath-page' => 'Dosya:',
-'filepath-submit' => 'Şo',
-'filepath-summary' => 'Na pela xısusiye raya temame jû dosya rê ana.
-Resımi be tam asayış mocniyayê, tipê dosyaê bini be programê cıyo elaqedar direkt dest keno pê.',
+# Special:Redirect
+'redirect' => "Hetenayışa dosyay, karberi yana  rewizyona ID'i",
+'redirect-legend' => 'Hetenayışa dosya yana pela',
+'redirect-submit' => 'Şo',
+'redirect-lookup' => 'Bewni',
+'redirect-value' => 'Erc:',
+'redirect-user' => "ID'ê Karberi",
+'redirect-revision' => 'Rewizyona pela',
+'redirect-file' => 'Namey dosya',
+'redirect-not-exists' => 'Erc nêvineyê',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dosyayanê zey pêyan cı geyrê',
@@ -4114,12 +4177,16 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 'tags' => 'Etiketê vurnayîşê raştî',
 'tag-filter' => 'Avrêcê [[Special:Tags|Etiketi]]:',
 'tag-filter-submit' => 'Avrêc',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiket|Etiketi}}]]: $2)',
 'tags-title' => 'Etiketan',
 'tags-intro' => 'Eno pel de listeyê eyiketî este ke belki software pê ey edit kenî.',
 'tags-tag' => 'Nameyê etiketi',
 'tags-display-header' => 'Listeyê vurnayîşî de esayîş',
 'tags-description-header' => 'Deskripsyonê manay ê hemî',
+'tags-active-header' => 'Activ o?',
 'tags-hitcount-header' => 'Vurnayîşî ke etiket biyê',
+'tags-active-yes' => 'E',
+'tags-active-no' => 'Nê',
 'tags-edit' => 'bıvurne',
 'tags-hitcount' => '$1 {{PLURAL:$1|vurnayış|vurnayışi}}',
 
@@ -4155,6 +4222,9 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 'htmlform-submit' => 'Bişirav',
 'htmlform-reset' => 'Vurnayişî reyna biyar',
 'htmlform-selectorother-other' => 'Bin',
+'htmlform-no' => 'Nê',
+'htmlform-yes' => 'Eya',
+'htmlform-chosen-placeholder' => 'Opsiyon weçine',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 tam-metn destegê cı geyrayışiya piya',
@@ -4271,4 +4341,16 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 # Image rotation
 'rotate-comment' => 'Resim heta sehata $1 {{PLURAL:$1|derece|derecey}} bi cerx',
 
+# Limit report
+'limitreport-title' => 'Agoznaye malumata profili:',
+'limitreport-cputime' => 'CPU dem karnayış',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|saniye|saniyeyan}}',
+'limitreport-walltime' => 'Raştay demdı bıkarn',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|saniye|saniyeyan}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bayt|bayti}}',
+'limitreport-templateargumentsize' => 'Ebata hacetandi şablonan',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bayt|bayti}}',
+'limitreport-expansiondepth' => 'Tewr veşi herayina dergbiyayışi',
+'limitreport-expensivefunctioncount' => 'Amoriya fonksiyonde vay agozni',
+
 );
diff --git a/languages/messages/MessagesDsb.php b/languages/messages/MessagesDsb.php
index b00d6ee4..ef04517a 100644
--- a/languages/messages/MessagesDsb.php
+++ b/languages/messages/MessagesDsb.php
@@ -15,6 +15,7 @@
  * @author Kaganer
  * @author Michawiki
  * @author Murjarik
+ * @author Nemo bis
  * @author Nepl1
  * @author Pe7er
  * @author Qualia
@@ -190,9 +191,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Licbu wobglědujucych wužywarjow pokazaś',
 'tog-oldsig' => 'Eksistěrujuca signatura:',
 'tog-fancysig' => 'Ze signaturu kaž z wikitekstom wobchadaś (bźez awtomatiskego wótkaza)',
-'tog-externaleditor' => 'Eksterny editor ako standard wužywaś (jano za ekspertow, pomina sebje specialne nastajenja na wašom licadle. [//www.mediawiki.org/wiki/Manual:External_editors Dalšne informacije.])',
-'tog-externaldiff' => 'Eksterny diff ako standard wužywaś (jano za ekspertow, pomina sebje specialne nastajenja na wašom licadle. [//www.mediawiki.org/wiki/Manual:External_editors Dalšne informacije.])',
-'tog-showjumplinks' => 'Wótkaze typa „źi do” zmóžniś',
 'tog-uselivepreview' => 'Live-pśeglěd wužywaś (JavaScript) (eksperimentelnje)',
 'tog-forceeditsummary' => 'Warnowaś, gaž pśi składowanju zespominanje felujo',
 'tog-watchlisthideown' => 'Móje změny na wobglědowańskej lisćinje schowaś',
@@ -205,6 +203,7 @@ $messages = array(
 'tog-diffonly' => 'Pśi pśirownowanju wersijow jano rozdźěle pokazaś',
 'tog-showhiddencats' => 'Schowane kategorije pokazaś',
 'tog-norollbackdiff' => 'Rozdźěl pó slědkstajenju zanjechaś',
+'tog-useeditwarning' => 'Warnowaś, gaž bok spušća se z njeskłaźonymi změnami',
 
 'underline-always' => 'pśecej',
 'underline-never' => 'žednje',
@@ -392,7 +391,7 @@ $1',
 'pool-queuefull' => 'Cakajucy rěd jo połny',
 'pool-errorunknown' => 'Njeznata zmólka',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Wó {{GRAMMAR:lokatiw|{{SITENAME}}}}',
 'aboutpage' => 'Project:Wó_{{GRAMMAR:lokatiw|{{SITENAME}}}}',
 'copyright' => 'Wopśimjeśe stoj pód $1.',
@@ -402,7 +401,6 @@ $1',
 'disclaimers' => 'Impresum',
 'disclaimerpage' => 'Project:impresum',
 'edithelp' => 'Pomoc pśi wobźěłanju',
-'edithelppage' => 'Help:Pomoc pśi wobźěłanju',
 'helppage' => 'Help:Pomoc',
 'mainpage' => 'Głowny bok',
 'mainpage-description' => 'Głowny bok',
@@ -479,17 +477,6 @@ Płaśece specialne boki namakaju se pód [[Special:SpecialPages|lisćinu specia
 # General errors
 'error' => 'Zmólka',
 'databaseerror' => 'Zmólka w datowej bance',
-'dberrortext' => 'Syntaktiska zmólka pśi wótpšašowanju datoweje banki nastata.
-To by mógło zmólki w softwarje byś.
-Slědne wótpšašowanje jo było:
-<blockquote><code>$1</code></blockquote>
-z funkcije "<code>$2</code>".
-Datowa banka jo zmólku "<samp>$3: $4</samp>" wrośiła.',
-'dberrortextcl' => 'Syntaktiska zmólka pśi wótpšašowanju datoweje banki nastata.
-Slědne wopytane wótpšašowanje jo było:
-"$1"
-z funkcije "$2".
-Datowa banka jo zmólku "$3: $4" wrośiła',
 'laggedslavemode' => 'Glědaj: Jo móžno, až pokazany bok nejaktualnjejše změny njewopśimjejo.',
 'readonly' => 'Datowa banka jo zacynjona',
 'enterlockreason' => 'Pšosym zapódaj pśicynu za zacynjenje datoweje banki a informaciju, ga buźo zasej pśistupna',
@@ -541,7 +528,6 @@ Wótpšašanje: $2',
 Aby pśełožki za wšykne wikije pśidał abo změnił, wužyj pšosym [//translatewiki.net/ translatewiki.net], lokalizěrowański projekt MediaWiki.',
 'editinginterface' => "'''Warnowanje:''' Wobźěłujoš bok, kótaryž se wužywa, aby se tekst za pówjerch software MediaWiki k dispoziciji stajił. Změny na toś tom boku buźo wuglědanje wužywarskego pówjercha za drugich wužywarjow na toś tom wikiju wobwliwowaś.
 Aby pśełožki za wšykne wikije pśidał abo změnił, wužywaj pšosym [//translatewiki.net/ translatewiki.net], projekt MediaWiki za lokalizacije.",
-'sqlhidden' => '(Wótpšašanje SQL schowane)',
 'cascadeprotected' => 'Za toś ten bok jo se wobźěłowanje znjemóžniło, dokulaž jo zawězany do {{PLURAL:$1|slědujucego boka|slědujuceju bokowu|slědujucych bokow}}, {{PLURAL:$1|kótaryž jo|kótarejž stej|kótarež su}} pśez kaskadowu opciju {{PLURAL:$1|šćitany|šćitanej|šćitane}}: $2',
 'namespaceprotected' => "Njejsy wopšawnjony, boki w rumje: '''$1''' wobźěłaś.",
 'customcssprotected' => 'Njamaš pšawo, aby toś ten CSS-bok wobźěłał, dokulaž wopśimujo  wósobinske nastajenja drugego wužywarja.',
@@ -569,10 +555,18 @@ Móžoš {{SITENAME}} anomymnje dalej wužywaś abo móžoš <span class='plainl
 'welcomeuser' => 'Witaj $1',
 'welcomecreation-msg' => 'Twójo konto jo se załožyło. Njezabydni změniś swóje [[Special:Preferences|nastajenja za {{SITENAME}}]].',
 'yourname' => 'mě wužywarja',
+'userlogin-yourname' => 'Wužywarske mě',
+'userlogin-yourname-ph' => 'Zapódaj swójo wužywarske mě',
 'yourpassword' => 'šćitne gronidło:',
+'userlogin-yourpassword' => 'Gronidło',
+'userlogin-yourpassword-ph' => 'Zapódaj swójo gronidło',
+'createacct-yourpassword-ph' => 'Zapódaj gronidło',
 'yourpasswordagain' => 'Šćitne gronidło hyšći raz zapódaś:',
+'createacct-yourpasswordagain' => 'Gronidło wobkšuśiś',
+'createacct-yourpasswordagain-ph' => 'Zapódaj gronidło hyšći raz',
 'remembermypassword' => 'Na toś tom licadle pśizjawjony wóstaś (za maksimalnje $1 {{PLURAL:$1|źeń|dnja|dny|dnjow}})',
-'securelogin-stick-https' => 'Pó pśizjawjenju z HTTPS zwězany wóstaś',
+'userlogin-remembermypassword' => 'Pśizjawjony wóstaś',
+'userlogin-signwithsecure' => 'Wěsty zwisk wužywaś',
 'yourdomainname' => 'Twója domejna',
 'password-change-forbidden' => 'Njamóžoš gronidła w toś tom wikiju změniś.',
 'externaldberror' => 'Abo jo wustupiła eksterna zmólka awtentifikacije datoweje banki, abo njesmějoš swójo eksterne wužywarske konto aktualizěrowaś.',
@@ -584,12 +578,17 @@ Móžoš {{SITENAME}} anomymnje dalej wužywaś abo móžoš <span class='plainl
 'logout' => 'wótzjawiś se',
 'userlogout' => 'wótzjawiś se',
 'notloggedin' => 'Njepśizjawjony(a)',
+'userlogin-noaccount' => 'Njamaš wužywarske konto?',
+'userlogin-joinproject' => 'Konto za {{GRAMMAR:akuzatiw|{{SITENAME}}}} załožyś',
 'nologin' => 'Njamaš wužywarske konto? $1.',
 'nologinlink' => 'Nowe wužywarske konto załožyś',
 'createaccount' => 'Wužywarske konto załožyś',
 'gotaccount' => "Maš južo wužywarske konto? '''$1'''.",
 'gotaccountlink' => 'Pśizjawiś se',
 'userlogin-resetlink' => 'Sy pśizjawjeńske daty zabył?',
+'userlogin-resetpassword-link' => 'Gronidło anulěrowaś',
+'helplogin-url' => 'Help:Pśizjawiś',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc za pśizjawjenje]]',
 'createaccountmail' => 'Nachylne pśidatne gronidło wužywaś a jo na slědujucu e-mailowu adresu pósłaś',
 'createaccountreason' => 'Pśicyna:',
 'badretype' => 'Šćitnej gronidle, kótarejž sy zapódał, se njemakajotej.',
@@ -665,7 +664,7 @@ Móžoš toś te zdźělenje ignorowaś, jolic toś te konto jo se jano zamólnj
 'newpassword' => 'Nowe šćitne gronidło:',
 'retypenew' => 'Nowe šćitne gronidło (hyšći raz):',
 'resetpass_submit' => 'Šćitne gronidło nastajiś a se pśizjawiś',
-'resetpass_success' => 'Twójo nowe šćitne gronidło jo nastajone. Něnto se pśizjaw …',
+'changepassword-success' => 'Twójo nowe šćitne gronidło jo nastajone. Něnto se pśizjaw …',
 'resetpass_forbidden' => 'Gronidła njedaju se změniś',
 'resetpass-no-info' => 'Dejš pśizjawjony byś, aby direktny pśistup na toś ten bok měł.',
 'resetpass-submit-loggedin' => 'Gronidło změniś',
@@ -676,10 +675,8 @@ Sy snaź swójo gronidło južo wuspěšnje změnił abo nowe nachylne gronidło
 
 # Special:PasswordReset
 'passwordreset' => 'Gronidło slědk stajiś',
-'passwordreset-text' => 'Wupołni toś ten formular, aby swójo gronidło anulěrował.',
 'passwordreset-legend' => 'Gronidło slědk stajiś',
 'passwordreset-disabled' => 'Slědkstajenja gronidłow su se znjemóžnili na toś tom wikiju.',
-'passwordreset-pretext' => '{{PLURAL:$1||Zapódaj dołojce jadne ze slědujucych datowych podaśow}}',
 'passwordreset-username' => 'Wužywarske mě:',
 'passwordreset-domain' => 'Domena:',
 'passwordreset-capture' => 'E-mail se woglědaś?',
@@ -898,12 +895,14 @@ Njejo žedno wujasnjenje.',
 Zda sem až jo wulašowany.',
 'edit-conflict' => 'Wobźěłański konflikt.',
 'edit-no-change' => 'Wašo wobźěłanje jo se ignorěrowało, dokulaž tekst njejo se změnił.',
+'postedit-confirmation' => 'Twója změna jo se składła.',
 'edit-already-exists' => 'Njejo móžno było nowy bok napóraś.
 Eksistěrujo južo.',
 'defaultmessagetext' => 'Standardny tekst powěźeńki',
 'content-failed-to-parse' => 'Parsowanje wopśimjeśa $2 za model $1 jo se njeraźiło: $3',
 'invalid-content-data' => 'Njepłaśiwe wopśimjeśowe daty',
 'content-not-allowed-here' => 'Wopśimjeśe "$1" njejo na boku [[$2]] dowólone',
+'editwarning-warning' => 'Gaž toś ten bok se spušća, mógu se změny zgubiś, kótarež sy pśewjadł. Jolic sy pśizjawjeny, móžoš toś to warnowanje we wótrězku {{int:prefs-editing}} swójich nastajenjow znjemóžniś.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1142,7 +1141,6 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchmenu-legend' => 'Pytańske opcije',
 'searchmenu-exists' => "'''Jo bok z mjenim \"[[\$1]]\" na toś tom wikiju'''",
 'searchmenu-new' => "'''Napóraj bok \"[[:\$1|\$1]]\" na toś tom wikiju!'''",
-'searchhelp-url' => 'Help:Pomoc',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Boki z toś tym prefiksom pśepytaś]]',
 'searchprofile-articles' => 'Wopśimjeśowe boki',
 'searchprofile-project' => 'Pomoc a projektowe boki',
@@ -1184,15 +1182,6 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'search-external' => 'Eksterne pytanje',
 'searchdisabled' => 'Pytanje we {{SITENAME}} jo se deaktiwěrowało. Tak dłujko móžoš w googlu pytaś. Pšosym wobmysli, až móžo pytanski indeks za {{SITENAME}} njeaktualny byś.',
 
-# Quickbar
-'qbsettings' => 'Bocna lejstwa',
-'qbsettings-none' => 'Žedne',
-'qbsettings-fixedleft' => 'nalěwo fiksěrowane',
-'qbsettings-fixedright' => 'napšawo fiksěrowane',
-'qbsettings-floatingleft' => 'nalěwo se znosujuce',
-'qbsettings-floatingright' => 'napšawo se znosujuce',
-'qbsettings-directionality' => 'Kšuty, wótwisny wót pisańskego směra twójeje rěcy',
-
 # Preferences page
 'preferences' => 'Nastajenja',
 'mypreferences' => 'Nastajenja',
@@ -1225,7 +1214,6 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'resetprefs' => 'Njeskłaźone změny zachyśiś',
 'restoreprefs' => 'Wše standardne nastajenja wobnowiś',
 'prefs-editing' => 'Wobźěłaś',
-'prefs-edit-boxsize' => 'Wjelikosć wobźěłowańskego wokna',
 'rows' => 'Rědki:',
 'columns' => 'Słupy:',
 'searchresultshead' => 'Pytaś',
@@ -1236,9 +1224,6 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'recentchangesdays-max' => '(maksimalnje $1 {{PLURAL:$1|źeń|dnja|dny|dnjow}})',
 'recentchangescount' => 'Licba změnow, kótaraž ma se pó standarźe pokazaś:',
 'prefs-help-recentchangescount' => 'To wopśimujo aktualne změny, stawizny bokow a protokole.',
-'prefs-help-watchlist-token' => 'Wupołnjenje toś togo póla z pótajmnym klucom buźo RSS-kanal za twóju wobglědowańku napóraś.
-Něchten, kenž znajo kluc w toś tom pólu, móžo twóju wobglědowańku cytaś, wubjeŕ togodla wěstu gódnotu.
-How jo pśipadnje napórana gódnota, kótaruž móžoš wužywaś: $1',
 'savedprefs' => 'Twóje nastajenja su se składowali.',
 'timezonelegend' => 'Casowa cona:',
 'localtime' => 'Městny cas:',
@@ -1269,7 +1254,6 @@ How jo pśipadnje napórana gódnota, kótaruž móžoš wužywaś: $1',
 'prefs-reset-intro' => 'You can use this page to reset your preferences to the site defaults. This cannot be undone.
 Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standardne gódnoty sedła. To njedajo se anulěrowaś.',
 'prefs-emailconfirm-label' => 'E-mailowe wobkšuśenje:',
-'prefs-textboxsize' => 'Wjelikosć wobźěłowańskego wokna',
 'youremail' => 'E-mail:',
 'username' => 'Mě {{GENDER:$1|wužywarja|wužywarki}}:',
 'uid' => 'ID {{GENDER:$1|wužywarja|wužywarki}}:',
@@ -1506,7 +1490,6 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
 'recentchangeslinked-feed' => 'Změny w zwězanych bokach',
 'recentchangeslinked-toolbox' => 'Změny w zwězanych bokach',
 'recentchangeslinked-title' => 'Změny na bokach, kótarež su z „$1“ zalinkowane',
-'recentchangeslinked-noresult' => 'Zalinkowane boki njejsu we wuzwólonem casu se změnili.',
 'recentchangeslinked-summary' => "To jo lisćina slědnych změnow, kótarež buchu na wótkazanych bokach cynjone (resp. pśi wěstych kategorijach na cłonkach kategorije).
 Boki na [[Special:Watchlist|wobglědowańce]] su '''tucne'''.",
 'recentchangeslinked-page' => 'mě boka:',
@@ -1518,7 +1501,7 @@ Boki na [[Special:Watchlist|wobglědowańce]] su '''tucne'''.",
 'reuploaddesc' => 'Nagraśe pśetergnuś a slědk k nagrawańskemu formularoju',
 'upload-tryagain' => 'Změnjone datajowe wopisanje wótpósłaś',
 'uploadnologin' => 'Njepśizjawjony',
-'uploadnologintext' => 'Dejš se [[Special:UserLogin|pśizjawiś]], aby mógał dataje nagraś.',
+'uploadnologintext' => 'Dejš se $1, aby mógał dataje nagraś.',
 'upload_directory_missing' => 'Nagrawański zapis ($1) felujo a njejo se pśez webserwer napóraś dał.',
 'upload_directory_read_only' => 'Nagrawański zapisk ($1) njedajo se pśez webserwer pisaś.',
 'uploaderror' => 'Nagrawańska zmólka',
@@ -1741,7 +1724,6 @@ Za optimalnu wěstotu img_auth.php jo znjemóžnjony.',
 'http-read-error' => 'Cytańska zmólka HTTP.',
 'http-timed-out' => 'HTTP-napšašowanje jo cas pśekšocyło.',
 'http-curl-error' => 'Zmólka pśi wótwółowanju URL: $1',
-'http-host-unreachable' => 'URL njejo był pśistupny.',
 'http-bad-status' => 'Wob cas HTTP-napšašowanje jo problem był: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1887,11 +1869,6 @@ Snaź coš wopisanje na jeje [$2 boku datajowego wopisanja] wobźěłaś.',
 'statistics-users-active-desc' => 'Wužywarje, kótarež su {{PLURAL:$1|cora|w slědnyma $1 dnjoma|w slědnych $1 dnjach|w slědnych $1 dnjach}} aktiwne byli',
 'statistics-mostpopular' => 'Nejwěcej woglědane boki',
 
-'disambiguations' => 'Boki, kótarež wótkazuju na boki wěcejzmysłowosći',
-'disambiguationspage' => 'Template:Rozjasnjenje zapśimjeśow',
-'disambiguations-text' => 'Slědujuce boki wopśimuju nanejmjenjej jaden wótkaz k bokoju rozjasnjenja zapśimjeśow. Wóne by dejali město togo ku gódnjejšemu bokoju wótkazaś.<br />
-Maju bok za  bok rozjasnjenja zapśimjeśow, gaž wužywa pśedłogu, na kótaruž wótkazujo se wót [[MediaWiki:Disambiguationspage]].',
-
 'pageswithprop' => 'Boki z kakosću boka',
 'pageswithprop-legend' => 'Boki z kakosću boka',
 'pageswithprop-text' => 'Toś ten bok nalicyjo boki, kótarež wužywaju wěstu kakosć boka.',
@@ -2142,10 +2119,9 @@ Pózdźejšne změny na toś tom boku a w pśisłušecej diskusiji se tam nalicu
 'unwatchthispage' => 'Dalej njewobglědowaś',
 'notanarticle' => 'To njejo žeden nastawk',
 'notvisiblerev' => 'Wersija bu wulašowana',
-'watchnochange' => 'Žeden wót tebje wobglědowany bok njejo se we wótpowědujucem casu wobźěłał.',
 'watchlist-details' => 'Wobglědujoš {{PLURAL:$1|$1 bok|$1 boka|$1 boki|$1 bokow}}, bźez diskusijnych bokow.',
-'wlheader-enotif' => '* E-mailowe powěsće su aktiwizěrowane.',
-'wlheader-showupdated' => "* Boki, kótarež su wót twójogo slědnego woglěda se změnili, pokazuju se '''tucnje'''.",
+'wlheader-enotif' => 'E-mailowe powěsće su aktiwizěrowane.',
+'wlheader-showupdated' => "Boki, kótarež su wót twójogo slědnego woglěda se změnili, pokazuju se '''tucnje'''.",
 'watchmethod-recent' => 'Kontrolěrowanje aktualnych změnow we wobglědowańce',
 'watchmethod-list' => 'Pśepytanje wobglědowanych bokow za aktualnymi změnami',
 'watchlistcontains' => 'Twója wobglědowańka wopśimujo $1 {{PLURAL:$1|bok|boka|boki|bokow}}.',
@@ -2532,13 +2508,11 @@ Glědaj do [[Special:BlockList|lisćiny blokěrowanjow]], aby blokěrowanja pśe
 'ipb_blocked_as_range' => 'Zmólka: IP-adresa $1 njejo direktnje blokěrowana a njeda se wótblokěrowaś. Jo pak ako źěl wobcerka $2 blokěrowana, kótaryž da se wótblokěrowaś.',
 'ip_range_invalid' => 'Njepłaśecy wobłuk IP-adresow.',
 'ip_range_toolarge' => 'Wobcerkowe bloki, kótarež su wětše ako /$1, njejsu dowólone.',
-'blockme' => 'blokěruj mě',
 'proxyblocker' => 'Blokěrowanje proxy',
-'proxyblocker-disabled' => 'Toś ta funkcija jo znjemóžnjona.',
 'proxyblockreason' => 'Twója IP-adresa jo se blokěrowała, dokulaž jo wócynjony proxy. Pšosym kontaktěruj swójogo seśowego providera abo swóje systemowe administratory a informěruj je wó toś tom móžnem wěstotnem problemje.',
-'proxyblocksuccess' => 'Gótowe.',
 'sorbsreason' => 'Twója IP-adresa jo w DNSBL we {{GRAMMAR:lokatiw|{{SITENAME}}}} zapisana ako wócynjony proxy.',
 'sorbs_create_account_reason' => 'Twója IP-adresa jo w DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} ako wócynjony proxy zapisana. Njejo móžno, nowe wužywarske konta załožowaś.',
+'xffblockreason' => 'IP-adresa w header X-Forwarded-For, pak twója pak ta proksy-serwera, kótaryž wužywaš, jo se zablokěrowała. Spócetna pśicyna za blokěrowanje jo była: $1',
 'cant-block-while-blocked' => 'Njesmějoš žednych drugich wužywarjow blokěrowaś, mjaztym až ty sy blokěrowany.',
 'cant-see-hidden-user' => 'Wužywaŕ, kótaregož wopytujoš blokěrowaś, jo južo zablokěrowany a schowany. Dokulaž njamaš pšawo wužywarja schowaś, njamóžoš blokěrowanje wužywarja wiźeś abo wobźěłaś.',
 'ipbblocked' => 'Njamóžoš drugich wužywarjow blokěrowaś abo wótblokěrowaś, dokulaž ty sam jo zablokěrowany',
@@ -2922,13 +2896,8 @@ W zespominanju dajo se pśicyna pódaś.',
 'pageinfo-category-files' => 'Licba datajow',
 
 # Skin names
-'skinname-standard' => 'Klasiski',
-'skinname-nostalgia' => 'Nostalgiski',
 'skinname-cologneblue' => 'Kölnski Módry',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Mój šat',
-'skinname-chick' => 'Kurjetko',
-'skinname-simple' => 'Jadnorje',
 'skinname-modern' => 'Moderny',
 
 # Patrolling
@@ -3036,7 +3005,7 @@ Slědujuce wótkaze w tej samej smužce se za wuwześa naglědaju, w kótarychž
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Šyrokosć',
 'exif-imagelength' => 'Wusokosć',
 'exif-bitspersample' => 'Bity na komponentu',
@@ -3214,7 +3183,7 @@ Slědujuce wótkaze w tej samej smužce se za wuwześa naglědaju, w kótarychž
 'exif-originalimageheight' => 'Wusokosć wobraza pśed pśirězowanim',
 'exif-originalimagewidth' => 'Šyrokosć wobraza pśed pśirězowanim',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Njekompriměrowany',
 'exif-compression-2' => 'CCITT kupka 3 jadnodimensionalne modificěrowane koděrowanje Huffman běgoweje dłujkosći',
 'exif-compression-3' => 'CCITT kupka 3 faksowe koděrowanje',
@@ -3607,7 +3576,6 @@ Móžoš teke [[Special:EditWatchlist|standardny wobźěłowański bok wužywaś
 'version-other' => 'Druge',
 'version-mediahandlers' => 'Pśeźěłaki medijow',
 'version-hooks' => 'Kokule',
-'version-extension-functions' => 'Funkcije rozšyrjenjow',
 'version-parser-extensiontags' => 'Tagi parserowych rozšyrjenjow',
 'version-parser-function-hooks' => 'Parserowe funkcije',
 'version-hook-name' => 'Mě kokule',
@@ -3629,13 +3597,6 @@ Ty by dejał [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju licence GNU General Public
 'version-entrypoints-header-entrypoint' => 'Zastupny dypk',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Datajowa droga',
-'filepath-page' => 'Dataja:',
-'filepath-submit' => 'Pytaś',
-'filepath-summary' => 'Toś ten specialny bok wróśa dopołnu drogu za dataju.
-Wobraze se w połnym wótgranicowanju pokazuju, druge datajowe typy se ze zwězanym programom direktnje startuju.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Za duplikatnymi datajami pytaś',
 'fileduplicatesearch-summary' => 'Za datajowymi duplikatami na zakłaźe gótnoty hash pytaś.',
diff --git a/languages/messages/MessagesDtp.php b/languages/messages/MessagesDtp.php
index 436c90ab..2ec192b5 100644
--- a/languages/messages/MessagesDtp.php
+++ b/languages/messages/MessagesDtp.php
@@ -44,9 +44,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Pokitono ginumu do momomoguno minongintong',
 'tog-oldsig' => 'Sain poinsandad:',
 'tog-fancysig' => 'Pokitono sain sobaagi do tikwiki (ingaa oporian toput )',
-'tog-externaleditor' => 'Pomoguno pongigidit poinlabus sobaagi do pongoiso (montok di angasampin nopo, mongoguno do nuludan pointantu id kompiutonu. [//www.mediawiki.org/wiki/Manual:External_editors Lobi pomoilaan.])',
-'tog-externaldiff' => 'Pomoguno pongigidit poinlabus sobaagi do pongoiso (montok di angasampin nopo, mongoguno do nuludan pointantu id kompiutonu. [//www.mediawiki.org/wiki/Manual:External_editors Lobi pomoilaan.])',
-'tog-showjumplinks' => 'Pasagao "tumopik hilo" noputan awayaan',
 'tog-uselivepreview' => 'Momoguno pongingintong poimpasi (momoguno JawaSikrip) (pogumbalan)',
 'tog-forceeditsummary' => 'Posoroho oku no nung awu nosuangan kutak koinibaan niditan',
 'tog-watchlisthideown' => 'Polisoko niditanku mantad do lis piintangan',
@@ -246,7 +243,7 @@ $1',
 'pool-queuefull' => 'Noponu nuludan pool',
 'pool-errorunknown' => 'Ukam nosilap',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Kokomoi {{SITENAME}}',
 'aboutpage' => 'Project:Kokomoi',
 'copyright' => 'Suang di haro do kokomoi $1.',
@@ -256,7 +253,6 @@ $1',
 'disclaimers' => 'Pogoliman',
 'disclaimerpage' => 'Project:Pogoliman kosoruan',
 'edithelp' => 'Sokodung mongidit',
-'edithelppage' => 'Help:Mongidit',
 'helppage' => 'Help:Susuang',
 'mainpage' => 'Natad tagayo',
 'mainpage-description' => 'Natad tagayo',
@@ -334,17 +330,6 @@ Lis pointopot bobolikon pinatantu okito id [[Special:SpecialPages|{{int:specialp
 # General errors
 'error' => 'Nosilopan',
 'databaseerror' => 'Nakasala databing',
-'dberrortext' => 'Nokosilap pogiuludan databing.
-Haro kaanto kutu id posuang-suangon.
-Tohuri pinokianu pogiuludan databing nopo nga:
-<blockquote><code>$1</code></blockquote>
-mantad suang momoguno "<code>$2</code>".
-Databing nokosilap pinopoguli "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Haro kinosilapan pinongimuhatan sintak diri databing.
-Pinokianu databing di nokotohuri nopo nga:
-"$1"
-mantad kopomogunoon "$2".
-Nokosilap pinonimbar databing do "$3: $4"',
 'laggedslavemode' => "'''Panansarahan:''' Awu moti kaanto nopinwoguan suang do bolikon diti.",
 'readonly' => 'Nokunsian databing',
 'enterlockreason' => 'Posuango sabab do mongunsi, poobion do gisom soira oukaban kunsi',
@@ -401,7 +386,6 @@ Nung mongoruhang toi monimban do waliwboros tongowiki, mangai noh gunoo iri puru
 'editinginterface' => "Panansarahan :''' Mongidit ko diti bolikon di gunoon do poposodia diri pongurasan montok posuang-suangon.
 Sinuratan id bolikon diti kopogoit do pongitanan  kourasan momoguno  montok momomoguno suai.
 Montok mongoruhang toi monimban do waliwboros, gunoo noh [//translatewiki.net/ translatewiki.net], purujik popodusun ModiaWiki.",
-'sqlhidden' => '(Pongimuhatan SQL poinlisok)',
 'cascadeprotected' => 'Notingoligan bolikon diti mantad do pingiditan tu nokosuang  id bolikon, {{PLURAL:$1 | do | it}} pinilian tingolig  "kasading" poinsikit:
 $2',
 'namespaceprotected' => "Ingaa kasagaannu do mongidit bobolikon it kinoingaran '''$1'''.",
@@ -435,7 +419,6 @@ Soroho noh do mongolon do [[Special:Preferences|{{SITENAME}} komoisaannu]].',
 'yourpassword' => 'Kaatalib:',
 'yourpasswordagain' => 'Mintaipo kaatalib:',
 'remembermypassword' => 'Soroho ot loginku id popogihuman diti (gisom solinaid do $1 {{PLURAL:$1|tadau|madau}})',
-'securelogin-stick-https' => 'Toririmo poinhubung hilo HTTPS soira kosuang log',
 'yourdomainname' => 'Damin nu:',
 'password-change-forbidden' => 'Awu koh kopongolon kaatalib id wiki diti.',
 'externaldberror' => 'Haro nokosilap pongintutunan bingdata toi awu ko pasagaon monginwagu takaun poinsoliwannu.',
@@ -542,7 +525,7 @@ Momongoh do sinuang log, mositi do powonsoionnu kaatalib wagu do hiti.:',
 'newpassword' => 'Kaatalib wagu:',
 'retypenew' => 'Mitaipo kaatalib wagu:',
 'resetpass_submit' => 'Posoino kaatalib om sumuang log',
-'resetpass_success' => 'Naalanan noh kaatalibnu!
+'changepassword-success' => 'Naalanan noh kaatalibnu!
 Baino sumuang log...',
 'resetpass_forbidden' => 'Awu milo alanan kaatalib',
 'resetpass-no-info' => 'Mositi sumuang log ko do mongoguno monilombus id bolikon diti.',
@@ -554,10 +537,8 @@ Naalanannu noh kaatalib toi nokopokianu koh no do kaatalib daamot.',
 
 # Special:PasswordReset
 'passwordreset' => 'Pudoliai kawagu kaatalib',
-'passwordreset-text' => 'Gonopo poom diti do mangaramit tongosurat-i ponorou do nokomoi id akaun.',
 'passwordreset-legend' => 'Pudoliai kawagu kaatalib',
 'passwordreset-disabled' => 'Pomudolian kawagu do kaatalib kitaantob id wiki diti.',
-'passwordreset-pretext' => '{{PLURAL:$1||Posuango iso data id siriba}}',
 'passwordreset-username' => 'Ngarandait:',
 'passwordreset-domain' => 'Sumanganu:',
 'passwordreset-capture' => 'Intaai surat-i dii nowonsoi?',
@@ -953,7 +934,6 @@ Intaai [[Special:BlockList|lis nantaban]] montok lis kawawagu karaja mogoduh om
 'searchmenu-legend' => 'Pilion ihum-ihumon',
 'searchmenu-exists' => "'''Haro no bolikon pinungaranan do \"[[:\$1]]\" hiti id wiki.'''",
 'searchmenu-new' => "'''Pomonsoi do bolikon \"[[:\$1]]\"hiti id wiki!'''",
-'searchhelp-url' => 'Help:Susuang',
 'searchprofile-articles' => 'Suang bobolikon',
 'searchprofile-project' => 'Tatabang om Tongobolikon purujik',
 'searchprofile-images' => 'Multimodia',
@@ -993,14 +973,6 @@ Umbalai momogonop it ihumonnu miampai do ''all:'' mooi do oihum ot oinsanan suan
 Milo ko mogihum maya Googol do daamot.
 Imurai no do indik suang diti {{SITENAME}} nopo nga nokolipas.',
 
-# Quickbar
-'qbsettings' => 'Barposikap',
-'qbsettings-none' => 'Ingaa',
-'qbsettings-fixedleft' => 'Pogolibango',
-'qbsettings-fixedright' => 'Pawanano',
-'qbsettings-floatingleft' => 'Posoibaho gibang',
-'qbsettings-floatingright' => 'Posoibaho wanan',
-
 # Preferences page
 'preferences' => 'Pipilion',
 'mypreferences' => 'Pipilion',
@@ -1105,7 +1077,6 @@ Imurai no do indik suang diti {{SITENAME}} nopo nga nokolipas.',
 'recentchangeslinked' => 'Kinaalanan di kohompit',
 'recentchangeslinked-toolbox' => 'Kinaalanan di kohompit',
 'recentchangeslinked-title' => "Kinowolion 'parameter' it awu noguno: $1",
-'recentchangeslinked-noresult' => 'Ingaa nalanan do noputan bolikon id timpu nokomoi.',
 'recentchangeslinked-summary' => "Iti nopo nga lis kawawagu kaalanai winonsoi kumaa noputan bobolikon mantad bolikon pointantu (toi kumaa momomoguno tinansaran pointantu).
 Bobolikon id [[Special:Watchlist|lis pintangannu]] nopo nga '''pinakapal'''.",
 'recentchangeslinked-page' => 'Ngaran bolikon:',
@@ -1171,8 +1142,6 @@ Kointalangan dilo [$2 kointalangan pail] okito id siriba.',
 # Statistics
 'statistics' => 'Runumboboyo',
 
-'disambiguationspage' => 'Template:patarango',
-
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bait|babait}}',
 'nmembers' => '$1 {{PLURAL:$1|koombolutan|tongokoombolutan}}',
diff --git a/languages/messages/MessagesDv.php b/languages/messages/MessagesDv.php
index 4016edc0..87c5aeb6 100644
--- a/languages/messages/MessagesDv.php
+++ b/languages/messages/MessagesDv.php
@@ -19,45 +19,74 @@ $rtl = true;
 
 $namespaceNames = array(
 	NS_MEDIA            => 'މީޑިއާ',
-	NS_SPECIAL          => 'ހާއްޞަ',
+	NS_SPECIAL          => 'ޚާއްސަ',
 	NS_MAIN             => '',
 	NS_TALK             => 'ޚިޔާލު',
 	NS_USER             => 'މެމްބަރު',
 	NS_USER_TALK        => 'މެމްބަރުގެ_ވާހަކަ',
-	NS_FILE             => 'ފައިލް',
-	NS_FILE_TALK        => 'ފައިލް_ޚިޔާލު',
+	NS_PROJECT_TALK     => '$1ގެ_ވާހަކަ',
+	NS_FILE             => 'ފައިލު',
+	NS_FILE_TALK        => 'ފައިލުގެ_ޚިޔާލު',
 	NS_MEDIAWIKI        => 'މީޑިއާވިކީ',
-	NS_MEDIAWIKI_TALK   => 'މީޑިޔާވިކި_ޚިޔާލު',
+	NS_MEDIAWIKI_TALK   => 'މިޑިއާވިކީ_ޚިޔާލު',
 	NS_TEMPLATE         => 'ފަންވަތް',
-	NS_TEMPLATE_TALK    => 'ފަންވަތް_ޚިޔާލު',
+	NS_TEMPLATE_TALK    => 'ފަންވަތުގެ_ޚިޔާލު',
 	NS_HELP             => 'އެހީ',
-	NS_HELP_TALK        => 'އެހީ_ޚިޔާލު',
+	NS_HELP_TALK        => 'އެހީގެ_ޚިޔާލު',
 	NS_CATEGORY         => 'ޤިސްމު',
-	NS_CATEGORY_TALK    => 'ޤިސްމު_ޚިޔާލު',
+	NS_CATEGORY_TALK    => 'ޤިސްމުގެ_ޚިޔާލު',
+);
+
+$namespaceAliases = array(
+	'ހާއްޞަ'          => NS_SPECIAL,
+	'ފައިލް'           => NS_FILE,
+	'ފައިލް_ޚިޔާލު'    => NS_FILE_TALK,
+	'މީޑިޔާވިކި_ޚިޔާލު' => NS_MEDIAWIKI_TALK,
+	'ފަންވަތް_ޚިޔާލު'  => NS_TEMPLATE_TALK,
+	'އެހީ_ޚިޔާލު'      => NS_HELP_TALK,
+	'ޤިސްމު_ޚިޔާލު'   => NS_CATEGORY_TALK,
 );
 
 $specialPageAliases = array(
-	'Allpages'                  => array( 'ހުރިހާ ސަފްޙާއެއް' ),
+	'Activeusers'               => array( 'ހަރަކާތްތެރި_މެމްބަރުން' ),
+	'Allmessages'               => array( 'ހުރިހާ_މެސެޖެއް' ),
+	'Allpages'                  => array( 'ހުރިހާ_ޞަފްޙާއެއް' ),
+	'Ancientpages'              => array( 'ބާ_ޞަފްޙާތައް' ),
+	'Blankpage'                 => array( 'ހުސް_ޞަފްޙާ' ),
 	'Contributions'             => array( 'ޙިއްސާ' ),
-	'CreateAccount'             => array( 'މެމްބަރުކަން ހާސިލްކުރައްވާ' ),
-	'Emailuser'                 => array( 'މެމްބަރަށް އީ-މެއިލް ފޮނުވާ' ),
-	'BlockList'                 => array( 'ބްލޮކް ކުރެވިފައިވާ ލިސްޓް' ),
-	'Listfiles'                 => array( 'ފައިލް ލިސްޓް' ),
-	'Longpages'                 => array( 'ދިގު ސަފްޙާތައް' ),
-	'Newimages'                 => array( 'އާ ފައިލް' ),
-	'Newpages'                  => array( 'އާ ސަފްހާތައް' ),
+	'CreateAccount'             => array( 'މެމްބަރުކަން_ހާސިލްކުރައްވާ' ),
+	'Emailuser'                 => array( 'މެމްބަރަށް_އީ-މެއިލް_ފޮނުވާ' ),
+	'BlockList'                 => array( 'ބްލޮކް_ކުރެވިފައިވާ_ލިސްޓް' ),
+	'Listfiles'                 => array( 'ފައިލް_ލިސްޓް' ),
+	'Log'                       => array( 'ލޮގު' ),
+	'Longpages'                 => array( 'ދިގު_ސަފްޙާތައް' ),
+	'Mypage'                    => array( 'މަގޭ_ޞަފްޙާ' ),
+	'Mytalk'                    => array( 'މަގޭ_ވާހަކަ' ),
+	'Myuploads'                 => array( 'މަގޭ_ފައިލުތައް' ),
+	'Newimages'                 => array( 'އާ_ފައިލް' ),
+	'Newpages'                  => array( 'އާ_ސަފްހާތައް' ),
 	'Preferences'               => array( 'ތަރުޖީހުތައް' ),
-	'Protectedpages'            => array( 'ދިފާޢުކުރެވިފައިވާ ސަފްޙާތައް' ),
-	'Randompage'                => array( 'ކޮންމެވެސް ސަފްޙާއެއް' ),
-	'Recentchanges'             => array( 'އެންމެ ފަހުގެ ބަދަލްތައް' ),
-	'Shortpages'                => array( 'ކުރު ސަފްޙާތައް' ),
-	'Specialpages'              => array( 'ޙާއްސަ ސަފްޙާތައް' ),
-	'Uncategorizedtemplates'    => array( 'ޤިސްމުކުރެވިފައި ނުވާ ފަންވަތް' ),
-	'Unusedcategories'          => array( 'ބޭނުން ނުކުރާ ޤިސްމުތައް' ),
-	'Unusedimages'              => array( 'ބޭނުން ނުކުރާ ފައިލް' ),
+	'Protectedpages'            => array( 'ދިފާޢުކުރެވިފައިވާ_ސަފްޙާތައް' ),
+	'Protectedtitles'           => array( 'ދިފާޢުކުރެވިފައިވާ_ނަންތައް' ),
+	'Randompage'                => array( 'ކޮންމެވެސް_ސަފްޙާއެއް' ),
+	'Recentchanges'             => array( 'އެންމެ_ފަހުގެ_ބަދަލުތައް' ),
+	'Search'                    => array( 'ހޯއްދަވާ' ),
+	'Shortpages'                => array( 'ކުރު_ސަފްޙާތައް' ),
+	'Specialpages'              => array( 'ޙާއްސަ_ސަފްޙާތައް' ),
+	'Statistics'                => array( 'ތަފާސްހިސާބު' ),
+	'Uncategorizedpages'        => array( 'ޤިސްމުކުރެވިފައިނުވާ_ޞަފްޙާތައް' ),
+	'Uncategorizedtemplates'    => array( 'ޤިސްމުކުރެވިފައިނުވާ_ފަންވަތް' ),
+	'Unusedcategories'          => array( 'ބޭނުން_ނުކުރާ_ޤިސްމުތައް' ),
+	'Unusedimages'              => array( 'ބޭނުން_ނުކުރާ_ފައިލް' ),
+	'Unusedtemplates'           => array( 'ބޭނުންނުކުރާ_ފަންވަތްތައް' ),
 	'Upload'                    => array( 'ފޮނުއްވާ' ),
 	'Userlogin'                 => array( 'ވަދެވަޑައިގަންނަވާ' ),
-	'Userlogout'                => array( 'ބޭރަށް ވަޑައިގަންނަވާ' ),
+	'Userlogout'                => array( 'ބޭރަށް_ވަޑައިގަންނަވާ' ),
+	'Wantedcategories'          => array( 'ބޭނުންވާ_ޤިސްމުތައް' ),
+	'Wantedfiles'               => array( 'ބޭނުންވާ_ފައިލުތައް' ),
+	'Wantedpages'               => array( 'ބޭނުންވާ_ޞަފްޙާތައް' ),
+	'Wantedtemplates'           => array( 'ބޭނުންވާ_ފަންވަތްތައް' ),
+	'Watchlist'                 => array( 'މަގޭ_ނަޒަރު' ),
 );
 
 $messages = array(
@@ -232,7 +261,7 @@ $messages = array(
 $1',
 'pool-errorunknown' => 'ކޮންމެވެސް ކުށެއް',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}ގެ ތަޢާރަފު',
 'aboutpage' => 'Project:ތަޢާރަފު',
 'copyright' => 'ހުރިހާ މާއްދާއެއް $1 ގެ ދަށުން ލިބެން އެބަހުއްޓެވެ.',
@@ -242,7 +271,6 @@ $1',
 'disclaimers' => 'އިއުލާނުތައް',
 'disclaimerpage' => 'Project:ޢާއްމު ޢިއުލާނުތައް',
 'edithelp' => 'ބަދަލުތައް ގެނައުމަށް އެހީ އެއް',
-'edithelppage' => 'އެހީ: އުނިއިތުރު ގެންނެވުން',
 'helppage' => 'Help:ފިހުރިސްތު',
 'mainpage' => 'މައި ޞަފްޙާ',
 'mainpage-description' => 'މައި ޞަފްޙާ',
@@ -348,7 +376,7 @@ $1',
 'newpassword' => 'އައު ސިއްރުބަސް:',
 'retypenew' => 'އައު ސިއްރުބަސް އަލުންލިޔުއްވާ:',
 'resetpass_submit' => 'ސިއްރުބަސް ހަމަޖައްސަވާފައި ވަދެވަޑައިގަންނަވާ',
-'resetpass_success' => 'ތިބެފުޅާގެ ސިއްރުބަސް ބަދަލުކުރެވިއްޖެ. 
+'changepassword-success' => 'ތިބެފުޅާގެ ސިއްރުބަސް ބަދަލުކުރެވިއްޖެ. 
 މިހާރު ވަދެވަޑައިގަންނަވަނީ...',
 'resetpass_forbidden' => 'ސިއްރުބަސް ބަދަލެއް ނުކުރެވޭނެއެވެ',
 'resetpass-submit-loggedin' => 'ސިއްރުބަސް ބަދަލުކުރައްވާ',
@@ -470,7 +498,6 @@ $1',
 'shown-title' => 'ދައްކަވާނީ ޞަފްޙާއަކަށް $1 {{PLURAL:$1|ނަތީޖާ|ނަތީޖާ }}',
 'viewprevnext' => 'ބައްލަވާ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-new' => "''' މި ވިކީގައި \"[[:\$1]]\" ފަށްޓަވައިދެއްވާ! '''",
-'searchhelp-url' => 'Help:ފިހުރިސްތު',
 'searchprofile-articles' => 'މަޒުމޫނު ޞަފްޙާތައް',
 'searchprofile-project' => 'އެހީ ޞަފްޙާތަކާއި މަޝްރޫޢު ޞަފްޙާތައް',
 'searchprofile-images' => 'މަލްޓިމީޑިއާ',
@@ -707,7 +734,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'blocklink' => 'ފިޔަވަޅުއަޅުއްވާ',
 'unblocklink' => 'ފިޔަވަޅުއެޅުން ބަދަލުކުރައްވާ',
 'contribslink' => 'ޙިއްޞާ',
-'proxyblocksuccess' => 'ފުރިހަމަވެއްޖެ.',
 
 # Developer tools
 'lockdb' => 'ކޮށާރު ބަންދުކުރައްވާ',
@@ -801,7 +827,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Metadata
 'metadata' => 'މެޓަޑޭޓާ',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ފުޅާމިން',
 'exif-imagelength' => 'އުސްމިން',
 'exif-imagedescription' => 'ތަސްވީރުގެ ސުރުހީ',
diff --git a/languages/messages/MessagesEe.php b/languages/messages/MessagesEe.php
index 633f5f28..5c7c89eb 100644
--- a/languages/messages/MessagesEe.php
+++ b/languages/messages/MessagesEe.php
@@ -588,9 +588,6 @@ Wòateŋu akpɔ alesi woŋlɔe.',
 # Special:Version
 'version' => 'Tata',
 
-# Special:FilePath
-'filepath-submit' => 'Yi',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Dii',
 
diff --git a/languages/messages/MessagesEgl.php b/languages/messages/MessagesEgl.php
index ccc01396..0d97e11e 100644
--- a/languages/messages/MessagesEgl.php
+++ b/languages/messages/MessagesEgl.php
@@ -322,14 +322,6 @@ Cancellä',
 'powersearch-toggleall' => 'Tütt',
 'powersearch-togglenone' => 'Ansöin',
 
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Ansöin',
-'qbsettings-fixedleft' => 'Fiss a sinistar',
-'qbsettings-fixedright' => 'Fiss a destar',
-'qbsettings-floatingleft' => 'Fluttuant a sinistar',
-'qbsettings-floatingright' => 'Fluttuant a destar',
-
 # Preferences page
 'preferences' => 'Prefereinz',
 'mypreferences' => 'Al me prefereinz',
@@ -610,7 +602,7 @@ Vadä la pàgina dal file',
 # Metadata
 'metadata' => 'Metadat',
 
-# EXIF tags
+# Exif tags
 'exif-exposuretime-format' => '$1 s ($2)',
 'exif-gpsareainformation' => "Nom d'la zona GPS",
 'exif-gpsdatestamp' => 'Data GPS',
@@ -657,10 +649,6 @@ Vadä la pàgina dal file',
 'version-license' => 'Licinza',
 'version-poweredby-others' => 'ätar',
 
-# Special:FilePath
-'filepath-page' => 'Immàgin:',
-'filepath-submit' => 'Vé',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Nom dal file:',
 'fileduplicatesearch-submit' => 'Cercä',
diff --git a/languages/messages/MessagesEl.php b/languages/messages/MessagesEl.php
index a5983829..ab4f228c 100644
--- a/languages/messages/MessagesEl.php
+++ b/languages/messages/MessagesEl.php
@@ -37,6 +37,7 @@
  * @author Reedy
  * @author Remember the dot
  * @author Sinopeus
+ * @author Tifa93
  * @author Urhixidur
  * @author Xaris333
  * @author ZaDiak
@@ -100,13 +101,16 @@ $specialPageAliases = array(
 	'Allmessages'               => array( 'ΌλαΤαΜηνύματα' ),
 	'Allpages'                  => array( 'ΌλεςΟιΣελίδες' ),
 	'Ancientpages'              => array( 'ΑρχαίεςΣελίδες' ),
+	'Badtitle'                  => array( 'ΚακόςΤίτλος' ),
 	'Blankpage'                 => array( 'ΚενήΣελίδα' ),
 	'Block'                     => array( 'Φραγή', 'ΦραγήIP', 'ΦραγήΧρήστη' ),
 	'Blockme'                   => array( 'ΦραγήΕμένα' ),
 	'Booksources'               => array( 'ΠηγέςΒιβλίων' ),
 	'BrokenRedirects'           => array( 'ΚατεστραμμένεςΑνακατευθύνσεις' ),
 	'Categories'                => array( 'Κατηγορίες' ),
+	'ChangeEmail'               => array( 'ΑλλαγήEmail' ),
 	'ChangePassword'            => array( 'ΑλλαγήΚωδικού', 'ΑρχικοποίησηΠάσου', 'ΑρχικοποίησηΚωδικού' ),
+	'ComparePages'              => array( 'ΣύγκρισηΣελίδων' ),
 	'Confirmemail'              => array( 'ΕπιβεβαίωσηEmail' ),
 	'Contributions'             => array( 'Συνεισφορές' ),
 	'CreateAccount'             => array( 'ΔημιουργίαΛογαριασμού' ),
@@ -145,6 +149,7 @@ $specialPageAliases = array(
 	'Mycontributions'           => array( 'ΟιΣυνεισφορέςΜου' ),
 	'Mypage'                    => array( 'ΗΣελίδαΜου' ),
 	'Mytalk'                    => array( 'ΗΣυζήτησήΜου' ),
+	'Myuploads'                 => array( 'ΟιΕπιφορτώσειςΜου' ),
 	'Newimages'                 => array( 'ΝέαΑρχεία', 'ΝέεςΕικόνες' ),
 	'Newpages'                  => array( 'ΝέεςΣελίδες' ),
 	'Popularpages'              => array( 'ΔημοφιλείςΣελίδες' ),
@@ -386,9 +391,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Εμφάνιση του αριθμού των συνδεδεμένων χρηστών',
 'tog-oldsig' => 'Υπάρχουσα υπογραφή:',
 'tog-fancysig' => 'Μεταχείριση υπογραφής ως κώδικα wiki (χωρίς αυτόματο σύνδεσμο)',
-'tog-externaleditor' => 'Χρήση εξωτερικού επεξεργαστή από προεπιλογή (για προχωρημένους μόνο, χρειάζεται ειδικές ρυθμίσεις του υπολογιστή σας. [//www.mediawiki.org/wiki/Manual:External_editors Περισσότερες πληροφορίες.])',
-'tog-externaldiff' => 'Χρήση εξωτερικού diff από προεπιλογή (για προχωρημένους μόνο, χρειάζεται ειδικές ρυθμίσεις του υπολογιστή σας. [//www.mediawiki.org/wiki/Manual:External_editors Περισσότερες πληροφορίες.])',
-'tog-showjumplinks' => 'Ενεργοποίηση των συνδέσμων προσβασιμότητας του τύπου «μετάβαση σε»',
 'tog-uselivepreview' => 'Χρήση ζωντανής προεπισκόπησης (απαιτεί JavaScript) (πειραματικό)',
 'tog-forceeditsummary' => 'Να ειδοποιούμαι κατά την εισαγωγή κενής σύνοψης επεξεργασίας',
 'tog-watchlisthideown' => 'Απόκρυψη των επεξεργασιών μου από τη λίστα παρακολούθησης',
@@ -402,6 +404,8 @@ $messages = array(
 'tog-showhiddencats' => 'Εμφάνιση κρυμμένων κατηγοριών',
 'tog-noconvertlink' => 'Απενεργοποίησε την μετατροπή τίτλου συνδέσμου',
 'tog-norollbackdiff' => 'Παράλειψη διαφοράς μετά την εκτέλεση επαναφοράς',
+'tog-useeditwarning' => 'Προειδοποίηση όταν εγκαταλείπω μία σελίδα επεξεργασίας χωρίς να έχω πρώτα αποθηκεύσει τις αλλαγές',
+'tog-prefershttps' => 'Να γίνεται πάντα χρήση ασφαλούς σύνδεσης όταν ο χρήστης είναι συνδεδεμένος',
 
 'underline-always' => 'Πάντα',
 'underline-never' => 'Ποτέ',
@@ -465,6 +469,18 @@ $messages = array(
 'oct' => 'Οκτ',
 'nov' => 'Νοε',
 'dec' => 'Δεκ',
+'january-date' => '$1 Ιανουαρίου',
+'february-date' => '$1 Φεβρουαρίου',
+'march-date' => '$1 Μαρτίου',
+'april-date' => '$1 Απριλίου',
+'may-date' => '$1 Μαΐου',
+'june-date' => '$1 Ιουνίου',
+'july-date' => '$1 Ιουλίου',
+'august-date' => '$1 Αυγούστου',
+'september-date' => '$1 Σεπτεμβρίου',
+'october-date' => '$1 Οκτωβρίου',
+'november-date' => '$1 Νοεμβρίου',
+'december-date' => '$1 Δεκεμβρίου',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Κατηγορία|Κατηγορίες}}',
@@ -546,6 +562,7 @@ $messages = array(
 'create-this-page' => 'Δημιουργία αυτής της σελίδας',
 'delete' => 'Διαγραφή',
 'deletethispage' => 'Διαγραφή αυτής της σελίδας',
+'undeletethispage' => 'Επαναφορά αυτής της διαγεγραμμένης σελίδας',
 'undelete_short' => 'Επαναφορά {{PLURAL:$1|μίας διαγεγραμμένης επεξεργασίας|$1 διαγεγραμμένων επεξεργασιών}}.',
 'viewdeleted_short' => 'Προβολή {{PLURAL:$1|μίας διαγεγραμμένης επεξεργασίας|$1 διαγεγραμμένων επεξεργασιών}}',
 'protect' => 'Προστασία',
@@ -589,7 +606,7 @@ $1',
 'pool-queuefull' => 'Η ουρά της δεξαμενής διεργασιών είναι πλήρης',
 'pool-errorunknown' => 'Άγνωστο σφάλμα',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Σχετικά με {{SITENAME}}',
 'aboutpage' => 'Project:Σχετικά',
 'copyright' => 'Το περιεχόμενο είναι διαθέσιμο σύμφωνα με την $1.',
@@ -599,7 +616,6 @@ $1',
 'disclaimers' => 'Αποποίηση ευθυνών',
 'disclaimerpage' => 'Project:Γενική αποποίηση',
 'edithelp' => 'Βοήθεια σχετικά με την επεξεργασία',
-'edithelppage' => 'Help:Επεξεργασία',
 'helppage' => 'Help:Περιεχόμενα',
 'mainpage' => 'Αρχική σελίδα',
 'mainpage-description' => 'Αρχική σελίδα',
@@ -676,17 +692,7 @@ $1',
 # General errors
 'error' => 'Σφάλμα',
 'databaseerror' => 'Σφάλμα στη βάση δεδομένων',
-'dberrortext' => 'Σημειώθηκε συντακτικό σφάλμα σε ερώτημα προς τη βάση δεδομένων.
-Πιθανόν να πρόκειται για ένδειξη σφάλματος στο λογισμικό.
-Το τελευταίο ερώτημα προς τη βάση δεδομένων που επιχειρήθηκε ήταν:
-<blockquote><code>$1</code></blockquote>
-μέσα από τη συνάρτηση «<code>$2</code>».
-Η βάση δεδομένων επέστρεψε σφάλμα «<samp>$3: $4</samp>».',
-'dberrortextcl' => 'Σημειώθηκε συντακτικό σφάλμα σε ερώτημα προς τη βάση δεδομένων.
-Το τελευταίο ερώτημα που επιχειρήθηκε ήταν:
-«$1»
-μέσα από τη συνάρτηση «$2».
-Η βάση δεδομένων επέστρεψε σφάλμα «$3: $4».',
+'databaseerror-error' => 'Σφάλμα: $1',
 'laggedslavemode' => "'''Προειδοποίηση:''' Η σελίδα μπορεί να μην περιέχει πρόσφατες ενημερώσεις.",
 'readonly' => 'Κλειδωμένη βάση δεδομένων',
 'enterlockreason' => 'Εισαγάγετε μια αιτία για το κλείδωμα και μια εκτίμησή για το πότε το κλείδωμα αυτό θα αρθεί',
@@ -740,12 +746,15 @@ $1',
 
 Για να προσθέσετε ή να αλλάξετε τις μεταφράσεις για όλα τα wikis, παρακαλούμε χρησιμοποιήστε  [//translatewiki.net/ translatewiki.net], το εγχείρημα τοπικοποίησης του  MediaWiki.',
 'editinginterface' => "'''Προσοχή:''' Επεξεργάζεστε μια σελίδα η οποία χρησιμοποιείται για να παρέχει κείμενο διεπαφής για το λογισμικό. Αλλαγές σε αυτή τη σελίδα θα επηρεάσουν την εμφάνιση της διεπαφής χρήστη για τους άλλους χρήστες. Εάν θέλετε να διορθώσετε τη μετάφραση, μπορείτε να χρησιμοποιήσετε το [//translatewiki.net/ translatewiki.net], το εγχείρημα για με τις μεταφράσεις των μηνυμάτων MediaWiki.",
-'sqlhidden' => '(το αίτημα SQL δεν εμφανίζεται)',
 'cascadeprotected' => 'Αυτή η σελίδα έχει προστατευθεί από επεξεργασία, επειδή περιλαμβάνεται {{PLURAL:$1|στην ακόλουθη σελίδα, που είναι προστατευμένη|στις ακόλουθες σελίδες, που είναι προστατευμένες}} με ενεργοποιημένη τη «διαδοχική» προστασία στο:
 $2',
 'namespaceprotected' => "Δεν έχετε άδεια να επεξεργάζεστε σελίδες στον τομέα '''$1'''.",
 'customcssprotected' => 'Δεν έχετε δικαιώματα για να επεξεργαστείτε αυτή τη σελίδα CSS, επειδή περιέχει προσωπικές ρυθμίσεις άλλου χρήστη.',
 'customjsprotected' => 'Δεν έχετε δικαιώματα για να επεξεργαστείτε αυτή τη σελίδα JavaScript, επειδή περιέχει προσωπικές ρυθμίσεις άλλου χρήστη.',
+'mycustomcssprotected' => 'Δεν έχετε άδεια για να επεξεργαστείτε αυτήν τη σελίδα CSS.',
+'mycustomjsprotected' => 'Δεν έχετε άδεια για να επεξεργαστείτε αυτήν τη σελίδα JavaScript.',
+'myprivateinfoprotected' => 'Δεν έχετε άδεια για να επεξεργαστείτε τα προσωπικά σας στοιχεία.',
+'mypreferencesprotected' => 'Δεν έχετε άδεια για να επεξεργαστείτε τις προτιμήσεις σας.',
 'ns-specialprotected' => 'Σελίδες στον τομέα {{ns:special}} δεν γίνεται να επεξεργαστούν.',
 'titleprotected' => "Αυτός ο τίτλος έχει προστατευθεί από την δημιουργία από τον [[User:$1|$1]].
 Ο λόγος που δίνεται είναι ''$2''.",
@@ -770,10 +779,19 @@ $2',
 'welcomecreation-msg' => 'Ο λογαριασμός σας έχει δημιουργηθεί.
 Μην ξεχάσετε να αλλάξετε τις [[Special:Preferences|{{SITENAME}} προτιμήσεις]] σας.',
 'yourname' => 'Όνομα χρήστη:',
+'userlogin-yourname' => 'Όνομα χρήστη',
+'userlogin-yourname-ph' => 'Εισάγετε το όνομα χρήστη σας',
+'createacct-another-username-ph' => 'Εισάγετε το όνομα χρήστη',
 'yourpassword' => 'Κωδικός:',
+'userlogin-yourpassword' => 'Κωδικός',
+'userlogin-yourpassword-ph' => 'Εισάγετε τον κωδικό σας',
+'createacct-yourpassword-ph' => 'Εισαγωγή κωδικού',
 'yourpasswordagain' => 'Επαναπληκτρολόγηση κωδικού:',
+'createacct-yourpasswordagain' => 'Επιβεβαίωση κωδικού',
+'createacct-yourpasswordagain-ph' => 'Εισαγωγή κωδικού ξανά',
 'remembermypassword' => 'Απομνημόνευση της σύνδεσής μου σε αυτόν τον περιηγητή (για μέγιστο $1 {{PLURAL:$1|ημέρα|ημέρες}})',
-'securelogin-stick-https' => 'Μείνετε συνδεδεμένοι με HTTPS μετά την είσοδο',
+'userlogin-remembermypassword' => 'Διατηρήστε με σε σύνδεση',
+'userlogin-signwithsecure' => 'Χρησιμοποιείστε ασφαλή σύνδεση',
 'yourdomainname' => 'Το domain σας:',
 'password-change-forbidden' => 'Δεν μπορείτε να αλλάξετε τους κωδικούς πρόσβασης σε αυτό το βίκι.',
 'externaldberror' => 'Είτε συνέβη κάποιο σφάλμα εξωτερικής πιστοποίησης της βάσης δεδομένων είτε δεν σας έχει επιτραπεί να ενημερώσετε τον εξωτερικό σας λογαριασμό.',
@@ -785,18 +803,41 @@ $2',
 'logout' => 'Έξοδος',
 'userlogout' => 'Έξοδος',
 'notloggedin' => 'Δεν έχετε συνδεθεί.',
+'userlogin-noaccount' => 'Δεν έχετε λογαριασμό;',
+'userlogin-joinproject' => 'Συνδεθείτε σε {{SITENAME}}',
 'nologin' => 'Δεν έχετε λογαριασμό; $1.',
 'nologinlink' => 'Δημιουργήστε έναν λογαριασμό',
 'createaccount' => 'Δημιουργία λογαριασμού',
 'gotaccount' => 'Έχετε ήδη λογαριασμό; $1.',
 'gotaccountlink' => 'Είσοδος',
 'userlogin-resetlink' => 'Ξεχάσατε τα στοιχεία εισόδου σας;',
+'userlogin-resetpassword-link' => 'Έκδοση νέου κωδικού πρόσβασης',
+'helplogin-url' => 'Help:Σύνδεση',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Βοήθεια για τη σύνδεσή σας]]',
+'createacct-join' => 'Εισάγετε τα στοιχεία σας παρακάτω.',
+'createacct-another-join' => 'Εισάγετε τα στοιχεία του νέου λογαριασμού παρακάτω.',
+'createacct-emailrequired' => 'Διεύθυνση ηλεκτρονικού ταχυδρομείου',
+'createacct-emailoptional' => 'Διεύθυνση ηλεκτρονικού ταχυδρομείου (προαιρετικό)',
+'createacct-email-ph' => 'Εισάγετε το email σας',
+'createacct-another-email-ph' => 'Εισάγετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου',
 'createaccountmail' => 'Χρήση τυχαίου προσωρινού κωδικού πρόσβασης και αποστολή του στην παρεχώμενη διεύθυνση ηλεκτρονικού ταχυδρομείου',
+'createacct-realname' => 'Πραγματικό όνομα (προαιρετικό)',
 'createaccountreason' => 'Αιτία:',
+'createacct-reason' => 'Λόγος',
+'createacct-reason-ph' => 'Γιατί δημιουργείτε έναν άλλο λογαριασμό',
+'createacct-captcha' => 'Έλεγχος ασφαλείας',
+'createacct-imgcaptcha-ph' => 'Εισαγωγή του κειμένου που βλέπετε παραπάνω',
+'createacct-submit' => 'Δημιουργία λογαριασμού χρήστη',
+'createacct-another-submit' => 'Δημιουργήσετε έναν άλλο λογαριασμό',
+'createacct-benefit-heading' => '{{SITENAME}} έχει γίνει από ανθρώπους όπως εσύ.',
+'createacct-benefit-body1' => '{{PLURAL:$1|επεξεργασία|επεξεργασίες}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|σελίδα|σελίδες}}',
+'createacct-benefit-body3' => 'πρόσφατοι {{PLURAL:$1|συνεισφέρων|συνεισφέροντες}}',
 'badretype' => 'Οι κωδικοί που έχετε δηλώσει δεν συμφωνούν μεταξύ τους.',
 'userexists' => 'Το όνομα χρήστη που εισαγάγατε βρίσκεται ήδη σε χρήση.
 Παρακαλούμε, διαλέξτε ένα διαφορετικό.',
 'loginerror' => 'Σφάλμα σύνδεσης',
+'createacct-error' => 'Σφάλμα δημιουργίας λογαριασμού',
 'createaccounterror' => 'Δεν ήταν δυνατή η δημιουργία λογαριασμού: $1',
 'nocookiesnew' => 'Ο λογαριασμός χρήστη έχει δημιουργηθεί, αλλά δεν έχετε ακόμα συνδεθεί. Το {{SITENAME}} χρησιμοποιεί cookies κατά τη σύνδεση των χρηστών. Τα cookies είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και στη συνέχεια συνδεθείτε χρησιμοποιώντας το νέο όνομα χρήστη σας και τον κωδικό σας.',
 'nocookieslogin' => 'Το {{SITENAME}} χρησιμοποιεί cookies κατά τη σύνδεση των χρηστών. Τα cookies είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και ξαναδοκιμάστε!',
@@ -848,11 +889,13 @@ $2',
 
 Μπορείτε να αγνοήσετε αυτό το μήνυμα, αν αυτός ο λογαριασμός δημιουργήθηκε εσφαλμένα.',
 'usernamehasherror' => 'Το όνομα χρήστη δεν μπορεί να περιέχει ειδικούς χαρακτήρες',
-'login-throttled' => 'Τελευταία κάνατε πάρα πολλές απόπειρες σύνδεσης.
-Παρακαλούμε περιμένετε προτού ξαναδοκιμάσετε.',
+'login-throttled' => 'Κάνατε πάρα πολλές πρόσφατες απόπειρες σύνδεσης.
+Παρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.',
 'login-abort-generic' => 'Η είσοδος δεν πέτυχε - Ματαιώθηκε',
 'loginlanguagelabel' => 'Γλώσσα: $1',
 'suspicious-userlogout' => 'Το αίτημα αποσύνδεσής σας απερρίφθη επειδή φαίνεται ότι στάλθηκε από ένα λανθασμένο φυλλομετρητή (browser) ή διακομιστή προσωρινής αποθήκευσης.',
+'createacct-another-realname-tip' => 'Το πραγματικό όνομα είναι προαιρετικό
+Αν επιλέξετε να το δώσετε, αυτό θα μπορεί να χρησιμοποιηθεί για να αναγνωριστεί η δουλειά σας.',
 
 # Email sending
 'php-mail-error-unknown' => 'Άγνωστο σφάλμα στη συνάρτηση mail() της PHP.',
@@ -868,7 +911,7 @@ $2',
 'newpassword' => 'Νέος κωδικός πρόσβασης',
 'retypenew' => 'Πληκτρολογήστε ξανά το νέο κωδικό.',
 'resetpass_submit' => 'Δώστε κωδικό πρόσβασης και συνδεθείτε',
-'resetpass_success' => 'Ο κωδικός πρόσβασής σας άλλαξε επιτυχώς! Τώρα σας συνδέουμε...',
+'changepassword-success' => 'Ο κωδικός πρόσβασής σας άλλαξε επιτυχώς!',
 'resetpass_forbidden' => 'Οι κωδικοί πρόσβασης δεν μπορούν να αλλαχθούν',
 'resetpass-no-info' => 'Πρέπει να είστε συνδεδεμένος για να δείτε αυτήν την σελίδα απευθείας',
 'resetpass-submit-loggedin' => 'Αλλαγή κωδικού',
@@ -880,10 +923,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Κωδικός επαναφοράς',
-'passwordreset-text' => 'Συμπληρώστε αυτή τη φόρμα για να επαναφέρετε τον κωδικό σας.',
+'passwordreset-text-one' => 'Συμπληρώστε την παρακάτω φόρμα για να επαναφέρετε τον κωδικό πρόσβασής σας.',
+'passwordreset-text-many' => '{{PLURAL:$1|Συμπληρώστε ένα από τα πεδία για να επαναφέρετε τον κωδικό πρόσβασής σας.}}',
 'passwordreset-legend' => 'Επαναφορά κωδικού πρόσβασης',
 'passwordreset-disabled' => 'Η επαναφορά κωδικού πρόσβασης έχει απενεργοποιηθεί σε αυτό το wiki',
-'passwordreset-pretext' => '{{PLURAL:$1||Εισάγεται ένα από τα στοιχεία δεδομένων που βλέπετε παρακάτω}}',
+'passwordreset-emaildisabled' => "Τα χαρακτηριστικά ηλεκτρονικού ταχυδρομείου έχουν απενεργοποιηθεί σ' αυτό το wiki.",
 'passwordreset-username' => 'Όνομα χρήστη:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Προβολή του μηνύματος ηλεκτρονικού ταχυδρομείου που δημιουργήθηκε;',
@@ -906,7 +950,7 @@ $2
 Προσωρινός κωδικός πρόσβασης:$2',
 'passwordreset-emailsent' => 'Έχει αποσταλεί email επαναφοράς κωδικού.',
 'passwordreset-emailsent-capture' => 'Έχει αποσταλεί email επαναφοράς κωδικού, το οποίο φαίνεται πιο κάτω.',
-'passwordreset-emailerror-capture' => 'Ένα email επαναφοράς κωδικού έχει δημιουργηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο χρήστη: $1',
+'passwordreset-emailerror-capture' => 'Ένα email επαναφοράς κωδικού έχει δημιουργηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο  {{GENDER:$2|χρήστη}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Αλλαγή της διεύθυνσης ηλεκτρονικού ταχυδρομείου',
@@ -920,6 +964,19 @@ $2
 'changeemail-submit' => 'Αλλαγή διεύθυνσης ηλεκτρονικού ταχυδρομείου',
 'changeemail-cancel' => 'Ακύρωση',
 
+# Special:ResetTokens
+'resettokens' => 'Επαναφορά των κλειδιών',
+'resettokens-text' => 'Μπορείτε να επαναφέρετε τα κλειδιά, τα οποία επιτρέπουν την πρόσβαση σε ορισμένα ιδιωτικά δεδομένα που συνδέονται με τον λογαριασμό σας εδώ.
+
+Πρέπει να το κάνετε εάν κατά λάθος τα μοιραστήκατε με κάποιον ή αν ο λογαριασμός σας έχει παραβιαστεί.',
+'resettokens-no-tokens' => 'Δεν υπάρχουν κλειδιά για επαναφορά.',
+'resettokens-legend' => 'Επαναφορά των κλειδιών',
+'resettokens-tokens' => 'Κλειδιά:',
+'resettokens-token-label' => '$1 (τρέχουσα τιμή: $2)',
+'resettokens-watchlist-token' => 'Κλειδί ροής της λίστα παρακολούθησης',
+'resettokens-done' => 'Επαναφορά κλειδιών.',
+'resettokens-resetbutton' => 'Επαναφορά επιλεγμένων κλειδιών',
+
 # Edit page toolbar
 'bold_sample' => 'Έντονο κείμενο',
 'bold_tip' => 'Έντονο κείμενο',
@@ -1110,12 +1167,15 @@ $2
 Φαίνεται πως έχει διαγραφεί.',
 'edit-conflict' => 'Σύγκρουση επεξεργασιών.',
 'edit-no-change' => 'Η επεξεργασία σας αγνοήθηκε, επειδή δεν έγινε καμία αλλαγή στο κείμενο.',
+'postedit-confirmation' => 'H επεξεργασία σας αποθηκεύτηκε.',
 'edit-already-exists' => 'Δεν ήταν εφικτό να δημιουργηθεί η νέα σελίδα.
 Υπάρχει ήδη.',
 'defaultmessagetext' => 'Προεπιλεγμένο κείμενο μηνύματος',
 'content-failed-to-parse' => 'Απέτυχε η ανάλυση  περιεχομένου του $2 για το μοντέλο $1:$3',
 'invalid-content-data' => 'Μη έγκυρα δεδομένα περιεχομένου',
 'content-not-allowed-here' => 'Το περιεχόμενο «$1» δεν επιτρέπεται στη σελίδα [[$2]]',
+'editwarning-warning' => 'Αφήνοντας αυτή τη σελίδα μπορεί να σας κάνει να χάσετε κάποιες αλλαγές που έχετε κάνει.
+Αν έχετε συνδεθεί, μπορείτε να απενεργοποιήσετε αυτή την προειδοποίηση στην  ενότητα "Επεξεργασία" των προτιμήσεών σας.',
 
 # Content models
 'content-model-wikitext' => 'βικικείμενο',
@@ -1150,6 +1210,7 @@ $2
 'undo-failure' => 'Η επεξεργασία δεν μπορούσε να αναστραφεί λόγω αντικρουόμενων ενδιάμεσων επεξεργασιών.',
 'undo-norev' => 'Η ανάκληση αυτής της επεξεργασίας δεν ηταν δυνατό να πραγματοποιηθεί επειδή δεν υπάρχει ή επειδή έχει διαγραφεί.',
 'undo-summary' => 'Αναίρεση αναθεώρησης $1 υπό τον/την [[Special:Contributions/$2|$2]] ([[User talk:$2|Συζήτηση]])',
+'undo-summary-username-hidden' => 'Αναίρεση αναθεώρησης $1 από ένα κρυμμένο χρήστη',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Ο λογαριασμός δεν μπορεί να δημιουργηθεί',
@@ -1327,6 +1388,7 @@ $1",
 'compareselectedversions' => 'Σύγκριση των επιλεγμένων εκδόσεων',
 'showhideselectedversions' => 'Εμφάνιση/απόκρυψη των επιλεγμένων εκδοχών',
 'editundo' => 'αναίρεση',
+'diff-empty' => '(Καμία διαφορά)',
 'diff-multi' => '({{PLURAL:$1|Μία ενδιάμεση αναθεώρηση|$1 ενδιάμεσες αναθεωρήσεις}} από {{PLURAL:$2|ένα χρήστη|$2 χρήστες}} δεν {{PLURAL:$1|εμφανίζεται|εμφανίζονται}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Μία ενδιάμεση αναθεώρηση|$1 ενδιάμεσες αναθεωρήσεις}} από περισσότερο από $2 {{PLURAL:$2|χρήστη|χρήστες}} δεν εμφανίζ{{PLURAL:$1|εται|ονται}})',
 'difference-missing-revision' => '{{PLURAL:$2|Μία αναθεώρηση|$2 αναθεωρήσεις}} αυτής της διαφοράς ($1) δεν {{PLURAL:$2|μπόρεσε να βρεθεί|μπόρεσαν να βρεθούν}}.
@@ -1354,7 +1416,6 @@ $1",
 'searchmenu-legend' => 'Επιλογές αναζήτησης',
 'searchmenu-exists' => "'''Υπάρχει μια σελίδα που ονομάζεται «[[:$1]]» σε αυτό το wiki.'''",
 'searchmenu-new' => "'''Δημιουργήστε τη σελίδα «[[:$1]]» σε αυτό το wiki!'''",
-'searchhelp-url' => 'Help:Περιεχόμενα',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Πλοηγηθείτε σε σελίδες με αυτό το πρόθεμα]]',
 'searchprofile-articles' => 'Σελίδες περιεχομένου',
 'searchprofile-project' => 'Σελίδες Βοήθειας και Εγχειρήματος',
@@ -1395,15 +1456,7 @@ $1",
 'powersearch-togglenone' => 'Καμία',
 'search-external' => 'Εξωτερική αναζήτηση',
 'searchdisabled' => 'Η αναζήτηση για τον ιστότοπο "{{SITENAME}}" είναι απενεργοποιημένη. Μπορείτε να αναζητήσετε μέσω του Google εν τω μεταξύ. Σημειώστε ότι οι κατάλογοί τους για το περιεχόμενο του ιστοτόπου "{{SITENAME}}" μπορεί να είναι απαρχαιωμένοι.',
-
-# Quickbar
-'qbsettings' => 'Γρήγορη πρόσβαση',
-'qbsettings-none' => 'Καμία',
-'qbsettings-fixedleft' => 'Σταθερά αριστερά',
-'qbsettings-fixedright' => 'Σταθερά δεξιά',
-'qbsettings-floatingleft' => 'Πλανώμενα αριστερά',
-'qbsettings-floatingright' => 'Πλανώμενα δεξιά',
-'qbsettings-directionality' => 'Διορθώθηκε, ανάλογα με τις κατευθύνσεις του σεναρίου εντολών της γλώσσας σας',
+'search-error' => 'Παρουσιάστηκε σφάλμα κατά την αναζήτηση:$1',
 
 # Preferences page
 'preferences' => 'Προτιμήσεις',
@@ -1437,7 +1490,6 @@ $1",
 'resetprefs' => 'Επαναφορά προτιμήσεων',
 'restoreprefs' => 'Επαναφορά όλων των προεπιλεγμένων ρυθμίσεων',
 'prefs-editing' => 'Επεξεργασία',
-'prefs-edit-boxsize' => 'Μέγεθος του παραθύρου επεξεργασίας.',
 'rows' => 'Σειρές',
 'columns' => 'Στήλες',
 'searchresultshead' => 'Αποτελέσματα αναζήτησης/Ρυθμίσεις',
@@ -1448,9 +1500,9 @@ $1",
 'recentchangesdays-max' => '($1 {{PLURAL:$1|ημέρα|ημέρες}} το μέγιστο)',
 'recentchangescount' => 'Αριθμός επεξεργασιών που να εμφανίζονται για προεπιλογή.',
 'prefs-help-recentchangescount' => 'Αυτό περιλαμβάνει τις πρόσφατες αλλαγές, τα ιστορικά των σελίδων, και τα αρχεία διαγραφών.',
-'prefs-help-watchlist-token' => 'Η συμπλήρωση αυτού του πεδίου με ένα κρυφό κλειδί θα δημιουργήσει μια δράση RSS για τη λίστα παρακολούθησής σας.
-Οποιοσδήποτε ξέρει το κλειδί σε αυτό το πεδίο θα μπορεί να διαβάσει τη λίστα παρακολούθησής σας, για αυτό διαλέξτε κάτι ασφαλές.
-Εδώ είναι ένα τυχαίως δημιουργημένο προϊόν που μπορείτε να χρησιμοποιήσετε: $1',
+'prefs-help-watchlist-token2' => 'Αυτό είναι το μυστικό κλειδί για την web τροφοδοσία  της λίστας παρακολούθησής σας.
+Όποιος το γνωρίζει θα είναι σε θέση να διαβάσει την λίστα παρακολούθησης σας, οπότε μην τον μοιράζεστε.
+[[Special: ResetTokens|Κάνε κλικ εδώ εάν θέλετε να τον επαναφέρετε]].',
 'savedprefs' => 'Οι προτιμήσεις σας έχουν αποθηκευτεί.',
 'timezonelegend' => 'Ζώνη ώρας:',
 'localtime' => 'Εμφάνιση τοπικής ώρας:',
@@ -1480,7 +1532,6 @@ $1",
 'prefs-common-css-js' => 'Κοινά CSS/JS για όλα τα skins:',
 'prefs-reset-intro' => 'Μπορείτε να χρησιμοποιήσετε αυτήν την σελίδα για να επαναρρυθμίσετε τις προτιμήσεις σας στις προεπιλογές του ιστότοπου. Αυτό δεν μπορεί να αναστρεφθεί.',
 'prefs-emailconfirm-label' => 'Επιβεβαίωση e-mail:',
-'prefs-textboxsize' => 'Μέγεθος πλαίσιου επεξεργασίας',
 'youremail' => 'Διεύθυνση ηλεκτρονικού ταχυδρομείου:',
 'username' => '{{GENDER:$1|Όνομα χρήστη}}:',
 'uid' => '{{GENDER:$1|Αναγνωριστικό χρήστη}}:',
@@ -1513,6 +1564,8 @@ $1",
 'prefs-dateformat' => 'Μορφή ημερομηνίας',
 'prefs-timeoffset' => 'Διαφορά χρόνου',
 'prefs-advancedediting' => 'Προηγμένες επιλογές',
+'prefs-editor' => 'Συντάκτης',
+'prefs-preview' => 'Προεπισκόπηση',
 'prefs-advancedrc' => 'Προηγμένες επιλογές',
 'prefs-advancedrendering' => 'Προηγμένες επιλογές',
 'prefs-advancedsearchoptions' => 'Προηγμένες επιλογές',
@@ -1520,7 +1573,9 @@ $1",
 'prefs-displayrc' => 'Εμφάνιση επιλογών',
 'prefs-displaysearchoptions' => 'Επιλογές εμφάνισης',
 'prefs-displaywatchlist' => 'Επιλογές εμφάνισης',
+'prefs-tokenwatchlist' => 'Κλειδί',
 'prefs-diffs' => 'Διαφορές',
+'prefs-help-prefershttps' => 'Αυτή η προτίμηση θα τεθεί σε ισχύ στην επόμενή σας σύνδεση.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Η διεύθυνση ηλεκτρονικού ταχυδρομείου φαίνεται έγκυρη',
@@ -1547,6 +1602,8 @@ $1",
 'userrights-notallowed' => 'Δεν έχετε άδεια για να προσθέσετε ή να καταργήσετε δικαιώματα χρήστη.',
 'userrights-changeable-col' => 'Ομάδες που μπορείτε να αλλάξετε',
 'userrights-unchangeable-col' => 'Ομάδες που δεν μπορείτε να αλλάξετε',
+'userrights-conflict' => 'Σύγκρουση αλλαγών στα δικαιώματα χρήστη! Παρακαλώ επανεξετάστε και επικυρώστε τις αλλαγές σας.',
+'userrights-removed-self' => 'Έχετε καταργήσει επιτυχώς τα δικά σας δικαιώματα. Ως εκ τούτου, δεν είστε πλέον σε θέση να έχετε πρόσβαση σε αυτή τη σελίδα.',
 
 # Groups
 'group' => 'Ομάδα:',
@@ -1613,10 +1670,15 @@ $1",
 'right-unblockself' => 'Αναίρεση φραγής του εαυτού',
 'right-protect' => 'Αλλαγή των επιπέδων προστασίας και επεξεργασία προστατευμένων σελίδων',
 'right-editprotected' => 'Επεξεργασία προστατευμένων σελίδων (χωρίς διαδοχική προστασία)',
+'right-editsemiprotected' => 'Επεξεργασία προστατευμένων σελίδων ως "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Επεξεργασία της διασύνδεσης χρήστη',
 'right-editusercssjs' => 'Μεταγραφή των αρχείων CSS και JS άλλων χρηστών',
 'right-editusercss' => 'Μεταγραφή των αρχείων CSS άλλων χρηστών',
 'right-edituserjs' => 'Μεταγραφή των αρχείων JS άλλων χρηστών',
+'right-editmyusercss' => 'Επεξεργασία των ιδιωτικών αρχείων CSS χρήστη',
+'right-editmyuserjs' => 'Επεξεργασία των ιδιωτικών αρχείων JavaScript χρήστη',
+'right-viewmywatchlist' => 'Προβολή της δικής σας λίστα παρακολούθησης',
+'right-editmyoptions' => 'Επεξεργασία των προτιμήσεών σας',
 'right-rollback' => 'Γρήγορη αναστροφή των επεξεργασιών του τελευταίου χρήστη που επεξεργάστηκε μια σελίδα',
 'right-markbotedits' => 'Σήμανση επαναφερόμενων επεξεργασιών ως επεξεργασιών μποτ',
 'right-noratelimit' => 'Να μην επηρεάζεται από τα όρια ρυθμού',
@@ -1678,9 +1740,15 @@ $1",
 'action-userrights-interwiki' => 'επεξεργαστείτε τα δικαιώματα χρηστών σε άλλα wiki',
 'action-siteadmin' => 'να κλειδώσετε ή ξεκλειδώσετε τη βάση δεδομένων',
 'action-sendemail' => 'αποστείλετε μηνύματα ηλεκτρονικού ταχυδρομείου',
+'action-editmywatchlist' => 'επεξεργαστείτε τη λίστα παρακολούθησής σας',
+'action-viewmywatchlist' => 'προβάλετε τη λίστα παρακολούθησής σας',
+'action-viewmyprivateinfo' => 'προβάλετε τις προσωπικές σας πληροφορίες',
+'action-editmyprivateinfo' => 'επεξεργαστείτε τις προσωπικές σας πληροφορίες',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|αλλαγή|αλλαγές}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|από την τελευταία επίσκεψη}}',
+'enhancedrc-history' => 'ιστορικό',
 'recentchanges' => 'Πρόσφατες αλλαγές',
 'recentchanges-legend' => 'Επιλογές πρόσφατων αλλαγών',
 'recentchanges-summary' => 'Παρακολουθήστε σε αυτή τη σελίδα τις πιο πρόσφατες αλλαγές στο Wiki.',
@@ -1720,7 +1788,6 @@ $1",
 'recentchangeslinked-feed' => 'Σχετικές αλλαγές',
 'recentchangeslinked-toolbox' => 'Σχετικές αλλαγές',
 'recentchangeslinked-title' => 'Αλλαγές σχετικές με το «$1»',
-'recentchangeslinked-noresult' => 'Δεν υπάρχουν αλλαγές στις συνδεδεμένες σελίδες κατά τη διάρκεια της δοσμένης περιόδου.',
 'recentchangeslinked-summary' => "Αυτός είναι ένα κατάλογος αλλαγών που έγιναν πρόσφατα σε σελίδες που συνδέονται από μια καθορισμένη σελίδα (ή σε μέλη μιας καθορισμένης κατηγορίας).
 Σελίδες στην [[Special:Watchlist|λίστα παρακολούθησής]] σας είναι '''έντονες'''.",
 'recentchangeslinked-page' => 'Όνομα σελίδας:',
@@ -1949,7 +2016,6 @@ $1',
 'http-read-error' => 'Σφάλμα ανάγνωσης HTTP.',
 'http-timed-out' => 'Ο χρόνος του αιτήματος HTTP έληξε.',
 'http-curl-error' => 'Σφάλμα κατά τη λήψη του URL: $1',
-'http-host-unreachable' => 'Το URL δεν ήταν προσβάσιμο.',
 'http-bad-status' => 'Υπήρξε πρόβλημα κατά τη διάρκεια του αιτήματος HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1978,6 +2044,9 @@ $1',
 'listfiles_size' => 'Μέγεθος',
 'listfiles_description' => 'Περιγραφή',
 'listfiles_count' => 'Εκδόσεις',
+'listfiles-latestversion' => 'Τρέχουσα έκδοση',
+'listfiles-latestversion-yes' => 'Ναι',
+'listfiles-latestversion-no' => 'Όχι',
 
 # File description page
 'file-anchor-link' => 'Αρχείο',
@@ -2073,6 +2142,12 @@ $1',
 'randompage' => 'Τυχαίο λήμμα',
 'randompage-nopages' => 'Δεν υπάρχουν σελίδες {{PLURAL:$2|στον ακόλουθο ονοματοχώρο|στους ακόλουθους ονοματοχώρους}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Τυχαία σελίδα στην κατηγορία',
+'randomincategory-invalidcategory' => 'Το «$1» δεν είναι έγκυρο όνομα κατηγορίας.',
+'randomincategory-nopages' => 'Δεν υπάρχουν σελίδες στην κατηγορία [[:Category:$1|$1]].',
+'randomincategory-selectcategory-submit' => 'Μετάβαση',
+
 # Random redirect
 'randomredirect' => 'Τυχαία ανακατεύθυνση',
 'randomredirect-nopages' => 'Δεν υπάρχουν ανακατευθύνσεις στον ονοματοχώρο "$1".',
@@ -2098,12 +2173,6 @@ $1',
 'statistics-users-active-desc' => 'Χρήστες που έχουν κάνει κάποια επεξεργασία μέσα σε {{PLURAL:$1|μέρα|$1 μέρες}}',
 'statistics-mostpopular' => 'Οι πιο δημοφιλείς σελίδες',
 
-'disambiguations' => 'Σελίδες με συνδέσμους σε σελίδες αποσαφήνισης',
-'disambiguationspage' => 'Project:Σύνδεσμοι_προς_τις_σελίδες_αποσαφήνισης',
-'disambiguations-text' => "Οι ακόλουθες σελίδες οδηγούν σε μια '''σελίδα αποσαφήνισης'''.
-Αντιθέτως θα έπρεπε να κατευθύνουν στο κατάλληλο θέμα.<br />
-Μια σελίδα αντιμετωπίζεται ως σελίδα αποσαφήνισης αν χρησιμοποιεί ένα πρότυπο το οποίο συνδέεται από το [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop' => 'Σελίδες με ιδιότητα σελίδας',
 'pageswithprop-legend' => 'Σελίδες με ιδιότητα σελίδας',
 'pageswithprop-text' => 'Αυτή η σελίδα ταξινομεί σελίδες που χρησιμοποιούν μια συγκεκριμένη ιδιότητα σελίδας.',
@@ -2357,10 +2426,9 @@ $1',
 'unwatchthispage' => 'Παύση παρακολούθησης αυτής της σελίδας',
 'notanarticle' => 'Η σελίδα αυτή δεν είναι σελίδα περιεχομένου.',
 'notvisiblerev' => 'Η έκδοση έχει διαγραφεί',
-'watchnochange' => 'Δεν υπήρξε δραστηριότητα επεξεργασίας στις σελίδες που παρακολουθείτε κατά την εμφανιζόμενη χρονική περίοδο.',
 'watchlist-details' => '{{PLURAL:$1|$1 σελίδα|$1 σελίδες}} στη λίστα παρακολούθησης σας, χωρίς να προσμετρούνται οι σελίδες συζήτησης.',
-'wlheader-enotif' => '* Η ειδοποίηση με ηλεκτρονικό ταχυδρομείο έχει ενεργοποιηθεί.',
-'wlheader-showupdated' => "* Σελίδες που έχουν υποστεί αλλαγές από την τελευταία φορά που τις επισκεφθήκατε εμφανίζονται με '''έντονους χαρακτήρες'''.",
+'wlheader-enotif' => 'Η ειδοποίηση ηλεκτρονικού ταχυδρομείου ενεργοποιήθηκε.',
+'wlheader-showupdated' => "Σελίδες που έχουν υποστεί αλλαγές από την τελευταία φορά που τις επισκεφθήκατε εμφανίζονται με '''έντονους χαρακτήρες'''.",
 'watchmethod-recent' => 'Έλεγχος πρόσφατων αλλαγών σε σελίδες υπό παρακολούθηση',
 'watchmethod-list' => 'Έλεγχος σελίδων υπό παρακολούθηση για πρόσφατες αλλαγές',
 'watchlistcontains' => 'Η λίστα παρακολούθησής σας περιέχει $1 {{PLURAL:$1|σελίδα|σελίδες}}.',
@@ -2604,7 +2672,7 @@ $1',
 'contributions' => 'Συνεισφορές {{GENDER:$1|χρήστη|χρήστριας}}',
 'contributions-title' => 'Συνεισφορές χρήστη για {{GENDER:$1|τον|την}} $1',
 'mycontris' => 'Συνεισφορές',
-'contribsub2' => 'Για τον/την $1 ($2)',
+'contribsub2' => 'Για {{GENDER:$1|τον|την}} $1 ($2)',
 'nocontribs' => 'Δεν βρέθηκαν αλλαγές με αυτά τα κριτήρια.',
 'uctop' => '(τρέχουσα)',
 'month' => 'Από το μήνα (και νωρίτερα):',
@@ -2760,11 +2828,8 @@ $1',
 'ipb_blocked_as_range' => 'Σφάλμα! Η φραγή της διεύθυνσης IP $1 δεν είναι άμεση και δεν μπορεί να αρθεί. Όμως αποτελεί μέρος της περιοχής $2, της οποίας η φραγή μπορεί να αρθεί.',
 'ip_range_invalid' => 'Το εύρος των διευθύνσεων IP δεν είναι έγκυρο.',
 'ip_range_toolarge' => 'Φραγές range μεγαλύτερων από /$1 δεν επιτρέπονται.',
-'blockme' => 'Φραγή σε μένα',
 'proxyblocker' => 'Εργαλείο φραγής διακομιστών (proxy blocker)',
-'proxyblocker-disabled' => 'Η λειτουργία αυτή έχει απενεργοποιηθεί.',
 'proxyblockreason' => 'Η διεύθυνση IP σας έχει υποστεί φραγή γιατί είναι open proxy. Παρακαλούμε επικοινωνείστε με τον παροχέα υπηρεσιών Διαδικτύου που χρησιμοποιείτε ή με την τεχνική υποστήριξη, για να θέσετε υπ΄ όψη τους αυτό το σοβαρό θέμα ασφάλειας.',
-'proxyblocksuccess' => 'Ολοκληρώθηκε!',
 'sorbsreason' => 'Η διεύθυνση IP σας έχει χαρακτηρισθεί ως open proxy στο DNSBL.',
 'sorbs_create_account_reason' => 'Η διεύθυνση IP σας έχει χαρακτηρισθεί open proxy στο DNSBL. Δεν μπορείτε να δημιουργήσετε λογαριασμό χρήστη.',
 'cant-block-while-blocked' => 'Δεν μπορείτε να φράξετε άλλους χρήστες ενώ είστε φραγμένος/η.',
@@ -2929,6 +2994,8 @@ $1',
 'thumbnail-more' => 'Μεγέθυνση',
 'filemissing' => 'Αγνοούμενο αρχείο',
 'thumbnail_error' => 'Σφάλμα στη δημιουργία μικρογραφίας: $1',
+'thumbnail_error_remote' => 'Μήνυμα σφάλματος από  $1:
+$2',
 'djvu_page_error' => 'Σελίδα DjVu εκτός ορίων',
 'djvu_no_xml' => 'Αδυναμία προσκόμισης XML για το αρχείο DjVu',
 'thumbnail-temp-create' => 'Αδύνατη η δημιουργία προσωρινού αρχείου μικρογραφίας',
@@ -3077,27 +3144,16 @@ $1',
 
 # Stylesheets
 'common.css' => '/* Το τοποθετημένο εδώ CSS θα εφαρμοστεί σε όλα τα skins */',
-'standard.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Standard skin */',
-'nostalgia.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Nostalgia skin */',
 'cologneblue.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Cologne Blue skin */',
 'monobook.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Monobook skin */',
-'myskin.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του MySkin skin */',
-'chick.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Chick skin */',
-'simple.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Simple skin */',
 'modern.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Modern skin */',
 'vector.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Vector skin */',
 'print.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει το αποτέλεσμα της εκτύπωσης */',
-'handheld.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει συσκευές χειρός βάση του skin ρυθμισμένου στο $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για όλους τους χρήστες σε κάθε φόρτωση σελίδας. */',
-'standard.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Standard skin */',
-'nostalgia.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Nostalgia skin */',
 'cologneblue.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Cologne Blue skin */',
 'monobook.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το MonoBook skin */',
-'myskin.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το MySkin skin */',
-'chick.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Chick skin */',
-'simple.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Simple skin */',
 'modern.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Modern skin */',
 'vector.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Vector skin */',
 
@@ -3173,10 +3229,6 @@ $1',
 'pageinfo-category-files' => 'Αριθμός αρχείων',
 
 # Skin names
-'skinname-standard' => 'Κλασσικό',
-'skinname-nostalgia' => 'Νοσταλγία',
-'skinname-myskin' => 'ΤοSkinΜου',
-'skinname-simple' => 'Απλό',
 'skinname-modern' => 'Μοντέρνο',
 
 # Patrolling
@@ -3254,11 +3306,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 λεπτό|$1 λεπτά}}',
 'hours' => '{{PLURAL:$1|$1 ώρα|$1 ώρες}}',
 'days' => '{{PLURAL:$1|$1 μέρα|$1 μέρες}}',
+'weeks' => '{{PLURAL:$1|$1 εβδομάδα|$1 εβδομάδες}}',
 'months' => '{{PLURAL:$1|$1 μήνας|$1 μήνες}}',
 'years' => '{{PLURAL:$1|$1 έτος|$1 έτη}}',
 'ago' => '$1 πριν',
 'just-now' => 'μόλις τώρα',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ώρα|ώρες}} πριν',
+'minutes-ago' => '$1 {{PLURAL:$1|λεπτό|λεπτά}} πριν',
+'seconds-ago' => '$1 {{PLURAL:$1|δευτερόλεπτο|δευτερόλεπτα}} πριν',
+'monday-at' => 'Δευτέρα στις  $1',
+'tuesday-at' => 'Τρίτη στις $1',
+'wednesday-at' => 'Τετάρτη στις $1',
+'thursday-at' => 'Πέμπτη στις $1',
+'friday-at' => 'Παρασκευή στις $1',
+'saturday-at' => 'Σαββάτο στις $1',
+'sunday-at' => 'Κυριακή στις $1',
+'yesterday-at' => 'Χθες στις $1',
+
 # Bad image list
 'bad_image_list' => 'Η σύνταξη είναι ως εξής:
 
@@ -3286,7 +3352,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Πλάτος',
 'exif-imagelength' => 'Υψος',
 'exif-bitspersample' => 'Bits ανά στοιχείο',
@@ -3464,7 +3530,7 @@ $1',
 'exif-originalimageheight' => 'Ύψος εικόνας πριν από την περικοπή της',
 'exif-originalimagewidth' => 'Πλάτος της εικόνας πριν από την περικοπή της',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Έχει αποσυμπιεστεί.',
 'exif-compression-2' => 'Εκτέλεση μήκους κωδικοποίησης CCITT Ομάδα 3 Μιας-Διαστάσεως Modified Huffman',
 'exif-compression-3' => 'Κωδικοποίηση Φαξ CCITT Ομάδας 3',
@@ -3858,7 +3924,6 @@ $5
 'version-other' => 'Άλλα',
 'version-mediahandlers' => 'Χειριστές των μέσων',
 'version-hooks' => 'Άγκιστρα',
-'version-extension-functions' => 'Συναρτήσεις επεκτάσεων',
 'version-parser-extensiontags' => 'Ετικέτες επεκτάσεων του συντακτικού αναλυτή',
 'version-parser-function-hooks' => 'Άγκιστρα συναρτήσεων του συντακτικού αναλυτή',
 'version-hook-name' => 'Όνομα άγκιστρου',
@@ -3880,12 +3945,15 @@ $5
 'version-entrypoints-header-entrypoint' => 'Σημείο εισόδου',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Διαδρομή αρχείου',
-'filepath-page' => 'Αρχείο:',
-'filepath-submit' => 'Μετάβαση',
-'filepath-summary' => 'Αυτή η ειδική σελίδα επιστρέφει την πλήρη διαδρομή ενός αρχείου.
-Οι εικόνες εμφανίζονται σε πλήρη ανάλυση, ενώ άλλοι τύποι αρχείων ανοίγονται απευθείας με το αντίστοιχο πρόγραμμα.',
+# Special:Redirect
+'redirect-legend' => 'Ανακατεύθυνση σε ένα αρχείο ή μια σελίδα',
+'redirect-submit' => 'Μετάβαση',
+'redirect-lookup' => 'Αναζήτηση:',
+'redirect-value' => 'Τιμή:',
+'redirect-user' => 'Αναγνωριστικό χρήση',
+'redirect-revision' => 'Αναθεώρηση σελίδας',
+'redirect-file' => 'Όνομα αρχείου',
+'redirect-not-exists' => 'Η τιμή δε βρέθηκε',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Αναζήτηση για διπλά αρχεία',
@@ -3975,6 +4043,9 @@ $5
 'htmlform-submit' => 'Υποβολή',
 'htmlform-reset' => 'Αναστροφή αλλαγών',
 'htmlform-selectorother-other' => 'Άλλο',
+'htmlform-no' => 'Όχι',
+'htmlform-yes' => 'Ναι',
+'htmlform-chosen-placeholder' => 'Κάντε μια επιλογή',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 με υποστήριξη αναζήτησης πλήρους κειμένου',
@@ -4092,4 +4163,15 @@ $5
 # Image rotation
 'rotate-comment' => 'Η εικόνα περιστράφηκε $1 {{PLURAL:$1| μοίρα|μοίρες}} δεξιόστροφα',
 
+# Limit report
+'limitreport-title' => 'Δεδομένα που σκιαγραφούν το προφίλ του συντακτικού αναλυτή:',
+'limitreport-cputime' => 'Χρόνος χρήσης CPU',
+'limitreport-walltime' => 'Χρήση πραγματικού χρόνου',
+'limitreport-ppvisitednodes' => 'Καταμέτρηση κόμβων επισκεφθέντων από τον προεπεξεργαστή',
+'limitreport-ppgeneratednodes' => 'Καταμέτρηση κόμβων παραχθέντων από τον προεπεξεργαστή',
+'limitreport-postexpandincludesize' => 'Μέγεθος συμπερίληψης πριν την ανάπτυξη',
+'limitreport-templateargumentsize' => 'Μέγεθος ορισμάτων προτύπων',
+'limitreport-expansiondepth' => 'Μεγαλύτερο βάθος ανάπτυξης',
+'limitreport-expensivefunctioncount' => 'Πλήθος ακριβών συναρτήσεων συντακτικού αναλυτή',
+
 );
diff --git a/languages/messages/MessagesEml.php b/languages/messages/MessagesEml.php
index 3db105df..b0fd2ad3 100644
--- a/languages/messages/MessagesEml.php
+++ b/languages/messages/MessagesEml.php
@@ -99,9 +99,6 @@ Nutêv ca alcuni pàgini i putrèbber cuntinuèr a cràdder ca vueter a-sîv dis
 'yourrealname' => 'Al tô vér nàmm:',
 'yourlanguage' => 'Léngua:',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Regestér di nōv utèint',
-
 # Recent changes
 'recentchanges' => 'Ûltem cambiamèint',
 'diff' => 'diferèinzi',
@@ -132,6 +129,9 @@ Nutêv ca alcuni pàgini i putrèbber cuntinuèr a cràdder ca vueter a-sîv dis
 # Special:AllPages
 'allpages' => 'Tôt al pàgin',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Regestér di nōv utèint',
+
 # Watchlist
 'watchlist' => 'Al còsi ca guèrd',
 'watch' => 'Tîn a drê',
diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php
index f90dfdf3..ffbc88ab 100644
--- a/languages/messages/MessagesEn.php
+++ b/languages/messages/MessagesEn.php
@@ -161,19 +161,27 @@ $datePreferenceMigrationMap = array(
 $dateFormats = array(
 	'mdy time' => 'H:i',
 	'mdy date' => 'F j, Y',
+	'mdy monthonly' => 'F Y',
 	'mdy both' => 'H:i, F j, Y',
+	'mdy pretty' => 'F j',
 
 	'dmy time' => 'H:i',
 	'dmy date' => 'j F Y',
+	'dmy monthonly' => 'F Y',
 	'dmy both' => 'H:i, j F Y',
+	'dmy pretty' => 'j F',
 
 	'ymd time' => 'H:i',
 	'ymd date' => 'Y F j',
+	'ymd monthonly' => 'Y F',
 	'ymd both' => 'H:i, Y F j',
+	'ymd pretty' => 'F j',
 
 	'ISO 8601 time' => 'xnH:xni:xns',
 	'ISO 8601 date' => 'xnY-xnm-xnd',
+	'ISO 8601 monthonly' => 'xnY-xnm',
 	'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+	'ISO 8601 pretty' => 'xnm-xnd'
 );
 
 /**
@@ -249,6 +257,8 @@ $magicWords = array(
 	'fullpagenamee'           => array( 1,    'FULLPAGENAMEE' ),
 	'subpagename'             => array( 1,    'SUBPAGENAME' ),
 	'subpagenamee'            => array( 1,    'SUBPAGENAMEE' ),
+	'rootpagename'            => array( 1,    'ROOTPAGENAME' ),
+	'rootpagenamee'           => array( 1,    'ROOTPAGENAMEE' ),
 	'basepagename'            => array( 1,    'BASEPAGENAME' ),
 	'basepagenamee'           => array( 1,    'BASEPAGENAMEE' ),
 	'talkpagename'            => array( 1,    'TALKPAGENAME' ),
@@ -268,6 +278,7 @@ $magicWords = array(
 	'img_center'              => array( 1,    'center', 'centre' ),
 	'img_framed'              => array( 1,    'framed', 'enframed', 'frame' ),
 	'img_frameless'           => array( 1,    'frameless' ),
+	'img_lang'                => array( 1,    'lang=$1' ),
 	'img_page'                => array( 1,    'page=$1', 'page $1' ),
 	'img_upright'             => array( 1,    'upright', 'upright=$1', 'upright $1' ),
 	'img_border'              => array( 1,    'border' ),
@@ -310,6 +321,7 @@ $magicWords = array(
 	'revisionyear'            => array( 1,    'REVISIONYEAR' ),
 	'revisiontimestamp'       => array( 1,    'REVISIONTIMESTAMP' ),
 	'revisionuser'            => array( 1,    'REVISIONUSER' ),
+	'revisionsize'            => array( 1,    'REVISIONSIZE' ),
 	'plural'                  => array( 0,    'PLURAL:' ),
 	'fullurl'                 => array( 0,    'FULLURL:' ),
 	'fullurle'                => array( 0,    'FULLURLE:' ),
@@ -374,12 +386,12 @@ $magicWords = array(
 $specialPageAliases = array(
 	'Activeusers'               => array( 'ActiveUsers' ),
 	'Allmessages'               => array( 'AllMessages' ),
+	'AllMyUploads'              => array( 'AllMyUploads', 'AllMyFiles' ),
 	'Allpages'                  => array( 'AllPages' ),
 	'Ancientpages'              => array( 'AncientPages' ),
 	'Badtitle'                  => array( 'Badtitle' ),
 	'Blankpage'                 => array( 'BlankPage' ),
 	'Block'                     => array( 'Block', 'BlockIP', 'BlockUser' ),
-	'Blockme'                   => array( 'BlockMe' ),
 	'Booksources'               => array( 'BookSources' ),
 	'BrokenRedirects'           => array( 'BrokenRedirects' ),
 	'Categories'                => array( 'Categories' ),
@@ -391,7 +403,6 @@ $specialPageAliases = array(
 	'CreateAccount'             => array( 'CreateAccount' ),
 	'Deadendpages'              => array( 'DeadendPages' ),
 	'DeletedContributions'      => array( 'DeletedContributions' ),
-	'Disambiguations'           => array( 'Disambiguations' ),
 	'DoubleRedirects'           => array( 'DoubleRedirects' ),
 	'EditWatchlist'             => array( 'EditWatchlist' ),
 	'Emailuser'                 => array( 'EmailUser' ),
@@ -427,7 +438,7 @@ $specialPageAliases = array(
 	'Mycontributions'           => array( 'MyContributions' ),
 	'Mypage'                    => array( 'MyPage' ),
 	'Mytalk'                    => array( 'MyTalk' ),
-	'Myuploads'                 => array( 'MyUploads' ),
+	'Myuploads'                 => array( 'MyUploads', 'MyFiles' ),
 	'Newimages'                 => array( 'NewFiles', 'NewImages' ),
 	'Newpages'                  => array( 'NewPages' ),
 	'PagesWithProp'             => array( 'PagesWithProp', 'Pageswithprop', 'PagesByProp', 'Pagesbyprop' ),
@@ -439,9 +450,12 @@ $specialPageAliases = array(
 	'Protectedpages'            => array( 'ProtectedPages' ),
 	'Protectedtitles'           => array( 'ProtectedTitles' ),
 	'Randompage'                => array( 'Random', 'RandomPage' ),
+	'RandomInCategory'          => array( 'RandomInCategory' ),
 	'Randomredirect'            => array( 'RandomRedirect' ),
 	'Recentchanges'             => array( 'RecentChanges' ),
 	'Recentchangeslinked'       => array( 'RecentChangesLinked', 'RelatedChanges' ),
+	'Redirect'                  => array( 'Redirect' ),
+	'ResetTokens'               => array( 'ResetTokens' ),
 	'Revisiondelete'            => array( 'RevisionDelete' ),
 	'Search'                    => array( 'Search' ),
 	'Shortpages'                => array( 'ShortPages' ),
@@ -461,8 +475,8 @@ $specialPageAliases = array(
 	'Unwatchedpages'            => array( 'UnwatchedPages' ),
 	'Upload'                    => array( 'Upload' ),
 	'UploadStash'               => array( 'UploadStash' ),
-	'Userlogin'                 => array( 'UserLogin' ),
-	'Userlogout'                => array( 'UserLogout' ),
+	'Userlogin'                 => array( 'UserLogin', 'Login' ),
+	'Userlogout'                => array( 'UserLogout', 'Logout' ),
 	'Userrights'                => array( 'UserRights', 'MakeSysop', 'MakeBot' ),
 	'Version'                   => array( 'Version' ),
 	'Wantedcategories'          => array( 'WantedCategories' ),
@@ -533,10 +547,10 @@ $preloadedMessages = array(
 	'disclaimers',
 	'edit',
 	'editsection',
-	'editsection-brackets',
 	'editsectionhint',
 	'help',
 	'helppage',
+	'interlanguage-link-title',
 	'jumpto',
 	'jumptonavigation',
 	'jumptosearch',
@@ -622,8 +636,8 @@ The sidebar for MonoBook is generated from this message, lines that do not
 begin with * or ** are discarded, furthermore lines that do begin with ** and
 do not contain | are also discarded, but do not depend on this behavior for
 future releases. Also note that since each list value is wrapped in a unique
-XHTML id it should only appear once and include characters that are legal
-XHTML id names.
+(X)HTML id it should only appear once and include characters that are legal
+(X)HTML id names.
 */
 'sidebar' => '
 * navigation
@@ -664,9 +678,6 @@ XHTML id names.
 'tog-shownumberswatching'     => 'Show the number of watching users',
 'tog-oldsig'                  => 'Existing signature:',
 'tog-fancysig'                => 'Treat signature as wikitext (without an automatic link)',
-'tog-externaleditor'          => 'Use external editor by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff'            => 'Use external diff by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks'           => 'Enable "jump to" accessibility links',
 'tog-uselivepreview'          => 'Use live preview (experimental)',
 'tog-forceeditsummary'        => 'Prompt me when entering a blank edit summary',
 'tog-watchlisthideown'        => 'Hide my edits from the watchlist',
@@ -680,6 +691,8 @@ XHTML id names.
 'tog-showhiddencats'          => 'Show hidden categories',
 'tog-noconvertlink'           => 'Disable link title conversion', # only translate this message to other languages if you have to change it
 'tog-norollbackdiff'          => 'Omit diff after performing a rollback',
+'tog-useeditwarning'          => 'Warn me when I leave an edit page with unsaved changes',
+'tog-prefershttps'            => 'Always use a secure connection when logged in',
 
 'underline-always'  => 'Always',
 'underline-never'   => 'Never',
@@ -693,56 +706,68 @@ XHTML id names.
 'editfont-serif'     => 'Serif font',
 
 # Dates
-'sunday'        => 'Sunday',
-'monday'        => 'Monday',
-'tuesday'       => 'Tuesday',
-'wednesday'     => 'Wednesday',
-'thursday'      => 'Thursday',
-'friday'        => 'Friday',
-'saturday'      => 'Saturday',
-'sun'           => 'Sun',
-'mon'           => 'Mon',
-'tue'           => 'Tue',
-'wed'           => 'Wed',
-'thu'           => 'Thu',
-'fri'           => 'Fri',
-'sat'           => 'Sat',
-'january'       => 'January',
-'february'      => 'February',
-'march'         => 'March',
-'april'         => 'April',
-'may_long'      => 'May',
-'june'          => 'June',
-'july'          => 'July',
-'august'        => 'August',
-'september'     => 'September',
-'october'       => 'October',
-'november'      => 'November',
-'december'      => 'December',
-'january-gen'   => 'January',
-'february-gen'  => 'February',
-'march-gen'     => 'March',
-'april-gen'     => 'April',
-'may-gen'       => 'May',
-'june-gen'      => 'June',
-'july-gen'      => 'July',
-'august-gen'    => 'August',
-'september-gen' => 'September',
-'october-gen'   => 'October',
-'november-gen'  => 'November',
-'december-gen'  => 'December',
-'jan'           => 'Jan',
-'feb'           => 'Feb',
-'mar'           => 'Mar',
-'apr'           => 'Apr',
-'may'           => 'May',
-'jun'           => 'Jun',
-'jul'           => 'Jul',
-'aug'           => 'Aug',
-'sep'           => 'Sep',
-'oct'           => 'Oct',
-'nov'           => 'Nov',
-'dec'           => 'Dec',
+'sunday'         => 'Sunday',
+'monday'         => 'Monday',
+'tuesday'        => 'Tuesday',
+'wednesday'      => 'Wednesday',
+'thursday'       => 'Thursday',
+'friday'         => 'Friday',
+'saturday'       => 'Saturday',
+'sun'            => 'Sun',
+'mon'            => 'Mon',
+'tue'            => 'Tue',
+'wed'            => 'Wed',
+'thu'            => 'Thu',
+'fri'            => 'Fri',
+'sat'            => 'Sat',
+'january'        => 'January',
+'february'       => 'February',
+'march'          => 'March',
+'april'          => 'April',
+'may_long'       => 'May',
+'june'           => 'June',
+'july'           => 'July',
+'august'         => 'August',
+'september'      => 'September',
+'october'        => 'October',
+'november'       => 'November',
+'december'       => 'December',
+'january-gen'    => 'January',
+'february-gen'   => 'February',
+'march-gen'      => 'March',
+'april-gen'      => 'April',
+'may-gen'        => 'May',
+'june-gen'       => 'June',
+'july-gen'       => 'July',
+'august-gen'     => 'August',
+'september-gen'  => 'September',
+'october-gen'    => 'October',
+'november-gen'   => 'November',
+'december-gen'   => 'December',
+'jan'            => 'Jan',
+'feb'            => 'Feb',
+'mar'            => 'Mar',
+'apr'            => 'Apr',
+'may'            => 'May',
+'jun'            => 'Jun',
+'jul'            => 'Jul',
+'aug'            => 'Aug',
+'sep'            => 'Sep',
+'oct'            => 'Oct',
+'nov'            => 'Nov',
+'dec'            => 'Dec',
+'january-date'   => 'January $1',
+'february-date'  => 'February $1',
+'march-date'     => 'March $1',
+'april-date'     => 'April $1',
+'may-date'       => 'May $1',
+'june-date'      => 'June $1',
+'july-date'      => 'July $1',
+'august-date'    => 'August $1',
+'september-date' => 'September $1',
+'october-date'   => 'October $1',
+'november-date'  => 'November $1',
+'december-date'  => 'December $1',
 
 # Categories related messages
 'pagecategories'                 => '{{PLURAL:$1|Category|Categories}}',
@@ -765,7 +790,7 @@ XHTML id names.
 'broken-file-category'           => 'Pages with broken file links',
 'categoryviewer-pagedlinks'      => '($1) ($2)', # only translate this message to other languages if you have to change it
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', # only translate this message to other languages if you have to change it
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD', # only translate this message to other languages if you have to change it
 
 'about'         => 'About',
 'article'       => 'Content page',
@@ -830,6 +855,7 @@ XHTML id names.
 'create-this-page'   => 'Create this page',
 'delete'             => 'Delete',
 'deletethispage'     => 'Delete this page',
+'undeletethispage'   => 'Undelete this page',
 'undelete_short'     => 'Undelete {{PLURAL:$1|one edit|$1 edits}}',
 'viewdeleted_short'  => 'View {{PLURAL:$1|one deleted edit|$1 deleted edits}}',
 'protect'            => 'Protect',
@@ -875,7 +901,7 @@ $1',
 'pool-queuefull'     => 'Pool queue is full',
 'pool-errorunknown'  => 'Unknown error',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite'            => 'About {{SITENAME}}',
 'aboutpage'            => 'Project:About',
 'copyright'            => 'Content is available under $1 unless otherwise noted.',
@@ -885,7 +911,7 @@ $1',
 'disclaimers'          => 'Disclaimers',
 'disclaimerpage'       => 'Project:General disclaimer',
 'edithelp'             => 'Editing help',
-'edithelppage'         => 'Help:Editing',
+'edithelppage'         => 'https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Editing_pages', # do not translate or duplicate this message to other languages
 'helppage'             => 'Help:Contents',
 'mainpage'             => 'Main Page',
 'mainpage-description' => 'Main page',
@@ -918,7 +944,6 @@ See [[Special:Version|version page]].',
 'youhavenewmessagesmulti'      => 'You have new messages on $1',
 'newtalkseparator'             => ',&#32;', # do not translate or duplicate this message to other languages
 'editsection'                  => 'edit',
-'editsection-brackets'         => '[$1]', # only translate this message to other languages if you have to change it
 'editold'                      => 'edit',
 'viewsourceold'                => 'view source',
 'editlink'                     => 'edit',
@@ -947,6 +972,7 @@ See [[Special:Version|version page]].',
 'red-link-title'               => '$1 (page does not exist)',
 'sort-descending'              => 'Sort descending',
 'sort-ascending'               => 'Sort ascending',
+'interlanguage-link-title'     => '$1 – $2', # only translate this message to other languages if you have to change it
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main'      => 'Page',
@@ -974,17 +1000,12 @@ A list of valid special pages can be found at [[Special:SpecialPages|{{int:speci
 # General errors
 'error'                         => 'Error',
 'databaseerror'                 => 'Database error',
-'dberrortext'                   => 'A database query syntax error has occurred.
-This may indicate a bug in the software.
-The last attempted database query was:
-<blockquote><code>$1</code></blockquote>
-from within function "<code>$2</code>".
-Database returned error "<samp>$3: $4</samp>".',
-'dberrortextcl'                 => 'A database query syntax error has occurred.
-The last attempted database query was:
-"$1"
-from within function "$2".
-Database returned error "$3: $4"',
+'databaseerror-text'            => 'A database query error has occurred.
+This may indicate a bug in the software.',
+'databaseerror-textcl'          => 'A database query error has occurred.',
+'databaseerror-query'           => 'Query: $1',
+'databaseerror-function'        => 'Function: $1',
+'databaseerror-error'           => 'Error: $1',
 'laggedslavemode'               => "'''Warning:''' Page may not contain recent updates.",
 'readonly'                      => 'Database locked',
 'enterlockreason'               => 'Enter a reason for the lock, including an estimate of when the lock will be released',
@@ -1018,6 +1039,7 @@ It may have already been deleted by someone else.',
 'cannotdelete-title'            => 'Cannot delete page "$1"',
 'delete-hook-aborted'           => 'Deletion aborted by hook.
 It gave no explanation.',
+'no-null-revision'              => 'Could not create new null revision for page "$1"',
 'badtitle'                      => 'Bad title',
 'badtitletext'                  => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.
 It may contain one or more characters that cannot be used in titles.',
@@ -1041,12 +1063,15 @@ To add or change translations for all wikis, please use [//translatewiki.net/ tr
 'editinginterface'              => "'''Warning:''' You are editing a page that is used to provide interface text for the software.
 Changes to this page will affect the appearance of the user interface for other users on this wiki.
 To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden'                     => '(SQL query hidden)',
 'cascadeprotected'              => 'This page has been protected from editing because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the "cascading" option turned on:
 $2',
 'namespaceprotected'            => "You do not have permission to edit pages in the '''$1''' namespace.",
 'customcssprotected'            => "You do not have permission to edit this CSS page because it contains another user's personal settings.",
 'customjsprotected'             => "You do not have permission to edit this JavaScript page because it contains another user's personal settings.",
+'mycustomcssprotected'          => 'You do not have permission to edit this CSS page.',
+'mycustomjsprotected'           => 'You do not have permission to edit this JavaScript page.',
+'myprivateinfoprotected'        => 'You do not have permission to edit your private information.',
+'mypreferencesprotected'        => 'You do not have permission to edit your preferences.',
 'ns-specialprotected'           => 'Special pages cannot be edited.',
 'titleprotected'                => 'This title has been protected from creation by [[User:$1|$1]].
 The reason given is "\'\'$2\'\'".',
@@ -1056,7 +1081,7 @@ The administrator who locked it offered this explanation: "$3".',
 'invalidtitle-knownnamespace'   => 'Invalid title with namespace "$2" and text "$3"',
 'invalidtitle-unknownnamespace' => 'Invalid title with unknown namespace number $1 and text "$2"',
 'exception-nologin'             => 'Not logged in',
-'exception-nologin-text'        => 'This page or action requires you to be logged in on this wiki.',
+'exception-nologin-text'        => 'Please [[Special:Userlogin|log in]] to be able to access this page or action.',
 
 # Virus scanner
 'virus-badscanner'     => "Bad configuration: Unknown virus scanner: ''$1''",
@@ -1064,72 +1089,115 @@ The administrator who locked it offered this explanation: "$3".',
 'virus-unknownscanner' => 'unknown antivirus:',
 
 # Login and logout pages
-'logouttext'                 => "'''You are now logged out.'''
+'logouttext'                      => "'''You are now logged out.'''
 
 Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-'welcomeuser'                => 'Welcome, $1!',
-'welcomecreation-msg'        => 'Your account has been created.
-Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
-'yourname'                   => 'Username:',
-'yourpassword'               => 'Password:',
-'yourpasswordagain'          => 'Retype password:',
-'remembermypassword'         => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'securelogin-stick-https'    => 'Stay connected to HTTPS after login',
-'yourdomainname'             => 'Your domain:',
-'password-change-forbidden'  => 'You cannot change passwords on this wiki.',
-'externaldberror'            => 'There was either an authentication database error or you are not allowed to update your external account.',
-'login'                      => 'Log in',
-'nav-login-createaccount'    => 'Log in / create account',
-'loginprompt'                => 'You must have cookies enabled to log in to {{SITENAME}}.',
-'userlogin'                  => 'Log in / create account',
-'userloginnocreate'          => 'Log in',
-'logout'                     => 'Log out',
-'userlogout'                 => 'Log out',
-'userlogout-summary'         => '', # do not translate or duplicate this message to other languages
-'notloggedin'                => 'Not logged in',
-'nologin'                    => "Don't have an account? $1.",
-'nologinlink'                => 'Create an account',
-'createaccount'              => 'Create account',
-'gotaccount'                 => 'Already have an account? $1.',
-'gotaccountlink'             => 'Log in',
-'userlogin-resetlink'        => 'Forgotten your login details?',
-'createaccountmail'          => 'Use a temporary random password and send it to the specified email address',
-'createaccountreason'        => 'Reason:',
-'badretype'                  => 'The passwords you entered do not match.',
-'userexists'                 => 'Username entered already in use.
+'welcomeuser'                     => 'Welcome, $1!',
+'welcomecreation-msg'             => 'Your account has been created.
+You can change your {{SITENAME}} [[Special:Preferences|preferences]] if you wish.',
+'yourname'                        => 'Username:',
+'userlogin-yourname'              => 'Username',
+'userlogin-yourname-ph'           => 'Enter your username',
+'createacct-another-username-ph'  => 'Enter the username',
+'createacct-helpusername'         => '', # do not translate or duplicate this message to other languages
+'yourpassword'                    => 'Password:',
+'userlogin-yourpassword'          => 'Password',
+'userlogin-yourpassword-ph'       => 'Enter your password',
+'createacct-yourpassword-ph'      => 'Enter a password',
+'yourpasswordagain'               => 'Retype password:',
+'createacct-yourpasswordagain'    => 'Confirm password',
+'createacct-yourpasswordagain-ph' => 'Enter password again',
+'remembermypassword'              => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'userlogin-remembermypassword'    => 'Keep me logged in',
+'userlogin-signwithsecure'        => 'Use secure connection',
+'yourdomainname'                  => 'Your domain:',
+'password-change-forbidden'       => 'You cannot change passwords on this wiki.',
+'externaldberror'                 => 'There was either an authentication database error or you are not allowed to update your external account.',
+'login'                           => 'Log in',
+'nav-login-createaccount'         => 'Log in / create account',
+'loginprompt'                     => 'You must have cookies enabled to log in to {{SITENAME}}.',
+'userlogin'                       => 'Log in / create account',
+'userloginnocreate'               => 'Log in',
+'logout'                          => 'Log out',
+'userlogout'                      => 'Log out',
+'userlogout-summary'              => '', # do not translate or duplicate this message to other languages
+'notloggedin'                     => 'Not logged in',
+'userlogin-noaccount'             => "Don't have an account?",
+'userlogin-joinproject'           => 'Join {{SITENAME}}',
+'nologin'                         => "Don't have an account? $1.",
+'nologinlink'                     => 'Create an account',
+'createaccount'                   => 'Create account',
+'gotaccount'                      => 'Already have an account? $1.',
+'gotaccountlink'                  => 'Log in',
+'userlogin-resetlink'             => 'Forgotten your login details?',
+'userlogin-resetpassword-link'    => 'Forgot your password?',
+'helplogin-url'                   => 'Help:Logging in',
+'userlogin-helplink'              => '[[{{MediaWiki:helplogin-url}}|Help with logging in]]',
+'userlogin-loggedin'              => 'You are already logged in as {{GENDER:$1|$1}}.
+Use the form below to log in as another user.',
+'userlogin-createanother'         => 'Create another account',
+'createacct-join'                 => 'Enter your information below.',
+'createacct-another-join'         => "Enter the new account's information below.",
+'createacct-emailrequired'        => 'Email address',
+'createacct-emailoptional'        => 'Email address (optional)',
+'createacct-email-ph'             => 'Enter your email address',
+'createacct-another-email-ph'     => 'Enter email address',
+'createaccountmail'               => 'Use a temporary random password and send it to the specified email address',
+'createacct-realname'             => 'Real name (optional)',
+'createaccountreason'             => 'Reason:',
+'createacct-reason'               => 'Reason',
+'createacct-reason-ph'            => 'Why you are creating another account',
+'createacct-captcha'              => 'Security check',
+'createacct-imgcaptcha-help'      => '', # do not translate or duplicate this message to other languages
+'createacct-imgcaptcha-ph'        => 'Enter the text you see above',
+'createacct-submit'               => 'Create your account',
+'createacct-another-submit'       => 'Create another account',
+'createacct-benefit-heading'      => '{{SITENAME}} is made by people like you.',
+'createacct-benefit-icon1'        => 'icon-edits', # do not translate or duplicate this message to other languages
+'createacct-benefit-head1'        => '{{NUMBEROFEDITS}}', # do not translate or duplicate this message to other languages
+'createacct-benefit-body1'        => '{{PLURAL:$1|edit|edits}}',
+'createacct-benefit-icon2'        => 'icon-pages', # do not translate or duplicate this message to other languages
+'createacct-benefit-head2'        => '{{NUMBEROFARTICLES}}', # do not translate or duplicate this message to other languages
+'createacct-benefit-body2'        => '{{PLURAL:$1|page|pages}}',
+'createacct-benefit-icon3'        => 'icon-contributors', # do not translate or duplicate this message to other languages
+'createacct-benefit-head3'        => '{{NUMBEROFACTIVEUSERS}}', # do not translate or duplicate this message to other languages
+'createacct-benefit-body3'        => 'recent {{PLURAL:$1|contributor|contributors}}',
+'badretype'                       => 'The passwords you entered do not match.',
+'userexists'                      => 'Username entered already in use.
 Please choose a different name.',
-'loginerror'                 => 'Login error',
-'createaccounterror'         => 'Could not create account: $1',
-'nocookiesnew'               => 'The user account was created, but you are not logged in.
+'loginerror'                      => 'Login error',
+'createacct-error'                => 'Account creation error',
+'createaccounterror'              => 'Could not create account: $1',
+'nocookiesnew'                    => 'The user account was created, but you are not logged in.
 {{SITENAME}} uses cookies to log in users.
 You have cookies disabled.
 Please enable them, then log in with your new username and password.',
-'nocookieslogin'             => '{{SITENAME}} uses cookies to log in users.
+'nocookieslogin'                  => '{{SITENAME}} uses cookies to log in users.
 You have cookies disabled.
 Please enable them and try again.',
-'nocookiesfornew'            => 'The user account was not created, as we could not confirm its source.
+'nocookiesfornew'                 => 'The user account was not created, as we could not confirm its source.
 Ensure you have cookies enabled, reload this page and try again.',
-'nocookiesforlogin'          => '{{int:nocookieslogin}}', # only translate this message to other languages if you have to change it
-'noname'                     => 'You have not specified a valid username.',
-'loginsuccesstitle'          => 'Login successful',
-'loginsuccess'               => "'''You are now logged in to {{SITENAME}} as \"\$1\".'''",
-'nosuchuser'                 => 'There is no user by the name "$1".
+'nocookiesforlogin'               => '{{int:nocookieslogin}}', # only translate this message to other languages if you have to change it
+'noname'                          => 'You have not specified a valid username.',
+'loginsuccesstitle'               => 'Login successful',
+'loginsuccess'                    => "'''You are now logged in to {{SITENAME}} as \"\$1\".'''",
+'nosuchuser'                      => 'There is no user by the name "$1".
 Usernames are case sensitive.
 Check your spelling, or [[Special:UserLogin/signup|create a new account]].',
-'nosuchusershort'            => 'There is no user by the name "$1".
+'nosuchusershort'                 => 'There is no user by the name "$1".
 Check your spelling.',
-'nouserspecified'            => 'You have to specify a username.',
-'login-userblocked'          => 'This user is blocked. Login not allowed.',
-'wrongpassword'              => 'Incorrect password entered.
+'nouserspecified'                 => 'You have to specify a username.',
+'login-userblocked'               => 'This user is blocked. Login not allowed.',
+'wrongpassword'                   => 'Incorrect password entered.
 Please try again.',
-'wrongpasswordempty'         => 'Password entered was blank.
+'wrongpasswordempty'              => 'Password entered was blank.
 Please try again.',
-'passwordtooshort'           => 'Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.',
-'password-name-match'        => 'Your password must be different from your username.',
-'password-login-forbidden'   => 'The use of this username and password has been forbidden.',
-'mailmypassword'             => 'Email new password',
-'passwordremindertitle'      => 'New temporary password for {{SITENAME}}',
-'passwordremindertext'       => 'Someone (probably you, from IP address $1) requested a new
+'passwordtooshort'                => 'Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.',
+'password-name-match'             => 'Your password must be different from your username.',
+'password-login-forbidden'        => 'The use of this username and password has been forbidden.',
+'mailmypassword'                  => 'Email new password',
+'passwordremindertitle'           => 'New temporary password for {{SITENAME}}',
+'passwordremindertext'            => 'Someone (probably you, from IP address $1) requested a new
 password for {{SITENAME}} ($4). A temporary password for user
 "$2" has been created and was set to "$3". If this was your
 intent, you will need to log in and choose a new password now.
@@ -1138,53 +1206,55 @@ Your temporary password will expire in {{PLURAL:$5|one day|$5 days}}.
 If someone else made this request, or if you have remembered your password,
 and you no longer wish to change it, you may ignore this message and
 continue using your old password.',
-'noemail'                    => 'There is no email address recorded for user "$1".',
-'noemailcreate'              => 'You need to provide a valid email address.',
-'passwordsent'               => 'A new password has been sent to the email address registered for "$1".
+'noemail'                         => 'There is no email address recorded for user "$1".',
+'noemailcreate'                   => 'You need to provide a valid email address.',
+'passwordsent'                    => 'A new password has been sent to the email address registered for "$1".
 Please log in again after you receive it.',
-'blocked-mailpassword'       => 'Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.',
-'eauthentsent'               => 'A confirmation email has been sent to the nominated email address.
+'blocked-mailpassword'            => 'Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.',
+'eauthentsent'                    => 'A confirmation email has been sent to the specified email address.
 Before any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.',
-'throttled-mailpassword'     => 'A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.
+'throttled-mailpassword'          => 'A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.
 To prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.',
-'loginstart'                 => '', # do not translate or duplicate this message to other languages
-'loginend'                   => '', # do not translate or duplicate this message to other languages
-'loginend-https'             => '', # do not translate or duplicate this message to other languages
-'signupstart'                => '{{int:loginstart}}', # do not translate or duplicate this message to other languages
-'signupend'                  => '{{int:loginend}}', # do not translate or duplicate this message to other languages
-'signupend-https'            => '', # do not translate or duplicate this message to other languages
-'mailerror'                  => 'Error sending mail: $1',
-'acct_creation_throttle_hit' => 'Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.
+'loginstart'                      => '', # do not translate or duplicate this message to other languages
+'loginend'                        => '', # do not translate or duplicate this message to other languages
+'loginend-https'                  => '', # do not translate or duplicate this message to other languages
+'signupstart'                     => '{{int:loginstart}}', # do not translate or duplicate this message to other languages
+'signupend'                       => '{{int:loginend}}', # do not translate or duplicate this message to other languages
+'signupend-https'                 => '', # do not translate or duplicate this message to other languages
+'mailerror'                       => 'Error sending mail: $1',
+'acct_creation_throttle_hit'      => 'Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.
 As a result, visitors using this IP address cannot create any more accounts at the moment.',
-'emailauthenticated'         => 'Your email address was authenticated on $2 at $3.',
-'emailnotauthenticated'      => 'Your email address is not yet authenticated.
+'emailauthenticated'              => 'Your email address was confirmed on $2 at $3.',
+'emailnotauthenticated'           => 'Your email address is not yet confirmed.
 No email will be sent for any of the following features.',
-'noemailprefs'               => 'Specify an email address in your preferences for these features to work.',
-'emailconfirmlink'           => 'Confirm your email address',
-'invalidemailaddress'        => 'The email address cannot be accepted as it appears to have an invalid format.
+'noemailprefs'                    => 'Specify an email address in your preferences for these features to work.',
+'emailconfirmlink'                => 'Confirm your email address',
+'invalidemailaddress'             => 'The email address cannot be accepted as it appears to have an invalid format.
 Please enter a well-formatted address or empty that field.',
-'cannotchangeemail'          => 'Account email addresses cannot be changed on this wiki.',
-'emaildisabled'              => 'This site cannot send emails.',
-'accountcreated'             => 'Account created',
+'cannotchangeemail'               => 'Account email addresses cannot be changed on this wiki.',
+'emaildisabled'                   => 'This site cannot send emails.',
+'accountcreated'                  => 'Account created',
 'accountcreatedtext'              => 'The user account for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) has been created.',
-'createaccount-title'        => 'Account creation for {{SITENAME}}',
-'createaccount-text'         => 'Someone created an account for your email address on {{SITENAME}} ($4) named "$2", with password "$3".
+'createaccount-title'             => 'Account creation for {{SITENAME}}',
+'createaccount-text'              => 'Someone created an account for your email address on {{SITENAME}} ($4) named "$2", with password "$3".
 You should log in and change your password now.
 
 You may ignore this message, if this account was created in error.',
-'usernamehasherror'          => 'Username cannot contain hash characters',
-'login-throttled'            => 'You have made too many recent login attempts.
-Please wait before trying again.',
-'login-abort-generic'        => 'Your login was unsuccessful - Aborted',
-'loginlanguagelabel'         => 'Language: $1',
-'loginlanguagelinks'         => '* {{#language:de}}|de
+'usernamehasherror'               => 'Username cannot contain hash characters',
+'login-throttled'                 => 'You have made too many recent login attempts.
+Please wait $1 before trying again.',
+'login-abort-generic'             => 'Your login was unsuccessful - Aborted',
+'loginlanguagelabel'              => 'Language: $1',
+'loginlanguagelinks'              => '* {{#language:de}}|de
 * {{#language:en}}|en
 * {{#language:eo}}|eo
 * {{#language:fr}}|fr
 * {{#language:es}}|es
 * {{#language:it}}|it
 * {{#language:nl}}|nl', # do not translate or duplicate this message to other languages
-'suspicious-userlogout'      => 'Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.',
+'suspicious-userlogout'           => 'Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.',
+'createacct-another-realname-tip' => 'Real name is optional.
+If you choose to provide it, this will be used for giving the user attribution for their work.',
 
 # Email sending
 'pear-mail-error'        => '$1', # do not translate or duplicate this message to other languages
@@ -1202,10 +1272,8 @@ To finish logging in, you must set a new password here:',
 'oldpassword'               => 'Old password:',
 'newpassword'               => 'New password:',
 'retypenew'                 => 'Retype new password:',
-'resetpass-abort-generic'   => 'Password change has been aborted by an extension.',
 'resetpass_submit'          => 'Set password and log in',
-'resetpass_success'         => 'Your password has been changed successfully!
-Now logging you in...',
+'changepassword-success'    => 'Your password has been changed successfully!',
 'resetpass_forbidden'       => 'Passwords cannot be changed',
 'resetpass-no-info'         => 'You must be logged in to access this page directly.',
 'resetpass-submit-loggedin' => 'Change password',
@@ -1213,13 +1281,15 @@ Now logging you in...',
 'resetpass-wrong-oldpass'   => 'Invalid temporary or current password.
 You may have already successfully changed your password or requested a new temporary password.',
 'resetpass-temp-password'   => 'Temporary password:',
+'resetpass-abort-generic'   => 'Password change has been aborted by an extension.',
 
 # Special:PasswordReset
 'passwordreset'                    => 'Reset password',
-'passwordreset-text'               => 'Complete this form to reset your password.',
+'passwordreset-text-one'           => 'Complete this form to reset your password.',
+'passwordreset-text-many'          => '{{PLURAL:$1|Fill one of the fields to reset your password.}}',
 'passwordreset-legend'             => 'Reset password',
 'passwordreset-disabled'           => 'Password resets have been disabled on this wiki.',
-'passwordreset-pretext'            => '{{PLURAL:$1||Enter one of the pieces of data below}}',
+'passwordreset-emaildisabled'      => 'Email features have been disabled on this wiki.',
 'passwordreset-username'           => 'Username:',
 'passwordreset-domain'             => 'Domain:',
 'passwordreset-capture'            => 'View the resulting email?',
@@ -1251,7 +1321,7 @@ password.',
 Temporary password: $2',
 'passwordreset-emailsent'          => 'A password reset email has been sent.',
 'passwordreset-emailsent-capture'  => 'A password reset email has been sent, which is shown below.',
-'passwordreset-emailerror-capture' => 'A password reset email was generated, which is shown below, but sending it to the user failed: $1',
+'passwordreset-emailerror-capture' => 'A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1',
 
 # Special:ChangeEmail
 'changeemail'          => 'Change email address',
@@ -1266,6 +1336,20 @@ Temporary password: $2',
 'changeemail-submit'   => 'Change email',
 'changeemail-cancel'   => 'Cancel',
 
+# Special:ResetTokens
+'resettokens'                 => 'Reset tokens',
+'resettokens-summary'         => '', # do not translate or duplicate this message to other languages
+'resettokens-text'            => 'You can reset tokens which allow access to certain private data associated with your account here.
+
+You should do it if you accidentally shared them with someone or if your account has been compromised.',
+'resettokens-no-tokens'       => 'There are no tokens to reset.',
+'resettokens-legend'          => 'Reset tokens',
+'resettokens-tokens'          => 'Tokens:',
+'resettokens-token-label'     => '$1 (current value: $2)',
+'resettokens-watchlist-token' => 'Token for the web feed (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]',
+'resettokens-done'            => 'Tokens reset.',
+'resettokens-resetbutton'     => 'Reset selected tokens',
+
 # Edit page toolbar
 'bold_sample'     => 'Bold text',
 'bold_tip'        => 'Bold text',
@@ -1480,6 +1564,7 @@ It gave no explanation.',
 It appears to have been deleted.',
 'edit-conflict'                    => 'Edit conflict.',
 'edit-no-change'                   => 'Your edit was ignored because no change was made to the text.',
+'postedit-confirmation'            => 'Your edit was saved.',
 'edit-already-exists'              => 'Could not create a new page.
 It already exists.',
 'addsection-preload'               => '', # do not translate or duplicate this message to other languages
@@ -1488,6 +1573,8 @@ It already exists.',
 'content-failed-to-parse'          => 'Failed to parse $2 content for $1 model: $3',
 'invalid-content-data'             => 'Invalid content data',
 'content-not-allowed-here'         => '"$1" content is not allowed on page [[$2]]',
+'editwarning-warning'              => 'Leaving this page may cause you to lose any changes you have made.
+If you are logged in, you can disable this warning in the "Editing" section of your preferences.',
 
 # Content models
 'content-model-wikitext'   => 'wikitext',
@@ -1518,11 +1605,12 @@ These arguments have been omitted.",
 'converter-manual-rule-error'             => 'Error detected in manual language conversion rule',
 
 # "Undo" feature
-'undo-success' => 'The edit can be undone.
+'undo-success'                 => 'The edit can be undone.
 Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.',
-'undo-failure' => 'The edit could not be undone due to conflicting intermediate edits.',
-'undo-norev'   => 'The edit could not be undone because it does not exist or was deleted.',
-'undo-summary' => 'Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])',
+'undo-failure'                 => 'The edit could not be undone due to conflicting intermediate edits.',
+'undo-norev'                   => 'The edit could not be undone because it does not exist or was deleted.',
+'undo-summary'                 => 'Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])',
+'undo-summary-username-hidden' => 'Undo revision $1 by a hidden user',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Cannot create account',
@@ -1616,17 +1704,17 @@ Other administrators on {{SITENAME}} will still be able to access the hidden con
 'revdelete-suppress-text'     => "Suppression should '''only''' be used for the following cases:
 * Potentially libelous information
 * Inappropriate personal information
-*: ''home addresses and telephone numbers, social security numbers, etc.''",
+*: ''home addresses and telephone numbers, national identification numbers, etc.''",
 'revdelete-legend'            => 'Set visibility restrictions',
-'revdelete-hide-text'         => 'Hide revision text',
+'revdelete-hide-text'         => 'Revision text',
 'revdelete-hide-image'        => 'Hide file content',
 'revdelete-hide-name'         => 'Hide action and target',
-'revdelete-hide-comment'      => 'Hide edit summary',
-'revdelete-hide-user'         => "Hide editor's username/IP address",
+'revdelete-hide-comment'      => 'Edit summary',
+'revdelete-hide-user'         => "Editor's username/IP address",
 'revdelete-hide-restricted'   => 'Suppress data from administrators as well as others',
 'revdelete-radio-same'        => '(do not change)',
-'revdelete-radio-set'         => 'Yes',
-'revdelete-radio-unset'       => 'No',
+'revdelete-radio-set'         => 'Hidden',
+'revdelete-radio-unset'       => 'Visible',
 'revdelete-suppress'          => 'Suppress data from administrators as well as others',
 'revdelete-unsuppress'        => 'Remove restrictions on restored revisions',
 'revdelete-log'               => 'Reason:',
@@ -1709,6 +1797,7 @@ Note that using the navigation links will reset this column.',
 'compareselectedversions'     => 'Compare selected revisions',
 'showhideselectedversions'    => 'Change visibility of selected revisions',
 'editundo'                    => 'undo',
+'diff-empty'                  => '(No difference)',
 'diff-multi'                  => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one user|$2 users}} not shown)',
 'diff-multi-manyusers'        => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)',
 'difference-missing-revision' => '{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} not found.
@@ -1738,9 +1827,7 @@ Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'searchmenu-exists'                => "'''There is a page named \"[[:\$1]]\" on this wiki.'''",
 'searchmenu-new'                   => "'''Create the page \"[[:\$1]]\" on this wiki!'''",
 'searchmenu-new-nocreate'          => '', # do not translate or duplicate this message to other languages
-'searchhelp-url'                   => 'Help:Contents',
 'searchmenu-prefix'                => '[[Special:PrefixIndex/$1|Browse pages with this prefix]]',
-'searchmenu-help'                  => '[[{{MediaWiki:Searchhelp-url}}|{{int:help}}]]?', # do not translate or duplicate this message to other languages
 'searchprofile-articles'           => 'Content pages',
 'searchprofile-project'            => 'Help and Project pages',
 'searchprofile-images'             => 'Multimedia',
@@ -1797,19 +1884,11 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
 	<input type="radio" name="sitesearch" id="gWWW" value="" /><label for="gWWW">WWW</label>
   </div>
 </form>', # do not translate or duplicate this message to other languages
+'search-error'                     => 'An error has occurred while searching: $1',
 
 # OpenSearch description
 'opensearch-desc' => '{{SITENAME}} ({{CONTENTLANGUAGE}})', # do not translate or duplicate this message to other languages
 
-# Quickbar
-'qbsettings'                => 'Quickbar',
-'qbsettings-none'           => 'None',
-'qbsettings-fixedleft'      => 'Fixed left',
-'qbsettings-fixedright'     => 'Fixed right',
-'qbsettings-floatingleft'   => 'Floating left',
-'qbsettings-floatingright'  => 'Floating right',
-'qbsettings-directionality' => 'Fixed, depending on the script directionality of your language',
-
 # Preferences page
 'preferences'                   => 'Preferences',
 'preferences-summary'           => '', # do not translate or duplicate this message to other languages
@@ -1844,7 +1923,6 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
 'resetprefs'                    => 'Clear unsaved changes',
 'restoreprefs'                  => 'Restore all default settings (in all sections)',
 'prefs-editing'                 => 'Editing',
-'prefs-edit-boxsize'            => 'Size of the edit window.',
 'rows'                          => 'Rows:',
 'columns'                       => 'Columns:',
 'searchresultshead'             => 'Search',
@@ -1855,9 +1933,9 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
 'recentchangesdays-max'         => 'Maximum $1 {{PLURAL:$1|day|days}}',
 'recentchangescount'            => 'Number of edits to show by default:',
 'prefs-help-recentchangescount' => 'This includes recent changes, page histories, and logs.',
-'prefs-help-watchlist-token'    => "Filling in this field with a secret key will generate an RSS feed for your watchlist.
-Anyone who knows the key in this field will be able to read your watchlist, so choose a secure value.
-Here's a randomly-generated value you can use: $1",
+'prefs-help-watchlist-token2'   => 'This is the secret key to the web feed of your watchlist.
+Anyone who knows it will be able to read your watchlist, so do not share it.
+[[Special:ResetTokens|Click here if you need to reset it]].',
 'savedprefs'                    => 'Your preferences have been saved.',
 'timezonelegend'                => 'Time zone:',
 'localtime'                     => 'Local time:',
@@ -1888,7 +1966,6 @@ Here's a randomly-generated value you can use: $1",
 'prefs-reset-intro'             => 'You can use this page to reset your preferences to the site defaults.
 This cannot be undone.',
 'prefs-emailconfirm-label'      => 'Email confirmation:',
-'prefs-textboxsize'             => 'Size of editing window',
 'youremail'                     => 'Email:',
 'username'                      => '{{GENDER:$1|Username}}:',
 'uid'                           => '{{GENDER:$1|User}} ID:',
@@ -1926,6 +2003,8 @@ Your email address is not revealed when other users contact you.',
 'prefs-dateformat'              => 'Date format',
 'prefs-timeoffset'              => 'Time offset',
 'prefs-advancedediting'         => 'General options',
+'prefs-editor'                  => 'Editor',
+'prefs-preview'                 => 'Preview',
 'prefs-advancedrc'              => 'Advanced options',
 'prefs-advancedrendering'       => 'Advanced options',
 'prefs-advancedsearchoptions'   => 'Advanced options',
@@ -1933,7 +2012,9 @@ Your email address is not revealed when other users contact you.',
 'prefs-displayrc'               => 'Display options',
 'prefs-displaysearchoptions'    => 'Display options',
 'prefs-displaywatchlist'        => 'Display options',
+'prefs-tokenwatchlist'          => 'Token',
 'prefs-diffs'                   => 'Diffs',
+'prefs-help-prefershttps'       => 'This preference will take effect on your next login.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid'   => 'Email address appears valid',
@@ -1963,6 +2044,8 @@ Your email address is not revealed when other users contact you.',
 'userrights-changeable-col'      => 'Groups you can change',
 'userrights-unchangeable-col'    => 'Groups you cannot change',
 'userrights-irreversible-marker' => '$1*', # only translate this message to other languages if you have to change it
+'userrights-conflict'            => 'Conflict of user rights changes! Please review and confirm your changes.',
+'userrights-removed-self'        => 'You successfully removed your own rights. As such, you are no longer able to access this page.',
 
 # Groups
 'group'               => 'Group:',
@@ -2028,11 +2111,19 @@ Your email address is not revealed when other users contact you.',
 'right-proxyunbannable'       => 'Bypass automatic blocks of proxies',
 'right-unblockself'           => 'Unblock oneself',
 'right-protect'               => 'Change protection levels and edit cascade-protected pages',
-'right-editprotected'         => 'Edit protected pages (without cascading protection)',
+'right-editprotected'         => 'Edit pages protected as "{{int:protect-level-sysop}}"',
+'right-editsemiprotected'     => 'Edit pages protected as "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface'         => 'Edit the user interface',
 'right-editusercssjs'         => "Edit other users' CSS and JavaScript files",
 'right-editusercss'           => "Edit other users' CSS files",
 'right-edituserjs'            => "Edit other users' JavaScript files",
+'right-editmyusercss'         => 'Edit your own user CSS files',
+'right-editmyuserjs'          => 'Edit your own user JavaScript files',
+'right-viewmywatchlist'       => 'View your own watchlist',
+'right-editmywatchlist'       => 'Edit your own watchlist. Note some actions will still add pages even without this right.',
+'right-viewmyprivateinfo'     => 'View your own private data (e.g. email address, real name)',
+'right-editmyprivateinfo'     => 'Edit your own private data (e.g. email address, real name)',
+'right-editmyoptions'         => 'Edit your own preferences',
 'right-rollback'              => 'Quickly rollback the edits of the last user who edited a particular page',
 'right-markbotedits'          => 'Mark rolled-back edits as bot edits',
 'right-noratelimit'           => 'Not be affected by rate limits',
@@ -2094,14 +2185,21 @@ Your email address is not revealed when other users contact you.',
 'action-userrights-interwiki' => 'edit user rights of users on other wikis',
 'action-siteadmin'            => 'lock or unlock the database',
 'action-sendemail'            => 'send emails',
+'action-editmywatchlist'      => 'edit your watchlist',
+'action-viewmywatchlist'      => 'view your watchlist',
+'action-viewmyprivateinfo'    => 'view your private information',
+'action-editmyprivateinfo'    => 'edit your private information',
 
 # Recent changes
 'nchanges'                          => '$1 {{PLURAL:$1|change|changes}}',
+'enhancedrc-since-last-visit'       => '$1 {{PLURAL:$1|since last visit}}',
+'enhancedrc-history'                => 'history',
 'recentchanges'                     => 'Recent changes',
 'recentchanges-url'                 => 'Special:RecentChanges', # do not translate or duplicate this message to other languages
 'recentchanges-legend'              => 'Recent changes options',
 'recentchanges-summary'             => 'Track the most recent changes to the wiki on this page.',
 'recentchangestext'                 => '-', # do not translate or duplicate this message to other languages
+'recentchanges-noresult'            => 'No changes during the given period matching these criteria.',
 'recentchanges-feed-description'    => 'Track the most recent changes to the wiki in this feed.',
 'recentchanges-label-newpage'       => 'This edit created a new page',
 'recentchanges-label-minor'         => 'This is a minor edit',
@@ -2137,15 +2235,14 @@ Your email address is not revealed when other users contact you.',
 'rc-old-title'                      => 'originally created as "$1"',
 
 # Recent changes linked
-'recentchangeslinked'          => 'Related changes',
-'recentchangeslinked-feed'     => 'Related changes',
-'recentchangeslinked-toolbox'  => 'Related changes',
-'recentchangeslinked-title'    => 'Changes related to "$1"',
-'recentchangeslinked-noresult' => 'No changes on linked pages during the given period.',
-'recentchangeslinked-summary'  => "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).
+'recentchangeslinked'         => 'Related changes',
+'recentchangeslinked-feed'    => 'Related changes',
+'recentchangeslinked-toolbox' => 'Related changes',
+'recentchangeslinked-title'   => 'Changes related to "$1"',
+'recentchangeslinked-summary' => "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).
 Pages on [[Special:Watchlist|your watchlist]] are '''bold'''.",
-'recentchangeslinked-page'     => 'Page name:',
-'recentchangeslinked-to'       => 'Show changes to pages linked to the given page instead',
+'recentchangeslinked-page'    => 'Page name:',
+'recentchangeslinked-to'      => 'Show changes to pages linked to the given page instead',
 
 # Upload
 'upload'                      => 'Upload file',
@@ -2153,7 +2250,7 @@ Pages on [[Special:Watchlist|your watchlist]] are '''bold'''.",
 'reuploaddesc'                => 'Cancel upload and return to the upload form',
 'upload-tryagain'             => 'Submit modified file description',
 'uploadnologin'               => 'Not logged in',
-'uploadnologintext'           => 'You must be [[Special:UserLogin|logged in]] to upload files.',
+'uploadnologintext'           => 'You must $1 to upload files.',
 'upload_directory_missing'    => 'The upload directory ($1) is missing and could not be created by the webserver.',
 'upload_directory_read_only'  => 'The upload directory ($1) is not writable by the webserver.',
 'uploaderror'                 => 'Upload error',
@@ -2172,6 +2269,7 @@ To include a file in a page, use a link in one of the following forms:
 'upload-preferred'            => 'Preferred file types: $1.',
 'upload-prohibited'           => 'Prohibited file types: $1.',
 'uploadfooter'                => '-', # do not translate or duplicate this message to other languages
+'upload-default-description'  => '-', # do not translate or duplicate this message to other languages
 'uploadlog'                   => 'upload log',
 'uploadlogpage'               => 'Upload log',
 'uploadlogpagetext'           => 'Below is a list of the most recent file uploads.
@@ -2388,14 +2486,13 @@ For optimal security, img_auth.php is disabled.',
 'img-auth-bad-query-string' => 'The URL has an invalid query string.',
 
 # HTTP errors
-'http-invalid-url'      => 'Invalid URL: $1',
-'http-invalid-scheme'   => 'URLs with the "$1" scheme are not supported.',
-'http-request-error'    => 'HTTP request failed due to unknown error.',
-'http-read-error'       => 'HTTP read error.',
-'http-timed-out'        => 'HTTP request timed out.',
-'http-curl-error'       => 'Error fetching URL: $1',
-'http-host-unreachable' => 'Could not reach URL.',
-'http-bad-status'       => 'There was a problem during the HTTP request: $1 $2',
+'http-invalid-url'    => 'Invalid URL: $1',
+'http-invalid-scheme' => 'URLs with the "$1" scheme are not supported.',
+'http-request-error'  => 'HTTP request failed due to unknown error.',
+'http-read-error'     => 'HTTP read error.',
+'http-timed-out'      => 'HTTP request timed out.',
+'http-curl-error'     => 'Error fetching URL: $1',
+'http-bad-status'     => 'There was a problem during the HTTP request: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6'       => 'Could not reach URL',
@@ -2415,17 +2512,21 @@ You may want to try at a less busy time.',
 'upload_source_file' => '(a file on your computer)',
 
 # Special:ListFiles
-'listfiles-summary'     => 'This special page shows all uploaded files.',
-'listfiles_search_for'  => 'Search for media name:',
-'imgfile'               => 'file',
-'listfiles'             => 'File list',
-'listfiles_thumb'       => 'Thumbnail',
-'listfiles_date'        => 'Date',
-'listfiles_name'        => 'Name',
-'listfiles_user'        => 'User',
-'listfiles_size'        => 'Size',
-'listfiles_description' => 'Description',
-'listfiles_count'       => 'Versions',
+'listfiles-summary'           => 'This special page shows all uploaded files.',
+'listfiles_search_for'        => 'Search for media name:',
+'imgfile'                     => 'file',
+'listfiles'                   => 'File list',
+'listfiles_thumb'             => 'Thumbnail',
+'listfiles_date'              => 'Date',
+'listfiles_name'              => 'Name',
+'listfiles_user'              => 'User',
+'listfiles_size'              => 'Size',
+'listfiles_description'       => 'Description',
+'listfiles_count'             => 'Versions',
+'listfiles-show-all'          => 'Include old versions of images',
+'listfiles-latestversion'     => 'Current version',
+'listfiles-latestversion-yes' => 'Yes',
+'listfiles-latestversion-no'  => 'No',
 
 # File description page
 'file-anchor-link'                  => 'File',
@@ -2529,6 +2630,13 @@ Remember to check for other links to the templates before deleting them.',
 'randompage-nopages' => 'There are no pages in the following {{PLURAL:$2|namespace|namespaces}}: $1.',
 'randompage-url'     => 'Special:Random', # do not translate or duplicate this message to other languages
 
+# Random page in category
+'randomincategory'                       => 'Random page in category',
+'randomincategory-invalidcategory'       => '"$1" is not a valid category name.',
+'randomincategory-nopages'               => 'There are no pages in the [[:Category:$1|$1]] category.',
+'randomincategory-selectcategory'        => 'Get random page from category: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Go',
+
 # Random redirect
 'randomredirect'         => 'Random redirect',
 'randomredirect-nopages' => 'There are no redirects in the namespace "$1".',
@@ -2556,19 +2664,14 @@ Remember to check for other links to the templates before deleting them.',
 'statistics-mostpopular'       => 'Most viewed pages',
 'statistics-footer'            => '', # do not translate or duplicate this message to other languages
 
-'disambiguations'         => 'Pages linking to disambiguation pages',
-'disambiguations-summary' => '', # do not translate or duplicate this message to other languages
-'disambiguationspage'     => 'Template:disambig',
-'disambiguations-text'    => "The following pages contain at least one link to a '''disambiguation page'''.
-They may have to link to a more appropriate page instead.<br />
-A page is treated as a disambiguation page if it uses a template that is linked from [[MediaWiki:Disambiguationspage]].",
-
-'pageswithprop'         => 'Pages with a page property',
-'pageswithprop-summary' => '', # do not translate or duplicate this message to other languages
-'pageswithprop-legend'  => 'Pages with a page property',
-'pageswithprop-text'    => 'This page lists pages that use a particular page property.',
-'pageswithprop-prop'    => 'Property name:',
-'pageswithprop-submit'  => 'Go',
+'pageswithprop'                   => 'Pages with a page property',
+'pageswithprop-summary'           => '', # do not translate or duplicate this message to other languages
+'pageswithprop-legend'            => 'Pages with a page property',
+'pageswithprop-text'              => 'This page lists pages that use a particular page property.',
+'pageswithprop-prop'              => 'Property name:',
+'pageswithprop-submit'            => 'Go',
+'pageswithprop-prophidden-long'   => 'long text property value hidden ($1)',
+'pageswithprop-prophidden-binary' => 'binary property value hidden ($1)',
 
 'doubleredirects'                   => 'Double redirects',
 'doubleredirects-summary'           => '', # do not translate or duplicate this message to other languages
@@ -2650,6 +2753,7 @@ It now redirects to [[$2]].',
 'prefixindex'                     => 'All pages with prefix',
 'prefixindex-namespace'           => 'All pages with prefix ($1 namespace)',
 'prefixindex-summary'             => '', # do not translate or duplicate this message to other languages
+'prefixindex-strip'               => 'Strip prefix in list',
 'shortpages'                      => 'Short pages',
 'shortpages-summary'              => '', # do not translate or duplicate this message to other languages
 'longpages'                       => 'Long pages',
@@ -2671,6 +2775,7 @@ It now redirects to [[$2]].',
 'listusers-summary'               => '', # do not translate or duplicate this message to other languages
 'listusers-editsonly'             => 'Show only users with edits',
 'listusers-creationsort'          => 'Sort by creation date',
+'listusers-desc'                  => 'Sort in descending order',
 'usereditcount'                   => '$1 {{PLURAL:$1|edit|edits}}',
 'usercreated'                     => '{{GENDER:$3|Created}} on $1 at $2',
 'newpages'                        => 'New pages',
@@ -2866,10 +2971,9 @@ Future changes to this page and its associated talk page will be listed there.',
 'unwatchthispage'      => 'Stop watching',
 'notanarticle'         => 'Not a content page',
 'notvisiblerev'        => 'The last revision by a different user has been deleted',
-'watchnochange'        => 'None of your watched items were edited in the time period displayed.',
 'watchlist-details'    => '{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not counting talk pages.',
-'wlheader-enotif'      => '* Email notification is enabled.',
-'wlheader-showupdated' => "* Pages that have been changed since you last visited them are shown in '''bold'''",
+'wlheader-enotif'      => 'Email notification is enabled.',
+'wlheader-showupdated' => "Pages that have been changed since you last visited them are shown in '''bold'''.",
 'watchmethod-recent'   => 'checking recent edits for watched pages',
 'watchmethod-list'     => 'checking watched pages for recent edits',
 'watchlistcontains'    => 'Your watchlist contains $1 {{PLURAL:$1|page|pages}}.',
@@ -2909,9 +3013,9 @@ Contact the editor:
 mail: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-There will be no other notifications in case of further activity unless you visit this page. You could also reset the notification flags for all your watched pages on your watchlist.
+There will be no other notifications in case of further activity unless you visit this page while logged in. You could also reset the notification flags for all your watched pages on your watchlist.
 
-			 Your friendly {{SITENAME}} notification system
+Your friendly {{SITENAME}} notification system
 
 --
 To change your email notification settings, visit
@@ -3129,7 +3233,7 @@ $1',
 'contributions-summary' => '', # do not translate or duplicate this message to other languages
 'contributions-title'   => 'User contributions for $1',
 'mycontris'             => 'Contributions',
-'contribsub2'           => 'For $1 ($2)',
+'contribsub2'           => 'For {{GENDER:$3|$1}} ($2)',
 'nocontribs'            => 'No changes were found matching these criteria.',
 'uctop'                 => '(current)',
 'month'                 => 'From month (and earlier):',
@@ -3295,16 +3399,14 @@ See the [[Special:BlockList|block list]] for the list of currently operational b
 It is, however, blocked as part of the range $2, which can be unblocked.',
 'ip_range_invalid'                => 'Invalid IP range.',
 'ip_range_toolarge'               => 'Range blocks larger than /$1 are not allowed.',
-'blockme'                         => 'Block me',
 'proxyblocker'                    => 'Proxy blocker',
-'proxyblocker-disabled'           => 'This function is disabled.',
 'proxyblockreason'                => 'Your IP address has been blocked because it is an open proxy.
 Please contact your Internet service provider or technical support of your organization and inform them of this serious security problem.',
-'proxyblocksuccess'               => 'Done.',
 'sorbs'                           => 'DNSBL', # only translate this message to other languages if you have to change it
 'sorbsreason'                     => 'Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.',
 'sorbs_create_account_reason'     => 'Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.
 You cannot create an account',
+'xffblockreason'                  => 'An IP address present in the X-Forwarded-For header, either yours or that of a proxy server you are using, has been blocked. The original block reason was: $1',
 'cant-block-while-blocked'        => 'You cannot block other users while you are blocked.',
 'cant-see-hidden-user'            => "The user you are trying to block has already been blocked and hidden.
 Since you do not have the hideuser right, you cannot see or edit the user's block.",
@@ -3400,6 +3502,7 @@ Please merge them manually.'''",
 'movesubpagetext'              => 'This page has $1 {{PLURAL:$1|subpage|subpages}} shown below.',
 'movenosubpage'                => 'This page has no subpages.',
 'movereason'                   => 'Reason:',
+'move-redirect-text'           => '', # do not translate or duplicate this message to other languages
 'revertmove'                   => 'revert',
 'delete_and_move'              => 'Delete and move',
 'delete_and_move_text'         => '== Deletion required ==
@@ -3459,7 +3562,7 @@ In the latter case you can also use a link, for example [[{{#Special:Export}}/{{
 'allmessagesdefault'            => 'Default message text',
 'allmessagescurrent'            => 'Current message text',
 'allmessagestext'               => 'This is a list of system messages available in the MediaWiki namespace.
-Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
+Please visit [https://www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
 'allmessagesnotsupportedDB'     => "This page cannot be used because '''\$wgUseDatabaseMessages''' has been disabled.",
 'allmessages-filter-legend'     => 'Filter',
 'allmessages-filter'            => 'Filter by customization state:',
@@ -3474,6 +3577,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'thumbnail-more'           => 'Enlarge',
 'filemissing'              => 'File missing',
 'thumbnail_error'          => 'Error creating thumbnail: $1',
+'thumbnail_error_remote'   => 'Error message from $1:
+$2',
 'djvu_page_error'          => 'DjVu page out of range',
 'djvu_no_xml'              => 'Unable to fetch XML for DjVu file',
 'thumbnail-temp-create'    => 'Unable to create temporary thumbnail file',
@@ -3700,17 +3805,11 @@ You can view its source',
 
 # Stylesheets
 'common.css'              => '/* CSS placed here will be applied to all skins */', # only translate this message to other languages if you have to change it
-'standard.css'            => '/* CSS placed here will affect users of the Standard skin */', # only translate this message to other languages if you have to change it
-'nostalgia.css'           => '/* CSS placed here will affect users of the Nostalgia skin */', # only translate this message to other languages if you have to change it
 'cologneblue.css'         => '/* CSS placed here will affect users of the Cologne Blue skin */', # only translate this message to other languages if you have to change it
 'monobook.css'            => '/* CSS placed here will affect users of the MonoBook skin */', # only translate this message to other languages if you have to change it
-'myskin.css'              => '/* CSS placed here will affect users of the MySkin skin */', # only translate this message to other languages if you have to change it
-'chick.css'               => '/* CSS placed here will affect users of the Chick skin */', # only translate this message to other languages if you have to change it
-'simple.css'              => '/* CSS placed here will affect users of the Simple skin */', # only translate this message to other languages if you have to change it
 'modern.css'              => '/* CSS placed here will affect users of the Modern skin */', # only translate this message to other languages if you have to change it
 'vector.css'              => '/* CSS placed here will affect users of the Vector skin */', # only translate this message to other languages if you have to change it
 'print.css'               => '/* CSS placed here will affect the print output */', # only translate this message to other languages if you have to change it
-'handheld.css'            => '/* CSS placed here will affect handheld devices based on the skin configured in $wgHandheldStyle */', # only translate this message to other languages if you have to change it
 'noscript.css'            => '/* CSS placed here will affect users with JavaScript disabled */', # only translate this message to other languages if you have to change it
 'group-autoconfirmed.css' => '/* CSS placed here will affect autoconfirmed users only */', # only translate this message to other languages if you have to change it
 'group-bot.css'           => '/* CSS placed here will affect bots only */', # only translate this message to other languages if you have to change it
@@ -3719,13 +3818,8 @@ You can view its source',
 
 # Scripts
 'common.js'              => '/* Any JavaScript here will be loaded for all users on every page load. */', # only translate this message to other languages if you have to change it
-'standard.js'            => '/* Any JavaScript here will be loaded for users using the Standard skin */', # only translate this message to other languages if you have to change it
-'nostalgia.js'           => '/* Any JavaScript here will be loaded for users using the Nostalgia skin */', # only translate this message to other languages if you have to change it
 'cologneblue.js'         => '/* Any JavaScript here will be loaded for users using the Cologne Blue skin */', # only translate this message to other languages if you have to change it
 'monobook.js'            => '/* Any JavaScript here will be loaded for users using the MonoBook skin */', # only translate this message to other languages if you have to change it
-'myskin.js'              => '/* Any JavaScript here will be loaded for users using the MySkin skin */', # only translate this message to other languages if you have to change it
-'chick.js'               => '/* Any JavaScript here will be loaded for users using the Chick skin */', # only translate this message to other languages if you have to change it
-'simple.js'              => '/* Any JavaScript here will be loaded for users using the Simple skin */', # only translate this message to other languages if you have to change it
 'modern.js'              => '/* Any JavaScript here will be loaded for users using the Modern skin */', # only translate this message to other languages if you have to change it
 'vector.js'              => '/* Any JavaScript here will be loaded for users using the Vector skin */', # only translate this message to other languages if you have to change it
 'group-autoconfirmed.js' => '/* Any JavaScript here will be loaded for autoconfirmed users only */', # only translate this message to other languages if you have to change it
@@ -3757,6 +3851,8 @@ This is probably caused by a link to a blacklisted external site.',
 'spam_reverting'      => 'Reverting to last revision not containing links to $1',
 'spam_blanking'       => 'All revisions contained links to $1, blanking',
 'spam_deleting'       => 'All revisions contained links to $1, deleting',
+'simpleantispam-label' => "Anti-spam check.
+Do '''NOT''' fill this in!",
 
 # Info page
 'pageinfo-header'                 => '-', # do not translate or duplicate this message to other languages
@@ -3808,13 +3904,8 @@ This is probably caused by a link to a blacklisted external site.',
 'pageinfo-category-files'         => 'Number of files',
 
 # Skin names
-'skinname-standard'    => 'Classic', # only translate this message to other languages if you have to change it
-'skinname-nostalgia'   => 'Nostalgia', # only translate this message to other languages if you have to change it
 'skinname-cologneblue' => 'Cologne Blue', # only translate this message to other languages if you have to change it
 'skinname-monobook'    => 'MonoBook', # only translate this message to other languages if you have to change it
-'skinname-myskin'      => 'MySkin', # only translate this message to other languages if you have to change it
-'skinname-chick'       => 'Chick', # only translate this message to other languages if you have to change it
-'skinname-simple'      => 'Simple', # only translate this message to other languages if you have to change it
 'skinname-modern'      => 'Modern', # only translate this message to other languages if you have to change it
 'skinname-vector'      => 'Vector', # only translate this message to other languages if you have to change it
 
@@ -3866,7 +3957,7 @@ By executing it, your system may be compromised.",
 'svg-long-desc'               => 'SVG file, nominally $1 × $2 pixels, file size: $3',
 'svg-long-desc-animated'      => 'Animated SVG file, nominally $1 × $2 pixels, file size: $3',
 'svg-long-error'              => 'Invalid SVG file: $1',
-'show-big-image'              => 'Full resolution',
+'show-big-image'              => 'Original file',
 'show-big-image-preview'      => 'Size of this preview: $1.',
 'show-big-image-other'        => 'Other {{PLURAL:$2|resolution|resolutions}}: $1.',
 'show-big-image-size'         => '$1 × $2 pixels',
@@ -3900,11 +3991,26 @@ By executing it, your system may be compromised.",
 'minutes'        => '{{PLURAL:$1|$1 minute|$1 minutes}}',
 'hours'          => '{{PLURAL:$1|$1 hour|$1 hours}}',
 'days'           => '{{PLURAL:$1|$1 day|$1 days}}',
+'weeks'          => '{{PLURAL:$1|$1 week|$1 weeks}}',
 'months'         => '{{PLURAL:$1|$1 month|$1 months}}',
 'years'          => '{{PLURAL:$1|$1 year|$1 years}}',
 'ago'            => '$1 ago',
 'just-now'       => 'just now',
 
+# Human-readable timestamps
+'hours-ago'    => '$1 {{PLURAL:$1|hour|hours}} ago',
+'minutes-ago'  => '$1 {{PLURAL:$1|minute|minutes}} ago',
+'seconds-ago'  => '$1 {{PLURAL:$1|second|seconds}} ago',
+'monday-at'    => 'Monday at $1',
+'tuesday-at'   => 'Tuesday at $1',
+'wednesday-at' => 'Wednesday at $1',
+'thursday-at'  => 'Thursday at $1',
+'friday-at'    => 'Friday at $1',
+'saturday-at'  => 'Saturday at $1',
+'sunday-at'    => 'Sunday at $1',
+'today-at'     => '$1', # do not translate or duplicate this message to other languages
+'yesterday-at' => 'Yesterday at $1',
+
 # Bad image list
 'bad_image_list' => 'The format is as follows:
 
@@ -3989,7 +4095,7 @@ Others will be hidden by default.
 'metadata-langitem'         => "'''$2:''' $1", # only translate this message to other languages if you have to change it
 'metadata-langitem-default' => '$1', # only translate this message to other languages if you have to change it
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth'                  => 'Width',
 'exif-imagelength'                 => 'Height',
 'exif-bitspersample'               => 'Bits per component',
@@ -4186,7 +4292,7 @@ $4, $5, $6 $7
 $8', # only translate this message to other languages if you have to change it
 'exif-subjectnewscode-value'  => '$2 ($1)', # only translate this message to other languages if you have to change it
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1'     => 'Uncompressed',
 'exif-compression-2'     => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
 'exif-compression-3'     => 'CCITT Group 3 fax encoding',
@@ -4425,7 +4531,7 @@ $8', # only translate this message to other languages if you have to change it
 
 # External editor support
 'edit-externally'      => 'Edit this file using an external application',
-'edit-externally-help' => '(See the [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] for more information)',
+'edit-externally-help' => '(See the [https://www.mediawiki.org/wiki/Manual:External_editors setup instructions] for more information)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'all',
@@ -4534,7 +4640,7 @@ Please confirm that you really want to recreate this page.",
 'semicolon-separator' => ';&#32;', # only translate this message to other languages if you have to change it
 'comma-separator'     => ',&#32;', # only translate this message to other languages if you have to change it
 'colon-separator'     => ':&#32;', # only translate this message to other languages if you have to change it
-'autocomment-prefix'  => '-&#32;', # only translate this message to other languages if you have to change it
+'autocomment-prefix'  => '', # do not translate or duplicate this message to other languages
 'pipe-separator'      => '&#32;|&#32;', # only translate this message to other languages if you have to change it
 'word-separator'      => '&#32;', # only translate this message to other languages if you have to change it
 'ellipsis'            => '...', # only translate this message to other languages if you have to change it
@@ -4732,7 +4838,6 @@ You can also [[Special:EditWatchlist|use the standard editor]].',
 'version-other'                         => 'Other',
 'version-mediahandlers'                 => 'Media handlers',
 'version-hooks'                         => 'Hooks',
-'version-extension-functions'           => 'Extension functions',
 'version-parser-extensiontags'          => 'Parser extension tags',
 'version-parser-function-hooks'         => 'Parser function hooks',
 'version-hook-name'                     => 'Hook name',
@@ -4740,8 +4845,9 @@ You can also [[Special:EditWatchlist|use the standard editor]].',
 'version-version'                       => '(Version $1)',
 'version-svn-revision'                  => '(r$2)', # only translate this message to other languages if you have to change it
 'version-license'                       => 'License',
-'version-poweredby-credits'             => "This wiki is powered by '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-credits'             => "This wiki is powered by '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others'              => 'others',
+'version-poweredby-translators'         => 'translatewiki.net translators',
 'version-credits-summary'               => 'We would like to recognize the following persons for their contribution to [[Special:Version|MediaWiki]].',
 'version-license-info'                  => 'MediaWiki 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 2 of the License, or (at your option) any later version.
 
@@ -4760,12 +4866,18 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
 'version-entrypoints-api-php'           => '[https://www.mediawiki.org/wiki/Manual:api.php api.php]', # do not translate or duplicate this message to other languages
 'version-entrypoints-load-php'          => '[https://www.mediawiki.org/wiki/Manual:load.php load.php]', # do not translate or duplicate this message to other languages
 
-# Special:FilePath
-'filepath'         => 'File path',
-'filepath-page'    => 'File:',
-'filepath-submit'  => 'Go',
-'filepath-summary' => 'This special page returns the complete path for a file.
-Images are shown in full resolution, other file types are started with their associated program directly.',
+# Special:Redirect
+'redirect'            => 'Redirect by file, user, or revision ID',
+'redirect-legend'     => 'Redirect to a file or page',
+'redirect-text'       => '', # do not translate or duplicate this message to other languages
+'redirect-summary'    => 'This special page redirects to a file (given the file name), a page (given a revision ID), or a user page (given a numeric user ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].',
+'redirect-submit'     => 'Go',
+'redirect-lookup'     => 'Lookup:',
+'redirect-value'      => 'Value:',
+'redirect-user'       => 'User ID',
+'redirect-revision'   => 'Page revision',
+'redirect-file'       => 'File name',
+'redirect-not-exists' => 'Value not found',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch'           => 'Search for duplicate files',
@@ -4816,12 +4928,16 @@ Images are shown in full resolution, other file types are started with their ass
 'tags-summary'            => '', # do not translate or duplicate this message to other languages
 'tag-filter'              => '[[Special:Tags|Tag]] filter:',
 'tag-filter-submit'       => 'Filter',
+'tag-list-wrapper'        => '([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)',
 'tags-title'              => 'Tags',
 'tags-intro'              => 'This page lists the tags that the software may mark an edit with, and their meaning.',
 'tags-tag'                => 'Tag name',
 'tags-display-header'     => 'Appearance on change lists',
 'tags-description-header' => 'Full description of meaning',
+'tags-active-header'      => 'Active?',
 'tags-hitcount-header'    => 'Tagged changes',
+'tags-active-yes'         => 'Yes',
+'tags-active-no'          => 'No',
 'tags-edit'               => 'edit',
 'tags-hitcount'           => '$1 {{PLURAL:$1|change|changes}}',
 
@@ -4840,10 +4956,10 @@ Images are shown in full resolution, other file types are started with their ass
 
 # Database error messages
 'dberr-header'      => 'This wiki has a problem',
-'dberr-problems'    => 'Sorry!
-This site is experiencing technical difficulties.',
+'dberr-problems'    => 'Sorry! This site is experiencing technical difficulties.',
 'dberr-again'       => 'Try waiting a few minutes and reloading.',
 'dberr-info'        => '(Cannot contact the database server: $1)',
+'dberr-info-hidden' => '(Cannot contact the database server)',
 'dberr-usegoogle'   => 'You can try searching via Google in the meantime.',
 'dberr-outofdate'   => 'Note that their indexes of our content may be out of date.',
 'dberr-cachederror' => 'This is a cached copy of the requested page, and may not be up to date.',
@@ -4859,6 +4975,9 @@ This site is experiencing technical difficulties.',
 'htmlform-submit'              => 'Submit',
 'htmlform-reset'               => 'Undo changes',
 'htmlform-selectorother-other' => 'Other',
+'htmlform-no'                  => 'No',
+'htmlform-yes'                 => 'Yes',
+'htmlform-chosen-placeholder'  => 'Select an option',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 with full-text search support',
@@ -5001,4 +5120,23 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
 # Image rotation
 'rotate-comment' => 'Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise',
 
+# Limit report
+'limitreport-title'                        => 'Parser profiling data:',
+'limitreport-cputime'                      => 'CPU time usage',
+'limitreport-cputime-value'                => '$1 {{PLURAL:$1|second|seconds}}',
+'limitreport-walltime'                     => 'Real time usage',
+'limitreport-walltime-value'               => '$1 {{PLURAL:$1|second|seconds}}',
+'limitreport-ppvisitednodes'               => 'Preprocessor visited node count',
+'limitreport-ppvisitednodes-value'         => '$1/$2', # only translate this message to other languages if you have to change it
+'limitreport-ppgeneratednodes'             => 'Preprocessor generated node count',
+'limitreport-ppgeneratednodes-value'       => '$1/$2', # only translate this message to other languages if you have to change it
+'limitreport-postexpandincludesize'        => 'Post-expand include size',
+'limitreport-postexpandincludesize-value'  => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize'         => 'Template argument size',
+'limitreport-templateargumentsize-value'   => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth'               => 'Highest expansion depth',
+'limitreport-expansiondepth-value'         => '$1/$2', # only translate this message to other languages if you have to change it
+'limitreport-expensivefunctioncount'       => 'Expensive parser function count',
+'limitreport-expensivefunctioncount-value' => '$1/$2', # only translate this message to other languages if you have to change it
+
 );
diff --git a/languages/messages/MessagesEn_ca.php b/languages/messages/MessagesEn_ca.php
index 5067935e..af3c5ae5 100644
--- a/languages/messages/MessagesEn_ca.php
+++ b/languages/messages/MessagesEn_ca.php
@@ -8,23 +8,10 @@
  * @file
  *
  * @author Dantman
- * @author FrigidNinja
- * @author Shirayuki
  * @author Techman224
  */
 
 $messages = array(
-'talkpagelinktext' => 'Talk',
-'talk' => 'Discussion',
-
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'About {{SITENAME}}',
-'mainpage' => 'Main Page',
-
-'editsection' => 'edit',
-'editsectionhint' => 'Edit section: $1',
-'red-link-title' => '$1 (page does not exist)',
-
 # Special:UploadStash
 'uploadstash-summary' => 'This page provides access to files which are uploaded (or in process of uploading) but are not yet published to the wiki. These files are not visible to anyone but the user who uploaded them.',
 
@@ -33,20 +20,10 @@ $messages = array(
 this action has been cancelled as a precaution against session hijacking.
 Go back to the previous page, reload that page and then try again.',
 
-# Block/unblock
-'ipbreason-dropdown' => '*Common block reasons
-** Inserting false information
-** Removing content from pages
-** Spamming links to external sites
-** Inserting nonsense/gibberish into pages
-** Intimidating behaviour/harassment
-** Abusing multiple accounts
-** Unacceptable username',
-
 # EXIF tags
 'exif-ycbcrcoefficients' => 'Colour space transformation matrix coefficients',
-'exif-colorspace' => 'Colour space',
-'exif-licenseurl' => 'URL for copyright licence',
+'exif-colorspace'        => 'Colour space',
+'exif-licenseurl'        => 'URL for copyright licence',
 
 'exif-subjectdistance-value' => '$1 metres',
 
@@ -70,11 +47,11 @@ Go back to the previous page, reload that page and then try again.',
 
 'exif-ycbcrpositioning-1' => 'Centred',
 
-# Email address confirmation
-'confirmemail_invalidated' => 'Email address confirmation cancelled',
+# E-mail address confirmation
+'confirmemail_invalidated' => 'E-mail address confirmation cancelled',
 
 # Special:Version
-'version-license' => 'Licence',
+'version-license'      => 'Licence',
 'version-license-info' => 'MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation; either version 2 of the Licence, or (at your option) any later version.
 
 MediaWiki 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 Licence for more details.
diff --git a/languages/messages/MessagesEn_gb.php b/languages/messages/MessagesEn_gb.php
index 1429a54e..c38fd296 100644
--- a/languages/messages/MessagesEn_gb.php
+++ b/languages/messages/MessagesEn_gb.php
@@ -7,14 +7,11 @@
  * @ingroup Language
  * @file
  *
- * @author Amire80
  * @author Dantman
  * @author Fitoschido
  * @author Hazard-SJ
  * @author Jon Harald Søby
- * @author Lloffiwr
  * @author Reedy
- * @author Shirayuki
  * @author The Evil IP address
  */
 
@@ -27,10 +24,10 @@ $specialPageAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-watchcreations' => 'Add pages I create and files I upload to my watchlist',
-'tog-watchdefault' => 'Add pages and files I edit to my watchlist',
-'tog-watchmoves' => 'Add pages and files I move to my watchlist',
-'tog-watchdeletion' => 'Add pages and files I delete to my watchlist',
+'tog-watchcreations' => 'Add pages I create to my watchlist',
+'tog-watchdefault' => 'Add pages I edit to my watchlist',
+'tog-watchmoves' => 'Add pages I move to my watchlist',
+'tog-watchdeletion' => 'Add pages I delete to my watchlist',
 'tog-showjumplinks' => 'Enable ‘jump to’ accessibility links',
 
 # Categories related messages
@@ -45,9 +42,9 @@ $messages = array(
 'dberrortext' => 'A database query syntax error has occurred.
 This may indicate a bug in the software.
 The last attempted database query was:
-<blockquote><code>$1</code></blockquote>
-from within function ‘<code>$2</code>.’
-Database returned error ‘<samp>$3: $4</samp>.’',
+<blockquote><tt>$1</tt></blockquote>
+from within function ‘<tt>$2</tt>.’
+Database returned error ‘<tt>$3: $4</tt>.’',
 'dberrortextcl' => 'A database query syntax error has occurred.
 The last attempted database query was:
 ‘$1’
@@ -70,17 +67,9 @@ Please report this to an [[Special:ListUsers/sysop|administrator]], making note
 'unexpected' => 'Unexpected value: ‘$1’=‘$2’.',
 'cannotdelete' => 'The page or file ‘$1’ could not be deleted.
 It may have already been deleted by someone else.',
-'protectedinterface' => 'This page provides interface text for the software on this wiki, and is protected to prevent abuse.
-To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.',
-'editinginterface' => "'''Warning:''' You are editing a page which is used to provide interface text for the software.
-Changes to this page will affect the appearance of the user interface for other users on this wiki.
-To add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
 'cascadeprotected' => 'This page has been protected from editing, because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the ‘cascading’ option turned on:
 $2',
 
-# Preferences page
-'prefs-i18n' => 'Internationalisation',
-
 # Miscellaneous special pages
 'uncategorizedpages' => 'Uncategorised pages',
 'uncategorizedcategories' => 'Uncategorised categories',
@@ -96,24 +85,6 @@ Go back to the previous page, reload that page and then try again.',
 'blockiptext' => 'Use the form below to block write access from a specific IP address or username.
 This should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].
 Fill in a specific reason below (for example, citing particular pages that were vandalised).',
-'ipbreason-dropdown' => '*Common block reasons
-** Inserting false information
-** Removing content from pages
-** Spamming links to external sites
-** Inserting nonsense/gibberish into pages
-** Intimidating behaviour/harassment
-** Abusing multiple accounts
-** Unacceptable username',
-'proxyblockreason' => 'Your IP address has been blocked because it is an open proxy.
-Please contact your Internet service provider or technical support of your organisation and inform them of this serious security problem.',
-
-# Namespace 8 related
-'allmessagestext' => 'This is a list of system messages available in the MediaWiki namespace.
-Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
-'allmessages-filter' => 'Filter by customisation state:',
-
-# Special:Import
-'import-error-unserialize' => 'Revision $2 of page "$1" could not be unserialised. The revision was reported to use content model $3 serialised as $4.',
 
 # Metadata
 'metadata-help' => 'This file contains additional information, probably added from the digital camera or scanner used to create or digitise it.
@@ -125,7 +96,6 @@ If the file has been modified from its original state, some details may not full
 'exif-datetimedigitized' => 'Date and time of digitising',
 'exif-subsectimedigitized' => 'DateTimeDigitised subseconds',
 'exif-exposureprogram' => 'Exposure programme',
-'exif-organisationinimage' => 'Organisation depicted',
 
 'exif-exposureprogram-2' => 'Normal programme',
 'exif-exposureprogram-5' => 'Creative programme (biased toward depth of field)',
@@ -133,8 +103,6 @@ If the file has been modified from its original state, some details may not full
 
 'exif-subjectdistance-value' => '$1 metres',
 
-'exif-meteringmode-2' => 'Centre weighted average',
-
 'exif-sensingmethod-2' => 'One-chip colour area sensor',
 'exif-sensingmethod-3' => 'Two-chip colour area sensor',
 'exif-sensingmethod-4' => 'Three-chip colour area sensor',
@@ -151,22 +119,14 @@ If the file has been modified from its original state, some details may not full
 # Pseudotags used for GPSDestDistanceRef
 'exif-gpsdestdistance-k' => 'Kilometres',
 
-'exif-ycbcrpositioning-1' => 'Centred',
-
-'exif-iimcategory-lab' => 'Labour',
-
-# Email address confirmation
+# E-mail address confirmation
 'confirmemail_invalidated' => 'E-mail address confirmation cancelled',
 
 # Special:Version
-'version-credits-summary' => 'We would like to recognise the following persons for their contribution to [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation; either version 2 of the Licence, or (at your option) any later version.
 
 MediaWiki 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 Licence for more details.
 
 You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public Licence] along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].',
 
-# Feedback
-'feedback-error1' => 'Error: Unrecognised result from API',
-
 );
diff --git a/languages/messages/MessagesEo.php b/languages/messages/MessagesEo.php
index bd77a006..2144c401 100644
--- a/languages/messages/MessagesEo.php
+++ b/languages/messages/MessagesEo.php
@@ -29,6 +29,7 @@
  * @author Michawiki
  * @author Mihxil
  * @author MinuteElectron
+ * @author Nemo bis
  * @author Objectivesea
  * @author Omnipaedista
  * @author Pedroca cerebral
@@ -80,11 +81,17 @@ $namespaceAliases = array(
 	'Kategoria_diskuto'    => NS_CATEGORY_TALK,
 );
 
+$namespaceGenderAliases = array(
+	NS_USER => array( 'male' => 'Uzanto', 'female' => 'Uzantino' ),
+	NS_USER_TALK => array( 'male' => 'Uzanto-Diskuto', 'female' => 'Uzantino-Diskuto' ),
+);
+
 $specialPageAliases = array(
 	'Activeusers'               => array( 'Aktivaj_uzantoj' ),
 	'Allmessages'               => array( 'Ĉiuj_mesaĝoj' ),
 	'Allpages'                  => array( 'Ĉiuj_paĝoj' ),
 	'Ancientpages'              => array( 'Malnovaj_paĝoj' ),
+	'Badtitle'                  => array( 'Malbona_titolo' ),
 	'Blankpage'                 => array( 'Malplena_paĝo' ),
 	'Block'                     => array( 'Forbari_IP-adreson' ),
 	'Blockme'                   => array( 'Forbari_min' ),
@@ -93,7 +100,7 @@ $specialPageAliases = array(
 	'Categories'                => array( 'Kategorioj' ),
 	'ChangeEmail'               => array( 'Ŝanĝi_retpoŝton' ),
 	'ChangePassword'            => array( 'Ŝanĝi_pasvorton' ),
-	'ComparePages'              => array( 'Komparu_paĝojn' ),
+	'ComparePages'              => array( 'Kompari_paĝojn', 'Komparu_paĝojn' ),
 	'Confirmemail'              => array( 'Konfirmi_per_retpoŝto' ),
 	'Contributions'             => array( 'Kontribuoj' ),
 	'CreateAccount'             => array( 'Krei_konton' ),
@@ -101,27 +108,27 @@ $specialPageAliases = array(
 	'DeletedContributions'      => array( 'Forigitaj_kontribuoj' ),
 	'Disambiguations'           => array( 'Apartigiloj' ),
 	'DoubleRedirects'           => array( 'Duoblaj_alidirektiloj' ),
-	'EditWatchlist'             => array( 'Redakti_atenatron' ),
+	'EditWatchlist'             => array( 'Redakti_atentaron' ),
 	'Emailuser'                 => array( 'Retpoŝti_uzanton' ),
-	'Export'                    => array( 'Eksporti' ),
+	'Export'                    => array( 'Elporti', 'Eksporti' ),
 	'Fewestrevisions'           => array( 'Plej_malmultaj_revizioj' ),
 	'FileDuplicateSearch'       => array( 'Serĉi_pri_duoblaj_dosieroj' ),
-	'Filepath'                  => array( 'Dosiero-pado' ),
-	'Import'                    => array( 'Importi' ),
+	'Filepath'                  => array( 'Pado_de_dosiero', 'Dosiero-pado' ),
+	'Import'                    => array( 'Enporti', 'Importi' ),
 	'Invalidateemail'           => array( 'Malvalidigi_retpoŝton' ),
 	'BlockList'                 => array( 'Forbarlisto_de_IP-adresoj', 'IP-adresa_forbarlisto' ),
 	'LinkSearch'                => array( 'Serĉi_ligilon' ),
 	'Listadmins'                => array( 'Listigi_administrantojn' ),
 	'Listbots'                  => array( 'Listigi_robotojn' ),
-	'Listfiles'                 => array( 'Bildolisto' ),
+	'Listfiles'                 => array( 'Listigi_dosierojn', 'Listigi_bildojn', 'Bildolisto' ),
 	'Listgrouprights'           => array( 'Gruprajtoj_de_uzantoj' ),
-	'Listredirects'             => array( 'Listigi_alidirektojn' ),
+	'Listredirects'             => array( 'Listigi_alidirektilojn', 'Listigi_alidirektojn' ),
 	'Listusers'                 => array( 'Listo_de_uzantoj' ),
 	'Lockdb'                    => array( 'Ŝlosi_datumbazon' ),
 	'Log'                       => array( 'Protokolo', 'Protokoloj' ),
 	'Lonelypages'               => array( 'Neligitaj_paĝoj' ),
 	'Longpages'                 => array( 'Longaj_paĝoj' ),
-	'MergeHistory'              => array( 'Kunigi_historion' ),
+	'MergeHistory'              => array( 'Unuigi_kronologion', 'Kunigi_kronologion', 'Kunigi_historion' ),
 	'MIMEsearch'                => array( 'MIME-Serĉo' ),
 	'Mostcategories'            => array( 'Plej_multaj_kategorioj' ),
 	'Mostimages'                => array( 'Plej_ligitaj_bildoj' ),
@@ -131,7 +138,7 @@ $specialPageAliases = array(
 	'Mostrevisions'             => array( 'Plej_multaj_revizioj' ),
 	'Movepage'                  => array( 'Alinomigi_paĝon' ),
 	'Mycontributions'           => array( 'Miaj_kontribuoj', 'MiajKontribuoj' ),
-	'Mypage'                    => array( 'MiaPaĝo', 'Mia_paĝo' ),
+	'Mypage'                    => array( 'Mia_paĝo', 'MiaPaĝo' ),
 	'Mytalk'                    => array( 'Mia_diskutpaĝo', 'MiaDiskutpaĝo' ),
 	'Myuploads'                 => array( 'Miaj_alŝutaĵoj' ),
 	'Newimages'                 => array( 'Novaj_bildoj' ),
@@ -144,7 +151,7 @@ $specialPageAliases = array(
 	'Protectedpages'            => array( 'Protektitaj_paĝoj' ),
 	'Protectedtitles'           => array( 'Protektitaj_titoloj' ),
 	'Randompage'                => array( 'Hazarda_paĝo' ),
-	'Randomredirect'            => array( 'Hazarda_alidirekto' ),
+	'Randomredirect'            => array( 'Hazarda_alidirektilo', 'Hazarda_alidirekto' ),
 	'Recentchanges'             => array( 'Lastaj_ŝanĝoj' ),
 	'Recentchangeslinked'       => array( 'Rilataj_ŝanĝoj' ),
 	'Revisiondelete'            => array( 'Forigi_revizion' ),
@@ -179,7 +186,7 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-	'redirect'                  => array( '0', '#ALIDIREKTU', '#ALIDIREKTI', '#AL', '#REDIRECT' ),
+	'redirect'                  => array( '0', '#ALIDIREKTI', '#ALIDIREKTU', '#AL', '#REDIRECT' ),
 	'notoc'                     => array( '0', '__NI__', '__NEINDEKSO__', '__NT__', '__NOTOC__' ),
 	'nogallery'                 => array( '0', '__NG__', '__SENBILDARO__', '__SB__', '__SG__', '__SENGALERIO__', '__NOGALLERY__' ),
 	'forcetoc'                  => array( '0', '__FI__', '__FORTUINDEKSON__', '__FT__', '__FORCETOC__' ),
@@ -218,6 +225,7 @@ $magicWords = array(
 	'pagenamee'                 => array( '1', 'PAĜONOMOO', 'PAGXONOMOO', 'PAĜNOMOO', 'PAGXNOMOO', 'PAGENAMEE' ),
 	'namespace'                 => array( '1', 'NOMSPACO', 'NAMESPACE' ),
 	'namespacee'                => array( '1', 'NOMSPACOO', 'NAMESPACEE' ),
+	'namespacenumber'           => array( '1', 'NUMERODENOMSPACO', 'NOMSPACNUMERO', 'NAMESPACENUMBER' ),
 	'talkspace'                 => array( '1', 'DISKUTNOMSPACO', 'TALKSPACE' ),
 	'talkspacee'                => array( '1', 'DISKUTNOMSPACOO', 'TALKSPACEE' ),
 	'fullpagename'              => array( '1', 'TUTAPAĜONOMO', 'TUTAPAGXONOMO', 'TUTAPAĜNOMO', 'TUTAPAGXNOMO', 'FULLPAGENAME' ),
@@ -253,12 +261,14 @@ $magicWords = array(
 	'img_text_bottom'           => array( '1', 'suba-teksto', 'text-bottom' ),
 	'img_link'                  => array( '1', 'ligilo=$1', 'link=$1' ),
 	'img_alt'                   => array( '1', 'alternative=$1', 'alt=$1' ),
+	'img_class'                 => array( '1', 'klaso=$1', 'class=$1' ),
 	'int'                       => array( '0', 'ENE:', 'INT:' ),
 	'sitename'                  => array( '1', 'TTT-NOMO', 'RETPAĜNOMO', 'RETPAGXNOMO', 'RETEJNOMO', 'SITENAME' ),
 	'nse'                       => array( '0', 'NSS:', 'NSO:', 'NSE:' ),
 	'localurl'                  => array( '0', 'LOKATTT:', 'LOCALURL:' ),
 	'localurle'                 => array( '0', 'LOKATTTT:', 'LOCALURLE:' ),
 	'articlepath'               => array( '0', 'ARTIKOLAPADO', 'ARTIKOLAVOJO', 'ARTICLEPATH' ),
+	'pageid'                    => array( '0', 'IDENTIGILODEPAĜO', 'PAĜID', 'PAGEID' ),
 	'server'                    => array( '0', 'SERVILO', 'SERVER' ),
 	'servername'                => array( '0', 'NOMODESERVILO', 'SERVILANOMO', 'SERVILONOMO', 'SERVERNAME' ),
 	'scriptpath'                => array( '0', 'SKRIPTO-VOJO', 'SKRIPTOVOJO', 'SKRIPTVOJO', 'SCRIPTPATH' ),
@@ -344,10 +354,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Montri la nombron da priatentaj uzantoj',
 'tog-oldsig' => 'Ekzistanta subskribo:',
 'tog-fancysig' => 'Trakti subskribon kiel vikitekston (sen aŭtomata ligo)',
-'tog-externaleditor' => 'Defaŭlte uzi eksteran tekstprilaborilon (nur por ekspertoj, ĉar tio necesigas specialajn agordojn en via komputilo. [//www.mediawiki.org/wiki/Manual:External_editors Pliaj informoj.])',
-'tog-externaldiff' => 'Defaŭlte uzi eksteran ŝanĝmontrilon (nur por ekspertoj, ĉar tio necesigas specialajn agordojn en via komputilo. [//www.mediawiki.org/wiki/Manual:External_editors Pliaj informoj.])',
-'tog-showjumplinks' => 'Ebligi alirligojn "salti al"
-<!-- Bonvolu kontroli ĉu ĝustas la traduko de : Enable "jump to" accessibility links -->',
 'tog-uselivepreview' => 'Uzi tujan antaŭrigardon (per ĜavaSkripto) (Eksperimenta)',
 'tog-forceeditsummary' => 'Averti min kiam mi konservas malplenan redaktoresumon',
 'tog-watchlisthideown' => 'Kaŝi miajn redaktojn de la atentaro',
@@ -360,6 +366,7 @@ $messages = array(
 'tog-diffonly' => 'Ne montri paĝan enhavon sub la ŝanĝoj',
 'tog-showhiddencats' => 'Montri kaŝitajn kategoriojn',
 'tog-norollbackdiff' => 'Preterlasi ŝanĝoelmontron post malfaro',
+'tog-useeditwarning' => 'Averti min kiam mi forlasas redaktan paĝon kun nekonservitaj ŝanĝoj',
 
 'underline-always' => 'Ĉiam',
 'underline-never' => 'Neniam',
@@ -423,6 +430,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Dec',
+'january-date' => '$1-a de januaro',
+'february-date' => '$1-a de februaro',
+'march-date' => '$1-a de marto',
+'april-date' => '$1-a de aprilo',
+'may-date' => '$1-a de majo',
+'june-date' => '$1-a de junio',
+'july-date' => '$1-a de julio',
+'august-date' => '$1-a de aŭgusto',
+'september-date' => '$1-a de septembro',
+'october-date' => '$1-a de oktobro',
+'november-date' => '$1-a de novembro',
+'december-date' => '$1-a de decembro',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorio|Kategorioj}}',
@@ -504,6 +523,7 @@ $messages = array(
 'create-this-page' => 'Krei ĉi tiun paĝon',
 'delete' => 'Forigi',
 'deletethispage' => 'Forigi ĉi tiun paĝon',
+'undeletethispage' => 'Restarigi tiun ĉi paĝon',
 'undelete_short' => 'Malforigi {{PLURAL:$1|redakton|$1 redaktojn}}',
 'viewdeleted_short' => 'Vidi {{PLURAL:$1|unu forigitan redakton|$1 forigitajn redaktojn}}',
 'protect' => 'Protekti',
@@ -547,7 +567,7 @@ $1',
 'pool-queuefull' => 'Atendovico de servilaro estas plena.',
 'pool-errorunknown' => 'Nekonata eraro',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Pri {{SITENAME}}',
 'aboutpage' => 'Project:Enkonduko',
 'copyright' => 'La enhavo estas disponebla laŭ $1.',
@@ -557,7 +577,6 @@ $1',
 'disclaimers' => 'Malgarantio',
 'disclaimerpage' => 'Project:Malgarantia paĝo',
 'edithelp' => 'Helpo pri redaktado',
-'edithelppage' => 'Help:Kiel redakti paĝon',
 'helppage' => 'Help:Enhavo',
 'mainpage' => 'Ĉefpaĝo',
 'mainpage-description' => 'Ĉefpaĝo',
@@ -634,17 +653,6 @@ Listo de validaj specialaj paĝoj estas trovebla ĉe [[Special:SpecialPages|{{in
 # General errors
 'error' => 'Eraro',
 'databaseerror' => 'Datumbaza eraro',
-'dberrortext' => 'Sintakseraro okazis dum informpeto al la datenbazo.
-Ĝi eble indikas misaĵeton en la programaro.
-Jen la plej laste provita informpeto:
-<blockquote><code>$1</code></blockquote>
-el la funkcio "<code>$2</code>".
-La datenbazo liveris eraron "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Sintaksa eraro de la datumbaza informmendo okazis.
-La lasta provita datumbaza informmendo estis:
-"$1"
-el la funkcio "$2".
-Datumbazo liveris la erarmesaĝon "$3: $4".',
 'laggedslavemode' => 'Avertu: la paĝo eble ne enhavas lastatempajn ĝisdatigojn.',
 'readonly' => 'Datumaro ŝlosita, nurlega',
 'enterlockreason' => 'Bonvolu klarigi, kial oni ŝlosas la datumaron, kaj
@@ -702,12 +710,13 @@ Peto: $2',
 'protectedinterface' => 'Ĉi tiu paĝo provizas interfacan tekston por la softvaro, kaj estas ŝlosita por malebligi misuzon.
 Por aldoni aŭ ŝanĝi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekto por provizi tradukojn por MediaWiki.',
 'editinginterface' => "'''Atentu:''' Vi redaktas paĝon, kiu estas uzata kiel interfaca teksto por la programaro. Ŝanĝoj de ĉi tiu teksto povas ŝanĝi aspekton de la interfaco por aliaj uzantoj sur ĉi tiu vikio. Por aldoni aŭ ŝanĝi tradukojn, bonvolu uzi [//translatewiki.net/ translatewiki.net], la MediaWiki-projekton por lingvigaj versioj.",
-'sqlhidden' => '(SQL serĉomendo kaŝita)',
 'cascadeprotected' => 'Ĉi tiu paĝo estas protektita kontraŭ redaktado, ĉar ĝi estas inkludita en la {{PLURAL:$1|sekvan paĝon, kiu|sekvajn paĝojn, kiuj}} estas {{PLURAL:$1|protektata|protektataj}} kun la "kaskada" opcio turnita sur:
 $2',
 'namespaceprotected' => "Vi ne rajtas redakti paĝojn en la '''$1''' nomspaco.",
 'customcssprotected' => 'Vi ne rajtas redakti ĉi tiun CSS-paĝon, ĉar ĝi enhavas personajn alĝustigojn de alia uzanto.',
 'customjsprotected' => 'Vi ne rajtas redakti ĉi tiun JavaScript-paĝon, ĉar ĝi enhavas personajn alĝustigojn de alia uzanto.',
+'mycustomcssprotected' => 'Vi ne havas la rajton redakti tiun ĉi CSS-paĝon.',
+'mycustomjsprotected' => 'Vi ne havas la rajton redakti tiun ĉi JavaScript-paĝon.',
 'ns-specialprotected' => 'Paĝoj en la {{ns:special}} nomspaco ne povas esti redaktataj.',
 'titleprotected' => "Ĉi titolo estas protektita de kreado de [[User:$1|$1]].
 La kialo donata estis ''$2''.",
@@ -733,10 +742,16 @@ Notu ke iuj paĝoj daŭre ŝajnos kvazaŭ vi ankoraŭ estus ensalutinta, ĝis vi
 'welcomecreation-msg' => 'Via konto estas kreita.
 Ne forgesu ŝanĝi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
 'yourname' => 'Salutnomo:',
+'userlogin-yourname' => 'Uzantonomo',
+'userlogin-yourname-ph' => 'Enigu vian uzantonomon',
 'yourpassword' => 'Pasvorto:',
+'userlogin-yourpassword' => 'Pasvorto',
+'userlogin-yourpassword-ph' => 'Enigu vian pasvorton',
 'yourpasswordagain' => 'Retajpu pasvorton',
+'createacct-yourpasswordagain' => 'Konfirmu pasvorton',
 'remembermypassword' => 'Memori mian ensalutadon ĉe ĉi tiu komputilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
-'securelogin-stick-https' => 'Resti konektita al HTTPS post ensalutado',
+'userlogin-remembermypassword' => 'Memoru mian ensaluton',
+'userlogin-signwithsecure' => 'Uzu sekurigitan konekton',
 'yourdomainname' => 'Via domajno',
 'password-change-forbidden' => 'Ve ne povas ŝanĝi pasvortojn en ĉi tiu vikio.',
 'externaldberror' => 'Aŭ estis datenbaza eraro rilate al ekstera aŭtentikigado, aŭ vi ne rajtas ĝisdatigi vian eksteran konton.',
@@ -748,14 +763,34 @@ Ne forgesu ŝanĝi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
 'logout' => 'Elsaluti',
 'userlogout' => 'Elsaluti',
 'notloggedin' => 'Ne ensalutinta',
+'userlogin-noaccount' => 'Ĉu vi ne havas konton?',
+'userlogin-joinproject' => 'Aliĝu al {{SITENAME}}',
 'nologin' => 'Ĉu vi ne havas konton? $1.',
 'nologinlink' => 'Krei konton',
 'createaccount' => 'Krei novan konton',
 'gotaccount' => "Ĉu vi jam havas konton? '''$1'''.",
 'gotaccountlink' => 'Ensaluti',
 'userlogin-resetlink' => 'Ĉu vi forgesis ensalutajn detalojn?',
+'userlogin-resetpassword-link' => 'Restarigu vian pasvorton',
+'helplogin-url' => 'Help:Ensalutado',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Helpo pri ensalutado]]',
+'createacct-join' => 'Suben enigu informojn pri vi',
+'createacct-emailrequired' => 'Retpoŝta adreso',
+'createacct-emailoptional' => 'Retpoŝta adreso (nedeviga)',
+'createacct-email-ph' => 'Enigu vian retpoŝtan adreson',
 'createaccountmail' => 'Uzi provizoran hazardsignan pasvorton kaj sendi ĝin al la retpoŝto suben',
+'createacct-realname' => 'Vera nomo (nedeviga)',
 'createaccountreason' => 'Kialo:',
+'createacct-reason' => 'Kialo',
+'createacct-reason-ph' => 'Kial vi kreas plian konton',
+'createacct-captcha' => 'Sekureca kontrolo',
+'createacct-imgcaptcha-ph' => 'Entajpu la supran tekston',
+'createacct-submit' => 'Krei konton',
+'createacct-another-submit' => 'Krei alian konton',
+'createacct-benefit-heading' => '{{SITENAME}} estas kreata de homoj kiel vi.',
+'createacct-benefit-body1' => '{{PLURAL:$1|redakto|redaktoj}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|paĝo|paĝoj}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|lasta kontribuanto|lastaj kontribuantoj}}',
 'badretype' => 'La pasvortojn kiujn vi tajpis ne egalas.',
 'userexists' => 'Salutnomo enigita jam estas uzata.
 Bonvolu elekti alian nomon.',
@@ -817,7 +852,7 @@ Enigi bone formatita adreso aŭ malplenigi tiun kampon.',
 
 Vi povas ignori ĉi mesaĝon, se ĉi konto estis kreita erare.',
 'usernamehasherror' => 'Salutnomo ne povas enhavi kriphaketaĵajn signojn',
-'login-throttled' => 'Vi tro ofte provis eniri la pasvorton por ĉi tiu konto.
+'login-throttled' => 'Vi tro ofte provis ensaluti.
 Bonvolu ĝisatendi antaŭ retrovi.',
 'login-abort-generic' => 'Via ensaluto malsukcesis - Ĉesigita',
 'loginlanguagelabel' => 'Lingvo: $1',
@@ -837,7 +872,7 @@ Bonvolu ĝisatendi antaŭ retrovi.',
 'newpassword' => 'Nova pasvorto',
 'retypenew' => 'Retajpi novan pasvorton',
 'resetpass_submit' => 'Fari pasvorton kaj ensaluti',
-'resetpass_success' => 'Via pasvorto estis ŝanĝita sukcese! Nun vi estos ensalutata.',
+'changepassword-success' => 'Via pasvorto estis sukcese ŝanĝita! Nun ensalutanta vin...',
 'resetpass_forbidden' => 'Pasvortoj ne estas ŝanĝeblaj',
 'resetpass-no-info' => 'Vi devas ensaluti por atingi ĉi tiun paĝon rekte.',
 'resetpass-submit-loggedin' => 'Ŝanĝi pasvorton',
@@ -849,10 +884,9 @@ Vi eble jam ŝanĝis vian pasvorton aŭ petis novan provizoran pasvorton.',
 
 # Special:PasswordReset
 'passwordreset' => 'Restarigo de pasvorto',
-'passwordreset-text' => 'Plenigu ĉi tiun formularon por renovigi vian pasvorton.',
 'passwordreset-legend' => 'Refari pasvorton',
 'passwordreset-disabled' => 'Pasvortaj restarigoj estis malŝaltitaj en ĉi tiu vikio.',
-'passwordreset-pretext' => '{{PLURAL:$1||Enigi unu el la jenaj datenoj}}',
+'passwordreset-emaildisabled' => 'Retpoŝtaj funkcioj estas malfunkciigitaj en tiu ĉi vikio.',
 'passwordreset-username' => 'Salutnomo:',
 'passwordreset-domain' => 'Domajno:',
 'passwordreset-capture' => 'Vidi la rezultan retpoŝton?',
@@ -881,7 +915,7 @@ aŭ se vi memoris vian originalan pasvorton, kaj vi ne plu volas ŝanĝi
 Provizora pasvorto: $2',
 'passwordreset-emailsent' => 'Renovigita pasvorto estis retpoŝte sendita.',
 'passwordreset-emailsent-capture' => 'Retpoŝto kun renovigita pasvorto estis sendita, kiu estas montrata sube.',
-'passwordreset-emailerror-capture' => 'Memoriga retpoŝto estis generita, montrata sube, sed sendado al uzanto malsukcesis: $1',
+'passwordreset-emailerror-capture' => 'Retpoŝto kun renovigita pasvorto estis generita, montrata sube, sed sendado al uzanto malsukcesis: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ŝanĝi retpoŝtadreson',
@@ -1094,12 +1128,15 @@ Jen la protokolo pri forigado kaj alinomigado por via referenco.',
 Verŝajne ĝi estis forigita.',
 'edit-conflict' => 'Redakto-konflikto.',
 'edit-no-change' => 'Via redakto estis ignorita, ĉar neniu ŝanĝo estis farita al la teksto.',
+'postedit-confirmation' => 'Via redakto estis konservita.',
 'edit-already-exists' => 'Ne eblis krei novan paĝon.
 Ĝi jam ekzistas.',
 'defaultmessagetext' => 'Defaŭlta teksto',
 'content-failed-to-parse' => 'Oni malsukcesis analizi $2-entenon laŭ la $1-modelo: $3',
 'invalid-content-data' => 'Enhavo estas malvalida',
 'content-not-allowed-here' => 'Enhavo de $1 ne estas permesita en paĝo [[$2]]',
+'editwarning-warning' => 'Forlasante ĉi tiun paĝon kaŭzos al vi perdi iun ajn ŝanĝojn kiujn vi faris.
+Se vi ensalutas, vi povas malŝalti ĉi tiun averton en la sekcio "{{int:prefs-editing}}" de viaj preferoj.',
 
 # Content models
 'content-model-wikitext' => 'vikiteksto',
@@ -1313,6 +1350,7 @@ Certigu ke ĉi tiu ŝanĝo tenos kontinuecon de la historia paĝo.',
 'compareselectedversions' => 'Kompari la elektitajn versiojn',
 'showhideselectedversions' => 'Montri/kaŝi elektitajn versiojn',
 'editundo' => 'malfari',
+'diff-empty' => '(Neniu diferenco)',
 'diff-multi' => '({{PLURAL:$1|Unu intermeza versio|$1 intermezaj versioj}} de {{PLURAL:$2|unu uzanto|$2 uzantoj}} ne estas {{PLURAL:$1|montrata|montrataj}}.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Unu intermeza versio|$1 intermezaj versioj}} de pli ol {{PLURAL:$2|unu uzanto|$2 uzantoj}} ne estas {{PLURAL:$1|montrata|montrataj}}.)',
 'difference-missing-revision' => '{{PLURAL:$2|Unu revizio|$2 revizioj}} de ĉi tiu malsameco ($1) ne {{PLURAL:$2|estis|estis}} trovebla.
@@ -1340,7 +1378,6 @@ Detaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'searchmenu-legend' => 'Serĉaj opcioj',
 'searchmenu-exists' => "'''Estas paĝo nomita \"[[:\$1]]\" en ĉi tiu vikio'''",
 'searchmenu-new' => "'''Krei la paĝon \"[[:\$1]]\" en ĉi tiu vikio!'''",
-'searchhelp-url' => 'Help:Enhavo',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Traserĉi paĝojn kun ĉi tiu prefikso]]',
 'searchprofile-articles' => 'Enhavaj paĝoj',
 'searchprofile-project' => 'Paĝoj pri Helpo kaj Projektoj',
@@ -1383,15 +1420,7 @@ Provu prefiksi vian mendon kun ''all:'' por serĉi ĉiun enhavon (inkluzivante d
 'search-external' => 'Ekstera serĉo',
 'searchdisabled' => '<p>Oni provizore malŝaltis serĉadon per la plenteksta
 indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> aŭ per <i>jahu!</i>:</p>',
-
-# Quickbar
-'qbsettings' => 'Preferoj pri ilaro',
-'qbsettings-none' => 'Neniu',
-'qbsettings-fixedleft' => 'Fiksiĝas maldekstre',
-'qbsettings-fixedright' => 'Fiksiĝas dekstre',
-'qbsettings-floatingleft' => 'Ŝvebas maldekstre',
-'qbsettings-floatingright' => 'Ŝvebas dekstre',
-'qbsettings-directionality' => 'Fiksita, laŭ la teksto-direkteco de via lingvo',
+'search-error' => 'Okazis eraro dum serĉado: $1',
 
 # Preferences page
 'preferences' => 'Preferoj',
@@ -1425,7 +1454,6 @@ indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
 'resetprefs' => 'Forviŝi nekonservitajn ŝanĝojn',
 'restoreprefs' => 'Restarigi ĉiujn defaŭltajn preferojn',
 'prefs-editing' => 'Redaktado',
-'prefs-edit-boxsize' => 'Grandeco de la redakto-kesko.',
 'rows' => 'Linioj:',
 'columns' => 'Kolumnoj:',
 'searchresultshead' => 'Serĉi',
@@ -1436,9 +1464,6 @@ indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
 'recentchangesdays-max' => '(maksimume $1 {{PLURAL:$1|tago|tagoj}})',
 'recentchangescount' => 'Nombro de redaktoj por montri defaŭlte:',
 'prefs-help-recentchangescount' => 'Ĉi tiu inkluzivas lastajn ŝanĝojn, paĝajn historiojn, kaj protokolojn.',
-'prefs-help-watchlist-token' => 'Plenigo de ĉi tiu kampo kun sekreta ŝlosilo generos RSS-fonton por via atentaro.
-Iu kiu konas la ŝlosilon en ĉi tiu kampo povos legi vian atentaron, do bonvolu elekti sekuran valoron.
-Jen hazarde generita valoro por via uzo: $1',
 'savedprefs' => 'Viaj preferoj estas konservitaj.',
 'timezonelegend' => 'Horzono:',
 'localtime' => 'Loka tempo:',
@@ -1469,7 +1494,6 @@ Jen hazarde generita valoro por via uzo: $1',
 'prefs-reset-intro' => 'Vi povas uzi ĉi tiun paĝon por restarigi viajn agordojn al la originalaj defaŭltoj.
 Ĉi tiel ne estus malfarebla.',
 'prefs-emailconfirm-label' => 'Retpoŝta konfirmado:',
-'prefs-textboxsize' => 'Grandeco de redakta fenestro',
 'youremail' => 'Retadreso:',
 'username' => '{{GENDER:$1|Salutnomo}}:',
 'uid' => '{{GENDER:$1|Uzanto}}-identaĵo:',
@@ -1500,6 +1524,8 @@ Jen hazarde generita valoro por via uzo: $1',
 'prefs-dateformat' => 'Data formato',
 'prefs-timeoffset' => 'Tempa deŝovo',
 'prefs-advancedediting' => 'Ĝeneralaj opcioj',
+'prefs-editor' => 'Redaktilo',
+'prefs-preview' => 'Antaŭrigardo',
 'prefs-advancedrc' => 'Progresaj opcioj',
 'prefs-advancedrendering' => 'Progresaj opcioj',
 'prefs-advancedsearchoptions' => 'Progresaj opcioj',
@@ -1507,6 +1533,7 @@ Jen hazarde generita valoro por via uzo: $1',
 'prefs-displayrc' => 'Montraj opcioj',
 'prefs-displaysearchoptions' => 'Montraj opcioj',
 'prefs-displaywatchlist' => 'Montraj opcioj',
+'prefs-tokenwatchlist' => 'Ĵetono',
 'prefs-diffs' => 'Diferencoj',
 
 # User preference: email validation using jQuery
@@ -1604,6 +1631,9 @@ Jen hazarde generita valoro por via uzo: $1',
 'right-editusercssjs' => 'Redaktu CSS- kaj JS-dosierojn de aliaj uzantoj',
 'right-editusercss' => 'Redaktu CSS-dosierojn de aliaj uzantoj',
 'right-edituserjs' => 'Redaktu JS-dosierojn de aliaj uzantoj',
+'right-editmyusercss' => 'Redakti viajn proprajn CSS-dosierojn',
+'right-editmyuserjs' => 'Redakti viajn proprajn JavaScript-dosierojn',
+'right-viewmywatchlist' => 'Rigardi vian atentaron',
 'right-rollback' => 'Tuj malfari la redaktojn de la lasta uzanto kiu redaktis specifan paĝon',
 'right-markbotedits' => 'Marki restarigitajn redaktojn kiel robotajn redaktojn',
 'right-noratelimit' => 'Ne influita de po-limoj',
@@ -1707,7 +1737,6 @@ Jen hazarde generita valoro por via uzo: $1',
 'recentchangeslinked-feed' => 'Rilataj paĝoj',
 'recentchangeslinked-toolbox' => 'Rilataj paĝoj',
 'recentchangeslinked-title' => 'Ŝanĝoj rilataj al "$1"',
-'recentchangeslinked-noresult' => 'Neniuj ŝanĝoj en ligitaj paĝoj dum la donata periodo.',
 'recentchangeslinked-summary' => "Jen listo de ŝanĝoj faritaj lastatempe al paĝoj ligitaj el specifa paĝo (aŭ al membroj de specifa kategorio).
 Paĝoj en [[Special:Watchlist|via atentaro]] estas '''grasaj'''.",
 'recentchangeslinked-page' => 'Nomo de paĝo:',
@@ -1719,7 +1748,7 @@ Paĝoj en [[Special:Watchlist|via atentaro]] estas '''grasaj'''.",
 'reuploaddesc' => 'Reveni al la alŝuta formularo.',
 'upload-tryagain' => 'Enigi ŝanĝitan dosieran priskribon',
 'uploadnologin' => 'Ne ensalutinta',
-'uploadnologintext' => 'Se vi volas alŝuti dosierojn, vi devas [[Special:UserLogin|ensaluti]].',
+'uploadnologintext' => 'Vi devas [[Special:UserLogin|ensaluti]] por alŝuti dosierojn.',
 'upload_directory_missing' => 'La alŝuta dosierujo ($1) estas nek trovebla nek kreebla de la retservilo.',
 'upload_directory_read_only' => 'La TTT-servilo ne povas alskribi la alŝuto-dosierujon ($1).',
 'uploaderror' => 'Eraro okazis dum alŝuto',
@@ -1933,7 +1962,6 @@ Por optimuma sekureco, img_auth.php estas malŝalta.',
 'http-read-error' => 'HTTP-legeraro.',
 'http-timed-out' => 'HTTP-peto eltempiĝis.',
 'http-curl-error' => 'Eraro venigante URL-on: $1',
-'http-host-unreachable' => 'URL-o ne estis atingebla.',
 'http-bad-status' => 'Estis problemo dum la HTTP-peto: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2082,12 +2110,6 @@ Bonvolu kontroli aliajn ligilojn al la ŝablonoj antaŭ ol forigi ilin.',
 'statistics-users-active-desc' => 'Uzantoj kiuj faris agon en la {{PLURAL:$1|lasta tago|lastaj $1 tagoj}}',
 'statistics-mostpopular' => 'Plej ofte montrataj paĝoj',
 
-'disambiguations' => 'Paĝoj ligitaj al apartigiloj',
-'disambiguationspage' => 'Template:Apartigilo',
-'disambiguations-text' => "La jenaj paĝoj alligas '''apartigilon'''.
-Ili devus anstataŭe alligi la ĝustan temon.<br />
-Paĝo estas traktata kiel apartigilo se ĝi uzas ŝablonon kiu estas ligita de [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop' => 'Paĝoj kun paĝa atributo',
 'pageswithprop-legend' => 'Paĝoj kun paĝa atributo',
 'pageswithprop-prop' => 'Nomo de la atributo:',
@@ -2340,10 +2362,9 @@ La retadreso kiun vi enigis en [[Special:Preferences|viaj preferoj]] aperos kiel
 'unwatchthispage' => 'Malatenti paĝon',
 'notanarticle' => 'Ne estas artikolo',
 'notvisiblerev' => 'Versio estis forigita',
-'watchnochange' => 'Neniu artikolo en via atentaro redaktiĝis dum la prispektita tempoperiodo.',
 'watchlist-details' => '{{PLURAL:$1|$1 paĝon|$1 paĝojn}} en via atentaro, krom diskutpaĝoj.',
-'wlheader-enotif' => '* Retpoŝta sciigo estas ebligita',
-'wlheader-showupdated' => "* Montriĝas per '''dikaj literoj''' tiuj paĝoj, kiujn oni ŝanĝis ekde kiam vi laste vizitis ilin",
+'wlheader-enotif' => 'Retpoŝta sciigo estas ebligita',
+'wlheader-showupdated' => "Montriĝas per '''dikaj literoj''' tiuj paĝoj, kiujn oni ŝanĝis ekde kiam vi laste vizitis ilin",
 'watchmethod-recent' => 'traserĉas lastajn redaktojn',
 'watchmethod-list' => 'traserĉas priatentitajn',
 'watchlistcontains' => 'Via atentaro enhavas $1 {{PLURAL:$1|paĝon|paĝojn}}.',
@@ -2743,11 +2764,8 @@ La kialo donita por la forbaro de $1 estis: "$2"',
 'ipb_blocked_as_range' => 'Eraro: La IP-adreso $1 ne estas forbarita rekte kaj ne povas esti malforbarita. Tamen ĝi estas forbarita kiel parto de la intervalo $2, kiu ne povas esti malforbarita.',
 'ip_range_invalid' => 'Malvalida IP-adresa intervalo.',
 'ip_range_toolarge' => 'IP-adresaj intervaloj pli grandaj ol /$1 estas malpermesataj.',
-'blockme' => 'Forbari min',
 'proxyblocker' => 'Forbarilo por prokuriloj.',
-'proxyblocker-disabled' => 'Ĉi tiu funkcio estas malŝaltita.',
 'proxyblockreason' => 'Via IP-adreso estis forbarita ĉar ĝi estas malferma prokurilo. Bonvolu kontakti vian provizanto de retservo aŭ komputika helpisto kaj informu ilin de ĉi serioza problemo pri sekureco.',
-'proxyblocksuccess' => 'Farita.',
 'sorbsreason' => 'Via IP-adreso estas listigita kiel malferma prokurilo en la DNSBL uzata de {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Via IP-adreso estas listigita kiel malferma prokurilo en la DNSBL uzata de {{SITENAME}}. Vi ne rajtas krei konton.',
 'cant-block-while-blocked' => 'Vi ne povas forbari aliajn uzantojn dum vi estas forbarita.',
@@ -3068,17 +3086,11 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 
 # Stylesheets
 'common.css' => '/* La jena CSS influos la aspekton de ĉiaj temoj. */',
-'standard.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Klasika temo. */',
-'nostalgia.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Nostalgia temo. */',
 'cologneblue.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Kolonja Blua temo. */',
 'monobook.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Libreja temo. */',
-'myskin.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Miŝela temo. */',
-'chick.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Kokida temo. */',
-'simple.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Simpla temo. */',
 'modern.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Moderna temo. */',
 'vector.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Vektora temo. */',
 'print.css' => '/* La jena CSS influos la prezentadon de la presaĵo. */',
-'handheld.css' => '/* La jena CSS influos manpremitajn komputilojn sur bazo de la temo kiu arangiĝis en $wgHandheldStyle. */',
 'noscript.css' => '/* La jena CSS influos uzantojn, kiuj desebligis Ĝavaskripton. */',
 'group-autoconfirmed.css' => '/* La jena CSS sole influos auxtokonfirmatajn uzantojn. */',
 'group-bot.css' => '/* La jena CSS sole influos robotojn. */',
@@ -3087,13 +3099,8 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 
 # Scripts
 'common.js' => '/* La jena Ĝavaskripto ŝargiĝos por ĉiaj uzantoj ĉe ĉiu paĝoŝargado. */',
-'standard.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Klasika temo. */',
-'nostalgia.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Nostalgia temo. */',
 'cologneblue.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Kolonja Blua temo. */',
 'monobook.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Libreja temo. */',
-'myskin.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Miŝela temo. */',
-'chick.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Kokida temo. */',
-'simple.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Simpla temo. */',
 'modern.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Moderna temo. */',
 'vector.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Vektora temo. */',
 'group-autoconfirmed.js' => '/* La jena Ĝavaskripto sole ŝargiĝos por auxtokonfirmataj uzantoj. */',
@@ -3172,13 +3179,8 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'pageinfo-category-files' => 'Nombro de dosieroj',
 
 # Skin names
-'skinname-standard' => 'Klasiko',
-'skinname-nostalgia' => 'Nostalgio',
 'skinname-cologneblue' => 'Kolonja Bluo',
 'skinname-monobook' => 'Librejo',
-'skinname-myskin' => 'Miŝelo',
-'skinname-chick' => 'Kokido',
-'skinname-simple' => 'Simplo',
 'skinname-modern' => 'Moderno',
 'skinname-vector' => 'Vektoro',
 
@@ -3256,11 +3258,17 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutoj}}',
 'hours' => '{{PLURAL:$1|$1 horo|$1 horoj}}',
 'days' => '{{PLURAL:$1|$1 tago|$1 tagoj}}',
+'weeks' => '{{PLURAL:$1|$1 semajno|$1 semajnoj}}',
 'months' => '{{PLURAL:$1|$1 monato|$1 monatoj}}',
 'years' => '{{PLURAL:$1|$1 jaro|$1 jaroj}}',
 'ago' => 'antaŭ $1',
 'just-now' => 'ĵus nune',
 
+# Human-readable timestamps
+'hours-ago' => 'antaŭ $1 {{PLURAL:$1|horo|horoj}}',
+'minutes-ago' => 'antaŭ $1 {{PLURAL:$1|minuto|minutoj}}',
+'seconds-ago' => 'antaŭ $1 {{PLURAL:$1|sekundo|sekundoj}}',
+
 # Bad image list
 'bad_image_list' => 'La formato estas jen:
 
@@ -3289,7 +3297,7 @@ Aliaj estos kaŝitaj defaŭlte.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larĝeco',
 'exif-imagelength' => 'Alteco',
 'exif-bitspersample' => 'Bitokoj en komponanto',
@@ -3467,7 +3475,7 @@ Aliaj estos kaŝitaj defaŭlte.
 'exif-originalimageheight' => 'Alto de bildo antaŭ stuco',
 'exif-originalimagewidth' => 'Larĝo de bildo antaŭ stuco',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nedensigita',
 'exif-compression-2' => 'CCITT-Grupo 3 modifita ciferado laŭ Huffman Dimensio-1',
 'exif-compression-3' => 'CCITT Grupo-3 ĉifrado por faksilo',
@@ -3914,7 +3922,6 @@ Vi povas ankaŭ [[Special:EditWatchlist|redakti norme]].',
 'version-other' => 'Alia',
 'version-mediahandlers' => 'Mediaj traktiloj',
 'version-hooks' => 'Hokoj',
-'version-extension-functions' => 'Kromprogramaj funkcioj',
 'version-parser-extensiontags' => 'Sintaksaj etend-etikedoj',
 'version-parser-function-hooks' => 'Hokoj de sintaksaj funkcioj',
 'version-hook-name' => 'Nomo de hoko',
@@ -3936,13 +3943,6 @@ Oni devis doni al vi [{{SERVER}}{{SCRIPTPATH}}/COPYING ekzempleron de la GNU Gen
 'version-entrypoints-header-entrypoint' => 'Eniropunkto',
 'version-entrypoints-header-url' => 'Retadreso',
 
-# Special:FilePath
-'filepath' => 'Vojo al dosiero',
-'filepath-page' => 'Dosiero:',
-'filepath-submit' => 'Vojo',
-'filepath-summary' => 'Ĉi tiu speciala paĝo liveras kompletan vojon al dosiero.
-Bildoj montriĝas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte per ties asociita programo.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Serĉu duplikatajn dosierojn',
 'fileduplicatesearch-summary' => 'Serĉi duplikatajn dosierojn bazite de haketvaloro.',
@@ -4032,6 +4032,8 @@ Bildoj montriĝas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
 'htmlform-submit' => 'Ek!',
 'htmlform-reset' => 'Malfari ŝanĝojn',
 'htmlform-selectorother-other' => 'Alia',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Jes',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 kun tut-teksta subteno',
diff --git a/languages/messages/MessagesEs.php b/languages/messages/MessagesEs.php
index d435f980..05f68047 100644
--- a/languages/messages/MessagesEs.php
+++ b/languages/messages/MessagesEs.php
@@ -60,6 +60,7 @@
  * @author Lin linao
  * @author Linterweb
  * @author Locos epraix
+ * @author Luckas
  * @author Luis Felipe Schenone
  * @author Mahadeva
  * @author Manuelt15
@@ -70,10 +71,12 @@
  * @author Muro de Aguas
  * @author Omnipaedista
  * @author Orgullomoore
+ * @author Ovruni
  * @author Paucabot
  * @author Penarc
  * @author PerroVerd
  * @author Pertile
+ * @author Pginer
  * @author Piolinfax
  * @author Platonides
  * @author PoLuX124
@@ -144,10 +147,10 @@ $specialPageAliases = array(
 	'Booksources'               => array( 'FuentesDeLibros', 'Fuentes_de_libros' ),
 	'BrokenRedirects'           => array( 'RedireccionesRotas', 'Redirecciones_rotas' ),
 	'Categories'                => array( 'Categorías' ),
-	'ChangeEmail'               => array( 'CambiarEmail', 'CambiarCorreo' ),
+	'ChangeEmail'               => array( 'Cambiar_correo_electrónico', 'CambiarEmail', 'CambiarCorreo' ),
 	'ChangePassword'            => array( 'Cambiar_contraseña', 'CambiarContraseña', 'ResetearContraseña', 'Resetear_contraseña' ),
-	'ComparePages'              => array( 'CompararPáginas' ),
-	'Confirmemail'              => array( 'ConfirmarEmail', 'Confirmar_correo_electrónico' ),
+	'ComparePages'              => array( 'Comparar_páginas', 'CompararPáginas' ),
+	'Confirmemail'              => array( 'Confirmar_correo_electrónico', 'ConfirmarEmail' ),
 	'Contributions'             => array( 'Contribuciones' ),
 	'CreateAccount'             => array( 'Crear_una_cuenta', 'CrearCuenta' ),
 	'Deadendpages'              => array( 'PáginasSinSalida', 'Páginas_sin_salida' ),
@@ -155,7 +158,7 @@ $specialPageAliases = array(
 	'Disambiguations'           => array( 'Desambiguaciones', 'Desambiguación' ),
 	'DoubleRedirects'           => array( 'RedireccionesDobles', 'Redirecciones_dobles' ),
 	'EditWatchlist'             => array( 'EditarSeguimiento' ),
-	'Emailuser'                 => array( 'MandarEmailUsuario' ),
+	'Emailuser'                 => array( 'Enviar_correo_electrónico', 'MandarEmailUsuario' ),
 	'Export'                    => array( 'Exportar' ),
 	'Fewestrevisions'           => array( 'MenosEdiciones', 'Menos_ediciones' ),
 	'FileDuplicateSearch'       => array( 'BuscarArchivosDuplicados', 'Buscar_archivos_duplicados' ),
@@ -401,9 +404,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostrar el número de usuarios que la vigilan',
 'tog-oldsig' => 'Firma actual:',
 'tog-fancysig' => 'Tratar la firma como wikitexto (sin un enlace automático)',
-'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos: son necesarios ajustes especiales en la computadora; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
-'tog-externaldiff' => "Utilizar ''diferencia'' externa por defecto (sólo para expertos: son necesarios ajustes especiales en la computadora; [//www.mediawiki.org/wiki/Manual:External_editors más información])",
-'tog-showjumplinks' => 'Habilitar los enlaces de accesibilidad «saltar a»',
 'tog-uselivepreview' => 'Usar previsualización en vivo (requiere JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Avisarme cuando grabe la página sin introducir un resumen de edición',
 'tog-watchlisthideown' => 'Ocultar mis ediciones en la lista de seguimiento',
@@ -417,6 +417,8 @@ $messages = array(
 'tog-showhiddencats' => 'Mostrar las categorías escondidas',
 'tog-noconvertlink' => 'Desactivar la conversión de título de enlace',
 'tog-norollbackdiff' => "Omitir la ''diferencia'' después de revertir",
+'tog-useeditwarning' => 'Advertirme cuando abandone una página editada con cambios sin grabar',
+'tog-prefershttps' => 'Utiliza una conexión segura siempre que haya iniciado una sesión',
 
 'underline-always' => 'Siempre',
 'underline-never' => 'Nunca',
@@ -480,6 +482,18 @@ $messages = array(
 'oct' => 'oct',
 'nov' => 'nov',
 'dec' => 'dic',
+'january-date' => '$1 de enero',
+'february-date' => '$1 de febrero',
+'march-date' => '$1 de marzo',
+'april-date' => '$1 de abril',
+'may-date' => '$1 de mayo',
+'june-date' => '$1 de junio',
+'july-date' => '$1 de julio',
+'august-date' => '$1 de agosto',
+'september-date' => '$1 de septiembre',
+'october-date' => '$1 de octubre',
+'november-date' => '$1 de noviembre',
+'december-date' => '$1 de diciembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoría|Categorías}}',
@@ -561,6 +575,7 @@ $messages = array(
 'create-this-page' => 'Crear esta página',
 'delete' => 'Borrar',
 'deletethispage' => 'Borrar esta página',
+'undeletethispage' => 'Restaurar esta página',
 'undelete_short' => 'Restaurar {{PLURAL:$1|una edición|$1 ediciones}}',
 'viewdeleted_short' => 'Ver {{PLURAL:$1|una edición borrada|$1 ediciones borradas}}',
 'protect' => 'Proteger',
@@ -604,7 +619,7 @@ $1',
 'pool-queuefull' => 'La cola de trabajo está llena',
 'pool-errorunknown' => 'Error desconocido',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Acerca de {{SITENAME}}',
 'aboutpage' => 'Project:Acerca de',
 'copyright' => 'El contenido está disponible bajo  $1  a menos que se indique lo contrario.',
@@ -614,7 +629,6 @@ $1',
 'disclaimers' => 'Aviso legal',
 'disclaimerpage' => 'Project:Limitación general de responsabilidad',
 'edithelp' => 'Ayuda de edición',
-'edithelppage' => 'Help:Cómo se edita una página',
 'helppage' => 'Help:Contenidos',
 'mainpage' => 'Página principal',
 'mainpage-description' => 'Página principal',
@@ -690,17 +704,12 @@ Puedes ver una lista de las páginas especiales en [[Special:SpecialPages|{{int:
 # General errors
 'error' => 'Error',
 'databaseerror' => 'Error de la base de datos',
-'dberrortext' => 'Ha ocurrido un error de sintaxis en una consulta a la base de datos.
-Esto puede indicar un error en el software.
-La última consulta a la base de datos que se intentó fue:
-<blockquote><code>$1</code></blockquote>
-dentro de la función "<code>$2</code>".
-La base de datos devolvió el error "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ha ocurrido un error de sintaxis en una consulta a la base de datos.
-La última consulta a la base de datos que se intentó fue:
-«$1»
-desde la función «$2».
-Base de datos retornó error «$3: $4».',
+'databaseerror-text' => 'Se ha producido un error en la base de datos.
+Esto puede indicar un bug en el software.',
+'databaseerror-textcl' => 'Se ha producido un error en la base de datos.',
+'databaseerror-query' => 'Consulta: $1',
+'databaseerror-function' => 'Función: $1',
+'databaseerror-error' => 'Error: $1',
 'laggedslavemode' => "'''Aviso:''' puede que falten las actualizaciones más recientes en esta página.",
 'readonly' => 'Base de datos bloqueada',
 'enterlockreason' => 'Explique el motivo del bloqueo, incluyendo una estimación de cuándo se producirá el desbloqueo',
@@ -734,6 +743,7 @@ Por favor, avisa a un [[Special:ListUsers/sysop|administrador]], tomando nota de
 Puede que ya haya sido borrado por alguien más.',
 'cannotdelete-title' => 'No se puede borrar la página «$1»',
 'delete-hook-aborted' => 'La modificación que intentaste hacer fue cancelada por un gancho de extensión. No hay explicación disponible.',
+'no-null-revision' => 'No se pudo crear la nueva revisión nula para la página "$1"',
 'badtitle' => 'Título incorrecto',
 'badtitletext' => 'El título de la página solicitada está vacío, no es válido, o es un enlace interidioma o interwiki incorrecto.
 Puede que contenga uno o más caracteres que no se pueden usar en los títulos.',
@@ -755,12 +765,15 @@ Para agregar o cambiar las traducciones para todos los wikis, por favor, usa [//
 'editinginterface' => "'''Aviso:''' Estás editando una página usada para proporcionar el texto de la interfaz para el software. 
 Los cambios en esta página afectarán a la apariencia de la interfaz para los demás usuarios de este wiki. 
 Para añadir o cambiar las traducciones, por favor considera usar [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
-'sqlhidden' => '(Consulta SQL oculta)',
 'cascadeprotected' => 'Esta página ha sido protegida para su edición, porque está incluida en {{PLURAL:$1|la siguiente página|las siguientes páginas}}, que están protegidas con la opción de «cascada»:
 $2',
 'namespaceprotected' => "No tienes permiso para editar las páginas del espacio de nombres '''$1'''.",
 'customcssprotected' => 'No tienes permiso para editar esta página CSS, porque contiene configuraciones personales de otro usuario.',
 'customjsprotected' => 'No tienes permiso para editar esta página JavaScript, porque contiene configuraciones personales de otro usuario.',
+'mycustomcssprotected' => 'No tienes permiso para editar esta página CSS.',
+'mycustomjsprotected' => 'No tienes permiso para editar esta página JavaScript.',
+'myprivateinfoprotected' => 'No tienes permiso para editar tu información privada.',
+'mypreferencesprotected' => 'No tienes permiso para editar tus preferencias.',
 'ns-specialprotected' => 'Las páginas especiales no se pueden editar',
 'titleprotected' => 'Esta página ha sido protegida contra creación por [[User:$1|$1]].
 El motivo dado fue: "\'\'$2\'\'".',
@@ -783,10 +796,19 @@ Tenga en cuenta que algunas páginas pueden continuar mostrándose como si todav
 'welcomecreation-msg' => 'Se ha creado tu cuenta.
 No olvides personalizar tus [[Special:Preferences|preferencias de {{SITENAME}}]].',
 'yourname' => 'Nombre de usuario:',
+'userlogin-yourname' => 'Usuario',
+'userlogin-yourname-ph' => 'Escribe tu nombre de usuario',
+'createacct-another-username-ph' => 'Ingrese el nombre de usuario',
 'yourpassword' => 'Contraseña:',
+'userlogin-yourpassword' => 'Contraseña',
+'userlogin-yourpassword-ph' => 'Escribe tu contraseña',
+'createacct-yourpassword-ph' => 'Escribe una contraseña',
 'yourpasswordagain' => 'Confirma la contraseña:',
+'createacct-yourpasswordagain' => 'Confirma la contraseña',
+'createacct-yourpasswordagain-ph' => 'Repite la contraseña',
 'remembermypassword' => 'Mantenerme conectado en este navegador (hasta $1 {{PLURAL:$1|día|días}})',
-'securelogin-stick-https' => 'Permanecer conectado a HTTPS después de iniciar sesión',
+'userlogin-remembermypassword' => 'Mantener mi sesión iniciada',
+'userlogin-signwithsecure' => 'Usar conexión segura',
 'yourdomainname' => 'Dominio',
 'password-change-forbidden' => 'No puedes cambiar las contraseñas de este wiki.',
 'externaldberror' => 'Hubo un error de autenticación externa de la base de datos o bien no tienes autorización para actualizar tu cuenta externa.',
@@ -798,18 +820,44 @@ No olvides personalizar tus [[Special:Preferences|preferencias de {{SITENAME}}]]
 'logout' => 'Cerrar sesión',
 'userlogout' => 'Cerrar sesión',
 'notloggedin' => 'No has iniciado sesión',
+'userlogin-noaccount' => '¿No tienes una cuenta?',
+'userlogin-joinproject' => 'Únete a {{SITENAME}}',
 'nologin' => '¿No tienes una cuenta? $1.',
 'nologinlink' => 'Crear una cuenta',
 'createaccount' => 'Crear una cuenta',
 'gotaccount' => '¿Ya tienes una cuenta? $1.',
 'gotaccountlink' => 'Entrar',
 'userlogin-resetlink' => '¿Olvidaste tus datos de acceso?',
+'userlogin-resetpassword-link' => 'Restablecer la contraseña',
+'helplogin-url' => 'Help:Inicio de sesión',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ayuda]]',
+'userlogin-loggedin' => 'Ya estás conectado como {{GENDER:$1|$1}}.
+Usa el formulario de abajo para iniciar sesión como otro usuario.',
+'userlogin-createanother' => 'Crear otra cuenta',
+'createacct-join' => 'Introduce tus datos debajo.',
+'createacct-another-join' => 'Introduzca la información de la nueva cuenta a continuación.',
+'createacct-emailrequired' => 'Dirección de correo electrónico',
+'createacct-emailoptional' => 'Dirección de correo electrónico (opcional)',
+'createacct-email-ph' => 'Escribe tu dirección de correo electrónico',
+'createacct-another-email-ph' => 'Introduzca la dirección de correo electrónico',
 'createaccountmail' => 'Utilizar una contraseña aleatoria temporal y enviarla a la dirección de correo electrónico especificada',
+'createacct-realname' => 'Nombre real (opcional)',
 'createaccountreason' => 'Motivo:',
+'createacct-reason' => 'Motivo',
+'createacct-reason-ph' => 'Por qué estás creando otra cuenta',
+'createacct-captcha' => 'Comprobación de seguridad',
+'createacct-imgcaptcha-ph' => 'Escribe el texto de arriba',
+'createacct-submit' => 'Crea tu cuenta',
+'createacct-another-submit' => 'Crear otra cuenta',
+'createacct-benefit-heading' => '{{SITENAME}} lo construye gente como tú.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edición|ediciones}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|página|páginas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|colaborador reciente|colaboradores recientes}}',
 'badretype' => 'Las contraseñas no coinciden.',
 'userexists' => 'El nombre de usuario indicado ya está en uso.
 Por favor escoge un nombre diferente.',
 'loginerror' => 'Error de inicio de sesión',
+'createacct-error' => 'Error al crear la cuenta',
 'createaccounterror' => 'No se pudo crear la cuenta: $1',
 'nocookiesnew' => 'La cuenta de usuario ha sido creada, pero no has iniciado sesión.
 {{SITENAME}} usa <em>cookies</em> para identificar a los usuarios registrados.
@@ -870,10 +918,12 @@ La contraseña asignada automáticamente es «$3». Por favor entra ahora y camb
 
 Puedes ignorar este mensaje si esta cuenta fue creada por error.',
 'usernamehasherror' => 'El nombre de usuario no puede contener símbolos de almohadilla/numeral',
-'login-throttled' => 'Has intentado demasiadas veces iniciar sesión. Por favor espera antes de intentarlo nuevamente.',
+'login-throttled' => 'Has intentado demasiadas veces iniciar sesión. Por favor espera $1 antes de intentarlo nuevamente.',
 'login-abort-generic' => 'Tu inicio de sesión no fue exitoso - Cancelado',
 'loginlanguagelabel' => 'Idioma: $1',
 'suspicious-userlogout' => 'Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.',
+'createacct-another-realname-tip' => 'El nombre Real es opcional.
+Si elige proporcionarlo, se usará para dar al usuario la atribución de su trabajo.',
 
 # Email sending
 'php-mail-error-unknown' => 'Error desconocido en la función mail() de PHP.',
@@ -890,8 +940,7 @@ Por favor, introduce una nueva contraseña aquí:',
 'newpassword' => 'Contraseña nueva:',
 'retypenew' => 'Confirmar la contraseña nueva:',
 'resetpass_submit' => 'Establecer contraseña e iniciar sesión',
-'resetpass_success' => '¡Tu contraseña se ha cambiado con éxito!
-Iniciando sesión...',
+'changepassword-success' => 'La contraseña ha sido cambiada con éxito.',
 'resetpass_forbidden' => 'No se pueden cambiar las contraseñas',
 'resetpass-no-info' => 'Debes iniciar sesión para acceder directamente a esta página.',
 'resetpass-submit-loggedin' => 'Cambiar contraseña',
@@ -903,10 +952,11 @@ Puede que ya hayas cambiado la contraseña o que hayas pedido una temporal.',
 
 # Special:PasswordReset
 'passwordreset' => 'Restablecimiento de contraseña',
-'passwordreset-text' => 'Completa este formulario para restablecer la contraseña.',
+'passwordreset-text-one' => 'Completa este formulario para restablecer tu contraseña.',
+'passwordreset-text-many' => '{{PLURAL:$1|Completa uno de los campos para restablecer tu contraseña.}}',
 'passwordreset-legend' => 'Restablecer contraseña',
 'passwordreset-disabled' => 'Se ha desactivado el restablecimiento de contraseñas en este wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduce uno de los elementos de datos siguientes}}',
+'passwordreset-emaildisabled' => 'Las funciones de correo electrónico han sido desactivadas en esta wiki.',
 'passwordreset-username' => 'Nombre de usuario:',
 'passwordreset-domain' => 'Dominio:',
 'passwordreset-capture' => '¿Ver el mensaje resultante?',
@@ -935,7 +985,7 @@ ignorar este mensaje y continuar usando tu contraseña anterior.',
 Contraseña temporal: $2',
 'passwordreset-emailsent' => 'Se ha enviado un correo electrónico para el restablecimiento de tu contraseña.',
 'passwordreset-emailsent-capture' => 'Se ha enviado un correo para el restablecimiento de la contraseña, el cual se muestra a continuación.',
-'passwordreset-emailerror-capture' => 'Un recordatorio por correo electrónico fue generado, que se muestra a continuación, pero el envío al usuario falló: $1',
+'passwordreset-emailerror-capture' => 'Se generó un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero el envío {{GENDER:$2|al usuario|a la usuaria}} falló. $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Cambiar la dirección de correo electrónico',
@@ -949,6 +999,19 @@ Contraseña temporal: $2',
 'changeemail-submit' => 'Cambiar correo electrónico',
 'changeemail-cancel' => 'Cancelar',
 
+# Special:ResetTokens
+'resettokens' => 'Restablecer claves',
+'resettokens-text' => 'Puede restablecer las claves que permiten el acceso a ciertos datos privados asociados a tu cuenta aquí.
+
+Deberías hacerlo si accidentalmente la has compartido con alguien o si su cuenta ha sido comprometida.',
+'resettokens-no-tokens' => 'No hay claves para restablecer.',
+'resettokens-legend' => 'Restablecer claves',
+'resettokens-tokens' => 'Claves:',
+'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => 'Clave para la lista de seguimiento (RSS/Atom) de los [[Special:Watchlist|cambios a las páginas en tu lista de seguimiento]]',
+'resettokens-done' => 'Restablecimiento de claves.',
+'resettokens-resetbutton' => 'Restablecer las claves',
+
 # Edit page toolbar
 'bold_sample' => 'Texto en negrita',
 'bold_tip' => 'Texto en negrita',
@@ -1144,12 +1207,15 @@ No se aportaron explicaciones.',
 Parece que ha sido borrada.',
 'edit-conflict' => 'Conflicto de edición.',
 'edit-no-change' => 'Se ignoró tu revisión, porque no se hizo ningún cambio al texto.',
+'postedit-confirmation' => 'Se ha guardado tu edición.',
 'edit-already-exists' => 'No se pudo crear una página nueva.
 Ya existe.',
 'defaultmessagetext' => 'Texto de mensaje predeterminado',
 'content-failed-to-parse' => 'No se pudo analizar el contenido $2 del modelo $1: $3',
 'invalid-content-data' => 'Datos de contenido inválidos',
 'content-not-allowed-here' => 'El contenido "$1" no está permitido en la página [[$2]]',
+'editwarning-warning' => 'Si abandonas esta página perderás tus cambios.
+Si estás identificado, puedes deshabilitar esta advertencia en la sección "Edición" de tus preferencias.',
 
 # Content models
 'content-model-wikitext' => 'texto wiki',
@@ -1184,6 +1250,7 @@ Ese o esos parámetros han sido omitidos.',
 'undo-failure' => 'No se puede deshacer la edición ya que otro usuario ha realizado una edición intermedia.',
 'undo-norev' => 'La edición no puede ser deshecha porque no existe o ha sido borrada.',
 'undo-summary' => 'Deshecha la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]])',
+'undo-summary-username-hidden' => 'Deshacer revisión $1 por usuario oculto',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'No se puede crear la cuenta',
@@ -1365,6 +1432,7 @@ Nota que usar los enlaces de navegación borrará las selecciones de esta column
 'compareselectedversions' => 'Comparar versiones seleccionadas',
 'showhideselectedversions' => 'Mostrar/ocultar versiones seleccionadas',
 'editundo' => 'deshacer',
+'diff-empty' => '(Sin diferencias)',
 'diff-multi' => '(No se {{PLURAL:$1|muestra una edición intermedia realizada|muestran $1 ediciones intermedias realizadas}} por {{PLURAL:$2|un usuario|$2 usuarios}})',
 'diff-multi-manyusers' => '(No se {{PLURAL:$1|muestra una edición intermedia|muestran $1 ediciones intermedias}} de {{PLURAL:$2|un usuario|$2 usuarios}})',
 'difference-missing-revision' => 'No {{PLURAL:$2|se ha encontrado|se han encontrado}} {{PLURAL:$2|una revisión|$2 revisiones}} de esta diferencia ($1).
@@ -1392,7 +1460,6 @@ Los detalles pueden encontrarse en el [{{fullurl:{{#Special:Log}}/delete|page={{
 'searchmenu-legend' => 'Opciones de búsqueda',
 'searchmenu-exists' => "'''Hay una página llamada \"[[:\$1]]\" en esta wiki.'''",
 'searchmenu-new' => "'''¡Crea la página «[[:$1]]» en este wiki!'''",
-'searchhelp-url' => 'Help:Ayuda',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Otras páginas con este prefijo]]',
 'searchprofile-articles' => 'Páginas de contenido',
 'searchprofile-project' => 'Páginas de ayuda y de proyecto',
@@ -1435,15 +1502,7 @@ Prueba a usar el prefijo ''all:'' para buscar en todo el contenido (incluyendo p
 'search-external' => 'Búsqueda externa',
 'searchdisabled' => 'Las búsquedas en {{SITENAME}} están temporalmente desactivadas.
 Mientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índices relativos a {{SITENAME}} pueden estar desactualizados.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Ninguna',
-'qbsettings-fixedleft' => 'Fija a la izquierda',
-'qbsettings-fixedright' => 'Fija a la derecha',
-'qbsettings-floatingleft' => 'Flotante a la izquierda',
-'qbsettings-floatingright' => 'Flotante a la derecha',
-'qbsettings-directionality' => 'Fijos, dependiendo de la direccionalidad de la escritura de su idioma',
+'search-error' => 'Ha ocurrido un error al buscar: $1',
 
 # Preferences page
 'preferences' => 'Preferencias',
@@ -1477,7 +1536,6 @@ Mientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índice
 'resetprefs' => 'Limpiar cambios sin guardar',
 'restoreprefs' => 'Restaurar la configuración predeterminada',
 'prefs-editing' => 'Edición',
-'prefs-edit-boxsize' => 'Tamaño de la ventana de edición.',
 'rows' => 'Filas:',
 'columns' => 'Columnas:',
 'searchresultshead' => 'Búsquedas',
@@ -1488,8 +1546,9 @@ Mientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índice
 'recentchangesdays-max' => '(máximo {{PLURAL:$1|un día|$1 días}})',
 'recentchangescount' => 'Número de ediciones a mostrar de manera predeterminada:',
 'prefs-help-recentchangescount' => 'Esto incluye cambios recientes, historiales de página, y registros.',
-'prefs-help-watchlist-token' => 'Rellenar este campo con una clave secreta generará un canal RSS para tu lista de seguimiento.
-Cualquiera que conozca la clave en este campo será capaz de leer tu lista de seguimiento, así que escoge un valor seguro. Aquí hay un valor generado aleatoriamente que puedes usar: $1',
+'prefs-help-watchlist-token2' => 'Esta es la clave secreta para el canal de contenido web de tu lista de seguimiento.
+Cualquier persona que la conozca podría leer tu lista, así que no la compartas.
+[[Special:ResetTokens|Pulsa aquí si necesitas restablecerla]].',
 'savedprefs' => 'Tus preferencias han sido guardadas.',
 'timezonelegend' => 'Zona horaria:',
 'localtime' => 'Hora local:',
@@ -1520,7 +1579,6 @@ Cualquiera que conozca la clave en este campo será capaz de leer tu lista de se
 'prefs-reset-intro' => 'Puedes usar esta página para restaurar tus preferencias a las predeterminadas del sitio.
 Esto no se puede deshacer.',
 'prefs-emailconfirm-label' => 'Confirmación de correo electrónico:',
-'prefs-textboxsize' => 'Tamaño de la página de edición',
 'youremail' => 'Correo electrónico:',
 'username' => '{{GENDER:$1|Nombre de usuario|Nombre de usuaria}}:',
 'uid' => 'ID de {{GENDER:$1|usuario|usuaria}}:',
@@ -1552,6 +1610,8 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'prefs-dateformat' => 'Formato de fecha',
 'prefs-timeoffset' => 'Diferencia horaria',
 'prefs-advancedediting' => 'Opciones generales',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Previsualización',
 'prefs-advancedrc' => 'Opciones avanzadas',
 'prefs-advancedrendering' => 'Opciones avanzadas',
 'prefs-advancedsearchoptions' => 'Opciones avanzadas',
@@ -1559,7 +1619,9 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'prefs-displayrc' => 'Opciones de mostrado',
 'prefs-displaysearchoptions' => 'Opciones de visualización',
 'prefs-displaywatchlist' => 'Opciones de visualización',
+'prefs-tokenwatchlist' => 'Clave',
 'prefs-diffs' => 'Diferencias',
+'prefs-help-prefershttps' => 'Esta preferencia tendrá efecto en tu próximo inicio de sesión.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'La dirección de correo electrónico parece ser válida',
@@ -1586,6 +1648,8 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'userrights-notallowed' => 'No tienes permiso para agregar o quitar derechos de usuario.',
 'userrights-changeable-col' => 'Grupos que puedes cambiar',
 'userrights-unchangeable-col' => 'Grupos que no puedes cambiar',
+'userrights-conflict' => '¡Conflicto de cambio de los derechos de usuario! Por favor, revisar y confirmar tus cambios.',
+'userrights-removed-self' => 'Usted eliminado con éxito sus propios derechos. Por lo tanto, usted ya no es capaz de acceder a esta página.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1651,11 +1715,19 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'right-proxyunbannable' => 'Pasar por encima de bloqueos automáticos de proxies',
 'right-unblockself' => 'Desbloquearse uno mismo',
 'right-protect' => 'Cambiar niveles de protección y editar páginas protegidas en cascada',
-'right-editprotected' => 'Editar páginas protegidas (sin la protección «en cascada»)',
+'right-editprotected' => 'Editar páginas protegidas como «{{int:protect-level-sysop}}»',
+'right-editsemiprotected' => 'Editar páginas protegidas como «{{int:protect-level-autoconfirmed}}»',
 'right-editinterface' => 'Editar la interfaz de usuario',
 'right-editusercssjs' => 'Editar las páginas de CSS y JS de otros usuarios',
 'right-editusercss' => 'Editar las páginas de CSS de otros usuarios',
 'right-edituserjs' => 'Editar las páginas de JS de otros usuarios',
+'right-editmyusercss' => 'Editar tus archivos de usuario CSS',
+'right-editmyuserjs' => 'Editar tus propios archivos JavaScript de usuario',
+'right-viewmywatchlist' => 'Ver tu lista de seguimiento',
+'right-editmywatchlist' => 'Editar tu lista de seguimiento. Algunas acciones seguirán agregando páginas aún sin este derecho.',
+'right-viewmyprivateinfo' => 'Ver tu información privada (ej. email, nombre real)',
+'right-editmyprivateinfo' => 'Editar tus propios datos privados (ej: email, nombre real)',
+'right-editmyoptions' => 'Editar tus propias preferencias',
 'right-rollback' => 'Revertir rápidamente las ediciones del último usuario que modificó una página en particular',
 'right-markbotedits' => 'Marcar ediciones deshechas como ediciones de un bot',
 'right-noratelimit' => 'No afectado por límites de frecuencia',
@@ -1717,12 +1789,19 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'action-userrights-interwiki' => 'modificar los derechos de usuarios en otros wikis',
 'action-siteadmin' => 'bloquear o desbloquear la base de datos',
 'action-sendemail' => 'enviar correos electrónicos',
+'action-editmywatchlist' => 'Editar tu lista de seguimiento',
+'action-viewmywatchlist' => 'Ver tu lista de seguimiento',
+'action-viewmyprivateinfo' => 'ver tu información privada',
+'action-editmyprivateinfo' => 'Editar tu información privada',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|cambio|cambios}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|desde la última visita}}',
+'enhancedrc-history' => 'historial',
 'recentchanges' => 'Cambios recientes',
 'recentchanges-legend' => 'Opciones sobre cambios recientes',
 'recentchanges-summary' => 'Sigue los cambios más recientes de la wiki en esta página.',
+'recentchanges-noresult' => 'No hubo cambios durante el período seleccionado que respondan a esos criterios.',
 'recentchanges-feed-description' => 'Realiza un seguimiento de los cambios más recientes en el wiki en este canal.',
 'recentchanges-label-newpage' => 'Esta edición creó una nueva página',
 'recentchanges-label-minor' => 'Esta es una edición menor',
@@ -1759,7 +1838,6 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'recentchangeslinked-feed' => 'Cambios relacionados',
 'recentchangeslinked-toolbox' => 'Cambios relacionados',
 'recentchangeslinked-title' => 'Cambios relacionados con «$1»',
-'recentchangeslinked-noresult' => 'No hubo cambios en las páginas enlazadas durante el periodo indicado.',
 'recentchangeslinked-summary' => "Esta página es una lista de los últimos cambios en las páginas enlazadas desde una página (o en las pertenecientes a una categoría). Las páginas que están en tu [[Special:Watchlist|lista de seguimiento]] aparecen en '''negrita'''.",
 'recentchangeslinked-page' => 'Nombre de la página:',
 'recentchangeslinked-to' => 'Muestra los cambios recientes en lugar de la página indicada',
@@ -1770,7 +1848,7 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'reuploaddesc' => 'Regresar al formulario para subir.',
 'upload-tryagain' => 'Envíe la descripción del archivo modificado',
 'uploadnologin' => 'No has iniciado sesión',
-'uploadnologintext' => 'Tienes que [[Special:UserLogin|iniciar sesión]] para poder subir archivos.',
+'uploadnologintext' => 'Tienes que $1 para subir archivos.',
 'upload_directory_missing' => 'El directorio de subida de archivos ($1) no existe, y no puede ser creado por el servidor.',
 'upload_directory_read_only' => 'El servidor web no puede escribir en el directorio de subida de archivos ($1).',
 'uploaderror' => 'Error al intentar subir archivo',
@@ -1996,7 +2074,6 @@ Para óptima seguridad, img_auth.php está desactivado.',
 'http-read-error' => 'Error de lectura HTTP.',
 'http-timed-out' => 'La solicitud HTTP ha expirado.',
 'http-curl-error' => 'Error al recuperar el URL: $1',
-'http-host-unreachable' => 'No fue posible acceder a la URL.',
 'http-bad-status' => 'Ha habido un problema durante la solicitud HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2025,6 +2102,10 @@ Cuando el usuario la filtra, solo se muestran los archivos cargados por el usuar
 'listfiles_size' => 'Tamaño (bytes)',
 'listfiles_description' => 'Descripción',
 'listfiles_count' => 'Versiones',
+'listfiles-show-all' => 'Incluir versiones antiguas de las imágenes',
+'listfiles-latestversion' => 'Versión actual',
+'listfiles-latestversion-yes' => 'Sí',
+'listfiles-latestversion-no' => 'No',
 
 # File description page
 'file-anchor-link' => 'Archivo',
@@ -2123,6 +2204,13 @@ Entrada: contenttype/subtype, p. ej. <code>image/jpeg</code>.',
 'randompage' => 'Página aleatoria',
 'randompage-nopages' => 'No hay páginas en los siguientes {{PLURAL:$2|espacio de nombre|espacios de nombre}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Página aleatoria en categoría',
+'randomincategory-invalidcategory' => '"$1" no es una categoría válida.',
+'randomincategory-nopages' => 'No hay páginas en la categoría [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => 'Obtener una página aleatoria de categoría: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Ir',
+
 # Random redirect
 'randomredirect' => 'Ir a una redirección cualquiera',
 'randomredirect-nopages' => 'No hay redirecciones en el espacio de nombres «$1».',
@@ -2148,17 +2236,13 @@ Entrada: contenttype/subtype, p. ej. <code>image/jpeg</code>.',
 'statistics-users-active-desc' => 'Usuarios que han ejecutado una acción en {{PLURAL:$1|el último día|los últimos $1 días}}',
 'statistics-mostpopular' => 'Páginas más vistas',
 
-'disambiguations' => 'Páginas que enlazan con páginas de desambiguación',
-'disambiguationspage' => 'Template:Desambiguación',
-'disambiguations-text' => "Las siguientes páginas contienen al menos un enlace a una '''página de desambiguación'''.
-En lugar de ello deberían enlazar a una página más apropiada.<br />
-Una página es considerada página de desambiguación si utiliza la plantilla que está enlazada desde [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Páginas con una propiedad de página',
 'pageswithprop-legend' => 'Páginas con una propiedad de página',
 'pageswithprop-text' => 'Esta página muestra las páginas que usan la propiedad de una página en particular',
 'pageswithprop-prop' => 'Nombre de la propiedad',
 'pageswithprop-submit' => 'Ir',
+'pageswithprop-prophidden-long' => 'hay un largo valor en la propiedad texto oculta ($1)',
+'pageswithprop-prophidden-binary' => 'valor de la propiedad binaria oculta ($1)',
 
 'doubleredirects' => 'Redirecciones dobles',
 'doubleredirectstext' => 'Esta página contiene una lista de páginas que redirigen a otras páginas de redirección.
@@ -2216,6 +2300,7 @@ Las entradas <del>tachadas</del> han sido resueltas.',
 'mostrevisions' => 'Artículos con más ediciones',
 'prefixindex' => 'Todas las páginas con prefijo',
 'prefixindex-namespace' => 'Todas las páginas con el prefijo (espacio de nombres $1)',
+'prefixindex-strip' => 'Prefijo de la hilera en la lista',
 'shortpages' => 'Páginas cortas',
 'longpages' => 'Páginas largas',
 'deadendpages' => 'Páginas sin salida',
@@ -2231,6 +2316,7 @@ Las entradas <del>tachadas</del> han sido resueltas.',
 'listusers' => 'Lista de usuarios',
 'listusers-editsonly' => 'Muestra sólo usuarios con ediciones',
 'listusers-creationsort' => 'Ordenado por fecha de creación',
+'listusers-desc' => 'Ordenar de forma descendente',
 'usereditcount' => '$1 {{PLURAL:$1|edición|ediciones}}',
 'usercreated' => '{{GENDER:$3|Registrado|Registrada}} el $1 a las $2',
 'newpages' => 'Páginas nuevas',
@@ -2406,10 +2492,9 @@ La dirección de correo electrónico que indicaste en [[Special:Preferences|tus
 'unwatchthispage' => 'Dejar de vigilar',
 'notanarticle' => 'No es un artículo',
 'notvisiblerev' => 'La última revisión de un usuario diferente ha sido borrada',
-'watchnochange' => 'Ninguno de los artículos de tu lista de seguimiento fue editado en el periodo de tiempo mostrado.',
 'watchlist-details' => '{{PLURAL:$1|$1 página|$1 páginas}} en su lista de seguimiento, sin contar las de discusión.',
-'wlheader-enotif' => '* La notificación por correo electrónico está activada.',
-'wlheader-showupdated' => "* Las páginas modificadas desde su última visita aparecen en '''negrita'''",
+'wlheader-enotif' => 'La notificación por correo está activada.',
+'wlheader-showupdated' => "Las páginas modificadas desde su última visita aparecen en '''negrita'''.",
 'watchmethod-recent' => 'revisando cambios recientes en páginas vigiladas',
 'watchmethod-list' => 'revisando las páginas vigiladas en busca de cambios recientes',
 'watchlistcontains' => 'Tu lista de seguimiento posee $1 {{PLURAL:$1|página|páginas}}.',
@@ -2653,7 +2738,7 @@ $1',
 'contributions' => 'Contribuciones {{GENDER:$1|del usuario|de la usuaria}}',
 'contributions-title' => 'Contribuciones {{GENDER:$1|del usuario|de la usuaria}} $1',
 'mycontris' => 'Contribuciones',
-'contribsub2' => '$1 ($2)',
+'contribsub2' => 'Para {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'No se encontraron cambios que cumplieran estos criterios.',
 'uctop' => '(edición actual)',
 'month' => 'Desde el mes (y anteriores):',
@@ -2808,13 +2893,11 @@ Consulta la [[Special:BlockList|lista de bloqueos]] para ver la lista de bloqueo
 Sin embargo, está bloqueada como parte del rango $2, que puede ser desbloqueado.',
 'ip_range_invalid' => 'El rango de IP no es válido.',
 'ip_range_toolarge' => 'Los bloqueos de rango superiores a /$1 no están permitidos.',
-'blockme' => 'Bloquearme',
 'proxyblocker' => 'Bloqueador de proxies',
-'proxyblocker-disabled' => 'Esta función está desactivada.',
 'proxyblockreason' => 'Su dirección IP ha sido bloqueada porque es un proxy abierto. Por favor, contacte con su proveedor de servicios de Internet o con su servicio de asistencia técnica e infórmeles de este grave problema de seguridad.',
-'proxyblocksuccess' => 'Hecho.',
 'sorbsreason' => 'Su dirección IP está listada como proxy abierto en DNSBL.',
 'sorbs_create_account_reason' => 'Su dirección IP está listada como proxy abierto en DNSBL. No puede crear una cuenta',
+'xffblockreason' => 'Una dirección IP presente en la cabecera X-Forwarded-For, tuya o del servidor proxy que estás usando, ha sido bloqueada. El motivo original del bloqueo fue: $1',
 'cant-block-while-blocked' => 'No puedes bloquear a otros usuarios mientras estás bloquead{{GENDER:|o|a}}.',
 'cant-see-hidden-user' => 'El usuario que está intentando bloquear ya ha sido bloqueado y oculto. Puesto que usted no tiene el derecho hideuser, usted no puede ver o editar los bloqueos del usuario.',
 'ipbblocked' => 'No puedes bloquear o desbloquear a otros usuarios porque estás bloqueado',
@@ -2976,6 +3059,8 @@ Por favor visita [//www.mediawiki.org/wiki/Localisation Localización MediaWiki]
 'thumbnail-more' => 'Aumentar',
 'filemissing' => 'Falta archivo',
 'thumbnail_error' => 'Error al crear miniatura: $1',
+'thumbnail_error_remote' => 'Mensaje de error de  $1 :
+$2',
 'djvu_page_error' => 'Página DjVu fuera de rango',
 'djvu_no_xml' => 'Imposible obtener XML para el archivo DjVu',
 'thumbnail-temp-create' => 'No se ha podido crear el archivo temporal de la miniatura',
@@ -3128,17 +3213,11 @@ Permite añadir una razón al resumen de edición.',
 
 # Stylesheets
 'common.css' => '/* El CSS colocado en esta página será aplicado a todas las apariencias */',
-'standard.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Standard" */',
-'nostalgia.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Nostalgia" */',
 'cologneblue.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Cologne Blue" */',
 'monobook.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "MonoBook" */',
-'myskin.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "MySkin" */',
-'chick.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel ""Chick" */',
-'simple.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Simple" */',
 'modern.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Modern" */',
 'vector.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Vector" */',
 'print.css' => '/* Los estilos CSS colocados aquí afectarán la impresión */',
-'handheld.css' => '/* Los estilos CSS colocados aquí afectarán a los dispositivos móviles basados en las pieles configuradas en $wgHandheldStyle */',
 'noscript.css' => '/* Los estilos CSS colocados aquí se aplicarán a los usuarios que hayan desactivado el JavaScript en su navegador */',
 'group-autoconfirmed.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Usuarios autoconfirmados */',
 'group-bot.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Bots */',
@@ -3147,13 +3226,8 @@ Permite añadir una razón al resumen de edición.',
 
 # Scripts
 'common.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */',
-'standard.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Estandar */',
-'nostalgia.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Nostalgia. */',
 'cologneblue.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Colonia azul */',
 'monobook.js' => '/* El código JavaScript que se ponga aquí será cargado por los usuarios de la piel MonoBook */',
-'myskin.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Mi piel */',
-'chick.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Pollito */',
-'simple.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Simple */',
 'modern.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Moderna */',
 'vector.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Vector */',
 'group-autoconfirmed.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Usuarios autoconfirmados */',
@@ -3234,13 +3308,8 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
 'pageinfo-category-files' => 'Número de archivos',
 
 # Skin names
-'skinname-standard' => 'Estándar',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Colonia azul',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Mi piel',
-'skinname-chick' => 'Pollito',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Moderna',
 'skinname-vector' => 'Vector',
 
@@ -3324,11 +3393,25 @@ Ejecutarlo podría comprometer la seguridad de su equipo.",
 'minutes' => '{{PLURAL:$1|un minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|una hora|$1 horas}}',
 'days' => '{{PLURAL:$1|un día|$1 días}}',
+'weeks' => '{{PLURAL:$1|$1 semana|$1 semanas}}',
 'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
 'years' => '{{PLURAL:$1|$1 año|$1 años}}',
 'ago' => 'hace $1',
 'just-now' => 'Ahora mismo',
 
+# Human-readable timestamps
+'hours-ago' => 'hace $1 {{PLURAL:$1|hora|horas}}',
+'minutes-ago' => 'hace {{PLURAL:$1|un minuto|$1 minutos}}',
+'seconds-ago' => 'hace $1 {{PLURAL:$1|segundo|segundos}}',
+'monday-at' => 'El lunes a las $1',
+'tuesday-at' => 'El martes a las $1',
+'wednesday-at' => 'El miércoles a las $1',
+'thursday-at' => 'El jueves a las $1',
+'friday-at' => 'El viernes a las $1',
+'saturday-at' => 'El sábado a las $1',
+'sunday-at' => 'El domingo a las $1',
+'yesterday-at' => 'Ayer a las $1',
+
 # Bad image list
 'bad_image_list' => 'El formato es el siguiente:
 
@@ -3357,7 +3440,7 @@ Existen otros campos que se mantendrán ocultos por defecto.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Anchura',
 'exif-imagelength' => 'Altura',
 'exif-bitspersample' => 'Bits por componente',
@@ -3535,7 +3618,7 @@ Existen otros campos que se mantendrán ocultos por defecto.
 'exif-originalimageheight' => 'Altura de la imagen antes de que fuera recortada',
 'exif-originalimagewidth' => 'Ancho de la imagen antes de que fuera recortada',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sin comprimir',
 'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
 'exif-compression-3' => 'Codificación de fax CCITT grupo 3',
@@ -3923,7 +4006,6 @@ También puedes [[Special:EditWatchlist|usar el editor estándar]].',
 'version-other' => 'Otro',
 'version-mediahandlers' => 'Manejadores multimedia',
 'version-hooks' => 'Extensiones',
-'version-extension-functions' => 'Funciones de extensiones',
 'version-parser-extensiontags' => 'Etiquetas de extensiones sintácticas',
 'version-parser-function-hooks' => 'Extensiones de funciones sintácticas',
 'version-hook-name' => 'Nombre de la extensión',
@@ -3932,6 +4014,7 @@ También puedes [[Special:EditWatchlist|usar el editor estándar]].',
 'version-license' => 'Licencia',
 'version-poweredby-credits' => "Este wiki funciona gracias a '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'otros',
+'version-poweredby-translators' => 'Traductores de translatewiki.net',
 'version-credits-summary' => 'Queremos reconocer a las siguientes personas por su contribución a [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki es software libre; puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia General Pública de GNU como la publica la Free Software Foundation; ya sea la versión 2 de la licencia, o (a tu elección) cualquier versión posterior.
 
@@ -3947,12 +4030,17 @@ Has recibido [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Licencia Pública
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Ruta del artículo]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Ruta de la secuencia de comandos (script)]',
 
-# Special:FilePath
-'filepath' => 'Ruta de archivo',
-'filepath-page' => 'Archivo:',
-'filepath-submit' => 'Ir',
-'filepath-summary' => 'Esta página devuelve la ruta completa de un archivo.
-Las imágenes se muestran en resolución máxima, otros tipos de archivo se inician directamente con su programa asociado.',
+# Special:Redirect
+'redirect' => 'Redirigir por archivo, usuario o ID de revisión',
+'redirect-legend' => 'Redirigir a un archivo o página',
+'redirect-summary' => 'Esta página especial redirige a un fichero (dado un nombre de fichero), a una página (dado un identificador de revisión) o a una página de usuario (dado en identificador numérico de usuario).',
+'redirect-submit' => 'Ir',
+'redirect-lookup' => 'Buscar:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'Id. del usuario',
+'redirect-revision' => 'Revisión de página',
+'redirect-file' => 'Nombre de fichero',
+'redirect-not-exists' => 'No se encontró el valor',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Búsqueda de archivos duplicados',
@@ -4002,12 +4090,15 @@ Las imágenes se muestran en resolución máxima, otros tipos de archivo se inic
 'tags' => 'Cambio de etiquetas válida',
 'tag-filter' => 'Filtro de [[Special:Tags|etiquetas]]:',
 'tag-filter-submit' => 'Filtro',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)',
 'tags-title' => 'Etiquetas',
 'tags-intro' => 'Esta página lista las etiquetas con las que el software puede marcar una edición y su significado.',
 'tags-tag' => 'Nombre de etiqueta',
 'tags-display-header' => 'Apariencia de la lista de cambios',
 'tags-description-header' => 'Descripción completa de significado',
+'tags-active-header' => '¿Activo?',
 'tags-hitcount-header' => 'Cambios etiquetados',
+'tags-active-yes' => 'Sí',
 'tags-edit' => 'editar',
 'tags-hitcount' => '$1 {{PLURAL:$1|cambio|cambios}}',
 
@@ -4028,6 +4119,7 @@ Las imágenes se muestran en resolución máxima, otros tipos de archivo se inic
 'dberr-problems' => 'Lo sentimos. Este sitio está experimentando dificultades técnicas.',
 'dberr-again' => 'Prueba a recargar dentro de unos minutos.',
 'dberr-info' => '(No se puede contactar con la base de datos del servidor: $1)',
+'dberr-info-hidden' => '(No se puede contactar con la base de datos del servidor)',
 'dberr-usegoogle' => 'Mientras tanto puedes probar buscando a través de Google.',
 'dberr-outofdate' => 'Ten en cuenta que su índice de nuestro contenido puede estar desactualizado.',
 'dberr-cachederror' => 'La siguiente es una página guardada de la página solicitada, y puede no estar actualizada.',
@@ -4043,6 +4135,9 @@ Las imágenes se muestran en resolución máxima, otros tipos de archivo se inic
 'htmlform-submit' => 'Enviar',
 'htmlform-reset' => 'Deshacer cambios',
 'htmlform-selectorother-other' => 'Otro',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Sí',
+'htmlform-chosen-placeholder' => 'Selecciona una opción',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con soporte para búsqueda de texto completo',
@@ -4161,4 +4256,19 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
 # Image rotation
 'rotate-comment' => 'Imagen girada por $1 {{PLURAL:$1|grado|grados}} en el sentido de las agujas del reloj',
 
+# Limit report
+'limitreport-title' => 'Datos de perfilado del analizador:',
+'limitreport-cputime' => 'Tiempo de uso de CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-walltime' => 'Tiempo real de uso',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-ppvisitednodes' => 'N.º de nodos visitados por el preprocesador',
+'limitreport-ppgeneratednodes' => 'N.º de nodos generados por el preprocesador',
+'limitreport-postexpandincludesize' => 'Tamaño de inclusión posexpansión',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Argumento del tamaño de la plantilla',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => 'Profundidad máxima de expansión',
+'limitreport-expensivefunctioncount' => 'Cuenta de la funcion expansiva del analizador',
+
 );
diff --git a/languages/messages/MessagesEt.php b/languages/messages/MessagesEt.php
index a0a42b24..505d0903 100644
--- a/languages/messages/MessagesEt.php
+++ b/languages/messages/MessagesEt.php
@@ -9,6 +9,7 @@
  *
  * @author Avjoska
  * @author Cylly1512
+ * @author Geitost
  * @author Hendrik
  * @author Hendrix
  * @author Jaan513
@@ -18,6 +19,7 @@
  * @author Ker
  * @author Kyng
  * @author Morel
+ * @author Nemo bis
  * @author Oop
  * @author Pikne
  * @author Silvar
@@ -105,6 +107,7 @@ $specialPageAliases = array(
 	'Myuploads'                 => array( 'Minu_üleslaaditu' ),
 	'Newimages'                 => array( 'Uued_failid' ),
 	'Newpages'                  => array( 'Uued_leheküljed' ),
+	'PagesWithProp'             => array( 'Atribuudiga_leheküljed' ),
 	'PasswordReset'             => array( 'Parooli_lähtestamine' ),
 	'PermanentLink'             => array( 'Püsilink' ),
 	'Popularpages'              => array( 'Loetumad_leheküljed' ),
@@ -320,9 +323,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Näita jälgivate kasutajate hulka',
 'tog-oldsig' => 'Praegune allkiri:',
 'tog-fancysig' => 'Kasuta vikiteksti vormingus allkirja (ilma automaatse lingita kasutajalehele)',
-'tog-externaleditor' => 'Kasuta vaikimisi välist redaktorit (ainult asjatundjatele, tarvis arvuti eriseadistust – [//www.mediawiki.org/wiki/Manual:External_editors lisateave])',
-'tog-externaldiff' => 'Kasuta vaikimisi välist võrdlusvahendit (ainult asjatundjatele, tarvis arvuti eriseadistust – [//www.mediawiki.org/wiki/Manual:External_editors lisateave])',
-'tog-showjumplinks' => 'Kuva lehekülje ülaservas "mine"-lingid',
 'tog-uselivepreview' => 'Kasuta elavat eelvaadet (katseline)',
 'tog-forceeditsummary' => 'Nõua redigeerimisel resümee välja täitmist',
 'tog-watchlisthideown' => 'Peida minu redaktsioonid jälgimisloendist',
@@ -335,6 +335,8 @@ $messages = array(
 'tog-diffonly' => 'Ära näita erinevuste vaate all lehe sisu',
 'tog-showhiddencats' => 'Näita peidetud kategooriaid',
 'tog-norollbackdiff' => 'Ära näita erinevusi pärast tühistamist',
+'tog-useeditwarning' => 'Hoiata mind, kui lahkun redigeerimisleheküljelt muudatusi salvestamata',
+'tog-prefershttps' => 'Kasuta sisselogimisel alati turvalist ühendust',
 
 'underline-always' => 'Alati',
 'underline-never' => 'Mitte kunagi',
@@ -398,6 +400,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dets',
+'january-date' => '$1. jaanuar',
+'february-date' => '$1. veebruar',
+'march-date' => '$1. märts',
+'april-date' => '$1. aprill',
+'may-date' => '$1. mai',
+'june-date' => '$1. juuni',
+'july-date' => '$1. juuli',
+'august-date' => '$1. august',
+'september-date' => '$1. september',
+'october-date' => '$1. oktoober',
+'november-date' => '$1. november',
+'december-date' => '$1. detsember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategooria|Kategooriad}}',
@@ -479,6 +493,7 @@ $messages = array(
 'create-this-page' => 'Loo see lehekülg',
 'delete' => 'Kustuta',
 'deletethispage' => 'Kustuta see lehekülg',
+'undeletethispage' => 'Taasta see lehekülg',
 'undelete_short' => 'Taasta {{PLURAL:$1|üks muudatus|$1 muudatust}}',
 'viewdeleted_short' => 'Vaata {{PLURAL:$1|üht|$1}} kustutatud redaktsiooni',
 'protect' => 'Kaitse',
@@ -520,7 +535,7 @@ Palun oota hetk, enne kui uuesti proovid.
 $1',
 'pool-errorunknown' => 'Teadmata tõrge',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{GRAMMAR:genitive|{{SITENAME}}}} tiitelandmed',
 'aboutpage' => 'Project:Tiitelandmed',
 'copyright' => 'Sisu on kasutatav litsentsi $1 tingimustel, kui pole öeldud teisiti.',
@@ -530,7 +545,6 @@ $1',
 'disclaimers' => 'Hoiatused',
 'disclaimerpage' => 'Project:Hoiatused',
 'edithelp' => 'Redigeerimisjuhend',
-'edithelppage' => 'Help:Kuidas_lehte_redigeerida',
 'helppage' => 'Help:Sisukord',
 'mainpage' => 'Esileht',
 'mainpage-description' => 'Esileht',
@@ -560,7 +574,6 @@ Vaata [[Special:Version|versiooni lehekülge]].',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|viimane muudatus|viimased muudatused}}',
 'youhavenewmessagesmulti' => 'Sulle on uusi sõnumeid $1',
 'editsection' => 'muuda',
-'editsection-brackets' => '[$1]',
 'editold' => 'redigeeri',
 'viewsourceold' => 'vaata lähteteksti',
 'editlink' => 'redigeeri',
@@ -610,17 +623,12 @@ Käibel olevad erileheküljed on loetletud leheküljel [[Special:SpecialPages|{{
 # General errors
 'error' => 'Viga',
 'databaseerror' => 'Andmebaasi viga',
-'dberrortext' => 'Andmebaasipäringus oli süntaksiviga.
-Selle võis tingida tarkvaraviga.
-Viimane andmebaasipäring oli:
-<blockquote><code>$1</code></blockquote>
-ja see ilmnes funktsiooniga "<code>$2</code>".
-Andmebaas tagastas veateate "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Andmebaasipäringus oli süntaksiviga.
-Viimane andmebaasipäring oli:
-"$1"
-ja see kutsuti funktsioonist "$2".
-Andmebaas tagastas veateate "$3: $4".',
+'databaseerror-text' => 'Esines andmebaasipäringu tõrge.
+See võib viidata veale tarkvaras.',
+'databaseerror-textcl' => 'Esines andmebaasipäringu tõrge.',
+'databaseerror-query' => 'Päring: $1',
+'databaseerror-function' => 'Funktsioon: $1',
+'databaseerror-error' => 'Tõrge: $1',
 'laggedslavemode' => 'Hoiatus: Leheküljel võivad puududa viimased uuendused.',
 'readonly' => 'Andmebaas on hetkel kirjutuskaitse all',
 'enterlockreason' => 'Sisesta lukustamise põhjus ning juurdepääsu taastamise ligikaudne aeg',
@@ -674,12 +682,15 @@ Et lisada ja muuta tõlkeid kõigi vikide jaoks, kasuta palun MediaWiki lokalise
 'editinginterface' => "'''Hoiatus:''' Redigeerid tarkvara kasutajaliidese tekstiga lehekülge.
 Muudatused siin mõjutavad kõikide selle viki kasutajate kasutajaliidest.
 Et lisada ja muuta tõlkeid kõigi vikide jaoks, kasuta palun MediaWiki lokaliseerimisprojekti [//translatewiki.net/ translatewiki.net].",
-'sqlhidden' => '(SQL päring peidetud)',
 'cascadeprotected' => 'See lehekülg on muutmise eest kaitstud, sest see on osa {{PLURAL:$1|järgmisest leheküljest|järgmistest lehekülgedest}}, mis on kaskaadkaitse all:
 $2',
 'namespaceprotected' => "Sul pole õigust redigeerida lehekülgi nimeruumis '''$1'''.",
 'customcssprotected' => 'Sul pole õigust seda CSS-lehekülge redigeerida, sest see sisaldab teise kasutaja isiklikke sätteid.',
 'customjsprotected' => 'Sul pole õigust seda JavaScripti lehekülge redigeerida, sest see sisaldab teise kasutaja isiklikke sätteid.',
+'mycustomcssprotected' => 'Sul pole õigust redigeerida seda CSS-lehekülge.',
+'mycustomjsprotected' => 'Sul pole õigust redigeerida seda JavaScript-lehekülge.',
+'myprivateinfoprotected' => 'Sul pole lubatud oma eraandmeid redigeerida.',
+'mypreferencesprotected' => 'Sul pole lubatud oma eelistusi muuta.',
 'ns-specialprotected' => 'Erilehekülgi ei saa redigeerida.',
 'titleprotected' => "Kasutaja [[User:$1|$1]] on selle pealkirjaga lehe loomise keelanud esitades järgmise põhjenduse: ''$2''.",
 'filereadonlyerror' => 'Faili "$1" ei saa muuta, sest hoidla "$2" on kirjutuskaitstud.
@@ -703,10 +714,19 @@ Pane tähele, et seni kuni sa pole oma võrgulehitseja puhvrit tühjendanud, võ
 'welcomecreation-msg' => 'Sinu konto on loodud.
 Ära unusta seada oma {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|eelistusi]].',
 'yourname' => 'Kasutajanimi:',
+'userlogin-yourname' => 'Kasutajanimi',
+'userlogin-yourname-ph' => 'Sisesta oma kasutajanimi',
+'createacct-another-username-ph' => 'Sisesta kasutajanimi',
 'yourpassword' => 'Parool:',
+'userlogin-yourpassword' => 'Parool',
+'userlogin-yourpassword-ph' => 'Sisesta oma parool',
+'createacct-yourpassword-ph' => 'Sisesta parool',
 'yourpasswordagain' => 'Sisesta parool uuesti:',
+'createacct-yourpasswordagain' => 'Parooli kinnitus',
+'createacct-yourpasswordagain-ph' => 'Sisesta uuesti parool',
 'remembermypassword' => 'Jäta parool meelde (kuni $1 {{PLURAL:$1|päevaks|päevaks}})',
-'securelogin-stick-https' => 'Jätka pärast sisselogimist HTTPS-ühenduse kasutamist',
+'userlogin-remembermypassword' => 'Jää sisseloginuks',
+'userlogin-signwithsecure' => 'Kasuta turvalist ühendust',
 'yourdomainname' => 'Sinu domeen:',
 'password-change-forbidden' => 'Selles vikis ei saa paroole muuta.',
 'externaldberror' => 'Esines autentimistõrge või sul pole õigust konto andmeid muuta.',
@@ -718,18 +738,44 @@ Pane tähele, et seni kuni sa pole oma võrgulehitseja puhvrit tühjendanud, võ
 'logout' => 'Logi välja',
 'userlogout' => 'Logi välja',
 'notloggedin' => 'Sisse logimata',
+'userlogin-noaccount' => 'Kas sul pole kontot?',
+'userlogin-joinproject' => 'Ühine projektiga {{SITENAME}}',
 'nologin' => 'Kas sul pole kontot? $1.',
 'nologinlink' => 'Registreeru siin',
 'createaccount' => 'Loo uus konto',
 'gotaccount' => "Kui sul on juba konto, '''$1'''.",
 'gotaccountlink' => 'logi sisse',
 'userlogin-resetlink' => 'Kas oled unustanud oma sisselogimisandmed?',
+'userlogin-resetpassword-link' => 'Lähtesta oma parool',
+'helplogin-url' => 'Help:Sisselogimine',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Sisselogimisabi]]',
+'userlogin-loggedin' => 'Oled juba sisse logitud nimega {{GENDER:$1|$1}}.
+Kasuta allolevat vormi, et logida sisse teise kasutajaga.',
+'userlogin-createanother' => 'Loo teine konto',
+'createacct-join' => 'Sisesta allapoole oma andmed.',
+'createacct-another-join' => 'Sisesta allpool uue konto andmed.',
+'createacct-emailrequired' => 'E-posti aadress',
+'createacct-emailoptional' => 'E-posti aadress (valikuline)',
+'createacct-email-ph' => 'Sisesta oma e-posti aadress',
+'createacct-another-email-ph' => 'Sisesta e-posti aadress',
 'createaccountmail' => 'Kasuta juhuslikku parooli ja saada see määratud e-posti aadressile',
+'createacct-realname' => 'Pärisnimi (valikuline)',
 'createaccountreason' => 'Põhjus:',
+'createacct-reason' => 'Põhjus',
+'createacct-reason-ph' => 'Miks lood teist kontot?',
+'createacct-captcha' => 'Turvakontroll',
+'createacct-imgcaptcha-ph' => 'Sisesta ülalnähtav tekst',
+'createacct-submit' => 'Loo oma konto',
+'createacct-another-submit' => 'Loo teine konto',
+'createacct-benefit-heading' => '{{SITENAME}} on sinusuguste inimeste tehtud.',
+'createacct-benefit-body1' => '{{PLURAL:$1|muudatus|muudatust}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|lehekülg|lehekülge}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|hiljutine kaastööline|hiljutist kaastöölist}}',
 'badretype' => 'Sisestatud paroolid ei lange kokku.',
 'userexists' => 'Sisestatud kasutajanimi on juba kasutusel.
 Palun valige uus nimi.',
 'loginerror' => 'Viga sisselogimisel',
+'createacct-error' => 'Tõrge konto loomisel',
 'createaccounterror' => 'Kasutajakonto loomine ebaõnnestus: $1',
 'nocookiesnew' => 'Kasutajakonto loodi, aga sa ei ole sisse logitud, sest {{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja logi siis oma vastse kasutajanime ning parooliga sisse.',
 'nocookieslogin' => '{{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja proovi siis uuesti.',
@@ -781,11 +827,13 @@ Ole hea ja sisesta õige e-posti aadress või jäta väli tühjaks.',
 
 Kui kasutajakonto loomine on eksitus, võid käesolevat sõnumit lihtsalt eirata.',
 'usernamehasherror' => 'Kasutajanimi ei või sisaldada trellimärke ("#").',
-'login-throttled' => 'Oled lühikese aja jooksul liiga palju äpardunud logimiskatseid sooritanud.
-Palun pea nüüd pisut vahet.',
+'login-throttled' => 'Oled lühikese aja jooksul proovinud liiga palju kordi sisse logida.
+Palun oota $1, enne kui uuesti proovid.',
 'login-abort-generic' => 'Sisselogimine ebaõnnestus – Katkestatud',
 'loginlanguagelabel' => 'Keel: $1',
 'suspicious-userlogout' => 'Sinu väljalogimiskatse nurjus, sest see näis olevat katkise veebilehitseja või puhverserveri saadetud.',
+'createacct-another-realname-tip' => 'Tegelik nimi on valikuline.
+Kui otsustad selle sisestada, kasutatakse seda kasutaja töö temale omistamiseks.',
 
 # Email sending
 'php-mail-error-unknown' => 'Tundmatu tõrge PHP funktsioonis mail().',
@@ -802,8 +850,8 @@ Sisselogimise lõpetamiseks pead siia uue parooli sisestama:',
 'newpassword' => 'Uus parool:',
 'retypenew' => 'Sisesta uus parool uuesti:',
 'resetpass_submit' => 'Sisesta parool ja logi sisse',
-'resetpass_success' => 'Sinu parool on edukalt muudetud!
-Sisselogimine...',
+'changepassword-success' => 'Sinu parool on edukalt muudetud!
+Sind logitakse nüüd sisse...',
 'resetpass_forbidden' => 'Paroole ei saa muuta',
 'resetpass-no-info' => 'Pead olema sisselogitud, et sellele lehele pääseda.',
 'resetpass-submit-loggedin' => 'Muuda parool',
@@ -815,10 +863,11 @@ Võib-olla oled juba edukalt muudnud oma salasõna või taotlenud uut ajutist sa
 
 # Special:PasswordReset
 'passwordreset' => 'Parooli lähtestamine',
-'passwordreset-text' => 'Täida see vorm, et oma parool lähtestada.',
+'passwordreset-text-one' => 'Täida see vorm, et oma parool lähtestada.',
+'passwordreset-text-many' => '{{PLURAL:$1|Täida üks väljadest, et oma parool lähtestada.}}',
 'passwordreset-legend' => 'Parooli lähtestamine',
 'passwordreset-disabled' => 'Selles vikis on paroolide lähtestamine keelatud.',
-'passwordreset-pretext' => '{{PLURAL:$1||Sisesta üks järgmistest andmeüksustest.}}',
+'passwordreset-emaildisabled' => 'E-posti funktsioonid on selles vikis keelatud.',
 'passwordreset-username' => 'Kasutajanimi:',
 'passwordreset-domain' => 'Domeen:',
 'passwordreset-capture' => 'Näita lähetatavat e-kirja?',
@@ -841,7 +890,7 @@ Peaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi
 Ajutine parool: $2',
 'passwordreset-emailsent' => 'Parooli lähtestamise e-kiri on saadetud.',
 'passwordreset-emailsent-capture' => 'E-kirjatsi on saadetud allpool näidatav parooli lähtestuskiri.',
-'passwordreset-emailerror-capture' => 'Koostati allpool näidatav meeldetuletus, aga selle e-kirjatsi kasutajale saatmine ebaõnnestus: $1',
+'passwordreset-emailerror-capture' => 'Koostati allpool näidatav parooli lähtestuskiri, aga selle e-kirjatsi {{GENDER:$2|kasutajale}} saatmine ebaõnnestus: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-posti aadressi muutmine',
@@ -855,6 +904,19 @@ Ajutine parool: $2',
 'changeemail-submit' => 'Muuda e-posti aadress',
 'changeemail-cancel' => 'Loobu',
 
+# Special:ResetTokens
+'resettokens' => 'Lubade lähtestamine',
+'resettokens-text' => 'Saad lähtestada load, mida on vaja siin sinu kontoga seotud kindlatele eraandmetele ligipääsuks.
+
+Peaksid load lähtestama, kui jagasid neid kogemata või kui su konto on kellegi teise võimusesse sattunud.',
+'resettokens-no-tokens' => 'Lähtestatavad load puuduvad.',
+'resettokens-legend' => 'Lubade lähtestamine',
+'resettokens-tokens' => 'Load:',
+'resettokens-token-label' => '$1 (praegune väärtus: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|Jälgimisloendis olevatel lehekülgedel tehtud muudatuste]] võrgutoite (Atom/RSS) luba',
+'resettokens-done' => 'Load lähtestatud.',
+'resettokens-resetbutton' => 'Lähtesta valitud load',
+
 # Edit page toolbar
 'bold_sample' => 'Rasvane kiri',
 'bold_tip' => 'Rasvane kiri',
@@ -1052,11 +1114,14 @@ Allpool on esitatud lehekülje kustutamis- ja teisaldamislogi.',
 Tundub, et see on kustutatud.',
 'edit-conflict' => 'Redigeerimiskonflikt.',
 'edit-no-change' => 'Sinu redigeerimist ignoreeriti, sest tekstile ei olnud tehtud muudatusi.',
+'postedit-confirmation' => 'Sinu muudatus on salvestatud.',
 'edit-already-exists' => 'Ei saanud alustada uut lehekülge.
 See on juba olemas.',
 'defaultmessagetext' => 'Sõnumi vaiketekst',
 'invalid-content-data' => 'Vigased sisuandmed',
 'content-not-allowed-here' => 'Lehekülg [[$2]] ei või sisaldada $1.',
+'editwarning-warning' => 'Sellelt leheküljelt lahkumise tõttu võivad tehtud muudatused kaotsi minna.
+Kui oled sisse loginud, saad selle hoiatuse eelistuste alaosas "Toimetamine" keelata.',
 
 # Content models
 'content-model-wikitext' => 'vikiteksti',
@@ -1086,6 +1151,7 @@ Need argumendid on välja jäetud.",
 'undo-failure' => 'Muudatust ei saa vahapeal tehtud redigeerimiste tõttu tühistada.',
 'undo-norev' => 'Muudatust ei saanud tühistada, kuna seda ei ole või see kustutati.',
 'undo-summary' => 'Eemaldatud muudatus $1, mille tegi [[Special:Contributions/$2|$2]] ([[User talk:$2|arutelu]])',
+'undo-summary-username-hidden' => 'Eemaldatud redaktsioon $1, mille tegi peidetud kasutaja',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Ei saa kontot luua',
@@ -1167,10 +1233,10 @@ Saad seda muudatust vaadata. [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAG
 'revdelete-no-file' => 'Faili ei ole.',
 'revdelete-show-file-confirm' => 'Kas oled kindel, et soovid häha faili "<nowiki>$1</nowiki>" kustutatud redaktsiooni, mis tehti $2 kell $3?',
 'revdelete-show-file-submit' => 'Jah',
-'revdelete-selected' => "'''{{PLURAL:$2|Valitud versioon|Valitud versioonid}} artiklist [[:$1]]:'''",
+'revdelete-selected' => "'''Valitud {{PLURAL:$2|redaktsioon|redaktsioonid}} leheküljest [[:$1]]:'''",
 'logdelete-selected' => "'''Valitud {{PLURAL:$1|logisissekanne|logisissekanded}}:'''",
-'revdelete-text' => "'''Kustutatud redaktsioonid kajastuvad endiselt lehe ajaloos ja logides, kuid osa nende sisust pole tavakasutajatele nähtav.'''
-{{GRAMMAR:genitive|{{SITENAME}}}} administraatorid saavad varjatud sisu siiski vaadata ning seda vajadusel taastada, kui see pole just täiendavalt ära keelatud.",
+'revdelete-text' => "'''Kustutatud redaktsioonid ja sündmused kajastuvad endiselt lehekülje ajaloos ja logides, kuid osa nende sisust pole avalikult nähtav.'''
+{{GRAMMAR:genitive|{{SITENAME}}}} administraatorid saavad peidetud sisu siiski vaadata ning seda vajadusel selle liidese kaudu taastada, kui see pole just täiendavalt keelatud.",
 'revdelete-confirm' => 'Kinnita, et soovid tõesti seda teha ning et saad aru tagajärgedest ja tegevus on kooskõlas [[{{MediaWiki:Policy-url}}|siinsete kokkulepetega]].',
 'revdelete-suppress-text' => "Andmed tuleks varjata '''ainult''' järgnevatel juhtudel:
 * Sobimatu isiklik teave
@@ -1266,6 +1332,7 @@ Pane tähele, et navigeerimislinkide kasutamine lähtestab redaktsioonide valiku
 'compareselectedversions' => 'Võrdle valitud redaktsioone',
 'showhideselectedversions' => 'Muuda valitud redaktsioonide nähtavust',
 'editundo' => 'eemalda',
+'diff-empty' => '(Erinevus puudub)',
 'diff-multi' => '({{PLURAL:$1|Ühte|$1}} vahepealset {{PLURAL:$2|ühe|$2}} kasutaja redaktsiooni ei näidata.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ühte|$1}} vahepealset rohkem kui {{PLURAL:$2|ühe|$2}} kasutaja redaktsiooni ei näidata.)',
 'difference-missing-revision' => 'Selle erinevuste vaate {{PLURAL:$2|üht|$2}} redaktsiooni ($1) ei leitud.
@@ -1293,7 +1360,6 @@ Harilikult tähendab see seda, et sind siia juhatanud link on vananenud ja siin
 'searchmenu-legend' => 'Otsingu sätted',
 'searchmenu-exists' => "'''Lehekülg pealkirjaga \"[[:\$1]]\" on olemas.'''",
 'searchmenu-new' => "'''Loo lehekülg pealkirjaga \"[[:\$1]]\".'''",
-'searchhelp-url' => 'Help:Sisukord',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sirvi selle eesliitega lehekülgi]]',
 'searchprofile-articles' => 'Sisuleheküljed',
 'searchprofile-project' => 'Abi- ja projektilehed',
@@ -1338,15 +1404,7 @@ päringu ees prefiksit ''all:''. Konkreetsest nimeruumist otsimiseks kasuta pref
 'searchdisabled' => "Otsimine on preagu keelatud.
 Vahepeal saad otsimiseks Google'it kasutada.
 Pane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võib olla iganenud.",
-
-# Quickbar
-'qbsettings' => 'Kiirriba',
-'qbsettings-none' => 'Puudub',
-'qbsettings-fixedleft' => 'Püsivalt vasakul',
-'qbsettings-fixedright' => 'Püsivalt paremal',
-'qbsettings-floatingleft' => 'Ujuvalt vasakul',
-'qbsettings-floatingright' => 'Ujuvalt paremal',
-'qbsettings-directionality' => 'Fikseeritud, tulenevalt sinu keeles kasutatava kirja suunast',
+'search-error' => 'Otsimise ajal ilmnes tõrge: $1',
 
 # Preferences page
 'preferences' => 'Eelistused',
@@ -1380,7 +1438,6 @@ Pane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võ
 'resetprefs' => 'Lähtesta eelistused',
 'restoreprefs' => 'Taasta kõik vaike-eelistused (kõigil kaartidel)',
 'prefs-editing' => 'Toimetamine',
-'prefs-edit-boxsize' => 'Toimetamise akna suurus.',
 'rows' => 'Ridu:',
 'columns' => 'Veerge:',
 'searchresultshead' => 'Otsingutulemite sätted',
@@ -1391,9 +1448,9 @@ Pane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võ
 'recentchangesdays-max' => 'Ülemmäär $1 {{PLURAL:$1|päev|päeva}}',
 'recentchangescount' => 'Mitut redaktsiooni vaikimisi näidata:',
 'prefs-help-recentchangescount' => 'See käib viimaste muudatuste, lehekülgede ajalugude ja logide kohta.',
-'prefs-help-watchlist-token' => 'Selle välja täitmine tekitab sinu jälgimisloendile RSS-toite.
-Igaüks, kes teab sellel väljal olevat võtit, saab lugeda sinu jälgimisloendit, seega vali turvaline väärtus.
-Siin on juhuslik väärtus, mida saad kasutada: $1',
+'prefs-help-watchlist-token2' => 'See on sinu jälgimisloendi võrgutoite salavõti.
+Igaüks, kes seda teab, saab lugeda sinu jälgimisloendit. Seega ära jaga seda.
+[[Special:ResetTokens|Klõpsa siia, kui sul on vaja see lähtestada]].',
 'savedprefs' => 'Sinu eelistused on salvestatud.',
 'timezonelegend' => 'Ajavöönd:',
 'localtime' => 'Kohalik aeg:',
@@ -1424,7 +1481,6 @@ Siin on juhuslik väärtus, mida saad kasutada: $1',
 'prefs-reset-intro' => 'Sellel leheküljel saad oma eelistused lähtestada võrgukoha vaike-eelistusteks.
 Toimingut ei saa hiljem tühistada.',
 'prefs-emailconfirm-label' => 'E-posti kinnitus:',
-'prefs-textboxsize' => 'Toimetamisakna suurus',
 'youremail' => 'E-posti aadress:',
 'username' => '{{GENDER:$1|Kasutajanimi}}:',
 'uid' => '{{GENDER:$1|Kasutaja}} ID:',
@@ -1458,6 +1514,8 @@ See teave on avalik.',
 'prefs-dateformat' => 'Kuupäeva vorming',
 'prefs-timeoffset' => 'Ajavahe',
 'prefs-advancedediting' => 'Üldsuvandid',
+'prefs-editor' => 'Redaktor',
+'prefs-preview' => 'Eelvaade',
 'prefs-advancedrc' => 'Täpsemad eelistused',
 'prefs-advancedrendering' => 'Täpsemad eelistused',
 'prefs-advancedsearchoptions' => 'Täpsemad eelistused',
@@ -1465,7 +1523,9 @@ See teave on avalik.',
 'prefs-displayrc' => 'Kuvasätted',
 'prefs-displaysearchoptions' => 'Kuvasätted',
 'prefs-displaywatchlist' => 'Kuvasätted',
+'prefs-tokenwatchlist' => 'Luba',
 'prefs-diffs' => 'Erinevused',
+'prefs-help-prefershttps' => 'See eelistus jõustub pärast järgmist sisselogimist.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Sobiv e-posti aadress',
@@ -1492,6 +1552,8 @@ See teave on avalik.',
 'userrights-notallowed' => 'Sul pole õigust kasutajaõigusi lisada ega eemaldada.',
 'userrights-changeable-col' => 'Rühmad, mida sa saad muuta',
 'userrights-unchangeable-col' => 'Rühmad, mida sa ei saa muuta',
+'userrights-conflict' => 'Kasutajaõiguste muutmise konflikt! Palun vaata oma muudatused üle ja kinnita need.',
+'userrights-removed-self' => 'Võtsid edukalt endalt õigused. Seetõttu sellele leheküljele sa enam ligi ei pääse.',
 
 # Groups
 'group' => 'Rühm:',
@@ -1557,11 +1619,19 @@ See teave on avalik.',
 'right-proxyunbannable' => 'Mööduda automaatsetest puhverserveri blokeeringutest',
 'right-unblockself' => 'Eemaldada enda blokeeringut',
 'right-protect' => 'Muuta kaitsetasemeid ja redigeerida kaskaadkaitsega lehekülgi',
-'right-editprotected' => 'Muuta kaitstud lehekülgi, millel ei ole kaskaadkaitset',
+'right-editprotected' => 'Muuta lehekülgi kaitsetasemega "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Muuta lehekülgi kaitsetasemega "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Muuta kasutajaliidest',
 'right-editusercssjs' => 'Redigeerida teiste kasutajate CSS- ja JS-faile',
 'right-editusercss' => 'Redigeerida teiste kasutajate CSS-faile',
 'right-edituserjs' => 'Redigeerida teiste kasutajate JS-faile',
+'right-editmyusercss' => 'Redigeerida oma CSS-kasutajafaile',
+'right-editmyuserjs' => 'Redigeerida oma JavaScript-kasutajafaile',
+'right-viewmywatchlist' => 'Vaadata oma jälgimisloendit',
+'right-editmywatchlist' => 'Redigeerida oma jälgimisloendit. Pane tähele, et mõne toiminguga lisatakse lehekülgi siiski ka ilma selle õiguseta.',
+'right-viewmyprivateinfo' => 'Vaadata oma eraandmeid (nt e-posti aadress, pärisnimi)',
+'right-editmyprivateinfo' => 'Redigeerida oma eraandmeid (nt e-posti aadress, pärisnimi)',
+'right-editmyoptions' => 'Muuta oma eelistusi',
 'right-rollback' => 'Tühistada otsekohe lehekülje viimase redigeerija muudatused',
 'right-markbotedits' => 'Märkida muudatuse tühistamine robotimuudatusena',
 'right-noratelimit' => 'Hoiduda piirangumääradest',
@@ -1623,12 +1693,19 @@ See teave on avalik.',
 'action-userrights-interwiki' => 'teiste vikide kasutajate õigusi muuta',
 'action-siteadmin' => 'andmebaasi lukustada või avada',
 'action-sendemail' => 'e-kirju saata',
+'action-editmywatchlist' => 'oma jälgimisloendit redigeerida',
+'action-viewmywatchlist' => 'oma jälgimisloendit vaadata',
+'action-viewmyprivateinfo' => 'oma eraandmeid vaadata',
+'action-editmyprivateinfo' => 'oma eraandmeid redigeerida',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|muudatus|muudatust}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|viimase vaatamise järel}}',
+'enhancedrc-history' => 'ajalugu',
 'recentchanges' => 'Viimased muudatused',
 'recentchanges-legend' => 'Viimaste muudatuste seaded',
 'recentchanges-summary' => 'Jälgi sellel leheküljel viimaseid muudatusi.',
+'recentchanges-noresult' => 'Selles ajavahemikus pole tehtud neile kriteeriumitele vastavaid muudatusi.',
 'recentchanges-feed-description' => 'Jälgi vikisse tehtud viimaseid muudatusi.',
 'recentchanges-label-newpage' => 'See muudatus lõi uue lehekülje',
 'recentchanges-label-minor' => 'See on pisiparandus',
@@ -1665,7 +1742,6 @@ See teave on avalik.',
 'recentchangeslinked-feed' => 'Seotud muudatused',
 'recentchangeslinked-toolbox' => 'Seotud muudatused',
 'recentchangeslinked-title' => 'Leheküljega "$1" seotud muudatused',
-'recentchangeslinked-noresult' => 'Antud ajavahemiku jooksul ei ole lingitud lehekülgedel muudatusi tehtud.',
 'recentchangeslinked-summary' => "Siin on loetletud määratud leheküljelt viidatud (või määratud kategooria) lehekülgedel tehtud viimased muudatused.
 Sinu [[Special:Watchlist|jälgimisloendi]] leheküljed on  '''rasvaselt''' esile toodud.",
 'recentchangeslinked-page' => 'Lehekülje nimi:',
@@ -1677,7 +1753,7 @@ Sinu [[Special:Watchlist|jälgimisloendi]] leheküljed on  '''rasvaselt''' esile
 'reuploaddesc' => 'Tagasi üleslaadimise vormi juurde.',
 'upload-tryagain' => 'Salvesta muudetud faili kirjeldus',
 'uploadnologin' => 'Sisse logimata',
-'uploadnologintext' => 'Kui soovid faile üles laadida, pead [[Special:UserLogin|sisse logima]].',
+'uploadnologintext' => 'Pead $1, et faili üles laadida.',
 'upload_directory_missing' => 'Üleslaadimiskaust $1 puudub ja veebiserver ei saa seda luua.',
 'upload_directory_read_only' => 'Veebiserveril ei õnnestu üleslaadimiste kataloogi ($1) kirjutada.',
 'uploaderror' => 'Faili laadimine ebaõnnestus',
@@ -1880,7 +1956,6 @@ Turvakaalutlustel on img_auth.php kasutus keelatud.',
 'http-read-error' => 'HTTP-lugemistõrge.',
 'http-timed-out' => 'HTTP-päring aegus.',
 'http-curl-error' => 'Tõrge URL-i $1 lugemisel',
-'http-host-unreachable' => 'Internetiaadress pole kättesaadav.',
 'http-bad-status' => 'HTTP-päringu ajal ilmnes tõrge: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1911,6 +1986,10 @@ Samuti võid proovida siis, kui võrgukoht on vähem hõivatud.',
 'listfiles_size' => 'Suurus',
 'listfiles_description' => 'Kirjeldus',
 'listfiles_count' => 'Versioonid',
+'listfiles-show-all' => 'Kaasa arvatud piltide vanad versioonid',
+'listfiles-latestversion' => 'Praegune versioon',
+'listfiles-latestversion-yes' => 'Jah',
+'listfiles-latestversion-no' => 'Ei',
 
 # File description page
 'file-anchor-link' => 'Pilt',
@@ -2004,6 +2083,13 @@ Sisesta kujul tüüp/alamtüüp, näiteks <code>image/jpeg</code>.',
 'randompage' => 'Juhuslik artikkel',
 'randompage-nopages' => '{{PLURAL:$2|Järgmises nimeruumis|Järgmistes nimeruumides}} ei ole ühtegi lehekülge: $1.',
 
+# Random page in category
+'randomincategory' => 'Juhuslik lehekülg kategoorias',
+'randomincategory-invalidcategory' => '"$1" pole sobiv kategooria nimi.',
+'randomincategory-nopages' => 'Kategoorias "[[:Category:$1|$1]]" puuduvad leheküljed.',
+'randomincategory-selectcategory' => 'Hangi juhuslik lehekülg kategooriast: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Mine',
+
 # Random redirect
 'randomredirect' => 'Juhuslik ümbersuunamine',
 'randomredirect-nopages' => 'Nimeruumis "$1" ei ole ümbersuunamislehekülgi.',
@@ -2029,17 +2115,13 @@ Sisesta kujul tüüp/alamtüüp, näiteks <code>image/jpeg</code>.',
 'statistics-users-active-desc' => 'Kasutajad, kes on viimase {{PLURAL:$1|päeva|$1 päeva}} jooksul tegutsenud',
 'statistics-mostpopular' => 'Enim vaadatud leheküljed',
 
-'disambiguations' => 'Täpsustuslehekülgedele linkivad leheküljed',
-'disambiguationspage' => 'Template:Täpsustuslehekülg',
-'disambiguations-text' => "Järgmised leheküljed sisaldavad vähemalt üht linki '''täpsustusleheküljele'''.
-Võimalik, et sellised lingid peaks viitama sobivamatele lehekülgedele.
-Lehekülg loetakse täpsustusleheküljeks, kui see kasutab malli, millele viitab sõnum [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Leheatribuudiga leheküljed',
 'pageswithprop-legend' => 'Leheatribuudiga leheküljed',
 'pageswithprop-text' => 'Sellel leheküljel on loetletud mõnd leheatribuuti kasutavad leheküljed.',
 'pageswithprop-prop' => 'Atribuudi nimi:',
 'pageswithprop-submit' => 'Mine',
+'pageswithprop-prophidden-long' => 'pika tekstiatribuudi väärtus peidetud ($1)',
+'pageswithprop-prophidden-binary' => 'kahendatribuudi väärtus peidetud ($1)',
 
 'doubleredirects' => 'Kahekordsed ümbersuunamised',
 'doubleredirectstext' => 'Käesolev leht esitab loendi lehtedest, mis sisaldavad ümbersuunamisi teistele ümbersuunamislehtedele.
@@ -2097,6 +2179,7 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise 
 'mostrevisions' => 'Kõige pikema redigeerimislooga leheküljed',
 'prefixindex' => 'Kõik pealkirjad eesliitega',
 'prefixindex-namespace' => 'Kõik pealkirjad eesliitega (nimeruumis $1)',
+'prefixindex-strip' => 'Ära näita loendis eesliidet',
 'shortpages' => 'Lühikesed leheküljed',
 'longpages' => 'Pikad leheküljed',
 'deadendpages' => 'Edasipääsuta leheküljed',
@@ -2112,6 +2195,7 @@ Igal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise 
 'listusers' => 'Kasutajad',
 'listusers-editsonly' => 'Näita vaid kasutajaid, kes on teinud muudatusi',
 'listusers-creationsort' => 'Järjesta konto loomise aja järgi',
+'listusers-desc' => 'Järjesta laskuvalt',
 'usereditcount' => '$1 {{PLURAL:$1|redigeerimine|redigeerimist}}',
 'usercreated' => 'Konto {{GENDER:$3|loomise}} aeg: $1 kell $2',
 'newpages' => 'Uued leheküljed',
@@ -2288,10 +2372,9 @@ Edasised muudatused sellel leheküljel ja seotud aruteluleheküljel tuuakse ära
 'unwatchthispage' => 'Ära jälgi',
 'notanarticle' => 'Pole artikkel',
 'notvisiblerev' => 'Redaktsioon on kustutatud',
-'watchnochange' => 'Valitud ajavahemiku jooksul pole ühelgi jälgitaval leheküljel muudatusi tehtud.',
 'watchlist-details' => 'Jälgimisloendis on {{PLURAL:$1|$1 lehekülg|$1 lehekülge}} (ei arvestata arutelulehekülgi).',
-'wlheader-enotif' => '* E-posti teel teavitamine on aktiveeritud.',
-'wlheader-showupdated' => "* Leheküljed, mida on muudetud peale sinu viimast külastust, on '''rasvases kirjas'''.",
+'wlheader-enotif' => 'E-posti teel teavitamine on lubatud.',
+'wlheader-showupdated' => "Leheküljed, mida on muudetud peale sinu viimast külastust, on '''rasvases kirjas'''.",
 'watchmethod-recent' => 'jälgitud lehekülgedel tehtud viimaste muudatuste läbivaatamine',
 'watchmethod-list' => 'jälgitavate lehekülgede viimased muudatused',
 'watchlistcontains' => 'Sinu jälgimisloendis on $1 {{PLURAL:$1|lehekülg|lehekülge}}.',
@@ -2541,7 +2624,7 @@ $1',
 'contributions' => '{{GENDER:$1|Kasutaja}} kaastöö',
 'contributions-title' => 'Kasutaja $1 kaastöö',
 'mycontris' => 'Kaastöö',
-'contribsub2' => 'Kasutaja $1 ($2) jaoks',
+'contribsub2' => 'Kasutaja {{GENDER:$3|$1}} ($2) jaoks',
 'nocontribs' => 'Antud kriteeriumitele vastavaid muudatusi ei leitud.',
 'uctop' => '(praegune)',
 'month' => 'Alates kuust (ja varasemad):',
@@ -2698,11 +2781,8 @@ Blokeering võib juba eemaldatud olla.',
 See kuulub aga blokeeritud IP-vahemikku $2, mille blokeeringut saab eemaldada.',
 'ip_range_invalid' => 'Vigane IP-vahemik.',
 'ip_range_toolarge' => 'Suuremad aadressiblokid kui /$1 pole lubatud.',
-'blockme' => 'Blokeeri mind',
 'proxyblocker' => 'Proksiblokeerija',
-'proxyblocker-disabled' => 'See funktsioon ei toimi.',
 'proxyblockreason' => 'Sinu IP-aadress on blokeeritud, sest see on avatud proksi. Palun võta ühendust oma internetiteenuse pakkujaga või tehnilise toega ja teata neile sellest probleemist.',
-'proxyblocksuccess' => 'Tehtud.',
 'sorbsreason' => 'Sinu IP-aadress on {{GRAMMAR:genitive|{{SITENAME}}}} kasutatavas DNS-põhises mustas nimekirjas märgitud kui avatud proksi.',
 'sorbs_create_account_reason' => 'Sinu IP-aadress on {{GRAMMAR:genitive|{{SITENAME}}}} kasutatavas DNS-põhises mustas nimekirjas märgitud kui avatud proksi.
 Sa ei saa kasutajakontot luua.',
@@ -2867,6 +2947,8 @@ Kui soovid MediaWiki tarkvara tõlkimises osaleda, siis vaata lehti [//www.media
 'thumbnail-more' => 'Suurenda',
 'filemissing' => 'Fail puudub',
 'thumbnail_error' => 'Viga pisipildi loomisel: $1',
+'thumbnail_error_remote' => 'Tõrketeade asukohast $1:
+$2',
 'djvu_page_error' => 'DjVu-failis ei ole sellist lehekülge',
 'djvu_no_xml' => 'DjVu failist XML-i lugemine ebaõnnestus.',
 'thumbnail-temp-create' => 'Ajutist pisipildifaili ei õnnestu luua.',
@@ -3020,7 +3102,6 @@ Samuti võimaldab see resümee reale põhjenduse lisamist.',
 
 # Stylesheets
 'common.css' => '/* Siin olevat CSS-i kasutavad kõik kujundused. */',
-'standard.css' => '/* Siin olev CSS puudutab Standard-kujunduse kasutajaid. */',
 
 # Scripts
 'common.js' => '/* Siinne JavaScript laaditakse igale kasutajatele igal laaditud leheküljel. */',
@@ -3097,13 +3178,8 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk
 'pageinfo-category-files' => 'Failide arv',
 
 # Skin names
-'skinname-standard' => 'Algeline',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Kölni sinine',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Minu kujundus',
-'skinname-chick' => 'Tibu',
-'skinname-simple' => 'Lihtne',
 'skinname-modern' => 'Uudne',
 'skinname-vector' => 'Vektor',
 
@@ -3183,11 +3259,25 @@ Järgnevas loendis, mis on sorteeritud $2, on '''$1''' {{PLURAL:$1|fail|faili}}.
 'minutes' => '{{PLURAL:$1|üks minut|$1 minutit}}',
 'hours' => '{{PLURAL:$1|üks tund|$1 tundi}}',
 'days' => '{{PLURAL:$1|üks päev|$1 päeva}}',
+'weeks' => '{{PLURAL:$1|$1 nädal|$1 nädalat}}',
 'months' => '{{PLURAL:$1|Üks kuu|$1 kuud}}',
 'years' => '{{PLURAL:$1|Üks aasta|$1 aastat}}',
 'ago' => '$1 tagasi',
 'just-now' => 'just nüüd',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|tund|tundi}} tagasi',
+'minutes-ago' => '$1 {{PLURAL:$1|minut|minutit}} tagasi',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund|sekundit}} tagasi',
+'monday-at' => 'Esmaspäeval kell $1',
+'tuesday-at' => 'Teisipäeval kell $1',
+'wednesday-at' => 'Kolmapäeval kell $1',
+'thursday-at' => 'Neljapäeval kell $1',
+'friday-at' => 'Reedel kell $1',
+'saturday-at' => 'Laupäeval kell $1',
+'sunday-at' => 'Pühapäeval kell $1',
+'yesterday-at' => 'Eile kell $1',
+
 # Bad image list
 'bad_image_list' => 'Arvesse võetakse ainult nimekirja ühikud (read, mis algavad sümboliga *).
 Esimene link real peab olema link kõlbmatule failile.
@@ -3221,7 +3311,7 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Laius',
 'exif-imagelength' => 'Kõrgus',
 'exif-bitspersample' => 'Bitti komponendi kohta',
@@ -3381,7 +3471,7 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 'exif-originalimageheight' => 'Pildi kõrgus enne kärpimist',
 'exif-originalimagewidth' => 'Pildi laius enne kärpimist',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Pakkimata',
 
 'exif-copyrighted-true' => 'Kaitstud',
@@ -3750,7 +3840,6 @@ Sa võid [[Special:EditWatchlist|kasutada ka harilikku tekstiredaktorit]].',
 'version-other' => 'Muu',
 'version-mediahandlers' => 'Meediatöötlejad',
 'version-hooks' => 'Haagid',
-'version-extension-functions' => 'Lisafunktsioonid',
 'version-parser-extensiontags' => 'Parseri lisamärgendid',
 'version-parser-function-hooks' => 'Parserifunktsioonid',
 'version-hook-name' => 'Haagi nimi',
@@ -3759,6 +3848,7 @@ Sa võid [[Special:EditWatchlist|kasutada ka harilikku tekstiredaktorit]].',
 'version-license' => 'Litsents',
 'version-poweredby-credits' => "See viki kasutab '''[//www.mediawiki.org/ MediaWiki]''' tarkvara. Autoriõigus © 2001–$1 $2.",
 'version-poweredby-others' => 'teised',
+'version-poweredby-translators' => 'translatewiki.net-i tõlkijad',
 'version-credits-summary' => 'Tahame tunnustada järgmisi inimesi [[Special:Version|MediaWikile]] tehtud kaastöö eest.',
 'version-license-info' => "MediaWiki on vaba tarkvara; tohid seda taaslevitada ja/või selle põhjal teisendeid luua vastavalt Vaba Tarkvara Fondi avaldatud GNU Üldise Avaliku Litsentsi versioonis 2 või hilisemas seatud tingimustele.
 
@@ -3772,12 +3862,17 @@ GNU Üldise Avaliku Litsentsi [{{SERVER}}{{SCRIPTPATH}}/COPYING eksemplar] peaks
 'version-entrypoints-header-entrypoint' => 'Sisendpunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Failitee',
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Mine',
-'filepath-summary' => 'See erileht määrab otsitava failini viiva tee.
-Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva programmiga.',
+# Special:Redirect
+'redirect' => 'Ümbersuunamine faili, kasutaja või redaktsiooni identifikaatori järgi',
+'redirect-legend' => 'Ümbersuunamine faili juurde või leheküljele',
+'redirect-summary' => 'See erilehekülg suunab ümber faili (toodud failinimi), lehekülje (toodud redaktsiooni identifikaator) või kasutajalehekülje (toodud numbriline kasutaja identfikaator) juurde.',
+'redirect-submit' => 'Mine',
+'redirect-lookup' => 'Leia:',
+'redirect-value' => 'Väärtus:',
+'redirect-user' => 'Kasutaja identifikaator',
+'redirect-revision' => 'Lehekülje redaktsioon',
+'redirect-file' => 'Failinimi',
+'redirect-not-exists' => 'Väärtust ei leitud',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Faili duplikaatide otsimine',
@@ -3827,12 +3922,16 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
 'tags' => 'Käibivad muudatusmärgised',
 'tag-filter' => '[[Special:Tags|Märgisefilter]]:',
 'tag-filter-submit' => 'Filtri',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Märgis|Märgised}}]]: $2)',
 'tags-title' => 'Märgised',
 'tags-intro' => 'See lehekülg loetleb märgised, millega tarkvara võib muudatused märgistada, ja nende kirjeldused.',
 'tags-tag' => 'Märgise nimi',
 'tags-display-header' => 'Tähistus muudatusloendis',
 'tags-description-header' => 'Täiskirjeldus',
+'tags-active-header' => 'Aktiivne?',
 'tags-hitcount-header' => 'Märgistatud muudatused',
+'tags-active-yes' => 'Jah',
+'tags-active-no' => 'Ei',
 'tags-edit' => 'muuda',
 'tags-hitcount' => '$1 {{PLURAL:$1|muudatus|muudatust}}',
 
@@ -3853,6 +3952,7 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
 'dberr-problems' => 'Kahjuks on sellel saidil tehnilisi probleeme',
 'dberr-again' => 'Oota mõni hetk ja laadi lehekülg uuesti.',
 'dberr-info' => '(Ei saa ühendust andmebaasi serveriga: $1)',
+'dberr-info-hidden' => '(Andmebaasiserveriga ei saa ühendust.)',
 'dberr-usegoogle' => "Proovi vahepeal otsida Google'ist.",
 'dberr-outofdate' => "Pane tähele, et Google'is talletatud meie sisu võib olla iganenud.",
 'dberr-cachederror' => 'See koopia taotletud leheküljest on vahemälus ja ei pruugi olla ajakohane.',
@@ -3868,6 +3968,9 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
 'htmlform-submit' => 'Saada',
 'htmlform-reset' => 'Tühista muudatused',
 'htmlform-selectorother-other' => 'Muu',
+'htmlform-no' => 'Ei',
+'htmlform-yes' => 'Jah',
+'htmlform-chosen-placeholder' => 'Vali säte',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 koos täistekstiotsingu toega',
@@ -3985,4 +4088,19 @@ Kui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajan
 # Image rotation
 'rotate-comment' => 'Pilti pööratud $1 {{PLURAL:$1|kraad|kraadi}} päripäeva',
 
+# Limit report
+'limitreport-title' => 'Parseri profiilimisandmed:',
+'limitreport-cputime' => 'Protsessoriaja kasutus',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekund|sekundit}}',
+'limitreport-walltime' => 'Reaalaja kasutus',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekund|sekundit}}',
+'limitreport-ppvisitednodes' => 'Eelprotsessori külastatud sõlmede arv',
+'limitreport-ppgeneratednodes' => 'Eelprotsessori genereeritud sõlmede arv',
+'limitreport-postexpandincludesize' => 'Hõrendusjärgne kaasa arvatav suurus',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bait|baiti}}',
+'limitreport-templateargumentsize' => 'Malli argumendi suurus',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bait|baiti}}',
+'limitreport-expansiondepth' => 'Suurim hõrendussügavus',
+'limitreport-expensivefunctioncount' => 'Kulukate parserifunktsioonide arv',
+
 );
diff --git a/languages/messages/MessagesEu.php b/languages/messages/MessagesEu.php
index 11cf9272..7749d0d9 100644
--- a/languages/messages/MessagesEu.php
+++ b/languages/messages/MessagesEu.php
@@ -14,6 +14,7 @@
  * @author Kaustubh
  * @author Kobazulo
  * @author Malafaya
+ * @author Nemo bis
  * @author Reedy
  * @author Theklan
  * @author Unai Fdz. de Betoño
@@ -155,9 +156,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Jarraitzen duen erabiltzaile kopurua erakutsi',
 'tog-oldsig' => 'Egungo sinadura:',
 'tog-fancysig' => 'Sinadura wikitestu gisa tratatu (lotura automatikorik gabe)',
-'tog-externaleditor' => 'Lehenetsi bezala kanpoko editore bat erabili (adituentzako bakarrik, zure ordenagailuak konfigurazio berezia izan behar du. [//www.mediawiki.org/wiki/Manual:External_editors Informazio gehiago.])',
-'tog-externaldiff' => 'Lehenetsi bezala kanpoko diff erreminta erabili (adituentzako bakarrik, zure ordenagailuak konfigurazio berezia izan behar du. [//www.mediawiki.org/wiki/Manual:External_editors Informazio gehiago.])',
-'tog-showjumplinks' => '"Hona jo" irisgarritasun loturak gaitu',
 'tog-uselivepreview' => 'Zuzeneko aurrebista erakutsi (JavaScript) (Proba fasean)',
 'tog-forceeditsummary' => 'Aldaketaren laburpena zuri uzterakoan ohartarazi',
 'tog-watchlisthideown' => 'Segimendu zerrendan nire aldaketak ezkutatu',
@@ -170,6 +168,7 @@ $messages = array(
 'tog-diffonly' => "''Diff''-ak agertzen direnean, orrialdearen edukiera ezkutatu",
 'tog-showhiddencats' => 'Ikusi kategoria ezkutuak',
 'tog-norollbackdiff' => 'Rollback bat egin ondoren ezberdintasunak ez hartu aintzat',
+'tog-useeditwarning' => 'Abisa nazazu gorde gabeko aldaketak eginez orrialde bat uzten dudanean',
 
 'underline-always' => 'Beti',
 'underline-never' => 'Inoiz ez',
@@ -233,6 +232,18 @@ $messages = array(
 'oct' => 'Urr',
 'nov' => 'Aza',
 'dec' => 'Abe',
+'january-date' => 'Urtarrilaren $1',
+'february-date' => 'Otsailaren $1',
+'march-date' => 'Martxoaren $1',
+'april-date' => 'Apirilaren $1',
+'may-date' => 'Maiatzaren $1',
+'june-date' => 'Ekainaren $1',
+'july-date' => 'Uztailaren $1',
+'august-date' => 'Abuztuaren $1',
+'september-date' => 'Irailaren $1',
+'october-date' => 'Urriaren $1',
+'november-date' => 'Azaroaren $1',
+'december-date' => 'Abenduaren $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategoria|Kategoriak}}',
@@ -314,6 +325,7 @@ $messages = array(
 'create-this-page' => 'Orrialde hau sortu',
 'delete' => 'Ezabatu',
 'deletethispage' => 'Ezabatu orri hau',
+'undeletethispage' => 'Orrialde hau bergaitu',
 'undelete_short' => 'Berreskuratu {{PLURAL:$1|aldaketa bat|$1 aldaketa}}',
 'viewdeleted_short' => 'Ikusi ezabatutako {{PLURAL:$1|bidalketa bat|$1 bidalketa}}',
 'protect' => 'Babestu',
@@ -357,7 +369,7 @@ $1',
 'pool-queuefull' => 'Prozesuen zerrenda beteta dago',
 'pool-errorunknown' => 'Errore ezezaguna',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}(e)ri buruz',
 'aboutpage' => 'Project:Honi_buruz',
 'copyright' => 'Eduki guztia $1(r)en babespean dago.',
@@ -367,7 +379,6 @@ $1',
 'disclaimers' => 'Mugaketak',
 'disclaimerpage' => 'Project:Erantzukizunen mugaketa orokorra',
 'edithelp' => 'Aldaketak egiteko laguntza',
-'edithelppage' => 'Help:Aldaketak egiteko laguntza',
 'helppage' => 'Help:Laguntza',
 'mainpage' => 'Azala',
 'mainpage-description' => 'Azala',
@@ -444,17 +455,6 @@ Existitzen direnen zerrenda ikus dezakezu  [[Special:SpecialPages|{{int:specialp
 # General errors
 'error' => 'Errorea',
 'databaseerror' => 'Datu-base errorea',
-'dberrortext' => 'Datu-basean kontsulta egiterakoan sintaxi errore bat gertatu da. 
-Baliteke softwareak bug bat izatea. 
-Datu-basean egindako azken kontsulta:
-<blockquote><code>$1</code></blockquote>
-funtzio honekin: "<code>$2</code>".
-Datu-baseak emandako errorea: "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Datu-basean kontsulta egiterakoan sintaxi errore bat gertatu da.
-Datu-basean egindako azken kontsulta:
-"$1"
-funtzio honekin: "$2".
-Datu-baseak emandako errore informazioa: "$3: $4"',
 'laggedslavemode' => 'Oharra: Baliteke orrialde honetan azken aldaketak ez erakustea.',
 'readonly' => 'Datu-basea blokeatuta dago',
 'enterlockreason' => 'Zehaztu blokeatzeko arrazoia, noiz kenduko den jakinaraziz',
@@ -509,12 +509,13 @@ Wiki guztientzako aldaketak egin edo gehitzeko, mesedez erabili [//translatewiki
 'editinginterface' => "'''Oharra:''' Softwarearen interfazerako testua duen orri bat aldatzen ari zara.
 Orri honetako aldaketek wiki honetako erabiltzaile guztiei eragingo diete.
 Itzulpenetarako, erabil ezazu [//translatewiki.net/ translatewiki.net], MediaWiki proiektuan.",
-'sqlhidden' => '(ezkutuko SQL kontsulta)',
 'cascadeprotected' => "Orrialde hau aldaketen aurka babestua dago, ''kaskada'' aukerarekin babestu {{PLURAL:$1|duten orrialde honetan|dituzten orrialde hauetan}} txertaturik dagoelako:
 $2",
 'namespaceprotected' => "Ez daukazu '''$1''' izen-tarteko orrialdeak aldatzeko baimenik.",
 'customcssprotected' => 'Ez duzu baimenik CSS orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.',
 'customjsprotected' => 'Ez duzu baimenik JavaScript orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.',
+'mycustomcssprotected' => 'Ez duzu baimenik CSS orrialde hau aldatzeko.',
+'mycustomjsprotected' => 'Ez duzu baimentik JavaScript orrialdea aldatzeko.',
 'ns-specialprotected' => 'Ezin dira {{ns:special}} izen-tarteko orrialdeak editatu.',
 'titleprotected' => "[[User:$1|$1]]ek izenburu hau sortzea ekidin zuen.
 Emandako arrazoia ''$2'' izan zen.",
@@ -540,10 +541,19 @@ Kontuan izan orrialde batzuk saioa hasita bazenu bezala ikus ditzakezula nabigat
 'welcomecreation-msg' => 'Zure kontua sortua izan da.
 Ez ezazu ahaztu zure [[Special:Preferences|{{SITENAME}} hobespenak]] aldatzea.',
 'yourname' => 'Erabiltzaile izena',
+'userlogin-yourname' => 'Erabiltzale izena',
+'userlogin-yourname-ph' => 'Sartu zure erabiltzaile izena',
+'createacct-another-username-ph' => 'Lankide-izena idatzi',
 'yourpassword' => 'Pasahitza:',
+'userlogin-yourpassword' => 'Pasahitza',
+'userlogin-yourpassword-ph' => 'Sartu zuren pasahitza',
+'createacct-yourpassword-ph' => 'Sartu pasahitza',
 'yourpasswordagain' => 'Pasahitza berriz',
+'createacct-yourpasswordagain' => 'Pasahitza berridatzi',
+'createacct-yourpasswordagain-ph' => 'Sartu pasahitza berriro ere',
 'remembermypassword' => 'Nire saioa ordenagailu honetan gogoratu ({{PLURAL:$1|egun baterako|$1 egunetarako }} gehienez)',
-'securelogin-stick-https' => 'Mantendu konektatua HTTPSra sartu ondoren',
+'userlogin-remembermypassword' => 'Manten nazazu barruan',
+'userlogin-signwithsecure' => 'Erabili konexio ziurra',
 'yourdomainname' => 'Zure domeinua',
 'password-change-forbidden' => 'Ezin duzu pasahitzarik aldatu wiki honetan.',
 'externaldberror' => 'Kanpoko datu-base autentifikazio errorea gertatu da edo ez duzu zure kanpo kontua eguneratzeko baimenik.',
@@ -555,18 +565,40 @@ Ez ezazu ahaztu zure [[Special:Preferences|{{SITENAME}} hobespenak]] aldatzea.',
 'logout' => 'Saioa itxi',
 'userlogout' => 'Saioa itxi',
 'notloggedin' => 'Saioa hasi gabe',
+'userlogin-noaccount' => 'Ez al duzu konturik?',
+'userlogin-joinproject' => 'Batu {{SITENAME}}(r)ekin',
 'nologin' => "Ez duzu erabiltzaile konturik? '''$1'''.",
 'nologinlink' => 'Kontua sortu',
 'createaccount' => 'Kontua sortu',
 'gotaccount' => "Baduzu erabiltzaile kontua? '''$1'''.",
 'gotaccountlink' => 'Saioa hasi',
 'userlogin-resetlink' => 'Saioa hasteko datuak ahaztu dituzu?',
+'userlogin-resetpassword-link' => 'Zure pasahitza berrezarri',
+'helplogin-url' => 'Help:Sarrera',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Barrura sartzeko laguntza]]',
+'createacct-join' => 'Sartu zure informazioa azpian.',
+'createacct-emailrequired' => 'E-posta helbidea',
+'createacct-emailoptional' => 'E-posta helbidea (hautazkoa)',
+'createacct-email-ph' => 'Sartu zure e-posta helbidea',
+'createacct-another-email-ph' => 'Posta elektronikoaren helbidea sartu',
 'createaccountmail' => 'Erabili behin-behineko pasahitz ausazko bat eta bidali behean agertzeko den e-posta helbidera',
+'createacct-realname' => 'Benetako izena (hautazkoa)',
 'createaccountreason' => 'Arrazoia:',
+'createacct-reason' => 'Arrazoia',
+'createacct-reason-ph' => 'Zergatik ari zaren beste erabiltzaile kontu bat',
+'createacct-captcha' => 'Segurtasun froga',
+'createacct-imgcaptcha-ph' => 'Sartu gainean ikusten duzun testua',
+'createacct-submit' => 'Kontua sortu',
+'createacct-another-submit' => 'Beste kontu bat sortu',
+'createacct-benefit-heading' => '{{SITENAME}} zu bezalako pertsonek egiten dute.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edizio bat|$1 edizio}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Orrialde 1|$1 orrialde}}',
+'createacct-benefit-body3' => 'azkeneko {{PLURAL:$1|egilea|egileak}}',
 'badretype' => 'Idatzitako pasahitzak ez dira berdinak.',
 'userexists' => 'Aukeratutako erabiltzaile izena hartuta dago.
 Mesedez beste bat aukeratu.',
 'loginerror' => 'Errorea saioa hastean',
+'createacct-error' => 'Kontua sortzerakoan arazoa',
 'createaccounterror' => 'Ezin izan da kontua sortu: $1',
 'nocookiesnew' => 'Erabiltzaile kontua sortu da, baina ez da saioa hasi. {{SITENAME}}(e)k cookieak erabiltzen ditu saioekin eta ezgaituta dauzkazu. Gaitu itzazu mesedez, eta ondoren saiatu saioa hasten zure erabiltzaile izen eta pasahitz berriak erabiliz.',
 'nocookieslogin' => '{{SITENAME}}(e)k cookieak erabiltzen ditu saioekin eta ezgaituta dauzkazu. Gaitu itzazu mesedez, eta saiatu berriz.',
@@ -645,7 +677,7 @@ Berriro saiatu aurretik itxaron ezazu, mesedez.',
 'newpassword' => 'Pasahitz berria:',
 'retypenew' => 'Pasahitz berria berriz idatzi:',
 'resetpass_submit' => 'Pasahitza definitu eta saioa hasi',
-'resetpass_success' => 'Zure pasahitza aldatu egin da! Saioa hasten...',
+'changepassword-success' => 'Zure pasahitza aldatu egin da! Saioa hasten...',
 'resetpass_forbidden' => 'Ezin dira pasahitzak aldatu',
 'resetpass-no-info' => 'Orrialde honetara zuzenean sartzeko izena eman behar duzu.',
 'resetpass-submit-loggedin' => 'Pasahitza aldatu',
@@ -657,9 +689,11 @@ Agian dagoeneko ondo aldatu duzu zure pasahitza edo behin-behineko pasahitza bat
 
 # Special:PasswordReset
 'passwordreset' => 'Pasahitzaren berrezarpena',
-'passwordreset-text' => 'Bete ezazu formulario hau zure pasahitza berrezartzeko.',
+'passwordreset-text-one' => 'Bete formulario hau zure pasahitza berrezartzeko.',
+'passwordreset-text-many' => '{{PLURAL:$1|Sartu datuetako bat zure pasahitza berrezartzeko.}}',
 'passwordreset-legend' => 'Pasahitza berrezarri',
 'passwordreset-disabled' => 'Pasahitza berrezartzea ez da posible wiki honetan.',
+'passwordreset-emaildisabled' => 'E-posta aukerak ez daude eskuragarri wiki honetan.',
 'passwordreset-username' => 'Lankide izena:',
 'passwordreset-domain' => 'Domeinua:',
 'passwordreset-capture' => 'Bidaliko den e-posta ikusi nahi?',
@@ -868,12 +902,15 @@ Ez du azalpenik eman.',
 'edit-gone-missing' => 'Ezin da orria eguneratu. Ezabatu omen dute.',
 'edit-conflict' => 'Aldaketa gatazka.',
 'edit-no-change' => 'Zure edizioa baztertu da testua aldatu ez duzulako.',
+'postedit-confirmation' => 'Zure aldaketa gorde da.',
 'edit-already-exists' => 'Ezin izan da orri berria sortu.
 Jada existitzen da.',
 'defaultmessagetext' => 'Testu lehenetsia',
 'content-failed-to-parse' => 'Ezin izan da $2(r)en edukia parseatu $1 modeloarentzat: $3',
 'invalid-content-data' => 'Eduki datu baliogabea',
 'content-not-allowed-here' => '"$1" edukia ez dago baimendua [[$2]] orrialdean',
+'editwarning-warning' => 'Orrialde honetatik irteten bazara, egindako aldaketak galdu egingo dira.
+Saioa hasi baduzu, mezu hau kendu dezakezu zure hobespenen orrialdeko "Aldatzen" atalean.',
 
 # Content models
 'content-model-wikitext' => 'wikitestua',
@@ -1109,7 +1146,6 @@ Kontura zaitez nabigazio loturek, zutabea ezabatu dezakela.',
 'searchmenu-legend' => 'Bilaketa aukerak',
 'searchmenu-exists' => "'''\"[[:\$1]]\" izena duen orrialde bat badago wiki honetan'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" orrialde sortu wiki honetan!'''",
-'searchhelp-url' => 'Help:Laguntza',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Aurrizki hau duten orrialdeetatik nabigatu]]',
 'searchprofile-articles' => 'Eduki-orriak',
 'searchprofile-project' => 'Laguntza eta Proiektu-orriak',
@@ -1152,14 +1188,6 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
 'search-external' => 'Kanpo bilaketa',
 'searchdisabled' => '{{SITENAME}}(e)n ezgaituta dago bilaketa. Dena dela, Google erabiliz ere egin dezakezu bilaketa. Kontuan izan bertan dituzten {{SITENAME}}(e)ko emaitzak zaharkituta egon daitezkeela.',
 
-# Quickbar
-'qbsettings' => 'Laster-barra',
-'qbsettings-none' => 'Ezein ere',
-'qbsettings-fixedleft' => 'Eskuinean',
-'qbsettings-fixedright' => 'Ezkerrean',
-'qbsettings-floatingleft' => 'Ezkerrean mugikor',
-'qbsettings-floatingright' => 'Eskubian flotatzen',
-
 # Preferences page
 'preferences' => 'Hobespenak',
 'mypreferences' => 'Hobespenak',
@@ -1192,7 +1220,6 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
 'resetprefs' => 'Hasieratu',
 'restoreprefs' => 'Konfigurazio lehenetsi guztiak berrezarri',
 'prefs-editing' => 'Aldatzen',
-'prefs-edit-boxsize' => 'Edizio lehioaren tamaina.',
 'rows' => 'Lerroak:',
 'columns' => 'Zutabeak:',
 'searchresultshead' => 'Bilaketa',
@@ -1231,7 +1258,6 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
 'prefs-custom-js' => 'JS pertsonalizatua',
 'prefs-common-css-js' => 'Azal mota guztietan elkarbanatutako CSS/JS:',
 'prefs-emailconfirm-label' => 'E-posta baieztapena:',
-'prefs-textboxsize' => 'Editatze lehioaren tamaina',
 'youremail' => 'E-posta:',
 'username' => '{{GENDER:$1|Erabiltzaile izena}}:',
 'uid' => '{{GENDER:$1|Erabiltzaile}} zenbakia:',
@@ -1365,6 +1391,8 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
 'right-editusercssjs' => 'Beste lankideen CSS eta JS fitxategiak aldatu',
 'right-editusercss' => 'Beste lankideen CSS fitxategiak aldatu',
 'right-edituserjs' => 'Beste lankideen JS fitxategiak aldatu',
+'right-editmyusercss' => 'Aldatu zure CSS fitxategi propioak',
+'right-editmyuserjs' => 'Aldatu zure JavaScript fitxategi propioak',
 'right-rollback' => 'Orrialde zehatz bat aldatu zuen azken lankidearen aldaketak modu azkar batean leheneratu',
 'right-markbotedits' => 'Atzera bueltan eginiko aldaketak bot baten aldaketak balira markatu',
 'right-noratelimit' => 'Ez dio eragiten erlazio mugak',
@@ -1467,7 +1495,6 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
 'recentchangeslinked-feed' => 'Lotutako orrietako aldaketak',
 'recentchangeslinked-toolbox' => 'Lotutako orrietako aldaketak',
 'recentchangeslinked-title' => '"$1"(e)kin harremanetan dauden aldaketak',
-'recentchangeslinked-noresult' => 'Emandako epean ez da egon aldaketarik loturiko orrialdetan.',
 'recentchangeslinked-summary' => "Zerrenda honetan zehazturiko orrialde bati (edo kategoria berezi bateko azkeneko kideei) lotura duten orrietan eginiko azken aldaketak agertzen dira.
 [[Special:Watchlist|Zurre jarraitze zerrenda]]n agertzen diren orrialdeak '''beltze'''z agertzen dira.",
 'recentchangeslinked-page' => 'Orriaren izena:',
@@ -1642,7 +1669,6 @@ Fitxategien sarbidea baino ez da onartzen.',
 'http-read-error' => 'HTTP irakurketa-akatsa.',
 'http-timed-out' => 'HTTP eskaera iraungi da.',
 'http-curl-error' => 'Errorea URLa bilatzerakoan: $1',
-'http-host-unreachable' => 'Ezin da URL-a atzeman.',
 'http-bad-status' => 'Arazo bat egon da HTTP eskaera bitartean: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1781,12 +1807,6 @@ Bere [$2 fitxategiaren deskribapen orrialdea] behean dago.',
 'statistics-users-active-desc' => 'Aurreko {{PLURAL:$1|egunean|egunetan}} jardueraren bat gauzatu duten erabiltzaileak',
 'statistics-mostpopular' => 'Orri bisitatuenak',
 
-'disambiguations' => 'Argipen orrietara lotzen duten orriak',
-'disambiguationspage' => 'Template:argipen',
-'disambiguations-text' => "Jarraian azaltzen diren orrialdeek '''argipen orrialde''' baterako lotura dute. 
-Kasu bakoitzean dagokion artikulu zuzenarekin izan beharko lukete lotura.<br />
-Orrialde bat argipen motakoa dela antzeman ohi da [[MediaWiki:Disambiguationspage]] orrialdean agertzen den txantiloietako bat duenean.",
-
 'pageswithprop' => 'Orrialde propietatea duten orrialdeak',
 'pageswithprop-legend' => 'Orrialde propietatea duten orrialdeak',
 'pageswithprop-prop' => 'Ezaugarriaren izena:',
@@ -2029,10 +2049,9 @@ Orrialde honen hurrengo aldaketak zerrenda horretan ageriko dira aurrerantzean.'
 'unwatchthispage' => 'Jarraitzeari utzi',
 'notanarticle' => 'Ez da eduki orrialdea',
 'notvisiblerev' => 'Berrikusketa desegin da',
-'watchnochange' => 'Hautatutako denbora tartean ez da aldaketarik izan zure jarraipen zerrendako orrialdeetan.',
 'watchlist-details' => '{{PLURAL:$1|Orrialde $1|$1 orrialde}} jarraitzen, eztabaida orrialdeak kontuan hartu gabe.',
-'wlheader-enotif' => '* Posta bidezko ohartarazpena gaituta dago.',
-'wlheader-showupdated' => "* Bisitatu zenituen azken alditik aldaketak izan dituzten orrialdeak '''beltzez''' nabarmenduta daude",
+'wlheader-enotif' => 'Posta bidezko ohartarazpena gaituta dago.',
+'wlheader-showupdated' => "Bisitatu zenituen azken alditik aldaketak izan dituzten orrialdeak '''beltzez''' nabarmenduta daude.",
 'watchmethod-recent' => 'Aldaketa berriak aztertzen jarraipen zerrendako orrialdeen bila',
 'watchmethod-list' => 'jarraipen zerrendako orrialdeak aldaketa berrien bila aztertzen',
 'watchlistcontains' => 'Zure jarraipen zerrendak {{PLURAL:$1|orrialde $1 du|$1 orrialde ditu}}.',
@@ -2419,11 +2438,8 @@ Ikus [[Special:BlockList|blokeoen zerrenda]] aktibo dauden blokeoak eta debekuak
 Hala ere, $2-(r)en parte denez, blokeoa kendu daiteke.',
 'ip_range_invalid' => 'Baliogabeko IP eremua.',
 'ip_range_toolarge' => '/$1 baino handiagoak diren blokeo eremuak ezin dira eskuratu.',
-'blockme' => 'Blokea nazazu',
 'proxyblocker' => 'Proxy blokeatzailea',
-'proxyblocker-disabled' => 'Funtzio hau ez-gaitua dago.',
 'proxyblockreason' => 'Zure IP helbidea blokeatu egin da proxy ireki baten zaudelako. Mesedez, zure Interneteko Zerbitzu Hornitzailearekin harremanetan jar zaitez segurtasun arazo honetaz ohartarazteko.',
-'proxyblocksuccess' => 'Egina.',
 'sorbsreason' => 'Zure IP helbidea proxy ireki bezala zerrendatuta dago DNSBLan.',
 'sorbs_create_account_reason' => 'Zure IP helbidea proxy ireki bezala zerrendatuta dago DNSBLan. Ezin duzu kontua sortu.',
 'cant-block-while-blocked' => 'Blokeatuta zauden bitartean ezin dituzu beste lankideak blokeatu.',
@@ -2770,10 +2786,7 @@ Baliteke zerrenda beltzean dagoen kanpo lotura batek sortzea arazo hori.',
 'pageinfo-category-files' => 'Fitxategi kopurua',
 
 # Skin names
-'skinname-standard' => 'Lehenetsia',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Cologne Blue',
-'skinname-simple' => 'Arrunta',
 'skinname-modern' => 'Modernoa',
 
 # Patrolling
@@ -2852,11 +2865,25 @@ Zure sisteman exekutatzea arriskutsua izan liteke.",
 'minutes' => '{{PLURAL:$1|minutu $1|$1 minutu}}',
 'hours' => '{{PLURAL:$1|ordu $1|$1 ordu}}',
 'days' => '{{PLURAL:$1|egun $1|$1 egun}}',
+'weeks' => '{{PLURAL: $1|aste $1|$1 aste}}',
 'months' => '{{PLURAL: $1|hilabete $1|$1 hilabete}}',
 'years' => '{{PLURAL: $1|urte $1|$1 urte}}',
 'ago' => 'Duela $1',
 'just-now' => 'orain',
 
+# Human-readable timestamps
+'hours-ago' => 'Orain dela {{PLURAL:$1|ordu bat|$1 ordu}}',
+'minutes-ago' => 'Orain dela {{PLURAL:$1|minutu bat|$1 minutu}}',
+'seconds-ago' => 'Orain dela {{PLURAL:$1|segundu bat|$1 segundu}}',
+'monday-at' => 'Astelehena $1(e)tan',
+'tuesday-at' => 'Asteartea $1(e)tan',
+'wednesday-at' => 'Asteazkena $1(e)tan',
+'thursday-at' => 'Osteguna $1(e)tan',
+'friday-at' => 'Ostirala $1(e)tan',
+'saturday-at' => 'Larunbata $1(e)tan',
+'sunday-at' => 'Igandea $1(e)tan',
+'yesterday-at' => 'Atzo $1(e)tan',
+
 # Bad image list
 'bad_image_list' => 'Formatua hurrengoa da:
 
@@ -2882,7 +2909,7 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Zabalera',
 'exif-imagelength' => 'Altuera',
 'exif-bitspersample' => 'Bit osagaiko',
@@ -3058,7 +3085,7 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
 'exif-originalimageheight' => 'Irudiaren altuera moztu aurretik',
 'exif-originalimagewidth' => 'Irudiaren zabalera moztu aurretik',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Konprimatu gabe',
 'exif-compression-6' => 'JPEG',
 
@@ -3422,7 +3449,6 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
 'version-other' => 'Bestelakoak',
 'version-mediahandlers' => 'Media gordailuak',
 'version-hooks' => 'Estentsioak',
-'version-extension-functions' => 'Luzapen funtzioak',
 'version-parser-extensiontags' => 'Parser luzapen etiketak',
 'version-parser-function-hooks' => 'Parser funtzio estentsioak',
 'version-hook-name' => 'Estentsioaren izena',
@@ -3438,12 +3464,16 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
 'version-entrypoints-header-entrypoint' => 'Sarrera puntua',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Fitxategi bidea',
-'filepath-page' => 'Fitxategia:',
-'filepath-submit' => 'Joan',
-'filepath-summary' => 'Orri berezi honek fitxategiaren ibilbidea itzultzen du.
-Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutako programarekin hasiko dira zuzenean.',
+# Special:Redirect
+'redirect' => 'Birzuzendu fitxategi, lankide edo berrikuspen IDaren arabera',
+'redirect-legend' => 'Orrialde edo fitxategi batera birzuzendu',
+'redirect-submit' => 'Joan',
+'redirect-lookup' => 'Ikuskatu:',
+'redirect-value' => 'Balioa:',
+'redirect-user' => 'Erabiltzailearen identifikazioa (ID):',
+'redirect-revision' => 'Orrialdearen berrikuspena',
+'redirect-file' => 'Fitxategiaren izena',
+'redirect-not-exists' => 'Ez da baliorik aurkitu',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Artxibo bikoiztuen bilaketa',
@@ -3529,6 +3559,9 @@ Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutak
 'htmlform-submit' => 'Bidali',
 'htmlform-reset' => 'Aldaketak desegin',
 'htmlform-selectorother-other' => 'Beste bat',
+'htmlform-no' => 'Ez',
+'htmlform-yes' => 'Bai',
+'htmlform-chosen-placeholder' => 'Aukeratu',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 testu osoan bilatzeko laguntzarekin',
diff --git a/languages/messages/MessagesExt.php b/languages/messages/MessagesExt.php
index 61a1b3af..cf6a54dc 100644
--- a/languages/messages/MessagesExt.php
+++ b/languages/messages/MessagesExt.php
@@ -49,9 +49,6 @@ $messages = array(
 'tog-shownumberswatching' => "Muestral el númeru d'usuárius que la vehilan",
 'tog-oldsig' => 'Firma dessistenti:',
 'tog-fancysig' => 'Tratal la firma cumu testu wiki (sin atiju automáticu)',
-'tog-externaleditor' => 'Gastal eitol esternu pol defeutu (solu pa sabihondus, es mestel una configuración especial nel ordinaol)',
-'tog-externaldiff' => 'Gastal def esternu pol defeutu (solu pa sabihondus, es mestel una configuración especial nel ordinaol)',
-'tog-showjumplinks' => 'Premitil los atihus d\'acesibiliá "sartal a"',
 'tog-uselivepreview' => 'Gastal "live preview" (JavaScript) (en prebas)',
 'tog-forceeditsummary' => 'Avisalmi cuandu nu escreba una síntesis dun chambu',
 'tog-watchlisthideown' => 'Açonchal las mis eicionis ena lista e seguimientu',
@@ -228,7 +225,7 @@ $messages = array(
 'jumptonavigation' => 'Güiquipeandu',
 'jumptosearch' => 'Landeal',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Al tentu {{SITENAME}}',
 'aboutpage' => 'Project:Enjolmación',
 'copyright' => 'Continiu disponibri bahu $1.',
@@ -238,7 +235,6 @@ $messages = array(
 'disclaimers' => 'Avissu legal',
 'disclaimerpage' => 'Project:Arrayu heneral de responsabiliá',
 'edithelp' => "Ayua d'eición",
-'edithelppage' => 'Help:Eitandu',
 'helppage' => 'Help:Continius',
 'mainpage' => 'Página prencipal',
 'mainpage-description' => 'Páhina prencipal',
@@ -308,17 +304,6 @@ Pueis alcuentral una lista colas páhinas especialis desistentis en [[Special:Sp
 # General errors
 'error' => 'Marru',
 'databaseerror' => 'Marru ena basi e datus',
-'dberrortext' => 'Marru sintáticu ena consurta a la bassi de datus:
-Estu puei sel ebiu a un marru nel software.
-La úrtima consurta jue:
-<blockquote><tt>$1</tt></blockquote>
-endrentu la junción "<tt>$2</tt>".
-La bassi de datus degorvió el marru "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Marru sintáticu ena consurta a la bassi de datus.
-La úrtima consurta jue:
-"$1"
-endrentu la junción "$2".
-La bassi de datus degorvió el marru "$3: $4"',
 'laggedslavemode' => 'Avisu: Es posibri que la páhina nu esté atualizá.',
 'readonly' => 'Basi e datus atarugá',
 'enterlockreason' => 'Escrebi una razón pal tarugu, i cuandu esti
@@ -361,7 +346,6 @@ Pol favol, contauta con un [[Special:ListUsers/sysop|çajoril]], mentandu la URL
 'protectedinterface' => "Esta páhina proporciona el testu la entrihazi el software, razón pola que s'alcuentra atarugá.",
 'editinginterface' => "'''Cudiau:''' Estás eitandu una página que propolciona el testu la entrijazi el software. Los chambus hechus aquina afeutarán a la entrijazi d'otrus ussuárius.
 Pa traucil, consiera gastal [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], el proyeutu de traución de MediaWiki.",
-'sqlhidden' => '(Consurta SQL açonchá)',
 'cascadeprotected' => 'Esta páhina s\'alcuentra protehia ebiu a que horma parti e {{PLURAL:$1|la siguienti páhina|las siguientis páhinas}}, qu\'están protehias cola oción "proteción en cascá" ativá:
 $2',
 'namespaceprotected' => "Nu tiinis premisu pa eital páhinas nel \"espaciu e nombris\" '''\$1'''.",
@@ -458,7 +442,7 @@ Si s\'á criau la cuenta ebiu a angún marru, inora esti mensahi.',
 'newpassword' => 'Consínia nueva:',
 'retypenew' => 'Güervi a escrebil la nueva consínia:',
 'resetpass_submit' => 'Escrebi la consínia i entra',
-'resetpass_success' => 'La tu consínia á siu chambá! Ya pueis entral otra vezi ena tu cuenta...',
+'changepassword-success' => 'La tu consínia á siu chambá! Ya pueis entral otra vezi ena tu cuenta...',
 'resetpass_forbidden' => 'Nu es possibri escambial las consínias',
 'resetpass-submit-loggedin' => 'Escambial consínia',
 'resetpass-submit-cancel' => 'Cancelal',
@@ -768,7 +752,6 @@ Asigurati e qu'esti chambu mantenga la continuiá el estorial la páhina.",
 'viewprevnext' => 'Vel ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Ocionis de landeu',
 'searchmenu-new' => "'''Crial el artículu \"[[:\$1]]\"'''",
-'searchhelp-url' => 'Help:Continius',
 'searchprofile-images' => 'Murtimeya',
 'searchprofile-everything' => 'Tó',
 'searchprofile-advanced' => 'Avançau',
@@ -797,14 +780,6 @@ Asigurati e qu'esti chambu mantenga la continuiá el estorial la páhina.",
 'search-external' => 'Landeu estelnu',
 'searchdisabled' => 'Los landeus en {{SITENAME}} están temporalmenti desativaus. Mentris tantu, pueis landeal meyanti landerus esternus, inque ten en cuenta que los sus éndicis concernientis a {{SITENAME}} puein nu estal atualizaus.',
 
-# Quickbar
-'qbsettings' => 'Preferéncias la "Quickbar"',
-'qbsettings-none' => 'Dengunu',
-'qbsettings-fixedleft' => 'Asiahau a la gocha',
-'qbsettings-fixedright' => 'Asiahau a la derecha',
-'qbsettings-floatingleft' => 'Frotanti ena gocha',
-'qbsettings-floatingright' => 'Frotanti ena derecha',
-
 # Preferences page
 'preferences' => 'Preferéncias',
 'mypreferences' => 'Las mis preferéncias',
@@ -827,7 +802,6 @@ Asigurati e qu'esti chambu mantenga la continuiá el estorial la páhina.",
 'saveprefs' => 'Emburacal',
 'resetprefs' => 'Esborral los chambus nu emburacaus',
 'prefs-editing' => 'Eitandu',
-'prefs-edit-boxsize' => "Grandol de la ventana d'eición.",
 'rows' => 'Filas:',
 'columns' => 'Colunas:',
 'searchresultshead' => 'Landeal',
@@ -1007,7 +981,6 @@ Amás premiti qu'otrus ussuárius contatin contigu pol mé la tu página d'ussu
 'recentchangeslinked-feed' => 'Chambus relacionaus',
 'recentchangeslinked-toolbox' => 'Chambus relacionaus',
 'recentchangeslinked-title' => 'Chambus relacionaus con "$1"',
-'recentchangeslinked-noresult' => 'Nu ai chambus enas páhinas atihás nel períu lihiu.',
 'recentchangeslinked-summary' => "Nesta páhina especial ai una lista colos úrtimus chambus en páhinas qu'están atihás dendi una páhina concreta (u en miembrus de una detelminá categoria).
 Las páhinas de la tu [[Special:Watchlist|lista e seguimientu]] están en '''negrina'''.",
 'recentchangeslinked-page' => 'Nombri la páhina:',
@@ -1219,10 +1192,6 @@ Pursa nel entítulu la coluna pa chambal el ordin.',
 'statistics-users-active-desc' => 'Ussuárius que aigan hechu anguna ación {{PLURAL:$1|nel úrtimu dia|enus úrtimus $1 dias}}',
 'statistics-mostpopular' => 'Páhinas mas visoreás',
 
-'disambiguations' => 'Páhinas de desambiguáncia',
-'disambiguationspage' => 'Template:desambiguáncia',
-'disambiguations-text' => "Las siguientis páhinas atihan a una '''páhina e desambiguáncia'''. Estas eberian atihal al artículu apropiau.<br />Una páhina se consiera e desambiguáncia si gasta una prantilla qu'está atihá endi [[MediaWiki:Disambiguationspage]]",
-
 'doubleredirects' => 'Redirecionis dobris',
 
 'brokenredirects' => 'Redirecionis eschangás',
@@ -1396,10 +1365,9 @@ Si quieis ehal de vehilal la páhina, pursa sobri \"Ehal de vehilal\".",
 'unwatchthispage' => 'Ehal de vehilal',
 'notanarticle' => 'Nu es un artículu',
 'notvisiblerev' => 'La revisión á siu esborrá',
-'watchnochange' => 'Nu s´eitó denguna e las tus páhinas vehilás nel períu lihiu.',
 'watchlist-details' => '{{PLURAL:$1|$1 artículu|$1 artículus}} vehilaus (sin contal las carabas).',
-'wlheader-enotif' => '* Se premitin notificacionis pol email.',
-'wlheader-showupdated' => "* Las páhinas que s'án emburacau dendi la úrtima vezi que las visoreasti son muestrás en '''negrina'''",
+'wlheader-enotif' => 'Se premitin notificacionis pol email.',
+'wlheader-showupdated' => "Las páhinas que s'án emburacau dendi la úrtima vezi que las visoreasti son muestrás en '''negrina'''",
 'watchmethod-recent' => 'comprebandu las úrtimas eicionis en páhinas vehilás',
 'watchmethod-list' => 'Revisandu las páhinas vehilás en cata los úrtimus chambus',
 'watchlistcontains' => 'Ai $1 {{PLURAL:$1|páhina|páhinas}} ena tu lista e seguimientu.',
@@ -1695,11 +1663,8 @@ Escrebi una razón concreta embahu (pol sabulugal, almientandu páhinas qu'aigan
 'ipb_cant_unblock' => "Marru: Nu s'á alcuentrau el tarugu con ID $1. Es posibri que ya aiga siu desatarugau.",
 'ipb_blocked_as_range' => "Marru: La IP $1 nu s'alcuentra atarugá diretamenti, polo que nu puei sel desatarugá. Nu ostanti, hue atarugá cumu parti el intervalu $2, que puei sel desatarugau.",
 'ip_range_invalid' => "Rangu d'IP nu premitiu.",
-'blockme' => 'Atarugami',
 'proxyblocker' => 'Tarugaol de proxys',
-'proxyblocker-disabled' => "Esta hunción s'alcuentra desativá.",
 'proxyblockreason' => "La tu direción IP á siu atarugá polque es un proxy abiertu. Pol favol, contauta con el tu proveol de sirvicius d'Internet u con el tu sirviciu d'asisténcia télefónica i enhórmalus desti gravi pobrema e seguráncia.",
-'proxyblocksuccess' => 'Hechu.',
 'sorbsreason' => 'La tu direción IP apaici ena lista e proxys abiertus en DNSBL gastá pol {{SITENAME}}.',
 'sorbs_create_account_reason' => 'La tu direción IP apaici ena lista e proxys abiertus en DNSBL gastá pol {{SITENAME}}. Nu se te premiti crial una cuenta',
 
@@ -2009,7 +1974,7 @@ Cualisquiel otru atihu ena mesma línia se consierará ececión, p.s. páhinas o
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Anchón',
 'exif-imagelength' => 'Artura',
 'exif-bitspersample' => 'Bits pol componenti',
@@ -2093,7 +2058,7 @@ Cualisquiel otru atihu ena mesma línia se consierará ececión, p.s. páhinas o
 'exif-gpsdatestamp' => 'Fecha el GPS',
 'exif-gpsdifferential' => 'Correción diferencial de GPS',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Descomprimiu',
 
 'exif-unknowndate' => 'Fecha andarria',
@@ -2355,7 +2320,6 @@ Pol favol, confirma si rialmenti quieis gorvel a crial la páhina.",
 'version-specialpages' => 'Páhinas especialis',
 'version-variables' => 'Variabris',
 'version-other' => 'Otru',
-'version-extension-functions' => "Huncionis d'estensionis",
 'version-hook-name' => 'Nombri el Hook',
 'version-hook-subscribedby' => 'Suscritu pol',
 'version-version' => '(Velsión $1)',
@@ -2364,13 +2328,6 @@ Pol favol, confirma si rialmenti quieis gorvel a crial la páhina.",
 'version-software-product' => 'Proutu',
 'version-software-version' => 'Velsión',
 
-# Special:FilePath
-'filepath' => "Ruta d'archivu",
-'filepath-page' => 'Archivu:',
-'filepath-submit' => 'Ruta',
-'filepath-summary' => "Esta páhina especial degüervi la ruta compreta dun archivu.
-Las imahin se muestran a resolución compreta; las demas crasis d'archivu s'ehecutan diretamenti con el su pograma asociau.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Landeal archivus dupricaus',
 'fileduplicatesearch-legend' => 'Landeal dupricaus',
diff --git a/languages/messages/MessagesFa.php b/languages/messages/MessagesFa.php
index a898c86c..91af22c6 100644
--- a/languages/messages/MessagesFa.php
+++ b/languages/messages/MessagesFa.php
@@ -108,6 +108,7 @@ $specialPageAliases = array(
 	'Filepath'                  => array( 'مسیر_پرونده' ),
 	'Import'                    => array( 'درون_ریزی_صفحه' ),
 	'Invalidateemail'           => array( 'باطل_کردن_رایانامه' ),
+	'JavaScriptTest'            => array( 'تست_جاوا_اسکریپت' ),
 	'BlockList'                 => array( 'فهرست_بستن_نشانی_آی‌پی' ),
 	'LinkSearch'                => array( 'جستجوی_پیوند' ),
 	'Listadmins'                => array( 'فهرست_مدیران' ),
@@ -124,6 +125,7 @@ $specialPageAliases = array(
 	'MIMEsearch'                => array( 'جستجوی_MIME' ),
 	'Mostcategories'            => array( 'بیشترین_رده' ),
 	'Mostimages'                => array( 'بیشترین_تصویر' ),
+	'Mostinterwikis'            => array( 'بیشترین_میان‌ویکی' ),
 	'Mostlinked'                => array( 'بیشترین_پیوند' ),
 	'Mostlinkedcategories'      => array( 'رده_با_بیشترین_پیوند' ),
 	'Mostlinkedtemplates'       => array( 'الگو_با_بیشترین_پیوند' ),
@@ -146,6 +148,7 @@ $specialPageAliases = array(
 	'Randomredirect'            => array( 'تغییرمسیر_تصادفی' ),
 	'Recentchanges'             => array( 'تغییرات_اخیر' ),
 	'Recentchangeslinked'       => array( 'تغییرات_مرتبط' ),
+	'Redirect'                  => array( 'تغییرمسیر' ),
 	'Revisiondelete'            => array( 'حذف_نسخه' ),
 	'Search'                    => array( 'جستجو' ),
 	'Shortpages'                => array( 'صفحه‌های_کوتاه' ),
@@ -464,9 +467,6 @@ $messages = array(
 'tog-shownumberswatching' => 'شمار کاربران پی‌گیری‌کننده نمایش یابد',
 'tog-oldsig' => 'امضای کنونی:',
 'tog-fancysig' => 'امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)',
-'tog-externaleditor' => 'استفاده از ویرایشگر خارجی به‌طور پیش‌فرض (فقط برای کاربران حرفه‌ای؛ نیازمند تنظیمات ویژه در رایانهٔ شما است. [//www.mediawiki.org/wiki/Manual:External_editors اطلاعات بیشتر].)',
-'tog-externaldiff' => 'استفاده از تفاوت‌گیر (diff) خارجی به‌طور پیش‌فرض (فقط برای کاربران حرفه‌ای؛ نیازمند تنظیمات ویژه در رایانهٔ شما است. [//www.mediawiki.org/wiki/Manual:External_editors اطلاعات بیشتر].)',
-'tog-showjumplinks' => 'پیوندهای دسترسی‌پذیری «پرش به» فعال باشد',
 'tog-uselivepreview' => 'استفاده از پیش‌نمایش زنده (نیازمند جاوااسکریپت) (آزمایشی)',
 'tog-forceeditsummary' => 'هنگامی که خلاصهٔ ویرایش ننوشته‌ام به من اطلاع داده شود',
 'tog-watchlisthideown' => 'ویرایش‌های خودم در فهرست پی‌گیری‌ها پنهان شود',
@@ -480,6 +480,8 @@ $messages = array(
 'tog-showhiddencats' => 'رده‌های پنهان نمایش داده شود',
 'tog-noconvertlink' => 'تبدیل عنوان پیوند غیرفعال شود',
 'tog-norollbackdiff' => 'بعد از واگردانی تفاوت نشان داده نشود',
+'tog-useeditwarning' => 'زمان خروج از صفحهٔ ویرایش در صورت داشتن ویرایش‌های‌ ذخیره‌نشده به من هشدار داده شود',
+'tog-prefershttps' => 'هنگامی که ثبت ورود انجام گرفته همواره از اتصال امن استفاده شود',
 
 'underline-always' => 'همیشه',
 'underline-never' => 'هرگز',
@@ -543,6 +545,18 @@ $messages = array(
 'oct' => 'اکتبر',
 'nov' => 'نوامبر',
 'dec' => 'دسامبر',
+'january-date' => '$1 ژانویه',
+'february-date' => '$1 فوریه',
+'march-date' => '$1 مارس',
+'april-date' => '$1 آوریل',
+'may-date' => '$1 مه',
+'june-date' => '$1 ژوئن',
+'july-date' => '$1 ژوئیه',
+'august-date' => '$1 اوت',
+'september-date' => '$1 سپتامبر',
+'october-date' => '$1 اکتبر',
+'november-date' => '$1 نوامبر',
+'december-date' => '$1 دسامبر',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|رده|رده‌ها}}',
@@ -624,6 +638,7 @@ $messages = array(
 'create-this-page' => 'ایجاد این صفحه',
 'delete' => 'حذف',
 'deletethispage' => 'حذف این صفحه',
+'undeletethispage' => 'احیای این صفحه',
 'undelete_short' => 'احیای {{PLURAL:$1|یک ویرایش|$1 ویرایش}}',
 'viewdeleted_short' => 'نمایش {{PLURAL:$1|یک ویرایش حذف‌شده|$1 ویرایش حذف‌شده}}',
 'protect' => 'محافظت',
@@ -667,7 +682,7 @@ $1',
 'pool-queuefull' => 'صف مخزن پر است',
 'pool-errorunknown' => 'خطای ناشناخته',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'دربارهٔ {{SITENAME}}',
 'aboutpage' => 'Project:درباره',
 'copyright' => 'محتوایات تحت اجازه‌نامهٔ $1 هستند مگر اینکه خلافش ذکر شده باشد.',
@@ -677,7 +692,6 @@ $1',
 'disclaimers' => 'تکذیب‌نامه‌ها',
 'disclaimerpage' => 'Project:تکذیب‌نامهٔ عمومی',
 'edithelp' => 'راهنمای ویرایش‌کردن',
-'edithelppage' => 'Help:ویرایش',
 'helppage' => 'Help:محتوا',
 'mainpage' => 'صفحهٔ اصلی',
 'mainpage-description' => 'صفحهٔ اصلی',
@@ -758,19 +772,12 @@ $1',
 # General errors
 'error' => 'خطا',
 'databaseerror' => 'خطای پایگاه داده',
-'dberrortext' => 'اشکال نحوی در درخواست فرستاده شده به پایگاه داده رخ داد.
-دلیل این مشکل می‌تواند ایرادی در نرم‌افزار باشد.
-آخرین درخواست که برای پایگاه داده فرستاد شد این بود:
-<blockquote class="mw-content-ltr"><code>$1</code></blockquote>
-این درخواست از درون عملگر «<span class="mw-content-ltr"><code>$2</code></span>» فرستاده شد.
-پایگاه داده این خطا را بازگرداند:
-<div class="mw-content-ltr"><samp>$3: $4</samp></div>',
-'dberrortextcl' => 'اشکال نحوی در درخواست فرستاده شده به پایگاه داده رخ داد.
-آخرین درخواستی که برای پایگاه داده فرستاد شد این بود:
-<div class="mw-content-ltr">$1</div>
-این درخواست از درون عملگر «<span class="mw-content-ltr">$2</span>» فرستاده شد.
-پایگاه داده این خطا را بازگرداند:
-<div class="mw-content-ltr">$3: $4</div>',
+'databaseerror-text' => 'مشکلی در پایگاه‌داده‌ها رخ داده‌است. 
+این ممکن است نشان‌دهندهٔ ایرادی در نرم‌افزار باشد.',
+'databaseerror-textcl' => 'یک خطای پرس‌وجوی پایگاه داده‌های رخ داده‌است.',
+'databaseerror-query' => 'پرس‌وجو: $1',
+'databaseerror-function' => 'تابع: $1',
+'databaseerror-error' => 'خطا: $1',
 'laggedslavemode' => "'''هشدار:''' صفحه ممکن است به‌روزرسانی‌های اخیر را شامل نشود.",
 'readonly' => 'پایگاه داده قفل شد',
 'enterlockreason' => 'دلیلی برای قفل کردن ذکر کنید، که حاوی تقریبی از زمانی باشد که قفل برداشته خواهد شد',
@@ -804,6 +811,7 @@ $1',
 'cannotdelete-title' => 'نمی‌توان صفحهٔ «$1» را حذف کرد',
 'delete-hook-aborted' => 'حذف توسط قلاب لغو شد.
 توضیحی در این مورد داده نشد.',
+'no-null-revision' => 'امکان ایجاد نسخهٔ پوچ برای صفحهٔ «$1» وجود نداشت',
 'badtitle' => 'عنوان بد',
 'badtitletext' => 'عنوان درخواستی نامعتبر، خالی، یا عنوانی میان‌زبانی یا میان‌ویکی‌ای با پیوند نادرست بود.
 ممکن است حاوی یک یا چند نویسه باشد که نمی‌توانند در عنوان‌ها استفاده شوند.',
@@ -827,12 +835,15 @@ $1',
 'editinginterface' => "'''هشدار:''' صفحه‌ای که ویرایش می‌کنید شامل متنی است که در واسط کاربر این نرم‌افزار به کار رفته‌است.
 تغییر این صفحه منجر به تغییر ظاهر واسط کاربر این نرم‌افزار برای دیگر کاربران خواهد شد.
 برای افزودن یا تغییر دادن ترجمه برای همهٔ ویکی‌ها، لطفاً از [//translatewiki.net/ translatewiki.net]، پروژهٔ محلی‌سازی مدیاویکی، استفاده کنید.",
-'sqlhidden' => '(دستور اس‌کیوال پنهان شده)',
 'cascadeprotected' => 'این صفحه در مقابل ویرایش محافظت شده‌است چون در {{PLURAL:$1|صفحهٔ|صفحه‌های}} محافظت‌شدهٔ زیر که گزینهٔ «آبشاری» در {{PLURAL:$1|آن|آن‌ها}} انتخاب شده قرار گرفته‌است:
 $2',
 'namespaceprotected' => "شما اجازهٔ ویرایش صفحه‌های فضای نام '''$1''' را ندارید.",
 'customcssprotected' => 'شما اجازهٔ ویرایش این صفحهٔ سی‌اس‌اس را ندارید، زیرا حاوی تنظیم‌های شخصی یک کاربر دیگر است.',
 'customjsprotected' => 'شما اجازهٔ ویرایش این صفحهٔ جاوااسکریپت را ندارید، زیرا حاوی تنظیم‌های شخصی یک کاربر دیگر است.',
+'mycustomcssprotected' => 'شما دارای مجوز ویرایش این صفحهٔ سی‌اس‌اس نیستید.',
+'mycustomjsprotected' => 'شما دارای مجوز ویرایش این صفحهٔ جاوااسکریپت نیستید.',
+'myprivateinfoprotected' => 'شما دارای مجوز ویرایش اطلاعات شخصی خود نیستید.',
+'mypreferencesprotected' => 'شما دارای مجوز ویرایش تنظیمات خود نیستید.',
 'ns-specialprotected' => 'صفحه‌های ویژه غیر قابل ویرایش هستند.',
 'titleprotected' => "این عنوان توسط [[User:$1|$1]] در برابر ایجاد محافظت شده‌است.
 دلیل ارائه‌شده این است: «''$2''».",
@@ -856,10 +867,19 @@ $2',
 'welcomecreation-msg' => 'حساب کاربری شما ایجاد شده است.
 فراموش نکنید که [[Special:Preferences|ترجیحات {{SITENAME}}]] خود را تغییر دهید.',
 'yourname' => 'نام کاربری:',
+'userlogin-yourname' => 'نام کاربری',
+'userlogin-yourname-ph' => 'نام کاربریتان را وارد کنید',
+'createacct-another-username-ph' => 'نام کاربریتان را وارد کنید',
 'yourpassword' => 'رمز عبور:',
+'userlogin-yourpassword' => 'گذرواژه',
+'userlogin-yourpassword-ph' => 'گذرواژه را وارد کنید',
+'createacct-yourpassword-ph' => 'یک گذرواژه وارد کنید',
 'yourpasswordagain' => 'تکرار گذرواژه:',
+'createacct-yourpasswordagain' => 'گذرواژه را دوباره وارد کنید',
+'createacct-yourpasswordagain-ph' => 'گذرواژه را وارد کنید برای بار دوم',
 'remembermypassword' => 'گذرواژه را (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) در این رایانه به خاطر بسپار',
-'securelogin-stick-https' => 'پس از ورود به سامانه به HTTPS متصل بمان',
+'userlogin-remembermypassword' => 'من را واردشده نگه‌دار',
+'userlogin-signwithsecure' => 'از ورود امن استفاده کنید',
 'yourdomainname' => 'دامنهٔ شما:',
 'password-change-forbidden' => 'شما نمی‌توانید گذرواژه‌ها را در این ویکی تغییر دهید.',
 'externaldberror' => 'خطایی در ارتباط با پایگاه داده رخ داده‌است یا اینکه شما اجازهٔ به‌روزرسانی حساب خارجی خود را ندارید.',
@@ -871,18 +891,44 @@ $2',
 'logout' => 'خروج از سامانه',
 'userlogout' => 'خروج از سامانه',
 'notloggedin' => 'به سامانه وارد نشده‌اید',
+'userlogin-noaccount' => 'حساب کاربری ندارید؟',
+'userlogin-joinproject' => 'در {{SITENAME}} نام‌نویسی کنید!',
 'nologin' => 'حساب کاربری ندارید؟ $1.',
 'nologinlink' => 'یک حساب کاربری جدید بسازید',
 'createaccount' => 'ایجاد حساب کاربری',
 'gotaccount' => 'حساب کاربری دارید؟ $1.',
 'gotaccountlink' => 'به سامانه وارد شوید',
 'userlogin-resetlink' => 'جزئیات ورود را فراموش کرده‌اید؟',
+'userlogin-resetpassword-link' => 'گذرواژه‌تان را فراموش کردید؟',
+'helplogin-url' => 'Help:ورود به سامانه',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|راهنمای ورود به سامانه]]',
+'userlogin-loggedin' => 'شما در حال حاضر به‌عنوان {{GENDER:$1|$1}} وارد سیستم شده‌اید.
+از فرم پایین برای ورود به‌عنوان یک کاربر دیگر استفاده کنید.',
+'userlogin-createanother' => 'ایجاد یک حساب کاربری دیگر',
+'createacct-join' => 'اطلاعاتتان را در زیر وارد کنید',
+'createacct-another-join' => 'در زیر اطلاعات کاربری جدیدتان را وارد کنید.',
+'createacct-emailrequired' => 'نشانی رایانامه',
+'createacct-emailoptional' => 'نشانی رایانامه (اختیاری)',
+'createacct-email-ph' => 'نشانی رایانامه را وارد کنید',
+'createacct-another-email-ph' => 'نشانی رایانامه را وارد کنید',
 'createaccountmail' => 'استفاده از رمز عبور موقت تصادفی و فرستادن آن به نشانی ایمیل مشخص‌شده',
+'createacct-realname' => 'نام واقعی (اختیاری)',
 'createaccountreason' => 'دلیل:',
+'createacct-reason' => 'دلیل',
+'createacct-reason-ph' => 'چرا شما حساب دیگری می‌سازید؟',
+'createacct-captcha' => 'بررسی امنیتی',
+'createacct-imgcaptcha-ph' => 'متن تصویری که در بالا می‌بینید، وارد کنید',
+'createacct-submit' => 'حسابتان را بسازید',
+'createacct-another-submit' => 'ایجاد حساب کاربری دیگر',
+'createacct-benefit-heading' => '{{SITENAME}} توسط افرادی مانند شما ساخته شده‌است',
+'createacct-benefit-body1' => '{{PLURAL:$1|ویرایش}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|صفحه}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|مشارکت‌کنندهٔ|مشارکت‌کنندگان}} اخیر',
 'badretype' => 'گذرواژه‌هایی که وارد کرده‌اید یکسان نیستند.',
 'userexists' => 'نام کاربری‌ای که وارد کردید قبلاً استفاده شده‌است.
 لطفاً یک نام دیگر انتخاب کنید.',
 'loginerror' => 'خطا در ورود به سامانه',
+'createacct-error' => 'خطای ایجاد حساب کاربری',
 'createaccounterror' => 'امکان ساختن این حساب وجود ندارد: $1',
 'nocookiesnew' => 'حساب کاربری ایجاد شد، اما شما وارد سامانه نشدید.
 {{SITENAME}} برای ورود کاربران به سامانه از کوکی استفاده می‌کند.
@@ -947,11 +993,13 @@ $2',
 
 اگر این حساب اشتباهی ساخته شده است، این پیغام را نادیده بگیرید.',
 'usernamehasherror' => 'نام کاربری نمی‌تواند شامل نویسه‌های درهم باشد',
-'login-throttled' => 'شما چندین‌بار برای ورود به سامانه تلاش کرده‌اید.
-لطفاً پیش از آنکه دوباره تلاش کنید کمی صبر کنید.',
+'login-throttled' => 'شما به تازگی چندین‌بار برای ثبت ورود تلاش کرده‌اید.
+لطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.',
 'login-abort-generic' => 'ورود شما به سیستم ناموفق بود - خاتمهٔ ناگهانی داده شد',
 'loginlanguagelabel' => 'زبان: $1',
 'suspicious-userlogout' => 'درخواست شما برای خروج از سامانه رد شد زیرا به نظر می‌رسد که این درخواست توسط یک مرورگر معیوب یا پروکسی میانگیر ارسال شده باشد.',
+'createacct-another-realname-tip' => 'نام واقعی اختیاری است.
+اگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آن‌ها به شما از نام واقعی‌تان استفاده خواهد شد.',
 
 # Email sending
 'php-mail-error-unknown' => 'خطای ناشناخته در تابع  mail()‎ پی‌اچ‌پی',
@@ -968,8 +1016,7 @@ $2',
 'newpassword' => 'گذرواژهٔ جدید:',
 'retypenew' => 'گذرواژهٔ جدید را دوباره وارد کنید',
 'resetpass_submit' => 'تنظیم گذرواژه و ورود به سامانه',
-'resetpass_success' => 'گذرواژهٔ شما با موفقیت تغییر یافت!
-اکنون وارد خواهید شد...',
+'changepassword-success' => 'گذرواژهٔ شما با موفقیت تغییر داده شد!',
 'resetpass_forbidden' => 'نمی‌توان گذرواژه‌ها را تغییر داد',
 'resetpass-no-info' => 'برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.',
 'resetpass-submit-loggedin' => 'تغییر گذرواژه',
@@ -981,10 +1028,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'بازنشانی گذرواژه',
-'passwordreset-text' => 'این فرم برای تنظیم مجدد رمز عبور خود را پر کنید.',
+'passwordreset-text-one' => 'برای بازنشانی گذرواژه‌تان این فرم را کامل کنید.',
+'passwordreset-text-many' => '{{PLURAL:$1|یکی از موارد را برای بازنشانی گذرواژه‌تان پر کنید.}}',
 'passwordreset-legend' => 'بازنشانی گذرواژه',
 'passwordreset-disabled' => 'بازنشانی گذرواژه در این ویکی غیرفعال شده است.',
-'passwordreset-pretext' => '{{PLURAL:$1||یکی از قطعه‌های داده را در زیر وارد کنید}}',
+'passwordreset-emaildisabled' => 'ویژگی‌های رایانامه در این ویکی نافعال شده‌اند.',
 'passwordreset-username' => 'نام کاربری:',
 'passwordreset-domain' => 'دامنه:',
 'passwordreset-capture' => 'رایانامهٔ نهایی نشان داده شود؟',
@@ -1007,7 +1055,7 @@ $2
 گذرواژهٔ موقت: $2',
 'passwordreset-emailsent' => 'یک نامهٔ بازنشانی گذرواژه فرستاده شده است.',
 'passwordreset-emailsent-capture' => 'یک رایانامهٔ بازنشانی که در پایین نمایش داده شده، فرستاده شده است.',
-'passwordreset-emailerror-capture' => 'رایانامهٔ یادآور همانطور که در زیر مشاهده می‌فرمایید ایجاد شد ولی ارسال آن به کاربر موفقیت‌آمیز نبود: $1',
+'passwordreset-emailerror-capture' => 'رایانامهٔ بازنشانی، که در زیر نمایش داده شده، ایجاد شد، ولی ارسال آن به {{GENDER:$2|کاربر}} موفقیت‌آمیز نبود: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'تغییر نشانی رایانامه',
@@ -1021,6 +1069,18 @@ $2
 'changeemail-submit' => 'تغییر رایانامه',
 'changeemail-cancel' => 'انصراف',
 
+# Special:ResetTokens
+'resettokens' => 'بازنشانی شناساننده‌ها',
+'resettokens-text' => 'شما می توانید شناساننده‌ها که اجازهٔ دسترسی به برخی داده‌های خصوصی مرتبط با حسابتان را می‌دهد بازنشانی کنید.
+در صورتی باید این کار را انجام دهید که تصادقاً آن‌ها را با کسی در میان گذاشته‌اید یا به حسابتان نفوذ شده است.',
+'resettokens-no-tokens' => 'هیچ شناساننده‌ای برای بازنشانی وجود ندارد.',
+'resettokens-legend' => 'بازنشانی شناساننده‌ها',
+'resettokens-tokens' => 'شناساننده‌ها:',
+'resettokens-token-label' => '$1 (مقدار کنونی: $2)',
+'resettokens-watchlist-token' => 'شناساننده برای خوراک وبِ [[Special:Watchlist|تغییرات صفحه‌هایی که پیگیری می‌کنید]] (اتم/آراس‌اس)',
+'resettokens-done' => 'بازنشانی شناساننده‌ها.',
+'resettokens-resetbutton' => 'بازشناسی شناساننده‌های گزیده‌شده.',
+
 # Edit page toolbar
 'bold_sample' => 'متن پررنگ',
 'bold_tip' => 'متن پررنگ',
@@ -1225,12 +1285,15 @@ $2
 به نظرمی‌رسد که صفحه حذف شده باشد.',
 'edit-conflict' => 'تعارض ویرایشی.',
 'edit-no-change' => 'ویرایش شما نادیده گرفته شد، زیرا تغییری در متن داده نشده بود.',
+'postedit-confirmation' => 'ویرایش شما ذخیره شد.',
 'edit-already-exists' => 'امکان ساختن صفحهٔ جدید وجود ندارد.
 این صفحه از قبل وجود داشته‌است.',
 'defaultmessagetext' => 'متن پیش‌فرض پیغام',
 'content-failed-to-parse' => 'عدم موفقیت در تجزیه محتوای $2 برای مدل $1: $3',
 'invalid-content-data' => 'داده محتوای نامعتبر',
 'content-not-allowed-here' => 'محتوای «$1» در صفحهٔ [[$2]] مجاز نیست',
+'editwarning-warning' => 'خروج از این صفحه ممکن است باعث از دست رفتن هرچه نوشته‌اید شود.
+اگر شما با نام کاربری وارد شده‌اید می‌توانید این هشدار را در بخش «در حال ویرایش» ترجیحاتتان بیابید.',
 
 # Content models
 'content-model-wikitext' => 'ویکی‌متن',
@@ -1266,6 +1329,7 @@ $2
 'undo-failure' => 'به علت تعارض با ویرایش‌های میانی، این ویرایش را نمی‌توان خنثی کرد.',
 'undo-norev' => 'این ویرایش را نمی‌توان خنثی کرد چون وجود ندارد یا حذف شده‌است.',
 'undo-summary' => 'خنثی‌سازی ویرایش $1 توسط [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])',
+'undo-summary-username-hidden' => 'خنثی‌سازی نسخهٔ $1 به دست یک کاربر پنهان‌شده',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'نمی‌توان حساب باز کرد',
@@ -1444,6 +1508,7 @@ $1",
 'compareselectedversions' => 'مقایسهٔ نسخه‌های انتخاب‌شده',
 'showhideselectedversions' => 'نمایش/نهفتن نسخه‌های انتخاب شده',
 'editundo' => 'خنثی‌سازی',
+'diff-empty' => '(بدون تفاوت)',
 'diff-multi' => '({{PLURAL:$1|یک|$1}} ویرایش میانی توسط {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده‌است)',
 'diff-multi-manyusers' => '({{PLURAL:$1|یک|$1}} ویرایش میانی توسط بیش از {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده‌است)',
 'difference-missing-revision' => '{{PLURAL:$2|یک ویرایش|$2 ویرایش}}  از تفاوت نسخه‌ها ($1) {{PLURAL:$2|یافت|یافت}}  نشد.
@@ -1471,7 +1536,6 @@ $1",
 'searchmenu-legend' => 'گزینه‌های جستجو',
 'searchmenu-exists' => "'''صفحه‌ای با عنوان \"[[:\$1]]\" در این ویکی وجود دارد.'''",
 'searchmenu-new' => "'''صفحهٔ «[[:$1]]» را در این ویکی بسازید!'''",
-'searchhelp-url' => 'Help:محتوا',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|مرور صفحه‌های با این پیشوند]]',
 'searchprofile-articles' => 'صفحه‌های محتوایی',
 'searchprofile-project' => 'صفحه‌های راهنما و پروژه',
@@ -1515,15 +1579,7 @@ $1",
 'searchdisabled' => 'جستجو در {{SITENAME}} فعال نیست.
 موقتاً می‌توانید از جستجوی Google استفاده کنید.
 توجه کنید که نتایج حاصل از جستجو با آن روش ممکن است به‌روز نباشند.',
-
-# Quickbar
-'qbsettings' => 'نوار سریع',
-'qbsettings-none' => 'نباشد',
-'qbsettings-fixedleft' => 'ثابت چپ',
-'qbsettings-fixedright' => 'ثابت راست',
-'qbsettings-floatingleft' => 'شناور چپ',
-'qbsettings-floatingright' => 'شناور راست',
-'qbsettings-directionality' => 'ثابت، بسته به جهت نگارش زبان شما',
+'search-error' => 'خطایی هنگام جست‌وجو رخ داده است: $1',
 
 # Preferences page
 'preferences' => 'ترجیحات',
@@ -1557,7 +1613,6 @@ $1",
 'resetprefs' => 'صفرکردن ترجیحات',
 'restoreprefs' => 'برگرداندن تمام تنظیمات پیش‌فرض (در تمامی قسمت‌ها)',
 'prefs-editing' => 'ویرایش',
-'prefs-edit-boxsize' => 'اندازهٔ پنجرهٔ ویرایش.',
 'rows' => 'تعداد سطرها:',
 'columns' => 'تعداد ستون‌ها:',
 'searchresultshead' => 'جستجو',
@@ -1568,9 +1623,8 @@ $1",
 'recentchangesdays-max' => 'حداکثر $1 {{PLURAL:$1|روز}}',
 'recentchangescount' => 'تعداد پیش‌فرض ویرایش‌های نمایش یافته:',
 'prefs-help-recentchangescount' => 'این گزینه شامل تغییرات اخیر، تاریخچهٔ صفحه‌ها و سیاهه‌ها می‌شود.',
-'prefs-help-watchlist-token' => 'پرکردن این بخش با یک کلید رمز سبب ایجاد یک خوراک آراس‌اس برای فهرست پی‌گیری شما می‌شود.
-هر کس که این کلید را بداند می‌تواند فهرست پی‌گیری شما را بخواند، پس مقداری ایمن انتخاب کنید.
-مقدار تصادفی که برای شما ایجاد شده‌است: $1',
+'prefs-help-watchlist-token2' => 'این کلید رمز خوراک وب فهرست پی‌گیری‌های شماست.
+هرکس آن را بداند می‌تواند فهرست پی‌گیری‌هایتان را بخواند، بنابراین آن را به اشتراک نگذارید. [[Special:ResetTokens|اگر لازم است آن را تغییر دهید اینجا را کلیک کنید]].',
 'savedprefs' => 'ترجیحات شما ذخیره شد.',
 'timezonelegend' => 'منطقهٔ زمانی:',
 'localtime' => 'زمان محلی:',
@@ -1601,7 +1655,6 @@ $1",
 'prefs-reset-intro' => 'شما می‌توانید از این صفحه برای بازگرداندن تنظیمات خود به پیش‌فرض تارنما استفاده کنید.
 این کار بازگشت‌ناپذیر است.',
 'prefs-emailconfirm-label' => 'تأیید رایانامه:',
-'prefs-textboxsize' => 'اندازهٔ جعبهٔ ویرایش',
 'youremail' => 'رایانامه:',
 'username' => '{{GENDER:$1|نام کاربری}}:',
 'uid' => 'شناسهٔ {{GENDER:$1|کاربری}}:',
@@ -1637,6 +1690,8 @@ $1",
 'prefs-dateformat' => 'آرایش تاریخ',
 'prefs-timeoffset' => 'فاصلهٔ زمانی',
 'prefs-advancedediting' => 'تنظیمات عمومی',
+'prefs-editor' => 'ویرایشگر',
+'prefs-preview' => 'پیش‌نمایش',
 'prefs-advancedrc' => 'گزینه‌های پیشرفته',
 'prefs-advancedrendering' => 'گزینه‌های پیشرفته',
 'prefs-advancedsearchoptions' => 'گزینه‌های پیشرفته',
@@ -1644,7 +1699,9 @@ $1",
 'prefs-displayrc' => 'گزینه‌های نمایش',
 'prefs-displaysearchoptions' => 'گزینه‌های نمایش',
 'prefs-displaywatchlist' => 'گزینه‌های نمایش',
+'prefs-tokenwatchlist' => 'نشانه',
 'prefs-diffs' => 'تفاوت‌ها',
+'prefs-help-prefershttps' => 'تأثیر این ترجیح بعد از ورود بعدی شما اعمال خواهد شد.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'نشانی رایانامه معتبر به نظر می‌رسد',
@@ -1671,6 +1728,8 @@ $1",
 'userrights-notallowed' => 'شما مجوز برای افزودن یا حذف حقوق کاربر را ندارید.',
 'userrights-changeable-col' => 'گروه‌هایی که می‌توانید تغییر دهید',
 'userrights-unchangeable-col' => 'گروه‌هایی که نمی‌توانید تغییر دهید',
+'userrights-conflict' => 'تعارض دسترسی‌های کاربری! لطفاً بررسی کنید و تغییرات را تأیید کنید.',
+'userrights-removed-self' => 'شما با موفقیت دسترسی‌های خود را واستاندید. به این ترتیب شما دیگر به این صفحه دسترسی ندارید.',
 
 # Groups
 'group' => 'گروه:',
@@ -1736,11 +1795,19 @@ $1",
 'right-proxyunbannable' => 'تاثیر نپذیرفتن از قطع دسترسی خودکار پروکسی‌ها',
 'right-unblockself' => 'بازکردن دسترسی خود',
 'right-protect' => 'تغییر میزان محافظت صفحه‌ها و ویرایش صفحه‌های محافظت شده آبشاری',
-'right-editprotected' => 'ویرایش صفحه‌های محافظت شده (به شرط نبود محافظت آبشاری)',
+'right-editprotected' => 'ویرایش صفحه‌های محافظت شده به عنوان "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'ویرایش صفحه حفاظت‌شده به عنوان "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'ویرایش واسط کاربری',
 'right-editusercssjs' => 'ویرایش صفحه‌های CSS و JS دیگر کاربرها',
 'right-editusercss' => 'ویرایش صفحه‌های CSS دیگر کاربرها',
 'right-edituserjs' => 'ویرایش صفحه‌های JS دیگر کاربرها',
+'right-editmyusercss' => 'پرونده‌های سی‌اس‌اس کاربری خود را ویرایش کنید',
+'right-editmyuserjs' => 'پرونده‌های جاوااسکریپت کاربری خود را ویرایش کنید',
+'right-viewmywatchlist' => 'فهرست پیگیری‌های خود را ببینید',
+'right-editmywatchlist' => 'فهرست پیگیری‌های خود را ویرایش کنید. توجه داشته باشید برخی از اقدامات حتی بدون این دسترسی هم صفحه‌ها را اضافه می‌کنند.',
+'right-viewmyprivateinfo' => 'داده‌های خصوصی خود را ببینید (مانند رایانشانی و نام واقعی)',
+'right-editmyprivateinfo' => 'داده‌های خصوصی خود را ویرایش کنید (مانند رایانشانی و نام واقعی)',
+'right-editmyoptions' => 'ترجیحات خود را ویرایش',
 'right-rollback' => 'واگردانی سریع ویرایش‌های آخرین کاربری که یک صفحه را ویرایش کرده‌است',
 'right-markbotedits' => 'علامت‌زدن ویرایش‌های واگردانی‌شده به‌عنوان ویرایش ربات',
 'right-noratelimit' => 'تاثیر نپذیرفتن از محدودیت سرعت',
@@ -1802,12 +1869,19 @@ $1",
 'action-userrights-interwiki' => 'ویرایش اختیارات کاربری کاربران یک ویکی دیگر',
 'action-siteadmin' => 'قفل کردن و باز کردن پایگاه داده',
 'action-sendemail' => 'ارسال ایمیل',
+'action-editmywatchlist' => 'فهرست پیگیری‌های خود را ویرایش کنید',
+'action-viewmywatchlist' => 'فهرست پیگیری‌های خود را ببینید',
+'action-viewmyprivateinfo' => 'اطلاعات خصوصی خود را ببینید',
+'action-editmyprivateinfo' => 'اطلاعات خصوصی خود را ویرایش کنید',
 
 # Recent changes
 'nchanges' => '$1 تغییر',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|از آخرین بازدید}}',
+'enhancedrc-history' => 'تاریخچه',
 'recentchanges' => 'تغییرات اخیر',
 'recentchanges-legend' => 'گزینه‌های تغییرات اخیر',
 'recentchanges-summary' => 'آخرین تغییرات ویکی را در این صفحه پی‌گیری کنید.',
+'recentchanges-noresult' => 'هیچ تغییری در طول دورهٔ تعیین‌شده با این معیارها هم‌خوانی نداشت.',
 'recentchanges-feed-description' => 'آخرین تغییرات ویکی را در این خوراک پی‌گیری کنید.',
 'recentchanges-label-newpage' => 'این ویرایش صفحه‌ای جدید ایجاد کرد',
 'recentchanges-label-minor' => 'این ویرایش جزئی‌است',
@@ -1844,7 +1918,6 @@ $1",
 'recentchangeslinked-feed' => 'تغییرات مرتبط',
 'recentchangeslinked-toolbox' => 'تغییرات مرتبط',
 'recentchangeslinked-title' => 'تغییرات مرتبط با $1',
-'recentchangeslinked-noresult' => 'در بازهٔ زمانی داده‌شده تغییری در صفحه‌های پیوندداده رخ نداده‌است.',
 'recentchangeslinked-summary' => "در زیر فهرستی از تغییرات اخیر صفحه‌های پیوند داده شده از این صفحه (یا اعضای رده مورد نظر) را می‌بینید.
 صفحه‌هایی که در [[Special:Watchlist|فهرست پی‌گیری‌هایتان]] باشند به صورت '''پررنگ''' نشان داده می‌شوند.",
 'recentchangeslinked-page' => 'نام صفحه:',
@@ -1856,7 +1929,7 @@ $1",
 'reuploaddesc' => 'بازگشت به فرم بارگذاری',
 'upload-tryagain' => 'ارسال توضیحات تغییر یافته پرونده',
 'uploadnologin' => 'به سامانه وارد نشده‌اید',
-'uploadnologintext' => 'برای بارگذاری پرونده‌ها باید [[Special:UserLogin|به سامانه وارد شوید]].',
+'uploadnologintext' => 'برای بارگذاری پرونده باید $1.',
 'upload_directory_missing' => 'شاخهٔ بارگذاری ($1) وجود ندارد و قابل ایجاد نیست.',
 'upload_directory_read_only' => 'شاخهٔ بارگذاری ($1) از طرف سرور وب قابل نوشتن نیست.',
 'uploaderror' => 'خطای بارگذاری',
@@ -2081,7 +2154,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'http-read-error' => 'خطای خواندن اچ‌تی‌تی‌پی.',
 'http-timed-out' => 'مهلت درخواست اچ‌تی‌تی‌پی به سر رسید.',
 'http-curl-error' => 'خطا در آوردن نشانی اینترنتی: $1',
-'http-host-unreachable' => 'دسترسی به نشانی اینترنتی ممکن نشد.',
 'http-bad-status' => 'در حین درخواست اچ‌تی‌تی‌پی خطایی رخ داد: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2112,6 +2184,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'listfiles_size' => 'اندازه',
 'listfiles_description' => 'توضیح',
 'listfiles_count' => 'نسخه‌ها',
+'listfiles-show-all' => 'شامل نسخه‌های قدیمی عکس‌ها',
+'listfiles-latestversion' => 'نسخهٔ فعلی',
+'listfiles-latestversion-yes' => 'بله',
+'listfiles-latestversion-no' => 'خیر',
 
 # File description page
 'file-anchor-link' => 'پرونده',
@@ -2209,6 +2285,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'randompage' => 'مقالهٔ تصادفی',
 'randompage-nopages' => 'هیچ صفحه‌ای در این {{PLURAL:$2|فضای نام|فضاهای نام}} موجود نیست: $1.',
 
+# Random page in category
+'randomincategory' => 'صفحهٔ تصادفی در رده',
+'randomincategory-invalidcategory' => '«$1» نامی معتبر برای یک ردهٔ نیست.',
+'randomincategory-nopages' => 'هیج صفحه‌ای در رده [[:Category:$1|$1]] وجود ندارد.',
+'randomincategory-selectcategory' => 'دریافت صفحه‌ای تصادفی از دسته‌بندی: $1 $2.',
+'randomincategory-selectcategory-submit' => 'برو',
+
 # Random redirect
 'randomredirect' => 'تغییرمسیر تصادفی',
 'randomredirect-nopages' => 'هیج صفحهٔ تغییرمسیری در فضای نام «$1» موجود نیست.',
@@ -2234,17 +2317,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'statistics-users-active-desc' => 'کاربرانی که در {{PLURAL:$1|روز|$1 روز}} قبل فعالیتی انجام داده‌اند',
 'statistics-mostpopular' => 'صفحه‌هایی که بیشترین تعداد بازدیدکننده را داشته‌اند',
 
-'disambiguations' => 'صفحه‌های دارای پیوند به صفحه‌های ابهام‌زدایی',
-'disambiguationspage' => 'Template:ابهام‌زدایی',
-'disambiguations-text' => "صفحه‌های زیر حاوی حداقل یک پیوند به یک '''صفحهٔ ابهام‌زدایی''' هستند.
-این صفحه‌ها شاید در عوض به موضوعات مرتبط پیوند داده شوند.<br />
-یک صفحه هنگامی صفحهٔ ابهام‌زدایی در نظر گرفته می‌شود که در آن از الگویی که به [[MediaWiki:Disambiguationspage]] پیوند دارد استفاده شده باشد.",
-
 'pageswithprop' => 'صفحه‌های دارای خاصیت صفحه',
 'pageswithprop-legend' => 'صفحه‌های دارای خاصیت صفحه',
 'pageswithprop-text' => 'این صفحه فهرستی است از صفحه‌هایی که از یک خاصیت صفحهٔ خاص استفاده می‌کنند.',
 'pageswithprop-prop' => 'نام خاصیت:',
 'pageswithprop-submit' => 'برو',
+'pageswithprop-prophidden-long' => 'جزییات مخفی متن طولانی ($1)',
+'pageswithprop-prophidden-binary' => 'جزییات مقدار مخفی باینری ($1)',
 
 'doubleredirects' => 'تغییرمسیرهای دوتایی',
 'doubleredirectstext' => 'این صفحه فهرستی از صفحه‌های تغییرمسیری را ارائه می‌کند که به صفحهٔ تغییرمسیر دیگری اشاره می‌کنند.
@@ -2302,6 +2381,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'mostrevisions' => 'صفحه‌های دارای بیشترین نسخه',
 'prefixindex' => 'تمام صفحه‌ها با پیشوند',
 'prefixindex-namespace' => 'همهٔ صفحه‌های دارای پیشوند (فضای‌نام $1)',
+'prefixindex-strip' => 'حذف پیشوند در فهرست',
 'shortpages' => 'صفحه‌های کوتاه',
 'longpages' => 'صفحه‌های بلند',
 'deadendpages' => 'صفحه‌های بن‌بست',
@@ -2317,6 +2397,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'listusers' => 'فهرست کاربران',
 'listusers-editsonly' => 'فقط کاربرانی که ویرایش دارند را نشان بده',
 'listusers-creationsort' => 'مرتب کردن بر اساس تاریخ ایجاد',
+'listusers-desc' => 'ترتیب نزولی',
 'usereditcount' => '$1 {{PLURAL:$1|ویرایش|ویرایش}}',
 'usercreated' => '{{GENDER:$3|ایجادشده}} در تاریخ $1 در ساعت $2',
 'newpages' => 'صفحه‌های تازه',
@@ -2493,10 +2574,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'unwatchthispage' => 'توقف پی‌گیری',
 'notanarticle' => 'صفحه محتوایی نیست',
 'notvisiblerev' => 'آخرین نسخه توسط کاربری دیگر حذف شده‌است',
-'watchnochange' => 'هیچ یک از موارد در حال پی‌گیری شما در دورهٔ زمانی نمایش‌یافته ویرایش نشده است.',
 'watchlist-details' => 'بدون احتساب صفحه‌های بحث، {{PLURAL:$1|$1 صفحه|$1 صفحه}} در فهرست پی‌گیری‌های شما قرار {{PLURAL:$1|دارد|دارند}}.',
-'wlheader-enotif' => '*اطلاع‌رسانی از طریق رایانامه امکان‌پذیر است.',
-'wlheader-showupdated' => "*صفحه‌هایی که پس از آخرین سرزدنتان به آنها تغییر کرده‌اند '''پررنگ''' نشان داده شده‌اند.",
+'wlheader-enotif' => 'آگاه‌سازی رایانامه‌ای فعال است.',
+'wlheader-showupdated' => "صفحه‌هایی که پس از آخرین بازدید شما تغییر کرده‌اند '''پررنگ''' نمایش داده شده‌اند.",
 'watchmethod-recent' => 'بررسی ویرایش‌های اخیر برای صفحه‌های مورد پی‌گیری',
 'watchmethod-list' => 'بررسی صفحه‌های مورد پی‌گیری برای ویرایش‌های اخیر',
 'watchlistcontains' => 'فهرست پی‌گیری‌های شما حاوی $1 {{PLURAL:$1|صفحه|صفحه}} است.',
@@ -2752,7 +2832,7 @@ $1',
 'contributions' => 'مشارکت‌های {{GENDER:$1|کاربر}}',
 'contributions-title' => 'مشارکت‌های کاربری $1',
 'mycontris' => 'مشارکت‌ها',
-'contribsub2' => 'برای $1 ($2)',
+'contribsub2' => 'برای {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'هیچ تغییری با این مشخصات یافت نشد.',
 'uctop' => '(بالا)',
 'month' => 'در این ماه (و پیش از آن):',
@@ -2911,15 +2991,13 @@ $1',
 این نشانی به همراه بازه $2 بسته شده که قابل باز شدن است.',
 'ip_range_invalid' => 'بازهٔ آی‌پی نامعتبر.',
 'ip_range_toolarge' => 'قطع دسترسی بازه‌های بزرگتر از /$1 مجاز نیست.',
-'blockme' => 'دسترسی مرا قطع کن',
 'proxyblocker' => 'مسدود کننده پروکسی',
-'proxyblocker-disabled' => 'این عملکرد غیرفعال شده‌است.',
 'proxyblockreason' => 'نشانی آی‌پی شما بسته شده است چون متعلق به یک پروکسی باز است.
 لطفاً با ارائه دهندهً خدمات اینترنت خود یا پشتیبانی فنی تماس بگیرید و آنها را از این مشکل امنیتی جدی آگاه کنید.',
-'proxyblocksuccess' => 'انجام شد.',
 'sorbsreason' => 'نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.',
 'sorbs_create_account_reason' => 'نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.
 شما اجازهٔ ساختن حساب کاربری ندارید.',
+'xffblockreason' => 'نشانی آی‌پی در X-Forwarded-For header موجود است و پروکسی شما یا سروری که از آن استفاده می‌کنید بسته‌شده‌است. دلیل بسته‌شدن: $1',
 'cant-block-while-blocked' => 'در مدتی که دسترسی شما بسته است نمی‌توانید دسترسی کاربران دیگر را قطع کنید.',
 'cant-see-hidden-user' => 'کاربری که می‌خواهید ببندید قبلاً بسته شده و پنهان گردیده است. چون شما دسترسی پنهان کردن کاربران را ندارید، نمی‌توانید قطع دسترسی کاربر را ببینید یا ویرایش کنید.',
 'ipbblocked' => 'شما نمی‌توانید دسترسی دیگر کاربران را ببندید یا باز کنید زیرا دسترسی خودتان بسته است.',
@@ -3086,6 +3164,8 @@ $1',
 'thumbnail-more' => 'بزرگ‌کردن',
 'filemissing' => 'پرونده وجود ندارد',
 'thumbnail_error' => 'خطا در ایجاد بندانگشتی: $1',
+'thumbnail_error_remote' => 'پیام خطای  $1 :
+$2',
 'djvu_page_error' => 'صفحهٔ DjVu خارج از حدود مجاز',
 'djvu_no_xml' => 'امکان پیدا کردن پروندهٔ XML برای استفادهٔ DjVu وجود نداشت.',
 'thumbnail-temp-create' => 'نمی‌توان پروندهٔ بندانگشتی موقت را ساخت',
@@ -3311,13 +3391,8 @@ $1',
 'pageinfo-category-files' => 'تعداد پرونده‌ها',
 
 # Skin names
-'skinname-standard' => 'کلاسیک',
-'skinname-nostalgia' => 'نوستالژی',
 'skinname-cologneblue' => 'آبی کلن',
 'skinname-monobook' => 'مونوبوک',
-'skinname-myskin' => 'پوستهٔ من',
-'skinname-chick' => 'شیک',
-'skinname-simple' => 'ساده',
 'skinname-modern' => 'مدرن',
 'skinname-vector' => 'برداری',
 
@@ -3397,11 +3472,25 @@ $1',
 'minutes' => '{{PLURAL: $1|دقیقه|دقیقه}}',
 'hours' => '{{PLURAL: $1|ساعت|ساعت}}',
 'days' => '{{PLURAL: $1|روز|روز}}',
+'weeks' => '{{PLURAL:$1|$1 هفته|$1 هفته}}',
 'months' => '{{PLURAL:$1|$1 ماه|}}',
 'years' => '{{PLURAL:$1|$1 سال|}}',
 'ago' => '$1 پیش',
 'just-now' => 'هم‌اکنون',
 
+# Human-readable timestamps
+'hours-ago' => '$1 ساعت قبل',
+'minutes-ago' => '$1 دقیقه قبل',
+'seconds-ago' => '$1 {{PLURAL:$1|ثانیه|ثانیه}} قبل',
+'monday-at' => 'دوشنبهٔ $1',
+'tuesday-at' => 'سه‌شنبهٔ $1',
+'wednesday-at' => 'چهارشنبهٔ $1',
+'thursday-at' => 'پنج‌شنبهٔ $1',
+'friday-at' => 'جمعهٔ $1',
+'saturday-at' => 'شنبهٔ $1',
+'sunday-at' => 'یک‌شنبهٔ $1',
+'yesterday-at' => 'دیروز در $1',
+
 # Bad image list
 'bad_image_list' => 'اطلاعات را باید اینگونه وارد کنید:
 
@@ -3429,7 +3518,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'عرض',
 'exif-imagelength' => 'طول',
 'exif-bitspersample' => 'نقطه در هر جزء',
@@ -3608,7 +3697,7 @@ $1',
 'exif-originalimageheight' => 'بلندی تصویر قبل از برش دادن',
 'exif-originalimagewidth' => 'پهنای تصویر قبل از برش دادن',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'غیرفشرده',
 'exif-compression-2' => 'رمزگذاری سی‌سی‌آی‌تی‌تی گروه ۳ یک بعدی به روش هافمن تغییریافته روی طول',
 'exif-compression-3' => 'رمزگذاری نمابر سی‌سی‌آی‌تی‌تی گروه ۳',
@@ -4064,7 +4153,6 @@ $5
 'version-other' => 'غیره',
 'version-mediahandlers' => 'به‌دست‌گیرنده‌های رسانه‌ها',
 'version-hooks' => 'قلاب‌ها',
-'version-extension-functions' => 'عملگرهای افزونه',
 'version-parser-extensiontags' => 'برچسب‌های افزونه تجزیه‌گر',
 'version-parser-function-hooks' => 'قلاب‌های عملگر تجزیه‌گر',
 'version-hook-name' => 'نام قلاب',
@@ -4074,6 +4162,7 @@ $5
 'version-license' => 'اجازه‌نامه',
 'version-poweredby-credits' => "این ویکی توسط '''[//www.mediawiki.org/ مدیاویکی]''' پشتیبانی می‌شود، کلیهٔ حقوق محفوظ است © 2001-$1 $2.",
 'version-poweredby-others' => 'دیگران',
+'version-poweredby-translators' => 'مترجمان translatewiki.net',
 'version-credits-summary' => 'افراد زیر را به خاطر ویرایش‌هایش در [[Special:Version|مدیاویکی]] معرفی می‌نمائیم.',
 'version-license-info' => 'مدیاویکی نرم‌افزاری رایگان است؛ می‌توانید آن را تحت شرایط مجوز عمومی همگانی گنو که توسط بنیاد نرم‌افزار رایگان منتشر شده‌است، بازنشر کنید؛ یا نسخهٔ ۲ از این مجوز، یا (بنا به اختیار) نسخه‌های بعدی.
 
@@ -4089,11 +4178,17 @@ $5
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath مسیر مقاله]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath مسیر اسکریپت]',
 
-# Special:FilePath
-'filepath' => 'مسیر پرونده',
-'filepath-page' => 'پرونده:',
-'filepath-submit' => 'برو',
-'filepath-summary' => 'این صفحهٔ ویژه نشانی کامل برای یک پرونده را نشان می‌دهد. تصاویر با کیفیت وضوح کامل نشان داده می‌شوند، سایر انواع پرونده با برنامه مخصوص به خودشان باز می‌شوند.',
+# Special:Redirect
+'redirect' => 'تغییرمسیر توسط پرونده، کاربر یا شناسهٔ نسخه',
+'redirect-legend' => 'تغییرمسیر به یک پرونده یا صفحه',
+'redirect-summary' => 'این صفحهٔ ویژه به پرونده (نام پرونده داده‌شده)، صفحه (شماره شناسهٔ صفحه داده‌شده) یا صفحهٔ کاربری (شناسهٔ عددی کاربری داده‌شده) تغییرمسیر می‌یابد',
+'redirect-submit' => 'برو',
+'redirect-lookup' => 'جستجو:',
+'redirect-value' => 'مقدار:',
+'redirect-user' => 'شناسهٔ کاربر',
+'redirect-revision' => 'نسخهٔ صفحه',
+'redirect-file' => 'نام پرونده',
+'redirect-not-exists' => 'مقدار پیدا نشد',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'جستجو برای پرونده‌های تکراری',
@@ -4142,12 +4237,16 @@ $5
 'tags' => 'برچسب‌های تغییر مجاز',
 'tag-filter' => 'پالایش [[Special:Tags|برچسب‌ها]]:',
 'tag-filter-submit' => 'پالایه',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|برچسب|برچسب}}]]: $2)',
 'tags-title' => 'برچسب‌ها',
 'tags-intro' => 'این صفحه فهرستی‌است از برچسب‌هایی که نرم‌افزار با آن‌ها ویرایش‌ها را علامت‌گذری می‌کند، به همراه معانی آن‌ها.',
 'tags-tag' => 'نام برچسب',
 'tags-display-header' => 'نمایش در فهرست‌های تغییرات',
 'tags-description-header' => 'توضیح کامل معنی',
+'tags-active-header' => 'فعال؟',
 'tags-hitcount-header' => 'تغییرهای برچسب‌دار',
+'tags-active-yes' => 'بله',
+'tags-active-no' => 'خیر',
 'tags-edit' => 'ویرایش',
 'tags-hitcount' => '$1 {{PLURAL:$1|تغییر|تغییر}}',
 
@@ -4168,6 +4267,7 @@ $5
 'dberr-problems' => 'شرمنده! این تارنما از مشکلات فنی رنج می‌برد.',
 'dberr-again' => 'چند دقیقه صبر کند و دوباره صفحه را بارگیری کنید.',
 'dberr-info' => '(امکان برقراری ارتباط با کارساز پایگاه داده وجود ندارد: $1)',
+'dberr-info-hidden' => '(امکان تماس با پایگاه‌داده‌ها کارساز امکان‌پذیر نیست)',
 'dberr-usegoogle' => 'شما در این مدت می‌توانید با استفاده از گوگل جستجو کنید.',
 'dberr-outofdate' => 'توجه کنید که نمایه‌های آن‌ها از محتوای ما ممکن است به روز نباشد.',
 'dberr-cachederror' => 'آن‌چه در ادامه می‌آید یک کپی از صفحهٔ درخواست شده است که در کاشه قرار دارد، و ممکن است به روز نباشد.',
@@ -4183,6 +4283,9 @@ $5
 'htmlform-submit' => 'ارسال',
 'htmlform-reset' => 'خنثی کردن تغییرات',
 'htmlform-selectorother-other' => 'دیگر',
+'htmlform-no' => 'نه',
+'htmlform-yes' => 'بله',
+'htmlform-chosen-placeholder' => 'یک گزینه را انتخاب کنید',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 با پشتیبانی از جستجو در متن کامل',
@@ -4299,4 +4402,19 @@ $5
 # Image rotation
 'rotate-comment' => 'تصویر به دست $1 {{PLURAL:$1|درجهٔ|درجهٔ}} ساعت‌گرد چرخانده شد',
 
+# Limit report
+'limitreport-title' => 'داده‌های رخ‌نمانگاری تجزیه‌کننده:',
+'limitreport-cputime' => 'زمان مصرف سی‌پی‌یو',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|ثانیه}}',
+'limitreport-walltime' => 'استفاده زمان واقعی',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|ثانیه|ثانیه}}',
+'limitreport-ppvisitednodes' => 'شمارش گرهٔ پیش‌پردازنده مشاهده‌شده',
+'limitreport-ppgeneratednodes' => 'شمارش گره پیش‌پردازنده تولیدشده',
+'limitreport-postexpandincludesize' => 'شامل اندازه پس گسترش',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|بایت|بایت}}',
+'limitreport-templateargumentsize' => 'اندازه عملگر الگو',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|بایت|بایت}}',
+'limitreport-expansiondepth' => 'بیشترین عمق گسترش',
+'limitreport-expensivefunctioncount' => 'تعداد تابع تجزیه‌گر پرمصرف',
+
 );
diff --git a/languages/messages/MessagesFi.php b/languages/messages/MessagesFi.php
index b43a274f..1fd5da97 100644
--- a/languages/messages/MessagesFi.php
+++ b/languages/messages/MessagesFi.php
@@ -18,6 +18,7 @@
  * @author Jaakonam
  * @author Jack Phoenix
  * @author Jafeluv
+ * @author Kaanteli
  * @author Kaganer
  * @author Kulmalukko
  * @author Linnea
@@ -27,6 +28,7 @@
  * @author Ochs
  * @author Olli
  * @author Pxos
+ * @author Samoasambia
  * @author Silvonen
  * @author Snidata
  * @author Str4nd
@@ -344,9 +346,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Näytä sivua tarkkailevien käyttäjien määrä',
 'tog-oldsig' => 'Nykyinen allekirjoitus:',
 'tog-fancysig' => 'Muotoilematon allekirjoitus ilman automaattista linkkiä',
-'tog-externaleditor' => 'Käytä ulkoista tekstieditoria oletuksena. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. (<span class="plainlinks">[//www.mediawiki.org/wiki/Manual:External_editors Ohje]</span>)',
-'tog-externaldiff' => 'Käytä oletuksena ulkoista työkalua sivun eri versioiden välisten erojen tarkasteluun. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. (<span class="plainlinks">[//www.mediawiki.org/wiki/Manual:External_editors Ohje]</span>)',
-'tog-showjumplinks' => 'Lisää loikkaa-käytettävyyslinkit sivun alkuun',
 'tog-uselivepreview' => 'Käytä välitöntä esikatselua (kokeellinen)',
 'tog-forceeditsummary' => 'Huomauta minua, jos en ole kirjoittanut yhteenvetoa',
 'tog-watchlisthideown' => 'Piilota omat muokkaukset tarkkailulistalta',
@@ -360,6 +359,8 @@ $messages = array(
 'tog-showhiddencats' => 'Näytä piilotetut luokat',
 'tog-noconvertlink' => 'Älä muunna linkkien otsikoita toiseen kirjoitusjärjestelmään',
 'tog-norollbackdiff' => 'Älä näytä eroavaisuuksia, kun olet palauttanut muokkauksen palauta-työkalulla',
+'tog-useeditwarning' => 'Varoita minua, kun poistun muokkaussivulta tallentamatta muutoksia',
+'tog-prefershttps' => 'Käytä aina suojattua yhteyttä, kun olet kirjautunut sisään',
 
 'underline-always' => 'Aina',
 'underline-never' => 'Ei koskaan',
@@ -423,6 +424,18 @@ $messages = array(
 'oct' => 'lokakuu',
 'nov' => 'marraskuu',
 'dec' => 'joulukuu',
+'january-date' => '$1. tammikuuta',
+'february-date' => '$1. helmikuuta',
+'march-date' => '$1. maaliskuuta',
+'april-date' => '$1. huhtikuuta',
+'may-date' => '$1. toukokuuta',
+'june-date' => '$1. kesäkuuta',
+'july-date' => '$1. heinäkuuta',
+'august-date' => '$1. elokuuta',
+'september-date' => '$1. syyskuuta',
+'october-date' => '$1. lokakuuta',
+'november-date' => '$1. marraskuuta',
+'december-date' => '$1. joulukuuta',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Luokka|Luokat}}',
@@ -504,6 +517,7 @@ $messages = array(
 'create-this-page' => 'Luo tämä sivu',
 'delete' => 'Poista',
 'deletethispage' => 'Poista tämä sivu',
+'undeletethispage' => 'Palauta tämä sivu',
 'undelete_short' => 'Palauta {{PLURAL:$1|yksi muokkaus|$1 muokkausta}}',
 'viewdeleted_short' => 'Näytä {{PLURAL:$1|poistettu muokkaus|$1 poistettua muokkausta}}',
 'protect' => 'Suojaa',
@@ -547,7 +561,7 @@ $1',
 'pool-queuefull' => 'Lukkojono on täysi.',
 'pool-errorunknown' => 'Tuntematon virhe.',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Tietoja {{GRAMMAR:elative|{{SITENAME}}}}',
 'aboutpage' => 'Project:Tietoja',
 'copyright' => 'Sisältö on käytettävissä lisenssillä $1, ellei toisin ole mainittu.',
@@ -557,7 +571,6 @@ $1',
 'disclaimers' => 'Vastuuvapaus',
 'disclaimerpage' => 'Project:Vastuuvapaus',
 'edithelp' => 'Muokkausohjeet',
-'edithelppage' => 'Help:Kuinka sivuja muokataan',
 'helppage' => 'Help:Sisällys',
 'mainpage' => 'Etusivu',
 'mainpage-description' => 'Etusivu',
@@ -635,13 +648,12 @@ Luettelo toimintosivuista löytyy sivulta [[Special:SpecialPages|{{int:specialpa
 # General errors
 'error' => 'Virhe',
 'databaseerror' => 'Tietokantavirhe',
-'dberrortext' => 'Tietokantakyselyssä oli syntaksivirhe.
-Se saattaa johtua ohjelmointivirheestä.
-Viimeinen tietokantakysely:
-<blockquote><code>$1</code></blockquote>
-Se tehtiin funktiosta <code>$2</code>.
-Tietokanta palautti virheen <samp>$3: $4</samp>.',
-'dberrortextcl' => 'Tietokantakyselyssä oli syntaksivirhe. Viimeinen tietokantakysely, jota yritettiin, oli: ”$1”. Se tehtiin funktiosta ”$2”. Tietokanta palautti virheen ”$3: $4”.',
+'databaseerror-text' => 'Tietokantakyselyssä on tapahtunut virhe.
+Ohjelmistossa saattaa olla vikaa (bugi).',
+'databaseerror-textcl' => 'Tietokantakyselyssä on tapahtunut virhe.',
+'databaseerror-query' => 'Kysely: $1',
+'databaseerror-function' => 'Toiminto (funktio): $1',
+'databaseerror-error' => 'Virhe: $1',
 'laggedslavemode' => "'''Varoitus:''' Sivu ei välttämättä sisällä viimeisimpiä muutoksia.",
 'readonly' => 'Tietokanta on lukittu',
 'enterlockreason' => 'Anna lukituksen syy sekä sen arvioitu poistamisaika',
@@ -674,6 +686,7 @@ Ilmoita tästä [[Special:ListUsers/sysop|ylläpitäjälle]] ja kerro viestissä
 Joku muu on saattanut poistaa sen.',
 'cannotdelete-title' => 'Sivua $1 ei voi poistaa',
 'delete-hook-aborted' => 'Laajennuskoodi esti poiston antamatta syytä.',
+'no-null-revision' => 'Nollamuokkausta sivulla "$1" ei voi tehdä',
 'badtitle' => 'Virheellinen otsikko',
 'badtitletext' => 'Pyytämäsi sivunimi oli virheellinen, tyhjä tai väärin linkitetty kieltenvälinen tai wikienvälinen nimi.
 Siinä saattaa olla yksi tai useampi sellainen merkki, jota ei voi käyttää sivujen nimissä.',
@@ -693,12 +706,15 @@ Viestien kääntäminen tulisi tehdä [//translatewiki.net/ translatewiki.netiss
 'editinginterface' => "'''Varoitus:''' Muokkaat sivua, joka sisältää ohjelmiston käyttöliittymätekstiä.
 Muutokset tähän sivuun vaikuttavat muiden käyttäjien käyttöliittymän ulkoasuun tässä wikissä.
 Viestien kääntäminen tulisi tehdä [//translatewiki.net/ translatewiki.netissä] – MediaWikin kotoistusprojektissa.",
-'sqlhidden' => '(SQL-kysely piilotettu)',
 'cascadeprotected' => 'Tämä sivu on suojattu muokkauksilta, koska se on sisällytetty {{PLURAL:$1|seuraavaan tarttuvasti suojattuun sivuun|seuraaviin tarttuvasti suojattuihin sivuihin}}:
 $2',
 'namespaceprotected' => "Et voi muokata sivuja nimiavaruudessa '''$1'''.",
 'customcssprotected' => 'Sinulla ei ole oikeutta muuttaa tätä CSS-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.',
 'customjsprotected' => 'Sinulla ei ole oikeutta muuttaa tätä JavaScript-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.',
+'mycustomcssprotected' => 'Sinulla ei ole oikeutta muokata tätä CSS-sivua.',
+'mycustomjsprotected' => 'Sinulla ei ole oikeutta muokata tätä JavaScript-sivua.',
+'myprivateinfoprotected' => 'Sinulla ei ole oikeutta muokata omia tietojasi.',
+'mypreferencesprotected' => 'Sinulla ei ole oikeutta muokata omia asetuksiasi.',
 'ns-specialprotected' => 'Toimintosivuja ei voi muokata.',
 'titleprotected' => "Käyttäjä [[User:$1|$1]] on suojannut tämän sivunimen, ja sivua ei voi luoda.
 Syynä on: ''$2''.",
@@ -723,10 +739,19 @@ Huomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut si
 'welcomecreation-msg' => 'Käyttäjätunnuksesi on luotu.
 Älä unohda virittää {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|asetuksiasi]].',
 'yourname' => 'Käyttäjätunnus:',
+'userlogin-yourname' => 'Käyttäjätunnus',
+'userlogin-yourname-ph' => 'Kirjoita käyttäjätunnus',
+'createacct-another-username-ph' => 'Lisää käyttäjätunnus',
 'yourpassword' => 'Salasana:',
+'userlogin-yourpassword' => 'Salasana',
+'userlogin-yourpassword-ph' => 'Kirjoita salasana',
+'createacct-yourpassword-ph' => 'Kirjoita salasana',
 'yourpasswordagain' => 'Salasana uudelleen:',
+'createacct-yourpasswordagain' => 'Vahvista salasana',
+'createacct-yourpasswordagain-ph' => 'Kirjoita salasana uudelleen',
 'remembermypassword' => 'Muista minut (enintään $1 {{PLURAL:$1|päivä|päivää}})',
-'securelogin-stick-https' => 'Jatka salatun yhteyden käyttämistä sisäänkirjautumisen jälkeen',
+'userlogin-remembermypassword' => 'Pidä minut kirjautuneena',
+'userlogin-signwithsecure' => 'Käytä salattua yhteyttä',
 'yourdomainname' => 'Verkkonimi:',
 'password-change-forbidden' => 'Et voi muuttaa salasanoja tässä wikissä.',
 'externaldberror' => 'Tapahtui virhe ulkoisen autentikointitietokannan käytössä tai sinulla ei ole lupaa päivittää tunnustasi.',
@@ -738,17 +763,43 @@ Huomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut si
 'logout' => 'Kirjaudu ulos',
 'userlogout' => 'Kirjaudu ulos',
 'notloggedin' => 'Et ole kirjautunut',
+'userlogin-noaccount' => 'Eikö sinulla vielä ole käyttäjätunnusta?',
+'userlogin-joinproject' => 'Liity {{GRAMMAR:illative|{{SITENAME}}}}',
 'nologin' => 'Jos sinulla ei ole vielä käyttäjätunnusta, $1.',
 'nologinlink' => 'voit luoda sellaisen',
 'createaccount' => 'Luo uusi käyttäjätunnus',
 'gotaccount' => "Jos sinulla on jo tunnus, voit '''$1'''.",
 'gotaccountlink' => 'kirjautua sisään',
 'userlogin-resetlink' => 'Unohditko salasanasi?',
+'userlogin-resetpassword-link' => 'Vaihda salasanaasi',
+'helplogin-url' => 'Help:Sisäänkirjautuminen',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Auta sisäänkirjautumisessa]]',
+'userlogin-loggedin' => 'Olet jo kirjautunut sisään tunnuksella {{GENDER:$1|$1}}.
+Käytä alla olevaa lomaketta kirjautuaksesi sisään toisena käyttäjänä.',
+'userlogin-createanother' => 'Luo toinen käyttäjätunnus',
+'createacct-join' => 'Kirjoita tietosi alle.',
+'createacct-another-join' => 'Lisää uuden käyttäjätunnuksen tiedot alle.',
+'createacct-emailrequired' => 'Sähköpostiosoite',
+'createacct-emailoptional' => 'Sähköpostiosoite (vapaaehtoinen)',
+'createacct-email-ph' => 'Anna sähköpostiosoitteesi',
+'createacct-another-email-ph' => 'Lisää sähköpostiosoite',
 'createaccountmail' => 'Käytä satunnaista väliaikaissalasanaa ja lähetä se alla olevaan sähköpostiosoitteeseen',
+'createacct-realname' => 'Oikea nimi (vapaaehtoinen)',
 'createaccountreason' => 'Syy:',
+'createacct-reason' => 'Syy',
+'createacct-reason-ph' => 'Miksi olet luomassa toista käyttäjätunnusta',
+'createacct-captcha' => 'Turvatarkastus',
+'createacct-imgcaptcha-ph' => 'Kirjoita teksti, jonka näet edellä',
+'createacct-submit' => 'Luo tunnus',
+'createacct-another-submit' => 'Luo toinen käyttäjätunnus',
+'createacct-benefit-heading' => '{{SITENAME}} on sinun kaltaistesi ihmisten tekemä.',
+'createacct-benefit-body1' => '{{PLURAL:$1|muokkaus|muokkausta}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|sivu|sivua}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|viimeikainen muokkaaja|viimeaikaista muokkaajaa}}',
 'badretype' => 'Syöttämäsi salasanat ovat erilaiset.',
 'userexists' => 'Pyytämäsi käyttäjänimi on jo käytössä. Valitse toinen käyttäjänimi.',
 'loginerror' => 'Sisäänkirjautumisvirhe',
+'createacct-error' => 'Virhe tunnuksen luomisessa',
 'createaccounterror' => 'Tunnuksen luonti ei onnistunut: $1',
 'nocookiesnew' => 'Käyttäjätunnus on luotu, mutta et ole kirjautunut sisään. 
 {{SITENAME}} käyttää evästeitä sisäänkirjautumisen yhteydessä. 
@@ -799,10 +850,12 @@ Tunnus on "$2" ja sen salasana on "$3". Sinun on syytä kirjautua sisään ja va
 Sinun ei tarvitse välittää tästä viestistä, jos tämä tunnus on luotu virheellisesti.',
 'usernamehasherror' => 'Käyttäjätunnus ei voi sisältää ristikkomerkkejä (#).',
 'login-throttled' => 'Olet tehnyt liian monta kirjautumisyritystä.
-Odota ennen kuin yrität uudelleen.',
+Odota $1 ennen kuin yrität uudelleen.',
 'login-abort-generic' => 'Kirjautuminen epäonnistui – keskeytetty',
 'loginlanguagelabel' => 'Kieli: $1',
 'suspicious-userlogout' => 'Pyyntösi kirjautua ulos evättiin, koska se näytti rikkinäisen selaimen tai välimuistipalvelimen lähettämältä.',
+'createacct-another-realname-tip' => 'Vapaaehtoinen.
+Nimesi näytetään käyttäjätunnuksesi sijasta sivun tekijäluettelossa.',
 
 # Email sending
 'php-mail-error-unknown' => 'Tuntematon virhe PHP:n mail()-funktiossa',
@@ -818,7 +871,7 @@ Odota ennen kuin yrität uudelleen.',
 'newpassword' => 'Uusi salasana:',
 'retypenew' => 'Uusi salasana uudelleen:',
 'resetpass_submit' => 'Aseta salasana ja kirjaudu sisään',
-'resetpass_success' => 'Salasanan vaihto onnistui.',
+'changepassword-success' => 'Salasanan vaihto onnistui.',
 'resetpass_forbidden' => 'Salasanoja ei voi vaihtaa.',
 'resetpass-no-info' => 'Et voi nähdä tätä sivua kirjautumatta sisään.',
 'resetpass-submit-loggedin' => 'Muuta salasana',
@@ -830,10 +883,11 @@ Olet saattanut jo onnistuneesti vaihtaa salasanasi tai pyytää uutta väliaikai
 
 # Special:PasswordReset
 'passwordreset' => 'Salasanan vaihto',
-'passwordreset-text' => 'Täytä tämä lomake vaihtaaksesi salasanasi.',
+'passwordreset-text-one' => 'Täytä tämä lomake vaihtaaksesi salasanasi.',
+'passwordreset-text-many' => '{{PLURAL:$1|Täytä yksi kentistä alustaaksesi salasanasi.}}',
 'passwordreset-legend' => 'Salasanan vaihto',
 'passwordreset-disabled' => 'Salasanojen vaihtaminen ei ole mahdollista tässä wikissä.',
-'passwordreset-pretext' => '{{PLURAL:$1||Kirjoita jokin jäljempänä pyydetty tieto}}',
+'passwordreset-emaildisabled' => 'Sähköpostitoiminnot on poistettu käytöstä tässä wikissä.',
 'passwordreset-username' => 'Käyttäjätunnus:',
 'passwordreset-domain' => 'Verkkotunnus:',
 'passwordreset-capture' => 'Näytä lähetettävä sähköpostiviesti?',
@@ -863,7 +917,7 @@ voit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.'
 Väliaikainen salasana: $2',
 'passwordreset-emailsent' => 'Salasanan palautuksesta kertova viesti on lähetetty sähköpostitse.',
 'passwordreset-emailsent-capture' => 'Salasanan palautuksesta kertova sähköpostiviesti on lähetetty, ja se näkyy myös alla.',
-'passwordreset-emailerror-capture' => 'Alla näytettävä sähköpostiviesti luotiin, mutta sen lähettäminen käyttäjälle epäonnistui: $1',
+'passwordreset-emailerror-capture' => 'Allaoleva sähköpostiviesti luotiin, mutta sen lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Muuta sähköpostiosoitetta',
@@ -877,6 +931,19 @@ Väliaikainen salasana: $2',
 'changeemail-submit' => 'Muuta sähköpostiosoite',
 'changeemail-cancel' => 'Peruuta',
 
+# Special:ResetTokens
+'resettokens' => 'Uudista avaimet',
+'resettokens-text' => 'Tällä sivulla voit uudistaa avaimesi, jotka mahdollistavat pääsyn käyttäjätunnukseesi liittyviin tiettyihin yksityisiin tietoihin.
+
+Sinun pitäisi tehdä tämä, jos olet vahingossa jakanut avaimet jonkun kanssa tai jos käyttäjätunnuksesi on vaarannettu.',
+'resettokens-no-tokens' => 'Avaimia ei ole uudistettavaksi.',
+'resettokens-legend' => 'Uudista avaimet',
+'resettokens-tokens' => 'Avaimet:',
+'resettokens-token-label' => '$1 (nykyinen arvo: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|Tarkkailulistan]] verkkosyötteen (Atom tai RSS) avain',
+'resettokens-done' => 'Avaimet on uudistettu.',
+'resettokens-resetbutton' => 'Uudista valitut avaimet',
+
 # Edit page toolbar
 'bold_sample' => 'Lihavoitu teksti',
 'bold_tip' => 'Lihavointi',
@@ -1057,12 +1124,15 @@ Alla on tämän sivun poisto- ja siirtohistoria:",
 Se on ilmeisesti poistettu.',
 'edit-conflict' => 'Päällekkäinen muokkaus.',
 'edit-no-change' => 'Muokkauksesi sivuutettiin, koska tekstiin ei tehty mitään muutoksia.',
+'postedit-confirmation' => 'Muokkauksesi on tallennettu.',
 'edit-already-exists' => 'Uuden sivun luominen ei onnistunut.
 Se on jo olemassa.',
 'defaultmessagetext' => 'Viestin oletusteksti',
 'content-failed-to-parse' => 'Sisältö tyypiltään $2 ei jäsenny tyypiksi $1: $3',
 'invalid-content-data' => 'Virheellinen sisältö',
 'content-not-allowed-here' => 'Sivun [[$2]] sisältö ei voi olla tyyppiä $1.',
+'editwarning-warning' => 'Tältä sivulta poistuminen saattaa aiheuttaa kaikkien tekemiesi muutosten katoamisen.
+Jos olet kirjautuneena sisään, voit poistaa tämän varoituksen käytöstä asetuksissa osiossa "Muokkaus".',
 
 # Content models
 'content-model-wikitext' => 'wikiteksti',
@@ -1097,6 +1167,7 @@ Varmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputulok
 'undo-failure' => 'Muokkausta ei voi kumota välissä olevien ristiriitaisten muutosten vuoksi.',
 'undo-norev' => 'Muokkausta ei voida kumota, koska sitä ei ole olemassa tai se on poistettu.',
 'undo-summary' => 'Kumottu muokkaus $1, jonka teki [[Special:Contributions/$2|$2]] ([[User talk:$2|keskustelu]])',
+'undo-summary-username-hidden' => 'Kumottu muokkaus $1, jonka on tehnyt piilotettu käyttäjä',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Tunnusta ei voida luoda',
@@ -1271,6 +1342,7 @@ Uuden ja vanhan sivun muutoksien pitää muodostaa jatkumo – ne eivät saa men
 'compareselectedversions' => 'Vertaile valittuja versioita',
 'showhideselectedversions' => 'Näytä tai piilota valitut versiot',
 'editundo' => 'kumoa',
+'diff-empty' => '(ei eroavaisuuksia)',
 'diff-multi' => '(Näytettyjen versioiden välissä on {{PLURAL:$1|yksi muokkaus|$1 versiota, jotka ovat {{PLURAL:$2|yhden käyttäjän tekemiä|$2 eri käyttäjän tekemiä}}}}.)',
 'diff-multi-manyusers' => '(Versioiden välissä on {{PLURAL:$1|yksi muu muokkaus|$1 muuta muokkausta, jotka on tehnyt {{PLURAL:$2|yksi käyttäjä|yli $2 eri käyttäjää}}}}.)',
 'difference-missing-revision' => '{{PLURAL:$2|Yhtä versiota|$2 versiota}} tästä vertailusta ($1) {{PLURAL:$2|ei}} löytynyt.
@@ -1300,7 +1372,6 @@ $1 {{int:pipe-separator}} $2',
 'searchmenu-legend' => 'Hakuasetukset',
 'searchmenu-exists' => "'''Tässä wikissä on sivu nimellä [[:$1]].'''",
 'searchmenu-new' => "'''Luo sivu ''[[:$1]]'' tähän wikiin.'''",
-'searchhelp-url' => 'Help:Sisällys',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Selaa sivuja tällä etuliitteellä]]',
 'searchprofile-articles' => 'Sisältösivut',
 'searchprofile-project' => 'Ohje- ja projektisivut',
@@ -1342,15 +1413,7 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'powersearch-togglenone' => 'Poista valinnat',
 'search-external' => 'Ulkoinen haku',
 'searchdisabled' => 'Tekstihaku on poistettu toistaiseksi käytöstä suuren kuorman vuoksi. Voit käyttää alla olevaa Googlen hakukenttää sivujen etsimiseen, kunnes haku tulee taas käyttöön. <small>Huomaa, että ulkopuoliset kopiot {{GRAMMAR:genitive|{{SITENAME}}}} sisällöstä eivät välttämättä ole ajan tasalla.</small>',
-
-# Quickbar
-'qbsettings' => 'Pikavalikko',
-'qbsettings-none' => 'Ei mitään',
-'qbsettings-fixedleft' => 'Tekstin mukana, vasen',
-'qbsettings-fixedright' => 'Tekstin mukana, oikea',
-'qbsettings-floatingleft' => 'Pysyen vasemmalla',
-'qbsettings-floatingright' => 'Pysyen oikealla',
-'qbsettings-directionality' => 'Kiinteä, riippuen käyttämäsi kielen kirjoitusjärjestelmän suunnasta',
+'search-error' => 'Virhe ilmaantui haettaessa: $1',
 
 # Preferences page
 'preferences' => 'Asetukset',
@@ -1384,7 +1447,6 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'resetprefs' => 'Tyhjennä tallentamattomat muutokset',
 'restoreprefs' => 'Palauta kaikki oletusasetuksiin (kaikissa osioissa)',
 'prefs-editing' => 'Muokkaus',
-'prefs-edit-boxsize' => 'Muokkauskentän koko.',
 'rows' => 'Rivejä',
 'columns' => 'Sarakkeita',
 'searchresultshead' => 'Haku',
@@ -1395,9 +1457,9 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'recentchangesdays-max' => 'Enintään $1 {{PLURAL:$1|päivä|päivää}}',
 'recentchangescount' => 'Näytettävien muutoksien määrä oletuksena',
 'prefs-help-recentchangescount' => 'Tämä sisältää tuoreet muutokset, muutoshistoriat ja lokit.',
-'prefs-help-watchlist-token' => 'Tämän kentän täyttäminen salaisella avaimella tuottaa RSS-syötteen tarkkailulistastasi.
-Kaikki, jotka tietävät tähän kenttään kirjoitetun avaimen pystyvät lukemaan tarkkailulistaa, joten valitse turvallinen arvo.
-Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
+'prefs-help-watchlist-token2' => 'Tämä on salainen avain tarkkailulistasi verkkosyötteeseen.
+Kuka tahansa, joka tietää sen voi lukea tarkkailulistaasi, joten älä paljasta sitä.
+[[Special:ResetTokens|Napsauta tästä, jos sinun pitää uudistaa se]].',
 'savedprefs' => 'Asetuksesi on tallennettu.',
 'timezonelegend' => 'Aikavyöhyke',
 'localtime' => 'Paikallinen aika',
@@ -1427,7 +1489,6 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 'prefs-common-css-js' => 'Yhteiset CSS- ja JavaScript-sivut kaikille ulkoasuille',
 'prefs-reset-intro' => 'Voit käyttää tätä sivua palauttaaksesi kaikki asetuksesi sivuston oletusasetuksiin. Tätä ei voi kumota.',
 'prefs-emailconfirm-label' => 'Sähköpostin varmistus',
-'prefs-textboxsize' => 'Muokkauskentän koko',
 'youremail' => 'Sähköpostiosoite',
 'username' => '{{GENDER:$1|Käyttäjätunnus}}',
 'uid' => '{{GENDER:$1|Tunniste}}',
@@ -1459,6 +1520,8 @@ Tämä tieto on julkinen.',
 'prefs-dateformat' => 'Päiväyksen muoto',
 'prefs-timeoffset' => 'Aikavyöhyke',
 'prefs-advancedediting' => 'Perusasetukset',
+'prefs-editor' => 'Muokkain',
+'prefs-preview' => 'Esikatselu',
 'prefs-advancedrc' => 'Lisäasetukset',
 'prefs-advancedrendering' => 'Lisäasetukset',
 'prefs-advancedsearchoptions' => 'Lisäasetukset',
@@ -1466,7 +1529,9 @@ Tämä tieto on julkinen.',
 'prefs-displayrc' => 'Perusasetukset',
 'prefs-displaysearchoptions' => 'Näyttöasetukset',
 'prefs-displaywatchlist' => 'Näyttöasetukset',
+'prefs-tokenwatchlist' => 'Avain',
 'prefs-diffs' => 'Eroavaisuudet',
+'prefs-help-prefershttps' => 'Tämä asetus tulee voimaan seuraavan sisäänkirjautumisesi yhteydessä.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Sähköpostiosoite vaikuttaa kelvolliselta',
@@ -1493,6 +1558,8 @@ Tämä tieto on julkinen.',
 'userrights-notallowed' => 'Sinulla ei ole oikeutta lisätä tai poistaa käyttäjien oikeuksia.',
 'userrights-changeable-col' => 'Ryhmät, joita voit muuttaa',
 'userrights-unchangeable-col' => 'Ryhmät, joita et voi muuttaa',
+'userrights-conflict' => 'Päällekkäinen käyttöoikeuksien muutos! Tarkista tekemäsi muutokset ja vahvista ne.',
+'userrights-removed-self' => 'Poistit onnistuneesti omat oikeutesi. Tämän jälkeen et enää pääse tälle sivulle.',
 
 # Groups
 'group' => 'Ryhmä',
@@ -1558,11 +1625,19 @@ Tämä tieto on julkinen.',
 'right-proxyunbannable' => 'Ohittaa automaattiset välityspalvelinestot',
 'right-unblockself' => 'Poistaa esto itseltään',
 'right-protect' => 'Muuttaa suojaustasoja ja muokata tarttuvasti suojattuja sivuja',
-'right-editprotected' => 'Muokata suojattuja sivuja (pois lukien laajennettu sisällytyssuojaus)',
+'right-editprotected' => 'Muokata sivuja, jotka on suojattu tasolle "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Muokata sivuja, jotka on suojattu tasolle "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Muokata käyttöliittymätekstejä',
 'right-editusercssjs' => 'Muokata toisten käyttäjien CSS- ja JavaScript-tiedostoja',
 'right-editusercss' => 'Muokata toisten käyttäjien CSS-tiedostoja',
 'right-edituserjs' => 'Muokata toisten käyttäjien JavaScript-tiedostoja',
+'right-editmyusercss' => 'Muokata omia CSS-tiedostojaan',
+'right-editmyuserjs' => 'Muokata omia JavaScript-tiedostojaan',
+'right-viewmywatchlist' => 'Tarkastella tarkkailulistaasi',
+'right-editmywatchlist' => 'Muokata tarkkailulistaasi. Huomaa, että jotkin toiminnot lisäävät yhä sivuja listallesi riippumatta tästä oikeudesta.',
+'right-viewmyprivateinfo' => 'Nähdä omat yksityiset tietosi (esim. sähköpostiosoite, oikea nimi)',
+'right-editmyprivateinfo' => 'Muokata omia yksityisiä tietojasi (esim. sähköpostiosoite, oikea nimi)',
+'right-editmyoptions' => 'Muokata omia asetuksiasi',
 'right-rollback' => 'Palauttaa nopeasti käyttäjän viimeisimmät muokkaukset sivuun',
 'right-markbotedits' => 'Kumota muokkauksia bottimerkinnällä',
 'right-noratelimit' => 'Ohittaa nopeusrajoitukset',
@@ -1624,12 +1699,19 @@ Tämä tieto on julkinen.',
 'action-userrights-interwiki' => 'muokata muiden wikien käyttäjien käyttöoikeuksia',
 'action-siteadmin' => 'lukita tai avata tietokantaa',
 'action-sendemail' => 'lähettää sähköpostia',
+'action-editmywatchlist' => 'muokata tarkkailulistaasi',
+'action-viewmywatchlist' => 'tarkastella tarkkailulistaasi',
+'action-viewmyprivateinfo' => 'katsoa omia yksityisiä tietojasi',
+'action-editmyprivateinfo' => 'muokata omia yksityisiä tietojasi',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|muutos|muutosta}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|viimeisen käynnin jälkeen}}',
+'enhancedrc-history' => 'historia',
 'recentchanges' => 'Tuoreet muutokset',
 'recentchanges-legend' => 'Tuoreiden muutosten asetukset',
 'recentchanges-summary' => 'Tällä sivulla voi seurata tuoreita {{GRAMMAR:illative|{{SITENAME}}}} tehtyjä muutoksia.',
+'recentchanges-noresult' => 'Ei muutoksia, jotka täyttävät nämä kriteerit valitun ajanjakson aikana.',
 'recentchanges-feed-description' => 'Tällä sivulla voi seurata tuoreita {{GRAMMAR:illative|{{SITENAME}}}} tehtyjä muutoksia.',
 'recentchanges-label-newpage' => 'Tämä muutos loi uuden sivun',
 'recentchanges-label-minor' => 'Tämä on pieni muutos',
@@ -1666,7 +1748,6 @@ Tämä tieto on julkinen.',
 'recentchangeslinked-feed' => 'Linkitettyjen sivujen muutokset',
 'recentchangeslinked-toolbox' => 'Linkitettyjen sivujen muutokset',
 'recentchangeslinked-title' => 'Sivulta $1 linkitettyjen sivujen muutokset',
-'recentchangeslinked-noresult' => 'Ei muutoksia linkitettyihin sivuihin annetulla aikavälillä.',
 'recentchangeslinked-summary' => "Tämä toimintosivu näyttää muutokset sivuihin, joihin on viitattu tältä sivulta. [[Special:Watchlist|Tarkkailulistallasi]] olevat sivut on '''lihavoitu'''.",
 'recentchangeslinked-page' => 'Sivu',
 'recentchangeslinked-to' => 'Näytä muutokset sivuihin, joilla on linkki annettuun sivuun',
@@ -1677,7 +1758,7 @@ Tämä tieto on julkinen.',
 'reuploaddesc' => 'Peruuta tallennus ja palaa tallennuslomakkeelle.',
 'upload-tryagain' => 'Lähetä muutettu tiedostokuvaus',
 'uploadnologin' => 'Et ole kirjautunut sisään',
-'uploadnologintext' => 'Sinun pitää olla [[Special:UserLogin|kirjautuneena sisään]], jotta voisit tallentaa tiedostoja.',
+'uploadnologintext' => 'Sinun pitää $1 tallentaaksesi tiedostoja.',
 'upload_directory_missing' => 'Tallennushakemisto $1 puuttuu, eikä palvelin pysty luomaan sitä.',
 'upload_directory_read_only' => 'Palvelimella ei ole kirjoitusoikeuksia tallennushakemistoon $1.',
 'uploaderror' => 'Tallennusvirhe',
@@ -1891,7 +1972,6 @@ Parhaan turvallisuuden vuoksi img_auth.php on poissa käytöstä.',
 'http-read-error' => 'HTTP-lukuvirhe.',
 'http-timed-out' => 'HTTP-pyyntö aikakatkaistiin.',
 'http-curl-error' => 'Virhe noudettaessa verkko-osoitetta: $1',
-'http-host-unreachable' => 'Ei voitu tavoittaa verkko-osoitetta',
 'http-bad-status' => 'HTTP-pyynnön aikana oli ongelma: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1919,6 +1999,10 @@ Parhaan turvallisuuden vuoksi img_auth.php on poissa käytöstä.',
 'listfiles_size' => 'Koko',
 'listfiles_description' => 'Kuvaus',
 'listfiles_count' => 'Versioita',
+'listfiles-show-all' => 'Näytä myös kuvien vanhemmat versiot',
+'listfiles-latestversion' => 'Uusin versio',
+'listfiles-latestversion-yes' => 'Kyllä',
+'listfiles-latestversion-no' => 'Ei',
 
 # File description page
 'file-anchor-link' => 'Tiedosto',
@@ -2014,6 +2098,13 @@ Syöte: sisältötyyppi/alatyyppi, esimerkiksi <code>image/jpeg</code>.',
 'randompage' => 'Satunnainen sivu',
 'randompage-nopages' => '{{PLURAL:$2|Nimiavaruudessa|Nimiavaruuksissa}} $1 ei ole sivuja.',
 
+# Random page in category
+'randomincategory' => 'Satunnainen sivu luokasta',
+'randomincategory-invalidcategory' => '$1 ei ole kelvollinen luokan nimi.',
+'randomincategory-nopages' => 'Luokassa [[:Category:$1|$1]] ei ole sivuja.',
+'randomincategory-selectcategory' => 'Hae satunnainen sivu luokasta: $1 $2',
+'randomincategory-selectcategory-submit' => 'Hae',
+
 # Random redirect
 'randomredirect' => 'Satunnainen ohjaus',
 'randomredirect-nopages' => 'Nimiavaruudessa ”$1” ei ole ohjaussivuja.',
@@ -2039,17 +2130,13 @@ Syöte: sisältötyyppi/alatyyppi, esimerkiksi <code>image/jpeg</code>.',
 'statistics-users-active-desc' => 'Käyttäjät, jotka ovat suorittaneet jonkin toiminnon {{PLURAL:$1|edellisen päivän|edellisten $1 päivän}} aikana.',
 'statistics-mostpopular' => 'Katsotuimmat sivut',
 
-'disambiguations' => 'Linkit täsmennyssivuihin',
-'disambiguationspage' => 'Template:Täsmennyssivu',
-'disambiguations-text' => "Seuraavilla sivuilla on linkkejä ''täsmennyssivuihin''.
-Täsmennyssivun sijaan ne voisivat linkittää suoraan asianomaiseen aiheeseen.<br />
-Sivua kohdellaan täsmennyssivuna, jos se käyttää mallinetta, johon on linkki sivulta [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Sivut sivun ominaisuuden mukaan',
 'pageswithprop-legend' => 'Sivut sivun ominaisuuden mukaan',
 'pageswithprop-text' => 'Tällä sivulla on lueteltu sivut, jotka käyttävät erityistä sivun ominaisuutta.',
 'pageswithprop-prop' => 'Ominaisuuden nimi',
 'pageswithprop-submit' => 'Siirry',
+'pageswithprop-prophidden-long' => 'Pitkä tekstimuotoinen ominaisuuden arvo piilotettu ($1)',
+'pageswithprop-prophidden-binary' => 'ominaisuuden binääriarvo on piilotettu ($1)',
 
 'doubleredirects' => 'Kaksinkertaiset ohjaukset',
 'doubleredirectstext' => 'Tässä listassa on ohjaussivut, jotka ohjaavat toiseen ohjaussivuun.
@@ -2107,6 +2194,7 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
 'mostrevisions' => 'Muokatuimmat sivut',
 'prefixindex' => 'Kaikki sivut katkaisuhaulla',
 'prefixindex-namespace' => 'Kaikki sivut etuliitteellä (nimiavaruus $1)',
+'prefixindex-strip' => 'Älä näytä etuliitteitä listauksessa',
 'shortpages' => 'Lyhyet sivut',
 'longpages' => 'Pitkät sivut',
 'deadendpages' => 'Sivut, joilla ei ole linkkejä',
@@ -2122,6 +2210,7 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
 'listusers' => 'Käyttäjälista',
 'listusers-editsonly' => 'Näytä vain käyttäjät, joilla on muokkauksia',
 'listusers-creationsort' => 'Lajittele tunnuksen luontipäivämäärän mukaan',
+'listusers-desc' => 'Lajittele alenevassa järjestyksessä',
 'usereditcount' => '$1 {{PLURAL:$1|muokkaus|muokkausta}}',
 'usercreated' => '{{GENDER:$3|Luotu}} $1 kello $2',
 'newpages' => 'Uudet sivut',
@@ -2298,10 +2387,9 @@ Tulevaisuudessa sivuun ja sen keskustelusivuun tehtävät muutokset listataan t
 'unwatchthispage' => 'Lopeta tarkkailu',
 'notanarticle' => 'Ei ole sivu',
 'notvisiblerev' => 'Versio on poistettu',
-'watchnochange' => 'Valittuna ajanjaksona yhtäkään tarkkailemistasi sivuista ei muokattu.',
 'watchlist-details' => 'Tarkkailulistalla on {{PLURAL:$1|$1 sivu|$1 sivua}} keskustelusivuja mukaan laskematta.',
-'wlheader-enotif' => '* Sähköposti-ilmoitukset ovat käytössä.',
-'wlheader-showupdated' => "* Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
+'wlheader-enotif' => 'Sähköposti-ilmoitus on käytössä.',
+'wlheader-showupdated' => "Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
 'watchmethod-recent' => 'tarkistetaan tuoreimpia muutoksia tarkkailluille sivuille',
 'watchmethod-list' => 'tarkistetaan tarkkailtujen sivujen tuoreimmat muutokset',
 'watchlistcontains' => 'Tarkkailulistallasi on {{PLURAL:$1|yksi sivu|$1 sivua}}.',
@@ -2540,7 +2628,7 @@ $1',
 'contributions' => '{{GENDER:$1|Käyttäjän}} muokkaukset',
 'contributions-title' => 'Käyttäjän $1 muokkaukset',
 'mycontris' => 'Omat muokkaukset',
-'contribsub2' => 'Käyttäjän $1 ($2) muokkaukset',
+'contribsub2' => 'Käyttäjän {{GENDER:$3|$1}} ($2) muokkaukset',
 'nocontribs' => 'Näihin ehtoihin sopivia muokkauksia ei löytynyt.',
 'uctop' => '(uusin)',
 'month' => 'Kuukausi',
@@ -2693,14 +2781,12 @@ Alla on ote häivytyslokista.',
 'ipb_blocked_as_range' => 'IP-osoite $1 on estetty välillisesti ja sen estoa ei voi poistaa. Se on estetty osana verkkoaluetta $2, jonka eston voi poistaa',
 'ip_range_invalid' => 'Virheellinen IP-alue.',
 'ip_range_toolarge' => 'Suuremmat osoitealue-estot kuin /$1 eivät ole sallittuja.',
-'blockme' => 'Estä minut',
 'proxyblocker' => 'Välityspalvelinesto',
-'proxyblocker-disabled' => 'Tämä toiminto ei ole käytössä.',
 'proxyblockreason' => 'IP-osoitteestasi on estetty muokkaukset, koska se on avoin välityspalvelin. Ota yhteyttä Internet-palveluntarjoajaasi tai tekniseen tukeen ja kerro heille tästä tietoturvaongelmasta.',
-'proxyblocksuccess' => 'Valmis.',
 'sorbsreason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}.',
 'sorbs_create_account_reason' => 'IP-osoitteesi on listattu avoimena välityspalvelimena DNSBL:n mustalla listalla sivustolla {{SITENAME}}. 
 Et voi luoda käyttäjätunnusta.',
+'xffblockreason' => 'Yhteydet IP-osoitteesta, joka löytyy sinun tai käyttämäsi välipalvelimen X-Forwarded-For-otsakkeesta, on estetty. Alkuperäinen estämisen syy oli: $1',
 'cant-block-while-blocked' => 'Et voi estää muita käyttäjiä kun olet itse estetty.',
 'cant-see-hidden-user' => 'Käyttäjä, jota yrität estää on jo estetty ja piilotettu. Koska sinulla ei ole hideuser-oikeutta, et voi nähdä tai muokata käyttäjän estoa.',
 'ipbblocked' => 'Et voi estää tai poistaa estoja muilta käyttäjiltä, koska itse olet estettynä',
@@ -2858,6 +2944,8 @@ Jos haluat muokata MediaWikin yleistä kotoistusta, käy [//www.mediawiki.org/wi
 'thumbnail-more' => 'Suurenna',
 'filemissing' => 'Tiedosto puuttuu',
 'thumbnail_error' => 'Pienoiskuvan luominen epäonnistui: $1',
+'thumbnail_error_remote' => 'Virheilmoitus kohteesta $1:
+$2',
 'djvu_page_error' => 'DjVu-tiedostossa ei ole pyydettyä sivua',
 'djvu_no_xml' => 'DjVu-tiedoston XML-vienti epäonnistui',
 'thumbnail-temp-create' => 'Väliaikaisen esikatselukuvan luonti epäonnistui',
@@ -3005,13 +3093,8 @@ Voit katsella sivun lähteenä olevaa wikitekstiä.',
 
 # Stylesheets
 'common.css' => '/* Tämä sivu sisältää koko sivustoa muuttavia tyylejä. */',
-'standard.css' => '/* Tämä sivu sisältää Perus-ulkoasua muuttavia tyylejä. */',
-'nostalgia.css' => '/* Tämä sivu sisältää Nostalgia-ulkoasua muuttavia tyylejä. */',
 'cologneblue.css' => '/* Tämä sivu sisältää Kölnin sininen -ulkoasua muuttavia tyylejä. */',
 'monobook.css' => '/* Tämä sivu sisältää Monobook-ulkoasua muuttavia tyylejä. */',
-'myskin.css' => '/* Tämä sivu sisältää Oma tyylisivu -ulkoasua muuttavia tyylejä. */',
-'chick.css' => '/* Tämä sivu sisältää Chick-ulkoasua muuttavia tyylejä. */',
-'simple.css' => '/* Tämä sivu sisältää Yksinkertainen-ulkoasua muuttavia tyylejä. */',
 'modern.css' => '/* Tämä sivu sisältää Moderni-ulkoasua muuttavia tyylejä. */',
 'vector.css' => '/* Tämä sivu sisältää Vector-ulkoasua muuttavia tyylejä. */',
 'print.css' => '/* Tämä sivu sisältää tulostettua sivua muuttavia tyylejä */',
@@ -3023,13 +3106,8 @@ Voit katsella sivun lähteenä olevaa wikitekstiä.',
 
 # Scripts
 'common.js' => '/* Tämän sivun JavaScript-koodi liitetään jokaiseen sivulataukseen */',
-'standard.js' => '/* Tämän sivun JavaScript-koodi liitetään Perus-tyyliin */',
-'nostalgia.js' => '/* Tämän sivun JavaScript-koodi liitetään Nostalgia-tyyliin */',
 'cologneblue.js' => '/* Tämän sivun JavaScript-koodi liitetään Kölnin sininen -tyyliin */',
 'monobook.js' => '/* Tämän sivun JavaScript-koodi liitetään Monobook-tyyliin */',
-'myskin.js' => '/* Tämän sivun JavaScript-koodi liitetään Oma tyylisivu -tyyliin */',
-'chick.js' => '/* Tämän sivun JavaScript-koodi liitetään Chick-tyyliin */',
-'simple.js' => '/* Tämän sivun JavaScript-koodi liitetään Yksinkertaistettuun tyyliin */',
 'modern.js' => '/* Tämän sivun JavaScript-koodi liitetään Moderni-tyyliin */',
 'vector.js' => '/* Tämän sivun JavaScript-koodi liitetään Vector-tyyliin */',
 'group-autoconfirmed.js' => '/* Tämän sivun JavaScript-koodi liitetään vain automaattisesti hyväksytyille käyttäjille */',
@@ -3108,13 +3186,8 @@ Voit katsella sivun lähteenä olevaa wikitekstiä.',
 'pageinfo-category-files' => 'Tiedostojen määrä',
 
 # Skin names
-'skinname-standard' => 'Perus',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Kölnin sininen',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Oma tyylisivu',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Yksinkertainen',
 'skinname-modern' => 'Moderni',
 
 # Patrolling
@@ -3192,11 +3265,25 @@ Suorittamalla sen järjestelmäsi voi muuttua epäluotettavaksi.",
 'minutes' => '{{PLURAL:$1|$1 minuutti|$1 minuuttia}}',
 'hours' => '{{PLURAL:$1|$1 tunti|$1 tuntia}}',
 'days' => '{{PLURAL:$1|$1 päivä|$1 päivää}}',
+'weeks' => '{{PLURAL:$1|viikko|$1 viikkoa}}',
 'months' => '{{PLURAL:$1|$1 kuukausi|$1 kuukautta}}',
 'years' => '{{PLURAL:$1|$1 vuosi|$1 vuotta}}',
 'ago' => '$1 sitten',
 'just-now' => 'juuri nyt',
 
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|tunti|$1 tuntia}} sitten',
+'minutes-ago' => '{{PLURAL:$1|minuutti|$1 minuuttia}} sitten',
+'seconds-ago' => '{{PLURAL:$1|sekunti|$1 sekuntia}} sitten',
+'monday-at' => 'Maanantaina klo $1',
+'tuesday-at' => 'Tiistaina klo $1',
+'wednesday-at' => 'Keskiviikkona klo $1',
+'thursday-at' => 'Torstaina klo $1',
+'friday-at' => 'Perjantaina klo $1',
+'saturday-at' => 'Lauantaina klo $1',
+'sunday-at' => 'Sunnuntaina klo $1',
+'yesterday-at' => 'Eilen klo $1',
+
 # Bad image list
 'bad_image_list' => 'Listan muoto on seuraava:
 
@@ -3224,7 +3311,7 @@ Kaikki muut linkit ovat poikkeuksia eli toisin sanoen sivuja, joissa tiedostoa s
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Leveys',
 'exif-imagelength' => 'Korkeus',
 'exif-bitspersample' => 'Bittiä komponentissa',
@@ -3402,7 +3489,7 @@ Kaikki muut linkit ovat poikkeuksia eli toisin sanoen sivuja, joissa tiedostoa s
 'exif-originalimageheight' => 'Kuvan korkeus ennen kuin sitä rajattiin',
 'exif-originalimagewidth' => 'Kuvan leveys ennen kuin sitä rajattiin',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Pakkaamaton',
 'exif-compression-2' => 'CCITT:n Group 3 -yksiulotteinen muokattu Huffman-ajopituuskoodaus',
 'exif-compression-3' => 'CCITT:n Group 3 -faksipakkaus',
@@ -3792,7 +3879,6 @@ Voit myös muokata listaa [[Special:EditWatchlist|tavalliseen tapaan]].',
 'version-other' => 'Muut',
 'version-mediahandlers' => 'Median käsittelijät',
 'version-hooks' => 'Kytköspisteet',
-'version-extension-functions' => 'Laajennusfunktiot',
 'version-parser-extensiontags' => 'Jäsentimen laajennustagit',
 'version-parser-function-hooks' => 'Jäsentimen laajennusfunktiot',
 'version-hook-name' => 'Kytköspisteen nimi',
@@ -3801,6 +3887,7 @@ Voit myös muokata listaa [[Special:EditWatchlist|tavalliseen tapaan]].',
 'version-license' => 'Lisenssi',
 'version-poweredby-credits' => "Tämä wiki käyttää '''[//www.mediawiki.org/ MediaWikiä]'''. Copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'muut',
+'version-poweredby-translators' => 'translatewiki.net-kääntäjät',
 'version-credits-summary' => 'Haluaisimme kiittää seuraavia henkilöitä heidän panoksestaan [[Special:Version|MediaWiki-ohjelmistoon]].',
 'version-license-info' => 'MediaWiki on vapaa ohjelmisto – voit levittää sitä ja/tai muokata sitä Free Software Foundationin GNU General Public Licensen ehdoilla, joko version 2 tai halutessasi minkä tahansa myöhemmän version mukaisesti.
 
@@ -3814,12 +3901,17 @@ Sinun olisi pitänyt saada [{{SERVER}}{{SCRIPTPATH}}/COPYING kopio GNU General P
 'version-entrypoints-header-entrypoint' => 'Aloituskohta',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Tiedoston osoite',
-'filepath-page' => 'Tiedosto',
-'filepath-submit' => 'Siirry',
-'filepath-summary' => 'Tämä toimintosivu palauttaa tiedoston URL-osoitteen.
-Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyssä ohjelmassa.',
+# Special:Redirect
+'redirect' => 'Ohjaus tiedostonimen, käyttäjätunnisteen tai versiotunnisteen mukaan',
+'redirect-legend' => 'Ohjaus tiedostoon tai sivulle',
+'redirect-summary' => 'Tämä toimintosivu ohjaa tiedostoon (tiedostonimen mukaan), sivulle (versiotunnisteen mukaan) tai käyttäjäsivulle (käyttäjätunnisteen numeron mukaan).',
+'redirect-submit' => 'Siirry',
+'redirect-lookup' => 'Hae:',
+'redirect-value' => 'Arvo:',
+'redirect-user' => 'Käyttäjätunniste',
+'redirect-revision' => 'Sivun versio',
+'redirect-file' => 'Tiedostonimi',
+'redirect-not-exists' => 'Arvoa ei löytynyt',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Kaksoiskappaleiden haku',
@@ -3868,12 +3960,16 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyss
 'tags' => 'Voimassa olevat muutosmerkinnät',
 'tag-filter' => '[[Special:Tags|Merkintäsuodatin]]',
 'tag-filter-submit' => 'Suodata',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Merkintä|Merkinnät}}]]: $2)',
 'tags-title' => 'Merkinnät',
 'tags-intro' => 'Tämä sivu luetteloi merkinnät, joilla ohjelmisto voi merkitä muokkauksia, ja niiden tarkoitukset.',
 'tags-tag' => 'Merkintänimi',
 'tags-display-header' => 'Näkyvyys muutosluetteloissa',
 'tags-description-header' => 'Täysi kuvaus tarkoituksesta',
+'tags-active-header' => 'Aktiivinen?',
 'tags-hitcount-header' => 'Merkityt muutokset',
+'tags-active-yes' => 'Kyllä',
+'tags-active-no' => 'Ei',
 'tags-edit' => 'muokkaa',
 'tags-hitcount' => '$1 {{PLURAL:$1|muutos|muutosta}}',
 
@@ -3894,6 +3990,7 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyss
 'dberr-problems' => 'Tällä sivustolla on teknisiä ongelmia.',
 'dberr-again' => 'Odota hetki ja lataa sivu uudelleen.',
 'dberr-info' => '(Tietokantapalvelimeen yhdistäminen epäonnistui: $1)',
+'dberr-info-hidden' => '(Tietokantapalvelimeen ei saada yhteyttä)',
 'dberr-usegoogle' => 'Voit koettaa hakea Googlesta, kunnes virhe korjataan.',
 'dberr-outofdate' => 'Googlen indeksi ei välttämättä ole ajan tasalla.',
 'dberr-cachederror' => 'Alla on välimuistissa oleva sivun versio, joka ei välttämättä ole ajan tasalla.',
@@ -3909,6 +4006,9 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyss
 'htmlform-submit' => 'Lähetä',
 'htmlform-reset' => 'Kumoa muutokset',
 'htmlform-selectorother-other' => 'Muu',
+'htmlform-no' => 'Ei',
+'htmlform-yes' => 'Kyllä',
+'htmlform-chosen-placeholder' => 'Valitse vaihtoehto',
 
 # SQLite database support
 'sqlite-has-fts' => '$1, jossa on tuki kokotekstihaulle',
@@ -4026,4 +4126,15 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 # Image rotation
 'rotate-comment' => 'Kuvaa käännettiin $1 {{PLURAL:$1|aste|astetta}} myötäpäivään',
 
+# Limit report
+'limitreport-title' => 'Jäsentimen profilointitiedot',
+'limitreport-cputime' => 'Suorittimen ajankäyttö',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
+'limitreport-walltime' => 'Todellinen ajankäyttö',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|tavu|tavua}}',
+'limitreport-templateargumentsize' => 'Mallineen argumenttien koko',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|tavu|tavua}}',
+'limitreport-expansiondepth' => 'Suurin laajennussyvyys',
+
 );
diff --git a/languages/messages/MessagesFit.php b/languages/messages/MessagesFit.php
index f370e318..7c9a7261 100644
--- a/languages/messages/MessagesFit.php
+++ b/languages/messages/MessagesFit.php
@@ -44,7 +44,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Näytä kuinka moni käyttäjä valvoo sivua',
 'tog-oldsig' => 'Nykynen allekirjotus',
 'tog-fancysig' => 'Mookkaamaton allekirjotus ilman auttomaattista linkkiä',
-'tog-externaleditor' => 'Käytä ekterniä tekstiedituuria stantartina. Vain kokenheile käyttäjile, vaatii taattorin asetuksitten muuttamista. Käytä eksterniä tekstiedituuria oletuksena. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. ([//www.mediawiki.org/wiki/Manual:External_editors Ohje])',
 
 # Dates
 'sunday' => 'pyhä',
diff --git a/languages/messages/MessagesFj.php b/languages/messages/MessagesFj.php
index 2f35c1a0..7ee949f3 100644
--- a/languages/messages/MessagesFj.php
+++ b/languages/messages/MessagesFj.php
@@ -159,7 +159,7 @@ $messages = array(
 # Special:AllPages
 'allpagessubmit' => 'Lako',
 
-# Email user
+# E-mail user
 'defemailsubject' => '{{SITENAME}} I vola livaliva',
 
 # Watchlist
diff --git a/languages/messages/MessagesFo.php b/languages/messages/MessagesFo.php
index 3aea92eb..556170aa 100644
--- a/languages/messages/MessagesFo.php
+++ b/languages/messages/MessagesFo.php
@@ -142,9 +142,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Vís tal av brúkarum sum fylgja við',
 'tog-oldsig' => 'Verandi undirskrift:',
 'tog-fancysig' => 'Viðgerð undirskriftina sum wikitekstur (uttan sjálvvirkandi leinkju)',
-'tog-externaleditor' => 'Nýt útvortis ritil sum fyrimynd (bert fyri fólk við serkunnleika, tað er tørvur á serligum innstillingum á tínari teldu. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Nýt útvortis diff sum fyrimynd (bert fyri serfrøðingar, tín telda tørvar serligar innstillingar. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => 'Ger leinkuna "far til" virknað',
 'tog-uselivepreview' => 'Nýt "live preview" (á royndarstøði)',
 'tog-forceeditsummary' => 'Gev mær boð, um eg ikki havi skrivað ein samandrátt um mína rætting',
 'tog-watchlisthideown' => 'Fjal mínar rættingar frá eftirliti',
@@ -157,6 +154,8 @@ $messages = array(
 'tog-diffonly' => 'Vís ikki innihaldið av síðuni undir broytingum',
 'tog-showhiddencats' => 'Vís goymdir bólkar',
 'tog-norollbackdiff' => 'Vís ikki munin eftir eina afturrulling',
+'tog-useeditwarning' => 'Ávara meg, tá ið eg fari frá einari rættingarsíðu, sum hevur broytingar ið ikki eru goymdar.',
+'tog-prefershttps' => 'Nýt altíð trygt samband, meðan tú ert innritað/ur',
 
 'underline-always' => 'Altíð',
 'underline-never' => 'Ongantíð',
@@ -220,6 +219,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'des',
+'january-date' => 'Januar $1',
+'february-date' => 'Februar $1',
+'march-date' => 'Mars $1',
+'april-date' => 'Apríl $1',
+'may-date' => 'Maj $1',
+'june-date' => 'Juni $1',
+'july-date' => 'Juli $1',
+'august-date' => 'August $1',
+'september-date' => 'September $1',
+'october-date' => 'Oktober $1',
+'november-date' => 'November $1',
+'december-date' => 'Desember $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Bólkur|Bólkar}}',
@@ -301,6 +312,7 @@ $messages = array(
 'create-this-page' => 'Stovna hesa síðuna',
 'delete' => 'Strika',
 'deletethispage' => 'Strika hesa síðuna',
+'undeletethispage' => 'Endurskapað hesa síðuna',
 'undelete_short' => 'Ógilda striking av {{PLURAL:$1|einari rætting|$1 broytingum}}',
 'viewdeleted_short' => 'Vís {{PLURAL:$1|eina strikaða broyting|$1 strikaðar broytingar}}',
 'protect' => 'Friða',
@@ -344,7 +356,7 @@ $1',
 'pool-queuefull' => 'Køin til "hylin" er full',
 'pool-errorunknown' => 'Ókend villa',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Um {{SITENAME}}',
 'aboutpage' => 'Project:Um',
 'copyright' => 'Innihaldið er tøkt undir $1, um ikki annað er viðmerkt.',
@@ -354,7 +366,6 @@ $1',
 'disclaimers' => 'Fyrivarni',
 'disclaimerpage' => 'Project:Generelt fyrivarni',
 'edithelp' => 'Rættingarhjálp',
-'edithelppage' => 'Help:Rættihjálp',
 'helppage' => 'Help:Innihald',
 'mainpage' => 'Forsíða',
 'mainpage-description' => 'Forsíða',
@@ -432,17 +443,7 @@ Hetta kann eisini benda á ein feil í software'ini sum {{SITENAME}} brúkar.",
 # General errors
 'error' => 'Villa',
 'databaseerror' => 'Villa í dátagrunni',
-'dberrortext' => '↓ Tað er hend ein syntaks villa í fyrispurninginum til dátugrunnin.
-Hetta kann merkja, at tað er feilur í ritbúnaðinum (software).
-Seinasta royndin at spyrja dátugrunnin var:
-<blockquote><code>$1</code></blockquote>
-frá innaru funktión "<code>$2</code>".
-Dátagrunnurin gav feilmelding "<samp>$3: $4</samp>".',
-'dberrortextcl' => '↓ Ein syntaks feilur hendi í fyrispurningi til dátugrunnin.
-Seinasta royndin at leita í dátugrunninum var:
- "$1"
-frá funktiónini "$2".
-Dátugrunnurin sendi aftur feilmeldingina: "$3: $4"',
+'databaseerror-error' => 'Feilur: $1',
 'laggedslavemode' => "'''Ávaring:''' Síðan inniheldur møguliga ikki nýggjar dagføringar.",
 'readonly' => 'Dátubasan er stongd fyri skriving',
 'enterlockreason' => 'Skriva eina orsøk fyri at stongja síðuna fyri skriving, saman við einari meting av, nær ið síðan verður lást upp aftur',
@@ -476,6 +477,7 @@ Møguliga hevur onkur annar longu strikað hana.',
 'cannotdelete-title' => 'Kann ikki strika síðu "$1"',
 'delete-hook-aborted' => 'Ein húkur (hook) forðaði fyri sletting.
 Ongin frágreiðing varð givin.',
+'no-null-revision' => 'Tað bar ikki til at upprætta nýggja tóma versjón fyri síðuna "$1"',
 'badtitle' => 'Ógyldugt heiti',
 'badtitletext' => 'Umbidna síðan er ógyldugt, tómt ella skeivt tilslóðað heiti millum mál ella wikur.',
 'perfcached' => 'Fylgjandi upplýsingar eru "fangaðir" (cached) og eru møguliga ikki dagførdir. Í mesta lagi {{PLURAL:$1|eitt úrslit er|$1 úrslit eru}} tøk í cache.',
@@ -498,13 +500,16 @@ Fyri at gera rættingar ella broyta týðingar á øllum wiki'um, vinarliga nýt
 'editinginterface' => "↓ '''Ávaring:''' Tú rættar eina síðu sum verður brúkt til at geva markamóts tekst til ritbúnaðin (software).
 Broytingar á hesi síðu fara at ávirka útsjóndina á brúkara markamótinum (interface) fyri aðrar brúkarar á hesi wiki.
 Fyri at gera týðingar ella broyta týðingar á øllum wiki, vinarliga nýt [//translatewiki.net/ translatewiki.net],  sum er ein MediaWiki verkætlan.",
-'sqlhidden' => '(SQL fyrispurningur fjaldur)',
 'cascadeprotected' => 'Henda síðan er vard fyri rættingum, tí hon er í fylgjandi {{PLURAL:$1|síðu, sum er|síðum, sum eru}}
 vardar við "arvaðari síðuverjing"
 $2',
 'namespaceprotected' => 'Tú hevur ikki loyvi til at rætta síður í $1 navnateiginum.',
 'customcssprotected' => 'Tú hevur ikki loyvi til at rætta hesa CSS síðuna, tí hon inniheldur persónligar innstillingar hjá øðrum brúkara.',
 'customjsprotected' => 'Tú hevur ikki loyvir til at rætta hesa JavaScript síðuna, tí hon inniheldur persónligar innstillingar hjá øðrum brúkara.',
+'mycustomcssprotected' => 'Tú hevur ikki loyvi til at rætta hesa CSS síðuna.',
+'mycustomjsprotected' => 'Tú hevur ikki loyvi til at rætta hesa JavaScript síðuna.',
+'myprivateinfoprotected' => 'Tú hevur ikki loyvi til at rætta tína privatu kunning.',
+'mypreferencesprotected' => 'Tú hevur ikki loyvi til at rætta tínar preferensur.',
 'ns-specialprotected' => 'Serstakar síður kunnu ikki rættast.',
 'titleprotected' => '[[User:$1|$1]] hevur vart hetta heitið frá skapan.
 Givin orsøk er "\'\'$2\'\'".',
@@ -529,10 +534,19 @@ Legg til merkis, at summar síður framvegis vera vístar, sum um tú enn vart l
 'welcomecreation-msg' => 'Tín konta er nú stovnað.
 Gloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}}-innstillingar]].',
 'yourname' => 'Títt brúkaranavn:',
+'userlogin-yourname' => 'Brúkaranavn',
+'userlogin-yourname-ph' => 'Skriva títt brúkaranavn',
+'createacct-another-username-ph' => 'Skriva brúkaranavnið',
 'yourpassword' => 'Títt loyniorð:',
+'userlogin-yourpassword' => 'Loyniorð',
+'userlogin-yourpassword-ph' => 'Skriva títt loyniorð',
+'createacct-yourpassword-ph' => 'Skrivað eitt loyniorð',
 'yourpasswordagain' => 'Skriva loyniorð umaftur:',
+'createacct-yourpasswordagain' => 'Váttað loyniorðið',
+'createacct-yourpasswordagain-ph' => 'Skrivað loyniorðið enn einaferð',
 'remembermypassword' => 'Minst til logg inn hjá mær á hesum kaganum (í mesta lagi í $1 {{PLURAL:$1|dag|dagar}})',
-'securelogin-stick-https' => 'Varðveit sambandið við HTTPS eftir logg inn',
+'userlogin-remembermypassword' => 'Lat meg vera innritaðan',
+'userlogin-signwithsecure' => 'Nýt trygt samband',
 'yourdomainname' => 'Títt domene:',
 'password-change-forbidden' => 'Tú kanst ikki broyta loyniorð á hesi wiki.',
 'externaldberror' => 'Antin var talan um ein atgongd dátubasu feil, ella hevur tú ikki loyvi til at dagføra tína eksternu kontu.',
@@ -544,18 +558,41 @@ Gloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}}-innstillingar]].'
 'logout' => 'Útrita',
 'userlogout' => 'Rita út',
 'notloggedin' => 'Ikki ritað inn',
+'userlogin-noaccount' => 'Hevur tú ikki nakra kontu?',
+'userlogin-joinproject' => 'Meldað teg til {{SITENAME}}',
 'nologin' => 'Hevur tú ikki eina kontu? $1.',
 'nologinlink' => 'Stovna eina kontu',
 'createaccount' => 'Stovna nýggja kontu',
 'gotaccount' => "Hevur tú longu eina kontu? '''$1'''.",
 'gotaccountlink' => 'Rita inn',
 'userlogin-resetlink' => 'Hevur tú gloymt tínar logg inn upplýsingar',
+'userlogin-resetpassword-link' => 'Nullstilla títt loyniorð',
+'helplogin-url' => 'Help:Innritan',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjálp til innritan]]',
+'createacct-join' => 'Skrivað tínar upplýsingar niðanfyri.',
+'createacct-another-join' => 'Skriva upplýsingarnar fyri tað nýggju kontuna niðanfyri.',
+'createacct-emailrequired' => 'Teldupost adressa',
+'createacct-emailoptional' => 'Teldupost adressa (valfrítt)',
+'createacct-email-ph' => 'Skrivað tína email adressu',
+'createacct-another-email-ph' => 'Skriva tína t-post adressu',
 'createaccountmail' => 'Nýt eitt fyribils tilvildarligt loyniorð og send tað til nevndu t-post adressuna',
+'createacct-realname' => 'Veruligt navn (valfrítt)',
 'createaccountreason' => 'Orsøk:',
+'createacct-reason' => 'Orsøk',
+'createacct-reason-ph' => 'Hví upprættar tú eina nýggja kontu',
+'createacct-captcha' => 'Trygdarkekk',
+'createacct-imgcaptcha-ph' => 'Skriva tekstin ið tú sært omanfyri',
+'createacct-submit' => 'Upprætta tína kontu',
+'createacct-another-submit' => 'Upprætta eina aðra kontu',
+'createacct-benefit-heading' => '{{SITENAME}} er gjørd av fólki sum tær.',
+'createacct-benefit-body1' => '{{PLURAL:$1|rætting|rættingar}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|síða|síður}}',
+'createacct-benefit-body3' => 'seinasti/u {{PLURAL:$1|høvundur|høvundar}}',
 'badretype' => 'Loyniorðið tú hevur skriva er ikki rætt.',
 'userexists' => 'Brúkaranavnið sum tú valdi er longu í nýtslu.
 Vinarliga vel eitt annað navn.',
 'loginerror' => 'Innritanarbrek',
+'createacct-error' => 'Feilur við skapan av konto',
 'createaccounterror' => 'Kundi ikki skapa kontu: $1',
 'nocookiesnew' => 'Brúkarakontan er nú gjørd, men tú ert ikki loggaður inn. 
 {{SITENAME}} brúkar "cookies" fyri at innrita brúkarar.
@@ -619,10 +656,12 @@ Tú eigur at innrita og broyta loyniorðið nú.
 Tú kanst síggja burtur frá hesum boðum, um henda kontan varð upprættað av misgáum.',
 'usernamehasherror' => 'Brúkaranavn kann ikki innihalda teknið #',
 'login-throttled' => 'Tú hevur roynt at rita inn ov nógvar ferðir nýliga.
-Vinarliga bíða áðrenn tú roynir aftur.',
+Vinarliga bíða $1 áðrenn tú roynir aftur.',
 'login-abort-generic' => 'Tað miseydnaðist tær at rita inn - avbrotið',
 'loginlanguagelabel' => 'Mál: $1',
 'suspicious-userlogout' => 'Tín fyrispurningur um at útrita var noktaður, tí tað sær út til at hann varð sendur frá einum oyðiløgdum kaga ella caching proxy.',
+'createacct-another-realname-tip' => 'Veruligt navn er valfrítt.
+Um tú velur at skriva tað, so verður tað nýtt til at geva brúkaranum æruna fyri hennara/hansara  arbeiði.',
 
 # Email sending
 'php-mail-error-unknown' => "Ókend villa í PHP'sa teldupost () funktión.",
@@ -638,8 +677,7 @@ Fyri at gera innritanina lidna, mást tú velja tær eitt nýtt loyniorð her:',
 'newpassword' => 'Nýtt loyniorð:',
 'retypenew' => 'Skriva nýtt loyniorð umaftur:',
 'resetpass_submit' => 'Vel loyniorð og rita inn',
-'resetpass_success' => 'Tað hevur eydnast tær at broyta títt loyniorð!
-Nú verður tú ritaður inn...',
+'changepassword-success' => 'Títt loyniorð er nú broytt!',
 'resetpass_forbidden' => 'Loyniorð kunnu ikki broytast',
 'resetpass-no-info' => 'Tú mást vera loggaður á fyri at fáa beinleiðis atgongd til hesa síðu.',
 'resetpass-submit-loggedin' => 'Broyt loyniorð',
@@ -651,10 +689,11 @@ Møguliga hevur tú longu broytt títt loyniorð ella biðið um eitt nýtt fyri
 
 # Special:PasswordReset
 'passwordreset' => 'Nullstilla loyniorðið',
-'passwordreset-text' => 'Útfyll hetta skjalið fyri at nullstilla títt loyniorð.',
+'passwordreset-text-one' => 'Útfyll henda teigin fyri at nullstilla títt loyniorð.',
+'passwordreset-text-many' => '{{PLURAL:$1|Útfyll ein av teigunum fyri at nullstilla títt loyniorð.}}',
 'passwordreset-legend' => 'Nulstilla loyniorðið',
 'passwordreset-disabled' => 'Tað ber ikki til at nullstilla loyniorðið á hesi wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Skriva ein av upplýsingunum niðanfyri}}',
+'passwordreset-emaildisabled' => 'Teldupost funksjónir eru óvirknar á hesi wiki.',
 'passwordreset-username' => 'Brúkaranavn:',
 'passwordreset-domain' => 'Umdømi (domain):',
 'passwordreset-capture' => 'Sí tann endaliga t-postin?',
@@ -679,7 +718,7 @@ Tú eigur at rita inn og velja eitt nýtt loyniorð nú. Um onkur annar hevur gj
 Fyribils loyniorð: $2',
 'passwordreset-emailsent' => 'Ein teldupostur har tú kanst nullstillað loyniorðið er blivin sendur.',
 'passwordreset-emailsent-capture' => 'Ein teldupostur, har ið tú kanst nullstilla loyniorðið, er blivin sendur, sum víst niðanfyri.',
-'passwordreset-emailerror-capture' => 'Ein áminningar teldupostur varð gjørdur, sum víst niðanfyri, men tað miseydnaðist at senda til brúkaran: $1',
+'passwordreset-emailerror-capture' => 'Ein teldupostur við nullstillaðum loyniorði var gjørdur, sum víst niðanfyri, men tað miseydnaðist at senda til {{GENDER:$2|brúkaran}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Broyt teldupost adressu',
@@ -693,6 +732,18 @@ Fyribils loyniorð: $2',
 'changeemail-submit' => 'Broyt t-post',
 'changeemail-cancel' => 'Ógilda',
 
+# Special:ResetTokens
+'resettokens' => 'Nullstilla lyklar',
+'resettokens-text' => 'Tú kanst nullstilla lyklar sum geva atgongd til ávís privat dáta sum eru knýtt at tínari konto her.
+
+Tú eigur at gera tað um tú av óvart hevur deilt lyklarnar við onkran, ella um tín konta hevur verið útsett fyri vandastøðu.',
+'resettokens-no-tokens' => 'Tað eru ongir lyklar at nullstilla.',
+'resettokens-legend' => 'Nullstilla lyklar',
+'resettokens-tokens' => 'Lyklar:',
+'resettokens-token-label' => '$1 (dagsins virði: $2)',
+'resettokens-done' => 'Nullstilla lyklar.',
+'resettokens-resetbutton' => 'Nullstilla útvaldu lyklar (tokens)',
+
 # Edit page toolbar
 'bold_sample' => 'Feitir stavir',
 'bold_tip' => 'Feitir stavir',
@@ -896,12 +947,15 @@ Ongin frágreiðing finst.',
 Tað sær út til at hon er blivin strikað.',
 'edit-conflict' => 'Rættingar trupulleiki (konflikt).',
 'edit-no-change' => 'Tín rætting var sæð burtur frá, tí ongin broyting varð gjørd í tekstinum.',
+'postedit-confirmation' => 'Tín rætting varð goymd.',
 'edit-already-exists' => 'Tað var ikki møguligt at upprætta nýggja síðu.
 Síðan er longu til.',
 'defaultmessagetext' => 'Standard boðtekstur',
 'content-failed-to-parse' => 'Kláraði ikki at tulka $2 innihaldi fyri $1 modell: $3',
 'invalid-content-data' => 'Ógyldug innihalds dáta',
 'content-not-allowed-here' => '"$1" innihald er ikki loyvt á síðu [[$2]]',
+'editwarning-warning' => 'Um tú fert frá hesi síðuni, so kanst tú missa tær broytingar ið tú hevur gjørt.
+Um tú hevur ritað inn, so kanst tú sláa hesa ávaring frá í "Rættingar" partinum í tínum innstillingum.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -934,6 +988,7 @@ Vinarliga kanna eftir samanberingina niðanfyri fyri at vátta, at hetta er tað
 'undo-failure' => 'Rættingin kundi ikki takast burtur orsakað av konfliktum við rættingum sum eru gjørdar eftir at tú fór í gongd at rætta.',
 'undo-norev' => 'Rættingin kann ikki takast burtur, tí at hon er ikki til ella var strikað.',
 'undo-summary' => 'Tak burtur versjón $1 hjá [[Special:Contributions/$2|$2]] ([[User talk:$2|kjak]])',
+'undo-summary-username-hidden' => 'Angra versjón $1 sum ein fjaldur brúkari hevur gjørt',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Tað ber ikki til at upprætta konto',
@@ -1095,6 +1150,7 @@ Tryggja tær, at henda broyting fer at varðveita framhaldssøguna hjá síðuni
 'compareselectedversions' => 'Bera saman valdar útgávur',
 'showhideselectedversions' => 'Vís/fjal valdu versjónir',
 'editundo' => 'afturstilla',
+'diff-empty' => '(Ongin munur)',
 'diff-multi' => '({{PLURAL:$1|Ein versjón herímillum|$1 versjónir sum liggja ímillum}} av {{PLURAL:$2|einum brúkara|$2 brúkarar}} ikki víst)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ein versjón sum liggur ímillum|$1 versjónir sum liggja ímillum}} skrivaðar av meira enn $2 {{PLURAL:$2|brúkara|brúkarum}} ikki víst)',
 
@@ -1118,7 +1174,6 @@ Tryggja tær, at henda broyting fer at varðveita framhaldssøguna hjá síðuni
 'searchmenu-legend' => 'Leiti møguleikar',
 'searchmenu-exists' => "'''Tað er longu ein síða sum eitur \"[[:\$1]]\" á hesi wiki.'''",
 'searchmenu-new' => "'''Stovna síðuna \"[[:\$1]]\" á hesi wiki!'''",
-'searchhelp-url' => 'Help:Innihald',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Leita í síðum við hesum prefiksinum (byrjan av orðinum)]]',
 'searchprofile-articles' => 'Innihaldssíður',
 'searchprofile-project' => 'Hjálpar og verkætlanar síður',
@@ -1162,14 +1217,7 @@ Tú kanst royna at brúka ''all:'' sum fyrsta stavilsi fyri at søkja í øllum
 'searchdisabled' => '{{SITENAME}} leitan er sett úr gildi.
 Tú kanst leita via Google ímeðan.
 Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og ikki dagført.',
-
-# Quickbar
-'qbsettings' => 'Skundfjøl innstillingar',
-'qbsettings-none' => 'Eingin',
-'qbsettings-fixedleft' => 'Fast vinstru',
-'qbsettings-fixedright' => 'Fast høgru',
-'qbsettings-floatingleft' => 'Flótandi vinstru',
-'qbsettings-floatingright' => 'Flótandi høgra',
+'search-error' => 'Ein feilur hendi undir leitanini: $1',
 
 # Preferences page
 'preferences' => 'Innstillingar',
@@ -1203,7 +1251,6 @@ Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og
 'resetprefs' => 'Reinsa ikki goymdar broytingar',
 'restoreprefs' => 'Nullstilla alt til standard innstillingar (í øllum teigum)',
 'prefs-editing' => 'Broyting av greinum',
-'prefs-edit-boxsize' => 'Støddin á rættingar vindeyganum.',
 'rows' => 'Røð:',
 'columns' => 'Teigar:',
 'searchresultshead' => 'Leita',
@@ -1214,9 +1261,6 @@ Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og
 'recentchangesdays-max' => 'Í mesta lagi $1 {{PLURAL:$1|dagur|dagar}}',
 'recentchangescount' => 'Tal av rættingum at vísa í standard:',
 'prefs-help-recentchangescount' => 'Íroknað seinastu broytingar, søgur hjá síðum og loggar.',
-'prefs-help-watchlist-token' => 'Um tú fyllir út henda teigin við einum tryggum lykli, so verður ein RSS feed upprættaður til tín eftirlitslista.
-Ein og hvør ið kennir lykilin í hesum teiginum, hevur møguleika fyri at lesa tín eftirlitslista, so vel ein trygt virði.
-Her er eitt tilvildarliga valdt virði, sum tú kanst brúka: $1',
 'savedprefs' => 'Tínar innstillingar eru goymdar.',
 'timezonelegend' => 'Tíðar sona:',
 'localtime' => 'Lokal tíð:',
@@ -1247,7 +1291,6 @@ Her er eitt tilvildarliga valdt virði, sum tú kanst brúka: $1',
 'prefs-reset-intro' => 'Tú kanst brúka hesa síðuna til at nullstilla allar tínar valdu innstillingar, so tað kemur aftur til standard.
 Tú kanst ikki angra, tá tað fyrst er gjørt.',
 'prefs-emailconfirm-label' => 'Vátta tína t-post adressu:',
-'prefs-textboxsize' => 'Støddin á rættingar vindeyganum',
 'youremail' => 'T-postur (sjálvboðið)*:',
 'username' => '{{GENDER:$1|Brúkaranavn}}:',
 'uid' => '{{GENDER:$1|Brúkari}} ID:',
@@ -1282,6 +1325,8 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'prefs-dateformat' => 'Slag av dagfesting',
 'prefs-timeoffset' => 'Tíðarmunur',
 'prefs-advancedediting' => 'Møguleikar sum heild',
+'prefs-editor' => 'Persónur sum rættar',
+'prefs-preview' => 'Forskoðan',
 'prefs-advancedrc' => 'Víðkaðir møguleikar',
 'prefs-advancedrendering' => 'Víðkaðir møguleikar',
 'prefs-advancedsearchoptions' => 'Víðkaðir møguleikar',
@@ -1289,6 +1334,7 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'prefs-displayrc' => 'Vís møguleikar',
 'prefs-displaysearchoptions' => 'Vís møguleikar',
 'prefs-displaywatchlist' => 'Vís møguleikar',
+'prefs-tokenwatchlist' => 'Lykil',
 'prefs-diffs' => 'Munir',
 
 # User preference: email validation using jQuery
@@ -1316,6 +1362,8 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'userrights-notallowed' => 'Tú hevur ikki loyvi til at geva ella taka burtur brúkara rættindi.',
 'userrights-changeable-col' => 'Bólkar sum tú kanst broyta',
 'userrights-unchangeable-col' => 'Bólkar, ið tú ikki kanst broyta',
+'userrights-conflict' => 'Ósamsvar viðvíkjandi broytingum í brúkararættindum! Vinarliga endurskoða og vátta tínar broytingar.',
+'userrights-removed-self' => 'Tað eydnaðist tær at taka burtur tíni egnu rættindi. Tí kanst tú ikki longur fáa atgongd til hesa síðuna.',
 
 # Groups
 'group' => 'Bólkur:',
@@ -1374,11 +1422,19 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'right-hideuser' => 'Sperra eitt brúkaranavn og goyma tað burtur fyri almenninginum',
 'right-unblockself' => 'Taka burtur sperring hjá sær sjálvum',
 'right-protect' => 'Broyt verjustøður og rætta kaskadu-vardar síður',
-'right-editprotected' => 'Rætta vardar síður (uttan niðurarvaða verju)',
+'right-editprotected' => 'Rætta síður sum eru vardar sum "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Rætta síður sum er vardar sum "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Rætta brúkaramarkamótið',
 'right-editusercssjs' => 'Rætta CSS og JavaScript fílur hjá øðrum brúkarum',
 'right-editusercss' => 'Rætta CSS fílur hjá øðrum brúkarum',
 'right-edituserjs' => 'Rætta JavaScript fílur hjá øðrum brúkarum',
+'right-editmyusercss' => 'Rætta tínar egnu brúkara CSS fílur',
+'right-editmyuserjs' => 'Rætta tínar egnu brúkara JavaScript fílur',
+'right-viewmywatchlist' => 'Síggj tín egna eftirlitslista',
+'right-editmywatchlist' => 'Rætta tín egna eftirlitslista. Legg til merkis at summar handlingar fara framvegis at leggja síður afturat sjálvt uttan hesi rættindi.',
+'right-viewmyprivateinfo' => 'Síggj tíni egnu privatu upplýsingar (t.d. teldupostadressu, veruligt navn)',
+'right-editmyprivateinfo' => 'Rætta tíni egnu privatu dáta (t.d. teldupost adresssu, veruligt navn)',
+'right-editmyoptions' => 'Rætta tínar egnu innstillingar',
 'right-rollback' => 'Rulla skjótt aftur (tak burtur) rættingarnar hjá tí seinasta brúkaranum á einari ávísari síðu',
 'right-markbotedits' => 'Markera afturrullaðar rættingar sum rættingar frá einum botti',
 'right-noratelimit' => 'Ikki ávirkað av hámarksferð',
@@ -1440,12 +1496,17 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'action-userrights-interwiki' => 'broyt brúkararættindi hjá brúkarum á øðrum wikium',
 'action-siteadmin' => 'stong ella læs upp dátugrunnin',
 'action-sendemail' => 'send teldupostar',
+'action-editmywatchlist' => 'rætta tín eftirlitslista',
+'action-viewmywatchlist' => 'síggja tín eftirlitslista',
+'action-viewmyprivateinfo' => 'hygg at tínari privatu kunning',
+'action-editmyprivateinfo' => 'rætta tína privatu kunning',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|broyting|broytingar}}',
 'recentchanges' => 'Seinastu broytingar',
 'recentchanges-legend' => 'Nýligar broytingar møguleikar',
 'recentchanges-summary' => 'Á hesi síðu kanst tú fylgja teimum nýggjastu broytingunum á hesi wiki.',
+'recentchanges-noresult' => 'Ongar broytingar í nevnda tíðarskeiðnum passa til hesi krøvini.',
 'recentchanges-feed-description' => "Við hesum feed'inum kanst tú fylgja teimum seinastu broytingunum á hesi wiki'ini.",
 'recentchanges-label-newpage' => 'Henda rætting upprættaði eina nýggja síðu',
 'recentchanges-label-minor' => 'Hetta er ein lítil rætting',
@@ -1482,7 +1543,6 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'recentchangeslinked-feed' => 'Viðkomandi broytingar',
 'recentchangeslinked-toolbox' => 'Viðkomandi broytingar',
 'recentchangeslinked-title' => 'Broytingar sum vísa til "$1"',
-'recentchangeslinked-noresult' => 'Ongar broytingar á slóðaðar síður í valda tíðarskeiði.',
 'recentchangeslinked-summary' => "Hetta er ein listi við broytingum sum nýliga eru gjørdir á síðum sum víst verður til frá einari serstakari síðu (ella til limir í einum serstøkum bólki).
 Síður á [[Special:Watchlist|tínum eftiransingarlista]] eru skrivaðar við '''feitum'''.",
 'recentchangeslinked-page' => 'Síðu heiti:',
@@ -1494,8 +1554,7 @@ Síður á [[Special:Watchlist|tínum eftiransingarlista]] eru skrivaðar við '
 'reuploaddesc' => 'Angra uppløðu og far aftur til upload formin',
 'upload-tryagain' => 'Goym broytta fílu frágreiðing',
 'uploadnologin' => 'Ikki ritað inn',
-'uploadnologintext' => 'Tú mást hava [[Special:UserLogin|ritað inn]]
-fyri at leggja fílur upp.',
+'uploadnologintext' => 'Tú mást $1 fyri at leggja fílur út.',
 'upload-recreate-warning' => "'''Ávaring: Ein fíla við hasum navninum er blivin strikað ella flutt.'''
 
 Strikingar og flytingar loggurin (søgan) fyri ta síðuna verður vístur her niðanfyri fyri at gera tað lættari hjá tær:",
@@ -1682,7 +1741,6 @@ Bert fílu atgongd er loyvd.',
 'http-read-error' => 'HTTP lesifeilur.',
 'http-timed-out' => 'HTTP fyrispurningurin tók ov langa tíð.',
 'http-curl-error' => 'Feilur meðan vit heintaðu URL: $1',
-'http-host-unreachable' => 'Internetadressan er ikki atkomulig.',
 'http-bad-status' => 'Tað hendi ein feilur undir viðgerðini av HTTP fyrispurnininum: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1712,6 +1770,8 @@ Tú kanst eisini royna aftur, tá tað ikki eru so nógv í gongd her í senn.',
 'listfiles_size' => 'Stødd',
 'listfiles_description' => 'Frágreiðing',
 'listfiles_count' => 'Versjónir',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nei',
 
 # File description page
 'file-anchor-link' => 'Mynd',
@@ -1805,6 +1865,13 @@ Minst til at kanna eftir um aðrar síður slóða til fyrimyndirnar, áðrenn t
 'randompage' => 'Tilvildarlig síða',
 'randompage-nopages' => 'Tað eru ongar síður í hesum {{PLURAL:$2|navnarúminum|navnarúmunum}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Tilvildarlig síða í bólkinum',
+'randomincategory-invalidcategory' => '"$1" kann ikki brúkast sum bólkaheiti.',
+'randomincategory-nopages' => 'Tað eru ongar síður í [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Fá tilvildarliga síðu frá bólki: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Far',
+
 # Random redirect
 'randomredirect' => 'Tilvildarlig ávísingarsíða',
 'randomredirect-nopages' => 'Tað eru ongar víðaristillingar til navnarúmið "$1".',
@@ -1830,17 +1897,12 @@ Minst til at kanna eftir um aðrar síður slóða til fyrimyndirnar, áðrenn t
 'statistics-users-active-desc' => 'Brúkarar ið hava framt eina handling seinasta/u {{PLURAL:$1|døgnið|$1 dagarnar}}',
 'statistics-mostpopular' => 'Mest sæddu síður',
 
-'disambiguations' => 'Síður sum vísa til síður við fleirfaldum týdningi',
-'disambiguationspage' => 'Template:fleiri týdningar',
-'disambiguations-text' => "Hesar síður innihalda í minsta lagi ein leinkju til eina '''síðu við fleiri týdningum'''.
-Tær eiga heldur at slóða til ein meira passandi síðu í staðin.<br />
-Ein síða verður sædd sum ein síða við fleiri týdningum, um hon brúkar eina fyrimynd, sum slóðar frá [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Síður við síðueginleika',
 'pageswithprop-legend' => 'Síður við einum síðueginleika',
 'pageswithprop-text' => 'Henda síðan vísir síður ein lista yvir síður, sum hava ein serstakan síðueginleika.',
 'pageswithprop-prop' => 'Navn á eginleika:',
 'pageswithprop-submit' => 'Far',
+'pageswithprop-prophidden-long' => 'langur tekstur eginleikavirði er fjalt ($1)',
 
 'doubleredirects' => 'Tvífaldað ávísing',
 'doubleredirectstext' => 'Henda síða gevur yvirlit yvir síður, sum vísa víðari til aðrar víðaristillaðar síður.
@@ -1897,6 +1959,7 @@ Víðaristilling verður nú gjørd til [[$2]].',
 'mostrevisions' => 'Greinir við flestum útgávum',
 'prefixindex' => 'Allar síður við forskoyti (prefiks)',
 'prefixindex-namespace' => 'Allar síður við prefiksi (navnarúmið $1)',
+'prefixindex-strip' => 'Tak burtur prefiks í listanum',
 'shortpages' => 'Stuttar síður',
 'longpages' => 'Langar síður',
 'deadendpages' => 'Gøtubotnssíður',
@@ -2082,8 +2145,9 @@ Framtíðar broytingar á hesi síðu og tilknýttu kjaksíðuni verða at sígg
 'unwatchthispage' => 'Halt uppat við at hava eftirlit',
 'notanarticle' => 'Ongin innihaldssíða',
 'notvisiblerev' => 'Seinasta versjón av einum øðrum brúkara er blivin slettað',
-'watchnochange' => 'Ongin grein í tínum eftirliti er rætta innanfyri hetta tíðarskeiði.',
 'watchlist-details' => '{{PLURAL:$1|$1 síða|$1 síður}} á tínum vaktarlista, kjaksíður ikki íroknaðar.',
+'wlheader-enotif' => 'Tað ber nú til at senda teldupost.',
+'wlheader-showupdated' => "Síður sum eru broyttar síðan tú seinast vitjaði tær, eru vístar við '''feitum'''.",
 'watchmethod-recent' => 'kanna eftir nýligum rættingum á eftirlitssíðum',
 'watchmethod-list' => 'kannar síður undir eftirliti fyri feskar broytingar',
 'watchlistcontains' => 'Títt eftirlit inniheldur {{PLURAL:$1|eina síðu|$1 síður}}.',
@@ -2420,10 +2484,7 @@ Fjalingarloggurin er vístur niðanfyri til kunningar:',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Onnur sperring|Aðrar sperringar}}',
 'unblock-hideuser' => 'Tú kanst ikki taka burtur sperringina hjá hesum brúkara, eftirsum brúkaranavnið hjá viðkomandi er fjalt.',
 'ipb_cant_unblock' => 'Feilur: Sperring ID $1 ikki funnin. Tað er møguligt, at sperringin longu er tikin burtur.',
-'blockme' => 'Sperra meg',
 'proxyblocker' => 'Proxy sperring',
-'proxyblocker-disabled' => 'Henda funksjónin er ikki virkin.',
-'proxyblocksuccess' => 'Liðugt.',
 'sorbsreason' => 'Tín IP adressa er merkt sum ein open proxy í DNSBL sum {{SITENAME}} brúkar.',
 'sorbs_create_account_reason' => 'Tín IP adressa er merkt sum ein open proxy í DNSBL sum {{SITENAME}} brúkar.
 Tú kanst ikki upprætta eina konto.',
@@ -2575,6 +2636,8 @@ Vinarliga vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] o
 'thumbnail-more' => 'Víðka',
 'filemissing' => 'Fíla vantar',
 'thumbnail_error' => 'Feilur við upprættan av thumbnail (lítlari mynd): $1',
+'thumbnail_error_remote' => 'Feilboð frá $1:
+$2',
 'djvu_page_error' => 'DjVu síða uttanfyri økið',
 'djvu_no_xml' => 'Tað bar ikki til at heinta XML fyri DjVu fílu',
 'thumbnail-temp-create' => 'Tað bar ikki til at upprættað eina fyribils pinkalítla stødd (thumbnail) av fíluni',
@@ -2774,8 +2837,6 @@ Vinarliga royn aftur.',
 'pageinfo-category-files' => 'Tal av fílum',
 
 # Skin names
-'skinname-standard' => 'Standardur',
-'skinname-nostalgia' => 'Nostalgiskur',
 'skinname-cologneblue' => 'Cologne-bláur',
 
 # Patrolling
@@ -2836,11 +2897,25 @@ Vinarliga royn aftur.',
 'minutes' => '{{PLURAL:$1|$1 minuttur|$1 minuttir}}',
 'hours' => '{{PLURAL:$1|$1 tími|$1 tímar}}',
 'days' => '{{PLURAL:$1|$1 dagur|$1 dagar}}',
+'weeks' => '{{PLURAL:$1|$1 vika|$1 vikur}}',
 'months' => '{{PLURAL:$1|$1 mánaður|$1 mánaðir}}',
 'years' => '{{PLURAL:$1|$1 ár}}',
 'ago' => '$1 síðan',
 'just-now' => 'júst nú',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|tími|tímar}} síðan',
+'minutes-ago' => '$1 {{PLURAL:$1|minuttur|minuttir}} síðan',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund|sekundir}} síðan',
+'monday-at' => 'Mánadagin kl. $1',
+'tuesday-at' => 'Týsdagin kl. $1',
+'wednesday-at' => 'Mikudagin kl. $1',
+'thursday-at' => 'Hósdagin kl. $1',
+'friday-at' => 'Fríggjadagin kl. $1',
+'saturday-at' => 'Leygardagin kl. $1',
+'sunday-at' => 'Sunnudagin kl. $1',
+'yesterday-at' => 'Í gjár kl. $1',
+
 # Bad image list
 'bad_image_list' => 'Støddin er soleiðis: 
 
@@ -2870,7 +2945,7 @@ Onnur metadáta verða fjald sum standard.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breidd',
 'exif-imagelength' => 'Hædd',
 'exif-bitspersample' => 'Bits per komponent',
@@ -2912,7 +2987,7 @@ Onnur metadáta verða fjald sum standard.
 'exif-originalimageheight' => 'Hæddin á myndini, áðrenn hon varð skorin',
 'exif-originalimagewidth' => 'Breiddin á myndini, áðrenn hon varð skorin',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ikki komprimerað',
 
 'exif-copyrighted-true' => 'Vard av upphavrætti',
@@ -3069,11 +3144,17 @@ Hendan váttanarkoda fer úr gildi tann $4.',
 'version-license' => 'Lisensur',
 'version-poweredby-credits' => "Henda wiki verður rikin av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'onnur',
+'version-poweredby-translators' => 'translatewiki.net týðarar',
 'version-credits-summary' => 'Vit ynskja at takka fylgjandi persónum fyri teirra íkast til [[Special:Version|MediaWiki]].',
 'version-software-version' => 'Útgáva',
 
-# Special:FilePath
-'filepath-page' => 'Fíla:',
+# Special:Redirect
+'redirect-submit' => 'Far',
+'redirect-value' => 'Virði:',
+'redirect-user' => 'Brúkara ID',
+'redirect-revision' => 'Síðuversjón',
+'redirect-file' => 'Fílunavn',
+'redirect-not-exists' => 'Virði ikki funnið',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Fílunavn:',
diff --git a/languages/messages/MessagesFr.php b/languages/messages/MessagesFr.php
index 3b773d34..bb9395f7 100644
--- a/languages/messages/MessagesFr.php
+++ b/languages/messages/MessagesFr.php
@@ -10,6 +10,7 @@
  * @author Agzennay
  * @author Amqui
  * @author Arkanosis
+ * @author Ayack
  * @author Boniface
  * @author Brunoperel
  * @author Cedric31
@@ -30,6 +31,7 @@
  * @author Erkethan
  * @author Esbardu
  * @author Fabrice Ferrer
+ * @author Frakir
  * @author François Melchior
  * @author Fryed-peach
  * @author Geoleplubo
@@ -418,9 +420,6 @@ $messages = array(
 'tog-shownumberswatching' => "Afficher le nombre d'utilisateurs qui suivent la page",
 'tog-oldsig' => 'Signature existante :',
 'tog-fancysig' => 'Traiter la signature comme du wikitexte (sans lien automatique)',
-'tog-externaleditor' => "Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
-'tog-externaldiff' => "Utiliser un comparateur externe par défaut (pour les utilisateurs avancés, nécessite des réglages sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
-'tog-showjumplinks' => 'Activer les liens « navigation » et « recherche » en haut de page',
 'tog-uselivepreview' => 'Utiliser l’aperçu rapide (expérimental)',
 'tog-forceeditsummary' => "M'avertir lorsque je n'ai pas spécifié de résumé de modification",
 'tog-watchlisthideown' => 'Masquer mes propres modifications dans la liste de suivi',
@@ -434,6 +433,8 @@ $messages = array(
 'tog-showhiddencats' => 'Afficher les catégories cachées',
 'tog-noconvertlink' => 'Désactiver la conversion des titres',
 'tog-norollbackdiff' => "Ne pas afficher le diff lors d'une révocation",
+'tog-useeditwarning' => "M'avertir quand je quitte une page de modification sans publier les changements",
+'tog-prefershttps' => 'Toujours utiliser une connexion sécurisée en étant connecté',
 
 'underline-always' => 'Toujours',
 'underline-never' => 'Jamais',
@@ -497,6 +498,18 @@ $messages = array(
 'oct' => 'oct',
 'nov' => 'nov',
 'dec' => 'déc',
+'january-date' => '$1 janvier',
+'february-date' => '$1 février',
+'march-date' => '$1 mars',
+'april-date' => '$1 avril',
+'may-date' => '$1 mai',
+'june-date' => '$1 juin',
+'july-date' => '$1 juillet',
+'august-date' => '$1 août',
+'september-date' => '$1 septembre',
+'october-date' => '$1 octobre',
+'november-date' => '$1 novembre',
+'december-date' => '$1 décembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Catégorie|Catégories}}',
@@ -578,6 +591,7 @@ $messages = array(
 'create-this-page' => 'Créer cette page',
 'delete' => 'Supprimer',
 'deletethispage' => 'Supprimer cette page',
+'undeletethispage' => 'Annuler la suppression de cette page',
 'undelete_short' => 'Restaurer $1 modification{{PLURAL:$1||s}}',
 'viewdeleted_short' => 'Voir {{PLURAL:$1|une modification supprimée|$1 modifications supprimées}}',
 'protect' => 'Protéger',
@@ -621,7 +635,7 @@ $1",
 'pool-queuefull' => 'La file de travail est pleine',
 'pool-errorunknown' => 'Erreur inconnue',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'À propos de {{SITENAME}}',
 'aboutpage' => 'Project:À propos',
 'copyright' => 'Le contenu est disponible sous licence $1 sauf mention contraire.',
@@ -631,7 +645,6 @@ $1",
 'disclaimers' => 'Avertissements',
 'disclaimerpage' => 'Project:Avertissements généraux',
 'edithelp' => 'Aide',
-'edithelppage' => 'Aide:Édition',
 'helppage' => 'Help:Accueil',
 'mainpage' => 'Accueil',
 'mainpage-description' => 'Accueil',
@@ -708,17 +721,11 @@ Une liste des pages spéciales valides se trouve sur [[Special:SpecialPages|{{in
 # General errors
 'error' => 'Erreur',
 'databaseerror' => 'Erreur de la base de données',
-'dberrortext' => "Une erreur de syntaxe de la requête dans la base de données est survenue.
-Ceci peut indiquer un bogue dans le logiciel.
-La dernière requête traitée par la base de données était :
-<blockquote><code>$1</code></blockquote>
-depuis la fonction « <code>$2</code> ».
-La base de données a renvoyé l'erreur « <samp>$3 : $4</samp> ».",
-'dberrortextcl' => "Une requête dans la base de données comporte une erreur de syntaxe.
-La dernière requête émise était :
-« $1 »
-dans la fonction « $2 ».
-La base de données a renvoyé l'erreur « $3 : $4 ».",
+'databaseerror-text' => "Une erreur de requête de base de données s'est produite. Cela peut provenir d'un bogue dans le logiciel.",
+'databaseerror-textcl' => "Une erreur de requête de base de données s'est produite.",
+'databaseerror-query' => 'Requête : $1',
+'databaseerror-function' => 'Fonction : $1',
+'databaseerror-error' => 'Erreur : $1',
 'laggedslavemode' => 'Attention, cette page peut ne pas contenir les toutes dernières modifications effectuées',
 'readonly' => 'Base de données verrouillée',
 'enterlockreason' => "Indiquez la raison du verrouillage ainsi qu'une estimation de sa durée",
@@ -752,6 +759,7 @@ La suppression a peut-être déjà été effectuée par quelqu’un d’autre.',
 'cannotdelete-title' => 'Impossible de supprimer la page « $1 »',
 'delete-hook-aborted' => "Suppression annulée par une extension.
 Aucune explication n'a été fournie.",
+'no-null-revision' => 'Impossible de créer une nouvelle révision vide pour la page « $1 »',
 'badtitle' => 'Mauvais titre',
 'badtitletext' => 'Le titre de la page demandée est invalide, vide, ou il s’agit d’un titre inter-langue ou inter-projet mal formé. Il contient peut-être un ou plusieurs caractères qui ne peuvent pas être utilisés dans les titres.',
 'perfcached' => 'Les données suivantes sont en cache et peuvent ne pas être à jour. Un maximum de {{PLURAL:$1|un résultat|$1 résultats}} est disponible dans le cache.',
@@ -772,12 +780,15 @@ Essayez à nouveau dans quelques minutes.",
 Pour ajouter ou modifier des traductions sur tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet de localisation de MediaWiki.",
 'editinginterface' => "'''Attention''' : vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel. Les changements sur cette page se répercuteront sur l’apparence de l’interface utilisateur pour les autres utilisateurs de ce wiki.
 Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet d’internationalisation de MediaWiki.",
-'sqlhidden' => '(Requête SQL cachée)',
 'cascadeprotected' => 'Cette page est protégée car elle est incluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée :
 $2',
 'namespaceprotected' => "Vous n'avez pas la permission de modifier les pages de l'espace de noms « '''$1''' ».",
 'customcssprotected' => "Vous n'avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d'un autre utilisateur.",
 'customjsprotected' => "Vous n'avez pas la permission de modifier cette page de JavaScript, car elle contient les paramètres personnels d'un autre utilisateur.",
+'mycustomcssprotected' => 'Vous n’avez pas le droit de modifier cette page CSS.',
+'mycustomjsprotected' => 'Vous n’avez pas le droit de modifier cette page JavaScript.',
+'myprivateinfoprotected' => 'Vous n’avez pas les droits pour modifier vos informations personnelles.',
+'mypreferencesprotected' => 'Vous n’avez pas les droits pour modifier vos préférences.',
 'ns-specialprotected' => "Les pages dans l'espace de noms « {{ns:special}} » ne peuvent pas être modifiées.",
 'titleprotected' => "Ce titre a été protégé à la création par [[User:$1|$1]].
 Le motif avancé est « ''$2'' ».",
@@ -802,10 +813,19 @@ Notez que certaines pages peuvent être encore affichées comme si vous étiez t
 'welcomecreation-msg' => "Votre compte a été créé.
 N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAME}}]].",
 'yourname' => "Nom d'utilisateur :",
+'userlogin-yourname' => "Nom d'utilisateur",
+'userlogin-yourname-ph' => "Entrez votre nom d'utilisateur",
+'createacct-another-username-ph' => 'Saisir le nom d’utilisateur',
 'yourpassword' => 'Mot de passe&nbsp;:',
+'userlogin-yourpassword' => 'Mot de passe',
+'userlogin-yourpassword-ph' => 'Entrez votre mot de passe',
+'createacct-yourpassword-ph' => 'Entrez un mot de passe',
 'yourpasswordagain' => 'Confirmez le mot de passe :',
+'createacct-yourpasswordagain' => 'Confirmez le mot de passe',
+'createacct-yourpasswordagain-ph' => 'Entrez à nouveau le mot de passe',
 'remembermypassword' => 'Me reconnecter automatiquement lors des prochaines visites avec ce navigateur (au maximum $1&nbsp;{{PLURAL:$1|jour|jours}})',
-'securelogin-stick-https' => 'Rester connecté en HTTPS après la connexion',
+'userlogin-remembermypassword' => 'Garder ma session active',
+'userlogin-signwithsecure' => 'Utiliser une connexion sécurisée',
 'yourdomainname' => 'Votre domaine :',
 'password-change-forbidden' => 'Vous ne pouvez pas modifier les mots de passe sur ce wiki.',
 'externaldberror' => "Une erreur s'est produite avec la base de données d'authentification externe, ou bien vous n'êtes pas autorisé{{GENDER:||e|(e)}} à mettre à jour votre compte externe.",
@@ -817,18 +837,44 @@ N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAM
 'logout' => 'Se déconnecter',
 'userlogout' => 'Déconnexion',
 'notloggedin' => 'Non connecté',
+'userlogin-noaccount' => "Vous n'avez pas de compte ?",
+'userlogin-joinproject' => 'Rejoignez {{SITENAME}}',
 'nologin' => "Vous n'êtes pas encore inscrit ? $1.",
 'nologinlink' => 'Créer un compte',
 'createaccount' => 'Créer un compte',
 'gotaccount' => "Vous avez déjà un compte ? '''$1'''.",
 'gotaccountlink' => 'Connectez-vous',
 'userlogin-resetlink' => 'Vous avez oublié vos détails de connexion ?',
+'userlogin-resetpassword-link' => 'Réinitialiser le mot de passe',
+'helplogin-url' => 'Help:Connexion',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aide à la connexion]]',
+'userlogin-loggedin' => 'Vous êtes déjà connecté en tant que {{GENDER:$1|$1}}.
+Utilisez le formulaire ci-dessous pour vous connecter avec un autre utilisateur.',
+'userlogin-createanother' => 'Créer un autre compte',
+'createacct-join' => 'Entrez vos informations ci-dessous.',
+'createacct-another-join' => 'Saisir les informations du nouveau compte ci-dessous.',
+'createacct-emailrequired' => 'Adresse de courriel',
+'createacct-emailoptional' => 'Adresse de courriel (facultative)',
+'createacct-email-ph' => 'Entrez votre adresse de courriel',
+'createacct-another-email-ph' => 'Saisir l’adresse de courriel',
 'createaccountmail' => 'Utiliser un mot de passe aléatoire temporaire et l’envoyer à l’adresse de courriel spécifiée',
+'createacct-realname' => 'Nom réel (facultatif)',
 'createaccountreason' => 'Motif :',
+'createacct-reason' => 'Motif',
+'createacct-reason-ph' => 'Pourquoi créez-vous un autre compte',
+'createacct-captcha' => 'Contrôle de sécurité',
+'createacct-imgcaptcha-ph' => 'Entrez le texte que vous voyez ci-dessus',
+'createacct-submit' => 'Créez votre compte',
+'createacct-another-submit' => 'Créer un autre compte',
+'createacct-benefit-heading' => '{{SITENAME}} est écrit par des gens comme vous.',
+'createacct-benefit-body1' => '{{PLURAL:$1|modification|modifications}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|article|articles}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributeur récent|contributeurs récents}}',
 'badretype' => 'Les mots de passe que vous avez saisis ne correspondent pas.',
 'userexists' => "Nom d'utilisateur entré déjà utilisé.
 Veuillez choisir un nom différent.",
 'loginerror' => 'Erreur de connexion',
+'createacct-error' => 'Erreur lors de la création du compte',
 'createaccounterror' => 'Impossible de créer le compte : $1',
 'nocookiesnew' => "Le compte utilisateur a été créé, mais vous n'êtes pas connecté{{GENDER:||e|(e)}}. {{SITENAME}} utilise des cookies pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
 'nocookieslogin' => '{{SITENAME}} utilise des cookies pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter.',
@@ -885,11 +931,13 @@ Vous devriez ouvrir une session et modifier dès à présent votre mot de passe.
 
 Ignorez ce message si ce compte a été créé par erreur.',
 'usernamehasherror' => "Le nom d'utilisateur ne peut pas contenir des caractères de hachage",
-'login-throttled' => 'Vous avez tenté un trop grand nombre de connexions dernièrement.
-Veuillez attendre avant d’essayer à nouveau.',
+'login-throttled' => "Vous avez tenté un trop grand nombre de connexions dernièrement.
+Veuillez attendre $1 avant d'essayer à nouveau.",
 'login-abort-generic' => 'Votre tentative de connexion a échoué',
 'loginlanguagelabel' => 'Langue : $1',
 'suspicious-userlogout' => "Votre demande de déconnexion a été refusée car il semble qu'elle a été envoyée par un navigateur cassé ou la mise en cache d'un proxy.",
+'createacct-another-realname-tip' => 'Le vrai nom est optionnel.
+Si vous décidez de le fournir, il sera utilisé pour attribuer à l’utilisateur ses travaux.',
 
 # Email sending
 'php-mail-error-unknown' => 'Erreur inconnue dans la fonction mail() de PHP.',
@@ -905,8 +953,7 @@ Veuillez attendre avant d’essayer à nouveau.',
 'newpassword' => 'Nouveau mot de passe :',
 'retypenew' => 'Confirmer le nouveau mot de passe :',
 'resetpass_submit' => 'Changer le mot de passe et se connecter',
-'resetpass_success' => 'Votre mot de passe a bien été modifié !
-Vous allez maintenant être connecté…',
+'changepassword-success' => 'Votre mot de passe a été changé avec succès !',
 'resetpass_forbidden' => 'Les mots de passe ne peuvent pas être changés',
 'resetpass-no-info' => 'Vous devez être connecté pour avoir accès à cette page.',
 'resetpass-submit-loggedin' => 'Changer de mot de passe',
@@ -918,10 +965,11 @@ Vous avez peut-être déjà changé votre mot de passe ou demandé un nouveau mo
 
 # Special:PasswordReset
 'passwordreset' => 'Remise à zéro du mot de passe',
-'passwordreset-text' => 'Remplissez ce formulaire pour réinitialiser votre mot de passe.',
+'passwordreset-text-one' => 'Remplissez ce formulaire pour réinitialiser votre mot de passe.',
+'passwordreset-text-many' => '{{PLURAL:$1|Remplissez un des champs pour réinitialiser votre mot de passe.}}',
 'passwordreset-legend' => 'Remise à zéro du mot de passe',
 'passwordreset-disabled' => 'La réinitialisation des mots de passe a été désactivée sur ce wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Entrez un élément de données ci-dessous}}',
+'passwordreset-emaildisabled' => 'Les fonctionnalités e-mail ont été désactivées sur ce wiki.',
 'passwordreset-username' => "Nom d'utilisateur :",
 'passwordreset-domain' => 'Domaine :',
 'passwordreset-capture' => 'Voir le courriel résultant?',
@@ -942,7 +990,7 @@ $2
 Mot de passe temporaire : $2",
 'passwordreset-emailsent' => 'Un courriel de réinitialisation de mot de passe a été envoyé.',
 'passwordreset-emailsent-capture' => 'Un courriel de réinitialisation de mot de passe a été envoyé, qui est affiché ci-dessous.',
-'passwordreset-emailerror-capture' => "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'utilisateur a échoué : $1",
+'passwordreset-emailerror-capture' => "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'{{GENDER:$2|utilisateur}} a échoué : $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Changer l’adresse de courriel',
@@ -956,6 +1004,19 @@ Mot de passe temporaire : $2",
 'changeemail-submit' => 'Changer l’adresse de courriel',
 'changeemail-cancel' => 'Annuler',
 
+# Special:ResetTokens
+'resettokens' => 'Réinitialiser les jetons',
+'resettokens-text' => "Ici, vous pouvez réinitialiser les jetons qui permettent d’accéder à certaines données privées associées à votre compte.
+
+Vous devriez le faire si vous les avez partagés accidentellement avec quelqu'un ou si votre compte a été compromis.",
+'resettokens-no-tokens' => 'Il n’y a aucun jeton à réinitialiser.',
+'resettokens-legend' => 'Réinitialiser les jetons',
+'resettokens-tokens' => 'Jetons :',
+'resettokens-token-label' => '$1 (valeur actuelle : $2)',
+'resettokens-watchlist-token' => 'Jeton pour le flux (Atom/RSS) web de [[Special:Watchlist|modifications de pages de votre liste de suivi]]',
+'resettokens-done' => 'Jetons réinitialisés.',
+'resettokens-resetbutton' => 'Réinitialiser les jetons sélectionnés',
+
 # Edit page toolbar
 'bold_sample' => 'Texte gras',
 'bold_tip' => 'Texte gras',
@@ -1150,12 +1211,15 @@ Cause inconnue',
 Il semble qu'elle ait été supprimée.",
 'edit-conflict' => 'Conflit de modification.',
 'edit-no-change' => "Votre modification a été ignorée car aucun changement n'a été fait au texte.",
+'postedit-confirmation' => 'Votre modification a été enregistrée.',
 'edit-already-exists' => "La nouvelle page n'a pas pu être créée.
 Elle existe déjà.",
 'defaultmessagetext' => 'Message par défaut',
 'content-failed-to-parse' => 'Échec de l’analyse syntaxique du contenu de $2 pour le modèle $1: $3',
 'invalid-content-data' => 'Données du contenu non valides',
 'content-not-allowed-here' => 'Le contenu « $1 » n’est pas autorisé sur la page [[$2]]',
+'editwarning-warning' => 'Quitter cette page vous fera perdre toutes les modifications que vous avez faites.
+Si vous êtes connecté, vous pouvez désactiver cet avertissement dans la section « Modification » de vos préférences.',
 
 # Content models
 'content-model-wikitext' => 'wikitexte',
@@ -1188,6 +1252,7 @@ Il devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu'il y en a mainten
 'undo-failure' => 'Cette modification ne peut pas être défaite : cela entrerait en conflit avec les modifications intermédiaires.',
 'undo-norev' => "La modification n'a pas pu être défaite parce qu'elle est inexistante ou qu'elle a été supprimée.",
 'undo-summary' => 'Annulation des modifications $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])',
+'undo-summary-username-hidden' => 'Annuler la révision $1 par un utilisateur masqué',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Vous ne pouvez pas créer de compte.',
@@ -1364,6 +1429,7 @@ Assurez-vous que cette opération conservera la continuité de l'historique de l
 'compareselectedversions' => 'Comparer les versions sélectionnées',
 'showhideselectedversions' => 'Afficher/masquer les versions sélectionnées',
 'editundo' => 'annuler',
+'diff-empty' => '(Aucune différence)',
 'diff-multi' => '({{PLURAL:$1|Une révision intermédiaire|$1 révisions intermédiaires}} par {{PLURAL:$2|un utilisateur|$2 utilisateurs}} {{PLURAL:$1|est masquée|sont masquées}})',
 'diff-multi-manyusers' => "({{PLURAL:$1|Une révision intermédiaire|$1 révisions intermédiaires}} par plus {{PLURAL:$2|d'un utilisateur|de $2 utilisateurs}} {{PLURAL:$1|est masquée|sont masquées}})",
 'difference-missing-revision' => "{{PLURAL:$2|Une révision|$2 révisions}} de cette différence ($1) {{PLURAL:$2|n'a pas été trouvée|n'ont pas été trouvées}}.
@@ -1391,7 +1457,6 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
 'searchmenu-legend' => 'Options de recherche',
 'searchmenu-exists' => "'''Il existe une page nommée « [[:$1]] » sur ce wiki'''",
 'searchmenu-new' => "'''Créer la page « [[:$1|$1]] » sur ce wiki !'''",
-'searchhelp-url' => 'Help:Accueil',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Rechercher les pages commençant par ce préfixe]]',
 'searchprofile-articles' => 'Pages de contenu',
 'searchprofile-project' => "Pages d'aide et de projet",
@@ -1433,15 +1498,7 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
 'powersearch-togglenone' => 'Aucune',
 'search-external' => 'Recherche externe',
 'searchdisabled' => 'La recherche sur {{SITENAME}} est désactivée. En attendant la réactivation, vous pouvez effectuer une recherche via Google. Attention, leur indexation du contenu de {{SITENAME}} peut ne pas être à jour.',
-
-# Quickbar
-'qbsettings' => "Barre d'outils",
-'qbsettings-none' => 'Aucune',
-'qbsettings-fixedleft' => 'Gauche',
-'qbsettings-fixedright' => 'Droite',
-'qbsettings-floatingleft' => 'Flottante à gauche',
-'qbsettings-floatingright' => 'Flottante à droite',
-'qbsettings-directionality' => "Fixe, en fonction de la directivité d'écriture de votre langue",
+'search-error' => "Une erreur s'est produite en recherchant : $1",
 
 # Preferences page
 'preferences' => 'Préférences',
@@ -1475,7 +1532,6 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
 'resetprefs' => 'Rétablir les préférences',
 'restoreprefs' => 'Restaurer tous les paramètres par défaut (dans toutes les sections)',
 'prefs-editing' => 'Modification',
-'prefs-edit-boxsize' => 'Taille de la fenêtre de modification.',
 'rows' => 'Rangées :',
 'columns' => 'Colonnes :',
 'searchresultshead' => 'Filtrer avec cette valeur',
@@ -1486,9 +1542,9 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
 'recentchangesdays-max' => '(maximum $1 jour{{PLURAL:$1||s}})',
 'recentchangescount' => 'Nombre de modifications à afficher par défaut :',
 'prefs-help-recentchangescount' => "Ceci inclut les modifications récentes, les pages d'historiques et les journaux.",
-'prefs-help-watchlist-token' => 'Remplissez ce champ avec une valeur secrète et un flux RSS sera généré pour votre liste de suivi.
-Toute personne connaissant ce jeton pourra lire votre liste de suivi, choisissez donc une valeur sécurisée.
-Voici une valeur générée aléatoirement que vous pouvez utiliser : $1',
+'prefs-help-watchlist-token2' => 'Voici la clé secrète du flux Web de votre liste de suivi.
+Toute personne la connaissant pourra lire votre liste de suivi, ne la communiquez donc pas.
+[[Special:ResetTokens|Cliquez ici si vous devez la réinitialiser]].',
 'savedprefs' => 'Les préférences ont été sauvegardées.',
 'timezonelegend' => 'Fuseau horaire :',
 'localtime' => 'Heure locale :',
@@ -1518,7 +1574,6 @@ Voici une valeur générée aléatoirement que vous pouvez utiliser : $1',
 'prefs-common-css-js' => 'JavaScript et CSS partagé pour tous les habillages :',
 'prefs-reset-intro' => 'Vous pouvez utiliser cette page pour restaurer vos préférences aux valeurs par défaut du site. Ceci ne peut pas être défait.',
 'prefs-emailconfirm-label' => 'Confirmation du courriel :',
-'prefs-textboxsize' => 'Taille de la fenêtre de modification',
 'youremail' => 'Courriel :',
 'username' => "{{GENDER:$1|Nom d'utilisateur|Nom d'utilisatrice}} :",
 'uid' => "Numéro d'{{GENDER:$1|utilisateur|utilisatrice}}:",
@@ -1552,6 +1607,8 @@ Cette information sera publique.',
 'prefs-dateformat' => 'Format des dates',
 'prefs-timeoffset' => 'Décalage horaire',
 'prefs-advancedediting' => 'Options générales',
+'prefs-editor' => 'Éditeur',
+'prefs-preview' => 'Aperçu',
 'prefs-advancedrc' => 'Options avancées',
 'prefs-advancedrendering' => 'Options avancées',
 'prefs-advancedsearchoptions' => 'Options avancées',
@@ -1559,7 +1616,9 @@ Cette information sera publique.',
 'prefs-displayrc' => "Options d'affichage",
 'prefs-displaysearchoptions' => "Options d'affichage",
 'prefs-displaywatchlist' => "Options d'affichage",
+'prefs-tokenwatchlist' => 'Jeton',
 'prefs-diffs' => 'Différences',
+'prefs-help-prefershttps' => 'Cette préférence sera effective lors de votre prochaine connexion.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Semble valide',
@@ -1586,6 +1645,8 @@ Cette information sera publique.',
 'userrights-notallowed' => 'Vous n’avez pas la permission d’ajouter ou supprimer des droits d’utilisateur.',
 'userrights-changeable-col' => 'Les groupes que vous pouvez modifier',
 'userrights-unchangeable-col' => 'Les groupes que vous ne pouvez pas modifier',
+'userrights-conflict' => 'Conflit de modification de droits utilisateur ! Veuillez relire et confirmer vos modifications.',
+'userrights-removed-self' => 'Vous avez bien supprimé vos propres droits. Du coup, vous ne pouvez plus accéder à cette page.',
 
 # Groups
 'group' => 'Groupe :',
@@ -1651,11 +1712,19 @@ Cette information sera publique.',
 'right-proxyunbannable' => 'Ne pas être affecté par les blocages automatiques de serveurs mandataires',
 'right-unblockself' => 'Se débloquer soi-même',
 'right-protect' => 'Modifier les niveaux de protection et modifier les pages protégées en cascade',
-'right-editprotected' => 'Modifier les pages protégées (sans protection en cascade)',
+'right-editprotected' => 'Modifier les pages protégées avec « {{int:protect-level-sysop}} »',
+'right-editsemiprotected' => 'Modifier les pages protégées avec « {{int:protect-level-autoconfirmed}} »',
 'right-editinterface' => "Modifier l'interface utilisateur",
 'right-editusercssjs' => "Modifier les fichiers CSS et JavaScript d'autres utilisateurs",
 'right-editusercss' => "Modifier les fichiers CSS d'autres utilisateurs",
 'right-edituserjs' => "Modifier les fichiers JavaScript d'autres utilisateurs",
+'right-editmyusercss' => 'Modifier vos propres fichiers CSS utilisateur',
+'right-editmyuserjs' => 'Modifier vos propres fichiers JavaScript utilisateur',
+'right-viewmywatchlist' => 'Afficher votre propre liste de suivi',
+'right-editmywatchlist' => 'Modifier votre propre liste de suivi. Remarquez que certaines actions ajouteront encore des pages sans ce droit.',
+'right-viewmyprivateinfo' => 'Voir vos données personnelles (exemple adresse, vrai nom)',
+'right-editmyprivateinfo' => 'Modifier vos données personnelles (exemple adresse, vrai nom)',
+'right-editmyoptions' => 'Modifier vos préférences',
 'right-rollback' => "Révoquer rapidement les modifications du dernier contributeur d'une page particulière",
 'right-markbotedits' => 'Marquer des modifications révoquées comme ayant été faites par un robot.',
 'right-noratelimit' => 'Ne pas être affecté par les limites de taux',
@@ -1717,12 +1786,19 @@ Cette information sera publique.',
 'action-userrights-interwiki' => "modifier les droits des utilisateurs sur d'autres wikis",
 'action-siteadmin' => 'verrouiller ou déverrouiller la base de données',
 'action-sendemail' => 'envoyer des courriels',
+'action-editmywatchlist' => 'modifier votre liste de suivi',
+'action-viewmywatchlist' => 'afficher votre liste de suivi',
+'action-viewmyprivateinfo' => 'voir vos informations personnelles',
+'action-editmyprivateinfo' => 'modifier vos informations personnelles',
 
 # Recent changes
 'nchanges' => '$1 modification{{PLURAL:$1||s}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|depuis la dernière visite}}',
+'enhancedrc-history' => 'historique',
 'recentchanges' => 'Modifications récentes',
 'recentchanges-legend' => 'Options des modifications récentes',
 'recentchanges-summary' => 'Piste les changements les plus récents du wiki sur cette page.',
+'recentchanges-noresult' => 'Aucune modification correspondant à ces critères sur la période indiquée.',
 'recentchanges-feed-description' => 'Suivre les dernières modifications de ce wiki dans un flux.',
 'recentchanges-label-newpage' => 'Cette modification a créé une nouvelle page',
 'recentchanges-label-minor' => 'Cette modification est mineure',
@@ -1759,7 +1835,6 @@ Cette information sera publique.',
 'recentchangeslinked-feed' => 'Suivi des pages liées',
 'recentchangeslinked-toolbox' => 'Suivi des pages liées',
 'recentchangeslinked-title' => 'Suivi des pages associées à « $1 »',
-'recentchangeslinked-noresult' => "Il n'y a pas de modification des pages liées pendant la période choisie.",
 'recentchangeslinked-summary' => "Cette page spéciale montre les modifications récentes sur les pages qui sont liées. Les pages de votre liste de suivi sont '''en gras'''.",
 'recentchangeslinked-page' => 'Nom de la page :',
 'recentchangeslinked-to' => "Afficher les modifications des pages qui comportent un lien vers la page donnée plutôt que l'inverse",
@@ -1770,7 +1845,7 @@ Cette information sera publique.',
 'reuploaddesc' => "Annuler et retourner au formulaire d'import",
 'upload-tryagain' => 'Envoyer la description du fichier modifiée',
 'uploadnologin' => 'Non connecté(e)',
-'uploadnologintext' => 'Vous devez être [[Special:UserLogin|connecté]] pour importer des fichiers.',
+'uploadnologintext' => 'Vous devez $1 pour importer des fichiers.',
 'upload_directory_missing' => "Le répertoire d'import de fichier ($1) est introuvable et n'a pas pu être créé par le serveur web.",
 'upload_directory_read_only' => "Le répertoire d'import de fichier ($1) n'est pas accessible en écriture depuis le serveur web.",
 'uploaderror' => "Erreur lors de l'import",
@@ -2000,7 +2075,6 @@ Pour une sécurité optimale, img_auth.php est désactivé.",
 'http-read-error' => 'Erreur de lecture HTTP.',
 'http-timed-out' => 'La requête HTTP a expiré.',
 'http-curl-error' => "Erreur lors de la récupération de l'URL : $1",
-'http-host-unreachable' => "Impossible d'atteindre l'URL.",
 'http-bad-status' => 'Il y a eu un problème lors de la requête HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2028,6 +2102,10 @@ Pour une sécurité optimale, img_auth.php est désactivé.",
 'listfiles_size' => 'Taille',
 'listfiles_description' => 'Description',
 'listfiles_count' => 'Versions',
+'listfiles-show-all' => 'Inclure les anciennes versions des images',
+'listfiles-latestversion' => 'Version actuelle',
+'listfiles-latestversion-yes' => 'Oui',
+'listfiles-latestversion-no' => 'Non',
 
 # File description page
 'file-anchor-link' => 'Fichier',
@@ -2126,6 +2204,13 @@ N'oubliez pas de vérifier s'il n'y a pas d'autres liens vers les modèles avant
 'randompage' => 'Page au hasard',
 'randompage-nopages' => "Il n'y a aucune page dans {{PLURAL:$2|l'espace de noms|les espaces de noms}} : $1.",
 
+# Random page in category
+'randomincategory' => 'Page au hasard dans la catégorie',
+'randomincategory-invalidcategory' => '« $1 » n’est pas un nom de catégorie valide.',
+'randomincategory-nopages' => 'Il n’y a pas de page dans [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Prendre une page au hasard dans la catégorie : $1 $2.',
+'randomincategory-selectcategory-submit' => 'Aller',
+
 # Random redirect
 'randomredirect' => 'Page de redirection au hasard',
 'randomredirect-nopages' => "Il n'y a aucune page de redirection dans l'espace de noms « $1 ».",
@@ -2151,17 +2236,13 @@ N'oubliez pas de vérifier s'il n'y a pas d'autres liens vers les modèles avant
 'statistics-users-active-desc' => 'Utilisateurs ayant fait au moins une action durant {{PLURAL:$1|le dernier jours|les $1 derniers jours}}',
 'statistics-mostpopular' => 'Pages les plus consultées',
 
-'disambiguations' => "Pages ayant des liens vers des pages d'homonymie",
-'disambiguationspage' => 'Template:Homonymie',
-'disambiguations-text' => "Les pages suivantes comportent au moins un lien vers une '''page d'homonymie'''.
-Elles devraient plutôt pointer vers le bon article.<br />
-Une page est considérée comme une page d'homonymie si elle utilise un modèle lié à [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop' => 'Pages avec une propriété de page',
 'pageswithprop-legend' => 'Pages avec une propriété de page',
 'pageswithprop-text' => 'Cette page liste les pages qui utilisent une propriété de page particulière.',
 'pageswithprop-prop' => 'Nom de la propriété:',
 'pageswithprop-submit' => 'Aller',
+'pageswithprop-prophidden-long' => 'valeur de propriété de texte long masquée ($1)',
+'pageswithprop-prophidden-binary' => 'valeur de propriété binaire masquée ($1)',
 
 'doubleredirects' => 'Doubles redirections',
 'doubleredirectstext' => 'Voici une liste des pages qui redirigent vers des pages qui sont elles-mêmes des pages de redirection.
@@ -2219,6 +2300,7 @@ Les entrées <del>barrées</del> ont été résolues.',
 'mostrevisions' => 'Pages les plus modifiées',
 'prefixindex' => 'Toutes les pages commençant par…',
 'prefixindex-namespace' => 'Toutes les pages avec préfixe (espace de noms $1)',
+'prefixindex-strip' => 'Enlever le préfixe dans la liste',
 'shortpages' => 'Pages courtes',
 'longpages' => 'Pages longues',
 'deadendpages' => 'Pages en impasse',
@@ -2234,6 +2316,7 @@ Les entrées <del>barrées</del> ont été résolues.',
 'listusers' => 'Liste des utilisateurs',
 'listusers-editsonly' => 'Ne montrer que les utilisateurs ayant au moins une contribution',
 'listusers-creationsort' => 'Trier par date de création',
+'listusers-desc' => 'Trier en ordre descendant',
 'usereditcount' => '$1 modification{{PLURAL:$1||s}}',
 'usercreated' => '{{GENDER:$3|Créé}} le $1 à $2',
 'newpages' => 'Nouvelles pages',
@@ -2411,10 +2494,9 @@ Les prochaines modifications de cette page et de la page de discussion associée
 'unwatchthispage' => 'Ne plus suivre',
 'notanarticle' => "Ce n'est pas une page de contenu",
 'notvisiblerev' => 'La version a été supprimée',
-'watchnochange' => "Aucun des éléments que vous suivez n'a été modifié durant la période affichée.",
 'watchlist-details' => 'Votre liste de suivi référence $1 page{{PLURAL:$1||s}}, sans compter les pages de discussion.',
-'wlheader-enotif' => '* La notification par courriel est activée.',
-'wlheader-showupdated' => "* Les pages qui ont été modifiées depuis votre dernière visite sont affichées en '''gras'''.",
+'wlheader-enotif' => 'La notification par courriel est activée.',
+'wlheader-showupdated' => "Les pages qui ont été modifiées depuis votre dernière visite sont affichées en '''gras'''.",
 'watchmethod-recent' => 'vérification des modifications récentes pour y trouver des pages suivies',
 'watchmethod-list' => 'vérification des pages suivies pour y trouver des modifications récentes',
 'watchlistcontains' => 'Votre liste de suivi référence $1 page{{PLURAL:$1||s}}.',
@@ -2668,7 +2750,7 @@ $1',
 'contributions' => 'Contributions de l’{{GENDER:$1|utilisateur|utilisatrice}}',
 'contributions-title' => 'Liste des contributions de l’utilisat{{GENDER:$1|eur|rice|eur}} $1',
 'mycontris' => 'Contributions',
-'contribsub2' => 'Pour $1 ($2)',
+'contribsub2' => 'Pour {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "Aucune modification correspondant à ces critères n'a été trouvée.",
 'uctop' => '(actuel)',
 'month' => 'À partir du mois (et précédents) :',
@@ -2825,15 +2907,13 @@ Il est possible qu'un déblocage ait déjà été effectué.",
 Elle fait cependant partie de la plage $2 qui, elle, peut être débloquée.",
 'ip_range_invalid' => 'Plage IP incorrecte.',
 'ip_range_toolarge' => 'Les blocages de plages plus grandes que /$1 ne sont pas autorisées.',
-'blockme' => 'Bloquez-moi',
 'proxyblocker' => 'Bloqueur de mandataires',
-'proxyblocker-disabled' => 'Cette fonction est désactivée.',
 'proxyblockreason' => "Votre adresse IP a été bloquée car il s'agit d'un mandataire ouvert.
 Veuillez contacter votre fournisseur d'accès Internet ou votre support technique et l'informer de ce sérieux problème de sécurité.",
-'proxyblocksuccess' => 'Fait.',
 'sorbsreason' => 'Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.
 Vous ne pouvez pas créer un compte.',
+'xffblockreason' => "Une adresse IP dans l'en-tête X-Forwarded-For, soit la vôtre ou celle d'un serveur proxy que vous utilisez, a été bloquée. La raison du blocage initial est : $1",
 'cant-block-while-blocked' => 'Vous ne pouvez pas bloquer d’autres utilisateurs tant que vous êtes bloqué{{GENDER:||e|(e)}}.',
 'cant-see-hidden-user' => "L’utilisateur que vous tentez de bloquer a déjà été bloqué et masqué. N’ayant pas le droit ''hideuser'', vous ne pouvez pas voir ou modifier le blocage de cet utilisateur.",
 'ipbblocked' => "Vous ne pouvez pas bloquer ou débloquer d'autres utilisateurs, parce que vous êtes vous-même bloqué",
@@ -2989,6 +3069,8 @@ Veuillez visiter la [//www.mediawiki.org/wiki/Localisation Localisation de Media
 'thumbnail-more' => 'Agrandir',
 'filemissing' => 'Fichier manquant',
 'thumbnail_error' => 'Erreur lors de la création de la miniature : $1',
+'thumbnail_error_remote' => "Message d'erreur de $1 :
+$2",
 'djvu_page_error' => 'Page DjVu hors limites',
 'djvu_no_xml' => 'Impossible de récupérer le XML pour le fichier DjVu',
 'thumbnail-temp-create' => 'Impossible de créer le fichier de vignette temporaire',
@@ -3139,20 +3221,15 @@ Vous pouvez toutefois en visualiser la source.',
 'tooltip-undo' => '« Annuler » rétablit la modification précédente et ouvre la fenêtre de modification en mode prévisualisation. Il est possible d’ajouter une raison dans le résumé.',
 'tooltip-preferences-save' => 'Sauvegarder les préférences',
 'tooltip-summary' => 'Entrez un bref résumé',
+'tooltip-iwiki' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/* Le CSS placé ici sera appliqué à tous les habillages. */',
-'standard.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Standard. */',
-'nostalgia.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Nostalgia. */',
 'cologneblue.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Cologne Blue. */',
 'monobook.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Monobook. */',
-'myskin.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage MySkin. */',
-'chick.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Chick. */',
-'simple.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Simple. */',
 'modern.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Modern. */',
 'vector.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Vector. */',
 'print.css' => '/* Le CSS placé ici affectera les impressions */',
-'handheld.css' => '/* Le CSS placé ici affectera les appareils mobiles en fonction de l\'habillage configuré $wgHandheldStyle */',
 'noscript.css' => '/* Le CSS placé ici affectera les utilisateurs ayant désactivé Javascript. */',
 'group-autoconfirmed.css' => '/* Le CSS placé ici affectera les utilisateurs auto-confirmés seulement. */',
 'group-bot.css' => '/* Le CSS placé ici affectera les robots seulement. */',
@@ -3161,13 +3238,8 @@ Vous pouvez toutefois en visualiser la source.',
 
 # Scripts
 'common.js' => '/* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */',
-'standard.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Standard uniquement */',
-'nostalgia.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Nostalgie uniquement */',
 'cologneblue.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Bleu de cologne uniquement */',
 'monobook.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage MonoBook uniquement. */',
-'myskin.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Mon habillage uniquement */',
-'chick.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Poussin uniquement */',
-'simple.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Simple uniquement */',
 'modern.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Moderne uniquement */',
 'vector.js' => '/* Tout code JavaScript placé ici sera chargé pour les utilisateurs de l’habillage Vector */',
 'group-autoconfirmed.js' => '/* Le JavaScript inclus ici n’affectera que les utilisateurs auto-confirmés */',
@@ -3246,13 +3318,8 @@ Vous pouvez toutefois en visualiser la source.',
 'pageinfo-category-files' => 'Nombre de fichiers',
 
 # Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Bleu de Cologne',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Mon Interface',
-'skinname-chick' => 'Poussin',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Moderne',
 'skinname-vector' => 'Vector',
 
@@ -3332,11 +3399,25 @@ Si vous l'exécutez, votre système peut être compromis.",
 'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
 'hours' => '{{PLURAL:$1|$1 heure|$1 heures}}',
 'days' => '{{PLURAL:$1|$1 jour|$1 jours}}',
+'weeks' => '{{PLURAL:$1|$1 semaine|$1 semaines}}',
 'months' => '{{PLURAL:$1|$1 mois}}',
 'years' => '{{PLURAL:$1|$1 an|$1 ans}}',
 'ago' => 'Il y a $1',
 'just-now' => "à l'instant",
 
+# Human-readable timestamps
+'hours-ago' => 'il y a $1 {{PLURAL:$1|heure|heures}}',
+'minutes-ago' => 'il y a $1 {{PLURAL:$1|minute|minutes}}',
+'seconds-ago' => 'il y a $1 {{PLURAL:$1|seconde|secondes}}',
+'monday-at' => 'Lundi à $1',
+'tuesday-at' => 'Mardi à $1',
+'wednesday-at' => 'Mercredi à $1',
+'thursday-at' => 'Jeudi à $1',
+'friday-at' => 'Vendredi à $1',
+'saturday-at' => 'Samedi à $1',
+'sunday-at' => 'Dimanche à $1',
+'yesterday-at' => 'Hier à $1',
+
 # Bad image list
 'bad_image_list' => 'Le format est le suivant :
 
@@ -3364,7 +3445,7 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 * gpsaltitude",
 'metadata-langitem' => "'''$2&nbsp;:''' $1",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Largeur',
 'exif-imagelength' => 'Hauteur',
 'exif-bitspersample' => 'Bits par composante',
@@ -3542,7 +3623,7 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-originalimageheight' => "Hauteur de l'image avant qu'elle ait été recadrée",
 'exif-originalimagewidth' => "Largeur de l'image avant qu'elle ait été recadrée",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Non compressé',
 'exif-compression-2' => 'CCITT Groupe 3 Longueur du codage Huffman modifié de dimension 1',
 'exif-compression-3' => 'CCITT Groupe 3 codage du fax',
@@ -3869,7 +3950,6 @@ Veuillez confirmer que vous désirez réellement recréer cette page.",
 # Separators for various lists, etc.
 'semicolon-separator' => '&nbsp;;&#32;',
 'colon-separator' => '&nbsp;:&#32;',
-'autocomment-prefix' => '&#32;–&#32;',
 'percent' => '$1&#160;%',
 
 # Multipage image navigation
@@ -4017,7 +4097,6 @@ Vous pouvez aussi [[Special:EditWatchlist|utiliser l'éditeur normal]].",
 'version-other' => 'Divers',
 'version-mediahandlers' => 'Manipulateurs de médias',
 'version-hooks' => 'Greffons',
-'version-extension-functions' => "Fonctions d'extension internes",
 'version-parser-extensiontags' => "Balises étendues de l'analyseur syntaxique",
 'version-parser-function-hooks' => "Fonctions étendues de l'analyseur syntaxique",
 'version-hook-name' => 'Nom du greffon',
@@ -4026,6 +4105,7 @@ Vous pouvez aussi [[Special:EditWatchlist|utiliser l'éditeur normal]].",
 'version-license' => 'Licence',
 'version-poweredby-credits' => "Ce wiki fonctionne grâce à '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'autres',
+'version-poweredby-translators' => 'traducteurs de translatewiki.net',
 'version-credits-summary' => 'Nous tenons à remercier les personnes suivantes pour leur contribution à  [[Special:Version|MediaWiki]].',
 'version-license-info' => "MediaWiki est un logiciel libre, vous pouvez le redistribuer ou le modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation ; soit la version 2 de la Licence, ou (à votre choix) toute version ultérieure.
 
@@ -4041,12 +4121,17 @@ Vous devriez avoir reçu [{{SERVER}}{{SCRIPTPATH}}/COPYING une copie de la Licen
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Chemin d’article]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Chemin de script]',
 
-# Special:FilePath
-'filepath' => "Chemin d'accès du fichier",
-'filepath-page' => 'Fichier :',
-'filepath-submit' => 'Aller',
-'filepath-summary' => "Cette page spéciale retourne le chemin d'accès complet d'un fichier.
-Les images sont montrées dans leur pleine résolution, les autres fichiers sont chargés et démarrés directement avec leur programme associé.",
+# Special:Redirect
+'redirect' => 'Redirigé par fichier, utilisateur, ou ID de révision',
+'redirect-legend' => 'Rediriger vers une page ou un fichier',
+'redirect-summary' => "Cette page spéciale redirige vers un fichier (nom donné au fichier), une page (ID attribuée à la révision) ou une page d'utilisateur (identifiant numérique attribué à l'utilisateur).",
+'redirect-submit' => 'Valider',
+'redirect-lookup' => 'Recherche :',
+'redirect-value' => 'Valeur :',
+'redirect-user' => "ID de l'utilisateur",
+'redirect-revision' => 'Révision de la page',
+'redirect-file' => 'Nom du fichier',
+'redirect-not-exists' => 'Valeur non trouvée',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Recherche de doublons',
@@ -4096,12 +4181,16 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'tags' => 'Balises des modifications valides',
 'tag-filter' => 'Filtrer les [[Special:Tags|balises]] :',
 'tag-filter-submit' => 'Filtrer',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Balise|Balises}}]] : $2)',
 'tags-title' => 'Balises',
 'tags-intro' => 'Cette page liste les balises que le logiciel peut utiliser pour marquer une modification et la signification de chacune.',
 'tags-tag' => 'Nom de la balise',
 'tags-display-header' => 'Apparence dans les listes de modifications',
 'tags-description-header' => 'Description complète de la balise',
+'tags-active-header' => 'Actif ?',
 'tags-hitcount-header' => 'Modifications balisées',
+'tags-active-yes' => 'Oui',
+'tags-active-no' => 'Non',
 'tags-edit' => 'modifier',
 'tags-hitcount' => '$1 modification{{PLURAL:$1||s}}',
 
@@ -4122,6 +4211,7 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'dberr-problems' => 'Désolé ! Ce site rencontre des difficultés techniques.',
 'dberr-again' => "Essayez d'attendre quelques minutes et rechargez.",
 'dberr-info' => '(Connexion au serveur de base de données impossible : $1)',
+'dberr-info-hidden' => '(Connexion au serveur de base de données impossible)',
 'dberr-usegoogle' => 'Vous pouvez essayer de chercher avec Google pendant ce temps.',
 'dberr-outofdate' => 'Notez que leurs index de notre contenu peuvent être dépassés.',
 'dberr-cachederror' => 'Ceci est une copie cachée de la page demandée et peut être dépassée.',
@@ -4137,6 +4227,9 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'htmlform-submit' => 'Soumettre',
 'htmlform-reset' => 'Défaire les modifications',
 'htmlform-selectorother-other' => 'Autre',
+'htmlform-no' => 'Non',
+'htmlform-yes' => 'Oui',
+'htmlform-chosen-placeholder' => 'Choisir une option',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 avec recherche en texte intégral supportée',
@@ -4254,4 +4347,19 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
 # Image rotation
 'rotate-comment' => "Image pivotée de $1 {{PLURAL:$1|degré|degrés}} dans le sens des aiguilles d'une montre",
 
+# Limit report
+'limitreport-title' => 'Données d’optimisation de l’analyseur :',
+'limitreport-cputime' => 'Temps CPU d’utilisation',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|seconde|secondes}}',
+'limitreport-walltime' => 'Temps réel d’utilisation',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|seconde|secondes}}',
+'limitreport-ppvisitednodes' => 'Nombre de nœuds de préprocesseur visités',
+'limitreport-ppgeneratednodes' => 'Nombre de nœuds de préprocesseur générés',
+'limitreport-postexpandincludesize' => 'Taille d’inclusion après expansion',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|octet|octets}}',
+'limitreport-templateargumentsize' => 'Taille de l’argument du modèle',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|octet|octets}}',
+'limitreport-expansiondepth' => 'Plus grande profondeur d’expansion',
+'limitreport-expensivefunctioncount' => 'Nombre de fonctions d’analyse coûteuses',
+
 );
diff --git a/languages/messages/MessagesFrc.php b/languages/messages/MessagesFrc.php
index c40e7e79..03e022f2 100644
--- a/languages/messages/MessagesFrc.php
+++ b/languages/messages/MessagesFrc.php
@@ -49,8 +49,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Montrer le montant de guetteurs',
 'tog-oldsig' => '↓ Preview du signature existant:',
 'tog-fancysig' => 'Signature brute (sans liens préparés)',
-'tog-externaleditor' => 'Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur)',
-'tog-externaldiff' => 'User un autre comparateur comme réglage ordinaire',
 'tog-showjumplinks' => 'Mettre les "liens vites" en haut de la page',
 'tog-uselivepreview' => "User la vue d'avance vite (JavaScript) (En assai)",
 'tog-forceeditsummary' => "M'avertir quand j'ai laissé la boëte de commentaires vide",
diff --git a/languages/messages/MessagesFrp.php b/languages/messages/MessagesFrp.php
index 5ec69652..7c5a5cb0 100644
--- a/languages/messages/MessagesFrp.php
+++ b/languages/messages/MessagesFrp.php
@@ -338,9 +338,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Montrar lo nombro d’utilisators que siuvont na pâge',
 'tog-oldsig' => 'Signatura ègzistenta :',
 'tog-fancysig' => 'Trètar la signatura coment de vouiquitèxto (sen lim ôtomatico)',
-'tog-externaleditor' => 'Empleyér per dèfôt un changior de tèxto de defôr (solament por los utilisators avanciês, at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
-'tog-externaldiff' => 'Empleyér per dèfôt un comparator de defôr (solament por los utilisators avanciês, at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
-'tog-showjumplinks' => 'Activar los lims d’accèssibilitât « {{int:jumpto}} »',
 'tog-uselivepreview' => 'Empleyér l’apèrçu rapido (at fôta de JavaScript) (èxpèrimentâl)',
 'tog-forceeditsummary' => 'Mè balyér na semonce quand j’é pas buchiê de rèsumâ de changement',
 'tog-watchlisthideown' => 'Cachiér los mins changements dedens la lista de siuvu',
@@ -354,6 +351,7 @@ $messages = array(
 'tog-showhiddencats' => 'Montrar les catègories cachiêes',
 'tog-noconvertlink' => 'Dèsactivar la convèrsion des titros des lims',
 'tog-norollbackdiff' => 'Pas fâre vêre la dif pendent na rèvocacion',
+'tog-useeditwarning' => 'M’avèrtir quand quito una pâge de changement sen sôvar los changements',
 
 'underline-always' => 'Tojorn',
 'underline-never' => 'Jamés',
@@ -417,6 +415,18 @@ $messages = array(
 'oct' => 'oct',
 'nov' => 'nov',
 'dec' => 'dèc',
+'january-date' => '$1 de janviér',
+'february-date' => '$1 de fevriér',
+'march-date' => '$1 de mârs',
+'april-date' => '$1 d’avril',
+'may-date' => '$1 de mê',
+'june-date' => '$1 de jouen',
+'july-date' => '$1 de julyèt',
+'august-date' => '$1 d’oût',
+'september-date' => '$1 de septembro',
+'october-date' => '$1 d’octobro',
+'november-date' => '$1 de novembro',
+'december-date' => '$1 de dècembro',
 
 # Categories related messages
 'pagecategories' => 'Catègorie{{PLURAL:$1||s}}',
@@ -498,6 +508,7 @@ $messages = array(
 'create-this-page' => 'Fâre cela pâge',
 'delete' => 'Suprimar',
 'deletethispage' => 'Suprimar ceta pâge',
+'undeletethispage' => 'Refâre cela pâge',
 'undelete_short' => 'Refâre {{PLURAL:$1|un changement|$1 changements}}',
 'viewdeleted_short' => 'Vêre {{PLURAL:$1|un changement suprimâ|$1 changements suprimâs}}',
 'protect' => 'Protègiér',
@@ -541,7 +552,7 @@ $1',
 'pool-queuefull' => 'La renche d’ôvra est plêna',
 'pool-errorunknown' => 'Fôta encognua',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Sur {{SITENAME}}',
 'aboutpage' => 'Project:A propôs',
 'copyright' => 'Lo contegnu est disponiblo desot licence $1.',
@@ -551,7 +562,6 @@ $1',
 'disclaimers' => 'Semonces',
 'disclaimerpage' => 'Project:Semonces g·ènèrales',
 'edithelp' => 'Éde',
-'edithelppage' => 'Help:Coment changiér na pâge',
 'helppage' => 'Help:Somèro',
 'mainpage' => 'Reçua',
 'mainpage-description' => 'Reçua',
@@ -629,17 +639,6 @@ Na lista de les pâges spèciâles justes sè trôve dessus [[Special:SpecialPag
 # General errors
 'error' => 'Fôta',
 'databaseerror' => 'Fôta de la bâsa de balyês',
-'dberrortext' => 'Na fôta de sintaxa de la demanda dens la bâsa de balyês est arrevâye.
-Cen pôt endicar na cofierie dedens la programeria.
-La dèrriére demanda trètâye per la bâsa de balyês ére :
-<blockquote><code>$1</code></blockquote>
-dês la fonccion « <code>$2</code> ».
-La bâsa de balyês at retornâ la fôta « <samp>$3 : $4</samp> ».',
-'dberrortextcl' => 'Na fôta de sintaxa de la demanda dens la bâsa de balyês est arrevâye.
-La dèrriére demanda trètâye per la bâsa de balyês ére :
-« $1 »
-dês la fonccion « $2 ».
-La bâsa de balyês at retornâ la fôta « $3 : $4 ».',
 'laggedslavemode' => "'''Atencion :''' cela pâge pôt pas contegnir tôs los dèrriérs changements fêts.",
 'readonly' => 'Bâsa de balyês vèrrolyêe',
 'enterlockreason' => 'Buchiéd na rêson du vèrroly et pués un’èstimacion de la sina durâ',
@@ -696,12 +695,15 @@ Por apondre ou ben changiér des traduccions sur tôs los vouiquis, se vos plét
 'editinginterface' => "'''Atencion :''' vos éte aprés changiér na pâge empleyêe por fâre lo tèxto d’entèrface de la programeria.
 Los changements sè cognetront sur l’aparence de l’entèrface utilisator por los ôtros utilisators de ceti vouiqui.
 Por apondre ou ben changiér des traduccions sur tôs los vouiquis, se vos plét empleyéd [//translatewiki.net/ translatewiki.net], lo projèt de localisacion de MediaWiki.",
-'sqlhidden' => '(Demanda SQL cachiêe)',
 'cascadeprotected' => 'Cela pâge-que est protègiêe, el est entrebetâye dedens {{PLURAL:$1|ceta pâge qu’est étâye protègiêe|cetes pâges que sont étâyes protègiêes}} avouéc lo chouèx « protèccion en cascâda » activâ :
 $2',
 'namespaceprotected' => "Vos éd pas la pèrmission de changiér les pâges de l’èspâço de noms « '''$1''' ».",
 'customcssprotected' => 'Vos éd pas la pèrmission de changiér cela pâge CSS, contint la configuracion a sè d’un ôtr’utilisator.',
 'customjsprotected' => 'Vos éd pas la pèrmission de changiér cela pâge JavaScript, contint la configuracion a sè d’un ôtr’utilisator.',
+'mycustomcssprotected' => 'Vos éd pas la pèrmission de changiér cela pâge CSS.',
+'mycustomjsprotected' => 'Vos éd pas la pèrmission de changiér cela pâge JavaScript.',
+'myprivateinfoprotected' => 'Vos éd pas la pèrmission de changiér voutres enformacions a sè.',
+'mypreferencesprotected' => 'Vos éd pas la pèrmission de changiér voutres prèferences.',
 'ns-specialprotected' => 'Les pâges spèciâles pôvont pas étre changiêes.',
 'titleprotected' => "Cél titro est étâ protègiê a la crèacion per [[User:$1|$1]].
 La rêson balyêe est « ''$2'' ».",
@@ -727,10 +729,19 @@ Notâd qu’y at des pâges que pôvont étre oncor fêtes vêre coment se vos 
 'welcomecreation-msg' => 'Voutron compto est étâ fêt.
 Oubliâd pas de changiér voutres [[Special:Preferences|prèferences dessus {{SITENAME}}]].',
 'yourname' => 'Nom d’utilisator :',
+'userlogin-yourname' => 'Nom d’utilisator',
+'userlogin-yourname-ph' => 'Buchiéd voutron nom d’utilisator',
+'createacct-another-username-ph' => 'Buchiéd lo nom d’utilisator',
 'yourpassword' => 'Contresegno :',
+'userlogin-yourpassword' => 'Contresegno',
+'userlogin-yourpassword-ph' => 'Buchiéd voutron contresegno',
+'createacct-yourpassword-ph' => 'Buchiéd un contresegno',
 'yourpasswordagain' => 'Confirmâd lo contresegno :',
+'createacct-yourpasswordagain' => 'Confirmâd lo contresegno',
+'createacct-yourpasswordagain-ph' => 'Tornâd buchiér lo contresegno',
 'remembermypassword' => 'Sè rapelar de mon contresegno sur ceti navigator (por lo més $1 jorn{{PLURAL:$1||s}})',
-'securelogin-stick-https' => 'Réstar branchiê en HTTPS aprés lo branchement',
+'userlogin-remembermypassword' => 'Gouardar ma sèance activa',
+'userlogin-signwithsecure' => 'Empleyér un branchement sècurisâ',
 'yourdomainname' => 'Voutron domêno :',
 'password-change-forbidden' => 'Vos pouede pas changiér los contresegnos sur ceti vouiqui.',
 'externaldberror' => 'Ou ben na fôta est arrevâye avouéc la bâsa de balyês d’ôtentificacion de defôr ou ben vos éte pas ôtorisâ{{GENDER:||ye|(ye)}} a betar a jorn voutron compto de defôr.',
@@ -742,18 +753,41 @@ Oubliâd pas de changiér voutres [[Special:Preferences|prèferences dessus {{SI
 'logout' => 'Sè dèbranchiér',
 'userlogout' => 'Dèbranchement',
 'notloggedin' => 'Pas branchiê',
+'userlogin-noaccount' => 'Vos éd p’oncor un compto ?',
+'userlogin-joinproject' => 'Rejuegnéd {{SITENAME}}',
 'nologin' => "Vos éd p’oncor un compto ? '''$1.'''",
 'nologinlink' => 'Féte un compto',
 'createaccount' => 'Fâre un compto',
 'gotaccount' => "Vos éd ja un compto ? '''$1.'''",
 'gotaccountlink' => 'Branchiéd-vos',
 'userlogin-resetlink' => 'Vos éd oubliâ voutros dètalys de branchement ?',
+'userlogin-resetpassword-link' => 'Rebetar a zérô lo contresegno',
+'helplogin-url' => 'Help:Branchement',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Éde u branchement]]',
+'createacct-join' => 'Buchiéd voutres enformacions ce-desot.',
+'createacct-another-join' => 'Buchiéd les enformacions sur lo compto novél ce-desot.',
+'createacct-emailrequired' => 'Adrèce èlèctronica',
+'createacct-emailoptional' => 'Adrèce èlèctronica (u chouèx)',
+'createacct-email-ph' => 'Buchiéd voutron adrèce èlèctronica',
+'createacct-another-email-ph' => 'Buchiéd l’adrèce èlèctronica',
 'createaccountmail' => 'Empleyér un contresegno temporèro fêt per hasârd et lo mandar a l’adrèce èlèctronica spècifiâye ce-desot',
+'createacct-realname' => 'Veré nom (u chouèx)',
 'createaccountreason' => 'Rêson :',
+'createacct-reason' => 'Rêson',
+'createacct-reason-ph' => 'Porquè féte-vos un ôtro compto',
+'createacct-captcha' => 'Contrôlo de sècuritât',
+'createacct-imgcaptcha-ph' => 'Buchiéd lo tèxto que vos vêde ce-dessus',
+'createacct-submit' => 'Féte voutron compto',
+'createacct-another-submit' => 'Féte un ôtro compto',
+'createacct-benefit-heading' => '{{SITENAME}} est ècrit per des coment vos.',
+'createacct-benefit-body1' => 'changement{{PLURAL:$1||s}}',
+'createacct-benefit-body2' => 'pâge{{PLURAL:$1||s}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|novél contributor|novéls contributors}}',
 'badretype' => 'Los contresegnos que vos éd buchiês sont pas pariérs.',
 'userexists' => 'Lo nom d’utilisator buchiê est ja empleyê.
 Se vos plét, chouèsésséd-nen un ôtro.',
 'loginerror' => 'Fôta de branchement',
+'createacct-error' => 'Fôta pendent la crèacion du compto',
 'createaccounterror' => 'Y at pas moyen de fâre lo compto : $1',
 'nocookiesnew' => "Lo compto utilisator est étâ fêt, mas vos éte pas branchiê{{GENDER:||e|(e)}}.
 {{SITENAME}} emplèye des tèmouens (''cookies'') por lo branchement mas vos los éd dèsactivâs.
@@ -840,7 +874,7 @@ Por chavonar lo branchement, vos dête buchiér un contresegno novél ique :',
 'newpassword' => 'Contresegno novél :',
 'retypenew' => 'Confirmar lo contresegno novél :',
 'resetpass_submit' => 'Changiér lo contresegno et pués sè branchiér',
-'resetpass_success' => 'Voutron contresegno est étâ changiê avouéc reusséta !
+'changepassword-success' => 'Voutron contresegno est étâ changiê avouéc reusséta !
 Branchement en côrs...',
 'resetpass_forbidden' => 'Los contresegnos pôvont pas étre changiês',
 'resetpass-no-info' => 'Vos dête étre branchiê por arrevar tot drêt a cela pâge.',
@@ -853,10 +887,11 @@ Pôt-étre vos éd ja changiê voutron contresegno avouéc reusséta ou ben dema
 
 # Special:PasswordReset
 'passwordreset' => 'Remês’a zérô du contresegno',
-'passwordreset-text' => 'Rempléd ceti formulèro por rebetar a zérô voutron contresegno.',
+'passwordreset-text-one' => 'Rempléd ceti formulèro por rebetar a zérô voutron contresegno.',
+'passwordreset-text-many' => '{{PLURAL:$1|Rempléd yon des champs por rebetar a zérô voutron contresegno.}}',
 'passwordreset-legend' => 'Rebetar a zérô lo contresegno',
 'passwordreset-disabled' => 'La remês’a zérô des contresegnos est étâye dèsactivâye sur ceti vouiqui.',
-'passwordreset-pretext' => '{{PLURAL:$1||Buchiéd yona de les piéces de balyês ce-desot}}',
+'passwordreset-emaildisabled' => 'Les fonccionalitâts de mèssageria èlèctronica sont étâyes dèsactivâyes sur ceti vouiqui.',
 'passwordreset-username' => 'Nom d’utilisator :',
 'passwordreset-domain' => 'Domêno :',
 'passwordreset-capture' => 'Est-o que vos voléd vêre lo mèssâjo que rèsulte ?',
@@ -887,7 +922,7 @@ vos pouede ignorar ceti mèssâjo et continuar a empleyér voutron viely contres
 Contresegno temporèro : $2',
 'passwordreset-emailsent' => 'Un mèssâjo de remês’a zérô de contresegno est étâ mandâ.',
 'passwordreset-emailsent-capture' => 'Un mèssâjo de remês’a zérô de contresegno est étâ mandâ, qu’est montrâ ce-desot.',
-'passwordreset-emailerror-capture' => 'Un mèssâjo de sovegnence est étâ fêt, qu’est montrâ ce-desot, mas l’èxpèdicion a l’utilisator at pas reussi : $1',
+'passwordreset-emailerror-capture' => 'Un mèssâjo de remês’a zérô de contresegno est étâ fêt, qu’est montrâ ce-desot, mas l’èxpèdicion a l’utilisat{{GENDER:$2|or|rice}} at pas reussi : $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Changiér l’adrèce èlèctronica',
@@ -1109,12 +1144,15 @@ Nion’èxplicacion est étâye balyêe.',
 Semble que seye étâye suprimâye.',
 'edit-conflict' => 'Conflit de changement.',
 'edit-no-change' => 'Voutron changement est étâ ignorâ, nion changement est étâ fêt u tèxto.',
+'postedit-confirmation' => 'Voutron changement est étâ encartâ.',
 'edit-already-exists' => 'Y at pas moyen de fâre na pâge novèla.
 Ègziste ja.',
 'defaultmessagetext' => 'Mèssâjo per dèfôt',
 'content-failed-to-parse' => 'Falyita de l’analisa du contegnu de $2 por lo modèlo $1 : $3',
 'invalid-content-data' => 'Balyês du contegnu pas justes',
 'content-not-allowed-here' => 'Lo contegnu « $1 » est pas ôtorisâ sur la pâge [[$2]]',
+'editwarning-warning' => 'Quitar ceta pâge vos farat pèrdre tôs los changements que vos éd fêts.
+Se vos éte branchiê, vos pouede enlevar ceti avèrtissement dens la sèccion « Fenétra d’èdicion » de voutres prèferences.',
 
 # Content models
 'content-model-wikitext' => 'vouiquitèxto',
@@ -1150,6 +1188,7 @@ Se vos plét, controlâd la comparèson ce-desot por vos assurar qu’o est fran
 'undo-failure' => 'Lo changement at pas possu étre dèfêt a côsa d’un conflit avouéc des changements entèrmèdièros.',
 'undo-norev' => 'Lo changement at pas possu étre dèfêt perce qu’il est pas ègzistent ou ben qu’il est étâ suprimâ.',
 'undo-summary' => 'Dèfêta du changement $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discutar]])',
+'undo-summary-username-hidden' => 'Dèfêta du changement $1 d’un utilisator cachiê',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Y at pas moyen de fâre lo compto',
@@ -1332,6 +1371,7 @@ Notâd que l’usâjo des lims de navigacion rebeterat a zérô cela colona.',
 'compareselectedversions' => 'Comparar les vèrsions chouèsies',
 'showhideselectedversions' => 'Montrar / cachiér les vèrsions chouèsies',
 'editundo' => 'dèfâre',
+'diff-empty' => '(Niona difèrence)',
 'diff-multi' => '({{PLURAL:$1|Na vèrsion entèrmèdièra|$1 vèrsions entèrmèdières}} per {{PLURAL:$2|un utilisator|$2 utilisators}} {{PLURAL:$1|est pas montrâye|sont pas montrâyes}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Na vèrsion entèrmèdièra|$1 vèrsions entèrmèdières}} per més de $2 utilisator{{PLURAL:$2||s}} {{PLURAL:$1|est pas montrâye|sont pas montrâyes}})',
 'difference-missing-revision' => '{{PLURAL:$2|Na vèrsion|$2 vèrsions}} de cela difèrence ($1) {{PLURAL:$2|est pas étâye trovâye|sont pas étâyes trovâyes}}.
@@ -1359,7 +1399,6 @@ Vos pouede trovar més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|pag
 'searchmenu-legend' => 'Chouèx de rechèrche',
 'searchmenu-exists' => "'''Y at na pâge apelâye « [[:$1]] » sur ceti vouiqui.'''",
 'searchmenu-new' => "'''Fâre la pâge « [[:$1|$1]] » sur ceti vouiqui !'''",
-'searchhelp-url' => 'Help:Somèro',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Fâre dèfelar les pâges que començont per ceti prèfixo]]',
 'searchprofile-articles' => 'Pâges de contegnu',
 'searchprofile-project' => 'Pâges d’éde et pâges projèt',
@@ -1403,15 +1442,7 @@ Vos pouede trovar més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|pag
 'searchdisabled' => 'La rechèrche dessus {{SITENAME}} est dèsactivâye.
 Pendent cél temps, vos pouede fâre na rechèrche avouéc Google.
 Notâd que lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
-
-# Quickbar
-'qbsettings' => 'Bârra rapida',
-'qbsettings-none' => 'Pas yona',
-'qbsettings-fixedleft' => 'Fix’a gôche',
-'qbsettings-fixedright' => 'Fix’a drêta',
-'qbsettings-floatingleft' => 'Fllotent’a gôche',
-'qbsettings-floatingright' => 'Fllotent’a drêta',
-'qbsettings-directionality' => 'Fixa, d’aprés la dirèccionalitât d’ècritura de voutra lengoua',
+'search-error' => 'Na fôta est arrevâye en rechèrchient : $1',
 
 # Preferences page
 'preferences' => 'Prèferences',
@@ -1445,7 +1476,6 @@ Notâd que lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
 'resetprefs' => 'Èfaciér los changements pas encartâs',
 'restoreprefs' => 'Rètablir tota la configuracion per dèfôt',
 'prefs-editing' => 'Changement',
-'prefs-edit-boxsize' => 'Talye de la fenétra de changement.',
 'rows' => 'Renches :',
 'columns' => 'Colones :',
 'searchresultshead' => 'Rechèrche',
@@ -1456,9 +1486,6 @@ Notâd que lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
 'recentchangesdays-max' => 'Por lo més $1 jorn{{PLURAL:$1||s}}',
 'recentchangescount' => 'Nombro de changements a montrar per dèfôt :',
 'prefs-help-recentchangescount' => 'Los dèrriérs changements, los historicos de pâges et los jornals avouéc.',
-'prefs-help-watchlist-token' => 'Rempléd ceti champ avouéc na cllâf secrèta et pués un flux RSS serat fêt por voutra lista de siuvu.
-Tôs celos que cognessont cela cllâf porront liére voutra lista de siuvu, chouèsésséd vêr na valor sècurisâye.
-Vê-que na valor fêta per hasârd que vos pouede empleyér : $1',
 'savedprefs' => 'Voutres prèferences sont étâyes encartâyes.',
 'timezonelegend' => 'Fus horèro :',
 'localtime' => 'Hora locâla :',
@@ -1489,7 +1516,6 @@ Vê-que na valor fêta per hasârd que vos pouede empleyér : $1',
 'prefs-reset-intro' => 'Vos pouede empleyér ceta pâge por rètablir voutres prèferences a les valors du seto per dèfôt.
 Cen pôt pas étre dèfêt.',
 'prefs-emailconfirm-label' => 'Confirmacion de l’adrèce èlèctronica :',
-'prefs-textboxsize' => 'Talye de la fenétra de changement',
 'youremail' => 'Adrèce èlèctronica :',
 'username' => 'Nom d’utilisat{{GENDER:$1|or|rice}} :',
 'uid' => 'Identifient d’utilisat{{GENDER:$1|or|rice}} :',
@@ -1730,7 +1756,6 @@ Se vos chouèsésséd de lo balyér, serat empleyê por vos atribuar voutres ôv
 'recentchangeslinked-feed' => 'Changements liyês',
 'recentchangeslinked-toolbox' => 'Changements liyês',
 'recentchangeslinked-title' => 'Changements liyês a « $1 »',
-'recentchangeslinked-noresult' => 'Y at gins de changement sur les pâges liyêes pendent lo temps chouèsi.',
 'recentchangeslinked-summary' => "O est na lista des dèrriérs changements sur les pâges liyêes a na pâge spècifiâye (sur los membros d’una catègorie spècifiâye).
 Les pâges de voutra [[Special:Watchlist|lista de siuvu]] sont en '''grâs'''.",
 'recentchangeslinked-page' => 'Nom de la pâge :',
@@ -1981,7 +2006,6 @@ Por na sècuritât pèrfèta, img_auth.php est dèsactivâ.',
 'http-read-error' => 'Fôta de lèctura HTTP.',
 'http-timed-out' => 'La demanda HTTP at èxpirâ.',
 'http-curl-error' => 'Fôta pendent la rècupèracion de l’URL : $1',
-'http-host-unreachable' => 'Y at pas moyen d’avengiér l’URL.',
 'http-bad-status' => 'Y at avu un problèmo pendent la demanda HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2135,12 +2159,6 @@ Oubliâd pas de controlar s’y at gins d’ôtro lim de vers los modèlos devan
 'statistics-users-active-desc' => 'Utilisators qu’ant fêt por lo muens un’accion pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}',
 'statistics-mostpopular' => 'Pâges les ples vues',
 
-'disambiguations' => 'Pâges qu’ant des lims de vers des pâges d’homonimia',
-'disambiguationspage' => 'Template:Homonimia',
-'disambiguations-text' => "Cetes pâges ant por lo muens un lim de vers na '''pâge d’homonimia'''.
-Devriant pletout pouentar vers na pâge que vat avouéc.<br />
-Na pâge est trètâye coment na pâge d’homonimia s’emplèye un modèlo liyê a [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Pâges avouéc na propriètât de pâge',
 'pageswithprop-legend' => 'Pâges avouéc na propriètât de pâge',
 'pageswithprop-text' => 'Ceta pâge liste les pâges qu’emplèyont na propriètât de pâge particuliére.',
@@ -2397,10 +2415,9 @@ Los changements que vegnont de ceta pâge et de la sina pâge de discussion y se
 'unwatchthispage' => 'Pas més siuvre',
 'notanarticle' => 'O est pas na pâge de contegnu',
 'notvisiblerev' => 'La dèrriére vèrsion per un ôtr’utilisator est étâye suprimâye',
-'watchnochange' => 'Pas yona de les piéces que vos siude est étâye changiêe pendent lo temps fêt vêre.',
 'watchlist-details' => 'Y at $1 pâge{{PLURAL:$1||s}} dedens voutra lista de siuvu, sen comptar les pâges de discussion.',
-'wlheader-enotif' => '* La notificacion per mèssageria èlèctronica est activâye.',
-'wlheader-showupdated' => "* Les pâges que sont étâyes changiêes dês voutra dèrriére visita sont montrâyes en '''grâs'''.",
+'wlheader-enotif' => 'La notificacion per mèssageria èlèctronica est activâye.',
+'wlheader-showupdated' => "Les pâges que sont étâyes changiêes dês voutra dèrriére visita sont montrâyes en '''grâs'''.",
 'watchmethod-recent' => 'contrôlo des novéls changements por y trovar des pâges siuvues',
 'watchmethod-list' => 'contrôlo de les pâges siuvues por y trovar des novéls changements',
 'watchlistcontains' => 'Voutra lista de siuvu contint $1 pâge{{PLURAL:$1||s}}.',
@@ -2815,12 +2832,9 @@ O est possiblo qu’un dèblocâjo èye ja étâ fêt.',
 Portant, el est avouéc la plage $2 que pôt étre dèblocâ.',
 'ip_range_invalid' => 'Plage d’adrèces IP fôssa.',
 'ip_range_toolarge' => 'Los blocâjos de plages d’adrèces IP ples grantes que /$1 sont pas ôtorisâs.',
-'blockme' => 'Blocâd-mè',
 'proxyblocker' => "Bloquior de sèrvors mandatèros (''proxies'')",
-'proxyblocker-disabled' => 'Cela fonccion est dèsactivâ.',
 'proxyblockreason' => "Voutra adrèce IP at étâ blocâ perce qu’o est un sèrvor mandatèro (''proxy'') uvèrt.
 Vos volyéd veriér vers voutron fornissor d’accès u Malyâjo ou ben voutra assistance tècnica et l’enformar de cél problèmo de sècuritât sèriox.",
-'proxyblocksuccess' => 'Chavonâ.',
 'sorbsreason' => "Voutra adrèce IP est listâ coment sèrvor mandatèro (''proxy'') uvèrt dens lo DNSBL utilisâ per {{SITENAME}}.",
 'sorbs_create_account_reason' => "Voutra adrèce IP est listâ coment sèrvor mandatèro (''proxy'') uvèrt dens lo DNSBL utilisâ per {{SITENAME}}.
 Vos pouede pas fâre un compto.",
@@ -3134,17 +3148,11 @@ Pèrmèt de rètablir la vèrsion devant et pués d’apondre una rêson dens la
 
 # Stylesheets
 'common.css' => '/* Lo code CSS betâ ique serat aplicâ a tôs los habelyâjos. */',
-'standard.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Estandârd ». */',
-'nostalgia.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Cafârd ». */',
 'cologneblue.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Blu de Cologne ». */',
 'monobook.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « MonoBook ». */',
-'myskin.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « MonHabelyâjo ». */',
-'chick.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Pugin ». */',
-'simple.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Simplo ». */',
 'modern.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Modèrno ». */',
 'vector.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Vèctor ». */',
 'print.css' => '/* Lo code CSS betâ ique afècterat les emprèssions. */',
-'handheld.css' => '/* Lo code CSS betâ ique afècterat los aparèlys mobilos d’aprés l’habelyâjo configurâ dedens « $wgHandheldStyle ». */',
 'noscript.css' => '/* Lo code CSS betâ ique afècterat los usanciérs qu’ont dèsactivâ lo code JavaScript. */',
 'group-autoconfirmed.css' => '/* Lo code CSS betâ ique afècterat ren que los usanciérs encartâs. */',
 'group-bot.css' => '/* Lo code CSS betâ ique afècterat ren que los bots. */',
@@ -3153,13 +3161,8 @@ Pèrmèt de rètablir la vèrsion devant et pués d’apondre una rêson dens la
 
 # Scripts
 'common.js' => '/* Tot code JavaScript betâ ique serat chargiê per tôs los usanciérs avouéc châque chargement de pâge. */',
-'standard.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Estandârd ». */',
-'nostalgia.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Cafârd ». */',
 'cologneblue.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Blu de Cologne ». */',
 'monobook.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « MonoBook ». */',
-'myskin.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « MonHabelyâjo ». */',
-'chick.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Pugin ». */',
-'simple.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Simplo ». */',
 'modern.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Modèrno ». */',
 'vector.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Vèctor ». */',
 'group-autoconfirmed.js' => '/* Tot code JavaScript betâ ique serat chargiê ren que por los usanciérs encartâs. */',
@@ -3230,13 +3233,8 @@ O est probâblament diu a un lim de vers un seto de defôr qu’aparêt sur la l
 'pageinfo-protect-cascading-yes' => 'Ouè',
 
 # Skin names
-'skinname-standard' => 'Estandârd',
-'skinname-nostalgia' => 'Cafârd',
 'skinname-cologneblue' => 'Blu de Cologne',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MonHabelyâjo',
-'skinname-chick' => 'Pugin',
-'skinname-simple' => 'Simplo',
 'skinname-modern' => 'Modèrno',
 'skinname-vector' => 'Vèctor',
 
@@ -3344,7 +3342,7 @@ Los ôtros champs seront cachiês per dèfôt.
 * gpsaltitude',
 'metadata-langitem' => "'''$2 :''' $1",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Largior',
 'exif-imagelength' => 'Hôtior',
 'exif-bitspersample' => 'Bits per composenta',
@@ -3522,7 +3520,7 @@ Los ôtros champs seront cachiês per dèfôt.
 'exif-originalimageheight' => 'Hôtior de l’émâge devant qu’el èye étâ tornâ cadrar',
 'exif-originalimagewidth' => 'Largior de l’émâge devant qu’el èye étâ tornâ cadrar',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Pas comprèssâ',
 'exif-compression-2' => 'CCITT tropa 3 longior du codâjo Huffman changiê de dimension 1',
 'exif-compression-3' => 'CCITT tropa 3 codâjo du faxe',
@@ -3845,7 +3843,6 @@ Volyéd confirmar que vos voléd franc refâre cela pâge.",
 # Separators for various lists, etc.
 'semicolon-separator' => '&nbsp;;&#32;',
 'colon-separator' => '&nbsp;:&#32;',
-'autocomment-prefix' => '&#32;–&#32;',
 'percent' => '$1&#160;%',
 
 # Multipage image navigation
@@ -3993,7 +3990,6 @@ Vos pouede asse-ben utilisar l’[[Special:EditWatchlist|èditor normal]].',
 'version-other' => 'De totes sôrtes',
 'version-mediahandlers' => 'Maneyors de mèdia',
 'version-hooks' => 'Grèfons',
-'version-extension-functions' => 'Fonccions d’èxtension de dedens',
 'version-parser-extensiontags' => 'Balises d’èxtension du parsor',
 'version-parser-function-hooks' => 'Grèfons de les fonccions du parsor',
 'version-hook-name' => 'Nom du grèfon',
@@ -4015,13 +4011,6 @@ Vos devriâd avêr reçu un [{{SERVER}}{{SCRIPTPATH}}/COPYING ègzemplèro de la
 'version-entrypoints-header-entrypoint' => 'Pouent d’entrâ',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Chemin d’accès du fichiér',
-'filepath-page' => 'Fichiér :',
-'filepath-submit' => 'Alar trovar',
-'filepath-summary' => 'Ceta pâge spèciâla montre lo chemin d’accès complèt d’un fichiér.
-Les émâges sont montrâs dens lor plêna rèsolucion, los ôtros fichiérs sont chargiês et dèmarrâs tot drêt avouéc lor programo associyê.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Rechèrche des fichiérs en doblo',
 'fileduplicatesearch-summary' => 'Rechèrche des fichiérs en doblo d’aprés lor mârca de chaplâjo.',
diff --git a/languages/messages/MessagesFrr.php b/languages/messages/MessagesFrr.php
index df8f5f55..4c740a78 100644
--- a/languages/messages/MessagesFrr.php
+++ b/languages/messages/MessagesFrr.php
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Geitost
  * @author Inkowik
  * @author Maartenvdbent
  * @author Merlissimo
@@ -49,9 +50,6 @@ $messages = array(
 'tog-shownumberswatching' => "Taal faan brükern uunwise, diar det sidj uun't uug haa",
 'tog-oldsig' => 'Aktuel signatuur:',
 'tog-fancysig' => 'Signatuur üs wikitekst uunsä (saner ferwisangen)',
-'tog-externaleditor' => 'Ekstern program för werjuunsferskeel brük (bluas för eksperten, auer diarför iinstelangen üüb dan reegner feranert wurd skel). [//www.mediawiki.org/wiki/Manual:External_editors Muar diartu.]',
-'tog-externaldiff' => 'Ekstern program för werjuunsferskeel brük (bluas för eksperten, auer diarför iinstelangen üüb dan reegner feranert wurd skel). [//www.mediawiki.org/wiki/Manual:External_editors Muar diartu.]',
-'tog-showjumplinks' => '"Waksle tu"-ferwisangen aktiwiare',
 'tog-uselivepreview' => 'Live-föörskau funktjuun brük (eksperimentel)',
 'tog-forceeditsummary' => "Wäärne, wan bi't seekrin nian tuupfaadang uunden woort",
 'tog-watchlisthideown' => "Aanj feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg",
@@ -64,6 +62,8 @@ $messages = array(
 'tog-diffonly' => 'Bi en werjuunsferglik bluas di ferskeel uunwise, ei det hialer sidj',
 'tog-showhiddencats' => 'Ferbürgen kategoriin uunwise',
 'tog-norollbackdiff' => "Ferskeel efter't turagsaaten fersteeg",
+'tog-useeditwarning' => 'Waarskaue mi, wan en sidj slööden woort, huar noch ünseekert feranrangen maaget wurden san',
+'tog-prefershttps' => 'Leewen en seeker ferbinjag brük, wan ik uunmeldet san.',
 
 'underline-always' => 'Leewen',
 'underline-never' => 'Nimer',
@@ -127,6 +127,18 @@ $messages = array(
 'oct' => 'Okt.',
 'nov' => 'Now.',
 'dec' => 'Det.',
+'january-date' => '$1. Janewoore',
+'february-date' => '$1. Febrewoore',
+'march-date' => '$1. Maarts',
+'april-date' => '$1. April',
+'may-date' => '$1. Mei',
+'june-date' => '$1. Jüüne',
+'july-date' => '$1. Jüüle',
+'august-date' => '$1. August',
+'september-date' => '$1. September',
+'october-date' => '$1. Oktuuber',
+'november-date' => '$1. Nofember',
+'december-date' => '$1. Detsember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorii|Kategoriin}}',
@@ -208,6 +220,7 @@ $messages = array(
 'create-this-page' => 'Nei sidj maage',
 'delete' => 'Strik',
 'deletethispage' => 'Detdiar sidj strik',
+'undeletethispage' => 'Detdiar stregen sidj turaghaale',
 'undelete_short' => '{{PLURAL:$1|1 werjuun|$1 werjuunen}} weder iinstel',
 'viewdeleted_short' => '{{PLURAL:$1|Ian stregen werjuun|$1 stregen werjuunen}} uunluke',
 'protect' => 'Seekre',
@@ -251,7 +264,7 @@ $1',
 'pool-queuefull' => 'Pool as auerläästet',
 'pool-errorunknown' => 'Ünbekäänd feeler',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Auer {{SITENAME}}',
 'aboutpage' => 'Project:Auer',
 'copyright' => 'Det stäänt oner det lisens $1.',
@@ -261,7 +274,6 @@ $1',
 'disclaimers' => 'Disclaimers',
 'disclaimerpage' => 'Project:Disclaimers',
 'edithelp' => "Halep bi't bewerkin",
-'edithelppage' => 'Help:Beårbe',
 'helppage' => 'Help:Auersicht',
 'mainpage' => 'Hoodsidj',
 'mainpage-description' => 'Hoodsidj',
@@ -293,7 +305,6 @@ Luke efter bi't [[Special:Version|werjuunssidj]]",
 'newmessagesdifflinkplural' => 'leetst {{PLURAL:$1|feranrang|feranrangen}}',
 'youhavenewmessagesmulti' => 'Dü heest nei bööd üüb $1',
 'editsection' => 'Bewerke',
-'editsection-brackets' => '[$1]',
 'editold' => 'Bewerke',
 'viewsourceold' => 'kweltekst uunwise',
 'editlink' => 'bewerke',
@@ -345,16 +356,12 @@ En list mä aal a spezial-sidjen fanjst dü üüb [[Special:SpecialPages|{{int:s
 # General errors
 'error' => 'Feeler',
 'databaseerror' => 'Dootenbeenkfeeler',
-'dberrortext' => 'Diar as wat skiaf gingen mä det dootenbeenk.
-Ferlicht as det software ei bi a rä.
-Det leetst uunfraag tu\'t dootenbeenk wiar:
-<blockquote><code>$1</code></blockquote>
-faan det funktsjuun "<code>$2</code>".
-Det dootenbeenk swaaret mä "<samp>$3: $4</samp>".',
-'dberrortextcl' => "Bi't uffraagin faan a dootenbeenk as wat skiaf gingen. Det leetst uffraag wiar:
-„$1“
-ütj det funktjuun „$2“.
-At dootebeenk swaaret: „$3: $4“.",
+'databaseerror-text' => "Bi't uunfraag tu a dootenbeenk as wat skiaf gingen.
+Diar küd wat mä a software ferkiard wees.",
+'databaseerror-textcl' => "Diar as en feeler bi't uunfraag tu a dootenbeenk föörkimen.",
+'databaseerror-query' => 'Uunfraag: $1',
+'databaseerror-function' => 'Funktjuun: $1',
+'databaseerror-error' => 'Feeler: $1',
 'laggedslavemode' => "'''Paase üüb:''' Ferlicht wiset detdiar sidj ei a leetst stant.",
 'readonly' => 'Dootenbeenk speret.',
 'enterlockreason' => 'Wees so gud an du en grünj uun, huaram det dootenbeenk speret wurd skal, an hü loong det (amanbi) speret wurd skal.',
@@ -386,6 +393,7 @@ Wan't det ei as, do heest dü ferlicht en feeler uun't software fünjen. Wees so
 Det as ferlicht al faan hoker ööders stregen wurden.',
 'cannotdelete-title' => 'Sidj „$1“ koon ei stregen wurd.',
 'delete-hook-aborted' => 'Det striken as faan en software-feranrang faan MediaWiki ferhanert wurden. Di grünj as ei bekäänd.',
+'no-null-revision' => 'Det nul-werjuun för det sidj "$1" küd ei skrewen wurd.',
 'badtitle' => 'Ferkiard tiitel',
 'badtitletext' => 'Didiar sidjennööm gongt ei. Hi as ferlicht leesag of as en ferkiard ferwisang faan en ööder projekt.',
 'perfcached' => 'Jodiar dooten kem faan a cache an san ferlicht ei muar aktuel. Ei muar üs {{PLURAL:$1|ian resultoot as|$1 resultooten san}} uun a cache.',
@@ -406,13 +414,16 @@ Wees so gud an ferschük det glik noch ans weder.',
 Dü könst [//translatewiki.net/ translatewiki.net] faan MediaWiki brük, am auersaatangen för ale wiki projekten tu maagin.',
 'editinginterface' => "'''Paase üüb:''' Üüb detdiar sidj stäänt tekst, diar faan't MediaWiki software brükt woort. Wan dü diar wat feranerst, feranerst dü di skak faan't Nordfriisk Wikipedia.
 Wan dü wat auersaat wel, maage det mä [//translatewiki.net/ translatewiki.net], det as det MediaWiki lokalisiarangsprojekt.",
-'sqlhidden' => 'SQL-uffraag as ferbürgen',
 'cascadeprotected' => 'Detdiar sidj koon ei bewerket wurd. Hat as uun {{PLURAL:$1|detdiar sidj|jodiar sidjen}}
 iinbünjen, diar auer kaskaadenseekerhaid seekert {{PLURAL:$1|as|san}}:
 $2',
 'namespaceprotected' => "Dü heest ei det brükerrocht, am sidjen uun di nöömrüm '''$1''' tu bewerkin.",
 'customcssprotected' => 'Dü mutst detheer CSS sidj ei bewerke, auer det hoker ööders hiart.',
 'customjsprotected' => 'Dü mutst detheer JavaScript sidj ei bewerke, auer det hoker ööders hiart.',
+'mycustomcssprotected' => 'Dü mutst detdiar CSS-sidj ei bewerke.',
+'mycustomjsprotected' => 'Dü mutst detdiar JavaScript-sidj ei bewerke.',
+'myprivateinfoprotected' => 'Dü heest ei det brükerrocht, am din priwoot dooten tu feranrin.',
+'mypreferencesprotected' => 'Dü heest ei det brükerrocht, am din iinstelangen tu feranrin.',
 'ns-specialprotected' => 'Spezial-sidjen kön ei bewerket wurd.',
 'titleprotected' => 'En sidj mä didiar nööm koon ei uunlaanj wurd.
 Di brüker [[User:$1|$1]] hää det sidj speret, an di grünj as: "\'\'$2\'\'".',
@@ -436,10 +447,19 @@ Enkelt sidjen wise ferlicht noch uun, dat dü uunmeldet beest, so loong dü dan
 'welcomecreation-msg' => 'Din brükerkonto as iinracht wurden.
 Ferjid det ei, an aachte üüb din [[Special:Preferences|{{SITENAME}} iinstelangen]].',
 'yourname' => 'Brükernööm:',
+'userlogin-yourname' => 'Brükernööm',
+'userlogin-yourname-ph' => 'Du dan Brükernööm iin',
+'createacct-another-username-ph' => 'Brükernööm iindu',
 'yourpassword' => 'Paaswurd:',
+'userlogin-yourpassword' => 'Paaswurd',
+'userlogin-yourpassword-ph' => 'Paaswurd iindu',
+'createacct-yourpassword-ph' => 'Paaswurd iindu',
 'yourpasswordagain' => 'Skriiw det paaswurd noch ans weder hen:',
+'createacct-yourpasswordagain' => 'Paaswurd gudkään',
+'createacct-yourpasswordagain-ph' => 'Du det paaswurd noch ans iin',
 'remembermypassword' => 'Üüb diheer reegner üüb düür uunmelde (maksimaal för $1 {{PLURAL:$1|dai|daar}})',
-'securelogin-stick-https' => "Efter't uunmeldin auer HTTPS ferbünjen bliiw",
+'userlogin-remembermypassword' => 'Uunmeldet bliiw',
+'userlogin-signwithsecure' => 'Seeker ferbinjang brük',
 'yourdomainname' => 'Din domain:',
 'password-change-forbidden' => 'Üüb detheer wiki könst dü nian paaswurden feranre.',
 'externaldberror' => 'Deer läit en fäägel bai jü äkstärn autentifisiiring for, unti dü möist din äkstärn brükerkonto äi aktualisiire.',
@@ -451,18 +471,41 @@ Ferjid det ei, an aachte üüb din [[Special:Preferences|{{SITENAME}} iinstelang
 'logout' => 'Ufmelde',
 'userlogout' => 'Ufmelde',
 'notloggedin' => 'Ei uunmeldet',
+'userlogin-noaccount' => 'Dü heest noch nian brükerkonto ?',
+'userlogin-joinproject' => 'Bi {{SITENAME}} mämaage',
 'nologin' => 'Dü heest nian brükerkonto? $1.',
 'nologinlink' => 'Nei brükerkonto iinracht',
 'createaccount' => 'Brükerkonto iinracht',
 'gotaccount' => "Dü hääst ål en brükerkonto? '''$1'''.",
 'gotaccountlink' => 'Uunmelde',
 'userlogin-resetlink' => 'Heest dü din login dooten ferjiden?',
+'userlogin-resetpassword-link' => 'Paaswurd turagsaat',
+'helplogin-url' => 'Help:Uunmelde',
+'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Halep bi't uunmeldin]]",
+'createacct-join' => 'Du oner din dooten iin.',
+'createacct-another-join' => "Skriiw oner a dooten för't nei brükerkonto hen",
+'createacct-emailrequired' => 'E-mail adres',
+'createacct-emailoptional' => 'E-mail adres (optional)',
+'createacct-email-ph' => 'Du din e-mail adres iin',
+'createacct-another-email-ph' => 'E-Mail-adres uundu',
 'createaccountmail' => 'E-mail tu detdiar adres ferschüür mä en tidjwiis tufelag paaswurd',
+'createacct-realname' => 'Rocht nööm (optional)',
 'createaccountreason' => 'Grünj:',
+'createacct-reason' => 'Grünj',
+'createacct-reason-ph' => 'Huaram dü en ööder brükerkonto iinrachtst',
+'createacct-captcha' => 'Seekerhaidspreew',
+'createacct-imgcaptcha-ph' => 'Skriiw di tekst, diar dü boowen schochst',
+'createacct-submit' => 'Din brükerkonto iinracht',
+'createacct-another-submit' => 'En ööder brükerkonto iinracht',
+'createacct-benefit-heading' => '{{SITENAME}} woort faan lidj üs di maaget.',
+'createacct-benefit-body1' => '{{PLURAL:$1|feranrang|feranrangen}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|sidj|sidjen}}',
+'createacct-benefit-body3' => 'aktiif {{PLURAL:$1|skriiwer|skriiwern}}',
 'badretype' => 'Jo tau paaswurden san ei likedenang.',
 'userexists' => 'Dideer brükernoome as ål ferjääwen.
 Wees sü gödj en kiis en ouderen.',
 'loginerror' => "Bi't uunmeldin as wat skiaf gingen",
+'createacct-error' => "Bi't iinrachten faan det brükerkonto as wat skiaf gingen",
 'createaccounterror' => 'Brükerkonto küd ei iinracht wurd: $1',
 'nocookiesnew' => 'Det brükerkonto as iinracht wurden, oober dü beest ei uunmeldet.
 {{SITENAME}} brükt cookies för detdiar aktjuun.
@@ -524,11 +567,12 @@ Dü skulst di nü uunmelde an det paaswurd anre.
 
 Wan det brükerkonto ütj fersen uunlaanj wurden as, säärst dü niks widjer onernem.',
 'usernamehasherror' => 'Uun brükernöömer mut nian rütjen föörkem.',
-'login-throttled' => 'Dü heest tu oofding fersoocht, di önjtumälden.
-Wees sü gödj än täif, bit dü wider ferseechst.',
+'login-throttled' => 'Dü heest tufölsis fersoocht, di uuntumeldin.
+Wees so gud an teew $1, iar dü det noch ans ferschükst.',
 'login-abort-generic' => 'Det uunmeldin hää ei loket - Ufbreegen',
 'loginlanguagelabel' => 'Spriak: $1',
 'suspicious-userlogout' => 'Din ufmeldang as ei föörnimen wurden, auer det uunfraag ferlicht faan en uunstakenen browser of faan en cache-proxy kaam.',
+'createacct-another-realname-tip' => 'Stäänt tu wool. Wan dü dan rochten nööm uundääst, koon hi mä din feranrangen ferbünjen wurd.',
 
 # Email sending
 'php-mail-error-unknown' => 'Ünbekäänd feeler mä det funktsjuun mail() faan PHP.',
@@ -544,8 +588,7 @@ Am det uunmeldin uftuslütjen, skel dü en nei paaswurd iindu.',
 'newpassword' => 'Nei paaswurd:',
 'retypenew' => 'Skriiw det paaswurd noch ans weder hen:',
 'resetpass_submit' => 'Paaswurd saat an uunmelde',
-'resetpass_success' => 'Din paaswurd as feranert wurden!
-Dü woorst nü uunmeldet ...',
+'changepassword-success' => 'Din paaswurd as feranert wurden!',
 'resetpass_forbidden' => 'Det paaswurd koon ei feranert wurd.',
 'resetpass-no-info' => 'Dü skel di uunmelde, am üüb det sidj tutugripen.',
 'resetpass-submit-loggedin' => 'Paaswurd feranre',
@@ -558,10 +601,11 @@ of am en nei paaswurd uunfraaget.',
 
 # Special:PasswordReset
 'passwordreset' => 'Paaswurd turagsaat',
-'passwordreset-text' => 'Fal detheer formulaar ütj, am din paaswurd turag tu saaten.',
+'passwordreset-text-one' => 'Fal detheer formulaar ütj, am din paaswurd turag tu saaten.',
+'passwordreset-text-many' => '{{PLURAL:$1|Fal ian fial ütj, am din paaswurd turag tu saaten.}}',
 'passwordreset-legend' => 'Paaswurd turagsaat',
 'passwordreset-disabled' => 'Dü könst din paaswurd uun detdiar wiki ei turagsaat.',
-'passwordreset-pretext' => '{{PLURAL:$1||Du ian faan jo dooten oner iin}}',
+'passwordreset-emaildisabled' => 'E-mail as üüb detheer Wiki ufknipset wurden.',
 'passwordreset-username' => 'Brükernoome:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Wel dü det e-mail nooracht uunluke?',
@@ -583,7 +627,7 @@ $2
 Tidwis paasuurd: $2',
 'passwordreset-emailsent' => 'Diar as en E-Mail tu di onerwais.',
 'passwordreset-emailsent-capture' => 'Detdiar E-Mail, wat oner uunwiset woort, as tu di onerwais.',
-'passwordreset-emailerror-capture' => 'Detdiar E-Mail, wat oner uunwiset woort, wiar tu di onerwais, oober küd ei ufsjüürd wurd: $1',
+'passwordreset-emailerror-capture' => 'Detdiar E-Mail, wat oner uunwiset woort, wiar tu di onerwais, oober küd ei tu di {{GENDER:$2|brüker}} ufsjüürd wurd: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Feranre det E-Mail-adres',
@@ -597,6 +641,17 @@ Tidwis paasuurd: $2',
 'changeemail-submit' => 'E-mail adres feranre',
 'changeemail-cancel' => 'Ufbreeg',
 
+# Special:ResetTokens
+'resettokens' => 'Tokens turagsaat',
+'resettokens-text' => "Dü könst 'tokens' turagsaat, am priwoot dooten tu bewerkin, diar mä din brükerkonto ferbünjen san.",
+'resettokens-no-tokens' => 'Diar san nian tokens turagtusaaten.',
+'resettokens-legend' => 'Tokens turagsaat',
+'resettokens-tokens' => 'Tokens:',
+'resettokens-token-label' => '$1 (aktuel wäärs: $2)',
+'resettokens-watchlist-token' => "Token för webfeed (Atom/RSS) mä [[Special:Watchlist|feranrangen faan sidjen, diar dü uun't uug behual wel]]",
+'resettokens-done' => 'Tokems san turagsaat wurden.',
+'resettokens-resetbutton' => 'Enkelt tokens turagsaat',
+
 # Edit page toolbar
 'bold_sample' => 'Fäät buksteewen',
 'bold_tip' => 'Fäät buksteewen',
@@ -792,11 +847,14 @@ Uun't strik- an fersküüw-logbuk oner stäänt muar diartu.",
 'edit-gone-missing' => 'Detdiar sidj küd ei aktualisiaret wurd. Ferlicht as det stregen wurden.',
 'edit-conflict' => "Konflikt bi't bewerkin (BK).",
 'edit-no-change' => 'Din feranrang woort ei seekert, auer dü di tekst ei feranert heest.',
+'postedit-confirmation' => 'Din feranrang as seekert wurden.',
 'edit-already-exists' => 'Det nei sidj küd ei iinracht wurd. Son sidj as al diar.',
 'defaultmessagetext' => 'Standard tekst',
 'content-failed-to-parse' => "Parsing faan $2 för't model $1 ging skiaf: $3",
 'invalid-content-data' => 'Diar stäänt wat uun, wat diar ei hen hiart',
 'content-not-allowed-here' => '„$1“ mut ei skrewen wurd üüb sidj [[$2]]',
+'editwarning-warning' => 'Wan dü detheer sidj slotst, kön feranrangen ferleesen gung.
+Üs uunmeldet brüker könst dü detheer wäärnang bi din iinstelangen oner „Bewerke“ wechknipse.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -830,6 +888,7 @@ Luke oner, of dü det uk würelk du wel, an do seekre din feranrangen.',
 'undo-failure' => 'Det feranrang küd ei stregen wurd, auer di kirew uuntesken feranert wurden as.',
 'undo-norev' => 'Det feranrang küd ei turagsaat wurd, auer diar niks as of auer det sidj stregen wurden as.',
 'undo-summary' => 'Feranrang $1 faan [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusjuun]]) turagsaat.',
+'undo-summary-username-hidden' => 'Feranrang $1 faan en ferbürgenen brüker turagsaat',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Det brükerkonto koon ei iinracht wurd',
@@ -1003,6 +1062,7 @@ A nawigatjuun links saat ales weder turag üüb di ual stant.',
 'compareselectedversions' => 'Werjuunen ferglik',
 'showhideselectedversions' => 'Werjuunen wise of fersteeg',
 'editundo' => 'turagsaat',
+'diff-empty' => '(nään ferskeel)',
 'diff-multi' => '({{PLURAL:$1|Ian werjuun diartesken|$1 werjuunen diartesken}} faan {{PLURAL:$2|ään brüker|$2 brükern}} {{PLURAL:$1|woort|wurd}} ei uunwiset)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ian werjuun diartesken|$1 werjuunen diartesken}} faan muar üs $2 {{PLURAL:$2|brüker|brükern}} wurd ei uunwiset)',
 'difference-missing-revision' => "{{PLURAL:$2|Ian werjuun|$2 werjuunen}} faan di ferskeel ($1) {{PLURAL:$2|as|san}} ei fünjen wurden.
@@ -1030,7 +1090,6 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'searchmenu-legend' => 'Säkmöölikhäide',
 'searchmenu-exists' => "'''Deer as en sid nååmd \"[[:\$1]]\" önj jüdeer Wiki'''",
 'searchmenu-new' => "'''Maage det sidj „[[:$1]]“ uun detheer wiki.'''",
-'searchhelp-url' => 'Help:Auersicht',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Wise aal jo sidjen, diar so began]]',
 'searchprofile-articles' => 'Artiikler',
 'searchprofile-project' => 'Halep- an Projektsidjen',
@@ -1071,15 +1130,7 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'powersearch-togglenone' => 'Nianen',
 'search-external' => 'Schük ekstern',
 'searchdisabled' => 'Det schüken üüb {{SITENAME}} as ei aktiif. Dü könst uuntesken mä Google schük. Seenk diaram, dat Google sin steegwurden miast ei üüb a leetst stant san.',
-
-# Quickbar
-'qbsettings' => 'Sidjenliist',
-'qbsettings-none' => 'Niinj',
-'qbsettings-fixedleft' => 'Lachts, fääst',
-'qbsettings-fixedright' => 'Rochts, fääst',
-'qbsettings-floatingleft' => 'Lachts, auergung',
-'qbsettings-floatingright' => 'Rochts, auergung',
-'qbsettings-directionality' => 'Fääst, hinget faan di skriiwwai faan det spriak uf',
+'search-error' => "Diar as wat skiaf gingen bi't schüken: $1",
 
 # Preferences page
 'preferences' => 'Iinstelangen',
@@ -1113,7 +1164,6 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'resetprefs' => 'Wech diarmä',
 'restoreprefs' => 'Normool iinstelangen weder haale (uun arke kirew)',
 'prefs-editing' => 'Bewerke',
-'prefs-edit-boxsize' => "Grate faan't wönang tu't bewerkin:",
 'rows' => 'Räen:',
 'columns' => 'Spleder:',
 'searchresultshead' => 'Schük',
@@ -1124,7 +1174,9 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'recentchangesdays-max' => 'Ei muar üs {{PLURAL:$1|ään dai|$1 daar}}',
 'recentchangescount' => 'Soföl feranrangen skel uunwiset wurd:',
 'prefs-help-recentchangescount' => 'Det san a leetst feranrangen, werjuunen an logbuken.',
-'prefs-help-watchlist-token' => "Wan dü detdiar fial mä en hiamelken code ütjfalst, woort en RSS-feed iinracht. Arken mä didiar code koon do sä, wat dü uun't uug behual wel. Diaram skul hi ei so ianfach wees, nem dach didiar: $1",
+'prefs-help-watchlist-token2' => "Detdiar as di hiamelk kai för't webfeed mä sidjen, diar dü uun't uug behual wel.
+Mä didiar kai koon arken jodiar sidjen beluke, diaram skulst dü ham ei widjerdu.
+[[Special:ResetTokens|Trak diar]], wan dü ham turagsaat wel.",
 'savedprefs' => 'Din iinstelangen san seekert wurden.',
 'timezonelegend' => 'Tidjsoon:',
 'localtime' => 'Lokaal tidj:',
@@ -1155,7 +1207,6 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'prefs-reset-intro' => 'Üüb detdiar sidj könst dü weder a normool iinstelangen iinracht.
 Do san jo ual iinstelangen wech.',
 'prefs-emailconfirm-label' => 'E-Mail gudkäänd:',
-'prefs-textboxsize' => "Grate faan't wönang tu bewerkin",
 'youremail' => 'E-mail:',
 'username' => '{{GENDER:$1|Brükernööm}}:',
 'uid' => '{{GENDER:$1|Brükerkäänang}}:',
@@ -1187,6 +1238,8 @@ Arken koon det lees.',
 'prefs-dateformat' => "Formaat faan't dootem",
 'prefs-timeoffset' => 'Ferskeel faan a klooktidj',
 'prefs-advancedediting' => 'Algemian',
+'prefs-editor' => 'Skriiwer',
+'prefs-preview' => 'Föörskau',
 'prefs-advancedrc' => 'Ütjwidjet mögelkhaiden',
 'prefs-advancedrendering' => 'Ütjwidjet mögelkhaiden',
 'prefs-advancedsearchoptions' => 'Ütjwidjet mögelkhaiden',
@@ -1194,7 +1247,9 @@ Arken koon det lees.',
 'prefs-displayrc' => "Mögelkhaiden för't uunwisin",
 'prefs-displaysearchoptions' => "Mögelkhaiden för't uunwisin",
 'prefs-displaywatchlist' => "Mögelkhaiden för't uunwisin",
+'prefs-tokenwatchlist' => 'Token',
 'prefs-diffs' => 'Ferskeel',
+'prefs-help-prefershttps' => 'Detdiar iinstelang täält, wan dü di naist tooch uunmeldest.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Detdiar E-Mail-adres schocht gud ütj.',
@@ -1221,6 +1276,8 @@ Arken koon det lees.',
 'userrights-notallowed' => 'Dü heest ei det rocht, am brükerrochten tu feranrin.',
 'userrights-changeable-col' => 'Lasmootskapen, diar dü feranre könst',
 'userrights-unchangeable-col' => 'Lasmootskapen, diar dü ei feranre könst',
+'userrights-conflict' => "Konflikt bi't feranrin faan brükerrochten! Du din feranrangen noch ans iin.",
+'userrights-removed-self' => 'Dü heest din aanj brükerrochtem stregen. Dü könst nü ei muar üüb det sidj tugrip.',
 
 # Groups
 'group' => 'Skööl:',
@@ -1286,10 +1343,19 @@ Arken koon det lees.',
 'right-proxyunbannable' => 'Ütjnoom faan automaatisk proxy-speren',
 'right-unblockself' => 'Sper apheew för ään salew',
 'right-protect' => 'Sidjenseekerhaid feranre an kaskaaden-seekert sidjen bewerke',
+'right-editprotected' => 'Sidjen bewerke, diar mä „{{int:protect-level-sysop}}“ seekert san.',
+'right-editsemiprotected' => 'Sidjen bewerke, diar mä „{{int:protect-level-autoconfirmed}}“ seekert san.',
 'right-editinterface' => 'Brüker-skak bewerke',
 'right-editusercssjs' => 'CSS- an JavaScript-datein faan ööder brükern bewerke',
 'right-editusercss' => 'CSS-datein faan ööder brükern bewerke',
 'right-edituserjs' => 'JavaScript-datein faan ööder brükern bewerke',
+'right-editmyusercss' => 'Aanj CSS-datein bewerke',
+'right-editmyuserjs' => 'Aanj JavaScript-datein bewerke',
+'right-viewmywatchlist' => "Sidjen uunluke, diar ik uun't uug behual wal",
+'right-editmywatchlist' => "Sidjen bewerke, diar dü uun't uug behual wel. Enkelt aktjuunen kön diar wat saner din dun feranre.",
+'right-viewmyprivateinfo' => 'Aanj priwoot dooten uunluke (t.b. e-mail-adres, rocht nööm)',
+'right-editmyprivateinfo' => 'Aanj priwoot dooten bewerke (t.b. e-mail-adres, rocht nööm)',
+'right-editmyoptions' => 'Aanj iinstelangen bewerke',
 'right-rollback' => 'Feranrangen faan di leetst brüker gau turagsaat',
 'right-markbotedits' => 'Gau turagsaatangen üs bot-iindracher kääntiakne',
 'right-noratelimit' => 'Ei troch limits beskäären',
@@ -1351,12 +1417,19 @@ Arken koon det lees.',
 'action-userrights-interwiki' => 'brükerrochten uun ööder Wikis tu bewerkin',
 'action-siteadmin' => 'det dootenbeenk tu sperin an eebentumaagin',
 'action-sendemail' => 'e-mails tu schüüren',
+'action-editmywatchlist' => "sidjen, diar dü uun't uug behual wel, tu bewerkin",
+'action-viewmywatchlist' => "sidjen uuntulukin, diar dü uun't uug behual wel",
+'action-viewmyprivateinfo' => 'din priwoot dooten uuntulukin',
+'action-editmyprivateinfo' => 'din priwoot dooten tu bewerkin',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|feranrang|feranrangen}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sant dan leetst beschük}}',
+'enhancedrc-history' => 'Ferluup',
 'recentchanges' => 'Leetst feranrangen',
 'recentchanges-legend' => "Iinstelangen för't uunwisin",
 'recentchanges-summary' => "Üüb detdiar sidj könst dü a leetst feranrangen faan't Nordfriisk Wikipedia ferfulge.",
+'recentchanges-noresult' => 'Uun di uunjiwen tidjrüm san sok feranrangen ei föörnimen wurden.',
 'recentchanges-feed-description' => "Mä didiar feed könst dü a leetst feranrangen faan't Nordfriisk Wikipedia ferfulge.",
 'recentchanges-label-newpage' => 'Nei sidj uunlaanj',
 'recentchanges-label-minor' => 'Letj feranrang',
@@ -1393,7 +1466,6 @@ Arken koon det lees.',
 'recentchangeslinked-feed' => 'Feranrangen bi ferlinket sidjen',
 'recentchangeslinked-toolbox' => 'Feranrangen bi ferlinket sidjen',
 'recentchangeslinked-title' => 'Feranrangen bi sidjen, huar faan "$1" üüb ferwiset woort',
-'recentchangeslinked-noresult' => 'Uun detdiar tidj san jo ferlinket sidjen ei feranert wurden.',
 'recentchangeslinked-summary' => "Detdiar spezial-sidj wiset a leetst feranrangen faan ferwiset sidjen (of faan sidjen uun en was kategorii). Sidjen, diar dü [[Special:Watchlist|uun't uug behual]] wel, san '''fäät''' skrewen.",
 'recentchangeslinked-page' => 'Sidjennööm:',
 'recentchangeslinked-to' => 'Wise feranrangen üüb sidjen, diar heerhen ferwise.',
@@ -1404,7 +1476,7 @@ Arken koon det lees.',
 'reuploaddesc' => "Ufbreeg an turag tu't sidj för't huuchschüüren",
 'upload-tryagain' => 'Feranert dateibeskriiwang ufsjüür',
 'uploadnologin' => 'Ei uunmeldet',
-'uploadnologintext' => 'Dü möist [[Special:UserLogin|önjmälded weese]], am dat dü dootäie huuchsiinje koost.',
+'uploadnologintext' => 'Dü skel di $1, amdat dü datein huuchschüür könst.',
 'upload_directory_missing' => 'Det archiif-fertiaknis ($1) as ei diar, an küd faan di webserver uk ei iinracht wurd.',
 'upload_directory_read_only' => 'Uun det archiif-fertiaknis ($1) küd faan di webserver ei skrewen wurd.',
 'uploaderror' => "Bi't huuchschüüren as wat skiaf gingen",
@@ -1611,7 +1683,6 @@ För a seekerhaid as img_auth.php ei aktiwiaret.',
 'http-read-error' => "HTTP-feeler bi't leesen.",
 'http-timed-out' => 'Det HTTP-uffraag hää tu loong düüret (time-out).',
 'http-curl-error' => "Feeler bi't ufrepen faan det URL: $1",
-'http-host-unreachable' => 'URL küd ei fünjen wurd',
 'http-bad-status' => "Feeler bi't HTTP-uffraag: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1639,6 +1710,9 @@ För a seekerhaid as img_auth.php ei aktiwiaret.',
 'listfiles_size' => 'Grate',
 'listfiles_description' => 'Beskriiwang',
 'listfiles_count' => 'Werjuunen',
+'listfiles-show-all' => 'Ual bilwerjuunen mä iinslütj',
+'listfiles-latestversion' => 'Aktuel werjuun',
+'listfiles-latestversion-no' => 'Naan',
 
 # File description page
 'file-anchor-link' => 'Datei',
@@ -1735,6 +1809,13 @@ Iar dü ian strikst, stel seeker, dat diar nian ferwisangen üüb detdetdiar fö
 'randompage' => 'Tufelag sidj',
 'randompage-nopages' => 'Diar san nian sidjen uun {{PLURAL:$2|nöömrüm|nöömrümer}}: $1.',
 
+# Random page in category
+'randomincategory' => "Tufelag sidj uun't kategorii",
+'randomincategory-invalidcategory' => '"$1" as üs kategoriinööm ei tuläät.',
+'randomincategory-nopages' => 'Diar san nian sidjen uun [[:Category:$1]].',
+'randomincategory-selectcategory' => "Tufelag sidj uun't kategorii: $1 $2.",
+'randomincategory-selectcategory-submit' => 'Widjer',
+
 # Random redirect
 'randomredirect' => 'Tufelag widjerfeerang',
 'randomredirect-nopages' => 'Uun di nöömrüm „$1“ san nian widjerfeerangen.',
@@ -1760,17 +1841,13 @@ Iar dü ian strikst, stel seeker, dat diar nian ferwisangen üüb detdetdiar fö
 'statistics-users-active-desc' => 'Brükern, diar wat bewerket haa uun a leetst {{PLURAL:$1|dai|$1 daar}}',
 'statistics-mostpopular' => 'Sidjen mä a miast kliks',
 
-'disambiguations' => 'Sidjen, diar üüb muardüüdag artiikler ferwise',
-'disambiguationspage' => 'Template:Muardüüdag artiikel',
-'disambiguations-text' => "Jodiar sidjen haa tumanst ian ferwisang üüb en '''muardüüdagen artiikel'''. Ferlicht skul jo beeder direkt üüb det mend sidj ferwise.
-
-En sidj täält üs '''muardüüdag artiikel''', wan hat tumanst ian föörlaag faan det [[MediaWiki:Disambiguationspage|Disambiguationspage]] häält.",
-
 'pageswithprop' => 'Sidjen mä en sidjeneegenoort',
 'pageswithprop-legend' => 'Sidjen mä en sidjeneegenoort',
 'pageswithprop-text' => 'Detheer Spezial-sidj feert sidjen mä was sidjeneegenoorten ap.',
 'pageswithprop-prop' => 'Sidjeneegenoort:',
 'pageswithprop-submit' => 'Widjer',
+'pageswithprop-prophidden-long' => 'Eegenskapswäärs för lung tekster ferbürgen ($1)',
+'pageswithprop-prophidden-binary' => 'Binär eegenskapswäärs ferbürgen ($1)',
 
 'doubleredirects' => 'Dobelt widjerfeerangen',
 'doubleredirectstext' => "Detheer list feert widjerfeerangen ap, diar üüb widjerfeerangen widjer feer.
@@ -1827,6 +1904,7 @@ Uun arke rä stun ferwisangen tu't iarst an ööder widjerfeerang an uk tu det s
 'mostrevisions' => 'Sidjen mä miast feranrangen',
 'prefixindex' => 'Aal a sidjen (mä prefix)',
 'prefixindex-namespace' => 'Aal a sidjen mä prefix (nöömrüm $1)',
+'prefixindex-strip' => 'Prefix uun det list ei uunwise',
 'shortpages' => 'Kurt sidjen',
 'longpages' => 'Lung sidjen',
 'deadendpages' => 'Sidjen saner ferwisangen',
@@ -2015,10 +2093,9 @@ Feranrangen faan detdiar sidj wurd üüb detdiar list fäästhäälen.",
 'unwatchthispage' => "Ei muar uun't uug behual",
 'notanarticle' => 'Nään artiikel',
 'notvisiblerev' => 'Det werjuun faan en öödern brüker as stregen wurden.',
-'watchnochange' => "A sidjen, diar dü uun't uug heest, san uun di uunwiset tidjrüm ei bewerket wurden.",
 'watchlist-details' => "Dü heest {{PLURAL:$1|1 sidj|$1 sidjen}} uun't uug.",
 'wlheader-enotif' => 'Di e-mail siinst as aktiif.',
-'wlheader-showupdated' => "* Nei feranert sidjen wurd '''fäät''' uunwiset.",
+'wlheader-showupdated' => "Nei feranert sidjen wurd '''fäät''' uunwiset.",
 'watchmethod-recent' => "Leetst feranrangen faan sidjen, diar dü uun't uug heest",
 'watchmethod-list' => "Sidjen, diar dü uun't uug heest, am a leetst feranrangen beluke",
 'watchlistcontains' => "Dü häälst $1 {{PLURAL:$1|sidj|sidjen}} uun't uug.",
@@ -2255,7 +2332,7 @@ $1",
 'contributions' => '{{GENDER:$1|Brüker}} bidracher',
 'contributions-title' => 'Brükerbidracher för "$1"',
 'mycontris' => 'Bidracher',
-'contribsub2' => 'For $1 ($2)',
+'contribsub2' => 'För $1 ($2)',
 'nocontribs' => 'Diar wiar nian paasin brükerbidracher',
 'uctop' => '(aktuel)',
 'month' => 'faan muun (of iarer):',
@@ -2410,14 +2487,12 @@ Luke bi't [[Special:BlockList|sperlist]] för aal jo aktuel speren.",
 'ipb_blocked_as_range' => 'Feeler: Det IP-adres $1 as auer det widjloftag sper $2 speret. Det sper faan $1 alian koon ei apheewen wurd.',
 'ip_range_invalid' => 'Ferkiard IP-adresrüm',
 'ip_range_toolarge' => 'Adresrümen mut ei grater üs /$1 wees.',
-'blockme' => 'Spere mi',
 'proxyblocker' => 'Proxy blocker',
-'proxyblocker-disabled' => 'Detdiar funktjuun as ei aktiif',
 'proxyblockreason' => 'Din IP-adres as speret wurden, auer det tu en eebenen proxy hiart.
 Fertel det dan ISP of dan süsteemsiinst. Eeben proxys stel det seekerhaid uun fraag.',
-'proxyblocksuccess' => 'Klaar.',
 'sorbsreason' => 'Din IP-adres as uun det DNSBL faan {{SITENAME}} üs eeben proxy apfeerd.',
 'sorbs_create_account_reason' => 'Din IP-adres as uun det DNSBL faan {{SITENAME}} üs eeben proxy apfeerd. Dü könst nian brükerkonto maage.',
+'xffblockreason' => 'En IP-adres uun di X-Forwarded-For-Header as speret wurden, det as din aanj of det faan dan proxy server. Di spergrünj as: $1',
 'cant-block-while-blocked' => 'Dü könst nian ööder brükern spere, so loong dü salew speret beest.',
 'cant-see-hidden-user' => 'Di brüker, diar dü spere wel, as al speret an ferbürgen. Dü heest oober ei det "hideuser"-rocht an könst det sper ei bewerke.',
 'ipbblocked' => 'Dü könst ööder brükern ei spere an uk nian speren apheew, auer dü salew speret beest.',
@@ -2573,6 +2648,8 @@ Wees so gud an beschük a sidjen [//www.mediawiki.org/wiki/Localisation MediaWik
 'thumbnail-more' => 'Fergratre',
 'filemissing' => 'Datei ei diar',
 'thumbnail_error' => "Bi't skriiwen faan det föörskaubil as wat skiaf gingen: $1",
+'thumbnail_error_remote' => 'Feeler faan $1:
+$2',
 'djvu_page_error' => 'DjVu-sidj as bütjen faan a sidjenrüm',
 'djvu_no_xml' => 'XML-dooten för det DjVu-datei kön ei ufrepen wurd',
 'thumbnail-temp-create' => 'Det datei för det tidjwiis sümnaielbil küd ei skrewen wurd',
@@ -2862,11 +2939,25 @@ $1",
 'minutes' => '{{PLURAL:$1|$1 minüüt|$1 minüüten}}',
 'hours' => '{{PLURAL:$1|$1 stünj|$1 stünjen}}',
 'days' => '{{PLURAL:$1|$1 dai|$1 daar}}',
+'weeks' => '{{PLURAL:$1|$1 weg|$1 wegen}}',
 'months' => '{{PLURAL:$1|$1 muun|$1 muuner}}',
 'years' => '{{PLURAL:$1|$1 juar|$1 juaren}}',
 'ago' => 'föör $1',
 'just-now' => 'jüst nü',
 
+# Human-readable timestamps
+'hours-ago' => 'föör {{PLURAL:$1|ian stünj|$1 stünjen}}',
+'minutes-ago' => 'föör {{PLURAL:$1|ian minüüt|$1 minüüten}}',
+'seconds-ago' => 'föör {{PLURAL:$1|ian sekund|$1 sekunden}}',
+'monday-at' => 'Mundai am a klook $1',
+'tuesday-at' => 'Teisdai am a klook $1',
+'wednesday-at' => 'Wäärnsdai am a klook $1',
+'thursday-at' => 'Süürsdai am a klook $1',
+'friday-at' => 'Freidai am a klook $1',
+'saturday-at' => 'Saninj am a klook $1',
+'sunday-at' => 'Söndai am a klook $1',
+'yesterday-at' => 'Jister am a klook $1',
+
 # Bad image list
 'bad_image_list' => 'Formaat:
 
@@ -2894,7 +2985,7 @@ Ferwisangen uun det salew rä wurd üs ütjnoomen uunsen, huar det datei dach uu
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breetje',
 'exif-imagelength' => 'Hööchde',
 'exif-bitspersample' => 'Bits per klöör',
@@ -3072,7 +3163,7 @@ Ferwisangen uun det salew rä wurd üs ütjnoomen uunsen, huar det datei dach uu
 'exif-originalimageheight' => "Hööchde faan't bil föör't beklapen",
 'exif-originalimagewidth' => "Breetje faan't bil föör't beklapen",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ünkomprimiaret',
 'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
 'exif-compression-3' => 'CCITT Group 3 fax encoding',
@@ -3455,7 +3546,6 @@ Dü könst uk det [[Special:EditWatchlist|normool sidj]] tu bewerkin nem.",
 'version-other' => 'Ööders wat',
 'version-mediahandlers' => 'Ütjwidjet medien-funktjuunen',
 'version-hooks' => 'Hooks',
-'version-extension-functions' => 'Ütjwidjet funktjuunen',
 'version-parser-extensiontags' => 'Parser extension tags',
 'version-parser-function-hooks' => 'Parser function hooks',
 'version-hook-name' => 'Hook nööm',
@@ -3464,6 +3554,7 @@ Dü könst uk det [[Special:EditWatchlist|normool sidj]] tu bewerkin nem.",
 'version-license' => 'Lisens',
 'version-poweredby-credits' => "Detheer wääbsteed werket mä '''[//www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'öödern',
+'version-poweredby-translators' => 'Auersaatern faan translatewiki.net',
 'version-credits-summary' => 'Wi besoonke üs bi jodiar persuunen för hör bidracher tu [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki 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 2 of the License, or (at your option) any later version.
 
@@ -3477,11 +3568,17 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
 'version-entrypoints-header-entrypoint' => 'Hüsdörsidj',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Datei-wai',
-'filepath-page' => 'Datei:',
-'filepath-submit' => 'Widjer',
-'filepath-summary' => 'Mä detdiar spezial-sidj könst di hial datei-wai uffraage. Det datei woort geliks wiset of mä en ferbünjen program begand.',
+# Special:Redirect
+'redirect' => 'Widjerfeerang üüb en brükersidj, sidjenwerjuun of datei.',
+'redirect-legend' => 'Widjerfeerang üüb en sidjenwerjuun of datei.',
+'redirect-summary' => 'Det spezial-sidj feert widjer üüb en brükersidj, sidjenwerjuun of datei.',
+'redirect-submit' => 'Widjer',
+'redirect-lookup' => 'Schük:',
+'redirect-value' => 'Käänang of dateinööm:',
+'redirect-user' => 'Brüker-ID',
+'redirect-revision' => 'Sidjenwerjuun',
+'redirect-file' => 'Dateinööm',
+'redirect-not-exists' => 'Wäärs ei fünjen',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Schük dobelt datein',
@@ -3531,6 +3628,7 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
 'tags' => 'Feranrangskääntiaken',
 'tag-filter' => '[[Special:Tags|Kääntiaken]] filter:',
 'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Kääntiaken|Kääntiakens}}]]: $2)',
 'tags-title' => 'Kääntiaken',
 'tags-intro' => "Det sidj wiset kääntiaken, diar för't bewerkin brükt wurd, an wat jo men.",
 'tags-tag' => 'Kääntiaken-nööm',
@@ -3557,6 +3655,7 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
 'dberr-problems' => 'Dää mi iarag! Det sidj hää technisk komer.',
 'dberr-again' => 'Teew en uugenblak an ferschük det noch ans.',
 'dberr-info' => '(Koon ei mä a dootenbeenk-server ferbinj: $1)',
+'dberr-info-hidden' => '(Ferbinjang mä a dootenbeenk-server as skiaf gingen)',
 'dberr-usegoogle' => 'Uun a teskentidj küdst dü det mä Google ferschük.',
 'dberr-outofdate' => 'Seenk diaram, dat Google ferlicht ual dooten uunwiset.',
 'dberr-cachederror' => 'Detheer komt ütj en cache an as ferlicht ei muar aktuel.',
@@ -3572,6 +3671,9 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
 'htmlform-submit' => 'Auerdreeg',
 'htmlform-reset' => 'Feranrangen turagsaat.',
 'htmlform-selectorother-other' => 'Öödern',
+'htmlform-no' => 'Naan',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Schük ütj',
 
 # SQLite database support
 'sqlite-has-fts' => "Werjuun $1 mä halep för't schüken uun di hialer tekst.",
@@ -3690,4 +3792,19 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
 # Image rotation
 'rotate-comment' => 'Bil am $1 {{PLURAL:$1|graad}} mä a klook dreid.',
 
+# Limit report
+'limitreport-title' => 'Parser-profiling dooten:',
+'limitreport-cputime' => 'CPU-tidj',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekund|sekunden}}',
+'limitreport-walltime' => 'Würelk tidj',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekund|sekunden}}',
+'limitreport-ppvisitednodes' => 'Taal faan ferbinjangsknooter för di föörproseser',
+'limitreport-ppgeneratednodes' => 'Faan di föörproseser bereegent ferbinjangsknooter',
+'limitreport-postexpandincludesize' => "Grate faan iinbinjangen efter't ütjwidjin",
+'limitreport-postexpandincludesize-value' => '$1/$2 bytes',
+'limitreport-templateargumentsize' => "Grate faan't föörlaagenargument",
+'limitreport-templateargumentsize-value' => '$1/$2 bytes',
+'limitreport-expansiondepth' => 'Maksimaal ütjwidjangsjipde',
+'limitreport-expensivefunctioncount' => 'Taal faan apwendag parser-funktjuunen',
+
 );
diff --git a/languages/messages/MessagesFur.php b/languages/messages/MessagesFur.php
index bbd2d613..e5c12116 100644
--- a/languages/messages/MessagesFur.php
+++ b/languages/messages/MessagesFur.php
@@ -141,11 +141,10 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Distapone fûr il gno recapit email tai messaçs di notifiche',
 'tog-shownumberswatching' => 'Mostre il numar di utents che a stan tignint di voli',
 'tog-fancysig' => 'Interprete lis firmis come test wiki (cence un leam automatic)',
-'tog-externaleditor' => 'Dopre un editôr esterni come opzion predeterminade (dome par utents esperts, a coventin impuestazions specifichis, [//www.mediawiki.org/wiki/Manual:External_editors cjale culì par altris informazions.])',
-'tog-externaldiff' => 'Dopre editôr difarencis esterni come opzion predeterminade',
 'tog-watchlisthideown' => 'Plate i miei cambiaments inte liste des pagjinis tignudis di voli',
 'tog-ccmeonemails' => 'Mandimi une copie dai messaçs che o mandi ai altris utents',
 'tog-showhiddencats' => 'Mostre categoriis platadis',
+'tog-useeditwarning' => 'Visimi cuant che o stoi par lassâ une pagjine dulà che a son cambiaments no salvâts',
 
 'underline-always' => 'Simpri',
 'underline-never' => 'Mai',
@@ -316,7 +315,7 @@ $messages = array(
 'jumptosearch' => 'ricercje',
 'pool-errorunknown' => 'Erôr no cognossût',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Informazions su {{SITENAME}}',
 'aboutpage' => 'Project:Informazions',
 'copyright' => 'Il contignût al è disponibil sot de $1',
@@ -326,7 +325,6 @@ $messages = array(
 'disclaimers' => 'Avîs legâi',
 'disclaimerpage' => 'Project:Avîs gjenerâi',
 'edithelp' => 'Jutori pai cambiaments',
-'edithelppage' => 'Help:Cambiaments',
 'helppage' => 'Help:Contignûts',
 'mainpage' => 'Pagjine principâl',
 'mainpage-description' => 'Pagjine principâl',
@@ -668,7 +666,6 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
 'searchmenu-legend' => 'Opzions de ricercje',
 'searchmenu-exists' => "'''E je une pagjine di non \"[[:\$1]]\" su cheste wiki'''",
 'searchmenu-new' => "'''Cree la pagjine \"[[:\$1]]\" su cheste wiki!'''",
-'searchhelp-url' => 'Help:Contignûts',
 'searchprofile-articles' => 'Pagjinis di contignûts',
 'searchprofile-project' => 'Pagjinis di jutori e sul progjet',
 'searchprofile-images' => 'Multimedia',
@@ -704,14 +701,6 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
 'search-external' => 'Ricercje esterne',
 'searchdisabled' => 'La ricercje in {{SITENAME}} no je ative. Tu puedis doprâ Google intant. Sta atent che lis lôr tabelis sul contignût di {{SITENAME}} a puedin jessi pôc inzornadis.',
 
-# Quickbar
-'qbsettings' => 'Sbare svelte',
-'qbsettings-none' => 'Nissune',
-'qbsettings-fixedleft' => 'Fis a Çampe',
-'qbsettings-fixedright' => 'Fis a Drete',
-'qbsettings-floatingleft' => 'Flutuant a çampe',
-'qbsettings-floatingright' => 'Flutuant a diestre',
-
 # Preferences page
 'preferences' => 'Preferencis',
 'mypreferences' => 'Preferencis',
@@ -735,7 +724,6 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
 'resetprefs' => 'Predeterminât',
 'restoreprefs' => 'Torne a lis impostazions predeterminadis',
 'prefs-editing' => 'Cambiament',
-'prefs-edit-boxsize' => 'Dimensions dal barcon pai cambiaments.',
 'rows' => 'Riis',
 'columns' => 'Colonis:',
 'searchresultshead' => 'Ricercje',
@@ -864,7 +852,6 @@ La tô direzion di pueste no ven mostrade cuant che i utents ti contatin.',
 'recentchangeslinked-feed' => 'Cambiaments leâts',
 'recentchangeslinked-toolbox' => 'Cambiaments leâts',
 'recentchangeslinked-title' => 'Cambiaments leâts a "$1"',
-'recentchangeslinked-noresult' => 'Nissun cambiament aes pagjinis leadis tal periodi specificât.',
 'recentchangeslinked-summary' => "Cheste pagjine speciâl e mostre i cambiaments plui recents aes pagjinis leadis a chê specificade (o leadis ai elements intune categorie specificade). Lis [[Special:Watchlist|pagjinis tignudis di voli]] a son mostradis in '''gruessut'''.",
 'recentchangeslinked-page' => 'Non de pagjine:',
 'recentchangeslinked-to' => 'Mostre dome i cambiaments aes pagjinis leadis a chê specificade',
@@ -993,9 +980,6 @@ La descrizion su la sô [$2 pagjine di descrizion] e je mostrade ca sot.',
 'statistics-users-active-desc' => 'Utents che a àn fat une azion {{PLURAL:$1|intal ultin dì|intai ultins $1 dîs}}',
 'statistics-mostpopular' => 'Pagjinis plui visitadis',
 
-'disambiguations' => 'Pagjinis di disambiguazion',
-'disambiguationspage' => 'Template:disambig',
-
 'doubleredirects' => 'Re-indreçaments doplis',
 
 'brokenredirects' => 'Re-indreçaments che no funzionin',
@@ -1157,10 +1141,9 @@ e la pagjine e sarà '''gruessute''' te [[Special:RecentChanges|liste dai ultins
 'unwatch' => 'No stâ tignî di voli',
 'unwatchthispage' => 'No stâ tignî di voli plui',
 'notanarticle' => 'Cheste pagjine no je une vôs',
-'watchnochange' => 'Nissun element di chei tignûts di voli al è stât cambiât tal periodi mostrât.',
 'watchlist-details' => '{{PLURAL:$1|E je $1 pagjine tignude|A son $1 pagjinis tignudis}} di voli, cence contâ lis pagjinis di discussion.',
-'wlheader-enotif' => '* Notifiche par pueste eletroniche ativade.',
-'wlheader-showupdated' => "* Lis pagjinis gambiadis de ultime volte che tu lis âs cjaladis a son mostradis in '''gruessut'''",
+'wlheader-enotif' => 'Notifiche par pueste eletroniche ativade.',
+'wlheader-showupdated' => "Lis pagjinis gambiadis de ultime volte che tu lis âs cjaladis a son mostradis in '''gruessut'''",
 'watchlistcontains' => 'Tu stâs tignint di voli $1 {{PLURAL:$1|pagjine|pagjinis}}.',
 'wlnote' => "Ca sot {{PLURAL:$1|al è il cambiament plui recent|a son i '''$1''' cambiaments plui recents}} {{PLURAL:$2|inte ultime ore|intes '''$2''' oris passadis}}.",
 'wlshowlast' => 'Mostre ultimis $1 oris $2 zornadis $3',
@@ -1482,8 +1465,6 @@ Par plasê va su [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
 'nocredits' => 'Nissune informazion sui ricognossiments disponibil par cheste pagjine.',
 
 # Skin names
-'skinname-standard' => 'Classiche',
-'skinname-nostalgia' => 'Nostalgjie',
 'skinname-modern' => 'Moderne',
 
 # Browsing diffs
@@ -1535,7 +1516,7 @@ Se il file al è stât cambiât rispiet al so stât origjinâl, cualchi informaz
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Largjece',
 'exif-imagelength' => 'Altece',
 'exif-orientation' => 'Orientament',
@@ -1553,7 +1534,7 @@ Se il file al è stât cambiât rispiet al so stât origjinâl, cualchi informaz
 'exif-contrast' => 'Control contrast',
 'exif-gpsaltitude' => 'Altitudin',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Cence compression',
 
 'exif-unknowndate' => 'Date no cognossude',
@@ -1638,9 +1619,6 @@ Se il file al è stât cambiât rispiet al so stât origjinâl, cualchi informaz
 'version-license' => 'Licence',
 'version-software-version' => 'Version',
 
-# Special:FilePath
-'filepath-page' => 'Non dal file:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Non dal file:',
 'fileduplicatesearch-submit' => 'Cîr',
diff --git a/languages/messages/MessagesFy.php b/languages/messages/MessagesFy.php
index 515022f8..db3b20da 100644
--- a/languages/messages/MessagesFy.php
+++ b/languages/messages/MessagesFy.php
@@ -172,9 +172,6 @@ $messages = array(
 'tog-shownumberswatching' => 'It tal brûkers sjen litte dat dizze side folget',
 'tog-oldsig' => 'Hûdige sinjatuerprintallyk:',
 'tog-fancysig' => 'Sinjatuer as wikitekst behannelje (sûnder automatyske keppeling)',
-'tog-externaleditor' => 'Standert in eksterne tekstbewurker brûke (allinne foar experts - foar dizze funksje binne spesjale ynstellings nedich)',
-'tog-externaldiff' => 'Standert in ekstern ferlikingsprogramma brûke (allinne foar experts - foar dizze funksje binne spesjale ynstellings nedich)',
-'tog-showjumplinks' => '"gean nei"-tapaslikens-links ynskeakelje',
 'tog-uselivepreview' => '"live proefbyld" brûke (JavaScript nedich - eksperimenteel)',
 'tog-forceeditsummary' => 'Warskôgje at ik de gearfetting leech lit.',
 'tog-watchlisthideown' => 'Eigen bewurkings op myn folchlist ferbergje',
@@ -360,7 +357,7 @@ Wachtsje efkes foardatsto op 'e nij tagong ta dizze side probearrest te krijen.
 
 $1",
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Oer de {{SITENAME}}',
 'aboutpage' => 'Project:Ynfo',
 'copyright' => 'Ynhâld is beskikber ûnder de $1.',
@@ -370,7 +367,6 @@ $1",
 'disclaimers' => 'Foarbehâld',
 'disclaimerpage' => 'Project:Algemien foarbehâld',
 'edithelp' => 'Bewurk-help',
-'edithelppage' => 'Help:Bewurk-rie',
 'helppage' => 'Help:Help',
 'mainpage' => 'Haadside',
 'mainpage-description' => 'Haadside',
@@ -435,16 +431,6 @@ $1",
 # General errors
 'error' => 'Fout',
 'databaseerror' => 'Databankfout',
-'dberrortext' => 'Sinboufout in databankfraach.
-De lêst besochte databankfraach wie:
-<blockquote><tt>$1</tt></blockquote>
-fan funksje "<tt>$2</tt>" út.
-MySQL joech fout "<tt>$3: $4</tt>" werom.',
-'dberrortextcl' => 'Sinboufout yn databankfraach.
-De lêst besochte databankfraach wie:
-"$1"
-fanút funksje "$2" .
-MySQL joech fout "$3: $4"',
 'laggedslavemode' => 'Warskôging: Mûglik binne resinte bewurkings noch net trochfierd.',
 'readonly' => "Databank is 'Net-skriuwe'.",
 'enterlockreason' => "Skriuw wêrom de databank 'net-skriuwe' makke is, en hoenear't men wêr nei alle gedachten wer skriuwe kin.",
@@ -489,7 +475,6 @@ Query: $2',
 'viewsourcetext' => 'Jo kinne de boarnetekst fan dizze side besjen en kopiearje:',
 'protectedinterface' => "Dizze side befettet tekst foar berjochten fan 'e software en is befeilige om misbrûk tefoaren te kommen.",
 'editinginterface' => "'''Warskôging;''' Jo bewurkje in side dy't brûkt wurdt troch software. Bewurkings op dizze side beynfloedzje de gebrûksynterface fan elkenien. Oerweagje foar oersettings [//translatewiki.net/wiki/Main_Page?setlang=fy translatewiki.net] te brûken, it oersetprojekt foar MediaWiki.",
-'sqlhidden' => '(SQL query ferburgen)',
 'cascadeprotected' => 'Dizze side is skoattele tsjin wizigjen, om\'t der in ûnderdiel útmakket fan de neikommende {{PLURAL:$1|side|siden}}, dy\'t skoattele {{PLURAL:$1|is|binne}} mei de "ûnderlizzende siden" opsje ynskeakele: $2',
 'namespaceprotected' => "Jo hawwe gjin rjochten om siden yn'e nammerûmte '''$1''' te bewurkjen.",
 'ns-specialprotected' => "Siden yn'e nammerûmte {{ns:special}} kinne net bewurke wurde.",
@@ -585,7 +570,7 @@ Jo moatte efkes wachtsje foar't jo it op'e nij besykje kinne.",
 'newpassword' => 'Nij wachtwurd',
 'retypenew' => 'Nij wachtwurd (nochris)',
 'resetpass_submit' => 'Wachtwurd ynstelle en oanmelde',
-'resetpass_success' => 'Jo wachtwurd is feroare. Dwaande mei oanmelden ...',
+'changepassword-success' => 'Jo wachtwurd is feroare. Dwaande mei oanmelden ...',
 'resetpass_forbidden' => 'Wachtwurden kinne net feroare wurde',
 'resetpass-no-info' => "Jo moatte oanmeld wêze foar't Jo dizze side brûke kinne.",
 'resetpass-submit-loggedin' => 'Wachtwurd feroarje',
@@ -919,7 +904,6 @@ Prebearje in oare sykopdracht.',
 'searchmenu-legend' => 'Sykopsjes',
 'searchmenu-exists' => "'''Der is in side mei namme \"[[:\$1]]\" yn dizze wiki'''",
 'searchmenu-new' => "'''Meitsje de side \"[[:\$1]]\" yn dizze wiki!'''",
-'searchhelp-url' => 'Help:Help',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sidenammen mei dit foarheaksel werjaan]]',
 'searchprofile-articles' => 'Ynhâldlike siden',
 'searchprofile-project' => 'Projektsiden',
@@ -961,14 +945,6 @@ Jo kinne ek in nammerûmte as foarheaksel brûke.",
 'search-external' => 'Utwindich sykje',
 'searchdisabled' => '<p>Op it stuit stiet it trochsykjen fan tekst út omdat dizze funksje tefolle kompjûterkapasiteit ferget. As we nije apparatuer krije, en dy is ûnderweis, dan wurdt dizze funksje wer aktyf. Oant salang kinne jo sykje fia Google:</p>',
 
-# Quickbar
-'qbsettings' => 'Menu',
-'qbsettings-none' => 'Ut',
-'qbsettings-fixedleft' => 'Lofts fêst',
-'qbsettings-fixedright' => 'Rjochts fêst',
-'qbsettings-floatingleft' => 'Lofts sweevjend',
-'qbsettings-floatingright' => 'Rjochts sweevjend',
-
 # Preferences page
 'preferences' => 'Ynstellings',
 'mypreferences' => 'Myn foarkarynstellings',
@@ -993,7 +969,6 @@ Jo kinne ek in nammerûmte as foarheaksel brûke.",
 'resetprefs' => 'Ynstellings werom sette',
 'restoreprefs' => 'Tebek nei de standertynstellings',
 'prefs-editing' => 'Siden bewurkje',
-'prefs-edit-boxsize' => 'Ofmjittings fan it bewurkingsfinster',
 'rows' => 'Rigen',
 'columns' => 'Kolommen',
 'searchresultshead' => 'Sykje',
@@ -1028,7 +1003,6 @@ Jo kinne ek in nammerûmte as foarheaksel brûke.",
 'prefs-files' => 'Triemen',
 'prefs-custom-js' => 'Persoanlik JS',
 'prefs-emailconfirm-label' => 'Netpostbefêstiging:',
-'prefs-textboxsize' => 'Ofmjittings bewurkingsskerm',
 'youremail' => 'Jo netpostadres:',
 'username' => 'Meidochnamme:',
 'uid' => 'Wikinûmer:',
@@ -1237,7 +1211,6 @@ Jo kinne ek oaren de mûglikheid jaan kontakt mei jo op te nimmen troch in ferwi
 'recentchangeslinked-feed' => 'Folgje keppelings',
 'recentchangeslinked-toolbox' => 'Folgje keppelings',
 'recentchangeslinked-title' => 'Feroarings yn ferbân mei "$1"',
-'recentchangeslinked-noresult' => "Der hawwe gjin bewurkings yn 'e bedoelde perioade west op'e siden dy't hjirwei linke wurde.",
 'recentchangeslinked-summary' => "Dizze spesjale side lit de lêste bewurkings sjen op siden dy't keppele wurde fan in spesifisearre side ôf (of fan in spesifisearre Kategory ôf). Siden dy't op [[Special:Watchlist|jo folchlist]] steane, wurde '''tsjûk''' werjûn.",
 'recentchangeslinked-page' => 'Sidenamme:',
 'recentchangeslinked-to' => 'Feroarings oan siden mei ferwizings nei dizze side besjen',
@@ -1494,11 +1467,6 @@ Ferjit net de "Wat is hjirmei keppele" nei te gean foar it fuortheljen fan dit s
 'statistics-users-active-desc' => "Brûkers dy't yn 'e ôfrûne {{PLURAL:$1|dei|$1 dagen}} in hanneling útfierd hawwe",
 'statistics-mostpopular' => 'Meast besjoene siden',
 
-'disambiguations' => 'Betsjuttingssiden',
-'disambiguationspage' => 'Template:Neibetsjuttings',
-'disambiguations-text' => "De ûndersteande siden keppelje mei in '''Betsjuttingssiden'''.
-Se soenen mei de side sels keppele wurde moatte.<br /> In side wurdt sjoen as betsjuttingssiden, as de side ien berjocht fan [[MediaWiki:Disambiguationspage]] brûkt.",
-
 'doubleredirects' => 'Dûbelde synonimen',
 'doubleredirectstext' => '<b>Let op!</b> Der kinne missen yn dizze list stean! Dat komt dan ornaris troch oare keppelings ûnder de "#REDIRECT". Eltse rigel jout keppelings nei it earste synonym, it twadde synonym en dan it werklike doel.',
 'double-redirect-fixed-move' => '[[$1]] is ferplakt en is no in trochferwizing nei [[$2]]',
@@ -1697,7 +1665,6 @@ At jo letter in side net mear folgje wolle, dan brûke jo op dy side de keppelin
 'unwatch' => 'Ferjit',
 'unwatchthispage' => 'Ferjit dizze side',
 'notanarticle' => 'Dit kin net folge wurde.',
-'watchnochange' => "Fan de siden dy't jo folgje is der yn dizze perioade net ien feroare.",
 'watchlist-details' => 'Jo folchlist hat {{PLURAL:$1|$1 side|$1 siden}}, oerlissiden net meiteld.',
 'watchmethod-recent' => 'Koartlyn feroare ...',
 'watchmethod-list' => 'Folge ...',
@@ -1946,7 +1913,6 @@ Meld de krekte reden! Neam bygelyks de siden dy't oantaaste waarden.",
 'ipb_expiry_invalid' => 'Tiid fan ferrinnen is net goed.',
 'ipb_already_blocked' => '"$1" is al útsluten',
 'ipb_cant_unblock' => 'Flater: It útsluten fan ID $1 kin net fûn wurde. It is miskien al net mear útsluten.',
-'proxyblocksuccess' => 'Dien.',
 
 # Developer tools
 'lockdb' => "Meitsje de database 'Net-skriuwe'",
@@ -2118,10 +2084,6 @@ Sjoch: [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation], [//transl
 'spamprotectiontext' => "De side dy't jo fêstlizze woene is blokkearre troch in spam filter. Dit wurdt wierskynlik feroarsake troch in ferwizing nei in ekstern webstee.",
 'spamprotectionmatch' => 'De neikommende tekst hat it spam filter aktivearre: $1',
 
-# Skin names
-'skinname-standard' => 'Standert',
-'skinname-nostalgia' => 'Nostalgy',
-
 # Patrolling
 'markaspatrolleddiff' => 'Markearje as kontroleare',
 'markaspatrolledtext' => 'Markearje dizze side as kontrolearre',
@@ -2179,7 +2141,7 @@ Alle folgjende links dy't op deselde rigel steane, wurde behannele as útsûnder
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-samplesperpixel' => 'Oantal komponinten',
 'exif-xresolution' => 'Horizontale resolúsje',
 'exif-yresolution' => 'Fertikale resolúsje',
@@ -2317,11 +2279,6 @@ Wolle jo de side wier op 'e nij skriuwe?",
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Ferzje',
 
-# Special:FilePath
-'filepath' => 'Triempad',
-'filepath-page' => 'Triem:',
-'filepath-submit' => 'Pad',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Sykje op duplikaten',
 'fileduplicatesearch-legend' => 'Sykje op duplikaten',
diff --git a/languages/messages/MessagesGa.php b/languages/messages/MessagesGa.php
index 8a51059f..782df491 100644
--- a/languages/messages/MessagesGa.php
+++ b/languages/messages/MessagesGa.php
@@ -126,9 +126,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Taispeán an méid úsáideoirí atá ag faire',
 'tog-oldsig' => 'Réamhamharc ar an síniú atá ann:',
 'tog-fancysig' => 'Sínithe bunúsacha mar vicítéacs (gan nasc uathoibríoch)',
-'tog-externaleditor' => 'Bain úsáid as eagarthóir seachtrach mar réamhshocrú (saineolaithe amháin, tá socrú speisialta de dhíth ort. [//www.mediawiki.org/wiki/Manual:External_editors Tuilleadh eolais.])',
-'tog-externaldiff' => 'Bain úsáid as difríocht sheachtrach mar réamhshocrú (saineolaithe amháin, tá socrú speisialta de dhíth ort. [//www.mediawiki.org/wiki/Manual:External_editors Tuilleadh eolais.])',
-'tog-showjumplinks' => 'Cumasaigh naisc insroichteachta “léim go dtí”',
 'tog-uselivepreview' => 'Bain úsáid as réamhamharc beo (JavaScript) (Turgnamhach)',
 'tog-forceeditsummary' => 'Cuir in iúl dom nuair a chuirim isteach achoimre eagair folamh',
 'tog-watchlisthideown' => 'Folaigh mo chuid athruithe ón liosta faire',
@@ -221,7 +218,7 @@ $messages = array(
 'listingcontinuesabbrev' => 'ar lean.',
 'index-category' => 'Leathanaigh innéacsaithe',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Maidir leis',
 'article' => 'Leathanach ábhair',
@@ -318,7 +315,7 @@ $messages = array(
 'pool-timeout' => 'Thar am ag feitheamh leis an nglas',
 'pool-errorunknown' => 'Earráid anaithnid',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Maidir leis an {{SITENAME}}',
 'aboutpage' => 'Project:Maidir leis',
 'copyright' => 'Tá an t-ábhar le fáil faoin $1.',
@@ -328,7 +325,6 @@ $messages = array(
 'disclaimers' => 'Séanadh',
 'disclaimerpage' => 'Project:Séanadh_ginearálta',
 'edithelp' => 'Cabhair eagarthóireachta',
-'edithelppage' => 'Help:Eagarthóireacht',
 'helppage' => 'Help:Clár_ábhair',
 'mainpage' => 'Príomhleathanach',
 'mainpage-description' => 'Príomhleathanach',
@@ -354,7 +350,6 @@ $messages = array(
 'newmessagesdifflink' => 'difear ón leasú leathdhéanach',
 'youhavenewmessagesmulti' => 'Tá teachtaireachtaí nua agat ar $1',
 'editsection' => 'athraigh',
-'editsection-brackets' => '[$1]',
 'editold' => 'athraigh',
 'viewsourceold' => 'féach ar foinse',
 'editlink' => 'cur in eagar',
@@ -404,17 +399,6 @@ Tá liosta de leathanaigh speisialta bhailí ar fáil ag [[Special:SpecialPages|
 # General errors
 'error' => 'Earráid',
 'databaseerror' => 'Earráid sa bhunachar sonraí',
-'dberrortext' => 'Tharla earráid chomhréire in iarratas chuig an mbunachar sonraí.
-B\'fhéidir gur fabht sa bhogearraí é seo.
-Seo é an t-iarratas deireanach chuig an mbunachar sonrai:
-<blockquote><tt>$1</tt></blockquote>
-ón bhfeidhm "<tt>$2</tt>".
-Thug MySQL an earráid seo: "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Tharla earráid chomhréire in iarratas chuig an bhunachar sonraí.
-"$1",
-ón bhfeidhm "$2",
-ab ea an t-iarratas deireanach chuig an mbunachar sonrai.
-Thug MySQL an earráid seo: "$3: $4".',
 'laggedslavemode' => "Rabhadh: B'fhéidir nach bhfuil na nuashonrúcháin is déanaí le feiceáil ar an leathanach seo.",
 'readonly' => 'Bunachar sonraí faoi ghlas',
 'enterlockreason' => 'Iontráil cúis don glasáil, agus meastachán
@@ -464,7 +448,6 @@ Bain trial arís as i gcionn cúpla bomaite más é do thoil é.',
 'viewsourcetext' => 'Is féidir foinse an leathanach seo a fheiceáil ná a cóipeáil:',
 'editinginterface' => "'''Rabhadh:''' Tá tú ag athrú leathanaigh a bhfuil téacs comhéadain do na bogearraí air. Cuirfear athruithe ar an leathanach seo i bhfeidhm ar an gcomhéadan úsáideora.
 Más maith leat MediaWiki a aistriú, cuimhnigh ar [//translatewiki.net/wiki/Main_Page?setlang=ga translatewiki.net] (tionscadal logánaithe MediaWiki) a úsáid.",
-'sqlhidden' => '(Iarratas SQL folaithe)',
 'namespaceprotected' => "Ní chead agat leathanaigh a chur in eagar san ainmspás '''$1'''.",
 'ns-specialprotected' => 'Ní féidir leathanaigh speisialta a chur in eagar.',
 'titleprotected' => "Tá an teideal seo cosanta ar chruthú le [[User:$1|$1]].
@@ -482,6 +465,7 @@ Tabhair faoi deara go taispeáinfear roinnt leathanaigh mar atá tú logáilte i
 'welcomeuser' => 'Fáilte, $1!',
 'welcomecreation-msg' => 'Cruthaíodh do chuntas.',
 'yourname' => "D'ainm úsáideora",
+'userlogin-yourname' => 'Ainm úsáideora',
 'yourpassword' => "D'fhocal faire",
 'yourpasswordagain' => "Athiontráil d'fhocal faire",
 'remembermypassword' => "Cuimhnigh ar m'fhocal faire ar an ríomhaire seo (ar feadh uastréimhse de $1 {{PLURAL:$1|lá|lá}})",
@@ -501,8 +485,14 @@ Tabhair faoi deara go taispeáinfear roinnt leathanaigh mar atá tú logáilte i
 'gotaccount' => "An bhfuil cuntas agat cheana féin? '''$1'''.",
 'gotaccountlink' => 'Logáil isteach',
 'userlogin-resetlink' => 'Sonraí logála isteach dearmadta agat?',
+'createacct-emailrequired' => 'Seoladh ríomhphoist',
+'createacct-email-ph' => 'Iontráil do sheoladh ríomhphoist',
+'createacct-another-email-ph' => 'Iontráil seoladh ríomhphoist',
 'createaccountmail' => 'le ríomhphost',
 'createaccountreason' => 'Fáth:',
+'createacct-reason' => 'Cúis',
+'createacct-submit' => 'Cruthaigh do chuntas',
+'createacct-another-submit' => 'Cruthaigh cuntas eile',
 'badretype' => "D'iontráil tú dhá fhocal faire difriúla.",
 'userexists' => 'Tá an ainm úsáideora sin in úsáid cheana féin.<br />
 Roghnaigh ainm eile agus bain triail eile as.',
@@ -795,7 +785,6 @@ Treoir: (rth) = difríocht ón leagan reatha, (rmh) = difríocht ón leagan roim
 'viewprevnext' => 'Taispeáin ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Sainroghanna cuardaithe',
 'searchmenu-new' => "'''Cruthaigh an leathanach \"[[:\$1]]\" ar an vicí seo!'''",
-'searchhelp-url' => 'Help:Clár_ábhair',
 'searchprofile-articles' => 'Leathanaigh ábhair',
 'searchprofile-project' => 'Leathanaigh thionscadail agus cabhair',
 'searchprofile-images' => 'Ilmheáin',
@@ -831,14 +820,6 @@ Bain triail as ''all:'' a chur roimh d'iarratas chun an t-inneachar ar fad (leat
 'powersearch-togglenone' => 'Tada',
 'searchdisabled' => "Tá brón orainn! Mhíchumasaíodh an cuardach téacs iomlán go sealadach chun luas an tsuímh a chosaint. Idir an dá linn, is féidir leat an cuardach Google anseo thíos a úsáid - b'fhéidir go bhfuil sé as dáta.",
 
-# Quickbar
-'qbsettings' => 'Sainroghanna an bosca uirlisí',
-'qbsettings-none' => 'Faic',
-'qbsettings-fixedleft' => 'Greamaithe ar chlé',
-'qbsettings-fixedright' => 'Greamaithe ar dheis',
-'qbsettings-floatingleft' => 'Ag faoileáil ar chlé',
-'qbsettings-floatingright' => 'Ag faoileáil ar dheis',
-
 # Preferences page
 'preferences' => 'Sainroghanna',
 'mypreferences' => 'Sainroghanna',
@@ -1009,7 +990,6 @@ do chuid dreachtaí a chur i leith tusa.',
 'recentchangeslinked-feed' => 'Athruithe gaolmhara',
 'recentchangeslinked-toolbox' => 'Athruithe gaolmhara',
 'recentchangeslinked-title' => 'Athruithe gaolmhara le "$1"',
-'recentchangeslinked-noresult' => 'Níl aon athraithe ar na leathanaigh naiscthe le linn an tréimhse tugtha.',
 'recentchangeslinked-summary' => "Seo liosta na n-athruithe atá deanta is déanaí le leathanaigh atá naiscthe as leathanach sonraithe (nó baill an chatagóir sonraithe).
 Tá na leathanaigh ar do [[Special:Watchlist|liosta faire]] i '''gcló trom'''.",
 'recentchangeslinked-page' => 'Ainm leathanaigh:',
@@ -1144,9 +1124,6 @@ Má theastáilann uait do chomhad a uaslódáil fós, téigh ar ais agus úsáid
 'statistics-header-users' => 'Staidreamh úsáideora',
 'statistics-pages' => 'Leathanaigh',
 
-'disambiguations' => 'Leathanaigh idirdhealaithe',
-'disambiguationspage' => '{{ns:project}}:Naisc_go_leathanaigh_idirdhealaithe',
-
 'doubleredirects' => 'Athsheoltaí dúbailte',
 'doubleredirectstext' => '<b>Tabhair faoi deara:</b> B\'fheidir go bhfuil toraidh bréagacha ar an liosta seo.
 De ghnáth cíallaíonn sé sin go bhfuil téacs breise le naisc thíos sa chéad #REDIRECT no #ATHSHEOLADH.<br />
@@ -1302,11 +1279,9 @@ agus beidh '''cló trom''' ar a theideal san [[Special:RecentChanges|liosta de n
 'unwatchthispage' => 'Ná fair fós',
 'notanarticle' => 'Níl alt ann',
 'notvisiblerev' => 'Scriosadh an leagan',
-'watchnochange' => 'Níor athraíodh ceann ar bith de na leathanaigh atá ar do liosta faire,
-taobh istigh den tréimhse atá roghnaithe agat.',
 'watchlist-details' => 'Tá tú ag faire ar {{PLURAL:$1|leathanach amháin|$1 leathanaigh}}, gan leathanaigh phlé a chur san áireamh.',
-'wlheader-enotif' => '* Cumasaíodh fógraí riomhphoist.',
-'wlheader-showupdated' => "* Tá '''cló trom''' ar leathanaigh a athraíodh ón uair is deireanaí a d'fhéach tú orthu.",
+'wlheader-enotif' => 'Cumasaíodh fógraí riomhphoist.',
+'wlheader-showupdated' => "Tá '''cló trom''' ar leathanaigh a athraíodh ón uair is deireanaí a d'fhéach tú orthu.",
 'watchmethod-recent' => 'ag seiceáil na athruithe deireanacha ar do chuid leathanaigh faire',
 'watchmethod-list' => 'ag seiceáil na leathanaigh faire ar do chuid athruithe deireanacha',
 'watchlistcontains' => 'Tá {{PLURAL:$1|leathanach amháin|$1 leathanaigh}} ar do liosta faire.',
@@ -1576,7 +1551,6 @@ liosta a fháil de coisc atá i bhfeidhm faoi láthair.',
 'proxyblockreason' => "Coisceadh do sheoladh IP dá bharr gur seachfhreastalaí
 neamhshlándála is ea é. Déan teagmháil le do chomhlacht idirlín nó le do lucht cabhrach teicneolaíochta
 go mbeidh 'fhios acu faoin fadhb slándála tábhachtach seo.",
-'proxyblocksuccess' => 'Rinneadh.',
 'sorbsreason' => 'Liostalaítear do sheoladh IP mar sheachfhreastalaí oscailte sa DNSBL.',
 
 # Developer tools
@@ -1788,13 +1762,8 @@ iarradh sábháil. Is dócha gur nasc chuig suíomh seachtrach ba chúis leis.',
 'spambot_username' => 'MediaWiki turscar glanadh',
 
 # Skin names
-'skinname-standard' => 'Clasaiceach',
-'skinname-nostalgia' => 'Sean-nós',
 'skinname-cologneblue' => 'Gorm Köln',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MoChraiceann',
-'skinname-chick' => 'Sicín',
-'skinname-simple' => 'Simplí',
 'skinname-modern' => 'Nua-aimseartha',
 'skinname-vector' => 'Veicteoir',
 
@@ -1868,7 +1837,7 @@ Beidh na cinn eile ceilte de réir réamhshocraithe.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Leithead',
 'exif-imagelength' => 'Airde',
 'exif-bitspersample' => 'Gíotáin sa chomhpháirt',
@@ -1985,7 +1954,7 @@ Beidh na cinn eile ceilte de réir réamhshocraithe.
 'exif-languagecode' => 'Teanga',
 'exif-iimcategory' => 'Catagóir',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Neamh-chomhbhrúite',
 
 'exif-unknowndate' => 'Dáta anaithnid',
@@ -2217,11 +2186,6 @@ Rachaidh an cód deimhnithe seo as feidhm ag $4.',
 'version-software-version' => 'Leagan',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Cosán comhaid',
-'filepath-page' => 'Comhad:',
-'filepath-submit' => 'Gabh',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Ainm comhaid:',
 'fileduplicatesearch-submit' => 'Cuardaigh',
diff --git a/languages/messages/MessagesGag.php b/languages/messages/MessagesGag.php
index c736abdc..636e8415 100644
--- a/languages/messages/MessagesGag.php
+++ b/languages/messages/MessagesGag.php
@@ -124,9 +124,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Bildirmää maillerinde e-mail adresimi göster.',
 'tog-shownumberswatching' => 'İzlään kullanıcı sayısın göster',
 'tog-fancysig' => 'Çii imza (İmzanız görüner nesoy onu yukarda belirttiniz. Sayfanıza avtomatik baalantı yaratılmaycêk)',
-'tog-externaleditor' => 'Düzmää başka editor programmasılan yap',
-'tog-externaldiff' => 'Karşılaştırmakları dış programmalan yap.',
-'tog-showjumplinks' => '"Git" baalantısın işlet',
 'tog-uselivepreview' => 'Tez cannı ön siiri kullan (JavaScript) (êksperimental)',
 'tog-forceeditsummary' => 'Bana haber ver ne zaman ani kısa annatmanı boş braacam',
 'tog-watchlisthideown' => 'Bakmaa listamdan benim diişmäklerimi sakla',
@@ -280,7 +277,7 @@ $messages = array(
 'jumptonavigation' => 'kullan',
 'jumptosearch' => 'ara',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} için',
 'aboutpage' => 'Project:Uurunda',
 'copyright' => 'İçersindeki $1 altında.',
@@ -290,7 +287,6 @@ $messages = array(
 'disclaimers' => 'Cuvapçılık reti',
 'disclaimerpage' => 'Project:Genel cuvapçılık reti',
 'edithelp' => 'Nesoy var nicä diiştirmää?',
-'edithelppage' => 'Help:Nesoy var nicä sayfa diiştirmää',
 'helppage' => 'Help:İçindekilär',
 'mainpage' => 'Baş yaprak',
 'mainpage-description' => 'Baş yaprak',
@@ -576,7 +572,6 @@ Nışannar: (bitki) = şindiki versiyalan aradaki fark,
 'prevn' => 'ilerki {{PLURAL:$1|$1}}',
 'nextn' => 'geeriki {{PLURAL:$1|$1}}',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:İçindekilär',
 'search-result-size' => '$1 ({{PLURAL:$2|1 laf|$2 laf}})',
 'search-redirect' => '(göndermää $1)',
 'search-section' => '(bölüm $1)',
@@ -655,7 +650,6 @@ Aaramaanızın önünä ''all:'' prefiksini koyun da deneyin hepsi içlii aarama
 'recentchangeslinked-feed' => 'İlgili diişilmäklär',
 'recentchangeslinked-toolbox' => 'İlgili diişilmäklär',
 'recentchangeslinked-title' => '"$1" ilgili diişmäklär',
-'recentchangeslinked-noresult' => 'Baalantılı sayfalarda verilmiş devirde diişmäk olmadı.',
 'recentchangeslinked-summary' => "Bu maasus sayfa baalantılı sayfalardaki diişmäkleri sayêr.
 Sizin bakmaa [[Special:Watchlist|listasındaki]] sayfalar verildi '''kalın''' bukvalarnan.",
 'recentchangeslinked-page' => 'Yaprak adı:',
@@ -724,8 +718,6 @@ Sizin bakmaa [[Special:Watchlist|listasındaki]] sayfalar verildi '''kalın''' b
 'statistics-users-active-desc' => 'Bitki {{PLURAL:$1|gün|$1 günde}} çalışmaa yapmaa kullanıcılar',
 'statistics-mostpopular' => 'En anılmış yazılar',
 
-'disambiguations' => 'Maana aydınnatmak yaprakları',
-
 'doubleredirects' => 'İki kerä yönnendirmeler',
 
 'brokenredirects' => 'Var olmayan yazıya yapılmış yönnendirmeler',
diff --git a/languages/messages/MessagesGan_hans.php b/languages/messages/MessagesGan_hans.php
index 983559c8..eeca5690 100644
--- a/languages/messages/MessagesGan_hans.php
+++ b/languages/messages/MessagesGan_hans.php
@@ -63,9 +63,6 @@ $messages = array(
 'tog-shownumberswatching' => '显示有几多人监视',
 'tog-oldsig' => '现有𠮶签名：',
 'tog-fancysig' => '搦签名以维基字对待（冇自动连结）',
-'tog-externaleditor' => '默认用外部编辑器（专家用𠮶功能，要到倷𠮶电脑上头特别𠮶设置一下）',
-'tog-externaldiff' => '默认用外部差异比较器（专家用𠮶功能，要到汝𠮶电脑上头特别𠮶设置下。[//www.mediawiki.org/wiki/Manual:External_editors 别𠮶信息]）',
-'tog-showjumplinks' => '启用“跳到”访问链接',
 'tog-uselivepreview' => '使用即时预览（JavaScript）（实验中）',
 'tog-forceeditsummary' => '冇改动注解时要同偶话',
 'tog-watchlisthideown' => '监视列表弆到偶𠮶编辑',
@@ -258,7 +255,7 @@ $messages = array(
 
 $1',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '关于 {{SITENAME}}',
 'aboutpage' => 'Project:关于',
 'copyright' => '个版𠮶内容系根据$1𠮶条款发布。',
@@ -268,7 +265,6 @@ $1',
 'disclaimers' => '免责声明',
 'disclaimerpage' => 'Project:免责声明',
 'edithelp' => '编写帮助',
-'edithelppage' => 'Help:啷编写文章',
 'helppage' => 'Help:说明',
 'mainpage' => '封面',
 'mainpage-description' => '封面',
@@ -337,17 +333,6 @@ $1',
 # General errors
 'error' => '错误',
 'databaseerror' => '数据库错误',
-'dberrortext' => '数据库查询语法有错。
-可能系软件有错。
-最晏𠮶数据库指令系:
-<blockquote><tt>$1</tt></blockquote>
-来自函数 "<tt>$2</tt>"。
-MySQL回到错误 "<tt>$3: $4</tt>"。',
-'dberrortextcl' => '数据库查询语法有错。
-最晏𠮶数据库指令系:
-“$1”
-来自函数“$2”。
-MySQL回到错误“$3: $4”。',
 'laggedslavemode' => '警告：页面可能冇有新近内容。',
 'readonly' => '数据库上正锁啰',
 'enterlockreason' => '请输入锁到数据库𠮶理由，包括预计几时间解锁',
@@ -388,7 +373,6 @@ MySQL回到错误“$3: $4”。',
 'editinginterface' => "'''Warning:''' You are editing a page which is used to provide interface text for the software.
 Changes to this page will affect the appearance of the user interface for other users.
 For translations, please consider using [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden' => '（SQL 弆到𠮶查询）',
 'cascadeprotected' => '个页已拖保护，因为佢拖“联锁保护”𠮶{{PLURAL:$1|一只|几只}}拖保护页包到：
 $2',
 'namespaceprotected' => "倷冇权编写'''$1'''空间里度𠮶页面。",
@@ -468,7 +452,7 @@ $2',
 'newpassword' => '新密码：',
 'retypenew' => '确认密码:',
 'resetpass_submit' => '设定密码同到登入',
-'resetpass_success' => '倷𠮶密码改正喽！正帮倷登入...',
+'changepassword-success' => '倷𠮶密码改正喽！正帮倷登入...',
 'resetpass_forbidden' => '到{{SITENAME}}上改伓正密码',
 'resetpass-submit-loggedin' => '设过帐户密码',
 'resetpass-submit-cancel' => '取消',
@@ -743,7 +727,6 @@ $2',
 'viewprevnext' => '眵吖（$1 {{int:pipe-separator}} $2） （$3）',
 'searchmenu-exists' => "'''个只wiki已有一只叫「[[:$1]]」𠮶页。'''",
 'searchmenu-new' => "'''嘚个只wiki上建立「[[:$1]]」页！'''",
-'searchhelp-url' => 'Help:说明',
 'searchprofile-articles' => '内容页',
 'searchprofile-project' => '帮助同得计划页',
 'searchprofile-images' => '多媒体',
@@ -776,14 +759,6 @@ $2',
 'powersearch-field' => '寻',
 'searchdisabled' => '{{SITENAME}}𠮶搜索功能已经关闭。倷可以用Google寻吖。但系佢𠮶索引可能系早先𠮶。',
 
-# Quickbar
-'qbsettings' => '快捷导航条',
-'qbsettings-none' => '冇',
-'qbsettings-fixedleft' => '左首固定',
-'qbsettings-fixedright' => '右首固定',
-'qbsettings-floatingleft' => '左首漂移',
-'qbsettings-floatingright' => '左首漂移',
-
 # Preferences page
 'preferences' => '参数设置',
 'mypreferences' => '偶𠮶参数设置',
@@ -916,7 +891,6 @@ $2',
 'recentchangeslinked-feed' => '链接页𠮶更改',
 'recentchangeslinked-toolbox' => '链接页𠮶更改',
 'recentchangeslinked-title' => '链接页𠮶改动到 "$1"',
-'recentchangeslinked-noresult' => '个段时间𠮶链接页冇更改。',
 'recentchangeslinked-summary' => "个只特殊页列出个页连出去页面𠮶最晏改动（或系某只分类𠮶页面）。
 [[Special:Watchlist|倷𠮶监视列表]]页面会用'''粗体'''显到。",
 'recentchangeslinked-page' => '页面名子：',
@@ -1112,11 +1086,6 @@ $2',
 'statistics-users-active-desc' => '头$1日操作过𠮶用户',
 'statistics-mostpopular' => '眵𠮶人最多𠮶页面',
 
-'disambiguations' => '扤清楚页',
-'disambiguationspage' => 'Template:扤清楚',
-'disambiguations-text' => "底下𠮶页面都有到'''扤清楚页'''𠮶链接, 但系佢俚应当系连到正当𠮶标题。<br />
-如果一只页面系链接自[[MediaWiki:Disambiguationspage]]，佢会拖当成扤清楚页。",
-
 'doubleredirects' => '双重重定向页面',
 'doubleredirectstext' => '底下𠮶重定向链接到别只重定向页面:',
 'double-redirect-fixed-move' => '[[$1]]拕移动正，佢个下拕重定向到[[$2]]。',
@@ -1269,10 +1238,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatch' => '莫眏到',
 'unwatchthispage' => '莫眏到个页',
 'notanarticle' => '伓系文章',
-'watchnochange' => '一径到显示𠮶时间之内，倷眏到𠮶页面冇改动。',
 'watchlist-details' => '$1只页面（伓算讨论页） 拖眏到哩',
-'wlheader-enotif' => '* 启动嘞email通知功能。',
-'wlheader-showupdated' => "* 上回倷眵𠮶页面改动𠮶部分用'''粗体'''显到",
+'wlheader-enotif' => '启动嘞email通知功能。',
+'wlheader-showupdated' => "上回倷眵𠮶页面改动𠮶部分用'''粗体'''显到",
 'watchmethod-recent' => '眵吖拖眏到𠮶页面𠮶最近编辑',
 'watchmethod-list' => '望吖监视页里头最晏𠮶改动',
 'watchlistcontains' => '倷𠮶监视列表包含$1只页面。',
@@ -1547,11 +1515,8 @@ $1',
 'ipb_already_blocked' => '锁到嘞"$1"',
 'ipb_cant_unblock' => '错误: 冇发现Block ID $1。个只IP话伓定拖解封喽。',
 'ip_range_invalid' => '冇用𠮶IP范围。',
-'blockme' => '封吥偶去',
 'proxyblocker' => '代理封锁器',
-'proxyblocker-disabled' => '个只功能用伓正喽。',
 'proxyblockreason' => '倷𠮶IP系一只公开𠮶代理，佢拖封到嘞。请联络倷𠮶Internet服务提供商或技术帮助再告诵佢俚个只严重𠮶安全问题。',
-'proxyblocksuccess' => '扤正啰。',
 'sorbsreason' => '{{SITENAME}}用𠮶 DNSBL 查到倷𠮶IP地址系只公开代理服务器。',
 'sorbs_create_account_reason' => '{{SITENAME}}用𠮶 DNSBL 检查到倷𠮶IP地址系只公开代理服务器，倷也就新开伓正帐户。',
 
@@ -1858,7 +1823,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '阔',
 'exif-imagelength' => '高',
 'exif-bitspersample' => '每像素byte数',
@@ -1972,7 +1937,7 @@ $1',
 'exif-gpsdatestamp' => 'GPS日期',
 'exif-gpsdifferential' => 'GPS差动修正',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '冇压缩',
 
 'exif-unknowndate' => '未知𠮶日期',
@@ -2224,7 +2189,6 @@ $3
 'version-variables' => '变量',
 'version-other' => '别𠮶',
 'version-mediahandlers' => '媒体处理程序',
-'version-extension-functions' => '扩展功能',
 'version-parser-extensiontags' => '解析器扩展标签',
 'version-hook-name' => '钩子名',
 'version-hook-subscribedby' => '订阅人',
@@ -2234,11 +2198,6 @@ $3
 'version-software' => '装正𠮶软件',
 'version-software-version' => '版本',
 
-# Special:FilePath
-'filepath' => '文件路径',
-'filepath-page' => '文件：',
-'filepath-submit' => '路径',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => '文件名:',
 'fileduplicatesearch-submit' => '寻',
diff --git a/languages/messages/MessagesGan_hant.php b/languages/messages/MessagesGan_hant.php
index 55e707f3..4628ab30 100644
--- a/languages/messages/MessagesGan_hant.php
+++ b/languages/messages/MessagesGan_hant.php
@@ -85,9 +85,6 @@ $messages = array(
 'tog-shownumberswatching' => '顯示有幾多人監視',
 'tog-oldsig' => '現有嗰簽名：',
 'tog-fancysig' => '搦簽名以維基字對待（冇自動連結）',
-'tog-externaleditor' => '默認用外部編輯器（專家用嗰功能，要到倷嗰電腦上頭特別嗰設置一下）',
-'tog-externaldiff' => '默認用外部差異比較器（專家用嗰功能，要到汝嗰電腦上頭特別嗰設置下。[//www.mediawiki.org/wiki/Manual:External_editors 別嗰信息]）',
-'tog-showjumplinks' => '啟用“跳到”訪問連結',
 'tog-uselivepreview' => '使用即時預覽（JavaScript）（實驗中）',
 'tog-forceeditsummary' => '冇改動注解時要同我話',
 'tog-watchlisthideown' => '監視列表弆到我嗰編輯',
@@ -280,7 +277,7 @@ $messages = array(
 
 $1',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '關於 {{SITENAME}}',
 'aboutpage' => 'Project:關於',
 'copyright' => '箇版嗰內容係根據$1嗰條款發佈。',
@@ -290,7 +287,6 @@ $1',
 'disclaimers' => '免責聲明',
 'disclaimerpage' => 'Project:免責聲明',
 'edithelp' => '編寫幫助',
-'edithelppage' => 'Help:啷編寫文章',
 'helppage' => 'Help:説明',
 'mainpage' => '封面',
 'mainpage-description' => '封面',
@@ -359,17 +355,6 @@ $1',
 # General errors
 'error' => '錯誤',
 'databaseerror' => '資料庫錯誤',
-'dberrortext' => '資料庫查詢語法有錯。
-可能係軟件有錯。
-最晏嗰資料庫指令係:
-<blockquote><tt>$1</tt></blockquote>
-來自函數 "<tt>$2</tt>"。
-MySQL回到錯誤 "<tt>$3: $4</tt>"。',
-'dberrortextcl' => '資料庫查詢語法有錯。
-最晏嗰資料庫指令係:
-“$1”
-來自函數“$2”。
-MySQL回到錯誤“$3: $4”。',
 'laggedslavemode' => '警告：頁面可能冇有新近內容。',
 'readonly' => '資料庫上正鎖哩',
 'enterlockreason' => '請輸入鎖到資料庫嗰理由，包括預計幾時間解鎖',
@@ -410,7 +395,6 @@ MySQL回到錯誤“$3: $4”。',
 'editinginterface' => "'''Warning:''' You are editing a page which is used to provide interface text for the software.
 Changes to this page will affect the appearance of the user interface for other users.
 For translations, please consider using [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden' => '（SQL 弆到嗰查詢）',
 'cascadeprotected' => '箇頁已拕保護，因為佢拕「聯鎖保護」嗰{{PLURAL:$1|一隻|幾隻}}拕保護頁包到：
 $2',
 'namespaceprotected' => "倷冇權編寫'''$1'''空間裡度嗰頁面。",
@@ -490,7 +474,7 @@ $2',
 'newpassword' => '新密碼：',
 'retypenew' => '確認密碼:',
 'resetpass_submit' => '設定密碼同到登入',
-'resetpass_success' => '汝嗰密碼改正哩！箇下汝登入嘚...',
+'changepassword-success' => '汝嗰密碼改正哩！箇下汝登入嘚...',
 'resetpass_forbidden' => '到{{SITENAME}}上改伓正密碼',
 'resetpass-submit-loggedin' => '設過帳戶密碼',
 'resetpass-submit-cancel' => '取消',
@@ -765,7 +749,6 @@ $2',
 'viewprevnext' => '望下（$1 {{int:pipe-separator}} $2） （$3）',
 'searchmenu-exists' => "'''箇隻wiki已有一隻叫「[[:$1]]」嗰頁。'''",
 'searchmenu-new' => "'''到箇隻wiki上建立「[[:$1]]」頁！'''",
-'searchhelp-url' => 'Help:説明',
 'searchprofile-articles' => '內容頁',
 'searchprofile-project' => '幫助同得計劃頁',
 'searchprofile-images' => '多媒體',
@@ -798,14 +781,6 @@ $2',
 'powersearch-field' => '尋',
 'searchdisabled' => '{{SITENAME}}嗰搜索功能已經關閉。倷可以用Google尋吖。但係佢嗰索引可能係早先嗰。',
 
-# Quickbar
-'qbsettings' => '快捷導航條',
-'qbsettings-none' => '冇',
-'qbsettings-fixedleft' => '左首固定',
-'qbsettings-fixedright' => '右首固定',
-'qbsettings-floatingleft' => '左首漂移',
-'qbsettings-floatingright' => '左首漂移',
-
 # Preferences page
 'preferences' => '參數設置',
 'mypreferences' => '我嗰參數設置',
@@ -938,7 +913,6 @@ $2',
 'recentchangeslinked-feed' => '連結頁嗰更改',
 'recentchangeslinked-toolbox' => '連結頁嗰更改',
 'recentchangeslinked-title' => '連結頁嗰改動到 "$1"',
-'recentchangeslinked-noresult' => '箇段時間嗰連結頁冇更改。',
 'recentchangeslinked-summary' => "箇隻特殊頁列出箇頁連出去頁面嗰頂晏嗰改動（或係某隻分類嗰頁面）。
 [[Special:Watchlist|汝嗰監視列表]]頁面會用'''粗體'''顯到。",
 'recentchangeslinked-page' => '頁面名子：',
@@ -1134,11 +1108,6 @@ $2',
 'statistics-users-active-desc' => '頭$1日操作過嗰用戶',
 'statistics-mostpopular' => '眵嗰人頂多嗰頁面',
 
-'disambiguations' => '扤清楚頁',
-'disambiguationspage' => 'Template:舞清楚',
-'disambiguations-text' => "底下嗰頁面都有到'''扤清楚頁'''嗰連結, 但係佢俚應當係連到正當嗰標題。<br />
-如果一隻頁面係連結自[[MediaWiki:Disambiguationspage]]，佢會拕當成扤清楚頁。",
-
 'doubleredirects' => '雙重重定向頁面',
 'doubleredirectstext' => '底下嗰重定向連結到別隻重定向頁面:',
 'double-redirect-fixed-move' => '[[$1]]拕移動正，佢箇下拕重定向到[[$2]]。',
@@ -1291,10 +1260,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatch' => '莫眏到',
 'unwatchthispage' => '莫眏到箇頁',
 'notanarticle' => '伓係文章',
-'watchnochange' => '一徑到顯示嗰時間之內，倷眏到嗰頁面冇改動。',
 'watchlist-details' => '$1隻頁面（伓算討論頁） 拕眏到哩',
-'wlheader-enotif' => '* 啟動嘞email通知功能。',
-'wlheader-showupdated' => "* 上回倷眵嗰頁面改動嗰部分用'''粗體'''顯到",
+'wlheader-enotif' => '啟動哩email通知功能。',
+'wlheader-showupdated' => "上回倷眵嗰頁面改動嗰部分用'''粗體'''顯到",
 'watchmethod-recent' => '眵吖拕眏到嗰頁面嗰頂晏嗰編輯',
 'watchmethod-list' => '望吖監視頁裡頭頂晏嗰改動',
 'watchlistcontains' => '倷嗰監視列表包含$1隻頁面。',
@@ -1569,11 +1537,8 @@ $1',
 'ipb_already_blocked' => '鎖到哩"$1"',
 'ipb_cant_unblock' => '錯誤: 冇發現Block ID $1。箇隻IP話伓定拕解封哩。',
 'ip_range_invalid' => '冇用嗰IP範圍。',
-'blockme' => '封吥我去',
 'proxyblocker' => '代理封鎖器',
-'proxyblocker-disabled' => '箇隻功能用伓正哩。',
 'proxyblockreason' => '汝嗰IP係一隻公開嗰代理，佢拕封到哩。請聯絡汝嗰Internet服務提供商或技術幫助再告誦佢俚箇隻嚴重嗰安全問題。',
-'proxyblocksuccess' => '舞正哩。',
 'sorbsreason' => '{{SITENAME}}用嗰 DNSBL 查到汝嗰IP地址係隻公開代理服務器。',
 'sorbs_create_account_reason' => '{{SITENAME}}用嗰 DNSBL 檢查到汝嗰IP地址係隻公開代理服務器，汝也就新開伓正帳戶。',
 
@@ -1880,7 +1845,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '闊',
 'exif-imagelength' => '高',
 'exif-bitspersample' => '每像素byte數',
@@ -1994,7 +1959,7 @@ $1',
 'exif-gpsdatestamp' => 'GPS日期',
 'exif-gpsdifferential' => 'GPS差動修正',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '冇壓縮',
 
 'exif-unknowndate' => '未知嗰日期',
@@ -2246,7 +2211,6 @@ $3
 'version-variables' => '變量',
 'version-other' => '別嗰',
 'version-mediahandlers' => '媒體處理程序',
-'version-extension-functions' => '擴展功能',
 'version-parser-extensiontags' => '解析器擴展標籤',
 'version-hook-name' => '鉤子名',
 'version-hook-subscribedby' => '訂閱人',
@@ -2256,11 +2220,6 @@ $3
 'version-software' => '裝正嗰軟件',
 'version-software-version' => '版本',
 
-# Special:FilePath
-'filepath' => '文件路徑',
-'filepath-page' => '文件：',
-'filepath-submit' => '路徑',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => '文件名:',
 'fileduplicatesearch-submit' => '尋',
diff --git a/languages/messages/MessagesGd.php b/languages/messages/MessagesGd.php
index 158115b7..a65a09d6 100644
--- a/languages/messages/MessagesGd.php
+++ b/languages/messages/MessagesGd.php
@@ -65,9 +65,6 @@ $messages = array(
 'tog-shownumberswatching' => "Nochd àireamh nan cleachdaichean a tha a' cumail sùil air",
 'tog-oldsig' => 'An t-earr-sgrìobhadh làithreach:',
 'tog-fancysig' => 'Làimhsich an t-earr-sgrìobhadh mar wikitext (gun cheangal leis fhèin)',
-'tog-externaleditor' => "Cleachd deasaichear on taobh a-muigh a ghnàth (do shàr-eòlaichean a-mhàin, feumaidh seo roghainnean sònraichte air a' choimpiutair agad [//www.mediawiki.org/wiki/Manual:External_editors Barrachd fiosrachaidh.])",
-'tog-externaldiff' => "Cleachd diff on taobh a-muigh a ghnàth (do shàr-eòlaichean a-mhàin, feumaidh seo roghainnean sònraichte air a' choimpiutair agad. [//www.mediawiki.org/wiki/Manual:External_editors Barrachd fiosrachaidh.])",
-'tog-showjumplinks' => 'Cuir an comas ceanglaichean so-inntrigeachd "gearr leum gu"',
 'tog-uselivepreview' => 'Cleachd an ro-shealladh beò (feumaidh seo JavaScript) (deuchainneach)',
 'tog-forceeditsummary' => "Cuir ceist nuair a dh'fhàgas mi gearr-chunntas an deasachaidh bàn",
 'tog-watchlisthideown' => 'Falaich mo mhùthaidhean fhèin air mo chlàr-faire',
@@ -80,6 +77,7 @@ $messages = array(
 'tog-diffonly' => 'Na seall susbaint nan duilleagan fo na diofaichean',
 'tog-showhiddencats' => 'Seall na roinnean falaichte',
 'tog-norollbackdiff' => 'Na dèan diof às dèidh roiligeadh air ais',
+'tog-useeditwarning' => 'Thoir rabhadh dhomh ma bhios mi an impis duilleag deasachaidh fhàgail mus do shàbhail mi na mùthaidhean agam',
 
 'underline-always' => 'An-còmhnaidh',
 'underline-never' => 'Na dèan seo idir',
@@ -267,7 +265,7 @@ $1",
 'pool-queuefull' => 'Tha ciutha nam pròiseasan làn',
 'pool-errorunknown' => 'Mearachd neo-aithnichte',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Mu dhèidhinn {{SITENAME}}',
 'aboutpage' => 'Project:Mu dhèidhinn',
 'copyright' => 'Tha susbaint ri làimh fo $1.',
@@ -277,7 +275,6 @@ $1",
 'disclaimers' => 'Aithrisean-àichidh',
 'disclaimerpage' => 'Project:Aithris-àichidh choitcheann',
 'edithelp' => 'Cobhair deasachaidh',
-'edithelppage' => 'Help:Deasachadh',
 'helppage' => 'Help:Susbaint',
 'mainpage' => 'Prìomh dhuilleag',
 'mainpage-description' => 'Prìomh dhuilleag',
@@ -355,17 +352,6 @@ Gheibh thu liosta nan duilleagan sònraichte 's dligheach aig [[Special:SpecialP
 # General errors
 'error' => 'Mearachd',
 'databaseerror' => 'Mearachd an stòir-dhàta',
-'dberrortext' => 'Thachair mearachd co-chàraidh rè iarrtas an stòir-dhàta.
-Faodaidh gu bheil seo a\' comharrachadh mearachd sa bhathar-bhog.
-Seo iarrtas an stòir-dhàta mu dheireadh a chaidh feuchainn ris:
-<blockquote><code>$1</code></blockquote>
-o bhroinn an fhoincsein "<code>$2</code>".
-Thill an stòr-dàta a\' mhearachd "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Thachair mearachd co-chàraidh rè iarrtas an stòir-dhàta.
-Seo iarrtas an stòir-dhàta mu dheireadh a chaidh feuchainn ris:
-"$1"
-o bhroinn an fhoincsein "$2".
-Thill an stòr-dàta a\' mhearachd "$3: $4"',
 'laggedslavemode' => "'''Rabhadh:''' Faodaidh nach eil ùrachaidhean a rinneadh o chionn ghoirid a' nochdadh san duilleag.",
 'readonly' => 'Stòr-dàta glaiste',
 'enterlockreason' => "Cuir a-steach adhbhar a' ghlais, a' gabhail a-steach tuairmeas air fuasgladh a' ghlais.",
@@ -421,7 +407,6 @@ Feuch ris a-rithist às a dhèidh seo.",
 'editinginterface' => "'''Rabhadh:''' Tha thu a' deasachadh duilleag a tha 'ga chleachdadh a chum teacsa eadar-aghaidh a sholar airson a' bhathar-bhog.
 Ma dh'atharraicheas tu an duilleag seo, bidh buaidh ann air coltas na h-eadar-aghaidh mar a chì càch e air an uicipeid seo.
 Gus eadar-theangachadh atharrachadh no a chur ris airson gach uicipeid, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
-'sqlhidden' => "(Iarrtas SQL 'ga fhalach)",
 'cascadeprotected' => 'Chaidh an duilleag seo a dhìon o dheasachadh a chionn \'s gu bheil e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a chaidh an dìon \'s an roghainn "mar eas" air:
 $2',
 'namespaceprotected' => "Chan eil cead agad duilleagan san namespace '''$1''' a dheasachadh.",
@@ -453,7 +438,6 @@ Na dìochuimhnich na [[Special:Preferences|roghainnean agad air {{SITENAME}}]] a
 'yourpassword' => 'Am facal-faire agad',
 'yourpasswordagain' => 'Ath-sgrìobh facal-faire',
 'remembermypassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|làithean|latha}})",
-'securelogin-stick-https' => 'Glèidh an ceangal ri HTTPS as dèidh logadh a-steach',
 'yourdomainname' => 'An àrainn-lìn agad:',
 'password-change-forbidden' => 'Chan urrainn dhut faclan-faire atharrachadh air an uicipeid seo.',
 'externaldberror' => 'Thachair mearachd le dearbhadh an stòir-dhàta air neo chan eil cead agad an cunntas agad air an taobh a-muigh ùrachadh.',
@@ -561,7 +545,7 @@ Gus an clàradh a-steach a choileadh, tha agad ri facal-faire ùr a shuidheachad
 'newpassword' => 'Facal-faire ùr',
 'retypenew' => 'Ath-sgrìobh am facal-faire ùr',
 'resetpass_submit' => "Suidhich am facal-faire 's clàraich a-steach",
-'resetpass_success' => "Chaidh am facal-faire agad atharrachadh!
+'changepassword-success' => "Chaidh am facal-faire agad atharrachadh!
 'Gad chlàradh a-steach an-dràsta...",
 'resetpass_forbidden' => 'Cha ghabh na faclan-faire atharrachadh',
 'resetpass-no-info' => 'Feumaidh tu clàradh a-steach mus dèan thu inntrigeadh dìreach dhan duilleag seo.',
@@ -573,10 +557,8 @@ Saoil an do dh'atharraich thu am facal-faire agad mu thràth no an do dh'iarr th
 
 # Special:PasswordReset
 'passwordreset' => 'Ath-shuidhich am facal-faire',
-'passwordreset-text' => 'Lìon am foirm seo gus am facal-faire agad ath-shuidheachadh.',
 'passwordreset-legend' => 'Ath-shuidhich am facal-faire',
 'passwordreset-disabled' => 'Chaidh ath-shuidheachadh nam faclan-faire a chur à comas air an uicipeid seo.',
-'passwordreset-pretext' => '{{PLURAL:$1||Cuir a-steach aon dhe na pìosan dàta gu h-ìosal}}',
 'passwordreset-username' => 'Ainm-cleachdaiche:',
 'passwordreset-domain' => 'Àrainn-lìn:',
 'passwordreset-capture' => "A bheil thu airson coimhead air a' phost-d?",
@@ -599,7 +581,7 @@ Bu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma
 Facal-faire sealach: $2',
 'passwordreset-emailsent' => 'Chaidh post-d airson ath-shuidheachadh an fhacail-fhaire a chur.',
 'passwordreset-emailsent-capture' => 'Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a chur agus chì thu sin gu h-ìosal.',
-'passwordreset-emailerror-capture' => "Chaidh cuimhneachan a chur air a' phost-d agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
+'passwordreset-emailerror-capture' => "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a ghintinn agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Atharraich am post-d',
@@ -826,6 +808,8 @@ Tha e ann mu thràth.",
 'content-failed-to-parse' => "Dh'fhàillig parsadh susbaint $2 airson modail $1: $3",
 'invalid-content-data' => 'Dàta susbaint a tha mì-dhligheach',
 'content-not-allowed-here' => 'Chan eil susbaint "$1" ceadaichte air an duilleag [[$2]]',
+'editwarning-warning' => 'Ma dh\'fhàgas tu an duilleag seo, faodaidh gun caill thu mùthadh sam bith a rinn thu.
+Ma tha thu air logadh a-steach, \'s urrainn dhut an rabhadh seo a chur dheth san roinn "Deasachadh" sna roghainnean agad.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -941,7 +925,6 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 'searchmenu-legend' => 'Roghainnean luirg',
 'searchmenu-exists' => "'''Tha duilleag air a bheil \"[[:\$1]]\" air an uicipeid seo.'''",
 'searchmenu-new' => "'''Cruthaich an duilleag \"[[:\$1]]\" air an uicipeid seo!'''",
-'searchhelp-url' => 'Help:Cuideachadh',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Rùraich duilleagan aig a bheil an ro-leasachan seo]]',
 'searchprofile-articles' => 'Duilleagan susbainte',
 'searchprofile-project' => "Duilleagan nan cobharach 's nam pròiseactan",
@@ -986,15 +969,6 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
 'S urrainn dhut lorg a dhèanamh air Google san eadar-àm.
 Faodaidh gum bi inneacsan susbaint {{SITENAME}} tuilleadh 's sean ge-tà.",
 
-# Quickbar
-'qbsettings' => 'Grad-bhàr',
-'qbsettings-none' => 'Chan eil gin',
-'qbsettings-fixedleft' => 'Socraichte air an taobh chlì',
-'qbsettings-fixedright' => 'Socraichte air an taobh deas',
-'qbsettings-floatingleft' => 'Air fleòd air an taobh chlì',
-'qbsettings-floatingright' => 'Air fleòd air an taobh deas',
-'qbsettings-directionality' => 'Socraichte a-rèir comhair sgriobt do chànain',
-
 # Preferences page
 'preferences' => 'Roghainnean',
 'mypreferences' => 'Na roghainnean agam',
@@ -1023,7 +997,6 @@ Faodaidh gum bi inneacsan susbaint {{SITENAME}} tuilleadh 's sean ge-tà.",
 'resetprefs' => 'Falamhaich atharrachaidhean nach deach a shàbhaladh fhathast',
 'restoreprefs' => 'Aisig na roghainnean bunaiteach uile',
 'prefs-editing' => "A' deasachadh",
-'prefs-edit-boxsize' => 'Meud uinneag an deasachaidh.',
 'rows' => 'Sreathan',
 'columns' => 'Colbhan',
 'searchresultshead' => 'Lorg',
@@ -1050,7 +1023,6 @@ Faodaidh gum bi inneacsan susbaint {{SITENAME}} tuilleadh 's sean ge-tà.",
 'prefs-common-css-js' => 'CSS/JavaScript ann an coitcheann do gach craiceann:',
 'prefs-reset-intro' => "'S urrainn dhut bun-roghainnean na làraich ath-shuidheachadh air an duilleag seo. Cha ghabh seo a neo-dhèanamh.",
 'prefs-emailconfirm-label' => 'Dearbhadh puist-d:',
-'prefs-textboxsize' => 'Meud na h-uinneige deasachaidh',
 'youremail' => 'Post-dealain:',
 'username' => '{{GENDER:$1|Ainm-cleachdaiche}}:',
 'uid' => "ID {{GENDER:$1|a' chleachdaiche}}:",
@@ -1187,7 +1159,6 @@ Chan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.
 'recentchangeslinked-feed' => 'Mùthaidhean buntainneach',
 'recentchangeslinked-toolbox' => 'Mùthaidhean buntainneach',
 'recentchangeslinked-title' => 'Mùthaidhean co-cheangailte ri "$1"',
-'recentchangeslinked-noresult' => 'Cha dàinig atharrachadh air duilleag cho-cheangailte am broinn na h-ùine a thagh thu.',
 'recentchangeslinked-summary' => "Seo liosta nam mùthaidhean a chaidh a chur air duilleagan a tha a' ceangal o dhuilleag shònraichte (no ri buill de roinn shònraichte).
 Tha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean '''troma'''.",
 'recentchangeslinked-page' => 'Ainm na duilleige:',
@@ -1246,8 +1217,6 @@ Chithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu
 # Statistics
 'statistics' => 'Staitistearachd',
 
-'disambiguationspage' => 'Template:ciallan',
-
 'doubleredirects' => 'Ath-seòlaidhean dùbailte',
 
 'brokenredirects' => 'Ath-stiùireidhean briste',
@@ -1334,9 +1303,8 @@ Nochdaidh mùthaidhean a nithear air an duilleag seo \'s air an duilleag deasbai
 'unwatch' => 'Na cum sùil tuilleadh',
 'unwatchthispage' => 'Na cum sùil tuilleadh',
 'notanarticle' => 'Chan e duilleag susbaint a tha ann',
-'watchnochange' => "Cha deach na duilleagan air d' fhaire a dheasachadh anns a' chuairt ùine taisbeanta.",
 'watchlist-details' => 'Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air do chlàr-faire, gun luaidh air na duilleagan deasbaireachd.',
-'wlheader-showupdated' => "* Tha clò '''trom''' air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
+'wlheader-showupdated' => "Tha clò '''trom''' air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
 'watchmethod-recent' => "A' sgrùdadh deasachaidhean ùra airson duilleagan air d' fhaire",
 'watchmethod-list' => "A' sgrùdadh duilleagan air d' fhaire airson deasachaidhean ùra",
 'watchlistcontains' => 'Tha $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}} air do chlàr-faire.',
@@ -1482,7 +1450,6 @@ Seo roghainnean làithreach na duilleige '''$1''':",
 'block-log-flags-nocreate' => 'cruthachadh de chunntasan ùra à comas',
 'ipb_expiry_invalid' => 'Tha an t-àm-crìochnachaidh mì-dhligheach.',
 'ip_range_invalid' => 'Raon IP neo-iomchaidh.',
-'proxyblocksuccess' => 'Dèanta.',
 
 # Developer tools
 'lockdb' => 'Glais an stòr-dàta',
diff --git a/languages/messages/MessagesGl.php b/languages/messages/MessagesGl.php
index c752cbdc..a170f929 100644
--- a/languages/messages/MessagesGl.php
+++ b/languages/messages/MessagesGl.php
@@ -95,6 +95,7 @@ $specialPageAliases = array(
 	'Filepath'                  => array( 'Ruta_do_ficheiro' ),
 	'Import'                    => array( 'Importar' ),
 	'Invalidateemail'           => array( 'Invalidar_o_enderezo_de_correo_electrónico' ),
+	'JavaScriptTest'            => array( 'Proba_do_JavaScript' ),
 	'BlockList'                 => array( 'Lista_de_bloqueos', 'Lista_dos_bloqueos_a_enderezos_IP' ),
 	'LinkSearch'                => array( 'Buscar_ligazóns_web' ),
 	'Listadmins'                => array( 'Lista_de_administradores' ),
@@ -111,6 +112,7 @@ $specialPageAliases = array(
 	'MIMEsearch'                => array( 'Procura_MIME' ),
 	'Mostcategories'            => array( 'Páxinas_con_máis_categorías' ),
 	'Mostimages'                => array( 'Ficheiros_máis_ligados' ),
+	'Mostinterwikis'            => array( 'Páxinas_con_máis_interwikis' ),
 	'Mostlinked'                => array( 'Páxinas_máis_ligadas' ),
 	'Mostlinkedcategories'      => array( 'Categorías_máis_ligadas' ),
 	'Mostlinkedtemplates'       => array( 'Modelos_máis_ligados' ),
@@ -122,6 +124,7 @@ $specialPageAliases = array(
 	'Myuploads'                 => array( 'As_miñas_subidas' ),
 	'Newimages'                 => array( 'Imaxes_novas' ),
 	'Newpages'                  => array( 'Páxinas_novas' ),
+	'PagesWithProp'             => array( 'Páxinas_con_propiedades' ),
 	'PasswordReset'             => array( 'Restablecer_o_contrasinal' ),
 	'PermanentLink'             => array( 'Ligazón_permanente' ),
 	'Popularpages'              => array( 'Páxinas_populares' ),
@@ -133,6 +136,7 @@ $specialPageAliases = array(
 	'Randomredirect'            => array( 'Redirección_aleatoria' ),
 	'Recentchanges'             => array( 'Cambios_recentes' ),
 	'Recentchangeslinked'       => array( 'Cambios_relacionados' ),
+	'Redirect'                  => array( 'Redirección' ),
 	'Revisiondelete'            => array( 'Revisións_borradas' ),
 	'Search'                    => array( 'Procurar' ),
 	'Shortpages'                => array( 'Páxinas_curtas' ),
@@ -279,9 +283,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostrar o número de usuarios que están a vixiar',
 'tog-oldsig' => 'Sinatura actual:',
 'tog-fancysig' => 'Tratar a sinatura como se fose texto wiki (sen ligazón automática)',
-'tog-externaleditor' => 'Usar un editor externo por defecto (só para expertos; cómpre configurar o computador. [//www.mediawiki.org/wiki/Manual:External_editors Máis información.])',
-'tog-externaldiff' => 'Usar as diferenzas externas por defecto (só para expertos; cómpre configurar o computador. [//www.mediawiki.org/wiki/Manual:External_editors Máis información.])',
-'tog-showjumplinks' => 'Permitir as ligazóns de accesibilidade "ir a"',
 'tog-uselivepreview' => 'Usar a vista previa en tempo real (experimental)',
 'tog-forceeditsummary' => 'Avisádeme cando o campo resumo estea baleiro',
 'tog-watchlisthideown' => 'Agochar as edicións propias na lista de vixilancia',
@@ -295,6 +296,8 @@ $messages = array(
 'tog-showhiddencats' => 'Mostrar as categorías ocultas',
 'tog-noconvertlink' => 'Desactivar a conversión dos títulos de ligazón',
 'tog-norollbackdiff' => 'Omitir as diferenzas despois de levar a cabo unha reversión de edicións',
+'tog-useeditwarning' => 'Avisádeme cando deixe unha páxina de edición cos cambios sen gardar',
+'tog-prefershttps' => 'Utilizar unha conexión segura sempre que acceda ao sistema',
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Nunca',
@@ -358,6 +361,18 @@ $messages = array(
 'oct' => 'out',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1 de xaneiro',
+'february-date' => '$1 de febreiro',
+'march-date' => '$1 de marzo',
+'april-date' => '$1 de abril',
+'may-date' => '$1 de maio',
+'june-date' => '$1 de xuño',
+'july-date' => '$1 de xullo',
+'august-date' => '$1 de agosto',
+'september-date' => '$1 de setembro',
+'october-date' => '$1 de outubro',
+'november-date' => '$1 de novembro',
+'december-date' => '$1 de decembro',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoría|Categorías}}',
@@ -439,6 +454,7 @@ $messages = array(
 'create-this-page' => 'Crear esta páxina',
 'delete' => 'Borrar',
 'deletethispage' => 'Borrar esta páxina',
+'undeletethispage' => 'Restaurar esta páxina',
 'undelete_short' => 'Restaurar {{PLURAL:$1|unha edición|$1 edicións}}',
 'viewdeleted_short' => 'Ver {{PLURAL:$1|unha edición borrada|$1 edicións borradas}}',
 'protect' => 'Protexer',
@@ -482,7 +498,7 @@ $1',
 'pool-queuefull' => 'A cola está chea',
 'pool-errorunknown' => 'Erro descoñecido',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Acerca de {{SITENAME}}',
 'aboutpage' => 'Project:Acerca de',
 'copyright' => 'Todo o contido está dispoñible baixo a licenza $1, agás que se indique o contrario.',
@@ -492,7 +508,6 @@ $1',
 'disclaimers' => 'Advertencias',
 'disclaimerpage' => 'Project:Advertencia xeral',
 'edithelp' => 'Axuda de edición',
-'edithelppage' => 'Help:Como editar unha páxina',
 'helppage' => 'Help:Axuda',
 'mainpage' => 'Portada',
 'mainpage-description' => 'Portada',
@@ -569,17 +584,12 @@ Pode atopar unha lista coas páxinas especiais válidas en [[Special:SpecialPage
 # General errors
 'error' => 'Erro',
 'databaseerror' => 'Erro na base de datos',
-'dberrortext' => 'Ocorreu un erro de sintaxe na consulta á base de datos.
-Isto pódese deber a un erro no software.
-A última consulta á base de datos foi:
-<blockquote><code>$1</code></blockquote>
-desde a función "<code>$2</code>".
-A base de datos devolveu o erro "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ocorreu un erro de sintaxe na consulta.
-A última consulta á base de datos foi:
-"$1"
-desde a función "$2".
-A base de datos devolveu o erro "$3: $4"',
+'databaseerror-text' => 'Produciuse un erro na pescuda na base de datos.
+Isto pode ser indicativo dun erro no software.',
+'databaseerror-textcl' => 'Produciuse un erro na pescuda na base de datos.',
+'databaseerror-query' => 'Pescuda: $1',
+'databaseerror-function' => 'Función: $1',
+'databaseerror-error' => 'Erro: $1',
 'laggedslavemode' => "'''Aviso:''' A páxina pode non conter as actualizacións recentes.",
 'readonly' => 'Base de datos pechada',
 'enterlockreason' => 'Dea unha razón para o peche, incluíndo unha estimación de até cando se manterá',
@@ -613,6 +623,7 @@ Se cadra, xa a borrou alguén.',
 'cannotdelete-title' => 'Non se pode borrar a páxina "$1"',
 'delete-hook-aborted' => 'O borrado foi abortado polo asociador.
 Este non deu ningunha explicación.',
+'no-null-revision' => 'Non se puido crear a nova revisión nula para a páxina "$1"',
 'badtitle' => 'Título incorrecto',
 'badtitletext' => 'O título da páxina pedida non era válido, estaba baleiro ou proviña dunha ligazón interlingüística ou interwiki incorrecta.
 Poida que conteña un ou máis caracteres dos que non se poden empregar nos títulos.',
@@ -635,12 +646,15 @@ Para engadir ou modificar as traducións en todos os wikis utilice [//translatew
 'editinginterface' => "'''Aviso:''' Está editando unha páxina usada para fornecer o texto da interface do software.
 Os cambios nesta páxina afectarán á aparencia da interface dos outros usuarios do wiki.
 Para engadir ou modificar as traducións en todos os wikis utilice [//translatewiki.net/wiki/Main_Page?setlang=gl translatewiki.net], o proxecto de localización de MediaWiki.",
-'sqlhidden' => '(Procura SQL agochada)',
 'cascadeprotected' => 'Esta páxina foi protexida fronte á edición debido a que está incluída {{PLURAL:$1|na seguinte páxina protexida, que ten|nas seguintes páxinas protexidas, que teñen}} a "protección en serie" activada:
 $2',
 'namespaceprotected' => "Non ten os permisos necesarios para modificar páxinas no espazo de nomes '''$1'''.",
 'customcssprotected' => 'Non ten os permisos necesarios para modificar esta páxina de CSS, dado que contén a configuración persoal doutro usuario.',
 'customjsprotected' => 'Non ten os permisos necesarios para modificar esta páxina de JavaScript, dado que contén a configuración persoal doutro usuario.',
+'mycustomcssprotected' => 'Non ten os permisos necesarios para editar esta páxina de CSS.',
+'mycustomjsprotected' => 'Non ten os permisos necesarios para editar esta páxina de JavaScript.',
+'myprivateinfoprotected' => 'Non ten os permisos necesarios para editar a súa información privada.',
+'mypreferencesprotected' => 'Non ten os permisos necesarios para editar as súas preferencias.',
 'ns-specialprotected' => 'Non se poden editar as páxinas no espazo de nomes "{{ns:special}}".',
 'titleprotected' => "Este título foi protexido da creación por [[User:$1|$1]].
 O motivo achegado é ''$2''.",
@@ -665,10 +679,19 @@ Teña en conta que algunhas páxinas poden continuar aparecendo como se aínda e
 'welcomecreation-msg' => 'A súa conta foi creada correctamente.
 Non esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENAME}}]].',
 'yourname' => 'Nome de usuario:',
+'userlogin-yourname' => 'Nome de usuario',
+'userlogin-yourname-ph' => 'Insira o seu nome de usuario',
+'createacct-another-username-ph' => 'Insira o nome de usuario',
 'yourpassword' => 'Contrasinal:',
+'userlogin-yourpassword' => 'Contrasinal',
+'userlogin-yourpassword-ph' => 'Insira o seu contrasinal',
+'createacct-yourpassword-ph' => 'Insira un contrasinal',
 'yourpasswordagain' => 'Insira o contrasinal outra vez:',
+'createacct-yourpasswordagain' => 'Confirme o contrasinal',
+'createacct-yourpasswordagain-ph' => 'Insira o contrasinal outra vez',
 'remembermypassword' => 'Lembrar o meu contrasinal neste ordenador (ata $1 {{PLURAL:$1|día|días}})',
-'securelogin-stick-https' => 'Permanecer conectado mediante as HTTPS despois de acceder',
+'userlogin-remembermypassword' => 'Manter a miña conexión',
+'userlogin-signwithsecure' => 'Utilizar a conexión segura',
 'yourdomainname' => 'O seu dominio:',
 'password-change-forbidden' => 'Non pode mudar os contrasinais neste wiki.',
 'externaldberror' => 'Ou ben se produciu un erro da base de datos na autenticación externa ou ben non se lle permite actualizar a súa conta externa.',
@@ -680,18 +703,44 @@ Non esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENA
 'logout' => 'Saír ao anonimato',
 'userlogout' => 'Saír ao anonimato',
 'notloggedin' => 'Non accedeu ao sistema',
+'userlogin-noaccount' => 'Non está rexistrado?',
+'userlogin-joinproject' => 'Únase a {{SITENAME}}',
 'nologin' => 'Non está rexistrado? $1.',
 'nologinlink' => 'Cree unha conta',
 'createaccount' => 'Crear unha conta nova',
 'gotaccount' => 'Xa ten unha conta? $1.',
 'gotaccountlink' => 'Acceda ao sistema',
 'userlogin-resetlink' => 'Esqueceu os seus datos de rexistro?',
+'userlogin-resetpassword-link' => 'Restablecer o seu contrasinal',
+'helplogin-url' => 'Help:Rexistro',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Axuda co rexistro]]',
+'userlogin-loggedin' => 'Xa accedeu ao sistema como {{GENDER:$1|$1}}.
+Utilice o formulario inferior para acceder como outro usuario.',
+'userlogin-createanother' => 'Crear outra conta',
+'createacct-join' => 'Insira a súa información embaixo.',
+'createacct-another-join' => 'Insira a información da nova conta embaixo.',
+'createacct-emailrequired' => 'Enderezo de correo electrónico',
+'createacct-emailoptional' => 'Enderezo de correo electrónico (opcional)',
+'createacct-email-ph' => 'Insira o seu enderezo de correo electrónico',
+'createacct-another-email-ph' => 'Insira o enderezo de correo electrónico',
 'createaccountmail' => 'Utilizar un contrasinal aleatorio temporal e envialo ao enderezo de correo electrónico especificado',
+'createacct-realname' => 'Nome real (opcional)',
 'createaccountreason' => 'Motivo:',
+'createacct-reason' => 'Motivo',
+'createacct-reason-ph' => 'Por que crea outra conta?',
+'createacct-captcha' => 'Comprobación de seguridade',
+'createacct-imgcaptcha-ph' => 'Insira o texto que ve enriba',
+'createacct-submit' => 'Crear a conta',
+'createacct-another-submit' => 'Crear outra conta',
+'createacct-benefit-heading' => 'Xente coma vostede elabora {{SITENAME}}.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edición|edicións}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|páxina|páxinas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|colaborador recente|colaboradores recentes}}',
 'badretype' => 'Os contrasinais que inseriu non coinciden.',
 'userexists' => 'O nome de usuario que inseriu xa está en uso.
 Escolla un nome diferente.',
 'loginerror' => 'Erro ao acceder ao sistema',
+'createacct-error' => 'Erro ao crear a conta',
 'createaccounterror' => 'Non se puido crear a conta: $1',
 'nocookiesnew' => 'A conta de usuario foi creada, pero non accedeu ao sistema.
 {{SITENAME}} para rexistrar os usuarios.
@@ -758,11 +807,13 @@ Debe acceder ao sistema e mudar o contrasinal agora.
 
 Pode facer caso omiso desta mensaxe se se creou esta conta por erro.',
 'usernamehasherror' => 'O nome de usuario non pode conter cancelos ("#")',
-'login-throttled' => 'Fixo demasiados intentos de inserir o contrasinal.
-Por favor, agarde antes de probar outra vez.',
+'login-throttled' => 'Fixo demasiados intentos de acceder ao sistema.
+Por favor, agarde $1 antes de probar outra vez.',
 'login-abort-generic' => 'Acceso ao sistema incorrecto; abortado',
 'loginlanguagelabel' => 'Lingua: $1',
 'suspicious-userlogout' => 'Rexeitouse a súa petición de saír do sistema porque semella que a enviou un navegador roto ou a caché dun proxy.',
+'createacct-another-realname-tip' => 'O nome real é opcional.
+Se escolle dalo utilizarase para atribuír ao usuario o seu traballo.',
 
 # Email sending
 'php-mail-error-unknown' => 'Erro descoñecido na función mail() do PHP.',
@@ -778,8 +829,7 @@ Por favor, agarde antes de probar outra vez.',
 'newpassword' => 'Contrasinal novo:',
 'retypenew' => 'Insira outra vez o novo contrasinal:',
 'resetpass_submit' => 'Establecer o contrasinal e acceder ao sistema',
-'resetpass_success' => 'O seu contrasinal modificouse correctamente!
-Accedendo ao sistema...',
+'changepassword-success' => 'O seu contrasinal modificouse correctamente!',
 'resetpass_forbidden' => 'Non se poden mudar os contrasinais',
 'resetpass-no-info' => 'Debe rexistrarse para acceder directamente a esta páxina.',
 'resetpass-submit-loggedin' => 'Cambiar o contrasinal',
@@ -791,10 +841,11 @@ Pode ser que xa cambiase o seu contrasinal ou que solicitase un novo contrasinal
 
 # Special:PasswordReset
 'passwordreset' => 'Restablecer o contrasinal',
-'passwordreset-text' => 'Encha este formulario para restablecer o seu contrasinal.',
+'passwordreset-text-one' => 'Encha este formulario para restablecer o seu contrasinal.',
+'passwordreset-text-many' => '{{PLURAL:$1|Encha un dos campos para restablecer o seu contrasinal.}}',
 'passwordreset-legend' => 'Restablecer o contrasinal',
 'passwordreset-disabled' => 'O restablecemento de contrasinais está desactivado neste wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduza un dos datos a continuación}}',
+'passwordreset-emaildisabled' => 'As funcións do correo electrónico están desactivadas neste wiki.',
 'passwordreset-username' => 'Nome de usuario:',
 'passwordreset-domain' => 'Dominio:',
 'passwordreset-capture' => 'Quere ollar o correo electrónico?',
@@ -825,7 +876,7 @@ ignore esta mensaxe e continúe empregando o seu contrasinal vello.',
 Contrasinal temporal: $2',
 'passwordreset-emailsent' => 'Enviouse o correo electrónico de restablecemento do contrasinal.',
 'passwordreset-emailsent-capture' => 'Enviouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación.',
-'passwordreset-emailerror-capture' => 'Xerouse un correo electrónico recordatorio, mostrado a continuación, pero o envío ao usuario fallou: $1',
+'passwordreset-emailerror-capture' => 'Xerouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación, pero o envío {{GENDER:$2|ao usuario|á usuaria}} fallou: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Cambiar o enderezo de correo electrónico',
@@ -839,6 +890,19 @@ Contrasinal temporal: $2',
 'changeemail-submit' => 'Cambiar o correo electrónico',
 'changeemail-cancel' => 'Cancelar',
 
+# Special:ResetTokens
+'resettokens' => 'Restablecer os pases',
+'resettokens-text' => 'Aquí pode restablecer os pases que permiten acceder a certos datos privados asociados á súa conta.
+
+Debería facelo se os compartiu accidentalmente con alguén ou se a súa conta foi comprometida.',
+'resettokens-no-tokens' => 'Non hai ningún pase que restablecer.',
+'resettokens-legend' => 'Restablecer os pases',
+'resettokens-tokens' => 'Pases:',
+'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => 'Pase para a fonte de novas (Atom/RSS) web dos [[Special:Watchlist|cambios feitos nas páxinas da súa lista de vixilancia]]',
+'resettokens-done' => 'Restablecéronse os pases.',
+'resettokens-resetbutton' => 'Restablecer os pases seleccionados',
+
 # Edit page toolbar
 'bold_sample' => 'Texto en negra',
 'bold_tip' => 'Texto en negra',
@@ -1037,12 +1101,15 @@ Este non deu ningunha explicación.',
 Semella que foi borrada.',
 'edit-conflict' => 'Conflito de edición.',
 'edit-no-change' => 'A súa edición foi ignorada dado que non fixo ningún cambio no texto.',
+'postedit-confirmation' => 'Gardouse a súa edición.',
 'edit-already-exists' => 'Non se pode crear a nova páxina.
 Esta xa existe.',
 'defaultmessagetext' => 'Texto predeterminado',
 'content-failed-to-parse' => 'Erro ao analizar o contido de "$2" para o modelo de $1: $3',
 'invalid-content-data' => 'Datos de contido inválidos',
 'content-not-allowed-here' => 'O contido "$1" non está permitido na páxina "[[$2]]"',
+'editwarning-warning' => 'Deixar esta páxina pode causar a perda de calquera cambio feito.
+Se accedeu ao sistema, pode desactivar esta mensaxe de advertencia na sección "Edición" das súas preferencias.',
 
 # Content models
 'content-model-wikitext' => 'texto wiki',
@@ -1078,6 +1145,7 @@ Comprobe a comparación que aparece a continuación para confirmar que isto é o
 'undo-failure' => 'Non se pode desfacer a edición debido a un conflito con algunha das edicións intermedias.',
 'undo-norev' => 'A edición non se pode desfacer porque non existe ou foi eliminada.',
 'undo-summary' => 'Desfíxose a edición $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]])',
+'undo-summary-username-hidden' => 'Desfíxose a edición $1 dun usuario agochado',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Non pode crear unha conta de usuario',
@@ -1257,6 +1325,7 @@ Asegúrese de que esta modificación da páxina mantén a continuidade históric
 'compareselectedversions' => 'Comparar as versións seleccionadas',
 'showhideselectedversions' => 'Mostrar/Agochar as versións seleccionadas',
 'editundo' => 'desfacer',
+'diff-empty' => '(Sen diferenzas)',
 'diff-multi' => '(Non se {{PLURAL:$1|mostra unha revisión|mostran $1 revisións}} do historial {{PLURAL:$1|feita|feitas}} por {{PLURAL:$2|un usuario|$2 usuarios}}.)',
 'diff-multi-manyusers' => '(Non se {{PLURAL:$1|mostra unha revisión|mostran $1 revisións}} do historial {{PLURAL:$1|feita|feitas}} por máis {{PLURAL:$2|dun usuario|de $2 usuarios}}.)',
 'difference-missing-revision' => 'Non se {{PLURAL:$2|atopou revisión ningunha|atoparon $2 revisións}} desta diferenza ($1).
@@ -1284,7 +1353,6 @@ O [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrad
 'searchmenu-legend' => 'Opcións de busca',
 'searchmenu-exists' => "* Páxina \"'''[[\$1]]'''\"",
 'searchmenu-new' => "'''Crear a páxina \"[[:\$1]]\" neste wiki!'''",
-'searchhelp-url' => 'Help:Contidos',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navegue polas páxinas que comezan coas mesmas iniciais]]',
 'searchprofile-articles' => 'Páxinas de contido',
 'searchprofile-project' => 'Páxinas do proxecto e de axuda',
@@ -1328,15 +1396,7 @@ Probe a fixar a súa petición con ''all:'' para procurar en todo o contido (inc
 'searchdisabled' => 'As procuras en {{SITENAME}} están deshabilitadas por cuestións de rendemento.
 Mentres tanto pode procurar usando o Google.
 Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados.',
-
-# Quickbar
-'qbsettings' => 'Opcións da barra rápida',
-'qbsettings-none' => 'Ningunha',
-'qbsettings-fixedleft' => 'Fixa á esquerda',
-'qbsettings-fixedright' => 'Fixa á dereita',
-'qbsettings-floatingleft' => 'Flotante á esquerda',
-'qbsettings-floatingright' => 'Flotante á dereita',
-'qbsettings-directionality' => 'Fixa, segundo a dirección de escritura da súa lingua',
+'search-error' => 'Produciuse un erro durante a procura: $1',
 
 # Preferences page
 'preferences' => 'Preferencias',
@@ -1370,7 +1430,6 @@ Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados
 'resetprefs' => 'Eliminar os cambios non gardados',
 'restoreprefs' => 'Restaurar todas as preferencias por defecto (en todas as seccións)',
 'prefs-editing' => 'Edición',
-'prefs-edit-boxsize' => 'Tamaño da caixa de edición.',
 'rows' => 'Filas:',
 'columns' => 'Columnas:',
 'searchresultshead' => 'Procurar',
@@ -1381,9 +1440,9 @@ Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados
 'recentchangesdays-max' => 'Máximo: $1 {{PLURAL:$1|día|días}}',
 'recentchangescount' => 'Número de edicións a mostrar por defecto:',
 'prefs-help-recentchangescount' => 'Isto inclúe os cambios recentes, os historiais e mais os rexistros.',
-'prefs-help-watchlist-token' => 'Ao encher este campo cunha clave secreta xerarase unha fonte de novas RSS para a súa lista de vixilancia.
-Calquera que saiba esta clave poderá ler a súa lista de vixilancia, así que escolla un valor seguro.
-Velaquí un valor xerado ao chou que pode usar: $1',
+'prefs-help-watchlist-token2' => 'Esta é a clave secreta da fonte de novas web para a súa lista de vixilancia.
+Calquera persoa que a saiba poderá ler a súa lista de vixilancia; non comparta esta clave.
+[[Special:ResetTokens|Prema aquí se necesita restablecela]].',
 'savedprefs' => 'Gardáronse as súas preferencias.',
 'timezonelegend' => 'Zona horaria:',
 'localtime' => 'Hora local:',
@@ -1414,7 +1473,6 @@ Velaquí un valor xerado ao chou que pode usar: $1',
 'prefs-reset-intro' => 'Pode usar esta páxina para restablecer as súas preferencias ás que veñen dadas por defecto.
 Este cambio non se poderá desfacer.',
 'prefs-emailconfirm-label' => 'Confirmación do correo:',
-'prefs-textboxsize' => 'Tamaño da caixa de edición',
 'youremail' => 'Correo electrónico:',
 'username' => 'Nome de {{GENDER:$1|usuario|usuaria}}:',
 'uid' => 'ID de {{GENDER:$1|usuario|usuaria}}:',
@@ -1448,6 +1506,8 @@ Se escolle dalo utilizarase para atribuírlle o seu traballo.',
 'prefs-dateformat' => 'Formato da data',
 'prefs-timeoffset' => 'Desprazamento horario',
 'prefs-advancedediting' => 'Opcións xerais',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Vista previa',
 'prefs-advancedrc' => 'Opcións avanzadas',
 'prefs-advancedrendering' => 'Opcións avanzadas',
 'prefs-advancedsearchoptions' => 'Opcións avanzadas',
@@ -1455,7 +1515,9 @@ Se escolle dalo utilizarase para atribuírlle o seu traballo.',
 'prefs-displayrc' => 'Opcións de visualización',
 'prefs-displaysearchoptions' => 'Opcións de visualización',
 'prefs-displaywatchlist' => 'Opcións de visualización',
+'prefs-tokenwatchlist' => 'Pase',
 'prefs-diffs' => 'Diferenzas',
+'prefs-help-prefershttps' => 'Esta preferencia ha aplicarse no seu vindeiro acceso ao sistema.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'O enderezo de correo electrónico semella válido',
@@ -1482,6 +1544,8 @@ Se escolle dalo utilizarase para atribuírlle o seu traballo.',
 'userrights-notallowed' => 'Non dispón dos permisos necesarios para asignar ou retirar dereitos de usuario.',
 'userrights-changeable-col' => 'Os grupos que pode cambiar',
 'userrights-unchangeable-col' => 'Os grupos que non pode cambiar',
+'userrights-conflict' => 'Hai un conflito na modificación dos dereitos de usuario! Por favor, revíseo e confirme os seus cambios.',
+'userrights-removed-self' => 'Retirou correctamente os seus propios dereitos. Polo tanto, xa non ten acceso a esta páxina.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1547,11 +1611,19 @@ Se escolle dalo utilizarase para atribuírlle o seu traballo.',
 'right-proxyunbannable' => 'Evitar os bloqueos autamáticos a proxies',
 'right-unblockself' => 'Desbloquearse a si mesmo',
 'right-protect' => 'Cambiar os niveis de protección e editar páxinas protexidas coa opción "protección en serie"',
-'right-editprotected' => 'Editar páxinas protexidas (que non teñan protección en serie)',
+'right-editprotected' => 'Editar páxinas protexidas con "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Editar páxinas protexidas con "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Editar a interface de usuario',
 'right-editusercssjs' => 'Editar os ficheiros CSS e JavaScript doutros usuarios',
 'right-editusercss' => 'Editar os ficheiros CSS doutros usuarios',
 'right-edituserjs' => 'Editar os ficheiros JavaScript doutros usuarios',
+'right-editmyusercss' => 'Editar os ficheiros CSS propios',
+'right-editmyuserjs' => 'Editar os ficheiros JavaScript propios',
+'right-viewmywatchlist' => 'Ver a lista de vixilancia propia',
+'right-editmywatchlist' => 'Editar a lista de vixilancia propia. Teña en conta que algunhas accións engadirán páxinas igualmente mesmo sen este dereito.',
+'right-viewmyprivateinfo' => 'Ver os datos privados propios (por exemplo, o enderezo de correo electrónico ou o nome real)',
+'right-editmyprivateinfo' => 'Editar os datos privados propios (por exemplo, o enderezo de correo electrónico ou o nome real)',
+'right-editmyoptions' => 'Editar as preferencias propias',
 'right-rollback' => 'Reverter rapidamente as edicións do último usuario que editou unha páxina en particular',
 'right-markbotedits' => 'Marcar as edicións desfeitas como edicións dun bot',
 'right-noratelimit' => 'Non ser afectado polos límites de frecuencia',
@@ -1613,12 +1685,19 @@ Se escolle dalo utilizarase para atribuírlle o seu traballo.',
 'action-userrights-interwiki' => 'editar os permisos de usuario dos usuarios doutros wikis',
 'action-siteadmin' => 'bloquear ou desbloquear a base de datos',
 'action-sendemail' => 'enviar correos electrónicos',
+'action-editmywatchlist' => 'editar a súa lista de vixilancia',
+'action-viewmywatchlist' => 'ver a súa lista de vixilancia',
+'action-viewmyprivateinfo' => 'ver a súa información privada',
+'action-editmyprivateinfo' => 'editar a súa información privada',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|modificación|modificacións}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|desde a última visita}}',
+'enhancedrc-history' => 'historial',
 'recentchanges' => 'Cambios recentes',
 'recentchanges-legend' => 'Opcións dos cambios',
 'recentchanges-summary' => 'Nesta páxina pode seguir as modificacións máis recentes feitas no wiki.',
+'recentchanges-noresult' => 'Non se produciron cambios que coincidisen con eses criterios durante o período especificado.',
 'recentchanges-feed-description' => 'Nesta fonte de novas pode seguir as modificacións máis recentes feitas no wiki.',
 'recentchanges-label-newpage' => 'Esta edición creou unha nova páxina',
 'recentchanges-label-minor' => 'Esta é unha edición pequena',
@@ -1655,7 +1734,6 @@ Se escolle dalo utilizarase para atribuírlle o seu traballo.',
 'recentchangeslinked-feed' => 'Cambios relacionados',
 'recentchangeslinked-toolbox' => 'Cambios relacionados',
 'recentchangeslinked-title' => 'Cambios relacionados con "$1"',
-'recentchangeslinked-noresult' => 'Non se produciron cambios nas páxinas vinculadas a esta durante o período de tempo seleccionado.',
 'recentchangeslinked-summary' => "Esta é unha lista dos cambios que se realizaron recentemente nas páxinas vinculadas a esta (ou nos membros da categoría especificada).
 As páxinas da súa [[Special:Watchlist|lista de vixilancia]] aparecen en '''negra'''.",
 'recentchangeslinked-page' => 'Nome da páxina:',
@@ -1667,7 +1745,7 @@ As páxinas da súa [[Special:Watchlist|lista de vixilancia]] aparecen en '''neg
 'reuploaddesc' => 'Cancelar a carga e volver ao formulario de carga',
 'upload-tryagain' => 'Enviar a descrición do ficheiro modificada',
 'uploadnologin' => 'Non accedeu ao sistema',
-'uploadnologintext' => 'Debe [[Special:UserLogin|acceder ao sistema]] para poder cargar ficheiros.',
+'uploadnologintext' => 'Debe $1 para poder cargar ficheiros.',
 'upload_directory_missing' => 'Falta o directorio de carga ($1) e non pode ser creado polo servidor da páxina web.',
 'upload_directory_read_only' => 'O servidor web non pode escribir no directorio de carga ($1).',
 'uploaderror' => 'Erro ao cargar',
@@ -1901,7 +1979,6 @@ Para unha seguridade óptima, img_auth.php está desactivado.',
 'http-read-error' => 'Erro de lectura HTTP.',
 'http-timed-out' => 'O pedido HTTP expirou.',
 'http-curl-error' => 'Ocorreu un erro ao acceder ao URL: $1',
-'http-host-unreachable' => 'Non se puido acceder ao URL.',
 'http-bad-status' => 'Houbo un problema durante a solicitude HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1932,6 +2009,10 @@ Tamén pode reintentalo cando haxa menos actividade.',
 'listfiles_size' => 'Tamaño',
 'listfiles_description' => 'Descrición',
 'listfiles_count' => 'Versións',
+'listfiles-show-all' => 'Incluír as versións vellas das imaxes',
+'listfiles-latestversion' => 'Versión actual',
+'listfiles-latestversion-yes' => 'Si',
+'listfiles-latestversion-no' => 'Non',
 
 # File description page
 'file-anchor-link' => 'Ficheiro',
@@ -2029,6 +2110,13 @@ Lembre verificar outras ligazóns cara aos modelos antes de borralos.',
 'randompage' => 'Páxina aleatoria',
 'randompage-nopages' => 'Non hai páxinas {{PLURAL:$2|no seguinte espazo de nomes|nos seguintes espazos de nomes}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Páxina aleatoria na categoría',
+'randomincategory-invalidcategory' => '"$1" non é un nome de categoría válido.',
+'randomincategory-nopages' => 'Non hai páxinas na [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Ir a unha páxina ao chou da categoría: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Ir',
+
 # Random redirect
 'randomredirect' => 'Redirección aleatoria',
 'randomredirect-nopages' => 'Non hai redireccións no espazo de nomes "$1".',
@@ -2054,17 +2142,13 @@ Lembre verificar outras ligazóns cara aos modelos antes de borralos.',
 'statistics-users-active-desc' => 'Usuarios que teñen levado a cabo unha acción {{PLURAL:$1|no último día|nos últimos $1 días}}',
 'statistics-mostpopular' => 'Páxinas máis vistas',
 
-'disambiguations' => 'Páxinas que ligan con páxinas de homónimos',
-'disambiguationspage' => 'Template:Homónimos',
-'disambiguations-text' => "As seguintes páxinas conteñen, polo menos, unha ligazón cara a unha '''páxina de homónimos'''.
-No canto de ligar cos homónimos deben apuntar cara á páxina apropiada.<br />
-Unha páxina trátase como páxina de homónimos cando nela se usa un modelo que está ligado desde [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Páxinas cunha propiedade de páxina',
 'pageswithprop-legend' => 'Páxinas cunha propiedade de páxina',
 'pageswithprop-text' => 'Esta páxina lista aquelas páxinas que utilizan unha propiedade de páxina determinada.',
 'pageswithprop-prop' => 'Nome da propiedade:',
 'pageswithprop-submit' => 'Mostrar',
+'pageswithprop-prophidden-long' => 'agochouse o valor de propiedade de texto longo ($1)',
+'pageswithprop-prophidden-binary' => 'agochouse o valor de propiedade binaria ($1)',
 
 'doubleredirects' => 'Redireccións dobres',
 'doubleredirectstext' => 'Esta lista contén as páxinas que redirixen cara a outras páxinas de redirección.
@@ -2122,6 +2206,7 @@ As entradas <del>riscadas</del> xa foron resoltas.',
 'mostrevisions' => 'Páxinas con máis revisións',
 'prefixindex' => 'Todas as páxinas con prefixo',
 'prefixindex-namespace' => 'Todas as páxinas con prefixo (espazo de nomes $1)',
+'prefixindex-strip' => 'Quitar o prefixo na lista',
 'shortpages' => 'Páxinas curtas',
 'longpages' => 'Páxinas longas',
 'deadendpages' => 'Páxinas sen ligazóns cara a outras',
@@ -2137,6 +2222,7 @@ As entradas <del>riscadas</del> xa foron resoltas.',
 'listusers' => 'Lista de usuarios',
 'listusers-editsonly' => 'Mostrar só os usuarios con edicións',
 'listusers-creationsort' => 'Ordenar por data de creación',
+'listusers-desc' => 'Ordenar de xeito descendente',
 'usereditcount' => '$1 {{PLURAL:$1|edición|edicións}}',
 'usercreated' => '{{GENDER:$3|Creado|Creada}} o $1 ás $2',
 'newpages' => 'Páxinas novas',
@@ -2314,10 +2400,9 @@ Os cambios futuros nesta páxina e na súa páxina de conversa asociada serán l
 'unwatchthispage' => 'Deixar de vixiar',
 'notanarticle' => 'Non é unha páxina de contido',
 'notvisiblerev' => 'A revisión foi borrada',
-'watchnochange' => 'Ningún dos elementos baixo vixilancia foi editado no período de tempo indicado.',
 'watchlist-details' => 'Hai {{PLURAL:$1|unha páxina|$1 páxinas}} na súa lista de vixilancia, sen contar as de conversa.',
-'wlheader-enotif' => '* A notificación por correo electrónico está activada.',
-'wlheader-showupdated' => "* As páxinas que cambiaron desde a súa última visita móstranse en '''negra'''",
+'wlheader-enotif' => 'A notificación por correo electrónico está activada.',
+'wlheader-showupdated' => "As páxinas que cambiaron desde a súa última visita móstranse en '''negra'''.",
 'watchmethod-recent' => 'comprobando as edicións recentes na procura de páxinas vixiadas',
 'watchmethod-list' => 'comprobando as páxinas vixiadas na procura de edicións recentes',
 'watchlistcontains' => 'A súa lista de vixilancia ten $1 {{PLURAL:$1|páxina|páxinas}}.',
@@ -2570,7 +2655,7 @@ $1',
 'contributions' => 'Contribucións {{GENDER:$1|do usuario|da usuaria}}',
 'contributions-title' => 'Contribucións de $1',
 'mycontris' => 'Contribucións',
-'contribsub2' => 'De $1 ($2)',
+'contribsub2' => 'De {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Non se deron atopado cambios con eses criterios.',
 'uctop' => '(última revisión)',
 'month' => 'Desde o mes de (e anteriores):',
@@ -2725,15 +2810,13 @@ Olle a [[Special:BlockList|lista de bloqueos]] para comprobar os bloqueos vixent
 'ipb_blocked_as_range' => 'Erro: O enderezo IP $1 non está bloqueado directamente e non se pode desbloquear. Porén, está bloqueado por estar no rango $2, que si se pode desbloquear.',
 'ip_range_invalid' => 'Rango IP non válido.',
 'ip_range_toolarge' => 'Non están permitidos os rangos de bloqueo maiores que /$1.',
-'blockme' => 'Bloquearme',
 'proxyblocker' => 'Bloqueador de proxy',
-'proxyblocker-disabled' => 'Esta función está desactivada.',
 'proxyblockreason' => 'O seu enderezo IP foi bloqueado porque é un proxy aberto.
 Por favor, contacte co seu fornecedor de acceso á Internet ou co seu soporte técnico e informe deste grave problema de seguridade.',
-'proxyblocksuccess' => 'Feito.',
 'sorbsreason' => 'O seu enderezo IP está rexistrado como un proxy aberto na lista DNSBL usada por {{SITENAME}}.',
 'sorbs_create_account_reason' => 'O seu enderezo IP está rexistrado como un proxy aberto na lista DNSBL usada por {{SITENAME}}.
 Polo tanto, non pode crear unha conta',
+'xffblockreason' => 'Un enderezo IP presente na cabeceira X-Forwarded-For, ou ben seu ou ben dun servidor proxy que está utilizando, foi bloqueado. O motivo do bloqueo orixinal é: $1',
 'cant-block-while-blocked' => 'Non pode bloquear outros usuarios mentres vostede estea bloqueado.',
 'cant-see-hidden-user' => 'O usuario que intenta bloquear xa foi bloqueado e agochado. Dado que non ten o dereito necesario para agochar usuarios, non pode ver ou editar o bloqueo do usuario.',
 'ipbblocked' => 'Non pode bloquear ou desbloquear outros usuarios porque vostede está bloqueado',
@@ -2896,6 +2979,8 @@ Por favor, visite a [//www.mediawiki.org/wiki/Localisation localización MediaWi
 'thumbnail-more' => 'Ampliar',
 'filemissing' => 'O ficheiro non se dá atopado',
 'thumbnail_error' => 'Erro ao crear a miniatura: $1',
+'thumbnail_error_remote' => 'Mensaxe de erro de $1:
+$2',
 'djvu_page_error' => 'A páxina DjVu está fóra do rango',
 'djvu_no_xml' => 'Non se puido obter o XML para o ficheiro DjVu',
 'thumbnail-temp-create' => 'Non se puido crear o ficheiro de miniatura temporal',
@@ -3045,17 +3130,11 @@ Pode ver o código fonte.',
 
 # Stylesheets
 'common.css' => '/** O CSS que se coloque aquí será aplicado a todas as aparencias */',
-'standard.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Clásica */',
-'nostalgia.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Morriña */',
 'cologneblue.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Azul colonial */',
 'monobook.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Monobook */',
-'myskin.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia A miña aparencia */',
-'chick.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Parrulo */',
-'simple.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Sinxela */',
 'modern.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Moderna */',
 'vector.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Vector */',
 'print.css' => '/* O CSS que se coloque aquí afectará ás impresións */',
-'handheld.css' => '/* O CSS que se coloque aquí afectará aos dispositivos móbiles baseados na aparencia configurada en $wgHandheldStyle */',
 'noscript.css' => '/* O CSS que se coloque aquí afectará aos usuarios co JavaScript desactivado */',
 'group-autoconfirmed.css' => '/* O CSS que se coloque aquí afectará soamente aos usuarios autoconfirmados */',
 'group-bot.css' => '/* O CSS que se coloque aquí afectará soamente aos bots */',
@@ -3064,13 +3143,8 @@ Pode ver o código fonte.',
 
 # Scripts
 'common.js' => '/* Calquera JavaScript que haxa aquí será cargado para todos os usuarios en cada páxina que vexan. */',
-'standard.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Clásica */',
-'nostalgia.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Morriña */',
 'cologneblue.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Azul colonial */',
 'monobook.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia MonoBook */',
-'myskin.js' => '/* O JavaScript que se coloque aquí afectará a quen use a aparencia A miña aparencia */',
-'chick.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Parrulo */',
-'simple.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Sinxela */',
 'modern.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Moderna */',
 'vector.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Vector */',
 'group-autoconfirmed.js' => '/* Calquera JavaScript que haxa aquí será cargado soamente para os usuarios autoconfirmados */',
@@ -3150,13 +3224,8 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
 'pageinfo-category-files' => 'Número de ficheiros',
 
 # Skin names
-'skinname-standard' => 'Clásica',
-'skinname-nostalgia' => 'Morriña',
 'skinname-cologneblue' => 'Azul colonial',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'A miña aparencia',
-'skinname-chick' => 'Parrulo',
-'skinname-simple' => 'Sinxela',
 'skinname-modern' => 'Moderna',
 
 # Patrolling
@@ -3235,11 +3304,25 @@ O seu sistema pode quedar comprometido se o executa.",
 'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|$1 hora|$1 horas}}',
 'days' => '{{PLURAL:$1|$1 día|$1 días}}',
+'weeks' => '{{PLURAL:$1|$1 semana|$1 semanas}}',
 'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
 'years' => '{{PLURAL:$1|$1 ano|$1 anos}}',
 'ago' => 'hai $1',
 'just-now' => 'agora mesmo',
 
+# Human-readable timestamps
+'hours-ago' => 'hai {{PLURAL:$1|unha hora|$1 horas}}',
+'minutes-ago' => 'hai {{PLURAL:$1|un minuto|$1 minutos}}',
+'seconds-ago' => 'hai {{PLURAL:$1|un segundo|$1 segundos}}',
+'monday-at' => 'O luns ás $1',
+'tuesday-at' => 'O martes ás $1',
+'wednesday-at' => 'O mércores ás $1',
+'thursday-at' => 'O xoves ás $1',
+'friday-at' => 'O venres ás $1',
+'saturday-at' => 'O sábado ás $1',
+'sunday-at' => 'O domingo ás $1',
+'yesterday-at' => 'Onte ás $1',
+
 # Bad image list
 'bad_image_list' => 'O formato é o seguinte:
 
@@ -3268,7 +3351,7 @@ Os demais agocharanse por omisión.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ancho',
 'exif-imagelength' => 'Alto',
 'exif-bitspersample' => 'Bits por compoñente',
@@ -3446,7 +3529,7 @@ Os demais agocharanse por omisión.
 'exif-originalimageheight' => 'Altura da imaxe antes de ser cortada',
 'exif-originalimagewidth' => 'Ancho da imaxe antes de ser cortada',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sen comprimir',
 'exif-compression-2' => 'CCITT Grupo 3 Lonxitude de codificación unidimensional Huffman modificada',
 'exif-compression-3' => 'CCITT Grupo 3 codificación de fax',
@@ -3846,7 +3929,6 @@ Tamén pode [[Special:EditWatchlist|empregar o editor normal]].',
 'version-other' => 'Outros',
 'version-mediahandlers' => 'Executadores de multimedia',
 'version-hooks' => 'Asociadores',
-'version-extension-functions' => 'Funcións das extensións',
 'version-parser-extensiontags' => 'Etiquetas das extensións do analizador',
 'version-parser-function-hooks' => 'Asociadores da función do analizador',
 'version-hook-name' => 'Nome do asociador',
@@ -3855,6 +3937,7 @@ Tamén pode [[Special:EditWatchlist|empregar o editor normal]].',
 'version-license' => 'Licenza',
 'version-poweredby-credits' => "Este wiki está desenvolvido por '''[//www.mediawiki.org/wiki/MediaWiki/gl MediaWiki]''', dereitos de autor © 2001-$1 $2.",
 'version-poweredby-others' => 'outros',
+'version-poweredby-translators' => 'os tradutores de translatewiki.net',
 'version-credits-summary' => 'Queremos recoñecer as seguintes persoas polas súas achegas a [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki é software libre; pode redistribuílo e/ou modificalo segundo os termos da licenza pública xeral GNU publicada pola Free Software Foundation; versión 2 ou (na súa escolla) calquera outra posterior.
 
@@ -3870,12 +3953,17 @@ Debería recibir [{{SERVER}}{{SCRIPTPATH}}/COPYING unha copia da licenza públic
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Ruta dos artigos]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Ruta das escrituras]',
 
-# Special:FilePath
-'filepath' => 'Ruta do ficheiro',
-'filepath-page' => 'Ficheiro:',
-'filepath-submit' => 'Ir',
-'filepath-summary' => 'Esta páxina especial devolve a ruta completa dun ficheiro.
-As imaxes móstranse na súa resolución completa; outros tipos de ficheiros inícianse directamente co seu programa asociado.',
+# Special:Redirect
+'redirect' => 'Redirixir por nome de ficheiro, ID de usuario ou ID de revisión',
+'redirect-legend' => 'Redirixir a un ficheiro ou unha páxina',
+'redirect-summary' => 'Esta páxina especial redirixe cara a un ficheiro (dado o nome), unha páxina (dado o ID dunha revisión) ou unha páxina de usuario (dado o ID dun usuario).',
+'redirect-submit' => 'Continuar',
+'redirect-lookup' => 'Procurar:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'ID de usuario',
+'redirect-revision' => 'Revisión de páxina',
+'redirect-file' => 'Nome de ficheiro',
+'redirect-not-exists' => 'Non se atopou o valor',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Procurar ficheiros duplicados',
@@ -3924,12 +4012,16 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros in
 'tags' => 'Etiquetas de cambios válidas',
 'tag-filter' => 'Filtrar as [[Special:Tags|etiquetas]]:',
 'tag-filter-submit' => 'Filtro',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)',
 'tags-title' => 'Etiquetas',
 'tags-intro' => 'Esta páxina lista as etiquetas coas que o software pode marcar unha edición, e mailos seus significados.',
 'tags-tag' => 'Nome da etiqueta',
 'tags-display-header' => 'Aparición nas listas de cambios',
 'tags-description-header' => 'Descrición completa do significado',
+'tags-active-header' => 'Activa?',
 'tags-hitcount-header' => 'Edicións etiquetadas',
+'tags-active-yes' => 'Si',
+'tags-active-no' => 'Non',
 'tags-edit' => 'editar',
 'tags-hitcount' => '$1 {{PLURAL:$1|modificación|modificacións}}',
 
@@ -3950,6 +4042,7 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros in
 'dberr-problems' => 'Sentímolo! Este sitio está experimentando dificultades técnicas.',
 'dberr-again' => 'Por favor, agarde uns minutos e logo probe a cargar de novo a páxina.',
 'dberr-info' => '(Non se pode conectar co servidor da base de datos: $1)',
+'dberr-info-hidden' => '(Non se pode conectar co servidor da base de datos)',
 'dberr-usegoogle' => 'Mentres tanto, pode probar a buscar co Google.',
 'dberr-outofdate' => 'Teña en conta que os índices de Google do noso contido poden non estar actualizados.',
 'dberr-cachederror' => 'O seguinte contido é unha copia da memoria caché da páxina solicitada, polo que pode non estar actualizada.',
@@ -3965,6 +4058,9 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros in
 'htmlform-submit' => 'Enviar',
 'htmlform-reset' => 'Desfacer os cambios',
 'htmlform-selectorother-other' => 'Outro',
+'htmlform-no' => 'Non',
+'htmlform-yes' => 'Si',
+'htmlform-chosen-placeholder' => 'Seleccione unha opción',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con soporte para procuras de texto completo',
@@ -4082,4 +4178,19 @@ En caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario
 # Image rotation
 'rotate-comment' => 'Imaxe rotada $1 {{PLURAL:$1|grao|graos}} en sentido horario',
 
+# Limit report
+'limitreport-title' => 'Datos do perfil do analizador:',
+'limitreport-cputime' => 'Tempo de uso da CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-walltime' => 'Tempo real de uso',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-ppvisitednodes' => 'Número de nodos do preprocesador visitados',
+'limitreport-ppgeneratednodes' => 'Número de nodos do preprocesador xerados',
+'limitreport-postexpandincludesize' => 'Tamaño de inclusión logo da expansión',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Tamaño dos argumentos do modelo',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => 'Máxima profundidade de expansión',
+'limitreport-expensivefunctioncount' => 'Número de funcións de análise custosas',
+
 );
diff --git a/languages/messages/MessagesGn.php b/languages/messages/MessagesGn.php
index 8c13c250..08e925cb 100644
--- a/languages/messages/MessagesGn.php
+++ b/languages/messages/MessagesGn.php
@@ -540,11 +540,6 @@ Reomĩsérõ ta'ãnga peteĩ kuatiaroguépe, eipuru peteĩ joaju:
 # Special:Version
 'version' => "Mba'ereko",
 
-# Special:FilePath
-'filepath' => 'Ruta de archivo',
-'filepath-page' => 'Archivo:',
-'filepath-submit' => 'Ruta',
-
 # Special:SpecialPages
 'specialpages' => 'Kuatiarogue hekochĩchĩva',
 
diff --git a/languages/messages/MessagesGrc.php b/languages/messages/MessagesGrc.php
index bd030445..f1161fd4 100644
--- a/languages/messages/MessagesGrc.php
+++ b/languages/messages/MessagesGrc.php
@@ -67,9 +67,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Δεικνύναι τὸν ἀριθμὸν τῶν παρακολουθούντων χρωμένων',
 'tog-oldsig' => 'Προθεώρησις τῆς ὑπαρχούσης ὑπογραφῆς:',
 'tog-fancysig' => 'Ἀκατέργασται ὑπογραφαί ἐν εἴδει βικι-κειμένου (ἄνευ αὐτομάτου συνδέσμου)',
-'tog-externaleditor' => 'Χρῆσθαι ἐξωτέρῳ προγράμματι ἐπεξεργασίας κειμένων κατὰ προεπιλογήν (πρὸς εἰδικοὺς μόνον· ἀπαραίτητοι εἰσὶν εἰδικαὶ ῥυθμίσεις τινὲς ἐν τῇ σῇ ὑπολογιστικῇ μηχανῇ)',
-'tog-externaldiff' => 'Χρῆσθαι ἐξωτέρῳ λογισμικῷ ἀντιπαραβολῆς κατὰ προεπιλογὴν (πρὸς εἰδικοὺς μόνον· ἀπαραίτητοι εἰσὶν εἰδικαὶ ῥυθμίσεις τινες ἐν τῇ σῇ ὑπολογιστικῇ μηχανῇ)',
-'tog-showjumplinks' => 'Ἐνεργοποιεῖν τοὺς "ἅλμα πρὸς" συνδέσμους προσβασιμότητος',
 'tog-uselivepreview' => 'Χρῆσθαι ἀμέσῳ προθεωρήσει (JavaScript) (Πειραστικόν)',
 'tog-forceeditsummary' => 'Προμήνυσόν με εἰ εἰσάγω κενὴν σύνοψιν μεταγραφῆς',
 'tog-watchlisthideown' => 'Οὐ δηλοῦν τὰς ἐμὰς μεταβολὰς ἐν τοῖς ἐφορωμένοις μου',
@@ -263,7 +260,7 @@ $1',
 'pool-queuefull' => 'Δεξαμενὴ δεδομένων πλήρης',
 'pool-errorunknown' => 'Ἄγνωστον σφάλμα',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Περὶ {{SITENAME}}',
 'aboutpage' => 'Project:Περὶ',
 'copyright' => 'Ἡ διάθεσις τοῦδε περιεχομένου ἐστιν ὑπὸ $1.',
@@ -273,7 +270,6 @@ $1',
 'disclaimers' => 'Ἀποποιήσεις',
 'disclaimerpage' => 'Project:Γενικὴ ἀποποίησις',
 'edithelp' => 'Βοήθεια περὶ τοῦ μεταγράφειν',
-'edithelppage' => 'Help:Βοήθεια περὶ τοῦ μεταγράφειν',
 'helppage' => 'Help:Περιεχόμενα',
 'mainpage' => 'Κυρία Δέλτος',
 'mainpage-description' => 'Κυρία Δέλτος',
@@ -345,17 +341,6 @@ $1',
 # General errors
 'error' => 'Σφάλμα',
 'databaseerror' => 'Σφάλμα βάσεως δεδομένων',
-'dberrortext' => 'Σφάλμα τι συντάξεως πεύσεως τινὸς πρὸς τὴν βάσιν δεδομένων ἀπήντησεν,
-ὅπερ ὑποδηλοῖ τὴν ὕπαρξιν βλάβης τινὸς ἐν τῷ λογισμικῷ.
-Ἡ ἐσχάτη ἀποπειραθεῖσα πεῦσις πρὸς τὴν βάσιν δεδομένων ἦν:
-<blockquote><tt>$1</tt></blockquote>
-ὑπὸ τῆς συναρτήσεως "<tt>$2</tt>".
-Ἡ βάσις δεδομένων ἐπέστρεψεν σφάλμα "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Σφάλμα τι συντάξεως πεύσεως τινὸς πρὸς τὴν βάσιν δεδομένων ἀπήντησεν.
-Ἡ ὑστάτη ἀπόπειρα πεύσεως πρὸς τὴν βάσιν δεδομένων ἦτο:
-"$1"
-ὑπὸ τῆς συναρτήσεως "$2".
-Ἡ βάσις δεδομένων ἐπέστρεψεν σφάλμα "$3: $4"',
 'laggedslavemode' => 'Προσοχή: Ἡ δέλτος ἐνδέχεται οὐ περιέχειν προσφάτους μεταβολάς.',
 'readonly' => 'Βάσις δεδομένων ἀποκεκλεισμένη',
 'enterlockreason' => 'Λέγε διὰ τὶ τὸ ἀποκλῄειν τε καὶ ὅτε τοῦτο ἀρθήσεται',
@@ -396,7 +381,6 @@ $1',
 'protectedpagetext' => 'Ἥδε ἡ δέλτος ἀποκεκλῃμένη ἐστὶν εἰς ἀποτροπὴν τοῦ μεταγράφειν.',
 'viewsourcetext' => 'Ἔξεστί σοι ὁρᾶν τε καὶ ἀντιγράφειν τὴν τῆς δέλτου πηγήν:',
 'protectedinterface' => 'Ἥδε ἡ δέλτος παρέχει κείμενον διεπιφανείας διὰ τὸ λογισμικὸν καὶ κεκλῃσμένη ἐστὶ προς ἀποφυγὴν καταχρήσεων.',
-'sqlhidden' => '(πεῦσις SQL κεκρυμμένη)',
 'cascadeprotected' => 'Ἥδε ἡ δέλτος πεφύλακται, διότι συμπεριλαμβάνεται ἐν {{PLURAL:$1|τῇ ἑξῆς δέλτῳ ἥπερ πεφυλαγμένη ἐστὶ|ταῖς ἑξῆς δέλτοις αἵπερ πεφυλαγμέναι εἰσὶ}} μέσῳ τῆς ἐνεργοποιηθεῖσας διαδοχικῆς προστασίας ἐν τῷ:
 $2',
 'namespaceprotected' => "Οὐκ ἔξεστί σοι μεταγράφειν δέλτους ἐν τῷ ὀνοματείῳ '''$1'''.",
@@ -487,7 +471,7 @@ $2',
 'newpassword' => 'Νέον σύνθημα:',
 'retypenew' => 'Ἀνατύπωσις νέου συνθήματος:',
 'resetpass_submit' => 'Ἀναδιορισμὸς συνθήματος καὶ σύνδεσις',
-'resetpass_success' => 'Τὸ σὸν σύνθημα εὖ μεταβεβλημένον ἐστίν! Νῦν συνδέῃ...',
+'changepassword-success' => 'Τὸ σὸν σύνθημα εὖ μεταβεβλημένον ἐστίν! Νῦν συνδέῃ...',
 'resetpass_forbidden' => 'Οὐκ ἔξεστι τοῖς συνθήμασιν ἀλλαγῆναι',
 'resetpass-no-info' => 'Ἐὰν μὴ συνδέῃ οὐκ ἔξεστί σοι εὐθέως δεῦρο βαίνειν.',
 'resetpass-submit-loggedin' => 'Ἀλλάττειν σύνθημα',
@@ -798,7 +782,6 @@ $1",
 'searchmenu-legend' => 'Ἐπιλογαὶ ζητήσεως',
 'searchmenu-exists' => "'''Ὑπάρχει δέλτος τις ὀνόματι \"[[:\$1]]\" ἐν τῷδε τῷ βίκι'''",
 'searchmenu-new' => "'''Ποιεῖν τὴν δέλτον \"[[:\$1]]\" ἐν τῷδε τῷ βίκι'''",
-'searchhelp-url' => 'Help:Περιεχόμενα',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ζήτησις δέλτων ἐχουσῶν τόδε τὸ πρόθεμα]]',
 'searchprofile-articles' => 'Δέλτοι περιεχομένων',
 'searchprofile-project' => 'Βοήθεια  καὶ δέλτοι ἐγχειρήματος',
@@ -839,14 +822,6 @@ $1",
 'powersearch-togglenone' => 'Οὐδέν',
 'search-external' => 'Ἐξωτέρα ἀναζήτησις',
 
-# Quickbar
-'qbsettings' => 'Ταχεῖα πρόσβασις',
-'qbsettings-none' => 'Οὐδέν',
-'qbsettings-fixedleft' => 'Σταθερὰ ἀριστερώς',
-'qbsettings-fixedright' => 'Σταθερὰ δεξιώς',
-'qbsettings-floatingleft' => 'Πλανώμενα αριστερώς',
-'qbsettings-floatingright' => 'Πλανώμενα δεξιώς',
-
 # Preferences page
 'preferences' => 'Προαιρέσεις',
 'mypreferences' => 'Αἱ προαιρέσεις μου',
@@ -876,7 +851,6 @@ $1",
 'resetprefs' => 'Ἐκκαθαίρειν ἀσώτους ἀλλαγάς',
 'restoreprefs' => 'Ἐπανιστάναι ἁπάσας τὰς προκαθωρισμένας ῥυθμίσεις',
 'prefs-editing' => 'Τὸ μεταγράφειν',
-'prefs-edit-boxsize' => 'Μέγεθος τῆς θυρίδος μεταγραφῆς.',
 'rows' => 'Σειραί:',
 'columns' => 'Στῆλαι:',
 'searchresultshead' => 'Ζητεῖν',
@@ -914,7 +888,6 @@ $1",
 'prefs-custom-css' => 'CSS παραγγελτόν',
 'prefs-custom-js' => 'JS παραγγελτόν',
 'prefs-emailconfirm-label' => 'Ἐπιβεβαίωσις ἠλ.-διευθύνσεως:',
-'prefs-textboxsize' => 'Μέγεθος τῆς θυρίδος μεταγραφῆς',
 'youremail' => 'Ἠλεκτρονικαὶ ἐπιστολαί:',
 'username' => 'Ὄνομα χρωμένου:',
 'uid' => 'Ταυτότης χρωμένου:',
@@ -1127,7 +1100,6 @@ $1",
 'recentchangeslinked-feed' => 'Οἰκεῖαι μεταβολαί',
 'recentchangeslinked-toolbox' => 'Οἰκεῖαι μεταβολαί',
 'recentchangeslinked-title' => 'Μεταβολαὶ οἰκεῖαι "$1"',
-'recentchangeslinked-noresult' => 'Οὐδεμία ἀλλαγὴ τῶν συνδεδεμένων δέλτων ἐν τῇ δεδομένῃ χρονικῇ περιόδῳ.',
 'recentchangeslinked-summary' => "Ὅδε ἐστὶ κατάλογος τῶν νέων μεταβόλων κατὰ δέλτους συνδεδεμένας σὺν δέλτῳ τινί (ἢ κατὰ μέλη κατηγορίας τινός).
 Δέλτοι ἐν τῷ [[Special:Watchlist|καταλόγῳ ἐφορωμένων]] σου '''ἔντονοι''' εἰσίν.",
 'recentchangeslinked-page' => 'Ὄνομα δέλτου:',
@@ -1344,9 +1316,6 @@ $1",
 'statistics-users-active-desc' => 'Χρώμενοι δραστήριοι ἐν τῷ παρελθόντι μηνί {{PLURAL:$1|ἡμέρα|$1 ἡμέραι}}',
 'statistics-mostpopular' => 'Αἱ πλέον θεωρουμέναι δέλτοι',
 
-'disambiguations' => 'Σαφηνίσεως δέλτοι',
-'disambiguationspage' => 'Template:σαφήνισις',
-
 'doubleredirects' => 'Ἀναδιευθύνσεις διπλότυπαι',
 'doubleredirectstext' => 'Ἥδε ἡ δέλτος συγκαταλέγει δέλτους αἵπερ ἀνακατευθύνουσι πρὸς ἑτέρας δέλτους ἀνακατευθύνσεως. Πᾶσα σειρά περιέχει συνδέσμους πρὸς τὴν τε πρώτην καὶ τὴν τε δευτέραν δέλτον ἀνακατευθύνσεως καὶ τὸν τε προορισμὸν τῆς δευτέρας δέλτου ἀνακατευθύνσεως ἥπερ ἐστὶ συνήθως ὁ πραγματικὸς προορισμὸς τῆς ἀνακατευθύνσεως ὅπου σὲ ἔδει δεδεγμένος εἶναι. Τὰ <del>διαγεγραμμένα</del> λήμματα ἐπιλέλυνται.',
 'double-redirect-fixed-move' => 'Ἡ [[$1]] κεκίνηται, τὸ νῦν ἀναδιευθύνεται πρὸς τὴν [[$2]]',
@@ -1542,9 +1511,8 @@ $1",
 'unwatchthispage' => 'Παῦσαι τὸ ἐφορᾶν',
 'notanarticle' => 'Μὴ δέλτος χρήματος',
 'notvisiblerev' => 'Ἀναθεώρησις διαγεγραμμένη',
-'watchnochange' => 'Οὐδὲν ἐκ τῶν ἐφορωμένων τεμαχίων σου μετεγράφη τῷ δεικνυμένῳ χρόνῳ.',
 'watchlist-details' => '{{PLURAL:$1|$1 δέλτος|$1 δέλτοι}} ἐφορωμέναι, ἄνευ τῶν δέλτων διαλέξεως περιλαμβανομένων.',
-'wlheader-enotif' => '* Σύστημα εἰδήσεως μέσῳ ἠλ-ἐπιστολῶν ἐνεργόν.',
+'wlheader-enotif' => 'Σύστημα εἰδήσεως μέσῳ ἠλ-ἐπιστολῶν ἐνεργόν.',
 'watchmethod-recent' => 'ἐλέγχειν προσφάτους μεταγραφὰς περὶ ἐφορωμένων δέλτων',
 'watchmethod-list' => 'ἐλέγχειν ἐφορωμένας δέλτους περὶ μεταγραφὰς προσφάτους',
 'watchlistcontains' => 'Ἡ ἐφοροδιαλογὴ σου περιέχει $1 {{PLURAL:$1|δέλτον|δέλτους}}.',
@@ -1843,10 +1811,7 @@ $1',
 'ipb_cant_unblock' => 'Σφάλμα: Ἡ φραγὴ τῆς ID $1 οὐχ εὑρέθη.
 Εἰκότως ἀποπεφραγμένη ἤδη ἐστίν.',
 'ip_range_invalid' => 'Ἄκυρον IP-εὖρος.',
-'blockme' => 'Φράξον με',
 'proxyblocker' => 'Ἐργαλεῖον φραγῆς διακομιστῶν',
-'proxyblocker-disabled' => 'Ἥδε ἡ ἐνέργεια κατεσταλμένη εστίν.',
-'proxyblocksuccess' => 'Γενομένη.',
 'cant-block-while-blocked' => 'Οὐκ ἔξεστί σοι φράττειν ἑτέρους χρωμένους ἐν ὅσῳ πεφραγμένος εἶ.',
 
 # Developer tools
@@ -2197,7 +2162,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Πλάτος',
 'exif-imagelength' => 'Ὕψος',
 'exif-bitspersample' => 'Δυφία ἀνὰ συνιστῶσαν',
@@ -2319,7 +2284,7 @@ $1',
 'exif-label' => 'Ἐπιγραφή',
 'exif-disclaimer' => 'Ἀποποίησις εὐθύνης',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ἀσυμπίεστος',
 
 'exif-copyrighted-true' => 'Ὑποκείμενον έν δικαιώμασιν',
@@ -2602,7 +2567,6 @@ $5
 'version-other' => 'Ἄλλα',
 'version-mediahandlers' => 'Χειρισταὶ μέσων',
 'version-hooks' => 'Ἀγγύλαι',
-'version-extension-functions' => 'Ἐνέργειαι ἐπεκτάσεων',
 'version-parser-extensiontags' => 'Σἠμαντρα ἐπεκτάσεων λεξιαναλυτικοῦ προγράμματος',
 'version-parser-function-hooks' => 'Ἀγγύλαι ἐνεργειῶν λεξιαναλυτικοῦ προγράμματος',
 'version-hook-name' => 'Ὄνομα ἀγκύλης',
@@ -2614,11 +2578,6 @@ $5
 'version-software-product' => 'Προϊόν',
 'version-software-version' => 'Ἔκδοσις',
 
-# Special:FilePath
-'filepath' => 'Διαδρομὴ ἀρχείου',
-'filepath-page' => 'Ἀρχεῖον:',
-'filepath-submit' => 'Ἰέναι',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ζήτησις διπλότυπων ἀρχείων',
 'fileduplicatesearch-summary' => 'Ζητεῖν διπλότυπα ἀρχεῖα βάσει κερματιζομένων τιμῶν.',
diff --git a/languages/messages/MessagesGsw.php b/languages/messages/MessagesGsw.php
index 01ff8748..46e3e29e 100644
--- a/languages/messages/MessagesGsw.php
+++ b/languages/messages/MessagesGsw.php
@@ -16,6 +16,7 @@
  * @author MaxSem
  * @author Melancholie
  * @author MichaelFrey
+ * @author Nemo bis
  * @author Purodha
  * @author Remember the dot
  * @author Spacebirdy
@@ -162,9 +163,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Aazahl Benutzer aazeige, wo ne Syten am Aaluege sy (i den Artikelsyte, i de «letschten Änderigen» und i der Beobachtigslischte)',
 'tog-oldsig' => 'Vorschau vu dr Unterschrift:',
 'tog-fancysig' => 'Signatur as Wikitext behandle (ohni automatischi Vergleichig)',
-'tog-externaleditor' => 'Externe Editor als Standard bruche (nume fir Experte, doderzue brucht s speziälli Yystellige uf em Computer. [//www.mediawiki.org/wiki/Manual:External_editors Wyteri Informatione doderzue.])',
-'tog-externaldiff' => 'Extern Programm fir Versionsunterschid als Standard bruche (nume fir Experte, doderzue brucht s speziälli Yystellige uf em Computer. [//www.mediawiki.org/wiki/Manual:External_editors Wyteri Informatione doderzue.])',
-'tog-showjumplinks' => '«Wächsle-zu»-Links ermügleche',
 'tog-uselivepreview' => 'Live-Vorschau bruche (JavaScript) (experimentell)',
 'tog-forceeditsummary' => 'Sag mer s, wänn i s Zämmefassigsfeld läär loss',
 'tog-watchlisthideown' => 'Eigeni Änderige uf d Beobachtigslischt usblände',
@@ -178,6 +176,7 @@ $messages = array(
 'tog-showhiddencats' => 'Zeig di versteckte Kategorie',
 'tog-noconvertlink' => 'Konvertierig vum Titel deaktiviere',
 'tog-norollbackdiff' => 'Unterschid noch em Zrucksetze unterdrucke',
+'tog-useeditwarning' => 'Warn mi, wänn I ne Syte verloss mit Bearbeitige, wu nonig gspycheret sin',
 
 'underline-always' => 'immer',
 'underline-never' => 'nie',
@@ -364,7 +363,7 @@ Di maximal Wartezyt fir e Lock isch umme',
 'pool-queuefull' => 'D Warteschlang isch voll',
 'pool-errorunknown' => 'Nit bekannte Fähler',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Über {{GRAMMAR:akkusativ|{{SITENAME}}}}',
 'aboutpage' => 'Project:Über {{UCFIRST:{{GRAMMAR:akkusativ|{{SITENAME}}}}}}',
 'copyright' => 'Der Inhalt vo dere Syte stoht unter der $1.',
@@ -374,7 +373,6 @@ Di maximal Wartezyt fir e Lock isch umme',
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Rotschläg fir s Bearbeite',
-'edithelppage' => 'Help:Ändere',
 'helppage' => 'Help:Hilf',
 'mainpage' => 'Houptsyte',
 'mainpage-description' => 'Houptsyte',
@@ -451,17 +449,6 @@ Alli verfiegbare Spezialsyte sin in dr [[Special:SpecialPages|Lischt vu Spezials
 # General errors
 'error' => 'Fähler',
 'databaseerror' => 'Fähler in dr Datebank',
-'dberrortext' => 'S isch e Datebankfähler ufträtte.
-Dr Grund cha ne e Programmierfähler syy.
-Di letscht Datebankabfrog isch
-<blockquote><code>$1</code></blockquote>
-us dr Funktion „<code>$2</code>“ gsi.
-D Datebank het dr Fähler „<samp>$3: $4</samp>“ gmäldet.',
-'dberrortextcl' => 'S het e Syntaxfähler gee in dr Abfrog vu dr Datebank.
-Di letscht Datebankabfrog isch
-„$1“
-us dr Funktion „$2“ gsi.
-D Datebank het dr Fähler „$3: $4“ gmäldet.',
 'laggedslavemode' => 'Warnig: di letschte Änderige wäre u. U. nonig aazeigt!',
 'readonly' => 'Datebank isch gsperrt',
 'enterlockreason' => 'Bitte gib e Grund y, worum d Datebank soll gsperrt wäre un e Yschätzig wie lang si soll gsperrt blybe',
@@ -509,7 +496,6 @@ Abfrog: $2',
 'viewyourtext' => "Du chasch dr Quälltext vu '''Dyre Bearbeitig''' vu däre Syte aaluege un kopiere:",
 'protectedinterface' => 'In däre Syte het s Text fir s Sproch-Interface vu dr Software un si isch gsperrt, zum Missbruch z verhindre.',
 'editinginterface' => "'''Obacht:''' Du bisch e Syten am Verändere, wu zum User.Interface ghert. Wänn Du die Syte veränderesch, no änderet sich s User-Interface au fir di andere Benutzer vu däm Wiki. Fir Ibersetzige lueg bitte, eb Du doodefir s [//translatewiki.net/wiki/Main_Page?setlang=gsw Translatewiki] witt bruuche, s MediaWiki-Lokalisierigsprojäkt.",
-'sqlhidden' => '(SQL-Abfrog verschteckt)',
 'cascadeprotected' => 'Die Syte isch fir s Bearbeite gsperrt. Si isch yybunde in {{PLURAL:$1|die Syte, wu do chunnt|die Syte, wu do chemme}} , wu mit ere Kaskadesperroption gschitzt {{PLURAL:$1|isch|sin}}:
 $2',
 'namespaceprotected' => "Du hesch kei Berächtigung, die Syte im '''$1'''-Namensruum z bearbeite.",
@@ -541,7 +527,6 @@ Ochat: s cha syy, ass bstimmti Syte eso aazeigt wäre, wie wänn Du allno aagmä
 'yourpassword' => 'Passwort:',
 'yourpasswordagain' => 'Passwort no mol yygee:',
 'remembermypassword' => 'Uf däm Computer duurhaft aamälde (Maximal fir $1 {{PLURAL:$1|Tag|Täg}})',
-'securelogin-stick-https' => 'Noch em Aamälde mit HTTPS verbunde blybe',
 'yourdomainname' => 'Dyyni Domäne',
 'password-change-forbidden' => 'Du chasch uf däm Wiki kei Passwerter ändere.',
 'externaldberror' => 'Entwäder s lit e Fähler bi dr externe Authentifizierung vor, oder Du derfsch Dyy extern Benutzerkonto nid aktualisiere.',
@@ -643,7 +628,7 @@ Wänn s Benutzerkonto us Versäh aaglait woren isch, chasch die Nochricht ignori
 'newpassword' => 'Nöis Passwort',
 'retypenew' => 'Nöis Passwort (es zwöits Mal)',
 'resetpass_submit' => 'Passwort ibermittle un aamälde',
-'resetpass_success' => 'Dyy Passwort isch erfolgryych gänderet wore. Jetz chunnt d Aamäldig …',
+'changepassword-success' => 'Dyy Passwort isch erfolgryych gänderet wore. Jetz chunnt d Aamäldig …',
 'resetpass_forbidden' => 'S Passwort cha nid gänderet wäre.',
 'resetpass-no-info' => 'Du muesch Di aamälde zum uf die Syte diräkt zuegryfe z chenne.',
 'resetpass-submit-loggedin' => 'Passwort ändere',
@@ -654,10 +639,8 @@ Villicht hesch Dyy Passwort scho gänderet oder e nej temporär Passwort aagford
 
 # Special:PasswordReset
 'passwordreset' => 'Passwort zruggsetze',
-'passwordreset-text' => 'Bitte des Formular uusfille, ass De E-Mail e Erinnerig zue dr Aamäldeinformatione vu Dyym Benutzerkonto iberchunnsch.',
 'passwordreset-legend' => 'Passwort zrucksetze',
 'passwordreset-disabled' => 'S Zrucksetze vu Passwerter isch in däm Wiki deaktiviert wore.',
-'passwordreset-pretext' => '{{PLURAL:$1||Gib eis vu däne Daten aa}}',
 'passwordreset-username' => 'Benutzername:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Die E-Mail aaluege?',
@@ -893,6 +876,8 @@ Si isch schyns glescht wore.',
 'content-failed-to-parse' => 'Parse vum Inhalt $2 fir Modell $1 fählgschlaa: $3',
 'invalid-content-data' => 'Uugiltigi Inhaltsdate',
 'content-not-allowed-here' => 'Dr Inhalt „$1“ isch uf dr Syte [[$2]] nit erlaubt',
+'editwarning-warning' => 'Wänn Du die Syte verlosch, cha s syy, ass Du alli Bearbeitige verliersch, wu Du do dra gmacht hesch.
+Wänn Du aagmäldet bisch, chasch s Anzeige vu däre Warnig im „{{int:prefs-editing}}“-Beryych vu Dyyne Yystelligen abstelle.',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -1128,7 +1113,6 @@ Einzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchmenu-legend' => 'Suechoptione',
 'searchmenu-exists' => "* Syte '''[[$1]]'''",
 'searchmenu-new' => "'''[[:$1|Leg d Syte ''$1'' in dem Wiki aa!]]'''",
-'searchhelp-url' => 'Help:Hilf',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zeige alli Syte, wu mit dem Suechbegriff aafange]]',
 'searchprofile-articles' => 'Inhaltssyte',
 'searchprofile-project' => 'Hilf- un Projäktsyte',
@@ -1170,15 +1154,6 @@ Einzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'search-external' => 'Externi Suech',
 'searchdisabled' => 'D {{SITENAME}}-Suech isch deaktiviert. Du chasch mit Google sueche, s cha aber syy ass dr Suechindex vu Google fir {{SITENAME}} veraltet isch.',
 
-# Quickbar
-'qbsettings' => 'Syteleischte',
-'qbsettings-none' => 'Keini',
-'qbsettings-fixedleft' => 'Links, fescht',
-'qbsettings-fixedright' => 'Rächts, fescht',
-'qbsettings-floatingleft' => 'Links, in dr Schwebi',
-'qbsettings-floatingright' => 'Rächts, in dr Schwebi',
-'qbsettings-directionality' => 'Fescht, abhängig vu dr Schrybrichtig vu dr gwehlte Sproch',
-
 # Preferences page
 'preferences' => 'Yystellige',
 'mypreferences' => 'Yystellige',
@@ -1211,7 +1186,6 @@ Einzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'resetprefs' => 'Änderige doch nid spychere',
 'restoreprefs' => 'Alli Standardyystellige widerhärstelle',
 'prefs-editing' => 'Tekscht-Ygab',
-'prefs-edit-boxsize' => 'Gressi vum Bearbeitigsfänschter.',
 'rows' => 'Zylene',
 'columns' => 'Spaltene',
 'searchresultshead' => 'Suech-Ergäbnis',
@@ -1222,9 +1196,6 @@ Einzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'recentchangesdays-max' => '(Maximal $1 {{PLURAL:$1|Tag|Täg}})',
 'recentchangescount' => 'Aazahl vu Bearbeitige, wu standardmässig aazeigt wäre:',
 'prefs-help-recentchangescount' => 'Des umfasst d Lischt vu dr letschte Änderige, d Versionsgschicht un d Logbiecher.',
-'prefs-help-watchlist-token' => 'S Uusfille vu däm Fäld mit eme gheime Schlissel generiert e RSS-Feed fir Dyy Beobachtigslischt.
-E jede, wu dää Schlissel chännt, chaa Dyy Beobachtigslischt bschaue. Wehl wäge däm e sichere Wärt.
-Do het s e zuefellig generierte Wärt, wu du chasch bruche: $1',
 'savedprefs' => 'Dyni Ystellige sy gspycheret worde.',
 'timezonelegend' => 'Zytzone:',
 'localtime' => 'Ortszyt:',
@@ -1255,7 +1226,6 @@ Do het s e zuefellig generierte Wärt, wu du chasch bruche: $1',
 'prefs-reset-intro' => 'Du chasch die Syte verwände go d Yystellige uf dr Standard zrucksetze.
 Des cha nimmi ruckgängig gmacht wäre.',
 'prefs-emailconfirm-label' => 'E-Mail-Bstätigung:',
-'prefs-textboxsize' => 'Greßi vum Bearbeitigsfänschter',
 'youremail' => 'E-Mail-Adräss:',
 'username' => 'Benutzername:',
 'uid' => 'Benutzer-ID:',
@@ -1491,7 +1461,6 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'recentchangeslinked-feed' => 'Verlinktes prüefe',
 'recentchangeslinked-toolbox' => 'Verlinktes prüefe',
 'recentchangeslinked-title' => 'Änderigen a Sytene, wo „$1“ druf verlinkt',
-'recentchangeslinked-noresult' => 'Kener Änderigen a verlinkte Sytenen im usgwählte Zytruum.',
 'recentchangeslinked-summary' => "Die Spezialsyte zeigt d Änderige vo allne Syte, wo ei vo dir bestimmti Syte druf verlinkt, bzw. vo allne Syte, wo zu eire vo dir bestimmte Kategorie ghöre.
 Sytene, wo zu dyre [[Special:Watchlist|Beobachtigslischte]] ghöre, erschyne '''fett'''.",
 'recentchangeslinked-page' => 'Syte:',
@@ -1717,7 +1686,6 @@ Us Sicherheitsgrinde isch img_auth.php deaktiviert.',
 'http-read-error' => 'Fähler bim Läse vu HTTP.',
 'http-timed-out' => 'Uuszyt bim HTTP-Versuech.',
 'http-curl-error' => 'Fähler bim Ufsueche vu dr URL: $1',
-'http-host-unreachable' => 'URL isch nit z verwitsche',
 'http-bad-status' => 'Bi dr HTTP-Aafrog isch e Fähler ufdrätte: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1863,12 +1831,6 @@ Iberprief anderi Link zue dr Vorlage, voreb Du die leschesch.',
 'statistics-users-active-desc' => 'Benutzer mit Bearbeitige {{PLURAL:$1|in dr letschte 24 Stund|in dr letschte $1 Täg}}',
 'statistics-mostpopular' => 'Am meischte aagluegti Syte',
 
-'disambiguations' => 'Syte, wu uf Begriffsklärigssyte verlinke',
-'disambiguationspage' => 'Template:Begriffsklärig',
-'disambiguations-text' => 'Die Syte verwyyse uf e Begriffsklärigs-Syte. Sie sotte aber besser uf d Syte verwyyse, wu eigetli gmeint sin.
-
-E Syte wird as Begriffsklärigs-Syte behandlet, wänn [[MediaWiki:Disambiguationspage]] uf si verwyyst.',
-
 'doubleredirects' => 'Doppleti Wyterleitige (Redirects)',
 'doubleredirectstext' => 'Die Lischt zeigt Wyterleitige, wu uf anderi Wyterleitige verwyyse.
 In jedere Zyylete het s Link zue dr erschte un dr zwote Wyterleitig un s Ziil vu dr zwote Wyterleitig, wu normalerwys di gwinscht Ziilsyten isch. Do sott eigetli scho di erscht Wyterleitig druf zeige.
@@ -2115,10 +2077,9 @@ Wänn Du d Syte speter wider vu dr Lischt witt stryyche, deno druck eifach uf 
 'unwatchthispage' => 'Nimmi beobachte',
 'notanarticle' => 'Kei Syte',
 'notvisiblerev' => 'Version isch glescht wore',
-'watchnochange' => 'Vo den Artikle, wo du beobachtisch, isch im aazeigte Zytruum kene veränderet worde.',
 'watchlist-details' => '{{PLURAL:$1|1 Syte wird|$1 Sytene wärde}} beobachtet (Diskussionssyte nid zelt, aber ou beobachtet).',
-'wlheader-enotif' => '* Dr E-Mail-Benochrichtigungsdienscht isch aktiviert.',
-'wlheader-showupdated' => "* Syte mit Anderige, wu no nit aagluegt sin, sin '''fett''' dargstellt.",
+'wlheader-enotif' => 'Dr E-Mail-Benochrichtigungsdienscht isch aktiviert.',
+'wlheader-showupdated' => "Syte mit Anderige, wu no nit aagluegt sin, sin '''fett''' dargstellt.",
 'watchmethod-recent' => 'Iberpriefe vu dr letschte Bearbeitige fir d Beobachtigslischt',
 'watchmethod-list' => 'Iberpriefe vu dr Beobachtigslischt no letschte Bearbeitige',
 'watchlistcontains' => 'In Dyynere Beobachtigslischt het s $1 {{PLURAL:$1|Syte|Syte}}.',
@@ -2501,11 +2462,8 @@ Go d Sperri ufhebe lueg d [[Special:BlockList|Lisch vu allene aktive Sperrine]].
 'ipb_blocked_as_range' => 'Fähler: D IP-Adräss $1 isch as Teil vu dr Beryychssperri $2 indirekt gsperrt. S isch nit megli, nume $1 z entsperre.',
 'ip_range_invalid' => 'Uugiltige IP-Adrässberyych.',
 'ip_range_toolarge' => 'Adrässberyych, wu greßer sin wie /$1, sin nit erlaubt.',
-'blockme' => 'Sperr mi',
 'proxyblocker' => 'Proxy blocker',
-'proxyblocker-disabled' => 'Die Funktion isch deaktiviert.',
 'proxyblockreason' => 'Dyni IP-Adrässe isch gsperrt wore, wel si ne ufige Proxy isch. Bitte kontaktier Dyyn Internet-Provider oder Dyni Systemadministratore un informier si iber des Sicherheitsproblem.',
-'proxyblocksuccess' => 'Fertig.',
 'sorbsreason' => 'D IP-Adräss isch in dr DNSBL vu {{SITENAME}} as uffige PROXY glischtet.',
 'sorbs_create_account_reason' => 'D IP-Adräss isch in dr DNSBL vu {{SITENAME}} as uffige PROXY glischtet. S Aalege vu neije Benutzer isch nit megli.',
 'cant-block-while-blocked' => 'Du derfsch kei anderi Benutzer sperre, derwylscht Du sälber gsperrt bisch.',
@@ -2964,7 +2922,7 @@ Andri wäre standardmäßig nit aazeigt.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breiti',
 'exif-imagelength' => 'Längi',
 'exif-bitspersample' => 'Bit pro Farbkomponente',
@@ -3142,7 +3100,7 @@ Andri wäre standardmäßig nit aazeigt.
 'exif-originalimageheight' => 'Bildhechi vor em Zueschnyde',
 'exif-originalimagewidth' => 'Bildbreiti vor em Zueschnyde',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Uukomprimiert',
 'exif-compression-2' => 'CCITT Gruppe 3 1-dimensionali modifizierti Huffman-Lauflengekodierig',
 'exif-compression-3' => 'CCITT Gruppe 3 Faxkodierig',
@@ -3529,7 +3487,6 @@ Du chasch au d [[Special:EditWatchlist|Standard-Bearbeitigssyte]] bruuche.',
 'version-other' => 'Anders',
 'version-mediahandlers' => 'Medie-Handler',
 'version-hooks' => "Schnittstelle ''(Hook)''",
-'version-extension-functions' => 'Funktionsufruef',
 'version-parser-extensiontags' => "Parser-Erwyterige ''(tags)''",
 'version-parser-function-hooks' => 'Parser-Funktione',
 'version-hook-name' => 'Schnittstellename',
@@ -3551,13 +3508,6 @@ E [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopi vu dr GNU General Public-Lizänz] sott
 'version-entrypoints-header-entrypoint' => 'Yygangspunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Dateipfad',
-'filepath-page' => 'Datei:',
-'filepath-submit' => 'Gang',
-'filepath-summary' => 'Mit däre Spezialsyte losst sich dr komplett Pfad vu dr aktuälle Version vun ere Datei ohni Umwäg abfroge.
-Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gstartet.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Datei-Duplikat sueche',
 'fileduplicatesearch-summary' => 'Suech no Datei-Duplikat uf dr Grundlag vu ihrem Hash-Wärt.',
diff --git a/languages/messages/MessagesGu.php b/languages/messages/MessagesGu.php
index 85986cdb..35edb974 100644
--- a/languages/messages/MessagesGu.php
+++ b/languages/messages/MessagesGu.php
@@ -148,6 +148,8 @@ $digitTransformTable = array(
 
 $digitGroupingPattern = "##,##,###";
 
+$linkTrail = "/^([\x{0A80}-\x{0AFF}]+)(.*)$/sDu";
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'કડીઓની નીચે લીટી (અંડરલાઇન):',
@@ -179,9 +181,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ધ્યાન રાખતા સભ્યોની સંખ્યા બતાવો',
 'tog-oldsig' => 'હાલના હસ્તાક્ષર:',
 'tog-fancysig' => 'હસ્તાક્ષરનો વિકિલખાણ તરીકે ઉપયોગ કરો (સ્વચાલિત કડી વગર)',
-'tog-externaleditor' => 'બીજું એડીટર વાપરો. (ફક્ત એકસપર્ટ માટે, તમારા કમ્પ્યુટરમાં સેટીંગ્સ બદલવા પડશે. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Use external diff by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => "''આના પર જાવ'' કડીને સક્રીય કરો.",
 'tog-uselivepreview' => 'જીવંત પૂર્વદર્શન વાપરો (પ્રાયોગીક)',
 'tog-forceeditsummary' => "કોરો 'ફેરફાર સારાંશ' ઉમેરતા પહેલા મને ચેતવો",
 'tog-watchlisthideown' => "'મારી ધ્યાનસુચી'માં મે કરેલા ફેરફારો છુપાવો",
@@ -195,6 +194,8 @@ $messages = array(
 'tog-showhiddencats' => 'છુપી શ્રેણીઓ દર્શાવો',
 'tog-noconvertlink' => 'Disable link title conversion',
 'tog-norollbackdiff' => 'રોલબેક કર્યા પછીના તફાવતો છુપાવો',
+'tog-useeditwarning' => 'સાચવ્યા વગર જો હું પૃષ્ઠ છોડું તો મને ચેતવણી આપો',
+'tog-prefershttps' => 'સભ્યનામથી પ્રવેશ કર્યો હોય ત્યારે સુરક્ષિત જોડાણ (https) જ વાપરો',
 
 'underline-always' => 'હંમેશાં',
 'underline-never' => 'કદી નહિ',
@@ -258,6 +259,18 @@ $messages = array(
 'oct' => 'ઓકટો',
 'nov' => 'નવે',
 'dec' => 'ડિસે',
+'january-date' => 'જાન્યુઆરી $1',
+'february-date' => 'ફેબ્રુઆરી $1',
+'march-date' => 'માર્ચ $1',
+'april-date' => 'એપ્રિલ $1',
+'may-date' => 'મે $1',
+'june-date' => 'જુન $1',
+'july-date' => 'જુલાઈ $1',
+'august-date' => 'ઓગસ્ટ $1',
+'september-date' => 'સપ્ટેમ્બર $1',
+'october-date' => 'ઓક્ટોબર $1',
+'november-date' => 'નવેમ્બર $1',
+'december-date' => 'ડિસેમ્બર $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|શ્રેણી|શ્રેણીઓ}}',
@@ -278,7 +291,7 @@ $messages = array(
 'noindex-category' => 'અનુક્રમણિકા નહી બનાવેલા પાનાં',
 'broken-file-category' => 'ફાઇલોની ત્રૂટક કડીઓવાળાં પાનાં',
 
-'linkprefix' => '/^(.*?)((?:[a-zA-Z\\x80-\\xff]|ક્|ખ્|ગ્|ઘ્|ચ્|છ્|જ્|ઝ્|ટ્|ઠ્|ડ્|ઢ્|ણ્|ત્|થ્|દ્|ધ્|ન્|પ્|ફ્|બ્|ભ્|મ્|ય્|ર્|લ્|વ્|સ્|શ્|ષ્|હ્|ળ્|ક્ષ્|જ્ઞ્|અ|આ|ઇ|ઈ|ઉ|ઊ|એ|ઐ|ઓ|ઔ|અં|અઃ|અઁ|ઍ|ઑ|ઋ|ઁ|઼|।|્|ા|િ|ી|ુ|ૂ|ે|ૈ|ો|ૌ|ં|ઃ|ૅ|ૉ|ૃ)+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])(?<!ક્|ખ્|ગ્|ઘ્|ચ્|છ્|જ્|ઝ્|ટ્|ઠ્|ડ્|ઢ્|ણ્|ત્|થ્|દ્|ધ્|ન્|પ્|ફ્|બ્|ભ્|મ્|ય્|ર્|લ્|વ્|સ્|શ્|ષ્|હ્|ળ્|અં|અઃ|અઁ)(?<!ક્ષ્|જ્ઞ્)(?<!અ|આ|ઇ|ઈ|ઉ|ઊ|એ|ઐ|ઓ|ઔ|ઍ|ઑ|ઋ|ઁ|઼|।|્|ા|િ|ી|ુ|ૂ|ે|ૈ|ો|ૌ|ં|ઃ|ૅ|ૉ|ૃ)))(.+)$/sD',
 
 'about' => 'વિષે',
 'article' => 'લેખનું પાનું',
@@ -342,6 +355,7 @@ $messages = array(
 'create-this-page' => 'આ પાનું બનાવો.',
 'delete' => 'રદ કરો',
 'deletethispage' => 'આ પાનું હટાવો',
+'undeletethispage' => 'આ પાનું પુનર્જીવીત કરો',
 'undelete_short' => 'હટાવેલ {{PLURAL:$1|એક ફેરફાર|$1 ફેરફારો}} પરત લાવો.',
 'viewdeleted_short' => '{{PLURAL:$1|ભૂંસી નાખેલો એક|ભૂંસી નાખેલા $1}} ફેરફાર જુઓ',
 'protect' => 'સુરક્ષિત કરો',
@@ -387,7 +401,7 @@ $1',
 'pool-queuefull' => '(Pool) કતાર પૂરી ભરેલી',
 'pool-errorunknown' => 'અજ્ઞાત ત્રુટિ',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} વિષે',
 'aboutpage' => 'Project:વિષે',
 'copyright' => 'અલગથી ઉલ્લેખ ન કરાયો હોય ત્યાં સુધી માહિતી $1 હેઠળ ઉપલબ્ધ છે.',
@@ -397,7 +411,6 @@ $1',
 'disclaimers' => 'જાહેર ઇનકાર',
 'disclaimerpage' => 'Project:સામાન્ય જાહેર ઇનકાર',
 'edithelp' => 'ફેરફારો માટે મદદ',
-'edithelppage' => 'Help:ફેરફાર',
 'helppage' => 'Help:સૂચિ',
 'mainpage' => 'મુખપૃષ્ઠ',
 'mainpage-description' => 'મુખપૃષ્ઠ',
@@ -427,7 +440,6 @@ $1',
 'newmessagesdifflinkplural' => 'છેલ્લા {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
 'youhavenewmessagesmulti' => '$1 ઉપર તમારા માટે નવો સંદેશ છે.',
 'editsection' => 'ફેરફાર કરો',
-'editsection-brackets' => '[$1]',
 'editold' => 'ફેરફાર કરો',
 'viewsourceold' => 'સ્રોત જુઓ',
 'editlink' => 'ફેરફાર',
@@ -477,17 +489,12 @@ $1',
 # General errors
 'error' => 'ત્રુટિ',
 'databaseerror' => 'ડેટાબેઝ ત્રુટિ',
-'dberrortext' => 'માહિતીસંચ ને અપાયેલ શોધના સૂત્રમાં ચૂક છે.
-આ સોફ્ટવેરમાં નાની  ત્રુટિ (bug) ને લીધે હોઇ શકે.
-માહિતીસંચય પર કરાયેલ છેલ્લામાં છેલ્લી શોધ આ પ્રમાણે હતી:
-<blockquote><code>$1</code></blockquote>
-આ ફંકશન થકી  "<code>$2</code>".
-માહિતીસંચયે આપેલ ચૂકનું વિવરણ "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'માહિતીસંચ ને અપાયેલ શોધના સૂત્રમાં ચૂક છે.
-માહિતીસંચ પર કરાયેલ છેલ્લામાં છેલ્લી શોધ આ પ્રમાણે હતી:
-"$1"
-આ ફંકશન થકી "$2".
-માહિતીસંચે આપેલ ચૂકનું વિવરણ  "$3: $4"',
+'databaseerror-text' => 'ડેટાબેઝ પ્રશ્ન ક્ષતિ ઉદ્ભવી છે.
+આ કદાચ સોફ્ટવેરમાં રહેલ ખામી હોઇ શકે છે.',
+'databaseerror-textcl' => 'ડેટાબેઝ પ્રશ્ન ક્ષતિ ઉદ્ભવી છે.',
+'databaseerror-query' => 'પ્રશ્ન: $1',
+'databaseerror-function' => 'વિધેય: $1',
+'databaseerror-error' => 'ક્ષતિ: $1',
 'laggedslavemode' => 'ચેતવણી: પાનું તાજેતરના ફેરફાર ધરાવતું નથી.',
 'readonly' => 'ડેટાબેઝ સ્થગિત',
 'enterlockreason' => 'સ્થગિતતા ક્યારે દુર કરાશે તેના અંદાજ શાથે,સ્થગિત કરવાનું કારણ આપો',
@@ -543,12 +550,15 @@ Query: $2',
 'editinginterface' => "'''ચેતવણી:''' તમે જે પાનામાં ફેરફાર કરી રહ્યા છો તે પાનું સોફ્ટવેર માટે ઇન્ટરફેસ ટેક્સટ પુરી પાડે છે.
 અહીંનો બદલાવ આ વિકિ પર ઉપસ્થિત અન્ય સભ્યોના ઇન્ટરફેસનાં દેખાવ ઉપર અસરકર્તા બનશે.
 બધાંજ વિકિ માટે ભાષાંતર ઉમેરવા કે બદલવા માટે કૃપા કરી [//translatewiki.net/ translatewiki.net], મિડિયાવિકી સ્થાનિયકરણ પ્રકલ્પ, વાપરો.",
-'sqlhidden' => '(છુપી SQL ક્વેરી)',
 'cascadeprotected' => 'આ પાના પર ફેરફાર પ્રતિબંધિત છે કેમ કે આ પાનું  {{PLURAL:$1|એવું પાનું|એવા પાના}} માં શામિલ છે જેમાં અનુવર્તી (પગથિયામય)સંરક્ષણ સક્રીય છે :
 $2',
 'namespaceprotected' => "તમને '''$1''' નામાવકાશનાં પાનાંમાં ફેરફાર કરવાની પરવાનગી નથી.",
 'customcssprotected' => 'તમને આ પાનું બદલવાની પરવાનગી નથી કારણકે આ પાનામાં બીજા સભ્યની પસંદગીના સેટીંગ્સ છે.',
 'customjsprotected' => 'તમને આ JavaScript પાનું બદલવાની પરવાનગી નથી કારણકે આ પાનામાં બીજા સભ્યની પસંદગીના સેટીંગ્સ છે.',
+'mycustomcssprotected' => 'તમને આ CSS ફાઇલમાં ફેરફાર કરવાની પરવાનગી નથી.',
+'mycustomjsprotected' => 'તમને આ જાવાસ્ક્રિપ્ટ ફાઇલમાં ફેરફાર કરવાની પરવાનગી નથી.',
+'myprivateinfoprotected' => 'તમને તમારી અંગત માહિતીમાં ફેરફાર કરવાની પરવાનગી નથી.',
+'mypreferencesprotected' => 'તમને તમારી પ્રાથમિકતાઓમાં ફેરફાર કરવાની પરવાનગી નથી.',
 'ns-specialprotected' => 'ખાસ પાનાંમાં ફેરફાર ન થઇ શકે.',
 'titleprotected' => 'આ મથાળું (વિષય) [[User:$1|$1]] બનાવવા માટે સુરક્ષિત કરવામાં આવ્યો છે.
 આ માટેનું કારણ છે-- "\'\'$2\'\'".',
@@ -570,10 +580,19 @@ $2',
 'welcomecreation-msg' => 'તમારૂં ખાતું ખુલી ગયું છે.
 તમારી [[Special:Preferences|{{SITENAME}} પસંદ]] બદલવાનું ભૂલશો નહીં.',
 'yourname' => 'સભ્ય નામ:',
+'userlogin-yourname' => 'સભ્ય નામ',
+'userlogin-yourname-ph' => 'તમારૂં સભ્ય નામ દાખલ કરો',
+'createacct-another-username-ph' => 'તમારૂં સભ્યનામ દાખલ કરો',
 'yourpassword' => 'ગુપ્ત સંજ્ઞા:',
+'userlogin-yourpassword' => 'ગુપ્ત સંજ્ઞા',
+'userlogin-yourpassword-ph' => 'ગુપ્ત સંજ્ઞા લખો',
+'createacct-yourpassword-ph' => 'પાસવર્ડ દાખલ કરો',
 'yourpasswordagain' => 'ગુપ્ત સંજ્ઞા (પાસવર્ડ) ફરી લખો',
+'createacct-yourpasswordagain' => 'પાસવર્ડની ખાતરી કરો',
+'createacct-yourpasswordagain-ph' => 'પાસવર્ડ ફરીથી દાખલ કરો',
 'remembermypassword' => 'આ કોમ્યૂટર પર મારી લૉગ ઇન વિગતો ધ્યાનમાં રાખો (વધુમાં વધુ $1 {{PLURAL:$1|દિવસ|દિવસ}} માટે)',
-'securelogin-stick-https' => 'લોગ-ઈન કર્યા પછી  HTTPS સાથે જોડાયેલા રહો.',
+'userlogin-remembermypassword' => 'મને પ્રવેશિત રાખો',
+'userlogin-signwithsecure' => 'સલામત જોડાણ વાપરો',
 'yourdomainname' => 'તમારૂં ડોમેઇન:',
 'password-change-forbidden' => 'તમે આ વિકિ માટે પાસવર્ડ્સ બદલી શકતા નથી.',
 'externaldberror' => 'પ્રમાણભૂતતાની ત્રુટી આવી અથવા તમારૂ બહારનુ ખાતું અપડેટ કરવાનો અધિકાર તમને નથી.',
@@ -585,18 +604,42 @@ $2',
 'logout' => 'બહાર નીકળો',
 'userlogout' => 'બહાર નીકળો/લૉગ આઉટ',
 'notloggedin' => 'પ્રવેશ કરેલ નથી',
+'userlogin-noaccount' => 'શું તમારૂં ખાતું નથી ?',
+'userlogin-joinproject' => '{{SITENAME}} સાથે જોડાવ',
 'nologin' => "શું તમારૂં ખાતું નથી? તો નવું '''$1'''.",
 'nologinlink' => 'ખાતું ખોલો',
 'createaccount' => 'નવું ખાતું ખોલો',
 'gotaccount' => "પહેલેથી ખાતું ખોલેલું છે? '''$1'''.",
 'gotaccountlink' => 'પ્રવેશ કરો',
 'userlogin-resetlink' => 'પોતાની પ્રવેશ માહિતી ભૂલી ગયા છો?',
+'userlogin-resetpassword-link' => 'તમારી ગુપ્તસંજ્ઞા બદલો',
+'helplogin-url' => 'Help:પ્રવેશ માટે',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|પ્રવેશવા માટેની મદદ]]',
+'userlogin-createanother' => 'બીજું ખાતું બનાવો',
+'createacct-join' => 'તમારી માહિતી નીચે દાખલ કરો.',
+'createacct-another-join' => 'નવા ખાતાંની માહિતી નીચે દાખલ કરો.',
+'createacct-emailrequired' => 'ઇમેલ સરનામું',
+'createacct-emailoptional' => 'ઇમેલ સરનામું (વૈકલ્પિક)',
+'createacct-email-ph' => 'તમારું ઇમેલ સરનામું દાખલ કરો',
+'createacct-another-email-ph' => 'તમારું ઇમેલ સરનામું દાખલ કરો',
 'createaccountmail' => 'કામચલાઉ ગમે-તેમ પાસવર્ડ વાપરો અને તેને સ્પષ્ટ કરેલ ઇમેલ સરનામા પર મોકલો',
+'createacct-realname' => 'સાચું નામ (વૈકલ્પિક)',
 'createaccountreason' => 'કારણ:',
+'createacct-reason' => 'કારણ',
+'createacct-reason-ph' => 'તમે કેમ બીજું ખાતું બનાવો છો',
+'createacct-captcha' => 'સલામતી ચકાસણી',
+'createacct-imgcaptcha-ph' => 'તમે જે લખાણ જુઓ છો તે દાખલ કરો',
+'createacct-submit' => 'તમારું ખાતું બનાવો',
+'createacct-another-submit' => 'બીજું ખાતું બનાવો',
+'createacct-benefit-heading' => '{{SITENAME}} એ તમારા જેવા લોકો વડે બનાવેલ છે.',
+'createacct-benefit-body1' => '{{PLURAL:$1|ફેરફાર|ફેરફારો}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|પાનું|પાનાં}}',
+'createacct-benefit-body3' => 'તાજેતરના {{PLURAL:$1|યોગદાનકર્તા|યોગદાનકર્તાઓ}}',
 'badretype' => 'તમે દાખલ કરેલ ગુપ્તસંજ્ઞા મળતી આવતી નથી.',
 'userexists' => 'દાખલ કરેલું સભ્યનામ વપરાશમાં છે.</br>
 કૃપયા અન્ય નામ પસંદ કરો.',
 'loginerror' => 'પ્રવેશ ત્રુટિ',
+'createacct-error' => 'ખાતું બનાવવામાં ક્ષતિ આવી',
 'createaccounterror' => 'ખાતું ખોલી શકાયું નથી: $1',
 'nocookiesnew' => 'તમારુ સભ્ય ખાતું બની ગયું છે પણ તમે પ્રવેશ (લોગ ઇન) કર્યો નથી.
 
@@ -663,11 +706,13 @@ $2',
 
 જો આ ખાતુ ભુલથી બનેલું હોય તો,આ સંદેશને અવગણી શકો છો.',
 'usernamehasherror' => 'સભ્યનામમાં ગડબડિયા ચિહ્નો ન હોઈ શકે',
-'login-throttled' => 'તમે હાલમાં જ ઘણા પ્રવેશ પ્રયત્નો કર્યા.
-કૃપા કરી ફરી પ્રયાસ પહેલાં થોડી રાહ જુઓ.',
+'login-throttled' => 'તમે હાલમાં ઘણાં જ પ્રવેશ પ્રયત્નો કર્યા છે.
+કૃપા કરી ફરી પ્રયત્ન કરતાં પહેલાં $1 રાહ જુઓ.',
 'login-abort-generic' => 'તમારું પ્રવેશ નિષ્ફળ થયું - છોડી દેવાયું',
 'loginlanguagelabel' => 'ભાષા: $1',
 'suspicious-userlogout' => 'લોગ આઉટ કરવાની તમારી વિનંતિ પૂરી ન કરી શકાઇ. એમ લાગે છે કે તેને તૃટિ પામેલ બ્રાઉઝર કે પ્રોક્સી દ્વારા મોકલાઈ હતી.',
+'createacct-another-realname-tip' => 'સાચું નામ મરજીયાત છે.
+જો તમે તે આપવાનું પસંદ કરશો, તો તેનો ઉપયોગ તમે કરેલ યોગદાનનું શ્રેય આપવા માટે થશે.',
 
 # Email sending
 'php-mail-error-unknown' => 'PHPની મેલ() કામગીરીમાં અજ્ઞાત ત્રુટિ',
@@ -683,7 +728,7 @@ $2',
 'newpassword' => 'નવી ગુપ્તસંજ્ઞા:',
 'retypenew' => 'નવી ગુપ્ત સંજ્ઞા (પાસવર્ડ) ફરી લખો:',
 'resetpass_submit' => 'ગુપ્તસંજ્ઞા બદલીને પ્રવેશ કરો.',
-'resetpass_success' => 'તમારી ગુપ્તસંજ્ઞા સફળતાપૂર્વક બદલાઇ ગઇ! હવે તમે ...માં પ્રવેશ કરી શકો છો',
+'changepassword-success' => 'તમારી ગુપ્તસંજ્ઞા સફળતાપૂર્વક બદલાઇ ગઇ છે!',
 'resetpass_forbidden' => 'ગુપ્તસંજ્ઞા બદલી શકાશે નહીં',
 'resetpass-no-info' => 'બારોબાર આ પાનું જોવા માટે પ્રવેશ કરવો આવશ્યક છે.',
 'resetpass-submit-loggedin' => 'ગુપ્તસંજ્ઞા બદલો',
@@ -695,10 +740,10 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'પાસવર્ડ રીસેટ કરો',
-'passwordreset-text' => 'તમારો પાસવર્ડ બદલવા માટે આ ફોર્મ પૂરુ કરો.',
+'passwordreset-text-one' => 'તમારો પાસવર્ડ બદલવા માટે આ ફોર્મ પૂરુ કરો.',
 'passwordreset-legend' => 'પાસવર્ડ રીસેટ કરો',
 'passwordreset-disabled' => 'આ વિકી પર પાસવર્ડ રીસેટ કરવા પર પ્રતિબંધ છે.',
-'passwordreset-pretext' => '{{PLURAL: $1| | એક નીચે માહિતીના ટુકડાઓ દાખલ}}',
+'passwordreset-emaildisabled' => 'આ વિકિ પર ઇમેઇલ સગવડ બંધ છે.',
 'passwordreset-username' => 'સભ્ય નામ:',
 'passwordreset-domain' => 'ડોમેઈન:',
 'passwordreset-capture' => 'પરિણામી ઈ મેલ જોવો છે ?',
@@ -721,7 +766,7 @@ $2
 કામચલાઉ પાસવર્ડ: $2',
 'passwordreset-emailsent' => 'પાસવર્ડ બદલવાનો ઇમેલ મોકલવામાં આવ્યો છે.',
 'passwordreset-emailsent-capture' => 'પાસવર્ડ બદલવાનો ઇમેલ મોકલવામાં આવ્યો છે, જે નીચે પ્રમાણે છે.',
-'passwordreset-emailerror-capture' => 'એક સ્મૃતિપત્ર ઈ મેલ બનાવવા માં આવ્યો છે, જે આ પ્રમાણે છે, પરંતુ તે યુઝર ને મોકલવા માં નિષ્ફળ થયો છે: $1',
+'passwordreset-emailerror-capture' => 'પાસવર્ડ ફરી ગોઠવવા માટેનો ઇમેલ બનાવવામાં આવ્યો છે, જે નીચે પ્રમાણે છે, પરંતુ તે {{GENDER:$2|સભ્ય}}ને મોકલવામાં નિષ્ફળ થયો છે: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ઈ મેલ ખાતુ બદલવા માટે',
@@ -735,6 +780,16 @@ $2
 'changeemail-submit' => 'ઈ મેલ બદલો',
 'changeemail-cancel' => 'રદ કરો',
 
+# Special:ResetTokens
+'resettokens' => 'નિશાનીઓ ફરી ગોઠવો',
+'resettokens-no-tokens' => 'અહીં ફરી ગોઠવવા માટેનાં કોઇ ટોકન નથી',
+'resettokens-legend' => 'નિશાનીઓ ફરી ગોઠવો',
+'resettokens-tokens' => 'નિશાનીઓ:',
+'resettokens-token-label' => '$1 (હાલની કિંમત: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|તમારી ધ્યાનસૂચિના પાનામાં ફેરફાર ]]ની વેબ ફીડ (Atom/RSS) નિશાની',
+'resettokens-done' => 'નિશાનીઓ ફરી ગોઠવવામાં આવી.',
+'resettokens-resetbutton' => 'પસંદ કરેલ નિશાનીઓ ફરી ગોઠવો',
+
 # Edit page toolbar
 'bold_sample' => 'ઘાટા અક્ષર',
 'bold_tip' => 'ઘાટું લખાણ',
@@ -933,11 +988,14 @@ $2
 લાગે છે કોઇએ આ પાનું હટાવી દીધું છે',
 'edit-conflict' => 'સંપાદન સંઘર્ષ.',
 'edit-no-change' => 'તમારા ફેરફારો અવગણાયા, કેમકે અક્ષરકાયામાં કોઈ ફેરફારાના હતો',
+'postedit-confirmation' => 'તમે કરેલો ફેરફાર સચવાઈ ગયો છે.',
 'edit-already-exists' => 'નવું પાનું બનાવી ન શકાયું
 તે પહેલેથી હાજર છે.',
 'defaultmessagetext' => 'મૂળભૂત સંદેશ લખાણ',
 'invalid-content-data' => 'અયોગ્ય વિગત માહિતી',
 'content-not-allowed-here' => '"$1" વિગત [[$2]] પાનાં પર માન્ય નથી',
+'editwarning-warning' => 'આ પાનું છોડી દેશો તો તમારા ફેરફારો સચવાશે નહીં.
+જો તમે પ્રવેશ કરેલો હોય તો તમે આ ચેતવણીને તમારી પસંદના "ફેરફાર" વિભાગના વિકલ્પો બદલીને બંધ કરી શકો છો.',
 
 # Content models
 'content-model-wikitext' => 'વિકિલખાણ',
@@ -1148,6 +1206,7 @@ $1",
 'compareselectedversions' => 'પસંદ કરેલા સરખાવો',
 'showhideselectedversions' => 'પસંદ કરેલા બતાવો / સંતાડો',
 'editundo' => 'રદ કરો',
+'diff-empty' => '(કોઇ ભેદ નહી)',
 'diff-multi' => '{{PLURAL:$2|એક સભ્યએ કરેલું|$2 સભ્યોએ કરેલા}} ({{PLURAL:$1|વચગાળાનું એક પુનરાવર્તન દર્શાવ્યં|વચગાળાનાં $1 પુનરાવર્તનો દર્શાવ્યાં}} નથી.)',
 'diff-multi-manyusers' => '{{PLURAL:$2|એક સભ્યએ કરેલું|$2 સભ્યોએ કરેલા}} ({{PLURAL:$1|વચગાળાનું એક પુનરાવર્તન દર્શાવ્યં|વચગાળાનાં $1 પુનરાવર્તનો દર્શાવ્યાં}} નથી.)',
 
@@ -1171,7 +1230,6 @@ $1",
 'searchmenu-legend' => 'શોધ વિકલ્પો',
 'searchmenu-exists' => "''' આ વિકિ પર  \"[[:\$1]]\" નામે પાનું પહેલેથી અસ્તિત્વમાં છે.'''",
 'searchmenu-new' => "'''આ વિકિ પર \"[[:\$1]]\" નામે પાનું બનાવો!'''",
-'searchhelp-url' => 'Help:સૂચિ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|આ પૂર્વાક્ષર વાળા પાનાં જુઓ]]',
 'searchprofile-articles' => 'લેખનું પાનું',
 'searchprofile-project' => 'મદદ અને યોજના પાનું',
@@ -1215,15 +1273,7 @@ $1",
 'searchdisabled' => "{{SITENAME}} ઉપર શોધ બંધ કરી દેવામાં આવી છે.
 ત્યાં સુધી તમે ગુગલ દ્વારા શોધ કરી શકો.
 '''નોંધઃ'''{{SITENAME}}નાં તેમના (ગુગલના) ઈન્ડેક્સ જુના હોઇ શકે.",
-
-# Quickbar
-'qbsettings' => 'શીઘ્રપટ્ટ',
-'qbsettings-none' => 'કોઇપણ નહીં',
-'qbsettings-fixedleft' => 'અચળ ડાબે',
-'qbsettings-fixedright' => 'અચળ જમણે',
-'qbsettings-floatingleft' => 'ચલિત ડાબે',
-'qbsettings-floatingright' => 'ચલિત જમણે',
-'qbsettings-directionality' => 'નિશ્ચિત, તમારી ભાષા સ્ક્રિપ્ટ directionality પર આધાર રાખીને',
+'search-error' => 'શોધ કરતી વખતે ક્ષતિ આવી: $1',
 
 # Preferences page
 'preferences' => 'પસંદ',
@@ -1257,7 +1307,6 @@ $1",
 'resetprefs' => 'બીન સાચવેલ ફેરફારો સાફ કરો',
 'restoreprefs' => 'મૂળ વિકલ્પો ફરી ગોઠવો (બધાં વિભાગોમાં)',
 'prefs-editing' => 'સંપાદન',
-'prefs-edit-boxsize' => 'ફેરફાર ફલકનું માપ',
 'rows' => 'પંક્તિઓ',
 'columns' => 'સ્તંભ',
 'searchresultshead' => 'શોધો',
@@ -1268,9 +1317,6 @@ $1",
 'recentchangesdays-max' => 'મહત્તમ  $1 {{PLURAL:$1|દિવસ|દિવસો}}',
 'recentchangescount' => 'સમાન્ય પણે ફલકમાં બતાવવાના ફેરફારોની સંખ્યા',
 'prefs-help-recentchangescount' => 'આમાં તાજા ફેરફારો,  ઇતિહાસ અને લોગ શામિલ છે.',
-'prefs-help-watchlist-token' => 'ગુપ્ત સંજ્ઞા આ ખાનામાં ભરતા તમારી ધ્યાનસૂચિ માટે RSS માહિતીનું નિર્માણ થશે.
-જેની પાસે તમારી આ ગુપ્ત સંજ્ઞા હશે ત તમારી ધ્યાનસૂચિ વપરે શકશે. આથી સુરક્ષિત એવો શબ્દ પસંદ કરશો.
-તમે વાપરી શકો તેવી અસંગત રચાયેલી રીતે સંજ્ઞા અહીં અપેલ છે : $1',
 'savedprefs' => 'તમારી પસંદગી સચવાઈ ગઈ છે.',
 'timezonelegend' => 'સમય ક્ષેત્ર:',
 'localtime' => 'સ્થાનીક સમય:',
@@ -1301,7 +1347,6 @@ $1",
 'prefs-reset-intro' => 'તમી આ પાનાનો ઉપયોગ કરીને તમારા વિકલ્પો ની ગોઠવણી મૂળના વિકલ્પો સમાન ગોઠવી શકો છો.
 આને ઉલટાવી ન શકાય.',
 'prefs-emailconfirm-label' => 'ઇ-મેલ પુષ્ટી',
-'prefs-textboxsize' => 'ફેરફાર ફલકનું માપ',
 'youremail' => 'ઇ-મેઇલ:',
 'username' => '{{GENDER:$1|સભ્યનામ}}:',
 'uid' => '{{GENDER:$1|સભ્ય}} ઓળખ:',
@@ -1336,6 +1381,8 @@ HTML નાકું ચકાસો',
 'prefs-dateformat' => 'તારીખ લખવાની શૈલિ',
 'prefs-timeoffset' => 'સમય ખંડ',
 'prefs-advancedediting' => 'સામાન્ય વિકલ્પો',
+'prefs-editor' => 'સંપાદક',
+'prefs-preview' => 'પૂર્વાવલોકન',
 'prefs-advancedrc' => 'અદ્યતન વિકલ્પો',
 'prefs-advancedrendering' => 'અદ્યતન વિકલ્પો',
 'prefs-advancedsearchoptions' => 'અદ્યતન વિકલ્પો',
@@ -1343,6 +1390,7 @@ HTML નાકું ચકાસો',
 'prefs-displayrc' => 'પ્રદર્શન વિકલ્પો',
 'prefs-displaysearchoptions' => 'પ્રદર્શન વિકલ્પો',
 'prefs-displaywatchlist' => 'પ્રદર્શન વિકલ્પો',
+'prefs-tokenwatchlist' => 'નિશાની',
 'prefs-diffs' => 'ફરક',
 
 # User preference: email validation using jQuery
@@ -1435,11 +1483,17 @@ HTML નાકું ચકાસો',
 'right-proxyunbannable' => 'અવેજીના અવયંચાલિત ખંડોને ટાળો',
 'right-unblockself' => 'તમને જાતે જ અપ્રતિબંધિત કરો',
 'right-protect' => 'સંરક્ષણ સ્તર બદલો અને ધોધાકાર-સંરક્ષિત પાનાઓમાં ફેરફાર કરો.',
-'right-editprotected' => 'સંરક્ષિત પાનામાં ફેરફાર કરો (પગથિયામય સુરક્ષા વગર)',
+'right-editprotected' => 'પાનામાં "{{int:protect-level-sysop}}" તરીકે ફેરફાર કરો',
 'right-editinterface' => 'સભ્ય સંભાષણ પટલમાં ફેરફાર કરો',
 'right-editusercssjs' => 'અન્ય સભ્યોની CSS અને JavaScript ફાઇલમાં ફેરફાર કરો',
 'right-editusercss' => 'અન્ય સભ્યોની CSS ફાઇલમાં ફેરફાર કરો',
 'right-edituserjs' => 'અન્ય સભ્યોની JavaScript ફાઇલમાં ફેરફાર કરો',
+'right-editmyusercss' => 'તમારી પોતાની CSS ફાઇલોમાં ફેરફાર કરો',
+'right-editmyuserjs' => 'તમારી પોતાની જાવાસ્ક્રિપ્ટ ફાઇલોમાં ફેરફાર કરો',
+'right-viewmywatchlist' => 'તમારી પોતાની ધ્યાનસૂચી જુઓ',
+'right-viewmyprivateinfo' => 'તમારી પોતાની અંગત માહિતી જુઓ (દા.ત. ઇમેલ સરનામું, ખરું નામ)',
+'right-editmyprivateinfo' => 'તમારી પોતાની અંગત માહિતીમાં ફેરફાર કરો (દા.ત. ઇમેલ સરનામું, ખરું નામ)',
+'right-editmyoptions' => 'તમારી પોતાની પ્રાથમિકતાઓમાં ફેરફાર કરો',
 'right-rollback' => 'ચોક્કસ પાનામાં જે છેલ્લા સભ્યએ ફેરફારો કર્યાં હોય તેને ઝડપથી ઉલટાવો',
 'right-markbotedits' => 'ઉલટાવનારા અને બોટ ફેરફારો નોંધો',
 'right-noratelimit' => 'ઝડપની સીમાને કારણે અસર ન થવી જોઇએ.',
@@ -1501,9 +1555,15 @@ HTML નાકું ચકાસો',
 'action-userrights-interwiki' => 'અન્ય વિકિ પરના સભ્યોના હક્કો સંપાદિત કરો.',
 'action-siteadmin' => 'માહિતી સંચયને ઉઘાડો અને વાસો.',
 'action-sendemail' => 'ઈ-મેલ મોકલો',
+'action-editmywatchlist' => 'તમારી ધ્યાનસૂચીમાં ફેરફાર કરો',
+'action-viewmywatchlist' => 'તમારી ધ્યાનસૂચી જુઓ',
+'action-viewmyprivateinfo' => 'તમારી અંગત માહિતી જુઓ',
+'action-editmyprivateinfo' => 'તમારી અંગત માહિતીમાં ફેરફાર કરો',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|છેલ્લી મુલાકાતથી}}',
+'enhancedrc-history' => 'ઇતિહાસ',
 'recentchanges' => 'તાજા ફેરફારો',
 'recentchanges-legend' => 'હાલમાં થયેલા ફેરફારોના વિકલ્પ',
 'recentchanges-summary' => 'વિકિમાં તાજેતરમાં થયેલા ફેરફારો પર અહિંથી નજર રાખો.',
@@ -1542,7 +1602,6 @@ HTML નાકું ચકાસો',
 'recentchangeslinked-feed' => 'આની સાથે જોડાયેલા ફેરફાર',
 'recentchangeslinked-toolbox' => 'આની સાથે જોડાયેલા ફેરફાર',
 'recentchangeslinked-title' => '"$1" ને લગતા ફેરફારો',
-'recentchangeslinked-noresult' => 'સંકળાયેલાં પાનાંમાં સુચવેલા સમય દરમ્યાન કોઇ ફેરફાર થયાં નથી.',
 'recentchangeslinked-summary' => "આ એવા ફેરફારોની યાદી છે જે આ ચોક્કસ પાના (કે શ્રેણીનાં સભ્ય પાનાઓ) સાથે જોડાયેલા પાનાઓમાં તાજેતરમાં કરવામાં આવ્યા હોય.
 <br />[[Special:Watchlist|તમારી ધ્યાનસૂચિમાં]] હોય તેવા પાનાં '''ઘાટા અક્ષર'''માં વર્ણવ્યાં છે",
 'recentchangeslinked-page' => 'પાનાનું નામ:',
@@ -1554,7 +1613,7 @@ HTML નાકું ચકાસો',
 'reuploaddesc' => 'ફાઇલ ચઢાવવાનું રદ કરો અને ફાઇલ ચઢાવવાના પાના પર પાછા જાવ',
 'upload-tryagain' => 'સુધારીત ફાઇલ વર્ણન ચડાવો',
 'uploadnologin' => 'પ્રવેશ કરેલ નથી',
-'uploadnologintext' => 'ફાઇલ ચઢાવવા માટે  [[Special:UserLogin|logged in]] પ્રવેશ કરેલો હોવો જોઇએ',
+'uploadnologintext' => 'તમારે ફાઇલ્સ ચડાવવા માટે $1 હોવું જ જોઇએ.',
 'upload_directory_missing' => 'ફાઇલ ચડાવવાની ડાયરેક્ટરી ($1) ગાયબ છે  અને વેબસર્વર દ્વારા તેની રચના ન કરી શકાઇ.',
 'upload_directory_read_only' => 'ચઢાવેલી ડાયરેક્ટરી ($1) એ વેબ બ્રાઉઝર દ્વારા લેખન યોગ્ય નથી.',
 'uploaderror' => 'ફાઇલ ચઢાવમાં ચૂક',
@@ -1769,7 +1828,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'http-read-error' => 'HTTP વાચન ત્રુટિ.',
 'http-timed-out' => ' HTTP અરજી કાલાતિત થઇ ગઇ.',
 'http-curl-error' => 'URL: $1 ખેંચી લાવવામાં ત્રુટિ',
-'http-host-unreachable' => 'URL સુધી ન પહોંચી શકાયું.',
 'http-bad-status' => 'HTTP અરજી વખતે કોઈ અડચણ આવી : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1800,6 +1858,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'listfiles_size' => 'માપ',
 'listfiles_description' => 'વર્ણન',
 'listfiles_count' => 'આવૃત્તિ',
+'listfiles-show-all' => 'ચિત્રોની જૂની આવૃત્તિઓનો સમાવેશ કરો',
+'listfiles-latestversion' => 'વર્તમાન આવૃતિ',
+'listfiles-latestversion-yes' => 'હા',
+'listfiles-latestversion-no' => 'ના',
 
 # File description page
 'file-anchor-link' => 'ફાઇલ/દસ્તાવેજ',
@@ -1892,6 +1954,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'randompage' => 'કોઈ પણ એક લેખ',
 'randompage-nopages' => 'આ {{PLURAL:$2|નામસ્થળ|નામસ્થળો}}માં કોઇ પાના નથી: $1.',
 
+# Random page in category
+'randomincategory-selectcategory-submit' => 'જાઓ',
+
 # Random redirect
 'randomredirect' => 'દિશાહીન  નિર્દેશન',
 'randomredirect-nopages' => 'નામ સ્થળ "$1" માં કોઇ દિશા નિર્દેશન નથી',
@@ -1917,12 +1982,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'statistics-users-active-desc' => 'સભ્ય કે જેમણે છેલ્લા {{PLURAL:$1|દિવસ|$1 દિવસો}}માં ફેરફારો કર્યાં છે',
 'statistics-mostpopular' => 'સૌથી વધુ જોવાયેલા પાના',
 
-'disambiguations' => 'સંદિગ્ધ શીર્ષકવાળાં પાનાં સાથે જોડાતાં પૃષ્ઠો',
-'disambiguationspage' => 'Template:અસંદિગ્ધ',
-'disambiguations-text' => "નીચેના પાના  '''સંદિગ્ધ વાક્યો વાળા પાના''' સાથે ઓછામાં ઓછી એક કડી દ્વારા જોડાયેલા છે.
-તેઓ વધુ યોગ્ય પાનાં સાથે જોડાયેલા હોવા જોઇએ.<br />
-પાનાને સંદિગ્ધ વાક્યો વાળું પાનું ત્યારે કહી શકાય જ્યારે તે [[MediaWiki:Disambiguationspage]] નામના માળખા સાથે જોડાયેલું હોય.",
-
 'pageswithprop' => 'પાનાં ગુણધર્મ સાથેનાં પાનાંઓ',
 'pageswithprop-legend' => 'પાનાં ગુણધર્મ સાથેનાં પાનાંઓ',
 'pageswithprop-prop' => 'ગુણધર્મ નામ:',
@@ -2174,10 +2233,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'unwatchthispage' => 'નીરીક્ષણ બંધ કરો',
 'notanarticle' => 'માહિતી વિનાનું પાનું',
 'notvisiblerev' => 'અન્ય સભ્ય દ્વારા થયેલું સંપાદન ભૂંસી નખાયું છે.',
-'watchnochange' => 'તમારા દ્વારા નિરીક્ષિત પાના આપેલ સમય ગાળામાં ફેરફારીત થયા',
 'watchlist-details' => 'ચર્ચાનાં પાનાં ન ગણતા {{PLURAL:$1|$1 પાનું|$1 પાનાં}} ધ્યાનસૂચીમાં છે.',
-'wlheader-enotif' => '*ઈ-મેલ સૂચના પદ્ધતિ સક્રીય કરાઈ.',
-'wlheader-showupdated' => "*તમારી મુલાકાત લીધા પછી બદલાયેલા પાના  '''ઘાટા''' અક્ષરો વડે દર્શાવ્યાં છે",
+'wlheader-enotif' => 'ઈમેલ સૂચના પદ્ધતિ સક્રીય કરાઈ.',
+'wlheader-showupdated' => "તમારી છેલ્લી મુલાકાત પછી બદલાયેલાં પાના  '''ઘાટા''' અક્ષરો વડે દર્શાવ્યાં છે.",
 'watchmethod-recent' => 'હાલમાં ફેરફાર થયેલ પાનાની ચકાસણી જારી',
 'watchmethod-list' => 'હાલમાં થયેલ ફેરફાર માટે નીરીક્ષીત પાના તપાસાય છે',
 'watchlistcontains' => 'તમારી ધ્યાનસૂચીમાં $1 {{PLURAL:$1|પાનું|પાનાં}} છે.',
@@ -2432,7 +2490,7 @@ $1',
 'contributions' => '{{GENDER:$1|સભ્ય}}નું યોગદાન',
 'contributions-title' => 'સભ્ય $1નું યોગદાન',
 'mycontris' => 'યોગદાન',
-'contribsub2' => '$1 માટે ($2)',
+'contribsub2' => '($2) માટે {{GENDER:$3|$1}}',
 'nocontribs' => 'આ પરિમાણને મળતી પરિણામ નથી મળ્યાં',
 'uctop' => '(વર્તમાન)',
 'month' => ':મહિનાથી (અને પહેલાનાં)',
@@ -2594,12 +2652,9 @@ $1',
 જો કે આને સામૂહિક $2 રોક લગાવાઇ હોવાથી તે સમૂ હની રોક હટાવી શકાશે.',
 'ip_range_invalid' => 'અવૈધ IP શ્રેણી',
 'ip_range_toolarge' => '/$1થી મોટા વિસ્તાર પ્રતિબંધની પરવાનગી નથી.',
-'blockme' => 'મને પ્રતિબંધિત કરો',
 'proxyblocker' => 'અવેજી (પ્રોક્સી) રોક લગાડનાર',
-'proxyblocker-disabled' => 'આ સુવિધા નિષ્ક્રીય કરી છે.',
 'proxyblockreason' => 'તમારા IP સરનામા પરા રોક લગાડાઈ છે કેમકે તેએક ખુલ્લી પ્રોક્સી છે.
 કૃપયા તમારા ઇંટરનેટ સેવા પ્રદાતા કે તકનીકી સહાય વિભાગનો સંપર્ક કરી જણાવો કે આ એક ભયંકર સુરક્ષા મામલો છે.',
-'proxyblocksuccess' => 'સંપન્ન',
 'sorbsreason' => '{{SITENAME}} દ્વારા વપરાયેલા DNSBL માં તમારું IP સરનામું એક ખુલ્લી પ્રોક્સી તરીકે નોંધાયું છે.',
 'sorbs_create_account_reason' => '{{SITENAME}} માં વપરાતા DNSBL દ્વારા તમારા IP  સરનામાને ખુલી પ્રોક્સી જણાવાઇ છે.
 તમે ખાતાની રચના નહીં કરી શકો.',
@@ -3045,11 +3100,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 મિનિટ|$1 મિનિટો}}',
 'hours' => '{{PLURAL:$1|$1 કલાક|$1 કલાકો}}',
 'days' => '{{PLURAL:$1|$1 દિવસ|$1 દિવસો}}',
+'weeks' => '{{PLURAL:$1|$1 અઠવાડિયું|$1 અઠવાડિયાં}}',
 'months' => '{{PLURAL:$1|$1 મહિનો|$1 મહિનાઓ}}',
 'years' => '{{PLURAL:$1|$1 વર્ષ|$1 વર્ષો}}',
 'ago' => '$1 પહેલાં',
 'just-now' => 'હમણાં',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|કલાક|કલાકો}} ago',
+'minutes-ago' => '$1 {{PLURAL:$1|મિનિટ|મિનિટો}} ago',
+'seconds-ago' => '$1 {{PLURAL:$1|સેકંડ|સેકંડો}} ago',
+'monday-at' => '$1 પર સોમવાર',
+'tuesday-at' => '$1 પર મંગળવાર',
+'wednesday-at' => '$1 પર બુધવાર',
+'thursday-at' => '$1 પર ગુરુવાર',
+'friday-at' => '$1 પર શુક્રવાર',
+'saturday-at' => '$1 પર શનિવાર',
+'sunday-at' => '$1 પર રવિવાર',
+'yesterday-at' => '$1 પર ગઇકાલ',
+
 # Bad image list
 'bad_image_list' => 'ફોર્મેટ નીચે મુજબ છે:
 
@@ -3079,7 +3148,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'પહોળાઈ',
 'exif-imagelength' => 'ઊંચાઈ',
 'exif-bitspersample' => 'બીટ્સ પ્રતિ ભાગ',
@@ -3257,7 +3326,7 @@ $1',
 'exif-originalimageheight' => 'છબી પર ફેરફાર કર્યા પહેલા ની ઊંચાઈ',
 'exif-originalimagewidth' => 'છબી પર ફેરફાર કર્યા પહેલા ની પહોળાઈ',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'અસંકોચિત',
 'exif-compression-2' => 'CCITT સમુદાય ૩ ૧-પરિમાણિય ફેરફાર કરેલુ Huffman રન લંબઈ એન્કોડિંગ',
 'exif-compression-3' => 'CCITT સમૂહ 3 ફેક્સ ઍનકોડિંગ',
@@ -3645,7 +3714,6 @@ $5
 'version-other' => 'અન્ય',
 'version-mediahandlers' => 'દ્રશ્યશ્રાવ્ય માધ્યમના ધારક',
 'version-hooks' => 'ખૂંટા',
-'version-extension-functions' => 'વિસ્તારક કાર્ય',
 'version-parser-extensiontags' => 'પૃથક્કરણ વિસ્તારક ટૅગ્સ',
 'version-parser-function-hooks' => 'પદચ્છેદ કાર્ય ખૂંટા',
 'version-hook-name' => 'ખૂંટાનું નામ્',
@@ -3654,6 +3722,7 @@ $5
 'version-license' => 'પરવાનો',
 'version-poweredby-credits' => "આ વિકિ  '''[//www.mediawiki.org/ MediaWiki]''' દ્વારા ચાલે છે, પ્રકાશનાધિકાર © 2001-$1 $2.",
 'version-poweredby-others' => 'અન્યો',
+'version-poweredby-translators' => 'ટ્રાન્સલેટવિકિ.નેટ ભાષાંતરકર્તાઓ',
 'version-license-info' => 'મિડિયાવિકિ એક મુક્ત સોફ્ટવેર છે. તમે તેનું પુનઃવિતરણ કરી શકો છો અને/અથવા તેને the Free Software Foundation દ્વારા પ્રકાશિત  GNU General Public License હેઠળ તેના સંસ્કરણ 2 ને કે તે પછીના સંસ્કરણ   મઠારી શકો છો . 
 
 મિડિયા વિકિ ને તે આશાથી વિતરીત કરાયું છે કે તે લોકોને ઉપયોગિ થશે કોઇ વોરેંટી વિના અથવા કોઇ કાર્ય સંબધી વેચાણકે તેની યોગ્યતા બદ્દલ ખાત્રી સિવાય. વધારે  માહિતે માટે GNU General Public Licens જુઓ.
@@ -3665,12 +3734,15 @@ $5
 'version-entrypoints-header-entrypoint' => 'પ્રવેશ સ્થળ',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'ફાઈલ પથ',
-'filepath-page' => 'ફાઇલ:',
-'filepath-submit' => 'કરો',
-'filepath-summary' => 'આ ખાસ પાનું કોઇ ફાઇલનો સંપૂર્ણ પથ બતાવે છે.
-ચિત્રોને તેમના પૂર્ણ ઘનત્વ સાથે બતાવાય છે, અન્ય ફાઈલો તેમને તેમના સંલગ્ન પ્રોગ્રામ દ્વારા સીધી ખોલવામાં આવશે.',
+# Special:Redirect
+'redirect-legend' => 'ફાઇલ અથવા પાનાં તરફ વાળો',
+'redirect-submit' => 'જાઓ',
+'redirect-lookup' => 'જુઓ:',
+'redirect-value' => 'કિંમત:',
+'redirect-user' => 'સભ્ય નામ',
+'redirect-revision' => 'પાનાંની આવૃત્તિ',
+'redirect-file' => 'ફાઇલ નામ',
+'redirect-not-exists' => 'કિંમત મળી નહી',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'નકલ ફાઇલ શોધો',
@@ -3719,12 +3791,16 @@ $5
 'tags' => 'વૈધ ફેરફાર પાના',
 'tag-filter' => '[[Special:Tags|ટૅગ]] ચાળણી',
 'tag-filter-submit' => 'ચાળણી',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|ટેગ|ટેગ્સ}}]]: $2)',
 'tags-title' => 'ટૅગ્સ',
 'tags-intro' => 'આ પાના પર સૉફ્ટવૅર દ્વારા, સંપાદનને ચિહ્નિત કરાયેલાં ટૅગ્સની યાદી અને તેનાં અર્થ છે.',
 'tags-tag' => 'ટૅગનું નામ',
 'tags-display-header' => 'ફેરફારની યાદિઓમાં દેખાવ',
 'tags-description-header' => 'અર્થનું પૂર્ણ વિવરણ',
+'tags-active-header' => 'સક્રિય?',
 'tags-hitcount-header' => 'અંકિત ફેરફારો',
+'tags-active-yes' => 'હા',
+'tags-active-no' => 'ના',
 'tags-edit' => 'ફેરફાર કરો',
 'tags-hitcount' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
 
@@ -3760,6 +3836,9 @@ $5
 'htmlform-submit' => 'જમા કરો',
 'htmlform-reset' => 'ફેરફાર ઉલટાવો',
 'htmlform-selectorother-other' => 'અન્ય',
+'htmlform-no' => 'ના',
+'htmlform-yes' => 'હા',
+'htmlform-chosen-placeholder' => 'વિકલ્પ પસંદ કરો',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 પૂર્ણ શબ્દ શોધ સહીત',
@@ -3872,4 +3951,12 @@ $5
 # Image rotation
 'rotate-comment' => 'ચિત્ર $1 {{PLURAL:$1|ડિગ્રી|ડિગ્રીઓ}} ઘડિયાળની દિશામાં ફેરવવામાં આવ્યું',
 
+# Limit report
+'limitreport-cputime' => 'CPU સમય વપરાશ',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|સેકંડ|સેકંડો}}',
+'limitreport-walltime' => 'ખરો સમય વપરાશ',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|સેકંડ|સેકંડો}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|બાઇટ|બાઇટ્સ}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|બાઇટ|બાઇટ્સ}}',
+
 );
diff --git a/languages/messages/MessagesGv.php b/languages/messages/MessagesGv.php
index ffa975ac..1e2aafed 100644
--- a/languages/messages/MessagesGv.php
+++ b/languages/messages/MessagesGv.php
@@ -59,13 +59,13 @@ $messages = array(
 'tog-shownumberswatching' => 'Taishbyn earroo ny h-ymmydeyryn ta freill arrey',
 'tog-oldsig' => "Roie-haishbynys jeh'n screeuys t'ayn hannah:",
 'tog-fancysig' => 'Stiur y screeuys myr wikiteks (gyn kiangley seyr-obbragh)',
-'tog-showjumplinks' => 'Doostey kianglaghyn roshtynagh "lheim dys"',
 'tog-watchlisthideown' => 'Follee my arraghyn hene er my rolley arrey',
 'tog-watchlisthidebots' => 'Follee arraghyn botyn er my rolley arrey',
 'tog-watchlisthideminor' => 'Follee myn-arraghyn er my rolley arrey',
 'tog-watchlisthidepatrolled' => 'Follee arraghyn er nyn scrutaghey er my rolley arrey',
 'tog-ccmeonemails' => 'Cur coip dou jeh dagh post-l verrym da ymmydeyr elley',
 'tog-showhiddencats' => 'Taishbyn ny ronnaghyn follit',
+'tog-useeditwarning' => 'Cur raaue dou my ta mee faagail duillag reaghey gyn sauail yn obbyr jeant aym',
 
 'underline-always' => 'Dagh keayrt',
 'underline-never' => 'Ny jean eh arragh',
@@ -240,7 +240,7 @@ $messages = array(
 'jumptosearch' => 'ronsee',
 'pool-errorunknown' => 'Doilleeid gyn enney',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Mychione {{SITENAME}}',
 'aboutpage' => 'Project:Mychione',
 'copyright' => 'Ta stoo ry-gheddyn rere $1.',
@@ -250,7 +250,6 @@ $messages = array(
 'disclaimers' => 'Jiooldeyderyn',
 'disclaimerpage' => 'Project:Obbalys cadjin',
 'edithelp' => 'Cooney reaghee',
-'edithelppage' => 'Help:Reaghey',
 'helppage' => 'Help:Cummal',
 'mainpage' => 'Ard-ghuillag',
 'mainpage-description' => 'Ard-ghuillag',
@@ -332,7 +331,6 @@ Cur-shiu coontey jeh da [[Special:ListUsers/sysop|reireyder]], as goaill stiagh
 'actionthrottledtext' => "Myr saase noi-spam, cha nod oo jannoo yn obbyr shoh rouyr keayrtyn ayns tammylt beg, as t'ou er roshtyn yn earroo smoo.  Jean eab noa dy gerrid, my saillt.",
 'protectedpagetext' => "Ta'n duillag shoh fo ghlass, as cha nod oo eshyn y reaghey.",
 'viewsourcetext' => 'Foddee oo jeeagh as jean aascreeuyn er bun ny duillag shoh:',
-'sqlhidden' => '(briaght SQL follit)',
 'namespaceprotected' => "Cha nel kiart ayd duillagyn 'sy reamys '''$1''' y reaghey.",
 'ns-specialprotected' => 'Cha nod oo reaghey duillagyn er lheh.',
 
@@ -504,6 +502,8 @@ Foddee shiu goll er ash as reaghey duillag t'ayn nish, ny [[Special:UserLogin|lo
 
 By chair dhyt smooinagh vel eh kiart goll er oai lesh reaghey yn duillag shoh.<br />
 Ta lioar ny scryssaghyn magh kiarit ayns shoh rere dty chaays hene:",
+'editwarning-warning' => "My faagys oo y duillag, hed caghlaaghyn erbee er coayl, foddee.
+My t'ou uss loggalt stiagh, foddee oo lhiettal y raaue shoh 'sy tosheeaghtyn ayd, 'sy rheynn \"Reaghey\".",
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Cha nod coontys y chroo',
@@ -577,7 +577,6 @@ Ogher: '''({{int:cur}})''' = anchaslyssyn rish y lhieggan t'ayn nish,
 'shown-title' => 'Taishbyn $1 {{PLURAL:$1|eiyrtys|eiyrtyssyn}} er dagh duillag',
 'viewprevnext' => 'Jeeagh er ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-new' => "'''Croo yn duillag \"[[:\$1]]\" er y wiki shoh!'''",
-'searchhelp-url' => 'Help:Cummal',
 'searchprofile-articles' => 'Duillagyn cummal',
 'searchprofile-project' => 'Duillagyn Coonee as Shalee',
 'searchprofile-everything' => 'Dagh red',
@@ -606,9 +605,6 @@ My t'ou uss son ronsaghey dagh cooid (as shen goaill stiagh duillagyn resooney,
 'powersearch-field' => 'Ronsee er son',
 'search-external' => 'Ronsaghey mooie',
 
-# Quickbar
-'qbsettings-none' => 'Veg',
-
 # Preferences page
 'preferences' => 'Tosheeaghtyn',
 'mypreferences' => 'My hosheeaghtyn',
@@ -776,7 +772,6 @@ My bailliu eh y chiarail, bee eh ymmydit son cur gys lieh y chur dhyt er son yn
 'recentchangeslinked-feed' => 'Caghlaaghyn-vooinjerys',
 'recentchangeslinked-toolbox' => 'Caghlaaghyn conastagh',
 'recentchangeslinked-title' => 'Caghlaaghyn bentyn rish "$1"',
-'recentchangeslinked-noresult' => 'Cha nel caghlaa erbee er duillagyn kianglt car y traa taishbynit.',
 'recentchangeslinked-summary' => "Shoh rolley caghlaaghyn va jeant er duillagyn kianglt veih duillag sonrit (ny er olteynyn ronney sonrit).<br />
 Ta duillagyn er [[Special:Watchlist|dty rolley arrey]] ayns '''clou trome'''.",
 'recentchangeslinked-page' => 'Ennym y duillag:',
@@ -876,8 +871,6 @@ Ta duillagyn er [[Special:Watchlist|dty rolley arrey]] ayns '''clou trome'''.",
 'statistics-header-users' => 'Staydraa ymmydeyr',
 'statistics-pages' => 'Duillagyn',
 
-'disambiguations' => 'Duillagyn ta kianglt rish duillagyn reddaghey',
-
 'doubleredirects' => 'Aa-enmyssyn dooblagh',
 
 'brokenredirects' => 'Aa-enmyssyn brisht',
@@ -1193,7 +1186,6 @@ Shoh ny reaghaghyn roie da'n duillag '''$1''':",
 'unblocklogentry' => '$1 er ny neughlassey magh',
 'block-log-flags-anononly' => 'ymmydeyryn neuenmyssit ynrican',
 'block-log-flags-nocreate' => 'gyn kiart coontyssyn y chroo',
-'proxyblocksuccess' => 'Jeant.',
 
 # Move page
 'move-page' => '$1 y scughey',
@@ -1367,7 +1359,7 @@ Bee adsyn elley follit dy seyr-obbragh.<br />
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lheead',
 'exif-imagelength' => 'Yrjid',
 'exif-ycbcrpositioning' => 'Soie Y as C',
@@ -1465,9 +1457,6 @@ Bee adsyn elley follit dy seyr-obbragh.<br />
 'version-license' => 'Kiedoonys',
 'version-software-version' => 'Lhieggan',
 
-# Special:FilePath
-'filepath-page' => 'Coadan:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Ennym y choadan:',
 'fileduplicatesearch-submit' => 'Ronsee',
diff --git a/languages/messages/MessagesHa.php b/languages/messages/MessagesHa.php
index 3e82212b..c6883f70 100644
--- a/languages/messages/MessagesHa.php
+++ b/languages/messages/MessagesHa.php
@@ -41,8 +41,6 @@ $messages = array(
 'tog-shownumberswatching' => "A nuna adadin ma'aikata masu bin sawun wannan shafi",
 'tog-oldsig' => 'Rigya-ganin sa-hannu da ake da shi',
 'tog-fancysig' => 'A ɗauki matanin sa-hannu a matsayin matanin Wiki (ba tare da mahaɗin otomatik ba)',
-'tog-externaleditor' => 'Bisa manufa, a yi amfani da editan matani daban (zuwa ga ƙwararri: kuna buƙatar sauya saitin kwamfyutarku)',
-'tog-externaldiff' => 'Bisa manufa, a yi amfani da kwatantau daban (zuwa ga ƙwararri: kuna buƙatar sauya saitin kwamfyutarku)',
 'tog-showjumplinks' => 'A lamunta mahaɗan "a tsallaka zuwa"',
 'tog-uselivepreview' => 'A yi amfani da rigya-gani mai sauƙi (ana buƙatar JavaScript) (hajar gwaji)',
 'tog-forceeditsummary' => 'A gargaɗe ni idan na ajiye kangon fili na taƙaitawa',
diff --git a/languages/messages/MessagesHak.php b/languages/messages/MessagesHak.php
index 06ea72f5..770bd899 100644
--- a/languages/messages/MessagesHak.php
+++ b/languages/messages/MessagesHak.php
@@ -46,9 +46,6 @@ $messages = array(
 'tog-shownumberswatching' => '展示監視中嘅使用人數目',
 'tog-oldsig' => '現有簽名：',
 'tog-fancysig' => '將簽名看做維基文字（毋會自動產生鏈接）',
-'tog-externaleditor' => '默認使用外部編輯器（進階者專用，汝嘅電腦需要特殊設定。[//www.mediawiki.org/wiki/Manual:External_editors 更多訊息。]）',
-'tog-externaldiff' => 'Sat-thin sṳ́-yung ngoi-phu chhâ-yi fun-sak',
-'tog-showjumplinks' => '啟用“跳轉到”訪問鏈接',
 'tog-uselivepreview' => '使用即時預覽（實驗中）',
 'tog-forceeditsummary' => '還吂輸入編寫摘要時提醒亻厓',
 'tog-watchlisthideown' => '監視列表肚隱藏亻厓嘅編寫',
@@ -61,6 +58,8 @@ $messages = array(
 'tog-diffonly' => '對比版本毋同時下背毋展示頁面內容',
 'tog-showhiddencats' => '展示隱藏分類',
 'tog-norollbackdiff' => '执行回退後毋顯示差別',
+'tog-useeditwarning' => '當離開頁面之時變更還吂儲存，請提醒𠊎',
+'tog-prefershttps' => '登入時一直使用安全連線',
 
 'underline-always' => '總係使用',
 'underline-never' => '從來毋用',
@@ -124,6 +123,18 @@ $messages = array(
 'oct' => '10月',
 'nov' => '11月',
 'dec' => '12月',
+'january-date' => '1月$1日',
+'february-date' => '2月$1日',
+'march-date' => '3月$1日',
+'april-date' => '4月$1日',
+'may-date' => '5月$1日',
+'june-date' => '6月$1日',
+'july-date' => '7月$1日',
+'august-date' => '8月$1日',
+'september-date' => '9月$1日',
+'october-date' => '10月$1日',
+'november-date' => '11月$1日',
+'december-date' => '12月$1日',
 
 # Categories related messages
 'pagecategories' => '$1隻分類',
@@ -205,6 +216,7 @@ $messages = array(
 'create-this-page' => '建立本頁',
 'delete' => '刪除',
 'deletethispage' => '刪除本頁',
+'undeletethispage' => '取消刪除邇頁',
 'undelete_short' => '恢復$1隻分删除嘅编寫',
 'viewdeleted_short' => '查看$1項已刪除嘅修訂',
 'protect' => '保護',
@@ -246,7 +258,7 @@ $1',
 'pool-queuefull' => '請求隊列满矣',
 'pool-errorunknown' => '毋知得嘅差錯',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '關於 {{SITENAME}}',
 'aboutpage' => 'Project:關於',
 'copyright' => '除非另有講明，否則本站內容都係以$1條款提供。',
@@ -256,7 +268,6 @@ $1',
 'disclaimers' => '免責聲明',
 'disclaimerpage' => 'Project:一般免責聲明',
 'edithelp' => '編寫幫手',
-'edithelppage' => 'Help:Phiên-cho hong-mien',
 'helppage' => 'Help:目錄',
 'mainpage' => '頭頁',
 'mainpage-description' => '頭頁',
@@ -334,17 +345,8 @@ $1',
 # General errors
 'error' => '差錯',
 'databaseerror' => '數據庫差錯',
-'dberrortext' => '發生數據庫查詢語法錯誤。
-可能係由於軟體自身嘅錯誤所引起。
-最後一次數據庫查詢指令係：
-<blockquote><code>$1</code></blockquote>
-來自於函數“<code>$2</code>”。
-數據庫返回錯誤“<samp>$3: $4</samp>”。',
-'dberrortextcl' => '發生數據庫查詢語法錯誤。
-最後一次嘅數據庫查詢是:
-「$1」
-來自於函數「$2」。
-數據庫返回錯誤「$3: $4」。',
+'databaseerror-text' => '出現資料庫查詢錯誤。
+邇可能表示軟件肚存在錯誤。',
 'laggedslavemode' => "'''警告：'''頁面可能毋包含最近嘅更新。",
 'readonly' => '數據庫分人鎖定',
 'enterlockreason' => '請撳入禁止訪問原因, 包括估計重新開放嘅時間',
@@ -400,7 +402,6 @@ $1',
 'editinginterface' => "'''警告：'''汝今下編寫緊嘅頁面係用於提供軟件嘅界面文字。
 改變邇頁將影響其他在邇隻wiki上嘅用戶界面外觀。
 假使愛修改所有wiki嘅翻譯，請到[//translatewiki.net/ translatewiki.net]上嘅MediaWiki本地化計劃。",
-'sqlhidden' => '（隱藏SQL查詢）',
 'cascadeprotected' => '邇隻頁面已經畀保護，因為邇隻頁面被以下已標註"聯鎖保護"嘅{{PLURAL:$1|一個|多個}}畀保護頁面包含：
 $2',
 'namespaceprotected' => "汝還無權限編輯'''$1'''名字空間嘅頁面。",
@@ -429,10 +430,18 @@ $2',
 'welcomecreation-msg' => '汝嘅賬號已經建立。
 莫添忘訖設置[[Special:Preferences|{{SITENAME}}嘅個人參數]]。',
 'yourname' => '用戶名：',
+'userlogin-yourname' => '用戶名',
+'userlogin-yourname-ph' => '輸入汝嘅用戶名',
 'yourpassword' => '密碼：',
+'userlogin-yourpassword' => '密碼',
+'userlogin-yourpassword-ph' => '輸入汝嘅密碼',
+'createacct-yourpassword-ph' => '輸入汝嘅密碼',
 'yourpasswordagain' => '再一擺輸入密碼：',
+'createacct-yourpasswordagain' => '確認密碼',
+'createacct-yourpasswordagain-ph' => '再一擺輸入密碼',
 'remembermypassword' => '在邇隻瀏覽器上記下𠊎嘅登入狀態（最長$1日）',
-'securelogin-stick-https' => '登入後繼續用HTTPS連接',
+'userlogin-remembermypassword' => '保持𠊎嘅登入狀態',
+'userlogin-signwithsecure' => '使用安全連線',
 'yourdomainname' => '汝嘅域名：',
 'password-change-forbidden' => '汝做毋得更改本wiki上嘅密碼。',
 'externaldberror' => '邇可能係由於驗證數據庫差錯或者汝分系統禁止更新汝嘅外部賬號。',
@@ -444,18 +453,38 @@ $2',
 'logout' => '登出',
 'userlogout' => '登出',
 'notloggedin' => '還吂登入',
+'userlogin-noaccount' => '還無帳戶係無？',
+'userlogin-joinproject' => '參與 {{SITENAME}}',
 'nologin' => '還無帳號係無？$1。',
 'nologinlink' => '建立帳號',
 'createaccount' => '建立帳號',
 'gotaccount' => '已經擁有帳號係無？$1。',
 'gotaccountlink' => '登入',
 'userlogin-resetlink' => '毋記得汝嘅登入信息？',
+'userlogin-resetpassword-link' => '重置爾嘅密碼',
+'helplogin-url' => 'Help:登入',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登入説明]]',
+'createacct-join' => '輸入汝嘅基本資料：',
+'createacct-emailrequired' => '電郵地址：',
+'createacct-emailoptional' => '電郵地址（可選）',
+'createacct-email-ph' => '設置電郵地址',
 'createaccountmail' => '使用一隻臨時嘅隨機密碼，並發送其到以下指定嘅電子郵件地址',
+'createacct-realname' => '實名（可選）',
 'createaccountreason' => '原因:',
+'createacct-reason' => '原因',
+'createacct-reason-ph' => '汝做麽嘅愛創建另一隻帳號',
+'createacct-captcha' => '安全檢查',
+'createacct-imgcaptcha-ph' => '輸入汝在上背看到嘅字符',
+'createacct-submit' => '建立帳號',
+'createacct-benefit-heading' => '{{SITENAME}}是由撈您共樣嘅人建立。',
+'createacct-benefit-body1' => '$1次編寫',
+'createacct-benefit-body2' => '$1頁',
+'createacct-benefit-body3' => '近期$1隻貢獻人',
 'badretype' => '汝所撳入嘅密碼並毋相同',
 'userexists' => '汝所填入嘅用戶名稱已經存在。
 請另選一隻名稱。',
 'loginerror' => '登入差錯',
+'createacct-error' => '帳戶建立差錯',
 'createaccounterror' => '無辦法建立帳號：$1',
 'nocookiesnew' => '本用戶賬號已分建立，但係汝登入失敗。{{SITENAME}}使用cookie登入。汝已停用cookie。請啓用cookie，之後使用汝嘅新用戶名和密碼登入。',
 'nocookieslogin' => '{{SITENAME}}用cookie登入。汝已停用cookie。請啓用cookie後再試一擺。',
@@ -508,6 +537,8 @@ $2',
 
 如果該賬戶建立錯誤嘅話，汝可以忽略邇條訊息。',
 'usernamehasherror' => '用戶名毋可以包含Hash字符',
+'login-throttled' => '汝已經嘗試多次登入動作。
+請等陣再試。',
 'login-abort-generic' => '登入錯誤 - 中止',
 'loginlanguagelabel' => '語言：$1',
 'suspicious-userlogout' => '汝登出嘅要求已經分拒絕，因為其可能係由已損壞嘅瀏覽器或者緩存代理傳送。',
@@ -526,7 +557,8 @@ $2',
 'newpassword' => '舊密碼:',
 'retypenew' => '再一擺輸入密碼：',
 'resetpass_submit' => '設定密碼並登入',
-'resetpass_success' => 'Ngì-ke me̍t-me̍t yí-kîn pûn sṳ̀n-kûng kiên-kói! Hien-ha chang vi ngì tên-ngi̍p...',
+'changepassword-success' => '汝成功更改矣汝嘅密碼！
+今下為汝登入緊...',
 'resetpass_forbidden' => '無辦法更改密碼',
 'resetpass-no-info' => '汝必須登入後直接進入邇隻頁面。',
 'resetpass-submit-loggedin' => '更改密碼',
@@ -538,10 +570,9 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => '重設密碼',
-'passwordreset-text' => '完成邇隻表格以重置汝嘅密碼。',
 'passwordreset-legend' => '重置密码',
 'passwordreset-disabled' => '邇隻維基上已禁止矣重設密碼。',
-'passwordreset-pretext' => '{{PLURAL:$1||輸入下列其中一隻}}',
+'passwordreset-emaildisabled' => '電子郵件功能在此 wiki 上已禁用。',
 'passwordreset-username' => '用戶名：',
 'passwordreset-domain' => '域名：',
 'passwordreset-capture' => '查看生成嘅電子郵件係無？',
@@ -829,7 +860,6 @@ Liá-chhṳ chhà-fûng he yù $1 só fûng ke. Tông-chûng ke ngièn-yîn he '
 'viewprevnext' => '查看（$1 {{int:pipe-separator}} $2）（$3）',
 'searchmenu-exists' => "'''在邇隻wiki上已經有一頁喊做“[[:$1]]”。'''",
 'searchmenu-new' => "'''在本wiki上建立邇隻頁面“[[:$1]]”！'''",
-'searchhelp-url' => 'Help:目錄',
 'searchprofile-articles' => '內容頁面',
 'searchprofile-project' => '幫助撈計劃頁面',
 'searchprofile-images' => '多媒體',
@@ -863,14 +893,6 @@ Liá-chhṳ chhà-fûng he yù $1 só fûng ke. Tông-chûng ke ngièn-yîn he '
 'powersearch-togglelabel' => '監查：',
 'searchdisabled' => '{{SITENAME}}由於性能方面嘅原因，全文搜已分暫時停用。汝做得暫時通過Google搜尋。請留意佢兜嘅索引可能會過時。',
 
-# Quickbar
-'qbsettings' => '快速導航欄',
-'qbsettings-none' => '無',
-'qbsettings-fixedleft' => 'Hiong-chó ku-thin',
-'qbsettings-fixedright' => 'Hiong-yu ku-thin',
-'qbsettings-floatingleft' => 'Phêu-yì chhai chó',
-'qbsettings-floatingright' => 'Phêu-yì chhai yu',
-
 # Preferences page
 'preferences' => '偏好設定',
 'mypreferences' => '偏好設定',
@@ -1002,7 +1024,6 @@ Tshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.',
 'recentchangeslinked-feed' => '相關更改',
 'recentchangeslinked-toolbox' => '相關更改',
 'recentchangeslinked-title' => '撈“$1”有關嘅更改',
-'recentchangeslinked-noresult' => '在邇一段時間肚鏈接嘅頁面並無更改。',
 'recentchangeslinked-summary' => "邇一隻特殊頁面列示''由''所分出嘅一隻頁面之鏈接到頁面嘅最近更改（或者是對於指定分類嘅成員）。
 在[[Special:Watchlist|汝嘅監視列表]]肚嘅頁面會用'''粗體'''顯示。",
 'recentchangeslinked-page' => '頁面名：',
@@ -1013,7 +1034,8 @@ Tshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.',
 'uploadbtn' => '上傳文件',
 'reuploaddesc' => '取消上載並返回上載表單',
 'uploadnologin' => '還吂登入',
-'uploadnologintext' => 'Ngì pit-sî chó-siên [[Special:UserLogin|tên-ngi̍p]] chhòi-nèn sông-chai vùn-khien.',
+'uploadnologintext' => '汝必須先[[Special:UserLogin|登入]]
+正做得上傳文件。',
 'upload_directory_read_only' => '上傳目錄（$1）毋存在或無寫權限。',
 'uploaderror' => '上傳差錯',
 'uploadtext' => "Sṳ́-yung ha-mien ke péu-tân lòi song-chhòn yung-chhai vùn-chông nui sîn-ke thù-hìn tóng-on. Yeu kiám-sṳ fe̍t-chá sêu-chhà yî-chhièn song-chhòn ke thù-phién khó-yî chin-ngi̍p [[Special:FileList|Thù-hìn chhîn-tân]], song-chhòn lâu chhù-hi chiông-chhai [[Special:Log/upload|Song-chhòn ngit-ki]] chûng ki-liu̍k. Yeu-chhai vùn-chông chûng kâ-ngi̍p thù-hiong, sṳ́-yung yî-ha hìn-sṳt ke lièn-chiap: '''<nowiki>[[{{ns:file}}:file.jpg]]</nowiki>'''， '''<nowiki>[[{{ns:file}}:file.png|Thi-von vùn-sṳ]]</nowiki>''' fe̍t-he '''<nowiki>[[{{ns:media}}:file.ogg]]</nowiki>'''.",
@@ -1146,10 +1168,6 @@ Tshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.',
 'statistics-header-users' => '用戶統計',
 'statistics-mostpopular' => '分查閱次數最多嘅頁面',
 
-'disambiguations' => 'Sêu-hàm fù-chông',
-'disambiguationspage' => 'Template:消歧義',
-'disambiguations-text' => 'Yî-ha ke hong-mien tû-yû to <b> sêu-hàm fù-chông </b> ke lièn-chiap, than yin-kôi he lièn-to sṳt-tông ke phêu-thì. <br /> Yit-ke hong-mien chiông-voi pûn-ngìn sṳ-vi Sêu-hàm fù-chông kó-yèn kí he lièn-chhṳ [[MediaWiki:disambiguationspage]].',
-
 'doubleredirects' => '雙重重定向頁',
 'doubleredirectstext' => 'Mî yit-hàng pâu-hàm to thi-yit lâu thi-ngi-ke chhûng-thin hong-mien ke lièn-chiap, yî-khi̍p thi-ngi ke chhûng-thin hong-mien ke thi-yit-hàng vùn-sṳ, thûng-sòng hién-sṳ ke he "chṳ̂n-chṳn" ke muk-phêu vùn-chông, ye-he thi-yit-ke chhûng-thin hong-mien  yin-kôi chṳ́-hiong ke vùn-chông.',
 
@@ -1294,10 +1312,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatch' => '取消監視',
 'unwatchthispage' => '停止監視',
 'notanarticle' => '毋係內容頁面',
-'watchnochange' => '在顯示嘅時間段內汝所監視嘅頁面無更改。',
 'watchlist-details' => '毋包含交流頁，汝嘅監視列表上有$1隻頁面。',
-'wlheader-enotif' => '* Yí-kîn khí-thung email thûng-tî kûng-nèn.',
-'wlheader-showupdated' => "* Chhai ngì song-chhṳ kiám-sṳ heu yû pûn chhùng-siû ko ke vùn-chông chiông-voi hién-sṳ vi '''chhû-thí'''.",
+'wlheader-enotif' => 'Yí-kîn khí-thung email thûng-tî kûng-nèn.',
+'wlheader-showupdated' => "Chhai ngì song-chhṳ kiám-sṳ heu yû pûn chhùng-siû ko ke vùn-chông chiông-voi hién-sṳ vi '''chhû-thí'''.",
 'watchmethod-recent' => '檢查分監視頁面嘅最近編寫',
 'watchmethod-list' => '檢查最近編寫嘅分監視頁面',
 'watchlistcontains' => '汝嘅監視列表包含$1隻頁面。',
@@ -1441,7 +1458,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'contributions' => '{{GENDER:$1|用戶}}貢獻',
 'contributions-title' => '$1嘅用戶貢獻',
 'mycontris' => '貢獻',
-'contribsub2' => '$1 （$2） ke kung-hien',
+'contribsub2' => '$1嘅貢獻（$2）',
 'nocontribs' => '毋尋到符合特徵嘅更改。',
 'uctop' => '（最新修改）',
 'month' => '從邇月（或還較早）:',
@@ -1543,7 +1560,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'ip_range_invalid' => '無效嘅IP範圍。',
 'proxyblocker' => '代理封鎖器',
 'proxyblockreason' => '汝嘅IP地址係一隻開放嘅代理，其已經分封鎖。請聯繫汝嘅網際網路服務提供商或技術支援者並講佢兜聽邇隻嚴重嘅安全問題。',
-'proxyblocksuccess' => '完成。',
 'sorbsreason' => 'Ngì-ke IP chhô-vi pûn DNSBL lie̍t-vi su̍k-yî khôi-fong thoi-lî fu̍k-vu-khí.',
 'sorbs_create_account_reason' => 'Ngì-ke IP chhô-vi pûn DNSBL lie̍t-vi su̍k-yî khôi-fong thoi-lî fu̍k-vu-khí. Só-yî ngì mò-fap kien-li̍p chong-ho.',
 
diff --git a/languages/messages/MessagesHaw.php b/languages/messages/MessagesHaw.php
index d3f835d5..b0084fa3 100644
--- a/languages/messages/MessagesHaw.php
+++ b/languages/messages/MessagesHaw.php
@@ -253,7 +253,7 @@ $messages = array(
 'jumptonavigation' => 'ka ho‘okele ‘ana',
 'jumptosearch' => 'huli',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'E pili ana iā {{SITENAME}}',
 'aboutpage' => 'Project:E pili ana',
 'copyrightpage' => '{{ns:project}}:Palapala ho‘okuleana',
@@ -262,7 +262,6 @@ $messages = array(
 'disclaimers' => 'Palapala hoʻokuʻu kuleana',
 'disclaimerpage' => 'Project:Palapala hoʻokuʻu kuleana',
 'edithelp' => 'Kōkua me ka ho‘ololi ‘ana',
-'edithelppage' => 'Help:Ho‘ololi',
 'helppage' => 'Help:Papa kuhikuhi',
 'mainpage' => "Kahua pa'a",
 'mainpage-description' => 'Ka papa kinohi',
@@ -363,7 +362,7 @@ E ʻoluʻolu, e kūlia hou.',
 
 # Change password dialog
 'newpassword' => 'ʻŌlelo hūnā hou:',
-'resetpass_success' => 'Ua loli ‘ia kāu hua‘ōlelo huna! E ‘e‘e iā‘oe...',
+'changepassword-success' => 'Ua loli ‘ia kāu hua‘ōlelo huna! E ‘e‘e iā‘oe...',
 
 # Edit page toolbar
 'bold_sample' => 'Ho‘okā‘ele',
@@ -464,7 +463,6 @@ E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā
 'prevn' => '{{PLURAL:$1|$1}} ma mua',
 'nextn' => '{{PLURAL:$1|$1}} ma hope',
 'viewprevnext' => 'Nānā i nā ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Papa kuhikuhi',
 'search-result-size' => '$1 ({{PLURAL:$2|1 huaʻōlelo|$2 huaʻōlelo}})',
 'search-section' => '(māhele $1)',
 'search-suggest' => 'ʻO kēia paha kou manaʻo: $1',
@@ -584,8 +582,6 @@ E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā
 # Statistics
 'statistics' => 'Papa helu',
 
-'disambiguationspage' => 'Template:Huaʻōlelo puana like',
-
 'brokenredirects-edit' => 'e ho‘ololi',
 'brokenredirects-delete' => 'e kāpae',
 
@@ -740,7 +736,6 @@ E ʻike iā $2 no ka papa o nā kāpae ʻana hou.',
 'unblocklink' => 'mai pale',
 'change-blocklink' => 'hoʻololi ka palena',
 'contribslink' => 'nā ha‘awina',
-'blockme' => 'E ke‘a ia‘u',
 
 # Move page
 'move-page-legend' => 'Hoʻoneʻe i ka ʻaoʻao',
diff --git a/languages/messages/MessagesHe.php b/languages/messages/MessagesHe.php
index 381f9d7e..4400c4d4 100644
--- a/languages/messages/MessagesHe.php
+++ b/languages/messages/MessagesHe.php
@@ -9,6 +9,7 @@
  *
  * @author Agbad
  * @author Amire80
+ * @author Dekel E
  * @author Drorsnir
  * @author Guycn1
  * @author Hoo
@@ -23,6 +24,7 @@
  * @author YaronSh
  * @author אור שפירא
  * @author ערן
+ * @author פדיחה
  * @author שומבלע
  * @author תומר ט
  */
@@ -107,6 +109,7 @@ $specialPageAliases = array(
 	'MIMEsearch'                => array( 'חיפוש_MIME' ),
 	'Mostcategories'            => array( 'הקטגוריות_הרבות_ביותר', 'הדפים_מרובי-הקטגוריות_ביותר' ),
 	'Mostimages'                => array( 'הקבצים_המקושרים_ביותר', 'התמונות_המקושרות_ביותר' ),
+	'Mostinterwikis'            => array( 'קישורי_השפה_הרבים_ביותר' ),
 	'Mostlinked'                => array( 'הדפים_המקושרים_ביותר', 'המקושרים_ביותר' ),
 	'Mostlinkedcategories'      => array( 'הקטגוריות_המקושרות_ביותר' ),
 	'Mostlinkedtemplates'       => array( 'התבניות_המקושרות_ביותר' ),
@@ -118,6 +121,7 @@ $specialPageAliases = array(
 	'Myuploads'                 => array( 'ההעלאות_שלי' ),
 	'Newimages'                 => array( 'קבצים_חדשים', 'תמונות_חדשות', 'גלריית_קבצים_חדשים', 'גלריית_תמונות_חדשות' ),
 	'Newpages'                  => array( 'דפים_חדשים' ),
+	'PagesWithProp'             => array( 'דפים_עם_מאפיינים', 'דפים_לפי_מאפיינים' ),
 	'PasswordReset'             => array( 'איפוס_סיסמה' ),
 	'PermanentLink'             => array( 'קישור_קבוע' ),
 	'Popularpages'              => array( 'הדפים_הנצפים_ביותר', 'דפים_פופולריים' ),
@@ -129,6 +133,7 @@ $specialPageAliases = array(
 	'Randomredirect'            => array( 'הפניה_אקראית' ),
 	'Recentchanges'             => array( 'שינויים_אחרונים' ),
 	'Recentchangeslinked'       => array( 'שינויים_בדפים_המקושרים' ),
+	'Redirect'                  => array( 'הפניה' ),
 	'Revisiondelete'            => array( 'מחיקת_ושחזור_גרסאות' ),
 	'Search'                    => array( 'חיפוש' ),
 	'Shortpages'                => array( 'דפים_קצרים' ),
@@ -201,6 +206,7 @@ $magicWords = array(
 	'pagenamee'                 => array( '1', 'שם הדף מקודד', 'PAGENAMEE' ),
 	'namespace'                 => array( '1', 'מרחב השם', 'NAMESPACE' ),
 	'namespacee'                => array( '1', 'מרחב השם מקודד', 'NAMESPACEE' ),
+	'namespacenumber'           => array( '1', 'מספר_מרחב_השם', 'NAMESPACENUMBER' ),
 	'talkspace'                 => array( '1', 'מרחב השיחה', 'TALKSPACE' ),
 	'talkspacee'                => array( '1', 'מרחב השיחה מקודד', 'TALKSPACEE' ),
 	'subjectspace'              => array( '1', 'מרחב הנושא', 'מרחב הערכים', 'SUBJECTSPACE', 'ARTICLESPACE' ),
@@ -313,6 +319,7 @@ $magicWords = array(
 	'url_query'                 => array( '0', 'שאילתה', 'QUERY' ),
 	'defaultsort_noerror'       => array( '0', 'ללא שגיאה', 'noerror' ),
 	'defaultsort_noreplace'     => array( '0', 'ללא החלפה', 'noreplace' ),
+	'pagesincategory_pages'     => array( '0', 'דפים', 'pages' ),
 );
 
 $datePreferences = array(
@@ -384,9 +391,6 @@ $messages = array(
 'tog-shownumberswatching' => 'הצגת מספר המשתמשים העוקבים',
 'tog-oldsig' => 'החתימה הנוכחית:',
 'tog-fancysig' => 'פירוש החתימה כקוד ויקי (ללא קישור אוטומטי)',
-'tog-externaleditor' => 'שימוש בעורך חיצוני כברירת מחדל (למשתמשים מומחים בלבד, דורש הגדרות מיוחדות במחשב. [//www.mediawiki.org/wiki/Manual:External_editors למידע נוסף.])',
-'tog-externaldiff' => 'שימוש בתוכנת השוואת הגרסאות החיצונית כברירת מחדל (למשתמשים מומחים בלבד, דורש הגדרות מיוחדות במחשב. [//www.mediawiki.org/wiki/Manual:External_editors למידע נוסף.])',
-'tog-showjumplinks' => 'הצגת קישורי נגישות מסוג "{{int:jumpto}}"',
 'tog-uselivepreview' => 'שימוש בתצוגה מקדימה מהירה (ניסיוני)',
 'tog-forceeditsummary' => 'הצגת אזהרה בעת הכנסת תקציר עריכה ריק',
 'tog-watchlisthideown' => 'הסתרת העריכות שלי ברשימת המעקב',
@@ -400,6 +404,8 @@ $messages = array(
 'tog-showhiddencats' => 'הצגת קטגוריות מוסתרות',
 'tog-noconvertlink' => 'ביטול המרת קישורים לכותרות',
 'tog-norollbackdiff' => 'השמטת ההבדלים בין הגרסאות לאחר ביצוע שחזור',
+'tog-useeditwarning' => 'הצגת אזהרה בעת עזיבת דף עריכה עם שינויים שטרם נשמרו',
+'tog-prefershttps' => 'תמיד להשתמש בתקשורת מאובטחת לאחר הכניסה לחשבון',
 
 'underline-always' => 'תמיד',
 'underline-never' => 'לעולם לא',
@@ -463,6 +469,18 @@ $messages = array(
 'oct' => "אוק'",
 'nov' => "נוב'",
 'dec' => "דצמ'",
+'january-date' => '$1 בינואר',
+'february-date' => '$1 בפברואר',
+'march-date' => '$1 במרץ',
+'april-date' => '$1 באפריל',
+'may-date' => '$1 במאי',
+'june-date' => '$1 ביוני',
+'july-date' => '$1 ביולי',
+'august-date' => '$1 באוגוסט',
+'september-date' => '$1 בספטמבר',
+'october-date' => '$1 באוקטובר',
+'november-date' => '$1 בנובמבר',
+'december-date' => '$1 בדצמבר',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|קטגוריה|קטגוריות}}',
@@ -544,6 +562,7 @@ $messages = array(
 'create-this-page' => 'יצירת דף זה',
 'delete' => 'מחיקה',
 'deletethispage' => 'מחיקת דף זה',
+'undeletethispage' => 'שחזור דף זה',
 'undelete_short' => 'שחזור {{PLURAL:$1|עריכה אחת|$1 עריכות}}',
 'viewdeleted_short' => 'צפייה ב{{PLURAL:$1|עריכה מחוקה אחת|־$1 עריכות מחוקות}}',
 'protect' => 'הגנה',
@@ -587,7 +606,7 @@ $1',
 'pool-queuefull' => 'התור מלא',
 'pool-errorunknown' => 'שגיאה בלתי ידועה',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'אודות {{SITENAME}}',
 'aboutpage' => 'Project:אודות',
 'copyright' => 'התוכן זמין לפי תנאי $1 אלא אם נאמר אחרת.',
@@ -597,7 +616,6 @@ $1',
 'disclaimers' => 'הבהרה משפטית',
 'disclaimerpage' => 'Project:הבהרה משפטית',
 'edithelp' => 'עזרה לעריכה',
-'edithelppage' => 'Help:עריכת דף',
 'helppage' => 'Help:תפריט ראשי',
 'mainpage' => 'עמוד ראשי',
 'mainpage-description' => 'עמוד ראשי',
@@ -676,17 +694,12 @@ $1',
 # General errors
 'error' => 'שגיאה',
 'databaseerror' => 'שגיאת בסיס נתונים',
-'dberrortext' => 'אירעה שגיאת תחביר בשאילתה לבסיס הנתונים.
-שגיאה זו עלולה להעיד על באג בתוכנה.
-השאילתה האחרונה לבסיס הנתונים שהתוכנה ניסתה להריץ הייתה:
-<blockquote lang="en" dir="ltr"><code>$1</code></blockquote>
-מתוך הפונקציה "<code lang="en" dir="ltr">$2</code>".
-בסיס הנתונים החזיר את השגיאה הבאה: "<samp lang="en" dir="ltr">$3: $4</samp>".',
-'dberrortextcl' => 'אירעה שגיאת תחביר בשאילתה לבסיס הנתונים.
-השאילתה האחרונה שבוצעה לבסיס הנתונים הייתה:
-"$1"
-מתוך הפונקציה "$2".
-בסיס הנתונים החזיר את השגיאה "$3: $4".',
+'databaseerror-text' => 'אירעה שגיאה בשאילתה לבסיס הנתונים.
+שגיאה זו עלולה להעיד על באג בתוכנה.',
+'databaseerror-textcl' => 'אירעה שגיאה בשאילתה לבסיס הנתונים.',
+'databaseerror-query' => 'שאילתה: $1',
+'databaseerror-function' => 'פונקציה: $1',
+'databaseerror-error' => 'שגיאה: $1',
 'laggedslavemode' => "'''אזהרה:''' הדף עשוי שלא להכיל עדכונים אחרונים.",
 'readonly' => 'בסיס הנתונים נעול',
 'enterlockreason' => 'הזינו סיבה לנעילת בסיס הנתונים, כולל הערכה לגבי מועד שחרור הנעילה.',
@@ -720,6 +733,7 @@ $1',
 'cannotdelete-title' => 'לא ניתן למחוק את הדף "$1"',
 'delete-hook-aborted' => 'המחיקה הופסקה על־ידי מבנה Hook.
 לא ניתן הסבר.',
+'no-null-revision' => 'לא ניתן היה ליצור גרסת־דמה בדף "$1"',
 'badtitle' => 'כותרת שגויה',
 'badtitletext' => 'כותרת הדף המבוקש הייתה בלתי־תקינה, ריקה, או קישור שגוי לשפה אחרת או למיזם אחר.
 ייתכן שהיא מכילה תו אחד או יותר שאינו יכול לשמש בכותרות.',
@@ -741,12 +755,15 @@ $1',
 'editinginterface' => "'''אזהרה:''' הדף שאתם עורכים הוא אחד הדפים המספקים הודעות מערכת לתוכנה.
 שינויים בדף זה ישפיעו על תצוגת ממשק המשתמש של משתמשים אחרים באתר ויקי זה.
 כדי להוסיף או לשנות תרגומים בכל אתרי הוויקי, אנא השתמשו ב־[//translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
-'sqlhidden' => '(שאילתת ה־SQL מוסתרת)',
 'cascadeprotected' => 'דף זה מוגן מעריכה כי הוא מוכלל {{PLURAL:$1|בדף הבא, שמופעלת עליו|בדפים הבאים, שמופעלת עליהם}} הגנה מדורגת:
 $2',
 'namespaceprotected' => "אינכם מורשים לערוך דפים במרחב השם '''$1'''.",
 'customcssprotected' => 'אינכם מורשים לערוך דף CSS זה, כיוון שהוא כולל את ההגדרות האישיות של משתמש אחר.',
 'customjsprotected' => 'אינכם מורשים לערוך דף JavaScript זה, כיוון שהוא כולל את ההגדרות האישיות של משתמש אחר.',
+'mycustomcssprotected' => 'אינכם מורשים לערוך דף CSS זה.',
+'mycustomjsprotected' => 'אינכם מורשים לערוך דף JavaScript זה.',
+'myprivateinfoprotected' => 'אין לך הרשאה לערוך את המידע הפרטי שלך',
+'mypreferencesprotected' => 'אין לך הרשאה לערוך את ההעדפות שלך.',
 'ns-specialprotected' => 'לא ניתן לערוך דפים מיוחדים.',
 'titleprotected' => 'לא ניתן ליצור דף זה, כיוון שהמשתמש [[User:$1|$1]] הגן עליו מפני יצירה.
 הסיבה שניתנה לכך היא "$2".',
@@ -771,10 +788,19 @@ $2',
 'welcomecreation-msg' => 'חשבונך נוצר.
 נא לא לשכוח להתאים את [[Special:Preferences|העדפות המשתמש]] שלך ב{{grammar:תחילית|{{SITENAME}}}}.',
 'yourname' => 'שם משתמש:',
+'userlogin-yourname' => 'שם משתמש',
+'userlogin-yourname-ph' => 'יש להקליד את שם המשתמש',
+'createacct-another-username-ph' => 'יש להקליד את שם המשתמש',
 'yourpassword' => 'סיסמה:',
+'userlogin-yourpassword' => 'סיסמה',
+'userlogin-yourpassword-ph' => 'יש להקליד את הסיסמה',
+'createacct-yourpassword-ph' => 'יש להקליד סיסמה',
 'yourpasswordagain' => 'חזרה על הסיסמה:',
+'createacct-yourpasswordagain' => 'אימות הסיסמה',
+'createacct-yourpasswordagain-ph' => 'יש להקליד את הסיסמה שנית',
 'remembermypassword' => 'שמירת הכניסה שלי בדפדפן הזה (ל{{PLURAL:$1|יום אחד|יומיים|־$1 ימים}} לכל היותר)',
-'securelogin-stick-https' => 'המשך שימוש ב־HTTPS אחרי הכניסה',
+'userlogin-remembermypassword' => 'לזכור שנכנסתי',
+'userlogin-signwithsecure' => 'שימוש בחיבור מאובטח',
 'yourdomainname' => 'המתחם שלך:',
 'password-change-forbidden' => 'אינכם יכולים לשנות סיסמאות באתר זה.',
 'externaldberror' => 'הייתה שגיאה בבסיס הנתונים של ההזדהות, או שאינכם רשאים לעדכן את חשבונכם החיצוני.',
@@ -786,18 +812,44 @@ $2',
 'logout' => 'יציאה מהחשבון',
 'userlogout' => 'יציאה מהחשבון',
 'notloggedin' => 'לא בחשבון',
+'userlogin-noaccount' => 'אין לך חשבון?',
+'userlogin-joinproject' => 'הצטרפות ל{{grammar:תחילית|{{SITENAME}}}}',
 'nologin' => 'אין לכם חשבון? $1.',
 'nologinlink' => 'הרשמה',
 'createaccount' => 'יצירת חשבון חדש',
 'gotaccount' => 'כבר נרשמתם? $1.',
 'gotaccountlink' => 'כניסה לחשבון',
 'userlogin-resetlink' => 'שכחת את פרטי הכניסה?',
+'userlogin-resetpassword-link' => 'איפוס הסיסמה',
+'helplogin-url' => 'Help:כניסה לחשבון',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|עזרה בכניסה לחשבון]]',
+'userlogin-loggedin' => 'אתם כבר מחוברים לחשבון {{GENDER:$1|$1}}.
+השתמשו בטופס שלהלן כדי להתחבר לחשבון אחר.',
+'userlogin-createanother' => 'יצירת חשבון אחר',
+'createacct-join' => 'יש להקליד להלן את הפרטים שלך.',
+'createacct-another-join' => 'יש להקליד להלן את פרטי החשבון החדש.',
+'createacct-emailrequired' => 'כתובת דוא"ל',
+'createacct-emailoptional' => 'כתובת דוא"ל (לא חובה)',
+'createacct-email-ph' => 'יש להקליד את כתובת הדוא"ל שלך',
+'createacct-another-email-ph' => 'יש להקליד כתובת דוא"ל',
 'createaccountmail' => 'שימוש בסיסמה זמנית אקראית ושליחתה לכתובת הדוא"ל שצוינה',
+'createacct-realname' => 'שם אמיתי (לא חובה)',
 'createaccountreason' => 'סיבה:',
+'createacct-reason' => 'סיבה',
+'createacct-reason-ph' => 'סיבה ליצירת חשבון נוסף',
+'createacct-captcha' => 'בדיקת אבטחה',
+'createacct-imgcaptcha-ph' => 'יש להקליד את הטקסט המופיע למעלה',
+'createacct-submit' => 'יצירת החשבון שלך',
+'createacct-another-submit' => 'יצירת חשבון אחר',
+'createacct-benefit-heading' => 'אנשים כמוך יוצרים את {{SITENAME}}.',
+'createacct-benefit-body1' => '{{PLURAL:$1|עריכה|עריכות}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|דף|דפים}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|תורם|תורמים}} לאחרונה',
 'badretype' => 'הסיסמאות שהזנתם אינן מתאימות.',
 'userexists' => 'שם המשתמש שבחרתם כבר נמצא בשימוש.
 אנא בחרו שם אחר.',
 'loginerror' => 'שגיאה בכניסה לאתר',
+'createacct-error' => 'שגיאה ביצירת חשבון',
 'createaccounterror' => 'לא ניתן היה ליצור את החשבון: $1',
 'nocookiesnew' => 'חשבון המשתמש שלכם נוצר, אך לא נכנסתם כמשתמשים רשומים.
 כדי להכניס משתמשים למערכת עושה {{SITENAME}} שימוש בעוגיות.
@@ -862,10 +914,12 @@ $2',
 באפשרותכם להתעלם מהודעה זו, אם החשבון נוצר בטעות.',
 'usernamehasherror' => 'שם משתמש אינו יכול לכלול תווי סולמית',
 'login-throttled' => 'ביצעתם לאחרונה ניסיונות רבים מדי להיכנס לחשבון זה.
-אנא המתינו לפני שתנסו שוב.',
+אנא המתינו $1 לפני שתנסו שוב.',
 'login-abort-generic' => 'הכניסה לחשבון לא הצליחה - היא הופסקה',
 'loginlanguagelabel' => 'שפה: $1',
 'suspicious-userlogout' => 'בקשתכם לצאת מהחשבון נדחתה כיוון שנראה שהיא נשלחה על ידי דפדפן שבור או שרת פרוקסי עם זיכרון מטמון.',
+'createacct-another-realname-tip' => 'השם האמיתי הוא אופציונאלי.
+אם תבחרו לספקו, הוא ישמש לייחוס עבודת המשתמש אליו.',
 
 # Email sending
 'php-mail-error-unknown' => 'שגיאה לא ידועה בפונקציה mail()‎ של PHP',
@@ -882,7 +936,7 @@ $2',
 'newpassword' => 'סיסמה חדשה:',
 'retypenew' => 'חזרה על הסיסמה החדשה:',
 'resetpass_submit' => 'הגדרת הסיסמה וכניסה לחשבון',
-'resetpass_success' => 'הססמה שלך הוחלפה בהצלחה! כעת תתבצע כניסה למערכת…',
+'changepassword-success' => 'סיסמתכם שונתה בהצלחה!',
 'resetpass_forbidden' => 'לא ניתן לשנות סיסמאות.',
 'resetpass-no-info' => 'עליכם להיכנס לחשבון כדי לגשת לדף זה באופן ישיר.',
 'resetpass-submit-loggedin' => 'שינוי סיסמה',
@@ -894,10 +948,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'איפוס סיסמה',
-'passwordreset-text' => 'מלאו טופס זה כדי לאפס את הסיסמה.',
+'passwordreset-text-one' => 'מלאו טופס זה כדי לאפס את הסיסמה.',
+'passwordreset-text-many' => '{{PLURAL:$1||מלאו אחד מהשדות הבאים כדי לאפס את הסיסמה.}}',
 'passwordreset-legend' => 'איפוס סיסמה',
 'passwordreset-disabled' => 'איפוסי סיסמה בוטלו באתר ויקי זה.',
-'passwordreset-pretext' => '{{PLURAL:$1||הקלידו אחד מפריטי המידע למטה}}',
+'passwordreset-emaildisabled' => 'שירותי הדוא"ל בוטלו באתר ויקי זה.',
 'passwordreset-username' => 'שם משתמש:',
 'passwordreset-domain' => 'תחום:',
 'passwordreset-capture' => 'לצפות בדוא"ל הנשלח?',
@@ -927,7 +982,7 @@ $2
 סיסמה זמנית: $2',
 'passwordreset-emailsent' => 'נשלח דואר אלקטרוני לאיפוס הסיסמה.',
 'passwordreset-emailsent-capture' => 'נשלח דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן.',
-'passwordreset-emailerror-capture' => 'נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו למשתמש נכשלה: $1',
+'passwordreset-emailerror-capture' => 'נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו ל{{GENDER:$2|משתמש|משתמשת}} נכשלה: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'שינוי כתובת דוא"ל',
@@ -941,6 +996,19 @@ $2
 'changeemail-submit' => 'שינוי כתובת הדוא"ל',
 'changeemail-cancel' => 'ביטול',
 
+# Special:ResetTokens
+'resettokens' => 'איפוס אסימונים',
+'resettokens-text' => 'בעמוד זה ניתן לאפס אסימונים שמאפשרים גישה לנתונים פרטיים של החשבון שלך.
+
+רצוי לעשות זאת אם שיתפת אותם בטעות עם אחרים או אם חשבונך נפרץ.',
+'resettokens-no-tokens' => 'אין אסימונים לאיפוס.',
+'resettokens-legend' => 'איפוס אסימונים',
+'resettokens-tokens' => 'אסימונים:',
+'resettokens-token-label' => '$1 (ערך נוכחי: $2)',
+'resettokens-watchlist-token' => 'אסימון להזנת הרשת (Atom/RSS) של [[Special:Watchlist|שינויים של דפים ברשימת המעקב]]',
+'resettokens-done' => 'האסימונים אופסו.',
+'resettokens-resetbutton' => 'איפוס האסימונים שנבחרו',
+
 # Edit page toolbar
 'bold_sample' => 'טקסט מודגש',
 'bold_tip' => 'טקסט מודגש',
@@ -1133,12 +1201,15 @@ $2
 נראה שהוא נמחק.',
 'edit-conflict' => 'התנגשות עריכה.',
 'edit-no-change' => 'המערכת התעלמה מעריכתכם, כיוון שלא נעשה שינוי בטקסט.',
+'postedit-confirmation' => 'עריכתך נשמרה.',
 'edit-already-exists' => 'לא ניתן ליצור דף חדש.
 הוא כבר קיים.',
 'defaultmessagetext' => 'טקסט ההודעה המקורי',
 'content-failed-to-parse' => 'פענוח $2 כתוכן מסוג $1 נכשל: $3',
 'invalid-content-data' => 'מידע שגוי על התוכן',
 'content-not-allowed-here' => 'תוכן מסוג "$1" אינו מותר בדף [[$2]]',
+'editwarning-warning' => 'עזיבת דף זה עשויה לגרום לאובדן כל השינויים שביצעתם.
+אם אתם מחוברים לחשבון, תוכלו לבטל אזהרה זו בחלק "עריכה" שבהעדפות שלכם.',
 
 # Content models
 'content-model-wikitext' => 'טקסט ויקי',
@@ -1173,6 +1244,7 @@ $2
 'undo-failure' => 'לא ניתן היה לבטל את העריכה עקב התנגשות עם עריכות מאוחרות יותר.',
 'undo-norev' => 'לא ניתן היה לבטל את העריכה כי היא אינה קיימת או כי היא נמחקה.',
 'undo-summary' => 'ביטול גרסה $1 של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]])',
+'undo-summary-username-hidden' => 'ביטול גרסה $1 של משתמש מוסתר',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'לא ניתן ליצור את החשבון',
@@ -1352,6 +1424,7 @@ $1",
 'compareselectedversions' => 'השוואת הגרסאות שנבחרו',
 'showhideselectedversions' => 'הצגת/הסתרת הגרסאות שנבחרו',
 'editundo' => 'ביטול',
+'diff-empty' => '(אין הבדלים)',
 'diff-multi' => '({{PLURAL:$1|גרסת ביניים אחת|$1 גרסאות ביניים}} של {{PLURAL:$2|משתמש אחד|$2 משתמשים}} {{PLURAL:$1|אינה מוצגת|אינן מוצגות}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|גרסת ביניים אחת|$1 גרסאות ביניים}} של יותר {{PLURAL:$2|ממשתמש אחד|מ־$2 משתמשים}} {{PLURAL:$1|אינה מוצגת|אינן מוצגות}})',
 'difference-missing-revision' => '{{PLURAL:$2|גרסה אחת|$2 גרסאות}} של ההבדל הזה בין שתי גרסאות ($1) {{PLURAL:$2|לא נמצאה|לא נמצאו}}.
@@ -1379,7 +1452,6 @@ $1",
 'searchmenu-legend' => 'אפשרויות חיפוש',
 'searchmenu-exists' => "'''קיים דף בשם \"[[:\$1]]\" באתר זה.'''",
 'searchmenu-new' => "'''יצירת הדף \"[[:\$1]]\" באתר זה.'''",
-'searchhelp-url' => 'Help:תפריט ראשי',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|מציאת דפים עם קידומת זו]]',
 'searchprofile-articles' => 'דפי תוכן',
 'searchprofile-project' => 'עזרה ודפי המיזם',
@@ -1422,15 +1494,7 @@ $1",
 'searchdisabled' => 'חיפוש ב{{grammar:תחילית|{{SITENAME}}}} אינו מופעל כעת.
 בינתיים אפשר לחפש באמצעות גוגל.
 שימו לב שייתכן שהמידע של {{SITENAME}} שם אינו מעודכן.',
-
-# Quickbar
-'qbsettings' => 'הגדרות סרגל כלים',
-'qbsettings-none' => 'ללא',
-'qbsettings-fixedleft' => 'קבוע משמאל',
-'qbsettings-fixedright' => 'קבוע מימין',
-'qbsettings-floatingleft' => 'צף משמאל',
-'qbsettings-floatingright' => 'צף מימין',
-'qbsettings-directionality' => 'קבוע, תלוי בכיוון הכתב של השפה שלך',
+'search-error' => 'אירעה שגיאה במהלך החיפוש: $1',
 
 # Preferences page
 'preferences' => 'העדפות',
@@ -1464,7 +1528,6 @@ $1",
 'resetprefs' => 'מחיקת שינויים שלא נשמרו',
 'restoreprefs' => 'שחזור ההגדרות ההתחלתיות (בכל הלשוניות)',
 'prefs-editing' => 'עריכה',
-'prefs-edit-boxsize' => 'גודל חלון העריכה.',
 'rows' => 'שורות:',
 'columns' => 'עמודות:',
 'searchresultshead' => 'חיפוש',
@@ -1475,9 +1538,9 @@ $1",
 'recentchangesdays-max' => 'לכל היותר {{PLURAL:$1|יום אחד|יומיים|$1 ימים}}',
 'recentchangescount' => 'מספר העריכות שיוצגו כברירת מחדל:',
 'prefs-help-recentchangescount' => 'כולל שינויים אחרונים, היסטוריית הדף ויומנים.',
-'prefs-help-watchlist-token' => 'מילוי השדה הזה במפתח סודי ייצור הזנת RSS עבור רשימת המעקב שלכם.
-כל מי שיודע את המפתח שבשדה זה יוכל לקרוא את רשימת המעקב שלכם, לכן עליכם לבחור ערך בטוח.
-תוכלו להשתמש בערך הבא, שנוצר באופן אקראי: $1',
+'prefs-help-watchlist-token2' => 'זהו המפתח הסודי של ההזנה של רשימת המעקב שלך.
+כל מי שיודע אותו יוכל לקרוא את רשימת המעקב שלך, לכן אין לשתף אותו.
+[[Special:ResetTokens|אם יש בכך צורך, אפשר לאפס אותו כאן]].',
 'savedprefs' => 'העדפותיך נשמרו.',
 'timezonelegend' => 'אזור זמן:',
 'localtime' => 'זמן מקומי:',
@@ -1508,7 +1571,6 @@ $1",
 'prefs-reset-intro' => 'באפשרותכם להשתמש בדף זה כדי להחזיר את ההעדפות שלכם להגדרות ברירת המחדל של האתר.
 לא ניתן לבטל פעולה זו.',
 'prefs-emailconfirm-label' => 'אימות כתובת דוא"ל:',
-'prefs-textboxsize' => 'גודל חלון העריכה',
 'youremail' => 'דואר אלקטרוני:',
 'username' => 'שם {{GENDER:$1|המשתמש|המשתמשת}}:',
 'uid' => 'המספר הסידורי של {{GENDER:$1|המשתמש|המשתמשת}}:',
@@ -1544,6 +1606,8 @@ $1",
 'prefs-dateformat' => 'מבנה תאריך',
 'prefs-timeoffset' => 'הפרש זמנים',
 'prefs-advancedediting' => 'אפשרויות כלליות',
+'prefs-editor' => 'חלון העריכה',
+'prefs-preview' => 'תצוגה מקדימה',
 'prefs-advancedrc' => 'אפשרויות מתקדמות',
 'prefs-advancedrendering' => 'אפשרויות מתקדמות',
 'prefs-advancedsearchoptions' => 'אפשרויות מתקדמות',
@@ -1551,7 +1615,9 @@ $1",
 'prefs-displayrc' => 'אפשרויות תצוגה',
 'prefs-displaysearchoptions' => 'אפשרויות תצוגה',
 'prefs-displaywatchlist' => 'אפשרויות תצוגה',
+'prefs-tokenwatchlist' => 'אסימון',
 'prefs-diffs' => 'הבדלים בין גרסאות',
+'prefs-help-prefershttps' => 'העדפה זו תיכנס לתוקף בכניסה הבאה לחשבון.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'כתובת הדואר האלקטרוני נראית תקינה',
@@ -1578,6 +1644,8 @@ $1",
 'userrights-notallowed' => 'אין לכם הרשאה להוסיף או להסיר הרשאות של משתמשים.',
 'userrights-changeable-col' => 'קבוצות שבאפשרותכם לשנות',
 'userrights-unchangeable-col' => 'קבוצות שאין באפשרותכם לשנות',
+'userrights-conflict' => 'התנגשות בין שינויי הרשאות משתמש! אנא בדקו את השינויים שלכם ואשרו אותם.',
+'userrights-removed-self' => 'הסרת בהצלחה את הרשאות המשתמש שלך. לכן אין לך כעת אפשרות לגשת לדף זה.',
 
 # Groups
 'group' => 'קבוצה:',
@@ -1643,11 +1711,19 @@ $1",
 'right-proxyunbannable' => 'עקיפת חסימות אוטומטיות של שרתי פרוקסי',
 'right-unblockself' => 'שחרור חסימה של עצמך',
 'right-protect' => 'שינוי רמות הגנה ועריכת דפים המוגנים בהגנה מדורגת',
-'right-editprotected' => 'עריכת דפים מוגנים (ללא הגנה מדורגת)',
+'right-editprotected' => 'עריכת דפים שמוגנים ברמת "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'עריכת דפים שמוגנים ברמת "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'עריכת ממשק המשתמש',
 'right-editusercssjs' => 'עריכת דפי CSS ו־JavaScript של משתמשים אחרים',
 'right-editusercss' => 'עריכת דפי CSS של משתמשים אחרים',
 'right-edituserjs' => 'עריכת דפי JavaScript של משתמשים אחרים',
+'right-editmyusercss' => 'עריכת דפי CSS של עצמך',
+'right-editmyuserjs' => 'עריכת דפי JavaScript של עצמך',
+'right-viewmywatchlist' => 'צפייה ברשימת המעקב של עצמך',
+'right-editmywatchlist' => 'עריכת רשימת המעקב של עצמך. יצוין שמספר פעולות עדיין יוסיפו דפים גם ללא הרשאה זו.',
+'right-viewmyprivateinfo' => 'צפייה במידע הפרטי של עצמך (כגון: כתובת דוא"ל, שם אמיתי)',
+'right-editmyprivateinfo' => 'עריכת המידע הפרטי של עצמך (כגון: כתובת דוא"ל, שם אמיתי)',
+'right-editmyoptions' => 'עריכת ההעדפות של עצמך',
 'right-rollback' => 'שחזור מהיר של עריכות המשתמש האחרון שערך דף מסוים',
 'right-markbotedits' => 'סימון עריכות משוחזרות כעריכות של בוט',
 'right-noratelimit' => 'עקיפת הגבלת קצב העריכות',
@@ -1709,12 +1785,19 @@ $1",
 'action-userrights-interwiki' => 'לערוך את ההרשאות של משתמשים באתרי ויקי אחרים',
 'action-siteadmin' => 'לנעול או לבטל את נעילת בסיס הנתונים',
 'action-sendemail' => 'לשלוח דואר אלקטרוני',
+'action-editmywatchlist' => 'לערוך את רשימת המעקב שלך',
+'action-viewmywatchlist' => 'לצפות ברשימת המעקב שלך',
+'action-viewmyprivateinfo' => 'לצפות במידע הפרטי שלכם',
+'action-editmyprivateinfo' => 'לערוך את המידע הפרטי שלכם',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|שינוי אחד|$1 שינויים}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|מאז ביקורך האחרון}}',
+'enhancedrc-history' => 'היסטוריה',
 'recentchanges' => 'שינויים אחרונים',
 'recentchanges-legend' => 'אפשרויות בשינויים האחרונים',
 'recentchanges-summary' => 'ניתן לעקוב אחרי השינויים האחרונים באתר בדף זה.',
+'recentchanges-noresult' => 'לא היו בתקופה זו שינויים המתאימים לאפשרויות שנבחרו.',
 'recentchanges-feed-description' => 'ניתן לעקוב אחרי השינויים האחרונים באתר בדף זה.',
 'recentchanges-label-newpage' => 'בעריכה זו נוצר דף חדש',
 'recentchanges-label-minor' => 'זוהי עריכה משנית',
@@ -1751,7 +1834,6 @@ $1",
 'recentchangeslinked-feed' => 'שינויים בדפים המקושרים',
 'recentchangeslinked-toolbox' => 'שינויים בדפים המקושרים',
 'recentchangeslinked-title' => 'שינויים בדפים המקושרים מהדף $1',
-'recentchangeslinked-noresult' => 'לא היו שינויים בדפים המקושרים בתקופה זו.',
 'recentchangeslinked-summary' => "בדף מיוחד זה רשומים השינויים האחרונים בדפים המקושרים מתוך הדף (או בדפים הכלולים בקטגוריה).
 דפים ב[[Special:Watchlist|רשימת המעקב שלכם]] מוצגים ב'''הדגשה'''.",
 'recentchangeslinked-page' => 'שם הדף:',
@@ -1763,7 +1845,7 @@ $1",
 'reuploaddesc' => 'ביטול ההעלאה וחזרה לטופס העלאת קבצים לשרת',
 'upload-tryagain' => 'שליחת התיאור החדש של הקובץ',
 'uploadnologin' => 'לא נכנסתם לחשבון',
-'uploadnologintext' => 'עליכם [[Special:UserLogin|להיכנס לחשבון]] כדי להעלות קבצים.',
+'uploadnologintext' => 'עליכם $1 כדי להעלות קבצים.',
 'upload_directory_missing' => 'שרת האינטרנט אינו יכול ליצור את תיקיית ההעלאות ($1) החסרה.',
 'upload_directory_read_only' => 'שרת האינטרנט אינו יכול לכתוב בתיקיית ההעלאות ($1).',
 'uploaderror' => 'שגיאה בהעלאת הקובץ',
@@ -1994,7 +2076,6 @@ $1',
 'http-read-error' => 'שגיאת קריאה של HTTP.',
 'http-timed-out' => 'עבר זמן ההמתנה של בקשת ה־HTTP.',
 'http-curl-error' => 'שגיאה בקבלת כתובת ה־URL‏: $1',
-'http-host-unreachable' => 'לא ניתן להגיע לכתובת ה־URL.',
 'http-bad-status' => 'הייתה בעיה בשליחת בקשת ה־HTTP‏: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2022,6 +2103,10 @@ $1',
 'listfiles_size' => 'גודל',
 'listfiles_description' => 'תיאור',
 'listfiles_count' => 'גרסאות',
+'listfiles-show-all' => 'כולל גרסאות ישנות של תמונות',
+'listfiles-latestversion' => 'גרסה נוכחית',
+'listfiles-latestversion-yes' => 'כן',
+'listfiles-latestversion-no' => 'לא',
 
 # File description page
 'file-anchor-link' => 'קובץ',
@@ -2119,6 +2204,13 @@ $1',
 'randompage' => 'דף אקראי',
 'randompage-nopages' => 'אין דפים {{PLURAL:$2|במרחב השם הבא|במרחבי השם הבאים}}: $1.',
 
+# Random page in category
+'randomincategory' => 'דף אקראי בקטגוריה',
+'randomincategory-invalidcategory' => '"$1" אינו שם תקין לקטגוריה.',
+'randomincategory-nopages' => 'אין דפים בקטגוריה [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => 'קבלת דף אקראי מהקטגוריה: $1 $2.',
+'randomincategory-selectcategory-submit' => 'מעבר',
+
 # Random redirect
 'randomredirect' => 'הפניה אקראית',
 'randomredirect-nopages' => 'אין הפניות במרחב השם "$1".',
@@ -2144,17 +2236,13 @@ $1',
 'statistics-users-active-desc' => 'משתמשים שביצעו פעולה כלשהי {{PLURAL:$1|ביום האחרון|ביומיים האחרונים|ב־$1 הימים האחרונים}}',
 'statistics-mostpopular' => 'הדפים הנצפים ביותר',
 
-'disambiguations' => 'דפים שמקשרים לדפי פירושונים',
-'disambiguationspage' => 'Template:פירושונים',
-'disambiguations-text' => "בדפים הבאים יש לפחות קישור אחד ל'''דף פירושונים'''.
-ייתכן שעליהם לקשר במקום זאת לדף מתאים יותר.<br />
-דף נחשב לדף פירושונים אם הוא משתמש בתבנית המקושרת מהדף [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'דפים עם מאפיין דף',
 'pageswithprop-legend' => 'דפים עם מאפיין דף',
 'pageswithprop-text' => 'בדף זה מופיעה רשימת דפים שמשתמשים במאפיין דף מסוים.',
 'pageswithprop-prop' => 'שם המאפיין:',
 'pageswithprop-submit' => 'הצגה',
+'pageswithprop-prophidden-long' => 'ערך ארוך של מאפיין טקסטואלי הוסתר ($1)',
+'pageswithprop-prophidden-binary' => 'ערך של מאפיין בינארי הוסתר ($1)',
 
 'doubleredirects' => 'הפניות כפולות',
 'doubleredirectstext' => 'בדף הזה מופיעה רשימת דפי הפניה שמפנים לדפי הפניה אחרים.
@@ -2212,6 +2300,7 @@ $1',
 'mostrevisions' => 'הדפים בעלי מספר העריכות הגבוה ביותר',
 'prefixindex' => 'רשימת הדפים המתחילים ב…',
 'prefixindex-namespace' => 'רשימת הדפים המתחילים ב… (במרחב השם $1)',
+'prefixindex-strip' => 'הסתרת התחילית ברשימה',
 'shortpages' => 'דפים קצרים',
 'longpages' => 'דפים ארוכים',
 'deadendpages' => 'דפים ללא קישורים',
@@ -2227,6 +2316,7 @@ $1',
 'listusers' => 'רשימת משתמשים',
 'listusers-editsonly' => 'הצגת משתמשים עם עריכות בלבד',
 'listusers-creationsort' => 'סידור לפי תאריך היצירה',
+'listusers-desc' => 'סידור בסדר יורד',
 'usereditcount' => '{{PLURAL:$1|עריכה אחת|$1 עריכות}}',
 'usercreated' => '{{GENDER:$3|נוצר|נוצרה}} ב־$2, $1',
 'newpages' => 'דפים חדשים',
@@ -2405,10 +2495,9 @@ $1',
 'unwatchthispage' => 'הפסקת המעקב אחרי דף זה',
 'notanarticle' => 'זהו אינו דף תוכן',
 'notvisiblerev' => 'הגרסה האחרונה שנוצרה על ידי משתמש אחר נמחקה',
-'watchnochange' => 'אף אחד מהדפים ברשימת המעקב לא עודכן בפרק הזמן המצוין למעלה.',
 'watchlist-details' => 'ברשימת המעקב יש {{PLURAL:$1|דף אחד|$1 דפים}} (לא כולל דפי שיחה).',
-'wlheader-enotif' => '* הודעות דוא"ל מאופשרות.',
-'wlheader-showupdated' => "* דפים שהשתנו מאז ביקורכם האחרון בהם מוצגים ב'''הדגשה'''.",
+'wlheader-enotif' => 'הודעות דוא"ל מאופשרות.',
+'wlheader-showupdated' => "דפים שהשתנו מאז ביקורכם האחרון בהם מוצגים ב'''הדגשה'''.",
 'watchmethod-recent' => 'בודק את הדפים שברשימת המעקב לשינויים אחרונים.',
 'watchmethod-list' => 'בודק את העריכות האחרונות בדפים שברשימת המעקב',
 'watchlistcontains' => 'רשימת המעקב כוללת {{PLURAL:$1|דף אחד|$1 דפים}}.',
@@ -2654,7 +2743,7 @@ $1',
 'contributions' => 'תרומות {{GENDER:$1|המשתמש|המשתמשת}}',
 'contributions-title' => 'תרומות של המשתמש $1',
 'mycontris' => 'תרומות',
-'contribsub2' => 'עבור $1 ($2)',
+'contribsub2' => 'עבור {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'לא נמצאו שינויים המתאימים לקריטריונים אלו.',
 'uctop' => '(נוכחי)',
 'month' => 'עד החודש:',
@@ -2811,14 +2900,12 @@ $1',
 'ipb_blocked_as_range' => 'שגיאה: כתובת ה־IP $1 אינה חסומה ישירות ולכן לא ניתן לשחרר את חסימתה. עם זאת, היא חסומה כחלק מהטווח $2, שניתן לשחרר את חסימתו.',
 'ip_range_invalid' => 'טווח IP שגוי.',
 'ip_range_toolarge' => 'לא ניתן לחסום טווחים גדולים מ־<span dir="ltr">/$1</span>.',
-'blockme' => 'חסום אותי',
 'proxyblocker' => 'חוסם פרוקסי',
-'proxyblocker-disabled' => 'אפשרות זו מבוטלת.',
 'proxyblockreason' => 'כתובת ה־IP שלכם נחסמה משום שהיא כתובת של שרת פרוקסי פתוח.
 אנא צרו קשר עם ספק האינטרנט שלכם או עם התמיכה הטכנית של הארגון שלכם והודיעו להם על בעיית האבטחה החמורה הזאת.',
-'proxyblocksuccess' => 'בוצע.',
 'sorbsreason' => 'כתובת ה־IP שלכם רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר זה משתמש בו.',
 'sorbs_create_account_reason' => 'כתובת ה־IP שלכם רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר זה משתמש בו. אינכם יכולים ליצור חשבון.',
+'xffblockreason' => 'כתובת IP הנמצאת בכותרת X-Forwarded-For, בין אם שלכם או של שרת פרוקסי שאתם משתמשים בו, נחסמה. סיבת החסימה המקורית הייתה: $1',
 'cant-block-while-blocked' => 'אינכם יכולים לחסום משתמשים אחרים כשאתם חסומים.',
 'cant-see-hidden-user' => 'המשתמש שאתם מנסים לחסום כבר נחסם והוסתר. כיוון שאין לכם את ההרשאה לחסימת משתמש והסתרתו, אינכם רשאים לצפות בחסימת המשתמש או לערוך אותה.',
 'ipbblocked' => 'אינכם יכולים לחסום או לשחרר את חסימתם של משתמשים אחרים, כיוון שאתם עצמכם חסומים',
@@ -2983,6 +3070,8 @@ $1',
 'thumbnail-more' => 'הגדלה',
 'filemissing' => 'קובץ חסר',
 'thumbnail_error' => 'שגיאה ביצירת תמונה ממוזערת: $1',
+'thumbnail_error_remote' => 'הודעת שגיאה של $1:
+$2',
 'djvu_page_error' => 'דף ה־DjVu מחוץ לטווח',
 'djvu_no_xml' => 'לא ניתן היה לקבל את ה־XML עבור קובץ ה־DjVu',
 'thumbnail-temp-create' => 'לא הצליחה יצירת קובץ תמונה ממוזערת זמני',
@@ -3133,17 +3222,11 @@ $1',
 
 # Stylesheets
 'common.css' => '/* הסגנונות הנכתבים כאן ישפיעו על כל העיצובים */',
-'standard.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Standard בלבד */',
-'nostalgia.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Nostalgia בלבד */',
 'cologneblue.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב CologneBlue בלבד */',
 'monobook.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב MonoBook בלבד */',
-'myskin.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב MySkin בלבד */',
-'chick.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Chick בלבד */',
-'simple.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Simple בלבד */',
 'modern.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Modern בלבד */',
 'vector.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Vector בלבד */',
 'print.css' => '/* הסגנונות הנכתבים כאן ישפיעו על הפלט בהדפסה בלבד */',
-'handheld.css' => '/* הסגנונות הנכתבים כאן ישפיעו על מכשירים ניידים המבוססים על העיצוב שבהגדרה $wgHandheldStyle בלבד */',
 'noscript.css' => '/* הסגנונות הנכתבים כאן ישפיעו על משתמשים עם JavaScript מבוטל */',
 'group-autoconfirmed.css' => '/* הסגנונות הנכתבים כאן ישפיעו על משתמשים ותיקים בלבד */',
 'group-bot.css' => '/* הסגנונות הנכתבים כאן ישפיעו על בוטים בלבד */',
@@ -3152,13 +3235,8 @@ $1',
 
 # Scripts
 'common.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור כל המשתמשים בכל טעינת עמוד */',
-'standard.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Standard */',
-'nostalgia.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Nostalgia */',
 'cologneblue.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב CologneBlue */',
 'monobook.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Monobook */',
-'myskin.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב MySkin */',
-'chick.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Chick */',
-'simple.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Simple */',
 'modern.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Modern */',
 'vector.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Vector */',
 'group-autoconfirmed.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור משתמשים ותיקים בלבד */',
@@ -3238,13 +3316,8 @@ $1',
 'pageinfo-category-files' => 'מספר הקבצים',
 
 # Skin names
-'skinname-standard' => 'קלאסי',
-'skinname-nostalgia' => 'נוסטלגיה',
 'skinname-cologneblue' => 'מים כחולים',
 'skinname-monobook' => 'מונובוק',
-'skinname-myskin' => 'העיצוב שלי',
-'skinname-chick' => "צ'יק",
-'skinname-simple' => 'פשוט',
 'skinname-modern' => 'מודרני',
 'skinname-vector' => 'וקטור',
 
@@ -3327,11 +3400,25 @@ $1',
 'minutes' => '{{PLURAL:$1|דקה|$1 דקות}}',
 'hours' => '{{PLURAL:$1|שעה|שעתיים|$1 שעות}}',
 'days' => '{{PLURAL:$1|יום|יומיים|$1 ימים}}',
+'weeks' => '{{PLURAL:$1|שבוע|שבועיים|$1 שבועות}}',
 'months' => '{{PLURAL:$1|חודש|חודשיים|$1 חודשים}}',
 'years' => '{{PLURAL:$1|שנה|שנתיים|$1 שנים}}',
 'ago' => 'לפני $1',
 'just-now' => 'לפני זמן קצר',
 
+# Human-readable timestamps
+'hours-ago' => 'לפני {{PLURAL:$1|שעה|שעתיים|$1 שעות}}',
+'minutes-ago' => 'לפני {{PLURAL:$1|דקה|$1 דקות}}',
+'seconds-ago' => 'לפני {{PLURAL:$1|שנייה|$1 שניות}}',
+'monday-at' => 'ביום שני בשעה $1',
+'tuesday-at' => 'ביום שלישי בשעה $1',
+'wednesday-at' => 'ביום רביעי בשעה $1',
+'thursday-at' => 'ביום חמישי בשעה $1',
+'friday-at' => 'ביום שישי בשעה $1',
+'saturday-at' => 'בשבת בשעה $1',
+'sunday-at' => 'ביום ראשון בשעה $1',
+'yesterday-at' => 'אתמול בשעה $1',
+
 # Bad image list
 'bad_image_list' => 'דרך הכתיבה בהודעה היא כמתואר להלן:
 
@@ -3361,7 +3448,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'רוחב',
 'exif-imagelength' => 'גובה',
 'exif-bitspersample' => 'ביטים לרכיב',
@@ -3540,7 +3627,7 @@ $1',
 'exif-originalimageheight' => 'גובה התמונה לפני קיטוע',
 'exif-originalimagewidth' => 'רוחב התמונה לפני קיטוע',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'לא דחוס',
 'exif-compression-2' => 'קידוד הופמן מואתם חד-מימדי לאורך ריצה CCITT קבוצה 3',
 'exif-compression-3' => 'קידוד פקס CCITT קבוצה 3',
@@ -3993,7 +4080,6 @@ $5
 'version-other' => 'אחר',
 'version-mediahandlers' => 'מציגי מדיה',
 'version-hooks' => 'מבני Hook',
-'version-extension-functions' => 'פונקציות של הרחבות',
 'version-parser-extensiontags' => 'תגיות של הרחבות מפענח',
 'version-parser-function-hooks' => 'מבנים של פונקציות מפענח',
 'version-hook-name' => 'שם ה־Hook',
@@ -4002,6 +4088,7 @@ $5
 'version-license' => 'רישיון',
 'version-poweredby-credits' => "אתר הוויקי הזה מופעל על ידי '''[//www.mediawiki.org/ מדיה־ויקי]''', © 2001–$1 $2.",
 'version-poweredby-others' => 'אחרים',
+'version-poweredby-translators' => 'מתרגמי translatewiki.net',
 'version-credits-summary' => 'אנו רוצים להודות לאנשים הבאים על תרומתם ל[[Special:Version|מדיה־ויקי]].',
 'version-license-info' => "מדיה־ויקי היא תוכנה חופשית; באפשרותכם להפיץ אותה מחדש ו/או לשנות אותה לפי תנאי הרישיון הציבורי הכללי של גנו המפורסם על ידי המוסד לתוכנה חופשית: גרסה 2 של רישיון זה, או (לפי בחירתכם) כל גרסה מאוחרת יותר.
 
@@ -4015,12 +4102,17 @@ $5
 'version-entrypoints-header-entrypoint' => 'נקודת כניסה',
 'version-entrypoints-header-url' => 'כתובת',
 
-# Special:FilePath
-'filepath' => 'נתיב לקובץ',
-'filepath-page' => 'הקובץ:',
-'filepath-submit' => 'הצגה',
-'filepath-summary' => 'דף זה מציג את הנתיב המלא לקבצים שהועלו.
-תמונות מוצגות ברזולוציה מלאה, וסוגי קבצים אחרים מוצגים ישירות באמצעות התוכנה שהוגדרה להצגתם.',
+# Special:Redirect
+'redirect' => 'הפניה לפי שם קובץ, מספר משתמש או מספר גרסה',
+'redirect-legend' => 'הפניה לקובץ או לדף',
+'redirect-summary' => 'דף מיוחד זה מפנה לקובץ (בהינתן שם הקובץ), לדף (בהינתן מספר גרסה), או לדף משתמש (בהינתן מספר משתמש).',
+'redirect-submit' => 'מעבר',
+'redirect-lookup' => 'סוג:',
+'redirect-value' => 'ערך:',
+'redirect-user' => 'מספר משתמש',
+'redirect-revision' => 'גרסת דף',
+'redirect-file' => 'שם קובץ',
+'redirect-not-exists' => 'הערך לא נמצא',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'חיפוש קבצים כפולים',
@@ -4069,12 +4161,16 @@ $5
 'tags' => 'התגיות הקיימות לסימון שינויים',
 'tag-filter' => 'מסנן [[Special:Tags|תגיות]]:',
 'tag-filter-submit' => 'סינון',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|תגית|תגיות}}]]: $2)',
 'tags-title' => 'תגיות',
 'tags-intro' => 'דף זה מכיל רשימה של תגיות שהתוכנה יכולה לסמן איתן עריכה, ומשמעויותיהן.',
 'tags-tag' => 'שם התגית',
 'tags-display-header' => 'הופעה ברשימות השינויים',
 'tags-description-header' => 'תיאור מלא של המשמעות',
+'tags-active-header' => 'פעילה?',
 'tags-hitcount-header' => 'שינויים עם תגיות',
+'tags-active-yes' => 'כן',
+'tags-active-no' => 'לא',
 'tags-edit' => 'עריכה',
 'tags-hitcount' => '{{PLURAL:$1|שינוי אחד|$1 שינויים}}',
 
@@ -4095,6 +4191,7 @@ $5
 'dberr-problems' => 'מצטערים! קיימת בעיה טכנית באתר זה.',
 'dberr-again' => 'נסו להמתין מספר שניות ולהעלות מחדש את הדף.',
 'dberr-info' => '(לא ניתן ליצור קשר עם שרת הנתונים: $1)',
+'dberr-info-hidden' => '(לא ניתן ליצור קשר עם שרת הנתונים)',
 'dberr-usegoogle' => 'באפשרותכם לנסות לחפש דרך גוגל בינתיים.',
 'dberr-outofdate' => 'שימו לב שהתוכן שלנו כפי שנשמר במאגר שם עשוי שלא להיות מעודכן.',
 'dberr-cachederror' => 'זהו עותק שמור של המידע, והוא עשוי שלא להיות מעודכן.',
@@ -4110,6 +4207,9 @@ $5
 'htmlform-submit' => 'שליחה',
 'htmlform-reset' => 'ביטול השינויים',
 'htmlform-selectorother-other' => 'אחר',
+'htmlform-no' => 'לא',
+'htmlform-yes' => 'כן',
+'htmlform-chosen-placeholder' => 'נא לבחור אפשרות',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 עם תמיכה בחיפוש בטקסט מלא',
@@ -4227,4 +4327,19 @@ $5
 # Image rotation
 'rotate-comment' => 'התמונה סובבה {{PLURAL:$1|במעלה אחת|ב֫־$1 מעלות}} בכיוון השעון',
 
+# Limit report
+'limitreport-title' => 'מידע על ביצועי המפענח:',
+'limitreport-cputime' => 'זמן CPU',
+'limitreport-cputime-value' => '{{PLURAL:$1|שנייה|$1 שניות}}',
+'limitreport-walltime' => 'זמן אמיתי',
+'limitreport-walltime-value' => '{{PLURAL:$1|שנייה|$1 שניות}}',
+'limitreport-ppvisitednodes' => 'מספר הצמתים שקדם־המפענח ביקר בהם',
+'limitreport-ppgeneratednodes' => 'מספר הצמתים שקדם־המפענח יצר',
+'limitreport-postexpandincludesize' => 'גודל הטקסט המוכלל לאחר הפריסה',
+'limitreport-postexpandincludesize-value' => '{{PLURAL:$2|$1 מתוך בית אחד|$1/$2 בתים}}',
+'limitreport-templateargumentsize' => 'גודל הפרמטרים של התבניות',
+'limitreport-templateargumentsize-value' => '{{PLURAL:$2|$1 מתוך בית אחד|$1/$2 בתים}}',
+'limitreport-expansiondepth' => 'עומק הפריסה הגבוה ביותר',
+'limitreport-expensivefunctioncount' => 'מספר פונקציות המפענח שגוזלות משאבים',
+
 );
diff --git a/languages/messages/MessagesHi.php b/languages/messages/MessagesHi.php
index 1ca66566..1a6a7a00 100644
--- a/languages/messages/MessagesHi.php
+++ b/languages/messages/MessagesHi.php
@@ -183,7 +183,7 @@ $digitTransformTable = array(
 	'8' => '८', # &#x096e;
 	'9' => '९', # &#x096f;
 );
-$linkTrail = "/^([a-z]+)(.*)$/sD";
+$linkTrail = "/^([a-z\x{0900}-\x{0963}\x{0966}-\x{A8E0}-\x{A8FF}]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
 
@@ -218,9 +218,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ध्यान रखने वाले सदस्यों की संख्या दिखाएँ',
 'tog-oldsig' => 'वर्तमान हस्ताक्षर:',
 'tog-fancysig' => 'हस्ताक्षर का विकिपाठ के समान मानें (बिना स्वचालित कड़ी के)',
-'tog-externaleditor' => 'डिफ़ॉल्ट रूप से बाह्य सम्पादक का उपयोग करें (केवल विशेषज्ञों के लिए, इसके लिए संगणक पर विशेष जमाव चाहिए होंगे। [//www.mediawiki.org/wiki/Manual:External_editors अधिक जानकारी।])',
-'tog-externaldiff' => 'डिफ़ॉल्ट रूप से बाह्य अन्तर का उपयोग करें (केवल विशेषज्ञों के लिए, इसके लिए संगणक पर विशेष जमाव चाहिए होंगे। [//www.mediawiki.org/wiki/Manual:External_editors अधिक जानकारी।])',
-'tog-showjumplinks' => '"की ओर जाएं" कड़ियाँ उपलब्ध कराएँ',
 'tog-uselivepreview' => 'सजीवन झलक का उपयोग करें (प्रयोगात्मक)',
 'tog-forceeditsummary' => 'यदि सम्पादन सारांश ना दिया गया हो तो मुझे सूचित करें',
 'tog-watchlisthideown' => 'मेरी ध्यानसूची से मेरे किए परिवर्तन छिपाएँ',
@@ -233,6 +230,8 @@ $messages = array(
 'tog-diffonly' => 'अवतरणों में अन्तर दर्शाते समय पुराने अवतरण न दिखाएँ',
 'tog-showhiddencats' => 'छिपाई हुई श्रेणियाँ दिखाएँ',
 'tog-norollbackdiff' => 'सम्पादन वापस लेने के बाद अन्तर न दिखाएँ',
+'tog-useeditwarning' => 'जब मैं किसी सम्पादन पृष्ठ को बिना सहेजे बदलावों के साथ छोड़ूँ तो मुझे सूचित करें।',
+'tog-prefershttps' => 'लॉगिन करने के पश्चात् सदैव सुरक्षित कनेक्शन का प्रयोग करें',
 
 'underline-always' => 'सदैव',
 'underline-never' => 'कभी नहीं',
@@ -296,6 +295,18 @@ $messages = array(
 'oct' => 'अक्टू॰',
 'nov' => 'नव॰',
 'dec' => 'दिस॰',
+'january-date' => 'जनवरी $1',
+'february-date' => 'फ़रवरी $1',
+'march-date' => 'मार्च $1',
+'april-date' => 'अप्रैल $1',
+'may-date' => 'मई $1',
+'june-date' => 'जून $1',
+'july-date' => 'जुलाई $1',
+'august-date' => 'अगस्त $1',
+'september-date' => 'सितम्बर $1',
+'october-date' => 'अक्टूबर $1',
+'november-date' => 'नवम्बर $1',
+'december-date' => 'दिसम्बर $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|श्रेणी|श्रेणियाँ}}',
@@ -377,6 +388,7 @@ $messages = array(
 'create-this-page' => 'यह पृष्ठ बनाएँ',
 'delete' => 'हटाएँ',
 'deletethispage' => 'इस पृष्ठ को हटायें',
+'undeletethispage' => 'इस पृष्ठ को पुनर्स्थापित करें।',
 'undelete_short' => '{{PLURAL:$1|एक हटाया गया|$1 हटाए गए}} बदलाव वापस लायें',
 'viewdeleted_short' => 'देखें {{PLURAL:$1|एक हटाया गया सम्पादन|$1 हटाए गए सम्पादन}}',
 'protect' => 'सुरक्षित करें',
@@ -420,7 +432,7 @@ $1',
 'pool-queuefull' => 'पूल पंक्ति भरी हुई है',
 'pool-errorunknown' => 'अज्ञात त्रुटि',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} के बारे में',
 'aboutpage' => 'Project:परिचय',
 'copyright' => 'उपलब्ध सामग्री $1 के अधीन है जब तक अलग से उल्लेख ना किया गया हो।',
@@ -430,7 +442,6 @@ $1',
 'disclaimers' => 'अस्वीकरण',
 'disclaimerpage' => 'Project:साधारण अस्वीकरण',
 'edithelp' => 'सम्पादन सहायता',
-'edithelppage' => 'Help:संपादन',
 'helppage' => 'Help:सहायता',
 'mainpage' => 'मुखपृष्ठ',
 'mainpage-description' => 'मुखपृष्ठ',
@@ -509,17 +520,12 @@ $1',
 # General errors
 'error' => 'त्रुटि',
 'databaseerror' => 'डाटाबेस त्रुटि',
-'dberrortext' => 'डाटाबेस प्रश्न वाक्यरचना में त्रुटि मिली है।
-संभव है कि यह सॉफ़्टवेयर में त्रुटि की वजह से हो।
-पिछला डाटाबेस प्रश्न था:
-<blockquote><code>$1</code></blockquote>
- "<code>$2</code>" कार्य समूह से।
-डाटाबेस की त्रुटि थी "<samp>$3: $4</samp>"।',
-'dberrortextcl' => 'डाटाबेस प्रश्न की वाक्यरचना में त्रुटि मिली।
-डाटाबेस में पिछला प्रश्न था:
-"$1"
-कार्यसमूह "$2" से।
-डाटाबेस से त्रुटि आई "$3: $4"',
+'databaseerror-text' => 'डाटाबेस अनुरोध त्रुटि हुई है।
+संभवतः सॉफ़्टवेयर में गड़बड़ी है।',
+'databaseerror-textcl' => 'डाटाबेस अनुरोध त्रुटि हुई है।',
+'databaseerror-query' => 'अनुरोध: $1',
+'databaseerror-function' => 'फ़ंक्शन: $1',
+'databaseerror-error' => 'त्रुटि: $1',
 'laggedslavemode' => "'''चेतावनी:''' यह पृष्ठ अद्यतनीत जानकारी-युक्त ना होने की आशंका है।",
 'readonly' => 'डाटाबेस लॉक किया हुआ है',
 'enterlockreason' => 'लॉक करने का कारण दीजिए, साथ ही लॉक खुलने के समय का लगभग आकलन दिजीये।',
@@ -553,6 +559,7 @@ $1',
 'cannotdelete-title' => '"$1" पृष्ठ को हटाया नहीं जा सकता',
 'delete-hook-aborted' => 'हुक द्वारा हटाना बीच में ही छोड़ा गया।
 इसने कोई कारण नहीं बताया।',
+'no-null-revision' => '"$1" पृष्ठ के लिए बिना बदलावों का नया अवतरण बनाने में असफल।',
 'badtitle' => 'खराब शीर्षक',
 'badtitletext' => 'आपके द्वारा अनुरोधित शीर्षक अयोग्य, ख़ाली या गलत जुड़ा हुआ अंतर-भाषीय या अंतर-विकि शीर्षक है।
 इसमें एक या एक से अधिक ऐसे कॅरेक्टर हो सकते हैं जो शीर्षक में प्रयोग नहीं किये जा सकते।',
@@ -575,12 +582,15 @@ $1',
 'editinginterface' => "'''चेतावनी:''' आप एक ऐसे पृष्ठ को बदल रहे हैं जो सॉफ़्टवेयर का इंटरफ़ेस पाठ प्रदान करता है।
 इस पृष्ठ को बदलने से अन्य सदस्यों को प्रदर्शित इंटरफ़ेस की शक्लोसूरत में बदलाव आएगा।
 सभी विकियों के लिए अनुवाद बदलने या जोड़ने के लिए कृपया मीडियाविकि की क्षेत्रीयकरण परियोजना [//translatewiki.net/wiki/Main_Page?setlang=hi translatewiki.net] का प्रयोग करें।",
-'sqlhidden' => '(छुपाई हुई SQL पृच्छा)',
 'cascadeprotected' => 'यह पृष्ठ सुरक्षित हैं, क्योंकी यह निम्नलिखित {{PLURAL:$1|पृष्ठ|पृष्ठों}} की सुरक्षा-सीढ़ी में समाविष्ट है:
 $2',
 'namespaceprotected' => "आपको '''$1''' नामस्थान में समाविष्ट पृष्ठों को बदलने की अनुमति नहीं है।",
 'customcssprotected' => 'आपको इस CSS पृष्ठ को संपादित करने की अनुमति नहीं है, क्योंकि इसमें अन्य सदस्य की व्यक्तिगत सेटिंग्स शामिल हैं।',
 'customjsprotected' => 'आपको इस जावास्क्रिप्ट पृष्ठ को संपादित करने की अनुमति नहीं है, क्योंकि इसमें अन्य सदस्य की व्यक्तिगत सेटिंग्स शामिल हैं।',
+'mycustomcssprotected' => 'आपके पास इस CSS पृष्ठ को सम्पादित करने का अधिकार नहीं है।',
+'mycustomjsprotected' => 'आपके पास इस जावास्क्रिप्ट पृष्ठ को सम्पादित करने का अधिकार नहीं है।',
+'myprivateinfoprotected' => 'आपके पास अपनी व्यक्तिगत जानकारी बदलने की अनुमति नहीं है।',
+'mypreferencesprotected' => 'आपके पास अपनी वरीयताएँ बदलने की अनुमति नहीं है।',
 'ns-specialprotected' => 'विशेष पृष्ठ सम्पादित नहीं किये जा सकते।',
 'titleprotected' => 'सदस्य [[User:$1|$1]] ने इस शीर्षक का पृष्ठ बनाने से सुरक्षित किया हुआ है।
 इसके लिये निम्न कारण दिया गया है: "\'\'$2\'\'"',
@@ -605,10 +615,19 @@ $2',
 'welcomecreation-msg' => 'आपका खाता बना दिया गया है।
 अपनी [[Special:Preferences|{{SITENAME}} वरीयताएँ]] बदलना ना भूलियेगा।',
 'yourname' => 'सदस्यनाम:',
+'userlogin-yourname' => 'सदस्यनाम',
+'userlogin-yourname-ph' => 'अपना सदस्यनाम लिखें',
+'createacct-another-username-ph' => 'सदस्यनाम प्रदान करें',
 'yourpassword' => 'कूटशब्द:',
+'userlogin-yourpassword' => 'कूटशब्द (पासवर्ड)',
+'userlogin-yourpassword-ph' => 'अपना कूटशब्द लिखें',
+'createacct-yourpassword-ph' => 'कूटशब्द दर्ज करें',
 'yourpasswordagain' => 'कूटशब्द दुबारा लिखें:',
+'createacct-yourpasswordagain' => 'कूटशब्द की पुष्टि करें',
+'createacct-yourpasswordagain-ph' => 'कूटशब्द पुनः लिखें',
 'remembermypassword' => 'इस ब्राउज़र पर मेरा लॉगिन याद रखें (अधिकतम $1 {{PLURAL:$1|दिन|दिनों}} के लिए)',
-'securelogin-stick-https' => 'प्रवेश के बाद HTTPS से जुड़े रहें',
+'userlogin-remembermypassword' => 'मुझे लॉग्ड इन रखें',
+'userlogin-signwithsecure' => 'सुरक्षित कनेक्शन का प्रयोग करें',
 'yourdomainname' => 'आपका डोमेन:',
 'password-change-forbidden' => 'आप इस विकि पर कूटशब्द नहीं बदल सकते हैं।',
 'externaldberror' => 'या तो प्रमाणिकरण डाटाबेस में त्रुटि हुई है या फिर आपको अपना बाह्य खाता अपडेट करने की अनुमति नहीं है।',
@@ -620,18 +639,41 @@ $2',
 'logout' => 'सत्रांत',
 'userlogout' => 'सत्रांत',
 'notloggedin' => 'लॉग इन नहीं किया है',
+'userlogin-noaccount' => 'खाता नहीं है?',
+'userlogin-joinproject' => '{{SITENAME}} से जुड़ें',
 'nologin' => "क्या आपने सदस्यता नहीं ली है? '''$1'''।",
 'nologinlink' => 'नया खाता बनाएँ',
 'createaccount' => 'खाता बनाएँ',
 'gotaccount' => "पहले से आपका खाता है? '''$1''' करें।",
 'gotaccountlink' => 'लॉग इन',
 'userlogin-resetlink' => 'अपनी प्रवेश जानकारी भूल गए हैं?',
+'userlogin-resetpassword-link' => 'अपना कूटशब्द रीसेट करें',
+'helplogin-url' => 'Help:लॉगिंग इन',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|लॉग इन करने में सहायता]]',
+'createacct-join' => 'अपनी जानकारी नीचे लिखें',
+'createacct-another-join' => 'नए खाते की जानकारी नीचे प्रदान करें।',
+'createacct-emailrequired' => 'ई-मेल पता',
+'createacct-emailoptional' => 'ई-मेल पता (वैकल्पिक)',
+'createacct-email-ph' => 'अपना ई-मेल पता लिखें',
+'createacct-another-email-ph' => 'ईमेल पता प्रदान करें',
 'createaccountmail' => 'एक अस्थायी यादृच्छिक (रैंडम) कूटशब्द चुनें और उसे निर्दिष्ट ई-मेल पते पर भेजें',
+'createacct-realname' => 'असली नाम (वैकल्पिक)',
 'createaccountreason' => 'कारण:',
+'createacct-reason' => 'कारण',
+'createacct-reason-ph' => 'आप एक अन्य खाता क्यों बना रहे हैं',
+'createacct-captcha' => 'सुरक्षा जाँच',
+'createacct-imgcaptcha-ph' => 'उपरोक्त पाठ लिखें',
+'createacct-submit' => 'अपना खाता बनाएँ',
+'createacct-another-submit' => 'एक अन्य खाता खोलें',
+'createacct-benefit-heading' => '{{SITENAME}} आपके जैसे लोगों द्वारा बनायी गई है।',
+'createacct-benefit-body1' => '{{PLURAL:$1|सम्पादन}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|पृष्ठ}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|योगदानकर्ता}}',
 'badretype' => 'आपने जो कूटशब्द दिये हैं वे एक दूसरे से नहीं मिलते। फिर से लिखें।',
 'userexists' => 'आपका दिया सदस्यनाम पहले से प्रयोग में है।
 कृपया कोई अन्य सदस्यनाम चुनें।',
 'loginerror' => 'लॉग इन त्रुटि',
+'createacct-error' => 'खाता निर्माण त्रुटि',
 'createaccounterror' => 'खाता नहीं बन पाया: $1',
 'nocookiesnew' => 'आपका खाता खोल दिया गया है, पर आप लॉग इन नहीं हुए हैं।
 {{SITENAME}} पर लॉग इन करने के लिये कुकीज़ का प्रयोग होता है।
@@ -694,10 +736,12 @@ $2',
 यदि यह खाता गलती से खोला गया है, तो आप इस मेसेज को नज़रंदाज़ कर सकते हैं।',
 'usernamehasherror' => 'सदस्यनाम में हैश कैरैक्टर वर्जित हैं।',
 'login-throttled' => 'आपने हाल ही में कई बार लॉग इन करने के प्रयास किये हैं।
-पुनः प्रयास करने से पहले थोड़ी प्रतीक्षा करें।',
+पुनः प्रयास करने से पहले कृपया $1 प्रतीक्षा करें।',
 'login-abort-generic' => 'आपका सत्रारम्भ असफल रहा - निष्फलित',
 'loginlanguagelabel' => 'भाषा: $1',
 'suspicious-userlogout' => 'अपका लॉग आउट करने का अनुरोध अस्वीकृत कर दिया गया है क्योंकि ऐसा प्रतीत होता है कि यह किसी खराब ब्राउज़र या कैश करने वाली प्रॉक्सी द्वारा भेजा गया था।',
+'createacct-another-realname-tip' => 'असली नाम देना आवश्यक नहीं है।
+यदि आप प्रदान करते हैं तो इसका प्रयोग सदस्य के योगदानों के लिये उनको श्रेय (attribution) देने के लिये किया जायेगा।',
 
 # Email sending
 'php-mail-error-unknown' => 'PHP के mail() फ़ंक्शन में अज्ञात त्रुटि हुई।',
@@ -714,8 +758,7 @@ $2',
 'newpassword' => 'नया कूटशब्द:',
 'retypenew' => 'नया कूटशब्द पुन: लिखें:',
 'resetpass_submit' => 'कूटशब्द बनाएँ और लॉग इन करें',
-'resetpass_success' => 'आपका कूटशब्द बदल दिया गया है!
-आपको लॉग इन किया जा रहा है...',
+'changepassword-success' => 'आपका कूटशब्द बदल दिया गया है!',
 'resetpass_forbidden' => 'कूटशब्द बदले नहीं जा सकते',
 'resetpass-no-info' => 'इस पृष्ठ का सीधे प्रयोग करने के लिए आपको लॉग इन करना होगा।',
 'resetpass-submit-loggedin' => 'कूटशब्द बदलें',
@@ -727,10 +770,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'कूटशब्द रीसेट',
-'passwordreset-text' => 'अपने कूटशब्द को रीसेट करने के लिए इस फ़ॉर्म को पूरा करें।',
+'passwordreset-text-one' => 'अपना कूटशब्द रीसेट करने के लिए यह फ़ॉर्म भरें।',
+'passwordreset-text-many' => '{{PLURAL:$1|अपना कूटशब्द रीसेट करने के लिए निम्न में से कोई एक भरें।}}',
 'passwordreset-legend' => 'कूटशब्द रीसेट करें',
 'passwordreset-disabled' => 'कूटशब्द रीसेट करना इस विकी पर अक्षम है।',
-'passwordreset-pretext' => '{{PLURAL:$1||नीचे पूछे गए डेटा में से एक लिखें}}',
+'passwordreset-emaildisabled' => 'इस विकि पर ई-मेल सुविधा अक्षम कर दी गयी है।',
 'passwordreset-username' => 'सदस्यनाम:',
 'passwordreset-domain' => 'डोमेन:',
 'passwordreset-capture' => 'परिणामस्वरूप बना ई-मेल देखें?',
@@ -752,7 +796,8 @@ $2
 अस्थायी कूटशब्द: $2',
 'passwordreset-emailsent' => 'एक कूटशब्द रीसेट ई-मेल भेज दिया गया है।',
 'passwordreset-emailsent-capture' => 'नीचे दिखाया गया कूटशब्द रीसेट ई-मेल भेज दिया गया है।',
-'passwordreset-emailerror-capture' => 'नीचे दृष्टित अनुस्मारक ई-मेल उत्पन्न किया गया था, परंतु उसे $1 सदस्य को भेजना असफल रहा।',
+'passwordreset-emailerror-capture' => 'नीचे दृष्टित कूटशब्द रीसेट ई-मेल उत्पन्न किया गया था, परंतु उसे {{GENDER:$2|सदस्य}} को भेजना असफल रहा।
+त्रुटि: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ई-मेल पता परिवर्तित करें',
@@ -766,6 +811,19 @@ $2
 'changeemail-submit' => 'ई-मेल बदलें',
 'changeemail-cancel' => 'रद्द करें',
 
+# Special:ResetTokens
+'resettokens' => 'टोकन रीसेट करें',
+'resettokens-text' => 'जो टोकन आपके खाते से सम्बद्ध कुछ विशिष्ट व्यक्तिगत जानकारी प्रदान करते हैं, आप उन्हें यहाँ रीसेट कर सकते हैं।
+
+यदि आपने उन्हें गलती से किसी को दिखा दिया है या फिर आपका खाता हैक हो गया है तो आपको इन्हें रीसेट कर देना चाहिए।',
+'resettokens-no-tokens' => 'रीसेट करने के लिए कोई टोकन नहीं हैं।',
+'resettokens-legend' => 'टोकन रीसेट करें',
+'resettokens-tokens' => 'टोकन:',
+'resettokens-token-label' => '$1 (वर्तमान मूल्य: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|आपकी ध्यानसूची के पृष्ठों में बदलावों]] की वेब फ़ीड (Atom/RSS) हेतु टोकन',
+'resettokens-done' => 'टोकन रीसेट कर दिए गए।',
+'resettokens-resetbutton' => 'चुने हुए टोकन रीसेट करें',
+
 # Edit page toolbar
 'bold_sample' => 'मोटा पाठ',
 'bold_tip' => 'बोल्ड पाठ',
@@ -972,12 +1030,15 @@ $2
 लगता है यह हटा दिया गया है।',
 'edit-conflict' => 'संपादन अंतर्विरोध',
 'edit-no-change' => 'आपने कोई बदलाव ही नहीं किए, अतः आपके इस संपादन को नज़रंदाज़ कर दिया गया है।',
+'postedit-confirmation' => 'आपका सम्पादन सहेजा गया है।',
 'edit-already-exists' => 'नया पृष्ठ बनाया नहीं जा सका।
 यह पहले से मौजूद है।',
 'defaultmessagetext' => 'संदेश का डिफ़ॉल्ट पाठ',
 'content-failed-to-parse' => '$1 के लिए $2 सामग्री को पार्स करने में विफल, त्रुटि: $3',
 'invalid-content-data' => 'अवैध डाटा सामग्री',
 'content-not-allowed-here' => '[[$2]] पृष्ठ पर "$1" सामग्री मना है।',
+'editwarning-warning' => 'इस पृष्ठ को छोड़ने पर आपके द्वारा किये गए कोई भी बदलाव गायब हो जाएँगे।
+यदि आपने लॉग इन किया हुआ है तो आप इस सूचना का दिखना अपनी वरीयताओं के "संपादन" भाग में बंद कर सकते हैं।',
 
 # Content models
 'content-model-wikitext' => 'विकिटेक्स्ट',
@@ -1013,6 +1074,7 @@ $2
 'undo-failure' => 'इस बीच अन्य बदलाव होने के कारण यह संपादन पूर्ववत करना संभव नहीं है।',
 'undo-norev' => 'यह बदलाव वापिस नहीं कर पाये हैं क्योंकि या तो इसे पहले से पलटा दिया गया है या फिर पृष्ठ हटा दिया गया है।',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|वार्ता]]) द्वारा किए बदलाव $1 को पूर्ववत किये',
+'undo-summary-username-hidden' => 'छुपाए गए सदस्य द्वारा किये संशोधन $1 को पूर्ववत किया',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'खाता खोल नहीं सकते',
@@ -1194,6 +1256,7 @@ $1",
 'compareselectedversions' => 'चुने हुए अवतरणों की तुलना करें',
 'showhideselectedversions' => 'चयनित अवतरण दिखाएँ/छिपाएँ',
 'editundo' => 'पूर्ववत करें',
+'diff-empty' => '(कोई अंतर नहीं)',
 'diff-multi' => '({{PLURAL:$2|एक योगदानकर्ता|$2 योगदानकर्ताओं}} द्वारा {{PLURAL:$1|किया बीच का एक|किए बीच के $1}} अवतरण दर्शाए नहीं हैं।)',
 'diff-multi-manyusers' => '({{PLURAL:$2|एक योगदानकर्ता|$2 योगदानकर्ताओं}} द्वारा {{PLURAL:$1|किया बीच का एक|किए बीच के $1}} अवतरण दर्शाए नहीं हैं।)',
 'difference-missing-revision' => 'इस अंतर {{PLURAL:$2|का एक अवतरण|के $2 अवतरण}} ($1) नहीं {{PLURAL:$2|पाया गया|पाए गए}}।
@@ -1220,7 +1283,6 @@ $1",
 'searchmenu-legend' => 'खोज विकल्प',
 'searchmenu-exists' => "'''इस विकि पर \"[[:\$1]]\" नाम का एक पृष्ठ है'''",
 'searchmenu-new' => "'''इस विकि पर \"[[:\$1]]\" नाम का पृष्ठ बनाएँ!'''",
-'searchhelp-url' => 'Help:सहायता',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|इस उपसर्ग वाले पृष्ठ देखें]]',
 'searchprofile-articles' => 'सामग्री पृष्ठ',
 'searchprofile-project' => 'सहायता और परियोजना पृष्ठ',
@@ -1263,15 +1325,7 @@ $1",
 'searchdisabled' => '{{SITENAME}} पर खोज अक्षम है।
 आप गूगल से खोज कर सकते हैं।
 ध्यान रखें कि उनकी {{SITENAME}} सामग्री की सूची पुरानी हो सकती है।',
-
-# Quickbar
-'qbsettings' => 'शीघ्रपट',
-'qbsettings-none' => 'बिल्कुल नहीं',
-'qbsettings-fixedleft' => 'स्थिर बाईं ओर',
-'qbsettings-fixedright' => 'स्थिर दाहिनी ओर',
-'qbsettings-floatingleft' => 'अस्थिर बाईं ओर',
-'qbsettings-floatingright' => 'अस्थिर दाहिनी ओर',
-'qbsettings-directionality' => 'निश्चित, आपकी भाषा की लिपि की दिशात्मकता पर निर्भर',
+'search-error' => 'खोजते समय निम्न त्रुटि उत्पन्न हुई है: $1',
 
 # Preferences page
 'preferences' => 'मेरी वरीयताएँ',
@@ -1305,7 +1359,6 @@ $1",
 'resetprefs' => 'ना संजोये गये बदलाव रद्द करें',
 'restoreprefs' => 'वापिस मूल जमावों पर आ जाएँ (सभी भागों में)',
 'prefs-editing' => 'संपादन',
-'prefs-edit-boxsize' => 'संपादन विंडो का आकार।',
 'rows' => 'कतारें:',
 'columns' => 'कॉलम:',
 'searchresultshead' => 'खोज',
@@ -1316,9 +1369,9 @@ $1",
 'recentchangesdays-max' => 'अधिकतम $1 {{PLURAL:$1|दिन}}',
 'recentchangescount' => 'मूल रूप से कितने संपादन दिखाएँ:',
 'prefs-help-recentchangescount' => 'इसमें हाल के बदलाव, पृष्ठ इतिहास व लॉग शामिल हैं।',
-'prefs-help-watchlist-token' => 'इस कोष्ठक में गुप्त कुंजी प्रदान करने से आपकी ध्यानसूची के लिए एक आर॰एस॰एस फ़ीड बन जाएगी।
-जो भी इस कोष्ठक में मौजूद कुंजी को जानता है वह आपकी ध्यानसूची को पढ़ सकेगा, अतः कोई सुरक्षित कुंजी चुनें।
-यह है आपके लिए एक यंत्रजनित कुंजी जिसका आप चाहें तो प्रयोग कर सकते हैं: $1',
+'prefs-help-watchlist-token2' => 'यह आपकी ध्यानसूची की वेब फ़ीड की गोपनीय चाबी है।
+यह जिसके भी पास होगी वह आपकी ध्यानसूची पढ़ सकेगा, इसिलए इसे किसी के साथ बांटियेगा नहीं।
+[[Special:ResetTokens|इसे रीसेट करने के लिए यहाँ क्लिक करें]]।',
 'savedprefs' => 'आपकी वरीयताएँ संजोई गई हैं।',
 'timezonelegend' => 'समयमंडल:',
 'localtime' => 'स्थानीय समय:',
@@ -1349,7 +1402,6 @@ $1",
 'prefs-reset-intro' => 'आप इस पृष्ठ के ज़रिए अपनी वरीयताओं को साइट की मूल वरीयताओं के समान बना सकते हैं।
 इसके बाद आप वापस पुरानी स्थिति पर नहीं आ सकेंगे।',
 'prefs-emailconfirm-label' => 'ई-मेल पुष्टिकरण:',
-'prefs-textboxsize' => 'संपादन विंडो का आकार:',
 'youremail' => 'आपका ई-मेल पता:',
 'username' => '{{GENDER:$1|सदस्यनाम}}:',
 'uid' => '{{GENDER:$1|सदस्य}} क्रमांक:',
@@ -1384,6 +1436,8 @@ HTML टैग की जाँच करें।',
 'prefs-dateformat' => 'तिथि प्रारूप',
 'prefs-timeoffset' => 'समयांतर',
 'prefs-advancedediting' => 'सामान्य विकल्प',
+'prefs-editor' => 'सम्पादक',
+'prefs-preview' => 'पूर्वावलोकन',
 'prefs-advancedrc' => 'उन्नत विकल्प',
 'prefs-advancedrendering' => 'उन्नत विकल्प',
 'prefs-advancedsearchoptions' => 'उन्नत विकल्प',
@@ -1391,7 +1445,9 @@ HTML टैग की जाँच करें।',
 'prefs-displayrc' => 'प्रदर्शन विकल्प',
 'prefs-displaysearchoptions' => 'प्रदर्शन विकल्प',
 'prefs-displaywatchlist' => 'प्रदर्शन विकल्प',
+'prefs-tokenwatchlist' => 'टोकन',
 'prefs-diffs' => 'अंतर',
+'prefs-help-prefershttps' => 'यह वरीयता आपके अगले लॉगिन पर प्रभावी होगी।',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'ई-मेल पता वैध प्रतीत होता है',
@@ -1418,6 +1474,8 @@ HTML टैग की जाँच करें।',
 'userrights-notallowed' => 'आपके पास सदस्य अधिकार जोड़ने या हटाने की अनुमति नहीं है।',
 'userrights-changeable-col' => 'समूह जिन्हें आप बदल सकते हैं',
 'userrights-unchangeable-col' => 'समूह जिन्हें आप नहीं बदल सकते हैं',
+'userrights-conflict' => 'सदस्य अधिकार बदलावों में अंतर्विरोध! कृपया अपने बदलाव जाँचें और पुनः सुनिश्चित करें।',
+'userrights-removed-self' => 'आपने सफलतापूर्वक अपने अधिकार हटा दिए हैं। अतः आप अब यह पृष्ठ नहीं देख सकते हैं।',
 
 # Groups
 'group' => 'समूह:',
@@ -1483,11 +1541,19 @@ HTML टैग की जाँच करें।',
 'right-proxyunbannable' => 'स्वचालित प्रौक्सी ब्लॉक्स को नज़रंदाज़ करें',
 'right-unblockself' => 'स्वयं को अनावरुद्ध करें',
 'right-protect' => 'सुरक्षा स्तर बदलें और सीढ़ी-सुरक्षित पृष्ठ सम्पादित करें',
-'right-editprotected' => 'सुरक्षित पृष्ठ सम्पादित करें (बिना सीढ़ी सुरक्षा वाले)',
+'right-editprotected' => 'उन सुरक्षित पृष्ठ सम्पादित करें जिनके सम्पादन की "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'उन पृष्ठों को सम्पादित करें जिनका सुरक्षा स्तर है "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'सॉफ़्टवेयर इंटरफ़ेस सम्पादित करें',
 'right-editusercssjs' => 'अन्य सदस्यों के सी॰एस॰एस और जावास्क्रिप्ट पृष्ठ सम्पादित करें',
 'right-editusercss' => 'अन्य सदस्यों के सी॰एस॰एस पृष्ठ सम्पादित करें',
 'right-edituserjs' => 'अन्य सदस्यों के जावास्क्रिप्ट पृष्ठ सम्पादित करें',
+'right-editmyusercss' => 'अपनी सदस्य स्तर की सी॰एस॰एस फ़ाइलें सम्पादित करें',
+'right-editmyuserjs' => 'अपनी सदस्य स्तर की जावास्क्रिप्ट फ़ाइलें सम्पादित करें',
+'right-viewmywatchlist' => 'अपनी ध्यानसूची देखें',
+'right-editmywatchlist' => 'अपनी ध्यानसूची सम्पादित करें। ध्यान दें कि कुछ कार्य इस अधिकार के बिना भी ध्यानसूची में पृष्ठ जोड़ेंगे।',
+'right-viewmyprivateinfo' => 'अपना व्यक्तिगत डाटा देखें (जैसे ई-मेल पता, असली नाम)',
+'right-editmyprivateinfo' => 'अपना व्यक्तिगत डाटा सम्पादित करें (जैसे ई-मेल पता, असली नाम)',
+'right-editmyoptions' => 'अपनी वरीयताएँ सम्पादित करें',
 'right-rollback' => 'किसी पृष्ठ का अंतिम सम्पादन करने वाले सदस्य के सम्पादन वापिस लें',
 'right-markbotedits' => 'वापिस लेने में हुए संपादनों को बॉट सम्पादन चिन्हित करें',
 'right-noratelimit' => 'रेट लिमिट्स से बेअसर हों',
@@ -1549,12 +1615,19 @@ HTML टैग की जाँच करें।',
 'action-userrights-interwiki' => 'अन्य विकियों पर सदस्य अधिकार बदलने',
 'action-siteadmin' => 'डाटाबेस को ताला लगाने या खोलने',
 'action-sendemail' => 'ई-मेल भेजने',
+'action-editmywatchlist' => 'ध्यानसूची सम्पादित करने',
+'action-viewmywatchlist' => 'अपनी ध्यानसूची देखने',
+'action-viewmyprivateinfo' => 'अपनी व्यक्तिगत जानकारी देखने',
+'action-editmyprivateinfo' => 'अपनी व्यक्तिगत जानकारी बदलने',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|बदलाव}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|अंतिम बार देखने के बाद से}}',
+'enhancedrc-history' => 'इतिहास',
 'recentchanges' => 'हाल में हुए बदलाव',
 'recentchanges-legend' => 'हाल के परिवर्तन संबंधी विकल्प',
 'recentchanges-summary' => 'इस विकि पर हाल में हुए बदलाव इस पन्ने पर देखे जा सकते हैं।',
+'recentchanges-noresult' => 'इस अवधि के दौरान इन मापदंडों को पूर्ण करते कोई परिवर्तन नहीं किए गए हैं।',
 'recentchanges-feed-description' => 'इस विकि पर हाल में हुए बदलाव इस फ़ीड में देखे जा सकते हैं।',
 'recentchanges-label-newpage' => 'इस संपादन से नया पृष्ठ बना',
 'recentchanges-label-minor' => 'यह एक छोटा सम्पादन है',
@@ -1591,7 +1664,6 @@ HTML टैग की जाँच करें।',
 'recentchangeslinked-feed' => 'पृष्ठ से जुड़े बदलाव',
 'recentchangeslinked-toolbox' => 'पृष्ठ से जुड़े बदलाव',
 'recentchangeslinked-title' => '"$1" से जुड़े बदलाव',
-'recentchangeslinked-noresult' => 'जुड़े हुए पृष्ठों में दी हुई अवधि में कोई भी बदलाव नहीं हुए हैं।',
 'recentchangeslinked-summary' => "यह पृष्ठ किसी विशिष्ट पृष्ठ से जुड़े पृष्ठों (या किसी श्रेणी में श्रेणीबद्ध पृष्ठों) में हाल में हुए बदलावों की सूची दर्शाता है।
 [[Special:Watchlist|आपकी ध्यानसूची]] में मौजूद पृष्ठ '''मोटे''' अक्षरों में दिखेंगे।",
 'recentchangeslinked-page' => 'पृष्ठ नाम:',
@@ -1603,7 +1675,7 @@ HTML टैग की जाँच करें।',
 'reuploaddesc' => 'अपलोड रद्द करें और पुनः अपलोड फ़ॉर्म पर जाएँ',
 'upload-tryagain' => 'संशोधित फ़ाइल विवरण भेजें',
 'uploadnologin' => 'लॉग इन नहीं किया है',
-'uploadnologintext' => 'फ़ाइलें अपलोड करने के लिये [[Special:UserLogin|लॉग इन]] करना आवश्यक है।',
+'uploadnologintext' => 'फ़ाइलें अपलोड करने के लिये $1 करना आवश्यक है।',
 'upload_directory_missing' => 'अपलोड डाइरेक्टरी ($1) मौजूद नहीं है, और वेबसर्वर इसका निर्माण नहीं कर पाया।',
 'upload_directory_read_only' => 'अपलोड डाइरेक्टरी ($1) में वेबसर्वर लिख नहीं पा रहा है।',
 'uploaderror' => 'अपलोड त्रुटि',
@@ -1835,7 +1907,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'http-read-error' => 'एच॰टी॰टी॰पी पढ़ने में त्रुटि।',
 'http-timed-out' => 'एच॰टी॰टी॰पी अनुरोध का समय समाप्त (टाइम आउट)',
 'http-curl-error' => 'यू॰आर॰एल $1 पाने में त्रुटि',
-'http-host-unreachable' => 'यू॰आर॰एल तक पहुँचा नहीं जा सका।',
 'http-bad-status' => 'एच॰टी॰टी॰पी अनुरोध के दौरान समस्या थी: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1866,6 +1937,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'listfiles_size' => 'आकार',
 'listfiles_description' => 'विवरण',
 'listfiles_count' => 'अवतरण',
+'listfiles-show-all' => 'इसमें चित्रों के पुराने अवतरण शामिल हैं',
+'listfiles-latestversion' => 'वर्तमान अवतरण',
+'listfiles-latestversion-yes' => 'हाँ',
+'listfiles-latestversion-no' => 'नहीं',
 
 # File description page
 'file-anchor-link' => 'फ़ाइल',
@@ -1963,6 +2038,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'randompage' => 'यादृच्छिक पृष्ठ',
 'randompage-nopages' => 'कोई भी पृष्ठ {{PLURAL:$2|इस नामस्थान|इन नामस्थानों}} में नहीं हैं: $1।',
 
+# Random page in category
+'randomincategory' => 'श्रेणी में यादृच्छिक (रैंडम) पृष्ठ',
+'randomincategory-invalidcategory' => '"$1" एक मान्य श्रेणी नाम नहीं है।',
+'randomincategory-nopages' => '[[:Category:$1|$1]] श्रेणी में कोई पृष्ठ नहीं हैं।',
+'randomincategory-selectcategory' => 'श्रेणी से यादृच्छिक (रैंडम) पृष्ठ खोलें: $1 $2',
+'randomincategory-selectcategory-submit' => 'खोलें',
+
 # Random redirect
 'randomredirect' => 'किसी एक पुनर्निर्देशन पर जाएँ',
 'randomredirect-nopages' => 'नामस्थान "$1" में कोई पुनर्निर्देशन नहीं हैं।',
@@ -1988,12 +2070,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'statistics-users-active-desc' => 'पिछले {{PLURAL:$1|एक दिन|$1 दिनों}} में कुछ गतिविधि रखने वाले सदस्य',
 'statistics-mostpopular' => 'सबसे अधिक देखे गए पृष्ठ',
 
-'disambiguations' => 'बहुविकल्पी पृष्ठों से जुड़ते पृष्ठ',
-'disambiguationspage' => 'Template:बहुविकल्पी',
-'disambiguations-text' => "निम्नांकित पृष्ठ कम-से-कम एक '''बहुविकल्पी पृष्ठ''' से जुड़ते हैं।
-संभवतः इन्हें उपयुक्त पृष्ठ से जुड़ा होना चाहिए।<br />
-यदि कोई पृष्ठ ऐसे साँचे का प्रयोग करता है जो [[MediaWiki:Disambiguationspage]] से जुड़ा हुआ है, तो उसे बहुविकल्पी पृष्ठ माना जाता है।",
-
 'doubleredirects' => 'दुगुने पुनर्निर्देश',
 'doubleredirectstext' => 'यह पृष्ठ उन पृष्ठों की सूची देता है जो अन्य पुनर्निर्देशित पृष्ठों की ओर पुनर्निर्देशित हैं।
 हर कतार में पहले और दूसरे पुनर्निर्देशन की कड़ियाँ, तथा दूसरे पुनर्निर्देशन का लक्ष्य भी है, आमतौर पर यही "वास्तविक" लक्ष्यित पृष्ठ होगा, और पहला पुनर्देशन वास्तव में इसी को लक्ष्यित होना चाहिए।
@@ -2051,6 +2127,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'mostrevisions' => 'सर्वाधिक अवतरणित पृष्ठ',
 'prefixindex' => 'उपसर्ग अनुसार पृष्ठ',
 'prefixindex-namespace' => 'उपसर्ग वाले सभी पृष्ठ ($1 नामस्थान)',
+'prefixindex-strip' => 'सूची में उपसर्ग छुपाएँ',
 'shortpages' => 'छोटे पृष्ठ',
 'longpages' => 'लम्बे पृष्ठ',
 'deadendpages' => 'बंद सिरे पृष्ठ',
@@ -2243,10 +2320,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'unwatchthispage' => 'ध्यानसूची से हटाएँ',
 'notanarticle' => 'सामग्री पृष्ठ नहीं',
 'notvisiblerev' => 'किसी अन्य सदस्य द्वारा किया अन्तिम अवतरण हटाया गया है',
-'watchnochange' => 'दिये गये समय में आपके ध्यानसूची में मौजूद पृष्ठों में कोई भी बदलाव नहीं हुए हैं।',
 'watchlist-details' => 'वार्ता पृष्ठों के अलावा {{PLURAL:$1|$1 पृष्ठ}} आपकी ध्यानसूची में हैं।',
-'wlheader-enotif' => '* ई-मेल नोटिफिकेशन सक्षम हैं।',
-'wlheader-showupdated' => "* पृष्ठ जो आपके द्वारा देखे जाने के बाद बदले गये हैं, '''बोल्ड''' दिखेंगे।",
+'wlheader-enotif' => 'ई-मेल नोटिफ़िकेशन सक्षम हैं।',
+'wlheader-showupdated' => "पृष्ठ जो आपके द्वारा देखे जाने के बाद बदले गये हैं '''बोल्ड''' दिखेंगे।",
 'watchmethod-recent' => 'ध्यानसूची में दिये गये पृष्ठों में हाल में हुए बदलाव देख रहे हैं',
 'watchmethod-list' => 'ध्यानसूची में दिये गये पृष्ठों में हाल में हुए बदलाव देख रहे हैं',
 'watchlistcontains' => 'आपकी ध्यानसूची में $1 {{PLURAL:$1|पृष्ठ}} हैं।',
@@ -2500,7 +2576,7 @@ $1',
 'contributions' => '{{GENDER:$1|सदस्य}} योगदान',
 'contributions-title' => '$1 के योगदान',
 'mycontris' => 'योगदान',
-'contribsub2' => '$1 के लिये ($2)',
+'contribsub2' => '{{GENDER:$3|$1}} ($2) के लिये',
 'nocontribs' => 'इन कसौटियों से मिलनेवाले बदलाव मिले नहीं।',
 'uctop' => '(मौजूदा)',
 'month' => 'इस महिनेसे (और पुरानें):',
@@ -2658,12 +2734,9 @@ $1 को बाध्य करने का कारण है: "$2"',
 फिर भी, $2 प्रकार को बाध्य किया जा सकता है, जिनको अबाध्य किया जा सकता है।',
 'ip_range_invalid' => 'गलत आईपी रेंज',
 'ip_range_toolarge' => '/$1 से अधिक बड़े रेञ्ज ब्लॉकों की अनुमति नहीं है।',
-'blockme' => 'मुझे ब्लॉक करो',
 'proxyblocker' => 'प्रॉक्सी ब्लॉकर',
-'proxyblocker-disabled' => 'यह कार्य रद्द कर दिया गया हैं।',
 'proxyblockreason' => 'आपका IP पता बाधित किया जा चुका है क्योंकि यह एक मुक्त प्रतिनिधि है।
 कृपया आप अपने इंटरनेट सेवा प्रदान करने वाले से या तकनीकी सहायक से सम्पर्क करें अथवा उन्हें इस भयावह सुरक्षा समस्या के बारे में सूचित करें।',
-'proxyblocksuccess' => 'हो गया।',
 'sorbsreason' => '{{SITENAME}} द्वारा इस्तेमालमें लाये जाने वाले DNSBL में आपके आईपी एड्रेसको ओपन प्रॉक्सीमें दर्शाया गया हैं।',
 'sorbs_create_account_reason' => '{{SITENAME}} के DNSBL ने आपका आईपी एड्रेस ओपन प्रोक्सी करके सूचित किया हैं। आप खाता खोल नहीं सकतें।',
 'cant-block-while-blocked' => 'आप खुद ही अवरोधित हैं इसलिए इस समय आप औरों को अवरोधित नहीं कर सकते हैं।',
@@ -2833,6 +2906,7 @@ $1 को बाध्य करने का कारण है: "$2"',
 'thumbnail-more' => 'बड़ा करें',
 'filemissing' => 'फ़ाईल मिली नहीं',
 'thumbnail_error' => 'थंबनेल बनाने में त्रुटि हुई है: $1',
+'thumbnail_error_remote' => '$1 से त्रुटि सन्देश: $2',
 'djvu_page_error' => 'DjVu पृष्ठ रेंजके बाहर हैं',
 'djvu_no_xml' => 'DjVu फ़ाईलके लिये XML नहीं मिल पाया',
 'thumbnail-temp-create' => 'अस्थायी थम्बनेल फ़ाइल बनाने में असफल',
@@ -3132,11 +3206,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
 'hours' => '{{PLURAL:$1|$1 hour|$1 hours}}',
 'days' => '{{PLURAL:$1|$1 day|$1 days}}',
+'weeks' => '{{PLURAL:$1|$1 सप्ताह}}',
 'months' => '{{PLURAL:$1|महीना|महीने}}',
 'years' => '{{PLURAL:$1|$1 वर्ष}}',
 'ago' => '$1 पहले',
 'just-now' => 'अभी-अभी',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|घंटा|घंटे}} पहले',
+'minutes-ago' => '$1 {{PLURAL:$1|मिनट}} पहले',
+'seconds-ago' => '$1 {{PLURAL:$1|सॅकेंड}} पहले',
+'monday-at' => 'सोमवार को $1 बजे',
+'tuesday-at' => 'मंगलवार को $1 बजे',
+'wednesday-at' => 'बुधवार को $1 बजे',
+'thursday-at' => 'गुरूवार को $1 बजे',
+'friday-at' => 'शुक्रवार को $1 बजे',
+'saturday-at' => 'शनिवार को $1 बजे',
+'sunday-at' => 'रविवार को $1 बजे',
+'yesterday-at' => 'कल $1 बजे',
+
 # Bad image list
 'bad_image_list' => 'प्रारूप इस प्रकार है:
 
@@ -3165,7 +3253,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'चौडाई',
 'exif-imagelength' => 'ऊँचाई',
 'exif-bitspersample' => 'प्रति घटक बीट्स',
@@ -3342,7 +3430,7 @@ $1',
 'exif-originalimageheight' => 'छवि की ऊँचाई उभरा होने से पहले',
 'exif-originalimagewidth' => 'छवि की चौड़ाई उभरा होने से पहले',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'अनकॉम्प्रेस्स्ड',
 'exif-compression-3' => 'CCITT ग्रुप 3 फ़ैक्स एनकोडिंग',
 'exif-compression-4' => 'CCITT ग्रुप 4 फ़ैक्स एनकोडिंग',
@@ -3653,7 +3741,6 @@ $5
 
 # Separators for various lists, etc.
 'semicolon-separator' => ';',
-'autocomment-prefix' => '-',
 
 # Multipage image navigation
 'imgmultipageprev' => '← पिछला पृष्ठ',
@@ -3784,7 +3871,6 @@ $5
 'version-other' => 'अन्य',
 'version-mediahandlers' => 'मीडिया संचालक',
 'version-hooks' => 'हूक',
-'version-extension-functions' => 'विस्तार प्रकार्यात्मकता',
 'version-parser-extensiontags' => 'पार्सर एक्स्टेंशन टैग',
 'version-parser-function-hooks' => 'पार्सर कार्य हूक',
 'version-hook-name' => 'हूक नाम',
@@ -3798,12 +3884,10 @@ $5
 'version-software-version' => 'अवतरण',
 'version-entrypoints-header-url' => 'यू॰आर॰एल',
 
-# Special:FilePath
-'filepath' => 'सञ्चिका पथ',
-'filepath-page' => 'सञ्चिका:',
-'filepath-submit' => 'जाइए',
-'filepath-summary' => 'यह विशेष पृष्ठ सञ्चिका का पूरा पथ देता है।
-चित्र पूरे रिज़ोल्यूशन के साथ दिखता हैं, अन्य सञ्चिका प्रकार उनके सम्बन्धित प्रोग्रेम डाइरेक्टरी से आरम्भ होते हैं।',
+# Special:Redirect
+'redirect-user' => 'सदस्य आई॰डी',
+'redirect-revision' => 'पृष्ठ अवतरण संख्या',
+'redirect-file' => 'फ़ाइल नाम',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'फ़ाईल द्विरावृत्ति खोजें',
@@ -3852,6 +3936,7 @@ $5
 'tags' => 'वैध बदलाव चिप्पियाँ',
 'tag-filter' => '[[Special:Tags|चिप्पी]] छननी:',
 'tag-filter-submit' => 'छननी',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|टैग}}]]: $2)',
 'tags-title' => 'चिप्पियाँ',
 'tags-intro' => 'यह पृष्ठ अर्थ सहित वह चिप्पियाँ दर्शाता है जिनका कोई तंत्रांश किसी संपादन पर निशान लगाने के लिए इस्तेमाल कर सकता है।',
 'tags-tag' => 'चिप्पी का नाम',
@@ -3893,6 +3978,9 @@ $5
 'htmlform-submit' => 'जमा करें',
 'htmlform-reset' => 'बदलाव पुरानी स्थिति पर लाएँ',
 'htmlform-selectorother-other' => 'अन्य',
+'htmlform-no' => 'नहीं',
+'htmlform-yes' => 'हाँ',
+'htmlform-chosen-placeholder' => 'एक विकल्प चुनें',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 पूर्ण पाठ खोज समर्थन के साथ',
diff --git a/languages/messages/MessagesHif_latn.php b/languages/messages/MessagesHif_latn.php
index e1df1935..ac292cb2 100644
--- a/languages/messages/MessagesHif_latn.php
+++ b/languages/messages/MessagesHif_latn.php
@@ -65,9 +65,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ketna sadasya dekhe hai ke number dekhao',
 'tog-oldsig' => 'Abhi ke signature:',
 'tog-fancysig' => 'Signature ke wikitext ke rakam dekho (binaa automatic jorr se)',
-'tog-externaleditor' => 'Apne se bahaari editor ke kaam me lao (khaali chalaak logan khatir, computer me special settings ke jaruri hai. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => ' Apne se bahaari editor ke kaam me lao (khaali chalaak logan khatir, computer me special settings ke jaruri hai. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => '"jump to" accessibility jorr ke laabu karo',
 'tog-uselivepreview' => 'Jinda jhalak ke kaam me lao',
 'tog-forceeditsummary' => 'Ek khali badlao waala summary ke likhe ke time hamse puchho',
 'tog-watchlisthideown' => 'Hamaar badlao ke hamaar dhyaan suchi se lukao',
@@ -80,6 +77,8 @@ $messages = array(
 'tog-diffonly' => 'Diff ke niche panna ke content ke nai dekhao',
 'tog-showhiddencats' => 'Lukawal waala vibhag ke dekhao',
 'tog-norollbackdiff' => 'Rollback kare ke baad diff ke mitae do',
+'tog-useeditwarning' => 'Jab ham koi panna se bina bachae nikaltaa hae, tab hamke warning do',
+'tog-prefershttps' => 'Logged in hoe pe secure connection ke kaam me lao',
 
 'underline-always' => 'Sab time',
 'underline-never' => 'Kabhi nai',
@@ -143,6 +142,18 @@ $messages = array(
 'oct' => 'Oct',
 'nov' => 'Nov',
 'dec' => 'Dec',
+'january-date' => 'January $1',
+'february-date' => 'February $1',
+'march-date' => 'March $1',
+'april-date' => 'April $1',
+'may-date' => 'May $1',
+'june-date' => 'June $1',
+'july-date' => 'July $1',
+'august-date' => 'August $1',
+'september-date' => 'September $1',
+'october-date' => 'October $1',
+'november-date' => 'November $1',
+'december-date' => 'December $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Vibhag|Vibhag}}',
@@ -224,6 +235,7 @@ $messages = array(
 'create-this-page' => 'Ii panna ke banao',
 'delete' => 'Mitao',
 'deletethispage' => 'Ii panna ke mitao',
+'undeletethispage' => 'Ii panna ke undelete karo',
 'undelete_short' => '{{PLURAL:$1|ek badlao|$1 badlao}} ke pahile jaise karo',
 'viewdeleted_short' => 'Dekho {{PLURAL:$1|ek mitawal badlao|$1 mitawal badlao}}',
 'protect' => 'Bachao',
@@ -267,7 +279,7 @@ $1',
 'pool-queuefull' => 'Pool ke line bhar gais hae',
 'pool-errorunknown' => 'Pata nahi kaisan galti hae',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} ke baare me',
 'aboutpage' => 'Project:Ke baare me',
 'copyright' => 'Agar duusra kaaran nai dewa gais hae, tab aap ii panna me likha gae chij ke aap $1 ke niche kaam me lae sakta hai.',
@@ -277,7 +289,6 @@ $1',
 'disclaimers' => 'Jimmewari se chhutkaari',
 'disclaimerpage' => 'Project:Saadharan jimmewari nai lo',
 'edithelp' => 'Badlao pe madat',
-'edithelppage' => 'Help:Badle me',
 'helppage' => 'Help:Madat',
 'mainpage' => 'Pahila Panna',
 'mainpage-description' => 'Pahila Panna',
@@ -354,17 +365,12 @@ Sahi khaas panna ke suchi [[Special:SpecialPages|{{int:specialpages}}]]pe mili.'
 # General errors
 'error' => 'Galti',
 'databaseerror' => 'Database me galti hai',
-'dberrortext' => 'Database ke khoj me syntax error hoe gais hae.
-Iske matlab ii hoe sake hae ki saait software me bug hoi.
-Pahile waala database ke khoj ke kosis rahaa:
-<blockquote><code>$1</code></blockquote>
-"<code>$2</code>" function ke bhitar se.
-Database ke galti sandes rahaa "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Database ke khoj me syntax error hoe gais hae.
-Pahile waala database ke khoj ke kosis rahaa:
-"$1"
-"$2" function ke bhitar se.
-Database ke galti sandes rahaa "$3: $4"',
+'databaseerror-text' => 'Database ke khoj me kuchh karrbarr bhais hae
+Ii saait software me ek bug ke indicate kare hae.',
+'databaseerror-textcl' => 'Database ke khoj me kuchh garrbarri hoe gais hae.',
+'databaseerror-query' => 'Khoj:$1',
+'databaseerror-function' => 'Kaam: $1',
+'databaseerror-error' => 'Galti: $1',
 'laggedslavemode' => 'Chetawni: Panna me nawaa badlao sait nai hoi.',
 'readonly' => 'Database band hai',
 'enterlockreason' => 'Band kare ke kaaran likho, aur ii bhi likho ki kab khola jaai.',
@@ -397,6 +403,7 @@ Iske, URL ke likh ke, koi administrator ke report karo.',
 'cannotdelete-title' => 'Panna "$1" ke mitae nai saktaa hae',
 'delete-hook-aborted' => 'Mitae ke kisis ke hook rok diis hae.
 Uu koi kaaran nai dis hae.',
+'no-null-revision' => 'Panna "$1" ke khatir nawaa null badlao nai banae sakaa hae',
 'badtitle' => 'Kharaab title',
 'badtitletext' => 'Jon panna aap mangta hai uske page title invalid, galat, nai to an incorrectly linked inter-language or inter-wiki title. Isme sait ek yah jaada character hoi jon ki title me nai kaam me lawa jae sake hai.',
 'perfcached' => 'Niche likha data ke cache karaa gais hai aur sait purana hoi. Jaada se jaada {{PLURAL:$1|ek result |$1 results}} cache me hae.',
@@ -418,12 +425,15 @@ Sab wiki me anuwaad ke jorre nai to badle ke khatir, meharbaani kar ke [//transl
 'editinginterface' => "'''Chetawani:''' Aap ek panna ke badaltaa hai jon ki software ke interface text dewe hae.
 Ii panna me badlao ke asar duusra sadasya ke interface pe bhi hoi.
 Translation khatir [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project, ke kaam me lao.",
-'sqlhidden' => '(SQL query lukawal hai)',
 'cascadeprotected' => 'Ii panna ke badlao se bachawa gais hai, kahe ki iske {{PLURAL:$1|panna, jon ki|panna, jon ki}} surakchhit hae "cascading" option turned on ke saathe me rakkhaa gais hai:
 $2',
 'namespaceprotected' => "Aap ke paas '''$1''' namespace me panna ke badle ke adhikar nai hai.",
 'customcssprotected' => 'Aap ke ii CSS panna ke badle ke ijaajat nai hae, kaahe ki isme duusra sadasya ke personal settings hae.',
 'customjsprotected' => 'Aap ke ii JavaScript panna ke badle ke ijaajat nai hae, kaahe ki isme duusra sadasya ke personal settings hae.',
+'mycustomcssprotected' => 'Ii panna ke badle ke khatir aap ke lage iajaajat nai hae.',
+'mycustomjsprotected' => 'Sadasya ke naam',
+'myprivateinfoprotected' => 'Aap ke aapan private jaankari ke badle ke ijaajat nai hae.',
+'mypreferencesprotected' => 'Aap ke aapan preferences ke badle ke ijaajat nai hae.',
 'ns-specialprotected' => 'Khaas panna ke badla nai jae sake hai.',
 'titleprotected' => "Ii title ke banae se [[User:$1|$1]] rokis hai.
 Iske kaaran hai ''$2''.",
@@ -447,10 +457,19 @@ Yaad rakhna ki kuch panna wahi rakam se dekhai jaise ki aap log in bhaya hai, ja
 'welcomecreation-msg' => 'Aap ke account banae dewa gais hai.
 Aapan [[Special:Preferences|{{SITENAME}} pasand]]  ke badle nai bhulna.',
 'yourname' => 'Username:',
+'userlogin-yourname' => 'Aapan username ke likho',
+'userlogin-yourname-ph' => 'Password',
+'createacct-another-username-ph' => 'Username ke likho',
 'yourpassword' => 'Password:',
+'userlogin-yourpassword' => 'Aapan password ke likho',
+'userlogin-yourpassword-ph' => 'Aapan password ke likho',
+'createacct-yourpassword-ph' => 'Aapan password ke likho',
 'yourpasswordagain' => 'Password fir se type karo:',
+'createacct-yourpasswordagain' => 'Aapan password ke confirm karo',
+'createacct-yourpasswordagain-ph' => 'Hame lagged in rahan do',
 'remembermypassword' => 'Ii computer pe hamaar login yaad rakho (jaada se jaada $1 {{PLURAL:$1|din|din}} talak)',
-'securelogin-stick-https' => 'Login kare ke baad HTTPS se connected raho',
+'userlogin-remembermypassword' => 'Secure connection ke kaam me lao',
+'userlogin-signwithsecure' => 'Secure connection ke kaam me lao',
 'yourdomainname' => 'Aap ke domain:',
 'password-change-forbidden' => 'Aap ii wiki me password nai badle saktaa hae.',
 'externaldberror' => 'Koi bahaari database authentication error hai, nai to aap ke bahaari account badle ke adhikar nai hai.',
@@ -462,18 +481,41 @@ Aapan [[Special:Preferences|{{SITENAME}} pasand]]  ke badle nai bhulna.',
 'logout' => 'Log out',
 'userlogout' => 'Sadasya logout',
 'notloggedin' => 'Aap logged in nai hai',
+'userlogin-noaccount' => 'Aap ke lage account hae?',
+'userlogin-joinproject' => '{{SITENAME}} ke join karo',
 'nologin' => "Account nai hai? '''$1'''.",
 'nologinlink' => 'Nawaa account banao',
 'createaccount' => 'Nawaa account banao',
 'gotaccount' => "Aap ke pas pahile se account hai ki nai? '''$1'''.",
 'gotaccountlink' => 'Log in',
 'userlogin-resetlink' => 'Ka aap aapan login kare waala jaankari ke bhulae gaya hae?',
+'userlogin-resetpassword-link' => 'Aapan password ke reset karo',
+'helplogin-url' => 'Help:Logging in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aap ke login khatir madat]]',
+'createacct-join' => 'Aapan jankari niche likho',
+'createacct-another-join' => 'Account ke baare me jaankari niche likho',
+'createacct-emailrequired' => 'Email address',
+'createacct-emailoptional' => 'Email address (jaruri nai hae)',
+'createacct-email-ph' => 'Aapan mail address ke likho',
+'createacct-another-email-ph' => 'Email address ke likho',
 'createaccountmail' => 'Ek temporary password ke kaam me laao aur iske batawa gais Email pe bhej do',
+'createacct-realname' => 'Aslii naam (jaruri nai hae)',
 'createaccountreason' => 'Kaaran:',
+'createacct-reason' => 'Kaaran',
+'createacct-reason-ph' => 'Aap ke ii account ke banae ke kaaran',
+'createacct-captcha' => 'Security check',
+'createacct-imgcaptcha-ph' => 'Niche dekhae waala text ke likho',
+'createacct-submit' => 'Aapan account banao',
+'createacct-another-submit' => 'Duusra account banao',
+'createacct-benefit-heading' => 'Aap ke rakam log {{SITENAME}} ke banain hae.',
+'createacct-benefit-body1' => '{{PLURAL:$1|badlao}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|panna}}',
+'createacct-benefit-body3' => 'haali ke {{PLURAL:$1|yogdaan de waala}}',
 'badretype' => 'Jon duuno password aap likha hai uu ek rakam nai hae.',
 'userexists' => 'Ii sadasya ke naam aur koi ke hae.
 Duusra sadasya ke naam ke choose karo.',
 'loginerror' => 'Login me kuchh wrong hae',
+'createacct-error' => 'Account ke banae me galti',
 'createaccounterror' => 'Account ke nai banae sakaa hae: $1',
 'nocookiesnew' => 'Aap ke account banae dewa gais hae lekin aap logged in nai hae.
 {{SITENAME}} me sadasya ke login khatir cookies hae.
@@ -534,11 +576,13 @@ Meharbaani kar ke achchha address ke enter karo nai to uu field ke khali kar do.
 Aap ke chaahi ki aap login kar ke password ke badal do.
 Agar ii account galti se banaa hai tab ii sandes ke ignore kar do.',
 'usernamehasherror' => 'Sadasya ke naam me hash akchhar ke nai kaam me lawa jaae sake hae',
-'login-throttled' => 'Aap bahut jaada dafe ii account ke password ke enter kare ke kosis karaa hai.
-Thora deri baad fir se kosis karna.',
+'login-throttled' => 'Aap bahut jaada dafe ii account ke password ke enter kare ke kosis karaa hae.
+$1 talak wait kar ke fir se try karo.',
 'login-abort-generic' => 'Aap ke login nai chalaa - Aborted',
 'loginlanguagelabel' => 'Bhasa: $1',
 'suspicious-userlogout' => 'Aap ke log out kare ke maang ke na kar dewa gais hae kaahe ki ii janaawe hae ki ii maang ke ek tuuta browser nai to caching proxy bhejis hae.',
+'createacct-another-realname-tip' => 'Aslii naam ke jaruri nai hae.
+Agar aap iske diya hae tab iske aapke kaam ke attribute kare ke khatir kaam me lawa jaai.',
 
 # Email sending
 'php-mail-error-unknown' => 'PHP ke mail() function me koi anjaan kharaabi hae',
@@ -555,7 +599,7 @@ Login khatam kare khatir, aap ke nawaa password set kare ke parri hian:',
 'newpassword' => 'Nawaa password:',
 'retypenew' => 'Password fir se type karo:',
 'resetpass_submit' => 'Password ke set kar ke login karo',
-'resetpass_success' => 'Aap ke password ke safalta se badal dewa gais hai! Aap ke ab login karaa jaae hai...',
+'changepassword-success' => 'Aap ke password ke safalta se badal dewa gais hai!',
 'resetpass_forbidden' => 'Password nai badlaa jaae sake hai',
 'resetpass-no-info' => 'Ii panna ke sidha access kare ke khatir aap ke logged in rahe ke parri.',
 'resetpass-submit-loggedin' => 'Password ke badlo',
@@ -567,10 +611,11 @@ Sait aap password ke safalta se badal sia hoga nai to nawaa temporary password k
 
 # Special:PasswordReset
 'passwordreset' => 'Password ke badlo',
-'passwordreset-text' => 'Password ke reset kare ke khatir ii form ke bharo.',
+'passwordreset-text-one' => 'Aapan password ke reset kare ke khatir ii form ke bharo.',
+'passwordreset-text-many' => '{{PLURAL:$1|Aapan password ke reset kare ke khatir ek field me likho}}',
 'passwordreset-legend' => 'Password ke badlo',
 'passwordreset-disabled' => 'II wiki me password ke badle ke ijaajat nai hae.',
-'passwordreset-pretext' => '{{PLURAL:$1||Niche ke ek data ke likho}}',
+'passwordreset-emaildisabled' => 'Ii wiki me email ke band kar dewa gais hae.',
 'passwordreset-username' => 'Sadasya ke naam:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Banawa gais e-mail ke dekho',
@@ -593,7 +638,7 @@ Aap ke chaahi ki aap login kar ke ek nawaa password banao.  Agar aur koi ii requ
 Kuchh din ke khatir password: $2',
 'passwordreset-emailsent' => 'Aap ke password yaad karae ke khatir ek e-mail ke bhej dewa gais hae.',
 'passwordreset-emailsent-capture' => 'Ek password yaad karae waala e-mail, jiske niche dekhawa jaawe hae, ke bhej dewa gais hae.',
-'passwordreset-emailerror-capture' => 'Ek yaad karae waala e-mail ke banawa gais hae, jiske niche dekhawa jaawe hae, lekin jiske bheje nai jawa sake hae: $1',
+'passwordreset-emailerror-capture' => 'Ek password yaad karae waala e-mail ke banawa gais hae, jiske niche dekhawa jaawe hae, lekin jiske {{GENDER:$2|user}} ke lage bheje nai jawa sake hae: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-mail address ke badlo',
@@ -607,6 +652,19 @@ Kuchh din ke khatir password: $2',
 'changeemail-submit' => 'E-mail badlo',
 'changeemail-cancel' => 'Kaat do',
 
+# Special:ResetTokens
+'resettokens' => 'Token ke reset karo',
+'resettokens-text' => 'Aap aapan private data pe access roke ke khatir token ke reset kare saktaa hae.
+
+Aap ke ii kare ke chaahi agar aap galti se ii jaankari ke aur koi ke de diya hae nai to aap ke account ke bare me aur koi ke pataa hae.',
+'resettokens-no-tokens' => 'Reset kare ke jhatir koi token nai hae.',
+'resettokens-legend' => 'Token ke reset karo',
+'resettokens-tokens' => 'Chinh (token)',
+'resettokens-token-label' => '$1 (abhi ke value: $2)',
+'resettokens-watchlist-token' => 'Dhyan suchi ke web feed token (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]',
+'resettokens-done' => 'Token ke reset kar dewa gais hae.',
+'resettokens-resetbutton' => 'Chuna gais token ke reset karo',
+
 # Edit page toolbar
 'bold_sample' => 'Motaa text',
 'bold_tip' => 'Motaa text',
@@ -810,12 +868,15 @@ Ii koi kaaran nai diis hai.',
 Janae hai ki iske koi mitae dii hai.',
 'edit-conflict' => 'Badlao me conflict hai.',
 'edit-no-change' => 'Aap ke badle ke kosis ke ignore kar dewa gais hai, kahe ki text ke badla nai gais hai.',
+'postedit-confirmation' => 'Aap ke badlao ke bachae lewa gais hae.',
 'edit-already-exists' => 'Nawaa panna nai banae sakaa hai.
 Ii naam ke panna abhi hai.',
 'defaultmessagetext' => 'Default message text',
 'content-failed-to-parse' => '$1 model ke khatir $2 ke parse nai kare sakaa hae: $3',
 'invalid-content-data' => 'Panna me likha gais chij right nai hae',
 'content-not-allowed-here' => 'Panna [[$2]] me "$1" likhe ke ijaajat nai hae',
+'editwarning-warning' => 'Ii panna ke chore se jetna changes aap  karaa hae nai save hoi.
+Agar aap logged in hae, tab aap ii chetauni ke "Editing" vibhag me disable kare saktaa hae.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -851,6 +912,7 @@ Niche ke comparison ke check kar ke dekho ki aap yahi kare mangta rahaa, aur fir
 'undo-failure' => 'Ii badalo ke paile jaise nai karaa jaae sake hai kahe ki biich me badlao hai.',
 'undo-norev' => 'Ii badlao ke pahile jaise nai karaa jaae sake hai kahe ki ii badalo abhi nai hai nai to iske mitae dewa gais hai.',
 'undo-summary' => '$1 badlao [[Special:Contributions/$2|$2]] se, ke pahile jaise karo ([[User talk:$2|Talk]])',
+'undo-summary-username-hidden' => 'Hidden sadasya ke badalo $1 ke pahile jaise karo',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Account nai banae sakta hai',
@@ -1031,6 +1093,7 @@ Ii baat ke dhyan me rakhna ki navigation jorr ke kaam me laae se ii column reset
 'compareselectedversions' => 'Chuna gae version ke compare karo',
 'showhideselectedversions' => 'Chuna gae versions ke dekhao/lukao',
 'editundo' => 'Pahile jaise kar do',
+'diff-empty' => '(ek rakam)',
 'diff-multi' => '({{PLURAL:$1|Ek biich waala badlao|$1 biich waala badlao}} jiske {{PLURAL:$2|sadasya|$2 sadasya}} karis hae, ke  nai dekhawa jae hai.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ek biich waala badlao|$1 biich waala badlao}} jiske {{PLURAL:$2|sadasya|$2 sadasya}} se jaada log karin hae, ke  nai dekhawa jae hai.)',
 'difference-missing-revision' => 'Ii badlao ($1) {{PLURAL:$2|was|were}} pe {{PLURAL:$2|One revision|$2 revisions}} nai pawa gais hae
@@ -1057,7 +1120,6 @@ Iske baare me aur jaankari [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAM
 'searchmenu-legend' => 'Khoje ke option',
 'searchmenu-exists' => "'''Ii wiki me \"[[\$1]]\" naam ke panna hai'''",
 'searchmenu-new' => "'''Ii wiki me \"[[:\$1]]\" panna ke banao!'''",
-'searchhelp-url' => 'Help:Madat',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ii prefix ke panna ke browse karo]]',
 'searchprofile-articles' => 'Content panna',
 'searchprofile-project' => 'Madat aur Project panna',
@@ -1101,15 +1163,7 @@ Aapan query ke ''all:'' se suruu kar ke visay suchi me khojo (including talk pag
 'searchdisabled' => '{{SITENAME}} me abhi khoje ke anumati nai hai.
 Aap tab tak Google se khoje sakta hai.
 Yaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Koi nai',
-'qbsettings-fixedleft' => 'Left me fixed hai',
-'qbsettings-fixedright' => 'Right me fixed hai',
-'qbsettings-floatingleft' => 'Baaen or baho',
-'qbsettings-floatingright' => 'Daaen or baho',
-'qbsettings-directionality' => 'Banae dewa gais hae, lekin ii aap ke bhasa ke script directionality ke uppar nibhar hae',
+'search-error' => 'Khoje ke tim ek error hoe gais hae:$1',
 
 # Preferences page
 'preferences' => 'Pasand',
@@ -1143,7 +1197,6 @@ Yaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.',
 'resetprefs' => 'Binaa bachawa gias badlao ke mitao',
 'restoreprefs' => 'Sab default settings ke pahile jaise karo (sab vibhag me)',
 'prefs-editing' => 'Badaltaa hai',
-'prefs-edit-boxsize' => 'Edit window ke size.',
 'rows' => 'Line:',
 'columns' => 'Column:',
 'searchresultshead' => 'Khojo',
@@ -1154,9 +1207,9 @@ Yaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.',
 'recentchangesdays-max' => '(sab se jaada $1 {{PLURAL:$1|din|din}})',
 'recentchangescount' => 'Default se ketnaa badlao ke dekhae ke chaahi:',
 'prefs-help-recentchangescount' => 'Isme hai haali ke badlao, panna ke itihaas aur loga.',
-'prefs-help-watchlist-token' => 'Ii jaankari me gupt sabd bhare se aap ke dhyan suchi ke khatir ek RSS feed ban jaai.
-Koi bhi jan, jon ki ii gupt sabd ke jaanat hoi, aap ke dhyan suchi ke parre saki, tab aap achchha se gupt sabd ke sochna.
-Hian pe ek, apne se banaa sabd hae, jiske aap kaam me laae saktaa hae: $1',
+'prefs-help-watchlist-token2' => 'Aap ke dhyan suchi ke web feed ke ii secret key hae.
+Aur koi agar iske bare me jaane hae aap ke dhyan suchi ke parrhae sake hae, tab iske aur ki ke nai dena.
+[[Special:ResetTokens|Agar aap iske reset kare mangtaa hae tab hian pe click karo]].',
 'savedprefs' => 'Aap ke pasand ke save kar lewa gais hai.',
 'timezonelegend' => 'Time ke zone:',
 'localtime' => 'Sthaniye samay:',
@@ -1187,7 +1240,6 @@ Hian pe ek, apne se banaa sabd hae, jiske aap kaam me laae saktaa hae: $1',
 'prefs-reset-intro' => 'Aap ii panna ke kaam me laae ke site defaults ke aapan preferences ke reset kare sakta hai.
 Iske pahile jaise nai karaa jaawe sake hai.',
 'prefs-emailconfirm-label' => 'E-mail ke confirm karaa jaawe hai:',
-'prefs-textboxsize' => 'editing window ke size',
 'youremail' => 'E-mail:',
 'username' => '{{GENDER:$1|Sadasya ke naam}}:',
 'uid' => '{{GENDER:$1|Sadasya}} ID:',
@@ -1218,6 +1270,8 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
 'prefs-dateformat' => 'Tarik ke format',
 'prefs-timeoffset' => 'Time ke offset',
 'prefs-advancedediting' => 'General',
+'prefs-editor' => 'Sampaadak',
+'prefs-preview' => 'Preview',
 'prefs-advancedrc' => 'Uchchaa pasand',
 'prefs-advancedrendering' => 'Uchchaa pasand',
 'prefs-advancedsearchoptions' => 'Uchchaa pasand',
@@ -1225,7 +1279,9 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
 'prefs-displayrc' => 'Choice dekhao',
 'prefs-displaysearchoptions' => 'Choice dekhao',
 'prefs-displaywatchlist' => 'Choice dekhao',
+'prefs-tokenwatchlist' => 'Chinh (token)',
 'prefs-diffs' => 'Farka',
+'prefs-help-prefershttps' => 'Aap ke agla login pe ii preferences effect me aai.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mail address kanuni hae',
@@ -1252,6 +1308,8 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
 'userrights-notallowed' => 'Aap ke account ke user rights de aur hatae ke adhikar nai hai.',
 'userrights-changeable-col' => 'Groups jiske aap badle sakta hai',
 'userrights-unchangeable-col' => 'Groups jiske aap badle nai sakta hai',
+'userrights-conflict' => 'User right me conflict hae. Meharbaani kar ke aapan balao ke fir se apply karo.',
+'userrights-removed-self' => 'App appan ijaajat ke hatae dia hae. Iske natija ii hoi ki app ii panna ke ab nai access kare sakegaa',
 
 # Groups
 'group' => 'Jhund:',
@@ -1317,11 +1375,19 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
 'right-proxyunbannable' => 'Proxies ke automatic blocks ke bypass karo',
 'right-unblockself' => 'Apne ke unblock karo',
 'right-protect' => 'Protection level ke badlo aur cascade-protected panna ke badlo',
-'right-editprotected' => 'Bachawa gais panna ke badlo (without cascading protection)',
+'right-editprotected' => 'Badla gais panna ke "{{int:protect-level-sysop}}" ke rakam bachawa gais hae',
+'right-editsemiprotected' => 'Badla gais panna ke "{{int:protect-level-autoconfirmed}}" ke rakam bachawa gais hae',
 'right-editinterface' => 'User interface ke badlo',
 'right-editusercssjs' => 'Duusra sadsya ke CSS aur JS files ke badlo',
 'right-editusercss' => 'Duusra sadsya ke CSS files ke badlo',
 'right-edituserjs' => 'Duusra sadsya ke JS files ke badlo',
+'right-editmyusercss' => 'Aapan CSS files ke badlo',
+'right-editmyuserjs' => 'Aapan JacaScript file ke edit karo',
+'right-viewmywatchlist' => 'Appan dhyan suchi ke dekho',
+'right-editmywatchlist' => 'Aapan dhyan suchi ke edit karo. Note karna ki app ke kuchh action bina ii rights ke nawaa panna jorri.',
+'right-viewmyprivateinfo' => 'Aapn private data ke dekho (jaise ki email address, aslii naam)',
+'right-editmyprivateinfo' => 'Aapn private data ke badlo (jaise ki email address, aslii naam)',
+'right-editmyoptions' => 'Aapan preferences ke badlo',
 'right-rollback' => 'Jaldi se ek khaas panna ke pichhla sadasya ke badlao ke ulta kar do',
 'right-markbotedits' => 'Rolled-back edits ke bot edits mark karo',
 'right-noratelimit' => 'Rrate limits se koi asar nai hai',
@@ -1383,12 +1449,17 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
 'action-userrights-interwiki' => 'duusra wiki ke sadasya ke adhikar ke badlo',
 'action-siteadmin' => 'database ke band karo nai to kholo',
 'action-sendemail' => 'E-mail bhejo',
+'action-editmywatchlist' => 'Aapan dhyan suchi ke badlo',
+'action-viewmywatchlist' => 'Aapan dhyan suchi ke dekho',
+'action-viewmyprivateinfo' => 'Aapan private jaankari ke dekho',
+'action-editmyprivateinfo' => 'Aapan private jaankari ke badlo',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|badlao|badlao}}',
 'recentchanges' => 'Nawaa badlao',
 'recentchanges-legend' => 'Nawaa badlao options',
 'recentchanges-summary' => 'Wiki me ii panna ke nawaa badlao pe dhyan rakho.',
+'recentchanges-noresult' => 'Ii criteria ke match kare waala ii period me koi badlao nai hae.',
 'recentchanges-feed-description' => 'Abhi haali me bhae ii wiki ke feed me ke track karo.',
 'recentchanges-label-newpage' => 'Ii badlao ek nawaa panna banais hae',
 'recentchanges-label-minor' => 'Ii ek chhota badlao hae',
@@ -1425,7 +1496,6 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
 'recentchangeslinked-feed' => 'Panna ke jurraa badlao',
 'recentchangeslinked-toolbox' => 'Panna ke jurraa badlao',
 'recentchangeslinked-title' => '"$1" ke badlao',
-'recentchangeslinked-noresult' => 'Linked pages me ii time ke bhitar koi changes nai bhae.',
 'recentchangeslinked-summary' => "Ii panna pahile waala badlao jon panna hian pe jurra hae ke suchi de hae (nai to vises vibhag ke sadasya).
 Panna jon [[Special:Watchlist|aap ke dhyan suchi]] me hae  '''mota''' kara gais hae.",
 'recentchangeslinked-page' => 'Panna ke naam:',
@@ -1437,7 +1507,7 @@ Panna jon [[Special:Watchlist|aap ke dhyan suchi]] me hae  '''mota''' kara gais
 'reuploaddesc' => 'Upload ke cancel kar ke upload form pe lauto',
 'upload-tryagain' => 'Badla gais file ke description bhejo',
 'uploadnologin' => 'Aap abhi loged in nai hai',
-'uploadnologintext' => 'Aap ke [[Special:UserLogin|logged in]] kare ke chaahi, file upload kare ke khatir.',
+'uploadnologintext' => 'Aap ke file upload kare ke khatir $1 kare ke parri.',
 'upload_directory_missing' => 'Upload directory ($1) nai hai aur webserver iske nai banae sakis hai.',
 'upload_directory_read_only' => 'Upload directory ($1) ke webserver nai likhe sake hai.',
 'uploaderror' => 'Upload nai hoe paais hai',
@@ -1655,7 +1725,6 @@ Puura surakchha ke khatir, img_auth.php ke band kar dewa gais hae.',
 'http-read-error' => 'HTTP ke parrhe me galti hae',
 'http-timed-out' => 'HTTP ke khatir time nai hae.',
 'http-curl-error' => 'URL ke laawe me galti hoe gais hae: $1',
-'http-host-unreachable' => 'URL pahunche nai sakaa hae',
 'http-bad-status' => 'HTTP ke maange ke time kuch garrbarr hoe gais hae: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1808,17 +1877,13 @@ Templates ke delete kare se pahile duusra links ke bhi check kare ke nai bhulna.
 'statistics-users-active-desc' => 'Sadasya jon ki pichhle {{PLURAL:$1|din|$1 din}} me kuchh karin hai.',
 'statistics-mostpopular' => 'Sab se jaada dekha gae panna',
 
-'disambiguations' => 'Garrbarri ke sudhare waala panna',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Niche ke panna '''disambiguation panna''' se link hoe hai.
-Saait isse aur achchha panna se link hoi. <br />
-Ek panna ke disambiguation panna maana jaae hae jab ki ii ek template ke kaam me laae hae jon ki [[MediaWiki:Disambiguationspage]] se link hoe hae.",
-
 'pageswithprop' => 'Panna, aapan property ke saathe',
 'pageswithprop-legend' => 'Panna, aapan poperty ke saathe',
 'pageswithprop-text' => 'Ii panaa, uu panna ke list kare hae jon ki koi khaas panna ke property ke use kare hae.',
 'pageswithprop-prop' => 'Property ke naam:',
 'pageswithprop-submit' => 'Jaao',
+'pageswithprop-prophidden-long' => 'lamba text property value hidden ($1 kilobytes)',
+'pageswithprop-prophidden-binary' => 'binary property ke hidden value ($1 kilobytes)',
 
 'doubleredirects' => 'Dugna redirects',
 'doubleredirectstext' => 'Ii panna uu panna ke suchi de hai jon ki duusra redirect panna pe redirect kare hai.
@@ -1876,6 +1941,7 @@ Sab row me pahila aur duusra redirect ke jorr hae, aur isme duusra redirect ke n
 'mostrevisions' => 'Sab se jaada badlao waala panna',
 'prefixindex' => 'Sab panna jisme prefix index hai',
 'prefixindex-namespace' => 'Sab panna jisme prefix ($1 namespace)hae',
+'prefixindex-strip' => 'List me se prefix ke strip karo',
 'shortpages' => 'Chhota panna',
 'longpages' => 'Lamba panna',
 'deadendpages' => 'Jon panna se koi jurre nai hai',
@@ -2068,10 +2134,9 @@ Ii panna ke aage ke badlao aur usse jurra baat waala panna ki suchi hian pe hae.
 'unwatchthispage' => 'Ab dhyan nai rakkho',
 'notanarticle' => 'Ii content panna nai hai',
 'notvisiblerev' => 'Badlao ke mitae dewa gais hai',
-'watchnochange' => 'Aap ke koi bhi dhyan me rakkhaa gae chij ke ii time me badla nai gais hai.',
 'watchlist-details' => '{{PLURAL:$1|$1 panna|$1 panna}} pe dhyan dewa jae hai, baat waala panna ke chhorr ke.',
-'wlheader-enotif' => '* E-mail notification ke enable kar dewa gais hai.',
-'wlheader-showupdated' => "* Panna jiske aap ke pichhla visit ke ke baad badal dewa gais hia ke '''bold''' me dekhawa gais hai",
+'wlheader-enotif' => 'E-mail notification ke enable kar dewa gais hai.',
+'wlheader-showupdated' => "Panna jiske aap ke pichhla visit ke ke baad badal dewa gais hia ke '''bold''' me dekhawa jaawe hai.",
 'watchmethod-recent' => 'Dhyan me rakkhaa gais panna ke nawaa badlao ke check karaa jaawe hai',
 'watchmethod-list' => 'dhyan me rakkha gais panna ke nawaa badlao ke khatir check karaa jaawe hai',
 'watchlistcontains' => 'Aap ke dhyan suchi me  $1 {{PLURAL:$1|panna|panna}} hai.',
@@ -2493,15 +2558,13 @@ Saait iske pahile khol dewa gais hoi.',
 Lekin iske, as part of the range $2, block karaa gais hai, jiske unblock karaa jaawe sake hai.',
 'ip_range_invalid' => 'IP ke range me galti hai.',
 'ip_range_toolarge' => '/$1 se barraa range blocks ke ijajat nai hae.',
-'blockme' => 'Ham ke roko',
 'proxyblocker' => 'Proxy roke waala',
-'proxyblocker-disabled' => 'Ii function pe rukawat hai.',
 'proxyblockreason' => 'Aap ke IP address ke block kar dewa gais hai kahe ki ii ek open proxy hai.
 Meharbaani kar ke aap aapan Internet service provider, nai to tech support, ke contact kar ke ii serious security problem ke baare me batao.',
-'proxyblocksuccess' => 'Hoe gais hai.',
 'sorbsreason' => 'DNSBL used by {{SITENAME}} me aap ke IP address ke as an open proxy list karaa gais hai.',
 'sorbs_create_account_reason' => 'DNSBL used by {{SITENAME}} me aap ke IP address ke as an open proxy list karaa gais hai.
 Aap ke ek account banae ke ijajat nai hai',
+'xffblockreason' => 'Ek IP address jon ki X-Forwarded-For header me hae, chaahe aap ke nai to jon proxy server ke aap use kartaa hae ke, ke block kar dewa gais hae. Suruu waala block kare ke kaaran rahaa:$1',
 'cant-block-while-blocked' => 'Aap, jab ki apne blocked hai, duusra sadasya ke block nai kare sakta hai.',
 'cant-see-hidden-user' => 'Jon sadasya ke aap roke mangtaa hae ke pahile rok ke lukae dewa gais hae.
 Jab ki aap ke lage hideuser adhikaar nai hae, tab aap ii sadasya ke rukawat ke nai dekhe aur badle saktaa hae.',
@@ -2666,6 +2729,8 @@ Agar aap generic MediaWiki localisation ke yogdaan de mangtaa hai tab meharbani
 'thumbnail-more' => 'Barraa karo',
 'filemissing' => 'File missing',
 'thumbnail_error' => 'Thumbnail banae me galti hoe gais: $1',
+'thumbnail_error_remote' => 'Error ke sandes from $1:
+$2',
 'djvu_page_error' => 'DjVu panna range me nai hae',
 'djvu_no_xml' => ' DjVu file ke XML ke nai paawe sakaa hae',
 'thumbnail-temp-create' => 'Temporary thumbnail file ke nai banae sakaa hae',
@@ -2963,11 +3028,25 @@ Iske execute kare se aap ke system me garrbarr hoe sake hae.",
 'minutes' => '{{PLURAL:$1|$1 second|$1 seconds}}',
 'hours' => '{{PLURAL:$1|$1 ghanta}}',
 'days' => '{{PLURAL:$1|$1 din}}',
+'weeks' => '{{PLURAL:$1|$1 haftaa}}',
 'months' => '{{PLURAL:$1|$1 mahina}}',
 'years' => '{{PLURAL:$1saal}}',
 'ago' => '$1 pahile',
 'just-now' => 'ekdam abhi',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ghanta}} ago',
+'minutes-ago' => '$1 {{PLURAL:$1|minute}} bhais',
+'seconds-ago' => '$1 {{PLURAL:$1|second}} bhais',
+'monday-at' => 'Sombar ke $1 baje',
+'tuesday-at' => 'Mangar ke $1 baje',
+'wednesday-at' => 'Budh ke $1 baje',
+'thursday-at' => 'Bif ke $1 baje',
+'friday-at' => 'Suk ke $1 baje',
+'saturday-at' => 'Sanichar ke $1 baje',
+'sunday-at' => 'Etwaar ke $1 baje',
+'yesterday-at' => 'Kal $1 baje',
+
 # Bad image list
 'bad_image_list' => 'Format ii rakam hai:
 
@@ -2994,7 +3073,7 @@ Wahii line pe aur koi jorr exception consider karaa jai i.e. jahaan pe panna sak
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Chaurrai',
 'exif-imagelength' => 'Unchai',
 'exif-bitspersample' => 'Bits per component',
@@ -3172,7 +3251,7 @@ Wahii line pe aur koi jorr exception consider karaa jai i.e. jahaan pe panna sak
 'exif-originalimageheight' => 'Crop kare se pahile, chaapa ke uunchai',
 'exif-originalimagewidth' => 'Crop kare se pahike, chhapa ke churrai',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Bina compres karaa gais',
 'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length ke encoding',
 'exif-compression-3' => 'CCITT Group 3 fax ke encoding',
@@ -3542,9 +3621,6 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'version-other' => 'Duusra',
 'version-poweredby-others' => 'duusra waala',
 
-# Special:FilePath
-'filepath-submit' => 'Jaao',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'File ke naam:',
 'fileduplicatesearch-submit' => 'Khojo',
diff --git a/languages/messages/MessagesHil.php b/languages/messages/MessagesHil.php
index 7b38419a..1c611e35 100644
--- a/languages/messages/MessagesHil.php
+++ b/languages/messages/MessagesHil.php
@@ -48,9 +48,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ipakita ang numero sang mga nagalantaw nga manug-gamit',
 'tog-oldsig' => 'Nagapabilin nga pirma:',
 'tog-fancysig' => 'Tratoha ang pirma bilang wikitext (wala sang tabid nga dayon)',
-'tog-externaleditor' => 'Gamiton dayon ang pang-guha nga manug-ilis (para sa mga sagad lamang, nagakinahanglan sang espesyal nga pagkay-o sa imo computer. [//www.mediawiki.org/wiki/Manual:External_editors Mas madamo pa nga impormasyon.])',
-'tog-externaldiff' => 'Gamiton dayon ang pang-guha nga diff (para sa mga sagad lamang, nagakinahanglan sang espesyal nga pagkay-o sa imo computer. [//www.mediawiki.org/wiki/Manual:External_editors Mas madamo pa nga impormasyon.])',
-'tog-showjumplinks' => 'Sugtan ang "maglumpat sa" nga mga tabid sang paalagyan',
 'tog-uselivepreview' => 'Gamiton ang preview nga live (nagakinahanglan sang JavaScript) (experimentohanon)',
 'tog-forceeditsummary' => 'Sugidi ako kon magasulod ako sa blanko nga kabilogan sang pag-ilis',
 'tog-watchlisthideown' => 'Tagua ang akon mga pag-ilis sa akon ginabantayan',
@@ -250,7 +247,7 @@ $1',
 'pool-queuefull' => 'Ang pila sang linaw puno na',
 'pool-errorunknown' => 'Wala mahibaluan nga sala',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Nahanungod sa {{SITENAME}}',
 'aboutpage' => 'Project:Nahanungod',
 'copyright' => 'Ang unod nga abeylabol nga naga paidalum $1.',
@@ -260,7 +257,6 @@ $1',
 'disclaimers' => 'Diskleymer',
 'disclaimerpage' => 'Project:Kabilogan nga diskleymer',
 'edithelp' => 'Bulig sa pag Ilis',
-'edithelppage' => 'Help:I-husto',
 'helppage' => 'Help:Mga Unod',
 'mainpage' => 'Mayor nga Panid',
 'mainpage-description' => 'Mayor nga Panid',
@@ -338,17 +334,6 @@ May lista sang mga nagaka-igo nga mga espesyal nga mga panid sa [[Special:Specia
 # General errors
 'error' => 'Sala/Eror',
 'databaseerror' => 'May sala sa database',
-'dberrortext' => 'May sala sa syntax sang pagpangita sa database.
-Ini nagakahulogan nga basi may sapat-sapat/bug sa software.
-Ang pinaka-ulihe nga pagtilaw sa pagpangita sa database amo ang:
-<blockquote><code>$1</code></blockquote>
-nga halin sa buluhaton nga "<code>$2</code>".
-Ang database nagbalik sang sala/eror nga "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'May sala sa syntax sang pagpangita sa database.
-Ang pinaka-ulihe nga pamilit sa pagpangita sa database amo ang:
-"$1"
-nga halin sa buluhaton nga "$2".
-Ang database nagbalik sang sala/eror nga "$3: $4"',
 'laggedslavemode' => "'''Pahibalo:''' Ang panid indi dapat maka-angkon sang mga ulihe nga pagbag-o.",
 'readonly' => 'Naka-kandado ang database',
 'enterlockreason' => 'Magbutang sang rason para sa pagkandado, upod na ang paghaum-haom kon san-o ang kandado pagabuksan',
@@ -404,7 +389,6 @@ Palihog tilawan mo liwat pagkatapos sang malip-ot nga tinion.',
 'editinginterface' => "'''Pahibalo:''' Naga-ilis ka sang panid nga ginagamit sa paghatag sang mga teksto sang interface para sa software.
 Ang mga pagbag-o sang sini nga panid maga-apekto sa hitsura sang interface sang panid sang manug-gamit sang iban.
 Para sa mga paglubad/pagbadbad, palihog kilalanon ang paggamit sang [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], ang proyekto sang MediaWiki para sa localisasyon.",
-'sqlhidden' => '(Nakatago ang pagpamangkot sang SQL)',
 'cascadeprotected' => 'Ang ini nga panid ginpangapinan agod nga indi ma-ilisan, bangud nga ini nadal sa masunod nga {{PLURAL:$1|panid, nga|mga panid, nga}} ginapangapinan sang naga-"kaskad" nga pililian nga naga-andar:
 $2',
 'namespaceprotected' => "Wala ka ginapasugtan nga mag-ilis sang mga panid sa '''$1''' nga lugar-espasyo.",
@@ -438,7 +422,6 @@ Indi pagkalimtan ang pag-ilis sa imo nga [[Special:Preferences|{{SITENAME}} pagp
 'yourpassword' => 'Kontra-senyas:',
 'yourpasswordagain' => 'Suliton ang kontra-senyas:',
 'remembermypassword' => 'Dumdumon ang akon pagsulod sa sini nga brawser (para sa indi magsobra $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})',
-'securelogin-stick-https' => 'Magpabilin nga nakatakod sa HTTPS pagkatapos magsulod',
 'yourdomainname' => 'Imo dominyo',
 'password-change-forbidden' => 'Indi ka mahimo nga makailis sang pasword sa sini nga wiki.',
 'externaldberror' => 'Mahimo nga may ara sang sala sa pagpamatood sang database ukon wala ka sa lugar nga magbag-o sang imo pang-guha nga akawnt.',
@@ -549,7 +532,7 @@ Agod nga makatapos ka sa pagsulod, kinahanglan mo magbutang sang bag-o nga paswo
 'newpassword' => 'Bag-o nga pasword:',
 'retypenew' => 'Suliton ang bag-o nga pasword:',
 'resetpass_submit' => 'Ibutang ang pasword kag magsulod',
-'resetpass_success' => 'Ang imo pasword madinalag-on nga gin-ilisan!
+'changepassword-success' => 'Ang imo pasword madinalag-on nga gin-ilisan!
 Ginapasulod ka na...',
 'resetpass_forbidden' => 'Ang mga pasword indi mahimo nga paga-ilisan',
 'resetpass-no-info' => 'Kinahanglan nga nakasulod ka agod nga makadtoan ang ini nga panid sing derecho.',
@@ -561,10 +544,8 @@ Mahimo nga madinalag-on mo nga nga gin-ilisan ang imo pasword ukon nagpangabay k
 
 # Special:PasswordReset
 'passwordreset' => 'Liwaton ang pasword',
-'passwordreset-text' => 'Taposon ang ini nga formas agod nga makabaton sang e-mail nga nagapahanumdom sang mga detalye sang imo akawnt.',
 'passwordreset-legend' => 'Liwaton ang pasword',
 'passwordreset-disabled' => 'Ang mga pagliwat sang pasword gin-untat sa sini nga wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Magbutang sang isa sang mga datos sa idalom}}',
 'passwordreset-username' => 'Ngalan sang Manog-gamit"',
 'passwordreset-domain' => 'Domeyn:',
 'passwordreset-capture' => 'Lantawon ang nagresuta nga e-mail?',
@@ -1065,7 +1046,6 @@ Ang mga detalye mahimo nga makita sa [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Mga pililian sa pagpangita',
 'searchmenu-exists' => "'''May yara sang panid nga ginhingalanan nga \"[[:\$1]]\" sa sini nga wiki.'''",
 'searchmenu-new' => "'''Gintuga ang panid nga \"[[:\$1]]\" sa sini nga wiki!'''",
-'searchhelp-url' => 'Help:Mga Unod',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Magbasa-basa sang mga panid gamit ang ini nga unpali]]',
 'searchprofile-articles' => 'Mga panid sang unod',
 'searchprofile-project' => 'Mga panid sang Bulig kag Proyekto',
@@ -1110,15 +1090,6 @@ Testingan mo i-prefiks ang imo pamangkot upod sang ''tanan:'' para makita mo ang
 Mahimo ka nga magpangita gamit ang Google sa sini nga tion.
 Tandai nga ang ila nga palasulundan sang mga unod sang {{SITENAME}} mahimo nga madaan na.',
 
-# Quickbar
-'qbsettings' => 'Bar nga mahapos',
-'qbsettings-none' => 'Wala',
-'qbsettings-fixedleft' => 'Gintadlong sa wala',
-'qbsettings-fixedright' => 'Gintadlong sa too',
-'qbsettings-floatingleft' => 'Nagalutaw sa wala',
-'qbsettings-floatingright' => 'Nagalutaw sa too',
-'qbsettings-directionality' => 'Indi na maliwat, depende sa direksyon sang iskrip sang imo lenggwahe',
-
 # Preferences page
 'preferences' => 'Mga Ginabasehan',
 'mypreferences' => 'Mga Ginabasehan',
@@ -1151,7 +1122,6 @@ Tandai nga ang ila nga palasulundan sang mga unod sang {{SITENAME}} mahimo nga m
 'resetprefs' => 'Panason ang mga wala matipon nga mga pagbag-o',
 'restoreprefs' => 'Ibalik ang tanan nga default settings',
 'prefs-editing' => 'Pag-ilis',
-'prefs-edit-boxsize' => 'Ang kadakoon sang bintana sang pag-ilis.',
 'rows' => 'Mga linya:',
 'columns' => 'Mga kulumna:',
 'searchresultshead' => 'Pangita-a',
@@ -1162,9 +1132,6 @@ Tandai nga ang ila nga palasulundan sang mga unod sang {{SITENAME}} mahimo nga m
 'recentchangesdays-max' => 'Indi magtaas sa $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}',
 'recentchangescount' => 'Numero sang mga pag-ilis nga ipakita by default:',
 'prefs-help-recentchangescount' => 'Nadala diri ang mga bag-o nga gin-ilisan, kasaysayan sang mga panid, kag mga log.',
-'prefs-help-watchlist-token' => 'Ang pagsulat sa sini nga lugar gamit ang sekreto nga yabi magatuga sang RSS feed para sa lista sang imo ginabantayn.
-Ang bisan sin-o nga nakahibalo sang sini nga yabi sa sini nga lugar mahimo nga makabasa sang imo lista, gani magpili sang segurado nga balor.
-Ini isa ka wala pinilian nga balor nga imo mahimo gamiton: $1',
 'savedprefs' => 'Ang imo mga pagpalabi gintipon na.',
 'timezonelegend' => 'Sona sang oras:',
 'localtime' => 'Lokal nga oras:',
@@ -1195,7 +1162,6 @@ Ini isa ka wala pinilian nga balor nga imo mahimo gamiton: $1',
 'prefs-reset-intro' => 'Indi mo magamit ang ini nga panid agod mailisan ang imo mga pagpalabi sa mga default sang site.
 Indi na ini maliwat pa.',
 'prefs-emailconfirm-label' => 'Paagkumperma sang e-mail:',
-'prefs-textboxsize' => 'Kadakoon sang bintana sang pag-ilis',
 'youremail' => 'E-mail:',
 'username' => 'Ngalan sang Manog-gamit:',
 'uid' => 'ID sang manuggamit:',
@@ -1433,7 +1399,6 @@ Ang imo adres sang e-mail wala ginapakita kon kontakon ka sang iban.',
 'recentchangeslinked-feed' => 'May labot nga pag-ilis',
 'recentchangeslinked-toolbox' => 'May labot nga pag-ilis',
 'recentchangeslinked-title' => 'Mga ginlain nga kapareho kay "$1"',
-'recentchangeslinked-noresult' => 'Wala mga pagbag-o sa mga sugpon nga mga panid sa ginhatag nga tiempo.',
 'recentchangeslinked-summary' => "Ini ang mga lista sang mga bag-o lang gid nga nahimo nga mga pahina nga gintabid halin sa gin klaro nga pahina (o mga katapo sa mga kategorya nga gin klaro).
 Mga Pahina sa [[Special:Watchlist|imo lista-lantaw]] ay '''dukot'''.",
 'recentchangeslinked-page' => 'Ngalan ka Pahina:',
@@ -1520,8 +1485,6 @@ Ang gusto nga {{PLURAL:\$3|tipo sang file amo|mga tipo sang file amo ang}} \$2."
 # Statistics
 'statistics' => 'Mga Statistik',
 
-'disambiguationspage' => 'Template:disambig',
-
 'brokenredirects-edit' => 'ilisan',
 'brokenredirects-delete' => 'panason',
 
@@ -1900,7 +1863,7 @@ Ang iban ay pagataguon sang default.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-lightsource' => 'Ginghalinan sang sanag',
 'exif-flash' => 'Igpat',
 'exif-subjectarea' => 'Subject area',
diff --git a/languages/messages/MessagesHr.php b/languages/messages/MessagesHr.php
index b2bfc728..baeb6b8e 100644
--- a/languages/messages/MessagesHr.php
+++ b/languages/messages/MessagesHr.php
@@ -13,6 +13,7 @@
  * @author Dalibor Bosits
  * @author Demicx
  * @author Dnik
+ * @author DzWiki
  * @author Ex13
  * @author Excaliboor
  * @author FriedrickMILBarbarossa
@@ -24,6 +25,7 @@
  * @author MayaSimFan
  * @author Meno25
  * @author Mvrban
+ * @author Nemo bis
  * @author Roberta F.
  * @author SpeedyGonsales
  * @author Tivek
@@ -345,9 +347,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži broj suradnika koji prate stranicu (u nedavnim izmjenama, popisu praćenja i samim člancima)',
 'tog-oldsig' => 'Pregled postojećeg potpisa:',
 'tog-fancysig' => 'Običan potpis kao wikitekst (bez automatske poveznice)',
-'tog-externaleditor' => 'Uvijek koristi vanjski program za uređivanje (samo za napredne, potrebne su posebne postavke na računalu. [//www.mediawiki.org/wiki/Manual:External_editors Dodatne informacije.])',
-'tog-externaldiff' => 'Uvijek koristi vanjski program za usporedbu (samo za napredne, potrebne su posebne postavke na računalu. [//www.mediawiki.org/wiki/Manual:External_editors Dodatne informacije.])',
-'tog-showjumplinks' => 'Uključi pomoćne poveznice "Skoči na"',
 'tog-uselivepreview' => 'Uključi trenutačni pretpregled (zahtijeva JavaScript) (eksperimentalno)',
 'tog-forceeditsummary' => 'Podsjeti me ako sažetak uređivanja ostavljam praznim',
 'tog-watchlisthideown' => 'Sakrij moja uređivanja s popisa praćenja',
@@ -360,6 +359,8 @@ $messages = array(
 'tog-diffonly' => 'Ne prikazuj sadržaj stranice prilikom usporedbe inačica',
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
 'tog-norollbackdiff' => 'Izostavi razliku nakon upotrebe ukloni',
+'tog-useeditwarning' => 'Upozori me kad napuštam stranicu za uređivanje bez spremanja izmjena',
+'tog-prefershttps' => 'Uvijek koristi sigurnu vezu kod prijave',
 
 'underline-always' => 'Uvijek',
 'underline-never' => 'Nikad',
@@ -423,6 +424,18 @@ $messages = array(
 'oct' => 'lis',
 'nov' => 'stu',
 'dec' => 'pro',
+'january-date' => '$1. siječnja',
+'february-date' => '$1. veljače',
+'march-date' => '$1. ožujka',
+'april-date' => '$1. travnja',
+'may-date' => '$1. svibnja',
+'june-date' => '$1. lipnja',
+'july-date' => '$1. srpnja',
+'august-date' => '$1. kolovoza',
+'september-date' => '$1. rujna',
+'october-date' => '$1. listopada',
+'november-date' => '$1. studenoga',
+'december-date' => '$1. prosinca',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorije}}',
@@ -504,6 +517,7 @@ $messages = array(
 'create-this-page' => 'Započni ovu stranicu',
 'delete' => 'Izbriši',
 'deletethispage' => 'Izbriši ovu stranicu',
+'undeletethispage' => 'Vrati ovu stranicu',
 'undelete_short' => 'Vrati {{PLURAL:$1|$1 uređivanje|$1 uređivanja}}',
 'viewdeleted_short' => 'Prikaži $1 {{plural: $1|izbrisano uređivanje|izbrisana uređivanja|izbrisanih uređivanja}}',
 'protect' => 'Zaštiti',
@@ -547,7 +561,7 @@ $1',
 'pool-queuefull' => 'Red čekanja je pun',
 'pool-errorunknown' => 'Nepoznata pogrješka',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'O projektu {{SITENAME}}',
 'aboutpage' => 'Project:O_projektu_{{SITENAME}}',
 'copyright' => 'Sadržaji se koriste u skladu s $1.',
@@ -557,7 +571,6 @@ $1',
 'disclaimers' => 'Odricanje od odgovornosti',
 'disclaimerpage' => 'Project:General_disclaimer',
 'edithelp' => 'Kako uređivati stranicu',
-'edithelppage' => 'Help:Kako_uređivati_stranicu',
 'helppage' => 'Help:Pomoć',
 'mainpage' => 'Glavna stranica',
 'mainpage-description' => 'Glavna stranica',
@@ -634,17 +647,7 @@ Za popis svih posebnih stranica posjetite [[Special:SpecialPages|ovdje]].',
 # General errors
 'error' => 'Pogreška',
 'databaseerror' => 'Pogreška baze podataka',
-'dberrortext' => 'Došlo je do sintaksne pogrješke u upitu bazi.
-Možda se radi o pogrješci u softveru.
-Posljednji je pokušaj upita glasio:
-<blockquote><tt>$1</tt></blockquote>
-iz funkcije "<tt>$2</tt>".
-Baza je vratila pogrješku "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Došlo je do sintaksne pogreške s upitom bazi.
-Posljednji pokušaj upita je glasio:
-"$1"
-iz funkcije "$2".
-Baza je vratila pogrešku "$3: $4"',
+'databaseerror-error' => 'Pogrješka: $1',
 'laggedslavemode' => 'Upozorenje: na stranici se možda ne nalaze najnovije promjene.',
 'readonly' => 'Baza podataka je zaključana',
 'enterlockreason' => 'Upiši razlog zaključavanja i procjenu vremena otključavanja',
@@ -695,12 +698,15 @@ Upit: $2',
 'protectedinterface' => 'Ova stranica je zaštićena od izmjena jer sadrži tekst MediaWiki softvera.
 AKo želite prevesti neprevedenu poruku ili popraviti prijevod neke druge poruke za sve MediaWiki wikije, posjetite [//translatewiki.net/  translatewiki.net], projekt za lokalizaciju MediaWiki softvera.',
 'editinginterface' => "'''Upozorenje:''' Uređujete stranicu koja se rabi za prikaz teksta u sučelju softvera. Promjene učinjene na ovoj stranici će se odraziti na izgled korisničkog sučelja kod drugih suradnika. Za prijevod, razmotrite uporabu [//translatewiki.net/wiki/Main_Page?setlang=hr translatewiki.net], projekta lokalizacije MedijeWiki.",
-'sqlhidden' => '(SQL upit sakriven)',
 'cascadeprotected' => 'Ova je stranica zaključana za uređivanja jer je uključena u {{PLURAL:$1|slijedeću stranicu|slijedeće stranice}}, koje su zaštićene "prenosivom zaštitom":
 $2',
 'namespaceprotected' => "Ne možete uređivati stranice u imenskom prostoru '''$1'''.",
 'customcssprotected' => 'Ne možete uređivati ovu CSS stranicu zato što ona sadrži osobne postavke drugog suradnika.',
 'customjsprotected' => 'Ne možete uređivati ovu JavaScript stranicu zato što ona sadrži osobne postavke drugog suradnika.',
+'mycustomcssprotected' => 'Nemate ovlasti za uređivanje ove CSS stranice.',
+'mycustomjsprotected' => 'Nemate ovlasti za uređivanje ove JavaScript stranice.',
+'myprivateinfoprotected' => 'Nemate ovlasti za uređivanje Vaših osobnih informacija.',
+'mypreferencesprotected' => 'Nemate ovlasti za uređivanje Vaših postavki.',
 'ns-specialprotected' => "Stranice u imenskom prostoru ''{{ns:special}}'' ne mogu se uređivati.",
 'titleprotected' => "Ovaj naslov je od kreiranja zaštitio suradnik [[User:$1|$1]], uz razlog: ''$2''.",
 'filereadonlyerror' => 'Ne mogu izmijeniti datoteku "$1" jer je spremište "$2" dostupno samo za čitanje.
@@ -724,10 +730,19 @@ Neke se stranice mogu prikazivati kao da ste još uvijek prijavljeni, sve dok ne
 'welcomecreation-msg' => 'Vaš je suradnički račun otvoren.
 Ne zaboravite prilagoditi Vaše [[Special:Preferences|{{SITENAME}} postavke]].',
 'yourname' => 'Suradničko ime',
+'userlogin-yourname' => 'Suradničko ime',
+'userlogin-yourname-ph' => 'Unesite Vaše suradničko ime',
+'createacct-another-username-ph' => 'Upišite suradničko ime:',
 'yourpassword' => 'Lozinka:',
+'userlogin-yourpassword' => 'Zaporka',
+'userlogin-yourpassword-ph' => 'Unesite Vašu zaporku',
+'createacct-yourpassword-ph' => 'Unesite zaporku',
 'yourpasswordagain' => 'Ponovno upišite lozinku',
+'createacct-yourpasswordagain' => 'Potvrdi zaporku',
+'createacct-yourpasswordagain-ph' => 'Unesite zaporku ponovno',
 'remembermypassword' => 'Zapamti moju lozinku na ovom računalu (najduže $1 {{PLURAL:$1|dan|dana}})',
-'securelogin-stick-https' => 'Ostani spojen na HTTPS nakon prijave',
+'userlogin-remembermypassword' => 'Zapamti me',
+'userlogin-signwithsecure' => 'Rabi sigurnu vezu',
 'yourdomainname' => 'Vaša domena',
 'password-change-forbidden' => 'Ne možete promjeniti zaporku na ovom projektu.',
 'externaldberror' => 'Došlo je do pogreške s vanjskom autorizacijom ili Vam nije dopušteno osvježavanje vanjskog suradničkog računa.',
@@ -739,18 +754,41 @@ Ne zaboravite prilagoditi Vaše [[Special:Preferences|{{SITENAME}} postavke]].',
 'logout' => 'Odjavi se',
 'userlogout' => 'Odjavi se',
 'notloggedin' => 'Niste prijavljeni',
+'userlogin-noaccount' => 'Nemate suradnički račun?',
+'userlogin-joinproject' => 'Pridružite se {{SITENAME}}',
 'nologin' => 'Nemate suradnički račun? $1.',
 'nologinlink' => 'Otvorite račun',
 'createaccount' => 'Otvori novi suradnički račun',
 'gotaccount' => "Već imate suradnički račun? '''$1'''.",
 'gotaccountlink' => 'Prijavite se',
 'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
+'userlogin-resetpassword-link' => 'Ponovno postavi zaporku',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavi]]',
+'userlogin-createanother' => 'Stvori još jedan račun',
+'createacct-join' => 'Upišite ispod svoje podatke.',
+'createacct-another-join' => 'Upišite dolje podatke o novom računu.',
+'createacct-emailrequired' => 'Adresa e-pošte',
+'createacct-emailoptional' => 'Adresa e-pošte',
+'createacct-email-ph' => 'Upišite svoju adresu e-pošte',
+'createacct-another-email-ph' => 'Upišite adresu e-pošte',
 'createaccountmail' => 'Uporabite nasumice odabranu privremenu zaporku i pošaljite ju na navedenu adresu e-pošte',
+'createacct-realname' => 'Stvarno ime (neobvezatno)',
 'createaccountreason' => 'Razlog:',
+'createacct-reason' => 'Razlog',
+'createacct-reason-ph' => 'Zašto stvarate drugi račun',
+'createacct-captcha' => 'Sigurnosna provjera',
+'createacct-imgcaptcha-ph' => 'Unesite tekst koji vidite iznad',
+'createacct-submit' => 'Stvorite svoj suradnički račun',
+'createacct-another-submit' => 'Stvori još jedan račun',
+'createacct-benefit-heading' => '{{SITENAME}} su stvorili ljudi poput Vas.',
+'createacct-benefit-body1' => '{{PLURAL:$1|uređivanje|uređivanja}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|stranica|stranice|stranica}}',
+'createacct-benefit-body3' => 'nedavnih {{PLURAL:$1|suradnik|suradnika}}',
 'badretype' => 'Unesene lozinke nisu istovjetne.',
 'userexists' => 'Uneseno suradničko ime već je u upotrebi.
 Unesite neko drugo ime.',
 'loginerror' => 'Pogrješka u prijavi',
+'createacct-error' => 'Pogrješka u stvaranju računa',
 'createaccounterror' => 'Ne može se stvoriti račun: $1',
 'nocookiesnew' => "Suradnički račun je otvoren, ali niste uspješno prijavljeni. Naime, {{SITENAME}} koristi kolačiće (''cookies'') u procesu prijave. Isključili ste kolačiće. Molim uključite ih i pokušajte ponovo s Vašim novim imenom i lozinkom.",
 'nocookieslogin' => "{{SITENAME}} koristi kolačiće (''cookies'') u procesu prijave. Isključili ste kolačiće. Molim uključite ih i pokušajte ponovo.",
@@ -808,7 +846,7 @@ Molim unesite ispravno oblikovanu adresu ili ostavite polje praznim.',
 Možete zanemariti ovu poruku ako je suradnički račun stvoren nenamjerno.',
 'usernamehasherror' => 'Suradničko ime ne može sadržavati znakove #',
 'login-throttled' => 'Nedavno ste se previše puta pokušali prijaviti.
-Molimo Vas da pričekate prije nego što pokušate ponovo.',
+Molimo Vas pričekajte $1 prije nego što pokušate ponovno.',
 'login-abort-generic' => 'Vaša prijava bila je neuspješna - Prekinuto',
 'loginlanguagelabel' => 'Jezik: $1',
 'suspicious-userlogout' => 'Vaš zahtjev za odjavu je odbijen jer to izgleda kao da je poslan preko pokvarenog preglednika ili keširanog posrednika (proxyja).',
@@ -826,7 +864,7 @@ Molimo Vas da pričekate prije nego što pokušate ponovo.',
 'newpassword' => 'Nova lozinka',
 'retypenew' => 'Ponovno unesite lozinku',
 'resetpass_submit' => 'Postavite lozinku i prijavite se',
-'resetpass_success' => 'Uspješno ste promijenili zaporku. Prijavljujem Vas...',
+'changepassword-success' => 'Zaporka je uspješno postavljena!',
 'resetpass_forbidden' => 'Lozinka ne može biti promijenjena',
 'resetpass-no-info' => 'Morate biti prijavljeni da biste izravno pristupili ovoj stranici.',
 'resetpass-submit-loggedin' => 'Promijeni lozinku',
@@ -838,10 +876,10 @@ Možda ste već uspješno promijenili Vašu lozinku ili ste zatražili novu priv
 
 # Special:PasswordReset
 'passwordreset' => 'Ponovno postavi lozinku',
-'passwordreset-text' => 'Ispunite ovaj obrazac ako želite poništiti Vašu zaporku.',
+'passwordreset-text-one' => 'Ispunite ovaj obrazac ako želite ponovno postaviti Vašu zaporku.',
 'passwordreset-legend' => 'Poništi lozinku',
 'passwordreset-disabled' => 'Poništavanje lozinke je onemogućeno na ovom wikiju.',
-'passwordreset-pretext' => '{{PLURAL:$1||Unesite jedan od dijelova podataka u nastavku}}',
+'passwordreset-emaildisabled' => 'Funkcija e-pošte je onemogućena na ovom wikiju.',
 'passwordreset-username' => 'Suradničko ime:',
 'passwordreset-domain' => 'Domena:',
 'passwordreset-capture' => 'Pogledati krajnju poruku?',
@@ -1074,12 +1112,15 @@ Razlog nije ponuđen.',
 Čini se kako je obrisana.',
 'edit-conflict' => 'Sukob uređivanja.',
 'edit-no-change' => 'Vaše uređivanje je zanemareno, jer nikakva promjena sadržaja nije napravljena.',
+'postedit-confirmation' => 'Vaše je uređivanje sačuvano.',
 'edit-already-exists' => 'Neuspješno stvaranje nove stranice.
 Stranica već postoji.',
 'defaultmessagetext' => 'Prvotni tekst poruke',
 'content-failed-to-parse' => "Obrada (''parsiranje'') formata $2 za model $1 nije uspjela: $3",
 'invalid-content-data' => 'Nevaljani sadržaj',
 'content-not-allowed-here' => 'Sadržaj napisan u obliku "$1"-a nije dozvoljen na stranici [[$2]]',
+'editwarning-warning' => 'Napuštanje ove stranice može uzrokovati gubitak svake izmjene koju ste napravili.
+Možete onemogućiti ovo upozorenje u odjeljku "{{int:prefs-editing}}" Vaših postavki.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1291,6 +1332,7 @@ Primijetite da uporaba navigacijskih poveznica resetira Vaše izbore u stupcu.',
 'compareselectedversions' => 'Usporedi odabrane inačice',
 'showhideselectedversions' => 'Otkrij/sakrij odabrane izmjene',
 'editundo' => 'ukloni ovu izmjenu',
+'diff-empty' => 'Nema razlike inačica',
 'diff-multi' => '({{PLURAL:$1|Nije prikazana jedna međuinačica|Nisu prikazane $1 međuinačice|Nije prikazano $1 međuinačica}} {{PLURAL:$2|jednog|$2|$2}} suradnika)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Nije prikazana jedna međuinačica|Nisu prikazane $1 međuinačice|Nije prikazano $1 međuinačica}} više od {{PLURAL:$2|jednog|$2|$2}} suradnika)',
 'difference-missing-revision' => '{{PLURAL:$2|Uređivanje|$2 uređivanja}} sljedeće šifre ($1) ne {{PLURAL:$2|postoji|postoje}}.
@@ -1318,7 +1360,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Mogućnosti pretraživanja',
 'searchmenu-exists' => "* Stranica '''[[$1]]'''",
 'searchmenu-new' => "'''Stvori stranicu \"[[:\$1]]\" na ovoj wiki!'''",
-'searchhelp-url' => 'Help:Pomoć',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Pretraži stranice s ovim prefiksom]]',
 'searchprofile-articles' => 'Stranice sa sadržajem',
 'searchprofile-project' => 'Pomoć i stranice projekta',
@@ -1360,15 +1401,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-external' => 'Vanjski pretraživač',
 'searchdisabled' => '<p>Oprostite! Pretraga po cjelokupnoj bazi je zbog bržeg rada projekta {{SITENAME}} trenutačno onemogućena. Možete se poslužiti tražilicom Google.</p>',
 
-# Quickbar
-'qbsettings' => 'Traka',
-'qbsettings-none' => 'Bez',
-'qbsettings-fixedleft' => 'Lijevo nepomično',
-'qbsettings-fixedright' => 'Desno nepomično',
-'qbsettings-floatingleft' => 'Lijevo leteće',
-'qbsettings-floatingright' => 'Desno leteće',
-'qbsettings-directionality' => 'Fiksno, ovisno o smjeru pisma Vašeg jezika',
-
 # Preferences page
 'preferences' => 'Postavke',
 'mypreferences' => 'Moje postavke',
@@ -1401,7 +1433,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'resetprefs' => 'Vrati na prvotne postavke',
 'restoreprefs' => 'Vrati sve postavke na prvotno zadane',
 'prefs-editing' => 'Širina okvira za uređivanje',
-'prefs-edit-boxsize' => 'Veličina prozora za uređivanje.',
 'rows' => 'Redova',
 'columns' => 'Stupaca',
 'searchresultshead' => 'Prikaz rezultata pretrage',
@@ -1412,7 +1443,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'recentchangesdays-max' => '(maksimalno $1 {{PLURAL:$1|dan|dana}})',
 'recentchangescount' => 'Zadani broj izmjena koje se prikazuju:',
 'prefs-help-recentchangescount' => 'Ovo uključuje nedavne promjene, stare izmjene, i evidencije.',
-'prefs-help-watchlist-token' => 'Popunjavanjem ovog polja tajnim ključem generirat će se RSS redak za Vaš popis praćenja. Svatko tko zna ključ moći će čitati Vaš popis praćenih stranica, slijedom toga odaberite sigurnu vrijednost. Ovdje su nasumično generirane vrijednosti koje možete rabiti: $1',
 'savedprefs' => 'Vaše postavke su sačuvane.',
 'timezonelegend' => 'Vremenska zona:',
 'localtime' => 'Lokalno vrijeme:',
@@ -1442,7 +1472,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'prefs-common-css-js' => 'Dijeljeni CSS/JS za sve izglede:',
 'prefs-reset-intro' => 'Možete koristiti ovu stranicu za povrat Vaših postavki na prvotne postavke. Ovo se ne može poništiti.',
 'prefs-emailconfirm-label' => 'Potvrda e-mail adrese:',
-'prefs-textboxsize' => 'Veličina prozora za uređivanje',
 'youremail' => 'Vaša elektronska pošta *',
 'username' => 'Ime {{GENDER:$1|suradnika|suradnice}}:',
 'uid' => 'ID-broj {{GENDER:$1|suradnika|suradnice}}:',
@@ -1473,6 +1502,8 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 'prefs-dateformat' => 'Format datuma',
 'prefs-timeoffset' => 'Vremensko poravnavanje',
 'prefs-advancedediting' => 'Napredne mogućnosti',
+'prefs-editor' => 'Uređivač',
+'prefs-preview' => 'Prikaži kako će izgledati',
 'prefs-advancedrc' => 'Napredne mogućnosti',
 'prefs-advancedrendering' => 'Napredne mogućnosti',
 'prefs-advancedsearchoptions' => 'Napredne mogućnosti',
@@ -1481,6 +1512,7 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 'prefs-displaysearchoptions' => 'Mogućnosti prikaza',
 'prefs-displaywatchlist' => 'Mogućnosti prikaza',
 'prefs-diffs' => 'razl',
+'prefs-help-prefershttps' => 'Ova mogućnost će stupiti na snagu kod sljedeće prijave.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Adresa e-pošte pokazuje se ispravnom',
@@ -1572,11 +1604,15 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 'right-proxyunbannable' => 'Imunitet na automatska blokiranja posrednika (proxya)',
 'right-unblockself' => 'Odblokirati se',
 'right-protect' => 'Mijenjanje razina zaštićivanja i uređivanje zaštićenih stranica',
-'right-editprotected' => 'Uređivanje zaštićenih stranica (s prenosivom zaštitom)',
+'right-editprotected' => 'Uređivanje zaštićenih stranica (bez prenosive zaštite)',
 'right-editinterface' => 'Uređivanje suradničkog sučelja',
 'right-editusercssjs' => 'Uređivanje CSS i JS stranica drugih suradnika',
 'right-editusercss' => 'Uređivanje CSS stranica drugih suradnika',
 'right-edituserjs' => 'Uređivanje JS stranica drugih suradnika',
+'right-viewmywatchlist' => 'Pregled svojeg popisa praćenih stranica',
+'right-viewmyprivateinfo' => 'Vidite svoje privatne podatke (npr. adresu e-pošte, stvarno ime)',
+'right-editmyprivateinfo' => 'Uredite svoje privatne podatke (npr. adresa e-pošte, stvarno ime)',
+'right-editmyoptions' => 'Uredite svoje postavke',
 'right-rollback' => 'Brzo uklanjanje izmjena zadnjeg suradnika na određenoj stranici',
 'right-markbotedits' => 'Označavanje uklonjenih izmjena kao izmjenu bota',
 'right-noratelimit' => 'Bez vremenskog ograničenja uređivanja',
@@ -1638,9 +1674,14 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 'action-userrights-interwiki' => 'uređivanje suradničkih prava suradnika na drugim wikijima',
 'action-siteadmin' => 'zaključavanje ili otključavanje baze podataka',
 'action-sendemail' => 'pošalji e-poštu',
+'action-editmywatchlist' => 'uredite svoj popis praćenih stranica',
+'action-viewmywatchlist' => 'pregled popisa Vaših praćenih stranica',
+'action-viewmyprivateinfo' => 'pregled Vaših privatnih podataka',
+'action-editmyprivateinfo' => 'uredite svoje privatne podatke',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|$1 promjena|$1 promjene|$1 promjena}}',
+'enhancedrc-history' => 'povijest',
 'recentchanges' => 'Nedavne promjene',
 'recentchanges-legend' => 'Izbornik nedavnih promjena',
 'recentchanges-summary' => 'Na ovoj stranici možete pratiti nedavne promjene u wikiju.',
@@ -1680,7 +1721,6 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 'recentchangeslinked-feed' => 'Povezane stranice',
 'recentchangeslinked-toolbox' => 'Povezane stranice',
 'recentchangeslinked-title' => 'Povezane promjene sa "$1"',
-'recentchangeslinked-noresult' => 'Nema promjena na povezanim stranicama u zadanom periodu.',
 'recentchangeslinked-summary' => "Ova posebna stranica pokazuje nedavne promjene na povezanim stranicama (ili stranicama određene kategorije). Stranice koje su na [[Special:Watchlist|Vašem popisu praćenja]] su '''podebljane'''.",
 'recentchangeslinked-page' => 'Naslov stranice:',
 'recentchangeslinked-to' => 'Pokaži promjene na stranicama s poveznicom na ovu stranicu',
@@ -1691,7 +1731,7 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 'reuploaddesc' => 'Vratite se u obrazac za postavljanje.',
 'upload-tryagain' => 'Pošalji izmijenjeni opis datoteke',
 'uploadnologin' => 'Niste prijavljeni',
-'uploadnologintext' => 'Za postavljanje datoteka morate biti  [[Special:UserLogin|prijavljeni]].',
+'uploadnologintext' => 'Za postavljanje datoteka morate biti $1.',
 'upload_directory_missing' => 'Mapa za datoteke ($1) nedostaje i webserver ju ne može napraviti.',
 'upload_directory_read_only' => 'Server ne može pisati u direktorij za postavljanje ($1).',
 'uploaderror' => 'Pogreška kod postavljanja',
@@ -1901,7 +1941,6 @@ Za optimalnu sigurnost, img_auth.php je onemogućena.',
 'http-read-error' => 'Pogrješka pri čitanju HTTP.',
 'http-timed-out' => 'HTTP zahtjev je istekao.',
 'http-curl-error' => 'Pogrješka pri otvaranju URL-a: $1',
-'http-host-unreachable' => 'URL nije dostupan.',
 'http-bad-status' => 'Došlo je do problema tijekom HTTP zahtjeva: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1930,6 +1969,8 @@ Kad je filtriran po suradniku, popis prikazuje samo one datoteke čije je poslje
 'listfiles_size' => 'Veličina (u bajtovima)',
 'listfiles_description' => 'Opis',
 'listfiles_count' => 'Inačice',
+'listfiles-latestversion-yes' => 'Da',
+'listfiles-latestversion-no' => 'Ne',
 
 # File description page
 'file-anchor-link' => 'Slika',
@@ -2023,6 +2064,9 @@ Možda želite urediti njen opis na [$2 stranici opisa datoteke].',
 'randompage' => 'Slučajna stranica',
 'randompage-nopages' => 'Nema stranica u {{PLURAL:$2|imenskom prostoru|imenskim prostorima}}: $1.',
 
+# Random page in category
+'randomincategory-selectcategory-submit' => 'Idi',
+
 # Random redirect
 'randomredirect' => 'Slučajno preusmjeravanje',
 'randomredirect-nopages' => 'Nema preusmjeravanja u imenskom prostoru "$1".',
@@ -2048,12 +2092,6 @@ Možda želite urediti njen opis na [$2 stranici opisa datoteke].',
 'statistics-users-active-desc' => 'Suradnici koji su napravili neku od radnji u posljednjih {{PLURAL:$1|dan|$1 dana}}',
 'statistics-mostpopular' => 'Najposjećenije stranice',
 
-'disambiguations' => 'Stranice koje vode na razdvojbene stranice',
-'disambiguationspage' => 'Template:Razdvojba',
-'disambiguations-text' => "Sljedeće stranice povezuju na '''razdvojbenu stranicu'''.
-Umjesto toga bi trebale povezivati na prikladnu temu.<br />
-Stranica se tretira kao razdvojbena stranica ako rabi predložak na kojega vodi [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop-prop' => 'Ime osobine:',
 'pageswithprop-submit' => 'Idi',
 
@@ -2307,10 +2345,9 @@ Promjene na toj stranici i njenoj stranici za razgovor bit će prikazane na popi
 'unwatchthispage' => 'Prekini praćenje',
 'notanarticle' => 'Nije članak',
 'notvisiblerev' => 'Izmjena je obrisana',
-'watchnochange' => 'Niti jedna od praćenih stranica nije promijenjena od Vašeg zadnjeg posjeta.',
 'watchlist-details' => '{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} se nalazi na popisu praćenja, ne brojeći stranice za razgovor.',
-'wlheader-enotif' => '* Uključeno je izvješćivanje e-mailom.',
-'wlheader-showupdated' => "* Stranice koje su promijenjene od Vašeg zadnjeg posjeta prikazane su '''podebljano'''",
+'wlheader-enotif' => 'Uključeno je izvješćivanje e-poštom.',
+'wlheader-showupdated' => "Stranice koje su promijenjene od Vašeg zadnjeg posjeta prikazane su '''podebljano'''",
 'watchmethod-recent' => 'provjera nedavnih promjena praćenih stranica',
 'watchmethod-list' => 'provjera praćanih stranica za nedavne promjene',
 'watchlistcontains' => 'Vaš popis praćenja sadrži $1 {{PLURAL:$1|stranicu|stranice|stranica}}.',
@@ -2553,7 +2590,7 @@ $1',
 'contributions' => 'Doprinosi {{GENDER:$1|suradnika|suradnice}}',
 'contributions-title' => 'Suradnički doprinosi za $1',
 'mycontris' => 'Moji doprinosi',
-'contribsub2' => 'Za $1 ($2)',
+'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Nema promjena koje udovoljavaju ovim kriterijima.',
 'uctop' => '(vrh)',
 'month' => 'Od mjeseca (i ranije):',
@@ -2711,11 +2748,8 @@ Za popis trenutačnih zabrana i blokiranja vidi [[Special:BlockList|popis blokir
 'ipb_blocked_as_range' => 'Pogreška: IP adresa $1 nije blokirana direktno te stoga ne može biti odblokirana. Blokirana je kao dio opsega $2, koji može biti odblokiran.',
 'ip_range_invalid' => 'Raspon IP adresa nije valjan.',
 'ip_range_toolarge' => 'Opsezi blokiranja veći od /$1 nisu dozvoljeni.',
-'blockme' => 'Blokiraj me',
 'proxyblocker' => 'Zaštita od otvorenih posrednika (proxyja)',
-'proxyblocker-disabled' => 'Ova funkcija je onemogućena.',
 'proxyblockreason' => 'Vaša je IP adresa blokirana jer se radi o otvorenom posredniku (proxyju). Molimo stupite u vezu s Vašim davateljem internetskih usluga (ISP-om) ili službom tehničke podrške i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.',
-'proxyblocksuccess' => 'Napravljeno.',
 'sorbsreason' => 'Vaša IP adresa je na popisu otvorenih posrednika na poslužitelju DNSBL.',
 'sorbs_create_account_reason' => 'Vaša IP adresa je na popisu otvorenih posrednika na poslužitelju DNSBL. Ne možete otvoriti račun.',
 'cant-block-while-blocked' => 'Ne možete blokirati druge suradnike dok ste blokirani.',
@@ -3103,12 +3137,8 @@ Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.',
 'pageinfo-category-files' => 'Broj datoteka',
 
 # Skin names
-'skinname-standard' => 'Standardna',
-'skinname-nostalgia' => 'Nostalgija',
 'skinname-cologneblue' => 'Kölnska plava',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
 
 # Patrolling
 'markaspatrolleddiff' => 'Označi za pregledano',
@@ -3185,11 +3215,17 @@ Njegovim izvršavanjem mogli biste oštetiti svoj sustav.",
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minute|$1 minuta}}',
 'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
 'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
+'weeks' => '{{PLURAL:$1|$1 tjedan|$1 tjedna|$1 tjedana}}',
 'months' => '{{PLURAL:$1|$1 mjesec|$1 mjeseca|$1 mjeseci}}',
 'years' => '{{PLURAL:$1|$1 godina|$1 godine|$1 godina}}',
 'ago' => 'prije $1',
 'just-now' => 'upravo',
 
+# Human-readable timestamps
+'hours-ago' => 'prije $1 {{PLURAL:$1|sat|sata|sati}}',
+'minutes-ago' => 'prije $1 {{PLURAL:$1|minute|minuta}}',
+'seconds-ago' => 'prije $1 {{PLURAL:$1|sekunde|sekundi}}',
+
 # Bad image list
 'bad_image_list' => "Rabi se sljedeći format:
 
@@ -3220,7 +3256,7 @@ Svaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se s
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Širina',
 'exif-imagelength' => 'Visina',
 'exif-bitspersample' => 'Dubina boje',
@@ -3398,7 +3434,7 @@ Svaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se s
 'exif-originalimageheight' => 'Visina slike prije nego što je obrezana',
 'exif-originalimagewidth' => 'Širina slike prije nego što je obrezana',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nesažeto',
 'exif-compression-2' => 'CCITT Grupa 3 1 — Dimenzionalno izmijenjeno Huffmanovo šifriranje po dužini',
 'exif-compression-3' => 'CCITT Grupa 3 faks kodiranje',
@@ -3845,7 +3881,6 @@ Također možete koristiti [[Special:EditWatchlist|standardni editor]].',
 'version-other' => 'Ostalo',
 'version-mediahandlers' => 'Rukovatelji medijima',
 'version-hooks' => 'Kuke',
-'version-extension-functions' => 'Funkcije proširenja',
 'version-parser-extensiontags' => 'Oznake proširenja parsera',
 'version-parser-function-hooks' => 'Kuke funkcija parsera',
 'version-hook-name' => 'Ime kuke',
@@ -3867,12 +3902,11 @@ Trebali ste primiti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju GNU opće javne lic
 'version-entrypoints-header-entrypoint' => 'Početna adresa',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Putanja datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Idi',
-'filepath-summary' => 'Ova posebna stranica daje Vam kompletnu putanju do neke datoteke.
-Slike se na taj način prikazuju u punoj rezoluciji, a drugi tipovi datoteka se otvaraju na klik (kako je već namješteno u Vašem operacijskom sustavu).',
+# Special:Redirect
+'redirect-submit' => 'Idi',
+'redirect-value' => 'Vrijednost:',
+'redirect-user' => 'ID suradnika',
+'redirect-file' => 'Datotečno ime',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Traži kopije datoteka',
@@ -3921,12 +3955,15 @@ Slike se na taj način prikazuju u punoj rezoluciji, a drugi tipovi datoteka se
 'tags' => 'Valjane oznake izmjena',
 'tag-filter' => 'Filtar [[Special:Tags|oznaka]]:',
 'tag-filter-submit' => 'Filtar',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake}}]]: $2)',
 'tags-title' => 'Oznake',
 'tags-intro' => 'Ova je stranica popis oznaka s kojima softver može označiti promjenu te njihovo značenje.',
 'tags-tag' => 'Naziv oznake',
 'tags-display-header' => 'Izgled na popisima izmjena',
 'tags-description-header' => 'Puni opis značenja',
 'tags-hitcount-header' => 'Označene izmjene',
+'tags-active-yes' => 'Da',
+'tags-active-no' => 'Ne',
 'tags-edit' => 'uredi',
 'tags-hitcount' => '$1 {{PLURAL:$1|promjena|promjene|promjena}}',
 
@@ -3947,6 +3984,7 @@ Slike se na taj način prikazuju u punoj rezoluciji, a drugi tipovi datoteka se
 'dberr-problems' => 'Ispričavamo se! Ova stranica ima tehničkih poteškoća.',
 'dberr-again' => 'Pričekajte nekoliko minuta i ponovno učitajte.',
 'dberr-info' => '(Ne mogu se spojiti na poslužitelj baze: $1)',
+'dberr-info-hidden' => '(Ne mogu se spojiti na poslužitelj baze)',
 'dberr-usegoogle' => 'U međuvremenu pokušajte tražiti putem Googlea.',
 'dberr-outofdate' => 'Imajte na umu da su njihova kazala našeg sadržaja možda zastarjela.',
 'dberr-cachederror' => 'Sljedeće je dohvaćena kopija tražene stranice, te možda nije ažurirana.',
@@ -3962,6 +4000,9 @@ Slike se na taj način prikazuju u punoj rezoluciji, a drugi tipovi datoteka se
 'htmlform-submit' => 'Pošalji',
 'htmlform-reset' => 'Poništi izmjene',
 'htmlform-selectorother-other' => 'Drugi',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Odaberite opciju',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 s podrškom pretraživanja cijelog teksta',
diff --git a/languages/messages/MessagesHsb.php b/languages/messages/MessagesHsb.php
index 13ded396..55add6b4 100644
--- a/languages/messages/MessagesHsb.php
+++ b/languages/messages/MessagesHsb.php
@@ -11,6 +11,7 @@
  * @author J budissin
  * @author Kaganer
  * @author Michawiki
+ * @author Nemo bis
  * @author Shirayuki
  * @author Tchoř
  * @author Tlustulimu
@@ -184,9 +185,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ličbu wobkedźbowacych wužiwarjow pokazać',
 'tog-oldsig' => 'Eksistowaca signatura:',
 'tog-fancysig' => 'Ze signaturu kaž z wikitekstom wobchadźeć  (bjez awtomatiskeho wotkaza)',
-'tog-externaleditor' => 'Eksterny editor jako standard wužiwać (jenož za ekspertow, žada sej specialne nastajenja na wašim ličaku. [//www.mediawiki.org/wiki/Manual:External_editors Dalše informacije.])',
-'tog-externaldiff' => 'Eksterny diff-program jako standard wužiwać (jenož za ekspertow, žada sej specialne nastajenja na wašim ličaku. [//www.mediawiki.org/wiki/Manual:External_editors Dalše informacije.])',
-'tog-showjumplinks' => 'Wotkazy typa „dźi do” zmóžnić',
 'tog-uselivepreview' => 'Live-přehlad wužiwać (wužaduje sej JavaScript) (eksperimentalny)',
 'tog-forceeditsummary' => 'Mje skedźbnić, jeli zabudu zjeće',
 'tog-watchlisthideown' => 'Moje změny we wobkedźbowankach schować',
@@ -199,6 +197,7 @@ $messages = array(
 'tog-diffonly' => 'Jenož rozdźěle pokazać (nic pak zbytny wobsah)',
 'tog-showhiddencats' => 'Schowane kategorije pokazać',
 'tog-norollbackdiff' => 'Rozdźěl po wróćostajenju zanjechać',
+'tog-useeditwarning' => 'Warnować, hdyž so wobdźěłowanska strona z njeskładowanymi změnami wopušća',
 
 'underline-always' => 'Přeco',
 'underline-never' => 'Ženje',
@@ -262,6 +261,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'now',
 'dec' => 'dec',
+'january-date' => '$1. januara',
+'february-date' => '$1. februara',
+'march-date' => '$1. měrca',
+'april-date' => '$1. apryla',
+'may-date' => '$1. meje',
+'june-date' => '$1. junija',
+'july-date' => '$1. julija',
+'august-date' => '$1. awgusta',
+'september-date' => '$1. septembra',
+'october-date' => '$1. oktobra',
+'november-date' => '$1. nowembra',
+'december-date' => '$1. decembra',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorija|Kategoriji|Kategorije|Kategorije}}',
@@ -343,6 +354,7 @@ $messages = array(
 'create-this-page' => 'Stronu wutworić',
 'delete' => 'wušmórnyć',
 'deletethispage' => 'Stronu wušmórnyć',
+'undeletethispage' => 'Tutu stronu wobnowić',
 'undelete_short' => '{{PLURAL:$1|jednu wersiju|$1 wersiji|$1 wersije|$1 wersijow}} wobnowić',
 'viewdeleted_short' => '{{PLURAL:$1|jednu wušmórnjenu změnu|$1 wušmórnjenej změnje|$1 wušmórnjene změny|$1 wušmórnjenych změnow}} sej wobhladać',
 'protect' => 'škitać',
@@ -386,7 +398,7 @@ $1',
 'pool-queuefull' => 'Poolowa čakanska rynka je połna',
 'pool-errorunknown' => 'Njeznaty zmylk:',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Wo {{GRAMMAR:lokatiw|{{SITENAME}}}}',
 'aboutpage' => 'Project:Wo',
 'copyright' => 'Wobsah steji pod $1.',
@@ -396,7 +408,6 @@ $1',
 'disclaimers' => 'Licencne postajenja',
 'disclaimerpage' => 'Project:Impresum',
 'edithelp' => 'Pomoc za wobdźěłowanje',
-'edithelppage' => 'Help:Wobdźěłowanje',
 'helppage' => 'Help:Wobsah',
 'mainpage' => 'Hłowna strona',
 'mainpage-description' => 'Hłowna strona',
@@ -473,16 +484,6 @@ Płaćiwe specialne strony hodźa so pod [[Special:SpecialPages|lisćinu special
 # General errors
 'error' => 'Zmylk',
 'databaseerror' => 'Zmylk w datowej bance',
-'dberrortext' => 'Syntaktiski zmylk při wotprašowanju datoweje banki.
-To móhło zmylk w programje być. Poslednje spytane wotprašenje w datowej bance běše:
-<blockquote><code>$1</code></blockquote>
-z funkcije "<code>$2</code>".
-Datowa banka wróći zmylk "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Syntaktiski zmylk je we wotprašowanju datoweje banki wustupił.
-Poslednje wotprašenje w datowej bance běše:
-"$1"
-z funkcije "$2".
-Datowa banka wróći zmylk "$3: $4"',
 'laggedslavemode' => "'''Kedźbu:''' Je móžno, zo strona žane zaktualizowanja njewobsahuje.",
 'readonly' => 'Datowa banka je zawrjena',
 'enterlockreason' => 'Zapodaj přičinu za zawrjenje a přibližny čas, hdy budźe zawrjenje zběhnjene',
@@ -534,12 +535,15 @@ Wotprašenje: $2',
 'protectedinterface' => 'Tuta strona wobsahuje tekst za wužiwarski powjerch softwary na tutym wikiju a je škitana, zo by so znjewužiwanje zadźěwało.
 Zo by přełožki za wšě wikije přidał abo změnił, wužij prošu [//translatewiki.net/ translatewiki.net], projekt MediaWiki za lokalizaciju.',
 'editinginterface' => "'''Warnowanje:''' Wobdźěłuješ stronu, kotraž so wužiwa, zo by tekst za wužiwarski powjerch softwary k dispoziciji stajiła. Změny na stronje  wuskutkuja so na napohlad wužiwarskeho powjercha za druhich wužiwarjow na tutym wikiju. Zo by přełožki za wšě wikije přidał abo změnił, wužij prošu [//translatewiki.net/ translatewiki.net], projekt MediaWiki za lokalizaciju.",
-'sqlhidden' => '(SQL wotprašenje schowane)',
 'cascadeprotected' => 'Tuta strona je za wobdźěłowanje zawrjena, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacymaj stronomaj|slědowacych stronach|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrejž stej|kotrež su|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitanej|škitane|škitane}}:
 $2',
 'namespaceprotected' => "Nimaš dowolnosć, zo by stronu w mjenowym rumje '''$1''' wobdźěłał.",
 'customcssprotected' => 'Nimaš prawo, zo by tutu CSS-stronu wobdźěłał, dokelž wosobinske nastajenja druheho wužiwarja wobsahuje.',
 'customjsprotected' => 'Nimaš prawo, zo by tutu JavaScript-stronu wobdźěłał, dokelž wosobinske nastajenja druheho wužiwarja wobsahuje.',
+'mycustomcssprotected' => 'Nimaš prawo tutu CSS-stronu wobdźěłać.',
+'mycustomjsprotected' => 'Nimaš prawo tutu JavaScript-stronu wobdźěłać.',
+'myprivateinfoprotected' => 'Nimaš prawo swoje priwatne informacije wobdźěłać.',
+'mypreferencesprotected' => 'Nimaš prawo swoje nastajenja wobdźěłać.',
 'ns-specialprotected' => 'Specialne strony njedadźa so wobdźěłać.',
 'titleprotected' => 'Tutón titul bu přećiwo wutworjenju přez [[User:$1|$1]] škitany.
 Podata přičina je \'\'"$2"\'\'.',
@@ -565,10 +569,18 @@ Wobkedźbuj, zo so někotre strony dale jewja, kaž by hišće přizjewjeny był
 'welcomecreation-msg' => 'Twoje konto bu wutworjene.
 Njezabudź swoje [[Special:Preferences|nastajenja za {{GRAMMAR:akuzatiw|{{SITENAME}}}}]] změnić.',
 'yourname' => 'Wužiwarske mjeno:',
+'userlogin-yourname' => 'Wužiwarske mjeno',
+'userlogin-yourname-ph' => 'Zapodaj swoje wužiwarske mjeno',
 'yourpassword' => 'Hesło:',
+'userlogin-yourpassword' => 'Hesło',
+'userlogin-yourpassword-ph' => 'Zapodaj swoje hesło',
+'createacct-yourpassword-ph' => 'Zapodaj hesło',
 'yourpasswordagain' => 'Hesło znowa zapodać:',
+'createacct-yourpasswordagain' => 'Hesło wobkrućić',
+'createacct-yourpasswordagain-ph' => 'Zapodaj hesło hišće raz',
 'remembermypassword' => 'Na tutym ličaku přizjewjeny wostać (za maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}})',
-'securelogin-stick-https' => 'Po přizjewjenju z HTTPS zwjazany wostać',
+'userlogin-remembermypassword' => 'Přizjewjeny wostać',
+'userlogin-signwithsecure' => 'Wěsty zwisk wužiwać',
 'yourdomainname' => 'Twoja domejna:',
 'password-change-forbidden' => 'Njemóžeš hesła na tutym wikiju změnić.',
 'externaldberror' => 'Běše pak eksterny zmylk awtentifikacije datoweje banki, pak njesměš swoje eksterne konto aktualizować.',
@@ -580,18 +592,38 @@ Njezabudź swoje [[Special:Preferences|nastajenja za {{GRAMMAR:akuzatiw|{{SITENA
 'logout' => 'wotzjewić',
 'userlogout' => 'wotzjewić',
 'notloggedin' => 'Njepřizjewjeny',
+'userlogin-noaccount' => 'Nimaš žane konto?',
+'userlogin-joinproject' => 'Konto za {{GRAMMAR:akuzatiw|{{SITENAME}}}} załožić',
 'nologin' => 'Nimaš žane konto? $1.',
 'nologinlink' => 'Konto załožić',
 'createaccount' => 'Konto załožić',
 'gotaccount' => 'Maš hižo wužiwarske konto? $1.',
 'gotaccountlink' => 'Přizjewić',
 'userlogin-resetlink' => 'Přizjewjenske daty zabył?',
+'userlogin-resetpassword-link' => 'Hesło anulować',
+'helplogin-url' => 'Help:Přizjewić',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc za přizjewjenje]]',
+'createacct-join' => 'Zapodaj deleka swoje informacije.',
+'createacct-emailrequired' => 'E-mejlowa adresa',
+'createacct-emailoptional' => 'E-mejlowa adresa (opcionalny)',
+'createacct-email-ph' => 'Zapodaj swoju e-mejlowu adresu',
 'createaccountmail' => 'Nachwilne přidatne hesło wužiwać a jo na slědowacu e-mejlowu adresu pósłać',
+'createacct-realname' => 'Woprawdźite mjeno (opcionalny)',
 'createaccountreason' => 'Přičina:',
+'createacct-reason' => 'Přičina',
+'createacct-reason-ph' => 'Čehodla załožuješ druhe konto?',
+'createacct-captcha' => 'Wěstotna kontrola',
+'createacct-imgcaptcha-ph' => 'Zapodaj tekst, kotryž deleka widźiš',
+'createacct-submit' => 'Twoje konto załožić',
+'createacct-benefit-heading' => '{{SITENAME}} je so wot ludźi kaž ty wutworił.',
+'createacct-benefit-body1' => '{{PLURAL:$1|změna|změnje|změny|změnow}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|strona|stronje|strony|stronow}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|aktiwny sobuskutkowar|aktiwnej sobuskutkowarjej|aktiwni sobuskutkowarjo}}',
 'badretype' => 'Hesle, kotrejž sy zapodał, so njekryjetej.',
 'userexists' => 'Wužiwarske mjeno, kotrež sy zapodał, so hižo wužiwa.
 Prošu wubjer druhe mjeno.',
 'loginerror' => 'Zmylk při přizjewjenju',
+'createacct-error' => 'Zmylk při załožowanju konta',
 'createaccounterror' => 'Wužiwarske konto njeda so załožić: $1',
 'nocookiesnew' => 'Wužiwarske konto bu załožene, njejsy pak přizjewjeny. {{SITENAME}} wužiwa placki (cookies), zo bychu so wužiwarjo přizjewili. Sy placki znjemóžnił. Prošu zmóžń je a přizjew so potom ze swojim nowym wužiwarskim mjenom a hesłom.',
 'nocookieslogin' => '{{SITENAME}} wužiwa placki za přizjewjenje wužiwarjow.
@@ -661,7 +693,7 @@ Móžeš tutu zdźělenku ignorować, jeli so wužiwarske konto zmylnje wutwori
 'newpassword' => 'Nowe hesło:',
 'retypenew' => 'Nowe hesło wospjetować:',
 'resetpass_submit' => 'Hesło posrědkować a so přizjewić',
-'resetpass_success' => 'Twoje hesło bu wuspěšnje změnjene! Nětko přizjewjenje běži...',
+'changepassword-success' => 'Twoje hesło bu wuspěšnje změnjene! Nětko přizjewjenje běži...',
 'resetpass_forbidden' => 'Hesła njedadźa so změnić.',
 'resetpass-no-info' => 'Dyrbiš so přizjewić, zo by direktny přistup na tutu stronu měł.',
 'resetpass-submit-loggedin' => 'Hesło změnić',
@@ -673,10 +705,11 @@ Snano sy swoje hesło hižo wuspěšnje změnił abo nowe nachwilne hesło poža
 
 # Special:PasswordReset
 'passwordreset' => 'Hesło wróćo stajić',
-'passwordreset-text' => 'Wupjelń tutón formular, zo by swoje hesło anulował.',
+'passwordreset-text-one' => 'Wupjelń tutón formular, zo by swoje hesło anulował.',
+'passwordreset-text-many' => '{{PLURAL:$1|Zapodaj jedyn z datow, zo by swoje hesło anulował.}}',
 'passwordreset-legend' => 'Hesło wróćo stajić',
 'passwordreset-disabled' => 'Wróćostajenje hesłow je so na  tutym wikiju znjemóžniło.',
-'passwordreset-pretext' => '{{PLURAL:$1||Zapodaj deleka jedne ze slědowacych datowych podaćow}}',
+'passwordreset-emaildisabled' => 'E-mejlowe funkcije su so na tutym wikiju znjemóžnili.',
 'passwordreset-username' => 'Wužiwarske mjeno:',
 'passwordreset-domain' => 'Domena:',
 'passwordreset-capture' => 'E-mejlku sej wobhladać?',
@@ -699,7 +732,7 @@ Ty měł so nětko přizjewić a nowe hesło wubrać. Jeli něchtó druhi je tut
 Nachwilne hesło: $2',
 'passwordreset-emailsent' => 'E-mejl za anulowanje hesło je so pósłała.',
 'passwordreset-emailsent-capture' => 'E-mejl za anulowanje hesła je so pósłała, kotraž so deleka pokazuje.',
-'passwordreset-emailerror-capture' => 'E-mejl za anulowanje hesła je so wutworiła, kotraž so deleka pokazuje, ale słanje wužiwarjej je so njeporadźiło: $1',
+'passwordreset-emailerror-capture' => 'E-mejl za anulowanje hesła je so wutworiła, kotraž so deleka pokazuje, ale słanje {{GENDER:$2|wužiwarjej|wužiwarce}} je so njeporadźiło: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-mejlowu adresu změnić',
@@ -899,12 +932,14 @@ Njeje žane wujasnjenje podała.',
 Zda so, zo je hîžo wušmórnjena.',
 'edit-conflict' => 'Wobdźěłanski konflikt.',
 'edit-no-change' => 'Waše wobdźěłanje bu ignorowane, dokelž tekst njebu zm,ěnjeny.',
+'postedit-confirmation' => 'Twoja změna je so składowała.',
 'edit-already-exists' => 'Njebě móžno nowu stronu wutworić.
 Eksistuje hižo.',
 'defaultmessagetext' => 'Standardny tekst zdźělenki',
 'content-failed-to-parse' => 'Parsowanje wobsaha $2 za model $1 je so njeporadźiło: $3',
 'invalid-content-data' => 'Njepłaćiwe wobsahowe daty',
 'content-not-allowed-here' => 'Wobsah "$1" njeje na stronje [[$2]] dowoleny',
+'editwarning-warning' => 'Hdyž so strona wopušća, móža so změny zhubić, kotrež sy přewjedł. Jeli sy přizjewjeny, móžeš tute warnowanje we wotrězku "Wobdźěłowanje" swojich nastajenjow znjemóžnić.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -937,6 +972,7 @@ Dyrbjała mjenje hač $2 {{PLURAL:$2|wołanje|wołanjej|wołanja|wołanjow}} mě
 'undo-failure' => 'Wobdźěłanje njehodźeše so wotstronić, dokelž wotpowědny wotrězk bu mjeztym změnjeny.',
 'undo-norev' => 'Změna njeda so cofnyć, dokelž njeeksistuje abo bu wušmórnjena.',
 'undo-summary' => 'Změna $1 [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusija]]) bu cofnjena.',
+'undo-summary-username-hidden' => 'Změna $1 schowaneho wužiwarja je so anulowała',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Wužiwarske konto njeda so wutworić.',
@@ -1141,7 +1177,6 @@ Podrobnosće móžeš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'searchmenu-legend' => 'Pytanske opcije',
 'searchmenu-exists' => "'''Je strona z mjenom \"[[\$1]]\" na tutym wikiju'''",
 'searchmenu-new' => "'''Wutwor stronu \"[[:\$1|\$1]]\" na tutym wikiju!'''",
-'searchhelp-url' => 'Help:Wobsah',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Strony z tutym prefiksom přepytać]]',
 'searchprofile-articles' => 'Wobsahowe strony',
 'searchprofile-project' => 'Pomoc a projektowe strony',
@@ -1183,15 +1218,7 @@ Spytaj swoje naprašowanje z prefiksom ''all:'' wužiwać, zo by wšón wobsah (
 'powersearch-togglenone' => 'Žadyn',
 'search-external' => 'Eksterne pytanje',
 'searchdisabled' => 'Pytanje w {{GRAMMAR:lokatiw|{{SITENAME}}}} tuchwilu móžne njeje. Móžeš mjeztym z Google pytać. Wobkedźbuj, zo móža wuslědki z wobsaha {{GRAMMAR:genitiw|{{SITENAME}}}} zestarjene być.',
-
-# Quickbar
-'qbsettings' => 'Pobóčna lajsta',
-'qbsettings-none' => 'Žane',
-'qbsettings-fixedleft' => 'Leži nalěwo',
-'qbsettings-fixedright' => 'Leži naprawo',
-'qbsettings-floatingleft' => 'Wisa nalěwo',
-'qbsettings-floatingright' => 'Wisa naprawo',
-'qbsettings-directionality' => 'Kruty, wotwisny wot pisanskeho směra twojeje rěče',
+'search-error' => 'Při pytanju je so zmylk wustupił: $1',
 
 # Preferences page
 'preferences' => 'Nastajenja',
@@ -1225,7 +1252,6 @@ Spytaj swoje naprašowanje z prefiksom ''all:'' wužiwać, zo by wšón wobsah (
 'resetprefs' => 'Njeskładowane změny zaćisnyć',
 'restoreprefs' => 'Wšě standardne nastajenja wobnowić',
 'prefs-editing' => 'Wobdźěłowanje',
-'prefs-edit-boxsize' => 'Wulkosć wobdźěłowanskeho wokna.',
 'rows' => 'Rjadki:',
 'columns' => 'Stołpiki:',
 'searchresultshead' => 'Pytać',
@@ -1236,9 +1262,6 @@ Spytaj swoje naprašowanje z prefiksom ''all:'' wužiwać, zo by wšón wobsah (
 'recentchangesdays-max' => '(Maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}})',
 'recentchangescount' => 'Ličba stronow, kotraž ma so po standardźe pokazać:',
 'prefs-help-recentchangescount' => 'To zapřijima aktualne změny, stawizny stronow a protokole.',
-'prefs-help-watchlist-token' => 'Wupjelnjenje tutoho pola z tajnym klučom budźe RSS-kanal za twoje wobkedźbowanki wupłodźić.
-Něchtó, kiž kluč w tutym polu znaje, móže twoje wobkedźbowanki čitać, wubjer tohodla wěstu hódnotu.
-Tu je připadnje wupłodźena hódnota, kotruž móžeš wužiwać: $1',
 'savedprefs' => 'Nastajenja buchu składowane.',
 'timezonelegend' => 'Časowe pasmo:',
 'localtime' => 'Lokalny čas:',
@@ -1269,7 +1292,6 @@ Tu je připadnje wupłodźena hódnota, kotruž móžeš wužiwać: $1',
 'prefs-reset-intro' => 'You can use this page to reset your preferences to the site defaults. This cannot be undone.
 Móžeš tutu stronu wužiwać, zo by swoje nastajenja na standardne hódnoty sydła wróćo stajić. To njeda so anulować.',
 'prefs-emailconfirm-label' => 'E-mejlowe wobkrućenje:',
-'prefs-textboxsize' => 'Wulkosć wobdźěłowanskeho wokna',
 'youremail' => 'E-mejl:',
 'username' => 'Mjeno {{GENDER:$1|wužiwarja|wužiwarki}}:',
 'uid' => 'ID {{GENDER:$1|wužiwarja|wužiwarki}}:',
@@ -1300,6 +1322,8 @@ Smě mjenje hač $1 {{PLURAL:$1|znamješko|znamješce|znamješka|znamješkow}} d
 'prefs-dateformat' => 'Datumowy format',
 'prefs-timeoffset' => 'Časowe wotchilenje',
 'prefs-advancedediting' => 'Powšitkowny',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Přehlad',
 'prefs-advancedrc' => 'Rozšěrjene opcije',
 'prefs-advancedrendering' => 'Rozšěrjene opcije',
 'prefs-advancedsearchoptions' => 'Rozšěrjene opcije',
@@ -1334,6 +1358,8 @@ Smě mjenje hač $1 {{PLURAL:$1|znamješko|znamješce|znamješka|znamješkow}} d
 'userrights-notallowed' => 'Twoje konto nima trěbne prawa, zo by wužiwarske prawa přidźěliło abo zebrało.',
 'userrights-changeable-col' => 'Skupiny, kotrež móžeš změnić',
 'userrights-unchangeable-col' => 'Skupiny, kotrež njemóžeš změnić',
+'userrights-conflict' => 'Konflikt wužiwarskich prawow! Prošu čiń swoje změny hišće raz.',
+'userrights-removed-self' => 'Sy swoje prawa wuspěšnje wotstronił. Tohodla nimaš hižo přistup na tutu stronu měć.',
 
 # Groups
 'group' => 'Skupina:',
@@ -1399,11 +1425,19 @@ Smě mjenje hač $1 {{PLURAL:$1|znamješko|znamješce|znamješka|znamješkow}} d
 'right-proxyunbannable' => 'Automatiske blokowanja proksyjow wobeńć',
 'right-unblockself' => 'Swójske blokowanje zběhnyć',
 'right-protect' => 'Škitowe schodźenki změnić a škitanu stronu wobdźěłać',
-'right-editprotected' => 'Škitane strony wobdźěłać (bjez kaskadoweho škita)',
+'right-editprotected' => 'Strony wobdźěłać, kotrež su přez "{{int:protect-level-sysop}}" škitane',
+'right-editsemiprotected' => 'Strony wobdźěłać, kotrež su přez "{{int:protect-level-autoconfirmed}}" škitane',
 'right-editinterface' => 'Wužiwarski powjerch wobdźěłać',
 'right-editusercssjs' => 'Dataje CSS a JS druhich wužiwarjow wobdźěłać',
 'right-editusercss' => 'Dataje CSS druhich wužiwarjow wobdźěłać',
 'right-edituserjs' => 'Dataje JS druhich wužiwarjow wobdźěłać',
+'right-editmyusercss' => 'Twoje swójske wužiwarske CSS-dataje wobdźěłać',
+'right-editmyuserjs' => 'Twoje swójske wužiwarske JavaScript-dataje wobdźěłać',
+'right-viewmywatchlist' => 'Sej swójske wobkedźbowanki wobhladać',
+'right-editmywatchlist' => 'Swoje wobkedźbowanki wobdźěłać. Wobkedźbuj, zo někotre akcije hišće bjez tutoho prawa strony přidawaja.',
+'right-viewmyprivateinfo' => 'Swójske priwatne daty sej wobhladać (na př. e-mejlowu adresu, woprawdźite mjeno)',
+'right-editmyprivateinfo' => 'Swójske priwatne daty wobdźěłać (na př. e-mejlowu adresu, woprawdźite mjeno)',
+'right-editmyoptions' => 'Twoje swójske nastajenja wobdźěłać',
 'right-rollback' => 'Poslednjeho wužiwarja, kotryž wěstu stronu wobdźěła, spěšnje rewertować',
 'right-markbotedits' => 'Rewertowane změny jako botowe změny markěrować',
 'right-noratelimit' => 'Přez žane limity wobmjezowane',
@@ -1465,12 +1499,17 @@ Smě mjenje hač $1 {{PLURAL:$1|znamješko|znamješce|znamješka|znamješkow}} d
 'action-userrights-interwiki' => 'Wužiwarske prawa wužiwarjow w druhich wikijach wobdźěłać',
 'action-siteadmin' => 'Datowu banku zawrěć abo wotewrić',
 'action-sendemail' => 'E-mejle pósłać',
+'action-editmywatchlist' => 'twoje wobkedźbowanki wobdźěłać',
+'action-viewmywatchlist' => 'Sej swójske wobkedźbowanki wobhladać',
+'action-viewmyprivateinfo' => 'twoje priwatne informacije sej wobhladać',
+'action-editmyprivateinfo' => 'twoje priwatne informacije wobdźěłać',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|změna|změnje|změny|změnow}}',
 'recentchanges' => 'Aktualne změny',
 'recentchanges-legend' => 'Opcije aktualnych změnow',
 'recentchanges-summary' => 'Na tutej stronje móžeš najaktualniše změny w {{GRAMMAR:lokatiw|{{SITENAME}}}} wobkedźbować.',
+'recentchanges-noresult' => 'Žane změny za daty čas tutym kriterijam njewotpowěduja.',
 'recentchanges-feed-description' => 'Slěduj najaktualniše změny {{GRAMMAR:genitiw|{{SITENAME}}}} w tutym kanalu.',
 'recentchanges-label-newpage' => 'Tuta změna je nowu stronu wutworiła',
 'recentchanges-label-minor' => 'To je snadna změna',
@@ -1508,7 +1547,6 @@ Smě mjenje hač $1 {{PLURAL:$1|znamješko|znamješce|znamješka|znamješkow}} d
 'recentchangeslinked-feed' => 'Změny zwjazanych stron',
 'recentchangeslinked-toolbox' => 'Změny na zwjazanych stronach',
 'recentchangeslinked-title' => 'Změny na stronach, kotrež su z „$1“ wotkazane',
-'recentchangeslinked-noresult' => 'Njejsu změny zwajzanych stron we wubranej dobje.',
 'recentchangeslinked-summary' => "Tuta strona nalistuje poslednje změny na wotkazanych stronach (resp. pola kategorijow na čłonach kategorije).
 Strony na [[Special:Watchlist|wobkedźbowankach]] su '''tučne'''.",
 'recentchangeslinked-page' => 'Mjeno strony:',
@@ -1520,7 +1558,7 @@ Strony na [[Special:Watchlist|wobkedźbowankach]] su '''tučne'''.",
 'reuploaddesc' => 'Nahraće přetorhnyć a so k nahrawanskemu formularej wróćić.',
 'upload-tryagain' => 'Změnjene datajowe wopisanje wotpósłać',
 'uploadnologin' => 'Njepřizjewjeny',
-'uploadnologintext' => 'Dyrbiš [[Special:UserLogin|přizjewjeny]] być, zo by dataje nahrawać móhł.',
+'uploadnologintext' => 'Dyrbiš so $1, zo by dataje nahrawać móhł.',
 'upload_directory_missing' => 'Zapis nahraćow ($1) faluje a njeda so přez webserwer wutworić.',
 'upload_directory_read_only' => 'Nahrawanski zapis ($1) njehodźi so přez webserwer popisować.',
 'uploaderror' => 'Zmylk při nahrawanju',
@@ -1745,7 +1783,6 @@ Za optimalnu wěstotu je img_auth.php znjemóžnjeny.',
 'http-read-error' => 'Čitanski zmylk HTTP.',
 'http-timed-out' => 'Naprašowanje HTTP je čas překročiło.',
 'http-curl-error' => 'Zmylk při wołanju URL: $1',
-'http-host-unreachable' => 'URL njeda so docpěć.',
 'http-bad-status' => 'Problem je za HTTP-naprašowanje wustupił: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1891,10 +1928,6 @@ Snano chceš wopisanje na jeje [$2 stronje datajoweho wopisanja] wobdźěłać.'
 'statistics-users-active-desc' => 'Wužiwarjo, kotřiž su {{PLURAL:$1|wčera|w zańdźenymaj $1 dnjomaj|w zańdźenych $1 dnjach|w zańdźenych $1 dnjach}} aktiwni byli',
 'statistics-mostpopular' => 'Najhusćišo wopytowane strony',
 
-'disambiguations' => 'Strony, kotrež na strony wjacezmyslnosće wotkazuja',
-'disambiguationspage' => 'Template:Wjacezmyslnosć',
-'disambiguations-text' => "Slědowace strony wobsahuja znajmjeńša jedyn wotkaz k stronje '''rozjasnjenja wjacezmyslnosće'''. Měli město toho na poprawnu stronu wotkazać.<br />Maja stronu za stronu rozjasnjenja wjacezmyslnosće, jeli předłohu wužiwa, na kotruž so wot [[MediaWiki:Disambiguationspage]] wotkazuje.",
-
 'pageswithprop' => 'Strony z kajkosću strony',
 'pageswithprop-legend' => 'Strony z kajkosću strony',
 'pageswithprop-text' => 'Tuta strona nalistuje strony, kotrež wěstu kajkosć strony wužiwaja.',
@@ -2144,10 +2177,9 @@ Přichodne změny tuteje strony a přisłušneje diskusijneje strony budu so tam
 'unwatchthispage' => 'wobkedźbowanje skónčić',
 'notanarticle' => 'njeje nastawk',
 'notvisiblerev' => 'Wersija bu wušmórnjena',
-'watchnochange' => 'Žana z twojich wobkedźbowanych stron njebu w podatej dobje wobdźěłana.',
 'watchlist-details' => '{{PLURAL:$1|$1 wobkedźbowana strona|$1 wobkedźbowanej stronje|$1 wobkedźbowane strony|$1 wobkedźbowanych stronow}}, diskusijne strony wuwzate.',
-'wlheader-enotif' => '* E-mejlowe zdźělenje je zmóžnjene.',
-'wlheader-showupdated' => '* Strony, kotrež buchu po twojim poslednim wopyće změnjene so <b>tučne</b> pokazuja.',
+'wlheader-enotif' => 'E-mejlowa zdźělenska słužba je zmóžnjena.',
+'wlheader-showupdated' => "Strony, kotrež su so po twojim poslednim wopyće změnili, so '''tučne''' pokazuja.",
 'watchmethod-recent' => 'Aktualne změny za wobkedźbowane strony přepruwować',
 'watchmethod-list' => 'Wobkedźbowanki za aktualnymi změnami přepruwować',
 'watchlistcontains' => 'Maš $1 {{PLURAL:$1|stronu|stronje|strony|stronow}} w swojich wobkedźbowankach.',
@@ -2537,14 +2569,12 @@ Hlej [[Special:BlockList|lisćinu blokowanjow]], zo by zablokowanjow pruwował.'
 'ipb_blocked_as_range' => 'Zmylk: IP $1 njeje direktnje zablokowana a njeda so wublokować. Blokuje so wšak jako dźěl wobwoda $2, kotryž da so wublokować.',
 'ip_range_invalid' => 'Njepłaciwy wobłuk IP-adresow.',
 'ip_range_toolarge' => 'Wobłukowe bloki, kotrež su wjetše hač /$1, njejsu dowolene.',
-'blockme' => 'Blokować',
 'proxyblocker' => 'Awtomatiske blokowanje wotewrjenych proksy-serwerow',
-'proxyblocker-disabled' => 'Tuta funkcija je deaktiwizowana.',
 'proxyblockreason' => 'Twoja IP-adresa bu zablokowana, dokelž je wotewrjeny proksy. Prošu skontaktuj swojeho prowidera abo syćoweho administratora a informuj jeho wo tutym chutnym wěstotnym problemje.',
-'proxyblocksuccess' => 'Dokónčene.',
 'sorbs' => 'SORBS DNSbl',
 'sorbsreason' => 'Twoja IP-adresa je jako wotewrjeny proksy na DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} zapisana.',
 'sorbs_create_account_reason' => 'Twoja IP-adresa je jako wotewrjeny proksy na DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} zapisana. Njemóžeš konto wutworić.',
+'xffblockreason' => 'IP-adresa w header X-Forwarded-For, pak twoja pak ta proksy-serwera, kotryž wužiwaš, je so zablokowała. Prěnjotna přičina za blokowanje bě: $1',
 'cant-block-while-blocked' => 'Njemóžeš druhich wužiwarjow blokować, mjeztym zo ty sy zablokowany.',
 'cant-see-hidden-user' => 'Wužiwar, kotrehož pospytuješ blokować, bu hižo zablokowany a schowany. Dokelž nimaš prawo wužiwarja schować, njemóžeš blokowanje wužiwarja widźeć abo wobdźěłać.',
 'ipbblocked' => 'Njemóžeš druhich wužiwarjow blokować abo wotblokować, dokelž ty sam sy zablokowany',
@@ -2695,6 +2725,8 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 'thumbnail-more' => 'powjetšić',
 'filemissing' => 'Dataja pobrachuje',
 'thumbnail_error' => 'Zmylk při wutworjenju miniaturki: $1',
+'thumbnail_error_remote' => 'Zmylkowa zdźělenka wot $1:
+$2',
 'djvu_page_error' => 'Strona DjVU zwonka wobłuka strony',
 'djvu_no_xml' => 'Daty XML njemóža so za dataju DjVU wotwołać',
 'thumbnail-temp-create' => 'Temporerna dataja za miniaturny wobrazk njeda so wutworić',
@@ -2918,13 +2950,8 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 'pageinfo-category-files' => 'Ličba datajow',
 
 # Skin names
-'skinname-standard' => 'Klasiski',
-'skinname-nostalgia' => 'Nostalgija',
 'skinname-cologneblue' => 'Kölnjanska módrina',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Ćipka',
-'skinname-simple' => 'Jednory',
 'skinname-modern' => 'Moderny',
 
 # Patrolling
@@ -3002,11 +3029,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 mjeńšinu|$1 mjeńšinomaj|$1 mjeńšinami|$1 mjeńšinami}}',
 'hours' => '{{PLURAL:$1|$1 hodźinu|$1 hodźinomaj|$1 hodźinami|$1 hodźinami}}',
 'days' => '{{PLURAL:$1|$1 dnjom|$1 dnjomaj|$1 dnjemi|$1 dnjemi}}',
+'weeks' => '{{PLURAL:$1|$1 tydźeń|$1 njedźeli|$1 njedźele|$1 njedźel}}',
 'months' => '{{PLURAL:$1|$1 měsacom|$1 měsacomaj|$1 měsacami}}',
 'years' => '{{PLURAL:$1|$1 lětom|$1 lětomaj|$1 lětami}}',
 'ago' => 'před $1',
 'just-now' => 'runje',
 
+# Human-readable timestamps
+'hours-ago' => 'před $1 {{PLURAL:$1|hodźinu|hodźinomaj|hodźinami}}',
+'minutes-ago' => 'před $1 {{PLURAL:$1|mjeńšinu|mjeńšinomaj|mjeńšinami}}',
+'seconds-ago' => 'před $1 {{PLURAL:$1|sekundu|sekundomaj|sekundami}}',
+'monday-at' => 'Póndźela $1',
+'tuesday-at' => 'Wutora $1',
+'wednesday-at' => 'Srjeda $1',
+'thursday-at' => 'Štwórtk $1',
+'friday-at' => 'Pjatk $1',
+'saturday-at' => 'Sobota $1',
+'sunday-at' => 'Njedźela $1',
+'yesterday-at' => 'Wčera $1',
+
 # Bad image list
 'bad_image_list' => 'Format:
 
@@ -3033,7 +3074,7 @@ Nasledne wotkazy na samsnej lince definuja wuwzaća, hdźež so wobraz smě naje
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Šěrokosć',
 'exif-imagelength' => 'Wysokosć',
 'exif-bitspersample' => 'Bitow na barbowu komponentu',
@@ -3211,7 +3252,7 @@ Nasledne wotkazy na samsnej lince definuja wuwzaća, hdźež so wobraz smě naje
 'exif-originalimageheight' => 'Wysokosć wobraza před přitřihowanjom',
 'exif-originalimagewidth' => 'Šěrokosć wobraza před přitřihowanjom',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Njekomprimowany',
 'exif-compression-2' => 'CCITT skupina 3 jednodimensionalne modificěrowane kodowanje Huffman běhoweje dołhosće',
 'exif-compression-3' => 'CCITT skupina 3 faksowe kodowanje',
@@ -3597,7 +3638,6 @@ Móžeš tež [[Special:EditWatchlist|standardnu wobdźěłowansku stronu]] wuž
 'version-other' => 'Druhe',
 'version-mediahandlers' => 'Předźěłaki medijow',
 'version-hooks' => 'Hoki',
-'version-extension-functions' => 'Funkcije rozšěrjenjow',
 'version-parser-extensiontags' => "Parserowe rozšěrjenja ''(taflički)''",
 'version-parser-function-hooks' => 'Parserowe funkcije',
 'version-hook-name' => 'Mjeno hoki',
@@ -3619,12 +3659,17 @@ Ty měł [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju licency GNU General Public Lic
 'version-entrypoints-header-entrypoint' => 'Zastupny dypk',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Datajowy puć',
-'filepath-page' => 'Dataja:',
-'filepath-submit' => 'Pytać',
-'filepath-summary' => 'Tuta specialna strona wróća dospołny puć aktualneje datajoweje wersije.
-Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym programom startuja.',
+# Special:Redirect
+'redirect' => 'Po datajowym mjenje, wužiwarju abo wersijowym ID dale sposrědkować',
+'redirect-legend' => 'Do dataje abo strony dale sposrědkować',
+'redirect-summary' => 'Tuta specialna strona so do dataje (datajowe mjeno je podate), strony (wersijowy ID je podaty) abo wužiwarskeje strony (numeriski wužiwarski ID je podaty) dale sposrědkuje.',
+'redirect-submit' => 'Los',
+'redirect-lookup' => 'Pytać:',
+'redirect-value' => 'Hódnota:',
+'redirect-user' => 'ID wužiwarja',
+'redirect-revision' => 'Wersija strony',
+'redirect-file' => 'Datajowe mjeno',
+'redirect-not-exists' => 'Hódnota njeje so namakała',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dwójne dataje pytać',
@@ -3715,6 +3760,9 @@ Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym prog
 'htmlform-submit' => 'Wotpósłać',
 'htmlform-reset' => 'Změny cofnyć',
 'htmlform-selectorother-other' => 'Druhe',
+'htmlform-no' => 'Ně',
+'htmlform-yes' => 'Haj',
+'htmlform-chosen-placeholder' => 'Wubjer móžnosć',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 połnotekstowe pytanje podpěruje.',
diff --git a/languages/messages/MessagesHt.php b/languages/messages/MessagesHt.php
index ef8f3eb9..c07491d9 100644
--- a/languages/messages/MessagesHt.php
+++ b/languages/messages/MessagesHt.php
@@ -171,9 +171,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Montre kantite itlizatè k’ap swiv',
 'tog-oldsig' => 'Gade pou wè siyati ki egziste deja:',
 'tog-fancysig' => 'Konsidere siyati sa tankou yon wikitèks (san lyen ki ta otomatik)',
-'tog-externaleditor' => 'Itilize editè ki pa nan sistèm wikimedya pa defo',
-'tog-externaldiff' => 'Itilize yon konparatè ki pa nan sitsèm wikimedya pa defo',
-'tog-showjumplinks' => 'Pèmèt lyen aksesibilite « ale nan »',
 'tog-uselivepreview' => 'Itilize kout je an dirèk (sa mande JavaScrip) (Esperimantal)',
 'tog-forceeditsummary' => 'Notifye m lè m ap antre yon somè modifikasyon vid',
 'tog-watchlisthideown' => 'Kache modifikasyon m yo nan lis swivi mwen a',
@@ -370,7 +367,7 @@ $1',
 'pool-queuefull' => 'Fil pou travay la plen',
 'pool-errorunknown' => 'Erè nou pa konnen',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Apwopo {{SITENAME}}',
 'aboutpage' => 'Project:Apwopo',
 'copyright' => 'Kontni disponib anba $1.',
@@ -380,7 +377,6 @@ $1',
 'disclaimers' => 'Avètisman',
 'disclaimerpage' => 'Project:Avètisman jeneral yo',
 'edithelp' => 'Èd pou modifye paj',
-'edithelppage' => 'Help:Modifye yon paj',
 'helppage' => 'Help:Èd',
 'mainpage' => 'Paj prensipal',
 'mainpage-description' => 'Paj prensipal',
@@ -451,17 +447,6 @@ Ou ka jwenn yon lis paj espesial ki valid yo la [[Special:SpecialPages|{{int:spe
 # General errors
 'error' => 'Erè',
 'databaseerror' => 'Erè nan bazdone.',
-'dberrortext' => 'Yon rekèt nan bazdone a bay yon erè.
-Sa kapab vle di genyen yon erè nan lojisyèl nan.
-Dènye esè a te :
-<blockquote><tt>$1</tt></blockquote>
-depi fonksyon sa « <tt>$2</tt> ».
-Bazdone ritounen erè sa « <tt>$3 : $4</tt> ».',
-'dberrortextcl' => 'Yon rekèt nan bazdone a bay yon erè.
-Dènye esè nan baz done a te:
-« $1 »
-depi fonksyon sa « $2 ».
-Bazdone a te bay mesaj erè sa « $3 : $4 ».',
 'laggedslavemode' => "'''Atansyon:''' paj sa a kapab pa anrejistre modifikasyon ki fèk fèt yo.",
 'readonly' => 'Bazdone a fèmen toutbon.',
 'enterlockreason' => 'Bay yon rezon pou fème bazdone a ak yon estimasyon ki lè w ap ouvri l ankò',
@@ -507,7 +492,6 @@ Demann : $2',
 'viewsourcetext' => 'Ou kapab gade epitou modifye kontni atik sa a pou ou travay anlè li :',
 'protectedinterface' => 'Paj sa ap bay tèks pou entèfas lojisyèl an e li pwoteje pou anpeche move itilizasyon nou ta kapab fè ak li.',
 'editinginterface' => "'''Pòte atansyon :''' ou ap modifye yon paj ki itilize nan kreyasyon tèks entèfas lojisyèl an. Chanjman yo ap ritounen, li ap depann de kèk sityasyon, nan tout paj ke lòt itilizatè yo kapab wè tou. Pou tradiksyon yo, nap envite w itilize pwojè MediaWiki pou mesaj entènasyonal yo (tradiksyon) nan paj sa [//translatewiki.net/wiki/Main_Page?setlang=fr translatewiki.net].",
-'sqlhidden' => '(Demann SQL an kache)',
 'cascadeprotected' => 'Paj sa pwoteje kounye a paske l nan {{PLURAL:$1|paj ki douvan l|paj yo ki douvan l}}, paske {{PLURAL:$1|l te pwoteje|yo te pwoteje}} ak opsyon « pwoteksyon pou tout paj ki nan premye paj an - kaskad » aktive :
 $2',
 'namespaceprotected' => "Ou pa gen dwa modifye paj nan espas non « '''$1''' ».",
@@ -529,7 +513,6 @@ Note ke kèk paj gendwa afiche tankou ou te toujou konekte tank ou pa efase kach
 'yourpassword' => 'Mopas ou an :',
 'yourpasswordagain' => 'Mete mopas ou an ankò :',
 'remembermypassword' => 'Sonje mopas mwen an nan òdinatè mwen an (pou yon maximum de $1 {{PLURAL:$1|jou|jou}})',
-'securelogin-stick-https' => 'Kontinye itilize HTTPS toujou apre koneksyon',
 'yourdomainname' => 'Domèn ou an',
 'externaldberror' => 'Li sanble ke yon erè pwodui ak bazdone a pou idantifikasyon ki pa nan sistèm an, oubyen ou pa otorize pou mete a jou kont ou genyen nan lòt sistèm yo.',
 'login' => 'Konekte ou',
@@ -611,7 +594,7 @@ Pa pòte atansyon pou mesaj sa si kont sa kreye pa erè.',
 'newpassword' => 'Nouvo mopas:',
 'retypenew' => 'Konfime nouvo mopas an :',
 'resetpass_submit' => 'Chanje mopas epitou konekte',
-'resetpass_success' => 'Nou chanje mopas ou an avèk siksè ! Nap konekte ou kounye a...',
+'changepassword-success' => 'Nou chanje mopas ou an avèk siksè ! Nap konekte ou kounye a...',
 'resetpass_forbidden' => 'Nou pa kapab chanje mopas yo nan sistèm sa',
 'resetpass-no-info' => 'Ou dwe konekte ou pou ou kapab jwenn paj sa.',
 'resetpass-submit-loggedin' => 'Modifye mopas sa',
@@ -890,7 +873,6 @@ Lejand : ({{MediaWiki:Cur}}) = diferans ak vèsyon kounye a, ({{MediaWiki:Last}}
 'prevn' => '{{PLURAL:$1|$1}} anvan yo',
 'nextn' => '{{PLURAL:$1|$1}} swivan yo',
 'viewprevnext' => 'Wè ($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:Èd',
 'searchprofile-everything' => 'Tout',
 'search-result-size' => '$1 ({{PLURAL:$2| mo|$2 mo yo}})',
 'search-redirect' => '(redireksyon depi $1)',
@@ -972,7 +954,6 @@ Si ou mete li, n ap itilize li pou nou ka nonmen ou pou kontribisyon ou yo.',
 'recentchangeslinked-feed' => 'Swivi pou lyen yo',
 'recentchangeslinked-toolbox' => 'Swivi pou lyen yo',
 'recentchangeslinked-title' => 'Chanjman ki an relasyon ak "$1"',
-'recentchangeslinked-noresult' => 'Pa genyen pyès chanjman nan paj lye sa yo pou peryòd ou bay la.',
 'recentchangeslinked-summary' => "Paj espesyal sa a ap montre dènye chanjman nan paj ki genyen lyen depi yon paj spesifie (oubyen pou manm you kategori spesifie) yo. Paj yo ki nan [[Special:Watchlist|lis swivi]] ou an ap ekri '''fonse'''",
 'recentchangeslinked-page' => 'Non paj la :',
 'recentchangeslinked-to' => 'Afiche modifikasyon yo ki genyen yon lyen vè paj yo ba ou a plito',
@@ -1022,8 +1003,6 @@ Si ou mete li, n ap itilize li pou nou ka nonmen ou pou kontribisyon ou yo.',
 # Statistics
 'statistics' => 'Estatistik',
 
-'disambiguations' => 'Paj yo ki genyen menm non',
-
 'doubleredirects' => 'Redireksyon de fwa',
 
 'brokenredirects' => 'redireksyon ki pa mache yo',
diff --git a/languages/messages/MessagesHu.php b/languages/messages/MessagesHu.php
index f2b92346..5ad847a8 100644
--- a/languages/messages/MessagesHu.php
+++ b/languages/messages/MessagesHu.php
@@ -28,6 +28,7 @@
  * @author Kaganer
  * @author KossuthRad
  * @author Misibacsi
+ * @author Nemo bis
  * @author R-Joe
  * @author Samat
  * @author Sucy
@@ -344,9 +345,6 @@ $messages = array(
 'tog-shownumberswatching' => 'A lapot figyelő szerkesztők számának megjelenítése',
 'tog-oldsig' => 'A jelenlegi aláírás:',
 'tog-fancysig' => 'Az aláírás wikiszöveg (nem lesz automatikusan hivatkozásba rakva)',
-'tog-externaleditor' => 'Külső szerkesztőprogram használata (Csak haladók számára, speciális beállításokra van szükség a számítógépen. [//www.mediawiki.org/wiki/Manual:External_editors További információ angolul.])',
-'tog-externaldiff' => 'Külső diff program használata (Csak haladók számára, speciális beállításokra van szükség a számítógépen. [//www.mediawiki.org/wiki/Manual:External_editors További információ angolul.])',
-'tog-showjumplinks' => 'Helyezzen el hivatkozást („Ugrás”) a beépített eszköztárra',
 'tog-uselivepreview' => 'Élő előnézet használata (kísérleti)',
 'tog-forceeditsummary' => 'Figyelmeztessen, ha nem adok meg szerkesztési összefoglalót',
 'tog-watchlisthideown' => 'Saját szerkesztések elrejtése',
@@ -359,6 +357,8 @@ $messages = array(
 'tog-diffonly' => 'Ne mutassa a lap tartalmát a lapváltozatok közötti eltérések megtekintésekor',
 'tog-showhiddencats' => 'Rejtett kategóriák megjelenítése',
 'tog-norollbackdiff' => 'Ne jelenjenek meg az eltérések visszaállítás után',
+'tog-useeditwarning' => 'Figyelmeztessen, ha szerkesztéskor a módosítások mentése nélkül akarom elhagyni a lapot',
+'tog-prefershttps' => 'Mindig biztonságos kapcsolatot használjon, amikor be vagyok jelentkezve',
 
 'underline-always' => 'mindig',
 'underline-never' => 'soha',
@@ -422,6 +422,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => 'Január $1',
+'february-date' => 'Február $1',
+'march-date' => 'Március $1',
+'april-date' => 'Április $1',
+'may-date' => 'Május $1',
+'june-date' => 'Június $1',
+'july-date' => 'Július $1',
+'august-date' => 'Augusztus $1',
+'september-date' => 'Szeptember $1',
+'october-date' => 'Október $1',
+'november-date' => 'November $1',
+'december-date' => 'December $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategória|Kategória}}',
@@ -503,6 +515,7 @@ $messages = array(
 'create-this-page' => 'Oldal létrehozása',
 'delete' => 'Törlés',
 'deletethispage' => 'Lap törlése',
+'undeletethispage' => 'Lap helyreállítása',
 'undelete_short' => '{{PLURAL:$1|Egy|$1}} szerkesztés helyreállítása',
 'viewdeleted_short' => '{{PLURAL:$1|Egy|$1}} törölt szerkesztés megtekintése',
 'protect' => 'Lapvédelem',
@@ -545,7 +558,7 @@ $1',
 'pool-queuefull' => 'A pool sor megtelt',
 'pool-errorunknown' => 'Ismeretlen hiba',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'A {{SITENAME}} wikiről',
 'aboutpage' => 'Project:Rólunk',
 'copyright' => 'A tartalom további jelölés hiányában a(z) $1 feltételei szerint használható fel.',
@@ -555,7 +568,6 @@ $1',
 'disclaimers' => 'Jogi nyilatkozat',
 'disclaimerpage' => 'Project:Jogi nyilatkozat',
 'edithelp' => 'Szerkesztési segítség',
-'edithelppage' => 'Help:Szerkesztés',
 'helppage' => 'Help:Tartalom',
 'mainpage' => 'Kezdőlap',
 'mainpage-description' => 'Kezdőlap',
@@ -634,15 +646,11 @@ Az érvényes speciális lapok listáját a [[Special:SpecialPages|{{int:special
 # General errors
 'error' => 'Hiba',
 'databaseerror' => 'Adatbázishiba',
-'dberrortext' => 'Szintaktikai hiba található az adatbázis-lekérdezésben.
-Ezt szoftverhiba okozhatta.
-Az utolsó adatbázis-lekérdezés a(z) „<code>$2</code>” függvényből történt, és a következő volt:
-<blockquote><code>$1</code></blockquote>
-Az adatbázis ezzel a hibával tért vissza: „<samp>$3: $4</samp>”.',
-'dberrortextcl' => 'Szintaktikai hiba található az adatbázis-lekérdezésben.
-Az utolsó adatbázis-lekérdezés a(z) „$2” függvényből történt, és a következő volt:
-„$1”
-Az adatbázis ezzel a hibával tért vissza: „$3: $4”.',
+'databaseerror-text' => 'Hiba történt az adatbázis-lekérdezés során. Lehetséges, hogy ez egy szoftverhiba eredménye.',
+'databaseerror-textcl' => 'Hiba történt az adatbázis-lekérdezés során.',
+'databaseerror-query' => 'Lekérdezés: $1',
+'databaseerror-function' => 'Függvény: $1',
+'databaseerror-error' => 'Hiba: $1',
 'laggedslavemode' => "'''Figyelem:''' Ez a lap nem feltétlenül tartalmazza a legfrissebb változtatásokat!",
 'readonly' => 'Az adatbázis le van zárva',
 'enterlockreason' => 'Add meg a lezárás okát, valamint egy becslést, hogy mikor lesz a lezárásnak vége',
@@ -676,6 +684,7 @@ Talán már valaki más törölte.',
 'cannotdelete-title' => 'Nem lehet törölni a(z) „$1” lapot',
 'delete-hook-aborted' => 'A törlés meg lett szakítva egy hook által.
 Nem lett magyarázat csatolva.',
+'no-null-revision' => 'Nem sikerült új null-revíziót létrehozni a(z) „$1” lap számára.',
 'badtitle' => 'Hibás cím',
 'badtitletext' => 'A kért oldal címe érvénytelen, üres, vagy rosszul hivatkozott nyelvközi vagy wikiközi cím volt. Olyan karaktereket is tartalmazhatott, melyek a címekben nem használhatóak.',
 'perfcached' => "Az alábbi adatok gyorsítótárból (''cache''-ből) származnak, és ezért lehetséges, hogy nem a legfrissebb változatot mutatják. Legfeljebb {{PLURAL:$1|egy|$1 }} eredmény áll rendelkezésre a gyorsítótárban.",
@@ -693,12 +702,15 @@ Lekérdezés: $2',
 'viewyourtext' => "Megtekintheted és kimásolhatod a '''saját szerkesztéseidet''' az alábbi lapra:",
 'protectedinterface' => 'Ez a lap a szoftver felületéhez szolgáltat szöveget, és a visszaélések elkerülése miatt le van zárva.',
 'editinginterface' => "'''Vigyázat:''' egy olyan lapot szerkesztesz, ami a MediaWiki szoftver felületéhez tartozik. A lap megváltoztatása hatással lesz a kinézetre, ahogy más szerkesztők látják a lapot. Fordításra inkább használd a MediaWiki fordítására indított kezdeményezést, a [//translatewiki.net/wiki/Main_Page?setlang=hu translatewiki.net-et].",
-'sqlhidden' => '(rejtett SQL lekérdezés)',
 'cascadeprotected' => 'Ez a lap szerkesztés elleni védelemmel lett ellátva, mert a következő {{PLURAL:$1|lapon|lapokon}} be van kapcsolva a „kaszkádolt” védelem:
 $2',
 'namespaceprotected' => "Nincs jogosultságod a(z) '''$1''' névtérben található lapok szerkesztésére.",
 'customcssprotected' => 'Nem szerkesztheted ezt a CSS-lapot, mert egy másik felhasználó személyes beállításait tartalmazza.',
 'customjsprotected' => 'Nem szerkesztheted ezt a JavaScript-lapot, mert egy másik felhasználó személyes beállításait tartalmazza.',
+'mycustomcssprotected' => 'Nincs jogod szerkeszteni ezt a CSS lapot.',
+'mycustomjsprotected' => 'Nincs jogod szerkeszteni ezt a Javascript lapot.',
+'myprivateinfoprotected' => 'Nincs jogod módosítani a privát adataidat.',
+'mypreferencesprotected' => 'Nincs jogod módosítani a beállításaidat.',
 'ns-specialprotected' => 'A speciális lapok nem szerkeszthetők.',
 'titleprotected' => "Ilyen címmel nem lehet szócikket készíteni, [[User:$1|$1]] letiltotta.
 Az indoklás: „''$2''”.",
@@ -723,10 +735,19 @@ Lehetséges, hogy néhány oldalon továbbra is azt látod, be vagy jelentkezve,
 'welcomecreation-msg' => 'A felhasználói fiókod elkészült.
 Ne felejtsd el módosítani a [[Special:Preferences|{{SITENAME}} beállításaidat]].',
 'yourname' => 'Szerkesztőneved:',
+'userlogin-yourname' => 'Felhasználónév',
+'userlogin-yourname-ph' => 'Add meg a felhasználóneved',
+'createacct-another-username-ph' => 'Add meg a felhasználónevet',
 'yourpassword' => 'Jelszavad:',
+'userlogin-yourpassword' => 'Jelszó',
+'userlogin-yourpassword-ph' => 'Add meg a jelszavad',
+'createacct-yourpassword-ph' => 'Add meg a jelszavad',
 'yourpasswordagain' => 'Jelszavad ismét:',
+'createacct-yourpasswordagain' => 'Új jelszó megerősítése',
+'createacct-yourpasswordagain-ph' => 'Írd be a jelszót újra',
 'remembermypassword' => 'Emlékezzen rám ezen a számítógépen (legfeljebb $1 napig)',
-'securelogin-stick-https' => 'Kapcsolódás HTTPS-en keresztül bejelentkezés után is',
+'userlogin-remembermypassword' => 'Maradjak bejelentkezve',
+'userlogin-signwithsecure' => 'Biztonságos kapcsolat használata',
 'yourdomainname' => 'A domainneved:',
 'password-change-forbidden' => 'Nem módosíthatod a jelszót ezen a wikin.',
 'externaldberror' => 'Hiba történt a külső adatbázis hitelesítése közben, vagy nem vagy jogosult a külső fiókod frissítésére.',
@@ -738,18 +759,41 @@ Ne felejtsd el módosítani a [[Special:Preferences|{{SITENAME}} beállításaid
 'logout' => 'Kijelentkezés',
 'userlogout' => 'Kijelentkezés',
 'notloggedin' => 'Nem vagy bejelentkezve',
+'userlogin-noaccount' => 'Nem rendelkezel még felhasználói fiókkal?',
+'userlogin-joinproject' => 'Csatlakozz a(z) {{SITENAME}} wikihez',
 'nologin' => 'Nem rendelkezel még felhasználói fiókkal? $1.',
 'nologinlink' => 'Itt regisztrálhatsz',
 'createaccount' => 'Regisztráció',
 'gotaccount' => "Ha már korábban regisztráltál, '''$1'''.",
 'gotaccountlink' => 'Bejelentkezés',
 'userlogin-resetlink' => 'Elfelejtetted a bejelentkezési adataidat?',
+'userlogin-resetpassword-link' => 'A jelszó alaphelyzetbe állítása',
+'helplogin-url' => 'Help:Bejelentkezés',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Segítség a bejelentkezéshez]]',
+'createacct-join' => 'Add meg az alábbi információkat.',
+'createacct-another-join' => 'Add meg az új fiók adatait alább.',
+'createacct-emailrequired' => 'E-mail cím',
+'createacct-emailoptional' => 'E-mail cím (opcionális)',
+'createacct-email-ph' => 'Add meg e-mail címed',
+'createacct-another-email-ph' => 'Add meg az emailcímet',
 'createaccountmail' => 'Átmeneti, véletlenszerű jelszó beállítása és kiküldése a megadott e-mail címre',
+'createacct-realname' => 'Igazi neved (nem kötelező)',
 'createaccountreason' => 'Indoklás:',
+'createacct-reason' => 'Indoklás',
+'createacct-reason-ph' => 'Miért hozol létre egy másik fiókot',
+'createacct-captcha' => 'Biztonsági ellenőrzés',
+'createacct-imgcaptcha-ph' => 'Írd be a szöveget, amit fent látsz',
+'createacct-submit' => 'Felhasználói fiók létrehozása',
+'createacct-another-submit' => 'Újabb felhasználó létrehozása',
+'createacct-benefit-heading' => 'A(z) {{SITENAME}}-t hozzád hasonló emberek készítik.',
+'createacct-benefit-body1' => '{{PLURAL:$1|szerkesztés|szerkesztés}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|lap|lap}}',
+'createacct-benefit-body3' => 'aktív {{PLURAL:$1|szerkesztő|szerkesztő}}',
 'badretype' => 'A megadott jelszavak nem egyeznek.',
 'userexists' => 'A megadott felhasználónév már foglalt.
 Kérlek, válassz másikat!',
 'loginerror' => 'Hiba történt a bejelentkezés során',
+'createacct-error' => 'Fióklétrehozási hiba',
 'createaccounterror' => 'Nem sikerült létrehozni a felhasználói fiókot: $1',
 'nocookiesnew' => 'A felhasználói fiókod létrejött, de nem vagy bejelentkezve. A wiki sütiket („cookie”) használ a szerkesztők azonosítására. Nálad ezek le vannak tiltva. Kérlek, engedélyezd őket a böngésződben, majd lépj be az új azonosítóddal és jelszavaddal.',
 'nocookieslogin' => 'A wiki sütiket („cookie”) használ a szerkesztők azonosításhoz.
@@ -807,7 +851,7 @@ A hozzá tartozó jelszó "$3", melyet a bejelentkezés után minél előbb vál
 Ha nem kértél új azonosítót, és tévedésből kaptad ezt a levelet, hagyd figyelmen kívül.',
 'usernamehasherror' => 'A felhasználónév nem tartalmazhat hash karaktereket',
 'login-throttled' => 'Túl sok hibás bejelentkezés.
-Várj egy kicsit, mielőtt újra próbálkozol.',
+Várj $1, mielőtt újra próbálkozol.',
 'login-abort-generic' => 'A bejelentkezés sikertelen – megszakítva',
 'loginlanguagelabel' => 'Nyelv: $1',
 'suspicious-userlogout' => 'A kijelentkezési kérésed vissza lett utasítva, mert úgy tűnik, hogy egy hibás böngésző vagy gyorsítótárazó proxy küldte.',
@@ -826,7 +870,7 @@ Várj egy kicsit, mielőtt újra próbálkozol.',
 'newpassword' => 'Új jelszó:',
 'retypenew' => 'Új jelszó ismét:',
 'resetpass_submit' => 'Add meg a jelszót és jelentkezz be',
-'resetpass_success' => 'A jelszavad megváltoztatása sikeresen befejeződött! Bejelentkezés...',
+'changepassword-success' => 'A jelszavad megváltoztatása sikeresen befejeződött!',
 'resetpass_forbidden' => 'A jelszavak nem változtathatók meg',
 'resetpass-no-info' => 'Be kell jelentkezned, hogy közvetlenül elérd ezt a lapot.',
 'resetpass-submit-loggedin' => 'Jelszó megváltoztatása',
@@ -838,10 +882,11 @@ Lehet, hogy már sikeresen megváltoztattad a jelszavad, vagy pedig időközben
 
 # Special:PasswordReset
 'passwordreset' => 'Jelszó törlése',
-'passwordreset-text' => 'Az alábbi űrlap kitöltése után egy jelszóemlékeztető e-mailt kapsz a fiókod adataival.',
+'passwordreset-text-one' => 'A jelszavad alaphelyzetbe állításához töltsd ki az űrlapot.',
+'passwordreset-text-many' => '{{PLURAL:$1|A jelszavad alaphelyzetbe állításához töltsd ki az alábbi mezők egyikét.}}',
 'passwordreset-legend' => 'Új jelszó kérése',
 'passwordreset-disabled' => 'Új jelszó kérése nem engedélyezett ezen a wikin.',
-'passwordreset-pretext' => '{{PLURAL:$1||Írd be az alábbi adatok egyikét}}',
+'passwordreset-emaildisabled' => 'Az e-mail funkció le van tiltva ezen a wikin.',
 'passwordreset-username' => 'Felhasználónév:',
 'passwordreset-domain' => 'Tartomány:',
 'passwordreset-capture' => 'Meg szeretnéd nézni az elkészült üzenetet?',
@@ -862,7 +907,7 @@ $2
 Ideiglenes jelszó: $2',
 'passwordreset-emailsent' => 'Jelszó-visszaállító e-mail elküldve.',
 'passwordreset-emailsent-capture' => 'Az alább látható jelszó-visszaállító e-mail lett elküldve.',
-'passwordreset-emailerror-capture' => 'Az emlékeztető levél generálása megtörtént, mint az alább látszik, de elküldése a szerkesztőnek nem sikerült: $1',
+'passwordreset-emailerror-capture' => 'A jelszó-visszaállító e-mail generálása megtörtént, mint az alább látszik, de elküldése a {{GENDER:$2|szerkesztőnek}} nem sikerült: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-mail cím megváltoztatása',
@@ -1070,12 +1115,15 @@ Nem lett magyarázat csatolva.',
 Úgy tűnik, hogy törölve lett.',
 'edit-conflict' => 'Szerkesztési ütközés.',
 'edit-no-change' => 'A szerkesztésed figyelmen kívül lett hagyva, mivel nem változtattál a lap szövegén.',
+'postedit-confirmation' => 'A szerkesztésedet elmentettük.',
 'edit-already-exists' => 'Az új lap nem készíthető el.
 Már létezik.',
 'defaultmessagetext' => 'Alapértelmezett szöveg',
 'content-failed-to-parse' => 'Hiba történt a $2 tartalom $1 modellre történő konvertálása során: $3',
 'invalid-content-data' => 'Érvénytelen tartalom adat',
 'content-not-allowed-here' => '"$1" tartalom nem engedélyezett a [[$2]] oldalon',
+'editwarning-warning' => 'A lap elhagyásával az összes itt végzett változtatás elveszhet.
+Ha be vagy jelentkezve letilthatod ezt a figyelmeztetést a beállításaid „Szerkesztés” szakaszában.',
 
 # Content models
 'content-model-wikitext' => 'wikiszöveg',
@@ -1284,6 +1332,7 @@ Győződj meg róla, hogy a laptörténet folytonossága megmarad.',
 'compareselectedversions' => 'Kiválasztott változatok összehasonlítása',
 'showhideselectedversions' => 'Kiválasztott változatok láthatóságának beállítása',
 'editundo' => 'visszavonás',
+'diff-empty' => '(Nincs különbség)',
 'diff-multi' => '({{PLURAL:$2|egy|$2}} szerkesztő {{PLURAL:$1|egy|$1}} közbeeső változata nincs mutatva)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Egy közbeeső változat|$1 közbeeső változat}} nincs mutatva, amit $2 szerkesztő módosított)',
 'difference-missing-revision' => 'A(z) "{{PAGENAME}}" nevű oldal #$1 $2 változata nem létezik.
@@ -1310,7 +1359,6 @@ Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás
 'searchmenu-legend' => 'Keresési beállítások',
 'searchmenu-exists' => "'''A wikin már van „[[:$1]]” nevű lap'''",
 'searchmenu-new' => "'''Hozd létre a(z) „[[:$1]]” nevű lapot ezen a wikin!'''",
-'searchhelp-url' => 'Help:Tartalom',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ilyen előtagú lapok listázása]]',
 'searchprofile-articles' => 'Tartalmi oldalak',
 'searchprofile-project' => 'Segítség- és projektlapok',
@@ -1351,15 +1399,7 @@ Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás
 'powersearch-togglenone' => 'Egyik sem',
 'search-external' => 'Külső kereső',
 'searchdisabled' => 'Elnézésed kérjük, de a teljes szöveges keresés terhelési okok miatt átmenetileg nem használható. Ezidő alatt használhatod a lenti Google keresést, mely viszont lehetséges, hogy nem teljesen friss adatokkal dolgozik.',
-
-# Quickbar
-'qbsettings' => 'Gyorsmenü',
-'qbsettings-none' => 'Nincs',
-'qbsettings-fixedleft' => 'Fix baloldali',
-'qbsettings-fixedright' => 'Fix jobboldali',
-'qbsettings-floatingleft' => 'Lebegő baloldali',
-'qbsettings-floatingright' => 'Lebegő jobboldali',
-'qbsettings-directionality' => 'Rögzített, a nyelved írásának irányától függően',
+'search-error' => 'A keresés közben hiba történt: $1',
 
 # Preferences page
 'preferences' => 'Beállítások',
@@ -1393,7 +1433,6 @@ Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás
 'resetprefs' => 'Alaphelyzet',
 'restoreprefs' => 'A beállítások alaphelyzetbe állítása',
 'prefs-editing' => 'Szerkesztés',
-'prefs-edit-boxsize' => 'A szerkesztőablak mérete.',
 'rows' => 'Sor',
 'columns' => 'Oszlop',
 'searchresultshead' => 'Keresés',
@@ -1404,9 +1443,9 @@ Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás
 'recentchangesdays-max' => '(maximum {{PLURAL:$1|egy|$1}} nap)',
 'recentchangescount' => 'Az alapértelmezettként mutatott szerkesztések száma:',
 'prefs-help-recentchangescount' => 'Ez vonatkozik a friss változtatásokra, laptörténetekre és naplókra is.',
-'prefs-help-watchlist-token' => 'Ha ebbe a mezőbe beírsz egy titkos kulcsot, RSS feed fog készülni a figyelőlistádról.
-Bárki, aki tudja a fenti mezőbe beírt kulcsot, látni fogja a figyelőlistádat, így válassz egy titkos értéket.
-Itt van egy véletlenszerűen generált érték, amit használhatsz: $1',
+'prefs-help-watchlist-token2' => 'Ez a titkos kulcs a figyelőlistádhoz.
+Aki ismeri, meg tudja nézni, milyen lapokat figyelsz, úgyhogy ne oszdd meg másokkal.
+[[Special:ResetTokens|Kattints ide, ha meg akarod változtatni]].',
 'savedprefs' => 'Az új beállításaid érvénybe léptek.',
 'timezonelegend' => 'Időzóna:',
 'localtime' => 'Helyi idő:',
@@ -1437,7 +1476,6 @@ Itt van egy véletlenszerűen generált érték, amit használhatsz: $1',
 'prefs-reset-intro' => 'Ezen a lapon állíthatod vissza a beállításaidat az oldal alapértelmezett értékeire.
 A műveletet nem lehet visszavonni.',
 'prefs-emailconfirm-label' => 'E-mail cím megerősítése:',
-'prefs-textboxsize' => 'A szerkesztőablak mérete',
 'youremail' => 'Az e-mail címed:',
 'username' => '{{GENDER:$1|Szerkesztőnév}}:',
 'uid' => '{{GENDER:$1|Azonosító}}:',
@@ -1468,6 +1506,8 @@ A műveletet nem lehet visszavonni.',
 'prefs-dateformat' => 'Dátumformátum',
 'prefs-timeoffset' => 'Időeltérés',
 'prefs-advancedediting' => 'Általános',
+'prefs-editor' => 'Szerkesztő',
+'prefs-preview' => 'Előnézet',
 'prefs-advancedrc' => 'Haladó beállítások',
 'prefs-advancedrendering' => 'Haladó beállítások',
 'prefs-advancedsearchoptions' => 'Haladó beállítások',
@@ -1501,6 +1541,7 @@ A műveletet nem lehet visszavonni.',
 'userrights-notallowed' => 'Nincs jogosultságod jogosultságok adására vagy elvételére.',
 'userrights-changeable-col' => 'Megváltoztatható csoportok',
 'userrights-unchangeable-col' => 'Nem megváltoztatható csoportok',
+'userrights-conflict' => 'Felhasználói jogok ütközése! Kérlek, végezd el újra a változtatásokat.',
 
 # Groups
 'group' => 'Csoport:',
@@ -1566,7 +1607,7 @@ A műveletet nem lehet visszavonni.',
 'right-proxyunbannable' => 'proxyk automatikus blokkjainak megkerülése',
 'right-unblockself' => 'saját felhasználói fiók blokkjának feloldása',
 'right-protect' => 'védelmi szintek megváltoztatása és kaszkádolt védelemmel rendelkező lapok szerkesztése',
-'right-editprotected' => 'kaszkád védelem nélküli védett lapok szerkesztése',
+'right-editprotected' => '"{{int:protect-level-sysop}}" védelmi szintű lapok szerkesztése',
 'right-editinterface' => 'felhasználói felület szerkesztése',
 'right-editusercssjs' => 'más felhasználók CSS és JS fájljainak szerkesztése',
 'right-editusercss' => 'más felhasználók CSS fájljainak szerkesztése',
@@ -1635,9 +1676,12 @@ A műveletet nem lehet visszavonni.',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|egy|$1}} változtatás',
+'enhancedrc-since-last-visit' => '$1 az utolsó látogatás óta',
+'enhancedrc-history' => 'történet',
 'recentchanges' => 'Friss változtatások',
 'recentchanges-legend' => 'A friss változtatások beállításai',
 'recentchanges-summary' => 'Ezen a lapon a wikiben történt legutóbbi fejleményeket lehet nyomon követni.',
+'recentchanges-noresult' => 'A megadott időszakban nincs a feltételeknek megfelelő szerkesztés.',
 'recentchanges-feed-description' => 'Kövesd a wiki friss változtatásait ezzel a hírcsatornával.',
 'recentchanges-label-newpage' => 'Ezzel a szerkesztéssel egy új lap jött létre',
 'recentchanges-label-minor' => 'Ez egy apró szerkesztés',
@@ -1674,7 +1718,6 @@ A műveletet nem lehet visszavonni.',
 'recentchangeslinked-feed' => 'Kapcsolódó változtatások',
 'recentchangeslinked-toolbox' => 'Kapcsolódó változtatások',
 'recentchangeslinked-title' => 'A(z) $1 laphoz kapcsolódó változtatások',
-'recentchangeslinked-noresult' => 'A megadott időtartam alatt nem történt változtatás a kapcsolódó lapokon.',
 'recentchangeslinked-summary' => "Alább azon lapoknak a legutóbbi változtatásai láthatóak, amelyekre hivatkozik egy megadott lap (vagy tagjai a megadott kategóriának).
 A [[Special:Watchlist|figyelőlistádon]] szereplő lapok '''félkövérrel''' vannak jelölve.",
 'recentchangeslinked-page' => 'Lap neve:',
@@ -1686,7 +1729,7 @@ A [[Special:Watchlist|figyelőlistádon]] szereplő lapok '''félkövérrel''' v
 'reuploaddesc' => 'Visszatérés a feltöltési űrlaphoz.',
 'upload-tryagain' => 'Módosított fájl-leírás elküldése',
 'uploadnologin' => 'Nem vagy bejelentkezve',
-'uploadnologintext' => 'Csak regisztrált felhasználók tölthetnek fel fájlokat. [[Special:UserLogin|Jelentkezz be]] vagy regisztrálj!',
+'uploadnologintext' => '{{UCFIRST:$1}} fájlok feltöltéséhez.',
 'upload_directory_missing' => 'A feltöltési könyvtár ($1) nem létezik vagy nem tudja létrehozni a kiszolgáló.',
 'upload_directory_read_only' => 'A kiszolgálónak nincs írási jogosultsága a feltöltési könyvtárban ($1).',
 'uploaderror' => 'Feltöltési hiba',
@@ -1911,7 +1954,6 @@ Ez a wiki publikus, így a biztonság miatt az img_auth.php ki van kapcsolva.',
 'http-read-error' => 'HTTP-olvasási hiba.',
 'http-timed-out' => 'A HTTP-kérés túllépte a határidőt.',
 'http-curl-error' => 'Hiba történt az URL lekérésekor: $1',
-'http-host-unreachable' => 'Nem sikerült elérni az URL-t.',
 'http-bad-status' => 'Probléma történt a HTTP-kérés közben: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2057,12 +2099,6 @@ Ellenőrizd a meglévő hivatkozásokat, mielőtt törölnéd őket.',
 'statistics-users-active-desc' => 'Szerkesztők, akik csináltak valamit az elmúlt {{PLURAL:$1|egy|$1}} napban',
 'statistics-mostpopular' => 'Legtöbbször megtekintett lapok',
 
-'disambiguations' => 'Egyértelműsítő lapokra mutató lapok',
-'disambiguationspage' => 'Template:Egyért',
-'disambiguations-text' => "A következő oldalak '''egyértelműsítő lapra''' mutató hivatkozást tartalmaznak.
-A megfelelő szócikkre kellene mutatniuk inkább.<br />
-Egy oldal egyértelműsítő lapnak számít, ha tartalmazza a [[MediaWiki:Disambiguationspage]] oldalról belinkelt sablonok valamelyikét.",
-
 'doubleredirects' => 'Dupla átirányítások',
 'doubleredirectstext' => 'Ez a lap azokat a lapokat listázza, melyek átirányító lapokra irányítanak át.
 Minden sor tartalmaz egy hivatkozást az első, valamint a második átirányításra, valamint a második átirányítás céljára, ami általában a valódi céllap, erre kellene az első átirányításnak mutatnia.
@@ -2310,10 +2346,9 @@ Ezután minden, a lapon vagy annak vitalapján történő változást ott fogsz
 'unwatchthispage' => 'Figyelés leállítása',
 'notanarticle' => 'Nem szócikk',
 'notvisiblerev' => 'A változat törölve lett',
-'watchnochange' => 'Egyik figyelt lap sem változott a megadott időintervallumon belül.',
 'watchlist-details' => 'A vitalapokon kívül {{PLURAL:$1|egy|$1}} lap van a figyelőlistádon.',
-'wlheader-enotif' => '* Az e-mailen keresztül történő értesítés engedélyezve.',
-'wlheader-showupdated' => "* Azok a lapok, amelyek megváltoztak, mióta utoljára megnézted őket, '''vastagon''' láthatók.",
+'wlheader-enotif' => 'Az e-mailen keresztül történő értesítés engedélyezve.',
+'wlheader-showupdated' => "Azok a lapok, amelyek megváltoztak, mióta utoljára megnézted őket, '''vastagon''' láthatóak.",
 'watchmethod-recent' => 'a figyelt lapokon belüli legfrissebb szerkesztések',
 'watchmethod-list' => 'a legfrissebb szerkesztésekben található figyelt lapok',
 'watchlistcontains' => 'A figyelőlistádon {{PLURAL:$1|egy|$1}} lap szerepel.',
@@ -2711,11 +2746,8 @@ Add meg a blokkolás okát is (például idézd a blokkolandó személy által v
 'ipb_blocked_as_range' => 'Hiba: a(z) $1 IP-cím nem blokkolható közvetlenül, és nem lehet feloldani. A(z) $2 tartomány részeként van blokkolva, amely feloldható.',
 'ip_range_invalid' => 'Érvénytelen IP-tartomány.',
 'ip_range_toolarge' => 'Nem engedélyezettek azok a tartományblokkok, melyek nagyobbak mint /$1.',
-'blockme' => 'Saját magam blokkolása',
 'proxyblocker' => 'Proxyblokkoló',
-'proxyblocker-disabled' => 'Ez a funkció le van tiltva.',
 'proxyblockreason' => "Az IP-címeden ''nyílt proxy'' üzemel. Amennyiben nem használsz proxyt, vedd fel a kapcsolatot egy informatikussal vagy az internetszolgáltatóddal ezen súlyos biztonsági probléma ügyében.",
-'proxyblocksuccess' => 'Kész.',
 'sorbsreason' => 'Az IP-címed nyitott proxyként szerepel e webhely által használt DNSBL listán.',
 'sorbs_create_account_reason' => 'Az IP-címed nyitott proxyként szerepel e webhely által használt DNSBL listán. Nem hozhatsz létre fiókot.',
 'cant-block-while-blocked' => 'Nem blokkolhatsz más szerkesztőket, miközben te magad blokkolva vagy.',
@@ -3035,17 +3067,11 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
 
 # Stylesheets
 'common.css' => '/* Közös CSS az összes felületnek */',
-'standard.css' => '/* Az ide elhelyezett CSS hatással lesz a Klasszikus felület használóira */',
-'nostalgia.css' => '/* Az ide elhelyezett CSS hatással lesz a Nosztalgia felület használóira */',
 'cologneblue.css' => '/* Az ide elhelyezett CSS hatással lesz a Kölni kék felület használóira */',
 'monobook.css' => '/* Az ide elhelyezett CSS hatással lesz a Monobook felület használóira */',
-'myskin.css' => '/* Az ide elhelyezett CSS hatással lesz a MySkin felület használóira */',
-'chick.css' => '/* Az ide elhelyezett CSS hatással lesz a Chick felület használóira */',
-'simple.css' => '/* Az ide elhelyezett CSS hatással lesz a Egyszerű felület használóira */',
 'modern.css' => '/* Az ide elhelyezett CSS hatással lesz a Modern felület használóira */',
 'vector.css' => '/* Az ide elhelyezett CSS hatással lesz a Vector felület használóira */',
 'print.css' => '/* Az ide elhelyezett CSS hatással lesz a nyomtatás kimenetelére */',
-'handheld.css' => '/* Az ide elhelyezett CSS hatással lesz azon kézi eszközökre, amelyek $wgHandheldStyle felülettel vannak konfigurálva */',
 'noscript.css' => '/* Az ide elhelyezett CSS azon felhasználókra lesz hatással, ahol a JavaScript le van tiltva */',
 'group-autoconfirmed.css' => '/* Az ide elhelyezett CSS az automatikusan megerősített felhasználókra lesz hatással */',
 'group-bot.css' => '/* Az ide elhelyezett CSS csak botokra lesz hatással */',
@@ -3054,13 +3080,8 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
 
 # Scripts
 'common.js' => '/* Az ide elhelyezett JavaScript kód minden felhasználó számára lefut az oldalak betöltésekor. */',
-'standard.js' => '/* A Klasszikus felületet használó szerkesztők számára betöltendő JavaScriptek */',
-'nostalgia.js' => '/* A Nosztalgia felületet használó szerkesztők számára betöltendő JavaScriptek */',
 'cologneblue.js' => '/* A Kölni kék felületet használó szerkesztők számára betöltendő JavaScriptek */',
 'monobook.js' => '/* A Monobook felületet használó szerkesztők számára betöltendő JavaScriptek */',
-'myskin.js' => '/* A MySkin felületet használó szerkesztők számára betöltendő JavaScriptek */',
-'chick.js' => '/* A Chick felületet használó szerkesztők számára betöltendő JavaScriptek */',
-'simple.js' => '/* Az Egyszerű felületet használó szerkesztők számára betöltendő JavaScriptek */',
 'modern.js' => '/* A Modern felületet használó szerkesztők számára betöltendő JavaScriptek */',
 'vector.js' => '/* A Vector felületet használó szerkesztők számára betöltendő JavaScriptek */',
 'group-autoconfirmed.js' => '/* Az ide elhelyezett JavaScript csak automatikusan megerősített felhasználóknak töltődik be */',
@@ -3137,13 +3158,8 @@ Ez valószínűleg egy olyan link miatt van, ami egy feketelistán lévő oldalr
 'pageinfo-category-files' => 'Fájlok száma',
 
 # Skin names
-'skinname-standard' => 'Klasszikus',
-'skinname-nostalgia' => 'Nosztalgia',
 'skinname-cologneblue' => 'Kölni kék',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Egyszerű',
 'skinname-modern' => 'Modern',
 
 # Patrolling
@@ -3226,6 +3242,9 @@ A futtatása során kárt tehet a számítógépedben.",
 'ago' => '$1 ezelőtt',
 'just-now' => 'épp most',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|órával|órával}} ezelőtt',
+
 # Bad image list
 'bad_image_list' => 'A formátum a következő:
 
@@ -3253,7 +3272,7 @@ míg a többi elem a táblázat összecsukása után alapértelmezett esetben re
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Szélesség',
 'exif-imagelength' => 'Magasság',
 'exif-bitspersample' => 'Bitek összetevőnként',
@@ -3431,7 +3450,7 @@ míg a többi elem a táblázat összecsukása után alapértelmezett esetben re
 'exif-originalimageheight' => 'Kép magassága a levágás előtt',
 'exif-originalimagewidth' => 'Kép szélessége a levágás előtt',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nem tömörített',
 'exif-compression-2' => 'CCITT Group 3 1 dimenziós módosított Huffman kódolás',
 'exif-compression-3' => 'CCITT Group 3 fax kódolás',
@@ -3821,7 +3840,6 @@ minden egyes sor egy figyelt lap címe. Ha kész vagy, kattints a lista alatt ta
 'version-other' => 'Egyéb',
 'version-mediahandlers' => 'Médiafájl-kezelők',
 'version-hooks' => 'Hookok',
-'version-extension-functions' => 'A kiterjesztések függvényei',
 'version-parser-extensiontags' => 'Az értelmező kiterjesztéseinek tagjei',
 'version-parser-function-hooks' => 'Az értelmező függvényeinek hookjai',
 'version-hook-name' => 'Hook neve',
@@ -3830,6 +3848,7 @@ minden egyes sor egy figyelt lap címe. Ha kész vagy, kattints a lista alatt ta
 'version-license' => 'Licenc',
 'version-poweredby-credits' => "Ez a wiki '''[//www.mediawiki.org/ MediaWiki]''' szoftverrel működik, copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'mások',
+'version-poweredby-translators' => 'translatewiki.net fordítók',
 'version-credits-summary' => 'Szeretnénk elismerni a következő személyek hozzájárulását a [[Special:Version|MediaWiki]] szoftverhez.',
 'version-license-info' => 'A MediaWiki szabad szoftver, terjeszthető és / vagy módosítható a GNU General Public License alatt, amit a Free Software Foundation közzétett; vagy a 2-es verziójú licenc, vagy (az Ön választása alapján) bármely későbbi verzió szerint. 
 
@@ -3843,13 +3862,6 @@ A MediaWikit abban a reményben terjesztjük, hogy hasznos lesz, de GARANCIA NÉ
 'version-entrypoints-header-entrypoint' => 'Belépési pont',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Fájlelérés',
-'filepath-page' => 'Fájl:',
-'filepath-submit' => 'Elérési út',
-'filepath-summary' => 'Ezen lap segítségével lekérheted egy adott fájl pontos útvonalát.
-A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozzájuk rendelt programmal indulnak el.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Duplikátumok keresése',
 'fileduplicatesearch-summary' => 'Fájlok duplikátumainak keresése hash értékük alapján.',
@@ -3938,6 +3950,8 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozz
 'htmlform-submit' => 'Elküldés',
 'htmlform-reset' => 'Változtatások visszavonása',
 'htmlform-selectorother-other' => 'egyéb',
+'htmlform-no' => 'Nem',
+'htmlform-yes' => 'Igen',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 teljes szöveges keresés támogatással',
diff --git a/languages/messages/MessagesHy.php b/languages/messages/MessagesHy.php
index d246d13c..aa7b2898 100644
--- a/languages/messages/MessagesHy.php
+++ b/languages/messages/MessagesHy.php
@@ -9,6 +9,7 @@
  *
  * @author Ahmed-Najib-Biabani-Ibrahimkhel
  * @author Chaojoker
+ * @author Nemo bis
  * @author Pandukht
  * @author Reedy
  * @author Ruben Vardanyan (me@RubenVardanyan.com)
@@ -304,9 +305,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ցույց տալ էջ հսկող մասնակիցների թիվը',
 'tog-oldsig' => 'Ներկայիս ստորագրությունն է․',
 'tog-fancysig' => 'Ստորագրությունը վիքիտեքստի տեսքով (առանց ավտոմատ հղման)',
-'tog-externaleditor' => 'Օգտագործել արտաքին խմբագրիչ ըստ լռության (պահանջում է հատուկ նախընտրություններ ձեր համակարգչում)',
-'tog-externaldiff' => 'Օգտագործել տարբերակների համեմատման արտաքին ծրագիր ըստ լռության (պահանջում է հատուկ նախընտրություններ ձեր համակարգչում)',
-'tog-showjumplinks' => 'Միացնել «անցնել դեպի» օգնական հղումները',
 'tog-uselivepreview' => 'Օգտագործել ուղիղ նախադիտում (JavaScript) (Փորձնական)',
 'tog-forceeditsummary' => 'Նախազգուշացնել խմբագրման ամփոփումը դատարկ թողնելու դեպքում',
 'tog-watchlisthideown' => 'Թաքցնել իմ խմբագրումները հսկացանկից',
@@ -319,6 +317,7 @@ $messages = array(
 'tog-diffonly' => 'Չցուցադրել էջի պարունակությունը տարբերությունների ներքևից',
 'tog-showhiddencats' => 'Ցուցադրել թաքնված կատեգորիաները',
 'tog-norollbackdiff' => 'Չցուցադրել տարբերությունները հետ գլորելուց հետո',
+'tog-useeditwarning' => 'Զգուշացնել ինձ, երբ ես լքում եմ խմբագրման էջը առանց կատարած փոփոխությունները հիշելու։',
 
 'underline-always' => 'Միշտ',
 'underline-never' => 'Երբեք',
@@ -382,6 +381,18 @@ $messages = array(
 'oct' => 'հոկ',
 'nov' => 'նոյ',
 'dec' => 'դեկ',
+'january-date' => 'Հունվարի $1',
+'february-date' => 'Փետրվարի $1',
+'march-date' => 'Մարտի $1',
+'april-date' => 'Ապրիլի $1',
+'may-date' => 'Մայիսի $1',
+'june-date' => 'Հունիսի $1',
+'july-date' => 'Հուլիսի $1',
+'august-date' => 'Օգոստոսի $1',
+'september-date' => 'Սեպտեմբերի $1',
+'october-date' => 'Հոկտեմբերի $1',
+'november-date' => 'Նոյեմբերի $1',
+'december-date' => 'Դեկտեմբերի $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Կատեգորիա|Կատեգորիաներ}}',
@@ -503,7 +514,7 @@ $messages = array(
 $1',
 'pool-errorunknown' => 'Անհայտ սխալ',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} մասին',
 'aboutpage' => 'Project:Էությունը',
 'copyright' => 'Կայքի բովանդակությունը գտնվում է «$1» արտոնագրի տակ։',
@@ -513,7 +524,6 @@ $1',
 'disclaimers' => 'Ազատում պատասխանատվությունից',
 'disclaimerpage' => 'Project:Ազատում պատասխանատվությունից',
 'edithelp' => 'Խմբագրման ուղեցույց',
-'edithelppage' => 'Help:Խմբագրում',
 'helppage' => 'Help:Գլխացանկ',
 'mainpage' => 'Գլխավոր էջ',
 'mainpage-description' => 'Գլխավոր էջ',
@@ -590,17 +600,6 @@ $1',
 # General errors
 'error' => 'Սխալ',
 'databaseerror' => 'Տվյալների բազայի սխալ',
-'dberrortext' => 'Հայտնաբերվել է տվյալների բազային հայցի շարահյուսության սխալ։
-Սա կարող է լինել ծրագրային ապահովման սխալից։
-Տվյալների բազային վերջին հայցն էր․
-<blockquote><tt>$1</tt></blockquote>
-հետևյալ ֆունկցիայի մարմնից <tt>«$2»</tt>։
-Տվյլաների բազայի վերադարձրած սխալն է․ <tt>«$3: $4»</tt>։',
-'dberrortextcl' => 'Հայտնաբերվել է տվյալների բազային հայցի շարահյուսության սխալ։
-Տվյալների բազային վերջին հայցն էր.
-«$1»
-հետևյալ ֆունկցիայի մարմնից <tt>«$2»</tt>։
-Տվյալների բազայի վերադարձրած սխալն է. <tt>«$3: $4»</tt>։',
 'laggedslavemode' => 'Զգուշացում. էջը կարող է չպարունակել վերջին փոփոխությունները։',
 'readonly' => 'Տվյալների բազան կողպված է',
 'enterlockreason' => 'Նշեք կողպման պատճառը և մոտավոր ժամկետը',
@@ -652,7 +651,6 @@ $1',
 'editinginterface' => "'''Ուշադրություն՝''' Դուք խմբագրում եք ծրագրային ապահովման միջերեսի տեքստ պարունակող էջ։
 Այս էջի փոփոխությունը կանդրադառնա այլ մասնակիցներին տեսանելի միջերեսը այս վիքիի վրա։
 Թարգմանությունների համար նախընտրելի է օգտագործել [//translatewiki.net/wiki/Main_Page?setlang=hy translatewiki.net]՝ Մեդիավիքի ծրագրի տեղայնացման նախագիծը։",
-'sqlhidden' => '(SQL հայցումը թաքցված է)',
 'cascadeprotected' => 'Այս էջը պաշտպանված է խմբագրումից, քանի որ ընդգրկված է հետևյալ {{PLURAL:$1|էջի|էջերի}} տեքստում, {{PLURAL:$1|որը|որոնք}} պաշտպանվել {{PLURAL:$1|է|են}} կասկադային հնարավորությամբ.
 $2',
 'namespaceprotected' => 'Դուք չունեք «$1» անվանատարածքի էջերի խմբագրման իրավունք։',
@@ -677,10 +675,18 @@ $2',
 'welcomecreation-msg' => 'Ձեր հաշիվն ստեղծված է։
 Չմոռանաք փոփոխել ձեր [[Special:Preferences|նախընտրությունները]]։',
 'yourname' => 'Մասնակցի անուն՝',
+'userlogin-yourname' => 'Մասնակցային անուն',
+'userlogin-yourname-ph' => 'Մուտքագրեք ձեր մասնակցային անունը',
 'yourpassword' => 'Գաղտնաբառ՝',
+'userlogin-yourpassword' => 'Գաղտնաբառ',
+'userlogin-yourpassword-ph' => 'Մուտքագրեք ձեր գաղտնաբառը',
+'createacct-yourpassword-ph' => 'Մուտքագրեք գաղտնաբառը',
 'yourpasswordagain' => 'Կրկնեք գաղտնաբառը',
+'createacct-yourpasswordagain' => 'Հաստատեք գաղտնաբառը',
+'createacct-yourpasswordagain-ph' => 'Կրկին մուտքագրեք գաղտնաբառը',
 'remembermypassword' => 'Հիշել իմ մուտքը այս դիտարկչում ($1 {{PLURAL:$1|օրից}} ոչ ավել ժամկետով)',
-'securelogin-stick-https' => 'Մուտք գործելուց հետո շարունակել աշխատանքը HTTPS–ով',
+'userlogin-remembermypassword' => 'Մուտք գործած մնալ',
+'userlogin-signwithsecure' => 'Օգտագործել անվտանգ միացում',
 'yourdomainname' => 'Ձեր դոմենը՝',
 'password-change-forbidden' => 'Այս վիքիում չեք կարող փոխել գաղտնաբառ։',
 'externaldberror' => 'Տեղի է ունեցել վավերացման արտաքին տվյալների բազայի սխալ, կամ դուք չունեք բավարար իրավունքներ ձեր արտաքին հաշվի փոփոխման համար։',
@@ -692,14 +698,31 @@ $2',
 'logout' => 'Դուրս գալ համակարգից',
 'userlogout' => 'Ելնել համակարգից',
 'notloggedin' => 'Դուք չեք մտել համակարգ',
+'userlogin-noaccount' => 'Հաշիվ չունե՞ք։',
+'userlogin-joinproject' => 'Միացեք {{SITENAME}} նախագծին',
 'nologin' => "Չունե՞ք հաշիվ '''$1'''։",
 'nologinlink' => 'Ստեղծել մասնակցային հաշիվ',
 'createaccount' => 'Ստեղծել նոր հաշիվ',
 'gotaccount' => "Դուք արդեն գրանցվա՞ծ եք։ '''$1'''։",
 'gotaccountlink' => 'Մուտք գործեք համակարգ',
 'userlogin-resetlink' => 'Մոռացե՞լ եք Ձեր հաշվի տվյալները։',
+'userlogin-resetpassword-link' => 'Զրոյացնել ձեր գաղտնաբառը։',
+'createacct-join' => 'Մուտքագրեք Ձեր տեղեկությունները ստորև',
+'createacct-emailrequired' => 'Էլ–փոստի հասցե',
+'createacct-emailoptional' => 'Էլ–փոստի հասցե (ոչ պարտադիր)',
+'createacct-email-ph' => 'Մուտքագրեք ձեր էլ–փոստի հասցեն',
 'createaccountmail' => 'Օգտագործել ժամանակավոր պատահական գաղտնաբառ, որը կուղարկվի ձեր էլ–փոստի հասցեին։',
+'createacct-realname' => 'Իրական անուն (պարտադիր չէ)',
 'createaccountreason' => 'Պատճառը՝',
+'createacct-reason' => 'Պատճառ',
+'createacct-reason-ph' => 'Ինչո՞ւ եք փորձում ստեղծել մեկ այլ հաշիվ',
+'createacct-captcha' => 'Անվտանգության ստուգում',
+'createacct-imgcaptcha-ph' => 'Մուտքագրեք վերը բերված գրվածքը',
+'createacct-submit' => 'Ստեղծել ձեր հաշիվը',
+'createacct-benefit-heading' => '{{SITENAME}}՝ ստեղծված ձեր պես մարդկանց կողմից։',
+'createacct-benefit-body1' => '{{PLURAL:$1|խմբագրում}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|էջ}}',
+'createacct-benefit-body3' => 'վերջերս ակտիվ {{PLURAL:$1|մասնակից}}',
 'badretype' => 'Ձեր մուտքագրած գաղտնաբառերը չեն համընկնում։',
 'userexists' => 'Այս մասնակցի անունը արդեն զբաղված է։ Խնդրում ենք ընտրել մեկ այլ անուն։',
 'loginerror' => 'Մուտքի սխալ',
@@ -769,7 +792,7 @@ $2',
 'newpassword' => 'Նոր գաղտնաբառը.',
 'retypenew' => 'Հաստատեք նոր գաղտնաբառը.',
 'resetpass_submit' => 'Հաստատել գաղտնաբառը և մտնել համակարգ',
-'resetpass_success' => 'Ձեր գաղտնաբառը փոխված է։ Մուտք համակարգ…',
+'changepassword-success' => 'Ձեր գաղտնաբառը փոխված է։ Մուտք համակարգ…',
 'resetpass_forbidden' => 'Գաղտնաբառը չի կարող փոխվել',
 'resetpass-no-info' => 'Այս էջին ուղիղ դիմելու համար անհրաժեշտ է մտնել համակարգ։',
 'resetpass-submit-loggedin' => 'Փոխել գաղտնաբառը',
@@ -780,7 +803,6 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Վերականգնել գաղտնաբառը',
-'passwordreset-text' => 'Լրացրեք ձևը՝ էլ-փոստով ձեր տվյալների մասին հիշեցում ստանալու համար։',
 'passwordreset-legend' => 'Վերականգնել գաղտնաբառը',
 'passwordreset-disabled' => 'Գաղտնաբառի վերականգնումը այս վիքիում թույլատրված չէ։',
 'passwordreset-username' => 'Մասնակցի անուն՝',
@@ -1011,7 +1033,10 @@ $2',
 'log-fulllog' => 'Դիտել ամբողջական տեղեկամատյանը',
 'edit-conflict' => 'Խմբագրման ընհարում։',
 'edit-no-change' => 'Ձեր խմբագրումը անտեսվել է, քանի որ ոչ մի փոփոխություն չի կատարվել տեքստի մեջ։',
+'postedit-confirmation' => 'Ձեր խմբագրումը պահպանված է:',
 'defaultmessagetext' => 'Լռելյան տեքստը',
+'editwarning-warning' => 'Այս էջը լքելով դուք կարող եք կորցնել ձեր կատարած փոփոխությունները։
+Եթե դուք գրանցված եք համակարգում, կարող եք անջատել այս նախազգուշացումը ձեր նախընրությունների «{{int:prefs-editing}}» բաժնում։',
 
 # Content models
 'content-model-wikitext' => 'վիքիտեքստ',
@@ -1147,7 +1172,6 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'searchmenu-legend' => 'Որոնման ընտրանքներ',
 'searchmenu-exists' => "'''Այս վիքիում, գոյություն ունի \"[[:\$1]]\" անվանումով էջը։'''",
 'searchmenu-new' => "'''Ստեղծե՛լ \"[[:\$1]]\" էջը այս վիքիում'''",
-'searchhelp-url' => 'Help:Գլխացանկ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ցուցադրել այս նախածանցով սկսվող էջերը]]',
 'searchprofile-articles' => 'Հիմնական էջեր',
 'searchprofile-project' => 'Օգնության և նախագծերի էջեր',
@@ -1189,14 +1213,6 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'search-external' => 'Արտաքին որոնում',
 'searchdisabled' => '{{SITENAME}} կայքի ներքին որոնումը անջատված է։ Դուք կարող եք որոնել կայքի պարունակությունը արտաքին որոնման շարժիչներով (Google, Yahoo...), սակայն, ի նկատի ունեցեք, որ կայքի իրենց ինդեքսները կարող են հնացած լինել։',
 
-# Quickbar
-'qbsettings' => 'Արագ անցման վահանակ',
-'qbsettings-none' => 'Չցուցադրել',
-'qbsettings-fixedleft' => 'Ձախից անշարժ',
-'qbsettings-fixedright' => 'Աջից անշարժ',
-'qbsettings-floatingleft' => 'Ձախից լողացող',
-'qbsettings-floatingright' => 'Աջից լողացող',
-
 # Preferences page
 'preferences' => 'Նախընտրություններ',
 'mypreferences' => 'Նախընտրություններ',
@@ -1226,7 +1242,6 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'resetprefs' => 'Անտեսել փոփոխությունները',
 'restoreprefs' => 'Զրոյացնել, բերելով իլռելայն նախընտրանքներին',
 'prefs-editing' => 'Խմբագրում',
-'prefs-edit-boxsize' => 'Խմբագրման պատուհանի չափը։',
 'rows' => 'Տողեր`',
 'columns' => 'Սյունակներ',
 'searchresultshead' => 'Որոնում',
@@ -1236,9 +1251,6 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'recentchangesdays-max' => '($1 {{PLURAL:$1|օրից|օրից}} ոչ ավել)',
 'recentchangescount' => 'Խմբագրումների թիվը ըստ լռության.',
 'prefs-help-recentchangescount' => 'Ներառում է վերջին փոփոխությունները, էջերի պատմությունը և տեղեկամատյանները։',
-'prefs-help-watchlist-token' => 'Այս դաշտը գաղտնի բանալիով լռացնելը կբերի ձեր հսկողության ցանկի RSS ժապավենի ստեղծմանը։
-Ցանկացած մեկը, ով գիտի այս բանալին, կարող է կարդալ ձեր հսկողության ցանկը, այդ պատճառով ընտրեք գաղտնի արժեք։
-Դուք կարող եք օգտագործել այս պատահականորեն գեներացված բանալին՝ $1',
 'savedprefs' => 'Ձեր նախընտրությունները հիշված են։',
 'timezonelegend' => 'Ժամային գոտի.',
 'localtime' => 'Տեղական ժամանակ.',
@@ -1268,7 +1280,6 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'prefs-reset-intro' => 'Այս էջում հնաարավոր է զրոյացնել ձեր բոլոր նախընրանքները, փոխելով դրանք իլռելայն նախընտրանքների։
 Գործողությունը հաստատելուց հետո, նածընտրանքները հնաարվոր չի լինելու հետ բերել։',
 'prefs-emailconfirm-label' => 'Էլ-փոստի վավերացում․',
-'prefs-textboxsize' => 'Խմբագրման պատուհանի չափը',
 'youremail' => 'Էլեկտրոնային փոստ.',
 'username' => '{{GENDER:$1|Մասնակցի անուն}}՝',
 'uid' => 'Մասնակցի իդենտիֆիկատոր.',
@@ -1420,7 +1431,6 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'recentchangeslinked-feed' => 'Կապված փոփոխություններ',
 'recentchangeslinked-toolbox' => 'Կապված փոփոխություններ',
 'recentchangeslinked-title' => '«$1» էջին կապված փոփոխությունները',
-'recentchangeslinked-noresult' => 'Կապակցված էջերում նշված ժամանակաընթացքում փոփոխություններ չեն եղել։',
 'recentchangeslinked-summary' => "Այս սպասարկող էջում բերված են հղվող էջերում կատարված վերջին փոփոխությունները։ Ձեր հսկացանկի էջերը ներկայացված են '''թավատառ'''։",
 'recentchangeslinked-page' => 'Էջի անվանումը՝',
 'recentchangeslinked-to' => 'Հակառա՛կը. ցույց տալ այս էջին հղող էջերի փոփոխությունները։',
@@ -1625,12 +1635,6 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'statistics-users-active-desc' => 'Վերջին {{PLURAL:$1|օր|$1 օր}}ում որևէ գործողություն են կատարած մասնակիցներ',
 'statistics-mostpopular' => 'Ամենահաճախ դիտվող էջեր',
 
-'disambiguations' => 'Երկիմաստության փարատման էջեր',
-'disambiguationspage' => 'Template:Երկիմաստ',
-'disambiguations-text' => 'Հետևյալ էջերը հղում են երկիմաստության փարատման էջերին։
-Փոխարենը նրանք, հավանաբար, պետք է հղեն համապատասխան թեմային։<br />
-Էջը համարվում է երկիմաստության փարատման էջ, եթե այն պարունակում է [[MediaWiki:Disambiguationspage]] էջում ընդգրկված կաղապարներից որևէ մեկը։',
-
 'pageswithprop-submit' => 'Անցնել',
 
 'doubleredirects' => 'Կրկնակի վերահղումներ',
@@ -1819,10 +1823,9 @@ $1-ը հղվել է $2 ից',
 'unwatch' => 'Հանել հսկումից',
 'unwatchthispage' => 'Հանել հսկումից',
 'notanarticle' => 'Հոդված չէ',
-'watchnochange' => 'Ոչ մի հսկվող էջ չի փոփոխվել ցուցադրվող ժամանակահատվածում։',
 'watchlist-details' => 'Ձեր հսկացանկում կա {{PLURAL:$1|$1 էջ|$1 էջ}}` քննարկման էջերը չհաշված։',
-'wlheader-enotif' => '* Էլ-փոստով տեղեկացումը միացված է։',
-'wlheader-showupdated' => "* Էջերը, որոնք փոփոխվել են ձեր դրանց վերջին այցից հետո բերված են '''թավատառ'''։",
+'wlheader-enotif' => 'Էլ-փոստով տեղեկացումը միացված է։',
+'wlheader-showupdated' => "Էջերը, որոնք փոփոխվել են ձեր դրանց վերջին այցից հետո բերված են '''թավատառ'''։",
 'watchmethod-recent' => 'վերջին փոփոխությունները հսկվող էջերի համար',
 'watchmethod-list' => 'հսկվող էջերի վերջին փոփոխությունները',
 'watchlistcontains' => 'Ձեր հսկացանկում կա $1 {{PLURAL:$1|էջ|էջ}}։',
@@ -2160,7 +2163,6 @@ $1',
 'ip_range_invalid' => 'IP-հասցեների անթույլատրելի լայնույթ։',
 'proxyblocker' => 'Փոխանորդի արգելափակում',
 'proxyblockreason' => 'Ձեր IP-հասցեն արգելափակվել է, քանի որ այն պատկանում է հանրային միջնորդ (պրոքսի) սեռվերին։ Խնդրում ենք կապվել ձեր ցանցային կամ տեխնիկական ծառայության տրամադրողի հետ և տեղեկացնել այս լուրջ անվտանգության խնդրի մասին։',
-'proxyblocksuccess' => 'Արված է։',
 'sorbsreason' => 'Ձեր IP-հասցեն հաշվված է որպես ազատ օգտագործման փոխանորդ DNSBL ցանկում։',
 'sorbs_create_account_reason' => 'Ձեր IP-հասցեն հաշվված է որպես ազատ օգտագործման փոխանորդ DNSBL ցանկում։ Դուք չեք կարող ստեղծել մասնակցային հաշիվ։',
 'ipbnounblockself' => 'Դուք չեք կարող արգելափակել ինքներդ ձեզ',
@@ -2448,13 +2450,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'pageinfo-protect-cascading-yes' => 'Այո',
 
 # Skin names
-'skinname-standard' => 'Դասական',
-'skinname-nostalgia' => 'Հայրենաբաղձություն',
 'skinname-cologneblue' => 'Քյոլնի թախիծ',
 'skinname-monobook' => 'ՄիաԳիրք',
-'skinname-myskin' => 'ԻմՏեսք',
-'skinname-chick' => 'Ծիտ',
-'skinname-simple' => 'Պարզ',
 'skinname-modern' => 'Մոդերն',
 'skinname-vector' => 'Սովորական',
 
@@ -2550,7 +2547,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Լայնք',
 'exif-imagelength' => 'Բարձրություն',
 'exif-artist' => 'Հեղինակ',
@@ -2693,10 +2690,6 @@ $3
 # Special:Version
 'version' => 'ՄեդիաՎիքի տարբերակը',
 
-# Special:FilePath
-'filepath-page' => 'Նիշք՝',
-'filepath-submit' => 'Անցնել',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Փնտրել կրկնօրինակ պատկերներ',
 'fileduplicatesearch-summary' => 'Փնտրել կրկնօրինակ պատկերներ՝ հեշ արժեքների հիման վրա',
diff --git a/languages/messages/MessagesIa.php b/languages/messages/MessagesIa.php
index 6e545313..438d9a70 100644
--- a/languages/messages/MessagesIa.php
+++ b/languages/messages/MessagesIa.php
@@ -12,6 +12,7 @@
  * @author Kaganer
  * @author Malafaya
  * @author McDutchie
+ * @author Nemo bis
  * @author Reedy
  * @author Yfdyh000
  * @author לערי ריינהארט
@@ -173,9 +174,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Monstrar le numero de usatores que observa le pagina',
 'tog-oldsig' => 'Signatura existente:',
 'tog-fancysig' => 'Tractar signatura como wikitexto (sin ligamine automatic)',
-'tog-externaleditor' => 'Usar un editor externe qua standard (pro expertos solmente, necessita configuration special in tu computator. [//www.mediawiki.org/wiki/Manual:External_editors Plus informationes.])',
-'tog-externaldiff' => "Usar un programma ''diff'' externe qua standard (pro expertos solmente, necessita configuration special in tu computator. [//www.mediawiki.org/wiki/Manual:External_editors Plus informationes.])",
-'tog-showjumplinks' => 'Activar ligamines de accessibilitate "saltar a"',
 'tog-uselivepreview' => 'Usar previsualisation in directo (experimental)',
 'tog-forceeditsummary' => 'Avisar me si io non entra un summario de modification',
 'tog-watchlisthideown' => 'Celar mi proprie modificationes in le observatorio',
@@ -189,6 +187,8 @@ $messages = array(
 'tog-showhiddencats' => 'Monstrar categorias celate',
 'tog-noconvertlink' => 'Disactivar conversion de titulos de ligamines',
 'tog-norollbackdiff' => 'Omitter le diff post le execution de un revocation',
+'tog-useeditwarning' => 'Advertir me quando io quita un pagina de modification sin publicar le cambiamentos',
+'tog-prefershttps' => 'Sempre usar un connexion secur in session aperte',
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Nunquam',
@@ -252,6 +252,18 @@ $messages = array(
 'oct' => 'oct',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1 de januario',
+'february-date' => '$1 de februario���',
+'march-date' => '$1 de martio',
+'april-date' => '$1 de april',
+'may-date' => '$1 de maio',
+'june-date' => '$1 de junio',
+'july-date' => '$1 de julio',
+'august-date' => '$1 de augusto',
+'september-date' => '$1 de septembre',
+'october-date' => '$1 de octobre',
+'november-date' => '$1 de novembre',
+'december-date' => '$1 de decembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
@@ -333,6 +345,7 @@ $messages = array(
 'create-this-page' => 'Crear iste pagina',
 'delete' => 'Deler',
 'deletethispage' => 'Deler iste pagina',
+'undeletethispage' => 'Restaurar iste pagina',
 'undelete_short' => 'Restaurar {{PLURAL:$1|un modification|$1 modificationes}}',
 'viewdeleted_short' => 'Vider {{PLURAL:$1|un modification|$1 modificationes}} delite',
 'protect' => 'Proteger',
@@ -349,7 +362,7 @@ $messages = array(
 'articlepage' => 'Vider pagina de contento',
 'talk' => 'Discussion',
 'views' => 'Representationes',
-'toolbox' => 'Instrumentario',
+'toolbox' => 'Instrumentos',
 'userpage' => 'Vider pagina del usator',
 'projectpage' => 'Vider pagina de projecto',
 'imagepage' => 'Vider le pagina del file',
@@ -376,7 +389,7 @@ $1',
 'pool-queuefull' => 'Le cauda commun de processos es plen',
 'pool-errorunknown' => 'Error incognite',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'A proposito de {{SITENAME}}',
 'aboutpage' => 'Project:A proposito',
 'copyright' => 'Le contento es disponibile sub $1 si non alteremente specificate.',
@@ -386,7 +399,6 @@ $1',
 'disclaimers' => 'Declaration de non-responsabilitate',
 'disclaimerpage' => 'Project:Declaration general de non-responsabilitate',
 'edithelp' => 'Adjuta de modification',
-'edithelppage' => 'Help:Modification',
 'helppage' => 'Help:Contento',
 'mainpage' => 'Pagina principal',
 'mainpage-description' => 'Pagina principal',
@@ -463,17 +475,12 @@ Un lista de paginas special valide se trova a [[Special:SpecialPages|{{int:speci
 # General errors
 'error' => 'Error',
 'databaseerror' => 'Error del base de datos',
-'dberrortext' => 'Un error de syntaxe occurreva durante un consulta del base de datos.
-Isto pote indicar le presentia de un defecto in le software.
-Le ultime consulta que esseva tentate es:
-<blockquote><code>$1</code></blockquote>
-effectuate per le function "<code>$2</code>".
-Le base de datos retornava le error "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Un error de syntaxe occurreva durante un consulta del base de datos.
-Le ultime consulta que esseva tentate es:
-"$1"
-effectuate per le function "$2".
-Le base de datos retornava le error "$3: $4"',
+'databaseerror-text' => 'Un error ha occurrite in un consulta del base de datos.
+Isto pote indicar un defecto in le software.',
+'databaseerror-textcl' => 'Un error ha occurrite in un consulta del base de datos.',
+'databaseerror-query' => 'Consulta: $1',
+'databaseerror-function' => 'Function: $1',
+'databaseerror-error' => 'Error: $1',
 'laggedslavemode' => 'Attention: Es possibile que le pagina non contine actualisationes recente.',
 'readonly' => 'Base de datos blocate',
 'enterlockreason' => 'Describe le motivo del blocada, includente un estimation
@@ -508,6 +515,7 @@ Es possibile que un altere persona lo ha ja delite.',
 'cannotdelete-title' => 'Non pote deler le pagina "$1"',
 'delete-hook-aborted' => 'Le deletion ha essite abortate per un extension.
 Nulle explication es disponibile.',
+'no-null-revision' => 'Non ha potite crear un nove version vacue del le pagina "$1"',
 'badtitle' => 'Titulo invalide',
 'badtitletext' => 'Le titulo de pagina requestate es invalide, vacue, o un titulo interlingual o interwiki incorrectemente ligate.
 Es possibile que illo contine un o plure characteres que non pote esser usate in titulos.',
@@ -529,12 +537,15 @@ Per favor reprova post alcun minutas.',
 'editinginterface' => "'''Attention:''' Le texto de iste pagina face parte del interfacie pro le software.
 Omne modification a iste pagina cambiara le apparentia del interfacie pro altere usatores de iste wiki.
 Pro adder o modificar traductiones pro tote le wikis, per favor usa [//translatewiki.net/ translatewiki.net], le projecto de traduction de MediaWiki.",
-'sqlhidden' => '(Consulta SQL non monstrate)',
 'cascadeprotected' => 'Iste pagina ha essite protegite contra modificationes, proque illo es includite in le sequente {{PLURAL:$1|pagina, le qual|paginas, le quales}} es protegite usante le option "cascada":
 $2',
 'namespaceprotected' => "Tu non ha le permission de modificar paginas in le spatio de nomines '''$1'''.",
 'customcssprotected' => 'Tu non ha le permission de modificar iste pagina de CSS perque illo contine le configuration personal de un altere usator.',
 'customjsprotected' => 'Tu non ha le permission de modificar iste pagina de JavaScript perque illo contine le configuration personal de un altere usator.',
+'mycustomcssprotected' => 'Tu non ha le permission de modificar iste pagina de CSS.',
+'mycustomjsprotected' => 'Tu non ha le permission de modificar iste pagina de JavaScript.',
+'myprivateinfoprotected' => 'Tu non ha le permission de modificar le proprie information private.',
+'mypreferencesprotected' => 'Tu non ha le permission de modificar le proprie preferentias.',
 'ns-specialprotected' => 'Le paginas special non es modificabile.',
 'titleprotected' => "Iste titulo ha essite protegite contra creation per [[User:$1|$1]].
 Le motivo specificate es ''$2''.",
@@ -559,10 +570,19 @@ Nota que alcun paginas pote continuar a apparer como si tu esserea ancora authen
 'welcomecreation-msg' => 'Tu conto ha essite create.
 Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].',
 'yourname' => 'Nomine de usator:',
+'userlogin-yourname' => 'Nomine de usator',
+'userlogin-yourname-ph' => 'Entra tu nomine de usator',
+'createacct-another-username-ph' => 'Entra le nomine de usator',
 'yourpassword' => 'Contrasigno:',
+'userlogin-yourpassword' => 'Contrasigno',
+'userlogin-yourpassword-ph' => 'Entra tu contrasigno',
+'createacct-yourpassword-ph' => 'Entra un contrasigno',
 'yourpasswordagain' => 'Repete contrasigno:',
+'createacct-yourpasswordagain' => 'Confirma contrasigno',
+'createacct-yourpasswordagain-ph' => 'Repete le contrasigno',
 'remembermypassword' => 'Memorar mi contrasigno in iste navigator (pro un maximo de $1 {{PLURAL:$1|die|dies}})',
-'securelogin-stick-https' => 'Remaner connectite via HTTPS post apertura de session',
+'userlogin-remembermypassword' => 'Mantener mi session aperte',
+'userlogin-signwithsecure' => 'Usar un connexion secur',
 'yourdomainname' => 'Tu dominio:',
 'password-change-forbidden' => 'Non es possibile cambiar le contrasigno in iste wiki.',
 'externaldberror' => 'O il occurreva un error in le base de datos de authentication, o tu non ha le autorisation de actualisar tu conto externe.',
@@ -574,18 +594,44 @@ Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].
 'logout' => 'Clauder session',
 'userlogout' => 'Clauder session',
 'notloggedin' => 'Tu non ha aperite un session',
+'userlogin-noaccount' => 'Non ha un conto?',
+'userlogin-joinproject' => 'Crear un conto in {{SITENAME}}',
 'nologin' => 'Tu non ha un conto? $1.',
 'nologinlink' => 'Crear un conto',
 'createaccount' => 'Crear conto',
 'gotaccount' => "Tu jam ha un conto? '''$1'''.",
 'gotaccountlink' => 'Aperir session',
 'userlogin-resetlink' => 'Datos de authentication oblidate?',
+'userlogin-resetpassword-link' => 'Reinitialisar contrasigno',
+'helplogin-url' => 'Help:Aperir session',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Adjuta a aperir session]]',
+'userlogin-loggedin' => 'Tu ha jam aperite session como {{GENDER:$1|$1}}.
+Usa le formulario sequente pro aperir session como altere usator.',
+'userlogin-createanother' => 'Crear un altere conto',
+'createacct-join' => 'Specifica tu information hic infra.',
+'createacct-another-join' => 'Specifica le informationes del nove conto ci infra.',
+'createacct-emailrequired' => 'Adresse de e-mail',
+'createacct-emailoptional' => 'Adresse de e-mail (optional)',
+'createacct-email-ph' => 'Entra tu adresse de e-mail',
+'createacct-another-email-ph' => 'Entra adresse de e-mail',
 'createaccountmail' => 'Usar un contrasigno aleatori temporari e inviar lo al adresse de e-mail specificate',
+'createacct-realname' => 'Nomine real (optional)',
 'createaccountreason' => 'Motivo:',
+'createacct-reason' => 'Motivo',
+'createacct-reason-ph' => 'Proque crea tu un altere conto?',
+'createacct-captcha' => 'Controlo de securitate',
+'createacct-imgcaptcha-ph' => 'Scribe le texto que tu vide hic supra',
+'createacct-submit' => 'Crear tu conto',
+'createacct-another-submit' => 'Crear un altere conto',
+'createacct-benefit-heading' => '{{SITENAME}} es facite per gente como tu.',
+'createacct-benefit-body1' => '{{PLURAL:$1|modification|modificationes}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pagina|paginas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributor|contributores}} recente',
 'badretype' => 'Le duo contrasignos que tu scribeva non es identic.',
 'userexists' => 'Iste nomine de usator es jam in uso.
 Selige un altere nomine.',
 'loginerror' => 'Error in le apertura del session',
+'createacct-error' => 'Error de creation de conto',
 'createaccounterror' => 'Non poteva crear le conto: $1',
 'nocookiesnew' => "Le conto de usator ha essite create, sed tu non ha aperite un session.
 {{SITENAME}} usa ''cookies'' pro mantener le sessiones del usatores.
@@ -652,11 +698,13 @@ Tu deberea aperir un session e cambiar tu contrasigno ora.
 
 Tu pote ignorar iste message si iste conto ha essite create in error.',
 'usernamehasherror' => 'Le nomine de usator non pote continer grillias/cardinales/signos de numero ("#")',
-'login-throttled' => 'Tu ha facite troppo de tentativas de identification.
-Per favor attende ante de probar lo novemente.',
+'login-throttled' => 'Tu ha facite troppo de tentativas de aperir session.
+Per favor attende $1 ante de probar lo novemente.',
 'login-abort-generic' => 'Apertura de session non succedite - Abortate',
 'loginlanguagelabel' => 'Lingua: $1',
 'suspicious-userlogout' => 'Le requesta de clauder le session ha essite refusate proque illo pare haber essite inviate per un navigator o proxy de cache defectuose.',
+'createacct-another-realname-tip' => 'Le nomine real es optional.
+Si tu opta pro dar lo, isto essera usate pro dar al usator attribution pro su contributiones.',
 
 # Email sending
 'php-mail-error-unknown' => 'Error incognite in le function mail() de PHP',
@@ -673,8 +721,7 @@ Pro completar le accesso, tu debe definir un nove contrasigno hic:',
 'newpassword' => 'Nove contrasigno:',
 'retypenew' => 'Repete le nove contrasigno:',
 'resetpass_submit' => 'Definir contrasigno e aperir un session',
-'resetpass_success' => 'Tu contrasigno ha essite cambiate correctemente!
-Ora, apertura de session in progresso…',
+'changepassword-success' => 'Tu contrasigno ha essite cambiate!',
 'resetpass_forbidden' => 'Le contrasignos non pote esser cambiate',
 'resetpass-no-info' => 'Tu debe aperir un session pro poter acceder directemente a iste pagina.',
 'resetpass-submit-loggedin' => 'Cambiar contrasigno',
@@ -686,10 +733,11 @@ Es possibile que tu ha ja cambiate tu contrasigno o requestate un nove contrasig
 
 # Special:PasswordReset
 'passwordreset' => 'Reinitialisar contrasigno',
-'passwordreset-text' => 'Completa iste formulario pro reinitialisar tu contrasigno.',
+'passwordreset-text-one' => 'Completa iste formulario pro reinitialisar tu contrasigno.',
+'passwordreset-text-many' => '{{PLURAL:$1|Completa un de iste campos pro reinitialisar tu contrasigno.}}',
 'passwordreset-legend' => 'Reinitialisar contrasigno',
 'passwordreset-disabled' => 'Le reinitialisation de contrasignos ha essite disactivate in iste wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Entra un del elementos de datos hic infra}}',
+'passwordreset-emaildisabled' => 'Le functionalitate de e-mail ha essite disactivate in iste wiki.',
 'passwordreset-username' => 'Nomine de usator:',
 'passwordreset-domain' => 'Dominio:',
 'passwordreset-capture' => 'Vider le e-mail resultante?',
@@ -721,7 +769,7 @@ contrasigno.',
 Contrasigno temporari: $2',
 'passwordreset-emailsent' => 'Un message de e-mail pro le reinitialisation del contrasigno ha essite inviate.',
 'passwordreset-emailsent-capture' => 'Un message de e-mail pro le reinitialisation del contrasigno ha essite inviate; iste message es monstrate hic infra.',
-'passwordreset-emailerror-capture' => 'Un e-mail de rememoration ha essite generate; iste message es monstrate hic infra, ma le invio al usator ha fallite: $1',
+'passwordreset-emailerror-capture' => 'Un e-mail pro le reinitialisation del contrasigno ha essite generate; iste message es monstrate hic infra, ma le invio al {{GENDER:$2|usator}} ha fallite: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Cambiar adresse de e-mail',
@@ -735,6 +783,19 @@ Contrasigno temporari: $2',
 'changeemail-submit' => 'Cambiar e-mail',
 'changeemail-cancel' => 'Cancellar',
 
+# Special:ResetTokens
+'resettokens' => 'Reinitialisar indicios',
+'resettokens-text' => 'Hic tu pote reinitialisar le indicios que permitte le accesso a certe datos private associate a tu conto.
+
+Tu deberea facer lo si tu los ha accidentalmente dividite con un altere persona o si tu conto ha essite compromittite.',
+'resettokens-no-tokens' => 'Il non ha indicios a reinitialisar.',
+'resettokens-legend' => 'Reinitialisar indicios',
+'resettokens-tokens' => 'Indicios:',
+'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => 'Indicio pro syndication web (Atom/RSS) de [[Special:Watchlist|modificationes a paginas in tu observatorio]]',
+'resettokens-done' => 'Indicios reinitialisate.',
+'resettokens-resetbutton' => 'Reinitialisar le indicios seligite',
+
 # Edit page toolbar
 'bold_sample' => 'Texto grasse',
 'bold_tip' => 'Texto grasse',
@@ -940,12 +1001,15 @@ Nulle explication disponibile.',
 Pare que illo ha essite delite.',
 'edit-conflict' => 'Conflicto inter modificationes.',
 'edit-no-change' => 'Tu modification ha essite ignorate, proque nulle cambio esseva facite in le texto.',
+'postedit-confirmation' => 'Tu modification ha essite salveguardate.',
 'edit-already-exists' => 'Non poteva crear un nove pagina.
 Illo existe ja.',
 'defaultmessagetext' => 'Texto predefinite del message',
 'content-failed-to-parse' => 'Impossibile processar le contento $2 pro le modello $1: $3',
 'invalid-content-data' => 'Datos de contento invalide',
 'content-not-allowed-here' => 'Le contento "$1" non es permittite in le pagina [[$2]]',
+'editwarning-warning' => 'Quitar iste pagina pote causar le perdita de omne modificationes que tu ha facite.
+Si tu ha aperite un session, tu pote disactivar iste aviso in le section "Modification" de tu preferentias.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -981,6 +1045,7 @@ Per favor controla le comparation infra pro verificar que tu vole facer isto, e
 'undo-failure' => 'Le modification non poteva esser annullate a causa de conflicto con modificationes intermedie.',
 'undo-norev' => 'Impossibile annullar le modification proque illo non existe o esseva delite.',
 'undo-summary' => 'Annullava le version $1 per [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])',
+'undo-summary-username-hidden' => 'Disfacer le revision $1 facite per un usator celate',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Non pote crear conto',
@@ -1164,6 +1229,7 @@ Nota que le uso del ligamines de navigation causara le perdita de tote cambios i
 'compareselectedversions' => 'Comparar versiones seligite',
 'showhideselectedversions' => 'Revelar/celar le versiones seligite',
 'editundo' => 'disfacer',
+'diff-empty' => '(Nulle differentia)',
 'diff-multi' => '({{PLURAL:$1|Un version intermedie|$1 versiones intermedie}} facite per {{PLURAL:$2|un usator|$2 usatores}} non es monstrate)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Un version intermedie|$1 versiones intermedie}} facite per plus de $2 {{PLURAL:$2|usator|usatores}} non es monstrate)',
 'difference-missing-revision' => '{{PLURAL:$2|Un version|$2 versiones}} de iste differentia ($1) non ha essite trovate.
@@ -1191,7 +1257,6 @@ Detalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'searchmenu-legend' => 'Optiones de recerca',
 'searchmenu-exists' => "'''Existe un pagina nominate \"[[\$1]]\" in iste wiki'''",
 'searchmenu-new' => "'''Crea le pagina \"[[:\$1]]\" in iste wiki!'''",
-'searchhelp-url' => 'Help:Contento',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navigar per le paginas con iste prefixo]]',
 'searchprofile-articles' => 'Paginas de contento',
 'searchprofile-project' => 'Paginas de adjuta e del projecto',
@@ -1235,15 +1300,7 @@ Tenta prefixar tu consulta con ''all:'' pro cercar in tote le contento (includen
 'searchdisabled' => 'Le recerca in {{SITENAME}} es disactivate.
 Tu pote cercar via Google in le interim.
 Nota que lor indices del contento de {{SITENAME}} pote esser obsolete.',
-
-# Quickbar
-'qbsettings' => 'Barra rapide',
-'qbsettings-none' => 'Necun',
-'qbsettings-fixedleft' => 'Fixe a sinistra',
-'qbsettings-fixedright' => 'Fixe a dextra',
-'qbsettings-floatingleft' => 'Flottante a sinistra',
-'qbsettings-floatingright' => 'Flottante a dextra',
-'qbsettings-directionality' => 'Fixe, dependente del direction de scriptura de tu lingua',
+'search-error' => 'Un error ha occurrite durante le recerca: $1',
 
 # Preferences page
 'preferences' => 'Preferentias',
@@ -1277,7 +1334,6 @@ Nota que lor indices del contento de {{SITENAME}} pote esser obsolete.',
 'resetprefs' => 'Reverter cambios',
 'restoreprefs' => 'Restaurar tote le preselectiones (in tote le sectiones)',
 'prefs-editing' => 'Modification',
-'prefs-edit-boxsize' => 'Dimensiones del fenestra de modification.',
 'rows' => 'Lineas:',
 'columns' => 'Columnas:',
 'searchresultshead' => 'Recerca',
@@ -1288,9 +1344,9 @@ Nota que lor indices del contento de {{SITENAME}} pote esser obsolete.',
 'recentchangesdays-max' => '(non plus de $1 {{PLURAL:$1|die|dies}})',
 'recentchangescount' => 'Numero de modificationes a monstrar per predefinition:',
 'prefs-help-recentchangescount' => 'Isto include modificationes recente, historias de paginas, e registros.',
-'prefs-help-watchlist-token' => 'Le insertion de un clave secrete in iste campo generara un syndication RSS de tu observatorio.
-Omnes persona cognoscente le clave in iste campo potera leger tu observatorio. Selige ergo un valor secur!
-Ecce un valor aleatorimente generate que tu pote usar: $1',
+'prefs-help-watchlist-token2' => 'Isto es le clave secrete pro le syndication web de tu observatorio.
+Omne persona qui lo cognosce pote leger tu observatorio, dunque, non divide lo.
+[[Special:ResetTokens|Clicca hic pro reinitialisar lo]].',
 'savedprefs' => 'Tu preferentias ha essite confirmate.',
 'timezonelegend' => 'Fuso horari:',
 'localtime' => 'Hora local:',
@@ -1321,7 +1377,6 @@ Ecce un valor aleatorimente generate que tu pote usar: $1',
 'prefs-reset-intro' => 'Iste pagina es pro reinitialisar tu preferentias al valores predefinite del sito.
 Le operation non pote esser disfacite.',
 'prefs-emailconfirm-label' => 'Confirmation del e-mail:',
-'prefs-textboxsize' => 'Dimension del fenestra de modification',
 'youremail' => 'E-mail:',
 'username' => '{{GENDER:$1|Nomine de usator}}:',
 'uid' => 'ID del {{GENDER:$1|usator}}:',
@@ -1355,6 +1410,8 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'prefs-dateformat' => 'Formato de data',
 'prefs-timeoffset' => 'Differentia de tempore',
 'prefs-advancedediting' => 'Optiones general',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Previsualisation',
 'prefs-advancedrc' => 'Optiones avantiate',
 'prefs-advancedrendering' => 'Optiones avantiate',
 'prefs-advancedsearchoptions' => 'Optiones avantiate',
@@ -1362,7 +1419,9 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'prefs-displayrc' => 'Optiones de presentation',
 'prefs-displaysearchoptions' => 'Optiones de presentation',
 'prefs-displaywatchlist' => 'Optiones de presentation',
+'prefs-tokenwatchlist' => 'Indicio',
 'prefs-diffs' => 'Differentias',
+'prefs-help-prefershttps' => 'Iste preferentia habera effecto a partir de tu proxime session.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Sembla valide',
@@ -1389,6 +1448,8 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'userrights-notallowed' => 'Tu non ha le permission de adder o remover derectos de usator.',
 'userrights-changeable-col' => 'Gruppos que tu pote modificar',
 'userrights-unchangeable-col' => 'Gruppos que tu non pote modificar',
+'userrights-conflict' => 'Conflicto inter cambiamentos de derectos de usator! Per favor revide e confirma tu cambiamentos.',
+'userrights-removed-self' => 'Tu ha removite con successo tu proprie derectos. In consequentia, tu non plus pote acceder a iste pagina.',
 
 # Groups
 'group' => 'Gruppo:',
@@ -1454,11 +1515,19 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'right-proxyunbannable' => 'Contornar le blocadas automatic de proxy',
 'right-unblockself' => 'Disblocar se mesme',
 'right-protect' => 'Cambiar nivellos de protection e modificar paginas protegite in cascada',
-'right-editprotected' => 'Modificar paginas protegite (sin cascada)',
+'right-editprotected' => 'Modificar paginas protegite con "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Modificar paginas protegite como "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Modificar le interfacie de usator',
 'right-editusercssjs' => 'Modificar le files CSS e JS de altere usatores',
 'right-editusercss' => 'Modificar le files CSS de altere usatores',
 'right-edituserjs' => 'Modificar le files JS de altere usatores',
+'right-editmyusercss' => 'Modificar le proprie files CSS de usator',
+'right-editmyuserjs' => 'Modificar le proprie files JavaScript de usator',
+'right-viewmywatchlist' => 'Vider le proprie observatorio',
+'right-editmywatchlist' => 'Modificar le proprie observatorio. Remarca que alcun actiones totevia adde paginas mesmo sin iste derecto.',
+'right-viewmyprivateinfo' => 'Vider le proprie datos private (p.ex. adresse de e-mail, nomine real)',
+'right-editmyprivateinfo' => 'Modificar le proprie datos private (p.ex. adresse de e-mail, nomine real)',
+'right-editmyoptions' => 'Modificar le proprie preferentias',
 'right-rollback' => 'Rapidemente revocar le modificationes del ultime usator que modificava un pagina particular',
 'right-markbotedits' => 'Marcar modificationes de reversion como facite per un bot',
 'right-noratelimit' => 'Non esser subjecte al limites de frequentia de actiones',
@@ -1520,12 +1589,19 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'action-userrights-interwiki' => 'modificar le derectos de usatores in altere wikis',
 'action-siteadmin' => 'blocar e disblocar le base de datos',
 'action-sendemail' => 'inviar e-mail',
+'action-editmywatchlist' => 'modificar le proprie observatorio',
+'action-viewmywatchlist' => 'vider le proprie observatorio',
+'action-viewmyprivateinfo' => 'vider le proprie information private',
+'action-editmyprivateinfo' => 'modificar le proprie information private',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|modification|modificationes}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|desde le ultime visita}}',
+'enhancedrc-history' => 'historia',
 'recentchanges' => 'Modificationes recente',
 'recentchanges-legend' => 'Optiones del modificationes recente',
 'recentchanges-summary' => 'Seque le plus recente modificationes a {{SITENAME}} in iste pagina.',
+'recentchanges-noresult' => 'Nulle modification facite in le periodo specificate que corresponde a iste criterios.',
 'recentchanges-feed-description' => 'Seque le modificationes le plus recente al wiki in iste syndication.',
 'recentchanges-label-newpage' => 'Iste modification creava un nove pagina',
 'recentchanges-label-minor' => 'Isto es un modification minor',
@@ -1562,7 +1638,6 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'recentchangeslinked-feed' => 'Modificationes ligate',
 'recentchangeslinked-toolbox' => 'Modificationes ligate',
 'recentchangeslinked-title' => 'Modificationes associate a "$1"',
-'recentchangeslinked-noresult' => 'Nulle modificationes in paginas ligate durante iste periodo.',
 'recentchangeslinked-summary' => "Isto es un lista de modificationes facite recentemente in paginas ligate ab un pagina specific (o in membros de un categoria specific).
 Le paginas presente in [[Special:Watchlist|tu observatorio]] appare in litteras '''grasse'''.",
 'recentchangeslinked-page' => 'Nomine del pagina:',
@@ -1574,7 +1649,7 @@ Le paginas presente in [[Special:Watchlist|tu observatorio]] appare in litteras
 'reuploaddesc' => 'Cancellar e retornar al formulario de incargamento',
 'upload-tryagain' => 'Submitter description modificate del file',
 'uploadnologin' => 'Tu non ha aperite un session',
-'uploadnologintext' => 'Tu debe [[Special:UserLogin|aperir un session]] pro poter incargar files.',
+'uploadnologintext' => 'Tu debe $1 pro poter incargar files.',
 'upload_directory_missing' => 'Le directorio de incargamento ($1) manca, e le servitor de web non poteva crear lo.',
 'upload_directory_read_only' => 'Le servitor web non ha le permission de scriber in le directorio de incargamento ($1).',
 'uploaderror' => 'Error de incargamento',
@@ -1808,7 +1883,6 @@ Pro securitate optimal, img_auth.php es disactivate.',
 'http-read-error' => 'Error de lectura HTTP.',
 'http-timed-out' => 'Le requesta HTTP ha expirate.',
 'http-curl-error' => 'Error al obtener datos del URL: $1',
-'http-host-unreachable' => 'Non poteva acceder al URL',
 'http-bad-status' => 'Un problema occurreva durante le requesta HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1839,6 +1913,10 @@ Pote esser preferite reprovar quando le sito es minus occupate.',
 'listfiles_size' => 'Grandor',
 'listfiles_description' => 'Description',
 'listfiles_count' => 'Versiones',
+'listfiles-show-all' => 'Includer ancian versiones de imagines',
+'listfiles-latestversion' => 'Version actual',
+'listfiles-latestversion-yes' => 'Si',
+'listfiles-latestversion-no' => 'No',
 
 # File description page
 'file-anchor-link' => 'File',
@@ -1935,6 +2013,13 @@ Memora verificar que non existe altere ligamines al patronos ante que tu los del
 'randompage' => 'Pagina aleatori',
 'randompage-nopages' => 'Il non ha paginas in le sequente {{PLURAL:$2|spatio|spatios}} de nomines: $1.',
 
+# Random page in category
+'randomincategory' => 'Pagina aleatori in categoria',
+'randomincategory-invalidcategory' => '"$1" non es un nomine de categoria valide.',
+'randomincategory-nopages' => 'Il non ha paginas in [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Prender un pagina qualcunque del categoria: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Va',
+
 # Random redirect
 'randomredirect' => 'Redirection aleatori',
 'randomredirect-nopages' => 'Il non ha redirectiones in le spatio de nomines "$1".',
@@ -1960,18 +2045,13 @@ Memora verificar que non existe altere ligamines al patronos ante que tu los del
 'statistics-users-active-desc' => 'Usatores qui ha facite un action durante le {{PLURAL:$1|die|$1 dies}} passate',
 'statistics-mostpopular' => 'Le paginas plus visitate',
 
-'disambiguations' => 'Paginas con ligamines a paginas de disambiguation',
-'disambiguationspage' => 'Template:Disambig
-Template:Disambiguation',
-'disambiguations-text' => "Le sequente paginas contine al minus un ligamine a un '''pagina de disambiguation'''.
-Istes debe forsan ligar directemente al articulo sur le thema in question.<br />
-Un pagina se tracta como pagina de disambiguation si illo usa un patrono que es ligate ab [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Paginas con un proprietate de pagina',
 'pageswithprop-legend' => 'Paginas con un proprietate de pagina',
 'pageswithprop-text' => 'Iste pagina lista le paginas que usa un certe proprietate de pagina.',
 'pageswithprop-prop' => 'Nomine del proprietate:',
 'pageswithprop-submit' => 'Va',
+'pageswithprop-prophidden-long' => 'valor de proprietate de texto longe celate ($1)',
+'pageswithprop-prophidden-binary' => 'valor de proprietate binari celate ($1)',
 
 'doubleredirects' => 'Redirectiones duple',
 'doubleredirectstext' => 'Iste pagina lista paginas de redirection verso altere paginas de redirection.
@@ -2029,6 +2109,7 @@ Le entratas <del>cancellate</del> ha essite resolvite.',
 'mostrevisions' => 'Paginas le plus modificate',
 'prefixindex' => 'Tote le paginas con prefixo',
 'prefixindex-namespace' => 'Tote le paginas con prefixo (spatio de nomines $1)',
+'prefixindex-strip' => 'Remover prefixo in lista',
 'shortpages' => 'Paginas curte',
 'longpages' => 'Paginas longe',
 'deadendpages' => 'Paginas sin exito',
@@ -2044,6 +2125,7 @@ Le entratas <del>cancellate</del> ha essite resolvite.',
 'listusers' => 'Lista de usatores',
 'listusers-editsonly' => 'Monstrar solmente usatores con modificationes',
 'listusers-creationsort' => 'Ordinar per data de creation',
+'listusers-desc' => 'Ordinar in senso descendente',
 'usereditcount' => '$1 {{PLURAL:$1|modification|modificationes}}',
 'usercreated' => '{{GENDER:$3|Create}} le $1 a $2',
 'newpages' => 'Nove paginas',
@@ -2225,10 +2307,9 @@ Le modificationes futur in iste pagina e in le pagina de discussion associate es
 'unwatchthispage' => 'Disobservar',
 'notanarticle' => 'Non es un articulo',
 'notvisiblerev' => 'Le version ha essite delite',
-'watchnochange' => 'Nulle articulo que tu observa esseva modificate durante le periodo de tempore indicate.',
 'watchlist-details' => '{{PLURAL:$1|$1 pagina|$1 paginas}} es in tu observatorio, sin contar le paginas de discussion.',
-'wlheader-enotif' => '* Le notificationes via e-mail es active.',
-'wlheader-showupdated' => "* Le paginas que ha essite modificate post tu ultime visita se monstra in litteras '''grasse'''",
+'wlheader-enotif' => 'Le notification via e-mail es active.',
+'wlheader-showupdated' => "Le paginas que ha essite modificate post tu ultime visita se monstra in litteras '''grasse'''.",
 'watchmethod-recent' => 'cerca paginas sub observation in modificationes recente',
 'watchmethod-list' => 'cerca modificationes recente in paginas sub observation',
 'watchlistcontains' => 'Tu observatorio contine $1 {{PLURAL:$1|pagina|paginas}}.',
@@ -2311,10 +2392,12 @@ Tote le horas es in le fuso horari del servitor.',
 'deletecomment' => 'Motivo:',
 'deleteotherreason' => 'Motivo altere/additional:',
 'deletereasonotherlist' => 'Altere motivo',
-'deletereason-dropdown' => '*Motivos habitual pro deler paginas
-** Requesta del autor
+'deletereason-dropdown' => '*Motivos commun pro deler
+** Spam
+** Vandalismo
 ** Violation de copyright
-** Vandalismo',
+** Requesta del autor
+** Redirection rupte',
 'delete-edit-reasonlist' => 'Modificar le motivos pro deletion',
 'delete-toobig' => 'Iste pagina ha un grande historia de modificationes con plus de $1 {{PLURAL:$1|version|versiones}}.
 Le deletion de tal paginas ha essite restringite pro impedir le disruption accidental de {{SITENAME}}.',
@@ -2484,7 +2567,7 @@ $1',
 'contributions' => 'Contributiones del {{GENDER:$1|usator}}',
 'contributions-title' => 'Contributiones del usator $1',
 'mycontris' => 'Contributiones',
-'contribsub2' => 'Pro $1 ($2)',
+'contribsub2' => 'Pro {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Necun modification ha essite trovate secundo iste criterios.',
 'uctop' => '(ultime)',
 'month' => 'A partir del mense (e anterior):',
@@ -2644,15 +2727,13 @@ Vide le [[Special:BlockList|lista de blocadas]] pro le lista de bannimentos e bl
 Illo es, nonobstante, blocate como parte del intervallo $2, le qual pote esser disblocate.',
 'ip_range_invalid' => 'Intervallo de adresses IP invalide.',
 'ip_range_toolarge' => 'Non es permittite blocar un gamma de adresses IP plus grande que /$1.',
-'blockme' => 'Blocar me',
 'proxyblocker' => 'Blocator de proxy',
-'proxyblocker-disabled' => 'Iste function es disactivate.',
 'proxyblockreason' => 'Tu adresse IP ha essite blocate proque illo es un proxy aperte.
 Per favor contacta tu providitor de servicio internet o supporto technic e informa les de iste problema grave de securitate.',
-'proxyblocksuccess' => 'Succedite.',
 'sorbsreason' => 'Tu adresse IP es listate como proxy aperte in le DNSBL usate per {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Tu adresse IP es listate como proxy aperte in le DNSBL usate per {{SITENAME}}.
 Tu non pote crear un conto',
+'xffblockreason' => 'Un adresse IP presente in le capite X-Forwarded-For, o le tue o illo de un servitor proxy que tu usa, ha essite blocate. Le motivo original pro le blocada es: $1',
 'cant-block-while-blocked' => 'Tu non pote blocar altere usatores durante que tu mesme es blocate.',
 'cant-see-hidden-user' => 'Le usator que tu tenta blocar ha ja essite blocate e celate. Post que tu non ha le derecto hideuser, tu non pote vider o modificar le blocada del usator.',
 'ipbblocked' => 'Tu non pote blocar o disblocar altere usatores, proque tu mesme es blocate',
@@ -2821,6 +2902,8 @@ Per favor visita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
 'thumbnail-more' => 'Aggrandir',
 'filemissing' => 'File manca',
 'thumbnail_error' => 'Error durante le creation del miniatura: $1',
+'thumbnail_error_remote' => 'Message de error ab $1:
+$2',
 'djvu_page_error' => 'Pagina DjVu foras de limite',
 'djvu_no_xml' => 'Impossibile obtener XML pro file DjVu',
 'thumbnail-temp-create' => 'Impossibile crear un file temporari de miniatura',
@@ -2971,27 +3054,16 @@ Es possibile adder un motivo in le summario.',
 
 # Stylesheets
 'common.css' => '/* Le CSS placiate hic se applicara a tote le stilos */',
-'standard.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Classic */',
-'nostalgia.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Nostalgia */',
 'cologneblue.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Colonia Blau */',
 'monobook.css' => '/* Le CSS placiate hic afficera le usatores del apparentia MonoBook */',
-'myskin.css' => '/* Le CSS placiate hic afficera le usatores del apparentia "Mi apparentia" */',
-'chick.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Chique */',
-'simple.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Simple */',
 'modern.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Moderne */',
 'vector.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Vector */',
 'print.css' => '/* Le CSS placiate hic influentiara le apparentia del paginas imprimite */',
-'handheld.css' => '/* Le CSS placiate hic afficera le apparatos mobile basate super le apparentia configurate in $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Omne JavaScript hic se executara pro tote le usatores a cata cargamento de pagina. */',
-'standard.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Classic */',
-'nostalgia.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Nostalgia */',
 'cologneblue.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Colonia Blau */',
 'monobook.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia MonoBook */',
-'myskin.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia "Mi apparentia" */',
-'chick.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Chique */',
-'simple.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Simple */',
 'modern.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Moderne */',
 'vector.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Vector */',
 
@@ -3067,13 +3139,8 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 'pageinfo-category-files' => 'Numero de files',
 
 # Skin names
-'skinname-standard' => 'Classic',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Colonia Blau',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Mi apparentia',
-'skinname-chick' => 'Chique',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Moderne',
 
 # Patrolling
@@ -3151,11 +3218,25 @@ Le execution de illo pote compromitter le securitate de tu systema.",
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minutas}}',
 'hours' => '{{PLURAL:$1|$1 hora|$1 horas}}',
 'days' => '{{PLURAL:$1|$1 die|$1 dies}}',
+'weeks' => '$1 {{PLURAL:$1|septimana|septimanas}}',
 'months' => '{{PLURAL:$1|$1 mense|$1 menses}}',
 'years' => '{{PLURAL:$1|$1 anno|$1 annos}}',
 'ago' => '$1 retro',
 'just-now' => 'Justo nunc',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|hora|horas}} retro',
+'minutes-ago' => '$1 {{PLURAL:$1|minuta|minutas}} retro',
+'seconds-ago' => '$1 {{PLURAL:$1|secunda|secundas}} retro',
+'monday-at' => 'Lunedi a $1',
+'tuesday-at' => 'Martedi a $1',
+'wednesday-at' => 'Mercuridi a $1',
+'thursday-at' => 'Jovedi a $1',
+'friday-at' => 'Venerdi a $1',
+'saturday-at' => 'Sabbato a $1',
+'sunday-at' => 'Dominica a $1',
+'yesterday-at' => 'Heri a $1',
+
 # Bad image list
 'bad_image_list' => 'Le formato es como seque:
 
@@ -3185,7 +3266,7 @@ Le alteres essera initialmente celate.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Latitude',
 'exif-imagelength' => 'Altitude',
 'exif-bitspersample' => 'Bits per componente',
@@ -3363,7 +3444,7 @@ Le alteres essera initialmente celate.
 'exif-originalimageheight' => 'Altitude del imagine ante taliar',
 'exif-originalimagewidth' => 'Latitude del imagine ante taliar',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Non comprimite',
 'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
 'exif-compression-3' => 'CCITT Group 3 codification fax',
@@ -3758,7 +3839,6 @@ Tu pote etiam [[Special:EditWatchlist|usar le editor standard]].',
 'version-other' => 'Altere',
 'version-mediahandlers' => 'Executores de media',
 'version-hooks' => 'Uncinos',
-'version-extension-functions' => 'Functiones de extensiones',
 'version-parser-extensiontags' => 'Etiquettas de extension del analysator syntactic',
 'version-parser-function-hooks' => 'Uncinos de functiones del analysator syntactic',
 'version-hook-name' => 'Nomine del uncino',
@@ -3767,6 +3847,7 @@ Tu pote etiam [[Special:EditWatchlist|usar le editor standard]].',
 'version-license' => 'Licentia',
 'version-poweredby-credits' => "Iste wiki es actionate per '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'alteres',
+'version-poweredby-translators' => 'Traductores de translatewiki.net',
 'version-credits-summary' => 'Nos vole recognoscer le sequente personas pro lor contribution a [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki es software libere; vos pote redistribuer lo e/o modificar lo sub le conditiones del Licentia Public General de GNU publicate per le Free Software Foundation; version 2 del Licentia, o (a vostre option) qualcunque version posterior.
 
@@ -3782,12 +3863,17 @@ Vos deberea haber recipite [{{SERVER}}{{SCRIPTPATH}}/COPYING un exemplar del Lic
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Cammino al articulo]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Cammino al script]',
 
-# Special:FilePath
-'filepath' => 'Cammino del file',
-'filepath-page' => 'File:',
-'filepath-submit' => 'Va',
-'filepath-summary' => 'Iste pagina special retorna le cammino complete de un file.
-Le imagines se monstra in plen resolution, le altere typos de file se executa directemente con lor programmas associate.',
+# Special:Redirect
+'redirect' => 'Rediriger per nomine de file, ID de usator o ID de version',
+'redirect-legend' => 'Rediriger a un file o pagina',
+'redirect-summary' => 'Iste pagina special redirige a un file (si es date le nomine de un file), a un pagina (si es date un ID de version) o a un pagina de usator (si es date un ID de usator numeric).',
+'redirect-submit' => 'Va',
+'redirect-lookup' => 'Cercar:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'ID de usator',
+'redirect-revision' => 'Version de pagina',
+'redirect-file' => 'Nomine de file',
+'redirect-not-exists' => 'Valor non trovate',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Cercar files duplicate',
@@ -3837,12 +3923,16 @@ Le imagines se monstra in plen resolution, le altere typos de file se executa di
 'tags' => 'Etiquettas valide de modification',
 'tag-filter' => 'Filtro de [[Special:Tags|etiquettas]]:',
 'tag-filter-submit' => 'Filtrar',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiquetta|Etiquettas}}]]: $2)',
 'tags-title' => 'Etiquettas',
 'tags-intro' => 'Iste pagina lista le etiquettas con le quales le software pote marcar un modification, e lor significato.',
 'tags-tag' => 'Nomine del etiquetta',
 'tags-display-header' => 'Apparentia in listas de modificationes',
 'tags-description-header' => 'Description complete del significato',
+'tags-active-header' => 'Active?',
 'tags-hitcount-header' => 'Modificationes etiquettate',
+'tags-active-yes' => 'Si',
+'tags-active-no' => 'No',
 'tags-edit' => 'modificar',
 'tags-hitcount' => '$1 {{PLURAL:$1|modification|modificationes}}',
 
@@ -3863,6 +3953,7 @@ Le imagines se monstra in plen resolution, le altere typos de file se executa di
 'dberr-problems' => 'Pardono! Iste sito ha incontrate difficultates technic.',
 'dberr-again' => 'Proba attender alcun minutas e recargar.',
 'dberr-info' => '(Non pote contactar le servitor del base de datos: $1)',
+'dberr-info-hidden' => '(Non pote contactar le servitor del base de datos)',
 'dberr-usegoogle' => 'Tu pote probar cercar con Google intertanto.',
 'dberr-outofdate' => 'Nota que lor indices de nostre contento pote esser obsolete.',
 'dberr-cachederror' => 'Lo sequente es un copia del cache del pagina requestate, e pote esser obsolete.',
@@ -3878,6 +3969,9 @@ Le imagines se monstra in plen resolution, le altere typos de file se executa di
 'htmlform-submit' => 'Submitter',
 'htmlform-reset' => 'Disfacer modificationes',
 'htmlform-selectorother-other' => 'Altere',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Si',
+'htmlform-chosen-placeholder' => 'Selige un option',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con supporto de recerca de texto integre',
@@ -3995,4 +4089,19 @@ Si non, tu pote usar le formulario facile hic infra. Tu commento essera addite a
 # Image rotation
 'rotate-comment' => 'Imagine rotate de $1 {{PLURAL:$1|grado|grados}} in senso horologic',
 
+# Limit report
+'limitreport-title' => 'Datos de rendimento del analysator syntactic:',
+'limitreport-cputime' => 'Tempore de uso del CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|secunda|secundas}}',
+'limitreport-walltime' => 'Tempore de uso real',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|secunda|secundas}}',
+'limitreport-ppvisitednodes' => 'Numero de nodos de preprocessor visitate',
+'limitreport-ppgeneratednodes' => 'Numero de nodos de preprocessor generate',
+'limitreport-postexpandincludesize' => 'Dimension de inclusion post expansion',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Dimension del argumento del patrono',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => 'Maxime profunditate de expansion',
+'limitreport-expensivefunctioncount' => 'Numero de functiones analysator costose',
+
 );
diff --git a/languages/messages/MessagesId.php b/languages/messages/MessagesId.php
index e09510ac..2c3b33d4 100644
--- a/languages/messages/MessagesId.php
+++ b/languages/messages/MessagesId.php
@@ -266,6 +266,7 @@ $specialPageAliases = array(
 	'MIMEsearch'                => array( 'Pencarian_MIME', 'PencarianMIME' ),
 	'Mostcategories'            => array( 'Kategori_terbanyak', 'KategoriTerbanyak' ),
 	'Mostimages'                => array( 'Berkas_paling_digunakan', 'BerkasPalingDigunakan' ),
+	'Mostinterwikis'            => array( 'Interwiki_terbanyak', 'InterwikiTerbanyak' ),
 	'Mostlinked'                => array( 'Halaman_paling_digunakan', 'HalamanPalingDigunakan' ),
 	'Mostlinkedcategories'      => array( 'Kategori_paling_digunakan', 'KategoriPalingDigunakan' ),
 	'Mostlinkedtemplates'       => array( 'Templat_paling_digunakan', 'TemplatPalingDigunakan' ),
@@ -369,11 +370,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Tunjukkan jumlah pemantau',
 'tog-oldsig' => 'Tanda tangan sekarang:',
 'tog-fancysig' => 'Perlakukan tanda tangan sebagai teks wiki (tanpa suatu pranala otomatis)',
-'tog-externaleditor' => 'Gunakan editor eksternal secara bawaan (hanya untuk ahli, perlu pengaturan khusus pada komputer Anda.
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkapnya].)',
-'tog-externaldiff' => 'Gunakan diff eksternal secara bawaan (hanya untuk ahli, perlu pengaturan khusus pada komputer Anda.
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkapnya].)',
-'tog-showjumplinks' => 'Aktifkan pranala pembantu "langsung ke"',
 'tog-uselivepreview' => 'Gunakan pratayang langsung (eksperimental)',
 'tog-forceeditsummary' => 'Ingatkan saya bila kotak ringkasan suntingan masih kosong',
 'tog-watchlisthideown' => 'Sembunyikan suntingan saya di daftar pantauan',
@@ -387,6 +383,8 @@ $messages = array(
 'tog-showhiddencats' => 'Tampilkan kategori tersembunyi',
 'tog-noconvertlink' => 'Matikan konversi judul pranala',
 'tog-norollbackdiff' => 'Jangan tampilkan perbedaan setelah melakukan pengembalian',
+'tog-useeditwarning' => 'Ingatkan saya bila meninggalkan halaman penyuntingan sebelum menyimpan perubahan',
+'tog-prefershttps' => 'Selalu gunakan koneksi aman ketika masuk log',
 
 'underline-always' => 'Selalu',
 'underline-never' => 'Tidak pernah',
@@ -450,6 +448,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Des',
+'january-date' => '$1 Januari',
+'february-date' => '$1 Februari',
+'march-date' => '$1 Maret',
+'april-date' => '$1 April',
+'may-date' => '$1 Mei',
+'june-date' => '$1 Juni',
+'july-date' => '$1 Juli',
+'august-date' => '$1 Agustus',
+'september-date' => '$1 September',
+'october-date' => '$1 Oktober',
+'november-date' => '$1 November',
+'december-date' => '$1 Desember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori}}',
@@ -471,7 +481,7 @@ $messages = array(
 'broken-file-category' => 'Halaman dengan gambar rusak',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Tentang',
 'article' => 'Halaman isi',
@@ -534,6 +544,7 @@ $messages = array(
 'create-this-page' => 'Buat halaman ini',
 'delete' => 'Hapus',
 'deletethispage' => 'Hapus halaman ini',
+'undeletethispage' => 'Batalkan penghapusan',
 'undelete_short' => 'Batal hapus {{PLURAL:$1|$1 suntingan}}',
 'viewdeleted_short' => 'Lihat {{PLURAL:$1|$1 suntingan}} yang dihapus',
 'protect' => 'Lindungi',
@@ -577,7 +588,7 @@ $1',
 'pool-queuefull' => 'Kumpulan antrean penuh',
 'pool-errorunknown' => 'Kesalahan yang tidak diketahui',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Tentang {{SITENAME}}',
 'aboutpage' => 'Project:Perihal',
 'copyright' => 'Konten tersedia sesuai di bawah $1.',
@@ -587,7 +598,6 @@ $1',
 'disclaimers' => 'Penyangkalan',
 'disclaimerpage' => 'Project:Penyangkalan umum',
 'edithelp' => 'Bantuan penyuntingan',
-'edithelppage' => 'Help:Penyuntingan',
 'helppage' => 'Help:Isi',
 'mainpage' => 'Halaman Utama',
 'mainpage-description' => 'Halaman Utama',
@@ -618,7 +628,6 @@ $1',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|perubahan}} terakhir',
 'youhavenewmessagesmulti' => 'Anda mendapat pesan baru pada $1',
 'editsection' => 'sunting',
-'editsection-brackets' => '[$1]',
 'editold' => 'sunting',
 'viewsourceold' => 'lihat sumber',
 'editlink' => 'sunting',
@@ -668,17 +677,12 @@ Daftar halaman istimewa yang sah dapat dilihat di [[Special:SpecialPages|{{int:s
 # General errors
 'error' => 'Kesalahan',
 'databaseerror' => 'Kesalahan basis data',
-'dberrortext' => 'Ada kesalahan sintaks pada permintaan basis data.
-Kesalahan ini mungkin menandakan adanya sebuah \'\'bug\'\' dalam perangkat lunak.
-Permintaan basis data yang terakhir adalah:
-<blockquote><code>$1</code></blockquote>
-dari dalam fungsi "<code>$2</code>".
-Basis data menghasilkan kesalahan "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ada kesalahan sintaks pada permintaan basis data.
-Permintaan basis data yang terakhir adalah:
-"$1"
-dari dalam fungsi "$2".
-Basis data menghasilkan kesalahan "$3: $4".',
+'databaseerror-text' => 'Sebuah galat kueri basis data telah terjadi.
+Hal ini mungkin mengindikasikan ada kesalahan pada perangkat lunaknya.',
+'databaseerror-textcl' => 'Sebuah galat kueri basis data telah terjadi.',
+'databaseerror-query' => 'Kueri: $1',
+'databaseerror-function' => 'Fungsi: $1',
+'databaseerror-error' => 'Kesalahan: $1',
 'laggedslavemode' => 'Peringatan: Halaman mungkin tidak berisi perubahan terbaru.',
 'readonly' => 'Basis data dikunci',
 'enterlockreason' => 'Masukkan alasan penguncian, termasuk perkiraan kapan kunci akan dibuka',
@@ -710,6 +714,7 @@ Mungkin telah dihapus oleh orang lain.',
 'cannotdelete-title' => 'Tidak dapat menghapus halaman "$1"',
 'delete-hook-aborted' => 'Penghapusan dibatalkan oleh kait parser.
 Tidak ada keterangan.',
+'no-null-revision' => 'Tidak dapat membuat revisi null baru untuk halaman "$1"',
 'badtitle' => 'Judul tidak sah',
 'badtitletext' => 'Judul halaman yang diminta tidak sah, kosong, atau judul antarbahasa atau antarwiki yang salah sambung.',
 'perfcached' => 'Data berikut ini diambil dari singgahan dan mungkin bukan data mutakhir. {{PLURAL:$1||}}$1 hasil maksimal tersedia di tembolok.',
@@ -726,12 +731,15 @@ Tidak ada keterangan.',
 'protectedinterface' => 'Halaman ini memuat teks antarmuka untuk perangkat lunak pada wiki ini, dan dilindungi terhadap penyalahgunaan. Untuk menambah atau mengubah terjemahan pada semua wiki, harap gunakan [//translatewiki.net/ translatewiki.net], proyek pelokalan MediaWiki.',
 'editinginterface' => "'''Peringatan:''' Anda menyunting suatu halaman yang digunakan untuk menyediakan teks antarmuka untuk perangkat lunak situs ini. Perubahan teks ini akan memengaruhi tampilan pada antarmuka pengguna untuk pengguna lain di wiki ini.
 Untuk menambah atau mengubahterjemahan untuk semua wiki, harap gunakan [//translatewiki.net/ translatewiki.net], proyek pelokalan MediaWiki.",
-'sqlhidden' => '(Permintaan SQL disembunyikan)',
 'cascadeprotected' => 'Halaman ini telah dilindungi dari penyuntingan karena disertakan di {{PLURAL:$1|halaman|halaman-halaman}} berikut yang telah dilindungi dengan opsi "runtun":
 $2',
 'namespaceprotected' => "Anda tak memiliki hak akses untuk menyunting halaman di ruang nama '''$1'''.",
 'customcssprotected' => 'Anda tidak memiliki izin untuk menyunting halaman CSS ini, karena berisi pengaturan pribadi pengguna lain.',
 'customjsprotected' => 'Anda tidak memiliki izin untuk menyunting halaman JavaScript ini, karena berisi pengaturan pribadi pengguna lain.',
+'mycustomcssprotected' => 'Anda tidak memiliki izin untuk menyunting halaman CSS ini.',
+'mycustomjsprotected' => 'Anda tidak memiliki izin untuk menyunting halaman JavaScript ini.',
+'myprivateinfoprotected' => 'Anda tidak memiliki izin untuk menyunting informasi pribadi Anda.',
+'mypreferencesprotected' => 'Anda tidak memiliki izin untuk menyunting preferensi Anda.',
 'ns-specialprotected' => 'Halaman pada ruang nama {{ns:special}} tidak dapat disunting.',
 'titleprotected' => "Judul ini dilindungi dari pembuatan oleh [[User:$1|$1]].
 Alasan yang diberikan adalah ''$2''.",
@@ -755,10 +763,19 @@ Ingatlah bahwa beberapa halaman mungkin masih menampilkan anda seperti masih mas
 'welcomeuser' => 'Selamat datang,  $1 !',
 'welcomecreation-msg' => 'Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] Anda.',
 'yourname' => 'Nama pengguna:',
+'userlogin-yourname' => 'Nama pengguna',
+'userlogin-yourname-ph' => 'Masukkan nama pengguna Anda',
+'createacct-another-username-ph' => 'Masukkan nama pengguna',
 'yourpassword' => 'Kata sandi:',
+'userlogin-yourpassword' => 'Kata sandi',
+'userlogin-yourpassword-ph' => 'Masukkan kata sandi',
+'createacct-yourpassword-ph' => 'Masukkan kata sandi',
 'yourpasswordagain' => 'Ulangi kata sandi:',
+'createacct-yourpasswordagain' => 'Konfirmasi kata sandi',
+'createacct-yourpasswordagain-ph' => 'Masukkan lagi kata sandi',
 'remembermypassword' => 'Ingat kata sandi saya di komputer ini (selama $1 {{PLURAL:$1|hari|hari}})',
-'securelogin-stick-https' => 'Tetap terhubung ke HTTPS setelah masuk',
+'userlogin-remembermypassword' => 'Biarkan saya tetap masuk',
+'userlogin-signwithsecure' => 'Gunakan server aman',
 'yourdomainname' => 'Domain Anda:',
 'password-change-forbidden' => 'Anda tidak dapat mengubah kata sandi pada wiki ini.',
 'externaldberror' => 'Telah terjadi kesalahan otentikasi basis data eksternal atau Anda tidak diizinkan melakukan kemaskini terhadap akun eksternal Anda.',
@@ -770,18 +787,44 @@ Ingatlah bahwa beberapa halaman mungkin masih menampilkan anda seperti masih mas
 'logout' => 'Keluar log',
 'userlogout' => 'Keluar log',
 'notloggedin' => 'Belum masuk log',
+'userlogin-noaccount' => 'Belum punya akun?',
+'userlogin-joinproject' => 'Join {{SITENAME}}',
 'nologin' => 'Belum mempunyai akun? $1.',
 'nologinlink' => 'Daftarkan akun baru',
 'createaccount' => 'Buat akun baru',
 'gotaccount' => "Sudah terdaftar sebagai pengguna? '''$1'''.",
 'gotaccountlink' => 'Masuk log',
 'userlogin-resetlink' => 'Lupa detail info masuk Anda?',
+'userlogin-resetpassword-link' => 'Buat ulang kata sandi',
+'helplogin-url' => 'Help:Masuk log',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bantuan masuk log]]',
+'userlogin-loggedin' => 'Andan telah masuk log sebagai $1.
+Gunakan formulir di bawah untuk masuk log sebagai pengguna lain.',
+'userlogin-createanother' => 'Buat akun lain',
+'createacct-join' => 'Masukkan informasi Anda di bawah ini.',
+'createacct-another-join' => 'Masukkan informasi akun baru di bawah ini.',
+'createacct-emailrequired' => 'Alamat surel',
+'createacct-emailoptional' => 'Alamat surel (opsional)',
+'createacct-email-ph' => 'Masukkan alamat surel Anda',
+'createacct-another-email-ph' => 'Masukkan alamat surel',
 'createaccountmail' => 'Gunakan kata sandi acak sementara dan kirimkan ke surel yang diinginkan',
+'createacct-realname' => 'Nama asli (opsional)',
 'createaccountreason' => 'Alasan:',
+'createacct-reason' => 'Alasan',
+'createacct-reason-ph' => 'Mengapa Anda membuat akun lain',
+'createacct-captcha' => 'Pemeriksaan keamanan',
+'createacct-imgcaptcha-ph' => 'Masukkan teks yang Anda lihat di atas',
+'createacct-submit' => 'Buat akun Anda',
+'createacct-another-submit' => 'Buat akun lain',
+'createacct-benefit-heading' => '{{SITENAME}} dibuat oleh orang-orang seperti Anda.',
+'createacct-benefit-body1' => '{{PLURAL:$1|suntingan}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|halaman}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|kontributor}} terakhir',
 'badretype' => 'Kata sandi yang Anda masukkan salah.',
 'userexists' => 'Nama pengguna yang dimasukkan telah digunakan.
 Silakan tentukan nama yang lain.',
 'loginerror' => 'Kesalahan masuk log',
+'createacct-error' => 'Pembuatan akun gagal',
 'createaccounterror' => 'Tidak dapat membuat akun: $1',
 'nocookiesnew' => 'Akun pengguna telah dibuat, tetapi Anda belum masuk log. {{SITENAME}} menggunakan kuki untuk log pengguna. Kuki pada peramban web Anda dinonaktifkan. Silakan aktifkan dan masuk log kembali dengan nama pengguna dan kata sandi Anda.',
 'nocookieslogin' => '{{SITENAME}} menggunakan kuki untuk log penggunanya. Kuki pada peramban web Anda dimatikan. Silakan aktifkan dan coba lagi.',
@@ -835,11 +878,13 @@ Harap masukkan alamat surel dalam format yang benar atau kosongkan isian tersebu
 
 Anda dapat mengabaikan pesan ini jika akun ini dibuat karena suatu kesalahan.',
 'usernamehasherror' => 'Nama pengguna tidak bisa mengandung tanda pagar',
-'login-throttled' => 'Anda telah berkali-kali mencoba masuk log.
+'login-throttled' => 'Anda sudah terlalu sering mencoba masuk log.
 Silakan menunggu sebelum mencoba lagi.',
 'login-abort-generic' => 'Proses masuk Anda tidak berhasil - Dibatalkan',
 'loginlanguagelabel' => 'Bahasa: $1',
 'suspicious-userlogout' => 'Permintaan Anda untuk keluar log ditolak karena tampaknya dikirim oleh penjelajah yang rusak atau proksi penyinggah.',
+'createacct-another-realname-tip' => 'Nama asli bersifat opsional.
+Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan atas hasil kerja Anda.',
 
 # Email sending
 'php-mail-error-unknown' => 'Kesalahan yang tidak dikenal dalam fungsi mail() PHP',
@@ -855,8 +900,7 @@ Silakan menunggu sebelum mencoba lagi.',
 'newpassword' => 'Kata sandi baru:',
 'retypenew' => 'Ketik ulang kata sandi baru:',
 'resetpass_submit' => 'Atur kata sandi dan masuk log',
-'resetpass_success' => 'Kata sandi Anda telah berhasil diubah! 
-Sekarang memproses masuk log Anda...',
+'changepassword-success' => 'Kata sandi Anda telah berhasil diubah!',
 'resetpass_forbidden' => 'Kata sandi tidak dapat diubah',
 'resetpass-no-info' => 'Anda harus masuk log untuk mengakses halaman ini secara langsung.',
 'resetpass-submit-loggedin' => 'Ganti kata sandi',
@@ -868,10 +912,11 @@ Anda mungkin telah berhasil mengganti kata sandi Anda atau telah meminta kata sa
 
 # Special:PasswordReset
 'passwordreset' => 'Setel ulang kata sandi',
-'passwordreset-text' => 'Lengkapi formulir ini untuk menyetel ulang kata sandi.',
+'passwordreset-text-one' => 'Lengkapi formulir ini untuk menyetel ulang kata sandi.',
+'passwordreset-text-many' => '{{PLURAL:$1|Isi salah satu kotak di bawah ini untuk menyetel ulang kata sandi Anda.}}',
 'passwordreset-legend' => 'Setel ulang kata sandi',
 'passwordreset-disabled' => 'Penyetelan ulang sandi telah dimatikan di wiki ini.',
-'passwordreset-pretext' => '{{PLURAL:$1||Masukkan salah satu data di bawah ini}}',
+'passwordreset-emaildisabled' => 'Fitur surel telah dinonaktifkan pada wiki ini.',
 'passwordreset-username' => 'Nama pengguna:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Lihat surel yang dihasilkan?',
@@ -901,7 +946,7 @@ ingin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi
 Sandi sementara: $2',
 'passwordreset-emailsent' => 'Surel setel ulang kata sandi telah dikirimkan.',
 'passwordreset-emailsent-capture' => 'Surel setel ulang kata sandi telah dikirim, yang ditampilkan di bawah.',
-'passwordreset-emailerror-capture' => 'Surel pengingat, yang ditampilkan di bawah, telah dihasilkan, tetapi gagal mengirimkannya ke pengguna: $1',
+'passwordreset-emailerror-capture' => 'Surel setel ulang kata sandi telah dibuat, yang ditampilkan di bawah, namun pengiriman pada {{GENDER:$2|pengguna}} gagal: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ubah alamat surel',
@@ -915,6 +960,19 @@ Sandi sementara: $2',
 'changeemail-submit' => 'Ubah surel',
 'changeemail-cancel' => 'Batalkan',
 
+# Special:ResetTokens
+'resettokens' => 'Reset token',
+'resettokens-text' => 'Anda dapat me-reset Token yang memungkinkan akses ke data pribadi tertentu yang terkait dengan akun Anda di sini.
+
+Anda harus melakukannya jika Anda secara tidak sengaja berbagi dengan seseorang atau jika akun Anda telah disusupi.',
+'resettokens-no-tokens' => 'Tidak ada token untuk di-reset.',
+'resettokens-legend' => 'Reset token',
+'resettokens-tokens' => 'Token:',
+'resettokens-token-label' => '$1 (nilai saat ini: $2)',
+'resettokens-watchlist-token' => 'Token untuk sindikasi web (Atom/RSS) dari [[Special:Watchlist|perubahan di daftar pantauan Anda]]',
+'resettokens-done' => 'Reset token.',
+'resettokens-resetbutton' => 'Reset token yang dipilih',
+
 # Edit page toolbar
 'bold_sample' => 'Teks ini akan dicetak tebal',
 'bold_tip' => 'Teks tebal',
@@ -1110,12 +1168,15 @@ tanpa ada keterangan.',
 Halaman kemungkinan telah dihapus.',
 'edit-conflict' => 'Konflik penyuntingan.',
 'edit-no-change' => 'Suntingan diabaikan, karena Anda tidak melakukan perubahan atas teks.',
+'postedit-confirmation' => 'Suntingan Anda tersimpan.',
 'edit-already-exists' => 'Tidak dapat membuat halaman baru
 karena telah ada.',
 'defaultmessagetext' => 'Teks baku',
 'content-failed-to-parse' => 'Gagal menjabarkan konten $2 untuk model $1: $3',
 'invalid-content-data' => 'Data konten tidak sah',
 'content-not-allowed-here' => 'Konten "$1" tidak diizinkan di halaman [[$2]]',
+'editwarning-warning' => 'Meninggalkan halaman ini dapat menyebabkan semua perubahan yang belum tersimpan hilang.
+Jika Anda telah masuk log, Anda dapat mematikan peringatan ini lewat bagian "Penyuntingan" pada halaman preferensi Anda.',
 
 # Content models
 'content-model-wikitext' => 'teks wiki',
@@ -1149,6 +1210,7 @@ Beberapa templat akan diabaikan.',
 'undo-failure' => 'Suntingan ini tidak dapat dibalikkan karena konflik penyuntingan antara.',
 'undo-norev' => 'Suntingan ini tidak dapat dibalikkan karena halaman tidak ditemukan atau telah dihapuskan.',
 'undo-summary' => 'Membalikkan revisi $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|bicara]])',
+'undo-summary-username-hidden' => 'Batalkan revisi $1 oleh seorang pengguna tersembunyi',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Akun tak dapat dibuat',
@@ -1327,6 +1389,7 @@ Pastikan bahwa perubahan ini tetap mempertahankan kontinuitas versi terdahulu ha
 'compareselectedversions' => 'Bandingkan versi terpilih',
 'showhideselectedversions' => 'Tampilkan/sembunyikan versi terpilih',
 'editundo' => 'balikkan',
+'diff-empty' => '(Tidak ada perbedaan)',
 'diff-multi' => '({{PLURAL:$1|Satu|$1}} revisi antara oleh {{PLURAL:$2|satu|$2}} pengguna tak ditampilkan)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Satu|$1}} revisi antara oleh lebih dari $2 {{PLURAL:$2|satu|$2}} pengguna tak ditampilkan)',
 'difference-missing-revision' => '{{PLURAL:$2|Satu revisi|$2 revisi}} dari perbedaan ini ($1) {{PLURAL:$2|tidak|tidak}} ditemukan.
@@ -1354,7 +1417,6 @@ Rinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
 'searchmenu-legend' => 'Opsi pencarian',
 'searchmenu-exists' => "* Halaman '''[[$1]]'''",
 'searchmenu-new' => "'''Buat halaman \"[[:\$1]]\" di wiki ini!'''",
-'searchhelp-url' => 'Help:Isi',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Lihat daftar halaman dengan awalan ini]]',
 'searchprofile-articles' => 'Halaman isi',
 'searchprofile-project' => 'Halaman Bantuan dan Proyek',
@@ -1397,15 +1459,7 @@ Rinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
 'searchdisabled' => 'Pencarian {{SITENAME}} sementara dimatikan.
 Anda dapat mencari melalui Google untuk sementara waktu.
 Perlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencakup perubahan-perubahan terakhir.',
-
-# Quickbar
-'qbsettings' => 'Pengaturan bar pintas',
-'qbsettings-none' => 'Tidak ada',
-'qbsettings-fixedleft' => 'Tetap sebelah kiri',
-'qbsettings-fixedright' => 'Tetap sebelah kanan',
-'qbsettings-floatingleft' => 'Mengambang sebelah kiri',
-'qbsettings-floatingright' => 'Mengambang sebelah kanan',
-'qbsettings-directionality' => 'Tetap, tergantung pada bentuk skrip dari bahasa Anda',
+'search-error' => 'Kesalahan terjadi saat mencari: $1',
 
 # Preferences page
 'preferences' => 'Preferensi',
@@ -1439,7 +1493,6 @@ Perlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencak
 'resetprefs' => 'Batalkan perubahan',
 'restoreprefs' => 'Kembalikan semua setelan bawaan',
 'prefs-editing' => 'Penyuntingan',
-'prefs-edit-boxsize' => 'Ukuran kotak penyuntingan.',
 'rows' => 'Baris:',
 'columns' => 'Kolom:',
 'searchresultshead' => 'Cari',
@@ -1450,8 +1503,9 @@ Perlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencak
 'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|hari|hari}})',
 'recentchangescount' => 'Standar jumlah suntingan yang ditampilkan:',
 'prefs-help-recentchangescount' => 'Opsi ini berlaku untuk perubahan terbaru, versi terdahulu halaman, dan log.',
-'prefs-help-watchlist-token' => 'Mengisi kotak ini dengan kunci rahasia (PIN) akan menghasilkan sindikasi RSS untuk daftar pantauan Anda. Siapa pun yang mengetahui kunci ini dapat membaca daftar pantauan Anda, jadi pilihlah nilainya dengan hati-hati
-Berikut ini adalah nilai acak yang dapat Anda gunakan: $1',
+'prefs-help-watchlist-token2' => 'Ini adalah kunci rahasia (token) ke web feed dari daftar pantauan Anda.
+Siapa saja yang tahu akan dapat melihat daftar pantauan Anda, jadi jangan dibagikan.
+[[Special:ResetTokens|Klik di sini jika Anda perlu menyetel ulang]].',
 'savedprefs' => 'Preferensi Anda telah disimpan',
 'timezonelegend' => 'Zona waktu:',
 'localtime' => 'Waktu setempat:',
@@ -1482,7 +1536,6 @@ Berikut ini adalah nilai acak yang dapat Anda gunakan: $1',
 'prefs-reset-intro' => 'Anda dapat menggunakan halaman ini untuk mengembalikan preferensi Anda ke setelan baku situs.
 Pengembalian preferensi tidak dapat dibatalkan.',
 'prefs-emailconfirm-label' => 'Konfirmasi surel:',
-'prefs-textboxsize' => 'Ukuran kotak suntingan',
 'youremail' => 'Surel:',
 'username' => '{{GENDER:$1|Nama pengguna}}:',
 'uid' => 'ID {{GENDER:$1|pengguna}}:',
@@ -1517,6 +1570,8 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'prefs-dateformat' => 'Format tanggal',
 'prefs-timeoffset' => 'Format waktu',
 'prefs-advancedediting' => 'Pilihan umum',
+'prefs-editor' => 'Penyunting',
+'prefs-preview' => 'Pratayang',
 'prefs-advancedrc' => 'Opsi lanjutan',
 'prefs-advancedrendering' => 'Opsi lanjutan',
 'prefs-advancedsearchoptions' => 'Opsi lanjutan',
@@ -1524,7 +1579,9 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'prefs-displayrc' => 'Pilihan tampilan',
 'prefs-displaysearchoptions' => 'Pilihan tampilan',
 'prefs-displaywatchlist' => 'Pilihan tampilan',
+'prefs-tokenwatchlist' => 'Tanda',
 'prefs-diffs' => 'Beda',
+'prefs-help-prefershttps' => 'Preferensi ini akan diaktifkan kali berikutnya Anda masuk log.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Alamat surel tampaknya sah',
@@ -1553,6 +1610,8 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'userrights-changeable-col' => 'Kelompok yang dapat Anda ubah',
 'userrights-unchangeable-col' => 'Kelompok yang tidak dapat Anda ubah',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Konflik perubahan hak pengguna! Silakan tinjau ulang dan konfirmasi perubahan anda.',
+'userrights-removed-self' => 'Anda berhasil mencabut hak-hak Anda. Anda tidak bisa lagi mengakses halaman ini.',
 
 # Groups
 'group' => 'Kelompok:',
@@ -1618,11 +1677,19 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'right-proxyunbannable' => 'Mengabaikan pemblokiran otomatis atas proksi',
 'right-unblockself' => 'Lepaskan blokir sendiri',
 'right-protect' => 'Ubah tingkat pelindungan dan sunting halaman yang dilindungi beruntun',
-'right-editprotected' => 'Menyunting halaman yang dilindungi (tanpa pelindungan runtun)',
+'right-editprotected' => 'Sunting halaman yang dilindungi sebagai "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Sunting halaman yang dilindungi sebagai "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Menyunting antarmuka pengguna',
 'right-editusercssjs' => 'Menyunting arsip CSS dan JS pengguna lain',
 'right-editusercss' => 'Menyunting berkas CSS pengguna lain',
 'right-edituserjs' => 'Menyunting berkas JS pengguna lain',
+'right-editmyusercss' => 'Sunting berkas CSS pengguna Anda',
+'right-editmyuserjs' => 'Sunting berkas JavaScript pengguna Anda',
+'right-viewmywatchlist' => 'Lihat daftar pantau Anda',
+'right-editmywatchlist' => 'Sunting daftar pantau Anda. Masih ada cara menambahkan halaman tanpa harus memiliki hak ini.',
+'right-viewmyprivateinfo' => 'Lihat data pribadi Anda (alamat surel, nama asli, dll.)',
+'right-editmyprivateinfo' => 'Sunting data pribadi Anda (alamat surel, nama asli, dll.)',
+'right-editmyoptions' => 'Sunting preferensi Anda',
 'right-rollback' => 'Mengembalikan dengan cepat suntingan-suntingan pengguna terakhir yang menyunting halaman tertentu',
 'right-markbotedits' => 'Menandai pengembalian revisi sebagai suntingan bot',
 'right-noratelimit' => 'Tidak dipengaruhi oleh pembatasan jumlah suntingan',
@@ -1684,13 +1751,20 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'action-userrights-interwiki' => 'menyunting hak akses dari pengguna di wiki lain',
 'action-siteadmin' => 'mengunci atau membuka kunci basis data',
 'action-sendemail' => 'kirim surel',
+'action-editmywatchlist' => 'sunting daftar pantau Anda',
+'action-viewmywatchlist' => 'lihat daftar pantau Anda',
+'action-viewmyprivateinfo' => 'lihat informasi pribadi Anda',
+'action-editmyprivateinfo' => 'sunting informasi pribadi Anda',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|perubahan|perubahan}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sejak kunjungan terakhir}}',
+'enhancedrc-history' => 'riwayat',
 'recentchanges' => 'Perubahan terbaru',
 'recentchanges-legend' => 'Opsi perubahan terbaru',
 'recentchanges-summary' => "Temukan perubahan terbaru dalam wiki di halaman ini.<br />
 ;Keterangan:(<span style=\"color:blue;\">beda</span>) perubahan, (<span style=\"color:blue;\">versi</span>) sejarah revisi, '''B''' halaman baru, '''b''' suntingan bot, '''k''' suntingan kecil, <span class=\"unpatrolled\">!</span> perubahan belum dipatroli,<br /><span style=\"color:green;\">'''(+ ''bita'')'''</span> isi konten bertambah, <span style=\"color:red;\">(- ''bita'')</span> isi konten berkurang, (← Ringkasan otomatis), (→ <span style=\"color:grey;\">Suntingan bagian</span>)",
+'recentchanges-noresult' => 'Tidak ada perubahan dalam rentang waktu ini yang cocok dengan kriteria.',
 'recentchanges-feed-description' => 'Temukan perubahan terbaru dalam wiki di umpan ini.',
 'recentchanges-label-newpage' => 'Suntingan ini membuat halaman baru',
 'recentchanges-label-minor' => 'Ini adalah suntingan kecil',
@@ -1729,7 +1803,6 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'recentchangeslinked-feed' => 'Perubahan terkait',
 'recentchangeslinked-toolbox' => 'Perubahan terkait',
 'recentchangeslinked-title' => 'Perubahan yang terkait dengan "$1"',
-'recentchangeslinked-noresult' => 'Tidak terjadi perubahan pada halaman-halaman terkait selama periode yang telah ditentukan.',
 'recentchangeslinked-summary' => "Halaman istimewa ini memberikan daftar perubahan terakhir pada halaman-halaman terkait. Halaman yang Anda pantau ditandai dengan '''cetak tebal'''.",
 'recentchangeslinked-page' => 'Nama halaman:',
 'recentchangeslinked-to' => 'Perlihatkan perubahan dari halaman-halaman yang terhubung dengan halaman yang disajikan',
@@ -1740,7 +1813,7 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'reuploaddesc' => 'Kembali ke formulir pemuatan',
 'upload-tryagain' => 'Kirim perubahan keterangan berkas',
 'uploadnologin' => 'Belum masuk log',
-'uploadnologintext' => 'Anda harus [[Special:UserLogin|masuk log]] untuk dapat memuatkan berkas.',
+'uploadnologintext' => 'Anda harus $1 untuk dapat mengunggah berkas.',
 'upload_directory_missing' => 'Direktori pemuatan ($1) tidak ditemukan dan tidak dapat dibuat oleh server web.',
 'upload_directory_read_only' => 'Direktori pemuatan ($1) tidak dapat ditulis oleh server web.',
 'uploaderror' => 'Kesalahan pemuatan',
@@ -1963,7 +2036,6 @@ Untuk pilihan keamanan, img_auth.php dinonaktifkan.',
 'http-read-error' => 'Kesalahan pembacaan HTTP',
 'http-timed-out' => 'Permintaan HTTP lewat tenggat.',
 'http-curl-error' => 'Kesalahan saat mengambil URL: $1',
-'http-host-unreachable' => 'Tidak dapat mencapai URL.',
 'http-bad-status' => 'Ada masalah saat permintaan halaman HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1992,6 +2064,10 @@ Ketika disaring oleh pengguna, hanya versi berkas terbaru dari berkas yang diung
 'listfiles_size' => 'Ukuran',
 'listfiles_description' => 'Deskripsi',
 'listfiles_count' => 'Versi',
+'listfiles-show-all' => 'Termasuk versi lama gambar',
+'listfiles-latestversion' => 'Versi terkini',
+'listfiles-latestversion-yes' => 'Ya',
+'listfiles-latestversion-no' => 'Tidak',
 
 # File description page
 'file-anchor-link' => 'Berkas',
@@ -2089,6 +2165,13 @@ Cek dahulu pranala lain ke templat tersebut sebelum menghapusnya.',
 'randompage' => 'Halaman sembarang',
 'randompage-nopages' => 'Tidak ada halaman pada {{PLURAL:$2||}}ruang nama berikut: $1.',
 
+# Random page in category
+'randomincategory' => 'Halaman acak dalam kategori',
+'randomincategory-invalidcategory' => '"$1" bukanlah nama kategori yang berlaku.',
+'randomincategory-nopages' => 'Tidak ada halaman dalam [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Dapatkan halaman acak dari kategori: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Lanjut',
+
 # Random redirect
 'randomredirect' => 'Pengalihan sembarang',
 'randomredirect-nopages' => 'Tak terdapat pengalihan pada ruang nama "$1".',
@@ -2114,17 +2197,13 @@ Cek dahulu pranala lain ke templat tersebut sebelum menghapusnya.',
 'statistics-users-active-desc' => 'Pengguna yang telah melakukan suatu aktivitas dalam {{PLURAL:$1|sehari|$1 hari}} terakhir.',
 'statistics-mostpopular' => 'Halaman yang paling banyak ditampilkan',
 
-'disambiguations' => 'Halaman yang terhubung ke halaman disambiguasi',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => "Halaman-halaman berikut memiliki pranala ke suatu '''halaman disambiguasi'''.
-Halaman-halaman tersebut seharusnya berpaut ke topik-topik yang sesuai.<br />
-Suatu halaman dianggap sebagai halaman disambiguasi apabila halaman tersebut menggunakan templat yang terhubung ke [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Halaman dengan halaman properti',
 'pageswithprop-legend' => 'Halaman dengan halaman properti',
 'pageswithprop-text' => 'Halaman ini berisi daftar halaman yang menggunakan properti halaman tertentu.',
 'pageswithprop-prop' => 'Nama properti:',
 'pageswithprop-submit' => 'Lanjut',
+'pageswithprop-prophidden-long' => 'nilai properti teks panjang tersembunyi ($1 kilobita)',
+'pageswithprop-prophidden-binary' => 'nilai properti biner tersembunyi ($1 kilobita)',
 
 'doubleredirects' => 'Pengalihan ganda',
 'doubleredirectstext' => 'Halaman ini memuat daftar halaman yang dialihkan ke halaman pengalihan yang lain.
@@ -2182,6 +2261,7 @@ Nama yang telah <del>dicoret</del> berarti telah dibetulkan.',
 'mostrevisions' => 'Halaman dengan perubahan terbanyak',
 'prefixindex' => 'Semua halaman dengan awalan',
 'prefixindex-namespace' => 'Semua halaman dengan awalan (ruang nama $1)',
+'prefixindex-strip' => 'Strip awalan dalam daftar',
 'shortpages' => 'Halaman pendek',
 'longpages' => 'Halaman panjang',
 'deadendpages' => 'Halaman buntu',
@@ -2197,6 +2277,7 @@ Nama yang telah <del>dicoret</del> berarti telah dibetulkan.',
 'listusers' => 'Daftar pengguna',
 'listusers-editsonly' => 'Tampilkan hanya pengguna yang memiliki kontribusi',
 'listusers-creationsort' => 'Urutkan menurut tanggal pendaftaran',
+'listusers-desc' => 'Urutkan menurun',
 'usereditcount' => '$1 {{PLURAL:$1|suntingan|suntingan}}',
 'usercreated' => '{{GENDER:$3|Dibuat}} pada $1 pukul $2',
 'newpages' => 'Halaman baru',
@@ -2375,10 +2456,9 @@ Perubahan-perubahan berikutnya pada halaman tersebut dan halaman pembicaraan ter
 'unwatchthispage' => 'Batal pantau halaman ini',
 'notanarticle' => 'Bukan sebuah halaman isi',
 'notvisiblerev' => 'Revisi telah dihapus',
-'watchnochange' => 'Tak ada halaman pantauan Anda yang telah berubah dalam jangka waktu yang dipilih.',
 'watchlist-details' => 'Terdapat {{PLURAL:$1|$1 halaman|$1 halaman}} di daftar pantauan Anda, tidak termasuk halaman pembicaraan.',
-'wlheader-enotif' => '* Notifikasi surel diaktifkan.',
-'wlheader-showupdated' => "* Halaman-halaman yang telah berubah sejak kunjungan terakhir Anda ditampilkan dengan '''huruf tebal'''",
+'wlheader-enotif' => 'Notifikasi surel diaktifkan.',
+'wlheader-showupdated' => "Halaman-halaman yang telah berubah sejak kunjungan terakhir Anda ditampilkan dengan '''huruf tebal'''.",
 'watchmethod-recent' => 'periksa daftar perubahan terbaru terhadap halaman yang dipantau',
 'watchmethod-list' => 'periksa halaman yang dipantau terhadap perubahan terbaru',
 'watchlistcontains' => 'Daftar pantauan Anda berisi $1 {{PLURAL:$1|halaman|halaman}}.',
@@ -2620,7 +2700,7 @@ $1',
 'contributions' => 'Kontribusi {{GENDER:$1|pengguna}}',
 'contributions-title' => 'Kontribusi pengguna untuk $1',
 'mycontris' => 'Kontribusi',
-'contribsub2' => 'Untuk $1 ($2)',
+'contribsub2' => 'Untuk {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Tidak ada perubahan yang sesuai dengan kriteria tersebut.',
 'uctop' => '(saat ini)',
 'month' => 'Sejak bulan (dan sebelumnya):',
@@ -2776,14 +2856,12 @@ Lihat [[Special:BlockList|daftar pemblokiran]] untuk semua pengguna yang saat in
 'ipb_blocked_as_range' => 'Kesalahan: IP $1 tidak diblok secara langsung dan tidak dapat dilepaskan. IP $1 diblok sebagai bagian dari pemblokiran kelompok IP $2, yang dapat dilepaskan.',
 'ip_range_invalid' => 'Blok IP tidak sah.',
 'ip_range_toolarge' => 'Rentang blok lebih besar dari /$1 tidak diperbolehkan.',
-'blockme' => 'Blokir saya',
 'proxyblocker' => 'Pemblokir proxy',
-'proxyblocker-disabled' => 'Fitur ini sedang tidak diakfifkan.',
 'proxyblockreason' => 'Alamat IP Anda telah diblokir karena alamat IP Anda adalah proxy terbuka. Silakan hubungi penyedia jasa internet Anda atau dukungan teknis dan beritahukan mereka masalah keamanan serius ini.',
-'proxyblocksuccess' => 'Selesai.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL.',
 'sorbs_create_account_reason' => 'Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL. Anda tidak dapat membuat akun.',
+'xffblockreason' => 'Sebuah alamat IP di kepala X-Forwarded-For, entah milik Anda atau server proxy yang Anda pakai, telah diblokir. Alasan pemblokirannya adalah: $1',
 'cant-block-while-blocked' => 'Anda tidak dapat memblokir pengguna lain ketika Anda sendiri sedang diblokir.',
 'cant-see-hidden-user' => 'Pengguna yang anda coba blokir telah di blokir dan di sembunyikan. Selama anda tidak memiliki hak sembunyikan pengguna, anda tidak dapat melihat atau menyunting pemblokiran pengguna ini.',
 'ipbblocked' => 'Anda tidak dapat memblokir atau membuka blokir pengguna lain, karena anda sendiri diblokir',
@@ -2944,6 +3022,8 @@ Silakan kunjungi [//www.mediawiki.org/wiki/Localisation Pelokalan MediaWiki] dan
 'thumbnail-more' => 'Perbesar',
 'filemissing' => 'Berkas tak ditemukan',
 'thumbnail_error' => 'Gagal membuat miniatur: $1',
+'thumbnail_error_remote' => 'Pesan kesalahan dari $1:
+$2',
 'djvu_page_error' => 'Halaman DjVu di luar rentang',
 'djvu_no_xml' => 'XML untuk berkas DjVu tak dapat diperoleh',
 'thumbnail-temp-create' => 'Tidak dapat membuat berkas kecil temporer',
@@ -3092,17 +3172,11 @@ Simpan ke komputer Anda dan unggah ke sini.',
 
 # Stylesheets
 'common.css' => '/* CSS yang ada di sini akan diterapkan pada semua kulit. */',
-'standard.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Standar. */',
-'nostalgia.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Nostalgia. */',
 'cologneblue.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Cologne Blue. */',
 'monobook.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Monobook. */',
-'myskin.css' => '/* CSS yang ada di sini akan diterapkan pada kulit MySkin. */',
-'chick.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Chick. */',
-'simple.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Sederhana. */',
 'modern.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Modern. */',
 'vector.css' => '/* CSS nan ado di siko diterapkan pado kulik Vektor. */',
 'print.css' => '/* CSS yang ada di sini akan diterapkan pada tampilan cetak. */',
-'handheld.css' => '/* CSS yang ada di sini akan diterapkan untuk tampilan piranti genggam yang dikonfigurasi di $wgHandheldStyle. */',
 'noscript.css' => '/* CSS di sini akan mempengaruhi pengguna dengan skrip Java non-aktif */',
 'group-autoconfirmed.css' => '/* CSS di sini hanya mempengaruhi pengguna terkonfirmasi otomatis */',
 'group-bot.css' => '/* CSS di sini hanya mempengaruhi bot */',
@@ -3111,13 +3185,8 @@ Simpan ke komputer Anda dan unggah ke sini.',
 
 # Scripts
 'common.js' => '/* JavaScript yang ada di sini akan diterapkan untuk semua kulit. */',
-'standard.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Standard */',
-'nostalgia.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Nostalgia */',
 'cologneblue.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Cologne Blue */',
 'monobook.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit MonoBook */',
-'myskin.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit MySkin */',
-'chick.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Chick */',
-'simple.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Simple */',
 'modern.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Modern */',
 'vector.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Vector */',
 'group-autoconfirmed.js' => '/* Semua JavaScript di sini hanya dimuatkan untuk pengguna terkonfirmasi otomatis */',
@@ -3198,13 +3267,8 @@ Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hit
 'pageinfo-category-files' => 'Jumlah berkas',
 
 # Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Biru Köln',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Sederhana',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vektor',
 
@@ -3289,11 +3353,25 @@ Jika dijalankan, sistem Anda akan berisiko terserang.",
 'minutes' => '{{PLURAL:$1|$1 menit|$1 menit}}',
 'hours' => '{{PLURAL:$1|$1 jam|$1 jam}}',
 'days' => '{{PLURAL:$1|$1 hari|$1 hari}}',
+'weeks' => '{{PLURAL:$1|$1 minggu|$1 minggu}}',
 'months' => '{{PLURAL:$1|$1 bulan|$1 bulan}}',
 'years' => '{{PLURAL:$1|$1 tahun|$1 tahun}}',
 'ago' => '$1 yang lalu',
 'just-now' => 'baru saja',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|jam}} yang lalu',
+'minutes-ago' => '$1 {{PLURAL:$1|menit}} yang lalu',
+'seconds-ago' => '$1 {{PLURAL:$1|detik}} yang lalu',
+'monday-at' => 'Senin pukul $1',
+'tuesday-at' => 'Selasa pukul $1',
+'wednesday-at' => 'Rabu pukul $1',
+'thursday-at' => 'Kamis pukul $1',
+'friday-at' => 'Jumat pukul $1',
+'saturday-at' => 'Sabtu pukul $1',
+'sunday-at' => 'Minggu pukul $1',
+'yesterday-at' => 'Kemarin pukul $1',
+
 # Bad image list
 'bad_image_list' => 'Formatnya sebagai berikut:
 
@@ -3353,7 +3431,7 @@ Data lain akan disembunyikan secara bawaan.
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lebar',
 'exif-imagelength' => 'Tinggi',
 'exif-bitspersample' => 'Bit per komponen',
@@ -3546,7 +3624,7 @@ $4, $5 - $6, $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Tak terkompresi',
 'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman RLE',
 'exif-compression-3' => 'CCITT Group 3 fax encoding',
@@ -3888,7 +3966,6 @@ Silakan konfirmasi jika Anda ingin membuat ulang halaman ini.",
 'semicolon-separator' => ';&#32;',
 'comma-separator' => ',&#32;',
 'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
 'pipe-separator' => '&#32;|&#32;',
 'word-separator' => '&#32;',
 'ellipsis' => '...',
@@ -4016,7 +4093,6 @@ Anda juga dapat [[Special:EditWatchlist|menggunakan penyunting standar Anda]].',
 'version-other' => 'Lain-lain',
 'version-mediahandlers' => 'Penanganan media',
 'version-hooks' => 'Kait',
-'version-extension-functions' => 'Fungsi ekstensi',
 'version-parser-extensiontags' => 'Tag ekstensi parser',
 'version-parser-function-hooks' => 'Kait fungsi parser',
 'version-hook-name' => 'Nama kait',
@@ -4026,6 +4102,7 @@ Anda juga dapat [[Special:EditWatchlist|menggunakan penyunting standar Anda]].',
 'version-license' => 'Lisensi',
 'version-poweredby-credits' => "Wiki ini didukung oleh '''[//www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
 'version-poweredby-others' => 'lainnya',
+'version-poweredby-translators' => 'penerjemah translatewiki.net',
 'version-credits-summary' => 'Kami ingin mengakui orang-orang berikut atas kontribusinya terhadap [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki adalah perangkat lunak bebas; Anda diperbolehkan untuk mendistribusikan dan/atau memodfikasinya dengan persyaratan Lisensi Publik Umum GNU yang diterbitkan oleh Free Software Foundation; versi 2 atau terbaru.
 
@@ -4041,12 +4118,17 @@ Anda seharusnya telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikel path]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skrip path]',
 
-# Special:FilePath
-'filepath' => 'Lokasi berkas',
-'filepath-page' => 'Berkas:',
-'filepath-submit' => 'Cari',
-'filepath-summary' => 'Halaman istimewa ini menampilkan jalur lengkap untuk suatu berkas.
-Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsung dengan program terkaitnya.',
+# Special:Redirect
+'redirect' => 'Pengalihan oleh berkas, pengguna atau ID revisi',
+'redirect-legend' => 'Pengalihan ke sebuah berkas atau halaman',
+'redirect-summary' => 'Halaman istimewa ini beralih ke berkas (sesuai nama berkasnya), halaman (sesuai ID revisinya), atau halaman pengguna (sesuai ID numerik penggunanya).',
+'redirect-submit' => 'Lanjut',
+'redirect-lookup' => 'Pencarian:',
+'redirect-value' => 'Nilai:',
+'redirect-user' => 'ID pengguna',
+'redirect-revision' => 'Revisi halaman',
+'redirect-file' => 'Nama berkas',
+'redirect-not-exists' => 'Nilai tidak ditemukan',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Pencarian berkas duplikat',
@@ -4095,12 +4177,16 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
 'tags' => 'Tag perubahan yang valid',
 'tag-filter' => 'Filter [[Special:Tags|tag]]:',
 'tag-filter-submit' => 'Penyaring',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)',
 'tags-title' => 'Tanda',
 'tags-intro' => 'Halaman ini berisi daftar tag yang dapat ditandai oleh perangkat lunak terhadap suatu suntingan berikut artinya.',
 'tags-tag' => 'Nama tag',
 'tags-display-header' => 'Tampilan di daftar perubahan',
 'tags-description-header' => 'Deskripsi lengkap atau makna',
+'tags-active-header' => 'Aktif?',
 'tags-hitcount-header' => 'Perubahan bertag',
+'tags-active-yes' => 'Ya',
+'tags-active-no' => 'Tidak',
 'tags-edit' => 'sunting',
 'tags-hitcount' => '$1 {{PLURAL:$1|perubahan|perubahan}}',
 
@@ -4121,6 +4207,7 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
 'dberr-problems' => 'Maaf! Situs ini mengalami masalah teknis.',
 'dberr-again' => 'Cobalah menunggu beberapa menit dan muat ulang.',
 'dberr-info' => '(Tak dapat tersambung dengan server basis data: $1)',
+'dberr-info-hidden' => '(Tidak dapat menghubungi peladen basis data)',
 'dberr-usegoogle' => 'Anda dapat mencoba pencarian melalui Google untuk sementara waktu.',
 'dberr-outofdate' => 'Harap diperhatikan bahwa indeks mereka terhadap isi kami mungkin sudah kedaluwarsa.',
 'dberr-cachederror' => 'Berikut adalah salinan tersimpan halaman yang diminta, dan mungkin bukan yang terbaru.',
@@ -4136,6 +4223,9 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
 'htmlform-submit' => 'Kirim',
 'htmlform-reset' => 'Balikkan perubahan',
 'htmlform-selectorother-other' => 'Lain-lain',
+'htmlform-no' => 'Tidak',
+'htmlform-yes' => 'Ya',
+'htmlform-chosen-placeholder' => 'Pilih opsi',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 dengan dukungan pencarian teks lengkap',
@@ -4253,4 +4343,13 @@ Jika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda ak
 # Image rotation
 'rotate-comment' => 'Gambar diputar $1 {{PLURAL:$1|derajat}} searah jarum jam',
 
+# Limit report
+'limitreport-cputime' => 'Penggunaan waktu CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|detik|detik}}',
+'limitreport-walltime' => 'Penggunaan waktu riil',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|detik|detik}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bita|bita}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bita|bita}}',
+'limitreport-expensivefunctioncount' => 'Perhitungan fungsi parser yang mahal',
+
 );
diff --git a/languages/messages/MessagesIe.php b/languages/messages/MessagesIe.php
index 281987db..0112545d 100644
--- a/languages/messages/MessagesIe.php
+++ b/languages/messages/MessagesIe.php
@@ -161,9 +161,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Monstrar li númere de usatores vigilant',
 'tog-oldsig' => 'Prevision de signature in existentie:',
 'tog-fancysig' => 'Tractar signature quam textu wiki (sin un catenun auto-crate)',
-'tog-externaleditor' => 'Usar redactor extern per contumacie (solmen por usatores expert, besona de colocationes special in tui computator. [//www.mediawiki.org/wiki/Manual:External_editors Plu information.])',
-'tog-externaldiff' => 'Usar diferentie extern per contumacie (solmen por usatores expert, besona de colocationes special in tui computator. [//www.mediawiki.org/wiki/Manual:External_editors Plu information.])',
-'tog-showjumplinks' => 'Permisser catenunes de accessebilitá "saltar a"',
 'tog-uselivepreview' => 'Usar prevision in vivi (exige JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Suggester me quande intrar un redaction che summarium in blanc',
 'tog-watchlisthideown' => 'Ocultar mi redactiones del liste de págines vigilat',
@@ -338,7 +335,7 @@ Pleser atende un témpor quelc ante que vu prova accesser ti págine denov.
 
 $1',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Concernent {{SITENAME}}',
 'aboutpage' => 'Project:Concernent',
 'copyright' => 'Contenete disponibil sub $1.',
@@ -348,7 +345,6 @@ $1',
 'disclaimers' => 'Advertimentes',
 'disclaimerpage' => 'Project:Advertimentes comun',
 'edithelp' => 'Redacter auxilie',
-'edithelppage' => 'Help:Redactant',
 'helppage' => 'Help:Contenete',
 'mainpage' => 'Págine principal',
 'mainpage-description' => 'Págine principal',
@@ -626,7 +622,6 @@ Vider li [[Special:IPBlockList|liste de bloc de IP]] por li liste de bloces e ba
 'viewprevnext' => 'Vider ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Vi un págine nominat \"[[:\$1]]\" in ti wiki.'''",
 'searchmenu-new' => "'''Crear li págine \"[[:\$1]]\" in ti wiki!'''",
-'searchhelp-url' => 'Help:Contenete',
 'searchprofile-articles' => 'Págines de contenete',
 'searchprofile-project' => 'Auxilie e Págines de projecte',
 'searchprofile-images' => 'Multimedia',
@@ -648,9 +643,6 @@ Vider li [[Special:IPBlockList|liste de bloc de IP]] por li liste de bloces e ba
 'search-nonefound' => 'Ne esset constatat resultates por li question.',
 'powersearch' => 'Serchar avansat',
 
-# Quickbar
-'qbsettings' => 'Personalisation del barre de utensiles',
-
 # Preferences page
 'preferences' => 'Preferenties',
 'mypreferences' => 'Mi preferenties',
@@ -759,7 +751,6 @@ Tui adresse de e-mail ne es revelat quande altri usatores contacter vu.',
 'recentchangeslinked-feed' => 'Relatet modificationes',
 'recentchangeslinked-toolbox' => 'Changes referet',
 'recentchangeslinked-title' => 'Changes relatet por "$1"',
-'recentchangeslinked-noresult' => 'Nequant change in págines ligat durante li periode anunciat.',
 'recentchangeslinked-summary' => "Ti es un liste de changes fat recentmen por págines ligat de un págine specificat (o por membres de un categorie specificat).
 Págines in [[Special:Watchlist|tui liste de págines vigilat]] es '''nigri'''.",
 'recentchangeslinked-page' => 'Nómine de págine:',
@@ -893,8 +884,6 @@ Li descrition es in li [$2 págine de descrition del file] ta e es monstrat in i
 'statistics-users-active-desc' => 'Usatores qui have efectuat un action in li ultim {{PLURAL:$1|die|dies}}',
 'statistics-mostpopular' => 'Págines max visitat',
 
-'disambiguationspage' => 'Template:disambig',
-
 'brokenredirects-edit' => 'redacter',
 'brokenredirects-delete' => 'deleter',
 
@@ -994,10 +983,9 @@ Li descrition es in li [$2 págine de descrition del file] ta e es monstrat in i
 'watch' => 'Vigilar',
 'watchthispage' => 'Vigilar ti págine',
 'unwatch' => 'Desvigilar',
-'watchnochange' => 'Nequant de tui tui partes vigilat esset redactet in li periode de témpor monstrat.',
 'watchlist-details' => '{{PLURAL:$1|$1 págine|$1 págines}} in tui liste de págines vigilat, sin págines de discussion.',
-'wlheader-enotif' => '* Li notification de e-mail es permisset.',
-'wlheader-showupdated' => "* Págines quel hat esset mutat desde tui ultim visitation es monstrat in '''nigri'''",
+'wlheader-enotif' => 'Li notification de e-mail es permisset.',
+'wlheader-showupdated' => "Págines quel hat esset mutat desde tui ultim visitation es monstrat in '''nigri'''",
 'watchmethod-recent' => 'controlant nov redactiones por págines vigilat',
 'watchmethod-list' => 'controlant págines vigilat por nov redactiones',
 'watchlistcontains' => 'Tui liste de págines vigilat contene $1 {{PLURAL:$1|págine|págines}}.',
@@ -1360,7 +1348,6 @@ Vu posse anc [[Special:EditWatchlist|usar li redactor uniform]].',
 'version-other' => 'Altri',
 'version-mediahandlers' => 'Manuettes de media',
 'version-hooks' => 'Croces',
-'version-extension-functions' => 'Functiones de extension',
 'version-parser-extensiontags' => 'Puntales de extension analisatores',
 'version-parser-function-hooks' => 'Croces de functiones analisatores',
 'version-hook-name' => 'Nómine de croc',
@@ -1372,9 +1359,6 @@ Vu posse anc [[Special:EditWatchlist|usar li redactor uniform]].',
 'version-software-product' => 'Producte',
 'version-software-version' => 'Version',
 
-# Special:FilePath
-'filepath-page' => 'Figura:',
-
 # Special:SpecialPages
 'specialpages' => 'Págines special',
 'specialpages-group-maintenance' => 'Raportes de conservation',
diff --git a/languages/messages/MessagesIg.php b/languages/messages/MessagesIg.php
index e8386990..d80520c1 100644
--- a/languages/messages/MessagesIg.php
+++ b/languages/messages/MessagesIg.php
@@ -104,9 +104,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Zi onuogụgụ ndi na banife nke ne lé',
 'tog-oldsig' => 'Létu ntakiri ndẹlu ejị a ma gí:',
 'tog-fancysig' => 'Mesò ka nkábi nwéré édé wiki (nké énwéghị jikodo nke nọr na onwe)',
-'tog-externaleditor' => 'Jí irü èzí nà áká (màkà ndi òkà nání, ȯ chọrọ ndósé nke kárí na nsónùsòrò gi)',
-'tog-externaldiff' => 'Jí nkéichè èzí nà áká (màkà ndi òkà nání, ȯ chọrọ ndósé nke kárí na nsónùsòrò gi)',
-'tog-showjumplinks' => 'Kwé ka njikodo "mani énū" I mé',
 'tog-uselivepreview' => 'Jí nlé ntàkírí dí ndụ (Í gí nwé JavaScript) (mmètú kanyí lé)',
 'tog-forceeditsummary' => 'Gwam mgbè okwu nsem màkà orüm rürü a díghị',
 'tog-watchlisthideown' => 'Zonari orüm fwuör ndetu ihem ne lé',
@@ -304,7 +301,7 @@ $1',
 'pool-queuefull' => 'Pool kyu zùrù',
 'pool-errorunknown' => 'Nsogbu nke námaghi',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Maka {{SITENAME}}',
 'aboutpage' => 'Project:Ihe owù',
 'copyright' => 'Ihe di ime nọr okpúrụ $1',
@@ -314,7 +311,6 @@ $1',
 'disclaimers' => 'Ihe anyí chọrọ ki ma',
 'disclaimerpage' => 'Project:Ihe I kweshiri ma',
 'edithelp' => 'Inyetuáká I rüwa',
-'edithelppage' => 'Help: I rüwa',
 'helppage' => 'Help: Ihe di ime',
 'mainpage' => 'Ihü Mbu',
 'mainpage-description' => 'Ihü Mbu',
@@ -426,7 +422,6 @@ Orürü: $1<br />
 'editinginterface' => "'''Okwu egú:''' I na rü ihü né nyé ihu maka mkpurụ edemede nke eji-a-rü nka.
 Gbanwere më ihüa ga mètú ihu élélé nke onye-na-banife maka ndi ozor.
 Maka ikuwaria na asụsụ nke ozor, biko chetu I ji [//translatewiki.net/wiki/Main_Page?setlang=ig translatewiki.net], ihe orü MediaWiki di na ama ama.",
-'sqlhidden' => '(nchowa SQL zonari a zonari)',
 'namespaceprotected' => "I weghị ike I rüwa élu ihü nor na '''$1''' áháama.",
 'ns-specialprotected' => 'Ihü mkpà, a nweriki ru na ya.',
 
@@ -493,7 +488,7 @@ Biko meríáríá ya.',
 'newpassword' => 'Mkpurụ okwu ejị a gafẹ nke ohúrù',
 'retypenew' => 'Dechákwari mkpurụ okwu ejị a gafẹ nke ohúrù:',
 'resetpass_submit' => 'Bá okwu éjị gáfè na áhà Í bànyè',
-'resetpass_success' => 'Mkpurụ okwu ejị a gafẹ a gbanwere nke oma!
+'changepassword-success' => 'Mkpurụ okwu ejị a gafẹ a gbanwere nke oma!
 I na á banye...',
 'resetpass_forbidden' => 'Okwu éjị à gáfè enwéghịkị gabnwe',
 'resetpass-submit-loggedin' => 'Gbanwe okwu éjị à gáfe',
@@ -715,7 +710,6 @@ Okwu ụmà: '''({{int:cur}})''' = gbánwe na nké orü mbu, '''({{int:last}})''
 'viewprevnext' => 'Lé ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Màkà nchöwa',
 'searchmenu-new' => "'''Ké ihü \"[[:\$1]]\" na wiki nke á!'''",
-'searchhelp-url' => 'Help:Ihe di ime',
 'searchprofile-articles' => 'Ihü ihe dị',
 'searchprofile-project' => 'Ihü Nkwádo na Orürü',
 'searchprofile-images' => 'Nkaníle',
@@ -749,14 +743,6 @@ Nwàné ótù okwu íshí na ihe Í nè tú jí ''háníle:'' Í tuó ihe nílé
 'powersearch-toggleall' => 'Haníle',
 'powersearch-togglenone' => 'Efù',
 
-# Quickbar
-'qbsettings' => 'Mkpọrọ-ȯsȯ-ọsọ',
-'qbsettings-none' => 'Efù',
-'qbsettings-fixedleft' => 'Gbado na áká èkpè',
-'qbsettings-fixedright' => 'Gbado na áká ìkengà',
-'qbsettings-floatingleft' => 'Ne fé na áká èkpè',
-'qbsettings-floatingright' => 'Ne fé na áká nrí',
-
 # Preferences page
 'preferences' => 'Otu ha dosẹrẹ ihe',
 'mypreferences' => 'Otú m shị na dose ihem',
@@ -1022,8 +1008,6 @@ Ihü nọr na [[Special:Watchlist|ndétu ihe Í ne lé]] di na mkpụrụ edemed
 'statistics-views-total' => 'Há hụrụ ya olé níle',
 'statistics-users-active' => "Ọ'bànifé di galagala",
 
-'disambiguationspage' => 'Template:ọlúchịgị',
-
 'double-redirect-fixed-move' => '[[$1]] a puziele.
 Ubwa, o na ga [[$2]].',
 
@@ -1301,8 +1285,6 @@ Ngá bu ihe hé mèkwàrà nà ihü '''$1''':",
 'unblocklogentry' => 'àkwáchị gị $1',
 'block-log-flags-nocreate' => "Í ké ọ'bànifé bàchìrì",
 'block-log-flags-noemail' => 'ha kwàchịrị e-mail',
-'blockme' => 'Kwàchím',
-'proxyblocksuccess' => 'Ọméchá.',
 
 # Developer tools
 'lockdb' => 'Gbàchí uche nsónùsòrò',
@@ -1524,7 +1506,7 @@ Nke ozor gí zonari na áká onwe ha.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Àsáa',
 'exif-imagelength' => 'Ógólógó',
 'exif-orientation' => 'Ívú nà àsáa',
@@ -1695,11 +1677,6 @@ Nke ozor gí zonari na áká onwe ha.
 'version-entrypoints-header-entrypoint' => 'Ébé ọ̀bụ̀bà',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Uzọ usòrò',
-'filepath-page' => 'Usòrò:',
-'filepath-submit' => 'Gá',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Áhà usòrò:',
 'fileduplicatesearch-submit' => 'Chọwa',
diff --git a/languages/messages/MessagesIk.php b/languages/messages/MessagesIk.php
index 70c37329..65eb8163 100644
--- a/languages/messages/MessagesIk.php
+++ b/languages/messages/MessagesIk.php
@@ -7,31 +7,16 @@
  * @ingroup Language
  * @file
  *
- * @author Emperyan
  * @author Hercule
  * @author Zanimum (on ik.wikipedia.org)
  */
 
 $messages = array(
-# Dates
-'january' => 'Siqiññaatchiaq',
-'february' => 'Siqiññaasugruk',
-'march' => 'Paniqsiivik',
-'april' => 'Tiŋmirrat Tatqiat',
-'may_long' => 'Suvluġvik',
-'june' => 'Iġñivik',
-'july' => 'Isavik',
-'august' => 'Tiŋŋivik',
-'september' => 'Niġlaalgit Tiŋŋiviat',
-'october' => 'Nuliaġvik',
-'november' => 'Quyyavik',
-'december' => 'Uvluiḷaq',
-
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'helppage' => 'Help:anniqsuiruq',
-'mainpage' => 'Makpiġaaq Kanna',
+'helppage'             => 'Help:anniqsuiruq',
+'mainpage'             => 'Makpiġaaq Kanna',
 'mainpage-description' => 'Makpibaaq Kanna',
-'portal-url' => 'Project:qargi',
+'portal-url'           => 'Project:qargi',
 
 # Search results
 'searchhelp-url' => 'Help:anniqsuiruq',
diff --git a/languages/messages/MessagesIke_cans.php b/languages/messages/MessagesIke_cans.php
index 95f36016..8cea6d07 100644
--- a/languages/messages/MessagesIke_cans.php
+++ b/languages/messages/MessagesIke_cans.php
@@ -143,6 +143,8 @@ $messages = array(
 'editinginterface' => "'''ᐃᓂᖅᑎᕈᑎ—''' ᐋᕼᐊ ᓱᖁᓯᖅᐹ ᐃᑭᐊᖅ ᒪᑉᐱᑕᖅ ᐊᑐᐃᓐᓇᓯᕗᖅ ᐄᔭᑦᓴᖅ ᖃᕋᓴᐅᔭᖅ ᑕᖅᓴᓕᖅᐹ ᐃᑭᐊᖅ ᐊᕿᑦᑐᖅ ᖃᕆᑕᐅᔭᐅᑉ ᑎᑎᕋᕐᕕᖓ. ᐊᓯᐊᙳᑐᖅ ᐃᑭᐊᖅ ᒪᑉᐱᑕᖅ ᐃᓄᒃᑎᑐᑦ ᐅᐃᑭᐱᑎᐊ ᐊᓪᓚᖑᖅᑐᐊᖅ ᓇᑭᒪᖅᐳᖅ ᖃᑕᙳᑎ.",
 
 # Login and logout pages
+'welcomecreation' => "== ᐊᕆᐅᙵᐃᐹ, $1! ==
+ᐱᒋᕗᖅ ᖃᑕᙳᑎ ᐅᐃᑭᐱᑎᐊ ᑮᓇᐅᔭᖁᑎᖃᕐᕕᒃ ᐃᓱᐃᓪᓕᖓᐃᑦᔭᐹ. ᐃᖅᑑ ᓱᖁᓯᖅᐹ {{SITENAME}} ᐃᓐᓂᐊᑐᖅ «''ᓂᐱ ᐊᒥ''»",
 'yourname' => 'ᐅᐃᑭᐱᑎᐊ ᐊᑎᖅ',
 'yourpassword' => 'ᐅᐃᑭᐱᑎᐊ ᐸᓚᙵᓴᐅᑎ',
 'yourpasswordagain' => 'ᑕᒪᑐᒪᓃᖅᐹ ᐃᒃᓯᒐᖅᑐᖅ ᐅᐃᑭᐱᑎᐊ ᐸᓚᙵᓴᐅᑎ',
@@ -275,7 +277,7 @@ $messages = array(
 # Special:Categories
 'categories' => 'ᓄᐊᑉᐳᑦ',
 
-# Email user
+# E-mail user
 'emailuser' => 'ᑭᒍᑎᐅᑉ ᓯᑎᓂᖅᐹᖓ ᐃᓄᒃ',
 'emailfrom' => 'ᓇᑭᑦ',
 'emailmessage' => 'ᑭᒡᒐᐹ',
diff --git a/languages/messages/MessagesIke_latn.php b/languages/messages/MessagesIke_latn.php
index 79fe8922..4325b713 100644
--- a/languages/messages/MessagesIke_latn.php
+++ b/languages/messages/MessagesIke_latn.php
@@ -127,6 +127,8 @@ $messages = array(
 'editinginterface' => "'''iniqtiruti—''' aaha suqusiqpaa iqiak mappitaq atuinnasivuq iijatsaq qarasaujaq taqsaliqpaa ikiaq aqittuq qaritaujaup titirarvinga. asiaNngutuq ikiaq mappitaq inuktitut uikipitia allanguqtuaq nakimaqpuq qatannguti.",
 
 # Login and logout pages
+'welcomecreation' => "== ariunngaipaa, $1! ==
+pigivuq qatannguti uikipitia kiinaujaqutiqarvik isuillingaitjapaa. iqtuu suqusiqpa{{SITENAME}} inniatuq—«''nipi ami''»",
 'yourname' => 'uikipitia atiq',
 'yourpassword' => 'uikipitia palanngasauti',
 'yourpasswordagain' => 'tamatumaniiqpaa iksigaqtuq uikipitia palanngasauti',
@@ -248,7 +250,7 @@ $messages = array(
 # Special:Categories
 'categories' => 'nuapput',
 
-# Email user
+# E-mail user
 'emailfrom' => 'nakit',
 'emailmessage' => 'kiggapaa',
 'emailsend' => 'qiutsavigivaa',
diff --git a/languages/messages/MessagesIlo.php b/languages/messages/MessagesIlo.php
index 492f0a1b..3449654f 100644
--- a/languages/messages/MessagesIlo.php
+++ b/languages/messages/MessagesIlo.php
@@ -65,9 +65,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ipakita ti bilang dagiti agbuybuya nga agar-aramat',
 'tog-oldsig' => 'Ti adda a pirma:',
 'tog-fancysig' => 'Tratuen ti pirma a kas wikitext (nga awan ti automatiko a panagsilpo)',
-'tog-externaleditor' => 'Isigud ti panag-usar iti ruar a pnag-urnos (para dagiti eksperto laeng, masapul ti nangruna a kasasaad a panagikabil idiay kompiutermo. [//www.mediawiki.org/wiki/Manual:External_editors Adu pay a pakaammo.])',
-'tog-externaldiff' => 'Isigud ti panag-usar iti ruar a  sabali (para dagiti eksperto laeng, masapul ti nangruna a kasasaad a panagikabil idiay kompiutermo. [//www.mediawiki.org/wiki/Manual:External_editors Adu pay a pakaammo.])',
-'tog-showjumplinks' => 'Pakabaelan a "lumaktaw kadagiti" naipalaka a pagserkan a silpo',
 'tog-uselivepreview' => 'Usaren ti agdama a panagipadas (eksperimento)',
 'tog-forceeditsummary' => 'Pakaammuannak no sumrek ti blanko a pakabuklan ti panag-urnos',
 'tog-watchlisthideown' => 'Ilemmeng dagiti inurnosko manipud ti listaan ti bambantayan',
@@ -80,6 +77,8 @@ $messages = array(
 'tog-diffonly' => 'Saan nga iparang ti linaon ti panid dita baba dagiti pagiddiatan',
 'tog-showhiddencats' => 'Ipakita dagiti nailemmeng a kategoria',
 'tog-norollbackdiff' => 'Laksiden ti paggiddiatan kalpasan ti panagaramid ti panagisubli',
+'tog-useeditwarning' => 'Pakaunaannak no pumanawak iti maysa pagurnosan a panid no adda ti saan a naidulin a sinuksukatan',
+'tog-prefershttps' => 'Kankanayon nga agusar ti natalged a pannakaisilpo no nakastrek',
 
 'underline-always' => 'Kanayon',
 'underline-never' => 'Saan uray kaanoman',
@@ -143,6 +142,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nob',
 'dec' => 'Dis',
+'january-date' => 'Enero $1',
+'february-date' => 'Pebrero $1',
+'march-date' => 'Marso $1',
+'april-date' => 'Abril $1',
+'may-date' => 'Mayo $1',
+'june-date' => 'Hunio $1',
+'july-date' => 'Hulio $1',
+'august-date' => 'Agosto $1',
+'september-date' => 'Septiembre $1',
+'october-date' => 'Oktubre $1',
+'november-date' => 'Nobiembre $1',
+'december-date' => 'Disiembre $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategoria|Katkategoria}}',
@@ -224,6 +235,7 @@ $messages = array(
 'create-this-page' => 'Aramidem daytoy a panid',
 'delete' => 'Ikkaten',
 'deletethispage' => 'Ikkaten daytoy a panid',
+'undeletethispage' => 'Isubli ti pannakaikkat daytoy a panid',
 'undelete_short' => 'Isubli ti pannakaikkat {{PLURAL:$1|ti maysa a naurnos|dagiti $1 a naurnos}}',
 'viewdeleted_short' => 'Kitaen {{PLURAL:$1|ti maysa a naikkat a naurnos|dagiti $1 a naikkat a naurnos}}',
 'protect' => 'Salakniban',
@@ -267,7 +279,7 @@ $1',
 'pool-queuefull' => 'Napunnon ti nagyanan ti pagur-urayan',
 'pool-errorunknown' => 'Di am-ammo a biddut',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Maipanggep ti {{SITENAME}}',
 'aboutpage' => 'Project:Maipanggep',
 'copyright' => 'Ti linaon ket magun-od babaen ti $1 malaksid no adda sabali a naibaga.',
@@ -277,7 +289,6 @@ $1',
 'disclaimers' => 'Dagiti renunsia',
 'disclaimerpage' => 'Project:Sapasap a renunsia',
 'edithelp' => 'Tulong ti panag-urnos',
-'edithelppage' => 'Help:Panag-urnos',
 'helppage' => 'Help:Dagiti linaon',
 'mainpage' => 'Umuna a Panid',
 'mainpage-description' => 'Umuna a Panid',
@@ -355,17 +366,12 @@ Masarakan ti listaan dagiti umisu nga espesial a pampanid iti [[Special:SpecialP
 # General errors
 'error' => 'Biddut',
 'databaseerror' => 'Biddut iti database',
-'dberrortext' => 'Adda napasamak a biddut ti nakaibatayan ti datos a panagsapul ti gramatika.
-Adda ngata kiteb iti sopwer.
-Ti kinaudi a panagipadas ti panagsapul ti nakaibatayan ti datos ket:
-<blockquote><code>$1</code></blockquote>
-naggapu ti uneg ti pamay-an "<code>$2</code>".
-Ti nakaibatayan ti datos ket nangipatulod ti biddut "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Adda biddut ti database ti gramatika a panagsapul.
-Ti kinaudi a panagsapul ti database ket:
-"$1"
-naggapu ti uneg ti opisio "$2".
-Ti database ket nangipatulod ti biddut "$3: $4".',
+'databaseerror-text' => 'Adda napasamak a biddut ti usisa ti database.
+Daytoy ket mabalin a mangibagbaga ti parikut ti sopwer.',
+'databaseerror-textcl' => 'Adda napasamak a biddut ti usisa ti database.',
+'databaseerror-query' => 'Usisa: $1',
+'databaseerror-function' => 'Annong: $1',
+'databaseerror-error' => 'Biddut: $1',
 'laggedslavemode' => "'''Ballaag:''' Ti panid ket mabalin a saan nga aglaon kadagiti kinaudi a panagpabaro.",
 'readonly' => 'Narikepan ti database',
 'enterlockreason' => 'Agikabil ti rason para iti pannakarikep, agraman ti maysa a karkulo no kaanonto a maluktan',
@@ -400,6 +406,7 @@ Amangan no adda sabali a nangikkaten.',
 'cannotdelete-title' => 'Saan a maikkat ti panid  "$1"',
 'delete-hook-aborted' => 'Inukas ti kawit ti panagborra.
 Awan ti intedna a palawag.',
+'no-null-revision' => 'Saan a makaaramid ti awan serbina a panagbaliw para iti panid "$1"',
 'badtitle' => 'Madi a titulo',
 'badtitletext' => 'Ti kiniddaw idi a titulo ti panid ket imbalido, blanko, wenno maysa a saan nga husto a naisilpo a silpo ti pagsasao wenno interwiki a titulo.
 Mabalin nga aglaon ti a maysa wenno ad-adu a karakter a saan a mausar kadagiti titulo.',
@@ -423,12 +430,15 @@ Ti aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,
 'editinginterface' => "'''Ballaag:''' Ur-urnosem ti maysa a panid a maar-aramat a mangted iti testo ti interface para iti sopwer.
 Dagiti panagsukat iti daytoy a panid ket maarigan ti langa ti panagaramat nga interface dagiti sabali nga agar-aramat iti daytoy a wiki.
 Ti aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
-'sqlhidden' => '(Nailemmeng ti SQL a panagbiruk)',
 'cascadeprotected' => 'Daytoy a panid ket nasalakniban para iti panag-urnos ngamin ket nairaman kadagiti sumaganad {{PLURAL:$1|a panid, a|a pampanid, a}} nasalakniban nga adda ti napili nga "agsariap"  :
 $2',
 'namespaceprotected' => "Awan ti pammalubosmo nga agurnos kadagiti panid iti '''$1''' a nagan ti espasio.",
 'customcssprotected' => 'Awan ti pammalubosmo nga agurnos iti daytoy panid ti CSS, ngamin ket adda linaonna a tagikua dagiti agar-aramat ti sabali a kasasaad.',
 'customjsprotected' => 'Awan ti pammalubosmo nga agurnos iti daytoy a panid ti JavaScript, ngamin ket adda linaonna a tagikua dagiti agar-aramat ti sabali a kasasaad.',
+'mycustomcssprotected' => 'Awan pammalubosmo nga agurnos iti daytoy a panid ti CSS.',
+'mycustomjsprotected' => 'Awan pammalubosmo nga agurnos iti daytoy a panid ti JavaScript.',
+'myprivateinfoprotected' => 'Awan pammalubosmo nga agurnos iti pribado a pakaammom.',
+'mypreferencesprotected' => 'Awan pammalubosmo nga agurnos kadagiti kakaykayatam.',
 'ns-specialprotected' => 'Saan a mabalin nga urnosen dagiti espesial a panid.',
 'titleprotected' => "Daytoy a titulo ket nasalakniban manipud ti panakapartuat babaen ni [[User:$1|$1]].
 Ti naited a rason ket ''$2''.",
@@ -453,10 +463,19 @@ Laglagipen nga adda met dagiti panid nga agtultuloy a maiparang a kasla nakastre
 'welcomecreation-msg' => 'Naaramiden ti pakabilangam.
 Dimo liplipatan a sukatan dagiti kakaykayatam idiay [[Special:Preferences|{{SITENAME}} kakaykayatan]].',
 'yourname' => 'Nagan ti agar-aramat:',
+'userlogin-yourname' => 'Nagan ti agar-aramat',
+'userlogin-yourname-ph' => 'Ikabil ti naganmo nga agar-aramat',
+'createacct-another-username-ph' => 'Ikabil ti nagan ti agar-aramat',
 'yourpassword' => 'Kontrasenias:',
+'userlogin-yourpassword' => 'Kontrasenias',
+'userlogin-yourpassword-ph' => 'Ikabilmo ti kontrasenias',
+'createacct-yourpassword-ph' => 'Agikabil ti kontrasenias',
 'yourpasswordagain' => 'Uliten ti kontrasenias:',
+'createacct-yourpasswordagain' => 'Pasingkedan ti kontrasenias',
+'createacct-yourpasswordagain-ph' => 'Ikabil manen ti kontrasenias',
 'remembermypassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (para iti kapaut iti $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}})',
-'securelogin-stick-https' => 'Agyanka a nakasilpo iti HTTPS kalpasan no nakastrekka',
+'userlogin-remembermypassword' => 'Taginayonennak nga iserrek',
+'userlogin-signwithsecure' => 'Usaren ti natalged a pannakaisilpo',
 'yourdomainname' => 'Ti bukodmo a pagturayan:',
 'password-change-forbidden' => 'Saanmo a mabalin ti mangbaliw kadagiti kontrasenias iti daytoy a wiki.',
 'externaldberror' => 'Adda biddut idi ti panakapasingked ti database wenno saanmo a mabalin ti agpabaro ti bukodmo nga akin-ruar a pakabilangan.',
@@ -468,18 +487,41 @@ Dimo liplipatan a sukatan dagiti kakaykayatam idiay [[Special:Preferences|{{SITE
 'logout' => 'Rummuar',
 'userlogout' => 'Rummuar',
 'notloggedin' => 'Saan a nakastrek',
+'userlogin-noaccount' => 'Awan ti pakabilangam?',
+'userlogin-joinproject' => 'Tumipon iti {{SITENAME}}',
 'nologin' => 'Awan pakabilangam? $1.',
 'nologinlink' => 'Agaramid ti pakabilangan',
 'createaccount' => 'Agaramid ti pakabilangan',
 'gotaccount' => 'Addaanka kadin ti pakabilangam? $1.',
 'gotaccountlink' => 'Sumrek',
 'userlogin-resetlink' => 'Nalipatam dagiti salaysay ti pagserrekmo?',
+'userlogin-resetpassword-link' => 'Iyasentar manen ti kontrasenias',
+'helplogin-url' => 'Help:Panagserrek',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Tulong iti panagserrek]]',
+'createacct-join' => 'Ikabil ti pakaammom dita baba.',
+'createacct-another-join' => 'Ikabil ti pakaammo ti baro a pakabilangan dita baba.',
+'createacct-emailrequired' => 'Esurat a pagtaengan',
+'createacct-emailoptional' => 'Esurat a pagtaengan (pagpilian)',
+'createacct-email-ph' => 'Ikabil ti esurat a pagtaengam',
+'createacct-another-email-ph' => 'Ikabil ti esurat a pagtaengan',
 'createaccountmail' => 'Agusar ti pugto a temporario a kontrasenias ken ipatulod idiay naisangayan nga esurat a pagtaengan',
+'createacct-realname' => 'Pudno a nagan (pagpilian)',
 'createaccountreason' => 'Rason:',
+'createacct-reason' => 'Rason',
+'createacct-reason-ph' => 'Apay nga agparpartuatka manen ti sabali a pakabilangan',
+'createacct-captcha' => 'Panagkita ti seguridad',
+'createacct-imgcaptcha-ph' => 'Ikabil ti testo a makitam dita ngato',
+'createacct-submit' => 'Partuatem ti pakabilangam',
+'createacct-another-submit' => 'Agaramid pay ti sabali a pakabilangan',
+'createacct-benefit-heading' => 'Ti {{SITENAME}} ket inar-aramid babaen ti tattao a kasla kenka.',
+'createacct-benefit-body1' => '{{PLURAL:$1|nga inurnos|nga inur-urnos}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|a panid|a pampanid}}',
+'createacct-benefit-body3' => 'nga agdama a {{PLURAL:$1|nagparawad|nagparparawad}}',
 'badretype' => 'Saan nga agpada dagiti inkabilmo a kontrasenias.',
 'userexists' => 'Maus-usaren ti inkabilmo a nagan.
 Pangngaasi nga agpilika ti sabali a nagan.',
 'loginerror' => 'Biddut ti iseserrek',
+'createacct-error' => 'Biddut ti panagpartuat ti pakabilangan',
 'createaccounterror' => 'Saan a makaaramid ti pakabilangan: $1',
 'nocookiesnew' => 'Naaramid ti pakabilangan ti agar-aramat, ngem saanka a nakastrek.
 Ti {{SITENAME}} ket agus-usar kadagiti "galietas" tapno maiserrek dagiti agar-aramat.
@@ -548,10 +590,12 @@ Nasken a sumrekka ken sukatam ti kontraseniasmo tattan.
 Mabalinmo ti saan a mangikaskaso ti daytoy a mensahe, no biddut a naaramid daytoy a pakabilangan.',
 'usernamehasherror' => 'Ti nagan ti agar-aramat ket nasken a saan nga aglaon kadagiti "hash" a karakter',
 'login-throttled' => 'Adu unay ti panagpadasmo a sumrek.
-Pangaasi nga agurayka sakbay nga agipadas manen.',
+Pangngaasi nga agurayka ti $1 sakbay a padasem manen.',
 'login-abort-generic' => 'Napaay ti panagserrekmo - Napasardeng',
 'loginlanguagelabel' => 'Pagsasao: $1',
 'suspicious-userlogout' => 'Naiparit ti panagkiddawmo a rummuar ngamin ket kasla inpatulod ti nadadael a panagbasabasa wenno pannakaidulin a pannakbagi.',
+'createacct-another-realname-tip' => 'Saan a nasken ti pudno a nagan.
+No kayatmo nga ited, mausarto daytoy para iti panangited ti pammadayaw para kadagiti obrada.',
 
 # Email sending
 'php-mail-error-unknown' => 'Di ammo a biddut ti surat ti PHP() nga annong.',
@@ -567,9 +611,7 @@ Tapno malpaska a makastrek, nasken a mangikabilka ti baro a kontrasenias ditoy:'
 'newpassword' => 'Baro a kontrasenias:',
 'retypenew' => 'Imakinilya manen ti baro a kontrasenias:',
 'resetpass_submit' => 'Ikabil ti kontrasenias ken sumrek',
-'resetpass_success' => 'Nagballigi a nabaliwan ti kontrasenias mo! 
-</br>
-Iserrek kan...',
+'changepassword-success' => 'Balligi a nasukatan ti kontraseniasmo!',
 'resetpass_forbidden' => 'Saan a masukatan dagiti kontrasenias',
 'resetpass-no-info' => 'Masapul a nakastrekka tapno dagus a makapanka iti daytoy a panid.',
 'resetpass-submit-loggedin' => 'Sukatan ti kontrasenias',
@@ -581,10 +623,11 @@ Mabalin a nagballigi ti panagsukatmo ti kontrasenias wenno nagkiddaw ti baro a t
 
 # Special:PasswordReset
 'passwordreset' => 'Iyasentar manen ti kontrasenias',
-'passwordreset-text' => 'Lippasem daytoy a porma tapno maidisso manen ti bukodmo a kontrasenias.',
+'passwordreset-text-one' => 'Lippasem daytoy a porma tapno maiyasentar manen ti bukodmo a kontrasenias.',
+'passwordreset-text-many' => '{{PLURAL:$1|Agikabil ti maysa kadagiti pagikabilan tapno maiyasentar manen ti bukodmo a kontrasenias.}}',
 'passwordreset-legend' => 'Iyasentar manen ti kontrasenias',
 'passwordreset-disabled' => 'Nabaldado dagiti panangiyasentar manen ti kontrasenias iti daytoy a wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ikabil ti maysa a piraso ti datos dita baba}}',
+'passwordreset-emaildisabled' => 'Dagiti langa ti esurat ket nabaldado iti daytoy a wiki.',
 'passwordreset-username' => 'Nagan ti agar-aramat:',
 'passwordreset-domain' => 'Pagturayan:',
 'passwordreset-capture' => 'Kitaen ti nagbanagan ti esurat?',
@@ -614,7 +657,7 @@ agtuloykan nga agusar ti daan a kontraseniasmo.',
 Temporario a kontrasenias: $2',
 'passwordreset-emailsent' => 'Ti maysa nga esurat ti panangiyasentar manen ti kontrasenias ket naipatuloden.',
 'passwordreset-emailsent-capture' => 'Ti maysa nga esurat ti panangiyasentar manen ti kontrasenias ket naipatuloden, a napaikita dita baba.',
-'passwordreset-emailerror-capture' => 'Ti maysa nga esurat ti panangidisso manen ti kontrasenias ket naaramiden, a napaikita dita baba, ngem napaay a napaitulod iti agar-aramat: $1',
+'passwordreset-emailerror-capture' => 'Naaramid ti maysa nga esurat a panangyasentar manen ti kontrasenias, a napaikita dita baba, ngem ti panangitulod kenni {{GENDER:$2|agar-aramat}} ket napaay: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Sukatan ti esurat a pagtaengan',
@@ -628,6 +671,19 @@ Temporario a kontrasenias: $2',
 'changeemail-submit' => 'Sukatan ti esurat',
 'changeemail-cancel' => 'Ukasen',
 
+# Special:ResetTokens
+'resettokens' => 'Iyasentar manen dagiti tandaan',
+'resettokens-text' => 'Mabalinmo nga iyasentar dagiti tandaan a mangpalubos ti panagserrek ti naisangayan a pribado datos a mainaig ti pakabilangam ditoy.
+
+Aramidem daytoy no aksidente nga inbingaymo dagitoy iti sabali wenno ti pakabilangam ket nakomprimiso.',
+'resettokens-no-tokens' => 'Awan dagiti maiyasentar manen a tandaan.',
+'resettokens-legend' => 'Iyasentar manen dagiti tandaan',
+'resettokens-tokens' => 'Dagiti tandaan:',
+'resettokens-token-label' => '$1 (agdama a pateg: $2)',
+'resettokens-watchlist-token' => 'Tandaan para iti pakan ti web (Atom/RSS) kadagiti [[Special:Watchlist|panagbalbaliw ti pampanid idiay bambantayam]]',
+'resettokens-done' => 'Naiyasentar manen dagiti tandaan.',
+'resettokens-resetbutton' => 'Iyasentar manen  dagiti napili a tandaan',
+
 # Edit page toolbar
 'bold_sample' => 'Napuskol a testo',
 'bold_tip' => 'Napuskol a testo',
@@ -834,12 +890,15 @@ Awan ti intedna a palawag.',
 Kasla met naikkaten.',
 'edit-conflict' => 'Adda kasinnungat ti panag-urnos.',
 'edit-no-change' => 'Ti inurnosmo ket saan a naikaskaso, ngamin ket awan ti nasukatan a testo.',
+'postedit-confirmation' => 'Ti inurnosmo ket naidulinen.',
 'edit-already-exists' => 'Saan a makaaramid ti baro a panid.
 Adda met daytoyen.',
 'defaultmessagetext' => 'Kasisigud a testo ti mensahe',
 'content-failed-to-parse' => 'Napaay a nausig ti $2 a linaon para iti $1 a modelo: $3',
 'invalid-content-data' => 'Imbalido a datos ti linaon',
 'content-not-allowed-here' => 'Ti "$1" a linaon ket saan a maipalubos idiay panid ti [[$2]]',
+'editwarning-warning' => 'Ti ipapanaw ti daytoy a panid ket makapataud ti panakapukaw kadagiti aniaman a binalbaliwam.
+No nakastrekka, mabalinmo nga ibaldado daytoy a ballaag idiay "Panagurnos" a paset kadagiti kakaykayatam.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -875,6 +934,7 @@ Pangngaasi a kitaen ti pagipadaan dita baba tapno maamuan no agpaypayso ti kayat
 'undo-failure' => 'Ti inurnos ket saan a maipasubli gaputa adda dagiti nakisinnungat a patingnga a naurnos.',
 'undo-norev' => 'Saan a maibabawi ti naurnos ngamin ket awan daytoy wenno mabalin a naikkaten.',
 'undo-summary' => 'Ibabawi ti $1 a binaliwan babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]])',
+'undo-summary-username-hidden' => 'Isubli ti $1 a binaliwan babaen ti nailemmeng nga agar-aramat',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Saan a makaaramid ti pakabilangan',
@@ -1056,6 +1116,7 @@ Usaren ti radio a buton a tukol ti pinagtipon iti laeng panagbaliw a naaramid id
 'compareselectedversions' => 'Ipada dagiti pinili a binaliwan',
 'showhideselectedversions' => 'Ipakita/ilemmeng dagiti napili a nabaliwan',
 'editundo' => 'ibabawi',
+'diff-empty' => '(Awan ti paggiddiatan)',
 'diff-multi' => '({{PLURAL:$1|Maysa nga agtengnga a panangbalbaliw|Dagiti $1 nga agtennga a panangbalbaliw}} babaen {{PLURAL:$2|ti agararamat|dagiti $2 nga agararamat}} ti saan a naipakita)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Maysa nga agtengnga a panangbalbaliw|Dagiti $1 nga agtengnga a panangbalbaliw}} babaen ti ad-adu ngem $2 {{PLURAL:$2|nga agar-aramat|kadagiti agar-aramat}} ti saan a naipakita)',
 'difference-missing-revision' => '{{PLURAL:$2|Maysa a panagbalbaliw|$2 kadagiti panagbalbaliw}} iti daytoy a paggiddiatan ($1) {{PLURAL:$2|ket ti|ket dagiti}} saan a naburikan.
@@ -1083,7 +1144,6 @@ Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete
 'searchmenu-legend' => 'Pagpilian ti panagbiruk',
 'searchmenu-exists' => "'''Adda panid a nanaganan ti \"[[:\$1]]\" iti daytoy a wiki.'''",
 'searchmenu-new' => "'''Partuaten ti panid ti \"[[:\$1]]\" iti daytoy a wiki!'''",
-'searchhelp-url' => 'Help:Dagiti linaon',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Kitaem dagiti panid nga adda kastoy a naipasaruno]]',
 'searchprofile-articles' => 'Dagiti naglaon a panid',
 'searchprofile-project' => 'Tulong ken Gandat a pampanid',
@@ -1127,15 +1187,7 @@ Padasem a  pasarunuan ti panagbiruk mo ti ''all:'' tapno birukem amin a nagyan (
 'searchdisabled' => 'Ti panagbiruk iti {{SITENAME}} ket nabaldado.
 Mabalinmo ti agbiruk idiay Google tattan.
 Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Awan',
-'qbsettings-fixedleft' => 'Agyan latta iti kanigid',
-'qbsettings-fixedright' => 'Agyan latta iti kanawan',
-'qbsettings-floatingleft' => 'Tumpaw ti kanigid',
-'qbsettings-floatingright' => 'Tumpaw ti kanawan',
-'qbsettings-directionality' => 'Nasimpa, gapu laeng ti papanan ti panagsurat ti pagsasaom',
+'search-error' => 'Adda maysa a biddut  napasamak bayat nga agbirbiruk:$1',
 
 # Preferences page
 'preferences' => 'Kakaykayatan',
@@ -1169,7 +1221,6 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
 'resetprefs' => 'Dalusan dagiti saan a naidulin a sinuksukatan',
 'restoreprefs' => 'Isubli amin dagiti kasisigud a pannakaiyasentar (kadagiti amin a paset)',
 'prefs-editing' => 'Ur-urnosen',
-'prefs-edit-boxsize' => 'Kadakkel ti tawa ti panag-urnos.',
 'rows' => 'Ar-aray:',
 'columns' => 'Tuk-tukol:',
 'searchresultshead' => 'Biruken',
@@ -1180,10 +1231,9 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
 'recentchangesdays-max' => 'Kapaut nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}',
 'recentchangescount' => 'Dagiti bilang dagiti naurnos a kinasigud a maiparang:',
 'prefs-help-recentchangescount' => 'Nairaman dagiti kinaudian a baliwan, dagiti pakasaritaan ti panid, ken dagiti listaan.',
-'prefs-help-watchlist-token' => 'No ikkam daytoy pagikabilan ti sekreto a tulbek, agaramid ti pakan a RSS para ti binambantayam.
-No adda makaammo daytoy a tulbek ditoy a pagikabilan ket mabalin da a basaen ti binambantayam, masapul nga agpilika ti pateg a seguridad.
-
-Adda ditoy ti pugto a pateg a mausarmo: $1',
+'prefs-help-watchlist-token2' => 'Daytoy ti sekreto a tulbek iti pakan ti web iti listaan ti banbantayam.
+Ti sinoman a makaammo daytoy ket mabalinda a basaen ti listaan ti banbantayam, isunga saanmo nga ipabingay.
+[[Special:ResetTokens|Pindutem ditoy no kayatmo nga iyasentar manen]].',
 'savedprefs' => 'Naidulinen dagiti kakaykayatam.',
 'timezonelegend' => 'Sona ti oras:',
 'localtime' => 'Lokal nga oras:',
@@ -1214,7 +1264,6 @@ Adda ditoy ti pugto a pateg a mausarmo: $1',
 'prefs-reset-intro' => 'Mabalinmo nga usaren daytoy a panid tapno maisublim dagita kakaykayatam iti kasisigud ti daytoy a wiki.
 Ngem saanto a mabalinen nga ipasubli.',
 'prefs-emailconfirm-label' => 'Pammasingked ti esurat:',
-'prefs-textboxsize' => 'Ti kadakkel ti pagurnosan a tawa',
 'youremail' => 'Esurat:',
 'username' => '{{GENDER:$1|Nagan ti agar-aramat}}:',
 'uid' => 'ID ti {{GENDER:$1|Agar-aramat}}:',
@@ -1250,6 +1299,8 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 'prefs-dateformat' => 'Kita ti petsa',
 'prefs-timeoffset' => 'Tangda ti oras',
 'prefs-advancedediting' => 'Dagiti sapasap a pagpilian',
+'prefs-editor' => 'Mannurat',
+'prefs-preview' => 'Ipadas',
 'prefs-advancedrc' => 'Dagiti napasayaat a pagpilian',
 'prefs-advancedrendering' => 'Dagiti napasayaat a pagpilian',
 'prefs-advancedsearchoptions' => 'Dagiti napasayaat a pagpilian',
@@ -1257,7 +1308,9 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 'prefs-displayrc' => 'Ipakita dagiti pagpilian',
 'prefs-displaysearchoptions' => 'Ipakita dagiti pagpilian',
 'prefs-displaywatchlist' => 'Ipakita dagiti pagpilian',
+'prefs-tokenwatchlist' => 'Tandaan',
 'prefs-diffs' => 'Sabali',
+'prefs-help-prefershttps' => 'Daytoy a kakaykayatan ket mapakabaelanto iti sumaruno nga iseserrekmo.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Ti esurat a pagtaengan ket kasla umiso',
@@ -1284,6 +1337,8 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 'userrights-notallowed' => 'Awan ti pammalubos nga agnayon wenno agikkat kadagiti karbengan ti agar-aramat.',
 'userrights-changeable-col' => 'Dagiti grupo a mabalinmo a baliwan',
 'userrights-unchangeable-col' => 'Dagiti grupo a dimo mabalin a baliwan',
+'userrights-conflict' => 'Suppiat dagiti panagbaliw kadagiti karbengan ti agar-aramat! Pangngaasi nga irepasom ken pasingkedam dagiti sinuksukatam.',
+'userrights-removed-self' => 'Nagballigika a nagikkat kadagiti karbengam. Isu a kastoyen ket saanmo a mabalin a pastrekan daytoy a panid.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1349,11 +1404,19 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 'right-proxyunbannable' => 'Labsan dagiti automatiko a serra dagiti pannakbagi',
 'right-unblockself' => 'Ikkaten ti kabukbukodan a pannaka-serra',
 'right-protect' => 'Sukatan dagiti agpang ti salaknib ken urnosen dagiti nasalakniban ti sariap a panid',
-'right-editprotected' => 'Urnosen dagiti nasalakniban a panid (nga awan ti sariap a salaknib")',
+'right-editprotected' => 'Urnosen dagiti panid a nasalakniban a kas "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Urnosen dagiti panid a nasalakniban a kas "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Urnosen ti "interface" ti agar-aramat',
 'right-editusercssjs' => 'Urnosen dagiti CSS ken JavaScript a papeles dagiti sabsabali nga agar-aramat',
 'right-editusercss' => 'Urnosen dagiti CSS a papeles dagiti sabsabali nga agar-aramat',
 'right-edituserjs' => 'Urnosen dagiti JavaScript a papeles dagiti sabsabali nga agar-aramat',
+'right-editmyusercss' => 'Urnosem dagiti bukodmo a papeles ti CSS ti agar-aramat',
+'right-editmyuserjs' => 'Urnosem dagiti bukodmo a papeles ti JavaScript ti agar-aramat',
+'right-viewmywatchlist' => 'Kitaem ti bukodmo a listaan ti banbantayan',
+'right-editmywatchlist' => 'Urnosem ti bukodmo a listaan ti agar-aramat. Laglagipen nga adda dagiti tignay a mangnayonto pay laeng ti pampanid urayno awan daytoy a karbengan.',
+'right-viewmyprivateinfo' => 'Kitaem ti bukodmo a pribado a datos (kasla ti esurat a pagtaengan, pudno a nagan)',
+'right-editmyprivateinfo' => 'Urnosem ti bukodmo a pribado a datos (kasla ti esurat a pagtaengan, pudno a nagan)',
+'right-editmyoptions' => 'Urnosem dagiti bukodmo a kakaykayatan',
 'right-rollback' => 'Pardasan nga ipasubli dagiti inurnos ti naudi nga agar-aramat a nagurnos ti kakasta a panid',
 'right-markbotedits' => 'Markaan dagiti napasubli nga urnos a kas inurnos dagiti bot',
 'right-noratelimit' => 'Saan a maaringan kadagiti patingga a pagpataray',
@@ -1415,12 +1478,19 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 'action-userrights-interwiki' => 'urnosen dagiti karbengan ti agar-aramat iti agar-aramat kadagiti sabsabali a wiki',
 'action-siteadmin' => 'kandaduan wenno lukatan daytoy "database"',
 'action-sendemail' => 'agipatulod kadagiti esurat',
+'action-editmywatchlist' => 'urnosem ti bukodmo a listaan ti banbantayan',
+'action-viewmywatchlist' => 'kitaem ti bukodmo a listaan ti banbantayan',
+'action-viewmyprivateinfo' => 'kitaem ti bukodmo a pribado a pakaammo',
+'action-editmyprivateinfo' => 'urnosem ti bukodmo a pribado a pakaammo',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|sinukatan|dagiti sinukatan}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|manipud idi naudi a panagsarungkar}}',
+'enhancedrc-history' => 'pakasaritaan',
 'recentchanges' => 'Kaudian a balbaliw',
 'recentchanges-legend' => 'Pagpilian kadagiti kaudian a balbaliw',
 'recentchanges-summary' => 'Siputen dagiti kinaudi a panagbalbaliw ti wiki iti daytoy a panid.',
+'recentchanges-noresult' => 'Awan ti nasuksukatan iti las-ud ti naited a paset ti panawen a kapada dagitoy a kriteria.',
 'recentchanges-feed-description' => 'Siputen dagiti kinaudi a panagbalbaliw ti wiki iti daytoy a pakan.',
 'recentchanges-label-newpage' => 'Daytoy a panag-urnos ket nakapartuat ti baro a panid',
 'recentchanges-label-minor' => 'Daytoy ket bassit a panag-urnos',
@@ -1457,7 +1527,6 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 'recentchangeslinked-feed' => 'Mainaig a sinukatan',
 'recentchangeslinked-toolbox' => 'Mainaig a sinuksukatan',
 'recentchangeslinked-title' => 'Sinukatan a mainaig iti "$1"',
-'recentchangeslinked-noresult' => 'Awan ti sinukatan kadagiti naisilpo a pampanid kabayatan ti naited a panawen.',
 'recentchangeslinked-summary' => "Listaan daytoy dagiti kaudian a sinukatan kadagiti pampanid a nakasilpo manipud iti maysa a napili a panid (wenno kadagiti kameng ti maysa a nainaganan a kategoria).
 Dagiti panid iti [[Special:Watchlist|listaan ti bambantayam]] ket '''napuskol'''.",
 'recentchangeslinked-page' => 'Nagan ti panid:',
@@ -1469,7 +1538,7 @@ Dagiti panid iti [[Special:Watchlist|listaan ti bambantayam]] ket '''napuskol'''
 'reuploaddesc' => 'Ukasen ti pag-ipan ken agsubli idiay kabuklan ti pag-ipan',
 'upload-tryagain' => 'Ited ti napabaro a panagipalawag ti papeles',
 'uploadnologin' => 'Saan a nakastrek',
-'uploadnologintext' => 'Masapul a [[Special:UserLogin|nakaserrekka]] tapno makaipanka iti papeles.',
+'uploadnologintext' => 'Nasken ti $1 tapno makaipanka iti papeles.',
 'upload_directory_missing' => 'Ti direktorio ti pag-ipan ($1) ket napukaw ken saan a mabalin nga aramiden iti webserver.',
 'upload_directory_read_only' => 'Ti pagipanan a direktoria ($1) ket saan a masuratan ti webserver.',
 'uploaderror' => 'Biddut ti panang-ipan',
@@ -1692,7 +1761,6 @@ Para iti kangatuan a talinaay, nabaldado ti img_auth.php.',
 'http-read-error' => 'Biddut ti panagbasa ti HTTP.',
 'http-timed-out' => 'Nagsardeng ti panagkiddaw ti HTTP.',
 'http-curl-error' => 'Biddut ti panagala ti URL: $1',
-'http-host-unreachable' => 'Di madanon ti URL',
 'http-bad-status' => 'Adda pakirut idi las-ud ti panagkiddaw ti HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1723,6 +1791,10 @@ Baka kayatmo a padasen no saan a makumikom nga oras.',
 'listfiles_size' => 'Kadakkel',
 'listfiles_description' => 'Panagipalpalawag',
 'listfiles_count' => 'Dagiti bersion',
+'listfiles-show-all' => 'Iraman dagiti daan a bersion dagiti ladawan',
+'listfiles-latestversion' => 'Agdama a bersion',
+'listfiles-latestversion-yes' => 'Wen',
+'listfiles-latestversion-no' => 'Saan',
 
 # File description page
 'file-anchor-link' => 'Papeles',
@@ -1819,6 +1891,13 @@ Laglagipem ti agkita kadagiti sabsabali a silpo ti plantilia sakbay nga ikkatem
 'randompage' => 'Pugto a panid',
 'randompage-nopages' => 'Awan ti pampanid iti sumaganad a {{PLURAL:$2|nagan ti espasio|nagnagan ti espasio}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Pugto a panid iti kategoria',
+'randomincategory-invalidcategory' => 'Ti "$1" ket saan nga umisu a nagan ti kategoria.',
+'randomincategory-nopages' => 'Awan ti pampanid iti [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Agala ti pugto a panid manipud ti kategoria: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Inkan',
+
 # Random redirect
 'randomredirect' => 'Pugto a baw-ing',
 'randomredirect-nopages' => 'Awan dagiti baw-ing iti daytoy a nagan ti espasio ti "$1".',
@@ -1844,17 +1923,13 @@ Laglagipem ti agkita kadagiti sabsabali a silpo ti plantilia sakbay nga ikkatem
 'statistics-users-active-desc' => 'Dagiti agar-aramat a nagtungpal ti aramid ti napalabas nga {{PLURAL:$1|aldaw|$1 nga al-aldaw}}',
 'statistics-mostpopular' => 'Kaaduan a nabuya a pampanid',
 
-'disambiguations' => 'Dagiti panid a nakasilpo kadagiti panangilawlawag a panid',
-'disambiguationspage' => 'Template:Panangilawlawag',
-'disambiguations-text' => "Dagiti sumaganad a panid ket aglaon ti saan a basbasit ngem maysa a silpo iti '''panangilawlawag a panid'''.
-Dagitoy ket embes a nasken a maisilpoda kadagiti maitutop a panid.<br />
-Ti panid ket matrato a kas panangilawlawag a panid no agusar ti plantilia a nakasilpo manipud idiay [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Pampanid nga adda maysa a tagikua ti panid',
 'pageswithprop-legend' => 'Pampanid nga adda maysa a tagikua ti panid',
 'pageswithprop-text' => 'Daytoy a panid ket ilistana ti pampanid nga agus-usar ti naisangayan a tagikua ti panid.',
 'pageswithprop-prop' => 'Nagan ti tagikua:',
 'pageswithprop-submit' => 'Inkan',
+'pageswithprop-prophidden-long' => 'atiddog a testo ti tagikua a nailemmeng ($1)',
+'pageswithprop-prophidden-binary' => 'binario a pateg ti tagikua a nailemmeng ($1)',
 
 'doubleredirects' => 'Dagiti namindua a naibaw-ing',
 'doubleredirectstext' => 'Daytoy a panid ket ilistana dagiti panid nga agbaw-ing kadagiti sabsabali a baw-ing a pampanid.
@@ -1913,6 +1988,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'mostrevisions' => 'Dagiti artikulo a kaaduan ti pannakabalbaliwna',
 'prefixindex' => 'Dagiti amin a panid nga addaan iti pasaruno',
 'prefixindex-namespace' => 'Amin a panid nga addaan ti pasaruno ($1 a nagan ti espasio)',
+'prefixindex-strip' => 'Ikkaten ti pasaruno iti listaan',
 'shortpages' => 'Dagiti ababa a panid',
 'longpages' => 'Dagiti atiddog a panid',
 'deadendpages' => 'Dagiti ngudo a panid',
@@ -1928,6 +2004,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'listusers' => 'Listaan dagiti agar-aramat',
 'listusers-editsonly' => 'Ipakita laeng dagiti agar-aramat nga adda inurnosda',
 'listusers-creationsort' => 'Ilasin no ania a petsa ti pannakaaramid',
+'listusers-desc' => 'Paglalasinen iti agpababa nga urnos',
 'usereditcount' => '$1 {{PLURAL:$1|nga inurnos|kadagiti inurnos}}',
 'usercreated' => '{{GENDER:$3|Inaramid}} idi $1 idi $2',
 'newpages' => 'Baro a pampanid',
@@ -2104,10 +2181,9 @@ Dagiti masakbayan a panagsukat iti daytoy a panid ken dagiti mainaig a tungtunga
 'unwatchthispage' => 'Isardeng a bantayan daytoy a panid',
 'notanarticle' => 'Saan a naglaon a panid',
 'notvisiblerev' => 'Ti panagbalbaliw ti sabali nga agar-aramat ket naikkaten',
-'watchnochange' => 'Awan dagiti binambantayam ket naurnos dita panawen a naipakita.',
 'watchlist-details' => '{{PLURAL:$1|$1 panid|$1 dagiti panid}} a bambantayam, saan a mairaman dagiti panid ti tungtungan.',
-'wlheader-enotif' => '* Napakabaelan ti pakiammo ti esurat.',
-'wlheader-showupdated' => "* Dagiti panid a nasukatan manipud ti kinaudi a panagsarungkarmo ket naipakita iti '''napuskol'''",
+'wlheader-enotif' => 'Napakabaelan ti panangipakaammo ti esurat.',
+'wlheader-showupdated' => "Dagiti panid a nasukatanen manipud ti kinaudi a panagsarungkarmo ket naipakita iti '''napuskol'''",
 'watchmethod-recent' => 'kitkitaen dagiti kinaudi nga inurnos kadagiti bambantayan a panid',
 'watchmethod-list' => 'kitkitaen dagiti bambantayan a panid kadagiti kinaudi nga inurnos',
 'watchlistcontains' => 'Ti listaan ti bambantayam ket aglaon ti $1 {{PLURAL:$1|a panid|a pampanid}}.',
@@ -2361,7 +2437,7 @@ $1',
 'contributions' => 'Naar-aramid ti {{GENDER:$1|Agar-aramat}}',
 'contributions-title' => 'Inar-aramid ti agar-aramat para kenni $1',
 'mycontris' => 'Naar-aramid',
-'contribsub2' => 'Para iti $1 ($2)',
+'contribsub2' => 'Para kenni {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Awan ti nasarakan a nasukatan a kapada daytoy a kita.',
 'uctop' => '(agdama)',
 'month' => 'Manipud iti bulan ti (ken nasapsapa pay):',
@@ -2520,15 +2596,13 @@ Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagi
 Ngem, nupay kasta, naserran a kas paset ti sakup ti $2, a mabalin a malukatan ti serrana.',
 'ip_range_invalid' => 'Imbalido a sakup ti IP.',
 'ip_range_toolarge' => 'Dagiti serra a nasakup a dakdakkel ngem /$1 ket saan a maipalubos.',
-'blockme' => 'Serraannak',
 'proxyblocker' => 'Pannakbagi a panagserra',
-'proxyblocker-disabled' => 'Daytoy a panagaramid ket nabaldado.',
 'proxyblockreason' => 'Ti IP a pagtaengam ket naserraan ngamin ket daytoy ket nakalukat a panakbagi.
 Pangngaasi ta kontakem ti agit-ited ti serbisio ti Internetmo wenno teknikal a suporta ti kaurnusam ken ibagam kaniada ti nakaro a parikut ti seguridad.',
-'proxyblocksuccess' => 'Nalpasen.',
 'sorbsreason' => 'Ti IP a pagtaengam ket nakalista a kasla "nalukatan a pannakbagi" idiay DNSBL nga inusar ti {{SITNAME}}.',
 'sorbs_create_account_reason' => 'Ti IP a pagtaengam ket nakalista a kasla "nalukatan a pannakbagi" idiay DNSBL nga inusar ti {{SITNAME}}.
 Saanka a makaaramid ti pakabilangan',
+'xffblockreason' => 'Ti maysa nga IP a pagtaengan nga adda iti X-Forwarded-For header, mabalin a kukuam wenno ti pannakbagi a server nga us-usarem, ket naserraan. Ti kasisigud a rason ti pannakaserra idi ket: $1',
 'cant-block-while-blocked' => 'Saanmo a maserraan dagiti sabali nga agar-aramat no naserraanka met.',
 'cant-see-hidden-user' => 'Ti agar-aramat a kayatmo a serraan ket naserraan ken nailemmeng.
 Ket awan met ti karbengam nga agilemming ti agar-aramat, saan mo a makita wenno mabaliwan ti serra ti agar-aramat.',
@@ -2695,6 +2769,8 @@ Pangngaasi a bisitaen ti [//www.mediawiki.org/wiki/Localisation Lokalisasion ti
 'thumbnail-more' => 'Padakkelen',
 'filemissing' => 'Napukaw ti papeles',
 'thumbnail_error' => 'Biddut ti panagaramid ti bassit a ladawan: $1',
+'thumbnail_error_remote' => 'Biddut a mensahe manipud ti $1: 
+$2',
 'djvu_page_error' => 'Ti DjVu a panid ket saan a nasakup',
 'djvu_no_xml' => 'Saan a naala ti XML iti DjVu a papeles',
 'thumbnail-temp-create' => 'Saan a makaaramid ti temporario a bassit a ladawan ti papeles',
@@ -2991,11 +3067,25 @@ No usarem daytoy, baka makompromiso ti sistema.",
 'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|$1 nga oras|$1 nga or-oras}}',
 'days' => '{{PLURAL:$1|$1 nga aldaw|$1 nga al-aldaw}}',
+'weeks' => '{{PLURAL:$1|$1 a lawas|$1 a law-lawas}}',
 'months' => '{{PLURAL:$1|$1 a bulan|$1 a bulbulan}}',
 'years' => '{{PLURAL:$1|$1 a tawen|$1 a tawtawen}}',
 'ago' => '$1 nagtapos',
 'just-now' => 'tatta laeng',
 
+# Human-readable timestamps
+'hours-ago' => '$1 nga {{PLURAL:$1|oras|or-oras}} ti napalabas',
+'minutes-ago' => '$1 a {{PLURAL:$1|minuto|minutos}} ti napalabas',
+'seconds-ago' => '$1 a {{PLURAL:$1|segundo|seg-segundo}} ti napalabas',
+'monday-at' => 'Lunes idiay $1',
+'tuesday-at' => 'Martes idiay $1',
+'wednesday-at' => 'Mierkoles idiay $1',
+'thursday-at' => 'Huebes idiay $1',
+'friday-at' => 'Biernes idiay $1',
+'saturday-at' => 'Sabado idiay $1',
+'sunday-at' => 'Dominggo idiay $1',
+'yesterday-at' => 'Idi kalman idiay $1',
+
 # Bad image list
 'bad_image_list' => 'Ti kinabuklan ket kas iti sumaganad:
 
@@ -3025,7 +3115,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Kaakaba',
 'exif-imagelength' => 'Katayag',
 'exif-bitspersample' => 'Dagiti bit tunggal maysa a komponente',
@@ -3202,7 +3292,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-originalimageheight' => 'Kangato ti imahen sakbay nga naputed',
 'exif-originalimagewidth' => 'Kalawa ti imahen sakbay nga naputed',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Saan a napespes',
 
 'exif-copyrighted-true' => 'Nakarbengan a kopia',
@@ -3593,7 +3683,6 @@ Mabalinmo pay nga [[Special:EditWatchlist|usaren ti dati a panagurnos]].',
 'version-other' => 'Sabali',
 'version-mediahandlers' => 'Agtengtengngel kadagiti midia',
 'version-hooks' => 'Dagiti kawit',
-'version-extension-functions' => 'Dagiti pagpaatiddog a pamay-an',
 'version-parser-extensiontags' => 'Dagiti parser a pagpaatiddog nga etiketa',
 'version-parser-function-hooks' => 'Parser a pamay-an dagiti kawit',
 'version-hook-name' => 'Nagan ti kawit',
@@ -3602,6 +3691,7 @@ Mabalinmo pay nga [[Special:EditWatchlist|usaren ti dati a panagurnos]].',
 'version-license' => 'Lisensia',
 'version-poweredby-credits' => "Daytoy a wiki ket pinaandar ti '''[//www.mediawiki.org/ MediaWiki]''', karbengan a kopia © 2001-$1 $2.",
 'version-poweredby-others' => 'dadduma pay',
+'version-poweredby-translators' => 'agipatpatarus ti translatewiki.net',
 'version-credits-summary' => 'Kayatmi koma a pammadayawan dagiti sumaganad a tao para kadagiti inparawadda iti [[Special:Version|MediaWiki]].',
 'version-license-info' => 'Ti MediaWiki ket nawaya a sopwer; maiwarasmo ken/wenno mabaliwam babaen ti banag iti GNU General Public License a naipablaak babaen ti Free Software Foundation; nupay iti bersion 2 iti Lisensia, wenno (ti panagpilim) ti  aniaman a bersion.
 
@@ -3615,12 +3705,17 @@ Naka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a
 'version-entrypoints-header-entrypoint' => 'Pagserrekan a puntos',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Dalanan ti papeles',
-'filepath-page' => 'Papeles:',
-'filepath-submit' => 'Inkan',
-'filepath-summary' => 'Daytoy nga espesial a panid ket agisubli ti kompleto a dalan ti papeles.
-Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti papeles ket dagus a mangrugida idiay nakairamananda a programa.',
+# Special:Redirect
+'redirect' => 'Ibaw-ing babaen ti papeles, agar-aramat, wenno ID ti panagbaliw',
+'redirect-legend' => 'Ibaw-ing iti papeles wenno panid',
+'redirect-summary' => 'Daytoy nga espesial a panid ket maibaw-ing iti papeles (iti nagan ti papeles), ti panid (iti ID ti panagbaliw), wenno ti panid ti agar-aramat (iti numeriko nga ID ti agar-aramat).',
+'redirect-submit' => 'Inkan',
+'redirect-lookup' => 'Kitaen:',
+'redirect-value' => 'Pateg:',
+'redirect-user' => 'ID ti agar-aramat',
+'redirect-revision' => 'Panagbaliw ti panid',
+'redirect-file' => 'Nagan ti papeles',
+'redirect-not-exists' => 'Saan a nabirukan ti pateg',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Agbiruk kadagiti duplikado a papeles',
@@ -3669,12 +3764,16 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
 'tags' => 'Umisu a sukatan dagiti etiketa',
 'tag-filter' => '[[Special:Tags|Ti etiketa]] a sagat:',
 'tag-filter-submit' => 'Sagat',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiketa|Et-etiketa}}]]: $2)',
 'tags-title' => 'Dagiti etiketa',
 'tags-intro' => 'Daytoy a panid ket ilistana dagiti etiketa nga usaren ti sopwer nga agmarka ti panag-urnos, ken dagiti kaibuksilanda.',
 'tags-tag' => 'Nagan ti etiketa',
 'tags-display-header' => 'Tabas dagiti listaan ti panagsukat',
 'tags-description-header' => 'Napno a panangipalpalawag iti kayatna a saoen.',
+'tags-active-header' => 'Aktibo?',
 'tags-hitcount-header' => 'Dagiti etiketa a sinukatan',
+'tags-active-yes' => 'Wen',
+'tags-active-no' => 'Saan',
 'tags-edit' => 'urnosen',
 'tags-hitcount' => '$1 {{PLURAL:$1|a sinukatan|kadagiti sinukatan}}',
 
@@ -3695,6 +3794,7 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
 'dberr-problems' => 'Pasensian a! Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
 'dberr-again' => 'Padasem ti agururay to manu a minutos ken agikarga.',
 'dberr-info' => '(Saan a makontak ti database server: $1)',
+'dberr-info-hidden' => '(Saan a makontak ti database server)',
 'dberr-usegoogle' => 'Padasem  ti agbiruk idiay Google tatta.',
 'dberr-outofdate' => 'Palagip a dagiti listaan da kadagiti kukuami a nagyan ket baka nagpaso.',
 'dberr-cachederror' => 'Daytoy ket naidulin a kopia ti kiniddawmo a panid, ken mabalin a saan a kabarbaro.',
@@ -3710,6 +3810,9 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
 'htmlform-submit' => 'Ited',
 'htmlform-reset' => 'Ibabawi ti sinukatan',
 'htmlform-selectorother-other' => 'Sabali',
+'htmlform-no' => 'Saan',
+'htmlform-yes' => 'Wen',
+'htmlform-chosen-placeholder' => 'Agpili ti pagpilian',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 adda ti suporta ti napno a testo ti panagbiruk',
@@ -3827,4 +3930,19 @@ Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mai
 # Image rotation
 'rotate-comment' => 'Ti ladawan ket napusipos babaen ti $1 {{PLURAL:$1|a degrado|a degdegrado}} nga agpakanawan',
 
+# Limit report
+'limitreport-title' => 'Panagbariweswes a datos ti parser:',
+'limitreport-cputime' => 'Panagusar nga oras ti CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|seg-segundo}}',
+'limitreport-walltime' => 'Pudno nga oras a panagusar',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|seg-segundo}}',
+'limitreport-ppvisitednodes' => 'Nabisita a bilang ti nodo ti preproseso',
+'limitreport-ppgeneratednodes' => 'Napataud a bilang ti nodo ti preproseso',
+'limitreport-postexpandincludesize' => 'Pannakairaman a kadakkel ti kalpasan a panagpadakkel',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|a byte|kadagiti byte}}',
+'limitreport-templateargumentsize' => 'Argumento a kadakkel ti plantilia',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|a byte|kadagiti byte}}',
+'limitreport-expansiondepth' => 'Kangatuan a panagpadakkel ti kauneg',
+'limitreport-expensivefunctioncount' => 'Bilang ti nangina nga annong ti parser',
+
 );
diff --git a/languages/messages/MessagesInh.php b/languages/messages/MessagesInh.php
index 6a603dc7..0626ea7f 100644
--- a/languages/messages/MessagesInh.php
+++ b/languages/messages/MessagesInh.php
@@ -48,9 +48,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ший теркама дагарленгах оагӀув чулаьца бола дакъалаьцархой таьрах хьахьокха',
 'tog-oldsig' => 'Дола кулгайоазув:',
 'tog-fancysig' => 'Ший кулга яздара массахоамбаккхам (ший лоӀаме Ӏинка йоацаш)',
-'tog-externaleditor' => 'Арена гӀалатнийсдарца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархIара ший-тайпара оттам эша; [//www.mediawiki.org/wiki/Manual:External_editors хьажа эша])',
-'tog-externaldiff' => 'Арена бӀасакхосса болхоагӀувца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархIара ший-тайпара оттам эша; [//www.mediawiki.org/wiki/Manual:External_editors хьажа эша])',
-'tog-showjumplinks' => '"Дехьадала" яха новкъостала Ӏинк хьахьокха',
 'tog-uselivepreview' => 'Сиха бӀарахьажар (JavaScript) (Экспериментально)',
 'tog-forceeditsummary' => 'Хоам бе, хувцамий лоацам белгал даь деце',
 'tog-watchlisthideown' => 'Са хувцамаш теркама дагарчера къайладаккха',
@@ -238,7 +235,7 @@ $messages = array(
 'pool-queuefull' => 'Хаттарий цӀа хьалдизад',
 'pool-errorunknown' => 'Довзаш доаца гӀалат',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Лоацам {{SITENAME}}',
 'aboutpage' => 'Project:Лоацам',
 'copyright' => '$1 чулоацамаца тIакхоачаш да.',
@@ -248,7 +245,6 @@ $messages = array(
 'disclaimers' => 'Бокъонах юхавалаp',
 'disclaimerpage' => 'Project:Бокъонах юхавалаp',
 'edithelp' => 'Хувцама куцтохкам',
-'edithelppage' => 'Help:ГӀалатнийсдар',
 'helppage' => 'Help:Чулоацам',
 'mainpage' => 'Кертера оагӀув',
 'mainpage-description' => 'Кертера оагӀув',
@@ -523,7 +519,6 @@ $messages = array(
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) хьажа',
 'searchmenu-exists' => "'''Укх масса-хьахьоадайтамач ер оаг|ув \"[[:\$1]]\" я'''",
 'searchmenu-new' => "'''Укх \"[[:\$1]]\" масса-хьахоадайтамач оагIув хьае!'''",
-'searchhelp-url' => 'Help:Чулоацам',
 'searchprofile-articles' => 'Гомлен оагIувнаш',
 'searchprofile-project' => 'Дагарлеи хьахоадайтами оагIувнаш',
 'searchprofile-images' => 'Медифаг',
@@ -557,9 +552,6 @@ $messages = array(
 'powersearch-toggleall' => 'Деррига',
 'powersearch-togglenone' => 'Цхьаккха',
 
-# Quickbar
-'qbsettings-none' => 'Цхьаккха',
-
 # Preferences page
 'preferences' => 'Оттамаш',
 'mypreferences' => 'Оттамаш',
@@ -679,7 +671,6 @@ $messages = array(
 'recentchangeslinked-feed' => 'Гаргалон хувцамаш',
 'recentchangeslinked-toolbox' => 'Гаргалон хувцамаш',
 'recentchangeslinked-title' => '$1ца хьалаьца хувцамаш',
-'recentchangeslinked-noresult' => 'Укх заманашка гаргарон оагIувнаш тIа хувцамаш хиннаяц.',
 'recentchangeslinked-summary' => "Ер, Iинк яь йола оагIув (е укх цатегачу чуйоагIараш), дукха ха йоацаш хьийца оагIувнашкий дагарле я.
 [[Special:Watchlist|Шун теркама дагарленашках]] чуйоагIа оагIувнаш '''белгалаяь я'''.",
 'recentchangeslinked-page' => 'ОагIува цIи',
@@ -749,8 +740,6 @@ $messages = array(
 'statistics' => 'Дагара куц',
 'statistics-pages' => 'ОагIувнаш',
 
-'disambiguationspage' => 'Template: ЦаI маIандоацар',
-
 'brokenredirects-edit' => 'хувца',
 'brokenredirects-delete' => 'дIадаккха',
 
@@ -920,8 +909,6 @@ $messages = array(
 'blocklogentry' => '[[$1]] чIега белаб,  $2 $3 ха ялалца',
 'unblocklogentry' => '$1 юха яста я',
 'block-log-flags-nocreate' => 'ЛархIамий дагарчена цIи яьккхар пурам янза я.',
-'blockme' => 'ЧIега бола сона',
-'proxyblocksuccess' => 'Хьадаьд.',
 
 # Move page
 'move-page-legend' => 'ОагIува цIи хувца',
@@ -1073,7 +1060,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Шерал',
 'exif-imagelength' => 'Лакхал',
 'exif-imagedescription' => 'Сурта цIи',
@@ -1133,11 +1120,6 @@ $messages = array(
 'version-version' => '(Доржам $1)',
 'version-software-version' => 'Доржам',
 
-# Special:FilePath
-'filepath' => 'Паьлачу никъ',
-'filepath-page' => 'Паьл:',
-'filepath-submit' => 'Дехьа гӀо',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'ПаьлацIи:',
 'fileduplicatesearch-submit' => 'Лаха',
diff --git a/languages/messages/MessagesIo.php b/languages/messages/MessagesIo.php
index 8b2f4909..599890c4 100644
--- a/languages/messages/MessagesIo.php
+++ b/languages/messages/MessagesIo.php
@@ -138,7 +138,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Montrez mea e-posto adreso en notifiko e-posti',
 'tog-shownumberswatching' => 'Montrez nombro di surveyanta uzanti',
 'tog-fancysig' => 'Traktez signaturo kom wikikodo (sen automata ligilo)',
-'tog-externaleditor' => 'Uzez extera redaktanto nespecigite (nur por experti, bezonas specala moderi ye vua komputoro .[//www.mediawiki.org/wiki/Manual:External_editors Plusa informo.])',
 'tog-forceeditsummary' => 'Notifikez me kande skribanta vakua redakto-rezumo',
 'tog-watchlisthideown' => 'Celez mea redaktaji de la surveyaji',
 'tog-watchlisthidebots' => 'Celez redaktaji da roboti de la surveyaji',
@@ -308,7 +307,7 @@ $messages = array(
 'jumptonavigation' => 'pilotado',
 'jumptosearch' => 'serchez',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Pri {{SITENAME}}',
 'aboutpage' => 'Project:Pri {{SITENAME}}',
 'copyright' => 'La kontenajo esas disponebla sub $1.',
@@ -318,7 +317,6 @@ $messages = array(
 'disclaimers' => 'Legala averto',
 'disclaimerpage' => 'Project:Generala des-agnosko',
 'edithelp' => 'Helpo pri redaktado',
-'edithelppage' => 'Help:Redaktado',
 'helppage' => 'Help:Helpo',
 'mainpage' => 'Frontispico',
 'mainpage-description' => 'Frontispico',
@@ -469,7 +467,7 @@ Voluntez enirar altrafoye pos recevar ol.',
 'newpassword' => 'Nova pasovorto:',
 'retypenew' => 'Riskribez la nova pasovorto:',
 'resetpass_submit' => 'Establisez pasovoro ed enirez',
-'resetpass_success' => 'Vua chanjo di pasovorto sucesis! Nun, vu eniras...',
+'changepassword-success' => 'Vua chanjo di pasovorto sucesis! Nun, vu eniras...',
 'resetpass-submit-loggedin' => 'Chanjar pasovorto',
 'resetpass-temp-password' => 'Provizora pasovorto:',
 
@@ -658,7 +656,6 @@ Surskriburo: '''({{int:cur}})''' = diferi kun l'aktuala versiono,
 'nextn-title' => 'Sequanta $1 {{PLURAL:$1|rezultajo|rezultaji}}',
 'viewprevnext' => 'Vidar ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-new' => "'''Kreez la pagino \"[[:\$1]]\" in ca wiki!'''",
-'searchhelp-url' => 'Help:Helpo',
 'searchprofile-articles' => 'Temala pagini',
 'searchprofile-project' => 'Helpo',
 'searchprofile-images' => "''Media''",
@@ -690,10 +687,6 @@ Probez prefixizar vua demando kun ''all:'' por serchar omna kontenajo (inkluzant
 'search-external' => 'Extera sercho',
 'searchdisabled' => 'La sercho en la kompleta texto desaktivigesis temporale pro superkargo dil servanto. Ni esperas riaktivigar ol pos facar ula proxima aktualigi. Dum ica tempo, vu povas serchar per Google.',
 
-# Quickbar
-'qbsettings' => 'Preferaji pri "Quickbar"',
-'qbsettings-none' => 'Nula',
-
 # Preferences page
 'preferences' => 'Preferaji',
 'mypreferences' => 'Preferaji',
@@ -944,8 +937,6 @@ Volutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.
 'statistics-pages' => 'Pagini',
 'statistics-mostpopular' => 'Maxim ofte vizitita pagini',
 
-'disambiguations' => 'Pagini di desambiguizo',
-
 'doubleredirects' => 'Duopla ridirektili',
 
 'brokenredirects' => 'Ridirektili nekorekta',
@@ -1073,7 +1064,6 @@ Volutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.
 'unwatch' => 'Ne plus surveyar',
 'unwatchthispage' => 'Ne plus surveyar',
 'notanarticle' => 'Ne esas artiklo',
-'watchnochange' => 'Nula artikli ek vua listo di surveyaji redaktesis dum la tempo montrata.',
 'watchmethod-recent' => 'serchante recenta chanji en la listo di surveyaji',
 'watchmethod-list' => 'serchante recenta redakti en la listo di surveyaji',
 'watchlistcontains' => 'Vua listo di surveyaji kontenas $1 {{PLURAL:$1|pagino|pagini}}.',
@@ -1256,7 +1246,6 @@ Videz [[Special:BlockList|IP-blokuslisto]] por revizor blokusadi.',
 'unblocklogentry' => 'desblokusis "$1"',
 'ipb_expiry_invalid' => 'Nevalida expiro-tempo.',
 'ip_range_invalid' => 'Nevalida IP-rango.',
-'proxyblocksuccess' => 'Facita.',
 
 # Developer tools
 'lockdb' => 'Blokusar datumaro',
@@ -1428,7 +1417,7 @@ Vu darfos adjuntar kauso en la rezumo.',
 # Metadata
 'metadata' => 'Metadonaji',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larjeso',
 'exif-imagelength' => 'Alteso',
 'exif-artist' => 'Autoro',
@@ -1529,9 +1518,6 @@ Vu darfos adjuntar kauso en la rezumo.',
 'version-software-product' => 'Produkturo',
 'version-software-version' => 'Versiono',
 
-# Special:FilePath
-'filepath-page' => 'Arkivo:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Serchar',
 
diff --git a/languages/messages/MessagesIs.php b/languages/messages/MessagesIs.php
index fc441f6b..86b82817 100644
--- a/languages/messages/MessagesIs.php
+++ b/languages/messages/MessagesIs.php
@@ -263,9 +263,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Sýna fjölda vaktandi notenda',
 'tog-oldsig' => 'Núverandi undirskrift:',
 'tog-fancysig' => 'Meðhöndla undirskrift sem wikimál (án sjálfvirks tengils)',
-'tog-externaleditor' => 'Nota utanaðkomandi ritil sjálfgefið (eingöngu fyrir reynda, þarfnast sérstakra stillinga á tölvunni þinni. [//www.mediawiki.org/wiki/Manual:External_editors Frekari upplýsingar.])',
-'tog-externaldiff' => 'Nota utanaðkomandi mismun sjálfgefið (eingöngu fyrir reynda, þarfnast sérstakra stillinga á tölvunni þinni. [//www.mediawiki.org/wiki/Manual:External_editors Frekari upplýsingar.])',
-'tog-showjumplinks' => 'Virkja „stökkva á“ aðgengitengla',
 'tog-uselivepreview' => 'Nota beina forskoðun (JavaScript) (Á tilraunastigi)',
 'tog-forceeditsummary' => 'Birta áminningu þegar breytingarágripið er tómt',
 'tog-watchlisthideown' => 'Ekki sýna mínar breytingar á vaktlistanum',
@@ -278,6 +275,7 @@ $messages = array(
 'tog-diffonly' => 'Ekki sýna síðuefni undir mismunum',
 'tog-showhiddencats' => 'Sýna falda flokka',
 'tog-norollbackdiff' => 'Sleppa breytingu eftir að endurvakning síðu hefur verið gerð.',
+'tog-useeditwarning' => 'Vara mig við þegar ég fer frá breytingarsíðu með óvistaðar breytingar',
 
 'underline-always' => 'Alltaf',
 'underline-never' => 'Aldrei',
@@ -341,6 +339,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nóv',
 'dec' => 'des',
+'january-date' => '$1. janúar',
+'february-date' => '$1. febrúar',
+'march-date' => '$1. mars',
+'april-date' => '$1. apríl',
+'may-date' => '$1. maí',
+'june-date' => '$1. júní',
+'july-date' => '$1. júlí',
+'august-date' => '$1. ágúst',
+'september-date' => '$1. september',
+'october-date' => '$1. október',
+'november-date' => '$1. nóvember',
+'december-date' => '$1. desember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Flokkur|Flokkar}}',
@@ -361,7 +371,7 @@ $messages = array(
 'noindex-category' => 'Óraðaðar skrár',
 'broken-file-category' => 'Síður með brotna myndatengla',
 
-'linkprefix' => '/^(.*?)([áÁðÐéÉíÍóÓúÚýÝþÞæÆöÖA-Za-z-–]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![áÁðÐéÉíÍóÓúÚýÝþÞæÆöÖA-Za-z-–])))(.+)$/sDu',
 
 'about' => 'Um',
 'article' => 'Efnissíða',
@@ -424,6 +434,7 @@ $messages = array(
 'create-this-page' => 'Skapa þessari síðu',
 'delete' => 'Eyða',
 'deletethispage' => 'Eyða þessari síðu',
+'undeletethispage' => 'Endurvekja þessa síðu',
 'undelete_short' => 'Endurvekja {{PLURAL:$1|eina breytingu|$1 breytingar}}',
 'viewdeleted_short' => 'Skoða {{PLURAL:$1|eina eydda breytingu|$1 eyddar breytingar}}',
 'protect' => 'Vernda',
@@ -467,7 +478,7 @@ $1',
 'pool-queuefull' => 'Vefþjónninn er yfirhlaðinn í augnablikinu.',
 'pool-errorunknown' => 'Óþekkt villa',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Um {{SITENAME}}',
 'aboutpage' => 'Project:Um verkefnið',
 'copyright' => 'Efni má nota samkvæmt $1.',
@@ -477,7 +488,6 @@ $1',
 'disclaimers' => 'Fyrirvarar',
 'disclaimerpage' => 'Project:Almennur fyrirvari',
 'edithelp' => 'Breytingarhjálp',
-'edithelppage' => 'Help:Breyta',
 'helppage' => 'Help:Efnisyfirlit',
 'mainpage' => 'Forsíða',
 'mainpage-description' => 'Forsíða',
@@ -553,17 +563,6 @@ Sjá [[Special:Version|útgáfusíðuna]].',
 # General errors
 'error' => 'Villa',
 'databaseerror' => 'Gagnagrunnsvilla',
-'dberrortext' => 'Málfræðivilla kom upp í gangagrnunsfyrirspurninni.
-Þetta gæti verið vegna villu í hugbúnaðinum.
-Síðasta gagnagrunnsfyrirspurnin var:
-<blockquote><code>$1</code></blockquote>
-úr aðgerðinni: „<code>$2</code>".
-MySQL skilar villuboðunum „<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Málfræðivilla kom upp í gangagrnunsfyrirspurninni.
-Síðasta gagnagrunnsfyrirspurnin var:
-„$1“
-úr aðgerðinni: „$2“.
-MySQL skilar villuboðanum „$3: $4“',
 'laggedslavemode' => 'Viðvörun: Síðan inniheldur ekki nýjustu uppfærslur.',
 'readonly' => 'Gagnagrunnur læstur',
 'enterlockreason' => 'Gefðu fram ástæðu fyrir læsingunni, og einnig áætlun
@@ -618,12 +617,13 @@ Til þess að bæta við eða breyta þýðingum fyrir öll wiki verkefni, vinsa
 'editinginterface' => "'''Aðvörun:''' Þú ert að breyta síðu sem hefur að geyma texta fyrir notendaumhverfi hugbúnaðarins.
 Breytingar á þessari síðu munu hafa áhrif á notendaumhverfi annarra notenda á þessu vefsvæði.
 Til þess að bæta við eða breyta þýðingum fyrir öll wiki verkefni, vinsamlegast notaðu [//translatewiki.net/wiki/Main_Page?setlang=is translatewiki.net], staðfæringaverkefni MediaWiki.",
-'sqlhidden' => '(SQL-fyrirspurn falin)',
 'cascadeprotected' => 'Þessi síða hefur verið vernduð fyrir breytingum, vegna þess að hún er innifalin í eftirfarandi {{PLURAL:$1|síðu, sem er vernduð|síðum, sem eru verndaðar}} með „keðjuverndun“:
 $2',
 'namespaceprotected' => "Þú hefur ekki leyfi til að breyta síðum í '''$1''' nafnrýminu.",
 'customcssprotected' => 'Þú hefur ekki leyfi að breyta þessari CSS-umbrotsíðu, því hún hefur notendastillingar annars notanda.',
 'customjsprotected' => 'Þú hefur ekki leyfi til að breyta þessari JavaScript síðu, því hún hefur notendastillingar annars notanda.',
+'mycustomcssprotected' => 'Þú hefur ekki leyfi til þess að breyta þessari CSS-síðu.',
+'mycustomjsprotected' => 'Þú hefur ekki leyfi til þess að breyta þessari JavaScript-síðu.',
 'ns-specialprotected' => 'Kerfissíðum er ekki hægt að breyta.',
 'titleprotected' => "Þessi titill hefur verið verndaður fyrir sköpun af [[User:$1|$1]].
 Ástæðan sem gefin var ''$2''.",
@@ -649,10 +649,18 @@ Athugaðu að sumar síður kunna að birtast líkt og þú sért ennþá skrá
 'welcomecreation-msg' => 'Aðgangurinn þinn hefur verið búinn til.
 Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}} stillingunum]] þínum.',
 'yourname' => 'Notandanafn:',
+'userlogin-yourname' => 'Notandanafn',
+'userlogin-yourname-ph' => 'Skrifaðu inn notendanafnið þitt',
 'yourpassword' => 'Lykilorð:',
+'userlogin-yourpassword' => 'Lykilorð',
+'userlogin-yourpassword-ph' => 'Skrifaðu niður lykilorðið þitt',
+'createacct-yourpassword-ph' => 'Skrifaðu niður lykilorð',
 'yourpasswordagain' => 'Endurrita lykilorð:',
+'createacct-yourpasswordagain' => 'Staðfestu lykilorðið',
+'createacct-yourpasswordagain-ph' => 'Sláðu inn lykilorðið aftur',
 'remembermypassword' => 'Muna innskráninguna mína í þessum vafra (í allt að $1 {{PLURAL:$1|dag|daga}})',
-'securelogin-stick-https' => 'Halda öllum samskiptum áfram yfir HTTPS eftir að þú skráir þig inn',
+'userlogin-remembermypassword' => 'Muna innskráningu mína',
+'userlogin-signwithsecure' => 'Nota örugga tengingu',
 'yourdomainname' => 'Þitt lén:',
 'password-change-forbidden' => 'Þú getur ekki breytt lykilorðum á þessum wiki.',
 'externaldberror' => 'Uppfærsla mistókst. Annaðhvort varð villa í gagnasafninu eða að þér sé óheimilt að uppfæra aðra aðganga.',
@@ -664,18 +672,38 @@ Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}} stillingunum]] þínum
 'logout' => 'Útskráning',
 'userlogout' => 'Útskrá',
 'notloggedin' => 'Ekki innskráð(ur)',
+'userlogin-noaccount' => 'Áttu ekki aðgang?',
+'userlogin-joinproject' => 'Sameina {{SITENAME}}',
 'nologin' => 'Ekki með aðgang? $1.',
 'nologinlink' => 'Stofnaðu aðgang',
 'createaccount' => 'Nýskrá',
 'gotaccount' => "Nú þegar með notandanafn? '''$1'''.",
 'gotaccountlink' => 'Skráðu þig inn',
 'userlogin-resetlink' => 'Gleymdir þú notendaupplýsingunum þínum?',
+'userlogin-resetpassword-link' => 'Endursetja lykilorð',
+'helplogin-url' => 'Help:Innskráning',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjálp við innskráningu]]',
+'createacct-join' => 'Sláðu inn þínar upplýsingar fyrir neðan.',
+'createacct-emailrequired' => 'Netfang',
+'createacct-emailoptional' => 'Netfang (valfrjálst)',
+'createacct-email-ph' => 'Skrifaðu niður netfangið þitt',
 'createaccountmail' => 'Nota handahófsvalið bráðabirgðalykilorð og senda það á netfangið sem er tilgreint hér fyrir neðan',
+'createacct-realname' => 'Raunverulegt nafn (valfrjálst)',
 'createaccountreason' => 'Ástæða:',
+'createacct-reason' => 'Ástæða',
+'createacct-reason-ph' => 'Afhverju ertu að búa til annan aðgang',
+'createacct-captcha' => 'Öryggis athugun',
+'createacct-imgcaptcha-ph' => 'Sláðu inn textann að ofan',
+'createacct-submit' => 'Búa til aðganginn',
+'createacct-benefit-heading' => '{{SITENAME}} er skrifuð af fólki eins og þér.',
+'createacct-benefit-body1' => '{{PLURAL:$1|breyting|breytingar}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|síða|síður}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nýlegur stuðningsaðili|nýlegir stuðningsaðilar}}',
 'badretype' => 'Lykilorðin sem þú skrifaðir eru ekki eins.',
 'userexists' => 'Þetta notandanafn er þegar í notkun.
 Vinsamlegast veldu þér annað.',
 'loginerror' => 'Innskráningarvilla',
+'createacct-error' => 'Stofnun aðgangs mistókst',
 'createaccounterror' => 'Gat ekki búið til notanda: $1',
 'nocookiesnew' => 'Innskráningin var búin til, en þú ert ekki skráð(ur) inn.
 {{SITENAME}} notar vefkökur til að skrá inn notendur.
@@ -756,7 +784,7 @@ Til að klára að skrá þig inn, verður þú að endurstilla lykilorðið hé
 'newpassword' => 'Nýja lykilorðið',
 'retypenew' => 'Endurtaktu nýja lykilorðið:',
 'resetpass_submit' => 'Skrifaðu aðgangsorðið og skráðu þig inn',
-'resetpass_success' => 'Aðgangsorðinu þínu hefur verið breytt! Skráir þig inn...',
+'changepassword-success' => 'Aðgangsorðinu þínu hefur verið breytt! Skráir þig inn...',
 'resetpass_forbidden' => 'Ekki er hægt að breyta lykilorðum',
 'resetpass-no-info' => 'Þú verður að vera skráð(ur) inn til að hafa aðgang að þessari síðu.',
 'resetpass-submit-loggedin' => 'Breyta lykilorði',
@@ -768,10 +796,10 @@ Til að klára að skrá þig inn, verður þú að endurstilla lykilorðið hé
 
 # Special:PasswordReset
 'passwordreset' => 'Endurstilla lykilorð',
-'passwordreset-text' => 'Fylltu út þennan reit til að endursetja lykilorðið þitt.',
+'passwordreset-text-one' => 'Útfylltu þetta eyðublað til þess að endursetja lykilorðið.',
 'passwordreset-legend' => 'Endurstilla lykilorð',
 'passwordreset-disabled' => 'Lokað hefur verið fyrir að endurstilla lykilorð á þessum wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Sláðu inn einn hluta gagnanna hér fyrir neðan}}',
+'passwordreset-emaildisabled' => 'Tölvupósteiginleikar hafa verið gerðir óvirkir á þessum wiki.',
 'passwordreset-username' => 'Notandanafn:',
 'passwordreset-domain' => 'Lén:',
 'passwordreset-capture' => 'Sjá áminninguna sem var send í tölvupósti?',
@@ -797,7 +825,7 @@ Ef það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilor
 Tímabundið lykilorð: $2',
 'passwordreset-emailsent' => 'Töluvpóstur til að endursetja lykilorðið hefur verið sendur.',
 'passwordreset-emailsent-capture' => 'Tölvupóstur til að endursetja lykilorðið hefur verið sendur í tölvupósti, sem er sýndur hér fyrir neðan.',
-'passwordreset-emailerror-capture' => 'Áminning var búin til, sem er sýnd hér fyrir neðan, en ekki tókst að senda hana til notandans: $1',
+'passwordreset-emailerror-capture' => 'Tölvupóstur til að endursetja lykilorðið var búinn til, sem er sýndur hér fyrir neðan, en ekki tókst að senda hana til {{GENDER:$2|notandans}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Breyting netfangs',
@@ -1006,12 +1034,15 @@ Engin skýring gefin.',
 Svo virðist sem henni hafi verið eytt.',
 'edit-conflict' => 'Breytingaárekstur.',
 'edit-no-change' => 'Breyting þín var hunsuð, því engin breyting var á textanum.',
+'postedit-confirmation' => 'Breytingin þín var vistuð.',
 'edit-already-exists' => 'Gat ekki skapað nýja síðu.
 Hún er nú þegar til.',
 'defaultmessagetext' => 'Sjálfgefinn skilaboða texti',
 'content-failed-to-parse' => 'Gat ekki þáttað $2 efni samkvæmt $1 líkani: $3',
 'invalid-content-data' => 'Ógild efnisgögn.',
 'content-not-allowed-here' => '„$1“ efni er ekki leyfilegt á síðunni [[$2]]',
+'editwarning-warning' => 'Ef farið er frá þessari síðu gætu þær breytingar sem þú hefur gert tapast.
+Ef þú ert skráður inn, þá getur þú óvirkjað þessi skilaboð í „Breytingarflipanum" undir stillingum.',
 
 # Content models
 'content-model-wikitext' => 'wiki-texti',
@@ -1255,7 +1286,6 @@ Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'searchmenu-legend' => 'Leitarvalmöguleikar',
 'searchmenu-exists' => "'''Það er síða að nafni „[[:$1]]“ á þessum wiki'''",
 'searchmenu-new' => "'''Skapaðu síðuna \"[[:\$1]]\" á þessum wiki!'''",
-'searchhelp-url' => 'Help:Efnisyfirlit',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Leita að síðum með þessu forskeyti]]',
 'searchprofile-articles' => 'Efnissíður',
 'searchprofile-project' => 'Hjálpar- og verkefnasíður',
@@ -1298,15 +1328,7 @@ Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'searchdisabled' => '{{SITENAME}}-leit er óvirk.
 Þú getur leitað í genum Google á meðan.
 Athugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.',
-
-# Quickbar
-'qbsettings' => 'Valblað',
-'qbsettings-none' => 'Sleppa',
-'qbsettings-fixedleft' => 'Fast vinstra megin',
-'qbsettings-fixedright' => 'Fast hægra megin',
-'qbsettings-floatingleft' => 'Fljótandi til vinstri',
-'qbsettings-floatingright' => 'Fljótandi til hægri',
-'qbsettings-directionality' => 'Lagað, fer eftir því í hvaða átt er skrifað á þínu tungumáli.',
+'search-error' => 'Villa kom upp við leit að: $1',
 
 # Preferences page
 'preferences' => 'Stillingar',
@@ -1340,7 +1362,6 @@ Athugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.',
 'resetprefs' => 'Endurstilla valmöguleika',
 'restoreprefs' => 'Endurheimta allar stillingar',
 'prefs-editing' => 'Breytingarflipinn',
-'prefs-edit-boxsize' => 'Stærð breytingagluggans.',
 'rows' => 'Raðir',
 'columns' => 'Dálkar',
 'searchresultshead' => 'Leit',
@@ -1351,8 +1372,6 @@ Athugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.',
 'recentchangesdays-max' => '(hámark $1 {{PLURAL:$1|dag|daga}})',
 'recentchangescount' => 'Fjöldi síðna:',
 'prefs-help-recentchangescount' => 'Taldar eru með nýlegar breytingar, breytingarskrár og aðgerðarskrár.',
-'prefs-help-watchlist-token' => 'Með því að fylla út þennan reit með leynilegum lykli býr til RSS-efnistraum fyrir vaktlistann þinn. Allir sem vita hver lykillinn er geta lesið vaktlistann þinn, svo veldu öruggt eigindargildi.
-Hér er gildi sem var valið af handahófi sem þú getur notað: $1',
 'savedprefs' => 'Stillingarnar þínar hafa verið vistaðar.',
 'timezonelegend' => 'Tímabelti:',
 'localtime' => 'Staðartími:',
@@ -1383,7 +1402,6 @@ Hér er gildi sem var valið af handahófi sem þú getur notað: $1',
 'prefs-reset-intro' => 'Þessi síða er til að endurstilla stillingarnar til sjálfgefnum gildum.
 Ekki er hægt að taka þessa breytingu til baka.',
 'prefs-emailconfirm-label' => 'Staðfesting netfangs:',
-'prefs-textboxsize' => 'Stærð breytingarglugga',
 'youremail' => 'Netfang:',
 'username' => '{{Gender:$1|Notandanafn}}:',
 'uid' => 'Raðnúmer {{GENDER:$1|notanda}}:',
@@ -1520,6 +1538,8 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband vi
 'right-editusercssjs' => 'Breyta CSS- og JS-skrám annarra',
 'right-editusercss' => 'Breyta CSS-skrám annarra',
 'right-edituserjs' => 'Breyta JS-skrám annarra',
+'right-editmyusercss' => 'Breyta þinni eigin CSS-notandaskrá',
+'right-editmyuserjs' => 'Breyta þinni eigin JavaScript-notandaskrá',
 'right-rollback' => 'Taka snögglega aftur breytingar síðasta notanda sem breytti síðunni',
 'right-markbotedits' => 'Merkja endurtektar breytingar sem vélmennabreytingar',
 'right-noratelimit' => 'Sneiða hjá takmörkunum',
@@ -1623,7 +1643,6 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband vi
 'recentchangeslinked-feed' => 'Skyldar breytingar',
 'recentchangeslinked-toolbox' => 'Skyldar breytingar',
 'recentchangeslinked-title' => 'Breytingar tengdar "$1"',
-'recentchangeslinked-noresult' => 'Engar breytingar á tengdum síðum á þessu tímabili.',
 'recentchangeslinked-summary' => "Þetta er listi yfir nýlega gerðar breytingar á síðum sem tengt er í frá tilgreindri síðu (eða á meðlimum úr tilgreindum flokki).
 Síður á [[Special:Watchlist|vaktlistanum þínum]] eru '''feitletraðar'''.",
 'recentchangeslinked-page' => 'Nafn á síða:',
@@ -1856,7 +1875,6 @@ Vegna öryggissjónarmiða er img_auth.php óvirkt.',
 'http-read-error' => 'HTTP lesturs villa.',
 'http-timed-out' => 'Tímamörk HTTP beiðni rann út.',
 'http-curl-error' => 'Villa við að sækja vefslóð: $1',
-'http-host-unreachable' => 'Gat ekki náð í vefslóðina',
 'http-bad-status' => 'Mistök við HTTP beiðnina: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2009,12 +2027,6 @@ Leitarstrengurinn á að vera á þessu formi: efnistag/myndasnið, t.d. <code>i
 'statistics-users-active-desc' => 'Notendur sem hafa framkvæmt aðgerð {{PLURAL:$1|síðastliðin dag|síðastliðna $1 daga}}',
 'statistics-mostpopular' => 'Mest skoðuðu síður',
 
-'disambiguations' => 'Síður sem tengja á aðgreiningarsíður',
-'disambiguationspage' => 'Template:Aðgreining',
-'disambiguations-text' => "Þessar síður innihalda tengla á svokallaðar „'''aðgreiningarsíður'''“.
-Laga ætti tenglanna og láta þá vísa á rétta síðu.<br />
-Farið er með síðu sem aðgreiningarsíðu ef að hún inniheldur snið sem vísað er í frá [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop-submit' => 'Áfram',
 
 'doubleredirects' => 'Tvöfaldar tilvísanir',
@@ -2264,10 +2276,9 @@ Frekari breytingar á henni eða spjallsíðu hennar munu verða sýndar þar.',
 'unwatchthispage' => 'Hætta vöktun',
 'notanarticle' => 'Ekki efnisleg síða',
 'notvisiblerev' => 'Síðasta breyting eftir annan notanda hefur verið eytt.',
-'watchnochange' => 'Engri síðu á vaktlistanum þínum hefur verið breytt á tilgreindu tímabili.',
 'watchlist-details' => '{{PLURAL:$1|$1 síða|$1 síður}} á vaktlistanum þínum, fyrir utan spjallsíður.',
-'wlheader-enotif' => '* Tilkynning með tölvupósti er virk.',
-'wlheader-showupdated' => "* Síðum sem hefur verið breytt síðan þú skoðaðir þær síðast eru '''feitletraðar'''",
+'wlheader-enotif' => 'Tilkynning með tölvupósti er virk.',
+'wlheader-showupdated' => "Síðum sem hefur verið breytt síðan þú skoðaðir þær síðast eru '''feitletraðar'''.",
 'watchmethod-recent' => 'kanna hvort nýlegar breytingar innihalda vaktaðar síður',
 'watchmethod-list' => 'leita að breytingum í vöktuðum síðum',
 'watchlistcontains' => 'Vaktlistinn þinn inniheldur {{PLURAL:$1|$1 síðu|$1 síður}}.',
@@ -2678,12 +2689,9 @@ Sjá [[Special:BlockList|ítarlegri lista]] fyrir öll núgildandi bönn.',
 Vistfangið var bannað sem hluti af fjöldabanninu $2, sem er hægt að afbanna.',
 'ip_range_invalid' => 'Ógilt vistfangasvið.',
 'ip_range_toolarge' => 'Fjöldabönn stærri en /$1 eru óheimil.',
-'blockme' => 'Banna mig',
 'proxyblocker' => 'Vefsels bann',
-'proxyblocker-disabled' => 'Þessi virkni er óvirk.',
 'proxyblockreason' => 'Vistfangið þitt hefur verið bannað því það er opið vefsel.
 Vinsamlegast hafðu samband við internetþjónustuaðilann þinn eða netstjóra félagsins og láttu þá vita af þessu alvarlegu öryggisvandamáli.',
-'proxyblocksuccess' => 'Búinn.',
 'sorbsreason' => 'Vistfangið þitt er á lista yfir opin vefsel í DNSBL sem er í notkun á {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Vistfangið þitt er á lista yfir opin vefsel í DNSBL sem er notað af {{SITENAME}}.
 Þú getur ekki stofnað aðgang.',
@@ -2846,6 +2854,8 @@ Vinsamlegast heimsæktu [//www.mediawiki.org/wiki/Localisation MediaWiki-staðf
 'thumbnail-more' => 'Stækka',
 'filemissing' => 'Skrá vantar',
 'thumbnail_error' => 'Villa við gerð smámyndar: $1',
+'thumbnail_error_remote' => 'Villumelding frá $1:
+$2',
 'djvu_page_error' => 'DjVu-blaðsíða er utan marka',
 'djvu_no_xml' => 'Mistókst að sækja XML-gögn fyrir DjVu skrá',
 'thumbnail-temp-create' => 'Mistókst að búa til tímabundna smámynd.',
@@ -3074,13 +3084,8 @@ Vinsamlegast reyndu aftur.',
 'pageinfo-category-files' => 'Fjöldi skráa',
 
 # Skin names
-'skinname-standard' => 'Sígilt',
-'skinname-nostalgia' => 'Gamaldags',
 'skinname-cologneblue' => 'Kölnarblátt',
 'skinname-monobook' => 'EinBók',
-'skinname-myskin' => 'Mitt þema',
-'skinname-chick' => 'Gella',
-'skinname-simple' => 'Einfalt',
 'skinname-modern' => 'Nútímalegt',
 
 # Patrolling
@@ -3155,11 +3160,25 @@ Vinsamlegast reyndu aftur.',
 'minutes' => '{{PLURAL:$1|einni mínútu|$1 mínútum}}',
 'hours' => '{{PLURAL:$1|einum klukkutíma|$1 klukkutímum}}',
 'days' => '{{PLURAL:$1|einum degi|$1 dögum}}',
+'weeks' => '{{PLURAL:$1|$1 vika|$1 vikur}}',
 'months' => '{{PLURAL:$1|$1 mánuði|$1 mánuðum}}',
 'years' => '{{PLURAL:$1|$1 ári|$1 árum}}',
 'ago' => '$1 síðan',
 'just-now' => 'akkúrat núna',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|klukkutíma|klukkutímum}} síðan',
+'minutes-ago' => '$1 {{PLURAL:$1|mínútu|mínútum}} síðan',
+'seconds-ago' => '$1 {{PLURAL:$1|sekúndu|sekúndum}} síðan',
+'monday-at' => 'Mánudag klukkan $1',
+'tuesday-at' => 'Þriðjudag klukkan $1',
+'wednesday-at' => 'Miðvikudag klukkan $1',
+'thursday-at' => 'Fimmtudag klukkan $1',
+'friday-at' => 'Föstudag klukkan $1',
+'saturday-at' => 'Laugardag klukkan $1',
+'sunday-at' => 'Sunnudag klukkan $1',
+'yesterday-at' => 'Í gær klukkan $1',
+
 # Bad image list
 'bad_image_list' => 'Sniðið er eftirfarandi:
 
@@ -3189,7 +3208,7 @@ Ef skránni hefur verið breytt, kann að vera að einhverjar upplýsingar eigi
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breidd',
 'exif-imagelength' => 'Hæð',
 'exif-bitspersample' => 'Bæti á einingu',
@@ -3348,7 +3367,7 @@ Ef skránni hefur verið breytt, kann að vera að einhverjar upplýsingar eigi
 'exif-originalimageheight' => 'Hæð myndarinnar fyrir skerðingu',
 'exif-originalimagewidth' => 'Breidd myndar fyrir skerðingu',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ósamþjappað',
 
 'exif-copyrighted-true' => 'Höfundaréttarvarið',
@@ -3708,7 +3727,6 @@ einn titil í hverri línu.
 'version-skins' => 'Þemu',
 'version-other' => 'Aðrar',
 'version-mediahandlers' => 'Rekill margmiðlunarskráa',
-'version-extension-functions' => 'Aðgerðir smáforrita',
 'version-parser-extensiontags' => 'Þáttuð smáforrita tög',
 'version-hook-subscribedby' => 'Í áskrift af',
 'version-version' => '(Útgáfa $1)',
@@ -3725,12 +3743,13 @@ MediaWiki er útgefin í þeirri von að hann sé gagnlegur, en ÁN ALLRAR ÁBYR
 'version-software-version' => 'Útgáfa',
 'version-entrypoints-header-url' => 'vefslóð',
 
-# Special:FilePath
-'filepath' => 'Slóð skráar',
-'filepath-page' => 'Skrá:',
-'filepath-submit' => 'Áfram',
-'filepath-summary' => 'Þessi kerfisíða birtir fulla vefslóð skráar. 
-Myndir eru sýndar í fullri upplausn og önnur skráarsnið eru ræst í sjálfvöldu forriti til þess að opna skránna.',
+# Special:Redirect
+'redirect-submit' => 'Áfram',
+'redirect-lookup' => 'Fletta upp:',
+'redirect-value' => 'Gildi:',
+'redirect-user' => 'Notandanúmer',
+'redirect-file' => 'Skráarnafn',
+'redirect-not-exists' => 'Gildi fannst ekki',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Leita að afriti',
@@ -3820,6 +3839,9 @@ Myndir eru sýndar í fullri upplausn og önnur skráarsnið eru ræst í sjálf
 'htmlform-submit' => 'Senda',
 'htmlform-reset' => 'Taka aftur breytingu',
 'htmlform-selectorother-other' => 'Annað',
+'htmlform-no' => 'Nei',
+'htmlform-yes' => 'Já',
+'htmlform-chosen-placeholder' => 'Veldu valmöguleika',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 með fullum texta leitar stuðningi',
diff --git a/languages/messages/MessagesIt.php b/languages/messages/MessagesIt.php
index 3d2b0771..f554aed5 100644
--- a/languages/messages/MessagesIt.php
+++ b/languages/messages/MessagesIt.php
@@ -59,6 +59,7 @@
  * @author S.Örvarr.S
  * @author SabineCretella
  * @author Sannita
+ * @author Shirayuki
  * @author Stefano-c
  * @author Tonyfroio
  * @author Trixt
@@ -319,9 +320,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostra il numero di utenti che hanno la pagina in osservazione',
 'tog-oldsig' => 'Firma attuale:',
 'tog-fancysig' => 'Tratta la firma come wikitesto (senza un collegamento automatico)',
-'tog-externaleditor' => "Usa per default un editor di testi esterno (solo per utenti esperti, richiede l'uso di impostazioni particolari sul proprio computer. [//www.mediawiki.org/wiki/Manual:External_editors Ulteriori informazioni.])",
-'tog-externaldiff' => "Usa per default un programma di diff esterno (solo per utenti esperti, richiede l'uso di impostazioni particolari sul proprio computer. [//www.mediawiki.org/wiki/Manual:External_editors Ulteriori informazioni.])",
-'tog-showjumplinks' => 'Attiva i collegamenti accessibili "vai a"',
 'tog-uselivepreview' => "Abilita la funzione ''Live preview'' (anteprima in diretta - sperimentale)",
 'tog-forceeditsummary' => 'Chiedi conferma se il campo oggetto è vuoto',
 'tog-watchlisthideown' => 'Nascondi le mie modifiche negli osservati speciali',
@@ -335,6 +333,8 @@ $messages = array(
 'tog-showhiddencats' => 'Mostra categorie nascoste',
 'tog-noconvertlink' => 'Disattiva la conversione dei titoli dei link',
 'tog-norollbackdiff' => 'Non mostrare il confronto tra versioni dopo aver effettuato un rollback',
+'tog-useeditwarning' => 'Avvisa quando si lascia una pagina di modifica con modifiche non salvate',
+'tog-prefershttps' => "Usa sempre una connessione sicura quando effettuo l'accesso",
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Mai',
@@ -398,6 +398,18 @@ $messages = array(
 'oct' => 'ott',
 'nov' => 'nov',
 'dec' => 'dic',
+'january-date' => '$1 gennaio',
+'february-date' => '$1 febbraio',
+'march-date' => '$1 marzo',
+'april-date' => '$1 aprile',
+'may-date' => '$1 maggio',
+'june-date' => '$1 giugno',
+'july-date' => '$1 luglio',
+'august-date' => '$1 agosto',
+'september-date' => '$1 settembre',
+'october-date' => '$1 ottobre',
+'november-date' => '$1 novembre',
+'december-date' => '$1 dicembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categorie}}',
@@ -479,6 +491,7 @@ $messages = array(
 'create-this-page' => 'Crea questa pagina',
 'delete' => 'Cancella',
 'deletethispage' => 'Cancella questa pagina',
+'undeletethispage' => 'Recupera questa pagina',
 'undelete_short' => 'Recupera {{PLURAL:$1|una revisione|$1 revisioni}}',
 'viewdeleted_short' => 'Vedi {{PLURAL:$1|una modifica cancellata|$1 modifiche cancellate}}',
 'protect' => 'Proteggi',
@@ -522,7 +535,7 @@ $1',
 'pool-queuefull' => 'La coda del pool è piena',
 'pool-errorunknown' => 'Errore sconosciuto',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Informazioni su {{SITENAME}}',
 'aboutpage' => 'Project:Informazioni',
 'copyright' => 'Il contenuto è disponibile in base alla licenza $1, se non diversamente specificato.',
@@ -532,7 +545,6 @@ $1',
 'disclaimers' => 'Avvertenze',
 'disclaimerpage' => 'Project:Avvertenze generali',
 'edithelp' => 'Guida',
-'edithelppage' => 'Help:Modifica',
 'helppage' => 'Help:Indice',
 'mainpage' => 'Pagina principale',
 'mainpage-description' => 'Pagina principale',
@@ -609,17 +621,12 @@ L'elenco delle pagine speciali valide si trova in [[Special:SpecialPages|Elenco
 # General errors
 'error' => 'Errore',
 'databaseerror' => 'Errore del database',
-'dberrortext' => 'Errore di sintassi nella richiesta inoltrata al database.
-Ciò potrebbe indicare la presenza di un bug nel software.
-L\'ultima query inviata al database è stata:
-<blockquote><code>$1</code></blockquote>
-richiamata dalla funzione "<code>$2</code>".
-Il database ha restituito il seguente errore "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Errore di sintassi nella richiesta inoltrata al database.
-L\'ultima query inviata al database è stata:
-"$1"
-richiamata dalla funzione "$2".
-Il database ha restituito il seguente errore "$3: $4".',
+'databaseerror-text' => 'Si è verificato un errore in una query sul database.
+Potrebbe indicare un bug nel software.',
+'databaseerror-textcl' => 'Si è verificato un errore in una query sul database.',
+'databaseerror-query' => 'Query: $1',
+'databaseerror-function' => 'Funzione: $1',
+'databaseerror-error' => 'Errore: $1',
 'laggedslavemode' => "'''Attenzione:''' la pagina potrebbe non riportare gli aggiornamenti più recenti.",
 'readonly' => 'Database bloccato',
 'enterlockreason' => 'Indicare il motivo del blocco, specificando il momento in cui è presumibile che venga rimosso',
@@ -653,6 +660,7 @@ Potrebbe essere stato già cancellato da qualcun altro.',
 'cannotdelete-title' => 'Impossibile eliminare la pagina "$1"',
 'delete-hook-aborted' => "La cancellazione è stata annullata dall'hook.
 Non è stata restituita alcuna spiegazione.",
+'no-null-revision' => 'Non può essere creata una versione nulla per la pagina "$1"',
 'badtitle' => 'Titolo non corretto',
 'badtitletext' => 'Il titolo della pagina richiesta è vuoto, errato oppure deriva da un errore nei collegamenti interlingua o interwiki.
 Potrebbe inoltre contenere uno o più caratteri il cui uso non è ammesso nei titoli.',
@@ -673,12 +681,15 @@ Query: $2',
 Per aggiungere o modificare traduzioni per tutti i wiki usare [//translatewiki.net/ translatewiki.net], il progetto di localizzazione di MediaWiki.",
 'editinginterface' => "'''Attenzione:''' Il testo di questa pagina fa parte dell'interfaccia utente del sito. Tutte le modifiche apportate a questa pagina si riflettono sui messaggi visualizzati per tutti gli utenti su questo wiki.
 Per aggiungere o modificare le traduzioni valide su tutti i wiki, considera la possibilità di usare [//translatewiki.net/wiki/Main_Page?setlang=it translatewiki.net], il progetto MediaWiki per la localizzazione.",
-'sqlhidden' => '(la query SQL è stata nascosta)',
 'cascadeprotected' => 'Su questa pagina non è possibile effettuare modifiche perché è stata inclusa {{PLURAL:$1|nella pagina indicata di seguito, che è stata protetta|nelle pagine indicate di seguito, che sono state protette}} selezionando la protezione "ricorsiva":
 $2',
 'namespaceprotected' => "Non si dispone dei permessi necessari per modificare le pagine del namespace '''$1'''.",
 'customcssprotected' => 'Non si dispone dei permessi necessari alla modifica di questa pagina CSS, in quanto contiene le impostazioni personali di un altro utente.',
 'customjsprotected' => 'Non si dispone dei permessi necessari alla modifica di questa pagina JavaScript, in quanto contiene le impostazioni personali di un altro utente.',
+'mycustomcssprotected' => 'Non si dispone dei permessi necessari per modificare questa pagina CSS.',
+'mycustomjsprotected' => 'Non si dispone dei permessi necessari per modificare questa pagina JavaScript.',
+'myprivateinfoprotected' => 'Non si dispone dei permessi necessari per modificare i propri dati personali.',
+'mypreferencesprotected' => 'Non si dispone dei permessi necessari per modificare le proprie preferenze.',
 'ns-specialprotected' => 'Non è possibile modificare le pagine speciali.',
 'titleprotected' => "La creazione di una pagina con questo titolo è stata bloccata da [[User:$1|$1]].
 La motivazione è la seguente: ''$2''.",
@@ -703,10 +714,19 @@ Nota che alcune pagine potrebbero continuare ad apparire come se il logout non f
 'welcomecreation-msg' => "L'account è stato creato correttamente.
 Non dimenticare di personalizzare le [[Special:Preferences|preferenze di {{SITENAME}}]].",
 'yourname' => 'Nome utente:',
+'userlogin-yourname' => 'Nome utente',
+'userlogin-yourname-ph' => 'Inserisci il tuo nome utente',
+'createacct-another-username-ph' => 'Inserisci il nome utente',
 'yourpassword' => 'Password:',
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => 'Inserisci la tua password',
+'createacct-yourpassword-ph' => 'Inserisci una password',
 'yourpasswordagain' => 'Ripeti la password:',
+'createacct-yourpasswordagain' => 'Conferma password',
+'createacct-yourpasswordagain-ph' => 'Inserisci nuovamente la password',
 'remembermypassword' => 'Ricorda la password su questo browser (per un massimo di $1 {{PLURAL:$1|giorno|giorni}})',
-'securelogin-stick-https' => 'Resta connesso attraverso HTTPS dopo il login',
+'userlogin-remembermypassword' => 'Mantienimi collegato',
+'userlogin-signwithsecure' => 'Usa una connessione sicura',
 'yourdomainname' => 'Specificare il dominio',
 'password-change-forbidden' => 'Non è possibile modificare le password su questo wiki.',
 'externaldberror' => 'Si è verificato un errore con il server di autenticazione esterno, oppure non si dispone delle autorizzazioni necessarie per aggiornare il proprio accesso esterno.',
@@ -718,18 +738,44 @@ Non dimenticare di personalizzare le [[Special:Preferences|preferenze di {{SITEN
 'logout' => 'Esci',
 'userlogout' => 'esci',
 'notloggedin' => 'Accesso non effettuato',
+'userlogin-noaccount' => 'Non hai ancora effettuato la registrazione?',
+'userlogin-joinproject' => 'Registrati su {{SITENAME}}',
 'nologin' => 'Non hai ancora un accesso? $1.',
 'nologinlink' => 'Registrati',
 'createaccount' => 'Registrati',
 'gotaccount' => 'Hai già un accesso? $1.',
 'gotaccountlink' => 'Entra',
 'userlogin-resetlink' => 'Hai dimenticato i tuoi dati di accesso?',
+'userlogin-resetpassword-link' => 'Reimposta la tua password',
+'helplogin-url' => 'Help:Login',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aiuto con il login]]',
+'userlogin-loggedin' => 'Sei già connesso come {{GENDER:$1|$1}}.
+Usa il modulo sottostante per accedere come altro utente.',
+'userlogin-createanother' => "Crea un'altra utenza",
+'createacct-join' => 'Inserisci i tuoi dati qui sotto.',
+'createacct-another-join' => 'Inserisci le informazioni per la registrazione qui sotto.',
+'createacct-emailrequired' => 'Indirizzo email',
+'createacct-emailoptional' => 'Indirizzo di posta elettronica (opzionale)',
+'createacct-email-ph' => 'Inserisci il tuo indirizzo email',
+'createacct-another-email-ph' => "Inserisci l'indirizzo di posta elettronica",
 'createaccountmail' => "Usa una password casuale temporanea e inviala all'indirizzo di posta elettronica specificato",
+'createacct-realname' => 'Nome reale (opzionale)',
 'createaccountreason' => 'Motivo:',
+'createacct-reason' => 'Motivo',
+'createacct-reason-ph' => "Perché stai creando un'altra utenza",
+'createacct-captcha' => 'Controllo di sicurezza',
+'createacct-imgcaptcha-ph' => 'Inserisci il testo che vedi sopra',
+'createacct-submit' => 'Crea la tua utenza',
+'createacct-another-submit' => "Crea un'altra utenza",
+'createacct-benefit-heading' => '{{SITENAME}} cresce grazie a persone come te.',
+'createacct-benefit-body1' => '{{PLURAL:$1|modifica|modifiche}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pagina|pagine}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributore recente|contributori recenti}}',
 'badretype' => 'Le password inserite non coincidono tra loro.',
 'userexists' => 'Il nome utente inserito è già utilizzato.
 Scegliere un nome utente diverso.',
 'loginerror' => "Errore durante l'accesso",
+'createacct-error' => "Errore durante la creazione dell'utenza",
 'createaccounterror' => "Impossibile creare l'account: $1",
 'nocookiesnew' => "La registrazione è stata completata, ma non è stato possibile accedere a {{SITENAME}} perché i cookie sono disattivati. Riprovare l'accesso con il nome utente e la password appena creati dopo aver attivato i cookie nel proprio browser.",
 'nocookieslogin' => "L'accesso a {{SITENAME}} richiede l'uso dei cookie, che risultano disattivati. Riprovare l'accesso dopo aver attivato i cookie nel proprio browser.",
@@ -783,10 +829,11 @@ Non verranno inviati messaggi email per le funzioni elencate di seguito.",
 Se l\'accesso è stato creato per errore, si può ignorare questo messaggio.',
 'usernamehasherror' => 'Il nome utente non può contenere caratteri hash',
 'login-throttled' => 'Sono stati effettuati troppi tentativi di accesso in breve tempo.
-Riprovare più tardi.',
+Attendi $1 e riprova in seguito.',
 'login-abort-generic' => 'Il tuo login non ha avuto successo - Annullato',
 'loginlanguagelabel' => 'Lingua: $1',
 'suspicious-userlogout' => 'La tua richiesta di disconnessione è stata negata perché sembra inviata da un browser non funzionante o un proxy di caching.',
+'createacct-another-realname-tip' => "L'indicazione del proprio nome vero è opzionale; se si sceglie di inserirlo, verrà utilizzato per attribuire la paternità dei contenuti inviati.",
 
 # Email sending
 'php-mail-error-unknown' => 'Errore sconosciuto nella funzione PHP mail()',
@@ -802,8 +849,7 @@ Riprovare più tardi.',
 'newpassword' => 'Nuova password:',
 'retypenew' => 'Riscrivi la nuova password:',
 'resetpass_submit' => 'Imposta la password e accedi al sito',
-'resetpass_success' => 'La tua password è stata modificata correttamente!
-Ora stai per accedere...',
+'changepassword-success' => 'La password è stata modificata correttamente!',
 'resetpass_forbidden' => 'Non è possibile modificare le password',
 'resetpass-no-info' => "Devi aver effettuato l'accesso per accedere a questa pagina direttamente.",
 'resetpass-submit-loggedin' => 'Cambia password',
@@ -815,10 +861,11 @@ La password potrebbe essere stata già cambiata, oppure potrebbe essere stata ri
 
 # Special:PasswordReset
 'passwordreset' => 'Reimposta password',
-'passwordreset-text' => 'Compila questo modulo per reimpostare la tua password.',
+'passwordreset-text-one' => 'Compila questo modulo per reimpostare la tua password.',
+'passwordreset-text-many' => '{{PLURAL:$1|Compila uno dei campi per reimpostare la tua password.}}',
 'passwordreset-legend' => 'Reimposta password',
 'passwordreset-disabled' => 'La reimpostazione delle password è stata disabilitata su questa wiki',
-'passwordreset-pretext' => '{{PLURAL:$1||Immetti uno dei dati richiesti qui sotto}}',
+'passwordreset-emaildisabled' => 'Le funzionalità di posta elettronica sono state disabilitate su questa wiki.',
 'passwordreset-username' => 'Nome utente:',
 'passwordreset-domain' => 'Dominio:',
 'passwordreset-capture' => 'Visualizzare il contenuto del messaggio e-mail?',
@@ -845,7 +892,7 @@ Se non sei stato tu a fare la richiesta, o se ti sei ricordato la password origi
 Password temporanea: $2',
 'passwordreset-emailsent' => 'È stata inviata una email di reimpostazione della password.',
 'passwordreset-emailsent-capture' => 'È stata inviata una email di reimpostazione della password, il contenuto è riportato di seguito.',
-'passwordreset-emailerror-capture' => "È stata generata l'email di promemoria riportata di seguito. L'invio non è riuscito all'utente: $1",
+'passwordreset-emailerror-capture' => "È stata generata una email di reimpostazione della password, riportata di seguito. L'invio {{GENDER:$2|all'utente}} non è riuscito: $1",
 
 # Special:ChangeEmail
 'changeemail' => "Modifica l'indirizzo e-mail",
@@ -859,6 +906,19 @@ Password temporanea: $2',
 'changeemail-submit' => 'Modifica e-mail',
 'changeemail-cancel' => 'Annulla',
 
+# Special:ResetTokens
+'resettokens' => 'Reimposta token',
+'resettokens-text' => "Qui puoi reimpostare le chiavi che permettono l'accesso a determinati dati privati associati alla tua utenza.
+
+Dovresti farlo se le hai accidentalmente condivise con qualcuno o se la tua utenza è stato compromessa.",
+'resettokens-no-tokens' => 'Non ci sono token da reimpostare.',
+'resettokens-legend' => 'Reimposta token',
+'resettokens-tokens' => 'Token:',
+'resettokens-token-label' => '$1 (valore attuale: $2)',
+'resettokens-watchlist-token' => 'Token per il feed web (Atom/RSS) delle [[Special:Watchlist|modifiche alle pagine nei tuoi osservati speciali]]',
+'resettokens-done' => 'Token reimpostati.',
+'resettokens-resetbutton' => 'Reset token selezionati',
+
 # Edit page toolbar
 'bold_sample' => 'Grassetto',
 'bold_tip' => 'Grassetto',
@@ -1044,12 +1104,15 @@ Non è stata restituita alcuna spiegazione.",
 Sembra che sia stata cancellata.',
 'edit-conflict' => 'Conflitto di edizione.',
 'edit-no-change' => 'La modifica è stata ignorata poiché non sono stati apportati cambiamenti al testo.',
+'postedit-confirmation' => 'La modifica è stata salvata.',
 'edit-already-exists' => 'Impossibile creare una nuova pagina.
 Esiste già.',
 'defaultmessagetext' => 'Testo predefinito',
 'content-failed-to-parse' => 'Impossibile analizzare $2 per il modello $1: $3',
 'invalid-content-data' => 'Dati contenuti non validi',
 'content-not-allowed-here' => 'Contenuto in "$1" non consentito nella pagine [[$2]]',
+'editwarning-warning' => 'Lasciare questa pagina potrebbe causare la perdita di tutte le modifiche fatte.
+Se hai effettuato l\'accesso, puoi disattivare questo avviso nella sezione "Casella di modifica" delle tue preferenze.',
 
 # Content models
 'content-model-wikitext' => 'wikitesto',
@@ -1084,6 +1147,7 @@ Controlla le differenze mostrate sotto fra le due versioni per essere certo che
 'undo-failure' => 'Impossibile annullare la modifica a causa di un conflitto con modifiche intermedie.',
 'undo-norev' => 'La modifica non può essere annullata perché non esiste o è stata cancellata.',
 'undo-summary' => 'Annullata la modifica $1 di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]])',
+'undo-summary-username-hidden' => 'Annullata la modifica $1 di un utente nascosto',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Impossibile registrare un utente',
@@ -1257,6 +1321,7 @@ Vedi l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi e dei blo
 'compareselectedversions' => 'Confronta le versioni selezionate',
 'showhideselectedversions' => 'Mostra/nascondi versioni selezionate',
 'editundo' => 'annulla',
+'diff-empty' => '(Nessuna differenza)',
 'diff-multi' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di {{PLURAL:$2|un utente|$2 utenti}} non {{PLURAL:$1|mostrata|mostrate}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di oltre $2 {{PLURAL:$2|utente|utenti}} non {{PLURAL:$1|mostrata|mostrate}})',
 'difference-missing-revision' => '{{PLURAL:$2|Una versione|$2 versioni}} di questa differenza ($1) {{PLURAL:$2|non è stata trovata|non sono state trovate}}.
@@ -1284,7 +1349,6 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'searchmenu-legend' => 'Opzioni di ricerca',
 'searchmenu-exists' => "'''Sul sito esiste una pagina il cui nome è \"[[:\$1]]\"'''",
 'searchmenu-new' => 'Crea la pagina "[[:$1]]" su questo sito',
-'searchhelp-url' => 'Help:Indice',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Visualizza le pagine con questo prefisso]]',
 'searchprofile-articles' => 'Pagine di contenuti',
 'searchprofile-project' => 'Pagine di aiuto e relative al progetto',
@@ -1325,15 +1389,7 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'powersearch-togglenone' => 'Nessuno',
 'search-external' => 'Ricerca esterna',
 'searchdisabled' => 'La ricerca interna di {{SITENAME}} non è attiva; nel frattempo si può provare ad usare un motore di ricerca esterno come Google. (Si noti però che i contenuti di {{SITENAME}} presenti in tali motori potrebbero non essere aggiornati.)',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Nessuno',
-'qbsettings-fixedleft' => 'Fisso a sinistra',
-'qbsettings-fixedright' => 'Fisso a destra',
-'qbsettings-floatingleft' => 'Fluttuante a sinistra',
-'qbsettings-floatingright' => 'Fluttuante a destra',
-'qbsettings-directionality' => 'Fisso, a seconda della direzione del testo nella tua lingua',
+'search-error' => 'Si è verificato un errore durante la ricerca: $1',
 
 # Preferences page
 'preferences' => 'Preferenze',
@@ -1367,7 +1423,6 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'resetprefs' => 'Reimposta le preferenze',
 'restoreprefs' => 'Ripristina le impostazioni predefinite (in tutte le sezioni)',
 'prefs-editing' => 'Casella di modifica',
-'prefs-edit-boxsize' => 'Dimensioni della finestra di modifica.',
 'rows' => 'Righe:',
 'columns' => 'Colonne:',
 'searchresultshead' => 'Ricerca',
@@ -1378,7 +1433,8 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'recentchangesdays-max' => '(massimo $1 {{PLURAL:$1|giorno|giorni}})',
 'recentchangescount' => 'Numero di modifiche da mostrare per default:',
 'prefs-help-recentchangescount' => 'Comprende ultime modifiche, cronologie e registri.',
-'prefs-help-watchlist-token' => "Compilando questo campo con una chiave segreta verrà generato un feed RSS per i propri osservati speciali. Chiunque conosca la chiave in questo campo potrà leggere gli osservati speciali, quindi assicurasi di inserire un valore sicuro. Qui c'è un valore generato casualmente che si può usare: $1",
+'prefs-help-watchlist-token2' => 'Questa è la chiave segreta per il feed web dei tuoi osservati speciali.
+Chiunque la conosce sarà in grado di leggere i tuoi osservati speciali, per cui non condividerla. [[Special:ResetTokens|Clicca qui se hai bisogno di reimpostarla]].',
 'savedprefs' => 'Le preferenze sono state salvate.',
 'timezonelegend' => 'Fuso orario:',
 'localtime' => 'Ora locale:',
@@ -1409,7 +1465,6 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'prefs-reset-intro' => "È possibile usare questa pagina per reimpostare le proprie preferenze a quelle predefinite del sito.
 L'operazione non può essere annullata.",
 'prefs-emailconfirm-label' => "Conferma dell'e-mail:",
-'prefs-textboxsize' => 'Dimensione della finestra di modifica',
 'youremail' => 'Indirizzo email:',
 'username' => '{{GENDER:$1|Nome utente}}:',
 'uid' => '{{GENDER:$1|ID utente}}:',
@@ -1442,6 +1497,8 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'prefs-dateformat' => 'Formato data',
 'prefs-timeoffset' => 'Ore di differenza',
 'prefs-advancedediting' => 'Opzioni generali',
+'prefs-editor' => 'Editore',
+'prefs-preview' => 'Anteprima',
 'prefs-advancedrc' => 'Opzioni avanzate',
 'prefs-advancedrendering' => 'Opzioni avanzate',
 'prefs-advancedsearchoptions' => 'Opzioni avanzate',
@@ -1449,7 +1506,9 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'prefs-displayrc' => 'Opzioni di visualizzazione',
 'prefs-displaysearchoptions' => 'Opzioni di visualizzazione',
 'prefs-displaywatchlist' => 'Opzioni di visualizzazione',
+'prefs-tokenwatchlist' => 'Token',
 'prefs-diffs' => 'Differenze',
+'prefs-help-prefershttps' => 'Questa preferenza avrà effetto dal prossimo accesso.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => "L'indirizzo e-mail sembra valido",
@@ -1476,6 +1535,8 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'userrights-notallowed' => "Non disponi dell'autorizzazione per aggiungere o rimuovere i permessi utente.",
 'userrights-changeable-col' => 'Gruppi modificabili',
 'userrights-unchangeable-col' => 'Gruppi non modificabili',
+'userrights-conflict' => 'Conflitto di modifica dei diritti utente! Controlla e conferma le tue modifiche.',
+'userrights-removed-self' => 'Hai rimosso con successo i tuoi diritti. E quindi, non sarai più in grado di accedere a questa pagina.',
 
 # Groups
 'group' => 'Gruppo:',
@@ -1541,11 +1602,19 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'right-proxyunbannable' => 'Ignora i blocchi automatici dei proxy',
 'right-unblockself' => 'Sblocca se stesso',
 'right-protect' => 'Cambia i livelli di protezione e modifica pagine protette ricorsivamente',
-'right-editprotected' => 'Modifica pagine protette',
+'right-editprotected' => 'Modifica pagine protette con "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Modifica pagine protette con "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => "Modifica l'interfaccia utente",
 'right-editusercssjs' => 'Modifica i file CSS e JS di altri utenti',
 'right-editusercss' => 'Modifica i file CSS di altri utenti',
 'right-edituserjs' => 'Modifica i file JS di altri utenti',
+'right-editmyusercss' => 'Modifica il file CSS del proprio utente',
+'right-editmyuserjs' => 'Modifica il file JavaScript del proprio utente',
+'right-viewmywatchlist' => 'Visualizza i propri osservati speciali',
+'right-editmywatchlist' => 'Modifica i propri osservati speciali. Da notare che alcune azioni potranno ancora aggiungere pagine anche senza questo diritto.',
+'right-viewmyprivateinfo' => 'Visualizza i propri dati personali (ad esempio: indirizzo email, nome vero)',
+'right-editmyprivateinfo' => 'Modifica i propri dati personali (ad esempio: indirizzo email, nome vero)',
+'right-editmyoptions' => 'Modifica le proprie preferenze',
 'right-rollback' => "Annulla rapidamente le modifiche dell'ultimo utente che ha modificato una particolare pagina",
 'right-markbotedits' => 'Segna le modifiche soggette a rollback come effettuate da bot',
 'right-noratelimit' => 'Non soggetto al limite di azioni',
@@ -1607,12 +1676,19 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'action-userrights-interwiki' => 'modificare i diritti degli utenti su altre wiki',
 'action-siteadmin' => 'bloccare e sbloccare il database',
 'action-sendemail' => 'inviare e-mail',
+'action-editmywatchlist' => 'modificare i propri osservati speciali',
+'action-viewmywatchlist' => 'vedere i propri osservati speciali',
+'action-viewmyprivateinfo' => 'vedere i propri dati personali',
+'action-editmyprivateinfo' => 'modificare i propri dati personali',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|modifica|modifiche}}',
+'enhancedrc-since-last-visit' => "$1 {{PLURAL:$1|dall'ultima visita}}",
+'enhancedrc-history' => 'cronologia',
 'recentchanges' => 'Ultime modifiche',
 'recentchanges-legend' => 'Opzioni ultime modifiche',
 'recentchanges-summary' => 'Questa pagina presenta le modifiche più recenti ai contenuti del sito.',
+'recentchanges-noresult' => 'Nessuna modifica durante il periodo inserito che soddisfa questi criteri.',
 'recentchanges-feed-description' => 'Questo feed riporta le modifiche più recenti ai contenuti del sito.',
 'recentchanges-label-newpage' => 'Questa modifica ha creato una nuova pagina',
 'recentchanges-label-minor' => 'Questa è una modifica minore',
@@ -1649,7 +1725,6 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'recentchangeslinked-feed' => 'Modifiche correlate',
 'recentchangeslinked-toolbox' => 'Modifiche correlate',
 'recentchangeslinked-title' => 'Modifiche correlate a "$1"',
-'recentchangeslinked-noresult' => 'Nessuna modifica alle pagine collegate nel periodo specificato.',
 'recentchangeslinked-summary' => "Questa pagina speciale mostra le modifiche più recenti alle pagine collegate da quella specificata (o contenute nella categoria specificata).
 Le pagine contenute nella propria lista degli [[Special:Watchlist|Osservati speciali]] sono evidenziate in '''grassetto'''.",
 'recentchangeslinked-page' => 'Nome della pagina:',
@@ -1661,7 +1736,7 @@ Le pagine contenute nella propria lista degli [[Special:Watchlist|Osservati spec
 'reuploaddesc' => 'Torna al modulo per il caricamento.',
 'upload-tryagain' => 'Invia la descrizione del file modificato',
 'uploadnologin' => 'Accesso non effettuato',
-'uploadnologintext' => "Il caricamento dei file è consentito solo agli utenti registrati che hanno eseguito [[Special:UserLogin|l'accesso]] al sito.",
+'uploadnologintext' => 'Per caricare file è necessario $1.',
 'upload_directory_missing' => 'La directory di upload ($1) non esiste e non può essere creata dal server web.',
 'upload_directory_read_only' => 'Il server web non è in grado di scrivere nella directory di upload ($1).',
 'uploaderror' => 'Errore nel caricamento',
@@ -1877,7 +1952,6 @@ Per una sicurezza ottimale, img_auth.php è disattivato.',
 'http-read-error' => 'Errore di lettura HTTP.',
 'http-timed-out' => 'Richiesta HTTP scaduta.',
 'http-curl-error' => "Errore durante il recupero dell'URL: $1",
-'http-host-unreachable' => 'URL non raggiungibile.',
 'http-bad-status' => "C'è stato un problema durante la richiesta HTTP: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1905,6 +1979,10 @@ Per una sicurezza ottimale, img_auth.php è disattivato.',
 'listfiles_size' => 'Dimensione in byte',
 'listfiles_description' => 'Descrizione',
 'listfiles_count' => 'Versioni',
+'listfiles-show-all' => 'Includi le vecchie versioni delle immagini',
+'listfiles-latestversion' => 'Versione attuale',
+'listfiles-latestversion-yes' => 'Sì',
+'listfiles-latestversion-no' => 'No',
 
 # File description page
 'file-anchor-link' => 'File',
@@ -2000,6 +2078,13 @@ Probabilmente vuoi modificare la descrizione presente nella [$2 pagina di descri
 'randompage' => 'Una pagina a caso',
 'randompage-nopages' => 'Non ci sono pagine {{PLURAL:$2|nel seguente namespace|nei seguenti namespace}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Pagina casuale in una categoria',
+'randomincategory-invalidcategory' => '"$1" non è un nome di categoria valido.',
+'randomincategory-nopages' => 'Non ci sono pagine in [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Ottieni una pagina casuale dalla categoria: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Vai',
+
 # Random redirect
 'randomredirect' => 'Un redirect a caso',
 'randomredirect-nopages' => 'Non ci sono redirect nel namespace "$1".',
@@ -2025,17 +2110,13 @@ Probabilmente vuoi modificare la descrizione presente nella [$2 pagina di descri
 'statistics-users-active-desc' => "Utenti che hanno effettuato un'azione {{PLURAL:$1|nell'ultimo giorno|negli ultimi $1 giorni}}",
 'statistics-mostpopular' => 'Pagine più visitate',
 
-'disambiguations' => 'Pagine che si collegano a pagine di disambiguazione',
-'disambiguationspage' => 'Template:Disambigua',
-'disambiguations-text' => "Le pagine nella lista che segue contengono almeno un collegamento a una '''pagina di disambiguazione'''.
-Esse potrebbero dover puntare a una pagina più appropriata.<br />
-Vengono considerate pagine di disambiguazione tutte quelle che contengono i template elencati in [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Pagine con una proprietà di pagina',
 'pageswithprop-legend' => 'Pagine con una proprietà di pagina',
 'pageswithprop-text' => 'Questa pagina elenca le pagine che utilizzano una particolare proprietà di pagina.',
 'pageswithprop-prop' => 'Nome proprietà:',
 'pageswithprop-submit' => 'Vai',
+'pageswithprop-prophidden-long' => 'valore testuale lungo della proprietà nascosto ($1)',
+'pageswithprop-prophidden-binary' => 'valore binario della proprietà nascosto ($1)',
 
 'doubleredirects' => 'Redirect doppi',
 'doubleredirectstext' => 'In questa pagina sono elencate pagine che reindirizzano ad altre pagine di redirect.
@@ -2093,6 +2174,7 @@ I redirect <del>cancellati</del> sono stati corretti.',
 'mostrevisions' => 'Pagine con più versioni',
 'prefixindex' => 'Indice delle pagine per lettere iniziali',
 'prefixindex-namespace' => 'Tutte le pagine con il prefisso del namespace $1',
+'prefixindex-strip' => "Nascondi prefisso nell'elenco",
 'shortpages' => 'Pagine più corte',
 'longpages' => 'Pagine più lunghe',
 'deadendpages' => 'Pagine senza uscita',
@@ -2108,6 +2190,7 @@ I redirect <del>cancellati</del> sono stati corretti.',
 'listusers' => 'Elenco degli utenti',
 'listusers-editsonly' => 'Mostra solo utenti con dei contributi',
 'listusers-creationsort' => 'Ordina per data di creazione',
+'listusers-desc' => 'Ordina in senso decrescente',
 'usereditcount' => '$1 {{PLURAL:$1|contributo|contributi}}',
 'usercreated' => '{{GENDER:$3|Creato/a}} il $1 alle $2',
 'newpages' => 'Pagine più recenti',
@@ -2285,10 +2368,9 @@ D\'ora in poi, le modifiche apportate alla pagina e alla sua discussione verrann
 'unwatchthispage' => 'Smetti di seguire',
 'notanarticle' => 'Questa pagina non è una voce',
 'notvisiblerev' => 'La revisione è stata cancellata',
-'watchnochange' => 'Nessuna delle pagine osservate è stata modificata nel periodo selezionato.',
 'watchlist-details' => 'La lista degli osservati speciali contiene {{PLURAL:$1|una pagina (e la rispettiva pagina di discussione)|$1 pagine (e le rispettive pagine di discussione)}}.',
-'wlheader-enotif' => '* La notifica via e-mail è attiva.',
-'wlheader-showupdated' => "* Le pagine che sono state modificate dopo l'ultima visita sono evidenziate in '''grassetto'''.",
+'wlheader-enotif' => 'La notifica via email è attiva.',
+'wlheader-showupdated' => "Le pagine che sono state modificate dopo l'ultima visita sono evidenziate in '''grassetto'''.",
 'watchmethod-recent' => 'controllo delle modifiche recenti per gli osservati speciali',
 'watchmethod-list' => 'controllo degli osservati speciali per modifiche recenti',
 'watchlistcontains' => 'La lista degli osservati speciali contiene {{PLURAL:$1|una pagina|$1 pagine}}.',
@@ -2529,7 +2611,7 @@ $1',
 'contributions' => 'Contributi {{GENDER:$1|utente}}',
 'contributions-title' => 'Contributi di $1',
 'mycontris' => 'contributi',
-'contribsub2' => 'Per $1 ($2)',
+'contribsub2' => 'Per {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Non sono state trovate modifiche che soddisfino i criteri di ricerca.',
 'uctop' => '(attuale)',
 'month' => 'Dal mese (e precedenti):',
@@ -2685,13 +2767,11 @@ Consultare l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi o b
 'ipb_blocked_as_range' => "Errore: L'indirizzo IP $1 non è soggetto a blocco individuale e non può essere sbloccato. Il blocco è invece attivo a livello dell'intervallo $2, che può essere sbloccato.",
 'ip_range_invalid' => 'Intervallo di indirizzi IP non valido.',
 'ip_range_toolarge' => 'Non è possibile bloccare range superiori al /$1',
-'blockme' => 'Bloccami',
 'proxyblocker' => 'Blocco dei proxy aperti',
-'proxyblocker-disabled' => 'Questa funzione è disabilitata.',
 'proxyblockreason' => 'Questo indirizzo IP è stato bloccato perché risulta essere un proxy aperto. Si prega di contattare il proprio fornitore di accesso a Internet o il supporto tecnico e informarli di questo grave problema di sicurezza.',
-'proxyblocksuccess' => 'Fatto.',
 'sorbsreason' => 'Questo indirizzo IP è elencato come proxy aperto nella blacklist DNSBL utilizzata da {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Non è possibile creare nuovi accessi da questo indirizzo IP perché è elencato come proxy aperto nella blacklist DNSBL utilizzata da {{SITENAME}}.',
+'xffblockreason' => "Un indirizzo IP presente nell'intestazione X-Forwarded-For, tuo o del server proxy che stai utilizzando, è stato bloccato. La motivazione originale del blocco è: $1",
 'cant-block-while-blocked' => 'Non è possibile bloccare altri utenti mentre si è bloccati.',
 'cant-see-hidden-user' => 'L\'utente che si sta tentando di bloccare è stato già bloccato e nascosto. Poiché non hai il permesso "hideuser", non è possibile visualizzare o modificare il blocco dell\'utente.',
 'ipbblocked' => 'Non puoi bloccare o sbloccare altri utenti, perché tu stesso sei bloccato',
@@ -2841,6 +2921,8 @@ Visitare [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//tra
 'thumbnail-more' => 'Ingrandisci',
 'filemissing' => 'File mancante',
 'thumbnail_error' => 'Errore nella creazione della miniatura: $1',
+'thumbnail_error_remote' => 'Messaggio di errore da $1:
+$2',
 'djvu_page_error' => 'Numero di pagina DjVu errato',
 'djvu_no_xml' => "Impossibile ottenere l'XML per il file DjVu",
 'thumbnail-temp-create' => 'Impossibile creare il file temporaneo delle miniature',
@@ -2988,17 +3070,11 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 
 # Stylesheets
 'common.css' => '/* Gli stili CSS inseriti qui si applicano a tutte le skin */',
-'standard.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Standard */',
-'nostalgia.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Nostalgia */',
 'cologneblue.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Cologne Blue */',
 'monobook.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Monobook */',
-'myskin.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin MySkin */',
-'chick.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Chick */',
-'simple.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Simple */',
 'modern.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Modern */',
 'vector.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Vector */',
 'print.css' => "/* Gli stili CSS inseriti qui si applicano all'output in stampa */",
-'handheld.css' => '/* Gli stili CSS inseriti qui si applicano ai dispositivi portatili basati sulla skin configurata in $wgHandheldStyle */',
 'noscript.css' => '/ * Gli stili CSS inseriti qui si applicano agli utenti che hanno JavaScript disabilitato * /',
 'group-autoconfirmed.css' => '/ * Gli stili CSS inseriti qui si applicheranno solo ad utenti autoconvalidati * /',
 'group-bot.css' => '/ * Gli stili CSS inseriti qui si applicheranno solo ai bot * /',
@@ -3007,13 +3083,8 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 
 # Scripts
 'common.js' => '/* Il codice JavaScript inserito qui viene caricato da ciascuna pagina, per tutti gli utenti. */',
-'standard.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Standard */',
-'nostalgia.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Nostalgia */',
 'cologneblue.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Cologne Blue */',
 'monobook.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin MonoBook */',
-'myskin.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin MySkin */',
-'chick.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Chick */',
-'simple.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Simple */',
 'modern.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Modern */',
 'vector.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Vector */',
 'group-autoconfirmed.js' => '/ * Il codice JavaScript inserito qui viene caricato solo per gli utenti autoconvalidati * /',
@@ -3091,9 +3162,6 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'pageinfo-category-subcats' => 'Numero di sottocategorie',
 'pageinfo-category-files' => 'Numero di file',
 
-# Skin names
-'skinname-nostalgia' => 'Nostalgia',
-
 # Patrolling
 'markaspatrolleddiff' => 'Segna la modifica come verificata',
 'markaspatrolledtext' => 'Segna questa pagina come verificata',
@@ -3172,11 +3240,25 @@ $1',
 'minutes' => '{{PLURAL:$1|un minuto|$1 minuti}}',
 'hours' => "{{PLURAL:$1|un'ora|$1 ore}}",
 'days' => '{{PLURAL:$1|$1 giorno|$1 giorni}}',
+'weeks' => '{{PLURAL:$1|$1 settimana|$1 settimane}}',
 'months' => '{{PLURAL:$1|$1 mese|$1 mesi}}',
 'years' => '{{PLURAL:$1|$1 anno|$1 anni}}',
 'ago' => '$1 fa',
 'just-now' => 'proprio ora',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ora|ore}} fa',
+'minutes-ago' => '$1 {{PLURAL:$1|minuto|minuti}} fa',
+'seconds-ago' => '$1 {{PLURAL:$1|secondo|secondi}} fa',
+'monday-at' => 'Lunedì alle $1',
+'tuesday-at' => 'Martedì alle $1',
+'wednesday-at' => 'Mercoledì alle $1',
+'thursday-at' => 'Giovedì alle $1',
+'friday-at' => 'Venerdì alle $1',
+'saturday-at' => 'Sabato alle $1',
+'sunday-at' => 'Domenica alle $1',
+'yesterday-at' => 'Ieri alle $1',
+
 # Bad image list
 'bad_image_list' => "Il formato è il seguente:
 
@@ -3203,7 +3285,7 @@ I collegamenti successivi, sulla stessa riga, sono considerati come eccezioni (o
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larghezza',
 'exif-imagelength' => 'Altezza',
 'exif-bitspersample' => 'Bit per campione',
@@ -3381,7 +3463,7 @@ I collegamenti successivi, sulla stessa riga, sono considerati come eccezioni (o
 'exif-originalimageheight' => "Altezza dell'immagine prima che fosse ritagliata",
 'exif-originalimagewidth' => "Larghezza dell'immagine prima che fosse ritagliata",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nessuno',
 'exif-compression-2' => 'CCITT gruppo 3 monodimensionale - codifica run length di Huffman modificata',
 'exif-compression-3' => 'Codifica fax CCITT Group 3',
@@ -3789,7 +3871,6 @@ Si noti che è anche possibile [[Special:EditWatchlist|modificare la lista con l
 'version-other' => 'Altro',
 'version-mediahandlers' => 'Gestori di contenuti multimediali',
 'version-hooks' => 'Hook',
-'version-extension-functions' => 'Funzioni introdotte da estensioni',
 'version-parser-extensiontags' => 'Tag riconosciuti dal parser introdotti da estensioni',
 'version-parser-function-hooks' => 'Hook per funzioni del parser',
 'version-hook-name' => "Nome dell'hook",
@@ -3798,6 +3879,7 @@ Si noti che è anche possibile [[Special:EditWatchlist|modificare la lista con l
 'version-license' => 'Licenza',
 'version-poweredby-credits' => "Questo wiki è realizzato con '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'altri',
+'version-poweredby-translators' => 'traduttori di translatewiki.net',
 'version-credits-summary' => 'Siamo lieti di riconoscere le seguenti persone per aver contribuito a [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki è un software libero; puoi redistribuirlo e/o modificarlo secondo i termini della GNU General Public License, come pubblicata dalla Free Software Foundation; o la versione 2 della Licenza o (a propria scelta) qualunque versione successiva.
 
@@ -3813,12 +3895,17 @@ Questo programma deve essere distribuito assieme ad [{{SERVER}}{{SCRIPTPATH}}/CO
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Percorso voci]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Percorso script]',
 
-# Special:FilePath
-'filepath' => 'Percorso di un file',
-'filepath-page' => 'Nome del file:',
-'filepath-submit' => 'Vai',
-'filepath-summary' => 'Questa pagina speciale restituisce il percorso completo di un file.
-Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri tipi di file viene avviato direttamente il programma associato.',
+# Special:Redirect
+'redirect' => 'Reindirizzamento da file, utente o ID versione',
+'redirect-legend' => 'Reindirizza a un file o una pagina',
+'redirect-summary' => 'Questa pagina speciale reindirizza a un file (specificando il nome del file), a una pagina (specificando un ID di versione) o a un utente (specificando un ID utente numerico).',
+'redirect-submit' => 'Vai',
+'redirect-lookup' => 'Ricerca:',
+'redirect-value' => 'Valore:',
+'redirect-user' => 'ID utente',
+'redirect-revision' => 'Versione pagina',
+'redirect-file' => 'Nome del file',
+'redirect-not-exists' => 'Valore non trovato',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ricerca dei file duplicati',
@@ -3868,12 +3955,16 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'tags' => 'Etichette di modifiche valide',
 'tag-filter' => 'Filtra per [[Special:Tags|etichetta]]:',
 'tag-filter-submit' => 'Filtra',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etichetta|Etichette}}]]: $2)',
 'tags-title' => 'Etichette',
 'tags-intro' => 'Questa pagina elenca le etichette che il software potrebbe associare a una modifica e il loro significato.',
 'tags-tag' => "Nome dell'etichetta",
 'tags-display-header' => 'Aspetto nella lista delle modifiche',
 'tags-description-header' => 'Descrizione completa del significato',
+'tags-active-header' => 'Attivo?',
 'tags-hitcount-header' => 'Modifiche che hanno etichetta',
+'tags-active-yes' => 'Sì',
+'tags-active-no' => 'No',
 'tags-edit' => 'modifica',
 'tags-hitcount' => '$1 {{PLURAL:$1|modifica|modifiche}}',
 
@@ -3894,6 +3985,7 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'dberr-problems' => 'Questo sito sta avendo dei problemi tecnici.',
 'dberr-again' => 'Prova ad attendere qualche minuto e ricaricare.',
 'dberr-info' => '(Impossibile contattare il server del database: $1)',
+'dberr-info-hidden' => '(Impossibile contattare il server del database)',
 'dberr-usegoogle' => 'Puoi provare a cercare su Google nel frattempo.',
 'dberr-outofdate' => 'Nota che la loro indicizzazione dei nostri contenuti potrebbe non essere aggiornata.',
 'dberr-cachederror' => 'Quella che segue è una copia cache della pagina richiesta, e potrebbe non essere aggiornata.',
@@ -3909,6 +4001,9 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'htmlform-submit' => 'Invia',
 'htmlform-reset' => 'Annulla modifiche',
 'htmlform-selectorother-other' => 'Altro',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Sì',
+'htmlform-chosen-placeholder' => "Seleziona un'opzione",
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con la possibilità di ricerca completa nel testo',
@@ -4025,4 +4120,19 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 # Image rotation
 'rotate-comment' => 'Immagine ruotata di $1 {{PLURAL:$1|grado|gradi}} in senso orario',
 
+# Limit report
+'limitreport-title' => 'Dati profilo del parser:',
+'limitreport-cputime' => 'Tempo di utilizzo CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|secondo|secondi}}',
+'limitreport-walltime' => 'Tempo di utilizzo reale',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|secondo|secondi}}',
+'limitreport-ppvisitednodes' => 'Numero nodi preprocessore visitati',
+'limitreport-ppgeneratednodes' => 'Numero nodi preprocessore generati',
+'limitreport-postexpandincludesize' => 'Dimensione inclusioni post-espansione',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte}}',
+'limitreport-templateargumentsize' => 'Dimensione parametri template',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte}}',
+'limitreport-expansiondepth' => 'Massima profondità di espansione',
+'limitreport-expensivefunctioncount' => 'Numero funzioni parser dispendiose',
+
 );
diff --git a/languages/messages/MessagesJa.php b/languages/messages/MessagesJa.php
index f7a96970..29a2f53b 100644
--- a/languages/messages/MessagesJa.php
+++ b/languages/messages/MessagesJa.php
@@ -59,6 +59,7 @@
  * @author 欅
  * @author 蝋燭α
  * @author 青子守歌
+ * @author 아라
  */
 
 $datePreferences = array(
@@ -132,7 +133,7 @@ $specialPageAliases = array(
 	'Deadendpages'              => array( '有効なページへのリンクがないページ', '行き止まりページ' ),
 	'DeletedContributions'      => array( '削除された投稿記録', '削除された投稿履歴', '削除歴' ),
 	'Disambiguations'           => array( '曖昧さ回避のページ', '曖昧さ回避' ),
-	'DoubleRedirects'           => array( '二重リダイレクト' ),
+	'DoubleRedirects'           => array( '二重リダイレクト', '二重転送' ),
 	'EditWatchlist'             => array( 'ウォッチリストの編集', 'ウォッチリスト編集' ),
 	'Emailuser'                 => array( 'メール送信', 'ウィキメール' ),
 	'Export'                    => array( 'データ書き出し', 'データー書き出し', 'エクスポート' ),
@@ -141,6 +142,7 @@ $specialPageAliases = array(
 	'Filepath'                  => array( 'パスの取得' ),
 	'Import'                    => array( 'データ取り込み', 'データー取り込み', 'インポート' ),
 	'Invalidateemail'           => array( 'メール無効化', 'メール無効' ),
+	'JavaScriptTest'            => array( 'JavaScriptテスト', 'JavaScript試験' ),
 	'BlockList'                 => array( 'ブロック一覧', 'ブロックの一覧' ),
 	'LinkSearch'                => array( '外部リンク検索' ),
 	'Listadmins'                => array( '管理者一覧' ),
@@ -157,6 +159,7 @@ $specialPageAliases = array(
 	'MIMEsearch'                => array( 'MIME検索', 'MIMEタイプ検索' ),
 	'Mostcategories'            => array( 'カテゴリの多いページ', 'カテゴリの多い項目' ),
 	'Mostimages'                => array( '被リンクの多いファイル', '使用箇所の多いファイル' ),
+	'Mostinterwikis'            => array( 'ウィキ間リンクの多いページ' ),
 	'Mostlinked'                => array( '被リンクの多いページ' ),
 	'Mostlinkedcategories'      => array( '被リンクの多いカテゴリ' ),
 	'Mostlinkedtemplates'       => array( '使用箇所の多いテンプレート', '被リンクの多いテンプレート' ),
@@ -167,7 +170,8 @@ $specialPageAliases = array(
 	'Mytalk'                    => array( 'トークページ', '会話ページ', 'マイトーク', 'マイ・トーク' ),
 	'Myuploads'                 => array( '自分のアップロード記録' ),
 	'Newimages'                 => array( '新着ファイル', '新しいファイルの一覧', '新着画像展示室' ),
-	'Newpages'                  => array( '新しいページ', '新規項目' ),
+	'Newpages'                  => array( '新しいページ' ),
+	'PagesWithProp'             => array( 'プロパティがあるページ' ),
 	'PasswordReset'             => array( 'パスワード再設定', 'パスワードの再設定', 'パスワードのリセット', 'パスワードリセット' ),
 	'PermanentLink'             => array( '固定リンク', 'パーマリンク' ),
 	'Popularpages'              => array( '人気ページ' ),
@@ -179,6 +183,7 @@ $specialPageAliases = array(
 	'Randomredirect'            => array( 'おまかせリダイレクト', 'おまかせ転送' ),
 	'Recentchanges'             => array( '最近の更新', '最近更新したページ' ),
 	'Recentchangeslinked'       => array( '関連ページの更新状況', 'リンク先の更新状況' ),
+	'Redirect'                  => array( '転送', 'リダイレクト' ),
 	'Revisiondelete'            => array( '版指定削除', '特定版削除' ),
 	'Search'                    => array( '検索' ),
 	'Shortpages'                => array( '短いページ' ),
@@ -392,9 +397,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ページをウォッチしている利用者数を表示',
 'tog-oldsig' => '既存の署名:',
 'tog-fancysig' => '署名をウィキ文として扱う (自動リンクなし)',
-'tog-externaleditor' => '既定で編集に外部アプリケーションを使用 (上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
-'tog-externaldiff' => '差分表示に外部アプリケーションを使用 (上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
-'tog-showjumplinks' => '利用しやすさ向上のための「{{int:jumpto}}」リンクを有効にする',
 'tog-uselivepreview' => 'ライブプレビューを使用 (開発中)',
 'tog-forceeditsummary' => '要約欄が空欄の場合に確認を促す',
 'tog-watchlisthideown' => 'ウォッチリストに自分の編集を表示しない',
@@ -408,6 +410,8 @@ $messages = array(
 'tog-showhiddencats' => '隠しカテゴリを表示',
 'tog-noconvertlink' => 'リンクタイトル変換を無効にする',
 'tog-norollbackdiff' => '巻き戻し後の差分を表示しない',
+'tog-useeditwarning' => '変更を保存せずに編集画面から離れようとしたら警告',
+'tog-prefershttps' => 'ログインする際、常に SSL (https) 接続を使用する',
 
 'underline-always' => '常に付ける',
 'underline-never' => '常に付けない',
@@ -471,6 +475,18 @@ $messages = array(
 'oct' => '10月',
 'nov' => '11月',
 'dec' => '12月',
+'january-date' => '1月$1日',
+'february-date' => '2月$1日',
+'march-date' => '3月$1日',
+'april-date' => '4月$1日',
+'may-date' => '5月$1日',
+'june-date' => '6月$1日',
+'july-date' => '7月$1日',
+'august-date' => '8月$1日',
+'september-date' => '9月$1日',
+'october-date' => '10月$1日',
+'november-date' => '11月$1日',
+'december-date' => '12月$1日',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|カテゴリ}}',
@@ -552,6 +568,7 @@ $messages = array(
 'create-this-page' => 'このページを作成',
 'delete' => '削除',
 'deletethispage' => 'このページを削除',
+'undeletethispage' => 'このページを復元',
 'undelete_short' => '{{PLURAL:$1|$1 編集}}を復元',
 'viewdeleted_short' => '{{PLURAL:$1|削除された $1 編集}}を閲覧',
 'protect' => '保護',
@@ -595,7 +612,7 @@ $1',
 'pool-queuefull' => 'プールキューがいっぱいです',
 'pool-errorunknown' => '不明なエラー',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}について',
 'aboutpage' => 'Project:{{SITENAME}}について',
 'copyright' => '特に記載がない限り、内容は$1のライセンスで利用できます。',
@@ -605,7 +622,6 @@ $1',
 'disclaimers' => '免責事項',
 'disclaimerpage' => 'Project:免責事項',
 'edithelp' => '編集の仕方',
-'edithelppage' => 'Help:編集',
 'helppage' => 'Help:目次',
 'mainpage' => 'メインページ',
 'mainpage-description' => 'メインページ',
@@ -685,17 +701,12 @@ URL を間違って入力したか、正しくないリンクをたどった可
 # General errors
 'error' => 'エラー',
 'databaseerror' => 'データベース エラー',
-'dberrortext' => 'データベース クエリの構文エラーが発生しました。
-ソフトウェアにバグがある可能性があります。
-最後に実行を試みたクエリ:
-<blockquote><code>$1</code></blockquote>
-(関数「<code>$2</code>」内)。
-データベースはエラー「<samp>$3: $4</samp>」を返しました。',
-'dberrortextcl' => 'データベース クエリの構文エラーが発生しました。
-最後に実行を試みたクエリ:
-「$1」
-(関数「$2」内)。
-データベースはエラー「$3: $4」を返しました',
+'databaseerror-text' => 'データベース クエリのエラーが発生しました。
+これはソフトウェアのバグである可能性があります。',
+'databaseerror-textcl' => 'データベース クエリのエラーが発生しました。',
+'databaseerror-query' => 'クエリ: $1',
+'databaseerror-function' => '関数: $1',
+'databaseerror-error' => 'エラー: $1',
 'laggedslavemode' => "'''警告:''' ページに最新の編集が反映されていない可能性があります。",
 'readonly' => 'データベースがロックされています',
 'enterlockreason' => 'ロックの理由とロック解除の予定を入力してください',
@@ -729,6 +740,7 @@ URL を間違って入力したか、正しくないリンクをたどった可
 'cannotdelete-title' => '「$1」というページを削除できません',
 'delete-hook-aborted' => 'フックによって削除が中止されました。
 理由は不明です。',
+'no-null-revision' => 'ページ「$1」に新しい空編集の版を作成できませんでした。',
 'badtitle' => '正しくないページ名',
 'badtitletext' => '無効または空のページ名が指定されたか、言語間/ウィキ間リンクの方法に誤りがあります。
 ページ名に使用できない文字が含まれている可能性があります。',
@@ -752,12 +764,15 @@ URL を間違って入力したか、正しくないリンクをたどった可
 'editinginterface' => "'''警告:''' ソフトウェアのインターフェイスに使用されるテキストのページを編集しています。
 このページを変更すると、このウィキの他の利用者のユーザーインターフェイスの外観に影響します。
 すべてのウィキに対して翻訳を追加/変更する場合は、MediaWiki の地域化プロジェクト [//translatewiki.net/wiki/Main_Page?setlang=ja translatewiki.net] を使用してください。",
-'sqlhidden' => '(SQL クエリ非表示)',
 'cascadeprotected' => 'このページは、「カスケード保護」が指定された状態で保護されている以下の{{PLURAL:$1|ページ|ページ群}}で読み込まれているため、編集できないように保護されています:
 $2',
 'namespaceprotected' => "'''$1'''名前空間にあるページを編集する権限がありません。",
 'customcssprotected' => 'この CSS ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。',
 'customjsprotected' => 'この JavaScript ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。',
+'mycustomcssprotected' => 'あなたには CSS ページを編集する権限がありません。',
+'mycustomjsprotected' => 'あなたには JavaScript ページを編集する権限がありません。',
+'myprivateinfoprotected' => 'あなたには自身の非公開情報を編集する権限がありません。',
+'mypreferencesprotected' => 'あなたには自身の個人設定を編集する権限がありません。',
 'ns-specialprotected' => '特別ページは編集できません。',
 'titleprotected' => "[[User:$1|$1]]によりこのページ名を持つページの作成は保護されています。
 理由は「''$2''」です。",
@@ -782,10 +797,19 @@ $2',
 'welcomecreation-msg' => 'アカウントが作成されました。
 [[Special:Preferences|{{SITENAME}}の個人設定]]の変更も忘れないようにしてください。',
 'yourname' => '利用者名:',
+'userlogin-yourname' => '利用者名',
+'userlogin-yourname-ph' => '利用者名を入力',
+'createacct-another-username-ph' => '利用者名を入力',
 'yourpassword' => 'パスワード:',
+'userlogin-yourpassword' => 'パスワード',
+'userlogin-yourpassword-ph' => 'パスワードを入力',
+'createacct-yourpassword-ph' => 'パスワードを入力',
 'yourpasswordagain' => 'パスワード再入力:',
+'createacct-yourpasswordagain' => 'パスワード再入力',
+'createacct-yourpasswordagain-ph' => 'パスワードを再入力',
 'remembermypassword' => 'このブラウザーにログイン情報を保存 (最長 $1 {{PLURAL:$1|日|日間}})',
-'securelogin-stick-https' => 'ログイン後も SSL (https) 接続を維持',
+'userlogin-remembermypassword' => 'ログイン状態を保持',
+'userlogin-signwithsecure' => 'SSL (https) 接続を使用',
 'yourdomainname' => 'ドメイン:',
 'password-change-forbidden' => 'このウィキではパスワードを変更できません。',
 'externaldberror' => '認証データベースでエラーが発生した、または外部アカウントの更新が許可されていません。',
@@ -797,18 +821,44 @@ $2',
 'logout' => 'ログアウト',
 'userlogout' => 'ログアウト',
 'notloggedin' => 'ログインしていません',
+'userlogin-noaccount' => '登録がまだの場合',
+'userlogin-joinproject' => '{{SITENAME}}のアカウントを作成',
 'nologin' => '登録がまだの場合、$1。',
 'nologinlink' => 'アカウントを作成してください',
 'createaccount' => 'アカウント作成',
 'gotaccount' => 'アカウントを既に持っている場合、$1。',
 'gotaccountlink' => 'ログインしてください',
 'userlogin-resetlink' => 'ログイン情報をお忘れですか?',
+'userlogin-resetpassword-link' => 'パスワードを再設定',
+'helplogin-url' => 'Help:ログイン',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ログインのヘルプ]]',
+'userlogin-loggedin' => '{{GENDER:$1|$1}} として既にログインしています。
+別の利用者としてログインするには下のフォームを使用してください。',
+'userlogin-createanother' => '別アカウントを作成',
+'createacct-join' => '以下の情報を入力してください。',
+'createacct-another-join' => '新しいアカウントの情報を以下に記入してください。',
+'createacct-emailrequired' => 'メールアドレス',
+'createacct-emailoptional' => 'メールアドレス (省略可能)',
+'createacct-email-ph' => 'メールアドレスを入力',
+'createacct-another-email-ph' => 'メールアドレスを入力',
 'createaccountmail' => '一時的な無作為のパスワードを生成して、指定したメールアドレスに送信',
+'createacct-realname' => '本名 (省略可能)',
 'createaccountreason' => '理由:',
+'createacct-reason' => '理由',
+'createacct-reason-ph' => 'アカウントを作成する理由',
+'createacct-captcha' => '自動作成防止チェック',
+'createacct-imgcaptcha-ph' => '上に表示されている文字列を入力',
+'createacct-submit' => 'アカウントを作成',
+'createacct-another-submit' => '別アカウントを作成',
+'createacct-benefit-heading' => '{{SITENAME}}は、あなたのような人々が創っています。',
+'createacct-benefit-body1' => '{{PLURAL:$1|編集}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ページ}}',
+'createacct-benefit-body3' => '最近の{{PLURAL:$1|貢献者}}',
 'badretype' => '入力したパスワードが一致しません。',
 'userexists' => '入力された利用者名は既に使用されています。
 他の名前を選んでください。',
 'loginerror' => 'ログインのエラー',
+'createacct-error' => 'アカウント作成エラー',
 'createaccounterror' => 'アカウントを作成できませんでした: $1',
 'nocookiesnew' => '利用者アカウントは作成されましたが、ログインしていません。
 {{SITENAME}}では利用者のログインに Cookie を使用します。
@@ -877,10 +927,12 @@ Cookieを有効にしていることを確認して、このページを再読
 このアカウントが何かの手違いで作成された場合は、このメッセージを無視してください。',
 'usernamehasherror' => '利用者名には番号記号を含めることができません',
 'login-throttled' => 'ログインの失敗が制限回数を超えました。
-しばらく時間をおいてから再度試してください。',
+$1待ってから再度試してください。',
 'login-abort-generic' => 'ログインに失敗しました - 中止',
 'loginlanguagelabel' => '言語: $1',
 'suspicious-userlogout' => '壊れたブラウザーまたはキャッシュプロキシによって送信された可能性があるため、ログアウト要求は拒否されました。',
+'createacct-another-realname-tip' => '本名は省略できます。
+入力すると、その利用者の著作物の帰属表示に使われます。',
 
 # Email sending
 'php-mail-error-unknown' => 'PHPのmail()関数での不明なエラーです。',
@@ -897,8 +949,7 @@ Cookieを有効にしていることを確認して、このページを再読
 'newpassword' => '新しいパスワード:',
 'retypenew' => '新しいパスワードを再入力:',
 'resetpass_submit' => '再設定してログイン',
-'resetpass_success' => 'パスワードを変更しました!
-ログインしています...',
+'changepassword-success' => 'パスワードを変更しました!',
 'resetpass_forbidden' => 'パスワードは変更できません',
 'resetpass-no-info' => 'このページに直接アクセスするためにはログインしている必要があります。',
 'resetpass-submit-loggedin' => 'パスワードを変更',
@@ -910,10 +961,11 @@ Cookieを有効にしていることを確認して、このページを再読
 
 # Special:PasswordReset
 'passwordreset' => 'パスワードの再設定',
-'passwordreset-text' => 'このフォームに記入すると、パスワードを再設定できます。',
+'passwordreset-text-one' => 'パスワードを再設定するにはこのフォームに記入してください。',
+'passwordreset-text-many' => '{{PLURAL:$1|パスワードを再設定するにはいずれかの欄に記入してください。}}',
 'passwordreset-legend' => 'パスワードの再設定',
 'passwordreset-disabled' => 'パスワードの再設定は、このウィキでは無効になっています。',
-'passwordreset-pretext' => '{{PLURAL:$1||下記のデータのいずれか 1 つを入力してください}}',
+'passwordreset-emaildisabled' => 'メール機能は、このウィキでは無効化されています。',
 'passwordreset-username' => '利用者名:',
 'passwordreset-domain' => 'ドメイン:',
 'passwordreset-capture' => 'お送りするメールの内容を表示しますか?',
@@ -946,7 +998,7 @@ $2
 仮パスワード: $2',
 'passwordreset-emailsent' => 'パスワード再設定メールをお送りしました。',
 'passwordreset-emailsent-capture' => '下記の内容の、パスワード再設定メールをお送りしました。',
-'passwordreset-emailerror-capture' => '以下の内容のパスワード再設定メールを生成しましたが、利用者への送信に失敗しました: $1',
+'passwordreset-emailerror-capture' => '以下の内容のパスワード再設定メールを生成しましたが、{{GENDER:$2|利用者}}への送信に失敗しました: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'メールアドレスの変更',
@@ -960,6 +1012,19 @@ $2
 'changeemail-submit' => 'メールアドレスを変更',
 'changeemail-cancel' => '中止',
 
+# Special:ResetTokens
+'resettokens' => 'トークンの再設定',
+'resettokens-text' => 'ここでは、アカウントに関連付けられた特定の非公開データにアクセスするためのトークンを再設定できます。
+
+トークンを誤って他人に教えてしまった場合やあなたのアカウントが侵害された場合は、必ず再設定してください。',
+'resettokens-no-tokens' => '再設定できるトークンはありません。',
+'resettokens-legend' => 'トークンの再設定',
+'resettokens-tokens' => 'トークン:',
+'resettokens-token-label' => '$1 (現在の値: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|あなたのウォッチリストに登録されているページの変更]]を列挙するフィード (Atom/RSS) のトークン',
+'resettokens-done' => 'トークンを再設定しました。',
+'resettokens-resetbutton' => '選択したトークンを再設定',
+
 # Edit page toolbar
 'bold_sample' => '太字',
 'bold_tip' => '太字',
@@ -1166,12 +1231,15 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロッ
 既に削除されているようです。',
 'edit-conflict' => '編集が競合。',
 'edit-no-change' => '文章が変更されていないため、編集は無視されました。',
+'postedit-confirmation' => '編集を保存しました。',
 'edit-already-exists' => '新しいページを作成できませんでした。
 そのページは既に存在します。',
 'defaultmessagetext' => '既定のメッセージ文',
 'content-failed-to-parse' => '$2のコンテンツを$1モデルとして構文解析できませんでした: $3',
 'invalid-content-data' => '本文データが無効です',
 'content-not-allowed-here' => 'ページ [[$2]] では、「$1」コンテンツは許可されていません',
+'editwarning-warning' => 'このページを離れると、あなたが行なった変更がすべて失われてしまうかもしれません。
+ログインしている場合、個人設定の「編集」タブでこの警告を表示しないようにすることができます。',
 
 # Content models
 'content-model-wikitext' => 'ウィキテキスト',
@@ -1207,6 +1275,7 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロッ
 'undo-failure' => '中間の版での編集と競合したため、取り消せませんでした。',
 'undo-norev' => '取り消そうとした編集が存在しないか削除済みのため取り消せませんでした。',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|トーク]]) による版 $1 を取り消し',
+'undo-summary-username-hidden' => '秘匿された利用者による版 $1 を取り消し',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'アカウントを作成できません',
@@ -1388,6 +1457,7 @@ $1",
 'compareselectedversions' => '選択した版同士を比較',
 'showhideselectedversions' => '選択した版を表示/非表示',
 'editundo' => '取り消し',
+'diff-empty' => '(相違点なし)',
 'diff-multi' => '({{PLURAL:$2|$2人の利用者}}による、{{PLURAL:$1|間の$1版}}が非表示)',
 'diff-multi-manyusers' => '({{PLURAL:$2|$2人を超える利用者}}による、{{PLURAL:$1|間の$1版}}が非表示)',
 'difference-missing-revision' => '指定された{{PLURAL:$2|$2版}}の差分 ($1) が見つかりませんでした。
@@ -1415,7 +1485,6 @@ $1",
 'searchmenu-legend' => '検索オプション',
 'searchmenu-exists' => "'''このウィキには「[[:$1]]」という名前のページがあります'''",
 'searchmenu-new' => "'''このウィキでページ「[[:$1]]」を新規作成する'''",
-'searchhelp-url' => 'Help:目次',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|この文字列から始まる名前のページを見る]]',
 'searchprofile-articles' => '本文ページ',
 'searchprofile-project' => 'ヘルプとプロジェクトページ',
@@ -1459,15 +1528,7 @@ $1",
 'searchdisabled' => '{{SITENAME}}の検索機能は無効化されています。
 さしあたってはGoogleなどで検索できます。
 ただし外部の検索エンジンの索引にある{{SITENAME}}のコンテンツは古い場合があります。',
-
-# Quickbar
-'qbsettings' => 'クイックバー',
-'qbsettings-none' => 'なし',
-'qbsettings-fixedleft' => '左端',
-'qbsettings-fixedright' => '右端',
-'qbsettings-floatingleft' => 'ウィンドウの左上に固定',
-'qbsettings-floatingright' => 'ウィンドウの右上に固定',
-'qbsettings-directionality' => 'あなたの言語の文字体系の書字方向に応じて固定',
+'search-error' => '検索する際にエラーが発生しました: $1',
 
 # Preferences page
 'preferences' => '個人設定',
@@ -1501,7 +1562,6 @@ $1",
 'resetprefs' => '保存していない変更を破棄',
 'restoreprefs' => 'すべて初期設定に戻す (すべての節について)',
 'prefs-editing' => '編集',
-'prefs-edit-boxsize' => '編集ウィンドウのサイズ。',
 'rows' => '行数:',
 'columns' => '列数:',
 'searchresultshead' => '検索',
@@ -1512,9 +1572,9 @@ $1",
 'recentchangesdays-max' => '(最大 $1 {{PLURAL:$1|日|日間}})',
 'recentchangescount' => '既定で表示する件数:',
 'prefs-help-recentchangescount' => 'この設定は最近の更新、ページの履歴、および記録に適用されます。',
-'prefs-help-watchlist-token' => 'この欄に秘密鍵を入力すると、あなたのウォッチリストのRSSフィードが生成されます。
-この欄に入力されている鍵を知っている人は誰でもこのウォッチリストを閲覧できるようになるため、他人に分からない値を選んでください。
-乱数によって生成された次の値を使うこともできます: $1',
+'prefs-help-watchlist-token2' => 'これはあなたのウォッチリスト フィードの秘密のコードです。
+このトークンを知っている人は誰でもあなたのウォッチリストを読めてしまうため、他の人に教えないでください。
+[[Special:ResetTokens|トークンを再設定する必要がある場合はここをクリックしてください]]。',
 'savedprefs' => '個人設定を保存しました。',
 'timezonelegend' => 'タイムゾーン:',
 'localtime' => 'ローカルの時刻:',
@@ -1545,7 +1605,6 @@ $1",
 'prefs-reset-intro' => 'このページを使用すると、自分の個人設定をこのサイトの初期設定に戻せます。
 この操作は取り消せません。',
 'prefs-emailconfirm-label' => 'メールアドレスの確認:',
-'prefs-textboxsize' => '編集画面の大きさ',
 'youremail' => 'メールアドレス:',
 'username' => '{{GENDER:$1|利用者名}}:',
 'uid' => '{{GENDER:$1|利用者}} ID:',
@@ -1583,6 +1642,8 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'prefs-dateformat' => '日付と時刻の形式',
 'prefs-timeoffset' => '時差',
 'prefs-advancedediting' => '全般オプション',
+'prefs-editor' => 'エディター',
+'prefs-preview' => 'プレビュー',
 'prefs-advancedrc' => '詳細設定',
 'prefs-advancedrendering' => '詳細設定',
 'prefs-advancedsearchoptions' => '詳細設定',
@@ -1590,7 +1651,9 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'prefs-displayrc' => '表示の設定',
 'prefs-displaysearchoptions' => '表示の設定',
 'prefs-displaywatchlist' => '表示の設定',
+'prefs-tokenwatchlist' => 'トークン',
 'prefs-diffs' => '差分',
+'prefs-help-prefershttps' => 'この設定は、次回ログインの際に反映されます。',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'メールアドレスは有効のようです',
@@ -1619,6 +1682,8 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'userrights-changeable-col' => '変更できるグループ',
 'userrights-unchangeable-col' => '変更できないグループ',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => '利用者権限の変更が競合しています! 変更内容を確認してください。',
+'userrights-removed-self' => 'あなた自身の権限を除去しました。そのため、このページにはもうアクセスできません。',
 
 # Groups
 'group' => 'グループ:',
@@ -1684,11 +1749,19 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-proxyunbannable' => 'プロキシの自動ブロックを回避',
 'right-unblockself' => '自身に対するブロックを解除',
 'right-protect' => '保護レベルを変更し、カスケード保護されたページを編集',
-'right-editprotected' => '保護ページ (カスケード保護を除く) を編集',
+'right-editprotected' => '「{{int:protect-level-sysop}}」の保護を設定されたページを編集',
+'right-editsemiprotected' => '「{{int:protect-level-autoconfirmed}}」の保護を設定されたページを編集',
 'right-editinterface' => 'ユーザーインターフェースを編集',
 'right-editusercssjs' => '他の利用者のCSSファイル/JavaScriptファイルを編集',
 'right-editusercss' => '他の利用者のCSSファイルを編集',
 'right-edituserjs' => '他の利用者のJavaScriptファイルを編集',
+'right-editmyusercss' => '自身のCSSファイルを編集',
+'right-editmyuserjs' => '自身のJavaScriptファイルを編集',
+'right-viewmywatchlist' => 'ウォッチリストを閲覧',
+'right-editmywatchlist' => '自身のウォッチリストを編集 (注: この権限がなくてもページを追加できる権限が他にもあります)',
+'right-viewmyprivateinfo' => '自身の非公開データ (例: メールアドレス、本名) を閲覧',
+'right-editmyprivateinfo' => '自身の非公開データ (例: メールアドレス、本名) を編集',
+'right-editmyoptions' => '自身の個人設定を編集',
 'right-rollback' => '特定ページを最後に編集した利用者の編集を即時巻き戻し',
 'right-markbotedits' => '巻き戻しをボットの編集として扱う',
 'right-noratelimit' => '速度制限を受けない',
@@ -1750,12 +1823,19 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'action-userrights-interwiki' => '他のウィキの利用者の利用者権限変更',
 'action-siteadmin' => 'データベースのロックまたはロック解除',
 'action-sendemail' => 'メールの送信',
+'action-editmywatchlist' => '自身のウォッチリストの編集',
+'action-viewmywatchlist' => '自身のウォッチリストの閲覧',
+'action-viewmyprivateinfo' => '自分の非公開情報の閲覧',
+'action-editmyprivateinfo' => '自分の非公開情報の編集',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|回の変更}}',
+'enhancedrc-since-last-visit' => '最終閲覧以降 $1 {{PLURAL:$1|件}}',
+'enhancedrc-history' => '履歴',
 'recentchanges' => '最近の更新',
 'recentchanges-legend' => '最近の更新のオプション',
 'recentchanges-summary' => 'このページでは、このウィキでの最近の更新を確認できます。',
+'recentchanges-noresult' => '指定した条件に該当する期間の変更はありません。',
 'recentchanges-feed-description' => 'このフィードでこのウィキの最近の更新を追跡できます。',
 'recentchanges-label-newpage' => 'この編集で新しいページが作成されました',
 'recentchanges-label-minor' => 'これは細部の編集です',
@@ -1794,7 +1874,6 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'recentchangeslinked-feed' => '関連ページの更新状況',
 'recentchangeslinked-toolbox' => '関連ページの更新状況',
 'recentchangeslinked-title' => '「$1」と関連する変更',
-'recentchangeslinked-noresult' => '指定期間中に指定ページのリンク先に変更はありませんでした。',
 'recentchangeslinked-summary' => "これは指定したページからリンクされている (または指定したカテゴリに含まれている) ページの最近の変更の一覧です。
 [[Special:Watchlist|自分のウォッチリスト]]にあるページは'''太字'''で表示されます。",
 'recentchangeslinked-page' => 'ページ名:',
@@ -1806,7 +1885,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'reuploaddesc' => 'アップロードを中止してアップロードフォームへ戻る',
 'upload-tryagain' => '修正したファイル解説を投稿',
 'uploadnologin' => 'ログインしていません',
-'uploadnologintext' => 'ファイルをアップロードするには[[Special:UserLogin|ログイン]]する必要があります。',
+'uploadnologintext' => 'ファイルをアップロードするには$1する必要があります。',
 'upload_directory_missing' => 'アップロード先ディレクトリ ($1) が見つかりませんでした。ウェブ サーバーによる作成もできませんでした。',
 'upload_directory_read_only' => 'アップロード先ディレクトリ ($1) には、ウェブサーバーが書き込めません。',
 'uploaderror' => 'アップロードのエラー',
@@ -2046,7 +2125,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization をご覧ください
 'http-read-error' => 'HTTP読み込みエラーです。',
 'http-timed-out' => 'HTTP要求がタイムアウトしました。',
 'http-curl-error' => 'URLからの取得に失敗しました: $1',
-'http-host-unreachable' => 'URLに到達できません。',
 'http-bad-status' => 'HTTP リクエストで問題が発生しました: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2077,6 +2155,10 @@ URLが正しいものであり、ウェブサイトが稼働していること
 'listfiles_size' => 'サイズ',
 'listfiles_description' => '概要',
 'listfiles_count' => '版数',
+'listfiles-show-all' => '画像の古い版を含める',
+'listfiles-latestversion' => '現在の版',
+'listfiles-latestversion-yes' => 'はい',
+'listfiles-latestversion-no' => 'いいえ',
 
 # File description page
 'file-anchor-link' => 'ファイル',
@@ -2175,6 +2257,13 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'randompage' => 'おまかせ表示',
 'randompage-nopages' => '以下の{{PLURAL:$2|名前空間}}にはページがありません: $1',
 
+# Random page in category
+'randomincategory' => 'カテゴリ内でおまかせ表示',
+'randomincategory-invalidcategory' => '「$1」は有効なカテゴリ名ではありません。',
+'randomincategory-nopages' => 'カテゴリ [[:Category:$1|$1]] にはページがありません。',
+'randomincategory-selectcategory' => '以下のカテゴリでおまかせ表示: $1 $2',
+'randomincategory-selectcategory-submit' => '表示',
+
 # Random redirect
 'randomredirect' => 'おまかせリダイレクト',
 'randomredirect-nopages' => '「$1」名前空間に転送ページはありません。',
@@ -2200,17 +2289,13 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'statistics-users-active-desc' => '過去 {{PLURAL:$1|$1 日間}}に何らかの操作をした利用者',
 'statistics-mostpopular' => '最も閲覧されているページ',
 
-'disambiguations' => '曖昧さ回避ページにリンクしているページ',
-'disambiguationspage' => 'Template:曖昧回避',
-'disambiguations-text' => "以下のページには'''曖昧さ回避ページ'''へのリンクが 1 個以上あります。
-これらのリンクは、より適切なページへのリンクに変更する必要があります。<br />
-[[MediaWiki:Disambiguationspage]] にリンクがあるテンプレートを使用しているページを、曖昧さ回避ページと見なします。",
-
 'pageswithprop' => 'ページプロパティがあるページ',
 'pageswithprop-legend' => 'ページプロパティがあるページ',
 'pageswithprop-text' => 'このページでは、特定のページプロパティを持つページを列挙します。',
 'pageswithprop-prop' => 'プロパティ名:',
 'pageswithprop-submit' => '実行',
+'pageswithprop-prophidden-long' => 'プロパティ値のテキストが長いため非表示 ($1)',
+'pageswithprop-prophidden-binary' => 'プロパティ値のバイナリが長いため非表示 ($1)',
 
 'doubleredirects' => '二重転送',
 'doubleredirectstext' => 'このページでは、転送ページへの転送ページを列挙します。
@@ -2269,6 +2354,7 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'mostrevisions' => '版の多いページ',
 'prefixindex' => '先頭が同じ全ページ',
 'prefixindex-namespace' => '先頭が同じ全ページ ($1名前空間)',
+'prefixindex-strip' => '一覧で接頭辞を省略',
 'shortpages' => '短いページ',
 'longpages' => '長いページ',
 'deadendpages' => '行き止まりページ',
@@ -2284,6 +2370,7 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'listusers' => '利用者一覧',
 'listusers-editsonly' => '投稿記録のある利用者のみを表示',
 'listusers-creationsort' => '作成日順に並べ替え',
+'listusers-desc' => '降順に並べ替える',
 'usereditcount' => '$1 {{PLURAL:$1|回編集}}',
 'usercreated' => '$1 $2 に{{GENDER:$3|作成}}',
 'newpages' => '新しいページ',
@@ -2464,10 +2551,9 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'unwatchthispage' => 'ウォッチをやめる',
 'notanarticle' => '記事ではありません',
 'notvisiblerev' => '別の利用者による最終版は削除されました',
-'watchnochange' => 'ウォッチリストに登録しているページで、指定期間内に編集されたものはありません。',
 'watchlist-details' => 'ウォッチリストには {{PLURAL:$1|$1 ページ}}が登録されています (トークページを除く)。',
-'wlheader-enotif' => '* メール通知が有効になっています。',
-'wlheader-showupdated' => "* 最終訪問以降に変更されたページは、'''太字'''で表示されます",
+'wlheader-enotif' => 'メール通知が有効になっています。',
+'wlheader-showupdated' => "最終訪問以降に変更されたページは、'''太字'''で表示されます。",
 'watchmethod-recent' => '最近の更新内のウォッチされているページを確認中',
 'watchmethod-list' => 'ウォッチされているページ内の最近の更新を確認中',
 'watchlistcontains' => 'ウォッチリストには {{PLURAL:$1|$1 ページ}}が登録されています。',
@@ -2724,7 +2810,7 @@ $1',
 'contributions' => '{{GENDER:$1|利用者}}の投稿記録',
 'contributions-title' => '$1の投稿記録',
 'mycontris' => '投稿記録',
-'contribsub2' => '利用者: $1 ($2)',
+'contribsub2' => '利用者: {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'これらの条件に一致する変更は見つかりませんでした。',
 'uctop' => '(最新)',
 'month' => 'この月以前:',
@@ -2883,16 +2969,14 @@ $1 のブロックの理由は「''$2''」です。",
 ただし、$2の範囲でブロックされており、こちらのブロックは別途解除できます。',
 'ip_range_invalid' => 'IP範囲が無効です。',
 'ip_range_toolarge' => '/$1より広範囲の範囲ブロックは許可されていません。',
-'blockme' => '自分をブロック',
 'proxyblocker' => 'プロキシブロック係',
-'proxyblocker-disabled' => 'この機能は無効になっています。',
 'proxyblockreason' => 'このIPアドレスは公開プロキシであるためブロックされています。
 ご使用中のインターネットサービスプロバイダーまたは所属組織の技術担当者に連絡して、これが深刻なセキュリティ問題であることを伝えてください。',
-'proxyblocksuccess' => '完了。',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。',
 'sorbs_create_account_reason' => 'ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。
 アカウント作成はできません',
+'xffblockreason' => 'X-Forwarded-For ヘッダーに含まれている IP アドレスがブロックされています。これはあなたのものか、あなたが利用しているプロキシサーバーのものです。元のブロックの理由は: $1',
 'cant-block-while-blocked' => 'ブロックされている間は、他の利用者をブロックできません。',
 'cant-see-hidden-user' => 'ブロックしようとしている利用者は、既にブロックされ隠されています。
 あなたには hideuser 権限がないため、この利用者のブロックの閲覧/編集はできません。',
@@ -3059,6 +3143,8 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 'thumbnail-more' => '拡大',
 'filemissing' => 'ファイルがありません',
 'thumbnail_error' => 'サムネイルの作成エラー: $1',
+'thumbnail_error_remote' => '$1が返したエラーメッセージ:
+$2',
 'djvu_page_error' => 'DjVuページが範囲外です',
 'djvu_no_xml' => 'DjVuファイルのXMLデータを取得できません',
 'thumbnail-temp-create' => '一時的なサムネイルファイルを作成できません',
@@ -3212,17 +3298,11 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 
 # Stylesheets
 'common.css' => '/* ここに記述したCSSはすべての外装に反映されます */',
-'standard.css' => '/* ここに記述したCSSはスタンダード外装の利用者に影響します */',
-'nostalgia.css' => '/* ここに記述したCSSはノスタルジア外装の利用者に影響します */',
 'cologneblue.css' => '/* ここに記述したCSSはケルンブルー外装の利用者に影響します */',
 'monobook.css' => '/* ここに記述したCSSはモノブック外装の利用者に影響します */',
-'myskin.css' => '/* ここに記述したCSSはマイスキン外装の利用者に影響します */',
-'chick.css' => '/* ここに記述したCSSはチック外装の利用者に影響します */',
-'simple.css' => '/* ここに記述したCSSはシンプル外装の利用者に影響します */',
 'modern.css' => '/* ここに記述したCSSはモダン外装の利用者に影響します */',
 'vector.css' => '/* ここに記述したCSSはベクター外装の利用者に影響します */',
 'print.css' => '/* ここに記述したCSSは印刷出力に影響します */',
-'handheld.css' => '/* ここに記述したCSSは$wgHandheldStyleで設定された外装に基づく携帯機器に影響します */',
 'noscript.css' => '/* ここに記述したCSSはJavaScriptを無効にしている利用者に影響します */',
 'group-autoconfirmed.css' => '/* ここに記述したCSSは自動承認された利用者のみに影響します */',
 'group-bot.css' => '/* ここに記述したCSSはボットのみに影響します */',
@@ -3231,13 +3311,8 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 
 # Scripts
 'common.js' => '/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */',
-'standard.js' => '/* ここにあるすべてのJavaScriptは、スタンダード外装を使用している利用者に対して読み込まれます */',
-'nostalgia.js' => '/* ここにあるすべてのJavaScriptは、ノスタルジア外装を使用している利用者に対して読み込まれます */',
 'cologneblue.js' => '/* ここにあるすべてのJavaScriptは、ケルンブルー外装を使用している利用者に対して読み込まれます */',
 'monobook.js' => '/* ここにあるすべてのJavaScriptは、モノブック外装を使用している利用者に対して読み込まれます */',
-'myskin.js' => '/* ここにあるすべてのJavaScriptは、マイスキン外装を使用している利用者に対して読み込まれます */',
-'chick.js' => '/* ここにあるすべてのJavaScriptは、チック外装を使用している利用者に対して読み込まれます */',
-'simple.js' => '/* ここにあるすべてのJavaScriptは、シンプル外装を使用している利用者に対して読み込まれます */',
 'modern.js' => '/* ここにあるすべてのJavaScriptは、モダン外装を使用している利用者に対して読み込まれます */',
 'vector.js' => '/* ここにあるすべてのJavaScriptは、ベクター外装を使用している利用者に対して読み込まれます */',
 'group-autoconfirmed.js' => '/* ここにあるすべてのJavaScriptは、自動承認された利用者に対して読み込まれます */',
@@ -3318,13 +3393,8 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 'pageinfo-category-files' => 'ファイル数',
 
 # Skin names
-'skinname-standard' => 'クラシック',
-'skinname-nostalgia' => 'ノスタルジア',
 'skinname-cologneblue' => 'ケルンブルー',
 'skinname-monobook' => 'モノブック',
-'skinname-myskin' => 'マイスキン',
-'skinname-chick' => 'チック',
-'skinname-simple' => 'シンプル',
 'skinname-modern' => 'モダン',
 'skinname-vector' => 'ベクター',
 
@@ -3409,11 +3479,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 分}}',
 'hours' => '{{PLURAL:$1|$1 時間}}',
 'days' => '{{PLURAL:$1|$1 日}}',
+'weeks' => '{{PLURAL:$1|$1 週間}}',
 'months' => '{{PLURAL:$1|$1 か月}}',
 'years' => '{{PLURAL:$1|$1 年}}',
 'ago' => '$1前',
 'just-now' => 'ちょうど今',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|時間}}前',
+'minutes-ago' => '$1 {{PLURAL:$1|分}}前',
+'seconds-ago' => '$1 {{PLURAL:$1|秒}}前',
+'monday-at' => '月曜日 $1',
+'tuesday-at' => '火曜日 $1',
+'wednesday-at' => '水曜日 $1',
+'thursday-at' => '木曜日 $1',
+'friday-at' => '金曜日 $1',
+'saturday-at' => '土曜日 $1',
+'sunday-at' => '日曜日 $1',
+'yesterday-at' => '昨日 $1',
+
 # Bad image list
 'bad_image_list' => '書式は以下の通りです:
 
@@ -3496,7 +3580,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '画像の幅',
 'exif-imagelength' => '画像の高さ',
 'exif-bitspersample' => '画像のビットの深さ',
@@ -3674,7 +3758,7 @@ Variants for Chinese language
 'exif-originalimageheight' => 'トリミングされる前の画像の高さ',
 'exif-originalimagewidth' => 'トリミングされる前の画像の幅',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '無圧縮',
 'exif-compression-2' => 'CCITT Group 3 1次元修正ハフマン連長符号化',
 'exif-compression-3' => 'CCITT Group 3 ファックス符号化',
@@ -4149,7 +4233,6 @@ $5
 'version-other' => 'その他',
 'version-mediahandlers' => 'メディアハンドラー',
 'version-hooks' => 'フック',
-'version-extension-functions' => '拡張機能関数',
 'version-parser-extensiontags' => '構文解析拡張機能タグ',
 'version-parser-function-hooks' => 'パーサー関数フック',
 'version-hook-name' => 'フック名',
@@ -4158,6 +4241,7 @@ $5
 'version-license' => 'ライセンス',
 'version-poweredby-credits' => "このウィキは、'''[//www.mediawiki.org/ MediaWiki]''' (copyright © 2001-$1 $2) で動作しています。",
 'version-poweredby-others' => 'その他',
+'version-poweredby-translators' => 'translatewiki.net の翻訳者たち',
 'version-credits-summary' => '[[Special:Version|MediaWiki]] に貢献した以下の人たちに感謝します。',
 'version-license-info' => 'MediaWikiはフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License) (バージョン2、またはそれ以降のライセンス) の規約に基づき、このライブラリを再配布および改変できます。
 
@@ -4173,12 +4257,17 @@ MediaWikiは、有用であることを期待して配布されていますが
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath/ja 記事のパス]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath/ja スクリプトパス]',
 
-# Special:FilePath
-'filepath' => 'ファイルパス',
-'filepath-page' => 'ファイル:',
-'filepath-submit' => '取得',
-'filepath-summary' => 'この特別ページは、ファイルへの完全なパスを返します。
-画像は最大解像度で表示され、他のファイルタイプは関連付けされたプログラムが直接起動します。',
+# Special:Redirect
+'redirect' => 'ファイル名、利用者ID、版IDでの転送',
+'redirect-legend' => 'ファイルまたはページヘの転送',
+'redirect-summary' => 'この特別ページは、ファイル (ファイル名を指定)、ページ (版 ID を指定)、利用者ページ (利用者 ID を整数で指定) に転送されます。',
+'redirect-submit' => '実行',
+'redirect-lookup' => '検索の種類:',
+'redirect-value' => '値:',
+'redirect-user' => '利用者 ID',
+'redirect-revision' => 'ページの版 ID',
+'redirect-file' => 'ファイル名',
+'redirect-not-exists' => '値が見つかりません',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '重複ファイルの検索',
@@ -4227,12 +4316,16 @@ MediaWikiは、有用であることを期待して配布されていますが
 'tags' => '有効な変更タグ',
 'tag-filter' => '[[Special:Tags|タグ]]絞り込み:',
 'tag-filter-submit' => '絞り込み',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|タグ}}]]: $2)',
 'tags-title' => 'タグ',
 'tags-intro' => 'このページは、ソフトウェアが編集に対して付けるタグとその意味の一覧です。',
 'tags-tag' => 'タグ名',
 'tags-display-header' => '変更一覧に表示されるもの',
 'tags-description-header' => '詳細な意味の説明',
+'tags-active-header' => 'アクティブ?',
 'tags-hitcount-header' => 'タグが付与された変更',
+'tags-active-yes' => 'はい',
+'tags-active-no' => 'いいえ',
 'tags-edit' => '編集',
 'tags-hitcount' => '$1 {{PLURAL:$1|回の変更}}',
 
@@ -4253,6 +4346,7 @@ MediaWikiは、有用であることを期待して配布されていますが
 'dberr-problems' => '申し訳ありません! このウェブサイトに技術的な障害が発生しています。',
 'dberr-again' => '数分間待った後、もう一度読み込んでください。',
 'dberr-info' => '(データベースサーバー $1 に接続できませんでした)',
+'dberr-info-hidden' => '(データベース サーバーと通信できません)',
 'dberr-usegoogle' => '元に戻るまで、Googleを利用して検索できます。',
 'dberr-outofdate' => '収集された内容は古い可能性があることに注意してください。',
 'dberr-cachederror' => 'これは要求されたページをキャッシュした複製であり、古くなっている可能性があります。',
@@ -4268,6 +4362,9 @@ MediaWikiは、有用であることを期待して配布されていますが
 'htmlform-submit' => '送信',
 'htmlform-reset' => '変更を取り消す',
 'htmlform-selectorother-other' => 'その他',
+'htmlform-no' => 'いいえ',
+'htmlform-yes' => 'はい',
+'htmlform-chosen-placeholder' => '選択してください',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 (全文検索あり)',
@@ -4385,4 +4482,19 @@ MediaWikiは、有用であることを期待して配布されていますが
 # Image rotation
 'rotate-comment' => '画像を時計回りに $1 {{PLURAL:$1|度}}回転',
 
+# Limit report
+'limitreport-title' => 'パーサーのプロファイリング データ:',
+'limitreport-cputime' => 'CPU 時間',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|秒}}',
+'limitreport-walltime' => '実時間',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|秒}}',
+'limitreport-ppvisitednodes' => 'プリプロセッサが訪問したノード数',
+'limitreport-ppgeneratednodes' => 'プリプロセッサが生成したノード数',
+'limitreport-postexpandincludesize' => '参照読み込みの展開後のサイズ',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|バイト}}',
+'limitreport-templateargumentsize' => 'テンプレート引数のサイズ',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|バイト}}',
+'limitreport-expansiondepth' => '展開の最大深さ',
+'limitreport-expensivefunctioncount' => '高負荷パーサー関数の数',
+
 );
diff --git a/languages/messages/MessagesJam.php b/languages/messages/MessagesJam.php
index 9de985dc..a5f83393 100644
--- a/languages/messages/MessagesJam.php
+++ b/languages/messages/MessagesJam.php
@@ -43,9 +43,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Shuo di nomba a wachin yuuza',
 'tog-oldsig' => 'Priivyuu a egzisin signicha:',
 'tog-fancysig' => 'Chriit signicha az wikitex (widoutn aatamatik lingk)',
-'tog-externaleditor' => 'Yuuz extoernal edita bai difaalt (fi expoert onli, niid speshal setn pahn yu kompiuta)',
-'tog-externaldiff' => 'Yuuz extoernal dif bai difaalt (fi expoert onli, niid speshal setn pahn yu kompiuta)',
-'tog-showjumplinks' => 'Eniebl "jomp tu" aksesibiliti lingk',
 'tog-uselivepreview' => 'Yuuz laiv priivyuu (rikwaya JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Pramp mi wen entarin blangk edit somari',
 'tog-watchlisthideown' => 'Aid mi editdem frahn di wachlis',
@@ -243,7 +240,7 @@ $1',
 'pool-queuefull' => 'Puul kyuu fulop',
 'pool-errorunknown' => 'Anuon era',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Habowt {{SITENAME}}',
 'aboutpage' => 'Project: អំពី',
 'copyright' => 'Kantent avielobl anda $1.',
@@ -253,7 +250,6 @@ $1',
 'disclaimers' => 'Diskliema',
 'disclaimerpage' => 'Project: Jinaral diskliema',
 'edithelp' => 'Editin elp',
-'edithelppage' => 'Help: Editin',
 'helppage' => 'Help: Kantent',
 'mainpage' => 'Mien piej',
 'mainpage-description' => 'Mien piej',
@@ -324,17 +320,6 @@ A lis a valid peshal piej kiahn fain a [[Special:SpecialPages|{{int:specialpages
 # General errors
 'error' => 'Era',
 'databaseerror' => 'Dietabies era',
-'dberrortext' => 'A dietabies kwieri sintax era okor.
-Dis maita indikiet wahn bog ina di saafwier.
-Di laas atemp dietabies kwieri ena:
-<blockquote><tt>$1</tt></blockquote>
-frahn widin fongshan "<tt>$2</tt>".
-Dietabies ritoern era "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'A dietabies kwieri sintax era okor.
-Di laas attemp dietabies kwieri ena:
-"$1"
-frahn widin fongshan "$2".
-Dietabies ritoern era "$3: $4"',
 'laggedslavemode' => "'''Waanin:''' Piej maita no kantien riisant opdiet.",
 'readonly' => 'Dietabies lak',
 'enterlockreason' => 'Enta a riizn fi di lak, inkluudn a estimet a wen di lak wi riliis',
@@ -387,7 +372,6 @@ Begyu chrai agen ina fyuu minit.',
 'editinginterface' => "'''Waanin:''' Yu de edit page we yuuz fi provaid intafies tex fi di saafwier.
 Chienj tu dis piej wi afek di apierans a di yuuza intafies fi ada yuuzadem.
 Fi chranslieshan, begyu kansida fi yuuz [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], di MediaWiki luokalaizieshan projek.",
-'sqlhidden' => '(SQL kwieri aidwe)',
 'cascadeprotected' => 'Dis piej protek frahn edit, bikaa i\'inkluud ina di falarin {{PLURAL:$1|piej, ush|piejdem, ush}} protek wid di "kiaskiedn" apshan ton aan:
 $2',
 'namespaceprotected' => "Yu no gat no pomishan fi edit piej ina di '''$1''' niemspies.",
@@ -507,7 +491,7 @@ Fi finish lag iin, yu mos set a nyuu paaswod yaso:',
 'newpassword' => 'Nyuu paaswod:',
 'retypenew' => 'Ritaip nyuu paaswod:',
 'resetpass_submit' => 'Set paaswod ahn lag iin',
-'resetpass_success' => 'Yu paaswod chienj soksesfuli!
+'changepassword-success' => 'Yu paaswod chienj soksesfuli!
 A lag yu iin nou ...',
 'resetpass_forbidden' => 'Paaswod kyaahn chienj',
 'resetpass-no-info' => 'Yu mos lag iin fi akses dis piej dairek.',
diff --git a/languages/messages/MessagesJut.php b/languages/messages/MessagesJut.php
index 503c0f4f..b0b0ff3c 100644
--- a/languages/messages/MessagesJut.php
+++ b/languages/messages/MessagesJut.php
@@ -43,8 +43,6 @@ $messages = array(
 'tog-enotifrevealaddr' => "Ves miin e-mail-adresse i mails ve besked ændrenger'm",
 'tog-shownumberswatching' => 'Ves åntal brugere, der åvervåger',
 'tog-fancysig' => 'Signaturer uden åtåmatisk henvesnenge',
-'tog-externaleditor' => 'Brug ekstern redigærengsmåskiin åtåmatisk',
-'tog-externaldiff' => 'Brug ekstern førskelsvesnenge åtåmatisk',
 'tog-showjumplinks' => 'Ves tilgængelegheds-henvesnenger',
 'tog-uselivepreview' => 'Brug åtåmatisk førhåndsvesnenge (JavaScript) (eksperimentel)',
 'tog-forceeditsummary' => 'Advar, hves sammenfatnenge mangler ve gemnenge',
@@ -206,7 +204,6 @@ $messages = array(
 'disclaimers' => 'Førbeholt',
 'disclaimerpage' => 'Project:Huses førbeholt',
 'edithelp' => 'Hjælp til redigærenge',
-'edithelppage' => "Help:Vordan redigærer a'n side",
 'helppage' => 'Help:Hjælpførside',
 'mainpage' => 'Førsit',
 'mainpage-description' => 'Førsit',
@@ -441,7 +438,6 @@ hersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre 
 'prevn' => 'førge {{PLURAL:$1|$1}}',
 'nextn' => 'nægste {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Ves ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Hjælpførside',
 'searchall' => 'ål',
 'powersearch' => 'Søĝ',
 
@@ -489,7 +485,6 @@ hersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre 
 'recentchangeslinked-feed' => 'Relaterede ændrenger',
 'recentchangeslinked-toolbox' => 'Relaterede ændrenger',
 'recentchangeslinked-title' => 'Ændrenger der vegånde til "$1"',
-'recentchangeslinked-noresult' => 'I det udvalgte tidsrum blev der ekke føretaget ændrenger på siderne der henveses til.',
 'recentchangeslinked-summary' => "Denne sonstside beser de seneste ændrenger på de sider der henveses til. Sider på din åvervågnengsliste er vest ve '''fed''' skreft.",
 
 # Upload
diff --git a/languages/messages/MessagesJv.php b/languages/messages/MessagesJv.php
index 5f618574..6c315dec 100644
--- a/languages/messages/MessagesJv.php
+++ b/languages/messages/MessagesJv.php
@@ -81,11 +81,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Tuduhna cacahé pangawas',
 'tog-oldsig' => 'Tapak asma sing ana:',
 'tog-fancysig' => 'Anggepen tapak asta minangka teks wiki (tanpa pranala otomatis)',
-'tog-externaleditor' => 'Pigunakaken program pangolah tembung jawi (namung tumrap ahli, perlu pangaturan mligi ing komputer panjenengan. 
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi sajangkepipun].)',
-'tog-externaldiff' => 'Pigunakaken diff eksternal sacara bektan (namung tumrap para ahli, perlu pangaturan mligi ing komputer panjenengan.
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi sajangkepipun].)',
-'tog-showjumplinks' => 'Aktifna pranala pambiyantu "langsung menyang"',
 'tog-uselivepreview' => 'Nganggoa pratayang langsung (mbutuhaké JavaScript) (eksperimental)',
 'tog-forceeditsummary' => 'Élingna aku menawa kothak ringkesan suntingan isih kosong',
 'tog-watchlisthideown' => 'Delikna suntinganku ing daftar pangawasan',
@@ -98,6 +93,7 @@ $messages = array(
 'tog-diffonly' => 'Aja dituduhaké isi kaca ing ngisor bédané suntingan',
 'tog-showhiddencats' => 'Tuduhna kategori sing didelikaké',
 'tog-norollbackdiff' => 'Lirwaaké prabédan sawusé nglakokaké sawijining pambalikan.',
+'tog-useeditwarning' => 'Èlingaké kula yèn kula ninggalaké suntingan sing durung kasimpen',
 
 'underline-always' => 'Tansah',
 'underline-never' => 'Ora',
@@ -161,6 +157,10 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Des',
+'may-date' => '$1 Mèi',
+'september-date' => '$1 Sèptèmber',
+'november-date' => '$1 Novèmber',
+'december-date' => '$1 Dèsèmber',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategori}}',
@@ -242,6 +242,7 @@ $messages = array(
 'create-this-page' => 'Nggawé kaca iki',
 'delete' => 'Busak',
 'deletethispage' => 'Busak kaca iki',
+'undeletethispage' => 'Wurung busak kaca iki',
 'undelete_short' => 'Batal busak $1 {{PLURAL:$1|suntingan|suntingan}}',
 'viewdeleted_short' => 'Pirsani {{PLURAL:$1|suntingan|suntingan}} ingkang sampun kabusak',
 'protect' => 'Reksanen',
@@ -285,7 +286,7 @@ $1',
 'pool-queuefull' => 'Kempalan antrian kebak',
 'pool-errorunknown' => 'Kalepata ingkang mboten dipun mangertosi',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Prakara {{SITENAME}}',
 'aboutpage' => 'Project:Prakara',
 'copyright' => 'Kabèh isi kasedyakaké miturut $1.',
@@ -295,7 +296,6 @@ $1',
 'disclaimers' => 'Pamaidonan',
 'disclaimerpage' => 'Project:Panyangkalan umum',
 'edithelp' => 'Pitulung panyuntingan',
-'edithelppage' => 'Help:panyuntingan',
 'helppage' => 'Help:Isi',
 'mainpage' => 'Kaca Utama',
 'mainpage-description' => 'Kaca Utama',
@@ -370,16 +370,6 @@ Iki manawa uga nuduhaké anané kesalahan ing piranti alus sing dipigunakaké d
 # General errors
 'error' => 'Kasalahan',
 'databaseerror' => 'Kasalahan database',
-'dberrortext' => 'Ana kasalahan sintaks ing panyuwunan basis data.
-Kasalahan iki mbokmenawa nuduhaké anané \'\'bug\'\' ing software.
-Panyuwunan basis data sing pungkasan yakuwi: <blockquote><code>$1</code></blockquote>
-saka jroning fungsi "<code>$2</code>".
-Basis data ngasilaké kasalahan "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ana kasalahan sintaks ing panyuwunan basis data.
-Panyuwunan basis data sing pungkasan iku:
-"$1"
-saka jroning fungsi "$2".
-Basis data ngasilaké kasalahan "$3: $4".',
 'laggedslavemode' => 'Pènget: Kaca iki mbokmenawa isiné dudu pangowahan pungkasan.',
 'readonly' => 'Database dikunci',
 'enterlockreason' => 'Lebokna alesan panguncèn, kalebu uga prakiran kapan kunci bakal dibuka',
@@ -426,12 +416,12 @@ Mangga dicoba manèh ing sawetara menit.',
 'editinginterface' => "'''Pènget:''' Panjenengan nyunting kaca sing dianggo nyedyakaké tèks antarmuka kanggo piranti alus.
 Pangowahan kaca iki bakal awèh pangaruh marang tampilan antarmuka panganggo kanggoné panganggo liya.
 Kanggo terjemahan, mangga nganggo [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], proyèk lokalisasi MediaWiki.",
-'sqlhidden' => '(Panyuwunan SQL didelikaké)',
 'cascadeprotected' => 'Kaca iki wis direksa saka panyuntingan amerga disertakaké ing {{PLURAL:$1|kaca|kaca-kaca}} ngisor iki sing wis direksa mawa opsi "runtun" diaktifaké:
 $2',
 'namespaceprotected' => "Panjenengan ora kagungan idin kanggo nyunting kaca ing bilik nama '''$1'''.",
 'customcssprotected' => 'Sampéyan ora dililakaké nyunting kaca CSS iki amarga kaisi pangaturan pribadi saka panganggo liya.',
 'customjsprotected' => 'Sampéyan ora dililakaké nyunting kaca JavaScript iki amarga kaisi pangaturan pribadi saka panganggo liya.',
+'mycustomcssprotected' => 'Sampèyan ora duwé idin kanggo ngowah kaca CSS iki.',
 'ns-specialprotected' => 'Kaca ing bilik nama astaméwa utawa kusus, ora bisa disunting.',
 'titleprotected' => "Irah-irahan iki direksa ora olèh digawé déning [[User:$1|$1]].
 Alesané yaiku ''$2''.",
@@ -457,10 +447,11 @@ Cathet yèn sapérangan kaca mungkin isih nampilaké kayata sampéyan isih mlebu
 'welcomeuser' => 'Sugeng Rawuh, $1!',
 'welcomecreation-msg' => 'Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] panjenengan.',
 'yourname' => 'Asma pangangeman',
+'userlogin-yourname' => 'Jeneng panganggo',
+'userlogin-yourname-ph' => 'Lebokaké jenengné panganggo',
 'yourpassword' => 'Tembung sandhi:',
 'yourpasswordagain' => 'Balènana tembung sandhi',
 'remembermypassword' => 'Émut tembung sandi kula (salebeting $1 {{PLURAL:$1|dinten|dinten}})',
-'securelogin-stick-https' => 'Tetep kahubung dhumateng HTTPS sasampunipun mlebet log',
 'yourdomainname' => 'Dhomain panjenengan',
 'password-change-forbidden' => 'Sampéyan ora bisa ngganti tembung sandhi nèng wiki iki.',
 'externaldberror' => 'Ana kasalahan otèntikasi basis dhata èksternal utawa panjenengan ora pareng nglakoni pemutakhiran marang akun èksternal panjenengan.',
@@ -552,7 +543,7 @@ Tulung nunggu dhisik sadurungé njajal manèh.',
 'newpassword' => 'Tembung sandi anyar:',
 'retypenew' => 'Ketik ulang tembung sandi anyar:',
 'resetpass_submit' => 'Nata tembung sandhi lan mlebu log',
-'resetpass_success' => 'Tembung sandhi panjenengan wis suksès diowahi! Saiki mrosès mlebu log panjenengan...',
+'changepassword-success' => 'Tembung sandhi panjenengan wis suksès diowahi! Saiki mrosès mlebu log panjenengan...',
 'resetpass_forbidden' => 'Tembung sandhi ora bisa diganti',
 'resetpass-no-info' => 'Panjenengan kudu mlebu log kanggo ngaksès kaca iki sacara langsung.',
 'resetpass-submit-loggedin' => 'Ganti tembung sandi',
@@ -564,10 +555,8 @@ Panjengen manawa wis kasil ganti tembung sandi utawa nyuwun tembung sandi saunta
 
 # Special:PasswordReset
 'passwordreset' => 'Balèni setèl tembung sandhi',
-'passwordreset-text' => 'Jangkepi pormulir iki kanggo mbalèkaké tembung sandhiné Sampéyan.',
 'passwordreset-legend' => 'Balèni setèl tembung sandhi',
 'passwordreset-disabled' => 'Piranti kanggo mbalèni nyetèl tembung sandhi dipatèni nèng wiki iki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Lebokaké siji bagéyan data ngisor iki}}',
 'passwordreset-username' => 'Jeneng panganggo:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Delok layang èlèktronik sing diasilaké?',
@@ -590,7 +579,7 @@ Sampéyan kudu mlebu log lan milih siji tembung sandhi anyar saiki. Yèn wong li
 Tembung sandhi sawetara: $2',
 'passwordreset-emailsent' => 'Layang èlèktronik kanggo mbalèkaké tembung sandhi wis dikirim.',
 'passwordreset-emailsent-capture' => 'Layang èlèktronik kanggo mbalèkaké tembung sandhi wis dikirim, bisa didelok ngisor iki.',
-'passwordreset-emailerror-capture' => 'Layang èlèktronik pangèling ditampilaké nèng ngisor iki, nanging ora kasil dikirim: $1',
+'passwordreset-emailerror-capture' => 'Layang èlèktronik kanggo mbalèkaké tembung sandhi wis ditokaké, bisa didelok ngisor iki, nanging gagal nalika dikirim menyang panganggoné: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ganti alamat layang èlèktronik',
@@ -1030,7 +1019,6 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'searchmenu-legend' => 'Pilihan panggolèkan',
 'searchmenu-exists' => "'''Ana kaca kanthi jeneng \"[[\$1]]\" ing wiki iki'''",
 'searchmenu-new' => "'''Gawé kaca \"[[:\$1]]\" ing wiki iki!'''",
-'searchhelp-url' => 'Help:Isi',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Tlusuri kaca-kaca kanthi tembung-wiwitan iki]]',
 'searchprofile-articles' => 'Kaca isi',
 'searchprofile-project' => 'Kaca pitulung lan proyèk',
@@ -1072,15 +1060,6 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'search-external' => 'Panggolèkan èkstèrnal',
 'searchdisabled' => 'Sawetara wektu iki panjenengan ora bisa nggolèk mawa fungsi golèk {{SITENAME}}. Kanggo saiki mangga panjenengan bisa golèk nganggo Google. Nanging isi indèks Google kanggo {{SITENAME}} bisa waé lawas lan durung dianyari.',
 
-# Quickbar
-'qbsettings' => 'Pengaturan bar sidhatan',
-'qbsettings-none' => 'Ora ana',
-'qbsettings-fixedleft' => 'Tetep sisih kiwa',
-'qbsettings-fixedright' => 'Tetep sisih tengen',
-'qbsettings-floatingleft' => 'Ngambang sisih kiwa',
-'qbsettings-floatingright' => 'Ngambang sisih tengen',
-'qbsettings-directionality' => 'Wis pesthi, gumantung saka wujud skrip basané Sampéyan',
-
 # Preferences page
 'preferences' => 'Preferensi (pilihan)',
 'mypreferences' => 'Préferènsi',
@@ -1113,7 +1092,6 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'resetprefs' => 'Resikana owah-owahan sing ora disimpen',
 'restoreprefs' => 'Balèkna kabèh setèlan baku',
 'prefs-editing' => 'Panyuntingan',
-'prefs-edit-boxsize' => 'Ukuran kothak panyuntingan.',
 'rows' => 'Larikan:',
 'columns' => 'Kolom:',
 'searchresultshead' => 'Panggolèkan',
@@ -1124,9 +1102,6 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|dina|dina}})',
 'recentchangescount' => 'Cacahé suntingan sing ditampilaké:',
 'prefs-help-recentchangescount' => 'Iki klebu owah-owahan pungkasan, kaca sajarah, lan log.',
-'prefs-help-watchlist-token' => 'Ngisi kothak iki nganggo kunci wadi (PIN) bakal ngasilaké sindikasi RSS kanggo daftar pantauan panjenengan.
-Sapa waé sing meruhi kunci iki bisa maca daftar pantauan panjenengan, mula pilihen isi sing aman.
-Iki aji acak sing bisa panjenengan gunakaké: $1',
 'savedprefs' => 'Préferènsi Panjenengan wis disimpen',
 'timezonelegend' => 'Zona wektu:',
 'localtime' => 'Wektu saenggon:',
@@ -1157,7 +1132,6 @@ Iki aji acak sing bisa panjenengan gunakaké: $1',
 'prefs-reset-intro' => 'Panjenengan bisa migunakaké kaca iki kanggo mbalèkaké préferensi panjenengan marang setèlan baku situs.
 Pembalikan ora bisa dibatalaké.',
 'prefs-emailconfirm-label' => 'Konfirmasi layang-e:',
-'prefs-textboxsize' => 'Ukuran kothak suntingan',
 'youremail' => 'Layang élèktronik (E-mail):',
 'username' => '{{GENDER:$1|Asma panganggo}}:',
 'uid' => '{{GENDER:$1|ID panganggo}}:',
@@ -1289,7 +1263,7 @@ Alamat layang èlèktronik Sampéyan ora dituduhaké nalika wong liya ngubungi S
 'right-proxyunbannable' => 'Bypass pamblokiran otomatis proxy-proxy',
 'right-unblockself' => 'Bukak blokirané dhéwéké',
 'right-protect' => 'Ganti undhaking pangreksan lan owah kaca-kaca sing direksa',
-'right-editprotected' => 'Sunting kaca-kaca sing direksa (tanpa pangreksan runtun)',
+'right-editprotected' => 'Owah kaca-kaca sing direksa (tanpa pangreksan runtun)',
 'right-editinterface' => 'Sunting interface (antarmuka) panganggo',
 'right-editusercssjs' => 'Sunting berkas-berkas CSS lan JS panganggo liya',
 'right-editusercss' => 'Sunting berkas-berkas CSS panganggo liya',
@@ -1397,7 +1371,6 @@ Alamat layang èlèktronik Sampéyan ora dituduhaké nalika wong liya ngubungi S
 'recentchangeslinked-feed' => 'Pranala Pilihan',
 'recentchangeslinked-toolbox' => 'Pranala Pilihan',
 'recentchangeslinked-title' => 'Owah-owahan sing ana gandhèngané karo "$1"',
-'recentchangeslinked-noresult' => 'Ora ana owah-owahan ing kaca-kaca kagandhèng iki salawasé periode sing wis ditemtokaké.',
 'recentchangeslinked-summary' => "Kaca astaméwa (kaca kusus) iki mènèhi daftar owah-owahan pungkasan ing kaca-kaca sing kagandhèng (utawa anggota sawijining kateogri). Kaca sing [[Special:Watchlist|panjenengan awasi]] ditandhani '''kandel'''.",
 'recentchangeslinked-page' => 'Jeneng kaca:',
 'recentchangeslinked-to' => 'Nuduhaké owah-owahan menyang kaca sing disambung menyang kaca-kaca iki',
@@ -1408,7 +1381,7 @@ Alamat layang èlèktronik Sampéyan ora dituduhaké nalika wong liya ngubungi S
 'reuploaddesc' => 'Bali ing formulir pamotan',
 'upload-tryagain' => 'Kirim déskripsi berkas sing wis diowah',
 'uploadnologin' => 'Durung mlebu log',
-'uploadnologintext' => 'Panjenengan kudu [[Special:UserLogin|mlebu log]] supaya olèh ngunggahaké gambar utawa berkas liyané.',
+'uploadnologintext' => 'Sampéyan kudu [[Special:UserLogin|mlebu log]] supaya bisa ngunggah berkas.',
 'upload_directory_missing' => 'Direktori pamunggahan ($1) ora ditemokaké lan ora bisa digawé déning server wèb.',
 'upload_directory_read_only' => 'Dirèktori pangunggahan ($1) ora bisa ditulis déning server wèb.',
 'uploaderror' => 'Kaluputan pangunggahan berkas',
@@ -1618,7 +1591,6 @@ Kanggo kamanan paling apik, img_auth.php dipatèni.',
 'http-read-error' => 'Kasalahan maca HTTP.',
 'http-timed-out' => 'Panjalukan HTTP kliwat wates wektu.',
 'http-curl-error' => 'Kasalahan nalika njupuk URL: $1',
-'http-host-unreachable' => 'Ora bisa ngranggèh URL.',
 'http-bad-status' => 'Ana masalah nalika njaluk HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1770,12 +1742,6 @@ Priksanen dhisik pranala-pranala menyang cithakan iki sadurungé mbusak.',
 'statistics-users-active-desc' => 'Panganggo sing ngayahi aktivitas jroning {{PLURAL:$1|dia|$1 dina}} pungkasan',
 'statistics-mostpopular' => 'Kaca sing paling akèh dideleng',
 
-'disambiguations' => 'Kaca sing kaubung nèng kaca disambiguasi',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => "Kaca-kaca iki kaisi paling ora sak pranala nuju '''kaca disambiguasi'''.
-Mungkin kuduné diubungaké nèng kaca sing luwih pantes.<br />
-Kaca kaanggep kaca disambiguasi yèn kuwi nganggo templat sing kaubung saka [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Kaca-kaca mawa ubarampé',
 'pageswithprop-legend' => 'Kaca-kaca mawa ubarampé',
 'pageswithprop-text' => 'Kaca iki njlèntèhaké kaca-kaca sing nganggo ubarampé astamiwa.',
@@ -2028,10 +1994,9 @@ Owah-owahan sing dumadi ing tembé ing kaca iku lan kaca dhiskusi sing kagandhè
 'unwatchthispage' => 'Batalna olèhé ngawasi kaca iki',
 'notanarticle' => 'Dudu kaca artikel',
 'notvisiblerev' => 'Révisi wis dibusak',
-'watchnochange' => 'Ora ana kaca ing daftar pangawasan panjenengan sing diowahi ing mangsa wektu sing dipilih.',
 'watchlist-details' => 'Ngawasaké {{PLURAL:$1|$1 kaca|$1 kaca}}, ora kalebu kaca-kaca dhiskusi.',
-'wlheader-enotif' => '* Notifikasi e-mail diaktifaké.',
-'wlheader-showupdated' => "* Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
+'wlheader-enotif' => 'Notifikasi e-mail diaktifaké.',
+'wlheader-showupdated' => "Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
 'watchmethod-recent' => 'priksa daftar owah-owahan anyar kanggo kaca sing diawasi',
 'watchmethod-list' => 'priksa kaca sing diawasi kanggo owah-owahan anyar',
 'watchlistcontains' => 'Daftar pangawasan panjenengan isiné ana $1 {{PLURAL:$1|kaca|kaca}}.',
@@ -2431,12 +2396,9 @@ Mangga mirsani [[Special:BlockList|daftar panganggo sing diblokir]] kanggo dafta
 'ipb_blocked_as_range' => 'Kaluputan: IP $1 ora diblokir sacara langsung lan ora bisa dijabel blokiré. IP $1 diblokir mawa bagéyan saka pamblokiran kelompok IP $2, sing bisa dijabel pamblokirané.',
 'ip_range_invalid' => 'Blok IP ora absah.',
 'ip_range_toolarge' => 'Jangkahé blokiran luwih gedhé saka /$1 ora dililakaké.',
-'blockme' => 'Blokiren aku',
 'proxyblocker' => 'Pamblokir proxy',
-'proxyblocker-disabled' => 'Fungsi iki saiki lagi dipatèni.',
 'proxyblockreason' => "Alamat IP panjenengan wis diblokir amerga alamat IP panjenengan iku ''open proxy''.
 Mangga ngubungi sing nyedyakaké dines internèt panjenengan utawa pitulungan tèknis lan aturana masalah kaamanan sérius iki.",
-'proxyblocksuccess' => 'Bubar.',
 'sorbsreason' => "Alamat IP panjenengan didaftar minangka ''open proxy'' ing DNSBL.",
 'sorbs_create_account_reason' => "Alamat IP panjenengan didaftar minangka ''open proxy'' ing DNSBL. Panjenengan ora bisa nggawé akun utawa rékening.",
 'cant-block-while-blocked' => 'Panjenengan ora bisa mblokir panganggo liya nalika panjenengan dhéwé pinuju diblokir.',
@@ -2919,7 +2881,7 @@ Pranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Jembar',
 'exif-imagelength' => 'Dhuwur',
 'exif-bitspersample' => 'Bit per komponèn',
@@ -3097,7 +3059,7 @@ Pranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian
 'exif-originalimageheight' => 'Dhuwuré gambar sakdurungé dikethok',
 'exif-originalimagewidth' => 'Jembaré gambar sakdurungé dikethok',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ora dikomprèsi',
 'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman RLE',
 'exif-compression-3' => 'CCITT Group 3 fax encoding',
@@ -3475,7 +3437,6 @@ Panjenengan uga bisa [[Special:EditWatchlist|nganggo éditor standar panjenengan
 'version-other' => 'Liyané',
 'version-mediahandlers' => 'Pananganan média',
 'version-hooks' => 'Canthèlan-canthèlan',
-'version-extension-functions' => 'Fungsi-fungsi èkstènsi',
 'version-parser-extensiontags' => 'Rambu èkstènsi parser',
 'version-parser-function-hooks' => 'Canthèlan fungsi parser',
 'version-hook-name' => 'Jeneng canthèlan',
@@ -3497,13 +3458,6 @@ Anda seharusnya telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi
 'version-entrypoints-header-entrypoint' => 'Tithik lebon',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Lokasi berkas',
-'filepath-page' => 'Berkas:',
-'filepath-submit' => 'Golèk',
-'filepath-summary' => 'Kaca astaméwa utawa kusus iki nuduhaké jalur pepak sawijining berkas.
-Gambar dituduhaké mawa résolusi kebak lan tipe liyané berkas bakal dibuka langsung mawa program kagandhèng.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Golèk berkas duplikat',
 'fileduplicatesearch-summary' => 'Golèk duplikat berkas adhedhasar biji hash-é.',
diff --git a/languages/messages/MessagesKa.php b/languages/messages/MessagesKa.php
index 95663f36..18dd6be8 100644
--- a/languages/messages/MessagesKa.php
+++ b/languages/messages/MessagesKa.php
@@ -17,6 +17,7 @@
  * @author Kaganer
  * @author MIKHEIL
  * @author Malafaya
+ * @author Nemo bis
  * @author Nodar Kherkheulidze
  * @author Reedy
  * @author Sopho
@@ -198,9 +199,6 @@ $messages = array(
 'tog-shownumberswatching' => 'მაკონტროლებელ მომხმარებელთა რიცხვის ჩვენება',
 'tog-oldsig' => 'არსებული ხელმოწერა:',
 'tog-fancysig' => 'საკუთარი ვიკიფორმატიანი ხელმოწერა (ავტომატური ბმულის გარეშე)',
-'tog-externaleditor' => 'გამოიყენეთ გარე რედაქტორი სტანდარტული ფორმით (მხოლოდ ექსპერტებისთვის, მოითხოვს სპეციალურ კონფიგურაციას თქვენს კომპიუტერში. [//www.mediawiki.org/wiki/Manual:External_editors ვრცლად.])',
-'tog-externaldiff' => 'გამოიყენეთ გარე განსხვავება სტანდარტული ფორმით (მხოლოდ ექსპერტთათვის, მოითხოვს სპეციალურ კონფიგურაციას თქვენს კომპიუტერში. [//www.mediawiki.org/wiki/Manual:External_editors ვრცლად.])',
-'tog-showjumplinks' => 'დამხმარე ბმულების „გადასვლა-კენ“ ჩართვა',
 'tog-uselivepreview' => 'გამოიყენეთ სწრაფი წინასწარი გადახედვა (ექსპერიმენტული)',
 'tog-forceeditsummary' => 'გამაფრთხილე ცარიელი რედაქტირების რეზიუმეს შემთხვევაში',
 'tog-watchlisthideown' => 'დამალე ჩემი რედაქტირება კონტროლის სიაში',
@@ -214,6 +212,8 @@ $messages = array(
 'tog-showhiddencats' => 'დამალული კატეგორიების ჩვენება',
 'tog-noconvertlink' => 'სათაურის გარდაქმნის ბმულის გამორთვა',
 'tog-norollbackdiff' => 'გაუქმებისას გამოტოვეთ ცვლილებათა განსხვავება',
+'tog-useeditwarning' => 'გამაფრთხილე, როდესაც დავტოვებ რედაქტირებად გვერდს, დაუმახსოვრებელი ცვლილებებით',
+'tog-prefershttps' => 'უსაფრთხო კავშირის მუდამ გამოყენება ავტორიზაციის შემდეგ',
 
 'underline-always' => 'მუდამ',
 'underline-never' => 'არასდროს',
@@ -277,6 +277,18 @@ $messages = array(
 'oct' => 'ოქტ',
 'nov' => 'ნოე',
 'dec' => 'დეკ',
+'january-date' => '$1 იანვარი',
+'february-date' => '$1 თებერვალი',
+'march-date' => '$1 მარტი',
+'april-date' => '$1 აპრილი',
+'may-date' => '$1 მაისი',
+'june-date' => '$1 ივნისი',
+'july-date' => '$1 ივლისი',
+'august-date' => '$1 აგვისტო',
+'september-date' => '$1 სექტემბერი',
+'october-date' => '$1 ოქტომბერი',
+'november-date' => '$1 ნოემბერი',
+'december-date' => '$1 დეკემბერი',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|კატეგორია|კატეგორიები}}',
@@ -298,7 +310,7 @@ $messages = array(
 'broken-file-category' => 'გვერდები ფაილების არასწორი ბმულებით',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'შესახებ',
 'article' => 'სტატია',
@@ -361,6 +373,7 @@ $messages = array(
 'create-this-page' => 'ამ გვერდის შექმნა',
 'delete' => 'წაშლა',
 'deletethispage' => 'გვერდის წაშლა',
+'undeletethispage' => 'ამ გვერდის აღდგენა',
 'undelete_short' => 'გააუქმე წაშლა {{PLURAL:$1|ერთი რედაქტირება|$1 რედაქტირება}}',
 'viewdeleted_short' => '{{PLURAL:$1|წაშლილი რედაქტირების|$1 წაშლილი რედაქტირებების}} ხილვა',
 'protect' => 'დაბლოკე',
@@ -404,7 +417,7 @@ $1',
 'pool-queuefull' => 'მოთხოვნების დამგროვებელი სავსეა',
 'pool-errorunknown' => 'უცნობი შეცდომა',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}-ის შესახებ',
 'aboutpage' => 'Project:შესახებ',
 'copyright' => 'შინაარსი წარმოდგენილია $1 პირობებით.',
@@ -414,7 +427,6 @@ $1',
 'disclaimers' => 'პასუხისმგებლობის მოხსნა',
 'disclaimerpage' => 'Project:პასუხისმგებლობის უარყოფა',
 'edithelp' => 'დახმარება',
-'edithelppage' => 'Help:ტექსტის რედაქტირება (მარტივი)',
 'helppage' => 'Help:დახმარება',
 'mainpage' => 'მთავარი გვერდი',
 'mainpage-description' => 'მთავარი გვერდი',
@@ -445,7 +457,6 @@ $1',
 'newmessagesdifflinkplural' => 'ბოლო {{PLURAL:$1|ცვლილება|ცვლილება}}',
 'youhavenewmessagesmulti' => 'თქვენ გაქვთ ახალი შეტყობინება $1-ზე',
 'editsection' => 'რედაქტირება',
-'editsection-brackets' => '[$1]',
 'editold' => 'რედაქტირება',
 'viewsourceold' => 'წყაროს ჩვენება',
 'editlink' => 'რედაქტირება',
@@ -497,17 +508,9 @@ $1',
 # General errors
 'error' => 'შეცდომა',
 'databaseerror' => 'შეცდომა მონაცემთა ბაზაში',
-'dberrortext' => 'აღმოჩენილია სინტაქსური შეცდომა მონაცემთა ბაზასთან დაკავშირებისას
-შესაძლოა ეს არის შეცდომა პროგრამულ უზრუნველყოფაში,
-ბოლო დაკავშირება მონაცემთა ბაზასან
-<blockquote><code>$1</code></blockquote>
-მოხდა ფუნქციიდან „<code>$2</code>“.
-მონაცემთა ბაზამ დააბრუნა შეცდომა „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'მონაცემთა ბაზასთან დაკავშირებისას აღმოჩენილია სინტქსური შეცდომა.
-საბოლოო დაკავშირება მოხდა:
-„$1“
-მოხდენილ იქნა ფუნქციიდან „$2“.
-მონაცემთა ბაზამ დააბრუნა შეცდომა „$3: $4“.',
+'databaseerror-query' => 'მოთხოვნა: $1',
+'databaseerror-function' => 'ფუნქცია: $1',
+'databaseerror-error' => 'შეცდომა: $1',
 'laggedslavemode' => 'ყურადღება: გვერდი შესაძლოა არ შეიცავდეს ბოლო ცვლილებებს.',
 'readonly' => 'მონაცემთა ბაზა დახურულია',
 'enterlockreason' => 'მიუთიეთ ბლოკირების მიზეზი და ხანგრძლივობის ვადა',
@@ -561,12 +564,13 @@ $1',
 'editinginterface' => "'''ყურადღება:''' თქვენ რედაქტორობთ გვერდს, რომელიც პროგრამის ინტერფეისის ტექსტს შეიცავს. 
 ამ გვერდზე განხორციელებული რედაქტირება გამოიწვევს ამ ვიკის სხვა მომხმარებელთა სამუშაო ინტერფეისის შეცვლასაც. 
 იმისათვის, რომ დაამატოთ ან შეცვალოთ თარგმანები ყველა ვიკიში გთხოვთ, გამოიყენოთ მედიავიკის ლოკალიზაციის პროექტი [//translatewiki.net/ translatewiki.net].",
-'sqlhidden' => '(SQL მოთხოვნა გაუქმებულია)',
 'cascadeprotected' => 'ეს გვერდი რედაქტირებისგან დაცულია, რადგან იგი ჩართულია შემდეგ {{PLURAL:$1|გვერდში, რომლის |გვერდებში, რომელთა}} დასაცავადაც ჩართულია პარამეტრი "იერარქიული":
 $2',
 'namespaceprotected' => "თქვენ არ გაქვთ '''$1''' სახელთა სივრცეში გვერდების რედაქტირების უფლება.",
 'customcssprotected' => 'თქვენ არ გაქვთ ამ CSS გვერდის რედაქტირების უფლება, ვინაიდან ის სხვა მომხმარებლის პირად კონფიგურაციას შეიცავს.',
 'customjsprotected' => 'თქვენ არ გაქვთ ამ JavaScript გვერდის რედაქტირების უფლება, ვინაიდან ის სხვა მომხმარებლის პირად კონფიგურაციას შეიცავს.',
+'mycustomcssprotected' => 'თქვენ არ გაქვთ ამ CSS-გვერდის რედაქტირების უფლება.',
+'mycustomjsprotected' => 'თქვენ არ გაქვთ ამ JavaScript-გვერდის რედაქტირების უფლება.',
 'ns-specialprotected' => 'გვერდების რედაქტირება სახელთა სივრცეში {{ns:special}} შეუძლებელია.',
 'titleprotected' => "შემდეგი გვერდის შექმნა აკრძალულია მომხმარებელ [[User:$1|$1]]-ს მიერ.
 მოცემულია შემდეგი ახსნა: „''$2''“.",
@@ -593,10 +597,19 @@ $2',
 'welcomecreation-msg' => 'თქვენი ანგარიში შექმნილია.
 არ დაგავიწყდეთ თქვენი [[Special:Preferences|{{SITENAME}}-ის კონფიგურაციის]] შეცვლა.',
 'yourname' => 'მომხმარებელი:',
+'userlogin-yourname' => 'მომხმარებლის სახელი',
+'userlogin-yourname-ph' => 'შეიყვანეთ თქვენი მომხმარებლის სახელი',
+'createacct-another-username-ph' => 'შეიყვანეთ მომხმარებლის სახელი',
 'yourpassword' => 'პაროლი:',
+'userlogin-yourpassword' => 'პაროლი',
+'userlogin-yourpassword-ph' => 'შეიყვანეთ თქვენი პაროლი',
+'createacct-yourpassword-ph' => 'შეიყვანეთ პაროლი',
 'yourpasswordagain' => 'ხელმეორედ შეიყვანეთ პაროლი',
+'createacct-yourpasswordagain' => 'დაადასტურეთ პაროლი',
+'createacct-yourpasswordagain-ph' => 'ხელმეორედ შეიყვანეთ პაროლი',
 'remembermypassword' => 'დამიმახსოვრე ამ კომპიუტერზე (მაქსიმუმ $1 {{PLURAL:$1|დღე}})',
-'securelogin-stick-https' => 'გააგრძელეთ კავშირი HTTPS-თან შესვლის შემდეგ',
+'userlogin-remembermypassword' => 'დამიმახსოვრე',
+'userlogin-signwithsecure' => 'უსაფრთხო კავშირის გამოყენება',
 'yourdomainname' => 'თქვენი დომენი',
 'password-change-forbidden' => 'თქვენ არ შეგიძლიათ ამ ვიკიში პაროლის შეცვლა.',
 'externaldberror' => 'საგარეო მონაცემთა ბაზაში აუტენტიფიკაციის შეცდომაა, ან თქვენ არ გაქვთ საკმარისი უფლებები საგარეო ანგარიშში ცვლილებების შესატანად.',
@@ -608,18 +621,40 @@ $2',
 'logout' => 'გასვლა',
 'userlogout' => 'გასვლა',
 'notloggedin' => 'შესული არ ხართ',
+'userlogin-noaccount' => 'არ გაქვთ ანგარიში?',
+'userlogin-joinproject' => 'შეუერთდით პროექტს {{SITENAME}}',
 'nologin' => "ჯერ არ ხართ რეგისტრირებული? '''$1'''.",
 'nologinlink' => 'გახსენით ანგარიში',
 'createaccount' => 'გახსენი ანგარიში',
 'gotaccount' => "უკვე რეგისტრირებული ხართ? '''$1'''",
 'gotaccountlink' => 'შესვლა',
 'userlogin-resetlink' => 'ავტორიზაციის მონაცემები დაგავიწყდათ?',
+'userlogin-resetpassword-link' => 'პაროლის მოცილება',
+'helplogin-url' => 'Help:შესვლა',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|დახმარება სისტემაში შესასვლელად]]',
+'createacct-join' => 'ქვემოთ მიუთითეთ ინფორმაცია თქვენ შესახებ.',
+'createacct-emailrequired' => 'ელ. ფოსტის მისამართი',
+'createacct-emailoptional' => 'ელ. ფოსტის მისამართი (არასავალდებულო)',
+'createacct-email-ph' => 'შეიყვანეთ თქვენი ელ. ფოსტის მისამართი',
+'createacct-another-email-ph' => 'შეიყვანეთ ელ.ფოსტის მისამართი',
 'createaccountmail' => 'გამოიყენეთ შემთხვევითობის მეთოდით შერჩეული დროებითი პაროლი და მისი გაგზავნა ქვემოთ მითითებულ ელ. ფოსტის მისამართზე:',
+'createacct-realname' => 'ნამდვილი სახელი (არააუცილებელი)',
 'createaccountreason' => 'მიზეზი:',
+'createacct-reason' => 'მიზეზი',
+'createacct-reason-ph' => 'რატომ ქმნით ახალ ანგარიშს?',
+'createacct-captcha' => 'უსაფრთხოების შემოწმება',
+'createacct-imgcaptcha-ph' => 'შეიყვანეთ ზემოთ მოცემული ტექსტი',
+'createacct-submit' => 'შექმენით თქვენი ანგარიში',
+'createacct-another-submit' => 'სხვა ანგარიშის შექმნა',
+'createacct-benefit-heading' => '{{SITENAME}} შექმნილია თქვენნაირი ადამიანების მიერ.',
+'createacct-benefit-body1' => '{{PLURAL:$1|რედაქტირება|რედაქტირება}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|გვერდი|გვერდი}}',
+'createacct-benefit-body3' => 'ბოლო {{PLURAL:$1|მომხმარებელი|მომხმარებელი}}',
 'badretype' => 'თქვენს მიერ შეყვანილი პაროლები ერთმანეთს არ ემთხვევა.',
 'userexists' => 'ეს სახელი უკვე გამოყენებულია.
 გთხოვთ, აირჩიეთ სხვა.',
 'loginerror' => 'შეცდომა შესვლაში',
+'createacct-error' => 'ანგარიშის შექმნის შეცდომა',
 'createaccounterror' => '$1 ანგარიშის შექმნა ვერ მოხერხდა.',
 'nocookiesnew' => 'მომხმარებლის ჩანაწერი შექმნილია, მაგრამ თქვენ არ გაგივლიათ რეგისტრაცია. {{SITENAME}} იყენებს cookies, რომლებიც თქვენს ბრაუზერში გათიშულია. გთხოვთ, აამოქმედოთ ისინი და შემდგომ ხელახლა გაიარეთ რეგისტრაცია.',
 'nocookieslogin' => '{{SITENAME}} მომხმარებლების შესვლისთვის იყენებს "ქუქის ჩანაწერს". თქვენ იგი გათიშეთ. გთხოვთ, ჩართოთ ისინი და ხელმეორედ მოსინჯოთ.',
@@ -700,8 +735,7 @@ $2',
 'newpassword' => 'ახალი პაროლი:',
 'retypenew' => 'ახალი პაროლი განმეორებით:',
 'resetpass_submit' => 'მიუთითეთ პაროლი და დარეგისტრირდით',
-'resetpass_success' => 'თქვენი პაროლი წარმატებით შეიცვალა!
-მიმდინარეობს სიტემაში შესვლა...',
+'changepassword-success' => 'თქვენი პაროლი წარმატებით შეიცვალა! ამჟამად რეგისტრირდებით...',
 'resetpass_forbidden' => 'პაროლის შეცვლა შეუძლებელია',
 'resetpass-no-info' => 'კონკრეტულად ამ გვერდთან სამუშაოდ თქვენ უნდა წარადგინოთ თავი სისტემისადმი.',
 'resetpass-submit-loggedin' => 'პაროლის შეცვლა',
@@ -713,10 +747,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'პაროლის აღდგენა',
-'passwordreset-text' => 'შეავსეთ ეს ფორმა, რათა კვლავ დააყენოთ თქვენი პაროლი.',
+'passwordreset-text-one' => 'შეავსეთ ეს ფორმა, რათა კვლავ დააყენოთ თქვენი პაროლი.',
+'passwordreset-text-many' => '{{PLURAL:$1|პაროლის თავიდან დასაყენებლად შეიყვანეთ მონაცემთა ერთ-ერთი ნაწილი.}}',
 'passwordreset-legend' => 'პაროლის აღდგენა',
 'passwordreset-disabled' => 'ამ ვიკიში პაროლის კვლავ დაყენების ფუნქცია გამორთულია.',
-'passwordreset-pretext' => '{{PLURAL:$1||შეიყვანეთ ქვემოთ მოცემულ მონაცემთა ერთ-ერთი ნაწილი.}}',
+'passwordreset-emaildisabled' => 'ამ ვიკიში ელ.ფოსტის ფუნქციები გამორთულია.',
 'passwordreset-username' => 'მომხმარებლის სახელი:',
 'passwordreset-domain' => 'დომენი:',
 'passwordreset-capture' => 'გამოსული ელ-ფოსტის ხილვა?',
@@ -749,7 +784,7 @@ $2
 დროებითი პაროლი: $2',
 'passwordreset-emailsent' => 'პაროლის თავიდან დასაყენებელი ელ.ფოსტა გაიგზავნა.',
 'passwordreset-emailsent-capture' => 'ქვემოთ ნაჩვენები პაროლის თავიდან დასაყენებელი წერილი გაიგზავნა.',
-'passwordreset-emailerror-capture' => 'ქვემოთ მოცემულია შექმნილი შესახსენებელი წერილი, რომლის გაგზავნაც ვერ მოხერხდა: $1 გამო',
+'passwordreset-emailerror-capture' => 'ქვემოთ მოცემულია შექმნილი პაროლის დასაყენებელი წერილი, რომლის გაგზავნაც {{GENDER:$2|მომხმარებელთან}} ვერ მოხერხდა: $1 გამო',
 
 # Special:ChangeEmail
 'changeemail' => 'ელ-ფოსტის მისამართის შეცვლა',
@@ -763,6 +798,10 @@ $2
 'changeemail-submit' => 'ელ-ფოსტის შეცვლა',
 'changeemail-cancel' => 'გაუქმება',
 
+# Special:ResetTokens
+'resettokens-tokens' => 'ჟეტონები:',
+'resettokens-token-label' => '$1 (მიმდინარე მნიშვნელობა: $2)',
+
 # Edit page toolbar
 'bold_sample' => 'მუქი ტექსტი',
 'bold_tip' => 'მუქი ტექსტი',
@@ -961,12 +1000,15 @@ $2
 შესაძლოა, იგი წაიშალა.',
 'edit-conflict' => 'რედაქციების კონფლიქტი.',
 'edit-no-change' => 'თქვენი შესწორება არ იქნა შენახული, რადგანაც ტექსტის ცვლილება არ მოხდა.',
+'postedit-confirmation' => 'თქვენი რედაქტირება შენახულია.',
 'edit-already-exists' => 'ახალი გვერდის შექმნა არ მოხერხდა.
 ის უკვე არსებობს.',
 'defaultmessagetext' => 'შეტყობინების სტანდარტული ტექსტი',
 'content-failed-to-parse' => '$2-ის შინაარსი არ შეესაბამება $1-ის ტიპს: $3.',
 'invalid-content-data' => 'დაუშვებელი მონაცემები',
 'content-not-allowed-here' => '„$1“-ის შინაარსი დაუშვებელია [[$2]] გვერდზე',
+'editwarning-warning' => 'სხვა გვერდზე გადასვლამ შესაძლოა გამოიწვიოს ცვლილებების დაკარგვა.
+თუკი თქვენ დარეგისტრირებული ხართ სისტემაში, მაშინ შეგიძლიათ გამორთოთ ეს გაფრთხილება თქვენი კონფიგურაციის განყოფილებაში „რედაქტირება“ .',
 
 # Content models
 'content-model-wikitext' => 'ვიკიტექსტი',
@@ -1180,6 +1222,7 @@ $1",
 'compareselectedversions' => 'არჩეული ვერსიების შედარება',
 'showhideselectedversions' => 'ჩვენება/დამალვა არჩეული ვერსიებისა',
 'editundo' => 'გაუქმება',
+'diff-empty' => '(განსხვავება არ არის)',
 'diff-multi' => '({{PLURAL:$2|ერთი მომხმარებლის|$2 მომხმარებლების}} {{PLURAL:$1|ერთი შუალედური ვერსია|$1 შუალედური ვერსიები}} არ არის ნაჩვენები.)',
 'diff-multi-manyusers' => '({{PLURAL:$2|ერთი მომხმარებლის|$2 მომხმარებლების}} {{PLURAL:$1|ერთი შუალედური ვერსია|$1 შუალედური ვერსიები}}, რომლებიც არ არის ნაჩვენები.)',
 'difference-missing-revision' => '{{PLURAL:$2|$2 ვერსია}} ამ შედარებისათვის ($1) {{PLURAL:$2|ვერ მოიძებნა}}.
@@ -1207,7 +1250,6 @@ $1",
 'searchmenu-legend' => 'ძიების დაწყობა:',
 'searchmenu-exists' => "'''ამ ვიკიპროექტში არის გვერდი „[[:$1]]“'''",
 'searchmenu-new' => "'''შექმენით გვერდი „[[:$1]]“ ამ ვიკიში!'''",
-'searchhelp-url' => 'Help:დახმარება',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|აჩვენეთ გვერდები ამ პრეფიქსით]]',
 'searchprofile-articles' => 'ძირითადი გვერდები',
 'searchprofile-project' => 'დახმარების და პროექტის გვერდები',
@@ -1249,15 +1291,7 @@ $1",
 'powersearch-togglenone' => 'არაფერი',
 'search-external' => 'გარე ძიება',
 'searchdisabled' => '{{SITENAME}}ში ძებნა გაუქმებულია. თქვენ შეგიძლიათ დროის შუალედით Google-ით ძებნა. მიაქციეთ ყურადღება, რომ {{SITENAME}}ში შესაძლებელია მათი ინდექსები აქტუალური არ არის.',
-
-# Quickbar
-'qbsettings' => 'სწრაფი ზოლი',
-'qbsettings-none' => 'არაფერი',
-'qbsettings-fixedleft' => 'ფიქსირებული მარცხნივ',
-'qbsettings-fixedright' => 'ფიქსირებული მარჯვნივ',
-'qbsettings-floatingleft' => 'მარცხნივ მცურავი',
-'qbsettings-floatingright' => 'მარჯვნივ მცურავი',
-'qbsettings-directionality' => 'ფიქსირებული, დამოკიდებული თქვენი ენის წერილობით მიმართულებაზე',
+'search-error' => 'ძიებისას მოხდა შეცდომა: $1',
 
 # Preferences page
 'preferences' => 'კონფიგურაცია',
@@ -1291,7 +1325,6 @@ $1",
 'resetprefs' => 'გადატვირთვა',
 'restoreprefs' => 'კონფიგურაციის საწყისზე დაბრუნება',
 'prefs-editing' => 'რედაქტირება',
-'prefs-edit-boxsize' => 'რედაქტირების ფანჯრის ზომა.',
 'rows' => 'რიგები:',
 'columns' => 'სვეტები',
 'searchresultshead' => 'ძიება',
@@ -1302,9 +1335,6 @@ $1",
 'recentchangesdays-max' => 'მაქსიმუმ $1 {{PLURAL:$1|დღე}}',
 'recentchangescount' => 'საჩვენებელი ცვლილებების რაოდენობა:',
 'prefs-help-recentchangescount' => 'შეიცავს ახალ შესწორებებს, გვერდების ისტორიებს, ჟურნალებს.',
-'prefs-help-watchlist-token' => 'ამ ველის შევსება საიდუმლო გასაღებით შექმნის RSS ტრანსლაციას თქვენი კონტროლის სიისთვის.
-ყველა, ვინც იცის გასაღები, შესძლებს იხილოს თქვენი კონტროლის სია. ფრთხილად იყავით საიდუმლო მნიშვნელობის არჩევისას.
-თქვენ შეგიძლიათ გამოიყენოთ ასევე შემთვევითი მნიშვნელობა: $1',
 'savedprefs' => 'თქვენ მიერ შერჩეული პარამეტრები დამახსოვრებულია.',
 'timezonelegend' => 'სასაათო სარტყელი:',
 'localtime' => 'ადგილობრივი დრო:',
@@ -1334,7 +1364,6 @@ $1",
 'prefs-common-css-js' => 'ზოგადი CSS/JS ყველა თემისთვის:',
 'prefs-reset-intro' => 'ეს გვერდი შეიძლება გამოყენებული იქნეს თქვენი კონფიგურაციის შესაცვლელად საწყის კონფიგურაციაზე. ამ მოქმედების დადასტურების შემთხვევაში, თქვენ ვეღარ შეძლებთ მის გაუქმებას.',
 'prefs-emailconfirm-label' => 'ელ-ფოსტის დადასტურება:',
-'prefs-textboxsize' => 'რედაქტირების ფანჯრის ზომა',
 'youremail' => 'ელექტრონული ფოსტა:',
 'username' => '{{GENDER:$1|მომხმარებლის სახელი}}:',
 'uid' => '{{GENDER:$1|მომხმარებლის}} იდენტიფიკატორი:',
@@ -1368,6 +1397,8 @@ $1",
 'prefs-dateformat' => 'თარიღის ფორმატი',
 'prefs-timeoffset' => 'სასაათო სარტყლის ცვლილება',
 'prefs-advancedediting' => 'მთავარი პარამეტრები',
+'prefs-editor' => 'რედაქტორი',
+'prefs-preview' => 'წინასწარი გადახედვა',
 'prefs-advancedrc' => 'გაფართოებული პარამეტრები',
 'prefs-advancedrendering' => 'გაფართოებული პარამეტრები',
 'prefs-advancedsearchoptions' => 'გაფართოებული პარამეტრები',
@@ -1375,7 +1406,9 @@ $1",
 'prefs-displayrc' => 'გამოსახვის კონფიგურაციები',
 'prefs-displaysearchoptions' => 'გამოსახვის კონფიგურაციები',
 'prefs-displaywatchlist' => 'გამოსახვის კონფიგურაციები',
+'prefs-tokenwatchlist' => 'ჟეტონი',
 'prefs-diffs' => 'სხვაობა ვერსიებს შორის',
+'prefs-help-prefershttps' => 'ამ კონფიგურაციის არჩევა შედეგს გამოიღებს შემდგომი ავტორიზაციის შედმეგ.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'ელ-ფოსტის მისამართი სწორად გამოიყურება',
@@ -1404,6 +1437,7 @@ $1",
 'userrights-changeable-col' => 'ჯგუფები, რომლებიც შეგიძლიათ შეცვალოთ',
 'userrights-unchangeable-col' => 'ჯგუფები, რომლებიც არ შეგიძლიათ შეცვალოთ',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'მომხმარებელთა უფლებების კონფლიქტი! გთხოვთ ხელმეორედ შეინახოთ თქვენი ცვლილებები.',
 
 # Groups
 'group' => 'ჯგუფი:',
@@ -1469,11 +1503,15 @@ $1",
 'right-proxyunbannable' => 'პროქსის ავტობლოკის გადასვლა',
 'right-unblockself' => 'საკუთარი თავის განბლოკვა',
 'right-protect' => 'გვერდების დაცვის დონის შეცვლა და დაცული გვერდების რედაქტირება',
-'right-editprotected' => 'დაცული გვერდების რედაქტირება (იერარქიული დაცვის გარეშე)',
+'right-editprotected' => 'გვერდების რედაქტირება რომლებიც დაცულია როგორც „{{int:protect-level-sysop}}“',
+'right-editsemiprotected' => 'გვერდების რედაქტირება რომლებიც დაცულია როგორც „{{int:protect-level-autoconfirmed}}“',
 'right-editinterface' => 'მომხმარებლის ინტერფეისის შეცვლა',
 'right-editusercssjs' => 'სხვა მომხმარებლების CSS- и JS- ფაილების შესწორება',
 'right-editusercss' => 'სხვა მომხმარებლების CSS- ფაილების შესწორება',
 'right-edituserjs' => 'სხვა მომხმარებლების JS- ფაილების შესწორება',
+'right-editmyusercss' => 'თქვენი საკუთარი CSS-ფაილების რედაქტირება',
+'right-editmyuserjs' => 'თქვენი საკუთარი JavaScript-ფაილების რედაქტირება',
+'right-viewmywatchlist' => 'თქვენი კონტროლის სიის ხილვა',
 'right-rollback' => 'გარკვეულ გვერდზე ბოლო მომხმარებლის რედაქტირების სწრაფი გაუქმება',
 'right-markbotedits' => 'გაუქმებული შესწორებების მონიშვნა როგორც ბოტის',
 'right-noratelimit' => 'სიჩქარის შეზღუდვის არ არსებობა',
@@ -1535,9 +1573,15 @@ $1",
 'action-userrights-interwiki' => 'მომხმარებლების უფლებების შეცვლა სხვა ვიკიებში',
 'action-siteadmin' => 'მონაცემთა ბაზის დაბლოკვა და განბლოკვა',
 'action-sendemail' => 'ელ-ფოსტების გაგზავნა',
+'action-editmywatchlist' => 'თქვენი კონტროლის სიის რედაქტირება',
+'action-viewmywatchlist' => 'თქვენი კონტროლის სიის ხილვა',
+'action-viewmyprivateinfo' => 'თქვენი პირადი ინფორმაციის ხილვა',
+'action-editmyprivateinfo' => 'თქვენი პირადი ინფორმაციის რედაქტირება',
 
 # Recent changes
 'nchanges' => '$1 ცვლილება',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|ბოლო ვიზიტის შემდეგ}}',
+'enhancedrc-history' => 'ისტორია',
 'recentchanges' => 'ბოლო ცვლილებები',
 'recentchanges-legend' => 'ბოლო ცვლილებების პარამეტრები',
 'recentchanges-summary' => 'უთვალთვალეთ ვიკის ბოლო ცვლილებებს ამ გვერდზე.',
@@ -1579,7 +1623,6 @@ $1",
 'recentchangeslinked-feed' => 'დაკავშირებული ცვლილებები',
 'recentchangeslinked-toolbox' => 'დაკავშირებული ცვლილებები',
 'recentchangeslinked-title' => '„$1“-თან დაკავშირებული ცვლილებები',
-'recentchangeslinked-noresult' => 'მითითებულ პერიოდში ცვლილებები დაკავშირებულ გვერდებზე არ მომხდარა.',
 'recentchangeslinked-summary' => "ეს არის მითითებულ გვერდთან (ან მითითებული კატეგორიის წევრებთან) დაკავშირებულ გვერდებში ბოლო დროს განხორციელებული ცვლილებების სია.
 გვერდები [[Special:Watchlist|თქვენი კონტროლის სიაში]] გამოყოფილია '''სქლად'''.",
 'recentchangeslinked-page' => 'გვერდის დასახელება:',
@@ -1591,7 +1634,7 @@ $1",
 'reuploaddesc' => 'გააუქმეთ ატვირთვა და დაუბრუნდით ატვირთვის ფორმას.',
 'upload-tryagain' => 'შეინახეთ ფაილის შეცვლილი აღწერა',
 'uploadnologin' => 'რეგისტრაცია არ გაქვთ გავლილი',
-'uploadnologintext' => 'ფაილის ატვირთვისთვის თქვენ უნდა [[Special:UserLogin|შეხვიდეთ]].',
+'uploadnologintext' => 'ფაილის ასატვირთად თქვენ უნდა $1.',
 'upload_directory_missing' => 'შესანახი დირექტორია ($1) არ არსებობს და მისი აღდგენა ვებ-სერვერის მიერ შეუძლებელია.',
 'upload_directory_read_only' => 'ვებსერვერი ვერ იწერს ატვირთვის დირექტორიაში ($1).',
 'uploaderror' => 'ატვირთვის შეცდომა',
@@ -1803,7 +1846,6 @@ $1',
 'http-read-error' => 'HTTP წაკითხვის შეცდომა.',
 'http-timed-out' => 'HTTP მოთხოვნის დრო გავიდა.',
 'http-curl-error' => 'შეცდომა URL: $1-ის მოთხოვნისას',
-'http-host-unreachable' => 'URL მიუწვდომელია',
 'http-bad-status' => 'HTTP მოთხოვნისას აღმოჩენილია შეცდომა - $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1835,6 +1877,10 @@ $1',
 'listfiles_size' => 'ზომა (ბაიტები)',
 'listfiles_description' => 'აღწერილობა',
 'listfiles_count' => 'ვერსიები',
+'listfiles-show-all' => 'სურათების ძველი ვერსიების ჩართვა',
+'listfiles-latestversion' => 'მიმდინარე ვერსია',
+'listfiles-latestversion-yes' => 'დიახ',
+'listfiles-latestversion-no' => 'არა',
 
 # File description page
 'file-anchor-link' => 'ფაილი',
@@ -1931,6 +1977,9 @@ $1',
 'randompage' => 'ნებისმიერი გვერდი',
 'randompage-nopages' => '{{PLURAL:$2|სახელთა შემდეგი სივრცე|სახელთა შემდეგ სივრცეში}} "$1" არ არის გვერდები.',
 
+# Random page in category
+'randomincategory-selectcategory-submit' => 'მიდი',
+
 # Random redirect
 'randomredirect' => 'ნებისმიერი გადამისამართება',
 'randomredirect-nopages' => 'სახელთა სივრცეში „$1“ არ არის გადამისამართებები.',
@@ -1956,12 +2005,6 @@ $1',
 'statistics-users-active-desc' => 'მომხმარებლები, რომლებმაც განახორციელეს ქმედება {{PLURAL:$1|ბოლო $1 დღის|ბოლო $1 დღის}} განმავლობაში',
 'statistics-mostpopular' => 'ყველზე ხშირად ხილვადი გვერდები',
 
-'disambiguations' => 'გვერდები, რომელთაც აქვთ ბმული მრავალმნიშვნელოვან გვერდებზე',
-'disambiguationspage' => 'Template:მრავალმნიშვნელოვანი',
-'disambiguations-text' => "შემდეგი გვერდები შეიცავენ სულ მცირე ერთ ბმულს '''მრავალმნიშვნელობის გვერდზე'''.
-ამის ნაცვლად, სავარაუდოდ, ისისნი უნდა მიუთითებდნენ შესაბამის კონკრეტულ სტატიაზე.<br />
-გვერდი ითვლება მრავამნიშვნელოვნად, თუ მასში განთავსებულია თარგი, რომლის სახელიც მითითებულია გვერდზე [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'გვერდები განსაზღვრული თვისებით',
 'pageswithprop-legend' => 'გვერდები განსაზღვრული თვისებით',
 'pageswithprop-text' => 'აქ მოცემულია გვერდები, რომელთაც ხელით განესაზღვრათ გარკვეული თვისებები.',
@@ -2222,10 +2265,9 @@ $1',
 'unwatchthispage' => 'შეაჩერეთ კონტროლი',
 'notanarticle' => 'შიგთავსის გვერდი არ არის',
 'notvisiblerev' => 'შესწორება წაშლილია',
-'watchnochange' => 'არც ერთი თქვენი კონტროლის ქვეშ მყოფი ერთეული არ იქნა რედაქტირებული ნაჩვენებ დროში.',
 'watchlist-details' => '$1 გვერდია თქვენი კონტროლის სიაში განხილვის გვერდების ჩაუთვლელად.',
-'wlheader-enotif' => '* ელ. ფოსტით შეტყობინება ჩართულია.',
-'wlheader-showupdated' => '* გვერდები, რომლებშიც შეტანილ იქნა ცვლილებები თქვენი ბოლო ვიზიტის შემდეგ, აღნიშნულია მუქად.',
+'wlheader-enotif' => 'ელ.ფოსტით შეტყობინება ჩართულია.',
+'wlheader-showupdated' => "თქვენი ბოლო ვიზიტის შემდეგ შეცვლილი გვერდები, აღნიშნულია '''მუქად'''.",
 'watchmethod-recent' => 'მიმდინარეობს უახლესი შესწორებების შემოწმება კონტროლის ქვეშ მყოფი გვერდების მიხედვით.',
 'watchmethod-list' => 'მიმდინარეობს თქვენი კონტროლის ქვეშ მყოფი გვერდების შემოწმება უახლესი შესწორებების მიხედვით.',
 'watchlistcontains' => 'თქვენი კონტროლის სია შეიცავს $1 გვერდს.',
@@ -2632,14 +2674,12 @@ $1',
 'ipb_blocked_as_range' => 'შეცდომა:  IP-მისამართი $1 არ იყო პირდაპირ დაბლოკილი, შესაბამისად ვერ მოხდება მისი განბლოკვა.თუმცა იგი ეკუთვნის დიაპაზონს $2, რომლის განბლოკვა შესაძლებელია.',
 'ip_range_invalid' => 'არასწორი IP მისამართი',
 'ip_range_toolarge' => 'დაბლოკვა /$1 დიაპაზონზე ზემოთ აკრძალულია.',
-'blockme' => 'დამბლოკე',
 'proxyblocker' => 'პროქსის ბლოკირება',
-'proxyblocker-disabled' => 'ეს ფუნქცია გაუქმებულია.',
 'proxyblockreason' => 'თქვენი IP მისამართი დაიბლოკა, ვინაიდან ის ღია პროქსია. გთხოვთ დაუკავშირდეთ თქვენ ინტერნეტ პროვაიდერს ან ტექ. სამსახურს და აცნობოთ მათ ამ სერიოზული უსაფრთხოების პრობლემის შესახებ.',
-'proxyblocksuccess' => 'შესრულებულია.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'თქვენი IP-მისამართი მიჩნევა ღია პროქსიდ DNSBL-ის თანახმად.',
 'sorbs_create_account_reason' => 'თქვენი IP-მისამართი ითვლება ღია პროქსიდ DNSBL-ის ანახმად. თქვენ ვერ შექმნით ანგარიშს.',
+'xffblockreason' => 'დაიბლოკა IP-მისამართი, რომელიც იმყოფებოდა X-Forwarded-For-ის სათაურში და რომელიც გეკუთვნით თქვენ ან თქვენ მიერ გამოყენებულ პროქსი-სერვერს. დაბლოკვის თავდაპირველი მიზეზი იყო: $1',
 'cant-block-while-blocked' => 'თქვენ ვერ დაბლოკავთ სხვა მომხმარებლებს, რადგანაც თავად ხართ დაბლოკილი.',
 'cant-see-hidden-user' => 'მომხმარებელი, რომლის დაბლოკვასაც ცდილოთ, უკვე დაბლოკილია და დამალულია. რადგანაც თქვენ არ გაქვთ დამალულ მომხმარებლებთან მუშაობის ნებართვა, თქვენ ვერ შეცვლით ამ ბლოკს.',
 'ipbblocked' => 'თქვენ ვერ დაბლოკავთ ან მოხსნით ბლოკს სხვა მომხმარებლებს, რადგანაც თავად ხართ დაბლოკილი.',
@@ -2797,6 +2837,8 @@ $1',
 'thumbnail-more' => 'გაზარდე',
 'filemissing' => 'ფაილი აკლია',
 'thumbnail_error' => 'ესკიზის შექმნის შეცდომა: $1',
+'thumbnail_error_remote' => 'შეცდომის შეტყობინება მომხმარებლისაგან $1:
+$2',
 'djvu_page_error' => 'DjVu გვერდის ნომერი',
 'djvu_no_xml' => 'შეუძლებელია XML-ის მიღება DjVu-სთვის',
 'thumbnail-temp-create' => 'დროებითი ესკიზის ფაილის შექმნა ვერ ხერხდება',
@@ -2941,16 +2983,12 @@ $1',
 'tooltip-undo' => 'შეტანილი ცვლილებების გაუქმება და წინასწარ გადახედვის ჩვენება, გაუქმების მიზეზის სქოლიოში ჩაწერასთან ერთად.',
 'tooltip-preferences-save' => 'შეინახეთ კონფიგურაცია',
 'tooltip-summary' => 'შეიყვანეთ მოკლე სქოლიო',
+'tooltip-iwiki' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/** აქ ჩასმული CSS გამოყენებული იქნება გაფორმების ყველა გარეკანზე */',
-'standard.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება სტანდარტული გაფორმების თემაში */',
-'nostalgia.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება ნოსტალგიური გაფორმების თემაში */',
 'cologneblue.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება კელნის ლურჯი გაფორმების თემაში */',
 'monobook.css' => '/* აქ ჩასმული CSS გავლენას იქონიებს Monobook ინტერფეისის მომხმარებლებზე */',
-'myskin.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება ჩემი იერსახის გაფორმების თემაში */',
-'chick.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება წიწილის გაფორმების თემაში */',
-'simple.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება მარტივი გაფორმების თემაში */',
 'modern.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება თანამედროვე გაფორმების თემაში */',
 'vector.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება ვექტორული გაფორმების თემაში */',
 'group-autoconfirmed.css' => '/* აქ განთავსებული CSS გამოყენებული იქნება მხოლოდ ავტომატურად დადასტურებული მომხმარებლებისათვის */',
@@ -3034,13 +3072,8 @@ $1',
 'pageinfo-category-files' => 'ფაილების რაოდენობა',
 
 # Skin names
-'skinname-standard' => 'კლასიკური',
-'skinname-nostalgia' => 'ნოსტალგია',
 'skinname-cologneblue' => 'კელნის ლურჯი',
 'skinname-monobook' => 'მონობუკი',
-'skinname-myskin' => 'საკუთარი',
-'skinname-chick' => 'წიწილა',
-'skinname-simple' => 'მარტივი',
 'skinname-modern' => 'თანამედროვე',
 'skinname-vector' => 'ვექტორული',
 
@@ -3125,11 +3158,25 @@ $1',
 'minutes' => '$1 წუთის',
 'hours' => '$1 საათის',
 'days' => '$1 დღის',
+'weeks' => '{{PLURAL:$1|$1 კვირა|$1 კვირა}}',
 'months' => '{{PLURAL:$1|$1 თვე|$1 თვე}}',
 'years' => '{{PLURAL:$1|$1 წელი|$1 წელი}}',
 'ago' => '$1 წინ',
 'just-now' => 'ახლახანს',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|საათის|საათის}} წინ',
+'minutes-ago' => '$1 {{PLURAL:$1|წუთის|წუთის}} წინ',
+'seconds-ago' => '$1 {{PLURAL:$1|წამის|წამის}} წინ',
+'monday-at' => 'ორშაბათს $1-ზე',
+'tuesday-at' => 'სამშაბათს $1-ზე',
+'wednesday-at' => 'ოთხშაბათს $1-ზე',
+'thursday-at' => 'ხუთშაბათს $1-ზე',
+'friday-at' => 'პარასკევს $1-ზე',
+'saturday-at' => 'შაბათს $1-ზე',
+'sunday-at' => 'კვირას $1-ზე',
+'yesterday-at' => 'გუშინ $1-ზე',
+
 # Bad image list
 'bad_image_list' => 'ფორმატი შემდეგია:
 
@@ -3160,7 +3207,7 @@ $1',
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'სიგანე',
 'exif-imagelength' => 'სიმაღლე',
 'exif-bitspersample' => 'ფერის კომპონენტთა სიღრმე',
@@ -3353,7 +3400,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'შეუკუმშავი',
 'exif-compression-2' => 'CCITT Group 3, ჰაფმანის სერიის სიგრძის კოდირების 1-განზომილებიანი მოდიფიკაცია',
 'exif-compression-3' => 'CCITT Group 3 ფაქსის კოდირება',
@@ -3692,7 +3739,6 @@ $5
 'semicolon-separator' => ';&#32;',
 'comma-separator' => ',&#32;',
 'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
 'pipe-separator' => '&#32;|&#32;',
 'word-separator' => '&#32;',
 'ellipsis' => '...',
@@ -3803,7 +3849,6 @@ $5
 'version-other' => 'სხვა',
 'version-mediahandlers' => 'მედია დამუშავება',
 'version-hooks' => 'ჰუკები',
-'version-extension-functions' => 'გაფართოებათა ფუნქციები',
 'version-parser-extensiontags' => 'სინტაქსური ანალიზატორის თეგი',
 'version-parser-function-hooks' => 'სინტაქსური ანალიზატორის ჰუკი',
 'version-hook-name' => 'ჰუკის სახელი',
@@ -3813,6 +3858,7 @@ $5
 'version-license' => 'ლიცენზია',
 'version-poweredby-credits' => "ეს ვიკი მუშაობს '''[//www.mediawiki.org/ MediaWiki]'''-ს ძრავზე, copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'სხვები',
+'version-poweredby-translators' => 'translatewiki.net-ის მთარგმნელები',
 'version-credits-summary' => 'გვინდა მადლობა გადავუხადოთ შემდეგ მომხმარებლებს მათი წვლილისათვის [[Special:Version|მედიავიკის]] განვითარებაში.',
 'version-license-info' => 'MediaWiki არის თავისუფალი პროგრამული უზრუნველყოფა; შეგიძლიათ მისი გავრცელება ან/და მოდიფიცირება GNU General Public License ლიცენზიის პირობების შესაბამისად. როგორც გამოქვეყნებულია თავისუფალი პროგრამული უზრუნველყოფის ფონდის მიერ; ან ლიცენზიის მეორე ვერსიაში, ან (თქვენი აზრით) უფრო ახალში.
 
@@ -3828,11 +3874,16 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath გზა სტატიისაკენ]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath გზა სკრიპტისაკენ]',
 
-# Special:FilePath
-'filepath' => 'გზა ფაილისდამი',
-'filepath-page' => 'ფაილი:',
-'filepath-submit' => 'წავიდა',
-'filepath-summary' => 'მოცემული სპეცგვერდი აბრუნებს ზუსტ გზას ფაილისდამი იმ სახით, რომლითაც იგი დისკზეა შენახული',
+# Special:Redirect
+'redirect' => 'გადამისამართება ფაილიდან, მომხმარებლიდან ან ვერსიის იდენტიფიკატორიდან',
+'redirect-legend' => 'გადამისამართება ფაილზე ან გვერდზე',
+'redirect-submit' => 'მიდი',
+'redirect-lookup' => 'ძიება:',
+'redirect-value' => 'მნიშვნელობა:',
+'redirect-user' => 'მომხმარებლის იდენტიფიკატორი',
+'redirect-revision' => 'გვერდის ვერსია',
+'redirect-file' => 'ფაილის სახელი',
+'redirect-not-exists' => 'მნიშვნელობა ვერ მოიძებნა',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ერთნაირი ფაილების ძიება',
@@ -3884,7 +3935,10 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'tags-tag' => 'ტეგის სახელი',
 'tags-display-header' => 'რედაქტირებების სიაში ცვლილებების წარმოდგენა',
 'tags-description-header' => 'მნიშვნელობის სრული აღწერა',
+'tags-active-header' => 'აქტიურია?',
 'tags-hitcount-header' => 'აღნიშნული ცვლილებები',
+'tags-active-yes' => 'დიახ',
+'tags-active-no' => 'არა',
 'tags-edit' => 'რედაქტირება',
 'tags-hitcount' => '$1 ცვლილება',
 
@@ -3905,6 +3959,7 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'dberr-problems' => 'ბოდიში! საიტზე დროებითი ტექნიკური პრობლემებია',
 'dberr-again' => 'ეცადეთ რამდენიმე წუთით დაცდა და ამ გვერდის გადატვირთვა',
 'dberr-info' => 'ვერ მოხერხდა ინფორმაციის $1 სერვერთან დაკავშირება',
+'dberr-info-hidden' => '(მონაცემთა ბაზის სერვერთან დაკავშირება შეუძლებელია)',
 'dberr-usegoogle' => 'ამ დროს კი  შეგიძლიათ Google-ით ძიება',
 'dberr-outofdate' => 'გაითვალისწინეთ, რომ თქვენი კონტენტის ინდექსები შეიძლება შეუსაბამო იყოს',
 'dberr-cachederror' => 'ეს არის მოთხოვნილი გვერდის კეშირებული ვერსია, და შესაძლება მოძველდა.',
@@ -3920,6 +3975,9 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'htmlform-submit' => 'შენახვა',
 'htmlform-reset' => 'ცვლილებების გაუქმება',
 'htmlform-selectorother-other' => 'სხვა',
+'htmlform-no' => 'არა',
+'htmlform-yes' => 'დიახ',
+'htmlform-chosen-placeholder' => 'აირჩიეთ პარამეტრი',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 სრული ტექსტის ძიების მხარდაჭერით',
@@ -4037,4 +4095,10 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 # Image rotation
 'rotate-comment' => 'სურათი მოტრიალებულია $1 {{PLURAL:$1|გრადუსით|გრადუსით}} საათის ისრის მიმართულებით',
 
+# Limit report
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|წამი}}',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|წამი}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|ბაიტი}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|ბაიტი}}',
+
 );
diff --git a/languages/messages/MessagesKaa.php b/languages/messages/MessagesKaa.php
index 37e4005e..3bac5f9b 100644
--- a/languages/messages/MessagesKaa.php
+++ b/languages/messages/MessagesKaa.php
@@ -180,9 +180,6 @@ $messages = array(
 'tog-enotifrevealaddr' => "Eskertiw xatlarında e-mail adresimdi ko'rset",
 'tog-shownumberswatching' => "Baqlag'an paydalanıwshılar sanın ko'rset",
 'tog-fancysig' => 'İmzalardı wikitext dep qabıl etiw (avtomat siltewsiz)',
-'tog-externaleditor' => "Defolt boyınsha sırtqı o'zgertiwshini qollan (tek g'ana ta'jiriybeli paydalanıwshılar ushın, kompyuterin'izde qosımsha sazlawlar qılınıwı kerek. [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
-'tog-externaldiff' => "Defoltta sırtqı parqtı qollan (tek ekspert paydalanıwshılar ushın, kompyuterin'izde arnawlı sazlawlardı talap etedi. [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
-'tog-showjumplinks' => "«O'tip ketiw» siltewlerin qos",
 'tog-uselivepreview' => "Janlı ko'rip shıg'ıwdı qollan (JavaScript) (Sınawda)",
 'tog-forceeditsummary' => "O'zgertiw juwmag'ı bos qalg'anda mag'an eskert",
 'tog-watchlisthideown' => "Baqlaw dizimindegi menin' o'zgertiwlerimdi jasır",
@@ -267,7 +264,7 @@ $messages = array(
 'category-file-count-limited' => "Usı kategoriyada to'mendegi {{PLURAL:$1|fayl|$1 fayl}} bar.",
 'listingcontinuesabbrev' => 'dawamı',
 
-'linkprefix' => '/^(.*?)([a-zıA-Zİ\\x80-\\xff]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![a-zıA-Zİ\\x80-\\xff])))(.+)$/sDu',
 
 'about' => 'Haqqında',
 'article' => "Mag'lıwmat beti",
@@ -360,7 +357,7 @@ $messages = array(
 'jumptonavigation' => 'navigatsiya',
 'jumptosearch' => 'izlew',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} haqqında',
 'aboutpage' => 'Project:Haqqında',
 'copyright' => "Mag'lıwmat $1 boyınsha alıng'an.",
@@ -370,7 +367,6 @@ $messages = array(
 'disclaimers' => 'Juwapkershilikten bas tartıw',
 'disclaimerpage' => 'Project:Juwapkershilikten bas tartıw',
 'edithelp' => "O'zgertiw anıqlaması",
-'edithelppage' => "Help:O'zgertiw",
 'helppage' => 'Help:Mazmunı',
 'mainpage' => 'Bas bet',
 'mainpage-description' => 'Bas bet',
@@ -441,17 +437,6 @@ Arnawlı betlerdin' dizimin [[Special:SpecialPages|{{int:specialpages}}]] betine
 # General errors
 'error' => "Qa'telik",
 'databaseerror' => "Mag'lıwmatlar bazası qa'tesi",
-'dberrortext' => "Mag'lıwmatlar bazası sorawında sintaksis qa'tesi sa'dir boldı.
-Bul bag'darlamada qa'te barlıg'ın bildiriwi mu'mkin.
-Aqırg'ı soralg'an mag'lıwmatlar bazası sorawı:
-<blockquote><tt>\$1</tt></blockquote>
-\"<tt>\$2</tt>\" funktsiyasınan.
-Mag'lıwmatlar bazası qaytarg'an qa'tesi \"<tt>\$3: \$4</tt>\".",
-'dberrortextcl' => 'Mag\'lıwmatlar bazası sorawında sintaksis qa\'tesi sa\'dir boldı.
-Aqırg\'ı soralg\'an mag\'lıwmatlar bazası sorawı:
-"$1"
-funktsiya: "$2".
-Mag\'lıwmatlar bazası qaytarg\'an qa\'tesi "$3: $4".',
 'laggedslavemode' => "Esletpe: Bette aqırg'ı jan'alanıwlar bolmawı mu'mkin.",
 'readonly' => "Mag'lıwmatlar bazası qulplang'an",
 'enterlockreason' => "Qulıplawdın' sebebin ha'mde qansha waqıtqa esaplang'anlıg'ın ko'rsetin'",
@@ -497,7 +482,6 @@ Birneshe minuttan keyin qaytadan ha'reket qılıp ko'rin'.",
 'editinginterface' => "'''Esletpe:''' Siz ishinde MediaWiki sistema xabarı bar bolg'an betti o'zgertip atırsız.
 Bul bettin' o'zgeriwi basqa paydalanıwshılardın' sırtqı interfeisine ta'sir etedi.
 Audarıw ushın,  MediaWiki programmasın jersindiriw [//translatewiki.net/wiki/Main_Page?setlang=kaa translatewiki.net proyektisin] qarap shıg'ın'ız.",
-'sqlhidden' => "(SQL sorawı jasırılg'an)",
 'namespaceprotected' => "'''$1''' isimler ko'pligindegi betlerdi o'zgertiwge ruxsatın'ız joq.",
 'ns-specialprotected' => '"{{ns:special}}:" isimler ko\'pligindegi betler o\'zgertilmeydi',
 'titleprotected' => "Bul atamanı jaratıw [[User:$1|$1]] ta'repinen qorg'alg'an.
@@ -600,7 +584,7 @@ Kiriw protsessin juwmaqlaw ushın jan'a parolin'izdi usı jerge kiritin':",
 'newpassword' => 'Taza parol:',
 'retypenew' => "Taza paroldi qayta kiritin':",
 'resetpass_submit' => "Paroldi kirgizin'",
-'resetpass_success' => "Parolin'iz sa'tli o'zgertildi! Endi kirin'...",
+'changepassword-success' => "Parolin'iz sa'tli o'zgertildi! Endi kirin'...",
 'resetpass_forbidden' => "Paroller o'zgertile almaydi",
 'resetpass-submit-loggedin' => "Paroldi o'zgertiw",
 'resetpass-temp-password' => 'Waqtınshalıq parol:',
@@ -827,7 +811,6 @@ Sha'rtli belgiler: (ha'z.) = ha'zirgi nusqasi menen parqı,
 'searchmenu-legend' => 'İzlew sazlawları',
 'searchmenu-exists' => "'''Bul wikide \"[[:\$1]]\" atamalı bet bar'''",
 'searchmenu-new' => "'''Bul wikide \"[[:\$1]]\" betin jaratıw!'''",
-'searchhelp-url' => 'Help:Mazmunı',
 'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Usı prefiks penen baslanıwshı betlerdi ko'rset]]",
 'searchprofile-articles' => "Mag'lıwmat betleri",
 'searchprofile-project' => "Ja'rdem ha'm Proekt betleri",
@@ -863,14 +846,6 @@ Barlıq mag'lıwmat tu'rin (sonın' ishinde sa'wbet betlerdi, shablonlardı h.t.
 'powersearch-field' => "İzlenetug'ın so'z (yamasa so'z dizbegi):",
 'search-external' => 'Sırtqı izlewshi',
 
-# Quickbar
-'qbsettings' => 'Navigatsiya paneli',
-'qbsettings-none' => 'Hesh qanday',
-'qbsettings-fixedleft' => 'Shepke bekitilgen',
-'qbsettings-fixedright' => "On'g'a bekitilgen",
-'qbsettings-floatingleft' => 'Shepte jıljıwshı',
-'qbsettings-floatingright' => "On'da jıljıwshı",
-
 # Preferences page
 'preferences' => 'Sazlawlar',
 'mypreferences' => "Menin' sazlawlarım",
@@ -894,7 +869,6 @@ Barlıq mag'lıwmat tu'rin (sonın' ishinde sa'wbet betlerdi, shablonlardı h.t.
 'saveprefs' => 'Saqla',
 'resetprefs' => "Saqlanbag'an o'zgerislerdi o'shir",
 'prefs-editing' => "O'zgertiw",
-'prefs-edit-boxsize' => "O'zgertiw aynasının' o'lshemi.",
 'rows' => 'Qatarlar:',
 'columns' => "Bag'analar:",
 'searchresultshead' => 'İzlew',
@@ -1094,7 +1068,6 @@ Barlıq mag'lıwmat tu'rin (sonın' ishinde sa'wbet betlerdi, shablonlardı h.t.
 'recentchangeslinked-feed' => "Baylanıslı o'zgerisler",
 'recentchangeslinked-toolbox' => "Baylanıslı o'zgerisler",
 'recentchangeslinked-title' => '"$1" ushın baylanıslı o\'zgerisler',
-'recentchangeslinked-noresult' => "Siltelgen betlerde berilgen waqıt dawamında hesh qanday o'zgeris bolmag'an.",
 'recentchangeslinked-summary' => "Bul arnawlı bette siltelgen betlerdegi aqırg'ı o'zgerisler dizimi ko'rsetilgen. [[Special:Watchlist|Baqlaw dizimin'izdegi]] betler '''juwan''' ha'ribi menen ko'rsetilgen.",
 'recentchangeslinked-page' => 'Bet ataması:',
 'recentchangeslinked-to' => "Kerisinshe, berilgen betke silteytug'ın betlerdegi o'zgerislerdi ko'rset",
@@ -1246,9 +1219,6 @@ Barlıq mag'lıwmat tu'rin (sonın' ishinde sa'wbet betlerdi, shablonlardı h.t.
 'statistics-users-active' => 'Aktiv paydalanıwshılar',
 'statistics-mostpopular' => "En' ko'p ko'rilgen betler",
 
-'disambiguations' => "Ko'p ma'nisli betler",
-'disambiguationspage' => '{{ns:template}}:disambig',
-
 'doubleredirects' => 'Qos burıwshılar',
 'double-redirect-fixer' => "Qayta bag'ıtlawshılardı du'zetiwshi",
 
@@ -1412,7 +1382,7 @@ Eger siz bul betti baqlaw dizimin'izden o'shirmekshi bolsan'ız bettin' joqarg'
 'notanarticle' => "Mag'lıwmat beti emes",
 'notvisiblerev' => "Nusqa o'shirildi",
 'watchlist-details' => "Baqlaw dizimin'izde (sa'wbet betlerin esapqa almag'anda) {{PLURAL:$1|1 bet|$1 bet}} bar.",
-'wlheader-enotif' => "* E-mail arqalı eskertiw qosılg'an.",
+'wlheader-enotif' => "E-mail arqalı eskertiw qosılg'an.",
 'watchlistcontains' => "Sizin' baqlaw dizimin'izde {{PLURAL:$1|1 bet|$1 bet}} bar.",
 'wlnote' => "To'mende aqırg'ı {{PLURAL:$2|saattag'ı|'''$2''' saattag'ı}} {{PLURAL:$1|aqırg'ı o'zgeris bar|aqırg'ı '''$1''' o'zgeris bar}}.",
 'wlshowlast' => "Aqırg'ı $1 saat, $2 ku'n, $3 ko'rset",
@@ -1610,8 +1580,6 @@ Basqa bloklawlar ushın [[Special:BlockList|IP bloklaw dizimin]] ko'rip shıg'ı
 'block-log-flags-noemail' => "e-mail bloklang'an",
 'ipb_expiry_invalid' => "Ku'shin joytıw waqtı nadurıs.",
 'ipb_already_blocked' => '"$1" a\'lle qashan bloklang\'an',
-'proxyblocker-disabled' => "Bul funktsiya o'shirilgen.",
-'proxyblocksuccess' => 'Tamamlandı.',
 
 # Developer tools
 'lockdb' => "Mag'lıwmatlar bazasın qulpla",
@@ -1829,7 +1797,7 @@ Eger fayl jaratılg'anınan keyin o'zgertilgen bolsa, geybir parametrleri o'zger
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Yeni:',
 'exif-imagelength' => "Uzunlıg'ı",
 'exif-imagedescription' => "Su'wret ataması",
@@ -1932,9 +1900,6 @@ Bul tastıyıqlaw kodının' pitetug'ın waqtı: $4.",
 # Special:Version
 'version' => "MediaWikidin' nusqası",
 
-# Special:FilePath
-'filepath' => 'Fayl jolı',
-
 # Special:SpecialPages
 'specialpages' => 'Arnawlı betler',
 'specialpages-group-users' => "Paydalanıwshılar ha'm olardın' huqıqları",
diff --git a/languages/messages/MessagesKab.php b/languages/messages/MessagesKab.php
index 33a9490a..27bff4d7 100644
--- a/languages/messages/MessagesKab.php
+++ b/languages/messages/MessagesKab.php
@@ -73,9 +73,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ssken geddac yellan n yimseqdacen iɛessasen',
 'tog-oldsig' => 'Azmul yellan :',
 'tog-fancysig' => 'ǧǧ azmul am yettili (war azday awurman)',
-'tog-externaleditor' => 'Sseqdec ambeddel n berra d ameslugen',
-'tog-externaldiff' => 'Sseqdec ambeddel n berra iwakken ad ẓreɣ imgerraden',
-'tog-showjumplinks' => 'Eǧǧ izdayen "neggez ar"',
 'tog-uselivepreview' => 'Sseqdec pre-timeẓriwt taǧiḥbuṭ (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Ini-iyi-d mi sskecmeɣ agzul amecluc',
 'tog-watchlisthideown' => 'Ffer ibeddlen inu seg wumuɣ n uɛessi inu',
@@ -88,6 +85,7 @@ $messages = array(
 'tog-diffonly' => 'Ur temliḍ-iyi-d ara ayen yellan seddaw imgerraden',
 'tog-showhiddencats' => 'Beqqeḍ taggayin yeffren',
 'tog-norollbackdiff' => 'Ur beqqeḍ ara "diff" ma yella usemmet',
+'tog-useeditwarning' => 'Σeggen iyid mi ara fγaγ seg usebter mebla ma skeslaγ ibeddilen.',
 
 'underline-always' => 'Daymen',
 'underline-never' => 'Abaden',
@@ -273,7 +271,7 @@ $1',
 'pool-queuefull' => 'Adras n umahil yečuṛ',
 'pool-errorunknown' => 'Anezri warisem',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Awal ɣef {{SITENAME}}',
 'aboutpage' => 'Project:Awal ɣef...',
 'copyright' => 'Tzemreḍ ad twaliḍ ayen yella deg $1.',
@@ -283,7 +281,6 @@ $1',
 'disclaimers' => 'Iɣtalen',
 'disclaimerpage' => 'Project:Iɣtalen',
 'edithelp' => 'Tallat deg ubeddel',
-'edithelppage' => 'Help:Abeddel',
 'helppage' => 'Help:Agbur',
 'mainpage' => 'Asebter amenzawi',
 'mainpage-description' => 'Asebter amenzawi',
@@ -356,17 +353,6 @@ $1',
 # General errors
 'error' => 'Agul',
 'databaseerror' => 'Agul n database',
-'dberrortext' => 'Yella ugul n tseddast deg database.
-Waqila yella bug deg software.
-Query n database taneggarut hatt:
-<blockquote><tt>$1</tt></blockquote>
-seg tawuri  "<tt>$2</tt>".
-MySQL yerra-d agul "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Yella ugul n tseddast deg database.
-Query n database taneggarut hatt:
-"$1"
-seg tawuri "$2".
-MySQL yerra-d agul "$3: $4"',
 'laggedslavemode' => 'Aɣtal: Ahat asebter ur yesɛi ara akk ibeddlen imaynuten.',
 'readonly' => 'Database d tamsekkert',
 'enterlockreason' => 'Ini ayɣer tsekkreḍ database, ini daɣen melmi ara ad ifukk asekker',
@@ -418,7 +404,6 @@ Query: $2',
 'viewyourtext' => 'Tzemṛeḍ ad ẓṛeḍ dɣa ad nɣeleḍ agbur n "ibeddlen inek/inem" deg usebter agi :',
 'protectedinterface' => 'Asebter-agi d amsekker axaṭer yettuseqdac i weḍris n software.',
 'editinginterface' => "'''Aɣtal:''' Aqla-k tettbeddileḍ asebter i yettuseqdac i weḍris n software. Tagmett n software i tt-ẓren yimseqdacen wiyaḍ ad tbeddel akk d ibeddlen inek.",
-'sqlhidden' => '(Query n SQL tettwaffer)',
 'cascadeprotected' => 'Asebter-agi yegdel axaṭer yettusekcem deg {{PLURAL:$1|asebter yegdelen agi|isebtar yegdelen agi}} s Taxtiṛit « amesten s uceṛcuṛ » isermeden :
 $2',
 'namespaceprotected' => "Ur tesɛiḍ ara turagt iwakken ad beddeleḍ isebtar n tallunt n isemawen \"'''\$1'''\".",
@@ -449,7 +434,6 @@ Kra n isebtar zemren ad sskanen belli mazal-ik s yisem n wemseqdac inek armi tem
 'yourpassword' => 'Awal n tbaḍnit',
 'yourpasswordagain' => 'Ɛiwed ssekcem awal n tbaḍnit',
 'remembermypassword' => 'Cfu ɣef wawal n tbaḍnit inu di uselkim-agi (i afellay n $1 {{PLURAL:$1|ass|ussan}})',
-'securelogin-stick-https' => 'Qqim uqqin s HTTPS sakin tuqqna',
 'yourdomainname' => 'Taɣult inek',
 'password-change-forbidden' => 'Ur zemreḍ ara ad beddeleḍ awalen n uɛaddi ɣef uwiki agi.',
 'externaldberror' => 'Yella ugul aberrani n database neɣ ur tettalaseḍ ara ad tbeddleḍ isem an wemseqdac aberrani inek.',
@@ -542,7 +526,7 @@ Ilaq ad rǧuḍ ciṭaḥ uqbel ad ɛerdeḍ tikkelt nniḍen.',
 'newpassword' => 'Awal n tbaḍnit amaynut:',
 'retypenew' => 'Ɛiwed ssekcem n tbaḍnit amaynut:',
 'resetpass_submit' => 'Eg awal n tbaḍnit u kcem',
-'resetpass_success' => 'Awal n tbaḍnit yettubeddel! Qrib ad tkecmeḍ...',
+'changepassword-success' => 'Awal n tbaḍnit yettubeddel! Qrib ad tkecmeḍ...',
 'resetpass_forbidden' => 'Ur zemreḍ ara ad beddeleḍ awalen n uɛaddi',
 'resetpass-no-info' => 'Ilaq ad qqeneḍ iwakken ad ẓṛeḍ asebter agi.',
 'resetpass-submit-loggedin' => 'Beddel awal n uɛaddi',
@@ -553,10 +537,8 @@ Ahat ilaq ad beddeleḍ awal ik/im n uɛaddi naɣ ad ssutereḍ awal n uɛaddi a
 
 # Special:PasswordReset
 'passwordreset' => 'Awennez tikkelt nniḍen n awal uɛaddi',
-'passwordreset-text' => 'Ččur tiferkit agi iwakken ad eṭṭfeḍ tirawt n usmekti  deg-es tilɣa n umiḍan inek/inem.',
 'passwordreset-legend' => 'Awennez tikkelt nniḍen n awal uɛaddi',
 'passwordreset-disabled' => 'Awennez n awal uɛaddi yensa deg uwiki agi.',
-'passwordreset-pretext' => '{{PLURAL:$1||Sekcem aferdis n isefka ddaw agi}}',
 'passwordreset-username' => 'Isem n useqdac',
 'passwordreset-domain' => 'Talɣut :',
 'passwordreset-capture' => 'Ẓeṛ tirawt ?',
@@ -1017,7 +999,6 @@ Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
 'searchmenu-legend' => 'Tixtiṛiyin n unadi',
 'searchmenu-exists' => "'''Yella asebter s isem \"[[:\$1]]\" deg wiki agi.'''",
 'searchmenu-new' => "'''Snulfud asebter « [[:$1|$1]] » deg wiki agi !'''",
-'searchhelp-url' => 'Help:Agbur',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Nadi isebtar i zwaren s adat agi]]',
 'searchprofile-articles' => 'Isebtar n ugbur',
 'searchprofile-project' => 'Isebtaren n tallat dɣa n usenfa',
@@ -1060,15 +1041,6 @@ Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
 'search-external' => 'Anadi yeffɣen',
 'searchdisabled' => 'Anadi deg {{SITENAME}} yettwakkes. Tzemreḍ ad tnadiḍ s Google. Meɛna ur tettuḍ ara, tasmult n google taqdimt.',
 
-# Quickbar
-'qbsettings' => 'Tanuga taǧiḥbuṭ',
-'qbsettings-none' => 'Ulac',
-'qbsettings-fixedleft' => 'Aẓelmaḍ',
-'qbsettings-fixedright' => 'Ayeffus',
-'qbsettings-floatingleft' => 'Tufeg aẓelmaḍ',
-'qbsettings-floatingright' => 'Tufeg ayeffus',
-'qbsettings-directionality' => 'Usbiḍ, ɣef wayen n unamud n tira n tutlayt ik/im',
-
 # Preferences page
 'preferences' => 'Isemyifiyen',
 'mypreferences' => 'Isemyifiyen inu',
@@ -1101,7 +1073,6 @@ Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
 'resetprefs' => 'Asfeḍ n ibeddilen ur ḥrezen ara',
 'restoreprefs' => 'Err akkw azalen s lexṣas',
 'prefs-editing' => 'Abedddil',
-'prefs-edit-boxsize' => 'Lqedd n usfaylu n ubeddel.',
 'rows' => 'Ijerriḍen:',
 'columns' => 'Tigejda:',
 'searchresultshead' => 'Anadi',
@@ -1112,9 +1083,6 @@ Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
 'recentchangesdays-max' => 'Afellay $1 {{PLURAL:$1|ass|ussan}}',
 'recentchangescount' => 'Amḍan n ibeddilen i ubeqqeḍ s lexṣas :',
 'prefs-help-recentchangescount' => 'Wagi yesɛa deg-es ibeddilen ineggura, isebtar n umezruy d iɣmisen.',
-'prefs-help-watchlist-token' => 'Ččuṛ taɣzut agi s azal lbaḍna dɣa asuddem RSS ad yetwarew i umuɣ inek/inem n uɛassi.
-Akkw amdan yesnen tiddest agi ad yezmer ad i ɣeṛ umuɣ inek/inem n uɛassi, ihi ilaq ad xtiṛeḍ azal yegdelen.
-Ha-t-an azal agacuran i tzemreḍ ad seqdeceḍ : $1',
 'savedprefs' => 'Isemyifiyen inek yettusmektan.',
 'timezonelegend' => 'Iẓḍi n ukud :',
 'localtime' => 'Asrag adigan :',
@@ -1145,7 +1113,6 @@ Ha-t-an azal agacuran i tzemreḍ ad seqdeceḍ : $1',
 'prefs-reset-intro' => 'Tzemreḍ ad seqdeceḍ asebter agi iwakken ad erreḍ iɣewwaren inek/inem ar azalen n lexṣas n usmel.
 Wagi ur yezmer ara ad yetwekkes.',
 'prefs-emailconfirm-label' => 'Aragag n tirawt :',
-'prefs-textboxsize' => 'Tiddi n usfaylu n ubeddel',
 'youremail' => 'E-mail *:',
 'username' => 'Isem n wemseqdac:',
 'uid' => 'Amseqdac ID:',
@@ -1383,7 +1350,6 @@ Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
 'recentchangeslinked-feed' => 'Ibeddlen imaynuten n isebtar myezdin',
 'recentchangeslinked-toolbox' => 'Ibeddlen imaynuten n isebtar myezdin',
 'recentchangeslinked-title' => 'Tiḍefri n isebtaren iqqenen ar « $1 »',
-'recentchangeslinked-noresult' => 'Ulac abeddel deg isebtar myezdin deg tawala i textareḍ.',
 'recentchangeslinked-summary' => "Asebter uslig agi i sekned ibeddlen imaynuten ɣef isebtaren iqqenen. Isebtaren n [[Special:Watchlist|umuɣ n uḍfar]] llan s '''ufuyan'''.",
 'recentchangeslinked-page' => 'Isen n usebter :',
 'recentchangeslinked-to' => 'Beqqeḍ ibeddilen n isebtareb i sɛan azday ɣer asebter nni wala anemgal',
@@ -1607,7 +1573,6 @@ I taɣellist tameqqṛant, img_auth.php yensa.',
 'http-read-error' => 'Anezri n taɣuri HTTP.',
 'http-timed-out' => 'Tuttra HTTP teneffeṛ.',
 'http-curl-error' => 'Anezri deg tiririt n URL : $1',
-'http-host-unreachable' => 'Ulamek an siḍes URL',
 'http-bad-status' => 'Yella ugur deg tuttra HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1756,12 +1721,6 @@ Ur tettuḍ ara ad selkeneḍ ma ur llan ara izdayen nniḍen ɣer tilɣatin uqb
 'statistics-users-active-desc' => 'Iseqdacen yesɛan xersum yiwet tigawt seg {{PLURAL:$1|ass agi aneggaru|$1 ussan agi ineggura}}',
 'statistics-mostpopular' => 'isebtar mmeẓren aṭṭas',
 
-'disambiguations' => 'Isebtar yesɛan izdayen ɣer isebtar n tiynisemt',
-'disambiguationspage' => 'Template:Asefham',
-'disambiguations-text' => "Isebtar agi azday ɣer '''asebter n tiynisemt'''.
-Ilaq ad sɛun azday ɣer amagrad amellay.<br />
-Asebter yella d asebter n tiynisemt lukan yetseqdac talɣa i qqenen ar [[MediaWiki:Disambiguationspage]]",
-
 'doubleredirects' => 'Asemmimeḍ yeḍra snat tikwal',
 'doubleredirectstext' => 'Mkull ajerriḍ yesɛa azday ɣer asmimeḍ amezwaru akk d wis sin, ajerriḍ amezwaru n uḍris n usebter wis sin daɣen, iwumi yefkan asmimeḍ ṣaḥiḥ i yessefk ad sɛan isebtar azday ɣur-s.',
 'double-redirect-fixed-move' => 'Alsanamud agi, ɣef ayed asaḍas [[$1]] yetwebeddel isem, yetawi tura ɣer [[$2]].',
@@ -2010,10 +1969,9 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 'unwatchthispage' => 'Fakk aɛassi',
 'notanarticle' => 'Mačči d amagrad',
 'notvisiblerev' => 'Lqem tetwemḥa',
-'watchnochange' => 'Ulaḥedd n yiferdas n wumuɣ n uɛessi inek ma yettubeddel deg tawala i textareḍ.',
 'watchlist-details' => 'ttɛassaɣ {{PLURAL:$1|$1 usebter|$1 n isebtaren}} mebla isebtaren "amyannan".',
-'wlheader-enotif' => '* Yeǧǧa Email n talɣut.',
-'wlheader-showupdated' => "* Isebtar ttubeddlen segwasmi tkecmeḍ tikelt taneggarut ttbanen-d s '''uḍris aberbuz'''",
+'wlheader-enotif' => 'Yeǧǧa Email n talɣut.',
+'wlheader-showupdated' => "Isebtar ttubeddlen segwasmi tkecmeḍ tikelt taneggarut ttbanen-d s '''uḍris aberbuz'''",
 'watchmethod-recent' => 'yessenqed ibeddlen imaynuten n isebtar i ttɛasseɣ',
 'watchmethod-list' => 'yessenqed isebtar i ttɛassaɣ i ibeddlen imaynuten',
 'watchlistcontains' => 'Umuɣ n uɛessi inek ɣur-s $1 n {{PLURAL:$1|usebter|isebtar}}.',
@@ -2281,7 +2239,6 @@ Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
 'block-log-flags-anononly' => 'Imseqdacen udrigen kan',
 'block-log-flags-nocreate' => 'asnulfu n umiḍan yessegdel',
 'proxyblockreason' => 'Tansa n IP inek teɛkel axaṭer nettat "open proxy". G leɛnayek, meslay akk d provider inek.',
-'proxyblocksuccess' => 'D ayen.',
 'sorbsreason' => 'Tansa IP inek/inem tella deg yiwen umuɣ am "open proxy" deg DNSBL yettuseqdac deg {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Tansa IP inek/inem tella deg yiwen umuɣ am "open proxy" deg DNSBL yettuseqdac deg {{SITENAME}}.
 Ur tezmireḍ ara ad snulfuḍ amiḍan.',
@@ -2541,6 +2498,19 @@ Lukan a t-tesseqdceḍ yezmer ad yexsser aselkim inek/inem.",
 'ago' => '$1 aya',
 'just-now' => 'Tura kan',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|asrag|isragen}} aya',
+'minutes-ago' => '$1 {{PLURAL:$1|tamrect|timercin}} aya',
+'seconds-ago' => '$1 {{PLURAL:$1|tasint|tisinin}} aya',
+'monday-at' => 'Arim af $1',
+'tuesday-at' => 'Aram af $1',
+'wednesday-at' => 'Ahad af $1',
+'thursday-at' => 'Amhad af $1',
+'friday-at' => 'Sem af $1',
+'saturday-at' => 'Sed af $1',
+'sunday-at' => 'Acer af $1',
+'yesterday-at' => 'Iḍelli af $1',
+
 # Bad image list
 'bad_image_list' => 'Amasal d-wagi :
 
@@ -2567,7 +2537,7 @@ Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Tehri',
 'exif-imagelength' => 'Taɣwzi',
 'exif-bitspersample' => 'Ibitten s isger',
@@ -2982,11 +2952,6 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'version-entrypoints-header-entrypoint' => 'Ired n wekcam',
 'version-entrypoints-header-url' => 'Tansa URL',
 
-# Special:FilePath
-'filepath' => 'Abrid n wadduf ufaylu',
-'filepath-page' => 'Afaylu :',
-'filepath-submit' => 'Ruḥ',
-
 # Special:SpecialPages
 'specialpages' => 'isebtar usligen',
 
diff --git a/languages/messages/MessagesKbd_cyrl.php b/languages/messages/MessagesKbd_cyrl.php
index 85b046d3..05dddd7d 100644
--- a/languages/messages/MessagesKbd_cyrl.php
+++ b/languages/messages/MessagesKbd_cyrl.php
@@ -84,9 +84,6 @@ $messages = array(
 'tog-shownumberswatching' => 'НапэкӀуэцӀыр я тхылъ кӀэлъыплъыгъуэхэм хэзгъэхьахэм я бжыгъэр гъэлъэгъуэн',
 'tog-oldsig' => 'ӀэпэщӀэдз щыӀэм и япэ-еплъ',
 'tog-fancysig' => 'Викитхылъ ӀэпэщӀэдз Ӏыгъын (автоматикэ техьэпӀэншу)',
-'tog-externaleditor' => 'Хэмыт редакторыр къэгъэсэбэпын (компутырым абым теухуа тегъэпсыхьыгъуэ хуэныкъуэ)',
-'tog-externaldiff' => 'Хэмыт программэр къэгъэсэбэпын зэгъэлъытэн шъхьэкӀэ (компутырым абым теухуа тегъэпсыхьыгъуэ хуэныкъуэ)',
-'tog-showjumplinks' => 'ДэӀэпыкъуэгъу техьэпӀэ «техьэн» хэгъэнэн',
 'tog-uselivepreview' => 'Япэ-еплъ щӀэхыр къэгъэсэбэпын (JavaScript хуэныкъуэ) (эксперементалу)',
 'tog-forceeditsummary' => 'КъэӀохун, гъэтэрэзыгъуэм и тепсэлъыхьыпӀэм зыри имытхамэ',
 'tog-watchlisthideown' => 'КӀэлъыплъыгъуэ тхылъым гъэпшкIуэн си гъэтэрэзыгъуэхэр',
@@ -284,7 +281,7 @@ $1',
 'pool-queuefull' => 'ЩӀэлъэӀуэгъулъэр из хъуащ',
 'pool-errorunknown' => 'ХэщӀыкӀыгъэ зимыӀэ щэуэгъуэ',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} -м теухуауэ',
 'aboutpage' => 'Project:Теухуауэ',
 'copyright' => 'Мыбы итыр къэутӀыпщащ зытещӀыхьари: $1.',
@@ -294,7 +291,6 @@ $1',
 'disclaimers' => 'Жэуап Ӏыгъыныр зыщхьэщыхын',
 'disclaimerpage' => 'Project:Пщэрылъу къэмыштэн',
 'edithelp' => 'Гъэтэрэзыным и щӀэупщӀэ',
-'edithelppage' => 'Help:Гъэтэрэзыным и дэIэпыкъуэгъу',
 'helppage' => 'Help:ДэӀэпыкъуэгъу',
 'mainpage' => 'НапэкӀуэцӀ нэхъыщхьэ',
 'mainpage-description' => 'НапэкӀуэцӀ нэхъыщхьэ',
@@ -367,17 +363,6 @@ URL щиптхэм хэукъуэгъуэ быщӀа хъунщ иэ техэп
 # General errors
 'error' => 'Щыуагъэ',
 'databaseerror' => 'Ӏохугъуэлъэм и щыуагъэ',
-'dberrortext' => 'Ӏохугъуэлъэм и щӀэлъэуэн синтаксисым и щыуагъэ къахэкӀа.
-Абым программэ къэтыным щыуагъэ иӀэфыну къокӀыр.
-Яужырей Ӏохугъуэлъэм и щӀэлъэуэныр:
-<blockquote><tt>$1</tt></blockquote>
-функциэм къыхэкӀа <tt>«$2»</tt>.
-Ӏохугъуэлъэм щыуагъэр къитыжащ <tt>«$3: $4»</tt>.',
-'dberrortextcl' => 'Ӏохугъуэлъэм и щӀэлъэуэн синтаксисым и щыуагъэ къахэкӀа. 
-Яужырей Ӏохугъуэлъэм и щӀэлъэуэныр:
-$1
-«$2» функциэм къыхэкӀа. 
-Ӏохугъуэлъэм щыуагъэр къитыжащ «$3: $4».',
 'laggedslavemode' => 'Гу лъытэ: напэкӀуэцӀым яужырэй къэгъэщӀэрыщӀэгъуэхэр хэмылъынкӀи мэхъур.',
 'readonly' => 'Ӏохугъуэлъэм итхэныр теубыдауэ щытщ',
 'enterlockreason' => 'Теубыдэгъуэр къызхэкӀамрэ зэман зэрекӀуэкӀынумрэ къэӀоху.',
@@ -428,7 +413,6 @@ $1',
 'editinginterface' => "'''Гу лъытэ:''' Бгъэтэрэз напэкӀуэцӀым интерфэйс тхылъ хэтщ, программэтыгъэм еуэ.
 И зэхъуэкӀыгъуэм интерфэйсым и сурэтым хэуэну адрей цӀыхухэтхэм щхьэкӀэ.
 ЗэдзэкӀыным шъхьэкӀэ къэбгъэсэбэпыну нэхъыфӀыр [//translatewiki.net/wiki/Main_Page?setlang=ru translatewiki.net], MediaWiki-м и локализациэм и проэктщ.",
-'sqlhidden' => '(SQL щӀэупщӀэгъуэр гъэлъэгъуакъым)',
 'cascadeprotected' => 'ЗэхъуэкӀыныгъэм щыхъумауэ щыт напэкӀуэцӀыр, хэгъэхьауэ щыт {{PLURAL:$1|яужкӀэ напэкӀуэцӀ итым| яужкӀэ напэкӀуэцӀ итхэм}} каскад хъумэныгъэм:
 $2',
 'namespaceprotected' => "ПӀалъэ уиӀэкъым напэкӀуэцӀ '''$1''' хэтхэр бгъэтэрэзын.",
@@ -450,7 +434,6 @@ $2',
 'yourpassword' => 'Пэролыр:',
 'yourpasswordagain' => 'Иджыри зэ пэролыр:',
 'remembermypassword' => 'Сызэрихьэр компьютерым щыIыгъын (махуэу $1 {{PLURAL:$1|щIимыгъуу|щIимыгъуу}})',
-'securelogin-stick-https' => 'HTTPS -мкӀэ ихьа нэужми ирилэжьэн',
 'yourdomainname' => 'Уи доменыр:',
 'externaldberror' => 'Щэуэгъуэ хъуа, аутентификациэ щекӀуэкӀым иэ апхуэдиз пӀалъэ уиӀу щыткъым, уи нэкугъуэ аккаунтыр зэпхъуэкӀын.',
 'login' => 'Системэм зыкъегъэцIыхуын',
@@ -550,7 +533,7 @@ $2',
 'newpassword' => 'ПаролыщIэр:',
 'retypenew' => 'ПаролыщIэр иджырэ зэ итхэж:',
 'resetpass_submit' => 'Паролыр итхи ихьэ',
-'resetpass_success' => 'Уи паролыр хъуэжа хъуащ! Иджыпсту системэм йохьэ...',
+'changepassword-success' => 'Уи паролыр хъуэжа хъуащ! Иджыпсту системэм йохьэ...',
 'resetpass_forbidden' => 'Паролыр зэхъуэкӀа хъунукъым',
 'resetpass-no-info' => 'Мы напэкӀуэцӀым уелэжьыным щхьэкӀэ системэм зыкъебгъэцӀыхун хуэй.',
 'resetpass-submit-loggedin' => 'Паролыр зэхъуэкӀын',
@@ -1004,7 +987,6 @@ $1",
 'prefs-email' => 'Электронэ почтэм и опциэхэр',
 'prefs-rendering' => 'Сурэтыр',
 'prefs-editing' => 'Гъэтэрэзыгъуэ',
-'prefs-edit-boxsize' => 'Гъэтэрэзыгъуэм и нэкӀубгъум и инагъыр',
 'searchresultshead' => 'Къэгъуэтын',
 
 # Groups
diff --git a/languages/messages/MessagesKg.php b/languages/messages/MessagesKg.php
index 57caf22a..7c987aee 100644
--- a/languages/messages/MessagesKg.php
+++ b/languages/messages/MessagesKg.php
@@ -11,6 +11,19 @@
  * @author לערי ריינהארט
  */
 
+$namespaceNames = array(
+	NS_TALK             => 'Disolo',
+	NS_USER             => 'Kisadi',
+	NS_USER_TALK        => 'Disolo_kisadi',
+	NS_PROJECT_TALK     => 'Disolo_$1',
+	NS_FILE             => 'Fisye',
+	NS_FILE_TALK        => 'Disolo_fisye',
+	NS_HELP             => 'Lusadisu',
+	NS_HELP_TALK        => 'Disolo_lusadisu',
+	NS_CATEGORY         => 'Kalasi',
+	NS_CATEGORY_TALK    => 'Disolo_kalasi',
+);
+
 $messages = array(
 'underline-always' => 'Bambala nyonso',
 'underline-never' => 'Ata mbala mosi ve',
diff --git a/languages/messages/MessagesKhw.php b/languages/messages/MessagesKhw.php
index b8a1b062..b9c67607 100644
--- a/languages/messages/MessagesKhw.php
+++ b/languages/messages/MessagesKhw.php
@@ -11,7 +11,6 @@
  */
 
 $fallback = 'ur';
-
 $rtl = true;
 
 $messages = array(
@@ -45,9 +44,6 @@ $messages = array(
 'tog-shownumberswatching' => 'لوڑاک ممبرانن تعدادان پشاؤے',
 'tog-oldsig' => 'موجودہ دستخطو نمائش:',
 'tog-fancysig' => '(سادہ دسخط بلا خودکار ربط)',
-'tog-externaleditor' => 'ہمیشہ بیرونی تدوین کار استعمال کورے (صرفی ماہرینن بچے، ھمو بچے کمپیوٹرا خاص ترتیبات درکار بونیان)',
-'tog-externaldiff' => 'ہمیشہ بیرونی تدوین کار استعمال کورے (صرفی ماہرینن بچے، ھمو بچے کمپیوٹرا خاص ترتیبات درکار بونیان)',
-'tog-showjumplinks' => 'ھیہ ووشکی څروٹھاوے',
 'tog-uselivepreview' => 'براہِ راست نمائش استعمال کورے (JavaScript ضرورت بوی)',
 'tog-forceeditsummary' => 'کیاوتکی آوا ترمیمی خلاصو خالی پیڅھیتام تھے متے لو دیت',
 'tog-watchlisthideown' => 'زیرِنظرفہرستہ مہ ترمیماتن کھوشاوے',
@@ -240,7 +236,7 @@ $messages = array(
 $1',
 'pool-errorunknown' => 'نامعلوم خطا',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'تعارف {{SITENAME}}',
 'aboutpage' => 'Project:کھوار ویکیپیڈیو تعارف',
 'copyright' => 'تمام مواد $1 تحتہ میانسار شیر',
@@ -250,7 +246,6 @@ $1',
 'disclaimers' => 'اعلانات',
 'disclaimerpage' => 'Project:عام کھوار اعلان',
 'edithelp' => 'مدد براۓ ترمیم',
-'edithelppage' => 'Help:ترمیم',
 'helppage' => 'Help:فھرست',
 'mainpage' => 'آویلو صفحہ',
 'mainpage-description' => 'سرورق',
@@ -278,7 +273,6 @@ $1',
 'newmessagesdifflink' => 'تـجـدیـد مـاقـبل آخـراری فـرق',
 'youhavenewmessagesmulti' => 'ء$1 تہ بچے نوغ نوغ پیغامات شینی',
 'editsection' => 'ترمیم',
-'editsection-brackets' => '[$1]',
 'editold' => 'ترمیم',
 'viewsourceold' => 'مآخذو لوڑے',
 'editlink' => 'تدوین کورے',
@@ -326,17 +320,6 @@ $1 (صفحہ موجود نیکی)',
 # General errors
 'error' => 'Error/خطاء',
 'databaseerror' => 'خطائے ڈیٹابیس',
-'dberrortext' => 'ڈیٹابیسہ ای خطائے نحوی واقع بیتی شیر. 
-ھمو وجھین مصنع‌لطیفا چاریو نشاندہیو اندیشہ شیر. 
-آچھو سعی‌شدہ ڈیٹابیسی استفسارہ ھیہ اوشوی:
-<blockquote><tt>$1</tt></blockquote>
-فعلیتو موژار "<tt>$2</tt>".
-MySQL خطائی جواب پرائے "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'ڈیٹابیسو استفسارہ ای خطائے نحوی واقع بیتی شیر. 
-آچھو سعی‌شدہ ڈیٹابیسی استفسارہ ھیہ اوشوی:
-"$1"
-"$2" فعلیتو موژار.
-MySQL جوابِ خطاء پرائے "$3: $4"',
 'laggedslavemode' => 'Warning: Page may not contain recent updates.
 خبردار: منکھن شیر کہ صفحہا موجودہ بتاریخہ جات شامل نو بونی',
 'readonly' => 'ڈیٹابیسا قلف لیگی شیر',
@@ -380,7 +363,6 @@ MySQL جوابِ خطاء پرائے "$3: $4"',
 'protectedinterface' => 'ھیہ صفحہ مصنع‌لطیفو بچے سطح‌البینی متن فراہم کورویان، وا  ناجائزاستعمالو سدِبابو بچے ھمو قلف لیگینو بیتی شیر',
 'editinginterface' => "\"'''خبردار:''' تو ای ھش صفحہو تدوینو کوروسان کہ ھیہ مصنع‌لطیفو بچے سطح‌البینی متن فراہم کورویان۔ ھیہ صفحہا کاردو ترمیم، دیگر ممبارانن بچے سطح‌البینو تبدیل کوروی۔
 براہِ کرم، ترجمہ کوریکو بچے  [//translatewiki.net/wiki/Main_Page?setlang=en '''بیٹاویکی'''] (میڈیاویکی مقامیانی منصوبو) استعمال کورے.\",",
-'sqlhidden' => '(SQL استفسارہ کھوشت)',
 'namespaceprotected' => "\"تتے '''\$1''' فضائے نامہ صفحاتن تدوینو کوریکو اِجازت نیکی.\",",
 'ns-specialprotected' => 'خاص صفحاتن تدوین کوریکو اجازت نیکی',
 'titleprotected' => 'ھیہ عنوانو [[User:$1|$1]] تخلیق کوریکاری محفوظ کوری آسور.
@@ -744,7 +726,6 @@ HTML tags لوڑے.',",
 'recentchangeslinked' => 'متعلقہ تبدیلی',
 'recentchangeslinked-toolbox' => 'موقعی تبدیلی',
 'recentchangeslinked-title' => 'متعلقہ تبدیلی "$1"',
-'recentchangeslinked-noresult' => 'ھمی صفحا موجودہ وختہ کیہ تبدیلی نیکی۔',
 'recentchangeslinked-summary' => "ھیہ ھتے تبدیلیان لسٹ شیر کہ ھیتان پھوک مدا پروشٹی ساوزینو بیتی شینی وا ھے صفحان سوم جستہ خور کیہ صفحہ چوکی شینی یا کیہ خاص زمرہ جاتو ممبرانن سوم چوکی شینی<br />
 ساوزیرو [[Special:Watchlist|موڑا صفحہ]] '''بولڈ''' شینی",
 'recentchangeslinked-page' => 'کھوار ویکیپیڈیو منصوبو صفحو لوڑے',
@@ -785,8 +766,6 @@ HTML tags لوڑے.',",
 # Statistics
 'statistics' => 'اعداد و شمار',
 
-'disambiguationspage' => 'سانچہ: ڈسایمبگ',
-
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|بایٹ|بایٹس}}',
 'nmembers' => '$1 {{PLURAL:$1|ممبار|ممباران}}',
@@ -1117,10 +1096,6 @@ HTML tags لوڑے.',",
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'خبردار:\'\'\' ڈیفالٹ تاڑٰ(نغڑی) "$2" پروشٹیو ڈیفالٹ تاڑا "$1" لیگی شیر۔',
 
-# Special:FilePath
-'filepath-page' => 'فایل',
-'filepath-submit' => 'Go/بوغے',
-
 # Special:SpecialPages
 'specialpages' => 'اسپیشل صفحہ',
 
diff --git a/languages/messages/MessagesKiu.php b/languages/messages/MessagesKiu.php
index 9c378808..8ae5a104 100644
--- a/languages/messages/MessagesKiu.php
+++ b/languages/messages/MessagesKiu.php
@@ -82,9 +82,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Amorê karberunê şêrkerdoğu bıasne',
 'tog-oldsig' => 'İmza mewcude:',
 'tog-fancysig' => 'İmza rê mamelê wikimeqaley bıke (bê girewo otomatik)',
-'tog-externaleditor' => 'Editorê teberi standart bıgurene (teyna serba ekspertuno, komputerê sıma de ayarê xusışiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato jêdêr.])',
-'tog-externaldiff' => 'Têversanaene pê programê teberi vıraze (teyna serba ekspertuno, komputerê sıma de ayarê xısuşiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato jêdêr.])',
-'tog-showjumplinks' => 'Girê "so"y feal ke',
 'tog-uselivepreview' => 'Verqayto cande bıgurene (JavaScript) (hona cerrebnayene dero)',
 'tog-forceeditsummary' => 'Mı ke xulasa kerde cı vira, hay be mı ser de',
 'tog-watchlisthideown' => 'Vurnayisunê mı lista mına şêrkerdişi de wedare',
@@ -180,7 +177,7 @@ $messages = array(
 'noindex-category' => 'Pelê bêendeksıni',
 'broken-file-category' => 'Peli be gıreunê dosyeunê sıkıtau',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Heqa',
 'article' => 'Pela tedeesteyu',
@@ -284,7 +281,7 @@ $1',
 'pool-queuefull' => 'Rêza hewze pırra',
 'pool-errorunknown' => 'Xeta nêzanıtiye',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Heqa {{SITENAME}} de',
 'aboutpage' => 'Project:Heqa',
 'copyright' => 'Zerrek bınê $1 dero.',
@@ -294,7 +291,6 @@ $1',
 'disclaimers' => 'Diwanê mesulêti',
 'disclaimerpage' => 'Project:Diwanê mesuliyetê bıngey',
 'edithelp' => 'Phoştdariya vurnaişi',
-'edithelppage' => 'Help:Pele çıturi vurnina',
 'helppage' => 'Help:Tedeestey',
 'mainpage' => 'Pela Seri',
 'mainpage-description' => 'Pela seri',
@@ -319,7 +315,6 @@ $1',
 'newmessagesdifflink' => 'vurnaiso peyên',
 'youhavenewmessagesmulti' => '$1 de mesacê sımaê newey estê',
 'editsection' => 'bıvurne',
-'editsection-brackets' => '[$1]',
 'editold' => 'bıvurne',
 'viewsourceold' => 'çımey bıvêne',
 'editlink' => 'bıvurne',
@@ -369,18 +364,6 @@ Jü lista pelunê vêrdoğu bınê [[Special:SpecialPages|{{int:specialpages}}]]
 # General errors
 'error' => 'Xeta',
 'databaseerror' => 'Xeta panga daeyu',
-'dberrortext' => 'Jü xeta persê cumla panga daeyu de amê meydan.
-Heni aseno ke na xeta nustene de esta.
-Persê panga daeyuno peyên nia bi:
-<blockquote><tt>$1</tt></blockquote>
-ebe gurê zerrê "<tt>$2</tt>"y ra.
-Panga daeyu xetawa ke asnena "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Rêza cumleunê panga daeyu de jü xeta amê meydan.
-Heni aseno ke na xeta nustene de esta.
-Persê panga daeyuno peyên nia bi:
-"$1"
-Fonksiyono ke gureniyo "$2".
-Panga daeyu xetawa ke asnena "$3: $4"',
 'laggedslavemode' => 'Teme: Beno ke vurnaisê peyêni pele de niyê.',
 'readonly' => 'Panga daeyu kılit kerdiya',
 'enterlockreason' => 'Serba kılit-kerdişi jü sebeb bıde ke, kılitkerdis texminen key beno ra',
@@ -431,7 +414,6 @@ Kerem kerê, deqêna oncia bıcerrebnê.",
 'editinginterface' => "Teme:''' Sıma hawo jü pela ke serba nustê meqalunê caunê bırnau dana, vurnenê.
 Vurnaisê na pele karberunê binu rê serpela karberi kena ke bıasno.
 Serba çarnaişi, yardımê [//translatewiki.net/wiki/Main_Page?setlang=kiu translatewiki.net]i ra procêdoskerdene rê diqet kerê.",
-'sqlhidden' => '(Persê SQLi nımıteo)',
 'cascadeprotected' => 'Na pele esterıtene ra sıtar biya, çıke na zerrê {{PLURAL:$1|pela ke|pelunê ke}} dera/derê be "cascading" opsiyoni kılit biya, $2 de bena ra.',
 'namespaceprotected' => "'''$1''' ''namespace'' de desturê sıma be vurnaisê pelu çino.",
 'ns-specialprotected' => 'Pelê xususi nêvurrinê.',
@@ -452,7 +434,6 @@ Beno ke taê peli sıma hona cıkote asnenê, hata ke sıma ''browser cache''ê
 'yourpassword' => 'Parola:',
 'yourpasswordagain' => 'Parola tekrar ke:',
 'remembermypassword' => 'Cıkotena mı na komputeri de bia ho viri (seba tewr jêde $1 {{PLURAL:$1|roze|rozu}})',
-'securelogin-stick-https' => 'Cıkotene ra dıme HTTPS rê giredae bımane',
 'yourdomainname' => 'Bandıra sıma:',
 'externaldberror' => 'Cıfeteliyaisê naskerdene de ya xeta esta ya ki tebera vırastena hesabê sıma rê destur çino.',
 'login' => 'Cı kuye',
@@ -518,7 +499,7 @@ Kerem ke, oncia bıcerrebne.',
 'newpassword' => 'Parola newiye:',
 'retypenew' => 'Parola newiye tekrar ke:',
 'resetpass_submit' => 'Parola ayar ke u cı kuye',
-'resetpass_success' => 'Parola sıma ebe serkotene vurriye! Nıka hesabê sıma beno ra...',
+'changepassword-success' => 'Parola sıma ebe serkotene vurriye! Nıka hesabê sıma beno ra...',
 'resetpass_forbidden' => 'Paroley nêşikinê bıvurniyê',
 'resetpass-submit-loggedin' => 'Parola bıvurne',
 'resetpass-submit-cancel' => 'Bıtexelne',
@@ -743,7 +724,6 @@ Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşikinê
 'viewprevnext' => 'Bıvêne ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "''Ena 'Wikipediya de ser \"[[:\$1]]\" yew pel esto'''",
 'searchmenu-new' => "'''Nê wiki de pela \"[[:\$1]]\" baferne!'''",
-'searchhelp-url' => 'Help:Tedeestey',
 'searchprofile-articles' => 'Pelê tedeesteu',
 'searchprofile-project' => 'Pelê yardımi u procey',
 'searchprofile-images' => 'Multimedya',
@@ -782,14 +762,6 @@ Verê cıfeteliyaene de be ilawekerdena verbendê '''all:'''i ra (ebe pelunê hu
 Sıma şikinê na sıre ''Google'' de şêr kerê.
 Diqet kerê, beno ke tedeestê {{SITENAME}} uza endi rozane niyê.",
 
-# Quickbar
-'qbsettings' => 'Herbişiyaena hedefi',
-'qbsettings-none' => 'Qet',
-'qbsettings-fixedleft' => 'Çhep de bestniyo pa',
-'qbsettings-fixedright' => 'Rast de bestniyo pa',
-'qbsettings-floatingleft' => 'Çhepi ser aznino',
-'qbsettings-floatingright' => 'Rasti ser aznino',
-
 # Preferences page
 'preferences' => 'Tercihi',
 'mypreferences' => 'Tercihê mı',
@@ -958,7 +930,6 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'recentchangeslinked' => 'Ney sero vurnayene',
 'recentchangeslinked-toolbox' => 'Ney sero vurnayene',
 'recentchangeslinked-title' => 'Heqa "$1"i de vurnais',
-'recentchangeslinked-noresult' => 'Pelanê ke link biye ey vurnayîşî çino.',
 'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya ki karberunê kategoriya bêlikerdiye rê) pelunê girêdaoğu de lista de vurnaisê peyênuna.
 [[Special:Watchlist|Lista sımawa şêrkedişi de]] peli be nusto '''qolınd''' bêli kerdê.",
 'recentchangeslinked-page' => 'Namê pele:',
@@ -1060,8 +1031,6 @@ Cêr [$2 pela arezekerdena dosya de] arezekerdene asnina.',
 'statistics-articles' => 'Pelê tedeesteu',
 'statistics-pages' => 'Peli',
 
-'disambiguationspage' => 'Template:vuriyaisê maney',
-
 'brokenredirects-edit' => 'bıvurne',
 'brokenredirects-delete' => 'bestere',
 
@@ -1526,7 +1495,7 @@ Eke dosya de peydêna vuriyais biyo ki, beno ke taê melumati gorê vurnaisê ne
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Verındêni',
 'exif-imagelength' => 'Berzêni',
 
@@ -1556,10 +1525,6 @@ Eke dosya de peydêna vuriyais biyo ki, beno ke taê melumati gorê vurnaisê ne
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'Teme:\'\'\' Tuşê default sort "$2" sero tuşê default sort "$1"î ra şino.',
 
-# Special:FilePath
-'filepath-page' => 'Dosya:',
-'filepath-submit' => 'So',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Namê dosya:',
 
diff --git a/languages/messages/MessagesKk_arab.php b/languages/messages/MessagesKk_arab.php
index 8db1e092..0e985311 100644
--- a/languages/messages/MessagesKk_arab.php
+++ b/languages/messages/MessagesKk_arab.php
@@ -420,9 +420,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'ە-پوشتامنىڭ مەكەنجايىن ەسكەرتۋ حاتتاردا اش',
 'tog-shownumberswatching' => 'باقىلاپ تۇرعان قاتىسۋشىلاردىڭ سانىن كورسەت',
 'tog-fancysig' => 'قام قولتاڭبا (وزدىكتىك سىلتەمەسىز)',
-'tog-externaleditor' => 'شەتتىك وڭدەۋىشتى ادەپكىدەن قولدان (تەك ساراپشىلار ٴۇشىن, كومپيۋتەرىڭىزدە ارناۋلى باپتالىمدار كەرەك)',
-'tog-externaldiff' => 'شەتتىك ايىرماعىشتى ادەپكىدەن قولدان (تەك ساراپشىلار ٴۇشىن, كومپيۋتەرىڭىزدە ارناۋلى باپتالىمدار كەرەك)',
-'tog-showjumplinks' => '«ٴوتىپ كەتۋ» قاتىناۋ سىلتەمەلەرىن قوس',
 'tog-uselivepreview' => 'تۋرا قاراپ شىعۋدى قولدانۋ (JavaScript) (سىناقتاما)',
 'tog-forceeditsummary' => 'وڭدەمەنىڭ قىسقاشا مازمۇنداماسى بوس قالعاندا ماعان ەسكەرت',
 'tog-watchlisthideown' => 'وڭدەمەلەرىمدى باقىلاۋ تىزىمنەن جاسىر',
@@ -579,7 +576,7 @@ $messages = array(
 'jumptonavigation' => 'باعىتتاۋ',
 'jumptosearch' => 'ىزدەۋ',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} تۋرالى',
 'aboutpage' => 'Project:جوبا تۋرالى',
 'copyright' => 'ماعلۇمات $1 شارتىمەن جەتىمدى.',
@@ -589,7 +586,6 @@ $messages = array(
 'disclaimers' => 'جاۋاپكەرشىلىكتەن باس تارتۋ',
 'disclaimerpage' => 'Project:جاۋاپكەرشىلىكتەن باس تارتۋ',
 'edithelp' => 'وندەۋ انىقتاماسى',
-'edithelppage' => 'Help:وڭدەۋ',
 'helppage' => 'Help:مازمۇنى',
 'mainpage' => 'باستى بەت',
 'mainpage-description' => 'باستى بەت',
@@ -655,17 +651,6 @@ $messages = array(
 # General errors
 'error' => 'قاتە',
 'databaseerror' => 'دەرەكقور قاتەسى',
-'dberrortext' => 'دەرەكقور سۇرانىمىندا سويلەم جۇيەسىنىڭ قاتەسى بولدى.
-بۇل باعدارلامالىق جاساقتاما قاتەسىن بەلگىلەۋى مۇمكىن.
-سوڭعى بولعان دەرەكقور سۇرانىمى:
-<blockquote><tt>$1</tt></blockquote>
-مىنا جەتەدەن «<tt>$2</tt>».
-MySQL قايتارعان قاتەسى «<tt>$3: $4</tt>».',
-'dberrortextcl' => 'دەرەكقور سۇرانىمىندا سويلەم جۇيەسىنىڭ قاتەسى بولدى.
-سوڭعى بولعان دەرەكقور سۇرانىمى:
-«$1»
-مىنا جەتەدەن: «$2».
-MySQL قايتارعان قاتەسى «$3: $4»',
 'laggedslavemode' => 'قۇلاقتاندىرۋ: بەتتە جۋىقتاعى جاڭالاۋلار بولماۋى مۇمكىن.',
 'readonly' => 'دەرەكقورى قۇلىپتالعان',
 'enterlockreason' => 'قۇلىپتاۋ سەبەبىن, قاي ۋاقىتقا دەيىن قۇلىپتالعانىن كىرىستىرىپ, ەنگىزىڭىز',
@@ -713,7 +698,6 @@ MySQL قايتارعان قاتەسى «$3: $4»',
 'editinginterface' => "'''قۇلاقتاندىرۋ:''' باعدارلامالىق جاساقتامانىڭ تىلدەسۋ ٴماتىنىن جەتىستىرەتىن بەتىن وڭدەپ جاتىرسىز.
 بۇل بەتتىڭ وزگەرتۋى باسقا قاتىسۋشىلارعا پايدالانۋشىلىق تىلدەسۋى قالاي كورىنەتىنە اسەر ەتەدى.
 اۋدارمالار ٴۇشىن, MediaWiki باعدارلاماسىن جەرسىندىرۋ [//translatewiki.net/wiki/Main_Page?setlang=kk translatewiki.net جوباسى] ارقىلى قاراپ شەشىڭىز.",
-'sqlhidden' => '(SQL سۇرانىمى جاسىرىلعان)',
 'cascadeprotected' => 'بۇل بەت وڭدەۋدەن قورعالعان, سەبەبى بۇل كەلەسى «باۋلى قورعاۋى» قوسىلعان {{PLURAL:$1|بەتتىڭ|بەتتەردىڭ}} كىرىكبەتى:
 $2',
 'namespaceprotected' => "'''$1''' ەسىم اياسىنداعى بەتتەردى وڭدەۋ ٴۇشىن رۇقساتىڭىز جوق.",
@@ -812,7 +796,7 @@ $2',
 'newpassword' => 'جاڭا قۇپىييا ٴسوزىڭىز:',
 'retypenew' => 'جاڭا قۇپىييا ٴسوزىڭىزدى قايتالاڭىز:',
 'resetpass_submit' => 'قۇپىييا ٴسوزدى قويىڭىز دا كىرىڭىز',
-'resetpass_success' => 'قۇپىييا ٴسوزىڭىز ٴساتتى وزگەرتىلدى! ەندى كىرىڭىز…',
+'changepassword-success' => 'قۇپىييا ٴسوزىڭىز ٴساتتى وزگەرتىلدى! ەندى كىرىڭىز…',
 'resetpass_forbidden' => '{{SITENAME}} جوباسىندا قۇپىييا سوزدەر وزگەرتىلمەيدى',
 
 # Edit page toolbar
@@ -1114,7 +1098,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
 'prevn' => 'الدىڭعى {{PLURAL:$1|$1}}',
 'nextn' => 'كەلەسى {{PLURAL:$1|$1}}',
 'viewprevnext' => 'كورسەتىلۋى: ($1 {{int:pipe-separator}} $2) ($3) جازبا',
-'searchhelp-url' => 'Help:مازمۇنى',
 'search-result-size' => '$1 ($2 ٴسوز)',
 'search-result-score' => 'اراقاتىناستىلىعى: $1 %',
 'search-redirect' => '(ايداعىش $1)',
@@ -1140,14 +1123,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
 ازىرشە Google ارقىلى ىزدەۋگە بولادى.
 اڭعارتپا: {{SITENAME}} تورابىنىڭ ماعلۇمات تىزبەلەرى ەسكىرگەن بولۋى مۇمكىن.',
 
-# Quickbar
-'qbsettings' => 'ٴمازىر',
-'qbsettings-none' => 'ەشقانداي',
-'qbsettings-fixedleft' => 'سولعا بەكىتىلگەن',
-'qbsettings-fixedright' => 'وڭعا بەكىتىلگەن',
-'qbsettings-floatingleft' => 'سولعا قالقىعان',
-'qbsettings-floatingright' => 'وڭعا قالقىعان',
-
 # Preferences page
 'preferences' => 'باپتالىمدار',
 'mypreferences' => 'باپتالىمدارىم',
@@ -1343,7 +1318,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
 'recentchangeslinked-feed' => 'قاتىستى وزگەرىستەر',
 'recentchangeslinked-toolbox' => 'قاتىستى وزگەرىستەر',
 'recentchangeslinked-title' => '«$1» دەگەنگە قاتىستى وزگەرىستەر',
-'recentchangeslinked-noresult' => 'سىلتەلگەن بەتتەردە كەلتىرىلگەن مەرزىمدە ەشقانداي وزگەرىس بولماعان.',
 'recentchangeslinked-summary' => "بۇل تىزىمدە وزىندىك بەتتەن سىلتەلگەن بەتتەردەگى (نە وزىندىك سانات مۇشەلەرىندەگى) ىستەلگەن جۋىقتاعى وزگەرىستەر بەرىلەدى.
 [[Special:Watchlist|باقىلاۋ تىزىمىڭىزدەگى]] بەتتەر '''جۋان''' بولىپ بەلگىلەنەدى.",
 'recentchangeslinked-page' => 'بەت اتاۋى:',
@@ -1550,12 +1524,6 @@ URL دۇرىس ەكەندىگىن جانە توراپ ىستەپ تۇرعانى
 'statistics-header-users' => 'قاتىسۋشى ساناعى',
 'statistics-mostpopular' => 'ەڭ كوپ قارالعان بەتتەر',
 
-'disambiguations' => 'ايرىقتى بەتتەر',
-'disambiguationspage' => '{{ns:template}}:ايرىق',
-'disambiguations-text' => "كەلەسى بەتتەر '''ايرىقتى بەتكە''' سىلتەيدى.
-بۇنىڭ ورنىنا بەلگىلى تاقىرىپقا سىلتەۋى كەرەك.<br />
-ەگەر [[MediaWiki:Disambiguationspage]] تىزىمىندەگى ۇلگى قولدانىلسا, بەت ايرىقتى دەپ سانالادى.",
-
 'doubleredirects' => 'شىنجىرلى ايداعىشتار',
 'doubleredirectstext' => 'بۇل بەتتە باسقا ايداتۋ بەتتەرگە سىلتەيتىن بەتتەر تىزىمدەلىنەدى. ٴاربىر جولاقتا ٴبىرىنشى جانە ەكىنشى ايداعىشقا سىلتەمەلەر بار, سونىمەن بىرگە ەكىنشى ايداعىش نىساناسى بار, ادەتتە بۇل ٴبىرىنشى ايداعىش باعىتتايتىن «ناقتى» نىسانا بەت اتاۋى بولۋى كەرەك.',
 
@@ -1730,10 +1698,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatchthispage' => 'باقىلاۋدى توقتاتۋ',
 'notanarticle' => 'ماعلۇمات بەتى ەمەس',
 'notvisiblerev' => 'تۇزەتۋ جويىلدى',
-'watchnochange' => 'كورسەتىلگەن مەرزىمدە ەش باقىلانعان دانا وڭدەلگەن جوق.',
 'watchlist-details' => 'تالقىلاۋ بەتتەرىن ساناماعاندا $1 بەت باقلانىلادى.',
-'wlheader-enotif' => '* ەسكەرتۋ حات جىبەرۋى قوسىلعان.',
-'wlheader-showupdated' => "* سوڭعى كەلىپ-كەتۋىڭىزدەن بەرى وزگەرتىلگەن بەتتەردى '''جۋان''' قارىپىمەن كورسەت",
+'wlheader-enotif' => 'ەسكەرتۋ حات جىبەرۋى قوسىلعان.',
+'wlheader-showupdated' => "سوڭعى كەلىپ-كەتۋىڭىزدەن بەرى وزگەرتىلگەن بەتتەردى '''جۋان''' قارىپىمەن كورسەت",
 'watchmethod-recent' => 'باقىلاۋلى بەتتەر ٴۇشىن جۋىقتاعى وزگەرىستەردى تەكسەرۋ',
 'watchmethod-list' => 'جۋىقتاعى وزگەرىستەر ٴۇشىن باقىلاۋلى بەتتەردى تەكسەرۋ',
 'watchlistcontains' => 'باقىلاۋ تىزىمىڭىزدە $1 بەت بار.',
@@ -2048,12 +2015,9 @@ $1 بۇعاتتاۋى ٴۇشىن كەلتىرىلگەن سەبەبى: «$2».',
 'ipb_blocked_as_range' => 'قاتەلىك: IP $1 تىكەلەي بۇعاتتالماعان جانە بۇعاتتاۋى وشىرىلمەيدى.
 بىراق, بۇل بۇعاتتاۋى ٴوشىرىلۋى مۇمكىن $2 اۋقىمى بولىگى بوپ بۇعاتتالعان.',
 'ip_range_invalid' => 'IP مەكەنجاي اۋقىمى جارامسىز.',
-'blockme' => 'وزدىكتىك_بۇعاتتاۋ',
 'proxyblocker' => 'پروكسىي سەرۆەرلەردى بۇعاتتاۋىش',
-'proxyblocker-disabled' => 'بۇل جەتە وشىرىلگەن.',
 'proxyblockreason' => 'IP مەكەنجايىڭىز اشىق پروكسىي سەرۆەرگە جاتاتىندىقتان بۇعاتتالعان.
 ىينتەرنەت قىزمەتىن جابدىقتاۋشىڭىزبەن, نە تەحنىيكالىق قولداۋ قىزمەتىمەن قاتىناسىڭىز, جانە ولارعا وسى وتە كۇردەلى قاۋىپسىزدىك شاتاق تۋرالى اقپارات بەرىڭىز.',
-'proxyblocksuccess' => 'ٴبىتتى.',
 'sorbsreason' => 'IP مەكەنجايىڭىز {{SITENAME}} تورابىندا قولدانىلعان DNSBL قارا تىزىمىندەگى اشىق پروكسىي-سەرۆەر دەپ تابىلادى.',
 'sorbs_create_account_reason' => 'IP مەكەنجايىڭىز {{SITENAME}} تورابىندا قولدانىلعان DNSBL قارا تىزىمىندەگى اشىق پروكسىي-سەرۆەر دەپ تابىلادى.
 جاڭا تىركەلگى جاساي المايسىز.',
@@ -2272,24 +2236,14 @@ MediaWiki جۇيەسىنىڭ [[{{#special:Import}}|سىرتتان الۋ بەت
 
 # Stylesheets
 'common.css' => '/* مىندا ورنالاستىرىلعان CSS بارلىق مانەرلەردە قولدانىلادى */',
-'standard.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «داعدىلى» (standard) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
-'nostalgia.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «اڭساۋ» (nostalgia) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
 'cologneblue.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «كولن زەڭگىرلىگى» (cologneblue) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى skin */',
 'monobook.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «دارا كىتاپ» (monobook) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
-'myskin.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «ٴوز مانەرىم» (myskin) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
-'chick.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «بالاپان» (chick) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
-'simple.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «كادىمگى» (simple) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
 'modern.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «زاماناۋىي» (modern) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
 
 # Scripts
 'common.js' => '/* مىنداعى ٴارتۇرلى JavaScript كەز كەلگەن بەت قوتارىلعاندا بارلىق پايدالانۋشىلار ٴۇشىن جەگىلەدى. */',
-'standard.js' => '/* مىنداعى JavaScript تەك «داعدىلى» (standard) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
-'nostalgia.js' => '/* مىنداعى JavaScript تەك «اڭساۋ» (nostalgia) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى*/',
 'cologneblue.js' => '/* مىنداعى JavaScript تەك «كولن زەڭگىرلىگى» (cologneblue) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
 'monobook.js' => '/* مىنداعى JavaScript تەك «دارا كىتاپ» (monobook) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
-'myskin.js' => '/* مىنداعى JavaScript تەك «ٴوز مانەرىم» (myskin) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
-'chick.js' => '/* مىنداعى JavaScript تەك «بالاپان» (chick) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
-'simple.js' => '/* مىنداعى JavaScript تەك «كادىمگى» (simple) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
 'modern.js' => '/* مىنداعى JavaScript تەك «زاماناۋىي» (modern) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
 
 # Metadata
@@ -2315,13 +2269,8 @@ MediaWiki جۇيەسىنىڭ [[{{#special:Import}}|سىرتتان الۋ بەت
 'spam_blanking' => '$1 دەگەنگە سىلتەمەلەرى بار بارلىق تۇزەتۋلەر تازارتىلدى',
 
 # Skin names
-'skinname-standard' => 'داعدىلى (standard)',
-'skinname-nostalgia' => 'اڭساۋ (nostalgia)',
 'skinname-cologneblue' => 'كولن زەڭگىرلىگى (cologneblue)',
 'skinname-monobook' => 'دارا كىتاپ (monobook)',
-'skinname-myskin' => 'ٴوز مانەرىم (myskin)',
-'skinname-chick' => 'بالاپان (chick)',
-'skinname-simple' => 'كادىمگى (simple)',
 'skinname-modern' => 'زاماناۋىي (modern)',
 
 # Patrolling
@@ -2410,7 +2359,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ەنى',
 'exif-imagelength' => 'بىيىكتىگى',
 'exif-bitspersample' => 'قۇراش سايىن بىيت سانى',
@@ -2524,7 +2473,7 @@ $1',
 'exif-gpsdatestamp' => 'GPS كۇن-ايى',
 'exif-gpsdifferential' => 'GPS سارالانعان دۇرىستاۋ',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ۇلعايتىلعان',
 
 'exif-unknowndate' => 'بەلگىسىز كۇن-ايى',
@@ -2847,7 +2796,6 @@ $5
 'version-other' => 'تاعى باسقالار',
 'version-mediahandlers' => 'تاسپا وڭدەتكىشتەرى',
 'version-hooks' => 'جەتە تۇزاقتارى',
-'version-extension-functions' => 'كەڭەيتىمدەر جەتەلەرى',
 'version-parser-extensiontags' => 'قۇرىلىمدىق تالداتقىش كەڭەيتىمدەرىنىڭ بەلگىلەمەرى',
 'version-parser-function-hooks' => 'قۇرىلىمدىق تالداتقىش جەتەلەرىنىڭ تۇزاقتارى',
 'version-hook-name' => 'تۇزاق اتاۋى',
@@ -2858,13 +2806,6 @@ $5
 'version-software-product' => 'ٴونىم',
 'version-software-version' => 'نۇسقاسى',
 
-# Special:FilePath
-'filepath' => 'فايل ورنالاسۋى',
-'filepath-page' => 'فايل اتى:',
-'filepath-submit' => 'ورنالاسۋىن تاپ',
-'filepath-summary' => 'بۇل ارنايى بەت فايل ورنالاسۋى تولىق جولىن قايتارادى.
-سۋرەتتەر تولىق اجىراتىلىمدىعىمەن كورسەتىلەدى, باسقا فايل تۇرلەرىنە قاتىستى باعدارلاماسى تۋرا جەگىلەدى.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'فايل تەلنۇسقالارىن ىزدەۋ',
 'fileduplicatesearch-summary' => 'فايل حەشى ماعىناسى نەگىزىندە تەلنۇسقالارىن ىزدەۋ.',
diff --git a/languages/messages/MessagesKk_cyrl.php b/languages/messages/MessagesKk_cyrl.php
index cd131d84..81639140 100644
--- a/languages/messages/MessagesKk_cyrl.php
+++ b/languages/messages/MessagesKk_cyrl.php
@@ -14,6 +14,7 @@
  * @author Daniyar
  * @author GaiJin
  * @author Kaztrans
+ * @author Nemo bis
  * @author Urhixidur
  */
 
@@ -390,9 +391,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Бақылап тұрған қатысушылардың санын көрсет',
 'tog-oldsig' => 'Ағымдағы қолтаңбаңыз:',
 'tog-fancysig' => 'Қолтаңбаны уикимәтін ретінде қарастыру (автоматты сілтеме қойылмайды)',
-'tog-externaleditor' => 'Шеттік өңдеуішті әдепкіден қолдан (тек сарапшылар үшін, компьютеріңізде арнаулы бапталымдар керек)',
-'tog-externaldiff' => 'Шеттік айырмағышты әдепкіден қолдан (тек сарапшылар үшін, компьютеріңізде арнаулы бапталымдар керек)',
-'tog-showjumplinks' => '«Өтіп кету» қатынау сілтемелерін қос',
 'tog-uselivepreview' => 'Тура қарап шығуды қолдану (JavaScript) (Сынақтама)',
 'tog-forceeditsummary' => 'Өңдеменің қысқаша мазмұндамасы бос қалғанда маған ескерт',
 'tog-watchlisthideown' => 'Өңдемелерімді бақылау тізімінен жасыр',
@@ -406,6 +404,7 @@ $messages = array(
 'tog-showhiddencats' => 'Жасырын санаттарды көрсету',
 'tog-noconvertlink' => 'Сілтеме атауларын ауыстырма',
 'tog-norollbackdiff' => 'Шегіндіруден кейін нұсқалардың айырмашылығын көрсетпеу',
+'tog-useeditwarning' => 'Өңдемесі сақталмаған парақшадан шығар кезде ескерту',
 
 'underline-always' => 'Әрқашан',
 'underline-never' => 'Ешқашан',
@@ -469,6 +468,18 @@ $messages = array(
 'oct' => 'қаз',
 'nov' => 'қар',
 'dec' => 'жел',
+'january-date' => 'Қаңтар $1',
+'february-date' => 'Ақпан $1',
+'march-date' => 'Наурыз $1',
+'april-date' => 'Сәуір $1',
+'may-date' => 'Мамыр $1',
+'june-date' => 'Маусым $1',
+'july-date' => 'Шілде $1',
+'august-date' => 'Тамыз $1',
+'september-date' => 'Қыркүйек $1',
+'october-date' => 'Қазан $1',
+'november-date' => 'Қараша $1',
+'december-date' => 'Желтоқсан $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Санат|Санат}}',
@@ -550,6 +561,7 @@ $messages = array(
 'create-this-page' => 'Осы бетті бастау',
 'delete' => 'Жою',
 'deletethispage' => 'Бұл бетті жою',
+'undeletethispage' => 'Жойылған бетті қайтару',
 'undelete_short' => '{{PLURAL:$1|өңдеме|$1 өңдеме}} жоюын болдырмау',
 'viewdeleted_short' => '{{PLURAL:$1|жойылған өңдеуді|$1 жойылған өңдеулерді }} көру',
 'protect' => 'Қорғау',
@@ -593,7 +605,7 @@ $1',
 'pool-queuefull' => 'Сұранымдар жинақтауышысы толық',
 'pool-errorunknown' => 'Белгісіз қате',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} туралы',
 'aboutpage' => 'Project:Жоба туралы',
 'copyright' => 'Мәлімет $1 шартымен жетімді.',
@@ -603,7 +615,6 @@ $1',
 'disclaimers' => 'Жауапкершіліктен бас тарту',
 'disclaimerpage' => 'Project:Жауапкершіліктен бас тарту',
 'edithelp' => 'Өндеу анықтамасы',
-'edithelppage' => 'Help:Өңдеу',
 'helppage' => 'Help:Мазмұны',
 'mainpage' => 'Басты бет',
 'mainpage-description' => 'Басты бет',
@@ -681,16 +692,8 @@ $1',
 # General errors
 'error' => 'Қате',
 'databaseerror' => 'Дерекқор қатесі',
-'dberrortext' => 'Дерекқорға жасалған сұраныста синтаксистік қате табылды.
-Бұл бағдарламада қате бар екенін көрсетуі мүмкін.
-Дерекқорға түскен соңғы сұраным:
- «<tt>$2</tt>» фунциясынан <blockquote><tt>$1</tt></blockquote> шыққан.
-Дерекқор  «<tt>$3: $4</tt>» қателігін қайтарды.',
-'dberrortextcl' => 'Дерекқорға жасалған сұранымда синтаксистік қате табылды.
-Дерекқорға түскен соңғы сұраным:
-«$1»
-мына «$2» функциясынан болды .
-Дерекқор "$3: $4" қатесін қайтарды.',
+'databaseerror-query' => 'Сұрау:$1',
+'databaseerror-error' => 'Қате:$1',
 'laggedslavemode' => "'''Ескерту:''' Бетте жуықтағы жаңартулар болмауы мүмкін.",
 'readonly' => 'Дерекқоры құлыпталған',
 'enterlockreason' => 'Құлыптау себебін, қай уақытқа дейін құлыпталғанын кірістіріп, енгізіңіз.',
@@ -746,12 +749,15 @@ $1',
 'editinginterface' => "'''Ескерту:''' Бағдарламалық жасақтаманың тілдесу мәтінін жетістіретін бетін өңдеп жатырсыз.
 Бұл беттің өзгертуі басқа қатысушыларға пайдаланушылық тілдесуі қалай көрінетіне әсер етеді.
 Барлық уикилер үшін аудармаларды өзгерту немесе қосу үшін [//translatewiki.net/ translatewiki.net] МедиаУики жерлестіру жобасын пайдаланыңыз.",
-'sqlhidden' => '(SQL сұранымы жасырылған)',
 'cascadeprotected' => 'Бұл бет өңдеуден қорғалған, себебі бұл келесі «баулы қорғауы» қосылған {{PLURAL:$1|беттің|беттердің}} кірікбеті:
 $2',
 'namespaceprotected' => "'''$1''' есім аясындағы беттерді өңдеу үшін рұқсатыңыз жоқ.",
 'customcssprotected' => 'Сіздің бұл CSS-бетті өңдеуге рұқсатыңыз жоқ, себебі мұнда өзге қатысушының жеке баптаулары бар.',
 'customjsprotected' => 'Сіздің бұл JavaScript бетін өңдеуге рұқсатыңыз жоқ, себебі мұнда өзге қатысушының жеке баптаулары бар.',
+'mycustomcssprotected' => 'Сізде CSS бетін өңдеуге рұқсатыңыз жоқ.',
+'mycustomjsprotected' => 'Сізде JavaScript бетін өңдеуге рұқсатыңыз жоқ.',
+'myprivateinfoprotected' => 'Сізде жеке ақпараттарыңызды өңдеу рұқсатыңыз жоқ.',
+'mypreferencesprotected' => 'Сізде баптауларыңызды өңдеуге рұқсатыңыз жоқ.',
 'ns-specialprotected' => '{{ns:special}} есім аясындағы беттер өңдеуге келмейді.',
 'titleprotected' => "Бұл тақырып аты бастаудан [[User:$1|$1]] қорғады.
 Келтірілген себебі: ''$2''.",
@@ -776,10 +782,19 @@ $2',
 'welcomecreation-msg' => 'Сіздің тіркеліміңіз жасалынды.
 [[Special:Preferences|{{SITENAME}} баптауларыңызды]] өзгертуді ұмытпаңыз.',
 'yourname' => 'Қатысушы аты:',
+'userlogin-yourname' => 'Қатысушы есіміңіз',
+'userlogin-yourname-ph' => 'Қатысушы есіміңізді енгізіңіз',
+'createacct-another-username-ph' => 'Қатысушы есіміңізді енгізіңіз',
 'yourpassword' => 'Құпия сөз:',
+'userlogin-yourpassword' => 'Құпия сөз',
+'userlogin-yourpassword-ph' => 'Құпия сөздіңізді енгізіңіз',
+'createacct-yourpassword-ph' => 'Құпия сөзді енгізу',
 'yourpasswordagain' => 'Құпия сөзді қайталаңыз:',
+'createacct-yourpasswordagain' => 'Құпия сөзді құптаңыз',
+'createacct-yourpasswordagain-ph' => 'Құпия сөзіңізді қайтадан енгізіңіз',
 'remembermypassword' => 'Тіркелгімді осы браузерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})',
-'securelogin-stick-https' => 'Кіргеннен кейін HTTPS бойынша байланысты жалғастыру',
+'userlogin-remembermypassword' => 'Мені жүйеде сақтап қою',
+'userlogin-signwithsecure' => 'Құпия байланысуды қолдану',
 'yourdomainname' => 'Желі үйшігіңіз:',
 'password-change-forbidden' => 'Сіз бұл уикиде құпия сөзіңізді өзгерте алмайсыз.',
 'externaldberror' => 'Осы арада не шеттік растау дерекқорында қате болды, немесе шеттік тіркелгіңізді жаңалау рұқсаты жоқ.',
@@ -791,18 +806,41 @@ $2',
 'logout' => 'Шығу',
 'userlogout' => 'Шығу',
 'notloggedin' => 'Кірмегенсіз',
+'userlogin-noaccount' => 'Тіркелгіңіз жоқ па?',
+'userlogin-joinproject' => '{{SITENAME}} жобасына тіркелу',
 'nologin' => 'Тіркелгіңіз бар ма? $1.',
 'nologinlink' => 'Тіркелгіңізді жасаңыз',
 'createaccount' => 'Жаңа тіркелгі',
 'gotaccount' => "Бұған дейін тіркеліп пе едіңіз? '''$1'''.",
 'gotaccountlink' => 'Кіріңіз',
 'userlogin-resetlink' => 'Қатысушы атын не құпия сөзді ұмыттыңыз ба?',
+'userlogin-resetpassword-link' => 'Құпия сөздіңізді ысыру',
+'helplogin-url' => 'Help:Тіркелу',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Тіркелуге көмек]]',
+'createacct-join' => 'Төменге өзіңіз туралы ақпарат енгізіңіз.',
+'createacct-another-join' => 'Төменге жаңа тіркелгі туралы ақпарат енгізіңіз.',
+'createacct-emailrequired' => 'Е-пошта мекен-жайы:',
+'createacct-emailoptional' => 'Е-поштаның мекен-жайы (міндетті емес)',
+'createacct-email-ph' => 'Е-пошта мекен-жайыңызды енгізіңіз',
+'createacct-another-email-ph' => 'Е-пошта мекен-жайын енгізіңіз',
 'createaccountmail' => 'Уақытша берілген кілтсөзді пайдаланыңыз және оны көрсетілген электрондық поштаға жіберіңіз',
+'createacct-realname' => 'Нақты атыңыз (ерікті)',
 'createaccountreason' => 'Себебі:',
+'createacct-reason' => 'Себебі:',
+'createacct-reason-ph' => 'Неге басқа тіркегі жасамақшысыз',
+'createacct-captcha' => 'Құпиялық тексеруі',
+'createacct-imgcaptcha-ph' => 'Жоғарғыдағы көріп тұрған мәтінді енгізіңіз',
+'createacct-submit' => 'Тіркелгіңізді жасаңыз',
+'createacct-another-submit' => 'Басқа тіркелгі жасау',
+'createacct-benefit-heading' => '{{SITENAME}} сіз сияқты қызығатын адамдар арқылы жасалады.',
+'createacct-benefit-body1' => '{{PLURAL:$1|өңдеме|өңдеме}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|бет|бет}}',
+'createacct-benefit-body3' => 'жуықтағы {{PLURAL:$1|қатысушы|қатысушы}}',
 'badretype' => 'Енгізген құпия сөздеріңіз бір-біріне сәйкес емес.',
 'userexists' => 'Енгізген қатысушы атыңыз әлдеқашан пайдалануда.
 Өзге атауды таңдаңыз.',
 'loginerror' => 'Кіру қатесі',
+'createacct-error' => 'Тіркелгі жасауада қате кетті',
 'createaccounterror' => 'Тіркелгіні жасау мүмкін емес: $1',
 'nocookiesnew' => 'Жаңа қатысушы тіркелгісі жасалды, бірақ кірмегенсіз.
 Қатысушы кіру үшін {{SITENAME}} торабында «cookie» файлдары қолданылады.
@@ -863,7 +901,7 @@ $2',
 
 Егер бұл тіркелгі қателікпен жасалса, осы хабарға елемеуіңіз мүмкін.',
 'usernamehasherror' => 'Қатысушы есіміне тор белгі нышаны енгізілмейді.',
-'login-throttled' => 'Сіз жүйеге кіру үшін тым көп талпыныс жасадыңыз. Өтінемін, қайта кірмес бұрын кішкене күте тұрыңыз.',
+'login-throttled' => 'Сіз жүйеге кіру үшін тым көп талпыныс жасадыңыз. Өтінемін, қайта кірмес бұрын $1 күте тұрыңыз.',
 'login-abort-generic' => 'Жүйеге кіру үшін сәтсіз талпыныс жасадыңыз.',
 'loginlanguagelabel' => 'Тіл: $1',
 'suspicious-userlogout' => 'Сіздің жүйеден шығу сұранымыңыз қабылданбады, өйткені, бұл жарамсыз браузер немесе кэштеуші проксидің сұранымына ұқсайды.',
@@ -881,7 +919,7 @@ $2',
 'newpassword' => 'Жаңа құпия сөзіңіз:',
 'retypenew' => 'Жаңа құпия сөзіңізді қайталаңыз:',
 'resetpass_submit' => 'Құпия сөзді қойыңыз да кіріңіз',
-'resetpass_success' => 'Құпия сөзіңіз сәтті өзгертілді! Енді кіріңіз…',
+'changepassword-success' => 'Құпия сөзіңіз сәтті өзгертілді!',
 'resetpass_forbidden' => 'Құпия сөз өзгертілмейді',
 'resetpass-no-info' => 'Бұл бетке тікелей ену үшін, жүйеге кіруіңіз керек.',
 'resetpass-submit-loggedin' => 'Құпия сөзді өзгерту',
@@ -893,10 +931,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Құпия сөзді қайтару',
-'passwordreset-text' => 'Сіздің тіркелгіңіздің баптаулары туралы хабарламаларды алу үшін мына пішінді толтырыңыз.',
+'passwordreset-text-one' => 'Құпия сөзіңізді түзеу үшін бұл пішінді толтырыңыз.',
+'passwordreset-text-many' => '{{PLURAL:$1|Құпия сөзді қайтару үшін жолақтарды толтырыңыз.}}',
 'passwordreset-legend' => 'Құпия сөзді қайтару',
 'passwordreset-disabled' => 'Бұл уикиде құпия сөзді қайтару ажыратылған.',
-'passwordreset-pretext' => '{{PLURAL:$1||Төменде көрсетілгендердің ішіндегі біреуін жазыңыз}}',
+'passwordreset-emaildisabled' => 'E-mail мүмкіндігі бұл уикиде өшірілген.',
 'passwordreset-username' => 'Қатысушы аты:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Келген хатты қарау керек пе?',
@@ -1105,10 +1144,13 @@ IP-мекенжайыңыз бұл беттің түзету тарихында
 'edit-gone-missing' => 'Бетті жаңарту мүмкін емес.
 Мүмкін, бұл бет жойылған.',
 'edit-conflict' => 'Өңдемелер қақтығысы.',
+'postedit-confirmation' => 'Сіздің өңдемеңіз сақталды.',
 'edit-already-exists' => 'Жаңа бет жасау мүмкін емес.
 Ол әлдеқашан бар.',
 'defaultmessagetext' => 'Әдепкі мәтіні',
 'invalid-content-data' => 'Жарамсыз дерек мазмұны',
+'editwarning-warning' => 'Басқа бетке өтсеңіз сіздің жазған соңғы өңдемелеріңіз жойылуы мүмкін. 
+Егер сiз жүйеде тiркелсеңiз, онда сiз баптауларыңыздағы «{{int:prefs-editing}}» бөлігіне кіріп, бұл ескертуді өшіре аласыз.',
 
 # Content models
 'content-model-wikitext' => 'Уикимәтін',
@@ -1271,6 +1313,7 @@ $1",
 'compareselectedversions' => 'Таңдалған нұсқаларды салыстыру',
 'showhideselectedversions' => 'Бөлектенген нұсқаларды көрсет/жасыр',
 'editundo' => 'жоққа шығару',
+'diff-empty' => '(айырмашылығы жоқ)',
 'diff-multi' => '($2 қатысушының арадағы $1 түзетуі көрсетілмеген)',
 
 # Search results
@@ -1293,7 +1336,6 @@ $1",
 'searchmenu-legend' => 'Іздеу бапталымдары',
 'searchmenu-exists' => "'''Бұл жобада «[[:$1]]» деген бет бар.'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" осындай атпен бетті бастау'''",
-'searchhelp-url' => 'Help:Мазмұны',
 'searchprofile-articles' => 'Негізгі беттер',
 'searchprofile-project' => 'Анықтама және жоба беттері',
 'searchprofile-images' => 'Мультимедиа',
@@ -1336,14 +1378,6 @@ $1",
 Әзірше Google арқылы іздеуге болады.
 Аңғартпа: {{SITENAME}} торабының мағлұмат тізбелері ескірген болуы мүмкін.',
 
-# Quickbar
-'qbsettings' => 'Мәзір',
-'qbsettings-none' => 'Ешқандай',
-'qbsettings-fixedleft' => 'Солға бекітілген',
-'qbsettings-fixedright' => 'Оңға бекітілген',
-'qbsettings-floatingleft' => 'Солға қалқыған',
-'qbsettings-floatingright' => 'Оңға қалқыған',
-
 # Preferences page
 'preferences' => 'Баптаулар',
 'mypreferences' => 'Баптаулар',
@@ -1376,7 +1410,6 @@ $1",
 'resetprefs' => 'Сақталмаған өзгерістерді тазарту',
 'restoreprefs' => 'Барлығын бастапқы баптауларға қайтару',
 'prefs-editing' => 'Өңдеу',
-'prefs-edit-boxsize' => 'Өңдеу терезесінің өлшемі.',
 'rows' => 'Жолдар:',
 'columns' => 'Бағандар:',
 'searchresultshead' => 'Іздеу',
@@ -1445,6 +1478,8 @@ $1",
 'prefs-dateformat' => 'Уақыт пішіні',
 'prefs-timeoffset' => 'Уақыт ығысуы',
 'prefs-advancedediting' => 'Негізгі параметрлер',
+'prefs-editor' => 'Өңдеуші',
+'prefs-preview' => 'Қарап шығу',
 'prefs-advancedrc' => 'Кеңейтілген баптаулар',
 'prefs-advancedrendering' => 'Кеңейтілген баптаулар',
 'prefs-advancedsearchoptions' => 'Кеңейтілген баптаулар',
@@ -1477,6 +1512,8 @@ $1",
 'userrights-notallowed' => 'Сізге қатысушы құқықтарын қосуға немесе алып тастауға рұқсат берілмеген.',
 'userrights-changeable-col' => 'Өзгерте алатын топтар',
 'userrights-unchangeable-col' => 'Өзгерте алмайтын топтар',
+'userrights-conflict' => 'Қатысушы құқықтарының қақтығысы! Өзгертулеріңізді қайта қарап шығыңыз және құптаңыз.',
+'userrights-removed-self' => 'Өзіңіздің құқықтарыңызды сәтті алып тастадыңыз.  As such, you are no longer able to access this page.',
 
 # Groups
 'group' => 'Топ:',
@@ -1542,11 +1579,19 @@ $1",
 'right-proxyunbannable' => 'Прокси серверлердің өзбұғаттауларын орағыту',
 'right-unblockself' => 'Бұғаттаудан шығару',
 'right-protect' => 'Қорғау деңгейлерін өзгерту және баулы-қорғаулы беттерді өңдеу',
-'right-editprotected' => 'Қорғалған беттерді өңдеу (баулы қорғауларсыз)',
+'right-editprotected' => 'Қорғалған беттерді өңдеу "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Қорғалған беттерді өңдеу "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Қатысушы тілдесіуін өңдеу',
 'right-editusercssjs' => 'Басқа қатысушылардың CSS және JS файлдарын өңдеу',
 'right-editusercss' => 'Басқа қатысушылардың CSS файлдарын өңдеу',
 'right-edituserjs' => 'Басқа қатысушылардың JavaScript файлдарын өңдеу',
+'right-editmyusercss' => 'Өзіңіздің қатысушы CSS файлдарыңызды өңдеу',
+'right-editmyuserjs' => 'Өзіңіздің қатысушы JavaScript файлдарыңызды өңдеу',
+'right-viewmywatchlist' => 'Бақылау тізіміңізді қарау',
+'right-editmywatchlist' => 'Өзіңіздің баптауларыңызды өңдеу. Note some actions will still add pages even without this right.',
+'right-viewmyprivateinfo' => 'Өзіңіздің жеке деректеріңізді қарау (e.g. email мекен-жай, нақты есім)',
+'right-editmyprivateinfo' => 'Өзіңіздің жеке деректеріңізді өңдеу (e.g. email мекен-жай, нақты есім)',
+'right-editmyoptions' => 'Баптауларыңызды өңдеу',
 'right-rollback' => 'Белгілі бетті өңдеген соңғы қатысушының өңдемелерінен жылдам шегіндіру',
 'right-markbotedits' => 'Шегіндірлген өңдемелерді боттар өңдемелері деп белгілеу',
 'right-noratelimit' => 'Еселік шектелімдері ықпал етпейді',
@@ -1606,12 +1651,17 @@ $1",
 'action-userrights-interwiki' => 'Басқа уикилердегі қатысушылардың құқықтарын өзгерту',
 'action-siteadmin' => 'Дерекқорды бұғаттау немесе бұғаттан шығару',
 'action-sendemail' => 'электронды хаттарды жіберу',
+'action-editmywatchlist' => 'бақылауыңызды өңдеу',
+'action-viewmywatchlist' => 'бақылау тізіміңізді қарау',
+'action-viewmyprivateinfo' => 'жеке ақпараттарыңызды қарау',
+'action-editmyprivateinfo' => 'жеке ақпараттарыңызды өңдеу',
 
 # Recent changes
 'nchanges' => '$1 өзгеріс',
 'recentchanges' => 'Жуықтағы өзгерістер',
 'recentchanges-legend' => 'Жуықтағы өзгерістер баптаулары',
 'recentchanges-summary' => 'Бұл бетте осы уикидегі болған жуықтағы өзгерістер байқалады.',
+'recentchanges-noresult' => 'Бұл талап бойынша көрсетілген уақыттан бері өзгерістер болған жоқ.',
 'recentchanges-feed-description' => 'Бұл арнаменен уикидегі ең соңғы өзгерістер қадағаланады.',
 'recentchanges-label-newpage' => 'Бұл өңдеме арқылы жаңа бет басталды',
 'recentchanges-label-minor' => 'Бұл шағын өңдеме',
@@ -1648,7 +1698,6 @@ $1",
 'recentchangeslinked-feed' => 'Қатысты өзгерістер',
 'recentchangeslinked-toolbox' => 'Қатысты өзгерістер',
 'recentchangeslinked-title' => '«$1» дегенге қатысты өзгерістер',
-'recentchangeslinked-noresult' => 'Сілтеген беттерде келтірілген мерзімде ешқандай өзгеріс болмаған.',
 'recentchangeslinked-summary' => "Бұл тізімде өзіндік бетке сілтеген беттердегі (не өзіндік санат мүшелеріндегі) істелген жуықтағы өзгерістер беріледі.
 [[Special:Watchlist|Бақылау тізіміңіздегі]] беттер '''жуан''' болып белгіленеді.",
 'recentchangeslinked-page' => 'Бет атауы:',
@@ -1660,7 +1709,7 @@ $1",
 'reuploaddesc' => 'Жүктеу пішініне қайта келу.',
 'upload-tryagain' => 'Файл сипаттамасының өзгерістерін жөнелту',
 'uploadnologin' => 'Кірмегенсіз',
-'uploadnologintext' => 'Файлдарды жүктеу үшін  [[Special:UserLogin|кіруіңіз]] жөн.',
+'uploadnologintext' => 'Файлдарды $1 жүктеуіңіз керек.',
 'upload_directory_missing' => 'Жүктеу қалтасы ($1) жетіспейді және веб-сервер жарата алмайды.',
 'upload_directory_read_only' => 'Жүктеу қалтасына ($1) веб-сервер жаза алмайды.',
 'uploaderror' => 'Жүктеу қатесі',
@@ -1905,6 +1954,12 @@ URL дұрыс екендігін және торап істеп тұрғаны
 'randompage' => 'Кездейсоқ бет',
 'randompage-nopages' => 'Мұнда келесі {{PLURAL:$2|есім кеңістігі|есім кеңістігінде}}: $1 беттер жоқ.',
 
+# Random page in category
+'randomincategory' => 'Санаттағы кездейсоқ бет',
+'randomincategory-invalidcategory' => '"$1" жарамды санат аты емес.',
+'randomincategory-nopages' => 'Бұлар [[:Category:$1]] беттері мес.',
+'randomincategory-selectcategory-submit' => 'Өту',
+
 # Random redirect
 'randomredirect' => 'Кездейсоқ айдағыш',
 'randomredirect-nopages' => 'Бұл есім аясында еш айдағыш жоқ "$1".',
@@ -1930,12 +1985,6 @@ URL дұрыс екендігін және торап істеп тұрғаны
 'statistics-users-active-desc' => 'Соңғы {{PLURAL:$1|күнде|$1 күнде}} қандай да бір іс-әрекет жасаған қатысушылар',
 'statistics-mostpopular' => 'Ең көп қаралған беттер',
 
-'disambiguations' => 'Айрықты беттерге сілтенген беттер',
-'disambiguationspage' => '{{ns:template}}:Айрық',
-'disambiguations-text' => "Келесі беттер '''айрықты бетке''' сілтейді.
-Бұның орнына белгілі тақырыпқа сілтеуі керек.<br />
-Егер [[MediaWiki:Disambiguationspage]] тізіміндегі үлгі қолданылса, бет айрықты деп саналады.",
-
 'pageswithprop' => 'Беттер бет сипатымен',
 'pageswithprop-legend' => 'Беттер бет сипатымен',
 'pageswithprop-prop' => 'Меншік атауы:',
@@ -2171,10 +2220,9 @@ URL дұрыс екендігін және торап істеп тұрғаны
 'unwatchthispage' => 'Бақылауды тоқтату',
 'notanarticle' => 'Мағлұмат беті емес',
 'notvisiblerev' => 'Түзету жойылды',
-'watchnochange' => 'Көрсетілген мерзімде еш бақыланған дана өңделген жоқ.',
 'watchlist-details' => 'Тізіміңізде $1 бет бар (талқылау беттері саналмайды).',
-'wlheader-enotif' => '* Ескерту хат жіберуі қосылған.',
-'wlheader-showupdated' => "* Соңғы келіп-кетуіңізден бері өзгертілген беттерді '''жуан''' қаріпімен көрсет",
+'wlheader-enotif' => 'Ескерту хат жіберуі қосылған.',
+'wlheader-showupdated' => "Соңғы келіп-кетуіңізден бері өзгертілген беттерді '''жуан''' қаріпімен көрсет",
 'watchmethod-recent' => 'бақылаулы беттер үшін жуықтағы өзгерістерді тексеру',
 'watchmethod-list' => 'жуықтағы өзгерістер үшін бақылаулы беттерді тексеру',
 'watchlistcontains' => 'Бақылау тізіміңізде $1 бет бар.',
@@ -2571,12 +2619,9 @@ $1 бұғаттауы үшін келтірілген себебі: «$2».',
 'ipb_blocked_as_range' => 'Қателік: IP $1 тікелей бұғатталмаған және бұғаттауы өшірілмейді.
 Бірақ, бұл бұғаттауы өшірілуі мүмкін $2 ауқымы бөлігі боп бұғатталған.',
 'ip_range_invalid' => 'IP мекенжай ауқымы жарамсыз.',
-'blockme' => 'Тіркелгімді бұғатта',
 'proxyblocker' => 'Прокси серверлерді бұғаттауыш',
-'proxyblocker-disabled' => 'Бұл жете өшірілген.',
 'proxyblockreason' => 'IP мекенжайыңыз ашық прокси серверге жататындықтан бұғатталған.
 Интернет қызметін жабдықтаушыңызбен, не техникалық қолдау қызметімен қатынасыңыз, және оларға осы оте күрделі қауыпсіздік шатақ туралы ақпарат беріңіз.',
-'proxyblocksuccess' => 'Орындалды.',
 'sorbsreason' => 'IP мекенжайыңыз {{SITENAME}} торабында қолданылған DNSBL қара тізіміндегі ашық прокси-сервер деп табылады.',
 'sorbs_create_account_reason' => 'IP мекенжайыңыз {{SITENAME}} торабында қолданылған DNSBL қара тізіміндегі ашық прокси-сервер деп табылады.
 Жаңа тіркелгі жасай алмайсыз.',
@@ -2719,6 +2764,8 @@ MediaWiki жүйесінің [[{{#special:Import}}|сырттан алу бет
 'thumbnail-more' => 'Үлкейту',
 'filemissing' => 'Жоғалған файл',
 'thumbnail_error' => 'Нобай құру қатесі: $1',
+'thumbnail_error_remote' => '$1 дегеннен хабарлама қатесі:
+$2',
 'djvu_page_error' => 'DjVu беті аумақ сыртындда',
 'djvu_no_xml' => 'DjVu файлы үшін XML келтіруі икемді емес',
 'thumbnail_invalid_params' => 'Нобайдың бапталымдары жарамсыз',
@@ -2843,24 +2890,14 @@ MediaWiki жүйесінің [[{{#special:Import}}|сырттан алу бет
 
 # Stylesheets
 'common.css' => '/* Мында орналастырылған CSS барлық мәнерлерде қолданылады */',
-'standard.css' => '/* Мында орналастырылған CSS тек «Дағдылы» (standard) мәнерін пайдаланушыларына ықпал етеді */',
-'nostalgia.css' => '/* Мында орналастырылған CSS тек «Аңсау» (nostalgia) мәнерін пайдаланушыларына ықпал етеді */',
 'cologneblue.css' => '/* Мында орналастырылған CSS тек «Көлн зеңгірлігі» (cologneblue) мәнерін пайдаланушыларына ықпал етеді skin */',
 'monobook.css' => '/* Мында орналастырылған CSS тек «Дара кітап» (monobook) мәнерін пайдаланушыларына ықпал етеді */',
-'myskin.css' => '/* Мында орналастырылған CSS тек «Өз мәнерім» (myskin) мәнерін пайдаланушыларына ықпал етеді */',
-'chick.css' => '/* Мында орналастырылған CSS тек «Балапан» (chick) мәнерін пайдаланушыларына ықпал етеді */',
-'simple.css' => '/* Мында орналастырылған CSS тек «Кәдімгі» (simple) мәнерін пайдаланушыларына ықпал етеді */',
 'modern.css' => '/* Мында орналастырылған CSS тек «Заманауи» (modern) мәнерін пайдаланушыларына ықпал етеді */',
 
 # Scripts
 'common.js' => '/* Мындағы әртүрлі JavaScript кез келген бет қотарылғанда барлық пайдаланушылар үшін жегіледі. */',
-'standard.js' => '/* Мындағы JavaScript тек «Дағдылы» (standard) мәнерін пайдаланушылар үшін жегіледі */',
-'nostalgia.js' => '/* Мындағы JavaScript тек «Аңсау» (nostalgia) мәнерін пайдаланушылар үшін жегіледі*/',
 'cologneblue.js' => '/* Мындағы JavaScript тек «Көлн зеңгірлігі» (cologneblue) мәнерін пайдаланушылар үшін жегіледі */',
 'monobook.js' => '/* Мындағы JavaScript тек «Дара кітап» (monobook) мәнерін пайдаланушылар үшін жегіледі */',
-'myskin.js' => '/* Мындағы JavaScript тек «Өз мәнерім» (myskin) мәнерін пайдаланушылар үшін жегіледі */',
-'chick.js' => '/* Мындағы JavaScript тек «Балапан» (chick) мәнерін пайдаланушылар үшін жегіледі */',
-'simple.js' => '/* Мындағы JavaScript тек «Кәдімгі» (simple) мәнерін пайдаланушылар үшін жегіледі */',
 'modern.js' => '/* Мындағы JavaScript тек «Заманауи» (modern) мәнерін пайдаланушылар үшін жегіледі */',
 
 # Metadata
@@ -2930,13 +2967,8 @@ MediaWiki жүйесінің [[{{#special:Import}}|сырттан алу бет
 'pageinfo-category-files' => 'Файлдар саны',
 
 # Skin names
-'skinname-standard' => 'Дағдылы (standard)',
-'skinname-nostalgia' => 'Аңсау (nostalgia)',
 'skinname-cologneblue' => 'Көк зеңгірлігі (cologneblue)',
 'skinname-monobook' => 'Дара кітап (monobook)',
-'skinname-myskin' => 'Өз мәнерім (myskin)',
-'skinname-chick' => 'Балапан (chick)',
-'skinname-simple' => 'Кәдімгі (simple)',
 'skinname-modern' => 'Заманауи (modern)',
 
 # Patrolling
@@ -3012,11 +3044,17 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 минут|$1 минут}}',
 'hours' => '{{PLURAL:$1|$1 сағат|$1 сағат}}',
 'days' => '{{PLURAL:$1|$1 күн|$1 күн}}',
+'weeks' => '{{PLURAL:$1|$1 апта|$1 апта}}',
 'months' => '{{PLURAL:$1|$1 ай|$1 ай}}',
 'years' => '{{PLURAL:$1|$1 жыл|$1 жыл}}',
 'ago' => '$1 бұрын',
 'just-now' => 'Дәл қазір',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|сағат|сағат}} бұрын',
+'minutes-ago' => '$1 {{PLURAL:$1|минут|минут}} бұрын',
+'seconds-ago' => '$1 {{PLURAL:$1|секунт|секунт}} бұрын',
+
 # Bad image list
 'bad_image_list' => 'Пішімі төмендегідей:
 
@@ -3046,7 +3084,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ені',
 'exif-imagelength' => 'Биіктігі',
 'exif-bitspersample' => 'Құраш сайын бит саны',
@@ -3191,7 +3229,7 @@ $1',
 'exif-copyrighted' => 'Авторлық құқық күйі:',
 'exif-copyrightowner' => 'Авторлық құқықтар иесі',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ұлғайтылған',
 
 'exif-unknowndate' => 'Белгісіз күн-айы',
@@ -3568,7 +3606,6 @@ $5
 'version-other' => 'Тағы басқалар',
 'version-mediahandlers' => 'Медиа өңдеткіштері',
 'version-hooks' => 'Жете тұзақтары',
-'version-extension-functions' => 'Кеңейтімдер жетелері',
 'version-parser-extensiontags' => 'Құрылымдық талдатқыш кеңейтімдерінің белгілемері',
 'version-parser-function-hooks' => 'Құрылымдық талдатқыш жетелерінің тұзақтары',
 'version-hook-name' => 'Тұзақ атауы',
@@ -3581,12 +3618,15 @@ $5
 'version-software-version' => 'Нұсқасы',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Файл орналасуы',
-'filepath-page' => 'Файл аты:',
-'filepath-submit' => 'Орналасуын тап',
-'filepath-summary' => 'Бұл арнайы бет файл орналасуы толық жолын қайтарады.
-Суреттер толық ажыратылымдығымен көрсетіледі, басқа файл түрлеріне қатысты бағдарламасы тура жегіледі.',
+# Special:Redirect
+'redirect-legend' => 'Файл немесе бетке айдатулар',
+'redirect-submit' => 'Өту',
+'redirect-lookup' => 'Іздеу:',
+'redirect-value' => 'Мән:',
+'redirect-user' => 'Қатысушы ID',
+'redirect-revision' => 'Бет түзетуі',
+'redirect-file' => 'Файл атауы',
+'redirect-not-exists' => 'Мән табылмады',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Файл телнұсқаларын іздеу',
@@ -3625,11 +3665,14 @@ $5
 'tags' => 'Тектерді өзгерту жарамсыз',
 'tag-filter' => '[[Special:Tags|Тег]] сүзгісі:',
 'tag-filter-submit' => 'Сүзгі',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Тег|Тег}}]]: $2)',
 'tags-title' => 'Тегтер',
 'tags-tag' => 'Тег атауы',
 'tags-display-header' => 'Өзгеріс тізіміндегі көрінісі',
 'tags-description-header' => 'Толық сипаттама мәні',
-'tags-hitcount-header' => 'Телгіленген өзгерістер',
+'tags-active-header' => 'Белсенді ме?',
+'tags-hitcount-header' => 'Тегтелген өзгерістер',
+'tags-active-yes' => 'Иә',
 'tags-edit' => 'өңдеу',
 'tags-hitcount' => '$1 {{PLURAL:$1|өзгеріс|өзгеріс}}',
 
@@ -3650,6 +3693,8 @@ $5
 'htmlform-submit' => 'Жіберу',
 'htmlform-reset' => 'Өзгерістерді болдырмау',
 'htmlform-selectorother-other' => 'Басқа',
+'htmlform-no' => 'Жоқ',
+'htmlform-yes' => 'Иә',
 
 # New logging system
 'logentry-delete-delete' => '$1 $3 деген бетті {{GENDER:$2|жойды}}',
@@ -3667,7 +3712,7 @@ $5
 'logentry-move-move_redir' => '$1 $3 бетін $4 деген айдатқыш үстіне {{GENDER:$2|жылжытты}}',
 'logentry-move-move_redir-noredirect' => '$1 $3 бетін $4 деген айдатқыш үстіне {{GENDER:$2|жылжытты}} (айдатқыш қалдырылмады)',
 'logentry-newusers-newusers' => '$1 жаңадан қатысушы тіркелгісін {{GENDER:$2|жасады}}',
-'logentry-newusers-create' => '$1 жаңадан қатысушы тіркелгісі {{GENDER:$2|жасады}}',
+'logentry-newusers-create' => '$1 жаңадан аккаунт тіркеді',
 'logentry-newusers-create2' => '$1 $3 деген аккаунт тіркеді',
 'logentry-newusers-autocreate' => '$1 қатысушы аккаунтын автоматты түрде {{GENDER:$2|тіркеді}}',
 'logentry-rights-rights' => '$1 $3 үшін топ мүшелігін $4 дегеннен $5 дегенге {{GENDER:$2|өзгерті}}',
diff --git a/languages/messages/MessagesKk_latn.php b/languages/messages/MessagesKk_latn.php
index 608ad71f..67e7cf74 100644
--- a/languages/messages/MessagesKk_latn.php
+++ b/languages/messages/MessagesKk_latn.php
@@ -383,9 +383,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'E-poştamnıñ mekenjaýın eskertw xattarda aş',
 'tog-shownumberswatching' => 'Baqılap turğan qatıswşılardıñ sanın körset',
 'tog-fancysig' => 'Qam qoltañba (özdiktik siltemesiz)',
-'tog-externaleditor' => 'Şettik öñdewişti ädepkiden qoldan (tek sarapşılar üşin, komp′ywteriñizde arnawlı baptalımdar kerek)',
-'tog-externaldiff' => 'Şettik aýırmağıştı ädepkiden qoldan (tek sarapşılar üşin, komp′ywteriñizde arnawlı baptalımdar kerek)',
-'tog-showjumplinks' => '«Ötip ketw» qatınaw siltemelerin qos',
 'tog-uselivepreview' => 'Twra qarap şığwdı qoldanw (JavaScript) (Sınaqtama)',
 'tog-forceeditsummary' => 'Öñdemeniñ qısqaşa mazmundaması bos qalğanda mağan eskert',
 'tog-watchlisthideown' => 'Öñdemelerimdi baqılaw tizimnen jasır',
@@ -542,7 +539,7 @@ $messages = array(
 'jumptonavigation' => 'şarlaw',
 'jumptosearch' => 'izdew',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} twralı',
 'aboutpage' => 'Project:Joba twralı',
 'copyright' => 'Mağlumat $1 şartımen jetimdi.',
@@ -552,7 +549,6 @@ $messages = array(
 'disclaimers' => 'Jawapkerşilikten bas tartw',
 'disclaimerpage' => 'Project:Jawapkerşilikten bas tartw',
 'edithelp' => 'Öndew anıqtaması',
-'edithelppage' => 'Help:Öñdew',
 'helppage' => 'Help:Mazmunı',
 'mainpage' => 'Bastı bet',
 'mainpage-description' => 'Bastı bet',
@@ -618,17 +614,6 @@ Jaramdı arnaýı bet tizimin [[{{#special:Specialpages}}|{{int:specialpages}}]]
 # General errors
 'error' => 'Qate',
 'databaseerror' => 'Derekqor qatesi',
-'dberrortext' => 'Derekqor suranımında söýlem jüýesiniñ qatesi boldı.
-Bul bağdarlamalıq jasaqtama qatesin belgilewi mümkin.
-Soñğı bolğan derekqor suranımı:
-<blockquote><tt>$1</tt></blockquote>
-mına jeteden «<tt>$2</tt>».
-MySQL qaýtarğan qatesi «<tt>$3: $4</tt>».',
-'dberrortextcl' => 'Derekqor suranımında söýlem jüýesiniñ qatesi boldı.
-Soñğı bolğan derekqor suranımı:
-«$1»
-mına jeteden: «$2».
-MySQL qaýtarğan qatesi «$3: $4»',
 'laggedslavemode' => 'Qulaqtandırw: Bette jwıqtağı jañalawlar bolmawı mümkin.',
 'readonly' => 'Derekqorı qulıptalğan',
 'enterlockreason' => 'Qulıptaw sebebin, qaý waqıtqa deýin qulıptalğanın kiristirip, engiziñiz',
@@ -676,7 +661,6 @@ Birneşe mïnöttan qaýta baýqap köriñiz.',
 'editinginterface' => "'''Qulaqtandırw:''' Bağdarlamalıq jasaqtamanıñ tildesw mätinin jetistiretin betin öñdep jatırsız.
 Bul bettiñ özgertwi basqa qatıswşılarğa paýdalanwşılıq tildeswi qalaý körinetine äser etedi.
 Awdarmalar üşin, MediaWiki bağdarlamasın jersindirw [//translatewiki.net/wiki/Main_Page?setlang=kk translatewiki.net jobası] arqılı qarap şeşiñiz.",
-'sqlhidden' => '(SQL suranımı jasırılğan)',
 'cascadeprotected' => 'Bul bet öñdewden qorğalğan, sebebi bul kelesi «bawlı qorğawı» qosılğan {{PLURAL:$1|bettiñ|betterdiñ}} kirikbeti:
 $2',
 'namespaceprotected' => "'''$1''' esim ayasındağı betterdi öñdew üşin ruqsatıñız joq.",
@@ -775,7 +759,7 @@ Kirwiñizdi bitirw üşin, jaña qupïya söziñizdi mında engizwiñiz jön:',
 'newpassword' => 'Jaña qupïya söziñiz:',
 'retypenew' => 'Jaña qupïya söziñizdi qaýtalañız:',
 'resetpass_submit' => 'Qupïya sözdi qoýıñız da kiriñiz',
-'resetpass_success' => 'Qupïya söziñiz sätti özgertildi! Endi kiriñiz…',
+'changepassword-success' => 'Qupïya söziñiz sätti özgertildi! Endi kiriñiz…',
 'resetpass_forbidden' => '{{SITENAME}} jobasında qupïya sözder özgertilmeýdi',
 
 # Edit page toolbar
@@ -1077,7 +1061,6 @@ Añğartpa: bağıttaw siltemelerin qoldanğanda bul bağan qaýta qoýıladı.'
 'prevn' => 'aldıñğı {{PLURAL:$1|$1}}',
 'nextn' => 'kelesi {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Körsetilwi: ($1 {{int:pipe-separator}} $2) ($3) jazba',
-'searchhelp-url' => 'Help:Mazmunı',
 'search-result-size' => '$1 ($2 söz)',
 'search-result-score' => 'Araqatınastılığı: $1 %',
 'search-redirect' => '(aýdağış $1)',
@@ -1103,14 +1086,6 @@ Añğartpa: bağıttaw siltemelerin qoldanğanda bul bağan qaýta qoýıladı.'
 Äzirşe Google arqılı izdewge boladı.
 Añğartpa: {{SITENAME}} torabınıñ mağlumat tizbeleri eskirgen bolwı mümkin.',
 
-# Quickbar
-'qbsettings' => 'Mäzir',
-'qbsettings-none' => 'Eşqandaý',
-'qbsettings-fixedleft' => 'Solğa bekitilgen',
-'qbsettings-fixedright' => 'Oñğa bekitilgen',
-'qbsettings-floatingleft' => 'Solğa qalqığan',
-'qbsettings-floatingright' => 'Oñğa qalqığan',
-
 # Preferences page
 'preferences' => 'Baptalımdar',
 'mypreferences' => 'Baptalımdarım',
@@ -1306,7 +1281,6 @@ Eger bunı jetistirwdi tañdasañız, bul tüzetwiñizdiñ awtorlığın anıqta
 'recentchangeslinked-feed' => 'Qatıstı özgerister',
 'recentchangeslinked-toolbox' => 'Qatıstı özgerister',
 'recentchangeslinked-title' => '«$1» degenge qatıstı özgerister',
-'recentchangeslinked-noresult' => 'Siltegen betterde keltirilgen merzimde eşqandaý özgeris bolmağan.',
 'recentchangeslinked-summary' => "Bul tizimde özindik betke siltegen betterdegi (ne özindik sanat müşelerindegi) istelgen jwıqtağı özgerister beriledi.
 [[{{#special:Watchlist}}|Baqılaw tizimiñizdegi]] better '''jwan''' bolıp belgilenedi.",
 'recentchangeslinked-page' => 'Bet atawı:',
@@ -1513,12 +1487,6 @@ Kirisi: mağlumat_türi/tür_tarawı, mısalı <code>image/jpeg</code>.',
 'statistics-header-users' => 'Qatıswşı sanağı',
 'statistics-mostpopular' => 'Eñ köp qaralğan better',
 
-'disambiguations' => 'Aýrıqtı better',
-'disambiguationspage' => '{{ns:template}}:Aýrıq',
-'disambiguations-text' => "Kelesi better '''aýrıqtı betke''' silteýdi.
-Bunıñ ornına belgili taqırıpqa siltewi kerek.<br />
-Eger [[MediaWiki:Disambiguationspage]] tizimindegi ülgi qoldanılsa, bet aýrıqtı dep sanaladı.",
-
 'doubleredirects' => 'Şınjırlı aýdağıştar',
 'doubleredirectstext' => 'Bul bette basqa aýdatw betterge silteýtin better tizimdelinedi. Ärbir jolaqta birinşi jäne ekinşi aýdağışqa siltemeler bar, sonımen birge ekinşi aýdağış nısanası bar, ädette bul birinşi aýdağış bağıttaýtın «naqtı» nısana bet atawı bolwı kerek.',
 
@@ -1693,10 +1661,9 @@ Bul bettiñ jäne baýlanıstı talqılaw betiniñ keleşektegi özgeristeri mı
 'unwatchthispage' => 'Baqılawdı toqtatw',
 'notanarticle' => 'Mağlumat beti emes',
 'notvisiblerev' => 'Tüzetw joýıldı',
-'watchnochange' => 'Körsetilgen merzimde eş baqılanğan dana öñdelgen joq.',
 'watchlist-details' => 'Talqılaw betterin sanamağanda $1 bet baqlanıladı.',
-'wlheader-enotif' => '* Eskertw xat jiberwi qosılğan.',
-'wlheader-showupdated' => "* Soñğı kelip-ketwiñizden beri özgertilgen betterdi '''jwan''' qaripimen körset",
+'wlheader-enotif' => 'Eskertw xat jiberwi qosılğan.',
+'wlheader-showupdated' => "Soñğı kelip-ketwiñizden beri özgertilgen betterdi '''jwan''' qaripimen körset",
 'watchmethod-recent' => 'baqılawlı better üşin jwıqtağı özgeristerdi tekserw',
 'watchmethod-list' => 'jwıqtağı özgerister üşin baqılawlı betterdi tekserw',
 'watchlistcontains' => 'Baqılaw tizimiñizde $1 bet bar.',
@@ -2011,12 +1978,9 @@ Ağımdağı belsendi tïımdar men buğattawlardı [[{{#special:Ipblocklist}}|I
 'ipb_blocked_as_range' => 'Qatelik: IP $1 tikeleý buğattalmağan jäne buğattawı öşirilmeýdi.
 Biraq, bul buğattawı öşirilwi mümkin $2 awqımı böligi bop buğattalğan.',
 'ip_range_invalid' => 'IP mekenjaý awqımı jaramsız.',
-'blockme' => 'Özdiktik_buğattaw',
 'proxyblocker' => 'Proksï serverlerdi buğattawış',
-'proxyblocker-disabled' => 'Bul jete öşirilgen.',
 'proxyblockreason' => 'IP mekenjaýıñız aşıq proksï serverge jatatındıqtan buğattalğan.
 Ïnternet qızmetin jabdıqtawşıñızben, ne texnïkalıq qoldaw qızmetimen qatınasıñız, jäne olarğa osı ote kürdeli qawıpsizdik şataq twralı aqparat beriñiz.',
-'proxyblocksuccess' => 'Bitti.',
 'sorbsreason' => 'IP mekenjaýıñız {{SITENAME}} torabında qoldanılğan DNSBL qara tizimindegi aşıq proksï-server dep tabıladı.',
 'sorbs_create_account_reason' => 'IP mekenjaýıñız {{SITENAME}} torabında qoldanılğan DNSBL qara tizimindegi aşıq proksï-server dep tabıladı.
 Jaña tirkelgi jasaý almaýsız.',
@@ -2236,24 +2200,14 @@ Wïkï-aparw üşin sırttan alw barlıq äreketter [[{{#special:Log}}/import|s
 
 # Stylesheets
 'common.css' => '/* Mında ornalastırılğan CSS barlıq mänerlerde qoldanıladı */',
-'standard.css' => '/* Mında ornalastırılğan CSS tek «Dağdılı» (standard) mänerin paýdalanwşılarına ıqpal etedi */',
-'nostalgia.css' => '/* Mında ornalastırılğan CSS tek «Añsaw» (nostalgia) mänerin paýdalanwşılarına ıqpal etedi */',
 'cologneblue.css' => '/* Mında ornalastırılğan CSS tek «Köln zeñgirligi» (cologneblue) mänerin paýdalanwşılarına ıqpal etedi skin */',
 'monobook.css' => '/* Mında ornalastırılğan CSS tek «Dara kitap» (monobook) mänerin paýdalanwşılarına ıqpal etedi */',
-'myskin.css' => '/* Mında ornalastırılğan CSS tek «Öz mänerim» (myskin) mänerin paýdalanwşılarına ıqpal etedi */',
-'chick.css' => '/* Mında ornalastırılğan CSS tek «Balapan» (chick) mänerin paýdalanwşılarına ıqpal etedi */',
-'simple.css' => '/* Mında ornalastırılğan CSS tek «Kädimgi» (simple) mänerin paýdalanwşılarına ıqpal etedi */',
 'modern.css' => '/* Mında ornalastırılğan CSS tek «Zamanawï» (modern) mänerin paýdalanwşılarına ıqpal etedi */',
 
 # Scripts
 'common.js' => '/* Mındağı ärtürli JavaScript kez kelgen bet qotarılğanda barlıq paýdalanwşılar üşin jegiledi. */',
-'standard.js' => '/* Mındağı JavaScript tek «Dağdılı» (standard) mänerin paýdalanwşılar üşin jegiledi */',
-'nostalgia.js' => '/* Mındağı JavaScript tek «Añsaw» (nostalgia) mänerin paýdalanwşılar üşin jegiledi*/',
 'cologneblue.js' => '/* Mındağı JavaScript tek «Köln zeñgirligi» (cologneblue) mänerin paýdalanwşılar üşin jegiledi */',
 'monobook.js' => '/* Mındağı JavaScript tek «Dara kitap» (monobook) mänerin paýdalanwşılar üşin jegiledi */',
-'myskin.js' => '/* Mındağı JavaScript tek «Öz mänerim» (myskin) mänerin paýdalanwşılar üşin jegiledi */',
-'chick.js' => '/* Mındağı JavaScript tek «Balapan» (chick) mänerin paýdalanwşılar üşin jegiledi */',
-'simple.js' => '/* Mındağı JavaScript tek «Kädimgi» (simple) mänerin paýdalanwşılar üşin jegiledi */',
 'modern.js' => '/* Mındağı JavaScript tek «Zamanawï» (modern) mänerin paýdalanwşılar üşin jegiledi */',
 
 # Metadata
@@ -2279,13 +2233,8 @@ Bunıñ sebebi şettik torap siltemesinen bolwı mümkin.',
 'spam_blanking' => '$1 degenge siltemeleri bar barlıq tüzetwler tazartıldı',
 
 # Skin names
-'skinname-standard' => 'Dağdılı (standard)',
-'skinname-nostalgia' => 'Añsaw (nostalgia)',
 'skinname-cologneblue' => 'Köln zeñgirligi (cologneblue)',
 'skinname-monobook' => 'Dara kitap (monobook)',
-'skinname-myskin' => 'Öz mänerim (myskin)',
-'skinname-chick' => 'Balapan (chick)',
-'skinname-simple' => 'Kädimgi (simple)',
 'skinname-modern' => 'Zamanawï (modern)',
 
 # Patrolling
@@ -2373,7 +2322,7 @@ Basqaları ädepkiden jasırıladı.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Eni',
 'exif-imagelength' => 'Bïiktigi',
 'exif-bitspersample' => 'Quraş saýın bït sanı',
@@ -2487,7 +2436,7 @@ Basqaları ädepkiden jasırıladı.
 'exif-gpsdatestamp' => 'GPS kün-aýı',
 'exif-gpsdifferential' => 'GPS saralanğan durıstaw',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ulğaýtılğan',
 
 'exif-unknowndate' => 'Belgisiz kün-aýı',
@@ -2806,7 +2755,6 @@ Tağı da [[Special:EditWatchlist|qalıpalğan öñdewişti paýdalana]] alasız
 'version-other' => 'Tağı basqalar',
 'version-mediahandlers' => 'Taspa öñdetkişteri',
 'version-hooks' => 'Jete tuzaqtarı',
-'version-extension-functions' => 'Keñeýtimder jeteleri',
 'version-parser-extensiontags' => 'Qurılımdıq taldatqış keñeýtimderiniñ belgilemeri',
 'version-parser-function-hooks' => 'Qurılımdıq taldatqış jeteleriniñ tuzaqtarı',
 'version-hook-name' => 'Tuzaq atawı',
@@ -2817,13 +2765,6 @@ Tağı da [[Special:EditWatchlist|qalıpalğan öñdewişti paýdalana]] alasız
 'version-software-product' => 'Önim',
 'version-software-version' => 'Nusqası',
 
-# Special:FilePath
-'filepath' => 'Faýl ornalaswı',
-'filepath-page' => 'Faýl atı:',
-'filepath-submit' => 'Ornalaswın tap',
-'filepath-summary' => 'Bul arnaýı bet faýl ornalaswı tolıq jolın qaýtaradı.
-Swretter tolıq ajıratılımdığımen körsetiledi, basqa faýl türlerine qatıstı bağdarlaması twra jegiledi.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Faýl telnusqaların izdew',
 'fileduplicatesearch-summary' => 'Faýl xeşi mağınası negizinde telnusqaların izdew.',
diff --git a/languages/messages/MessagesKm.php b/languages/messages/MessagesKm.php
index 77257275..912e9307 100644
--- a/languages/messages/MessagesKm.php
+++ b/languages/messages/MessagesKm.php
@@ -12,6 +12,7 @@
  * @author Kaganer
  * @author Kiensvay
  * @author Lovekhmer
+ * @author Nemo bis
  * @author Sovichet
  * @author T-Rithy
  * @author Thearith
@@ -291,9 +292,6 @@ $messages = array(
 'tog-shownumberswatching' => 'បង្ហាញ​ចំនួនអ្នកប្រើប្រាស់​ដែលតាមដាន​ទំព័រនេះ',
 'tog-oldsig' => 'ហត្ថលេខាមានហើយ៖',
 'tog-fancysig' => 'ចុះហត្ថលេខា​ជា​អត្ថបទវិគី​ (ដោយ​គ្មានតំណភ្ជាប់​ស្វ័យប្រវត្តិ)',
-'tog-externaleditor' => 'ប្រើប្រាស់​ឧបករណ៍​កែប្រែខាងក្រៅ​តាមលំនាំដើម (សម្រាប់តែអ្នកមានជំនាញប៉ុណ្ណោះនិងត្រូវការការកំណត់ពិសេសៗនៅលើកុំព្យូទ័ររបស់អ្នក។ [//www.mediawiki.org/wiki/Manual:External_editors ព័ត៌មានបន្ថែម]។)',
-'tog-externaldiff' => 'ប្រើប្រាស់​ឧបករណ៍​ប្រៀបធៀបខាងក្រៅ​តាមលំនាំដើម (សម្រាប់តែអ្នកមានជំនាញប៉ុណ្ណោះនិងត្រូវការការកំណត់ពិសេសៗនៅលើកុំព្យូទ័ររបស់អ្នក។ [//www.mediawiki.org/wiki/Manual:External_editors ព័ត៌មានបន្ថែម]។)',
-'tog-showjumplinks' => 'ប្រើតំណភ្ជាប់ "លោតទៅ"',
 'tog-uselivepreview' => 'ប្រើប្រាស់​ការមើលមុនរហ័ស (ស្ថិតក្រោមការពិសោធន៍នៅឡើយ)',
 'tog-forceeditsummary' => 'សូមរំលឹកខ្ញុំ​កាលបើខ្ញុំទុកប្រអប់ចំណារពន្យល់ឱ្យនៅទំនេរ',
 'tog-watchlisthideown' => 'លាក់​កំណែប្រែ​របស់ខ្ញុំ​ពី​បញ្ជីតាមដាន',
@@ -306,6 +304,8 @@ $messages = array(
 'tog-diffonly' => 'កុំបង្ហាញខ្លឹមសារទំព័រនៅពីក្រោមតារាងប្រៀបធៀបចំណុចខុសគ្នា',
 'tog-showhiddencats' => 'បង្ហាញចំណាត់ថ្នាក់ក្រុមដែលត្រូវបានលាក់',
 'tog-norollbackdiff' => 'បំភ្លេច​ភាព​ខុស​គ្នា​បន្ទាប់​ពី​អនុវត្តការ​ស្ដារវិញ',
+'tog-useeditwarning' => 'សូមព្រមាន​ខ្ញុំ​ ពេលដែលខ្ញុំ​ចាកចេញ​ពី​ទំព័រ​កែប្រែដោយមិន​បានរក្សា​ទុកបំលាស់ប្ដូរ​នានា​',
+'tog-prefershttps' => 'ប្រើប្រាស់ការតភ្ជាប់មានសុវត្ថិភាពជានិច្ចពេលកត់ឈ្មោះចូល',
 
 'underline-always' => 'ជានិច្ច',
 'underline-never' => 'កុំអោយសោះ',
@@ -369,6 +369,18 @@ $messages = array(
 'oct' => 'តុលា',
 'nov' => 'វិច្ឆិកា',
 'dec' => 'ធ្នូ',
+'january-date' => '$1 មករា',
+'february-date' => '$1 កុម្ភៈ',
+'march-date' => '$1 មីនា',
+'april-date' => '$1 មេសា',
+'may-date' => '$1 ឧសភា',
+'june-date' => '$1 មិថុនា',
+'july-date' => '$1 កក្កដា',
+'august-date' => '$1 សីហា',
+'september-date' => '$1 កញ្ញា',
+'october-date' => '$1 តុលា',
+'november-date' => '$1 វិច្ឆិកា',
+'december-date' => '$1 ធ្នូ',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|ចំណាត់ថ្នាក់ក្រុម|ចំណាត់ថ្នាក់ក្រុម}}',
@@ -390,7 +402,7 @@ $messages = array(
 'broken-file-category' => 'ទំព័រទាំងឡាយដែលដាច់តំណភ្ជាប់',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'អំពី',
 'article' => 'មាតិកាអត្ថបទ',
@@ -453,6 +465,7 @@ $messages = array(
 'create-this-page' => 'បង្កើតទំព័រនេះ',
 'delete' => 'លុបចោល',
 'deletethispage' => 'លុបទំព័រនេះចោល',
+'undeletethispage' => 'ឈប់លុបទំព័រនេះ',
 'undelete_short' => 'ឈប់លុប{{PLURAL:$1|កំណែប្រែមួយ|កំណែប្រែចំនួន$1}}វិញ',
 'viewdeleted_short' => 'មើល{{PLURAL:$1|កំណែប្រែមួយដែលត្រូវបានលុបចោល|កំណែប្រែចំនួន $1 ដែលត្រូវបានលុបចោល}}',
 'protect' => 'ការពារ',
@@ -496,7 +509,7 @@ $messages = array(
 $1',
 'pool-errorunknown' => 'កំហុសមិនស្គាល់',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'អំពី{{SITENAME}}',
 'aboutpage' => 'Project:អំពី',
 'copyright' => 'រក្សាសិទ្ធិគ្រប់យ៉ាងដោយ$1។',
@@ -506,7 +519,6 @@ $1',
 'disclaimers' => 'ការបដិសេធ',
 'disclaimerpage' => 'Project:ការបដិសេធ​ទូទៅ',
 'edithelp' => 'ជំនួយ​ក្នុងការកែប្រែ',
-'edithelppage' => 'Help:របៀបកែប្រែ',
 'helppage' => 'Help:មាតិកា',
 'mainpage' => 'ទំព័រដើម',
 'mainpage-description' => 'ទំព័រដើម',
@@ -539,7 +551,6 @@ $1',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|បំលាស់ប្ដូរ|បំលាស់ប្ដូរ}}ចុងក្រោយ',
 'youhavenewmessagesmulti' => 'អ្នកមានសារថ្មីៗនៅ $1',
 'editsection' => 'កែប្រែ',
-'editsection-brackets' => '[$1]',
 'editold' => 'កែប្រែ',
 'viewsourceold' => 'មើលកូដ',
 'editlink' => 'កែប្រែ',
@@ -644,12 +655,15 @@ $1',
 'protectedinterface' => 'ទំព័រនេះផ្ដល់នូវអត្ថបទអន្តរមុខសម្រាប់សូហ្វវែរនៅក្នុងវិគីនេះ និងត្រូវបានចាក់សោដើម្បីចៀសវាងការបំពាន។
 ដើម្បីបន្ថែមឬផ្លាស់ប្ដូរការបកប្រែសំរាប់វិគីទាំងអស់ សូមប្រើប្រាស់ [//translatewiki.net/ translatewiki.net] ដែលជាគំរោងបកប្រែរបស់MediaWiki។',
 'editinginterface' => "'''ប្រយ័ត្ន៖''' អ្នកកំពុងតែកែប្រែទំព័រដែលបានប្រើប្រាស់​ដើម្បីផ្ដល់ជូនអន្តរមុខសម្រាប់សូហ្វវែរ។ បំលាស់ប្ដូរចំពោះទំព័រនេះ​នឹងប៉ះពាល់ដល់ទ្រង់ទ្រាយរបស់ទំព័រអន្តរមុខសំរាប់អ្នកប្រើប្រាស់​ជាច្រើន ដែលប្រើប្រាស់វិគីនេះ។ ដើម្បីបន្ថែមឬផ្លាស់ប្ដូរការបកប្រែ​សំរាប់វិគីទាំងអស់ សូបប្រើប្រាស់  [//translatewiki.net/wiki/Main_Page?setlang=km translatewiki.net] គម្រោង​បកប្រែរបស់មេឌាវិគី ។",
-'sqlhidden' => '(ការអង្កេត SQL ត្រូវបិទបាំង)',
 'cascadeprotected' => 'ទំព័រនេះត្រូវបានការពារពីការការប្រែដោយសារវាមាន{{PLURAL:$1|ទំព័រ, ដែលមាន}} ដែលត្រូវបានការពារជាមួយជំរើស"ជាបណ្ដាក់"៖
 $2',
 'namespaceprotected' => "អ្នកមិនមានសិទ្ធិកែប្រែទំព័រក្នុងប្រភេទ'''$1'''ទេ។",
 'customcssprotected' => 'អ្នកមិនមាន​ការអនុញ្ញាត​ក្នុងការកែប្រែទំព័រ CSS នេះទេ ព្រោះវាផ្ទុកការកំណត់ផ្ទាល់ខ្លួនផ្សេងៗរបស់អ្នកប្រើប្រាស់ម្នាក់ផ្សេងទៀត។',
 'customjsprotected' => 'អ្នកមិនមាន​ការអនុញ្ញាត​ក្នុងការកែប្រែទំព័រ JavaScript នេះទេ ព្រោះវាផ្ទុកការកំណត់ផ្ទាល់ខ្លួនផ្សេងៗរបស់អ្នកប្រើប្រាស់ម្នាក់ផ្សេងទៀត។',
+'mycustomcssprotected' => 'អ្នកមិនមាន​ការអនុញ្ញាត​ក្នុងការកែប្រែទំព័រ CSS នេះទេ។',
+'mycustomjsprotected' => 'អ្នកមិនមាន​ការអនុញ្ញាត​ក្នុងការកែប្រែទំព័រ JavaScript  នេះទេ',
+'myprivateinfoprotected' => 'អ្នកមិនមាន​ការអនុញ្ញាត​ក្នុងការកែប្រែព័ត៌មានផ្ទាល់ខ្លួនរបស់អ្នកទេ។',
+'mypreferencesprotected' => 'អ្នកមិនមាន​ការអនុញ្ញាត​ក្នុងការកែប្រែចំណង់ចំណូលចិត្តរបស់អ្នកទេ។',
 'ns-specialprotected' => 'ទំព័រពិសេសៗមិនអាចកែប្រែបានទេ។',
 'titleprotected' => "ចំណងជើងនេះត្រូវបានការពារមិនឱ្យបង្កើត​ដោយ [[User:$1|$1]]។
 ហេតុផលលើកឡើងគឺ ''$2''។",
@@ -674,10 +688,19 @@ $2',
 'welcomecreation-msg' => 'គណនីរបស់អ្នកត្រូវបានបង្កើតហើយ។
 កុំភ្លេចផ្លាស់ប្ដូរ[[Special:Preferences|ចំណង់ចំណូលចិត្ត{{SITENAME}}]]របស់អ្នក។',
 'yourname' => 'អត្តនាម៖',
+'userlogin-yourname' => 'អត្តនាម',
+'userlogin-yourname-ph' => 'បញ្ចូលអត្តនាមរបស់អ្នក',
+'createacct-another-username-ph' => 'បញ្ចូលអត្ថនាម',
 'yourpassword' => 'ពាក្យសម្ងាត់៖',
+'userlogin-yourpassword' => 'ពាក្យ​សម្ងាត់',
+'userlogin-yourpassword-ph' => 'បញ្ចូលពាក្យសម្ងាត់របស់អ្នក',
+'createacct-yourpassword-ph' => 'បញ្ចូលពាក្យសម្ងាត់',
 'yourpasswordagain' => 'វាយពាក្យសម្ងាត់ម្តងទៀត៖',
+'createacct-yourpasswordagain' => 'អះអាង​ពាក្យ​សម្ងាត់',
+'createacct-yourpasswordagain-ph' => 'បញ្ចូលពាក្យសម្ងាត់ម្ដងទៀត',
 'remembermypassword' => 'ចងចាំកំណត់ឈ្មោះចូលរបស់ខ្ញុំក្នុងកុំព្យូទ័រនេះ (សំរាប់រយៈពេលយូរបំផុត $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})',
-'securelogin-stick-https' => 'នៅភ្ជាប់ទៅ HTTPS ដដែលបន្ទាប់ពីចុះឈ្មោះចូលហើយក៏ដោយ',
+'userlogin-remembermypassword' => 'រក្សាស្ថានភាពកត់ឈ្មោះចូលរបស់ខ្ញុំ',
+'userlogin-signwithsecure' => 'ប្រើការតភ្ជាប់មានសុវត្ថិភាព',
 'yourdomainname' => 'ដូម៉ែនរបស់អ្នក៖',
 'password-change-forbidden' => 'អ្នកមិនអាចផ្លាស់ប្ដូរពាក្យសម្ងាត់ក្នុងវិគីនេះទេ។',
 'externaldberror' => 'មាន​​បញ្ហាក្នុងការ​បញ្ជាក់​ផ្ទៀង​ផ្ទាត់​​មូលដ្ឋាន​ទិន្នន័យ​ ឬ​អ្នក​មិន​ត្រូវ​បាន​អនុញ្ញាត​ឲ្យ​បន្ទាន់​សម័យ​គណនី​ខាង​ក្រៅ​របស់​អ្នក​។​
@@ -690,18 +713,41 @@ $2',
 'logout' => 'កត់ឈ្មោះចេញ',
 'userlogout' => 'កត់ឈ្មោះចេញ',
 'notloggedin' => 'មិនទាន់កត់ឈ្មោះចូល',
+'userlogin-noaccount' => 'តើលោកអ្នក​មិនទាន់មាន​គណនី​សម្រាប់​ប្រើ​ទេ​ឬ?',
+'userlogin-joinproject' => 'សូមចូលជាសមាជិក {{SITENAME}}',
 'nologin' => "​បើលោកអ្នក​មិនទាន់មាន​គណនី​សម្រាប់​ប្រើ​ទេ​ សូម'''$1''' ។",
 'nologinlink' => 'បង្កើតគណនី',
 'createaccount' => 'បង្កើតគណនី',
 'gotaccount' => "បើលោកអ្នកមានគណនីសម្រាប់ប្រើហើយ  សូម'''$1'''។",
 'gotaccountlink' => 'កត់ឈ្មោះចូល',
 'userlogin-resetlink' => 'តើអ្នកភ្លេចព័ត៌មានលម្អិតសម្រាប់កត់ឈ្មោះចូលហើយ?',
+'userlogin-resetpassword-link' => 'ស្ដារពាក្យសម្ងាត់របស់អ្នក',
+'helplogin-url' => 'Help:ការកត់ឈ្មោះចូល',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ជំនួយក្នុងការកត់ឈ្មោះចូល]]',
+'createacct-join' => 'បំពេញព័ត៌មានរបស់អ្នកខាងក្រោម។',
+'createacct-another-join' => 'បញ្ចូលព័ត៌មានគណនីថ្មីខាងក្រោម។',
+'createacct-emailrequired' => 'អាសយដ្ឋានអ៊ីមែល',
+'createacct-emailoptional' => 'អាសយដ្ឋានអ៊ីមែល (ដាក់ក៏បានមិនដាក់ក៏បាន)',
+'createacct-email-ph' => 'បញ្ចូលអាសយដ្ឋានអ៊ីមែលរបស់អ្នក',
+'createacct-another-email-ph' => 'បញ្ចូលអាសយដ្ឋានអ៊ីមែល',
 'createaccountmail' => 'ប្រើប្រាស់ពាក្យសម្ងាត់ចៃដន្យបណ្ដោះអាសនុ្ន រួចផ្ញើវាទៅកាន់អាសយដ្ឋានអ៊ីមែលខាងក្រោម',
+'createacct-realname' => 'ឈ្មោះពិត (ដាក់ក៏បានមិនដាក់ក៏បាន)',
 'createaccountreason' => 'មូលហេតុ៖',
+'createacct-reason' => 'មូលហេតុ',
+'createacct-reason-ph' => 'មូលហេតុដែលអ្នកចង់បង្កើតគណនីមួយទៀត',
+'createacct-captcha' => 'ត្រួតពិនិត្យសុវត្ថិភាព',
+'createacct-imgcaptcha-ph' => 'បញ្ចូលឃ្លាដែលអ្នកឃើញខាងលើ',
+'createacct-submit' => 'បង្កើតគណនីរបស់អ្នក',
+'createacct-another-submit' => 'បង្កើតគណនីមួយទៀត',
+'createacct-benefit-heading' => '{{SITENAME}} ត្រូវបង្កើតឡើងដោយបុគ្គលស្ម័គ្រចិត្តដូចជាអ្នកជាដើម។',
+'createacct-benefit-body1' => '{{PLURAL:$1|កំណែ|កំណែ}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ទំព័រ|ទំព័រ}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|អ្នករួមចំណែក|អ្នករួមចំណែក}}ថ្មីៗ',
 'badretype' => 'ពាក្យសម្ងាត់ដែលអ្នកបានវាយបញ្ចូលនោះ គឺមិនស៊ីគ្នាទេ។',
 'userexists' => 'អត្តនាមដែលអ្នកបានវាយបញ្ចូលមានគេប្រើហើយ។
 សូមជ្រើសរើសអត្តនាមផ្សេងពីនេះ។',
 'loginerror' => 'កំហុសនៃការកត់ឈ្មោះចូល',
+'createacct-error' => 'បញ្ហាក្នុងការបង្កើតគណនី',
 'createaccounterror' => 'មិនអាចបង្កើតគណនីបានទេ៖ $1',
 'nocookiesnew' => 'គណនីប្រើប្រាស់របស់អ្នកត្រូវបានបង្កើតហើយ ក៏ប៉ុន្តែអ្នកមិនទាន់បានកត់ឈ្មោះចូលទេ។
 
@@ -781,9 +827,10 @@ $2',
 'usernamehasherror' => 'អត្តនាមមិនអាចមានតួអក្សរដែលជាសញ្ញាបានទេ',
 'login-throttled' => 'អ្នកបានកត់ឈ្មោះចូលមិនបានសម្រេចច្រើនដងពេកហើយ។​
 
-សូមរងចាំមួយរយៈ មុនពេលសាកល្បងម្ដងទៀត។',
+សូមរងចាំរយៈពេល$1 មុនពេលសាកល្បងម្ដងទៀត។',
 'login-abort-generic' => 'អ្នកចុះឈ្មោះចូលមិនបានសម្រេចទេ។ ការចុះឈ្មោះចូលត្រូវបានបោះបង់។',
 'loginlanguagelabel' => 'ភាសា៖ $1',
+'createacct-another-realname-tip' => 'អ្នកអាចផ្ដល់ឈ្មោះពិតរបស់អ្នកក៏បានមិនផ្ដល់ក៏បាន។ បើអ្នកផ្ដល់ឱ្យ វានឹងត្រូវបានប្រើប្រាស់់ដើម្បីបញ្ជាក់ភាពជាម្ចាស់​លើការរួមចំណែក​នានា​របស់អ្នក។',
 
 # Email sending
 'php-mail-error-unknown' => 'កំហុសមិនស្គាល់នៅក្នុងអនុគមន៍ mail() របស់ PHP',
@@ -801,7 +848,7 @@ $2',
 'newpassword' => 'ពាក្យសម្ងាត់ថ្មី៖',
 'retypenew' => 'សូមវាយពាក្យសម្ងាត់ថ្មី​ម្តងទៀត៖',
 'resetpass_submit' => 'ដាក់ប្រើពាក្យសម្ងាត់និង​កត់ឈ្មោះចូល',
-'resetpass_success' => 'ពាក្យសម្ងាត់របស់អ្នកត្រូវបានផ្លាស់ប្តូរបានសំរេចហើយ! ឥឡូវនេះកំពុងកត់ឈ្មោះចូល...',
+'changepassword-success' => 'ពាក្យសម្ងាត់របស់អ្នកត្រូវបានផ្លាស់ប្តូរបានសំរេចហើយ!',
 'resetpass_forbidden' => 'ពាក្យសម្ងាត់មិនអាចផ្លាស់ប្តូរបានទេ',
 'resetpass-no-info' => 'អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។',
 'resetpass-submit-loggedin' => 'ប្តូរពាក្យសម្ងាត់',
@@ -813,10 +860,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'កំណត់​ពាក្យសម្ងាត់​សាឡើងវិញ',
-'passwordreset-text' => 'បំពេញសំណុំបែបបទនេះដើម្បីស្ដារពាក្យសម្ងាត់របស់អ្នក។',
+'passwordreset-text-one' => 'បំពេញសំណុំបែបបទនេះដើម្បីស្ដារពាក្យសម្ងាត់របស់អ្នក។',
+'passwordreset-text-many' => '{{PLURAL:$1|សូមបំពេញក្នុងប្រអប់មួយក្នុងចំណោមប្រអប់ខាងក្រោមដើម្បីកំណត់ពាក្យសម្ងាត់របស់អ្នកឡើងវិញ។}}',
 'passwordreset-legend' => 'កំណត់​ពាក្យសម្ងាត់​សាឡើងវិញ',
 'passwordreset-disabled' => 'មុខងារប្ដូរទៅពាក្យសម្ងាត់ដើមត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។',
-'passwordreset-pretext' => '{{PLURAL:$1||វាយបញ្ចូលផ្នែកមួយនៃទិន្នន័យខាងក្រោម}}',
+'passwordreset-emaildisabled' => 'មុខងារអ៊ីមែលត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។',
 'passwordreset-username' => 'អត្តនាម៖',
 'passwordreset-domain' => 'ដូម៉ែន៖',
 'passwordreset-capture' => 'មើលអ៊ីមែលលទ្ធផល?',
@@ -845,7 +893,7 @@ $2
 ពាក្យសម្ងាត់បណ្ដោះអាសន្ន៖ $2',
 'passwordreset-emailsent' => 'អ៊ីមែលស្ដារពាក្យសម្ងាត់មួយត្រូវបានផ្ញើទៅហើយ។',
 'passwordreset-emailsent-capture' => 'អ៊ីមែលស្ដារពាក្យសម្ងាត់មួយដូចបង្ហាញខាងក្រោមត្រូវបានផ្ញើទៅហើយ។',
-'passwordreset-emailerror-capture' => 'អ៊ីមែលរំលឹកមួយដូចបង្ហាញខាងក្រោមត្រូវបានបង្កើតហើយ ប៉ុន្តែការផ្ញើទៅកាន់អ្នកប្រើប្រាស់មិនបានសំរេចទេ៖ $1',
+'passwordreset-emailerror-capture' => 'អ៊ីមែលស្ដារពាក្យសម្ងាត់មួយដូចបង្ហាញខាងក្រោមត្រូវបានបង្កើតហើយ ប៉ុន្តែការផ្ញើទៅកាន់ {{GENDER:$2|អ្នកប្រើប្រាស់}}មិនបានសំរេចទេ៖ $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល',
@@ -1068,12 +1116,15 @@ $2
 ទំព័រនេះហាក់ដូចជាត្រូវបានលុបចោលហើយ។',
 'edit-conflict' => 'កែប្រែ​ភាពឆ្គង​។',
 'edit-no-change' => 'ការកែប្រែរបស់អ្នកត្រូវបានមិនទុកជាការទេ ព្រោះគ្មានការផ្លាស់ប្ដូរណាមួយត្រូវបានធ្វើនៅលើអត្ថបទនេះទេ។',
+'postedit-confirmation' => 'កំណែប្រែរបស់អ្នកត្រូវបានរក្សាទុកហើយ។',
 'edit-already-exists' => 'មិនអាចបង្កើតទំព័រថ្មីមួយទេ។
 
 ទំព័រនេះមានរួចហើយ។',
 'defaultmessagetext' => 'អត្ថបទសារតាមលំនាំដើម',
 'invalid-content-data' => 'ខ្លឹមសារទិន្នន័យគ្មានសុពលភាព',
 'content-not-allowed-here' => 'មិនអនុញ្ញាតិអោយសរសេរខ្លឹមសារ"$1" នៅលើទំព័រ [[$2]] ទេ។',
+'editwarning-warning' => 'ចាកចេញពីទំព័រនេះ នឹងធ្វើឲ្យអ្នកបាត់បង់កំណែប្រែដែលអ្នកបានធ្វើ។
+ប្រសិនបើអ្នកបាន​កត់ឈ្មោះចូលរួចហើយ អ្នកអាច​បិទ​បម្រាម​នេះ​នៅ​ក្នុងផ្នែក​ "កែប្រែ" នៃ​ចំណង់ចំណូល​ចិត្ត​របស់​អ្នក​។',
 
 # Content models
 'content-model-wikitext' => 'អត្ថបទវិគី',
@@ -1098,6 +1149,7 @@ $2
 'undo-failure' => 'កំណែ​មិន​អាច​មិន​ធ្វើ​ឡើង​វិញ​បាន​ទេ​ ដោយ​សារ​ការ​ធ្វើ​ឲ្យ​មាន​ជម្លោះ​កំណែ​នៅ​ចន្លោះ​កណ្ដាល​។',
 'undo-norev' => 'កំណែ​មិន​អាច​មិន​ធ្វើ​ឡើង​វិញ​បាន​ទេ​ ពីព្រោះ​វា​មិន​មាន​ឬ​ត្រូវ​បាន​លុប​បាត់​ទៅ​ហើយ​។',
 'undo-summary' => 'មិន​ធ្វើ​វិញ​នូវ​កំណែ​ប្រែ $1 ដោយ​ [[Special:Contributions/$2|$2]] ([[User talk:$2|ការពិភាក្សា​]])',
+'undo-summary-username-hidden' => 'មិន​ធ្វើ​វិញ​នូវ​កំណែ​ប្រែ $1 ដោយអ្នកប្រើប្រាស់លាក់ឈ្មោះ',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'មិនអាចបង្កើតគណនីបានទេ',
@@ -1270,6 +1322,7 @@ $1",
 'compareselectedversions' => 'ប្រៀបធៀប​កំណែដែលបាន​ជ្រើសយក',
 'showhideselectedversions' => 'បង្ហាញ​/លាក់​កំណែប្រែ​ដែលបាន​ជ្រើសយក',
 'editundo' => 'មិនធ្វើវិញ',
+'diff-empty' => '(គ្មានភាពខុសគ្នា)',
 'diff-multi' => '({{PLURAL:$1|កំណែប្រែកម្រិតបង្គួរមួយ|កំណែប្រែកម្រិតបង្គួរចំនួន $1}}មិនត្រូវបានបង្ហាញ)',
 'diff-multi-manyusers' => '({{PLURAL:$1|កំណែប្រែកម្រិតបង្គួរមួយ|កំណែប្រែកម្រិតបង្គួរចំនួន $1}}មិនត្រូវបានបង្ហាញ)',
 'difference-missing-revision' => ' {{PLURAL:$2|រកមិនឃើញ|រកមិនឃើញ}}{{PLURAL:$2|កំណែមួយ|កំណែចំនួន $2}} របស់ភាពខុសគ្នានេះ ($1) ទេ។
@@ -1297,7 +1350,6 @@ $1",
 'searchmenu-legend' => 'ជម្រើសនានាក្នុងការស្វែងរក',
 'searchmenu-exists' => "* ទំព័រ '''[[$1]]'''",
 'searchmenu-new' => "'''បង្កើតទំព័រ \"[[:\$1]]\" នៅ​លើ​វិគី​នេះ!'''",
-'searchhelp-url' => 'Help:មាតិកា',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|រុក​រក​ក្នុង​ទំព័រ​នានា​ជាមួយ​បុព្វបទ​នេះ​]]',
 'searchprofile-articles' => 'ទំព័រ​មាតិកា',
 'searchprofile-project' => 'ជំនួយ និង​ទំព័រ​គម្រោង',
@@ -1341,15 +1393,7 @@ $1",
 'searchdisabled' => 'ឧបករណ៍​ស្វែងរក​របស់​{{SITENAME}} មិនបានអនុញ្ញាត​។
 ក្នុង​ពេល​ឥឡូវ​នេះ​ អ្នកអាច​ស្វែង​រក​តាម​រយៈ​ Google បាន​។
 សូមចងចាំ​ថា​ លិបិក្រម​នៃ​មាតិការ​របស់​{{SITENAME}} អាចហួស​សម័យ​។​',
-
-# Quickbar
-'qbsettings' => 'របារទាន់ចិត្ត',
-'qbsettings-none' => 'ទទេ',
-'qbsettings-fixedleft' => 'ចុងខាងឆ្វេង',
-'qbsettings-fixedright' => 'ចុងខាងស្តាំ',
-'qbsettings-floatingleft' => 'អណ្តែតឆ្វេង',
-'qbsettings-floatingright' => 'អណ្តែតស្តាំ',
-'qbsettings-directionality' => 'នៅមួយកន្លែង, អាស្រ័យលើទិសដៅសរសេររបស់ភាសារបស់អ្នក',
+'search-error' => 'មានបញ្ហាពេលកំពុងស្វែងរក៖ $1',
 
 # Preferences page
 'preferences' => 'ចំណង់ចំណូលចិត្ត',
@@ -1384,7 +1428,6 @@ $1",
 'resetprefs' => 'លុបចោលបន្លាស់ប្ដូរមិនបានរក្សាទុក',
 'restoreprefs' => 'ស្ដារ​ការកំណត់​ទាំងអស់​ទៅ​លំនាំដើម (គ្រប់ផ្នែកទាំងអស់)',
 'prefs-editing' => 'កំណែប្រែ',
-'prefs-edit-boxsize' => 'ទំហំរបស់ផ្ទាំងកែប្រែទំព័រ។',
 'rows' => 'ជួរដេក៖',
 'columns' => 'ជួរឈរ៖',
 'searchresultshead' => 'ស្វែងរក',
@@ -1395,6 +1438,9 @@ $1",
 'recentchangesdays-max' => '(អតិបរមា $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})',
 'recentchangescount' => 'ចំនួន​កំណែប្រែ​ដែល​ត្រូវ​បង្ហាញ​តាមលំនាំដើម:',
 'prefs-help-recentchangescount' => 'រាប់បញ្ចូលទាំងការកែប្រែនាពេលថ្មី ប្រវត្តិទំព័រនិងកំណត់ហេតុនានា។',
+'prefs-help-watchlist-token2' => 'នេះជាសោរសម្ងាត់សម្រាប់មើលបញ្ជីតាមដានរបស់អ្នកតាម web feed ។
+អ្នកដែលដឹងសោរសម្ងាត់នេះនឹងអាចមើលបញ្ជីតាមដានរបស់អ្នក ហេតុនេះសូមកុំចែកចាយអោយគេដឹង។
+[[Special:ResetTokens|ចុចទីនេះបើអ្នកចង់កំណត់វាឡើងវិញ]]។',
 'savedprefs' => 'ចំណង់ចំណូលចិត្តនានារបស់អ្នកត្រូវបានរក្សាទុកហើយ។',
 'timezonelegend' => 'ល្វែង​ម៉ោង:',
 'localtime' => 'ម៉ោងក្នុងស្រុក​៖',
@@ -1425,7 +1471,6 @@ $1",
 'prefs-reset-intro' => 'អ្នក​អាច​ប្រើ​ទំព័រ​នេះ​ដើម្បី​កំណត់​ឡើង​វិញ​នូវ​ចំណូល​ចិត្ត​របស់​អ្នក​ដូច​លំនាំ​ដើម​របស់​តំបន់​វិញ​។
 សកម្មភាព​នេះ​មិន​អាច​ធ្វើ​ឡើង​វិញ​បាន​ទេ​។',
 'prefs-emailconfirm-label' => 'បញ្ជាក់ទទួលស្គាល់អ៊ីមែល៖',
-'prefs-textboxsize' => 'ទំហំរបស់ផ្ទាំងកែប្រែទំព័រ',
 'youremail' => 'អ៊ីមែល៖',
 'username' => '{{GENDER:$1|អត្តនាម}}៖',
 'uid' => 'អត្តលេខ{{GENDER:$1|អ្នកប្រើប្រាស់}}៖',
@@ -1456,6 +1501,8 @@ $1",
 'prefs-dateformat' => 'ទំរង់កាលបរិច្ឆេទ',
 'prefs-timeoffset' => 'កែប្រែម៉ោង',
 'prefs-advancedediting' => 'ជម្រើសទូទៅ​',
+'prefs-editor' => 'អ្នកកែប្រែ',
+'prefs-preview' => 'មើលជាមុន',
 'prefs-advancedrc' => 'ជំរើសថ្នាក់ខ្ពស់',
 'prefs-advancedrendering' => 'ជំរើសថ្នាក់ខ្ពស់',
 'prefs-advancedsearchoptions' => 'ជំរើសថ្នាក់ខ្ពស់',
@@ -1463,7 +1510,9 @@ $1",
 'prefs-displayrc' => 'ជំរើសការបង្ហាញ',
 'prefs-displaysearchoptions' => 'ជំរើសការបង្ហាញ',
 'prefs-displaywatchlist' => 'ជំរើសការបង្ហាញ',
+'prefs-tokenwatchlist' => 'កូនសោរ',
 'prefs-diffs' => 'ភាពខុសគ្នា',
+'prefs-help-prefershttps' => 'ចំណង់ចំណូលចិត្តនេះនឹងមានប្រសិទ្ធិភាពពេលអ្នកកត់ឈ្មោះចូលលើកក្រោយ។',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'អាសយដ្ឋានអ៊ីមែលហាក់មានសុពលភាព',
@@ -1490,6 +1539,8 @@ $1",
 'userrights-notallowed' => 'លោកអ្នកគ្មានការអនុញ្ញាតដើម្បីបន្ថែមឬដកសិទ្ធិរបស់អ្នកប្រើប្រាស់ដទៃទេ។',
 'userrights-changeable-col' => 'ក្រុមនានាដែលអ្នកអាចផ្លាស់ប្ដូរបាន',
 'userrights-unchangeable-col' => 'ក្រុមនានាដែលអ្នកមិនអាចផ្លាស់ប្ដូរបាន',
+'userrights-conflict' => 'មានទំនាស់អំពីការកែប្រែសិទ្ធិអ្នកប្រើប្រាស់! សូមត្រួតពិនិត្យឡើងវិញរួចអះអាងពីការកែប្រែរបស់អ្នក។',
+'userrights-removed-self' => 'អ្នកបានដកសិទ្ធិខ្លួនឯងបានសម្រេចហើយ។ ហេតុនេះ អ្នកមិនអាចចូលមើលទំព័រនេះតទៅទៀតទេ។',
 
 # Groups
 'group' => 'ក្រុម៖',
@@ -1553,11 +1604,18 @@ $1",
 'right-proxyunbannable' => 'ពង្វាងការរាំងខ្ទប់ស្វ័យប្រវត្តិរបស់ប្រុកស៊ី',
 'right-unblockself' => 'ឈប់រាំងខ្ទប់នរណាម្នាក់',
 'right-protect' => 'ប្ដូរកម្រិតការពាររួចកែប្រែទំព័រដែលបានការពារជាថ្នាក់',
-'right-editprotected' => 'កែប្រែទំព័រដែលបានការពារ (ដោយមិនរំលាយការការពារ)',
+'right-editprotected' => 'កែប្រែទំព័រដែលបានការពារដោយ "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'កែប្រែទំព័រដែលបានការពារដោយ "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'កែប្រែអន្តរមុខអ្នកប្រើប្រាស់',
 'right-editusercssjs' => 'កែប្រែឯកសារ CSS និង JS របស់អ្នកប្រើប្រាស់ផ្សេងទៀត',
 'right-editusercss' => 'កែប្រែឯកសារ CSS របស់អ្នកប្រើប្រាស់ផ្សេងទៀត',
 'right-edituserjs' => 'កែប្រែឯកសារ JavaScript របស់អ្នកប្រើប្រាស់ផ្សេងទៀត',
+'right-editmyusercss' => 'កែប្រែឯកសារ CSS របស់ខ្លួនអ្នកផ្ទាល់',
+'right-editmyuserjs' => 'កែប្រែឯកសារ JavaScript របស់ខ្លួនអ្នកផ្ទាល់',
+'right-viewmywatchlist' => 'មើលបញ្ជីតាមដានរបស់អ្នកខ្លួនអ្នកផ្ទាល់',
+'right-viewmyprivateinfo' => 'មើលទិន្នទ័យឯកជនរបស់ខ្លួនអ្នកផ្ទាល់ (ឧ៖ អាសយដ្ឋានអ៊ីមែល, ឈ្មោះពិត)',
+'right-editmyprivateinfo' => 'កែប្រែទិន្នទ័យឯកជនរបស់ខ្លួនអ្នកផ្ទាល់ (ឧ៖ អាសយដ្ឋានអ៊ីមែល, ឈ្មោះពិត)',
+'right-editmyoptions' => 'កែប្រែចំណង់ចំណូលចិត្តរបស់ខ្លួនអ្នកផ្ទាល់',
 'right-rollback' => 'ត្រឡប់យ៉ាងរហ័សនូវកំណែប្រែទំព័រវិសេសណាមួយ​ដែលធ្វើឡើងដោយ​អ្នកប្រើប្រាស់ចុងក្រោយគេ។',
 'right-markbotedits' => 'ចំណាំកំណែប្រែត្រឡប់ឡើងវិញទាំងឡាយថាជាកំណែប្រែដោយរូបយន្ត',
 'right-noratelimit' => 'មិនទទួលរងឥទ្ធិពលពីការដាក់កំហិតណាទាំងអស់',
@@ -1619,9 +1677,15 @@ $1",
 'action-userrights-interwiki' => 'កែប្រែសិទ្ធិនានារបស់អ្នកប្រើប្រាស់នៅលើវិគីដទៃ',
 'action-siteadmin' => 'ចាក់សោឬដោះសោមូលដ្ឋានទិន្នន័យ',
 'action-sendemail' => 'ផ្ញើអ៊ីមែល',
+'action-editmywatchlist' => 'កែប្រែបញ្ជីតាមដានរបស់អ្នក',
+'action-viewmywatchlist' => 'មើលបញ្ជីតាមដានរបស់អ្នក',
+'action-viewmyprivateinfo' => 'មើលព័ត៌មានឯកជនរបស់អ្នក',
+'action-editmyprivateinfo' => 'កែប្រែព័ត៌មានឯកជនរបស់អ្នក',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|បន្លាស់ប្ដូរ|បន្លាស់ប្ដូរ}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|គិតតាំងពីការបើកមើលចុងក្រោយ}}',
+'enhancedrc-history' => 'ប្រវត្តិ',
 'recentchanges' => 'បន្លាស់ប្ដូរ​ថ្មីៗ',
 'recentchanges-legend' => 'ជម្រើសនានា​ សម្រាប់ការបង្ហាញបន្លាស់ប្ដូរថ្មីៗ',
 'recentchanges-summary' => 'តាមដានរាល់បំលាស់ប្ដូរថ្មីៗបំផុតចំពោះវិគីនៅលើទំព័រនេះ។',
@@ -1662,7 +1726,6 @@ $1",
 'recentchangeslinked-feed' => 'បន្លាស់ប្ដូរពាក់ព័ន្ធ',
 'recentchangeslinked-toolbox' => 'បន្លាស់ប្ដូរពាក់ព័ន្ធ',
 'recentchangeslinked-title' => 'បន្លាស់ប្ដូរ​ពាក់ព័ន្ធនឹង "$1"',
-'recentchangeslinked-noresult' => 'គ្មានបន្លាស់ប្ដូរ​លើទំព័រ​ដែលត្រូវបានតភ្ជាប់ ក្នុងថេរវេលា​ដែលត្រូវបានផ្តល់ឱ្យ ។',
 'recentchangeslinked-summary' => "នេះជាបញ្ជីបន្លាស់ប្ដូរនានា ដែលត្រូវបានធ្វើឡើងនៅលើទំព័រទាំងឡាយ ដែលមានតំណភ្ជាប់ពីទំព័រកំណត់មួយ(ឬ មានតំណភ្ជាប់ទៅទំព័រ ដែលមានក្នុងចំណាត់ថ្នាក់ក្រុមណាមួយ) នាពេលថ្មីៗនេះ ។ ទំព័រ​នានាក្នុង[[Special:Watchlist|បញ្ជីតាមដាន​របស់អ្នក]]ត្រូវបានសរសេរជា '''អក្សរដិត''' ។",
 'recentchangeslinked-page' => 'ឈ្មោះទំព័រ៖',
 'recentchangeslinked-to' => 'បង្ហាញ​បន្លាស់ប្ដូររបស់​ទំព័រដែល​មានតំណភ្ជាប់នឹង​ទំព័រ​ដែល​បាន​ផ្ដល់​ឱ្យ​​វិញ',
@@ -1673,7 +1736,7 @@ $1",
 'reuploaddesc' => 'ឈប់ផ្ទុកឡើងរួចត្រឡប់ទៅបែបបទផ្ទុកឡើងវិញ។',
 'upload-tryagain' => 'ដាក់ស្នើការពណ៌នារបស់ឯកសារដែលបានកែរួច',
 'uploadnologin' => 'មិនទាន់កត់ឈ្មោះចូលទេ',
-'uploadnologintext' => 'អ្នកត្រូវតែ [[Special:UserLogin|កត់ឈ្មោះចូល]] ដើម្បីមានសិទ្ធិផ្ទុកឯកសារទាំងឡាយឡើង។',
+'uploadnologintext' => 'អ្នកត្រូវតែ $1 ដើម្បីផ្ទុកឯកសារឡើង។',
 'upload_directory_missing' => 'ថតសំរាប់ទុកឯកសារផ្ទុកឡើង ($1) បាត់ ហើយប្រព័ន្ធបំរើការមិនអាចបង្កើតវាបានទេ។',
 'upload_directory_read_only' => 'ប្រព័ន្ធបម្រើការមិនអាចសរសេរចូលទៅក្នុងថតសំរាប់ទុកឯកសារផ្ទុកឡើង ($1) ទេ។',
 'uploaderror' => 'បញ្ហាក្នុងការផ្ទុកឡើង',
@@ -1862,7 +1925,6 @@ $1',
 
 # HTTP errors
 'http-invalid-url' => 'URLមិនត្រឹមត្រូវ៖ $1',
-'http-host-unreachable' => 'មិនអាចទៅកាន់URLបានទេ',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'មិនអាច ចូលទៅដល់ URL',
@@ -1895,6 +1957,10 @@ $1',
 'listfiles_size' => 'ទំហំ',
 'listfiles_description' => 'ការពិពណ៌នា',
 'listfiles_count' => 'កំណែ',
+'listfiles-show-all' => 'រាប់បញ្ចូលទាំងកំណែចាស់ៗរបស់រូបភាព',
+'listfiles-latestversion' => 'កំណែបច្ចុប្បន្ន',
+'listfiles-latestversion-yes' => 'បាទ / ចាស៎',
+'listfiles-latestversion-no' => 'ទេ',
 
 # File description page
 'file-anchor-link' => 'ឯកសារ',
@@ -1991,6 +2057,13 @@ $1',
 'randompage' => 'ទំព័រចៃដន្យ',
 'randompage-nopages' => 'គ្មាន​ទំព័រ​ណាមួយ​ក្នុង​{{PLURAL:$2|លំហឈ្មោះ}}នេះ​ទេ៖ "$1" ។',
 
+# Random page in category
+'randomincategory' => 'ទំព័រចៃដន្យក្នុងចំណាត់ថ្នាក់ក្រុម',
+'randomincategory-invalidcategory' => '"$1" មិនមែនជាឈ្មោះចំណាតក្រុមត្រឹមត្រូវ។',
+'randomincategory-nopages' => 'គ្មានទំព័រណាមួយក្នុងចំណាត់ថ្នាក់ក្រុម [[:Category:$1|$1]] ទេ។',
+'randomincategory-selectcategory' => 'បង្ហាញទំព័រចៃដន្យពីចំណាត់ថ្នាក់ក្រុម៖ $1 $2។',
+'randomincategory-selectcategory-submit' => 'ទៅ',
+
 # Random redirect
 'randomredirect' => 'ទំព័របញ្ជូនបន្តចៃដន្យ',
 'randomredirect-nopages' => 'គ្មានទំព័របញ្ជូនបន្តណាមួយនៅក្នុងប្រភេទ "$1" ទេ។',
@@ -2016,13 +2089,6 @@ $1',
 'statistics-users-active-desc' => 'អ្នក​ប្រើប្រាស់​ដែល​បាន​អនុវត្ត​សកម្មភាព​ក្នុង​{{PLURAL:$1|ថ្ងៃ​}}ចុង​ក្រោយ​',
 'statistics-mostpopular' => 'ទំព័រដែលត្រូវបានមើលច្រើនបំផុត',
 
-'disambiguations' => 'ទំព័រដែលភ្ជាប់ទៅទំព័រមានចំណងជើងស្រដៀងគ្នា',
-'disambiguationspage' => 'Template:ស្រដៀងគ្នា',
-'disambiguations-text' => "ទំព័រទាំងឡាយខាងក្រោមនេះមិនតំណភ្ជាប់យ៉ាងតិចមួយដែលភ្ជាប់ទៅកាន់'''ទំព័រពាក្យស្រដៀងគ្នា'''។
-
-ទំព័រទាំងនេះគួរតែភ្ជាប់ទៅទំព័រត្រឹមត្រូវជាងនេះវិញ។<br />
-ទំព័រមួយត្រូវចាត់ទុកជាទំព័រពាក្យស្រដៀងគ្នា ប្រសិនបើវាប្រើទំព័រគំរូដែលភ្ជាប់មកពី[[MediaWiki:Disambiguationspage]]",
-
 'doubleredirects' => 'ទំព័របញ្ជូនបន្តទ្វេដង',
 'doubleredirectstext' => 'ទំព័រនេះរាយឈ្មោះទំព័រដែលបញ្ជូនបន្តទៅទំព័របញ្ជូនបន្ដផ្សេងទៀត។
 
@@ -2079,6 +2145,7 @@ $1',
 'mostrevisions' => 'អត្ថបទដែលត្រូវបានកែប្រែច្រើនបំផុត',
 'prefixindex' => 'ទំព័រ​ទាំង​អស់​ជាមួយ​បុព្វបទ',
 'prefixindex-namespace' => 'ទំព័រទាំងអស់ដែលមានបុព្វបទ (លំហឈ្មោះ $1)',
+'prefixindex-strip' => 'កាត់ចោលបុព្វបទក្នុងបញ្ជី',
 'shortpages' => 'ទំព័រខ្លីៗ',
 'longpages' => 'ទំព័រវែងៗ',
 'deadendpages' => 'ទំព័រ​ទាល់',
@@ -2268,10 +2335,9 @@ $1',
 'unwatchthispage' => 'ឈប់តាមដាន',
 'notanarticle' => 'មិនមែនជាទំព័រមាតិកា',
 'notvisiblerev' => 'ការកែតម្រូវត្រូវបានលុបចោល',
-'watchnochange' => 'មិនមានរបស់ដែលអ្នកកំពុងតាមដានណាមួយត្រូវបានគេកែប្រែក្នុងកំលុងពេលដូលដែលបានបង្ហាញទេ។',
 'watchlist-details' => '{{PLURAL:$1|$1 page|ទំព័រ $1}}នៅក្នុងបញ្ជីតាមដានរបស់អ្នក ដោយមិនរាប់បញ្ចូលទំព័រពិភាក្សា។',
-'wlheader-enotif' => '* អនុញ្ញាតឱ្យមានការផ្ដល់ដំណឹងតាមរយៈអ៊ីមែល',
-'wlheader-showupdated' => "* ទំព័រដែលត្រូវបានផ្លាស់ប្តូរតាំងពីពេលចូលមើលចុងក្រោយរបស់អ្នក ត្រូវបានបង្ហាញជា '''អក្សរដិត'''",
+'wlheader-enotif' => 'បើកប្រើការផ្ដល់ដំណឹងតាមរយៈអ៊ីមែល។',
+'wlheader-showupdated' => "ទំព័រដែលត្រូវបានផ្លាស់ប្តូរតាំងពីពេលចូលមើលចុងក្រោយរបស់អ្នក ត្រូវបានបង្ហាញជា '''អក្សរដិត'''។",
 'watchmethod-recent' => 'ឆែកមើលកំណែប្រែថ្មីៗចំពោះទំព័រត្រូវបានតាមដាន',
 'watchmethod-list' => 'ឆែកមើលទំព័រត្រូវបានតាមដានចំពោះកំណែប្រែថ្មីៗ',
 'watchlistcontains' => 'បញ្ជីតាមដាន របស់អ្នក មាន $1 {{PLURAL:$1|ទំព័រ|ទំព័រ}}។',
@@ -2666,13 +2732,10 @@ $1',
 
 វាប្រហែលជាត្រូវបានគេដកការហាមឃាត់ហើយ។',
 'ip_range_invalid' => 'ដែនកំណត់ IP គ្មានសុពលភាព។',
-'blockme' => 'ហាមឃាត់ខ្ញុំ',
 'proxyblocker' => 'កម្ម​វិធី​​រាំង​ផ្ទប់​ប្រូកស៊ី (Proxy)',
-'proxyblocker-disabled' => 'មុខងារនេះត្រូវបានអសកម្ម។',
 'proxyblockreason' => 'អាសយដ្ឋាន IP របស់អ្នកត្រូវបានរាំងខ្ទប់ហើយ ពីព្រោះវាជាប្រុកស៊ី(proxy)ចំហ។
 
 សូមទំនាក់ទំនងអ្នកផ្ដល់សេវាអ៊ីនធឺណិតឬអ្នកបច្ចេកទេសរបស់អ្នក ហើយប្រាប់ពួកគេពីបញ្ហាសុវត្ថិភាពដ៏សំខាន់នេះ។',
-'proxyblocksuccess' => 'រួចរាល់ជាស្ថាពរ។',
 'sorbsreason' => 'អាសយដ្ឋាន IP របស់អ្នកមានឈ្មោះក្នុងបញ្ជីប្រុកស៊ី(proxy)ចំហ នៅក្នុង DNSBL របស់ {{SITENAME}}។',
 'sorbs_create_account_reason' => 'អាសយដ្ឋាន IP របស់អ្នកមានឈ្មោះក្នុងបញ្ជីប្រុកស៊ី(proxy)ចំហ នៅក្នុង DNSBL របស់ {{SITENAME}}។
 
@@ -2936,13 +2999,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើគ្រប់សំបកទាំងអស់ */',
-'standard.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Standard */',
-'nostalgia.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Nostalgia */',
 'cologneblue.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Cologne Blue */',
 'monobook.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Monobook */',
-'myskin.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក MySkin */',
-'chick.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Chick */',
-'simple.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Simple */',
 'modern.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Modern */',
 'vector.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Vector */',
 
@@ -3012,13 +3070,8 @@ $1',
 'pageinfo-category-files' => 'ចំនួនឯកសារ',
 
 # Skin names
-'skinname-standard' => 'បុរាណ',
-'skinname-nostalgia' => 'អាឡោះអាល័យ',
 'skinname-cologneblue' => 'ទឹកអប់ខៀវ',
 'skinname-monobook' => 'សៀវភៅឯក',
-'skinname-myskin' => 'សំបកខ្ញុំ',
-'skinname-chick' => 'កូនមាន់',
-'skinname-simple' => 'សាមញ្ញ',
 'skinname-modern' => 'ទំនើប',
 'skinname-vector' => 'វ៉ិចទ័រ​​',
 
@@ -3091,11 +3144,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 នាទី|$1 នាទី}}',
 'hours' => '{{PLURAL:$1|$1 ម៉ោង|$1 ម៉ោង}}',
 'days' => '{{PLURAL:$1|$1 ថ្ងៃ|$1 ថ្ងៃ}}',
+'weeks' => '{{PLURAL: $1|$1 សប្តាហ៍|$1 សប្តាហ៍}}',
 'months' => '{{PLURAL:$1|$1 ខែ|$1 ខែ}}',
 'years' => '{{PLURAL:$1|$1 ឆ្នាំ|$1 ឆ្នាំ}}',
 'ago' => '$1 មុន',
 'just-now' => 'អំបាញ់មិញនេះ',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ម៉ោង|ម៉ោង}}មុន',
+'minutes-ago' => '$1 {{PLURAL:$1|នាទី|នាទី}}មុន',
+'seconds-ago' => '$1 {{PLURAL:$1|វិនាទី|វិនាទី}}មុន',
+'monday-at' => 'ថ្ងៃច័ន្ទនៅ $1',
+'tuesday-at' => 'ថ្ងៃអង្គារនៅ $1',
+'wednesday-at' => 'ថ្ងៃពុធនៅ $1',
+'thursday-at' => 'ថ្ងៃព្រហស្បតិ៍នៅ $1',
+'friday-at' => 'ថ្ងៃសុក្រនៅ $1',
+'saturday-at' => 'ថ្ងៃសៅរ៍នៅ $1',
+'sunday-at' => 'ថ្ងៃអាទិត្យនៅ $1',
+'yesterday-at' => 'ម្សិលមិញនៅ $1',
+
 # Bad image list
 'bad_image_list' => 'ទម្រង់ ដូចតទៅ ៖
 
@@ -3122,7 +3189,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ទទឹង',
 'exif-imagelength' => 'កម្ពស់',
 'exif-bitspersample' => '',
@@ -3232,7 +3299,7 @@ $1',
 'exif-originalimageheight' => 'កំពស់របស់រូបភាពមុនពេលកាត់តំរឹម',
 'exif-originalimagewidth' => 'ទទឹងរបស់រូបភាពមុនពេលកាត់តំរឹម',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'លែងបានបង្ហាប់',
 
 'exif-copyrighted-true' => 'រក្សាសិទ្ឋ',
@@ -3568,7 +3635,6 @@ $5
 'version-skins' => 'សំបក',
 'version-other' => 'ផ្សេង',
 'version-mediahandlers' => 'កម្មវិធី​បើក​មេឌា​ (Media handlers)',
-'version-extension-functions' => 'មុខងារផ្នែកបន្ថែម',
 'version-hook-name' => 'ឈ្មោះ​ Hook',
 'version-hook-subscribedby' => 'បានជាវ ជាប្រចាំ ដោយ',
 'version-version' => '(កំណែ $1)',
@@ -3580,15 +3646,6 @@ $5
 'version-software-version' => 'កំណែ',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'ផ្លូវនៃឯកសារ',
-'filepath-page' => 'ឯកសារ៖',
-'filepath-submit' => 'ទៅ',
-'filepath-summary' => 'ទំព័រពិសេសនេះ បង្ហាញផ្លូវពេញលេញ នៃ មួយឯកសារ។
-រូបភាពត្រូវបានបង្ហាញ ជាភាពម៉ត់ខ្ពស់, ប្រភេទឯកសារ ដទៃទៀត ធ្វើការដោយផ្ទាល់ ជាមួយ សហកម្មវិធី ។
-
-បញ្ចូល ឈ្មោះឯកសារ ដោយគ្មានការភ្ជាប់ "{{ns:file}}:" នៅពីមុខវា ។',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ស្វែងរកឯកសារដូចគ្នាបេះបិទ',
 'fileduplicatesearch-legend' => 'ស្វែងរកឯកសារដូចគ្នាបេះបិទ',
@@ -3665,6 +3722,9 @@ $5
 'htmlform-submit' => 'ដាក់ស្នើ',
 'htmlform-reset' => 'ធ្វើដូចដើមវិញ',
 'htmlform-selectorother-other' => 'ផ្សេងទៀត',
+'htmlform-no' => 'ទេ',
+'htmlform-yes' => 'ព្រម',
+'htmlform-chosen-placeholder' => 'ជ្រើសយកជម្រើសមួយ',
 
 # New logging system
 'logentry-delete-delete' => '$1 {{GENDER:$2|បានលុប}} ទំព័រ $3 ចោល',
diff --git a/languages/messages/MessagesKn.php b/languages/messages/MessagesKn.php
index bf28cab8..060371e9 100644
--- a/languages/messages/MessagesKn.php
+++ b/languages/messages/MessagesKn.php
@@ -94,9 +94,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ಪುಟವನ್ನು ವೀಕ್ಷಿಸುತ್ತಿರುವ ಸದಸ್ಯರ ಸಂಖ್ಯೆಯನ್ನು ತೋರಿಸು',
 'tog-oldsig' => 'ಪ್ರಸ್ತುತ ಸಹಿ',
 'tog-fancysig' => 'ಸರಳ ಸಹಿಗಳು (ಕೊಂಡಿ ಇಲ್ಲದಿರುವಂತೆ)',
-'tog-externaleditor' => 'ಬಾಹ್ಯ ಸಂಪಾದನೆ ಸಲಕರಣೆಯನ್ನು ಯಾವಾಗಲೂ ಉಪಯೋಗಿಸು (ಅನುಭವ ಹೊಂದಿರುವ ಬಳಕೆದಾರರಿಗೆ ಮಾತ್ರ, ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿ ವಿಶೇಷ ಬದಲಾವಣೆಗಳು ಬೇಕಾಗುತ್ತದೆ)',
-'tog-externaldiff' => 'ಬಾಹ್ಯ ಅಂತರದರ್ಶಕವನ್ನು ಯಾವಗಲೂ ಉಪಯೋಗಿಸು (ಅನುಭವ ಹೊಂದಿರುವ ಬಳಕೆದಾರರಿಗೆ ಮಾತ್ರ, ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿ ವಿಶೇಷ ಬದಲಾವಣೆಗಳು ಬೇಕಾಗುತ್ತದೆ)',
-'tog-showjumplinks' => 'ಶಕ್ತಗೊಳಿಸಲು "ನೆಗೆ ಇಲ್ಲಿಗೆ" ಲಭ್ಯಕೆ ಕೊಡ',
 'tog-uselivepreview' => 'ನೇರ ಮುನ್ನೋಟವನ್ನು ಉಪಯೋಗಿಸು (JavaScript) (ಪ್ರಾಯೋಗಿಕ)',
 'tog-forceeditsummary' => 'ಸಂಪಾದನೆ ಸಾರಾಂಶವನ್ನು ಖಾಲಿ ಬಿಟ್ಟಲ್ಲಿ ನೆನಪಿಸು',
 'tog-watchlisthideown' => 'ವೀಕ್ಷಣಾ ಪಟ್ಟಿಯಲ್ಲಿ ನನ್ನ ಸಂಪಾದನೆಗಳನ್ನು ತೋರಿಸಬೇಡ',
@@ -109,6 +106,7 @@ $messages = array(
 'tog-diffonly' => 'ವ್ಯತ್ಯಾಸಗಳ ಕೆಳಗಿರುವ ಪುಟದ ವಿವರಗಳನ್ನು ತೋರಿಸಬೇಡ',
 'tog-showhiddencats' => 'ಅಡಗಿಸಲ್ಪಟ್ಟ ವರ್ಗಗಳನ್ನು ತೋರಿಸು',
 'tog-norollbackdiff' => 'ತೊಡೆದುಹಾಕಿದ ನಂತರ ವ್ಯತ್ಯಸವನ್ನು ಬಿದು',
+'tog-useeditwarning' => 'ಸಂಪಾದನೆಯನ್ನು ಉಳಿಸದೆ ಹೊರಟಲ್ಲಿ ನನಗೆ ಎಚ್ಚರಿಸು',
 
 'underline-always' => 'ಯಾವಾಗಲೂ',
 'underline-never' => 'ಎಂದಿಗೂ ಇಲ್ಲ',
@@ -172,6 +170,18 @@ $messages = array(
 'oct' => 'ಅಕ್ಟೋಬರ್',
 'nov' => 'ನವೆಂಬರ್',
 'dec' => 'ಡಿಸೆಂಬರ್',
+'january-date' => 'ಜನವರಿ $1',
+'february-date' => 'ಫೆಬ್ರುವರಿ $1',
+'march-date' => 'ಮಾರ್ಚ್ $1',
+'april-date' => 'ಎಪ್ರಿಲ್ $1',
+'may-date' => 'ಮೇ $1',
+'june-date' => 'ಜೂನ್ $1',
+'july-date' => 'ಜುಲೈ $1',
+'august-date' => 'ಆಗಸ್ಟ್ $1',
+'september-date' => 'ಸೆಪ್ಟೆಂಬರ್ $1',
+'october-date' => 'ಅಕ್ಟೋಬರ್ $1',
+'november-date' => 'ನವೆಂಬರ್ $1',
+'december-date' => 'ಡಿಸೆಂಬರ್ $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|ವರ್ಗ|ವರ್ಗಗಳು}}',
@@ -253,6 +263,7 @@ $messages = array(
 'create-this-page' => 'ಈ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸು',
 'delete' => 'ಅಳಿಸಿ',
 'deletethispage' => 'ಈ ಪುಟವನ್ನು ಅಳಿಸಿ',
+'undeletethispage' => 'ಈ ಪುಟವನ್ನು ಅಳಿಸುವಿಕೆಯನ್ನು ರದ್ದುಮಾಡು',
 'undelete_short' => '{{PLURAL:$1|ಒಂದು ಸಂಪಾದನೆಯ|$1 ಸಂಪಾದನೆಗಳ}} ಅಳಿಸುವಿಕೆಯನ್ನು ತೊಡೆದುಹಾಕು',
 'viewdeleted_short' => 'ನೋಟ {{PLURAL:$1|೧ ಅಳಿಸಲ್ಪಟ್ಟ ಸಂಪಾದನೆ|$1 ಅಳಿಸಲ್ಪಟ್ಟ ಸಂಪಾದನೆಗಳು}}',
 'protect' => 'ಸಂರಕ್ಷಿಸು',
@@ -292,7 +303,7 @@ $messages = array(
 'pool-queuefull' => 'ಪ್ರಕ್ರಿಯೆಯನ್ನು ವಿಶೇಷ ಕ್ಯು ಪೂರ್ಣ',
 'pool-errorunknown' => 'ಅಪರಿಚಿತ ದೋಷ',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'ಕನ್ನಡ {{SITENAME}} ಬಗ್ಗೆ',
 'aboutpage' => 'Project:ನಮ್ಮ ಬಗ್ಗೆ',
 'copyright' => 'ಇದು ಈ ಕಾಪಿರೈಟ್‌ನಲ್ಲಿ ಲಭ್ಯವಿದೆ $1.',
@@ -302,7 +313,6 @@ $messages = array(
 'disclaimers' => 'ಅಬಾಧ್ಯತೆಗಳು',
 'disclaimerpage' => 'Project:ಸಾಮಾನ್ಯ ಅಬಾಧ್ಯತೆಗಳು',
 'edithelp' => 'ಸಂಪಾದನೆಗೆ ಸಹಾಯ',
-'edithelppage' => 'Help:ಸಂಪಾದನೆ',
 'helppage' => 'Help:ಪರಿವಿಡಿ',
 'mainpage' => 'ಮುಖ್ಯ ಪುಟ',
 'mainpage-description' => 'ಮುಖ್ಯ ಪುಟ',
@@ -374,17 +384,6 @@ $messages = array(
 # General errors
 'error' => 'ದೋಷ',
 'databaseerror' => 'ಡೇಟಬೇಸ್ ದೋಷ',
-'dberrortext' => 'ಒಂದು ಡೇಟಾಬೇಸ್ ನಿಮ್ಮಪ್ರಶ್ನೆಗೆ ಸಿಂಟಾಕ್ಸ್ ತಪ್ಪು ಸಂಭವಿಸಿದೆ
-ಈ ಸಾಫ್ಟ್ವೇರ್ ಒಂದು ದೋಷವನ್ನು ನಿವಾರಿಸಲಾಗಿದೆ ಸೂಚಿಸಬಹುದು.
-ಕೊನೆಯ ಪ್ರಯತ್ನ ಡೇಟಾಬೇಸ್ ನಿಮ್ಮಪ್ರಶ್ನೆಗೆ ಮಾಡಲಾಯಿತು:
-<blockquote><code>$1</code></blockquote>
-ಕ್ರಿಯೆ ಒಳಗಿನಿಂದಲೇ "<code>$2</code>" 
-ಡೇಟಾಬೇಸ್ ದೋಷವನ್ನು ತಿಳಿಸಿದೆ"<code>$3: $4</code>".',
-'dberrortextcl' => 'ಡೇಟಾಬೇಸ್ ಪ್ರಶ್ನೆಯ ವಿನ್ಯಾಸದಲ್ಲಿ ದೋಷ ಉಂಟಾಗಿದೆ.
-ಕೊನೆಯದಾಗಿ ಪ್ರಯತ್ನಿಸಲಾದ ಡೇಟಾಬೇಸ್ ಪ್ರಶ್ನೆಯು:
-"$1"
-ಇದು ಉಂಟಾಗಿದ್ದು "$2" function ಒಳಗಿಂದ.
-MySQL ಹಿಂದಿರುಗಿಸಿದ ದೋಷ "$3: $4"',
 'laggedslavemode' => 'ಎಚ್ಚರ: ಪುಟದಲ್ಲಿ ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳು ಕಾಣದಿರಬಹುದು.',
 'readonly' => 'ಡೇಟಬೇಸ್ ಮುಚ್ಚಲಾಗಿದೆ',
 'enterlockreason' => 'ಡೇಟಬೇಸ್ ಮುಚ್ಚುತಿರುವ ಕಾರಣವನ್ನು ಮತ್ತು ಮತ್ತೆ ಅದನ್ನು ತೆರೆಯುವ ಅಂದಾಜಿತ ಕಾಲವನ್ನು ತಿಳಿಸಿ',
@@ -438,6 +437,10 @@ $2',
 'namespaceprotected' => "ನಿಮಗೆ '''$1''' ಪುಟಪ್ರಬೇಧಕ್ಕೆ ಸೇರಿರುವ ಪುಟಗಳನ್ನು ಸಂಪಾದಿಸುವ ಅನುಮತಿ ಇಲ್ಲ.",
 'customcssprotected' => 'ಈ ಸಿಎಸ್ಎಸ್ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ಈ ಪುಟವು ಇನ್ನೊಬ್ಬ ಬಳಕೆದಾರನ ವಯುಕ್ತಿಕ ವ್ಯವಸ್ಥೆಯನ್ನು ಹೊಂದಿರುವುದರಿಂದ ಅನುಮತಿ ಇಲ್ಲ',
 'customjsprotected' => 'ಈ ಜಾವಾ ಸ್ಕ್ರಿಪ್ಟ್ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ಈ ಪುಟವು ಇನ್ನೊಬ್ಬ ಬಳಕೆದಾರನ ವಯುಕ್ತಿಕ ವ್ಯವಸ್ಥೆಯನ್ನು ಹೊಂದಿರುವುದರಿಂದ ಅನುಮತಿ ಇಲ್ಲ',
+'mycustomcssprotected' => 'ಈ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.',
+'mycustomjsprotected' => 'ಈ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.',
+'myprivateinfoprotected' => 'ನಿಮ್ಮ ಸೂಕ್ಷ್ಮ ವಿಚಾರಗಳನ್ನು ಸಂಪಾದಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ.',
+'mypreferencesprotected' => 'ನಿಮ್ಮ ಆಯ್ಕೆಗಳನ್ನು  ಸಂಪಾದಿಸಲು ನಿಮಗೆ ಅನುಮತಿ ಇಲ್ಲ',
 'ns-specialprotected' => 'ವಿಶೇಷ ಪುಟಗಳನ್ನು ಸಂಪಾದಿಸಲು ಆಗುವುದಿಲ್ಲ.',
 'titleprotected' => "ಈ ಹೆಸರಿನ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸಲಾಗದಂತೆ [[User:$1|$1]] ಅವರು ಸಂರಕ್ಷಿಸಿದ್ದಾರೆ.
 ಸಂರಕ್ಷಣೆಗೆ ನೀಡಿರುವ ಕಾರಣ: ''$2''.",
@@ -461,10 +464,15 @@ $2',
 'welcomeuser' => 'ಸುಸ್ವಾಗತ,$1!',
 'welcomecreation-msg' => 'ನಿಮ್ಮ ಖಾತೆ ತೆರೆಯಲಾಗಿದೆ.ನಿಮ್ಮ [[Special:Preferences|{{SITENAME}} preferences]]ಬದಲಾಯಿಸಲು ಮರೆಯಬೇಡಿ.',
 'yourname' => 'ನಿಮ್ಮ ಬಳಕೆಯ ಹೆಸರು',
+'userlogin-yourname' => 'ಬಳಕೆದಾರ ಹೆಸರು',
 'yourpassword' => 'ನಿಮ್ಮ ಪ್ರವೇಶಪದ',
+'userlogin-yourpassword' => 'ಪ್ರವೇಶಪದ',
+'userlogin-yourpassword-ph' => 'ನಿಮ್ಮ ಪ್ರವೇಶಪದ ನಮೂದಿಸಿ',
+'createacct-yourpassword-ph' => 'ಪ್ರವೇಶಪದ ಒಂದನ್ನು ನಮೂದಿಸಿ',
 'yourpasswordagain' => 'ಪ್ರವೇಶ ಪದ ಮತ್ತೊಮ್ಮೆ ಟೈಪ್ ಮಾಡಿ',
+'createacct-yourpasswordagain' => 'ಪ್ರವೇಶಪದವನ್ನು ಧೃಡೀಕರಿಸಿ',
+'createacct-yourpasswordagain-ph' => 'ಪ್ರವೇಶಪದವನ್ನು ಮತ್ತೊಮ್ಮೆ ನಮೂದಿಸಿ',
 'remembermypassword' => 'ಈ ಗಣಕಯಂತ್ರದಲ್ಲಿ ನನ್ನ ಲಾಗಿನ್ ನೆನಪಿನಲ್ಲಿಟ್ಟುಕೊ (ಗರಿಷ್ಠ $1 {{PLURAL:$1|ದಿನದ|ದಿನಗಳ}}ವರೆಗೆ)',
-'securelogin-stick-https' => 'ಲಾಗಿನ್ ಆದ ಬಳಿಕ HTTPS ನ ಸಂಪರ್ಕದಲ್ಲಿರಿ.',
 'yourdomainname' => 'ನಿಮ್ಮ ಕ್ಷೇತ್ರ:',
 'password-change-forbidden' => 'ನೀವು ಈ ವಿಕಿಯಲ್ಲಿ ಪ್ರವೇಶಪದವನ್ನು ಬದಲಾಯಿಸಲು ಸಾದ್ಯವಿಲ್ಲ.',
 'login' => 'ಲಾಗ್ ಇನ್',
@@ -475,14 +483,19 @@ $2',
 'logout' => 'ಲಾಗ್ ಔಟ್',
 'userlogout' => 'ಲಾಗ್ ಔಟ್',
 'notloggedin' => 'ಲಾಗಿನ್ ಆಗಿಲ್ಲ',
+'userlogin-noaccount' => 'ಖಾತೆ ಇಲ್ಲವೇ?',
 'nologin' => "ಖಾತೆ ಇಲ್ಲವೇ? '''$1'''.",
 'nologinlink' => 'ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಿ',
 'createaccount' => 'ಹೊಸ ಖಾತೆ ತೆರೆಯಿರಿ',
 'gotaccount' => "ಈಗಾಗಲೇ ಖಾತೆಯಿದೆಯೇ? '''$1'''.",
 'gotaccountlink' => 'ಲಾಗ್ ಇನ್',
 'userlogin-resetlink' => 'ನಿಮ್ಮ ಲಾಗಿನ್ ವಿವರಗಳನ್ನು ಮರೆತಿದ್ದೀರಾ?',
+'createacct-join' => 'ನಿಮ್ಮ ಮಾಹಿತಿಯನ್ನು ಕೆಳಗೆ ನಮೂದಿಸಿ',
+'createacct-emailrequired' => 'ಇ-ಮೇಲ್ ವಿಳಾಸ:',
+'createacct-email-ph' => 'ನಿಮ್ಮ ಇ-ಅಂಚೆ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ',
 'createaccountmail' => 'ಇ-ಅಂಚೆಯ ಮೂಲಕ',
 'createaccountreason' => 'ಕಾರಣ:',
+'createacct-reason' => 'ಕಾರಣ',
 'badretype' => 'ನೀವು ಕೊಟ್ಟ ಪ್ರವೇಶಪದಗಳು ಬೇರೆಬೇರೆಯಾಗಿವೆ.',
 'userexists' => 'ನೀವು ನೀಡಿದ ಸದಸ್ಯರ ಹೆಸರು ಆಗಲೆ ಬಳಕೆಯಲ್ಲಿದೆ. ದಯವಿಟ್ಟು ಬೇರೊಂದು ಹೆಸರನ್ನು ಆಯ್ಕೆ ಮಾಡಿ.',
 'loginerror' => 'ಲಾಗಿನ್ ದೋಷ',
@@ -547,7 +560,7 @@ $2',
 'newpassword' => 'ಹೊಸ ಪ್ರವೇಶ ಪದ',
 'retypenew' => 'ಹೊಸ ಪ್ರವೇಶಪದವನ್ನು ಮತ್ತೆ ಟೈಪಿಸು:',
 'resetpass_submit' => 'ಪ್ರವೇಶ ಪದವನ್ನು ನಿಶ್ಚಯಿಸಿ ಲಾಗ್ ಇನ್ ಆಗಿ',
-'resetpass_success' => 'ನಿಮ್ಮ ಪ್ರವೇಶ ಪದವನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಬದಲಾಯಿಸಲಾಗಿದೆ. ಈಗ ನಿಮ್ಮನ್ನು ಲಾಗ್ ಇನ್ ಮಾಡಲಾಗುತ್ತಿದೆ...',
+'changepassword-success' => 'ನಿಮ್ಮ ಪ್ರವೇಶ ಪದವನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಬದಲಾಯಿಸಲಾಗಿದೆ. ಈಗ ನಿಮ್ಮನ್ನು ಲಾಗ್ ಇನ್ ಮಾಡಲಾಗುತ್ತಿದೆ...',
 'resetpass_forbidden' => 'ಪ್ರವೇಶಪದಗಳನ್ನು ಬದಲಾಯಿಸುವಂತಿಲ್ಲ.',
 'resetpass-submit-loggedin' => 'ಪ್ರವೇಶಪದ ಬದಲಾಯಿಸು',
 'resetpass-submit-cancel' => 'ರದ್ದು ಮಾಡು',
@@ -861,7 +874,6 @@ $2',
 'viewprevnext' => 'ವೀಕ್ಷಿಸು ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''\"[[:\$1]]\" ಹೆಸರಿನ ಪುಟ ಈ ವಿಕಿಯಲ್ಲಿದೆ.'''",
 'searchmenu-new' => "'''''[[:$1]]'' ಪುಟವನ್ನು ಈ ವಿಕಿಯಲ್ಲಿ ಸೃಷ್ಟಿಸಿ!'''",
-'searchhelp-url' => 'Help:ಪರಿವಿಡಿ',
 'searchprofile-articles' => 'ಲೇಖನ ಪುಟ',
 'searchprofile-project' => 'ಸಹಾಯ ಮತ್ತು ಯೋಜನೆ ಪುಟಗಳು',
 'searchprofile-images' => 'ಬಹುಮಾಧ್ಯಮ',
@@ -902,11 +914,6 @@ $2',
 ಈ ವೇಳೆಯಲ್ಲಿ ನೀವು ಗೂಗಲ್ ಉಪಯೋಗಿಸಿ ಹುಡುಕಾಟ ನಡೆಸಬಹುದು.
 ಗಮನಿಸಿ: ಅವರ {{SITENAME}} ಮಾಹಿತಿಯು ಪ್ರಸಕ್ತವಾಗಿಲ್ಲದಿರಬಹುದು.',
 
-# Quickbar
-'qbsettings-none' => 'ಯಾವುದೂ ಇಲ್ಲ',
-'qbsettings-floatingleft' => 'ಎಡಕ್ಕ ತೇಲುತ್ತಿದೆ',
-'qbsettings-floatingright' => 'ಬಲಕ್ಕೆ ತೇಲುತ್ತಿದೆ',
-
 # Preferences page
 'preferences' => 'ಪ್ರಾಶಸ್ತ್ಯಗಳು',
 'mypreferences' => 'ಪ್ರಾಶಸ್ತ್ಯಗಳು',
@@ -1116,7 +1123,6 @@ $2',
 'recentchangeslinked-feed' => 'ಸಂಬಂಧಪಟ್ಟ ಬದಲಾವಣೆಗಳು',
 'recentchangeslinked-toolbox' => 'ಸಂಬಂಧಪಟ್ಟ ಬದಲಾವಣೆಗಳು',
 'recentchangeslinked-title' => '"$1" ಪುಟಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಬದಲಾವಣೆಗಳು',
-'recentchangeslinked-noresult' => 'ಸೂಚಿತ ಕಾಲದಲ್ಲಿ ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಪುಟಗಳಲ್ಲಿ ಯಾವ ಬದಲಾವಣೆಗಳೂ ಇಲ್ಲ.',
 'recentchangeslinked-summary' => "ಒಂದು ನಿರ್ದಿಷ್ಟ ಪುಟದಿಂದ (ಅಥವ ನಿರ್ದಿಷ್ಟ ವರ್ಗಕ್ಕೆ ಸೇರಿರುವ ಪುಟಗಳಿಂದ) ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಪುಟಗಳಲ್ಲಿ ಇತ್ತೀಚೆಗೆ ಮಾಡಲಾಗಿರುವ ಬದಲಾವಣೆಗಳನ್ನು ಈ ಕೆಳಗೆ ಪಟ್ಟಿ ಮಾಡಲಾಗಿದೆ.
 [[Special:Watchlist|ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ]] ಇರುವ ಪುಟಗಳು '''ದಪ್ಪ ಅಕ್ಷರ'''ಗಳಲ್ಲಿ ಇವೆ.",
 'recentchangeslinked-page' => 'ಪುಟದ ಹೆಸರು:',
@@ -1330,9 +1336,6 @@ $2',
 'statistics-views-total' => 'ಒಟ್ಟು ವೀಕ್ಷಣೆಗಳು',
 'statistics-mostpopular' => 'ಅತ್ಯಂತ ಹೆಚ್ಚು ವೀಕ್ಷಿತ ಪುಟಗಳು',
 
-'disambiguations' => 'ದ್ವಂದ್ವನಿವಾರಣಾ ಪುಟಗಳು',
-'disambiguationspage' => 'Template:ದ್ವಂದ್ವ ನಿವಾರಣೆ',
-
 'doubleredirects' => 'ಮರುಕಳಿಸಿದ ಪುನರ್ನಿರ್ದೇಶನಗಳು',
 
 'brokenredirects' => 'ಮುರಿದ ರಿಡೈರೆಕ್ಟ್‌ಗಳು',
@@ -1496,7 +1499,7 @@ $2',
 'unwatchthispage' => 'ವೀಕ್ಷಣೆ ನಿಲ್ಲಿಸು',
 'notvisiblerev' => 'ಆವೃತ್ತಿಯನ್ನು ಅಳಿಸಲಾಗಿದೆ',
 'watchlist-details' => 'ಚರ್ಚೆ ಪುಟಗಳನ್ನು ಹೊರತುಪಡಿಸಿ, ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ {{PLURAL:$1|$1 ಪುಟ ಇದೆ|$1 ಪುಟಗಳು ಇವೆ}}.',
-'wlheader-showupdated' => "* ನೀವು ಕೊನೆಯ ಬಾರಿ ಭೇಟಿ ನೀಡಿದ ನಂತರ ಬದಲಾವಣೆಗಳು ಆಗಿರುವ ಪುಟಗಳು '''ದಪ್ಪ ಅಕ್ಷರಗಳಲ್ಲಿ''' ತೋರಿಸಲಾಗಿದೆ",
+'wlheader-showupdated' => "ನೀವು ಕೊನೆಯ ಬಾರಿ ಭೇಟಿ ನೀಡಿದ ನಂತರ ಬದಲಾವಣೆಗಳು ಆಗಿರುವ ಪುಟಗಳು '''ದಪ್ಪ ಅಕ್ಷರಗಳಲ್ಲಿ''' ತೋರಿಸಲಾಗಿದೆ",
 'watchmethod-recent' => 'ಇತ್ತೀಚಿನ ಸಂಪಾದನೆಗಳಲ್ಲಿ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರುವ ಪುಟಗಳ ಹುಡುಕು',
 'watchmethod-list' => 'ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರುವ ಪುಟಗಳಲ್ಲಿ ಇತ್ತೀಚಿನ ಸಂಪಾದನೆಗಳಿಗೆ ಹುಡುಕು',
 'watchlistcontains' => 'ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ $1 {{PLURAL:$1|ಪುಟ|ಪುಟಗಳು}} ಇವೆ.',
@@ -1708,8 +1711,6 @@ $2',
 'block-log-flags-nocreate' => 'ಖಾತೆ ಸೃಷ್ಟಿ ತಡೆಹಿಡಿಯಲಾಗಿದೆ',
 'block-log-flags-noemail' => 'ಇ-ಅಂಚೆ ತಡೆಹಿಡಿಯಲಾಗಿದೆ',
 'ipb_already_blocked' => '"$1" ಆಗಲೆ ತಡೆ ಹಿಡಿಯಲಾಗಿದೆ',
-'blockme' => 'ನನ್ನನ್ನು ತಡೆಹಿಡಿ',
-'proxyblocksuccess' => 'ಮುಗಿಯಿತು.',
 
 # Developer tools
 'lockdb' => 'ಡೇಟಾಬೇಸ್ ಅನ್ನು ಮುಚ್ಚು',
@@ -1953,7 +1954,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ಅಗಲ',
 'exif-imagelength' => 'ಎತ್ತರ',
 'exif-bitspersample' => 'ಪ್ರತಿ ಭಾಗಕ್ಕಿರುವ ಬಿಟ್‍ಗಳು',
@@ -2154,11 +2155,6 @@ $5
 'version-software-product' => 'ಉತ್ಪನ್ನ',
 'version-software-version' => 'ಆವೃತ್ತಿ',
 
-# Special:FilePath
-'filepath' => 'ಫೈಲಿನ ಮಾರ್ಗ',
-'filepath-page' => 'ಫೈಲು:',
-'filepath-submit' => 'ಹೋಗು',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ದ್ವಿಪ್ರತಿ ಫೈಲುಗಳಿಗೆ ಹುಡುಕು',
 'fileduplicatesearch-legend' => 'ದ್ವಿಪ್ರತಿಯನ್ನು ಹುಡುಕು',
diff --git a/languages/messages/MessagesKo.php b/languages/messages/MessagesKo.php
index 5ae43132..7906d144 100644
--- a/languages/messages/MessagesKo.php
+++ b/languages/messages/MessagesKo.php
@@ -81,7 +81,7 @@ $specialPageAliases = array(
 	'ChangePassword'            => array( '비밀번호바꾸기', '비밀번호변경', '비밀단어바꾸기', '비밀단어변경' ),
 	'ComparePages'              => array( '문서비교' ),
 	'Confirmemail'              => array( '이메일인증' ),
-	'Contributions'             => array( '기여', '기여목록', '사용자기여' ),
+	'Contributions'             => array( '기여', '기여목록' ),
 	'CreateAccount'             => array( '계정만들기', '가입' ),
 	'Deadendpages'              => array( '막다른문서' ),
 	'DeletedContributions'      => array( '삭제된기여' ),
@@ -95,14 +95,14 @@ $specialPageAliases = array(
 	'Filepath'                  => array( '파일경로', '그림경로' ),
 	'Import'                    => array( '가져오기' ),
 	'Invalidateemail'           => array( '이메일인증취소', '이메일인증해제' ),
-	'JavaScriptTest'            => array( '자바스크립트시험' ),
-	'BlockList'                 => array( '차단된사용자', '차단목록' ),
+	'JavaScriptTest'            => array( '자바스크립트시험', '자바스크립트테스트' ),
+	'BlockList'                 => array( '차단된사용자', '차단목록', 'IP차단목록' ),
 	'LinkSearch'                => array( '링크찾기', '링크검색' ),
 	'Listadmins'                => array( '관리자', '관리자목록' ),
 	'Listbots'                  => array( '봇', '봇목록' ),
 	'Listfiles'                 => array( '파일', '그림', '파일목록', '그림목록' ),
 	'Listgrouprights'           => array( '사용자권한', '권한목록' ),
-	'Listredirects'             => array( '넘겨주기', '넘겨주기목록' ),
+	'Listredirects'             => array( '넘겨주기목록' ),
 	'Listusers'                 => array( '사용자', '사용자목록' ),
 	'Lockdb'                    => array( 'DB잠금', 'DB잠그기' ),
 	'Log'                       => array( '기록', '로그' ),
@@ -117,13 +117,14 @@ $specialPageAliases = array(
 	'Mostlinkedcategories'      => array( '많이쓰는분류' ),
 	'Mostlinkedtemplates'       => array( '많이쓰는틀' ),
 	'Mostrevisions'             => array( '역사긴문서' ),
-	'Movepage'                  => array( '이동', '문서이동' ),
+	'Movepage'                  => array( '옮기기', '문서옮기기', '이동', '문서이동' ),
 	'Mycontributions'           => array( '내기여', '내기여목록' ),
 	'Mypage'                    => array( '내사용자문서' ),
 	'Mytalk'                    => array( '내사용자토론' ),
 	'Myuploads'                 => array( '내가올린파일' ),
 	'Newimages'                 => array( '새파일', '새그림' ),
 	'Newpages'                  => array( '새문서' ),
+	'PagesWithProp'             => array( '속성별문서' ),
 	'PasswordReset'             => array( '비밀번호재설정', '비밀단어재설정', '비밀번호초기화', '비밀단어초기화' ),
 	'PermanentLink'             => array( '고유링크', '영구링크' ),
 	'Popularpages'              => array( '인기있는문서' ),
@@ -135,6 +136,7 @@ $specialPageAliases = array(
 	'Randomredirect'            => array( '임의넘겨주기' ),
 	'Recentchanges'             => array( '최근바뀜' ),
 	'Recentchangeslinked'       => array( '링크최근바뀜' ),
+	'Redirect'                  => array( '넘겨주기' ),
 	'Revisiondelete'            => array( '특정판삭제' ),
 	'Search'                    => array( '찾기', '검색' ),
 	'Shortpages'                => array( '짧은문서' ),
@@ -170,7 +172,7 @@ $specialPageAliases = array(
 $magicWords = array(
 	'redirect'                  => array( '0', '#넘겨주기', '#REDIRECT' ),
 	'notoc'                     => array( '0', '__목차숨김__', '__NOTOC__' ),
-	'nogallery'                 => array( '0', '__화랑숨김__', '__갤러리숨김__', '__NOGALLERY__' ),
+	'nogallery'                 => array( '0', '__갤러리숨김__', '__화랑숨김__', '__NOGALLERY__' ),
 	'forcetoc'                  => array( '0', '__목차보임__', '__목차표시__', '__FORCETOC__' ),
 	'toc'                       => array( '0', '__목차__', '__TOC__' ),
 	'noeditsection'             => array( '0', '__부분편집숨김__', '__문단편집숨김__', '__단락편집숨김__', '__NOEDITSECTION__' ),
@@ -183,7 +185,7 @@ $magicWords = array(
 	'currentday2'               => array( '1', '현재일2', 'CURRENTDAY2' ),
 	'currentdayname'            => array( '1', '현재요일', 'CURRENTDAYNAME' ),
 	'currentyear'               => array( '1', '현재년', 'CURRENTYEAR' ),
-	'currenttime'               => array( '1', '현재시분', '현재시각', 'CURRENTTIME' ),
+	'currenttime'               => array( '1', '현재시각', '현재시분', 'CURRENTTIME' ),
 	'currenthour'               => array( '1', '현재시', 'CURRENTHOUR' ),
 	'localmonth'                => array( '1', '지역월', 'LOCALMONTH', 'LOCALMONTH2' ),
 	'localmonth1'               => array( '1', '지역월1', 'LOCALMONTH1' ),
@@ -216,6 +218,8 @@ $magicWords = array(
 	'fullpagenamee'             => array( '1', '전체문서이름E', 'FULLPAGENAMEE' ),
 	'subpagename'               => array( '1', '하위문서이름', 'SUBPAGENAME' ),
 	'subpagenamee'              => array( '1', '하위문서이름E', 'SUBPAGENAMEE' ),
+	'rootpagename'              => array( '1', '최상위문서이름', 'ROOTPAGENAME' ),
+	'rootpagenamee'             => array( '1', '최상위문서이름E', 'ROOTPAGENAMEE' ),
 	'basepagename'              => array( '1', '상위문서이름', 'BASEPAGENAME' ),
 	'basepagenamee'             => array( '1', '상위문서이름E', 'BASEPAGENAMEE' ),
 	'talkpagename'              => array( '1', '토론문서이름', 'TALKPAGENAME' ),
@@ -288,6 +292,8 @@ $magicWords = array(
 	'uc'                        => array( '0', '대문자:', 'UC:' ),
 	'raw'                       => array( '0', '원본:', 'RAW:' ),
 	'displaytitle'              => array( '1', '제목보이기', '제목표시', 'DISPLAYTITLE' ),
+	'rawsuffix'                 => array( '1', '원', 'R' ),
+	'nocommafysuffix'           => array( '0', '구분자없음', 'NOSEP' ),
 	'newsectionlink'            => array( '1', '__새글쓰기__', '__NEWSECTIONLINK__' ),
 	'nonewsectionlink'          => array( '1', '__새글쓰기숨기기__', '__NONEWSECTIONLINK__' ),
 	'currentversion'            => array( '1', '현재버전', 'CURRENTVERSION' ),
@@ -375,9 +381,6 @@ $messages = array(
 'tog-shownumberswatching' => '주시 사용자 수 보기',
 'tog-oldsig' => '현재 서명:',
 'tog-fancysig' => '서명을 위키텍스트로 취급 (자동으로 링크를 걸지 않음)',
-'tog-externaleditor' => '바깥 편집기를 기본 편집기로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 정보 보기])',
-'tog-externaldiff' => '바깥 비교 도구를 기본 도구로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 설명 보기])',
-'tog-showjumplinks' => '접근성을 위한 "이동" 링크 쓰기 (일부 스킨에서만 작동)',
 'tog-uselivepreview' => '실시간 미리 보기 사용하기 (실험 기능)',
 'tog-forceeditsummary' => '편집 요약을 쓰지 않았을 때 알려주기',
 'tog-watchlisthideown' => '주시문서 목록에서 내 편집을 숨기기',
@@ -391,6 +394,8 @@ $messages = array(
 'tog-showhiddencats' => '숨은 분류 보기',
 'tog-noconvertlink' => '링크 제목 변환을 비활성화',
 'tog-norollbackdiff' => '되돌리기 후 차이를 보이지 않기',
+'tog-useeditwarning' => '바꾼 내용을 저장하지 않고 편집 페이지를 벗어날 때 알림',
+'tog-prefershttps' => '로그인할 때 항상 보안 연결 사용',
 
 'underline-always' => '항상',
 'underline-never' => '치지 않음',
@@ -454,6 +459,18 @@ $messages = array(
 'oct' => '10',
 'nov' => '11',
 'dec' => '12',
+'january-date' => '1월 $1일',
+'february-date' => '2월 $1일',
+'march-date' => '3월 $1일',
+'april-date' => '4월 $1일',
+'may-date' => '5월 $1일',
+'june-date' => '6월 $1일',
+'july-date' => '7월 $1일',
+'august-date' => '8월 $1일',
+'september-date' => '9월 $1일',
+'october-date' => '10월 $1일',
+'november-date' => '11월 $1일',
+'december-date' => '12월 $1일',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|분류}}',
@@ -535,6 +552,7 @@ $messages = array(
 'create-this-page' => '이 문서 만들기',
 'delete' => '삭제',
 'deletethispage' => '이 문서 삭제하기',
+'undeletethispage' => '이 문서를 되살리기',
 'undelete_short' => '{{PLURAL:$1|편집 $1개}} 되살리기',
 'viewdeleted_short' => '{{PLURAL:$1|삭제된 편집 $1개}} 보기',
 'protect' => '보호',
@@ -551,7 +569,7 @@ $messages = array(
 'articlepage' => '문서 보기',
 'talk' => '토론',
 'views' => '보기',
-'toolbox' => '도구모음',
+'toolbox' => '도구',
 'userpage' => '사용자 문서 보기',
 'projectpage' => '프로젝트 문서 보기',
 'imagepage' => '파일 문서 보기',
@@ -578,7 +596,7 @@ $1',
 'pool-queuefull' => '풀 큐가 가득 찼습니다',
 'pool-errorunknown' => '알 수 없는 오류',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} 소개',
 'aboutpage' => 'Project:소개',
 'copyright' => '내용은 별도로 명시하지 않을 경우 $1에 따라 사용할 수 있습니다.',
@@ -588,7 +606,6 @@ $1',
 'disclaimers' => '면책 조항',
 'disclaimerpage' => 'Project:면책 조항',
 'edithelp' => '편집 도움말',
-'edithelppage' => 'Help:편집하기',
 'helppage' => 'Help:목차',
 'mainpage' => '대문',
 'mainpage-description' => '대문',
@@ -666,17 +683,12 @@ URL을 잘못 입력하였거나, 잘못된 링크를 따라갔을 수 있습니
 # General errors
 'error' => '오류',
 'databaseerror' => '데이터베이스 오류',
-'dberrortext' => '데이터베이스 쿼리 구문 오류가 발생했습니다.
-소프트웨어의 버그가 있을 수 있습니다.
-마지막으로 요청한 데이터베이스 쿼리는 "<code>$2</code>" 함수에서 쓰인
-<blockquote><code>$1</code></blockquote>
-입니다.
-데이터베이스는 "<samp>$3: $4</samp>" 오류를 일으켰습니다.',
-'dberrortextcl' => '데이터베이스 쿼리 구문 오류가 발생했습니다.
-마지막으로 요청한 데이터베이스 쿼리는 "$2" 함수에서 쓰인
-"$1"
-입니다.
-데이터베이스는 "$3: $4" 오류를 일으켰습니다.',
+'databaseerror-text' => '데이터베이스 쿼리에 오류가 발생했습니다.
+소프트웨어의 버그가 있을 수 있습니다.',
+'databaseerror-textcl' => '데이터베이스 쿼리에 오류가 발생했습니다.',
+'databaseerror-query' => '쿼리: $1',
+'databaseerror-function' => '함수: $1',
+'databaseerror-error' => '오류: $1',
 'laggedslavemode' => "'''경고:''' 문서가 최근에 바뀐 내용이 아닐 수도 있습니다.",
 'readonly' => '데이터베이스 잠김',
 'enterlockreason' => '데이터베이스를 잠그는 이유와 예상되는 기간을 적어 주세요.',
@@ -709,6 +721,7 @@ URL을 잘못 입력하였거나, 잘못된 링크를 따라갔을 수 있습니
 'cannotdelete-title' => '"$1" 문서를 삭제할 수 없습니다.',
 'delete-hook-aborted' => '훅에 의해 삭제가 중단되었습니다.
 아무런 설명도 주어지지 않았습니다.',
+'no-null-revision' => '"$1" 문서에 대한 새 빈 판을 만들 수 없습니다',
 'badtitle' => '잘못된 제목',
 'badtitletext' => '요청한 문서 제목이 잘못되었거나, 비어있거나, 잘못된 인터위키 제목으로 링크했습니다.
 문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.',
@@ -732,12 +745,15 @@ URL을 잘못 입력하였거나, 잘못된 링크를 따라갔을 수 있습니
 'editinginterface' => "'''경고''': 소프트웨어 인터페이스에 쓰이는 문서를 고치고 있습니다.
 이 문서에 있는 내용을 바꾸면 이 위키에 있는 모든 사용자에게 영향을 끼칩니다.
 모든 위키에 대한 번역을 추가하거나 바꾸려면 미디어위키 지역화 프로젝트인 [//translatewiki.net/wiki/Main_Page?setlang=ko translatewiki.net]에 참여하시기 바랍니다.",
-'sqlhidden' => '(SQL 쿼리 숨겨짐)',
 'cascadeprotected' => '이 문서는 다음 "연쇄적" 보호가 걸린 {{PLURAL:$1|문서}}에 포함되어 있어 함께 보호됩니다:
 $2',
 'namespaceprotected' => "'''$1''' 이름공간을 편집할 수 있는 권한이 없습니다.",
 'customcssprotected' => '여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 CSS 문서를 편집할 수 없습니다.',
 'customjsprotected' => '여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 자바스크립트 문서를 편집할 수 없습니다.',
+'mycustomcssprotected' => '이 CSS 문서를 편집할 권한이 없습니다.',
+'mycustomjsprotected' => '이 자바스크립트 문서를 편집할 권한이 없습니다.',
+'myprivateinfoprotected' => '내 개인 정보를 편집할 권한이 없습니다.',
+'mypreferencesprotected' => '내 환경 설정을 편집할 권한이 없습니다.',
 'ns-specialprotected' => '특수 문서는 편집할 수 없습니다.',
 'titleprotected' => '[[User:$1|$1]] 사용자가 문서 만들기를 금지했습니다.
 이유는 다음과 같습니다. "$2"',
@@ -762,10 +778,19 @@ $2',
 'welcomecreation-msg' => '계정이 만들어졌습니다.
 [[Special:Preferences|{{SITENAME}} 사용자 환경 설정]]을 바꿀 수 있습니다.',
 'yourname' => '사용자 이름:',
+'userlogin-yourname' => '사용자 이름',
+'userlogin-yourname-ph' => '사용자 이름을 입력하세요',
+'createacct-another-username-ph' => '사용자 이름을 입력하세요',
 'yourpassword' => '비밀번호:',
+'userlogin-yourpassword' => '비밀번호',
+'userlogin-yourpassword-ph' => '비밀번호를 입력하세요',
+'createacct-yourpassword-ph' => '비밀번호를 입력하세요',
 'yourpasswordagain' => '비밀번호 다시 입력:',
+'createacct-yourpasswordagain' => '비밀번호 확인',
+'createacct-yourpasswordagain-ph' => '비밀번호를 다시 입력하세요',
 'remembermypassword' => '이 브라우저에서 로그인 상태를 저장하기 (최대 $1{{PLURAL:$1|일}})',
-'securelogin-stick-https' => '로그인하고 나서도 HTTPS 연결을 유지하기',
+'userlogin-remembermypassword' => '로그인 상태를 유지하기',
+'userlogin-signwithsecure' => '보안 연결 사용',
 'yourdomainname' => '도메인 이름:',
 'password-change-forbidden' => '이 위키에서 비밀번호를 바꿀 수 없습니다.',
 'externaldberror' => '바깥 인증 데이터베이스에 오류가 있거나 바깥 계정을 새로 고칠 권한이 없습니다.',
@@ -777,18 +802,43 @@ $2',
 'logout' => '로그아웃',
 'userlogout' => '로그아웃',
 'notloggedin' => '로그인하지 않음',
+'userlogin-noaccount' => '계정이 없나요?',
+'userlogin-joinproject' => '{{SITENAME}}에 가입하세요',
 'nologin' => '계정이 없나요? $1.',
 'nologinlink' => '계정을 만들기',
 'createaccount' => '계정 만들기',
 'gotaccount' => '계정이 이미 있다면, $1.',
 'gotaccountlink' => '로그인하세요',
 'userlogin-resetlink' => '사용자 이름이나 비밀번호를 잊으셨나요?',
+'userlogin-resetpassword-link' => '내 비밀번호 재설정',
+'helplogin-url' => 'Help:로그인',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|로그인에 관한 도움말]]',
+'userlogin-loggedin' => '이미 $1로 로그인되어 있습니다. 아래의 양식으로 다른 계정으로 로그인하세요.',
+'userlogin-createanother' => '다른 계정 만들기',
+'createacct-join' => '아래에 정보를 입력하세요.',
+'createacct-another-join' => '아래에 새 계정의 정보를 입력하세요.',
+'createacct-emailrequired' => '이메일 주소',
+'createacct-emailoptional' => '이메일 주소 (선택 사항)',
+'createacct-email-ph' => '이메일 주소를 입력하세요',
+'createacct-another-email-ph' => '이메일 주소를 입력하세요',
 'createaccountmail' => '임시 임의 비밀번호를 이메일로 보내기',
+'createacct-realname' => '실명 (선택 사항)',
 'createaccountreason' => '이유:',
+'createacct-reason' => '이유',
+'createacct-reason-ph' => '왜 다른 계정을 만들어야 합니까',
+'createacct-captcha' => '보안 검사',
+'createacct-imgcaptcha-ph' => '위에 보이는 텍스트를 입력하세요',
+'createacct-submit' => '계정 만들기',
+'createacct-another-submit' => '다른 계정 만들기',
+'createacct-benefit-heading' => '{{SITENAME}}(은)는 여러분과 같은 사람으로 이루어집니다.',
+'createacct-benefit-body1' => '{{PLURAL:$1|편집 수}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|문서 수}}',
+'createacct-benefit-body3' => '최근 {{PLURAL:$1|기여자}}',
 'badretype' => '입력한 비밀번호가 일치하지 않습니다.',
 'userexists' => '입력하신 사용자 이름이 이미 등록되어 있습니다.
 다른 이름을 선택하세요.',
 'loginerror' => '로그인 오류',
+'createacct-error' => '계정 만들기 오류',
 'createaccounterror' => '계정을 만들지 못했습니다: $1',
 'nocookiesnew' => '사용자 계정을 만들었지만, 아직 로그인하지 않았습니다.
 {{SITENAME}}에서는 로그인 정보를 저장하기 위해 쿠키를 사용합니다.
@@ -855,10 +905,12 @@ $2',
 실수로 계정을 잘못 만들었다면 이 메시지는 무시해도 됩니다.',
 'usernamehasherror' => '사용자 이름에는 해시 문자가 들어갈 수 없습니다',
 'login-throttled' => '로그인에 연속으로 실패하였습니다.
-잠시 후에 다시 시도하세요.',
+$1 기다렸다가 다시 시도하세요.',
 'login-abort-generic' => '로그인에 실패했습니다 - 중지됨',
 'loginlanguagelabel' => '언어: $1',
 'suspicious-userlogout' => '브라우저에 이상이 있거나 캐싱 프록시에서 로그아웃을 요청했기 때문에 로그아웃이 거부되었습니다.',
+'createacct-another-realname-tip' => '실명은 선택 사항입니다.
+실명을 입력하면 문서 기여에 사용자의 이름이 들어가게 됩니다.',
 
 # Email sending
 'php-mail-error-unknown' => 'PHP의 mail() 함수에서 알 수 없는 오류가 발생했습니다.',
@@ -875,8 +927,7 @@ $2',
 'newpassword' => '새 비밀번호:',
 'retypenew' => '새 비밀번호 재입력:',
 'resetpass_submit' => '비밀번호를 설정하고 로그인하기',
-'resetpass_success' => '비밀번호가 성공적으로 바뀌었습니다!
-이제 로그인을 합니다...',
+'changepassword-success' => '비밀번호가 성공적으로 바뀌었습니다!',
 'resetpass_forbidden' => '비밀번호를 바꿀 수 없습니다',
 'resetpass-no-info' => '이 특수 문서에 직접 접근하려면 반드시 로그인해야 합니다.',
 'resetpass-submit-loggedin' => '비밀번호 바꾸기',
@@ -888,10 +939,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => '비밀번호 재설정',
-'passwordreset-text' => '비밀번호를 재설정하려면 이 양식을 작성해주세요.',
+'passwordreset-text-one' => '비밀번호를 재설정하려면 이 양식을 작성해주세요.',
+'passwordreset-text-many' => '{{PLURAL:$1|비밀번호를 재설정하려면 필드 중 하나를 채우세요.}}',
 'passwordreset-legend' => '비밀번호 재설정',
 'passwordreset-disabled' => '이 위키에서는 비밀번호를 재설정할 수 없습니다.',
-'passwordreset-pretext' => '{{PLURAL:$1||아래에 한 가지 정보를 입력하세요}}',
+'passwordreset-emaildisabled' => '이 위키에서 이메일 기능이 비활성화되어 있습니다.',
 'passwordreset-username' => '사용자 이름:',
 'passwordreset-domain' => '도메인:',
 'passwordreset-capture' => '발송 결과 이메일을 보시겠습니까?',
@@ -920,7 +972,7 @@ $2
 임시 비밀번호: $2',
 'passwordreset-emailsent' => '비밀번호 재설정 이메일을 보냈습니다.',
 'passwordreset-emailsent-capture' => '비밀번호 재설정 이메일이 발송되었으며, 아래에 나타나 있습니다.',
-'passwordreset-emailerror-capture' => '비밀번호 재설정 이메일이 만들어져 아래에 나타났지만 발송하는 데에는 실패했습니다: $1',
+'passwordreset-emailerror-capture' => '비밀번호 재설정 이메일이 생성되어 아래에 보여져 있지만, {{GENDER:$2|사용자}}에게 발송하는 데에는 실패했습니다: $1',
 
 # Special:ChangeEmail
 'changeemail' => '이메일 주소 바꾸기',
@@ -934,6 +986,19 @@ $2
 'changeemail-submit' => '이메일 주소 바꾸기',
 'changeemail-cancel' => '취소',
 
+# Special:ResetTokens
+'resettokens' => '토큰 재설정',
+'resettokens-text' => '여기에 당신의 계정과 관련된 특정 개인 데이터에 접근을 허용하는 토큰을 재설정합니다.
+
+토큰이 다른 사람에게 알려졌거나 계정이 침해되었을 때는 재설정해야 합니다.',
+'resettokens-no-tokens' => '재설정할 토큰이 없습니다.',
+'resettokens-legend' => '토큰 재설정',
+'resettokens-tokens' => '토큰:',
+'resettokens-token-label' => '$1 (현재 값: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|주시문서 목록에 있는 문서의 바뀜]]의 웹 피드(Atom/RSS)에 대한 토큰',
+'resettokens-done' => '토큰을 재설정했습니다.',
+'resettokens-resetbutton' => '선택한 토큰 재설정',
+
 # Edit page toolbar
 'bold_sample' => '굵은 글씨',
 'bold_tip' => '굵은 글씨',
@@ -1138,12 +1203,15 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 문서가 삭제된 것 같습니다.',
 'edit-conflict' => '편집 충돌.',
 'edit-no-change' => '문서에 어떠한 바뀜도 없기 때문에 편집은 무시되었습니다.',
+'postedit-confirmation' => '편집을 저장했습니다.',
 'edit-already-exists' => '새 문서를 만들 수 없습니다.
 문서가 이미 존재합니다.',
 'defaultmessagetext' => '기본 메시지 글',
 'content-failed-to-parse' => '$1 모델에 대한 $2 내용을 구문 분석하는 데 실패했습니다: $3',
 'invalid-content-data' => '잘못된 내용 데이터입니다',
 'content-not-allowed-here' => '"$1" 내용은 [[$2]] 문서예 허용하지 않습니다',
+'editwarning-warning' => '이 페이지에서 벗어나면 저장하지 않은 바뀜이 모두 사라집니다.
+로그인을 했다면, 환경 설정의 "편집 상자"에서 이 경고를 띄우지 않도록 설정할 수 있습니다.',
 
 # Content models
 'content-model-wikitext' => '위키텍스트',
@@ -1179,6 +1247,7 @@ $2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개
 'undo-failure' => '중간의 다른 편집과 충돌하여 이 편집을 되돌릴 수 없습니다.',
 'undo-norev' => '문서가 없거나 삭제되었기 때문에 편집을 되돌릴 수 없습니다.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|토론]])의 $1판 편집을 되돌림',
+'undo-summary-username-hidden' => '숨겨진 사용자가 $1 판을 되돌림',
 
 # Account creation failure
 'cantcreateaccounttitle' => '계정을 만들 수 없음',
@@ -1360,6 +1429,7 @@ $1",
 'compareselectedversions' => '선택한 판을 비교하기',
 'showhideselectedversions' => '선택한 판을 보이기/숨기기',
 'editundo' => '편집 취소',
+'diff-empty' => '(차이 없음)',
 'diff-multi' => '({{PLURAL:$2|한 사용자의|사용자 $2명의}} {{PLURAL:$1|중간의 편집 $1개}} 숨겨짐)',
 'diff-multi-manyusers' => '({{PLURAL:$2|한 사용자의|사용자 $2명 이상의}} {{PLURAL:$1|중간의 편집 $1개}} 숨겨짐)',
 'difference-missing-revision' => '문서 비교에서 {{PLURAL:$2|하나|$2개}}의 판($1)을 찾을 수 {{PLURAL:$2|없습니다}}.
@@ -1387,7 +1457,6 @@ $1",
 'searchmenu-legend' => '찾기 설정',
 'searchmenu-exists' => "'''이 위키에 \"[[:\$1]]\"의 이름을 가진 문서가 있습니다.'''",
 'searchmenu-new' => "'''이 위키에 \"[[:\$1]]\" 문서를 만드세요!'''",
-'searchhelp-url' => 'Help:목차',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|이 접두어로 시작하는 문서 찾기]]',
 'searchprofile-articles' => '본문',
 'searchprofile-project' => '도움말 및 프로젝트 문서',
@@ -1430,15 +1499,7 @@ $1",
 'searchdisabled' => '{{SITENAME}} 찾기 기능이 비활성화되어 있습니다.
 기능이 작동하지 않는 동안에는 구글(Google)을 이용해 찾을 수 있습니다.
 검색 엔진의 내용은 최신이 아닐 수 있다는 점을 주의해주세요.',
-
-# Quickbar
-'qbsettings' => '빨리가기 맞춤',
-'qbsettings-none' => '없음',
-'qbsettings-fixedleft' => '왼쪽 고정',
-'qbsettings-fixedright' => '오른쪽 고정',
-'qbsettings-floatingleft' => '왼쪽 유동',
-'qbsettings-floatingright' => '오른쪽 유동',
-'qbsettings-directionality' => '사용자 언어의 문자 입력 방향에 맞추어 고정',
+'search-error' => '찾는 동안 오류가 발생했습니다: $1',
 
 # Preferences page
 'preferences' => '사용자 환경 설정',
@@ -1472,7 +1533,6 @@ $1",
 'resetprefs' => '저장하지 않은 설정 되돌리기',
 'restoreprefs' => '(모든 부분에서) 모두 기본 설정으로 되돌리기',
 'prefs-editing' => '편집 상자',
-'prefs-edit-boxsize' => '편집 창의 크기',
 'rows' => '줄 수:',
 'columns' => '열 수:',
 'searchresultshead' => '찾기',
@@ -1483,9 +1543,9 @@ $1",
 'recentchangesdays-max' => '최대 $1{{PLURAL:$1|일}}',
 'recentchangescount' => '기본으로 보여줄 편집 수:',
 'prefs-help-recentchangescount' => '이 설정은 최근 바뀜, 문서 역사와 기록에 적용됩니다.',
-'prefs-help-watchlist-token' => '아래에 비밀 값을 넣으면 주시문서 목록에 대한 RSS 피드가 만들어집니다.
-비밀 값을 알고 있는 사람이라면 누구나 피드를 읽을 수 있으므로 안전한 값을 입력해주세요.
-임의로 만들어진 다음 값을 사용할 수도 있습니다: $1',
+'prefs-help-watchlist-token2' => '내 주시문서 목록의 웹 피드의 비밀 키입니다.
+비밀 키를 알고 있는 사람은 내 주시문서 목록을 읽읅 수 있으니 비밀 키를 알리지 마세요.
+[[Special:ResetTokens|비밀 키를 재설정해야 한다면 여기를 클릭하세요]].',
 'savedprefs' => '설정을 저장했습니다.',
 'timezonelegend' => '시간대:',
 'localtime' => '현지 시각:',
@@ -1516,7 +1576,6 @@ $1",
 'prefs-reset-intro' => '이 사이트의 기본값으로 환경 설정을 재설정할 수 있습니다.
 재설정한 환경 설정은 되돌릴 수 없습니다.',
 'prefs-emailconfirm-label' => '이메일 인증:',
-'prefs-textboxsize' => '편집창의 크기',
 'youremail' => '이메일:',
 'username' => '{{GENDER:$1|사용자 이름}}:',
 'uid' => '{{GENDER:$1|사용자}} ID:',
@@ -1552,6 +1611,8 @@ HTML 태그를 확인하세요.',
 'prefs-dateformat' => '날짜 형식',
 'prefs-timeoffset' => '시차 설정',
 'prefs-advancedediting' => '일반 설정',
+'prefs-editor' => '편집자',
+'prefs-preview' => '미리 보기',
 'prefs-advancedrc' => '고급 설정',
 'prefs-advancedrendering' => '고급 설정',
 'prefs-advancedsearchoptions' => '고급 설정',
@@ -1559,7 +1620,9 @@ HTML 태그를 확인하세요.',
 'prefs-displayrc' => '보이기 설정',
 'prefs-displaysearchoptions' => '보이기 설정',
 'prefs-displaywatchlist' => '보이기 설정',
+'prefs-tokenwatchlist' => '토큰',
 'prefs-diffs' => '차이',
+'prefs-help-prefershttps' => '이 사용자 환경 설정은 다음 로그인에 적용됩니다.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => '이메일 주소가 올바른 것으로 보입니다',
@@ -1586,6 +1649,8 @@ HTML 태그를 확인하세요.',
 'userrights-notallowed' => '다른 사용자의 권한을 추가하거나 제거할 권한이 없습니다.',
 'userrights-changeable-col' => '바꿀 수 있는 권한',
 'userrights-unchangeable-col' => '바꿀 수 없는 권한',
+'userrights-conflict' => '사용자 권한 바꾸기가 충돌합니다! 바뀜을 검토하고 확인하세요.',
+'userrights-removed-self' => '자신의 권한을 성공적으로 제거했습니다. 따라서 더 이상 이 문서에 접근할 수 없습니다.',
 
 # Groups
 'group' => '그룹:',
@@ -1651,11 +1716,19 @@ HTML 태그를 확인하세요.',
 'right-proxyunbannable' => '프록시 자동 차단을 적용하지 않음',
 'right-unblockself' => '자신을 차단 해제하기',
 'right-protect' => '보호 수준 바꾸기 및 연쇄 보호된 문서 편집',
-'right-editprotected' => '보호된 문서 편집 (연쇄적 보호 제외)',
+'right-editprotected' => '"{{int:protect-level-sysop}}"로 보호된 문서 편집',
+'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}"로 보호된 문서 편집',
 'right-editinterface' => '사용자 인터페이스를 편집',
 'right-editusercssjs' => '다른 사용자의 CSS와 자바스크립트 문서를 편집',
 'right-editusercss' => '다른 사용자의 CSS 문서를 편집',
 'right-edituserjs' => '다른 사용자의 자바스크립트 문서를 편집',
+'right-editmyusercss' => '자신의 사용자 CSS 파일 편집하기',
+'right-editmyuserjs' => '자신의 사용자 자바스크립트 파일 편집하기',
+'right-viewmywatchlist' => '자신의 주시문서 목록 보기',
+'right-editmywatchlist' => '자신의 주시문서 목록을 편집합니다. 이 권한이 없어도 문서를 추가할 수 있는 권한이 이외에도 있음을 참고하세요.',
+'right-viewmyprivateinfo' => '자신의 개인 데이터 보기 (예를 들어 이메일 주소, 실명)',
+'right-editmyprivateinfo' => '자신의 개인 데이터 편집 (예를 들어 이메일 주소, 실명)',
+'right-editmyoptions' => '자신의 환경 설정 편집',
 'right-rollback' => '특정 문서를 편집한 마지막 사용자의 편집을 신속하게 되돌리기',
 'right-markbotedits' => '되돌리기를 봇의 편집으로 취급 가능',
 'right-noratelimit' => '속도 제한에 영향을 받지 않음',
@@ -1717,12 +1790,19 @@ HTML 태그를 확인하세요.',
 'action-userrights-interwiki' => '다른 위키의 사용자 권한을 조정',
 'action-siteadmin' => '데이터베이스를 잠그거나 잠금 해제하기',
 'action-sendemail' => '이메일 보내기',
+'action-editmywatchlist' => '내 주시문서 목록 편집',
+'action-viewmywatchlist' => '내 주시문서 목록 보기',
+'action-viewmyprivateinfo' => '내 개인 정보 보기',
+'action-editmyprivateinfo' => '내 개인 정보 편집',
 
 # Recent changes
 'nchanges' => '$1개 {{PLURAL:$1|바뀜}}',
+'enhancedrc-since-last-visit' => '{{PLURAL:$1|마지막 방문 이후}} $1개',
+'enhancedrc-history' => '역사',
 'recentchanges' => '최근 바뀜',
 'recentchanges-legend' => '최근 바뀜 설정',
 'recentchanges-summary' => '위키의 최근 바뀜이 나와 있습니다.',
+'recentchanges-noresult' => '지정한 조건과 일치하는 주어진 기간 동안 바뀜이 없습니다.',
 'recentchanges-feed-description' => '위키의 최근 바뀜이 나와 있습니다.',
 'recentchanges-label-newpage' => '새로운 문서',
 'recentchanges-label-minor' => '사소한 편집',
@@ -1759,7 +1839,6 @@ HTML 태그를 확인하세요.',
 'recentchangeslinked-feed' => '가리키는 글의 바뀜',
 'recentchangeslinked-toolbox' => '가리키는 글의 바뀜',
 'recentchangeslinked-title' => '"$1" 문서에 관련된 문서 바뀜',
-'recentchangeslinked-noresult' => '주어진 기간 동안 이 문서에서 링크한 문서의 바뀜이 없습니다.',
 'recentchangeslinked-summary' => "여기를 가리키는 문서(분류일 경우 이 분류에 포함된 문서)에 대한 최근 바뀜이 나와 있습니다.
 [[Special:Watchlist|주시하는 문서]]는 '''굵은''' 글씨로 나타납니다.",
 'recentchangeslinked-page' => '문서 이름:',
@@ -1771,7 +1850,7 @@ HTML 태그를 확인하세요.',
 'reuploaddesc' => '올리기를 취소하고 올리기 양식으로 돌아가기',
 'upload-tryagain' => '수정된 파일 설명을 저장',
 'uploadnologin' => '로그인하지 않음',
-'uploadnologintext' => '파일을 올리려면 [[Special:UserLogin|로그인]]해야 합니다.',
+'uploadnologintext' => '파일을 올리려면 $1해야 합니다.',
 'upload_directory_missing' => '파일 올리기용 디렉터리($1)가 없고 웹 서버가 만들지 못했습니다.',
 'upload_directory_read_only' => '파일 저장 디렉터리($1)에 쓰기 권한이 없습니다.',
 'uploaderror' => '올리기 오류',
@@ -2008,7 +2087,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization 을 참고하십시오
 'http-read-error' => 'HTTP 읽기 오류입니다.',
 'http-timed-out' => 'HTTP 요청 시간 초과입니다.',
 'http-curl-error' => 'URL 열기 오류: $1',
-'http-host-unreachable' => 'URL에 접근하지 못했습니다.',
 'http-bad-status' => 'HTTP 요청 중 오류 발생: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2039,6 +2117,10 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'listfiles_size' => '크기',
 'listfiles_description' => '설명',
 'listfiles_count' => '버전',
+'listfiles-show-all' => '그림의 과거 판 포함',
+'listfiles-latestversion' => '현재 판',
+'listfiles-latestversion-yes' => '예',
+'listfiles-latestversion-no' => '아니오',
 
 # File description page
 'file-anchor-link' => '파일',
@@ -2137,6 +2219,13 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'randompage' => '임의 문서로',
 'randompage-nopages' => '{{PLURAL:$2|다음}} 이름공간에는 문서가 없습니다: $1',
 
+# Random page in category
+'randomincategory' => '분류에 있는 임의 문서',
+'randomincategory-invalidcategory' => '"$1"(은)는 올바른 분류 이름이 아닙니다.',
+'randomincategory-nopages' => '[[:Category:$1]]에 문서가 없습니다.',
+'randomincategory-selectcategory' => '분류에서 임의 문서 얻기: $1 $2',
+'randomincategory-selectcategory-submit' => '보기',
+
 # Random redirect
 'randomredirect' => '임의 넘겨주기 문서로',
 'randomredirect-nopages' => '"$1" 이름공간에서 해당하는 넘겨주기 문서가 없습니다.',
@@ -2162,17 +2251,13 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'statistics-users-active-desc' => '최근 {{PLURAL:$1|$1일}} 동안 활동한 사용자',
 'statistics-mostpopular' => '가장 많이 읽힌 문서',
 
-'disambiguations' => '동음이의 문서를 가리키는 문서 목록',
-'disambiguationspage' => 'Template:동음이의',
-'disambiguations-text' => "다음 문서는 적어도 하나 이상 '''동음이의 문서'''를 가리키고 있습니다.
-그 링크는 다른 적절한 문서로 연결할 필요가 있습니다.<br />
-[[MediaWiki:Disambiguationspage]]에서 링크된 틀을 사용하는 문서를 동음이의 문서로 간주합니다.",
-
 'pageswithprop' => '문서 속성이 있는 문서',
 'pageswithprop-legend' => '문서 속성이 있는 문서',
 'pageswithprop-text' => '이 문서는 특정 문서 속성을 사용한 문서를 나타냅니다.',
 'pageswithprop-prop' => '속성 이름:',
 'pageswithprop-submit' => '가기',
+'pageswithprop-prophidden-long' => '숨겨진 긴 텍스트 속성 값 ($1)',
+'pageswithprop-prophidden-binary' => '숨겨진 이진 속성 값 ($1)',
 
 'doubleredirects' => '이중 넘겨주기 목록',
 'doubleredirectstext' => '이 문서는 다른 넘겨주기 문서로 넘겨주고 있는 문서의 목록입니다.
@@ -2231,6 +2316,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'mostrevisions' => '가장 많이 편집된 문서 목록',
 'prefixindex' => '접두어에 따른 문서 목록',
 'prefixindex-namespace' => '접두어가 있는 모든 문서 ($1 이름공간)',
+'prefixindex-strip' => '목록에서 접두어 생략',
 'shortpages' => '짧은 문서 목록',
 'longpages' => '긴 문서 목록',
 'deadendpages' => '막다른 문서 목록',
@@ -2246,6 +2332,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'listusers' => '사용자 목록',
 'listusers-editsonly' => '기여가 있는 사용자만 보기',
 'listusers-creationsort' => '계정을 만든 날짜 순으로 정렬',
+'listusers-desc' => '내림차순으로 정렬',
 'usereditcount' => '{{PLURAL:$1|편집}} $1회',
 'usercreated' => '$1 $2에 계정 {{GENDER:$3|만들어짐}}',
 'newpages' => '새 문서 목록',
@@ -2425,10 +2512,9 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'unwatchthispage' => '주시 해제하기',
 'notanarticle' => '문서가 아님',
 'notvisiblerev' => '이 판은 삭제되었습니다.',
-'watchnochange' => '주어진 기간 중에 바뀐 주시문서가 없습니다.',
 'watchlist-details' => '토론을 제외하고 {{PLURAL:$1|문서 $1개}}를 주시하고 있습니다.',
-'wlheader-enotif' => '* 이메일 알림 기능이 활성화되었습니다.',
-'wlheader-showupdated' => "* 마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 보여집니다.",
+'wlheader-enotif' => '이메일 알림 기능이 활성화되었습니다.',
+'wlheader-showupdated' => "마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 보여집니다.",
 'watchmethod-recent' => '주시된 문서를 확인하고자 최근 편집을 확인',
 'watchmethod-list' => '최근 편집을 확인하고자 주시된 문서 확인',
 'watchlistcontains' => '{{PLURAL:$1|문서 $1개}}를 주시하고 있습니다.',
@@ -2683,7 +2769,7 @@ $1',
 'contributions' => '{{GENDER:$1|사용자}} 기여',
 'contributions-title' => '$1 사용자의 기여 목록',
 'mycontris' => '기여 목록',
-'contribsub2' => '$1($2)의 기여',
+'contribsub2' => '{{GENDER:$3|$1}}($2)의 기여',
 'nocontribs' => '지정한 조건과 일치하는 바뀜을 찾을 수 없습니다.',
 'uctop' => '(최신)',
 'month' => '월:',
@@ -2843,15 +2929,13 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 하지만 $2로 광역 차단되었기 때문에, 광역 차단 해제로 차단을 해제할 수 있습니다.',
 'ip_range_invalid' => 'IP 범위가 잘못되었습니다.',
 'ip_range_toolarge' => '/$1보다 넓은 범위의 광역 차단을 할 수 없습니다.',
-'blockme' => '자가 차단',
 'proxyblocker' => '프록시 차단',
-'proxyblocker-disabled' => '이 기능은 비활성되어 있습니다.',
 'proxyblockreason' => '당신의 IP 주소는 공개 프록시로 밝혀져 자동으로 차단됩니다.
 만약 인터넷 사용에 문제가 있다면 인터넷 서비스 공급자나 기술 지원팀에게 문의해주세요.',
-'proxyblocksuccess' => '완료.',
 'sorbsreason' => '당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.',
 'sorbs_create_account_reason' => '당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.
 계정을 만들 수 없습니다.',
+'xffblockreason' => 'X-Forwarded-For 헤더에 현재 사용하고 있는 프록시 서버 중 당신이나 해당 IP 주소가 차단되었습니다. 차단 이유는 다음과 같습니다: $1',
 'cant-block-while-blocked' => '자신이 차단되어 있는 동안에는 다른 사용자를 차단할 수 없습니다.',
 'cant-see-hidden-user' => '차단하려 하는 사용자는 이미 차단되었고 숨김 처리되었습니다.
 사용자 숨기기 권한을 갖고 있지 않기 때문에, 이 사용자의 차단 기록을 보거나 차단 설정을 바꿀 수 없습니다.',
@@ -3016,6 +3100,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'thumbnail-more' => '실제 크기로',
 'filemissing' => '파일 사라짐',
 'thumbnail_error' => '섬네일을 만드는 중 오류 발생: $1',
+'thumbnail_error_remote' => '$1에서 반환한 오류 메시지:
+$2',
 'djvu_page_error' => 'DjVu 페이지 범위 벗어남',
 'djvu_no_xml' => 'DjVu 파일의 XML 정보를 읽을 수 없음',
 'thumbnail-temp-create' => '임시 섬네일 파일을 만들 수 없습니다.',
@@ -3166,20 +3252,15 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-undo' => '"편집 취소" 기능을 사용하면 이 편집이 되돌려지고 차이 보기 기능이 미리 보기 형식으로 나타납니다. 편집 요약에 이 편집을 왜 되돌리는지에 대한 이유를 쓸 수 있습니다.',
 'tooltip-preferences-save' => '환경 설정 저장하기',
 'tooltip-summary' => '짧은 요약을 적어주세요',
+'tooltip-iwiki' => '$2 - $1',
 
 # Stylesheets
 'common.css' => '/* 이 CSS 설정은 모든 스킨에 동일하게 적용됩니다 */',
-'standard.css' => '/* 이 CSS 설정은 스탠다드 스킨을 사용하는 사용자에게 적용됩니다 */',
-'nostalgia.css' => '/* 이 CSS 설정은 노스탤지아 스킨을 사용하는 사용자에게 적용됩니다 */',
 'cologneblue.css' => '/* 이 CSS 설정은 쾰른 블루 스킨을 사용하는 사용자에게 적용됩니다 */',
 'monobook.css' => '/* 이 CSS 설정은 모노북 스킨을 사용하는 사용자에게 적용됩니다 */',
-'myskin.css' => '/* 이 CSS 설정은 마이스킨 스킨을 사용하는 사용자에게 적용됩니다 */',
-'chick.css' => '/* 이 CSS 설정은 치크 스킨을 사용하는 사용자에게 적용됩니다 */',
-'simple.css' => '/* 이 CSS 설정은 심플 스킨을 사용하는 사용자에게 적용됩니다 */',
 'modern.css' => '/* 이 CSS 설정은 모던 스킨을 사용하는 사용자에게 적용됩니다 */',
 'vector.css' => '/* 이 CSS 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다 */',
 'print.css' => '/* 이 CSS 설정은 인쇄 출력 화면에 적용됩니다 */',
-'handheld.css' => '/* 이 CSS 설정은 $wgHandheldStyle에 설정한 스킨을 기반으로 한 휴대 기기에 적용됩니다 */',
 'noscript.css' => '/* 이 CSS 설정은 자바스크립트를 비활성화한 사용자에 적용됩니다 */',
 'group-autoconfirmed.css' => '/* 이 CSS 설정은 자동 인증된 사용자에만 적용됩니다 */',
 'group-bot.css' => '/* 이 CSS 설정은 봇에만 적용됩니다 */',
@@ -3188,13 +3269,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 
 # Scripts
 'common.js' => '/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */',
-'standard.js' => '/* 이 자바스크립트 설정은 스탠다드 스킨을 사용하는 사용자에게 적용됩니다 */',
-'nostalgia.js' => '/* 이 자바스크립트 설정은 노스탤지아 스킨을 사용하는 사용자에게 적용됩니다 */',
 'cologneblue.js' => '/* 이 자바스크립트 설정은 쾰른 블루 스킨을 사용하는 사용자에게 적용됩니다 */',
 'monobook.js' => '/* 이 자바스크립트 설정은 모노북 스킨을 사용하는 사용자에게 적용됩니다 */',
-'myskin.js' => '/* 이 자바스크립트 설정은 마이스킨 스킨을 사용하는 사용자에게 적용됩니다 */',
-'chick.js' => '/* 이 자바스크립트 설정은 치크 스킨을 사용하는 사용자에게 적용됩니다 */',
-'simple.js' => '/* 이 자바스크립트 설정은 심플 스킨을 사용하는 사용자에게 적용됩니다 */',
 'modern.js' => '/* 이 자바스크립트 설정은 모던 스킨을 사용하는 사용자에게 적용됩니다 */',
 'vector.js' => '/* 이 자바스크립트 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다 */',
 'group-autoconfirmed.js' => '/* 이 자바스크립트 설정은 자동 인증된 사용자에만 적용됩니다 */',
@@ -3275,13 +3351,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'pageinfo-category-files' => '파일 수',
 
 # Skin names
-'skinname-standard' => '클래식',
-'skinname-nostalgia' => '노스탤지아',
 'skinname-cologneblue' => '쾰른 블루',
 'skinname-monobook' => '모노북',
-'skinname-myskin' => '마이스킨',
-'skinname-chick' => '치크',
-'skinname-simple' => '심플',
 'skinname-modern' => '모던',
 'skinname-vector' => '벡터',
 
@@ -3360,11 +3431,25 @@ $1',
 'minutes' => '$1분',
 'hours' => '$1시간',
 'days' => '$1일',
+'weeks' => '{{PLURAL:$1|$1주}}',
 'months' => '$1달',
 'years' => '$1년',
 'ago' => '$1 전',
 'just-now' => '방금',
 
+# Human-readable timestamps
+'hours-ago' => '$1시간 전',
+'minutes-ago' => '$1분 전',
+'seconds-ago' => '$1초 전',
+'monday-at' => '월요일 $1',
+'tuesday-at' => '화요일 $1',
+'wednesday-at' => '수요일 $1',
+'thursday-at' => '목요일 $1',
+'friday-at' => '금요일 $1',
+'saturday-at' => '토요일 $1',
+'sunday-at' => '일요일 $1',
+'yesterday-at' => '어제 $1',
+
 # Bad image list
 'bad_image_list' => '형식은 아래와 같습니다.
 
@@ -3401,7 +3486,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '너비',
 'exif-imagelength' => '높이',
 'exif-bitspersample' => '픽셀당 비트 수',
@@ -3579,7 +3664,7 @@ Variants for Chinese language
 'exif-originalimageheight' => '자르기 전 그림의 세로 길이',
 'exif-originalimagewidth' => '자르기 전 그림의 가로 길이',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '압축되지 않음',
 'exif-compression-2' => 'CCITT 그룹-3 1차원 수정 허프먼 반복 길이 부호화',
 'exif-compression-3' => 'CCITT 그룹-3 팩스 인코딩',
@@ -3980,7 +4065,6 @@ $5
 'version-other' => '기타',
 'version-mediahandlers' => '미디어 핸들러',
 'version-hooks' => '훅',
-'version-extension-functions' => '확장 함수',
 'version-parser-extensiontags' => '파서 확장 태그',
 'version-parser-function-hooks' => '파서 함수 훅',
 'version-hook-name' => '훅 이름',
@@ -3989,6 +4073,7 @@ $5
 'version-license' => '라이선스',
 'version-poweredby-credits' => "이 위키는 '''[//www.mediawiki.org/ MediaWiki]'''를 기반으로 작동합니다. Copyright © 2001-$1 $2.",
 'version-poweredby-others' => '그 외 다른 개발자',
+'version-poweredby-translators' => 'translatewiki.net 번역자',
 'version-credits-summary' => '[[Special:Version|미디어위키]]에 기여한 다음 사람한테 감사드립니다.',
 'version-license-info' => "미디어위키는 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 파일을 재배포하거나 수정할 수 있습니다.
 
@@ -4004,12 +4089,17 @@ $5
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath 문서 경로]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath 스크립트 경로]',
 
-# Special:FilePath
-'filepath' => '파일 경로',
-'filepath-page' => '파일:',
-'filepath-submit' => '얻기',
-'filepath-summary' => '파일의 실제 URL 주소를 엽니다.
-그림 파일일 경우 원본 해상도의 파일이 열립니다. 다른 종류의 파일일 경우 그 파일의 종류에 맞는 프로그램이 실행됩니다.',
+# Special:Redirect
+'redirect' => '파일, 사용자나 판 ID별 넘겨주기',
+'redirect-legend' => '파일이나 문서로 넘겨주기',
+'redirect-summary' => '이 특수 문서는 파일(파일 이름을 지정), 문서(판 ID를 지정)나 사용자 문서(사용자 ID를 정수로 지정)로 넘겨줍니다.',
+'redirect-submit' => '찾기',
+'redirect-lookup' => '찾을 종류:',
+'redirect-value' => '값:',
+'redirect-user' => '사용자 ID',
+'redirect-revision' => '문서 판',
+'redirect-file' => '파일 이름',
+'redirect-not-exists' => '값을 찾을 수 없습니다',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '중복된 파일 찾기',
@@ -4058,12 +4148,16 @@ $5
 'tags' => '유효한 편집 태그',
 'tag-filter' => '[[Special:Tags|태그]] 필터:',
 'tag-filter-submit' => '필터',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|태그}}]]: $2)',
 'tags-title' => '태그',
 'tags-intro' => '이 문서는 소프트웨어에서 편집에 대해 표시하는 태그와 그 의미를 설명하는 목록입니다.',
 'tags-tag' => '태그 이름',
 'tags-display-header' => '바뀜 목록의 모양',
 'tags-description-header' => '태그에 대한 설명',
+'tags-active-header' => '활성하겠습니까?',
 'tags-hitcount-header' => '태그된 바뀜',
+'tags-active-yes' => '예',
+'tags-active-no' => '아니오',
 'tags-edit' => '편집',
 'tags-hitcount' => '$1개 {{PLURAL:$1|바뀜}}',
 
@@ -4084,6 +4178,7 @@ $5
 'dberr-problems' => '죄송합니다! 이 사이트에 기술적인 문제가 발생하고 있습니다.',
 'dberr-again' => '잠시 기다리고 나서 다시 불러오세요.',
 'dberr-info' => '(데이터베이스 서버에 연결할 수 없습니다: $1)',
+'dberr-info-hidden' => '(데이터베이스 서버에 연결할 수 없습니다)',
 'dberr-usegoogle' => '그 동안 Google을 통해 검색할 수도 있습니다.',
 'dberr-outofdate' => '수집된 내용은 오래된 것일 수도 있음을 참고하세요.',
 'dberr-cachederror' => '다음은 요청한 문서의 캐시된 복사본이며, 최신이 아닐 수도 있습니다.',
@@ -4099,6 +4194,9 @@ $5
 'htmlform-submit' => '저장',
 'htmlform-reset' => '바뀜을 되돌리기',
 'htmlform-selectorother-other' => '기타',
+'htmlform-no' => '아니오',
+'htmlform-yes' => '예',
+'htmlform-chosen-placeholder' => '선택하세요',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 (본문 전체 찾기)',
@@ -4216,4 +4314,19 @@ $5
 # Image rotation
 'rotate-comment' => '그림을 시계 방향으로 $1{{PLURAL:$1|도}}로 회전함',
 
+# Limit report
+'limitreport-title' => '파서 프로파일링 데이터:',
+'limitreport-cputime' => 'CPU 시간 사용',
+'limitreport-cputime-value' => '$1{{PLURAL:$1|초}}',
+'limitreport-walltime' => '실제 시간 사용',
+'limitreport-walltime-value' => '$1{{PLURAL:$1|초}}',
+'limitreport-ppvisitednodes' => '전처리기가 방문한 노드 수',
+'limitreport-ppgeneratednodes' => '전처리기가 생성한 노드 수',
+'limitreport-postexpandincludesize' => '전개한 뒤 포함 크기',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|바이트}}',
+'limitreport-templateargumentsize' => '틀 인수 크기',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|바이트}}',
+'limitreport-expansiondepth' => '최대 전개 깊이',
+'limitreport-expensivefunctioncount' => '부하 높은 파서 함수 수',
+
 );
diff --git a/languages/messages/MessagesKoi.php b/languages/messages/MessagesKoi.php
index 4b61931c..ab8c0d51 100644
--- a/languages/messages/MessagesKoi.php
+++ b/languages/messages/MessagesKoi.php
@@ -145,7 +145,7 @@ $messages = array(
 'jumptonavigation' => 'уялöм',
 'jumptosearch' => 'кошшан',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} йылiсь',
 'aboutpage' => 'Project:сы йылiсь',
 'copyright' => 'Быдöс этiйö позьö копируйтны $1 сьöртi.',
@@ -155,7 +155,6 @@ $messages = array(
 'disclaimers' => 'Мийö сöстöмöсь йöз одзын',
 'disclaimerpage' => 'Project:Мийö сöстöмöсь йöз одзын',
 'edithelp' => 'Уджкерись понда отсöт',
-'edithelppage' => 'Help:Уджкерись понда отсöт',
 'helppage' => 'Help:Отсöт',
 'mainpage' => 'Пондöтчан листбок',
 'mainpage-description' => 'Пондöтчан листбок',
@@ -737,7 +736,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Пасьта',
 'exif-imagelength' => 'Вылына',
 
diff --git a/languages/messages/MessagesKrc.php b/languages/messages/MessagesKrc.php
index da54bf13..b886dce4 100644
--- a/languages/messages/MessagesKrc.php
+++ b/languages/messages/MessagesKrc.php
@@ -44,21 +44,65 @@ $specialPageAliases = array(
 	'Allmessages'               => array( 'Системаны_билдириулери' ),
 	'Allpages'                  => array( 'Бютеу_бетле' ),
 	'Blankpage'                 => array( 'Бош_бет' ),
-	'Block'                     => array( 'Блокла' ),
-	'Blockme'                   => array( 'Мени_блокла' ),
+	'Block'                     => array( 'Блок_эт' ),
+	'Blockme'                   => array( 'Мени_блок_эт' ),
 	'Booksources'               => array( 'Китабланы_къайнакълары' ),
 	'BrokenRedirects'           => array( 'Джыртылгъан_редиректле' ),
 	'Categories'                => array( 'Категорияла' ),
-	'ChangeEmail'               => array( 'E-mail_ауушдур' ),
-	'ChangePassword'            => array( 'Пароль_ауушдур' ),
+	'ChangeEmail'               => array( 'E-mail’ни_ауушдур' ),
+	'ChangePassword'            => array( 'Паролну_ауушдур' ),
 	'ComparePages'              => array( 'Бетлени_тенглешдириу' ),
-	'Confirmemail'              => array( 'E-mail_тюзлюгюн_бегит' ),
+	'Confirmemail'              => array( 'E-mail’ни_тюзлюгюн_бегит' ),
 	'Contributions'             => array( 'Къошум' ),
-	'CreateAccount'             => array( 'Тергеу_джазыуну_къура', 'Къошулуучуну_къура', 'Зарегистрироваться' ),
+	'CreateAccount'             => array( 'Тергеу_джазыуну_къура', 'Къошулуучуну_къура', 'Регистрация_эт' ),
 	'Deadendpages'              => array( 'Чыкъмазча_бетле' ),
 	'DeletedContributions'      => array( 'Кетерилген_къошум' ),
 	'Disambiguations'           => array( 'Кёб_магъаналы' ),
 	'DoubleRedirects'           => array( 'Экили_редирект' ),
+	'EditWatchlist'             => array( 'Кёздеги_тизмени_тюрлендир' ),
+	'Emailuser'                 => array( 'Къошулуучугъа_джазма', 'Джазма_ий' ),
+	'Export'                    => array( 'Экспорт', 'Къотарыу' ),
+	'FileDuplicateSearch'       => array( 'Файлланы_дубликатларын_излеу' ),
+	'Filepath'                  => array( 'Файлгъа_джол' ),
+	'Import'                    => array( 'Импорт' ),
+	'BlockList'                 => array( 'Блок_этиулени_тизмеси', 'Блок_этиуле' ),
+	'LinkSearch'                => array( 'Джибериуле_излеу' ),
+	'Listadmins'                => array( 'Администраторланы_тизмеси' ),
+	'Listbots'                  => array( 'Ботланы_тизмеси' ),
+	'Listfiles'                 => array( 'Файлланы_тизмеси', 'Суратланы_тизмеси' ),
+	'Listgrouprights'           => array( 'Къошулуучу_къауумланы_хакълары', 'Къауумланы_хакъларыны_тизмеси' ),
+	'Listredirects'             => array( 'Редиректлени_тизмеси' ),
+	'Listusers'                 => array( 'Къошулуучуланы_тизмеси' ),
+	'Lockdb'                    => array( 'Билгиле_базаны_блок_эт' ),
+	'Log'                       => array( 'Журналла', 'Журнал' ),
+	'Lonelypages'               => array( 'Изоляция_этилген_бетле' ),
+	'Longpages'                 => array( 'Узун_бетле' ),
+	'MergeHistory'              => array( 'Тарихлени_бирикдириу' ),
+	'MIMEsearch'                => array( 'MIME’ге_кёре_излеу' ),
+	'Mostimages'                => array( 'Эм_кёб_хайырланнган_файлла' ),
+	'Movepage'                  => array( 'Бетни_атын_тюрлендириу', 'Атны_тюрлендириу', 'Атны_тюрлендир' ),
+	'Mycontributions'           => array( 'Мени_къошумум' ),
+	'Mypage'                    => array( 'Мени_бетим' ),
+	'Mytalk'                    => array( 'Мени_сюзюуюм' ),
+	'Myuploads'                 => array( 'Мени_джюклегенлерим' ),
+	'Newimages'                 => array( 'Джангы_файлла' ),
+	'Newpages'                  => array( 'Джангы_бетле' ),
+	'PasswordReset'             => array( 'Паролну_ийиу' ),
+	'PermanentLink'             => array( 'Дайым_джибериу' ),
+	'Popularpages'              => array( 'Популяр_бетле' ),
+	'Preferences'               => array( 'Джарашдырыула' ),
+	'Protectedpages'            => array( 'Джакъланнган_бетле' ),
+	'Protectedtitles'           => array( 'Джакъланнган_атла' ),
+	'Randompage'                => array( 'Эсде_болмагъан_бет', 'Эсде_болмагъан' ),
+	'Recentchanges'             => array( 'Ахыр_тюрлениуле' ),
+	'Recentchangeslinked'       => array( 'Байламлы_тюрлениуле' ),
+	'Revisiondelete'            => array( 'Кетерилген_тюрлениуле' ),
+	'Search'                    => array( 'Излеу' ),
+	'Shortpages'                => array( 'Къысха_бетле' ),
+	'Specialpages'              => array( 'Энчи_бетле' ),
+	'Statistics'                => array( 'Статистика' ),
+	'Tags'                      => array( 'Белгиле' ),
+	'Unblock'                   => array( 'Блокну_алыу' ),
 );
 
 $magicWords = array(
@@ -98,9 +142,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Бетни, кёзде тургъан тизмелерине къошханланы санын кёргюз',
 'tog-oldsig' => 'Бусагъатдагъы къол салыннган:',
 'tog-fancysig' => 'Къол салыуну энчи вики-тексти (автомат джибериусюз)',
-'tog-externaleditor' => 'Тынгылау бла тыш редакторну хайырландырыу (къуру усталагъа, компьютерни энчи джарашдырылыуу керекди; [//www.mediawiki.org/wiki/Manual:External_editors толуракъ])',
-'tog-externaldiff' => 'Версияланы тенглешдириучу тыш программа хайырландырыу  (къуру усталагъа, компьютерни энчи джарашдырылыуу керекди; [//www.mediawiki.org/wiki/Manual:External_editors толуракъ])',
-'tog-showjumplinks' => '«Бар» болушлукъ джибериуню джандыр',
 'tog-uselivepreview' => 'Терк ал къарауну хайырландыр (JavaScript, экспериментал халда)',
 'tog-forceeditsummary' => 'Тюрлендириуню ачыкълау тизгини бош къалса, билдир',
 'tog-watchlisthideown' => 'Кёзюмде тургъан бетден мени тюрлендириулерими джашыр',
@@ -113,6 +154,7 @@ $messages = array(
 'tog-diffonly' => 'Версия тенглешдириуню тюбю бла бетни ичиндегисин кёргюзме',
 'tog-showhiddencats' => 'Джашыртын категорияланы кёргюз',
 'tog-norollbackdiff' => 'Къайтарыудан сора версияланы башхалыкъларын кёргюзме',
+'tog-useeditwarning' => 'Тюрлендириулени сакълатмай редакторлау бетден кетген сагъатымда билдир',
 
 'underline-always' => 'Хаманда',
 'underline-never' => 'Бир заманда да',
@@ -176,6 +218,18 @@ $messages = array(
 'oct' => 'окт',
 'nov' => 'ноя',
 'dec' => 'дек',
+'january-date' => '$1 январь',
+'february-date' => '$1 февраль',
+'march-date' => '$1 март',
+'april-date' => '$1 апрель',
+'may-date' => '$1 май',
+'june-date' => '$1 июнь',
+'july-date' => '$1 июль',
+'august-date' => '$1 август',
+'september-date' => '$1 сентябрь',
+'october-date' => '$1 октябрь',
+'november-date' => '$1 ноябрь',
+'december-date' => '$1 декабрь',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категория|Категорияла}}',
@@ -300,7 +354,7 @@ $1',
 'pool-queuefull' => 'Соруула джыйыучу толуду',
 'pool-errorunknown' => 'Билинмеген халат',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} сайтны юсюнден',
 'aboutpage' => 'Project:Суратлау',
 'copyright' => 'Ичиндегиси,  $1 лицензиягъа кёре бериледи (башха белгиленмеген эсе).',
@@ -310,7 +364,6 @@ $1',
 'disclaimers' => 'Джууаблылыкъны унамау',
 'disclaimerpage' => 'Project:Джууаблылыкъны унамау',
 'edithelp' => 'Тюрлендириуню юсюнден болушлукъ',
-'edithelppage' => 'Help:Тюрлендириу',
 'helppage' => 'Help:Болушлукъ',
 'mainpage' => 'Баш бет',
 'mainpage-description' => 'Баш бет',
@@ -387,17 +440,6 @@ $1',
 # General errors
 'error' => 'Халат',
 'databaseerror' => 'Информация базада халат',
-'dberrortext' => 'Информация базагъа джиберилген сорууда синтаксис халат табылды.
-Программада халатны ачыкъларгъа да боллукъду ол.
-Информация базагъа ахыр соруу:
-<blockquote><code>$1</code></blockquote>
-«<code>$2</code>» функциясындан болгъанды.
-База «<samp>$3: $4</samp>» халатны къайтарды.',
-'dberrortextcl' => 'Информация базагъа джиберилген сорууда синтаксис халат табылды.
-Информация базагъа ахыр соруу:
-«$1»
-«$2» функциясындан болгъанды.
-База «$3: $4»  халатны къайтарды.',
 'laggedslavemode' => 'Эс бёлюгюз! Бу бетге ахыр джангыртыула болмазгъа боллукъдула.',
 'readonly' => 'Информация база джабыкъды',
 'enterlockreason' => 'Блок этилиуню чурумун эм заманын белгилегиз.',
@@ -449,7 +491,6 @@ $1',
 'protectedinterface' => 'Бу бетде программаны интерфейс билдириую барды.
 Бютеу викиледе да бу билдириуню кёчюрмесин къошар неда тюрлендирир ючюн MediaWiki-ни локализациясыны сайты [//translatewiki.net/ translatewiki.net]-ни хайырландырыгъыз.',
 'editinginterface' => "'''Эс бёл:''' Сен системаны интерфейс бетин тюрлендире тураса. Бу, викини башха къошулуучуларына да тиерик затды. Кёчюрюр ючюн неда кёчюрмелени тюрлендирир ючюн, MediaWiki-ни локализация этиу проекти [//translatewiki.net/ translatewiki.net]-ни хайырландырыгъыз.",
-'sqlhidden' => '(SQL соруу джашырылыбды)',
 'cascadeprotected' => 'Бу бет тюрлениуледен джакъланыбды, ол каскадлы джакълау къабыл этилиннген  {{PLURAL:$1|бетге|бетлеге}} киргени ючюндю:
 $2',
 'namespaceprotected' => '«$1» ат аламда бетлени тюрлендирирге эркинлигигиз джокъду.',
@@ -480,10 +521,18 @@ $2',
 'welcomecreation-msg' => 'Сизни тергеу джазыуугъуз (аккаунтугъуз) къуралды.
 {{SITENAME}} сайтда [[Special:Preferences|джарашдырыуларыгъызны]] тюрлендирирге унутмагъыз.',
 'yourname' => 'Къошулуучуну аты',
+'userlogin-yourname' => 'Тергеу джазыуну аты',
+'userlogin-yourname-ph' => 'Тергеу джазыуунгу атын джаз',
 'yourpassword' => 'Паролюгъуз:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Паролунгу джаз',
+'createacct-yourpassword-ph' => 'Пароль джаз',
 'yourpasswordagain' => 'Паролну джангыдан джаз:',
+'createacct-yourpasswordagain' => 'Паролну бегит',
+'createacct-yourpasswordagain-ph' => 'Паролну энтда бир кере джаз',
 'remembermypassword' => 'Бу компьютерде мени тергеў джазыўуму унутма (эм кёб $1 {{PLURAL:$1|кюн|кюн}})',
-'securelogin-stick-https' => 'Чыкъгъандан сора да HTTPS бла байламлы къой',
+'userlogin-remembermypassword' => 'Системада туруу',
+'userlogin-signwithsecure' => 'Джакъланнган байлам',
 'yourdomainname' => 'Сизни доменигиз:',
 'password-change-forbidden' => 'Бу викиде паролугъузну тюрлендиреллик тюлсюз.',
 'externaldberror' => 'Тыш информация базаны болушлугъу бла аутентификация, халатлы болду, неда тыш аккаунтугъузну тюрлендирирге хакъларагъыз джетмейди.',
@@ -495,18 +544,38 @@ $2',
 'logout' => 'Чыгъыу',
 'userlogout' => 'Чыгъыу',
 'notloggedin' => 'Авторизация ётмегенсиз',
+'userlogin-noaccount' => 'Аккаунтунг джокъмуду?',
+'userlogin-joinproject' => '{{SITENAME}} сайтха къошул',
 'nologin' => 'Тергеу джазыуугъуз (аккаунтугъуз) джокъмуду? $1.',
 'nologinlink' => 'Тергеу джазыу (аккаунт) къурагъыз',
 'createaccount' => 'Джангы къошулуучуну регистрация эт',
 'gotaccount' => 'Тергеу джазыуугъуз (аккаунтугъуз) энди бармыды? $1.',
 'gotaccountlink' => 'Кириу',
 'userlogin-resetlink' => 'Кирир ючюн билгилеригизни унутхан этгенмисиз?',
+'userlogin-resetpassword-link' => 'Паролну джибериу',
+'helplogin-url' => 'Help:Кириу',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Системагъа кириуде болушлукъ]]',
+'createacct-join' => 'Билгилеринги тюбюрекде джаз.',
+'createacct-emailrequired' => 'Электрон почтаны адреси',
+'createacct-emailoptional' => 'Электрон почтаны адреси (амалсыз тюлдю)',
+'createacct-email-ph' => 'Электрон почта адресигизни джазыгъыз',
 'createaccountmail' => 'Эсде болмагъанлай генерация этилген болджаллы паролну хайырландыр эм тюбюрекде берилген электрон почта адресге ий:',
+'createacct-realname' => 'Керти атыгъыз (ажымсыз керек тюлдю)',
 'createaccountreason' => 'Чурум:',
+'createacct-reason' => 'Чурум',
+'createacct-reason-ph' => 'Башха тергеу джазыуну нек къураусыз',
+'createacct-captcha' => 'Къоркъуусузлукъну тинтиу',
+'createacct-imgcaptcha-ph' => 'Башыракъда кёрюннген текстни джаз',
+'createacct-submit' => 'Тергеу джазыуну къура',
+'createacct-benefit-heading' => '{{SITENAME}} сизнича адамла бла къуралгъанды.',
+'createacct-benefit-body1' => '{{PLURAL:$1|тюрлениу}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|бет}}',
+'createacct-benefit-body3' => 'арт заманда {{PLURAL:$1|къошум этген}}',
 'badretype' => 'Джазгъан паролларыгъыз бир-бирине келишмейдиле.',
 'userexists' => 'Джазылгъан ат хайырландырылады.
 Башха ат сайлагъыз.',
 'loginerror' => 'Кириу хата',
+'createacct-error' => 'Тергеу джазыу къурауда халат',
 'createaccounterror' => 'Быллай тергеу джазыу (аккаунт) къураргъа болмайды: $1',
 'nocookiesnew' => 'Къошлуучу регистрацияны ётгенди, алай кирмегенди. {{SITENAME}} къошулуучуланы таныр ючюн «cookies»-ни хайырландырады. Сиз «cookies»-ни эркин этмегенсиз. «Cookies»-ни эркин этигиза да, андан сора джангы атыгъыз эм паролюгъуз бла киригиз.',
 'nocookieslogin' => '{{SITENAME}} къошулуучуланы таныр ючюн «cookies»-ни хаырландырады. Сиз аны джукълатыб турасыз. «Cookies»-ни эркин этигизда джангыдан кёрюгюз.',
@@ -576,7 +645,7 @@ $2',
 'newpassword' => 'Джангы пароль:',
 'retypenew' => 'Джангы паролну къайтарыгъыз:',
 'resetpass_submit' => 'Паролну бегит эм кир',
-'resetpass_success' => 'Сизни паролюгъуз тыйыншлы тюрлендирилди! Системагъа кириу барады…',
+'changepassword-success' => 'Сизни паролюгъуз тыйыншлы тюрлендирилди! Системагъа кириу барады…',
 'resetpass_forbidden' => 'Пароль тюрленирге болмайды',
 'resetpass-no-info' => 'Бу бетни кёрюр ючюн сиз системагъа тергеу джазыуугъуз (аккаунтугъуз) бла кирирге керексиз.',
 'resetpass-submit-loggedin' => 'Паролну тюрлендир',
@@ -588,10 +657,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Паролну джибериу',
-'passwordreset-text' => 'Паролугъуз джиберилир ючюн бу форманы толтуругъуз.',
+'passwordreset-text-one' => 'Паролугъуз джиберилир ючюн бу форманы толтуругъуз.',
+'passwordreset-text-many' => '{{PLURAL:$1|Пароль ийилир ючюн билгилени бир бёлюмюн джазыгъыз.}}',
 'passwordreset-legend' => 'Паролну атыу',
 'passwordreset-disabled' => 'Бу викиде паролла атыу амал джукъланыбды.',
-'passwordreset-pretext' => '{{PLURAL:$1||Тюбюрекде берилген билгиледен бирин джазыгъыз}}',
+'passwordreset-emaildisabled' => 'Бу викиде электрон почтаны функциялары джукъланыбдыла.',
 'passwordreset-username' => 'Къошулуучуну аты:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Джазылгъан билдириуню эсебине къара?',
@@ -602,7 +672,7 @@ $2',
 Болджаллы пароль: $2',
 'passwordreset-emailsent' => 'Пароль бла e-mail ийилди.',
 'passwordreset-emailsent-capture' => 'Ийилген пароль эсгертиу e-mail тюбюрекде берилибди.',
-'passwordreset-emailerror-capture' => 'Ийилген эсгертиу e-mail тюбюрекде берилибди, аны ашырыуу джетишимсиз болду, чурум: $1',
+'passwordreset-emailerror-capture' => 'Пароль эсгертиу e-mail генерация этилди (тюбюрекде берилибди), аны {{GENDER:$2|къошулуучугъа}} ашырыу джетишимсиз болду, чурум: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Электрон почтаны адресин ауушдур',
@@ -801,12 +871,15 @@ $2',
 Кетерилген болур.',
 'edit-conflict' => 'Тюрлендириулени конфликти.',
 'edit-no-change' => 'Текстде тюрлениуле эсленмегени ючюн, сизни тюрлендириуюгюз къабыл этилмеди.',
+'postedit-confirmation' => 'Тюрлендириуюгюз сакъланды.',
 'edit-already-exists' => 'Джангы бет къураргъа боллукъ тюлдю.
 Алайсызда барды бу атлы бет.',
 'defaultmessagetext' => 'Тынгылау бла текст',
 'content-failed-to-parse' => '$2 контент $1 типге келишмейди: $3',
 'invalid-content-data' => 'Джаламагъан билгиле',
 'content-not-allowed-here' => '[[$2]] бетни ичинде "$1" контент джарамайды',
+'editwarning-warning' => 'Башха бетге кёчсегиз, этген тюрлениулеригиз тас болургъа боллукъдула.
+Системада регистрацияны ётген эсегиз, бу билдириуню джарашдырыуларыгъызны «Тюрлендириу» деген бёлюмюнде джукълатыргъа боллукъсуз.',
 
 # Content models
 'content-model-wikitext' => 'вики-текст',
@@ -1048,7 +1121,6 @@ $1",
 'searchmenu-legend' => 'Излеуню джарашдырыулары',
 'searchmenu-exists' => "'''Бу викиде «[[:$1]]» бет барды'''",
 'searchmenu-new' => "'''Бу вики-проектде «[[:$1]]» бетни къура!'''",
-'searchhelp-url' => 'Help:Ичиндегиле',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Бу префикс бла бетни кёргюз]]',
 'searchprofile-articles' => 'Баш бетле',
 'searchprofile-project' => 'Болушлукъ эм проект бетле',
@@ -1089,15 +1161,7 @@ $1",
 'powersearch-togglenone' => 'Бири да',
 'search-external' => 'Тыш излеу',
 'searchdisabled' => '{{SITENAME}} сайтда излеу талай заманнга тохтатылгъанды. Бусагъатда Google бла хайырланыб {{SITENAME}} ичинде излеу этерге боллукъсуз. Излеу сайтлада индекслери бир кесек эски болургъа боллугъун унутмагъыз.',
-
-# Quickbar
-'qbsettings' => 'Джюрютюуню панели',
-'qbsettings-none' => 'Кёргюзтме',
-'qbsettings-fixedleft' => 'Солу къатды',
-'qbsettings-fixedright' => 'Онгу къатды',
-'qbsettings-floatingleft' => 'Солгъа джюзеди',
-'qbsettings-floatingright' => 'Оннга джюзеди',
-'qbsettings-directionality' => 'Тилигизни джазмасыны онг/сол таба джазылгъанына кёре бегитилибди',
+'search-error' => 'Излеуде халат чыкъды: $1',
 
 # Preferences page
 'preferences' => 'Джарашдырыула',
@@ -1131,7 +1195,6 @@ $1",
 'resetprefs' => 'Тюрлениулени ызына къайтар',
 'restoreprefs' => 'Тынгылау бла джарашдырыуланы ызына къайтар',
 'prefs-editing' => 'Тюрлендириу',
-'prefs-edit-boxsize' => 'Тюрлениу терезени ёлчеми',
 'rows' => 'Тизгинле:',
 'columns' => 'Колонкала:',
 'searchresultshead' => 'Излеу',
@@ -1142,9 +1205,6 @@ $1",
 'recentchangesdays-max' => '(максимум $1 {{PLURAL:$1|кюн|кюн}})',
 'recentchangescount' => 'Тынгылау бла кёргюзюллюк тюрлениулени саны:',
 'prefs-help-recentchangescount' => 'Бу, ахыр тюрлениулени, бетни тарихлерин эмда журналланы ичине къошады.',
-'prefs-help-watchlist-token' => 'Бу аланны джашыртын ачхыч бла толтуруу, кёзде тургъан тизмегиз ючюн бир RSS-трансляция къурайды.
-Бу аландагъы ачхычны билгенле кёзде тургъан тизмегизни окъургъа боллукъду, ол себебден сырлы магъана сайлагъыз.
-Сакъланмагъанлай генерация этилген магъананы хайырландырыргъа боллукъсуз: $1',
 'savedprefs' => 'Джарашдырыуларыгъыз сакъландыла.',
 'timezonelegend' => 'Заман бел:',
 'localtime' => 'Джерли заман:',
@@ -1175,7 +1235,6 @@ $1",
 'prefs-reset-intro' => 'Бу бетни джарашдырыуларыгъызны тынгылыау бла салыннган джарашдырыулагъа кёчюрюрге хайырланаллыкъсыз.
 Бу ишлемни къабыл этсегиз, ызына къайтараллыкъ тюлсюз.',
 'prefs-emailconfirm-label' => 'Электрон почтаны бегитиу:',
-'prefs-textboxsize' => 'Тюрлендириу терезени ёлчеми',
 'youremail' => 'Электрон почта:',
 'username' => '{{GENDER:$1|Къошулуучу ат}}:',
 'uid' => '{{GENDER:$1|Къошулуучуну}} коду:',
@@ -1246,6 +1305,7 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'userrights-changeable-col' => 'Сиз тюрлендиреллик къауумла',
 'userrights-unchangeable-col' => 'Сиз тюрлендирелмезлик къауумла',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Къошулуучу хакъланы конфликти! Тюрлендириуню джангыдан сакълатыб кёрюгюз.',
 
 # Groups
 'group' => 'Группа:',
@@ -1420,7 +1480,6 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'recentchangeslinked-feed' => 'Байламлы тюрлендириуле',
 'recentchangeslinked-toolbox' => 'Байламлы тюрлендириуле',
 'recentchangeslinked-title' => '$1 бет бла байламлы тюрлендириуле',
-'recentchangeslinked-noresult' => 'Берилген кёзюуню ичинде белгиленнген бетге байламлы башха бетледе тюрлениуле болмагъандыла',
 'recentchangeslinked-summary' => "Белгиленнген бет (неда белгиленнген категориягъа киргенле) джиберген бетледе джангы тюрлениулени тизмеси.
 [[Special:Watchlist|Кёзде тургъан тизмеге]] кирген бетле '''чертилибдиле'''.",
 'recentchangeslinked-page' => 'Бетни аты:',
@@ -1623,7 +1682,6 @@ CGI тамалында ишлерге эмда <code>img_auth</code> бла иш
 'http-read-error' => 'HTTP окъууну халаты.',
 'http-timed-out' => 'HTTP-сорууну сакълау заман ётдю.',
 'http-curl-error' => 'Бу URL-гъа сорууну халаты: $1',
-'http-host-unreachable' => 'URL-ге джетелмеди',
 'http-bad-status' => 'HTTP-соруу ишлеген заманында проблема чыкъгъанды: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1769,12 +1827,6 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'statistics-users-active-desc' => 'Ахыр {{PLURAL:$1|1 кюнде|$1 кюнде}} ишлеме этген къошулуучула',
 'statistics-mostpopular' => 'Эм кёб къаралгъан бетле',
 
-'disambiguations' => 'Ангылам айыргъан бетлеге джибериулери болгъан бетле',
-'disambiguationspage' => 'Template:кёб магъаналылыкъ',
-'disambiguations-text' => "Келтирилген бетледе '''кёб магъаналы бетлеге''' эм азы бла бир джибериу барды.
-Аны орнуна ала белгили бир статьягъа джибериу этерге керек болурла.<br />
-[[MediaWiki:Disambiguationspage]] бетде аты салыннган шаблон бар эсе, ол бет кёб магъаналы бетге саналады.",
-
 'pageswithprop-submit' => 'Таб',
 
 'doubleredirects' => 'Джибериу болгъан джибериуле',
@@ -2015,10 +2067,9 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'unwatchthispage' => 'Кёзде тутууну тохтат',
 'notanarticle' => 'Статья тюлдю',
 'notvisiblerev' => 'Версия кетерилгенди',
-'watchnochange' => 'Къаралгъан кёзюуде, кёзде тургъан тизмеден бир бет да тюрленмегенди.',
 'watchlist-details' => 'Кёзюгюзде тургъан тизмегизде, сюзюу бетлери саналмай {{PLURAL:$1|$1 бет|$1 бет}} барды.',
-'wlheader-enotif' => '* Эл. почта бла хапар бериу джандырылыбды.',
-'wlheader-showupdated' => "* Ахыр кириуюгюзден сора бетни тюрлениулери '''къалын''' джазыу бла кёргюзюлгенди.",
+'wlheader-enotif' => 'Эл. почта бла хапар бериу джандырылыбды.',
+'wlheader-showupdated' => "Ахыр кириуюгюзден сора бетни тюрлениулери '''къалын''' джазыу бла кёргюзюлгенди.",
 'watchmethod-recent' => 'кёзде тургъан бетледе этилген ахыр тюрлениуле кёрюу',
 'watchmethod-list' => 'кёзде тургъан бетледе этилген ахыр тюрлениуле кёрюу',
 'watchlistcontains' => 'Кёзюгюзде тургъан тизмегизде $1 {{PLURAL:$1|бет|бет}} барды.',
@@ -2387,12 +2438,9 @@ $1',
 Алай  а, бу  $2 диапазонну кесеги кибик тыйылгъанды, диапазонну блокдан чыгъарыргъа боллукъсуз.',
 'ip_range_invalid' => 'Джараусуз IP диапазон.',
 'ip_range_toolarge' => '/$1 кёб диапазонланы блокга салыргъа джарамайды.',
-'blockme' => 'Мени блокга сал',
 'proxyblocker' => 'Проксилени тыйыу',
-'proxyblocker-disabled' => 'Бу функция джукълатылыбды.',
 'proxyblockreason' => 'IP-адресигиз ачыкъ прокси болгъаны ючюн тыйылдыгъыз.
 Тилейбиз, кесигизни интернет-провайдеригиз бла, неда дагъан болгъан къуллукъла бла байланыб, къоркъуусузлукъну бу проблемасын билдиригиз.',
-'proxyblocksuccess' => 'Тындырылды.',
 'sorbsreason' => 'IP-адресигиз, {{SITENAME}} сайтда  хайырланнган DNSBL-де ачыкъ прокси кибик саналады.',
 'sorbs_create_account_reason' => 'IP-адресигиз, translatewiki.net сайтда хайырланнган DNSBL-де ачыкъ прокси кибик саналады. Тергеу джазыу къураяллыкъ тюлсюз.',
 'cant-block-while-blocked' => 'Сиз кесигиз блокда заманда, башха къошулуучуланы блок этеллик тюлсюз.',
@@ -2731,13 +2779,8 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'pageinfo-protect-cascading-yes' => 'Хоу',
 
 # Skin names
-'skinname-standard' => 'Стандарт',
-'skinname-nostalgia' => 'Ностальгия',
 'skinname-cologneblue' => 'Кёльн такъылыкъ',
 'skinname-monobook' => 'Моно-китаб',
-'skinname-myskin' => 'Меники',
-'skinname-chick' => 'Шик',
-'skinname-simple' => 'Бош',
 'skinname-modern' => 'Бусагъатдагъы',
 'skinname-vector' => 'Вектор',
 
@@ -2810,11 +2853,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 минут|$1 минут}}',
 'hours' => '{{PLURAL:$1|$1 сагъат|$1 сагъат}}',
 'days' => '{{PLURAL:$1|$1 кюн|$1 кюн}}',
+'weeks' => '{{PLURAL:$1|ыйыкъ}}',
 'months' => '{{PLURAL:$1|ай}}',
 'years' => '{{PLURAL:$1|джыл}}',
 'ago' => '$1 алгъа',
 'just-now' => 'тюз бусагъатда',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|сагъат}} мындан алгъа',
+'minutes-ago' => '$1 {{PLURAL:$1|минут}} мындан алгъа',
+'seconds-ago' => '$1 {{PLURAL:$1|секунд}} мындан алгъа',
+'monday-at' => '$1 баш кюн',
+'tuesday-at' => '$1 гюрге кюн',
+'wednesday-at' => '$1 барас кюн',
+'thursday-at' => '$1 орта кюн',
+'friday-at' => '$1 барым кюн',
+'saturday-at' => '$1 шабат кюн',
+'sunday-at' => '$1 ыйых кюн',
+'yesterday-at' => '$1 тюнене',
+
 # Bad image list
 'bad_image_list' => 'Формат былай болургъа керекди:
 
@@ -2842,7 +2899,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Кенглик',
 'exif-imagelength' => 'Мийиклик',
 'exif-bitspersample' => 'Бояуну теренлиги',
@@ -3004,7 +3061,7 @@ $1',
 'exif-organisationinimage' => 'Суратланнган организация',
 'exif-personinimage' => 'Суратланнган адам',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Къысдырылмагъан',
 'exif-compression-3' => 'CCITT Group 3, факс кодлау',
 'exif-compression-4' => 'CCITT Group 4, факс кодлау',
@@ -3443,7 +3500,6 @@ $5
 'version-other' => 'Башха',
 'version-mediahandlers' => 'Медияны джарашдырыучула',
 'version-hooks' => 'Тутуучула',
-'version-extension-functions' => 'Кенгертиулени функциялары',
 'version-parser-extensiontags' => 'Синтиаксис анализаторну кенгертиулерин теглери',
 'version-parser-function-hooks' => 'Синтаксис анализаторну функцияларын тутуучула',
 'version-hook-name' => 'Тутуучуну аты',
@@ -3464,13 +3520,6 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'version-entrypoints-header-entrypoint' => 'Кириу нохта',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Файлгъа джол',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Кёч',
-'filepath-summary' => 'Бу къуллукъчу бет файл ючюн толу джолну береди.
-Суратла толу резолюциялары бла кёргюзюледиле, башха файл типле алагъа джараулу программала бла ачыладыла.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Дубликат файлланы изле',
 'fileduplicatesearch-summary' => 'Хэш-кодлары бла дубликат файланны изле.',
@@ -3557,6 +3606,9 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'htmlform-submit' => 'Джибер',
 'htmlform-reset' => 'Тюрлендириулени ызына сал',
 'htmlform-selectorother-other' => 'Башха',
+'htmlform-no' => 'Огъай',
+'htmlform-yes' => 'Хоу',
+'htmlform-chosen-placeholder' => 'Вариантны сайлагъыз',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 толу текст излеуню хайырландыргъан',
diff --git a/languages/messages/MessagesKrj.php b/languages/messages/MessagesKrj.php
index ab7c9c64..19eea208 100644
--- a/languages/messages/MessagesKrj.php
+++ b/languages/messages/MessagesKrj.php
@@ -112,6 +112,7 @@ $messages = array(
 'qbbrowse' => 'Bilid',
 'qbedit' => 'Iislan',
 'qbpageoptions' => 'Dya nga Pahina',
+'qbpageinfo' => 'Konteksto',
 'qbspecialpages' => 'Manga espesyal nga pahina',
 'faq' => 'FAQ',
 'faqpage' => 'Project:FAQ',
@@ -134,7 +135,7 @@ $messages = array(
 'delete' => 'Para',
 'deletethispage' => 'Paraun ang dya nga Pahina',
 'protect' => 'Amlig',
-'protect_change' => 'iislan',
+'protect_change' => 'islan ang proteksyon',
 'protectthispage' => 'Amligan ang dya nga pahina',
 'unprotect' => 'huksun ang proteksyon',
 'unprotectthispage' => 'Huksun ang proteksyon sa dya nga pahina',
@@ -187,7 +188,7 @@ Lantawa sa [[Special:Version|version kang page]].',
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Pahina',
 'nstab-media' => 'Pahina kang Midya',
-'nstab-special' => 'Espesyal nga pahina',
+'nstab-special' => 'Espesyal',
 'nstab-project' => 'Pahina kang Proyekto',
 'nstab-image' => 'Inayap',
 'nstab-mediawiki' => 'Mensahe',
@@ -210,7 +211,7 @@ Lantawa sa [[Special:Version|version kang page]].',
 'viewsource' => 'Turukun ang ginhalinan',
 
 # Login and logout pages
-'remembermypassword' => "Tandaan ang akun nga ''log-in'' sa dya nga ''browser'' (kang maximum nga $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}})",
+'remembermypassword' => "Tandaan ang akun nga ''log-in'' sa dya nga ''computer'' (for a maximum of $1 {{PLURAL:$1|day|days}})",
 'nologinlink' => "Himo ka sangka ''account''",
 'createaccount' => "Himo ka ''account''",
 
@@ -255,7 +256,7 @@ Lantawa sa [[Special:Version|version kang page]].',
 # Special:ListUsers
 'listusers-submit' => 'Ipakita',
 
-# Email user
+# E-mail user
 'emailmessage' => 'Mensahe',
 
 # Delete
@@ -267,7 +268,7 @@ Lantawa sa [[Special:Version|version kang page]].',
 # Undelete
 'undelete-search-submit' => 'Sagap',
 
-'sp-contributions-talk' => 'wakal',
+'sp-contributions-talk' => 'Wakal',
 'sp-contributions-submit' => 'Sagap',
 
 # What links here
diff --git a/languages/messages/MessagesKs.php b/languages/messages/MessagesKs.php
index ea28ef6a..cfd3f02e 100644
--- a/languages/messages/MessagesKs.php
+++ b/languages/messages/MessagesKs.php
@@ -1,5 +1,5 @@
 <?php
-/** Kashmiri (कॉशुर / کٲشُر)
+/** Kashmiri (कॉशुर - کٲشُر)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -10,50 +10,3 @@
  */
 
 $fallback = 'ks-arab';
-
-$messages = array(
-# Dates
-'monday' => 'ژِنٛدٕروار',
-'february' => 'فرؤری',
-'april' => 'اپریٖل',
-'may_long' => 'مٔی',
-'june' => 'جوٗن',
-'august' => 'اَگست',
-'september' => 'سیٚپٹَمبَر',
-'november' => 'نَوَمبَر',
-'december' => 'ڈیٚسَمبَر',
-
-'about' => 'مُتعلِق',
-
-'help' => 'مَدَت',
-'search' => 'ژھارُن',
-'searchbutton' => 'ژھارُن',
-'history_short' => 'توٲریٖخ',
-'talkpagelinktext' => 'بَحَژ',
-'talk' => 'بَحَژ',
-'jumptosearch' => 'ژھارُن',
-
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'مُتعلِق {{SITENAME}}',
-'mainpage' => 'گَرٕ',
-
-# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'صَفہٕ',
-'nstab-category' => 'زٲژ',
-
-# Edit pages
-'summary' => 'خُلاسہٕ:',
-
-# Recent changes
-'recentchanges' => 'نَوِ تَبَدیٖلیٖ',
-
-# Upload
-'filedesc' => 'خُلاسہٕ',
-
-'sp-contributions-talk' => 'بَحَژ',
-'sp-contributions-submit' => 'ژھارُن',
-
-# Namespace 8 related
-'allmessagesname' => 'ناو',
-
-);
diff --git a/languages/messages/MessagesKs_arab.php b/languages/messages/MessagesKs_arab.php
index 3241a78b..e41f8983 100644
--- a/languages/messages/MessagesKs_arab.php
+++ b/languages/messages/MessagesKs_arab.php
@@ -7,9 +7,7 @@
  * @ingroup Language
  * @file
  *
- * @author Rachitrali
  * @author Rk_kaul (on ks.wikipedia.org)
- * @author VibhasKS
  */
 
 $rtl = true;
@@ -55,19 +53,14 @@ $separatorTransformTable = array(
 $messages = array(
 # Dates
 'monday' => 'ژِنٛدٕروار',
-'january' => 'جنوری',
 'february' => 'فرؤری',
-'march' => 'مارچ',
 'april' => 'اپریٖل',
 'may_long' => 'مٔی',
 'june' => 'جوٗن',
-'july' => 'جولائی',
 'august' => 'اَگست',
 'september' => 'سیٚپٹَمبَر',
-'october' => 'اکتوبر',
 'november' => 'نَوَمبَر',
 'december' => 'ڈیٚسَمبَر',
-'jan' => 'جنوری',
 
 'about' => 'مُتعلِق',
 
@@ -88,7 +81,6 @@ $messages = array(
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'مُتعلِق {{SITENAME}}',
 'mainpage' => 'گَرٕ',
-'mainpage-description' => 'اہم صَفہٕ',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'صَفہٕ',
diff --git a/languages/messages/MessagesKs_deva.php b/languages/messages/MessagesKs_deva.php
index c4ae7fcb..0ec0de7a 100644
--- a/languages/messages/MessagesKs_deva.php
+++ b/languages/messages/MessagesKs_deva.php
@@ -8,7 +8,6 @@
  * @file
  *
  * @author Rk_kaul (on ks.wikipedia.org)
- * @author VibhasKS
  */
 
 $namespaceNames = array(
@@ -46,12 +45,6 @@ $digitTransformTable = array(
 $messages = array(
 'help' => 'मदद',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'mainpage' => 'आहम सफ़ा',
-
-'editsectionhint' => '$1 शाबह तर तैयब दीउ',
-'red-link-title' => '$1 (सफ़ा ना आसुन)',
-
 # Recent changes
 'recentchanges' => 'नवि तबदीली',
 
diff --git a/languages/messages/MessagesKsh.php b/languages/messages/MessagesKsh.php
index e7e812ec..b9a9ac78 100644
--- a/languages/messages/MessagesKsh.php
+++ b/languages/messages/MessagesKsh.php
@@ -10,6 +10,7 @@
  * @author Caesius noh en Idee vum Manes
  * @author Geitost
  * @author Matma Rex
+ * @author Nemo bis
  * @author Purodha
  * @author Reedy
  * @author Rentenirer
@@ -242,9 +243,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Zeich de Aanzahl Metmaacher, die op die Sigg am oppasse sin',
 'tog-oldsig' => 'Esu&nbsp;süht&nbsp;Ding „Ongerschreff“&nbsp;us:',
 'tog-fancysig' => 'Donn de „Ungerschreff“ als Wiki-Tex behandelle (ohne enne automattesche Lengk)',
-'tog-externaleditor' => 'Nemm jedes Mol en extern Editor-Projramm (Doför bruchs de extra Enstellunge op Dingem Kompjutor. Dat es jet för Fachlück. Doh kanns De [//www.mediawiki.org/wiki/Manual:External_editors mieh drövver lässe])',
-'tog-externaldiff' => 'Nemm jedes Mol en extern Diff-Projramm (Doför bruchs de extra Enstellunge op Dingem Kompjutor. Dat es jet för Fachlück. Doh kanns De [//www.mediawiki.org/wiki/Manual:External_editors mieh drövver lässe])',
-'tog-showjumplinks' => '„Jangk-noh“-Links usjevve, die bei em „Zojang ohne Barrikad“ helfe dun',
 'tog-uselivepreview' => 'Vör-Aansesch övver AJAX zeije (noch zem Ußprobeere)',
 'tog-forceeditsummary' => 'Froch noh, wann en däm Feld „Koot zosammejefass, Quell“ beim Avspeichere nix dren steiht',
 'tog-watchlisthideown' => 'Dun ming eije Änderunge <strong>nit</strong> en minger Oppassliss aanzeije',
@@ -258,6 +256,8 @@ $messages = array(
 'tog-showhiddencats' => 'Donn de verstoche Saachjroppe aanzeije',
 'tog-noconvertlink' => 'Don de Tittele nit ömwandelle',
 'tog-norollbackdiff' => 'Donn noh „{{int:Rollback}}“ de Ungerscheide nit aanzeije',
+'tog-useeditwarning' => 'Donn mesch warne, wann esch vun en Sigg fott jonn, ih dat esch all ming Änderunge avjeschpeischert hann.',
+'tog-prefershttps' => 'Jangk emmer övver en verschlößelte Verbendong bei Enlogge',
 
 'underline-always' => 'jo, ongershtriishe',
 'underline-never' => 'nä',
@@ -321,6 +321,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Dez',
+'january-date' => '$1. Jannewaa',
+'february-date' => '$1. Fääbroaa',
+'march-date' => '$1. Määz',
+'april-date' => '$1. Aprell',
+'may-date' => '$1. Mai',
+'june-date' => '$1. Juuni',
+'july-date' => '$1. Juuli',
+'august-date' => '$1. Ojoßß',
+'september-date' => '$1. Säptämber',
+'october-date' => '$1. Oktoober',
+'november-date' => '$1. Novämber',
+'december-date' => '$1. Dezämber',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Saachjrupp|Saachjruppe}}',
@@ -402,6 +414,7 @@ $messages = array(
 'create-this-page' => 'Neu aanläje',
 'delete' => 'Fottschmieße',
 'deletethispage' => 'De Sigg fottschmieße',
+'undeletethispage' => 'Wider zeröck holle',
 'undelete_short' => '{{PLURAL:$1|ein Änderung|$1 Änderunge}} zeröckholle',
 'viewdeleted_short' => '{{PLURAL:$1|eijn fottjeschmesse Änderung|$1 fottjeschmesse Änderunge|keij fottjeschmesse Änderunge}} beloore',
 'protect' => 'Schötze',
@@ -445,7 +458,7 @@ $1',
 'pool-queuefull' => 'De Schlang zom Waade op ene freie Prozäß zom Beärbeide es vull',
 'pool-errorunknown' => 'Dä Fähler kenne mer nit',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Övver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}}',
 'aboutpage' => 'Project:Övver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}}',
 'copyright' => 'Dä Enhald steiht unger de $1.',
@@ -455,7 +468,6 @@ $1',
 'disclaimers' => 'Henwies',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Hölp för et Bearbeide',
-'edithelppage' => 'Help:Hölp',
 'helppage' => 'Help:Hölp',
 'mainpage' => 'Haupsigg',
 'mainpage-description' => 'Haupsigg',
@@ -484,7 +496,6 @@ $1',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|läzde Änderong|läzde Änderonge|kein Änderonge}}',
 'youhavenewmessagesmulti' => 'Do häs neu Nachrichte op $1',
 'editsection' => 'Ändere',
-'editsection-brackets' => '[$1]',
 'editold' => 'Heh die Version ändere',
 'viewsourceold' => 'Wikitex zeije',
 'editlink' => 'ändere',
@@ -534,18 +545,12 @@ Et künnt sesch och öm ene Fäähler en dä Sofware fum Wiki handelle.',
 # General errors
 'error' => 'Fähler',
 'databaseerror' => 'Fähler en de Daatebank',
-'dberrortext' => 'Enne Fähler es opjefalle en dä Süntax vun ennem Befähl för de Daatebangk.
-Dat künnd_enne Fähler em Wikki-Projamm sin.
-De läzde Befähl för de Daatebangk eß jewääse:
-<blockquote><code>$1</code></blockquote>
-uß dä Fongxjohn: „<code>$2</code>“.
-De Daatebangk mälldt dä Fähler: „<code>$3: $4</code>“.',
-'dberrortextcl' => 'En dä Syntax vun enem Befähl för de Daatebank es
-ene Fähler es opjefalle.
-Dä letzte Befähl för de Daatebank es jewäse:
-<blockquote><code>$1</code></blockquote>
-un kohm us däm Projramm singe Funktion: „<code>$2</code>“.
-De Datebank meld dä Fähler: „<code>$3: $4</code>“.',
+'databaseerror-text' => 'Ene Daatebangkfähler es opjetrodde.
+Dat künnt vun enem Fähler em Projramm kumme.',
+'databaseerror-textcl' => 'Ene Fähler es bei der Daatebangk opjetrodde.',
+'databaseerror-query' => 'Opdraach: $1',
+'databaseerror-function' => 'Fonxjuhn: $1',
+'databaseerror-error' => 'Fähler: $1',
 'laggedslavemode' => '<strong>Opjepass:</strong> Künnt sin, dat heh nit dä neuste Stand vun dä Sigg aanjezeich weed.',
 'readonly' => 'De Daatebank es jesperrt',
 'enterlockreason' => 'Jevv aan, woröm un för wie lang dat de Daatebank jesperrt wääde soll',
@@ -613,12 +618,15 @@ Wann De weße wells, wat dä Täx heh bedügg, do häß De en Schangß, dat De o
 <code lang="en">//www.mediawiki.org/wiki/Manual:Interface/{{BASEPAGENAMEE}}?setlang=ksh</code>
 jet doh drövver fenge kanns, udder op
 <code lang="en">//translatewiki.net/wiki/MediaWiki:{{BASEPAGENAMEE}}/qqq?setlang=ksh</code>',
-'sqlhidden' => "(Dä SQL_Befähl du'mer nit zeije)",
 'cascadeprotected' => 'Die Sigg es jeschöz, un mer kann se nit ändere. Se es en en Schotz-Kaskad enjebonge, zosamme met dä {{PLURAL:$1|Sigg|Sigge}}:
 $2',
 'namespaceprotected' => 'Do darfs Sigge em Appachtemang „$1“ nit ändere.',
 'customcssprotected' => 'Do darfs di CSS-Sigg heh nit ändere. Se jehööt enem andere Metmacher un es e Stöck funn dämm sing eije Enstellunge.',
 'customjsprotected' => 'Do darfs di JavaSkep-Sigg heh nit ändere. Se jehööt enem andere Metmacher un es e Stöck funn dämm sing eije Enstellunge.',
+'mycustomcssprotected' => 'Do häs nit dat Rääsch, he di Sigg med enem <i lang="en" xml:lang="en">CSS</i> ze verändere.',
+'mycustomjsprotected' => 'Do häs nit dat Rääsch, he di Sigg med enem JavaSkrep ze verändere.',
+'myprivateinfoprotected' => 'Do häs nit dat Rääsch, Ding päsöönlesche Aanjaabe ze verändere.',
+'mypreferencesprotected' => 'Do häs nit dat Rääsch, Ding Enschtällonge ze verändere.',
 'ns-specialprotected' => '{{int:nstab-special}}e künne mer nit ändere.',
 'titleprotected' => "Dä Tittel för en Sigg eß verbodde, fum [[User:$1]], un dr Jrond wohr: ''„$2“''",
 'filereadonlyerror' => 'Mer künne di Dattei „$1“ nit ändere, weil dä Dateijebeshtand „$2“ bloß för ze Lässe doh es.
@@ -642,10 +650,19 @@ Künnt sin, dat De de ein udder andere Sigg noch wigger aanjezeich kriß, wie wa
 'welcomecreation-msg' => 'Dinge Zohjang es enjerescht.
 Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].',
 'yourname' => 'Metmaacher_Naame:',
+'userlogin-yourname' => 'Der Metmaacher_Name',
+'userlogin-yourname-ph' => 'Donn Dinge Metmaachername aanjevve',
+'createacct-another-username-ph' => 'Jivv ene Metmaacher-Naame aan',
 'yourpassword' => 'Paßwoot:',
+'userlogin-yourpassword' => 'Et Paßwoot',
+'userlogin-yourpassword-ph' => 'Donn Ding Paßwood enjävve',
+'createacct-yourpassword-ph' => 'Jivv_e Paßwood_en!',
 'yourpasswordagain' => 'Noch ens dat Passwood',
+'createacct-yourpasswordagain' => 'Noch ens dat Paßwoot',
+'createacct-yourpasswordagain-ph' => 'Jivv_et Paßwoot norrens en!',
 'remembermypassword' => 'Op Duur aanmelde (hält {{PLURAL:$1|för eine Daach|bes op $1 Dääsch|bloß för hück}})',
-'securelogin-stick-https' => 'Noh em Enlogge övver HTTPS verbonge blieve.',
+'userlogin-remembermypassword' => 'Op Duur enlogge',
+'userlogin-signwithsecure' => 'Verschlößeld enlogge',
 'yourdomainname' => 'Ding Domain',
 'password-change-forbidden' => 'Do kanns en heh däm Wiki kein Paßwööter ändere.',
 'externaldberror' => 'Do wor ene Fähler en de externe Daatebank, oder Do darfs Ding extern Daate nit ändere. Dat Aanmelde jingk jedenfalls donevve.',
@@ -657,18 +674,40 @@ Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].'
 'logout' => 'Ußlogge',
 'userlogout' => 'Ußlogge',
 'notloggedin' => 'Nit enjelogg',
+'userlogin-noaccount' => 'Do häß noch keine Zohjang?',
+'userlogin-joinproject' => 'Aanmälde zom Metmaache!',
 'nologin' => 'Wann de dich noch nit aanjemeldt häs, dann dun dich $1.',
 'nologinlink' => 'neu aanmelde',
 'createaccount' => 'Aanmelde als ene neue Metmaacher',
 'gotaccount' => "Do bes ald aanjemeldt {{GRAMMAR:en|{{SITENAME}}}}? Dann jangk nohm '''$1'''.",
 'gotaccountlink' => 'Enlogge',
 'userlogin-resetlink' => 'Häß De Ding Daate för et Enlogge verjäße?',
+'userlogin-resetpassword-link' => 'Paßwoot verjäße?',
+'helplogin-url' => 'Help:Övver et Enlogge',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hölp bem Enlogge]]',
+'createacct-join' => 'Jiv Ding Daate en:',
+'createacct-emailrequired' => 'Ding Addräß för de <i lang="en">e-mail</i>',
+'createacct-emailoptional' => 'Ding Addräß för de <i lang="en">e-mail</i>, kann fott bliive',
+'createacct-email-ph' => 'Jiv Ding Addräß för de <i lang="en">e-mail</i> en!',
+'createacct-another-email-ph' => 'Jivv en Addräß för de <i lang="en" xml:lang="en">e-mail</i> aan',
 'createaccountmail' => 'Scheck mer en <i lang="en">e-mail</i> met enem neu ußjedaachte Paßwood op Zick',
+'createacct-realname' => 'Dinge börjerlesche Naame, kam_mer och fott lohße',
 'createaccountreason' => 'Jrond:',
+'createacct-reason' => 'Der Jrond udder Aanlaß',
+'createacct-reason-ph' => 'Woröm deihs De noch ene Zohjang aanlääje?',
+'createacct-captcha' => 'Zor Sescherheit',
+'createacct-imgcaptcha-ph' => 'Jiv dä Täx en, dä De heh drövver sühs!',
+'createacct-submit' => 'Lohß Jonn!',
+'createacct-another-submit' => 'Donn jäz enne zohsäjlejje Zohjang aanlääje',
+'createacct-benefit-heading' => '{{ucfirst:{{GRAMMAR:Nominative|{{ucfirst:{{SITENAME}}}}}}}} weed vun Minsche wi Dir jemaat.',
+'createacct-benefit-body1' => '{{PLURAL:$1|Änderong|Änderonge|Änderonge }}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Sigg|Sigge|Sigge }}',
+'createacct-benefit-body3' => '{{PLURAL:$1|aktive Metmaacher}}',
 'badretype' => 'Ding zwëij ennjejovve Paßßwööter sinn nit ejaal. Do muss De Dich för ein entscheide.',
 'userexists' => 'Ene Metmaacher met däm Name jidd et ald.
 Do muss Der ene andere Name usdenke.',
 'loginerror' => 'Fähler beim Enlogge',
+'createacct-error' => 'Fähler beim Zohjang-Aanlääje',
 'createaccounterror' => 'Kunnt keine Zohjang för der Metmaacher-Name „$1“ aanlääje.',
 'nocookiesnew' => 'Dinge neue Metmaacher Name es enjerich, ävver dat automatisch Enlogge wor dann nix.
 Schad.
@@ -762,7 +801,7 @@ Wann Dat all böömesch Dörver för Desch sin, da fojeß heh di
 e-mail eijfach. Wann De en däm Wikki nit metmaache wells, och.',
 'usernamehasherror' => 'En Metmaacher iere Name darf dat Zeijche „#“ nit dren vürkumme.',
 'login-throttled' => 'Do häs zo öff, zo vill, un zo lang en de letzde Zick probeet, ennzelogge.
-Waat e Wielsche, ih dat De et widder versöhks.',
+Waad e Wielsche ävver $1, ih dat De et wider versöhks.',
 'login-abort-generic' => 'Dat Enlogge hät nit jeflup.',
 'loginlanguagelabel' => 'Sproch: $1',
 'suspicious-userlogout' => "Do bes '''nit''' ußjelogg.
@@ -782,7 +821,7 @@ Et süht us, wi wann ene kappodde Brauser udder <i lang=\"en\">proxy</i>ẞööv
 'newpassword' => 'Et neue Passwood:',
 'retypenew' => 'Noch ens dat neue Passwood:',
 'resetpass_submit' => 'E neu Zweschepasswood övvermeddele un aanmellde',
-'resetpass_success' => 'Passwood jeändert. Jetz küdd_et Enlogge&nbsp;…',
+'changepassword-success' => 'Passwood jeändert. Jetz küdd_et Enlogge&nbsp;…',
 'resetpass_forbidden' => 'E Passwoot kann nit jeändert wääde.',
 'resetpass-no-info' => 'Do mööts ad enjelogg sin, öm tiräk op di Sigg jonn ze dörve',
 'resetpass-submit-loggedin' => 'Passwood tuusche',
@@ -795,10 +834,9 @@ Do häs Der enzwesche e neu Zweschepaßwood jehollt.',
 
 # Special:PasswordReset
 'passwordreset' => 'Et Paßwoot zeröck säze',
-'passwordreset-text' => 'Donn dat Fommulaa heh ußfölle, öm e neu Paßwoot faßzelääje.',
 'passwordreset-legend' => 'Et Paßwoot zeröck säze',
 'passwordreset-disabled' => 'Et Paßwoot zeröck ze säze es heh em Wiki afjeschalldt.',
-'passwordreset-pretext' => '{{PLURAL:$1||Jiff ein vun dä Saache heh dronger enn|}}',
+'passwordreset-emaildisabled' => 'Heh dat Wiki määt nix met <i lang="en">e-mail</i>!',
 'passwordreset-username' => 'Metmaacher Name:',
 'passwordreset-domain' => 'Domähn:',
 'passwordreset-capture' => 'Wells De di <i lang="en">e-mail</i> beloore?',
@@ -833,7 +871,7 @@ moß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.',
 Eijmohl-Paßwoot: $2',
 'passwordreset-emailsent' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck.',
 'passwordreset-emailsent-capture' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck woode. Heh dronger kanns De se lässe.',
-'passwordreset-emailerror-capture' => 'En <i lang="en">e-mail</i> sullt verscheck wääde. Heh dronger kanns De se lässe. Dat Verschecke hät ävver nit jeflup, wääje: $1.',
+'passwordreset-emailerror-capture' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh sullt verscheck wääde, ävver dat Verschecke aan {{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} $2 hät nit jeflup: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Donn Ding Address för de <i lang="en">e-mail</i> ändere',
@@ -1096,6 +1134,8 @@ Ene Jrond weße mer nit.',
 'content-failed-to-parse' => 'Et wohr nit müjjelesch, dä Enhalld met däm <i lang="en">MIME-Typ</i> $2 för en Dattei met $1 dren ze verwooschte: $3.',
 'invalid-content-data' => 'Di Daate en dä Sigg sen onjöltesch.',
 'content-not-allowed-here' => 'Ene Enhalld vun dä Zoot „$1“ es op dä Sigg „[[$2]]“ nit zohjelohße.',
+'editwarning-warning' => 'Wann de vun hee dä Sigg fott jeihß, doh künnte all Ding Änderunge aan dä Sigg verschött jonn.
+Do kanns heh di Warnung affschallde, wann de aanjemelldt un enjelogg bes, dann kriß de se nieh mieh wider. Jangk doför en dä Affschnett „{{int:prefs-editing}}“ en Dinge Enshtellunge.',
 
 # Content models
 'content-model-wikitext' => 'Wikitäx',
@@ -1335,7 +1375,6 @@ Mieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAG
 'searchmenu-legend' => 'Enschtällonge för et Söhke',
 'searchmenu-exists' => "*Sigg '''[[$1]]'''",
 'searchmenu-new' => "'''Donn de Sigg „[[:$1|$1]]“ hee em Wiki aanlääje'''",
-'searchhelp-url' => 'Help:Hölp',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zeich all Sigge, di met däm Tex aanfange]]',
 'searchprofile-articles' => 'Sigge vum Enhalt',
 'searchprofile-project' => 'Hülp- ov Projäk-Sigge',
@@ -1388,15 +1427,7 @@ Sigge us {{GRAMMAR:Dative|{{ucfirst:{{SITENAME}}}}}} finge.
 Et es nit jesaht,
 dat dänne ehr Daate topaktoell sin,
 ävver et es bäßer wi jaa_nix.',
-
-# Quickbar
-'qbsettings' => '„Flöcke Links“',
-'qbsettings-none' => 'Fottlooße, dat well ich nit sinn',
-'qbsettings-fixedleft' => 'Am linke Rand fass aanjepapp',
-'qbsettings-fixedright' => 'Am rächte Rand fass aanjepapp',
-'qbsettings-floatingleft' => 'Am linke Rand am Schwevve',
-'qbsettings-floatingright' => 'Am rächte Rand am Schwevve',
-'qbsettings-directionality' => 'Faß, passend för wi eröm de Schreff för Ding Schprooch jeiht',
+'search-error' => 'An error has occurred while searching: $1',
 
 # Preferences page
 'preferences' => 'ming Enstellunge',
@@ -1430,7 +1461,6 @@ dat dänne ehr Daate topaktoell sin,
 'resetprefs' => 'Zeröck setze',
 'restoreprefs' => 'Donn en alle Afschnedde alles op der Schtandatt retuur schtälle',
 'prefs-editing' => 'Beim Bearbeide',
-'prefs-edit-boxsize' => 'Dat Feld zöm Schrieve sull han:',
 'rows' => 'Reihe:',
 'columns' => 'Spalte:',
 'searchresultshead' => 'Beim Söhke',
@@ -1441,9 +1471,6 @@ dat dänne ehr Daate topaktoell sin,
 'recentchangesdays-max' => '(Nit mieh wie {{PLURAL:$1|eine Daach|$1 Dääsh|keine Daach}})',
 'recentchangescount' => 'Aanzahl Änderunge en de Leß, als Shtandad:',
 'prefs-help-recentchangescount' => 'Dat ömfaß de „{{int:recentchanges}}“, de Versione uß de Fojangeheit, un de Logbööcher.',
-'prefs-help-watchlist-token' => 'Wann dat Feld met enem jeheime Schlößel ußjeföllt es, määt et Wiki ene <i lang="en">RSS</i>-Enspeisung en et Näz för Ding Oppaßleß op.
-Wä dä Schlößel weiß, kann ding Oppaßleß lesse. Donn alsu ene seschere un jeheime Wäät doför nämme.
-Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <code>$1</code>',
 'savedprefs' => 'Ding Enstellunge sin jetz jesechert.',
 'timezonelegend' => 'Ziggzohn:',
 'localtime' => 'De Zigg op Dingem Kompjuter:',
@@ -1473,7 +1500,6 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'prefs-common-css-js' => 'Gemeinsam CSS un JavaSkrepp för all de Bovverfläshe:',
 'prefs-reset-intro' => 'Op dä Sigg kanns De Ding Enstellunge op dämm Wiki singe Shandatt setze lohße. Ävver Opjepaß: Do jidd et keine „Retuur“-Knopp för!',
 'prefs-emailconfirm-label' => 'Beshtätejung övver <i lang="en">e-mail</i>:',
-'prefs-textboxsize' => 'Wi jruuß sull dat Feld för et Afschnedde un Sigge ändere sin',
 'youremail' => 'E-Mail *',
 'username' => '{{GENDER:$1|Metmaacher|Metmaacherėnne|Metmaacher|Metmaacherėnne|Metmaacher}} Name:',
 'uid' => '{{GENDER:$1|Metmaacher|Metmaacherėnne|Metmaacher|Metmaacherėnne|Metmaacher}} Nommer:',
@@ -1504,6 +1530,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'prefs-dateformat' => 'Dem Dattum sing Fommaat',
 'prefs-timeoffset' => 'Enshtellunge för de Uhrzigge',
 'prefs-advancedediting' => 'Extra Ußwahle',
+'prefs-preview' => 'de Vör-Aansesch',
 'prefs-advancedrc' => 'Extra Ußwahle',
 'prefs-advancedrendering' => 'Extra Ußwahle',
 'prefs-advancedsearchoptions' => 'Extra Ußwahle',
@@ -1539,6 +1566,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'userrights-changeable-col' => '{{PLURAL:$1:Di Jropp|Jroppe|kein Jropp doh}}, di De ändere kanns',
 'userrights-unchangeable-col' => '{{PLURAL:$1:Di Jropp|Jroppe|kein Jropp doh}}, di De nit ändere kanns',
 'userrights-irreversible-marker' => '$1 *',
+'userrights-conflict' => 'Ene Andere hät di Rääschde ald verändert. Loor, wad_eruß kohm un versöhg_et norr-ens, wann nüüdesch.',
 
 # Groups
 'group' => 'Jrupp:',
@@ -1604,7 +1632,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'right-proxyunbannable' => 'Es ußjenomme fun automatische Sperre fun Proxy-Servere',
 'right-unblockself' => 'Retuur nämme, wam_mer sellver jesperrt woode es',
 'right-protect' => 'Sigge schöze, jeschözde Sigge änndere, un der iere Schoz widder ophevve',
-'right-editprotected' => 'Jeschötzte Sigge ändere, ohne Kaskadeschoz',
+'right-editprotected' => 'Sigge ändere, di met „{{int:protect-level-sysop}}“ jezöz sin',
 'right-editinterface' => 'Sigge met de Texte ändere, die et Wiki kallt',
 'right-editusercssjs' => 'Anderlücks CSS- un JS-Dateie ändere',
 'right-editusercss' => 'Anderlücks CSS-Dateie ändere',
@@ -1670,9 +1698,11 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'action-userrights-interwiki' => 'dä Metmaacher fun ander Wikis ier Rääschte ze ändere',
 'action-siteadmin' => 'de Datebank ze sperre udder widder freizejävve',
 'action-sendemail' => '<i lang="en">e-mails</i> ze verschecke',
+'action-editmyprivateinfo' => 'Ding päsöönlesche Aanjaabe ze ändere',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|Ein Änderong|$1 Änderonge|Kein Änderong}}',
+'enhancedrc-history' => 'Väsjohne',
 'recentchanges' => 'Neuste Änderonge',
 'recentchanges-legend' => 'Enstellunge',
 'recentchanges-summary' => 'Op dä Sigg hee sin de neuste Änderunge am Wiki opjeliss.',
@@ -1713,7 +1743,6 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'recentchangeslinked-feed' => 'Änderunge aan Sigge, wo hee drop jelink es',
 'recentchangeslinked-toolbox' => 'Änderunge aan Sigge, wo hee drop jelink es',
 'recentchangeslinked-title' => 'Änderunge aan Sigge, die vun „$1“ uß verlink sin',
-'recentchangeslinked-noresult' => 'Et woodte kein Änderunge aan verlinkte Sigge jemaat en dä Zick.',
 'recentchangeslinked-summary' => "Heh di {{int:nstab-special}} hät en Leß met Änderunge aan Sigge, di vun dä aanjejovve Sigg uß verlink sin.
 Bei Saachjruppe sen et de Sigge en dä Saachjrupp.
 Sigge uß Dinge [[Special:Watchlist|Opaßleß]] sin '''fett''' jeschrevve.",
@@ -1726,7 +1755,7 @@ Sigge uß Dinge [[Special:Watchlist|Opaßleß]] sin '''fett''' jeschrevve.",
 'reuploaddesc' => 'Zeröck noh de Sigg zem Huhlade.',
 'upload-tryagain' => 'Donn ene veränderte Täx övver di Dattei loßßschecke',
 'uploadnologin' => 'Nit enjelogg',
-'uploadnologintext' => 'Do mööts ald [[Special:UserLogin|enjelogg]] sin, öm Daate huhzelade.',
+'uploadnologintext' => 'Do mööts ald $1 sin, öm Daate huhzelade.',
 'upload_directory_missing' => "<b>Doof:</b>
 Dat Fo'zeishnis <code>$1</code> för de huhjelaade Dateie es fott, un dat Websörver Projramm kunnd_et och nit aanlääje.",
 'upload_directory_read_only' => '<b>Doof:</b> En dat Verzeichnis <code>$1</code> för Dateie dren huhzelade, do kann dat Websörver Projramm nix erenschrieve.',
@@ -1974,7 +2003,6 @@ Dröm es <code lang="en">img_auth.php</code> zor Sisherheit heh affjeschalldt.',
 'http-read-error' => 'Et Lässe beim <code lang="en">HTTP</code> es donävve jeange.',
 'http-timed-out' => 'Di <code lang="en">HTTP</code>-Aanforderung hät zoh lang jebruch.',
 'http-curl-error' => 'Ene Fähler es opjetrodde beim Holle vun däm <code lang="en">URL</code>: $1',
-'http-host-unreachable' => 'Mer sen nit noh dämm <i lang="en">URL</i> dorschjekumme.',
 'http-bad-status' => 'Bei dä <code lang="en">HTTP</code>-Aanforderung es e Problem opjetrodde: Fähler&nbsp;$1 — $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2005,6 +2033,10 @@ Velleich probees De et och zo en Zick, wo winnijer loss es.',
 'listfiles_size' => 'Byte',
 'listfiles_description' => 'Wat en dä Datei dren schtisch',
 'listfiles_count' => 'Väsjohne',
+'listfiles-show-all' => 'Ällder Väsjohne vun de Belder med aanzeije',
+'listfiles-latestversion' => 'De neuste Väsjohn',
+'listfiles-latestversion-yes' => 'Joh',
+'listfiles-latestversion-no' => 'Nää',
 
 # File description page
 'file-anchor-link' => 'Dattei',
@@ -2108,6 +2140,11 @@ wääde, un luur Der der iehr ander Links aan!',
 'randompage' => 'Zofällije Sigg',
 'randompage-nopages' => 'En {{PLURAL:$2|dem Appachtemang|dä Appachtemangs|keinem Appachtemang}} „$1“ sin ja kein Sigge dren.',
 
+# Random page in category
+'randomincategory' => 'En zohfälleje Sigg us ener Saachjropp',
+'randomincategory-nopages' => 'et sinn er kein Sigge en dä Saachjropp [[:Category:$1|$1]] dren.',
+'randomincategory-selectcategory-submit' => 'Lohß Jonn!',
+
 # Random redirect
 'randomredirect' => 'Zofällije Ömleitung',
 'randomredirect-nopages' => 'En däm Appachtemang „$1“ sin ja kein Ömleidunge dren.',
@@ -2134,13 +2171,6 @@ All de Sigge em Wiki, och Klaafsigge, Ömleitunge, un esu jet',
 'statistics-users-active-desc' => 'Metmaacher, die {{PLURAL:$1|hück un jesterre|en de läzte $1 Dääsh|hück}} jät jemaat han.',
 'statistics-mostpopular' => 'De miets affjeroofe Sigge',
 
-'disambiguations' => 'Sigge met Lengks dren op „(Wat ėß dat?)“-Sigge',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => 'En dä Sigge onge sin Links dren, di op en „(Watt ėßß datt?)“-Sigg jonn.
-Esu en Links sollte eijentlesch op en Sigg jon, di tirek jemeint es.
-
-Ene Atikel weed als en „(Watt ėßß datt?)“-Sigg jezallt, wann dä en Schablohn opröhf, op di ene Lenk en dä Sigg [[MediaWiki:Disambiguationspage]] dren es.',
-
 'pageswithprop' => 'Sigge med en beschtemmpte Eijeschaff',
 'pageswithprop-legend' => 'Sigge med en Eijeschaff',
 'pageswithprop-text' => 'Heh di Sigg zeisch Sigge, di en beschtemmpte Eijeschaf han',
@@ -2423,10 +2453,9 @@ Wann di Sigg udder ier Klaafsigg verändert weed, kütt dat af jäz heh en di Op
 'unwatchthispage' => 'Nit mieh op die Sigg oppasse',
 'notanarticle' => 'Keine Atikkel',
 'notvisiblerev' => 'Di Version es fottjeschmesse',
-'watchnochange' => 'Keine Atikkel en Dinger Oppassliss es en dä aanjezeichte Zick verändert woode.',
 'watchlist-details' => 'Do häs {{PLURAL:$1|<strong>ein</strong> Sigg|<strong>$1</strong> Sigge|<strong>kein</strong> Sigg}} en dä Oppassliss{{PLURAL:$1|, un di Klaafsigg dozo|, un de Klaafsigge dozo|}}.',
-'wlheader-enotif' => '* Et E-mail Schecke es enjeschalt.',
-'wlheader-showupdated' => '* Wann se Einer jeändert hätt, zickdäm De se et letzte Mol aanjeluurt häs, sin die Sigge <strong>extra markeet</strong>.',
+'wlheader-enotif' => 'Et <i lang="en">e-mail</i> Schecke es enjeschalt.',
+'wlheader-showupdated' => 'Wann se Einer jeändert hätt, zickdäm De se et letzte Mol aanjeluurt häs, sin die Sigge <strong>extra markeet</strong>.',
 'watchmethod-recent' => 'Ben de letzte Änderunge jäje de Oppassliss am pröfe',
 'watchmethod-list' => 'Ben de Oppassliss am pröfe, noh de letzte Änderung',
 'watchlistcontains' => 'En dä Oppassliss {{PLURAL:$1|es ein Sigg|sinner <strong>$1</strong> Sigge|sinner <strong>kein</strong> Sigge}}.',
@@ -2671,7 +2700,7 @@ $1',
 'contributions' => '{{GENDER:$1|Däm Metmaacher|Däm|Däm Metmaacher|Dä Metmaacherėn|Däm}} $1 {{GENDER:$1|singe|singe|singe|iere|singe}} Beidräch',
 'contributions-title' => 'Beidräsch fum  $1',
 'mycontris' => 'Beidrähch',
-'contribsub2' => 'För dä Metmaacher: $1 ($2)',
+'contribsub2' => 'För {{GENDER:$3|dä|et|dä Metmaacher|de|dat}} $1: $1 ($2)',
 'nocontribs' => 'Mer han kein Änderunge jefonge, en de Logböcher, die do passe däte.',
 'uctop' => '(Neuste)',
 'month' => 'un Moohnt:',
@@ -2831,17 +2860,15 @@ Automattesch jesperrte <i lang="en>IP</i>-Addräße sin nit heh, ävver en de [[
 'ipb_blocked_as_range' => 'Dat jeit nit. De IP-Adress „$1“ es nit tirek jesperrt. Se es ävver en däm jesperrte Bereich „$2“ dren. Die Sperr kam_mer ophevve. Donoh kam_mer och kleiner Aandeile fun däm Bereich widder neu sperre. Di Adress alleins kam_mer ävver nit freijevve.',
 'ip_range_invalid' => 'Dä Bereich vun IP_Adresse es nit en Oodnung.',
 'ip_range_toolarge' => 'Berette övver /$1 ze sperre is nit zohjelohße, bloß kleiner.',
-'blockme' => 'Open_Proxy_Blocker',
 'proxyblocker' => 'Open_Proxy_Blocker',
-'proxyblocker-disabled' => 'Di Funxjon es ußjeschalldt.',
 'proxyblockreason' => 'Unger Ding IP_Adress läuf ene offe Proxy.
 Dröm kanns De heh em Wiki nix maache.
 Schwaad met Dingem System-Minsch udder Netzwerk-Techniker udder ISP (<i lang="en">Internet Service Provider</i>)
 un verzäll dänne vun däm ärrje Risiko för de Secherheit fun dänne ehr Rääschnere!',
-'proxyblocksuccess' => 'Jedonn.',
 'sorbs' => '<i lang="en">DNSBL</i>',
 'sorbsreason' => 'Ding IP-Adress weed en de DNSbl als ene offe Proxy jeliss. Schwaad met Dingem System-Minsch oder Netzwerk-Techniker (ISP Internet Service Provider) drüvver, un verzäll dänne vun däm Risiko för ehr Secherheit!',
 'sorbs_create_account_reason' => 'Ding IP-Adress weed en de DNSbl als ene offe Proxy jeliss. Dröm kanns De Dich heh em Wiki nit als ene neue Metmaacher aanmelde. Schwaad met Dingem System-Minsch oder Netzwerk-Techniker oder (ISP Internet Service Provider) drüvver, un verzäll dänne vun däm Risiko för ehr Secherheit!',
+'xffblockreason' => 'En <i lang="en">IP-</i>Adräs en ener <code lang="en">X-Forwarded-For</i> Koppreih es jeschpächt: Et künnt de Dinge udder enem <i lang="en">proxy server</i> zweschedren sing Adräß sin. Der Jrond för et Schpärre woh orschprönglesch: $1',
 'cant-block-while-blocked' => 'Do kanns ander Metmaacher nit sperre, esu lang wi De sellver jesperrt bes.',
 'cant-see-hidden-user' => 'Dä Metmaacher, dä De shperre wells, es al jeshperrt un verschtoche. Weil De nit dat Rääsch häs. Metmaacher ze vershteiche (<code>hideuser</code>), kanns De däm sing Sperr och nit ändere.',
 'ipbblocked' => 'Do kanns kein ander Metmaachere sperrre, weil De sellver jesperrt bes',
@@ -3012,6 +3039,8 @@ Wenn De jenerell aan [//www.mediawiki.org/wiki/Localisation MediaWiki singe Öve
 'thumbnail-more' => 'Jrößer aanzeije',
 'filemissing' => 'Datei es nit do',
 'thumbnail_error' => 'Ene Fähler es opjetauch beim Maache vun enem Breefmarke/Thumbnail-Beldche: „$1“',
+'thumbnail_error_remote' => 'Ene Fähler es em $1 opjevalle:
+$2',
 'djvu_page_error' => 'De DjVu-Sgg es ußerhallef',
 'djvu_no_xml' => 'De XML-Date för di DjVu-Datei kunnte mer nit afrofe',
 'thumbnail-temp-create' => 'Mer kunnte kein Zweschedattei für Minnibeldscher aanlääje.',
@@ -3163,17 +3192,11 @@ Esu kam_mer noch en Aanmärkong en „{{int:summary}}“ maache.',
 
 # Stylesheets
 'common.css' => '/* CSS heh aan dä Stell hät Uswirkunge op all Ovverflääsche */',
-'standard.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Klassesch“ */',
-'nostalgia.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Nostaljesch“ */',
 'cologneblue.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Kölsch Blau“ */',
 'monobook.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Monobooch“ */',
-'myskin.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Ming Skin“ */',
-'chick.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Höhnsche“ */',
-'simple.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Eijfach“ */',
 'modern.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Modern“ */',
 'vector.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Vector“ */',
 'print.css' => '/* CSS heh aan dä Stell wirrek nur op et Sigge Drökke */',
-'handheld.css' => '/* dat CSS hee wirrek sesch uß op su jeannte Handheld-Apparaate, opjebout op de Ovverflääsch uß $wgHandheldStyle */',
 'noscript.css' => '/* Dat CSS heh aan dä Stell krijje nur de Metmaacher met affjeschaldt JavaSkrepp jescheck */',
 'group-autoconfirmed.css' => '/* Dat CSS heh aan dä Stell krijje nur de automattesch beshtääteshte Metmacher jescheck */',
 'group-bot.css' => '/* Dat CSS heh aan dä Stell krijje nur de Bot-Projrammee jescheck */',
@@ -3182,13 +3205,8 @@ Esu kam_mer noch en Aanmärkong en „{{int:summary}}“ maache.',
 
 # Scripts
 'common.js' => '/* Jedes JavaScrip hee kütt för jede Metmaacher in jede Sigg erinn */',
-'standard.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Klassesch" jescheck */',
-'nostalgia.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Nostaljesch" jescheck */',
 'cologneblue.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Kölsch Blou" jescheck */',
 'monobook.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Monnobooch" jescheck */',
-'myskin.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Ming Skin" jescheck */',
-'chick.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Höhnsche" jescheck */',
-'simple.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Eijfach" jescheck */',
 'modern.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Modern" jescheck */',
 'vector.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Vector" jescheck */',
 'group-autoconfirmed.js' => '/* De JavaSkreppte fun hee krijje bloß de autemattesch beshtääteschte Metmaacher jescheck */',
@@ -3267,13 +3285,8 @@ Esu kam_mer noch en Aanmärkong en „{{int:summary}}“ maache.',
 'pageinfo-category-files' => 'De Aanzahl Dateie',
 
 # Skin names
-'skinname-standard' => 'Klassesch',
-'skinname-nostalgia' => 'Nostaljesch',
 'skinname-cologneblue' => 'Kölsch Blau',
 'skinname-monobook' => 'MonoBoch',
-'skinname-myskin' => 'Ming Skin',
-'skinname-chick' => 'Höhnche',
-'skinname-simple' => 'Eifach',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vektor',
 
@@ -3357,11 +3370,25 @@ $1',
 'minutes' => '{{PLURAL:$1|eine Menutt|$1 Menutte|keine Menutt}}',
 'hours' => '{{PLURAL:$1|ein Schtundt|$1 Schtunde|kein Schtundt}}',
 'days' => '{{PLURAL:$1|einem Daach|$1 Dääsch|keinem Daach}}',
+'weeks' => '{{PLURAL:$1|ein Woch|$1 Woche|keine Woch}}',
 'months' => '{{PLURAL:$1|Eine&nbsp;Monhnd|$1&nbsp;Mohnde|Keine&nbsp;Monhnd}}',
 'years' => '{{PLURAL:$1|Ein&nbsp;Jonhr|$1&nbsp;Johre|Kei&nbsp;Jonhr}}',
 'ago' => 'vür $1',
 'just-now' => 'jraad äävens',
 
+# Human-readable timestamps
+'hours-ago' => 'för {{PLURAL:$1|ein Stund|$1 Stunde|keine Stund}}',
+'minutes-ago' => 'för {{PLURAL:$1|eine Menott|$1 Menotte|keine Menott}}',
+'seconds-ago' => 'för {{PLURAL:$1|eine Sekond|$1 Sekonde|keine Sekond}}',
+'monday-at' => 'Läzde Moondaach öm $1 Uhr',
+'tuesday-at' => 'Läzde Dinnsdaach öm $1 Uhr',
+'wednesday-at' => 'Läzde Medwoch öm $1 Uhr',
+'thursday-at' => 'Läzde Donnersdaach öm $1 Uhr',
+'friday-at' => 'Läzde Friidaach öm $1 Uhr',
+'saturday-at' => 'Läzde Samsdaach öm $1 Uhr',
+'sunday-at' => 'Läzde Sundaach öm $1 Uhr',
+'yesterday-at' => 'Jästere öm $1 Uhr',
+
 # Bad image list
 'bad_image_list' => '<strong>Fomat:</strong>
 Nur Reije met ennem * am Aanfang don jet.
@@ -3388,7 +3415,7 @@ Donoh kumme, en däsellve Reih, Links op Sigge wo die Datei trotz dämm jenehm e
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breejd',
 'exif-imagelength' => 'Läng',
 'exif-bitspersample' => 'Bits per Färvaandeil',
@@ -3567,7 +3594,7 @@ Donoh kumme, en däsellve Reih, Links op Sigge wo die Datei trotz dämm jenehm e
 'exif-originalimageheight' => 'De Hühde vum Beld, ih dat es zohjeschnedde wood, en Pixelle',
 'exif-originalimagewidth' => 'De Breede vum Beld, ih dat es zohjeschnedde wood, en Pixelle',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Oohne Kompressjuhn',
 'exif-compression-2' => 'Noh de <i lang="en">CCITT</i> ier Jrop 3 kodeet mem eindimänsjonalle aanjepaßte Verfahre noh_m <i lang="en">Huffman</i> singe „Läng vum Rötsch“',
 'exif-compression-3' => 'Noh de <i lang="en">CCITT</i> ier Jrop 3 als Fax kodeet',
@@ -3913,7 +3940,6 @@ Wells Do jetz met en neu Version die Sigg widder neu aanläje?',
 
 # Separators for various lists, etc.
 'semicolon-separator' => ';',
-'autocomment-prefix' => '-',
 'word-separator' => '&#32;',
 'ellipsis' => '&nbsp;…',
 'parentheses' => '($1)',
@@ -4043,7 +4069,6 @@ Dä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlöße
 'version-other' => 'Söns',
 'version-mediahandlers' => 'Medije-Handler',
 'version-hooks' => 'Schnettstelle oder Hooke',
-'version-extension-functions' => 'Funktione för Zosätz',
 'version-parser-extensiontags' => 'Erjänzunge zom Parser',
 'version-parser-function-hooks' => 'Parserfunktione',
 'version-hook-name' => 'De Schnettstelle ier Name',
@@ -4052,6 +4077,7 @@ Dä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlöße
 'version-license' => 'Lėzänz',
 'version-poweredby-credits' => "Dat Wiki heh löp met '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'sönß wää',
+'version-poweredby-translators' => 'de Övversäzer em translatewiki.net',
 'version-credits-summary' => 'Mer bedanke ons för iehr Beidrähsch zom [[Special:Version|MediaWiki]] bei:',
 'version-license-info' => 'MediaWiki es e frei Projramm. Mer kann et unmolesteet wigger verdeile, un mer kann et verändere, wi mer löstich es, wam_mer sesch dobei aan de <i lang="en">GNU General Public License</i> (jenerälle öffentlesche Lizänz noh GNU) hallde deiht, wi se vun der <i lang="en">Free Software Foundation</i> (Steftung för frei Soffwäer) veröffentlesch woode es. Dobei kam_mer sesch ußsöhke of mer sesch aan de Version 2 dovun hallde deiht, udder öhnz en späädere Fassung.
 
@@ -4067,12 +4093,17 @@ Do sullts en [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun dä <i lang="en">GNU Ge
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Der Pad noh de Atikele]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Der Pad noh de Skrepte]',
 
-# Special:FilePath
-'filepath' => 'Medije-Dateie med ier URL zëije',
-'filepath-page' => 'Dattëij_Name:',
-'filepath-submit' => 'Lohß Jonn!',
-'filepath-summary' => "Med dä {{int:nstab-special}} hee künnd'Er dä kompläte Paad vun de neuste Version vun ene Datei direk erusfenge.
-Die Datei weed jlich aanjezeig, odder med däm paßende Projramm op jemaat.",
+# Special:Redirect
+'redirect' => 'Ömleite op en Dattei, ene Metmaacher udder de Väsjohn vun ener Sigg',
+'redirect-legend' => 'Ömleide ob_en Dattei udder Sigg',
+'redirect-summary' => 'Heh di {{int:specialpage}} leidt öm ob_en Dattei — doh mößd_Er ene Nahme aanjävve — udder en Sigg — doh mößd_Er en Kännong för en Väsjoh aanjävve — udder en Metmaachersigg — doh mößd_Er enem Metmaacher sing Kännong aanjävve.',
+'redirect-submit' => 'Lohß Jonn!',
+'redirect-lookup' => 'Söhk noh:',
+'redirect-value' => 'Kännong udder Nahme:',
+'redirect-user' => 'Enem Metmaacher sing Kännong',
+'redirect-revision' => 'Ener Sigg ier Väsjohn ier Kännong',
+'redirect-file' => 'Ener Dattei iehre Nahme',
+'redirect-not-exists' => 'Nit jefonge',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Sök noh dubbelte Dateie',
@@ -4165,6 +4196,9 @@ die De häs han welle. Se künnt jet ällder un nit mieh aktoäll sin.',
 'htmlform-submit' => 'Lohß Jonn!',
 'htmlform-reset' => 'Änderunge retuur nämme',
 'htmlform-selectorother-other' => 'Annder',
+'htmlform-no' => 'Nää',
+'htmlform-yes' => 'Joh',
+'htmlform-chosen-placeholder' => 'Söhk jäd_uß',
 
 # SQLite database support
 'sqlite-has-fts' => 'Version $1 (un kann en janze Täxte söhke)',
@@ -4293,4 +4327,19 @@ Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg
 # Image rotation
 'rotate-comment' => 'Dat Beld wood öm {{PLURAL:$1|$1 Jraad}} esu eröm jedrieht, wi der Ohrzeijer leuf.',
 
+# Limit report
+'limitreport-title' => 'Daate för sijj e Beld vum Paaser ze maache:',
+'limitreport-cputime' => 'verbruch Prozäßorzigg',
+'limitreport-cputime-value' => '{{PLURAL:$1|ein&nbsp;Sekond|$1&nbsp;Sekonde|kein&nbsp;Sekond}}',
+'limitreport-walltime' => 'verbruch äächde Zigg',
+'limitreport-walltime-value' => '{{PLURAL:$1|ein&nbsp;Sekond|$1&nbsp;Sekonde|kein&nbsp;Sekond}}',
+'limitreport-ppvisitednodes-value' => '$1 vun $2',
+'limitreport-ppgeneratednodes-value' => '$1 vun $2',
+'limitreport-postexpandincludesize-value' => '$1 vun $2 Bytes',
+'limitreport-templateargumentsize' => 'Der Ömvang vun de Parrameeterre vun Schablohne',
+'limitreport-templateargumentsize-value' => '$1 vun $2 Bytes',
+'limitreport-expansiondepth-value' => '$1 vun $2',
+'limitreport-expensivefunctioncount' => 'Oproofe vun „düüre“ Fonxjuhne em Paaser',
+'limitreport-expensivefunctioncount-value' => '$1 vun $2',
+
 );
diff --git a/languages/messages/MessagesKu_latn.php b/languages/messages/MessagesKu_latn.php
index f34570e4..09da3328 100644
--- a/languages/messages/MessagesKu_latn.php
+++ b/languages/messages/MessagesKu_latn.php
@@ -54,10 +54,16 @@ $namespaceAliases = array(
 $separatorTransformTable = array( ',' => '.', '.' => ',' );
 
 $specialPageAliases = array(
+	'Allmessages'               => array( 'Hemû_Peyam' ),
+	'Allpages'                  => array( 'Hemû_Rûpel' ),
 	'Categories'                => array( 'Dara_kategoriyan' ),
 	'DoubleRedirects'           => array( 'Redirect\'ên_ducarî' ),
 	'Export'                    => array( 'Eksport' ),
+	'Listadmins'                => array( 'Lîsteya_Rêveberan' ),
+	'Listbots'                  => array( 'Lîsteya_Botan' ),
 	'Listusers'                 => array( 'Lîsteya_bikarhêneran' ),
+	'Longpages'                 => array( 'Rûpelên_dirêj' ),
+	'Newpages'                  => array( 'Rûpelên_nû' ),
 	'Randompage'                => array( 'Rûpela_tesadufî' ),
 	'Randomredirect'            => array( 'Redirecta_tasadufî' ),
 	'Recentchanges'             => array( 'Guherandinên_dawî' ),
@@ -66,6 +72,7 @@ $specialPageAliases = array(
 	'Statistics'                => array( 'Statîstîk' ),
 	'Uncategorizedcategories'   => array( 'Kategoriyên_bê_kategorî' ),
 	'Uncategorizedpages'        => array( 'Rûpelên_bê_kategorî' ),
+	'Upload'                    => array( 'Bar_Bike' ),
 	'Version'                   => array( 'Versiyon' ),
 	'Wantedcategories'          => array( 'Kategorîyên_tên_xwestin' ),
 	'Wantedtemplates'           => array( 'Şablonên_tên_xwestin' ),
@@ -131,9 +138,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Nîşan bide, çiqas bikarhêner dişopînin',
 'tog-oldsig' => 'Pêşdîtina îmzeya heye:',
 'tog-fancysig' => 'Di îmzeyê de girêdana otomatîk a bikarhêner betal bike',
-'tog-externaleditor' => 'Edîtorekî derve bike "standard" (ji yên bi ezmûn re, tercîhên taybet di komputerê de hewce ne)',
-'tog-externaldiff' => 'Birnemijekî derve biguherîne "standard" (ji yên bi ezmûn re, tercîhên taybet di komputerê de hewce ne)',
-'tog-showjumplinks' => 'Girêdanên "Here-berve" qebûlbike',
 'tog-uselivepreview' => 'Pêşdîtina "zindî" bi kar bîne (JavaScript pêwîst e) (ceribandinî)',
 'tog-forceeditsummary' => 'Hinga kurteyeke vala hate tomarkirin min agahdar bike',
 'tog-watchlisthideown' => 'Guherandinên min ji lîsteya şopandinê veşêre',
@@ -317,7 +321,7 @@ $messages = array(
 'view-pool-error' => 'Bibore, server niha zêde barkirî ne. Gelek bikarhêner niha hewl didin ku vê rûpelê bibînin. Ji kerema xwe kêlîkekê bisekine, berî ku tu dîsa hewl bidî rûpelê bibînî.',
 'pool-errorunknown' => 'Çewtiyeke nenas',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Der barê {{SITENAME}} de',
 'aboutpage' => 'Project:Der barê',
 'copyright' => 'Naverok di $1 de derbasdar e.',
@@ -327,7 +331,6 @@ $messages = array(
 'disclaimers' => 'Ferexetname',
 'disclaimerpage' => 'Project:Ferexetname',
 'edithelp' => 'Alîkariya guherandinê',
-'edithelppage' => 'Help:Çawa rûpelekê biguherînim',
 'helppage' => 'Help:Alîkarî',
 'mainpage' => 'Destpêk',
 'mainpage-description' => 'Destpêk',
@@ -399,11 +402,6 @@ Hemû rûpelên taybet dikarin di [[Special:SpecialPages|lîsteya rûpelên tayb
 # General errors
 'error' => 'Çewtî',
 'databaseerror' => 'Çewtiya bingeha daneyan',
-'dberrortext' => 'Li cem dîtina bingeha daneyan <blockquote><tt>$1</tt></blockquote>
-ji fonksiyonê "<tt>$2</tt>" ye.
-MySQL ev şaşîtî hate dîtin: "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Li cem dîtina bingeha daneyan "$1 ji fonksiyonê "<tt>$2</tt>" ye.
-MySQL ev şaşîtî hate dîtin: "<tt>$3: $4</tt>".',
 'laggedslavemode' => "'''Zanibe:''' Dibe ku di vê rûpelê de rojanekirinên dawî nîn bin.",
 'readonly' => 'Bingeha daneyan hatiye girtin',
 'enterlockreason' => 'Sedemeke bestinê binivîse, herwiha demeke texmînkirî ji bo vebûna bestinê binivîse!',
@@ -442,7 +440,6 @@ Pirs: $2',
 'viewsourcetext' => 'Tu dikarî li çavkaniya vê rûpelê binêrî û wê kopî bikî:',
 'protectedinterface' => "Di vê rûpelê da nivîsandin ji bo interface'î zimanan yê vê software'ê ye. Ew tê parstin ji bo vandalîzm li vê derê çênebe.",
 'editinginterface' => "'''Hişyarî:''' Tu rûpeleke ku di Wîkîpediya de ji bo sîstemê girîng e diguherînî. Guherandinên di vê rûpelê de wê ji aliyê hemû bikarhêneran ve werin dîtin. Ji bo wergerê ji kerema xwe di [//translatewiki.net/wiki/Main_Page?setlang=ku-latn translatewiki.net] de bixebite, projeya MediaWiki.",
-'sqlhidden' => '(Jêpirskirina SQL hatiye veşartin)',
 'cascadeprotected' => 'Ev rûpel hatiye parastin ji ber guherandinê, ji ber ku ev rûpela di {{PLURAL:$1|vê rûpelê|van rûpelan da}} tê bikaranîn:
 $2',
 'namespaceprotected' => "Destûra te ji bo guhertina vê rûpelê '''$1''' di valahiya nav de nîne.",
@@ -459,9 +456,15 @@ Tu dikarî {{SITENAME}} niha weke bikarhênerekî nediyarkirî bikarbînî, yan
 Bila di bîra te de be ku gengaz e hin rûpel mîna ku tu hîn bi navê xwe qeyd kiriyî werin nîşandan, heta ku tu nîşanên çavlêgerandina (browser) xwe jênebî.",
 'welcomeuser' => 'Xêr hatî, $1!',
 'yourname' => 'Navê bikarhêner:',
+'userlogin-yourname' => 'Navê bikarhêner',
+'userlogin-yourname-ph' => 'Navê xwe yê bikarhêneriyê binivîse',
 'yourpassword' => 'Şîfre:',
+'userlogin-yourpassword' => 'Şîfre',
+'userlogin-yourpassword-ph' => 'Şîfreya xwe binivîse',
 'yourpasswordagain' => 'Şîfreyê dîsa binivîse:',
 'remembermypassword' => 'Şifreya min di her têketina min de bîne bîra xwe (herî zêde $1 {{PLURAL:$1|rojekê|rojan}})',
+'userlogin-remembermypassword' => 'Min têketî bihêle',
+'userlogin-signwithsecure' => 'Girêdana parastî bikarbîne',
 'yourdomainname' => 'Domaînê te',
 'externaldberror' => 'Çewtiyeke bingeha daneyan heye, an jî destûra te ya rojanekirina hesabê xweyê navxweyî nîne.',
 'login' => 'Têkeve',
@@ -472,14 +475,22 @@ Bila di bîra te de be ku gengaz e hin rûpel mîna ku tu hîn bi navê xwe qeyd
 'logout' => 'Derkeve',
 'userlogout' => 'Derkeve',
 'notloggedin' => 'Xwe tomar nekir',
+'userlogin-noaccount' => 'Hesabekî te nîne?',
+'userlogin-joinproject' => 'Tevlî {{SITENAME}} bibe',
 'nologin' => 'Hesabê te nîne? $1.',
 'nologinlink' => 'Bibe endam',
 'createaccount' => 'Hesabê nû çêke',
 'gotaccount' => 'Hesabê te heye? $1.',
 'gotaccountlink' => 'Têkeve',
 'userlogin-resetlink' => 'Te agahiyên hesabê xwe ji bîr kirin?',
+'userlogin-resetpassword-link' => 'Şîfreyê ji nû ve çêke',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Alîkariya têketinê]]',
+'createacct-emailrequired' => 'E-name',
 'createaccountmail' => 'Use a temporary random password and send it to the email address specified below',
 'createaccountreason' => 'Sedem:',
+'createacct-reason' => 'Sedem',
+'createacct-submit' => 'Hesabê xwe biafirîne',
+'createacct-benefit-body2' => '{{PLURAL:$1|rûpel}}',
 'badretype' => 'Her du şîfreyên ku te nivîsîn li hevdu nayên.',
 'userexists' => 'Ev navî bikarhênerî berê tê bikaranîn. Xêra xwe navekî din bibe.',
 'loginerror' => 'Çewtiya têketinê',
@@ -538,7 +549,7 @@ Ji bo xelaskirina tomarkirinê, divê tu niha şîfreyeke nû binivîsî:',
 'newpassword' => 'Şîfreya nû',
 'retypenew' => 'Şîfreya nû careke din binîvîse',
 'resetpass_submit' => 'Şîfreyê pêkbîne û têkeve',
-'resetpass_success' => 'Şîfreya te hate guherandin! Niha tu tê qeydkirin...',
+'changepassword-success' => 'Şîfreya te hate guherandin! Niha tu tê qeydkirin...',
 'resetpass_forbidden' => 'Şîfre nikarin werin guhertin',
 'resetpass-submit-loggedin' => 'Şîfre biguherîne',
 'resetpass-submit-cancel' => 'Betal bike',
@@ -546,9 +557,8 @@ Ji bo xelaskirina tomarkirinê, divê tu niha şîfreyeke nû binivîsî:',
 
 # Special:PasswordReset
 'passwordreset' => 'Şîfreyê nû bike',
-'passwordreset-text' => 'Ji bo ji nû ve sazkirina şîfreyê vê formê dagire.',
+'passwordreset-text-one' => 'Ji bo ji nû ve sazkirina şîfreyê vê formê dagire.',
 'passwordreset-legend' => 'Şîfreyê nû bike',
-'passwordreset-pretext' => '{{PLURAL:$1||Agahiyekê ji yên li jêr binivîse}}',
 'passwordreset-username' => 'Navê bikarhêner:',
 'passwordreset-email' => 'Navnîşana E-nameyê:',
 'passwordreset-emailtitle' => 'Hûragahiyên hesab li ser {{SITENAME}}',
@@ -711,6 +721,7 @@ Sedema jêbirina rûpelê bi referansa li jêr hatiye piştrastkirin.',
 'log-fulllog' => 'Tevahiya wê bibîne',
 'edit-conflict' => 'Têkçûna guherandinan.',
 'edit-no-change' => 'Guherandina te nehate hesibandin, ji ber ku guherandinên nivîsê tune bûn.',
+'postedit-confirmation' => 'Guhertina te hate tomarkirin.',
 'edit-already-exists' => 'Nikarî rûpeleka nuh çêke.
 Ew berê heye.',
 
@@ -828,7 +839,6 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'searchmenu-legend' => 'Vebijartinên lêgerrînê',
 'searchmenu-exists' => "'''Rûpeleke bi navê \"[[:\$1]]\" li ser vê wîkiyê heye.'''",
 'searchmenu-new' => 'Rûpela "[[:$1]]" çêke!',
-'searchhelp-url' => 'Help:Alîkarî',
 'searchprofile-articles' => 'Rûpelên naverokê',
 'searchprofile-project' => 'Rûpelên alîkariyê û projeyê',
 'searchprofile-images' => 'Multîmedya',
@@ -864,9 +874,6 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'searchdisabled' => '<p>Tu dikarî li {{SITENAME}} bi Google an Yahoo! bigere. Têbînî: Dibe ku encamen lêgerîne ne yên herî nû ne.
 </p>',
 
-# Quickbar
-'qbsettings-none' => 'Tune',
-
 # Preferences page
 'preferences' => 'Tercîhên min',
 'mypreferences' => 'Tercihên min',
@@ -1254,9 +1261,6 @@ Agahdariya li ser [$2 rûpela danasîna pelê] li jêr tê nîşandan.',
 'statistics-users-active' => 'Bikarhênerên çalak',
 'statistics-mostpopular' => 'Rûpelên herî lênerî',
 
-'disambiguations' => 'Rûpelên girêdayî rûpelên cudakirinê',
-'disambiguationspage' => 'Template:disambig',
-
 'doubleredirects' => 'Beralîkirinên ducarî',
 'double-redirect-fixed-move' => 'Cihê [[$1]] hatiye guhertin, ew niha beralîkirina [[$2]] ye.',
 
@@ -1422,10 +1426,9 @@ Gava tu bixwazî wê rûpelê ji nav lîsteya xwe ya şopandinê derbixî, li se
 'unwatch' => 'Êdî neşopîne',
 'unwatchthispage' => 'Êdî neşopîne',
 'notanarticle' => 'Ne gotar e',
-'watchnochange' => 'Ne rûpelek, yê tu dişopînê, hate xeyrandin di vê wextê da, yê tu dixazê bibînê.',
 'watchlist-details' => '{{PLURAL:$1|Rûpeleka|$1 rûpel}} li ser lîsteya te ya şopandinê, rûpelên gotûbêjê nayên jimartin.',
-'wlheader-enotif' => '* Agahdariya E-nameyê pêk tê.',
-'wlheader-showupdated' => "* Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
+'wlheader-enotif' => 'Agahdariya E-nameyê pêk tê.',
+'wlheader-showupdated' => "Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
 'watchlistcontains' => 'Di lîsteya şopandina te de {{PLURAL:$1|rûpelek heye|$1 rûpel hene}}.',
 'wlnote' => "Niha {{PLURAL:$1|xeyrandinê|'''$1''' xeyrandinên}} dawî yê {{PLURAL:$2|seetê|'''$2''' seetên}} dawî {{PLURAL:$1|tê|tên}} dîtin.",
 'wlshowlast' => 'Guhertinên berî $1 saetan, $2 rojan, ya $3 nîşan bide',
@@ -1708,8 +1711,6 @@ Sedemekê binivîse!",
 'ipb_already_blocked' => '"$1" berê hatîye astengkirin',
 'ipb-needreblock' => '$1 berê hatiye astengkirin. Tu dixwazî eyaran biguherînî?',
 'ipb_cant_unblock' => "Şaşbûn: ID'ya astengkirinê $1 nehate dîtin. Astengkirinê xwe niha belkî hatîye rakirin.",
-'blockme' => 'Min astengbike',
-'proxyblocksuccess' => 'Çêbû.',
 'sorbsreason' => "Adrêsa IP ya te ji DNSBL'a {{SITENAME}} wek proxy'eka vekirî tê naskirin.",
 'sorbs_create_account_reason' => "Adrêsa IP ya te ji DNSBL'a {{SITENAME}} wek proxy'eka vekirî tê naskirin. Tu nikarê account'ekê ji xwe ra çêkê.",
 
@@ -1947,7 +1948,7 @@ Ji ber ku girêdaneke derve di wê rûpelê de heye ev pirsgirêk pêk hat.',
 'metadata-expand' => 'Detayên dirêj nîşan bide',
 'metadata-collapse' => 'Detayên dirêj veşêre',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Panbûn',
 'exif-imagelength' => 'Dirêjbûn',
 'exif-jpeginterchangeformatlength' => "Byte'ên daneya JPEG",
@@ -2117,10 +2118,6 @@ Ji kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
 'version-software-version' => 'Guherto',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath-page' => 'Wêne:',
-'filepath-submit' => 'Gotar',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Navê dosyeyê:',
 'fileduplicatesearch-submit' => 'Lê bigere',
diff --git a/languages/messages/MessagesKw.php b/languages/messages/MessagesKw.php
index 7875ba6b..99fa094d 100644
--- a/languages/messages/MessagesKw.php
+++ b/languages/messages/MessagesKw.php
@@ -20,7 +20,7 @@
 
 $namespaceNames = array(
 	NS_MEDIA            => 'Media',
-	NS_SPECIAL          => 'Arbednek',
+	NS_SPECIAL          => 'Arbennek',
 	NS_TALK             => 'Keskows',
 	NS_USER             => 'Devnydhyer',
 	NS_USER_TALK        => 'Keskows_Devnydhyer',
@@ -38,7 +38,7 @@ $namespaceNames = array(
 );
 
 $namespaceAliases = array(
-	'Arbennek'           => NS_SPECIAL,
+	'Arbednek'           => NS_SPECIAL,
 	'Cows'               => NS_TALK,
 	'Kescows'            => NS_TALK,
 	'Cows_Devnydhyer'    => NS_USER_TALK,
@@ -60,100 +60,100 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
-	'Activeusers'               => array( 'DevnydhyoryonBew' ),
+	'Activeusers'               => array( 'DevnydhyoryonByw' ),
 	'Allmessages'               => array( 'OllMessajys' ),
 	'Allpages'                  => array( 'OllFolennow' ),
-	'Ancientpages'              => array( 'FolennowCoth' ),
+	'Ancientpages'              => array( 'FolennowKoth' ),
 	'Badtitle'                  => array( 'TitelDrog' ),
 	'Blankpage'                 => array( 'FolenWag' ),
-	'Block'                     => array( 'Difen' ),
-	'Blockme'                   => array( 'DifenVy' ),
+	'Block'                     => array( 'Difenna' ),
+	'Blockme'                   => array( 'GulOwDifen' ),
 	'Booksources'               => array( 'PennfentynyowLyver' ),
-	'BrokenRedirects'           => array( 'DaswedyansowTerrys' ),
-	'Categories'                => array( 'Classys' ),
+	'BrokenRedirects'           => array( 'DaskedyansowTerrys' ),
+	'Categories'                => array( 'Klassys' ),
 	'ChangeEmail'               => array( 'ChanjyaEbost' ),
 	'ChangePassword'            => array( 'ChanjyaGerTremena' ),
-	'ComparePages'              => array( 'KehevelyFolennow' ),
+	'ComparePages'              => array( 'KeheveliFolennow' ),
 	'Confirmemail'              => array( 'AfydhyaEbost' ),
 	'Contributions'             => array( 'Kevrohow' ),
-	'CreateAccount'             => array( 'FormyaAcont' ),
+	'CreateAccount'             => array( 'FormyaAkont' ),
 	'Deadendpages'              => array( 'FolennowFordhDhall' ),
 	'DeletedContributions'      => array( 'KevrohowDiles' ),
 	'Disambiguations'           => array( 'Diamstyryansow' ),
 	'DoubleRedirects'           => array( 'DaswedyansowDewblek' ),
-	'EditWatchlist'             => array( 'ChanjyaOwRolGolyas' ),
+	'EditWatchlist'             => array( 'ChanjyaOwRolGolya' ),
 	'Emailuser'                 => array( 'EbostyaDevnydhyer' ),
-	'Export'                    => array( 'Esperthy' ),
+	'Export'                    => array( 'Esperthi' ),
 	'Fewestrevisions'           => array( 'AnLyhaAmendyansow' ),
-	'Filepath'                  => array( 'HensAnFolen' ),
-	'Import'                    => array( 'Ymperthy' ),
+	'Filepath'                  => array( 'HynsAnFolen' ),
+	'Import'                    => array( 'Ymperthi' ),
 	'Invalidateemail'           => array( 'DigomposaEbost' ),
 	'JavaScriptTest'            => array( 'PrevyansJavaScript' ),
 	'BlockList'                 => array( 'RolDhifen' ),
-	'LinkSearch'                => array( 'WhilasKevrennow' ),
+	'LinkSearch'                => array( 'HwilasKevrennow' ),
 	'Listadmins'                => array( 'RolyaMenystroryon' ),
 	'Listbots'                  => array( 'RolyaBottys' ),
 	'Listfiles'                 => array( 'RolyaRestrennow' ),
 	'Listgrouprights'           => array( 'RolyaGwiryowBagas' ),
-	'Listredirects'             => array( 'RolyaDaswedyansow' ),
+	'Listredirects'             => array( 'RolyaDaskedyansow' ),
 	'Listusers'                 => array( 'RolyaDevnydhyoryon' ),
-	'Lockdb'                    => array( 'AlwhedhaDB' ),
-	'Log'                       => array( 'Covnoten', 'Covnotennow' ),
+	'Lockdb'                    => array( 'AlhwedhaDB' ),
+	'Log'                       => array( 'Kovnoten', 'Kovnotennow' ),
 	'Lonelypages'               => array( 'FolennowDigoweth' ),
 	'Longpages'                 => array( 'FolennowHir' ),
-	'MergeHistory'              => array( 'IstoryKesunya' ),
-	'MIMEsearch'                => array( 'WhilasMIME' ),
-	'Mostcategories'            => array( 'AnMoyhaClassys' ),
+	'MergeHistory'              => array( 'IstoriKesunya' ),
+	'MIMEsearch'                => array( 'HwilasMIME' ),
+	'Mostcategories'            => array( 'AnMoyhaKlassys' ),
 	'Mostimages'                => array( 'AnMoyhaRestrennowKevennys' ),
 	'Mostinterwikis'            => array( 'AnMoyhaInterwikis' ),
 	'Mostlinked'                => array( 'AnMoyhaFolennowKevrennys' ),
-	'Mostlinkedcategories'      => array( 'AnMoyhaClassysKevrennys' ),
-	'Mostlinkedtemplates'       => array( 'AnMoyhaScantlynsKevrennys' ),
+	'Mostlinkedcategories'      => array( 'AnMoyhaKlassysKevrennys' ),
+	'Mostlinkedtemplates'       => array( 'AnMoyhaSkantlynsKevrennys' ),
 	'Mostrevisions'             => array( 'AnMoyhaAmendyansow' ),
 	'Movepage'                  => array( 'GwayaFolen' ),
 	'Mycontributions'           => array( 'OwHevrohow' ),
 	'Mypage'                    => array( 'OwFolen' ),
-	'Mytalk'                    => array( 'OwHescows' ),
-	'Myuploads'                 => array( 'OwUghcargansow' ),
+	'Mytalk'                    => array( 'OwHeskows' ),
+	'Myuploads'                 => array( 'OwUghkargansow' ),
 	'Newimages'                 => array( 'RestrennowNowyth' ),
 	'Newpages'                  => array( 'FolennowNowyth' ),
 	'PasswordReset'             => array( 'DassetyaGerTremena' ),
 	'PermanentLink'             => array( 'KevrenFast' ),
 	'Popularpages'              => array( 'FolennowGerysDa' ),
-	'Preferences'               => array( 'Dowisyansow' ),
+	'Preferences'               => array( 'Dewisyansow' ),
 	'Prefixindex'               => array( 'MenegvaRagerow' ),
 	'Protectedpages'            => array( 'FolennowDifresys' ),
 	'Protectedtitles'           => array( 'TitlysDifres' ),
 	'Randompage'                => array( 'FolenDreJons' ),
-	'Randomredirect'            => array( 'DaswedyansDreJons' ),
+	'Randomredirect'            => array( 'DaskedyansDreJons' ),
 	'Recentchanges'             => array( 'Chanjyow_a-dhiwedhes' ),
 	'Recentchangeslinked'       => array( 'ChanjyowKelmys' ),
 	'Revisiondelete'            => array( 'DileaAmendyans' ),
-	'Search'                    => array( 'Whilas' ),
-	'Shortpages'                => array( 'FolennowCot' ),
+	'Search'                    => array( 'Hwilas' ),
+	'Shortpages'                => array( 'FolennowBerr' ),
 	'Specialpages'              => array( 'FolennowArbennek' ),
 	'Statistics'                => array( 'Statystygyon' ),
 	'Unblock'                   => array( 'DiswulDifennans' ),
-	'Uncategorizedcategories'   => array( 'ClassysHebClass' ),
-	'Uncategorizedimages'       => array( 'RestrennowHebClass' ),
-	'Uncategorizedpages'        => array( 'FolennowHebClass' ),
-	'Uncategorizedtemplates'    => array( 'ScantlynsHebClass' ),
-	'Undelete'                  => array( 'DiswulDileans' ),
-	'Unlockdb'                  => array( 'DialwhedhaDB' ),
-	'Unusedcategories'          => array( 'ClassysHebDevnydh' ),
+	'Uncategorizedcategories'   => array( 'KlassysHebKlass' ),
+	'Uncategorizedimages'       => array( 'RestrennowHebKlass' ),
+	'Uncategorizedpages'        => array( 'FolennowHebKlass' ),
+	'Uncategorizedtemplates'    => array( 'SkantlynsHebKlass' ),
+	'Undelete'                  => array( 'DiswulDilea' ),
+	'Unlockdb'                  => array( 'DialhwedhaDB' ),
+	'Unusedcategories'          => array( 'KlassysHebDevnydh' ),
 	'Unusedimages'              => array( 'RestrennowHebDevnydh' ),
-	'Unusedtemplates'           => array( 'ScantlynsHebDevnydh' ),
-	'Unwatchedpages'            => array( 'FolennowHebAgaHolyas' ),
-	'Upload'                    => array( 'Ughcarga' ),
-	'Userlogin'                 => array( 'Omgelmy' ),
-	'Userlogout'                => array( 'Digelmy' ),
+	'Unusedtemplates'           => array( 'SkantlynsHebDevnydh' ),
+	'Unwatchedpages'            => array( 'FolennowHebAgaHolya' ),
+	'Upload'                    => array( 'Ughkarga' ),
+	'Userlogin'                 => array( 'Omgelmi' ),
+	'Userlogout'                => array( 'Digelmi' ),
 	'Userrights'                => array( 'GwiryowDevnydhyer' ),
 	'Version'                   => array( 'Versyon' ),
-	'Wantedcategories'          => array( 'ClassysWhansus' ),
-	'Wantedfiles'               => array( 'RestrennowWhansus' ),
-	'Wantedpages'               => array( 'FolennowWhansus' ),
-	'Wantedtemplates'           => array( 'ScantlynsWhansus' ),
-	'Watchlist'                 => array( 'Rol_golyas' ),
+	'Wantedcategories'          => array( 'KlassysHwansus' ),
+	'Wantedfiles'               => array( 'RestrennowHwansus' ),
+	'Wantedpages'               => array( 'FolennowHwansus' ),
+	'Wantedtemplates'           => array( 'SkantlynsHwansus' ),
+	'Watchlist'                 => array( 'Rol_golya' ),
 	'Whatlinkshere'             => array( 'OwKevrennaOmma' ),
 	'Withoutinterwiki'          => array( 'HebInterwiki' ),
 );
@@ -229,7 +229,6 @@ $messages = array(
 'tog-enotifusertalkpages' => 'Danvon ebost dhymm pan vo chanjyes ow folen geskows',
 'tog-oldsig' => 'Sinans a-lemmyn:',
 'tog-fancysig' => 'Dyghtya an sinans avel wikitekst (heb kevren awtomatek)',
-'tog-showjumplinks' => 'Galosegi kevrennow hedhadowder "lamma dhe"',
 'tog-watchlisthideown' => "Kudha ow chanjyow y'n rol wolya",
 'tog-watchlisthidebots' => "Kudha chanjyow gans bottow y'n rol wolya",
 'tog-watchlisthideminor' => "Kudha chanjyow byhan y'n rol wolya",
@@ -237,6 +236,7 @@ $messages = array(
 'tog-watchlisthideanons' => "Kudha chanjyow gans devnydhyoryon heb hanow y'n rol wolya",
 'tog-ccmeonemails' => 'Danvon dhymm dasskrif a ebostow a dhanvonav dhe dhevnydhyoryon erel',
 'tog-showhiddencats' => 'Diskwedhes klassys kudhys',
+'tog-useeditwarning' => 'Gul ow gwarnya pan gyssiv folen janjya gans chanjyow nag yw gwithys',
 
 'underline-always' => 'Pub prys',
 'underline-never' => 'Jammes',
@@ -299,6 +299,18 @@ $messages = array(
 'oct' => 'Hed',
 'nov' => 'Du',
 'dec' => 'Kev',
+'january-date' => '$1 Genver',
+'february-date' => '$1 Hwevrel',
+'march-date' => '$1 Meurth',
+'april-date' => '$1 Ebrel',
+'may-date' => '$1 Me',
+'june-date' => '$1 Metheven',
+'july-date' => '$1 Gortheren',
+'august-date' => '$1 Est',
+'september-date' => '$1 Gwynngala',
+'october-date' => '$1 Hedra',
+'november-date' => '$1 Du',
+'december-date' => '$1 Kevardhu',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Klass|Klassys}}',
@@ -374,6 +386,7 @@ $messages = array(
 'create-this-page' => 'Gwruthyl an folen-ma',
 'delete' => 'Dilea',
 'deletethispage' => 'Dilea an folen-ma',
+'undeletethispage' => 'Diswul dilea an folen-ma',
 'undelete_short' => 'Disdhilea {{PLURAL:$1|unn janj|$1 chanj}}',
 'viewdeleted_short' => 'Gweles {{PLURAL:$1|unn janj diles|$1 chanj diles}}',
 'protect' => 'Difres',
@@ -414,7 +427,7 @@ Gortewgh pols kyns hwi dhe assaya hedhas an folen-ma arta, mar pleg.
 $1',
 'pool-errorunknown' => 'Gwall ankoth',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'A-dro dhe {{SITENAME}}',
 'aboutpage' => 'Project:Kedhlow',
 'copyright' => 'Kavadow yw an dalgh yn-dann $1.',
@@ -424,7 +437,6 @@ $1',
 'disclaimers' => 'Avisyansow',
 'disclaimerpage' => 'Project:Avisyans ollgemmyn',
 'edithelp' => 'Gweres gans chanjya',
-'edithelppage' => 'Help:Chanjya',
 'helppage' => 'Help:Gweres',
 'mainpage' => 'Dynnargh',
 'mainpage-description' => 'Dynnargh',
@@ -496,6 +508,8 @@ $1',
 'viewsource-title' => 'Gweles an bennfenten rag $1',
 'protectedpagetext' => 'Difresys re beu an folen-ma rag gwitha rag chanjya po gwriansow erel.',
 'viewsourcetext' => 'Hwi a yll gweles ha kopia pennfenten an folen-ma:',
+'mycustomcssprotected' => "Ny'gas beus kummyes dhe janjya an folen CSS-ma.",
+'mycustomjsprotected' => "Ny'gas beus kummyes dhe janjya an folen JavaScript-ma.",
 'ns-specialprotected' => 'Ny yllir chanjya folennow arbennek.',
 'exception-nologin' => 'Nyns owgh omgelmys',
 'exception-nologin-text' => 'An folen-ma po an gwrians-ma a wovyn mayth omgelmowgh war an wiki-ma.',
@@ -509,10 +523,18 @@ Notyewgh: Neb folennow a alsa bos diskwedhys kepar del owgh hwath omgelmys, erna
 'welcomecreation-msg' => 'Gwruthys re beu agas akont.
 Na ankevewgh dhe janjya agas [[Special:Preferences|dewisyansow {{SITENAME}}]].',
 'yourname' => 'Hanow devnydhyer:',
+'userlogin-yourname' => 'Hanow devnydhyer',
+'userlogin-yourname-ph' => 'Entrewgh agas hanow devnydhyer',
 'yourpassword' => 'Ger tremena:',
+'userlogin-yourpassword' => 'Ger tremena',
+'userlogin-yourpassword-ph' => 'Entrewgh agas ger tremena',
+'createacct-yourpassword-ph' => 'Entrewgh ger tremena',
 'yourpasswordagain' => 'Jynnskrifewgh agas ger tremena arta:',
+'createacct-yourpasswordagain' => 'Afydhyewgh an ger tremena',
+'createacct-yourpasswordagain-ph' => 'Entrewgh an ger tremena arta',
 'remembermypassword' => "Perthi kov a'm omgelmi war an jynn amontya-ma (rag $1 {{PLURAL:$1|dydh}} dhe'n moyha)",
-'securelogin-stick-https' => 'Gwitha junyes gans HTTPS wosa omgelmi',
+'userlogin-remembermypassword' => "Perthi kov a'm omgelmi",
+'userlogin-signwithsecure' => 'Devnydhya junyans diogel',
 'yourdomainname' => 'Agas tiredh:',
 'password-change-forbidden' => 'Ny yllir chanjya geryow tremena war an wiki-ma.',
 'login' => 'Omgelmi',
@@ -523,18 +545,38 @@ Na ankevewgh dhe janjya agas [[Special:Preferences|dewisyansow {{SITENAME}}]].',
 'logout' => 'Digelmi',
 'userlogout' => 'Digelmi',
 'notloggedin' => 'Digelmys',
+'userlogin-noaccount' => "A ny'gas beus akont?",
+'userlogin-joinproject' => 'Junya {{SITENAME}}',
 'nologin' => "A ny'gas beus akont? '''$1'''.",
 'nologinlink' => 'Gwruthyl akont',
 'createaccount' => 'Gwruthyl akont nowyth',
 'gotaccount' => "Eus akont dhywgh seulabrys? '''$1'''.",
 'gotaccountlink' => 'Omgelmi',
 'userlogin-resetlink' => 'A ankevsowgh hwi agas manylyon omgelmi?',
+'userlogin-resetpassword-link' => 'Dassettya agas ger tremena',
+'helplogin-url' => 'Help:Omgelmi',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Gweres gans omgelmi]]',
+'createacct-join' => 'Entrewgh agas kedhlow a-woles.',
+'createacct-emailrequired' => 'Trigva ebost',
+'createacct-emailoptional' => 'Trigva ebost (a-dhewis)',
+'createacct-email-ph' => 'Entrewgh agas trigva ebost',
 'createaccountmail' => "Devnydhya ger tremena chonsus anbarthus hag y dhanvon dhe'n drigva ebost res a-woles",
+'createacct-realname' => 'Hanow gwir (a-dhewis)',
 'createaccountreason' => 'Acheson:',
+'createacct-reason' => 'Acheson',
+'createacct-reason-ph' => 'Prag yth esowgh ow kwruthyl akont aral',
+'createacct-captcha' => 'Gwiryans sekerder',
+'createacct-imgcaptcha-ph' => 'Entrewgh an tekst a welowgh a-ugh',
+'createacct-submit' => 'Gwruthyl agas akont',
+'createacct-benefit-heading' => 'Gwrys yw {{SITENAME}} gans tus kepar ha hwi.',
+'createacct-benefit-body1' => '{{PLURAL:$1|janj|chanj}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|folen}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|gevriyas|kevriyas}} a-dhiwedhes',
 'badretype' => 'Ny omdhesedh an geryow tremena entrys genowgh.',
 'userexists' => 'Y tevnydhir an hanow devnydhyer entrys genowgh seulabrys.
 Dewisewgh ken hanow mar pleg.',
 'loginerror' => 'Gwall omgelmi',
+'createacct-error' => 'Gwall ow kwruthyl akont',
 'createaccounterror' => 'Ny allas gwruthyl an akont: $1',
 'nocookiesnew' => "Gwruthys veu an akont, mes nyns owgh omgelmys.
 {{SITENAME}} a dhevnydh cookies rag omgelmi devnydhyoryon.
@@ -588,8 +630,8 @@ Rag gorfenna omgelmi, res yw dhywgh settya ger tremena nowyth omma:',
 'newpassword' => 'Ger tremena nowyth:',
 'retypenew' => 'Jynnscrifewgh an ger tremena nowyth arta:',
 'resetpass_submit' => 'Settya an ger tremena hag omgelmi',
-'resetpass_success' => 'Chanjyes re beu agas ger tremena yn soweny!
-Orth agas omgelmy lemmyn...',
+'changepassword-success' => 'Chanjyes re beu agas ger tremena yn sewen!
+Orth agas omgelmi lemmyn...',
 'resetpass_forbidden' => 'Ny yllir chanjya geryow tremena',
 'resetpass-submit-loggedin' => 'Chanjya an ger tremena',
 'resetpass-submit-cancel' => 'Hedhi',
@@ -597,10 +639,10 @@ Orth agas omgelmy lemmyn...',
 
 # Special:PasswordReset
 'passwordreset' => 'Dassettya an ger tremena',
-'passwordreset-text' => 'Lenwewgh an furvlen-ma rag dassettya agas ger tremena.',
+'passwordreset-text-one' => 'Lenwewgh an furvlen-ma rag dassettya agas ger tremena.',
+'passwordreset-text-many' => "{{PLURAL:$1|Entrewgh onan a'n tymmyn a dhata a-woles rag dassettya agas ger tremena.}}",
 'passwordreset-legend' => 'Dassettya an ger tremena',
 'passwordreset-disabled' => 'Dialosegys yw dassettya geryow tremena war an wiki-ma.',
-'passwordreset-pretext' => "{{PLURAL:$1||Entrowgh onen a'n tymmyn a dhata a-woles}}",
 'passwordreset-username' => 'Hanow devnydhyer:',
 'passwordreset-domain' => 'Tiredh:',
 'passwordreset-email' => 'Trigva ebost:',
@@ -687,6 +729,8 @@ Res yw an diwettha kovnoten a-woles rag godhvos:",
 'moveddeleted-notice' => 'An folen-ma re beu diles.
 Yma kovnoten dhilea ha gwaya an folen res a-woles.',
 'log-fulllog' => 'Gweles an govnoten dhien',
+'editwarning-warning' => 'Mar kasowgh an folen-ma, y halser kelli chanjyow gwrys genowgh.
+Mars owgh omgelmys, hwi a yll dialosegi an gwarnyans-ma yn tregh "Chanjya" agas dewisyansow.',
 
 # "Undo" feature
 'undo-success' => 'Y hyllir diswul an chanj-ma.
@@ -764,7 +808,6 @@ Alhwedh: '''({{int:cur}})''' = an dyffrans dhyworth an amendyans diwettha, '''({
 'searchmenu-legend' => 'Etholyow hwilas',
 'searchmenu-exists' => "''Yma folen henwys \"[[:\$1]]\" war an wiki-ma'''",
 'searchmenu-new' => "'''Gwruthyl an folen \"[[:\$1]]\" war an wiki-ma!'''",
-'searchhelp-url' => 'Help:Gweres',
 'searchprofile-articles' => 'Folennow dalgh',
 'searchprofile-project' => 'Folennow gweres ha ragdres',
 'searchprofile-images' => 'Liesmedia',
@@ -823,7 +866,6 @@ Assayewgh rag-gorra agas govyn gans ''all:'' rag hwilas yn pub tyller (ynna an f
 'resetprefs' => 'Klerhe chanjyow nag yw gwithys',
 'restoreprefs' => 'Restorya pub settyans defowt',
 'prefs-editing' => 'Chanjya',
-'prefs-edit-boxsize' => 'Myns an fenester janjya.',
 'rows' => 'Rewyow:',
 'columns' => 'Kolovennow:',
 'searchresultshead' => 'Hwilas',
@@ -923,6 +965,7 @@ Ny dhiskwedhir agas trigva ebost pan gestaffo devnydhyoryon erel dhywgh.',
 'recentchanges' => 'Chanjyow a-dhiwedhes',
 'recentchanges-legend' => 'Etholyow an chanjyow a-dhiwedhes',
 'recentchanges-summary' => "Y hyllir helerhi an chanjyow diwettha gwrys dhe'n wiki war an folen-ma.",
+'recentchanges-noresult' => 'Nyns eus chanj vyth dres an termyn res a omdhesedh orth an etholyow-ma.',
 'recentchanges-feed-description' => "Y hyllir helerhi an chanjyow diwettha gwrys dhe'n wiki y'n feed-ma.",
 'recentchanges-label-newpage' => 'Y feu gwruthys folen nowyth gans an chanj-ma',
 'recentchanges-label-minor' => 'Chanj byhan yw hemma',
@@ -952,7 +995,6 @@ Ny dhiskwedhir agas trigva ebost pan gestaffo devnydhyoryon erel dhywgh.',
 'recentchangeslinked-feed' => 'Chanjyow kelmys',
 'recentchangeslinked-toolbox' => 'Chanjyow kelmys',
 'recentchangeslinked-title' => 'Chanjyow kelmys dhe "$1"',
-'recentchangeslinked-noresult' => 'Nyns esa chanj vyth war folennow kevrennys dres an termyn res.',
 'recentchangeslinked-summary' => "Homm yw rol a janjyow gwrys a-dhiwedhes dhe folennow yw kevrennys dhyworth folen res (po dhe eseli a glass res).
 '''Tew''' yw folennow eus war agas [[Special:Watchlist|rol wolya]].",
 'recentchangeslinked-page' => 'Hanow an folen:',
@@ -963,7 +1005,7 @@ Ny dhiskwedhir agas trigva ebost pan gestaffo devnydhyoryon erel dhywgh.',
 'uploadbtn' => 'Ughkarga restren',
 'reuploaddesc' => "Hedhi ughkarga ha dehweles dhe'n furvlen ughkarga",
 'uploadnologin' => 'Digelmys',
-'uploadnologintext' => 'Res yw bos [[Special:UserLogin|omgelmys]] rag ughcarga restrennow.',
+'uploadnologintext' => 'Res yw bos [[Special:UserLogin|omgelmys]] rag ughkarga restrennow.',
 'uploaderror' => 'Gwall ughkarga',
 'uploadlogpage' => 'Kovnoten ughkarga',
 'filename' => 'Hanow an restren',
@@ -1130,6 +1172,7 @@ Diskwedhys a-woles yw an deskrifans war hy [$2 folen dheskrifans] ena.',
 'watchthispage' => 'Golya an folen-ma',
 'unwatch' => 'Diswolya',
 'watchlist-details' => 'Yma {{PLURAL:$1|$1 folen}} war agas rol wolya, marnas folennow keskows.',
+'wlheader-showupdated' => "Yn '''tew''' y tiskwedhir folennow re beu chanjyes a-dhia agas vysytyans diwettha.",
 'wlnote' => "A-woles yma an {{PLURAL:$1|chanj diwettha|'''$1''' chanj diwettha}} y'n {{PLURAL:$2|our|'''$2''' our}} diwettha, a-dhia $3, $4.",
 'wlshowlast' => 'Diskwedhes an $1 our diwettha, an $2 dydh diwettha, po $3',
 'watchlist-options' => 'Etholyow an rol wolya',
@@ -1380,7 +1423,7 @@ Hwi a yll gweles hy fennfenten.',
 'metadata-expand' => 'Diskwedhes manylyon ystynnys',
 'metadata-collapse' => 'Kudha manylyon ystynnys',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Les',
 'exif-imagelength' => 'Uhelder',
 'exif-artist' => 'Awtour',
@@ -1463,9 +1506,6 @@ Hwi a yll [[Special:EditWatchlist|devnydhya an janjyel usadow]] ynwedh.',
 'version-other' => 'Aral',
 'version-version' => '(Versyon $1)',
 
-# Special:FilePath
-'filepath-page' => 'Restren:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Hanow an restren:',
 'fileduplicatesearch-submit' => 'Hwilas',
diff --git a/languages/messages/MessagesKy.php b/languages/messages/MessagesKy.php
index 232fd8fd..bac3319a 100644
--- a/languages/messages/MessagesKy.php
+++ b/languages/messages/MessagesKy.php
@@ -15,6 +15,7 @@
  * @author Growingup
  * @author Kgbek
  * @author Muratjumashev
+ * @author Tynchtyk Chorotegin
  * @author Ztimur
  * @author Викиней
  */
@@ -64,9 +65,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Көзөмөлдөп жаткан колдонуучулардын санын көрсөтүү',
 'tog-oldsig' => 'Учурдагы кол тамга:',
 'tog-fancysig' => 'Кол тамгамдын уики-белгиси гана (автоматтык шилтемесиз)',
-'tog-externaleditor' => 'Тышкы редакторду жарыяланбасча колдонуу (адистер үчүн гана, компьютериңизде өзгөчө ырастоолор керек. [//www.mediawiki.org/wiki/Manual:External_editors кошумча маалымат.])',
-'tog-externaldiff' => 'Салыштыруу үчүн тышкы программаны жарыяланбасча колдонуу (адистер үчүн гана, компьютериңизде өзгөчө ырастоолор керек. [//www.mediawiki.org/wiki/Manual:External_editors кошумча маалымат.])',
-'tog-showjumplinks' => '«өтүү» деген жардамчы шилтемелерди жандыруу',
 'tog-uselivepreview' => 'Тез алдын ала көрсөтүүнү колдонуу (JavaScript талап кылынат) (эксперименталдык)',
 'tog-forceeditsummary' => 'Оңдоо баяндоосунун көзөнөгү бош калган кезинде мага эскертүү',
 'tog-watchlisthideown' => 'Көзөмөлдөө тизмесинен менин оңдоолорумду жашыруу',
@@ -79,6 +77,7 @@ $messages = array(
 'tog-diffonly' => 'Айырмаларды салыштыруунун астынан барактын мазмунун көрсөтпөө',
 'tog-showhiddencats' => 'Жашыруун категорияларды көрсөтүү',
 'tog-norollbackdiff' => 'Кетенчиктөөнү аткаргандан кийин версиялардын айырмасын көрсөтпөө',
+'tog-useeditwarning' => 'Барактан өзгөртүүлөрүмдү сактабастан чыгып баратканымда эскертүү',
 
 'underline-always' => 'Дайыма',
 'underline-never' => 'Эч качан',
@@ -142,6 +141,9 @@ $messages = array(
 'oct' => 'Окт',
 'nov' => 'Ноя',
 'dec' => 'Дек',
+'january-date' => 'Январь (Үчтүн айы) $1',
+'february-date' => '$1-феврал',
+'march-date' => '$1-март',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категория|Категориялар}}',
@@ -223,6 +225,7 @@ $messages = array(
 'create-this-page' => 'Бул баракты түзүү',
 'delete' => 'Өчүрүү',
 'deletethispage' => 'Бул баракты өчүрүү',
+'undeletethispage' => 'Баракты калыбына келтирүү',
 'undelete_short' => '$1 {{PLURAL:$1|оңдоону|$1 оңдоолорду}} калыбына келтирүү',
 'viewdeleted_short' => 'Өчүрүлгөн {{PLURAL:$1|оңдоону|$1 оңдоолорду}} көрүү',
 'protect' => 'Коргоо',
@@ -266,7 +269,7 @@ $1',
 'pool-queuefull' => 'Суроо жыйнагыч толгон',
 'pool-errorunknown' => 'Белгисиз ката',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} тууралуу',
 'aboutpage' => 'Project:Долбоор тууралуу',
 'copyright' => '$1 лицензиясына ылайык жеткиликтүү мазмун.',
@@ -276,7 +279,6 @@ $1',
 'disclaimers' => 'Жоопкерчиликтен баш тартуу',
 'disclaimerpage' => 'Project:Жоопкерчиликтен баш тартуу',
 'edithelp' => 'Оңдоп-түзөөгө жардам',
-'edithelppage' => 'Help:Редакторлоо',
 'helppage' => 'Help:Мазмуну',
 'mainpage' => 'Баш барак',
 'mainpage-description' => 'Баш барак',
@@ -344,12 +346,6 @@ $1',
 # General errors
 'error' => 'Ката',
 'databaseerror' => 'Маалымат базасынын катасы',
-'dberrortext' => 'Маалымат базасынын суроо синтаксисинде ката табылды.
-Бул программалык камсыздоодо ката бар болгонун билдирет.
-Акыркы маалымат базасынын суроосу:
-<blockquote><code>$1</code></blockquote>
-«<code>$2</code>» функциясынан пайда болду.
-Маалымат базасы «<samp>$3: $4</samp>» катасын кайтарды.',
 'laggedslavemode' => "'''Эскертүү:''' баракта акыркы жаңыртуулар жок болуп калышы мүмкүн.",
 'readonly' => 'Маалымат базасы бөгөттөлгөн',
 'enterlockreason' => 'Бөгөттөөнүн себебин жана мөөнөтүн көрсөтүңүз',
@@ -384,7 +380,6 @@ $1',
 'viewsource-title' => '$1 барагынын баштапкы кодун көрүү',
 'actionthrottled' => 'Аралык боюнча чектөө',
 'viewsourcetext' => 'Сиз бул барактын баштапкы кодун көрүп жана көчүрүп алсаңыз болот:',
-'sqlhidden' => '(SQL суроо жашырылган)',
 'ns-specialprotected' => 'Кызматык барактарды оңдоого мүмкүн эмес.',
 'invalidtitle-unknownnamespace' => 'Туура эмес баш сөз',
 'exception-nologin' => 'Сиз системге кирген жоксуз',
@@ -402,10 +397,18 @@ $1',
 'welcomecreation-msg' => 'Сиздин эсеп жазууңуз жаратылды.
 {{SITENAME}} сайтынын [[Special:Preferences|ырастоолорун]] өзгөртүүнү унутпаңыз.',
 'yourname' => 'Колдонуучу аты:',
+'userlogin-yourname' => 'Колдонуучунун аты',
+'userlogin-yourname-ph' => 'Колдонуучу атыңызды териңиз',
 'yourpassword' => 'Сырсөз:',
+'userlogin-yourpassword' => 'Сырсөз',
+'userlogin-yourpassword-ph' => 'Сырсөзүңүздү териңиз',
+'createacct-yourpassword-ph' => 'Сырсөздү териңиз',
 'yourpasswordagain' => 'Сырсөздү кайра терүү:',
+'createacct-yourpasswordagain' => 'Сырсөздү тастыктаңыз',
+'createacct-yourpasswordagain-ph' => 'Сырсөздү кайра киргизиңиз',
 'remembermypassword' => 'Бул браузерде колдонуучу атымды ($1 {{PLURAL:$1|күнгө}} чейин сактоо)',
-'securelogin-stick-https' => 'Киргенден кийин HTTPS аркылуу туташтырууну улантуу',
+'userlogin-remembermypassword' => 'Мени системге кирген боюнча калтыр',
+'userlogin-signwithsecure' => 'Коопсуз байланышты колдонуу',
 'yourdomainname' => 'Сиздин домен:',
 'password-change-forbidden' => 'Сиз бул уикиден сырсөзүңүздү өзгөртө албайсыз.',
 'externaldberror' => 'Маалымат базасында ката кетти же сизге сырткы эсебиңизди жаңыртууга уруксат берилген эмес.',
@@ -417,18 +420,38 @@ $1',
 'logout' => 'Чыгуу',
 'userlogout' => 'Чыгуу',
 'notloggedin' => 'Сиз системге кире элексиз',
+'userlogin-noaccount' => 'Эсеп жазууңуз жокпу?',
+'userlogin-joinproject' => ' {{SITENAME}} кошулуңуз',
 'nologin' => 'Катталган эмессизби? $1.',
 'nologinlink' => 'Катталуу',
 'createaccount' => 'Катталуу',
 'gotaccount' => "Катталгансызбы? '''$1'''.",
 'gotaccountlink' => 'Кирүү',
 'userlogin-resetlink' => 'Кирүүчү маалыматарыңызды эсиңизден чыгардыңызбы?',
+'userlogin-resetpassword-link' => 'Сырсөздү алмаштыруу',
+'helplogin-url' => 'Help:Эсепке кирүү',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Системге кирүүгө жардам]]',
+'createacct-join' => 'Маалыматыңызды төмөнгө териңиз.',
+'createacct-emailrequired' => 'Эмейл дарек',
+'createacct-emailoptional' => 'Эмейл дарек (милдеттүү эмес)',
+'createacct-email-ph' => 'Эмейл дарегиңизди киргизиңиз',
 'createaccountmail' => 'Убактылуу түзүлгөн сырсөздү колдон жана аны көрсөтүлгөн эмейл дарекке жөнөт',
+'createacct-realname' => 'Чыныгы ысымы (милдеттүү эмес)',
 'createaccountreason' => 'Себеби:',
+'createacct-reason' => 'Себеп',
+'createacct-reason-ph' => 'Эмне үчүн башка эсеп жазуу түзүп жатасыз',
+'createacct-captcha' => 'Коопсуздук текшерүүсү',
+'createacct-imgcaptcha-ph' => 'Жогорудагы текстти териңиз',
+'createacct-submit' => 'Катталыңыз',
+'createacct-benefit-heading' => '{{SITENAME}} сиз сыяктуу кишилер тарабынан түзүлгөн.',
+'createacct-benefit-body1' => '{{PLURAL:$1|оңдоо|оңдоолор}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|барак|барактар}}',
+'createacct-benefit-body3' => 'акыркы {{PLURAL:$1|салым|салымдар}}',
 'badretype' => 'Сиз терген сырсөздөр дал келишпейт',
 'userexists' => 'Сиз тандаган колдонуучу ат бош эмес.
 Сураныч, башка атты тандаңыз.',
 'loginerror' => 'Кирүү катасы',
+'createacct-error' => 'Катталууда ката кетти',
 'createaccounterror' => '$1 эсеп жазуусун түзүү мүмкүн эмес',
 'nocookiesnew' => 'Колдонуучунун эсеби түзүлгөн, бирок сиз аны менен али кире элексиз. {{SITENAME}} колдонуучу кирүүсү үчүн куки колдонот. Сиздин кукилер өчүрүлгөн.
 Аларды жандырып, анан жаңы колдонуучу атыңыз жана сырсөзүңүз менен кириңиз.',
@@ -472,6 +495,7 @@ $1',
 'accountcreated' => 'Эсеп жазуусу түзүлдү',
 'createaccount-title' => '{{SITENAME}} үчүн эсеп жазуусун түзүү',
 'usernamehasherror' => 'Колдонуучунун атында торчо (#) белгисине жол берилбейт',
+'login-throttled' => 'Сиз системге кирүүгө өтө көп аракет кылдыңыз. Сураныч, аракетиңизди бир аз тыныгуудан соң улантыңыз.',
 'login-abort-generic' => 'Сиздин кирүүңүз ийгиликсиз болду - Үзүлдү',
 'loginlanguagelabel' => 'Тили: $1',
 
@@ -485,7 +509,7 @@ $1',
 'newpassword' => 'Жаңы сырсөз:',
 'retypenew' => 'Жаңы сырсөздү кайра териңиз:',
 'resetpass_submit' => 'Сырсөздү терип анан кирүү',
-'resetpass_success' => 'Сиздин сырсөзүңүз ийгиликтүү өзгөртүлдү!
+'changepassword-success' => 'Сиздин сырсөзүңүз ийгиликтүү өзгөртүлдү!
 Системага кирүү аткарылып жатат...',
 'resetpass_forbidden' => 'Сырсөздү өзгөртүүгө мүмкүн эмес',
 'resetpass-no-info' => 'Бул баракка түз кайрылыш үчүн, сиз системага киришиңиз керек.',
@@ -495,6 +519,7 @@ $1',
 
 # Special:PasswordReset
 'passwordreset' => 'Сырсөздү түшүрүү',
+'passwordreset-text-one' => 'Сырсөздү алмаштыруу үчүн бул үлгүнү толтуруңуз.',
 'passwordreset-legend' => 'Сырсөздү түшүрүү',
 'passwordreset-disabled' => 'Бул уикиде сырсөздү түшүрүү мүмкүнчүлүгү өчүрүлгөн.',
 'passwordreset-username' => 'Колдонуучу аты:',
@@ -506,7 +531,7 @@ $1',
 Убактылуу сырсөз: $2',
 'passwordreset-emailsent' => 'Сырсөздү алмаштыруу эмейлге жөнөтүлдү.',
 'passwordreset-emailsent-capture' => 'Төмөндө көрсөтүлгөн эмейлге сырсөздү алмаштыруучу кат жөнөтүлдү.',
-'passwordreset-emailerror-capture' => 'Жаратылган эске салуу каты астында көрсөтүлүп турат, бирок аны катышуучуга жөнөтүү оңунан чыккан жок: $1',
+'passwordreset-emailerror-capture' => 'Төмөндө көрсөтүлгөн дарекке сырсөздү алмаштыруу кат түзүлдү,бирок аны  {{GENDER:$2|катышуучуга}} жөнөтүү оңунан чыккан жок: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-mail даректи өзгөртүү',
@@ -601,6 +626,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 Маалымат үчүн төмөндө өчүрүүлөрдүн жана өзгөртүүлөрдүн тизмеси берилген.',
 'log-fulllog' => 'Журналды бүтүн бойдон көрүү',
 'edit-conflict' => 'Оңдоолор конфликти',
+'postedit-confirmation' => 'Оңдооңуз сакталды',
 'edit-already-exists' => 'Жаңы барак түзүү мүмкүн эмес. Мындай барак бар',
 'defaultmessagetext' => 'Жарыяланбасча текст',
 
@@ -718,7 +744,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'searchmenu-legend' => 'Издөө опциялары',
 'searchmenu-exists' => "'''Бул Уикиде \"[[:\$1]]\" деп аталган барак бар.'''",
 'searchmenu-new' => "'''Бул Уикиде \"[[:\$1]]\" барагын түз!'''",
-'searchhelp-url' => 'Help:Мазмун',
 'searchprofile-articles' => 'Негизги барактар',
 'searchprofile-project' => 'Жардам жана Долбоор барактары',
 'searchprofile-images' => 'Мултимедиа',
@@ -755,14 +780,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'powersearch-togglenone' => 'Эчнерсе',
 'search-external' => 'Тышкы издөө',
 
-# Quickbar
-'qbsettings' => 'Навигация панели',
-'qbsettings-none' => 'Көрсөтпөө',
-'qbsettings-fixedleft' => 'Жылбаган сол',
-'qbsettings-fixedright' => 'Жылбаган оң',
-'qbsettings-floatingleft' => 'Оомо сол',
-'qbsettings-floatingright' => 'Оомо оң',
-
 # Preferences page
 'preferences' => 'Ырастоолор',
 'mypreferences' => 'Ырастоолор',
@@ -791,7 +808,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'resetprefs' => 'Сакталбаган өзгөртүүлөрдү тазалоо',
 'restoreprefs' => 'Жарыяланбасча ырастоолорду калыбына келтирүү',
 'prefs-editing' => 'Оңдоп-түзөө',
-'prefs-edit-boxsize' => 'Редакторлоо терезесинин өлчөмү.',
 'rows' => 'Сап:',
 'columns' => 'Тилке:',
 'searchresultshead' => 'Издөө',
@@ -819,7 +835,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'prefs-custom-css' => 'Өз CSS',
 'prefs-custom-js' => 'Өз JavaScript',
 'prefs-emailconfirm-label' => 'Эл. почтаны аныктоо:',
-'prefs-textboxsize' => 'Редакторлоо терезесинин өлчөмү',
 'youremail' => 'Электрондук дарек:',
 'username' => '{{GENDER:$1|Колдонуучу аты}}:',
 'uid' => '{{GENDER:$1|Колдонуучунун}} коду:',
@@ -957,7 +972,6 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'recentchangeslinked-feed' => 'Тиешелүү өзгөрүүлөр',
 'recentchangeslinked-toolbox' => 'Байланыштуу өзгөрүүлөр',
 'recentchangeslinked-title' => '"$1" үчүн тийиштүү өзгөртүүлөр',
-'recentchangeslinked-noresult' => 'Берилген мөөнөттө шилтемеленген барактарда өзгөртүү жок.',
 'recentchangeslinked-summary' => 'Бул көрсөтүлгөн (же көрсөтүлгөн категорияга кирген) барактан шилтемеленген барактардагы жакын арада жасалган өзгөрүүлөрдүн тизмеси.
 [[Special:Watchlist|Көзөмөл тизмеңиз]]деги барактар калын арип менен белгиленген.',
 'recentchangeslinked-page' => 'Барактын аталышы:',
@@ -1077,8 +1091,6 @@ To include a file in a page, use a link in one of the following forms:
 'statistics-pages' => 'Барактар',
 'statistics-files' => 'Жүктөлгөн файлдар',
 
-'disambiguationspage' => 'Template:көп маанилүү',
-
 'brokenredirects-edit' => 'оңдоо',
 'brokenredirects-delete' => 'өчүрүү',
 
@@ -1297,7 +1309,6 @@ To include a file in a page, use a link in one of the following forms:
 'block-log-flags-nocreate' => 'эсеп жазуусун жаратуу өчүрүлгөн',
 'block-log-flags-noemail' => 'кат жөнөтүүгө тыюу салынган',
 'block-log-flags-hiddenname' => 'колдонуучу аты жашырылган',
-'blockme' => 'Мени бөгөттө',
 'proxyblocker' => 'Проксини блокировкалоо',
 
 # Developer tools
@@ -1536,7 +1547,7 @@ To include a file in a page, use a link in one of the following forms:
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Туурасы',
 'exif-imagelength' => 'Бийиктиги',
 'exif-imagedescription' => 'Сүрөт аты',
@@ -1581,7 +1592,7 @@ To include a file in a page, use a link in one of the following forms:
 'exif-intellectualgenre' => 'Объекттин түрү',
 'exif-subjectnewscode' => 'Теманын коду',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Кыстырылбаган',
 
 'exif-copyrighted-true' => 'Автордук укук менен корголгон',
@@ -1733,11 +1744,6 @@ To include a file in a page, use a link in one of the following forms:
 'version-software-version' => 'Версия',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Файл жолу',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Өтүү',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Файл аты:',
 'fileduplicatesearch-submit' => 'Издөө',
diff --git a/languages/messages/MessagesLa.php b/languages/messages/MessagesLa.php
index 298cc279..178251ca 100644
--- a/languages/messages/MessagesLa.php
+++ b/languages/messages/MessagesLa.php
@@ -73,91 +73,92 @@ $dateFormats = array(
 );
 
 $specialPageAliases = array(
-	'Allmessages'               => array( 'Nuntia systematis' ),
-	'Allpages'                  => array( 'Paginae omnes', 'Omnes paginae' ),
-	'Ancientpages'              => array( 'Paginae veterrimae' ),
-	'Blankpage'                 => array( 'Pagina vacua' ),
-	'Block'                     => array( 'Usorem obstruere' ),
-	'Blockme'                   => array( 'Usor obstructus' ),
-	'Booksources'               => array( 'Librorum fontes' ),
-	'BrokenRedirects'           => array( 'Redirectiones fractae' ),
+	'Allmessages'               => array( 'Nuntia_systematis' ),
+	'Allpages'                  => array( 'Paginae_omnes', 'Omnes_paginae' ),
+	'Ancientpages'              => array( 'Paginae_veterrimae' ),
+	'Blankpage'                 => array( 'Pagina_vacua' ),
+	'Block'                     => array( 'Usorem_obstruere' ),
+	'Blockme'                   => array( 'Usor_obstructus' ),
+	'Booksources'               => array( 'Librorum_fontes' ),
+	'BrokenRedirects'           => array( 'Redirectiones_fractae' ),
 	'Categories'                => array( 'Categoriae' ),
-	'ChangePassword'            => array( 'Tesseram novam creare' ),
-	'Confirmemail'              => array( 'Inscriptionem electronicam confirmare' ),
-	'Contributions'             => array( 'Conlationes', 'Conlationes usoris' ),
-	'CreateAccount'             => array( 'Rationem creare' ),
-	'Deadendpages'              => array( 'Paginae sine nexu' ),
-	'DeletedContributions'      => array( 'Conlationes deletae', 'Conlationes usoris deletae' ),
-	'Disambiguations'           => array( 'Paginae disambiguationis', 'Disambiguationes' ),
-	'DoubleRedirects'           => array( 'Redirectiones duplices' ),
-	'Emailuser'                 => array( 'Litteras electronicas usori mittere', 'Littera electronica' ),
-	'Export'                    => array( 'Exportare', 'Paginas exportare' ),
-	'Fewestrevisions'           => array( 'Paginae minime mutatae' ),
-	'FileDuplicateSearch'       => array( 'Quaerere fasciculos duplices', 'Quaerere imagines duplices' ),
-	'Import'                    => array( 'Importare', 'Paginas importare' ),
-	'Invalidateemail'           => array( 'Adfimationem inscriptionis electronicae abrogare' ),
-	'BlockList'                 => array( 'Usores obstructi' ),
-	'LinkSearch'                => array( 'Quaerere nexus externos' ),
+	'ChangePassword'            => array( 'Tesseram_novam_creare' ),
+	'Confirmemail'              => array( 'Inscriptionem_electronicam_confirmare' ),
+	'Contributions'             => array( 'Conlationes', 'Conlationes_usoris' ),
+	'CreateAccount'             => array( 'Rationem_creare' ),
+	'Deadendpages'              => array( 'Paginae_sine_nexu' ),
+	'DeletedContributions'      => array( 'Conlationes_deletae', 'Conlationes_usoris_deletae' ),
+	'Disambiguations'           => array( 'Paginae_disambiguationis', 'Disambiguationes' ),
+	'DoubleRedirects'           => array( 'Redirectiones_duplices' ),
+	'Emailuser'                 => array( 'Litteras_electronicas_usori_mittere', 'Littera_electronica' ),
+	'Export'                    => array( 'Exportare', 'Paginas_exportare' ),
+	'Fewestrevisions'           => array( 'Paginae_minime_mutatae' ),
+	'FileDuplicateSearch'       => array( 'Quaerere_fasciculos_duplices', 'Quaerere_imagines_duplices' ),
+	'Import'                    => array( 'Importare', 'Paginas_importare' ),
+	'Invalidateemail'           => array( 'Adfimationem_inscriptionis_electronicae_abrogare' ),
+	'BlockList'                 => array( 'Usores_obstructi' ),
+	'LinkSearch'                => array( 'Quaerere_nexus_externos' ),
 	'Listadmins'                => array( 'Magistratus' ),
 	'Listbots'                  => array( 'Automata' ),
 	'Listfiles'                 => array( 'Fasciculi', 'Imagines' ),
-	'Listgrouprights'           => array( 'Gregum usorum potestates', 'Iura gregum' ),
+	'Listgrouprights'           => array( 'Gregum_usorum_potestates', 'Iura_gregum' ),
 	'Listredirects'             => array( 'Redirectiones' ),
 	'Listusers'                 => array( 'Usores' ),
-	'Lockdb'                    => array( 'Basem datorum obstruere' ),
+	'Lockdb'                    => array( 'Basem_datorum_obstruere' ),
 	'Log'                       => array( 'Acta' ),
-	'Lonelypages'               => array( 'Paginae non annexae' ),
-	'Longpages'                 => array( 'Paginae longae' ),
-	'MergeHistory'              => array( 'Historias paginarum confundere' ),
-	'MIMEsearch'                => array( 'Quaerere per MIME' ),
-	'Mostcategories'            => array( 'Paginae plurimis categoriis' ),
-	'Mostimages'                => array( 'Fasciculi maxime annexi', 'Imagines maxime annexae' ),
-	'Mostlinked'                => array( 'Paginae maxime annexae' ),
-	'Mostlinkedcategories'      => array( 'Categoriae maxime annexae' ),
-	'Mostlinkedtemplates'       => array( 'Formulae maxime annexae' ),
-	'Mostrevisions'             => array( 'Paginae plurimum mutatae' ),
-	'Movepage'                  => array( 'Paginam movere', 'Movere' ),
-	'Mycontributions'           => array( 'Conlationes meae' ),
-	'Mypage'                    => array( 'Pagina mea' ),
-	'Mytalk'                    => array( 'Disputatio mea' ),
-	'Newimages'                 => array( 'Fasciculi novi', 'Imagines novae' ),
-	'Newpages'                  => array( 'Paginae novae' ),
-	'Popularpages'              => array( 'Paginae saepe monstratae' ),
+	'Lonelypages'               => array( 'Paginae_non_annexae' ),
+	'Longpages'                 => array( 'Paginae_longae' ),
+	'MergeHistory'              => array( 'Historias_paginarum_confundere' ),
+	'MIMEsearch'                => array( 'Quaerere_per_MIME' ),
+	'Mostcategories'            => array( 'Paginae_plurimis_categoriis' ),
+	'Mostimages'                => array( 'Fasciculi_maxime_annexi', 'Imagines_maxime_annexae' ),
+	'Mostlinked'                => array( 'Paginae_maxime_annexae' ),
+	'Mostlinkedcategories'      => array( 'Categoriae_maxime_annexae' ),
+	'Mostlinkedtemplates'       => array( 'Formulae_maxime_annexae' ),
+	'Mostrevisions'             => array( 'Paginae_plurimum_mutatae' ),
+	'Movepage'                  => array( 'Paginam_movere', 'Movere' ),
+	'Mycontributions'           => array( 'Conlationes_meae' ),
+	'Mypage'                    => array( 'Pagina_mea' ),
+	'Mytalk'                    => array( 'Disputatio_mea' ),
+	'Newimages'                 => array( 'Fasciculi_novi', 'Imagines_novae' ),
+	'Newpages'                  => array( 'Paginae_novae' ),
+	'Popularpages'              => array( 'Paginae_saepe_monstratae' ),
 	'Preferences'               => array( 'Praeferentiae' ),
-	'Prefixindex'               => array( 'Praefixa', 'Quaerere per praefixa' ),
-	'Protectedpages'            => array( 'Paginae protectae' ),
-	'Protectedtitles'           => array( 'Tituli protecti' ),
-	'Randompage'                => array( 'Pagina fortuita' ),
-	'Randomredirect'            => array( 'Redirectio fortuita' ),
-	'Recentchanges'             => array( 'Nuper mutata', 'Mutationes recentes' ),
-	'Recentchangeslinked'       => array( 'Nuper mutata annexorum' ),
-	'Revisiondelete'            => array( 'Emendationem delere' ),
+	'Prefixindex'               => array( 'Praefixa', 'Quaerere_per_praefixa' ),
+	'Protectedpages'            => array( 'Paginae_protectae' ),
+	'Protectedtitles'           => array( 'Tituli_protecti' ),
+	'Randompage'                => array( 'Pagina_fortuita' ),
+	'Randomredirect'            => array( 'Redirectio_fortuita' ),
+	'Recentchanges'             => array( 'Nuper_mutata', 'Mutationes_recentes' ),
+	'Recentchangeslinked'       => array( 'Nuper_mutata_annexorum' ),
+	'Redirect'                  => array( 'Redirectio' ),
+	'Revisiondelete'            => array( 'Emendationem_delere' ),
 	'Search'                    => array( 'Quaerere' ),
-	'Shortpages'                => array( 'Paginae breves' ),
-	'Specialpages'              => array( 'Paginae speciales' ),
+	'Shortpages'                => array( 'Paginae_breves' ),
+	'Specialpages'              => array( 'Paginae_speciales' ),
 	'Statistics'                => array( 'Census' ),
-	'Uncategorizedcategories'   => array( 'Categoriae sine categoriis' ),
-	'Uncategorizedimages'       => array( 'Fasciculi sine categoriis', 'Imagines sine categoriis' ),
-	'Uncategorizedpages'        => array( 'Paginae sine categoriis' ),
-	'Uncategorizedtemplates'    => array( 'Formulae sine categoriis' ),
-	'Undelete'                  => array( 'Paginam restituere' ),
-	'Unlockdb'                  => array( 'Basem datorum deobstruere' ),
-	'Unusedcategories'          => array( 'Categoriae non in usu', 'Categoriae vacuae' ),
-	'Unusedimages'              => array( 'Fasciculi non in usu', 'Imagines non in usu' ),
-	'Unusedtemplates'           => array( 'Formulae non in usu' ),
-	'Unwatchedpages'            => array( 'Paginae incustoditae' ),
-	'Upload'                    => array( 'Fasciculos onerare', 'Imagines onerare' ),
-	'Userlogin'                 => array( 'Conventum aperire' ),
-	'Userlogout'                => array( 'Conventum concludere' ),
-	'Userrights'                => array( 'Usorum potestates', 'Iura usorum' ),
+	'Uncategorizedcategories'   => array( 'Categoriae_sine_categoriis' ),
+	'Uncategorizedimages'       => array( 'Fasciculi_sine_categoriis', 'Imagines_sine_categoriis' ),
+	'Uncategorizedpages'        => array( 'Paginae_sine_categoriis' ),
+	'Uncategorizedtemplates'    => array( 'Formulae_sine_categoriis' ),
+	'Undelete'                  => array( 'Paginam_restituere' ),
+	'Unlockdb'                  => array( 'Basem_datorum_deobstruere' ),
+	'Unusedcategories'          => array( 'Categoriae_non_in_usu', 'Categoriae_vacuae' ),
+	'Unusedimages'              => array( 'Fasciculi_non_in_usu', 'Imagines_non_in_usu' ),
+	'Unusedtemplates'           => array( 'Formulae_non_in_usu' ),
+	'Unwatchedpages'            => array( 'Paginae_incustoditae' ),
+	'Upload'                    => array( 'Fasciculos_onerare', 'Imagines_onerare' ),
+	'Userlogin'                 => array( 'Conventum_aperire' ),
+	'Userlogout'                => array( 'Conventum_concludere' ),
+	'Userrights'                => array( 'Usorum_potestates', 'Iura_usorum' ),
 	'Version'                   => array( 'Versio' ),
-	'Wantedcategories'          => array( 'Categoriae desideratae' ),
-	'Wantedfiles'               => array( 'Fasciculi desiderati', 'Imagines desideratae' ),
-	'Wantedpages'               => array( 'Paginae desideratae', 'Nexus fracti' ),
-	'Wantedtemplates'           => array( 'Formulae desideratae' ),
-	'Watchlist'                 => array( 'Paginae custoditae' ),
-	'Whatlinkshere'             => array( 'Nexus ad paginam' ),
-	'Withoutinterwiki'          => array( 'Paginae sine nexibus ad linguas alias', 'Paginae sine nexibus intervicis' ),
+	'Wantedcategories'          => array( 'Categoriae_desideratae' ),
+	'Wantedfiles'               => array( 'Fasciculi_desiderati', 'Imagines_desideratae' ),
+	'Wantedpages'               => array( 'Paginae_desideratae', 'Nexus_fracti' ),
+	'Wantedtemplates'           => array( 'Formulae_desideratae' ),
+	'Watchlist'                 => array( 'Paginae_custoditae' ),
+	'Whatlinkshere'             => array( 'Nexus_ad_paginam' ),
+	'Withoutinterwiki'          => array( 'Paginae_sine_nexibus_ad_linguas_alias', 'Paginae_sine_nexibus_intervicis' ),
 );
 
 $messages = array(
@@ -191,9 +192,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Numerum usorum custodientium monstrare',
 'tog-oldsig' => 'Subscriptio ad tempus adhibita:',
 'tog-fancysig' => 'Subscriptio vicitext (sine nexu automatico)',
-'tog-externaleditor' => 'Editore externo semper uti (periti tantum: necesse est organa propria in computatro habere. [//www.mediawiki.org/wiki/Manual:External_editors adiutatum (Anglice)])',
-'tog-externaldiff' => 'Editore dissimilitudinum externo semper uti (periti tantum: necesse est organa propria in computatro habere. [//www.mediawiki.org/wiki/Manual:External_editors adiutatum (Anglice)])',
-'tog-showjumplinks' => 'Sinere nexus ostendi forma "salire ad" monstrata',
 'tog-uselivepreview' => 'Praevisum viventem adhibere (experimentalis)',
 'tog-forceeditsummary' => 'Si recensionem non summatim descripsero, me roga si continuare velim',
 'tog-watchlisthideown' => 'Celare recensiones meas in paginarum custoditarum indice',
@@ -262,6 +260,18 @@ $messages = array(
 'oct' => 'Oct',
 'nov' => 'Nov',
 'dec' => 'Dec',
+'january-date' => '$1 Ianuarii',
+'february-date' => '$1 Februarii',
+'march-date' => '$1 Martii',
+'april-date' => '$1 Aprilis',
+'may-date' => '$1 Maii',
+'june-date' => '$1 Iunii',
+'july-date' => '$1 Iulii',
+'august-date' => '$1 Augusti',
+'september-date' => '$1 Septembris',
+'october-date' => '$1 Octobris',
+'november-date' => '$1 Novembris',
+'december-date' => '$1 Decembris',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categoriae}}',
@@ -340,6 +350,7 @@ $messages = array(
 'create-this-page' => 'Creare hanc paginam',
 'delete' => 'Delere',
 'deletethispage' => 'Delere hanc paginam',
+'undeletethispage' => 'Hanc paginam restituere',
 'undelete_short' => 'Restituere {{PLURAL:$1|unam emendationem|$1 emendationes}}',
 'viewdeleted_short' => 'Inspicere {{PLURAL:$1|unam emendationem deletam|$1 emendationes deletas}}',
 'protect' => 'Protegere',
@@ -376,7 +387,7 @@ $messages = array(
 'jumptosearch' => 'quaerere',
 'pool-errorunknown' => 'Error ignotus',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'De {{grammar:ablative|{{SITENAME}}}}',
 'aboutpage' => 'Project:De {{GRAMMAR:ablative|{{SITENAME}}}}',
 'copyright' => 'Res ad manum sub $1 nisi aliter denuntiatum est.',
@@ -386,7 +397,6 @@ $messages = array(
 'disclaimers' => 'Repudiationes',
 'disclaimerpage' => 'Project:Repudiationes',
 'edithelp' => 'Opes recensendi',
-'edithelppage' => 'Help:De recensendo',
 'helppage' => 'Help:Adiutatum',
 'mainpage' => 'Pagina prima',
 'mainpage-description' => 'Pagina prima',
@@ -460,11 +470,6 @@ Pro indice paginarum specialum validarum, vide [[Special:SpecialPages|{{int:spec
 # General errors
 'error' => 'Erratum',
 'databaseerror' => 'Erratum in basi datorum',
-'dberrortextcl' => 'Erratum syntacticum basis datorum accidit.
-Inquisitio basis datorum ultime apparata erat:
-"$1"
-ex functionis "$2".
-Basis datorum erratum reddidit "$3: $4"',
 'readonly' => 'Basis datorum obstructa',
 'missingarticle-rev' => '(numerus emendationis: $1)',
 'missingarticle-diff' => '(Diss: $1, $2)',
@@ -492,7 +497,6 @@ Inquisitio: $2',
 'viewsourcetext' => 'Fontem videas et exscribeas:',
 'protectedinterface' => 'Haec pagina dat textum interfaciei pro logiciali, et est protecta ad vandalismum vetandum.',
 'editinginterface' => "'''Caveat censor:''' Emendas iam paginam quae textum interfaciei logicialem dat. Mutationes vultum {{grammar:genitive|{{SITENAME}}}} omnibus usoribus afficient. In nuntia MediaWiki vertendo, quaesumus te uti [//translatewiki.net/wiki/Main_Page?setlang=la translatewiki.net].",
-'sqlhidden' => '(inquisitio SQL celata)',
 'namespaceprotected' => "Tibi non licet paginas spatii nominalis '''$1''' recensere.",
 'ns-specialprotected' => 'Paginae speciales recenseri non possunt.',
 'titleprotected' => 'Hic titulus protectus est ab usore [[User:$1|$1]] ne creetur.
@@ -513,8 +517,16 @@ Nota bene paginas fortasse videantur quasi tuum conventum esset apertum, priusqu
 'welcomecreation-msg' => 'Ratio tua creata est.
 Noli oblivisci [[Special:Preferences|praeferentias]] tuas apud {{grammar:accusative|{{SITENAME}}}} mutare.',
 'yourname' => 'Nomen usoris:',
+'userlogin-yourname' => 'Nomen usoris',
+'userlogin-yourname-ph' => 'Nomen usoris tuum inscribe',
+'createacct-another-username-ph' => 'Nomen usoris inscribe',
 'yourpassword' => 'Tessera:',
+'userlogin-yourpassword' => 'Tessera',
+'userlogin-yourpassword-ph' => 'Tesseram tuam inscribe',
+'createacct-yourpassword-ph' => 'Tesseram inscribe',
 'yourpasswordagain' => 'Tesseram adfirmare:',
+'createacct-yourpasswordagain' => 'Tesseram confirmare',
+'createacct-yourpasswordagain-ph' => 'Tesseram iterum inscribe',
 'remembermypassword' => 'Tesseram meam hoc in navigatro inter conventa memento ({{PLURAL:$1|die|diebus}} $1 tenus)',
 'yourdomainname' => 'Regnum tuum:',
 'login' => 'Conventum aperire',
@@ -525,18 +537,33 @@ Noli oblivisci [[Special:Preferences|praeferentias]] tuas apud {{grammar:accusat
 'logout' => 'Conventum concludere',
 'userlogout' => 'Conventum concludere',
 'notloggedin' => 'Conventum non est apertum',
+'userlogin-noaccount' => 'Num rationem non habes?',
 'nologin' => 'Num rationem non habes? $1.',
 'nologinlink' => 'Eam crea',
 'createaccount' => 'Rationem novam creare',
 'gotaccount' => "Habesne iam rationem? '''$1'''.",
 'gotaccountlink' => 'Conventum aperi',
 'userlogin-resetlink' => 'Num tesserae tuae oblitus es?',
+'helplogin-url' => 'Help:Conventum aperire',
+'createacct-emailrequired' => 'Inscriptio electronica',
+'createacct-emailoptional' => 'Inscriptio electronica (non necesse)',
+'createacct-email-ph' => 'Inscriptionem electronicam tuam inscribe',
+'createacct-another-email-ph' => 'Inscriptionem electronicam inscribe',
 'createaccountmail' => 'Use a temporary random password and send it to the email address specified below',
+'createacct-realname' => 'Nomen rectum (non necesse)',
 'createaccountreason' => 'Causa:',
+'createacct-reason' => 'Causa',
+'createacct-reason-ph' => 'Cur aliam rationem creas',
+'createacct-imgcaptcha-ph' => 'Textum quem supra vidis inscribe',
+'createacct-submit' => 'Rationem tuam creare',
+'createacct-another-submit' => 'Aliam rationem creare',
+'createacct-benefit-body1' => '{{PLURAL:$1|recensio|recensiones}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pagina|paginae}}',
 'badretype' => 'Tesserae quas scripsisti inter se non congruunt.',
 'userexists' => 'Nomen usoris quod selegisti iam est.
 Nomen usoris alium selige.',
 'loginerror' => 'Error factus est in aperiendo conventum',
+'createacct-error' => 'Error in ratione creanda',
 'createaccounterror' => 'Rationem creare non potuit: $1',
 'nocookiesnew' => "Ratio usoris creata est, sed conventum non apertum est. {{SITENAME}} ''Cookies'' utitur in usorum conventa aperiendo. Cookies tua debiles sunt. Eis potestatem fac, tum conventum aperi cum nomine usoris tesseraque tua nova.",
 'nocookieslogin' => "{{SITENAME}} ''Cookies'' utitur in usorum conventa aperiendo. Cookies tua debiles sunt. Eis potestatem fac, tum conare denuo.",
@@ -584,7 +611,7 @@ Hunc nuntium ignorare potes, si nolis hac ratione uti.',
 'newpassword' => 'Tessera nova:',
 'retypenew' => 'Adfirmare tesseram novam:',
 'resetpass_submit' => 'Tesseram mutare et conventum aperire',
-'resetpass_success' => 'Tessera tua prospere mutata est. Aperiens conventum...',
+'changepassword-success' => 'Tessera tua prospere mutata est.',
 'resetpass_forbidden' => 'Tesserae mutari non possunt',
 'resetpass-no-info' => 'Necesse est conventum aperire ad hanc paginam adhibendum.',
 'resetpass-submit-loggedin' => 'Tesseram mutare',
@@ -840,6 +867,7 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'compareselectedversions' => 'Conferre emendationes selectas',
 'showhideselectedversions' => 'Monstrare/celare emendationes selectas',
 'editundo' => 'abrogare',
+'diff-empty' => '(Nulla dissimilitudo)',
 'diff-multi' => '(Inter has {{PLURAL:$1|una emendatio|$1 emendationes}} ab {{PLURAL:$2|uno usore|$2 usoribus}} {{PLURAL:$1|facta|factae}} non {{PLURAL:$1|videtur|videntur}})',
 
 # Search results
@@ -861,7 +889,6 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'searchmenu-legend' => 'Optiones',
 'searchmenu-exists' => "'''Iam est pagina \"[[:\$1]]\"'''",
 'searchmenu-new' => "'''Creare paginam \"[[:\$1]]\"'''",
-'searchhelp-url' => 'Help:Adiutatum',
 'searchprofile-articles' => 'Paginae contentorum',
 'searchprofile-project' => 'Paginae adiutati et incepti',
 'searchprofile-images' => 'Multimedia',
@@ -899,14 +926,7 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
 'powersearch-togglenone' => 'Nullum',
 'search-external' => 'Inquisitio externalis',
 'searchdisabled' => 'Per {{grammar:accusative|{{SITENAME}}}} ad tempus non potes quaerere. Interea per [http://www.google.com Googlem] quaeras. Nota indices {{grammar:genitive|{{SITENAME}}}} contentorum apud Googlem fortasse antiquiores esse.',
-
-# Quickbar
-'qbsettings' => 'Figuratio claustri celeris',
-'qbsettings-none' => 'Nullus',
-'qbsettings-fixedleft' => 'Constituere a sinistra',
-'qbsettings-fixedright' => 'Constituere a dextra',
-'qbsettings-floatingleft' => 'Innens a sinistra',
-'qbsettings-floatingright' => 'Innens a dextra',
+'search-error' => 'Error in quaerendo: $1',
 
 # Preferences page
 'preferences' => 'Praeferentiae',
@@ -935,7 +955,6 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
 'saveprefs' => 'Servare praeferentias',
 'resetprefs' => 'Reddere praeferentias',
 'prefs-editing' => 'Mensura capsae verbi',
-'prefs-edit-boxsize' => 'Magnitudo capsae recensionis.',
 'rows' => 'Lineae:',
 'columns' => 'Columnae:',
 'searchresultshead' => 'Figuratio eventorum investigationis',
@@ -968,7 +987,6 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
 'prefs-custom-css' => 'CSS proprium',
 'prefs-custom-js' => 'JS proprium',
 'prefs-emailconfirm-label' => 'Adfirmatio inscriptionis electronicae:',
-'prefs-textboxsize' => 'Magnitudo capsae recensionis',
 'youremail' => 'Inscriptio electronica:',
 'username' => 'Nomen usoris:',
 'uid' => 'ID usoris:',
@@ -994,6 +1012,7 @@ Si vis id dare, opera tua tibi ascribentur.',
 'prefs-info' => 'Informatio basica',
 'prefs-i18n' => 'Internationalizatio',
 'prefs-signature' => 'Subscriptio',
+'prefs-preview' => 'Praevisum',
 'prefs-advancedwatchlist' => 'Praeferentiae monstrare',
 'prefs-displayrc' => 'Praeferentiae vultus',
 'prefs-displaysearchoptions' => 'Praeferentiae vultus',
@@ -1113,9 +1132,12 @@ Si vis id dare, opera tua tibi ascribentur.',
 'action-userrights' => 'omnes potestates usorum recensere',
 'action-userrights-interwiki' => 'potestates usorum aliis in vicis recensere',
 'action-siteadmin' => 'basem datorum obstruere vel deobstruere',
+'action-editmywatchlist' => 'Recensere paginas custoditas',
+'action-viewmywatchlist' => 'Spectare paginas custoditas',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|mutatio|mutationes}}',
+'enhancedrc-history' => 'Historia',
 'recentchanges' => 'Nuper mutata',
 'recentchanges-legend' => 'Indicis paginarum nuper mutatarum praeferentiae',
 'recentchanges-summary' => 'Inspice mutationes recentes huic vici in hac pagina.',
@@ -1160,7 +1182,7 @@ Si vis id dare, opera tua tibi ascribentur.',
 'uploadbtn' => 'Fasciculum imponere',
 'reuploaddesc' => 'Siste imponere et ad imponendi formam redi',
 'uploadnologin' => 'Conventum non est apertum',
-'uploadnologintext' => 'Oportet [[Special:UserLogin|aperire conventum]] ut fasciculos imponas.',
+'uploadnologintext' => 'Necesse est tibi $1 priusquam fasciculos imponas.',
 'uploaderror' => 'Imponendi erratum',
 'uploadtext' => "Utere formam subter ad fasciculos imponendos.
 Ut fasciculos antea impositos videas aut quaeras, adi ad [[Special:FileList|indicem fasciculorum impositorum]]. Fasciculi impositi et deleti quoque in [[Special:Log/upload|notatione fasciculorum impositorum]] notantur.
@@ -1301,6 +1323,9 @@ Fortasse [$2 paginam descriptionis fasciculi] ibi sitam recensere vis.',
 'randompage' => 'Pagina fortuita',
 'randompage-nopages' => 'Non est ulla pagina {{PLURAL:$2|hoc in spatio nominale|in his spatiis nominalibus}}: $1.',
 
+# Random page in category
+'randomincategory-selectcategory-submit' => 'Pergere',
+
 # Random redirect
 'randomredirect' => 'Redirectio fortuita',
 'randomredirect-nopages' => 'Non est ulla redirectio in spatio nominali "$1".',
@@ -1325,12 +1350,6 @@ Fortasse [$2 paginam descriptionis fasciculi] ibi sitam recensere vis.',
 'statistics-users-active-desc' => 'Usores qui {{PLURAL:$1|proxima die|proximis $1 diebus}} actionem perfecerunt',
 'statistics-mostpopular' => 'Paginae plurimum visae',
 
-'disambiguations' => 'Paginae quae ad paginas discretivas nectunt',
-'disambiguationspage' => 'Template:Discretiva',
-'disambiguations-text' => "Paginae subter ad '''paginam discretivam''' nectunt.
-Eae ad aptas paginas magis nectendae sunt.<br />
-Pagina discretivam esse putatur si formulam adhibet ad quem [[MediaWiki:Disambiguationspage]] nectit.",
-
 'pageswithprop-submit' => 'Pergere',
 
 'doubleredirects' => 'Redirectiones duplices',
@@ -1524,7 +1543,6 @@ Mutationes posthac huic paginae et paginae disputationis ibi notabuntur.',
 'unwatchthispage' => 'Abrogare custoditum',
 'notanarticle' => 'Res non est',
 'notvisiblerev' => 'Emendatio deleta est',
-'watchnochange' => 'Nullae paginarum custoditarum tuarum recensitae sunt in hoc tempore.',
 'watchlist-details' => '{{PLURAL:$1|$1 pagina|$1 paginae}} in indice paginarum custoditarum tuarum, sine paginis disputationis.',
 'watchmethod-recent' => 'recensita recenta quaerens pro pagina custodita',
 'watchmethod-list' => 'paginas custoditas quaerens pro recensitis recentibus',
@@ -1815,10 +1833,7 @@ Commodule notatio obstructionum subter datur.',
 'ipb_already_blocked' => '"$1" iam obstructus est',
 'ipb-needreblock' => '$1 iam obstructus est. Visne obstructionem modificare?',
 'ip_range_invalid' => 'Latitudo IP irrita.',
-'blockme' => 'Usor obstructus',
 'proxyblocker' => 'Instrumentum obstructionis moderatorum',
-'proxyblocker-disabled' => 'Haec functio prohibita est.',
-'proxyblocksuccess' => 'Factum.',
 'cant-block-while-blocked' => 'Dum obstructus es, non potes usores alios obstruere.',
 
 # Developer tools
@@ -2038,7 +2053,6 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 'pageinfo-toolboxlink' => 'De hac pagina',
 
 # Skin names
-'skinname-standard' => 'Norma',
 'skinname-cologneblue' => 'Caerulus Colonia',
 
 # Patrolling
@@ -2086,7 +2100,7 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 'metadata-expand' => 'Plura ostende',
 'metadata-collapse' => 'Partim celare',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Amplitudo',
 'exif-imagelength' => 'Altitudo',
 'exif-bitspersample' => 'Biti per componentem',
@@ -2160,7 +2174,7 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 'exif-gpsdifferential' => 'Correctio differentialis GPS',
 'exif-source' => 'Fons',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Incompressus',
 
 'exif-unknowndate' => 'Dies ignota',
@@ -2381,7 +2395,6 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
 'version-variables' => 'Variabilia',
 'version-other' => 'Alia',
 'version-hooks' => 'Extensiones',
-'version-extension-functions' => 'Functiones extensionum',
 'version-parser-function-hooks' => 'Extensiones functionum programmatis analysis lexicalis',
 'version-hook-name' => 'Nomen extensionis',
 'version-hook-subscribedby' => 'Subscriptum ab',
@@ -2390,11 +2403,6 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
 'version-software-product' => 'Productum',
 'version-software-version' => 'Versio',
 
-# Special:FilePath
-'filepath' => 'Fasciculorum inscriptio',
-'filepath-page' => 'Fasciculus:',
-'filepath-submit' => 'Ire',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-legend' => 'Duplicatum quaerere',
 'fileduplicatesearch-filename' => 'Fasciculi nomen:',
diff --git a/languages/messages/MessagesLad.php b/languages/messages/MessagesLad.php
index 71f6e9fc..e33bc4de 100644
--- a/languages/messages/MessagesLad.php
+++ b/languages/messages/MessagesLad.php
@@ -34,8 +34,8 @@ $namespaceNames = array(
 	NS_TEMPLATE_TALK    => 'Diskusyón_de_Xablón',
 	NS_HELP             => 'Ayudo',
 	NS_HELP_TALK        => 'Diskusyón_de_Ayudo',
-	NS_CATEGORY         => 'Katēggoría',
-	NS_CATEGORY_TALK    => 'Diskusyón_de_Katēggoría',
+	NS_CATEGORY         => 'Kateggoría',
+	NS_CATEGORY_TALK    => 'Diskusyón_de_Kateggoría',
 );
 
 $namespaceAliases = array(
@@ -66,8 +66,8 @@ $namespaceAliases = array(
 	'Xabblón'                  => NS_TEMPLATE,
 	'Diskusyón_de_Xabblón'     => NS_TEMPLATE_TALK,
 	'Diskussión_de_Ayudo'      => NS_HELP_TALK,
-	'Kateggoría'               => NS_CATEGORY,
-	'Diskussión_de_Kateggoría' => NS_CATEGORY_TALK,
+	'Katēggoría'               => NS_CATEGORY,
+	'Diskusyón_de_Katēggoría'  => NS_CATEGORY_TALK,
 );
 
 // Remove Spanish gender aliases (bug 37090)
@@ -211,9 +211,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Àmostrar el kadhar de usadores que están akavidando las hojas',
 'tog-oldsig' => 'La firma presente',
 'tog-fancysig' => 'Tratar la firma como un vikiteksto (sin un atamiento otomatiko)',
-'tog-externaleditor' => 'Yir usando un ēdditor esterno (es sólo para usadores adelantados; tiene menester de ayares especiales en vuestro contador [//www.mediawiki.org/wiki/Manual:External_editors Para saver más.])',
-'tog-externaldiff' => 'Yir usando un comparador (diff) esterno (sólo es para usadores adelantados; tiene menester de ayares especiales en vuestro contador [//www.mediawiki.org/wiki/Manual:External_editors Para saver más.])',
-'tog-showjumplinks' => 'Aktivar los atamientos de ayudo "{{int:jumpto}}"',
 'tog-uselivepreview' => 'Usar el "previsteo bivo" (JavaScript es menester) (eksperimental)',
 'tog-forceeditsummary' => 'Avizarme cuando dexo el somaryo vazío',
 'tog-watchlisthideown' => 'Esconder mis trocamientos en mi lista de akavidamiento',
@@ -402,7 +399,7 @@ $messages = array(
 'jumptonavigation' => 'navigación',
 'jumptosearch' => 'búsquida',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Encima de la {{SITENAME}}',
 'aboutpage' => 'Project:Encima de',
 'copyright' => 'El contenido se puede topar debaxo de la <i>$1</i>',
@@ -412,7 +409,6 @@ $messages = array(
 'disclaimers' => 'Refuso de responsabilitá',
 'disclaimerpage' => 'Project:Refuso de responsabilitá jeneral',
 'edithelp' => '¿Cómo se la troca?',
-'edithelppage' => 'Help:Una hoja, ¿cómodo se la troca?',
 'helppage' => 'Help:Contènidos',
 'mainpage' => 'La Primera Hoja',
 'mainpage-description' => 'La Primera Hoja',
@@ -672,7 +668,6 @@ Leyenda: (act) = diferencias con la versión actual,
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => 'Egziste una oja yamada "[[:$1]]" en esta viki',
 'searchmenu-new' => "'''Crîar la hoja «[[:$1]]» en esta viki!'''",
-'searchhelp-url' => 'Help:Ayudo',
 'searchprofile-articles' => 'Hojas de contènido',
 'searchprofile-project' => 'Hojas de ayudo y hojas de projeto',
 'searchprofile-images' => 'Multimedya',
@@ -796,7 +791,6 @@ Las búsquedas producen más o munco a buscar biervos comunes como «la» o «de
 'recentchangeslinked-feed' => 'Trocamientos conectados',
 'recentchangeslinked-toolbox' => 'Trocamientos relatados',
 'recentchangeslinked-title' => 'Los trocamientos relacionados con "$1"',
-'recentchangeslinked-noresult' => 'Sin trokamientos en las ójas atadas en la data demandada',
 'recentchangeslinked-summary' => "Esto es la lista de los trocamientos de alcavo de las hojas que relatan á una hoja spēcifik (ou de los miembros de la katēggoría spēcifikada).
 Las hojas en tu [[Special:Watchlist|lista de akavidamiento]] son escritas '''con letras grexas'''.",
 'recentchangeslinked-page' => 'Nombre de la hoja',
@@ -843,8 +837,6 @@ La descripción en su [$2 hoja de descripción del arxivo] está amostrada debax
 # Statistics
 'statistics' => 'Estatísticas',
 
-'disambiguationspage' => 'Template:Aklarasion',
-
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bayt|baytes}}',
 'nmembers' => '$1 {{PLURAL:$1|miembro|miembros}}',
@@ -1160,7 +1152,7 @@ Los otros campos se van a guardar por defecto.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-filesource' => 'Manadéro de archivo',
 'exif-gpstimestamp' => 'Tiémpo GPS (óra atómica)',
 'exif-gpsdatestamp' => 'Dáta GPS',
@@ -1241,10 +1233,6 @@ Los otros campos se van a guardar por defecto.
 'version-poweredby-others' => 'otros',
 'version-software-version' => 'Versión',
 
-# Special:FilePath
-'filepath-page' => 'Dosya:',
-'filepath-submit' => 'Yir',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Buscar',
 
diff --git a/languages/messages/MessagesLb.php b/languages/messages/MessagesLb.php
index 7e8e55ea..3838aaf5 100644
--- a/languages/messages/MessagesLb.php
+++ b/languages/messages/MessagesLb.php
@@ -18,6 +18,7 @@
  * @author Robby
  * @author Soued031
  * @author Urhixidur
+ * @author VT98Fan
  * @author Zinneke
  * @author לערי ריינהארט
  */
@@ -118,6 +119,7 @@ $specialPageAliases = array(
 	'Randomredirect'            => array( 'Zoufälleg_Viruleedung' ),
 	'Recentchanges'             => array( 'Rezent_Ännerungen' ),
 	'Recentchangeslinked'       => array( 'Ännerungen_op_verlinkte_Säiten' ),
+	'Redirect'                  => array( 'Viruleedung' ),
 	'Revisiondelete'            => array( 'Versioun_läschen' ),
 	'Search'                    => array( 'Sichen' ),
 	'Shortpages'                => array( 'Kuerz_Säiten' ),
@@ -213,9 +215,6 @@ $messages = array(
 'tog-shownumberswatching' => "D'Zuel vun de Benotzer déi dës Säit iwwerwaache weisen",
 'tog-oldsig' => 'Aktuell Ënnerschrëft:',
 'tog-fancysig' => 'Ënnerschrëft als Wiki-Text behandelen (Ouni automatesche Link)',
-'tog-externaleditor' => 'Externen Editeur als Standard benotzen (Nëmme fir Experten, et musse speziell Astellungen op ärem Computer gemaach ginn. [//www.mediawiki.org/wiki/Manual:External_editors Méi Informatiounen.])',
-'tog-externaldiff' => 'En Externen Diff-Programm als Standard benotzen (nëmme fir Experten, et musse speziell Astellungen op ärem Computer gemaach ginn. [//www.mediawiki.org/wiki/Manual:External_editors Méi Informatiounen])',
-'tog-showjumplinks' => 'Aktivéiere vun de "Sprang op"-Linken',
 'tog-uselivepreview' => 'Live-Preview benotzen (experimentell)',
 'tog-forceeditsummary' => 'Warnen, wa beim Späicheren de Resumé feelt',
 'tog-watchlisthideown' => 'Meng Ännerungen op menger Iwwerwaachungslëscht verstoppen',
@@ -229,6 +228,8 @@ $messages = array(
 'tog-showhiddencats' => 'Verstoppt Kategorië weisen',
 'tog-noconvertlink' => 'Ëmwandlung vum Titel desaktivéieren',
 'tog-norollbackdiff' => 'Ënnerscheed nom Zrécksetzen ënnerdrécken',
+'tog-useeditwarning' => "Mech warne wann ech d'Ännerung vun enger Säit verloossen, ouni Ännerunge gespäichert ze hunn",
+'tog-prefershttps' => 'Ëmmer eng sécher Verbindung benotze wann ageloggt',
 
 'underline-always' => 'Ëmmer',
 'underline-never' => 'Ni',
@@ -292,6 +293,18 @@ $messages = array(
 'oct' => 'Okt.',
 'nov' => 'Nov.',
 'dec' => 'Dez.',
+'january-date' => '$1. Januar',
+'february-date' => '$1. Februar',
+'march-date' => '$1. Mäerz',
+'april-date' => '$1. Abrëll',
+'may-date' => '$1. Mee',
+'june-date' => '$1. Juni',
+'july-date' => '$1. Juli',
+'august-date' => '$1. August',
+'september-date' => '$1. September',
+'october-date' => '$1. Oktober',
+'november-date' => '$1. November',
+'december-date' => '$1. Dezember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorien}}',
@@ -373,6 +386,7 @@ $messages = array(
 'create-this-page' => 'Dës Säit uleeën',
 'delete' => 'Läschen',
 'deletethispage' => 'Dës Säit läschen',
+'undeletethispage' => 'Dës Säit restauréieren',
 'undelete_short' => '$1 {{PLURAL:$1|Versioun|Versioune}} restauréieren',
 'viewdeleted_short' => '{{PLURAL:$1|Eng geläschte Versioun|$1 geläscht Versioune}} weisen',
 'protect' => 'Spären',
@@ -389,7 +403,7 @@ $messages = array(
 'articlepage' => 'Säit',
 'talk' => 'Diskussioun',
 'views' => 'Affichagen',
-'toolbox' => 'Geschirkëscht',
+'toolbox' => 'Geschir (Tools)',
 'userpage' => 'Benotzersäit',
 'projectpage' => 'Meta-Text',
 'imagepage' => 'Billersäit kucken',
@@ -416,7 +430,7 @@ $1",
 'pool-queuefull' => 'Pool-Queue ass voll',
 'pool-errorunknown' => 'Onbekannte Feeler',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Iwwer {{SITENAME}}',
 'aboutpage' => 'Project:Iwwer',
 'copyright' => 'Den Inhalt ass ënner $1 disponibel wann et net anescht uginn ass.',
@@ -426,7 +440,6 @@ $1",
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Hëllef beim Änneren',
-'edithelppage' => 'Help:Wéi änneren ech eng Säit',
 'helppage' => 'Help:Hëllef',
 'mainpage' => 'Haaptsäit',
 'mainpage-description' => 'Haaptsäit',
@@ -504,17 +517,11 @@ All Spezialsäiten déi et gëtt, sinn op der [[Special:SpecialPages|{{int:speci
 # General errors
 'error' => 'Feeler',
 'databaseerror' => 'Datebank Feeler',
-'dberrortext' => 'En Datebank Syntax Feeler ass opgetrueden.
-Dëst kann op e Feeler an der Software hiweisen.
-De leschte versichten Datebank Query war:
-<blockquote><code>$1</code></blockquote>
-vun der Funktioun "<code>$2</code>".
-D\'Datebank huet de Feeler "<samp>$3: $4</samp>" gemellt.',
-'dberrortextcl' => 'En Datebank Syntax Feeler ass opgetrueden.
-De leschten Datebank Query war:
-"$1"
-vun der Funktioun "$2".
-D\'Datebank huet de Feeler "$3: $4" gemellt.',
+'databaseerror-text' => 'Et ass ee Feeler bäi enger Ufro un Datebank geschitt. Dat deit op e Feeler an der Software.',
+'databaseerror-textcl' => "Et ass e Feeler bäi enger Ufro un d'Datebank geschitt.",
+'databaseerror-query' => 'Ufro: $1',
+'databaseerror-function' => 'Funktioun: $1',
+'databaseerror-error' => 'Feeler: $1',
 'laggedslavemode' => "'''Opgepasst:''' Dës Säit ass net onbedéngt um neiste Stand.",
 'readonly' => "D'Datebank ass gespaart",
 'enterlockreason' => "Gitt w.e.g. e Grond u firwat d'Datebank gespaart ass, a wéi laang dës Spär ongeféier bestoe soll.",
@@ -548,6 +555,7 @@ Et ka sinn datt et scho vun engem Anere geläscht gouf.',
 'cannotdelete-title' => 'D\'Säit "$1" kann net geläscht ginn',
 'delete-hook-aborted' => "D'Läsche gouf vun enger Schnëttstell (hook) ofgebrach.
 Eng Erklärung gouf net ginn.",
+'no-null-revision' => 'Déi nei Nullversioun fir d\'Säit "$1" konnt net ugeluecht ginn',
 'badtitle' => 'Schlechten Titel',
 'badtitletext' => 'De gewënschten Titel ass net valabel, eidel, oder een net korrekten Interwiki Link.',
 'perfcached' => 'Dës Date kommen aus dem Tëschespäicher a si méiglecherweis net aktuell. Maximal {{PLURAL:$1|ee Resultat ass|$1 Resultater sinn}} am Tësche späicher disponibel.',
@@ -569,12 +577,15 @@ Fir Iwwersetzungen fir all Wikien bäizesetzen oder z'änneren gitt w.e.g. op [/
 'editinginterface' => "'''Opgepasst:''' Dir sidd am Gaang, eng Säit z'änneren, déi do ass, fir Interface-Text fir d'Software ze liwweren. 
 Ännerungen op dëser Säit änneren den Interface-Text, jee no Kontext, op allen oder verschiddene Säiten, déi vun alle Benotzer op dëser Wiki gesi ginn. 
 Fir d'Iwwersetzunge fir all Wikien derbäizesetzen oder z'änneren gitt w.e.g. op [//translatewiki.net translatewiki.net], de MediaWiki-Lokalisatiouns-Projet.",
-'sqlhidden' => '(SQL-Offro verstoppt)',
 'cascadeprotected' => 'Dës Säit gouf fir Ännerunge gespaart, well se duerch Cascadeprotectioun vun {{PLURAL:$1|dëser Säit|dëse Säite}} gespaart ass mat der Cascadenoptioun:
 $2',
 'namespaceprotected' => "Dir hutt net déi néideg Rechter fir d'Säiten am Nummraum '''$1''' ze änneren.",
 'customcssprotected' => "Dir hutt net d'Recht dës CSS-Säit z'änneren, well dorop déi perséinlech Astellunge vun engem anere Benotzer gespäichert sinn.",
 'customjsprotected' => "Dir hutt net d'Recht dës JavaScript-Säit z'änneren, well dorop déi perséinlech Astellunge vun engem anere Benotzer gespäichert sinn.",
+'mycustomcssprotected' => "Dir hutt net déi néideg Rechter fir dës CSS-Säit z'änneren.",
+'mycustomjsprotected' => "Dir hutt net déi néideg Rechter fir dës JavaScript-Säit z'änneren.",
+'myprivateinfoprotected' => "Dir hutt net d'Recht fir Är privat Informatiounen z'änneren.",
+'mypreferencesprotected' => "Dir hutt net d'Recht fir Är Astellungen z'änneren.",
 'ns-specialprotected' => 'Spezialsäite kënnen net verännert ginn.',
 'titleprotected' => "Eng Säit mat dësem Numm kann net ugeluecht ginn. Dës Spär gouf vum [[User:$1|$1]] gemaach deen als Grond ''$2'' uginn huet.",
 'filereadonlyerror' => 'De Fichier "$1" konnt net geännert ginn well de Repertoire vun de Fichieren "$2" nëmme geliest däerf ginn.
@@ -598,10 +609,19 @@ Opgepasst: Op verschiddene Säite kann et nach sou aus gesinn, wéi wann Dir nac
 'welcomecreation-msg' => "Äre Benotzerkont gouf ugeluecht.
 Vergiesst net fir Är [[Special:Preferences|{{SITENAME}} Astellungen]] z'änneren",
 'yourname' => 'Benotzernumm:',
+'userlogin-yourname' => 'Benotzernumm',
+'userlogin-yourname-ph' => 'Gitt Äre Benotzernumm an',
+'createacct-another-username-ph' => 'De Benotzernumm aginn:',
 'yourpassword' => 'Passwuert:',
+'userlogin-yourpassword' => 'Passwuert',
+'userlogin-yourpassword-ph' => 'Gitt Äert Passwuert an',
+'createacct-yourpassword-ph' => 'Gitt e Passwuert an',
 'yourpasswordagain' => 'Passwuert nach eemol antippen:',
+'createacct-yourpasswordagain' => 'Passwuert confirméieren',
+'createacct-yourpasswordagain-ph' => 'Passwuert nach eng Kéier aginn',
 'remembermypassword' => 'Meng Umeldung op dësem Computer (fir maximal $1 {{PLURAL:$1|Dag|Deeg}}) verhalen',
-'securelogin-stick-https' => 'Nom Umelle mat HTTPS verbonn bleiwen',
+'userlogin-remembermypassword' => 'Mech ageloggt halen',
+'userlogin-signwithsecure' => 'Eng sécher Verbindung benotzen',
 'yourdomainname' => 'Ären Domän:',
 'password-change-forbidden' => 'Dir däerft op dëser Wiki Passwierder net änneren.',
 'externaldberror' => 'Entweder ass e Feeler bei der externer Authentifizéierung geschitt, oder Dir däerft Ären externe Benotzerkont net aktualiséieren.',
@@ -613,18 +633,44 @@ Vergiesst net fir Är [[Special:Preferences|{{SITENAME}} Astellungen]] z'ännere
 'logout' => 'Ofmellen',
 'userlogout' => 'Ausloggen',
 'notloggedin' => 'Net ageloggt',
+'userlogin-noaccount' => 'Hutt Dir kee Benotzerkont?',
+'userlogin-joinproject' => 'Maacht mat bäi {{SITENAME}}',
 'nologin' => 'Hutt Dir kee Benotzerkont? $1.',
 'nologinlink' => 'Neie Benotzerkont maachen',
 'createaccount' => 'Neie Kont opmaachen',
 'gotaccount' => "Dir hutt schonn e Benotzerkont? '''$1'''.",
 'gotaccountlink' => 'Umellen',
 'userlogin-resetlink' => "Hutt Dir d'Detailer vun Ärem Login vergiess?",
+'userlogin-resetpassword-link' => 'Setzt Äert Passwuert zréck',
+'helplogin-url' => 'Help:Aloggen',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hëllef beim Aloggen]]',
+'userlogin-loggedin' => 'Dir sidd schonn als {{GENDER:$1|$1}} ageloggt.
+Benotzt de Formulaire hei drënner fir Iech als een anere Benotzer anzeloggen.',
+'userlogin-createanother' => 'Maacht een anere Benotzerkont op',
+'createacct-join' => 'Gitt Är Informatioune hei drënner an.',
+'createacct-another-join' => "Gitt d'Informatioune fir den neie Benotzerkont hei drënner an.",
+'createacct-emailrequired' => 'E-Mail-Adress',
+'createacct-emailoptional' => 'E-Mailadress (fakultativ)',
+'createacct-email-ph' => 'Gitt Är E-Mail-Adress an',
+'createacct-another-email-ph' => 'E-Mailadress aginn',
 'createaccountmail' => 'En temporäert zoufällegt Passwuert benotzen an et per E-Mail un déi spezifizéiert E-Mailadress schécken',
+'createacct-realname' => 'Richtegen Numm (fakultativ)',
 'createaccountreason' => 'Grond:',
+'createacct-reason' => 'Grond',
+'createacct-reason-ph' => 'Fir wat Dir een anere Benotzerkonnt uleet',
+'createacct-captcha' => 'Sécherheets-Check',
+'createacct-imgcaptcha-ph' => 'Gitt den Text an deen Dir hei driwwer gesitt',
+'createacct-submit' => 'Äre Benotzerkont uleeën',
+'createacct-another-submit' => 'Maacht een anere Benotzerkonnt op',
+'createacct-benefit-heading' => '{{SITENAME}} gëtt vu Leit wéi Iech gemaach.',
+'createacct-benefit-body1' => '{{PLURAL:$1|Ännerung|Ännerungen}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|Säit|Säiten}}',
+'createacct-benefit-body3' => 'rezent {{PLURAL:$1|Mataarbechter}}',
 'badretype' => 'Är Passwierder stëmmen net iwwereneen.',
 'userexists' => 'De Benotzernumm deen agi gouf gëtt scho benotzt.
 Sicht Iech een anere Benotzernumm.',
 'loginerror' => 'Feeler beim Aloggen',
+'createacct-error' => 'Feeler beim Uleeë vum Benotzerkont',
 'createaccounterror' => 'Benotzerkont konnt net opgemaach ginn: $1',
 'nocookiesnew' => "De Benotzerkont gouf ugeluecht, awer Dir sidd net ageloggt.
 {{SITENAME}} brauch fir dës Funktioun Cookien.
@@ -685,11 +731,14 @@ Dir sollt Iech aloggen an Äert Passwuert elo änneren.
 
 Wann dëse Benotzerkont ongewollt ugeluecht gouf, kënnt Dir dës Noriicht einfach ignoréieren.',
 'usernamehasherror' => "Am Benotzernumm däerfe keng ''hash'' Zeeche sinn",
-'login-throttled' => "Dir hutt zevill dacks versicht d'Passwuert vun dësem Benotzerkont anzeginn.
-Waart w.e.g. ier Dir et nach eng Kéier versicht.",
+'login-throttled' => 'Dir hutt zevill dacks versicht Iech anzeloggen.
+Waart w.e.g. $1 ier Dir et nach eng Kéier probéiert.',
 'login-abort-generic' => 'Dir sidd net ageloggt - Aloggen ofgebrach',
 'loginlanguagelabel' => 'Sprooch: $1',
 'suspicious-userlogout' => 'Är Ufro fir Iech auszeloggen gouf refuséiert well et sou ausgesäit wéi wa se vun engem Futtise Browser oder Proxy-Tëschespäicher kënnt.',
+'createacct-another-realname-tip' => "De richtegen Numm ass fakultativ.
+
+Wann Dir en ugitt, gëtt e benotzt fir d'Benotzerattributiounen fir Är Aarbecht zouzeuerdnen.",
 
 # Email sending
 'php-mail-error-unknown' => 'Onbekannte Feeler an der PHP-Mail-Funktioun',
@@ -706,7 +755,7 @@ Fir är Umeldung ofzeschléissen, musst Dir elo hei een neit Passwuert uginn:',
 'newpassword' => 'Neit Passwuert:',
 'retypenew' => 'Neit Passwuert nach eemol antippen:',
 'resetpass_submit' => 'Passwuert aginn an aloggen',
-'resetpass_success' => 'Äert Passwuert gouf geännert! Elo gitt Dir ageloggt...',
+'changepassword-success' => 'Äert Passwuert gouf geännert!',
 'resetpass_forbidden' => 'Passwierder kënnen net geännert ginn.',
 'resetpass-no-info' => 'Dir musst ageloggt sinn, fir direkt op dës Säit ze kommen.',
 'resetpass-submit-loggedin' => 'Passwuert änneren',
@@ -718,10 +767,11 @@ Vläicht hutt Dir Äert Passwuert scho geännert oder en neit temporäert Passwu
 
 # Special:PasswordReset
 'passwordreset' => 'Passwuert zrécksetzen',
-'passwordreset-text' => 'Fëllt dëse Formulaire aus fir Äert Passwuert zréckzesetzen.',
+'passwordreset-text-one' => 'Fëllt dëse Formulaire aus fir Äert Passwuert zréckzesetzen.',
+'passwordreset-text-many' => '{{PLURAL:$1|Fëllt eent vun de Felder aus fir Äert Passwuert zeréckzesetzen.}}',
 'passwordreset-legend' => 'Passwuert zrécksetzen',
 'passwordreset-disabled' => "D'Zerécksetze vum Passwuert ass op dëser Wiki ausgeschalt.",
-'passwordreset-pretext' => '{{PLURAL:$1||Gitt eng vun dësen Donnéeën an}}',
+'passwordreset-emaildisabled' => "D'E-Mail-Funktioune goufen op dëser Wiki ausgeschalt.",
 'passwordreset-username' => 'Benotzernumm:',
 'passwordreset-domain' => 'Domaine:',
 'passwordreset-capture' => "D'Mail kucken?",
@@ -746,7 +796,7 @@ Dir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Uf
 Temporärt Passwuert: $2',
 'passwordreset-emailsent' => "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt.",
 'passwordreset-emailsent-capture' => "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner.",
-'passwordreset-emailerror-capture' => "D'Erënnerungsmail gouf esou geschéckt wéi Dir se hei drënner gesitt, awer de Benotzer konnt se net kréien: $1",
+'passwordreset-emailerror-capture' => "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner, awer de {{GENDER:$2|Benotzer}} konnt se net kréien: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Mailadress änneren',
@@ -760,6 +810,15 @@ Temporärt Passwuert: $2',
 'changeemail-submit' => 'Mailadress änneren',
 'changeemail-cancel' => 'Ofbriechen',
 
+# Special:ResetTokens
+'resettokens' => 'Token zrécksetzen',
+'resettokens-no-tokens' => 'Et gëtt keng Tokens fir zréck ze setzen.',
+'resettokens-legend' => 'Token zrécksetzen',
+'resettokens-tokens' => 'Token:',
+'resettokens-token-label' => '$1 (aktuelle Wäert: $2)',
+'resettokens-done' => 'Token zréckgesat.',
+'resettokens-resetbutton' => 'Selectionéiert Tokens zrécksetzen',
+
 # Edit page toolbar
 'bold_sample' => 'Fettgedréckten Text',
 'bold_tip' => 'Fettgedréckten Text',
@@ -957,11 +1016,14 @@ Hei ass den Extrait aus dem Logbuch vum Réckelen a Läsche fir déi Säit.',
 Si gouf anscheinend geläscht.",
 'edit-conflict' => 'Ännerungskonflikt.',
 'edit-no-change' => 'Är ännerung gouf ignoréiert, well Dir näischt um Text geännert hutt.',
+'postedit-confirmation' => 'Är Ännerung gouf gespäichert.',
 'edit-already-exists' => 'Déi nei Säit konnt net ugeluecht ginn, well et se scho gëtt.',
 'defaultmessagetext' => 'Standardtext',
 'content-failed-to-parse' => 'Den $2-Inhalt fir den $1-Modell konnt net geparst ginn: $3',
 'invalid-content-data' => 'Donnéeë vum Inhalt sinn net valabel',
 'content-not-allowed-here' => '"$1"-Inhalt ass op der Säit [[$2]] net erlaabt',
+'editwarning-warning' => 'Wann Dir dës Säit verloosst kann dat dozou féieren datt Dir all Ännerungen, déi Dir gemaach hutt, verléiert.
+Wann Dir ageloggt sidd, kënnt Dir dës Warnung an der Sektioun "Änneren" vun Ären Astellungen ausschalten.',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -989,6 +1051,7 @@ Et däerfen net méi wéi $2 {{PLURAL:$2|Ufro|Ufroe}} sinn, aktuell {{PLURAL:$2|
 'undo-failure' => "D'Ännerung konnt net réckgängeg gemaach ginn, wëll de betraffenen Abschnitt an der Tëschenzäit geännert gouf.",
 'undo-norev' => "D'Ännerung kann net zréckgesat ginn, well et se net gëtt oder well se scho geläscht ass.",
 'undo-summary' => 'Ännerung $1 vu(n) [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussioun]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]]) annulléieren.',
+'undo-summary-username-hidden' => 'Versioun $1 vun engem verstoppte Benotzer zrécksetzen',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Benotzerkont konnt net opgemaach ginn',
@@ -1173,6 +1236,7 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
 'compareselectedversions' => 'Ausgewielte Versioune vergläichen',
 'showhideselectedversions' => 'Erausgesicht Versioune weisen/verstoppen',
 'editundo' => 'zréck',
+'diff-empty' => '(Keen Ënnerscheed)',
 'diff-multi' => '({{PLURAL:$1|Eng Tëscheversioun|$1 Tëscheversioune}} vun {{PLURAL:$2|engem|$2}} Benotzer {{PLURAL:$1|gëtt|ginn}} net gewisen)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Eng Tëscheversioun|$1 Tëscheversioune}} vu méi wéi $2 {{PLURAL:$2|Benotzer|Benotzer}} ginn net gewisen)',
 'difference-missing-revision' => '{{PLURAL:$2|Eng Versioun|$2 Versioune}} vun dëser Differenz ($1) {{PLURAL:$2|gouf|goufen}} net fonnt.
@@ -1200,7 +1264,6 @@ Detailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchmenu-legend' => 'Sichoptiounen',
 'searchmenu-exists' => "* Säit '''[[$1]]'''",
 'searchmenu-new' => "'''Opmaache vun der Säit ''[[:$1|$1]]'' op dëser Wiki!'''",
-'searchhelp-url' => 'Help:Inhalter',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|All Säite weisen, déi mat dem Begrëff ufänken nodeem Dir sicht]]',
 'searchprofile-articles' => 'Säite mat Inhalt',
 'searchprofile-project' => 'Hëllef a Projetssäiten',
@@ -1241,15 +1304,7 @@ Detailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'powersearch-togglenone' => 'Keen',
 'search-external' => 'Extern sichen',
 'searchdisabled' => "D'Sichfunktioun op {{SITENAME}} ass ausgeschalt. Dir kënnt iwwerdeems mat Hëllef vu Google sichen. Bedenkt awer, datt deenen hire  Sichindex fir {{SITENAME}} eventuell net dem aktuellste Stand entsprecht.",
-
-# Quickbar
-'qbsettings' => 'Geschirläischt',
-'qbsettings-none' => 'Keen',
-'qbsettings-fixedleft' => 'Lénks, fest',
-'qbsettings-fixedright' => 'Riets, fest',
-'qbsettings-floatingleft' => 'schwiewt lenks',
-'qbsettings-floatingright' => 'Schwiewt riets',
-'qbsettings-directionality' => 'Fix, ofhängeg vun der Schreiwrichtung vun Ärer Sprooch',
+'search-error' => 'Beim Sichen ass e Feeler geschitt: $1',
 
 # Preferences page
 'preferences' => 'Astellungen',
@@ -1283,7 +1338,6 @@ Detailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'resetprefs' => 'Net gespäichert Ännerungen zrécksetzen',
 'restoreprefs' => 'All Standardastellungen zrécksetzen (an allen Abschnitter)',
 'prefs-editing' => 'Änneren',
-'prefs-edit-boxsize' => 'Gréisst vun der Ännerungsfënster:',
 'rows' => 'Zeilen',
 'columns' => 'Kolonnen',
 'searchresultshead' => 'Sichen',
@@ -1294,9 +1348,7 @@ Detailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'recentchangesdays-max' => '(Maximal $1 {{PLURAL:$1|Dag|Deeg}})',
 'recentchangescount' => 'Zuel vun den Ännerungen déi als Standard gewise ginn:',
 'prefs-help-recentchangescount' => 'Inklusiv Rezent Ännerungen, Versiounshistoriquen a Logbicher.',
-'prefs-help-watchlist-token' => 'Wann Dir dëst Feld mat engem Geheimcode ausfëllt gëtt en RSS-Feed fir Är Iwwerwaachungslëscht generéiert.
-Jiddwereen deen de Geheimcode aus dësem Feld kennt kann Är Iwwerwaachungslëscht liesen, wielt dofir e séchere Wäert.
-Hei ass een zoufälleg generéierte Wäert deen Dir benotze kënnt: $1',
+'prefs-help-watchlist-token2' => 'Dëst ass de geheime Schlëssel fir de Webfeed vun Ärer Iwwerwaachungslëscht. Jiddwereen deen e kennt kann Är Iwwerwaachungslëscht liesen, dofir sollt Dir en net weider ginn. [[Special:ResetTokens|Klickt hei wann Dir en zrécksetze musst]].',
 'savedprefs' => 'Är Astellunge goufe gespäichert.',
 'timezonelegend' => 'Zäitzon:',
 'localtime' => 'Lokalzäit:',
@@ -1327,7 +1379,6 @@ Hei ass een zoufälleg generéierte Wäert deen Dir benotze kënnt: $1',
 'prefs-reset-intro' => "Dir kënnt dës Säit benotze fir Är Astellungen zréck op d'Standard-Astllungen ze setzen.
 Dëst kann net réckgängeg gemaach ginn.",
 'prefs-emailconfirm-label' => 'E-Mail Confirmatioun:',
-'prefs-textboxsize' => 'Gréisst vun der Ännerungsfënster',
 'youremail' => 'E-Mail-Adress:',
 'username' => '{{GENDER:$1|Benotzernumm}}:',
 'uid' => '{{GENDER:$1|Benotzer}} ID:',
@@ -1361,6 +1412,8 @@ Dës Informatioun ass ëffentlech.",
 'prefs-dateformat' => 'Format vum Datum',
 'prefs-timeoffset' => 'Zäitënnerscheed',
 'prefs-advancedediting' => 'Allgemeng Optiounen',
+'prefs-editor' => 'Editeur',
+'prefs-preview' => 'Kucken ouni ofzespäicheren',
 'prefs-advancedrc' => 'Méi Optiounen',
 'prefs-advancedrendering' => 'Méi Optiounen',
 'prefs-advancedsearchoptions' => 'Méi Optiounen',
@@ -1369,6 +1422,7 @@ Dës Informatioun ass ëffentlech.",
 'prefs-displaysearchoptions' => 'Optioune vum Affichage',
 'prefs-displaywatchlist' => 'Optioune vun deem wat gewise gëtt',
 'prefs-diffs' => 'Ënnerscheeder',
+'prefs-help-prefershttps' => 'Dës Astellung gëtt déi nächste Kéier wierksam wou Dir Iech ageloggt.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => "D'E-Mail-Adress schéngt valabel ze sinn",
@@ -1395,6 +1449,8 @@ Dës Informatioun ass ëffentlech.",
 'userrights-notallowed' => 'Dir hutt net déi néideg Rechter fir Rechter vun anere Benotzer derbäizesetzen oder ewechzehuelen.',
 'userrights-changeable-col' => 'Gruppen déi Dir ännere kënnt',
 'userrights-unchangeable-col' => 'Gruppen déi Dir net ännere kënnt',
+'userrights-conflict' => 'Konflikt bäi de Benotzerrechter! Kuckt Är Ännerunge w.e.g. no a maacht se w.e.g. nach eng Kéier.',
+'userrights-removed-self' => 'Dir hutt Är eege Rechter ewechgeholl. Dofir kënnt Dir net méi op dës Säit zougräifen.',
 
 # Groups
 'group' => 'Grupp:',
@@ -1460,11 +1516,19 @@ Dës Informatioun ass ëffentlech.",
 'right-proxyunbannable' => 'Automatesche Proxyspären ëmgoen',
 'right-unblockself' => 'Seng eege Spär ophiewen',
 'right-protect' => 'Protektiounsniveauen änneren a kaskadegespaart Säiten änneren',
-'right-editprotected' => 'Protegéiert Säiten (ouni Kaskadeprotectioun) änneren',
+'right-editprotected' => 'Protegéiert Säiten als "{{int:protect-level-sysop}}" änneren',
+'right-editsemiprotected' => 'Säiten déi als  "{{int:protect-level-autoconfirmed}}" gespaart sinn änneren',
 'right-editinterface' => 'De Benotzerinterface änneren',
 'right-editusercssjs' => 'Anere Benotzer hir CSS a JS Fichieren änneren',
 'right-editusercss' => 'Anere Benotzer hir CSS Fichieren änneren',
 'right-edituserjs' => 'Anere Benotzer hir JavaScript Fichieren änneren',
+'right-editmyusercss' => 'Är eegen CSS-Fichieren änneren',
+'right-editmyuserjs' => 'Är eege JavaScript-Fichieren änneren',
+'right-viewmywatchlist' => 'Kuckt Är eegen Iwwerwaachungslëscht',
+'right-editmywatchlist' => "Ännert Är eegen Iwwerwaachungslëscht. Denkt drun datt och aner Aktioune Säiten op d'Iwwerwaachungslëscht derbäisetzen.",
+'right-viewmyprivateinfo' => 'Är eege privat Donnéeën (z.Bsp. E-Mail-Adress, richtegen Numm) kucken',
+'right-editmyprivateinfo' => 'Är eege privat Donnéeën (z.Bsp. E-Mail-Adress, richtegen Numm) änneren',
+'right-editmyoptions' => 'Ännert Är eegen Astellungen',
 'right-rollback' => "Ännerunge vum läschte Benotzer vun enger spezieller Säit séier z'récksetzen ''(rollback)''",
 'right-markbotedits' => 'Annuléiert Ännerungen als Botännerunge weisen',
 'right-noratelimit' => 'Net limitéiert duerch Zäitlimitatiounen um Server',
@@ -1526,12 +1590,19 @@ Dës Informatioun ass ëffentlech.",
 'action-userrights-interwiki' => "d'Rechter vu Benotzer vun anere Wikien z'änneren",
 'action-siteadmin' => "d'Datebank ze spären oder d'Spär opzehiewen",
 'action-sendemail' => 'Maile schécken',
+'action-editmywatchlist' => 'ännert Är Iwwerwaachungslëscht',
+'action-viewmywatchlist' => 'kuckt Är Iwwerwaachungslëscht',
+'action-viewmyprivateinfo' => 'Är privat Informatioune kucken',
+'action-editmyprivateinfo' => 'Är privat Informatiounen änneren',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|Ännerung|Ännerungen}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|zanter dem leschte Passage}}',
+'enhancedrc-history' => 'Versiounen',
 'recentchanges' => 'Rezent Ännerungen',
 'recentchanges-legend' => 'Optioune vun de rezenten Ännerungen',
 'recentchanges-summary' => "Op dëser Säit kënnt Dir déi rezent Ännerungen op '''{{SITENAME}}''' gesinn.",
+'recentchanges-noresult' => 'Keng Ännerunge während der Period déi ugi gouf passen op de Critère.',
 'recentchanges-feed-description' => 'Verfollegt mat dësem Feed déi rezent Ännerungen op {{SITENAME}}.',
 'recentchanges-label-newpage' => 'Dës Ännerung huet eng nei Säit ugeluecht',
 'recentchanges-label-minor' => 'Dëst ass eng kleng Ännerung',
@@ -1569,7 +1640,6 @@ Dës Informatioun ass ëffentlech.",
 'recentchangeslinked-feed' => 'Ännerungen op verlinkt Säiten',
 'recentchangeslinked-toolbox' => 'Ännerungen op verlinkt Säiten',
 'recentchangeslinked-title' => 'Ännerungen a Verbindung mat "$1"',
-'recentchangeslinked-noresult' => 'Am ausgewielten Zäitraum goufen op de verlinkte Säite keng Ännerunge gemaach.',
 'recentchangeslinked-summary' => "Dëst ass eng Lëscht mat Ännerunge vu verlinkte Säiten op eng bestëmmte Säit (oder vu Membersäite vun der spezifizéierter Kategorie).
 Säite vun [[Special:Watchlist|Ärer Iwwerwaachungslëscht]] si '''fett''' geschriwwen.",
 'recentchangeslinked-page' => 'Säitennumm:',
@@ -1581,7 +1651,7 @@ Säite vun [[Special:Watchlist|Ärer Iwwerwaachungslëscht]] si '''fett''' gesch
 'reuploaddesc' => 'Eroplueden ofbriechen an zréck op de Formulaire fir Eropzelueden',
 'upload-tryagain' => 'Déi geännert Beschreiwung vum Fichier schécken',
 'uploadnologin' => 'Net ageloggt',
-'uploadnologintext' => 'Dir musst [[Special:UserLogin|ageloggt sinn]], fir Fichieren eroplueden zu kënnen.',
+'uploadnologintext' => 'Dir musst Iech $1, fir Fichieren eroplueden zu kënnen.',
 'upload_directory_missing' => 'De Repertoire an deen Dir eropluede wollt ($1) feelt a konnt net vum Webserver ugeluecht ginn.',
 'upload_directory_read_only' => 'De Webserver kann net an den Upload-Repertoire ($1) schreiwen.',
 'uploaderror' => 'Feeler bäim Eroplueden',
@@ -1792,7 +1862,6 @@ Fir eng optimal Sécherheet ass img_auth.php ausgeschalt.",
 'http-read-error' => 'HTTP-Feeler beim Liesen.',
 'http-timed-out' => 'HTTP-Ufro huet ze laang gebraucht (time out).',
 'http-curl-error' => 'Feeler beim Ofruff vun der URL: $1',
-'http-host-unreachable' => "D'URL konnt net erreecht ginn.",
 'http-bad-status' => 'Et gouf e Problem bäi der HTTP-Ufro: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1821,6 +1890,10 @@ Kuckt w.e.g. no op kee Feeler an der URL ass an op de Site och online ass.',
 'listfiles_size' => 'Gréisst',
 'listfiles_description' => 'Beschreiwung',
 'listfiles_count' => 'Versiounen',
+'listfiles-show-all' => 'Al Versioune vu Biller aschléissen',
+'listfiles-latestversion' => 'Aktuell Versioun',
+'listfiles-latestversion-yes' => 'Jo',
+'listfiles-latestversion-no' => 'Neen',
 
 # File description page
 'file-anchor-link' => 'Fichier',
@@ -1917,6 +1990,13 @@ Dir musst ëmmer de Medien- a Subtyp aginn: z. Bsp. <code>image/jpeg</code>.",
 'randompage' => 'Zoufallssäit',
 'randompage-nopages' => 'Et gëtt keng Säiten {{PLURAL:$2|am Nummraum|an den Nummraim}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Zoufälleg Säit an der Kategorie',
+'randomincategory-invalidcategory' => '"$1" ass kee valabelen Numm fir eng Kategorie.',
+'randomincategory-nopages' => 'Et gëtt keng Säiten an der [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Eng zoufälleg Säit aus der Kategorie: $1 $2 opruffen',
+'randomincategory-selectcategory-submit' => 'Lass',
+
 # Random redirect
 'randomredirect' => 'Zoufälleg Viruleedung',
 'randomredirect-nopages' => 'Am Nummraum $1 gëtt et keng Viruleedungen.',
@@ -1942,17 +2022,12 @@ Dir musst ëmmer de Medien- a Subtyp aginn: z. Bsp. <code>image/jpeg</code>.",
 'statistics-users-active-desc' => 'Benotzer déi während {{PLURAL:$1|dem leschten Dag|de leschten $1 Deeg}} eppes gemaach hunn',
 'statistics-mostpopular' => 'Am meeschte gekuckte Säiten',
 
-'disambiguations' => 'Säiten déi op Homonymiesäite linken',
-'disambiguationspage' => 'Template:Homonymie',
-'disambiguations-text' => "Dës Säite ass mat mindestens enger '''Homonymie-Säit''' verlinkt.
-Si sollte am beschten op déi eigentlech gemengte Säit verlinkt sinn.<br />
-Eng Säite gëtt als Homonymie-Säit behandelt, wa si eng Schabloun benotzt déi vu [[MediaWiki:Disambiguationspage]] verlinkt ass.",
-
 'pageswithprop' => 'Säite mat enger Säiteneegeschaft',
 'pageswithprop-legend' => 'Säite mat enger Säiteneegeschaft',
 'pageswithprop-text' => 'Op dëser Säit sti Säiten déi eng speziell Säiteneegeschaft benotzen.',
 'pageswithprop-prop' => 'Numm vun der Eegeschaft:',
 'pageswithprop-submit' => 'Lass',
+'pageswithprop-prophidden-long' => 'Wäert vun der laanger Texteegeschaft verstoppt ($1)',
 
 'doubleredirects' => 'Duebel Viruleedungen',
 'doubleredirectstext' => 'Op dëser Säit stinn déi Säiten déi op aner Viruleedungssäite viruleeden.
@@ -2200,10 +2275,9 @@ All weider Ännerungen op dëser Säit an der associéierter Diskussiounssäit g
 'unwatchthispage' => 'Net méi iwwerwaachen',
 'notanarticle' => 'Keng Säit',
 'notvisiblerev' => 'Versioun gouf geläscht',
-'watchnochange' => 'Keng vun Ären iwwerwaachte Säite gouf während der ugewisener Zäit verännert.',
 'watchlist-details' => "{{PLURAL:$1|1 Säit|$1 Säiten}} sinn op ärer Iwwerwaachungsklëscht (d'Diskussiounssäite net matgezielt).",
-'wlheader-enotif' => '* E-Mail-Notifikatioun ass ageschalt.',
-'wlheader-showupdated' => "* Säiten déi zënter Ärer leschter Visite geännert goufe si '''fett''' geschriwwen",
+'wlheader-enotif' => 'E-Mail-Notifikatioun ass ageschalt.',
+'wlheader-showupdated' => "Säiten déi zanter Ärer leschter Visite geännert goufen, si '''fett''' geschriwwen",
 'watchmethod-recent' => 'Rezent Ännerunge ginn op iwwerwaacht Säiten iwwerpréift',
 'watchmethod-list' => 'Iwwerwaachte Säite ginn op rezent Ännerungen iwwerpréift',
 'watchlistcontains' => 'Op ärer Iwwerwaachungslëscht $1 {{PLURAL:$1|steet $1 Säit|stinn $1 Säiten}}.',
@@ -2456,7 +2530,7 @@ $1',
 'contributions' => '{{GENDER:$1|Benotzer}}kontributiounen',
 'contributions-title' => 'Kontributioune vum $1',
 'mycontris' => 'Kontributiounen',
-'contribsub2' => 'Fir $1 ($2)',
+'contribsub2' => "Fir {{GENDER:$3|den $1|d'$1|de Benotzer $1}} ($2)",
 'nocontribs' => 'Et goufe keng Ännerunge fonnt, déi dëse Kritèren entspriechen.',
 'uctop' => '(aktuell)',
 'month' => 'Vum Mount (a virdrun):',
@@ -2611,13 +2685,11 @@ Kuckt d'[[Special:BlockList|Spärlëscht]] fir déi aktuell Spären.",
 Si ass awer als Deel vun der Rei $2 gespaart, an dës Spär kann opgehuewe ginn.",
 'ip_range_invalid' => 'Ongëltegen IP Block.',
 'ip_range_toolarge' => 'Späre vu Beräicher déi méi grouss wéi /$1 si sinn net erlaabt.',
-'blockme' => 'Spär mech',
 'proxyblocker' => 'Proxy blocker',
-'proxyblocker-disabled' => 'Dës Funktioun ass ausgeschalt.',
 'proxyblockreason' => 'Är IP-Adress gouf gespaart, well si een oppene Proxy ass. Kontaktéiert w.e.g. ären Internet-Provider oder ärs Systemadministrateuren und informéiert si iiwwer dëses méigleche Sécherheetsprobleem.',
-'proxyblocksuccess' => 'Gemaach.',
 'sorbsreason' => 'Är IP Adress steet als oppene Proxy an der schwaarzer Lëscht (DNSBL) déi vu {{SITENAME}} benotzt gëtt.',
 'sorbs_create_account_reason' => 'Är IP-Adress steet als oppene Proxy an der schwaarzer Lëscht déi op {{SITENAME}} benotzt gëtt. DIr kënnt keen neie Benotzerkont opmaachen.',
+'xffblockreason' => 'Eng IP-Adress am X-Forwarded-For-Header gouf gespaart, entweder Är oder déi vum Proxyserver deen Dir benotzt. De Grond vun der Spär war: $1',
 'cant-block-while-blocked' => 'Dir däerft keng aner Benotzer spären, sou lang wéi Dir selwer gespaart sidd.',
 'cant-see-hidden-user' => "De Benotzer deen Dir versicht ze spären ass scho gespaart a verstoppt. Well Dir d'Recht ''Hideuser'' net hutt kënnt Dir dëse Benotzer net gesinn an dem Benotzer seng Spär net änneren.",
 'ipbblocked' => 'Dir kënnt keng aner Benotzer spären oder hir Spär ophiewen well Dir selwer gespaart sidd',
@@ -2781,6 +2853,8 @@ Besicht w.e.g. [//www.mediawiki.org/wiki/Localisation MediaWiki Localisatioun] a
 'thumbnail-more' => 'vergréisseren',
 'filemissing' => 'Fichier feelt',
 'thumbnail_error' => 'Feeler beim Erstelle vun der Miniatur: $1',
+'thumbnail_error_remote' => 'Feelermessage vum $1:
+$2',
 'djvu_page_error' => 'DjVu-Säit baussent dem Säiteberäich',
 'djvu_no_xml' => 'Den XML ka fir den DjVu-Fichier net ofgeruff ginn',
 'thumbnail-temp-create' => "Den temporäre Fichier fir d'Minitaurbild konnt net ugeluecht ginn",
@@ -2927,21 +3001,16 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
 Erlaabt et e Grond an de Resumé derbäizesetzen.',
 'tooltip-preferences-save' => 'Astellunge späicheren',
 'tooltip-summary' => 'Gitt e kuerze Resumé an',
+'tooltip-iwiki' => '$1 - $2',
 
 # Stylesheets
 'common.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Chick''  */",
-'standard.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Klassesch''  */",
-'nostalgia.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Nostalgie''  */",
 'cologneblue.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Köln Blo''  */",
 'monobook.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Monobook''  */",
-'myskin.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''MySkin''  */",
-'chick.css' => '/* Dës CSS huet nëmmen Afloss op de Skin "Chick" */',
-'simple.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Einfach''  */",
 'modern.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Modern''  */",
 
 # Scripts
 'common.js' => '/* All JavaScript hei gëtt fir all Benotzer beim Luede vun all Säit gelueden. */',
-'nostalgia.js' => '/* Dëse JavaScript gëtt geluede fir Nostalgia ze benotzen */',
 
 # Metadata
 'notacceptable' => "De Wiki-Server kann d'Donnéeë net an engem Format liwweren déi vun ärem Apparat geliest kënne ginn.",
@@ -3015,13 +3084,8 @@ Dëst wahrscheinlech duerch en externe Link den op der schwaarzer Lëscht (black
 'pageinfo-category-files' => 'Zuel vun de Fichieren',
 
 # Skin names
-'skinname-standard' => 'Klassesch',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Köln Blo',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Einfach',
 'skinname-modern' => 'Modern',
 
 # Patrolling
@@ -3099,11 +3163,25 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
 'minutes' => '{{PLURAL:$1|enger Minutt|$1 Minutten}}',
 'hours' => '{{PLURAL:$1|enger Stonn|$1 Stonnen}}',
 'days' => '{{PLURAL:$1|engem Dag|$1 Deeg}}',
+'weeks' => '{{PLURAL: $1|eng Woch|$1 Wochen}}',
 'months' => '{{PLURAL:$1|ee Mount|$1 Méint}}',
 'years' => '{{PLURAL:$1|ee Joer|$1 Joer}}',
 'ago' => 'viru(n) $1',
 'just-now' => 'grad elo',
 
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|virun 1 Stonn| viru(n) $1 Stonnen}}',
+'minutes-ago' => '{{PLURAL:$1|virun 1 Minutt| viru(n) $1 Minutten}}',
+'seconds-ago' => '{{PLURAL:$1|virun 1 Sekonn|viru(n) $1 Sekonnen}}',
+'monday-at' => 'Méindes ëm $1',
+'tuesday-at' => 'Dënschdes ëm $1',
+'wednesday-at' => 'Mëttwochs ëm $1',
+'thursday-at' => 'Donneschdes ëm $1',
+'friday-at' => 'Freides ëm $1',
+'saturday-at' => 'Samschdes ëm $1',
+'sunday-at' => 'Sonndes ëm $1',
+'yesterday-at' => 'Gëschter ëm $1',
+
 # Bad image list
 'bad_image_list' => 'Format:
 
@@ -3131,7 +3209,7 @@ Déi aner sinn am Standard verstoppt.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breet',
 'exif-imagelength' => 'Längt',
 'exif-bitspersample' => 'Bite pro Faarfkomponent',
@@ -3307,7 +3385,7 @@ Déi aner sinn am Standard verstoppt.
 'exif-originalimageheight' => 'Héicht vum Bild virum Ofschneiden',
 'exif-originalimagewidth' => 'Breet vum Bild virum Ofschneiden',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Onkompriméiert',
 
 'exif-copyrighted-true' => 'Duerch Copyright geschützt',
@@ -3681,7 +3759,6 @@ Dir kënnt och [[Special:EditWatchlist|de Standard Editeur benotzen]].",
 'version-other' => 'Aner',
 'version-mediahandlers' => 'Medien-Ënnerstëtzung',
 'version-hooks' => 'Klameren',
-'version-extension-functions' => 'Funktioune vun den Erweiderungen',
 'version-parser-extensiontags' => "Parser-Erweiderungen ''(Taggen)''",
 'version-parser-function-hooks' => 'Parser-Funktiounen',
 'version-hook-name' => 'Numm vun der Klamer',
@@ -3690,6 +3767,7 @@ Dir kënnt och [[Special:EditWatchlist|de Standard Editeur benotzen]].",
 'version-license' => 'Lizenz',
 'version-poweredby-credits' => "Dës Wiki funktionéiert mat '''[//www.mediawiki.org/ MediaWiki]''', Copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'anerer',
+'version-poweredby-translators' => 'translatewiki.net Iwwersetzer',
 'version-credits-summary' => "Mir soen dëse Persoune 'Merci' fir hir Mataarbecht u [[Special:Version|MediaWiki]].",
 'version-license-info' => "MediaWiki ass fräi Software; Dir kënnt se weiderginn an/oder s'änneren ënner de Bedingunge vun der GNU-General Public License sou wéi se vun der Free Softare Foundation publizéiert ass; entweder ënner der Versioun 2 vun der Lizenz, oder (no Ärem Choix) enger spéiderer Versioun.
 
@@ -3703,12 +3781,17 @@ Dir misst eng [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun der GNU General Public
 'version-entrypoints-header-entrypoint' => 'Agangspunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Pad bei de Fichier',
-'filepath-page' => 'Fichier:',
-'filepath-submit' => 'Lass',
-'filepath-summary' => 'Op dëser Spezialsäit kënnt Dir de komplette Pad vun der aktueller Versioun vun engem Fichier direkt offroen.
-Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikatioun gestart.',
+# Special:Redirect
+'redirect' => 'Viruleedung duerch e Fichier, Benotzer oder Versiouns-ID',
+'redirect-legend' => 'Viruleedung op ee Fichier oder eng Säit',
+'redirect-summary' => 'Dës Spezialsäit ass eng Viruleedung op e Fichier (Fichiersnumm uginn), eng Säit (Versiounsnummer uginn) oder eng Benotzersäit (numeresch Benotzeridentifikatioun uginn).',
+'redirect-submit' => 'Lass',
+'redirect-lookup' => 'Nosichen:',
+'redirect-value' => 'Wäert:',
+'redirect-user' => 'Benotzernummer',
+'redirect-revision' => 'Versioun vun der Säit',
+'redirect-file' => 'Numm vum Fichier',
+'redirect-not-exists' => 'Wäert net fonnt',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'No duebele Fichiere sichen',
@@ -3758,12 +3841,16 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 'tags' => 'Valabel Ännerungsmarkéierungen',
 'tag-filter' => '[[Special:Tags|Markéierungs]]-Filter:',
 'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)',
 'tags-title' => 'Markéierungen',
 'tags-intro' => 'Op dëser Säit stinn all déi Taggen, déi vun dëser Software fir Ännerungen unzeweise benotzt ginn, an hir Bedeitung.',
 'tags-tag' => 'Numm vun der Markéierung',
 'tags-display-header' => 'Opzielungen op den Ännerungslëschten',
 'tags-description-header' => 'Ganz Beschreiwung vun der Bedeitung',
+'tags-active-header' => 'Aktiv?',
 'tags-hitcount-header' => 'Markéiert Ännerungen',
+'tags-active-yes' => 'Jo',
+'tags-active-no' => 'Neen',
 'tags-edit' => 'änneren',
 'tags-hitcount' => '$1 {{PLURAL:$1|Ännerung|Ännerungen}}',
 
@@ -3784,6 +3871,7 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 'dberr-problems' => 'Pardon! Dëse Site huet technesch Schwieregkeeten.',
 'dberr-again' => 'Versicht e puer Minutten ze waarden an dann nei ze lueden.',
 'dberr-info' => '(Den Datebank-Server kann net erreecht ginn: $1)',
+'dberr-info-hidden' => '(Den Datebank-Server kann net erreecht ginn)',
 'dberr-usegoogle' => 'An der Tëschenzäit kënnt Dir probéiere mam Google ze sichen.',
 'dberr-outofdate' => 'Denkt drunn, datt de Sichindex vun eisen Inhalte méiglecherweis net aktuell ass.',
 'dberr-cachederror' => 'Dëst ass eng tëschegespäichert Kopie vun der gefroter Säit, a si kann eventuell net aktuell sinn.',
@@ -3799,6 +3887,9 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 'htmlform-submit' => 'Späicheren',
 'htmlform-reset' => 'Ännerungen zrécksetzen',
 'htmlform-selectorother-other' => 'Anerer',
+'htmlform-no' => 'Neen',
+'htmlform-yes' => 'Jo',
+'htmlform-chosen-placeholder' => 'Sicht eng Optioun eraus',
 
 # SQLite database support
 'sqlite-has-fts' => "$1 ënnerstëtzt d'Volltextsich",
@@ -3916,4 +4007,12 @@ Soss kënnt Dir den einfache Formulär hei drënner benotzen. Är Bemierkung gë
 # Image rotation
 'rotate-comment' => 'Bild ëm $1 {{PLURAL:$1|Grad}} an der Richtung vun der Auer gedréint',
 
+# Limit report
+'limitreport-cputime' => 'CPU-Zäit-Notzung',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|Sekonn|Sekonnen}}',
+'limitreport-walltime' => 'Echtzäitnotzung',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|Sekonn|Sekonnen}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|Byte|Byten}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|Byte|Byten}}',
+
 );
diff --git a/languages/messages/MessagesLbe.php b/languages/messages/MessagesLbe.php
index 544f0260..ae90ef0e 100644
--- a/languages/messages/MessagesLbe.php
+++ b/languages/messages/MessagesLbe.php
@@ -99,7 +99,7 @@ $messages = array(
 # Special:Log
 'specialloguserlabel' => 'Гьурттучув:',
 
-# Email user
+# E-mail user
 'emailuser' => 'ГьурттучувначӀансса чагьар',
 
 # Watchlist
diff --git a/languages/messages/MessagesLez.php b/languages/messages/MessagesLez.php
index 94c66fde..df854b83 100644
--- a/languages/messages/MessagesLez.php
+++ b/languages/messages/MessagesLez.php
@@ -23,6 +23,40 @@
 
 $fallback = 'ru';
 
+$namespaceNames = array(
+	NS_MEDIA            => 'Медиа',
+	NS_TALK             => 'веревирд_авун',
+	NS_USER             => 'Уртах',
+	NS_USER_TALK        => 'Уртахдин_веревирд_авун',
+	NS_PROJECT_TALK     => '$1_веревирд_авун',
+	NS_FILE             => 'Файл',
+	NS_FILE_TALK        => 'Файл_веревирд_авун',
+	NS_MEDIAWIKI        => 'MediaWiki',
+	NS_MEDIAWIKI_TALK   => 'MediaWiki_веревирд_авун',
+	NS_TEMPLATE         => 'Шаблон',
+	NS_TEMPLATE_TALK    => 'Шаблон_веревирд_авун',
+	NS_CATEGORY         => 'Категория',
+	NS_CATEGORY_TALK    => 'Категория_веревирд_авун',
+);
+
+$namespaceAliases = array(
+	# Russian namespaces
+	'Обсуждение'                         => NS_TALK,
+	'Участник'                           => NS_USER,
+	'Обсуждение_участника'               => NS_USER_TALK,
+	'Обсуждение_{{GRAMMAR:genitive|$1}}' => NS_PROJECT_TALK,
+	'Обсуждение_файла'                   => NS_FILE_TALK,
+	'Обсуждение_MediaWiki'               => NS_MEDIAWIKI_TALK,
+	'Обсуждение_шаблона'                 => NS_TEMPLATE_TALK,
+	'Справка'                            => NS_HELP,
+	'Обсуждение_справки'                 => NS_HELP_TALK,
+	'Категория'                          => NS_CATEGORY,
+	'Обсуждение_категории'               => NS_CATEGORY_TALK,
+);
+
+// Remove Russian gender aliases
+$namespaceGenderAliases = array();
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ЭлячӀунрин кӀаникай цӀар чӀугун',
@@ -228,7 +262,7 @@ $messages = array(
 'pool-queuefull' => 'ТӀалабар кӀватзавайди ацӀа я',
 'pool-errorunknown' => 'Малумтушир гъалатӀ',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => ' {{SITENAME}}кай',
 'aboutpage' => 'Project:Гьакъиндай',
 'copyright' => 'Къене авайбур $1 жугъуриз жеда.',
@@ -238,7 +272,6 @@ $messages = array(
 'disclaimers' => 'Жавабдарвал хивяй акъудун',
 'disclaimerpage' => 'Project:Жавабдарвал хивяй акъудун',
 'edithelp' => 'Дуьзар хъувун патал куьмек',
-'edithelppage' => 'Help:Дуьзар хъувун',
 'helppage' => 'Help:Къене авайбур',
 'mainpage' => 'Кьилин ччин',
 'mainpage-description' => 'Кьилин ччин',
@@ -550,7 +583,6 @@ $messages = array(
 'searchmenu-legend' => 'Жагъурунин низамарунар',
 'searchmenu-exists' => "'''И вики-проектда \"[[:\$1]]\" тlвар алай ччин ава.'''",
 'searchmenu-new' => "'''И вики-проектда \"[[:\$1]]\" ччин туькlуьрун !'''",
-'searchhelp-url' => 'Help:КЪене авайбур',
 'searchprofile-articles' => 'Асул ччинар',
 'searchprofile-project' => 'Куьмек гунин ва проектдин ччинар',
 'searchprofile-images' => 'Мультимедиа',
@@ -585,14 +617,6 @@ $messages = array(
 'powersearch-toggleall' => 'Вири',
 'powersearch-togglenone' => 'Садни',
 
-# Quickbar
-'qbsettings' => 'КЪекъуьнрин панел',
-'qbsettings-none' => 'Садни',
-'qbsettings-fixedleft' => 'Чапла патахъай юзан тийир',
-'qbsettings-fixedright' => 'ЭрчIи патахъай юзан тийир',
-'qbsettings-floatingleft' => 'Чапла патаз алгъурзава',
-'qbsettings-floatingright' => 'ЭрчIи патаз алгъурзава',
-
 # Preferences page
 'preferences' => 'Туькlуьрун',
 'mypreferences' => 'Зи низамарунар',
@@ -620,7 +644,6 @@ $messages = array(
 'resetprefs' => 'Хуьн тавунвай дегишвилер алудун',
 'restoreprefs' => 'Авайл хьиз кьунвай низамарунар туькIуьр хъувун',
 'prefs-editing' => 'Дуьзар хъувун',
-'prefs-edit-boxsize' => 'Дуьзар хъувунин дакIардин кьадар',
 'rows' => 'ЦIарар',
 'columns' => 'Гулар:',
 'searchresultshead' => 'Ахтармишун',
@@ -750,7 +773,6 @@ $messages = array(
 'recentchangeslinked-feed' => 'Галкlанвай дуьзар хъувунар',
 'recentchangeslinked-toolbox' => 'Галкlанвай масакIавилер',
 'recentchangeslinked-title' => '"$1" галаз галкlанавай масакIавилер',
-'recentchangeslinked-noresult' => 'Ганвай чlава галкlанавай ччинра са масакIавални хьанвайд туш',
 'recentchangeslinked-summary' => 'Им къалурай ччиниз (ва я къалурай категориядиз гьатзавай ччинриз) элячӀзавай ччинра мукьвара хьайи масакӀавилерин сиягь я. Куь [[Special:Watchlist|вилив хуьнин сиягь диз]] гьатзавай ччинар яцӀу шрифтдал къалурнава.',
 'recentchangeslinked-page' => 'Ччинин тlвар:',
 'recentchangeslinked-to' => 'Аксина, къалурай ччиниз элячlзавай ччинра масакIавилер къалура',
@@ -863,8 +885,6 @@ $messages = array(
 'statistics-views-total' => 'Вири килигунар',
 'statistics-users-active' => 'Актив уртахар',
 
-'disambiguationspage' => 'Template:гзафманавал',
-
 'brokenredirects-edit' => 'дегишарун',
 'brokenredirects-delete' => 'алудун',
 
@@ -1228,7 +1248,7 @@ Cиягьда авай анжах (* лишандихъ галаз эгечIза
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Гьяркьуь',
 'exif-planarconfiguration' => 'Ганайбур тешкил авун',
 'exif-ycbcrsubsampling' => ' Y  ва C компонентрин кьадаррин нисбет',
diff --git a/languages/messages/MessagesLfn.php b/languages/messages/MessagesLfn.php
index d7138b2f..f0384324 100644
--- a/languages/messages/MessagesLfn.php
+++ b/languages/messages/MessagesLfn.php
@@ -63,7 +63,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Descovre la me adirije de eposta en postas de nota',
 'tog-shownumberswatching' => 'Mostra la numero de usores oservante',
 'tog-fancysig' => 'Sinias simple (sin lia automatica)',
-'tog-externaleditor' => 'Usa costumal editadores esterna',
 'tog-watchlisthideown' => 'Asconde me editas de la lista de pajes oservada',
 'tog-watchlisthidebots' => 'Asconde editas par bot de la lista de pajes oservada',
 'tog-watchlisthideminor' => 'Asconde editas minor de la lista de pajes oservada',
@@ -142,7 +141,7 @@ $messages = array(
 'cancel' => 'Cansela',
 'moredotdotdot' => 'Plu...',
 'mypage' => 'Me paje',
-'mytalk' => 'Me discutes',
+'mytalk' => 'Discutes',
 'anontalk' => 'Discutes per esta IP',
 'navigation' => 'Naviga',
 'and' => '&#32;e',
@@ -208,7 +207,7 @@ $messages = array(
 'jumptonavigation' => 'naviga',
 'jumptosearch' => 'xerca',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Supra {{SITENAME}}',
 'aboutpage' => 'Project:Supra',
 'copyrightpage' => '{{ns:project}}:Diretos de autor',
@@ -217,7 +216,6 @@ $messages = array(
 'disclaimers' => 'Negas de respondablia',
 'disclaimerpage' => 'Project:Nega jeneral de respondablia',
 'edithelp' => 'Aida con edita',
-'edithelppage' => 'Help:Edita',
 'helppage' => 'Help:Contenis',
 'mainpage' => 'Paje Prima',
 'mainpage-description' => 'Paje Prima',
@@ -437,7 +435,6 @@ La arcivo de sutraes per esta paje es asi per conveni:",
 'prevn' => '{{PLURAL:$1|$1}} presedente',
 'nextn' => '{{PLURAL:$1|$1}} seguente',
 'viewprevnext' => 'Vide ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Contenis',
 'search-result-size' => '$1 ({{PLURAL:$2|1 parola|$2 parolas}})',
 'search-section' => '(sesion $1)',
 'search-interwiki-default' => 'Resultas de $1:',
@@ -447,7 +444,7 @@ La arcivo de sutraes per esta paje es asi per conveni:",
 
 # Preferences page
 'preferences' => 'Preferis',
-'mypreferences' => 'Me preferis',
+'mypreferences' => 'Preferis',
 'skin-preview' => 'Previde',
 'saveprefs' => 'Fisa',
 'rows' => 'Linias:',
@@ -476,6 +473,7 @@ La arcivo de sutraes per esta paje es asi per conveni:",
 'gender-female' => 'Fema',
 'email' => 'Eposta',
 'prefs-help-realname' => 'Tu nom vera no es obligada, ma si tu vole dona tu nom vera, el va es usada per onora tu per tu labora.',
+'prefs-signature' => 'Suscrive',
 
 # User rights
 'userrights' => 'Dirije de la diretos de usores',
@@ -521,7 +519,7 @@ La arcivo de sutraes per esta paje es asi per conveni:",
 'newpageletter' => 'N',
 'boteditletter' => 'b',
 'rc_categories_any' => 'Cualce',
-'rc-enhanced-expand' => 'Mostra detalias (JavaScript es nesesada)',
+'rc-enhanced-expand' => 'Mostra detalias',
 'rc-enhanced-hide' => 'Asconde detalias',
 
 # Recent changes linked
@@ -529,7 +527,6 @@ La arcivo de sutraes per esta paje es asi per conveni:",
 'recentchangeslinked-feed' => 'Cambias relateda',
 'recentchangeslinked-toolbox' => 'Cambias relateda',
 'recentchangeslinked-title' => 'Cambias relatada a "$1"',
-'recentchangeslinked-noresult' => 'No cambias de pajes liada entre esta periodo.',
 'recentchangeslinked-summary' => "Esta lista conteni la cambias plu resente de la pajes liada a otra (o de la membros de un categoria).
 Pajes a [[Special:Watchlist|tu lista de pajes oservada]] es en leteras '''forte'''.",
 'recentchangeslinked-page' => 'Nom de la paje:',
@@ -558,7 +555,7 @@ Pajes a [[Special:Watchlist|tu lista de pajes oservada]] es en leteras '''forte'
 'filehist-dimensions' => 'Mesuras',
 'filehist-filesize' => 'Grandia de fix',
 'filehist-comment' => 'Comenta',
-'imagelinks' => 'Lias de fix',
+'imagelinks' => 'Usas de fix',
 'linkstoimage' => 'Esta {{PLURAL:$1|paje|pajes}} lia a esta fix:',
 'nolinkstoimage' => 'Es no pajes ce lia a esta fix.',
 'sharedupload' => 'Esta fix es parte de $1 e pote es usada par otra projetas.',
@@ -582,8 +579,6 @@ Pajes a [[Special:Watchlist|tu lista de pajes oservada]] es en leteras '''forte'
 # Statistics
 'statistics' => 'Statisticas',
 
-'disambiguations' => 'Pajes desambiguinte',
-
 'doubleredirects' => 'Redirijes duple',
 
 'brokenredirects' => 'Redirijes rompeda',
@@ -669,7 +664,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 # Watchlist
 'watchlist' => 'Pajes oservada',
-'mywatchlist' => 'Me lista de pajes oservada',
+'mywatchlist' => 'Lista de pajes oservada',
 'nowatchlist' => 'Tu ave no cosas en tu lista oservada',
 'addedwatchtext' => "La paje \"[[:\$1]]\" ia es juntada a tu [[Special:Watchlist|lista de pajes oservada]].
 Cambias future a esta paje e se paje de discutes va es listada ala, e la paje va apera en leteras '''forte''' en la [[Special:RecentChanges|lista de cambias resente]] per es plu fasil oservada.
@@ -930,7 +925,7 @@ Si la fix ia es cambiada de se stato orijinal, alga detalias pote no es clara en
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-exposuretime-format' => '$1 sec. ($2)',
 
 # External editor support
@@ -954,9 +949,6 @@ Si la fix ia es cambiada de se stato orijinal, alga detalias pote no es clara en
 'version' => 'Varia',
 'version-version' => '(Varia $1)',
 
-# Special:FilePath
-'filepath-page' => 'Fix:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Xerca',
 
diff --git a/languages/messages/MessagesLg.php b/languages/messages/MessagesLg.php
index d951f6e5..da02d48a 100644
--- a/languages/messages/MessagesLg.php
+++ b/languages/messages/MessagesLg.php
@@ -41,9 +41,6 @@ $messages = array(
 'tog-shownumberswatching' => "Ndaganga obungi bw'abagoberera olupapula",
 'tog-oldsig' => 'Omukono gwo kakano:',
 'tog-fancysig' => 'Omukono gubemu obubonero bwa ki-wiki (naye nga tegufuuka nyunzi)',
-'tog-externaleditor' => 'Wandikisanga puloguramu eri ku kompyuta yo (kyetaagisa bumanyirivu bungi, kubanga wetaaga okutegeka kompyuta yo mu ngeri ezitali za bulijjo. [//www.mediawiki.org/wiki/Manual:External_editors Okutangaaza okusingawo.])',
-'tog-externaldiff' => "Kozesanga puloguramu ey'oku kompyuta yo okukebera njawulo wakati w'ebiwandike (kyetaagisa bumanyirivu bungi, wetaaga ntegeka ezitali za bulijjo ku kompyuta yo. [//www.mediawiki.org/wiki/Manual:External_editors Okutangaaza okusingawo.])",
-'tog-showjumplinks' => 'Wabeerewo enyunzi eza "Genda ku"',
 'tog-uselivepreview' => 'Enkyukakyuka ze nkoze zirabikirewo nga tekyetaagisiza kumala kunyiga ppeesa (kyetaagisa JavaScript)(Kikyagezesebwa)',
 'tog-forceeditsummary' => 'Ŋambaako bwe mba ŋenda okuleka nga sinnyonyodde bye nkyusizza',
 'tog-watchlisthideown' => "Nze bye nkyusizza bireme okulabikira mu lukalala lw'empapula ze ngoberera",
@@ -239,7 +236,7 @@ $1",
 'pool-queuefull' => "Olukalala lw'emirimu egirinda okukolebwako lujjudde",
 'pool-errorunknown' => 'Ekireesewo kiremya tekitegeerese',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Okutangaaza ku {{SITENAME}}',
 'aboutpage' => 'Project:Okutangaaza ku',
 'copyright' => 'Ebiri kuno bifugibwa $1.',
@@ -249,7 +246,6 @@ $1",
 'disclaimers' => "Okutangaaza ku kkomo ery'obuvunaaniro bwaffe obw'omu mateeka",
 'disclaimerpage' => "Project:Okutangaaza ku kkomo ery'obuvunaaniro bwaffe obw'omu mateeka",
 'edithelp' => 'Nyamba',
-'edithelppage' => "Help:Obuyambi ku by'okukyusakyusa",
 'helppage' => 'Help:Endagiriro',
 'mainpage' => 'Olupapula Olusooka',
 'mainpage-description' => 'Olupapula Olusooka',
@@ -321,17 +317,6 @@ Ku lupapula "[[Special:SpecialPages|{{int:specialpages}}]]" kuliko olukalala lw\
 # General errors
 'error' => 'Kiremya',
 'databaseerror' => 'Waliwo kiremya ku ggwanika lya data',
-'dberrortext' => 'Waliwo kiremya avudde ku mpandika y\'ekiragiro ekinoonyeza mu ggwanika lya data.<br />
-Ayinza okuba nga azze lwa nsobi mu sofutiweya wa lyo.<br />
-Ekiragiro ekinoonyeza mu ggwanika lya data ekisembye okuyisibwa kiri:<br />
-<blockquote><tt>$1</tt></blockquote>
-ekisangibwa mu mukolo gwa puloguramu "<tt>$2</tt>".<br />
-Obubaka obuvudde mu ggwanika lya data obufa ku kiremya buli "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Waliwo kiremya avudde ku mpandika y\'ekiragiro ekinoonyeza mu ggwanika lya data.<br />
-Ekiragiro ekinoonyeza mu ggwanika lya data ekisembye okuyisibwa kiri:<br />
-"$1" <br />
-ekisangibwa mu mukolo gwa mu puloguramu "$2".<br />
-Obubaka obuvudde mu ggwanika lya data obufa ku kiremya buli "$3: $4"',
 'laggedslavemode' => "'''Kulabula:''' Olupapula luyinza obutabaamu ebyakalukyusibwamu.",
 'readonly' => 'Eggwanika lya data terikkiriza kulikyusamu',
 'enterlockreason' => "Wandikawo ensonga esibizza eggwanika lya data, nga olaga ddi lw'olisuubira okusumululwa",
@@ -384,7 +369,6 @@ Lindako eddakiika entonotono oly'oke oddemu okugezako ekikolwa.",
 Luliko ebikugizo ebirugaana okwonooebwa.",
 'editinginterface' => "'''Kulabula:''' Okyusa olupapula sofutiweya kw'egya ebigambo byayo.
 Enkyukakyuka z'okola wano zigyakubaako kye zikola ku ngeri abantu gye bakozesaamu enfo eno.",
-'sqlhidden' => '(Waliwo wo ebya SQL ebibikkidwa)',
 'cascadeprotected' => 'Olupapula luno lulandideko ekikugizo ekirugaana okukyusibwako ekisibuka ku {{PLURAL:$1|lunnaalwo luno olulukozesa|zinnalwo zino ezirukozesa}}:<br />
 $2',
 'namespaceprotected' => "Tolina buyinza bwa kukyusa ku mpapula ez'omu kkuŋaanizo erya '''$1'''.",
@@ -406,7 +390,6 @@ Wekkaanye, empapula ezimu ziyinza okukweyolekera nga bwe zibadde nga oyingidde -
 'yourpassword' => 'Ekigambo ekikuumi',
 'yourpasswordagain' => 'Ddamu ekigambo ekikuumi',
 'remembermypassword' => 'Tereka ekigambo kyange ekikuumi ku kompyuta eno (okumala {{PLURAL:$1|olunaku|ennaku ezitasukka mu}} $1)',
-'securelogin-stick-https' => "Sigala ku mukutu gwa kika kya HTTPS ng'omaze okuyingira",
 'yourdomainname' => 'Linnya lya twale lya kayungirizi lyo:',
 'externaldberror' => "Waliwo kiremya mu ggwanika lya data ekozesebwa okukakasa bamemba oba tokkirizibwa okukyusa ku akawunti yo ey'awalala.",
 'login' => 'Yingira',
@@ -511,7 +494,7 @@ Okuyingirira ddala, wetaaga okuwandika wano ekinaaba ekyama kyo ekya ddala:",
 'newpassword' => 'Ekigambo ekikuumi ekipya:',
 'retypenew' => 'Ddamu ekikagambo ekikuumi ekipya ekyo:',
 'resetpass_submit' => 'Kaza ekyama oyingire',
-'resetpass_success' => 'Ekigambo kyo ekikuumi kikyusidwa!<br />
+'changepassword-success' => 'Ekigambo kyo ekikuumi kikyusidwa!<br />
 Kati oyingira...',
 'resetpass_forbidden' => 'Tekikkirizibwa okukyusa ebigambo ebikuumi',
 'resetpass-no-info' => 'Okukola ku lupapula luno obutereevu, wetaaga okuba nga oyingidde sisitemu.',
@@ -523,10 +506,8 @@ Oyinz'okuba nga wamaze okutegeka ekya ddala ekipya oba nga wakasabayo eky'ekisee
 
 # Special:PasswordReset
 'passwordreset' => 'Damu okutegeka ekyama',
-'passwordreset-text' => "Oba oyagala okufuna 'email' ekujjukiza ebikwata ku akawunti yo, jjuza foomu eno.",
 'passwordreset-legend' => 'Damu okutegeka ekyama',
 'passwordreset-disabled' => "Eby'okuddamu okutegeka ebyama biymirizidwa ku wiki eno.",
-'passwordreset-pretext' => '{{PLURAL:$1||Wandika wo kimu ku ebiri mu lukalala}}',
 'passwordreset-username' => "Ery'obwa memba:",
 'passwordreset-email' => "Endagiriro eya 'email':",
 'passwordreset-emailtitle' => "Ebya akawunti ey'oku {{SITENAME}}",
@@ -750,6 +731,9 @@ Kirabika lwagyibwawo.',
 'edit-no-change' => "Sisitemu ekubaze nga atalina ky'agikozeko, olw'okubanga ebiri ku lupapula obirese nga bwe wabisanze.",
 'edit-already-exists' => "Olupapula lw'ogeza okukolawo weruli, lwakolebwawo dda.<br />
 Tekisobose kuddamu n'ate oulukolawo.",
+'editwarning-warning' => 'Bw\'ova ku lupapula luno kiyinza okuleetera enkyukakyuka z\'olukozeko okuvawo.<br />
+Bw\'oba nga okola oyingidde mu sisitemu, okulabula kuno oyinza okukusirisa nga weyambisa<br />
+ebiri mu kitundu ekya "Kukyusa" eky\'omu "Nteekateeka yange".',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Kulabula:''' Olupapula luno luliko ebiragiro eby'ekikebera engoberera y'amateeka g'empandika ebizito ebiyitiridde obungi.<br />
@@ -824,7 +808,6 @@ oba ku gano agali ku lupapula luno.<br />
 'searchmenu-legend' => 'Kyusamu ennoonya',
 'searchmenu-exists' => "'''Olupapula \"[[:\$1]]\" gyeruli ku wiki eno.'''",
 'searchmenu-new' => "'''Oba oyagala, olupapula \"[[:\$1]]\" gwe osobola okulukolawo ku wiki eno.'''",
-'searchhelp-url' => 'Help:Endagiriro',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Kebera mu mpapula eziriko akatandikwa kano]]',
 'searchprofile-articles' => "Empapula ez'ensonga",
 'searchprofile-project' => "Empapula eziriko obuyambi n'eza Kawefube",
@@ -937,7 +920,6 @@ W'owandikira by'onoonya bw'osoosawo akagambo ''all:'', okunoonya kubuna Wikipedi
 'recentchangeslinked-feed' => 'Ebikyusiddwa ebyekuusa ku lupapula luno',
 'recentchangeslinked-toolbox' => 'Ebikyusiddwa ebyekuusa ku lupapula luno',
 'recentchangeslinked-title' => 'Enkyukakyuka ezikwatagana ne "$1"',
-'recentchangeslinked-noresult' => 'Empapula eziriko enyunzi tewali lukyuse mu kiseera kino.',
 'recentchangeslinked-summary' => "Olulpapula olw'enjawulo luno luliko olukalala lw'ebikyuse ku mpapula eziriko enyunzi ezigguka ku lw'obadde otunuulira. Ebiwandikidwa mu '''nukuta enziggumivu''' biri ku [[Special:Watchlist|mpapula z'ogoberera]].",
 'recentchangeslinked-page' => 'Lupapula:',
 'recentchangeslinked-to' => "Nonamu eby'empapula ezikuggusa ku luno zokka",
diff --git a/languages/messages/MessagesLi.php b/languages/messages/MessagesLi.php
index 6d074480..44efb2f0 100644
--- a/languages/messages/MessagesLi.php
+++ b/languages/messages/MessagesLi.php
@@ -187,9 +187,6 @@ $messages = array(
 'tog-shownumberswatching' => "'t Aantal gebroekers tuine die dees pagina volg",
 'tog-oldsig' => 'Bestaonde ongerteikening:',
 'tog-fancysig' => 'Es wikiteks behanjele (zonder autematische verwiezing)',
-'tog-externaleditor' => "Sjtanderd 'ne externe teksbewirker gebroeke (inkel veur experts, speciaal instellinge zien nudig. [//www.mediawiki.org/wiki/Manual:External_editors Mie infermasie])",
-'tog-externaldiff' => "Sjtanderd 'n extern vergeliekingsprogramma gebroeke (inkel veur experts, speciaal instellinge zien nudig [//www.mediawiki.org/wiki/Manual:External_editors Mie infermasie])",
-'tog-showjumplinks' => '"gank nao"-toegankelikheidslinks mäögelik make',
 'tog-uselivepreview' => '"live veurbesjouwing" gebroeke (vereis JavaScript - experimenteel)',
 'tog-forceeditsummary' => "'n Melding gaeve bie 'n laeg samevatting",
 'tog-watchlisthideown' => 'Eige bewirkinge verberge op mien volglies',
@@ -202,6 +199,7 @@ $messages = array(
 'tog-diffonly' => 'Pagina-inhaud zónger verangeringe neet tuine',
 'tog-showhiddencats' => 'Verbórge categorië tuine',
 'tog-norollbackdiff' => 'Wieziginge eweglaote nao trökdrieje',
+'tog-useeditwarning' => "Waorssjoew mich es ich 'n bewerkdje pagina die nag neet is opgeslage wil verlaote",
 
 'underline-always' => 'Altied',
 'underline-never' => 'Noets',
@@ -387,7 +385,7 @@ $1',
 'pool-queuefull' => 'De wachrie van de pool is vól',
 'pool-errorunknown' => 'Ónbekènde fout',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Euver {{SITENAME}}',
 'aboutpage' => 'Project:Info',
 'copyright' => 'De inhawd is besjikbaar ónger de $1.',
@@ -397,7 +395,6 @@ $1',
 'disclaimers' => 'Aafwiezinge aansjprakelikheid',
 'disclaimerpage' => 'Project:Algemein aafwiezing aansjprakelikheid',
 'edithelp' => 'Hulp bie bewirke',
-'edithelppage' => 'Help:Instructies',
 'helppage' => 'Help:Help',
 'mainpage' => 'Veurblaad',
 'mainpage-description' => 'Veurblaad',
@@ -470,17 +467,6 @@ Mäögelik höbs te 'n typefout gemaak in de URL, of 'n verkierde verwiezing gev
 # General errors
 'error' => 'Fout',
 'databaseerror' => 'Databasefout',
-'dberrortext' => 'Bie \'t zeuke is \'n syntaxfout in de database opgetraoje.
-Dit kan zien veroorzaak door \'n fout in de software.
-De lètste zeukpoging in de database waor:
-<blockquote><tt>$1</tt></blockquote>
-vanoet de functie "<tt>$2</tt>".
-Database gaof de foutmelding "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Dao is \'n syntaxfout opgetreje bie \'t zeuke in de database.
-De lèste opgevraogde zeukactie waor:
-"$1"
-vanoet de functie "$2".
-Database brach fout "$3" nao veure: "$4"',
 'laggedslavemode' => 'Waarsjoewing: de pagina kin verauwerd zien.',
 'readonly' => 'Database geblokkeerd',
 'enterlockreason' => "Gaef 'n rae veur de blokkering en wie lank 't dinkelik zal dore. De ingegaeve rae zal aan de gebroekers getuind waere.",
@@ -532,7 +518,6 @@ Query: $2',
 'viewyourtext' => 'Doe kans "dien bewèrkinge" ane brónteks van dees pagina bekieke en euverkopiëre:',
 'protectedinterface' => 'Deze pagina bevat teks veur berichte van de software en is beveilig om misbroek te veurkomme.',
 'editinginterface' => "'''Waarsjoewing:''' Doe bewirks 'n pagina die gebroek waert door de software. Bewirkinge op dees pagina beïnvlode de gebroekersinterface van jederein. Euverwaeg veur euverzèttinge [//translatewiki.net/wiki/Main_Page?setlang=li translatewiki.net] te gebroeke, 't euverzèttingssprojek veur MediaWiki.",
-'sqlhidden' => '(SQL query verborge)',
 'cascadeprotected' => "Deze pagina kin neet bewirk waere, omdet zie is opgenome in de volgende {{PLURAL:$1|pagina|pagina's}} die beveilig {{PLURAL:$1|is|zeen}} mèt de kaskaad-optie:
 $2",
 'namespaceprotected' => "Doe höbs gein rechte om pagina's in de naamruumde '''$1''' te bewirke.",
@@ -563,7 +548,6 @@ Mäögelik waert nog 'n deil pagina's getuind esofs te nog aangemeld bis pès te
 'yourpassword' => 'Die wachwaord',
 'yourpasswordagain' => 'Wachwaord opnuuj intype',
 'remembermypassword' => 'Mien wachwaord onthouwe veur later sessies (hoegstens $1 {{PLURAL:$1|daag|daag}})',
-'securelogin-stick-https' => 'Verbónje blieve via HTTPS nao aanmelle',
 'yourdomainname' => 'Die domein',
 'externaldberror' => "d'r Is 'n fout opgetraoje biej 't aanmelje biej de database of doe höbs gén toesjtömming diene externe gebroeker biej te wèrke.",
 'login' => 'Aanmèlde',
@@ -657,7 +641,7 @@ Doe mós effe wachte ierdets te 't obbenuuts kens perbere.",
 'newpassword' => 'Nuuj wachwaord',
 'retypenew' => "Veur 't nuuj wachwaord nogins in",
 'resetpass_submit' => 'Wachwaord instelle en aanmelje',
-'resetpass_success' => 'Dien wachwaord is verangerd. Bezig mèt aanmelje...',
+'changepassword-success' => 'Dien wachwaord is verangerd. Bezig mèt aanmelje...',
 'resetpass_forbidden' => 'Wachwäörd kónne neet verangerd waere',
 'resetpass-no-info' => 'Doe moos aangemeld zien ierdets doe dees pagina gebroeke kens.',
 'resetpass-submit-loggedin' => 'Wachwaord wiezige',
@@ -668,10 +652,8 @@ Meugelik höbs doe dien wachwaord al gewiezig of 'n nuuj tiedelik wachwaord aang
 
 # Special:PasswordReset
 'passwordreset' => 'Wachwaord obbenuuts insjtèlle',
-'passwordreset-text' => "Völ dit form aan zodet weer dich 'ne mail kinne sjikk mit dien gebroekersgegaeves.",
 'passwordreset-legend' => 'Wachwaord obbenuuts insjtèlle',
 'passwordreset-disabled' => "'t Is hie neet meugelik óm die wachwaord óbbenuits in te sjtelle.",
-'passwordreset-pretext' => '{{PLURAL:$1||Veur ei van de vèljer hieónger in}}',
 'passwordreset-username' => 'Gebroekersnaam:',
 'passwordreset-domain' => 'Domein:',
 'passwordreset-capture' => 'Bekiek de resulterenden e-mail?',
@@ -892,6 +874,8 @@ Ze lik eweggesjaf te zien.',
 'edit-already-exists' => 'De pagina is neet aangemaak.
 Zie besjteit al.',
 'defaultmessagetext' => 'Obligaten teks',
+'editwarning-warning' => "Es se dees pagina verleets verluus se meugelik wieziginge die se haes gemaak.
+Es se bös aangemeld, kins se dees waorsjoewing oetzètten in 't bewerkingstabblaad in dien veurkäöre.",
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Waarschuwing:''' dees pagina gebroek te väöl kosbare parserfuncties.
@@ -1121,7 +1105,6 @@ Wees zeker det deze wieziging de gesjiedenisdoorloupendheid van de pagina zal be
 'searchmenu-legend' => 'Zeukopties',
 'searchmenu-exists' => "* Pagina '''[[$1]]'''",
 'searchmenu-new' => "'''De pagina \"[[:\$1]]\" aanmake op deze wiki'''",
-'searchhelp-url' => 'Help:Help',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Paginanaome mit dit veurveugsel weergaeve]]',
 'searchprofile-articles' => "Inhaudelike pagina's",
 'searchprofile-project' => "Help- en projekpagina's",
@@ -1167,15 +1150,6 @@ Doe kans ouch 'n naamruumde es veurvoegsel gebroeke.",
 Zoelang as de servers nog neet sjterk genog zunt kins e zeuke bie Google.
 Mèrk op dat hun indexe van {{SITENAME}} content e bietje gedatierd kint zien.',
 
-# Quickbar
-'qbsettings' => 'Menubalkinsjtèllinge',
-'qbsettings-none' => 'Oetgesjakeld',
-'qbsettings-fixedleft' => 'Links vas',
-'qbsettings-fixedright' => 'Rechts vas',
-'qbsettings-floatingleft' => 'Links zjwevend',
-'qbsettings-floatingright' => 'Rechs zjwevend',
-'qbsettings-directionality' => 'Vas, aafhenkelik vanne sjrifrichting van dien sjpraok',
-
 # Preferences page
 'preferences' => 'Veurkäöre',
 'mypreferences' => 'Mien veurkäöre',
@@ -1208,7 +1182,6 @@ Mèrk op dat hun indexe van {{SITENAME}} content e bietje gedatierd kint zien.',
 'resetprefs' => 'Sjtandaardveurkäöre hersjtèlle',
 'restoreprefs' => 'Terug nao standaardinstellinge',
 'prefs-editing' => 'Aafmeitinge tèksveld',
-'prefs-edit-boxsize' => "Aafmetinge van 't bewirkingsvinster.",
 'rows' => 'Regels',
 'columns' => 'Kolomme',
 'searchresultshead' => 'Insjtèllinge veur zeukresultate',
@@ -1219,9 +1192,6 @@ Mèrk op dat hun indexe van {{SITENAME}} content e bietje gedatierd kint zien.',
 'recentchangesdays-max' => '(maximaal $1 {{PLURAL:$1|daag|daag}})',
 'recentchangescount' => 'Standerd aantal waer te gaeve bewèrkinge:',
 'prefs-help-recentchangescount' => "Dit gelt veur recente wieziginge, paginagesjiedenis en logbookpagina's.",
-'prefs-help-watchlist-token' => 'Door hie ne geheime sleutel in te vulle wurt nen RSS-feed veur dien volglies aangemaak.
-Ederein dae deze sleutel kint kin dien volglies laeze, dus kees ne veilige sleutel.
-Hie volg n willekäörig gegenereerde waerde die se kins gebroeke: $1',
 'savedprefs' => 'Dien veurkäöre zint opgesjlage.',
 'timezonelegend' => 'Tiedzone:',
 'localtime' => 'Plaatselike tied',
@@ -1252,7 +1222,6 @@ Hie volg n willekäörig gegenereerde waerde die se kins gebroeke: $1',
 'prefs-reset-intro' => 'Gebroek dees functie om dien veurkäöre te herstelle nao de standaardinstellinge.
 Dees hanjeling kin neet ongedaon gemaak waere.',
 'prefs-emailconfirm-label' => 'E-mailbevestiging:',
-'prefs-textboxsize' => 'Aafmaetinge bewirkingssjerm',
 'youremail' => 'Dien e-mailadres',
 'username' => 'Gebroekersnaam:',
 'uid' => 'Gebroekersnómmer:',
@@ -1492,7 +1461,6 @@ Deze informatie is zichbaar veur angere gebroekers.',
 'recentchangeslinked-feed' => 'Volg links',
 'recentchangeslinked-toolbox' => 'Volg links',
 'recentchangeslinked-title' => 'Verangeringe verwant mit "$1"',
-'recentchangeslinked-noresult' => "d'r Zeen gein bewerkinge in de gegaeve periode gewaes op de pagina's die vanaaf hiej gelink waere.",
 'recentchangeslinked-summary' => "Dees speciaal pagina tuint de lètste bewirkinge op pagina's die gelink waere vanaaf deze pagina. Pagina's die op [[Special:Watchlist|dien volglies]] staon waere '''vet''' weergegaeve.",
 'recentchangeslinked-page' => 'Paginanaam:',
 'recentchangeslinked-to' => "Verangeringe weergaeve nao de gelinkde pagina's",
@@ -1715,7 +1683,6 @@ Om beveiligingsrede is img_auth.php oetgesjakeld.",
 'http-read-error' => 'HTTP-laezingsfout.',
 'http-timed-out' => 'HTTP-verzeuktimeout',
 'http-curl-error' => 'Óphaolingsfout URL: $1',
-'http-host-unreachable' => 'Kòs de URL neet bereike',
 'http-bad-status' => "d'r Is e perbleem ópgetraoje bie 't HTTP-verzeuk: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1860,12 +1827,6 @@ De [$2 pagina mit de besjtandjsbesjrieving] wurt hiejónger weergegaeve.',
 'statistics-users-active-desc' => "Gebroekers die in de aafgeloupe {{PLURAL:$1|daag|$1 daag}} 'ne hanjeling höbbe oetgevoerd",
 'statistics-mostpopular' => "Meisbekeke pazjena's",
 
-'disambiguations' => "Links nao verdudelikingspazjena's",
-'disambiguationspage' => 'Template:Verdudeliking',
-'disambiguations-text' => "Hiej onger staon pagina's die verwieze nao 'ne '''redirect'''.
-Deze heure waarsjienlik direct nao 't zjuste ongerwerp te verwiezen.<br />
-'ne pagina wörd gezeen es redirect wen d'r 'n sjabloon op stuit det gelink is vanaaf [[MediaWiki:Disambiguationspage]]",
-
 'doubleredirects' => 'Dobbel redirects',
 'doubleredirectstext' => "Dees lies haet paazjes mit redireks die nao anger redireks gaon.
 Op eder raegel vings te de ierste redirectpazjena, de twiede redirectpazjena en de iesjte raegel van de twiede redirectpazjena. Meistes bevat dees litste de pazjena woe de iesjte redirect naotoe zouw mótte verwieze.
@@ -2110,10 +2071,9 @@ Toekomstige verangeringe aan dees pagina en de biebehurende euverlèkpagina weur
 'unwatchthispage' => 'Neet mië volge',
 'notanarticle' => 'Is gein artikel',
 'notvisiblerev' => 'Bewèrking is verwiederd',
-'watchnochange' => 'Gein van dien gevolgde items is aangepas in dees periode.',
 'watchlist-details' => "D'r {{PLURAL:$1|sjteit ein pagina|sjtaon $1 pagina's}} op dien volglies mit oetzunjering van de euverlèkpagina's.",
-'wlheader-enotif' => '* Doe wörs per e-mail gewaarsjuwd',
-'wlheader-showupdated' => "* Pazjena's die verangerd zeen saers doe ze veur 't lètste bekeeks sjtaon '''vet'''",
+'wlheader-enotif' => 'Doe wörs per e-mail gewaarsjuwd',
+'wlheader-showupdated' => "Pazjena's die verangerd zeen saers doe ze veur 't lètste bekeeks sjtaon '''vet'''",
 'watchmethod-recent' => "Controleer recènte verangere veur gevolgde pazjena's",
 'watchmethod-list' => "controlere van gevolgde pazjena's veur recènte verangeringe",
 'watchlistcontains' => "Dien volglies bevat $1 {{PLURAL:$1|pazjena|pazjena's}}.",
@@ -2490,11 +2450,8 @@ Wils se de instellinge wiezige?',
 'ipb_blocked_as_range' => "Fout: 't IP-adres $1 is neet direct geblokkeerd en de blokkade kan neet opgeheve waere. De blokkade is ongerdeil van de reeks $2, wovan de blokkade waal opgeheve kan waere.",
 'ip_range_invalid' => 'Ongeldige IP-reeks',
 'ip_range_toolarge' => 'Reeksblokkades groeater es /$1 kènne neet.',
-'blockme' => 'Blokkeer mich',
 'proxyblocker' => 'Proxyblokker',
-'proxyblocker-disabled' => 'Deze functie is oetgesjakeld.',
 'proxyblockreason' => "Dien IP-adres is geblokkeerd ómdat 't 'n aope proxy is. Contacteer estebleef diene internet service provider of technische óngersjteuning en informeer ze euver dit serjeus veiligheidsprebleem.",
-'proxyblocksuccess' => 'Klaor.',
 'sorbsreason' => 'Dien IP-adres is opgenaome in de DNS-blacklist es open proxyserver, dae {{SITENAME}} gebroek.',
 'sorbs_create_account_reason' => 'Dien IP-adres is opgenómme in de DNS-blacklist es open proxyserver, dae {{SITENAME}} gebroek. De kèns gein gebroekersaccount aanmake.',
 'cant-block-while-blocked' => 'De kins anger gebroekers neet blokkere terwiel se zelf geblokkeerd bös.',
@@ -2830,8 +2787,6 @@ Meistal wörd dit door 'ne zwarte externe link veroorzaak.",
 'pageinfo-authors' => 'Aantal versjillende sjrievers',
 
 # Skin names
-'skinname-standard' => 'Standaard',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Keuls blauw',
 
 # Patrolling
@@ -2930,7 +2885,7 @@ Alle volgende links die op dezelfde regel sjtaon, waere behanjeld es oetzunjerin
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breidte',
 'exif-imagelength' => 'Hoogte',
 'exif-bitspersample' => 'Bits per componènt',
@@ -3108,7 +3063,7 @@ Alle volgende links die op dezelfde regel sjtaon, waere behanjeld es oetzunjerin
 'exif-originalimageheight' => 'Heugdje vanne aafbeilding veur biesnieje',
 'exif-originalimagewidth' => 'Brèdje vanne aafbeilding veur biesnieje',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Óngecómprimeerd',
 'exif-compression-2' => 'CCITT Groep 3 1-dimensionale aangepasde "Huffman run length"-codering',
 'exif-compression-3' => 'CCITT Groep 3 faxcodering',
@@ -3495,7 +3450,6 @@ De kèns ouch [[Special:EditWatchlist|'t sjtanderd bewirkingssjirm gebroeke]].",
 'version-other' => 'Euverige',
 'version-mediahandlers' => 'Mediaverwerkers',
 'version-hooks' => 'Heuk',
-'version-extension-functions' => 'Oetbreijingsfuncties',
 'version-parser-extensiontags' => 'Parseroetbreijingstags',
 'version-parser-function-hooks' => 'Parserfunctieheuk',
 'version-hook-name' => 'Hooknaam',
@@ -3516,13 +3470,6 @@ Same mit dit programma heurs se 'n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van d
 'version-entrypoints-header-entrypoint' => 'Ingank',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Bestandjspaad',
-'filepath-page' => 'Bestandj:',
-'filepath-submit' => 'Zeuk',
-'filepath-summary' => "Dees speciaal pazjena guf 't vollejig paad veur 'n bestandj.
-Aafbeildinge waere in häör vollejige resolutie getoeandj. Anger bestandjstypes waere drèk in 't mit 't MIME-type verbónje programma geäöpendj.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Zeuk veur döbbelbestaondje bestenj',
 'fileduplicatesearch-summary' => 'Zeuk veur döbbel bestaondje bestenj op basis van zien hashwaarde.',
diff --git a/languages/messages/MessagesLij.php b/languages/messages/MessagesLij.php
index 8406aa58..2bd36f89 100644
--- a/languages/messages/MessagesLij.php
+++ b/languages/messages/MessagesLij.php
@@ -155,7 +155,6 @@ $messages = array(
 'tog-shownumberswatching' => "Mostra o numero di utenti che tegnan d'oeuggio sta pagina",
 'tog-oldsig' => 'Firma attuale:',
 'tog-fancysig' => 'Tratta a firma comme wikitesto (sensa un collegamento aotomatico)',
-'tog-showjumplinks' => 'Attiva i collegamenti d\'accescibilitæ "sata a"',
 'tog-uselivepreview' => "Doeuvia l'anteprimma in diretta (ghe voeu o JavaScript)(sperimentâ)",
 'tog-watchlisthideown' => "Ascondi e mæ modiffiche da-a lista che tegno d'oeuggio",
 'tog-watchlisthidebots' => "Ascondi e modiffiche di bot da-a lista che tegno d'oeuggio",
@@ -167,6 +166,7 @@ $messages = array(
 'tog-diffonly' => 'No mostrâ o contegnuo da paggina sotta o confronto tra verscioin',
 'tog-showhiddencats' => 'Fa vedde e categorîe ascose',
 'tog-norollbackdiff' => "Ometti o confronto tra verscioin doppo ch'ho fæto o ripristino",
+'tog-useeditwarning' => "Avertime se lascio 'na paggina de modiffica sens'avei sarvou i cangi",
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Mâi',
@@ -225,6 +225,16 @@ $messages = array(
 'oct' => 'Öto',
 'nov' => 'Nov',
 'dec' => 'Dex',
+'january-date' => '$1 zenâ',
+'february-date' => '$1 frevâ',
+'march-date' => '$1 março',
+'april-date' => '$1 arvî',
+'may-date' => '$1 mazzo',
+'june-date' => '$1 zugno',
+'july-date' => '$1 luggio',
+'september-date' => '$1 setenbre',
+'october-date' => '$1 otobre',
+'december-date' => '$1 dexenbre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorîa|Categorîe}}',
@@ -304,6 +314,7 @@ $messages = array(
 'create-this-page' => "Crea 'sta paggina",
 'delete' => 'Scancella',
 'deletethispage' => "Scassa 'sta paggina",
+'undeletethispage' => 'Recuppera sta paggina',
 'undelete_short' => 'Recuppera {{PLURAL:$1|una revixon|$1 revixoin}}',
 'protect' => 'Protezi',
 'protect_change' => 'cangia',
@@ -344,7 +355,7 @@ Aspeta quarche menuto primma de çercâ torna d'accede a sta pagina.
 $1",
 'pool-errorunknown' => 'Aro sconosciuo',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Informaçioìn in sciô {{SITENAME}}',
 'aboutpage' => 'Project:Informaçioìn',
 'copyright' => 'O contegnûo o se peu trovâ a $1.',
@@ -354,7 +365,6 @@ $1",
 'disclaimers' => 'Avertense',
 'disclaimerpage' => 'Project:Avertense generâli',
 'edithelp' => 'Agiùtto',
-'edithelppage' => 'Help:Modiffica',
 'helppage' => 'Help:Contegnûi',
 'mainpage' => 'Pàgina prinçipâ',
 'mainpage-description' => 'Pagina prinçipâ',
@@ -462,7 +472,11 @@ A raxon a l'è: ''$2''.",
 'yourname' => 'Nomme',
 'yourpassword' => 'Pòula segretta:',
 'yourpasswordagain' => 'Riscrivi a pòula segrétta:',
+'createacct-yourpasswordagain' => 'Conferma a password',
+'createacct-yourpasswordagain-ph' => "Conferma a password un'atra votta",
 'remembermypassword' => 'Aregòrda a mæ login in sto navegatô (pe in mascimo de $1 {{PLURAL:$1|giórno|giórni}})',
+'userlogin-remembermypassword' => 'Mantegnime collegou',
+'userlogin-signwithsecure' => 'Adoeuvia una conescion segua',
 'yourdomainname' => 'Indirisso do scito:',
 'password-change-forbidden' => 'No ti peu cangiâ poula segretta in questa wiki.',
 'login' => 'Intra',
@@ -479,12 +493,21 @@ A raxon a l'è: ''$2''.",
 'gotaccount' => "Ti ghe l'æ za 'n' utensa? '''$1'''.",
 'gotaccountlink' => 'Intra',
 'userlogin-resetlink' => "T'æ ascordòu i teu dæti de acesso?",
+'userlogin-resetpassword-link' => 'Reimposta a to password',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Agiutto co-o login]]',
+'createacct-join' => 'Inserisci i to dæti chi sotta.',
 'createaccountmail' => "Doeuvia una password temporanea abrettio e mandila a l'adresso de posta elettronica speçificou",
 'createaccountreason' => 'Raxon:',
+'createacct-imgcaptcha-ph' => "Scrivi quello che ti veddi de d'ato",
+'createacct-submit' => 'Crea a to utensa',
+'createacct-another-submit' => "Crea un'atra utensa",
+'createacct-benefit-body2' => '{{PLURAL:$1|paggina|paggine}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contribuiou|contribuioei}}',
 'badretype' => "E paròlle d'ordine che t'hæ scrîo son despægie.",
 'userexists' => "O nomme ûtente inserîo o l'è za doeuviao.<br />
 Çernine 'n âtro.",
 'loginerror' => "Errô inte l'accesso",
+'createacct-error' => "Errô inta la creaçion de l'utença",
 'createaccounterror' => "Imposcibbile creâ l'account: $1",
 'noname' => "O nomme d'ûtente o l'è sballiòu.",
 'loginsuccesstitle' => 'Accesso effettuòu',
@@ -535,6 +558,7 @@ Pe abilitâ l'invîo de messaggi e-mail pe quest'accesso, o se deive seguî l'is
 'newpassword' => 'Neuva poula segretta',
 'retypenew' => "Ripette a nêuva paròlla d'ordine:",
 'resetpass_submit' => 'Çerni a poula segretta e intra',
+'changepassword-success' => "O cangio de password o l'é anæto ben!",
 'resetpass_forbidden' => "No l'é poscìbile cangiâ e paròlle segrétte",
 'resetpass-submit-loggedin' => 'Cangia a password',
 'resetpass-submit-cancel' => 'Anulla',
@@ -555,6 +579,9 @@ Poula segretta temporannia: $2',
 'changeemail-submit' => 'Cangia e-mail',
 'changeemail-cancel' => 'Annulla',
 
+# Special:ResetTokens
+'resettokens-token-label' => "$1 (oua o l'è: $2)",
+
 # Edit page toolbar
 'bold_sample' => 'Grascetto',
 'bold_tip' => 'Grascetto',
@@ -729,7 +756,6 @@ Legenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a ve
 'viewprevnext' => 'Veddi ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Inte questa wiki gh'è za 'na pàgina co-o nómme \"[[:\$1]]\"'''",
 'searchmenu-new' => 'Crea a pagina "[[:$1]]" insce questo scito',
-'searchhelp-url' => 'Help:Contegnûi',
 'searchprofile-articles' => 'Pàgina di contegnûi',
 'searchprofile-project' => 'Pàgine de agiùtto e relative a-o progetto',
 'searchprofile-images' => 'Moltimedia',
@@ -827,7 +853,6 @@ Legenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a ve
 'recentchangeslinked-feed' => 'Cangiamenti correlæ',
 'recentchangeslinked-toolbox' => 'Cangiaménti corelæ',
 'recentchangeslinked-title' => 'Modiffiche correlæ a "$1"',
-'recentchangeslinked-noresult' => 'Nisciûn cangiamento a-e paggine collegæ into periodo speçificòu.',
 'recentchangeslinked-summary' => "Sta pàgina a fa védde i cangiaménti ciù reçenti a-e pàgine colegæ a questa.
 E pàgine che t'æ in oservaçion inti [[Special:Watchlist|oservæ speciâli]] son in '''grascetto'''.",
 'recentchangeslinked-page' => 'Nómme da pàgina:',
@@ -906,9 +931,6 @@ Chì apreuvo ti peu védde a descriçión inta [$2 pàgina de descriçión do fi
 # Statistics
 'statistics' => 'Statistiche',
 
-'disambiguations' => 'Paggine de desambiguassion',
-'disambiguationspage' => 'Template:Omonimia',
-
 'doubleredirects' => 'Rindirissamenti doggi',
 
 'brokenredirects' => 'Rindirissamenti sballiæ',
@@ -1322,6 +1344,16 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 'ilsubmit' => 'Çerca',
 'bydate' => 'pe dâta',
 
+# Human-readable timestamps
+'monday-at' => 'Lunesdì a $1',
+'tuesday-at' => 'Matesdì a $1',
+'wednesday-at' => 'Mâcordì a $1',
+'thursday-at' => 'Zoeuggia a $1',
+'friday-at' => 'Venardì a $1',
+'saturday-at' => 'Sabbo a $1',
+'sunday-at' => 'Domenega a $1',
+'yesterday-at' => 'Vei a $1',
+
 # Bad image list
 'bad_image_list' => "O formato o l'è coscì:
 Van conscideræ sôlo e righe che comensan co-o càratere *.
@@ -1348,7 +1380,7 @@ I inganci sucescivi, in scia mæxima riga, van conscideræ comme eceçioìn (pag
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-datetime' => 'Data e öa do cangiamento do papê',
 'exif-artist' => 'Autô',
 'exif-copyright' => "Diritti d'autô de",
diff --git a/languages/messages/MessagesLiv.php b/languages/messages/MessagesLiv.php
index e99297ee..3c07476e 100644
--- a/languages/messages/MessagesLiv.php
+++ b/languages/messages/MessagesLiv.php
@@ -137,7 +137,7 @@ $messages = array(
 'jumptonavigation' => 'navigīerimiz kast',
 'jumptosearch' => 'Vȯtšõgid',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Iļ {{SITENAME}}',
 'aboutpage' => 'Project:Tītõl tieutõkst',
 'copyright' => 'Amā tekstõ um kȭlbatõmist litsents #$1 pierrõ',
@@ -147,7 +147,6 @@ $messages = array(
 'disclaimers' => 'Kūondõkst',
 'disclaimerpage' => 'Project:Kūondõkst',
 'edithelp' => 'Redigīerimiz opātõks',
-'edithelppage' => 'Help:Redigīerimiz_opātõks',
 'helppage' => 'Help:Sižāli',
 'mainpage' => 'Eḑḑilēḑ',
 'mainpage-description' => 'Eḑḑilēḑ',
@@ -416,7 +415,6 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
 'recentchangeslinked' => 'Sidtõd mõitõkst',
 'recentchangeslinked-toolbox' => 'Sidtõd mõitõkst',
 'recentchangeslinked-title' => '"$1" sidtõd mõitõkst',
-'recentchangeslinked-noresult' => 'Andtõd āigal äb ūo sidtõd lēḑis mõitõkši tīedõd.',
 'recentchangeslinked-summary' => "Täs um lugdõd andtõd līedstõ sidtõd (agā andtõd kategōrij) lēḑis tīedõd perrizt mõitõkst. Sin [[Special:Watchlist|iļ-vaņtlimiz.nimkēra]] lēḑõd ātõ  ' ' ' razzistiz ' ' ' jeddõ tūodõd.",
 'recentchangeslinked-page' => 'Līed nim:',
 'recentchangeslinked-to' => 'Nägţ sīe azmõl mõitõkši lēḑis, mis sīen līed pǟlõ sidābõd',
@@ -455,8 +453,6 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
 # Statistics
 'statistics' => 'Lug tīetõkst',
 
-'disambiguationspage' => 'Template:Jarā-seļţimiz-lēḑ',
-
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bait|baitõ}}',
 'nmembers' => '$1 {{PLURAL:$1|nõtkõm| nõtkõmḑi}}',
diff --git a/languages/messages/MessagesLmo.php b/languages/messages/MessagesLmo.php
index 2a4768fb..34b6dec5 100644
--- a/languages/messages/MessagesLmo.php
+++ b/languages/messages/MessagesLmo.php
@@ -133,8 +133,6 @@ süi titul dai sezziún (JavaScript)',
 'tog-enotifrevealaddr' => "Lassa vedè 'l mè indirizz e-mail int i messagg d'avis",
 'tog-oldsig' => 'Anteprima de la firma esistenta:',
 'tog-fancysig' => 'Trata la firma cume test wiki (senza nissön ligam utumatich)',
-'tog-externaleditor' => "Dröva semper un prugrama da redatazión estern (dumà per espert, 'l gh'ha de besogn d'impustazión speciaj ins 'l to computer)",
-'tog-externaldiff' => 'Druvá sempar un "diff" estèrnu',
 'tog-watchlisthideown' => "Sconda i me mudifich dai pagin che a ten d'ögg",
 'tog-watchlisthidebots' => "Sconda i mudifich di bot da i pagin che a ten d'ögg",
 'tog-ccmeonemails' => 'Spedissem una copia di messagg spedii a i alter druvadur',
@@ -315,7 +313,7 @@ Per piasè, specia un mument prima de pruà a vardà anmò quela pagina chì.
 
 $1",
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'A prupòsit de {{SITENAME}}',
 'aboutpage' => 'Project:A pruposit',
 'copyright' => "El cuntegnüü a l'è dispunibil sota a una licenza $1.",
@@ -325,7 +323,6 @@ $1",
 'disclaimers' => 'Disclaimers',
 'disclaimerpage' => 'Project:Avertenz generaj',
 'edithelp' => 'Manual de spiegazión',
-'edithelppage' => 'Help:Scriv un articul',
 'helppage' => 'Help:Contegnüü',
 'mainpage' => 'Pagina principala',
 'mainpage-description' => 'Pagina principala',
@@ -609,7 +606,6 @@ Per infurmazion, varda ind el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
 'viewprevnext' => 'Vidé ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Upzión de ricerca',
 'searchmenu-new' => "'''Trà in pee la pagina \"[[:\$1]]\" ins quel sit chì!'''",
-'searchhelp-url' => 'Help:Contegnüü',
 'searchprofile-articles' => 'Paginn de cuntegnüü',
 'searchprofile-project' => 'Paginn de jüt e de pruget',
 'searchprofile-images' => 'Multimedia',
@@ -866,8 +862,6 @@ La descrizión sura la sua [$2 pagina de descrizión del file] l'è mustrada ch
 'statistics-users-active' => 'Druvadur ativ',
 'statistics-users-active-desc' => "Druvadur che i hann faa un'azión int {{PLURAL:$1|l'ültem dì|i ültem $1 dì}}",
 
-'disambiguations' => 'Pagin da disambiguazziún',
-
 'doubleredirects' => 'Redirezziún dópi',
 
 'brokenredirects' => 'Redirezziún interótt',
@@ -963,7 +957,6 @@ i vegnarann segnalaa chichinscì e la pagina la se vedarà cun caràter '''grev'
 'watch' => "Tegn d'öcc",
 'watchthispage' => "Tegn d'ögg quela pagina chì",
 'unwatch' => "Tegn pü d'ögg",
-'watchnochange' => "Nissün cambiament l'è stai faa ins i pàginn che te tegn d'ögg ind 'l períud de temp indicaa.",
 'watchlist-details' => '{{PLURAL:$1|$1 pagina|$1 paginn}} tegnüü sot ögg, fö che i paginn de discüssión.',
 'wlshowlast' => 'Fa vidé i ültim $1 ur $2 dì $3',
 'watchlist-options' => "Upzión lista d'ussevazión",
@@ -1363,9 +1356,6 @@ Te riçevaree un mesacc cun deent un ligamm specjal; ti duvaree clicaa sül liga
 # Special:Version
 'version' => 'Versiun',
 
-# Special:FilePath
-'filepath' => 'Percuurz daj archivi',
-
 # Special:SpecialPages
 'specialpages' => 'Paginn special',
 
diff --git a/languages/messages/MessagesLn.php b/languages/messages/MessagesLn.php
index 87be9733..e29c4c07 100644
--- a/languages/messages/MessagesLn.php
+++ b/languages/messages/MessagesLn.php
@@ -377,9 +377,6 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'powersearch-toggleall' => 'Nyɔ́nsɔ',
 'powersearch-togglenone' => 'Mɔ́kɔ́ tɛ́',
 
-# Quickbar
-'qbsettings-none' => 'Mɔ́kɔ́ tɛ́',
-
 # Preferences page
 'preferences' => 'Malúli',
 'mypreferences' => 'Malúli ma ngáí',
@@ -703,7 +700,7 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 # Special:NewFiles
 'ilsubmit' => 'Boluki',
 
-# EXIF tags
+# Exif tags
 'exif-artist' => 'Mokeli',
 
 'exif-subjectdistancerange-2' => 'kokanga view',
diff --git a/languages/messages/MessagesLo.php b/languages/messages/MessagesLo.php
index 7ca5cdea..d7f8a6f3 100644
--- a/languages/messages/MessagesLo.php
+++ b/languages/messages/MessagesLo.php
@@ -122,8 +122,6 @@ $messages = array(
 'tog-enotifminoredits' => 'ສົ່ງ ອີເມລ ໃຫ້ຂ້ອຍ ເວລາມີການດັດແກ້ເລັກນ້ອຍນຳ',
 'tog-enotifrevealaddr' => 'ສະແດງ ອີເມລ ຂອງຂ້ອຍ ໃນ ການແຈ້ງວ່າມີຂໍ້ຄວາມອີເມລ',
 'tog-shownumberswatching' => 'ສະແດງ ຈຳນວນຜູ້ໃຊ້ ຕິດຕາມໝ້ານີ້',
-'tog-externaleditor' => 'ໃຊ້ ເອດິດເຕີທາງນອກ ຖ້າບໍ່ມີການຕັ້ງ',
-'tog-externaldiff' => 'ໃຊ້ ສ່ວນຕ່າງທາງນອກ ຖ້າບໍ່ມີ ການກຳໜົດ',
 'tog-forceeditsummary' => 'ເຕື່ອນຂ້ອຍ ຖ້າບໍ່ໄດ້ຂຽນຫຍັງໃສ່ ຊ່ອງ ສະຫຼຸບການດັດແກ້',
 'tog-watchlisthideown' => 'ເຊື່ອງ ການດັດແກ້ໂດຍຂ້ອຍ ໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ',
 'tog-watchlisthidebots' => 'ເຊື່ອງ ການດັດແກ້ ໂດຍ ບອທ໌ ໃນລາຍການຕິດຕາມຂອງຂ້ອຍ',
@@ -269,7 +267,7 @@ $messages = array(
 'jumptonavigation' => 'ນຳທິດ',
 'jumptosearch' => 'ຄົ້ນຫາ',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'ກ່ຽວກັບ{{SITENAME}}',
 'aboutpage' => 'Project:ກ່ຽວກັບ',
 'copyright' => 'ເນື້ອໃນ ສະໜອງໃຫ້ ພາຍໃຕ້ $1.',
@@ -279,7 +277,6 @@ $messages = array(
 'disclaimers' => 'ຂໍ້ປະຕິເສດຄວາມຮັບຜິດຊອບ',
 'disclaimerpage' => 'Project:ຂໍ້ປະຕິເສດຄວາມຮັບຜິດຊອບ',
 'edithelp' => 'ວິທີດັດແກ້ໜ້າ',
-'edithelppage' => 'Help:ການດັດແກ້',
 'helppage' => 'Help:ເນື້ອໃນ',
 'mainpage' => 'ໜ້າຫຼັກ',
 'mainpage-description' => 'ໜ້າຫຼັກ',
@@ -380,7 +377,7 @@ $messages = array(
 'newpassword' => 'ລະຫັດຜ່ານໃໝ່:',
 'retypenew' => 'ພິມລະຫັດຜ່ານໃໝ່ອີກ:',
 'resetpass_submit' => 'ຕັ້ງລະຫັດຜ່ານ ແລະ ເຊັນເຂົ້າ',
-'resetpass_success' => 'ສຳເລັດການປ່ຽນແປງ ລະຫັດຜ່ານຂອງທ່ານແລ້ວ! ດຽວນີ້ ທ່ານ ເຊັ່ນເຂົ້າ ໃນ ...',
+'changepassword-success' => 'ສຳເລັດການປ່ຽນແປງ ລະຫັດຜ່ານຂອງທ່ານແລ້ວ! ດຽວນີ້ ທ່ານ ເຊັ່ນເຂົ້າ ໃນ ...',
 
 # Edit page toolbar
 'bold_sample' => 'ໂຕໜັງສືເຂັ້ມ',
@@ -476,7 +473,6 @@ $messages = array(
 'prevn' => '{{PLURAL:$1|$1}} ກ່ອນໜ້າ',
 'nextn' => '{{PLURAL:$1|$1}} ຕໍ່ໄປ',
 'viewprevnext' => 'ເບິ່ງ ($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:ເນື້ອໃນ',
 'search-result-size' => '$1 ({{PLURAL:$2|1 ຄຳ|$2 ຄຳ}})',
 'search-result-score' => 'ຄວາມກ່ຽວຂ້ອງ: $1%',
 'search-redirect' => '(ໂອນ $1)',
@@ -564,7 +560,6 @@ $messages = array(
 'recentchangeslinked-feed' => 'ການດັດແກ້ທີ່ກ່ຽວຂ້ອງ',
 'recentchangeslinked-toolbox' => 'ການດັດແກ້ທີ່ກ່ຽວຂ້ອງ',
 'recentchangeslinked-title' => 'ການປ່ຽນແປງກ່ຽວຂ້ອງກັບ "$1"',
-'recentchangeslinked-noresult' => 'ບໍ່ມີການປ່ຽນແປງຢູ່ໜ້າລິ້ງຄ໌ໃນໄລຍະດັ່ງກ່າວ.',
 
 # Upload
 'upload' => 'ອັບໂຫຼດໄຟລ໌',
@@ -609,11 +604,6 @@ $messages = array(
 # Statistics
 'statistics' => 'ສະຖິຕິ',
 
-'disambiguations' => 'ໜ້າແກ້ຄວາມກຳກວມ',
-'disambiguations-text' => "ໜ້າຕໍ່ໄປນີ້ເຊື່ອມໂຍງໄປຍັງ '''ໜ້າແກ້ຄວາມກຳກວມ'''&nbsp;
-ຊຶ່ງຄວນດັດແກ້ລິງຄ໌ໃຫ້ເຊື່ອມໂຍງໄປທີ່ໜ້າອື່ນທີ່ເໝາະສົມ<br />
-ໜ້າໃດທີ່ຮຽກໃຊ້ແມ່ແບບ [[MediaWiki:Disambiguationspage|ແກ້ກຳກວມ]] ໜ້າເຫຼ່ານັ້ນຖຶກເປັນໜ້າແກ້ຄວາມກຳກວມ",
-
 'doubleredirects' => 'ໂອນໜ້າ 2 ຄັ້ງ',
 
 'brokenredirects' => 'ການໂອນບໍ່ມີໜ້າປາຍທາງ',
@@ -713,8 +703,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watch' => 'ຕິດຕາມ',
 'watchthispage' => 'ຕິດຕາມໜ້ານີ້',
 'unwatch' => 'ເຊົາຕິດຕາມ',
-'watchnochange' => 'ບໍ່ມີໜ້າທີ່ທ່ານຕິດຕາມໃດໆ ຖືກດັດແປງໃນໄລຍະສະແດງຂ້າງເທິງນີ້.',
-'wlheader-showupdated' => "* ບັນດາ ໜ້າ ທີ່ມີການປ່ຽນແປງ ຫຼັງຈາກທີ່ທ່ານ ເຂົ້າຊົມຫຼ້າສຸດ ຈະຖືກສະແດງເປັນ ໂຕໜັງສື  '''ເຂັ້ມ'''",
+'wlheader-showupdated' => "ບັນດາ ໜ້າ ທີ່ມີການປ່ຽນແປງ ຫຼັງຈາກທີ່ທ່ານ ເຂົ້າຊົມຫຼ້າສຸດ ຈະຖືກສະແດງເປັນ ໂຕໜັງສື  '''ເຂັ້ມ'''",
 'wlshowlast' => 'ສະແດງ $1 ຊົ່ວໂມງຫຼ້າສຸດ $2 ມື້ຫຼ້າສຸດ $3',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -901,7 +890,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Metadata
 'metadata-expand' => 'ສະແດງລະອຽດຕື່ມ',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ຄວາມກ້ວາງ',
 'exif-imagelength' => 'ຄວາມສູງ',
 'exif-imagedescription' => 'ຫົວຂໍ້ຮູບ',
@@ -962,9 +951,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:Version
 'version' => 'ສະບັບ',
 
-# Special:FilePath
-'filepath' => 'ທາງໄປຫາໄຟລ໌',
-
 # Special:SpecialPages
 'specialpages' => 'ໜ້າພິເສດ',
 
diff --git a/languages/messages/MessagesLoz.php b/languages/messages/MessagesLoz.php
index 06299138..0fafbb0d 100644
--- a/languages/messages/MessagesLoz.php
+++ b/languages/messages/MessagesLoz.php
@@ -35,9 +35,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Kamukile zwa adress di meli di xete peson kwa melina notifikasyona',
 'tog-shownumberswatching' => 'Kamukile tali di kentezi sebelu',
 'tog-fancysig' => "Ro sebu e data (dicon ling'ki auto)",
-'tog-externaleditor' => "Sebelize hloli ye ng'i ektenali dauto",
-'tog-externaldiff' => 'Sebelize petuho ektenali dauto',
-'tog-showjumplinks' => 'Nyembulisize "sinkumukezi" ling\'ki',
 'tog-uselivepreview' => 'Sebelize live PendiBe (bulukezi JavaScript) (yem nca)',
 'tog-watchlisthideown' => 'Cwankekile zwa afina di zwa mukoloko di kentezi',
 'tog-watchlisthidebots' => 'Cwankekile roboti di zwa mukoloko di kentezi',
@@ -181,7 +178,7 @@ $messages = array(
 'jumptonavigation' => 'muya',
 'jumptosearch' => 'fatukile',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => "Ngesi ye ng'i atulile {{SITENAME}}",
 'aboutpage' => "Project:Ngesi ye ng'i atulile",
 'copyright' => 'Bye sa ilonungi di $1.',
@@ -191,7 +188,6 @@ $messages = array(
 'disclaimers' => 'Dikulemi',
 'disclaimerpage' => 'Project:Dikulemi generali',
 'edithelp' => "Hloli ye ng'i",
-'edithelppage' => "Help:Hloli ye ng'i",
 'helppage' => 'Help:Buinaneli di petulo',
 'mainpage' => 'Petulo yem efro',
 'mainpage-description' => 'Petulo yem efro',
@@ -267,7 +263,6 @@ Fung'ksyun: $1<br />
 Query: $2",
 'viewsource' => "Kamukile ng'i",
 'viewsourcetext' => 'A sa kamukile wiki-selt di bye petulo:',
-'sqlhidden' => '(SQL query sa cwankekile)',
 
 # Login and logout pages
 'yourname' => 'Sebelu:',
@@ -455,15 +450,11 @@ Informasi: (bye) = petuho a nca selt,
 'prevn' => 'kona {{PLURAL:$1|$1}}',
 'nextn' => 'lila {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Kamukile ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Buinaneli di petulo',
 'searchall' => 'xete',
 'showingresults' => "Kamukile opi {{PLURAL:$1|'''1''' ekali|'''$1''' ekalina}} di #'''$2'''.",
 'showingresultsnum' => "Kamukile {{PLURAL:$3|'''1''' ekali|'''$3''' ekalina}} di #'''$2'''.",
 'powersearch' => 'Fatukile',
 
-# Quickbar
-'qbsettings-none' => 'Ni',
-
 # Preferences page
 'preferences' => 'Petohoni di sebelu',
 'mypreferences' => 'Zwa petohoni di sebelu',
@@ -533,7 +524,6 @@ Informasi: (bye) = petuho a nca selt,
 'recentchangeslinked-feed' => 'Petuho adusi',
 'recentchangeslinked-toolbox' => 'Petuho adusi',
 'recentchangeslinked-title' => 'Petuho dadusi di "$1"',
-'recentchangeslinked-noresult' => "Ni petuhoni kwa ling'ki petulo kwa bye datum.",
 'recentchangeslinked-summary' => "Bye petulo zwenti kamukile lapu-kona petuho di petulo sa ling'ki. Petulo di zwa mukoloko di kentezi sa '''ombelu'''.",
 
 # Upload
@@ -611,8 +601,6 @@ di uplodezi media.',
 'statistics' => 'Mukoloko di kamukile',
 'statistics-header-users' => 'Mukoloko di kamukile di sebelu',
 
-'disambiguations' => 'Disamebigasina',
-
 'doubleredirects' => 'Petulo abezi sa dužemi',
 
 'brokenredirects' => 'Petulo abezi bufosi',
@@ -849,7 +837,6 @@ Petohoni di petulo '''$1''' sa:",
 'contribslink' => 'afina',
 'blocklogpage' => 'Desu di bolok',
 'blocklogentry' => 'sa bolok [[$1]] e simpekile sa $2 $3',
-'proxyblocksuccess' => 'Afi.',
 
 # Move page
 'move-page-legend' => 'Nyanganyisize petulo',
@@ -1019,7 +1006,7 @@ Xete ling'ki kwa lina sa konsidisize desepo. Petulo dimedi inlinenikusize.",
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagedescription' => 'Sebu di imegi',
 
 # External editor support
diff --git a/languages/messages/MessagesLt.php b/languages/messages/MessagesLt.php
index bf6f3a3f..c29b9dc6 100644
--- a/languages/messages/MessagesLt.php
+++ b/languages/messages/MessagesLt.php
@@ -216,9 +216,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Rodyti stebinčių naudotojų skaičių',
 'tog-oldsig' => 'Esamo parašo peržiūra:',
 'tog-fancysig' => 'Laikyti parašą vikitekstu (be automatinių nuorodų)',
-'tog-externaleditor' => 'Pagal nutylėjimą naudoti išorinį redaktorių (skirta tik ekspertams, nes reikia atitinkamai paruošti jūsų kompiuterį. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Pagal nutylėjimą naudoti išorinę skirtumų rodymo programą (tik ekspertams, nes reikia atitinkamai  paruošti jūsų kompiuterį. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => 'Įjungti „peršokti į“ pasiekiamumo nuorodas',
 'tog-uselivepreview' => 'Naudoti tiesioginę peržiūrą (JavaScript) (Eksperimentinis)',
 'tog-forceeditsummary' => 'Klausti, kai palieku tuščią keitimo komentarą',
 'tog-watchlisthideown' => 'Slėpti mano keitimus stebimų sąraše',
@@ -231,6 +228,7 @@ $messages = array(
 'tog-diffonly' => 'Nerodyti puslapio turinio po skirtumais',
 'tog-showhiddencats' => 'Rodyti paslėptas kategorijas',
 'tog-norollbackdiff' => 'Nepaisyti skirtumo atlikus atmetimą',
+'tog-useeditwarning' => 'Perspėti mane, kai palieku redagavimo puslapį, o jame yra neišsaugotų pakeitimų',
 
 'underline-always' => 'Visada',
 'underline-never' => 'Niekada',
@@ -294,6 +292,18 @@ $messages = array(
 'oct' => 'spa',
 'nov' => 'lap',
 'dec' => 'grd',
+'january-date' => 'Sausio $1',
+'february-date' => 'Vasario $1',
+'march-date' => 'Kovo $1',
+'april-date' => 'Balandžio $1',
+'may-date' => 'Gegužės $1',
+'june-date' => 'Birželio $1',
+'july-date' => 'Liepos $1',
+'august-date' => 'Rugpjūčio $1',
+'september-date' => 'Rugsėjo $1',
+'october-date' => 'Spalio $1',
+'november-date' => 'Lapkričio $1',
+'december-date' => 'Gruodžio $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorijos}}',
@@ -375,6 +385,7 @@ $messages = array(
 'create-this-page' => 'Sukurti šį puslapį',
 'delete' => 'Trinti',
 'deletethispage' => 'Ištrinti šį puslapį',
+'undeletethispage' => 'Attrinti šį puslapį',
 'undelete_short' => 'Atkurti $1 {{PLURAL:$1:redagavimą|redagavimus|redagavimų}}',
 'viewdeleted_short' => 'Peržiūrėti $1 {{PLURAL:$1|ištrintą keitimą|ištrintus keitimus|ištrintų keitimų}}',
 'protect' => 'Užrakinti',
@@ -418,7 +429,7 @@ $1',
 'pool-queuefull' => 'Telkinio eilė pilna',
 'pool-errorunknown' => 'Nežinoma klaida',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Apie {{SITENAME}}',
 'aboutpage' => 'Project:Apie',
 'copyright' => 'Turinys pateikiamas pagal $1 licenciją.',
@@ -428,7 +439,6 @@ $1',
 'disclaimers' => 'Atsakomybės apribojimas',
 'disclaimerpage' => 'Project:Atsakomybės apribojimas',
 'edithelp' => 'Kaip redaguoti',
-'edithelppage' => 'Help:Redagavimas',
 'helppage' => 'Help:Turinys',
 'mainpage' => 'Pagrindinis puslapis',
 'mainpage-description' => 'Pagrindinis puslapis',
@@ -505,17 +515,6 @@ Egzistuojančių specialiųjų puslapių sąrašą galite rasti [[Special:Specia
 # General errors
 'error' => 'Klaida',
 'databaseerror' => 'Duomenų bazės klaida',
-'dberrortext' => 'Neteisinga duomenų bazės užklausos sintaksė.
-Galima klaida programinėje įrangoje.
-Paskutinė mėginta užklausa:
-<blockquote><tt>$1</tt></blockquote>
-iš funkcijos: „<tt>$2</tt>“.
-Duomenų bazė grąžino klaidą „<tt>$3: $4</tt>“.',
-'dberrortextcl' => 'Įvyko duomenų bazės užklausos sintaksės klaida.
-Paskutinė mėginta duomenų bazės užklausa buvo:
-„$1“
-iš funkcijos: „$2“.
-Duomenų bazė grąžino klaidą „$3: $4“',
 'laggedslavemode' => 'Dėmesio: Puslapyje gali nesimatyti naujausių pakeitimų.',
 'readonly' => 'Duomenų bazė užrakinta',
 'enterlockreason' => 'Įveskite užrakinimo priežastį, taip pat datą, kada bus atrakinta',
@@ -569,12 +568,15 @@ Užklausa: $2',
 'protectedinterface' => 'Šiame puslapyje yra apsaugotas nuo piktnaudžiavimo programinės įrangos sąsajos tekstas.',
 'editinginterface' => "'''Dėmesio:''' Jūs redaguojate puslapį, kuris yra naudojamas programinės įrangos sąsajos tekste. Pakeitimai šiame puslapyje taip pat pakeis naudotojo sąsajos išvaizdą ir kitiems naudotojams šiame wiki.
 Jei norite pridėti ir keisti vertimus, siūlome pasinaudoti [//translatewiki.net/wiki/Main_Page?setlang=lt „translatewiki.net“], „MediaWiki“ lokalizacijos projektu.",
-'sqlhidden' => '(SQL užklausa paslėpta)',
 'cascadeprotected' => 'Šis puslapis buvo apsaugotas nuo redagavimo, kadangi jis yra įtrauktas į {{PLURAL:$1|šį puslapį, apsaugotą|šiuos puslapius, apsaugotus}} „pakopinės apsaugos“ pasirinktimi:
 $2',
 'namespaceprotected' => "Jūs neturite teisės redaguoti puslapių '''$1''' srityje.",
 'customcssprotected' => 'Jūs neturite teisės keisti šį CSS puslapį, nes jame yra kito naudotojo asmeniniai nustatymai.',
 'customjsprotected' => 'Jūs neturite teisės keisti šį JavaScript puslapį, nes jame yra kito naudotojo asmeniniai nustatymai.',
+'mycustomcssprotected' => 'Jūs neturite teisės redaguoti šio CSS puslapio.',
+'mycustomjsprotected' => 'Jūs neturite teisės redaguoti šio JavaScript puslapio.',
+'myprivateinfoprotected' => 'Jūs neturite teisių redaguoti savo asmeninę informaciją.',
+'mypreferencesprotected' => 'Jūs neturite teisių redaguoti jūsų parinktys.',
 'ns-specialprotected' => 'Specialieji puslapiai negali būti redaguojami.',
 'titleprotected' => "[[User:$1|$1]] apsaugojo šį pavadinimą nuo sukūrimo.
 Nurodyta priežastis yra ''$2''.",
@@ -600,10 +602,19 @@ Pastaba: kai kuriuose puslapiuose ir toliau gali rodyti, kad esate prisijungęs
 'welcomecreation-msg' => 'Jūsų paskyra buvo sukurta.
 Nepamirškite pakeisti savo [[Special:Preferences|{{SITENAME}} nustatymų]].',
 'yourname' => 'Naudotojo vardas:',
+'userlogin-yourname' => 'Naudotojo vardas',
+'userlogin-yourname-ph' => 'Įveskite savo naudotojo vardą',
+'createacct-another-username-ph' => 'Įveskite naudotojo vardą',
 'yourpassword' => 'Slaptažodis:',
+'userlogin-yourpassword' => 'Slaptažodis',
+'userlogin-yourpassword-ph' => 'Įveskite savo slaptažodį',
+'createacct-yourpassword-ph' => 'Įveskite slaptažodį',
 'yourpasswordagain' => 'Pakartokite slaptažodį:',
+'createacct-yourpasswordagain' => 'Patvirtinkite slaptažodį',
+'createacct-yourpasswordagain-ph' => 'Įveskite slaptažodį dar kartą',
 'remembermypassword' => 'Prisiminti prisijungimo duomenis šiame kompiuteryje (daugiausiai $1 {{PLURAL:$1|dieną|dienas|dienų}})',
-'securelogin-stick-https' => 'Likite prisijungę prie HTTPS po prisijungimo',
+'userlogin-remembermypassword' => 'Įsiminti mane',
+'userlogin-signwithsecure' => 'Naudoti saugią jungtį',
 'yourdomainname' => 'Jūsų domenas:',
 'password-change-forbidden' => 'Jus negalite keisti slaptažodžių šioje wiki.',
 'externaldberror' => 'Yra arba išorinė autorizacijos duomenų bazės klaida arba jums neleidžiama atnaujinti jūsų išorinės paskyros.',
@@ -615,18 +626,41 @@ Nepamirškite pakeisti savo [[Special:Preferences|{{SITENAME}} nustatymų]].',
 'logout' => 'Atsijungti',
 'userlogout' => 'Atsijungti',
 'notloggedin' => 'Neprisijungęs',
+'userlogin-noaccount' => 'Neturite paskyros?',
+'userlogin-joinproject' => 'Prisijungti prie {{SITENAME}}',
 'nologin' => "Neturite prisijungimo vardo? '''$1'''.",
 'nologinlink' => 'Sukurkite paskyrą',
 'createaccount' => 'Sukurti paskyrą',
 'gotaccount' => "Jau turite paskyrą? '''$1'''.",
 'gotaccountlink' => 'Prisijunkite',
 'userlogin-resetlink' => 'Pamiršote savo prisijungimo duomenis?',
+'userlogin-resetpassword-link' => 'Nustatykite slaptažodį iš naujo',
+'helplogin-url' => 'Help:Prisijungimas',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Prisijungimo pagalba]]',
+'createacct-join' => 'Įveskite savo informaciją žemiau.',
+'createacct-another-join' => 'Įveskite naujos paskyros informaciją žemiau.',
+'createacct-emailrequired' => 'Elektroninio pašto adresas',
+'createacct-emailoptional' => 'Elektroninio pašto adresas (neprivaloma)',
+'createacct-email-ph' => 'Įveskite savo elektroninio pašto adresą',
+'createacct-another-email-ph' => 'Įveskite elektroninio pašto adresą',
 'createaccountmail' => 'Naudokite laikiną atsitiktinį slaptažodį ir nusiųskite jį į elektroninį paštą, nurodytą žemiau.',
+'createacct-realname' => 'Vardas (neprivaloma)',
 'createaccountreason' => 'Priežastis:',
+'createacct-reason' => 'Priežastis',
+'createacct-reason-ph' => 'Kodėl kuriate kitą paskyrą',
+'createacct-captcha' => 'Saugumo patikrinimas',
+'createacct-imgcaptcha-ph' => 'Įveskite tekstą, kurį matote aukščiau',
+'createacct-submit' => 'Sukurkite savo paskyrą',
+'createacct-another-submit' => 'Sukurti kitą paskyrą',
+'createacct-benefit-heading' => '{{SITENAME}} sukurtas žmonių kaip jūs.',
+'createacct-benefit-body1' => '{{PLURAL:$1|keitimas|keitimai|keitimų}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|puslapis|puslapiai}}',
+'createacct-benefit-body3' => 'Neseni {{PLURAL:$1|autorius|autoriai|autorių}}',
 'badretype' => 'Įvesti slaptažodžiai nesutampa.',
 'userexists' => 'Įvestasis naudotojo vardas jau naudojamas.
 Prašome pasirinkti kitą vardą.',
 'loginerror' => 'Prisijungimo klaida',
+'createacct-error' => 'Paskyros kūrimo klaida',
 'createaccounterror' => 'Nepavyko sukurti paskyros: $1',
 'nocookiesnew' => 'Naudotojo paskyra buvo sukurta, bet jūs nesate prisijungęs. {{SITENAME}} naudoja slapukus, kad prijungtų naudotojus. Jūs esate išjungę slapukus. Prašome įjungti juos, tada prisijunkite su savo naujuoju naudotojo vardu ir slaptažodžiu.',
 'nocookieslogin' => '{{SITENAME}} naudoja slapukus, kad prijungtų naudotojus. Jūs esate išjungę slapukus. Prašome įjungti juos ir pamėginkite vėl.',
@@ -708,7 +742,7 @@ Palaukite prieš bandant vėl.',
 'newpassword' => 'Naujas slaptažodis:',
 'retypenew' => 'Pakartokite naują slaptažodį:',
 'resetpass_submit' => 'Nustatyti slaptažodį ir prisijungti',
-'resetpass_success' => 'Jūsų slaptažodis pakeistas sėkmingai! Dabar prisijungiama...',
+'changepassword-success' => 'Jūsų slaptažodis pakeistas sėkmingai! Dabar prisijungiama...',
 'resetpass_forbidden' => 'Slaptažodžiai negali būti pakeisti',
 'resetpass-no-info' => 'Jūs turite būti prisijungęs, kad pasiektumėte puslapį tiesiogiai.',
 'resetpass-submit-loggedin' => 'Keisti slaptažodį',
@@ -720,10 +754,11 @@ Jūs galbūt jau sėkmingai pakeitėte savo slaptažodį ar gavote naują laikin
 
 # Special:PasswordReset
 'passwordreset' => 'Atstatyti slaptažodį',
-'passwordreset-text' => 'Užpildykite šią formą, norėdami atkurti savo slaptažodį.',
+'passwordreset-text-one' => 'Užpildykite šią formą, norėdami atkurti savo slaptažodį.',
+'passwordreset-text-many' => '{{PLURAL:$1|Užpildykite viena iš laukų slaptažodžio atkurimui.}}',
 'passwordreset-legend' => 'Atstatyti slaptažodį',
 'passwordreset-disabled' => 'Slaptažodžių atstatymai šiame wikyje išjungti.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Langelyje parašykite vieną duomenų vienetų žemiau}}',
+'passwordreset-emaildisabled' => 'El. pašto funkcijos uždraustos šiame wiki.',
 'passwordreset-username' => 'Naudotojo vardas:',
 'passwordreset-domain' => 'Domenas:',
 'passwordreset-capture' => 'Peržiūrėti galutinį e-mail laišką?',
@@ -946,11 +981,13 @@ Tam nėra paaiškinimo.',
 Greičiausiai jis yra ištrintas.',
 'edit-conflict' => 'Redagavimo konfliktas.',
 'edit-no-change' => 'Jūsų keitimas buvo ignoruotas kadangi nebuvo atlikta jokių teksto pakeitimų.',
+'postedit-confirmation' => 'Jūsų pakeitimas išsaugotas.',
 'edit-already-exists' => 'Negalima sukurti naujo puslapio.
 Jis jau egzistuoja.',
 'defaultmessagetext' => 'Numatytasis pranešimo tekstas',
 'invalid-content-data' => 'Neleistinas turinys.',
 'content-not-allowed-here' => 'Turinys "$1" puslapyje [[$2]] nėra leistinas.',
+'editwarning-warning' => 'Palikdamas šį puslapį jūs prarasite visus padarytus pakeitimus.',
 
 # Content models
 'content-model-wikitext' => 'wikitekstas',
@@ -1182,7 +1219,6 @@ Prašome patikrinti sąrašus.',
 'searchmenu-legend' => 'Paieškos nustatymai',
 'searchmenu-exists' => "'''Puslapis pavadinimu „[[$1]]“ šioje wiki'''",
 'searchmenu-new' => "'''Sukurti puslapį „[[:$1]]“ šioje wiki!'''",
-'searchhelp-url' => 'Help:Turinys',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ieškoti puslapių su šiuo priešdėliu]]',
 'searchprofile-articles' => 'Turinio puslapiai',
 'searchprofile-project' => 'Pagalbos ir projekto puslapiai',
@@ -1224,15 +1260,6 @@ Prašome patikrinti sąrašus.',
 'search-external' => 'Išorinė paieška',
 'searchdisabled' => 'Projekto {{SITENAME}} paieška yra uždrausta. Galite pamėginti ieškoti Google paieškos sistemoje. Paieškos sistemoje projekto {{SITENAME}} duomenys gali būti pasenę.',
 
-# Quickbar
-'qbsettings' => 'Greitasis pasirinkimas',
-'qbsettings-none' => 'Nerodyti',
-'qbsettings-fixedleft' => 'Fiksuoti kairėje',
-'qbsettings-fixedright' => 'Fiksuoti dešinėje',
-'qbsettings-floatingleft' => 'Plaukiojantis kairėje',
-'qbsettings-floatingright' => 'Plaukiojantis dešinėje',
-'qbsettings-directionality' => 'Pataisyta, priklausomai nuo jūsų rašybos ir kalbos krypties',
-
 # Preferences page
 'preferences' => 'Nustatymai',
 'mypreferences' => 'Nustatymai',
@@ -1265,7 +1292,6 @@ Prašome patikrinti sąrašus.',
 'resetprefs' => 'Išvalyti neišsaugotus pakeitimus',
 'restoreprefs' => 'Grąžinti visus numatytuosius nustatymus',
 'prefs-editing' => 'Redagavimas',
-'prefs-edit-boxsize' => 'Redagavimo lango dydis.',
 'rows' => 'Eilutės:',
 'columns' => 'Stulpeliai:',
 'searchresultshead' => 'Paieškos nustatymai',
@@ -1276,9 +1302,6 @@ Prašome patikrinti sąrašus.',
 'recentchangesdays-max' => '(daugiausiai $1 {{PLURAL:$1|diena|dienos|dienų}})',
 'recentchangescount' => 'Numatytasis rodomas keitimų skaičius:',
 'prefs-help-recentchangescount' => 'Į tai įeina naujausi keitimai, puslapių istorijos ir specialiųjų veiksmų sąrašai.',
-'prefs-help-watchlist-token' => 'Įrašius slaptą raktą į šį laukelį, bus sugeneruotas RSS srautas su jūsų stebimųjų sąrašu.
-Bet kas, žinantis šio lauko raktą, galės matyti jūsų stebimų sąrašą, todėl pasirinkite saugią reikšmę.
-Galite panaudoti šią atsitiktinai sugeneruotą reikšmę: $1',
 'savedprefs' => 'Nustatymai sėkmingai išsaugoti.',
 'timezonelegend' => 'Laiko juosta:',
 'localtime' => 'Vietinis laikas:',
@@ -1309,7 +1332,6 @@ Galite panaudoti šią atsitiktinai sugeneruotą reikšmę: $1',
 'prefs-reset-intro' => 'Jūs galite pasinaudoti šiuo puslapiu, kad grąžintumėte savo nustatymus į svetainės numatytuosius.
 Tai nebeatšaukiama.',
 'prefs-emailconfirm-label' => 'El. pašto patvirtinimas:',
-'prefs-textboxsize' => 'Redagavimo lango dydis',
 'youremail' => 'El. paštas:',
 'username' => '{{GENDER:$1Naudotojo vardas}}:',
 'uid' => '{{GENDER:$1|Naudotojo}} ID:',
@@ -1342,6 +1364,8 @@ Jei jūs jį įvesite, jis bus naudojamas pažymėti jūsų darbą.',
 'prefs-dateformat' => 'Datos formatas',
 'prefs-timeoffset' => 'Laiko skirtumas',
 'prefs-advancedediting' => 'Bendras',
+'prefs-editor' => 'Redaktorius',
+'prefs-preview' => 'Peržiūra',
 'prefs-advancedrc' => 'Papildomi nustatymai',
 'prefs-advancedrendering' => 'Papildomi nustatymai',
 'prefs-advancedsearchoptions' => 'Papildomi nustatymai',
@@ -1377,6 +1401,7 @@ teisės",
 'userrights-notallowed' => 'Jūsų paskyra neturi teisių priskirti ar panaikinti naudotojų teises.',
 'userrights-changeable-col' => 'Grupės, kurias galite keisti',
 'userrights-unchangeable-col' => 'Grupės, kurių negalite keisti',
+'userrights-conflict' => 'Naudotojo teisių konfliktas! Prašome dar kartą taikyti savo keitimus.',
 
 # Groups
 'group' => 'Grupė:',
@@ -1447,6 +1472,10 @@ teisės",
 'right-editusercssjs' => 'Redaguoti kitų naudotojų CSS ir JS failus',
 'right-editusercss' => 'Redaguoti kitų naudotojų CSS failus',
 'right-edituserjs' => 'Redaguoti kitų naudotojų JS failus',
+'right-editmyusercss' => 'Redaguoti savo vartotojo CSS failus',
+'right-editmyuserjs' => 'Redaguokite savo naudotojo vartotojo JavaScript failus',
+'right-viewmywatchlist' => 'Peržiūrėti savo stebimų sąrašą',
+'right-editmyoptions' => 'Redaguoti savo nuostatas',
 'right-rollback' => 'Greitai atmesti paskutinio naudotojo tam tikro puslapio pakeitimus',
 'right-markbotedits' => 'Žymėti atmestus keitimus kaip atliktus boto',
 'right-noratelimit' => 'Netaikyti greičio apribojimų',
@@ -1508,6 +1537,10 @@ teisės",
 'action-userrights-interwiki' => 'keisti naudotojų teises kitose wiki svetainėse',
 'action-siteadmin' => 'užrakinti ar atrakinti duomenų bazę',
 'action-sendemail' => 'siųsti e-mail laiškus',
+'action-editmywatchlist' => 'redaguoti savo stebėjimų sąrašą',
+'action-viewmywatchlist' => 'rodyti savo stebėjimų sąrašą',
+'action-viewmyprivateinfo' => 'peržiūrėti jūsų privačią informaciją',
+'action-editmyprivateinfo' => 'redaguoti savo privačią informaciją',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|pakeitimas|pakeitimai|pakeitimų}}',
@@ -1550,7 +1583,6 @@ teisės",
 'recentchangeslinked-feed' => 'Susiję keitimai',
 'recentchangeslinked-toolbox' => 'Susiję keitimai',
 'recentchangeslinked-title' => 'Su „$1“ susiję keitimai',
-'recentchangeslinked-noresult' => 'Nėra jokių pakeitimų susietuose puslapiuose duotu periodu.',
 'recentchangeslinked-summary' => "Tai paskutinių keitimų, atliktų puslapiuose, į kuriuos yra nuoroda iš nurodyto puslapio (arba į nurodytos kategorijos narius), sąrašas.
 Puslapiai iš jūsų [[Special:Watchlist|stebimųjų sąrašo]] yra '''paryškinti'''.",
 'recentchangeslinked-page' => 'Puslapio pavadinimas:',
@@ -1562,7 +1594,7 @@ Puslapiai iš jūsų [[Special:Watchlist|stebimųjų sąrašo]] yra '''paryškin
 'reuploaddesc' => 'Atšaukti įkėlimą ir grįžti į įkėlimo formą.',
 'upload-tryagain' => 'Siųsti pakeistą failo aprašymą',
 'uploadnologin' => 'Neprisijungęs',
-'uploadnologintext' => 'Norėdami įkelti failą, turite būti [[Special:UserLogin|prisijungęs]].',
+'uploadnologintext' => 'Jūs turite $1, norėdami įkelti failus',
 'upload_directory_missing' => 'Nėra įkėlimo aplanko ($1) ir negali būti sukurtas tinklo serverio.',
 'upload_directory_read_only' => 'Tinklapio serveris negali rašyti į įkėlimo aplanką ($1).',
 'uploaderror' => 'Įkėlimo klaida',
@@ -1761,7 +1793,6 @@ Dėl saugumo, img_auth.php yra išjungtas.',
 'http-read-error' => 'HTTP skaitymo klaida.',
 'http-timed-out' => 'HTTP užklausos laikas baigėsi.',
 'http-curl-error' => 'Klaida siunčiantis URL: $1',
-'http-host-unreachable' => 'Nepavyko pasiekti URL.',
 'http-bad-status' => 'Iškilo problemų vykdant HTTP užklausą: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1790,6 +1821,9 @@ Kai sąrašas susiaurinamas pagal naudotoją, rodomi tik tie failai, kurių nauj
 'listfiles_size' => 'Dydis',
 'listfiles_description' => 'Aprašymas',
 'listfiles_count' => 'Versijos',
+'listfiles-latestversion' => 'Dabartinė versija',
+'listfiles-latestversion-yes' => 'Taip',
+'listfiles-latestversion-no' => 'Ne',
 
 # File description page
 'file-anchor-link' => 'Failas',
@@ -1906,12 +1940,6 @@ Informacija iš [$2 failo aprašymo puslapio] yra pateikiama žemiau.',
 'statistics-users-active-desc' => 'Naudotojai, kurie per {{PLURAL:$1|paskutinę dieną|paskutines $1 dienų}} padarė keitimų',
 'statistics-mostpopular' => 'Daugiausiai rodyti puslapiai',
 
-'disambiguations' => 'Puslapiai rodantys į daugiaprasmių žodžių puslapius',
-'disambiguationspage' => 'Template:Daugiareikšmis',
-'disambiguations-text' => "Žemiau išvardinti puslapiai nurodo į '''daugiaprasmių žodžių puslapius'''.
-Nuorodos turėtų būti patikslintos, kad rodytų į konkretų puslapį.<br />
-Puslapis laikomas daugiaprasmiu puslapiu, jei jis naudoja šabloną, kuris yra nurodomas iš [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Puslapiai su puslapio atributais',
 'pageswithprop-legend' => 'Puslapiai su puslapio atributais',
 'pageswithprop-text' => 'Šiame puslapyje pateikiami puslapiai, kurie ypač naudoja puslapio atributus.',
@@ -2165,10 +2193,9 @@ taip pat bus '''paryškinti''' [[Special:RecentChanges|naujausių keitimų sąra
 'unwatchthispage' => 'Nustoti stebėti',
 'notanarticle' => 'Ne turinio puslapis',
 'notvisiblerev' => 'Versija buvo ištrinta',
-'watchnochange' => 'Pasirinktu laikotarpiu nebuvo redaguotas nei vienas stebimas puslapis.',
 'watchlist-details' => 'Stebima {{PLURAL:$1|$1 puslapis|$1 puslapiai|$1 puslapių}} neskaičiuojant aptarimų puslapių.',
-'wlheader-enotif' => '* El. pašto priminimai yra įjungti.',
-'wlheader-showupdated' => "* Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra pažymėti '''pastorintai'''",
+'wlheader-enotif' => 'El. pašto pranešimai yra įjungti.',
+'wlheader-showupdated' => "Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra pažymėti '''pastorintai'''",
 'watchmethod-recent' => 'tikrinami naujausi stebimųjų puslapių pakeitimai',
 'watchmethod-list' => 'ieškoma naujausių keitimų stebimuose puslapiuose',
 'watchlistcontains' => 'Jūsų stebimųjų sąraše yra $1 {{PLURAL:$1|puslapis|puslapiai|puslapių}}.',
@@ -2416,7 +2443,7 @@ $1',
 'contributions' => '{{GENDER:$1|Naudotojo}} įndėlis',
 'contributions-title' => '{{GENDER:$1|Naudotojo|Naudotojos}} $1 indėlis',
 'mycontris' => 'Įnašai',
-'contribsub2' => 'Naudotojo $1 ($2)',
+'contribsub2' => 'Dėl {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Jokie keitimai neatitiko šių kriterijų.',
 'uctop' => '(dabartinis)',
 'month' => 'Nuo mėnesio (ir anksčiau):',
@@ -2573,11 +2600,8 @@ Jei norite pamatyti dabar blokuojamus adresus, žiūrėkite [[Special:BlockList|
 'ipb_blocked_as_range' => 'Klaida: IP $1 nebuvo užblokuotas tiesiogiai, tad negali būti atblokuotas. Tačiau jis buvo užblokuotas kaip srities $2 dalis, kuri gali būti atblokuota.',
 'ip_range_invalid' => 'Neleistina IP sritis.',
 'ip_range_toolarge' => 'Didesni nei /$1 blokai neleidžiami.',
-'blockme' => 'Užblokuoti mane',
 'proxyblocker' => 'Tarpinių serverių („proxy“) blokavimo priemonė',
-'proxyblocker-disabled' => 'Ši funkcija yra išjungta.',
 'proxyblockreason' => 'Jūsų IP adresas yra užblokuotas, nes jis yra atvirasis tarpinis serveris. Prašome susisiekti su savo interneto paslaugų tiekėju ar technine pagalba ir praneškite jiems apie šią svarbią saugumo problemą.',
-'proxyblocksuccess' => 'Atlikta.',
 'sorbsreason' => 'Jūsų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą šios svetainės.',
 'sorbs_create_account_reason' => 'Jūsų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą šios svetainės. Jūs negalite sukurti paskyros',
 'cant-block-while-blocked' => 'Jūs negalite blokuoti kitų naudotojų, pats būdamas užblokuotas.',
@@ -2757,6 +2781,7 @@ Aplankykite [//www.mediawiki.org/wiki/Localisation „MediaWiki“ lokaliziciją
 'thumbnail-more' => 'Padidinti',
 'filemissing' => 'Dingęs failas',
 'thumbnail_error' => 'Klaida kuriant sumažintą paveikslėlį: $1',
+'thumbnail_error_remote' => 'Klaidos pranešimas iš $1: $2',
 'djvu_page_error' => 'DjVu puslapis nepasiekiamas',
 'djvu_no_xml' => 'Nepavyksta gauti XML DjVu failui',
 'thumbnail-temp-create' => 'Negalima sukurti laikinos failo miniatiūros',
@@ -2976,13 +3001,8 @@ Leidžia pridėti atmetimo priežastį komentaruose',
 'pageinfo-category-files' => 'Failų skaičius',
 
 # Skin names
-'skinname-standard' => 'Klasikinė',
-'skinname-nostalgia' => 'Nostalgija',
 'skinname-cologneblue' => 'Kelno mėlyna',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Mano išvaizda',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Paprasta',
 'skinname-modern' => 'Moderni',
 'skinname-vector' => 'Vektorinė',
 
@@ -3060,11 +3080,25 @@ Jį paleidus jūsų sistema gali būti pažeista.",
 'minutes' => '{{PLURAL:$1|$1 minutę|$1 minutes|$1 minučių}}',
 'hours' => '{{PLURAL:$1|$1 valandą|$1 valandas|$1 valandų}}',
 'days' => '{{PLURAL:$1|$1 dieną|$1 dienas|$1 dienų}}',
+'weeks' => '{{PLURAL:$1|$1 savaitė|$1 savaitės}}',
 'months' => '{{PLURAL:$1|$1 mėnuo|$1 mėnesiai}}',
 'years' => '{{PLURAL:$1|$1 metai}}',
 'ago' => 'prieš $1',
 'just-now' => 'tik dabar',
 
+# Human-readable timestamps
+'hours-ago' => 'prieš $1 {{PLURAL:$1|valandą|valandas|valandų}}',
+'minutes-ago' => 'prieš $1 {{PLURAL:$1|minutę|minutes|minučių}}',
+'seconds-ago' => 'prieš $1 {{PLURAL:$1|sekundę|sekundes|sekundžių}}',
+'monday-at' => 'Pirmadienį $1',
+'tuesday-at' => 'Antradienį $1',
+'wednesday-at' => 'Trečiadienį $1',
+'thursday-at' => 'Ketvirtadienį $1',
+'friday-at' => 'Penktadienį $1',
+'saturday-at' => 'Šeštadienį $1',
+'sunday-at' => 'Sekmadienį $1',
+'yesterday-at' => 'Vakar $1',
+
 # Bad image list
 'bad_image_list' => 'Formatas yra toks:
 
@@ -3092,7 +3126,7 @@ Visos kitos nuorodos toje pačioje eilutėje yra laikomos išimtimis, t. y. pusl
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Plotis',
 'exif-imagelength' => 'Aukštis',
 'exif-bitspersample' => 'Bitai komponente',
@@ -3270,7 +3304,7 @@ Visos kitos nuorodos toje pačioje eilutėje yra laikomos išimtimis, t. y. pusl
 'exif-originalimageheight' => 'Piešinio aukštis prieš apkarpymą',
 'exif-originalimagewidth' => 'Piešinio plotis prieš apkarpymą',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nesuspausta',
 'exif-compression-2' => 'CCITT grupės 3 1-Dimensijos Modifikuotas Hafmano duomenų paleidimo ilgio kodavimas.',
 'exif-compression-3' => 'CCITT 3 grupės fakso kodavimas',
@@ -3668,7 +3702,6 @@ Jūs taip pat galite [[Special:EditWatchlist|naudoti standartinį redaktorių]].
 'version-other' => 'Kita',
 'version-mediahandlers' => 'Daugialypės terpės grotuvai',
 'version-hooks' => 'Gaudliai',
-'version-extension-functions' => 'Papildomos funkcijos',
 'version-parser-extensiontags' => 'Analizatoriaus papildomosios gairės',
 'version-parser-function-hooks' => 'Analizatoriaus funkciniai gaudliai',
 'version-hook-name' => 'Gaudlio pavadinimas',
@@ -3690,12 +3723,16 @@ Jūs turėjote gauti [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public Licens
 'version-entrypoints-header-entrypoint' => 'Įėjimo taškas',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Failo kelias',
-'filepath-page' => 'Failas:',
-'filepath-submit' => 'Kelias',
-'filepath-summary' => 'Šis specialusis puslapis parašo pilną kelią iki failo.
-Paveikslėliai yra rodomi pilna raiška, kiti failų tipai paleidžiami tiesiogiai su jų susietąja programa.',
+# Special:Redirect
+'redirect' => 'Nukreipkite iš failo, naudotojo arba pakeiskite ID',
+'redirect-legend' => 'Nukreipti į failą ar puslapį',
+'redirect-submit' => 'Eiti',
+'redirect-lookup' => 'Peržvalgos:',
+'redirect-value' => 'Vertė:',
+'redirect-user' => 'Naudotojo ID',
+'redirect-revision' => 'Puslapio peržiūra',
+'redirect-file' => 'Failo vardas',
+'redirect-not-exists' => 'Vertė nėra nustatyta',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ieškoti dublikuotų failų',
@@ -3786,6 +3823,9 @@ Paveikslėliai yra rodomi pilna raiška, kiti failų tipai paleidžiami tiesiogi
 'htmlform-submit' => 'Siųsti',
 'htmlform-reset' => 'Atšaukti pakeitimus',
 'htmlform-selectorother-other' => 'Kita',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Taip',
+'htmlform-chosen-placeholder' => 'Pasirinkite parinktį',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 su visatekstės paieškos palaikymu',
diff --git a/languages/messages/MessagesLtg.php b/languages/messages/MessagesLtg.php
index 751e7b47..49460daa 100644
--- a/languages/messages/MessagesLtg.php
+++ b/languages/messages/MessagesLtg.php
@@ -105,7 +105,7 @@ $messages = array(
 'category-article-count' => '{{PLURAL:$2|Itymā kategorejā ir vīn dūtuo puslopa.|{{PLURAL:$1|Paruodeita $1 puslopa|Paruodeitys $1 puslopys}} nu $2.}}',
 'listingcontinuesabbrev' => '(tuoļuojums)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Aproksts',
 'article' => 'Rakstīņs',
@@ -182,7 +182,7 @@ $messages = array(
 'jumptonavigation' => 'navigaceja',
 'jumptosearch' => 'meklēt',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Ap {{grammar:akuzativs|{{SITENAME}}}}',
 'aboutpage' => 'Project:Ap',
 'copyright' => 'Turīņs ir daīmams pa $1.',
@@ -192,7 +192,6 @@ $messages = array(
 'disclaimers' => 'Daīšmu nūstatejumi',
 'disclaimerpage' => 'Project:Dasaīšonu nūstateišona',
 'edithelp' => 'Paleigs',
-'edithelppage' => 'Help:Pataiseišona',
 'helppage' => 'Help:Turīņs',
 'mainpage' => 'Suoku puslopa',
 'mainpage-description' => 'Suoku puslopa',
@@ -211,7 +210,6 @@ $messages = array(
 'newmessageslink' => 'jaunus viestejumus',
 'newmessagesdifflink' => 'pādejā pataise',
 'editsection' => 'pataiseit',
-'editsection-brackets' => '[$1]',
 'editold' => 'pataiseit',
 'editlink' => 'pataiseit',
 'viewsourcelink' => 'Apsavērt suokūtnejū kodu',
@@ -386,7 +384,6 @@ n = nasvareigs lobuojums.',
 'prevn' => 'īprīškejuos {{PLURAL:$1|$1}}',
 'nextn' => 'nuokamuos {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Apsavērt ($1 {{int:pipe-separator}} $2) ($3 vīnā lopā).',
-'searchhelp-url' => 'Help:Turīņs',
 'searchprofile-articles' => 'Rakstīņuos',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 vuords|$2 vuordi|$2 vuordi}})',
 'search-redirect' => '(puoradresiešona nu $1)',
@@ -892,9 +889,6 @@ Puorejī lauki, piec nūklusiejuma, byus nūglobuoti.
 'version-software-product' => 'Produkts',
 'version-software-version' => 'Verseja',
 
-# Special:FilePath
-'filepath-page' => 'Fails:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Faila pasauka:',
 
diff --git a/languages/messages/MessagesLus.php b/languages/messages/MessagesLus.php
index f895dfe7..d68ae6c8 100644
--- a/languages/messages/MessagesLus.php
+++ b/languages/messages/MessagesLus.php
@@ -42,9 +42,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ralvèngtu zât tilang rawh',
 'tog-oldsig' => 'Khàrna hming hman mék:',
 'tog-fancysig' => 'Khàrna hming wikithu angah ngai rawh (zawmna insiam ţül lovin)',
-'tog-externaleditor' => 'Sawi ngai lovin pawnlam siamţhatu hmang rawh (mithiam tan chauh, i khawlthluakneiah setting bîk a ngai. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Sawi ngai lovin pawnlam diff hmang rawh (mithiam tan chauh, i khawlthluakneiah setting bîk a ngai. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => '"Zuan kahlên rawh" tih zawmna awmtir rawh',
 'tog-uselivepreview' => 'Endikna nung hmang rawh (JavaScript a ngai) (hei hi chhinna chauh a la ni)',
 'tog-forceeditsummary' => 'Siamţhatna ruak ka dahluh palhin min hrilh rawh',
 'tog-watchlisthideown' => 'Ka siamţhatho ka ralvènah telh suh',
@@ -57,6 +54,7 @@ $messages = array(
 'tog-diffonly' => 'Dnglmn hnuaiah phêk chhúng tilang suh',
 'tog-showhiddencats' => 'Pawl thuhrûkho tilang rawh',
 'tog-norollbackdiff' => 'Lumlêt hnuah dnglmn kalkan rawh',
+'tog-useeditwarning' => 'Ka phêk siam danglamna ka dahţhat theihnghilh palh chuan min hrilh rawh',
 
 'underline-always' => 'Ziah/ngei ngei',
 'underline-never' => 'Ngai lo',
@@ -244,7 +242,7 @@ $1',
 'pool-queuefull' => 'Hnathawhna hmun awl a awm tawh lo',
 'pool-errorunknown' => 'Kan hriatthiam loh dikhlel a awm tlat',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}  chungchang',
 'aboutpage' => 'Project:Chungchang',
 'copyright' => 'A chhung thute hi $1 hmanga lakchhawn phal a ni.',
@@ -254,7 +252,6 @@ $1',
 'disclaimers' => 'Intlawhkhalhna',
 'disclaimerpage' => 'Project: Intlawhkhalhna Dan',
 'edithelp' => 'Siamţhat zirna',
-'edithelppage' => 'Help: Siamţhat dàn',
 'helppage' => 'Help: A chhunga thu awmte',
 'mainpage' => 'Phekpui',
 'mainpage-description' => 'Phekpui',
@@ -332,12 +329,6 @@ Vohbik phekte chu hetah hian a en theih [[Special:SpecialPages|{{int:specialpage
 # General errors
 'error' => 'Dik lo',
 'databaseerror' => 'Database dik loh',
-'dberrortext' => 'Zémpui zawhna tih dik loh a awm palh.
-Kháwlthlûakah hrik a awm tihna a ni mai thei.
-Zémpui zawhna hnuhnüng ber chu:
-<blockquote><tt>$1<tt></blockquote>,
-"<<tt>$2</tt>" tih hnathawh chhúng aṭang.
-Zémpuiin dikhlelhna "<tt>$3: $4</tt>" a rawn khawhkïr.',
 'laggedslavemode' => "'''Vaukhanna:''' He phêk hian tun hnaia siam thar a pho lang lo mai thei.",
 'readonly' => 'Database kalh a ni',
 'enterlockreason' => 'I kalhna chhan leh i hawn leh hun tura i rin sawi rawh',
@@ -381,7 +372,6 @@ Thil zawn: $2',
 'viewsourcetext' => 'A hnar i lachhawngin i en thei ang:',
 'viewyourtext' => "'''I siamţhatte''' chu he phêkah hian i enin i lachhawng thei ang.",
 'protectedinterface' => 'He phêk hian khawlthluak tan hmangtu-ţawng a phuhru a, hman khawloh a nih loh nan venhim hrih a ni. Lehlinna tidanglam tur emaw belh tur chuan [//translatewiki.net/ translatewiki.net], MediaWiki lehzauna hmachhawp hi i hmang dawn nia.',
-'sqlhidden' => '(SQL zawhna thuhrûk hrih a ni)',
 'cascadeprotected' => 'He phêk hi siam danglam phal a ni hrih lo, a chhan chu {{PLURAL:$1|he phêk|hêng phêk}}, "a huhova venhim" tih hmanga ven chhunga awm a nih vang a ni: 
 $2',
 'namespaceprotected' => "'''$1''' tih hminghmun chhunga phêkte siamţhat phalna i nei lo.",
@@ -410,7 +400,6 @@ I fangtu cache i thenfai hma chu phêk ţhenkhat intar lang a awm reng mai thei,
 'yourpassword' => 'Thurûk:',
 'yourpasswordagain' => 'Thurûk ziak nawn leh rawh le:',
 'remembermypassword' => 'He ka rangpuifanna hman mék (browser)-ah hian ka luhna (a rei berah ni {{PLURAL:$1||}}$1) min vawnsak rawh, thurûk ziah nawn ngai lo tùrin.',
-'securelogin-stick-https' => 'Luh hnuah HTTPS-ah hian chëng reng rawh.',
 'yourdomainname' => 'I ram:',
 'password-change-forbidden' => 'Hë wiki-ah hian thurûk i thlâk thei lo.',
 'externaldberror' => 'Insawifiahna felfai lo a awm lo a nih loh vëk pawhin i pawnlam siangchan tihdanglam phalsak i ni lo a ni ang.',
@@ -492,7 +481,7 @@ I tum leh hmain nghâk lawk ang che.',
 'newpassword' => 'Thurûk thar:',
 'retypenew' => 'Thurûk ziak nawn leh rawh le:',
 'resetpass_submit' => 'Thurûk siamfel la inziaklût rawh',
-'resetpass_success' => 'I thurûk hlawhtling taka thlâk a ni.
+'changepassword-success' => 'I thurûk hlawhtling taka thlâk a ni.
 Kan hruai lût mék a che...',
 'resetpass_forbidden' => 'Thurûk thlâk theih a ni lo.',
 'resetpass-no-info' => 'He phêk lut mai tùr chuan i inziahluh a ngai.',
@@ -504,7 +493,6 @@ I thurûk i thlâk hlawhtling tawh a nih loh pawhin thurûk lailâwk i dil a ni
 
 # Special:PasswordReset
 'passwordreset' => 'Thurûk ziakţha rawh',
-'passwordreset-text' => 'I thurûk thlâk turin ahnuaia lehkha khu dah khat ang che.',
 'passwordreset-legend' => 'Thurûk ziakţha rawh',
 'passwordreset-username' => 'Hmangtu hming:',
 'passwordreset-domain' => 'Huamchin:',
@@ -738,7 +726,6 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
 'searchmenu-legend' => 'Zawn duhthlanna',
 'searchmenu-exists' => "'''He wiki-ah hian \"[[:\$1]]\" tia koh phêk a awm.'''",
 'searchmenu-new' => "'''[[:$1]] phek hi he wiki-ah hian siam rawh le!'''",
-'searchhelp-url' => 'Help:A chhunga thu awmte',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|He thuhmabet nei phêkte hi zawng rawh]]',
 'searchprofile-articles' => 'A chhunga thu awm',
 'searchprofile-project' => 'Ţanpuina leh hna-hmachhawp phekte',
@@ -779,15 +766,6 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
 Google hmangin i lo zawng hrih thei ang.
 {{SITENAME}} chhung zawnawlna hi a hlui lutuk tawh mai thei tih hria ang che.',
 
-# Quickbar
-'qbsettings' => 'Hmanrawliang',
-'qbsettings-none' => 'Pakhat mah',
-'qbsettings-fixedleft' => 'Veilam',
-'qbsettings-fixedright' => 'Dinglam',
-'qbsettings-floatingleft' => 'Veilama lang',
-'qbsettings-floatingright' => 'Dinglama lang',
-'qbsettings-directionality' => 'Bet, i ţawng inziahdàn hawzawnga zirin',
-
 # Preferences page
 'preferences' => 'Duhdàn',
 'mypreferences' => 'Duhthlanna',
@@ -820,7 +798,6 @@ Google hmangin i lo zawng hrih thei ang.
 'resetprefs' => 'Tihdanglamna dahţhat loh tifai rawh',
 'restoreprefs' => 'A awmdàn siamsaah dah lêt vek rawh',
 'prefs-editing' => 'Siamţhat',
-'prefs-edit-boxsize' => 'Siamţhatna tukverh lenzawng',
 'rows' => 'Tlar:',
 'columns' => 'Thlur:',
 'searchresultshead' => 'Zawnna',
@@ -860,7 +837,6 @@ Google hmangin i lo zawng hrih thei ang.
 'prefs-reset-intro' => 'He phêk hi ränghmuna i duhthlansa tihdanglam nan i hmang thei.
 A sûtlêt theih loh.',
 'prefs-emailconfirm-label' => 'E-chenhmun tihchianna:',
-'prefs-textboxsize' => 'Siamţhatna tukverh lenzawng',
 'youremail' => 'E-chenhmun:',
 'username' => 'Hmangtu hming:',
 'uid' => 'Hmangtu ID',
@@ -1046,7 +1022,6 @@ Hmangtuten e-lehkha an thawn chein i e-chenhmun hrilh an ni chuang lo vang.',
 'recentchangeslinked-feed' => 'Tihdanglam anpuite',
 'recentchangeslinked-toolbox' => 'Tihdanglam anpuite',
 'recentchangeslinked-title' => '"$1" kaihhnawih tihdanglamnate',
-'recentchangeslinked-noresult' => 'I hun thlan chhungah hian a phek zawmpui tihdanglam pakhat mah a awm lo.',
 'recentchangeslinked-summary' => "Hei hi phek pakhat (emaw pawl pakhata telte) aţanga zawm chhuah phek-hova tihdanglam thar ziah chhuahna a ni.
 [[Special:Watchlist|I ralvèn]] phêkte chu '''hawrawp thau'''-a tihlan a ni.",
 'recentchangeslinked-page' => 'Phek hming:',
@@ -1248,9 +1223,6 @@ Taksa sawifiahna hi i siamṭha duh a nih chuan  [$2 taksa sawifiahna phêk] a
 'statistics-users-active-desc' => 'Ni {{PLURAL:$1|khat|$1}} kaltâ chhunga thiltih nei hmangtuho',
 'statistics-mostpopular' => 'Phêk thlir zin deuh deuhte',
 
-'disambiguations' => 'Thliarfelna phêk zawmtu phêkte',
-'disambiguationspage' => 'Template:thliar',
-
 'doubleredirects' => 'Hruailuhna phír',
 'double-redirect-fixed-move' => '[[$1]] sawn a ni ta.
 [[$2]] lama hruailuhna siam nghâl a ni.',
@@ -1437,7 +1409,6 @@ Hetah hian [[Special:UnusedCategories|pawl hman lohho]] pholan tel a ni lo.
 'unwatchthispage' => 'Vil tihtawpna',
 'notanarticle' => 'Phêk dikdawh a ni lo.',
 'notvisiblerev' => 'Hmangtu dang tihdanglamna thar paihbo a ni.',
-'watchnochange' => 'I hun sawi chhungah khan i ralvèn khawih buai a ni lo.',
 'watchlist-details' => 'I ralvèn zing aţanga {{PLURAL:$1| phêk $1 |phêk $1}}, sawihona phêk chhiar lohvin.',
 'wlheader-enotif' => '*E-lehkha inhriattirna tihnun a ni.',
 'wlheader-showupdated' => "I tlawh hnuhnun ber hnua tihdanglam phêk te chu a '''thau'''va tihlan a ni.",
@@ -1838,7 +1809,7 @@ A bak zawng chu thuhrûk sa vek a ni ang.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Zàuzáwng',
 'exif-imagelength' => 'Sànzáwng',
 'exif-bitspersample' => 'Péng khata mal(bit) awm zât',
diff --git a/languages/messages/MessagesLv.php b/languages/messages/MessagesLv.php
index 27f68575..87965a98 100644
--- a/languages/messages/MessagesLv.php
+++ b/languages/messages/MessagesLv.php
@@ -83,9 +83,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Rādīt uzraudzītāju skaitu',
 'tog-oldsig' => 'Pašreizējais paraksts:',
 'tog-fancysig' => 'Vienkāršs paraksts (bez automātiskās saites)',
-'tog-externaleditor' => 'Pēc noklusējuma izmantot ārēju programmu lapu izmainīšanai (tikai pieredzējušiem lietotājiem, lai darbotos nepieciešami speciāli uzstādījumi tavā datorā sk. [//www.mediawiki.org/wiki/Manual:External_editor šeit])',
-'tog-externaldiff' => 'Pēc noklusējuma izmantot ārēju programmu izmaiņu parādīšanai (tikai pieredzējušiem lietotājiem, lai darbotos nepieciešami speciāli uzstādījumi tavā datorā sk. [//www.mediawiki.org/wiki/Manual:External_editor šeit])',
-'tog-showjumplinks' => 'Rādīt pārlēkšanas saites',
 'tog-uselivepreview' => "Lietot tūlītējo priekšskatījumu (izmanto ''JavaScript''; eksperimentāla iespēja)",
 'tog-forceeditsummary' => 'Atgādināt man, ja kopsavilkuma ailīte ir tukša',
 'tog-watchlisthideown' => 'Paslēpt manus labojumus uzraugāmo lapu sarakstā',
@@ -98,6 +95,8 @@ $messages = array(
 'tog-diffonly' => 'Nerādīt lapu saturu zem izmaiņām',
 'tog-showhiddencats' => 'Rādīt slēptās kategorijas',
 'tog-norollbackdiff' => 'Neņemt vērā atšķirības, veicot atriti',
+'tog-useeditwarning' => 'Brīdināt mani, kad es atstāju lapas rediģēšanu nesaglabājot izmaiņas',
+'tog-prefershttps' => 'Vienmēr izmantot drošu savienojumu pēc pieslēgšanās',
 
 'underline-always' => 'vienmēr',
 'underline-never' => 'Nekad',
@@ -161,6 +160,18 @@ $messages = array(
 'oct' => 'oktobrī,',
 'nov' => 'novembrī,',
 'dec' => 'decembrī,',
+'january-date' => '$1. janvāris',
+'february-date' => '$1. februāris',
+'march-date' => '$1. marts',
+'april-date' => '$1. aprīlis',
+'may-date' => '$1. maijs',
+'june-date' => '$1. jūnijs',
+'july-date' => '$1. jūlijs',
+'august-date' => '$1. augusts',
+'september-date' => '$1. septembris',
+'october-date' => '$1. oktobris',
+'november-date' => '$1. novembris',
+'december-date' => '$1. decembris',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorijas}}',
@@ -242,6 +253,7 @@ $messages = array(
 'create-this-page' => 'Izveidot šo lapu',
 'delete' => 'Dzēst',
 'deletethispage' => 'Dzēst šo lapu',
+'undeletethispage' => 'Atjaunot šo lapu',
 'undelete_short' => 'Atjaunot $1 {{PLURAL:$1|versiju|versijas}}',
 'viewdeleted_short' => 'Apskatīt {{PLURAL:$1|vienu dzēstu labojumu|$1 dzēstus labojumus}}',
 'protect' => 'Aizsargāt',
@@ -283,7 +295,7 @@ Lūdzu, brīdi uzgaidiet un mēģiniet šo lapu apskatīties vēlreiz.
 $1',
 'pool-errorunknown' => 'Nezināma kļūda',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Par {{grammar:akuzatīvs|{{SITENAME}}}}',
 'aboutpage' => 'Project:Par',
 'copyright' => 'Saturs ir pieejams saskaņā ar $1, ja vien nav norādīts citādi.',
@@ -293,7 +305,6 @@ $1',
 'disclaimers' => 'Saistību atrunas',
 'disclaimerpage' => 'Project:Saistību atrunas',
 'edithelp' => 'Rediģēšanas palīdzība',
-'edithelppage' => 'Help:Rediģēšana',
 'helppage' => 'Help:Saturs',
 'mainpage' => 'Sākumlapa',
 'mainpage-description' => 'Sākumlapa',
@@ -367,17 +378,10 @@ Derīgo īpašo lapu saraksts atrodas te: [[Special:SpecialPages|{{int:specialpa
 # General errors
 'error' => 'Kļūda',
 'databaseerror' => 'Datu bāzes kļūda',
-'dberrortext' => 'Konstatēta sintakses kļūda datubāzes pieprasījumā.
-Iespējams, tā radusies dēļ kļūdas programmatūrā.
-Pēdējais datubāzes pieprasījums bija:
-<blockquote><code>$1</code></blockquote>
-no funkcijas "<code>$2</code>".
-Datubāzes atgrieztais kļūdas paziņojums: "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Datubāzes vaicājumā pieļauta sintakses kļūda.
-Pēdējais priekšraksts:
-"$1"
-palaists funkcijā "$2".
-Izdotā MySQL kļūda: "$3: $4"',
+'databaseerror-textcl' => 'Datu bāzes vaicājuma kļūda.',
+'databaseerror-query' => 'Vaicājums: $1',
+'databaseerror-function' => 'Funkcija: $1',
+'databaseerror-error' => 'Kļūda: $1',
 'laggedslavemode' => 'Uzmanību: Iespējams, šajā lapā nav redzami nesen izdarītie papildinājumi.',
 'readonly' => 'Datubāze bloķēta',
 'enterlockreason' => 'Ievadiet bloķēšanas iemeslu, ieskaitot aplēses, kad bloķēšana tiks beigta.',
@@ -421,10 +425,13 @@ Vaicājums: $2',
 'viewsourcetext' => 'Tu vari apskatīties un nokopēt šīs lapas vikitekstu:',
 'protectedinterface' => 'Šī lapa satur programmatūras interfeisā lietotu tekstu un ir bloķēta pret izmaiņām, lai pasargātu no bojājumiem.',
 'editinginterface' => "'''Brīdinājums:''' Tu izmaini lapu, kuras saturu izmanto wiki programmatūras lietotāja saskarnē (''interfeisā''). Šīs lapas izmaiņas ietekmēs lietotāja saskarni citiem lietotājiem. Pēc modificēšanas, šīs izmaiņas būtu lietderīgi pievienot arī [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], kas ir MediaWiki lokalizēšanas projekts.",
-'sqlhidden' => '(SQL vaicājums paslēpts)',
 'namespaceprotected' => "Tev nav atļaujas izmainīt lapas, kas atrodas '''$1''' ''namespacē''.",
 'customcssprotected' => 'Jums nav tiesību rediģēt šo CSS lapu, jo tā satur cita lietotāja personiskos iestatījumus.',
 'customjsprotected' => 'Jums nav tiesību rediģēt šo JavaScript lapu, jo tā satur cita lietotāja personiskos iestatījumus.',
+'mycustomcssprotected' => 'Jums nav tiesību rediģēt šo CSS lapu.',
+'mycustomjsprotected' => 'Jums nav tiesību rediģēt šo JavaScript lapu.',
+'myprivateinfoprotected' => 'Jums nav tiesību rediģēt savu privāto informāciju.',
+'mypreferencesprotected' => 'Jums nav tiesību rediģēt savus iestatījumus.',
 'ns-specialprotected' => 'Nevar izmainīt īpašās lapas.',
 'titleprotected' => "Šī lapa ir aizsargāta pret izveidošanu. To aizsargāja [[User:$1|$1]].
 Norādītais iemesls bija ''$2''.",
@@ -441,10 +448,19 @@ Vari turpināt to izmantot anonīmi, vari <span class='plainlinks'>[$1 atgriezti
 Ņem vērā, ka arī pēc iziešanas, dažas lapas var tikt parādītas tā, it kā tu vēl būtu iekšā, līdz tiks iztīrīta pārlūka kešatmiņa.",
 'welcomeuser' => 'Laipni lūgts, $1!',
 'yourname' => 'Tavs lietotājvārds',
+'userlogin-yourname' => 'Lietotājvārds',
+'userlogin-yourname-ph' => 'Ievadiet savu lietotājvārdu',
+'createacct-another-username-ph' => 'Ievadiet lietotājvārdu',
 'yourpassword' => 'Tava parole:',
+'userlogin-yourpassword' => 'Parole',
+'userlogin-yourpassword-ph' => 'Ievadiet savu paroli',
+'createacct-yourpassword-ph' => 'Ievadiet paroli',
 'yourpasswordagain' => 'Atkārto paroli',
+'createacct-yourpasswordagain' => 'Apstipriniet paroli',
+'createacct-yourpasswordagain-ph' => 'Vēlreiz ievadiet paroli',
 'remembermypassword' => 'Atcerēties pēc pārlūka aizvēršanas (spēkā ne vairāk kā $1 {{PLURAL:$1|diena|dienas}}).',
-'securelogin-stick-https' => 'Saglabāt HTTPS savienojumu pēc pieslēgšanās',
+'userlogin-remembermypassword' => 'Atcerēties mani',
+'userlogin-signwithsecure' => 'Izmantot drošu savienojumu',
 'yourdomainname' => 'Tavs domēns',
 'password-change-forbidden' => 'Šajā wiki paroles nevar mainīt.',
 'externaldberror' => 'Notikusi vai nu ārējās autentifikācijas datubāzes kļūda, vai arī tev nav atļauts izmainīt savu ārējo kontu.',
@@ -456,18 +472,39 @@ Vari turpināt to izmantot anonīmi, vari <span class='plainlinks'>[$1 atgriezti
 'logout' => 'Iziet',
 'userlogout' => 'Iziet',
 'notloggedin' => 'Neesi iegājis',
+'userlogin-joinproject' => 'Pievienojieties {{SITENAME}}',
 'nologin' => 'Nav lietotājvārda? $1.',
 'nologinlink' => 'Reģistrējies',
 'createaccount' => 'Izveidot jaunu lietotāju',
 'gotaccount' => "Tev jau ir lietotājvārds? '''$1'''!",
 'gotaccountlink' => 'Dodies iekšā',
 'userlogin-resetlink' => 'Esat aizmirsis savu pieslēgšanās informāciju?',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Palīdzība ar pieslēgšanos]]',
+'userlogin-createanother' => 'Izveidot citu kontu',
+'createacct-join' => 'Ievadiet savu informāciju zemāk.',
+'createacct-another-join' => 'Ievadiet jaunā konta informāciju zemāk.',
+'createacct-emailrequired' => 'E-pasta adrese',
+'createacct-emailoptional' => 'E-pasta adrese (nav obligāta)',
+'createacct-email-ph' => 'Ievadiet savu e-pasta adresi',
+'createacct-another-email-ph' => 'Ievadiet e-pasta adresi',
 'createaccountmail' => 'Izmantot nejauši ģenerētu pagaidu paroli un nosūtīt to uz norādīto e-pasta adresi',
+'createacct-realname' => 'Īstais vārds (nav obligāts)',
 'createaccountreason' => 'Iemesls:',
+'createacct-reason' => 'Iemesls',
+'createacct-reason-ph' => 'Kāpēc jūs veidojat citu kontu',
+'createacct-captcha' => 'Drošības pārbaude',
+'createacct-imgcaptcha-ph' => 'Ievadiet tekstu, kuru jūs redzat augstāk',
+'createacct-submit' => 'Izveidot savu kontu',
+'createacct-another-submit' => 'Izveidot citu lietotāja kontu',
+'createacct-benefit-heading' => '{{SITENAME}} darbojas ar tādu cilvēku kā jūs ieguldījumu.',
+'createacct-benefit-body1' => '{{PLURAL:$1|labojums|labojumi}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|lapa|lapas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nesens dalībnieks|neseni dalībnieki}}',
 'badretype' => 'Tevis ievadītās paroles nesakrīt.',
 'userexists' => 'Ievadītais lietotājvārds jau ir aizņemts.
 Lūdzu, izvēlieties citu vārdu.',
 'loginerror' => 'Neveiksmīga ieiešana',
+'createacct-error' => 'Konta izveides kļūda',
 'createaccounterror' => 'Neizdevās izveidot kontu: $1',
 'nocookiesnew' => 'Lietotājvārds tika izveidots, bet tu neesi iegājis iekšā. {{SITENAME}} izmanto sīkdatnes (<i>cookies</i>), lai lietotāji varētu tajā ieiet. Tavs pārlūks nepieņem tās. Lūdzu, atļauj to pieņemšanu un tad nāc iekšā ar savu lietotājvārdu un paroli.',
 'nocookieslogin' => '{{SITENAME}} izmanto sīkdatnes (<i>cookies</i>), lai lietotāji varētu ieiet tajā. Diemžēl tavs pārlūks tos nepieņem. Lūdzu, atļauj to pieņemšanu un mēģini vēlreiz.',
@@ -514,8 +551,8 @@ Tādēļ šobrīd no šīs IP adreses vairs nevar izveidot jaunus kontus.',
 'accountcreatedtext' => 'Lietotāja konts priekš $1 tika izveidots.',
 'createaccount-title' => 'Lietotāja konta izveidošana {{grammar:lokatīvs|{{SITENAME}}}}',
 'usernamehasherror' => 'Lietotājvārds nevar saturēt hash simbolus',
-'login-throttled' => 'Tu esi veicis pārāk daudz ieiešanas mēģinājumus.
-Lūdzu uzgaidi pirms mēģini vēlreiz.',
+'login-throttled' => 'Jūs esat veicis pārāk daudz pieslēgšanās mēģinājumus.
+Lūdzu, uzgaidiet $1 pirms mēģiniet vēlreiz.',
 'login-abort-generic' => 'Jūsu pieteikšanās bija neveiksmīga — Darbība pārtraukta',
 'loginlanguagelabel' => 'Valoda: $1',
 
@@ -529,8 +566,7 @@ Lūdzu uzgaidi pirms mēģini vēlreiz.',
 'newpassword' => 'Jaunā parole',
 'retypenew' => 'Atkārto jauno paroli',
 'resetpass_submit' => 'Uzstādīt paroli un ieiet',
-'resetpass_success' => 'Parole nomainīta veiksmīgi!
-Notiek ieiešana...',
+'changepassword-success' => 'Jūsu parole tika nomainīta veiksmīgi!',
 'resetpass_forbidden' => 'Paroles nav iespējams nomainīt',
 'resetpass-no-info' => 'Jums ir nepieciešams ieiet, lai tūlīt piekļūtu šai lapai.',
 'resetpass-submit-loggedin' => 'Mainīt paroli',
@@ -542,6 +578,7 @@ Tu jau esi veiksmīgi nomainījis savu galveno paroli, vai arī esi pieprasījis
 
 # Special:PasswordReset
 'passwordreset' => 'Paroles atiestatīšana',
+'passwordreset-text-one' => 'Aizpildiet šo veidlapu, lai atiestatītu savu paroli.',
 'passwordreset-legend' => 'Atiestatīt paroli',
 'passwordreset-disabled' => 'Paroles atiestates šajā viki ir atspējotas.',
 'passwordreset-username' => 'Lietotājvārds:',
@@ -565,6 +602,9 @@ Pagaidu parole: $2',
 'changeemail-submit' => 'Mainīt e-pastu',
 'changeemail-cancel' => 'Atcelt',
 
+# Special:ResetTokens
+'resettokens-token-label' => '$1 (šībrīža vērtība: $2)',
+
 # Edit page toolbar
 'bold_sample' => 'Teksts treknrakstā',
 'bold_tip' => 'Teksts treknrakstā',
@@ -756,11 +796,14 @@ Netika sniegts paskaidrojums.',
 Izskatās, ka lapa ir dzēsta.',
 'edit-conflict' => 'Labošanas konflikts.',
 'edit-no-change' => 'Tavs labojums tika ignorēts, jo tekstā netika izdarītas izmaiņas.',
+'postedit-confirmation' => 'Jūsu labojums tika saglabāts.',
 'edit-already-exists' => 'Nevar izveidot jaunu lapu.
 Tā jau eksistē.',
 'defaultmessagetext' => 'Noklusētais ziņojuma teksts',
 'invalid-content-data' => 'Nederīgi satura dati',
 'content-not-allowed-here' => '"$1" saturs nav atļauts lapā [[$2]]',
+'editwarning-warning' => 'Atstājot šo lapu tu zaudēsi izdarītās izmaiņas. 
+Ja esi pieteicies, jūs vari atspējot šo brīdinājumu savās izvēlēs sadaļā "rediģēšana"',
 
 # Content models
 'content-model-wikitext' => 'vikiteksts',
@@ -914,6 +957,7 @@ $1",
 'compareselectedversions' => 'Salīdzināt izvēlētās versijas',
 'showhideselectedversions' => 'Rādīt/slēpt izvēlētās versijas',
 'editundo' => 'atcelt',
+'diff-empty' => '(Nav atšķirību)',
 'diff-multi' => '({{PLURAL:$1|Viena starpversija|$1 starpversijas}} no {{PLURAL:$2|viena lietotāja|$2 lietotājiem}} nav parādīta)',
 
 # Search results
@@ -936,7 +980,6 @@ $1",
 'searchmenu-legend' => 'Meklēšanas iespējas',
 'searchmenu-exists' => "'''Šajā projektā ir raksts ar nosaukumu \"[[:\$1]]\"'''",
 'searchmenu-new' => "'''Izveido rakstu \"[[:\$1]]\" šajā projektā!'''",
-'searchhelp-url' => 'Help:Saturs',
 'searchprofile-articles' => 'Rakstos',
 'searchprofile-project' => 'Palīdzības un projektu lapās',
 'searchprofile-images' => 'Multivides failos',
@@ -979,13 +1022,6 @@ $1",
 Pagaidām vari meklēt, izmantojot Google vai Yahoo.
 Ņem vērā, ka meklētāju indeksētais {{grammar:ģenitīvs|{{SITENAME}}}} saturs var būt novecojis.',
 
-# Quickbar
-'qbsettings' => 'Rīku joslas stāvoklis',
-'qbsettings-fixedleft' => 'Fiksēts pa kreisi',
-'qbsettings-fixedright' => 'Fiksēts pa labi',
-'qbsettings-floatingleft' => 'Peldošs pa kreisi',
-'qbsettings-floatingright' => 'Peldošs pa labi',
-
 # Preferences page
 'preferences' => 'Izvēles',
 'mypreferences' => 'Izvēles',
@@ -1018,7 +1054,6 @@ Pagaidām vari meklēt, izmantojot Google vai Yahoo.
 'resetprefs' => 'Atcelt nesaglabātās izmaiņas',
 'restoreprefs' => 'Atjaunot noklusētos uzstādījumus',
 'prefs-editing' => 'Rediģēšana',
-'prefs-edit-boxsize' => 'Labošanas loga izmērs.',
 'rows' => 'Rindiņu skaits:',
 'columns' => 'Simbolu skaits rindiņā:',
 'searchresultshead' => 'Meklēšana',
@@ -1028,9 +1063,6 @@ Pagaidām vari meklēt, izmantojot Google vai Yahoo.
 'recentchangesdays-max' => 'Ne vairāk kā $1 {{PLURAL:$1|diena|dienas}}',
 'recentchangescount' => 'Izmaiņu skaits, kuru rāda pēc noklusējuma:',
 'prefs-help-recentchangescount' => 'Šis parametrs attiecas uz pēdējo izmaiņu un hronoloģijas lapām, kā arī uz sistēmas žurnāliem',
-'prefs-help-watchlist-token' => 'Šajā laukā tu vari ievadīt slepenu kodu, lai izveidotu RSS barotni savam uzraugāmo lapu sarakstam.
-Izvēlies drošu kodu, jo katrs, kam ir zināms šis kods, varēs redzēt tavu uzraugāmo lapu sarakstu.
-Ja vēlies, tu vari izmantot šo nejauši uzģenerēto kodu: $1',
 'savedprefs' => 'Jūsu izvēles ir saglabātas.',
 'timezonelegend' => 'Laika josla:',
 'localtime' => 'Vietējais laiks:',
@@ -1059,7 +1091,6 @@ Ja vēlies, tu vari izmantot šo nejauši uzģenerēto kodu: $1',
 'prefs-custom-js' => 'Personīgais JS',
 'prefs-common-css-js' => 'Koplietojams CSS/JavaScript visās apdarēs:',
 'prefs-emailconfirm-label' => 'E-pasta statuss:',
-'prefs-textboxsize' => 'Rediģēšanas loga izmērs',
 'youremail' => 'Tava e-pasta adrese:',
 'username' => '{{GENDER:$1|Lietotājvārds}}:',
 'uid' => '{{GENDER:$1|Lietotāja|Lietotājas}} ID:',
@@ -1091,6 +1122,8 @@ Ja tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (
 'prefs-dateformat' => 'Datuma formāts',
 'prefs-timeoffset' => 'Laika nobīde',
 'prefs-advancedediting' => 'Vispārīgi uzstādījumi',
+'prefs-editor' => 'Redaktors',
+'prefs-preview' => 'Priekšskatījums',
 'prefs-advancedrc' => 'Papildus uzstādījumi',
 'prefs-advancedrendering' => 'Papildus uzstādījumi',
 'prefs-advancedsearchoptions' => 'Papildus uzstādījumi',
@@ -1249,9 +1282,11 @@ Ja tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|izmaiņa|izmaiņas}}',
+'enhancedrc-history' => 'vēsture',
 'recentchanges' => 'Pēdējās izmaiņas',
 'recentchanges-legend' => 'Pēdējo izmaiņu iespējas',
 'recentchanges-summary' => 'Šajā lapā ir uzskaitītas pēdējās izdarītās izmaiņas.',
+'recentchanges-noresult' => 'Norādītajā periodā šiem kritērijiem neatbilst neviena izmaiņa.',
 'recentchanges-feed-description' => 'Sekojiet līdzi jaunākajām izmaiņām vikijā izmantojot šo barotni.',
 'recentchanges-label-newpage' => 'Šī ir jaunizveidota lapa',
 'recentchanges-label-minor' => 'Šī ir maznozīmīga izmaiņa',
@@ -1287,7 +1322,6 @@ Ja tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (
 'recentchangeslinked-feed' => 'Saistītās izmaiņas',
 'recentchangeslinked-toolbox' => 'Saistītās izmaiņas',
 'recentchangeslinked-title' => 'Izmaiņas, kas saistītas ar "$1"',
-'recentchangeslinked-noresult' => 'Norādītajā laika periodā saistītajās lapās izmaiņu nebija.',
 'recentchangeslinked-summary' => "Šiet ir nesen izdarītās izmaiņas lapās, uz kurām ir saites no norādītās lapas (vai norādītajā kategorijā ietilpstošās lapas).
 Lapas, kas ir tavā [[Special:Watchlist|uzraugāmo rakstu sarakstā]] ir '''treknas'''.",
 'recentchangeslinked-page' => 'Lapas nosaukums:',
@@ -1473,7 +1507,6 @@ Atļauta ir tikai failu piekļuve.',
 'http-invalid-url' => 'Nederīgs URL: $1',
 'http-read-error' => 'HTTP nolasīšanas kļūda.',
 'http-timed-out' => 'HTTP pieprasījumam ir iestājies noilgums.',
-'http-host-unreachable' => 'URL nevarēja sasniegt.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL nevarēja sasniegt',
@@ -1498,6 +1531,10 @@ Atļauta ir tikai failu piekļuve.',
 'listfiles_size' => 'Izmērs',
 'listfiles_description' => 'Apraksts',
 'listfiles_count' => 'Versijas',
+'listfiles-show-all' => 'Iekļaut attēlus vecās versijas',
+'listfiles-latestversion' => 'Pašreizējā versija',
+'listfiles-latestversion-yes' => 'Jā',
+'listfiles-latestversion-no' => 'Nē',
 
 # File description page
 'file-anchor-link' => 'Attēls',
@@ -1582,6 +1619,11 @@ Apraksts ir [$2 faila apraksta lapā], kas ir parādīta zemāk.',
 # Random page
 'randompage' => 'Nejauša lapa',
 
+# Random page in category
+'randomincategory' => 'Nejauša lapa kategorijā',
+'randomincategory-invalidcategory' => '"$1" nav derīgs kategorijas nosaukums.',
+'randomincategory-selectcategory-submit' => 'Aiziet',
+
 # Random redirect
 'randomredirect' => 'Nejauša pāradresācijas lapa',
 
@@ -1605,12 +1647,6 @@ Apraksts ir [$2 faila apraksta lapā], kas ir parādīta zemāk.',
 'statistics-users-active-desc' => 'Lietotāji, kas ir veikuši jebkādu darbību {{PLURAL:$1|iepriekšējā dienā|iepriekšējās $1 dienās}}',
 'statistics-mostpopular' => 'Visvairāk skatītās lapas',
 
-'disambiguations' => 'Lapas, kuras norāda uz nozīmju atdalīšanas lapām',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => "Šeit esošajās lapās ir saite uz '''nozīmju atdalīšanas lapu'''.
-Šīs saites vajadzētu izlabot, lai tās vestu tieši uz attiecīgo lapu.<br />
-Lapu uzskata par nozīmju atdalīšanas lapu, ja tā satur veidni, uz kuru ir saite no [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop-submit' => 'Aiziet',
 
 'doubleredirects' => 'Divkāršas pāradresācijas lapas',
@@ -1833,10 +1869,9 @@ Ja vēlāk pārdomāsi un nevēlēsies vairs uzraudzīt šo lapu, klikšķini uz
 'unwatchthispage' => 'Pārtraukt uzraudzīšanu',
 'notanarticle' => 'Nav satura lapa',
 'notvisiblerev' => 'Cita lietotāja pēdējā versija ir izdzēsta',
-'watchnochange' => 'Neviena no tevis uzraudzītajām lapām nav mainīta parādītajā laika posmā.',
 'watchlist-details' => '(Tu uzraugi $1 {{PLURAL:$1|lapu|lapas}}, neieskaitot diskusiju lapas.)',
 'wlheader-enotif' => 'E-pasta paziņojumi ir ieslēgti.',
-'wlheader-showupdated' => "* Lapas, kuras ir tikušas izmainītas, kopš tu tās pēdējoreiz apskatījies, te rādās ar '''pustrekniem''' burtiem",
+'wlheader-showupdated' => "Lapas, kuras ir tikušas izmainītas, kopš tu tās pēdējoreiz apskatījies, te rādās ar '''pustrekniem''' burtiem",
 'watchlistcontains' => 'Tavā uzraugāmo lapu sarakstā ir $1 {{PLURAL:$1|lapa|lapas}}.',
 'iteminvalidname' => "Problēma ar '$1' vienību, nederīgs nosaukums...",
 'wlshowlast' => 'Parādīt izmaiņas pēdējo $1 stundu laikā vai $2 dienu laikā, vai arī $3.',
@@ -1904,10 +1939,12 @@ Papildinformācija:
 'deletecomment' => 'Iemesls:',
 'deleteotherreason' => 'Cits/papildu iemesls:',
 'deletereasonotherlist' => 'Cits iemesls',
-'deletereason-dropdown' => '*Izplatīti dzēšanas iemesli
-** Autora pieprsījums
+'deletereason-dropdown' => '* Izplatīti dzēšanas iemesli
+** Spams
+** Vandālisms
 ** Autortiesību pārkāpums
-** Vandālisms',
+** Autora pieprasījums
+** Nederīga pāradresācija',
 'delete-edit-reasonlist' => 'Izmainīt dzēšanas iemeslus',
 'delete-toobig' => 'Šai lapai ir liela izmaiņu hronoloģija, vairāk nekā $1 {{PLURAL:$1|versija|versijas}}.
 Šādu lapu dzēšana ir atslēgta, lai novērstu nejaušus traucējumus {{grammar:lokatīvs|{{SITENAME}}}}.',
@@ -2044,6 +2081,7 @@ $1',
 # Namespace form on various pages
 'namespace' => 'Vārdtelpa:',
 'invert' => 'Izvēlēties pretēji',
+'namespace_association' => 'Saistītā vārdtelpa',
 'blanknamespace' => '(Pamatlapa)',
 
 # Contributions
@@ -2196,10 +2234,7 @@ Tas, iespējams, jau ir atbloķēts.',
 'ipb_blocked_as_range' => 'Kļūda: IP $1 nav bloķēta tieši, tāpēc to nevar atbloķēt.
 Tā ir bloķēta kā daļa no IP adrešu diapazona $2, kuru var atbloķēt.',
 'ip_range_invalid' => 'Nederīgs IP diapazons',
-'blockme' => 'Bloķēt mani',
 'proxyblocker' => 'Starpniekservera bloķētājs',
-'proxyblocker-disabled' => 'Šī funkcija ir atspējota.',
-'proxyblocksuccess' => 'Darīts.',
 'cant-block-while-blocked' => 'Tu nevari bloķēt citus lietotājus, kamēr pats esi bloķēts.',
 'ipbblocked' => 'Tu nevar bloķēt vai atbloķēt lietotājus, jo Tu pats esi bloķēts',
 'ipbnounblockself' => 'Tev nav atļauts sevi atbloķēt',
@@ -2601,11 +2636,12 @@ Pārējie lauki, pēc noklusējuma, būs paslēpti.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'platums',
 'exif-imagelength' => 'augstums',
 'exif-bitspersample' => 'biti komponentē',
 'exif-compression' => 'Saspiešanas veids',
+'exif-photometricinterpretation' => 'Pikseļu sastāvs',
 'exif-orientation' => 'Orientācija',
 'exif-samplesperpixel' => 'Komponentu skaits',
 'exif-planarconfiguration' => 'Datu izkārtojums',
@@ -2732,7 +2768,7 @@ Pārējie lauki, pēc noklusējuma, būs paslēpti.
 'exif-organisationinimage' => 'Attēlotā organizācija',
 'exif-personinimage' => 'Attēlotā persona',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nekompresēts',
 
 'exif-copyrighted-true' => 'Ar autortiesībām',
@@ -3039,16 +3075,18 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 'version-license' => 'Licence',
 'version-poweredby-credits' => "Šis viki darbojas ar '''[//www.mediawiki.org/ MediaWiki]''' programmatūru, autortiesības © 2001-$1 $2.",
 'version-poweredby-others' => 'citi',
+'version-poweredby-translators' => 'translatewiki.net tulkotāji',
 'version-credits-summary' => 'Mēs vēlētos izteikt atzinību šīm personām par viņu ieguldījumu [[Special:Version|MediaWiki]].',
 'version-software' => 'Instalētā programmatūra',
 'version-software-product' => 'Produkts',
 'version-software-version' => 'Versija',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Failu adreses',
-'filepath-page' => 'Fails:',
-'filepath-submit' => 'Atrast',
+# Special:Redirect
+'redirect-value' => 'Vērtība:',
+'redirect-user' => 'Lietotāja ID',
+'redirect-file' => 'Faila nosaukums',
+'redirect-not-exists' => 'Vērtība nav atrasta',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Meklēt failu kopijas',
@@ -3087,12 +3125,16 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 'tags' => 'Derīgas izmaiņu iezīmes',
 'tag-filter' => '[[Special:Tags|Iezīmju]] filtrs:',
 'tag-filter-submit' => 'Filtrs',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Iezīme|Iezīmes}}]]: $2)',
 'tags-title' => 'Iezīmes',
 'tags-intro' => 'Šajā lapā uzskaitītas iezīmes, ar kurām programmatūra var atzīmēt labojumus, un to nozīme.',
 'tags-tag' => 'Iezīmes nosaukums',
 'tags-display-header' => 'Izmainīto sarakstu izskats',
 'tags-description-header' => 'Nozīmes pilns apraksts',
+'tags-active-header' => 'Aktīvs?',
 'tags-hitcount-header' => 'Iezīmētās izmaiņas',
+'tags-active-yes' => 'Jā',
+'tags-active-no' => 'Nē',
 'tags-edit' => 'labot',
 'tags-hitcount' => '$1 {{PLURAL:$1|izmaiņa|izmaiņas}}',
 
@@ -3114,6 +3156,7 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 Šai vietnei ir radušās tehniskas problēmas.',
 'dberr-again' => 'Uzgaidiet dažas minūtes un pārlādējiet šo lapu.',
 'dberr-info' => '(Nevar sazināties ar datubāzes serveri: $1)',
+'dberr-info-hidden' => '(Nevar sazināties ar datubāzes serveri)',
 'dberr-usegoogle' => 'Pa to laiku Jūs varat izmantot Google meklēšanu.',
 'dberr-outofdate' => 'Ņemiet vērā, ka mūsu satura indeksācija var būt novecojusi.',
 'dberr-cachederror' => 'Šī ir lapas agrāk saglabātā kopija, tā var nebūt atjaunināta.',
@@ -3129,6 +3172,9 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 'htmlform-submit' => 'Iesniegt',
 'htmlform-reset' => 'Atcelt izmaiņas',
 'htmlform-selectorother-other' => 'Citi',
+'htmlform-no' => 'Nē',
+'htmlform-yes' => 'Jā',
+'htmlform-chosen-placeholder' => 'Izvēlieties iespēju',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 ar pilnteksta meklēšanas atbalstu',
@@ -3187,4 +3233,10 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 'api-error-unknownerror' => 'Nezināma kļūda: "$1"',
 'api-error-uploaddisabled' => 'Augšupielāde šajā wiki  ir atslēgta.',
 
+# Limit report
+'limitreport-title' => 'Parsētāja profilēšanas dati:',
+'limitreport-postexpandincludesize-value' => '$1/$2 baiti',
+'limitreport-templateargumentsize' => 'Veidnes argumenta izmērs',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|baits|baiti}}',
+
 );
diff --git a/languages/messages/MessagesLzh.php b/languages/messages/MessagesLzh.php
index 30c67603..c57b0a5b 100644
--- a/languages/messages/MessagesLzh.php
+++ b/languages/messages/MessagesLzh.php
@@ -180,9 +180,6 @@ $messages = array(
 'tog-shownumberswatching' => '放哨有',
 'tog-oldsig' => '覽原署名：',
 'tog-fancysig' => '署以本碼待之（免自連）',
-'tog-externaleditor' => '它器修文（高人用，需設之。[//www.mediawiki.org/wiki/Manual:External_editors 閱。]）',
-'tog-externaldiff' => '它器修異（高人用，需設之。[//www.mediawiki.org/wiki/Manual:External_editors 閱。]）',
-'tog-showjumplinks' => '鏈往字',
 'tog-uselivepreview' => '即覽嚐鮮（JavaScript）',
 'tog-forceeditsummary' => '漏概醒之',
 'tog-watchlisthideown' => '不哨己文',
@@ -196,6 +193,7 @@ $messages = array(
 'tog-showhiddencats' => '示隱類',
 'tog-noconvertlink' => '非轉鍵題',
 'tog-norollbackdiff' => '轉後略異',
+'tog-useeditwarning' => '離而未存，示吾',
 
 'underline-always' => '恆',
 'underline-never' => '絕',
@@ -259,6 +257,18 @@ $messages = array(
 'oct' => '十月',
 'nov' => '十一月',
 'dec' => '十二月',
+'january-date' => '正月 $1',
+'february-date' => '二月$1日',
+'march-date' => '三月$1日',
+'april-date' => '四月$1日',
+'may-date' => '五月$1日',
+'june-date' => '六月$1日',
+'july-date' => '七月$1日',
+'august-date' => '八月$1日',
+'september-date' => '九月$1日',
+'october-date' => '十月$1日',
+'november-date' => '十一月$1日',
+'december-date' => '十二月$1日',
 
 # Categories related messages
 'pagecategories' => '$1類',
@@ -340,6 +350,7 @@ $messages = array(
 'create-this-page' => '立',
 'delete' => '刪',
 'deletethispage' => '刪',
+'undeletethispage' => '反刪此頁',
 'undelete_short' => '還$1已刪',
 'viewdeleted_short' => '察$1已刪',
 'protect' => '緘',
@@ -383,7 +394,7 @@ $1',
 'pool-queuefull' => '池隊滿之',
 'pool-errorunknown' => '未明之錯',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '述{{SITENAME}}',
 'aboutpage' => 'Project:述',
 'copyright' => '文奉$1行。',
@@ -393,7 +404,6 @@ $1',
 'disclaimers' => '免責宣',
 'disclaimerpage' => 'Project:免責宣',
 'edithelp' => '助纂塾',
-'edithelppage' => 'Help:纂',
 'helppage' => 'Help:目錄',
 'mainpage' => '卷首',
 'mainpage-description' => '卷首',
@@ -467,15 +477,6 @@ $1',
 # General errors
 'error' => '有誤',
 'databaseerror' => '庫藏誤然',
-'dberrortext' => '問庫語誤，或軟體瑕焉。
-末語道：
-<blockquote><tt>$1</tt></blockquote>
-內此函式"<tt>$2</tt>".
-庫藏報有誤"<tt>$3: $4</tt>"。',
-'dberrortextcl' => '庫藏問語有誤，末道：
-"$1"
-內此函式"$2".
-庫藏報有誤"$3: $4"',
 'laggedslavemode' => '警示，此頁不新',
 'readonly' => '鎖庫藏',
 'enterlockreason' => '何以鎖之？何日啟之？',
@@ -517,7 +518,6 @@ $1',
 'viewsourcetext' => '爾可視及複之本頁之原始碼。',
 'protectedinterface' => '此頁司版，錮之以遠濫。',
 'editinginterface' => "'''警示：'''此頁司版，一髮牽身，惠慎之。如譯之，可慮[//translatewiki.net/wiki/Main_Page?setlang=zh-hant translatewiki.net]也，為MediaWiki軟件本地化之計劃也。",
-'sqlhidden' => '（SQL隱然）',
 'cascadeprotected' => '此頁"迭緘"矣。$1頁牽連如下：
 $2',
 'namespaceprotected' => "子權未逮，莫能纂'''$1'''。",
@@ -541,10 +541,19 @@ $2',
 
 請更簿註乎[[Special:Preferences|此]]。',
 'yourname' => '名',
+'userlogin-yourname' => '簿名',
+'userlogin-yourname-ph' => '輸簿名',
+'createacct-another-username-ph' => '輸簿名',
 'yourpassword' => '符節',
+'userlogin-yourpassword' => '符節',
+'userlogin-yourpassword-ph' => '輸子符節',
+'createacct-yourpassword-ph' => '輸一符節',
 'yourpasswordagain' => '復核節',
+'createacct-yourpasswordagain' => '訂子符節',
+'createacct-yourpasswordagain-ph' => '復輸符節',
 'remembermypassword' => '吾之簿通越（達至$1日）',
-'securelogin-stick-https' => '登後仍以HTTPS通接',
+'userlogin-remembermypassword' => '記吾',
+'userlogin-signwithsecure' => '以安全伺服登簿',
 'yourdomainname' => '子之網域',
 'password-change-forbidden' => '符節不能改乎此維基也。',
 'externaldberror' => '認庫之錯或禁更爾之外簿。',
@@ -556,17 +565,35 @@ $2',
 'logout' => '去簿',
 'userlogout' => '去簿',
 'notloggedin' => '尚未登簿',
+'userlogin-noaccount' => '無簿乎？',
+'userlogin-joinproject' => '入{{SITENAME}}',
 'nologin' => '無簿乎？往$1。',
 'nologinlink' => '增簿',
 'createaccount' => '增簿',
 'gotaccount' => '有簿矣哉？往$1。',
 'gotaccountlink' => '登簿',
 'userlogin-resetlink' => '君忘登簿所需爾？',
+'userlogin-resetpassword-link' => '輸子符節',
+'helplogin-url' => 'Help:登簿',
+'createacct-emailrequired' => '電郵',
+'createacct-emailoptional' => '電郵 （可選）',
 'createaccountmail' => '同郵',
+'createacct-realname' => '實名（選）',
 'createaccountreason' => '因：',
+'createacct-reason' => '因：',
+'createacct-reason-ph' => '何為子另立一簿乎？',
+'createacct-captcha' => '安檢',
+'createacct-imgcaptcha-ph' => '輸上之文字',
+'createacct-submit' => '增簿',
+'createacct-another-submit' => '再立一簿',
+'createacct-benefit-heading' => '吾等立{{SITENAME}}者，或黔首，或專戶。',
+'createacct-benefit-body1' => '纂',
+'createacct-benefit-body2' => '頁',
+'createacct-benefit-body3' => '是月纂者',
 'badretype' => '符節不合也。',
 'userexists' => '簿名存矣，惠更之。',
 'loginerror' => '登簿誤然',
+'createacct-error' => '建簿未成',
 'createaccounterror' => '無增簿：$1',
 'nocookiesnew' => '{{SITENAME}}簿增而未登，惠准cookies後再登之。',
 'nocookieslogin' => '登簿{{SITENAME}}須cookies，惠准之後登。',
@@ -632,7 +659,7 @@ $2',
 'newpassword' => '新符節：',
 'retypenew' => '重察新符節：',
 'resetpass_submit' => '設符再登',
-'resetpass_success' => '爾之符節已改！
+'changepassword-success' => '爾之符節已改！
 現登簿中...',
 'resetpass_forbidden' => '無改符節',
 'resetpass-no-info' => '爾須登簿後方進此頁。',
@@ -645,6 +672,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => '重設符節',
+'passwordreset-text-one' => '慾更符節，填此佇列',
 'passwordreset-legend' => '重設符節',
 'passwordreset-username' => '簿名：',
 'passwordreset-domain' => '域：',
@@ -807,6 +835,7 @@ $2',
 刪之也。',
 'edit-conflict' => '纂突。',
 'edit-no-change' => '爾之纂已略，由字無改也。',
+'postedit-confirmation' => '汝之纂已成',
 'edit-already-exists' => '不建新頁。
 已存也。',
 'defaultmessagetext' => '慣話文',
@@ -1020,7 +1049,6 @@ $1",
 'searchmenu-legend' => '尋選',
 'searchmenu-exists' => "'''在此wiki中有頁為\"[[:\$1]]\"。'''",
 'searchmenu-new' => "'''在此wiki上建頁\"[[:\$1]]\"！'''",
-'searchhelp-url' => 'Help:目錄',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|查此首之頁]]',
 'searchprofile-articles' => '容',
 'searchprofile-project' => '助題',
@@ -1062,9 +1090,6 @@ $1",
 'search-external' => '外尋',
 'searchdisabled' => '{{SITENAME}}因性能而停用之。可Gooogle查之，乃之過時也。',
 
-# Quickbar
-'qbsettings-none' => '無',
-
 # Preferences page
 'preferences' => '簿註',
 'mypreferences' => '簿註',
@@ -1092,7 +1117,6 @@ $1",
 'resetprefs' => '棄',
 'restoreprefs' => '重修',
 'prefs-editing' => '在修',
-'prefs-edit-boxsize' => '修框尺',
 'rows' => '行：',
 'columns' => '列：',
 'searchresultshead' => '尋',
@@ -1103,9 +1127,6 @@ $1",
 'recentchangesdays-max' => '最大有$1',
 'recentchangescount' => '修著凡幾︰',
 'prefs-help-recentchangescount' => '含近易、史與誌。',
-'prefs-help-watchlist-token' => '添匙參爾之RSS哨。
-且人知匙，可閱矣之，擇全之值也。
-任成之值，爾可選之：$1',
 'savedprefs' => '簿註書矣',
 'timezonelegend' => '時區：',
 'localtime' => '本地時：',
@@ -1135,7 +1156,6 @@ $1",
 'prefs-common-css-js' => '共CSS/JavaScript於面版：',
 'prefs-reset-intro' => '爾用頁重設至預之設。無修之也。',
 'prefs-emailconfirm-label' => '確郵：',
-'prefs-textboxsize' => '纂框量',
 'youremail' => '郵：',
 'username' => '簿名：',
 'uid' => '編號︰',
@@ -1164,6 +1184,8 @@ $1",
 'prefs-dateformat' => '日格',
 'prefs-timeoffset' => '偏時',
 'prefs-advancedediting' => '進',
+'prefs-editor' => '纂者',
+'prefs-preview' => '草覽',
 'prefs-advancedrc' => '進',
 'prefs-advancedrendering' => '進',
 'prefs-advancedsearchoptions' => '進',
@@ -1366,7 +1388,6 @@ $1",
 'recentchangeslinked-feed' => '援引',
 'recentchangeslinked-toolbox' => '援引',
 'recentchangeslinked-title' => '「$1」援引近易',
-'recentchangeslinked-noresult' => '限期內無近易。',
 'recentchangeslinked-summary' => "此奇頁乃列''由''頁援之近易（或對類之員）。
 有[[Special:Watchlist|爾有哨]]者'''粗體'''。",
 'recentchangeslinked-page' => '頁名：',
@@ -1510,7 +1531,6 @@ $1',
 'http-read-error' => 'HTTP讀錯。',
 'http-timed-out' => 'HTTP求之過時也。',
 'http-curl-error' => '取網址現錯之：$1',
-'http-host-unreachable' => '無達網址之。',
 'http-bad-status' => 'HTTP求時現問：$1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1652,10 +1672,6 @@ $1',
 'statistics-users-active-desc' => '早$1日前更動之簿',
 'statistics-mostpopular' => '燴炙',
 
-'disambiguations' => '釋義',
-'disambiguationspage' => 'Template:弭誤解',
-'disambiguations-text' => '頁下引[[MediaWiki:Disambiguationspage]]模，求釋義，宜正題之。',
-
 'doubleredirects' => '窮渡',
 'doubleredirectstext' => '頁下窮渡，迭列以示。首尾宿合，宜正渡之。
 <del>劃</del>已解之。',
@@ -1869,7 +1885,6 @@ $1',
 'unwatchthispage' => '撤此哨',
 'notanarticle' => '此頁非文',
 'notvisiblerev' => '上中異簿之審已刪矣',
-'watchnochange' => '皆無易也',
 'watchlist-details' => '哨上有$1，不含議論。',
 'wlheader-enotif' => '*准報信。',
 'wlheader-showupdated' => "*易者'''粗體'''。",
@@ -2197,9 +2212,7 @@ $1',
 'ipb_blocked_as_range' => '錯：該IP $1 無直禁也，無赦之。唯它在 $2 之範禁內，其範可赦之。',
 'ip_range_invalid' => 'IP址圍不格',
 'ip_range_toolarge' => '大於 /$1 之禁段乃無容也。',
-'blockme' => '自禁',
 'proxyblocker' => '禁Proxy',
-'proxyblocksuccess' => '成矣。',
 'cant-block-while-blocked' => '爾然被禁，勿施於人。',
 'cant-see-hidden-user' => '簿禁或藏矣。
 爾無藏之權，無視纂禁也。',
@@ -2448,27 +2461,16 @@ $1',
 
 # Stylesheets
 'common.css' => '/* 此之 CSS 用於全面也 */',
-'standard.css' => '/* 此之 CSS 用於經典面之簿也 */',
-'nostalgia.css' => '/* 此之 CSS 用於懷古面之簿也 */',
 'cologneblue.css' => '/* 此之 CSS 用於馨藍面之簿也 */',
 'monobook.css' => '/* 此之 CSS 用於單書面之簿也 */',
-'myskin.css' => '/* 此之 CSS 用於吾風面之簿也 */',
-'chick.css' => '/* 此之 CSS 用於窈窕面之簿也 */',
-'simple.css' => '/* 此之 CSS 用於簡明面之簿也 */',
 'modern.css' => '/* 此之 CSS 用於時髦面之簿也 */',
 'vector.css' => '/* 此之 CSS 用於動力面之簿也 */',
 'print.css' => '/* 此之 CSS 用於印之出力也 */',
-'handheld.css' => '/* 此之 CSS 用於 $wgHandheldStyle 之手置面也 */',
 
 # Scripts
 'common.js' => '/* 此之JavaScript將載於全簿之頁。 */',
-'standard.js' => '/* 此之JavaScript將載於用經典面之簿 */',
-'nostalgia.js' => '/* 此之JavaScript將載於用懷古面之簿 */',
 'cologneblue.js' => '/* 此之JavaScript將載於用馨藍面之簿 */',
 'monobook.js' => '/* 此之JavaScript將載於用單書面之簿 */',
-'myskin.js' => '/* 此之JavaScript將載於用吾風面之簿 */',
-'chick.js' => '/* 此之JavaScript將載於用窈窕面之簿 */',
-'simple.js' => '/* 此之JavaScript將載於用簡明面之簿 */',
 'modern.js' => '/* 此之JavaScript將載於用時髦面之簿 */',
 'vector.js' => '/* 此之JavaScript將載於用動力面之簿 */',
 
@@ -2494,13 +2496,8 @@ $1',
 'spam_blanking' => '審皆鏈$1，遂令白頁。',
 
 # Skin names
-'skinname-standard' => '經典',
-'skinname-nostalgia' => '懷古',
 'skinname-cologneblue' => '馨藍',
 'skinname-monobook' => '單書',
-'skinname-myskin' => '吾風',
-'skinname-chick' => '窈窕',
-'skinname-simple' => '簡明',
 'skinname-modern' => '時髦',
 'skinname-vector' => '動力',
 
@@ -2592,7 +2589,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '寬',
 'exif-imagelength' => '長',
 'exif-photometricinterpretation' => '像素構成',
@@ -2786,7 +2783,6 @@ $5
 'version-other' => '他',
 'version-mediahandlers' => '媒處',
 'version-hooks' => '鈎',
-'version-extension-functions' => '展函',
 'version-parser-extensiontags' => '語展標',
 'version-parser-function-hooks' => '語函鈎',
 'version-hook-name' => '鈎名',
@@ -2804,12 +2800,6 @@ MediaWiki乃為用之發，無擔之責也；亦無售目之默擔也。參GNU
 'version-software-product' => '品',
 'version-software-version' => '版',
 
-# Special:FilePath
-'filepath' => '檔路',
-'filepath-page' => '檔名：',
-'filepath-submit' => '往',
-'filepath-summary' => '此奇頁取一檔之整路。圖以全解像示之，他檔會以有關之程式啟動也。',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '擇重檔',
 'fileduplicatesearch-summary' => '以重檔之切去查重也。',
diff --git a/languages/messages/MessagesMai.php b/languages/messages/MessagesMai.php
index 8d4ceaaf..70e2146c 100644
--- a/languages/messages/MessagesMai.php
+++ b/languages/messages/MessagesMai.php
@@ -58,9 +58,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ध्यान राखैबला प्रयोक्ताक संख्या',
 'tog-oldsig' => 'अखुनका दस्खत',
 'tog-fancysig' => 'हस्ताक्षरकें विकिटेक्सटक रूपमे देखू (स्वचालित श्रृंखला हीन)',
-'tog-externaleditor' => "↓पूर्वनिर्धारित रूपेँ बाह्य सम्पादक क' उपयोग करू (केवल विशेषज्ञसभक लेल, एकरा लेल संगणक पर विशेष सेटिंग चाही। [//www.mediawiki.org/wiki/Manual:External_editors आओर जानकारी।])",
-'tog-externaldiff' => 'पुरान संस्करणमे अंतर देखेबाक हेतु पूर्वनिविष्ट रूपमे बाहरक परिवर्तनक प्रयोग करू',
-'tog-showjumplinks' => 'करू "तड़पान" भेटैबला लिंक सभ',
 'tog-uselivepreview' => 'करू चल पूर्वावलोकन (जावास्क्रिप्ट चाही) (प्रायोगिक)',
 'tog-forceeditsummary' => 'हमरा सचेत करू जखन हम खाली सम्पादम सारांशमे जाइ',
 'tog-watchlisthideown' => 'हमर साकांक्ष सूचीसँ हमर सम्पादन नुकाउ',
@@ -257,7 +254,7 @@ $1',
 'pool-queuefull' => 'प्रतीक्षा-पाँती पौती भरल',
 'pool-errorunknown' => 'अज्ञात भ्रम',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'विषयमे {{SITENAME}}',
 'aboutpage' => 'Project:विवरण',
 'copyright' => '$1क अंतर्गत विषय सूची उपलब्ध अछि',
@@ -267,7 +264,6 @@ $1',
 'disclaimers' => 'अनाधिकार घोषणा',
 'disclaimerpage' => 'Project:अनाधिकार घोषणा',
 'edithelp' => 'संपादन सहयोग',
-'edithelppage' => 'Help:संपादन',
 'helppage' => 'Help: विषय सूची',
 'mainpage' => 'सम्मुख पन्ना',
 'mainpage-description' => 'सम्मुख पृष्ठ',
@@ -294,7 +290,6 @@ $1',
 'newmessagesdifflink' => 'अन्तिम परिवर्तन',
 'youhavenewmessagesmulti' => '$1 पर अहाँ लेल नव सन्देश अछि',
 'editsection' => 'संपादन करू',
-'editsection-brackets' => '[$1]',
 'editold' => 'सम्पादित करू',
 'viewsourceold' => 'जड़ि देखू',
 'editlink' => 'सम्पादन करू',
@@ -345,17 +340,6 @@ $1',
 # General errors
 'error' => 'भ्रम',
 'databaseerror' => 'दत्तनिधि भ्रम',
-'dberrortext' => 'एकटा दत्तनिधि अभ्यर्थना क्रम भंग भेल अछि।
-ई तंत्रांशमे एकटा दोषक संकेत अछि।
-अन्तिम बेर प्रयास कएल दत्तनिधि अभ्यर्थना रहए:
-<blockquote><tt>$1</tt></blockquote>
-प्रकार्यक अन्तर्गत "<tt>$2</tt>". ।
-दत्तनिधि ई दोष देखेलक "<tt>$3: $4</tt>" ।',
-'dberrortextcl' => 'एकटा दत्तनिधि अभ्यर्थना क्रम भंग भेल अछि।
-अन्तिम बेर प्रयास कएल दत्तनिधि अभ्यर्थना अछि:
-"$1"
-"$2" प्रकार्यक अन्तर्गत।
-दत्तनिधि दोष देखेलक "$3: $4"',
 'laggedslavemode' => "'''चेतौनी:''' पन्नापर सम्भव जे अद्यतन परिवर्तन नै हुअए।",
 'readonly' => 'दत्तनिधि प्रतिबन्धित',
 'enterlockreason' => 'प्रतिबन्ध लेल कारण बताउ, संगमे एकटा अंदाज सेहो बताउ जे कखन ई प्रतिबन्ध हटाएल जाएत।',
@@ -405,7 +389,6 @@ $1',
 'editinginterface' => "'''चेतौनी''' अहाँ एकटा एहेन पन्नाक सम्पादन कऽ रहल छी जे तंत्रांशक मध्यस्थ पन्नाकेँ पाठ देबा लेल प्रयोग भऽ रहल अछि।
 ऐ पन्नामे परिवर्तन दोसर प्रयोक्ता लेल प्रयोक्ता मध्यस्थक रूपमे परिवर्तन करत।
 अनुवाद लेल [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] जाउ, मीडियाविकी स्थानीयकरण परियोजनापर।",
-'sqlhidden' => '(नुकाएल एस.क्यू.एल. अभ्यर्थना)',
 'cascadeprotected' => 'ऐ पन्नाक सम्पादन सम्भव नै अछि, कारण ई ऐ मे सम्मिलित अछि, {{PLURAL:$1|पन्ना, जे अछि|पन्ना, से सभ अछि}} सुरक्षित अछि "तराउपड़ी" विकल्प खोललाक बाद:
 $2',
 'namespaceprotected' => "अहाँकेँ '''$1''' नाम-पेटारमे सम्पादनक अनुमति नै अछि।",
@@ -429,7 +412,6 @@ $2',
 'yourpassword' => 'कूटशब्द:',
 'yourpasswordagain' => 'कूटशब्द फेरसँ टाइप करू:',
 'remembermypassword' => 'हमर सम्प्रवेश ऐ गवेषकपर मोन राखू (बेशीसँ बेशी $1 {{PLURAL:$1|दिन|दिन}})',
-'securelogin-stick-https' => 'सम्प्रवेशक बाद एच.टी.टी.पी.एस.क लागिमे रहू',
 'yourdomainname' => 'अहाँक प्रभावक्षेत्र:',
 'externaldberror' => 'खाहे सत्यापन दतांश भ्रम छल वा अहाँ अपन बाह्य खाताकेँ अद्यतन करबामे असमर्थ छी।',
 'login' => 'सम्प्रवेश',
@@ -529,7 +511,7 @@ $2',
 'newpassword' => 'नव कूटशब्द',
 'retypenew' => 'नव कूटशब्द फेरसँ टंकित करू',
 'resetpass_submit' => 'कूटशब्द बनाउ आ सम्प्रवेश करू',
-'resetpass_success' => 'अहाँक कूटशब्द सफलतासँ बदलि देल गेल!
+'changepassword-success' => 'अहाँक कूटशब्द सफलतासँ बदलि देल गेल!
 आब अहाँकेँ सम्प्रवेशित कऽ रहल छी...',
 'resetpass_forbidden' => 'कूटशब्द सभ नै बदलल जा सकैए।',
 'resetpass-no-info' => 'अहाँकेँ ऐ पन्नाकेँ पढ़बाले सम्प्रवेशित हुअए पड़त।',
@@ -541,10 +523,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'कूटशब्द फेरसँ बनाउ',
-'passwordreset-text' => 'ई-पत्र द्वारा अपन खाता विवरणक स्मरण प्राप्त करबा लेल ऐ फॉर्मकेँ भरू।',
 'passwordreset-legend' => 'कूटशब्द फेरसँ बनाउ',
 'passwordreset-disabled' => 'कूटशब्द फेरसँ बनाएब ऐ विकीपर अक्षम कएल अछि।',
-'passwordreset-pretext' => '{{PLURAL:$1||नीचाँक दत्तांशक एकटा भागक प्रविष्टि करू}}',
 'passwordreset-username' => 'प्रयोक्तानाम',
 'passwordreset-domain' => 'क्षेत्र:',
 'passwordreset-capture' => 'परिणाम ई-पत्र देखू?',
@@ -994,7 +974,6 @@ $3 द्वारा देल कारण अछि ''$2''",
 'searchmenu-legend' => 'खोज विकल्प',
 'searchmenu-exists' => "'''ऐ विकीपर एकटा पन्ना अछि \"[[:\$1]]\" नामसँ।'''",
 'searchmenu-new' => "''' पन्ना निर्माण \"[[:\$1]]\" ऐ विकीपर !'''",
-'searchhelp-url' => 'Help: विषय सूची',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ऐ उपसर्गक पन्ना सभकेँ देखू]]',
 'searchprofile-articles' => 'अनुक्रम पन्ना सभ',
 'searchprofile-project' => 'सहायता आ परियोजना पन्ना सभ',
@@ -1039,15 +1018,6 @@ $3 द्वारा देल कारण अछि ''$2''",
 अहाँक गूगलक माध्यमसँ ऐ बीच ताकि सकै छी।
 मोन राखू जे तकर विवरणी {{अन्तर्जाल}} सामिग्री समयातीत भऽ सकैए।',
 
-# Quickbar
-'qbsettings' => 'त्वरित दृश्य',
-'qbsettings-none' => 'कोनो नै',
-'qbsettings-fixedleft' => 'वाम कात सटल',
-'qbsettings-fixedright' => 'दहिन दिस सटल',
-'qbsettings-floatingleft' => 'वाम कात घुमैत',
-'qbsettings-floatingright' => 'दहिन कात घुमैत',
-'qbsettings-directionality' => 'कीलित, अहाँक भाषाक लिपि दिशा-निर्देशपर आधारित',
-
 # Preferences page
 'preferences' => 'विकल्प',
 'mypreferences' => 'खासमखास',
@@ -1079,7 +1049,6 @@ $3 द्वारा देल कारण अछि ''$2''",
 'resetprefs' => 'बिन सुरक्षितकेँ हटाउ',
 'restoreprefs' => 'सभटा पूर्वनिर्धारित चयनकेँ फेरसँ आनू',
 'prefs-editing' => 'सम्पादन कऽ रहल छी',
-'prefs-edit-boxsize' => 'सम्पादन खिड़कीक आकार',
 'rows' => 'पाँती सभ',
 'columns' => 'स्तम्भ सभ',
 'searchresultshead' => 'ताकू',
@@ -1090,9 +1059,6 @@ $3 द्वारा देल कारण अछि ''$2''",
 'recentchangesdays-max' => 'बेसीसँ बेसी $1 {{PLURAL:$1|दिन|दिन}}',
 'recentchangescount' => 'पूर्वनिर्धारित रूपेँ एतेक सम्पादन देखाएल गेल:',
 'prefs-help-recentchangescount' => 'ऐ मे सम्मिलित अछि आइ-काल्हिक परिवर्तन, पन्नाक इतिहास आ वृत्तलेख',
-'prefs-help-watchlist-token' => 'ऐ क्षेत्रमे एकटा गुप्त चाभीसँ भरलापर अहाँक साकांक्ष सूची लेल एकटा आर.एस.एस.फीडक निर्माण हएत।
-जकरा लग ऐ क्षेत्रक ई चाभी छै ओ अहाँक साकांक्ष सूचीकेँ पढ़ि सकता, से एकटा सुरक्षित मान चुनू।
-एतए एकटा अनियत रूपेँ उत्पादित मान अछि जकर अहाँ प्रयोग कऽ सकै छी: $1',
 'savedprefs' => 'अहाँक पसिन्न सुरक्षित कएल गेल',
 'timezonelegend' => 'समय क्षेत्र',
 'localtime' => 'स्थानीय समए:',
@@ -1123,7 +1089,6 @@ $3 द्वारा देल कारण अछि ''$2''",
 'prefs-reset-intro' => 'अहाँ ऐ पन्नाक प्रयोग अपन विकल्पकेँ पूर्वनिविष्ट रूपेँ जाल पुनर्निधारित करबा लेल कऽ सकै छी।
 ई बदलल नै जा सकैए।',
 'prefs-emailconfirm-label' => 'ई-पत्र पुष्टि:',
-'prefs-textboxsize' => 'सम्पादन खिड़कीक आकार',
 'youremail' => 'ई-पत्र:',
 'username' => 'प्रयोक्तानाम:',
 'uid' => 'प्रयोक्ताक पहिचान:',
@@ -1367,7 +1332,6 @@ $3 द्वारा देल कारण अछि ''$2''",
 'recentchangeslinked-feed' => 'संबंधित परिवर्त्तन',
 'recentchangeslinked-toolbox' => 'संबंधित परिवर्त्तन',
 'recentchangeslinked-title' => '"$1" मे भेल परिवर्तन',
-'recentchangeslinked-noresult' => 'ऐ कालमे लागिबला पन्ना सभमे कोनो परिवर्तन नै भेल।',
 'recentchangeslinked-summary' => "ई विशेष पन्नासँ सम्बद्ध पन्ना सभमे (आकि कोनो विशेष वर्गक समूहमे) भेल परिवर्तनक सूची छी ।
 [[Special:Watchlist|your watchlist]]  पर पन्नासभ '''गाढ़''' अछि।",
 'recentchangeslinked-page' => 'पन्नाक नाम',
@@ -1555,7 +1519,6 @@ $1',
 'http-read-error' => 'परिसंविद पठन भ्रम',
 'http-timed-out' => 'परिसंविद आग्रह कालातीत',
 'http-curl-error' => 'भ्रम निकालैबला सार्वत्रिक विभव संकेत:$1',
-'http-host-unreachable' => 'सार्वत्रिक विभव संकेत नै पाबि सकल',
 'http-bad-status' => 'परिसंविद आग्रह काल एकटा समस्या छल: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1704,12 +1667,6 @@ $1',
 'statistics-users-active-desc' => 'प्रयोक्ता जे अन्तिम {{PLURAL:$1|दिन|$1 दिन}} मे कोनो काज केने छथि',
 'statistics-mostpopular' => 'सभसँ बेसी देखल गेल पन्ना',
 
-'disambiguations' => 'स्पष्ट पन्नासँ लागिबला पन्ना',
-'disambiguationspage' => 'नमूना: निवारण',
-'disambiguations-text' => "ई सभ पन्ना '''स्पष्ट कएल''' सँ लागिमे अछि।
-ओ सभ एकर बदला उचित वार्तापर लागि करथि।<br />
-[[MediaWiki:Disambiguationspage]] सँ लागिमे जँ नमूनाक प्रयोग करैत अछि तखने ओ  '''स्पष्ट कएल'''  पन्ना कहाएत।",
-
 'doubleredirects' => 'द्वितीयक लागिबला बदलेन',
 'doubleredirectstext' => 'ई पन्ना ओइ पन्ना सभक संकलन छी जे बदलेन करैए दोसर बदलेनबला पन्नासँ।
 प्रत्येक पाँती पहिल आ दोसर बदलेनक लागि रखने अछि आ संगे दोसर बदलेनक लक्ष्य सेहो, जे वास्तवमे "वास्तव" लक्ष्य पन्ना अछि, जकरापर पहिल बदलेनकेँ जेबाक चाही। 
@@ -1944,10 +1901,9 @@ $1',
 'unwatchthispage' => 'देखनाइ छोड़ू',
 'notanarticle' => 'कोनो विषय सूची नै',
 'notvisiblerev' => 'कोनो दोसर प्रयोक्ता द्वारा कएल अन्तिम परिवर्तन मेटा देल गेल',
-'watchnochange' => 'अहाँक साकांक्ष सूचीमे सँ कोनोमे ऐ अवधिमे सम्पादन नै कएल गेल।',
 'watchlist-details' => '{{PLURAL:$1|$1 पन्ना|$1 पन्ना सभ}} अहाँक साकांक्षसूचीमे, चौबटिया पन्ना नै गानल गेल।',
-'wlheader-enotif' => '* ई-पत्र सूचना लागू अछि।',
-'wlheader-showupdated' => "* पन्ना सभ जे अहाँक एतए अन्तिम बेर अएलाक बाद बदलल अछि तकर सूची देल अछि '''गाढ़''' मे",
+'wlheader-enotif' => 'ई-पत्र सूचना लागू अछि।',
+'wlheader-showupdated' => "पन्ना सभ जे अहाँक एतए अन्तिम बेर अएलाक बाद बदलल अछि तकर सूची देल अछि '''गाढ़''' मे",
 'watchmethod-recent' => 'साकांक्ष सूचीक हालक सम्पादन जाँचि रहल छी',
 'watchmethod-list' => 'साकांक्ष-सूचीक हालक सम्पादनकेँ देखि रहल छी',
 'watchlistcontains' => 'अहाँक साकांक्ष-सूचीमे अछि $1 {{PLURAL:$1|पन्ना|पन्ना}}।',
@@ -2344,12 +2300,9 @@ $1 एकर प्रतिबन्धक कारण अछि : "$2"',
 ई, मुदा, क्षेत्र $2 क अन्दर प्रतिबन्धित अछि, जे अप्रतिबन्धित कएल जा सकैए।',
 'ip_range_invalid' => 'अमान्य अनिकेत क्षेत्र।',
 'ip_range_toolarge' => 'समूह खण्ड पैघ अछि /$1 सभकेँ अनुमति नै छै।',
-'blockme' => 'हमरा प्रतिबन्धित करू',
 'proxyblocker' => 'दोसराइत प्रतिबन्धक',
-'proxyblocker-disabled' => 'ई प्रकार्य प्रतिबन्धित अछि।',
 'proxyblockreason' => 'अहाँक अनिकेत पता प्रतिबन्धित भेल अछि कारण ई सोझे-सोझ दोसराइत अछि।
 अहाँ अपन अन्तर्जाल सेवा दाता वा तकनीकी सहायकसँ सम्पर्क करू आ ऐ गम्भीर सुरक्षा समस्याक सूचना दिअ।',
-'proxyblocksuccess' => 'भेल।',
 'sorbsreason' => 'अहाँक अनिकेत सूचित अछि सोझे-सोझ दोसराइतक रूपमे {{जालस्थल}} क डी.एन.एस.बी.एल.मे।',
 'sorbs_create_account_reason' => 'अहाँक अनिकेत एतए सूचित अछि खुजल दोसराइत सन डी.एन.बी.एस.एल. मे जे प्रयोग कएल जाइए {{अन्तर्जाल}} द्वारा।',
 'cant-block-while-blocked' => 'अहाँ जाधरि स्वयं प्रतिबन्धित छी दोसराकेँ प्रतिबन्धित नै कऽ सकै छी।',
@@ -2680,9 +2633,6 @@ $1 एकर प्रतिबन्धक कारण अछि : "$2"',
 'pageinfo-authors' => 'भिन्न लेखक संख्या',
 
 # Skin names
-'skinname-standard' => 'प्राचीन',
-'skinname-nostalgia' => 'गामसँ प्रेम',
-'skinname-simple' => 'साधारण',
 'skinname-modern' => 'आधुनिक',
 'skinname-vector' => 'सदिश',
 
@@ -2805,7 +2755,7 @@ Variants for Chinese language
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'चौड़ाई',
 'exif-imagelength' => 'ऊँच',
 'exif-bitspersample' => 'प्रति भाग अष्टक',
@@ -2984,7 +2934,7 @@ Variants for Chinese language
 'exif-originalimageheight' => 'काटहि सें पहिने तस्वीरक ऊँचाई',
 'exif-originalimagewidth' => 'काटहि सें पहिने तस्वीरक चौड़ाई',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'असम्पीडित',
 'exif-compression-2' => 'सी.सी.आइ.टी.टी. वर्ग ३ १ - बीम संशोधित हफमैन कूट सोझ लम्बाइ',
 'exif-compression-3' => 'सी.सी.आइ.टी.टी. वर्ग ३ फैक्स संकूट',
@@ -3377,7 +3327,6 @@ $5
 'version-other' => 'आन',
 'version-mediahandlers' => 'मीडिया संचालक',
 'version-hooks' => 'हूक',
-'version-extension-functions' => 'प्रकार्य बढ़ाउ',
 'version-parser-extensiontags' => 'विभाजन बढल चेन्ह',
 'version-parser-function-hooks' => 'विभाजक प्रकार्य खुट्टी',
 'version-hook-name' => 'खुट्टीक नाम',
@@ -3395,13 +3344,6 @@ $5
 'version-software-product' => 'उत्पाद',
 'version-software-version' => 'संस्करण',
 
-# Special:FilePath
-'filepath' => 'संचिकाक रस्ता',
-'filepath-page' => 'संचिका',
-'filepath-submit' => 'जाऊ',
-'filepath-summary' => 'ई विशेष पन्ना संचिकाक पूर्ण रस्ता देखबैत अछि।
-चित्र सभ पूर्ण आकारमे देखाएल जाइत अछि, दोसर संचिका प्रकार चालित होइए सोझे सम्बन्धित संविधि द्वारा।',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'द्वितीयक संचिका ताकू',
 'fileduplicatesearch-summary' => 'हैश मानक आधारपर द्वितीयक संचिका ताकू।',
diff --git a/languages/messages/MessagesMap_bms.php b/languages/messages/MessagesMap_bms.php
index 57216cea..d128bd8c 100644
--- a/languages/messages/MessagesMap_bms.php
+++ b/languages/messages/MessagesMap_bms.php
@@ -46,9 +46,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Tidhokna jumlah pangawas',
 'tog-oldsig' => 'Tapak asma sekiye:',
 'tog-fancysig' => 'Tapak asma dianggep dadi teks wiki (ora nganggo pranala otomatis)',
-'tog-externaleditor' => 'Gunakna editor eksternal sekang gawan (kanggo sing ahli thok, merlokna setelan kusus neng komputeré rika. [//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkapé.])',
-'tog-externaldiff' => 'Gunakna diff eksternal sekang gawan (kanggo sing ahli thok, merlokna setèlan kusus nang komputeré rika. [//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkapé.])',
-'tog-showjumplinks' => 'Aktifna pranala pitulung "mlumpat maring"',
 'tog-uselivepreview' => 'Gunakna pratayang langsung (mbutuhna JavaScript) (egin jajalan)',
 'tog-forceeditsummary' => 'Emutna inyong anggere durung ngisi kotak ringkesan suntingan',
 'tog-watchlisthideown' => 'Umpetna suntingane inyong sekang daftar pangawasan',
@@ -61,6 +58,7 @@ $messages = array(
 'tog-diffonly' => 'Aja tidokna isi kaca nang ngisor bedane suntingan',
 'tog-showhiddencats' => 'Tidokna kategori sing diumpetna',
 'tog-norollbackdiff' => 'Lirwakna perbedaan seuwise nglakokna pambalikan',
+'tog-prefershttps' => 'Gunakna koneksi aman terus angger mlebu log',
 
 'underline-always' => 'Saben',
 'underline-never' => 'Ora tau',
@@ -124,6 +122,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Des',
+'january-date' => ' $1 Januari',
+'february-date' => ' $1 Februari',
+'march-date' => ' $1 Maret',
+'april-date' => ' $1 April',
+'may-date' => '$1 Mei',
+'june-date' => ' $1 Juni',
+'july-date' => ' $1 Juli',
+'august-date' => ' $1 Agustus',
+'september-date' => '$1 September',
+'october-date' => ' $1 Oktober',
+'november-date' => '$1 November',
+'december-date' => '$1 Desember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategori}}',
@@ -205,6 +215,7 @@ $messages = array(
 'create-this-page' => 'Gawe kaca kiye',
 'delete' => 'Busek',
 'deletethispage' => 'Busak kaca kiye',
+'undeletethispage' => 'Batalna pembusekan kaca kiye',
 'undelete_short' => 'Batalna pambusakan $1 {{PLURAL:$1|suntingan|suntingan}}',
 'viewdeleted_short' => 'Deleng {{PLURAL:$1|siji suntingan|$1 suntingan}} sing wis dibusak',
 'protect' => 'Direksa',
@@ -248,7 +259,7 @@ $1',
 'pool-queuefull' => 'Kumpulan antriane kebak',
 'pool-errorunknown' => 'Kesalahan sing ora dingerteni sebabe',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Prakara {{SITENAME}}',
 'aboutpage' => 'Project:Prakara',
 'copyright' => 'Kabeh teks ana miturut $1.',
@@ -258,7 +269,6 @@ $1',
 'disclaimers' => 'Pamaidonan',
 'disclaimerpage' => 'Project:Panyangkalan umum',
 'edithelp' => 'Pitulung panyuntingan',
-'edithelppage' => 'Help:Panyuntingan',
 'helppage' => 'Help:Isi',
 'mainpage' => 'Kaca Utama',
 'mainpage-description' => 'Kaca Utama',
@@ -336,17 +346,6 @@ Daftar kaca astamiwa sing sah teyeng dideleng nang [[Special:SpecialPages|{{int:
 # General errors
 'error' => 'Kasalahan',
 'databaseerror' => 'Kasalahan basis data',
-'dberrortext' => 'Ana kesalahan sintaks nang penjalukan basis data.
-Kesalahan kiye ndeyan nandakna nek ana \'\'bug\'\' nang piranti alus.
-Penjalukan basis data sing pungkasan yakuwe:
-<blockquote><code>$1</code></blockquote>
-sekang jerone fungsi "<code>$2</code>".
-Basis data ngasilna kesalahan "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ana kesalahan sintaks nang penjalukan basis data.
-Penjalukan basis data sing pungkasan yakuwe:
-"$1"
-sekang jroning fungsi "$2".
-Basis data ngasilna kasalahan "$3: $4"',
 'laggedslavemode' => "'''Pènget:''' Kaca kiye mbokmenawa isiné dudu pangowahan pungkasan.",
 'readonly' => 'Basis data dikunci',
 'enterlockreason' => 'Lebokna alesan panguncèn, kalebu uga prakiran kapan kunci bakal dibuka',
@@ -382,6 +381,7 @@ Kiye ndeyane anu wis dibusek nang wong sejen.',
 'cannotdelete-title' => 'Ora teyeng mbusek kaca "$1".',
 'delete-hook-aborted' => 'Pembusekan dibatalna neng kait parser.
 Kuwe ora ana alesane.',
+'no-null-revision' => 'Ora teyeng nggawe versi null anyar kanggo kaca "$1"',
 'badtitle' => 'Judul ora sah',
 'badtitletext' => 'Judul kaca sing dijaluk ora sah, kosong, utawa salah nyambungna judul antar-basa utawa antarwiki.
 Kiya ndeyane ana siji utawa lewih karakter sing ora teyeng digunakna nang judul.',
@@ -405,12 +405,15 @@ Kanggo nambaih utawa ngowaih terjemahan nang kabeh wiki, monggo gunakna [//trans
 'editinginterface' => "'''Pènget:''' Rika nyunting kaca sing dienggo nyedyakna tèks antarmuka kanggo piranti alus.
 Pangowahan kaca kiye bakal awèh pangaruh maring tampilan antarmuka panganggo duweke panganggo sejen nang wiki kiye.
 Angger arep nambaih utawa ngowaih terjemahan, monggo gunakna [//translatewiki.net/translatewiki.net], proyèk lokalisasi MediaWiki.",
-'sqlhidden' => '(Penjalukan SQL diumpetna)',
 'cascadeprotected' => 'Kaca kiye wis direksa sekang penyuntingan jalaran melu mlebu nang {{PLURAL:$1|kaca|kaca-kaca}} nang ngisor kiye sing wis direksa nganggo opsi "runtun":
 $2',
 'namespaceprotected' => "Rika ora duwe hak akses kanggo nyunting kaca nang bilik jeneng '''$1'''.",
 'customcssprotected' => 'Rika ora duwe izin nggo nyunting kaca CSS kiye, jalaran isine pengaturan pribadine panganggo sejen.',
 'customjsprotected' => 'Rika ora duwe izin nggo nyunting kaca JavaScript kiye, jalaran isine pengaturan pribadine panganggo sejen.',
+'mycustomcssprotected' => 'Rika ora duwe hak akses kanggo ngowaih kaca CSS kiye.',
+'mycustomjsprotected' => 'Rika ora duwe idin kanggo ngowaih kaca JavaScript kiye.',
+'myprivateinfoprotected' => 'Rika ora duwe idin kanggo ngowaih informasi pribadine Rika.',
+'mypreferencesprotected' => 'Rika ora duwe idin kanggo ngowaih preferensine rika.',
 'ns-specialprotected' => 'Kaca astaiwa ora teyeng disunting.',
 'titleprotected' => 'Judul kiye wis direksa ora olih digawe nang [[User:$1|$1]].
 Alesane yakuwe "\'\'$2\'\'".',
@@ -433,10 +436,19 @@ Digatekna ya, cokan ana kaca sing esih terus nidokna nek rika esih mlebu log nga
 'welcomecreation-msg' => 'Akune Rika uwis digawe. 
 Aja kelalen ngowaih [[Special:Preferences|preferensi {{SITENAME}}]] Rika.',
 'yourname' => 'Jeneng panganggo:',
+'userlogin-yourname' => 'Jenengpanganggo',
+'userlogin-yourname-ph' => 'Lebokna jenengpanganggone Rika',
+'createacct-another-username-ph' => 'Lebokna jeneng panganggo',
 'yourpassword' => 'Tembung sandhi:',
+'userlogin-yourpassword' => 'Tembung sandhi',
+'userlogin-yourpassword-ph' => 'Lebokna tembung sandhine Rika',
+'createacct-yourpassword-ph' => 'Lebokna tembung sandhi',
 'yourpasswordagain' => 'Balèni tembung sandhi:',
+'createacct-yourpasswordagain' => 'Konfirmasi tembung sandhi',
+'createacct-yourpasswordagain-ph' => 'Lebokna tembung sandhi maning',
 'remembermypassword' => 'Emutna data login-ne inyong nang peramban kiye (kanggo paling suwe $1 {{PLURAL:$1|dina|dina}})',
-'securelogin-stick-https' => 'Tetep kahubung maring HTTPS seuwise mlebu log',
+'userlogin-remembermypassword' => 'Jorna ben Inyong tetep mlebu log',
+'userlogin-signwithsecure' => 'Gunakna koneksi aman',
 'yourdomainname' => 'Domain Rika:',
 'password-change-forbidden' => 'Rika ora teyeng ngowaih tembung sandhi nang wiki kiye.',
 'externaldberror' => 'Ana kesalahan otentikasi basis data utawa Rika ora olih nglakokna pemutakhiran maring akun eksternale Rika.',
@@ -448,18 +460,41 @@ Aja kelalen ngowaih [[Special:Preferences|preferensi {{SITENAME}}]] Rika.',
 'logout' => 'Metu Log',
 'userlogout' => 'Metu Log',
 'notloggedin' => 'Durung mlebu log',
+'userlogin-noaccount' => 'Durung duwe akun?',
+'userlogin-joinproject' => 'Melu {{SITENAME}}',
 'nologin' => 'Durung duwe akun? $1.',
 'nologinlink' => 'Gawe akun anyar',
 'createaccount' => 'Gawe akun anyar',
 'gotaccount' => 'Wis duwe akun? $1.',
 'gotaccountlink' => 'Mlebu log',
 'userlogin-resetlink' => 'Apa Rika kelalen info detil nggo mlebune?',
+'userlogin-resetpassword-link' => 'Setel maning tembung sandhine Rika',
+'helplogin-url' => 'Pitulung:Mlebu log',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pitulung mlebu log]]',
+'createacct-join' => 'Lebokna informasine Rika nang ngisor kiye.',
+'createacct-another-join' => 'Lebokna informasi akun anyar nang ngisor kiye.',
+'createacct-emailrequired' => 'Alamat imel',
+'createacct-emailoptional' => 'Alamat imel (ora kudu)',
+'createacct-email-ph' => 'Lebokna alamat imele Rika',
+'createacct-another-email-ph' => 'Lebokna alamat imel',
 'createaccountmail' => 'Gunakna tembung sandhi acak sementara lan kirimna maring alamat imel',
+'createacct-realname' => 'Jeneng asli (ora kudu)',
 'createaccountreason' => 'Alesan:',
+'createacct-reason' => 'Alesan',
+'createacct-reason-ph' => 'Kenangapa Rika nggawe akun sejen',
+'createacct-captcha' => 'Priksa keamanan',
+'createacct-imgcaptcha-ph' => 'Lebokna teks sing keton nang dhuwur',
+'createacct-submit' => 'Gawe akune Rika',
+'createacct-another-submit' => 'Gawe akun liyane',
+'createacct-benefit-heading' => '{{SITENAME}} kuwe digawe nang wong kaya Rika.',
+'createacct-benefit-body1' => '{{PLURAL:$1|suntingan|suntingan}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|kaca|kaca}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|kontributor|kontributor}} anyaran',
 'badretype' => 'Tembung sandhi sing Rika lebokna ora gathuk.',
 'userexists' => 'Jeneng panganggo sing dilebokna uwis ana sing nganggo.
 Monggo pilih jeneng liyane.',
 'loginerror' => 'Kasalahan mlebu log',
+'createacct-error' => 'Gole gawe akun gagal',
 'createaccounterror' => 'Ora teyeng gawe akun:$1',
 'nocookiesnew' => "Akunpanganggo wis digawe, tapi Rika durung mlebu log.
 {{SITENAME}} nggunakna ''cookies'' kanggo log panganggo.
@@ -528,10 +563,12 @@ Rika mendingan mlebu log disit lan ganti tembung sandine sekiye.
 Rika teyeng nglirwakna pesen kiye anggere akun kiye kuwe jebule anu salah gawe.',
 'usernamehasherror' => 'Jeneng panganggo ora teyeng nganggo tanda pager',
 'login-throttled' => 'Rika wis kakehan gole njajal mlebu log.
-Tulung ngenteni sedela sedurunge njajal maning.',
+Tulung ngenteni $1 sedurunge njajal maning.',
 'login-abort-generic' => 'Proses mlebu log Rika ora gagal - Dibatalna',
 'loginlanguagelabel' => 'Basa: $1',
 'suspicious-userlogout' => "Panjalukan Rika nggo metu log ditolak jalarak ketone dikirim nang panjlajah sing rusak utawa proksi panyinggah (''caching proxy'').",
+'createacct-another-realname-tip' => "'''Jeneng asli''' kuwe ora kudu.
+Angger Rika milih arep ngaweh, kiye bakal digunakna nggo aweh atribut maring kasil kerjaane Rika.",
 
 # Email sending
 'php-mail-error-unknown' => 'Kasalahan sing ora genah nang fungsi mail() PHP.',
@@ -547,8 +584,7 @@ Nggo nerusna, Rika kudu nglebokna tembung sandhi anyar nang kene:',
 'newpassword' => 'Tembung sandi anyar:',
 'retypenew' => 'Ketik maning tembung sandhi:',
 'resetpass_submit' => 'Nata tembung sandhi lan mlebu log',
-'resetpass_success' => 'Tembung sandhi Rika wis sukses diowahi!
-Sekiye mroses Rika mlebu log...',
+'changepassword-success' => 'Tembung sandhi Rika wis sukses diowahi!',
 'resetpass_forbidden' => 'Tembung sandhi ora teyeng diganti',
 'resetpass-no-info' => 'Rika kudu mlebu log kanggo ngakses kaca kiye sacara langsung.',
 'resetpass-submit-loggedin' => 'Ganti tembung sandhi',
@@ -560,10 +596,11 @@ Rika ndeyan  uwis kasil ngganti tembung sandhine Rika utawa wis njaluk tembung s
 
 # Special:PasswordReset
 'passwordreset' => "Tembung sandhi di-''reset''",
-'passwordreset-text' => 'Lengkapi formulir kiye ben nampa imel ngelingna detil akune Rika.',
+'passwordreset-text-one' => 'Kumpliti formulir kiye kanggo nyetel maning tembung sandhine Rika.',
+'passwordreset-text-many' => '{{PLURAL:$1|Isi salah siji kotak kanggo nyetel maning tembung sandhine Rika.}}',
 'passwordreset-legend' => "Tembung sandhi di-''reset''",
 'passwordreset-disabled' => "''Reset'' tembung sandhi wis dipateni nang wiki kiye.",
-'passwordreset-pretext' => '{{PLURAL:$1||Lebokna salah siji data nang ngisor kiye}}',
+'passwordreset-emaildisabled' => 'Fitur imel wis dinonaktifna nang wiki kiye.',
 'passwordreset-username' => 'Jeneng panganggo:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Deleng imel hasile?',
@@ -574,7 +611,7 @@ Rika ndeyan  uwis kasil ngganti tembung sandhine Rika utawa wis njaluk tembung s
 Tembung sandhi sauntara: $2',
 'passwordreset-emailsent' => 'Imel nggo nyetel maning tembung sandhi uwis dikirim.',
 'passwordreset-emailsent-capture' => 'Imel kanggo nyetel maning tembung sandhi uwis dikirim, kaya sing ditidokna nang ngisor kiye.',
-'passwordreset-emailerror-capture' => 'Imel nggo ngelingna uwis digawe, kaya sing ditidokna nang ngisor kiye, ningen ora teyeng dikirim maring panganggo: $1',
+'passwordreset-emailerror-capture' => 'Imel nggo nyetel maning tembung sandhi uwis digawe, kaya sing ditidokna nang ngisor kiye, ningen gole ngirim maring {{GENDER:$2|panganggo}} ora teyeng: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ganti alamat imel',
@@ -588,6 +625,13 @@ Tembung sandhi sauntara: $2',
 'changeemail-submit' => 'Ganti imel',
 'changeemail-cancel' => 'Ora sida',
 
+# Special:ResetTokens
+'resettokens-no-tokens' => 'Ora ana token sing arep disetel maning.',
+'resettokens-legend' => 'Nyetel maning token',
+'resettokens-token-label' => '$1 (biji sekiye:$2)',
+'resettokens-done' => 'Token wis disetel maning.',
+'resettokens-resetbutton' => 'Nyetel maning token sing dipilih',
+
 # Edit page toolbar
 'bold_sample' => 'Tèks kiye bakal dicithak kandel',
 'bold_tip' => 'Cithak kandel',
@@ -886,7 +930,6 @@ Gatèkna, angger nganggo pranala navigasi kuwe bakalan nge-reset kolom kiye.',
 'searchmenu-legend' => 'Pilihan panggoletan',
 'searchmenu-exists' => "''' Ana kaca nganggo jeneng \"[[:\$1]]\" nang wiki kiye.'''",
 'searchmenu-new' => "'''Gawe kaca \"[[:\$1]]\" nang wiki kiye!'''",
-'searchhelp-url' => 'Help:Isi',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Deleng daftar kaca sing nganggo tembung-wiwitan kiye]]',
 'searchprofile-articles' => 'Isine kaca',
 'searchprofile-project' => 'Kaca pitulung lan proyèk',
@@ -931,15 +974,6 @@ Jajal aweh awalan ''all:'' kanggo nggolèti kabèh isi (kalebu kaca dhiskusi, ci
 Rika teyeng nggoleti nganggo Google disit.
 Ningen Rika kudu eling nek indeks Google kanggo {{SITENAME}} bisa baen isine anu sing lawas lan durung dianyari.',
 
-# Quickbar
-'qbsettings' => 'Pangaturan bar pintas',
-'qbsettings-none' => 'Ora ana',
-'qbsettings-fixedleft' => 'Tetep sisih kiwa',
-'qbsettings-fixedright' => 'Tetep sisih tengen',
-'qbsettings-floatingleft' => 'Ngambang sisih kiwa',
-'qbsettings-floatingright' => 'Ngambang sisih tengen',
-'qbsettings-directionality' => 'Tetep, ngetutna maring bentuk skrip sekang basane Rika',
-
 # Preferences page
 'preferences' => 'Preferensi',
 'mypreferences' => 'Preferensi',
@@ -971,7 +1005,6 @@ Ningen Rika kudu eling nek indeks Google kanggo {{SITENAME}} bisa baen isine anu
 'resetprefs' => 'Bersihna owah-owahan sing ora disimpen',
 'restoreprefs' => 'Balekna kabeh setelan gawane',
 'prefs-editing' => 'Panyuntingan',
-'prefs-edit-boxsize' => 'Ukuran kotak panyuntingan.',
 'rows' => 'Baris:',
 'searchresultshead' => 'Goleti',
 'resultsperpage' => 'Hasil saben kaca:',
@@ -981,9 +1014,6 @@ Ningen Rika kudu eling nek indeks Google kanggo {{SITENAME}} bisa baen isine anu
 'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|dina|dina}}',
 'recentchangescount' => 'Standar jumlah suntingan sing ditampilna:',
 'prefs-help-recentchangescount' => 'Kiye klebu owahan anyar, sajarah kaca, lan log.',
-'prefs-help-watchlist-token' => 'Ngisi kotak kiye ngannggo tembung wadi (PIN) bakal ngasilna sindikasi RSS kanggo daftar pantauane Rika.
-Sapa baen sing weruh PIN kiye bakal teyeng maca daftar pantauane Rika, mulane kuwe pilih sing aman.
-Kiye PIN acak sing teyeng digunakna Rika: $1',
 'savedprefs' => 'Preferensine Rika wis disimpen.',
 'timezonelegend' => 'Zona wektu:',
 'localtime' => 'Wektu lokal:',
@@ -1014,7 +1044,6 @@ Kiye PIN acak sing teyeng digunakna Rika: $1',
 'prefs-reset-intro' => 'Rika teyeng nggunakna kaca kiye nggo mbalekna preferensi-ne Rika balik maring setelan baku situs.
 Pambalikan kiye ora teyeng dibatalna.',
 'prefs-emailconfirm-label' => 'Konfirmasi imel:',
-'prefs-textboxsize' => 'Ukuran kotak suntingan',
 'youremail' => 'Imel:',
 'username' => 'Jeneng panganggo:',
 'uid' => 'ID panganggo:',
@@ -1237,7 +1266,6 @@ Aja kuatir, alamat imele Rika ora ditidokna dong pangganggo sejen ngontak Rika.'
 'recentchangeslinked-feed' => 'Pengobahan terkait',
 'recentchangeslinked-toolbox' => 'Pengobahan terkait',
 'recentchangeslinked-title' => 'Owah-owahan sing ana gandhèngané karo "$1"',
-'recentchangeslinked-noresult' => 'Ora ana owah-owahan nang kaca-kaca kagandhèng kiye salawasé periode sing wis ditemtokaké.',
 'recentchangeslinked-summary' => "Kaca astamiwa kiye isine daftar owahan anyar sekang kaca-kaca sing kagandheng karo kaca terkait (utawa anggota sawijining kategori) .
 Kaca-kaca sing mlebu [[Special:Watchlist|pangawasane Rika]] ditandani ''kandel''.",
 'recentchangeslinked-page' => 'Jeneng kaca:',
@@ -1344,13 +1372,6 @@ Deskripsi sekang [$2 kaca deskripsine] ditidokna nang ngisor kiye.',
 'statistics-users-active-desc' => 'Panganggo sing nglakokna aktivitas nang {{PLURAL:$1|dina|$1 dina}} pungkasan',
 'statistics-mostpopular' => 'Kaca sing paling akèh dideleng',
 
-'disambiguations' => 'Kaca sing nggandeng maring kaca disambiguasi',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => "Kaca-kaca kiye nduwe pranala maring '''kaca disambiguasi'''.
-Kaca-kaca kuwe kudune nggandeng maring topik sing bener/pas.<br />
-Sawijining kaca bakal dianggep dadi kaca disambiguasi angger nggunakna cithakan sing nggandeng maring 
-[[MediaWiki:Disambiguationspage]]",
-
 'doubleredirects' => 'Pangalihan dobel',
 'doubleredirectstext' => 'Kaca kiye muat daftar kaca sing dialihna maring kaca pangalihan liyane.
 Saben barise nduwe pranala maring pangalihan pertama lan kepindho, lan tujuan sekang pengalihan kepindho sing biasane kuwe kaca tujuan sing "sebenere", sing kudune dadi tujuane kaca pangalihan pertama.
@@ -1776,7 +1797,7 @@ Sing liyane bakal diumpetna sacara ''default''.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-lightsource' => 'Sumber cahya',
 
 'exif-meteringmode-6' => 'Sebagiyan',
@@ -1815,9 +1836,6 @@ Sing liyane bakal diumpetna sacara ''default''.
 # Core parser functions
 'duplicate-defaultsort' => "'''Pènget:''' Kunci baku sing nggo ngurutna (''Default sort key'') yakuwe \"\$2\" wis nggantèkna kunci baku sing nggo ngurutna sedurungé \"\$1\".",
 
-# Special:FilePath
-'filepath-submit' => 'Golèti',
-
 # Special:SpecialPages
 'specialpages' => 'Kaca-kaca khusus',
 
diff --git a/languages/messages/MessagesMdf.php b/languages/messages/MessagesMdf.php
index e96b2558..746a2e1f 100644
--- a/languages/messages/MessagesMdf.php
+++ b/languages/messages/MessagesMdf.php
@@ -173,9 +173,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Няфтемс мъзяра сувсида конат арафтозь лопать эсь мельгеваномазост',
 'tog-oldsig' => 'Афкуксонь кядьтяшкс',
 'tog-fancysig' => 'Кядьтяшкст улихть викитекстокс (эслек тиеви сюлмафксфтома)',
-'tog-externaleditor' => 'Нолдамс тевс ушеширень петнить мъзярс илякс изь мярьгов (аньцек тевонь содайхненди, сяс мес эрявихть башка кядьёнкст-арафнемат содама машинаса [//www.mediawiki.org/wiki/Manual:External_editors сяда тов.])',
-'tog-externaldiff' => 'Нолдамс тевс ушеширень програм верзиень ваксс путоманкса мъзярс илякс изь мярьгов (аньцек тевонь содайхненди, сяс мес эрявихть башка кядьёнкст-арафнемат содама машинаса[//www.mediawiki.org/wiki/Manual:External_editors сяда тов.])',
-'tog-showjumplinks' => 'Мярьгомс "юпадемс" сатовома сюлмафкстненди',
 'tog-uselivepreview' => 'Максомс эряй васень няфтемась (JavaScript) (Варжамань)',
 'tog-forceeditsummary' => 'Няфтемс мондине мезе сёрмадомс шава петнема вальмас сувамста',
 'tog-watchlisthideown' => 'Кяшемс монь петнематне ванома лопаста',
@@ -372,7 +369,7 @@ $1',
 'pool-queuefull' => 'Тяряфнемада вельф лама',
 'pool-errorunknown' => 'Аф содаф эльбятькс',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} колга',
 'aboutpage' => 'Project:Колга',
 'copyright' => 'Сёрматфсь ули кода мумс $1-са.',
@@ -382,7 +379,6 @@ $1',
 'disclaimers' => 'Видешинь корхтаматне',
 'disclaimerpage' => 'Project:Пря видешинь корхнема',
 'edithelp' => 'Петнемань лезкс',
-'edithelppage' => 'Help:Петнема',
 'helppage' => 'Help:Лопань потмоц',
 'mainpage' => 'Пря лопа',
 'mainpage-description' => 'Пря лопа',
@@ -459,17 +455,6 @@ $1',
 # General errors
 'error' => 'Эльбятькс',
 'databaseerror' => 'Датабаза эльбятькс',
-'dberrortext' => 'Содамошинь паргань вешендембачк лиссь синтаксонь эльбятькс.
-Тя, улема, програмгярьксонь си.
-Мекольце содамошинь паргань вешема:
-<blockquote><code>$1</code></blockquote>
-функциеста "<code>$2</code>".
-Содамошинь паргась пачфтесь эльбятькс "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Датабазонь вешендембачк лиссь синтакс эльбятькс.
-Мекольце датабазонь вешендема ульсь:
-"$1"
-функциеста "$2".
-Датабазась мърдафтозе эльбятьксть "$3: $4"',
 'laggedslavemode' => 'Шарфтк мяльце: Тя лопась, улема, сирелгодсь.',
 'readonly' => 'Датабазась пякстаф',
 'enterlockreason' => 'Сёрматк тязк пякстама туфтал тонь арьсемацень мархта эли няфтть тяса мъзярда ули кода пякстамать валхтомс.',
@@ -521,7 +506,6 @@ $1',
 'protectedinterface' => 'Тя лопать эса интерфейс текстсь тя викить програмгярксти, сон аралаф кальдяв тиемада.
 Вики ётафтоматнень поладоманди полафнемандивок сувак [//translatewiki.net/ translatewiki.net], MediaWiki локализациень проектти.',
 'editinginterface' => "'''Инголи кардама:''' Тон петнесак лопать конань эса ащи интерфейс текст програмкярьксонди. Петнематне полафтсазь сонь ванфоц, кода сон няеви иля тиихненди. Вики ётафтоматнень поладоманди, полафтомандивок сувак [//translatewiki.net/ translatewiki.net] MediaWiki локализациень проектти.",
-'sqlhidden' => '(SQL вешфкс кяшф)',
 'cascadeprotected' => 'Тя лопать аралазь петнемада сяс мес сон сувафни {{PLURAL:$1|сай лопас, кона путфоль|сай лопас, конат путфольхть}} каскад араламас:
 $2',
 'namespaceprotected' => "Тондейть аф мярьгови петнемс лопатне '''$1''' лепнень мархта.",
@@ -552,7 +536,6 @@ $2',
 'yourpassword' => 'Сувама валце:',
 'yourpasswordagain' => 'Сёрматк сувама валце омбоцекс:',
 'remembermypassword' => 'Ванфтомс монь сувама лемозе тя содам машинаса (максимум $1 {{PLURAL:$1|шис|шис}})',
-'securelogin-stick-https' => 'Кадовомс сотфокс HTTPS вельде сувамада меле',
 'yourdomainname' => 'Тонь доменце:',
 'password-change-forbidden' => 'Сувама валхне тя викить эса аф полафтовихть',
 'externaldberror' => 'Лиссь эльбятькс ушеширень датабазонь вельде кемокстакшнембачк эли тондейть аф мярьгови полафнемс тонь ушеширень сёрматфтомацень.',
@@ -645,7 +628,7 @@ $2',
 'newpassword' => 'Од сувама вал:',
 'retypenew' => 'Сёрматк од сувама вал омбоцекс:',
 'resetpass_submit' => 'Арафтк сувама валть эди сувак',
-'resetpass_success' => 'Тонь сувама валцень полафнемась ётась лац! Тонь сувафттядязь системс...',
+'changepassword-success' => 'Тонь сувама валцень полафнемась ётась лац! Тонь сувафттядязь системс...',
 'resetpass_forbidden' => 'Сувама валхнень полафтомс аш кода',
 'resetpass-no-info' => 'Тондейть эряви сёрматфтомс тя лопас видеста суваманди.',
 'resetpass-submit-loggedin' => 'Полафтомс сувама валцень',
@@ -656,10 +639,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Полафтомс сувама валцень',
-'passwordreset-text' => 'Эряви пяшкодемс тя формать е-сёрма сёрматфтомацень колга сявоманди.',
 'passwordreset-legend' => 'Полафтомс сувама валцень',
 'passwordreset-disabled' => 'Сувама валсь аф полафтови тя викить эса.',
-'passwordreset-pretext' => '{{PLURAL:$1||Тяштьк содама пялькснень эзда фкя алу}}',
 'passwordreset-username' => 'Тиить лемоц',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Ваномс мекольце е-сёрма?',
@@ -1001,7 +982,6 @@ $3 макссь туфталсь - ''$2''",
 'searchmenu-legend' => 'Вешендема арафнематне',
 'searchmenu-exists' => "'''Тя Викиса ули лопась \"[[:\$1]]\" лем мархта'''",
 'searchmenu-new' => "'''Ушедомс лопась \"[[:\$1]]\" тя Викиса!'''",
-'searchhelp-url' => 'Help:Лопань потмоц',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Мумс лопат тя валынголькссь мархта]]',
 'searchprofile-articles' => 'Потмонь лопат',
 'searchprofile-project' => 'Лезкс эди проектонь лопат',
@@ -1042,14 +1022,6 @@ $3 макссь туфталсь - ''$2''",
 'search-external' => 'Ушеширень вешендема',
 'searchdisabled' => '{{SITENAME}}-са тяни вешендемась аш. Ули кода вешендемс Google эли иля вешендемань интернет програпнень вельде. Шарфтк мяльце тостонь {{SITENAME}}-нь потмонц верзиец, улема, сирелгодсь.',
 
-# Quickbar
-'qbsettings' => 'Навигациень седяфкс',
-'qbsettings-none' => 'Аф няфтемс',
-'qbsettings-fixedleft' => 'Кержи шири киртьф',
-'qbsettings-fixedright' => 'Види шири киртьф',
-'qbsettings-floatingleft' => 'Кержи ширеса уенди',
-'qbsettings-floatingright' => 'Виде ширеса уенди',
-
 # Preferences page
 'preferences' => 'Арафнематне',
 'mypreferences' => 'Монь латцемане',
@@ -1074,7 +1046,6 @@ $3 макссь туфталсь - ''$2''",
 'resetprefs' => 'Валхтомс апак ванфтт полафнематнень',
 'restoreprefs' => 'Мърдафтомс васень латцематне',
 'prefs-editing' => 'Петнема',
-'prefs-edit-boxsize' => 'Петнема вальмоть келец.',
 'rows' => 'Луфт (строкат):',
 'columns' => 'Орват (столбанят):',
 'searchresultshead' => 'Вешендема',
@@ -1307,7 +1278,6 @@ $3 макссь туфталсь - ''$2''",
 'recentchangeslinked-feed' => 'Сюлмаф полафнематне',
 'recentchangeslinked-toolbox' => 'Сюлмаф полафнематне',
 'recentchangeslinked-title' => 'Полафнемат сюлмафт "$1" мархта',
-'recentchangeslinked-noresult' => 'Сюлмаф лопава тя пингста полафнемат ашельхть.',
 'recentchangeslinked-summary' => "Тя башка лопас сувафнезь мекольце полафнемат сюлмаф лопава. Тонь ванома сёрмалувомастонь лопатне тяштезь '''эчкста'''.",
 'recentchangeslinked-page' => 'Лопать лемоц:',
 'recentchangeslinked-to' => 'Няфтемс полафтоматне лопатнень эса сотфт тя лопать мархта',
@@ -1527,10 +1497,6 @@ $3 макссь туфталсь - ''$2''",
 'statistics-users-active-desc' => 'Тиихне конатне тисть мезеге ётай {{PLURAL:$1|шиня|$1 шиста}}',
 'statistics-mostpopular' => 'Сидеста сувсеви лопат',
 
-'disambiguations' => 'Лама смузьса лопат',
-'disambiguationspage' => 'Template:лама смусть',
-'disambiguations-text' => "Ня лопатне сюлмафт '''лама смузень лопа''' мархта. Синьдеест эрявихть сюлмамс иля башка сёрмафкснень мархта.<br />Лопась лувови лама смузеннекс мъзярда сон сюлмаф [[MediaWiki:Disambiguationspage]] кепотькс мархта.",
-
 'doubleredirects' => 'Кафонзаф умборондафтфксне',
 'doubleredirectstext' => 'Тя лопань лувомаса няфтевихть умборондафтфксне сюлмафт иля умборондафтфкснень мархта. Эрь луфксса (строкаса) улихть васенце ди омбоце умборондафтфкснень сюлмафкссна, тяса тага ули омбоце умборондафтфксонь васенце киксонцты сюлмафкссь, тоса ули няфтемась лопань лемонц лангс конань мархта эряволь васенце умборондафтфксть сюлмафтомс.
 <del>Туркс кикс мархта</del> тяшксне латцефольхть.',
@@ -1730,10 +1696,9 @@ $3 макссь туфталсь - ''$2''",
 'unwatchthispage' => 'Лоткамс мельге ваномать',
 'notanarticle' => 'Аф сёрмапотмонь лопа',
 'notvisiblerev' => 'Верзиесь нардафоль',
-'watchnochange' => 'Мезеге изь полафтов тонь мельгеванома лувомастот тя пингеёткса.',
 'watchlist-details' => '{{PLURAL:$1|$1 лопа|$1 лопат}} мельгеваномацень ала корхнема лопат аф лувомок.',
-'wlheader-enotif' => '* Электрононь сёрма вельде пачфнема нолдаф тевс.',
-'wlheader-showupdated' => "* Лопат конань полафтозь тонь мекольце сувсемадот меле няфтевсть '''эчке тяшкса'''.",
+'wlheader-enotif' => 'Электрононь сёрма вельде пачфнема нолдаф тевс.',
+'wlheader-showupdated' => "Лопат конань полафтозь тонь мекольце сувсемадот меле няфтевсть '''эчке тяшкса'''.",
 'watchmethod-recent' => 'мельге ванома ала лопатнень коряс мекольце петнематнень ванондома',
 'watchmethod-list' => 'мекольце петнематнень коряс мельге ванома ала лопат ванондома',
 'watchlistcontains' => 'Тонь мельгеваномасот $1 {{PLURAL:$1|лопа|лопат}}.',
@@ -2064,12 +2029,9 @@ $1',
 'ipb_blocked_as_range' => 'Эльбятькс: IP $1 аф кардаф видеста ди соннеда аш кода кардафкссь валхтомс.
 Сон, интай улема, кардафоль кода  $2-нь потмонц пакшец, конань эзда ули кода кардафксонь валхтомс.',
 'ip_range_invalid' => 'Аф кондясти IP потмоц.',
-'blockme' => 'Кардамань монь',
 'proxyblocker' => 'Ётка якаень сёлгома',
-'proxyblocker-disabled' => 'Тя функциесь аф тиеви.',
 'proxyblockreason' => 'Тонь IP адрес пякстафоль сонь панжада прокси-серверонь эзда.
 Тондейть эряви сотомс тонь интернет ладяйть эли текникань нежедемать мархта ди пачфтемс тя прябалать колга.',
-'proxyblocksuccess' => 'Тиф.',
 'sorbsreason' => 'Тонь IP адресце лувови панжада ётка якай сервероннекс DNSBL-са, конась нолдаф тевс {{SITENAME}}са.',
 'sorbs_create_account_reason' => 'Тонь IP адресце лувови панжада ётка якань сервероннекс DNSBL-са конась нолнезь тевс {{SITENAME}}са.
 Тондейть аш кода сёрматфтомать тиемс',
@@ -2426,7 +2388,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Келец',
 'exif-imagelength' => 'Серец',
 'exif-bitspersample' => 'Битт фкя компонентс',
@@ -2540,7 +2502,7 @@ $1',
 'exif-gpsdatestamp' => 'GPS ши',
 'exif-gpsdifferential' => 'GPS диференциень петнема',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Аф компрезияф',
 
 'exif-unknowndate' => 'Аф содаф шись',
@@ -2821,7 +2783,6 @@ $5
 'version-other' => 'Иля',
 'version-mediahandlers' => 'Медиа файлхнень ладямат',
 'version-hooks' => 'Кярьмодихне',
-'version-extension-functions' => 'Келептема функциенза',
 'version-parser-extensiontags' => 'Анализаторонь келептема кодонза',
 'version-parser-function-hooks' => 'Синтаксонь анализаторть функциензон кярьмодихне',
 'version-hook-name' => 'Кярьмодинь лемоц',
@@ -2832,13 +2793,6 @@ $5
 'version-software-product' => 'Нолдафкс',
 'version-software-version' => 'Верзие',
 
-# Special:FilePath
-'filepath' => 'Файлти ян',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Ян',
-'filepath-summary' => 'Тя башка тевонь лопась няфнесы сембе янць файлти.
-Архтофксне няфневихть сембе синь кувалмосост, иля файлонь сортсна нолдавихть видеста програпнень вельде конат сотфт мархтост.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Вешендемс кафонзаф файлхне',
 'fileduplicatesearch-summary' => 'Вешендемс кафонзаф файлхнень хэш-кодонь лувкс коряс.',
diff --git a/languages/messages/MessagesMg.php b/languages/messages/MessagesMg.php
index c8d353cc..a5ae666f 100644
--- a/languages/messages/MessagesMg.php
+++ b/languages/messages/MessagesMg.php
@@ -247,9 +247,6 @@ $messages = array(
 'tog-shownumberswatching' => "Asehoy ny isan'ny mpikambana manara-maso ny pejy",
 'tog-oldsig' => "Topi-mason'ny sonia :",
 'tog-fancysig' => 'Sonia tsotra (tsy misy rohy)',
-'tog-externaleditor' => "Hampiasa mpanova soratra ivelany (ho an'ny mpikambana havanana ihany, mila fampifanarahana manokana eo amin'ny mpikajinao [//www.mediawiki.org/wiki/Manual:External_editors Fampahalalana fanampiny.])",
-'tog-externaldiff' => "Hampiasa mpampitaha ivelany (ho an'ny mpikambana havanana ihany, mila fampifanarahana manokana eo amin'ny mpikajinao [//www.mediawiki.org/wiki/Manual:External_editors Fampahalalana fanampiny.])",
-'tog-showjumplinks' => 'Ampiasao ny rohy "handeha eto"',
 'tog-uselivepreview' => 'Hampiasa ny topi-maso malakay (andramana)',
 'tog-forceeditsummary' => 'Teneno ahy ra tsy nametraka ny ambangovangony',
 'tog-watchlisthideown' => "Tsy ampiseho anatin'ny pejy fanaraha-maso ny zavatra nosoratako",
@@ -262,6 +259,8 @@ $messages = array(
 'tog-diffonly' => "Aza ampiseho ny voatonin'ny pejy eo amban'ny diff",
 'tog-showhiddencats' => 'Asehoy ny sokajy misitrika',
 'tog-norollbackdiff' => 'Aza aseho ny diff rehefa avy namafa fanàvana iray',
+'tog-useeditwarning' => 'Ampitandremo aho raha miala sady mamela pejy ovaiko nefa tsy notahiriziko',
+'tog-prefershttps' => 'Fanohizana azo antoka foana no ampaisaina rehefa tafiditra',
 
 'underline-always' => 'Foana foana',
 'underline-never' => 'Tsy tsipihina mihitsy',
@@ -325,6 +324,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Des',
+'january-date' => '$1 Janoary',
+'february-date' => '$1 Febroary',
+'march-date' => '$1 Martsa',
+'april-date' => '$1 Aprily',
+'may-date' => '$1 Mey',
+'june-date' => '$1 Jiona',
+'july-date' => '$1 Jolay',
+'august-date' => '$1 Aogositra',
+'september-date' => '$1 Septambra',
+'october-date' => '$1 Oktobra',
+'november-date' => '$1 Novambra',
+'december-date' => '$1 Desambra',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Sokajy|Sokajy}}',
@@ -406,6 +417,7 @@ $messages = array(
 'create-this-page' => 'Forony ity pejy ity',
 'delete' => 'Hamafa',
 'deletethispage' => 'Fafao ity pejy ity',
+'undeletethispage' => 'Hamerina ity pejy ity',
 'undelete_short' => 'Famerenana fanovana {{PLURAL:$1|$1|$1}}',
 'viewdeleted_short' => 'Hijery fanovana voafafa {{PLURAL:$1|tokana|$1}}',
 'protect' => 'Hiaro',
@@ -449,7 +461,7 @@ $1',
 'pool-queuefull' => 'Feno ny lisitry ny asa hatao',
 'pool-errorunknown' => 'Tsi-fetezana tsy fantatra',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Mombamomba ny {{SITENAME}}',
 'aboutpage' => 'Project:Mombamomba',
 'copyright' => 'Ny lisansa $1 no mamehy ny fampiasana ity voatoatiny ity.',
@@ -459,7 +471,6 @@ $1',
 'disclaimers' => 'Fampitandremana',
 'disclaimerpage' => 'Project:General disclaimer',
 'edithelp' => 'Fanoroana',
-'edithelppage' => 'Help:Endritsoratra',
 'helppage' => 'Help:Fanoroana',
 'mainpage' => 'Fandraisana',
 'mainpage-description' => 'Fandraisana',
@@ -534,16 +545,12 @@ Mitaky version $1-n'i MediaWiki",
 # General errors
 'error' => 'Tsy mety',
 'databaseerror' => "Tsy fetezana eo amin'ny toby",
-'dberrortext' => "Nitranga ny hadisoana ara-pirafi-kataka (syntax error).
-Mety noho ny tsifandehanan'ny rindrankajy tsara izany.
-<blockquote><code>$1</code></blockquote>
-avy amin'ny tao « <code>$2</code> ».
-ary « <samp>$3 : $4</samp> » no hadisoana naverinn'ny banky angona.",
-'dberrortextcl' => "Ao amin'ny fangatahana tao amin'ny banky angona dia misy tsi-fetezana ara-pehezanteny.
-Ny fangatahana farany nalefa dia :
-« $1 »
-tao amin'ny asa « $2 ».
-Ny banky angona dia namerina ny tsi-fetezana « $3 : $4 »",
+'databaseerror-text' => "Nisy hadisoana banky angona nitranga.
+Mety maneho baogy ao amin'ny rindrankajy izany.",
+'databaseerror-textcl' => 'Nisy hadisoana banky angona nitranga.',
+'databaseerror-query' => 'Hataka: $1',
+'databaseerror-function' => 'Lefa: $1',
+'databaseerror-error' => 'Hadisoana: $1',
 'laggedslavemode' => 'Fampitandremana: Mety ho tsy nisy fanovana vao haingana angamba io pejy io',
 'readonly' => 'Mihidy ny banky angona',
 'enterlockreason' => 'Manomeza antony hanidiana ny pejy, ahitana ny fotoana tokony hamahana izay fihidiana izay',
@@ -579,6 +586,7 @@ Mety efa nataon'ny hafa angamba ny famafàna.",
 'cannotdelete-title' => 'Tsy afaka mamafa ny pejy "$1"',
 'delete-hook-aborted' => "Famafana nofoanan'ny itatra.
 Tsy nanome fanazavana.",
+'no-null-revision' => 'Tsy nahaforona famerenana poaka aty ho an\'ny pejy "$1"',
 'badtitle' => 'Tsy mety ny lohateny',
 'badtitletext' => "Tsy mety io anaram-pejy nangatahinao io na tsy misy n'inon'inona na rohy dikan-teny vahiny misy diso tsipelina.",
 'perfcached' => "Ao amin'ny voatakona ireo data manaraka ireo ary mety tsy voavao. $1{{PLURAL:}} ihany no isan'ireo zavatra voatahiry ao amin'ny voatakona",
@@ -602,13 +610,16 @@ Andramo indray afaka minitra vitsivitsy.",
 Hisy fiantraikany amin'ny fisehon'ny tranonkala amin'ny mpampiasa rehetra eto amin'ity wiki ity ny fanovana.
 
 Raha hanampy dikanteny izay tokony hihatra amin'ny wiki rehetra, ampiaao ny tranonkala [//translatewiki.net/ translatewiki.net translatewiki.net], ny tetikasa fandikana an'i MediaWiki.",
-'sqlhidden' => '(nafenina ny requête SQL)',
 'cascadeprotected' => 'Ankehitriny dia voaaro ity pejy ity satria misy pejy voaaro {{PLURAL:$1||$1}}1 mampiasa ity pejy ity. Io pejy io dia mampiasa ny fiarovana "en cascade" :
 
 $2',
 'namespaceprotected' => "Tsy manana alalàna manova ny toeran'anarana « '''$1''' » ianao.",
 'customcssprotected' => "Tsy afaka manova ity pejy CSS ity ianao satria misy ny safidy manokan'ny mpikambana hafa.",
 'customjsprotected' => "Tsy afaka manova ity pejy JavaScript ity inaao satria misy ny safidin'ny mpikambana hafa.",
+'mycustomcssprotected' => 'Tsy manana ny alalana ahafahana manova ity pejy CSS ity ianao.',
+'mycustomjsprotected' => 'Tsy manana ny alalana ahafahana manova ity pejy JavaScript ity ianao.',
+'myprivateinfoprotected' => 'Tsy manana alalana ahafahana manova ny fampahalalana tsy sarababem-bahoakanao ianao.',
+'mypreferencesprotected' => 'Tsy manana alalana ahafahana manova ny safidinao ianao.',
 'ns-specialprotected' => "Tsy afaka ovaina ny pejy anatin'ny toeran'anarana « {{ns:special}} » .",
 'titleprotected' => "Voaaron'i [[User:$1|$1]] ity lohateny ity mba tsy hamorona pejy mitondra ity anarana ity.
 Ny antony napetraka dia : « ''$2'' ».",
@@ -633,10 +644,19 @@ Fantaro fa mety mbola misy ireo pejy milaza anao fa mbola tafiditra raha tsy nam
 'welcomecreation-msg' => "Noforonina ny aontinao.
 Aza adin ny manova ny [[Special:Preferences|safidinao ro amin'i{{SITENAME}}]].",
 'yourname' => 'Solonanarana',
+'userlogin-yourname' => 'Anaram-pikambana',
+'userlogin-yourname-ph' => 'Atsofohy ny anaram-pikambanao',
+'createacct-another-username-ph' => 'Atsofohy ny anaram-pikambana',
 'yourpassword' => 'Tenimiafina',
+'userlogin-yourpassword' => 'Tenimiafina',
+'userlogin-yourpassword-ph' => 'Atsofohy ny tenimiafinao',
+'createacct-yourpassword-ph' => 'Manatsofoha tenimiafina',
 'yourpasswordagain' => 'Avereno ampidirina eto ny tenimiafina',
+'createacct-yourpasswordagain' => 'Hamarino ny tenimiafinao',
+'createacct-yourpasswordagain-ph' => 'Mbola ampidiro fanindroany ny tenimiafinao',
 'remembermypassword' => '{{PLURAL:}}Tadidio ny tenimiafiko (mandritry ny $1 andro fara-fahabetsany)',
-'securelogin-stick-https' => "Mijanona tafiditra amin'i HTTPS rehefa tafiditra",
+'userlogin-remembermypassword' => 'Tadidio aho',
+'userlogin-signwithsecure' => "Fidirana amin'ny alalan'ny fanohizana azo antoka",
 'yourdomainname' => 'faritra (domaine) misy anao',
 'password-change-forbidden' => "Tsy afaka manova ny tenimiafina ianao eto amin'ity wiki ity.",
 'externaldberror' => "Nisy tsy fetezana angamba teo amin'ny fanamarinana anao tamin'ny sehatra ivelan'ity wiki ity, na tsy manana alalana hanova ny kaontinao ivelany ianao.",
@@ -649,18 +669,41 @@ Mila manaiky cookies ianao raha te hiditra amin'ny {{SITENAME}}.",
 'logout' => 'Hiala',
 'userlogout' => 'Hiala',
 'notloggedin' => 'Tsy tafiditra',
+'userlogin-noaccount' => 'Tsy manana kaonty?',
+'userlogin-joinproject' => "Midira ho mpikamban'i {{SITENAME}}",
 'nologin' => "Tsy manana solonanarana? '''$1'''.",
 'nologinlink' => 'Manokafa kaonty',
 'createaccount' => 'Hamorona kaonty',
 'gotaccount' => "Efa manana kaonty? '''$1'''.",
 'gotaccountlink' => 'Midira',
 'userlogin-resetlink' => "Adinonavo ve ny antsipihan'ny fidiranao ?",
+'userlogin-resetpassword-link' => 'Hamerina ny tenimiafinao',
+'helplogin-url' => 'Help:Fidirana',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Fanoroana mikasika ny fidirana]]',
+'createacct-join' => 'Atsofohy eo ambany ny fampahalalana momba anao.',
+'createacct-another-join' => "Atsofohy eo ambany ny fampahalalana vaovaon'ny kaonty",
+'createacct-emailrequired' => 'Adiresy mailaka :',
+'createacct-emailoptional' => 'Adiresy mailaka (azo tsy atao) :',
+'createacct-email-ph' => 'Atsofohy ny adiresy mailakao',
+'createacct-another-email-ph' => 'Atsofohy ny adiresy mailaka',
 'createaccountmail' => "Hampiasa tenimiafina vonjimaika ary handefa azy eo amin'ny adiresy mailaka voalaza",
+'createacct-realname' => 'Tena anarana (azo tsy atao)',
 'createaccountreason' => 'Antony :',
+'createacct-reason' => 'Antony',
+'createacct-reason-ph' => 'Inona ny antony hamoronanao kaonty hafa',
+'createacct-captcha' => 'Fitsapana ny antoka',
+'createacct-imgcaptcha-ph' => 'Atsofohy ny teny hitanao eo ambony',
+'createacct-submit' => 'Hamorona ny kaontinao',
+'createacct-another-submit' => 'Hamorona kaonty vaovao',
+'createacct-benefit-heading' => "Olona tahaka ianao no manoratra eo amin'i {{SITENAME}}",
+'createacct-benefit-body1' => 'fanovana{{PLURAL:$1}}',
+'createacct-benefit-body2' => 'pejy{{PLURAL:$1}}',
+'createacct-benefit-body3' => 'mpandray anjara vao haingana{{PLURAL:$1}}',
 'badretype' => 'Tsy mitovy ny tenimiafina nampidirinao.',
 'userexists' => 'Efa miasa io anaram-pikambana natsofokao io.
 Anarana hafa safidiana.',
 'loginerror' => "Tsy fetezana teo amin'ny fidirana",
+'createacct-error' => 'Hadisoana tam-pamoronana ny kaonty',
 'createaccounterror' => 'Tsy afaka mamorona kaonty : $1',
 'nocookiesnew' => "Voasikatra ny kaontim-pikambana, fa tsy tafiditra amin'ny kaontinao ianao.
 Mampiasa cookies ny {{SITENAME}} ho an'ny fidirana amin'ny kaonty.
@@ -723,11 +766,14 @@ Tokony miditra na manokatra kaonty ianao, ary ovay ny tenimiafinao dien-izao.
 
 Aza mijery ity hafatra ity ianao raha voaforona an-tsifetezana ilay kaonty io.",
 'usernamehasherror' => 'Ny anaram-pikambana dia tsy afaka manana soratra fanaovana hash.',
-'login-throttled' => "Im-betsaka loatra ianao no nanandrana tenimiafina teo amin'io kaonty io.
-Andraso kely ary andramo indray.",
+'login-throttled' => "Betsaka loatra ny andram-pidirana nataonao.
+
+Andraso $1 alohan'ny mamerina.",
 'login-abort-generic' => 'Tsy nahomby ny fanandramanao niditra',
 'loginlanguagelabel' => 'fiteny : $1',
 'suspicious-userlogout' => "Ny fangataham-pialanao dia tsy nekena satria ohatry ny nalfan'ny mpizahan-tsehatra simba izy na kasy ny proxy.",
+'createacct-another-realname-tip' => "Azo tsy atsofoka ny tena anarana.
+Raha misafidy ny hanome azy ianao, ho ampiasaina amin'ny fanehoana ny anjara asan'ilay mpikambana ilay izy.",
 
 # Email sending
 'php-mail-error-unknown' => "Hadisoana tsy fantatra tao amin'ny tao mial() an'i PHP.",
@@ -742,7 +788,7 @@ Andraso kely ary andramo indray.",
 'newpassword' => 'Tenimiafina vaovao:',
 'retypenew' => 'Avereno ampidirina ny tenimiafina vaovao:',
 'resetpass_submit' => 'Ovay ny tenimiafina ary midira',
-'resetpass_success' => 'Voasolo soa aman-tsara ny tenimiafinao ! Mampiditranao izao ankehitriny...',
+'changepassword-success' => 'Voaova soa aman-tsara ny tenimiafinao!',
 'resetpass_forbidden' => 'Tsy afaka ovaina ny tenimiafina',
 'resetpass-no-info' => "Tsy maintsy tafiditra ao amin'ny kaontinao ianao vao afaka mijery ity pejy ity.",
 'resetpass-submit-loggedin' => 'Ovay ny tenimiafina',
@@ -754,10 +800,11 @@ Mety efa nanova tenimiafina na nanontany tenimiafina miserana angamba ianao.',
 
 # Special:PasswordReset
 'passwordreset' => 'Famafana ary famerenana ny tenimiafina',
-'passwordreset-text' => 'Fenoy ity fôrmiolera ity mba hamerenana ny tenimiafinao.',
+'passwordreset-text-one' => 'Fenoy ity fôrmiolera ity mba hamerenana ny tenimiafinao',
+'passwordreset-text-many' => "Fenoy ny iray amin'ireo saha ireo mba hamerenana ny tenimiafinao{{PLURAL:$1}}",
 'passwordreset-legend' => 'Famafana ary famerenana ny tenimiafina',
 'passwordreset-disabled' => "Tsy nalefa ny fanovana tenimiafina adino eto amin'ity wiki ity.",
-'passwordreset-pretext' => '{{PLURAL:$1}}Mampidira singa data eo ambany',
+'passwordreset-emaildisabled' => "Tsy avela ny fampiasana mailaka eto amin'ity wiki ity.",
 'passwordreset-username' => 'Anaram-pikambana :',
 'passwordreset-domain' => 'Vala (domain) :',
 'passwordreset-capture' => 'Hijery ny imailaka vokany ?',
@@ -779,7 +826,7 @@ Hitsahatra afaka {{PLURAL:$5|iray|$5}} andro {{PLURAL:$3|io|ireo}} tenimiafina {
 Tenimiafina miserana : $2',
 'passwordreset-emailsent' => 'Lasa ny mailaka famerenana tenimiafina.',
 'passwordreset-emailsent-capture' => 'Lasa ilay mailaka famerenana tenimiafina, izay aseho eo ambany.',
-'passwordreset-emailerror-capture' => "Voaforona ilay imailaka fitadidiana, izay aseho eo ambany, fa tsy nahomby anefa ny fandefasana azy any amin'ny mpikambana : $1",
+'passwordreset-emailerror-capture' => "Nosoratana ilay mailaka famerenana tenimiafina, izay aseho eo ambany, fa tsy tafalefa tany amin'ilay mpikambana ilay izy : $1{{GENDER:$2}}",
 
 # Special:ChangeEmail
 'changeemail' => 'Hanova ny adiresy imailaka',
@@ -793,6 +840,17 @@ Tenimiafina miserana : $2',
 'changeemail-submit' => 'Hanova ny adiresy imailaka',
 'changeemail-cancel' => 'Adinoy',
 
+# Special:ResetTokens
+'resettokens' => 'Hamerina ny token',
+'resettokens-text' => "Azonao averina eto ny token izay hahafahana mitsidika ny fampahalalana tsy sarababem-bahoaka ao amin'ny kaontinao. Tokony ataonao izany raha voazara tsy fanahy iniana na raha nisy nangalatra ny kaontinao.",
+'resettokens-no-tokens' => 'Tsy misy token ho averina',
+'resettokens-legend' => 'Famerenana ny token',
+'resettokens-tokens' => 'Token:',
+'resettokens-token-label' => '$1 (sanda ankehitriny: $2)',
+'resettokens-watchlist-token' => "Token ho an'ny fahna web (Atom/RSS) ho an'ny  [[Special:Watchlist|fanovana ny pejy ao amin'ny lisitry ny pejy arahanao]]",
+'resettokens-done' => 'Natao reset ny token',
+'resettokens-resetbutton' => 'Hanao reset ny token voafidy',
+
 # Edit page toolbar
 'bold_sample' => 'Soratra matavy',
 'bold_tip' => 'Soratra matavy',
@@ -987,12 +1045,15 @@ Tsy nanome antony',
 Mety voafafa angamba izy.',
 'edit-conflict' => 'Adi-panovàna.',
 'edit-no-change' => "Tsy norarahian'ny rindrankajy ny fanovanao satria tsy nanova ny lahatsoratra ianao.",
+'postedit-confirmation' => 'Voatahiry ny fanovanao.',
 'edit-already-exists' => 'Tsy afaka amboarina ilay pejy vaovao.
 Efa misy izy.',
 'defaultmessagetext' => 'Hafatra raha tsy misy',
 'content-failed-to-parse' => "Tsy naha-parse ny votoatin'i $2 ho an'ny modely $1 : $3",
 'invalid-content-data' => "Data anaty votoatiny tsy miady amin'ny fepetra",
 'content-not-allowed-here' => "Votoatiny ''$1'' voarara eo amin'ny pejy [[$2]]",
+'editwarning-warning' => "Mety hahavery ny fanovana nataonao ny fialanao amin'ity pejy ity.
+Raha tafiditra ianao dia azonao esorina ity fampitandremana ity ao amin'ny fizarana \"Fanovàna\" ao amin'ny safidinao",
 
 # Content models
 'content-model-wikitext' => 'wiki-soratra',
@@ -1026,6 +1087,7 @@ Ao aorian'ny fivelarana, mety namoaka valy lava loatra angamba izy, ary tsy namp
 'undo-failure' => "Tsy afaka esorina io fanovàna io : mety tsy miraikitra amin'ny fanovàna misy eo ampivoaniny ra esorina",
 'undo-norev' => 'Tsy afaka nesorina ilay fanovàna satria tsy misy na efa voafafa izy.',
 'undo-summary' => "Niala ny fanovàna $1 nataon'i [[Special:Contributions/$2|$2]] ([[User talk:$2|resaho]])",
+'undo-summary-username-hidden' => 'Namafa ny famerenana $1 nataom-pikambana afenina',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Tsy afaka manokatra kaonty ianao.',
@@ -1207,6 +1269,7 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
 'compareselectedversions' => 'Ampitahao ireo version voafidy',
 'showhideselectedversions' => 'Aseho/asitrika ireo ny santiôna nofidiana',
 'editundo' => 'esory',
+'diff-empty' => '(Tsy misy mahasamihafa)',
 'diff-multi' => "({{PLURAL:$1|Famerenana tokana|Famerenana $1}} nataon'ny {{PLURAL:$2|mpikambana iray|mpikambana $2}} tsy miseho)",
 'diff-multi-manyusers' => "Tsy naseho ny antiôna $1{{PLURAL:}} nataon'ny mpikambana $2.",
 
@@ -1230,7 +1293,6 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
 'searchmenu-legend' => 'Safidy mikasika ny fitadiavana',
 'searchmenu-exists' => "'''Misy pejy mitondra anarana « [[:$1]] » eto amin'ity wiki ity'''",
 'searchmenu-new' => "'''Hanamboatra ny pejy « [[:$1|$1]] » eto amin'ity wiki ity !'''",
-'searchhelp-url' => 'Help:Fanoroana',
 'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Hitady pejy manomboka amin'io tovona io]]",
 'searchprofile-articles' => 'Pejy misy votoatiny',
 'searchprofile-project' => 'Pejy fanampiana sy pejy tetikasa',
@@ -1274,15 +1336,7 @@ ihany no miseho amin'ny vokatry ny karoka).",
 'powersearch-togglenone' => 'Tsy misy',
 'search-external' => 'Hikaroka any ivelany',
 'searchdisabled' => "Tsy nalefa ny karoka eto amin'i {{SITENAME}}. Afaka mampiasa an'i Google aloha ianao mandra-paha. Nefa fantaro fa mety ho efa lany daty ny valiny omeny.",
-
-# Quickbar
-'qbsettings' => 'Tsipika fiasàna',
-'qbsettings-none' => 'Tsy misy',
-'qbsettings-fixedleft' => 'Ankavia',
-'qbsettings-fixedright' => 'Ankavanana',
-'qbsettings-floatingleft' => 'Mitsingevaheva any ankavanana',
-'qbsettings-floatingright' => 'Mitsigevaheva any ankavanana',
-'qbsettings-directionality' => "Tsy mihetsika, arakaraky ny fizotran'ny soratra amin'ny teninao (avy any havanana miankavia, na avy any havia miankavanana)",
+'search-error' => 'Hadisoana nitranga tam-pikarohana: $1',
 
 # Preferences page
 'preferences' => 'Ny momba anao',
@@ -1316,7 +1370,6 @@ ihany no miseho amin'ny vokatry ny karoka).",
 'resetprefs' => 'Avereno',
 'restoreprefs' => "Hamerina ny safidy taloha (amin'ny fizarana rehetra)",
 'prefs-editing' => 'Fanovana',
-'prefs-edit-boxsize' => "Haben'ny varavarankelim-panovàna",
 'rows' => 'Filaharana :',
 'columns' => 'Tsanganana/Tioba :',
 'searchresultshead' => 'Fikarohana',
@@ -1327,10 +1380,6 @@ ihany no miseho amin'ny vokatry ny karoka).",
 'recentchangesdays-max' => '($1 andro{{PLURAL:$1||}} fara-faha betsany)',
 'recentchangescount' => "Isan'ny fanovana haseho (tsipalotra) :",
 'prefs-help-recentchangescount' => 'Misy ny fanovana farany, ny tantaram-pejy ary ny laogy',
-'prefs-help-watchlist-token' => "Ny famenoana ity fampidiran-teny ity amina soramiafina iray dia hamoaka topaka RSS ho an'ny pejy arahinao.
-Afaka mamaky ny lisitry ny pejy arahinao izay olona mahalala io soramiafina io, mifidiana sanda sarotra hita ianao noho izany.
-Ity misy soramiafina navoaka amin'ny fomba kisendra afaka ampiasainao :
-$1",
 'savedprefs' => 'Voatahiry ny mombamomba anao.',
 'timezonelegend' => "Faritr'ora :",
 'localtime' => 'Ora an-toerana',
@@ -1361,7 +1410,6 @@ Fenoy araka ny datin'ny solosainan'ny mpitsidika",
 'prefs-common-css-js' => "JavaScript ary CSS zaraina ho an'ny fiankanjoana rehetra:",
 'prefs-reset-intro' => "Azonao ampiasaina ity pejy ity mba hamerina ny safidinao amin'izay safidy tsipalotr'ilay sehatra. Tsy azo averina io.",
 'prefs-emailconfirm-label' => 'Famarinana ny imailaka :',
-'prefs-textboxsize' => "Hangezan'ny varavarankely fanovana",
 'youremail' => 'Imailaka:',
 'username' => '{{GENDER:$1}}Anaram-pikambana :',
 'uid' => '{{GENDER:$1}}mpikambana :',
@@ -1393,6 +1441,8 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'prefs-dateformat' => 'Endriky ny daty',
 'prefs-timeoffset' => 'Elanelana ora',
 'prefs-advancedediting' => 'Antsipirihan-tsafidy',
+'prefs-editor' => 'Mpanova',
+'prefs-preview' => 'Topi-maso',
 'prefs-advancedrc' => 'Antsipirihan-tsafidy',
 'prefs-advancedrendering' => 'Antsipirihan-tsafidy',
 'prefs-advancedsearchoptions' => 'Antsipirihan-tsafidy',
@@ -1400,7 +1450,9 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'prefs-displayrc' => 'safidim-tseho',
 'prefs-displaysearchoptions' => 'Safidin-tseho',
 'prefs-displaywatchlist' => 'Safidin-tseho',
+'prefs-tokenwatchlist' => 'Token',
 'prefs-diffs' => 'Diff',
+'prefs-help-prefershttps' => "Hihatra amin'ny fidiranao manaraka ity safidy ity.",
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Adiresy imailaka mameno fepetra',
@@ -1427,6 +1479,8 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'userrights-notallowed' => 'Tsy manana alalana ny manova na manampy zom-pikambana ianao.',
 'userrights-changeable-col' => 'Ny gropy azonao ovaina',
 'userrights-unchangeable-col' => 'Ny gropy tsy azonao ovaina',
+'userrights-conflict' => 'Fifandonana fanovana zom-pikambana! Avereno vakiana ary marino ny fanovanao.',
+'userrights-removed-self' => "Afakao soa aman-tsara ny zonao. Noho izany, tsy afaka mijery amin'ilay pejy intsony ianao.",
 
 # Groups
 'group' => 'Gropy :',
@@ -1492,11 +1546,19 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'right-proxyunbannable' => "Tsy voakasiky ny fanakana mande hoazy avy amin'ny proxy",
 'right-unblockself' => "Manala ny hidin'ny tena",
 'right-protect' => "Manova ny lenta fiarovan'ny pejy sy manova ny pejy voaaro miriana",
-'right-editprotected' => 'Manova ny pejy voaaro (tsy misy fiarovana en cascade)',
+'right-editprotected' => 'Manova pejy voaaro (tsy misy fiarovana en cascade)',
+'right-editsemiprotected' => 'Hanova ny pejy narovna ho "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Manova ny interface ny mpikambana',
 'right-editusercssjs' => 'Manova ny rakitra CSS sy JS ny mpikambana hafa',
 'right-editusercss' => 'Manova ny rakitra CSS ny mpikambana hafa',
 'right-edituserjs' => "Manova ny rakitra JS an'ny mpikambana hafa",
+'right-editmyusercss' => 'Manova ny rakitra CSS-nao',
+'right-editmyuserjs' => 'Manova ny rakitra JavaScript-nao',
+'right-viewmywatchlist' => 'Mijery ny pejy arahanao',
+'right-editmywatchlist' => 'Manova ny lisitry ny pejy arahanao. Fantaro koa fa hanampy pejy ny tao sasany na dia tsy manana ity zo ity aza.',
+'right-viewmyprivateinfo' => 'Mijery ny fampahalalana tsy sarababem-bahoakanao (oh. adiresy mailaka, tena anarana)',
+'right-editmyprivateinfo' => 'Manova ny fampahalalana momba anao (oh. mailaka, tena anarana)',
+'right-editmyoptions' => 'Manova ny safidinao',
 'right-rollback' => "Mamafa haingankaingana ny fanovan'ny mpandray anjara farany amina pejy manokana",
 'right-markbotedits' => "Manamarika ny fanovana voafafa hoatry ny nataon'ny rôbô.",
 'right-noratelimit' => 'Tsy voafetra ny isa',
@@ -1558,12 +1620,19 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'action-userrights-interwiki' => "hanova ny fahefan'ny mpikambana any amin'ny wiki hafa",
 'action-siteadmin' => 'Manidy sy manokatra ny banky angona',
 'action-sendemail' => 'handefa imailaka',
+'action-editmywatchlist' => 'Manova ny lisitry ny pejy arahana',
+'action-viewmywatchlist' => 'Mijery ny pejy arahanao',
+'action-viewmyprivateinfo' => 'Mijery ny fampahalalana tsy sarababem-bahoakanao',
+'action-editmyprivateinfo' => 'Mijery ny fampahalalana sarababem-bahoakanao',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|fanovana|fanovana}} $1',
+'enhancedrc-since-last-visit' => '$1 ({{PLURAL:$1|hatry ny famangiana farany}})',
+'enhancedrc-history' => 'tantara',
 'recentchanges' => 'Fanovana farany',
 'recentchanges-legend' => 'Safidy ny fanovàna farany',
 'recentchanges-summary' => "Jereo eto amin'ity pejy ity izay vao niova vao haingana teto amin'ity wiki ity.",
+'recentchanges-noresult' => "Tsy misy fanovana miady amin'ny fepe-potoana napetraka.",
 'recentchanges-feed-description' => "Arao ny fanovàna farany amin'ity wiki ity anaty topa",
 'recentchanges-label-newpage' => 'Namorona pejy vaovao io fanovana io',
 'recentchanges-label-minor' => 'Kely fotsiny ity fanovana ity',
@@ -1600,7 +1669,6 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'recentchangeslinked-feed' => 'Novaina',
 'recentchangeslinked-toolbox' => 'Novaina',
 'recentchangeslinked-title' => "Fanaraha-maso ny pejy miarak'amin'ny « $1 »",
-'recentchangeslinked-noresult' => "Tsy nisy fanovana teo amin'ny pejy voarohy mandritry ny fotoana voafidy.",
 'recentchangeslinked-summary' => "Mampiseho ny fanovàna vao haingana ity pejy manokana ity. Voasoratra amin'ny '''sora-matavy''' ny lohaten'ny [[Special:Watchlist|pejy arahinao-maso]].",
 'recentchangeslinked-page' => 'anaram-pejy :',
 'recentchangeslinked-to' => "Ampisehoy ny fanovàn'ny pejy misy rohy makany amin'ny pejy fa tsy atao mivadika",
@@ -1611,7 +1679,7 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'reuploaddesc' => "Miverena any amin'ny fisy fandefasan-drakitra.",
 'upload-tryagain' => "Hanfefa ny fanoritan'ny rakitra novaina",
 'uploadnologin' => 'Tsy niditra',
-'uploadnologintext' => 'Mila [[Special:UserLogin|misoratra anarana]] aloha vao afaka mandefa rakitra.',
+'uploadnologintext' => 'Mila $1 ianao vao afaka mandefa rakitra.',
 'upload_directory_missing' => "Ny petra-drakitra ampidiran-drakitra ($1) dia tsy misy ary tsy afaka namboarin'ny lohamilin-tranonkala.",
 'upload_directory_read_only' => "Ny répertoire ($1) handraisana ny rakitra alefan'ny mpikambana dia tsy afaka anoratana.",
 'uploaderror' => 'Nisy tsy fetezana ny fandefasana rakitra',
@@ -1819,7 +1887,6 @@ ity wiki ity dia no-regler-na ho sarababem-bahoaka.",
 'http-read-error' => "Tsy fetezana momban'ny famakiana HTTP.",
 'http-timed-out' => 'Ny fangatahana HTTP dia efa lany daty.',
 'http-curl-error' => 'Tsi-fetezana teo am-pangalana ny URL : $1',
-'http-host-unreachable' => 'URL tsy afaka andehanana',
 'http-bad-status' => 'Nisy tsi-fetezana teo ampandefasana ny hataka HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1848,6 +1915,8 @@ Rehefa sivanin'ny mpikambana iray izy ity, ny rakitra izay ahitana santiôna vao
 'listfiles_size' => 'Habe',
 'listfiles_description' => 'Visavisa',
 'listfiles_count' => 'Version',
+'listfiles-latestversion-yes' => 'Eny',
+'listfiles-latestversion-no' => 'Tsia',
 
 # File description page
 'file-anchor-link' => 'Rakitra',
@@ -1935,6 +2004,13 @@ Aza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny
 'randompage' => 'Takelaka kisendra',
 'randompage-nopages' => "Tsy misy pejy ao amin'ny anaran-tsehatra {{PLURAL:$2}} : $1.",
 
+# Random page in category
+'randomincategory' => "Pejy kisendra ao amin'ny sokajy",
+'randomincategory-invalidcategory' => 'Tsy anaran-tsokajy azo raisina "$1"',
+'randomincategory-nopages' => "Tsy misy pejy ao amin'i [[:Category:$1]]",
+'randomincategory-selectcategory' => "Haka pejy kisendra ao amin'ny sokajy: $1 $2",
+'randomincategory-selectcategory-submit' => 'Alefa',
+
 # Random redirect
 'randomredirect' => 'Pejy fihodinana kisendra',
 'randomredirect-nopages' => "Tsy misy pejy fihodinana eo amin'ny anaran-tsehatra «$1»",
@@ -1959,14 +2035,13 @@ Aza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny
 'statistics-users-active-desc' => "Mpikambana nanao zavatra teto tanatin'ny $1 andro{{PLURAL:}}.",
 'statistics-mostpopular' => 'Pejy voatsidika',
 
-'disambiguations' => 'Pejy misy rohy amina pejy fanalana ny fisalasalana',
-'disambiguationspage' => 'Template:homonimia',
-
 'pageswithprop' => 'Pejy misy toe-pejy',
 'pageswithprop-legend' => 'Pejy misy toe-pejy',
 'pageswithprop-text' => 'Manalisitra ny pejy mampiasa toe-pejy manokana ity',
 'pageswithprop-prop' => "Anaran'ilay tondro",
 'pageswithprop-submit' => 'Alefa',
+'pageswithprop-prophidden-long' => 'Sandan-toe-dahatsoratra lava miafina ($1)',
+'pageswithprop-prophidden-binary' => 'sandan-toetra roa fototra miafina ($1)',
 
 'doubleredirects' => 'Fihodinana roa',
 'double-redirect-fixed-move' => "Ity fihodinana ity, nanana ny tanjona [[$1]] novaina anarana, dia mitondra mankany amin'ny [[$2]].",
@@ -2204,10 +2279,9 @@ na tsy maniry handray imailaka avy amin'ny mpikambana hafa izy.",
 'unwatchthispage' => 'Aza arahana intsony',
 'notanarticle' => 'Tsy votoatim-pejy ity pejy ity',
 'notvisiblerev' => 'Voafafa ilay santiôna',
-'watchnochange' => 'Tsy niova nandritra ny fe-potoana miseho ny zavatra arahanao',
 'watchlist-details' => "Pejy $1{{PLURAL:}} ao amin'ny lisitry ny pejy arahanao, tsy isaina ny pejin-dresaka.",
-'wlheader-enotif' => "* Mandeha ny fampilazana amin'ny alalan'ny imailaka.",
-'wlheader-showupdated' => "* <b>Voasorabaventy</b> ny pejy niova taorian'ny famangianao farany.",
+'wlheader-enotif' => "Alefa ny fampilazana amin'ny mailaka.",
+'wlheader-showupdated' => "Aseho '''sorabaventy''' ny pejy niova taorian'ny famangianao azy farany.",
 'watchmethod-recent' => 'fanamarinana ny fanovana farany hahitana pejy arahana',
 'watchmethod-list' => 'fanamarinana ny pejy arahana ahitana fanovana farany',
 'watchlistcontains' => "Ao amin'ny pejy arahanao dia ahitana pejy $1{{PLURAL:}}.",
@@ -2445,7 +2519,7 @@ $1',
 'contributions' => "Fandraisan'anjaran'ny mpikambana{{GENDER:$1}}",
 'contributions-title' => "Fandraisan'anjaran'i $1",
 'mycontris' => "Fandraisan'anjara",
-'contribsub2' => "ho an'ny $1 ($2)",
+'contribsub2' => "Ho an'ny $1 ($2)",
 'nocontribs' => "Tsy misy fanovana mifanaraka amin'ireo critères ireo.",
 'uctop' => '(ankehitriny)',
 'month' => "Tamin'ny volana (sy teo aloha) :",
@@ -2599,11 +2673,8 @@ Mety efa natao angamba ny fanalana sakana.',
 Ao amin'ny laharana $2 izay afaka alàna sakana anefa izy io.",
 'ip_range_invalid' => 'Tsy mety io IP io.',
 'ip_range_toolarge' => 'Ny fanidiana laharana IP ngeza nohonny /$1 dia tsy azo atao.',
-'blockme' => 'Sakano ahy',
 'proxyblocker' => 'Mpisakana proxy',
-'proxyblocker-disabled' => 'Tsy mandeha io asa io.',
 'proxyblockreason' => "Voasakana ny adiresy IP-nao satria adiresy proxy malalaka izy io. Azafady mba lazao amin'ny mpanome internet anao io olana io.",
-'proxyblocksuccess' => 'Vita.',
 'sorbsreason' => "Voasokokajin'ny DNSBL ho ao anatin'ny proxy midanadana ny adiresy IP-nao.",
 'sorbs_create_account_reason' => "Voasokajy ho isan'ny proxy midanadana ao amin'ny DNSBL ny adiresy IP-nao. Ireo IP ireo dia ahiana ho fitaovana azon'ny mpandefa spam ampiasaina. Tsy afaka manokatra kaonty ianao.",
 'cant-block-while-blocked' => 'Tsy azo sakananao ny mpikambana hafa raha mbola voasakana ianao.',
@@ -2765,6 +2836,8 @@ Andana vangio ny [//www.mediawiki.org/wiki/Localisation Fandikana an'i Mediawiki
 'thumbnail-more' => 'Angedazina',
 'filemissing' => 'Tsy hita ny rakitra',
 'thumbnail_error' => 'Tsy fetezana eo am-panamboarana ilay saritapaka : $1',
+'thumbnail_error_remote' => "Hafa-kadisoana avy amin'i $1:
+$2",
 'djvu_page_error' => "Pejy DjVu any ivelan'ny fetra",
 'djvu_no_xml' => "Tsy afaka alaina ny XML ho an'ny rakitra DjVu",
 'thumbnail-temp-create' => 'Tsy afaka namorona ilay thumbnail miserana',
@@ -3041,6 +3114,19 @@ Raha alefanao ilay izy, mety ho simban'io renifango io ny solosainao.",
 'ago' => '$1 lasa izay',
 'just-now' => 'vao izao',
 
+# Human-readable timestamps
+'hours-ago' => '$1 ora lasa{{PLURAL:$1}}',
+'minutes-ago' => '$1{{PLURAL:$1}} minitra lasa',
+'seconds-ago' => '$1 segondra lasa{{PLURAL:$1}}',
+'monday-at' => "Alatsinainy tamin'ny $1",
+'tuesday-at' => "Talata tamin'ny $1",
+'wednesday-at' => "Alarobia tamin'ny $1",
+'thursday-at' => "Alakamisy tamin'ny $1",
+'friday-at' => "Zoma tamin'ny $1",
+'saturday-at' => "Sabotsy tamin'ny $1",
+'sunday-at' => "Alahady tamin'ny $1",
+'yesterday-at' => "Omaly tamin'ny $1",
+
 # Bad image list
 'bad_image_list' => "Ity ny andrefiny :
 
@@ -3068,7 +3154,7 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Halalaka',
 'exif-imagelength' => 'Haavo',
 'exif-bitspersample' => 'Bit isaky ny singa',
@@ -3372,13 +3458,6 @@ Andramo ny topi-maso tsotra',
 'version-software-product' => 'Vokatra',
 'version-software-version' => 'Santiôna',
 
-# Special:FilePath
-'filepath' => "Lalan'ny drakitra",
-'filepath-page' => 'Rakitra',
-'filepath-submit' => 'Handeha',
-'filepath-summary' => "Mamerina ny lalam-pandehanana any amin'ilay rakitra ity pejy ity.
-Aseho amin'ny tena habeny ny sary aseho, ny hafa dia alefa miaraka amin'ny rindrankajy miaraka aminy avy hatrany.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Hitady rakitra mitovy endrika',
 'fileduplicatesearch-legend' => 'Hitady mitovy endrika',
diff --git a/languages/messages/MessagesMhr.php b/languages/messages/MessagesMhr.php
index 45f2bc82..5952fe52 100644
--- a/languages/messages/MessagesMhr.php
+++ b/languages/messages/MessagesMhr.php
@@ -22,8 +22,8 @@ $namespaceNames = array(
 	NS_SPECIAL          => 'Лӱмын_ыштыме',
 	NS_TALK             => 'Каҥашымаш',
 	NS_USER             => 'Пайдаланыше',
-	NS_USER_TALK        => 'Пайдаланышын_каҥашымаш',
-	NS_PROJECT_TALK     => '$1ын_каҥашымаш',
+	NS_USER_TALK        => 'Пайдаланышын_каҥашымашыже',
+	NS_PROJECT_TALK     => '$1ын_каҥашымашыже',
 	NS_FILE             => 'Файл',
 	NS_FILE_TALK        => 'Файл_шотышто_каҥашымаш',
 	NS_TEMPLATE         => 'Кышкар',
@@ -53,6 +53,8 @@ $namespaceAliases = array(
 	'Обсуждение_категории'               => NS_CATEGORY_TALK,
 
 	// Namspace changes
+	'Пайдаланышын_каҥашымаш'    => NS_USER_TALK,
+	'$1ын_каҥашымаш'            => NS_PROJECT_TALK,
 	'Файлын_каҥашымаш'          => NS_FILE_TALK,
 	'Ямдылык'                   => NS_TEMPLATE,
 	'Ямдылык_шотышто_каҥашымаш' => NS_TEMPLATE_TALK,
@@ -65,6 +67,12 @@ $namespaceAliases = array(
 $namespaceGenderAliases = array();
 
 $specialPageAliases = array(
+	'Blankpage'                 => array( 'Пуста_лаштык' ),
+	'BrokenRedirects'           => array( 'Кӱрылтшӧ__вес_вере_колтымаш-влак' ),
+	'Categories'                => array( 'Категорий-влак' ),
+	'ComparePages'              => array( 'Лаштык-влакым_тергымаш' ),
+	'Emailuser'                 => array( 'Пайдаланышылан_серышым_колташ' ),
+	'Longpages'                 => array( 'Кужу_лаштык-влак' ),
 	'Preferences'               => array( 'Келыштарымаш' ),
 	'Recentchanges'             => array( 'Пытартыш_тӧрлатымаш-влак' ),
 	'Search'                    => array( 'Кычалмаш' ),
@@ -81,6 +89,7 @@ $magicWords = array(
 	'img_top'                   => array( '1', 'кӱшычын', 'сверху', 'top' ),
 	'img_middle'                => array( '1', 'покшелне', 'посередине', 'middle' ),
 	'img_bottom'                => array( '1', 'ӱлычын', 'снизу', 'bottom' ),
+	'sitename'                  => array( '1', 'САЙТЛӰМ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
 );
 
 $messages = array(
@@ -107,7 +116,6 @@ $messages = array(
 'tog-enotifwatchlistpages' => 'Мыйын эскерыме лӱмер гыч лаштыкыште тӧрлатымыш нерген электрон почто гоч шижтараш',
 'tog-enotifusertalkpages' => 'Мыйын каҥашымаш лаштыкыште тӧрлатымыш нерген электрон почто гоч шижтараш',
 'tog-oldsig' => 'Кызытсе кидпале',
-'tog-showjumplinks' => '"Куснаш …" ешартыш кылверым чӱкташ',
 'tog-watchlisthideown' => 'Эскерыме лӱмер гыч мыйын тӧрлатымашым кораҥдаш',
 'tog-watchlisthidebots' => 'Эскерыме лӱмер гыч бот-влакын тӧрлатымашыштым кораҥдаш',
 'tog-watchlisthideminor' => 'Эскерыме лӱмер гыч изи тӧрлатымаш-влакым кораҥдаш',
@@ -267,7 +275,7 @@ $messages = array(
 'jumptosearch' => 'кычалмаш',
 'pool-errorunknown' => 'Палыдыме йоҥылыш',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} нерген',
 'aboutpage' => 'Project:Нерген',
 'copyright' => 'Лаштыкыште возымо $1 йӧн дене почмо.',
@@ -277,7 +285,6 @@ $messages = array(
 'disclaimers' => 'Вуйшиймаш деч кораҥмаш',
 'disclaimerpage' => 'Project:Вуйшиймаш деч кораҥмаш',
 'edithelp' => 'Тӧрлатымаш полыш',
-'edithelppage' => 'Help:Тӧрлымаш',
 'helppage' => 'Help:Полшык',
 'mainpage' => 'Тӱҥ лаштык',
 'mainpage-description' => 'Тӱҥ лаштык',
@@ -524,7 +531,6 @@ $messages = array(
 'shown-title' => 'Лаштыкыште $1 {{PLURAL:$1|возымаш|возымашым}} ончыкташ',
 'viewprevnext' => 'Ончал ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-new' => "'''Тиде вики-проектыште «[[:$1]]» лӱман лаштыкым ышташ!'''",
-'searchhelp-url' => 'Help:Вуйлымаш',
 'searchprofile-articles' => 'Возымо лаштык-влак',
 'searchprofile-project' => 'Полыш да проект лаштык',
 'searchprofile-images' => 'Мультимедий',
@@ -666,7 +672,6 @@ $messages = array(
 'recentchangeslinked-feed' => 'Ваш кылдалтше тӧрлатымаш-влак',
 'recentchangeslinked-toolbox' => 'Ваш кылдалтше тӧрлатымаш-влак',
 'recentchangeslinked-title' => '"$1" лаштык дене кылдалтше тӧрлатымаш-влак',
-'recentchangeslinked-noresult' => 'Ончыктымо пагытыште кылдалтше лаштыклаште вашталтыш лийын огыл.',
 'recentchangeslinked-summary' => "Это список недавних изменений в страницах, на которые ссылается указанная страница (или входящих в указанную категорию).
 Страницы, входящие в [[Special:Watchlist|ваш список наблюдения]] '''выделены'''.",
 'recentchangeslinked-page' => 'Лаштыкын лӱмжӧ:',
@@ -1123,9 +1128,6 @@ $messages = array(
 # Special:Version
 'version-specialpages' => 'Лӱмын ыштыме лаштык-влак',
 
-# Special:FilePath
-'filepath-page' => 'Файл:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Кычалаш',
 
diff --git a/languages/messages/MessagesMin.php b/languages/messages/MessagesMin.php
index bab40709..13541664 100644
--- a/languages/messages/MessagesMin.php
+++ b/languages/messages/MessagesMin.php
@@ -19,8 +19,96 @@
 $fallback = 'id';
 
 $namespaceNames = array(
+	NS_MEDIA            => 'Media',
+	NS_SPECIAL          => 'Istimewa',
+	NS_TALK             => 'Maota',
+	NS_USER             => 'Pangguno',
+	NS_USER_TALK        => 'Rundiang_Pangguno',
+	NS_PROJECT_TALK     => 'Rundiang_$1',
 	NS_FILE             => 'Berkas',
+	NS_FILE_TALK        => 'Rundiang_Berkas',
+	NS_MEDIAWIKI        => 'MediaWiki',
+	NS_MEDIAWIKI_TALK   => 'Rundiang_MediaWiki',
 	NS_TEMPLATE         => 'Templat',
+	NS_TEMPLATE_TALK    => 'Rundiang_Templat',
+	NS_HELP             => 'Bantuan',
+	NS_HELP_TALK        => 'Rundiang_Bantuan',
+	NS_CATEGORY         => 'Kategori',
+	NS_CATEGORY_TALK    => 'Rundiang_Kategori',
+);
+
+$namespaceAliases = array(
+	# Indonesian namespaces
+	'Istimewa'              => NS_SPECIAL,
+	'Pembicaraan'           => NS_TALK,
+	'Pengguna'              => NS_USER,
+	'Pembicaraan_Pengguna'  => NS_USER_TALK,
+	'Pembicaraan_$1'        => NS_PROJECT_TALK,
+	'Berkas'                => NS_FILE,
+	'Pembicaraan_Berkas'    => NS_FILE_TALK,
+	'Pembicaraan_MediaWiki' => NS_MEDIAWIKI_TALK,
+	'Templat'               => NS_TEMPLATE,
+	'Pembicaraan_Templat'   => NS_TEMPLATE_TALK,
+	'Bantuan'               => NS_HELP,
+	'Pembicaraan_Bantuan'   => NS_HELP_TALK,
+	'Kategori'              => NS_CATEGORY,
+	'Pembicaraan_Kategori'  => NS_CATEGORY_TALK,
+);
+
+$specialPageAliases = array(
+	'Activeusers'               => array( 'PanggunoAktip', 'Pangguno_aktip' ),
+	'Allmessages'               => array( 'PasanSistim', 'Pasan_sistem' ),
+	'Allpages'                  => array( 'DaptaLaman', 'Dapta_laman' ),
+	'Ancientpages'              => array( 'LamanLamo', 'Laman_lamo' ),
+	'Badtitle'                  => array( 'JudulBuruak', 'Judul_indak_rancak' ),
+	'Blankpage'                 => array( 'LamanKosong', 'Laman_kosong' ),
+	'Block'                     => array( 'Blokir', 'IPkanaiBlok', 'PanggunoTablokir' ),
+	'Blockme'                   => array( 'BlokDen', 'BlokirAmbo' ),
+	'Booksources'               => array( 'SumberBuku', 'Sumber_buku' ),
+	'BrokenRedirects'           => array( 'PangaliahanRusak', 'Pangaliahan_rusak' ),
+	'Categories'                => array( 'Kategori' ),
+	'ChangeEmail'               => array( 'GantiSurel', 'Ganti_surel' ),
+	'ChangePassword'            => array( 'GantiSandi', 'TukaSandi', 'TukaKatoSandi' ),
+	'ComparePages'              => array( 'BandiangkanLaman', 'Bandiangkan_laman' ),
+	'Confirmemail'              => array( 'PastikanSurel', 'Pastikan_surel' ),
+	'Contributions'             => array( 'SuntiangPangguno', 'Suntiangan_pangguno' ),
+	'CreateAccount'             => array( 'BuekAkun', 'Buek_akun' ),
+	'Deadendpages'              => array( 'LamanBuntu', 'Laman_buntu' ),
+	'DeletedContributions'      => array( 'SuntiangDihapuih', 'Suntiangan_kanai_hapuih' ),
+	'Disambiguations'           => array( 'SamoArti', 'Samo_arti' ),
+	'EditWatchlist'             => array( 'SuntiangDaptaPantau', 'Suntiang_dapta_pantau' ),
+	'Emailuser'                 => array( 'SurelPangguno', 'Surel_pangguno' ),
+	'Export'                    => array( 'Ekspor' ),
+	'Fewestrevisions'           => array( 'ParubahanTasaketek', 'Parubahan_tasaketek' ),
+	'FileDuplicateSearch'       => array( 'CariBerkasDuplikat', 'Cari_berkas_duplikat' ),
+	'Filepath'                  => array( 'LokasiBerkas', 'Lokasi_berkas' ),
+	'Import'                    => array( 'Impor' ),
+	'Invalidateemail'           => array( 'BatalSurel', 'Batalkan_surel' ),
+	'JavaScriptTest'            => array( 'TesSkripJava', 'Tes_skrip_Java' ),
+	'BlockList'                 => array( 'DaptaBlokir', 'Dapta_pemblokiran', 'Dapta_IP_diblok' ),
+	'LinkSearch'                => array( 'CariTautan', 'Cari_tautan' ),
+	'Listadmins'                => array( 'DaptaPanguruih' ),
+	'Listfiles'                 => array( 'DaptaBerkas', 'DaptaGamba' ),
+	'Listgrouprights'           => array( 'DaptaHakKalompok', 'HakKalompokPangguno' ),
+	'Listredirects'             => array( 'DaptaPangaliahan', 'Dapta_pangaliahan' ),
+	'Listusers'                 => array( 'DaptaPangguno', 'Dapta_pangguno' ),
+	'Lockdb'                    => array( 'KunciBD', 'Kunci_basisdata' ),
+	'Log'                       => array( 'Catatan' ),
+	'Lonelypages'               => array( 'LamanYatim', 'Laman_indak_batuan' ),
+	'Longpages'                 => array( 'LamanPanjang', 'Laman_panjang' ),
+	'MergeHistory'              => array( 'SajarahPanggabuangan', 'Sajarah_panggabuangan' ),
+	'MIMEsearch'                => array( 'CariMIME', 'PancarianMIME' ),
+	'Mostcategories'            => array( 'KategoriTabanyak', 'Kategori_tabanyak' ),
+	'Mostimages'                => array( 'BerkasAcokDipakai', 'BerkasTabanyak', 'GambaTabanyak' ),
+	'Mostinterwikis'            => array( 'InterwikiAcokDipakai' ),
+	'Mostlinked'                => array( 'LamanTautanTabanyak', 'TautanTabanyak' ),
+	'Mostlinkedcategories'      => array( 'KategoriBatauikTabanyak', 'KategoriAcokTapakai' ),
+	'Mostlinkedtemplates'       => array( 'TemplatTautanTabanyak', 'TemplatAcokDipakai' ),
+	'Mostrevisions'             => array( 'ParubahanTabanyak' ),
+	'Movepage'                  => array( 'PindahLaman', 'Pindahkan_laman' ),
+	'Mycontributions'           => array( 'SuntianganAmbo', 'Suntiangan_ambo' ),
+	'Mypage'                    => array( 'LamanDenai', 'Laman_denai' ),
+	'Mytalk'                    => array( 'DiskusiAmbo' ),
 );
 
 $messages = array(
@@ -54,9 +142,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Tunjuakan jumlah pamantau',
 'tog-oldsig' => 'Tando tangan kini:',
 'tog-fancysig' => 'Jadikan tando tangan manjadi teks wiki (indak jo tautan otomatis)',
-'tog-externaleditor' => 'Gunokan editor dari lua sacaro bawaan (untuak nan ahli sajo, butuah pangaturan khusus di komputer Sanak [//www.mediawiki.org/wiki/Manual:External_editors Informasi labiah lanjuik.])',
-'tog-externaldiff' => 'Gunokan diff eksternal sacaro bawaan (untuak nan ahli sajo, kabutuahan pangaturan khusus pado komputer Sanak [//www.mediawiki.org/wiki/Manual:External_editors Informasi labiah lanjuik.].)',
-'tog-showjumplinks' => 'Aktifkan pautan bantuan "langsuang ka"',
 'tog-uselivepreview' => 'Gunoan pratonton langsuang (paralu JavaScript) (uji-cubo)',
 'tog-forceeditsummary' => 'Ingekan ambo bilo kotak ikhtisar suntiangan kosong',
 'tog-watchlisthideown' => 'Suruakan suntiangan surang pado daftar pantau',
@@ -69,6 +154,7 @@ $messages = array(
 'tog-diffonly' => 'Jan tampilan isi laman di bawah pabedoan suntiangan',
 'tog-showhiddencats' => 'Tunjuakan kategori tasuruak',
 'tog-norollbackdiff' => 'Jan tampilan pabedoan sasudah malakukan pangambalian',
+'tog-useeditwarning' => 'Ingekan denai kok denai maninggakan laman suntiang sabalun manyimpan parubahan',
 
 'underline-always' => 'Taruih',
 'underline-never' => 'Indak pernah',
@@ -132,6 +218,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nop',
 'dec' => 'Des',
+'january-date' => '$1 Januari',
+'february-date' => '$1 Pebruari',
+'march-date' => '$1 Maret',
+'april-date' => '$1 April',
+'may-date' => '$1 Mai',
+'june-date' => '$1 Juni',
+'july-date' => '$1 Juli',
+'august-date' => '$1 Agustus',
+'september-date' => '$1 September',
+'october-date' => '$1 Oktober',
+'november-date' => '$1 Nopember',
+'december-date' => '$1 Desember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori}}',
@@ -256,7 +354,7 @@ $1',
 'pool-queuefull' => 'Antrian panuah',
 'pool-errorunknown' => 'Kasalahan indak jaleh',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Tantang {{SITENAME}}',
 'aboutpage' => 'Project:Tantang_{{SITENAME}}',
 'copyright' => 'Isi tasadio dalam $1',
@@ -266,7 +364,6 @@ $1',
 'disclaimers' => 'Sanggahan umum',
 'disclaimerpage' => 'Project:Sanggahan umum',
 'edithelp' => 'Bantuan suntiangan',
-'edithelppage' => 'Help:Panyuntiangan',
 'helppage' => 'Help:Isi',
 'mainpage' => 'Palanta',
 'mainpage-description' => 'Palanta',
@@ -344,17 +441,6 @@ Daftar laman istimewa nan sah dapek dicaliak di [[Special:SpecialPages|{{int:spe
 # General errors
 'error' => 'Kasalahan',
 'databaseerror' => 'Kasalahan basis data',
-'dberrortext' => 'Kasalahan sintaks pado pamintaan basis data lah tajadi.
-Iko mungkin manandokan adonyo bug pado parangkek lunak.
-Pamintaan basis data nan tarakhir adalah:
-<blockquote><code>$1</code></blockquote>
-dari dalam fungsi "<code>$2</code>".
-Basis data manghasilkan kasalahan "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ado kasalahan sintaks pado pamintaan basis data.
-Pamintaan basis data nan terakhir adalah:
-"$1"
-dari dalam fungsi "$2".
-Basis data manghasilkan kasalahan "$3: $4".',
 'laggedslavemode' => 'Paringatan: Laman mungkin indak barisi parubahan tabaru.',
 'readonly' => 'Basis data dikunci',
 'enterlockreason' => 'Masuakkan alasan panguncian, tamasuak pakiraan bilo kunci akan dibuka',
@@ -404,7 +490,6 @@ Untuak manambah atau maubah tajamahan di kasado wiki, harap gunoan [//translatew
 'editinginterface' => "'''Paringatan:''' Sanak manyuntiang laman nan digunoan untuak manyadiokan teks antarmuko untuak parangkaik lunak.
 Parubahan teks ko akan mampangaruhi tampilan pado antarmuko pangguno untuak pangguno lain.
 Untuak tajamahan, harap gunoan [//translatewiki.net/wiki/Main_Page?setlang=min translatewiki.net], proyek palokalan MediaWiki.",
-'sqlhidden' => '(Pamintaan SQL disuruakan)',
 'cascadeprotected' => 'Laman iko alah dilindungi dari panyuntiangan karano disartokan di {{PLURAL:$1|laman}} barikuik nan alah dilindungi jo opsi "runtun":
 $2',
 'namespaceprotected' => "Sanak indak mampunyoi hak akses untuak manyuntiang laman di ruang namo '''$1'''.",
@@ -434,10 +519,18 @@ Parhatian bahawa bara laman mungkin masih taruih manunjukkan bahawa Sanak masih
 'welcomeuser' => 'Salamaik datang, $1!',
 'welcomecreation-msg' => 'Akun Sanak alah dibuek. Jan lupo maubah [[Special:Preferences|pangaturan {{SITENAME}}]] Sanak.',
 'yourname' => 'Namo pangguno:',
+'userlogin-yourname' => 'Namo pangguno',
+'userlogin-yourname-ph' => 'Masuakan namo pangguno',
 'yourpassword' => 'Kato sandi:',
+'userlogin-yourpassword' => 'Kato sandi',
+'userlogin-yourpassword-ph' => 'Masuakan kato sandi',
+'createacct-yourpassword-ph' => 'Masuakan kato sandi',
 'yourpasswordagain' => 'Ulang baliak kato sandi:',
+'createacct-yourpasswordagain' => 'Konfirmasi kato sandi',
+'createacct-yourpasswordagain-ph' => 'Masuakan lai kato sandi',
 'remembermypassword' => 'Ingek log masuak denai di paramban ko (salamo $1 {{PLURAL:$1|hari}})',
-'securelogin-stick-https' => 'Tetap tahubuang ka HTTPS sasudah masuk log',
+'userlogin-remembermypassword' => 'Biakan ambo tetap masuak',
+'userlogin-signwithsecure' => 'Gunoan server aman',
 'yourdomainname' => 'Domain Sanak:',
 'password-change-forbidden' => 'Sanak indak dapek maubah kato sandi di wiki ko.',
 'externaldberror' => 'Alah tajadi kasalahan otentikasi basis data eksternal atau Sanak indak diizinan malakuan pabaruan tahadok akun eksternal Sanak.',
@@ -449,18 +542,38 @@ Parhatian bahawa bara laman mungkin masih taruih manunjukkan bahawa Sanak masih
 'logout' => 'Kalua log',
 'userlogout' => 'Kalua log',
 'notloggedin' => 'Alun masuak log',
+'userlogin-noaccount' => 'Alun ado akun?',
+'userlogin-joinproject' => 'Join {{SITENAME}}',
 'nologin' => "Alun ado akun? '''$1'''.",
 'nologinlink' => 'Buek akun baru',
 'createaccount' => 'Buek akun',
 'gotaccount' => "Alah tadaftar sabagai pangguno? '''$1'''.",
 'gotaccountlink' => 'Masuak log',
 'userlogin-resetlink' => 'Lupo rincian info masuak Sanak?',
+'userlogin-resetpassword-link' => 'Buek ulang kato sandi',
+'helplogin-url' => 'Help:Masuak log',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bantuan untuak masuak log]]',
+'createacct-join' => 'Masuakan informasi Sanak di bawah ko.',
+'createacct-emailrequired' => 'Alamaik surel',
+'createacct-emailoptional' => 'Alamaik surel (opsional)',
+'createacct-email-ph' => 'Masuakan alamaik surel Sanak',
 'createaccountmail' => 'Pakai kato sandi sumbarang samantaro, lalu kirim ka alamaik surel nan di bawah ko',
+'createacct-realname' => 'Namo asli (opsional)',
 'createaccountreason' => 'Alasan:',
+'createacct-reason' => 'Alasan',
+'createacct-reason-ph' => 'Manga Sanak mambuek akun lain',
+'createacct-captcha' => 'Pamarisoan kaamanan',
+'createacct-imgcaptcha-ph' => 'Masuakan teks nan Sanak caliak di ateh',
+'createacct-submit' => 'Buek akun Sanak',
+'createacct-benefit-heading' => '{{SITENAME}} dibuek dek urang-urang saroman Sanak.',
+'createacct-benefit-body1' => '{{PLURAL:$1|suntiangan}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|laman}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|panyuntiang}} tarakhia',
 'badretype' => 'Kato sandi nan Sanak masuakan salah.',
 'userexists' => 'Namo pangguno nan dipiliah alah tapakai.
 Piliah namo nan lain.',
 'loginerror' => 'Kasalahan masuak log',
+'createacct-error' => 'Pambuatan akun gagal',
 'createaccounterror' => 'Indak dapek mambuek akun: $1',
 'nocookiesnew' => 'Akun pangguno alah dibuek, tapi Sanak alun masuak log.
 {{SITENAME}} manggunokan cookies untuak log pangguno.
@@ -537,7 +650,7 @@ Tunggulah sabanta sabalun mancubo baliak.',
 'newpassword' => 'Kato sandi baharu:',
 'retypenew' => 'Ketik ulang kato sandi baharu:',
 'resetpass_submit' => 'Atua kato sandi dan masuak log',
-'resetpass_success' => 'Kato sandi Sanak alah berhasil dituka!
+'changepassword-success' => 'Kato sandi Sanak alah berhasil dituka!
 Kini mamproses masuak log Sanak...',
 'resetpass_forbidden' => 'Kato sandi indak dapek dituka',
 'resetpass-no-info' => 'Sanak harus masuak log untuak mangakses laman iko sacara langsuang.',
@@ -550,10 +663,11 @@ Sanak mungkin alah berhasil mangganti kato sandi Sanak atau alah maminto kato sa
 
 # Special:PasswordReset
 'passwordreset' => 'Setel ulang kato sandi',
-'passwordreset-text' => 'Isi formulir ko untuak maubah kato sandi.',
+'passwordreset-text-one' => 'Lengkapkan formulir ko untuak manuka baliak kato sandi Sanak.',
+'passwordreset-text-many' => '{{PLURAL:$1|Masuakan data di bawah ko untuak manuka baliak kato sandi Sanak.}}',
 'passwordreset-legend' => 'Tuka baliak kato sandi',
 'passwordreset-disabled' => 'Pangubahan kato sandi alah dimatian di wiki iko.',
-'passwordreset-pretext' => '{{PLURAL:$1||Masuakan salah satu data di bawah ko}}',
+'passwordreset-emaildisabled' => 'Fitur surel alah dimatian pado wiki iko.',
 'passwordreset-username' => 'Namo pangguno:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Caliak kaputusannyo?',
@@ -577,7 +691,7 @@ Sanak harus masuak dan mamiliah sandi baru. Jikok urang lain mambuek pamintaan k
 Sandi samantaro: $2',
 'passwordreset-emailsent' => 'Surel parubahan kato sandi alah dikirim.',
 'passwordreset-emailsent-capture' => 'Surel parubahan kato sandi alah dikirim, nan nampak di bawah ko.',
-'passwordreset-emailerror-capture' => 'Surel pangingek nan ditampilkan di bawah alah dibuek, tapi pengirimannyo ka pangguno $1, gagal.',
+'passwordreset-emailerror-capture' => 'Surel parubahan kato sandi nan ditampilan di bawah, alah dibuek, tapi pangirimannyo ka {{GENDER:$2|pangguno}} gagal: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Tuka alamaik surel.',
@@ -793,6 +907,7 @@ Nyo alah ado.',
 'content-failed-to-parse' => 'Gagal manjabarkan konten $2 untuak model $1: $3',
 'invalid-content-data' => 'Data kanduangan indak valid.',
 'content-not-allowed-here' => 'Konten "$1" indak diizinan di laman [[$2]]',
+'editwarning-warning' => 'Maninggakan laman ko dapek maakibaikan parubahan nan dibuek hilang. Jikok Sanak lah masuak log, dapek mamatian pasan ko malalui bagian "Panyuntiangan" pado laman pangaturan.',
 
 # Content models
 'content-model-wikitext' => 'Teks wiki',
@@ -994,7 +1109,6 @@ $1",
 'searchmenu-legend' => 'Atua pancarian',
 'searchmenu-exists' => "'''Ado laman nan banamo \"[[:\$1]]\" pado wiki ko.'''",
 'searchmenu-new' => "'''Buek laman \"[[:\$1]]\" di wiki ko!'''",
-'searchhelp-url' => 'Help:Isi',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Cari laman jo awalan ko]]',
 'searchprofile-articles' => 'Laman isi',
 'searchprofile-project' => 'Laman Bantuan jo Proyek',
@@ -1039,15 +1153,6 @@ Cubo awali pamintaan Sanak tu jo ''sadonyo:'' untuak mancari kasado kandungan (t
 Sanak samantaro dapek mancari lewaik Google.
 Ingek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.',
 
-# Quickbar
-'qbsettings' => 'Bar pinteh',
-'qbsettings-none' => 'Indak ado',
-'qbsettings-fixedleft' => 'Rato kiri',
-'qbsettings-fixedright' => 'Rato kanan',
-'qbsettings-floatingleft' => 'Mangambang di kiri',
-'qbsettings-floatingright' => 'Mangambang di kanan',
-'qbsettings-directionality' => 'Tetap, tagantuang pado skrip bahaso Sanak',
-
 # Preferences page
 'preferences' => 'Pangaturan',
 'mypreferences' => 'Pangaturan',
@@ -1080,7 +1185,6 @@ Ingek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.',
 'resetprefs' => 'Batalan parubahan',
 'restoreprefs' => 'Baliakan ka setelan awal',
 'prefs-editing' => 'Panyuntiangan',
-'prefs-edit-boxsize' => 'Ukuran kotak panyuntiangan.',
 'rows' => 'Barih:',
 'columns' => 'Kolom:',
 'searchresultshead' => 'Cari',
@@ -1091,8 +1195,6 @@ Ingek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.',
 'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|hari}}',
 'recentchangescount' => 'Jumlah suntiangan nan ditunjuakan:',
 'prefs-help-recentchangescount' => 'Iko untuak parubahan tabaru, riwayaik laman nan lalu, sarato log.',
-'prefs-help-watchlist-token' => 'Mangisi kotak ko jo kunci rasio (PIN) akan manghasilkan sindikasi RSS untuak daftar pantau Sanak. Sia juo nan tau jo kunci ko dapek mambaco daftar pantau Sanak, jadi hati-hatilah mamiliah nilainyo. 
-Barikuik ko nilai acak nan dapek Sanak gunoan: $1',
 'savedprefs' => 'Pangaturan lah tasimpan',
 'timezonelegend' => 'Zona wakatu:',
 'localtime' => 'Wakatu satampaik:',
@@ -1123,7 +1225,6 @@ Barikuik ko nilai acak nan dapek Sanak gunoan: $1',
 'prefs-reset-intro' => 'Angku dapek manggunokan laman ko untuak mangambalikan pangaturan ka setelan baku situs ko.
 Pangambalian pangaturan indak dapek dibatalan.',
 'prefs-emailconfirm-label' => 'Surel konfirmasi:',
-'prefs-textboxsize' => 'Ukuran kotak suntiang',
 'youremail' => 'Surel:',
 'username' => '{{GENDER:$1|Namo pangguno}}:',
 'uid' => 'ID {{GENDER:$1|pangguno}}:',
@@ -1306,7 +1407,6 @@ Alamaik surel Sanak indakkan tau dek urang nan manghubuangi sanak tu.',
 'recentchangeslinked' => 'Parubahan takaik',
 'recentchangeslinked-toolbox' => 'Parubahan takaik',
 'recentchangeslinked-title' => 'Parubahan nan takaik jo "$1"',
-'recentchangeslinked-noresult' => 'Indak ado parubahan pado laman nan tapauik salamo periode nan ditantuan',
 'recentchangeslinked-summary' => "Iko daftar parubahan tarakhia pado laman nan tahubuang dari laman tatantu (atau anggota dari kategori tatantu).
 Laman pado [[Special:Watchlist|daftar pantauan Sanak]] ditandoi jo '''cetak taba'''.",
 'recentchangeslinked-page' => 'Namo laman:',
@@ -1318,7 +1418,7 @@ Laman pado [[Special:Watchlist|daftar pantauan Sanak]] ditandoi jo '''cetak taba
 'reuploaddesc' => 'Batal dan baliak ka formulir pamuatan',
 'upload-tryagain' => 'Kirim parubahan katarangan berkas',
 'uploadnologin' => 'Alun masuak log',
-'uploadnologintext' => 'Sanak musti [[Special:UserLogin|masuak log]] untuak dapek mamuek berkas.',
+'uploadnologintext' => 'Sanak musti $1 untuak dapek mamuek berkas.',
 'upload_directory_missing' => 'Direktori pamuatan ($1) indak basobok dan indak dapek dibuek dek server web.',
 'upload_directory_read_only' => 'Direktori pamuatan ($1) indak dapek ditulih jo server web.',
 'uploaderror' => 'Kasalahan pamuatan',
@@ -1490,12 +1590,6 @@ Pariso dulu "pautan baliak" ka templat tasabuik sabalun manghapuihnyo.',
 'statistics-users-active-desc' => 'Pangguno nan aktip dalam {{PLURAL:$1|$1 ari}} tarakhia.',
 'statistics-mostpopular' => 'Laman nan paliang banyak ditampilkan',
 
-'disambiguations' => 'Laman nan tahubuang ka laman disambiguasi',
-'disambiguationspage' => 'Template:Disambig',
-'disambiguations-text' => "Laman-laman barikuik punyo pautan ka '''laman disambiguasi'''.
-Laman tasabuik saharuihnyo bapauik ka topik-topik nan sasuai.<br />
-Laman nan dianggap sabagai laman disambiguasi jikok laman tasabuik manggunoan templat nan tahubuang ka [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Laman jo laman properti',
 'pageswithprop-legend' => 'Laman jo laman properti',
 'pageswithprop-text' => 'Laman ko barisi daftar laman nan manggunoan properti laman tatantu.',
@@ -1692,6 +1786,7 @@ Parubahan laman ko tamasuak laman rundiangnyo akan ditampilan disinan.',
 'unwatch' => 'Batal pantau',
 'unwatchthispage' => 'Batal pantau laman ko',
 'watchlist-details' => '{{PLURAL:$1|$1 laman}} dalam daftar pantau Sanak, indak tamasuak laman rundiangnyo.',
+'wlheader-showupdated' => "Laman nan alah barubah sajak kunjuangan tarakhia Sanak ditunjuakan jo '''hurup taba'''",
 'wlnote' => "Di bawah ko ado $1 {{PLURAL:$1|parubahan}} dalam {{PLURAL:$2|'''$2''' jam}} iko, sampai tanggal $3, pukua $4.",
 'wlshowlast' => 'Tunjuakan $1 jam parubahan dalam $2 hari tarakhia $3',
 'watchlist-options' => 'Piliahan daftar pantau',
@@ -1963,9 +2058,7 @@ Caliak [[Special:BlockList|daftar sakek]] untuak kasado pangguno nan kini kanai
 'ipb_already_blocked' => '"$1" alah disakek',
 'ipb-needreblock' => '$1 alah tasakek. Apo nio diubah pangaturannyo?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Sakek}} lain',
-'blockme' => 'Sakek denai',
 'proxyblocker' => 'Sakek proksi',
-'proxyblocker-disabled' => 'Fungsi ko dimatian',
 
 # Developer tools
 'lockdb' => 'Kunci basis data',
@@ -2208,13 +2301,8 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'pageinfo-category-files' => 'Jumlah berkas',
 
 # Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Biru Köln',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Sadarano',
 'skinname-modern' => 'Moderen',
 'skinname-vector' => 'Vektor',
 
@@ -2277,11 +2365,25 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'minutes' => '{{PLURAL:$1|1 minik|$1 minik}}',
 'hours' => '{{PLURAL:$1|1 jam|$1 jam}}',
 'days' => '{{PLURAL:$1|1 ari|$1 ari}}',
+'weeks' => '{{PLURAL:$1|1 pakan|$1 pakan}}',
 'months' => '{{PLURAL:$1|1 bulan|$1 bulan}}',
 'years' => '{{PLURAL:$1|1 taun|$1 taun}}',
 'ago' => '$1 nan lalu',
 'just-now' => 'sabanta ko',
 
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|1 jam|$1 jam}} nan lalu',
+'minutes-ago' => '{{PLURAL:$1|1 minik|$1 minik}} nan lalu',
+'seconds-ago' => '{{PLURAL:$1|1 datiak|$1 datiak}} nan lalu',
+'monday-at' => 'Sinayan pukua $1',
+'tuesday-at' => 'Salasa pukua $1',
+'wednesday-at' => "Raba'a pukua $1",
+'thursday-at' => 'Kamih pukua $1',
+'friday-at' => 'Jumaik pukua $1',
+'saturday-at' => 'Satu pukua $1',
+'sunday-at' => 'Akaik pukua $1',
+'yesterday-at' => 'Kapatang pukua $1',
+
 # Bad image list
 'bad_image_list' => 'Formatnyo adolah sabagai barikuik:
 
@@ -2339,7 +2441,7 @@ Nan lainnyo akan tasuruak sacaro baku.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Leba',
 'exif-imagelength' => 'Tinggi',
 'exif-bitspersample' => 'Bita per komponen',
@@ -2439,11 +2541,6 @@ Sanak mustilah alah manarimo [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi P
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikel path]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skrip path]',
 
-# Special:FilePath
-'filepath' => 'Lokasi berkas',
-'filepath-page' => 'Berkas:',
-'filepath-submit' => 'Cari',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Pancarian berkas duplikat',
 'fileduplicatesearch-summary' => 'Pancarian berkas duplikat badasaran nilai hash-nyo.',
diff --git a/languages/messages/MessagesMk.php b/languages/messages/MessagesMk.php
index 8b69362e..754fcf88 100644
--- a/languages/messages/MessagesMk.php
+++ b/languages/messages/MessagesMk.php
@@ -151,6 +151,7 @@ $specialPageAliases = array(
 	'Myuploads'                 => array( 'МоиПодигања' ),
 	'Newimages'                 => array( 'НовиСлики', 'НовиПодатотеки' ),
 	'Newpages'                  => array( 'НовиСтраници' ),
+	'PagesWithProp'             => array( 'СтранициСоСвојство' ),
 	'PasswordReset'             => array( 'ПроменаНаЛозинка' ),
 	'PermanentLink'             => array( 'ПостојанаВрска' ),
 	'Popularpages'              => array( 'ПопуларниСтраници' ),
@@ -162,6 +163,7 @@ $specialPageAliases = array(
 	'Randomredirect'            => array( 'СлучајноПренасочување' ),
 	'Recentchanges'             => array( 'СкорешниПромени' ),
 	'Recentchangeslinked'       => array( 'ПоврзаниПромени' ),
+	'Redirect'                  => array( 'Пренасочување' ),
 	'Revisiondelete'            => array( 'БришењеРевизија' ),
 	'Search'                    => array( 'Барај' ),
 	'Shortpages'                => array( 'КраткиСтраници' ),
@@ -179,7 +181,7 @@ $specialPageAliases = array(
 	'Unusedimages'              => array( 'НеискористениСлики', 'НеискористениПодатотеки' ),
 	'Unusedtemplates'           => array( 'НеискористениШаблони' ),
 	'Unwatchedpages'            => array( 'НенабљудуваниСтраници' ),
-	'Upload'                    => array( 'Подигање', 'Подигања' ),
+	'Upload'                    => array( 'Подигање' ),
 	'UploadStash'               => array( 'СкриениПодигања' ),
 	'Userlogin'                 => array( 'Најавување' ),
 	'Userlogout'                => array( 'Одјавување' ),
@@ -236,7 +238,7 @@ $magicWords = array(
 	'talkspace'                 => array( '1', 'РАЗГОВОРПРОСТОР', 'TALKSPACE' ),
 	'fullpagename'              => array( '1', 'ЦЕЛОСНОИМЕНАСТРАНИЦА', 'FULLPAGENAME' ),
 	'subpagename'               => array( '1', 'ПОТСТРАНИЦА', 'SUBPAGENAME' ),
-	'basepagename'              => array( '1', 'ИМЕНАОСНОВНАСТРАНИЦА', 'BASEPAGENAME' ),
+	'basepagename'              => array( '1', 'ОСНОВНАСТРАНИЦА', 'BASEPAGENAME' ),
 	'talkpagename'              => array( '1', 'СТРАНИЦАЗАРАЗГОВОР', 'TALKPAGENAME' ),
 	'subjectpagename'           => array( '1', 'ИМЕНАСТАТИЈА', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
 	'msg'                       => array( '0', 'ПОР:', 'MSG:' ),
@@ -303,6 +305,7 @@ $magicWords = array(
 	'raw'                       => array( '0', 'СИРОВО:', 'RAW:' ),
 	'displaytitle'              => array( '1', 'ПРИКАЖИНАСЛОВ', 'DISPLAYTITLE' ),
 	'rawsuffix'                 => array( '1', 'П', 'R' ),
+	'nocommafysuffix'           => array( '0', 'БЕЗПОДЕЛ', 'NOSEP' ),
 	'newsectionlink'            => array( '1', '__ВРСКАНОВПОДНАСЛОВ__', '__NEWSECTIONLINK__' ),
 	'nonewsectionlink'          => array( '1', '__БЕЗВРСКАНОВПОДНАСЛОВ__', '__NONEWSECTIONLINK__' ),
 	'currentversion'            => array( '1', 'ТЕКОВНАВЕРЗИЈА', 'CURRENTVERSION' ),
@@ -376,9 +379,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Прикажи го бројот на корисници кои набљудуваат',
 'tog-oldsig' => 'Постоечки потпис:',
 'tog-fancysig' => 'Сметај го потписот за викитекст (без автоматска врска)',
-'tog-externaleditor' => 'По основно користи надворешен уредувач (само за стручњаци, потребно е посебно нагодување на сметачот. [//www.mediawiki.org/wiki/Manual:External_editors?uselang=mk Повеќе информации.])',
-'tog-externaldiff' => 'По основно користи надворешен програм за споредување верзии (само за стручњаци, потребно е специјално нагодување на сметачот. [//www.mediawiki.org/wiki/Manual:External_editors?uselang=mk Повеќе информации.])',
-'tog-showjumplinks' => 'Овозможи врски на пристапност „скокни на“',
 'tog-uselivepreview' => 'Користи преглед во живо (експериментално)',
 'tog-forceeditsummary' => 'Извести ме кога нема опис на промените',
 'tog-watchlisthideown' => 'Скриј мои уредувања од списокот на набљудувања',
@@ -392,6 +392,8 @@ $messages = array(
 'tog-showhiddencats' => 'Прикажи скриени категории',
 'tog-noconvertlink' => 'Оневозможи претворање на наслов на врска',
 'tog-norollbackdiff' => 'Изостави ја разликата по извршено отповикување',
+'tog-useeditwarning' => 'Предупреди ме кога сакам да напуштам страница за уредување без да ги имам зачувано промените',
+'tog-prefershttps' => 'Секогаш најавувај ме преку безбедна врска',
 
 'underline-always' => 'Секогаш',
 'underline-never' => 'Никогаш',
@@ -455,6 +457,18 @@ $messages = array(
 'oct' => 'окт',
 'nov' => 'ное',
 'dec' => 'дек',
+'january-date' => '$1 јануари',
+'february-date' => '$1 февруари',
+'march-date' => '$1 март',
+'april-date' => '$1 април',
+'may-date' => '$1 мај',
+'june-date' => '$1 јуни',
+'july-date' => '$1 јули',
+'august-date' => '$1 август',
+'september-date' => '$1 септември',
+'october-date' => '$1 октомври',
+'november-date' => '$1 ноември',
+'december-date' => '$1 декември',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категорија|Категории}}',
@@ -475,7 +489,7 @@ $messages = array(
 'noindex-category' => 'Неиндексирани страници',
 'broken-file-category' => 'Страници со прекинати врски до податотеки',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'За {{SITENAME}}',
 'article' => 'Статија',
@@ -538,6 +552,7 @@ $messages = array(
 'create-this-page' => 'Создај ја оваа страница',
 'delete' => 'Избриши',
 'deletethispage' => 'Избриши ја оваа страница',
+'undeletethispage' => 'обнови ја оваа страница',
 'undelete_short' => 'Врати {{PLURAL:$1|едно уредување|$1 уредувања}}',
 'viewdeleted_short' => 'Преглед на {{PLURAL:$1|едно избришано уредување|$1 избришани уредувања}}',
 'protect' => 'Заштити',
@@ -581,7 +596,7 @@ $1',
 'pool-queuefull' => 'Редицата на барања е полна',
 'pool-errorunknown' => 'Непозната грешка',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'За {{SITENAME}}',
 'aboutpage' => 'Project:За {{SITENAME}}',
 'copyright' => 'Содржината е достапна под условите на $1 освен ако не е поинаку наведено.',
@@ -591,7 +606,6 @@ $1',
 'disclaimers' => 'Услови на употреба',
 'disclaimerpage' => 'Project:Услови на употреба',
 'edithelp' => 'Помош за уредување',
-'edithelppage' => 'Help:Уредување',
 'helppage' => 'Help:Содржина',
 'mainpage' => 'Главна страница',
 'mainpage-description' => 'Главна страница',
@@ -622,7 +636,6 @@ $1',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|последна промена|последни промени}}',
 'youhavenewmessagesmulti' => 'Имате нови пораки на $1',
 'editsection' => 'уреди',
-'editsection-brackets' => '[$1]',
 'editold' => 'уреди',
 'viewsourceold' => 'преглед на кодот',
 'editlink' => 'уреди',
@@ -674,17 +687,12 @@ $1',
 # General errors
 'error' => 'Грешка',
 'databaseerror' => 'Грешка во базата',
-'dberrortext' => 'Синтаксна грешка во барањето до базата.
-Ова може да значи грешка во програмската опрема.
-Последното барање до базата беше:
-<blockquote><code>$1</code></blockquote>
-од функцијата „<code>$2</code>“.
-Базата ја даде грешката „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Грешка во барањето до базата.
-Последното барање до базата беше:
-„$1“
-од функцијата „$2“.
-Вратена е следната грешка „$3: $4“.',
+'databaseerror-text' => 'Се појави грешка во барањето од базата.
+Ова може да значи програмска грешка (бубачка).',
+'databaseerror-textcl' => 'Се појави грешка во барањето до базата.',
+'databaseerror-query' => 'Барање: $1',
+'databaseerror-function' => 'Функција: $1',
+'databaseerror-error' => 'Грешка: $1',
 'laggedslavemode' => 'Предупредување: Страницата може да не ги содржи скорешните поднови.',
 'readonly' => 'Базата е заклучена',
 'enterlockreason' => 'Внесете причина за заклучувањето, вклучувајќи и приближно време на отклучување',
@@ -716,6 +724,7 @@ $1',
 'cannotdelete-title' => 'Не можам да ја избришам страницата „$1“',
 'delete-hook-aborted' => 'Бришењето е прекинато со кука.
 Не е дадено никакво образложение.',
+'no-null-revision' => 'Не можев да направам нова ништовна ревизија на страницата „$1“',
 'badtitle' => 'Неисправен наслов',
 'badtitletext' => 'Бараниот наслов е грешен, празен или неисправно поврзан меѓујазичен или меѓувики наслов. 
 Може да содржи недопуштени знаци.',
@@ -739,12 +748,15 @@ $1',
 'editinginterface' => "'''Предупредување:''' Уредувате страница која е дел од корисничкиот посредник на програмот МедијаВики.
 Промените на оваа страница ќе предизвикаат промени во корисничкиот посредник кај другите корисници на ова вики.
 За да додадете или измените превод на сите викија, појдете на [//translatewiki.net/wiki/Main_Page?setlang=mk translatewiki.net] - проектот за локализација на МедијаВики.",
-'sqlhidden' => '(Барањето до SQL е скриено)',
 'cascadeprotected' => 'Оваа страница е заштитена од уредувања бидејќи е вклучена во {{PLURAL:$1|следнава страница, којашто е заштитена|следниве страници, коишто се заштитени}} со можноста „каскадна заштита“:
 $2',
 'namespaceprotected' => "Немате дозвола за уредување страници во именскиот простор '''$1'''.",
 'customcssprotected' => 'Немате дозвола да ја менувате оваа страница со CSS бидејќи содржи туѓи лични нагодувања.',
 'customjsprotected' => 'Немате дозвола да ја менувате оваа страница со JavaScript  бидејќи содржи туѓи лични нагодувања.',
+'mycustomcssprotected' => 'Немате дозвола да ја уредувате оваа каскадна стилска страница (CSS).',
+'mycustomjsprotected' => 'Немате дозвола да ја уредувате оваа страница со JavaScript.',
+'myprivateinfoprotected' => 'Немате дозвола да ги уредувате вашите приватни информации.',
+'mypreferencesprotected' => 'Немате дозвола да ги уредувате вашите нагодувања.',
 'ns-specialprotected' => 'Специјални страници не може да се уредуваат.',
 'titleprotected' => "Овој наслов од страна на [[User:$1|$1]] е заштитен и не може да се создаде.
 Причината за тоа е: ''$2''.",
@@ -769,10 +781,19 @@ $2',
 'welcomecreation-msg' => 'Вашата корисничка сметка е создадена.
 Не заборавајте да ги измените вашите [[Special:Preferences|{{SITENAME}} нагодувања]].',
 'yourname' => 'Корисничко име:',
+'userlogin-yourname' => 'Корисничко име',
+'userlogin-yourname-ph' => 'Внесете корисничко име',
+'createacct-another-username-ph' => 'Внесете корисничко име',
 'yourpassword' => 'Лозинка:',
+'userlogin-yourpassword' => 'Лозинка',
+'userlogin-yourpassword-ph' => 'Внесете лозинка',
+'createacct-yourpassword-ph' => 'Внесете лозинка',
 'yourpasswordagain' => 'Повторете ја лозинката:',
+'createacct-yourpasswordagain' => 'Потврда на лозинката',
+'createacct-yourpasswordagain-ph' => 'Повторно внесете ја лозинката',
 'remembermypassword' => 'Запомни ме на овој сметач (највеќе $1 {{PLURAL:$1|ден|дена}})',
-'securelogin-stick-https' => 'Останете поврзани со HTTPS по одјавата',
+'userlogin-remembermypassword' => 'Запомни ме',
+'userlogin-signwithsecure' => 'Користи безбеден опслужувач',
 'yourdomainname' => 'Вашиот домен:',
 'password-change-forbidden' => 'Не можете да ја менувате лозинката на ова вики.',
 'externaldberror' => 'Настана грешка при надворешното најавување на базата или пак немате дозвола да ја подновите вашата надворешна сметка.',
@@ -784,18 +805,44 @@ $2',
 'logout' => 'Одјава',
 'userlogout' => 'Одјава',
 'notloggedin' => 'Не сте најавени',
+'userlogin-noaccount' => 'Немате сметка?',
+'userlogin-joinproject' => 'Зачленете се на {{SITENAME}}',
 'nologin' => "Немате корисничка сметка? '''$1'''.",
 'nologinlink' => 'Направете нова корисничка сметка',
 'createaccount' => 'Направи сметка',
 'gotaccount' => "Веќе имате корисничка сметка? '''$1'''.",
 'gotaccountlink' => 'Најавете се',
 'userlogin-resetlink' => 'Си ги заборавивте податоците за најава?',
+'userlogin-resetpassword-link' => 'Смени лозинка',
+'helplogin-url' => 'Help:Најава',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помош со најавата]]',
+'userlogin-loggedin' => 'Веќе сте најавени како {{GENDER:$1|$1}}.
+Со образецот подолу можете да се најавите како друг корисник.',
+'userlogin-createanother' => 'Направи нова сметка',
+'createacct-join' => 'Внесете ваши информации',
+'createacct-another-join' => 'Подолу внесете податоци за сметката',
+'createacct-emailrequired' => 'Е-пошта',
+'createacct-emailoptional' => 'Е-пошта (незадолжително)',
+'createacct-email-ph' => 'Внесете е-пошта',
+'createacct-another-email-ph' => 'Внесете е-пошта',
 'createaccountmail' => 'Дај привремена произволна лозинка и испрати ја на укажаната адреса',
+'createacct-realname' => 'Вистинско име (незадолжително)',
 'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-reason-ph' => 'Зошто правите друга сметка',
+'createacct-captcha' => 'Безбедносна проверка',
+'createacct-imgcaptcha-ph' => 'Внесете го гореприкажаниот текст',
+'createacct-submit' => 'Направи ја',
+'createacct-another-submit' => 'Создајте друга сметка',
+'createacct-benefit-heading' => '{{SITENAME}} е дело на луѓе како вас.',
+'createacct-benefit-body1' => '{{PLURAL:$1|уредување|уредувања}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|страница|страници}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|скорешен учесник|скорешни учесници}}',
 'badretype' => 'Внесените лозинки не се совпаѓаат.',
 'userexists' => 'Корисничкото име што го внесовте е зафатено.
 Изберете друго име.',
 'loginerror' => 'Грешка при најавувањето',
+'createacct-error' => 'Грешка во создавањето на сметката',
 'createaccounterror' => 'Не можам да ја создадам сметката: $1',
 'nocookiesnew' => 'Корисничката сметка е создадена, но не сте најавени.
 {{SITENAME}} користи колачиња за најавување на корисници.
@@ -859,11 +906,13 @@ $2',
 
 Можете да ја занемарите оваа порака ако сметката била направена по грешка.',
 'usernamehasherror' => 'Корисничкото име не може да содржи тараба',
-'login-throttled' => 'Скоро имате направено повеќе обиди за најавување.
-Почекајте малку пред да се обидете повторно.',
+'login-throttled' => 'Имате премногу обиди за најава за кратко време.
+Почекајте $1 пред да се обидете повторно.',
 'login-abort-generic' => 'Најавата е неуспешна - Прекинато',
 'loginlanguagelabel' => 'Јазик: $1',
 'suspicious-userlogout' => 'Вашето барање за одјава е одбиено бидејќи се чини дека е испратено од расипан прелистувач или кеширачки застапник (proxy).',
+'createacct-another-realname-tip' => 'Вистинското име е незадолжително.
+Доколку изберете да го внесете, тоа може да се искористи за оддавање на заслуги за Вашата работа.',
 
 # Email sending
 'php-mail-error-unknown' => 'Непозната грешка во функцијата mail() на PHP',
@@ -880,8 +929,7 @@ $2',
 'newpassword' => 'Нова лозинка:',
 'retypenew' => 'Повторете ја новата лозинка:',
 'resetpass_submit' => 'Поставете лозинка и најавете се',
-'resetpass_success' => 'Вашата лозинка е успешно сменета!
-Сега ве најавувам...',
+'changepassword-success' => 'Вашата лозинка е успешно сменета!',
 'resetpass_forbidden' => 'Лозинките не може да се менуваат',
 'resetpass-no-info' => 'Мора да сте најавени ако сакате да имате директен пристап до оваа страница.',
 'resetpass-submit-loggedin' => 'Смени лозинка',
@@ -893,10 +941,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Менување на лозинка',
-'passwordreset-text' => 'Пополнете го образецов за да ја измените лозинката.',
+'passwordreset-text-one' => 'Пополнете го образецов за да ја измените лозинката.',
+'passwordreset-text-many' => '{{PLURAL:$1|Пополнете едно од полињата за да ја смените лозинката.}}',
 'passwordreset-legend' => 'Нова лозинка',
 'passwordreset-disabled' => 'На ова вики е оневозможено задавање на нова лозинка.',
-'passwordreset-pretext' => '{{PLURAL:$1||Подолу внесете еден податок}}',
+'passwordreset-emaildisabled' => 'Можностите за е-пошта се исклучени на ова вики',
 'passwordreset-username' => 'Корисничко име:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Да ја прикажам пораката?',
@@ -926,7 +975,7 @@ $2
 Привремена лозинка: $2',
 'passwordreset-emailsent' => 'Испратено е писмо за измена на лозинката.',
 'passwordreset-emailsent-capture' => 'Испратено е писмо за измена на лозинката (прикажано подолу).',
-'passwordreset-emailerror-capture' => 'Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на корисникот: $1',
+'passwordreset-emailerror-capture' => 'Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на {{GENDER:$2|корисникот}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Смени е-пошта',
@@ -940,6 +989,19 @@ $2
 'changeemail-submit' => 'Смени е-пошта',
 'changeemail-cancel' => 'Откажи',
 
+# Special:ResetTokens
+'resettokens' => 'Врати одново шифри',
+'resettokens-text' => 'Можете шифрите да ги вратите одново што овозможува пристап до извесни приватни податоци што се однесуваат на вашата овдешна сметка.
+
+Ова треба да се направи ако по грешка сте споделиле нешто со некого или ако сметката ви е изложена на опасност.',
+'resettokens-no-tokens' => 'Нема шифри за враќање.',
+'resettokens-legend' => 'Враќање одново на шифри',
+'resettokens-tokens' => 'Шифри:',
+'resettokens-token-label' => '$1 (тековна вредност: $2)',
+'resettokens-watchlist-token' => 'Шифра за каналот (Atom/RSS) на [[Special:Watchlist|измени во набљудуваните страници]]',
+'resettokens-done' => 'Шифрата е вратена одново.',
+'resettokens-resetbutton' => 'Врати избрани шифри',
+
 # Edit page toolbar
 'bold_sample' => 'Задебелен текст',
 'bold_tip' => 'Задебелен текст',
@@ -1143,12 +1205,15 @@ $2
 Веројатно е избришана.',
 'edit-conflict' => 'Спротиставеност во уредувањето.',
 'edit-no-change' => 'Вашите уредувања беа игнорирани, бидејќи не се направени промени врз текстот.',
+'postedit-confirmation' => 'Вашето уредување е зачувано.',
 'edit-already-exists' => 'Не може да се создаде нова страница.
 Истата веќе постои.',
 'defaultmessagetext' => 'Текст на пораката по основно',
 'content-failed-to-parse' => 'Не успеав да ја предадам содржината од типот $2 за моделот $1: $3',
 'invalid-content-data' => 'Неважечки податоци од содржината',
 'content-not-allowed-here' => 'Содржините од моделот „$1“ не се допуштени на страницата [[$2]]',
+'editwarning-warning' => 'Ако ја напуштите страницата ќе ги изгубите сите промени кои сте ги направиле.
+Ако сте најавени, можете да го исклучите ова предупредување во одделот „Уредување“ во вашите нагодувања.',
 
 # Content models
 'content-model-wikitext' => 'викитекст',
@@ -1184,6 +1249,7 @@ $2
 'undo-failure' => 'Уредувањето не можеше да се откаже заради меѓувремени спротиставени уредувања.',
 'undo-norev' => 'Измената не можеше да биде вратена бидејќи не постои или била избришана.',
 'undo-summary' => 'Откажано уредувањето $1 на уредникот [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])',
+'undo-summary-username-hidden' => 'Поништи ја ревизијата $1 на скриен корисник',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Не може да се создаде корисничка сметка',
@@ -1360,6 +1426,7 @@ $1",
 'compareselectedversions' => 'Спореди избрани ревизии',
 'showhideselectedversions' => 'Прикажи/скриј избрани ревизии',
 'editundo' => 'откажи',
+'diff-empty' => '(нема разлика)',
 'diff-multi' => '({{PLURAL:$1|Не е прикажана една меѓувремена ревизија|Не се прикажани $1 меѓувремени ревизии}} од {{PLURAL:$2|еден корисник|$2 корисници}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Не е прикажана една меѓувремена ревизија направена|Не се прикажани $1 меѓувремени ревизии направени}} од повеќе од $2 {{PLURAL:$2|корисник|корисници}})',
 'difference-missing-revision' => 'Не пронајдов {{PLURAL:$2|една ревизија|$2 ревизии}} од оваа разлика ($1).
@@ -1387,7 +1454,6 @@ $1",
 'searchmenu-legend' => 'Нагодувања на пребарувањето',
 'searchmenu-exists' => "'''На ова вики има страница со наслов „[[:$1]]“'''",
 'searchmenu-new' => "Создајте ја страницата „[[:$1]]“ на ова вики!'''",
-'searchhelp-url' => 'Help:Содржина',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Прелистување на страници со оваа претставка]]',
 'searchprofile-articles' => 'Статии',
 'searchprofile-project' => 'Помош и проектни страници',
@@ -1431,15 +1497,7 @@ $1",
 'searchdisabled' => '{{SITENAME}} пребарувањето е оневозможено.
 Во меѓувреме, можете да пребарувате преку Google.
 Да напоменеме дека нивното индексирање на {{SITENAME}} содржините може да биде застарено.',
-
-# Quickbar
-'qbsettings' => 'Лента за брз избор',
-'qbsettings-none' => 'Без мени',
-'qbsettings-fixedleft' => 'Неподвижна лево',
-'qbsettings-fixedright' => 'Неподвижна десно',
-'qbsettings-floatingleft' => 'Променлива лево',
-'qbsettings-floatingright' => 'Променлива десно',
-'qbsettings-directionality' => 'Непроменливо зададен, во зависност од насоката на пишување на вашиот јазик',
+'search-error' => 'Се појави грешка при пребарувањето: $1',
 
 # Preferences page
 'preferences' => 'Нагодувања',
@@ -1473,7 +1531,6 @@ $1",
 'resetprefs' => 'Избриши незачувани измени',
 'restoreprefs' => 'Врати сè по основно (во сите делови)',
 'prefs-editing' => 'Уредување',
-'prefs-edit-boxsize' => 'Големина на прозорецот за уредување.',
 'rows' => 'Редови:',
 'columns' => 'Колони:',
 'searchresultshead' => 'Пребарување',
@@ -1484,9 +1541,9 @@ $1",
 'recentchangesdays-max' => '(највеќе $1 {{PLURAL:$1|ден|дена}})',
 'recentchangescount' => 'Број на уредувања кои ќе се прикажуваат по основно:',
 'prefs-help-recentchangescount' => 'Подразбира скорешни промени, истории на страници и дневници.',
-'prefs-help-watchlist-token' => 'Со внесување на тајниот клуч во полево ќе создадете RSS емитување за вашиот список на набљудувања.
-Секој што го знае клучот во полево ќе може да го чита вашиот список на набљудувања, па затоа изберете некоја безбедна вредност.
-Еве една случајно-создадена вредност што можете да ја користите: $1',
+'prefs-help-watchlist-token2' => 'Ова е тајна шифра за вашиот канализиран список на набљудувања.
+Секој што ја знае ќе може да ја чита, па затоа ви препорачуваме да не ја кажувате никому.
+[[Special:ResetTokens|Стиснете тука ако треба да зададете нова]].',
 'savedprefs' => 'Вашите нагодувања се зачувани.',
 'timezonelegend' => 'Часовен појас:',
 'localtime' => 'Локално време:',
@@ -1516,7 +1573,6 @@ $1",
 'prefs-common-css-js' => 'Заеднички CSS/JS за сите изгледи:',
 'prefs-reset-intro' => 'Може да ја користите оваа страница за враќање на вашите нагодувања на основно-зададените нагодувања на викито. Ова дејство е неповратно.',
 'prefs-emailconfirm-label' => 'Потврда на е-пошта:',
-'prefs-textboxsize' => 'Големина на полето за уредување',
 'youremail' => 'Е-пошта:',
 'username' => '{{GENDER:$1|Корисничко име}}:',
 'uid' => '{{GENDER:$1|Кориснички бр.}}:',
@@ -1551,6 +1607,8 @@ $1",
 'prefs-dateformat' => 'Формат на датумот',
 'prefs-timeoffset' => 'Временско отстапување',
 'prefs-advancedediting' => 'Општи можности',
+'prefs-editor' => 'Уредник',
+'prefs-preview' => 'Преглед',
 'prefs-advancedrc' => 'Напредни нагодувања',
 'prefs-advancedrendering' => 'Напредни нагодувања',
 'prefs-advancedsearchoptions' => 'Напредни нагодувања',
@@ -1558,7 +1616,9 @@ $1",
 'prefs-displayrc' => 'Нагодувања на приказот',
 'prefs-displaysearchoptions' => 'Нагодувања на приказот',
 'prefs-displaywatchlist' => 'Нагодувања на приказот',
+'prefs-tokenwatchlist' => 'Шифра',
 'prefs-diffs' => 'Разлики',
+'prefs-help-prefershttps' => 'Поставката ќе се примени следниот пат кога ќе се најавите.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Исправно',
@@ -1586,6 +1646,8 @@ $1",
 'userrights-changeable-col' => 'Групи кои може да ги промените',
 'userrights-unchangeable-col' => 'Групи кои не може да ги промените',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Спротиставеност во измените на корисничките права. Прегледајте ги и потврдете ги.',
+'userrights-removed-self' => 'Успешно ги отстранивте вашите права. Затоа, повеќе немате пристап на страницава.',
 
 # Groups
 'group' => 'Група:',
@@ -1651,11 +1713,19 @@ $1",
 'right-proxyunbannable' => 'Заобиколување на автоматски блокирања на застапници',
 'right-unblockself' => 'Сопствено одблокирање',
 'right-protect' => 'Менување на степени на заштита и уредување на каскадно заштитени страници',
-'right-editprotected' => 'Уредување на заштитени страници (без каскадна заштита)',
+'right-editprotected' => 'Уредување на страници заштитени како „{{int:protect-level-sysop}}“',
+'right-editsemiprotected' => 'Уредување на страници заштитени како „{{int:protect-level-autoconfirmed}}“',
 'right-editinterface' => 'Уредување на кориснички посредник',
 'right-editusercssjs' => 'Уредување на CSS и JS податотеки на други корисници',
 'right-editusercss' => 'Уредување на CSS податотеки на други корисници',
 'right-edituserjs' => 'Уредување на JS податотеки на други корисници',
+'right-editmyusercss' => 'Уредување на сопствени кориснички каскадни стилски податотеки (CSS)',
+'right-editmyuserjs' => 'Уредување на сопствени кориснички податотеки со JavaScript',
+'right-viewmywatchlist' => 'Преглед на вашиот список на набљудувања',
+'right-editmywatchlist' => 'Уредување на вашиот список на набљудувања. Извесни дејства сепак ќе ставаат страници во списокот и без да го имате ова право.',
+'right-viewmyprivateinfo' => 'Преглед на сопствените приватни податоци (на пр. е-пошта, вистинско име и презиме)',
+'right-editmyprivateinfo' => 'Уредување на сопствените приватни податоци (на пр. е-пошта, вистинско име и презиме)',
+'right-editmyoptions' => 'Уредување на вашите нагодувања',
 'right-rollback' => 'Брзо отповикување на уредувањата на последниот корисник што уредувал одредена страница',
 'right-markbotedits' => 'Означување на вратени уредувања како ботовски уредувања',
 'right-noratelimit' => 'Без временски ограничувања на уредување',
@@ -1717,12 +1787,19 @@ $1",
 'action-userrights-interwiki' => 'уредување на кориснички права на корисници на други викија',
 'action-siteadmin' => 'заклучување или отклучување на базата на податоци',
 'action-sendemail' => 'испраќање на е-пошта',
+'action-editmywatchlist' => 'уредување на вашиот список на набљудувања',
+'action-viewmywatchlist' => 'преглед на вашиот список на набљудувања',
+'action-viewmyprivateinfo' => 'преглед на вашите приватни податоци',
+'action-editmyprivateinfo' => 'уредување на вашите приватни податоци',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|промена|промени}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|од последната посаета}}',
+'enhancedrc-history' => 'историја',
 'recentchanges' => 'Скорешни промени',
 'recentchanges-legend' => 'Нагодувања за скорешни промени',
 'recentchanges-summary' => 'На оваа страница ги следите скорешните промени на викито.',
+'recentchanges-noresult' => 'Нема промени од дадениот период што одговараат на бараното.',
 'recentchanges-feed-description' => 'Следење на најскорешните промени на викито во овие емитувања.',
 'recentchanges-label-newpage' => 'Ова уредување создаде нова страница',
 'recentchanges-label-minor' => 'Ова е ситна промена',
@@ -1760,7 +1837,6 @@ $1",
 'recentchangeslinked-feed' => 'Поврзани промени',
 'recentchangeslinked-toolbox' => 'Поврзани промени',
 'recentchangeslinked-title' => 'Промени поврзани со „$1“',
-'recentchangeslinked-noresult' => 'Нема промени на поврзаните страници во зададениот период.',
 'recentchangeslinked-summary' => "Ова е список на промени направени на страниците поврзани преку назначената страница (или до членови на назначената категорија).
 Страниците на [[Special:Watchlist|вашиот список на набљудувања]] се прикажани '''задебелено'''.",
 'recentchangeslinked-page' => 'Име на страницата:',
@@ -1772,7 +1848,7 @@ $1",
 'reuploaddesc' => 'Прекини и назад кон образецот за подигање',
 'upload-tryagain' => 'Поднеси изменет опис на податотеката',
 'uploadnologin' => 'Не сте најавени',
-'uploadnologintext' => 'Морате да [[Special:UserLogin|се најавите]] за да можете да подигате податотеки.',
+'uploadnologintext' => 'Мора да сте $1 за да можете да подигате.',
 'upload_directory_missing' => 'Папката за подигање на слики ($1) не постои и не може да биде создадена од опслужувачот.',
 'upload_directory_read_only' => 'Опслужувачот не може да запишува во именикот за подигање ($1).',
 'uploaderror' => 'Грешка во подигањето',
@@ -2005,7 +2081,6 @@ $1',
 'http-read-error' => 'Грешка при читањето на HTTP.',
 'http-timed-out' => 'HTTP-барањето истече.',
 'http-curl-error' => 'Грешка при добивањето на URL: $1',
-'http-host-unreachable' => 'Не можев да пристапам до URL-адресата',
 'http-bad-status' => 'Се појави проблем во текот на обработката на HTTP-барањето: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2036,6 +2111,10 @@ $1',
 'listfiles_size' => 'Големина',
 'listfiles_description' => 'Опис',
 'listfiles_count' => 'Верзии',
+'listfiles-show-all' => 'Давај и стари верзии на сликите',
+'listfiles-latestversion' => 'Тековна верзија',
+'listfiles-latestversion-yes' => 'Да',
+'listfiles-latestversion-no' => 'Не',
 
 # File description page
 'file-anchor-link' => 'Податотека',
@@ -2134,6 +2213,13 @@ $1',
 'randompage' => 'Случајна страница',
 'randompage-nopages' => 'Нема страници во {{PLURAL:$2|следниот именски простор|следниве именски простори}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Случајна страница во категоријата',
+'randomincategory-invalidcategory' => '„$1“ не претставува важечка категорија.',
+'randomincategory-nopages' => 'Нема страници во [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Дај случајна страница од категоријата: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Оди',
+
 # Random redirect
 'randomredirect' => 'Случајно пренасочување',
 'randomredirect-nopages' => 'Нема пренасочувања во именскиот простор „$1“.',
@@ -2159,17 +2245,13 @@ $1',
 'statistics-users-active-desc' => 'Корисници кои имаат извршено некое дејство {{PLURAL:$1|претходниот ден|во претходните $1 дена}}',
 'statistics-mostpopular' => 'Најпосетувани страници',
 
-'disambiguations' => 'Страници што водат до појаснителни страници',
-'disambiguationspage' => 'Template:Појаснување',
-'disambiguations-text' => "Следните страници имаат барем по една врска што води до '''појаснителна страница'''.
-Наместо тоа, може да имаат врска до посоодветна страница.<br />
-Една страница се смета за појаснителна ако го користи шаблонот што води од [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop' => 'Страници со својство',
 'pageswithprop-legend' => 'Страници со својство',
 'pageswithprop-text' => 'На страницава се наведени страници што користат дадено својство.',
 'pageswithprop-prop' => 'Име на својството:',
 'pageswithprop-submit' => 'Оди',
+'pageswithprop-prophidden-long' => 'долгата вредност на текстуалното својство е скриена ($1)',
+'pageswithprop-prophidden-binary' => 'бинарната вредност на својството за долгиот текст е скриена  ($1)',
 
 'doubleredirects' => 'Двојни пренасочувања',
 'doubleredirectstext' => 'Оваа страница ги прикажува пренасочувачките страници до други пренасочувачки страници.
@@ -2228,6 +2310,7 @@ $1',
 'mostrevisions' => 'Статии со најмногу верзии',
 'prefixindex' => 'Сите страници (со претставка)',
 'prefixindex-namespace' => 'Сите страници со префикс (именски простор $1)',
+'prefixindex-strip' => 'Отстрани ја претставката во списокот',
 'shortpages' => 'Кратки страници',
 'longpages' => 'Долги страници',
 'deadendpages' => 'Ќорсокак страници',
@@ -2243,6 +2326,7 @@ $1',
 'listusers' => 'Список на корисници',
 'listusers-editsonly' => 'Прикажи само корисници кои уредувале',
 'listusers-creationsort' => 'Подреди по датум на создавање',
+'listusers-desc' => 'Подреди по надолен редослед',
 'usereditcount' => '$1 {{PLURAL:$1|уредување|уредувања}}',
 'usercreated' => '{{GENDER:$3|Создадена}} на $1 во $2 ч.',
 'newpages' => 'Нови страници',
@@ -2421,10 +2505,9 @@ $1',
 'unwatchthispage' => 'Престани набљудување',
 'notanarticle' => 'Не е статија',
 'notvisiblerev' => 'Ревизијата била избришана',
-'watchnochange' => 'Ниту едно од вашите набљудувања не било уредувано во прикажаниот период.',
 'watchlist-details' => '{{PLURAL:$1|$1 страница|$1 страници}} во вашиот список на набљудувања, не броејќи ги страниците за разговор.',
-'wlheader-enotif' => '* Известување по е-пошта е овозможено.',
-'wlheader-showupdated' => "* Страници кои се променети од вашата последна посета се прикажани со '''задебелени''' букви",
+'wlheader-enotif' => 'Известувањето по е-пошта е вклучено.',
+'wlheader-showupdated' => "Страниците што се изменети од вашата последна посета се прикажани со '''задебелени''' букви",
 'watchmethod-recent' => 'Проверка на скорешните уредувања на набљудуваните страници',
 'watchmethod-list' => 'Проверерка на набљудуваните страници во скорешните уредувања',
 'watchlistcontains' => 'Вашиот список на набљудувања содржи $1 {{PLURAL:$1|страница|страници}}.',
@@ -2682,7 +2765,7 @@ $1',
 'contributions' => '{{GENDER:$1|Кориснички}} придонеси',
 'contributions-title' => 'Придонеси на корисникот $1',
 'mycontris' => 'придонеси',
-'contribsub2' => 'За $1 ($2)',
+'contribsub2' => 'За {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Не се пронајдени промени што одговараат на овој критериум.',
 'uctop' => '(тековно)',
 'month' => 'Од месец (и порано):',
@@ -2841,16 +2924,14 @@ $1',
 Таа е блокирана како дел од блокот адреси $2, кој не може да се деблокира.',
 'ip_range_invalid' => 'Неважечки IP дијапазон на адреси.',
 'ip_range_toolarge' => 'Не се дозволени опсежни блокирања поголеми од /$1.',
-'blockme' => 'Блокирај ме',
 'proxyblocker' => 'Блокер на застапници (proxy)',
-'proxyblocker-disabled' => 'Оваа функција е оневозможена.',
 'proxyblockreason' => 'Вашата IP-адреса е блокирана бидејќи претставува отворен застапник (proxy).
 Ве молиме контактирајте со вашиот доставувач на Интернет услуги или техничката поддршка и информирајте ги за овој сериозен безбедносен проблем.',
-'proxyblocksuccess' => 'Готово.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Вашата IP-адреса е запишана како отворен застапник (proxy) во DNSBL кој го користи {{SITENAME}}..',
 'sorbs_create_account_reason' => 'Вашата IP-адреса е наведена како отворен застапникот (proxy) во DNSBL користена од {{SITENAME}}.
 Не можете да создадете корисничка сметка.',
+'xffblockreason' => 'Блокирана е IP-адреса присутна во заглавието X-Forwarded-For, која е ваша или на застапничкиот опслужувач што го користите. Наведеното образложение гласи: $1',
 'cant-block-while-blocked' => 'Не можете да блокирате други корисници додека и вие самите сте блокирани.',
 'cant-see-hidden-user' => 'Корисникот кој се обидувате да го блокирате е веќе блокиран и сокриен. Бидејќи вие немате права за сокривање на корисник, не можете да ги видите или уредувате корисничките блокирања.',
 'ipbblocked' => 'Не можете да блокирате или одблокирате други корисници бидејќи и самите сте блокирани',
@@ -3015,6 +3096,8 @@ $1',
 'thumbnail-more' => 'Зголеми',
 'filemissing' => 'Недостасува податотека',
 'thumbnail_error' => 'Грешка при создавање на минијатурата: $1',
+'thumbnail_error_remote' => '$1 пријавува грешка:
+$2',
 'djvu_page_error' => 'Недостапна DjVu страница',
 'djvu_no_xml' => 'Не е можно да се излачи XML за DjVu податотеки',
 'thumbnail-temp-create' => 'Не можам да создадам привремена податотека на минијатурата',
@@ -3163,20 +3246,15 @@ $1',
 'tooltip-undo' => '„Откажи“ го поништува ова уредување и ве носи на уредувањето во режим на преглед. Дава можност за наведување на причина во описот.',
 'tooltip-preferences-save' => 'Зачувај',
 'tooltip-summary' => 'Внесете краток опис',
+'tooltip-iwiki' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/* Тука поставениот CSS ќе се применува врз сите рува */',
-'standard.css' => '/* Тука поставениот CSS ќе се применува врз корисниците на рувото „Стандардно“ */',
-'nostalgia.css' => '/* Тука поставениот CSS ќе се применува врз корисниците на рувото „Носталгија“ */',
 'cologneblue.css' => '/* Тука поставениот CSS ќе се применува врз корисниците што го избрале рувото „Келнско сино“ */',
 'monobook.css' => '/* Тука поставениот CSS ќе се применува врз корисниците на рувото „Монобук“ */',
-'myskin.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Мое руво“ */',
-'chick.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Шик“ */',
-'simple.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Просто“ */',
 'modern.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Современо“ */',
 'vector.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Векторско“ */',
 'print.css' => '/* Тука поставениот CSS ќе се применува во верзијата за печатење */',
-'handheld.css' => '/* Тука поставениот CSS ќе се применува во рачните уреди со руво прилагодено во $wgHandheldStyle */',
 'noscript.css' => '/* Тука поставениот CSS се однесува на корисниците што имаат оневозможено JavaScript */',
 'group-autoconfirmed.css' => '/* Тука поставениот CSS ќе се применува само на автопотврдените корисници */',
 'group-bot.css' => '/* Тука поставениот CSS ќе се применува само врз ботовите */',
@@ -3185,13 +3263,8 @@ $1',
 
 # Scripts
 'common.js' => '/* Тука поставениот JavaScript ќе им се вчитува на сите корисници при отворањето на секоја страница. */',
-'standard.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат стандардното руво */',
-'nostalgia.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Носталгија“ */',
 'cologneblue.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Келнско сино“ */',
 'monobook.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Монобук“ */',
-'myskin.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што користат „Мое руво“ */',
-'chick.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Шик“ */',
-'simple.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Просто“ */',
 'modern.js' => '/* Било која Јава скрипта поставена овде ќе биде вчитана за сите корисници што го користат рувото Современо */',
 'vector.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Векторско“ */',
 'group-autoconfirmed.js' => '/* Тука поставениот JavaScript  ќе им се вчитува само на автопотврдените корисници */',
@@ -3272,13 +3345,8 @@ $1',
 'pageinfo-category-files' => 'Број на податотеки',
 
 # Skin names
-'skinname-standard' => 'Класично',
-'skinname-nostalgia' => 'Носталгија',
 'skinname-cologneblue' => 'Келнско сино',
 'skinname-monobook' => 'Монобук',
-'skinname-myskin' => 'Мое руво',
-'skinname-chick' => 'Шик',
-'skinname-simple' => 'Просто',
 'skinname-modern' => 'Современо',
 'skinname-vector' => 'Векторско',
 
@@ -3363,11 +3431,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 минута|$1 минути}}',
 'hours' => '{{PLURAL:$1|$1 час|$1 часа}}',
 'days' => '{{PLURAL:$1|$1 ден|$1 дена}}',
+'weeks' => '{{PLURAL:$1|$1 недела|$1 недели}}',
 'months' => '{{PLURAL:$1|$1 месец|$1 месеци}}',
 'years' => '{{PLURAL:$1|$1 година|$1 години}}',
 'ago' => 'пред $1',
 'just-now' => 'Штотуку',
 
+# Human-readable timestamps
+'hours-ago' => 'пред $1 {{PLURAL:$1|час|часа}}',
+'minutes-ago' => 'пред $1 {{PLURAL:$1|минута|минути}}',
+'seconds-ago' => 'пред $1 {{PLURAL:$1|секунда|секунди}}',
+'monday-at' => 'понеделникот во $1',
+'tuesday-at' => 'вторникот во $1',
+'wednesday-at' => 'средата во $1',
+'thursday-at' => 'четвртокот во $1',
+'friday-at' => 'петокот во $1',
+'saturday-at' => 'саботата во $1',
+'sunday-at' => 'неделата во $1',
+'yesterday-at' => 'вчера во $1',
+
 # Bad image list
 'bad_image_list' => 'Форматот е следниот:
 
@@ -3439,7 +3521,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Висина',
 'exif-bitspersample' => 'Длабочина на бојата',
@@ -3619,7 +3701,7 @@ Variants for Chinese language
 'exif-originalimageheight' => 'Висина на сликата пред кастрењето',
 'exif-originalimagewidth' => 'Ширина на сликата пред кастрењето',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ненабиена',
 'exif-compression-2' => 'CCITT Група 3 1 — Димензионално изменето Хафманово шифрирање по должина на низите',
 'exif-compression-3' => 'CCITT Група 3 — Факс-шифрирање',
@@ -4116,7 +4198,6 @@ $5
 'version-other' => 'Друго',
 'version-mediahandlers' => 'Ракувачи со мултимедијални содржини',
 'version-hooks' => 'Куки',
-'version-extension-functions' => 'Функции на додатоците',
 'version-parser-extensiontags' => 'Ознаки за парсерски додатоци',
 'version-parser-function-hooks' => 'Куки на парсерските функции',
 'version-hook-name' => 'Име на кука',
@@ -4126,6 +4207,7 @@ $5
 'version-license' => 'Лиценца',
 'version-poweredby-credits' => "Ова вики работи на '''[//www.mediawiki.org/ МедијаВики]''', авторски права © 2001-$1 $2.",
 'version-poweredby-others' => 'други',
+'version-poweredby-translators' => 'преведувачи на translatewiki.net',
 'version-credits-summary' => 'Би сакале да им се заблагодариме на следниве лица за нивните придонеси кон [[Special:Version|МедијаВики]].',
 'version-license-info' => 'МедијаВики е слободна програмска опрема; можете да ја редистрибуирате и/или менувате под условите на ГНУ-овата општа јавна лиценца на Фондацијата за слободна програмска опрема; или верзија 2 на Лиценцата, или некоја понова верзија (по ваш избор).
 
@@ -4141,12 +4223,17 @@ $5
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath?uselang=mk Статија]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath?uselang=mk Скрипта]',
 
-# Special:FilePath
-'filepath' => 'Патека до податотека',
-'filepath-page' => 'Податотека:',
-'filepath-submit' => 'Патека',
-'filepath-summary' => 'Оваа специјална страница го враќа целосниот пат на податотеката.
-Сликите се прикажани во изворна големина, другите типови на податотеки се отвораат со соодветните програми, директно.',
+# Special:Redirect
+'redirect' => 'Пренасочување по податотека, корисник или назнака на ревизија',
+'redirect-legend' => 'Пренасочување кон податотека или страница',
+'redirect-summary' => 'Оваа специјална страница пренасочува кон податотека (се задава името), страница (се задава назнаката на ревизијата) или корисничка странца (се задава бројчената назнака на корисникот).',
+'redirect-submit' => 'Оди',
+'redirect-lookup' => 'Пребарај:',
+'redirect-value' => 'Вредност:',
+'redirect-user' => 'Корисничка назнака',
+'redirect-revision' => 'Ревизија на страницата',
+'redirect-file' => 'Име на податотека',
+'redirect-not-exists' => 'Вредноста не е најдена',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Барање на дуплирани податотеки',
@@ -4195,12 +4282,16 @@ $5
 'tags' => 'Важечки ознаки за менување',
 'tag-filter' => '[[Special:Tags|Филтер за ознаки]]:',
 'tag-filter-submit' => 'Филтер',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Ознака|Ознаки}}]]: $2)',
 'tags-title' => 'Ознаки',
 'tags-intro' => 'На оваа страница е даден список на ознаки со кои програмската опрема може да ги означи измените и нивното значење.',
 'tags-tag' => 'Име на ознака',
 'tags-display-header' => 'Изглед во списоците на промени',
 'tags-description-header' => 'Целосен опис на значењето',
+'tags-active-header' => 'Активно?',
 'tags-hitcount-header' => 'Означени промени',
+'tags-active-yes' => 'Да',
+'tags-active-no' => 'Не',
 'tags-edit' => 'уреди',
 'tags-hitcount' => '$1 {{PLURAL:$1|промена|промени}}',
 
@@ -4221,6 +4312,7 @@ $5
 'dberr-problems' => 'Жалиме! Ова мрежно место се соочува со технички потешкотии.',
 'dberr-again' => 'Почекајте неколку минути и обидете се повторно.',
 'dberr-info' => '(Не може да се добие опслужувачот на базата на податоци: $1)',
+'dberr-info-hidden' => '(Не може да се добие опслужувачот на базата на податоци)',
 'dberr-usegoogle' => 'Во меѓувреме можете да се обидете да пребарувате со Google.',
 'dberr-outofdate' => 'Да напоменеме дека нивните индекси на нашата содржина можат да бидат застарени.',
 'dberr-cachederror' => 'Следнава содржина е кеширана копија на бараната страница, која може да е застарена.',
@@ -4236,6 +4328,9 @@ $5
 'htmlform-submit' => 'Поднеси',
 'htmlform-reset' => 'Откажи промени',
 'htmlform-selectorother-other' => 'Друго',
+'htmlform-no' => 'Не',
+'htmlform-yes' => 'Да',
+'htmlform-chosen-placeholder' => 'Одберете можност',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 со поддршка за пребарување по цели текстови',
@@ -4353,4 +4448,19 @@ $5
 # Image rotation
 'rotate-comment' => 'Сликата е завртена за $1 {{PLURAL:$1|степен|степени}} вдесно',
 
+# Limit report
+'limitreport-title' => 'Профилни парсерски податоци:',
+'limitreport-cputime' => 'Употреба на обработувачко време',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|секунда|секунди}}',
+'limitreport-walltime' => 'Употреба на вистинско време',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунда|секунди}}',
+'limitreport-ppvisitednodes' => 'Бр. на пројдени јазли од предобработувачот',
+'limitreport-ppgeneratednodes' => 'Бр. на создадени јазли од предобработувачот',
+'limitreport-postexpandincludesize' => 'Големина на вклученото по проширувањето',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|бајт|бајти}}',
+'limitreport-templateargumentsize' => 'Големина на аргументот во шаблонот',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|бајт|бајти}}',
+'limitreport-expansiondepth' => 'Најголема длабочина на проширувањето',
+'limitreport-expensivefunctioncount' => 'Бр. на сложени парсерски функции',
+
 );
diff --git a/languages/messages/MessagesMl.php b/languages/messages/MessagesMl.php
index b80bf70c..d7f57b19 100644
--- a/languages/messages/MessagesMl.php
+++ b/languages/messages/MessagesMl.php
@@ -19,8 +19,10 @@
  * @author Krenair
  * @author Manjith Joseph <manjithkaini@gmail.com>
  * @author Naveen Sankar
+ * @author Nemo bis
  * @author Praveen Prakash <me.praveen@gmail.com>
  * @author Praveenp
+ * @author Raghith
  * @author Sadik Khalid
  * @author Sadik Khalid <sadik.khalid@gmail.com>
  * @author Santhosh.thottingal
@@ -139,6 +141,7 @@ $specialPageAliases = array(
 	'Myuploads'                 => array( 'ഞാൻഅപ്‌ലോഡ്‌ചെയ്തവ' ),
 	'Newimages'                 => array( 'പുതിയ_പ്രമാണങ്ങൾ', 'പുതിയ_ചിത്രങ്ങൾ' ),
 	'Newpages'                  => array( 'പുതിയ_താളുകൾ' ),
+	'PagesWithProp'             => array( 'താളുകളുടെഉള്ളടക്കപ്രത്യേകതകൾ' ),
 	'PasswordReset'             => array( 'രഹസ്യവാക്ക്‌‌പുനക്രമീകരണം' ),
 	'PermanentLink'             => array( 'സ്ഥിരംകണ്ണി' ),
 	'Popularpages'              => array( 'ജനപ്രിയതാളുകൾ' ),
@@ -318,6 +321,7 @@ $magicWords = array(
 	'pagesize'                  => array( '1', 'താൾവലിപ്പം', 'PAGESIZE' ),
 	'index'                     => array( '1', '‌‌__സൂചിക__', '__INDEX__' ),
 	'noindex'                   => array( '1', '__സൂചികവേണ്ട__', '__NOINDEX__' ),
+	'numberingroup'             => array( '1', 'ഗണത്തിലെയെണ്ണം', 'NUMBERINGROUP', 'NUMINGROUP' ),
 	'staticredirect'            => array( '1', '_സ്ഥിരസ്ഥിതതിരിച്ചുവിടൽ_', '__STATICREDIRECT__' ),
 	'protectionlevel'           => array( '1', 'സംരക്ഷണതലം', 'PROTECTIONLEVEL' ),
 	'formatdate'                => array( '0', 'ദിനരേഖീകരണരീതി', 'ദിവസരേഖീകരണരീതി', 'formatdate', 'dateformat' ),
@@ -332,6 +336,8 @@ $magicWords = array(
 	'pagesincategory_files'     => array( '0', 'പ്രമാണങ്ങൾ', 'files' ),
 );
 
+$linkTrail = "/^([a-z\x{0D02}-\x{0D7F}]+)(.*)$/sDu";
+
 $digitGroupingPattern = "##,##,###";
 
 $messages = array(
@@ -365,9 +371,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ശ്രദ്ധിക്കുന്ന ഉപയോക്താക്കളുടെ എണ്ണം കാണിക്കുക',
 'tog-oldsig' => 'നിലവിലുള്ള ഒപ്പ്:',
 'tog-fancysig' => 'ഒപ്പ് ഒരു വിക്കി എഴുത്തായി പരിഗണിക്കുക (കണ്ണി സ്വയം ചേർക്കേണ്ടതില്ല)',
-'tog-externaleditor' => 'സ്വതേ ബാഹ്യ എഡിറ്റർ ഉപയോഗിക്കുക (വിദഗ്ദ്ധ ഉപയോക്താക്കൾക്കു മാത്രം, താങ്കളുടെ കമ്പ്യൂട്ടറിൽ പ്രത്യേക സജ്ജീകരണങ്ങൾ ആവശ്യമാണ്. [//www.mediawiki.org/wiki/Manual:External_editors കൂടുതൽ വിവരങ്ങൾ.])',
-'tog-externaldiff' => 'വ്യത്യാസം അറിയാൻ സ്വതേ ബാഹ്യ ഉപകരണങ്ങൾ ഉപയോഗിക്കുക (വിദഗ്ദ്ധ ഉപയോക്താക്കൾക്കു മാത്രം, താങ്കളുടെ കമ്പ്യൂട്ടറിൽ പ്രത്യേക സജ്ജീകരണങ്ങൾ ആവശ്യമാണ്. [//www.mediawiki.org/wiki/Manual:External_editors കൂടുതൽ വിവരങ്ങൾ.])',
-'tog-showjumplinks' => '"പോവുക" ഗമ്യത കണ്ണികൾ പ്രാപ്തമാക്കുക',
 'tog-uselivepreview' => 'തത്സമയ പ്രിവ്യൂ ഉപയോഗപ്പെടുത്തുക (പരീക്ഷണാടിസ്ഥാനം)',
 'tog-forceeditsummary' => 'തിരുത്തലുകളുടെ ചുരുക്കം നൽകിയില്ലെങ്കിൽ എന്നെ ഓർമ്മിപ്പിക്കുക',
 'tog-watchlisthideown' => 'ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്ന് എന്റെ തിരുത്തലുകൾ മറയ്ക്കുക',
@@ -380,6 +383,8 @@ $messages = array(
 'tog-diffonly' => 'രണ്ട് പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസത്തിനു താഴെ താളിന്റെ ഉള്ളടക്കം കാണിക്കരുത്.',
 'tog-showhiddencats' => 'മറഞ്ഞിരിക്കുന്ന വർഗ്ഗങ്ങളെ കാണിക്കുക',
 'tog-norollbackdiff' => 'റോൾബാക്കിനു ശേഷം വ്യത്യാസം കാണിക്കാതിരിക്കുക',
+'tog-useeditwarning' => 'സേവ് ചെയ്യാത്ത മാറ്റങ്ങളോടു കൂടിയ തിരുത്തൽ താളിൽ നിന്നും പോകുമ്പോൾ എന്നെ അറിയിക്കുക',
+'tog-prefershttps' => 'പ്രവേശിച്ചിരിക്കുമ്പോൾ എപ്പോഴും സുരക്ഷിതമായ കണൿഷൻ ഉപയോഗിക്കുക',
 
 'underline-always' => 'എല്ലായ്പ്പോഴും',
 'underline-never' => 'ഒരിക്കലും അരുത്',
@@ -443,6 +448,18 @@ $messages = array(
 'oct' => 'ഒക്ടോ.',
 'nov' => 'നവം.',
 'dec' => 'ഡിസം.',
+'january-date' => 'ജനുവരി $1',
+'february-date' => 'ഫെബ്രുവരി $1',
+'march-date' => 'മാർച്ച് $1',
+'april-date' => 'ഏപ്രിൽ $1',
+'may-date' => 'മെയ് $1',
+'june-date' => 'ജൂൺ $1',
+'july-date' => 'ജൂലൈ $1',
+'august-date' => 'ഓഗസ്റ്റ് $1',
+'september-date' => 'സെപ്റ്റംബർ $1',
+'october-date' => 'ഒക്ടോബർ $1',
+'november-date' => 'നവംബർ $1',
+'december-date' => 'ഡിസംബർ $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|വർഗ്ഗം|വർഗ്ഗങ്ങൾ}}',
@@ -524,6 +541,7 @@ $messages = array(
 'create-this-page' => 'ഈ താൾ സൃഷ്ടിക്കുക',
 'delete' => 'മായ്ക്കുക',
 'deletethispage' => 'ഈ താൾ നീക്കം ചെയ്യുക',
+'undeletethispage' => 'ഈ താൾ പുനഃസ്ഥാപിക്കുക',
 'undelete_short' => '{{PLURAL:$1|ഒരു തിരുത്തൽ|$1 തിരുത്തലുകൾ}} പുനഃസ്ഥാപിക്കുക',
 'viewdeleted_short' => '{{PLURAL:$1|മായ്ക്കപ്പെട്ട ഒരു തിരുത്തൽ|മായ്ക്കപ്പെട്ട $1 തിരുത്തലുകൾ}} കാണുക',
 'protect' => 'സം‌രക്ഷിക്കുക',
@@ -567,7 +585,7 @@ $1',
 'pool-queuefull' => 'പൂൾ ക്യൂ നിറഞ്ഞിരിക്കുന്നു',
 'pool-errorunknown' => 'അപരിചിതമായ പിഴവ്',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} സം‌രംഭത്തെക്കുറിച്ച്',
 'aboutpage' => 'Project:വിവരണം',
 'copyright' => 'പ്രത്യേകം പറയാത്ത പക്ഷം ഉള്ളടക്കം $1 പ്രകാരം ലഭ്യം.',
@@ -577,7 +595,6 @@ $1',
 'disclaimers' => 'നിരാകരണങ്ങൾ',
 'disclaimerpage' => 'Project:പൊതുനിരാകരണം',
 'edithelp' => 'തിരുത്തൽ സഹായി',
-'edithelppage' => 'Help:തിരുത്തൽ വഴികാട്ടി',
 'helppage' => 'Help:ഉള്ളടക്കം',
 'mainpage' => 'പ്രധാന താൾ',
 'mainpage-description' => 'പ്രധാന താൾ',
@@ -655,17 +672,12 @@ $1',
 # General errors
 'error' => 'പിഴവ്',
 'databaseerror' => 'ഡാറ്റാബേസ് പിഴവ്',
-'dberrortext' => 'ഒരു വിവരശേഖര അന്വേഷണത്തിന്റെ ഉപയോഗക്രമത്തിൽ പിഴവ് സംഭവിച്ചിരിക്കുന്നു.
-ഇത് ചിലപ്പോൾ സോഫ്റ്റ്‌വെയർ ബഗ്ഗിനെ സൂചിപ്പിക്കുന്നതാവാം.
-അവസാനം ശ്രമിച്ച വിവരശേഖര അന്വേഷണം താഴെ കൊടുക്കുന്നു:
-<blockquote><code>$1</code></blockquote>
-"<code>$2</code>" എന്ന നിർദ്ദേശത്തിനകത്ത് നിന്നും.
-വിവരശേഖരത്തിൽ നിന്നും ലഭിച്ച പിഴവ് "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'വിവരശേഖര അന്വേഷണ ഘടനയിൽ ഒരു പിഴവ് സംഭവിച്ചിരിക്കുന്നു.
-അവസാനം ശ്രമിച്ച വിവരശേഖര അന്വേഷണം താഴെ കൊടുക്കുന്നു:
-"$1"
-"$2" എന്ന നിർദ്ദേശത്തിനകത്ത് നിന്നും .
-വിവരശേഖരത്തിൽ നിന്നും ലഭിച്ച പിഴവ് "$3: $4"',
+'databaseerror-text' => 'ഡേറ്റാബേസ് ക്വറി പിഴവ് സംഭവിച്ചിരിക്കുന്നു.
+ഇതിനർത്ഥം സോഫ്റ്റ്‌വേറിൽ ബഗ് ഉണ്ടെന്നാണ്.',
+'databaseerror-textcl' => 'ഒരു ഡേറ്റാബേസ് ക്വറി പിഴവ് സംഭവിച്ചിരിക്കുന്നു.',
+'databaseerror-query' => 'ക്വറി: $1',
+'databaseerror-function' => 'ഫങ്ഷൻ: $1',
+'databaseerror-error' => 'പിഴവ്: $1',
 'laggedslavemode' => 'മുന്നറിയിപ്പ്: താളിൽ അടുത്തകാലത്ത് വരുത്തിയ പുതുക്കലുകൾ ഉണ്ടാവണമെന്നില്ല.',
 'readonly' => 'ഡാറ്റാബേസ് ബന്ധിച്ചിരിക്കുന്നു',
 'enterlockreason' => 'ഡാറ്റാബേസ് ബന്ധിക്കുവാനുള്ള കാരണം സൂചിപ്പിക്കുക. അതോടൊപ്പം എപ്പോഴാണ്‌ ബന്ധനം അഴിക്കുവാൻ ഉദ്ദേശിക്കുന്നതെന്നും രേഖപ്പെടുത്തുക.',
@@ -699,6 +711,7 @@ $1',
 'cannotdelete-title' => '"$1" എന്ന താൾ മായ്ക്കാൻ കഴിയില്ല',
 'delete-hook-aborted' => 'മായ്ക്കൽ കൊളുത്തിനാൽ റദ്ദാക്കിയിരിക്കുന്നു.
 വിശദീകരണമൊന്നും നൽകിയിട്ടില്ല.',
+'no-null-revision' => '"$1" എന്ന താളിന് പുതിയ ശൂന്യമായ മാറ്റമുള്ള നാൾപ്പതിപ്പ് സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല',
 'badtitle' => 'അസാധുവായ തലക്കെട്ട്',
 'badtitletext' => 'താങ്കൾ ആവശ്യപ്പെട്ട തലക്കെട്ടുള്ള ഒരു താൾ നിലവിലില്ല. ഇതു തെറ്റായി അന്തർഭാഷാ/അന്തർവിക്കി കണ്ണി ചെയ്യപ്പെട്ടതു മൂലമോ, തലക്കെട്ടിൽ ഉപയോഗിക്കരുതാത്ത അക്ഷരരൂപങ്ങൾ ഉപയോഗിച്ചതു മൂലമോ സംഭവിച്ചതായിരിക്കാം.',
 'perfcached' => 'താഴെ കൊടുത്തിരിക്കുന്ന വിവരം ശേഖരിച്ചു വെച്ചിരിക്കുന്നതാണ്, അതുകൊണ്ട് ചിലപ്പോൾ പുതിയതായിരിക്കണമെന്നില്ല. പരമാവധി {{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്.',
@@ -718,12 +731,15 @@ $1',
 'editinginterface' => "'''മുന്നറിയിപ്പ്:''' സോഫ്റ്റ്‌വെയറിൽ സമ്പർക്കമുഖം നിലനിർത്തുന്ന താളാണു താങ്കൾ തിരുത്തുവാൻ പോകുന്നത്.
 ഈ താളിൽ താങ്കൾ വരുത്തുന്ന മാറ്റങ്ങൾ ഉപയോക്താക്കൾ വിക്കി കാണുന്ന വിധത്തെ മാറ്റിമറിച്ചേക്കാം.
 മീഡിയവിക്കി സന്ദേശങ്ങളുടെ പരിഭാഷകൾ കൂട്ടിച്ചേർക്കാനും മാറ്റംവരുത്താനും മീഡിയവിക്കി സന്ദേശങ്ങളുടെ പ്രാദേശികവത്കരണ പദ്ധതിയായ [//translatewiki.net/ translatewiki.net] ഉപയോഗിക്കുവാൻ താല്പര്യപ്പെടുന്നു.",
-'sqlhidden' => '(എസ്.ക്യു.എൽ. ക്വറി മറച്ചിരിക്കുന്നു)',
 'cascadeprotected' => 'നിർഝരിത (cascading) സൗകര്യം ഉപയോഗിച്ച് തിരുത്തൽ നടത്തുന്നതിനു സം‌രക്ഷണം ഏർപ്പെടുത്തിയിട്ടുള്ള {{PLURAL:$1|താഴെ കൊടുത്തിട്ടുള്ള താളിന്റെ|താഴെ കൊടുത്തിട്ടുള്ള താളുകളുടെ}} ഭാഗമാണ്‌ ഈ താൾ. അതിനാൽ ഈ താൾ തിരുത്തുവാൻ സാധിക്കില്ല:
 $2',
 'namespaceprotected' => "'''$1''' നാമമേഖലയിലുള്ള താളുകൾ തിരുത്താൻ താങ്കൾക്ക് അനുവാദമില്ല.",
 'customcssprotected' => 'ഈ സി.എസ്.എസ്. താളിൽ മറ്റൊരു ഉപയോക്താവിന്റെ സ്വകാര്യസജ്ജീകരണങ്ങൾ ഉൾക്കൊള്ളുന്നു, അതിനാൽ താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുവാദമില്ല.',
 'customjsprotected' => 'ഈ ജാവാസ്ക്രിപ്റ്റ് താളിൽ മറ്റൊരു ഉപയോക്താവിന്റെ സ്വകാര്യസജ്ജീകരണങ്ങൾ ഉൾക്കൊള്ളുന്നു, അതിനാൽ താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുവാദമില്ല.',
+'mycustomcssprotected' => 'ഈ സി.എസ്.എസ്.  താൾ തിരുത്താനുള്ള അനുമതി താങ്കൾക്കില്ല.',
+'mycustomjsprotected' => 'ഈ ജാവാസ്ക്രിപ്റ്റ് താൾ തിരുത്താനുള്ള അനുമതി താങ്കൾക്കില്ല.',
+'myprivateinfoprotected' => 'താങ്കൾക്ക് സ്വന്തം സ്വകാര്യവിവരങ്ങൾ തിരുത്തുവാനുള്ള അനുമതിയില്ല.',
+'mypreferencesprotected' => 'താങ്കൾക്ക് സ്വന്തം ക്രമീകരണങ്ങൾ തിരുത്തുവാനുള്ള അനുമതിയില്ല.',
 'ns-specialprotected' => 'പ്രത്യേകം എന്ന നാമമേഖലയിൽ വരുന്ന താളുകൾ തിരുത്താനാവുന്നവയല്ല.',
 'titleprotected' => "[[User:$1|$1]] എന്ന ഉപയോക്താവ് ഈ താൾ ഉണ്ടാക്കുന്നതു നിരോധിച്ചിരിക്കുന്നു.
 ''$2'' എന്നതാണു അതിനു കാണിച്ചിട്ടുള്ള കാരണം.",
@@ -748,10 +764,19 @@ $2',
 'welcomecreation-msg' => 'താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു.
 താങ്കളുടെ [[Special:Preferences|{{SITENAME}} ക്രമീകരണങ്ങളിൽ]] മാറ്റം വരുത്താൻ മറക്കരുത്.',
 'yourname' => 'ഉപയോക്തൃനാമം:',
+'userlogin-yourname' => 'ഉപയോക്തൃനാമം',
+'userlogin-yourname-ph' => 'താങ്കളുടെ ഉപയോക്തൃനാമം നൽകുക',
+'createacct-another-username-ph' => 'ഉപയോക്തൃനാമം നൽകുക',
 'yourpassword' => 'രഹസ്യവാക്ക്:',
+'userlogin-yourpassword' => 'രഹസ്യവാക്ക്',
+'userlogin-yourpassword-ph' => 'താങ്കളുടെ രഹസ്യവാക്ക് നൽകുക',
+'createacct-yourpassword-ph' => 'ഒരു രഹസ്യവാക്ക് നൽകുക',
 'yourpasswordagain' => 'രഹസ്യവാക്ക് ഒരിക്കൽക്കൂടി:',
+'createacct-yourpasswordagain' => 'രഹസ്യവാക്ക് സ്ഥിരീകരിക്കുക',
+'createacct-yourpasswordagain-ph' => 'രഹസ്യവാക്ക് വീണ്ടും നൽകുക',
 'remembermypassword' => 'എന്റെ പ്രവേശനം ഈ ബ്രൗസറിൽ ({{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസം}}) ഓർത്തുവെക്കുക',
-'securelogin-stick-https' => 'പ്രവേശനത്തിനു ശേഷവും എച്ച്.റ്റി.റ്റി.പി.എസ്. തന്നെ ഉപയോഗിക്കുക',
+'userlogin-remembermypassword' => 'ഞാൻ പ്രവേശിച്ചതായി തന്നെ നിലനിർത്തുക',
+'userlogin-signwithsecure' => 'സുരക്ഷിത കണക്ഷൻ ഉപയോഗിക്കുക',
 'yourdomainname' => 'താങ്കളുടെ ഡൊമെയിൻ:',
 'password-change-forbidden' => 'ഈ വിക്കിയിൽ രഹസ്യവാക്കുകൾ മാറ്റാനാവില്ല.',
 'externaldberror' => 'ഒന്നുകിൽ ഡേറ്റാബേസ് സാധൂകരണത്തിൽ പ്രശ്നം ഉണ്ടായിരുന്നു അല്ലെങ്കിൽ നവീകരിക്കുവാൻ താങ്കളുടെ ബാഹ്യ അംഗത്വം താങ്കളെ അനുവദിക്കുന്നില്ല.',
@@ -763,18 +788,44 @@ $2',
 'logout' => 'ലോഗൗട്ട്',
 'userlogout' => 'ലോഗൗട്ട്',
 'notloggedin' => 'പ്രവേശിച്ചിട്ടില്ല',
+'userlogin-noaccount' => 'അംഗത്വമില്ലേ?',
+'userlogin-joinproject' => '{{SITENAME}} സം‌രംഭത്തിൽ ചേരുക',
 'nologin' => "അംഗത്വമില്ലേ? '''$1'''.",
 'nologinlink' => 'ഒരംഗത്വമെടുക്കുക',
 'createaccount' => 'അംഗത്വമെടുക്കുക',
 'gotaccount' => "താങ്കൾക്ക് അംഗത്വമുണ്ടോ? '''$1'''.",
 'gotaccountlink' => 'പ്രവേശിക്കുക',
 'userlogin-resetlink' => 'താങ്കളുടെ ലോഗിൻ വിവരങ്ങൾ മറന്നു പോയോ?',
+'userlogin-resetpassword-link' => 'താങ്കളുടെ രഹസ്യവാക്ക് പുനഃസജ്ജീകരിക്കുക',
+'helplogin-url' => 'Help:പ്രവേശനം',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|പ്രവേശന സഹായം]]',
+'userlogin-loggedin' => 'താങ്കൾ ഇപ്പോൾ തന്നെ {{GENDER:$1|$1}} ആയി പ്രവേശിച്ചിരിക്കുന്നു.
+താഴെ ഉള്ള ഫോം ഉപയോഗിച്ച് മറ്റൊരു ഉപയോക്താവായി പ്രവേശിക്കാവുന്നതാണ്.',
+'userlogin-createanother' => 'മറ്റൊരു അംഗത്വമെടുക്കുക',
+'createacct-join' => 'താങ്കളെപ്പറ്റിയുള്ള വിവരങ്ങൾ താഴെ നൽകുക.',
+'createacct-another-join' => 'പുതിയ അംഗത്വത്തിന്റെ വിവരങ്ങൾ താഴെ നൽകുക.',
+'createacct-emailrequired' => 'ഇമെയിൽ വിലാസം',
+'createacct-emailoptional' => 'ഇമെയിൽ വിലാസം (നിർബന്ധമില്ല)',
+'createacct-email-ph' => 'താങ്കളുടെ ഇമെയിൽ വിലാസം നൽകുക',
+'createacct-another-email-ph' => 'ഇമെയിൽ വിലാസം നൽകുക',
 'createaccountmail' => 'തൽക്കാലം ക്രമരഹിതമായി സൃഷ്ടിച്ച ഒരു രഹസ്യവാക്ക് ഉപയോഗിക്കുകയും അത് തന്നിരിക്കുന്ന ഇമെയിൽ വിലാസത്തിലേക്കയക്കുകയും ചെയ്യുക',
+'createacct-realname' => 'ശരിയായ പേര് (നിർബന്ധമില്ല)',
 'createaccountreason' => 'കാരണം:',
+'createacct-reason' => 'കാരണം',
+'createacct-reason-ph' => 'താങ്കൾ എന്തുകൊണ്ടാണ് മറ്റൊരു അംഗത്വം എടുക്കുന്നത്',
+'createacct-captcha' => 'സുരക്ഷാ പരിശോധന',
+'createacct-imgcaptcha-ph' => 'മുകളിൽ കാണുന്ന എഴുത്ത് ഇവിടെ നൽകുക',
+'createacct-submit' => 'താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കുക',
+'createacct-another-submit' => 'മറ്റൊരു അംഗത്വമെടുക്കുക',
+'createacct-benefit-heading' => 'താങ്കളെപ്പോലെയുള്ളവരാണ്  {{SITENAME}}  പടുത്തുയർത്തിയിരിക്കുന്നത്.',
+'createacct-benefit-body1' => '{{PLURAL:$1|തിരുത്ത്|തിരുത്തുകൾ}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|താൾ|താളുകൾ}}',
+'createacct-benefit-body3' => 'സമീപകാലത്ത് സംഭാവന {{PLURAL:$1|ചെയ്തയാൾ|ചെയ്തവർ}}',
 'badretype' => 'താങ്കൾ നൽകിയ രഹസ്യവാക്കുകൾ സമമല്ല.',
 'userexists' => 'നൽകിയ ഉപയോക്തൃനാമം മുമ്പേ നിലവിലുണ്ട്.
 ദയവായി മറ്റൊരു ഉപയോക്തൃനാമം തിരഞ്ഞെടുക്കുക.',
 'loginerror' => 'പ്രവേശനം സാധിച്ചില്ല',
+'createacct-error' => 'അംഗത്വസൃഷ്ടിക്കിടെ പിഴവുണ്ടായി',
 'createaccounterror' => 'അംഗത്വമെടുക്കാൻ കഴിഞ്ഞില്ല:$1',
 'nocookiesnew' => 'ഉപയോക്തൃഅംഗത്വം ഉണ്ടാക്കിയിരിക്കുന്നു. പക്ഷെ താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. {{SITENAME}} സംരംഭത്തിൽ ലോഗിൻ ചെയ്യുവാൻ കുക്കികൾ സജ്ജമാക്കിയിരിക്കണം. താങ്കളുടെ കമ്പ്യൂട്ടറിൽ നിലവിൽ കുക്കികൾ ഡിസേബിൾ ചെയ്തിരിക്കുന്നു. അതു എനേബിൾ ചെയ്തു താങ്കളുടെ ഉപയോക്തൃനാമവും രഹസ്യവാക്കും ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യൂ.',
 'nocookieslogin' => '{{SITENAME}} സംരംഭത്തിൽ ലോഗിൻ ചെയ്യുവാൻ കുക്കികൾ സജ്ജമാക്കിയിരിക്കണം. പക്ഷെ താങ്കൾ കുക്കികൾ സജ്ജമാക്കിയിട്ടില്ല. കുക്കികൾ സജ്ജമാക്കിയതിനു ശേഷം വീണ്ടും ലോഗിൻ ചെയ്യാൻ ശ്രമിക്കൂ.',
@@ -825,10 +876,13 @@ $2',
 അംഗത്വം അബദ്ധവശാൽ ഉണ്ടാക്കിയതാണെങ്കിൽ താങ്കൾക്ക് ഈ സന്ദേശം നിരാകരിക്കാവുന്നതാണ്‌.',
 'usernamehasherror' => 'ഉപയോക്തൃനാമത്തിൽ ഹാഷ് ലിപികൾ ഉൾപ്പെടുത്തരുത്',
 'login-throttled' => 'താങ്കൾ നിരവധി പ്രാവശ്യം ലോഗിൻ ചെയ്യാൻ ശ്രമിച്ചിരിക്കുന്നു.
-പുതിയതായി ശ്രമിക്കുന്നതിനു മുമ്പ് ദയവായി കാത്തിരിക്കുക.',
+പുതിയതായി ശ്രമിക്കുന്നതിനു മുമ്പ് $1 ദയവായി കാത്തിരിക്കുക.',
 'login-abort-generic' => 'താങ്കളുടെ പ്രവേശിക്കൽ പരാജയപ്പെട്ടു - റദ്ദാക്കപ്പെട്ടിരിക്കുന്നു',
 'loginlanguagelabel' => 'ഭാഷ: $1',
 'suspicious-userlogout' => 'ലോഗൗട്ട് ചെയ്യാനുള്ള താങ്കളുടെ അഭ്യർത്ഥന നിരസിച്ചിരിക്കുന്നു, കാരണം അത് തകർന്ന ബ്രൗസറിൽ നിന്നോ കാഷിങ് പ്രോക്സിയിൽ നിന്നോ ഉണ്ടായതുപോലെ അനുഭവപ്പെടുന്നു.',
+'createacct-another-realname-tip' => 'താങ്കളുടെ യഥാർത്ഥ പേര്‌ നൽകണമെന്നു നിർബന്ധമില്ല.
+
+എങ്കിലും അങ്ങനെ ചെയ്താൽ, ഉപയോക്താക്കൾക്ക് അവരരവരുടെ പേരിൽ തന്നെ തങ്ങളുടെ സൃഷ്ടിക്ക് കടപ്പാട് ലഭിക്കുന്നതാണ്.',
 
 # Email sending
 'php-mail-error-unknown' => 'പി.എച്ച്.പി.യുടെ main() ഫങ്ഷനിൽ അപരിചിതമായ പിഴവ്',
@@ -844,7 +898,7 @@ $2',
 'newpassword' => 'പുതിയ രഹസ്യവാക്ക്:',
 'retypenew' => 'പുതിയ രഹസ്യവാക്ക് ഉറപ്പിക്കുക:',
 'resetpass_submit' => 'രഹസ്യവാക്ക് സജ്ജീകരിച്ചശേഷം ലോഗിൻ ചെയ്യുക',
-'resetpass_success' => 'താങ്കളുടെ രഹസ്യവാക്ക് വിജയകരമായി മാറ്റിയിരിക്കുന്നു! ഇപ്പോൾ താങ്കളെ സംരംഭത്തിലേക്ക് ആനയിക്കുന്നു...',
+'changepassword-success' => 'താങ്കളുടെ രഹസ്യവാക്ക് വിജയകരമായി മാറ്റിയിരിക്കുന്നു!',
 'resetpass_forbidden' => 'രഹസ്യവാക്കുകൾ മാറ്റുന്നത് അനുവദിക്കുന്നില്ല',
 'resetpass-no-info' => 'ഈ താൾ നേരിട്ടു കാണുന്നതിന് താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം.',
 'resetpass-submit-loggedin' => 'രഹസ്യവാക്ക് മാറ്റുക',
@@ -856,10 +910,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക',
-'passwordreset-text' => 'രഹസ്യവാക്ക് പുനർസജ്ജീകരിക്കാനായി ഈ ഫോം പൂരിപ്പിക്കുക.',
+'passwordreset-text-one' => 'രഹസ്യവാക്ക് പുനർസജ്ജീകരിക്കാനായി ഈ ഫോം പൂരിപ്പിക്കുക.',
+'passwordreset-text-many' => '{{PLURAL:$1|താങ്കളുടെ രഹസ്യവാക്ക് പുനസജ്ജീകരിക്കാൻ ഒരു ഫോം പൂരിപ്പിച്ചു നൽകുക.}}',
 'passwordreset-legend' => 'രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക',
 'passwordreset-disabled' => 'ഈ വിക്കിയിൽ രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കലുകൾ പ്രവർത്തരഹിതമാക്കിയിരിക്കുകയാണ്.',
-'passwordreset-pretext' => '{{PLURAL:$1||താഴെ ഒരു വിവരശകലം നൽകുക}}',
+'passwordreset-emaildisabled' => 'ഈ വിക്കിയിൽ ഇമെയിൽ സൗകര്യങ്ങൾ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.',
 'passwordreset-username' => 'ഉപയോക്തൃനാമം:',
 'passwordreset-domain' => 'ഡൊമൈൻ:',
 'passwordreset-capture' => 'ഫലമായുണ്ടാകുന്ന ഇമെയിൽ കാണണോ?',
@@ -884,7 +939,7 @@ $2
 താത്കാലിക രഹസ്യവാക്ക്: $2',
 'passwordreset-emailsent' => 'ഒരു രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയച്ചിട്ടുണ്ട്.',
 'passwordreset-emailsent-capture' => 'രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയച്ചിട്ടുണ്ട്, അത് താഴെക്കൊടുക്കുന്നു.',
-'passwordreset-emailerror-capture' => 'താഴെക്കൊടുത്തിരിക്കുന്ന, ഓർമ്മപ്പെടുത്തൽ ഇമെയിൽ സൃഷ്ടിച്ചു, പക്ഷേ ഉപയോക്താവിന് അയയ്ക്കാൻ കഴിഞ്ഞില്ല: $1',
+'passwordreset-emailerror-capture' => 'താഴെക്കൊടുത്തിരിക്കുന്ന, രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ സൃഷ്ടിക്കാനായെങ്കിലും, അത് {{GENDER:$2|ഉപയോക്താവിന്}} അയയ്ക്കുന്നത് പരാജയപ്പെട്ടു: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്തുക',
@@ -898,6 +953,19 @@ $2
 'changeemail-submit' => 'ഇമെയിലിൽ മാറ്റംവരുത്തുക',
 'changeemail-cancel' => 'റദ്ദാക്കുക',
 
+# Special:ResetTokens
+'resettokens' => 'ചീട്ടുകൾ പുനഃസജ്ജീകരിക്കുക',
+'resettokens-text' => 'താങ്കളുടെ അംഗത്വവുമായി ബന്ധപ്പെട്ടുള്ള ചില സ്വകാര്യവിവരങ്ങളിലേയ്ക്ക് ഇവിടെ ലഭ്യത സാദ്ധ്യമാക്കുന്ന ചീട്ടുകൾ താങ്കൾക്ക് പുനഃസജ്ജീകരിക്കാവുന്നതാണ്.
+
+താങ്കളുടെ അംഗത്വവിവരങ്ങൾ മറ്റാർക്കെങ്കിലും അറിയാതെ കൈമാറിയിട്ടുണ്ടെങ്കിലോ താങ്കളുടെ അംഗത്വം അപഹരിക്കപ്പെട്ടുവെങ്കിലോ താങ്കളിത്  ചെയ്യേണ്ടതാണ്.',
+'resettokens-no-tokens' => 'ചീട്ടുകളൊന്നും പുനഃസജ്ജീകരിക്കാനില്ല.',
+'resettokens-legend' => 'ചീട്ടുകൾ പുനഃസജ്ജീകരിക്കുക',
+'resettokens-tokens' => 'ചീട്ടുകൾ:',
+'resettokens-token-label' => '$1 (ഇപ്പോഴത്തെ വില: $2)',
+'resettokens-watchlist-token' => ' [[Special:Watchlist|താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളിലുണ്ടാകുന്ന മാറ്റങ്ങളുടെ]] വെബ് ഫീഡ് (ആറ്റം/ആർ.എസ്.എസ്.) ചീട്ട്',
+'resettokens-done' => 'ചീട്ടുകൾ പുനഃസജ്ജീകരിക്കപ്പെട്ടു.',
+'resettokens-resetbutton' => 'തിരഞ്ഞെടുത്ത ചീട്ടുകൾ പുനഃസജ്ജീകരിക്കുക',
+
 # Edit page toolbar
 'bold_sample' => 'കടുപ്പിച്ച എഴുത്ത്',
 'bold_tip' => 'കടുപ്പിച്ചെഴുതുവാൻ',
@@ -1079,12 +1147,15 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 ഇത് മായ്ക്കപ്പെട്ടതായി കാണുന്നു.',
 'edit-conflict' => 'തിരുത്തൽ സമരസപ്പെടായ്ക.',
 'edit-no-change' => 'ഇപ്പോഴുള്ള സ്ഥിതിയിൽ നിന്നു യാതൊരു മാറ്റവും ഇല്ലാത്തതിനാൽ താങ്കളുടെ തിരുത്തലുകൾ തിരസ്കരിക്കപ്പെട്ടിരിക്കുന്നു.',
+'postedit-confirmation' => 'താങ്കളുടെ തിരുത്ത് സേവ് ചെയ്തിരിക്കുന്നു.',
 'edit-already-exists' => 'പുതിയ താൾ സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല.
 താൾ ഇപ്പോൾ തന്നെ നിലവിലുണ്ട്.',
 'defaultmessagetext' => 'സ്വതേയുള്ള സന്ദേശ എഴുത്ത്',
 'content-failed-to-parse' => '$2 ഉള്ളടക്കം $1 മാതൃകയിൽ പാഴ്സ് ചെയ്യൽ പരാജയപ്പെട്ടു: $3',
 'invalid-content-data' => 'അസാധുവായ ഉള്ളടക്ക ഡേറ്റ',
 'content-not-allowed-here' => '"$1" ഉള്ളടക്കം [[$2]] താളിൽ അനുവദിക്കുന്നില്ല',
+'editwarning-warning' => 'ഈ താളിൽ നിന്നും പോകുന്നത് താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ നഷ്ടപ്പെടാൻ ഇടയാക്കും.
+താങ്കൾ ലോഗിൻ ചെയ്തിട്ടുണ്ടെങ്കിൽ, താങ്കളുടെ ക്രമീകരണങ്ങളിൽ "തിരുത്തൽ" എന്ന ഭാഗത്ത് ചെന്ന് ഈ അറിയിപ്പ് പ്രദർശിപ്പിക്കുന്നത് ഒഴിവാക്കാവുന്നതാണ്.',
 
 # Content models
 'content-model-wikitext' => 'വിക്കിഎഴുത്ത്',
@@ -1119,6 +1190,7 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'undo-failure' => 'ഇടയ്ക്കുള്ള തിരുത്തലുകൾ തമ്മിൽ സമരസപ്പെടാത്തതു കാരണം ഈ തിരുത്തൽ തിരസ്ക്കരിക്കുവാനാവില്ല.',
 'undo-norev' => 'ഈ തിരുത്തൽ നിലവിലില്ലാത്തതിനാലോ മായ്ക്കപ്പെട്ടതിനാലോ പൂർവസ്ഥിതിയിലാക്കുവാൻ സാധിക്കുകയില്ല.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|സംവാദം]]) ചെയ്ത നാൾപ്പതിപ്പ് $1 നീക്കം ചെയ്യുന്നു',
+'undo-summary-username-hidden' => 'മറയ്ക്കപ്പെട്ട ഉപയോക്താവ് ചെയ്ത നാൾപ്പതിപ്പ് $1 തിരസ്കരിക്കുക',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'അംഗത്വം സൃഷ്ടിക്കാൻ സാധിച്ചില്ല',
@@ -1301,6 +1373,7 @@ $1",
 'compareselectedversions' => 'തിരഞ്ഞെടുത്ത പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസം കാണുക',
 'showhideselectedversions' => 'തിരഞ്ഞെടുത്ത മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക/മറയ്ക്കുക',
 'editundo' => 'മാറ്റം തിരസ്ക്കരിക്കുക',
+'diff-empty' => '(വ്യത്യാസം ഇല്ല)',
 'diff-multi' => '(ഇടയ്ക്ക് {{PLURAL:$2|ഒരു ഉപയോക്താവ്|$2 ഉപയോക്താക്കൾ}} ചെയ്ത {{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}} പ്രദർശിപ്പിക്കുന്നില്ല.)',
 'diff-multi-manyusers' => '(ഇടയ്ക്ക് {{PLURAL:$2|ഒന്നിലധികം|$2 എണ്ണത്തിലധികം}} ഉപയോക്താക്കൾ ചെയ്തിട്ടുള്ള {{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}} പ്രദർശിപ്പിക്കുന്നില്ല.)',
 'difference-missing-revision' => 'ഈ വ്യത്യാസത്തിൽ ($1) {{PLURAL:$2|ഒരു നാൾപ്പതിപ്പ്|$2 നാൾപ്പതിപ്പുകൾ}} കാണാനായില്ല.
@@ -1328,7 +1401,6 @@ $1",
 'searchmenu-legend' => 'തിരച്ചിൽ ഉപാധികൾ',
 'searchmenu-exists' => "'''\"[[:\$1]]\" എന്ന തലക്കെട്ടിൽ ഒരു താൾ ഈ വിക്കിയിൽ നിലവിലുണ്ട്'''",
 'searchmenu-new' => "'''ഈ വിക്കിയിൽ \"[[:\$1]]\" താൾ നിർമ്മിക്കുക!'''",
-'searchhelp-url' => 'Help:ഉള്ളടക്കം',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ഈ പൂർവ്വപദങ്ങളുള്ള താളുകൾ ബ്രൗസ് ചെയ്യുക]]',
 'searchprofile-articles' => 'ലേഖനങ്ങളിൽ',
 'searchprofile-project' => 'സഹായം, പദ്ധതി താളുകളിൽ',
@@ -1369,15 +1441,7 @@ $1",
 'powersearch-togglenone' => 'ഒന്നുംവേണ്ട',
 'search-external' => 'ബാഹ്യ അന്വേഷണം',
 'searchdisabled' => '{{SITENAME}} സം‌രംഭത്തിൽ തിരച്ചിൽ ദുർബലപ്പെടുത്തിയിരിക്കുന്നു. താങ്കൾക്ക് ഗൂഗിൾ ഉപയോഗിച്ച് തത്കാലം തിരച്ചിൽ നടത്താവുന്നതാണ്‌. പക്ഷെ ഗൂഗിളിൽ {{SITENAME}} സം‌രംഭത്തിന്റെ സൂചിക കാലഹരണപ്പെട്ടതായിരിക്കാൻ സാദ്ധ്യതയുണ്ട്.',
-
-# Quickbar
-'qbsettings' => 'ദ്രുത സൗകര്യം',
-'qbsettings-none' => 'ഒന്നുമില്ല',
-'qbsettings-fixedleft' => 'സ്ഥിരമായ ഇടത്',
-'qbsettings-fixedright' => 'സ്ഥിരമായ വലത്',
-'qbsettings-floatingleft' => 'ഇടത്തേയ്ക്ക് ഒഴുകി നിൽക്കുക',
-'qbsettings-floatingright' => 'വലത്തേയ്ക്ക് ഒഴുകി നിൽക്കുക',
-'qbsettings-directionality' => 'താങ്കളുടെ ഭാഷയുടെ ലിപിയിൽ എഴുത്തുന്ന ദിശയനുസരിച്ച് ശരിയാക്കിയിരിക്കുന്നു',
+'search-error' => 'തിരയുന്നതിനിടെ ഒരു പിഴവുണ്ടായി: $1',
 
 # Preferences page
 'preferences' => 'ക്രമീകരണങ്ങൾ',
@@ -1411,7 +1475,6 @@ $1",
 'resetprefs' => 'സേവ് ചെയ്തിട്ടില്ലാത്ത മാറ്റങ്ങൾ പുനഃക്രമീകരിക്കുക',
 'restoreprefs' => 'സ്വതേയുള്ള ക്രമീകരണങ്ങൾ പുനഃസ്ഥാപിക്കുക (എല്ലാ ഭാഗങ്ങളിലേയും)',
 'prefs-editing' => 'തിരുത്തൽ',
-'prefs-edit-boxsize' => 'തിരുത്തൽ ജാലകത്തിന്റെ വലിപ്പം',
 'rows' => 'വരി:',
 'columns' => 'നിര:',
 'searchresultshead' => 'തിരയൂ',
@@ -1422,9 +1485,9 @@ $1",
 'recentchangesdays-max' => 'പരമാവധി {{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസങ്ങൾ}}',
 'recentchangescount' => 'സ്വതേ പ്രദർശിപ്പിക്കേണ്ട തിരുത്തലുകളുടെ എണ്ണം:',
 'prefs-help-recentchangescount' => 'പുതിയ മാറ്റങ്ങൾ, താളിന്റെ നാൾവഴികൾ, രേഖകൾ എന്നിവക്കും ഇത് ബാധകമാണ്.',
-'prefs-help-watchlist-token' => 'ഈ പെട്ടിയിൽ ഒരു രഹസ്യവാക്ക് ഉപയോഗിച്ചാൽ താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയ്ക്കുള്ള ആർ.എസ്.എസ്. ഫീഡ് ഉണ്ടാക്കുന്നതാണ്.
-ഈ രഹസ്യവാക്ക് അറിയാവുന്ന ആർക്കും താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക വായിക്കാവുന്നതാണ്. അതുകൊണ്ട് സുരക്ഷിതമായ ഒന്നു തിരഞ്ഞെടുക്കുക.
-ഇവിടെ താങ്കൾക്കുപയോഗിക്കാവുന്ന ക്രമരഹിതമായി സൃഷ്ടിച്ച ഒരെണ്ണം കൊടുത്തിരിക്കുന്നു: $1',
+'prefs-help-watchlist-token2' => 'ഇത് താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ  പട്ടികയുടെ വെബ്‌ഫീഡിനുള്ള രഹസ്യചാവിയാണ്.
+ഇത് അറിയാവുന്നവർക്ക് താങ്കൾ ശ്രദ്ധിക്കുന്നവയെന്താണെന്ന് വായിക്കാനാവുമെന്നതിനാൽ, പങ്ക് വെയ്ക്കാതിരിക്കുക.
+[[Special:ResetTokens|ഇത് പുനസജ്ജീകരിക്കണമെങ്കിൽ ഇവിടെ ഞെക്കുക]].',
 'savedprefs' => 'താങ്കളുടെ ക്രമീകരണങ്ങൾ കാത്തുസൂക്ഷിച്ചിരിക്കുന്നു.',
 'timezonelegend' => 'സമയ മേഖല:',
 'localtime' => 'പ്രാദേശിക സമയം:',
@@ -1455,7 +1518,6 @@ $1",
 'prefs-reset-intro' => 'സൈറ്റിൽ സ്വതേയുണ്ടാവേണ്ട ക്രമീകരണങ്ങൾ പുനഃക്രമീകരിക്കാൻ താങ്കൾക്ക് ഈ താൾ ഉപയോഗിക്കാവുന്നതാണ്.
 ഇത് തിരിച്ചു ചെയ്യാൻ സാദ്ധ്യമല്ല.',
 'prefs-emailconfirm-label' => 'ഇമെയിൽ സ്ഥിരീകരണം:',
-'prefs-textboxsize' => 'തിരുത്താനുള്ള ജാലകത്തിന്റെ വലിപ്പം',
 'youremail' => 'ഇമെയിൽ:',
 'username' => '{{GENDER:$1|ഉപയോക്തൃനാമം}}:',
 'uid' => '{{GENDER:$1|ഉപയോക്തൃ}} ഐ.ഡി.:',
@@ -1488,6 +1550,8 @@ $1",
 'prefs-dateformat' => 'ദിന ലേഖന രീതി',
 'prefs-timeoffset' => 'സമയ വ്യത്യാസം',
 'prefs-advancedediting' => 'പൊതുവായിട്ടുള്ള ഐച്ഛികങ്ങൾ',
+'prefs-editor' => 'എഡിറ്റർ',
+'prefs-preview' => 'എങ്ങനെയുണ്ടെന്ന് കാണൽ',
 'prefs-advancedrc' => 'വിപുലമായ ഉപാധികൾ',
 'prefs-advancedrendering' => 'വിപുലമായ ഉപാധികൾ',
 'prefs-advancedsearchoptions' => 'വിപുലമായ ഉപാധികൾ',
@@ -1495,7 +1559,9 @@ $1",
 'prefs-displayrc' => 'പ്രദർശന ഐച്ഛികങ്ങൾ',
 'prefs-displaysearchoptions' => 'പ്രദർശന ഐച്ഛികങ്ങൾ',
 'prefs-displaywatchlist' => 'പ്രദർശന ഐച്ഛികങ്ങൾ',
+'prefs-tokenwatchlist' => 'ചീട്ട്',
 'prefs-diffs' => 'വ്യത്യാസങ്ങൾ',
+'prefs-help-prefershttps' => 'താങ്കൾ അടുത്ത പ്രാവശ്യം പ്രവേശിക്കുമ്പോൾ ഇവ ഫലത്തിൽ വരുന്നതാണ്.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'സാധുതയുള്ളതെന്ന് തോന്നുന്നു',
@@ -1522,6 +1588,8 @@ $1",
 'userrights-notallowed' => 'ഉപയോക്താക്കൾക്ക് അവകാശങ്ങൾ കൊടുക്കാനും എടുത്തുകളയാനുമുള്ള അനുമതി താങ്കൾക്കില്ല.',
 'userrights-changeable-col' => 'താങ്കൾക്ക് മാറ്റാവുന്ന സംഘങ്ങൾ',
 'userrights-unchangeable-col' => 'താങ്കൾക്ക് മാറ്റാനാവാത്ത സംഘങ്ങൾ',
+'userrights-conflict' => 'ഉപയോക്തൃ അവകാശങ്ങളുടെ മാറ്റം സമരസപ്പെടായ്കയുണ്ടായി! ദയവായി താങ്കളുടെ മാറ്റങ്ങൾ വീണ്ടും സംശോധനം ചെയ്ത് സ്ഥിരീകരിച്ച് നടപ്പിലാക്കുക.',
+'userrights-removed-self' => 'താങ്കൾ സ്വന്തം അവകാശങ്ങൾ സ്വയം ഒഴിവാക്കിയിരിക്കുന്നു. അതിനാൽ ഈ താൾ ഇനി താങ്കൾക്ക് ലഭ്യമായിരിക്കില്ല.',
 
 # Groups
 'group' => 'സംഘം:',
@@ -1588,11 +1656,19 @@ $1",
 'right-proxyunbannable' => 'പ്രോക്സികളെ സ്വതേ തടയുന്നത് ബാധകമല്ലാതിരിക്കുക',
 'right-unblockself' => 'സ്വയം തടയൽ നീക്കുക',
 'right-protect' => 'സംരക്ഷണ മാനത്തിൽ മാറ്റം വരുത്തുക, നിർഝരിത മാർഗ്ഗത്തിൽ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്ന താളുകൾ തിരുത്തുക',
-'right-editprotected' => 'സംരക്ഷിത താളുകൾ തിരുത്തുക (നിർഝരിത സംരക്ഷണം അല്ലാത്തത്)',
+'right-editprotected' => '"{{int:protect-level-sysop}}" എന്ന് അടയാളപ്പെടുത്തി സംരക്ഷിച്ചിട്ടുള്ള താളുകൾ തിരുത്തുക',
+'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}" എന്നടയാളപ്പെടുത്തി സംരക്ഷിച്ചിട്ടുള്ള താളുകൾ തിരുത്തുക',
 'right-editinterface' => 'ഉപയോക്തൃ സമ്പർക്കമുഖത്തിൽ മാറ്റം വരുത്തുക',
 'right-editusercssjs' => 'മറ്റ് ഉപയോക്താക്കളുടെ CSS, JS പ്രമാണങ്ങൾ തിരുത്തുക',
 'right-editusercss' => 'മറ്റ് ഉപയോക്താക്കളുടെ CSS പ്രമാണങ്ങൾ തിരുത്തുക',
 'right-edituserjs' => 'മറ്റ് ഉപയോക്താക്കളുടെ JS പ്രമാണങ്ങൾ തിരുത്തുക',
+'right-editmyusercss' => 'താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ സി.എസ്.എസ്. പ്രമാണങ്ങൾ തിരുത്തുക',
+'right-editmyuserjs' => 'താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ ജാവാസ്ക്രിപ്റ്റ് പ്രമാണങ്ങൾ തിരുത്തുക',
+'right-viewmywatchlist' => 'താങ്കളുടെ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക സ്വയം കാണുക',
+'right-editmywatchlist' => 'താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക സ്വയം തിരുത്തുക. ഈ അവകാശമില്ലാതെതന്നെ ചില പ്രവൃത്തികൾ താളുകൾ കൂട്ടിച്ചേർക്കുമെന്ന് അറിഞ്ഞിരിക്കുക.',
+'right-viewmyprivateinfo' => 'താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ കാണുക (ഉദാ: ഇമെയിൽ വിലാസം, യഥാർത്ഥനാമം)',
+'right-editmyprivateinfo' => 'താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ തിരുത്തുക (ഉദാ: ഇമെയിൽ വിലാസം, യഥാർത്ഥനാമം)',
+'right-editmyoptions' => 'താങ്കളുടെ സ്വന്തം ക്രമീകരണങ്ങൾ തിരുത്തുക',
 'right-rollback' => 'ഒരു പ്രത്യേക താളിൽ അവസാനം തിരുത്തൽ നടത്തിയ ഉപയോക്താവിന്റെ തിരുത്തൽ പെട്ടെന്ന് ഒഴിവാക്കുക',
 'right-markbotedits' => 'മുൻപ്രാപനം നടത്തിയ തിരുത്തലുകൾ യാന്ത്രിക തിരുത്തലുകളായി അടയാളപ്പെടുത്തുക',
 'right-noratelimit' => 'പ്രവർത്തനങ്ങൾക്ക് പരിധികൾ ബാധകമല്ല',
@@ -1654,12 +1730,19 @@ $1",
 'action-userrights-interwiki' => 'മറ്റു വിക്കികളിൽ നിന്നുള്ള ഉപയോക്താക്കളുടെ ഉപയോക്തൃ അവകാശങ്ങൾ തിരുത്തുക',
 'action-siteadmin' => 'ഡേറ്റാബേസ് തുറക്കുക അല്ലെങ്കിൽ പൂട്ടുക',
 'action-sendemail' => 'ഇമെയിലുകൾ അയയ്ക്കുക',
+'action-editmywatchlist' => 'താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക തിരുത്തുക',
+'action-viewmywatchlist' => 'താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക കാണുക',
+'action-viewmyprivateinfo' => 'താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ കാണുക',
+'action-editmyprivateinfo' => 'താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ തിരുത്തുക',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|ഒരു മാറ്റം|$1 മാറ്റങ്ങൾ}}',
+'enhancedrc-since-last-visit' => 'കഴിഞ്ഞ സന്ദർശനത്തിനു ശേഷം {{PLURAL:$1|ഒരെണ്ണം|$1 എണ്ണം}}.',
+'enhancedrc-history' => 'നാൾവഴി',
 'recentchanges' => 'സമീപകാല മാറ്റങ്ങൾ',
 'recentchanges-legend' => 'സമീപകാല മാറ്റങ്ങളുടെ ക്രമീകരണം',
 'recentchanges-summary' => '{{SITENAME}} സംരംഭത്തിലെ ഏറ്റവും പുതിയ മാറ്റങ്ങൾ ഇവിടെ കാണാം.',
+'recentchanges-noresult' => 'തന്നിരിക്കുന്ന സമയത്തിനുള്ളിൽ ഇതുമായി പൊരുത്തപ്പെടുന്ന മാറ്റങ്ങൾ ഒന്നുമില്ല.',
 'recentchanges-feed-description' => 'ഈ ഫീഡ് ഉപയോഗിച്ച് വിക്കിയിലെ പുതിയ മാറ്റങ്ങൾ നിരീക്ഷിക്കുക.',
 'recentchanges-label-newpage' => 'ഒരു പുതിയ താൾ സൃഷ്ടിച്ചിരിക്കുന്നു',
 'recentchanges-label-minor' => 'ഇതൊരു ചെറിയ തിരുത്താണ്',
@@ -1696,7 +1779,6 @@ $1",
 'recentchangeslinked-feed' => 'അനുബന്ധ മാറ്റങ്ങൾ',
 'recentchangeslinked-toolbox' => 'അനുബന്ധ മാറ്റങ്ങൾ',
 'recentchangeslinked-title' => '$1 എന്ന താളുമായി ബന്ധപ്പെട്ട മാറ്റങ്ങൾ',
-'recentchangeslinked-noresult' => 'ഈ താളിലേയ്ക്ക് കണ്ണികളുള്ള മറ്റ് താളുകൾക്ക് ഇവിടെ സൂചിപ്പിക്കപ്പെട്ട സമയത്ത് മാറ്റങ്ങളൊന്നും സം‌ഭവിച്ചിട്ടില്ല.',
 'recentchangeslinked-summary' => "ഒരു പ്രത്യേക താളിൽ നിന്നു കണ്ണി ചേർക്കപ്പെട്ടിട്ടുള്ള താളുകളിൽ അവസാനമായി വരുത്തിയ മാറ്റങ്ങളുടെ പട്ടിക താഴെ പ്രദർശിപ്പിച്ചിരിക്കുന്നു. ഈ പട്ടികയിൽ പെടുന്ന [[Special:Watchlist|താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകൾ]] '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു.",
 'recentchangeslinked-page' => 'താളിന്റെ പേര്:',
 'recentchangeslinked-to' => 'തന്നിരിക്കുന്ന താളിലെ മാറ്റങ്ങൾക്കു പകരം ബന്ധപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക',
@@ -1707,7 +1789,7 @@ $1",
 'reuploaddesc' => 'വീണ്ടും അപ്‌ലോഡ് ചെയ്ത് നോക്കാനായി തിരിച്ചു പോവുക.',
 'upload-tryagain' => 'പുതുക്കിയ പ്രമാണ വിവരണങ്ങൾ സമർപ്പിക്കുക',
 'uploadnologin' => 'ലോഗിൻ ചെയ്തിട്ടില്ല',
-'uploadnologintext' => 'പ്രമാണങ്ങൾ അപ്‌ലോഡ് ചെയ്യാൻ താങ്കൾ [[Special:UserLogin|ലോഗിൻ]] ചെയ്തിരിക്കണം',
+'uploadnologintext' => 'പ്രമാണങ്ങൾ അപ്‌ലോഡ് ചെയ്യുന്നതിനു മുമ്പ്, താങ്കൾ $1.',
 'upload_directory_missing' => 'അപ്‌‌ലോഡ് ഡയറക്ടറി ($1) ലഭ്യമല്ല, അത് സൃഷ്ടിക്കാൻ വെബ്‌‌സെർവറിനു സാധിക്കില്ല.',
 'upload_directory_read_only' => 'വെബ് സെർവറിനു അപ്‌ലോഡ് ഡയറക്ടറിയിലേക്ക് ($1) എഴുതാൻ കഴിഞ്ഞില്ല.',
 'uploaderror' => 'അപ്‌ലോഡ് പിഴവ്',
@@ -1922,7 +2004,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'http-read-error' => 'എച്ച്.റ്റി.റ്റി.പി. വിവരം പ്രദർശിപ്പിക്കുന്നതിൽ പിഴവ്.',
 'http-timed-out' => 'എച്ച്.റ്റി.റ്റി.പി. അഭ്യർത്ഥന സമയം കഴിഞ്ഞു.',
 'http-curl-error' => 'യു.ആർ.എൽ. ശേഖരിക്കുന്നതിൽ പിഴവ്: $1',
-'http-host-unreachable' => 'യു.ആർ.എൽ.-ല്‍ എത്തിപ്പെടാന്‍ സാധിച്ചില്ല',
 'http-bad-status' => 'എച്ച്.റ്റി.റ്റി.പി. അഭ്യർത്ഥനാ വേളയിൽ ഒരു പിഴവുണ്ടായി: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1952,6 +2033,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'listfiles_size' => 'വലിപ്പം',
 'listfiles_description' => 'വിവരണം',
 'listfiles_count' => 'പതിപ്പുകൾ',
+'listfiles-show-all' => 'ചിത്രത്തിന്റെ പഴയ പതിപ്പുകളും ഉൾപ്പെടുത്തുക',
+'listfiles-latestversion' => 'ഇപ്പോഴത്തെ പതിപ്പ്',
+'listfiles-latestversion-yes' => 'ശരി',
+'listfiles-latestversion-no' => 'വേണ്ട',
 
 # File description page
 'file-anchor-link' => 'പ്രമാണം',
@@ -2050,6 +2135,13 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'randompage' => 'ഏതെങ്കിലും താൾ',
 'randompage-nopages' => 'ഇനി കൊടുത്തിരിക്കുന്ന {{PLURAL:$2|നാമമേഖലയിൽ|നാമമേഖലകളിൽ}} താളുകൾ ഒന്നുമില്ല: $1.',
 
+# Random page in category
+'randomincategory' => 'വർഗ്ഗത്തിൽ നിന്ന് ക്രമരഹിതമായി എടുക്കുന്ന താൾ',
+'randomincategory-invalidcategory' => '"$1" സാധുതയുള്ള വർഗ്ഗത്തിന്റെ പേരല്ല.',
+'randomincategory-nopages' => '[[:Category:$1|വർഗ്ഗം:$1]] എന്നതിൽ താളുകളൊന്നുമില്ല.',
+'randomincategory-selectcategory' => 'ഈ വർഗ്ഗത്തിൽ നിന്നും ഏതെങ്കിലും താൾ എടുക്കുക: $1 $2.',
+'randomincategory-selectcategory-submit' => 'പോകൂ',
+
 # Random redirect
 'randomredirect' => 'ക്രമരഹിതമായ തിരിച്ചുവിടൽ',
 'randomredirect-nopages' => '"$1" എന്ന നാമമേഖലയിൽ തിരിച്ചുവിടൽ താളുകളൊന്നുമില്ല.',
@@ -2075,11 +2167,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'statistics-users-active-desc' => 'കഴിഞ്ഞ {{PLURAL:$1|ദിവസം|$1 ദിവസങ്ങൾക്കുള്ളിൽ}} പ്രവർത്തിച്ചിട്ടുള്ള ഉപയോക്താക്കൾ',
 'statistics-mostpopular' => 'ഏറ്റവുമധികം സന്ദർശിക്കപ്പെട്ട താളുകൾ',
 
-'disambiguations' => 'വിവക്ഷിത താളുകളിലേയ്ക്ക് കണ്ണിചേർത്തിരിക്കുന്ന താളുകൾ',
-'disambiguationspage' => 'Template:വിവക്ഷകൾ',
-'disambiguations-text' => "താഴെക്കൊടുത്തിരിക്കുന്ന താളുകളിൽ '''വിവക്ഷിതങ്ങൾ താളിലേയ്ക്ക്''' കുറഞ്ഞത് ഒരു കണ്ണിയുണ്ട്. അവ അനുയോജ്യമായ താളിലേയ്ക്ക് കണ്ണിചേർക്കപ്പെടേണ്ടതാവാം. <br />
-[[MediaWiki:Disambiguationspage]] എന്ന താളിൽ കണ്ണി ചേർത്തിട്ടുള്ള ഫലകം ഉപയോഗിക്കുന്ന താളുകളെ വിവക്ഷിതങ്ങൾ താളായി കണക്കാക്കുന്നു.",
-
 'pageswithprop' => 'താളിന്റെ സവിശേഷതകളുള്ള താളുകൾ',
 'pageswithprop-legend' => 'ഒരു താൾ സവിശേഷതയുള്ള താളുകൾ',
 'pageswithprop-submit' => 'പോകൂ',
@@ -2140,6 +2227,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'mostrevisions' => 'ഏറ്റവുമധികം തിരുത്തപ്പെട്ട താളുകൾ',
 'prefixindex' => 'പൂർവ്വപദത്തോടു കൂടിയ എല്ലാ താളുകളും',
 'prefixindex-namespace' => 'പൂർവ്വപദമുള്ള എല്ലാ താളുകളും (നാമമേഖല $1)',
+'prefixindex-strip' => 'പട്ടികയിൽ നിന്ന് പൂർവ്വപദം ഒഴിവാക്കുക',
 'shortpages' => 'വിവരം ഏറ്റവും കുറവുള്ള താളുകൾ',
 'longpages' => 'വലിയ താളുകളുടെ പട്ടിക',
 'deadendpages' => 'അന്തർ വിക്കി കണ്ണിയാൽ ബന്ധിപ്പിക്കപ്പെടാത്ത താളുകൾ',
@@ -2155,6 +2243,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'listusers' => 'ഉപയോക്താക്കളുടെ പട്ടിക',
 'listusers-editsonly' => 'തിരുത്തലുകൾ ചെയ്തിട്ടുള്ള ഉപയോക്താക്കളെ മാത്രം കാണിക്കുക',
 'listusers-creationsort' => 'സൃഷ്ടിക്കപ്പെട്ട തീയതി അനുസരിച്ച് ക്രമീകരിക്കുക',
+'listusers-desc' => 'അവരോഹണക്രമത്തിൽ ആക്കുക',
 'usereditcount' => '{{PLURAL:$1|ഒരു തിരുത്തൽ|$1 തിരുത്തലുകൾ}}',
 'usercreated' => '$1 $2-നു {{GENDER:$3|സൃഷ്ടിച്ചത്}}',
 'newpages' => 'പുതിയ താളുകൾ',
@@ -2331,10 +2420,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'unwatchthispage' => 'ശ്രദ്ധിക്കുന്നത് അവസാനിപ്പിക്കുക',
 'notanarticle' => 'ലേഖന താൾ അല്ല',
 'notvisiblerev' => 'മറ്റൊരു ഉപയോക്താവ് സൃഷ്ടിച്ച അവസാനത്തെ നാൾപ്പതിപ്പ് മായ്ച്ചിരിക്കുന്നു',
-'watchnochange' => 'താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകൾ ഒന്നും തന്നെ ഇക്കാലയളവിൽ തിരുത്തപ്പെട്ടിട്ടില്ല.',
 'watchlist-details' => 'സം‌വാദം താളുകൾ ഉൾപ്പെടുത്താതെ {{PLURAL:$1|ഒരു താൾ|$1 താളുകൾ}} താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലുണ്ട്.',
-'wlheader-enotif' => '* ഇമെയിൽ വിജ്ഞാപനം സാദ്ധ്യമാക്കിയിരിക്കുന്നു.',
-'wlheader-showupdated' => "* താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷം തിരുത്തപ്പെട്ട താളുകൾ  '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു",
+'wlheader-enotif' => 'ഇമെയിൽ അറിയിപ്പുകൾ സജ്ജമാക്കിയിരിക്കുന്നു.',
+'wlheader-showupdated' => "താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷം മാറ്റം വന്ന താളുകൾ  '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു",
 'watchmethod-recent' => 'ശ്രദ്ധിക്കുന്ന താളുകൾക്കുവേണ്ടി പുതിയ മാറ്റങ്ങൾ പരിശോധിക്കുന്നു',
 'watchmethod-list' => 'ശ്രദ്ധിക്കുന്ന താളുകളിലെ പുതിയ മാറ്റങ്ങൾ പരിശോധിക്കുന്നു',
 'watchlistcontains' => 'താങ്കൾ {{PLURAL:$1|താൾ|താളുകൾ}} ശ്രദ്ധിക്കുന്നുണ്ട്.',
@@ -2582,7 +2670,7 @@ $1',
 'contributions' => '{{GENDER:$1|ഉപയോക്താവിന്റെ}} സംഭാവനകൾ',
 'contributions-title' => '$1 എന്ന ഉപയോക്താവിന്റെ സംഭാവനകൾ',
 'mycontris' => 'സംഭാവനകൾ',
-'contribsub2' => '$1 എന്ന ഉപയോക്താവിന്റെ $2.',
+'contribsub2' => 'ഉപയോക്താവ് {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'ഈ മാനദണ്ഡങ്ങളുമായി യോജിക്കുന്ന മാറ്റങ്ങൾ ഒന്നും കണ്ടില്ല.',
 'uctop' => '(നിലവിലുള്ളത്)',
 'month' => 'മാസം:',
@@ -2737,13 +2825,11 @@ $1',
 'ipb_blocked_as_range' => 'പിഴവ്:  $1 എന്ന ഐ.പി.യെ നേരിട്ടല്ല തടഞ്ഞിട്ടുള്ളത്. അതിനാൽ തടയൽ നീക്കം ചെയ്യുവാൻ സാദ്ധ്യമല്ല. അതിനെ $2ന്റെ ഭാഗമായുള്ള റേഞ്ചിൽ ആണ്‌ തടഞ്ഞിട്ടുള്ളത്. അത് ഒഴിവാക്കാവുന്നതാണ്.',
 'ip_range_invalid' => 'അസാധുവായ ഐ.പി. റേഞ്ച്.',
 'ip_range_toolarge' => 'പരിധി നിശ്ചയിച്ചുള്ള തടയലുകൾ /$1 എന്നതിലും കൂടുതലാകാൻ അനുവദിക്കുന്നില്ല.',
-'blockme' => 'എന്നെ തടയുക',
 'proxyblocker' => 'പ്രോക്സി തടയൽ',
-'proxyblocker-disabled' => 'ഈ പ്രക്രിയ സജ്ജമാക്കിയിട്ടില്ല.',
 'proxyblockreason' => 'ഓപ്പൺ പ്രോക്സി ആയതിനാൽ താങ്കളുടെ ഐ.പി. വിലാസത്തെ തടഞ്ഞിരിക്കുന്നു. ഇതു എന്തെങ്കിലും പിഴവ് മൂലം സംഭവിച്ചതാണെങ്കിൽ താങ്കളുടെ ഇന്റർനെറ്റ് സേവന ദാതാവിനെ സമീപിച്ചു ഈ സുരക്ഷാ പ്രശ്നത്തെ കുറിച്ച് ബോധിപ്പിക്കുക.',
-'proxyblocksuccess' => 'ചെയ്തു കഴിഞ്ഞു.',
 'sorbsreason' => '{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്.',
 'sorbs_create_account_reason' => '{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്. താങ്കൾക്ക് അംഗത്വമെടുക്കാൻ സാദ്ധ്യമല്ല.',
+'xffblockreason' => 'എക്സ്-ഫോർവേഡഡ്-ഫോർ ഹെഡറിലെ ഒരു ഐ.പി. വിലാസം, താങ്കളുടേതോ താങ്കൾ ഉപയോഗിക്കുന്ന പ്രോക്സി സെർവറിലേതോ ആകാം, തടയപ്പെട്ടിരിക്കുന്നതാണ്. തടയലിന്റെ കാരണം: $1',
 'cant-block-while-blocked' => 'താങ്കൾ തടയപ്പെട്ടിരിക്കുമ്പോൾ മറ്റുപയോക്താക്കളെ തടയാൻ താങ്കൾക്ക് സാധിക്കില്ല.',
 'cant-see-hidden-user' => 'താങ്കൾ തടയാൻ ശ്രമിക്കുന്ന ഉപയോക്താവ് മുമ്പേ തടയപ്പെടുകയും മറയ്ക്കപ്പെടുകയും ചെയ്യപ്പെട്ടതാണ്. താങ്കൾക്ക് ഉപയോക്താവിനെ മറയ്ക്കാനുള്ള അവകാശം ഇല്ലെങ്കിൽ, ഉപയോക്താവിനെതിരെ ഉള്ള തടയൽ കാണാനോ തിരുത്താനോ കഴിയുന്നതല്ല.',
 'ipbblocked' => 'മറ്റുള്ളവരെ തടയാനോ അവരുടെ തടയൽ നീക്കാനോ താങ്കൾക്ക് കഴിയില്ല. കാരണം താങ്കൾ തന്നെ തടയപ്പെട്ടിരിക്കുകയാണ്',
@@ -2910,6 +2996,7 @@ $1',
 'thumbnail-more' => 'വലുതാക്കി കാണിക്കുക',
 'filemissing' => 'പ്രമാണം നഷ്ടമായിരിക്കുന്നു',
 'thumbnail_error' => 'ലഘുചിത്രം സൃഷ്ടിക്കുന്നതിൽ പിഴവ്: $1',
+'thumbnail_error_remote' => '$1 സംരംഭത്തിൽ നിന്നുള്ള പിഴവ് സന്ദേശം: $2',
 'djvu_page_error' => 'DjVu താൾ പരിധിയ്ക്കു പുറത്താണ്',
 'djvu_no_xml' => 'DjVu പ്രമാണത്തിനു വേണ്ടി XML ശേഖരിക്കുവാൻ പറ്റിയില്ല',
 'thumbnail-temp-create' => 'താത്കാലിക ലഘുചിത്ര പ്രമാണം സൃഷ്ടിക്കാനായില്ല',
@@ -3060,11 +3147,7 @@ $1',
 
 # Stylesheets
 'common.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. എല്ലാ ദൃശ്യരൂപങ്ങൾക്കും ബാധകമായിരിക്കും */',
-'standard.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. സാർവത്രികം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
-'nostalgia.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ഗൃഹാതുരത്വം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'monobook.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. മോണോബുക്ക് ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
-'myskin.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. എന്റിഷ്ടം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
-'chick.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. സുന്ദരി ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'modern.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. നവീനം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'vector.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. വെക്റ്റർ ദൃശ്യരൂപത്തിനു ബാധകമായിരിക്കും*/',
 'noscript.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്., ജാവാസ്ക്രിപ്റ്റ് സജ്ജമാക്കിയിട്ടില്ലാത്ത ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */',
@@ -3155,13 +3238,8 @@ $1',
 'pageinfo-category-files' => 'പ്രമാണങ്ങളുടെ എണ്ണം',
 
 # Skin names
-'skinname-standard' => 'സാർവത്രികം',
-'skinname-nostalgia' => 'ഗൃഹാതുരത്വം',
 'skinname-cologneblue' => 'ക്ലോൺ നീല',
 'skinname-monobook' => 'മോണോബുക്ക്',
-'skinname-myskin' => 'എന്റിഷ്ടം',
-'skinname-chick' => 'സുന്ദരി',
-'skinname-simple' => 'ലളിതം',
 'skinname-modern' => 'നവീനം',
 'skinname-vector' => 'വെക്റ്റർ',
 
@@ -3243,11 +3321,25 @@ $1',
 'minutes' => '{{PLURAL:$1|ഒരു മിനിറ്റ്|$1 മിനിറ്റ്}}',
 'hours' => '{{PLURAL:$1|ഒരു മണിക്കൂർ|$1 മണിക്കൂർ}}',
 'days' => '{{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസം}}',
+'weeks' => '{{PLURAL:$1|ഒരാഴ്ച്ച|$1 ആഴ്ച്ച}}',
 'months' => '{{PLURAL:$1|ഒരു മാസം|$1 മാസം}}',
 'years' => '{{PLURAL:$1|ഒരു വർഷം|$1 വർഷം}}',
 'ago' => '$1 മുമ്പ്',
 'just-now' => 'ഇപ്പോൾ',
 
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|ഒരു മണിക്കൂർ|$1 മണിക്കൂർ}} മുൻപ്',
+'minutes-ago' => '{{PLURAL:$1|ഒരു മിനിറ്റ്|$1 മിനിറ്റ്}} മുൻപ്',
+'seconds-ago' => '{{PLURAL:$1|ഒരു സെക്കന്റ്|$1 സെക്കന്റ്}} മുൻപ്',
+'monday-at' => 'തിങ്കളാഴ്ച്ച $1-നു്',
+'tuesday-at' => 'ചൊവ്വാഴ്ച്ച $1-നു്',
+'wednesday-at' => 'ബുധനാഴ്ച്ച $1-നു്',
+'thursday-at' => 'വ്യാഴാഴ്ച്ച $1-നു്',
+'friday-at' => 'വെള്ളിയാഴ്ച്ച $1-നു്',
+'saturday-at' => 'ശനിയാഴ്ച്ച $1-നു്',
+'sunday-at' => 'ഞായറാഴ്ച്ച $1-നു്',
+'yesterday-at' => 'ഇന്നലെ $1-നു്',
+
 # Bad image list
 'bad_image_list' => 'എഴുത്ത് രീതി താഴെ കൊടുത്തിരിക്കുന്നു:
 
@@ -3274,7 +3366,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'വീതി',
 'exif-imagelength' => 'ഉയരം',
 'exif-bitspersample' => 'ഓരോ ഘടകത്തിലുമുള്ള ബിറ്റുകൾ',
@@ -3448,7 +3540,7 @@ $1',
 'exif-originalimageheight' => 'വെട്ടിയെടുക്കുന്നതിനു മുമ്പ് ചിത്രത്തിന്റെ ഉയരം',
 'exif-originalimagewidth' => 'വെട്ടിയെടുക്കുന്നതിനു മുമ്പ് ചിത്രത്തിന്റെ വീതി',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ചുരുക്കാത്തത്',
 'exif-compression-5' => 'എൽ.സെഡ്.ഡബ്ല്യു.',
 'exif-compression-6' => 'ജെപിഇജി (പഴയത്)',
@@ -3843,7 +3935,6 @@ $5
 'version-other' => 'മറ്റുള്ളവ',
 'version-mediahandlers' => 'മീഡിയ കൈകാര്യോപകരണങ്ങൾ',
 'version-hooks' => 'കൊളുത്തുകൾ',
-'version-extension-functions' => 'അനുബന്ധങ്ങളുടെ കർത്തവ്യങ്ങൾ',
 'version-parser-extensiontags' => 'പാഴ്‌സർ അനുബന്ധ റ്റാഗുകൾ',
 'version-parser-function-hooks' => 'പാഴ്‌സർ ഫങ്ഷൻ കൊളുത്തുകൾ',
 'version-hook-name' => 'കൊളുത്തിന്റെ പേര്',
@@ -3852,6 +3943,7 @@ $5
 'version-license' => 'അനുമതി',
 'version-poweredby-credits' => "ഈ വിക്കി പ്രവർത്തിക്കാൻ '''[//www.mediawiki.org/ മീഡിയവിക്കി]''' ഉപയോഗിക്കുന്നു. പകർപ്പവകാശം © 2001-$1 $2.",
 'version-poweredby-others' => 'മറ്റുള്ളവർ',
+'version-poweredby-translators' => 'പരിഭാഷാവിക്കിയിലെ പരിഭാഷകർ',
 'version-credits-summary' => '[[Special:Version|മീഡിയവിക്കിയ്ക്ക്]] നൽകിയ സംഭാവനകളുടെ പേരിൽ താഴെക്കൊടുക്കുന്നവർക്ക് ഞങ്ങൾ നന്ദി പറയുന്നു.',
 'version-license-info' => 'മീഡിയവിക്കി ഒരു സ്വതന്ത്ര സോഫ്റ്റ്‌വേറാണ്; സ്വതന്ത്ര സോഫ്റ്റ്‌വേർ ഫൗണ്ടേഷൻ പ്രസിദ്ധീകരിച്ചിട്ടുള്ള ഗ്നു സാർവ്വജനിക അനുവാദപത്രത്തിന്റെ പതിപ്പ് 2 പ്രകാരമോ, അല്ലെങ്കിൽ (താങ്കളുടെ ഇച്ഛാനുസരണം) പിന്നീട് പ്രസിദ്ധീകരിച്ച ഏതെങ്കിലും പതിപ്പ് പ്രകാരമോ താങ്കൾക്കിത് പുനർവിതരണം ചെയ്യാനും ഒപ്പം/അല്ലെങ്കിൽ മാറ്റങ്ങൾ വരുത്താനും സാധിക്കുന്നതാണ്.
 
@@ -3867,12 +3959,17 @@ $5
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath ലേഖന പഥം]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath സ്ക്രിപ്റ്റ് പഥം]',
 
-# Special:FilePath
-'filepath' => 'പ്രമാണത്തിലേക്കുള്ള വിലാസം',
-'filepath-page' => 'പ്രമാണം:',
-'filepath-submit' => 'പോകൂ',
-'filepath-summary' => 'ഈ പ്രത്യേക താൾ ഒരു പ്രമാണത്തിന്റെ പൂർണ്ണ വിലാസം പ്രദർശിപ്പിക്കുന്നു.
-ചിത്രങ്ങൾ പൂർണ്ണ റെസലൂഷനോടു കൂടി പ്രദർശിപ്പിച്ചിരിക്കുന്നു. മറ്റുള്ള പ്രമാണ തരങ്ങൾ അതതു പ്രോഗ്രാമിൽ നേരിട്ടു തുറക്കാവുന്നതാണ്‌.',
+# Special:Redirect
+'redirect' => 'പ്രമാണത്താൽ, ഉപയോക്താവിനാൽ അഥവാ നാൾപ്പതിപ്പ് ഐ.ഡി. ചെയ്യുന്ന തിരിച്ചുവിടൽ',
+'redirect-legend' => 'ഒരു പ്രമാണത്തിലോട്ടോ താളിലോട്ടോ ഉള്ള തിരിച്ചുവിടൽ',
+'redirect-summary' => 'ഈ പ്രത്യേക താൾ ഒരു പ്രമാണത്തിലേയ്ക്കോ (പ്രമാണത്തിന്റെ പേര് തന്നിട്ടുണ്ട്), ഒരു താളിലേയ്ക്കോ (നാൾപ്പതിപ്പിന്റെ ഐഡി തന്നിട്ടുണ്ട്), അല്ലെങ്കിൽ ഒരു ഉപയോക്തൃതാളിലേയ്ക്കോ (ഉപയോക്താവിന്റെ സംഖ്യാ ഐ.ഡി. തന്നിട്ടുണ്ട്) തിരിച്ചുവിടുന്നു.',
+'redirect-submit' => 'പോകൂ',
+'redirect-lookup' => 'തേടുക:',
+'redirect-value' => 'വില:',
+'redirect-user' => 'ഉപയോക്തൃ ഐ.ഡി.',
+'redirect-revision' => 'താളിന്റെ നാൾപ്പതിപ്പ്',
+'redirect-file' => 'പ്രമാണത്തിന്റെ പേര്',
+'redirect-not-exists' => 'വില കണ്ടെത്താൻ കഴിഞ്ഞില്ല',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ഒരേ പ്രമാണത്തിന്റെ പലപകർപ്പുകളുണ്ടോയെന്നു തിരയുക',
@@ -3922,12 +4019,16 @@ $5
 'tags' => 'സാധുവായ മാറ്റങ്ങളുടെ അനുബന്ധങ്ങൾ',
 'tag-filter' => '[[Special:Tags|അനുബന്ധങ്ങളുടെ]] അരിപ്പ:',
 'tag-filter-submit' => 'അരിപ്പ',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|റ്റാഗ്|റ്റാഗുകൾ}}]]: $2)',
 'tags-title' => 'അനുബന്ധങ്ങൾ',
 'tags-intro' => 'സോഫ്റ്റ്‌വെയർ അടയാളപ്പെടുത്തിയ തിരുത്തുകളുടെ അനുബന്ധങ്ങളും, അവയുടെ അർത്ഥവും ഈ താളിൽ പ്രദർശിപ്പിക്കുന്നു.',
 'tags-tag' => 'റ്റാഗിന്റെ പേര്‌',
 'tags-display-header' => 'മാറ്റങ്ങളുടെ പട്ടികകളിലെ രൂപം',
 'tags-description-header' => 'അർത്ഥത്തിന്റെ പൂർണ്ണ വിവരണം',
+'tags-active-header' => 'സീജീവമാണോ?',
 'tags-hitcount-header' => 'അനുബന്ധമുള്ള മാറ്റങ്ങൾ',
+'tags-active-yes' => 'അതെ',
+'tags-active-no' => 'അല്ല',
 'tags-edit' => 'തിരുത്തുക',
 'tags-hitcount' => '{{PLURAL:$1|ഒരു മാറ്റം|$1 മാറ്റങ്ങൾ}}',
 
@@ -3948,6 +4049,7 @@ $5
 'dberr-problems' => 'ക്ഷമിക്കണം! ഈ സൈറ്റിൽ സാങ്കേതിക തകരാറുകൾ അനുഭവപ്പെടുന്നുണ്ട്.',
 'dberr-again' => 'കുറച്ച് മിനിട്ടുകൾ കാത്തിരുന്ന് വീണ്ടും തുറക്കുവാൻ ശ്രമിക്കുക.',
 'dberr-info' => '(വിവരശേഖര സെർവറുമായി ബന്ധപ്പെടാൻ പറ്റിയില്ല: $1)',
+'dberr-info-hidden' => '(ഡേറ്റാബേസ് സെർവറുമായി ബന്ധപ്പെടരുത്)',
 'dberr-usegoogle' => 'അതേസമയം താങ്കൾക്ക് ഗൂഗിൾ വഴി തിരയുവാൻ ശ്രമിക്കാവുന്നതാണ്.',
 'dberr-outofdate' => 'അവരുടെ പക്കലുള്ള നമ്മുടെ ഉള്ളടക്കത്തിന്റെ സൂചികകൾ കാലഹരണപ്പെട്ടതാകാമെന്ന് ഓർക്കുക.',
 'dberr-cachederror' => 'ആവശ്യപ്പെട്ട താളിന്റെ കാഷ് ചെയ്യപ്പെട്ട പകർപ്പാണിത്, ഇത് ഇപ്പോഴുള്ളതാകണമെന്നില്ല.',
@@ -3963,6 +4065,9 @@ $5
 'htmlform-submit' => 'സമർപ്പിക്കുക',
 'htmlform-reset' => 'മാറ്റങ്ങൾ വേണ്ട',
 'htmlform-selectorother-other' => 'മറ്റുള്ളവ',
+'htmlform-no' => 'ഇല്ല',
+'htmlform-yes' => 'ശരി',
+'htmlform-chosen-placeholder' => 'ഒരു ഐച്ഛികം തിരഞ്ഞെടുക്കുക',
 
 # SQLite database support
 'sqlite-has-fts' => 'പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയുള്ള $1',
@@ -4080,4 +4185,19 @@ $5
 # Image rotation
 'rotate-comment' => 'ചിത്രം പ്രദക്ഷിണദിശയിൽ {{PLURAL:$1|ഒരു ഡിഗ്രി|$1 ഡിഗ്രി}} തിരിച്ചു',
 
+# Limit report
+'limitreport-title' => 'പാഴ്സർ പ്രൊഫൈലിങിന്റെ വിവരങ്ങൾ:',
+'limitreport-cputime' => 'സി.പി.യു. സമയ ഉപയോഗം',
+'limitreport-cputime-value' => '{{PLURAL:$1|ഒരു സെക്കന്റ്|$1 സെക്കന്റ്}}',
+'limitreport-walltime' => 'യഥാർത്ഥ സമയ ഉപയോഗം',
+'limitreport-walltime-value' => '{{PLURAL:$1|ഒരു സെക്കന്റ്|$1 സെക്കന്റ്}}',
+'limitreport-ppvisitednodes' => 'പ്രീപ്രോസസർ സന്ദർശിച്ച നോഡിന്റെ എണ്ണം',
+'limitreport-ppgeneratednodes' => 'പ്രീപ്രോസർ സൃഷ്ടിച്ച നോഡിന്റെ എണ്ണം',
+'limitreport-postexpandincludesize' => 'വികസിപ്പിച്ചതിനു ശേഷമുള്ള ഉൾപ്പെടുത്തൽ വലിപ്പം',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|ബൈറ്റ് |ബൈറ്റുകൾ}}',
+'limitreport-templateargumentsize' => 'ഫലകത്തിലെ ചരങ്ങൾക്കനുവദിച്ചിരിക്കുന്ന വലിപ്പം',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|ബൈറ്റ് |ബൈറ്റുകൾ}}',
+'limitreport-expansiondepth' => 'വികസിപ്പിക്കാനാവുന്ന ഉയർന്ന പരിധി',
+'limitreport-expensivefunctioncount' => 'വ്യയമേറിയ പാഴ്സർ ഫങ്ഷൻ എണ്ണം',
+
 );
diff --git a/languages/messages/MessagesMn.php b/languages/messages/MessagesMn.php
index 7eb7dd49..04734d64 100644
--- a/languages/messages/MessagesMn.php
+++ b/languages/messages/MessagesMn.php
@@ -72,9 +72,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Харж буй хэрэглэгчдийн тоог үзүүлэх',
 'tog-oldsig' => 'Одоогийн гарын үсэг:',
 'tog-fancysig' => 'Түүхий гарын үсэг （автомат холбоосгүй）',
-'tog-externaleditor' => 'Үндсэн горимд нэмэлт засварлах багаж хэрэглэх（экспертүүдэд зориулагдсан, таны компьютерт тусгай тохиргоо шаардлагатай）',
-'tog-externaldiff' => 'Үндсэн горим гадаад харьцуулагч программ ашиглах （экспертүүдэд зориулав, таны компьютерт тусгай тохиргоо шаардлагатай）',
-'tog-showjumplinks' => '"Шууд очих" хялбар линкүүдийг ажиллагаатай болгох',
 'tog-uselivepreview' => 'Шууд байдлаар урьдчилж харах （ЖаваСкрипт） （Туршилт）',
 'tog-forceeditsummary' => 'Товч агуулгын талбарыг хоосон үлдээхэд надад мэдэгдэх',
 'tog-watchlisthideown' => 'Хянах жагсаалтаас миний засваруудыг нуух',
@@ -273,7 +270,7 @@ $1',
 'pool-queuefull' => 'Пүүлийн дараалал дүүрсэн байна',
 'pool-errorunknown' => 'Үл мэдэгдэх алдаа',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}-н тухай',
 'aboutpage' => 'Project:Тухай',
 'copyright' => 'Агуулгыг $1-н хувьд хэрэглэх боломжтой.',
@@ -283,7 +280,6 @@ $1',
 'disclaimers' => 'Татгалзлууд',
 'disclaimerpage' => 'Project:Ерөнхий татгалзал',
 'edithelp' => 'Засвар хийх тухай тусламж',
-'edithelppage' => 'Help:Засварлах',
 'helppage' => 'Help:Агуулга',
 'mainpage' => 'Нүүр хуудас',
 'mainpage-description' => 'Нүүр хуудас',
@@ -362,17 +358,6 @@ $1',
 # General errors
 'error' => 'Aлдаа',
 'databaseerror' => 'Өгөгдлийн сангийн алдаа',
-'dberrortext' => 'Өгөгдлийн сан дахь хайлтанд синтаксийн алдаа гарлаа.
-Энэ нь програм хангамжид алдаа байгааг харуулж байж болзошгүй.
-Хамгийн сүүлд гүйцэтгэсэн өгөгдлийн сан дахь хайлт нь:
-"<tt>$2</tt>" функц доторх
-<blockquote><tt>$1</tt></blockquote> байна.
-Өгөгдлийн сан нь "<tt>$3: $4</tt>" гэсэн алдааг буцаав.',
-'dberrortextcl' => 'Өгөгдлийн сан дахь хайлтанд синтаксийн алдаа гарлаа.
-Хамгийн сүүлд гүйцэтгэсэн мэдээллийн бааз дахь хайлт нь
-"$2" функц доторх:
-"$1" байна.
-Өгөгдлийн сан нь "$3: $4" алдааг буцаав',
 'laggedslavemode' => 'Анхаар: Энэ хуудас нь хамгийн сүүлийн өөрчлөлтүүдийг хамруулаагүй байж болно.',
 'readonly' => 'Мэдээллийн сан түгжигдсэн байна',
 'enterlockreason' => 'Түгжих болсон шалтгаан болон хэзээ уг түгжээ нь тайлагдах тухай оруулна уу.',
@@ -425,7 +410,6 @@ $1',
 'editinginterface' => "'''Анхаар''': Та программын харагдах байдалд ашиглагддаг текстийг агуулсан хуудсыг засварлах гэж байна.
 Энэ хуудсанд өөрчлөлт оруулснаар бусад хэрэглэгчдийн программын харагдах байдалд нөлөөлөх болно.
 Орчуулга хийх гэж байгаа бол МедиаВикигийн орчуулгын төсөл болох, [//translatewiki.net/wiki/Main_Page?setlang=mn Бетавики]-г хэрэглэхийг санал болгож байна.",
-'sqlhidden' => '（SQL илэрц харагдахгүй байна）',
 'cascadeprotected' => 'Энэ хуудас нь давхар хамгаалалттай дараах {{PLURAL:$1|хуудсанд|хуудсуудад}} орсон тул засварлагдахаас хамгаалагдсан байна:
 $2',
 'namespaceprotected' => "Таньд '''$1''' нэрний зай дахь хуудсуудыг засварлах зөвшөөрөл байхгүй байна.",
@@ -459,7 +443,6 @@ $2',
 'yourpassword' => 'Нууц үг:',
 'yourpasswordagain' => 'Нууц үгээ дахин оруулах:',
 'remembermypassword' => 'Энэ компьютер дээрх миний нэвтрэлтийг сана (хамгийн дээд талдаа $1 {{PLURAL:$1|өдрийн|өдрийн}} туршид)',
-'securelogin-stick-https' => 'Нэвтэрсний дараа HTTPS -д нэвтэрсэн хэвээр байх',
 'yourdomainname' => 'Таны домэйн:',
 'password-change-forbidden' => 'Та энэ вики дээрх нууц үгээ сольж болохгүй.',
 'externaldberror' => 'Нэг бол гадны баталгаажуулах мэдээллийн сангийн алдаа гарсан, эсвэл та өөрийн гадны бүртгэлээ шинэчлэх эрхгүй байна.',
@@ -564,7 +547,7 @@ $2',
 'newpassword' => 'Шинэ нууц үг:',
 'retypenew' => 'Шинэ нууц үгээ дахин оруулах:',
 'resetpass_submit' => 'Нууц үгээ тогтоож нэвтрэх',
-'resetpass_success' => 'Таны нууц үг амжилттай солигдлоо! Та одоо нэвтэрч байна...',
+'changepassword-success' => 'Таны нууц үг амжилттай солигдлоо! Та одоо нэвтэрч байна...',
 'resetpass_forbidden' => 'Нууц үг өөрчлөх боломжгүй',
 'resetpass-no-info' => 'Энэ хуудсыг шууд үзэхийн тулд нэвтэрч орсон байх шаардлагатай.',
 'resetpass-submit-loggedin' => 'Нууц үгээ солих',
@@ -575,10 +558,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Нууц үгийг сэргээх',
-'passwordreset-text' => 'Энэхүү маягтыг бөглөж хэрэглэгчийн мэдээллээ аваарай.',
 'passwordreset-legend' => 'Нууц үгээ сэргээх',
 'passwordreset-disabled' => 'Энэ вики-д нууц үгийг сэргээх боломжгүй байна.',
-'passwordreset-pretext' => '{{PLURAL:$1||Доорх өгөгдлийн аль нэг хэсгийг оруулна уу}}',
 'passwordreset-username' => 'Хэрэглэгчийн нэр:',
 'passwordreset-domain' => 'Домайн:',
 'passwordreset-capture' => 'Цахим шуудангийн нууц үг сэргээх шууданг үзэх',
@@ -1052,7 +1033,6 @@ $1",
 'searchmenu-legend' => 'Хайх сонголтууд',
 'searchmenu-exists' => "'''Энэ викид \"[[:\$1]]\" гэсэн хуудас байна'''",
 'searchmenu-new' => "'''Энэ викид \"[[:\$1]]\" гэсэн хуудсыг үүсгэх!'''",
-'searchhelp-url' => 'Help:Агуулга',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Энэ угтвартай хуудсуудыг гүйлгэж харах]]',
 'searchprofile-articles' => 'Агуулгын хуудсууд',
 'searchprofile-project' => 'Тусламжийн болон төслийн хуудсууд',
@@ -1097,15 +1077,6 @@ $1",
 Та одоохондоо Google-г ашиглан хайх боломжтой.
 Анхааруулж хэлэхэд, тэдний {{SITENAME}}-н агуулгын индексүүд хоцрогдсон байж магадгүй.',
 
-# Quickbar
-'qbsettings' => 'Шуурхай тавцан',
-'qbsettings-none' => 'Байхгүй',
-'qbsettings-fixedleft' => 'Зүүн талд бэхжүүлсэн',
-'qbsettings-fixedright' => 'Баруун талд бэхжүүлсэн',
-'qbsettings-floatingleft' => 'Зүүн талд хөвсөн',
-'qbsettings-floatingright' => 'Баруун талд хөвсөн',
-'qbsettings-directionality' => 'Тухай хэлний барилаас хамаарч хэлбэрийг бий болгох',
-
 # Preferences page
 'preferences' => 'Хэрэглэгчийн тохиргоо',
 'mypreferences' => 'Миний тохиргоо',
@@ -1138,7 +1109,6 @@ $1",
 'resetprefs' => 'Хадгалаагүй өөрчлөлтүүдийг арилгах',
 'restoreprefs' => 'Бүх тохиргоог анхны байдалд оруулах',
 'prefs-editing' => 'Засварлах',
-'prefs-edit-boxsize' => 'Засварлах цонхны хэмжээ.',
 'rows' => 'Мөр:',
 'columns' => 'Багана:',
 'searchresultshead' => 'Хайлт',
@@ -1149,9 +1119,6 @@ $1",
 'recentchangesdays-max' => 'Хамгийн ихдээ $1 өдөр',
 'recentchangescount' => 'Үзүүлэх засварын тоо (анхны байдалд):',
 'prefs-help-recentchangescount' => 'Энд сүүлийн өөрчлөлтүүд, хуудасны түүхүүд, логууд орно.',
-'prefs-help-watchlist-token' => 'Энэхүү талбарыг нууц түлхүүртэйгээр бөглөвөл таны хянаж буй хуудсуудын жагсаалтаар RSS фийд үүсгэгдэнэ.
-Тус түлхүүрийг мэдсэн хүн бүр таны хянаж буй хуудсуудын жагсаалтыг харах боломжтой тул чанартай утга сонгоорой.
-Таны хэрэглэж болох санамсаргүй утга: $1',
 'savedprefs' => 'Таны тохиргоо хадгалагдлаа.',
 'timezonelegend' => 'Цагийн бүс:',
 'localtime' => 'Орон нутгийн цаг:',
@@ -1182,7 +1149,6 @@ $1",
 'prefs-reset-intro' => 'Та энэ хуудсыг ашиглан өөрийн тохиргоог сайтын анхны тохиргооо руу шилжүүлэх боломжтой.
 Энэ үйлдлийг буцаах боломжгүй.',
 'prefs-emailconfirm-label' => 'Мэйлийн баталгаажуулалт:',
-'prefs-textboxsize' => 'Засварлах талбарын хэмжээ',
 'youremail' => 'Мэйл хаяг:',
 'username' => '{{GENDER:$1|Хэрэглэгчийн нэр}}:',
 'uid' => '{{GENDER:$1|Хэрэглэгчийн}} ID:',
@@ -1421,7 +1387,6 @@ $1 тэмдэгтээс богино байх ёстой.',
 'recentchangeslinked-feed' => 'Холбогдох өөрчлөлтүүд',
 'recentchangeslinked-toolbox' => 'Холбогдох өөрчлөлтүүд',
 'recentchangeslinked-title' => '"$1"-тай холбоотой засварууд',
-'recentchangeslinked-noresult' => 'Өгөгдсөн хугацаанд холбогдсон хуудсууд дээр засвар хийгдээгүй байна.',
 'recentchangeslinked-summary' => "Энэ хуудас бол тодорхой хуудаснаас （эсвэл тодорхой ангиллын доторх хуудсууд） холбогдсон хуудсуудад хийгдсэн өөрчлөлтийн жагсаалт юм.
 Таны [[Special:Watchlist|хянах жагсаалтанд]] буй хуудсууд '''тодруулагдсан''' байгаа.",
 'recentchangeslinked-page' => 'Хуудасны нэр:',
@@ -1659,7 +1624,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization -г харна уу.',
 'http-read-error' => 'HTTP-г унших алдаа.',
 'http-timed-out' => 'HTTP хүсэлтийн хугацаа дуусав.',
 'http-curl-error' => 'Дараах URL-г авчрахад алдаа гарав: $1',
-'http-host-unreachable' => 'URL-д хүрч чадсангүй.',
 'http-bad-status' => 'HTTP хандалтын үед асуудал үүсэв: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1805,12 +1769,6 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 'statistics-users-active-desc' => 'Сүүлийн {{PLURAL:$1|өдөрт|$1 өдөрт}} үйлдэл хийсэн хэрэглэгчид',
 'statistics-mostpopular' => 'Хамгийн олон удаа үзсэн хуудсууд',
 
-'disambiguations' => 'Өөр агуулгатай хуудсуудтай холбоотой хуудсууд',
-'disambiguationspage' => 'Template:Салаа утгатай',
-'disambiguations-text' => "Дараах хуудсууд '''салаа утгатай үгнүүдийн хуудас''' руу холбогдоно.
-Тэдгээр нь зөв сэдэв руу холбогдох ёстой.<br />
-[[MediaWiki:Disambiguationspage]]-с холбогдсон загвар хэрэглэж байвал хуудас нь салаа утгатай үгнүүдийн хуудас гэж тооцогдоно.",
-
 'doubleredirects' => 'Давхар чиглүүлэгчүүд',
 'doubleredirectstext' => 'Энэ хуудсанд өөр хуудсуудыг давхар заасан хуудсуудыг жагсаасан байна
 Мөр тус бүр нь эхний заасан болон түүний дараах заасан хуудсуудыг жагсаан бичсэний сацуу уг хоёр хуудсын эцсийн чиглүүлсэн "жинхэнэ" хуудсыг үзүүлсэн байна.',
@@ -2045,10 +2003,9 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 'unwatchthispage' => 'Хянахаа зогсоох',
 'notanarticle' => 'Агуулгагүй хуудас',
 'notvisiblerev' => 'Засвар устгагдлаа',
-'watchnochange' => 'Дурьдагдсан хугацаанд таны хянаж буй хуудсуудад өөрчлөлт ороогүй байна.',
 'watchlist-details' => 'Хяналтын жагсаалтад {{PLURAL:$1|$1 хуудас|$1 хуудаснууд}} байна.',
-'wlheader-enotif' => '* И-мэйл мэдэгдэл хүчинтэй боллоо.',
-'wlheader-showupdated' => "* Таны хамгийн сүүлд айлчилснаас хойш өөрчлөгдсөн хуудсууд '''тодоор''' бичигдсэн байгаа",
+'wlheader-enotif' => 'И-мэйл мэдэгдэл хүчинтэй боллоо.',
+'wlheader-showupdated' => "Таны хамгийн сүүлд айлчилснаас хойш өөрчлөгдсөн хуудсууд '''тодоор''' бичигдсэн байгаа",
 'watchmethod-recent' => 'хяналтад буй хуудсуудад шинэ өөрчлөлт орсон эсэхийг шалгаж байна',
 'watchmethod-list' => 'хяналтад буй хуудсуудад саяхан өөрчлөлт орсон эсэхийг шалгаж байна',
 'watchlistcontains' => 'Таны хянах жагсаалтанд $1 хуудас байна.',
@@ -2441,12 +2398,9 @@ $1',
 Харин энэ нь $2 хэсгийн хэсэг болж түгжигдсэн байгаа бөгөөд үүнийг тайлах боломжтой.',
 'ip_range_invalid' => 'Хүчингүй IP-н хүрээ.',
 'ip_range_toolarge' => '/$1-с том хэмжээтэй түгжээ нь хориотой.',
-'blockme' => 'Намайг түгж',
 'proxyblocker' => 'Түгжигч прокси',
-'proxyblocker-disabled' => 'Энэ функцийг хаасан байна.',
 'proxyblockreason' => 'Таны IP хаяг нь чөлөөт прокси учраас түгжигдсэн байна.
 Та өөрийн ISP-тэйгээ холбоо барьж техникийн зөвлөгөө авч энэ асуудлынхаа тухай хэлнэ үү.',
-'proxyblocksuccess' => 'Гүйцэтгэсэн.',
 'sorbsreason' => '{{SITENAME}}-н хэрэглэдэг DNSBL-д таны IP хаягийг чөлөөт прокси хэмээн тодорхойлсон байна.',
 'sorbs_create_account_reason' => '{{SITENAME}}-н хэрэглэдэг DNSBL-д таны IP хаягийг чөлөөт прокси гэж тэмдэглэсэн байна.
 Та бүртгэл үүсгэх боломжгүй.',
@@ -2886,7 +2840,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Өргөн',
 'exif-imagelength' => 'Өндөр',
 'exif-bitspersample' => 'Бүрэлдэхүүн хэсэг бүр дэх бит',
@@ -3040,7 +2994,7 @@ $1',
 'exif-giffilecomment' => 'GIF файлын тэмдэглэгээ',
 'exif-intellectualgenre' => 'Зүйлийн төрөл',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Шахагдаагүй',
 
 'exif-unknowndate' => 'Мэдэгдэхгүй огноо',
@@ -3366,7 +3320,6 @@ $5
 'version-other' => 'Бусад',
 'version-mediahandlers' => 'Медиа боловсруулагч',
 'version-hooks' => 'Гогцоо',
-'version-extension-functions' => 'Өргөтгөлүүдийн функцууд',
 'version-parser-extensiontags' => 'Парсер нэмэлт тагууд',
 'version-parser-function-hooks' => 'Парсер функцийн тагууд',
 'version-hook-name' => 'Хүүкийн нэр',
@@ -3379,13 +3332,6 @@ $5
 'version-software-product' => 'Бүтээгдэхүүн',
 'version-software-version' => 'Хувилбар',
 
-# Special:FilePath
-'filepath' => 'Файлын зам',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Явах',
-'filepath-summary' => 'Энэхүү тусгай хуудас нь файлын бүтэн замыг дуудна.
-Зургууд нь бүтэн хэмжээгээрээ гарах ба бусад файлын төрлүүд нь тохирох програмаараа шууд нээгдэнэ.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Давхардсан файлуудыг хайх',
 'fileduplicatesearch-summary' => 'Хэш кодыг ашиглан давхардсан файлуудын хайна.',
diff --git a/languages/messages/MessagesMr.php b/languages/messages/MessagesMr.php
index 200fd84b..b59092be 100644
--- a/languages/messages/MessagesMr.php
+++ b/languages/messages/MessagesMr.php
@@ -354,9 +354,6 @@ $messages = array(
 'tog-shownumberswatching' => 'पहारा देणाऱ्या सदस्यांचा आकडा दाखवा',
 'tog-oldsig' => 'सध्याची सही:',
 'tog-fancysig' => 'सही विकिसंज्ञा म्हणून वापरा (आपोआप दुव्याशिवाय)',
-'tog-externaleditor' => 'कायम बाह्य संपादक वापरा (फक्त प्रशिक्षित सदस्यांसाठीच, संगणकावर विशेष प्रणाली लागते) ([//www.mediawiki.org/wiki/Manual:External_editors अधिक माहिती])',
-'tog-externaldiff' => 'इतिहास पानावर निवडलेल्या आवृत्त्यांमधील बदल दाखविण्यासाठी बाह्य प्रणाली वापरा (फक्त प्रशिक्षित सदस्यांसाठीच, संगणकावर विशेष प्रणाली लागते) ([//www.mediawiki.org/wiki/Manual:External_editors अधिक माहिती])',
-'tog-showjumplinks' => '"कडे जा" सुगम दुवे, उपलब्ध करा.',
 'tog-uselivepreview' => 'संपादन करता करताच झलक दाखवा (प्रयोगक्षम)',
 'tog-forceeditsummary' => 'जर ’बदलांचा आढावा’ दिला नसेल तर मला सूचित करा',
 'tog-watchlisthideown' => 'पहाऱ्याच्या सूचीतून माझे बदल लपवा',
@@ -369,6 +366,8 @@ $messages = array(
 'tog-diffonly' => 'निवडलेल्या आवृत्त्यांमधील बदल दाखवताना जुनी आवृत्ती दाखवू नका.',
 'tog-showhiddencats' => 'लपविलेले वर्ग दाखवा',
 'tog-norollbackdiff' => 'द्रुतमाघार घेतल्यास बदल वगळा',
+'tog-useeditwarning' => 'जर मी संपादित करीत असलेल्या पानावरील माझे संपादिलेले बदल जतन न केल्यास मला इशारा द्या',
+'tog-prefershttps' => 'सनोंद प्रवेशतांना प्रत्येक वेळी  सुरक्षित अनुबंध वापरा',
 
 'underline-always' => 'नेहमी',
 'underline-never' => 'कधीच नाही',
@@ -432,6 +431,18 @@ $messages = array(
 'oct' => 'ऑक्टो.',
 'nov' => 'नोव्हें.',
 'dec' => 'डिसें.',
+'january-date' => 'जानेवारी $1',
+'february-date' => 'फेब्रुवारी $1',
+'march-date' => 'मार्च $1',
+'april-date' => 'एप्रिल $1',
+'may-date' => 'मे $1',
+'june-date' => 'जून $1',
+'july-date' => 'जुलै $1',
+'august-date' => 'ऑगस्ट $1',
+'september-date' => 'सप्टेंबर $1',
+'october-date' => 'ऑक्टोबर $1',
+'november-date' => 'नोव्हेंबर $1',
+'december-date' => 'डिसेंबर $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|वर्ग}}',
@@ -513,6 +524,7 @@ $messages = array(
 'create-this-page' => 'हे पान तयार करा',
 'delete' => 'वगळा',
 'deletethispage' => 'हे पान काढून टाका',
+'undeletethispage' => 'गाळलेला लेख पुर्ववत् करा',
 'undelete_short' => 'पुनर्स्थापन {{PLURAL:$1|एक संपादन|$1 संपादने}}',
 'viewdeleted_short' => '{{PLURAL:$1|एक वगळलेले संपादन|$1 वगळलेली संपादने}}  पहा.',
 'protect' => 'सुरक्षित करा',
@@ -529,7 +541,7 @@ $messages = array(
 'articlepage' => 'लेख पृष्ठ',
 'talk' => 'चर्चा',
 'views' => 'दृष्ये',
-'toolbox' => 'साधनपेटी',
+'toolbox' => 'साधने',
 'userpage' => 'सदस्य पृष्ठ',
 'projectpage' => 'प्रकल्प पान पहा',
 'imagepage' => 'संचिका पृष्ठ पहा',
@@ -553,7 +565,7 @@ $1',
 'pool-queuefull' => 'सर्व्हरवर ताण आहे.',
 'pool-errorunknown' => 'अपरिचित त्रूटी',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}बद्दल',
 'aboutpage' => 'Project:माहितीपृष्ठ',
 'copyright' => 'येथील मजकूर $1च्या अंतर्गत उपलब्ध आहे जोपर्यंत इतर नोंदी केलेल्या नाहीत.',
@@ -563,7 +575,6 @@ $1',
 'disclaimers' => 'उत्तरदायित्वास नकार',
 'disclaimerpage' => 'Project: सर्वसाधारण उत्तरदायकत्वास नकार',
 'edithelp' => 'संपादन साहाय्य',
-'edithelppage' => 'Help:संपादन',
 'helppage' => 'Help:आशय',
 'mainpage' => 'मुखपृष्ठ',
 'mainpage-description' => 'मुखपृष्ठ',
@@ -643,16 +654,12 @@ $1',
 # General errors
 'error' => 'त्रुटी',
 'databaseerror' => 'माहितीसंग्रहातील त्रुटी',
-'dberrortext' => 'एक विदा पृच्छारचना त्रुटी घडली आहे.
-ही बाब संचेतनात (सॉफ्टवेअरमध्ये) क्षितिजन्तु असण्याची शक्यता निर्देशित करते.
-"<tt>$2</tt>" या कार्यातून निघालेली शेवटची विदापृच्छा पुढील प्रमाणे होती:
-<blockquote><tt>$1</tt></blockquote>
-मायएसक्युएलने "<tt>$3: $4</tt>" ही त्रुटी दिलेली आहे.',
-'dberrortextcl' => 'चुकीच्या प्रश्नलेखनामुळे माहितीसंग्रह त्रुटी.
-शेवटची माहितीसंग्रहाला पाठविलेला प्रश्न होता:
-"$1"
-"$2" या कार्यकृतीमधून .
-MySQL returned error "$3: $4".',
+'databaseerror-text' => 'विदागार पृच्छा त्रूटी घडलेली आहे.
+ते संचेतनात गणकदोष असण्याची शक्यता निर्देशित करते.',
+'databaseerror-textcl' => 'विदागार पृच्छा त्रूटी घडलेली आहे.',
+'databaseerror-query' => 'पृच्छा:$1',
+'databaseerror-function' => 'क्रिया: $1',
+'databaseerror-error' => 'त्रुटी: $1',
 'laggedslavemode' => "'''सुचना:''' पानावर अद्ययावत बदल नसतील.",
 'readonly' => 'विदागारास (डाटाबेस) ताळे आहे.',
 'enterlockreason' => 'विदागारास ताळे ठोकण्याचे कारण, ताळे उघडले जाण्याच्या अदमासे कालावधीसहीत द्या.',
@@ -685,6 +692,7 @@ MySQL returned error "$3: $4".',
 'cannotdelete-title' => '$1 ला वगळू शकत नाही',
 'delete-hook-aborted' => 'खोडण्याची  क्रिया मधेच थांबविण्यात येत आहे.
 कोणतेही कारण देण्यात आले नाही',
+'no-null-revision' => '"$1" या पानाची नविन रिक्त आवृत्ती निर्मिता आली नाही.',
 'badtitle' => 'खराब शीर्षक',
 'badtitletext' => 'आपण विनंती केलेले पानाचे शीर्षक अयोग्य, रिकामे अथवा चुकिने जोडलेले आंतर-भाषिय किंवा आंतर-विकि शीर्षक आहे. त्यात,शीर्षकास अयोग्य अशी एक किंवा अधिक चिन्हे आहेत.',
 'perfcached' => 'खालील माहिती सयीमधील (कॅशे) असल्यामुळे ती अद्ययावत् नाही.जास्तीतजास्त {{PLURAL:$1|एक प्रतिफळ |$1 प्रतिफळे }} सयीमध्ये असतात.',
@@ -704,12 +712,15 @@ MySQL returned error "$3: $4".',
 
 सर्व विकिंवर, अनुवाद जोडण्याकरता किंवा बदलण्याकरता अथवा शुद्धलेखन चिकित्सेकरीता , कृपया [//translatewiki.net/ translatewiki.net], या मिडियाविकि स्थानिकीकरण प्रकल्पावर जा.',
 'editinginterface' => "'''सावधान:''' तुम्ही संचेतनाचे (सॉफ्टवेअर) संपर्क माध्यम मजकूर असलेले पान संपादित करित आहात. या पानावरील बदल या विकिवरील इतर सदस्यांच्या सदस्य संपर्क माध्यमाचे स्वरूप बदलू शकते.सर्व विकिंवरील भाषांतरासाठी  कृपया मिडीयाविकि स्थानिकीकरण प्रकल्पाच्या [//translatewiki.net/ translatewiki.net]या सुविधेचा वापर करा.",
-'sqlhidden' => 'छूपी एस्क्यूएल पृच्छा (एसक्यूएल क्वेरी हिडन)',
 'cascadeprotected' => 'हे पान संपादनांपासून सुरक्षित केल्या गेले आहे, कारण ते खालील {{PLURAL:$1|पानात|पानांमध्ये}} अंतर्भूत केलेले आहे,{{PLURAL:$1|जे पान|जी पाने }} निपतन पर्याय सुरु केल्यामुळे सुरक्षित आहेत:
 $2',
 'namespaceprotected' => "'''$1''' नामविश्वातील पाने संपादण्याची आपणांस परवानगी नाही.",
 'customcssprotected' => 'या पानावर इतर सदस्याची वैयक्तिक मांडणी असल्यामुळे, तुम्हाला हे सीएसएस पान संपादित करण्याची परवानगी नाही.',
 'customjsprotected' => "या पानावर इतर सदस्याची वैयक्तिक मांडणी असल्यामुळे, तुम्हाला हे 'जावास्क्रिप्ट' पान संपादित करण्याची परवानगी नाही.",
+'mycustomcssprotected' => 'या सीएसएस (CSS) पानावरील मजकूर बदलण्याची आपणास परवानगी नाही.',
+'mycustomjsprotected' => 'या जावास्क्रिप्ट पानावर संपादन करण्याची आपणास परवानगी नाही.',
+'myprivateinfoprotected' => 'आपणास आपली वैयक्तिक माहिती बदलण्याची परवानगी नाही.',
+'mypreferencesprotected' => 'आपणास आपला पसंतीक्रम बदलण्याची परवानगी नाही.',
 'ns-specialprotected' => 'विशेष पाने संपादित करता येत नाहीत.',
 'titleprotected' => 'या शीर्षकाचे पान सदस्य [[User:$1|$1]]ने निर्मितीपासून सुरक्षित केलेले आहे.त्याने याचे ""$2"" हे कारण नमूद केलेले आहे.',
 'filereadonlyerror' => '"$1" ला सुधार अशक्य आहे कारण संचिकाभांडार  "$2" हे \'फक्त वाचा\'(रीड ओन्ली) या श्रेणीतच आहे.
@@ -734,10 +745,19 @@ $2',
 'welcomecreation-msg' => 'तुमचे खाते उघडण्यात आले आहे.
 आपला [[Special:Preferences|{{SITENAME}} पसंतीक्रम]] बदलण्यास विसरू नका.',
 'yourname' => 'सदस्यनाम:',
+'userlogin-yourname' => 'सदस्यनाम',
+'userlogin-yourname-ph' => 'आपले सदस्यनाव टाका',
+'createacct-another-username-ph' => 'सदस्यनाव टाका',
 'yourpassword' => 'तुमचा परवलीचा शब्द:',
+'userlogin-yourpassword' => 'परवलीचा शब्द(पासवर्ड)',
+'userlogin-yourpassword-ph' => 'आपला परवलीचा शब्द टाका',
+'createacct-yourpassword-ph' => 'परवलीचा शब्द टाका',
 'yourpasswordagain' => 'तुमचा परवलीचा शब्द पुन्हा टंका:',
+'createacct-yourpasswordagain' => 'परवलीच्या शब्दाची निश्चिती करा',
+'createacct-yourpasswordagain-ph' => 'पुन्हा परवलीचा शब्द टाका',
 'remembermypassword' => 'माझा सनोंदप्रवेश (लॉग-ईन) या न्याहाळकावर लक्षात ठेवा (जास्तीत जास्त $1 {{PLURAL:$1|दिवसासाठी|दिवसांसाठी}})',
-'securelogin-stick-https' => "सनोंद-प्रवेशानंतर 'एचटीटीपीएस'शी  जुळलेले रहा",
+'userlogin-remembermypassword' => 'मला नोंदीकृतच(लॉग्ड-ईन) ठेवा',
+'userlogin-signwithsecure' => 'सुरक्षित अनुबंध(सेक्युअर कनेक्शन) वापरा',
 'yourdomainname' => 'तुमचे क्षेत्र (डोमेन) :',
 'password-change-forbidden' => 'तुम्ही या विकिवर तुमचा परवलीचा शब्द बदलू शकत नाही.',
 'externaldberror' => 'विदागार ’खातरजमा’ (प्रमाणितीकरण) त्रुटी होती अथवा तुम्हाला तुमचे बाह्य खाते अद्ययावत  करण्याची परवानगी नाही.',
@@ -749,18 +769,43 @@ $2',
 'logout' => 'सनोंद-निर्गम',
 'userlogout' => 'सनोंद-निर्गम',
 'notloggedin' => 'आपण सनोंद-प्रवेशित नाहीत',
+'userlogin-noaccount' => 'आपले खाते नाही?',
+'userlogin-joinproject' => '{{SITENAME}}मध्ये सहभागी व्हा',
 'nologin' => 'आपले सदस्यखाते नाही काय? $1.',
 'nologinlink' => 'सदस्यखाते तयार करा',
 'createaccount' => 'नवीन खाते तयार करा',
 'gotaccount' => 'पूर्वीचे खाते आहे? $1.',
 'gotaccountlink' => 'सनोंद-प्रवेश करा',
 'userlogin-resetlink' => 'सनोंद-प्रवेश तपशील विसरला असाल तर येथे टिचकी मारा.',
+'userlogin-resetpassword-link' => 'परवलीचा शब्द पुन्हा जुळवा (रिसेट)',
+'helplogin-url' => 'Help:सनोंद प्रवेशासाठी(लॉगिंग-ईन)',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|सनोंद-प्रवेशासाठी(लॉग-ईन) सहाय्य]]',
+'userlogin-loggedin' => 'आपण पुर्वीच {{GENDER:$1|$1}} म्हणून सनोंद प्रवेशित आहात.वेगळ्या सदस्यनावाने सनोंद प्रवेशासाठी खालील आवेदन वापरा.',
+'userlogin-createanother' => 'दुसरे नवीन खाते तयार करा',
+'createacct-join' => 'खाली आपली माहिती भरा',
+'createacct-another-join' => 'नविन खात्याबाबतची माहिती येथे खाली टाका.',
+'createacct-emailrequired' => 'विपत्र पत्ता(ई-मेल)',
+'createacct-emailoptional' => 'विपत्र पत्ता(ई-मेल)(ऐच्छिक)',
+'createacct-email-ph' => 'आपला विपत्र पत्ता(ई-मेल) टाका',
+'createacct-another-email-ph' => 'आपला विपत्रपत्ता (ई-मेल) टाका',
 'createaccountmail' => 'तात्पुरता अनियत (रॅन्डम) परवलीचा शब्द तयार करून तो खाली नमूद विपत्रपत्त्यावर पाठवा',
+'createacct-realname' => 'खरे नाव (ऐच्छिक)',
 'createaccountreason' => 'कारण:',
+'createacct-reason' => 'कारण',
+'createacct-reason-ph' => 'आपण दुसरे खाते कां बनवीत आहात',
+'createacct-captcha' => 'सुरक्षा तपासणी',
+'createacct-imgcaptcha-ph' => 'वर दिसत असलेला मजकूर येथे टाका',
+'createacct-submit' => 'आपले खाते निर्माण करा',
+'createacct-another-submit' => 'दुसरे नवीन खाते तयार करा',
+'createacct-benefit-heading' => '{{SITENAME}} हे आपल्यासारख्याच लोकांनी बनविलेले आहे.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edit|संपादने}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|लेख}}',
+'createacct-benefit-body3' => 'अलीकडील {{PLURAL:$1|योगदानकर्ता|योगदानकर्ते}}',
 'badretype' => 'आपण टाकलेला परवलीचा शब्द जुळत नाही.',
 'userexists' => 'आपण टाकलेले सदस्यनाम पूर्वीच वापरात आहे.
 कृपया वेगळे सदस्यनाम निवडा.',
 'loginerror' => 'सनोंद-प्रवेशात चूक झाली आहे',
+'createacct-error' => 'खाते तयार करण्यात चुकी',
 'createaccounterror' => 'हे खाते तयार करता येऊ शकले नाही:$1',
 'nocookiesnew' => 'सदस्य खाते तयार झाले ,पण तुम्ही सनोंद-प्रवेशित(लॉग्डईन) नाहीत.{{SITENAME}} सदस्यांना सनोंद-प्रवेश देतांना त्यांचे स्मृतिशेष (कुकिज) वापरते.तुम्ही स्मृतिशेष सुविधा अनुपलब्ध ठेवली आहे.ती कृपया उपलब्ध करा,आणि नंतर तुमच्या नवीन सदस्य नावाने आणि परवलीने दाखल व्हा.',
 'nocookieslogin' => '{{SITENAME}} सदस्यांना सनोंद-प्रवेश देतांना, त्यांच्या स्मृतिशेष (cookies) वापरते.तुम्ही स्मृतिशेष सुविधा अनुपलब्ध ठेवली आहे.स्मृतीशेष सुविधा कृपया उपलब्ध करा आणि सनोंद-प्रवेशासाठी पुन्हा प्रयत्न करा.',
@@ -810,11 +855,13 @@ $2',
 
 जर ही खातेनोंदणी चुकिने झाली असेल तर, तुम्ही या संदेशाकडे दुर्लक्ष करू शकता.',
 'usernamehasherror' => 'सदस्यनामात "हॅश" वर्ण असू शकत नाहीत.',
-'login-throttled' => 'तुम्ही प्रवेश करण्यासाठी खूप प्रयत्न केले आहेत.
-कृपया पुन्हा प्रयत्न करण्याआधी थांबा',
+'login-throttled' => 'तुम्ही नुकतेच सनोंद- प्रवेशासाठी अनेकानेक प्रयत्न केले आहेत.
+कृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.',
 'login-abort-generic' => 'तुमचा प्रवेश अयशस्वी होऊन रद्द झाला.',
 'loginlanguagelabel' => 'भाषा: $1',
 'suspicious-userlogout' => 'तुमच्या सनोंद-निर्गमनास नकार दिल्या गेला कारण असे दिसते की ती विनंती अन-अनुबंधित(डिसकनेक्टेड) न्याहाळकाद्वारे पाठवल्या गेली.',
+'createacct-another-realname-tip' => 'आपले खरे नाव टाकणे वैकल्पिक आहे.
+जर आपण ते द्यायचे ठरविले तर,ते आपल्या कामाचा मूळ स्रोत म्णून देण्यास वापरले जाईल.',
 
 # Email sending
 'php-mail-error-unknown' => 'पीएचपीच्या विपत्र() पर्यायात अज्ञात चूक',
@@ -830,7 +877,7 @@ $2',
 'newpassword' => 'नवीन परवलीचा शब्द:',
 'retypenew' => 'पुन्हा एकदा परवलीचा शब्द टंका:',
 'resetpass_submit' => 'परवलीचा शब्द टाका आणि सनोंद-प्रवेश करा',
-'resetpass_success' => 'तुमचा परवलीचा शब्द बदललेला आहे! आता तुमचा प्रवेश करित आहोत...',
+'changepassword-success' => 'तुमचा परवलीचा शब्द यशस्वीरित्या बदललेला आहे!',
 'resetpass_forbidden' => 'परवलीचे शब्द बदलता येत नाहीत.',
 'resetpass-no-info' => 'या पानामध्ये थेट जाण्यासाठी तुम्हास  सनोंद-प्रवेशित असावयास हवे.',
 'resetpass-submit-loggedin' => 'परवलीचा शब्द बदला',
@@ -842,10 +889,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'परवलीचा शब्द पूर्ववत करा',
-'passwordreset-text' => 'आपला परवलीचा शब्द पुनर्स्थापित करण्यासाठी हे आवेदन भरा.',
+'passwordreset-text-one' => 'आपला परवलीचा शब्द बदलण्यास हे आवेदन भरा.',
+'passwordreset-text-many' => '{{PLURAL:$1|आपला परवलीचा शब्द पुनर्स्थापित करण्यास कोणताही एक तुकडा वापरा.}}',
 'passwordreset-legend' => 'परवलीचा शब्द पूर्ववत करा',
 'passwordreset-disabled' => 'या विकिवर परवलीचा शब्द पुनर्स्थापित करता येत नाही.',
-'passwordreset-pretext' => '{{PLURAL:$1||खालील माहितीच्या भागांपैकी एक भाग लिहा}}',
+'passwordreset-emaildisabled' => "या विकिवर विपत्र पाठविणे 'अशक्य' करण्यात आलेले आहे.",
 'passwordreset-username' => 'सदस्यनाव:',
 'passwordreset-domain' => 'डोमेन',
 'passwordreset-capture' => 'ईमेल कशी असेल ते बघायचेय ?',
@@ -866,7 +914,7 @@ $2',
 अस्थायी परवलीचा शब्द: $2',
 'passwordreset-emailsent' => "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात आले आहे.",
 'passwordreset-emailsent-capture' => "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात आले आहे जे खाली दर्शविण्यात आले आहे.",
-'passwordreset-emailerror-capture' => 'आठवणीकरता खाली दाखवल्यानुसार ईमेल तयार केला होता, पण प्रयोगकरता $1 ला पाठवता आला नाही',
+'passwordreset-emailerror-capture' => "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र निर्माण करण्यात आले, जे खाली दर्शविण्यात आले आहे.परंतु,{{GENDER:$2|सदस्य}}ला पाठविणे असफल झाले: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'ई-मेल पत्ता बदला',
@@ -880,6 +928,18 @@ $2',
 'changeemail-submit' => 'ईमेल बदला',
 'changeemail-cancel' => 'रद्द करा',
 
+# Special:ResetTokens
+'resettokens' => 'ओळखचिन्ह(टोकन) पुनर्स्थापित करा',
+'resettokens-text' => 'येथे आपल्या खात्यात असलेला व्यक्तिगत मजकूरापर्यंत पोचण्यासाठी आपण ओळखचिन्ह(टोकन) पुनर्स्थापित करू शकता.
+आपण जर तो अपघाताने कोणासमवेत सहभागीला असेल किंवा आपले खात्याची आपण तडजोड केली असल्यास, हे करावयास हवे.',
+'resettokens-no-tokens' => 'पुनर्स्थापित करण्यासाठी कोणतीही ओळखचिन्हे नाहीत.',
+'resettokens-legend' => 'ओळखचिन्ह(टोकन) पुनर्स्थापित करा',
+'resettokens-tokens' => 'ओळखचिन्हे:',
+'resettokens-token-label' => '$1 (सद्य मुल्य: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|आपल्या निरीक्षणसूचीतील पानांमधील बदलाचा]] वेब रसद बिल्ला (ॲटम/आरएसएस)',
+'resettokens-done' => 'ओळखचिन्हे पुनर्स्थापन.',
+'resettokens-resetbutton' => 'निवडलेली ओळखचिन्हे पुनर्स्थापित करा',
+
 # Edit page toolbar
 'bold_sample' => 'ठळक मजकूर',
 'bold_tip' => 'ठळक मजकूर',
@@ -1057,12 +1117,15 @@ $2',
 'edit-gone-missing' => 'नविन पृष्ठ अद्यतन करता आले नाही. ते वगळले असण्याची शक्यता आहे.',
 'edit-conflict' => 'वादग्रस्त संपादन',
 'edit-no-change' => 'तुमचे संपादन दुर्लक्षित करण्यात आले आहे, कारण मजकूरात काहीही बदल झालेला नाही.',
+'postedit-confirmation' => 'आपले संपादन जतन करण्यात आले आहे.',
 'edit-already-exists' => 'नवीन पान तयार करता येऊ शकले नाही.
 या नावाचे पान पूर्वीच अस्तित्वात आहे.',
 'defaultmessagetext' => 'अविचल संदेश मजकूर',
 'content-failed-to-parse' => '$2 चा आशय(कंटेंट) $1 साठी पार्स करण्यात असफलता - नमुना: $3',
 'invalid-content-data' => 'अवैध माहिती',
 'content-not-allowed-here' => '"$1" हा आशय [[$2]] लेखावर टाकण्याची अनुमती नाही.',
+'editwarning-warning' => "या पानावरुन दुसर्‍या पानावर गेल्यास, तुम्ही येथे केलेले बदल जतन होणार नाहीत.
+जर आपण सनोंद-प्रवेशित असाल तर, ही सूचना घालवण्यासाठी ''माझ्या पसंती'' मधील संपादनपसंतीत बदल करा.",
 
 # Content models
 'content-model-wikitext' => 'विकिमजकूर',
@@ -1097,6 +1160,7 @@ $2',
 'undo-failure' => 'विसंवादी आंतरवर्ती संपादने झाल्यामुळे आपण हे संपादन परतवू शकत नाही.',
 'undo-norev' => 'हे संपादन परतविता आलेले नाही कारण ते अगोदरच उलटविलेले किंवा वगळलेले आहे.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|चर्चा]])यांची आवृत्ती $1 परतवली.',
+'undo-summary-username-hidden' => 'अज्ञात सदस्याची $1 आवृत्ती परतवा',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'खाते उघडू शकत नाही',
@@ -1276,6 +1340,7 @@ $1",
 'compareselectedversions' => 'निवडलेल्या आवृत्त्यांची तुलना करा',
 'showhideselectedversions' => 'निवडलेल्या आवृत्त्या दाखवा / लपवा',
 'editundo' => 'उलटवा',
+'diff-empty' => '(काही फरक नाही)',
 'diff-multi' => '{{PLURAL:$2|सदस्याची|$2 सदस्यांच्या}} ({{PLURAL:$1|आंतरवर्ती आवृत्ती|$1  आंतरवर्ती आवृत्त्या}} दाखवल्या नाहीत)',
 'diff-multi-manyusers' => '{{PLURAL:$2|सदस्याची|$2 सदस्यांच्या}} ({{PLURAL:$1|आवृत्ती|$1 आवृत्त्या}} दाखवल्या नाहीत)',
 'difference-missing-revision' => 'या लेखाचे/ची  ($1) हे {{PLURAL:$2|संस्करण|$2 संस्करणे}} {{PLURAL:$2|सापडले नाही|सापडली नाहीत}}.वगळल्या गेलेल्या लेखपानाच्या जुन्या इतिहास-दुव्याचे अनुसरण केल्यामुळे, शक्यतोवर,असे घडु शकते.याबाबत अधिक तपशील  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी] येथे बघता येईल.',
@@ -1300,7 +1365,6 @@ $1",
 'searchmenu-legend' => 'विकल्प शोधा',
 'searchmenu-exists' => "'''या विकिवर \"[[:\$1]]\" या नावाचे पान आहे.'''",
 'searchmenu-new' => "'''या विकिवर \"[[:\$1]]\" हे पान तयार करा!'''",
-'searchhelp-url' => 'Help:साहाय्य पृष्ठ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|या उपसर्गानिशी असलेली पाने न्याहाळा]]',
 'searchprofile-articles' => 'आशय-पाने',
 'searchprofile-project' => 'साहाय्य व प्रकल्प पाने',
@@ -1341,15 +1405,7 @@ $1",
 'powersearch-togglenone' => 'काहीही नाही',
 'search-external' => 'बाह्य शोध',
 'searchdisabled' => '{{SITENAME}} शोध अनुपलब्ध केला आहे.तो पर्यंत गूगलवरून शोध घ्या.{{SITENAME}}च्या मजकुराची त्यांची सूचिबद्धता शिळी असण्याची शक्यता असू शकते हे लक्षात घ्या.',
-
-# Quickbar
-'qbsettings' => 'शीघ्रपट',
-'qbsettings-none' => 'नाही',
-'qbsettings-fixedleft' => 'स्थिर डावे',
-'qbsettings-fixedright' => 'स्थिर ऊजवे',
-'qbsettings-floatingleft' => 'तरंगते डावे',
-'qbsettings-floatingright' => 'तरंगते ऊजवे',
-'qbsettings-directionality' => 'तुमच्या भाशा ची पद्धत दिशात्मक असली पाहिजे.',
+'search-error' => 'शोध घेतांना घडलेली त्रूटी:$1',
 
 # Preferences page
 'preferences' => 'माझ्या पसंती',
@@ -1383,7 +1439,6 @@ $1",
 'resetprefs' => 'न जतन केलेले बदल रद्द करा',
 'restoreprefs' => 'सर्व डिफॉल्ट मांडणी पूर्ववत करा (सर्व विभागात)',
 'prefs-editing' => 'संपादन',
-'prefs-edit-boxsize' => 'संपादन खिडकीचा आकार',
 'rows' => 'ओळी:',
 'columns' => 'स्तंभ:',
 'searchresultshead' => 'शोध',
@@ -1394,9 +1449,7 @@ $1",
 'recentchangesdays-max' => 'जास्तीतजास्त $1 {{PLURAL:$1|दिवस|दिवस}}',
 'recentchangescount' => 'अलीकडील बदल, इतिहास व नोंद पानांमध्ये दाखवायाच्या संपादनांची संख्या:',
 'prefs-help-recentchangescount' => 'यात नुकतेच झालेले बदल, पानांचे इतिहास व याद्या या गोष्टी असतात.',
-'prefs-help-watchlist-token' => 'या क्षेत्रत गुपित किल्ली प्रदान केल्यस तुमच्या निरीक्षणयादीसाठी एक आरएसएस फीड उत्पन्न होईल.
-कोणीही ज्याला या क्षेत्रातील किल्ली माहीत असेल तुमची निरीक्षणयादी वाचू शकतो, त्यमुळे कोणतीही सुरक्षित किल्ली निवडा.
-येथे एक यंत्रजनित किल्ली दिलेली आहे गरज असल्यस तुम्ही ती वपरु शकता: $1',
+'prefs-help-watchlist-token2' => "ही आपल्या निरिक्षणसूचीच्या 'वेब फिड'ची गुप्त चाबी आहे.ज्या कोणास त्याची माहिती होईल तो आपली निरिक्षणसूची बघू शकेल,म्हणुन कोणास यात सहभागी करून घेउ नका.[[Special:ResetTokens|पुनर्स्थापनाची आपणास गरज असल्यास येथे टिचकी द्या]].",
 'savedprefs' => 'तुमच्या पसंती जतन केल्या आहेत.',
 'timezonelegend' => 'वेळक्षेत्र',
 'localtime' => 'स्थानिक वेळ:',
@@ -1426,7 +1479,6 @@ $1",
 'prefs-common-css-js' => 'मिळून वापरलेले सर्व त्वचांसाठींचे सीएसएस / जावास्क्रिप्ट:',
 'prefs-reset-intro' => 'आपन द्दीलेले सर्व प्रीफ्र्न्सेस् वपर्न्यासथि तुम्ही हे पेज् वापरू शकता.',
 'prefs-emailconfirm-label' => 'विपत्र निश्चितीकरण:',
-'prefs-textboxsize' => 'संपादन खिडकीचा आकार',
 'youremail' => 'विपत्र:',
 'username' => '{{GENDER:$1|सदस्यनाम}}:',
 'uid' => '{{GENDER:$1|सदस्य}}खाते:',
@@ -1457,6 +1509,8 @@ $1",
 'prefs-dateformat' => 'तारीख रचना',
 'prefs-timeoffset' => 'वेळ बरोबरी',
 'prefs-advancedediting' => 'सर्वसामान्य पर्याय',
+'prefs-editor' => 'संपादक',
+'prefs-preview' => 'झलक',
 'prefs-advancedrc' => 'प्रगत पर्याय',
 'prefs-advancedrendering' => 'प्रगत पर्याय',
 'prefs-advancedsearchoptions' => 'प्रगत पर्याय',
@@ -1464,7 +1518,9 @@ $1",
 'prefs-displayrc' => 'दर्शन पर्याय',
 'prefs-displaysearchoptions' => 'दर्शन पर्याय',
 'prefs-displaywatchlist' => 'दर्शन पर्याय',
+'prefs-tokenwatchlist' => 'ओळखचिन्ह',
 'prefs-diffs' => 'फरक',
+'prefs-help-prefershttps' => 'हा पसंतीक्रम आपल्या पुढील सनोंद प्रवेशानंतर कार्यान्वित होईल.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'विपत्रपत्ता वैध दिसत आहे',
@@ -1491,6 +1547,8 @@ $1",
 'userrights-notallowed' => 'तुमच्या सदस्य खात्यास, सदस्य अधिकारांची निश्चिती करण्याची परवानगी नाही.',
 'userrights-changeable-col' => 'गट जे तुम्ही बदलू शकता',
 'userrights-unchangeable-col' => 'गट जे तुम्ही बदलू शकत नाही',
+'userrights-conflict' => 'बदलाबाबत सदस्य-हक्क विसंवाद !कृपया आपले बदल पुन्हा पुनरावलोकित व नक्की करा.',
+'userrights-removed-self' => 'आपण आपले हक्क यशस्वीरित्या काढलेत.म्हणुन, या पानात आपण दाखल होऊ शकणार नाही.',
 
 # Groups
 'group' => 'गट:',
@@ -1556,11 +1614,19 @@ $1",
 'right-proxyunbannable' => 'प्रॉक्सी असताना ब्लॉक्स कडे दुर्लक्ष करा',
 'right-unblockself' => 'कोण्या-एकास अप्रतिबंधित करा',
 'right-protect' => 'सुरक्षा पातळी बदलवा व निपात-प्रतिबंधित पानांचे संपादन करा',
-'right-editprotected' => 'सुरक्षित पाने संपादा',
+'right-editprotected' => ' "{{int:protect-level-sysop}}"म्हणून नमुद केलेली सुरक्षित पाने संपादा',
+'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}" म्हणून नमुद केलेली सुरक्षित पाने संपादा',
 'right-editinterface' => 'सदस्य पसंती बदला',
 'right-editusercssjs' => 'इतर सदस्यांच्या CSS व JS संचिका संपादित करा',
 'right-editusercss' => 'इतर सदस्यांच्या CSS संचिका संपादित करा',
 'right-edituserjs' => 'इतर सदस्यांच्या JS संचिका संपादित करा',
+'right-editmyusercss' => "स्वत:च्या सदस्यनामाच्या 'सीएसएस' संचिका संपादा",
+'right-editmyuserjs' => "स्वत:च्या सदस्यनामाच्या 'जावास्क्रिप्ट' संचिका संपादा",
+'right-viewmywatchlist' => 'स्वत:ची निरीक्षणसूची बघा',
+'right-editmywatchlist' => 'स्वत:ची निरीक्षणसूची संपादा.नोंद घ्या कि काही क्रिया या अधिकाराशिवायच पाने जोडतील.',
+'right-viewmyprivateinfo' => 'आपली स्वत:ची वैयक्तिक माहिती बघा (उदा.विपत्रपत्ता, खरे नाव)',
+'right-editmyprivateinfo' => 'आपली स्वत:ची वैयक्तिक माहिती संपादा (उदा.विपत्रपत्ता, खरे नाव)',
+'right-editmyoptions' => "आपल्या स्वत:चा 'पसंतीक्रम' संपादा",
 'right-rollback' => 'या आधीच्या सदस्याचे नुकतेच संपादन केलेले एखादे विशिष्ट पानाचे बदल लवकर आधीच्य स्थितीत न्या',
 'right-markbotedits' => 'निवडलेली संपादने सांगकाम्यांची म्हणून जतन करा',
 'right-noratelimit' => 'रेट लिमिट्स चा परिणाम होत नाही.',
@@ -1612,8 +1678,8 @@ $1",
 'action-block' => 'या सदस्यास संपादन करण्यापासून प्रतिबंधित करा',
 'action-protect' => 'या पानाचा सुरक्षास्तर बदला',
 'action-rollback' => 'या आधीच्या सदस्याने नुकतेच संपादन केलेले एखादे विशिष्ट पानाचे बदल लवकर पूर्वस्थितीत न्या',
-'action-import' => 'दुसऱ्या विकीवरुन हे पान आयात करा',
-'action-importupload' => 'अपभारीत संचिकेतून पान आयात करा',
+'action-import' => 'दुसऱ्या विकीवरुन पाने आयात करा',
+'action-importupload' => 'अपभारीत संचिकेतून पाने आयात करा',
 'action-patrol' => "इतरांची संपादनांवर 'पहारा दिला' म्हणून खूण करा",
 'action-autopatrol' => 'आपल्या संपादनांवर पहारा दिल्याची खूण करा',
 'action-unwatchedpages' => 'पहारा न दिलेल्या पानांची यादी पहा',
@@ -1622,12 +1688,19 @@ $1",
 'action-userrights-interwiki' => 'इतर विकिंवरच्या सदस्यांचे अधिकार संपादित करा',
 'action-siteadmin' => 'माहितीसाठ्याला कुलूप लावा अथवा काढा',
 'action-sendemail' => 'विपत्रे (ई-मेल्स) पाठवा.',
+'action-editmywatchlist' => "'माझी निरीक्षणसूची' संपादा",
+'action-viewmywatchlist' => "'माझी निरीक्षणसूची' बघा",
+'action-viewmyprivateinfo' => 'आपली वैयक्तिक माहिती बघा',
+'action-editmyprivateinfo' => 'आपली वैयक्तिक माहिती संपादा',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|बदल}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|मागील भेटीनंतर}}',
+'enhancedrc-history' => 'इतिहास',
 'recentchanges' => 'अलीकडील बदल',
 'recentchanges-legend' => 'अलीकडील बदलाएवजी पर्याय',
 'recentchanges-summary' => 'या विकिवर झालेल्या सर्वात अलीकडील बदलांचा या पानावर मागोवा घ्या.',
+'recentchanges-noresult' => 'नमुद कालावधीतील कोणतेही बदला या निकषांशी जुळत नाहीत.',
 'recentchanges-feed-description' => 'या रसदीत,या विकिवर झालेल्या सर्वात अलीकडील बदलांचा मागोवा घ्या.',
 'recentchanges-label-newpage' => 'या संपादनाने नवीन पान तयार झाले',
 'recentchanges-label-minor' => 'हे एक किरकोळ संपादन आहे',
@@ -1664,7 +1737,6 @@ $1",
 'recentchangeslinked-feed' => 'या पृष्ठासंबंधीचे बदल',
 'recentchangeslinked-toolbox' => 'या पृष्ठासंबंधीचे बदल',
 'recentchangeslinked-title' => '"$1" च्या संदर्भातील बदल',
-'recentchangeslinked-noresult' => 'जोडलेल्या पानांमध्ये दिलेल्या कालावधीत काहीही बदल झालेले नाहीत.',
 'recentchangeslinked-summary' => "हे पृष्ठ एखाद्या विशिष्ट पानाशी (किंवा एखाद्या विशिष्ट वर्गात असणाऱ्या पानांशी) जोडलेल्या पानांवरील बदल दर्शवते.
 तुमच्या [[Special:Watchlist|नित्य पहाण्याच्या सूचीमधील]] ही पाने '''ठळक''' दिसतील.",
 'recentchangeslinked-page' => 'पृष्ठ नाव:',
@@ -1676,7 +1748,7 @@ $1",
 'reuploaddesc' => 'अपभारण रद्द करुन ,अपभारणाच्या अर्जाकडे परत जा',
 'upload-tryagain' => 'बदललेले संचिका वर्णन पाठवा',
 'uploadnologin' => 'सनोंद-प्रवेशित नाही',
-'uploadnologintext' => 'संचिका चढविण्यासाठी तुम्हाला [[Special:UserLogin|प्रवेश]] करावा लागेल.',
+'uploadnologintext' => 'संचिका चढविण्यासाठी तुम्हाला $1 करावा लागेल.',
 'upload_directory_missing' => 'अपलोड डिरेक्टरी ($1) सापडली नाही तसेच वेबसर्व्हर ती तयार करू शकलेला नाही.',
 'upload_directory_read_only' => '$1 या डिरेक्टरी मध्ये सर्व्हर लिहू शकत नाही.',
 'uploaderror' => 'अपभारणात चूक',
@@ -1880,7 +1952,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'http-read-error' => 'एचटीटीपी वाचन त्रुटी.',
 'http-timed-out' => 'विनंती वेळ सपला आहे',
 'http-curl-error' => 'आंतरजालपत्ता पकडताना चूक: $1',
-'http-host-unreachable' => 'आंतरजाल पत्त्यापाशी पोहोचले नाही',
 'http-bad-status' => 'एचटीटीपी मागणीदरम्यान एक चूक उद्भवली: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1908,6 +1979,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'listfiles_size' => 'आकार (बाईट्स)',
 'listfiles_description' => 'वर्णन',
 'listfiles_count' => 'आवृत्त्या',
+'listfiles-show-all' => 'या चित्राच्या जून्या आवृत्त्या अंतर्भूत करा.',
+'listfiles-latestversion' => 'सध्याची आवृत्ती',
+'listfiles-latestversion-yes' => 'हो',
+'listfiles-latestversion-no' => 'नाही',
 
 # File description page
 'file-anchor-link' => 'संचिका',
@@ -2001,6 +2076,13 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'randompage' => 'अविशिष्ट लेख',
 'randompage-nopages' => 'पुढील {{PLURAL:$2|नामविश्वात|नामविश्वांत}} कोणतीही पाने नाहीत: $1.',
 
+# Random page in category
+'randomincategory' => 'वर्गातील अनियत पान',
+'randomincategory-invalidcategory' => '"$1" हे अधिकृत वर्गाचे नाव नाही.',
+'randomincategory-nopages' => '[[:Category:$1]] यात काहीच पाने नाहीत.',
+'randomincategory-selectcategory' => 'वर्ग: $1 $2 मधून अनियत पान उपलब्ध करा.',
+'randomincategory-selectcategory-submit' => 'जा',
+
 # Random redirect
 'randomredirect' => 'अविशिष्ट पुनर्निर्देशन',
 'randomredirect-nopages' => '$1 या नामविश्वात कोणतीही पुर्ननिर्देशने नाहीत.',
@@ -2026,16 +2108,13 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'statistics-users-active-desc' => '{{PLURAL:$1|शेवटच्या दिवसात|शेवटच्या $1 दिवसांत}} एकतरी संपादन केलेले सदस्य',
 'statistics-mostpopular' => 'सर्वाधिक बघितली जाणारी पाने',
 
-'disambiguations' => 'नि:संदिग्धकरण पृष्ठे',
-'disambiguationspage' => 'Template:नि:संदिग्धीकरण',
-'disambiguations-text' => "निम्नलिखीत पानांस, त्यांना '''नि:संदिग्धिकरण पृष्ठास''' जोडणारा किमान एक दुवा आहे.
-ऐवजी, ती सुयोग्य विषयाशी जोडली जावयास हवीत.<br /> जर एखादे पान [[MediaWiki:Disambiguationspage]]पासून जोडलेला साचा वापरत असेल तर त्या पानास, '''नि:संदिग्धिकरण पृष्ठ''' असे गृहीत धरले जाते.",
-
 'pageswithprop' => "'पृष्ठ गुणधर्म' असणारी पाने",
 'pageswithprop-legend' => 'पृष्ठ गुणधर्म असणारी पाने',
 'pageswithprop-text' => "या पानावर अश्या पानांची यादी आहे जे एक विशिष्ट 'पृष्ठ गुणधर्म'  वापरतात.",
 'pageswithprop-prop' => 'गुणधर्माचे नाव:',
 'pageswithprop-submit' => 'चला',
+'pageswithprop-prophidden-long' => 'मोठ्या मजकूराच्या गुणधर्माची किंमत लपविलेली आहे ($1)',
+'pageswithprop-prophidden-binary' => 'बायनरी गुणधर्माची किंमत लपविलेली आहे ($1)',
 
 'doubleredirects' => 'दुहेरी-पुनर्निर्देशने',
 'doubleredirectstext' => 'हे पान अशा पानांची सूची पुरवते की जी पुर्ननिर्देशीत पाने दुसऱ्या पुर्ननिर्देशीत पानाकडे निर्देशित झाली आहेत.प्रत्येक ओळीत पहिल्या आणि दुसऱ्या पुर्ननिर्देशनास दुवा दिला आहे सोबतच दुसरे पुर्ननिर्देशन ज्या पानाकडे पोहचते ते पण दिले आहे, जे की बरोबर असण्याची शक्यता आहे ,ते वस्तुतः पहिल्या पानापासूनचेही पुर्ननिर्देशन असावयास हवे.',
@@ -2092,6 +2171,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'mostrevisions' => 'सर्वाधिक बदललेले लेख',
 'prefixindex' => 'उपसर्ग असणाऱ्या लेखांची यादी',
 'prefixindex-namespace' => '($1 नामविश्व) हा  उपसर्ग असणारी सर्व पाने',
+'prefixindex-strip' => 'यादीतील उपसर्ग काढा',
 'shortpages' => 'छोटी पाने',
 'longpages' => 'मोठी पाने',
 'deadendpages' => 'टोकाची पाने',
@@ -2107,6 +2187,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'listusers' => 'सदस्यांची यादी',
 'listusers-editsonly' => 'फक्त संपादनांसहित सदस्य दाखवा',
 'listusers-creationsort' => 'निर्मितीच्या तारखेप्रमाणे लावा',
+'listusers-desc' => 'उतरत्या क्रमाने निवडा',
 'usereditcount' => '$1 {{PLURAL:$1|संपादन|संपादने}}',
 'usercreated' => 'दि. $1 ला, $2 वाजता, सदस्य खाते{{GENDER:$3|द्वारे बनविल्या गेले}}',
 'newpages' => 'नवीन पाने',
@@ -2281,10 +2362,9 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'unwatchthispage' => 'पहारा काढून टाका',
 'notanarticle' => 'मजकुर विरहित पान',
 'notvisiblerev' => 'आवृत्ती वगळण्यात आलेली आहे',
-'watchnochange' => 'प्रदर्शित कालावधीत, तुम्ही नित्य पहाण्यासाठी ठेवलेली कोणतीही बाब संपादित झाली नाही.',
 'watchlist-details' => 'पहाऱ्याच्या सूचीमधील {{PLURAL:$1|$1 पान|$1 पाने}}, यात चर्चा पाने मोजलेली नाहीत.',
-'wlheader-enotif' => '* विपत्र सूचना सुविधा उपलब्ध केली.',
-'wlheader-showupdated' => "* तुम्ही पानांस दिलेल्या शेवटच्या भेटी पासून बदललेली पाने '''ठळक''' दाखवली आहेत.",
+'wlheader-enotif' => 'विपत्र अधिसूचना सुविधा शक्य केली.',
+'wlheader-showupdated' => "ती पाने, जी आपण दिलेल्या शेवटच्या भेटीनंतर बदललेली आहेत, '''ठळक''' दाखवली आहेत.",
 'watchmethod-recent' => 'पहाऱ्यातील पानांकरिता अलीकडील बदलांचा तपास',
 'watchmethod-list' => 'अलीकडील बदलांकरिता पहाऱ्यातील पानांचा तपास',
 'watchlistcontains' => 'तुमचा $1 {{PLURAL:$1|पानावर|पानांवर}} पहारा आहे.',
@@ -2366,9 +2446,11 @@ $UNWATCHURL
 'deleteotherreason' => 'दुसरे/अतिरिक्त कारण:',
 'deletereasonotherlist' => 'दुसरे कारण',
 'deletereason-dropdown' => '* वगळण्याची सामान्य कारणे
-** लेखकाची(लेखिकेची) विनंती
+** स्पॅम
+** उत्पात
 ** प्रताधिकार उल्लंघन
-** उत्पात',
+** लेखकाची(लेखिकेची) विनंती
+** तुटकी पुनर्निर्देशने',
 'delete-edit-reasonlist' => 'वगळण्याची कारणे संपादित करा',
 'delete-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 {{PLURAL:$1|पेक्षा|पेक्षा}}पेक्षा जास्त वेळा बदलण्यात आलेले आहे. अशी पाने वगळणे हे {{SITENAME}} ला धोकादायक ठरू नये म्हणून शक्य केलेले नाही.',
 'delete-warning-toobig' => 'या पानाला खूप मोठी इतिहास यादी आहे, तसेच हे पान $1 {{PLURAL:$1|पेक्षा|पेक्षा}} पेक्षा जास्त वेळा बदलण्यात आलेले आहे.
@@ -2388,7 +2470,7 @@ $UNWATCHURL
 शेवटचे संपादन [[User:$3|$3]] ([[User talk:$3|Talk]] [[Special:Contributions/$3|{{int:contribslink}}]])-चे होते.',
 'editcomment' => "संपादन सारांश \"''\$1''\" होता.",
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|चर्चा]]) यांनी केलेले बदल [[User:$1|$1]] यांच्या आवृत्तीकडे पूर्वपदास नेले.',
-'revertpage-nouser' => '(सदस्यनाम लपवले) यांनी केलेले बदल उलटवून [[User:$1|$1]] यांच्या आवृत्तीप्रमाणे पूर्ववत केले.',
+'revertpage-nouser' => 'लपविलेल्या सदस्याची संपादने उलटवून {{GENDER:$1|[[सदस्य:$1|$1]]}} यांच्या आवृत्तीप्रमाणे पूर्ववत केले.',
 'rollback-success' => '$1 ने उलटवलेली संपादने;$2 च्या आवृत्तीस परत नेली.',
 
 # Edit tokens
@@ -2520,7 +2602,7 @@ $1',
 'contributions' => '{{GENDER:$1|सदस्य}} योगदान',
 'contributions-title' => '$1 साठी सदस्य-योगदान',
 'mycontris' => 'योगदान',
-'contribsub2' => '$1 ($2) साठी',
+'contribsub2' => '{{GENDER:$3|$1}} ($2) साठी',
 'nocontribs' => 'या मानदंडाशी जुळणारे बदल सापडले नाहीत.',
 'uctop' => '(सद्य)',
 'month' => 'या महिन्यापासून (आणि पूर्वीचे):',
@@ -2676,13 +2758,11 @@ $1',
 'ipb_blocked_as_range' => 'त्रूटी:अंकपत्ता IP $1 हा प्रत्यक्षपणे प्रतिबंधित केलेला नाही आणि अप्रतिबंधीत करता येत नाही.तो,अर्थात,$2पल्ल्याचा भाग म्हाणून तो प्रतिबंधित केलेला आहे,जो की अप्रतिबंधीत करता येत नाही.',
 'ip_range_invalid' => 'अंकपत्ता अयोग्य टप्प्यात.',
 'ip_range_toolarge' => '/$1 पेक्षा मोठ्या Range प्रतिबंधनाची परवानगी नाह् are not allowed.',
-'blockme' => 'मला प्रतिबंधित करा',
 'proxyblocker' => 'प्रातिनिधी(प्रॉक्झी)प्रतिबंधक',
-'proxyblocker-disabled' => 'हे कार्य अवरूद्ध केले आहे.',
 'proxyblockreason' => 'तुमचा अंकपत्ता प्रतिबंधित केला आहे कारण तो उघड-उघड प्रतिनिधी आहे.कृपया तुमच्या आंतरजाल सेवा दात्यास किंवा तंत्रज्ञास पाचारण संपर्क करा आणि त्यांचे या गंभीर सुरक्षाप्रश्ना कडे लक्ष वेधा.',
-'proxyblocksuccess' => 'झाले.',
 'sorbsreason' => '{{SITENAME}}ने वापरलेल्या DNSBL मध्ये तुमच्या अंकपत्त्याची नोंद उघड-उघड प्रतिनिधी म्हणून सूचित केली आहे.',
 'sorbs_create_account_reason' => '{{SITENAME}}च्या DNSBLने तुमचा अंकपत्ता उघड-उघड प्रतिनिधी म्हणून सूचित केला आहे.तुम्ही खाते उघडू शकत नाही',
+'xffblockreason' => '(X-Forwarded-For header) मधील अंकपत्ता,आपला किंवा आपण वापरत असलेल्या सर्व्हरचा,प्रतिबंधित केल्या गेला आहे.प्रतिबंधित करण्याचे मुळ कारण होते:$1',
 'cant-block-while-blocked' => 'तुम्ही स्वतः प्रतिबंधित असताना इतरांना प्रतिबंधित करू शकत नाही.',
 'cant-see-hidden-user' => 'तुम्ही प्रतिब्ंधकरण्याचा प्रयत्न करत असलेले सदस्य खाते आधीपासूनच प्रतिबंधित आणि लपविले गेले आहे.
 तुमच्याकडे सदस्य लपविण्याचे अधिकार नसल्यामुळे , तुम्ही सदस्य प्रतिबंधन  पाहू अथवा संपादित करू शकत नाही',
@@ -2846,6 +2926,7 @@ $1',
 'thumbnail-more' => 'मोठे करा',
 'filemissing' => 'संचिका अस्तित्वात नाही',
 'thumbnail_error' => 'नखुले निर्माणात त्रूटी: $1',
+'thumbnail_error_remote' => '$1 कडून त्रुटी-संदेश:$2',
 'djvu_page_error' => 'टप्प्याच्या बाहेरचे DjVu पान',
 'djvu_no_xml' => 'DjVu संचिकेकरिता XML ओढण्यात असमर्थ',
 'thumbnail-temp-create' => 'तात्पुरती इवलीशी संचिका बनविता आली नाही',
@@ -3066,13 +3147,8 @@ $1',
 'pageinfo-category-files' => 'संचिकांची संख्या',
 
 # Skin names
-'skinname-standard' => 'अभिजात',
-'skinname-nostalgia' => 'रम्य',
 'skinname-cologneblue' => 'सुरेखनीळी',
 'skinname-monobook' => 'मोनोबुक',
-'skinname-myskin' => 'माझीकांती',
-'skinname-chick' => 'मस्त',
-'skinname-simple' => 'साधी',
 'skinname-modern' => 'आधुनिक',
 'skinname-vector' => 'सदिश',
 
@@ -3154,11 +3230,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 मिनिट|$1 मिनिट}}',
 'hours' => '{{PLURAL:$1|$1 तास|$1 तास}}',
 'days' => '{{PLURAL:$1|$1 दिवस|$1 दिवस}}',
+'weeks' => '{{PLURAL:$1|$1 आठवडा|$1 आठवडे}}',
 'months' => '{{PLURAL:$1|$1 महिना|$1 महिने}}',
 'years' => '{{PLURAL:$1|$1 वर्ष|$1 वर्षे}}',
 'ago' => '$1 पूर्वी',
 'just-now' => 'लगेच',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|तास}} पूर्वी',
+'minutes-ago' => '$1 {{PLURAL:$1|मिनिट|मिनिटे}} पूर्वी',
+'seconds-ago' => '$1 {{PLURAL:$1|सेकंद|सेकंदां}}पूर्वी',
+'monday-at' => 'सोमवारी $1 वर',
+'tuesday-at' => 'मंगळवारी $1 वर',
+'wednesday-at' => 'बुधवारी $1 वर',
+'thursday-at' => 'गुरुवारी $1 वर',
+'friday-at' => 'शुक्रवारी $1 वर',
+'saturday-at' => 'शनिवारी $1 वर',
+'sunday-at' => 'रविवारी $1 वर',
+'yesterday-at' => 'काल $1 वर',
+
 # Bad image list
 'bad_image_list' => 'रूपरेषा खालीलप्रमाणे आहे:
 
@@ -3185,7 +3275,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'रूंदी',
 'exif-imagelength' => 'उंची',
 'exif-bitspersample' => 'प्रती घटक बीट्स',
@@ -3364,7 +3454,7 @@ $1',
 'exif-originalimageheight' => 'चित्राचा आकार बदलण्यापुर्वीची उंची',
 'exif-originalimagewidth' => 'छाचाचित्राचा आकार बदलण्यापुर्वीची रूंदी',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'अनाकुंचीत',
 'exif-compression-2' => 'CCITT गट३ १-Dimensional Modified Huffman run length encoding',
 'exif-compression-3' => 'CCITT Group 3 फॅक्स संकेतन',
@@ -3748,7 +3838,6 @@ $5
 'version-other' => 'इतर',
 'version-mediahandlers' => 'मिडिया हॅंडलर',
 'version-hooks' => 'अंकुश',
-'version-extension-functions' => 'अतिविस्तार(एक्स्टेंशन) कार्ये',
 'version-parser-extensiontags' => 'पृथकक विस्तारीत खूणा',
 'version-parser-function-hooks' => 'पृथकक कार्य अंकुश',
 'version-hook-name' => 'अंकुश नाव',
@@ -3757,6 +3846,7 @@ $5
 'version-license' => 'परवाना',
 'version-poweredby-credits' => "हा विकी '''[//www.mediawiki.org/ मीडियाविकी]'''द्वारे संचालित आहे, प्रताधिकारित © २००१-$1 $2.",
 'version-poweredby-others' => 'इतर',
+'version-poweredby-translators' => 'ट्रांसलेटविकि.नेट वरील भाषांतरकार',
 'version-credits-summary' => 'आम्ही खालील व्यक्तींना, [[Special:Version|मिडियाविकि]]वर त्यांनी दिलेल्या योगदानामुळे, मान्यता देऊ ईच्छितो.',
 'version-license-info' => 'मिडियाविकि हे  मुक्त संगणक प्रणाली विकि पॅकेज आहे.Free Software Foundation प्रकाशित  GNU General Public परवान्याच्या अटीस अनुसरून तुम्ही त्यात बदल आणि/अथवा त्याचे  पुर्नवितरण  करू शकता.
 
@@ -3770,12 +3860,17 @@ $5
 'version-entrypoints-header-entrypoint' => 'आत येण्याचा मार्ग',
 'version-entrypoints-header-url' => 'यू॰आर॰एल',
 
-# Special:FilePath
-'filepath' => 'संचिका मार्ग',
-'filepath-page' => 'संचिका:',
-'filepath-submit' => 'चला',
-'filepath-summary' => 'हे विशेष पान संचिकेचा संपूर्ण मार्ग कळवते.
-चित्रे संपूर्ण रिझोल्युशन मध्ये दाखवली आहेत,इतर संचिका प्रकार त्यांच्या संबधित प्रोग्रामने प्रत्यक्ष सुरू होतात.',
+# Special:Redirect
+'redirect' => 'संचिका,सदस्य किंवा आवृत्ती या ओळखणीनुसार पुनर्निर्देशन',
+'redirect-legend' => 'संचिका अथवा पानास पुनर्निर्देशन',
+'redirect-summary' => 'हे विशेष पान एक संचिकेस पुनर्निर्देशित करते(दिलेले संचिकानाम),एक पान(दिलेली आवृत्ती ओळ्खण) किंवा एक सदस्यपान(दिलेला सदस्य अंक).',
+'redirect-submit' => 'जा',
+'redirect-lookup' => 'बघा:',
+'redirect-value' => 'मुल्य:',
+'redirect-user' => 'सदस्यनाम',
+'redirect-revision' => 'पानाची आवृत्ती',
+'redirect-file' => 'संचिकानाम',
+'redirect-not-exists' => '(योग्य)मुल्य (व्हॅल्यु) सापडले नाही',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'जुळ्या संचिका शोधा',
@@ -3821,12 +3916,16 @@ $5
 'tags' => 'मान्य बदल खुणा',
 'tag-filter' => '[[Special:Tags|खूणपताका]] गाळक:',
 'tag-filter-submit' => 'गाळक',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|खूणपताका}}]]: $2)',
 'tags-title' => 'खुणा',
 'tags-intro' => 'प्रणालीतून विशिष्ट संपादनांच्या अर्थासहित  खुणांची  यादी नमूद करणारे पान',
 'tags-tag' => 'खूण नाव',
 'tags-display-header' => 'बदल सुचीवर कसे दिसेल',
 'tags-description-header' => 'अर्थाची पूर्ण माहिती',
+'tags-active-header' => 'सक्रिय?',
 'tags-hitcount-header' => 'खुणा केलेले बदल',
+'tags-active-yes' => 'होय',
+'tags-active-no' => 'नाही',
 'tags-edit' => 'संपादन करा',
 'tags-hitcount' => '$1 {{PLURAL:$1|बदल|बदल}}',
 
@@ -3847,6 +3946,7 @@ $5
 'dberr-problems' => 'माफ करा, हे संकेतस्थळ सध्या तांत्रिक अडचणींना सामोरे जात आहे.',
 'dberr-again' => 'थोडा वेळ थांबून पुन्हा पहा.',
 'dberr-info' => '( विदादाताशी संपर्क साधण्यात  असमर्थ : $1)',
+'dberr-info-hidden' => '( विदादात्याशी संपर्क साधण्यात  असमर्थ)',
 'dberr-usegoogle' => 'तोपर्यंत गूगलवर शोधून पहा',
 'dberr-outofdate' => 'लक्षात घ्या, आमच्या मजकुराबाबत त्यांची सूची कालबाह्य असू शकते',
 'dberr-cachederror' => 'ही मागवलेल्या पानाची सयीतील प्रत आहे, ती अद्ययावत नसण्याची शक्यता आहे.',
@@ -3862,6 +3962,9 @@ $5
 'htmlform-submit' => 'पाठवा',
 'htmlform-reset' => 'बदल उलटवा',
 'htmlform-selectorother-other' => 'इतर',
+'htmlform-no' => 'नाही',
+'htmlform-yes' => 'होय',
+'htmlform-chosen-placeholder' => 'पर्याय निवडा',
 
 # SQLite database support
 'sqlite-has-fts' => 'पूर्ण-मजकूर शोध समर्थनासहित $1',
@@ -3978,4 +4081,11 @@ $5
 # Image rotation
 'rotate-comment' => '$1 ने चित्र {{PLURAL:$1|डिग्री|डिग्रीज}}ने  घड्याळ्याचे दिशेने फिरविले',
 
+# Limit report
+'limitreport-cputime' => 'CPU वापराचा वेळ',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|सेकंद}}',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|सेकंद}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|बाइट|बाइट्स}}',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|बाइट|बाइट्स}}',
+
 );
diff --git a/languages/messages/MessagesMrj.php b/languages/messages/MessagesMrj.php
index d5d0ae6f..503dca4a 100644
--- a/languages/messages/MessagesMrj.php
+++ b/languages/messages/MessagesMrj.php
@@ -75,8 +75,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Манярын ӹлӹштӓшӹм вӓнгӹмӹ списокышкышты пыртенӹт, анжыкташ',
 'tog-oldsig' => 'Ылшы сирӹмӹ подписьӹм анзыцок анжен лӓктӓш',
 'tog-fancysig' => 'Вики-пӓлӹкӹн ӹшке подписьшӹ (автоматический ажедмӓш гӹц пасна)',
-'tog-externaleditor' => 'Тӱнӹш тӧрлӹшӹм кычылташ (компьютерӹн йори настройкыжы келеш)',
-'tog-externaldiff' => 'Вариантвлӓн тӓнгӓштӓрӹмӹ годым тӱнӹш программым кычылташ (компьютерӹн йори настройкыжы келеш)',
 'tog-showjumplinks' => '«ванжаш» палшышы ажедмӓшвлӓм чӱктӓш',
 'tog-uselivepreview' => 'Текстӹм пӹсӹн анзыц анжен лӓкмӹм кычылташ (эксперимент семӹнь JavaScript)',
 'tog-forceeditsummary' => 'Мам тӧрлӹмӹ тӹ «нырын» охыр ылмыжы гишӓн пӓлдӹртӓш',
diff --git a/languages/messages/MessagesMs.php b/languages/messages/MessagesMs.php
index 5ccaff25..3774bd6f 100644
--- a/languages/messages/MessagesMs.php
+++ b/languages/messages/MessagesMs.php
@@ -85,6 +85,7 @@ $magicWords = array(
 	'pagenamee'                 => array( '1', 'NAMALAMANE', 'PAGENAMEE' ),
 	'namespace'                 => array( '1', 'RUANGNAMA', 'NAMESPACE' ),
 	'namespacee'                => array( '1', 'RUANGNAMAE', 'NAMESPACEE' ),
+	'namespacenumber'           => array( '1', 'NOMBORRUANGNAMA', 'NAMESPACENUMBER' ),
 	'talkspace'                 => array( '1', 'RUANGBINCANG', 'TALKSPACE' ),
 	'talkspacee'                => array( '1', 'RUANGBINCANGE', 'TALKSPACEE' ),
 	'fullpagename'              => array( '1', 'NAMALAMANPENUH', 'FULLPAGENAME' ),
@@ -95,9 +96,11 @@ $magicWords = array(
 	'img_left'                  => array( '1', 'kanan', 'left' ),
 	'img_none'                  => array( '1', 'tiada', 'none' ),
 	'img_center'                => array( '1', 'tengah', 'center', 'centre' ),
+	'img_border'                => array( '1', 'bingkai', 'border' ),
 	'sitename'                  => array( '1', 'NAMATAPAK', 'SITENAME' ),
 	'ns'                        => array( '0', 'RN:', 'NS:' ),
 	'nse'                       => array( '0', 'RNE:', 'NSE:' ),
+	'gender'                    => array( '0', 'JANTINA:', 'GENDER:' ),
 	'currentweek'               => array( '1', 'MINGGUSEMASA', 'CURRENTWEEK' ),
 );
 
@@ -112,13 +115,15 @@ $specialPageAliases = array(
 	'Booksources'               => array( 'Sumber_buku' ),
 	'BrokenRedirects'           => array( 'Lencongan_rosak', 'Pelencongan_rosak' ),
 	'Categories'                => array( 'Kategori' ),
+	'ChangeEmail'               => array( 'Tukar_e-mel' ),
 	'ChangePassword'            => array( 'Lupa_kata_laluan' ),
+	'ComparePages'              => array( 'Banding_laman' ),
 	'Confirmemail'              => array( 'Sahkan_e-mel' ),
 	'Contributions'             => array( 'Sumbangan' ),
 	'CreateAccount'             => array( 'Buka_akaun' ),
 	'Deadendpages'              => array( 'Laman_buntu' ),
 	'DeletedContributions'      => array( 'Sumbangan_dihapuskan' ),
-	'Disambiguations'           => array( 'Penyahtaksaan' ),
+	'Disambiguations'           => array( 'Penyahtaksaan', 'Nyahkekaburan' ),
 	'DoubleRedirects'           => array( 'Lencongan_berganda', 'Pelencongan_berganda' ),
 	'Emailuser'                 => array( 'E-mel_pengguna' ),
 	'Export'                    => array( 'Eksport' ),
@@ -149,6 +154,7 @@ $specialPageAliases = array(
 	'Mycontributions'           => array( 'Sumbangan_saya' ),
 	'Mypage'                    => array( 'Laman_saya' ),
 	'Mytalk'                    => array( 'Perbincangan_saya' ),
+	'Myuploads'                 => array( 'Muat_naik_saya' ),
 	'Newimages'                 => array( 'Imej_baru' ),
 	'Newpages'                  => array( 'Laman_baru' ),
 	'Popularpages'              => array( 'Laman_popular' ),
@@ -166,6 +172,7 @@ $specialPageAliases = array(
 	'Specialpages'              => array( 'Laman_khas' ),
 	'Statistics'                => array( 'Statistik' ),
 	'Tags'                      => array( 'Label' ),
+	'Unblock'                   => array( 'Nyahsekat' ),
 	'Uncategorizedcategories'   => array( 'Kategori_tanpa_kategori' ),
 	'Uncategorizedimages'       => array( 'Imej_tanpa_kategori' ),
 	'Uncategorizedpages'        => array( 'Laman_tanpa_kategori' ),
@@ -221,9 +228,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Tunjukkan bilangan pemantau',
 'tog-oldsig' => 'Tanda tangan yang sedia ada:',
 'tog-fancysig' => 'Anggap tandatangan sebagai teks wiki (tanpa pautan automatik)',
-'tog-externaleditor' => 'Utamakan penyunting luar (hanya untuk pakar, perlu tetapan khas pada komputer anda. [//www.mediawiki.org/wiki/Manual:External_editors Maklumat lanjut.])',
-'tog-externaldiff' => 'Utamakan pembeza luar (hanya untuk pakar, perlu tetapan khas pada komputer anda. [//www.mediawiki.org/wiki/Manual:External_editors Maklumat lanjut.])',
-'tog-showjumplinks' => 'Bolehkan pautan ketercapaian "lompat ke"',
 'tog-uselivepreview' => 'Gunakan pralihat langsung (dalam percubaan)',
 'tog-forceeditsummary' => 'Tanya saya jika ringkasan suntingan kosong',
 'tog-watchlisthideown' => 'Sembunyikan suntingan saya daripada senarai pantau',
@@ -237,6 +241,8 @@ $messages = array(
 'tog-showhiddencats' => 'Tunjukkan kategori tersembunyi',
 'tog-noconvertlink' => 'Lumpuhkan penukaran tajuk pautan',
 'tog-norollbackdiff' => 'Abaikan perbezaan selepas melakukan pengunduran suntingan.',
+'tog-useeditwarning' => 'Beri saya amaran apabila saya meninggalkan sesebuah laman penyuntingan tanpa menyimpan perubahan.',
+'tog-prefershttps' => 'Sentiasa gunakan sambungan terlindung apabila log masuk',
 
 'underline-always' => 'Sentiasa',
 'underline-never' => 'Jangan',
@@ -300,6 +306,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Dis',
+'january-date' => '$1 Januari',
+'february-date' => '$1 Februari',
+'march-date' => '$1 Mac',
+'april-date' => '$1 April',
+'may-date' => '$1 Mei',
+'june-date' => '$1 Jun',
+'july-date' => '$1 Julai',
+'august-date' => '$1 Ogos',
+'september-date' => '$1 September',
+'october-date' => '$1 Oktober',
+'november-date' => '$1 November',
+'december-date' => '$1 Disember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategori}}',
@@ -320,7 +338,7 @@ $messages = array(
 'noindex-category' => 'Laman tak diindeks',
 'broken-file-category' => 'Laman yang ada pautan fail yang terputus',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Perihal',
 'article' => 'Laman kandungan',
@@ -383,6 +401,7 @@ $messages = array(
 'create-this-page' => 'Cipta laman ini',
 'delete' => 'Hapuskan',
 'deletethispage' => 'Hapuskan laman ini',
+'undeletethispage' => 'Nyahhapuskan halaman ini',
 'undelete_short' => 'Nyahhapus {{PLURAL:$1|satu suntingan|$1 suntingan}}',
 'viewdeleted_short' => 'Papar {{PLURAL:$1|satu|$1}} suntingan dihapuskan',
 'protect' => 'Lindung',
@@ -426,7 +445,7 @@ $1',
 'pool-queuefull' => 'Giliran kolam telah penuh',
 'pool-errorunknown' => 'Ralat tak diketahui',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Perihal {{SITENAME}}',
 'aboutpage' => 'Project:Perihal',
 'copyright' => 'Kandungan disediakan di bawah $1 melainkan dinyatakan sebaliknya.',
@@ -436,7 +455,6 @@ $1',
 'disclaimers' => 'Penolak tuntutan',
 'disclaimerpage' => 'Project:Penolak tuntutan umum',
 'edithelp' => 'Bantuan menyunting',
-'edithelppage' => 'Help:Menyunting',
 'helppage' => 'Help:Kandungan',
 'mainpage' => 'Laman Utama',
 'mainpage-description' => 'Laman utama',
@@ -466,7 +484,6 @@ $1',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|perubahan|perubahan-perubahan}} terkini',
 'youhavenewmessagesmulti' => 'Anda telah menerima pesanan baru pada $1',
 'editsection' => 'sunting',
-'editsection-brackets' => '[$1]',
 'editold' => 'sunting',
 'viewsourceold' => 'lihat sumber',
 'editlink' => 'sunting',
@@ -516,17 +533,12 @@ Senarai laman khas yang sah boleh dilihat di [[Special:SpecialPages]].',
 # General errors
 'error' => 'Ralat',
 'databaseerror' => 'Ralat pangkalan data',
-'dberrortext' => 'Terjadinya ralat sintaks pertanyaan pangkalan data.
-Ini mungkin menandakan adanya pepijat dalam perisian ini.
-Pertanyaan pangkalan data terakhir yang dicuba ialah:
-<blockquote><code>$1</code></blockquote>
-daripada dalam fungsi "<samp>$2</samp>".
-Pangkalan data memulangkan ralat "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Terdapat ralat sintaks pertanyaan pangkalan data.
-Pertanyaan terakhir ialah:
-"$1"
-daripada fungsi "$2".
-Pangkalan data memulangkan ralat "$3: $4".',
+'databaseerror-text' => 'Ralat pertanyaan pangkalan data telah terjadi.
+Ini mungkin menandakan pepijat dalam perisian.',
+'databaseerror-textcl' => 'Ralat pertanyaan pangkalan data telah terjadi.',
+'databaseerror-query' => 'Pertanyaan: $1',
+'databaseerror-function' => 'Fungsi: $1',
+'databaseerror-error' => 'Ralat: $1',
 'laggedslavemode' => 'Amaran: Laman ini mungkin bukan yang terkini.',
 'readonly' => 'Pangkalan data dikunci',
 'enterlockreason' => 'Sila nyatakan sebab penguncian dan jangkaan
@@ -561,6 +573,7 @@ Ia mungkin telah pun dihapuskan oleh orang lain.',
 'cannotdelete-title' => 'Laman "$1" tidak dapat dihapuskan',
 'delete-hook-aborted' => 'Penghapusan dibatalkan oleh penyangkuk.
 Tiada sebab diberikan.',
+'no-null-revision' => 'Semakan nol baru untuk "$1" tidak dapat diwujudkan',
 'badtitle' => 'Tajuk tidak sah',
 'badtitletext' => 'Tajuk laman yang diminta tidak sah, kosong, ataupun tajuk antara bahasa atau tajuk antara wiki yang salah dipaut. Ia mungkin mengandungi aksara yang tidak dibenarkan.',
 'perfcached' => 'Data yang berikut disimpan dalam cache dan mungkin tidak terkemas kini. Semaksimum {{PLURAL:$1|satu hasil|$1 hasil}} terdapat dalam cache.',
@@ -581,11 +594,14 @@ Pertanyaan: $2',
 Untuk menambah atau menyunting terjemahan untuk semua wiki, sila gunakan projek penyetempatan MediaWiki, [//translatewiki.net/ translatewiki.net].',
 'editinginterface' => "'''Amaran:''' Anda sedang menyunting laman yang digunakan untuk menghasilkan teks antara muka bagi perisian ini. Sebarang perubahan terhadap laman ini akan menjejaskan rupa antara muka bagi pengguna-pengguna lain di wiki ini.
 Untuk menambah atau menyunting terjemahan untuk semua wiki, sila gunakan projek penyetempatan MediaWiki, [//translatewiki.net/ translatewiki.net].",
-'sqlhidden' => '(Pertanyaan SQL disorokkan)',
 'cascadeprotected' => 'Laman ini telah dilindungi daripada penyuntingan oleh pengguna selain penyelia, kerana ia termasuk dalam {{PLURAL:$1|laman|laman-laman}} berikut, yang dilindungi dengan secara "melata": $2',
 'namespaceprotected' => "Anda tidak mempunyai keizinan untuk menyunting laman dalam ruang nama '''$1'''.",
 'customcssprotected' => 'Anda tidak dibenarkan menyunting laman JavaScript ini kerana ia mengandungi tetapan peribadi pengguna lain.',
 'customjsprotected' => 'Anda tidak dibenarkan menyunting laman JavaScript ini kerana ia mengandungi tetapan peribadi pengguna lain.',
+'mycustomcssprotected' => 'Anda tiada kebenaran untuk menyunting halaman CSS ini.',
+'mycustomjsprotected' => 'Anda tiada kebenaran untuk menyunting halaman JavaScript ini.',
+'myprivateinfoprotected' => 'Anda tidak mempunyai kebenaran untuk menyunting maklumat peribadi anda.',
+'mypreferencesprotected' => 'Anda tidak mempunyai kebenaran untuk menyunting tetapan keutamaan anda.',
 'ns-specialprotected' => 'Laman khas tidak boleh disunting.',
 'titleprotected' => "Tajuk ini telah dilindungi oleh [[User:$1|$1]] daripada dicipta. Sebab yang diberikan ialah ''$2''.",
 'filereadonlyerror' => 'Fail "$1" tidak dapat diubah suai kerana repositori fail "$2" berada dalam ragam baca sahaja.
@@ -609,10 +625,19 @@ Sila ingat bahawa sesetengah halaman mungkin masih dipaparkan seolah-olah anda m
 'welcomecreation-msg' => 'Akaun anda telah dibuka.
 Jangan lupa untuk mengubah [[Special:Preferences|keutamaan anda di {{SITENAME}}]].',
 'yourname' => 'Nama pengguna:',
+'userlogin-yourname' => 'Nama pengguna',
+'userlogin-yourname-ph' => 'Masukkan nama pengguna anda',
+'createacct-another-username-ph' => 'Masukkan nama pengguna',
 'yourpassword' => 'Kata laluan:',
+'userlogin-yourpassword' => 'Kata laluan',
+'userlogin-yourpassword-ph' => 'Masukkan kata laluan anda',
+'createacct-yourpassword-ph' => 'Isikan kata laluan',
 'yourpasswordagain' => 'Ulangi kata laluan:',
+'createacct-yourpasswordagain' => 'Sahkan kata laluan',
+'createacct-yourpasswordagain-ph' => 'Isikan kata laluan semula',
 'remembermypassword' => 'Ingat log masuk saya pada pelayar ini (tidak melebihi $1 {{PLURAL:$1|hari|hari}})',
-'securelogin-stick-https' => 'Kekal disambungkan ke HTTPS selepas log masuk',
+'userlogin-remembermypassword' => 'Biar saya kekal log masuk',
+'userlogin-signwithsecure' => 'Gunakan sambungan terlindung',
 'yourdomainname' => 'Domain anda:',
 'password-change-forbidden' => 'Anda tidak dapat mengubah kata laluan di wiki ini.',
 'externaldberror' => 'Berlaku ralat pangkalan data bagi pengesahan luar atau anda tidak dibenarkan mengemaskinikan akaun luar anda.',
@@ -624,18 +649,41 @@ Jangan lupa untuk mengubah [[Special:Preferences|keutamaan anda di {{SITENAME}}]
 'logout' => 'Log keluar',
 'userlogout' => 'Log keluar',
 'notloggedin' => 'Belum log masuk',
+'userlogin-noaccount' => 'Belum buka akaun?',
+'userlogin-joinproject' => 'Sertai {{SITENAME}}',
 'nologin' => "Belum mempunyai akaun? '''$1'''.",
 'nologinlink' => 'Buka akaun baru',
 'createaccount' => 'Buka akaun',
 'gotaccount' => "Sudah mempunyai akaun? '''$1'''.",
 'gotaccountlink' => 'Log masuk',
 'userlogin-resetlink' => 'Lupa nama pengguna/kata laluan anda?',
+'userlogin-resetpassword-link' => 'Reset kata laluan anda',
+'helplogin-url' => 'Help:Log masuk',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bantuan untuk log masuk]]',
+'createacct-join' => 'Isikan keterangan anda di bawah.',
+'createacct-another-join' => 'Masukkan maklumat akaun baru di bawah.',
+'createacct-emailrequired' => 'Alamat e-mel',
+'createacct-emailoptional' => 'Alamat e-mel (pilihan)',
+'createacct-email-ph' => 'Isikan alamt e-mel anda',
+'createacct-another-email-ph' => 'Masukkan alamat e-mel',
 'createaccountmail' => 'Gunakan kata laluan rawak yang sementara dan hantarnya ke alamat e-mel yang dinyatakan',
+'createacct-realname' => 'Nama sebenar (pilihan)',
 'createaccountreason' => 'Sebab:',
+'createacct-reason' => 'Sebab',
+'createacct-reason-ph' => 'Mengapa anda membuka satu lagi akaun',
+'createacct-captcha' => 'Pemeriksaan sekuriti',
+'createacct-imgcaptcha-ph' => 'Isikan teks yang anda lihat di atas',
+'createacct-submit' => 'Wujudkan akaun anda',
+'createacct-another-submit' => 'Buka akaun baru',
+'createacct-benefit-heading' => '{{SITENAME}} dijayakan oleh orang ramai seperti anda.',
+'createacct-benefit-body1' => '{{PLURAL:$1|suntingan}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|halaman}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|penyumbang}} terkini',
 'badretype' => 'Sila ulangi kata laluan dengan betul.',
 'userexists' => 'Nama pengguna yang diisikan telah pun digunakan.
 Sila pilih nama yang lain.',
 'loginerror' => 'Ralat log masuk',
+'createacct-error' => 'Ralat pembukaan akaun',
 'createaccounterror' => 'Tidak dapat mencipta akaun: $1',
 'nocookiesnew' => 'Akaun anda telah dibuka, tetapi anda belum log masuk. {{SITENAME}} menggunakan kuki untuk mencatat status log masuk pengguna. Sila aktifkan sokongan kuki pada pelayar anda, kemudian log masuk dengan nama pengguna dan kata laluan baru anda.',
 'nocookieslogin' => "{{SITENAME}} menggunakan ''cookies'' untuk mencatat status log masuk pengguna. Sila aktifkan sokongan ''cookies'' pada pelayar anda dan cuba lagi.",
@@ -692,10 +740,12 @@ Anda boleh log masuk dan tukar kata laluan anda sekarang.
 Sila abaikan mesej ini jika anda tidak meminta untuk membuka akaun tersebut.',
 'usernamehasherror' => 'Nama pengguna tidak boleh memiliki aksara cincangan',
 'login-throttled' => 'Anda telah mencuba log masuk berulang kali.
-Sila tunggu sebentar dan cuba lagi.',
+Sila tunggu $1 dan cuba lagi.',
 'login-abort-generic' => 'Log masuk anda tidak berjaya, dan terpaksa dibatalkan',
 'loginlanguagelabel' => 'Bahasa: $1',
 'suspicious-userlogout' => 'Permintaan anda untuk log keluar ditolak kerana ia kelihatan seperti dihantar oleh pelayar rosak atau proksi pengagregatan.',
+'createacct-another-realname-tip' => 'Nama sebenar adalah tidak wajib.
+Jika anda memilih untuk menyatakannya, ini akan digunakan untuk memberikan atribusi kepada pengguna atas sumbangan mereka.',
 
 # Email sending
 'php-mail-error-unknown' => 'Ralat tak diketahui dalam fungsi mail() PHP',
@@ -711,8 +761,7 @@ Sila tunggu sebentar dan cuba lagi.',
 'newpassword' => 'Kata laluan baru:',
 'retypenew' => 'Ulangi kata laluan baru:',
 'resetpass_submit' => 'Tetapkan kata laluan dan log masuk',
-'resetpass_success' => 'Kata laluan anda telah berjaya ditukar!
-Anda sedang dilog masuk...',
+'changepassword-success' => 'Kata laluan anda berjaya ditukar!',
 'resetpass_forbidden' => 'Kata laluan tidak boleh ditukar',
 'resetpass-no-info' => 'Anda hendaklah log masuk terlebih dahulu untuk mencapai laman ini secara terus.',
 'resetpass-submit-loggedin' => 'Tukar kata laluan',
@@ -724,10 +773,11 @@ Anda mungkin telah pun berjaya menukar kata laluan anda atau meminta kata laluan
 
 # Special:PasswordReset
 'passwordreset' => 'Set semula kata laluan',
-'passwordreset-text' => 'Lengkapkan borang ini untuk mengeset semula kata laluan.',
+'passwordreset-text-one' => 'Lengkapkan borang ini untuk mengeset semula kata laluan anda.',
+'passwordreset-text-many' => '{{PLURAL:$1|Isi salah satu ruangan untuk mengeset semula kata laluan anda.}}',
 'passwordreset-legend' => 'Set semula kata laluan',
 'passwordreset-disabled' => 'Ciri set semula kata laluan telah dimatikan di wiki ini.',
-'passwordreset-pretext' => '{{PLURAL:$1||Isikan data di bawah}}',
+'passwordreset-emaildisabled' => 'Ciri-ciri e-mel telah dipadamkan di wiki ini.',
 'passwordreset-username' => 'Nama pengguna:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Lihat e-mel yang terhasil?',
@@ -750,7 +800,7 @@ $2
 Kata laluan sementara: $2',
 'passwordreset-emailsent' => 'E-mel set semula kata laluan telah dihantar.',
 'passwordreset-emailsent-capture' => 'E-mel set semula kata laluan telah dihantar, seperti yang dipaparkan di bawah.',
-'passwordreset-emailerror-capture' => 'E-mel peringatan (seperti di bawah) telah dihasilkan tetapi tidak dapat dihantar kepada pengguna: $1',
+'passwordreset-emailerror-capture' => 'E-mel set semula kata laluan telah dihasilkan, seperti yang dipaparkan di bawah, tetapi tidak berjaya dihantar kepada {{GENDER:$2|pengguna}} berkenaan: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Tukar alamat e-mel',
@@ -764,6 +814,19 @@ Kata laluan sementara: $2',
 'changeemail-submit' => 'Tukar E-mel',
 'changeemail-cancel' => 'Batalkan',
 
+# Special:ResetTokens
+'resettokens' => 'Set semula token',
+'resettokens-text' => 'Anda boleh mengeset semula token yang membolehkan akses kepada data peribadi tertentu yang berkaitan dengan akaun anda di sini.
+
+Anda harus melakukannya jika anda tanpa sengaja mengongsinya dengan sesiapa ataupun akaun anda telah dikompromi.',
+'resettokens-no-tokens' => 'Tiada token untuk diset semula.',
+'resettokens-legend' => 'Set semula token',
+'resettokens-tokens' => 'Token:',
+'resettokens-token-label' => '$1 (nilai semasa: $2)',
+'resettokens-watchlist-token' => 'Token untuk suapan sesawang (Atom/RSS) bagi [[Special:Watchlist|perubahan pada halaman dalam senarai pantau anda]]',
+'resettokens-done' => 'Token diset semula.',
+'resettokens-resetbutton' => 'Set semula token terpilih',
+
 # Edit page toolbar
 'bold_sample' => 'Teks tebal',
 'bold_tip' => 'Teks tebal',
@@ -954,11 +1017,14 @@ Log penghapusan bagi laman ini dilampirkan di bawah untuk rujukan.',
 'edit-gone-missing' => 'Laman tersebut telah dihapuskan dan tidak dapat dikemaskinikan.',
 'edit-conflict' => 'Percanggahan penyuntingan.',
 'edit-no-change' => 'Suntingan anda diabaikan kerana tiada perubahan dibuat pada teks tersebut.',
+'postedit-confirmation' => 'Suntingan anda telah disimpan.',
 'edit-already-exists' => 'Tidak dapat mencipta laman baru kerana ia telah wujud.',
 'defaultmessagetext' => 'Teks mesej asal',
 'content-failed-to-parse' => 'Kandungan $2 tidak dapat dihuraikan untuk model $1: $3',
 'invalid-content-data' => 'Data kandungan tidak sah',
 'content-not-allowed-here' => 'Kandungan "$1" tidak dibenarkan di halaman [[$2]]',
+'editwarning-warning' => 'Meninggalkan laman ini mungkin akan menyebabkan sebarang perubahan yang telah anda lakukan hilang.
+Jika anda sudah log masuk, anda boleh melumpuhkan amaran ini di bahagian "Menyunting" dalam keutamaan anda.',
 
 # Content models
 'content-model-wikitext' => 'wikiteks',
@@ -993,6 +1059,7 @@ Argumen-argumen ini telah ditinggalkan.',
 'undo-failure' => 'Suntingan tersebut tidak boleh dibatalkan kerana terdapat suntingan pertengahan yang bercanggah.',
 'undo-norev' => 'Suntingan tersebut tidak boleh dibatalkan kerana tidak wujud atau telah dihapuskan.',
 'undo-summary' => 'Membatalkan semakan $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|Perbincangan]])',
+'undo-summary-username-hidden' => 'Buat asal semakan $1 oleh pengguna tersembunyi',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Akaun tidak dapat dibuka',
@@ -1174,6 +1241,7 @@ Sila pastikan bahawa perubahan ini akan mengekalkan kesinambungan sejarah laman.
 'compareselectedversions' => 'Bandingkan versi-versi yang dipilih',
 'showhideselectedversions' => 'Tunjukkan/sorokkan versi yang dipilih',
 'editundo' => 'batal',
+'diff-empty' => '(Tiada perbezaan)',
 'diff-multi' => '($1 {{PLURAL:$1|semakan pertengahan|semakan pertengahan}} oleh $2 {{PLURAL:$2|pengguna|pengguna}} tidak dipaparkan)',
 'diff-multi-manyusers' => '($1 {{PLURAL:$1|semakan pertengahan|semakan pertengahan}} oleh lebih daripada $2 {{PLURAL:$2|pengguna|pengguna}} tidak dipaparkan)',
 'difference-missing-revision' => '{{PLURAL:$2|Satu semakan|$2 semakan}} bagi perbezaan ini ($1) tidak ditemui.
@@ -1201,7 +1269,6 @@ Butirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGEN
 'searchmenu-legend' => 'Pilihan carian',
 'searchmenu-exists' => "* Laman '''[[$1]]'''",
 'searchmenu-new' => "'''Cipta laman \"[[:\$1]]\" di wiki ini!'''",
-'searchhelp-url' => 'Help:Kandungan',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Senarai laman dengan awalan ini]]',
 'searchprofile-articles' => 'Laman kandungan',
 'searchprofile-project' => 'Laman bantuan dan projek',
@@ -1243,15 +1310,7 @@ Cuba berikan awalan ''all:'' untuk mencari semua kandungan (termasuk laman perbi
 'powersearch-togglenone' => 'Tiada',
 'search-external' => 'Carian luar',
 'searchdisabled' => 'Ciri pencarian dalam {{SITENAME}} dimatikan. Anda boleh mencari melalui Google. Sila ambil perhatian bahawa indeks dalam Google mungkin bukan yang terkini.',
-
-# Quickbar
-'qbsettings' => 'Bar pantas',
-'qbsettings-none' => 'Tiada',
-'qbsettings-fixedleft' => 'Tetap sebelah kiri',
-'qbsettings-fixedright' => 'Tetap sebelah kanan',
-'qbsettings-floatingleft' => 'Berubah-ubah sebelah kiri',
-'qbsettings-floatingright' => 'Berubah-ubah sebelah kanan',
-'qbsettings-directionality' => 'Tetap, bergantung pada kearahan tulisan bahasa anda',
+'search-error' => 'Berlakunya ralat ketika mencari: $1',
 
 # Preferences page
 'preferences' => 'Keutamaan',
@@ -1285,7 +1344,6 @@ Cuba berikan awalan ''all:'' untuk mencari semua kandungan (termasuk laman perbi
 'resetprefs' => 'Set semula',
 'restoreprefs' => 'Pulihkan semua tetapan asali (dalam semua bahagian)',
 'prefs-editing' => 'Menyunting',
-'prefs-edit-boxsize' => 'Saiz kotak sunting.',
 'rows' => 'Baris:',
 'columns' => 'Lajur:',
 'searchresultshead' => 'Cari',
@@ -1296,9 +1354,9 @@ Cuba berikan awalan ''all:'' untuk mencari semua kandungan (termasuk laman perbi
 'recentchangesdays-max' => '(had $1 hari)',
 'recentchangescount' => 'Bilangan suntingan yang dipaparkan mengikut tetapan asali:',
 'prefs-help-recentchangescount' => 'Ini termasuklah perubahan terkini, sejarah laman dan log.',
-'prefs-help-watchlist-token' => 'Mengisi medan ini dengan kunci rahsia akan menghasilkan suapan RSS untuk senarai pantau anda.
-Sesiapa yang mengetahui kunci dalam medan ini akan dapat membaca senarai pantau anda, jadi pilihlah nilai selamat.
-Di sini ada nilai yang dihasilkan secara rawak yang boleh anda guna: $1',
+'prefs-help-watchlist-token2' => 'Inilah kunci rahsia kepada suapan web senarai pantau anda.
+Sesiapa yang mengetahuinya akan boleh membaca senarai pantau anda, jadi jangan kongsinya.
+[[Special:ResetTokens|Klik di sini jika anda perlu mengesetnya semula]].',
 'savedprefs' => 'Keutamaan anda disimpan.',
 'timezonelegend' => 'Zon waktu:',
 'localtime' => 'Waktu tempatan:',
@@ -1329,7 +1387,6 @@ Di sini ada nilai yang dihasilkan secara rawak yang boleh anda guna: $1',
 'prefs-reset-intro' => 'Anda boleh menggunakan laman ini untuk menetapkan semula keutamaan anda kepada tetapan asali.
 Tindakan ini tidak boleh dibatalkan.',
 'prefs-emailconfirm-label' => 'Pengesahan e-mel:',
-'prefs-textboxsize' => 'Saiz tetingkap penyuntingan',
 'youremail' => 'E-mel:',
 'username' => '{{GENDER:$1|Nama pengguna}}:',
 'uid' => 'ID {{GENDER:$1|Pengguna}}:',
@@ -1361,6 +1418,8 @@ Tindakan ini tidak boleh dibatalkan.',
 'prefs-dateformat' => 'Format tarikh',
 'prefs-timeoffset' => 'Imbangan masa',
 'prefs-advancedediting' => 'Pilihan am',
+'prefs-editor' => 'Penyunting',
+'prefs-preview' => 'Pralihat',
 'prefs-advancedrc' => 'Pilihan lanjutan',
 'prefs-advancedrendering' => 'Pilihan lanjutan',
 'prefs-advancedsearchoptions' => 'Pilihan lanjutan',
@@ -1369,6 +1428,7 @@ Tindakan ini tidak boleh dibatalkan.',
 'prefs-displaysearchoptions' => 'Pilihan paparan',
 'prefs-displaywatchlist' => 'Pilihan paparan',
 'prefs-diffs' => 'Beza',
+'prefs-help-prefershttps' => 'Keutamaan inu akan berkuatkuasa pada lain kali anda log masuk.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Alamat e-mel adalah sah',
@@ -1396,6 +1456,8 @@ Tindakan ini tidak boleh dibatalkan.',
 'userrights-changeable-col' => 'Kumpulan yang anda boleh ubah',
 'userrights-unchangeable-col' => 'Kumpulan yang anda tak boleh ubah',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Percanggahan perubahan hak pengguna! Sila semak dan sahkan perubahan anda.',
+'userrights-removed-self' => 'Anda telah berjaya menggugurkan hak-hak sendiri. Oleh yang demikian, anda tidak boleh mengakses halaman ini lagi.',
 
 # Groups
 'group' => 'Kumpulan:',
@@ -1461,11 +1523,19 @@ Tindakan ini tidak boleh dibatalkan.',
 'right-proxyunbannable' => 'Melangkau sekatan proksi automatik',
 'right-unblockself' => 'Menyahsekat diri sendiri',
 'right-protect' => 'Mengubah tahap perlindungan serta menyunting halaman yang dilindungi lata',
-'right-editprotected' => 'Menyunting laman yang dilindungi (tanpa perlindungan melata)',
+'right-editprotected' => 'Menyunting halaman-halaman yang dilindungi sebagai "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Menyunting halaman-halaman yang dilindungi sebagai "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Menyunting antara muka pengguna',
 'right-editusercssjs' => 'Menyunting fail CSS dan JavaScript pengguna lain',
 'right-editusercss' => 'Menyunting fail CSS pengguna lain',
 'right-edituserjs' => 'Menyunting fail JavaScript pengguna lain',
+'right-editmyusercss' => 'Menyunting fail CSS pengguna sendiri',
+'right-editmyuserjs' => 'Menyunting fail JavaScript pengguna sendiri',
+'right-viewmywatchlist' => 'Melihat senarai pantau sendiri',
+'right-editmywatchlist' => 'Menyunting senarai pantau sendiri. Perhatian: sesetengah tindakan masih akan dapat menambah halaman walaupun tanpa hak ini.',
+'right-viewmyprivateinfo' => 'Melihat data peribadi sendiri (cth. alamat e-mel, nama sebenar)',
+'right-editmyprivateinfo' => 'Menyunting data peribadi sendiri (cth. alamat e-mel, nama sebenar)',
+'right-editmyoptions' => 'Menyunting keutamaan sendiri',
 'right-rollback' => 'Mengundurkan suntigan terakhir bagi laman tertentu',
 'right-markbotedits' => 'Menanda suntingan yang diundurkan sebagai suntingan bot',
 'right-noratelimit' => 'Tidak dikenakan had kadar penyuntingan',
@@ -1527,12 +1597,19 @@ Tindakan ini tidak boleh dibatalkan.',
 'action-userrights-interwiki' => 'mengubah hak pengguna dari wiki lain',
 'action-siteadmin' => 'mengunci atau membuka kunci pangkalan data wiki ini',
 'action-sendemail' => 'menghantar e-mel',
+'action-editmywatchlist' => 'menyunting senarai pantau sendiri',
+'action-viewmywatchlist' => 'melihat senarai pantau sendiri',
+'action-viewmyprivateinfo' => 'melihat maklumat peribadi sendiri',
+'action-editmyprivateinfo' => 'menyunting maklumat peribadi sendiri',
 
 # Recent changes
 'nchanges' => '$1 perubahan',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sejak lawatan terakhir}}',
+'enhancedrc-history' => 'sejarah',
 'recentchanges' => 'Perubahan terkini',
 'recentchanges-legend' => 'Pilihan perubahan terkini',
 'recentchanges-summary' => 'Jejaki perubahan terkini dalam {{SITENAME}} pada laman ini.',
+'recentchanges-noresult' => 'Tiada perubahan dalam tempoh yang diberikan sepadan dengan kriteria ini.',
 'recentchanges-feed-description' => 'Jejaki perubahan terkini dalam {{SITENAME}} pada suapan ini.',
 'recentchanges-label-newpage' => 'Suntingan ini mencipta laman baru',
 'recentchanges-label-minor' => 'Ini ialah suntingan kecil',
@@ -1571,7 +1648,6 @@ Tindakan ini tidak boleh dibatalkan.',
 'recentchangeslinked-feed' => 'Perubahan berkaitan',
 'recentchangeslinked-toolbox' => 'Perubahan berkaitan',
 'recentchangeslinked-title' => 'Perubahan berkaitan dengan $1',
-'recentchangeslinked-noresult' => 'Tiada perubahan pada semua laman yang dipaut dalam tempoh yang diberikan.',
 'recentchangeslinked-summary' => "Laman khas ini menyenaraikan perubahan terkini bagi laman-laman yang dipaut. Laman-laman yang terdapat dalam senarai pantau anda ditandakan dengan '''teks tebal'''.",
 'recentchangeslinked-page' => 'Nama laman:',
 'recentchangeslinked-to' => 'Paparkan perubahan pada laman yang mengandungi pautan ke laman yang diberikan',
@@ -1582,8 +1658,7 @@ Tindakan ini tidak boleh dibatalkan.',
 'reuploaddesc' => 'Kembali ke borang muat naik',
 'upload-tryagain' => 'Serahkan keterangan fail yang telah diubah',
 'uploadnologin' => 'Belum log masuk',
-'uploadnologintext' => 'Anda perlu [[Special:UserLogin|log masuk]]
-terlebih dahulu untuk memuat naik fail.',
+'uploadnologintext' => 'Anda mesti $1 untuk memuat naik fail.',
 'upload_directory_missing' => 'Direktori muat naik ($1) hilang dan tidak dapat dicipta oleh pelayan web.',
 'upload_directory_read_only' => 'Direktori muat naik ($1) tidak boleh ditulis oleh pelayan web.',
 'uploaderror' => 'Ralat muat naik',
@@ -1802,7 +1877,6 @@ Untuk keselamatan optimum, img_auth.php telah dilumpuhkan.',
 'http-read-error' => 'Ralat baca HTTP.',
 'http-timed-out' => 'Permintaan HTTP melebihi waktu tamat.',
 'http-curl-error' => 'Ralat mendapatkan URL: $1',
-'http-host-unreachable' => 'URL tidak dapat dicapai.',
 'http-bad-status' => 'Berlaku masalah ketika permintaan HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1830,6 +1904,10 @@ Untuk keselamatan optimum, img_auth.php telah dilumpuhkan.',
 'listfiles_size' => 'Saiz',
 'listfiles_description' => 'Keterangan',
 'listfiles_count' => 'Versi',
+'listfiles-show-all' => 'Masukkan versi lama imej',
+'listfiles-latestversion' => 'Versi semasa',
+'listfiles-latestversion-yes' => 'Ya',
+'listfiles-latestversion-no' => 'Tidak',
 
 # File description page
 'file-anchor-link' => 'Fail',
@@ -1927,6 +2005,13 @@ Mungkin anda ingin menyunting keterangan pada [$2 laman penerangan failnya] di s
 'randompage' => 'Laman rawak',
 'randompage-nopages' => 'Tiada laman dalam {{PLURAL:$2|ruang|ruang-ruang}} nama berikut: $1.',
 
+# Random page in category
+'randomincategory' => 'Halaman pilihan rawak dalam kategori',
+'randomincategory-invalidcategory' => '"$1" bukan nama kategori yang sah.',
+'randomincategory-nopages' => 'Tiada halaman di [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Dapatkan halaman pilihan rawak dari kategori: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Pergi',
+
 # Random redirect
 'randomredirect' => 'Lencongan rawak',
 'randomredirect-nopages' => 'Tiada lencongan dalam ruang nama "$1".',
@@ -1952,17 +2037,13 @@ Mungkin anda ingin menyunting keterangan pada [$2 laman penerangan failnya] di s
 'statistics-users-active-desc' => 'Pengguna yang aktif sejak {{PLURAL:$1|semalam|$1 hari lalu}}',
 'statistics-mostpopular' => 'Laman dilihat terbanyak',
 
-'disambiguations' => 'Laman-laman yang berpaut dengan laman penyahkekaburan',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Laman-laman berikut mengandungi sekurang-kurangnya satu pautan ke '''laman penyahkekaburan'''.
-Pautan ini sepatutnya ditujukan ke topik yang sepatutnya.<br />
-Sesebuah laman dianggap sebagai laman penyahkekaburan jika ia menggunakan templat yang dipaut dari [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop' => 'Halaman dengan sifat halaman',
 'pageswithprop-legend' => 'Halaman dengan sifat halaman',
 'pageswithprop-text' => 'Halaman ini menyenaraikan halaman-halaman yang menggunakan sifat halaman yang tertentu.',
 'pageswithprop-prop' => 'Nama sifat:',
 'pageswithprop-submit' => 'Pergi',
+'pageswithprop-prophidden-long' => 'nilai sifat teks panjang tersorok ($1)',
+'pageswithprop-prophidden-binary' => 'nilai sifat binari tersorok ($1)',
 
 'doubleredirects' => 'Lencongan berganda',
 'doubleredirectstext' => 'Yang berikut ialah senarai laman yang melencong ke laman lencongan lain. Setiap baris mengandungi pautan ke laman lencongan pertama dan kedua, serta baris pertama bagi teks lencongan kedua, lazimnya merupakan laman sasaran "sebenar", yang sepatutnya ditujui oleh lencongan pertama.
@@ -2019,6 +2100,7 @@ Masukan yang <del>dipotong</del> telah diselesaikan.',
 'mostrevisions' => 'Rencana dengan semakan terbanyak',
 'prefixindex' => 'Indeks awalan',
 'prefixindex-namespace' => 'Semua laman dengan awalan (ruang nama $1)',
+'prefixindex-strip' => 'Gugurkan awalan dalam senarai',
 'shortpages' => 'Laman pendek',
 'longpages' => 'Laman panjang',
 'deadendpages' => 'Laman buntu',
@@ -2034,6 +2116,7 @@ Masukan yang <del>dipotong</del> telah diselesaikan.',
 'listusers' => 'Senarai pengguna',
 'listusers-editsonly' => 'Hanya papar pengguna yang telah membuat suntingan',
 'listusers-creationsort' => 'Susun mengikut tarikh penciptaan',
+'listusers-desc' => 'Susun dalam turutan menurun',
 'usereditcount' => '$1 suntingan',
 'usercreated' => '{{GENDER:$3|Dibuat}} pada $1, $2',
 'newpages' => 'Laman baru',
@@ -2213,10 +2296,9 @@ Perubahan-perubahan pada halaman ini dan halaman perbualannya pada masa akan dat
 'unwatchthispage' => 'Berhenti memantau',
 'notanarticle' => 'Bukan laman kandungan',
 'notvisiblerev' => 'Semakan ini telah dihapuskan',
-'watchnochange' => 'Tiada perubahan pada laman-laman yang dipantau dalam tempoh yang ditunjukkan.',
 'watchlist-details' => '$1 laman dipantau (tidak termasuk laman perbincangan).',
-'wlheader-enotif' => '* Pemberitahuan melalui e-mel diaktifkan.',
-'wlheader-showupdated' => "* Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''",
+'wlheader-enotif' => 'Pemberitahuan melalui e-mel dibolehkan.',
+'wlheader-showupdated' => "Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''.",
 'watchmethod-recent' => 'menyemak laman yang dipantau dalam suntingan-suntingan terkini',
 'watchmethod-list' => 'menyemak suntingan terkini pada laman-laman yang dipantau',
 'watchlistcontains' => 'Terdapat $1 laman dalam senarai pantau anda.',
@@ -2617,14 +2699,12 @@ Sila lihat juga [[Special:BlockList|senarai sekatan]] untuk senarai larangan dan
 'ipb_blocked_as_range' => 'Ralat: IP $1 tidak boleh dinyahsekat kerana ia tidak disekat secara langsung. Sebaliknya, ia disekat kerana merupakan sebahagian daripada sekatan julat $2, yang mana boleh dinyahsekat.',
 'ip_range_invalid' => 'Julat IP tidak sah.',
 'ip_range_toolarge' => 'Sekatan julat yang lebih luas daripada /$1 adalah tidak dibenarkan.',
-'blockme' => 'Sekat saya',
 'proxyblocker' => 'Penyekat proksi',
-'proxyblocker-disabled' => 'Fungsi ini dimatikan.',
 'proxyblockreason' => 'Alamat IP anda telah disekat kerana ia merupakan proksi terbuka.
 Sila hubungi penyedia perkhidmatan Internet anda atau pihak sokongan teknikal dan beritahu mereka mengenai masalah keselamatan yang berat ini.',
-'proxyblocksuccess' => 'Berjaya.',
 'sorbsreason' => 'Alamat IP anda telah disenaraikan sebagai proksi terbuka dalam DNSBL yang digunakan oleh {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Alamat IP anda telah disenaraikan sebagai proksi terbuka dalam DNSBL yang digunakan oleh {{SITENAME}}. Oleh itu, anda tidak dibenarkan membuka akaun baru.',
+'xffblockreason' => 'Alamat IP yang terdapat dalam pengepala X-Forwarded-For, sama ada milik anda ataupun pelayan proksi yang anda gunakan, telah disekat. Sebab asal sekatan adalah: $1',
 'cant-block-while-blocked' => 'Anda tidak boleh menyekat orang lain sedangkan anda disekat.',
 'cant-see-hidden-user' => 'Pengguna yang anda cuba sekat telahpun disekat dan tersorok.
 Memandangkan anda tidak mempunyai hak untuk menyorokkan pengguna, anda tidak boleh melihat atau menyunting sekatan pengguna tersebut.',
@@ -2793,6 +2873,7 @@ Sila lawat [//www.mediawiki.org/wiki/Localisation Penyetempatan MediaWiki] dan [
 'thumbnail-more' => 'Besarkan',
 'filemissing' => 'Fail hilang',
 'thumbnail_error' => 'Berlaku ralat ketika mencipta gambar kenit: $1',
+'thumbnail_error_remote' => 'Mesej ralat dari $1: $2',
 'djvu_page_error' => 'Laman DjVu di luar julat',
 'djvu_no_xml' => 'Gagal mendapatkan data XML bagi fail DjVu',
 'thumbnail-temp-create' => 'Fail gambar kenit sementara tidak dapat dibuat',
@@ -2941,19 +3022,11 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 
 # Stylesheets
 'common.css' => '/* CSS yang terletak di sini akan digunakan pada semua kulit */',
-'standard.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Klasik */',
-'nostalgia.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Nostalgia */',
 'cologneblue.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Cologne Blue */',
 'monobook.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Monobook */',
-'myskin.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit MySkin */',
-'chick.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Chick */',
-'simple.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Ringkas */',
 'modern.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Moden */',
 'vector.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Vector */',
 
-# Scripts
-'nostalgia.js' => '/* Sebarang unsur JavaScript di sini akan dimuatkan untuk pengguna yang memakaikan kulit Nostalgia */',
-
 # Metadata
 'notacceptable' => 'Pelayan wiki ini tidak mampu menyediakan data dalam format yang boleh dibaca oleh pelanggan anda.',
 
@@ -3025,13 +3098,8 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 'pageinfo-category-files' => 'Bilangan fail',
 
 # Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Cologne Blue',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Ringkas',
 'skinname-modern' => 'Moden',
 'skinname-vector' => 'Vector',
 
@@ -3114,11 +3182,25 @@ Dengan menjalankannya, komputer anda mungkin akan terjejas.",
 'minutes' => '$1 minit',
 'hours' => '$1 jam',
 'days' => '$1 hari',
+'weeks' => '$1 minggu',
 'months' => '$1 bulan',
 'years' => '$1 tahun',
 'ago' => '$1 yang lalu',
 'just-now' => 'tadi',
 
+# Human-readable timestamps
+'hours-ago' => '$1 jam yang lalu',
+'minutes-ago' => '$1 minit yang lalu',
+'seconds-ago' => '$1 saat yang lalu',
+'monday-at' => 'Isnin $1',
+'tuesday-at' => 'Selasa $1',
+'wednesday-at' => 'Rabu $1',
+'thursday-at' => 'Khamis $1',
+'friday-at' => 'Jumaat $1',
+'saturday-at' => 'Sabtu $1',
+'sunday-at' => 'Ahad $1',
+'yesterday-at' => 'Semalam $1',
+
 # Bad image list
 'bad_image_list' => 'Berikut adalah format yang digunakan:
 
@@ -3146,7 +3228,7 @@ Ruangan-ruangan yang lain pula akan disembunyikan pada asali.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lebar',
 'exif-imagelength' => 'Tinggi',
 'exif-bitspersample' => 'Bit sekomponen',
@@ -3324,7 +3406,7 @@ Ruangan-ruangan yang lain pula akan disembunyikan pada asali.
 'exif-originalimageheight' => 'Ketinggian imej sebelum dipangkas',
 'exif-originalimagewidth' => 'Lebar imej sebelum dipangkas',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Tak termampat',
 'exif-compression-2' => 'Pengekodan panjang jalan Huffman Terubahsuai 1-Dimensi Kumpulan 3 CCITT',
 'exif-compression-3' => 'Pengekodan faks Kumpulan 3 CCITT',
@@ -3722,7 +3804,6 @@ Anda juga boleh [[Special:EditWatchlist|menggunakan penyunting piawai]].',
 'version-other' => 'Lain-lain',
 'version-mediahandlers' => 'Pengelola media',
 'version-hooks' => 'Penyangkuk',
-'version-extension-functions' => 'Fungsi penyambung',
 'version-parser-extensiontags' => 'Tag penyambung penghurai',
 'version-parser-function-hooks' => 'Penyangkuk fungsi penghurai',
 'version-hook-name' => 'Nama penyangkuk',
@@ -3731,6 +3812,7 @@ Anda juga boleh [[Special:EditWatchlist|menggunakan penyunting piawai]].',
 'version-license' => 'Lesen',
 'version-poweredby-credits' => "Wiki ini dikuasakan oleh '''[//www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
 'version-poweredby-others' => 'penyumbang-penyumbang lain',
+'version-poweredby-translators' => 'para penterjemah translatewiki.net',
 'version-credits-summary' => 'Kami ingin mengucapkan sekalung budi kepada mereka yang berikut atas sumbangan mereka keada [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki adalah perisian bebas; anda boleh mengedarkannya semula dan/atau mengubah suainya di bawah terma-terma Lesen Awam GNU sebagai mana yang telah diterbitkan oleh Yayasan Perisian Bebas, sama ada versi 2 bagi Lesen tersebut, atau (berdasarkan pilihan anda) mana-mana versi selepasnya.
 
@@ -3746,12 +3828,17 @@ Anda patut telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING sebuah salinan bagi
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Laluan rencana]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Laluan skrip]',
 
-# Special:FilePath
-'filepath' => 'Laluan fail',
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Pergi',
-'filepath-summary' => 'Laman khas ini mengembalikan laluan penuh bagi sesebuah fail.
-Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara yang berkenaan secara terus.',
+# Special:Redirect
+'redirect' => 'Lencongkan mengikut fail, ID pengguna atau ID semakan',
+'redirect-legend' => 'Lencongkan ke fail atau halaman',
+'redirect-summary' => 'Halaman khas ini melencong kepada fail (dengan nama fail), halaman (dengan ID semakan) atau halaman pengguna (dengan ID pengguna berangka).',
+'redirect-submit' => 'Pergi',
+'redirect-lookup' => 'Cari:',
+'redirect-value' => 'Nilai:',
+'redirect-user' => 'ID Pengguna',
+'redirect-revision' => 'Semakan halaman',
+'redirect-file' => 'Nama fail',
+'redirect-not-exists' => 'Nilai tidak dijumpai',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Cari fail serupa',
@@ -3801,6 +3888,7 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
 'tags' => 'Label perubahan yang sah',
 'tag-filter' => 'Tapis [[Special:Tags|label]]:',
 'tag-filter-submit' => 'Tapis',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Teg}}]]: $2)',
 'tags-title' => 'Label',
 'tags-intro' => 'Yang berikut ialah senarai label yang digunakan untuk menanda suntingan, berserta maknanya.',
 'tags-tag' => 'Nama label',
@@ -3827,6 +3915,7 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
 'dberr-problems' => 'Harap maaf. Tapak web ini dilanda masalah teknikal.',
 'dberr-again' => 'Cuba tunggu selama beberapa minit dan muat semula.',
 'dberr-info' => '(Tidak dapat menghubungi pelayan pangkalan data: $1)',
+'dberr-info-hidden' => '(Pelayan pangkalan data tidak dapat dihubungi)',
 'dberr-usegoogle' => 'Buat masa ini, anda boleh cuba mencari melalui Google.',
 'dberr-outofdate' => 'Sila ambil perhatian bahawa indeks mereka bagi kandungan kami mungkin sudah ketinggalan zaman.',
 'dberr-cachederror' => 'Yang berikut ialah salinan bagi laman yang diminta yang diambil daripada cache, dan mungkin bukan yang terkini.',
@@ -3842,6 +3931,9 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
 'htmlform-submit' => 'Hantar',
 'htmlform-reset' => 'Undur perubahan',
 'htmlform-selectorother-other' => 'Lain-lain',
+'htmlform-no' => 'Tidak',
+'htmlform-yes' => 'Ya',
+'htmlform-chosen-placeholder' => 'Pilih satu pilihan',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 dengan sokongan carian teks penuh',
@@ -3959,4 +4051,19 @@ Ataupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dic
 # Image rotation
 'rotate-comment' => 'Imej diputar sebanyak $1 {{PLURAL:$1|darjah|darjah}} mengikut arah jam',
 
+# Limit report
+'limitreport-title' => 'Data pemprofilan penghurai:',
+'limitreport-cputime' => 'Penggunaan masa CPU',
+'limitreport-cputime-value' => '$1 saat',
+'limitreport-walltime' => 'Penggunaan masa nyata',
+'limitreport-walltime-value' => '$1 saat',
+'limitreport-ppvisitednodes' => 'Kiraan nod kunjungan pempraproses',
+'limitreport-ppgeneratednodes' => 'Kiraan nod hasilan pempraproses',
+'limitreport-postexpandincludesize' => 'Saiz selepas peluasan',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bait}}',
+'limitreport-templateargumentsize' => 'Saiz parameter templat',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bait}}',
+'limitreport-expansiondepth' => 'Kedalaman peluasan terjauh',
+'limitreport-expensivefunctioncount' => 'Kiraan fungsi penghurai muatan tinggi',
+
 );
diff --git a/languages/messages/MessagesMt.php b/languages/messages/MessagesMt.php
index 7478ac75..f1d67a78 100644
--- a/languages/messages/MessagesMt.php
+++ b/languages/messages/MessagesMt.php
@@ -302,9 +302,6 @@ $messages = array(
 'tog-shownumberswatching' => "Uri n-numru ta' utenti li qegħdin isegwu din il-paġna",
 'tog-oldsig' => 'Firma attwali:',
 'tog-fancysig' => 'Interpreta l-firma bħala test tal-wiki (mingħajr ħolqa awtomatika)',
-'tog-externaleditor' => 'Uża awtomatikament editur estern (għal utenti esperti biss, hemm bżonn preferenzi speċjali fuq il-komputer tiegħek. [//www.mediawiki.org/wiki/Manual:External_editors Iktar informazzjoni.])',
-'tog-externaldiff' => 'Uża awtomatikament diff estern (għal utenti esperti biss, hemm bżonn preferenzi speċjali fuq il-komputer tiegħek. [//www.mediawiki.org/wiki/Manual:External_editors Iktar informazzjoni.])',
-'tog-showjumplinks' => 'Attiva l-ħoloq aċċessibbli "aqbeż għal"',
 'tog-uselivepreview' => "Attiva l-funzjoni ''Live preview'' (bżonn tal-JavaScript; sperimentali)",
 'tog-forceeditsummary' => 'Nebbaħni meta ndaħħal taqsira tal-modifika vojta',
 'tog-watchlisthideown' => "Aħbi l-modifiki tiegħi mil-lista ta' osservazzjoni",
@@ -317,6 +314,8 @@ $messages = array(
 'tog-diffonly' => 'Turiex kontenut tal-paġni wara li tkun għamilt paragun bejn il-verżjonijiet',
 'tog-showhiddencats' => 'Uri kategoriji moħbija',
 'tog-norollbackdiff' => "Turix il-paragun bejn il-verżjonijiet wara li tkun effettwajt ir-''rollback''",
+'tog-useeditwarning' => "Avżani kull meta nħalli paġna ta' modifika b'modifiki li għadhom ma ġewx salvati",
+'tog-prefershttps' => 'Dejjem uża l-konnessjoni sigura meta tidħol fil-kont',
 
 'underline-always' => 'Dejjem',
 'underline-never' => 'Qatt',
@@ -380,6 +379,18 @@ $messages = array(
 'oct' => 'Ott',
 'nov' => 'Nov',
 'dec' => 'Diċ',
+'january-date' => "$1 ta' Jannar",
+'february-date' => "$1 ta' Frar",
+'march-date' => "$1 ta' Marzu",
+'april-date' => "$1 ta' April",
+'may-date' => "$1 ta' Mejju",
+'june-date' => "$1 ta' Ġunju",
+'july-date' => "$1 ta' Lulju",
+'august-date' => "$1 ta' Awwissu",
+'september-date' => "$1 ta' Settembru",
+'october-date' => "$1 ta' Ottubru",
+'november-date' => "$1 ta' Novembru",
+'december-date' => "$1 ta' Diċembru",
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorija|Kategoriji}}',
@@ -400,7 +411,7 @@ $messages = array(
 'noindex-category' => 'Paġni mhux indiċizzati',
 'broken-file-category' => "Paġni b'ħoloq lejn fajls miksura",
 
-'linkprefix' => '/^(.*?)([a-żA-Ż\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-żA-Ż\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Dwar',
 'article' => 'artiklu',
@@ -463,6 +474,7 @@ $messages = array(
 'create-this-page' => 'Oħloq din il-paġna',
 'delete' => 'Ħassar',
 'deletethispage' => 'Ħassar din il-paġna',
+'undeletethispage' => 'irkupra din il-paġna',
 'undelete_short' => 'Irkupra {{PLURAL:$1|modifika waħda|$1 modifiki}}',
 'viewdeleted_short' => 'Ara {{PLURAL:$1|modifika mħassra|$1 modifiki mħassra}}',
 'protect' => 'Ipproteġi',
@@ -505,7 +517,7 @@ $1",
 'pool-queuefull' => "Il-kju tal-''pool'' hi mimlija",
 'pool-errorunknown' => 'Problema mhux magħrufa',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Dwar {{SITENAME}}',
 'aboutpage' => 'Project:Dwar',
 'copyright' => 'Kontenut aċċessibli taħt $1.',
@@ -515,7 +527,6 @@ $1",
 'disclaimers' => 'Ċaħdiet',
 'disclaimerpage' => 'Project:Ċaħda ġenerali',
 'edithelp' => 'Gwida',
-'edithelppage' => 'Help:Kif Timmodifika',
 'helppage' => 'Help:Kontenut',
 'mainpage' => 'Il-Paġna prinċipali',
 'mainpage-description' => 'Il-Paġna prinċipali',
@@ -591,17 +602,6 @@ Lista ta' paġni speċjali validi tinsab hawn [[Special:SpecialPages|{{int:speci
 # General errors
 'error' => 'Problema',
 'databaseerror' => 'Problema fid-database',
-'dberrortext' => 'Kien hemm żball fis-sintassi ta\' rikjesta tad-databażi.
-Dan jista\' jindika li hemm problema fis-softwer.
-L-aħħar attentat ta\' rikjesta tad-databażi kienet:
-<blockquote><tt>$1</tt></blockquote>
-mill-funzjoni ta\' "<tt>$2</tt>".
-Id-databażi tat problema ta\' "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Kien hemm żball fis-sintassi ta\' rikjesta tad-databażi.
-L-aħħar attentat ta\' rikjesta tad-databażi kienet:
-"$1"
-mill-funzjoni "$2".
-Id-databażi tat il-problema segwenti "$3: $4"',
 'laggedslavemode' => "Twissija: Il-Paġna jista' ma jkollhiex l-affarijiet aġġornati.",
 'readonly' => 'Database magħluq',
 'enterlockreason' => "Daħħal raġuni għala qiegħed tagħlqu, inkludi l-istima ta' meta l-għeluq se tieħu effett",
@@ -650,7 +650,6 @@ Jekk jogħġbok erġa' prova fi ftit minuti oħra.",
 'viewyourtext' => "Tista' tara u tikkopja s-sors tal-'''modifiki tiegħek''' fuq din il-paġna:",
 'protectedinterface' => 'Din il-paġna għanda element li tagħmel parti mill-interfaċċa tal-utent tas-software, u għaldaqstant ġiet protetta sabiex ma jkunx hemm abbuż.',
 'editinginterface' => "'''Avviż:''' Qiegħed tagħmel modifiki lejn paġna li qegħdha tintuża biex tipprovdi interfaċċa għall-messaġġi tas-software. Kull modifika f'din il-paġna se taffetwa l-apparenza tal-faċċata tal-utenti kollha. Għat-traduzzjonijiet, ikkunsidra l-possibilità li tuża'  [//translatewiki.net/wiki/Main_Page?setlang=mt translatewiki.net], il-proġett MediaWiki għal-lokalizzazzjoni.",
-'sqlhidden' => '(SQL rikjesta moħbija)',
 'cascadeprotected' => 'Din il-paġna ġiet protetta mill-modifiki, minħabba li tinkludi {{PLURAL:$1|paġni, li huwa|paġni, li huma}} protetti bil-preferenza tal-"kaskata" mixewla:
 $2',
 'namespaceprotected' => "Inti m'għandhekx il-permess li timodifika paġni fin-''namespace'' '''$1''.",
@@ -671,10 +670,17 @@ Ir-raġuni li ġiet mogħtija kienet ''$2''.",
 Tista' tkompli tuża' {{SITENAME}} bħala utent anonimu, jew tista' terġa <span class='plainlinks'>[$1 tidħol]</span> bħala l-istess utent jew wieħed differenti.
 Kun af li ċerti paġni jistgħu jkomplu jidhru bħallikieku l-illogjar 'l barra mill-kont qatt ma seħħ, sakemm ma tħassarx il-cache tal-browser.",
 'yourname' => 'Isem tal-utent:',
+'userlogin-yourname' => 'Isem tal-utent',
+'userlogin-yourname-ph' => 'Daħħal l-isem tal-utent tiegħek',
 'yourpassword' => 'Password:',
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => 'Daħħal il-password tiegħek',
 'yourpasswordagain' => "Erġa' ikteb il-password:",
+'createacct-yourpasswordagain' => 'Ikkonferma l-password',
+'createacct-yourpasswordagain-ph' => "Erġa' daħħal il-password",
 'remembermypassword' => "Ftakar il-login tiegħi fuq dan il-kompjuter (għal massimu ta' {{PLURAL:$1|ġurnata|$1 ġurnata}})",
-'securelogin-stick-https' => "Ibqa' konness fuq l-HTTPS wara l-login",
+'userlogin-remembermypassword' => 'Żommni fil-kont',
+'userlogin-signwithsecure' => 'Uża konnessjoni sigura',
 'yourdomainname' => 'Id-dominju tiegħek:',
 'externaldberror' => "Kien hemm problema esterna ta' awtentiċitá jew m'għandhekx permess neċċessarju sabiex tagħmel aġġornamenti fuq l-aċċess estern.",
 'login' => 'Idħol',
@@ -685,17 +691,37 @@ Kun af li ċerti paġni jistgħu jkomplu jidhru bħallikieku l-illogjar 'l barra
 'logout' => 'Oħroġ',
 'userlogout' => 'oħroġ',
 'notloggedin' => 'Għadek ma dħaltx ġewwa',
+'userlogin-noaccount' => "M'għandekx kont?",
+'userlogin-joinproject' => 'Irreġistra fuq {{SITENAME}}',
 'nologin' => "Għad m'għandekx kont? '''$1'''.",
 'nologinlink' => 'Oħloq kont',
 'createaccount' => 'Oħloq kont',
 'gotaccount' => "Diġa għandhek kont? '''$1'''.",
 'gotaccountlink' => 'Idħol',
 'userlogin-resetlink' => 'Insejt kif tidħol fil-kont tiegħek?',
+'userlogin-resetpassword-link' => 'Irrisettja l-password',
+'helplogin-url' => 'Help:Kif tirreġistra',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Għajnuna kif tillogja]]',
+'createacct-join' => 'Daħħal l-informazzjoni tiegħek hawn taħt.',
+'createacct-emailrequired' => 'Indirizz elettroniku',
+'createacct-emailoptional' => 'Indirizz elettroniku (fakultattiv)',
+'createacct-email-ph' => 'Daħħal l-indirizz elettroniku tiegħek',
 'createaccountmail' => 'Uża password każwali temporanja u ibgħatha fuq l-indirizz elettroniku mniżżel hawn taħt',
+'createacct-realname' => 'Isem proprju (fakultattiv)',
 'createaccountreason' => 'Raġuni:',
+'createacct-reason' => 'Raġuni',
+'createacct-reason-ph' => 'Għala qiegħed toħloq kont ġdid',
+'createacct-captcha' => 'Kontroll tas-sigurtà',
+'createacct-imgcaptcha-ph' => 'Daħħal it-test li qed tara hawn fuq',
+'createacct-submit' => 'Oħloq il-kont',
+'createacct-benefit-heading' => '{{SITENAME}} hi magħmula minn persuni bħalek.',
+'createacct-benefit-body1' => '{{PLURAL:$1|modifika|modifiki}}',
+'createacct-benefit-body2' => 'paġna',
+'createacct-benefit-body3' => '{{PLURAL:$1|kontributur|kontributuri}} riċenti',
 'badretype' => 'Il-passwords li daħħalt ma jaqblux.',
 'userexists' => 'L-isem tal-utent li daħħalt diġà meħud. Jekk jogħġbok, agħżel isem differenti.',
 'loginerror' => 'Problemi fil-login',
+'createacct-error' => 'Problema fil-ħolqien tal-kont',
 'createaccounterror' => 'Il-kont ma jistax jinħoloq: $1',
 'nocookiesnew' => "Il-Kont tal-utent għal l-aċċess ġie maħluq, però ma kienx possibli li tagħmel aċċess għal {{SITENAME}} għax il-''cookies'' huma disattivati. Erġa' prova l-aċċess bl-isem tal-utent u l-password wara li tkun attivajt il-''cookies'' tal-''browser''.",
 'nocookieslogin' => "L-aċċess għal {{SITENAME}} jagħmel użu minn ''cookies'', li bħalissa huma disattivati. Jekk jogħġbok erġa' prova idħol wara li tkun attivajt il-''cookies'' fil-browser.",
@@ -771,7 +797,7 @@ Biex tkompli l-aċċess tal-kont tiegħek huwa neċessarju li toħloq password 
 'newpassword' => 'Password ġdida:',
 'retypenew' => "Erġa' ikteb il-password il-ġdida:",
 'resetpass_submit' => 'Issettja l-password u idħol fis-sit',
-'resetpass_success' => 'Il-password ġie modifikat. Aċċess fil-proċess...',
+'changepassword-success' => 'Il-password ġie modifikat. Aċċess fil-proċess...',
 'resetpass_forbidden' => 'Mhuwiex possibbli li timmodifika l-passwords',
 'resetpass-no-info' => 'Trid tkun effetwajt il-login qabel ma taċċessa direttament din il-paġna.',
 'resetpass-submit-loggedin' => 'Biddel il-password',
@@ -782,10 +808,9 @@ Jista' jkun li int diġà biddilt il-password, jew għamilt rikjesta għal passw
 
 # Special:PasswordReset
 'passwordreset' => 'Irrisettja l-password',
-'passwordreset-text' => 'Imla din il-formola sabiex tirċievi notifikazzjoni permezz tal-posta elettronika tad-dettalji tal-kont tiegħek.',
+'passwordreset-text-one' => 'Imla din il-formola sabiex tirrisettja l-password.',
 'passwordreset-legend' => 'Irrisettja l-password',
 'passwordreset-disabled' => 'L-irrisettjar tal-password fuq din il-wiki ġie diżattivat.',
-'passwordreset-pretext' => "{{PLURAL:$1||Daħħal wieħed mill-biċċiet ta' informazzjoni t'hawn taħt}}",
 'passwordreset-username' => 'Isem tal-utent:',
 'passwordreset-domain' => 'Dominju:',
 'passwordreset-capture' => 'Ara l-kontenut tal-messaġġ?',
@@ -1015,8 +1040,10 @@ Ma ngħatat l-ebda spjegazzjoni.",
 Jidher li din ġiet imħassra.',
 'edit-conflict' => 'Kunflitt tal-editjar.',
 'edit-no-change' => 'Il-modifika li għamilt ġiet injorata, minħabba li ebda bidla ma saret lejn it-test.',
+'postedit-confirmation' => 'Il-modifika tiegħek ġiet salvata.',
 'edit-already-exists' => 'Ma tistax tinħoloq din il-paġna.
 Din teżisti diġà.',
+'editwarning-warning' => 'Jekk tħalli din il-paġna jista\' jwassal sabiex titlef kwalunkwe tibdil li tkun għamilt. Jekk int tinsab fil-kont tiegħek, tista\' tneħħi dan l-avviż fis-sezzjoni "Modifiki" tal-preferenzi tiegħek.',
 
 # Content models
 'content-model-wikitext' => 'test tal-wiki',
@@ -1243,7 +1270,6 @@ Nota li l-użu tal-links tan-navigazzjoni jagħmel reset tal-kolonna.",
 'searchmenu-legend' => 'Preferenzi għat-tfittxija',
 'searchmenu-exists' => "'''Hemm paġna bl-isem ta' \"[[:\$1]]\" fuq din il-wiki'''",
 'searchmenu-new' => "'''Oħloq il-paġna \"[[:\$1]]\" fuq din il-wiki!'''",
-'searchhelp-url' => 'Help:Kontenut',
 'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Uri l-paġni b'dan il-prefiss]]",
 'searchprofile-articles' => "Paġni ta' kontenut",
 'searchprofile-project' => "Paġni ta' għajnuna u ta' proġett",
@@ -1288,15 +1314,6 @@ Ipprova għamel prefiss għall-inkjesta tiegħek ma' ''all:'' sabiex tfittex il-
 Sadanittant, tista' tipprova tfittex bil-Google.
 Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu ma jkunux aġġornati.",
 
-# Quickbar
-'qbsettings' => "''Quickbar''",
-'qbsettings-none' => 'Xejn',
-'qbsettings-fixedleft' => 'Mehmuż fix-xellug',
-'qbsettings-fixedright' => 'Mehmuż fil-lemin',
-'qbsettings-floatingleft' => "''Floating'' lejn ix-xellug",
-'qbsettings-floatingright' => "''Floating'' lejn il-lemin",
-'qbsettings-directionality' => 'Fiss, skont id-direzzjoni tat-test fil-lingwa tiegħek',
-
 # Preferences page
 'preferences' => 'Preferenzi',
 'mypreferences' => 'Preferenzi',
@@ -1328,7 +1345,6 @@ Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu
 'resetprefs' => 'Neħħi modifiki mhux salvati',
 'restoreprefs' => 'Irkupra l-impostazzjonijiet awtomatiċi',
 'prefs-editing' => 'Modifiki',
-'prefs-edit-boxsize' => 'Daqs tat-tieqa tal-immodifikar.',
 'rows' => 'Fillieri:',
 'columns' => 'Kolonni:',
 'searchresultshead' => 'Fittex',
@@ -1339,9 +1355,6 @@ Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu
 'recentchangesdays-max' => "(massimu ta' $1 {{PLURAL:$1|ġurnata|ġurnata}})",
 'recentchangescount' => "Numru ta' fillieri fit-tibdil riċenti:",
 'prefs-help-recentchangescount' => 'Din tinkludi tibdil riċenti, kronoloġiji u reġistri.',
-'prefs-help-watchlist-token' => "Billi timla din il-kaxxa b'ċavetta sigrieta se tiġi ġenerata feed RSS għal-lista ta' osservazzjonijiet tiegħek.
-Kull minn jaf din iċ-ċavetta f'din il-kaxxa jkun jista' jaqra l-lista ta' osservazzjonijiet tiegħek, għalhekk għażel waħda sigura.
-Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
 'savedprefs' => 'Il-preferenzi tiegħek ġew salvati.',
 'timezonelegend' => 'Żona tal-ħin:',
 'localtime' => 'Ħin lokali:',
@@ -1371,7 +1384,6 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
 'prefs-common-css-js' => 'CSS/JS maqsum għal kull aspett grafiku:',
 'prefs-reset-intro' => "Inti tista' tuża' din il-paġna sabiex terġa' tbiddel il-preferenzi tiegħek għal dawk li ngħatawlek fil-bidu. Din l-operazzjoni hija definittiva u ma tistax tiġi mħassra.",
 'prefs-emailconfirm-label' => 'Konferma tal-ittra-e:',
-'prefs-textboxsize' => 'Daqs tat-tieqa tal-modifika',
 'youremail' => 'E-mail:',
 'username' => '{{GENDER:$1|Isem tal-utent}}:',
 'uid' => '{{GENDER:$1|ID tal-utent}}:',
@@ -1402,6 +1414,8 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
 'prefs-dateformat' => 'Format tad-data',
 'prefs-timeoffset' => 'Differenza fis-sigħat',
 'prefs-advancedediting' => 'Opzjonijiet avvanzati',
+'prefs-editor' => 'Editur',
+'prefs-preview' => 'Dehra proviżorja',
 'prefs-advancedrc' => 'Opzjonijiet avvanzati',
 'prefs-advancedrendering' => 'Opzjonijiet avvanzati',
 'prefs-advancedsearchoptions' => 'Opzjonijiet avvanzati',
@@ -1608,7 +1622,6 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
 'recentchangeslinked-feed' => 'Tibdil relatat',
 'recentchangeslinked-toolbox' => 'Tibdil relatat',
 'recentchangeslinked-title' => 'Modifiki relatati ma\' "$1"',
-'recentchangeslinked-noresult' => 'L-ebda modifika ma saret fuq il-paġni relatati waqt il-perjodu speċifikat.',
 'recentchangeslinked-summary' => "Din hija lista ta' bidliet li saru riċentament fuq paġni marbuta minn paġna speċifika (jew lejn membri ta' kategorija speċifika). Il-paġni fuq il-[[Special:Watchlist|lista ta' osservazzjoni]] tiegħek huma mmarkati b''''tipa ħoxna'''.",
 'recentchangeslinked-page' => 'Isem tal-paġna:',
 'recentchangeslinked-to' => "Minflok, uri t-tibdiliet fil-paġni llinkjati ma' dik speċifikata",
@@ -1806,7 +1819,6 @@ Għal sigurtà ottimali, img_auth.php hija diżattivata.",
 'http-read-error' => 'Żball fil-qari HTTP.',
 'http-timed-out' => 'Rikjesta HTTP skaduta.',
 'http-curl-error' => 'Żball fil-kisba tal-URL: $1',
-'http-host-unreachable' => 'Il-URL ma setgħetx tintlaħaq.',
 'http-bad-status' => 'Kien hemm problema matul ir-rikjesta HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1955,12 +1967,6 @@ Daħħal: tip/sottotip, eż. <code>image/jpeg</code>.",
 'statistics-users-active-desc' => 'Utenti li wettqu azzjoni fl-aħħar {{PLURAL:$1|ġurnata|$1 ġurnata}}',
 'statistics-mostpopular' => 'Il-paġni l-aktar miżjura',
 
-'disambiguations' => "Paġni li jorbtu lejn paġni ta' diżambigwazzjoni",
-'disambiguationspage' => 'Template:diżambig',
-'disambiguations-text' => "Il-paġni segwenti għandhom minn tal-inqas ħolqa waħda lejn '''paġna ta' diżambigwazzjoni'''.
-Dawn probabbilment għandhom jippuntaw lejn l-paġna t-tajba minflok.<br />
-Paġna tiġi stmata bħala paġna ta' diżambigwazzjoni jekk tuża' mudell fil-lista li tinsab fuq [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => "Paġni bi proprjetà ta' paġna",
 'pageswithprop-legend' => "Paġni bi proprjetà ta' paġna",
 'pageswithprop-text' => "Din il-paġna telenka paġni li jużaw proprjetà ta' paġna partikulari.",
@@ -2211,10 +2217,9 @@ Kwalunkwe modifika li ssir fil-futur, kemm fuq din il-paġna u fil-paġna ta\' d
 'unwatchthispage' => 'Ieqaf osserva',
 'notanarticle' => 'Din il-paġna mhux artiklu',
 'notvisiblerev' => 'Ir-reviżjoni tħassret',
-'watchnochange' => 'L-ebda waħda mill-paġni osservati tiegħek ma ġiet modifikata fil-ħin stipulat.',
 'watchlist-details' => "Il-lista ta' osservazzjoni fiha {{PLURAL:$1|paġna waħda (u l-paġna ta' diskussjoni tagħha)|$1 paġni (u l-paġni ta' diskussjoni tagħhom)}}.",
-'wlheader-enotif' => '* In-notifikazzjoni bl-użu tal-posta elettronika hija attivata.',
-'wlheader-showupdated' => "* Il-paġni li ġew editjati wara l-aħħar żjara tiegħek qed jiġu murija b'tipa '''ħoxna'''",
+'wlheader-enotif' => 'In-notifikazzjoni bl-użu tal-posta elettronika hija attivata.',
+'wlheader-showupdated' => "Il-paġni li ġew editjati wara l-aħħar żjara tiegħek qed jiġu murija b'tipa '''ħoxna'''",
 'watchmethod-recent' => "Kontroll ta' modifiki riċenti għall-osservati speċjali.",
 'watchmethod-list' => 'Kontroll tal-osservati speċjali għal modifiki riċenti',
 'watchlistcontains' => "Il-lista ta' osservazzjoni fiha {{PLURAL:$1|paġna|$1 paġni}}.",
@@ -2603,11 +2608,8 @@ Ara l-[[Special:BlockList|lista tal-blokki]] sabiex tara l-blokki attivi.',
 'ipb_blocked_as_range' => "Problema: L-Indirizz tal-IP $1 ma jistax jiġi blokkat waħdu u ma jistax jiġi sblokkat. L-Imblokk huwa attiv però f'livell ta' interval $2, li jista' jkun sblokkat.",
 'ip_range_invalid' => "Interval ta' indirizzi ta' IP mhux validi.",
 'ip_range_toolarge' => "Mhumiex permessi firxa ta' blokki ikbar minn /$1.",
-'blockme' => 'Imblukkani',
 'proxyblocker' => "Blokki ta' proxy miftuħa",
-'proxyblocker-disabled' => 'Din il-funzjoni mhijiex attivata.',
 'proxyblockreason' => "L-indirizz IP tiegħek ġie imblukkat peress li huwa proxy miftuħ. Jekk jogħġbok, ikkuntattja lill-provdituri tas-servizz tal-internet (ISP) jew lis-''support'' tekniku tiegħek u infurmahom b'din il-problema serja ta' sigurtà.",
-'proxyblocksuccess' => 'Blokk esegwit.',
 'sorbsreason' => 'L-indirizz IP tiegħek huwa mniżżel bħala proxy miftuħ fid-DNSBL użat minn {{SITENAME}}.',
 'sorbs_create_account_reason' => 'L-indirizz IP tiegħek huwa mniżżel bħala proxy miftuħ fid-DNSBL użat minn {{SITENAME}}. Ma tistax toħloq kont.',
 'cant-block-while-blocked' => 'Ma tistax timblokka lil utenti oħra waqt li inti mblukkat.',
@@ -2902,24 +2904,14 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
 
 # Stylesheets
 'common.css' => '/* CSS li tpoġġa hawnhekk irrid jiġi applikat fl-iskins kollha */',
-'standard.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa l-utenti li jagħmlu użu mill-iskin Standard */',
-'nostalgia.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa l-utenti li jagħmlu użu mill-aspett grafiku Nostalgia */',
 'cologneblue.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-aspett grafiku Cologne Blue */',
 'monobook.css' => "/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-iskin ''Monobook'' */",
-'myskin.css' => "/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-iskin ''L-Iskin tiegħi'' */",
-'chick.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-aspett grafiku Ckick */',
-'simple.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-aspett grafiku Simple */',
 'modern.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-aspett grafiku Modern */',
 
 # Scripts
 'common.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal kull utent f'kull tniżżil ta' paġna. */",
-'standard.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Standard'' */",
-'nostalgia.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Nostalgia'' */",
 'cologneblue.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Cologne Blue'' */",
 'monobook.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Monobook'' */",
-'myskin.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''MySkin'' */",
-'chick.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Chick'' */",
-'simple.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Simple'' */",
 'modern.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Modern''*/",
 
 # Metadata
@@ -2985,13 +2977,8 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
 'pageinfo-protect-cascading-from' => 'Protezzjoni li tintiret minn',
 
 # Skin names
-'skinname-standard' => 'Classic',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Cologne Blue',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Modern',
 
 # Patrolling
@@ -3096,7 +3083,7 @@ Oħrajn jiġu moħbija kif inhu definit oriġinarjament.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => "Wisa'",
 'exif-imagelength' => 'Għoli',
 'exif-bitspersample' => 'Bits għal kull komponent',
@@ -3274,7 +3261,7 @@ Oħrajn jiġu moħbija kif inhu definit oriġinarjament.
 'exif-originalimageheight' => 'Għoli tal-istampa qabel ma ġiet maqtugħa',
 'exif-originalimagewidth' => "Wisa' tal-istampa qabel ma ġiet maqtugħa",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'L-Ebda',
 
 'exif-copyrighted-true' => 'Protetta bil-copyright',
@@ -3574,7 +3561,6 @@ Jekk jogħġbok konferma jekk vera trid terġa' toħloq din il-paġna.",
 
 # Separators for various lists, etc.
 'semicolon-separator' => ';',
-'autocomment-prefix' => '-',
 
 # Multipage image navigation
 'imgmultipageprev' => "← il-paġna ta' qabel",
@@ -3674,7 +3660,6 @@ Inti tista' wkoll tuża' l-[[Special:EditWatchlist|editur bl-interfaċċa standa
 'version-other' => 'Oħrajn',
 'version-mediahandlers' => 'Imradd tal-medja',
 'version-hooks' => 'Hook',
-'version-extension-functions' => 'Funzjonijiet tal-estensjoni',
 'version-parser-extensiontags' => "Tikketti magħrufa mill-''parser'' introdotti minn estensjonijiet",
 'version-parser-function-hooks' => "''Hooks'' għal funzjonijiet tal-''parser''",
 'version-hook-name' => 'Isem tal-hook',
@@ -3695,12 +3680,8 @@ Flimkien ma' dan il-programm suppost kellek tirċievi [{{SERVER}}{{SCRIPTPATH}}/
 'version-entrypoints-header-entrypoint' => "Punt ta' dħul",
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Post tal-fajl',
-'filepath-page' => 'Fajl:',
-'filepath-submit' => 'Mur',
-'filepath-summary' => "Din il-paġna speċjali tagħti lura l-indirizz komplet tal-posta għal fajl.
-Stampi huwa mogħrija b'risoluzzjoni sħiħa, tipi tal-fajl oħrajn jibdew bil-program assoċjat magħhom direttament.",
+# Special:Redirect
+'redirect-submit' => 'Mur',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Fittex fajls duplikati',
diff --git a/languages/messages/MessagesMwl.php b/languages/messages/MessagesMwl.php
index a0f38323..3fe13d1c 100644
--- a/languages/messages/MessagesMwl.php
+++ b/languages/messages/MessagesMwl.php
@@ -107,9 +107,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Rebelar l miu andereço de correio eiletrónico nas noteficaçones',
 'tog-shownumberswatching' => "Amostrar l númaro d'outelizadores a begiar",
 'tog-fancysig' => 'Tratar assinatura cumo wikitesto (sin lhigaçon outomática)',
-'tog-externaleditor' => 'Por oumisson, outelizar un eiditor sterno (solo para outelizadores abançados, eisige cunfiguraçones adecionales ne l tou cumputador)',
-'tog-externaldiff' => 'Por oumisson, outelizar defrenças sternas (solo para outelizadores abançados, eisige cunfiguraçones adicionales ne l tou cumputador)',
-'tog-showjumplinks' => 'Posseblitar lhigaçones d\'acessibelidade "{{ant:jumpto}}"',
 'tog-uselivepreview' => "Ousar l'antebison an tiempo rial (JavaScrit) (Spurmental)",
 'tog-forceeditsummary' => 'Abisar-me al antroduzir un sumairo bazio',
 'tog-watchlisthideown' => 'Scunder las mies eidiçones al lhistar mudanças a las páiginas begiadas',
@@ -265,7 +262,7 @@ $messages = array(
 'jumptonavigation' => 'nabegaçon',
 'jumptosearch' => 'percura',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Subre {{SITENAME}}',
 'aboutpage' => 'Project:Subre',
 'copyright' => 'Cuntenido çponible subre la lhicença $1.',
@@ -275,7 +272,6 @@ $messages = array(
 'disclaimers' => 'Abiso de Cuntenido',
 'disclaimerpage' => 'Project:Abiso giral',
 'edithelp' => 'Ajuda de eidiçon',
-'edithelppage' => 'Help:Eiditar',
 'helppage' => 'Help:Cuntenidos',
 'mainpage' => 'Páigina Percipal',
 'mainpage-description' => 'Páigina Percipal',
@@ -555,7 +551,6 @@ Legenda: (atu) = defrénças de la berson atual,
 'prevn' => 'anteriores {{PLURAL:$1|$1}}',
 'nextn' => 'próssimos {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Ber ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Conteúdos',
 'searchprofile-images' => 'Multimédia',
 'searchprofile-everything' => 'Todo',
 'searchprofile-advanced' => 'Abançado',
@@ -685,7 +680,6 @@ Causo l çponiblizes, este será outelizado pa te dar crédito pul tou trabalho.
 'recentchangeslinked-feed' => 'Alterações relacionadas',
 'recentchangeslinked-toolbox' => 'Alterações relacionadas',
 'recentchangeslinked-title' => 'Altaraçones que ténen a ber cun "$1"',
-'recentchangeslinked-noresult' => 'Nun houbo alteraçones an páiginas relacionadas ne l anterbalo de tiempo.',
 'recentchangeslinked-summary' => "Esta páigina special amostra las redadeiras altaraçones de páiginas que téngan ua lhigaçon a outra (ó de nembros dua catadorie speceficada).
 Páiginas que steian ne ls [[Special:Watchlist|tous begiados]] son amostradas an '''negrito'''.",
 'recentchangeslinked-page' => 'Nome de la páigina:',
@@ -770,8 +764,6 @@ Páiginas que steian ne ls [[Special:Watchlist|tous begiados]] son amostradas an
 'statistics-views-total' => 'Total de bejitas',
 'statistics-users-active' => 'Outelizadores atibos',
 
-'disambiguations' => 'Páigina de zambiguaçon',
-
 'doubleredirects' => 'Ancaminamientos duplos',
 
 'brokenredirects' => 'Ancaminamientos scachados',
@@ -1087,13 +1079,8 @@ Por fabor, scuolhe outro nome.',
 Premite ajuntar la rezon de la eidiçon ne l sumário.',
 
 # Skin names
-'skinname-standard' => 'Clássico',
-'skinname-nostalgia' => 'Suidade',
 'skinname-cologneblue' => 'Azul',
 'skinname-monobook' => 'Lhibro',
-'skinname-myskin' => 'Piel',
-'skinname-chick' => 'Cipe-Çape',
-'skinname-simple' => 'Simpre',
 'skinname-modern' => 'Moderno',
 
 # Browsing diffs
@@ -1138,7 +1125,7 @@ Causo l fexeiro tenga sido demudado a partir de l sou stado oureginal, alguns de
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ancho',
 'exif-imagelength' => 'Altura',
 'exif-imagedescription' => 'Títalo de la eimaige',
@@ -1213,11 +1200,6 @@ Causo l fexeiro tenga sido demudado a partir de l sou stado oureginal, alguns de
 'version-software-product' => 'Perduto',
 'version-software-version' => 'Berson',
 
-# Special:FilePath
-'filepath' => 'Camino de l fexeiro',
-'filepath-page' => 'Fexeiro',
-'filepath-submit' => 'Camino',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Nome de l fexeiro',
 'fileduplicatesearch-submit' => 'Percurar',
diff --git a/languages/messages/MessagesMy.php b/languages/messages/MessagesMy.php
index bbfd1b84..4edacf7e 100644
--- a/languages/messages/MessagesMy.php
+++ b/languages/messages/MessagesMy.php
@@ -100,6 +100,7 @@ $messages = array(
 'tog-ccmeonemails' => 'ကျွန်ုပ် အခြားအသုံးပြုသူများထံပို့သော အီးမေးမိတ္တူကို ကျွန်ုပ်ထံ ပြန်ပို့ရန်',
 'tog-diffonly' => 'ကွဲပြားမှုများအောက်ရှိ စာမျက်နှာတွင်ပါဝင်သည်များကို မပြပါနှင့်',
 'tog-showhiddencats' => 'ဝှက်ထားသော ကဏ္ဍများကို ပြရန်',
+'tog-useeditwarning' => 'မသိမ်းရသေးသော ပြောင်းလဲမှုများ နှင့် တည်းဖြတ်ဆဲစာမျက်နှာမှ ထွက်သွားလျှင် သတိပေးပါ',
 
 'underline-always' => 'အမြဲ',
 'underline-never' => 'ဘယ်သောအခါမျှ',
@@ -163,6 +164,18 @@ $messages = array(
 'oct' => 'အောက်',
 'nov' => 'နို',
 'dec' => 'ဒီ',
+'january-date' => 'ဇန်နဝါရီ $1',
+'february-date' => 'ဖေဖော်ဝါရီ $1',
+'march-date' => 'မတ် $1',
+'april-date' => 'ဧပြီ $1',
+'may-date' => 'မေ $1',
+'june-date' => 'ဂျွန် $1',
+'july-date' => 'ဂျူလိုင် $1',
+'august-date' => 'ဩဂုတ် $1',
+'september-date' => 'စက်တင်ဘာ $1',
+'october-date' => 'အောက်တိုဘာ $1',
+'november-date' => 'နိုဝင်ဘာ $1',
+'december-date' => 'ဒီဇင်ဘာ $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|ကဏ္ဍ|ကဏ္ဍ}}',
@@ -284,7 +297,7 @@ $messages = array(
 $1',
 'pool-errorunknown' => 'အမည်မသိအမှား',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} အကြောင်း',
 'aboutpage' => 'Project: အကြောင်းအရာ',
 'copyright' => '$1 အောက်တွင် ဤအကြောင်းအရာကို ရရှိနိုင်သည်။',
@@ -294,7 +307,6 @@ $1',
 'disclaimers' => 'သတိပြုစရာများ',
 'disclaimerpage' => 'Project: အထွေထွေ သတိပြုဖွယ်',
 'edithelp' => 'ပြင်​ဆင်​ရန် အ​ကူ​အ​ညီ​',
-'edithelppage' => 'Help: တည်းဖြတ်ခြင်း',
 'helppage' => 'Help: မာတိကာ',
 'mainpage' => 'ဗဟိုစာမျက်နှာ',
 'mainpage-description' => 'ဗ​ဟို​စာ​မျက်​နှာ​',
@@ -453,7 +465,7 @@ $1',
 'newpassword' => 'စကားဝှက် အသစ် -',
 'retypenew' => 'စကားဝှက် အသစ်ကို ထပ်ရိုက်ပါ -',
 'resetpass_submit' => 'စကားဝှက်ကို သတ်မှတ်ပြီးနောက် Log in ဝင်ရန်',
-'resetpass_success' => 'သင့်စကားဝှက်ကို အောင်မြင်စွာ ပြောင်းလဲပြီးပါပြီ။ အခု Log in ဝင်နေပါပြီ...',
+'changepassword-success' => 'သင့်စကားဝှက်ကို အောင်မြင်စွာ ပြောင်းလဲပြီးပါပြီ။ အခု Log in ဝင်နေပါပြီ...',
 'resetpass_forbidden' => 'စကားဝှက် ပြောင်းမရနိုင်ပါ',
 'resetpass-no-info' => 'ဤစာမျက်နှာကို တိုက်ရိုက်အသုံးပြုနိုင်ရန်အတွက် Log in ဝင်ထားရပါမည်။',
 'resetpass-submit-loggedin' => 'စကားဝှက်ပြောင်းရန်',
@@ -677,7 +689,6 @@ Legend: '''({{int:cur}})''' = နောက်ဆုံးမူနှင့် 
 'searchmenu-legend' => 'ရှာဖွေရန် ရွေးချယ်မှု',
 'searchmenu-exists' => "'''ဤဝီကီတွင် \"[[:\$1]]\" အမည်နှင့် စာမျက်နှာတစ်ခုရှိသည်။'''",
 'searchmenu-new' => "'''ဤဝီကီတွင် \"[[:\$1]]\" အမည်နှင့် စာမျက်နှာကို ဖန်တီးပါ။'''",
-'searchhelp-url' => 'Help: မာတိကာ',
 'searchprofile-articles' => 'မာတိကာစာမျက်နှာများ',
 'searchprofile-project' => 'အကူအညီနှင့် ပရောဂျက်စာမျက်နှာများ',
 'searchprofile-images' => 'မာလတီမီဒီယာ',
@@ -720,13 +731,6 @@ Try prefixing your query with ''all:'' to search all content (including talk pag
 'powersearch-togglenone' => 'အမည်ညွှန်းမရှိ',
 'search-external' => 'အပြင်တွင် ရှာရန်',
 
-# Quickbar
-'qbsettings-none' => 'အမည်ညွှန်းမရှိ',
-'qbsettings-fixedleft' => 'ဘယ်ဘက်ကို အသေထားရန်',
-'qbsettings-fixedright' => 'ညာဘက်ကို အသေထားရန်',
-'qbsettings-floatingleft' => 'ဘယ်ဘက်ကို အရှင်ထားရန်',
-'qbsettings-floatingright' => 'ညာဘက်ကို အရှင်ထားရန်',
-
 # Preferences page
 'preferences' => '​ရွေး​ချယ်​စ​ရာ​များ​',
 'mypreferences' => '​ရွေး​ချယ်​စ​ရာ​များ​',
@@ -753,7 +757,6 @@ Try prefixing your query with ''all:'' to search all content (including talk pag
 'resetprefs' => 'မသိမ်းရသေးသော အပြောင်းအလဲများကို ရှင်းလင်းရန်',
 'restoreprefs' => 'မူလဆက်တင်များသို့ အားလုံး ပြန်ပြောင်းရန်',
 'prefs-editing' => 'တည်းဖြတ်ခြင်း',
-'prefs-edit-boxsize' => 'တည်းဖြတ်သည့် သေတ္တာအရွယ်အစား။',
 'rows' => 'အလျားလိုက်တန်း -',
 'columns' => 'ဒေါင်လိုက်တန်း -',
 'searchresultshead' => 'ရှာ​ဖွေ​ရန်​',
@@ -789,7 +792,6 @@ Try prefixing your query with ''all:'' to search all content (including talk pag
 'prefs-custom-css' => 'စိတ်ကြိုက် CSS',
 'prefs-custom-js' => 'စိတ်ကြိုက် Javascript',
 'prefs-emailconfirm-label' => 'အီးမေးအတည်ပြုရန်',
-'prefs-textboxsize' => 'တည်းဖြတ်မှုဝင်းဒိုး၏အရွယ်အစား',
 'youremail' => 'အီး​မေး -',
 'username' => 'အသုံးပြုသူအမည် -',
 'uid' => 'အသုံးပြုသူ ​ID -',
@@ -979,7 +981,6 @@ Your e-mail address is not revealed when other users contact you.
 'recentchangeslinked-feed' => 'ဆက်စပ်သော ​အ​ပြောင်း​အ​လဲ​များ​',
 'recentchangeslinked-toolbox' => 'ဆက်​စပ်​သော​အ​ပြောင်း​အ​လဲ​များ​',
 'recentchangeslinked-title' => '"$1" နှင့် ဆက်စပ်သော အပြောင်းအလဲများ',
-'recentchangeslinked-noresult' => 'ပေးထားသော အချိန်အတွင်း လင့်ချိတ်ထားသော စာမျက်နှာများတွင် အပြောင်းအလဲမရှိပါ။',
 'recentchangeslinked-summary' => 'ဤသည်မှာ သီးသန့်ပြထားသော စာမျက်နှာ (သို့ သီးသန့်ကဏ္ဍများ) မှ ညွှန်းထားသော စာမျက်နှာများ၏ လတ်တလော ပြောင်းလဲမှုများ၏ စာရင်းဖြစ်သည်။ [[Special:Watchlist|စောင့်ကြည့်စာရင်း]] မှ စာမျက်နှာများကို စာလုံးမည်းဖြင့် ပြထားသည်။',
 'recentchangeslinked-page' => 'စာမျက်နှာ အမည် -',
 'recentchangeslinked-to' => 'ပေးထားသော စာမျက်နှာများအစား လင့်များနှင့် ဆက်စပ်နေသာ စာမျက်နှာများ၏ အပြောင်းအလဲများကို ပြရန်',
@@ -1053,7 +1054,6 @@ Your e-mail address is not revealed when other users contact you.
 
 # HTTP errors
 'http-invalid-url' => 'တရားမဝင်သော URL လင့် - $1',
-'http-host-unreachable' => 'URL လင့်သို့ သွားမရပါ။',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL လင့်သို့ သွားမရပါ',
@@ -1165,8 +1165,6 @@ Your e-mail address is not revealed when other users contact you.
 'statistics-users-active' => 'လက်ရှိလုပ်ကိုင်နေသော အသုံးပြုသူများ',
 'statistics-mostpopular' => 'အများဆုံးကြည့်သော စာမျက်နှာများ',
 
-'disambiguationspage' => 'Template:သံတူကြောင်းကွဲများ',
-
 'doubleredirects' => 'နှစ်ဆင့်ပြန် ပြန်ညွှန်းများ',
 'double-redirect-fixed-move' => '[[$1]] ကို ရွှေ့ပြောင်းပြီးဖြစ်သည်။ ယခုအခါ [[$2]] သို့ ပြန်ညွှန်းထားသည်။',
 
@@ -1511,8 +1509,6 @@ Your e-mail address is not revealed when other users contact you.
 'block-log-flags-hiddenname' => 'အသုံးပြုသူအမည် ဝှက်ထားသည်',
 'ipb_expiry_invalid' => 'သက်တမ်းကုန်လွန်မည့် အချိန်သည် တရားမဝင်ပါ။',
 'ipb_already_blocked' => '"$1" ကို အစကတည်းက ပိတ်ထားသည်',
-'blockme' => 'ကျွန်ုပ်ကို ပိတ်ရန်',
-'proxyblocksuccess' => 'ပြီးပါပြီ။',
 
 # Move page
 'move-page' => '$1 ကို ရွှေ့ရန်',
@@ -1717,7 +1713,7 @@ Your e-mail address is not revealed when other users contact you.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'အကျယ်',
 'exif-imagelength' => 'အမြင့်',
 'exif-bitspersample' => 'အစိတ်အပိုင်းတစ်ခုတွင်ပါဝင်သော အပိုင်းငယ်များ',
@@ -1847,11 +1843,6 @@ Your e-mail address is not revealed when other users contact you.
 'version-software-product' => 'ထုတ်ကုန်',
 'version-software-version' => 'ဗားရှင်း',
 
-# Special:FilePath
-'filepath' => 'ဖိုင်လမ်းကြောင်း',
-'filepath-page' => 'ဖိုင်:',
-'filepath-submit' => 'သွား',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'နှစ်ခုထပ်နေသောဖိုင်များကို ရှာရန်',
 'fileduplicatesearch-legend' => 'နှစ်ခုထပ်နေသည်ကို ရှာရန်',
diff --git a/languages/messages/MessagesMyv.php b/languages/messages/MessagesMyv.php
index ea9c1e88..e24ad45a 100644
--- a/languages/messages/MessagesMyv.php
+++ b/languages/messages/MessagesMyv.php
@@ -216,9 +216,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Невтемс зяро теицятнеде, конат аравтызь лопанть эсест ванома лемрисьментень',
 'tog-oldsig' => 'Уликс кедьпутовксось:',
 'tog-fancysig' => 'Лемпутовксось прок викитекст (сонсь теевиця сюлмавома певтеме)',
-'tog-externaleditor' => 'Нолдамс тевс ушоёнонь витнемканть, зярс лиякс апак аравто (ансяк тевень содыйтненень, арсий машинасот эрявить башка ёнкст-аравтомат [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
-'tog-externaldiff' => 'Нолдамс тевс ушоёнонь diff, зярс лиякс апак аравто (ансяк тевень содыйтненень, арсий машинасот эрявить башка ёнкст-аравтомат [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
-'tog-showjumplinks' => 'Меремс "тёкадемс" маласпонгомань сюлмавомапетнес',
 'tog-uselivepreview' => 'Максомс эряй васнянь невтевкс (JavaScript) (Варчамонь)',
 'tog-forceeditsummary' => 'Невтик монень, мезе сёрмадомс витнемадо-петнемадо ёвтамонь вальминентень',
 'tog-watchlisthideown' => 'Кекшить монь теевть витневкстнэнь ванома лемрисьменть эйстэ',
@@ -406,7 +403,7 @@ $messages = array(
 'jumptosearch' => 'вешнэме',
 'pool-errorunknown' => 'Апак содань ильведькс',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} ланга',
 'aboutpage' => 'Project:Эстэдензэ',
 'copyright' => '$1-сто муят мезе тесэ.',
@@ -416,7 +413,6 @@ $messages = array(
 'disclaimers' => 'Видечинь кортамотне',
 'disclaimerpage' => 'Project:Видечинь прякс кортнема',
 'edithelp' => 'Витнемань-петнемань лезкс',
-'edithelppage' => 'Help:Витнема-петнема',
 'helppage' => 'Help:Лопась мезе кирди',
 'mainpage' => 'Прякслопа',
 'mainpage-description' => 'Прякслопа',
@@ -514,7 +510,6 @@ $messages = array(
 'actionthrottled' => 'Тев тееманть курокксчизэ киртязь',
 'protectedpagetext' => 'Те лопась панжома экшсэ, илязо понго витнемс-петнемс эли лия тевс.',
 'viewsourcetext' => 'Те лопанть лисьмапрясь маштови ваномскак, лангстонзо саемс копияяк:',
-'sqlhidden' => '(SQL вешнемась кекшезь)',
 'namespaceprotected' => "'''$1''' лемпотмосонть арась видечить витнемс-петнемс лопатнесэ.",
 'ns-specialprotected' => '{{ns:special}} лем марто лопатне а витневить-петневить.',
 'titleprotected' => "Те коняксонть ванстызе [[Теиця:$1|$1]], кияк иляссо тее.
@@ -531,7 +526,6 @@ $messages = array(
 'yourpassword' => 'Салава валот:',
 'yourpasswordagain' => 'Омбоцеде сёрмадык кирдицянь леметь:',
 'remembermypassword' => 'Ледстемс совамом те бравзерсэнть (сех кувать $1 {{PLURAL:$1|чи|чить}})',
-'securelogin-stick-https' => 'Кирдемс "HTTPS" сюлмавкс совамодо мейлеяк',
 'yourdomainname' => 'Эсеть доменэть:',
 'password-change-forbidden' => 'Те викисэнть а полавтсак салававалот.',
 'login' => 'Совамо',
@@ -606,7 +600,7 @@ $messages = array(
 'newpassword' => 'Од совамо валот:',
 'retypenew' => 'Сёрмадык омбоцеде совамо валот:',
 'resetpass_submit' => 'Тештик совамо валот ды совак',
-'resetpass_success' => 'Совамо валот полавтовсь теть! Совавтыть эйсэть системас...',
+'changepassword-success' => 'Совамо валот полавтовсь теть! Совавтыть эйсэть системас...',
 'resetpass_forbidden' => 'Совамо валтнэ а полавтовить',
 'resetpass-submit-loggedin' => 'Полавтомс совамо валот',
 'resetpass-submit-cancel' => 'Саемс мекев',
@@ -855,7 +849,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'searchmenu-legend' => 'Вешнемань аравтомкат',
 'searchmenu-exists' => "'''Те викисэнть ули \"[[\$1]]\" лем марто лопа'''",
 'searchmenu-new' => "'''Шкик \"[[:\$1]]\" лопанть те викисэнть!'''",
-'searchhelp-url' => 'Help:Лопась мезе кирди',
 'searchprofile-articles' => 'Потмокс лопат',
 'searchprofile-project' => 'Лезкс ды проекттэ лопат',
 'searchprofile-images' => 'Мультимедия',
@@ -892,14 +885,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'powersearch-togglenone' => 'Арась мезе невтемс',
 'search-external' => 'Ушо йондонь вешнема',
 
-# Quickbar
-'qbsettings' => 'Навигациянь лазнэ',
-'qbsettings-none' => 'Арась мезе невтемс',
-'qbsettings-fixedleft' => 'Керш ёндо кирдезь',
-'qbsettings-fixedright' => 'Вить ёндо кирдезь',
-'qbsettings-floatingleft' => 'Керш ёнга уи',
-'qbsettings-floatingright' => 'Вить ёнга уи',
-
 # Preferences page
 'preferences' => 'Аравтомат',
 'mypreferences' => 'Аравтомат',
@@ -929,7 +914,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'resetprefs' => 'Нардамс апак вансто полавтнемат',
 'restoreprefs' => 'Велявтомс мекев весе ушодкс ладсематнень',
 'prefs-editing' => 'Витнема-петнема',
-'prefs-edit-boxsize' => 'Витнема-петнема вальманть сэрензэ-келензэ.',
 'rows' => 'Валчилькстнэ (строкатне):',
 'columns' => 'Палманть:',
 'searchresultshead' => 'Вешнема',
@@ -958,7 +942,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'prefs-namespaces' => 'Лем потмот',
 'default' => 'зярдо лиякс апак йовта',
 'prefs-files' => 'Файлат',
-'prefs-textboxsize' => 'Витнемань-петнемань вальманть покшолмазо',
 'youremail' => 'Е-сёрма:',
 'username' => 'Теицянь леметь:',
 'uid' => 'Теицянь ID:',
@@ -1117,7 +1100,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'recentchangeslinked-feed' => 'Сюлмавозь лиякстоматне',
 'recentchangeslinked-toolbox' => 'Сюлмавозь лиякстоматне',
 'recentchangeslinked-title' => 'Полавтнемат-лиякстомтомат конат кандовить теватезэнь "$1"',
-'recentchangeslinked-noresult' => 'Максозь шкастонть кодаткак полавтовомат сюлмавозь лопатнесэ арасельть.',
 'recentchangeslinked-summary' => "Тесэ максозь меельсе шкань витнемат-петнемат, конат теезельть башка максозь лопа вельде (эли категорияс совавтовиця тевнес). Ванома лопасот лопатне максозь '''эчкстэ тештезь'''",
 'recentchangeslinked-page' => 'Лопанть лемезэ:',
 'recentchangeslinked-to' => 'Тень таркас невтить те лопанть марто сюлмазь лопатнесэ полавтнематнень',
@@ -1294,9 +1276,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'statistics-users-active' => 'Чистэ лисийть-совийть',
 'statistics-mostpopular' => 'Весемеде сеедьстэ ванозь лопат',
 
-'disambiguations' => 'Лопат, конатне сюлмазь чарькодевтемань ламо терминэнь лопас',
-'disambiguationspage' => 'Template:смустень коряс явома',
-
 'doubleredirects' => 'Кавксть ютавтозь',
 'double-redirect-fixer' => 'Печтевтемс витнема-петнема пель',
 
@@ -1659,8 +1638,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'block-log-flags-noemail' => 'е-сёрма озавтозь саймес',
 'block-log-flags-hiddenname' => 'лисиенть-совиенть лемезэ кекшезь',
 'ipb_already_blocked' => '"$1" уш саймас саезь',
-'blockme' => 'Озавтомак саймес',
-'proxyblocksuccess' => 'Озавтовсь.',
 
 # Developer tools
 'lockdb' => 'Сёлгомс датабазанть',
@@ -1856,10 +1833,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'pageinfo-authors' => 'Весемезэ зяро авторонзо',
 
 # Skin names
-'skinname-standard' => 'Классикань',
-'skinname-nostalgia' => 'ОдПингеньМазы',
-'skinname-myskin' => 'ЭсьМелемКоряс',
-'skinname-simple' => 'Шожда',
 'skinname-modern' => 'НееньШкань',
 
 # Patrolling
@@ -1928,7 +1901,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Келе',
 'exif-imagelength' => 'Сэрь',
 'exif-bitspersample' => 'Эрьва компонентс зяро битт',
@@ -1980,7 +1953,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'exif-languagecode' => 'Кель',
 'exif-iimcategory' => 'Явовкс',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Апак сювордо',
 
 'exif-unknowndate' => 'Апак содань чи',
@@ -2188,11 +2161,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'version-software-product' => 'Шкавкс-нолдавкс',
 'version-software-version' => 'Верзия',
 
-# Special:FilePath
-'filepath' => 'Файлас яннэ',
-'filepath-page' => 'Файлась:',
-'filepath-submit' => 'Ютак',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Вешнэмс кавтаське файлат',
 'fileduplicatesearch-legend' => 'Вешнэмс кавтаське',
diff --git a/languages/messages/MessagesMzn.php b/languages/messages/MessagesMzn.php
index 339f1777..c9032565 100644
--- a/languages/messages/MessagesMzn.php
+++ b/languages/messages/MessagesMzn.php
@@ -156,9 +156,6 @@ $messages = array(
 'tog-shownumberswatching' => 'دمبالکرونِ سِراق هدائن',
 'tog-oldsig' => 'پیش نیمایش ایمضای موجود:',
 'tog-fancysig' => 'ایمضا ره ویکی متن نظر بیرین (بدون لینک هایتن)',
-'tog-externaleditor' => 'به شیکل پیش فرض خارجی ویرایشگرون جه ایستیفاده بواشه',
-'tog-externaldiff' => 'ایستیفاده از تفاوت‌گیر جه (diff) خارجی به‌طور پیش‌فرض.',
-'tog-showjumplinks' => 'فعال هکردن بپرسنی پیوندون مندرجات فهرست دله',
 'tog-uselivepreview' => 'ایستیفاده از پیش نیمایش زنده (جاوا اسکریپ) (جدیده)',
 'tog-forceeditsummary' => 'زمونی که خولاصه دچی‌ین ره ننویشتمه مه ره بائو',
 'tog-watchlisthideown' => 'دپوشنی‌ین کارای من پیگریای ِفهرست دله',
@@ -351,7 +348,7 @@ $2، $1',
 'pool-queuefull' => 'مخزن ِصف پر بیّه',
 'pool-errorunknown' => 'خطای ناشناخته',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} درباره',
 'aboutpage' => 'Project:درباره',
 'copyright' => 'این صفحه ره بَنوشته‌ئون  $1  زیر شِمه دسـت دَرنه.',
@@ -361,7 +358,6 @@ $2، $1',
 'disclaimers' => 'تکذیب‌نومه‌ئون',
 'disclaimerpage' => 'Project:تکذیب‌نومه',
 'edithelp' => 'دچی‌ین رانما',
-'edithelppage' => 'Help:دَچی‌ین',
 'helppage' => 'Help:راهنما',
 'mainpage' => 'گت صفحه',
 'mainpage-description' => 'گت صفحه',
@@ -439,19 +435,6 @@ $2، $1',
 # General errors
 'error' => 'خِطا',
 'databaseerror' => 'خطای داده‌ئون پایگا',
-'dberrortext' => 'اشکال نحوی بخاستن دله برسنی‌یه بیّه به پایگاه داده.
-دلیل این مشکل بتونده ایرادی نرم‌افزار دله بائه.
-آخرین بخاسته‌یی که پایگاه وسّه برسنی‌بیَ‌بی‌یه اینتا بی‌یه:
-<blockquote style="direction:ltr;"><tt>$1</tt></blockquote>
-این بخاسته درون عملگر «<span class="ltr"><tt>$2</tt></span>» جه برسنی بیّه.
-پایگاه داده این خطا ره بردگاردنی‌یه:
-<div class="ltr"><tt>$3: $4</tt></div>',
-'dberrortextcl' => 'اشکال نحوی در درخواست فرستاده شده به پایگاه داده رخ داد.
-آخرین درخواست که برای پایگاه داده فرستاد شد این بود:
-<div class="ltr">$1</div>
-این درخواست از درون عملگر «<span class="ltr">$2</span>» فرستاده شد.
-پایگاه داده این خطا را بازگرداند:
-<div class="ltr">$3: $4</div>',
 'laggedslavemode' => "'''هشدار:''' صفحه ممکن هسته که جدید ِبه‌روزرسانی‌ئون ره شامل نواشه.",
 'readonly' => 'پایگاه داده زلفن بزه‎بیّه',
 'enterlockreason' => 'دلیلی زلفین بزوئن وسّه بارین، که حاوی تقریبی از زمونی بائه که زلفین بَیته وانه',
@@ -501,14 +484,12 @@ $2، $1',
 'viewsourcetext' => 'بتونّی متن مبدأ این صفحه ره هارشین یا ونجه نسخه بَیرین:',
 'viewyourtext' => "بتونّی '''شه بنویشته چیون''' مبدأ ره این صفحه دله هارشین و کپی هاکنین:",
 'protectedinterface' => 'این صفحه ارائه‌دهندهٔ متنی واسط کارور این نرم‌افزار هسته و به منظور پیشگیری از خرابکاری زلفین بزه‌بیّه.',
-'sqlhidden' => '(دستور اس‌کیوال دپوشنی‌یه بیّه)',
 
 # Login and logout pages
 'yourname' => 'شمه کاروری‌نوم:',
 'yourpassword' => 'شمه پسورد',
 'yourpasswordagain' => 'پسورد ره دِباره بنویس',
 'remembermypassword' => 'مه رمز ره (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) این مرورگر سر یاد نکان',
-'securelogin-stick-https' => 'HTTPS دله بموئن په، متصل بموند',
 'yourdomainname' => 'شمه کاروری نوم',
 'login' => 'دله بوردن',
 'nav-login-createaccount' => 'دله بوردن / عضو بیّن',
@@ -791,8 +772,6 @@ $2، $1',
 # Statistics
 'statistics' => 'آمار',
 
-'disambiguations' => 'گجگجی‌بَیری صفحه‌ئون',
-
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|بایت|بایت}}',
 'specialpage-empty' => 'این صفحه دله هچّی دَنی‌یه',
@@ -850,7 +829,6 @@ $2، $1',
 'watchthispage' => 'این صفحه ره دِمبال هاکارد‌ن',
 'unwatch' => 'ده‌مـبـال نـه‌کـارده‌ن',
 'unwatchthispage' => 'دیگه این صفحه ره دمبال نکاردن',
-'watchnochange' => 'هیچ‌کادوم از چیزایی که شِما دمبال کانـّی چن وقته عوض نینه.',
 'watchlist-details' => 'بدون حیساب گپ ولگ‌ئون، {{PLURAL:$1|$1 صفحه|$1 صفحه}} شمه دمبال‌هاکردنی‌ئون میون قرار {{PLURAL:$1|دارنه|دانه}}.',
 'wlheader-enotif' => '*تونی ایمیل جه مطلع بواشین.',
 'wlheader-showupdated' => "*صفحه‌ئونی که بعد از آخرین سربزوئنتون عوض بینه '''پر رنگ''' نشون هدائه بیّه.",
@@ -1033,12 +1011,12 @@ $2، $1',
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1, $2×$3',
 
-# EXIF tags
+# Exif tags
 'exif-gpsareainformation' => 'جی پی اس ناحیه نوم',
 'exif-gpsdatestamp' => 'جی پی اس روز',
 'exif-gpsdifferential' => 'جی پی اس په‌چه‌ک درس هأکه‌ردن',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'فه‌شورده نئی',
 
 'exif-unknowndate' => 'نه‌شناسی روز',
diff --git a/languages/messages/MessagesNa.php b/languages/messages/MessagesNa.php
index 8493fa19..c0296523 100644
--- a/languages/messages/MessagesNa.php
+++ b/languages/messages/MessagesNa.php
@@ -97,7 +97,7 @@ $messages = array(
 # Special:AllPages
 'allpagessubmit' => 'nuwa ko',
 
-# Email user
+# E-mail user
 'emailuser' => 'Emaileiy amune',
 'emailfrom' => 'Atsiu',
 'emailto' => 'Animwen',
diff --git a/languages/messages/MessagesNah.php b/languages/messages/MessagesNah.php
index ee320b78..a9224e77 100644
--- a/languages/messages/MessagesNah.php
+++ b/languages/messages/MessagesNah.php
@@ -277,7 +277,7 @@ $messages = array(
 'jumptonavigation' => 'nènemòwalistli',
 'jumptosearch' => 'tlatēmoliztli',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Ītechcopa {{SITENAME}}',
 'aboutpage' => 'Project:Ītechcopa',
 'copyright' => 'Tlahcuilōltzin cah yōllōxoxouhqui īpan $1',
@@ -286,7 +286,6 @@ $messages = array(
 'currentevents-url' => 'Project:Āxcāncāyōtl',
 'disclaimers' => 'Nahuatīllahtōl',
 'edithelp' => 'Tlapatlaliztechcopa tēpalēhuiliztli',
-'edithelppage' => 'Help:¿Quēn motlahcuiloa cē zāzanilli?',
 'helppage' => 'Help:Tlapiyaliztli',
 'mainpage' => 'Achkàuhìxtlapalli',
 'mainpage-description' => 'Achkàuhìxtlapalli',
@@ -367,7 +366,6 @@ Hueliz quimpiya tlahtōl tlein ahmo mohuelītih motequitiltia tōcāpan.',
 'viewsource' => 'Tiquittāz tlahtōlcaquiliztilōni',
 'actionthrottled' => 'Tlachīhualiztli ōmotzacuili',
 'viewsourcetext' => 'Tihuelīti tiquitta auh ticcopīna inīn zāzanilli ītlahtōlcaquiliztilōni:',
-'sqlhidden' => '(Tlatēmoliztli SQL omotlāti)',
 'namespaceprotected' => "Ahmo tiquihuelīti tiquimpatla zāzaniltin īpan '''$1'''.",
 'ns-specialprotected' => 'In nònkuâkìskàtlaìxtlapaltìn awel ìmpan nemàtilòs mokinyèktlàlis.',
 'titleprotected' => "Inīn zāzanilli ōmoquīxti ic tlachīhualiztli ic [[User:$1|$1]].
@@ -432,7 +430,7 @@ Occeppa xicalaqui niman ticmatīz.',
 'newpassword' => 'Yancuīc motlahtōlichtacayo:',
 'retypenew' => 'Occeppa xiquihcuiloa yancuīc motlahtōlichtacayo:',
 'resetpass_submit' => 'Xicpatlāz motlahtōlichtacāyo auh xicalaquīz',
-'resetpass_success' => '¡Cualli ōmopatlac motlahtōlichtacāyo! Āxcān ticalaquicah...',
+'changepassword-success' => '¡Cualli ōmopatlac motlahtōlichtacāyo! Āxcān ticalaquicah...',
 'resetpass_forbidden' => 'Tlahtōlichtacayōtl ahmo mohuelītih mopatlah',
 'resetpass-submit-loggedin' => 'Ticpatlāz motlahtōlichtacāyo',
 'resetpass-submit-cancel' => 'Ticcuepāz',
@@ -601,7 +599,6 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'viewprevnext' => 'Xiquintta ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Ye ia zāzanilli ītōca \"[[\$1]]\" inīn huiquipan'''",
 'searchmenu-new' => "'''Tihuelīti ticchīhuāz zāzanilli ītōca \"[[:\$1]]\" inīn huiquipan'''",
-'searchhelp-url' => 'Help:Tlapiyaliztli',
 'searchprofile-articles' => 'Tlapiyaliztli zāzanilli',
 'searchprofile-project' => 'Tēpalēhuiliztli īhuān īxiptlahtli āmatl',
 'searchprofile-images' => 'Nepapan media',
@@ -629,9 +626,6 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'powersearch-togglenone' => 'Ahtlein',
 'search-external' => 'Tlatēmotiliztli calāmpa',
 
-# Quickbar
-'qbsettings-none' => 'Ahtlein',
-
 # Preferences page
 'preferences' => 'Tlaēlēhuiliztli',
 'mypreferences' => 'Notlaēlēhuiliz',
@@ -908,9 +902,6 @@ Timitztlātlauhtiah, xitlahcuiloa occē tōcāitl.',
 'statistics-files' => 'Tlahcuilōlli ōmoquetz',
 'statistics-views-peredit' => 'Tlahpololiztli ic tlapatlaliztli',
 
-'disambiguations' => 'Āmatl tlein motzonhuiliah īca tlahtōlmelāhuacātlāliztli āmatl',
-'disambiguationspage' => 'Template:Tlahtōlmelāhuacātlālīliztli',
-
 'doubleredirects' => 'Ōntetl tlacuepaliztli',
 
 'brokenredirects' => 'Tzomoc tlacuepaliztli',
@@ -1182,8 +1173,6 @@ Xiquitta $2 ic yancuīc tlapololiztli.',
 'change-blocklink' => 'Ticpatlaz tlatzacualli',
 'contribslink' => 'tlapatlaliztli',
 'blocklogpage' => 'Tlatequitiltilīlli ōmotzacuili',
-'blockme' => 'Timitzcuilīz',
-'proxyblocksuccess' => 'Ōmochīuh.',
 
 # Move page
 'move-page' => 'Ticzacāz $1',
@@ -1345,7 +1334,7 @@ Hueliz cah inīn huēyi tlapatlaliztli. Timitztlātlauhtia ticmatīz cuallōtl a
 'metadata-expand' => 'Tiquittāz tlanōnōtzaliztli huehca ōmpa',
 'metadata-collapse' => 'Tictlātīz tlanōnōtzaliztli huehca ōmpa',
 
-# EXIF tags
+# Exif tags
 'exif-photometricinterpretation' => 'Pixel tlachīhualiztli',
 'exif-imagedescription' => 'Īxiptli ītōcā',
 'exif-software' => 'Software ōmotēquitilti',
@@ -1475,10 +1464,6 @@ Niman tihuelīti [[Special:UserLogin|timocalaqui]] auh ticpactiāz huiquitica.',
 'version-version' => '(Machiyōtzin $1)',
 'version-software-version' => 'Machiyōtzin',
 
-# Special:FilePath
-'filepath-page' => 'Tlahcuilōlli:',
-'filepath-submit' => 'Yāuh',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Tlahcuilōlli ītōcā:',
 'fileduplicatesearch-submit' => 'Tlatēmōz',
diff --git a/languages/messages/MessagesNan.php b/languages/messages/MessagesNan.php
index 3cd3f448..a9eba0c8 100644
--- a/languages/messages/MessagesNan.php
+++ b/languages/messages/MessagesNan.php
@@ -54,9 +54,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Hián-sī tng leh khoàⁿ ê iōng-chiá sò͘-bo̍k',
 'tog-oldsig' => 'Chit-má ê chhiam-miâ:',
 'tog-fancysig' => 'Chhiam-miâ mài chò liân-kiat',
-'tog-externaleditor' => 'Iōng gōa-pō· pian-chi̍p-khì',
-'tog-externaldiff' => 'Iōng gōa-pō· diff',
-'tog-showjumplinks' => 'Hō͘ "thiàu khì" chit ê liân-chiap ē-sái',
 'tog-uselivepreview' => 'Ēng sui khoàⁿ-māi (ài ū JavaScript) (chhì-giām--ê)',
 'tog-forceeditsummary' => 'Pian-chi̍p khài-iàu bô thiⁿ ê sî-chūn, kā goá thê-chhéⁿ',
 'tog-watchlisthideown' => 'Kàm-sī-toaⁿ bián hián-sī goá ê pian-chi̍p',
@@ -254,7 +251,7 @@ $1',
 'pool-queuefull' => 'Tūi-lia̍t pâi moá ah',
 'pool-errorunknown' => 'M̄-chai siáⁿ chhò-gō͘',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'hían-sī',
 'aboutpage' => 'Project:koan-hē',
 'copyright' => 'Tī $1 tiâu-kiāⁿ chi hā khó sú-iōng loē-iông',
@@ -264,7 +261,6 @@ $1',
 'disclaimers' => 'Bô-hū-chek seng-bêng',
 'disclaimerpage' => 'Project:It-poaⁿ ê seng-bêng',
 'edithelp' => 'Án-choáⁿ siu-kái',
-'edithelppage' => 'Help:Pian-chi̍p',
 'helppage' => 'Help:Bo̍k-lio̍k',
 'mainpage' => 'Thâu-ia̍h',
 'mainpage-description' => 'Thâu-ia̍h',
@@ -338,12 +334,6 @@ Che mā khó-lêng sī {{SITENAME}} só͘ sú-iōng ê nńg-thé chhut būn-tê.
 # General errors
 'error' => 'Chhò-gō·',
 'databaseerror' => 'Chu-liāu-khò· chhò-gō·',
-'dberrortext' => 'Chu-liāu-khò͘ hoat-seng cha-sûn ê gí-hoat chhò-ngō͘.
-Che khó-lêng sī nńg-thé ê chhò-ngō͘.
-Téng chi̍t ê cha-sûn sī :
-<blockquote><tt>$1</tt></blockquote>
-tī hâm-sò͘  "<tt>$2</tt>".
-Chu-liāu-khò͘ thoân hoê ê chhò-ngō͘ "<tt>$3: $4</tt>".',
 'readonly' => 'Chu-liāu-khò· só tiâu leh',
 'enterlockreason' => 'Phah beh hong-só ê lí-iû, pau-koah ko͘-kè siáⁿ-mi̍h sî-chūn ē kái-tû hong-só.',
 'readonlytext' => 'Chu-liāu-khò· hiān-chú-sî só tiâu leh, bô khai-hòng hō· lâng siu-kái. Che tāi-khài sī in-ūi teh pān î-siu khang-khòe, oân-sêng liáu-āu èng-tong tō ē hôe-ho̍k chèng-siông. Hū-chek ê hêng-chèng jîn-oân lâu chit-ê soat-bêng: $1',
@@ -383,7 +373,6 @@ Chhiáⁿ tī kúi hun-cheng hāu chiah koh chhì.',
 'viewsourcetext' => 'Lí ē-sái khoàⁿ ia̍h khó͘-pih chit ia̍h ê goân-sú loē-iông:',
 'protectedinterface' => 'Chit ia̍h thê-kiong nńg-thé kài-bīn ēng ê bûn-jī. Ūi beh ī-hông lâng chau-that, só͘-í ū siū tio̍h pó-hō͘.',
 'editinginterface' => "'''Sè-jī:''' Lí tng teh siu-kái 1 bīn thê-kiong nńg-thé kài-bīn bûn-jī ê ia̍h. Jīn-hô kái-piàn to ē éng-hióng tio̍h kî-thaⁿ iōng-chiá ê sú-iōng kài-bīn.",
-'sqlhidden' => '(Tshàng SQL tsa-sûn)',
 'cascadeprotected' => 'Chit-ê ia̍h í-keng hông pó-hō͘ bē kái tit. In-ūi i tī ē-bīn {{PLURAL:$1|ê|ê}} liân-só pó-hō͘ lāi-té:
 $2',
 'namespaceprotected' => "Lí bô khoân-lī kái '''$1'''  miâ-khong-kan ê ia̍h",
@@ -398,7 +387,9 @@ Lí ē-sái mài kì-miâ kè-siok sú-iōng {{SITENAME}}, mā ē-sái iōng kā
 Chhiaⁿ chù-ì: ū-kóa ia̍h ū khó-lêng khoàⁿ-tio̍h bē-su lí iû-goân teng-ji̍p tiong; che chi-iàu piàⁿ tiāu lí ê browser ê cache chiū ē chèng-siông.",
 'welcomeuser' => 'Hoan-gêng, $1!',
 'yourname' => 'Lí ê iōng-chiá miâ-chheng:',
+'userlogin-yourname' => 'Iōng-chiá miâ-chheng',
 'yourpassword' => 'Lí ê bi̍t-bé:',
+'userlogin-yourpassword' => 'Bi̍t-bé',
 'yourpasswordagain' => 'Têng phah bi̍t-bé:',
 'remembermypassword' => 'Kì tiâu góa ê bi̍t-bé (āu-chhiú teng-ji̍p iōng) (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'login' => 'Teng-ji̍p',
@@ -592,7 +583,6 @@ Lí ê kái-piàn tī ē-kha ê bûn-jī-keh. Lí su-iàu chiōng lí chò ê k
 'nextn' => 'āu {{PLURAL:$1|$1}} hāng',
 'shown-title' => 'Múi ia̍h hián-sī $1 {{PLURAL:$1|kiat-kó|kiat-kó}}',
 'viewprevnext' => 'Khoàⁿ ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Bo̍k-lio̍k',
 'searchprofile-articles' => 'Loē-iông ia̍h',
 'searchprofile-images' => 'To-mûi-thé',
 'searchprofile-everything' => 'Só͘-ū ê',
@@ -607,9 +597,6 @@ Lí ê kái-piàn tī ē-kha ê bûn-jī-keh. Lí su-iàu chiōng lí chò ê k
 'powersearch' => 'Kiám-sek',
 'powersearch-legend' => 'Kiám-sek',
 
-# Quickbar
-'qbsettings' => 'Quickbar ê siat-tēng',
-
 # Preferences page
 'preferences' => 'Siat-tēng',
 'mypreferences' => 'Góa ê siat-tēng',
@@ -685,7 +672,6 @@ Tī pat-lâng liân-lo̍k lí ê sî-chūn bē kā e-mail tsū-tsí siá chhut--
 'recentchangeslinked' => 'Siong-koan ê kái-piàn',
 'recentchangeslinked-feed' => 'Siong-koan ê kái-piàn',
 'recentchangeslinked-toolbox' => 'Siong-koan ê kái-piàn',
-'recentchangeslinked-noresult' => 'Lí chí-tēng ê tiâu-kiaⁿ lāi-té chhōe bô jīn-hô kái-piàn.',
 'recentchangeslinked-page' => 'Ia̍h ê miâ:',
 
 # Upload
@@ -760,12 +746,6 @@ Tī pat-lâng liân-lo̍k lí ê sî-chūn bē kā e-mail tsū-tsí siá chhut--
 'statistics' => 'Thóng-kè',
 'statistics-header-users' => 'Iōng-chiá thóng-kè sò·-ba̍k',
 
-'disambiguations' => 'Khu-pia̍t-ia̍h',
-'disambiguationspage' => 'Template:disambig
-Template:KhPI
-Template:Khu-pia̍t-iah
-Template:Khu-pia̍t-ia̍h',
-
 'doubleredirects' => 'Siang-thâu choán-ia̍h',
 
 'brokenredirects' => 'Choán-ia̍h kò·-chiòng',
@@ -878,7 +858,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchthispage' => 'Kàm-sī chit ia̍h',
 'unwatch' => 'Mài kàm-sī',
 'unwatchthispage' => 'Mài koh kàm-sī',
-'watchnochange' => 'Lí kàm-sī ê hāng-bo̍k tī hián-sī ê sî-kî í-lāi lóng bô siu-kái kòe.',
 'watchlist-details' => 'Kàm-sī-toaⁿ ū {{PLURAL:$1|$1 ia̍h|$1 ia̍h}}, thó-lūn-ia̍h bô sǹg chāi-lāi.',
 'watchmethod-recent' => 'tng teh kíam-cha choè-kīn ê siu-kái, khoàⁿ ū kàm-sī ê ia̍h bô',
 'watchmethod-list' => 'tng teh kiám-cha kàm-sī ê ia̍h khoàⁿ chòe-kīn ū siu-kái bô',
@@ -1187,9 +1166,6 @@ Chit tiuⁿ phoe ê khak-jīn-bé ē chū-tōng tī $4 kòe-kî.',
 # Special:Version
 'version' => 'Pán-pún',
 
-# Special:FilePath
-'filepath' => 'Tóng-àn ê soàⁿ-lō·',
-
 # Special:SpecialPages
 'specialpages' => 'Te̍k-sû-ia̍h',
 
diff --git a/languages/messages/MessagesNap.php b/languages/messages/MessagesNap.php
index 5d158373..042cd499 100644
--- a/languages/messages/MessagesNap.php
+++ b/languages/messages/MessagesNap.php
@@ -124,6 +124,18 @@ $messages = array(
 'oct' => 'ott',
 'nov' => 'nuv',
 'dec' => 'dic',
+'january-date' => '$1 jennaro',
+'february-date' => '$1 frevaro',
+'march-date' => '$1 màrzo',
+'april-date' => '$1 abbrile',
+'may-date' => '$1 majo',
+'june-date' => '$1 giùgno',
+'july-date' => '$1 luglio',
+'august-date' => '$1 aùsto',
+'september-date' => '$1 settembre',
+'october-date' => '$1 ottovre',
+'november-date' => '$1 nuvembre',
+'december-date' => '$1 dicembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categurìa|Categurìe}}',
@@ -198,6 +210,7 @@ $messages = array(
 'create-this-page' => 'Cria sta paggena',
 'delete' => 'Scancèlla',
 'deletethispage' => 'Scancèlla chésta paggena',
+'undeletethispage' => 'Ripristina chista paggena',
 'protect' => 'Prutegge',
 'protect_change' => 'càgna',
 'protectthispage' => 'Ferma chesta paggena',
@@ -232,7 +245,7 @@ $messages = array(
 'jumptosearch' => 'truova',
 'pool-errorunknown' => 'Errore scanusciuto',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => "'Nfrummazione ncòpp'a {{SITENAME}}",
 'aboutpage' => "Project:'Nfrummazione",
 'copyright' => "Cuntenuti suggietti a licienza 'e uso $1.",
@@ -242,7 +255,6 @@ $messages = array(
 'disclaimers' => 'Avvertimiènte',
 'disclaimerpage' => 'Project:Avvertimiènte generale',
 'edithelp' => 'Guida',
-'edithelppage' => 'Help:Càgna',
 'helppage' => 'Help:Ajùto',
 'mainpage' => 'Paggena prencepale',
 'mainpage-description' => 'Paggena prencepale',
@@ -305,9 +317,18 @@ $messages = array(
 Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putite trasì n'ata vota, cu 'o stesso nomme o cu n'ato nomme.",
 'welcomeuser' => 'Bemmenuto, $1!',
 'yourname' => 'Nomme utente',
+'userlogin-yourname' => 'Nomme utente',
+'userlogin-yourname-ph' => "'Nserisce 'o tujo nomme utente",
+'createacct-another-username-ph' => "'Nserisce 'o nomme utente",
 'yourpassword' => 'Password:',
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => "'Nserisce 'a toja password",
+'createacct-yourpassword-ph' => "'Nserisce 'na password",
 'yourpasswordagain' => "Ripete 'a password:",
+'createacct-yourpasswordagain' => 'Cunferma password',
+'createacct-yourpasswordagain-ph' => "'Nserisce 'e novo 'a password",
 'remembermypassword' => 'Allicuordate d"a password (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'userlogin-remembermypassword' => 'Mantienime cullegato',
 'yourdomainname' => "Spiecà 'o dumminio",
 'login' => 'Tràse',
 'nav-login-createaccount' => "Tràse o cria n'acciesso novo",
@@ -316,6 +337,7 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
 'logout' => 'Jèsce',
 'userlogout' => 'Jèsce',
 'notloggedin' => 'Acciesso nun affettuato',
+'userlogin-noaccount' => "Nun haje ancora n'acciesso?",
 'nologin' => "Nun haje ancora n'acciesso? '''$1'''.",
 'nologinlink' => 'Crialo mmo',
 'createaccount' => 'Cria nu cunto novo',
@@ -323,6 +345,12 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
 'gotaccountlink' => 'Tràse',
 'userlogin-resetlink' => "Haje dimenticato 'e toje date 'e acciesso?",
 'createaccountreason' => 'Mutivo:',
+'createacct-reason' => 'Mutivo',
+'createacct-submit' => "Cria 'a toja utenza",
+'createacct-another-submit' => "Cria 'n atro account",
+'createacct-benefit-heading' => "{{SITENAME}} è fatta 'e perzone comme te.",
+'createacct-benefit-body1' => '{{PLURAL:$1|càgnamiento|càgnamiente}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|paggena|paggene}}',
 'loginerror' => "Probblema 'e accièsso",
 'loginsuccesstitle' => 'Acciesso affettuato',
 'loginsuccess' => "'''Si stato cunnesso ô server 'e {{SITENAME}} cu 'o nomme utente 'e \"\$1\".'''",
@@ -426,7 +454,6 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
 'shown-title' => "Fa vere {{PLURAL:$1|'nu risultato|$1 risultate}} ppe paggena",
 'viewprevnext' => 'Vere($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-new' => "'''Cria a paggena \"[[:\$1]]\" ncopp'â chisto wiki!'''",
-'searchhelp-url' => 'Help:Ajùto',
 'searchprofile-articles' => "Paggene 'e contenute",
 'searchprofile-project' => "Paggene 'e ajùto e relative 'o prugietto",
 'searchprofile-images' => 'Multimedia',
@@ -524,8 +551,6 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
 # Statistics
 'statistics' => 'Statistiche',
 
-'disambiguations' => "Paggene 'e disambigua",
-
 'doubleredirects' => 'Redirect duppie',
 
 # Miscellaneous special pages
@@ -613,6 +638,7 @@ Also see [[Special:WantedCategories|wanted categories]].",
 # Contributions
 'contributions' => 'Contribbute {{GENDER:$1|utente}}',
 'mycontris' => "'E ffatiche d''e mmeje",
+'contribsub2' => 'Ppe $1 ($2)',
 'uctop' => '(attuale)',
 'month' => 'D"o mese (e primma):',
 'year' => "'E ll'anno (e primma):",
diff --git a/languages/messages/MessagesNb.php b/languages/messages/MessagesNb.php
index 2e6f3be5..1df949ae 100644
--- a/languages/messages/MessagesNb.php
+++ b/languages/messages/MessagesNb.php
@@ -347,9 +347,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Vis antall brukere som overvåker',
 'tog-oldsig' => 'Nåværende signatur:',
 'tog-fancysig' => 'Behandle signaturen som wikitekst (uten automatisk lenke)',
-'tog-externaleditor' => 'Bruk ekstern behandler som standard (kun for viderekomne brukere, krever spesielle innstillinger på din datamaskin. [//www.mediawiki.org/wiki/Manual:External_editors Mer informasjon.])',
-'tog-externaldiff' => 'Bruk ekstern differanse som standard (kun for viderekomne brukere, krever spesielle innstillinger på din datamaskin. [//www.mediawiki.org/wiki/Manual:External_editors Mer informasjon.])',
-'tog-showjumplinks' => 'Slå på «gå til»-lenker',
 'tog-uselivepreview' => 'Bruk levende forhåndsvisning (eksperimentell JavaScript)',
 'tog-forceeditsummary' => 'Advar meg når jeg ikke gir noen redigeringsforklaring',
 'tog-watchlisthideown' => 'Skjul mine endringer fra overvåkningslisten',
@@ -362,6 +359,8 @@ $messages = array(
 'tog-diffonly' => 'Ikke vis sideinnhold under differ',
 'tog-showhiddencats' => 'Vis skjulte kategorier',
 'tog-norollbackdiff' => 'Ikke vis diff etter tilbakestilling',
+'tog-useeditwarning' => 'Si ifra dersom jeg forlater en side uten å lagre den.',
+'tog-prefershttps' => 'Bruk alltid en trygg forbindelse når du er innlogget',
 
 'underline-always' => 'Alltid',
 'underline-never' => 'Aldri',
@@ -425,6 +424,18 @@ $messages = array(
 'oct' => 'okt.',
 'nov' => 'nov.',
 'dec' => 'des.',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. mars',
+'april-date' => '$1. april',
+'may-date' => '$1. mai',
+'june-date' => '$1. juni',
+'july-date' => '$1. juli',
+'august-date' => '$1. august',
+'september-date' => '$1. september',
+'october-date' => '$1. oktober',
+'november-date' => '$1. november',
+'december-date' => '$1. desember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategorier}}',
@@ -506,6 +517,7 @@ $messages = array(
 'create-this-page' => 'Opprett denne siden',
 'delete' => 'Slett',
 'deletethispage' => 'Slett denne siden',
+'undeletethispage' => 'Legg tilbake siden',
 'undelete_short' => 'Gjenopprett {{PLURAL:$1|én revisjon|$1 revisjoner}}',
 'viewdeleted_short' => 'Vis {{PLURAL:$1|én slettet redigering|$1 slettede redigeringer}}',
 'protect' => 'Beskytt',
@@ -549,7 +561,7 @@ $1',
 'pool-queuefull' => 'Prosesskøen er full',
 'pool-errorunknown' => 'Ukjent feil',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Om {{SITENAME}}',
 'aboutpage' => 'Project:Om',
 'copyright' => 'Innholdet er tilgjengelig under $1.',
@@ -559,7 +571,6 @@ $1',
 'disclaimers' => 'Forbehold',
 'disclaimerpage' => 'Project:Generelle forbehold',
 'edithelp' => 'Redigeringshjelp',
-'edithelppage' => 'Help:Redigering',
 'helppage' => 'Help:Innhold',
 'mainpage' => 'Hovedside',
 'mainpage-description' => 'Hovedside',
@@ -636,17 +647,6 @@ En liste over gyldige spesialsider finnes på [[Special:SpecialPages|{{int:speci
 # General errors
 'error' => 'Feil',
 'databaseerror' => 'Databasefeil',
-'dberrortext' => 'Det har oppstått en syntaksfeil i en databaseforespørsel.
-Dette kan tyde på en feil i programvaren.
-Forrige databaseforespørsel var:
-<blockquote><tt>$1</tt></blockquote>
-fra funksjonen «<tt>$2</tt>».
-Databasen returnerte feilen «<tt>$3: $4</tt>».',
-'dberrortextcl' => 'Det oppsto en syntaksfeil i en databaseforespørsel.
-Forrige databaseforespørsel var:
-«$1»
-fra funksjonen «$2».
-Databasen returnerte feilen «$3: $4».',
 'laggedslavemode' => 'Advarsel: Dette kan være en eldre versjon av siden.',
 'readonly' => 'Databasen er skrivebeskyttet',
 'enterlockreason' => 'Skriv en begrunnelse for skrivebeskyttelsen, inkludert et estimat for når den blir opphevet',
@@ -680,6 +680,7 @@ Den kan ha blitt slettet av noen andre.',
 'cannotdelete-title' => 'Kan ikke slette siden «$1»',
 'delete-hook-aborted' => 'Sletting avbrutt av en funksjon.
 Den ga ingen forklaring.',
+'no-null-revision' => 'Det ble ikke laget en null-endring av side "$1"',
 'badtitle' => 'Ugyldig tittel',
 'badtitletext' => 'Den ønskede tittelen var ugyldig, tom eller feilaktig lenket fra en annen wiki.
 Den inneholder kanskje ett eller flere tegn som ikke kan brukes i titler.',
@@ -700,12 +701,15 @@ Spørring: $2',
 'editinginterface' => "'''Advarsel:''' Du redigerer en side som brukes for å fremskaffe grensesnittekst for programvaren.
 Endringer av denne siden vil påvirke hvordan grensesnittet vil se ut for andre brukere.
 For oversettelser er det best om du bruker [//translatewiki.net/wiki/Main_Page?setlang=nb translatewiki.net], prosjektet for oversettelse av MediaWiki.",
-'sqlhidden' => '(SQL-spørring skjult)',
 'cascadeprotected' => 'Denne siden er låst for redigering fordi den inkluderes på følgende sider som har dypbeskyttelse slått på:<!--{{PLURAL:$1}}-->
 $2',
 'namespaceprotected' => "Du har ikke tillatelse til å redigere sider i navnerommet '''$1'''.",
 'customcssprotected' => 'Du har ikke tillatelse til å redigere denne CSS-siden fordi den inneholder en annen brukers personlige innstillinger.',
 'customjsprotected' => 'Du har ikke tillatelse til å redigere denne JavaScript-siden fordi den inneholder en annen brukers personlige innstillinger.',
+'mycustomcssprotected' => 'Du har ikke rettigheter til å redigere denne CSS-siden.',
+'mycustomjsprotected' => 'Du har ikke rettigheter til å redigere denne Javascript-siden.',
+'myprivateinfoprotected' => 'Du har ikke tillatelse til å redigere den private informasjonen din.',
+'mypreferencesprotected' => 'Du har ikke tillatelse til å redigere innstillingene dine.',
 'ns-specialprotected' => 'Spesialsider kan ikke redigeres.',
 'titleprotected' => "Denne tittelen har blitt låst for oppretting av [[User:$1|$1]].
 Den angitte grunnen er «''$2''».",
@@ -730,10 +734,19 @@ Vær oppmerksom på at noen sider kan fortsette å dukke opp som om du fortsatt
 'welcomecreation-msg' => 'Kontoen din har blitt opprettet.
 Ikke glem å endre [[Special:Preferences|innstillingene dine]] på {{SITENAME}}.',
 'yourname' => 'Brukernavn:',
+'userlogin-yourname' => 'Brukernavn',
+'userlogin-yourname-ph' => 'Skriv inn brukernavnet ditt',
+'createacct-another-username-ph' => 'Skriv inn brukernavnet',
 'yourpassword' => 'Passord:',
+'userlogin-yourpassword' => 'Passord',
+'userlogin-yourpassword-ph' => 'Skriv inn passordet ditt',
+'createacct-yourpassword-ph' => 'Skriv inn et passord',
 'yourpasswordagain' => 'Gjenta passord',
+'createacct-yourpasswordagain' => 'Bekreft passord',
+'createacct-yourpasswordagain-ph' => 'Skriv inn passordet igjen',
 'remembermypassword' => 'Husk meg på denne datamaskinen (i maks $1 {{PLURAL:$1|dag|dager}})',
-'securelogin-stick-https' => 'Vær fortsatt koblet til HTTPS etter innlogging',
+'userlogin-remembermypassword' => 'Hold meg innlogget',
+'userlogin-signwithsecure' => 'Logg inn med sikker tjener',
 'yourdomainname' => 'Ditt domene',
 'password-change-forbidden' => 'Du kan ikke endre passord på denne wikien.',
 'externaldberror' => 'Det var en ekstern autentifiseringsfeil, eller du kan ikke oppdatere din eksterne konto.',
@@ -745,18 +758,41 @@ Ikke glem å endre [[Special:Preferences|innstillingene dine]] på {{SITENAME}}.
 'logout' => 'Logg ut',
 'userlogout' => 'Logg ut',
 'notloggedin' => 'Ikke logget inn',
+'userlogin-noaccount' => 'Ingen konto?',
+'userlogin-joinproject' => 'Bli med på {{SITENAME}}',
 'nologin' => 'Har du ingen konto? $1.',
 'nologinlink' => 'Opprett en konto',
 'createaccount' => 'Opprett konto',
 'gotaccount' => 'Har du allerede en konto? $1.',
 'gotaccountlink' => 'Logg inn',
 'userlogin-resetlink' => 'Har du glemt påloggingsdetaljene dine?',
+'userlogin-resetpassword-link' => 'Tilbakestill passordet ditt',
+'helplogin-url' => 'Help:Innlogging',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjelp med innlogging]]',
+'createacct-join' => 'Skriv inn informasjonen din under.',
+'createacct-another-join' => 'Legg inn den nye kontoens informasjon under.',
+'createacct-emailrequired' => 'E-postadresse',
+'createacct-emailoptional' => 'E-postadresse (valgfritt)',
+'createacct-email-ph' => 'Skriv inn e-postadressen din',
+'createacct-another-email-ph' => 'Skriv inn epostadressen',
 'createaccountmail' => 'Bruk et midlertidig, tilfeldig passord, og send det til angitt e-postadresse',
+'createacct-realname' => 'Virkelig navn (valgfritt)',
 'createaccountreason' => 'Årsak:',
+'createacct-reason' => 'Årsak',
+'createacct-reason-ph' => 'Hvorfor lager du en annen bruker',
+'createacct-captcha' => 'Sikkerhetssjekk',
+'createacct-imgcaptcha-ph' => 'Skriv inn teksten du ser ovenfor',
+'createacct-submit' => 'Opprett konto',
+'createacct-another-submit' => 'Lag ny konto',
+'createacct-benefit-heading' => '{{SITENAME}} er laget av folk som deg.',
+'createacct-benefit-body1' => '{{PLURAL:$1|redigering|redigeringer}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|side|sider}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|aktiv bidragsyter|aktive bidragsytere}}',
 'badretype' => 'Passordene samsvarte ikke.',
 'userexists' => 'Brukernavnet er allerede i bruk.
 Velg et annet brukernavn.',
 'loginerror' => 'Innloggingsfeil',
+'createacct-error' => 'Feil med kontoppretting',
 'createaccounterror' => 'Kunne ikke opprette konto: $1',
 'nocookiesnew' => 'Din brukerkonto er nå opprettet, men du har ikke logget på. {{SITENAME}} bruker informasjonskapsler («cookies») for å logge brukere på og du har slått dem av. Slå dem på for å kunne logge på med ditt nye brukernavn og passord.',
 'nocookieslogin' => '{{SITENAME}} bruker informasjonskapsler («cookies») for å logge brukere på og du har slått dem av. Slå dem på og prøv igjen.',
@@ -812,10 +848,13 @@ Skriv inn en fungerende e-postadresse eller tøm feltet.',
 
 Du kan ignorere denne beskjeden dersom kontoen ble opprettet ved en feil.',
 'usernamehasherror' => 'Brukernavn kan ikke inneholde nummertegn.',
-'login-throttled' => 'Du har prøvd å logge inn med denne kontoen for mange ganger. Vent før du prøver igjen.',
+'login-throttled' => 'Du har nylig prøvd for mange ganger å logge inn.
+Vær vennlig å vente $1 før du prøver igjen.',
 'login-abort-generic' => 'Innleggingen ble avbrutt.',
 'loginlanguagelabel' => 'Språk: $1',
 'suspicious-userlogout' => 'Din forespørsel om å logge ut ble nektet fordi den så ut til å ha bli sendt av en ødelagt nettleser eller en mellomtjener.',
+'createacct-another-realname-tip' => 'Det er frivillig å oppgi ditt egentlige navn.
+Hvis du velger å oppgi det, vil det blir anvendt for å gi deg som bruker anerkjennelse',
 
 # Email sending
 'php-mail-error-unknown' => 'Ukjent feil i PHPs mail()-funksjon',
@@ -831,8 +870,7 @@ Du kan ignorere denne beskjeden dersom kontoen ble opprettet ved en feil.',
 'newpassword' => 'Nytt passord:',
 'retypenew' => 'Gjenta nytt passord:',
 'resetpass_submit' => 'Angi passord og logg inn',
-'resetpass_success' => 'Passordet ditt er blitt endret!
-Du blir nå logget inn...',
+'changepassword-success' => 'Passordet ditt ble korrekt endret!',
 'resetpass_forbidden' => 'Passord kan ikke endres',
 'resetpass-no-info' => 'Du må være logget inn for å gå til denne siden direkte',
 'resetpass-submit-loggedin' => 'Endre passord',
@@ -844,10 +882,11 @@ Du kan ha allerede byttet passordet, eller bedt om et nytt midlertidig passord.'
 
 # Special:PasswordReset
 'passwordreset' => 'Passordresetting',
-'passwordreset-text' => 'Fyll ut dette skjemaet for å tilbakestille passordet ditt.',
+'passwordreset-text-one' => 'Fyll ut skjemaet for å tilbakestille passordet',
+'passwordreset-text-many' => '{{PLURAL:$1|Fyll inn et av datafeltene for å tilbakestille passordet ditt.}}',
 'passwordreset-legend' => 'Nullstill passord',
 'passwordreset-disabled' => 'Nullstilling av passord er deaktivert på denne wikien.',
-'passwordreset-pretext' => '{{PLURAL:$1||Skriv inn en av datadelene nedenfor}}',
+'passwordreset-emaildisabled' => 'E-posttjenester er slått av på denne wikien.',
 'passwordreset-username' => 'Brukernavn:',
 'passwordreset-domain' => 'Domene:',
 'passwordreset-capture' => 'Vise resulterende e-post?',
@@ -878,7 +917,7 @@ passord.',
 Midlertidig passord: $2',
 'passwordreset-emailsent' => 'En passordtilbakestillingslenke har blitt sendt per e-post.',
 'passwordreset-emailsent-capture' => 'Passordtilbakestillingseposten vist under har blitt sendt ut.',
-'passwordreset-emailerror-capture' => 'E-posten, som du ser under, ble forsøkt sendt til brukeren, men dette mislyktes: $1',
+'passwordreset-emailerror-capture' => 'En passordtilbakestillingsepost ble laget, men det lyktes ikke å sende denne til {{GENDER:$2|brukeren}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Endre e-postadresse',
@@ -892,6 +931,19 @@ Midlertidig passord: $2',
 'changeemail-submit' => 'Endre e-post',
 'changeemail-cancel' => 'Avbryt',
 
+# Special:ResetTokens
+'resettokens' => 'Nullstill merker',
+'resettokens-text' => 'Du kan nullstille nøklene som gir adgang til visse private data knyttet til din konto.
+
+Og du burde gjøre det hvis du har avslørt nøklene for noen.',
+'resettokens-no-tokens' => 'Det finnes ingen merker å nullstille.',
+'resettokens-legend' => 'Nullstill merker',
+'resettokens-tokens' => 'Merker:',
+'resettokens-token-label' => '$1 (aktuell verdi: $2)',
+'resettokens-watchlist-token' => 'Webmatenøkkel for overvåkningslisten',
+'resettokens-done' => 'Nullstilling av merker.',
+'resettokens-resetbutton' => 'Nullstill valgte merker',
+
 # Edit page toolbar
 'bold_sample' => 'Fet tekst',
 'bold_tip' => 'Fet tekst',
@@ -1089,11 +1141,13 @@ Slette- og flytteloggen vises nedenfor.',
 'edit-gone-missing' => 'Kunne ikke oppdatere siden fordi den har blitt slettet.',
 'edit-conflict' => 'Redigeringskonflikt.',
 'edit-no-change' => 'Redigeringen din ble ignorert fordi det ikke var noen endringer.',
+'postedit-confirmation' => 'Redigeringen din ble lagret.',
 'edit-already-exists' => 'Kunne ikke opprette ny side fordi den finnes fra før.',
 'defaultmessagetext' => 'Standard meldingstekst',
 'content-failed-to-parse' => 'Klarte ikke å tolke innholdet $2 for innholdsmodellen $1: $3',
 'invalid-content-data' => 'Ugyldig innhold',
 'content-not-allowed-here' => 'Innholdsmodellen «$1» er ikke tillatt på siden [[$2]]',
+'editwarning-warning' => 'Ved å forlate siden kan du miste alle endringer du har utført. Om du er logget inn kan du slå av denne advarselen under «Redigering»-seksjonen i innstillingene.',
 
 # Content models
 'content-model-wikitext' => 'WikiTekst',
@@ -1128,6 +1182,7 @@ Disse parameterne har blitt utelatt.',
 'undo-failure' => 'Redigeringen kunne ikke omgjøres på grunn av konflikterende etterfølgende redigeringer.',
 'undo-norev' => 'Redigeringen kunne ikke fjernes fordi den ikke eksisterer eller ble slettet',
 'undo-summary' => 'Fjerner revisjon $1 av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]])',
+'undo-summary-username-hidden' => 'Fjern revisjon $1 av en skjult bruker',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Kan ikke opprette konto',
@@ -1306,6 +1361,7 @@ Forsikre deg om at denne endringen vil opprettholde historisk sidekontinuitet.',
 'compareselectedversions' => 'Sammenlign valgte revisjoner',
 'showhideselectedversions' => 'Vis/skjul valgte versjoner',
 'editundo' => 'fjern',
+'diff-empty' => '(Ingen forskjell)',
 'diff-multi' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av {{PLURAL:$2|én bruker|$2 brukere}} vises ikke)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Én mellomrevisjon|$1 mellomrevisjoner}} av mer enn $2 {{PLURAL:$2|bruker|brukere}} vises ikke)',
 'difference-missing-revision' => '{{PLURAL:$2|En revisjon|$2 revisjoner}} av denne forskjellen ($1) {{PLURAL:$2|ble|ble}} ikke funnet.
@@ -1333,7 +1389,6 @@ Detaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchmenu-legend' => 'Søkeinnstillinger',
 'searchmenu-exists' => "* Siden '''[[$1]]'''",
 'searchmenu-new' => "'''Opprett siden ''[[:$1]]'' på denne wikien.'''",
-'searchhelp-url' => 'Help:Hjelp',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Vis alle sider som begynner med dette]]',
 'searchprofile-articles' => 'Innholdssider',
 'searchprofile-project' => 'Hjelp- og prosjektsider',
@@ -1375,15 +1430,7 @@ For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler,
 'powersearch-togglenone' => 'Ingen',
 'search-external' => 'Eksternt søk',
 'searchdisabled' => 'Søkefunksjonen er slått av. Du kan søke via Google i mellomtiden. Merk at Googles indeksering av {{SITENAME}} muligens er utdatert.',
-
-# Quickbar
-'qbsettings' => 'Brukerinnstillinger for hurtigmeny.',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Fast venstre',
-'qbsettings-fixedright' => 'Fast høyre',
-'qbsettings-floatingleft' => 'Flytende venstre',
-'qbsettings-floatingright' => 'Flytende til høyre',
-'qbsettings-directionality' => '"Låst", f. eks. i posisjon "låst til venstre eller til høyre". For venstre-mot-høyre-språk vil hurtigvelgeren være satt til venstre, for høyre-mot-venstre-språk til høyre.',
+'search-error' => 'En feil oppsto under søk: $1',
 
 # Preferences page
 'preferences' => 'Innstillinger',
@@ -1417,7 +1464,6 @@ For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler,
 'resetprefs' => 'Tilbakestill ulagrede endringer',
 'restoreprefs' => 'Tilbakestill til standardinnstillinger overalt',
 'prefs-editing' => 'Redigering',
-'prefs-edit-boxsize' => 'Størrelse på redigeringsvinduet.',
 'rows' => 'Rader:',
 'columns' => 'Kolonner',
 'searchresultshead' => 'Søk',
@@ -1428,9 +1474,9 @@ For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler,
 'recentchangesdays-max' => 'Maks $1 {{PLURAL:$1|dag|dager}}',
 'recentchangescount' => 'Antall redigeringer som skal vises som standard:',
 'prefs-help-recentchangescount' => 'Dette inkluderer nylige endringer, sidehistorikk og logger.',
-'prefs-help-watchlist-token' => 'Om du fyller ut dette feltet med et hemmelig tall, vil det lages en RSS-liste for overvåkningslisten din.
-Alle som vet det rette tallet vil være i stand til å lese overvåkningslisten din, så velg en sikker verdi.
-Her er et tilfeldig tall du kan bruke: $1',
+'prefs-help-watchlist-token2' => 'Dette er den hemmelige nøkkelen til webmatingen for din overvåkningsliste.
+Enhver som kjenner nøkkelen vil kunne lese din overvåkningsliste, så ikke vis den til andre.
+[[Special:ResetTokens|Klikk her om du trenger å nullstille nøkkelen]].',
 'savedprefs' => 'Innstillingene ble lagret.',
 'timezonelegend' => 'Tidssone:',
 'localtime' => 'Lokaltid:',
@@ -1461,7 +1507,6 @@ Her er et tilfeldig tall du kan bruke: $1',
 'prefs-reset-intro' => 'Du kan bruke denne siden til å tilbakestille innstillingene dine til standardinnstillingene.
 Dette kan ikke tilbakestilles.',
 'prefs-emailconfirm-label' => 'E-postbekreftelse:',
-'prefs-textboxsize' => 'Størrelse på redigeringsvindu',
 'youremail' => 'E-post:',
 'username' => '{{GENDER:$1|Brukernavn}}:',
 'uid' => '{{GENDER:$1|Bruker-ID}}:',
@@ -1494,6 +1539,8 @@ Informasjonen vil være offentlig.',
 'prefs-dateformat' => 'Datoformat',
 'prefs-timeoffset' => 'Tidsforskyvning',
 'prefs-advancedediting' => 'Generelle valg',
+'prefs-editor' => 'Tekstbehandling',
+'prefs-preview' => 'Forhåndsvisning',
 'prefs-advancedrc' => 'Avanserte alternativ',
 'prefs-advancedrendering' => 'Avanserte alternativer',
 'prefs-advancedsearchoptions' => 'Avanserte alternativer',
@@ -1501,6 +1548,7 @@ Informasjonen vil være offentlig.',
 'prefs-displayrc' => 'Visningsalternativer',
 'prefs-displaysearchoptions' => 'Visningsalternativer',
 'prefs-displaywatchlist' => 'Visningsalternativer',
+'prefs-tokenwatchlist' => 'Merke',
 'prefs-diffs' => 'Forskjeller',
 
 # User preference: email validation using jQuery
@@ -1529,6 +1577,8 @@ Informasjonen vil være offentlig.',
 'userrights-changeable-col' => 'Grupper du kan endre',
 'userrights-unchangeable-col' => 'Grupper du ikke kan endre',
 'userrights-irreversible-marker' => '$1 *',
+'userrights-conflict' => 'En konflikt med endringen av brukerrettigheter! Vær vennlig å sjekke og på nytt bekrefte endringene dine.',
+'userrights-removed-self' => 'Du har fjernet dine egne rettigheter. Du har derfor ikke lengere adgang til denne siden.',
 
 # Groups
 'group' => 'Gruppe:',
@@ -1594,11 +1644,19 @@ Informasjonen vil være offentlig.',
 'right-proxyunbannable' => 'Kan redigere fra blokkerte proxyer',
 'right-unblockself' => 'Fjerne blokkering av seg selv',
 'right-protect' => 'Endre beskyttelsesnivåer og redigere beskyttete sider',
-'right-editprotected' => 'Redigere beskyttede sider',
+'right-editprotected' => 'Redigere beskyttede sider som «{{int:protect-level-sysop}}»',
+'right-editsemiprotected' => 'Redigere beskyttede sider som «{{int:protect-level-autoconfirmed}}»',
 'right-editinterface' => 'Redigere brukergrensesnittet',
 'right-editusercssjs' => 'Redigere andre brukeres CSS- og JS-filer',
 'right-editusercss' => 'Redigere andre brukeres CSS-filer',
 'right-edituserjs' => 'Redigere andre brukeres JS-filer',
+'right-editmyusercss' => 'Rediger dine egne CSS-filer',
+'right-editmyuserjs' => 'Rediger dine egne Javascript-filer',
+'right-viewmywatchlist' => 'Vis din egen overvåkningsliste',
+'right-editmywatchlist' => 'Redigere din egen overvåkningsliste. Legg merke til at noen aksjoner fortsatt vil legge til sider uten denne rettigheten.',
+'right-viewmyprivateinfo' => 'Vise dine egne private data (f.eks. epostadresse og virkelig navn)',
+'right-editmyprivateinfo' => 'Redigere dine egne private data (f.eks. epostadresse og virkelig navn)',
+'right-editmyoptions' => 'Redigere dine egne innstillinger',
 'right-rollback' => 'Raskt tilbakestille den siste brukeren som har redigert en gitt side',
 'right-markbotedits' => 'Markere tilbakestillinger som robotredigeringer',
 'right-noratelimit' => 'Påvirkes ikke av hastighetsgrenser',
@@ -1660,12 +1718,19 @@ Informasjonen vil være offentlig.',
 'action-userrights-interwiki' => 'endre brukerrettigheter for brukere på andre wikier',
 'action-siteadmin' => 'låse eller låse opp databasen',
 'action-sendemail' => 'sende e-poster',
+'action-editmywatchlist' => 'redigere din overvåkningsliste',
+'action-viewmywatchlist' => 'Vis din overvåkningsliste',
+'action-viewmyprivateinfo' => 'vise din private informasjon',
+'action-editmyprivateinfo' => 'rediger din private informasjon',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|endring|endringer}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|siden forrige besøk}}',
+'enhancedrc-history' => 'historikk',
 'recentchanges' => 'Siste endringer',
 'recentchanges-legend' => 'Alternativer for siste endringer',
 'recentchanges-summary' => 'På denne siden vises de siste endringene i wikien.',
+'recentchanges-noresult' => 'Ingen endringer i perioden passer med kriteriene.',
 'recentchanges-feed-description' => 'Følg med på siste endringer i denne wikien med denne matingen.',
 'recentchanges-label-newpage' => 'Denne redigeringen opprettet en ny side',
 'recentchanges-label-minor' => 'Dette er en mindre endring',
@@ -1702,7 +1767,6 @@ Informasjonen vil være offentlig.',
 'recentchangeslinked-feed' => 'Relaterte endringer',
 'recentchangeslinked-toolbox' => 'Relaterte endringer',
 'recentchangeslinked-title' => 'Endringer relatert til «$1»',
-'recentchangeslinked-noresult' => 'Ingen endringer på lenkede sider i den gitte perioden.',
 'recentchangeslinked-summary' => "Dette er en liste over de siste endringene på sidene lenket fra en spesifisert side (eller til meldlemmer av en spesifisert kategori).
 Sider på [[Special:Watchlist|overvåkningslisten din]] er i '''fet skrift'''.",
 'recentchangeslinked-page' => 'Sidenavn:',
@@ -1714,7 +1778,7 @@ Sider på [[Special:Watchlist|overvåkningslisten din]] er i '''fet skrift'''.",
 'reuploaddesc' => 'Avbryt opplasting og gå tilbake til opplastingsskjemaet',
 'upload-tryagain' => 'Send inn endret filbeskrivelse',
 'uploadnologin' => 'Ikke logget inn',
-'uploadnologintext' => 'Du må være [[Special:UserLogin|logget inn]] for å kunne laste opp filer.',
+'uploadnologintext' => 'Du må $1 for å laste opp filer.',
 'upload_directory_missing' => 'Oppplastingsmappen ($1) mangler og kunne ikke opprettes av tjeneren.',
 'upload_directory_read_only' => 'Opplastingsmappa ($1) er ikke skrivbar for tjeneren.',
 'uploaderror' => 'Feil under opplasting av fil',
@@ -1939,7 +2003,6 @@ For best mulig sikkerhet er img_auth.php slått av.',
 'http-read-error' => 'HTTP-lesefeil.',
 'http-timed-out' => 'Tidsavbrudd på HTTP-forespørsel.',
 'http-curl-error' => 'Feil under henting av adresse: $1',
-'http-host-unreachable' => 'Kunne ikke nå adressen.',
 'http-bad-status' => 'Det var et problem under HTTP-forespørselen: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1967,6 +2030,10 @@ For best mulig sikkerhet er img_auth.php slått av.',
 'listfiles_size' => 'Størrelse (bytes)',
 'listfiles_description' => 'Beskrivelse',
 'listfiles_count' => 'Versjoner',
+'listfiles-show-all' => 'Inkluderer gamle versjoner av bilder',
+'listfiles-latestversion' => 'Gjeldende versjon',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nei',
 
 # File description page
 'file-anchor-link' => 'Fil',
@@ -2061,6 +2128,13 @@ Kanskje du vil redigere beskrivelsen på dens [$2 filbeskrivelsesside].',
 'randompage' => 'Tilfeldig side',
 'randompage-nopages' => 'Det er ingen sider i {{PLURAL:$2|det følgende navnrommet|de følgende navnrommene}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Tilfeldig side innenfor kategorien',
+'randomincategory-invalidcategory' => '«$1» er ikke et gyldig kategorinavn.',
+'randomincategory-nopages' => 'Det finnes ingen sider i [[:Kategori:$1]]-kategorien.',
+'randomincategory-selectcategory' => 'Hent en tilfeldig side fra kategori: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Start',
+
 # Random redirect
 'randomredirect' => 'Tilfeldig omdirigering',
 'randomredirect-nopages' => 'Det er ingen omdirigeringer i navnerommet $1.',
@@ -2086,17 +2160,13 @@ Kanskje du vil redigere beskrivelsen på dens [$2 filbeskrivelsesside].',
 'statistics-users-active-desc' => 'Brukere som har utført handlinger {{PLURAL:$1|det siste døgnet|de siste $1 dagene}}',
 'statistics-mostpopular' => 'Mest viste sider',
 
-'disambiguations' => 'Sider som lenker til artikler med flertydige titler',
-'disambiguationspage' => 'Template:Peker',
-'disambiguations-text' => "Følgende sider lenker til en '''pekerside'''.
-De burde i stedet lenke til en passende innholdsside.<br />
-En side anses om en pekerside om den inneholder en mal som det lenkes til fra [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Sider med sideverdi',
 'pageswithprop-legend' => 'Sider med en sideverdi',
 'pageswithprop-text' => 'Denne siden lister opp sider som bruker en viss sideverdi.',
 'pageswithprop-prop' => 'Verdinavn:',
 'pageswithprop-submit' => 'Gå',
+'pageswithprop-prophidden-long' => 'skjult verdi for egenskap langtekst ($1)',
+'pageswithprop-prophidden-binary' => 'skjult verdi for binæregenskap ($1)',
 
 'doubleredirects' => 'Doble omdirigeringer',
 'doubleredirectstext' => 'Denne siden lister opp de sidene som er omdirigeringer til andre omdirigeringssider.
@@ -2154,6 +2224,7 @@ Hver rad inneholder lenker til første og andre omdirigering, samt målet for de
 'mostrevisions' => 'Artikler med flest revisjoner',
 'prefixindex' => 'Alle sider med prefiks',
 'prefixindex-namespace' => 'All sider med prefiks ($1 navnerom)',
+'prefixindex-strip' => 'Fjern prefiks fra listen',
 'shortpages' => 'Korte sider',
 'longpages' => 'Lange sider',
 'deadendpages' => 'Blindveisider',
@@ -2345,10 +2416,9 @@ Fremtidige endringer til denne siden og den tilhørende diskusjonssiden blir lis
 'unwatchthispage' => 'Fjerner overvåkning',
 'notanarticle' => 'Ikke en artikkel',
 'notvisiblerev' => 'Revisjonen er slettet',
-'watchnochange' => 'Ingen av sidene i overvåkningslisten er endret i den valgte perioden.',
 'watchlist-details' => '{{PLURAL:$1|Én side|$1 sider}} på din overvåkningsliste, teller ikke diskusjonssider.',
-'wlheader-enotif' => '* E-postnotifikasjon er slått på.',
-'wlheader-showupdated' => "* Sider som har blitt forandret siden du sist besøkte dem vises i '''fet tekst'''",
+'wlheader-enotif' => 'E-postvarsling er slått på.',
+'wlheader-showupdated' => "Sider som har blitt forandret siden du sist besøkte dem vises i '''fet tekst'''",
 'watchmethod-recent' => 'sjekker siste endringer for sider i overvåkningslisten',
 'watchmethod-list' => 'sjekker siste endringer for sider i overvåkningslisten',
 'watchlistcontains' => 'Overvåkningslisten inneholder $1 {{PLURAL:$1|side|sider}}.',
@@ -2740,13 +2810,11 @@ Skjulingsloggen vises nedenfor.',
 'ipb_blocked_as_range' => 'Feil: IP-en $1 er ikke blokkert direkte, og kan ikke avblokkeres. Den er imidlertid blokkert som del av blokkeringa av IP-rangen $2, som kan avblokkeres.',
 'ip_range_invalid' => 'Ugyldig IP-rad.',
 'ip_range_toolarge' => 'Blokkering av IP-serier større enn /$1 er ikke tillatt.',
-'blockme' => 'Blokker meg',
 'proxyblocker' => 'Proxyblokker',
-'proxyblocker-disabled' => 'Denne funksjonen er slått av.',
 'proxyblockreason' => 'IP-adressen din ble blokkert fordi den er en åpen proxy. Kontakt internettleverandøren din eller teknisk støtte og informer dem om dette alvorlige sikkerhetsproblemet.',
-'proxyblocksuccess' => 'Utført.',
 'sorbsreason' => 'Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}. Du kan ikke opprette en konto',
+'xffblockreason' => 'En IP-adresse som er tilstede i X-Forwarded-For-headeren, enten din eller en som tilhører en proxyserver du bruker, har blitt blokkert. Den opprinnelige blokkeringsgrunnen var: $1',
 'cant-block-while-blocked' => 'Du kan ikke blokkere andre mens du selv er blokkert.',
 'cant-see-hidden-user' => 'Brukeren du prøver å blokkere har allerede blitt blokkert og skjult. Ettersom du ikke har rett til å skjule brukere (hideuser), kan du ikke se eller endre brukerens blokkering.',
 'ipbblocked' => 'Du kan ikke blokkere eller avblokkere andre brukere, siden du selv er blokkert',
@@ -2913,6 +2981,8 @@ Besøk [//translatewiki.net translatewiki.net] om du ønsker å bidra med overse
 'thumbnail-more' => 'Forstørr',
 'filemissing' => 'Filen mangler',
 'thumbnail_error' => 'Feil under oppretting av miniatyrbilde: $1',
+'thumbnail_error_remote' => 'Feilmelding fra $1:
+$2',
 'djvu_page_error' => 'DjVu-side ute av rekkevidde',
 'djvu_no_xml' => 'Klarte ikke å hente XML for DjVu-fil',
 'thumbnail-temp-create' => 'Kan ikke opprette midlertidig miniatyrbildefil',
@@ -3060,24 +3130,14 @@ Du kan se på kildeteksten',
 
 # Stylesheets
 'common.css' => '/* CSS plassert i denne fila vil gjelde for alle utseender. */',
-'standard.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Standard */',
-'nostalgia.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Nostalgia */',
 'cologneblue.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Kølnerblå */',
 'monobook.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Monobook */',
-'myskin.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta MySkin */',
-'chick.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Chick */',
-'simple.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Simple */',
 'modern.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Modern */',
 
 # Scripts
 'common.js' => '/* Javascript i denne fila vil gjelde for alle drakter. */',
-'standard.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Standard */',
-'nostalgia.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Nostalgia */',
 'cologneblue.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Kølnerblå */',
 'monobook.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Monobook */',
-'myskin.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta MySkin */',
-'chick.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Chick */',
-'simple.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Simple */',
 'modern.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Modern */',
 
 # Metadata
@@ -3152,12 +3212,8 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 'pageinfo-category-files' => 'Antall filer',
 
 # Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Nostalgi',
 'skinname-cologneblue' => 'Kølnerblå',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Eget utseende',
-'skinname-simple' => 'Enkel',
 'skinname-modern' => 'Moderne',
 
 # Patrolling
@@ -3236,11 +3292,25 @@ Ved å åpne den kan systemet ditt kompromitteres.",
 'minutes' => '{{PLURAL:$1|$1 minutt|$1 minutter}}',
 'hours' => '{{PLURAL:$1|$1 time|$1 timer}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dager}}',
+'weeks' => '{{PLURAL:$1|$1 uke|$1 uker}}',
 'months' => '{{PLURAL:$1|$1 måned|$1 måneder}}',
 'years' => '{{PLURAL:$1|$1 år}}',
 'ago' => '$1 siden',
 'just-now' => 'nettopp',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|time|timer}} siden',
+'minutes-ago' => '$1 {{PLURAL:$1|minutt|minutter}} siden',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund|sekunder}} siden',
+'monday-at' => 'Mandag kl. $1',
+'tuesday-at' => 'Tirsdag kl. $1',
+'wednesday-at' => 'Onsdag kl. $1',
+'thursday-at' => 'Torsdag kl. $1',
+'friday-at' => 'Fredag kl. $1',
+'saturday-at' => 'Lørdag kl. $1',
+'sunday-at' => 'Søndag kl. $1',
+'yesterday-at' => 'I går kl. $1',
+
 # Bad image list
 'bad_image_list' => 'Formatet er som følger:
 
@@ -3270,7 +3340,7 @@ Andre vil skjules som standard.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Bredde',
 'exif-imagelength' => 'Høyde',
 'exif-bitspersample' => 'Bits per komponent',
@@ -3448,7 +3518,7 @@ Andre vil skjules som standard.
 'exif-originalimageheight' => 'Høyde på bildet før det ble beskåret',
 'exif-originalimagewidth' => 'Bredde på bildet før det ble beskåret',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ukomprimert',
 'exif-compression-2' => 'CCITT Gruppe 3 1-dimensjonal modifisert Huffman-kjørelengdekoding',
 'exif-compression-3' => 'CCITT Gruppe 3 faks-koding',
@@ -3860,7 +3930,6 @@ Du kan også [[Special:EditWatchlist|bruke standardverktøyet]].',
 'version-other' => 'Annet',
 'version-mediahandlers' => 'Mediahåndterere',
 'version-hooks' => 'Haker',
-'version-extension-functions' => 'Tilleggsfunksjoner',
 'version-parser-extensiontags' => 'Tilleggstagger',
 'version-parser-function-hooks' => 'Parserfunksjoner',
 'version-hook-name' => 'Navn',
@@ -3869,6 +3938,7 @@ Du kan også [[Special:EditWatchlist|bruke standardverktøyet]].',
 'version-license' => 'Lisens',
 'version-poweredby-credits' => "Denne wikien er drevet av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'andre',
+'version-poweredby-translators' => 'translatewiki.net-oversettere',
 'version-credits-summary' => 'Vi ønsker å takke følgende personer for deres bidrag til [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki er fri programvare; du kan redistribuere det og/eller modifisere det under betingelsene i GNU General Public License som publisert av Free Software Foundation; enten versjon 2 av lisensen, eller (etter eget valg) enhver senere versjon.
 
@@ -3882,12 +3952,17 @@ Du skal ha mottatt [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi av GNU General Publ
 'version-entrypoints-header-entrypoint' => 'Inngangspunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Filsti',
-'filepath-page' => 'Fil:',
-'filepath-submit' => 'Gå',
-'filepath-summary' => 'Denne spesialsiden returnerer den fullstendige stien for en fil.
-Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom sine tilknyttede programmer.',
+# Special:Redirect
+'redirect' => 'Omdiriger via filnavn, bruker, eller versjonsid',
+'redirect-legend' => 'Omdiriger til en fil eller side',
+'redirect-summary' => 'Denne spesialsiden omdirigerer til en fil (hvis den gis et filnavn), en side (hvis den gis et versjonsnummer), eller en brukerside (hvis den gis en nummerisk brukerid).',
+'redirect-submit' => 'Gå',
+'redirect-lookup' => 'Oppslag:',
+'redirect-value' => 'Verdi:',
+'redirect-user' => 'Bruker-ID',
+'redirect-revision' => 'Sideversjon',
+'redirect-file' => 'Filnavn',
+'redirect-not-exists' => 'Verdi er ikke funnet',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Søk etter duplikatfiler',
@@ -3937,6 +4012,7 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
 'tags' => 'Gyldige endringstagger',
 'tag-filter' => 'Filter for [[Special:Tags|tagger]]:',
 'tag-filter-submit' => 'Filtrer',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tagg|Tagger}}]]: $2)',
 'tags-title' => 'Tagger',
 'tags-intro' => 'Denne siden lister opp taggene programvaren kan merke en endring med, og hva de betyr.',
 'tags-tag' => 'Taggnavn',
@@ -3978,6 +4054,9 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
 'htmlform-submit' => 'Lagre',
 'htmlform-reset' => 'Omgjør endringer',
 'htmlform-selectorother-other' => 'Andre',
+'htmlform-no' => 'Nei',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Velg et alternativ',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 med støtte for fulltekstsøk',
@@ -4095,4 +4174,18 @@ Om det ikke er tilfellet, kan du bruke det enkle skjemaet som du finner under. K
 # Image rotation
 'rotate-comment' => 'Bildet snudd $1{{PLURAL:°}} med klokka',
 
+# Limit report
+'limitreport-title' => 'Parser-profildata:',
+'limitreport-cputime' => 'CPU-tidsbruk',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'limitreport-walltime' => 'Faktisk tidsbruk',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'limitreport-ppvisitednodes' => 'Nodebesøkstelling for preprosessor',
+'limitreport-ppgeneratednodes' => 'Preprosessor-generert nodetall',
+'limitreport-postexpandincludesize-value' => '$1/$2 byte',
+'limitreport-templateargumentsize' => 'Malargument-størrelse',
+'limitreport-templateargumentsize-value' => '$1/$2 byte',
+'limitreport-expansiondepth' => 'Største ekspansjonsdybde',
+'limitreport-expensivefunctioncount' => 'Antall kostbare parserfunksjoner',
+
 );
diff --git a/languages/messages/MessagesNds.php b/languages/messages/MessagesNds.php
index 4fc3a615..21595511 100644
--- a/languages/messages/MessagesNds.php
+++ b/languages/messages/MessagesNds.php
@@ -246,9 +246,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Wies de Tall vun Brukers, de op disse Siet oppasst',
 'tog-oldsig' => 'Gellen Ünnerschrift',
 'tog-fancysig' => 'Signatur as Wikitext behanneln (ahn automaatsch Lenk)',
-'tog-externaleditor' => 'Extern Editor as Standard bruken (Blots för Lüüd, de sik dormit utkennt. Dor mutt noch mehr op dien Reekner instellt warrn, dat dat geiht. [//www.mediawiki.org/wiki/Manual:External_editors Wiedere Informatschonen hierto.])',
-'tog-externaldiff' => 'Extern Warktüüch to’n Wiesen vun Ünnerscheden as Standard bruken (Blots för Lüüd, de sik dormit utkennt. Dor mutt noch mehr op dien Reekner instellt warrn, dat dat geiht. [//www.mediawiki.org/wiki/Manual:External_editors Wiedere Informatschonen hierto.])',
-'tog-showjumplinks' => '„Wesseln-na“-Lenken tolaten',
 'tog-uselivepreview' => 'Live-Vörschau bruken (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Segg mi bescheid, wenn ik keen Tosamenfaten geven heff, wat ik allens ännert heff',
 'tog-watchlisthideown' => 'Ännern vun mi sülvs op de Oppasslist nich wiesen',
@@ -447,7 +444,7 @@ $1",
 'pool-queuefull' => 'Pooltöövslang is vull',
 'pool-errorunknown' => 'Unbekannten Fehler',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Över {{SITENAME}}',
 'aboutpage' => 'Project:Över_{{SITENAME}}',
 'copyright' => 'Inholt is verfögbor ünner de $1.',
@@ -457,7 +454,6 @@ $1",
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Bearbeidenshülp',
-'edithelppage' => 'Help:Ännern',
 'helppage' => 'Help:Hülp',
 'mainpage' => 'Hööftsiet',
 'mainpage-description' => 'Hööftsiet',
@@ -530,17 +526,6 @@ En List vun de Spezialsieden gifft dat ünner [[Special:SpecialPages|{{int:speci
 # General errors
 'error' => 'Fehler',
 'databaseerror' => 'Fehler in de Datenbank',
-'dberrortext' => 'Dor weer en Syntaxfehler in de Datenbankaffraag.
-De Grund kann en Programmeerfehler ween
-De letzte Datenbankaffraag weer:
-
-<blockquote><tt>$1</tt></blockquote>
-
-ut de Funkschoon <tt>$2</tt>.
-MySQL mell den Fehler <tt>$3: $4</tt>.',
-'dberrortextcl' => 'Dor weer en Syntaxfehler in de Datenbankaffraag.
-De letzte Datenbankaffraag weer: $1 ut de Funkschoon <tt>$2</tt>.
-MySQL mell den Fehler: <tt>$3: $4</tt>.',
 'laggedslavemode' => 'Wohrschau: Disse Siet is villicht nich mehr op den ne’esten Stand.',
 'readonly' => 'Datenbank is sparrt',
 'enterlockreason' => 'Giff den Grund an, worüm de Datenbank sparrt warrn schall un taxeer, wo lang de Sparr duert',
@@ -589,7 +574,6 @@ Query: $2',
 'editinginterface' => "'''Wohrschau:''' Disse Siet bargt Text, de vun de MediaWiki-Software för ehr Böverflach bruukt warrt.
 Wat du hier ännerst, warkt sik op dat kumplette Wiki ut.
 Wenn du Text översetten wist, de betherto noch gornich översett is, denn maak dat opbest op [//translatewiki.net/wiki/Main_Page?setlang=nds translatewiki.net], dat Översett-Projekt vun MediaWiki.",
-'sqlhidden' => '(SQL-Affraag versteken)',
 'cascadeprotected' => 'Disse Siet is sperrt un kann nich ännert warrn. Dat kummt dorvun dat se in disse {{PLURAL:$1|Siet|Sieden}} inbunnen is, de över Kaskadensperr schuult {{PLURAL:$1|is|sünd}}:
 $2',
 'namespaceprotected' => "Du hest keen Rechten, Sieden in’n Naamruum '''$1''' to ännern.",
@@ -699,7 +683,7 @@ Tööv en Stoot, ehrdat du dat noch wedder versöchst.',
 'newpassword' => 'Nee Passwoort',
 'retypenew' => 'Nee Passwoort (nochmal)',
 'resetpass_submit' => 'Passwoort instellen un inloggen',
-'resetpass_success' => 'Dien Passwoort is mit Spood ännert worrn. Warrst nu anmellt …',
+'changepassword-success' => 'Dien Passwoort is mit Spood ännert worrn. Warrst nu anmellt …',
 'resetpass_forbidden' => 'Passwöör köönt nich ännert warrn.',
 'resetpass-no-info' => 'Du musst anmellt wesen, dat du disse Sied direkt opropen kannst.',
 'resetpass-submit-loggedin' => 'Passwoord ännern',
@@ -1087,7 +1071,6 @@ Seh to, dat de Versionsgeschicht vun’n Artikel vun de Historie her bi de Reeg
 'searchmenu-legend' => 'Söökoptionen',
 'searchmenu-exists' => "* Sied '''[[$1]]'''",
 'searchmenu-new' => "'''Stell de Sied „[[:$1]]“ in dit Wiki nee op!'''",
-'searchhelp-url' => 'Help:Hülp',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Wies Sieden, de mit disse Bookstaven anfangt]]',
 'searchprofile-articles' => 'Inholdsieden',
 'searchprofile-project' => 'Hülp- un Projektsieden',
@@ -1131,14 +1114,6 @@ Du kannst dat Woord ''all:'' vör dien Söökwoord setten, dat all Naamrüüm (o
 'searchdisabled' => '<p>De Vulltextsöök is wegen Överlast en Stoot deaktiveert. In disse Tied kannst du disse Google-Söök verwennen,
 de aver nich jümmer den aktuellsten Stand weerspegelt.<p>',
 
-# Quickbar
-'qbsettings' => 'Siedenliest',
-'qbsettings-none' => 'Keen',
-'qbsettings-fixedleft' => 'Links, fast',
-'qbsettings-fixedright' => 'Rechts, fast',
-'qbsettings-floatingleft' => 'Links, sweven',
-'qbsettings-floatingright' => 'Rechts, sweven',
-
 # Preferences page
 'preferences' => 'Instellen',
 'mypreferences' => 'För mi Instellen',
@@ -1166,7 +1141,6 @@ de aver nich jümmer den aktuellsten Stand weerspegelt.<p>',
 'resetprefs' => 'Trüchsetten',
 'restoreprefs' => 'All Standardinstellungen wedderhalen',
 'prefs-editing' => 'Grött vun’t Textfeld',
-'prefs-edit-boxsize' => 'Grött vun dat Finster för Ännern.',
 'rows' => 'Regen',
 'columns' => 'Spalten',
 'searchresultshead' => 'Söökresultaten',
@@ -1177,9 +1151,6 @@ de aver nich jümmer den aktuellsten Stand weerspegelt.<p>',
 'recentchangesdays-max' => '(Maximal $1 {{PLURAL:$1|Dag|Daag}})',
 'recentchangescount' => 'Antall Ännern, de wiest warrt:',
 'prefs-help-recentchangescount' => 'Dor höört de Ne’esten Ännern, Versionsgeschichten un Logböker to.',
-'prefs-help-watchlist-token' => 'Wenn du in dit Feld in gehemen Slötel ingiffst, denn warrt för dien Oppasslist en RSS-Feed opstellt.
-Elkeen, de den Slötel kennt, kann denn dien Oppasslist ankieken. Söök di also en good Slötel ut.
-Hier is en Tofalls-Slötel, den du bruken kannst: $1',
 'savedprefs' => 'Allens spiekert.',
 'timezonelegend' => 'Tiedrebeed:',
 'localtime' => 'Oortstied:',
@@ -1210,7 +1181,6 @@ Hier is en Tofalls-Slötel, den du bruken kannst: $1',
 'prefs-reset-intro' => 'Du kannst disse Sied bruken, dien Instellungen al op de Standardinstellung trüchtosetten.
 Dat kann nich wedder ungeschehn maakt warrn.',
 'prefs-emailconfirm-label' => 'E-Mail-Bestätigung:',
-'prefs-textboxsize' => 'Grött vun dat Änner-Finster',
 'youremail' => 'Dien E-Mail (kene Plicht) *',
 'username' => 'Brukernaam:',
 'uid' => 'Bruker-ID:',
@@ -1435,7 +1405,6 @@ Dat kann nich wedder ungeschehn maakt warrn.',
 'recentchangeslinked-feed' => 'Ännern an lenkte Sieden',
 'recentchangeslinked-toolbox' => 'Ännern an lenkte Sieden',
 'recentchangeslinked-title' => 'Ännern an Sieden, de vun „$1“ ut lenkt sünd',
-'recentchangeslinked-noresult' => 'In disse Tiet hett nüms de lenkten Sieden ännert.',
 'recentchangeslinked-summary' => "Disse List wiest de letzten Ännern an de Sieden, de vun en bestimmte Siet ut verlenkt oder in en bestimmte Kategorie in sünd. Sieden, de op diene [[Special:Watchlist|Oppasslist]] staht, sünd '''fett''' schreven.",
 'recentchangeslinked-page' => 'Siet:',
 'recentchangeslinked-to' => 'Wies Ännern op Sieden, de hierher wiest',
@@ -1664,10 +1633,6 @@ Denk dor an, natokieken, wat nich noch annere Sieden na de Vörlagen wiest, ehrd
 'statistics-users-active-desc' => 'Brukers, de {{PLURAL:$1|in de vergahn 24 Stünnen|in de vergahn $1 Daag}} wat daan hebbt',
 'statistics-mostpopular' => 'opmehrst ankekene Sieden',
 
-'disambiguations' => 'Mehrdüdige Begrepen',
-'disambiguationspage' => 'Template:Mehrdüdig_Begreep',
-'disambiguations-text' => 'Disse Sieden wist na Sieden för mehrdüdige Begrepen. Se schöölt lever op de Sieden wiesen, de egentlich meent sünd.<br />Ene Siet warrt as Siet för en mehrdüdigen Begreep ansehn, wenn [[MediaWiki:Disambiguationspage]] na ehr wiest.<br />Lenken ut annere Naamrüüm sünd nich mit in de List.',
-
 'pageswithprop-submit' => 'Los',
 
 'doubleredirects' => 'Dubbelte Wiederleiden',
@@ -1893,10 +1858,9 @@ Mehr Informatschonen över enkelte Rechten staht ünner [[{{MediaWiki:Listgroupr
 'unwatchthispage' => 'Nich mehr oppassen',
 'notanarticle' => 'Keen Artikel',
 'notvisiblerev' => 'Version wegsmeten',
-'watchnochange' => 'Kene Siet op dien Oppasslist is in den wiesten Tietruum ännert worrn.',
 'watchlist-details' => '{{PLURAL:$1|Ene Siet is|$1 Sieden sünd}} op dien Oppasslist (ahn Diskuschoonssieden).',
 'wlheader-enotif' => 'Benarichtigen per E-Mail is anstellt.',
-'wlheader-showupdated' => "* Sieden, de siet dien letzten Besöök ännert worrn sünd, warrt '''fett''' wiest.",
+'wlheader-showupdated' => "Sieden, de siet dien letzten Besöök ännert worrn sünd, warrt '''fett''' wiest.",
 'watchmethod-recent' => 'letzte Ännern no Oppasslist pröven',
 'watchmethod-list' => 'Oppasslist na letzte Ännern nakieken',
 'watchlistcontains' => 'Diene Oppasslist bargt {{PLURAL:$1|ene Siet|$1 Sieden}}.',
@@ -2230,12 +2194,9 @@ Kiek [[Special:BlockList|IP-Blocklist]] för en List vun den blockten Brukern.',
 'ipb_cant_unblock' => 'Fehler: Block-ID $1 nich funnen. De Sperr is villicht al wedder ophoven.',
 'ipb_blocked_as_range' => 'Fehler: De IP-Adress $1 is as Deel vun de IP-Reeg $2 indirekt sperrt worrn. De Sperr trüchnehmen för $1 alleen geiht nich.',
 'ip_range_invalid' => 'Ungüllig IP-Addressrebeet.',
-'blockme' => 'Sperr mi',
 'proxyblocker' => 'Proxyblocker',
-'proxyblocker-disabled' => 'Disse Funkschoon is afstellt.',
 'proxyblockreason' => 'Dien IP-Adress is blockt, vun wegen dat se en apenen Proxy is.
 Kontakteer dien Provider oder diene Systemtechnik un informeer se över dat möögliche Sekerheitsproblem.',
-'proxyblocksuccess' => 'Trech.',
 'sorbsreason' => 'Diene IP-Adress steiht in de DNSBL vun {{SITENAME}} as apen PROXY.',
 'sorbs_create_account_reason' => 'Diene IP-Adress steiht in de DNSBL vun {{SITENAME}} as apen PROXY. Du kannst keen Brukerkonto nee opstellen.',
 'cant-block-while-blocked' => 'Du kannst kene annern Brukers sperren, wenn du sülvst sperrt büst.',
@@ -2528,10 +2489,7 @@ All Transwiki-Import-Akschonen staht later ok in dat [[Special:Log/import|Import
 'pageinfo-category-subcats' => 'TAll vun Ünnerkategorien',
 
 # Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Kölsch Blau',
-'skinname-chick' => 'Küken',
 
 # Patrolling
 'markaspatrolleddiff' => 'As nakeken marken',
@@ -2620,7 +2578,7 @@ Wiedere warrt standardmatig nich anwiest:
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breed',
 'exif-imagelength' => 'Hööchd',
 'exif-bitspersample' => 'Bits je Farvkomponent',
@@ -2738,7 +2696,7 @@ Wiedere warrt standardmatig nich anwiest:
 'exif-languagecode' => 'Spraak',
 'exif-iimcategory' => 'Kategorie',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Unkomprimeert',
 
 'exif-unknowndate' => 'Unbekannt Datum',
@@ -3038,7 +2996,6 @@ Du kannst ok de [[Special:EditWatchlist|normale Sied to’n Ännern]] bruken.',
 'version-other' => 'Annern Kraam',
 'version-mediahandlers' => 'Medien-Handlers',
 'version-hooks' => 'Hooks',
-'version-extension-functions' => 'Extension-Funkschonen',
 'version-parser-extensiontags' => "Parser-Extensions ''(Tags)''",
 'version-parser-function-hooks' => 'Parser-Funkschonen',
 'version-hook-name' => 'Hook-Naam',
@@ -3052,14 +3009,6 @@ Du kannst ok de [[Special:EditWatchlist|normale Sied to’n Ännern]] bruken.',
 'version-software-version' => 'Version',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Dateipadd',
-'filepath-page' => 'Datei:',
-'filepath-submit' => 'Los',
-'filepath-summary' => 'Disse Spezialsiet gifft den kumpletten Padd för ene Datei trüch. Biller warrt in vull Oplösen wiest, annere Datein warrt glieks mit dat Programm opropen, dat för de Soort Datein instellt is.
-
-Geev den Dateinaam ahn den Tosatz „{{ns:file}}:“ an.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Söök na Datein, de jüst gliek sünd',
 'fileduplicatesearch-summary' => 'Söök na Datein, de na jemehr Hash-Tallen jüst gliek sünd.',
diff --git a/languages/messages/MessagesNds_nl.php b/languages/messages/MessagesNds_nl.php
index 9b349d47..707bcb35 100644
--- a/languages/messages/MessagesNds_nl.php
+++ b/languages/messages/MessagesNds_nl.php
@@ -147,7 +147,7 @@ $magicWords = array(
 	'img_middle'                => array( '1', 'midden', 'middle' ),
 	'img_bottom'                => array( '1', 'benejen', 'beneden', 'bottom' ),
 	'img_text_bottom'           => array( '1', 'tekste-benejen', 'tekst-beneden', 'text-bottom' ),
-	'img_link'                  => array( '1', 'verwiezing=$1', 'verwijzing=$1', 'link=$1' ),
+	'img_link'                  => array( '1', 'verwiezing=$1', 'verwijzing=$1', 'koppeling=$1', 'link=$1' ),
 	'sitename'                  => array( '1', 'WEBSTEENAAM', 'SITENAAM', 'SITENAME' ),
 	'ns'                        => array( '0', 'NR:', 'NS:' ),
 	'localurl'                  => array( '0', 'LOKALEURL', 'LOCALURL:' ),
@@ -180,7 +180,7 @@ $magicWords = array(
 	'raw'                       => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
 	'displaytitle'              => array( '1', 'TEUNTITEL', 'TOONTITEL', 'TITELTONEN', 'WEERGEGEVENTITEL', 'DISPLAYTITLE' ),
 	'newsectionlink'            => array( '1', '__NIEJESECTIEVERWIEZING__', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
-	'nonewsectionlink'          => array( '1', '__GIENNIEJKOPJENVERWIEZING__', '__GEENNIEUWKOPJEVERWIJZING__', '__GEENNIEUWESECTIELINK__', '__NONEWSECTIONLINK__' ),
+	'nonewsectionlink'          => array( '1', '__GIENNIEJKOPJENVERWIEZING__', '__GEENNIEUWKOPJEVERWIJZING__', '__GEENNIEUWESECTIELINK__', '__GEENNIEUWKOPJEKOPPELING__', '__NONEWSECTIONLINK__' ),
 	'currentversion'            => array( '1', 'DISSEVERSIE', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
 	'urlencode'                 => array( '0', 'URLKODEREN', 'URLCODEREN', 'CODEERURL', 'URLENCODE:' ),
 	'anchorencode'              => array( '0', 'ANKERKODEREN', 'ANKERCODEREN', 'CODEERANKER', 'ANCHORENCODE' ),
@@ -337,9 +337,6 @@ $messages = array(
 'tog-shownumberswatching' => 't Antal gebrukers bekieken die disse zied volgt',
 'tog-oldsig' => 'Bestaonde haandtekening:',
 'tog-fancysig' => 'Ondertekening zien as wikitekste (zonder automatiese verwiezing)',
-'tog-externaleditor' => 'Standard n externe tekstbewarker gebruken (allinnig veur gevorderden - veur disse funksie bin spesiale instellingen neudig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informasie]).',
-'tog-externaldiff' => 'Standard n extern vergeliekingsprogramma gebruken (allinnig veur gevorderden - veur disse funksie bin spesiale instellingen neudig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informasie]).',
-'tog-showjumplinks' => '"Gao naor"-verwiezingen toelaoten',
 'tog-uselivepreview' => 'Gebruuk "rechtstreeks naokieken" (experimenteel)',
 'tog-forceeditsummary' => 'Geef n melding bie n lege samenvatting',
 'tog-watchlisthideown' => 'Verbarg mien eigen bewarkingen',
@@ -353,6 +350,8 @@ $messages = array(
 'tog-showhiddencats' => 'Laot verbörgen kategorieën zien',
 'tog-noconvertlink' => 'Ziednaamkonversie uutschakelen',
 'tog-norollbackdiff' => 'Wiezigingen vortlaoten nao t weerummedreien',
+'tog-useeditwarning' => "Waorschuw mien a'k n bewörken zied aof wil sluten die nog niet op-esleugen is",
+'tog-prefershttps' => "Altied n beveiligde verbiending gebruken a'j an-emeld bin",
 
 'underline-always' => 'Altied',
 'underline-never' => 'Nooit',
@@ -416,6 +415,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'des',
+'january-date' => '$1 jannewaori',
+'february-date' => '$1 febrewaori',
+'march-date' => '$1 meert',
+'april-date' => '$1 april',
+'may-date' => '$1 mei',
+'june-date' => '$1 juni',
+'july-date' => '$1 juli',
+'august-date' => '$1 augustus',
+'september-date' => '$1 september',
+'october-date' => '$1 oktober',
+'november-date' => '$1 november',
+'december-date' => '$1 desember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorieën}}',
@@ -497,6 +508,7 @@ $messages = array(
 'create-this-page' => 'Disse zied anmaken',
 'delete' => 'Vortdoon',
 'deletethispage' => 'Disse zied vortdoon',
+'undeletethispage' => 'Zied weerummeplaotsen',
 'undelete_short' => '$1 {{PLURAL:$1|versie|versies}} weerummeplaotsen',
 'viewdeleted_short' => '{{PLURAL:$1|Eén versie die vortedaon is|$1 versies die vortedaon bin}} bekieken',
 'protect' => 'Beveiligen',
@@ -540,7 +552,7 @@ $1",
 'pool-queuefull' => 'De wachtrie van de poel is vol',
 'pool-errorunknown' => 'Onbekende fout',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Over {{SITENAME}}',
 'aboutpage' => 'Project:Info',
 'copyright' => 'De inhoud is beschikbaor onder de $1 as der niks aanders an-egeven is.',
@@ -550,7 +562,6 @@ $1",
 'disclaimers' => 'Veurbehold',
 'disclaimerpage' => 'Project:Veurbehoud',
 'edithelp' => 'Hulpe mit bewarken',
-'edithelppage' => 'Help:Uutleg',
 'helppage' => 'Help:Inhoud',
 'mainpage' => 'Veurblad',
 'mainpage-description' => 'Veurblad',
@@ -627,19 +638,12 @@ n Lieste mit bestaonde spesiale ziejen ku'j vienen op [[Special:SpecialPages|{{i
 # General errors
 'error' => 'Foutmelding',
 'databaseerror' => 'Fout in de databanke',
-'dberrortext' => 'Bie t zeuken is n syntaxisfout in de databanke op-etrejen.
-De oorzake hiervan kan dujen op n fout in de programmatuur.
-Der is n syntaxisfout in t databankeverzeuk op-etrejen.
-t Kan ween dat der n fout in de programmatuur zit.
-De leste zeukpoging in de databanke was:
-<blockquote><code>$1</code></blockquote>
-vanuut de funksie "<code>$2</code>".
-De databanke gaf de volgende foutmelding "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Der is n syntaxisfout in t databankeverzeuk op-etrejen.
-t Leste veurzeuk an de databanke was:
-"$1"
-vanuut de funksie "$2"
-De databanke gaf de volgende foutmelding: "$3: $4"',
+'databaseerror-text' => 'Der is wat mis egaon bie n databankzeukopdrachte.
+Dit kan betekenen dat der n fout in de programmtuur zit.',
+'databaseerror-textcl' => 'Der is wat mis egaon bie n databankzeukopdrachte.',
+'databaseerror-query' => 'Zeukopdrachte: $1',
+'databaseerror-function' => 'Funksie: $1',
+'databaseerror-error' => 'Fout: $1',
 'laggedslavemode' => '<strong>Waorschuwing:</strong> t is meugelik dat leste wiezigingen in de tekste van dit artikel nog niet verwarkt bin.',
 'readonly' => 'De databanke is beveiligd',
 'enterlockreason' => 'Waorumme en veur hoe lange is t eblokkeerd?',
@@ -671,6 +675,7 @@ t Kan ween dat n aander t al vortedaon hef.',
 'cannotdelete-title' => 'Zied "$1" kan niet vortedaon wörden',
 'delete-hook-aborted' => 't Vortdoon wörden in t wiere eschopt deur n MediaWiki-programmatuuruutbreiding.
 Der is gien veerdere informasie beschikbaor.',
+'no-null-revision' => 'Kon gien lege nieje versie maken veur de zied "$1"',
 'badtitle' => 'Ongeldige naam',
 'badtitletext' => 'De naam van de op-evreugen zied is niet geldig, leeg, of n interwiki-verwiezing naor n onbekende of ongeldige wiki.',
 'perfcached' => 'Disse gegevens koemen uut t tussengeheugen en bin misschien niet aktueel. Der {{PLURAL:$1|is hooguut een resultaot|bin hooguut $1 resultaoten}} beschikbaor in t tussengeheugen.',
@@ -689,12 +694,15 @@ Zeukopdrachte: $2',
 'protectedinterface' => "Op disse zied steet tekste die gebruukt wörden veur systeemteksten van disse wiki. Allinnig beheerders kunnen disse zied bewarken.
 Um vertalingen veur alle wiki's derbie te zetten of te wiezigen, gebruuk [//translatewiki.net/ translatewiki.net], t vertaalprojekt veur MediaWiki.",
 'editinginterface' => "'''Waorschuwing:''' je bewarken n zied die gebruukt wörden deur de programmatuur. Wa'j hier wiezigen, is van invleud op de hele wiki. Um vertalingen derbie te zetten of te wiezigen veur alle wiki's, gebruuk [//translatewiki.net/wiki/Main_Page?setlang=nds-nl translatewiki.net], t vertalingsprojekt veur MediaWiki.",
-'sqlhidden' => '(SQL-zeukopdrachte verbörgen)',
 'cascadeprotected' => 'Disse zied is beveiligd umdat t veurkömp in de volgende {{PLURAL:$1|zied|ziejen}}, die beveiligd {{PLURAL:$1|is|bin}} mit de "kaskade"-opsie:
 $2',
 'namespaceprotected' => "Je maggen gien ziejen in de '''$1'''-naamruumte bewarken.",
 'customcssprotected' => 'Je kunnen disse CSS-zied niet bewarken, umdat der persoonlike instellingen van n aandere gebruker in staon.',
 'customjsprotected' => 'Je kunnen disse JavaScript-zied niet bewarken, umdat der persoonlike instellingen van n aandere gebruker in staon.',
+'mycustomcssprotected' => 'Je hebben gien toestemming um disse CSS-zied te bewarken.',
+'mycustomjsprotected' => 'Je hebben gien rechten um disse JavaScript-zied te bewarken.',
+'myprivateinfoprotected' => 'Je hebben gien rechten um joew priveegegevens an te passen.',
+'mypreferencesprotected' => 'Je hebben gien rechten um joew veurkeuren an te passen.',
 'ns-specialprotected' => 'Spesiale ziejen kunnen niet bewarkt wörden.',
 'titleprotected' => "t Anmaken van disse zied is beveiligd deur [[User:$1|$1]].
 De op-egeven reden is ''$2''.",
@@ -719,10 +727,19 @@ t Kan ween dat der wat ziejen bin die weeregeven wörden as of je an-emeld bin t
 'welcomecreation-msg' => 'Joew gebruker is an-emaakt.
 Vergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] an te passen.',
 'yourname' => 'Gebrukersnaam',
+'userlogin-yourname' => 'Gebrukersnaam',
+'userlogin-yourname-ph' => 'Geef joew gebrukersnaam op',
+'createacct-another-username-ph' => 'Vul de gebrukersnaam in',
 'yourpassword' => 'Wachtwoord',
+'userlogin-yourpassword' => 'Wachtwoord',
+'userlogin-yourpassword-ph' => 'Geef joew wachtwoord op',
+'createacct-yourpassword-ph' => 'Geef n wachtwoord op',
 'yourpasswordagain' => 'Opniej invoeren',
+'createacct-yourpasswordagain' => 'Wachtwoord bevestigen',
+'createacct-yourpasswordagain-ph' => 'Geef t wachtwoord opniej op',
 'remembermypassword' => 'Vanzelf anmelden (hooguut $1 {{PLURAL:$1|dag|dagen}})',
-'securelogin-stick-https' => "Verbunnen blieven via HTTPS naoda'j an-emeld bin",
+'userlogin-remembermypassword' => 'Vanzelf anmelden',
+'userlogin-signwithsecure' => 'Beveiligde verbiending gebruken',
 'yourdomainname' => 'Joew domein',
 'password-change-forbidden' => 'Je kunnen joew wachtwoord niet wiezigen op disse wiki.',
 'externaldberror' => 'Der gung iets fout bie de externe authentisering, of je maggen je gebrukersprofiel niet bewarken.',
@@ -734,18 +751,44 @@ Vergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] an te pas
 'logout' => 'Aofmelden',
 'userlogout' => 'Aofmelden',
 'notloggedin' => 'Niet an-emeld',
+'userlogin-noaccount' => "He'j nog gien gebrukersnaam?",
+'userlogin-joinproject' => 'Wörd lid van {{SITENAME}}',
 'nologin' => "He'j nog gien gebrukersnaam? $1.",
 'nologinlink' => 'Maak n gebrukersprofiel an',
 'createaccount' => 'Inschrieven',
 'gotaccount' => "Stao'j al in-eschreven? '''$1'''.",
 'gotaccountlink' => 'Anmelden',
 'userlogin-resetlink' => "Bi'j de anmeldgegevens kwiet?",
+'userlogin-resetpassword-link' => 'Joew wachtwoord opniej instellen',
+'helplogin-url' => 'Help:Anmelden',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hulpe bie t anmelden]]',
+'userlogin-loggedin' => 'Je bin al an-emeld as {{GENDER:$1|$1}}.
+Gebruuk t onderstaonde formulier um an te melden as n aandere gebruker.',
+'userlogin-createanother' => 'n Aandere gebrukerskonto anmaken',
+'createacct-join' => 'Geef joew gegevens hieronder op.',
+'createacct-another-join' => 'Vul hieronder de informasie van de nieje gebruker in.',
+'createacct-emailrequired' => 'Netpostadres',
+'createacct-emailoptional' => 'Netpostadres (niet verplicht)',
+'createacct-email-ph' => 'Geef joew netpostadres op',
+'createacct-another-email-ph' => 'Vul joew netpostadres in',
 'createaccountmail' => 'Gebruuk n tiejelik wachtwoord dat joe netzelde is en stuur t naor t op-egeven netpostadres',
+'createacct-realname' => 'Echte naam (niet verplicht)',
 'createaccountreason' => 'Reden:',
+'createacct-reason' => 'Reden',
+'createacct-reason-ph' => 'Waorumme je n aandere gebrukerskonto anmaken',
+'createacct-captcha' => 'Veiligheidskontraole',
+'createacct-imgcaptcha-ph' => "Voer de tekste in die'j hierboven zien",
+'createacct-submit' => 'Gebrukerskonto anmaken',
+'createacct-another-submit' => 'n Aandere gebrukerskonto anmaken',
+'createacct-benefit-heading' => '{{SITENAME}} wörden emaakt deur meensen zo as jie.',
+'createacct-benefit-body1' => 'bewarking{{PLURAL:$1||en}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|zied|ziejen}}',
+'createacct-benefit-body3' => 'aktieve {{PLURAL:$1|biedrager|biedragers}}',
 'badretype' => "De wachtwoorden die'j in-etikt hebben bin niet liek alleens.",
 'userexists' => 'Disse gebrukersnaam is al gebruuk.
 Kies n aandere naam.',
 'loginerror' => 'Anmeldingsfout',
+'createacct-error' => 'Fout bie t anmaken van n gebruker',
 'createaccounterror' => 'Kon de gebrukersnaam niet anmaken: $1',
 'nocookiesnew' => 'De gebrukersnaam is an-emaakt, mer je bin niet an-emeld.
 {{SITENAME}} gebruuk scheumbestaanden (cookies) um gebrukers an te melden.
@@ -806,10 +849,12 @@ Meld je eigen noen an en wiezig t wachtwoord.
 Negeer dit bericht as disse gebruker zonder joew toestemming an-emaakt is.',
 'usernamehasherror' => "In n gebrukersnaam ma'j gien hekjen gebruken.",
 'login-throttled' => "Je hebben lestens te vake eprobeerd um an te melden mit n verkeerd wachtwoord.
-Je mutten effen wachten veurda'j t opniej proberen kunnen.",
+Je mutten effen $1 wachten veurda'j t opniej proberen.",
 'login-abort-generic' => 'Je bin niet an-emeld. De procedure is aofebreuken.',
 'loginlanguagelabel' => 'Taal: $1',
 'suspicious-userlogout' => 'Joew verzeuk um of te melden is aofewezen umdat t dernaor uutziet dat t verstuurd is deur n kepotte webkieker of tussenopslagbuffer',
+'createacct-another-realname-tip' => "Joew echte naam opgeven is niet verplicht.
+A'j t invullen, dan zu'w t gebruken um erkenning te geven veur joew warkzaamhejen.",
 
 # Email sending
 'php-mail-error-unknown' => 'Der was n onbekende fout mit de mail()-funksie van PHP',
@@ -825,8 +870,7 @@ Je mutten effen wachten veurda'j t opniej proberen kunnen.",
 'newpassword' => 'Niej wachtwoord',
 'retypenew' => 'Niej wachtwoord (opniej)',
 'resetpass_submit' => 'Voer t wachtwoord in en meld je an',
-'resetpass_success' => 'Joew wachtwoord is ewiezigd!
-Je wörden noen an-emeld...',
+'changepassword-success' => 'Joew wachtwoord is ewiezigd!',
 'resetpass_forbidden' => 'Wachtwoorden kunnen niet ewiezigd wörden',
 'resetpass-no-info' => "Je mutten an-emeld ween veurda'j disse zied gebruken kunnen.",
 'resetpass-submit-loggedin' => 'Wachtwoord wiezigen',
@@ -838,10 +882,11 @@ Misschien he'j t wachtwoord al ewiezigd of n niej veurlopig wachtwoord an-evreug
 
 # Special:PasswordReset
 'passwordreset' => 'Wachtwoord opniej instellen',
-'passwordreset-text' => 'Vul dit formulier in um joew wachtwoord opniej in te stellen.',
+'passwordreset-text-one' => 'Vul dit formulier in um joew wachtwoord opniej in te stellen.',
+'passwordreset-text-many' => '{{PLURAL:$1|Vul een van de gegevensvelden in um joew wachtwoord opniej in te stellen.}}',
 'passwordreset-legend' => 'Wachtwoord opniej instellen',
 'passwordreset-disabled' => 'Je kunnen op disse wiki joew wachtwoord niet opniej instellen.',
-'passwordreset-pretext' => '{{PLURAL:$1||Voer één van de onderstaonde velden in}}',
+'passwordreset-emaildisabled' => 'Netpostmeugelikhejen bin uutezet op disse wiki.',
 'passwordreset-username' => 'Gebruker:',
 'passwordreset-domain' => 'Domein:',
 'passwordreset-capture' => 'De resulterende netpost bekieken?',
@@ -866,7 +911,7 @@ Meld je eigen noen an en wiezig t wachtwoord. A'j dit verzeuk niet zelf edaon he
 Tiedelik wachtwoord: $2',
 'passwordreset-emailsent' => 'Der is n bericht verstuurd um t wachtwoord opniej in te stellen.',
 'passwordreset-emailsent-capture' => "Der is n bericht verstuurd um joew wachtwoord opniej in te stellen. Dit ku'j hieronder lezen.",
-'passwordreset-emailerror-capture' => "Der is n bericht veur t opniej instellen van joew wachtwoord an-emaakt, dit ku'j hieronder lezen. t Versturen naor de gebruker is mislokt um de volgende reden: $1",
+'passwordreset-emailerror-capture' => "Der is n bericht veur t opniej opstellen van joew wachwoord an-emaakt, dit ku'j hieronder lezen. t Versturen naor de {{GENDER:$2|gebruker}} is mislokt um de volgende reden: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Wiezig netpostadres',
@@ -880,6 +925,19 @@ Tiedelik wachtwoord: $2',
 'changeemail-submit' => 'Netpostadres wiezigen',
 'changeemail-cancel' => 'Aofbreken',
 
+# Special:ResetTokens
+'resettokens' => 'Tokens ongedaonmaken',
+'resettokens-text' => "Je kunnen hier tokens opniej instellen die toegang geven tot bepaolde persoonlike gegevens die ekoppeld bin an joew gebruker.
+
+Do dit a'j ze per ongelok mit ene edeeld hebben of as onbevoegden toegang ekregen hebben tot joew gebruker.",
+'resettokens-no-tokens' => 'Der bin gien tokens um ongedaon te maken.',
+'resettokens-legend' => 'Tokens ongedaonmaken',
+'resettokens-tokens' => 'Tokens:',
+'resettokens-token-label' => '$1 (aktuele weerde: $2)',
+'resettokens-watchlist-token' => 'Token veur webvoer (Atom/RSS) van [[Special:Watchlist|wiezigingen van ziejen die joew volglieste staon]]',
+'resettokens-done' => 'Tokens ongedaonmaken.',
+'resettokens-resetbutton' => 'Ekeuzen tokens ongedaonmaken',
+
 # Edit page toolbar
 'bold_sample' => 'Vet-edrokten tekste',
 'bold_tip' => 'Vet-edrokten tekste',
@@ -1074,12 +1132,15 @@ Der is gien reden op-egeven.',
 t Schient dat t vortedaon is.',
 'edit-conflict' => 'Tegelieke bewörken.',
 'edit-no-change' => 'Joew bewarking is enegeerd, umdat der gien wieziging an de tekste edaon is.',
+'postedit-confirmation' => 'Joew bewarking is op-esleugen',
 'edit-already-exists' => 'De zied kon niet an-emaakt wörden.
 t Besteet al.',
 'defaultmessagetext' => 'Standardtekste',
 'content-failed-to-parse' => 'Kon de inhoud van t MIME-type $2 veur t model $1 niet verwarken: $3.',
 'invalid-content-data' => 'Ongeldige inhoudsgegevens',
 'content-not-allowed-here' => 'De inhoud "$1" is niet toe-estaan op de zied [[$2]].',
+'editwarning-warning' => "A'j disse zied verlaoten dan bi'j de wieziging die'j emaakt hebben waorschienlik kwiet.
+A'j an-emeld bin, dan ku'j disse waorschuwing uutzetten in t tabblad \"Bewarkingsveld\" in joew veurkeuren.",
 
 # Content models
 'content-model-wikitext' => 'wikitekste',
@@ -1113,6 +1174,7 @@ Sommigen mallen wörden niet in-evoegd.',
 'undo-failure' => 'De wieziging kon niet weerummedreid wörden umdat t ondertussen awweer ewiezigd is.',
 'undo-norev' => 'De bewarking kon niet weerummedreid wörden, umdat t niet besteet of vortedaon is.',
 'undo-summary' => 'Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) weerummedreid.',
+'undo-summary-username-hidden' => 'Versie $1 deur n verbörgen gebruker weerummedreid',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Anmaken van n gebrukersprofiel is niet meugelik',
@@ -1287,6 +1349,7 @@ In de [[Special:BlockList|blokkeerlieste]] bin de blokkeringen, die noen van toe
 'compareselectedversions' => 'Vergeliek de ekeuzen versies',
 'showhideselectedversions' => 'Ekeuzen versies bekieken/verbargen',
 'editundo' => 'weerummedreien',
+'diff-empty' => '(Gien verschil)',
 'diff-multi' => '(Hier {{PLURAL:$1|zit nog 1 versie|zitten nog $1 versies}} van {{PLURAL:$2|1 gebruker|$2 gebrukers}} tussen die der niet bie staon.)',
 'diff-multi-manyusers' => '($1 tussenliggende {{PLURAL:$1|versie|versies}} deur meer as $2 {{PLURAL:$2|gebruker|gebrukers}} niet weeregeven)',
 'difference-missing-revision' => "{{PLURAL:$2|Eén versie|$2 versies}} van disse verschillen ($1) {{PLURAL:$2|is|bin}} niet evunnen.
@@ -1314,7 +1377,6 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
 'searchmenu-legend' => 'Zeukopsies',
 'searchmenu-exists' => "'''Der is n zied mit de naam \"[[:\$1]]\" op disse wiki.'''",
 'searchmenu-new' => "'''De zied \"[[:\$1]]\" op disse wiki anmaken!'''",
-'searchhelp-url' => 'Help:Inhold',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ziednamen mit dit veurvoegsel laoten zien]]',
 'searchprofile-articles' => 'Artikels',
 'searchprofile-project' => 'Hulp- en projektziejen',
@@ -1355,15 +1417,7 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
 'powersearch-togglenone' => 'Gien',
 'search-external' => 'Extern zeuken',
 'searchdisabled' => 'Zeuken in {{SITENAME}} is niet meugelik. Je kunnen gebruukmaken van Google. De gegevens over {{SITENAME}} bin misschien niet bie-ewörken.',
-
-# Quickbar
-'qbsettings' => 'Lieste mit ziejen',
-'qbsettings-none' => 'Gien',
-'qbsettings-fixedleft' => 'Links, vaste',
-'qbsettings-fixedright' => 'Rechts, vaste',
-'qbsettings-floatingleft' => 'Links, zweven',
-'qbsettings-floatingright' => 'Rechts, zweven',
-'qbsettings-directionality' => 'Vaste, aofhankelik van de schriefrichtige van joew taal',
+'search-error' => 'Der is wat mis-egaon bie t zeuken: $1',
 
 # Preferences page
 'preferences' => 'Veurkeuren',
@@ -1397,7 +1451,6 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
 'resetprefs' => 'Standardveurkeuren herstellen',
 'restoreprefs' => 'Alle standardinstellingen weerummezetten (veur alle seksies)',
 'prefs-editing' => 'Bewarkingsveld',
-'prefs-edit-boxsize' => 'Aofmetingen van t bewarkingsvienster.',
 'rows' => 'Regels',
 'columns' => 'Kolommen',
 'searchresultshead' => 'Zeukresultaoten',
@@ -1408,9 +1461,9 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
 'recentchangesdays-max' => '(hooguut $1 {{PLURAL:$1|dag|dagen}})',
 'recentchangescount' => 'Standard antal bewarkingen um te laoten zien:',
 'prefs-help-recentchangescount' => 'Dit geldt veur leste wiezigingen, ziedgeschiedenisse en logboekziejen',
-'prefs-help-watchlist-token' => "A'j in dit veld n geheime kode invullen, dan maakt t RSS-voer an veur joew volglieste.
-Iederene die disse kode weet kan joew volglieste bekieken, kies dus n veilige kode.
-Je kunnen oek disse egenereren standardkode gebruken: $1",
+'prefs-help-watchlist-token2' => "Dit is de geheime sleutel veur de webvoer van joew volglieste.
+Iederene die t token kent, kan joew volglieste bekieken, dus deel dit token niet.
+Je kunnen de [[Special:ResetTokens|tokens opniej instellen]] a'j dat willen.",
 'savedprefs' => 'Veurkeuren bin op-esleugen.',
 'timezonelegend' => 'Tiedzone:',
 'localtime' => 'Plaotselike tied:',
@@ -1441,7 +1494,6 @@ Je kunnen oek disse egenereren standardkode gebruken: $1",
 'prefs-reset-intro' => 'Je kunnen disse zied gebruken um joew veurkeuren naor de standardinstellingen weerumme te zetten.
 Disse haandeling kan niet ongedaonemaakt wörden.',
 'prefs-emailconfirm-label' => 'Netpostbevestiging:',
-'prefs-textboxsize' => 'Aofmetingen bewarkingsscharm',
 'youremail' => 'Netpostadres (niet verplicht) *',
 'username' => '{{GENDER:$1|Gebrukersnaam}}:',
 'uid' => '{{GENDER:$1|Gebrukersnummer}}:',
@@ -1475,6 +1527,8 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'prefs-dateformat' => 'Daotumopmaak:',
 'prefs-timeoffset' => 'Tiedsverschil',
 'prefs-advancedediting' => 'Algemene opsies',
+'prefs-editor' => 'Bewarkingsprogramma',
+'prefs-preview' => 'Naokieken',
 'prefs-advancedrc' => 'Aandere instellingen',
 'prefs-advancedrendering' => 'Aandere instellingen',
 'prefs-advancedsearchoptions' => 'Aandere instellingen',
@@ -1482,7 +1536,9 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'prefs-displayrc' => 'Weergave-instellingen',
 'prefs-displaysearchoptions' => 'Weergave-instellingen',
 'prefs-displaywatchlist' => 'Weergave-instellingen',
+'prefs-tokenwatchlist' => 'Token',
 'prefs-diffs' => 'Verschillen',
+'prefs-help-prefershttps' => "Disse veurkeur wörden toe-epast a'j je eigen de volgende keer anmelden.",
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Geldig netpostadres',
@@ -1509,6 +1565,8 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'userrights-notallowed' => 'Je hebben gien rechten um gebrukersrechten toe te kunnen wiezen of in te trekken.',
 'userrights-changeable-col' => "Groepen die'j beheren kunnen",
 'userrights-unchangeable-col' => "Groepen die'j niet beheren kunnen",
+'userrights-conflict' => 'Konflikt bie t wiezigen van gebrukersrechten! Kiek joew wiezigingen nao en bevestig t.',
+'userrights-removed-self' => 'Je hebben joew eigen bevoegdhejen in-etrökken. Je kunnen disse zied niet meer gebruken.',
 
 # Groups
 'group' => 'Groep:',
@@ -1574,11 +1632,19 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'right-proxyunbannable' => "Blokkeringen veur proxy's gelden niet",
 'right-unblockself' => 'Eigen gebruker deblokkeren',
 'right-protect' => "Beveiligingsnivo's wiezigen",
-'right-editprotected' => 'Beveiligden ziejen bewarken',
+'right-editprotected' => 'Ziejen bewarken die beveiligd bin as "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Ziejen bewarken die beveiligd bin as "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Systeemteksten bewarken',
 'right-editusercssjs' => 'De CSS- en JS-bestaanden van aandere gebrukers bewarken',
 'right-editusercss' => 'De CSS-bestaanden van aandere gebrukers bewarken',
 'right-edituserjs' => 'De JS-bestaanden van aandere gebrukers bewarken',
+'right-editmyusercss' => 'Joew eigen CSS-ziejen bewarken',
+'right-editmyuserjs' => 'Joew eigen JavaScript-ziejen bewarken',
+'right-viewmywatchlist' => 'Joew eigen volglieste bekieken',
+'right-editmywatchlist' => 'Joew eigen volglieste bewarken. Via sommige haandelingen kunnen nog altied ziejen derbie ezet wörden, zelfs zonder disse bevoegdheid',
+'right-viewmyprivateinfo' => 'Joew eigen priveegegevens bekieken (bieveurbeeld netpostadres, echte naam)',
+'right-editmyprivateinfo' => 'Joew eigen priveegegevens bewarken (bieveurbeeld netpostadres, echte naam)',
+'right-editmyoptions' => 'Joew eigen veurkeuren bewarken',
 'right-rollback' => 'Gauw de leste bewarking(en) van n gebruker an n zied weerummedreien',
 'right-markbotedits' => 'Weerummedreien bewarkingen markeren as botbewarkingen',
 'right-noratelimit' => 'Hef gien tiedsaofhankelike beparkingen',
@@ -1640,12 +1706,19 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'action-userrights-interwiki' => "de rechten van gebrukers op aandere wiki's bewarken",
 'action-siteadmin' => 'de databanke blokkeren of vriegeven',
 'action-sendemail' => 'netpostberichten versturen',
+'action-editmywatchlist' => 'joew eigen volglieste bewarken',
+'action-viewmywatchlist' => 'joew eigen volglieste bekieken',
+'action-viewmyprivateinfo' => 'joew eigen priveegegevens bekieken',
+'action-editmyprivateinfo' => 'joew eigen priveegegevens bewarken',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|wieziging|wiezigingen}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sinds joew leste bezeuk}}',
+'enhancedrc-history' => 'geschiedenisse',
 'recentchanges' => 'Leste wiezigingen',
 'recentchanges-legend' => 'Opsies veur leste wiezigingen',
 'recentchanges-summary' => "Op disse zied ku'j de leste wiezigingen van disse wiki bekieken.",
+'recentchanges-noresult' => 'Der waren in disse periode gien wiezigingen die an de kriteria voldoon.',
 'recentchanges-feed-description' => 'Zeuk naor de alderleste wiezingen op disse wiki in disse voer.',
 'recentchanges-label-newpage' => 'Mit disse bewarking is n nieje zied an-emaakt',
 'recentchanges-label-minor' => 'Dit is n kleine wieziging',
@@ -1683,7 +1756,6 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'recentchangeslinked-feed' => 'Volg verwiezigingen',
 'recentchangeslinked-toolbox' => 'Volg verwiezigingen',
 'recentchangeslinked-title' => 'Wiezigingen verwaant an $1',
-'recentchangeslinked-noresult' => 'Gien wiezigingen of zied waornaor verwezen wörden in disse periode.',
 'recentchangeslinked-summary' => "Op disse spesiale zied steet n lieste mit de leste wieziginen op ziejen waornaor verwezen wörden. Ziejen op [[Special:Watchlist|joew volglieste]] staon '''vet-edrokt'''.",
 'recentchangeslinked-page' => 'Ziednaam:',
 'recentchangeslinked-to' => 'Bekiek wiezigingen op ziejen mit verwiezingen naor disse zied',
@@ -1694,7 +1766,7 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'reuploaddesc' => 'Weerumme naor de opstuurzied',
 'upload-tryagain' => 'Bestaandsbeschrieving biewarken',
 'uploadnologin' => 'Niet an-emeld',
-'uploadnologintext' => 'Je mutten [[Special:UserLogin|an-emeld]] ween um bestaanden toe te kunnen voegen.',
+'uploadnologintext' => 'Je mutten $1 ween um bestaanden op te kunnen sturen.',
 'upload_directory_missing' => 'De inlaojmap veur bestaanden ($1) is vort en kon niet an-emaakt wörden deur de webserver.',
 'upload_directory_read_only' => "Op t moment ku'j gien bestaanden opsturen vanwegen techniese problemen ($1).",
 'uploaderror' => 'Fout bie t inlaojen van t bestaand',
@@ -1910,7 +1982,6 @@ Um beveiligingsredens is img_auth.php uutezet.',
 'http-read-error' => 'Fout bie t lezen van HTTP',
 'http-timed-out' => 'Tiedsoverschriejing bie t HTTP-verzeuk',
 'http-curl-error' => 'Fout bie t ophaolen van t webadres: $1',
-'http-host-unreachable' => 'Kon webadres niet bereiken.',
 'http-bad-status' => 'Der is n probleem mit t HTTP-verzeuk: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1938,6 +2009,10 @@ Um beveiligingsredens is img_auth.php uutezet.',
 'listfiles_size' => 'Grootte (bytes)',
 'listfiles_description' => 'Beschrieving',
 'listfiles_count' => 'Versies',
+'listfiles-show-all' => 'Ouwe versies van aofbeeldingen opnemen',
+'listfiles-latestversion' => 'Aktuele versie',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nee',
 
 # File description page
 'file-anchor-link' => 'Bestaand',
@@ -2031,6 +2106,13 @@ Vergeet niet de verwiezingen nao te kieken veurda\'j de mal vortdoon.',
 'randompage' => 'Netzelde welk artikel',
 'randompage-nopages' => 'Der staon gien ziejen in de {{PLURAL:$2|naamruumte|naamruumtes}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Netzelde welke zied in n kategorie',
+'randomincategory-invalidcategory' => '"$1" is gien geldige kategorienaam.',
+'randomincategory-nopages' => 'Der bin gien ziejen in [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Netzelde welke zied uut de kategorie: $1 $2',
+'randomincategory-selectcategory-submit' => 'Laot kulen',
+
 # Random redirect
 'randomredirect' => 'Netzelde welke deurverwiezing',
 'randomredirect-nopages' => 'Der staon gien deurverwiezingen in de naamruumte "$1".',
@@ -2056,17 +2138,13 @@ Vergeet niet de verwiezingen nao te kieken veurda\'j de mal vortdoon.',
 'statistics-users-active-desc' => 'Gebrukers die de veurbieje {{PLURAL:$1|dag|$1 dagen}} n haandeling uutevoerd hebben',
 'statistics-mostpopular' => 'Meestbekeken ziejen',
 
-'disambiguations' => 'Ziejen die verwiezen naor deurverwiesziejen',
-'disambiguationspage' => 'Template:Dv',
-'disambiguations-text' => "Hieronder staon ziejen mit tenminsten één verwiezing naor n '''deurverwieszied'''. 
-Feitelik mutten ze rechtstreeks verwiezen naor t juuste onderwarp.<br />
-Ziejen wörden ezien as n deurverwieszied, as de mal gebruukt wörden die vermeld steet op [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Ziejen mit n ziedeigenschap',
 'pageswithprop-legend' => 'Ziejen mit n zied-eigenschap',
 'pageswithprop-text' => 'Op disse zied staon ziejen mit n bepaolde ziedeigenschap.',
 'pageswithprop-prop' => 'Naam van de eigenschap:',
 'pageswithprop-submit' => 'Zeuk',
+'pageswithprop-prophidden-long' => 'lange teksteigenschapsweerde verbörgen ($1)',
+'pageswithprop-prophidden-binary' => 'binaere eigenschapsweerde verbörgen ($1)',
 
 'doubleredirects' => 'Dubbele deurverwiezingen',
 'doubleredirectstext' => 'Op disse lieste staon alle ziejen die deurverwiezen naor aandere deurverwiezingen.
@@ -2124,6 +2202,7 @@ Meestentieds is leste zied de gewunste doelzied, waor oek de eerste zied heer zo
 'mostrevisions' => 'Artikels mit de meeste bewarkingen',
 'prefixindex' => 'Alle ziejen op veurvoegsel',
 'prefixindex-namespace' => 'Alle ziejen mit t veurvoegsel (naamruumte $1)',
+'prefixindex-strip' => 'Veurvoegsel in lieste vortdoon',
 'shortpages' => 'Korte artikels',
 'longpages' => 'Lange artikels',
 'deadendpages' => 'Ziejen zonder verwiezingen',
@@ -2139,6 +2218,7 @@ Meestentieds is leste zied de gewunste doelzied, waor oek de eerste zied heer zo
 'listusers' => 'Gebrukerslieste',
 'listusers-editsonly' => 'Allinnig gebrukers mit bewarkingen laoten zien',
 'listusers-creationsort' => 'Sorteren op inschriefdaotum',
+'listusers-desc' => 'Sorteren in aoflopende volgorde',
 'usereditcount' => '$1 {{PLURAL:$1|bewarking|bewarkingen}}',
 'usercreated' => '{{GENDER:$3|Eregistreerd}} op $1 um $2',
 'newpages' => 'Nieje artikels',
@@ -2319,10 +2399,9 @@ Toekomstige wiezigingen op disse zied en de overlegzied zullen hier vermeld wör
 'unwatchthispage' => 'Niet volgen',
 'notanarticle' => 'Gien artikel',
 'notvisiblerev' => 'Bewarking is vortedaon',
-'watchnochange' => 'Gien van de ziejen op joew volglieste is in disse periode ewiezigd',
 'watchlist-details' => 'Der {{PLURAL:$1|steet één zied|staon $1 ziejen}} op joew volglieste, zonder de overlegziejen mee-erekend.',
 'wlheader-enotif' => 'Je kriegen bericht per netpost',
-'wlheader-showupdated' => "* Ziejen die sinds joew leste bezeuk bie-ewörken bin, staon '''vet-edrokt'''.",
+'wlheader-showupdated' => "Ziejen die sinds joew leste bezeuk bie-ewörken bin, staon '''vet-edrokt'''.",
 'watchmethod-recent' => "leste wiezigingen an t naokieken op ziejen die'j volgen",
 'watchmethod-list' => 'Kik joew nao volglieste veur de leste wiezigingen',
 'watchlistcontains' => 'Der {{PLURAL:$1|steet 1 zied|staon $1 ziejen}} op joew volglieste.',
@@ -2566,7 +2645,7 @@ $1',
 'contributions' => '{{GENDER:$1|Biedragen van disse gebruker}}',
 'contributions-title' => 'Biedragen van $1',
 'mycontris' => 'Mien biedragen',
-'contribsub2' => 'Veur $1 ($2)',
+'contribsub2' => 'Veur {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Gien wiezigingen evunnen die an de estelde criteria voldoon.',
 'uctop' => '(leste wieziging)',
 'month' => 'Maond:',
@@ -2723,14 +2802,12 @@ Wi'j de instellingen wiezigen?",
 De blokkering is onderdeel van de reeks $2, waorvan de blokkering wel op-eheven kan wörden.',
 'ip_range_invalid' => 'Ongeldige IP-reeks',
 'ip_range_toolarge' => 'Groeps-IP-adressen die groter bin as /$1, bin niet toe-estaon.',
-'blockme' => 'Mien blokkeren',
 'proxyblocker' => 'Proxyblokker',
-'proxyblocker-disabled' => 'Disse funksie is uutezet.',
 'proxyblockreason' => "Dit is n automatiese preventieve blokkering umda'j gebruukmaken van n open proxyserver.",
-'proxyblocksuccess' => 'Suksesvol.',
 'sorbsreason' => "Joew IP-adres is op-eneumen as open proxyserver in de zwarte lieste van DNS die'w veur {{SITENAME}} gebruken.",
 'sorbs_create_account_reason' => "Joew IP-adres is op-eneumen as open proxyserver in de zwarte lieste van DNS, die'w veur {{SITENAME}} gebruken.
 Je kunnen gien gebrukerszied anmaken.",
+'xffblockreason' => "n IP-adres dat jie gebruken is eblokkeerd. Dit steet in de kop 'X-Forwarded-For'. De oorspronkelike reden veur de blokkerings is: $1",
 'cant-block-while-blocked' => "Je kunnen aandere gebrukers niet blokkeren a'j zelf oek eblokkeerd bin.",
 'cant-see-hidden-user' => "De gebruker die'j proberen te blokkeren is al eblokkeerd en verbörgen.
 Umda'j gien rech hebben um gebrukers te verbargen, ku'j de blokkering van de gebruker niet bekieken of bewarken.",
@@ -2889,6 +2966,8 @@ Kiek oek effen bie [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisasie]
 'thumbnail-more' => 'vergroten',
 'filemissing' => 'Bestaand ontbrik',
 'thumbnail_error' => 'Fout bie t laojen van de miniatuuraofbeelding: $1',
+'thumbnail_error_remote' => 'Foutmelding van $1:
+$2',
 'djvu_page_error' => 'DjVu-zied buten bereik',
 'djvu_no_xml' => 'Kon de XML-gegevens veur t DjVu-bestaand niet oproepen',
 'thumbnail-temp-create' => 'Kon gien tiedelik miniatuurbestaand anmaken.',
@@ -3038,6 +3117,7 @@ De tiedelike map is niet anwezig.',
 Iej könt in de bewearkingssamenvatting n reden opgeven.',
 'tooltip-preferences-save' => 'Vuurkeuren opsloan',
 'tooltip-summary' => 'Voer ne korte samenvatting in',
+'tooltip-iwiki' => '$1 – $2',
 
 # Metadata
 'notacceptable' => 'De wikiserver kan de gegevens niet leveren in n vorm die joew kliënt kan lezen.',
@@ -3111,13 +3191,8 @@ Meestentieds kömp dit deur n uutgaonde verwiezing die op de zwarte lieste steet
 'pageinfo-category-files' => 'Antal bestaanden',
 
 # Skin names
-'skinname-standard' => 'Klassiek',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Keuls blauw',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'MienSkin',
-'skinname-chick' => 'Deftig',
-'skinname-simple' => 'Eenvoudig',
 'skinname-modern' => 'Niejmoeds',
 
 # Patrolling
@@ -3195,11 +3270,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minuut|$1 minuten}}',
 'hours' => '{{PLURAL:$1|$1 ure|$1 uren}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
+'weeks' => '{{PLURAL: $1|één weke|$1 weken}}',
 'months' => '{{PLURAL:$1|een maond|$1 maonden}}',
 'years' => '{{PLURAL:$1|één jaor|$1 jaor}}',
 'ago' => '$1 eleen',
 'just-now' => 'onderlest',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|uur}} elejen',
+'minutes-ago' => '$1 {{PLURAL:$1|minuut|minuten}} elejen',
+'seconds-ago' => '$1 {{PLURAL:$1|sekonde|sekonden}} elejen',
+'monday-at' => 'Maondag um $1',
+'tuesday-at' => 'Diensdag um $1',
+'wednesday-at' => 'Woonsdag um $1',
+'thursday-at' => 'Donderdag um $1',
+'friday-at' => 'Vriedag um $1',
+'saturday-at' => 'Zaoterdag um $1',
+'sunday-at' => 'Zundag um $1',
+'yesterday-at' => 'Gisteren um $1',
+
 # Bad image list
 'bad_image_list' => 'De opmaak is as volgt:
 
@@ -3228,7 +3317,7 @@ Aandere velden wörden verbörgen.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Wiedte',
 'exif-imagelength' => 'Heugte',
 'exif-bitspersample' => 'Bits per komponent',
@@ -3406,7 +3495,7 @@ Aandere velden wörden verbörgen.
 'exif-originalimageheight' => 'Heugte van de aofbeelding veur biesniejen',
 'exif-originalimagewidth' => 'Breedte van de aofbeelding veur biesniejen',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Niet ekomprimeerd',
 'exif-compression-2' => 'CCITT-groep 3 1-dimensionale an-epasten "Huffman run length"-kodering',
 'exif-compression-3' => 'CCITT-groep 3 faxcodering',
@@ -3793,7 +3882,6 @@ Je kunnen oek [[Special:EditWatchlist|t standardbewarkingsscharm gebruken]].',
 'version-other' => 'Overige',
 'version-mediahandlers' => 'Mediaverwarkers',
 'version-hooks' => 'Hoeken',
-'version-extension-functions' => 'Uutbreidingsfunksies',
 'version-parser-extensiontags' => 'Parseruutbreidingsplaotjes',
 'version-parser-function-hooks' => 'Parserfunksiehoeken',
 'version-hook-name' => 'Hooknaam',
@@ -3802,6 +3890,7 @@ Je kunnen oek [[Special:EditWatchlist|t standardbewarkingsscharm gebruken]].',
 'version-license' => 'Lisensie',
 'version-poweredby-credits' => "Disse wiki wörden an-estuurd deur '''[//www.mediawiki.org/ MediaWiki]''', auteursrecht © 2001-$1 $2.",
 'version-poweredby-others' => 'aanderen',
+'version-poweredby-translators' => 'vertalers van translatewiki.net',
 'version-credits-summary' => 'Wulen erkennen grege de volgende personen veur der biedrage an [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki is vrieje programmatuur; je kunnen MediaWiki verspreien en/of anpassen onder de veurweerden van de GNU General Public License zo as epubliceerd deur de Free Software Foundation; of versie 2 van de Lisensie, of - naor eigen wuns - n laotere versie.
 
@@ -3815,13 +3904,17 @@ Samen mit dit programma heur je n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van de
 'version-entrypoints-header-entrypoint' => 'Ingang',
 'version-entrypoints-header-url' => 'Webadres',
 
-# Special:FilePath
-'filepath' => 'Bestaandslokasie',
-'filepath-page' => 'Bestaand:',
-'filepath-submit' => 'Zeuken',
-'filepath-summary' => 'Disse spesiale zied gif t hele pad veur n bestaand. 
-Aofbeeldingen wörden in resolusie helemaole weeregeven. 
-Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma opend.',
+# Special:Redirect
+'redirect' => 'Deurverwiezen op bestaandsnaam, gebrukersnummer of versienummer',
+'redirect-legend' => 'Deurverwiezen naor n bestaand of zied',
+'redirect-summary' => 'Disse spesiale zied verwis deur naor n bestaand (as n bestaandsnaam op-egeven wörden), n zied (as n versienummer op-egeven wörden) of n gebrukerszied (as t gebrukersnummer op-egeven wörden).',
+'redirect-submit' => 'Zeuk',
+'redirect-lookup' => 'Opzeuken:',
+'redirect-value' => 'Weerde:',
+'redirect-user' => 'Gebrukersnummer',
+'redirect-revision' => 'Ziedversie',
+'redirect-file' => 'Bestaandsnaam',
+'redirect-not-exists' => 'Weerde niet evunnen',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dubbele bestaanden zeuken',
@@ -3871,12 +3964,16 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
 'tags' => 'Geldige wiezigingsetiketten',
 'tag-filter' => '[[Special:Tags|Etiketfilter]]:',
 'tag-filter-submit' => 'Filtreren',
+'tag-list-wrapper' => '([[Special:Tags|Etiket{{PLURAL:$1||ten}}]]: $2)',
 'tags-title' => 'Etiket',
 'tags-intro' => 'Op disse zied staon de etiketten waormee de programmatuur elke bewarking kan markeren, en de betekenisse dervan.',
 'tags-tag' => 'Etiketnaam',
 'tags-display-header' => 'Weergave in wiezigingsliesten',
 'tags-description-header' => 'Beschrieving van de betekenisse',
+'tags-active-header' => 'Aktief?',
 'tags-hitcount-header' => 'Bewarkingen mit etiket',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nee',
 'tags-edit' => 'bewarking',
 'tags-hitcount' => '$1 {{PLURAL:$1|wieziging|wiezigingen}}',
 
@@ -3897,6 +3994,7 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
 'dberr-problems' => 't Spiet ons, mer disse webstee hef op t moment wat techniese problemen.',
 'dberr-again' => 'Wach n paor minuten en probeer t daornao opniej.',
 'dberr-info' => '(Kan gien verbiending maken mit de databankeserver: $1)',
+'dberr-info-hidden' => '(Kan gien verbiending maken mit de databankserver)',
 'dberr-usegoogle' => "Misschien ku'j ondertussen zeuken via Google.",
 'dberr-outofdate' => 'Let op: indexen die zee hebben van onze ziejen bin misschien niet aktueel.',
 'dberr-cachederror' => 'Disse zied is n kopie uut t tussengeheugen en is misschien niet aktueel.',
@@ -3912,6 +4010,9 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
 'htmlform-submit' => 'Opslaon',
 'htmlform-reset' => 'Wiezigingen ongedaonmaken',
 'htmlform-selectorother-other' => 'Aanders',
+'htmlform-no' => 'Nee',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Kies n opsie',
 
 # SQLite database support
 'sqlite-has-fts' => 'Versie $1 mit ondersteuning veur "full-text" zeuken',
@@ -4029,4 +4130,19 @@ Aanders ku\'j oek t eenvoudige formulier hieronder gebruken. Joew kommentaar zal
 # Image rotation
 'rotate-comment' => 'Aofbeelding is $1 {{PLURAL:$1|graod|graojen}} mit de klokke mee edreid',
 
+# Limit report
+'limitreport-title' => 'Parser-profieldata:',
+'limitreport-cputime' => 'Tiedsgebruuk van de prosessor',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekonde|sekonden}}',
+'limitreport-walltime' => 'Reëel tiedsgebruuk',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekonde|sekonden}}',
+'limitreport-ppvisitednodes' => 'Antal verbiendingsknopen bezöcht tiejens de veurverwarking:',
+'limitreport-ppgeneratednodes' => 'Antal verbiedingsknopen an-emaakt tiejens de veurverwarking:',
+'limitreport-postexpandincludesize' => 'Inklusiegrootte nao uutbreien',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Grootte van malparameters',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => 'Hoogste uutbreidingsdiepte',
+'limitreport-expensivefunctioncount' => 'Antal kostbaore parserfunksies',
+
 );
diff --git a/languages/messages/MessagesNe.php b/languages/messages/MessagesNe.php
index 38dad29e..b96da5ac 100644
--- a/languages/messages/MessagesNe.php
+++ b/languages/messages/MessagesNe.php
@@ -83,9 +83,6 @@ $messages = array(
 'tog-shownumberswatching' => 'निगरानी गरिरहेका प्रयोगकर्ताहरुको संख्या देखाउने',
 'tog-oldsig' => 'वर्तमान हस्ताक्षर:',
 'tog-fancysig' => 'मेरो दस्तखतलाई विकि पाठको रुपमा लिने(स्वत सम्वन्ध बिना)',
-'tog-externaleditor' => 'पूर्वनिर्धारित रुपमा बाह्य सम्पादक प्रयोग गर्नुहोस् (विज्ञहरुको लागि मात्र, तपाईको कम्प्युटरमा विशेष अनुकुलता आवश्यक हुन्छ [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'पूर्वनिर्धारित रुपमा बाह्य diff प्रयोग गर्नुहोस (विज्ञ प्रयोगकर्ताहरुको लागि मात्र, तपाईंको कम्प्युटरमा विशेष अनुकुलता आवश्यक हुन्छ [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => '"जाने" पहुँच सम्वन्ध सक्रिय पार्ने',
 'tog-uselivepreview' => 'प्रत्यक्ष पूर्वरुप प्रयोग गर्नुहोस् (प्रयोगात्मक)',
 'tog-forceeditsummary' => 'खाली सम्पादन सार प्रविष्टि गरेमा मलाई सोध्ने',
 'tog-watchlisthideown' => 'मेरा सम्पादनहरू निगनारी सूचीबाट लुकाउने',
@@ -99,6 +96,8 @@ $messages = array(
 'tog-showhiddencats' => 'लुकाइएको प्रकारहरु देखाउने',
 'tog-noconvertlink' => 'सम्बन्ध शीर्षक रुपान्तरण निस्क्रिय पार्ने',
 'tog-norollbackdiff' => 'पूर्वस्थितिमा फर्काएपछि  diff हटाउने',
+'tog-useeditwarning' => 'सम्पादनहरू सङ्ग्रह गरिनसकेको अवस्थामा अर्को पृष्ठमा जान खोज्दा चेतावनी देखाउने',
+'tog-prefershttps' => 'प्रवेश गर्दा जहिले पनि सुरक्षित जडान प्रयोग गर्ने',
 
 'underline-always' => 'सधैँ',
 'underline-never' => 'कहिल्यै',
@@ -162,6 +161,18 @@ $messages = array(
 'oct' => 'अक्टोबर',
 'nov' => 'नोभेम्बर',
 'dec' => 'डिसेम्बर',
+'january-date' => 'जनवरी $1',
+'february-date' => 'फेब्रुअरी $1',
+'march-date' => 'मार्च $1',
+'april-date' => 'अप्रिल $1',
+'may-date' => 'मे $1',
+'june-date' => 'जुन $1',
+'july-date' => 'जुलाई $1',
+'august-date' => 'अगस्ट $1',
+'september-date' => 'सेप्टेम्बर $1',
+'october-date' => 'अक्टोबर $1',
+'november-date' => 'नोभेम्बर $1',
+'december-date' => 'डिसेम्बर $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|श्रेणी|श्रेणीहरु}}',
@@ -182,7 +193,7 @@ $messages = array(
 'noindex-category' => 'क्रमांकन नगरिएका पृष्ठहरु',
 'broken-file-category' => 'टुटेको फाइल लिंकसितको पृष्ठ',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'बारेमा',
 'article' => 'सामाग्री पृष्ठ',
@@ -245,6 +256,7 @@ $messages = array(
 'create-this-page' => 'यो पृष्ठ बनाउने',
 'delete' => 'मेट्ने',
 'deletethispage' => 'यो पृष्ठ हटाउनुहोस्',
+'undeletethispage' => 'मेटेको पृष्ठ फिर्तागर्ने',
 'undelete_short' => '{{PLURAL:$1|एउटा  मेटिएको सम्पादन|$1 मेटिएका सम्पादनहरु}} फर्काउने',
 'viewdeleted_short' => '{{PLURAL:$1|मेटिएको सम्पादन |$1 मेटिएका सम्पादनहरू}}',
 'protect' => 'सुरक्षित राख्नुहोस्',
@@ -261,7 +273,7 @@ $messages = array(
 'articlepage' => 'कन्टेन्ट पृष्ठ हेर्नुहोस्',
 'talk' => 'वार्तालाप',
 'views' => 'अवलोकनहरू',
-'toolbox' => 'औजारबट्टा',
+'toolbox' => 'औजारहरू',
 'userpage' => 'प्रयोगकर्ता पृष्ठ हेर्ने',
 'projectpage' => 'प्रोजेक्ट पृष्ठ हेर्ने',
 'imagepage' => 'फाइल पृष्ठ हेर्नुहोस्',
@@ -288,7 +300,7 @@ $1',
 'pool-queuefull' => 'प्रतीक्षा पंक्ति भरियो',
 'pool-errorunknown' => 'अज्ञात त्रुटि',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}को बारेमा',
 'aboutpage' => 'Project:बारेमा',
 'copyright' => 'सामाग्री $1 अनुसार उपलब्ध छ, खुलाइएको अवस्था बाहेकको हकमा ।',
@@ -298,7 +310,6 @@ $1',
 'disclaimers' => 'अस्विकारोक्तिहरु',
 'disclaimerpage' => 'Project:सामान्य अस्वीकारोक्ति',
 'edithelp' => 'सम्पादन सहायता',
-'edithelppage' => 'Help:सम्पादन',
 'helppage' => 'Help:विषयवस्तुहरू',
 'mainpage' => 'मुख्य पृष्ठ',
 'mainpage-description' => 'मुख्य पृष्ठ',
@@ -325,9 +336,11 @@ $1',
 'newmessageslink' => 'नयाँ सन्देशहरू',
 'newmessagesdifflink' => 'आखिरी परिवर्तन',
 'youhavenewmessagesfromusers' => 'तपाईंको लागि  {{PLURAL:$3|प्रयोगकर्ता|$3 प्रयोगकर्ताहरु}} ($2) बाट $1',
+'youhavenewmessagesmanyusers' => 'तपाईँलाई धेरै प्रयोगकर्ताहरू($2) बाट $1 छ ।',
+'newmessageslinkplural' => '{{PLURAL:$1|नयाँ सन्देश|नयाँ सन्देशहरू}}',
+'newmessagesdifflinkplural' => 'अन्तिम {{PLURAL:$1|सम्पादन|सम्पादनहरू}}',
 'youhavenewmessagesmulti' => 'तपाईंको लागि $1 मा  नयाँ सन्देशहरू छन्',
 'editsection' => 'सम्पादन',
-'editsection-brackets' => '[$1]',
 'editold' => 'सम्पादन गर्ने',
 'viewsourceold' => 'स्रोत हेर्नुहोस्',
 'editlink' => 'सम्पादन',
@@ -379,15 +392,12 @@ $1',
 # General errors
 'error' => 'त्रुटि',
 'databaseerror' => 'डेटावेस त्रुटि',
-'dberrortext' => 'डेटाबेस क्वेरी सूत्र त्रुटी भएको छ ।
-यसले सफ्टवेयरमा बग रहेको देखाउन सक्दछ ।
-डेटावेसमा पछिल्लो पटक प्रयास गरिएको क्वेरी:
-<blockquote><tt>$1</tt></blockquote>
- "<tt>$2</tt>" फङ्सन बाट बोलाइएको
-थियो "<tt>$3: $4</tt>" डेटावेस त्रुटि उत्पन्न ।',
-'dberrortextcl' => 'डेटाबेस क्वेरी वाक्यविन्यास त्रुटि भयो।
-"$2" कार्य भित्रबाट "$1" अन्तिम प्रयास गरिएको डेटाबेस क्वेरी थियो।
-डेटाबेसले दिएको त्रुटि "$3: $4"',
+'databaseerror-text' => 'डेटाबेस क्वेरीमा खराबी देखा पर्‌यो ।
+यसले सफ्टवेयरमा त्रुटी रहेको इङ्गित गर्न सक्छ ।',
+'databaseerror-textcl' => 'डेटावेस क्वेरीमा खराबी देखियो ।',
+'databaseerror-query' => 'क्वेरी: $1',
+'databaseerror-function' => 'फङ्सन : $1',
+'databaseerror-error' => 'खराबी: $1',
 'laggedslavemode' => "'''चेतावनी:''' पृष्ठमा हालका अद्यतनहरु नहुनसक्छन् ।",
 'readonly' => 'डेटाबेस बन्द गरिएको छ',
 'enterlockreason' => 'ताल्चा मार्नुको कारण दिनुहोस्, साथै ताल्चा हटाउने समयको अवधि अनुमान लगाउनुहोस्।',
@@ -418,6 +428,8 @@ $1',
 'cannotdelete' => '"$1" पृष्ठ वा फ़ाइल मेट्नसकिएन।
 यो अघिबाट नैं मेटिएको हुनुपर्छ।',
 'cannotdelete-title' => 'पृष्ठ  "$1" लाई मेट्न सकिएन',
+'delete-hook-aborted' => 'हुकले सम्पादनकार्य बन्द गरिदियो ।
+कुनै कारण दिइएन ।',
 'badtitle' => 'गलत शीर्षक',
 'badtitletext' => 'अनुरोध गरेको पृष्ठ शीर्षक अमान्य, खाली वा गलत रुपमा अन्तर भाषा वा अन्तर विकी सम्बन्ध गरिएको थियो।  यसमा शीर्षकमा प्रयोग गर्न नमिल्ने एक वा बढी अक्षरहरू रहेका हुनसक्छन् ।',
 'perfcached' => 'तलको डाटाहरु क्याचमा रहेका कुराहरु हुन्। अपटुडेट नहुनपनि सक्छन्।अधिकतम {{PLURAL:$1|नतिजा|$1 नतिजाहरू}} क्यासमा उपलब्ध छ।',
@@ -432,14 +444,14 @@ $1',
 'actionthrottled' => 'कार्य रोकियो',
 'actionthrottledtext' => 'स्पामबाट बच्ने तरिकाको रुपमा , तपाईँलाई यो कार्य थोरै समयमा धेरै पटक गर्नबाट सिमित गरिएको छ, र तपाईले आफ्नो सिमा पार गरिसक्नु भयो ।
 कृपया केही मिनेटहरु पछि पुन: प्रयास गर्नुहोस्  ।',
-'protectedpagetext' => 'यो पृष्ठ सम्पादन हुनबाट बचाउन सम्पादनमा रोक  लगाइएको छ।',
+'protectedpagetext' => 'यो पृष्ठ सम्पादन हुनबाट बचाउन सम्पादनमा तथा अन्यकार्यमा रोक लगाइएको छ।',
 'viewsourcetext' => 'तपाईँले यस पृष्ठको स्रोत हेर्न र प्रतिलिपी गर्न सक्नुहुन्छ ।',
 'viewyourtext' => "यस पृष्ठमा रहेका '''तपाईँका सम्पादनहरु''' हेर्न या प्रतिलिपी गर्न सक्नुहुन्छ :",
-'protectedinterface' => 'यो पृष्ठले सफ्टवेयरको लागि अन्तरमोहडा पाठ प्रदान गर्दछ , र यसलाई दुरुपयोग हुनबाट बचाउन ताल्चा मारिएको छ।',
+'protectedinterface' => 'यो पृष्ठले सफ्टवेयरको लागि अन्तरमोहडा पाठ प्रदान गर्दछ , र यसलाई दुरुपयोग हुनबाट बचाउन सुरक्षा प्रादन गरिएको छ।
+सम्पूर्ण विकिहरूका लागि अनुवादमा परिवर्तन गर्नको लागि [//translatewiki.net/ translatewiki.net], प्रयोग गर्नुहोस् ,  मिडियाविकि स्थानियकरण परियोजना ।',
 'editinginterface' => "'''चेतावनी:''' तपाईं यस्तो पृष्ठलाई सम्पादन गर्नुहुँदैछ, जसले सफ्टवेयरको लागि अन्तरमोहोड़ा (interface) पाठ प्रदान गर्दछ।
 यसको परिवर्तनले यस विकिमा अरु प्रयोगकर्ताको अन्तरमोहोड़ाको प्रदर्शनमा प्रभाव पार्छ।
 सबै विकिका निम्ति अनुवाद जोड्न अथवा परिबर्तन गर्न कृपया यहाँ जानुहोस् [//translatewiki.net/ translatewiki.net], मीडियाविकि स्थानीयकरण पारियोजना।",
-'sqlhidden' => '(SQL क्वेरी लुकाएको)',
 'cascadeprotected' => 'यो पृष्ठ सम्पादन गर्नबाट सुरक्षित गरिएकोछ किनभनें   {{PLURAL:$1|पृष्ठ |पृष्ठहरु}}मा  सुरक्षित गर्नुका साथै प्रपात ("cascading") विकल्प खुल्ला राखिएकोछ:
 $2',
 'namespaceprotected' => " '''$1'''  नेमस्पेसमा रहेका पृष्ठहरु सम्पादन गर्ने अनुमति यहाँलाई छैन ।",
@@ -448,9 +460,9 @@ $2',
 'ns-specialprotected' => 'विशेष पृष्ठ सम्पादन गर्न सकिदैन ।',
 'titleprotected' => ' [[User:$1|$1]]द्वारा यो शीर्षक निर्माणहुनबाट जोगाइएको छ।
 कारण   "\'\'$2\'\'" हो ।',
-'filereadonlyerror' => 'फाइल "$1" लाई परिवर्तन गर्न सकिंदैन किन भनें फाइल भण्डार  "$2" केवल पढ्ने स्थिति (read-only mode)मा छ।
+'filereadonlyerror' => 'फाइल "$1" लाई परिवर्तन गर्न सकिँदैन किन भने फाइल भण्डार  "$2" केवल पढ्ने स्थिति (read-only mode)मा छ।
 
-कारण यो दिएकोछ: "\'\'$3\'\'"।',
+यसलाई सुरक्षित गर्ने प्रवन्धकले  यो कारण दिएकाछन् : \'\'$3\'\'।',
 'exception-nologin' => 'प्रवेश (लग ईन) नगरिएको',
 
 # Virus scanner
@@ -460,15 +472,25 @@ $2',
 
 # Login and logout pages
 'logouttext' => "'''तपाईं अहिले बाहिर निस्कनु भएको छ।'''
-तपाईंले नाम/खाताविनै पनि {{SITENAME}}मा प्रयोग गर्न सक्नुहुन्छ, अथवा अघिकै वा अर्कै कुनै नामको खाताबाट <span class='plainlinks'>[$1 फेरि प्रवेश गर्न]</span> पनि सक्नुहुन्छ।
-याद राख्नुहोस् तपाईंले ब्राउजरको स्मरण भण्डार खालि नगर्दासम्म कुनै पृष्ठहरूमा तपाईं अझै प्रवेश गरिराखेको देखाउन सक्छ।",
+
+याद राख्नुहोस् तपाईंले ब्राउजरको क्याश खालि नगर्दासम्म कुनै पृष्ठहरूमा तपाईं अझै प्रवेश गरिराखेको देखाउन सक्छ।",
 'welcomeuser' => '$1जी स्वागत छ!',
 'yourname' => 'प्रयोगकर्ता नाम:',
+'userlogin-yourname' => 'प्रयोगकर्ता नाम',
+'userlogin-yourname-ph' => 'तपाईँको प्रयोगकर्तानाम लेख्नुहोस्',
+'createacct-another-username-ph' => 'प्रयोगकर्तानाम लेख्नुहोस्',
 'yourpassword' => 'पासवर्ड',
+'userlogin-yourpassword' => 'पासवर्ड',
+'userlogin-yourpassword-ph' => 'तपाईँको पासवर्ड लेख्नुहोस्',
+'createacct-yourpassword-ph' => 'पासवर्ड लेख्नुहोस्',
 'yourpasswordagain' => 'पासवर्ड फेरि टाईप गर्नुहोस्',
+'createacct-yourpasswordagain' => 'पासवर्ड निश्चित गर्नुहोस्',
+'createacct-yourpasswordagain-ph' => 'फेरि पासवर्ड लेख्नुहोस्',
 'remembermypassword' => 'यो कम्प्युटरमा मेरो प्रवेश याद गर । (धेरैमा $1 {{PLURAL:$1|दिन|दिनहरु}})',
-'securelogin-stick-https' => 'प्रवेश गरेपछि HTTPS सित जोड़िएर बस्ने',
+'userlogin-remembermypassword' => 'मलाई प्रवेश गराइराख्ने',
+'userlogin-signwithsecure' => 'सुक्षित जडान प्रयोग गर्ने',
 'yourdomainname' => 'तपाईंको ज्ञानक्षेत्र(डोमेन)',
+'password-change-forbidden' => 'यो विकिमा पासवर्ड परिवर्तन गर्न सक्नुहुन्न ।',
 'externaldberror' => 'यहाँ प्रमाणिकरण डेटाबेस त्रुटि भयो या त तपाईंलाई आफ्नो बाहिरी खाता अद्यतन गर्ने अनुमति छैन।',
 'login' => 'प्रवेश',
 'nav-login-createaccount' => 'प्रवेश गर्ने/नयाँ खाता बनाउने',
@@ -478,14 +500,33 @@ $2',
 'logout' => 'निर्गमन',
 'userlogout' => 'निर्गमन (लग आउउ)',
 'notloggedin' => 'प्रवेश (लग ईन) नगरिएको',
+'userlogin-noaccount' => 'के खाता छैन ?',
+'userlogin-joinproject' => '{{SITENAME}} मा खाता खोल्नुहोस् ।',
 'nologin' => 'तपाईको खाता छैन? $1 ।',
 'nologinlink' => 'नयाँ खाता खोल्नुहोस्',
 'createaccount' => 'खाता खोल्नुहोस्',
 'gotaccount' => "के तपाईँसँग पहिले देखि नै खाता छ ? '''$1''' ।",
 'gotaccountlink' => 'लग इन',
 'userlogin-resetlink' => 'प्रवेश सम्बन्धी विवरणहरु बिर्सनु भयो?',
-'createaccountmail' => 'इ-मेलबाट',
+'userlogin-resetpassword-link' => 'पासवर्ड परिवर्तन गर्नुहोस्',
+'userlogin-createanother' => 'अर्को खाता खोल्नुहोस्',
+'createacct-join' => 'तपाईँका जानकारीहरू तल थप्नुहोस् ।',
+'createacct-another-join' => 'नयाँ खाताको जानकारी तल थप्नुहोस ।',
+'createacct-emailrequired' => 'इमेल ठेगाना',
+'createacct-emailoptional' => 'इमेल ठेगाना (ऐच्छिक)',
+'createacct-email-ph' => 'तपाईँको इमेल ठेगाना भर्नुहोस्',
+'createacct-another-email-ph' => 'इमेल ठेगाना भर्नुहोस्',
+'createaccountmail' => 'कुनै अस्थाई र श्रिजित पासवर्ड प्रयोग गर्ने र खुलाईएको इमेलमा पठाउने',
+'createacct-realname' => 'वास्तविक नाम(ऐच्छिक)',
 'createaccountreason' => 'कारण :',
+'createacct-reason' => 'कारण',
+'createacct-reason-ph' => 'किन नयाँ खाता खोलिरहनु भएको हो ?',
+'createacct-captcha' => 'सुरक्षा जाँच',
+'createacct-imgcaptcha-ph' => 'माथि देखिए अनुसारको पाठ भर्नुहोस्',
+'createacct-submit' => 'तपाईँको खाता सिर्जना गर्नुहोस',
+'createacct-another-submit' => 'अर्को खाता सिर्जना गर्नुहोस्',
+'createacct-benefit-heading' => '{{SITENAME}} तपाईँ जस्तै मानिसहरूद्वारा सिर्जना गरिएको हो ।',
+'createacct-benefit-body1' => '{{PLURAL:$1|सम्पादन|सम्पादनहरू}}',
 'badretype' => 'तपाईंले दिनुभएको पासवर्ड मिल्दैन।',
 'userexists' => 'तपाईले प्रविष्ट गर्नुभएको प्रयोगकर्ताको नाम पहिले देखिनै प्रयोगमा छ ।
 कृपया फरक नाम छान्नुहोस् ।',
@@ -542,12 +583,11 @@ $2',
 'cannotchangeemail' => 'यस विकिमा तपाईको खातासँग सम्बन्धित इमेल ठेगाना परिवर्तन गर्न सकिन्न ।',
 'emaildisabled' => 'यो साइटले इमेलहरु पठाउन सक्तैन।',
 'accountcreated' => 'खाता खोलियो',
-'accountcreatedtext' => '$1 कोलागि प्रयोगकर्ता खाता खोलियो।',
+'accountcreatedtext' => '[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वार्ता]])$1 प्रयोगकर्ताको लागि खाता खोलिएको छ ।',
 'createaccount-title' => '{{SITENAME}}कोलागि खाता खोल्ने काम',
 'createaccount-text' => 'कसैले तपाईको इमेल ठेगानालाई {{SITENAME}} ($4) मा "$2" नामको खाता बनाएको छ, जसको पासवर्ड "$3" छ।',
 'usernamehasherror' => 'प्रयोगकर्तानाममा ह्यास अक्षरहरु राख्न मिल्दैन।',
-'login-throttled' => 'तपाईंले भर्खरै धेरै पल्ट प्रवेशको निम्ति प्रयास गर्नुभयो।
-कृपया पर्खेर केही समयपछि मात्र प्रयास गर्नुहोस्।',
+'login-throttled' => 'तपाईंले भर्खरै धेरै पल्ट प्रवेशको निम्ति प्रयास गर्नुभएको छ ,कृपया $1 पर्खेर मात्र प्रयास गर्नुहोस्।',
 'login-abort-generic' => 'तपाईंको प्रवेश असफल भयो - छोड़ियो',
 'loginlanguagelabel' => 'भाषा: $1',
 'suspicious-userlogout' => 'तपाईंको निर्गमन अनुरोध अस्विकार गरिन्छ किन कि यो खराब ब्राउजर वा क्यासिङ प्रोक्सिले पठाएको जस्तो देखिन्छ।',
@@ -566,7 +606,7 @@ $2',
 'newpassword' => 'नयाँ पासवर्ड:',
 'retypenew' => 'प्रवेश शव्द पुन: दिनुहोस् :',
 'resetpass_submit' => 'पासवर्ड व्यवस्थित गरी र प्रवेशगर्ने',
-'resetpass_success' => 'तपाईँको प्रवेशशव्द सफलतापूर्वक परिवर्तन भयो ! तपाईलाई प्रवेश गराइँदैछ ...',
+'changepassword-success' => 'तपाईँको पासवर्ड सफलतापूर्वक परिवर्तन भयो !',
 'resetpass_forbidden' => 'प्रवेशशव्द परिवर्तन गर्न मिल्दैन',
 'resetpass-no-info' => 'यो पृष्ठ सिधै हेर्नको लागि तपाईँले प्रवेश गर्नुपर्छ ।',
 'resetpass-submit-loggedin' => 'प्रवेशशव्द परिवर्तन गर्ने',
@@ -577,10 +617,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'प्रवेशशव्द पुनः तय गर्ने',
-'passwordreset-text' => 'तपाईंको खाता-विवरणको  इमेल अनुस्मारक प्राप्त गर्न यो फारम पूरा गर्नुहोस्।',
 'passwordreset-legend' => 'प्रवेशशव्द पुनः तय गर्ने',
 'passwordreset-disabled' => 'प्रवेश शव्द पुनः निर्धारण गर्ने व्यवस्था यस विकिमा निस्क्रिय पारिएको छ।',
-'passwordreset-pretext' => '{{PLURAL:$1||तल दिएका आँकड़ाका टुकुरा मध्ये एउटा प्रविष्ट गर्नुहोस्}}',
 'passwordreset-username' => 'प्रयोगकर्ता-नाम:',
 'passwordreset-domain' => 'डोमेन',
 'passwordreset-capture' => 'निस्कने इमेलको नमुना हेर्ने ?',
@@ -601,8 +639,8 @@ $2
 तपाईंले प्रवेश गरेर अहिले नैं नयाँ पासवर्ड चुन्नुहोस्। यदि अरु कसैले अनुरोध गरेको भए अथवा यदि तपाईंलाई मूल पासवर्ड याद भए अनि यसलाई परिवर्तन गर्न चाहनु हुन्न भनें, तपाईंले यस सन्देशलाई अनदेखा गर्नुहोस् र पुरानै पासवर्डलाई चालू राख्नुहोस्।',
 'passwordreset-emailelement' => 'प्रयोगकर्ताको नाम: $1
 अस्थाई पासवर्ड: $2',
-'passwordreset-emailsent' => 'एउटा अनुस्मारक इमेल पठाइयो।',
-'passwordreset-emailsent-capture' => 'अनुस्मारक इमेल पठाइयो, जो तल देखाइएकोछ।',
+'passwordreset-emailsent' => 'पासवर्ड परिवर्तनको लागि इमेल पठाइएको छ।',
+'passwordreset-emailsent-capture' => 'पासवर्ड परिवर्तनको लागि इमेल पठाइयो, जुन तल देखाइएकोछ।',
 
 # Special:ChangeEmail
 'changeemail' => 'इमेल ठेगाना परिवर्तन गर्नुहोस',
@@ -859,8 +897,8 @@ $2
 लिजेंड: (चालू): '''({{int:cur}})''' = अवतरणको बीचमा अंतर, '''({{int:last}})''' = पहिलाका अवतरणको बीचमा अंतर, '''{{int:minoreditletter}}''' = सानो परिवर्तन।",
 'history-fieldset-title' => 'इतिहासको विचरण गर्ने',
 'history-show-deleted' => 'मेटिएका मात्र',
-'histfirst' => 'पहिलो',
-'histlast' => 'अन्तिम',
+'histfirst' => 'पुरानो',
+'histlast' => 'नयाँ',
 'historysize' => '({{PLURAL:$1|१ बाइट |$1 बाइटहरु}})',
 'historyempty' => '(खाली)',
 
@@ -1022,7 +1060,6 @@ $1",
 'searchmenu-legend' => 'खोज विकल्प',
 'searchmenu-exists' => "''' \"[[:\$1]]\" नाम गरेको पृष्ठ  यो विकीमा रहेको छ'''",
 'searchmenu-new' => "'''यस विकिमा  \"[[:\$1]]\" शीर्षक भएको पृष्ठ बनाउनुहोस् !'''",
-'searchhelp-url' => 'Help:सामग्री',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|पृष्ठहरु प्रिफिक्सले हेर्नुहोस् ]]',
 'searchprofile-articles' => 'सामग्री पृष्ठहरु',
 'searchprofile-project' => 'सहायता र आयोजना पृष्ठहरु',
@@ -1044,7 +1081,7 @@ $1",
 'search-interwiki-default' => '$1 नतिजाहरु:',
 'search-interwiki-more' => '(अझै)',
 'search-relatedarticle' => 'सम्बन्धित',
-'mwsuggest-disable' => 'AJAX सुझाव निस्क्रिय पार्नुहोस्',
+'mwsuggest-disable' => 'खोज सुझावहरु अक्षम पार्ने',
 'searcheverything-enable' => 'सबै नेमस्पेसेजहरुमा खोज्नुहोस्',
 'searchrelated' => 'सम्बन्धित',
 'searchall' => 'सबै',
@@ -1067,15 +1104,6 @@ $1",
 हाललाई तपाईले गूगलद्वारा खोज्न सक्नुहुन्छ ।
 याद गर्नुहोस् उनीहरुको {{SITENAME}}को सूची सामग्री पुरानो भएको हुनसक्छ ।',
 
-# Quickbar
-'qbsettings' => 'क्विकबार',
-'qbsettings-none' => 'कुनैपनि होइन',
-'qbsettings-fixedleft' => 'देब्रे निश्चित गरिएको',
-'qbsettings-fixedright' => 'दाहिने निश्चित गरिएको',
-'qbsettings-floatingleft' => 'देब्रे तैरने',
-'qbsettings-floatingright' => 'दाहिने तैरने',
-'qbsettings-directionality' => 'तपाईको भाषाको लेखाइ दिशाको आधारमा मिलान गरिएको छ',
-
 # Preferences page
 'preferences' => 'रोजाईहरू',
 'mypreferences' => 'प्राथमिकताहरु',
@@ -1105,9 +1133,8 @@ $1",
 'prefs-rendering' => 'स्वरुप',
 'saveprefs' => 'संग्रह',
 'resetprefs' => 'संग्रह नगरिएका परिवर्तनहरु सफागर्ने',
-'restoreprefs' => 'सबै पूर्वनिर्धारित स्थिती कायम गर्ने',
+'restoreprefs' => 'सबै पूर्वनिर्धारित स्थिती कायम गर्ने(सबै खण्डहरूमा)',
 'prefs-editing' => 'सम्पादन',
-'prefs-edit-boxsize' => 'सम्पादन झ्यालको आकार',
 'rows' => 'हरफहरु :',
 'columns' => 'स्तम्भहरु :',
 'searchresultshead' => 'खोज',
@@ -1118,9 +1145,6 @@ $1",
 'recentchangesdays-max' => 'अधिकतम $1 {{PLURAL:$1|दिन|दिन}}',
 'recentchangescount' => 'पूर्व निर्धारितरुपमा देखाउनुपर्ने सम्पादनहरू :',
 'prefs-help-recentchangescount' => 'यसमा हालका परि्वर्तनहरु , पृष्ठ इतिहासहरु , र लग समाविष्ठ छन् ।',
-'prefs-help-watchlist-token' => 'यो फिल्डमा गोप्य संकेत राख्नाले तपाईँको निगरानीसूचीको RSS फिड सृजन हुने छ ।
-संकेत थाहा पाउने जो कसैले तपाईको निगरानी सूची पढ्न सक्ने भएकोले , सुरक्षित मान छान्नुहोला ।
-यहाँ जथाभावीरुपमा-सृजना गरिएको तपाईले प्रयोग गर्ने सक्नुहुने मान छ : $1',
 'savedprefs' => 'तपाईंका अभिरुचिहरू सङ्ग्रहित भयो।',
 'timezonelegend' => 'समय क्षेत्र :',
 'localtime' => 'स्थानिय समय:',
@@ -1151,11 +1175,10 @@ $1",
 'prefs-reset-intro' => 'तपाईले यो पृष्ठ आफ्नो अभिरुचीहरू साइट पूर्वावस्थामा फर्काउन प्रयोग गर्न सक्नुहुन्छ ।
 यो रद्द गर्न सक्नुहुन्छ ।',
 'prefs-emailconfirm-label' => 'इ-मेल एकिन प्रक्रिया :',
-'prefs-textboxsize' => 'सम्पादन विन्डोको आकार',
 'youremail' => 'ईमेल',
 'username' => '{{GENDER:$1|प्रयोगकर्ता नाम}}:',
-'uid' => 'प्रोगकर्ता आइडी:',
-'prefs-memberingroups' => 'निम्न {{PLURAL:$1|समूह | समूहहरू}}को सदस्य :',
+'uid' => '{{GENDER:$1|प्रयोगकर्ता}} ID:',
+'prefs-memberingroups' => 'निम्न {{PLURAL:$1|समूह | समूहहरू}}को {{GENDER:$2|सदस्य}} :',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'दर्ता समय:',
 'prefs-registration-date-time' => '$1',
@@ -1168,10 +1191,10 @@ $1",
 HTML ट्यागहरु जाँच्नुहोस् ।',
 'badsiglength' => 'तपाईको दस्तखत धेरै लामो छ।
 यो $1 {{PLURAL:$1|अक्षर|अक्षरहरू}} भन्दा लामो हुनु हुँदैन ।',
-'yourgender' => 'लिङ्ग:',
-'gender-unknown' => 'नखुलेको',
-'gender-male' => 'पुरूष',
-'gender-female' => 'महिला',
+'yourgender' => 'कसरी वताउन चाहनुहुन्छ ?',
+'gender-unknown' => 'म खुलाउन चाहन्न',
+'gender-male' => 'उसले विकि पृष्ठहरू सम्पादन गर्छ',
+'gender-female' => 'उनले विकि पृष्ठ सम्पादन गर्छिन',
 'prefs-help-gender' => 'वैकल्पिक: सफ्टवेयरले लिङगानुसार सम्बोधन गर्नको लागि प्रयोग गरिन्छ ।
 यो जानकारी सार्वजनिक हुनेछ ।',
 'email' => 'ईमेल',
@@ -1185,7 +1208,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'prefs-signature' => 'हस्ताक्षर',
 'prefs-dateformat' => 'मिति ढाँचा',
 'prefs-timeoffset' => 'समय अफसेट',
-'prefs-advancedediting' => 'सामान्य',
+'prefs-advancedediting' => 'सामान्य विकल्पहरू',
 'prefs-advancedrc' => 'उन्नत विकल्पहरू',
 'prefs-advancedrendering' => 'उन्नत विकल्पहरु',
 'prefs-advancedsearchoptions' => 'उन्नत विकल्पहरू',
@@ -1284,7 +1307,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'right-proxyunbannable' => 'प्रोक्सिको स्वत: रोक कटेर जाने',
 'right-unblockself' => 'तिनीहरु आफैंलाई खुल्ला गर्छन्',
 'right-protect' => 'सुरक्षा स्तर परिवर्तन गर्ने र जोगाइएका पृष्ठहरु सम्पादन गर्ने',
-'right-editprotected' => 'जोगाइएका पृष्ठहरु सम्पादन गर्ने(क्यासकेडिङ्ग सुरक्षा नभएका)',
+'right-editprotected' => '"{{int:protect-level-sysop}}" को हैसियतले सुरक्षित पृष्ठहरु सम्पादन गर्ने',
 'right-editinterface' => 'प्रयोगकर्ता अन्तरमोहडा सम्पादन गर्ने',
 'right-editusercssjs' => 'प्रयोगकर्ताको CSS र JS फाइलहरु सम्पादन गर्ने',
 'right-editusercss' => 'प्रयोगकर्ताको CSS फाइलहरु सम्पादन गर्ने',
@@ -1392,7 +1415,6 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'recentchangeslinked-feed' => 'संबन्धित परिवर्तनहरु',
 'recentchangeslinked-toolbox' => 'संबन्धित परिवर्तनहरु',
 'recentchangeslinked-title' => '"$1"सम्वन्धित परिवर्तनसँग',
-'recentchangeslinked-noresult' => 'जोडिएका पृष्ठहरुमा दिइएको समयावधीमा कुनै पनि परिवर्तन भएको छैन ।',
 'recentchangeslinked-summary' => "यो सूची निर्दिष्ट पृष्ठ (वा निर्दिष्ट श्रेणी)सित जोड़िएका  भर्खरै परिवर्तन भएका पृष्ठको  हो। [[Special:Watchlist|तपाईँको निगरानी सूची]]का पृष्ठहरु '''गाढा अक्षरमा''' छन्।",
 'recentchangeslinked-page' => 'पृष्ठ नाम:',
 'recentchangeslinked-to' => 'यसको सट्टा यो पृष्ठसँग जोडिएका पृष्ठहरुको परिवर्तन देखाउने',
@@ -1403,7 +1425,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'reuploaddesc' => 'उर्ध्वभरण रद्द गर्ने र उर्ध्वभरण फारमतिर जाने',
 'upload-tryagain' => 'संशोधित फाइल विवरण बुझाउने',
 'uploadnologin' => 'प्रवेश (लग ईन) नगरिएको',
-'uploadnologintext' => 'फाइल उर्ध्वभरण गर्न तपाईंले [[Special:UserLogin|प्रवेश]] गर्नुपर्छ।',
+'uploadnologintext' => 'फाइल उर्ध्वभरण गर्न तपाईंले $1 गर्नुपर्छ।',
 'upload_directory_missing' => 'उर्ध्वभरण डाइरेक्टरी ($1) हराइरहेको छ र वेवसर्भरले नयाँ डाइरेक्टरी निर्माणगर्न असमर्थ भयो ।',
 'upload_directory_read_only' => 'उर्ध्व भरण डाइरेक्टरी ($1) वेवसर्भर द्वारा लेख्य छैन ।',
 'uploaderror' => 'उर्ध्वभरण त्रुटि',
@@ -1546,7 +1568,6 @@ $1',
 'http-read-error' => 'HTTP बुझाइमा त्रुटि।',
 'http-timed-out' => 'HTTP माँगिएको समय सकियो।',
 'http-curl-error' => 'URL $1 लिनमा त्रुटि',
-'http-host-unreachable' => 'URL मा पुग्न सकिएन।',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URLमा पुग्न सकिएन',
@@ -1665,9 +1686,6 @@ $1',
 'statistics-users-active-desc' => 'प्रयोगकर्ताहरु जो{{PLURAL:$1|बितेको एक दिन|बितेका $1 दिनहरु}}देखि  जो सक्रिय छन्',
 'statistics-mostpopular' => 'सबैभन्दा धेरै हेरिएको पृष्ठहरु',
 
-'disambiguations' => 'स्पष्टिकरण पृष्ठमा जोडिएका पृष्ठहरु',
-'disambiguationspage' => 'Template:बहुविकल्प',
-
 'doubleredirects' => 'दोहोरो अनुप्रेषण',
 'double-redirect-fixed-move' => '[[$1]] सारिएको छ।
 यसले [[$2]] तिर अनुप्रेषित गर्दछ।',
@@ -1884,10 +1902,9 @@ $1',
 'unwatchthispage' => 'निगरानीबाट हटाउने',
 'notanarticle' => 'सामाग्री सहितको पेज हैन',
 'notvisiblerev' => 'पूर्वावलोकन हटाइयो',
-'watchnochange' => 'दिइएको समय अवधीभित्र निगरानी सुचीमा रहेका कुनै पनि सामाग्री सम्पादन भएको छैनन ।',
 'watchlist-details' => 'तपाईको निगरानी सूचीमा रहेका{{PLURAL:$1|$1 पृष्ठ|$1 पृष्ठहरु}}वार्तालापमा पृष्ठमा गनिएका छैनन् ।',
-'wlheader-enotif' => '* ईमेलद्वारा जानकारी गराउने तरिका सक्रिय गरियो ।',
-'wlheader-showupdated' => "* तपाइले पछिल्लो पल्ट भ्रमण गरेपछि परिवर्तन भएका पृष्ठहरूलाई '''गाढा''' गरेर देखाइएको छ ।",
+'wlheader-enotif' => 'ईमेलद्वारा जानकारी गराउने तरिका सक्रिय गरियो ।',
+'wlheader-showupdated' => "तपाइले पछिल्लो पल्ट भ्रमण गरेपछि परिवर्तन भएका पृष्ठहरूलाई '''गाढा''' गरेर देखाइएको छ ।",
 'watchmethod-recent' => 'निगरानी सुचीमा रहेका पृष्ठमा गरिएका सम्पादनहरु जाँच्दै',
 'watchmethod-list' => 'सम्पदान गरिएका निगरानी सुचीमा रहेका पृष्ठहरुको सम्पादन जाँच्दै',
 'watchlistcontains' => 'तपाईको निगरानी सुचीमा $1 {{PLURAL:$1|पृष्ठ|पृष्ठहरु}}रहेका छन् ।',
@@ -2266,12 +2283,9 @@ $1को बन्देजको कारण : "$2" हो',
 यो एक रेन्ज रोक $2, को अन्तर्गत रहेको छ जसलाई रोक खोल्न मिल्छ ।',
 'ip_range_invalid' => 'IP क्षेत्र अमान्य ।',
 'ip_range_toolarge' => ' /$1 भन्दा ठूलो रेन्ज रोक लगाउन पाइदैन ।.',
-'blockme' => 'मलाई निषेध गर्ने',
 'proxyblocker' => 'प्रोक्सी निषेध गर्ने',
-'proxyblocker-disabled' => 'यो कार्य निष्कृय पारिएको छ।',
 'proxyblockreason' => 'तपाईको IP ठेगानामा रोक लगाइएको छ किनकी यो खुला प्रोक्सी हो ।
 कृपया तपाईको इन्टरनेट सेवा प्रदायक या प्राविधिक सहायतालाई सम्पर्क गरी यस सुरक्षा समस्याको बारेमा जानकारी गराउनुहोस् ।',
-'proxyblocksuccess' => 'सकियो.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'तपाईको IP ठेगाना खुल्ला प्रोक्सीको रुपमा  DNSBL मा सुचीकरण गरिएको छ यसलाई{{SITENAME}}ले प्रयोगमा ल्याएको छ।',
 'sorbs_create_account_reason' => 'तपाईको IP ठेगाना खुल्ला प्रोक्सीको रुपमा  DNSBL मा सुचीकरण गरिएको छ यसलाई{{SITENAME}}ले प्रयोगमा ल्याएको छ।
@@ -2520,17 +2534,11 @@ $1को बन्देजको कारण : "$2" हो',
 
 # Stylesheets
 'common.css' => '/* यहाँ राखिएका CSS सबै खोलहरुमा लागु हुनेछन् */',
-'standard.css' => '/* यहाँ राखिएका CSS हरुले स्तरीय खोल प्रयोग गर्ने प्रयोगकर्ताहरुलाई प्रभावित पार्छ  */',
-'nostalgia.css' => '/* यहाँ राखिएको CSS ले नस्टाल्जिया स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
 'cologneblue.css' => '/* यहाँ राखिएको CSS ले कोलोग्ने ब्लु स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
 'monobook.css' => '/* यहाँ राखिएको CSS ले मोनोबुक स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
-'myskin.css' => '/* यहाँ राखिएको CSS ले माइस्किन स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
-'chick.css' => '/* यहाँ राखिएको CSS ले चिक स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
-'simple.css' => '/* यहाँ राखिएको CSS ले सिम्पल स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
 'modern.css' => '/* यहाँ राखिएको CSS ले मोनोबुक मोडर्न प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
 'vector.css' => '/* यहाँ राखिएको CSS ले भेक्टर स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
 'print.css' => '/* यहाँ राखिएको CSS मुद्रण नतिजालाई प्रभावित गर्छ  */',
-'handheld.css' => '/* यहाँ राखिएको CSS ले हाते मेसिनहरु(मोबाईल) स्किनलाई प्रभावित गर्छ जुन $wgHandheldStyle मा निर्धारण गरिएको छ  */',
 
 # Metadata
 'notacceptable' => 'विकि सर्भर तपाइको क्लाइन्टलाइ जुन प्रकारको डाटा चाहिन्छ त्यस प्रकारले दिन सक्दैन।',
@@ -2565,13 +2573,8 @@ $1को बन्देजको कारण : "$2" हो',
 'pageinfo-authors' => 'फरक सम्पादकरुको संख्या',
 
 # Skin names
-'skinname-standard' => 'क्लासिक',
-'skinname-nostalgia' => 'नोस्टाल्जिया',
 'skinname-cologneblue' => 'कोलोग्ने निलो',
 'skinname-monobook' => 'मोनोबुक',
-'skinname-myskin' => 'माइस्किन',
-'skinname-chick' => 'चिक',
-'skinname-simple' => 'सिम्पल',
 'skinname-modern' => 'मोडर्न',
 'skinname-vector' => 'भेक्टर',
 
@@ -2676,7 +2679,7 @@ Others will be hidden by default.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'चौडाइ',
 'exif-imagelength' => 'उचाई',
 'exif-bitspersample' => 'घटक प्रति बिट्स',
@@ -2850,7 +2853,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'नखादिएको(कम्प्रेस नगरिएको)',
 'exif-compression-2' => 'CCITT समूह 3 1-Dimensional Modified Huffman संचालन इन्कोडिङ्ग',
 'exif-compression-3' => 'CCITT Group 3  फ्याक्स इन्कोडिङ्ग',
@@ -3162,7 +3165,6 @@ $5
 'semicolon-separator' => ';&#32;',
 'comma-separator' => ',&#32;',
 'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
 'pipe-separator' => '&#32;•&#32;',
 'word-separator' => '&#32;',
 'ellipsis' => '...',
@@ -3309,7 +3311,6 @@ $5
 'version-other' => 'अन्य',
 'version-mediahandlers' => 'मिडिया  ह्यान्डलरहरू',
 'version-hooks' => 'अंकुशहरु',
-'version-extension-functions' => 'अतिरिक्त प्रकार्य',
 'version-parser-extensiontags' => 'पार्सर विस्तार ट्यागहरु',
 'version-parser-function-hooks' => 'पार्सर फङ्सन हुक',
 'version-hook-name' => 'हुक नाम',
@@ -3323,15 +3324,6 @@ $5
 'version-software-product' => 'उत्पादन',
 'version-software-version' => 'संस्करण',
 
-# Special:FilePath
-'filepath' => 'फाइल मार्ग:',
-'filepath-page' => 'फाइल',
-'filepath-submit' => 'जाने',
-'filepath-summary' => 'यस पृष्ठले फाइको पूरा बाटो(पाथ) दिन्छ ।
-तस्विरहु पूरा रिजोल्युशनमा देखाइन्छ अरु फाइहरु निका सम्बन्धित अनुप्रयोगहरुसँग खोलिन्छन ।
-
- "{{ns:file}}:" प्रिफिक्स(पूर्वसर्ग) बिना फाइल नाम प्रविष्ट गर्नुहोस् । .',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'नक्कल फाइल खोज्ने',
 'fileduplicatesearch-summary' => 'ह्यास मानको आधारमा दुरुस्त नक्कल फाइहरु खोज्ने ।',
diff --git a/languages/messages/MessagesNew.php b/languages/messages/MessagesNew.php
index 0c1e4790..939f0361 100644
--- a/languages/messages/MessagesNew.php
+++ b/languages/messages/MessagesNew.php
@@ -69,8 +69,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'जिगु इ-मेल थाय्‌बाय्‌ नोटिफिकेसन इ-मेलय् क्यनादिसँ',
 'tog-shownumberswatching' => 'स्वयाच्वंपिं छ्यलामितेगु ल्याखँ क्यनादिसँ',
 'tog-fancysig' => 'कच्चा हस्ताक्षर (अटोम्याटिक लिङ्क मदेःकः)',
-'tog-externaleditor' => 'डिफल्टं एक्स्टर्नल एडिटर छ्यलादिसँ (एक्स्पर्टतेगु निंतिं जक्क, छिगु कम्प्युटरय् विषेश सेटिङ माः)',
-'tog-externaldiff' => 'एक्स्टर्नल डिफ् (diff) डिफल्टं छ्यलादिसँ (एक्स्पर्टतेगु निंतिं जक्क, छिगु कम्प्युटरय् विषेश सेटिङ माः)',
 'tog-showjumplinks' => '"जम्प टु" एसिसिबिलिटी लिङ्क इनेबल यानादिसँ',
 'tog-uselivepreview' => 'लाइभ प्रिभ्यु (जाभास्क्रिप्ट) इनेबल यानादिसँ (परिक्षणकाल)',
 'tog-forceeditsummary' => 'सम्पादन सार खालि त्वतिबिले जित सशंकित यानादिसँ',
@@ -485,13 +483,8 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 
 # Stylesheets
 'common.css' => '/* थन तःगु CSS सकल स्किनय् छ्य्‌लिगु जुइ */',
-'standard.css' => '/* थन तःगु CSS नं स्ट्याण्डर्ड स्किनया छ्य्‌लामितेत प्रभावित याइ */',
-'nostalgia.css' => '/* थन तःगु CSS नं नोस्ट्याल्जिया स्किनया छ्य्‌लामितेत असर याइ */',
 'cologneblue.css' => '/* थन तःगु CSS नं कोलोन ब्लु स्किनया छ्य्‌लामितेत असर याइ */',
 'monobook.css' => '/* थन तःगु CSS नं मोनोबुक स्किनया छ्य्‌लामितेत असर याइ */',
-'myskin.css' => '/* थन तःगु CSS नं माइस्किन स्किनया छ्य्‌लामितेत असर याइ */',
-'chick.css' => '/* थन तःगु CSS नं चिक स्किनया छ्य्‌लामितेत असर याइ */',
-'simple.css' => '/* थन तःगु CSS नं सिम्पल स्किनया छ्य्‌लामितेत असर याइ */',
 'modern.css' => '/* थन तःगु CSS नं मोडर्न स्किनया छ्य्‌लामितेत असर याइ */',
 'print.css' => '/* थन तःगु CSS नं प्रिन्ट आउटपुटयात असर याइ */',
 'handheld.css' => '/* थन तःगु CSS नं $wgHandheldStyle आधारित ह्याण्डहेल्ड यन्त्रयात असर याइ */',
@@ -499,7 +492,7 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 # Attribution
 'others' => 'मेमेगु',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ब्याः',
 'exif-imagelength' => 'जाः',
 'exif-imagedescription' => 'किपाया नां',
diff --git a/languages/messages/MessagesNiu.php b/languages/messages/MessagesNiu.php
index eaa2d499..bc490677 100644
--- a/languages/messages/MessagesNiu.php
+++ b/languages/messages/MessagesNiu.php
@@ -102,6 +102,9 @@ $messages = array(
 'viewsource' => 'Kitekite ke mouaga',
 
 # Login and logout pages
+'welcomecreation' => '== Fakalofa atu, kua fiafia ke hu mai $1 ==
+Kua talaga e haau a poko.
+Ua nimo ke hiki e haau tau [[Special:Preferences|manako {{SITENAME}}]].',
 'yourname' => 'Matahigoa he tagata:',
 'yourpassword' => 'Kupu fufu:',
 'yourpasswordagain' => 'Liu lolomi e kupu fufu:',
diff --git a/languages/messages/MessagesNl.php b/languages/messages/MessagesNl.php
index de731733..ae86c2f1 100644
--- a/languages/messages/MessagesNl.php
+++ b/languages/messages/MessagesNl.php
@@ -10,6 +10,7 @@
  * @author Annabel
  * @author AvatarTeam
  * @author B4bol4t
+ * @author Basvb
  * @author DasRakel
  * @author Effeietsanders
  * @author Erwin
@@ -21,6 +22,7 @@
  * @author GerardM
  * @author Hamaryns
  * @author HanV
+ * @author Hansmuller
  * @author Jens Liebenau
  * @author JurgenNL
  * @author Kaganer
@@ -48,6 +50,8 @@
  * @author Trijnstel
  * @author Troefkaart
  * @author Tvdm
+ * @author User555
+ * @author WTM
  * @author Wiki13
  * @author Wikiklaas
  * @author Wolf Lambert
@@ -152,6 +156,8 @@ $magicWords = array(
 	'fullpagenamee'             => array( '1', 'VOLLEDIGEPAGINANAAME', 'FULLPAGENAMEE' ),
 	'subpagename'               => array( '1', 'DEELPAGINANAAM', 'SUBPAGENAME' ),
 	'subpagenamee'              => array( '1', 'DEELPAGINANAAME', 'SUBPAGENAMEE' ),
+	'rootpagename'              => array( '1', 'ROOTPAGINANAAM', 'ROOTPAGENAME' ),
+	'rootpagenamee'             => array( '1', 'ROOTPAGINANAAME', 'ROOTPAGENAMEE' ),
 	'basepagename'              => array( '1', 'BASISPAGINANAAM', 'BASEPAGENAME' ),
 	'basepagenamee'             => array( '1', 'BASISPAGINANAAME', 'BASEPAGENAMEE' ),
 	'talkpagename'              => array( '1', 'OVERLEGPAGINANAAM', 'TALKPAGENAME' ),
@@ -218,6 +224,7 @@ $magicWords = array(
 	'raw'                       => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
 	'displaytitle'              => array( '1', 'WEERGEGEVENTITEL', 'TOONTITEL', 'DISPLAYTITLE' ),
 	'rawsuffix'                 => array( '1', 'V', 'R' ),
+	'nocommafysuffix'           => array( '0', 'GEENSCHEIDINGSTEKEN', 'NOSEP' ),
 	'newsectionlink'            => array( '1', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
 	'nonewsectionlink'          => array( '1', '__GEENNIEUWKOPJEKOPPELING__', '__GEENNIEUWESECTIELINK__', '__GEENNIEUWKOPJEVERWIJZING__', '__NONEWSECTIONLINK__' ),
 	'currentversion'            => array( '1', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
@@ -276,7 +283,7 @@ $specialPageAliases = array(
 	'CreateAccount'             => array( 'GebruikerAanmaken' ),
 	'Deadendpages'              => array( 'VerwijslozePaginas', 'VerwijslozePagina’s', 'VerwijslozePagina\'s' ),
 	'DeletedContributions'      => array( 'VerwijderdeBijdragen' ),
-	'Disambiguations'           => array( 'Doorverwijspagina\'s', 'Doorverwijspaginas' ),
+	'Disambiguations'           => array( 'Doorverwijzingen' ),
 	'DoubleRedirects'           => array( 'DubbeleDoorverwijzingen' ),
 	'EditWatchlist'             => array( 'VolglijstBewerken' ),
 	'Emailuser'                 => array( 'GebruikerE-mailen', 'E-mailGebruiker' ),
@@ -314,6 +321,7 @@ $specialPageAliases = array(
 	'Myuploads'                 => array( 'MijnUploads' ),
 	'Newimages'                 => array( 'NieuweBestanden', 'NieuweAfbeeldingen' ),
 	'Newpages'                  => array( 'NieuwePaginas', 'NieuwePagina’s', 'NieuwePagina\'s' ),
+	'PagesWithProp'             => array( 'PaginasMetEigenschap', 'Pagina\'sMetEigenschap' ),
 	'PasswordReset'             => array( 'WachtwoordOpnieuwInstellen' ),
 	'PermanentLink'             => array( 'PermanenteVerwijzing' ),
 	'Popularpages'              => array( 'PopulairePaginas', 'PopulairePagina’s', 'PopulairePagina\'s' ),
@@ -325,6 +333,7 @@ $specialPageAliases = array(
 	'Randomredirect'            => array( 'WillekeurigeDoorverwijzing' ),
 	'Recentchanges'             => array( 'RecenteWijzigingen' ),
 	'Recentchangeslinked'       => array( 'RecenteWijzigingenGelinkt', 'VerwanteWijzigingen' ),
+	'Redirect'                  => array( 'Doorverwijzen' ),
 	'Revisiondelete'            => array( 'VersieVerwijderen', 'HerzieningVerwijderen', 'RevisieVerwijderen' ),
 	'Search'                    => array( 'Zoeken' ),
 	'Shortpages'                => array( 'KortePaginas', 'KortePagina’s', 'KortePagina\'s' ),
@@ -390,9 +399,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Het aantal gebruikers weergeven dat deze pagina volgt',
 'tog-oldsig' => 'Bestaande ondertekening:',
 'tog-fancysig' => 'Als wikitekst behandelen (zonder automatische koppeling)',
-'tog-externaleditor' => 'Standaard een externe tekstbewerker gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
-'tog-externaldiff' => 'Standaard een extern vergelijkingsprogramma gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
-'tog-showjumplinks' => '"ga naar"-toegankelijkheidskoppelingen inschakelen',
 'tog-uselivepreview' => '"Live voorvertoning" gebruiken (experimenteel)',
 'tog-forceeditsummary' => 'Een melding geven bij een lege bewerkingssamenvatting',
 'tog-watchlisthideown' => 'Eigen bewerkingen op mijn volglijst verbergen',
@@ -406,6 +412,8 @@ $messages = array(
 'tog-showhiddencats' => 'Verborgen categorieën weergeven',
 'tog-noconvertlink' => 'Paginanaamconversie uitschakelen',
 'tog-norollbackdiff' => 'Wijzigingen weglaten na terugdraaien',
+'tog-useeditwarning' => 'U waarschuwen als u een bewerkte pagina die nog niet is opgeslagen wil verlaten',
+'tog-prefershttps' => 'Altijd een beveiligde verbinding gebruiken wanneer u bent aangemeld',
 
 'underline-always' => 'Altijd',
 'underline-never' => 'Nooit',
@@ -469,6 +477,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1 januari',
+'february-date' => '$1 februari',
+'march-date' => '$1 maart',
+'april-date' => '$1 april',
+'may-date' => '$1 mei',
+'june-date' => '$1 juni',
+'july-date' => '$1 juli',
+'august-date' => '$1 augustus',
+'september-date' => '$1 september',
+'october-date' => '$1 oktober',
+'november-date' => '$1 november',
+'december-date' => '$1 december',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorie|Categorieën}}',
@@ -550,6 +570,7 @@ $messages = array(
 'create-this-page' => 'Deze pagina aanmaken',
 'delete' => 'Verwijderen',
 'deletethispage' => 'Deze pagina verwijderen',
+'undeletethispage' => 'Pagina terugplaatsen',
 'undelete_short' => '$1 {{PLURAL:$1|bewerking|bewerkingen}} terugplaatsen',
 'viewdeleted_short' => '{{PLURAL: $1|Eén geschrapte bewerking |$1 geschrapte bewerkingen}} bekijken',
 'protect' => 'Beveiligen',
@@ -593,7 +614,7 @@ $1',
 'pool-queuefull' => 'De wachtrij van de poel is vol',
 'pool-errorunknown' => 'Er is een onbekende fout opgetreden',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Over {{SITENAME}}',
 'aboutpage' => 'Project:Info',
 'copyright' => 'De inhoud is beschikbaar onder de $1 tenzij anders aangegeven.',
@@ -603,7 +624,6 @@ $1',
 'disclaimers' => 'Voorbehoud',
 'disclaimerpage' => 'Project:Algemeen voorbehoud',
 'edithelp' => 'Hulp bij bewerken',
-'edithelppage' => 'Help:Bewerken',
 'helppage' => 'Help:Inhoud',
 'mainpage' => 'Hoofdpagina',
 'mainpage-description' => 'Hoofdpagina',
@@ -681,17 +701,12 @@ Een lijst met bestaande speciale pagina’s staat op [[Special:SpecialPages|{{in
 # General errors
 'error' => 'Fout',
 'databaseerror' => 'Databasefout',
-'dberrortext' => 'Er is een syntaxisfout in het databaseverzoek opgetreden.
-Mogelijk zit er een fout in de software.
-Het laatste verzoek aan de database was:
-<blockquote><code>$1</code></blockquote>
-vanuit de functie "<code>$2</code>".
-De database gaf de volgende foutmelding "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Er is een syntaxisfout in het databaseverzoek opgetreden.
-Het laatste verzoek aan de database was:
-"$1"
-vanuit de functie "$2".
-De database gaf de volgende foutmelding: "$3: $4"',
+'databaseerror-text' => 'Er is een databasefout opgetreden.
+Dit kan duiden op een fout in de software.',
+'databaseerror-textcl' => 'Er is een databasefout opgetreden.',
+'databaseerror-query' => 'Zoekopdracht: $1',
+'databaseerror-function' => 'Functie: $1',
+'databaseerror-error' => 'Fout: $1',
 'laggedslavemode' => "'''Waarschuwing:''' in deze pagina zijn recente wijzigingen mogelijk nog niet verwerkt.",
 'readonly' => 'Database geblokkeerd',
 'enterlockreason' => 'Geef een reden op voor de blokkade en geef op wanneer die waarschijnlijk wordt opgeheven',
@@ -725,6 +740,7 @@ Mogelijk is deze al door iemand anders verwijderd.',
 'cannotdelete-title' => 'Pagina "$1" kan niet verwijderd worden',
 'delete-hook-aborted' => 'Het verwijderen is afgebroken door een hook.
 Er is geen toelichting beschikbaar.',
+'no-null-revision' => 'Het was niet mogelijk een lege nieuwe versie te maken voor de pagina "$1"',
 'badtitle' => 'Ongeldige paginanaam',
 'badtitletext' => 'De naam van de opgegeven pagina was ongeldig, leeg of bevatte een verkeerde intertaal- of interwikikoppeling.
 Wellicht bevat de paginanaam niet toegestane tekens.',
@@ -749,12 +765,15 @@ Gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaW
 'editinginterface' => "'''Waarschuwing:''' u bewerkt een pagina die interfacetekst voor de software bevat.
 Bewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen op deze wiki.
 Gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki, om vertalingen toe te voegen of te wijzigen voor alle wiki's.",
-'sqlhidden' => '(SQL-zoekopdracht verborgen)',
 'cascadeprotected' => "Deze pagina kan niet bewerkt worden, omdat die is opgenomen in de volgende {{PLURAL:$1|pagina|pagina's}} die beveiligd {{PLURAL:$1|is|zijn}} met de cascade-optie:
 $2",
 'namespaceprotected' => "U hebt geen rechten om pagina's in de naamruimte '''$1''' te bewerken.",
 'customcssprotected' => 'U kunt deze CSS-pagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.',
 'customjsprotected' => 'U kunt deze JavaScriptpagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.',
+'mycustomcssprotected' => 'U hebt geen rechten om deze CSS-pagina te bewerken.',
+'mycustomjsprotected' => 'U hebt geen rechten om deze JavaScriptpagina te bewerken.',
+'myprivateinfoprotected' => 'U hebt geen rechten om uw privégegevens te bewerken.',
+'mypreferencesprotected' => 'U hebt geen rechten om uw voorkeuren aan te passen.',
 'ns-specialprotected' => 'Pagina\'s in de naamruimte "{{ns:special}}" kunnen niet bewerkt worden.',
 'titleprotected' => "Het aanmaken van deze pagina is beveiligd door [[User:$1|$1]].
 De gegeven reden is ''$2''.",
@@ -779,10 +798,19 @@ Sommige pagina's kunnen blijven weergegeven alsof u nog aangemeld bent, totdat u
 'welcomecreation-msg' => 'Uw gebruiker is aangemaakt.
 Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te passen.',
 'yourname' => 'Gebruikersnaam:',
+'userlogin-yourname' => 'Gebruikersnaam',
+'userlogin-yourname-ph' => 'Geef uw gebruikersnaam op',
+'createacct-another-username-ph' => 'Geef de gebruikersnaam op',
 'yourpassword' => 'Wachtwoord:',
+'userlogin-yourpassword' => 'Wachtwoord',
+'userlogin-yourpassword-ph' => 'Geef uw wachtwoord op',
+'createacct-yourpassword-ph' => 'Geef een wachtwoord op',
 'yourpasswordagain' => 'Geef uw wachtwoord opnieuw in:',
+'createacct-yourpasswordagain' => 'Bevestig wachtwoord',
+'createacct-yourpasswordagain-ph' => 'Geef het wachtwoord opnieuw op',
 'remembermypassword' => 'Aanmeldgegevens onthouden (maximaal $1 {{PLURAL:$1|dag|dagen}})',
-'securelogin-stick-https' => 'Verbonden blijven via HTTPS na aanmelden',
+'userlogin-remembermypassword' => 'Aangemeld blijven',
+'userlogin-signwithsecure' => 'Beveiligde verbinding gebruiken',
 'yourdomainname' => 'Uw domein:',
 'password-change-forbidden' => 'U kunt uw wachtwoord niet wijzigen in deze wiki.',
 'externaldberror' => 'Er is een fout opgetreden bij het aanmelden bij de database of u hebt geen toestemming uw externe gebruiker bij te werken.',
@@ -794,18 +822,44 @@ Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te pass
 'logout' => 'Afmelden',
 'userlogout' => 'Afmelden',
 'notloggedin' => 'Niet aangemeld',
+'userlogin-noaccount' => 'Hebt u geen geregistreerde gebruiker?',
+'userlogin-joinproject' => 'Word lid van {{SITENAME}}',
 'nologin' => 'Nog geen gebruikersnaam? $1.',
 'nologinlink' => 'Registreren',
 'createaccount' => 'Registreren',
 'gotaccount' => 'Hebt u al een gebruikersnaam? $1.',
 'gotaccountlink' => 'Aanmelden',
 'userlogin-resetlink' => 'Bent u uw aanmeldgegevens vergeten?',
+'userlogin-resetpassword-link' => 'Uw wachtwoord opnieuw instellen',
+'helplogin-url' => 'Help:Aanmelden',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hulp bij aanmelden]]',
+'userlogin-loggedin' => 'U bent al aangemeld als {{GENDER:$1|$1}}.
+Gebruik het onderstaande formulier om aan te melden als een andere gebruiker.',
+'userlogin-createanother' => 'Nog een gebruiker aanmaken',
+'createacct-join' => 'Geef uw gegevens hieronder op.',
+'createacct-another-join' => 'Geef hieronder de informatie voor de nieuwe gebruiker op.',
+'createacct-emailrequired' => 'E-mailadres',
+'createacct-emailoptional' => 'E-mailadres (optioneel)',
+'createacct-email-ph' => 'Geef uw e-mailadres op',
+'createacct-another-email-ph' => 'Geef een e-mailadres op',
 'createaccountmail' => 'Gebruik een tijdelijk willekeurig wachtwoord en stuur het naar het opgegeven e-mailadres',
+'createacct-realname' => 'Echte naam (optioneel)',
 'createaccountreason' => 'Reden:',
+'createacct-reason' => 'Reden',
+'createacct-reason-ph' => 'Waarom u een andere gebruiker aanmaakt',
+'createacct-captcha' => 'Veiligheidscontrole',
+'createacct-imgcaptcha-ph' => 'Geef de tekst in die u hierboven ziet',
+'createacct-submit' => 'Gebruiker aanmaken',
+'createacct-another-submit' => 'Nog een gebruiker aanmaken',
+'createacct-benefit-heading' => '{{SITENAME}} wordt gemaakt door mensen zoals u.',
+'createacct-benefit-body1' => 'bewerking{{PLURAL:$1||en}}',
+'createacct-benefit-body2' => "pagina{{PLURAL:$1||'s}}",
+'createacct-benefit-body3' => 'recente bijdrager{{PLURAL:$1||s}}',
 'badretype' => 'De ingevoerde wachtwoorden verschillen van elkaar.',
 'userexists' => 'De gekozen gebruikersnaam is al in gebruik.
 Kies een andere naam.',
 'loginerror' => 'Aanmeldfout',
+'createacct-error' => 'Fout tijdens aanmaken gebruiker',
 'createaccounterror' => 'Het was niet mogelijk de gebruiker aan te maken: $1',
 'nocookiesnew' => 'De gebruiker is geregistreerd, maar niet aangemeld.
 {{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.
@@ -877,11 +931,13 @@ Meld u aan en wijzig uw wachtwoord.
 
 Negeer dit bericht als deze gebruiker zonder uw medeweten is aangemaakt.',
 'usernamehasherror' => 'Een gebruikersnaam mag het teken hekje ("#") niet bevatten.',
-'login-throttled' => 'U hebt recentelijk te vaak geprobeerd aan te melden met een onjuist wachtwoord.
-Wacht even voordat u het opnieuw probeert.',
+'login-throttled' => 'U heeft recentelijk te veel mislukte aanmeldpogingen gedaan.
+Wacht alstublieft $1 voordat u het opnieuw probeert.',
 'login-abort-generic' => 'U bent niet aangemeld. De procedure is afgebroken.',
 'loginlanguagelabel' => 'Taal: $1',
 'suspicious-userlogout' => 'Uw verzoek om af te melden is genegeerd, omdat het lijkt alsof het verzoek is verzonden door een browser of cacheproxy die stuk is.',
+'createacct-another-realname-tip' => 'Echte naam is optioneel.
+Als u deze opgeeft, wordt deze naam gebruikt worden om u erkenning te geven voor uw werk.',
 
 # Email sending
 'php-mail-error-unknown' => 'Er is een onbekende fout opgetreden in de mail()-functie van PHP',
@@ -898,8 +954,7 @@ Voer een nieuw wachtwoord in om het aanmelden te voltooien:',
 'newpassword' => 'Nieuw wachtwoord:',
 'retypenew' => 'Herhaling nieuwe wachtwoord:',
 'resetpass_submit' => 'Wachtwoord instellen en aanmelden',
-'resetpass_success' => 'Uw wachtwoord is gewijzigd.
-U wordt nu aangemeld...',
+'changepassword-success' => 'Uw wachtwoord is gewijzigd.',
 'resetpass_forbidden' => 'Wachtwoorden kunnen niet gewijzigd worden',
 'resetpass-no-info' => 'U dient aangemeld zijn voordat u deze pagina kunt gebruiken.',
 'resetpass-submit-loggedin' => 'Wachtwoord wijzigen',
@@ -911,10 +966,11 @@ Mogelijk hebt u uw wachtwoord al gewijzigd of een nieuw tijdelijk wachtwoord aan
 
 # Special:PasswordReset
 'passwordreset' => 'Wachtwoord opnieuw instellen',
-'passwordreset-text' => 'Vul dit formulier in om uw wachtwoord opnieuw in te stellen.',
+'passwordreset-text-one' => 'Vul dit formulier in om uw wachtwoord opnieuw in te stellen.',
+'passwordreset-text-many' => '{{PLURAL:$1|Vul een van de gegevensvelden in om uw wachtwoord opnieuw in te stellen.}}',
 'passwordreset-legend' => 'Wachtwoord opnieuw instellen',
 'passwordreset-disabled' => 'Het is in deze wiki niet mogelijk uw wachtwoord opnieuw in te stellen.',
-'passwordreset-pretext' => '{{PLURAL:$1||Voer één van de onderstaande velden in}}',
+'passwordreset-emaildisabled' => 'E-mailmogelijkheden zijn uitgeschakeld op deze wiki.',
 'passwordreset-username' => 'Gebruiker:',
 'passwordreset-domain' => 'Domein:',
 'passwordreset-capture' => 'De resulterende e-mail bekijken?',
@@ -936,7 +992,7 @@ Meld u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan
 Tijdelijk wachtwoord: $2',
 'passwordreset-emailsent' => 'Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden.',
 'passwordreset-emailsent-capture' => 'Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden. Deze wordt hieronder weergegeven.',
-'passwordreset-emailerror-capture' => 'Er is een e-mail voor het opnieuw instellen van een wachtwoord aangemaakt. Deze wordt hieronder weergegeven. Het verzenden naar de gebruiker is mislukt om de volgende reden: $1',
+'passwordreset-emailerror-capture' => 'Er is een e-mail voor het opnieuw instellen van een wachtwoord aangemaakt. Deze wordt hieronder weergegeven. Het verzenden naar de {{GENDER:$2|gebruiker}} is mislukt om de volgende reden: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-mailadres wijzigen',
@@ -950,6 +1006,19 @@ Tijdelijk wachtwoord: $2',
 'changeemail-submit' => 'E-mailadres wijzigen',
 'changeemail-cancel' => 'Annuleren',
 
+# Special:ResetTokens
+'resettokens' => 'Tokens opnieuw instellen',
+'resettokens-text' => 'U kunt hier tokens opnieuw instellen die toegang tot bepaalde persoonlijke gegevens die zijn gekoppeld aan uw gebruiker.
+
+Doe dit als u ze per ongeluk met iemand hebt gedeeld of als uw onbevoegden toegang hebben gekregen tot uw gebruiker.',
+'resettokens-no-tokens' => 'Er zijn geen tokens om opnieuw in te stellen.',
+'resettokens-legend' => 'Tokens opnieuw instellen',
+'resettokens-tokens' => 'Tokens:',
+'resettokens-token-label' => '$1 (huidige waarde: $2)',
+'resettokens-watchlist-token' => 'Token voor webfeed van [[Special:Watchlist|uw volglijst]] (Atom/RSS)',
+'resettokens-done' => 'De tokens zijn opnieuw ingesteld.',
+'resettokens-resetbutton' => 'Geselecteerde tokens opnieuw instellen',
+
 # Edit page toolbar
 'bold_sample' => 'Vetgedrukte tekst',
 'bold_tip' => 'Vet',
@@ -1157,12 +1226,15 @@ Er is geen toelichting beschikbaar.',
 Deze lijkt verwijderd te zijn.',
 'edit-conflict' => 'Bewerkingsconflict.',
 'edit-no-change' => 'Uw bewerking is genegeerd, omdat er geen wijziging aan de tekst is gemaakt.',
+'postedit-confirmation' => 'Uw bewerking is opgeslagen',
 'edit-already-exists' => 'De pagina is niet aangemaakt.
 Deze bestaat al.',
 'defaultmessagetext' => 'Standaardinhoud',
 'content-failed-to-parse' => 'Het was niet mogelijk de inhoud van het MIME-type $2 voor het model $1 te verwerken: $3.',
 'invalid-content-data' => 'Ongeldige inhoudsgegevens',
 'content-not-allowed-here' => 'De inhoud "$1" is niet toegestaan op pagina [[$2]].',
+'editwarning-warning' => 'Als u deze pagina verlaat verliest u mogelijk wijzigingen die u hebt gemaakt.
+Als u bent aangemeld, kunt u deze waarschuwing uitschakelen in het tabblad "{{int:prefs-editing}}" in uw voorkeuren.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1199,6 +1271,7 @@ Controleer voor het opslaan of het resultaat gewenst is.',
 'undo-failure' => 'De wijziging kan niet ongedaan gemaakt worden vanwege andere strijdige wijzigingen.',
 'undo-norev' => 'De bewerking kon niet ongedaan gemaakt worden, omdat die niet bestaat of is verwijderd.',
 'undo-summary' => 'Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) ongedaan gemaakt',
+'undo-summary-username-hidden' => 'Versie $1 door een verborgen gebruiker ongedaan gemaakt',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Registreren is mislukt.',
@@ -1379,6 +1452,7 @@ Let op dat het gebruiken van de navigatiekoppelingen deze kolom opnieuw instelt.
 'compareselectedversions' => 'Geselecteerde versies vergelijken',
 'showhideselectedversions' => 'Geselecteerde versies weergeven/verbergen',
 'editundo' => 'ongedaan maken',
+'diff-empty' => '(geen verschil)',
 'diff-multi' => '({{PLURAL:$1|Eén tussenliggende versie|$1 tussenliggende versies}} door {{PLURAL:$2|één gebruiker|$2 gebruikers}} {{PLURAL:$1|wordt|worden}} niet weergegeven)',
 'diff-multi-manyusers' => '($1 tussenliggende {{PLURAL:$1|versie|versies}} door meer dan $2 {{PLURAL:$2|gebruiker|gebruikers}}  worden niet weergegeven)',
 'difference-missing-revision' => '{{PLURAL:$2|Eén versie|$2 versies}} van deze verschillen ($1) {{PLURAL:$2|is|zijn}} niet aangetroffen.
@@ -1407,7 +1481,6 @@ Probeer een andere zoekopdracht.',
 'searchmenu-legend' => 'Zoekopties',
 'searchmenu-exists' => "* Pagina '''[[$1]]'''",
 'searchmenu-new' => "'''De pagina \"[[:\$1]]\" aanmaken op deze wiki.'''",
-'searchhelp-url' => 'Help:Inhoud',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Paginanamen met dit voorvoegsel weergeven]]',
 'searchprofile-articles' => "Inhoudelijke pagina's",
 'searchprofile-project' => "Hulp- en projectpagina's",
@@ -1452,15 +1525,7 @@ U kunt ook een naamruimte als voorvoegsel gebruiken.",
 'searchdisabled' => 'Zoeken in {{SITENAME}} is niet mogelijk.
 U kunt gebruik maken van Google.
 De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
-
-# Quickbar
-'qbsettings' => 'Menubalk',
-'qbsettings-none' => 'Uitgeschakeld',
-'qbsettings-fixedleft' => 'Links vast',
-'qbsettings-fixedright' => 'Rechts vast',
-'qbsettings-floatingleft' => 'Links zwevend',
-'qbsettings-floatingright' => 'Rechts zwevend',
-'qbsettings-directionality' => 'Vast, afhankelijk van de schrijfrichting van uw taal',
+'search-error' => 'Er is een fout opgetreden tijdens het zoeken: $1',
 
 # Preferences page
 'preferences' => 'Voorkeuren',
@@ -1494,7 +1559,6 @@ De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
 'resetprefs' => 'Niet opgeslagen wijzigingen herstellen',
 'restoreprefs' => 'Voorkeuren herstellen (voor alle instellingen)',
 'prefs-editing' => 'Bewerken',
-'prefs-edit-boxsize' => 'Afmetingen van het bewerkingsvenster.',
 'rows' => 'Regels:',
 'columns' => 'Kolommen:',
 'searchresultshead' => 'Zoekresultaten',
@@ -1505,9 +1569,9 @@ De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
 'recentchangesdays-max' => '(maximaal $1 {{PLURAL:$1|dag|dagen}})',
 'recentchangescount' => 'Standaard aantal weer te geven bewerkingen:',
 'prefs-help-recentchangescount' => "Dit geldt voor recente wijzigingen, paginageschiedenis en logboekpagina's.",
-'prefs-help-watchlist-token' => 'Door hier een geheime sleutel in te vullen wordt een RSS-feed voor uw volglijst aangemaakt.
-Iedereen die deze sleutel kent, kan uw volglijst lezen. Kies dus een veilige sleutel.
-Hier volgt een willekeurig gegenereerde waarde die u kunt gebruiken: $1',
+'prefs-help-watchlist-token2' => 'Dit is de geheime sleutel voor de webfeed van uw volglijst.
+Iedereen die het token kent, kan uw volglijst bekijken, dus deel dit token niet.
+U kunt de [[Special:ResetTokens|tokens opnieuw instellen]] als u dat wilt.',
 'savedprefs' => 'Uw voorkeuren zijn opgeslagen.',
 'timezonelegend' => 'Tijdzone:',
 'localtime' => 'Plaatselijke tijd:',
@@ -1538,7 +1602,6 @@ Hier volgt een willekeurig gegenereerde waarde die u kunt gebruiken: $1',
 'prefs-reset-intro' => 'Gebruik deze functie om uw voorkeuren te herstellen naar de standaardinstellingen.
 Deze handeling kan niet ongedaan gemaakt worden.',
 'prefs-emailconfirm-label' => 'E-mailbevestiging:',
-'prefs-textboxsize' => 'Afmetingen bewerkingsscherm',
 'youremail' => 'Uw e-mailadres:',
 'username' => '{{GENDER:$1|Gebruikersnaam}}:',
 'uid' => '{{GENDER:$1|Gebruikersnummer}}:',
@@ -1574,7 +1637,9 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'prefs-signature' => 'Ondertekening',
 'prefs-dateformat' => 'Datumopmaak:',
 'prefs-timeoffset' => 'Tijdverschil',
-'prefs-advancedediting' => 'Algemene opties',
+'prefs-advancedediting' => 'Algemene instellingen',
+'prefs-editor' => 'Tekstverwerker',
+'prefs-preview' => 'Voorvertoning',
 'prefs-advancedrc' => 'Gevorderde instellingen',
 'prefs-advancedrendering' => 'Gevorderde instellingen',
 'prefs-advancedsearchoptions' => 'Gevorderde instellingen',
@@ -1582,7 +1647,9 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'prefs-displayrc' => 'Weergaveopties',
 'prefs-displaysearchoptions' => 'Weergaveopties',
 'prefs-displaywatchlist' => 'Weergaveopties',
+'prefs-tokenwatchlist' => 'Token',
 'prefs-diffs' => 'Verschillen',
+'prefs-help-prefershttps' => 'Deze voorkeur wordt toegepast bij de volgende keer aanmelden.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Het e-mailadres lijkt geldig',
@@ -1609,6 +1676,8 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'userrights-notallowed' => 'U bent niet gemachtigd om gebruikersrechten toe te voegen of te verwijderen.',
 'userrights-changeable-col' => 'Groepen die u kunt beheren',
 'userrights-unchangeable-col' => 'Groepen die u niet kunt beheren',
+'userrights-conflict' => 'Er is een probleem opgetreden tijdens het instellen van de gebruikersrechten! Controleer en bevestig uw wijzigingen.',
+'userrights-removed-self' => 'U hebt uw eigen bevoegdheden ingetrokken. U kunt deze pagina niet langer raadplegen.',
 
 # Groups
 'group' => 'Groep:',
@@ -1674,11 +1743,19 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'right-proxyunbannable' => "Blokkades voor proxy's gelden niet",
 'right-unblockself' => 'Eigen gebruiker deblokkeren',
 'right-protect' => 'Beveiligingsniveaus wijzigen',
-'right-editprotected' => "Beveiligde pagina's bewerken",
+'right-editprotected' => 'Pagina\'s bewerken die beveiligd zijn als "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Pagina\'s bewerken die beveiligd zijn als "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'De gebruikersinterface bewerken',
 'right-editusercssjs' => 'De CSS- en JS-bestanden van andere gebruikers bewerken',
 'right-editusercss' => 'De CSS-bestanden van andere gebruikers bewerken',
 'right-edituserjs' => 'De JavaScriptbestanden van andere gebruikers bewerken',
+'right-editmyusercss' => "Uw eigen CSS-pagina's bewerken",
+'right-editmyuserjs' => "Uw eigen JavaScriptpagina's bewerken",
+'right-viewmywatchlist' => 'Uw eigen volglijst bekijken',
+'right-editmywatchlist' => "Uw eigen volglijst bewerken. Via sommige handelingen kunnen nog steeds pagina's toegevoegd worden, zelfs zonder deze bevoegdheid",
+'right-viewmyprivateinfo' => 'Uw eigen privégegevens bekijken (bijvoorbeeld e-mailadres, echte naam)',
+'right-editmyprivateinfo' => 'Uw eigen privégegevens bewerken (bijvoorbeeld e-mailadres, echte naam)',
+'right-editmyoptions' => 'Uw eigen voorkeuren bewerken',
 'right-rollback' => 'Snel de laatste bewerking(en) van een gebruiker van een pagina terugdraaien',
 'right-markbotedits' => 'Teruggedraaide bewerkingen markeren als botbewerkingen',
 'right-noratelimit' => 'Tijdsafhankelijke beperkingen negeren',
@@ -1740,12 +1817,19 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'action-userrights-interwiki' => "gebruikersrechten van gebruikers van andere wiki's te bewerken",
 'action-siteadmin' => 'de database af te sluiten of open te stellen',
 'action-sendemail' => 'e-mails te verzenden',
+'action-editmywatchlist' => 'uw eigen volglijst te bewerken',
+'action-viewmywatchlist' => 'uw eigen volglijst te bekijken',
+'action-viewmyprivateinfo' => 'uw eigen privégegevens te bekijken',
+'action-editmyprivateinfo' => 'uw eigen privégegevens te bewerken',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|bewerking|bewerkingen}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sinds uw laatste bezoek}}',
+'enhancedrc-history' => 'geschiedenis',
 'recentchanges' => 'Recente wijzigingen',
 'recentchanges-legend' => 'Opties voor recente wijzigingen',
 'recentchanges-summary' => 'Op deze pagina kunt u de recentste wijzigingen in deze wiki bekijken.',
+'recentchanges-noresult' => 'Er zijn in deze periode geen wijzigingen gemaakt die aan de criteria voldoen.',
 'recentchanges-feed-description' => 'Met deze feed kunt u de recentste wijzigingen in deze wiki bekijken.',
 'recentchanges-label-newpage' => 'Met deze bewerking is een nieuwe pagina aangemaakt',
 'recentchanges-label-minor' => 'Dit is een kleine bewerking',
@@ -1782,7 +1866,6 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'recentchangeslinked-feed' => 'Verwante wijzigingen',
 'recentchangeslinked-toolbox' => 'Verwante wijzigingen',
 'recentchangeslinked-title' => 'Wijzigingen verwant aan "$1"',
-'recentchangeslinked-noresult' => "Er zijn in de opgegeven periode geen bewerkingen geweest op de pagina's waarheen vanaf hier verwezen wordt.",
 'recentchangeslinked-summary' => "Deze speciale pagina geeft de laatste bewerkingen weer op pagina's waarheen verwezen wordt vanaf een opgegeven pagina of op pagina's in een opgegeven categorie.
 Pagina's die op [[Special:Watchlist|uw volglijst]] staan worden '''vet''' weergegeven.",
 'recentchangeslinked-page' => 'Paginanaam:',
@@ -1794,7 +1877,7 @@ Pagina's die op [[Special:Watchlist|uw volglijst]] staan worden '''vet''' weerge
 'reuploaddesc' => 'Upload annuleren en terugkeren naar het uploadformulier',
 'upload-tryagain' => 'Bestandsbeschrijving bijwerken',
 'uploadnologin' => 'Niet aangemeld',
-'uploadnologintext' => 'U moet [[Special:UserLogin|aangemeld]] zijn om bestanden te kunnen uploaden.',
+'uploadnologintext' => 'U moet $1 om bestanden te kunnen uploaden.',
 'upload_directory_missing' => 'De uploadmap ($1) is niet aanwezig en kon niet aangemaakt worden door de webserver.',
 'upload_directory_read_only' => 'De webserver kan niet schrijven in de uploadmap ($1).',
 'uploaderror' => 'Uploadfout',
@@ -2035,7 +2118,6 @@ Om beveiligingsreden is img_auth.php uitgeschakeld.',
 'http-read-error' => 'Fout bij het lezen van HTTP.',
 'http-timed-out' => 'Timeout bij het HTTP-verzoek.',
 'http-curl-error' => 'Fout bij het ophalen van URL: $1',
-'http-host-unreachable' => 'De URL is niet bereikbaar.',
 'http-bad-status' => 'Er is een probleem opgetreden bij het HTTP-verzoek: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2066,6 +2148,10 @@ U kunt het misschien proberen als het minder druk is.',
 'listfiles_size' => 'Grootte',
 'listfiles_description' => 'Beschrijving',
 'listfiles_count' => 'Versies',
+'listfiles-show-all' => 'Oude versies van afbeeldingen opnemen',
+'listfiles-latestversion' => 'Huidige versie',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nee',
 
 # File description page
 'file-anchor-link' => 'Bestand',
@@ -2164,6 +2250,13 @@ Vergeet niet de "Koppelingen naar deze pagina" te controleren alvorens dit sjabl
 'randompage' => 'Willekeurige pagina',
 'randompage-nopages' => "Er zijn geen pagina's in de volgende {{PLURAL:$2|naamruimte|naamruimten}}: $1.",
 
+# Random page in category
+'randomincategory' => 'Willekeurige pagina in de categorie',
+'randomincategory-invalidcategory' => '"$1" is geen geldige categorienaam.',
+'randomincategory-nopages' => "Er zijn geen pagina's in de categorie [[:Category:$1|$1]].",
+'randomincategory-selectcategory' => 'Geef een willekeurige pagina uit de categorie $1 weer. $2',
+'randomincategory-selectcategory-submit' => 'OK',
+
 # Random redirect
 'randomredirect' => 'Willekeurige doorverwijzing',
 'randomredirect-nopages' => 'Er zijn geen doorverwijzingen in de naamruimte "$1".',
@@ -2189,17 +2282,13 @@ Vergeet niet de "Koppelingen naar deze pagina" te controleren alvorens dit sjabl
 'statistics-users-active-desc' => 'Gebruikers die in de afgelopen {{PLURAL:$1|dag|$1 dagen}} een handeling hebben uitgevoerd',
 'statistics-mostpopular' => "Meest bekeken pagina's",
 
-'disambiguations' => "Pagina's die verwijzen naar doorverwijspagina's",
-'disambiguationspage' => 'Template:Doorverwijspagina',
-'disambiguations-text' => "Hieronder staan pagina's met tenminste één koppeling naar een '''doorverwijspagina'''.
-Deze horen waarschijnlijk direct naar een meer toepasselijke pagina te verwijzen.<br />
-Een pagina wordt gezien als doorverwijspagina als er een sjabloon op staat dat opgenomen is op [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => "Pagina's met een pagina-eigenschap",
 'pageswithprop-legend' => "Pagina's met een pagina-eigenschap",
 'pageswithprop-text' => "Op deze pagina worden pagina's weergegeven met een bepaalde pagina-eigenschap.",
 'pageswithprop-prop' => 'Naam van de eigenschap:',
 'pageswithprop-submit' => 'OK',
+'pageswithprop-prophidden-long' => 'lange teksteigenschapswaarde verborgen ($1)',
+'pageswithprop-prophidden-binary' => 'binaire eigenschapswaarde verborgen ($1)',
 
 'doubleredirects' => 'Dubbele doorverwijzingen',
 'doubleredirectstext' => "Deze lijst bevat pagina's die doorverwijzen naar andere doorverwijspagina's.
@@ -2259,6 +2348,7 @@ De pagina's zijn ook niet als sjabloon opgenomen.",
 'mostrevisions' => "Pagina's met de meeste bewerkingen",
 'prefixindex' => "Alle pagina's op voorvoegsel",
 'prefixindex-namespace' => "Alle pagina's met het voorvoegsel (naamruimte $1)",
+'prefixindex-strip' => 'Voorvoegsel in lijst verwijderen',
 'shortpages' => "Korte pagina's",
 'longpages' => "Lange pagina's",
 'deadendpages' => "Pagina's zonder koppelingen",
@@ -2274,6 +2364,7 @@ De pagina's zijn ook niet als sjabloon opgenomen.",
 'listusers' => 'Gebruikerslijst',
 'listusers-editsonly' => 'Alleen gebruikers met bewerkingen weergeven',
 'listusers-creationsort' => 'Sorteren op registratiedatum',
+'listusers-desc' => 'Sorteren in aflopende volgorde',
 'usereditcount' => '$1 {{PLURAL:$1|bewerking|bewerkingen}}',
 'usercreated' => '{{GENDER:$3|Geregistreerd}} op $1 om $2',
 'newpages' => "Nieuwe pagina's",
@@ -2454,10 +2545,9 @@ Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden
 'unwatchthispage' => 'Niet meer volgen',
 'notanarticle' => 'Is geen pagina',
 'notvisiblerev' => 'De laatste versie van een andere gebruiker is verwijderd',
-'watchnochange' => "Geen van de pagina's op uw volglijst is in deze periode bewerkt.",
 'watchlist-details' => "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op uw volglijst, exclusief overlegpagina's.",
-'wlheader-enotif' => '* U wordt per e-mail gewaarschuwd.',
-'wlheader-showupdated' => "* Pagina's die zijn bewerkt sinds uw laatste bezoek worden '''vet''' weergegeven.",
+'wlheader-enotif' => 'U wordt per e-mail gewaarschuwd.',
+'wlheader-showupdated' => "Pagina's die zijn bewerkt sinds uw laatste bezoek worden '''vet''' weergegeven.",
 'watchmethod-recent' => "controleer recente wijzigingen op pagina's op volglijst",
 'watchmethod-list' => "controleer pagina's op volglijst op wijzigingen",
 'watchlistcontains' => "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op uw volglijst.",
@@ -2711,7 +2801,7 @@ $1',
 'contributions' => '{{GENDER:$1|Gebruikersbijdragen}}',
 'contributions-title' => 'Bijdragen van $1',
 'mycontris' => 'Bijdragen',
-'contribsub2' => 'Voor $1 ($2)',
+'contribsub2' => 'Voor {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Geen wijzigingen gevonden die aan de gestelde criteria voldoen.',
 'uctop' => '(laatste wijziging)',
 'month' => 'Van maand (en eerder):',
@@ -2871,15 +2961,13 @@ Misschien is de blokkade al opgeheven.',
 De blokkade is onderdeel van de reeks $2, waarvan de blokkade wel opgeheven kan worden.',
 'ip_range_invalid' => 'Ongeldige IP-reeks.',
 'ip_range_toolarge' => 'Reeksblokkades groter dan /$1 zijn niet toegestaan.',
-'blockme' => 'Mij blokkeren',
 'proxyblocker' => 'Proxyblocker',
-'proxyblocker-disabled' => 'Deze functie is uitgeschakeld.',
 'proxyblockreason' => 'Uw IP-adres is geblokkeerd, omdat u gebruik maakt van een open proxyserver.
 Neem contact op met uw internetprovider of uw helpdesk en stel die op de hoogte van dit ernstige beveiligingsprobleem.',
-'proxyblocksuccess' => 'Afgerond.',
 'sorbsreason' => 'Uw IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.',
 'sorbs_create_account_reason' => 'Uw IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.
 U kunt geen gebruiker registreren.',
+'xffblockreason' => 'Een IP-adres dat u gebruikt is geblokkeerd. Dit staat de X-Forwarded-For van de header. De oorspronkelijke blokkadereden is: $1',
 'cant-block-while-blocked' => 'U kunt andere gebruikers niet blokkeren terwijl u zelf geblokkeerd bent.',
 'cant-see-hidden-user' => 'De gebruiker die u probeert te blokken is al geblokkeerd en verborgen.
 Omdat u het recht "hideuser" niet hebt, kunt u de blokkade van de gebruiker niet bekijken of bewerken.',
@@ -3046,6 +3134,8 @@ Ga naar [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisatie] en [//tran
 'thumbnail-more' => 'Vergroten',
 'filemissing' => 'Bestand is zoek',
 'thumbnail_error' => 'Fout bij het aanmaken van de miniatuurafbeelding: $1',
+'thumbnail_error_remote' => 'Foutmelding van $1:
+$2',
 'djvu_page_error' => 'DjVu-pagina buiten bereik',
 'djvu_no_xml' => 'De XML voor het DjVu-bestand kon niet opgehaald worden',
 'thumbnail-temp-create' => 'Het was niet mogelijk een tijdelijk miniatuurbestand aan te maken.',
@@ -3195,20 +3285,15 @@ U kunt wel de broncode bekijken.',
 'tooltip-undo' => 'Met "ongedaan maken" draait u deze bewerking terug en komt in het bewerkingsvenster. U kunt in de bewerkingssamenvatting een reden opgeven.',
 'tooltip-preferences-save' => 'Voorkeuren opslaan',
 'tooltip-summary' => 'Voer een korte samenvatting in',
+'tooltip-iwiki' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/** CSS die hier wordt geplaatst heeft invloed op alle skins */',
-'standard.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Standard */',
-'nostalgia.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Nostalgie */',
 'cologneblue.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Keuls blauw */',
 'monobook.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Monobook */',
-'myskin.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin MijnSkin */',
-'chick.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Chick */',
-'simple.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Eenvoudig */',
 'modern.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Modern */',
 'vector.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Vector */',
 'print.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de printuitvoer */',
-'handheld.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op handheldapparaten gebaseerd op de skin die is ingesteld in $wgHandheldStyle */',
 'noscript.css' => '/ * CSS die hier wordt geplaatst heeft invloed voor gebruikers die JavaScript hebben uitgeschakeld * /',
 'group-autoconfirmed.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op automatisch bevestigde gebruikers */',
 'group-bot.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op robots */',
@@ -3217,13 +3302,8 @@ U kunt wel de broncode bekijken.',
 
 # Scripts
 'common.js' => "/* JavaScript die hier wordt geplaatst heeft invloed op alle pagina's voor alle gebruikers */",
-'standard.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Standaard gebruiken */',
-'nostalgia.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Nostalgie gebruiken */',
 'cologneblue.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Keuls blauw gebruiken */',
 'monobook.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Monobook gebruiken */',
-'myskin.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin MijnSkin gebruiken */',
-'chick.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Chick gebruiken */',
-'simple.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Eenvoudig gebruiken */',
 'modern.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Modern gebruiken */',
 'vector.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Vector gebruiken */',
 'group-autoconfirmed.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op automatisch bevestigde gebruikers */',
@@ -3303,13 +3383,8 @@ Meestal wordt dit door een externe koppeling op een zwarte lijst veroorzaakt.',
 'pageinfo-category-files' => 'Aantal bestanden',
 
 # Skin names
-'skinname-standard' => 'Klassiek',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Keuls blauw',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'MijnSkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Eenvoudig',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -3389,11 +3464,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minuut|$1 minuten}}',
 'hours' => '{{PLURAL:$1|$1 uur|$1 uur}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
+'weeks' => '{{PLURAL: $1|één week|$1 weken}}',
 'months' => '{{PLURAL:$1|één maand|$1 maanden}}',
 'years' => '{{PLURAL:$1|één jaar|$1 jaar}}',
 'ago' => '$1 geleden',
 'just-now' => 'Daarnet',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|uur}} geleden',
+'minutes-ago' => '$1 {{PLURAL:$1|minuut|minuten}} geleden',
+'seconds-ago' => '$1 {{PLURAL:$1|seconde|seconden}} geleden',
+'monday-at' => 'Maandag om $1',
+'tuesday-at' => 'Dinsdag om $1',
+'wednesday-at' => 'Woensdag om $1',
+'thursday-at' => 'Donderdag om $1',
+'friday-at' => 'Vrijdag om $1',
+'saturday-at' => 'Zaterdag om $1',
+'sunday-at' => 'Zondag om $1',
+'yesterday-at' => 'Gisteren om $1',
+
 # Bad image list
 'bad_image_list' => "De opmaak is als volgt:
 
@@ -3423,7 +3512,7 @@ Andere velden worden verborgen.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breedte',
 'exif-imagelength' => 'Hoogte',
 'exif-bitspersample' => 'Bits per component',
@@ -3601,7 +3690,7 @@ Andere velden worden verborgen.
 'exif-originalimageheight' => 'Hoogte van de afbeelding voor bijsnijden',
 'exif-originalimagewidth' => 'Breedte van de afbeelding voor bijsnijden',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ongecomprimeerd',
 'exif-compression-2' => 'CCITT Groep 3 1-dimensionale aangepaste "Huffman run length"-codering',
 'exif-compression-3' => 'CCITT Groep 3 faxcodering',
@@ -4011,7 +4100,6 @@ U kunt ook [[Special:EditWatchlist|het standaard bewerkingsscherm gebruiken]].',
 'version-other' => 'Overige',
 'version-mediahandlers' => 'Mediaverwerkers',
 'version-hooks' => 'Hooks',
-'version-extension-functions' => 'Uitbreidingsfuncties',
 'version-parser-extensiontags' => 'Parseruitbreidingstags',
 'version-parser-function-hooks' => 'Parserfunctiehooks',
 'version-hook-name' => 'Hooknaam',
@@ -4020,6 +4108,7 @@ U kunt ook [[Special:EditWatchlist|het standaard bewerkingsscherm gebruiken]].',
 'version-license' => 'Licentie',
 'version-poweredby-credits' => "Deze wiki wordt aangedreven door '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'anderen',
+'version-poweredby-translators' => 'translatewiki.net-vertalers',
 'version-credits-summary' => 'We erkennen graag de volgende personen voor hun bijdrage aan [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki is vrije software; u kunt MediaWiki verspreiden en/of aanpassen onder de voorwaarden van de GNU General Public License zoals gepubliceerd door de Free Software Foundation; ofwel versie 2 van de Licentie, of - naar uw wens - enige latere versie.
 
@@ -4035,13 +4124,17 @@ Samen met dit programma hoort u een [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]',
 
-# Special:FilePath
-'filepath' => 'Bestandslocatie',
-'filepath-page' => 'Bestand:',
-'filepath-submit' => 'OK',
-'filepath-summary' => 'Deze speciale pagina geeft het volledige pad voor een bestand.
-Afbeeldingen worden in hun volledige resolutie weergegeven.
-Andere bestandstypen worden direct in het met het MIME-type verbonden programma geopend.',
+# Special:Redirect
+'redirect' => 'Doorverwijzen op bestandsnaam, gebruikersnummer of versienummer',
+'redirect-legend' => 'Doorverwijzen naar een bestand of pagina',
+'redirect-summary' => 'Deze speciale pagina verwijst door naar een bestand (als een bestandsnaam wordt opgegeven), een pagina (als een versienummer wordt opgegeven) of een gebruikerspagina (als een gebruikersnummer wordt opgegeven).',
+'redirect-submit' => 'OK',
+'redirect-lookup' => 'Opzoeken:',
+'redirect-value' => 'Waarde:',
+'redirect-user' => 'Gebruikersnummer',
+'redirect-revision' => 'Paginaversie',
+'redirect-file' => 'Bestandsnaam',
+'redirect-not-exists' => 'Waarde niet gevonden',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Duplicaatbestanden zoeken',
@@ -4091,12 +4184,16 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
 'tags' => 'Geldige wijzigingslabels',
 'tag-filter' => '[[Special:Tags|Labelfilter]]:',
 'tag-filter-submit' => 'Filteren',
+'tag-list-wrapper' => '([[Special:Tags|Label{{PLURAL:$1||s}}]]: $2)',
 'tags-title' => 'Labels',
 'tags-intro' => 'Op deze pagina staan de labels waarmee de software iedere bewerking kan markeren, en hun betekenis.',
 'tags-tag' => 'Labelnaam',
 'tags-display-header' => 'Weergave in wijzigingslijsten',
 'tags-description-header' => 'Volledige beschrijving van betekenis',
+'tags-active-header' => 'Actief?',
 'tags-hitcount-header' => 'Gelabelde bewerkingen',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nee',
 'tags-edit' => 'bewerken',
 'tags-hitcount' => '$1 {{PLURAL:$1|wijziging|wijzigingen}}',
 
@@ -4117,6 +4214,7 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
 'dberr-problems' => 'Onze excuses. Deze site ondervindt op het moment technische problemen.',
 'dberr-again' => 'Wacht een aantal minuten en probeer het daarna opnieuw.',
 'dberr-info' => '(Kan geen verbinding maken met de databaseserver: $1)',
+'dberr-info-hidden' => '(Kan geen verbinding maken met de databaseserver)',
 'dberr-usegoogle' => 'Wellicht kunt u in de tussentijd zoeken via Google.',
 'dberr-outofdate' => "Let op: hun indexen van onze pagina's zijn wellicht niet recent.",
 'dberr-cachederror' => 'Deze pagina is een kopie uit de cache en is wellicht niet de meest recente versie.',
@@ -4132,6 +4230,9 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
 'htmlform-submit' => 'Opslaan',
 'htmlform-reset' => 'Wijzigingen ongedaan maken',
 'htmlform-selectorother-other' => 'Anders',
+'htmlform-no' => 'Nee',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Selecteer een optie',
 
 # SQLite database support
 'sqlite-has-fts' => 'Versie $1 met ondersteuning voor "full-text" zoeken',
@@ -4249,4 +4350,19 @@ Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt
 # Image rotation
 'rotate-comment' => 'Afbeelding gedraaid, $1 {{PLURAL:$1|graad|graden}} met de klok mee',
 
+# Limit report
+'limitreport-title' => 'Prestatiegegevens van de parser:',
+'limitreport-cputime' => 'Tijdsgebruik van CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|seconde|seconden}}',
+'limitreport-walltime' => 'Reëel tijdgebruik',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|seconde|seconden}}',
+'limitreport-ppvisitednodes' => 'Aantal nodes bekeken tijdens de voorverwerking:',
+'limitreport-ppgeneratednodes' => 'Aantal nodes aangemaakt tijdens de voorverwerking:',
+'limitreport-postexpandincludesize' => 'Inclusiegrootte na uitbreiden',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Grootte sjabloonparameters',
+'limitreport-templateargumentsize-value' => '$1 / $2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => 'Hoogste uitbreidingsdiepte',
+'limitreport-expensivefunctioncount' => 'Aantal kostbare parserfuncties',
+
 );
diff --git a/languages/messages/MessagesNl_informal.php b/languages/messages/MessagesNl_informal.php
index cd813fea..f52c86b8 100644
--- a/languages/messages/MessagesNl_informal.php
+++ b/languages/messages/MessagesNl_informal.php
@@ -15,22 +15,20 @@
 $fallback = 'nl';
 
 $messages = array(
-'view-pool-error' => 'De servers zijn op het moment helaas overbelast.
+'view-pool-error' => 'Sorry, de servers zijn op het moment overbelast.
 Te veel gebruikers proberen deze pagina te bekijken.
-Wacht even voordat je opnieuw toegang probeert te krijgen tot deze pagina.
+Wacht alstublieft even voordat je opnieuw toegang probeert te krijgen tot deze pagina.
 
 $1',
 
 'badaccess-group0' => 'Je hebt geen rechten om de gevraagde handeling uit te voeren.',
 
 'youhavenewmessages' => 'Je hebt $1 ($2).',
-'youhavenewmessagesfromusers' => 'Je hebt $1 van {{PLURAL:$3|een andere gebruiker|$3 gebruikers}} ($2).',
-'youhavenewmessagesmanyusers' => 'Je hebt $1 van een groot aantal gebruikers ($2).',
 'youhavenewmessagesmulti' => 'Je hebt nieuwe berichten op $1',
 
 # Main script and global functions
 'nosuchactiontext' => 'De opdracht in de URL is ongeldig.
-Mogelijk heb je een typefout gemaakt in de URL of een onjuiste koppeling gevolgd.
+Mogelijk heb je een typefout gemaakt in de URL of een onjuiste verwijzing gevolgd.
 Het kan ook wijzen op een fout in de software van {{SITENAME}}.',
 'nospecialpagetext' => '<strong>Je hebt een onbestaande speciale pagina opgevraagd.</strong>
 
@@ -39,48 +37,41 @@ Een lijst met bestaande speciale pagina’s staat op [[Special:SpecialPages|spec
 # General errors
 'missing-article' => 'In de database is geen inhoud aangetroffen voor de pagina "$1" die er wel zou moeten zijn ($2).
 
-Dit kan voorkomen als je een verouderde koppeling naar het verschil tussen twee versies van een pagina volgt of een versie opvraagt die is verwijderd.
+Dit kan voorkomen als je een verouderde verwijzing naar het verschil tussen twee versies van een pagina volgt of een versie opvraagt die is verwijderd.
 
 Als dit niet het geval is, heb je wellicht een fout in de software gevonden.
-Maak hiervan melding bij een [[Special:ListUsers/sysop|beheerder]] van {{SITENAME}} en vermeld daarbij de URL van deze pagina.',
+Maak hiervan melding bij een [[Special:ListUsers/sysop|systeembeheerder]] van {{SITENAME}} en vermeld daarbij de URL van deze pagina.',
 'actionthrottledtext' => 'Als maatregel tegen spam is het aantal keren per tijdseenheid dat je deze handeling kunt verrichten beperkt.
 De limiet is overschreden.
 Probeer het over een aantal minuten opnieuw.',
 'viewsourcetext' => 'Je kunt de brontekst van deze pagina bekijken en kopiëren:',
-'viewyourtext' => "Je kunt '''uw bewerkingen''' aan de brontekst van deze pagina bekijken en kopiëren:",
-'editinginterface' => "'''Waarschuwing:''' je bewerkt een pagina die interfacetekst voor de software bevat.
-Bewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen op deze wiki.
-Gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki, om vertalingen toe te voegen of te wijzigen voor alle wiki's.",
+'editinginterface' => "'''Waarschuwing:''' Je bewerkt een pagina die gebruikt wordt door de software.
+Bewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen.
+Overweeg voor vertalingen om [//translatewiki.net/wiki/Main_Page?setlang=nl translatewiki.net] te gebruiken, het vertalingsproject voor MediaWiki.",
 'namespaceprotected' => "Je hebt geen rechten om pagina's in de naamruimte '''$1''' te bewerken.",
-'customcssprotected' => 'Je kunt deze CSS-pagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.',
-'customjsprotected' => 'Je kunt deze JavaScriptpagina niet bewerken, omdat die persoonlijke instellingen van een andere gebruiker bevat.',
-'exception-nologin-text' => 'Om deze pagina te bekijken of deze handeling uit te kunnen voeren moet je aangemeld zijn bij deze wiki.',
 
 # Login and logout pages
 'logouttext' => "'''Je bent nu afgemeld.'''
 
-Je kunt {{SITENAME}} nu anoniem gebruiken of weer <span class='plainlinks'>[$1 aanmelden]</span> als dezelfde of een andere gebruiker.
+Je kunt {{SITENAME}} nu anoniem gebruiken of weer [[Special:UserLogin|aanmelden]] als dezelfde of een andere gebruiker.
 Mogelijk worden nog een aantal pagina's weergegeven alsof je aangemeld bent totdat je de cache van uw browser leegt.",
-'welcomecreation-msg' => 'Je gebruiker is aangemaakt.
+'welcomecreation' => '== Welkom, $1! ==
+Je gebruiker is geregistreerd.
 Vergeet niet je [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te passen.',
 'yourpasswordagain' => 'Geef je wachtwoord opnieuw in:',
 'yourdomainname' => 'Je domein:',
-'password-change-forbidden' => 'Je kunt je wachtwoord niet wijzigen in deze wiki.',
-'externaldberror' => 'Er is een fout opgetreden bij het aanmelden bij de database of je hebt geen toestemming je externe gebruiker bij te werken.',
+'externaldberror' => 'Er is een fout opgetreden bij het aanmelden bij de database of je hebt geen toestemming uw externe gebruiker bij te werken.',
 'loginprompt' => 'Je moet cookies ingeschakeld hebben om je te kunnen aanmelden bij {{SITENAME}}.',
 'gotaccount' => "Heb je al een gebruikersnaam? '''$1'''.",
-'userlogin-resetlink' => 'Ben je je aanmeldgegevens vergeten?',
-'nocookiesnew' => 'De gebruiker is geregistreerd, maar jij bent niet aangemeld.
+'nocookiesnew' => 'De gebruiker is geregistreerd, maar niet aangemeld.
 {{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.
 Schakel die in en meld daarna aan met je nieuwe gebruikersnaam en wachtwoord.',
 'nocookieslogin' => '{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.
 Cookies zijn uitgeschakeld in je browser.
 Schakel deze optie aan en probeer het opnieuw.',
-'nocookiesfornew' => 'De gebruiker is niet gemaakt omdat de bron niet bevestigd kon worden.
-Zorg ervoor dat je cookies hebt ingeschakeld, herlaad deze pagina en probeer het opnieuw.',
 'noname' => 'Je hebt geen geldige gebruikersnaam opgegeven.',
 'loginsuccess' => "'''Je bent nu aangemeld bij {{SITENAME}} als \"\$1\".'''",
-'nouserspecified' => 'Geef een gebruikersnaam op.',
+'nouserspecified' => 'Je dient een gebruikersnaam op te geven.',
 'password-name-match' => 'Je wachtwoord en uw gebruikersnaam mogen niet overeenkomen.',
 'passwordremindertext' => 'Iemand, waarschijnlijk jijzelf, heeft vanaf IP-adres $1 een verzoek
 gedaan tot het toezenden van een nieuw wachtwoord voor {{SITENAME}}
@@ -100,10 +91,10 @@ Om misbruik te voorkomen is het niet mogelijk om een nieuw wachtwoord aan te vra
 'eauthentsent' => 'Er is een bevestigingse-mail naar het opgegeven e-mailadres gezonden.
 Volg de aanwijzingen in de e-mail om aan te geven dat het jouw e-mailadres is.
 Tot die tijd kunnen er geen e-mails naar het e-mailadres gezonden worden.',
-'acct_creation_throttle_hit' => 'Bezoekers van deze wiki met hetzelfde IP-adres als jij hebben de afgelopen dag al $1 gebruiker{{PLURAL:$1||s}} geregistreerd, wat het maximale aantal in deze periode is.
-Daarom kan je vanaf je IP-adres op dit moment geen nieuwe gebruikers registreren.',
+'acct_creation_throttle_hit' => 'Bezoekers van deze wiki met hetzelfde IP-adres als jij hebben de afgelopen dag {{PLURAL:$1|al 1 gebruiker|al $1 gebruikers}} geregistreerd, wat het maximale aantal in deze periode is.
+Daarom kun je als vanaf jouw IP-adres op dit moment geen nieuwe gebruiker registreren.',
 'emailauthenticated' => 'Je e-mailadres is bevestigd op $2 om $3.',
-'emailnotauthenticated' => 'Je e-mailadres is niet bevestigd.
+'emailnotauthenticated' => 'Je e-mailadres is <strong>niet bevestigd</strong>.
 Je ontvangt geen e-mail voor de onderstaande functies.',
 'noemailprefs' => 'Geef een e-mailadres op in je voorkeuren om deze functies te gebruiken.',
 'emailconfirmlink' => 'Bevestig je e-mailadres',
@@ -114,7 +105,6 @@ Meld je aan en wijzig je wachtwoord.
 Negeer dit bericht als deze gebruiker zonder jouw medeweten is aangemaakt.',
 'login-throttled' => 'Je hebt recentelijk te vaak geprobeerd aan te melden met een onjuist wachtwoord.
 Wacht even voordat je het opnieuw probeert.',
-'login-abort-generic' => 'Je bent niet aangemeld. De procedure is afgebroken.',
 'suspicious-userlogout' => 'Je verzoek om af te melden is genegeerd, omdat het lijkt alsof het verzoek is verzonden door een browser of cacheproxy die stuk is.',
 
 # Change password dialog
@@ -122,33 +112,10 @@ Wacht even voordat je het opnieuw probeert.',
 Voer een nieuw wachtwoord in om het aanmelden te voltooien:',
 'resetpass_success' => 'Je wachtwoord is gewijzigd.
 Bezig met aanmelden…',
-'resetpass-no-info' => 'Je moet aangemeld zijn voordat je deze pagina kunt gebruiken.',
+'resetpass-no-info' => 'Je dient aangemeld zijn voordat je deze pagina kunt gebruiken.',
 'resetpass-wrong-oldpass' => 'Het huidige of tijdelijke wachtwoord is ongeldig.
 Mogelijk heb je je wachtwoord al gewijzigd of een nieuw tijdelijk wachtwoord aangevraagd.',
 
-# Special:PasswordReset
-'passwordreset-text' => 'Vul dit formulier in zodat we ujeeen e-mail kunnen sturen met je gebruikersgegevens.',
-'passwordreset-capture-help' => 'Als je dit vakje aanvinkt, wordt de e-mail (met het tijdelijke wachtwoord) naar de gebruiker verzonden en ook aan jou weergegeven.',
-'passwordreset-emailtext-ip' => 'Iemand, waarschijnlijk jij, heeft vanaf het IP-adres $1 je gebruikersgegevens voor {{SITENAME}} ($4) opgevraagd.
-De volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:
-
-$2
-
-{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}.
-Meld je aan en wijzig het wachtwoord nu. Als je dit verzoek niet zelf hebt gedaan, of als je het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf je oude wachtwoord gebruiken.',
-'passwordreset-emailtext-user' => 'Gebruiker $1 op de site {{SITENAME}} heeft je gebruikersgegevens voor {{SITENAME}} ($4) opgevraagd.
-De volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:
-
-$2
-
-{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}.
-Meld je aan en wijzig het wachtwoord nu. Als je dit verzoek niet zelf hebt gedaan, of als je het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf je oude wachtwoord gebruiken.',
-
-# Special:ChangeEmail
-'changeemail-text' => 'Vul dit formulier in om je e-mailadres te wijzigen. Je moet je wachtwoord invoeren om deze wijziging te bevestigen.',
-'changeemail-no-info' => 'Je moet aangemeld zijn om rechtstreeks toegang te hebben tot deze pagina.',
-'changeemail-password' => 'Jouw wachtwoord voor {{SITENAME}}:',
-
 # Edit page toolbar
 'sig_tip' => 'Je handtekening met datum en tijd',
 
@@ -157,9 +124,9 @@ Meld je aan en wijzig het wachtwoord nu. Als je dit verzoek niet zelf hebt gedaa
 Je IP-adres wordt opgeslagen als je wijzigingen op deze pagina maakt.",
 'anonpreviewwarning' => "''Je bent niet aangemeld.''
 ''Door je bewerking op te slaan wordt je IP-adres opgeslagen in de paginageschiedenis.''",
-'missingsummary' => "'''Let op:''' je hebt geen samenvatting opgegeven voor je bewerking.
+'missingsummary' => "'''Herinnering:''' je hebt geen samenvatting opgegeven voor je bewerking.
 Als je nogmaals op ''Pagina opslaan'' klikt wordt de bewerking zonder samenvatting opgeslagen.",
-'missingcommenttext' => 'Plaats je reactie hieronder.',
+'missingcommenttext' => 'Plaats je opmerking hieronder.',
 'missingcommentheader' => "'''Let op:''' Je hebt geen onderwerp/kop voor deze opmerking opgegeven.
 Als je opnieuw op \"{{int:savearticle}}\" klikt, wordt je wijziging zonder een onderwerp/kop opgeslagen.",
 'blockedtext' => '\'\'\'Je gebruiker of IP-adres is geblokkeerd.\'\'\'
@@ -172,7 +139,7 @@ De opgegeven reden is \'\'$2\'\'.
 * Bedoeld te blokkeren: $7
 
 Je kunt contact opnemen met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]] om de blokkade te bespreken.
-Je kunt geen gebruik maken van de functie "Deze gebruiker e-mailen", tenzij je een geldig e-mailadres hebt opgegeven in je [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet geblokkeerd is.
+Je kunt geen gebruik maken van de functie "Deze gebruiker e-mailen", tenzij je een geldig e-mailadres hebt opgegeven in uw [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet geblokkeerd is.
 Je huidige IP-adres is $3 en het blokkadenummer is #$5.
 Vermeld alle bovenstaande gegevens als je ergens op deze blokkade reageert.',
 'autoblockedtext' => 'Je IP-adres is automatisch geblokkeerd, omdat het is gebruikt door een andere gebruiker, die is geblokkeerd door $1.
@@ -192,14 +159,14 @@ Je huidige IP-adres is $3 en het blokkadenummer is #$5.
 Vermeld alle bovenstaande gegevens als je ergens op deze blokkade reageert.',
 'whitelistedittext' => "Je moet $1 om pagina's te bewerken.",
 'confirmedittext' => 'Je moet je e-mailadres bevestigen voor je kunt bewerken.
-Voer je e-mailadres in en bevestig het via je [[Special:Preferences|voorkeuren]].',
+Voer je e-mailadres in en bevestig het via [[Special:Preferences|je voorkeuren]].',
 'nosuchsectiontext' => 'Je probeerde een subkopje te bewerken dat niet bestaat.
 Wellicht is het verplaatst of verwijderd terwijl je de pagina aan het bekijken was.',
 'loginreqpagetext' => "Je moet je $1 om andere pagina's te kunnen bekijken.",
 'newarticletext' => "Deze pagina bestaat niet.
 Typ in het onderstaande veld om de pagina aan te maken (meer informatie staat op de [[{{MediaWiki:Helppage}}|hulppagina]]).
 Gebruik de knop '''vorige''' in je browser als je hier per ongeluk terecht bent gekomen.",
-'anontalkpagetext' => "----''Deze overlegpagina hoort bij een anonieme gebruiker die geen gebruikersnaam heeft of deze niet gebruikt.
+'anontalkpagetext' => "----''Deze overlegpagina hoort bij een anonieme gebruiker die hetzij geen gebruikersnaam heeft, hetzij deze niet gebruikt.
 Daarom wordt het IP-adres ter identificatie gebruikt.
 Het is mogelijk dat meerdere personen hetzelfde IP-adres gebruiken.
 Mogelijk ontvang je hier berichten die niet voor je bedoeld zijn.
@@ -208,24 +175,23 @@ Als je dat wilt voorkomen, [[Special:UserLogin/signup|registreer je]] of [[Speci
 Je kunt [[Special:Search/{{PAGENAME}}|naar deze term zoeken]] in andere pagina\'s, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboeken doorzoeken] of [{{fullurl:{{FULLPAGENAME}}|action=edit}} deze pagina bewerken]</span>.',
 'noarticletext-nopermission' => 'Deze pagina bevat geen tekst.
 Je kunt [[Special:Search/{{PAGENAME}}|naar deze term zoeken]] in andere pagina\'s of
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboeken doorzoeken]</span>, maar je mag de pagina niet aanmaken.',
-'userpage-userdoesnotexist' => 'Je bewerkt een gebruikerspagina van een gebruiker die niet bestaat (gebruiker "$1").
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboeken doorzoeken]</span>.',
+'userpage-userdoesnotexist' => 'Je bewerkt een gebruikerspagina van een gebruiker die niet bestaat (gebruiker "<nowiki>$1</nowiki>").
 Controleer of je deze pagina wel wilt aanmaken/bewerken.',
 'clearyourcache' => "'''Let op!''' Nadat je de wijzigingen hebt opgeslagen is het wellicht nodig je browsercache te legen.
 * '''Firefox / Safari:''' houd ''Shift'' ingedrukt terwijl je op ''Vernieuwen'' klikt of druk op ''Ctrl-F5'' of ''Ctrl-R'' (''⌘-Shift-R'' op een Mac)
 * '''Google Chrome:''' druk op ''Ctrl-Shift-R'' (''⌘-Shift-R'' op een Mac)
 * '''Internet Explorer:''' houd ''Ctrl'' ingedrukt terwijl je op ''Vernieuwen'' klikt of druk op ''Ctrl-F5''
 * '''Opera:''' leeg je cache in ''Extra → Voorkeuren''",
-'usercssyoucanpreview' => "'''Tip:''' gebruik de knop \"{{int:showpreview}}\" om je nieuwe CSS te testen alvorens op te slaan.",
-'userjsyoucanpreview' => "'''Tip:''' gebruik de knop \"{{int:showpreview}}\" om je nieuwe JavaScript te testen alvorens op te slaan.",
+'usercssyoucanpreview' => "'''Tip:''' Gebruik de knop \"{{int:showpreview}}\" om je nieuwe CSS te testen alvorens op te slaan.",
+'userjsyoucanpreview' => "'''Tip:''' Gebruik de knop \"{{int:showpreview}}\" om je nieuwe JavaScript te testen alvorens op te slaan.",
 'usercsspreview' => "'''Dit is alleen een voorvertoning van je persoonlijke CSS.
 Deze is nog niet opgeslagen!'''",
 'userjspreview' => "'''Let op: je test nu je persoonlijke JavaScript.'''
 '''De pagina is niet opgeslagen!'''",
-'userinvalidcssjstitle' => "'''Waarschuwing:''' er is geen uiterlijk \"\$1\".
-Je eigen .css- en .js-pagina's beginnen met een kleine letter, bijvoorbeeld {{ns:user}}:Naam/vector.css in plaats van {{ns:user}}:Naam/Vector.css.",
-'previewnote' => "'''Let op: dit is een controlepagina.'''
-Je tekst is niet opgeslagen!",
+'userinvalidcssjstitle' => "'''Waarschuwing:''' er is geen skin \"\$1\".
+Let op: je eigen .css- en .js-pagina's beginnen met een kleine letter, bijvoorbeeld {{ns:user}}:Naam/vector.css in plaats van {{ns:user}}:Naam/Vector.css.",
+'previewnote' => "'''Let op: dit is een controlepagina; je tekst is niet opgeslagen!'''",
 'previewconflict' => 'Deze voorvertoning geeft aan hoe de tekst in het bovenste veld eruit ziet als je deze opslaat.',
 'session_fail_preview' => "'''Je bewerking is niet verwerkt, omdat de sessiegegevens verloren zijn gegaan.
 Probeer het opnieuw.
@@ -236,32 +202,32 @@ Als het dan nog niet lukt, [[Special:UserLogout|meld jezelf dan af]] en weer aan
 
 '''Als dit een legitieme bewerking is, probeer het dan opnieuw.
 Als het dan nog niet lukt, [[Special:UserLogout|meld jezelf dan af]] en weer aan.'''",
-'token_suffix_mismatch' => "'''Je bewerking is geweigerd, omdat je browser de leestekens in het bewerkingstoken onjuist heeft behandeld.'''
+'token_suffix_mismatch' => "'''Je bewerking is geweigerd, omdat je browser de leestekens in het bewerkingstoken onjuist heeft behandeld.
 De bewerking is geweigerd om verminking van de paginatekst te voorkomen.
-Dit gebeurt soms als er een webgebaseerde proxydienst wordt gebruikt die fouten bevat.",
-'edit_form_incomplete' => "'''Sommige onderdelen van het bewerkingsformulier hebben de server niet bereikt. Controleer of je bewerkingen intact zijn en probeer het opnieuw.'''",
+Dit gebeurt soms als er een webgebaseerde proxydienst wordt gebruikt die fouten bevat.'''",
 'explainconflict' => "Een andere gebruiker heeft deze pagina bewerkt sinds je met je bewerking bent begonnen.
 In het bovenste deel van het venster staat de tekst van de huidige pagina.
 Je bewerking staat in het onderste gedeelte.
 Je dient je bewerkingen in te voegen in de bestaande tekst.
 '''Alleen''' de tekst in het bovenste gedeelte wordt opgeslagen als je op \"{{int:savearticle}}\" klikt.",
 'yourtext' => 'Je tekst',
-'nonunicodebrowser' => "'''Waarschuwing: je browser kan niet goed overweg met Unicode.'''
-Hiermee wordt door de MediaWiki-software rekening gehouden zodat je toch zonder problemen pagina's kunt bewerken: niet-ASCII tekens worden in het bewerkingsveld weergegeven als hexadecimale codes.",
-'editingold' => "'''Waarschuwing: je bewerkt een oude versie van deze pagina.'''
-Als je je bewerking opslaat, gaan alle wijzigingen verloren die na deze versie zijn gemaakt.",
-'copyrightwarning' => "Let op: alle bijdragen aan {{SITENAME}} worden geacht te zijn vrijgegeven onder de \$2 (zie \$1 voor details).
-Als je niet wilt dat je tekst door anderen naar believen bewerkt en verspreid kan worden, kies dan niet voor \"Pagina opslaan\".<br />
+'nonunicodebrowser' => "'''WAARSCHUWING: Je browser kan niet goed overweg met unicode.
+Hiermee wordt door de MediaWiki-software rekening gehouden zodat je toch zonder problemen pagina's kunt bewerken: niet-ASCII karakters worden in het bewerkingsveld weergegeven als hexadecimale codes.'''",
+'editingold' => "'''WAARSCHUWING!
+Je bewerkt een oude versie van deze pagina.
+Als je je bewerking opslaat, gaan alle wijzigingen die na deze versie gemaakt zijn verloren.'''",
+'copyrightwarning' => "Opgelet: alle bijdragen aan {{SITENAME}} worden geacht te zijn vrijgegeven onder de $2 (zie $1 voor details).
+Als je niet wilt dat je tekst door anderen naar believen bewerkt en verspreid kan worden, kies dan niet voor ‘Pagina opslaan’.<br />
 Hierbij beloof je ons tevens dat je deze tekst zelf hebt geschreven of overgenomen uit een vrije, openbare bron.<br />
-'''Gebruik geen materiaal dat beschermd wordt door auteursrecht, tenzij je daarvoor toestemming hebt!'''",
+'''GEBRUIK GEEN MATERIAAL DAT BESCHERMD WORDT DOOR AUTEURSRECHT, TENZIJ JE DAAR TOESTEMMING VOOR HEBT!'''",
 'copyrightwarning2' => "Al je bijdragen aan {{SITENAME}} kunnen bewerkt, gewijzigd of verwijderd worden door andere gebruikers.
 Als je niet wilt dat je teksten rigoureus aangepast worden door anderen, plaats ze hier dan niet.<br />
 Je belooft ook dat je de oorspronkelijke auteur bent van dit materiaal of dat je het hebt gekopieerd uit een bron in het publieke domein of een soortgelijke vrije bron (zie $1 voor details).
-'''Gebruik geen materiaal dat beschermd wordt door auteursrecht, tenzij je daarvoor toestemming hebt!'''",
-'longpageerror' => "'''Fout: de tekst die je hebt toegevoegd is {{PLURAL:$1|één kilobyte|$1 kilobyte}} groot, wat groter is dan het maximum van {{PLURAL:$2|één kilobyte|$2 kilobyte}}.'''
-Opslaan is niet mogelijk.",
-'readonlywarning' => "'''Waarschuwing: je kunt deze bewerking nu niet opslaan omdat de database is geblokkeerd voor bewerkingen wegens onderhoudswerkzaamheden.'''
-Het is misschien verstandig om je tekst tijdelijk in een tekstbestand op te slaan om dit te bewaren voor wanneer de blokkering van de database opgeheven is.
+'''GEBRUIK GEEN MATERIAAL DAT BESCHERMD WORDT DOOR AUTEURSRECHT, TENZIJ JE DAARVOOR TOESTEMMING HEBT!'''",
+'longpageerror' => "'''FOUT: de tekst die je hebt toegevoegd is $1 kilobyte groot, wat groter is dan het maximum van $2 kilobyte.
+Opslaan is niet mogelijk.'''",
+'readonlywarning' => "'''WAARSCHUWING: De database is geblokkeerd voor bewerkingen, waarschijnlijk voor regulier databaseonderhoud, dus je kunt deze nu niet opslaan.
+Het is misschien verstandig om je tekst tijdelijk in een tekstbestand op te slaan om dit te bewaren voor wanneer de blokkering van de database opgeheven is.'''
 
 Een beheerder heeft de database geblokkeerd om de volgende reden: $1",
 'nocreatetext' => "{{SITENAME}} heeft de mogelijkheid om nieuwe pagina's te maken beperkt.
@@ -276,58 +242,57 @@ Voor je gemak staan hieronder het verwijderingslogboek en het hernoemingslogboek
 'edit-no-change' => 'Je bewerking is genegeerd, omdat er geen wijziging aan de tekst is gemaakt.',
 
 # Revision deletion
-'rev-deleted-text-unhide' => "Deze paginaversie is '''verwijderd'''.
-Er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].
-Als je wilt kan je [$1 deze versie bekijken].",
+'rev-deleted-text-unhide' => "Deze versie van de pagina is '''verwijderd'''.
+Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].
+Als beheerder kun je  [$1 deze versie bekijken] als je wil.",
 'rev-suppressed-text-unhide' => "Deze paginaversie is '''onderdrukt'''.
-Er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek onderdrukte versies].
-Als je wilt kan je [$1 deze versie bekijken].",
-'rev-deleted-text-view' => "Deze paginaversie is '''verwijderd'''.
-Je kunt deze bekijken; er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
+Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek onderdrukte versies].
+Als beheerder kun je [$1 de verschillen bekijken] als je wil.",
+'rev-deleted-text-view' => "Deze bewerking is '''verwijderd'''.
+Als beheerder kun je deze zien;
+er kunnen details aanwezig zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
 'rev-suppressed-text-view' => "Deze paginaversie is '''onderdrukt'''.
-Je kunt deze bekijken; er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek onderdrukte versies].",
+Als beheerder kun je deze bekijken;
+achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek onderdrukte versies].",
 'rev-deleted-no-diff' => "Je kunt de verschillen niet bekijken, omdat een van de versies is '''verwijderd'''.
 Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
 'rev-suppressed-no-diff' => "Je kunt de verschillen niet bekijken, omdat een van de versies is '''verwijderd'''.",
 'rev-deleted-unhide-diff' => "Een van de bewerkingen voor de verschillen die je hebt opgevraagd is '''verwijderd'''.
-Er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].
-Als je wilt kan je [$1 de verschillen bekijken].",
+Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].
+Als beheerder kun je [$1 de verschillen bekijken] als je wil.",
 'rev-suppressed-unhide-diff' => "Een van de versies in deze verschillen is '''onderdrukt'''.
-Er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek].
-Als je wilt kan je [$1 deze versie bekijken].",
+Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek].
+Als beheerder kunt je [$1 deze versie bekijken] als je wil.",
 'rev-deleted-diff-view' => "Een van de versies voor de verschillen die je hebt opgevraagd, is '''verwijderd'''.
 Jij kunt deze verschillen bekijken. Mogelijk zijn details zichtbaar in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderlogboek].",
-'rev-suppressed-diff-view' => "Een van de bewerkingen voor de verschillen die u hebt opgevraagd, is '''onderdrukt'''.
-Je kunt deze verschillen bekijken. Er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek].",
-'revdelete-nooldid-text' => 'Je hebt geen doelversie(s) voor deze handeling opgegeven, de opgegeven versie bestaat niet of je probeert de laatste versie te verbergen.',
+'rev-suppressed-diff-view' => "Een van de bewerkingen voor de verschillen die je hebt opgevraagd, is '''onderdrukt'''.
+Als beheerder kun je deze verschillen bekijken. Mogelijk zijn details zichtbaar in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek].",
+'revdelete-nooldid-text' => 'Je hebt geen doelversie(s) voor deze handeling opgegeven, de aangegeven versie bestaat niet of je probeert de laatste versie te verbergen.',
 'revdelete-nologtype-text' => 'Je hebt geen logboektype opgegeven om deze handeling op uit te voeren.',
-'revdelete-nologid-text' => 'Je hebt ofwel geen doellogboekregel opgegeven of de opgegeven logboekregel bestaat niet.',
-'revdelete-show-file-confirm' => 'Weet je zeker dat je de verwijderde versie van het bestand "<nowiki>$1</nowiki>" van $2 om $3 wilt bekijken?',
+'revdelete-nologid-text' => 'Je hebt ofwel geen doellogboekregel opgegeven of de aangegeven logboekregel bestaat niet.',
+'revdelete-show-file-confirm' => 'Weet je zeker dat u de verwijderde versie van het bestand "<nowiki>$1</nowiki>" van $2 om $3 wilt bekijken?',
 'revdelete-confirm' => 'Bevestig dat je dit wilde doen, dat je de consequenties begrijpt en dat je dit doet in overeenstemming met het geldende [[{{MediaWiki:Policy-url}}|beleid]].',
-'revdelete-show-no-access' => 'Er is een fout opgetreden tijdens het weergeven van het object van $1 om $2: dit object is gemarkeerd als "beschermd".
+'revdelete-show-no-access' => 'Er is een fout opgetreden bij het weergeven van het object van $1 om $2 uur: dit object is gemarkeerd als "beschermd".
 Je hebt geen toegang tot dit object.',
-'revdelete-modify-no-access' => 'Er is een fout opgetreden tijdens het wijzigen van het object van $1 om $2: dit object is gemarkeerd als "beschermd".
+'revdelete-modify-no-access' => 'Er is een fout opgetreden bij het wijzigen van het object van $1 om $2 uur: dit object is gemarkeerd als "beschermd".
 Je hebt geen toegang tot dit object.',
-'revdelete-only-restricted' => 'Er is een fout opgetreden tijdens het verbergen van het item van $1, $2: je kunt geen items onderdrukken uit het zicht van beheerders zonder ook een van de andere zichtbaarheidsopties te selecteren.',
+'revdelete-only-restricted' => 'Er is een fout opgetreden bij het verbergen van het item van $1, $2: je kunt geen items onderdrukken uit het zicht van beheerders zonder ook een van de andere zichtbaarheidsopties te selecteren.',
 
 # History merging
-'mergehistory-header' => 'Via deze pagina kan je versies van de geschiedenis van een bronpagina naar een nieuwere pagina samenvoegen.
+'mergehistory-header' => 'Via deze pagina kun je versies van de geschiedenis van een bronpagina naar een nieuwere pagina samenvoegen.
 Zorg dat deze wijziging de geschiedenisdoorlopendheid van de pagina behoudt.',
 
 # Search results
-'searchsubtitle' => 'Je hebt gezocht naar \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|pagina\'s die beginnen met "$1"]] {{int:pipe-separator}}[[Special:WhatLinksHere/$1|pagina\'s die verwijzen naar "$1"]])',
+'searchsubtitle' => 'Je zocht naar \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|pagina\'s die beginnen met "$1"]] {{int:pipe-separator}}[[Special:WhatLinksHere/$1|pagina\'s die verwijzen naar "$1"]])',
 'searchsubtitleinvalid' => "Je hebt gezocht naar '''$1'''",
 'search-suggest' => 'Bedoelde je: $1',
-'nonefound' => "'''Let op''': standaard worden niet alle naamruimten doorzocht.
-Als je in je zoekopdracht als voorvoegsel \"''all:''\" gebruikt, worden alle pagina's doorzocht (inclusief overlegpagina's, sjablonen, enzovoort).
+'nonefound' => "'''Opmerking''': standaard worden niet alle naamruimten doorzocht.
+Als je in uw zoekopdracht als voorvoegsel \"''all:''\" gebruikt worden alle pagina's doorzocht (inclusief overlegpagina's, sjablonen, enzovoort).
 Je kunt ook een naamruimte als voorvoegsel gebruiken.",
 'searchdisabled' => 'Zoeken in {{SITENAME}} is niet mogelijk.
 Je kunt gebruik maken van Google.
 De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
 
-# Quickbar
-'qbsettings-directionality' => 'Vast, afhankelijk van de schrijfrichting van jouw taal',
-
 # Preferences page
 'prefsnologintext' => 'Je moet <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} aangemeld]</span> zijn om je voorkeuren te kunnen instellen.',
 'prefs-help-watchlist-token' => 'Door hier een geheime sleutel in te vullen wordt een RSS-feed voor je volglijst aangemaakt.
@@ -336,16 +301,14 @@ Hier volgt een willekeurig gegenereerde waarde die je kunt gebruiken: $1',
 'savedprefs' => 'Je voorkeuren zijn opgeslagen.',
 'prefs-reset-intro' => 'Gebruik deze functie om je voorkeuren te herstellen naar de standaardinstellingen.
 Deze handeling kan niet ongedaan gemaakt worden.',
-'youremail' => 'E-mailadres:',
-'prefs-help-variant' => "Jouw voorkeursvariant of -spelling om de inhoudspagina's van deze wiki in weer te geven.",
+'youremail' => 'Je e-mailadres:',
 'prefs-help-signature' => 'Reacties op de overlegpagina\'s worden meestal ondertekend met "<nowiki>~~~~</nowiki>".
 De tildes worden omgezet in je ondertekening en een datum en tijd van de bewerking.',
-'badsiglength' => 'Je ondertekening is te lang.
-Deze moet minder dan $1 {{PLURAL:$1|teken|tekens}} bevatten.',
-'prefs-help-realname' => 'Echte naam is optioneel.
-Als je deze opgeeft, kan deze naam gebruikt worden om je erkenning te geven voor je werk.',
-'prefs-help-email' => 'E-mailadres is optioneel, maar maakt het mogelijk om jou je wachtwoord te e-mailen als je het bent vergeten.',
-'prefs-help-email-others' => 'Je kunt ook anderen in staat stellen per e-mail contact met je op te nemen via een koppeling op uw gebruikers- en overlegpagina zonder dat je je identiteit prijsgeeft.',
+'badsiglength' => 'Uw ondertekening is te lang.
+Deze moet minder dan $1 {{PLURAL:$1|karakters|karakters}} bevatten.',
+'prefs-help-realname' => 'Echte naam is optioneel, als je deze opgeeft kan deze naam gebruikt worden om je erkenning te geven voor uw werk.',
+'prefs-help-email' => 'E-mailadres is optioneel, maar maakt het mogelijk om je jouw wachtwoord te e-mailen als je het bent vergeten.
+Je kunt ook anderen in staat stellen per e-mail contact met je op te nemen via een verwijzing op je gebruikers- en overlegpagina zonder dat u uw identiteit prijsgeeft.',
 
 # User rights
 'userrights-groups-help' => 'Je kunt de groepen wijzigen waar deze gebruiker lid van is.
@@ -353,20 +316,20 @@ Als je deze opgeeft, kan deze naam gebruikt worden om je erkenning te geven voor
 * Een niet aangekruist vakje betekent dat de gebruiker geen lid is van de groep.
 * Een "*" betekent dat je een gebruiker niet uit een groep kunt verwijderen nadat je die hebt toegevoegd of vice versa.',
 'userrights-no-interwiki' => "Je hebt geen rechten om gebruikersrechten op andere wiki's te wijzigen.",
-'userrights-nologin' => 'Je moet [[Special:UserLogin|aangemeld]] zijn met een gebruiker met de juiste rechten om gebruikersrechten toe te wijzen.',
-'userrights-notallowed' => 'Je hebt geen rechten om gebruikersrechten toe te voegen of te verwijderen.',
+'userrights-nologin' => 'Je moet jezelf [[Special:UserLogin|aanmelden]] met een gebruiker met de juiste rechten om gebruikersrechten toe te wijzen.',
+'userrights-notallowed' => 'Je hebt geen rechten om gebruikersrechten toe te wijzen.',
 'userrights-changeable-col' => 'Groepen die je kunt beheren',
 'userrights-unchangeable-col' => 'Groepen die je niet kunt beheren',
 
 # Recent changes linked
-'recentchangeslinked-summary' => "Deze speciale pagina geeft de laatste bewerkingen weer op pagina's waarheen verwezen wordt vanaf een opgegeven pagina of op pagina's in een opgegeven categorie.
-Pagina's die op [[Special:Watchlist|uw volglijst]] staan worden '''vet''' weergegeven.",
+'recentchangeslinked-summary' => "Deze speciale pagina geeft de laatste bewerkingen weer op pagina's waarheen verwezen wordt vanaf een aangegeven pagina of vanuit pagina's in een aangegeven pagina een categorie.
+Pagina's die op [[Special:Watchlist|je volglijst]] staan worden '''vet''' weergegeven.",
 
 # Upload
 'uploadnologintext' => 'Je moet [[Special:UserLogin|aangemeld]] zijn om bestanden te uploaden.',
 'empty-file' => 'Het bestand dat je probeerde te uploaden had geen inhoud.',
 'file-too-large' => 'Het bestand dat je probeerde te uploaden was te groot.',
-'hookaborted' => 'De wijziging die je probeerde te maken is afgebroken door een uitbreiding.',
+'hookaborted' => 'De wijziging die je probeerde te maken is afgebroken door een uitbreidingshook.',
 'emptyfile' => 'Het bestand dat je hebt geüpload lijkt leeg te zijn.
 Dit zou kunnen komen door een typefout in de bestandsnaam.
 Ga na of je dit bestand werkelijk bedoelde te uploaden.',
@@ -374,9 +337,8 @@ Ga na of je dit bestand werkelijk bedoelde te uploaden.',
 Controleer <strong>[[:$1]]</strong> als je niet zeker weet of je het huidige bestand wilt overschrijven.
 [[$1|thumb]]',
 'filepageexists' => 'De beschrijvingspagina voor dit bestand bestaat al op <strong>[[:$1]]</strong>, maar er bestaat geen bestand met deze naam.
-De samenvatting die je hebt opgegeven verschijnt niet op de beschrijvingspagina.
-Bewerk de pagina handmatig om je beschrijving daar weer te geven.
-[[$1|miniatuur]]',
+De samenvatting die je hebt opgegeven zal niet op de beschrijvingspagina verschijnen.
+Bewerk de pagina handmatig om je beschrijving daar weer te geven. [[$1|miniatuur]]',
 'file-thumbnail-no' => "De bestandsnaam begint met <strong>$1</strong>.
 Het lijkt een verkleinde afbeelding te zijn ''(miniatuurafbeelding)''.
 Als je deze afbeelding in volledige resolutie hebt, upload die afbeelding dan.
@@ -384,7 +346,7 @@ Wijzig anders de bestandsnaam.",
 'fileexists-forbidden' => 'Er bestaat al een bestand met deze naam, en dat kan niet overschreven worden.
 Upload je bestand onder een andere naam.
 [[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'Er bestaat al een bestand met deze naam bij de gedeelde bestanden.
+'fileexists-shared-forbidden' => 'Er bestaat al een bestand met deze naam bij de gedeelte bestanden.
 Als je het bestand alsnog wilt uploaden, ga dan terug en kies een andere naam.
 [[File:$1|thumb|center|$1]]',
 'file-deleted-duplicate' => 'Een bestand dat identiek is aan dit bestand ([[:$1]]) is voorheen verwijderd.
@@ -401,12 +363,9 @@ $1',
 'upload-warning-msg' => 'Er was een probleem met je upload van [$2].
 Ga terug naar het [[Special:Upload/stash/$1|uploadformulier]] om dit probleem te verhelpen.',
 
-# Special:UploadStash
-'uploadstash-badtoken' => 'Het uitvoeren van de handeling is mislukt. Dit komt mogelijk doordat je bewerkingsreferenties zijn verlopen. Probeer het opnieuw.',
-
 # img_auth script messages
 'img-auth-nopathinfo' => 'PATH_INFO mist.
-Je server is niet ingesteld om deze gegevens door te geven.
+Je server is niet ingesteld om deze informatie door te geven.
 Misschien gebruikt deze CGI, en dan wordt img_auth niet ondersteund.
 Zie https://www.mediawiki.org/wiki/Manual:Image_Authorization voor meer informatie.',
 'img-auth-nologinnWL' => 'Je bent niet aangemeld en "$1" staat niet op de witte lijst.',
@@ -421,12 +380,7 @@ Je kunt het misschien proberen als het minder druk is.',
 'upload_source_file' => '(een bestand op je computer)',
 
 # File description page
-'sharedupload-desc-edit' => 'Dit bestand komt van $1 en kan ook in andere projecten gebruikt worden.
-Je kunt de [$2 pagina met de bestandsbeschrijving] daar bewerken.',
-'sharedupload-desc-create' => 'Dit bestand komt van $1 en kan ook in andere projecten gebruikt worden.
-Je kunt de beschrijving bewerken op de [$2 pagina met de bestandsbeschrijving].',
 'filepage-nofile-link' => 'Er bestaat geen bestand met deze naam, maar je kunt het [$1 uploaden].',
-'upload-disallowed-here' => 'Je kunt dit bestand niet overschrijven.',
 
 # File reversion
 'filerevert-intro' => "Je bent '''[[Media:$1|$1]]''' aan het terugdraaien tot de [$4 versie op $2, $3].",
@@ -436,7 +390,7 @@ Je kunt de beschrijving bewerken op de [$2 pagina met de bestandsbeschrijving].'
 'filedelete-intro-old' => "Je bent de versie van '''[[Media:$1|$1]]''' van [$4 $3, $2] aan het verwijderen.",
 
 # Miscellaneous special pages
-'notargettext' => 'Je hebt niet opgegeven voor welke pagina of gebruiker je deze handeling wilt uitvoeren.',
+'notargettext' => 'Je hebt niet opgegeven voor welke pagina of gebruiker u deze handeling wilt uitvoeren.',
 'nopagetext' => 'De pagina die je wilt hernoemen bestaat niet.',
 
 # Book sources
@@ -446,13 +400,9 @@ Je kunt de beschrijving bewerken op de [$2 pagina met de bestandsbeschrijving].'
 'alllogstext' => 'Dit is het gecombineerde logboek van {{SITENAME}}.
 Je kunt ook kiezen voor specifieke logboeken en filteren op gebruiker (hoofdlettergevoelig) en paginanaam (hoofdlettergevoelig).',
 
-# SpecialCachedPage
-'cachedspecial-viewing-cached-ttl' => 'Je bekijkt een cacheversie van deze pagina, die maximaal $1 oud is.',
-'cachedspecial-viewing-cached-ts' => 'Je bekijkt een cacheversie van deze pagina, die mogelijk niet volledig is bijgewerkt.',
-
-# Email user
+# E-mail user
 'mailnologintext' => 'Je moet [[Special:UserLogin|aangemeld]] zijn en een geldig e-mailadres in je [[Special:Preferences|voorkeuren]] vermelden om andere gebruikers te kunnen e-mailen.',
-'emailpagetext' => 'Via dit formulier kan je een e-mail aan {{GENDER:$1|deze gebruiker}} verzenden.
+'emailpagetext' => 'Via dit formulier kun je een e-mail aan deze gebruiker verzenden.
 Het e-mailadres dat je hebt opgegeven bij [[Special:Preferences|je voorkeuren]] wordt als afzender gebruikt.
 De ontvanger kan dus direct naar je reageren.',
 'usermaildisabledtext' => 'Je kunt geen e-mail verzenden naar andere gebruikers op deze wiki',
@@ -463,43 +413,39 @@ De ontvanger kan dus direct naar je reageren.',
 'nowatchlist' => 'Je volglijst is leeg.',
 'watchlistanontext' => 'Om je volglijst te bekijken of te bewerken moet je je $1.',
 'watchnologintext' => 'Je dient [[Special:UserLogin|aangemeld]] te zijn om je volglijst te bewerken.',
-'addedwatchtext' => 'De pagina "[[:$1]]" is toegevoegd aan je [[Special:Watchlist|volglijst]].
-Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden op daar weergegeven.',
+'addedwatchtext' => "De pagina \"[[:\$1]]\" is toegevoegd aan je [[Special:Watchlist|volglijst]].
+Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden op [[Special:Watchlist|je volglijst]] vermeld en worden '''vet''' weergegeven in de [[Special:RecentChanges|lijst van recente wijzigingen]].",
 'removedwatchtext' => 'De pagina "[[:$1]]" is van [[Special:Watchlist|je volglijst]] verwijderd.',
 'watchnochange' => "Geen van de pagina's op je volglijst is in deze periode bewerkt.",
 'watchlist-details' => "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op je volglijst, exclusief overlegpagina's.",
-'wlheader-showupdated' => "* Pagina's die zijn bewerkt sinds je laatste bezoek worden '''vet''' weergegeven",
-'watchlistcontains' => "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op je volglijst.",
-
-# Displayed when you click the "watch" button and it is in the process of watching
-'watcherrortext' => 'Er is een fout opgetreden tijdens het wijzigen van je volglijstinstellingen voor "$1".',
+'wlheader-showupdated' => "Pagina's die zijn bewerkt sinds je laatste bezoek worden '''vet''' weergegeven.",
+'watchlistcontains' => "Er {{PLURAL:$1|staat 1 pagina|staan $1 pagina's}} op je volglijst.",
 
 'enotif_lastvisited' => 'Zie $1 voor alle wijzigingen sinds je laatste bezoek.',
-'enotif_body' => 'Hoi $WATCHINGUSERNAME,
+'enotif_body' => 'Beste $WATCHINGUSERNAME,
 
-$PAGEINTRO $NEWPAGE
+De pagina $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED op $PAGEEDITDATE door $PAGEEDITOR, zie $PAGETITLE_URL voor de huidige versie.
+
+$NEWPAGE
 
 Samenvatting van de wijziging: $PAGESUMMARY $PAGEMINOREDIT
 
 Contactgegevens van de auteur:
-E-mailadres: $PAGEEDITOR_EMAIL
+E-mail: $PAGEEDITOR_EMAIL
 Wiki: $PAGEEDITOR_WIKI
 
-Tenzij je deze pagina bezoekt, komen er geen verdere berichten. Op je volglijst kan je voor alle gevolgde pagina\'s de waarschuwingsinstellingen opschonen.
+Tenzij je deze pagina bezoekt, komen er geen verdere berichten. Op je volglijst kun je voor alle gevolgde pagina\'s de waarschuwingsinstellingen opschonen.
 
-Groet van je {{SITENAME}}-waarschuwingssysteem.
+             Groet van je {{SITENAME}} waarschuwingssysteem.
 
 --
-Je kunt je e-mailinstellingen wijzigen op:
-{{canonicalurl:{{#special:Preferences}}}}
-
 Je kunt je volglijstinstellingen wijzigen op:
 {{canonicalurl:Special:Watchlist/edit}}
 
-Je kunt de pagina van je volglijst verwijderen via de volgende koppeling:
+Je kunt de pagina van uw volglijst verwijderen via de volgende verwijzing:
 $UNWATCHURL
 
-Terugkoppeling en verdere assistentie:
+Feedback en andere assistentie:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
@@ -524,62 +470,50 @@ Dit zijn de huidige instellingen voor de pagina '''$1''':",
 'undeletehistory' => 'Als je een pagina terugplaatst, worden alle versies hersteld.
 Als er al een nieuwe pagina met dezelfde naam is aangemaakt sinds de pagina is verwijderd, worden de eerder verwijderde versies teruggeplaatst en blijft de huidige versie intact.',
 'undeleterevision-missing' => 'Ongeldige of missende versie.
-Mogelijk heb je een verkeerde koppeling of is de versie hersteld of verwijderd uit het archief.',
-'undelete-show-file-confirm' => 'Weet je zeker dat je een verwijderde versie van het bestand "<nowiki>$1</nowiki>" van $2 om $3 wilt bekijken?',
+Mogelijk heb je een verkeerde verwijzing of is de versie hersteld of verwijderd uit het archief.',
+'undelete-show-file-confirm' => 'Weet je zeker dat je een verwijderde versie van het bestand "<nowiki>$1</nowiki>" van $2 om $3 wil bekijken?',
 
 # Block/unblock
-'ipb-blockingself' => 'Je staat op het punt jezelf te blokkeren. Weet je zeker dat je dat wilt doen?',
-'ipb-confirmhideuser' => 'Je staat op het punt een verborgen gebruiker te blokkeren. Hiervoor worden gebruikersnamen in alle lijsten en logboekregels verborgen. Weet je het zeker?',
 'ipb-needreblock' => '$1 is al geblokkeerd.
 Wil je de instellingen wijzigen?',
-'unblock-hideuser' => 'Je kunt deze gebruiker niet deblokkeeren, omdat de gebruikersnaam is verborgen.',
 'proxyblockreason' => 'Dit is een automatische preventieve blokkade, omdat je gebruik maakt van een open proxyserver.
-Neem contact op met je internetprovider of je helpdesk en stel die op de hoogte van dit ernstige beveiligingsprobleem.',
+Neem contact op met je Internet-provider of je helpdesk en stel die op de hoogte van dit ernstige beveiligingsprobleem.',
 'sorbsreason' => 'Je IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.',
 'sorbs_create_account_reason' => 'Je IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.
 Je kunt geen gebruiker registreren.',
 'cant-block-while-blocked' => 'Je kunt andere gebruikers niet blokkeren terwijl je zelf geblokkeerd bent.',
-'cant-see-hidden-user' => 'De gebruiker die je probeert te blokken is al geblokkeerd en verborgen.
-Omdat je het recht "hideuser" niet hebt, kun je de blokkade van de gebruiker niet bekijken of bewerken.',
+'cant-see-hidden-user' => "De gebruiker die je probeert te blokken is al geblokkeerd en verborgen.
+Omdat je het recht 'hideuser' niet hebt, kun je de blokkade van de gebruiker niet bekijken of bewerken.",
 'ipbblocked' => 'Je kunt geen andere gebruikers (de)blokkeren, omdat je zelf geblokkeerd bent',
 'ipbnounblockself' => 'Je mag jezelf niet deblokkeren',
 
 # Developer tools
 'lockdbtext' => "Waarschuwing: de database blokkeren heeft tot gevolg dat geen enkele gebruiker meer in staat is pagina's te bewerken, voorkeuren te wijzigen of iets anders te doen waarvoor wijzigingen in de database nodig zijn.
+
 Bevestig dat je deze handeling wilt uitvoeren en dat je de database vrijgeeft nadat het onderhoud is uitgevoerd.",
 'unlockdbtext' => "Na het vrijgeven van de database kunnen gebruikers weer pagina's bewerken, hun voorkeuren wijzigen of iets anders te doen waarvoor er wijzigingen in de database nodig zijn.
+
 Bevestig dat je deze handeling wil uitvoeren.",
 'locknoconfirm' => 'Je hebt je keuze niet bevestigd via het vinkvakje.',
 'lockdbsuccesstext' => 'De database is afgesloten.<br />
 Vergeet niet de [[Special:UnlockDB|database vrij te geven]] zodra je klaar bent met je onderhoud.',
 
 # Move page
-'movepagetext' => "Door middel van het onderstaande formulier kan je een pagina hernoemen.
+'movepagetext' => "Door middel van het onderstaande formulier kun je een pagina hernoemen.
 De geschiedenis gaat mee naar de nieuwe pagina.
 * De oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.
-* Koppelingen naar de oude pagina worden niet aangepast.
+* Verwijzingen naar de oude pagina worden niet aangepast.
 * De pagina's die doorverwijzen naar de oorspronkelijke paginanaam worden automatisch bijgewerkt.
-Als je dit niet wilt, controleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.
+Als je dit niet wenst, controleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.
 
 Een pagina kan '''alleen''' hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.
 
-'''Waarschuwing!'''
+'''WAARSCHUWING!'''
 Voor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.
 Zorg ervoor dat je die gevolgen overziet voordat je deze handeling uitvoert.",
-'movepagetext-noredirectfixer' => "Door middel van het onderstaande formulier kunt u een pagina en alle bijbehorende oude versies hernoemen.
-De oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.
-Controleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.
-
-Een pagina kan '''alleen''' hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.
-Je kunt dus een pagina die per ongeluk is hernoemd terug hernoemen en je kunt een bestaande pagina niet overschrijven. 
-
-'''Waarschuwing:''' voor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.
-Zorg ervoor dat je die gevolgen overziet voordat je deze handeling uitvoert.",
 'movepagetalktext' => "De bijbehorende overlegpagina krijgt automatisch een andere naam, '''tenzij''':
 * De overlegpagina onder de nieuwe naam al bestaat;
-* Je het onderstaande vinkje deselecteert.
-
-In die gevallen moet je de pagina handmatig hernoemen of samenvoegen.",
+* Je het onderstaande vinkje deselecteert.",
 'moveuserpage-warning' => "'''Waarschuwing:''' Je gaat een gebruikerspagina hernoemen.
 Houd er rekening mee dat alleen de pagina wordt hernoemd, ''niet'' de gebruiker.",
 'movenologintext' => 'Je moet [[Special:UserLogin|aangemeld]] zijn om een pagina te hernoemen.',
@@ -598,17 +532,14 @@ Dit exportbestand is daarna te importeren in een andere MediaWiki via de [[Speci
 
 Geef in het onderstaande veld de namen van de te exporteren pagina\'s op, één pagina per regel, en geef aan of je alle versies met de bewerkingssamenvatting of alleen de huidige versies met de bewerkingssamenvatting wilt exporteren.
 
-In het laatste geval kan je ook een koppeling gebruiken, bijvoorbeeld [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] voor de pagina "[[{{MediaWiki:Mainpage}}]]".',
+In het laatste geval kun je ook een verwijzing gebruiken, bijvoorbeeld [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] voor de pagina "[[{{MediaWiki:Mainpage}}]]".',
 
 # Namespace 8 related
 'allmessagestext' => 'Hieronder staan de systeemberichten uit de MediaWiki-naamruimte.
 Ga naar [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisatie] en [//translatewiki.net translatewiki.net] als je wilt bijdragen aan de algemene vertaling voor MediaWiki.',
 
 # Special:Import
-'importtext' => 'Gebruik de [[Special:Export|exportfunctie]] in de wiki waar de informatie vandaan komt.
-Sla de uitvoer op je eigen computer op, en voeg die daarna hier toe.',
-'import-error-edit' => 'De pagina "$1" is niet geïmporteerd omdat je niet de rechten hebt om die te bewerken.',
-'import-error-create' => 'De pagina "$1" is niet geïmporteerd omdat je niet de rechten hebt om die aan te maken.',
+'importtext' => 'Gebruik de [[Special:Export|exportfunctie]] in de wiki waar de informatie vandaan komt, sla de uitvoer op je eigen systeem op, en voeg die daarna hier toe.',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Jouw gebruikerspagina',
@@ -624,7 +555,6 @@ Gebruik de voorbeeldweergaveknop alvorens te bewaren.',
 Je kunt wel de broncode bekijken.',
 'tooltip-ca-nstab-special' => 'Dit is een speciale pagina, je kunt de pagina zelf niet bewerken',
 'tooltip-save' => 'Je wijzigingen opslaan',
-'tooltip-preview' => 'Een voorvertoning maken. Gebruik dit voordat je opslaat!',
 'tooltip-watch' => 'Deze pagina aan je volglijst toevoegen',
 
 # Metadata
@@ -632,7 +562,7 @@ Je kunt wel de broncode bekijken.',
 
 # Spam protection
 'spamprotectiontext' => 'De pagina die je wilde opslaan is geblokkeerd door het spamfilter.
-Meestal wordt dit door een externe koppeling op een zwarte lijst veroorzaakt.',
+Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 
 # Patrolling
 'markedaspatrollederror-noautopatrol' => 'Je kunt je eigen wijzigingen niet als gecontroleerd markeren.',
@@ -640,12 +570,12 @@ Meestal wordt dit door een externe koppeling op een zwarte lijst veroorzaakt.',
 # Media information
 'mediawarning' => "'''Waarschuwing''': dit bestandstype bevat mogelijk programmacode die je systeem schade kan berokkenen.",
 
-# Email address confirmation
-'confirmemail_noemail' => 'Je hebt geen geldig e-mailadres opgegeven in je [[Special:Preferences|gebruikersvoorkeuren]].',
+# E-mail address confirmation
+'confirmemail_noemail' => 'Je hebt geen geldig e-mailadres ingegeven in je [[Special:Preferences|gebruikersvoorkeuren]].',
 'confirmemail_text' => '{{SITENAME}} eist bevestiging van je e-mailadres voordat je de e-mailmogelijkheden kunt gebruiken.
 Klik op de onderstaande knop om een bevestigingsbericht te ontvangen.
-Dit bericht bevat een koppeling met een code.
-Open die koppeling om je e-mailadres te bevestigen.',
+Dit bericht bevat een verwijzing met een code.
+Open die verwijzing om je e-mailadres te bevestigen.',
 'confirmemail_pending' => 'Er is al een bevestigingsbericht aan je verzonden.
 Als je recentelijk je gebruiker hebt aangemaakt, wacht dan een paar minuten totdat die aankomt voordat je opnieuw een e-mail laat sturen.',
 'confirmemail_oncreate' => 'Er is een bevestigingscode naar je e-mailadres verzonden.
@@ -662,11 +592,11 @@ Je kunt jezelf nu [[Special:UserLogin|aanmelden]] en {{SITENAME}} gebruiken.',
 'confirmemail_body' => 'Iemand, waarschijnlijk jijzelf, met het IP-adres $1,
 heeft zich met dit e-mailadres geregistreerd als gebruiker "$2" op {{SITENAME}}.
 
-Open de volgende koppeling in je webbrowser om te bevestigen dat je deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} te activeren:
+Open de volgende verwijzing in je webbrowser om te bevestigen dat je deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} te activeren:
 
 $3
 
-Als je jezelf *niet* hebt aangemeld, volg dan de volgende koppeling om de bevestiging van je e-mailadres te annuleren:
+Als je jezelf *niet* hebt aangemeld, volg dan de volgende verwijzing om de bevestiging van je e-mailadres te annuleren:
 
 $5
 
@@ -674,23 +604,11 @@ De bevestigingscode vervalt op $4.',
 'confirmemail_body_changed' => 'Iemand, waarschijnlijk jijzelf, met het IP-adres $1,
 heeft het het e-mailadres geregistreerd voor gebruiker "$2" op {{SITENAME}} gewijzigd naar dit e-mailadres.
 
-Open de volgende koppeling in je webbrowser om te bevestigen dat je deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:
+Open de volgende verwijzing in je webbrowser om te bevestigen dat je deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:
 
 $3
 
-Als je jezelf *niet* hebt aangemeld, volg dan de volgende koppeling om de bevestiging van je e-mailadres te annuleren:
-
-$5
-
-De bevestigingscode vervalt op $4.',
-'confirmemail_body_set' => 'Iemand, waarschijnlijk jij, met het IP-adres $1,
-heeft het het e-mailadres voor gebruiker "$2" op {{SITENAME}} ingesteld op dit e-mailadres.
-
-Open de volgende koppeling in je webbrowser om te bevestigen dat jij deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:
-
-$3
-
-Als jij deze wijziging *niet* hebt gemaakt, volg dan de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:
+Als je jezelf *niet* hebt aangemeld, volg dan de volgende verwijzing om de bevestiging van je e-mailadres te annuleren:
 
 $5
 
@@ -701,12 +619,6 @@ De bevestigingscode vervalt op $4.',
 'confirmrecreate' => "Nadat je begonnen bent met je wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina verwijderd met opgave van de volgende reden:
 : ''$2''
 Bevestig dat je de pagina opnieuw wilt aanmaken.",
-'confirmrecreate-noreason' => 'Nadat je begonnen bent met je wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina verwijderd.
-Bevestig dat je de pagina opnieuw wilt aanmaken.',
-
-# action=watch/unwatch
-'confirm-watch-top' => 'Deze pagina toevoegen aan je volglijst?',
-'confirm-unwatch-top' => 'Deze pagina verwijderen uit je volglijst?',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'Je volglijst bevat {{PLURAL:$1|1 pagina|$1 pagina’s}}, zonder overlegpagina’s.',
@@ -714,13 +626,13 @@ Bevestig dat je de pagina opnieuw wilt aanmaken.',
 'watchlistedit-normal-explain' => 'Hieronder worden de pagina’s op je volglijst weergegeven.
 Klik op het vierkantje ernaast en daarna op "{{int:Watchlistedit-normal-submit}}" om een pagina te verwijderen.
 Je kunt ook de [[Special:EditWatchlist/raw|ruwe lijst bewerken]].',
-'watchlistedit-normal-done' => 'Er {{PLURAL:$1|is één pagina|zijn $1 pagina’s}} verwijderd van je volglijst:',
+'watchlistedit-normal-done' => 'Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina’s}} verwijderd van je volglijst:',
 'watchlistedit-raw-explain' => 'Hieronder staan pagina’s op je volglijst.
 Je kunt de lijst bewerken door pagina’s te verwijderen en toe te voegen.
 Eén pagina per regel.
 Als je klaar bent, klik dan op "{{int:Watchlistedit-raw-submit}}".
 Je kunt ook [[Special:EditWatchlist|het standaard bewerkingsscherm gebruiken]].',
-'watchlistedit-raw-done' => 'Je volglijst is bijgewerkt.',
+'watchlistedit-raw-done' => 'Jr volglijst is bijgewerkt.',
 
 # Special:Version
 'version-license-info' => 'MediaWiki is vrije software; je kunt MediaWiki verspreiden en/of aanpassen onder de voorwaarden van de GNU General Public License zoals gepubliceerd door de Free Software Foundation; ofwel versie 2 van de Licentie, of - zo je wilt - enige latere versie.
@@ -729,29 +641,10 @@ MediaWiki wordt verspreid in de hoop dat het nuttig is, maar ZONDER ENIGE GARANT
 
 Samen met dit programma hoor je een [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van de GNU General Public License] te hebben ontvangen; zo niet, schrijf dan naar de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA of [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lees de licentie online].',
 
-# Special:ComparePages
-'compare-title-not-exists' => 'De titel die je hebt opgegeven bestaat niet.',
-'compare-revision-not-exists' => 'De versie die je hebt opgegeven bestaat niet.',
-
 # Database error messages
 'dberr-usegoogle' => 'Wellicht kun je in de tussentijd zoeken via Google.',
 
 # HTML forms
 'htmlform-float-invalid' => 'De waarde die je hebt opgegeven is geen getal.',
 
-# Feedback
-'feedback-bugornote' => 'Als je zover bent om een technisch probleem in detail te beschrijven, [$1 rapporteer dan een bug].
-Anders kan je ook het eenvoudige formulier hieronder gebruiken.
-Je reactie wordt dan toegevoegd aan de pagina "[$3 $2]", samen met je gebruikersnaam en de browser die je gebruikt.',
-'feedback-thanks' => 'Bedankt! Je terugkoppeling is op de pagina "[$2 $1]" geplaatst.',
-
-# API errors
-'api-error-badaccess-groups' => 'Je mag geen bestanden uploaden in deze wiki.',
-'api-error-empty-file' => 'Het bestand dat je hebt geüpload is leeg.',
-'api-error-file-too-large' => 'Het bestand dat je hebt geüpload is te groot.',
-'api-error-hookaborted' => 'De wijziging die je probeert te maken is afgebroken door een uitbreiding.',
-'api-error-internal-error' => 'Interne fout: er is iets misgegaan tijdens het verwerken van je upload door de wiki.',
-'api-error-mustbeloggedin' => 'Je moet aangemeld zijn om bestanden te kunnen uploaden.',
-'api-error-unknown-error' => 'Interne fout: er is iets misgegaan tijdens het uploaden van je bestand.',
-
 );
diff --git a/languages/messages/MessagesNn.php b/languages/messages/MessagesNn.php
index 1a40c83d..f9ffcdac 100644
--- a/languages/messages/MessagesNn.php
+++ b/languages/messages/MessagesNn.php
@@ -144,7 +144,7 @@ $magicWords = array(
 	'img_framed'                => array( '1', 'ramme', 'ramma', 'framed', 'enframed', 'frame' ),
 	'img_frameless'             => array( '1', 'rammelaus', 'frameless' ),
 	'img_page'                  => array( '1', 'side=$1', 'side_$1', 'page=$1', 'page $1' ),
-	'img_link'                  => array( '1', 'lenkje=$1', 'lenkja=$1', 'link=$1' ),
+	'img_link'                  => array( '1', 'lenkje=$1', 'lenke=$1', 'link=$1' ),
 	'sitename'                  => array( '1', 'NETTSTADNAMN', 'SITENAME' ),
 	'ns'                        => array( '0', 'NR:', 'NS:' ),
 	'localurl'                  => array( '0', 'LOKALLENKJE:', 'LOKALLENKE:', 'LOCALURL:' ),
@@ -180,6 +180,7 @@ $magicWords = array(
 	'numberofadmins'            => array( '1', 'ADMINTAL', 'ADMINISTRATORTAL', 'NUMBEROFADMINS' ),
 	'formatnum'                 => array( '0', 'FORMATTAL', 'FORMATNUM' ),
 	'special'                   => array( '0', 'spesial', 'special' ),
+	'defaultsort'               => array( '1', 'STANDARDSORTERING', 'SORTERINGSNYKEL', 'SORTERINGSNØKKEL', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
 	'filepath'                  => array( '0', 'FILSTIG', 'FILEPATH:' ),
 	'tag'                       => array( '0', 'merke', 'tag' ),
 	'hiddencat'                 => array( '1', '__GØYMDKAT__', '__LØYNDKAT__', '__HIDDENCAT__' ),
@@ -214,15 +215,18 @@ $namespaceNames = array(
 );
 
 $specialPageAliases = array(
+	'Activeusers'               => array( 'Verksame_brukarar', 'Aktive_brukarar' ),
 	'Allmessages'               => array( 'Alle_systemmeldingar' ),
 	'Allpages'                  => array( 'Alle_sider' ),
 	'Ancientpages'              => array( 'Gamle_sider' ),
+	'Badtitle'                  => array( 'Dårleg_tittel' ),
 	'Blankpage'                 => array( 'Tom_side' ),
 	'Block'                     => array( 'Blokker' ),
 	'Blockme'                   => array( 'Blokker_meg' ),
 	'Booksources'               => array( 'Bokkjelder' ),
 	'BrokenRedirects'           => array( 'Blindvegsomdirigeringar' ),
 	'Categories'                => array( 'Kategoriar' ),
+	'ChangeEmail'               => array( 'Endra_e-post', 'Endre_e-post' ),
 	'ChangePassword'            => array( 'Nullstill_passord' ),
 	'Confirmemail'              => array( 'Stadfest_e-postadresse' ),
 	'Contributions'             => array( 'Bidrag' ),
@@ -231,6 +235,7 @@ $specialPageAliases = array(
 	'DeletedContributions'      => array( 'Sletta_brukarbidrag' ),
 	'Disambiguations'           => array( 'Fleirtydingssider' ),
 	'DoubleRedirects'           => array( 'Doble_omdirigeringar' ),
+	'EditWatchlist'             => array( 'Endra_overvakingsliste', 'Endre_overvakingsliste' ),
 	'Emailuser'                 => array( 'E-post' ),
 	'Export'                    => array( 'Eksport' ),
 	'Fewestrevisions'           => array( 'Færrast_endringar' ),
@@ -241,7 +246,7 @@ $specialPageAliases = array(
 	'BlockList'                 => array( 'Blokkeringsliste' ),
 	'LinkSearch'                => array( 'Lenkjesøk' ),
 	'Listadmins'                => array( 'Administratorliste', 'Administratorar' ),
-	'Listbots'                  => array( 'Bottliste', 'Bottar' ),
+	'Listbots'                  => array( 'Bottliste', 'Bottar', 'Robotliste', 'Robotar' ),
 	'Listfiles'                 => array( 'Filliste' ),
 	'Listgrouprights'           => array( 'Grupperettar' ),
 	'Listredirects'             => array( 'Omdirigeringsliste' ),
@@ -254,7 +259,7 @@ $specialPageAliases = array(
 	'MIMEsearch'                => array( 'MIME-søk' ),
 	'Mostcategories'            => array( 'Flest_kategoriar' ),
 	'Mostimages'                => array( 'Mest_brukte_filer' ),
-	'Mostlinked'                => array( 'Mest_lenka_sider' ),
+	'Mostlinked'                => array( 'Mest_lenka_sider', 'Mest_lenkja_sider' ),
 	'Mostlinkedcategories'      => array( 'Mest_brukte_kategoriar' ),
 	'Mostlinkedtemplates'       => array( 'Mest_brukte_malar' ),
 	'Mostrevisions'             => array( 'Flest_endringar' ),
@@ -265,7 +270,7 @@ $specialPageAliases = array(
 	'Myuploads'                 => array( 'Opplastingane_mine' ),
 	'Newimages'                 => array( 'Nye_filer' ),
 	'Newpages'                  => array( 'Nye_sider' ),
-	'PermanentLink'             => array( 'Permanent_lenkje' ),
+	'PermanentLink'             => array( 'Permanent_lenkje', 'Permanent_lenke' ),
 	'Popularpages'              => array( 'Populære_sider' ),
 	'Preferences'               => array( 'Innstillingar' ),
 	'Prefixindex'               => array( 'Prefiksindeks' ),
@@ -273,12 +278,12 @@ $specialPageAliases = array(
 	'Protectedtitles'           => array( 'Verna_sidenamn' ),
 	'Randompage'                => array( 'Tilfeldig_side' ),
 	'Randomredirect'            => array( 'Tilfeldig_omdirigering' ),
-	'Recentchanges'             => array( 'Siste_endringar' ),
+	'Recentchanges'             => array( 'Siste_endringar', 'Siste_endringane' ),
 	'Recentchangeslinked'       => array( 'Relaterte_endringar' ),
 	'Revisiondelete'            => array( 'Versjonssletting' ),
 	'Search'                    => array( 'Søk' ),
-	'Shortpages'                => array( 'Korte_sider' ),
-	'Specialpages'              => array( 'Spesialsider' ),
+	'Shortpages'                => array( 'Korte_sider', 'Stutte_sider' ),
+	'Specialpages'              => array( 'Spesialsider', 'Særsider' ),
 	'Statistics'                => array( 'Statistikk' ),
 	'Tags'                      => array( 'Merke' ),
 	'Uncategorizedcategories'   => array( 'Ukategoriserte_kategoriar' ),
@@ -342,10 +347,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Vis kor mange som overvakar sida',
 'tog-oldsig' => 'Noverande signatur:',
 'tog-fancysig' => 'Handsam signaturar som wikitekst (utan automatisk lenking)',
-'tog-externaleditor' => 'Bruk eit eksternt handsamingsprogram som standard (berre for vidarekomne, krev eit spesielt oppsett på maskina di. [//www.mediawiki.org/wiki/Manual:External_editors Meir informasjon.])',
-'tog-externaldiff' => 'Bruk eit eksternt skilnadprogram som standard (berre for vidarekomne, krev eit spesielt oppsett på maskina di.
-[//www.mediawiki.org/wiki/Manual:External_editors Meir informasjon.])',
-'tog-showjumplinks' => 'Slå på «gå til»-lenkjer',
 'tog-uselivepreview' => 'Bruk levande førehandsvising (eksperimentelt JavaScript)',
 'tog-forceeditsummary' => 'Spør meg når eg ikkje har skrive noko i endringssamandraget',
 'tog-watchlisthideown' => 'Gøym endringane mine i overvakingslista',
@@ -359,6 +360,8 @@ $messages = array(
 'tog-showhiddencats' => 'Vis gøymde kategoriar',
 'tog-noconvertlink' => 'Slå av konvertering av sidetitlar',
 'tog-norollbackdiff' => 'Ikkje vis skilnad etter attenderulling',
+'tog-useeditwarning' => 'Gje ei åtvaring om eg går ut av ei redigeringsside og ikkje alle endringar er lagra',
+'tog-prefershttps' => 'Alltid bruk ei trygg kopling når du er innlogga',
 
 'underline-always' => 'Alltid',
 'underline-never' => 'Aldri',
@@ -422,6 +425,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'des',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. mars',
+'april-date' => '$1. april',
+'may-date' => '$1. mai',
+'june-date' => '$1. juni',
+'july-date' => '$1. juli',
+'august-date' => '$1. august',
+'september-date' => '$1. september',
+'october-date' => '$1. oktober',
+'november-date' => '$1. november',
+'december-date' => '$1. desember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriar}}',
@@ -442,7 +457,7 @@ $messages = array(
 'noindex-category' => 'Ikkje-indekserte sider',
 'broken-file-category' => 'Sider med brotne fillenkjer',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Om',
 'article' => 'Innhaldsside',
@@ -505,6 +520,7 @@ $messages = array(
 'create-this-page' => 'Opprett sida',
 'delete' => 'Slett',
 'deletethispage' => 'Slett denne sida',
+'undeletethispage' => 'Attopprett sida',
 'undelete_short' => 'Attopprett {{PLURAL:$1|éin versjon|$1 versjonar}}',
 'viewdeleted_short' => 'Vis {{PLURAL:$1|éin sletta versjon|$1 sletta versjonar}}',
 'protect' => 'Vern',
@@ -548,7 +564,7 @@ $1',
 'pool-queuefull' => 'Køen er full.',
 'pool-errorunknown' => 'Ukjend feil',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Om {{SITENAME}}',
 'aboutpage' => 'Project:Om',
 'copyright' => 'Innhaldet er utgjeve under $1.',
@@ -558,7 +574,6 @@ $1',
 'disclaimers' => 'Atterhald',
 'disclaimerpage' => 'Project:Atterhald',
 'edithelp' => 'Endringshjelp',
-'edithelppage' => 'Help:Endring',
 'helppage' => 'Help:Innhald',
 'mainpage' => 'Hovudside',
 'mainpage-description' => 'Hovudside',
@@ -633,10 +648,6 @@ Dette kan òg skuldast ein feil i programvara som er nytta av {{SITENAME}}.',
 # General errors
 'error' => 'Feil',
 'databaseerror' => 'Databasefeil',
-'dberrortext' => 'Det oppstod ein syntaksfeil i ein databaseførespurnad. Dette kan tyda på feil i programvara. Siste førespurnaden til databasen var: <blockquote><code>$1</code></blockquote> frå funksjonen «<code>$2</code>». Databasen returnerte feilen «<samp>$3: $4</samp>».',
-'dberrortextcl' => 'Det oppstod ein syntaksfeil i databaseførespurnaden.
-Den sist prøvde førespurnaden var: «$1» frå funksjonen «$2».
-Databasen returnerte feilen «$3: $4».',
 'laggedslavemode' => 'Åtvaring: Det er mogleg at sida ikkje er heilt oppdatert.',
 'readonly' => 'Databasen er skriveverna',
 'enterlockreason' => 'Skriv ein grunn for vernet, inkludert eit overslag for kva tid det vil bli oppheva',
@@ -688,12 +699,15 @@ For å leggja til eller endra omsetjingar for alle wikiar, gjer vel å nytta [//
 'editinginterface' => "'''Åtvaring:''' Du endrar på ei side som inneheld tekst nytta av brukargrensesnittet for programvara.
 Endringar på denne sida påverkar utsjånaden til brukargrensesnittet for dei andre brukarane av wikien.
 For å leggja til eller endra omsetjingar, gjer vel å nytta [//translatewiki.net/wiki/Main_Page?setlang=nn translatewiki.net], prosjektet for lokalisering av MediaWiki.",
-'sqlhidden' => '(SQL-førespurnaden er gøymd)',
 'cascadeprotected' => 'Denne sida er verna mot endring fordi ho er inkludert i {{PLURAL:$1|den opplista sida|dei opplista sidene}} som har djupvern slått på:
 $2',
 'namespaceprotected' => "Du har ikkje tilgang til å endre sidene i '''$1'''-namnerommet.",
 'customcssprotected' => '↓Du har ikkje tilgang til å endre denne sida, fordi ho inneheld ein annan brukar sine personlege innstillingar.',
 'customjsprotected' => '↓Du har ikkje tilgang til å endra denne JavaScript-sida fordi ho inneheld ein annen brukar sine personlege innstillingar.',
+'mycustomcssprotected' => 'Du har ikkje løyve til å endra denne CSS-sida.',
+'mycustomjsprotected' => 'Du har ikkje løyve til å endra denne JavaScript-sida.',
+'myprivateinfoprotected' => 'Du har ikkje løyve til endra den private informasjonen din.',
+'mypreferencesprotected' => 'Du har ikkje løyve til å endra innstillingane dine.',
 'ns-specialprotected' => 'Sider i {{ns:special}}-namnerommet kan ikkje endrast.',
 'titleprotected' => "Denne sidetittelen er verna mot oppretting av [[User:$1|$1]].
 Grunnen som er gjeven er: ''$2''.",
@@ -719,10 +733,19 @@ Ver merksam på at nokre sider framleis kan visast fram som om du er innlogga fr
 'welcomecreation-msg' => 'Brukarkontoen din er oppretta.
 Gløym ikkje å endra [[Special:Preferences|innstillingane dine for {{SITENAME}}]].',
 'yourname' => 'Brukarnamn:',
+'userlogin-yourname' => 'Brukarnamn',
+'userlogin-yourname-ph' => 'Skriv inn brukarnamnet ditt',
+'createacct-another-username-ph' => 'Skriv inn brukarnamnet',
 'yourpassword' => 'Passord:',
+'userlogin-yourpassword' => 'Passord',
+'userlogin-yourpassword-ph' => 'Skriv inn passordet ditt',
+'createacct-yourpassword-ph' => 'Skriv inn eit passord',
 'yourpasswordagain' => 'Skriv opp att passordet',
+'createacct-yourpasswordagain' => 'Stadfest passord',
+'createacct-yourpasswordagain-ph' => 'Skriv inn passordet på nytt',
 'remembermypassword' => 'Hugs innlogginga mi på denne datamaskinen (høgst {{PLURAL:$1|éin dag|$1 dagar}})',
-'securelogin-stick-https' => 'Fortset HTTPS-tilkopling etter innlogging.',
+'userlogin-remembermypassword' => 'Hald meg innlogga',
+'userlogin-signwithsecure' => 'Nytt trygg kopling',
 'yourdomainname' => 'Domenet ditt',
 'password-change-forbidden' => 'Du kan ikkje endra passord på denne wikien.',
 'externaldberror' => 'Det var anten ein ekstern databasefeil i tilgjengekontrollen, eller du har ikkje løyve til å oppdatere den eksterne kontoen din.',
@@ -734,17 +757,40 @@ Gløym ikkje å endra [[Special:Preferences|innstillingane dine for {{SITENAME}}
 'logout' => 'Logg ut',
 'userlogout' => 'Logg ut',
 'notloggedin' => 'Ikkje innlogga',
+'userlogin-noaccount' => 'Har du ingen konto?',
+'userlogin-joinproject' => 'Vert med på {{SITENAME}}',
 'nologin' => 'Har du ingen brukarkonto? $1.',
 'nologinlink' => 'Registrer deg',
 'createaccount' => 'Opprett ny konto',
 'gotaccount' => "Har du ein brukarkonto? '''$1'''.",
 'gotaccountlink' => 'Logg inn',
 'userlogin-resetlink' => 'Har du gløymd påloggingsopplysingane dine?',
+'userlogin-resetpassword-link' => 'Attendestill passordet ditt',
+'helplogin-url' => 'Help:Innlogging',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjelp med innlogging]]',
+'createacct-join' => 'Skriv inn informasjonen din under.',
+'createacct-another-join' => 'Skriv inn informasjonen til den nye kontoen under',
+'createacct-emailrequired' => 'E-postadresse:',
+'createacct-emailoptional' => 'E-postadresse (valfritt)',
+'createacct-email-ph' => 'Skriv inn e-postadressa di',
+'createacct-another-email-ph' => 'Skriv inn e-postadresse',
 'createaccountmail' => 'Bruk eit mellombels tilfeldig passord og send det til e-postadressa som er oppgjeven under',
+'createacct-realname' => 'Sant namn (valfritt)',
 'createaccountreason' => 'Årsak:',
+'createacct-reason' => 'Årsak',
+'createacct-reason-ph' => 'Kvifor du lagar ein ny konto',
+'createacct-captcha' => 'Tryggingssjekk',
+'createacct-imgcaptcha-ph' => 'Skriv inn teksten du ser over',
+'createacct-submit' => 'Opprett kontoen din',
+'createacct-another-submit' => 'Opprett ein konto til',
+'createacct-benefit-heading' => '{{SITENAME}} er laga av folk som deg.',
+'createacct-benefit-body1' => '{{PLURAL:$1|éi endring|$1 endringar}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|éi side|$1 sider}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nyleg bidragsytar|nylege bidragsytarar}}',
 'badretype' => 'Passorda du skreiv inn er ikkje like.',
 'userexists' => 'Brukarnamnet er alt i bruk. Vel eit anna brukarnamn.',
 'loginerror' => 'Innloggingsfeil',
+'createacct-error' => 'Kontoopprettingsfeil',
 'createaccounterror' => 'Kunne ikkje oppretta kontoen:  $1',
 'nocookiesnew' => 'Brukarkontoen vart oppretta, men du er ikkje innlogga. {{SITENAME}} bruker informasjonskapslar for å logge inn brukarar,
 nettlesaren din er innstilt for ikkje å godta desse. Etter at du har endra innstillingane slik at nettlesaren godtek informasjonskapslar, kan du logge inn med det nye brukarnamnet og passordet ditt.',
@@ -814,7 +860,7 @@ Du kan sjå bort frå denne meldinga dersom kontoen vart oppretta med eit uhell.
 'newpassword' => 'Nytt passord',
 'retypenew' => 'Nytt passord om att',
 'resetpass_submit' => 'Oppgje passord og logg inn',
-'resetpass_success' => 'Passordet ditt er no nullstilt! Loggar inn...',
+'changepassword-success' => 'Passordet ditt er no nullstilt! Loggar inn...',
 'resetpass_forbidden' => 'Passord kan ikkje endrast',
 'resetpass-no-info' => 'Du må vera innlogga for å få direktetilgang til denne sida.',
 'resetpass-submit-loggedin' => 'Endra passord',
@@ -826,10 +872,10 @@ Du kan allereie ha byta passordet, eller ha bede om å få eit nytt mellombels p
 
 # Special:PasswordReset
 'passwordreset' => 'Attendestilling av passord',
-'passwordreset-text' => 'Fyll ut dette skjemaet for å attendestilla passordet ditt.',
+'passwordreset-text-one' => 'Fyll ut dette skjemaet for å attendestilla passordet ditt.',
 'passwordreset-legend' => '↓Nullstill passordet',
 'passwordreset-disabled' => '↓Tilbakestilling av passord er ikkje aktivert på denne wikien',
-'passwordreset-pretext' => '↓{{PLURAL:$1||Tast inn ein av datadelane nedanfor}}',
+'passwordreset-emaildisabled' => 'E-postfunksjonen er slegen av på wikien.',
 'passwordreset-username' => 'Brukarnamn:',
 'passwordreset-domain' => 'Domene:',
 'passwordreset-capture' => 'Vis resulterande epost',
@@ -1052,11 +1098,14 @@ Sletteloggen for sida finn du her:",
 Det ser ut til at ho er sletta.',
 'edit-conflict' => 'Endringskonflikt.',
 'edit-no-change' => 'Redigeringa di vart ignorert fordi det ikkje vart gjort endringar i teksten.',
+'postedit-confirmation' => 'Endringa di vart lagra.',
 'edit-already-exists' => 'Kunne ikkje opprette ny side fordi ho alt eksisterer.',
 'defaultmessagetext' => 'Standard meldingstekst',
 'content-failed-to-parse' => 'Klarte ikkje å tolke innhaldet «$2» for innhaldsmodellen «$1»: $3',
 'invalid-content-data' => 'Ugyldig innhald',
 'content-not-allowed-here' => 'Innhaldsmodellen «$1» er ikkje tillaten på sida [[$2]]',
+'editwarning-warning' => 'Ved å forlata denne sida kan du mista alle endringane du måtte ha gjort.
+Er du innlogga kan denne åtvaringa slåast av under bolken «Endring» i innstillingane dine.',
 
 # Content models
 'content-model-wikitext' => 'WikiTekst',
@@ -1266,6 +1315,7 @@ Pass på at den nye sida også har innhald frå den innfletta sida.',
 'compareselectedversions' => 'Samanlikn valde versjonar',
 'showhideselectedversions' => 'Vis/løyn valde versjonar',
 'editundo' => 'angre',
+'diff-empty' => '(Ingen skilnad)',
 'diff-multi' => '({{PLURAL:$1|Éin mellomversjon|$1 mellomversjonar}} frå {{PLURAL:$2|éin brukar|$2 brukarar}} er ikkje {{PLURAL:$1|vist|viste}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ein mellomversjon|$1 mellomversjonar}} av meir enn $2 {{PLURAL:$2|brukar|brukarar}}  er ikkje {{PLURAL:$1|vist|viste}})',
 'difference-missing-revision' => '{{PLURAL:$2|Éin versjon|$2 versjonar}} av skilnaden ($1) vart ikkje {{PLURAL:$2|funnen|funne}}.
@@ -1293,7 +1343,6 @@ Detaljar kan ein finna i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'searchmenu-legend' => 'Søkjeval',
 'searchmenu-exists' => "* Sida '''[[$1]]'''",
 'searchmenu-new' => "'''Opprett sida «[[:$1|$1]]» på denne wikien.'''",
-'searchhelp-url' => 'Help:Innhald',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sjå gjennom alle sider med denne forstavinga]]',
 'searchprofile-articles' => 'Innhaldssider',
 'searchprofile-project' => 'Hjelp- og prosjektsider',
@@ -1337,15 +1386,7 @@ For å søkja i alle, bruk prefikset ''all:'' (det inkluderer diskusjonssider, m
 'searchdisabled' => 'Søkjefunksjonen på {{SITENAME}} er slått av akkurat no.
 I mellomtida kan du søkje gjennom Google.
 Ver merksam på at registra deira kan vera utdaterte.',
-
-# Quickbar
-'qbsettings' => 'Snøggmeny',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Venstre',
-'qbsettings-fixedright' => 'Høgre',
-'qbsettings-floatingleft' => 'Flytande venstre',
-'qbsettings-floatingright' => 'Flytande høgre',
-'qbsettings-directionality' => 'Fast, avhengig av kva retning språket ditt vert lese',
+'search-error' => 'Det oppstod ein feil under søket: $1',
 
 # Preferences page
 'preferences' => 'Innstillingar',
@@ -1379,7 +1420,6 @@ Ver merksam på at registra deira kan vera utdaterte.',
 'resetprefs' => 'Rull attende',
 'restoreprefs' => 'Hent attende alle standardinnstillingane',
 'prefs-editing' => 'Endring',
-'prefs-edit-boxsize' => 'Storleiken på redigeringsvindauget.',
 'rows' => 'Rekkjer',
 'columns' => 'Kolonnar',
 'searchresultshead' => 'Søk',
@@ -1390,9 +1430,6 @@ Ver merksam på at registra deira kan vera utdaterte.',
 'recentchangesdays-max' => '(høgst $1 {{PLURAL:$1|dag|dagar}})',
 'recentchangescount' => 'Tal på endringar som viser som standard:',
 'prefs-help-recentchangescount' => 'Dette inkluderer nylege endringar, sidehistorikk og loggar.',
-'prefs-help-watchlist-token' => 'Om du fyller ut dette feltet med eit hemmeleg tal, vil det opprettast ei RSS opplisting for overvakingslista di.
-Alle som veit det rette talet vil vera i stand til å lesa overvakingslista di, så vél gjerne ein trygg verdi.
-Her er det framlegg til eit tal som kan nyttast, tilfelleleg henta fram: $1',
 'savedprefs' => 'Brukarinnstillingane er lagra.',
 'timezonelegend' => 'Tidssone:',
 'localtime' => 'Lokaltid:',
@@ -1423,7 +1460,6 @@ Her er det framlegg til eit tal som kan nyttast, tilfelleleg henta fram: $1',
 'prefs-reset-intro' => 'Du kan nytta denne sida til å tilbakestilla innstillingane dine til standardinnstillingane.
 Dette kan ikkje tilbakestillast.',
 'prefs-emailconfirm-label' => 'Stadfesting av e-post:',
-'prefs-textboxsize' => 'Storleiken til redigeringsvindauga',
 'youremail' => 'E-post:',
 'username' => '{{GENDER:$1|Brukarnamn}}:',
 'uid' => '{{GENDER:$1|Brukar-ID}}:',
@@ -1455,6 +1491,8 @@ Denne informasjonen vil vera offentleg.',
 'prefs-dateformat' => 'Datoformat',
 'prefs-timeoffset' => 'Tidforskuving',
 'prefs-advancedediting' => 'Ålmenne val',
+'prefs-editor' => 'Teksthandsamar',
+'prefs-preview' => 'Førehandsvising',
 'prefs-advancedrc' => 'Avanserte val',
 'prefs-advancedrendering' => 'Avanserte val',
 'prefs-advancedsearchoptions' => 'Avanserte val',
@@ -1559,6 +1597,10 @@ Denne informasjonen vil vera offentleg.',
 'right-editusercssjs' => 'Endre andre brukarar sine CSS- og JS-filer',
 'right-editusercss' => 'Endre andre brukarar sine CSS-filer',
 'right-edituserjs' => 'Endre andre brukarar sine JS-filer',
+'right-editmyusercss' => 'Endra eigne CSS-filer',
+'right-editmyuserjs' => 'Endra eigne JavaScript-filer',
+'right-viewmywatchlist' => 'Sjå eiga overvakingsliste',
+'right-editmywatchlist' => 'Endra eiga overvakingsliste. Merk at somme handlingane framleis vil leggja til sider utan denne retten.',
 'right-rollback' => 'Snøgt rulla attende endringane til den siste brukaren som endra ei viss side',
 'right-markbotedits' => 'Markere tilbakerullingar som robotendringar',
 'right-noratelimit' => 'Vert ikkje påverka av snøggleiksgrenser',
@@ -1620,12 +1662,15 @@ Denne informasjonen vil vera offentleg.',
 'action-userrights-interwiki' => 'endre brukarrettar for brukarar på andre wikiar',
 'action-siteadmin' => 'låse eller låse opp databasen',
 'action-sendemail' => 'senda e-postar',
+'action-editmywatchlist' => 'endra overvakingslista di',
+'action-viewmywatchlist' => 'sjå overvakingslista di',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|Éi endring|$1 endringar}}',
 'recentchanges' => 'Siste endringar',
 'recentchanges-legend' => 'Alternativ for siste endringar',
 'recentchanges-summary' => 'På denne sida ser du dei sist endra sidene i {{SITENAME}}.',
+'recentchanges-noresult' => 'Ingen endringar i den gjevne perioden passar med kriteria.',
 'recentchanges-feed-description' => 'Fylg med på dei siste endringane på denne wikien med dette abonnementet.',
 'recentchanges-label-newpage' => 'Endringa oppretta ei ny side',
 'recentchanges-label-minor' => 'Endringa er småplukk',
@@ -1662,7 +1707,6 @@ Denne informasjonen vil vera offentleg.',
 'recentchangeslinked-feed' => 'Relaterte endringar',
 'recentchangeslinked-toolbox' => 'Relaterte endringar',
 'recentchangeslinked-title' => 'Endringar relaterte til «$1»',
-'recentchangeslinked-noresult' => 'Det er ikkje gjort endringar på sidene som var lenkja hit i den oppgjevne perioden.',
 'recentchangeslinked-summary' => "Dette er ei liste over nylege endringar som er gjorde på sider som vert lenkja til frå ei oppgjeven side (eller på medlemer av ein oppgjeven kategori). Sider på [[Special:Watchlist|overvakingslista di]] er '''utheva'''.",
 'recentchangeslinked-page' => 'Sidenamn:',
 'recentchangeslinked-to' => 'Vis endringar på sider som lenkjer til den gitte sida i staden',
@@ -1673,7 +1717,7 @@ Denne informasjonen vil vera offentleg.',
 'reuploaddesc' => 'Attende til opplastingsskjemaet.',
 'upload-tryagain' => 'Send inn endra filskildring',
 'uploadnologin' => 'Ikkje innlogga',
-'uploadnologintext' => 'Du lyt vera [[Special:UserLogin|innlogga]] for å kunna laste opp filer.',
+'uploadnologintext' => 'Du lyt $1 for å kunna laste opp filer.',
 'upload_directory_missing' => 'Opplastingsmappa ($1) manglar og kunne ikkje opprettast av tenaren.',
 'upload_directory_read_only' => 'Opplastingsmappa ($1) er skriveverna.',
 'uploaderror' => 'Feil under opplasting av fil',
@@ -1894,7 +1938,6 @@ For best tryggleik, er img_auth.php sett ut av funksjon.',
 'http-read-error' => 'HTTP-lesefeil.',
 'http-timed-out' => 'Tidsavbrot på HTTP-førespurnad.',
 'http-curl-error' => 'Feil under henting av nettadressa: $1',
-'http-host-unreachable' => 'Kunne ikkje nå nettadressa',
 'http-bad-status' => 'Det var eit problem under HTTP-førespurnaden: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2042,12 +2085,6 @@ Du vil kan henda endra skildringa på [$2 filskildringssida] hennar der.',
 'statistics-users-active-desc' => 'Brukarar som har utført handlingar {{PLURAL:$1|i dag|dei siste $1 dagane}}',
 'statistics-mostpopular' => 'Mest viste sider',
 
-'disambiguations' => 'Sider som lenkjer til fleirtydingssider',
-'disambiguationspage' => 'Template:Fleirtyding',
-'disambiguations-text' => "Dei fylgjande sidene inneheld minst éi lenkje til ei '''fleirtydingsside'''.
-Dei bør kan henda lenkja til ei meir passande side i staden.<br />
-Ei side vert handsama som ei fleirtydingsside om ho nyttar ein mal som er lenkja til frå [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Sider med ein sideeigenskap',
 'pageswithprop-legend' => 'Sider med ein sideeigenskap',
 'pageswithprop-text' => 'Denne sida listar opp sider som nyttar ein viss sideeigenskap.',
@@ -2295,10 +2332,9 @@ E-postadressa du har sett i [[Special:Preferences|innstillingane dine]] vil dukk
 'unwatchthispage' => 'Fjern overvaking',
 'notanarticle' => 'Ikkje innhaldsside',
 'notvisiblerev' => 'Sideversjonen er sletta',
-'watchnochange' => 'Ingen av sidene i overvakingslista er endra i den valde perioden.',
 'watchlist-details' => '{{PLURAL:$1|Éi side|$1 sider}} er overvaka, utanom diskusjonssider.',
-'wlheader-enotif' => '* Funksjonen for endringsmeldingar per e-post er på.',
-'wlheader-showupdated' => "* Sider som har vorte endra sidan du sist såg på dei er '''utheva'''",
+'wlheader-enotif' => 'Funksjonen for endringsmeldingar per e-post er på.',
+'wlheader-showupdated' => "Sider som har vorte endra sidan du sist såg på dei er '''utheva'''",
 'watchmethod-recent' => 'sjekkar siste endringar for dei overvaka sidene',
 'watchmethod-list' => 'sjekkar om dei overvaka sidene har blitt endra i det siste',
 'watchlistcontains' => 'Overvakingslista di inneheld {{PLURAL:$1|éi side|$1 sider}}.',
@@ -2685,13 +2721,11 @@ IP-adresser som blir automatisk blokkerte er ikkje lista her. Sjå [[Special:Blo
 'ipb_blocked_as_range' => 'Feil: IP-en $1 er ikkje direkte blokkert og kan ikkje opphevast. Adressa er blokkert som ein del av blokkeringa av IP-intervallet $2. Denne blokkeringa kan opphevast.',
 'ip_range_invalid' => 'Ugyldig IP-adresseserie.',
 'ip_range_toolarge' => 'Blokkering av IP-seriar større enn /$1 er ikkje tillate.',
-'blockme' => 'Blokker meg',
 'proxyblocker' => 'Proxy-blokkerar',
-'proxyblocker-disabled' => 'Denne funksjonen er slått av.',
 'proxyblockreason' => 'Du er blokkert frå å endre fordi IP-adressa di tilhøyrer ein open mellomtenar (proxy). Du bør kontakte internettleverandøren din eller kundesørvis og gje dei beskjed, ettersom dette er eit alvorleg sikkerheitsproblem.',
-'proxyblocksuccess' => 'Utført.',
 'sorbsreason' => 'IP-adressa di er lista som ein open mellomtenar i DNSBL.',
 'sorbs_create_account_reason' => 'IP-adressa di er lista som ein open mellomtenar i DNSBL, og difor får du ikkje registrert deg.',
+'xffblockreason' => 'Ei IP-adresse i X-Forwarded-For-tittelen, anten di eller den som høyrer til ein proksytenar du nyttar, er blokkert. Den opphavlege blokkeringsgrunnen var: $1',
 'cant-block-while-blocked' => 'Du kan ikkje blokkere andre medan du sjølv er blokkert.',
 'cant-see-hidden-user' => 'Brukaren du prøver å blokkera har allereie vorte blokkert og skjult. Sidan du ikkje har rett til å skjula brukarar, kan du ikkje sjå eller endra blokkeringa til brukaren.',
 'ipbblocked' => 'Du kan ikkje blokkera eller avblokkera andre brukarar sidan du sjølv er blokkert',
@@ -2992,26 +3026,15 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 
 # Stylesheets
 'common.css' => '/* CSS plassert i denne fila vil gjelde for alle utsjånader. */',
-'standard.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Standard */',
-'nostalgia.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Nostalgia */',
 'cologneblue.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Kølnerblå */',
 'monobook.css' => '/* CSS-tekst som vert plassert her, endrar utsjånaden til sidedrakta Monobook */',
-'myskin.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta MySkin */',
-'chick.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Chick */',
-'simple.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Simple */',
 'modern.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Modern */',
 'print.css' => '/* CSS i denne fila vil påverke utskriftsversjonen */',
-'handheld.css' => '/* CSS i denne fila vil gjelde alle handheldte innretnigar konfigurert i $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Javascript i denne fila vil gjelde for alle drakter. */',
-'standard.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Standard */',
-'nostalgia.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Nostalgia */',
 'cologneblue.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Kølnerblå */',
 'monobook.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Monobook */',
-'myskin.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta MySkin */',
-'chick.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta Chick */',
-'simple.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta Simple */',
 'modern.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta Modern */',
 
 # Metadata
@@ -3085,13 +3108,8 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'pageinfo-category-files' => 'Tal filer',
 
 # Skin names
-'skinname-standard' => 'Klassisk',
-'skinname-nostalgia' => 'Nostalgi',
 'skinname-cologneblue' => 'Kölnerblå',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MiDrakt',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Enkel',
 'skinname-modern' => 'Moderne',
 
 # Patrolling
@@ -3168,11 +3186,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minutt|$1 minutt}}',
 'hours' => '{{PLURAL:$1|$1 time|$1 timar}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dagar}}',
+'weeks' => '{{PLURAL:$1|$1 veke|$1 veker}}',
 'months' => '{{PLURAL:$1|éin månad|$1 månader}}',
 'years' => '{{PLURAL:$1|éitt år|$1 år}}',
 'ago' => '$1 sidan',
 'just-now' => 'akkurat no',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|time|timar}} sidan',
+'minutes-ago' => '$1 {{PLURAL:$1|minutt}} sidan',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund}} sidan',
+'monday-at' => 'Måndag kl. $1',
+'tuesday-at' => 'Tysdag kl. $1',
+'wednesday-at' => 'Onsdag kl. $1',
+'thursday-at' => 'Torsdag kl. $1',
+'friday-at' => 'Fredag kl. $1',
+'saturday-at' => 'Laurdag kl. $1',
+'sunday-at' => 'Sundag kl. $1',
+'yesterday-at' => 'I går kl. $1',
+
 # Bad image list
 'bad_image_list' => 'Formatet er slik:
 
@@ -3202,7 +3234,7 @@ Andre er gøymde som standard.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breidd',
 'exif-imagelength' => 'Høgd',
 'exif-bitspersample' => 'Bitar per komponent',
@@ -3380,7 +3412,7 @@ Andre er gøymde som standard.
 'exif-originalimageheight' => 'Høgda på biletet før det vart beskåren',
 'exif-originalimagewidth' => 'Bredda på biletet før det vart beskåren',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ukomprimert',
 'exif-compression-2' => 'CCITT Gruppe 3 1-dimensjonal modifisert Huffman-kjøyrelengdekoding',
 'exif-compression-3' => 'CCITT Gruppe 3 faks-koding',
@@ -3767,7 +3799,6 @@ Du kan òg [[Special:EditWatchlist|nytte standardverktøyet]].',
 'version-other' => 'Anna',
 'version-mediahandlers' => 'Mediahandsamarar',
 'version-hooks' => 'Tilleggsuttrykk',
-'version-extension-functions' => 'Utvidingsfunksjonar',
 'version-parser-extensiontags' => 'Parserutvidingsmerke',
 'version-parser-function-hooks' => 'Parserfunksjonstillegg',
 'version-hook-name' => 'Namn på tillegg',
@@ -3776,6 +3807,7 @@ Du kan òg [[Special:EditWatchlist|nytte standardverktøyet]].',
 'version-license' => 'Lisens',
 'version-poweredby-credits' => "Denne wikien er driven av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'andre',
+'version-poweredby-translators' => 'translatewiki.net-omsetjarar',
 'version-credits-summary' => 'Me ynskjer godskriva desse personane for tilskotet deira til [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki er fri programvare; du kan redistribuera det og/eller modifisera det under krava i GNU General Public License som publisert av Free Software Foundation; anten versjon 2 av lisensen, eller (om du ynskjer det) ein kvar seinare versjon.
 
@@ -3789,12 +3821,17 @@ Du skal ha motteke [{{SERVER}}{{SCRIPTPATH}}/COPYING ein kopi av GNU General Pub
 'version-entrypoints-header-entrypoint' => 'Inngangspunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Filsti',
-'filepath-page' => 'Fil:',
-'filepath-submit' => 'Gå',
-'filepath-summary' => 'Denne spesialsida svarar med den fullstendige stigen til ei fil.
-Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei tilknytte programma sine.',
+# Special:Redirect
+'redirect' => 'Omdiriger etter filnamn, brukar- eller versjons-ID',
+'redirect-legend' => 'Omdiriger til ei fil eller ei side',
+'redirect-summary' => 'Denne spesialsida omdirigerer til ei fil (med eit filnamn), ei side (med ein versjons-ID) eller ei brukarside (med eit brukartal).',
+'redirect-submit' => 'Gå',
+'redirect-lookup' => 'Sjå etter:',
+'redirect-value' => 'Verdi',
+'redirect-user' => 'Brukar-ID',
+'redirect-revision' => 'Sideversjon',
+'redirect-file' => 'Filnamn',
+'redirect-not-exists' => 'Fann ikkje verdi',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Søk etter duplikatfiler',
@@ -3843,12 +3880,16 @@ Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei t
 'tags' => 'Gyldige endringsmerke',
 'tag-filter' => '[[Special:Tags|Merke]]filter:',
 'tag-filter-submit' => 'Filtrer',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Merke}}]]: $2)',
 'tags-title' => 'Merke',
 'tags-intro' => 'Denne sida listar opp merka som programvara kan merkja ei endring med, og kva desse tyder.',
 'tags-tag' => 'Merkenamn',
 'tags-display-header' => 'Utsjånad på endringslister',
 'tags-description-header' => 'Tyding',
+'tags-active-header' => 'Verksamt?',
 'tags-hitcount-header' => 'Merkte endringar',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nei',
 'tags-edit' => 'endra',
 'tags-hitcount' => '{{PLURAL:$1|éi endring|$1 endringar}}',
 
@@ -3884,6 +3925,9 @@ Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei t
 'htmlform-submit' => 'Lagre',
 'htmlform-reset' => 'Gjer om endringar',
 'htmlform-selectorother-other' => 'Andre',
+'htmlform-no' => 'Nei',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Vel ein',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 med støtte for fulltekstsøk',
@@ -4001,4 +4045,16 @@ Om ikkje kan du nytta det enkle skjemaet under. Merknaden din vert lagd til på
 # Image rotation
 'rotate-comment' => 'Biletet vart dreitt $1{{PLURAL:$1|°}} med klokka',
 
+# Limit report
+'limitreport-title' => 'Profildata for analysatoren:',
+'limitreport-cputime' => 'CPU-tidsbruk',
+'limitreport-cputime-value' => '{{PLURAL:$1|eitt sekund|$1 sekund}}',
+'limitreport-walltime-value' => '{{PLURAL:$1|eitt sekund|$1 sekund}}',
+'limitreport-ppvisitednodes' => 'Tal på knutepunktsvitjingar av førhandsamar',
+'limitreport-postexpandincludesize-value' => '$1/$2 byte',
+'limitreport-templateargumentsize' => 'Storleik på malargument',
+'limitreport-templateargumentsize-value' => '$1/$2 byte',
+'limitreport-expansiondepth' => 'Største utvidingsdjupna',
+'limitreport-expensivefunctioncount' => 'Tal på dyre analysefunksjonar',
+
 );
diff --git a/languages/messages/MessagesNov.php b/languages/messages/MessagesNov.php
index b00d31cf..bfee3ab4 100644
--- a/languages/messages/MessagesNov.php
+++ b/languages/messages/MessagesNov.php
@@ -429,7 +429,7 @@ Si vu voli plu tardim ekarta li pagine fro vun observa-liste, klikta \"Desobserv
 'ilsubmit' => 'Sercha',
 'bydate' => 'segun date',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larjeso',
 'exif-imagelength' => 'Alteso',
 'exif-imagedescription' => 'Title de imaje',
diff --git a/languages/messages/MessagesNso.php b/languages/messages/MessagesNso.php
index eed1ac13..99cea760 100644
--- a/languages/messages/MessagesNso.php
+++ b/languages/messages/MessagesNso.php
@@ -66,7 +66,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Bonagatša email atrese go temošo tša poso',
 'tog-shownumberswatching' => 'Laetša palo bašomiši bao ba tlhapetšego',
 'tog-fancysig' => 'Tsaeno ya gose fihliwe',
-'tog-externaleditor' => 'Šomiša sengwadi sa kantle (bašumiši bao banalego botsibi fela.  [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-forceeditsummary' => 'Ntaetše ge kesa tsenye mongwalo go kakaretšo ya dithetogo',
 'tog-watchlisthideown' => 'Fihla diphetogo tšeo di direlego ke nna go lenano la ditlhapetšo.',
 'tog-watchlisthideminor' => 'Fihla diphetogo tše nyenyane tšeo di direlego ke nna go lenano la ditlhapetšo',
@@ -226,7 +225,7 @@ $messages = array(
 'jumptosearch' => 'fetleka',
 'pool-errorunknown' => 'Phošo yago setsebege',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Mabapi le {{SITENAME}}',
 'aboutpage' => 'Project:Mabapi',
 'copyright' => 'Mateng a hwetšagala tlase ga $1.',
@@ -236,7 +235,6 @@ $messages = array(
 'disclaimers' => 'Hlapa-matsogo',
 'disclaimerpage' => 'Project:Hlapa-Matsogo',
 'edithelp' => 'Thušo ya go fetola',
-'edithelppage' => 'Help:Fetola',
 'helppage' => 'Help:Mateng',
 'mainpage' => 'Letlakala la Pele',
 'mainpage-description' => 'Letlakala la Pele',
@@ -385,7 +383,7 @@ Ga wa dumelwa go tlhoma tše dingwe.',
 'oldpassword' => 'Ditlhaka-tša-siphiri tša kgale:',
 'newpassword' => 'Ditlhaka-tša-siphiri tše mpsha:',
 'retypenew' => 'Tlanya ditlhaka tše mphsa tša siphiri gape:',
-'resetpass_success' => 'Ditlhaka tša siphiri di fetotšwe ka katlego! Bjale o kgona go tsena...',
+'changepassword-success' => 'Ditlhaka tša siphiri di fetotšwe ka katlego! Bjale o kgona go tsena...',
 
 # Edit page toolbar
 'bold_sample' => "Mongwalo wa '''Bold'''",
@@ -563,7 +561,6 @@ fetola tshenolo',
 'viewprevnext' => 'Lebelela ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Go ena le letlaka la leina la \"[[:\$1]]\" go wiki ye.'''",
 'searchmenu-new' => "'''Hlola letlakala \"[[:\$1]]\" go wiki ye!'''",
-'searchhelp-url' => 'Help:Mateng',
 'searchprofile-articles' => 'Matlakala a diteng',
 'searchprofile-project' => 'Thušo le matlaka a diprojeke',
 'searchprofile-images' => 'Diphatlalatši tša "multi"',
@@ -692,7 +689,6 @@ Ga re fane ka e-poso ya gago go bašumiši ba bangwe ge ba polela le wena ka yon
 'recentchangeslinked-feed' => 'Diphetogo tša go tswalana',
 'recentchangeslinked-toolbox' => 'Diphetogo tša go tswalana',
 'recentchangeslinked-title' => 'Diphetogo tša go tswalana le "$1"',
-'recentchangeslinked-noresult' => 'Gago na diphetogo go matlakala a hlomaganya ka sebaka/sekga seo o se kgethilego.',
 'recentchangeslinked-summary' => "Letlakala le le laetša diphetogo tša bjale matlakaleng a go hlomaganya.
 Matlakala ago ba [[Special:Watchlist|lenanong la gago la matlakala ditlhapetšo]]  a '''ngwadilwe ka bogolo'''.",
 'recentchangeslinked-page' => 'Leina la letlakala:',
@@ -780,9 +776,6 @@ Matlakala ago ba [[Special:Watchlist|lenanong la gago la matlakala ditlhapetšo]
 'statistics' => 'Dipalopalo',
 'statistics-header-users' => 'Dipalopalo tša mošomiši',
 
-'disambiguations' => "Matlakala a ''Disambiguation''",
-'disambiguationspage' => 'Template:"disambig"',
-
 'doubleredirects' => "Di''redirect'' goya go ''redirect''",
 
 'brokenredirects' => "''redirect'' tša go robega",
@@ -1035,7 +1028,6 @@ Seemo sa go lota ga letlakala '''$1''':",
 'unblocklogentry' => 'Gago thibelo $1',
 'block-log-flags-nocreate' => 'Go hloma tšhupaleloko gago dumelege',
 'block-log-flags-noemail' => 'e-mail e thibilwe',
-'proxyblocksuccess' => 'Phetilwe.',
 
 # Move page
 'move-page-legend' => 'Huduša letlakala',
@@ -1209,7 +1201,7 @@ letlakala la seswantšho ge tafola ya metadata e bulwa. Tše dingwe tša di ''fi
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Bophara',
 'exif-imagelength' => 'Botelele',
 'exif-artist' => 'Mongwadi',
diff --git a/languages/messages/MessagesNv.php b/languages/messages/MessagesNv.php
index 0c3f0405..5a17c910 100644
--- a/languages/messages/MessagesNv.php
+++ b/languages/messages/MessagesNv.php
@@ -279,7 +279,7 @@ $3',
 # Special:LinkSearch
 'linksearch' => 'linksígíí tłʼóoʼdi siʼánígíí',
 
-# Email user
+# E-mail user
 'emailuser' => 'E-mail bichʼįʼ áshłééh nisin',
 
 # Watchlist
diff --git a/languages/messages/MessagesNy.php b/languages/messages/MessagesNy.php
index 866851c6..7f1793e3 100644
--- a/languages/messages/MessagesNy.php
+++ b/languages/messages/MessagesNy.php
@@ -11,16 +11,16 @@
  */
 
 $messages = array(
-'help' => 'Chithandizo',
-'search' => 'Fufuzani',
-'searchbutton' => 'Fufuzani',
+'help'          => 'Chithandizo',
+'search'        => 'Fufuzani',
+'searchbutton'  => 'Fufuzani',
 'searcharticle' => 'Pitani',
-'toolbox' => 'zida',
+'toolbox'       => 'zida',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'mainpage' => 'Tsamba Lalikulu',
+'mainpage'             => 'Tsamba Lalikulu',
 'mainpage-description' => 'Tsamba Lalikulu',
-'portal' => 'Tsamba la anthu wonse',
+'portal'               => 'Tsamba la anthu wonse',
 
 'youhavenewmessagesmulti' => 'Muli ndi mauthenga atsopano ku $1',
 
diff --git a/languages/messages/MessagesOc.php b/languages/messages/MessagesOc.php
index 6cdef6c4..34503b09 100644
--- a/languages/messages/MessagesOc.php
+++ b/languages/messages/MessagesOc.php
@@ -14,6 +14,7 @@
  * @author Jfblanc
  * @author Kaganer
  * @author McDutchie
+ * @author Nemo bis
  * @author Spacebirdy
  * @author Горан Анђелковић
  * @author לערי ריינהארט
@@ -321,9 +322,6 @@ $messages = array(
 'tog-shownumberswatching' => "Afichar lo nombre d'utilizaires que seguisson aquesta pagina",
 'tog-oldsig' => 'Apercebut de la signatura existenta :',
 'tog-fancysig' => 'Tractar la signatura coma de wikitèxte (sens ligam automatic)',
-'tog-externaleditor' => 'Utilizar un editor extèrne per defaut (pels utilizaires avançats, necessita una configuracion especiala sus vòstre ordinator)',
-'tog-externaldiff' => "Utilizar un comparador extèrne per defaut (pels utilizaires avançats, necessita una configuracion especiala sus vòstre ordenador, [//www.mediawiki.org/wiki/Manual:External_editors/fr mai d'informacions]).",
-'tog-showjumplinks' => 'Activar los ligams « navigacion » e « recèrca » en naut de pagina (aparéncias Myskin e autres)',
 'tog-uselivepreview' => 'Utilizar l’apercebut rapid (experimental)',
 'tog-forceeditsummary' => "M'avertir quand ai pas completat lo contengut de la bóstia de comentaris",
 'tog-watchlisthideown' => 'Amagar mas pròprias modificacions dins la lista de seguiment',
@@ -337,6 +335,8 @@ $messages = array(
 'tog-showhiddencats' => 'Afichar las categorias amagadas',
 'tog-noconvertlink' => 'Desactivar la conversion dels títols',
 'tog-norollbackdiff' => 'Ometre lo diff aprèp l’utilizacion d’un revert',
+'tog-useeditwarning' => 'M’avisar quand quiti una pagina de modificacion sens publicar los cambiaments',
+'tog-prefershttps' => 'Utilizar totjorn una connexion securizada en essent connectat',
 
 'underline-always' => 'Totjorn',
 'underline-never' => 'Pas jamai',
@@ -400,6 +400,18 @@ $messages = array(
 'oct' => "d'oct",
 'nov' => 'de nov',
 'dec' => 'de dec',
+'january-date' => '$1 genièr',
+'february-date' => '$1 febrièr',
+'march-date' => '$1 març',
+'april-date' => '$1 abril',
+'may-date' => '$1 mai',
+'june-date' => '$1 junh',
+'july-date' => '$1 julhet',
+'august-date' => '$1 agost',
+'september-date' => '$1 setembre',
+'october-date' => '$1 octobre',
+'november-date' => '$1 novembre',
+'december-date' => '$1 decembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
@@ -481,6 +493,7 @@ $messages = array(
 'create-this-page' => 'Crear aquesta pagina',
 'delete' => 'Suprimir',
 'deletethispage' => 'Suprimir aquesta pagina',
+'undeletethispage' => "Anullar la supression d'aquesta pagina",
 'undelete_short' => 'Restablir {{PLURAL:$1|1 modificacion| $1 modificacions}}',
 'viewdeleted_short' => 'Veire {{PLURAL:$1|una edicion escafada|$1 edicions escafadas}}',
 'protect' => 'Protegir',
@@ -524,7 +537,7 @@ $1",
 'pool-queuefull' => 'La fila de trabalh es plena',
 'pool-errorunknown' => 'Error desconeguda',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'A prepaus de {{SITENAME}}',
 'aboutpage' => 'Project:A prepaus',
 'copyright' => 'Lo contengut es disponible segon los tèrmes de la licéncia $1.',
@@ -534,7 +547,6 @@ $1",
 'disclaimers' => 'Avertiments',
 'disclaimerpage' => 'Project:Avertiments generals',
 'edithelp' => 'Ajuda',
-'edithelppage' => 'Help:Cossí modificar una pagina',
 'helppage' => 'Help:Acuèlh',
 'mainpage' => 'Acuèlh',
 'mainpage-description' => 'Acuèlh',
@@ -611,17 +623,9 @@ Una lista de las paginas especialas pòt èsser trobada sus [[Special:SpecialPag
 # General errors
 'error' => 'Error',
 'databaseerror' => 'Error de la banca de donadas',
-'dberrortext' => "Una error de sintaxi de la requèsta dins la banca de donadas s'es producha.
-Aquò pòt indicar una error dins lo logicial.
-La darrièra requèsta tractada per la banca de donadas èra :
-<blockquote><tt>$1</tt></blockquote>
-dempuèi la foncion « <tt>$2</tt> ».
-La banca de donadas a renviat l’error « <tt>$3 : $4</tt> ».",
-'dberrortextcl' => 'Una requèsta dins la banca de donadas compòrta una error de sintaxi.
-La darrièra requèsta emesa èra :
-« $1 »
-dins la foncion « $2 ».
-La banca de donadas a renviat l’error « $3 : $4 ».',
+'databaseerror-query' => 'Requèsta : $1',
+'databaseerror-function' => 'Foncion : $1',
+'databaseerror-error' => 'Error : $1',
 'laggedslavemode' => 'Atencion : Aquesta pagina pòt conténer pas totes los darrièrs cambiaments efectuats.',
 'readonly' => 'Mesas a jorn blocadas sus la banca de donadas',
 'enterlockreason' => 'Indicatz la rason del blocatge, e mai una estimacion de sa durada',
@@ -655,6 +659,7 @@ Benlèu la supression ja es estada efectuada per qualqu’un mai.',
 'cannotdelete-title' => 'Impossible de suprimir la pagina "$1"',
 'delete-hook-aborted' => "Supression anullada per una extension.
 Cap d'explicacion es pas estada provesida.",
+'no-null-revision' => 'Impossible de crear una novèla revision voida per la pagina « $1 »',
 'badtitle' => 'Títol marrit',
 'badtitletext' => 'Lo títol de la pagina demandada es invalid, void o s’agís d’un títol interlenga o interprojècte mal ligat. Benlèu conten un o maites caractèrs que pòdon pas èsser utilizats dins los títols.',
 'perfcached' => "Las donadas seguendas son en escondedor e benlèu, son pas a jorn. Un maximum de {{PLURAL:$1|un resultat|$1 resultats}} es disponible dins l'escondedor.",
@@ -673,12 +678,15 @@ Requèsta : $2',
 'protectedinterface' => 'Aquesta pagina provesís de tèxte d’interfàcia pel logicial susaqueste wiki, e es protegida per evitar los abuses.
 Per apondre o modificar de traduccions sus totes los wikis, utilizatz [//translatewiki.net/ translatewiki.net], lo projècte de localizacion de MediaWiki.',
 'editinginterface' => "'''Atencion :''' sètz a mand de modificar una pagina utilizada per crear lo tèxte de l’interfàcia del logicial. Los cambiaments sus aquesta pagina se repercutaràn sus l'aparéncia de l'interfàcia d'utilizaire pels autres utilizaires d'aqueste wiki. Per apondre o modificar de traduccions per totes los wikis, utilizatz [//translatewiki.net/translatewiki.net], lo projècte MediaWiki d'internacionalizacion dels messatges .",
-'sqlhidden' => '(Requèsta SQL amagada)',
 'cascadeprotected' => "Aquesta pagina es actualament protegida perque es inclusa dins {{PLURAL:$1|la pagina seguenta|las paginas seguentas}}, {{PLURAL:$1|qu'es estada protegida|que son estadas protegidas}} amb l’opcion « proteccion en cascada » activada :
 $2",
 'namespaceprotected' => "Avètz pas la permission de modificar las paginas de l’espaci de noms « '''$1''' ».",
 'customcssprotected' => "Avètz pas la permission d'editar aquesta pagina CSS perque conten de preferéncias d’autres utilizaires.",
 'customjsprotected' => "Avètz pas la permission d'editar aquesta pagina JavaScript perque conten de preferéncias d’autres utilizaires.",
+'mycustomcssprotected' => 'Avètz pas lo drech de modificar aquesta pagina CSS.',
+'mycustomjsprotected' => 'Avètz pas lo drech de modificar aquesta pagina JavaScript.',
+'myprivateinfoprotected' => 'Avètz pas los dreches per modificar vòstras informacions personalas.',
+'mypreferencesprotected' => 'Avètz pas los dreches per modificar vòstras preferéncias.',
 'ns-specialprotected' => 'Las paginas dins l’espaci de noms « {{ns:special}} » pòdon pas èsser modificadas',
 'titleprotected' => "Aqueste títol es estat protegit a la creacion per [[User:$1|$1]].
 Lo motiu avançat es « ''$2'' ».",
@@ -703,10 +711,19 @@ Notatz que d'unas paginas pòdon èsser encara afichadas coma s'eratz encara con
 'welcomecreation-msg' => "Vòstre compte d'utilizaire es estat creat.
 Doblidetz pas de modificar [[Special:Preferences|vòstras preferéncias per {{SITENAME}}]].",
 'yourname' => "Nom d'utilizaire :",
+'userlogin-yourname' => "Nom d'utilizaire",
+'userlogin-yourname-ph' => "Picatz vòstre nom d'utilizaire",
+'createacct-another-username-ph' => "Picar lo nom d'utilizaire",
 'yourpassword' => 'Vòstre senhal :',
+'userlogin-yourpassword' => 'Senhal',
+'userlogin-yourpassword-ph' => 'Picatz vòstre senhal',
+'createacct-yourpassword-ph' => 'Picatz un senhal',
 'yourpasswordagain' => 'Confirmar lo senhal :',
+'createacct-yourpasswordagain' => 'Confirmatz lo senhal',
+'createacct-yourpasswordagain-ph' => 'Entratz lo senhal tornarmai',
 'remembermypassword' => 'Me reconnectar automaticament a las visitas venentas (al maximum $1 {{PLURAL:$1|jorn|jorns}})',
-'securelogin-stick-https' => 'Demorar connectat en HTTPS aprèp la connexion',
+'userlogin-remembermypassword' => 'Gardar ma sesilha activa',
+'userlogin-signwithsecure' => 'Utilizar una connexion securizada',
 'yourdomainname' => 'Vòstre domeni',
 'password-change-forbidden' => 'Podètz pas modificar los senhals sus aqueste wiki.',
 'externaldberror' => 'Siá una error s’es producha amb la banca de donadas d’autentificacion extèrna, siá sètz pas autorizat a metre a jorn vòstre compte extèrne.',
@@ -718,18 +735,41 @@ Doblidetz pas de modificar [[Special:Preferences|vòstras preferéncias per {{SI
 'logout' => 'Se desconnectar',
 'userlogout' => 'Desconnexion',
 'notloggedin' => 'Vos sètz pas identificat(ada)',
+'userlogin-noaccount' => 'Avètz pas de compte ?',
+'userlogin-joinproject' => 'Rejonhètz {{SITENAME}}',
 'nologin' => "Avètz pas un compte ? '''$1'''.",
 'nologinlink' => 'Creatz un compte',
 'createaccount' => 'Crear un compte novèl',
 'gotaccount' => "Ja avètz un compte ? '''$1'''.",
 'gotaccountlink' => 'Identificatz-vos',
 'userlogin-resetlink' => 'Avètz doblidat vòstres detalhs de connexion ?',
+'userlogin-resetpassword-link' => 'Reïnicializar lo senhal',
+'helplogin-url' => 'Help:Connexion',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda a la connexion]]',
+'createacct-join' => 'Entratz vòstras informacions çaijós.',
+'createacct-another-join' => 'Picar las informacions del novèl compte çaijós.',
+'createacct-emailrequired' => 'Adreça electronica',
+'createacct-emailoptional' => 'Adreça de corrièr electronic (facultativa)',
+'createacct-email-ph' => 'Entratz vòstra adreça de corrièr electronic',
+'createacct-another-email-ph' => "Picar l'adreça de corrièr electronic",
 'createaccountmail' => 'Utilizar un senhal aleatòri temporari e lo mandar a l’adreça de corrièl especificada',
+'createacct-realname' => 'Nom vertadièr (facultatiu)',
 'createaccountreason' => 'Motiu :',
+'createacct-reason' => 'Motiu',
+'createacct-reason-ph' => 'Perqué creatz un autre compte',
+'createacct-captcha' => 'Contraròtle de seguretat',
+'createacct-imgcaptcha-ph' => 'Entratz lo tèxte que vesètz çaisús',
+'createacct-submit' => 'Creatz vòstre compte',
+'createacct-another-submit' => 'Crear un autre compte',
+'createacct-benefit-heading' => '{{SITENAME}} es escrich per de monde coma vos.',
+'createacct-benefit-body1' => '{{PLURAL:$1|cambiament|cambiaments}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pagina|paginas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributor recent|contributors recents}}',
 'badretype' => "Los senhals qu'avètz picats son pas identics.",
 'userexists' => "Lo nom d'utilizaire qu'avètz picat ja es utilizat.
 Causissètz-ne un autre.",
 'loginerror' => "Error d'identificacion",
+'createacct-error' => 'Error al moment de la creacion del compte',
 'createaccounterror' => 'Impossible de crear lo compte : $1',
 'nocookiesnew' => "Lo compte d'utilizaire es estat creat, mas sètz pas connectat. {{SITENAME}} utiliza de cookies per la connexion mas los avètz desactivats. Activatz-los e reconnectatz-vos amb lo meteis nom e lo meteis senhal.",
 'nocookieslogin' => '{{SITENAME}} utiliza de cookies per la connexion mas avètz los cookies desactivats. Activatz-los e reconnectatz-vos.',
@@ -786,11 +826,13 @@ Picatz una adreça plan formatada o daissatz aqueste camp void.",
 
 Ignoratz aqueste messatge se aqueste compte es estat creat per error.",
 'usernamehasherror' => "Lo nom d'utilizaire pòt pas conténer de caractèrs de hachage",
-'login-throttled' => 'Avètz ensajat tròp de temptativas de connexion darrièrament.
-Esperatz abans d’ensajar tornamai.',
+'login-throttled' => 'Avètz ensajat un tròp grand nombre de connexions darrièrament.
+Esperatz $1 abans d’ensajar tornarmai.',
 'login-abort-generic' => 'Vòstra temptativa de connexion a fracassat',
 'loginlanguagelabel' => 'Lenga: $1',
 'suspicious-userlogout' => 'Vòstra demanda de desconnexion es estada refusada perque sembla qu’es estada mandada per un navigador copat o la mesa en escondedor d’un proxy.',
+'createacct-another-realname-tip' => 'Lo nom vertadièr es opcional.
+Se decidissètz de lo provesir, serà utilizat per atribuir a l’utilizaire sos trabalhs.',
 
 # Email sending
 'php-mail-error-unknown' => 'Error desconeguda dins la foncion mail() de PHP.',
@@ -806,8 +848,7 @@ Esperatz abans d’ensajar tornamai.',
 'newpassword' => 'Senhal novèl :',
 'retypenew' => 'Confirmar lo senhal novèl :',
 'resetpass_submit' => 'Cambiar lo senhal e s’enregistrar',
-'resetpass_success' => 'Vòstre senhal es estat modificat corrèctament  !
-Ara, anatz èsser connectat…',
+'changepassword-success' => 'Vòstre senhal es estat cambiat amb succès !',
 'resetpass_forbidden' => 'Los senhals pòdon pas èsser cambiats',
 'resetpass-no-info' => 'Vos cal èsser connectat per aver accès a aquesta pagina.',
 'resetpass-submit-loggedin' => 'Modificar lo senhal',
@@ -819,10 +860,11 @@ Benlèu ja avètz modificat vòstre senhal o demandat un senhal temporari novèl
 
 # Special:PasswordReset
 'passwordreset' => 'Remesa a zèro del senhal',
-'passwordreset-text' => 'Emplenatz aqueste formulari per reïnicializar vòstre senhal.',
+'passwordreset-text-one' => 'Emplenatz aqueste formulari per reïnicializar vòstre senhal.',
+'passwordreset-text-many' => "{{PLURAL:$1|Completatz un d'aqueles camps per reïnicializar vòstre senhal.}}",
 'passwordreset-legend' => 'Reïnicializar lo senhal',
 'passwordreset-disabled' => 'La reïnicializacion dels senhals es estada desactivada sus aqueste wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Entratz un element de donadas çaijós}}',
+'passwordreset-emaildisabled' => 'Las foncionalitats e-mail son estadas desactivadas sus aqueste wiki.',
 'passwordreset-username' => "Nom d'utilizaire :",
 'passwordreset-domain' => 'Domeni:',
 'passwordreset-capture' => 'Veire lo corrièl resultant ?',
@@ -843,7 +885,7 @@ $2
 Senhal temporari: $2',
 'passwordreset-emailsent' => 'Un corrièr electronic de reïnicializacion de senhal es estat mandat.',
 'passwordreset-emailsent-capture' => "Un corrièr electronic de reïnicializacion senhal es estat mandat, qu'es afichat çaijós.",
-'passwordreset-emailerror-capture' => "Un corrièr electronic de reïnicializacion es estat generat, qu'es afichat çaijós, mas lo mandadís a l'utilizaire a fracassat : $1",
+'passwordreset-emailerror-capture' => "Un corrièr electronic de reïnicializacion de senhal es estat generat, qu'es afichat çaijós, mas lo mandadís a l'{{GENDER:$2|utilizaire}} a fracassat : $1",
 
 # Special:ChangeEmail
 'changeemail' => "Cambiar l'adreça electronica:",
@@ -857,6 +899,19 @@ Senhal temporari: $2',
 'changeemail-submit' => "Cambiar l'adreça electronica:",
 'changeemail-cancel' => 'Anullar',
 
+# Special:ResetTokens
+'resettokens' => 'Reïnicializar los getons',
+'resettokens-text' => "Aici, podètz reïnicializar los getons que permeton d’accedir a d'unas donadas privadas associadas a vòstre compte.
+
+Lo vos caldriá far se las avètz partejats accidentalament amb qualqu'un o se vòstre compte es estat compromés.",
+'resettokens-no-tokens' => 'I a pas cap de geton de reïnicializar.',
+'resettokens-legend' => 'Reïnicializar los getons',
+'resettokens-tokens' => 'Getons :',
+'resettokens-token-label' => '$1 (valor actuala : $2)',
+'resettokens-watchlist-token' => 'Geton pel flux (Atom/RSS) web de [[Special:Watchlist|modificacions de paginas de vòstra lista de seguiment]]',
+'resettokens-done' => 'Getons reïnicializats.',
+'resettokens-resetbutton' => 'Reïnicializar los getons seleccionats',
+
 # Edit page toolbar
 'bold_sample' => 'Tèxte en gras',
 'bold_tip' => 'Tèxte en gras',
@@ -1043,12 +1098,14 @@ Cap d'explicacion pas balhada.",
 Sembla que siá estada suprimida.',
 'edit-conflict' => 'Modificar lo conflicte.',
 'edit-no-change' => 'Vòstra modificacion es estada ignorada perque cap de cambiament es pas estat fach dins lo tèxte.',
+'postedit-confirmation' => 'Vòstra modificacion es estada salvada.',
 'edit-already-exists' => 'La pagina novèla a pogut èsser creada .
 Existís ja.',
 'defaultmessagetext' => 'Messatge per defaut',
 'content-failed-to-parse' => "Fracàs de l'analisi del contengut de $2 pel modèl $1: $3",
 'invalid-content-data' => 'Donadas del contengut invalidas',
 'content-not-allowed-here' => 'Lo contengut "$1" es pas autorizat sus la pagina [[$2]]',
+'editwarning-warning' => "Quitar aquesta pagina vos farà pèrdre totas las modificacions qu'avètz fachas. Se sètz connectat amb vòstre compte, podètz levar aqueste avertiment dins la seccion « Modificacion » de vòstras preferéncias.",
 
 # Content models
 'content-model-wikitext' => 'wikitèxte',
@@ -1082,6 +1139,7 @@ D'unas inclusions seràn pas efectuadas.",
 'undo-failure' => 'Aquesta modificacion a pas pogut èsser desfacha a causa de conflictes amb de modificacions intermediàrias.',
 'undo-norev' => 'La modificacion a pas pogut èsser desfacha perque siá es inexistenta siá es estada suprimida.',
 'undo-summary' => 'Anullacion de las modificacions $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discutir]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])',
+'undo-summary-username-hidden' => 'Anullar la revision $1 per un utilizaire amagat',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Podètz pas crear de compte.',
@@ -1259,6 +1317,7 @@ Asseguratz-vos qu'aqueste cambiament pòsca conservar la continuitat de l'istori
 'compareselectedversions' => 'Comparar las versions seleccionadas',
 'showhideselectedversions' => 'Afichar/amagar las versions seleccionadas',
 'editundo' => 'desfar',
+'diff-empty' => '(Pas cap de diferéncia)',
 'diff-multi' => '({{PLURAL:$1|Una revision intermediària amagada|$1 revisions intermediàrias amagadas}}) per ({{PLURAL:$2|un utilizaire pas afichada|$2 utilizaires pas afichadas}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Una revision intermediària amagada|$1 revisions intermediàrias amagadas}}) per ({{PLURAL:$2|un utilizaire pas afichada|$2 utilizaires pas afichadas}})',
 'difference-missing-revision' => "{{PLURAL:$2|Una revision|$2 revisions}} d'aquesta diferéncia ($1) {{PLURAL:$2|es pas estada trobada|son pas estadas trobadas}}.
@@ -1286,7 +1345,6 @@ Podètz trobar de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULL
 'searchmenu-legend' => 'Opcions de recèrca',
 'searchmenu-exists' => "* Pagina '''[[$1]]'''",
 'searchmenu-new' => "'''Crear la pagina ''[[:$1|$1]]'' sus aqueste wiki !'''",
-'searchhelp-url' => 'Help:Acuèlh',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Recercar las paginas amb aqueste prefix]]',
 'searchprofile-articles' => 'Paginas de contengut',
 'searchprofile-project' => "Paginas d'ajuda e del projècte",
@@ -1330,15 +1388,7 @@ Ensajatz en utilizant lo prefix ''all:'' per recercar tot lo contengut (tot incl
 'searchdisabled' => 'La recèrca sus {{SITENAME}} es desactivada.
 En esperant la reactivacion, podètz efectuar una recèrca via Google.
 Atencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.',
-
-# Quickbar
-'qbsettings' => "Barra d'aisinas",
-'qbsettings-none' => 'Pas cap',
-'qbsettings-fixedleft' => 'Esquèrra',
-'qbsettings-fixedright' => 'Drecha',
-'qbsettings-floatingleft' => 'Flotanta a esquèrra',
-'qbsettings-floatingright' => 'Flotanta a drecha',
-'qbsettings-directionality' => "Fixat, en foncion de la directivitat d'escritura de vòstra lenga",
+'search-error' => "Una error s'es producha en recercant : $1",
 
 # Preferences page
 'preferences' => 'Preferéncias',
@@ -1372,7 +1422,6 @@ Atencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.',
 'resetprefs' => 'Restablir las preferéncias',
 'restoreprefs' => 'Restablir totes los paramètres per defaut (dins totas las seccions)',
 'prefs-editing' => 'Fenèstra de modificacion',
-'prefs-edit-boxsize' => 'Talha de la fenèstra de modificacion.',
 'rows' => 'Rengadas :',
 'columns' => 'Colomnas :',
 'searchresultshead' => 'Recèrca',
@@ -1383,9 +1432,6 @@ Atencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.',
 'recentchangesdays-max' => '(maximum $1 {{PLURAL:$1|jorn|jorns}})',
 'recentchangescount' => "Nombre de modificacions d'afichar per defaut :",
 'prefs-help-recentchangescount' => 'Aquò inclutz las modificacions recentas, las paginas d’istorics e los jornals.',
-'prefs-help-watchlist-token' => 'Emplenar aquò amb una valor secreta generarà un flux RSS per vòstra lista de seguiment.
-Tota persona que coneis aqueste geton poirà legir vòstra lista de seguiment, causissètz doncas una valor securizada.
-Vaquí una valor generada aleatòriament que podètz utilizar : $1',
 'savedprefs' => 'Las preferéncias son estadas salvadas.',
 'timezonelegend' => 'Fus orari :',
 'localtime' => 'Ora locala :',
@@ -1415,7 +1461,6 @@ Vaquí una valor generada aleatòriament que podètz utilizar : $1',
 'prefs-common-css-js' => 'JavaScript e CSS partejat per totes los abilhatges :',
 'prefs-reset-intro' => 'Podètz utilizar aquesta pagina per restablir vòstras preferéncias a las valors per defaut del site. Aquò pòt pas èsser desfach.',
 'prefs-emailconfirm-label' => 'Confirmacion del corrièr electronic :',
-'prefs-textboxsize' => 'Talha de la fenèstra de modificacion',
 'youremail' => 'Adreça de corrièr electronic :',
 'username' => "{{GENDER:$1|Nom d'utilizaire|Nom d'utilizaira}}:",
 'uid' => "Numèro d'{{GENDER:$1|utilizaire|utilizaira}}:",
@@ -1449,6 +1494,8 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 'prefs-dateformat' => 'Format de las datas',
 'prefs-timeoffset' => 'Descalatge orari',
 'prefs-advancedediting' => 'Opcions generalas',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Apercebut',
 'prefs-advancedrc' => 'Opcions avançadas',
 'prefs-advancedrendering' => 'Opcions avançadas',
 'prefs-advancedsearchoptions' => 'Opcions avançadas',
@@ -1456,6 +1503,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 'prefs-displayrc' => "Opcions d'afichatge",
 'prefs-displaysearchoptions' => "Opcions d'afichatge",
 'prefs-displaywatchlist' => "Opcions d'afichatge",
+'prefs-tokenwatchlist' => 'Geton',
 'prefs-diffs' => 'Diferéncias',
 
 # User preference: email validation using jQuery
@@ -1548,11 +1596,18 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 'right-proxyunbannable' => 'Èsser pas afectat pels blocatges automatics de servidors mandataris',
 'right-unblockself' => 'Se desblocar se-meteis',
 'right-protect' => 'Modificar los nivèls de proteccion e modificar las paginas protegidas en cascada',
-'right-editprotected' => 'Modificar las paginas protegidas (sens proteccion en cascada)',
+'right-editprotected' => 'Modificar las paginas protegidas amb « {{int:protect-level-sysop}} »',
+'right-editsemiprotected' => 'Modificar las paginas protegidas amb « {{int:protect-level-autoconfirmed}} »',
 'right-editinterface' => "Modificar l'interfàcia d'utilizaire",
 'right-editusercssjs' => "Modificar los fichièrs CSS e JS d'autres utilizaires",
 'right-editusercss' => "Modificar los fichièrs CSS d'autres utilizaires",
 'right-edituserjs' => "Modificar los fichièrs JS d'autres utilizaires",
+'right-editmyusercss' => 'Modificar vòstres pròpris fichièrs CSS utilizaire',
+'right-editmyuserjs' => 'Modificar vòstres pròpris fichièrs JavaScript utilizaire',
+'right-viewmywatchlist' => 'Afichar vòstra pròpria lista de seguiment',
+'right-viewmyprivateinfo' => 'Veire vòstras donadas personalas (exemple adreça, nom vertadièr)',
+'right-editmyprivateinfo' => 'Modificar vòstras donadas personalas (exemple adreça, nom vertadièr)',
+'right-editmyoptions' => 'Modificar vòstras preferéncias',
 'right-rollback' => "Revocacion rapida del darrièr utilizaire qu'a modificat una pagina particulara",
 'right-markbotedits' => 'Marcar los cambiaments revocats coma de cambiaments que son estats fachs per de robòts',
 'right-noratelimit' => 'Pas afectat pels limits de taus',
@@ -1614,9 +1669,15 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 'action-userrights-interwiki' => 'modificar los dreches d’utilizaire e los sus d’autres wikis',
 'action-siteadmin' => 'varrolhar o desvarrolhar la banca de donadas',
 'action-sendemail' => 'mandar corrièrs electronics',
+'action-editmywatchlist' => 'modificar vòstra lista de seguiment',
+'action-viewmywatchlist' => 'afichar vòstra pròpria lista de seguiment',
+'action-viewmyprivateinfo' => 'veire vòstras informacions personalas',
+'action-editmyprivateinfo' => 'modificar vòstras informacions personalas',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|cambiament|cambiaments}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|dempuèi la darrièra visita}}',
+'enhancedrc-history' => 'istoric',
 'recentchanges' => 'Darrièrs cambiaments',
 'recentchanges-legend' => 'Opcions dels darrièrs cambiaments',
 'recentchanges-summary' => 'Vaquí sus aquesta pagina, los darrièrs cambiaments de {{SITENAME}}.',
@@ -1656,7 +1717,6 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 'recentchangeslinked-feed' => 'Seguit dels ligams',
 'recentchangeslinked-toolbox' => 'Seguit dels ligams',
 'recentchangeslinked-title' => 'Seguit dels ligams associats a "$1"',
-'recentchangeslinked-noresult' => 'Cap de cambiament sus las paginas ligadas pendent lo periòde causit.',
 'recentchangeslinked-summary' => "Aquesta pagina especiala fa veire los darrièrs cambiaments sus las paginas que son ligadas. Las paginas de [[Special:Watchlist|vòstra lista de seguimznt]] son '''en gras'''.",
 'recentchangeslinked-page' => 'Nom de la pagina :',
 'recentchangeslinked-to' => 'Afichar los cambiaments cap a las paginas ligadas al luòc de la pagina donada',
@@ -1667,8 +1727,7 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 'reuploaddesc' => 'Anullar lo cargament e tornar al formulari.',
 'upload-tryagain' => 'Mandar la descripcion del fichièr modificada',
 'uploadnologin' => 'Vos sètz pas identificat(ada)',
-'uploadnologintext' => 'Vos cal èsser [[Special:UserLogin|connectat(ada)]]
-per copiar de fichièrs sul servidor.',
+'uploadnologintext' => 'Vos cal $1 per importar de fichièrs.',
 'upload_directory_missing' => 'Lo repertòri d’impòrt ($1) es mancant e a pas pogut èsser creat pel servidor web.',
 'upload_directory_read_only' => 'Lo servidor Web pòt escriure dins lo dorsièr cibla ($1).',
 'uploaderror' => 'Error',
@@ -1888,7 +1947,6 @@ Per una seguretat optimala, img_auth.php es desactivat.",
 'http-read-error' => 'HTTP Error de lectura.',
 'http-timed-out' => 'HTTP request timed out.',
 'http-curl-error' => "Error al moment de la recuperacion de l'URL : $1",
-'http-host-unreachable' => "Impossible d'aténher l'URL",
 'http-bad-status' => 'I a agut un problèma al moment de la requèsta HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1916,6 +1974,10 @@ Per una seguretat optimala, img_auth.php es desactivat.",
 'listfiles_size' => 'Talha (en octets)',
 'listfiles_description' => 'Descripcion',
 'listfiles_count' => 'Versions',
+'listfiles-show-all' => 'Inclure las ancianas versions dels imatges',
+'listfiles-latestversion' => 'Version actuala',
+'listfiles-latestversion-yes' => 'Òc',
+'listfiles-latestversion-no' => 'Non',
 
 # File description page
 'file-anchor-link' => 'Fichièr',
@@ -2005,6 +2067,13 @@ Doblidetz pas de verificar se i a pas d’autre ligam cap als modèls abans de l
 'randompage' => "Una pagina a l'azard",
 'randompage-nopages' => "I a pas cap de pagina dins {{PLURAL:$2|l'espaci de nom|los espacis de noms}} : $1.",
 
+# Random page in category
+'randomincategory' => "Pagina a l'azard dins la categoria",
+'randomincategory-invalidcategory' => '« $1 » es pas un nom de categoria valid.',
+'randomincategory-nopages' => 'I a pas cap de pagina dins [[:Category:$1]].',
+'randomincategory-selectcategory' => "Prene una pagina a l'azard dins la categoria : $1 $2.",
+'randomincategory-selectcategory-submit' => 'Anar',
+
 # Random redirect
 'randomredirect' => "Una pagina de redireccion a l'azard",
 'randomredirect-nopages' => "I a pas cap de redireccion dins l'espaci de nom « $1 ».",
@@ -2029,16 +2098,12 @@ Doblidetz pas de verificar se i a pas d’autre ligam cap als modèls abans de l
 'statistics-users-active-desc' => "Utilizaires qu'an fach al mens una accion durant {{PLURAL:$1|lo darrièr jorn|los $1 darrièrs jorns}}",
 'statistics-mostpopular' => 'Paginas mai consultadas',
 
-'disambiguations' => "Paginas qu'an de ligams cap a de paginas d'omonimia",
-'disambiguationspage' => 'Template:Omonimia',
-'disambiguations-text' => "Las paginas seguentas compòrtan al mens un ligam cap a una '''pagina d’omonimia'''.
-Deurián puslèu puntar cap al bon article.<br />
-Una pagina es considerada coma una pagina d’omonimia s'utiliza un modèl qu'es ligat a partir de [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop' => 'Paginas amb una proprietat de pagina',
 'pageswithprop-legend' => 'Paginas amb una proprietat de pagina',
 'pageswithprop-prop' => 'Nom de la proprietat :',
 'pageswithprop-submit' => 'Anar',
+'pageswithprop-prophidden-long' => 'valor de proprietat de tèxte long amagada ($1)',
+'pageswithprop-prophidden-binary' => 'valor de proprietat binària amagada ($1)',
 
 'doubleredirects' => 'Redireccions doblas',
 'doubleredirectstext' => 'Vaquí una lista de las paginas que redirigisson cap a de paginas que son elas-meteissas de paginas de redireccion.
@@ -2094,6 +2159,7 @@ Las entradas <del>barradas</del> son estadas resolgudas.',
 'mostrevisions' => 'Articles mai modificats',
 'prefixindex' => 'Totas las paginas que començan per…',
 'prefixindex-namespace' => 'Totas las paginas amb prefix (espaci de noms $1)',
+'prefixindex-strip' => 'Levar lo prefix dins la lista',
 'shortpages' => 'Paginas brèvas',
 'longpages' => 'Paginas longas',
 'deadendpages' => "Paginas sul camin d'enlòc",
@@ -2285,10 +2351,9 @@ per modificar vòstra lista de seguiment.',
 'unwatchthispage' => 'Arrestar de seguir',
 'notanarticle' => "Pas cap d'article",
 'notvisiblerev' => 'Version suprimida',
-'watchnochange' => 'Cap de las paginas que seguissètz son pas estadas modificadas pendent lo periòde afichat.',
 'watchlist-details' => 'I a {{PLURAL:$1|pagina|paginas}} dins vòstra lista de seguiment, sens comptar las paginas de discussion.',
-'wlheader-enotif' => '* La notificacion per corrièr electronic es activada.',
-'wlheader-showupdated' => '* Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son mostradas en <b>gras</b>',
+'wlheader-enotif' => 'La notificacion per corrièr electronic es activada.',
+'wlheader-showupdated' => "Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son afichadas en '''gras'''.",
 'watchmethod-recent' => 'verificacion dels darrièrs cambiaments de las paginas seguidas',
 'watchmethod-list' => 'verificacion de las paginas seguidas per de modificacions recentas',
 'watchlistcontains' => 'Vòstra lista de seguiment conten $1 {{PLURAL:$1|pagina|paginas}}.',
@@ -2680,11 +2745,8 @@ Consultatz la [[Special:BlockList|lista dels utilizaires blocats]] per veire los
 'ipb_blocked_as_range' => "Error : L'adreça IP $1 es pas estada blocada dirèctament e doncas pòt pas èsser deblocada. Çaquelà, es estada blocada per la plaja $2 la quala pòt èsser deblocada.",
 'ip_range_invalid' => 'Plaja IP incorrècta.',
 'ip_range_toolarge' => 'Los blocatges de plajas mai grandas que /$1 son pas autorizadas.',
-'blockme' => 'Blocatz-me',
 'proxyblocker' => 'Blocaire de mandatari (proxy)',
-'proxyblocker-disabled' => 'Aquesta foncion es desactivada.',
 'proxyblockreason' => "Vòstra ip es estada blocada perque s’agís d’un proxy dobèrt. Mercé de contactar vòstre fornidor d’accès internet o vòstre supòrt tecnic e de l’informar d'aqueste problèma de seguretat.",
-'proxyblocksuccess' => 'Acabat.',
 'sorbsreason' => 'Vòstra adreça IP es listada en tant que mandatari (proxy) dobèrt DNSBL per {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Vòstra adreça IP es listada en tant que mandatari (proxy) dobèrt DNSBL per {{SITENAME}}.
 Podètz pas crear un compte',
@@ -2832,6 +2894,8 @@ Visitatz la [//www.mediawiki.org/wiki/Localisation Localizacion MediaWiki] e [//
 'thumbnail-more' => 'Agrandir',
 'filemissing' => 'Fichièr absent',
 'thumbnail_error' => 'Error al moment de la creacion de la miniatura : $1',
+'thumbnail_error_remote' => "Messatge d'error de $1 :
+$2",
 'djvu_page_error' => 'Pagina DjVu fòra limits',
 'djvu_no_xml' => "Impossible d’obténer l'XML pel fichièr DjVu",
 'thumbnail_invalid_params' => 'Paramètres de la miniatura invalids',
@@ -2969,27 +3033,16 @@ Salvatz-lo sus vòstre disc dur puèi importatz-lo aicí.",
 
 # Stylesheets
 'common.css' => '/** Lo CSS plaçat aicí serà aplicat a totas las aparéncias. */',
-'standard.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Estandard. */',
-'nostalgia.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Nostalgia. */',
 'cologneblue.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Cologne Blue */',
 'monobook.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires del skin Monobook */',
-'myskin.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge MySkin */',
-'chick.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Chick */',
-'simple.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Simple */',
 'modern.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Modern */',
 'vector.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Vector */',
 'print.css' => '/* Lo CSS plaçat aicí afectarà las impressions */',
-'handheld.css' => '/* Lo CSS plaçat aicí afectarà los aparelhs mobils en foncion de l\'abilhatge configurat $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Tot JavaScript serà cargat amb cada pagina accedida per un utilizaire quin que siá. */',
-'standard.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Standard unicament. */',
-'nostalgia.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Nostalgia unicament. */',
 'cologneblue.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Cologne Blue unicament. */',
 'monobook.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge MonoBook unicament. */',
-'myskin.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge MySkin unicament. */',
-'chick.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Chick unicament. */',
-'simple.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Simple unicament. */',
 'modern.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Modern unicament. */',
 'vector.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Vector unicament. */',
 
@@ -3064,13 +3117,8 @@ Aquò es probablament causat per un ligam sus lista negra que punta cap a un sit
 'pageinfo-category-files' => 'Nombre de fichièrs',
 
 # Skin names
-'skinname-standard' => 'Estandard',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Colonha Blau',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Mon interfàcia',
-'skinname-chick' => 'Poleton',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Modèrne',
 
 # Patrolling
@@ -3145,11 +3193,25 @@ Se l'executatz, vòstre sistèma pòt èsser compromés.",
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minutas}}',
 'hours' => '{{PLURAL:$1|$1 ora|$1 oras}}',
 'days' => '{{PLURAL:$1|$1 jorn|$1 jorns}}',
+'weeks' => '{{PLURAL:$1|$1 setmana|$1 setmanas}}',
 'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
 'years' => '{{PLURAL:$1|$1 an|$1 ans}}',
 'ago' => 'I a $1',
 'just-now' => 'sulpic',
 
+# Human-readable timestamps
+'hours-ago' => 'i a $1 {{PLURAL:$1|ora|oras}}',
+'minutes-ago' => 'i a $1 {{PLURAL:$1|minuta|minutas}}',
+'seconds-ago' => 'i a $1 {{PLURAL:$1|segonda|segondas}}',
+'monday-at' => 'Diluns a $1',
+'tuesday-at' => 'Dimars a $1',
+'wednesday-at' => 'Dimècres a $1',
+'thursday-at' => 'Dijòus a $1',
+'friday-at' => 'Divendres a $1',
+'saturday-at' => 'Dissabte a $1',
+'sunday-at' => 'Dimenge a $1',
+'yesterday-at' => 'Ièr a $1',
+
 # Bad image list
 'bad_image_list' => "Lo format es lo seguent :
 
@@ -3182,7 +3244,7 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Largor',
 'exif-imagelength' => 'Nautor',
 'exif-bitspersample' => 'Bits per compausanta',
@@ -3360,7 +3422,7 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 'exif-originalimageheight' => "Nautor de l'imatge abans d'èsser requadrada",
 'exif-originalimagewidth' => "Largor de l'imatge abans d'èsser requadrada",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sens compression',
 'exif-compression-2' => "CCITT Grop 3 Longor de l'encodatge Huffman modificat de dimension 1",
 'exif-compression-3' => 'CCITT Grop 3 encodatge del fax',
@@ -3670,7 +3732,6 @@ Confirmatz que desiratz tornar crear aqueste article.",
 
 # Separators for various lists, etc.
 'colon-separator' => '&nbsp;:&#32;',
-'autocomment-prefix' => '-',
 
 # Multipage image navigation
 'imgmultipageprev' => '← pagina precedenta',
@@ -3754,7 +3815,6 @@ Ensajatz la previsualizacion normala.',
 'version-other' => 'Divèrs',
 'version-mediahandlers' => 'Supòrts mèdia',
 'version-hooks' => 'Croquets',
-'version-extension-functions' => 'Foncions de las extensions',
 'version-parser-extensiontags' => 'Balisas suplementàrias del parser',
 'version-parser-function-hooks' => 'Croquets de las foncions del parser',
 'version-hook-name' => 'Nom del croquet',
@@ -3763,6 +3823,7 @@ Ensajatz la previsualizacion normala.',
 'version-license' => 'Licéncia',
 'version-poweredby-credits' => "Aqueste wiki fonciona gràcias a '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'autres',
+'version-poweredby-translators' => 'traductors de translatewiki.net',
 'version-software' => 'Logicial installat',
 'version-software-product' => 'Produch',
 'version-software-version' => 'Version',
@@ -3770,12 +3831,16 @@ Ensajatz la previsualizacion normala.',
 'version-entrypoints-header-entrypoint' => "Punt d'entrada",
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => "Camin d'accès d'un fichièr",
-'filepath-page' => 'Fichièr :',
-'filepath-submit' => 'Validar',
-'filepath-summary' => "Aquesta pagina especiala retorna lo camin d'accès complet d’un fichièr.
-Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son cargats e aviats dirèctament amb lor programa associat.",
+# Special:Redirect
+'redirect' => 'Redirigit per fichièr, utilizaire, o ID de revision',
+'redirect-legend' => 'Redirigir cap a una pagina o un fichièr',
+'redirect-submit' => 'Validar',
+'redirect-lookup' => 'Recèrca :',
+'redirect-value' => 'Valor :',
+'redirect-user' => "ID de l'utilizaire",
+'redirect-revision' => 'Revision de la pagina',
+'redirect-file' => 'Nom del fichièr',
+'redirect-not-exists' => 'Valor pas trobada',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Recèrca dels fichièrs en doble',
@@ -3825,6 +3890,7 @@ Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son
 'tags' => 'Balisas de las modificacions validas',
 'tag-filter' => 'Filtrar las [[Special:Tags|balisas]] :',
 'tag-filter-submit' => 'Filtrar',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Balisa|Balisas}}]] : $2)',
 'tags-title' => 'Balisas',
 'tags-intro' => 'Aquesta pagina lista las balisas que lo logicial pòt utilizar per marcar una modificacion, e lor significacion.',
 'tags-tag' => 'Nom de la balisa',
@@ -3866,6 +3932,9 @@ Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son
 'htmlform-submit' => 'Sometre',
 'htmlform-reset' => 'Desfar las modificacions',
 'htmlform-selectorother-other' => 'Autre',
+'htmlform-no' => 'Non',
+'htmlform-yes' => 'Òc',
+'htmlform-chosen-placeholder' => 'Causir una opcion',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 amb recèrca en tèxte integral suportada',
@@ -3961,4 +4030,19 @@ Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son
 # Image rotation
 'rotate-comment' => "Imatge pivotat de $1 {{PLURAL:$1|gras|grases}} dins lo sens de las agulhas d'una mòstra",
 
+# Limit report
+'limitreport-title' => 'Donadas d’optimizacion de l’analisador :',
+'limitreport-cputime' => 'Temps CPU d’utilizacion',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segonda|segondas}}',
+'limitreport-walltime' => 'Temps real d’utilizacion',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|segonda|segondas}}',
+'limitreport-ppvisitednodes' => 'Nombre de nosèls de preprocessor visitats',
+'limitreport-ppgeneratednodes' => 'Nombre de nosèls de preprocessor generats',
+'limitreport-postexpandincludesize' => 'Talha d’inclusion aprèp espandiment',
+'limitreport-postexpandincludesize-value' => '$1/$2 octets',
+'limitreport-templateargumentsize' => 'Talha de l’argument del modèl',
+'limitreport-templateargumentsize-value' => '$1/$2 octets',
+'limitreport-expansiondepth' => 'Mai granda prigondor d’espandiment',
+'limitreport-expensivefunctioncount' => 'Nombre de foncions d’analisi costosas',
+
 );
diff --git a/languages/messages/MessagesOr.php b/languages/messages/MessagesOr.php
index 89f2fac5..6ab6ef98 100644
--- a/languages/messages/MessagesOr.php
+++ b/languages/messages/MessagesOr.php
@@ -34,6 +34,8 @@ $digitTransformTable = array(
 	'9' => '୯', # &#x0b6f;
 );
 
+$linkTrail = "/^([a-z\x{0B00}-\x{0B7F}]+)(.*)$/sDu";
+
 /** namespace translations from translatewiki.net 
  * @author Shijualex
  * @author Psubhashish
@@ -287,9 +289,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ଦେଖୁଥିବା ବ୍ୟବହାରକାରୀଙ୍କ ସଂଖ୍ୟା ଦେଖାନ୍ତୁ',
 'tog-oldsig' => 'ଏବେକାର ଦସ୍ତଖତ:',
 'tog-fancysig' => 'ଦସ୍ତଖତକୁ ଉଇକିଟେକ୍ସଟ ଭାବରେ ଗଣିବେ (ଆପେଆପେ ଥିବା ଲିଙ୍କ ବିନା)',
-'tog-externaleditor' => 'ବାହାର ସମ୍ପାଦକଟି ଆପଣାଛାଏଁ ବ୍ୟବହାର କରିବେ (କେବଳ ପଟୁ ସଭ୍ୟଙ୍କ ପାଇଁ, ଏଥି ନିମନ୍ତେ ଆପଣଙ୍କ କମ୍ପୁଟରରେ ବିଶେଷ ସଜାଣି ଲୋଡ଼ା । [//www.mediawiki.org/wiki/Manual:External_editors ଅଧିକ ସୂଚନା])',
-'tog-externaldiff' => 'ବାହାର ବାଛିବା (external diff) ଆପଣାଛାଏଁ ବ୍ୟବହାର କରିବେ (କେବଳ ପଟୁ ସଭ୍ୟଙ୍କ ପାଇଁ, ଏଥି ନିମନ୍ତେ ଆପଣଙ୍କ କମ୍ପୁଟରରେ ବିଶେଷ ସଜାଣି ଲୋଡ଼ା । [//www.mediawiki.org/wiki/Manual:External_editors ଅଧିକ ସୂଚନା])',
-'tog-showjumplinks' => '"ଡେଇଁଯିବେ" ଲିଙ୍କସବୁକୁ ସଚଳ କରିବେ',
 'tog-uselivepreview' => 'ସାଥେ ସାଥେ ଚାଲିଥିବା ଦେଖଣା ବ୍ୟବହାର କରିବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
 'tog-forceeditsummary' => 'ଖାଲି ସମ୍ପାଦନା ସାରକଥାକୁ ଯିବା ବେଳେ ମୋତେ ଜଣାଇବେ',
 'tog-watchlisthideown' => 'ମୋ ଦେଖଣା ତାଲିକାରେ ମୋ ନିଜର ସମ୍ପାଦନାଗୁଡ଼ିକ ଲୁଚାଇବେ',
@@ -302,6 +301,7 @@ $messages = array(
 'tog-diffonly' => 'ତୁଳନା ତଳେ ପୃଷ୍ଠାର ଭିତର ଭାଗ ଦେଖାନ୍ତୁ ନାହିଁ',
 'tog-showhiddencats' => 'ଲୁଚାଯାଇଥିବା ଶ୍ରେଣୀଗୁଡ଼ିକ ଦେଖାଇବେ',
 'tog-norollbackdiff' => 'ରୋଲବ୍ୟାକ କଲାପରେ ତୁଳନା ଦେଖାନ୍ତୁ ନାହିଁ',
+'tog-useeditwarning' => 'ଯେତେବେଳେ ମୁଁ ଗୋଟିଏ ସାଇତାଯାଇନଥିବା ପୃଷ୍ଠାକୁ ବନ୍ଦ କରିଦିଏ ମୋତେ ଚେତାବନୀ ଦେବେ',
 
 'underline-always' => 'ସବୁବେଳେ',
 'underline-never' => 'କେବେନୁହେଁ',
@@ -365,6 +365,18 @@ $messages = array(
 'oct' => 'ଅକ୍ଟୋବର',
 'nov' => 'ନଭେମ୍ବର',
 'dec' => 'ଡିସେମ୍ବର',
+'january-date' => '$1 ଜାନୁଆରୀ',
+'february-date' => '$1 ଫେବୃଆରୀ',
+'march-date' => '$1 ମାର୍ଚ୍ଚ',
+'april-date' => '$1 ଅପ୍ରେଲ',
+'may-date' => '$1 ମଇ',
+'june-date' => '$1 ଜୁନ',
+'july-date' => '$1 ଜୁଲାଇ',
+'august-date' => '$1 ଅଗଷ୍ଟ',
+'september-date' => '$1 ସେପ୍ଟେମ୍ବର',
+'october-date' => '$1 ଅକ୍ଟୋବର',
+'november-date' => '$1 ନଭେମ୍ବର',
+'december-date' => '$1 ଡିସେମ୍ବର',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|ଶ୍ରେଣୀ|ଶ୍ରେଣୀସମୂହ}}',
@@ -488,7 +500,7 @@ $1',
 'pool-queuefull' => 'ପୁଲ ଧାଡ଼ିଟି ଭରିଯାଇଅଛି',
 'pool-errorunknown' => 'ଅଜଣା ଅସୁବିଧା',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} ବାବଦରେ',
 'aboutpage' => 'Project:ବାବଦରେ',
 'copyright' => '$1 ରେ ସର୍ବସ୍ଵତ୍ଵ ସଂରକ୍ଷିତ',
@@ -498,7 +510,6 @@ $1',
 'disclaimers' => 'ଆମେ ଦାୟୀ ନୋହୁଁ',
 'disclaimerpage' => 'Project:ଆମେ ଦାୟୀ ନୋହୁଁ',
 'edithelp' => 'ଲେଖା ସାହାଯ୍ୟ',
-'edithelppage' => 'Help:ବଦଳାଇବା',
 'helppage' => 'Help:ସୂଚୀ',
 'mainpage' => 'ପ୍ରଧାନ ପୃଷ୍ଠା',
 'mainpage-description' => 'ପ୍ରଧାନ ପୃଷ୍ଠା',
@@ -576,16 +587,6 @@ $1',
 # General errors
 'error' => 'ଭୁଲ',
 'databaseerror' => 'ଡାଟାବେସରେ ଭୁଲ',
-'dberrortext' => 'ଏହା ଏହି ସଫ୍ଟୱେରରେ ଭୁଲଟିଏକୁ ମଧ୍ୟ ସୂଚାଇପାରେ ।
-ଶେଷଥର ଖୋଜାଯାଇଥିବା ଡାଟାବେସ ପ୍ରଶ୍ନଟି ଥିଲା:
-<blockquote><code>$1</code></blockquote>
- ଯାହାକି "<code>$2</code>"ରୁ ଥିଲା
-ଡାଟାବେସରେ ହୋଇଥିବା ଭୁଲ ହେଉଛି "<samp>$3: $4</samp>"।',
-'dberrortextcl' => 'ଡାଟାବେସ ପ୍ରଶ୍ନ ଖୋଜା ଭୁଲଟିଏ ହୋଇଅଛି ।
-ଶେଷ ଖୋଜା ଡାଟାବେସ ପ୍ରଶ୍ନଟି ଥିଲା:
-"$1"
-ଯାହା "$2" ଭିତରୁ ନିଆଯାଇଥିଲା ।
-ଡାଟାବେସ ଫେରନ୍ତା ଭୁଲ "$3: $4"',
 'laggedslavemode' => "'''ଜାଣିରଖନ୍ତୁ:''' ପୃଷ୍ଠାଟିରେ ବୋଧ ହୁଏ ନଗଦ ବଦଳ ନ ଥାଇପାରେ ।",
 'readonly' => 'ଡାଟାବେସଟିରେ ତାଲା ପଡ଼ିଅଛି',
 'enterlockreason' => 'କେତେ ଦିନ ଭିତରେ ଏହା ଖୋଲାଯିବ ତାହାର ଅଟକଳ ସହିତ କଞ୍ଚି ପଡ଼ିବାର କାରଣ ଦିଅନ୍ତୁ',
@@ -640,7 +641,6 @@ $1',
 'editinginterface' => "'''ଚେତାବନୀ:''' ଆପଣ ସଫ୍ଟୱେରର ଇଣ୍ଟରଫେସ ଲେଖା ଯୋଗାଇବା ନିମନ୍ତେ ବ୍ୟବହାର କରାଯାଉଥିବା ଏକ ପୃଷ୍ଠାର ସମ୍ପାଦନା କରୁଅଛନ୍ତି ।
 ଏହି ଉଇକିପୃଷ୍ଠାର କିଛି ବି ବଦଳ ବାକି ସଭ୍ୟମାନଙ୍କ ଇଣ୍ଟରଫେସର ଦେଖଣାକୁ ପ୍ରଭାବିତ କରିବ ।
 ସମସ୍ତ ଉଇକିର ଅନୁବାଦ ନିମନ୍ତେ, ଦୟାକରି ମିଡ଼ିଆଉଇକିର ସ୍ଥାନୀୟକରଣ ପ୍ରକଳ୍ପ [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] ବ୍ୟବହାର କରନ୍ତୁ ।",
-'sqlhidden' => '(SQL ପ୍ରଶ୍ନ ଲୁଚାଯାଇଅଛି)',
 'cascadeprotected' => 'ଏହି ପୃଷ୍ଠା ସମ୍ପାଦନା କରିବାରୁ କିଳାଯାଇଅଛି, କାରଣ ଏଥିରେ ତଳଲିଖିତ {{PLURAL:$1|ପୃଷ୍ଠାଟିଏ ଅଛି|ଟି ପୃଷ୍ଠା ଅଛି}} ଯାହା "କ୍ୟାସକେଡ଼ କରା" ସୁବିଧା ଦେଇ କିଳାଯାଇଅଛି ।:
 $2',
 'namespaceprotected' => "ଆପଣଙ୍କୁ ଏହି '''$1''' ନେମସ୍ପେସ ଥିବା ପୃଷ୍ଠାରେ ସମ୍ପାଦନା କରିବା ନିମନ୍ତେ ଅନୁମତି ମିଳିନାହିଁ ।",
@@ -671,10 +671,19 @@ $2',
 'welcomecreation-msg' => 'ଆପଣଙ୍କ ଖାତାଟି ଖୋଲାଗଲା
 ନିଜର [[Special:Preferences|{{SITENAME}} ପସନ୍ଦସବୁକୁ]] ବଦଳାଇବାକୁ ଭୁଲିବେ ନାହିଁ ।',
 'yourname' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:',
+'userlogin-yourname' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ',
+'userlogin-yourname-ph' => 'ଆପଣଙ୍କ ଇଉଜର ନାମ ଟାଇପ କରନ୍ତୁ',
+'createacct-another-username-ph' => 'ଆପଣଙ୍କ ଇଉଜର ନାମ ଟାଇପ କରନ୍ତୁ',
 'yourpassword' => 'ପାସୱାର୍ଡ଼',
+'userlogin-yourpassword' => 'ପାସୱାର୍ଡ଼',
+'userlogin-yourpassword-ph' => 'ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ ନିବେଶ କରନ୍ତୁ',
+'createacct-yourpassword-ph' => 'ପାସୱର୍ଡ଼ ନିବେଶ କରନ୍ତୁ',
 'yourpasswordagain' => 'ପାସୱାର୍ଡ଼ ଆଉଥରେ:',
+'createacct-yourpasswordagain' => 'ପାସୱର୍ଡ଼ ନିଶ୍ଚିତ କରିବେ',
+'createacct-yourpasswordagain-ph' => 'ପୁଣି ପାସୱର୍ଡ଼ ନିବେଶ କରନ୍ତୁ',
 'remembermypassword' => 'ଏହି ବ୍ରାଉଜରରେ (ସବୁଠୁ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଁ ମୋ ଲଗଇନ ମନେ ରଖିଥିବେ',
-'securelogin-stick-https' => 'ଲଗ ଇନ କଲାପରେ HTTPS ସହ ଯୋଡ଼ି ହୋଇ ରହନ୍ତୁ',
+'userlogin-remembermypassword' => 'ମୋତେ ଲଗ-ଇନ କରି ରଖିଥାନ୍ତୁ',
+'userlogin-signwithsecure' => 'ନିରାପଦ କନେକସନ ବ୍ୟବ‌ହାର କରନ୍ତୁ',
 'yourdomainname' => 'ଆପଣଙ୍କ ଡୋମେନ:',
 'password-change-forbidden' => 'ଆପଣ ଏହି ଉଇକିରେ ପାସୱାର୍ଡ ବଦଳାଇ ପାରିବେ ନାହିଁ ।',
 'externaldberror' => 'ବୋଧ ହୁଏ ଚିହ୍ନଟ ଡାଟାବେସ ଭୁଲଟିଏ ହୋଇଥିଲା ବା ଆପଣଙ୍କୁ ନିଜର ବାହାର ଖାତା ଅପଡେଟ କରିବା ନିମନ୍ତେ ଅନୁମତି ମିଳିନାହିଁ ।',
@@ -686,14 +695,31 @@ $2',
 'logout' => 'ଲଗଆଉଟ',
 'userlogout' => 'ଲଗ ଆଉଟ',
 'notloggedin' => 'ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି',
+'userlogin-noaccount' => 'ଖାତାଟିଏ ନାହିଁ?',
+'userlogin-joinproject' => '{{SITENAME}}ରେ ଯୋଗଦିଅନ୍ତୁ',
 'nologin' => 'ଖାତାଟିଏ ନାହିଁ? $1।',
 'nologinlink' => 'ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ',
 'createaccount' => 'ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ',
 'gotaccount' => 'ଆଗରୁ ଖାତାଟିଏ ଅଛି କି? $1.',
 'gotaccountlink' => 'ଲଗ ଇନ (Log in)',
 'userlogin-resetlink' => 'ଲଗଇନ ତଥ୍ୟ ସବୁ ଭୁଲିଗେଲେକି?',
+'userlogin-resetpassword-link' => 'ପାସୱାର୍ଡ଼ ରିସେଟ କରନ୍ତୁ',
+'helplogin-url' => 'Help:Logging_in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ଲଗ-ଇନ କରିବାରେ ସ‌ହ‌ଯୋଗ]]',
+'createacct-emailrequired' => 'ଇମେଲ ଠିକଣା',
+'createacct-emailoptional' => 'ଇମେଲ ଠିକଣା (ଇଚ୍ଛାଧୀନ)',
+'createacct-email-ph' => 'ଆପଣଙ୍କ ଇମେଲ ଠିକଣା ନିବେଶ କରନ୍ତୁ',
+'createacct-another-email-ph' => 'ଆପଣଙ୍କ ଇ-ମେଲ ଠିକଣା ଦିଅନ୍ତୁ',
 'createaccountmail' => 'ଏକ ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ ବ୍ୟବହାର କରନ୍ତୁ ଏବଂ ଏହାକୁ ତଳେ ଦିଆଯାଇଥିବା ଇ-ମେଲ ଠିକଣାକୁ ପଠେଇ ଦିଅନ୍ତୁ',
+'createacct-realname' => 'ପ୍ରକୃତ ନାମ (ଇଚ୍ଛାଧୀନ)',
 'createaccountreason' => 'କାରଣ:',
+'createacct-reason' => 'କାରଣ',
+'createacct-reason-ph' => 'ଆପଣ ଅନ୍ୟଏକ ଖାତା କାହିଁକି ତିଆରି କରୁଛନ୍ତି',
+'createacct-imgcaptcha-ph' => 'ଉପରେ ଲେଖାଥିବା ଲେଖାଟି ଲେଖନ୍ତୁ',
+'createacct-submit' => 'ନିଜର ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ',
+'createacct-another-submit' => 'ଆଉ ଏକ ଖାତା ଖୋଲନ୍ତୁ',
+'createacct-benefit-heading' => '{{SITENAME}} ଆପଣଙ୍କ ଭଳି ଲୋକମାନଙ୍କ ଦ୍ୱାରା ଗଢ଼ା ।',
+'createacct-benefit-body1' => '{{PLURAL:$1|ସମ୍ପାଦନା|ସମ୍ପାଦନାମାନ}}',
 'badretype' => 'ଆପଣ ଦେଇଥିବା ପାସବାର୍ଡ଼ଟି ମେଳଖାଉନାହିଁ ।',
 'userexists' => 'ଆପଣ ଦେଇଥିବା ଇଉଜର ନାମ ଆଗରୁ ଅଛି ।
 ଦୟାକରି ଅଲଗା ନାମଟିଏ ବାଛନ୍ତୁ ।',
@@ -784,7 +810,7 @@ continue using your old password.',
 'newpassword' => 'ନୂଆ ପାସୱାର୍ଡ଼:',
 'retypenew' => 'ପାସୱାର୍ଡ଼ ଆଉଥରେ ଦିଅନ୍ତୁ:',
 'resetpass_submit' => 'ପାସୱାର୍ଡ଼ଟିଏ ଦେଇ ଲଗ ଇନ କରନ୍ତୁ',
-'resetpass_success' => 'ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ଟି ବଦଳାଇ ଦିଆଗଲା !
+'changepassword-success' => 'ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ଟି ବଦଳାଇ ଦିଆଗଲା !
 ଏବେ ଲଗ ଇନ କରୁଅଛୁଁ...',
 'resetpass_forbidden' => 'ପାସୱାର୍ଡ଼ମାନ ବଦଳା ଯାଇପାରିବ ନାହିଁ',
 'resetpass-no-info' => 'ଏହି ପୃଷ୍ଠାଟିକୁ ସିଧା ଖୋଲିବା ନିମନ୍ତେ ଆପଣଙ୍କୁ ଲଗ ଇନ କରିବାକୁ ପଡ଼ିବ ।',
@@ -796,10 +822,9 @@ continue using your old password.',
 
 # Special:PasswordReset
 'passwordreset' => 'ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ',
-'passwordreset-text' => 'ନିଜ ପାସୱାର୍ଡ଼କୁ ପୁନଃସ୍ଥାପନ କରିବା ପାଇଁ ଏହି ଆବେଦନ ପତ୍ରଟି ପୂରଣ କରନ୍ତୁ ।',
 'passwordreset-legend' => 'ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ',
 'passwordreset-disabled' => 'ପାସୱାର୍ଡ଼କୁ ପୁରାପୁରି ମୂଳକୁ ଫେରାଇବା ଏହି ଉଇକିରେ ଅଚଳ କରାଯାଇଅଛି ।',
-'passwordreset-pretext' => '{{PLURAL:$1||ତଳେ ଥିବା ତଥ୍ୟସମୂହରୁ କୌଣସି ଗୋଟିଏ ଦିଅନ୍ତୁ}}',
+'passwordreset-emaildisabled' => 'ଏହି ଉଇକିରେ ଇମେଲ ସୁବିଧା ଅଚଳ କରାଯାଇଅଛି ।',
 'passwordreset-username' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:',
 'passwordreset-domain' => 'ଡୋମେନ:',
 'passwordreset-capture' => 'ଯାଉଥିବା ଇ-ମେଲଟି ଦେଖିବେ?',
@@ -1048,12 +1073,15 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 ଏହାକୁ ଲିଭାଇ ଦିଆଗଲା ପରି ମନେ ହେଉଛି ।',
 'edit-conflict' => 'ବଦଳାଇବା ଦ୍ଵନ୍ଦ.',
 'edit-no-change' => 'ଆପଣଙ୍କ ସମ୍ପାଦନାକୁ ଅଣଦେଖା କରାଗଲା, କାରଣ ଲେଖାରେ କିଛି ବି ବଦଳ କରାଯାଇନଥିଲା ।',
+'postedit-confirmation' => 'ଆପଣଙ୍କ ବଦଳ ସାଇତା ଗଲା ।',
 'edit-already-exists' => 'ନୂଆ ପୃଷ୍ଠାଟିଏ ତିଆରି କରିପାରିଲୁଁ ନାହିଁ ।
 ଏହା ଆଗରୁ ଅଛି ।',
 'defaultmessagetext' => 'ଡିଫଲ୍ଟ ମେସେଜ ଲେଖାଗୁଡିକ',
 'content-failed-to-parse' => '$1 ପ୍ରକାର ପାଇଁ $2 ଲେଖାକୁ ବର୍ଣ୍ଣନା କରିପାରିଲା ନାହିଁ: $3',
 'invalid-content-data' => 'ଅବୈଧ ଆଧାର ତଥ୍ୟ',
 'content-not-allowed-here' => '"$1" ବିଷୟଗୁଡିକ [[$2]]ପୃଷ୍ଠାରେ ରହିପାରିବ ନାହିଁ',
+'editwarning-warning' => 'ଏହି ପୃଷ୍ଠାକୁ ଛାଡ଼ି ଚାଲିଗଲେ ହୁଏ ତ ଆପଣ କରିଥିବା କିଛି ସମ୍ପାଦନା ହରାଇ ପାରନ୍ତି ।
+ଯଦି ଆପଣ ଲଗ ଇନ କରିଥାନ୍ତି ତେବେ ଆପଣଙ୍କ ପସନ୍ଦର "ସମ୍ପାଦନା" ଭାଗରେ ଏହି ଚେତାବନୀଟିକୁ ଅଚଳ କରିପାରିବେ ।',
 
 # Content models
 'content-model-wikitext' => 'ଉଇକିଟେକ୍ସଟ',
@@ -1296,7 +1324,6 @@ $1",
 'searchmenu-legend' => 'ଖୋଜିବା ବିକଳ୍ପ',
 'searchmenu-exists' => "'''ଏହି ଉଇକିରେ \"[[:\$1]]\" ନାଆଁରେ ପୃଷ୍ଠାଟିଏ ଅଛି ।'''",
 'searchmenu-new' => "'''ଏହି ପ୍ରସଙ୍ଗଟି ଆଗରୁ ନାହିଁ, ତେଣୁ ''[[:$1]]'' ନାମରେ ପ୍ରସଙ୍ଗଟିଏ ଏଠାରେ ଗଢ଼ନ୍ତୁ!'''",
-'searchhelp-url' => 'Help:ସୂଚୀ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ଏହି ନାମ ଆଗରୁ ଥିବା ପୃଷ୍ଠାସବୁ ଖୋଜିବେ]]',
 'searchprofile-articles' => 'ସୂଚୀ ପୃଷ୍ଠା',
 'searchprofile-project' => 'ସାହାଯ୍ୟ ଓ ପ୍ରକଳ୍ପ ପୃଷ୍ଠା',
@@ -1341,15 +1368,6 @@ $1",
 ଆପଣ ଏହି ଭିତରେ ଗୁଗଲ ଦେଖିପାରନ୍ତି ।
 ଜାଣିରଖନ୍ତୁ ଯେ {{SITENAME}}ର ବିଷୟ ସୂଚି ପୁରାତନ ହୋଇଥାଇପାରେ ।',
 
-# Quickbar
-'qbsettings' => 'ସହଳ ପଟି (Quickbar)',
-'qbsettings-none' => 'କିଛି ନାହିଁ',
-'qbsettings-fixedleft' => 'ବାମକୁ ଥୟ କରାଗଲା',
-'qbsettings-fixedright' => 'ଡାହାଣକୁ ଥୟ କରାଗଲା',
-'qbsettings-floatingleft' => 'ବାମରେ ଭାସନ୍ତା',
-'qbsettings-floatingright' => 'ଡାହାଣରେ ଭାସନ୍ତା',
-'qbsettings-directionality' => 'ଆପଣଙ୍କ ଭାଷାର ବାମ-ଡାହାଣ ଲିଖନ ଶୈଳୀ ଅନୁସାରେ ସଜାଡ଼ି ଦିଆଗଲା',
-
 # Preferences page
 'preferences' => 'ପସନ୍ଦ',
 'mypreferences' => 'ପସନ୍ଦ',
@@ -1382,7 +1400,6 @@ $1",
 'resetprefs' => 'ସାଇତା ହୋଇନଥିବା ବଦଳ ଲିଭାଇଦେବେ',
 'restoreprefs' => 'ଆପେଆପେ ଥିବା ମୂଳ ସଜାଣିକୁ ଫେରିଯିବେ',
 'prefs-editing' => 'ସମ୍ପାଦନା',
-'prefs-edit-boxsize' => 'ସମ୍ପାଦନା ଘରର ଆକାର ।',
 'rows' => 'ଧାଡ଼ି:',
 'columns' => 'ସ୍ତମ୍ଭସବୁ:',
 'searchresultshead' => 'ଖୋଜିବା',
@@ -1393,9 +1410,6 @@ $1",
 'recentchangesdays-max' => 'ସବୁଠାରୁ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|ଦିନ|ଦିନ}}',
 'recentchangescount' => 'ଆପେଆପେ ଦେଖାଯାଉଥିବା ବଦଳର ସଂଖ୍ୟା:',
 'prefs-help-recentchangescount' => 'ଏଥିରେ ନଗଦ ବଦଳ, ପୃଷ୍ଠାର ଇତିହାସ ଓ ଲଗ ଇତିହାସ ରହିଅଛି ।',
-'prefs-help-watchlist-token' => 'ଏହି ଘରେ ଏକ ଗୋପନ ଲେଖା ଦେଲେ RSS ଫିଡ଼ଟିଏ ଆପଣଙ୍କ ଦେଖଣାତାଲିକାରେ ତିଆରିବ ।
-ଗୋପନ ଲେଖା ଜାଣିଥିବା କେହି ବି ଏହି ଘରେ ଆପଣଙ୍କ ଦେଖଣାତାଲିକା ଦେଖିପାରିବ, ତେଣୁ ଏକ ସୁରକ୍ଷିତ ନାମ ଦିଅନ୍ତୁ ।
-ଏଠାରେ ଏକ ଇଆଡୁ ସିଆଡୁ ନାମ ଆପଣଙ୍କ ଜାଣିବା ପାଇଁ ଦିଆଗଲା: $1',
 'savedprefs' => 'ଆପଣଙ୍କ ପସନ୍ଦସବୁ ସାଇତାଗଲା ।',
 'timezonelegend' => 'ସମୟ ମଣ୍ଡଳ:',
 'localtime' => 'ସ୍ଥାନୀୟ ସମୟ:',
@@ -1426,7 +1440,6 @@ $1",
 'prefs-reset-intro' => 'ଆପଣ ଏହି ପୃଷ୍ଠାଟି ବ୍ୟବହାର କରି ଆପଣା ପସନ୍ଦସବୁକୁ ସାଇଟର ଆରମ୍ଭରେ ଥିବା ସଜାଣିକୁ ଲେଉଟାଇଦେଇପାରିବେ ।
 ଏହାକୁ ପଛକୁ ଫେରାଯାଇପାରିବ ନାହିଁ',
 'prefs-emailconfirm-label' => 'ଇ-ମେଲ ସଜାଣି:',
-'prefs-textboxsize' => 'ସମ୍ପାଦନା ଘରର ଆକାର',
 'youremail' => 'ଇ-ମେଲ:',
 'username' => '{{GENDER:$1|Username}}:',
 'uid' => '{{GENDER:$1|User}} ID:',
@@ -1461,6 +1474,8 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 'prefs-dateformat' => 'ତାରିଖ ସଜାଣି',
 'prefs-timeoffset' => 'ସମୟ ଆରମ୍ଭ',
 'prefs-advancedediting' => 'ସାଧାରଣ ବିକଳ୍ପ',
+'prefs-editor' => 'ସମ୍ପାଦକ',
+'prefs-preview' => 'ଦେଖଣା',
 'prefs-advancedrc' => 'ଉନ୍ନତ ବିକଳ୍ପସମୂହ',
 'prefs-advancedrendering' => 'ଉନ୍ନତ ବିକଳ୍ପସମୂହ',
 'prefs-advancedsearchoptions' => 'ଉନ୍ନତ ବିକଳ୍ପସମୂହ',
@@ -1468,7 +1483,9 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 'prefs-displayrc' => 'ଦେଖଣା ବିକଳ୍ପ',
 'prefs-displaysearchoptions' => 'ଦେଖଣା ବିକଳ୍ପ',
 'prefs-displaywatchlist' => 'ଦେଖଣା ବିକଳ୍ପ',
+'prefs-tokenwatchlist' => 'ଟୋକନ୍‌',
 'prefs-diffs' => 'ତଫାତସବୁ',
+'prefs-help-prefershttps' => 'ଏହି ପସନ୍ଦ ଆପଣଙ୍କ ଲଗ୍ଇନ୍ କରିବାପରେ କାର୍ଯ୍ୟକ୍ଷମ ହେବ ।',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'ଇ-ମେଲ ଠିକଣା ବୈଧ ଭଳି ଲାଗୁଅଛି',
@@ -1668,7 +1685,6 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 'recentchangeslinked-feed' => 'ଯୋଡ଼ାଥିବା ବଦଳ',
 'recentchangeslinked-toolbox' => 'ଯୋଡ଼ାଥିବା ବଦଳ',
 'recentchangeslinked-title' => '"$1" ସାଁଗରେ ଜୋଡ଼ାଥିବା ବଦଳ',
-'recentchangeslinked-noresult' => 'ଯୋଡ଼ାଯାଇଥିବା ପୃଷ୍ଠା ସବୁରେ ଏଇ ସମୟସୀମା ଭିତରେ କିଛି ବଦଳାଯାଇନାହିଁ ।',
 'recentchangeslinked-summary' => "ଏଇଟି କିଛିସମୟ ଆଗରୁ ନିର୍ଦ୍ଦିଷ୍ଟ ପୃଷ୍ଠାରୁ ଲିଙ୍କ ହୋଇଥିବା ଆଉ ବଦଳାଯାଇଥିବା (ଅବା ଗୋଟିଏ ନିର୍ଦ୍ଦିଷ୍ଟ ଶ୍ରେଣୀର) ପୃଷ୍ଠାସବୁର ତାଲିକା ।  [[Special:Watchlist|ମୋର ଦେଖାତାଲିକା]]ର ପୃଷ୍ଠା ସବୁ '''ବୋଲଡ଼'''।",
 'recentchangeslinked-page' => 'ଫରଦର ନାଆଁ',
 'recentchangeslinked-to' => 'ଦିଆଯାଇଥିବା ଫରଦରେ ଯୋଡ଼ା ବାକି ଫରଦମାନଙ୍କର ବଦଳ ସବୁ ଦେଖାନ୍ତୁ ।',
@@ -1904,7 +1920,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization ଦେଖନ୍ତୁ
 'http-read-error' => 'HTTP ପଢ଼ିବା ଭୁଲ ।',
 'http-timed-out' => 'HTTP ଅନୁରୋଧ ମିଆଦ ପୁରିଗଲା ।',
 'http-curl-error' => '$1 URL କୁ ପାଇବାରେ ବିଫଳ',
-'http-host-unreachable' => 'URLଟି ପାଇଲୁ ନାହିଁ ।',
 'http-bad-status' => 'HTTP ଅନୁରୋଧ ବେଳେ କିଛି ଅସୁବିଧା ହେଲା : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2057,12 +2072,6 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 'statistics-users-active-desc' => 'ବିଗତ {{PLURAL:$1|ଦିନରେ|$1 ଦିନରେ}} କିଛି କାମ କରିଥିବା ସଭ୍ୟଗଣ',
 'statistics-mostpopular' => 'ସବୁଠାରୁ ଅଧିକ ଦେଖାଯାଇଥିବା ପୃଷ୍ଠା',
 
-'disambiguations' => 'ବହୁବିକଳ୍ପ ପୃଷ୍ଠାମାନଙ୍କ ସହ ଯୋଡ଼ା ପୃଷ୍ଠା',
-'disambiguationspage' => 'Template:ବହୁବିକଳ୍ପ',
-'disambiguations-text' => "ତଳେ ଥିବା ପୃଷ୍ଠାଗୁଡିକ ଅତିକମରେ ଗୋଟେ ଗୋଟେ '''ବହୁବିକଳ୍ପ ପୃଷ୍ଠା'''କୁ ଯୋଡ଼ିଥାନ୍ତି ।
-ସେସବୁ ଅଧିକ ଉପଯୁକ୍ତ ପ୍ରସଙ୍ଗ ସହ ଯୋଡ଼ାହେବା ଉଚିତ  ।<br />
-[[MediaWiki:Disambiguationspage]] ସହ ଯୋଡ଼ାଥିବା ଛାଞ୍ଚ ବ୍ୟବହାର କରୁଥିଲେ ପୃଷ୍ଠାଟିଏକୁ ବହୁବିକଳ୍ପ ପୃଷ୍ଠା ବୋଲି କୁହାଯାଏ",
-
 'pageswithprop-submit' => 'ଯିବା',
 
 'doubleredirects' => 'ଯୋଡ଼ା ପୁନପ୍ରେରଣ',
@@ -2313,10 +2322,9 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 'unwatchthispage' => 'ଦେଖନ୍ତୁ ନାହିଁ',
 'notanarticle' => 'ବିଷୟବସ୍ତୁର ପୃଷ୍ଠାଟିଏ ନୁହେଁ',
 'notvisiblerev' => 'ଜଣେ ଅଲଗା ବ୍ୟବହାରକାରୀଙ୍କ ଦେଇ କରାଯାଇଥିବା ସେଶ ସଂସ୍କରଣଟି ଲିଭାଇଦିଆଗଲା ।',
-'watchnochange' => 'ଆପଣଙ୍କ ଦେଇ ଦେଖାଯାଇଥିବା ସମୟ ସୀମା ଭିତରେ କୌଣସିଟି ପୃଷ୍ଠାର ବଦଳ କରାଯାଇନାହିଁ ।',
 'watchlist-details' => 'ଆପଣଙ୍କ ଦେଖଣା ତାଲିକାରେ ଆଲୋଚନା ପୃଷ୍ଠାକୁ ଛାଡ଼ି {{PLURAL:$1|$1 ଟି ପୃଷ୍ଠା|$1 ଟି ପୃଷ୍ଠା}} ଅଛି ।',
-'wlheader-enotif' => '* ଇ-ମେଲ ସୂଚନାକୁ ସଚଳ କରାଗଲା ।',
-'wlheader-showupdated' => "* ଆପଣ ଶେଷଥର ଦେଖିଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକ '''ମୋଟା ଅକ୍ଷର'''ରେ ଦେଖାଯାଇଅଛି ।",
+'wlheader-enotif' => 'ଇମେଲ ସୂଚନା ସଚଳ କରାଗଲା ।',
+'wlheader-showupdated' => "ଆପଣ ଶେଷଥର ଦେଖିଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକ '''ମୋଟା ଅକ୍ଷର'''ରେ ଦେଖାଯାଉଅଛି ।",
 'watchmethod-recent' => 'ଏଡଖାଯାଇଥିବା ପୃଷ୍ଠାର ନଗଦ ବଦଳ ପରଖୁଛୁଁ',
 'watchmethod-list' => 'ନଗଦ ବଦଳ ନିମନ୍ତେ ଦେଖାଯାଇଥିବା ପୃଷ୍ଠାମାନ ପରଖୁଛୁଁ',
 'watchlistcontains' => 'ଆପଣଙ୍କ ଦେଖଣାତାଲିକାରେ $1 {{PLURAL:$1|ଗୋଟି ପୃଷ୍ଠା|ଗୋଟି ପୃଷ୍ଠା}} ରହିଅଛି ।',
@@ -2724,12 +2732,9 @@ $1ର ଅଟକ ପାଇଁ ଦିଆଯାଇଥିବା କାରଣଟି 
 ଏହା, $2 ଭିତରେ ଥିବାରୁ ତାହାକୁ ଅଟକରୁ ଛାଡ଼ କରାଯାଇପାରିବ ନାହିଁ ।',
 'ip_range_invalid' => 'ଅଚଳ IP ସୀମା ।',
 'ip_range_toolarge' => '/$1 ଠାରୁ ବଡ଼ ସୀମା ଅଟକ ଅନୁମୋଦିତ ନୁହେଁ ।',
-'blockme' => 'ମୋତେ ଅଟକାଇବେ',
 'proxyblocker' => 'ପ୍ରକ୍ସି ଅଟକ',
-'proxyblocker-disabled' => 'ଏହି କାମଟି ଅଚଳ କରାଯାଇଅଛି ।',
 'proxyblockreason' => 'ଏକ ଖୋଲା ପ୍ରକ୍ସି ହୋଇଥିବାରୁ ଆପଣଙ୍କ IP ଠିକଣାଟିକୁ ଅଟକାଇଦିଆଗଲା ।
 ଦୟାକରି ଆପଣଙ୍କ ଇଣ୍ଟରନେଟ ସେବାପ୍ରଦାନକାରୀ, କାରିଗରି ସହଯୋଗ କିମ୍ବା ସଙ୍ଗଠନ ସହିତ କଥା ହୋଇ ଏହି ବିରାଟ ଅସୁବିଧା ବାବଦରେ ବତାଇଦିଅନ୍ତୁ ।',
-'proxyblocksuccess' => 'ଶେଷ ହେଲା ।',
 'sorbsreason' => '{{SITENAME}} ଦେଇ ଆପଣଙ୍କ IP ଠିକଣାଟି DNSBL ଭିତରେ ଏକ ଖୋଲା ପ୍ରକ୍ସି ଭାବରେ ନଥିଭୁକ୍ତ ହୋଇଅଛି ।',
 'sorbs_create_account_reason' => '{{SITENAME}} ଦେଇ ଆପଣଙ୍କ IP ଠିକଣାଟି DNSBL ଭିତରେ ଏକ ଖୋଲା ପ୍ରକ୍ସି ଭାବରେ ନଥିଭୁକ୍ତ ହୋଇଅଛି ।
 ଆପଣ ନୂଆ ଖାତାଟିଏ ଖୋଲି ପାରିବେ ନାହିଁ',
@@ -3202,6 +3207,11 @@ $1',
 'ago' => '$1 ଆଗରୁ',
 'just-now' => 'ଏବେ ଏବେ',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ଘଣ୍ଟା}} ଆଗରୁ',
+'minutes-ago' => '$1 {{PLURAL:$1|ମିନିଟ|ମିନିଟ}} ଆଗରୁ',
+'seconds-ago' => '$1 {{PLURAL:$1|ସେକେଣ୍ଡ|ସେକେଣ୍ଡ}} ଆଗରୁ',
+
 # Bad image list
 'bad_image_list' => 'ଗଢ଼ଣଟି ଏମିତି ହେବ:
 
@@ -3230,7 +3240,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ଓସାର',
 'exif-imagelength' => 'ଉଚ୍ଚତା',
 'exif-bitspersample' => 'ଉପାଦାନ ପ୍ରତି ବିଟ',
@@ -3408,7 +3418,7 @@ $1',
 'exif-originalimageheight' => 'ଛୋଟ କରାଯିବ ଆଗରୁ ଛବିର ଉଚ୍ଚତା',
 'exif-originalimagewidth' => 'ଛୋଟ କରାଯିବ ଆଗରୁ ଛବିର ଓସାର',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ଅସମ୍ପାଦିତ',
 'exif-compression-2' => 'CCITT ଗୋଠ ୩ ୧-ବିମିୟ ବଦଳାଯାଇଥିବା ହଫମାନ ରନ ଲମ୍ବ ଏନକୋଡ଼ିଙ୍ଗ',
 'exif-compression-3' => 'CCITT ଗୋଠ ୩ ଫାକ୍ସ ଏନକୋଡ଼ିଙ୍ଗ',
@@ -3799,7 +3809,6 @@ $5
 'version-other' => 'ବାକି',
 'version-mediahandlers' => 'ମିଡ଼ିଆ ହ୍ୟାଣ୍ଡଲର',
 'version-hooks' => 'ହୁକ',
-'version-extension-functions' => 'ଏକ୍ସଟେନସନ କାମସବୁ',
 'version-parser-extensiontags' => 'ପାର୍ସର ଏକ୍ସଟେନସନ ଚିହ୍ନ',
 'version-parser-function-hooks' => 'ପାର୍ସର କାମ ହୁକ',
 'version-hook-name' => 'ହୁକ ନାମ',
@@ -3821,13 +3830,6 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'version-entrypoints-header-entrypoint' => 'ପ୍ରବେଶ ବିନ୍ଦୁ',
 'version-entrypoints-header-url' => 'ଇଉଆରଏଲ',
 
-# Special:FilePath
-'filepath' => 'ଫାଇଲ ପଥ',
-'filepath-page' => 'ଫାଇଲ:',
-'filepath-submit' => 'ଯିବା',
-'filepath-summary' => 'ଏହି ବିଶେଷ ପୃଷ୍ଠା ଏକ ଫାଇଲର ପୁରା ପଥ ଦେଖାଇଦିଏ ।
-ଛବିସବୁ ପୁରା ରେଜୋଲୁସନରେ ଦେଖାଇଦିଆଯାଏ, ବାକି ଫାଇଲସବୁ ସେମାନଙ୍କ ସହଯୋଗୀ ପ୍ରଗାମ ମାନଙ୍କ ଦେଇ ଆରମ୍ଭ ହୋଇଥାନ୍ତି ।',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ଏହାର ନକଲ ପୃଷ୍ଠା ଖୋଜିବେ ।',
 'fileduplicatesearch-summary' => 'ହାସ୍ ମୂଲ୍ୟକୁ ନେଇ ଦୁଇଥର ଥିବା ଫାଇଲ ଖୋଜନ୍ତୁ ।',
@@ -3916,6 +3918,8 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'htmlform-submit' => 'ଦାଖଲକରିବା',
 'htmlform-reset' => 'କରାଯାଇଥିବା ବଦଳ ପଛକୁ ଫେରାଇବେ',
 'htmlform-selectorother-other' => 'ବାକି',
+'htmlform-no' => 'ନାହିଁ',
+'htmlform-yes' => 'ହଁ',
 
 # SQLite database support
 'sqlite-has-fts' => 'ପୁରା ଟେକ୍ସ୍ଟ ଖୋଜା ସହଯୋଗ ସହିତ $1',
diff --git a/languages/messages/MessagesOs.php b/languages/messages/MessagesOs.php
index 788eef84..c14f4d6d 100644
--- a/languages/messages/MessagesOs.php
+++ b/languages/messages/MessagesOs.php
@@ -216,9 +216,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Цал архайæджы фарсмæ сæ цæст дарынц, уый равдис',
 'tog-oldsig' => 'Ныры къухæрфыст:',
 'tog-fancysig' => 'Сæвæрын къухæрфыст викитекстæй (æнæ хæдæвзæргæ æрвитæнæй)',
-'tog-externaleditor' => 'Архайын æддаг ивæнæй (æрмæст эксперттæн, домы сæрмагонд æвæрдтытæ компьютерыл. [//www.mediawiki.org/wiki/Manual:External_editors Лæмбынæг.])',
-'tog-externaldiff' => 'Архайын æндæр иртасæнæй (æрмæст эксперттæн, домы сæрмагонд æвæрдтытæ компьютерыл. [//www.mediawiki.org/wiki/Manual:External_editors Лæмбынæг.])',
-'tog-showjumplinks' => 'Тагъд æрвитæнтæй пайда кæн',
 'tog-uselivepreview' => 'Архайын тагъд разбакастæй (домы JavaScript) (эксперименталон)',
 'tog-forceeditsummary' => 'Фæдзæхсæд иу мæ, кæд ивды афыст афтид уа',
 'tog-watchlisthideown' => 'Айсын мæ ивдтытæ цæстдардæй',
@@ -231,6 +228,7 @@ $messages = array(
 'tog-diffonly' => 'Ма æвдис фарсы мидис иртасæны бынмæ',
 'tog-showhiddencats' => 'Æмбæхст категоритæ æвдис',
 'tog-norollbackdiff' => 'Рауадзын иртасæн раздæхты фæстæ',
+'tog-useeditwarning' => 'Зæгъæт-иу мын системæ, æнæ æвæрд архайдимæ ивыны фарс-иу куы æхкæнон',
 
 'underline-always' => 'Алкуыдæр',
 'underline-never' => 'Никуы',
@@ -418,7 +416,7 @@ $1',
 'pool-queuefull' => 'Процессты рад йедзаг у',
 'pool-errorunknown' => 'Æнæбæрæг рæдыд',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} тыххæй',
 'aboutpage' => 'Project:Афыст',
 'copyright' => 'Мидис у гом {{grammar:allative|$1}} гæсгæ.',
@@ -428,7 +426,6 @@ $1',
 'disclaimers' => 'Бæрн',
 'disclaimerpage' => 'Project:Бæрн',
 'edithelp' => 'Ивынæн æххуыс',
-'edithelppage' => 'Help:Ивын',
 'helppage' => 'Help:Мидис',
 'mainpage' => 'Сæйраг фарс',
 'mainpage-description' => 'Сæйраг фарс',
@@ -507,17 +504,6 @@ $1',
 # General errors
 'error' => 'Рæдыд',
 'databaseerror' => 'Рарддоны рæдыд',
-'dberrortext' => 'Рарддонмæ домæны синтаксисы разындис рæдыд.
-Уый гæнæн ис нысан кæны рæдыд софты куысты.
-Фæстаг домæн рарддонмæ уыдис:
-<blockquote><code>$1</code></blockquote>
-сæвзæрдис "<code>$2</code>" функцийæ.
-Рарддон раздæхта ахæм рæдыд: "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Рарддонмæ домæны синтаксисы разындис рæдыд.
-Фæстаг домæн рарддонмæ уыдис:
-"$1"
-сæвзæрдис "$2" функцийæ.
-Рарддон раздæхта ахæм рæдыд: "$3: $4"',
 'laggedslavemode' => "'''Сындæг:''' Фарсы гæнæн ис нæй фæстаг нæуæггæндтæ.",
 'readonly' => 'Рарддон æхгæд у',
 'enterlockreason' => 'Ныффысс æхгæныны бындур æмæ йæ æмгъуыд',
@@ -574,7 +560,6 @@ $1',
 'editinginterface' => "'''Сындæг:''' Ды ивыс ахæм фарс, кæм ис софты интерфейсы текст.
 Ацы фарсы фæивд фæзындзæн ацы викийы алы архайæджы интерфейсыл дæр.
 Алы викийы тæлмæцтæ ивынæн, дæ хорзæхæй, архай [//translatewiki.net/ translatewiki.net-æй], кæцы у MediaWiki-йы локализацигæнæн проект.",
-'sqlhidden' => '(SQL домæн æмбæхст у)',
 'cascadeprotected' => 'Ацы фарс ивынæй æхгæд у уымæн æмæ у æфтыд бындæр цы "каскадон" хъахъхъонд {{PLURAL:$1|фарс ис, уырдæм|фæрстæ сты, уыдонмæ}}:
 $2',
 'namespaceprotected' => "Дæуæн нæй бар ивын фæрстæ '''$1''' номдоны.",
@@ -605,10 +590,18 @@ $2',
 'welcomecreation-msg' => 'Дæ аккаунт арæзт æрцыдис.
 Ма дæ ферох уæт æркæсын дæ [[Special:Preferences|{{grammar:genitive|{{SITENAME}}}} уагæвæрдтæм]].',
 'yourname' => 'Фæсномыг:',
+'userlogin-yourname' => 'Фæсномыг',
+'userlogin-yourname-ph' => 'Бафысс дæ фæсномыг',
 'yourpassword' => 'Пароль:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Бафысс дæ пароль',
+'createacct-yourpassword-ph' => 'Бафысс пароль',
 'yourpasswordagain' => 'Пароль ногæй бафысс:',
+'createacct-yourpasswordagain' => 'Сбæлвырд кæн пароль',
+'createacct-yourpasswordagain-ph' => 'Пароль ногæй бафысс',
 'remembermypassword' => 'Бахъуыды мæ кæнæд ацы браузеры (максимум $1 {{PLURAL:$1|бонмæ}})',
-'securelogin-stick-https' => 'Дарддæр дæр HTTPS-ы уылты, бахизыны фæстæ',
+'userlogin-remembermypassword' => 'Системæйы мæ дар',
+'userlogin-signwithsecure' => 'Æдас бастдзинадæй',
 'yourdomainname' => 'Дæ домен:',
 'password-change-forbidden' => 'Дæ бон нæу пароль фæивын ацы викийы.',
 'externaldberror' => 'Кæнæ аутентификацийы рарддоны рæдыд æрцыдис, кæнæ та дæуæн нæй бар снæуæг кæнын дæ æддаг аккаунт.',
@@ -620,18 +613,38 @@ $2',
 'logout' => 'Рахизын',
 'userlogout' => 'Рахизын',
 'notloggedin' => 'Системæмæ хызт нæ дæ',
+'userlogin-noaccount' => 'Нæй дын аккаунт?',
+'userlogin-joinproject' => 'Баиу у {{grammar:comitative|{{SITENAME}}}}',
 'nologin' => 'Регистрацигонд нæма дæ? $1.',
 'nologinlink' => 'Регистраци',
 'createaccount' => 'Регистраци кæнын',
 'gotaccount' => 'Регистрацигонд дæ? $1.',
 'gotaccountlink' => 'Бахизын',
 'userlogin-resetlink' => 'Ферох дæ сты дæ бахизæнтæ?',
+'userlogin-resetpassword-link' => 'Дæ пароль ногæй сæвæр',
+'helplogin-url' => 'Help:Бахизын',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Бахизынæн æххуыс]]',
+'createacct-join' => 'Дæ информаци дæлдæр бафысс.',
+'createacct-emailrequired' => 'Электрон посты адрис',
+'createacct-emailoptional' => 'Электрон посты адрис (фæндон)',
+'createacct-email-ph' => 'Бафысс дæ электрон посты адрис',
 'createaccountmail' => 'Рæстæгмæ пароль халæй ист æрцæуæт æмæ бындæр цы электрон пост ис, уырдæм æрвыст æрцæуæт',
+'createacct-realname' => 'Æцæг ном (фæндон)',
 'createaccountreason' => 'Бындур:',
+'createacct-reason' => 'Бындур',
+'createacct-reason-ph' => 'Цæмæн аразыс æндæр аккаунт?',
+'createacct-captcha' => 'Æдасдзинад бæлвырдгæнæн',
+'createacct-imgcaptcha-ph' => 'Уæлдæр цы текст уыныс, уый бафысс',
+'createacct-submit' => 'Сараз дæ аккаунт',
+'createacct-benefit-heading' => '{{SITENAME}} сарæзтой дæ хуызæн адæм.',
+'createacct-benefit-body1' => '{{PLURAL:$1|ивд|ивды}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|фарс|фарсы}}',
+'createacct-benefit-body3' => 'фæстаг {{PLURAL:$1|архайæг|архайæджы}}',
 'badretype' => 'Цы паролтæ бафыстай, уыдон æмхуызæн не сты.',
 'userexists' => 'Уыцы фæсномыг нæвдæлон у.
 Дæ хорзæхæй, равзар æндæр.',
 'loginerror' => 'Бахизыны рæдыд',
+'createacct-error' => 'Аккаунт аразыны рæдыд',
 'createaccounterror' => 'Нæ рауадис аккаунт саразын: $1',
 'nocookiesnew' => 'Аккаунт арæзт æрцыдис, фæлæ ды нырмæ нæ дæ хызт мидæмæ. 
 {{SITENAME}} архайы cookies-æй цæмæй архайджыты æвзара.
@@ -714,7 +727,7 @@ $2',
 'newpassword' => 'Нæуæг пароль:',
 'retypenew' => 'Ног пароль ногæй бафысс:',
 'resetpass_submit' => 'Пароль сæвæрын æмæ системæмæ бахизын',
-'resetpass_success' => 'Дæ пароль ивд æрцыд!
+'changepassword-success' => 'Дæ пароль ивд æрцыд!
 Ныр ды хизыс системæмæ...',
 'resetpass_forbidden' => 'Паролæн баивæн нæй',
 'resetpass-no-info' => 'Ды хъуамæ системæмæ хызт уай, цæмæй ацы фарсмæ комкоммæ бавналай.',
@@ -727,10 +740,9 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Пароль раппарæн',
-'passwordreset-text' => 'Байдзаг кæн ацы формæ, цæмæй райсай дæ пароль ногæй сæвæрай.',
 'passwordreset-legend' => 'Пароль раппарын',
 'passwordreset-disabled' => 'Парол фæлварын ацы викийы хицæн у.',
-'passwordreset-pretext' => '{{PLURAL:$1||Дæлдæр цы рардты хæйттæ ис, уыдонæй иу бафысс}}',
+'passwordreset-emaildisabled' => 'Электрон пост ацы викийы хицæн у.',
 'passwordreset-username' => 'Фæсномыг:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Цы e-mail рауадис, уый æвдыст æрцæуæт?',
@@ -753,7 +765,7 @@ $2
 Рæстæгмæ пароль: $2',
 'passwordreset-emailsent' => 'Ног пароль сæвæрыны фыстæг æрвыст æрцыд.',
 'passwordreset-emailsent-capture' => 'Ног пароль сæвæрыны фыстæг æрвыст æрцыд æмæ бындæр æвдыст у.',
-'passwordreset-emailerror-capture' => 'Æрхъуыдыгæнæн e-mail арæзт æрцыд æмæ бындæр æвдыст у. Фæлæ йæ арвитын нæ бантыстис: $1',
+'passwordreset-emailerror-capture' => 'Ног пароль сæвæрыны фыстæг арæзт æрцыд æмæ бындæр æвдыст у. Фæлæ йæ {{grammar:allative|{{GENDER:$2|user}}}} арвитын нæ бантыстис: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-mail адрис фæивын',
@@ -1028,7 +1040,6 @@ ASCII нысæнттæм чи нæ хауы, уыдон ивыны бынаты
 'viewprevnext' => 'Кæсын ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Ацы викийы ис фарс \"[[:\$1]]\" номимæ.'''",
 'searchmenu-new' => "'''Сараз фарс \"[[:\$1]]\" ацы викийы!'''",
-'searchhelp-url' => 'Help:Мидис',
 'searchprofile-articles' => 'Мидисы фæрстæ',
 'searchprofile-project' => 'Æххуыс æмæ Проекты фæрстæ',
 'searchprofile-images' => 'Мультимеди',
@@ -1058,13 +1069,6 @@ ASCII нысæнттæм чи нæ хауы, уыдон ивыны бынаты
 'powersearch-field' => 'Агуырд',
 'powersearch-toggleall' => 'Иууылдæр',
 
-# Quickbar
-'qbsettings' => 'Навигацион таг',
-'qbsettings-none' => 'Ма равдис',
-'qbsettings-fixedleft' => 'Галиуырдыгæй',
-'qbsettings-fixedright' => 'Рахизырдыгæй',
-'qbsettings-floatingleft' => 'Рахизырдыгæй ленккæнгæ',
-
 # Preferences page
 'preferences' => 'Уагæвæрдтæ',
 'mypreferences' => 'Уагæвæрдтæ',
@@ -1234,7 +1238,6 @@ $3',
 'recentchangeslinked-feed' => 'Баст ивдтытæ',
 'recentchangeslinked-toolbox' => 'Баст ивдтытæ',
 'recentchangeslinked-title' => '"{{grammar:comitative|$1}}" баст ивдтытæ',
-'recentchangeslinked-noresult' => 'Нæй баст фæрсты ивдтытæ амынд рæстæджы',
 'recentchangeslinked-summary' => "Адон сты фæстаг рæстæджы ивдтытæ ахæм уацты, кæдонмæ æрвиты амынд фарс (кæнæ амынд категорийы уæнгтæ). [[Special:Watchlist|Дæ цæстдард фæрстæ]] сты '''бæзджынæй''' нысангонд.",
 'recentchangeslinked-page' => 'Фарсы ном:',
 'recentchangeslinked-to' => 'Уый бæсты равдисæт амынд фарсмæ æрвитгæ фæрсты ивдтытæ',
@@ -1322,8 +1325,6 @@ $3',
 'statistics-header-hooks' => 'Æндæр статистикæтæ',
 'statistics-articles' => 'Мидисы фæрстæ',
 
-'disambiguationspage' => 'Template:бирæнысанон',
-
 'double-redirect-fixer' => 'Рарвыст растгæнæн',
 
 'brokenredirects-edit' => 'ивын',
@@ -1427,7 +1428,6 @@ $3',
 'watch' => 'Цæст æрдарын',
 'watchthispage' => 'Цæст дарын ацы фарсмæ',
 'unwatch' => 'Нал дарын цæст',
-'watchnochange' => 'Дæ цæстдард уацтæй иу дæр ивд не ’рцыдис.',
 'watchlist-details' => '{{PLURAL:$1|$1 фарсмæ|$1 фарсмæ}} дæ цæст дарыс, тæрхоны фæрстæ нæ нымайгæйæ.',
 'watchlistcontains' => 'Дæ цæст $1 {{PLURAL:$1|фарсмæ|фарсмæ}} дарыс.',
 'wlnote' => "Дæлæ афæстаг '''$2 сахаты дæргъы''' цы $1 {{PLURAL:$1|ивддзинад|ивддзинады}} æрцыди.",
@@ -1657,12 +1657,8 @@ $3',
 'spamprotectiontitle' => 'Спамы ныхмæ фильтр',
 
 # Skin names
-'skinname-standard' => 'Стандартон',
-'skinname-nostalgia' => 'Æнкъард',
 'skinname-cologneblue' => 'Кёльны æрхæндæг',
 'skinname-monobook' => 'Моно-чиныг',
-'skinname-myskin' => 'Мæхи',
-'skinname-chick' => 'Карк',
 
 # Browsing diffs
 'previousdiff' => '← Зæронддæр ивд',
@@ -1711,7 +1707,7 @@ $3',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Уæрх',
 'exif-imagelength' => 'Бæрзæнд',
 'exif-artist' => 'Автор',
@@ -1797,11 +1793,6 @@ $3',
 'version-poweredby-others' => 'æндæртæ',
 'version-software-version' => 'Верси',
 
-# Special:FilePath
-'filepath' => 'Файлмæ фæт',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Бацæуын',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Файлы ном:',
 'fileduplicatesearch-submit' => 'Агурын',
diff --git a/languages/messages/MessagesPa.php b/languages/messages/MessagesPa.php
index 343574c3..c3b48e16 100644
--- a/languages/messages/MessagesPa.php
+++ b/languages/messages/MessagesPa.php
@@ -61,13 +61,13 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
-	'Activeusers'               => array( 'ਸਰਗਰਮ_ਮੈਂਬਰ' ),
+	'Activeusers'               => array( 'ਸਰਗਰਮ_ਵਰਤੋਂਕਾਰ' ),
 	'Allmessages'               => array( 'ਸਾਰੇ_ਸਨੇਹੇ' ),
 	'Allpages'                  => array( 'ਸਾਰੇ_ਪੰਨੇ' ),
 	'Ancientpages'              => array( 'ਪੁਰਾਣੇ_ਪੰਨੇ' ),
-	'Badtitle'                  => array( 'ਖਰਾਬ_ਸਿਰਲੇਖ' ),
-	'Blankpage'                 => array( 'ਖਾਲੀ_ਪੰਨਾ' ),
-	'Block'                     => array( 'ਪਾਬੰਦੀ_ਲਾਓ', 'IP_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ', 'ਮੈਂਬਰ_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ' ),
+	'Badtitle'                  => array( 'ਖ਼ਰਾਬ_ਸਿਰਲੇਖ' ),
+	'Blankpage'                 => array( 'ਖ਼ਾਲੀ_ਪੰਨਾ' ),
+	'Block'                     => array( 'ਪਾਬੰਦੀ_ਲਾਓ', 'IP_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ', 'ਵਰਤੋਂਕਾਰ_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ' ),
 	'Blockme'                   => array( 'ਮੇਰੇ_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ' ),
 	'Booksources'               => array( 'ਕਿਤਾਬ_ਸਰੋਤ' ),
 	'BrokenRedirects'           => array( 'ਟੁੱਟੇ_ਰੀਡਿਰੈਕਟ' ),
@@ -83,7 +83,7 @@ $specialPageAliases = array(
 	'Disambiguations'           => array( 'ਗੁੰਝਲਖੋਲ੍ਹ' ),
 	'DoubleRedirects'           => array( 'ਦੂਹਰੇ_ਰੀਡਿਰੈਕਟ' ),
 	'EditWatchlist'             => array( 'ਨਿਗਰਾਨੀ-ਲਿਸਟ_ਸੋਧੋ' ),
-	'Emailuser'                 => array( 'ਮੈਂਬਰ_ਨੂੰ_ਈ-ਮੇਲ_ਕਰੋ' ),
+	'Emailuser'                 => array( 'ਵਰਤੋਂਕਾਰ_ਨੂੰ_ਈ-ਮੇਲ_ਕਰੋ' ),
 	'Export'                    => array( 'ਨਿਰਯਾਤ' ),
 	'Fewestrevisions'           => array( 'ਸਭ_ਤੋਂ_ਘੱਟ_ਰੀਵਿਜ਼ਨਾਂ' ),
 	'FileDuplicateSearch'       => array( 'ਨਕਲੀ_ਫ਼ਾਈਲ_ਖੋਜੋ' ),
@@ -133,14 +133,14 @@ $specialPageAliases = array(
 	'Revisiondelete'            => array( 'ਰੀਵਿਜਨ_ਮਿਟਾਓ' ),
 	'Search'                    => array( 'ਖੋਜੋ' ),
 	'Shortpages'                => array( 'ਛੋਟੇ_ਪੰਨੇ' ),
-	'Specialpages'              => array( 'ਖਾਸ_ਪੰਨੇ' ),
+	'Specialpages'              => array( 'ਖ਼ਾਸ_ਪੰਨੇ' ),
 	'Statistics'                => array( 'ਅੰਕੜੇ' ),
 	'Tags'                      => array( 'ਟੈਗ' ),
 	'Unblock'                   => array( 'ਪਾਬੰਦੀ_ਹਟਾਓ' ),
 	'Uncategorizedcategories'   => array( 'ਸ਼੍ਰੇਣੀਹੀਣ_ਸ਼੍ਰੇਣੀਆਂ' ),
 	'Uncategorizedimages'       => array( 'ਸ਼੍ਰੇਣੀਹੀਣ_ਫ਼ਾਈਲਾਂ' ),
 	'Uncategorizedpages'        => array( 'ਸ਼੍ਰੇਣੀਹੀਣ_ਪੰਨੇ' ),
-	'Uncategorizedtemplates'    => array( 'ਸ਼੍ਰੇਣੀਹੀਣ_ਸਾਂਚੇ' ),
+	'Uncategorizedtemplates'    => array( 'ਸ਼੍ਰੇਣੀਹੀਣ_ਫਰਮੇ' ),
 	'Undelete'                  => array( 'ਅਣ-ਹਟਾਓਣ' ),
 	'Unlockdb'                  => array( 'ਡੈਟਾਬੇਸ_ਖੋਲ੍ਹੋ' ),
 	'Unusedcategories'          => array( 'ਅਣਵਰਤੀਆਂ_ਸ਼੍ਰੇਣੀਆਂ' ),
@@ -148,9 +148,9 @@ $specialPageAliases = array(
 	'Unusedtemplates'           => array( 'ਅਣਵਰਤੇ_ਫਰਮੇ' ),
 	'Unwatchedpages'            => array( 'ਬੇ-ਨਿਗਰਾਨ_ਪੰਨੇ' ),
 	'Upload'                    => array( 'ਅੱਪਲੋਡ' ),
-	'Userlogin'                 => array( 'ਮੈਂਬਰ_ਲਾਗਇਨ' ),
-	'Userlogout'                => array( 'ਮੈਂਬਰ_ਲਾਗਆਊਟ' ),
-	'Userrights'                => array( 'ਮੈਂਬਰ_ਹੱਕ', 'ਪ੍ਰਬੰਧਕ_ਬਣਾਓ', 'ਬੋਟ_ਬਣਾਓ' ),
+	'Userlogin'                 => array( 'ਵਰਤੋਂਕਾਰ_ਲਾਗਇਨ' ),
+	'Userlogout'                => array( 'ਵਰਤੋਂਕਾਰ_ਲਾਗਆਊਟ' ),
+	'Userrights'                => array( 'ਵਰਤੋਂਕਾਰ_ਹੱਕ', 'ਪ੍ਰਬੰਧਕ_ਬਣਾਓ', 'ਬੋਟ_ਬਣਾਓ' ),
 	'Version'                   => array( 'ਰੂਪ' ),
 	'Wantedcategories'          => array( 'ਚਾਹੀਦੀਆਂ_ਸ਼੍ਰੇਣੀਆਂ' ),
 	'Wantedfiles'               => array( 'ਚਾਹੀਦੀਆਂ_ਫ਼ਾਈਲਾਂ' ),
@@ -218,16 +218,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ਨਜ਼ਰ ਰੱਖ ਰਹੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀ ਗਿਣਤੀ ਵਖਾਓ',
 'tog-oldsig' => 'ਮੌਜੂਦਾ ਦਸਤਖ਼ਤ:',
 'tog-fancysig' => 'ਦਸਤਖ਼ਤ ਨੂੰ ਬਤੌਰ ਵਿਕੀਲਿਖਤ ਮੰਨੋ (ਬਿਨਾਂ ਆਟੋਮੈਟਿਕ ਲਿੰਕ)',
-'tog-externaleditor' => 'ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਬਾਹਰੀ ਸੋਧਕ ਵਰਤੋ (ਸਿਰਫ਼ ਮਾਹਿਰਾਂ ਲਈ ਹੈ, ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਤੇ ਖ਼ਾਸ ਸੈਟਿੰਗਾਂ ਲੋੜੀਂਦੀਆਂ ਹਨ। [//
-www.mediawiki.org/wiki/
-Manual:External_editors More
-information.])',
-'tog-externaldiff' => 'ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਬਾਹਰੀ ਫ਼ਰਕ ਵਰਤੋ (ਸਿਰਫ਼
-ਮਾਹਿਰਾਂ ਲਈ ਹੈ, ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਤੇ ਖ਼ਾਸ
-ਸੈਟਿੰਗਾਂ ਲੋੜੀਂਦੀਆਂ ਹਨ। [//
-www.mediawiki.org/wiki/
-Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
-'tog-showjumplinks' => '"ਇਸ ’ਤੇ ਜਾਓ" ਅਸੈਸਬਿਲਟੀ ਲਿੰਕ ਚਾਲੂ ਕਰੋ',
 'tog-uselivepreview' => 'ਸਿੱਧੀ ਝਲਕ ਵਰਤੋ (ਤਜਰਬੇ-ਅਧੀਨ)',
 'tog-forceeditsummary' => 'ਜਦੋਂ ਮੈਂ ਖ਼ਾਲੀ ਸੋਧ ਸਾਰ ਦੇਵਾਂ ਤਾਂ ਮੈਨੂੰ ਆਗਾਹ ਕਰੋ',
 'tog-watchlisthideown' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚੋਂ ਮੇਰੀਆਂ ਸੋਧਾਂ ਲੁਕਾਓ',
@@ -240,6 +230,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'tog-diffonly' => 'ਫ਼ਰਕ ਤੋਂ ਹੇਠ ਸਫ਼ੇ ਦੀ ਸਮੱਗਰੀ ਨਾ ਵਖਾਓ',
 'tog-showhiddencats' => 'ਲੁਕਵੀਆਂ ਸ਼੍ਰੇਣੀਆਂ ਵਖਾਓ',
 'tog-norollbackdiff' => '"ਵਾਪਸ ਮੋੜੋ" ਅਮਲ ਵਿਚ ਲਿਆਣ ਮਗਰੋਂ ਫ਼ਰਕ ਨਾ ਵਖਾਓ',
+'tog-useeditwarning' => 'ਜਦੋਂ ਮੈਂ ਅਣ-ਸਾਂਭੀਆਂ ਸੋਧਾਂ ਵਾਲਾ ਸਫ਼ਾ ਛੱਡਾਂ ਤਾਂ ਮੈਨੂੰ ਖ਼ਬਰ ਦਿਉ',
 
 'underline-always' => 'ਹਮੇਸ਼ਾਂ',
 'underline-never' => 'ਕਦੇ ਨਹੀਂ',
@@ -303,6 +294,18 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'oct' => 'ਅਕ',
 'nov' => 'ਨਵ',
 'dec' => 'ਦਸ',
+'january-date' => '$1 ਜਨਵਰੀ',
+'february-date' => '$1 ਫ਼ਰਵਰੀ',
+'march-date' => '$1 ਮਾਰਚ',
+'april-date' => '$1 ਅਪ੍ਰੈਲ',
+'may-date' => '$1 ਮਈ',
+'june-date' => '$1 ਜੂਨ',
+'july-date' => '$1 ਜੁਲਾਈ',
+'august-date' => '$1 ਅਗਸਤ',
+'september-date' => '$1 ਸਤੰਬਰ',
+'october-date' => '$1 ਅਕਤੂਬਰ',
+'november-date' => '$1 ਨਵੰਬਰ',
+'december-date' => '$1 ਦਸੰਬਰ',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|ਸ਼੍ਰੇਣੀ|ਸ਼੍ਰੇਣੀਆਂ}}',
@@ -384,6 +387,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'create-this-page' => 'ਇਹ ਸਫ਼ਾ ਬਣਾਓ',
 'delete' => 'ਹਟਾਓ',
 'deletethispage' => 'ਇਹ ਸਫ਼ਾ ਹਟਾਓ',
+'undeletethispage' => 'ਇਹ ਸਫ਼ਾ ਅਣ-ਮਿਟਿਆ ਕਰੋ',
 'undelete_short' => '{{PLURAL:$1|ਇੱਕ ਸੋਧ|$1 ਸੋਧਾਂ}} ਹਟਾਉਣਾ-ਵਾਪਸ',
 'viewdeleted_short' => '{{PLURAL:$1|ਹਟਾਈ ਸੋਧ|$1 ਹਟਾਈਆਂ ਸੋਧਾਂ}} ਵੇਖੋ',
 'protect' => 'ਸੁਰੱਖਿਆ',
@@ -426,7 +430,7 @@ $1',
 'pool-queuefull' => 'ਪੂਲ ਕਤਾਰ ਭਰੀ ਹੋਈ ਹੈ',
 'pool-errorunknown' => 'ਅਣਜਾਣ ਗਲਤੀ',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} ਬਾਰੇ',
 'aboutpage' => 'Project:ਬਾਰੇ',
 'copyright' => 'ਸਮੱਗਰੀ $1 ਹੇਠ ਉਪਲੱਬਧ ਹੈ।',
@@ -436,7 +440,6 @@ $1',
 'disclaimers' => 'ਦਾਅਵੇ',
 'disclaimerpage' => 'Project:ਆਮ ਦਾਅਵੇ',
 'edithelp' => 'ਸੋਧ ਸਬੰਧੀ ਮਦਦ',
-'edithelppage' => 'Help:ਸੋਧ',
 'helppage' => 'Help:ਸਮੱਗਰੀ',
 'mainpage' => 'ਮੁੱਖ ਸਫ਼ਾ',
 'mainpage-description' => 'ਮੁੱਖ ਸਫ਼ਾ',
@@ -513,15 +516,6 @@ $1',
 # General errors
 'error' => 'ਗ਼ਲਤੀ',
 'databaseerror' => 'ਡਾਟਾਬੇਸ ਗਲਤੀ',
-'dberrortext' => 'ਡਾਟਾਬੇਸ ਪੁ੍ਛ-ਗਿੱਛ ਦੀਆਂ ਹਿਦਾਇਤਾਂ ਵਿਚ ਦੋਸ਼ ਆਇਆ ਹੈ।
-ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਦੋਸ਼ ਸਾਫ਼ਟਵੇਅਰ ਦਾ ਹੋਵੇ।
-ਡਾਟਾਬੇਸ ਪੁਛ-ਗਿੱਛ ਦੀ ਆਖ਼ਰੀ ਕੋਸ਼ਿਸ਼ ਸੀ:
-<blockquote><code>$1</code></blockquote>
-"<code>$2</code>" ਫੰਕਸ਼ਨ ਵਿੱਚੋਂ।
-ਡਾਟਾਬੇਸ ਨੇ "<samp>$3: $4</samp>" ਦੋਸ਼ ਕੱਢਿਆ।',
-'dberrortextcl' => 'ਡੈਟਾਬੇਸ ਪੁੱਛਗਿੱਛ ਵਿਚ ਹਿਦਾਇਤ ਗਲਤੀ ਮਿਲੀ ਹੈ।
-ਫੰਕਸ਼ਨ "$2" ਤੋਂ ਪਿਛਲੀ ਡਾਟਬਾਸ ਪੁੱਛ ਗਿੱਛ ਸੀ: "$1".
-ਡੈਟਾਬੇਸ ਨੇ ਇਹ ਗਲਤੀ "$3:$4" ਦਿੱਤੀ',
 'laggedslavemode' => "'''ਖ਼ਬਰਦਾਰ:''' ਹੋ ਸਕਦਾ ਹੈ ਸਫ਼ੇ ਵਿਚ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਸ਼ਾਮਲ ਨਾ ਹੋਣ।",
 'readonly' => 'ਡਾਟਾਬੇਸ ਨੂੰ ਤਾਲ਼ਾ ਲੱਗਿਆ ਹੋਇਆ ਹੈ',
 'enterlockreason' => 'ਤਾਲਾ-ਬੰਦੀ ਲਈ ਕਾਰਨ ਦਾਖ਼ਲ ਕਰੋ, ਨਾਲ਼ ਹੀ ਤਾਲਾ-ਬੰਦੀ ਦੇ ਰਿਲੀਜ਼ ਹੋਣ ਦਾ ਅੰਦਾਜ਼ਨ ਵਕਤ',
@@ -572,12 +566,15 @@ $1',
 ਸਾਰੇ ਵਿਕੀਆਂ ਲਈ ਅਨੁਵਾਦ ਜੋੜਨ ਜਾਂ ਬਦਲਣ ਲਈ [//translatewiki.net/ translatewiki.net], ਮੀਡੀਆਵਿਕੀ ਸਥਾਨੀਕਰਨ ਪ੍ਰੋਜੈਕਟ ਦੀ ਵਰਤੋਂ ਕਰੋ ਜੀ।',
 'editinginterface' => "'''ਚਿਤਾਵਨੀ''' ਤੁਸੀਂ ਐਸੇ ਸਫ਼ੇ ਨੂੰ ਬਦਲ ਰਹੇ ਹੋ ਜੋ ਸਾਫ਼ਟਵੇਅਰ ਇੰਟਰਫ਼ੇਸ ਦੇ ਮੂਲ ਪਾਠ ਲਈ ਵਰਤਿਆ ਗਿਆ ਹੈ।
 ਇਸ ਸਫ਼ੇ ਵਿਚਲੀ ਤਬਦੀਲੀ ਦੂਜੇ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਵਰਤੇ ਜਾਣ ਵਾਲੇ ਇੰਟਰਫ਼ੇਸ ਦੀ ਸ਼ਕਲ ’ਤੇ ਅਸਰ ਪਾ ਦੇਵੇਗੀ। ਉਲਥਾ ਕਰਨ ਲਈ ਕਿਰਪਾ ਕਰਕੇ [//translatewiki.net/wiki/Main_Page?setlang=pa ਟ੍ਰਾਂਸਲੇਟਵਿਕੀ.ਨੈਟ] ਦੀ ਵਰਤੋਂ ਕਰੋ, ਇਹ ਮੀਡੀਆਵਿਕੀ ਦੀ ਸਥਾਨੀਕਰਨ ਪ੍ਰੋਜੈਕਟ ਹੈ।",
-'sqlhidden' => '(SQL ਪੁਛ-ਗਿੱਛ ਲੁਕੀ ਹੋਈ ਹੈ)',
 'cascadeprotected' => 'ਇਹ ਸਫ਼ਾ ਸੁਰੱਖਿਅਤ ਹੈ, ਕਿਉਂਕਿ ਇਹ ਹੇਠ ਲਿਖੇ {{PLURAL:$1|ਸਫ਼ੇ|ਸਫ਼ਿਆਂ}} ਦੀ ਸੁਰੱਖਿਆ-ਪੌੜੀ ਵਿੱਚ ਸ਼ਾਮਲ ਹੈ:
 $2',
 'namespaceprotected' => "ਤੁਹਾਨੂੰ '''$1''' ਥਾਂ-ਨਾਮ ਵਾਲ਼ੇ ਸਫ਼ਿਆਂ ਵਿਚ ਫੇਰ-ਬਦਲ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।",
 'customcssprotected' => 'ਤੁਹਾਨੂੰ ਇਸ CSS ਸਫ਼ੇ ਵਿਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਇਸ ਵਿਚ ਕਿਸੇ ਹੋਰ ਮੈਂਬਰ ਦੀਆਂ ਨਿੱਜੀ ਸੈਟਿੰਗਾਂ ਹਨ।',
 'customjsprotected' => 'ਤੁਹਾਨੂੰ ਇਸ CSS ਸਫ਼ੇ ਵਿਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਇਸ ਵਿਚ ਕਿਸੇ ਹੋਰ ਮੈਂਬਰ ਦੀਆਂ ਨਿੱਜੀ ਸੈਟਿੰਗਾਂ ਹਨ।',
+'mycustomcssprotected' => 'ਤੁਹਾਨੂੰ ਇਸ CSS ਸਫ਼ੇ ਵਿੱਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
+'mycustomjsprotected' => 'ਤੁਹਾਨੂੰ ਇਸ ਜਾਵਾਸਕਰਿਪਟ ਸਫ਼ੇ ਵਿੱਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
+'myprivateinfoprotected' => 'ਤੁਹਾਨੂੰ ਆਪਣੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਵਿੱਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
+'mypreferencesprotected' => 'ਤੁਹਾਨੂੰ ਆਪਣੀਆਂ ਪਸੰਦਾਂ ਵਿੱਚ ਸੋਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
 'ns-specialprotected' => 'ਖ਼ਾਸ ਸਫ਼ਿਆਂ ’ਚ ਫੇਰ-ਬਦਲ ਨਹੀਂ ਹੋ ਸਕਦੇ।',
 'titleprotected' => 'ਇਹ ਸਿਰਲੇਖ [[User:$1|$1]] ਵੱਲੋਂ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਵਰਤਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ। ਦਿੱਤਾ ਹੋਇਆ ਕਾਰਨ ਹੈ, "\'\'$2\'\'"।',
 'filereadonlyerror' => '"$1" ਫ਼ਾਈਲ ਵਿੱਚ ਤਬਦੀਲੀ ਨਹੀਂ ਹੋ ਰਹੀ ਕਿਉਂਕਿ ਫ਼ਾਈਲ ਭੰਡਾਰ "$2" ਸਿਰਫ਼ ਪੜ੍ਹਨਯੋਗ ਰੂਪ ਵਿਚ ਹੈ।
@@ -601,10 +598,19 @@ $2',
 'welcomeuser' => '$1 ਜੀ ਆਇਆਂ ਨੂੰ!',
 'welcomecreation-msg' => 'ਤੁਹਾਡਾ ਖਾਤਾ ਬਣ ਚੁੱਕਾ ਹੈ। ਆਪਣੀਆਂ [[Special:Preferences|{{SITENAME}} ਪਸੰਦ]] ਬਦਲਣੀ ਨਾ ਭੁੱਲੋ।',
 'yourname' => 'ਵਰਤੋਂਕਾਰ-ਨਾਂ:',
+'userlogin-yourname' => 'ਯੂਜ਼ਰ-ਨਾਂ',
+'userlogin-yourname-ph' => 'ਆਪਣਾ ਯੂਜ਼ਰ-ਨਾਂ ਭਰੋ',
+'createacct-another-username-ph' => 'ਯੂਜ਼ਰ ਨਾਂ ਦਿਓ',
 'yourpassword' => 'ਪਾਸਵਰਡ:',
+'userlogin-yourpassword' => 'ਪਾਸਵਰਡ',
+'userlogin-yourpassword-ph' => 'ਆਪਣਾ ਪਾਸਵਰਡ ਦਿਉ',
+'createacct-yourpassword-ph' => 'ਪਾਸਵਰਡ ਦਿਉ',
 'yourpasswordagain' => 'ਪਾਸਵਰਡ ਮੁੜ ਲਿਖੋ:',
+'createacct-yourpasswordagain' => 'ਪਾਸਵਰਡ ਪੁਸ਼ਟੀ',
+'createacct-yourpasswordagain-ph' => 'ਪਾਸਵਰਡ ਫੇਰ ਦਿਉ',
 'remembermypassword' => 'ਇਸ ਕੰਪਿਊਟਰ ’ਤੇ ਮੇਰਾ ਦਾਖ਼ਲਾ ਯਾਦ ਰੱਖੋ (ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ)',
-'securelogin-stick-https' => 'ਦਾਖ਼ਲ ਕਰਨ ਮਗਰੋਂ HTTPS ਨਾਲ ਜੁੜੇ ਰਹੋ',
+'userlogin-remembermypassword' => 'ਮੈਨੂੰ ਲਾਗਇਨ ਰੱਖੋ',
+'userlogin-signwithsecure' => 'ਸੁਰੱਖਿਅਤ ਕੁਨੈਕਸ਼ਨ ਰੱਖੋ',
 'yourdomainname' => 'ਤੁਹਾਡਾ ਡੋਮੇਨ:',
 'password-change-forbidden' => 'ਇਸ ਵਿਕੀ ਤੇ ਤੁਸੀਂ ਪਾਸਵਰਡ ਨਹੀਂ ਬਦਲ ਸਕਦੇ।',
 'externaldberror' => 'ਜਾਂ ਤਾਂ ਪ੍ਰਮਾਣਕੀ ਡਾਟਾਬੇਸ ਦੋਸ਼ ਆਇਆ ਹੈ ਜਾਂ ਤੁਹਾਨੂੰ ਆਪਣੇ ਬਾਹਰੀ ਖਾਤੇ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
@@ -616,17 +622,40 @@ $2',
 'logout' => 'ਲਾਗ ਆਉਟ',
 'userlogout' => 'ਲਾਗ ਆਉਟ',
 'notloggedin' => 'ਲਾਗਇਨ ਨਹੀਂ ਹੋ',
+'userlogin-noaccount' => 'ਖਾਤਾ ਨਹੀਂ ਹੈ?',
+'userlogin-joinproject' => '{{SITENAME}} ਦਾ ਹਿੱਸਾ ਬਣੋ',
 'nologin' => 'ਖਾਤਾ ਨਹੀਂ ਹੈ? $1।',
 'nologinlink' => 'ਖਾਤਾ ਬਣਾਓ',
 'createaccount' => 'ਖਾਤਾ ਬਣਾਓ',
 'gotaccount' => 'ਖਾਤਾ ਪਹਿਲਾਂ ਹੀ ਹੈ? $1',
 'gotaccountlink' => 'ਲਾਗਇਨ',
 'userlogin-resetlink' => 'ਆਪਣੀ ਲਾਗਇਨ ਜਾਣਕਾਰੀ ਭੁੱਲ ਗਏ ਹੋ?',
+'userlogin-resetpassword-link' => 'ਆਪਣਾ ਪਾਸਵਰਡ ਫੇਰ ਬਣਾਓ',
+'helplogin-url' => 'Help: ਲਾਗਇਨ ਕਰਨਾ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ਲਾਗਇਨ ਹੋਣ ਲਈ ਮੱਦਦ]]',
+'createacct-join' => 'ਆਪਣੀ ਜਾਣਕਾਰੀ ਹੇਠਾਂ ਦਿਉ।',
+'createacct-another-join' => 'ਆਪਣੇ ਅਕਾਊਂਟ ਦੀ ਜਾਣਕਾਰੀ ਹੇਠਾਂ ਦਿਉ।',
+'createacct-emailrequired' => 'ਈਮੇਲ ਪਤਾ',
+'createacct-emailoptional' => 'ਈਮੇਲ ਪਤਾ (ਚੋਣਵਾਂ)',
+'createacct-email-ph' => 'ਆਪਣਾ ਈਮੇਲ ਪਤਾ ਦਿਉ',
+'createacct-another-email-ph' => 'ਆਪਣਾ ਈਮੇਲ ਐਡਰੈਸ ਦਿਓ',
 'createaccountmail' => 'ਆਰਜ਼ੀ ਰਲ਼ਵਾਂ ਪਾਸਵਰਡ ਵਰਤੋਂ ਅਤੇ ਇਸ ਨੂੰ ਖਾਸ ਈਮੇਲ ਪਤੇ ਉੱਤੇ ਭੇਜ ਦਿਉ',
+'createacct-realname' => 'ਅਸਲੀ ਨਾਂ (ਚੋਣਵਾਂ)',
 'createaccountreason' => 'ਕਾਰਨ:',
+'createacct-reason' => 'ਕਾਰਨ',
+'createacct-reason-ph' => 'ਤੁਸੀਂ ਹੋਰ ਖਾਤਾ ਕਿਉਂ ਬਣਾ ਰਹੇ ਹੋ',
+'createacct-captcha' => 'ਸੁਰੱਖਿਆ ਜਾਂਚ',
+'createacct-imgcaptcha-ph' => 'ਉੱਤੇ ਵੇਖਾਈ ਦੇ ਰਿਹਾ ਸ਼ਬਦ ਦਿਉ',
+'createacct-submit' => 'ਆਪਣਾ ਖਾਤਾ ਬਣਾਓ',
+'createacct-another-submit' => 'ਹੋਰ ਖਾਤਾ ਬਣਾਓ',
+'createacct-benefit-heading' => '{{SITENAME}} ਨੂੰ ਤੁਹਾਡੇ ਵਰਗੇ ਲੋਕਾਂ ਵਲੋਂ ਹੀ ਬਣਾਇਆ ਗਿਆ ਹੈ।',
+'createacct-benefit-body1' => '{{PLURAL:$1|ਸੋਧ|ਸੋਧਾਂ}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ਸਫ਼ਾ|ਸਫ਼ੇ}}',
+'createacct-benefit-body3' => 'ਹਾਲੀਆ {{PLURAL:$1|ਯੋਗਦਾਨੀ}}',
 'badretype' => 'ਤੁਹਾਡੇ ਵਲੋਂ ਦਿੱਤੇ ਪਾਸਵਰਡ ਮਿਲਦੇ ਨਹੀਂ ਹਨ।',
 'userexists' => 'ਯੂਜ਼ਰ-ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ। ਵੱਖਰਾ ਨਾਂ ਚੁਣੋ ਜੀ।',
 'loginerror' => 'ਲਾਗਇਨ ਗਲਤੀ',
+'createacct-error' => 'ਖਾਤਾ ਬਣਾਉਣ ਵਿਚ ਗਲਤੀ',
 'createaccounterror' => 'ਖਾਤਾ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: $1',
 'nocookiesnew' => 'ਯੂਜ਼ਰ ਅਕਾਊਂਟ ਬਣਾਇਆ ਗਿਆ ਹੈ, ਪਰ ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ ਹੈ।{{SITENAME}} uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.',
 'nocookieslogin' => '{{SITENAME}} ਯੂਜ਼ਰਾਂ ਨੂੰ ਲਾਗਇਨ ਕਰਨ ਲਈ ਕੂਕੀਜ਼ ਵਰਤਦੀ ਹੈ। ਤੁਹਾਡੇ ਕੂਕੀਜ਼ ਆਯੋਗ ਕੀਤੇ ਹੋਏ ਹਨ। ਉਨ੍ਹਾਂ ਨੂੰ ਯੋਗ ਕਰਕੇ ਮੁੜ ਟਰਾਈ ਕਰੋ।',
@@ -682,7 +711,7 @@ $2',
 ਜੇ ਇਹ ਖਾਤਾ ਗ਼ਲਤੀ ਨਾਲ਼ ਬਣ ਗਿਆ ਹੈ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਸਕਦੇ ਹੋ।',
 'usernamehasherror' => 'ਵਰਤੋਂਕਾਰ ਦੇ ਨਾਂ ਵਿਚ ਹੈਸ਼ ਅੱਖਰ ਨਹੀਂ ਹੋ ਸਕਦੇ',
 'login-throttled' => 'ਤੁਸੀਂ ਬਹੁਤ ਸਾਰੀਆਂ ਤਾਜ਼ਾ ਲਾਗਇਨ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ ਹਨ।
-ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਥੋੜੀ ਉਡੀਕ ਕਰੋ।',
+ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਥੋੜ੍ਹੀ ਉਡੀਕ ਕਰੋ ਜੀ।',
 'login-abort-generic' => 'ਤੁਹਾਡਾ ਦਾਖ਼ਲਾ ਨਾਕਾਮ ਸੀ - ਅਧੂਰਾ ਛੱਡਿਆ',
 'loginlanguagelabel' => 'ਭਾਸ਼ਾ: $1',
 'suspicious-userlogout' => 'ਤੁਹਾਡੀ ਵਿਦਾਇਗੀ ਦੀ ਬੇਨਤੀ ਨਕਾਰ ਦਿੱਤੀ ਗਈ ਕਿਉਂਕਿ ਲੱਗਦਾ ਹੈ ਕਿ ਇਹ ਕਿਸੇ ਟੁੱਟੇ ਹੋਏ ਬਰਾਊਜ਼ਰ ਜਾਂ ਕੈਸ਼ ਹੋਈ ਪ੍ਰਾਕਸੀ ਤੋਂ ਭੇਜੀ ਗਈ ਸੀ।',
@@ -700,7 +729,7 @@ $2',
 'newpassword' => 'ਨਵਾਂ ਪਾਸਵਰਡ:',
 'retypenew' => 'ਨਵਾਂ ਪਾਸਵਰਡ ਮੁੜ-ਲਿਖੋ:',
 'resetpass_submit' => 'ਪਾਸਵਰਡ ਸੈੱਟ ਕਰੋ ਅਤੇ ਲਾਗਇਨ ਕਰੋ',
-'resetpass_success' => 'ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਠੀਕ ਤਰਾਂ ਬਦਲਿਆ ਗਿਆ ਹੈ! ਹੁਣ ਤੁਸੀਂ ਲਾਗਇਨ ਕਰ ਸਕਦੇ ਹੋ...',
+'changepassword-success' => 'ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਠੀਕ ਤਰ੍ਹਾਂ ਬਦਲਿਆ ਜਾ ਚੁੱਕਾ ਹੈ!',
 'resetpass_forbidden' => 'ਪਾਸਵਰਡ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ',
 'resetpass-no-info' => 'ਇਸ ਸਫ਼ੇ ਨੂੰ ਸਿੱਧੇ ਹੀ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨਾ ਪਵੇਗਾ।',
 'resetpass-submit-loggedin' => 'ਪਾਸਵਰਡ ਬਦਲੋ',
@@ -712,10 +741,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰੋ',
-'passwordreset-text' => 'ਆਪਣਾ ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰਨ ਲਈ ਇਹ ਫਾਰਮ ਪੂਰਾ ਕਰੋ।',
+'passwordreset-text-one' => 'ਪਾਸਵਰਡ ਦੁਬਾਰਾ ਬਣਾਉਣ ਲਈ ਇਹ ਫ਼ਾਰਮ ਭਰੋ।',
+'passwordreset-text-many' => '{{PLURAL:$1|ਆਪਣਾ ਪਾਸਵਰਡ ਮੁੜ ਬਣਾਉਣ ਲਈ ਕੋਈ ਇੱਕ ਥਾਂ ਭਰੋ।}}',
 'passwordreset-legend' => 'ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰੋ',
 'passwordreset-disabled' => 'ਇਸ ਵਿਕੀ ਤੇ ਪਾਸਵਰਡ ਰੀਸੈੱਟ ਬੰਦ ਕੀਤੇ ਗਏ ਹਨ।',
-'passwordreset-pretext' => '{{PLURAL:$1||ਹੇਠਾਂ ਸਮੱਗਰੀ ਦੀ ਕੋਈ ਇੱਕ ਵਸਤੂ ਭਰੋ}}',
+'passwordreset-emaildisabled' => 'ਇਹ ਵਿਕਿ ਉੱਤੇ ਈਮੇਲ ਫੀਚਰ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ।',
 'passwordreset-username' => 'ਯੂਜ਼ਰ-ਨਾਂ:',
 'passwordreset-domain' => 'ਡੋਮੇਨ:',
 'passwordreset-capture' => 'ਨਤੀਜੇ ਵਜੋਂ ਬਣਦੀ ਈਮੇਲ ਵੇਖੋ?',
@@ -747,6 +777,9 @@ $2
 'changeemail-submit' => 'ਈ-ਮੇਲ ਬਦਲੋ',
 'changeemail-cancel' => 'ਰੱਦ ਕਰੋ',
 
+# Special:ResetTokens
+'resettokens' => 'ਟੋਕਨ ਮੁੜ-ਸੈੱਟ ਕਰੋ',
+
 # Edit page toolbar
 'bold_sample' => 'ਗੂੜੀ ਲਿਖਤ',
 'bold_tip' => 'ਗੂੜੇ ਅੱਖਰ',
@@ -889,11 +922,13 @@ $1 ਲੁਕਵੀਆਂ ਸ਼੍ਰੇਣੀਆਂ}} ਦਾ ਮੈਂਬਰ 
 ਜਾਪਦਾ ਹੈ ਕਿ ਇਹ ਹਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।',
 'edit-conflict' => 'ਸੋਧ ਤਕਰਾਰ',
 'edit-no-change' => 'ਤੁਹਾਡੀ ਸੋਧ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਦਿੱਤੀ ਗਈ ਹੈ ਕਿਉਂਕਿ ਲਿਖਤ ਵਿਚ ਕੋਈ ਤਬਦੀਲੀ ਨਹੀਂ ਕੀਤੀ ਗਈ।',
+'postedit-confirmation' => 'ਤੁਹਾਡੀ ਸੋਧ ਸਾਂਭੀ ਗਈ ਹੈ।',
 'edit-already-exists' => 'ਨਵਾਂ ਸਫ਼ਾ ਨਹੀਂ ਬਣਾਇਆ ਜਾ ਸਕਿਆ।
 ਇਹ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।',
 'defaultmessagetext' => 'ਮੂਲ ਸੰਦੇਸ਼ ਲਿਖਤ',
 'invalid-content-data' => 'ਗ਼ਲਤ ਸਮੱਗਰੀ',
 'content-not-allowed-here' => '"$1" ਸਮੱਗਰੀ ਨੂੰ [[$2]] ਉੱਤੇ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ',
+'editwarning-warning' => 'ਇਹ ਸਫ਼ਾ ਛੱਡਣ ਕਰਕੇ ਤੁਹਾਡੇ ਵੱਲੋਂ ਕੀਤੀਆਂ ਸੋਧਾਂ ਗੁੰਮ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਜੇਕਰ ਤੁਸੀਂ ਦਾਖ਼ਲਾ ਲਿਆ ਹੋਇਆ ਹੈ ਤਾਂ ਤੁਸੀਂ ਇਸ ਚਿਤਾਵਨੀ ਨੂੰ ਆਪਣੀਆਂ ਪਸੰਦਾਂ ਦੇ "ਸੰਪਾਦਨ" ਭਾਗ ਵਿਚ ਜਾ ਕੇ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ।',
 
 # Content models
 'content-model-wikitext' => 'ਵਿਕੀਲਿਖਤ',
@@ -914,6 +949,7 @@ $1 ਲੁਕਵੀਆਂ ਸ਼੍ਰੇਣੀਆਂ}} ਦਾ ਮੈਂਬਰ 
 ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਇਹ ਤਸਦੀਕ ਕਰਨ ਲਈ ਹੇਠਲੀ ਤੁਲਨਾ ਜਾਂਚੋ ਕਿ ਇਹ ਓਹੀ ਹੈ ਜੋ ਤੁਸੀਂ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ ਅਤੇ ਫਿਰ ਸੋਧ ਨਕਾਰਨ ਲਈ ਤਬਦੀਲੀਆਂ ਸਾਂਭ ਦਿਓ।',
 'undo-norev' => 'ਸੋਧ ਨਕਾਰੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਕਿਉਂਕਿ ਇਹ ਮੌਜੂਦ ਨਹੀਂ ਜਾਂ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ।',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|ਗੱਲ-ਬਾਤ]]) ਦੀ ਸੋਧ $1 ਨਕਾਰੀ',
+'undo-summary-username-hidden' => 'ਗੁਪਤ ਵਰਤੋਂਕਾਰ ਵੱਲੋਂ ਕੀਤੀ $1 ਸੋਧ ਰੱਦ ਕਰੋ',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'ਖਾਤਾ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ',
@@ -1074,7 +1110,6 @@ page={{FULLPAGENAMEE}}}} ਜ਼ਬਤੀ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵ
 'searchmenu-legend' => 'ਖੋਜ-ਸਬੰਧੀ ਚੋਣਾਂ',
 'searchmenu-exists' => "'''ਇਸ ਵਿਕੀ ’ਤੇ \"[[:\$1]]\" ਨਾਮ ਦਾ ਸਫਾ ਹੈ।'''",
 'searchmenu-new' => "'''ਇਸ ਵਿਕੀ ’ਤੇ \"[[:\$1]]\" ਸਫ਼ਾ ਬਣਾਓ!'''",
-'searchhelp-url' => 'Help:ਸਮੱਗਰੀ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ਇਸ ਅਗੇਤਰ ਵਾਲ਼ੇ ਸਫ਼ੇ ਵੇਖੋ]]',
 'searchprofile-articles' => 'ਸਮੱਗਰੀ ਸਫ਼ੇ',
 'searchprofile-project' => 'ਮਦਦ ਤੇ ਪਰੋਜੈਕਟ ਸਫ਼ੇ',
@@ -1115,15 +1150,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'powersearch-toggleall' => 'ਸਭ',
 'powersearch-togglenone' => 'ਕੋਈ ਨਹੀਂ',
 'search-external' => 'ਬਾਹਰੀ ਖੋਜ',
-
-# Quickbar
-'qbsettings' => 'ਤੁਰੰਤ ਬਾਰ',
-'qbsettings-none' => 'ਕੋਈ ਨਹੀਂ',
-'qbsettings-fixedleft' => 'ਖੱਬੇ ਪਾਸੇ ਮੜ੍ਹਿਆ',
-'qbsettings-fixedright' => 'ਸੱਜੇ ਪਾਸੇ ਮੜ੍ਹਿਆ',
-'qbsettings-floatingleft' => 'ਖੱਬੇ ਪਾਸੇ ਤੈਰਦਾ',
-'qbsettings-floatingright' => 'ਸੱਜੇ ਪਾਸੇ ਤੈਰਦਾ',
-'qbsettings-directionality' => 'ਤੁਹਾਡੀ ਭਾਸ਼ਾ ਦੀ ਲਿਪੀ ਦਿਸ਼ਾ ਮੁਤਾਬਕ ਮੜ੍ਹਿਆ ਗਿਆ',
+'search-error' => 'ਖੋਜ ਕਰਦੇ ਵਕਤ ਇੱਕ ਦੋਸ਼ ਮਿਲਿਆ:$1',
 
 # Preferences page
 'preferences' => 'ਪਸੰਦਾਂ',
@@ -1157,7 +1184,6 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'resetprefs' => 'ਅਣ-ਸਾਂਭੀਆਂ ਤਬਦੀਲੀਆਂ ਸਾਫ਼ ਕਰੋ',
 'restoreprefs' => 'ਸਭ ਮੂਲ ਸੈਟਿੰਗਾਂ ਮੋੜ ਲਿਆਓ',
 'prefs-editing' => 'ਸੋਧ ਜਾਰੀ',
-'prefs-edit-boxsize' => 'ਸੋਧ ਖਿੜਕੀ ਦਾ ਅਕਾਰ',
 'rows' => 'ਕਤਾਰਾਂ:',
 'columns' => 'ਕਾਲਮ:',
 'searchresultshead' => 'ਖੋਜ',
@@ -1195,7 +1221,6 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'prefs-custom-js' => 'ਰਿਵਾਇਤੀ ਜਾਵਾਸਕਰਿਪਟ',
 'prefs-common-css-js' => 'ਸਾਰੀਆਂ ਸਕਿਨਾਂ ਲਈ ਸਾਂਝਾ CSS/ਜਾਵਾਸਕਰਿਪਟ:',
 'prefs-emailconfirm-label' => 'ਈ-ਮੇਲ ਪੁਸ਼ਟੀ:',
-'prefs-textboxsize' => 'ਸੋਧ ਖਿੜਕੀ ਦਾ ਅਕਾਰ',
 'youremail' => 'ਈ-ਮੇਲ:',
 'username' => '{{GENDER:$1|ਯੂਜ਼ਰਨਾਂ}}:',
 'uid' => '{{GENDER:$1|User}} ਆਈਡੀ:',
@@ -1225,6 +1250,8 @@ HTML ਟੈਗ ਚੈੱਕ ਕਰੋ।',
 'prefs-dateformat' => 'ਮਿਤੀ ਦਾ ਅੰਦਾਜ਼',
 'prefs-timeoffset' => 'ਸਮੇਂ ਦਾ ਆਫ਼ਸੈੱਟ',
 'prefs-advancedediting' => 'ਆਮ ਚੋਣਾਂ',
+'prefs-editor' => 'ਸੰਪਾਦਕ',
+'prefs-preview' => 'ਝਲਕ',
 'prefs-advancedrc' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedrendering' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedsearchoptions' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
@@ -1299,6 +1326,11 @@ HTML ਟੈਗ ਚੈੱਕ ਕਰੋ।',
 'right-editinterface' => 'ਵਰਤੋਂਕਾਰ ਇੰਟਰਫ਼ੇਸ ਸੋਧੋ',
 'right-editusercss' => 'ਹੋਰ ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ CSS ਫ਼ਾਈਲਾਂ ਸੋਧਣ',
 'right-edituserjs' => 'ਹੋਰ ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ ਜਾਵਾਸਕਰਿਪਟ ਫ਼ਾਈਲਾਂ ਸੋਧਣ',
+'right-editmyusercss' => 'ਆਪਣੀਆਂ ਵਰਤੋਂਕਾਰ CSS ਫ਼ਾਈਲਾਂ ਸੋਧੋ',
+'right-editmyuserjs' => 'ਆਪਣੀਆਂ ਵਰਤੋਂਕਾਰ ਜਾਵਾਸਕਰਿਪਟ ਫ਼ਾਈਲਾਂ ਸੋਧੋ',
+'right-viewmywatchlist' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵੇਖੋ',
+'right-editmywatchlist' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ। ਧਿਆਨ ਦਿਓ ਕਿ ਕੁਝ ਸਫ਼ੇ ਇਸ ਹੱਕ ਤੋਂ ਬਿਨਾਂ ਵੀ ਜੁੜਨਗੇ।',
+'right-editmyoptions' => 'ਆਪਣੀਆਂ ਪਸੰਦਾਂ ਸੋਧੋ',
 'right-unwatchedpages' => 'ਨਜ਼ਰ ਨਾ ਰੱਖੇ ਜਾ ਰਹੇ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ ਵੇਖਣੀ',
 'right-mergehistory' => 'ਸਫ਼ਿਆਂ ਦੇ ਅਤੀਤਾਂ ਨੂੰ ਰਲ਼ਾਉਣਾ',
 'right-userrights' => 'ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦੇ ਹੱਕ ਬਦਲਣੇ',
@@ -1347,6 +1379,10 @@ HTML ਟੈਗ ਚੈੱਕ ਕਰੋ।',
 'action-userrights-interwiki' => 'ਦੂਜੇ ਵਿਕੀਆਂ ਦੇ ਵਰਤੋਂਕਾਰਾਂ ਦੇ ਵਰਤੋਂਕਾਰ-ਹੱਕ ਸੋਧਣ',
 'action-siteadmin' => 'ਡਾਟਾਬੇਸ ਨੂੰ ਤਾਲਾ ਲਾਓ ਜਾਂ ਖੋਲ੍ਹੋ',
 'action-sendemail' => 'ਈ-ਮੇਲਾਂ ਭੇਜੋ',
+'action-editmywatchlist' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ',
+'action-viewmywatchlist' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵੇਖੋ',
+'action-viewmyprivateinfo' => 'ਆਪਣੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਵੇਖੋ',
+'action-editmyprivateinfo' => 'ਆਪਣੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਸੋਧੋ',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|ਤਬਦੀਲੀ|ਤਬਦੀਲੀਆਂ}}',
@@ -1387,7 +1423,6 @@ HTML ਟੈਗ ਚੈੱਕ ਕਰੋ।',
 'recentchangeslinked-feed' => 'ਸਬੰਧਤ ਤਬਦੀਲੀਆਂ',
 'recentchangeslinked-toolbox' => 'ਸਬੰਧਤ ਤਬਦੀਲੀਆਂ',
 'recentchangeslinked-title' => '"$1" ਨਾਲ ਸਬੰਧਤ ਤਬਦੀਲੀਆਂ',
-'recentchangeslinked-noresult' => 'ਜੁੜੇ ਪੰਨਿਆਂ ’ਤੇ, ਦਿੱਤੇ ਸਮੇਂ ’ਚ ਕੋਈ ਬਦਲਾਵ ਨਹੀਂ ਹੋਈ।',
 'recentchangeslinked-summary' => 'ਇਹ ਕਿਸੇ ਖ਼ਾਸ ਸਫ਼ੇ ਤੋਂ ਲਿੰਕ ਕੀਤੇ ਸਫ਼ਿਆਂ (ਜਾਂ ਕਿਸੇ ਖ਼ਾਸ ਸ਼੍ਰੇਣੀ ਦੇ ਮੈਂਬਰਾਂ) ਵਿੱਚ ਹੋਈਆਂ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਦੀ ਲਿਸਟ ਹੈ। [[Special:Watchlist|ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ]] ਵਿੱਚ ਮੌਜੂਦ ਸਫ਼ੇ ਮੋਟੇ ਅੱਖਰਾਂ ਵਿੱਚ ਵਖਾਈ ਦੇਣਗੇ।',
 'recentchangeslinked-page' => 'ਸਫ਼ੇ ਦਾ ਨਾਂ:',
 'recentchangeslinked-to' => 'ਇਹਦੇ ਬਦਲੇ ਇਸ ਸਫ਼ੇ ਨਾਲ ਜੁੜੇ ਸਫ਼ਿਆਂ ਵਿੱਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਵਿਖਾਓ',
@@ -1398,8 +1433,7 @@ HTML ਟੈਗ ਚੈੱਕ ਕਰੋ।',
 'reuploaddesc' => 'ਅੱਪਲੋਡ ਫਾਰਮ ਉੱਤੇ ਜਾਓ।',
 'upload-tryagain' => 'ਬਦਲਿਆ ਹੋਇਆ ਫ਼ਾਈਲ ਵੇਰਵਾ ਪੇਸ਼ ਕਰੋ',
 'uploadnologin' => 'ਦਾਖ਼ਲ ਨਹੀਂ ਹੋ',
-'uploadnologintext' => 'ਤੁਹਾਨੂੰ[[Special:UserLogin|logged in] ਕਰਨਾ ਪਵੇਗਾ]
-to upload files.',
+'uploadnologintext' => 'ਫ਼ਾਈਲਾਂ ਅੱਪਲੋਡ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ $1 ਕਰਨਾ ਪਵੇਗਾ।',
 'uploaderror' => 'ਅੱਪਲੋਡ ਗਲਤੀ',
 'upload-recreate-warning' => "'''ਖ਼ਬਰਦਾਰ: ਇਸ ਨਾਮ ਦੀ ਫ਼ਾਈਲ ਮਿਟਾਈ ਜਾਂ ਹੋਰ ਨਾਮ ਤੇ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।'''
 ਮਿਟਾਉਣ ਅਤੇ ਭੇਜੇ ਜਾਣ ਦਾ ਚਿੱਠਾ ਸਹੂਲਤ ਲਈ ਇੱਥੇ ਦਿੱਤਾ ਗਿਆ ਹੈ:",
@@ -1604,9 +1638,6 @@ to upload files.',
 'statistics-users-active-desc' => 'ਮੈਂਬਰ, ਜਿੰਨ੍ਹਾ ਨੇ ਆਖ਼ਰੀ {{PLURAL:$1|ਦਿਨ|$1 ਦਿਨਾਂ}} ਵਿਚ ਕੋਈ ਕੰਮ ਕੀਤਾ ਹੈ।',
 'statistics-mostpopular' => 'ਸਭ ਤੋਂ ਵੱਧ ਵੇਖੇ ਸਫ਼ੇ',
 
-'disambiguations' => 'ਗੁੰਝਲ-ਖੋਲ੍ਹ ਸਫ਼ਿਆਂ ਨਾਲ਼ ਜੁੜਦੇ ਸਫ਼ੇ',
-'disambiguationspage' => 'Template:ਗੁੰਝਲ ਖੋਲ੍ਹ',
-
 'pageswithprop-submit' => 'ਜਾਉ',
 
 'doubleredirects' => 'ਦੋਹਰੇ ਰੀਡਿਰੈਕਟ',
@@ -1801,7 +1832,6 @@ to upload files.',
 'unwatchthispage' => 'ਨਜ਼ਰ ਰੱਖਣੀ ਬੰਦ ਕਰੋ',
 'notanarticle' => 'ਕੋਈ ਸਮੱਗਰੀ ਸਫ਼ਾ ਨਹੀਂ ਹੈ',
 'notvisiblerev' => 'ਇੱਕ ਵੱਖਰੇ ਮੈਂਬਰ ਦੀ ਬਣਾਈ ਆਖ਼ਰੀ ਰੀਵਿਜ਼ਨ ਮਿਟਾਈ ਜਾ ਚੁੱਕੀ ਹੈ',
-'watchnochange' => 'ਵਖਾਏ ਜਾ ਰਹੇ ਸਮੇਂ ਅੰਦਰ ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚਲਾ ਕੋਈ ਵੀ ਸਫ਼ਾ ਸੋਧਿਆ ਨਹੀਂ ਗਿਆ।',
 'watchlist-details' => 'ਗੱਲ-ਬਾਤ ਸਫ਼ੇ ਨਾ ਗਿਣਦੇ ਹੋਏ, ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਸੂਚੀ ਵਿਚ{{PLURAL:$1|$1 ਸਫ਼ਾ ਹੈ|$1 ਸਫ਼ੇ ਹਨ}}।',
 'watchlistcontains' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ $1 {{PLURAL:$1|ਸਫ਼ਾ ਹੈ|ਸਫ਼ੇ ਹਨ}}।',
 'wlnote' => "$3, $4 ਮੁਤਾਬਕ ਆਖ਼ਰੀ {{PLURAL:$2|ਘੰਟੇ|'''$2''' ਘੰਟਿਆਂ}} ਵਿਚ {{PLURAL:
@@ -2051,8 +2081,6 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'ipb-otherblocks-header' => 'ਹੋਰ {{PLURAL:$1|ਪਾਬੰਦੀ|ਪਾਬੰਦੀਆਂ}}',
 'unblock-hideuser' => 'ਤੁਸੀਂ ਇਸ ਮੈਂਬਰ ’ਤੇ ਪਾਬੰਦੀ ਨਹੀਂ ਲਾ ਸਕਦੇ ਕਿਉਂਕਿ ਇਸਦਾ ਮੈਂਬਰ-ਨਾਂ ਲੁਕਾਇਆ ਹੋਇਆ ਹੈ।',
 'ipb_cant_unblock' => 'ਗ਼ਲਤੀ: ਪਾਬੰਦੀ ਪਤਾ $1 ਨਹੀਂ ਲੱਭਿਆ। ਸ਼ਾਇਦ ਇਹ ਪਹਿਲਾਂ ਹੀ ਪਾਬੰਦੀ-ਮੁਕਤ ਹੋ ਚੁੱਕਾ ਹੈ।',
-'blockme' => 'ਮੇਰੇ ’ਤੇ ਪਾਬੰਦੀ ਲਾਓ',
-'proxyblocksuccess' => 'ਪੂਰਾ ਹੋਇਆ',
 'cant-block-while-blocked' => 'ਤੁਸੀਂ ਦੂਜੇ ਮੈਂਬਰਾਂ ’ਤੇ ਪਾਬੰਦੀ ਨਹੀਂ ਲਾ ਸਕਦੇ ਜਦੋਂ ਤੁਸੀਂ ਖ਼ੁਦ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੋ।',
 'ipbblocked' => 'ਤੁਸੀਂ ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਪਾਬੰਦੀਸ਼ੁਦਾ ਜਾਂ ਪਾਬੰਦੀ-ਮੁਕਤ ਨਹੀਂ ਕਰ ਸਕਦੇ ਕਿਉਂਕਿ ਤੁਸੀਂ ਖ਼ੁਦ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੋ',
 'ipbnounblockself' => 'ਤੁਹਾਨੂੰ ਖ਼ੁਦ ਨੂੰ ਪਾਬੰਦੀ-ਮੁਕਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ',
@@ -2249,11 +2277,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'pageinfo-category-files' => 'ਫ਼ਾਈਲਾਂ ਦੀ ਗਿਣਤੀ',
 
 # Skin names
-'skinname-standard' => 'ਕਲਾਸਿਕ',
 'skinname-monobook' => 'ਮੋਨੋਬੁੱਕ',
-'skinname-myskin' => 'ਮੇਰੀਸਕਿਨ',
-'skinname-chick' => 'ਚੀਚਕ',
-'skinname-simple' => 'ਸੈਂਪਲ',
 
 # Browsing diffs
 'previousdiff' => '← ਪੁਰਾਣੀ ਤਬਦੀਲੀ',
@@ -2280,11 +2304,25 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'minutes' => '{{PLURAL:$1|$1 ਮਿੰਟ}}',
 'hours' => '{{PLURAL:$1|$1 ਘੰਟਾ|$1 ਘੰਟੇ}}',
 'days' => '{{PLURAL:$1|$1 ਦਿਨ}}',
+'weeks' => '{{PLURAL:$1|$1 ਹਫ਼ਤਾ|$1 ਹਫ਼ਤੇ}}',
 'months' => '{{PLURAL:$1|$1 ਮਹੀਨਾ|$1 ਮਹੀਨੇ}}',
 'years' => '{{PLURAL:$1|$1 ਵਰ੍ਹਾ|$1 ਵਰ੍ਹੇ}}',
 'ago' => '$1 ਪਹਿਲਾਂ',
 'just-now' => 'ਹੁਣੇ',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ਘੰਟਾ|ਘੰਟੇ}} ਪਹਿਲਾਂ',
+'minutes-ago' => '$1 {{PLURAL:$1|ਮਿੰਟ}} ਪਹਿਲਾਂ',
+'seconds-ago' => '$1 {{PLURAL:$1|ਸਕਿੰਟ}} ਪਹਿਲਾਂ',
+'monday-at' => 'ਸੋਮਵਾਰ ਨੂੰ $1 ਵਜੇ',
+'tuesday-at' => 'ਮੰਗਲਵਾਰ ਨੂੰ $1 ਵਜੇ',
+'wednesday-at' => 'ਬੁੱਧਵਾਰ ਨੂੰ $1 ਵਜੇ',
+'thursday-at' => 'ਵੀਰਵਾਰ ਨੂੰ $1 ਵਜੇ',
+'friday-at' => 'ਸ਼ੁੱਕਰਵਾਰ ਨੂੰ $1 ਵਜੇ',
+'saturday-at' => 'ਸ਼ਨਿੱਚਰਵਾਰ ਨੂੰ $1 ਵਜੇ',
+'sunday-at' => 'ਐਤਵਾਰ ਨੂੰ $1 ਵਜੇ',
+'yesterday-at' => 'ਕੱਲ੍ਹ $1 ਵਜੇ',
+
 # Bad image list
 'bad_image_list' => 'ਤਰਤੀਬ ਇਸ ਤਰਾਂ ਹੈ:
 ਸਿਰਫ਼ ਸੂਚੀ ਵਿਚਲੀਆਂ ਚੀਜ਼ਾਂ (* ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲੀਆਂ ਕਤਾਰਾਂ) ’ਤੇ ਹੀ ਗ਼ੌਰ ਕੀਤਾ ਜਾਵੇਗਾ।
@@ -2297,7 +2335,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'metadata-collapse' => 'ਵਾਧੂ ਦਾ ਬਿਓਰਾ ਲੁਕਾਓ',
 'metadata-fields' => 'ਇਸ ਸੁਨੇਹੇ ਵਿੱਚ ਸੂਚੀਬੱਧ ਖੇਤਰ ਚਿੱਤਰ ਪੰਨੇ ’ਚ ਸ਼ਾਮਲ ਕੀਤੇ ਜਾਣਗੇ ਜੋ ਉਦੋਂ ਦਿੱਸਦੇ ਹਨ ਜਦੋ ਮੈਟਾਡੈਟਾ ਖਾਕਾ ਬੰਦ ਹੋਵੇ। ਬਾਕੀ ਉਂਞ ਹੀ ਲੁਕੇ ਹੋਣਗੇ।',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ਚੌੜਾਈ',
 'exif-imagelength' => 'ਉਚਾਈ',
 'exif-samplesperpixel' => 'ਭਾਗਾਂ ਦੀ ਗਿਣਤੀ',
@@ -2608,10 +2646,15 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'version-entrypoints-header-entrypoint' => 'ਦਾਖ਼ਲਾ ਬਿੰਦੂ',
 'version-entrypoints-header-url' => 'ਯੂ.ਆਰ.ਐੱਲ',
 
-# Special:FilePath
-'filepath' => 'ਫ਼ਾਈਲ ਦਾ ਰਾਹ',
-'filepath-page' => 'ਫ਼ਾਈਲ:',
-'filepath-submit' => 'ਜਾਓ',
+# Special:Redirect
+'redirect-legend' => 'ਕਿਸੇ ਸਫ਼ੇ ਜਾਂ ਫ਼ਾਈਲ ਵੱਲ ਰੀਡਾਇਰੈਕਟ ਕਰੋ',
+'redirect-submit' => 'ਜਾਓ',
+'redirect-lookup' => 'ਲੱਭੋ:',
+'redirect-value' => 'ਮੁੱਲ:',
+'redirect-user' => 'ਵਰਤੋਂਕਾਰ ਦੀ ਆਈ.ਡੀ.',
+'redirect-revision' => 'ਸਫ਼ੇ ਦੀ ਦੁਹਰਾਈ',
+'redirect-file' => 'ਫ਼ਾਈਲ ਦਾ ਨਾਂ',
+'redirect-not-exists' => 'ਮੁੱਲ ਲੱਭਿਆ ਨਹੀਂ',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ਨਕਲੀ ਫ਼ਾਈਲਾਂ ਲਈ ਖੋਜ ਕਰੋ',
@@ -2652,6 +2695,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 # Special:Tags
 'tag-filter' => '[[Special:Tags|ਟੈਗ]] ਫਿਲਟਰ:',
 'tag-filter-submit' => 'ਛਾਨਣੀ',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|ਟੈਗ}}]]: $2)',
 'tags-title' => 'ਟੈਗ',
 'tags-tag' => 'ਟੈਗ ਦਾ ਨਾਮ',
 'tags-description-header' => 'ਅਰਥ ਦਾ ਪੂਰਾ ਬਿਓਰਾ',
@@ -2685,6 +2729,9 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'htmlform-submit' => 'ਭੇਜੋ',
 'htmlform-reset' => 'ਤਬਦੀਲੀਆਂ ਵਾਪਸ ਕਰੋ',
 'htmlform-selectorother-other' => 'ਹੋਰ',
+'htmlform-no' => 'ਨਹੀਂ',
+'htmlform-yes' => 'ਹਾਂ',
+'htmlform-chosen-placeholder' => 'ਕੋਈ ਚੋਣ ਚੁਣੋ',
 
 # New logging system
 'logentry-delete-delete' => '$1 ਨੇ ਸਫ਼ਾ $3 ਮਿਟਾਇਆ',
diff --git a/languages/messages/MessagesPag.php b/languages/messages/MessagesPag.php
index c986956e..7e4e2a53 100644
--- a/languages/messages/MessagesPag.php
+++ b/languages/messages/MessagesPag.php
@@ -241,7 +241,7 @@ San ipropromisam met ya insulat mo yan dili o kinopyam ya manlapo ed sakey ya pu
 'linksearch-pat' => 'Anapen so pattern:',
 'linksearch-ok' => 'Anapen',
 
-# Email user
+# E-mail user
 'emailuser' => 'E-mail so ayan user',
 'emailfrom' => 'Manlapud',
 'emailto' => 'Para ed',
@@ -262,8 +262,9 @@ No labay mon ekalen may bolong diad listaan na babantayan, tapik mo labat so \"e
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Babantayan...',
 
-'created' => 'agawa',
+'enotif_newpagetext' => 'Balo yan bolong.',
 'changed' => 'asalatan',
+'created' => 'agawa',
 
 # Delete
 'deletepage' => 'Buralen so bolong',
@@ -362,7 +363,7 @@ Pinengneng so $2 para ed listaan na saray abural ran balo.',
 'namespacesall' => 'amin',
 'monthsall' => 'amin',
 
-# Email address confirmation
+# E-mail address confirmation
 'confirmemail' => 'Kumpirmaen so E-mail address',
 'confirmemail_sent' => 'Empawet so confirmation e-mail.',
 'confirmemail_needlogin' => 'Nakaukulan mo ya $1 umpian nakompirma so email address mo.',
diff --git a/languages/messages/MessagesPam.php b/languages/messages/MessagesPam.php
index 634fa9a5..0788b053 100644
--- a/languages/messages/MessagesPam.php
+++ b/languages/messages/MessagesPam.php
@@ -46,9 +46,6 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'tog-shownumberswatching' => 'Ipakit la reng bilang da reng magbanteng talagamit',
 'tog-oldsig' => 'I-preview ya ing salukuyan a pirma',
 'tog-fancysig' => 'Ituring yang wikitext ing pirma (alang automatic link o tambing a suglung)',
-'tog-externaleditor' => 'Gumamit a pangkilual a editor kapamilatan ning kabud',
-'tog-externaldiff' => 'Tambing kang gumamit aliwa (diff) ibat a panglual',
-'tog-showjumplinks' => 'Salangian la reng suglung a pampabilis (accessibility links) a "luksu king" (jump to)',
 'tog-uselivepreview' => 'Gumamit kang live preview (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Pabaluan mu ku ustung magpalub a blankung edit',
 'tog-watchlisthideown' => 'Isalikut mo reng alili kareng babanten',
@@ -224,7 +221,7 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'jumptonavigation' => 'pamaglibut',
 'jumptosearch' => 'paintunan',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Tungkul {{SITENAME}}',
 'aboutpage' => 'Project:tungkul',
 'copyright' => 'Mipaintulutan ing laman na niti lalam ning $1.',
@@ -234,7 +231,6 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'disclaimers' => 'Pamananggi',
 'disclaimerpage' => 'Project:Pangkabilugan a pamananggi',
 'edithelp' => 'Saup pamanalili',
-'edithelppage' => 'Help:Pamag-edit',
 'helppage' => 'Help:Kalamnan',
 'mainpage' => 'Pun Bulung',
 'mainpage-description' => 'Pun Bulung',
@@ -301,17 +297,6 @@ Ating tala da reng bulung a makabukud king [[Special:SpecialPages|{{int:specialp
 # General errors
 'error' => 'Mali',
 'databaseerror' => 'Pamagkamali king database (simpanan)',
-'dberrortext' => 'Ating migkamali king database query syntax.
-Mapaliaring ating bug king software.
-Ing tauling mesubuk a kutang king database (database query) yapin iti:
-<blockquote><tt>$1</tt></blockquote>
-from within function "<tt>$2</tt>".
-MySQL returned error "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Mika pamagkamali king syntax ning pamangutang king database (database query).
-Ing tauling kutang king database yapin iti:
-"$1"
-manibat king kilub ning function "$2".
-Ini ing pamagkamaling linto king MySQL - "$3: $4"',
 'laggedslavemode' => 'Kapiadian: Mapaliaring ala lu king bulung deng pekatauling mibayu.',
 'readonly' => 'Makasara ya ing database',
 'enterlockreason' => 'Ibie me ing sangkan ning pamaniara, pati ing tantia nung kapilan ya milako iti',
@@ -356,7 +341,6 @@ Pakisubukan mung pasibayu kaibat ning mapilang minutu.',
 'viewsourcetext' => 'Malyari meng lon at kopian ing pikuanan (source) ning bulung a ini:',
 'protectedinterface' => 'Maki interface text ya para king software ing bulung a iti. Makasara ya ba yang e mayabusu.',
 'editinginterface' => "'''Babala:''' Babie yang interface text para king software ing bulung a i-edit mu. Makayapektu la king itsura ning user interface para kareng aliwang gagamit deng pamagbayu keti. Malyari lang munta king [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] deng bisang sumaup king pamaglikas.",
-'sqlhidden' => '(makasalikut ya ing SQL query)',
 'cascadeprotected' => 'Makaprotekta ya king pamag-edit ing bulung a ini uling kayabe ya king makatuking {{PLURAL:$1|bulung, a|bulung, a}} a maki proteksiun uling makasalangi ya ing  "tuki-tuki" o "cascading" option:
 $2',
 'namespaceprotected' => "Ala kang paintulut a mag-edit bulung king pirinan lagyung (namespace a) '''$1'''.",
@@ -454,7 +438,7 @@ Bang mayari ing kekang pamag-login, kailangan mung mangibiling bayung password k
 'newpassword' => 'Bayung password:',
 'retypenew' => 'Sulat meng pasibayu ing bayung password:',
 'resetpass_submit' => 'Mangibili kang password at maglogin ka',
-'resetpass_success' => 'Melaus ing pamanalili mung password! Ngeni mila-login naka...',
+'changepassword-success' => 'Melaus ing pamanalili mung password! Ngeni mila-login naka...',
 'resetpass_forbidden' => 'E la malyaring alilan deng password keng wiking ini',
 
 # Edit page toolbar
@@ -765,7 +749,6 @@ Tutuking $1 {{PLURAL:$1|result|results}}',
 'viewprevnext' => 'Lon ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Atin bulung a mikilagiung \"[[:\$1]]\" keng wiking ini.'''",
 'searchmenu-new' => "↓'''Maglalang kang bulung \"[[:\$1]] keng wiking ini!'''",
-'searchhelp-url' => 'Help:Kalamnan',
 'searchprofile-articles' => '↓Kalamnan bulung',
 'searchprofile-project' => '↓Saup ampong bulung proyectu',
 'searchprofile-images' => '↓Dakalmedia',
@@ -798,13 +781,6 @@ Tutuking $1 {{PLURAL:$1|result|results}}',
 Samantala, maliari kang maintun kapamilatan ning Google.
 Pakitandanan mung maliaring e no makapanaun deng karelang index king kalamnan ning {{SITENAME}}.',
 
-# Quickbar
-'qbsettings-none' => 'Ala',
-'qbsettings-fixedleft' => 'Makapirmi ya ing kaili',
-'qbsettings-fixedright' => 'Makapirmi ya ing wanan',
-'qbsettings-floatingleft' => 'Kikimut ya ing kaili',
-'qbsettings-floatingright' => 'Kikimut ya ing wanan',
-
 # Preferences page
 'preferences' => 'Pinili',
 'mypreferences' => '↓Deng pinili ku',
@@ -996,7 +972,6 @@ Nung ibie me, magamit ya bang kilalanan ing kekang ambag.',
 'recentchangeslinked-feed' => 'Miyalilan a makaugne',
 'recentchangeslinked-toolbox' => 'Miyalilan a makaugne',
 'recentchangeslinked-title' => 'Deng miyalilan a maki kaugnayan king "$1"',
-'recentchangeslinked-noresult' => 'Alang miyalilan kareng bulung a pakasuglung ketang mebanggit a panaun.',
 'recentchangeslinked-summary' => "↓Makalista la king bulung a iti deng tauling mengayalilan kareng 
 bulung a makasuglung ketang partikular a bulung. '''Makapal la pangasulat''' deng bulung
 king kekang watchlist (tala da reng babanten).",
@@ -1197,13 +1172,6 @@ Isulat (input): contenttype/subtype, alimbawa <code>image/jpeg</code>.',
 'statistics-header-users' => 'Talagamit statistics',
 'statistics-mostpopular' => 'Bulung a pekamaralas dang linawe',
 
-'disambiguations' => 'Bulung a pamipalino',
-'disambiguationspage' => 'Template:pamipalino',
-'disambiguations-text' => "Makasuglung la king '''bulung pamipalino''' (disambiguation page) deng makatuking bulung.
-Ing dapat, keta lang makatud a paksa makasuglung.<br />
-Tuturing yang bulung pamipalino ing metung a bulung nung gagamit yang modelung (template)  makasuglung manibat king
-[[MediaWiki:Disambiguationspage]]",
-
 'doubleredirects' => 'Dobling pamanaliling direksiun',
 'doubleredirectstext' => 'Pakalista la king bulung a ini deng bulung a makayalis direksiun (redirect) kareng aliwang bulung pamanalis direksiun. Atin yang suglung ing balang dane (row) king mumuna ampong kaduang pamanalis direksiun, ampo king tuturu (target) ning kaduang pamanalis direksiun, a keraklan ya ing "tagana" o "tutung" bulung a tuturu, nung nu ya dapat tambing makaturu ing mumunang pamanalis direksiun.',
 
@@ -1372,10 +1340,9 @@ click me ing \"Tuknangan ing pamagbante\" (Unwatch) king gilid na ning bulung.",
 'unwatchthispage' => 'Tuknang kang magbante',
 'notanarticle' => 'E ya bulung ding kalamnan (content page)',
 'notvisiblerev' => 'Mebura ya itang mibayu (revision)',
-'watchnochange' => 'Alang me-edit kareng kekang babanten ketang panaun a makabili keti.',
 'watchlist-details' => "{{PLURAL:$1|$1 bulung|$1 bulung}} king kekang watchlist, e la kayabe deng ''talk pages''.",
-'wlheader-enotif' => '* Makasalangi (enabled) ing pamipabalu kapamilatan ning e-mail.',
-'wlheader-showupdated' => "* '''Makapal''' la pangasulat deng bulung a miyalilan manibat aniang tauli mu lang pintalan.",
+'wlheader-enotif' => 'Makasalangi (enabled) ing pamipabalu kapamilatan ning e-mail.',
+'wlheader-showupdated' => "'''Makapal''' la pangasulat deng bulung a miyalilan manibat aniang tauli mu lang pintalan.",
 'watchmethod-recent' => 'sisimen/susurian la reng bayung mengayalili para kareng bulung a babanten',
 'watchmethod-list' => 'susurian la reng bulung a babanten para kareng bayung mengayalili',
 'watchlistcontains' => 'Atin yang $1 {{PLURAL:$1|a bulung|bulung}} ing kekang tala ring babanten (watchlist).',
@@ -1688,12 +1655,9 @@ Lon me ing [[Special:BlockList|IP block list]] para king tala da reng kasalungsu
 'ipb_blocked_as_range' => 'Mali: E diretsung makasabat ing IP $1, at e maliaring ilako pangasabat.
 Pero makasabat ya antimong kayabe king range $2, a maliaring ilako pangasabat.',
 'ip_range_invalid' => 'E matatanggap a IP range.',
-'blockme' => 'Sabatan muku',
 'proxyblocker' => 'Maniabat a proxy',
-'proxyblocker-disabled' => 'Makapatda (disabled) ya ing gamit (function) a ini.',
 'proxyblockreason' => 'Mesabat ya ing kekang IP address uling metung yang open proxy.
 Pakiyaus me ing kekang Internet service provider o tech support at pabaluan me kaniting mabayat a prublema king seguridad.',
-'proxyblocksuccess' => 'Merapat na.',
 'sorbsreason' => 'Makalista ya ing kekang IP address antimong open proxy king DNSBL a gagamitan ning {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Makalista yang open proxy king DNSBL a gagamitan ning {{SITENAME}} ing kekang IP address.
 E ka maliaring maglalang account.',
@@ -2016,7 +1980,7 @@ Detang aliwa tambing (by default) lang makasalikut.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lapad',
 'exif-imagelength' => 'Katas',
 'exif-bitspersample' => 'Bit balang dake (component)',
@@ -2110,7 +2074,7 @@ Detang aliwa tambing (by default) lang makasalikut.
 'exif-source' => 'Pikuanan',
 'exif-cameraownername' => 'Mikibandi keng paglitratu',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'E makapitpit (uncompressed)',
 
 'exif-unknowndate' => 'E makabili ing petsa',
@@ -2322,11 +2286,6 @@ Mayari/mapasu ya ining confirmation code keng $4.',
 'version-software-product' => 'Produktu',
 'version-software-version' => 'Bersion',
 
-# Special:FilePath
-'filepath' => 'Dalan ning simpan (file path)',
-'filepath-page' => 'Simpan (file):',
-'filepath-submit' => 'Dalan',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Maintun simpan (file) a kapareu',
 'fileduplicatesearch-legend' => 'Maintun kapareu',
diff --git a/languages/messages/MessagesPap.php b/languages/messages/MessagesPap.php
index 2c6f751c..45b2e9d1 100644
--- a/languages/messages/MessagesPap.php
+++ b/languages/messages/MessagesPap.php
@@ -164,6 +164,9 @@ Bo por haña un lista di tur [[Special:SpecialPages|{{int:specialpages}}]].',
 'viewsource' => 'Wak fuente',
 
 # Login and logout pages
+'welcomecreation' => '== Bon bini, $1! ==
+Bo kuenta ta trahá.
+No lubidá di kambia bo [[Special:Preferences|{{SITENAME}} preferensianan]].',
 'yourname' => 'Nòmber di uzadó',
 'yourpassword' => 'Kontraseña',
 'yourpasswordagain' => 'Hinka kontraseña atrobe',
@@ -275,7 +278,7 @@ Bo por skohe un tipo di registro tambe, òf filtrá e bista ku un nòmber di uza
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
 
-# Email user
+# E-mail user
 'emailuser' => 'Manda e-mail pa e uzadó aki',
 'emailpage' => 'Manda e-mail',
 'emailpagetext' => 'E formulario aki lo manda un e-mail pa e uzadò aki.
@@ -306,8 +309,8 @@ Si despues bo ke kita e página for di bo lista di observashon, primi \"Stop di
 'watchlistcontains' => 'Bo lista di observashon tin $1 {{PLURAL:$1|página|páginanan}}.',
 'wlshowlast' => 'Mustra último $1 oranan $2 dianan $3',
 
-'created' => 'trahá',
 'changed' => 'kambiá',
+'created' => 'trahá',
 
 # Delete
 'confirm' => 'Konfirmá',
@@ -367,7 +370,7 @@ Por fabor skohe un otro título.',
 'watchlistall2' => 'tur',
 'namespacesall' => 'tur',
 
-# Email address confirmation
+# E-mail address confirmation
 'confirmemail' => 'Konfirmá e-mail adrès',
 'confirmemail_text' => 'Bo mester validá bo e-mail adrès pa uza funkshonnan di e-mail.
 Primi e boton abou pa manda un e-mail di konfirmashon pa bo e-mail adrès.
diff --git a/languages/messages/MessagesPcd.php b/languages/messages/MessagesPcd.php
index 46dc98f9..a7a62e82 100644
--- a/languages/messages/MessagesPcd.php
+++ b/languages/messages/MessagesPcd.php
@@ -218,7 +218,7 @@ $messages = array(
 'jumptonavigation' => 'navigachon',
 'jumptosearch' => 'tracher',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'à pérpos éd {{SITENAME}}',
 'aboutpage' => 'Project:à pérpos',
 'copyright' => "Ch'contnu, il est disponipe dsou $1.",
@@ -228,7 +228,6 @@ $messages = array(
 'disclaimers' => 'Démintis',
 'disclaimerpage' => 'Project:Déminti général',
 'edithelp' => 'Éditer el aiyude',
-'edithelppage' => 'Help:Édichion',
 'helppage' => 'Help:Étnus',
 'mainpage' => 'Moaite Pache',
 'mainpage-description' => 'Moaite Pache',
@@ -307,7 +306,6 @@ Si s'n'est poin ch'cas-lo, pététe éq ch'est un bogue din ch'businkillache. <b
 'viewsource' => "Vir l'source",
 'viewsource-title' => "Vir l'source éd $1",
 'protectedpagetext' => "L'pache-lo ale o té garantie pou impétcher chés canjemints.",
-'sqlhidden' => "(l'édminde SQL est muchée)",
 'ns-specialprotected' => "Ches paches éspéchiales, is n'peute poin éte éditées.",
 
 # Virus scanner
@@ -318,7 +316,6 @@ Si s'n'est poin ch'cas-lo, pététe éq ch'est un bogue din ch'businkillache. <b
 'yourpassword' => "Mot d'passe:",
 'yourpasswordagain' => "Intrer à nouvieu ch'mot d'passe:",
 'remembermypassword' => "Intrer oùtonmatiquemint l'prochaine fouos (pour un maximum éd $1 {{PLURAL:$1|jour|jours}})",
-'securelogin-stick-https' => "Réster connécté in HTTPS apré l'connécsion",
 'yourdomainname' => 'Vote donmène:',
 'login' => 'Intrer',
 'nav-login-createaccount' => 'Intrer / créer vote conpte',
@@ -616,7 +613,6 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
 'recentchangeslinked' => 'Darins canjemints érliés',
 'recentchangeslinked-toolbox' => 'Suivi des paches loïées',
 'recentchangeslinked-title' => 'Cangemints à pérpos éd "$1"',
-'recentchangeslinked-noresult' => "I n’y a poin d' modificacion des paches loïées pindant l'période couésie.",
 'recentchangeslinked-summary' => "Ch'est eune lisse d'chés darins canjemints su chés paches qu'ont un loïen aveuc l'pache-lo. Chés paches din vote [[Special:Watchlist|''lisse à suire'']] il sont in '''cros'''.",
 'recentchangeslinked-page' => 'Nom del pache:',
 'recentchangeslinked-to' => "Vir putot chés canjemints d'chés paches aveuc un loïen su l'pache-lo",
@@ -677,9 +673,6 @@ Vir l'pache [$2 édseur Commons].",
 'statistics' => 'Éstatistikes',
 'statistics-users' => '[[Special:ListUsers|Uzeus]] inrégistrés',
 
-'disambiguations' => 'Paches aveuc des loïens vers des paches du meume nom',
-'disambiguationspage' => 'Template:Omonymie',
-
 'doubleredirects' => 'Doubes érdireccions',
 
 'brokenredirects' => 'Érdireccions bérzillées',
@@ -1059,9 +1052,6 @@ Chés eutes cans is s'ront muchés pèr défeut.
 # Special:Version
 'version-specialpages' => 'Paches éspéchiales',
 
-# Special:FilePath
-'filepath-page' => 'Fichié :',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dénicher chés doublons',
 
diff --git a/languages/messages/MessagesPdc.php b/languages/messages/MessagesPdc.php
index 0e2c307b..4d12a588 100644
--- a/languages/messages/MessagesPdc.php
+++ b/languages/messages/MessagesPdc.php
@@ -209,7 +209,7 @@ $messages = array(
 'jumptonavigation' => 'Faahre-Gnepp',
 'jumptosearch' => 'guck uff',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Iwwer {{SITENAME}}',
 'aboutpage' => 'Project:Iwwer_{{SITENAME}}',
 'copyright' => 'Was do drin schdeht iss unner $1 verfiechbar',
@@ -217,7 +217,6 @@ $messages = array(
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Hilf zum Ennere',
-'edithelppage' => 'Help:Tscheensche',
 'helppage' => 'Help:Hilf',
 'mainpage' => 'Haaptblatt',
 'mainpage-description' => 'Haaptblatt',
@@ -399,7 +398,6 @@ Paesswatt fer nau: $2',
 'nextn' => 'neegschte {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Zeige ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-new' => "'''Schtaert des Blatt „[[:$1|$1]]“ uf dem Wiki.'''",
-'searchhelp-url' => 'Help:Hilf',
 'searchprofile-everything' => 'Abaddiche',
 'searchprofile-articles-tooltip' => 'Uffgucke in $1',
 'searchprofile-project-tooltip' => 'Uffgucke in $1',
@@ -420,9 +418,6 @@ Paesswatt fer nau: $2',
 'powersearch-togglenone' => 'Ken',
 'search-external' => 'Guck im Gewebb',
 
-# Quickbar
-'qbsettings-none' => 'Ken',
-
 # Preferences page
 'preferences' => 'Paerseenlich Profil',
 'mypreferences' => 'Uffschtellinge',
@@ -795,7 +790,6 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 'infiniteblock' => 'fer immer',
 'blocklink' => 'Aabinne',
 'contribslink' => 'Ardickele',
-'proxyblocksuccess' => 'Geduh.',
 
 # Move page
 'move-page' => '„$1“ ziehe',
@@ -906,7 +900,7 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 # Metadata
 'metadata' => 'Metadaade',
 
-# EXIF tags
+# Exif tags
 'exif-imagelength' => 'Leng',
 'exif-software' => 'Geyuust Software',
 'exif-usercomment' => 'Anmaerrickinge vun Yuuser',
@@ -976,11 +970,6 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 'version-poweredby-others' => 'annere',
 'version-software-version' => 'Version',
 
-# Special:FilePath
-'filepath' => 'Feilpaad',
-'filepath-page' => 'Feil:',
-'filepath-submit' => 'Geh',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Feilnaame:',
 'fileduplicatesearch-submit' => 'Uffgucke',
diff --git a/languages/messages/MessagesPdt.php b/languages/messages/MessagesPdt.php
index aa4e5f95..013c8184 100644
--- a/languages/messages/MessagesPdt.php
+++ b/languages/messages/MessagesPdt.php
@@ -547,25 +547,15 @@ Dee Grunt es: "$2"',
 
 # Stylesheets
 'common.css' => '/* CSS opp dise Sted woat opp aula Skins wirtje */',
-'standard.css' => '/* CSS opp dise Sted wirtjt opp dem Standard-Skin */',
-'nostalgia.css' => '/* CSS opp dise Sted wirtjt opp daut Nostalgia-Skin */',
 'cologneblue.css' => '/* CSS opp dise Sted wirtjt opp daut Keloonsch-Blau-Skin */',
 'monobook.css' => '/* CSS opp dise Sted wirtjt opp daut Monobook-Skin */',
-'myskin.css' => '/* CSS opp dise Sted wirtjt opp daut MySkin-Skin */',
-'chick.css' => '/* CSS opp dise Sted wirtjt opp daut Chick-Skin */',
-'simple.css' => '/* CSS opp dise Sted wirtjt opp daut Simple-Skin */',
 'modern.css' => '/* CSS opp dise Sted wirtjt opp daut Modern-Skin */',
 'print.css' => '/* CSS opp dise Sted woat daut Utkome vom Dretje aundasch moake */',
 
 # Scripts
 'common.js' => '/* Daut neachste JavaScript woat fe aula Brucka jelode. */',
-'standard.js' => '/* Daut neachste JavaScript woat fe Brucka mett Standard-Skin jelode. */',
-'nostalgia.js' => '/* Daut neachste JavaScript woat fe Brucka mett Nostalgie-Skin jelode. */',
 'cologneblue.js' => '/* Daut neachste JavaScript woat fe Brucka mett Keloonsch-Blau-Skin jelode */',
 'monobook.js' => '/* Daut neachste JavaScript woat fe Brucka mett Monobook-Skin jelode */',
-'myskin.js' => '/* Daut neachste JavaScript woat fe Brucka mett MySkin-Skin jelode */',
-'chick.js' => '/* Daut neachste JavaScript woat fe Brucka mett Chick-Skin jelode */',
-'simple.js' => '/* Daut neachste JavaScript woat fe Brucka mett Eenfach-Skin jelode */',
 'modern.js' => '/* Daut neachste JavaScript woat fe Brucka mett Modern-Skin jelode. */',
 
 # Metadata
diff --git a/languages/messages/MessagesPfl.php b/languages/messages/MessagesPfl.php
index 4e2ac399..9d774d02 100644
--- a/languages/messages/MessagesPfl.php
+++ b/languages/messages/MessagesPfl.php
@@ -21,8 +21,8 @@ $namespaceNames = array(
 	NS_MEDIA            => 'Medium',
 	NS_SPECIAL          => 'Schbezial',
 	NS_TALK             => 'Babble',
-	NS_USER             => 'Benudzer',
-	NS_USER_TALK        => 'Benudzer_Dischbediere',
+	NS_USER             => 'Middawaida',
+	NS_USER_TALK        => 'Middawaida_Dischbediere',
 	NS_PROJECT_TALK     => '$1_Dischbediere',
 	NS_FILE             => 'Dadai',
 	NS_FILE_TALK        => 'Dadai_Dischbediere',
@@ -32,27 +32,31 @@ $namespaceNames = array(
 	NS_TEMPLATE_TALK    => 'Vorlach_Dischbediere',
 	NS_HELP             => 'Hilf',
 	NS_HELP_TALK        => 'Hilf_Dischbediere',
-	NS_CATEGORY         => 'Kadegorie',
-	NS_CATEGORY_TALK    => 'Kadegorie_Dischbediere',
+	NS_CATEGORY         => 'Sachgrubb',
+	NS_CATEGORY_TALK    => 'Sachgrubb_Dischbediere',
 );
 
 $namespaceAliases = array(
 	# German namespaces
-	'Medium'               => NS_MEDIA,
-	'Spezial'              => NS_SPECIAL,
-	'Diskussion'           => NS_TALK,
-	'Benutzer'             => NS_USER,
-	'Benutzer_Diskussion'  => NS_USER_TALK,
-	'$1_Diskussion'        => NS_PROJECT_TALK,
-	'Datei'                => NS_FILE,
-	'Datei_Diskussion'     => NS_FILE_TALK,
-	'MediaWiki_Diskussion' => NS_MEDIAWIKI_TALK,
-	'Vorlage'              => NS_TEMPLATE,
-	'Vorlage_Diskussion'   => NS_TEMPLATE_TALK,
-	'Hilfe'                => NS_HELP,
-	'Hilfe_Diskussion'     => NS_HELP_TALK,
-	'Kategorie'            => NS_CATEGORY,
-	'Kategorie_Diskussion' => NS_CATEGORY_TALK,
+	'Medium'                 => NS_MEDIA,
+	'Spezial'                => NS_SPECIAL,
+	'Diskussion'             => NS_TALK,
+	'Benutzer'               => NS_USER,
+	'Benutzer_Diskussion'    => NS_USER_TALK,
+	'Benudzer'               => NS_USER,
+	'Benudzer_Dischbediere'  => NS_USER_TALK,
+	'$1_Diskussion'          => NS_PROJECT_TALK,
+	'Datei'                  => NS_FILE,
+	'Datei_Diskussion'       => NS_FILE_TALK,
+	'MediaWiki_Diskussion'   => NS_MEDIAWIKI_TALK,
+	'Vorlage'                => NS_TEMPLATE,
+	'Vorlage_Diskussion'     => NS_TEMPLATE_TALK,
+	'Hilfe'                  => NS_HELP,
+	'Hilfe_Diskussion'       => NS_HELP_TALK,
+	'Kategorie'              => NS_CATEGORY,
+	'Kategorie_Diskussion'   => NS_CATEGORY_TALK,
+	'Kadegorie'              => NS_CATEGORY,
+	'Kadegorie_Dischbediere' => NS_CATEGORY_TALK,
 );
 
 $messages = array(
@@ -65,7 +69,6 @@ $messages = array(
 'tog-previewontop' => 'Vorbligg owwahalwb vum Beaawaidungsfenschda zaische',
 'tog-previewonfirst' => 'Zaischen Vorbligg baim erschdemol Schaffe',
 'tog-oldsig' => 'Voahonneni Unnaschfrid',
-'tog-showjumplinks' => 'Schdellde "Hubs uff"-Lingg',
 'tog-uselivepreview' => 'Uuvazeschada Vorbligg (bneedischd JavaScript) (vasugswais)',
 'tog-showhiddencats' => 'Zaisch vaschdeglde Grubbe',
 
@@ -240,7 +243,7 @@ Waad ä bissl un brobieas nomol.
 $1',
 'pool-errorunknown' => 'Ubkonnde Irrdumm',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Iwwa {{SITENAME}}',
 'aboutpage' => 'Project:Iwwa',
 'copyright' => 'Was do drin schded isch unna $1 vafieschba.',
@@ -250,7 +253,6 @@ $1',
 'disclaimers' => 'Hafdungsausschluß',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Unaschdizung fas Beawaide',
-'edithelppage' => 'Help:Ännere',
 'helppage' => 'Help:Inhald',
 'mainpage' => 'Schdadsaid',
 'mainpage-description' => 'Schdadsaid',
@@ -599,9 +601,6 @@ Ealaidarung: '''({{int:cur}})''' = Unnaschied zu jezd,
 'powersearch-toggleall' => 'Alli',
 'powersearch-togglenone' => 'Kään',
 
-# Quickbar
-'qbsettings-none' => 'Kään',
-
 # Preferences page
 'preferences' => 'Obzione',
 'mypreferences' => 'Oischdellunge',
@@ -723,7 +722,6 @@ Doi Address werd ned gzaischd, wõnse midda babbln.',
 'recentchangeslinked-feed' => 'Ännarunge on valinggde Saide',
 'recentchangeslinked-toolbox' => 'Ännarunge uff verlingde Saide',
 'recentchangeslinked-title' => 'Ännarunge õn Saide, wu „$1“ druff verlinggd',
-'recentchangeslinked-noresult' => 'Do isch nix gännad worre inde Zaid.',
 'recentchangeslinked-summary' => "Die Lischd zaischd ledschdi Ännarunge, vunna bschdimmde Said, wu do valinggd isch (odda ä Midglied vunna bschdimmde Sachgrubb isch).
 Saide uff [[Special:Watchlist|Doina Beowachdungslischd]] sinn '''fedd'''.",
 'recentchangeslinked-page' => 'Saide:',
@@ -793,8 +791,6 @@ Saide uff [[Special:Watchlist|Doina Beowachdungslischd]] sinn '''fedd'''.",
 'statistics' => 'Schdadischdigge',
 'statistics-pages' => 'Saide',
 
-'disambiguationspage' => 'Template:Vadaidlischung',
-
 'brokenredirects-edit' => 'beawaide',
 'brokenredirects-delete' => 'lesche',
 
@@ -964,7 +960,7 @@ Der Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uf
 'contributions' => '{{GENDER:$1|Wassa gemachd hodd}}',
 'contributions-title' => 'Middawaidabaidräsch vun $1',
 'mycontris' => 'Baidräsch',
-'contribsub2' => 'Fer $1 ($2)',
+'contribsub2' => 'Fa $1 ($2)',
 'uctop' => '(geschewedisch)',
 'month' => 'än Monad (un frieja):',
 'year' => 'Abm Johr (un frieja):',
@@ -1177,7 +1173,7 @@ Wonn die Dadai vaännad worre isch, donn konns soi, daß zusedzlischi Õgawe fa
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-iimcategory' => 'Sachgrubb',
 'exif-iimsupplementalcategory' => 'Ergenzndi Sachgrubbe',
 
diff --git a/languages/messages/MessagesPi.php b/languages/messages/MessagesPi.php
index f77b1118..1c2b21f4 100644
--- a/languages/messages/MessagesPi.php
+++ b/languages/messages/MessagesPi.php
@@ -1,5 +1,5 @@
 <?php
-/** Pali (पालि)
+/** Pali (पािऴ)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -8,7 +8,6 @@
  * @file
  *
  * @author Eukesh (on pi.wikipedia.org)
- * @author Hemant wikikosh1
  * @author Vibhijain
  */
 
@@ -46,102 +45,40 @@ $digitTransformTable = array(
 
 $messages = array(
 # Dates
-'january' => 'ज्यानुवरी',
-'february' => 'फ़रवरी',
-'march' => 'मार्च',
-'april' => 'अप्रैल',
-'may_long' => 'मई',
-'june' => 'जून',
-'july' => 'जुलाई',
-'august' => 'अगस्त',
+'january'   => 'ज्यानुवरी',
+'february'  => 'फ़रवरी',
+'march'     => 'मार्च',
+'april'     => 'अप्रैल',
+'may_long'  => 'मई',
+'june'      => 'जून',
+'july'      => 'जुलाई',
+'august'    => 'अगस्त',
 'september' => 'सेप्टेम्बर',
-'october' => 'ओक्टोबर',
-'november' => 'नवम्बर',
-'december' => 'दिसम्बर',
+'october'   => 'ओक्टोबर',
+'november'  => 'नवम्बर',
+'december'  => 'दिसम्बर',
 
 'article' => 'लेख पत्त',
 
-# Vector skin
-'vector-view-create' => 'रचेतु',
-
-'help' => 'सहायता',
-'search' => 'अन्वेसना',
-'searchbutton' => 'खोज',
+'searchbutton'  => 'खोज',
 'searcharticle' => 'गच्छामि',
-'create' => 'रचेतु',
-'talkpagelinktext' => 'सम्भासनं',
-'talk' => 'सम्भासनं',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => '{{SITENAME}} इच्चस्स विसये',
-'disclaimers' => 'पच्चाक्खानं',
-'mainpage' => 'पमुख पत्त',
+'mainpage'             => 'पमुख पत्त',
 'mainpage-description' => 'पमुख पत्त',
-'portal' => 'समुदायद्वारं',
-'portal-url' => 'Project:समुदायद्वारं',
-'privacy' => 'गोपनीयता-नीति',
-
-'editsection' => 'सम्पादेतु',
-'editsectionhint' => 'एतं विभागं सम्पादेतु',
-'red-link-title' => '$1 (पिट्ठं न वत्तति)',
-
-# Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'पिट्ठं',
-
-# Parser/template warnings
-'post-expand-template-inclusion-warning' => "'''पबोधो:''' फलकानं योजनस्स आकारो अतिविसालो वत्तति।
-कानिचन फलकानि योजेतुं न सक्कन्ति ।",
-
-# History pages
-'currentrev-asof' => 'वत्तमाना आवुत्ति  $1 इति समये',
-'previousrevision' => '↓← पुरातनं अवतरणं',
-
-# Search results
-'searchmenu-new' => 'अस्मिं विकियं "[[:$1]]" इति पिट्ठं रचेतु।',
-'search-result-size' => '$1 ({{PLURAL:$2|1 सद्दो|$2 सद्दा}})',
-
-# Recent changes
-'recentchanges' => 'सज्जोजातानि परिवत्तनानि',
-'hide' => 'गोपेतु',
-'show' => 'दस्सेतु',
-
-# Random page
-'randompage' => 'यदिच्छकपिट्ठं',
-
-# Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|बाइटं|बाइटानि}}',
 
 # Book sources
 'booksources-go' => 'गच्छामि',
 
 # Special:AllPages
-'allarticles' => 'सब्ब लेखा',
+'allarticles'    => 'सब्ब लेखा',
 'allpagessubmit' => 'गच्छामि',
 
-# Block/unblock
-'contribslink' => 'योगदानानि',
-
-# Export
-'export' => 'पिट्ठानं निय्यातं करोतु',
-
 # Namespace 8 related
 'allmessagesname' => 'नाम',
 
-# Tooltip help for the actions
-'tooltip-ca-talk' => 'पिट्ठन्तग्गतविसये सम्भासनं',
-'tooltip-ca-move' => 'इदं पिट्ठं चालेतु',
-'tooltip-ca-watch' => 'इदं पिट्ठं भवतो अवेक्खणसूचियं योजेतु',
-'tooltip-search' => '{{SITENAME}} इच्चेत्थ अन्विस्सतु',
-'tooltip-search-fulltext' => 'एतं वचनं पिट्ठेसु अन्विस्सतु',
-'tooltip-p-logo' => 'मुखपिट्ठं गच्छतु',
-'tooltip-n-recentchanges' => 'सज्जोजातानं परिवत्तनानं सूची',
-'tooltip-n-randompage' => 'यदिच्छकं पिट्ठं गच्छतु',
-'tooltip-n-help' => 'अन्वेसनठानं',
-'tooltip-t-specialpages' => 'सब्बेसं पमुखानं पिट्ठानं सूची',
-'tooltip-summary' => 'संखित्तं सारंसं योजेतु',
-
 # EXIF tags
-'exif-gpslatitude' => 'अक्षांश',
+'exif-gpslatitude'  => 'अक्षांश',
 'exif-gpslongitude' => 'देशान्तर',
 
 'exif-sensingmethod-1' => 'अपरिभाषित',
diff --git a/languages/messages/MessagesPl.php b/languages/messages/MessagesPl.php
index 6839c7cf..289e770b 100644
--- a/languages/messages/MessagesPl.php
+++ b/languages/messages/MessagesPl.php
@@ -97,15 +97,21 @@ $namespaceGenderAliases = array(
 $dateFormats = array(
 	'mdy time' => 'H:i',
 	'mdy date' => 'M j, Y',
+	'mdy monthonly' => 'F Y',
 	'mdy both' => 'H:i, M j, Y',
+	'mdy pretty' => 'j xg',
 
 	'dmy time' => 'H:i',
 	'dmy date' => 'j M Y',
+	'dmy monthonly' => 'F Y',
 	'dmy both' => 'H:i, j M Y',
+	'dmy pretty' => 'j xg',
 
 	'ymd time' => 'H:i',
 	'ymd date' => 'Y M j',
+	'ymd monthonly' => 'Y F',
 	'ymd both' => 'H:i, Y M j',
+	'ymd pretty' => 'j xg',
 );
 
 $fallback8bitEncoding = 'iso-8859-2';
@@ -333,9 +339,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Pokaż liczbę użytkowników obserwujących stronę',
 'tog-oldsig' => 'Twój obecny podpis',
 'tog-fancysig' => 'Traktuj podpis jako wikikod (nie linkuj automatycznie całości)',
-'tog-externaleditor' => 'Domyślnie używaj zewnętrznego edytora (tylko dla zaawansowanych użytkowników; wymaga odpowiedniego skonfigurowania komputera)',
-'tog-externaldiff' => 'Domyślnie używaj zewnętrznego programu pokazującego zmiany (tylko dla zaawansowanych użytkowników; wymaga odpowiedniego skonfigurowania komputera)',
-'tog-showjumplinks' => 'Włącz odnośniki „skocz do”',
 'tog-uselivepreview' => 'Używaj dynamicznego podglądu (eksperymentalny)',
 'tog-forceeditsummary' => 'Informuj o niewypełnieniu opisu zmian',
 'tog-watchlisthideown' => 'Ukryj moje edycje na liście obserwowanych',
@@ -349,6 +352,8 @@ $messages = array(
 'tog-showhiddencats' => 'Pokazuj ukryte kategorie',
 'tog-noconvertlink' => 'Wyłącz konwersję tytułów w linkach',
 'tog-norollbackdiff' => 'Pomiń pokazywanie zmian po użyciu funkcji „cofnij”',
+'tog-useeditwarning' => 'Ostrzegaj mnie, gdy opuszczam stronę edycji bez zapisania zmian',
+'tog-prefershttps' => 'Zawsze używaj bezpiecznego połączenia po zalogowaniu',
 
 'underline-always' => 'zawsze',
 'underline-never' => 'nigdy',
@@ -412,6 +417,18 @@ $messages = array(
 'oct' => 'paź',
 'nov' => 'lis',
 'dec' => 'gru',
+'january-date' => '$1 stycznia',
+'february-date' => '$1 lutego',
+'march-date' => '$1 marca',
+'april-date' => '$1 kwietnia',
+'may-date' => '$1 maja',
+'june-date' => '$1 czerwca',
+'july-date' => '$1 lipca',
+'august-date' => '$1 sierpnia',
+'september-date' => '$1 września',
+'october-date' => '$1 października',
+'november-date' => '$1 listopada',
+'december-date' => '$1 grudnia',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategoria|Kategorie}}',
@@ -493,6 +510,7 @@ $messages = array(
 'create-this-page' => 'Utwórz tę stronę',
 'delete' => 'Usuń',
 'deletethispage' => 'Usuń tę stronę',
+'undeletethispage' => 'Przywróć tę stronę',
 'undelete_short' => 'odtwórz {{PLURAL:$1|1 wersję|$1 wersje|$1 wersji}}',
 'viewdeleted_short' => 'Podgląd {{PLURAL:$1|usuniętej|$1 usuniętych}} wersji',
 'protect' => 'Zabezpiecz',
@@ -536,7 +554,7 @@ $1',
 'pool-queuefull' => 'Kolejka zadań jest pełna',
 'pool-errorunknown' => 'Błąd nieznany',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'O {{GRAMMAR:MS.lp|{{SITENAME}}}}',
 'aboutpage' => 'Project:O {{GRAMMAR:MS.lp|{{SITENAME}}}}',
 'copyright' => 'Treść udostępniana na licencji $1, jeśli nie podano inaczej.',
@@ -546,7 +564,6 @@ $1',
 'disclaimers' => 'Informacje prawne',
 'disclaimerpage' => 'Project:Informacje prawne',
 'edithelp' => 'Pomoc w edycji',
-'edithelppage' => 'Help:Jak edytować stronę',
 'helppage' => 'Help:Spis treści',
 'mainpage' => 'Strona główna',
 'mainpage-description' => 'Strona główna',
@@ -624,17 +641,12 @@ Listę dostępnych stron specjalnych znajdziesz [[Special:SpecialPages|tutaj]].'
 # General errors
 'error' => 'Błąd',
 'databaseerror' => 'Błąd bazy danych',
-'dberrortext' => 'Wystąpił błąd składni w zapytaniu do bazy danych.
-Może to oznaczać błąd w oprogramowaniu.
-Ostatnie, nieudane zapytanie to:
-<blockquote><code>$1</code></blockquote>
-wysłane przez funkcję „<code>$2</code>”.
-Baza danych zgłosiła błąd „<samp>$3: $4</samp>”.',
-'dberrortextcl' => 'Wystąpił błąd składni w zapytaniu do bazy danych.
-Ostatnie, nieudane zapytanie to:
-„$1”
-wywołane zostało przez funkcję „$2”.
-Baza danych zgłosiła błąd „$3: $4”',
+'databaseerror-text' => 'Wystąpił błąd podczas wykonywania zapytania do bazy danych.
+Może to wskazywać na błąd w oprogramowaniu.',
+'databaseerror-textcl' => 'Wystąpił błąd podczas wykonywania zapytania do bazy danych.',
+'databaseerror-query' => 'Zapytanie: $1',
+'databaseerror-function' => 'Funkcja: $1',
+'databaseerror-error' => 'Błąd: $1',
 'laggedslavemode' => 'Uwaga! Ta strona może nie zawierać najnowszych aktualizacji.',
 'readonly' => 'Baza danych jest zablokowana',
 'enterlockreason' => 'Podaj powód zablokowania bazy oraz szacunkowy termin jej odblokowania',
@@ -668,6 +680,7 @@ Możliwe, że zostały już usunięte przez kogoś innego.',
 'cannotdelete-title' => 'Nie można usunąć strony „$1”.',
 'delete-hook-aborted' => 'Usuwanie przerwane przez hak.
 Przyczyna nieokreślona.',
+'no-null-revision' => 'Nie można utworzyć zerowej wersji strony "$1"',
 'badtitle' => 'Niepoprawny tytuł',
 'badtitletext' => 'Podano niepoprawny tytuł strony. Prawdopodobnie jest pusty lub zawiera znaki, których użycie jest zabronione.',
 'perfcached' => 'Poniższe dane są kopią z pamięci podręcznej i mogą być nieaktualne. Maksymalnie {{PLURAL:$1|jeden wynik jest|$1 wyniki są|$1 wyników jest}} w pamięci podręcznej.',
@@ -688,12 +701,15 @@ By dodać lub zmienić tłumaczenia wszystkich serwisów wiki, użyj [//translat
 'editinginterface' => "'''Ostrzeżenie:''' Edytujesz stronę, która zawiera tekst interfejsu oprogramowania.
 Zmiany na tej stronie zmienią wygląd interfejsu dla innych użytkowników tej wiki.
 By dodać lub zmienić tłumaczenia wszystkich wiki, użyj [//translatewiki.net/wiki/Main_Page?setlang=pl translatewiki.net], specjalizowany projekt lokalizacji oprogramowania MediaWiki.",
-'sqlhidden' => '(ukryto zapytanie SQL)',
 'cascadeprotected' => 'Ta strona została zabezpieczona przed edycją, ponieważ jest ona zawarta na {{PLURAL:$1|następującej stronie, która została zabezpieczona|następujących stronach, które zostały zabezpieczone}} z włączoną opcją dziedziczenia:
 $2',
 'namespaceprotected' => "Nie masz uprawnień do edytowania stron w przestrzeni nazw '''$1'''.",
 'customcssprotected' => 'Nie jesteś uprawniony do edytowania tej strony CSS, ponieważ zawiera ona ustawienia osobiste innego użytkownika.',
 'customjsprotected' => 'Nie jesteś uprawniony do edytowania tej strony JavaScript, ponieważ zawiera ona ustawienia osobiste innego użytkownika.',
+'mycustomcssprotected' => 'Nie masz uprawnień do edytowania tej strony CSS.',
+'mycustomjsprotected' => 'Nie masz uprawnień do edytowania tej strony JavaScript.',
+'myprivateinfoprotected' => 'Nie masz uprawnień do edytowania swoich prywatnych danych.',
+'mypreferencesprotected' => 'Nie masz uprawnień do edytowania swoich preferencji.',
 'ns-specialprotected' => 'Stron specjalnych nie można edytować.',
 'titleprotected' => "Utworzenie strony o tej nazwie zostało zablokowane przez [[User:$1|$1]].
 Uzasadnienie blokady: ''$2''.",
@@ -718,10 +734,19 @@ Zauważ, że do momentu wyczyszczenia pamięci podręcznej przeglądarki niektó
 'welcomecreation-msg' => 'Twoje konto zostało utworzone.
 Nie zapomnij dostosować [[Special:Preferences|preferencji]].',
 'yourname' => 'Nazwa {{GENDER:|użytkownika|użytkowniczki}}',
+'userlogin-yourname' => 'Nazwa użytkownika',
+'userlogin-yourname-ph' => 'Wprowadź swoją nazwę użytkownika',
+'createacct-another-username-ph' => 'Wprowadź nazwę użytkownika',
 'yourpassword' => 'Hasło',
+'userlogin-yourpassword' => 'Hasło',
+'userlogin-yourpassword-ph' => 'Wpisz swoje hasło',
+'createacct-yourpassword-ph' => 'Wprowadź hasło',
 'yourpasswordagain' => 'Powtórz hasło',
+'createacct-yourpasswordagain' => 'Potwierdź hasło',
+'createacct-yourpasswordagain-ph' => 'Wprowadź hasło jeszcze raz',
 'remembermypassword' => 'Zapamiętaj moje hasło na tym komputerze (maksymalnie przez $1 {{PLURAL:$1|dzień|dni}})',
-'securelogin-stick-https' => 'Po zalogowaniu utrzymuj połączenie poprzez HTTPS',
+'userlogin-remembermypassword' => 'Nie wylogowuj mnie',
+'userlogin-signwithsecure' => 'Użyj bezpiecznego połączenia',
 'yourdomainname' => 'Twoja domena',
 'password-change-forbidden' => 'Nie można zmieniać haseł na tej wiki.',
 'externaldberror' => 'Wystąpił błąd zewnętrznej bazy autentyfikacyjnej lub nie posiadasz uprawnień koniecznych do aktualizacji zewnętrznego konta.',
@@ -733,18 +758,41 @@ Nie zapomnij dostosować [[Special:Preferences|preferencji]].',
 'logout' => 'Wyloguj',
 'userlogout' => 'Wyloguj',
 'notloggedin' => 'Nie jesteś zalogowany',
+'userlogin-noaccount' => 'Nie masz konta?',
+'userlogin-joinproject' => 'Dołącz do {{GRAMMAR:D.lp|{{SITENAME}}}}',
 'nologin' => 'Nie masz konta? $1.',
 'nologinlink' => 'Zarejestruj się',
 'createaccount' => 'Załóż nowe konto',
 'gotaccount' => "Masz już konto? '''$1'''.",
 'gotaccountlink' => 'Zaloguj się',
 'userlogin-resetlink' => 'Zapomniałeś danych do zalogowania się?',
+'userlogin-resetpassword-link' => 'Nie pamiętasz hasła?',
+'helplogin-url' => 'Help:Logowanie',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc z logowaniem]]',
+'createacct-join' => 'Wpisz poniżej swoje dane.',
+'createacct-another-join' => 'Wprowadź szczegóły nowego konta poniżej.',
+'createacct-emailrequired' => 'Adres e‐mail',
+'createacct-emailoptional' => 'Adres e-mail (opcjonalnie)',
+'createacct-email-ph' => 'Wpisz swój adres e-mail',
+'createacct-another-email-ph' => 'Podaj adres e-mail',
 'createaccountmail' => 'Użyj tymczasowego hasła wygenerowanego losowo i wyślij je na podany adres e-mail',
+'createacct-realname' => 'Prawdziwe imię i nazwisko (opcjonalnie)',
 'createaccountreason' => 'Powód',
+'createacct-reason' => 'Powód',
+'createacct-reason-ph' => 'Dlaczego zakładasz kolejne konto',
+'createacct-captcha' => 'Kontrola bezpieczeństwa',
+'createacct-imgcaptcha-ph' => 'Wpisz tekst widoczny powyżej',
+'createacct-submit' => 'Utwórz konto',
+'createacct-another-submit' => 'Utwórz kolejne konto',
+'createacct-benefit-heading' => '{{grammar:B.lp|{{SITENAME}}}} tworzą ludzie tacy jak Ty.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edycja|edycje|edycji}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|strona|strony|stron}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|użytkownik|użytkowników}} w ostatnim czasie',
 'badretype' => 'Wprowadzone hasła różnią się między sobą.',
 'userexists' => 'Wybrana przez Ciebie nazwa użytkownika jest już zajęta.
 Wybierz inną nazwę użytkownika.',
 'loginerror' => 'Błąd logowania',
+'createacct-error' => 'Błąd tworzenia konta',
 'createaccounterror' => 'Nie można utworzyć konta $1',
 'nocookiesnew' => 'Konto użytkownika zostało utworzone, ale nie jesteś zalogowany.
 {{SITENAME}} używa ciasteczek do przechowywania informacji o zalogowaniu się.
@@ -809,10 +857,12 @@ Zaloguj się teraz i je zmień.
 Możesz zignorować tę wiadomość, jeśli konto zostało utworzone przez pomyłkę.',
 'usernamehasherror' => 'Nazwa użytkownika nie może zawierać znaków kratki „#”',
 'login-throttled' => 'Zbyt wiele razy próbowałeś zalogować się na to konto.
-Odczekaj chwilę zanim ponowisz próbę.',
+Odczekaj $1 zanim ponowisz próbę.',
 'login-abort-generic' => 'Logowanie nieudane – przerwano',
 'loginlanguagelabel' => 'Język: $1',
 'suspicious-userlogout' => 'Żądanie wylogowania zostało odrzucone ponieważ wygląda na to, że zostało wysłane przez uszkodzoną przeglądarkę lub buforujący serwer proxy.',
+'createacct-another-realname-tip' => 'Wpisanie imienia i nazwiska nie jest obowiązkowe.
+Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje autorstwo.',
 
 # Email sending
 'php-mail-error-unknown' => 'Wystąpił nieznany błąd w funkcji PHP mail()',
@@ -829,8 +879,7 @@ Aby zakończyć proces logowania, musisz ustawić nowe hasło:',
 'newpassword' => 'Nowe hasło',
 'retypenew' => 'Powtórz nowe hasło',
 'resetpass_submit' => 'Ustaw hasło i zaloguj się',
-'resetpass_success' => 'Hasło zostało pomyślnie zmienione!
-Zaraz zostanesz zalogowany ...',
+'changepassword-success' => 'Twoje hasło zostało pomyślnie zmienione!',
 'resetpass_forbidden' => 'Hasła nie mogą zostać zmienione',
 'resetpass-no-info' => 'Musisz być zalogowany, by uzyskać bezpośredni dostęp do tej strony.',
 'resetpass-submit-loggedin' => 'Zmień hasło',
@@ -842,10 +891,11 @@ Być może właśnie zmienił{{GENDER:|eś|aś|eś(‐aś)}} swoje hasło lub po
 
 # Special:PasswordReset
 'passwordreset' => 'Wyczyść hasło',
-'passwordreset-text' => 'Wypełnij formularz, aby zresetować swoje hasło.',
+'passwordreset-text-one' => 'Wypełnij ten formularz, aby zresetować hasło.',
+'passwordreset-text-many' => '{{PLURAL:$1|Wypełnij jedno z poniższych pól, aby zresetować hasło.}}',
 'passwordreset-legend' => 'Zresetuj hasło',
 'passwordreset-disabled' => 'Na tej wiki wyłączono możliwość resetowania haseł.',
-'passwordreset-pretext' => '{{PLURAL:$1||Wprowadź jedną z danych poniżej}}',
+'passwordreset-emaildisabled' => 'Wysyłanie emaili zostało wyłączone na tej wiki',
 'passwordreset-username' => 'Nazwa użytkownika:',
 'passwordreset-domain' => 'Domena',
 'passwordreset-capture' => 'Czy pokazywać treść wiadomości e‐mail?',
@@ -868,7 +918,7 @@ Powinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inny popr
 Tymczasowe hasło – $2',
 'passwordreset-emailsent' => 'E‐mail pozwalający na zresetowanie hasła został wysłany.',
 'passwordreset-emailsent-capture' => 'Wyświetlony poniżej e‐mail pozwalający na zresetowanie hasła został wysłany.',
-'passwordreset-emailerror-capture' => 'Poniżej wyświetlony e‐mail z przypomnieniem został wygenerowany, ale nie udało się wysłać go do użytkownika: $1',
+'passwordreset-emailerror-capture' => 'Poniżej wyświetlony e‐mail pozwalający na zresetowanie hasła został wygenerowany, ale nie udało się wysłać go do {{GENDER:$2|użytkownika|użytkowniczki}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Zmiana adresu e‐mail',
@@ -882,6 +932,19 @@ Tymczasowe hasło – $2',
 'changeemail-submit' => 'Zapisz nowy',
 'changeemail-cancel' => 'Anuluj',
 
+# Special:ResetTokens
+'resettokens' => 'Resetuj tokeny',
+'resettokens-text' => 'Na tej stronie możesz zresetować tokeny, które umożliwiają dostęp do pewnych prywatnych danych związanych z Twoim kontem.
+
+Należy to zrobić, jeśli ktoś je poznał lub zdobył hasło do Twojego konta.',
+'resettokens-no-tokens' => 'Brak tokenów do zresetowania.',
+'resettokens-legend' => 'Resetuj tokeny',
+'resettokens-tokens' => 'Tokeny:',
+'resettokens-token-label' => '$1 (obecna wartość: $2)',
+'resettokens-watchlist-token' => 'Token kanału internetowego (Atom/RSS) zmian w [[Special:Watchlist|obserwowanych stronach]]',
+'resettokens-done' => 'Tokeny zresetowane.',
+'resettokens-resetbutton' => 'Zresetuj wybrane tokeny',
+
 # Edit page toolbar
 'bold_sample' => 'Tekst tłustą czcionką',
 'bold_tip' => 'Tekst tłustą czcionką',
@@ -1084,12 +1147,15 @@ Wystąpił z nieokreślonej przyczyny.',
 Zdaje się, że została skasowana.',
 'edit-conflict' => 'Konflikt edycji.',
 'edit-no-change' => 'Twoja edycja została zignorowana, ponieważ nie zmienił{{GENDER:|eś|aś|eś(‐aś)}} niczego w tekście.',
+'postedit-confirmation' => 'Twoja edycja została zapisana.',
 'edit-already-exists' => 'Nie udało się stworzyć nowej strony.
 Strona już istnieje.',
 'defaultmessagetext' => 'Domyślny tekst komunikatu',
 'content-failed-to-parse' => 'Format zawartości typu $2 (dla modelu: $1) nieprawidłowy: $3',
 'invalid-content-data' => 'Zawartość strony zawiera nieprawidłowe dane',
 'content-not-allowed-here' => 'Zawartość tego typu ($1) nie jest dozwolona na stronie [[$2]]',
+'editwarning-warning' => 'Opuszczenie tej strony może spowodować utratę wprowadzonych przez Ciebie zmian.
+Jeśli jesteś zalogowany możesz wyłączyć wyświetlanie tego ostrzeżenia w zakładce Edycja w swoich preferencjach.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1124,6 +1190,7 @@ Argument ten będzie pominięty.',
 'undo-failure' => 'Edycja nie może zostać wycofana z powodu konfliktu z wersjami pośrednimi.',
 'undo-norev' => 'Edycja nie może być cofnięta, ponieważ nie istnieje lub została usunięta.',
 'undo-summary' => 'Anulowanie wersji $1 autora [[Special:Contributions/$2|$2]] ([[User talk:$2|dyskusja]])',
+'undo-summary-username-hidden' => 'Anulowanie wersji $1 autorstwa ukrytego użytkownika',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Nie można utworzyć konta',
@@ -1303,6 +1370,7 @@ Użycie linków nawigacyjnych kasuje wybór w kolumnie.',
 'compareselectedversions' => 'porównaj wybrane wersje',
 'showhideselectedversions' => 'Pokaż lub ukryj zaznaczone wersje',
 'editundo' => 'anuluj edycję',
+'diff-empty' => '(Brak różnic)',
 'diff-multi' => '(Nie pokazano $1 wersji {{PLURAL:$1|utworzonej|utworzonych}} przez {{PLURAL:$2|jednego użytkownika|$2 użytkowników}})',
 'diff-multi-manyusers' => '(Nie pokazano $1 {{PLURAL:$1|pośredniej wersji utworzonej|pośrednich wersji utworzonych}} przez {{PLURAL:$2|jednego użytkownika|$2 użytkowników}})',
 'difference-missing-revision' => '{{PLURAL:$2|Wersja|$2 wersje|$2 wersji}} #$1 strony "{{PAGENAME}}" nie {{PLURAL:$2|została znaleziona|zostały znalezione|zostało znalezionych}}.
@@ -1329,7 +1397,6 @@ Zazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powó
 'searchmenu-legend' => 'Opcje wyszukiwania',
 'searchmenu-exists' => "* Strona '''[[$1]]'''",
 'searchmenu-new' => "'''Utwórz stronę „[[:$1|$1]]” na tej wiki.'''",
-'searchhelp-url' => 'Help:Spis treści',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Przeglądaj strony zaczynające się od tego przedrostka]]',
 'searchprofile-articles' => 'Strony',
 'searchprofile-project' => 'Strony pomocy i projektu',
@@ -1372,15 +1439,7 @@ Zazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powó
 'searchdisabled' => 'Wyszukiwanie w {{GRAMMAR:MS.lp|{{SITENAME}}}} zostało wyłączone.
 W międzyczasie możesz skorzystać z wyszukiwania Google.
 Jednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google nieaktualne.',
-
-# Quickbar
-'qbsettings' => 'Pasek szybkiego dostępu',
-'qbsettings-none' => 'Brak',
-'qbsettings-fixedleft' => 'Stały, z lewej',
-'qbsettings-fixedright' => 'Stały, z prawej',
-'qbsettings-floatingleft' => 'Unoszący się, z lewej',
-'qbsettings-floatingright' => 'Unoszący się, z prawej',
-'qbsettings-directionality' => 'Ustawione na stałe, zgodnie z kierunkiem zapisywania w wybranym języku',
+'search-error' => 'Wystąpił błąd podczas wyszukiwania:$1',
 
 # Preferences page
 'preferences' => 'Preferencje',
@@ -1414,7 +1473,6 @@ Jednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google ni
 'resetprefs' => 'Cofnij niezapisane zmiany',
 'restoreprefs' => 'Przywróć wszystkie domyślne preferencje (we wszystkich sekcjach)',
 'prefs-editing' => 'Edycja',
-'prefs-edit-boxsize' => 'Rozmiar okna edycji.',
 'rows' => 'Wiersze',
 'columns' => 'Kolumny',
 'searchresultshead' => 'Wyszukiwanie',
@@ -1425,9 +1483,9 @@ Jednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google ni
 'recentchangesdays-max' => '(maksymalnie $1 {{PLURAL:$1|dzień|dni}})',
 'recentchangescount' => 'Domyślna liczba wyświetlanych edycji',
 'prefs-help-recentchangescount' => 'Uwzględnia ostatnie zmiany, historię stron i rejestry.',
-'prefs-help-watchlist-token' => 'Wypełnianie tego pola tajnym kluczem spowoduje wygenerowanie RSS dla Twojej listy obserwowanych.
-Każdy znający ten klucz będzie mógł zobaczyć listę obserwowanych, należy więc wybrać bezpieczną wartość.
-Wygenerowany losowo klucz, którego możesz użyć to $1',
+'prefs-help-watchlist-token2' => 'To jest tajny klucz umożliwiający dostęp do kanału internetowego zmian w obserwowanych przez ciebie stronach.
+Każdy, kto go zna, będzie mógł je zobaczyć, więc zachowaj go dla siebie.
+[[Special:ResetTokens|Kliknij tu, jeśli musisz go zresetować]].',
 'savedprefs' => 'Twoje preferencje zostały zapisane.',
 'timezonelegend' => 'Strefa czasowa',
 'localtime' => 'Czas lokalny',
@@ -1458,7 +1516,6 @@ Wygenerowany losowo klucz, którego możesz użyć to $1',
 'prefs-reset-intro' => 'Na tej stronie można przywrócić domyślne ustawienia preferencji dla tej witryny.
 Tej operacji nie można później cofnąć.',
 'prefs-emailconfirm-label' => 'Potwierdzenie adresu e‐mail',
-'prefs-textboxsize' => 'Rozmiar okna edycji',
 'youremail' => 'Twój adres e‐mail',
 'username' => '{{GENDER:$1|Nazwa użytkownika}}:',
 'uid' => '{{GENDER:$1|Identyfikator użytkownika}}:',
@@ -1490,6 +1547,8 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'prefs-dateformat' => 'Format daty',
 'prefs-timeoffset' => 'Różnica czasu',
 'prefs-advancedediting' => 'Opcje ogólne',
+'prefs-editor' => 'Edytor',
+'prefs-preview' => 'Podgląd',
 'prefs-advancedrc' => 'Zaawansowane',
 'prefs-advancedrendering' => 'Zaawansowane',
 'prefs-advancedsearchoptions' => 'Zaawansowane',
@@ -1497,7 +1556,9 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'prefs-displayrc' => 'Opcje wyświetlania',
 'prefs-displaysearchoptions' => 'Opcje wyświetlania',
 'prefs-displaywatchlist' => 'Opcje wyświetlania',
+'prefs-tokenwatchlist' => 'Token',
 'prefs-diffs' => 'Zmiany',
+'prefs-help-prefershttps' => 'Ta opcja zacznie działać przy twoim następnym zalogowaniu.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Wygląda na prawidłowy',
@@ -1524,6 +1585,8 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'userrights-notallowed' => 'Nie jesteś upoważniony do nadawania i odbierania uprawnień użytkownikom.',
 'userrights-changeable-col' => 'Grupy, które możesz wybrać',
 'userrights-unchangeable-col' => 'Grupy, których nie możesz wybrać',
+'userrights-conflict' => 'Konflikt zmiany uprawnień użytkownika! Proszę sprawdzić i potwierdzić swoje zmiany.',
+'userrights-removed-self' => 'Pomyślnie odebrałeś sobie uprawnienia. W związku z tym nie masz już dostępu do tej strony.',
 
 # Groups
 'group' => 'Grupa',
@@ -1589,11 +1652,19 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'right-proxyunbannable' => 'Obejście automatycznych blokad proxy',
 'right-unblockself' => 'Odblokowanie samego siebie',
 'right-protect' => 'Zmiana stopnia zabezpieczenia i dostęp do edycji stron zabezpieczonych kaskadowo',
-'right-editprotected' => 'Dostęp do edycji zabezpieczonych stron (bez zabezpieczenia dziedziczonego)',
+'right-editprotected' => 'Edycja stron zabezpieczonych na poziomie „{{int:protect-level-sysop}}”',
+'right-editsemiprotected' => 'Edycja stron zabezpieczonych na poziomie „{{int:protect-level-autoconfirmed}}”',
 'right-editinterface' => 'Edycja interfejsu użytkownika',
 'right-editusercssjs' => 'Edycja plików CSS i JS innych użytkowników',
 'right-editusercss' => 'Edycja plików CSS innych użytkowników',
 'right-edituserjs' => 'Edycja plików JS innych użytkowników',
+'right-editmyusercss' => 'Edytuj własne pliki CSS',
+'right-editmyuserjs' => 'Edytuj własne pliki JavaScript',
+'right-viewmywatchlist' => 'Podgląd swojej listy obserwowanych stron',
+'right-editmywatchlist' => 'Edycja swojej listy obserwowanych stron. Niektóre akcje mogą dodawać strony do obserwowanych bez tego uprawnienia.',
+'right-viewmyprivateinfo' => 'Podgląd swoich prywatnych danych (np. adres e-mail, prawdziwe imię i nazwisko)',
+'right-editmyprivateinfo' => 'Edycja swoich prywatnych danych (np. adres e-mail, prawdziwe imię i nazwisko)',
+'right-editmyoptions' => 'Edycja swoich preferencji',
 'right-rollback' => 'Szybkie wycofanie zmian wprowadzonych przez użytkownika, który jako ostatni edytował jakąś stronę',
 'right-markbotedits' => 'Oznaczanie rewertu jako edycji bota',
 'right-noratelimit' => 'Brak ograniczeń przepustowości',
@@ -1655,12 +1726,19 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'action-userrights-interwiki' => 'edytowania uprawnień użytkowników na innych witrynach wiki',
 'action-siteadmin' => 'blokowania i odblokowywania bazy danych',
 'action-sendemail' => 'wysyłania e-maili',
+'action-editmywatchlist' => 'edycji swojej listy obserwowanych stron',
+'action-viewmywatchlist' => 'zobaczenia swojej listy obserwowanych stron',
+'action-viewmyprivateinfo' => 'zobaczenia swoich prywatnych danych',
+'action-editmyprivateinfo' => 'edycji swoich prywatnych danych',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|zmiana|zmiany|zmian}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|od ostatniej wizyty}}',
+'enhancedrc-history' => 'historia',
 'recentchanges' => 'Ostatnie zmiany',
 'recentchanges-legend' => 'Opcje ostatnich zmian',
 'recentchanges-summary' => 'Ta strona przedstawia historię ostatnich zmian w tej wiki.',
+'recentchanges-noresult' => 'Brak zmian w wybranym okresie spełniających twoje kryteria.',
 'recentchanges-feed-description' => 'Obserwuj najświeższe zmiany w tej wiki.',
 'recentchanges-label-newpage' => 'W tej edycji utworzono nową stronę',
 'recentchanges-label-minor' => 'To jest drobna zmiana',
@@ -1697,7 +1775,6 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'recentchangeslinked-feed' => 'Zmiany w linkowanych',
 'recentchangeslinked-toolbox' => 'Zmiany w linkowanych',
 'recentchangeslinked-title' => 'Zmiany w linkowanych z „$1”',
-'recentchangeslinked-noresult' => 'Nie było żadnych zmian na (zależnie od ustawień) linkowanych lub linkujących stronach w wybranym okresie.',
 'recentchangeslinked-summary' => "Poniżej znajduje się lista ostatnich zmian na stronach linkowanych z podanej strony (lub we wszystkich stronach należących do podanej kategorii).
 Strony z [[Special:Watchlist|listy obserwowanych]] są '''wytłuszczone'''.",
 'recentchangeslinked-page' => 'Tytuł strony',
@@ -1709,7 +1786,7 @@ Strony z [[Special:Watchlist|listy obserwowanych]] są '''wytłuszczone'''.",
 'reuploaddesc' => 'Przerwij wysyłanie i wróć do formularza wysyłki',
 'upload-tryagain' => 'Zapisz zmieniony opis pliku',
 'uploadnologin' => 'Nie jesteś zalogowany',
-'uploadnologintext' => 'Musisz się [[Special:UserLogin|zalogować]] przed przesłaniem plików.',
+'uploadnologintext' => 'Musisz $1 przed przesłaniem plików.',
 'upload_directory_missing' => 'Katalog dla przesyłanych plików ($1) nie istnieje i nie może zostać utworzony przez serwer WWW.',
 'upload_directory_read_only' => 'Serwer nie może zapisywać do katalogu ($1) przeznaczonego na przesyłane pliki.',
 'uploaderror' => 'Błąd wysyłania',
@@ -1941,7 +2018,6 @@ Ponieważ ta wiki została skonfigurowana jako publiczna dla zapewnienia optymal
 'http-read-error' => 'Błąd odczytu HTTP.',
 'http-timed-out' => 'Przekroczony czas żądania HTTP.',
 'http-curl-error' => 'Błąd pobierania z adresu $1',
-'http-host-unreachable' => 'Adres jest nieosiągalny.',
 'http-bad-status' => 'Wystąpił problem z realizacją żądania HTTP $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1971,6 +2047,10 @@ Możesz także spróbować w czasie mniejszego obciążenia serwera.',
 'listfiles_size' => 'Wielkość',
 'listfiles_description' => 'Opis',
 'listfiles_count' => 'Wersje',
+'listfiles-show-all' => 'Uwzględnij starsze wersje zdjęć',
+'listfiles-latestversion' => 'Aktualna wersja',
+'listfiles-latestversion-yes' => 'Tak',
+'listfiles-latestversion-no' => 'Nie',
 
 # File description page
 'file-anchor-link' => 'Plik',
@@ -2068,6 +2148,13 @@ Sprawdź inne linki do szablonów, zanim usuniesz tę stronę.',
 'randompage' => 'Losowa strona',
 'randompage-nopages' => 'Brak stron w {{PLURAL:$2|przestrzeni nazw|przestrzeniach nazw:}} $1.',
 
+# Random page in category
+'randomincategory' => 'Losowa strona w kategorii',
+'randomincategory-invalidcategory' => '"$1" nie jest prawidłową nazwą kategorii.',
+'randomincategory-nopages' => 'Nie ma żadnych stron w [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Pobierz losową stronę z kategorii: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Dalej',
+
 # Random redirect
 'randomredirect' => 'Losowe przekierowanie',
 'randomredirect-nopages' => 'Brak jakichkolwiek przekierowań w przestrzeni nazw „$1”.',
@@ -2093,17 +2180,13 @@ Sprawdź inne linki do szablonów, zanim usuniesz tę stronę.',
 'statistics-users-active-desc' => 'Użytkownicy, którzy byli aktywni w ciągu {{PLURAL:$1|ostatniego dnia|ostatnich $1 dni}}',
 'statistics-mostpopular' => 'Najczęściej odwiedzane strony',
 
-'disambiguations' => 'Strony linkujące do stron ujednoznaczniających',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Poniższe strony odwołują się do '''stron ujednoznaczniających''',
-a powinny odwoływać się bezpośrednio do stron treści.<br />
-Strona uznawana jest za ujednoznaczniającą, jeśli zawiera szablon linkowany przez stronę [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop' => 'Strony z właściwościami',
 'pageswithprop-legend' => 'Strony z właściwościami',
 'pageswithprop-text' => 'Ta strona zawiera listę stron korzystających z właściwości.',
 'pageswithprop-prop' => 'Nazwa właściwości:',
 'pageswithprop-submit' => 'Pokaż',
+'pageswithprop-prophidden-long' => 'długa wartość własności ukryta ($1)',
+'pageswithprop-prophidden-binary' => 'binarna wartość własności ukryta ($1)',
 
 'doubleredirects' => 'Podwójne przekierowania',
 'doubleredirectstext' => 'Lista zawiera strony z przekierowaniami do stron, które przekierowują do innej strony.
@@ -2161,6 +2244,7 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
 'mostrevisions' => 'Strony o największej liczbie wersji',
 'prefixindex' => 'Wszystkie strony o prefiksie',
 'prefixindex-namespace' => 'Wszystkie strony z prefiksem (przestrzeń nazw $1)',
+'prefixindex-strip' => 'Ukryj prefiks na liście wyników',
 'shortpages' => 'Najkrótsze strony',
 'longpages' => 'Najdłuższe strony',
 'deadendpages' => 'Strony bez linków wewnętrznych',
@@ -2176,6 +2260,7 @@ Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, d
 'listusers' => 'Lista użytkowników',
 'listusers-editsonly' => 'Pokaż tylko użytkowników z edycjami',
 'listusers-creationsort' => 'Sortuj według daty utworzenia',
+'listusers-desc' => 'Sortuj w kolejności malejącej',
 'usereditcount' => '$1 {{PLURAL:$1|edycja|edycje|edycji}}',
 'usercreated' => '{{GENDER:$3|Utworzył|Utworzyła|Utworzone}} $1 o $2',
 'newpages' => 'Nowe strony',
@@ -2352,10 +2437,9 @@ Każda zmiana treści tej strony lub związanej z nią strony dyskusji zostanie
 'unwatchthispage' => 'Nie obserwuj',
 'notanarticle' => 'To nie jest artykuł',
 'notvisiblerev' => 'Wersja została usunięta',
-'watchnochange' => 'Żadna z obserwowanych stron nie była edytowana w podanym okresie.',
 'watchlist-details' => 'Lista obserwowanych przez Ciebie stron zawiera {{PLURAL:$1|$1 pozycję|$1 pozycje|$1 pozycji}}, nie licząc stron dyskusji.',
-'wlheader-enotif' => '* Wysyłanie powiadomień na adres e‐mail jest włączone.',
-'wlheader-showupdated' => "* '''Wytłuszczone''' zostały strony, które zostały zmodyfikowane od Twojej ostatniej na nich wizyty.",
+'wlheader-enotif' => 'Wysyłanie powiadomień na adres e‐mail jest włączone.',
+'wlheader-showupdated' => "'''Wytłuszczone''' zostały strony, które zostały zmodyfikowane od Twojej ostatniej wizyty na nich.",
 'watchmethod-recent' => 'poszukiwanie ostatnich zmian wśród obserwowanych stron',
 'watchmethod-list' => 'poszukiwanie obserwowanych stron wśród ostatnich zmian',
 'watchlistcontains' => 'Na liście obserwowanych przez Ciebie stron {{PLURAL:$1|znajduje się 1 pozycja|znajdują się $1 pozycje|znajduje się $1 pozycji}}.',
@@ -2603,7 +2687,7 @@ $1',
 'contributions' => 'Wkład {{GENDER:$1|użytkownika|użytkowniczki}}',
 'contributions-title' => 'Wkład {{GENDER:$1|użytkownika|użytkowniczki}} $1',
 'mycontris' => 'Edycje',
-'contribsub2' => 'Dla użytkownika $1 ($2)',
+'contribsub2' => 'Dla {{GENDER:$3|użytkownika|użytkowniczki}} $1 ($2)',
 'nocontribs' => 'Brak zmian odpowiadających tym kryteriom.',
 'uctop' => '(ostatnia)',
 'month' => 'Do miesiąca (włącznie)',
@@ -2761,15 +2845,13 @@ By przejrzeć listę obecnie aktywnych blokad, przejdź na stronę [[Special:Blo
 Należy on do zablokowanego zakresu adresów $2. Odblokować można tylko cały zakres.',
 'ip_range_invalid' => 'Niepoprawny zakres adresów IP.',
 'ip_range_toolarge' => 'Zakresy IP większe niż /$1 są niedozwolone.',
-'blockme' => 'Zablokuj mnie',
 'proxyblocker' => 'Blokowanie proxy',
-'proxyblocker-disabled' => 'Ta funkcja jest wyłączona.',
 'proxyblockreason' => 'Twój adres IP został zablokowany, ponieważ jest to adres otwartego proxy.
 O tym poważnym problemie dotyczącym bezpieczeństwa należy poinformować dostawcę Internetu lub pomoc techniczną.',
-'proxyblocksuccess' => 'Wykonano.',
 'sorbsreason' => 'Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.',
 'sorbs_create_account_reason' => 'Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.
 Nie możesz utworzyć konta',
+'xffblockreason' => 'Adres IP obecny w nagłówku X-Forwarded-For – twój lub serwera proxy, z którego korzystasz – został zablokowany. Powód blokady to: $1',
 'cant-block-while-blocked' => 'Nie możesz zablokować innych użytkowników, kiedy sam jesteś zablokowany.',
 'cant-see-hidden-user' => 'Konto użytkownika, które próbujesz zablokować, zostało już zablokowane oraz ukryte. Bez uprawnienia do ukrywania kont nie możesz zobaczyć oraz modyfikować blokady tego użytkownika.',
 'ipbblocked' => 'Nie możesz blokować i odblokowywać innych użytkowników, ponieważ sam jesteś zablokowany',
@@ -2933,6 +3015,8 @@ Odwiedź [//www.mediawiki.org/wiki/Localisation Tłumaczenie MediaWiki] oraz [//
 'thumbnail-more' => 'Powiększ',
 'filemissing' => 'Brak pliku',
 'thumbnail_error' => 'Błąd przy generowaniu miniatury $1',
+'thumbnail_error_remote' => 'Komunikat o błędzie z {{grammar:2sg|$1}}:
+$2',
 'djvu_page_error' => 'Strona DjVu poza zakresem',
 'djvu_no_xml' => 'Nie można pobrać danych w formacie XML dla pliku DjVu',
 'thumbnail-temp-create' => 'Nie można utworzyć pliku tymczasowego miniatury',
@@ -3083,17 +3167,11 @@ Pozwala na wpisanie powodu w opisie zmian.',
 
 # Stylesheets
 'common.css' => '/* Umieszczony tutaj kod CSS zostanie zastosowany we wszystkich skórkach */',
-'standard.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Standardowa */',
-'nostalgia.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Tęsknota */',
 'cologneblue.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Błękit */',
 'monobook.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Książka */',
-'myskin.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Moja skórka */',
-'chick.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Kurczaczek */',
-'simple.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Prosta */',
 'modern.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Nowoczesna */',
 'vector.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Wektor */',
 'print.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd wydruku */',
-'handheld.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd na urządzeniach kieszonkowych skórki ustawionej w zmiennej $wgHandheldStyle */',
 'noscript.css' => '/* Umieszczony tu arkusz stylów CSS będzie wykorzystywany dla użytkowników z wyłączoną obsługą JavaScript */',
 'group-autoconfirmed.css' => '/* CSS tutaj umieszczony będzie dotyczyć tylko automatycznie zatwierdzonych użytkowników */',
 'group-bot.css' => '/* CSS tutaj umieszczony będzie obowiązywał tylko dla botów */',
@@ -3102,13 +3180,8 @@ Pozwala na wpisanie powodu w opisie zmian.',
 
 # Scripts
 'common.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany przez każdego użytkownika, podczas każdego ładowania strony. */',
-'standard.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Standardowa */',
-'nostalgia.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Tęsknota */',
 'cologneblue.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Błękit */',
 'monobook.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Książka */',
-'myskin.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Moja skórka */',
-'chick.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Kurczaczek */',
-'simple.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Prosta */',
 'modern.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Nowoczesna */',
 'vector.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Wektor */',
 
@@ -3184,13 +3257,8 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 'pageinfo-category-files' => 'Liczba plików',
 
 # Skin names
-'skinname-standard' => 'Standardowa',
-'skinname-nostalgia' => 'Tęsknota',
 'skinname-cologneblue' => 'Błękit',
 'skinname-monobook' => 'Książka',
-'skinname-myskin' => 'Moja skórka',
-'skinname-chick' => 'Kurczaczek',
-'skinname-simple' => 'Prosta',
 'skinname-modern' => 'Nowoczesna',
 'skinname-vector' => 'Wektor',
 
@@ -3272,11 +3340,25 @@ Jeśli go otworzysz, możesz zarazić swój system.",
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minuty|$1 minut}}',
 'hours' => '{{PLURAL:$1|$1 godzina|$1 godziny|$1 godzin}}',
 'days' => '{{PLURAL:$1|$1 dzień|$1 dni}}',
+'weeks' => '{{PLURAL:$1|$1 tydzień|$1 tygodnie|$1 tygodni}}',
 'months' => '{{PLURAL:$1|$1 miesiąc|$1 miesiące|$1 miesięcy}}',
 'years' => '{{PLURAL:$1|$1 rok|$1 lata|$1 lat}}',
 'ago' => '$1 temu',
 'just-now' => 'przed chwilą',
 
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|przed godziną|$1 godziny temu|$1 godzin temu}}',
+'minutes-ago' => '{{PLURAL:$1|przed minutą|$1 minuty temu|$1 minut temu}}',
+'seconds-ago' => '{{PLURAL:$1|przed sekundą|$1 sekundy temu|$1 sekund temu}}',
+'monday-at' => 'poniedziałek, $1',
+'tuesday-at' => 'wtorek, $1',
+'wednesday-at' => 'środa, $1',
+'thursday-at' => 'czwartek, $1',
+'friday-at' => 'piątek, $1',
+'saturday-at' => 'sobota, $1',
+'sunday-at' => 'niedziela, $1',
+'yesterday-at' => 'wczoraj, $1',
+
 # Bad image list
 'bad_image_list' => 'Dane należy wprowadzić w formacie:
 
@@ -3306,7 +3388,7 @@ Pozostałe pola zostaną domyślnie ukryte.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Szerokość',
 'exif-imagelength' => 'Wysokość',
 'exif-bitspersample' => 'Bitów na próbkę',
@@ -3486,7 +3568,7 @@ Pozostałe pola zostaną domyślnie ukryte.
 'exif-originalimageheight' => 'Wysokość obrazu zanim został przycięty',
 'exif-originalimagewidth' => 'Szerokość obrazu zanim został przycięty',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'nieskompresowany',
 'exif-compression-2' => 'CCITT Grupa 3 Jednowymiarowe zmodyfikowane kodowanie długości algorytmem Huffmana',
 'exif-compression-3' => 'CCITT Grupa 3 kodowanie faksowe',
@@ -3806,7 +3888,6 @@ Czy na pewno chcesz ją ponownie utworzyć?",
 'confirm-unwatch-top' => 'Usunąć tę stronę z listy obserwowanych?',
 
 # Separators for various lists, etc.
-'autocomment-prefix' => '–&#32;',
 'percent' => '$1&#160;%',
 
 # Multipage image navigation
@@ -3932,7 +4013,6 @@ Możesz także użyć [[Special:EditWatchlist|standardowego edytora obserwowanyc
 'version-other' => 'Pozostałe',
 'version-mediahandlers' => 'Wtyczki obsługi mediów',
 'version-hooks' => 'Haki (ang. hooks)',
-'version-extension-functions' => 'Funkcje rozszerzeń',
 'version-parser-extensiontags' => 'Znaczniki rozszerzeń dla analizatora składni',
 'version-parser-function-hooks' => 'Funkcje haków analizatora składni (ang. parser function hooks)',
 'version-hook-name' => 'Nazwa haka (ang. hook name)',
@@ -3941,6 +4021,7 @@ Możesz także użyć [[Special:EditWatchlist|standardowego edytora obserwowanyc
 'version-license' => 'Licencja',
 'version-poweredby-credits' => "Ta wiki korzysta z oprogramowania '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001‐$1 $2.",
 'version-poweredby-others' => 'inni',
+'version-poweredby-translators' => 'tłumacze translatewiki.net',
 'version-credits-summary' => 'Następujące osoby wniosły istotny wkład w rozwój oprogramowania [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki jest wolnym oprogramowaniem – możesz je dystrybuować i modyfikować zgodnie z warunkami licencji GNU General Public License opublikowanej przez Free Software Foundation w wersji 2 tej licencji lub (jeśli wolisz) dowolnej późniejszej.
 
@@ -3954,12 +4035,17 @@ Powinieneś otrzymać [{{SERVER}}{{SCRIPTPATH}}/COPYING kopię licencji GNU Gene
 'version-entrypoints-header-entrypoint' => 'Punkt wejścia',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Ścieżka do pliku',
-'filepath-page' => 'Plik',
-'filepath-submit' => 'Przejdź',
-'filepath-summary' => 'Ta strona specjalna zwraca pełną ścieżkę do pliku.
-Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwierane w skojarzonym z nimi programie.',
+# Special:Redirect
+'redirect' => 'Przekierowanie według pliku, użytkownika albo identyfikatora wersji',
+'redirect-legend' => 'Przekieruj do pliku lub strony',
+'redirect-summary' => 'Ta strona specjalna przekierowuje do pliku (wg nazwy pliku), do strony (wg numeru wersji) albo do strony użytkownika (wg liczbowego identyfikatora użytkownika)',
+'redirect-submit' => 'Przejdź',
+'redirect-lookup' => 'Wyszukaj:',
+'redirect-value' => 'Wartość:',
+'redirect-user' => 'ID użytkownika',
+'redirect-revision' => 'Wersja strony',
+'redirect-file' => 'Nazwa pliku',
+'redirect-not-exists' => 'Nie znaleziono wartości',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Szukaj duplikatów pliku',
@@ -4008,12 +4094,16 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
 'tags' => 'Sprawdź zmiany w oparciu o wzorce tekstu',
 'tag-filter' => 'Filtr [[Special:Tags|wzorców tekstu]]',
 'tag-filter-submit' => 'Filtr',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Znacznik|Znaczniki}}]]: $2)',
 'tags-title' => 'Znaczniki',
 'tags-intro' => 'Na tej stronie znajduje się lista wzorców tekstu, dla których oprogramowanie może oznaczyć edycje, dodatkowo wskazując ich znaczenie.',
 'tags-tag' => 'Nazwa znacznika',
 'tags-display-header' => 'Wystąpienia na listach zmian',
 'tags-description-header' => 'Pełny opis znaczenia',
+'tags-active-header' => 'Aktywny?',
 'tags-hitcount-header' => 'Oznaczone zmiany',
+'tags-active-yes' => 'Tak',
+'tags-active-no' => 'Nie',
 'tags-edit' => 'edytuj',
 'tags-hitcount' => '$1 {{PLURAL:$1|zmiana|zmiany|zmian}}',
 
@@ -4034,6 +4124,7 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
 'dberr-problems' => 'Przepraszamy! Witryna ma problemy techniczne.',
 'dberr-again' => 'Spróbuj przeładować stronę za kilka minut.',
 'dberr-info' => '(Brak komunikacji z serwerem bazy danych – $1)',
+'dberr-info-hidden' => '(Nie można skontaktować się z serwerem bazy danych)',
 'dberr-usegoogle' => 'Możesz spróbować wyszukać w międzyczasie za pomocą Google.',
 'dberr-outofdate' => 'Uwaga – indeksy zawartości serwisu mogą być nieaktualne.',
 'dberr-cachederror' => 'Strona została pobrana z pamięci podręcznej i może być nieaktualna.',
@@ -4049,6 +4140,9 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
 'htmlform-submit' => 'Zapisz',
 'htmlform-reset' => 'Cofnij zmiany',
 'htmlform-selectorother-other' => 'Inne',
+'htmlform-no' => 'Nie',
+'htmlform-yes' => 'Tak',
+'htmlform-chosen-placeholder' => 'Wybierz opcję',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 z obsługą pełnotekstowego wyszukiwania',
@@ -4166,4 +4260,19 @@ W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zosta
 # Image rotation
 'rotate-comment' => 'Obraz został odwrócony o $1 {{PLURAL:$1|stopień|stopnie|stopni}} (w kierunku zgodnym z ruchem wskazówek zegara)',
 
+# Limit report
+'limitreport-title' => 'Dane profilowania parsera:',
+'limitreport-cputime' => 'Czas pracy (CPU)',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekunda|sekund}}',
+'limitreport-walltime' => 'Czas pracy (faktyczny)',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunda|sekund}}',
+'limitreport-ppvisitednodes' => 'Liczba odwiedzonych węzłów preprocesora',
+'limitreport-ppgeneratednodes' => 'Liczba wygenerowanych węzłów preprocesora',
+'limitreport-postexpandincludesize' => 'Rozmiar dołączonych elementów po ekspansji',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtów}}',
+'limitreport-templateargumentsize' => 'Rozmiar argumentów szablonów',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtów}}',
+'limitreport-expansiondepth' => 'Największa głębokość ekspansji',
+'limitreport-expensivefunctioncount' => 'Liczba wywołań kosztownych funkcji parsera',
+
 );
diff --git a/languages/messages/MessagesPms.php b/languages/messages/MessagesPms.php
index 744db426..c9bce10f 100644
--- a/languages/messages/MessagesPms.php
+++ b/languages/messages/MessagesPms.php
@@ -72,9 +72,6 @@ $messages = array(
 'tog-shownumberswatching' => "Smon-e ël nùmer d'utent che as ten-o la pàgina sot-euj",
 'tog-oldsig' => 'Firma esistenta:',
 'tog-fancysig' => "Traté la firma com dël test wiki (sensa n'anliura automàtica)",
-'tog-externaleditor' => "Dovré coma stàndard n'editor estern (mach për espert, a-i é dabzògn d'ampostassion speciaj dzora a sò ordinator. [//www.mediawiki.org/wiki/Manual:External_editors Për savèjne ëd pi.])",
-'tog-externaldiff' => "Dovré për stàndard un programa comparator estern (mach për espert, a-i é dabzògn d'ampostassion speciaj ansima a sò ordinator [//www.mediawiki.org/wiki/Manual:External_editors Për savèjne ëd pi.])",
-'tog-showjumplinks' => "Dovré j'anliure d'acessibilità dla sòrt «Andé a»",
 'tog-uselivepreview' => "Dovré la fonsion ''Preuva dal viv'' (sperimental)",
 'tog-forceeditsummary' => "Ciamé conferma se ël resumé dla modìfica a l'é veujd",
 'tog-watchlisthideown' => 'Stërmé mie modìfiche ant la ròba che im ten-o sot-euj',
@@ -88,6 +85,8 @@ $messages = array(
 'tog-showhiddencats' => 'Smon-e le categorìe stërmà',
 'tog-noconvertlink' => "Disativé la conversion dij tìtoj ant j'anliure",
 'tog-norollbackdiff' => "Fé nen vëdde le diferense apress d'avèj ripristinà",
+'tog-useeditwarning' => 'Aviseme quand che i chito na pàgina ëd modìfiche con dle modìfiche nen salvà',
+'tog-prefershttps' => "Dovré sempe na conession sigura pr'ësté andrinta al sistema",
 
 'underline-always' => 'Sempe',
 'underline-never' => 'Mai',
@@ -151,6 +150,18 @@ $messages = array(
 'oct' => 'otó',
 'nov' => 'nov',
 'dec' => 'dzè',
+'january-date' => '$1 gené',
+'february-date' => '$1 fërvé',
+'march-date' => '$1 mars',
+'april-date' => '$1 avril',
+'may-date' => '$1 maj',
+'june-date' => '$1 giugn',
+'july-date' => '$1 luj',
+'august-date' => '$1 ost',
+'september-date' => '$1 stèmber',
+'october-date' => '$1 otóber',
+'november-date' => '$1 novèmber',
+'december-date' => '$1 dzèmber',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorìa|Categorìe}}',
@@ -232,6 +243,7 @@ $messages = array(
 'create-this-page' => 'Creé sta pàgina',
 'delete' => 'Scancelé',
 'deletethispage' => 'Scancelé sa pàgina',
+'undeletethispage' => 'Arcuperé sta pàgina',
 'undelete_short' => 'Arcuperé {{PLURAL:$1|na modìfica|$1 modìfiche}}',
 'viewdeleted_short' => 'Vardé {{PLURAL:$1|na modìfica scancelà|$1 modìfiche scancelà}}',
 'protect' => 'Protege',
@@ -248,7 +260,7 @@ $messages = array(
 'articlepage' => 'Vëdde la pàgina ëd contnù',
 'talk' => 'Discussion',
 'views' => 'Vìsite',
-'toolbox' => "Bòita dj'utiss",
+'toolbox' => 'Utiss',
 'userpage' => 'Che a varda la pàgina Utent',
 'projectpage' => 'Che a varda la pàgina ëd proget',
 'imagepage' => "Vëdde la pàgina dl'archivi",
@@ -275,7 +287,7 @@ $1",
 'pool-queuefull' => "La coa ëd travaj a l'é pien-a",
 'pool-errorunknown' => 'Eror pa conossù',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'A propòsit ëd {{SITENAME}}',
 'aboutpage' => 'Project:A propòsit',
 'copyright' => "Ël contnù a resta disponìbil sota $1 gavà ch'a sia marcà an n'àutra manera.",
@@ -285,7 +297,6 @@ $1",
 'disclaimers' => 'Avertense',
 'disclaimerpage' => 'Project:Avertense generaj',
 'edithelp' => 'Agiut a la modìfica',
-'edithelppage' => "Help:Coma scrive n'artìcol",
 'helppage' => 'Help:Contnù',
 'mainpage' => 'Intrada',
 'mainpage-description' => 'Intrada',
@@ -362,17 +373,11 @@ Na lista dle pàgine speciaj bon-e a peul esse trovà ambelessì [[Special:Speci
 # General errors
 'error' => 'Eror',
 'databaseerror' => 'Eror ant la base ëd dat',
-'dberrortext' => "A l'é capitaje n'eror ëd sintassi ant la domanda mandà a la base dij dat.
-Sòn a peul vorèj dì n'eror ant ël programa.
-L'ùltima arcesta mandà a la base dij dat a l'é stàita:
-<blockquote><code>$1</code></blockquote>
-da 'nt la funsion «<code>$2</code>».
-La base dij dat a l'ha dàit n'eror «<samp>$3: $4</samp>».",
-'dberrortextcl' => "A-i é staje n'eror ant la sintassi d'anterogassion dla base ëd dat.
-L'ùltima anterogassion a l'é stàita:
-«$1»
-da andrinta a la funsion «$2».
-La base ëd dat a l'ha dane l'eror «$3: $4»",
+'databaseerror-text' => "A l'é rivaje n'eror d'arcesta ëd base ëd dàit. Sòn a podrìa ven-e da 'n givo ant ël programa.",
+'databaseerror-textcl' => "A l'é rivaje n'eror d'arcesta ëd base ëd dàit.",
+'databaseerror-query' => 'Arcesta: $1',
+'databaseerror-function' => 'Fonsion: $1',
+'databaseerror-error' => 'Eror: $1',
 'laggedslavemode' => "'''Avis:''' la pàgina a podrìa ëdcò nen mostré le modìfiche pi recente.",
 'readonly' => 'Acess a la base ëd dat sërà për chèich temp.',
 'enterlockreason' => 'Che a buta na rason për ël blocagi, con andrinta data e ora ëd quand che a stima che a sarà gavà.',
@@ -406,6 +411,7 @@ Peul desse ch'a l'é già stàit ëscancelà da cheidun d'àutr.",
 'cannotdelete-title' => 'As peul pa scancelesse la pàgina «$1»',
 'delete-hook-aborted' => "Scancelassion anulà da n'estension.
 A l'ha smonù gnun-e spiegassion.",
+'no-null-revision' => 'Impossìbil creé na neuva revision veuida për la pàgina « $1 »',
 'badtitle' => 'Tìtol nen giust',
 'badtitletext' => "Ël tìtol ëd la pàgina che a l'ha ciamà a l'era nen giust, veuid, o un tìtol nen lijà ëd fasson giusta antra le lenghe o antra le wiki. A podrìa conten-e un o pi caràter ch'a peulo nen esse dovrà ant ij tìtoj.",
 'perfcached' => "Ij dat sì-dapress a sòn ëstàit memorisà an local e a peulo esse nen agiornà. Al pi {{PLURAL:$1|n'arzultà a l'é disponìbil|$1 arzultà a son disponìbij}} ant la memòria local.",
@@ -426,11 +432,14 @@ Për gionté o modifiché dle tradussion për tute le wiki, për piasì ch'a deu
 'editinginterface' => "'''Dossman!''' A l'é dapress ch'a modìfica na pàgina ch'as deuvra për generé ël test dl'antërfacia dël programa. 
 Le modìfiche a sta pàgina a toco l'aparensa ëd l'antërfacia utent a tuti j'utent dzora a sta wiki. 
 Për gionté o cangé dle tradussion për tute le wiki, për piasì ch'a deuvra [//translatewiki.net/translatewiki.net], ël proget ëd localisassion ëd MediaWiki.",
-'sqlhidden' => "(l'anterogassion SQL a l'é stërmà)",
 'cascadeprotected' => 'Ant sta pàgina-sì as peulo pa fé ëd modìfiche, përché a-i intra ant {{PLURAL:$1|la pàgina|le pàgine}} butà sot a protession con la fonsion «a tombé» viscà ansima a: $2',
 'namespaceprotected' => "A l'ha nen ël përmess dë feje dle modìfiche a le pàgine dlë spassi nominal '''$1'''.",
 'customcssprotected' => "Ch'a varda ch'a l'ha pa ël përmess ëd modifiché sta pàgina ëd CSS, për via ch'a l'ha andrinta ij gust ëd n'àutr utent.",
 'customjsprotected' => "Ch'a varda ch'a l'ha pa ël përmess ëd modifiché sta pàgina ëd JavaScript, për via ch'a l'ha andrinta ij gust ëd n'àutr utent.",
+'mycustomcssprotected' => "A l'ha pa ël përmess ëd modifiché costa pàgina CSS.",
+'mycustomjsprotected' => "A l'ha pa ël përmess ëd modifiché costa pàgina JavaScript.",
+'myprivateinfoprotected' => "A l'ha pa ël përmess ëd modifiché soe anformassion privà.",
+'mypreferencesprotected' => "A l'ha pa ël përmess ëd modifiché ij sò gust.",
 'ns-specialprotected' => 'As peulo nen modifichesse le pàgine speciaj.',
 'titleprotected' => "La creassion ëd pàgine con ës tìtol-sì a l'é stàita proibìa da [[User:$1|$1]].
 Coma rason a l'ha butà: «''$2''».",
@@ -455,10 +464,19 @@ Ch'a nòta che chèiche pàgine a peulo continué a esse visualisà com s'a fuss
 'welcomecreation-msg' => "Sò cont a l'é stàit creà.
 Che a dësmentia pa ëd cambié ij [[Special:Preferences|sò gust për {{SITENAME}}]].",
 'yourname' => 'Stranòm:',
+'userlogin-yourname' => 'Stranòm',
+'userlogin-yourname-ph' => "Ch'a buta sò stranòm",
+'createacct-another-username-ph' => 'Buté lë stranòm',
 'yourpassword' => 'Soa ciav:',
+'userlogin-yourpassword' => 'Ciav',
+'userlogin-yourpassword-ph' => "Ch'a buta soa ciav",
+'createacct-yourpassword-ph' => "Ch'a buta na ciav",
 'yourpasswordagain' => 'Che a bata torna soa ciav:',
+'createacct-yourpasswordagain' => "Ch'a confirma la ciav",
+'createacct-yourpasswordagain-ph' => "Ch'a buta torna la ciav",
 'remembermypassword' => "Visesse ëd mia ciav ansima a 's navigador (për al pi $1 {{PLURAL:$1|di}})",
-'securelogin-stick-https' => "Resté colegà an HTTPS apress d'esse intrà ant ël sistema",
+'userlogin-remembermypassword' => 'Ten-me andrinta al sistema',
+'userlogin-signwithsecure' => 'Dovré na conession sigura',
 'yourdomainname' => 'Sò domini:',
 'password-change-forbidden' => 'A peul pa modifiché le ciav dzora a costa wiki.',
 'externaldberror' => "Ò che a l'é rivaje n'eror con la base ëd dàit d'autenticassion esterna, ò pura a l'é chiel che a l'é nen autorisà a agiornesse sò cont estern.",
@@ -470,18 +488,44 @@ Che a dësmentia pa ëd cambié ij [[Special:Preferences|sò gust për {{SITENAM
 'logout' => "Seurte da 'nt ël sistema",
 'userlogout' => 'Dësconession',
 'notloggedin' => 'Nen rintrà ant ël sistema',
+'userlogin-noaccount' => 'Ha-lo nen un cont?',
+'userlogin-joinproject' => "Ch'as gionza a {{SITENAME}}",
 'nologin' => 'Ha-lo ancó nen un cont? $1.',
 'nologinlink' => 'Creé un cont',
 'createaccount' => 'Creé un cont',
 'gotaccount' => 'Ha-lo già un sò cont? $1.',
 'gotaccountlink' => "Ch'a rintra ant ël sistema",
 'userlogin-resetlink' => "A l'ha dësmentià ij sò detaj për intré ant ël sistema?",
+'userlogin-resetpassword-link' => 'Riamposté la ciav',
+'helplogin-url' => 'Help:Conession',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Agiut con la conession]]',
+'userlogin-loggedin' => "A l'é già rintrà an ël sistema tanme {{GENDER:$1|$1}}.
+Ch'a deuvra ël formolari sì-sota për rintré coma n'àutr n'utent.",
+'userlogin-createanother' => "Creé n'àutr cont",
+'createacct-join' => "Ch'a anserissa soe anformassion sì-sota.",
+'createacct-another-join' => "Anserì j'anformassion dël cont neuv sì-sota.",
+'createacct-emailrequired' => 'Adrëssa ëd pòsta eletrònica',
+'createacct-emailoptional' => 'Adrëssa ëd pòsta eletrònica (opsional)',
+'createacct-email-ph' => "Ch'a buta soa adrëssa ëd pòsta eletrònica",
+'createacct-another-email-ph' => "Buté l'adrëssa ëd pòsta eletrònica",
 'createaccountmail' => "Dovré na ciav temporania d'ancàpit e mandela a l'adrëssa ëd pòsta eletrònica spessificà",
+'createacct-realname' => 'Nòm ver (opsional)',
 'createaccountreason' => 'Rason:',
+'createacct-reason' => 'Rason',
+'createacct-reason-ph' => "Përchè a crea n'àutr cont",
+'createacct-captcha' => 'Contròl ëd sigurëssa',
+'createacct-imgcaptcha-ph' => "Ch'a anserissa ël test ch'a s-ciàira sì-dzora",
+'createacct-submit' => "Ch'a crea sò cont",
+'createacct-another-submit' => "Creé n'àutr cont",
+'createacct-benefit-heading' => "{{SITENAME}} a l'é fàit da 'd gent coma chiel.",
+'createacct-benefit-body1' => '{{PLURAL:$1|modìfica|modìfiche}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pàgina|pàgine}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributor}} recent',
 'badretype' => "Le doe ciav che a l'ha scrivù a resto diferente antra 'd lor.",
 'userexists' => "Lë stranòm anserì a l'é già dovrà.
 Për piasì ch'a serna në stranòm diferent.",
 'loginerror' => 'Eror ën rintrand ant ël sistema',
+'createacct-error' => 'Eror durant la creassion dël cont',
 'createaccounterror' => "A l'é nen podusse creé ël cont: $1",
 'nocookiesnew' => "Sò cont a l'é duvèrt, ma chiel a l'ha nen podù rintré ant ël sistema.
 {{SITENAME}} a deuvra ij bëscotin për fé rintré la gent ant sò sistema. Belavans chiel a l'ha pa ij bëscotin abilità.
@@ -541,11 +585,13 @@ Për piasì che a buta n'adrëssa scrita giusta ò che a lassa ël camp veujd.",
 
 Se sòn a l'é rivà për eror, a peul lassé perde e fé gnente sensa problema.",
 'usernamehasherror' => "Lë stranòm d'utent a peul pa conten-e dij caràter ciapulà",
-'login-throttled' => "It l'has fàit tròpi tentativ recent d'intré.
-Për piasì speta prima ëd prové torna.",
+'login-throttled' => "A l'ha fàit tròpi tentativ recent d'intré ant ël sistema.
+Për piasì, ch'a speta $1 prima ëd prové torna.",
 'login-abort-generic' => "Sò tentitiv d'intré ant ël sistema a l'é falì - Abortì",
 'loginlanguagelabel' => 'Lenga: $1',
 'suspicious-userlogout' => "Soa arcesta ëd seurte dal sistema a l'é stàita arfudà përchè a smija com s'a fussa stàita mandà da 'n navigador rot o da l'archiviassion an local d'un prëstanòm.",
+'createacct-another-realname-tip' => "Ël nòm ver a l'é opsional.
+S'a decid ëd butelo, a sarà dovrà për dé a l'utent ël mérit ëd sò travaj.",
 
 # Email sending
 'php-mail-error-unknown' => 'Eror pa conossù ant la funsion mail() ëd PHP.',
@@ -561,7 +607,7 @@ Për piasì speta prima ëd prové torna.",
 'newpassword' => 'Neuva ciav:',
 'retypenew' => 'Che a scriva torna soa neuva ciav:',
 'resetpass_submit' => 'Argistré la ciav e rintré ant ël sistema',
-'resetpass_success' => "Soa ciav a l'é stàita registrà sensa problema. I soma dapress a rintré ant ël sistema...",
+'changepassword-success' => "Soa ciav a l'é stàita modificà sensa problema!",
 'resetpass_forbidden' => 'Le ciav as peulo pa cambiesse',
 'resetpass-no-info' => 'A dev esse rintrà ant ël sustema për acede diretament a sta pàgina.',
 'resetpass-submit-loggedin' => "Cangé 'd ciav",
@@ -573,10 +619,11 @@ Peul desse ch'a l'ha già cambià la ciav o a l'ha ciamà na neuva ciav provisò
 
 # Special:PasswordReset
 'passwordreset' => 'Ri-inissialisassion ëd la ciav',
-'passwordreset-text' => "Ch'a completa 's formolari për reimposté soa ciav.",
+'passwordreset-text-one' => "Ch'a completa 's formolari për reimposté soa ciav.",
+'passwordreset-text-many' => "{{PLURAL:$1|Ch'a compila un dij camp për riamposté soa ciav.}}",
 'passwordreset-legend' => 'Riampostassion ëd la ciav',
 'passwordreset-disabled' => "La reinissialisassion ëd le ciav a l'é stàita disabilità su sta wiki.",
-'passwordreset-pretext' => "{{PLURAL:$1||Ch'a anserissa un dij tòch ëd dat sì-sota}}",
+'passwordreset-emaildisabled' => 'Le fonsionalità ëd pòsta eletrònica a son ëstàite disativà su sta wiki.',
 'passwordreset-username' => 'Stranòm:',
 'passwordreset-domain' => 'Domini:',
 'passwordreset-capture' => 'Vëdde ël mëssagi arzultant?',
@@ -600,7 +647,7 @@ A dovrìa intré ant ël sistema e serne na ciav neuva adess. Se quaidun d'àutr
 Ciav provisòria: $2',
 'passwordreset-emailsent' => "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit spedì.",
 'passwordreset-emailsent-capture' => "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit mandà, e a l'é mostrà sì-sota.",
-'passwordreset-emailerror-capture' => "Un mëssagi ëd pro-memòria a l'é stàit generà, e a l'é smonù sì-sota, ma la spedission a l'utent a l'é falìa: $1",
+'passwordreset-emailerror-capture' => "Un mëssagi ëd riampostassion ëd la ciav a l'é stàit generà, e a l'é smonù sì-sota, ma la spedission a {{GENDER:$2|l'utent}} a l'é falìa: $1",
 
 # Special:ChangeEmail
 'changeemail' => "Cangé l'adrëssa ëd pòsta eletrònica",
@@ -614,6 +661,19 @@ Ciav provisòria: $2',
 'changeemail-submit' => "Cangé l'adrëssa ëd pòsta eletrònica",
 'changeemail-cancel' => 'Anulé',
 
+# Special:ResetTokens
+'resettokens' => 'Riamposté ij geton',
+'resettokens-text' => "Ambelessì a peul riamposté ij geton ch'a permëtto d'acede a chèich dàit privà associà a sò cont.
+
+A dovrìa felo si për asar chiel a l'ha partagiaje con cheidun o si sò cont a l'é stàit compromëttù.",
+'resettokens-no-tokens' => 'A-i é gnun geton da riamposté.',
+'resettokens-legend' => 'Riamposté ij geton.',
+'resettokens-tokens' => 'Geton:',
+'resettokens-token-label' => '$1 (valor atual: $2)',
+'resettokens-watchlist-token' => "Geton për ël fluss an sl'aragnà (Atom/RSS) ëd [[Special:Watchlist|modìfiche a le pàgine che as ten sot-euj]]",
+'resettokens-done' => 'Geton riampostà.',
+'resettokens-resetbutton' => 'Riamposté ij geton selessionà',
+
 # Edit page toolbar
 'bold_sample' => 'Test an grassèt',
 'bold_tip' => 'Test an grassèt',
@@ -777,19 +837,19 @@ L'aministrator che a l'ha fàit ël blocagi a l'ha dàit costa spiegassion: $1",
 L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
 'semiprotectedpagewarning' => "'''Nòta:''' Costa pàgina-sì a l'é stàita blocà an manera che mach j'utent registrà a peulo modifichela.
 L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
-'cascadeprotectedwarning' => "'''Tension:''' sta pàgina-sì a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo modifichela, për via che {{PLURAL:\$1|a l'é proteta|a-i intra ant le pàgine protete}} col sistema \"a cascada\":",
+'cascadeprotectedwarning' => "'''Tension:''' Sta pàgina a l'é stàita blocà an manera che mach j'utent con la qualìfica da aministrator a peulo modifichela, për via che a l'é comprèisa an {{PLURAL:$1|costa pàgina-sì|an coste pàgine-sì}} ch'a l'han ël sistema ëd protession a cascada:",
 'titleprotectedwarning' => "'''Avis: sta pàgina-sì a l'é stàita blocà an manera che a-i é dabzògn ëd [[Special:ListGroupRights|drit specìfich]] për creela.'''
 L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
-'templatesused' => '{{PLURAL:$1|Stamp|Stamp}} dovrà dzora a sta pàgina-sì:',
-'templatesusedpreview' => '{{PLURAL:$1|Stamp|Stamp}} dovrà ant sta preuva-sì:',
-'templatesusedsection' => '{{PLURAL:$1|Stamp|Stamp}} dovrà ant sta session-sì:',
+'templatesused' => '{{PLURAL:$1|Stamp}} dovrà da costa pàgina-sì:',
+'templatesusedpreview' => '{{PLURAL:$1|Stamp}} dovrà an costa preuva:',
+'templatesusedsection' => '{{PLURAL:$1|Stamp}} dovrà an costa session-sì:',
 'template-protected' => '(protet)',
 'template-semiprotected' => '(mes-protet)',
 'hiddencategories' => 'Sta pàgina-sì a fa part ëd {{PLURAL:$1|na categorìa|$1 categorìe}} stërmà:',
-'edittools' => "<!-- Test ch'a së s-ciàira sot a ij mòduj ëd mòdifica e 'd càrich d'archivi. -->",
-'nocreatetext' => "Cost sit-sì a l'ha limità la possibilità ëd creé dle pàgine neuve.
+'edittools' => "<!-- Test ch'a së s-ciàira sot a ij mòduj ëd modìfica e 'd carie d'archivi. -->",
+'nocreatetext' => "{{SITENAME}} a l'ha limità la possibilità ëd creé dle pàgine neuve.
 A peul torné andaré e modifiché na pàgina che a-i é già, ò pura [[Special:UserLogin|rintré ant ël sistema ò deurb-se un cont]].",
-'nocreate-loggedin' => "A l'ha pa ij përmess për creé dle pàgine neuve.",
+'nocreate-loggedin' => "A l'ha pa ël përmess ëd creé dle pàgine neuve.",
 'sectioneditnotsupported-title' => "La modìfica dla session a l'é nen prevëdùa",
 'sectioneditnotsupported-text' => "La modìfica dla session a l'é nen prevëdùa an costa pàgina ëd modìfica.",
 'permissionserrors' => 'Eror ant ij përmess',
@@ -808,12 +868,15 @@ A-i é pa gnun-e spiegassion.",
 A smija che a sia stàita scancelà.',
 'edit-conflict' => "Conflit d'edission.",
 'edit-no-change' => "Toa modìfica a l'é stàita ignorà, përchè a l'é pa stàit fàit gnun cambiament al test.",
+'postedit-confirmation' => "Soa modìfica a l'é stàita salvà!",
 'edit-already-exists' => 'As peul nen creesse la pàgina.
 A esist già.',
 'defaultmessagetext' => "Test che a-i sarìa se a-i fusso pa 'd modìfiche",
 'content-failed-to-parse' => "Faliment ëd l'anàlisi dël contnù ëd $2 për ël model $1: $3",
 'invalid-content-data' => 'Dat dël contnù pa bon',
 'content-not-allowed-here' => "Ël contnù «$1» a l'é nen autorisà an sla pàgina [[$2]]",
+'editwarning-warning' => "Chité sta pàgina-sì a peul feje perde tute le modìfiche ch'a l'ha fàit.
+S'a l'é rintrà ant ël sistema, a peul disabilité st'avis ant la session «Modìfiche» dij sò gust.",
 
 # Content models
 'content-model-wikitext' => 'test wiki',
@@ -848,6 +911,7 @@ Costi paràmeter a son stàit lassà fòra.",
 'undo-failure' => "Sta modìfica a l'é nen podusse scancelé për via che a-i son dle contradission antra version antrames.",
 'undo-norev' => "La modìfica a peul nen esse anulà përchè a esist pa o a l'é stàita anulà.",
 'undo-summary' => 'Gavà la revision $1 fàita da [[Special:Contributions/$2|$2]] ([[User talk:$2|Ciaciarade]])',
+'undo-summary-username-hidden' => "Anulé la revision $1 ëd n'utent ëstërmà",
 
 # Account creation failure
 'cantcreateaccounttitle' => "As peul pa registresse d'utent",
@@ -1026,6 +1090,7 @@ Ch'a varda mach che a-i ven-a nen fòra un rabel ant la continuità stòrica.",
 'compareselectedversions' => 'Paragon-a le version selessionà',
 'showhideselectedversions' => 'Smon-e/stërmé le version selessionà',
 'editundo' => "buta 'me ch'a l'era",
+'diff-empty' => '(Gnun-a diferensa)',
 'diff-multi' => "({{PLURAL:$1|Na revision antërmedia|$1 revision antërmedie}} ëd {{PLURAL:$2|n'utent|$2 utent}} pa mostrà)",
 'diff-multi-manyusers' => "({{PLURAL:$1|Na revision antërmedia|$1 revision antërmedie}} da pi che $2 {{PLURAL:$2|n'utent|utent}} pa mostrà)",
 'difference-missing-revision' => "{{PLURAL:$2|Na revision|$2 revision}} dë sta diferensa ($1) a {{PLURAL:$2|l'é pa stàita|son pa stàite}} trovà.
@@ -1054,7 +1119,6 @@ Sòn a l'é normalment causà da l'andèje dapress a na veja liura stòrica a na
 'searchmenu-legend' => "Opsion d'arserca",
 'searchmenu-exists' => "'''A-i é na pàgina ciamà \"[[:\$1]]\" dzora a costa wiki'''",
 'searchmenu-new' => "'''Creé la pàgina «[[:$1]]» ansima a sta wiki-sì!'''",
-'searchhelp-url' => 'Help:Contnù',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Visualisé le pàgine con sto prefiss-sì]]',
 'searchprofile-articles' => 'Pàgine ëd contnù',
 'searchprofile-project' => "Pàgine d'agiut e ëd proget",
@@ -1096,15 +1160,7 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
 'powersearch-togglenone' => 'Gnun',
 'search-external' => 'Arserca esterna',
 'searchdisabled' => "L'arserca anterna ëd {{SITENAME}} a l'é nen abilità; për adess a peul prové a dovré un motor d'arserca estern coma Google. (Però che a ten-a da ment che ij contnù ëd {{SITENAME}} listà ant ij motor pùblich a podrìo ëdcò esse nen d'autut agiornà)",
-
-# Quickbar
-'qbsettings' => 'Regolassion dla bara dij menù',
-'qbsettings-none' => 'Gnun',
-'qbsettings-fixedleft' => 'Fissà a la man ësnista',
-'qbsettings-fixedright' => 'Fissà a la man drita',
-'qbsettings-floatingleft' => 'Flotant a la man ësnista',
-'qbsettings-floatingright' => 'Flotant a la man drita',
-'qbsettings-directionality' => 'A pòst, an dipendensa dla diressionalità dë scritura ëd soa lenga',
+'search-error' => "A l'é rivaje n'eror durant l'arserca: $1",
 
 # Preferences page
 'preferences' => 'Mè gust',
@@ -1138,7 +1194,6 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
 'resetprefs' => 'Buté torna ij "mè gust" coma a-i ero al prinsipi',
 'restoreprefs' => "Buté torna j'ampostassion dë stàndard (an tute le session)",
 'prefs-editing' => 'Quàder ëd modìfica dël test',
-'prefs-edit-boxsize' => 'Dimension ëd la fnesta ëd modìfica.',
 'rows' => 'Righe:',
 'columns' => 'Colòne:',
 'searchresultshead' => "Specifiché soe preferense d'arserca",
@@ -1149,9 +1204,9 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
 'recentchangesdays-max' => '(al pì $1 {{PLURAL:$1|di|di}})',
 'recentchangescount' => 'Nùmer ëd modìfiche da smon-e për stàndard:',
 'prefs-help-recentchangescount' => "Sòn a comprend j'ùltime modìfiche, le stòrie dle pàgine e ij registr.",
-'prefs-help-watchlist-token' => "An ampinend sto camp-sì con na ciav segreta as genererà un fluss RSS për la ròba che as ten sot euj.
-Chicassìa che a conossa la ciav an sto camp-sì a podrà lese la ròba ch'a ten sot euj, parèj ch'a serna un valor sigur.
-Ambelessì a-i é un valor generà a asar che a peul dovré: $1",
+'prefs-help-watchlist-token2' => "Costa a l'é la ciav segreta dël fluss an sl'Aragnà dla lista ëd lòn ch'as ten sot-euj.
+Qualsëssìa përson-a ch'a la conòssa a podrà lese la lista ëd lòn che chiel a ten sot-euj, ch'a-j la mostra donca a gnun.
+[[Special:ResetTokens|Ch'a sgnaca ambelessì s'a l'ha damanca d'ampostela torna]].",
 'savedprefs' => 'Ij sò gust a son ëstàit salvà.',
 'timezonelegend' => 'Fus orari:',
 'localtime' => 'Ora local:',
@@ -1182,7 +1237,6 @@ Ambelessì a-i é un valor generà a asar che a peul dovré: $1",
 'prefs-reset-intro' => 'A peul dovré costa pàgina për amposté torna ij sò gust a coj dë stàndard.
 Sòn a peul pa esse anulà.',
 'prefs-emailconfirm-label' => "Conferma dl'adrëssa ëd pòsta eletrònica:",
-'prefs-textboxsize' => 'Dimension ëd la fnestra ëd modìfica',
 'youremail' => 'Soa adrëssa ëd pòsta eletrònica:',
 'username' => '{{GENDER:$1|Stranòm}}:',
 'uid' => "Identificativ dl'{{GENDER:$1|utent}}:",
@@ -1217,6 +1271,8 @@ Costa anformassion a sarà pùblica.",
 'prefs-dateformat' => 'Formà dla data',
 'prefs-timeoffset' => "Diferensa d'ora",
 'prefs-advancedediting' => 'Opsion generaj',
+'prefs-editor' => 'Redator',
+'prefs-preview' => 'Preuva',
 'prefs-advancedrc' => 'Opsion avansà',
 'prefs-advancedrendering' => 'Opsion avansà',
 'prefs-advancedsearchoptions' => 'Opsion avansà',
@@ -1224,7 +1280,9 @@ Costa anformassion a sarà pùblica.",
 'prefs-displayrc' => 'Opsion ëd visualisassion',
 'prefs-displaysearchoptions' => 'Opsion ëd visualisassion',
 'prefs-displaywatchlist' => 'Opsion ëd visualisassion',
+'prefs-tokenwatchlist' => 'Geton',
 'prefs-diffs' => 'Diferense',
+'prefs-help-prefershttps' => 'Costa preferensa a ancaminrà a marcé a soa pròssima conession.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'A smija bon',
@@ -1252,6 +1310,8 @@ Costa anformassion a sarà pùblica.",
 'userrights-changeable-col' => "Partìe ch'a peul cambié",
 'userrights-unchangeable-col' => "Partìe ch'a peul pa cambié",
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => "Conflit ëd modìfica ëd drit utent! Për piasì, ch'a lesa torna e ch'a confirma soe modìfiche.",
+'userrights-removed-self' => "A l'ha gavà për da bin ij sò drit. Parèj a peul pa pi acede a costa pàgina.",
 
 # Groups
 'group' => 'Partìa:',
@@ -1317,11 +1377,19 @@ Costa anformassion a sarà pùblica.",
 'right-proxyunbannable' => "Dëscavalché ij blòch automatich dij servent d'anonimà",
 'right-unblockself' => 'Dësblochesse da soj',
 'right-protect' => 'Cambié ij livej ëd protession e modifiché le pàgine protegiùe an cascada',
-'right-editprotected' => 'Modifiché le pàgine protegiùe (sensa protession a cascada)',
+'right-editprotected' => 'Modifiché le pàgine protegiùe con «{{int:protect-level-sysop}}»',
+'right-editsemiprotected' => 'Modifiché le pàgine protegiùe con «{{int:protect-level-autoconfirmed}}»',
 'right-editinterface' => "Modifiché l'antërfacia utent",
 'right-editusercssjs' => "Modifiché j'archivi CSS e JavaScript d'àutri utent",
 'right-editusercss' => "Modifiché j'archivi CSS d'àutri utent",
 'right-edituserjs' => "Modifiché j'archivi JavaScript d'àutri utent",
+'right-editmyusercss' => 'Modifiché ij sò archivi CSS utent',
+'right-editmyuserjs' => 'Modifiché ij sò archivi JavaScript utent',
+'right-viewmywatchlist' => "Vëdde la lista ëd lòn ch'as ten sot-euj",
+'right-editmywatchlist' => "Modifiché la lista ëd lòn ch'as ten sot-euj. Ch'a nòta che chèiche assion a giontran ancora dle pàgine sensa 's drit.",
+'right-viewmyprivateinfo' => "Vëdde ij sò dàit përsonaj (pr'esempi adrëssa ëd pòsta eletrònica, nòm ver)",
+'right-editmyprivateinfo' => "Modifiché ij sò dàit privà (pr'esempi adrëssa ëd pòsta eletrònica, nòm ver)",
+'right-editmyoptions' => 'Modifiché ij sò gust',
 'right-rollback' => "Gavé an pressa le modìfiche ëd l'ùltim utent che a l'ha modificà na pàgina particolar",
 'right-markbotedits' => "Marché le modìfiche tirà andré com modìfiche d'un trigomiro",
 'right-noratelimit' => "Nen esse tocà dal lìmit d'assion",
@@ -1383,12 +1451,19 @@ Costa anformassion a sarà pùblica.",
 'action-userrights-interwiki' => "modifiché ij drit ëd j'utent ansima a d'àutre wiki",
 'action-siteadmin' => 'bloché o dësbloché la base ëd dàit',
 'action-sendemail' => 'mandé dij mëssage an pòsta eletrònica',
+'action-editmywatchlist' => "modifiché la lista ëd la ròba ch'as ten sot-euj",
+'action-viewmywatchlist' => "vëdde la lista ëd la ròba ch'as ten sot-euj",
+'action-viewmyprivateinfo' => 'vëdde soe anformassion përsonaj',
+'action-editmyprivateinfo' => 'modifiché soe anformassion përsonaj',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|modìfica|modìfiche}}',
+'enhancedrc-since-last-visit' => "$1 {{PLURAL:$1|da l'ùltima visita}}",
+'enhancedrc-history' => 'stòria',
 'recentchanges' => 'Ùltime modìfiche',
 'recentchanges-legend' => "Opsion dj'ùltime modìfiche",
 'recentchanges-summary' => 'An costa pàgina as ten cont dle modìfiche pì recente a la wiki.',
+'recentchanges-noresult' => 'Gnun-e modìfiche corëspondente a costi criteri ant ël perìod dàit.',
 'recentchanges-feed-description' => 'Trassé le modìfiche dla wiki pì davzin-e ant ël temp an cost fluss.',
 'recentchanges-label-newpage' => "Sta modìfica-sì a l'ha creà na neuva pàgina",
 'recentchanges-label-minor' => "Costa a l'é na modìfica cita",
@@ -1425,7 +1500,6 @@ Costa anformassion a sarà pùblica.",
 'recentchangeslinked-feed' => 'Modìfiche colegà',
 'recentchangeslinked-toolbox' => 'Modìfiche colegà',
 'recentchangeslinked-title' => 'Modìfiche ch\'a-i intro con "$1"',
-'recentchangeslinked-noresult' => "Ant ël moment dont ës parla a-i é pa staie gnun-a modìfica a le pàgine con dj'anliure ch'a men-o ambelessì.",
 'recentchangeslinked-summary' => "Costa a l'é na lista ëd modìfiche fàite da pòch a pàgine colegà a cola spessificà (o a mèmber ëd na categorìa spessificà).
 Le pàgine dzora a [[Special:Watchlist|la lista ëd lòn ch'as ten sot-euj]] a resto marcà an '''grassèt'''.",
 'recentchangeslinked-page' => 'Nòm ëd la pàgina:',
@@ -1437,7 +1511,7 @@ Le pàgine dzora a [[Special:Watchlist|la lista ëd lòn ch'as ten sot-euj]] a r
 'reuploaddesc' => "Chité e torné al formolari për carié dj'archivi",
 'upload-tryagain' => "Mandé la descrission ëd l'archivi modificà",
 'uploadnologin' => 'Nen rintrà ant ël sistema',
-'uploadnologintext' => "A dev [[Special:UserLogin|rintré ant ël sistema]] për podèj carié dj'archivi.",
+'uploadnologintext' => "A dev $1 për podèj carié dj'archivi.",
 'upload_directory_missing' => 'Ël repertòri ëd caria ($1) a-i é nen e a peul pa esse creà dal servent.',
 'upload_directory_read_only' => "Ël servent ëd l'aragnà a-i la fa nen a scrive ansima a la diretris ëd càrich ($1).",
 'uploaderror' => 'Eror dëmentré che as cariava',
@@ -1668,7 +1742,6 @@ Për na sicurëssa otimal, img_auth.php a l'é disabilità.",
 'http-read-error' => 'Eror ëd letura HTTP.',
 'http-timed-out' => "L'arcesta HTTP a l'ha finì sò temp.",
 'http-curl-error' => "Eror an sërcand d'arcuperé l'adrëssa dl'aragnà: $1.",
-'http-host-unreachable' => "L'anliura a rispond pa.",
 'http-bad-status' => "A l'é staje un problema durant l'arcesta HTTP: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1696,6 +1769,10 @@ Për na sicurëssa otimal, img_auth.php a l'é disabilità.",
 'listfiles_size' => 'Amzura an otet',
 'listfiles_description' => 'Descrission',
 'listfiles_count' => 'Version',
+'listfiles-show-all' => 'Anclude le veje version ëd le plance',
+'listfiles-latestversion' => 'Version corenta',
+'listfiles-latestversion-yes' => 'É',
+'listfiles-latestversion-no' => 'Nò',
 
 # File description page
 'file-anchor-link' => 'Archivi',
@@ -1792,6 +1869,13 @@ Ch'as visa ëd controlé che në stamp a-j serva nen a dj'àutri stamp anans che
 'randompage' => 'Na pàgina qualsëssìa',
 'randompage-nopages' => 'A-i é pa gnun-a pàgina ant {{PLURAL:$2|lë spassi nominal|jë spassi nominaj}}: lë spassi nominal "$1"',
 
+# Random page in category
+'randomincategory' => "Pàgina a l'ancàpit ant la categorìa",
+'randomincategory-invalidcategory' => "«$1» a l'é pa un nòm ëd categorìa bon.",
+'randomincategory-nopages' => 'A-i é gnun-e pàgine ant la categorìa [[:Category:$1|$1]].',
+'randomincategory-selectcategory' => "Pijé na pàgina a l'ancàpit da 'nt la categorìa: $1 $2.",
+'randomincategory-selectcategory-submit' => 'Andé',
+
 # Random redirect
 'randomredirect' => 'Na ridiression qualsëssìa',
 'randomredirect-nopages' => 'A-i é pa gnun-a ridiression ant lë spassi nominal "$1".',
@@ -1817,17 +1901,13 @@ Ch'as visa ëd controlé che në stamp a-j serva nen a dj'àutri stamp anans che
 'statistics-users-active-desc' => "Utent che a l'han fàit n'assion ant {{PLURAL:$1|l'ùltim di|j'ùltim $1 di}}",
 'statistics-mostpopular' => "Pàgine ch'a 'ncontro dë pì",
 
-'disambiguations' => "Pàgine ch'a men-o vers dle pàgine d'omonimìe",
-'disambiguationspage' => "Template:Gestion dj'omonimìe",
-'disambiguations-text' => "Ste pàgine-sì a men-o a na '''pàgina ëd gestion dj'omònim'''.
-Mach che a dovrìo ëmné bele drit a n'artìcol.<br />
-Na pàgina as trata coma pàgina ëd gestion dj'omònim se a deuvra në stamp dont l'anliura as treuva ant ël [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop' => 'Pàgine con na propietà ëd pàgina',
 'pageswithprop-legend' => 'Pàgine con na propietà ëd pàgina',
 'pageswithprop-text' => "Costa pàgina a lista le pàgine ch'a deuvro na propietà 'd pàgina particolar.",
 'pageswithprop-prop' => 'Nòm ëd la propietà:',
 'pageswithprop-submit' => 'Andé',
+'pageswithprop-prophidden-long' => 'valor ëd propietà ëd test longh stërmà ($1)',
+'pageswithprop-prophidden-binary' => 'valor ëd propietà binaria stërmà ($1)',
 
 'doubleredirects' => 'Ridiression dobie',
 'doubleredirectstext' => "Sta pàgina-sì a a lista dle pàgine ch'a armando a d'àutre pàgine ëd ridiression.
@@ -1886,6 +1966,7 @@ Adess a l'é na ridiression a [[$2]].",
 'mostrevisions' => 'Artìcoj pì modificà',
 'prefixindex' => "Tute le pàgine ch'a ancamin-o con",
 'prefixindex-namespace' => 'Tute le pàgine con prefiss ($1 spassi nominal)',
+'prefixindex-strip' => 'Gavé ël prefiss da la lista',
 'shortpages' => 'Pàgine curte',
 'longpages' => 'Pàgine longhe',
 'deadendpages' => 'Pàgine che a men-o da gnun-a part',
@@ -1901,6 +1982,7 @@ Adess a l'é na ridiression a [[$2]].",
 'listusers' => "Lista dj'utent",
 'listusers-editsonly' => "Mostré mach j'utent ch'a l'han fàit dle modìfiche",
 'listusers-creationsort' => 'Ordiné për data ëd creassion',
+'listusers-desc' => 'Ordiné an órdin calant',
 'usereditcount' => '$1 {{PLURAL:$1|modìfica|modìfiche}}',
 'usercreated' => '{{GENDER:$3|Creà}}  ël $1 a $2',
 'newpages' => 'Pàgine neuve',
@@ -2079,10 +2161,9 @@ Le modìfiche che a-i saran ant costa pàgina-sì e ant soa pàgina ëd discussi
 'unwatchthispage' => 'Chité-lì ëd ten-e sossì sot-euj',
 'notanarticle' => "Sòn a l'é pa n'artìcol",
 'notvisiblerev' => "La revision a l'é stàita scancelà",
-'watchnochange' => "Gnun-a dle ròbe che as ten sot-euj a l'é staita modificà ant ël periòd ësmonù.",
 'watchlist-details' => "A l'é dëmentrè ch'as ten sot-euj {{PLURAL:$1|$1 pàgina|$1 pàgine}}, nen contand cole ëd discussion.",
-'wlheader-enotif' => '* Le notìfiche për pòsta eletrònica a son abilità.',
-'wlheader-showupdated' => "* Cole pàgine che a son ëstàite modificà da quand che a l'é passaje ansima l'ùltima vira a resto marcà an '''grassèt'''",
+'wlheader-enotif' => "La notìfica për pòsta eletrònica a l'é abilità.",
+'wlheader-showupdated' => "Le pàgine che a son ëstàite modificà da quand che a l'é passaje ansima l'ùltima vira a resto marcà an '''grassèt'''",
 'watchmethod-recent' => "contròl a j'ùltime modìfiche fàite a le pàgine che as ten sot-euj",
 'watchmethod-list' => 'contròl ëd le pàgine che as ten sot-euj për vëdde se a-i sio staje dle modìfiche recente',
 'watchlistcontains' => "Soa lista dla ròba ch'as ten sot-euj a l'ha andrinta {{PLURAL:$1|na pàgina|$1 pàgine}}.",
@@ -2330,7 +2411,7 @@ $1",
 'contributions' => "Contribussion dë st'{{GENDER:$1|utent}}-sì",
 'contributions-title' => 'Contribussion ëd $1',
 'mycontris' => 'Contribussion',
-'contribsub2' => 'Për $1 ($2)',
+'contribsub2' => 'Për {{GENDER:$3|$1}} ($2)',
 'nocontribs' => "A l'é pa trovasse gnun-a modìfica che a fussa conforma a costi criteri-sì",
 'uctop' => '(corenta)',
 'month' => 'Mèis:',
@@ -2487,14 +2568,12 @@ coj che sio ij blocagi ativ al dì d'ancheuj.",
 'ipb_blocked_as_range' => "Eror: L'adrëssa IP $1 a l'ha gnun blocagi diret ansima e donca a peul pa esse dësblocà. A resta blocà mach për via ch'a l'é ciapà andrinta al ragg $2, e lolì as peul pa dësblochesse.",
 'ip_range_invalid' => 'Nùmer IP nen bon.',
 'ip_range_toolarge' => "Ij blocagi d'antërvaj pi gròss che /$1 a son pa përmëttù.",
-'blockme' => 'Blòch-me',
 'proxyblocker' => "Blocador dj'arpetitor",
-'proxyblocker-disabled' => "Sta funsion-sì a l'é pa abilità.",
 'proxyblockreason' => "Soa adrëssa IP a l'é stàita blocà përchè a l'é cola ëd n'arpetitor duvèrt.
 Për piasì che a contata sò fornitor ëd conession e che a lo anforma. As trata d'un problema ëd sigurëssa motobin serios.",
-'proxyblocksuccess' => 'Bele fàit.',
 'sorbsreason' => "Soa adrëssa IP a l'é listà coma arpetitor duvert (open proxy) ansima al DNSBL dovrà da {{SITENAME}}.",
 'sorbs_create_account_reason' => "Soa adrëssa IP a l'é listà coma arpetitor duvèrt (open proxy) ansima al DNSBL dovrà da {{SITENAME}}. A peul nen creésse un cont.",
+'xffblockreason' => "N'adrëssa IP ant l'antestassion X-Forwarded-For, la soa o cola d'un servent fantasma che chiel a deuvra, a l'é stàita blocà. La rason dël blocagi inissial a l'era: $1",
 'cant-block-while-blocked' => "A peul pa bloché d'àutri utent antramentre che chiel a l'é blocà.",
 'cant-see-hidden-user' => "L'utent ch'a l'é an camin ch'a preuva a bloché a l'é già stàit blocà e stërmà. Da già ch'a l'ha pa ël drit hideuser, a peul pa vëdde o modifiché ël blocagi ëd cost utent.",
 'ipbblocked' => "A peul pa bloché o dësbloché d'àutri utent, përchè a l'é blocà chiel-midem",
@@ -2662,6 +2741,8 @@ Për piasì, ch'a vìsita la [//www.mediawiki.org/wiki/Localisation Localisassio
 'thumbnail-more' => 'Slarghé',
 'filemissing' => 'Archivi che a manca',
 'thumbnail_error' => 'Eror antramentr che as fasìa la figurin-a: $1',
+'thumbnail_error_remote' => "Mëssagi d'eror ëd $1:
+$2",
 'djvu_page_error' => 'Pàgina DjVu fòra dij lìmit',
 'djvu_no_xml' => "As rièss pa a carié l'XML për l'archivi DjVu",
 'thumbnail-temp-create' => "Pa bon a creé l'archivi ëd miniadura temporania",
@@ -2965,11 +3046,24 @@ An fasend-lo marcé ansima a sò ordinator chiel a podrìa porteje ëd dann a s
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minute}}',
 'hours' => '{{PLURAL:$1|$1 ora|$1 ore}}',
 'days' => '{{PLURAL:$1|$1 di|$1 di}}',
+'weeks' => '{{PLURAL:$1|$1 sman-a|$1 sman-e}}',
 'months' => '{{PLURAL:$1|$1 mèis}}',
 'years' => '{{PLURAL:$1|$1 ann|$1 agn}}',
 'ago' => '$1 fa',
 'just-now' => 'pròpi adess',
 
+# Human-readable timestamps
+'minutes-ago' => '$1 {{PLURAL:$1|minuta|minute}} fa',
+'seconds-ago' => '$1 {{PLURAL:$1second}} fa',
+'monday-at' => 'Lùn-es a $1',
+'tuesday-at' => 'Màrtes a $1',
+'wednesday-at' => 'Merco a $1',
+'thursday-at' => 'Giòbia a $1',
+'friday-at' => 'Vënner a $1',
+'saturday-at' => 'Saba a $1',
+'sunday-at' => 'Dùminica a $1',
+'yesterday-at' => 'Jer a $1',
+
 # Bad image list
 'bad_image_list' => "La forma a l'é costa-sì:
 
@@ -2997,7 +3091,7 @@ J'àutri a saran stërmà coma stàndard.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larghëssa',
 'exif-imagelength' => 'Autëssa',
 'exif-bitspersample' => 'Bit për campion',
@@ -3175,7 +3269,7 @@ J'àutri a saran stërmà coma stàndard.
 'exif-originalimageheight' => "Autëssa dla figura prima ch'a fussa ritajà",
 'exif-originalimagewidth' => "Larghëssa dla figura prima ch'a fussa ritajà",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nen comprimù',
 'exif-compression-2' => "CCITT Partìa 3 longheur dla codìfica d'esecussion dla codìfica Huffman modificà ëd dimension 1",
 'exif-compression-3' => 'CCITT Partìa 3 codìfica dël fax',
@@ -3595,7 +3689,6 @@ As peul ëdcò [[Special:EditWatchlist|dovré l'editor sòlit]].",
 'version-other' => 'Àutr',
 'version-mediahandlers' => 'Gestor multimojen',
 'version-hooks' => 'Gancio',
-'version-extension-functions' => "Fonsion dj'estension",
 'version-parser-extensiontags' => "Tichëtte dj'estension conossùe dal dëscompositor",
 'version-parser-function-hooks' => 'Gancio për le fonsion dël dëscompositor',
 'version-hook-name' => 'Nòm dël gancio',
@@ -3604,6 +3697,7 @@ As peul ëdcò [[Special:EditWatchlist|dovré l'editor sòlit]].",
 'version-license' => 'Licensa',
 'version-poweredby-credits' => "Costa wiki-sì a marcia mersì a '''[//www.mediawiki.org/ MediaWiki]''', licensa © 2001-$1 $2.",
 'version-poweredby-others' => 'àutri',
+'version-poweredby-translators' => 'tradutor ëd translatewiki.net',
 'version-credits-summary' => 'I tnoma a aringrassié le përson-e sì-dapress për soa contribussion a [[Special:Version|MediaWiki]].',
 'version-license-info' => "MediaWiki a l'é un programa lìber; a peul passelo an gir o modifichelo sota le condission dla Licensa Pùblica General GNU coma publicà da la Free Software Foundation; o la version 2 dla licensa o (a soa decision) qualsëssìa version apress.
 
@@ -3618,12 +3712,17 @@ A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa
 'version-entrypoints-header-url' => "Adrëssa an sl'aragnà",
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Senté d\'artìcol]',
 
-# Special:FilePath
-'filepath' => "Përcors d'archivi",
-'filepath-page' => 'Archivi:',
-'filepath-submit' => 'Përcors',
-'filepath-summary' => "Sta pàgina special-sì a la smon ël përcors complet për n'archivi.
-Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite parte diretament da sò programa a pòsta.",
+# Special:Redirect
+'redirect' => 'Ridirigiù da archivi, utent o ID ëd revision',
+'redirect-legend' => "Ridirige a n'archivi o na pàgina",
+'redirect-summary' => "Costa pàgina special a ponta a n'archivi (dàit un nòm d'archivi), na pàgina (dàita n'ID a la revision) o na pàgina d'utent (dàit n'identificativ numérich a l'utent).",
+'redirect-submit' => 'Andé',
+'redirect-lookup' => 'Arserca:',
+'redirect-value' => 'Valor:',
+'redirect-user' => "ID dl'utent",
+'redirect-revision' => 'Revision ëd la pàgina',
+'redirect-file' => "Nòm ëd l'archivi",
+'redirect-not-exists' => 'Valor nen trovà',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => "Arsërca dj'archivi dobi",
@@ -3673,12 +3772,16 @@ Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite
 'tags' => 'Tichëtte ëd le modìfiche vàlide',
 'tag-filter' => 'Filtror ëd le [[Special:Tags|tichëtte]]:',
 'tag-filter-submit' => 'Filtror',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tichëtta|Tichëtte}}]]: $2)',
 'tags-title' => 'Tichëtte',
 'tags-intro' => 'Costa pàgina a lista le tichëtte che ël programa a peul dovré për marché na modìfica, e sò significà.',
 'tags-tag' => 'Nòm ëd la tichëtta',
 'tags-display-header' => 'Aparensa ant la lista dle modìfiche',
 'tags-description-header' => 'Descrission completa dël significà',
+'tags-active-header' => 'Ativ?',
 'tags-hitcount-header' => 'Modìfiche con tichëtta',
+'tags-active-yes' => 'Bò',
+'tags-active-no' => 'Nò',
 'tags-edit' => 'modifiché',
 'tags-hitcount' => '$1 {{PLURAL:$1|cambiament|cambiament}}',
 
@@ -3699,6 +3802,7 @@ Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite
 'dberr-problems' => "An dëspias! Ës sit a l'ha dle dificoltà técniche.",
 'dberr-again' => "Ch'a speta chèiche minute e ch'a preuva torna a carié.",
 'dberr-info' => '(Conession al servent ëd base ëd dàit impossìbil: $1)',
+'dberr-info-hidden' => '(Conession al servent ëd base ëd dàit impossìbil)',
 'dberr-usegoogle' => 'Antratant a peul prové a sërché con Google.',
 'dberr-outofdate' => "Ch'a ten-a da ment che soe indesassion dij nòstri contnù a podrìo esse nen agiornà.",
 'dberr-cachederror' => "Costa-sì a l'é na còpia an memòria local ëd la pàgina ciamà, e a peul esse nen agiornà.",
@@ -3714,6 +3818,9 @@ Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite
 'htmlform-submit' => 'Mandé',
 'htmlform-reset' => 'Gavé le modìfiche',
 'htmlform-selectorother-other' => 'Àutr',
+'htmlform-no' => 'Nò',
+'htmlform-yes' => 'É',
+'htmlform-chosen-placeholder' => "Serne n'opsion",
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con arserca an test pien mantnùa',
@@ -3831,4 +3938,19 @@ Dësnò, a peul dovré ël formolari semplificà sì-sota. Sò coment a sarà gi
 # Image rotation
 'rotate-comment' => 'Plancià virà ëd $1 {{PLURAL:$1|gre}} an sens orari',
 
+# Limit report
+'limitreport-title' => "Dàit d'otimisassion ëd l'analisator:",
+'limitreport-cputime' => "Temp CPU d'utilisassion",
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|second}}',
+'limitreport-walltime' => "Temp real d'utilisassion",
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|second}}',
+'limitreport-ppvisitednodes' => 'Cont dij neu ëd prepocessor visità',
+'limitreport-ppgeneratednodes' => 'Cont dij neu ëd preprocessor generà',
+'limitreport-postexpandincludesize' => "Taja d'anclusion dòp espansion",
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => "Taja dl'argoment ëd lë stamp",
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => "Pi granda përfondità d'espansion",
+'limitreport-expensivefunctioncount' => "Cont ëd le fonsion d'anàlisi care",
+
 );
diff --git a/languages/messages/MessagesPnb.php b/languages/messages/MessagesPnb.php
index 03399229..5af5a560 100644
--- a/languages/messages/MessagesPnb.php
+++ b/languages/messages/MessagesPnb.php
@@ -51,10 +51,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ویکھن آلے لوکاں دی گنتی وکھاؤ۔',
 'tog-oldsig' => 'ہن والے دسخط:',
 'tog-fancysig' => 'دستخط نوں وکی ٹیکسڈ ونگوں؎ ورتو(without an automatic link)',
-'tog-externaleditor' => 'ہمیشہ بارلا لکھن والا ورتو (ماہر لوکاں واسطے، اس واسطے تواڑے کمپیوٹر تے خاص تبدیلیاں چائیدیاں نیں۔ [//www.mediawiki.org/wiki/Manual:External_editors مزید معلومات.])',
-'tog-externaldiff' => '
-ہمیشہ بارلا تبدیلی کرن والا ورتو (ماہر لوکاں واسطے، اس واسطے تواڑے کمپیوٹر تے خاص تبدیلیاں چائیدیاں نیں۔ [//www.mediawiki.org/wiki/Manual:External_editors مزید معلومات۔])',
-'tog-showjumplinks' => '"ایدر چلو" نوں رلن والے جوڑان نال جوڑو',
 'tog-uselivepreview' => 'لائیو پریویو ورتو',
 'tog-forceeditsummary' => 'مینون اوسے ویلے دسو جدوں خالی سمری تے آؤ۔',
 'tog-watchlisthideown' => 'میری اپنی لکھائی نوں اکھ تھلیوں لکاؤ',
@@ -67,6 +63,7 @@ $messages = array(
 'tog-diffonly' => 'تبدیلی توں علاوہ صفحہ نا وکھاؤ',
 'tog-showhiddencats' => 'لکیاں کیٹاگریاں وکھاؤ',
 'tog-norollbackdiff' => 'صفحے دی واپسی تے تبدیلی کڈ دو',
+'tog-useeditwarning' => 'جدوں میں کوئی صفحہ تبدیلی کر کے بچاۓ بغیر چھڈن لگاں تے منوں دس دیو',
 
 'underline-always' => 'ہمیشہ',
 'underline-never' => 'کدی وی نئیں',
@@ -249,7 +246,7 @@ $messages = array(
 'pool-queuefull' => 'چنوتی کرن ل‏ئی بندے پورے نیں۔',
 'pool-errorunknown' => 'انجان غلطی',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'بارے چ {{SITENAME}}',
 'aboutpage' => 'Project:بارے وچ',
 'copyright' => 'مال $1 دے تھلے ہے گا اے۔',
@@ -259,7 +256,6 @@ $messages = array(
 'disclaimers' => 'منکرنا',
 'disclaimerpage' => 'Project:عام منکرنا',
 'edithelp' => 'لکھن وچ مدد',
-'edithelppage' => 'Help:لکھنا',
 'helppage' => 'Help:لسٹ',
 'mainpage' => 'پہلا صفہ',
 'mainpage-description' => 'پہلا صفہ',
@@ -333,17 +329,6 @@ $messages = array(
 # General errors
 'error' => 'غلطی',
 'databaseerror' => 'ڈیٹابیس دی غلطی',
-'dberrortext' => 'اک ڈیٹابیس کویری سنٹیکس غلطی ہوگئی اے۔
-اے سوفٹویر چ اک بگ وی ہوسکدا اے۔
-آخری کوشش کیتی ڈیٹابیس کھوج:
-<blockquote><tt>$1</tt></blockquote>
-فنکشن چوں "<tt>$2</tt>".
-ڈیٹا بیس ریٹرنڈ غلطی "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'اکڈیٹابیس کویری سنٹیکس غلطی ہوگئی اے
-آخری ڈیٹابیس کویری سی:
-"$1"
-فنکش دے اندروں "$2"
-ڈیٹابیس ریٹرنڈ غلطی "$3: $4"',
 'laggedslavemode' => "'''خبردار:''' صفے تے نیڑےتریڈے ہون والیاں تبدیلیاں کوئی نیں۔",
 'readonly' => 'ڈیٹابیس تے تالا',
 'enterlockreason' => 'تالا لان دی وجہ دسو تے اہ وی دسو جے کدوں تالا کھلے گا',
@@ -392,7 +377,6 @@ $messages = array(
 'viewyourtext' => 'تسیں آپنی تبدیلیاں دا ذریعہ ایس صفے تے ویکھ تے کاپی کرسکدے او۔',
 'protectedinterface' => 'اے صفحے سافٹویئر نوں ورتن دی تھاں دیندا اے تے ایدے غلط ورتن نوں روکن واسطے اینوں بچایا ہویا اے۔',
 'editinginterface' => "'''خبردار:''' تسیں اک ایسا صفہ بدل رۓ او جیہڑا مکھی صفے دے سوفٹویر نوں لکھت دیندا اے۔ ایس صفے ج تبدیلی ورتنن والیاں دے مکھی صفے دے وکھالے نوں بدل دے گی۔ بولی وٹاندرے لئی، مہربانی کرکے میڈیاوکی بولی ویونت [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] ول ویکھو۔",
-'sqlhidden' => '(SQL کھوج چھپائی ہوئي اے)',
 'cascadeprotected' => "ایس صفے نوں تبدیلی توں بچایا گیا اے، کیوں جے ایہ تھلے دتے گۓ {{PLURAL:$1|صفہ|صفے}} چ ہیگا اے تے اینوں ''کیسکیڈنگ'' چنوتی نال بچایا گیا اے:
 
  $2",
@@ -417,7 +401,6 @@ Note that some pages may continue to be displayed as if you were still logged in
 'yourpassword' => 'کنجی:',
 'yourpasswordagain' => 'کنجی دوبارہ لکھو:',
 'remembermypassword' => 'اس براؤزر تے میرا ورتن ناں یاد رکھو ($1 {{PLURAL:$1|دن|دناں}} واسطے)',
-'securelogin-stick-https' => 'لاک ان ہون دے مگروں HTTPS  نال جڑے روو۔',
 'yourdomainname' => 'تواڈا علاقہ:',
 'externaldberror' => 'ڈیٹابیس چ توانوں پہچاننے چ کوئی مسئلہ ہویا اے یا فیر تسی اپنا بارلا کھاتا نئیں بدل سکدے۔',
 'login' => 'اندر آؤ جی',
@@ -516,7 +499,7 @@ Note that some pages may continue to be displayed as if you were still logged in
 'newpassword' => 'نوی کنجی:',
 'retypenew' => 'نئی کنجی دوبارہ لکھو:',
 'resetpass_submit' => 'کنجی رکھو تے لاگ ان ہو جاو',
-'resetpass_success' => 'تھواڈی کنجی بدلی جاچکی اے!
+'changepassword-success' => 'تھواڈی کنجی بدلی جاچکی اے!
 تسی لاگ ان ہورۓ او۔۔۔۔۔۔',
 'resetpass_forbidden' => 'کنجی بدلی نئیں جاسکدی',
 'resetpass-no-info' => 'تسی لاگ ان ہوکے ای اس صفحے نوں ویکھ سکدے او۔',
@@ -528,10 +511,8 @@ Note that some pages may continue to be displayed as if you were still logged in
 
 # Special:PasswordReset
 'passwordreset' => 'کنجی واپس لیاؤ',
-'passwordreset-text' => 'اے فارم مکمل کرکے اپنے کھاتے دی معلومات اپنے ای-میل تے منگوالو۔',
 'passwordreset-legend' => 'کنجی واپس لیاؤ',
 'passwordreset-disabled' => 'اس وکی تے کنجی واپس نئیں لیائی جاسکدی۔',
-'passwordreset-pretext' => '{{PLURAL:$1||تھلے دتے ہوۓ ڈیٹا چوں اک ایتھے دیو}}',
 'passwordreset-username' => 'ورتن ناں:',
 'passwordreset-domain' => 'ڈومین',
 'passwordreset-capture' => 'آن والی ای-میل ویکھو؟',
@@ -757,6 +738,8 @@ Custom .css تے .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.cs
 'edit-no-change' => 'تواڈی تبدیلی ول کوئی توجہ نئیں، کیوں جے لکھت چ کوئی تبدیلی نئیں۔',
 'edit-already-exists' => 'نواں صفہ نئیں بن سکدا۔
 ایہ پہلے ای ہیگا اے۔',
+'editwarning-warning' => 'اے صفے توں جان تے ہو سکدا اوہ ساریاں تبدیلیاں مک جان جیہڑیاں تساں بناياں نیں۔
+اگر تسیں لاکان او، تسیں ایڈیٹنگ سیکشن چ  اپنی پسنداں چ ایس خبرداری نوں پعلے ناں۔',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''خبردار:''' ایس صفے تے چوکھیاں ساریاں پارسر کلز نیں۔
@@ -976,7 +959,6 @@ $1",
 'searchmenu-legend' => 'چنوتیاں کھوجو',
 'searchmenu-exists' => "'''ایس وکی تے \"[[:\$1]]\" ناں دا صفہ ہے۔.'''",
 'searchmenu-new' => "'''ایس وکی تے \"[[:\$1]]\" بناؤ'''",
-'searchhelp-url' => 'Help:فہرست',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ایس پریفکس نال صفے کھوجو]]',
 'searchprofile-articles' => 'لسٹ صفے',
 'searchprofile-project' => 'مدد تے ویونت صفے',
@@ -1021,15 +1003,6 @@ $1",
 تسیں گوگل تے کھوج کرو۔
 اے گل یاد رکھنا جے انڈیکس {{SITENAME}} دے پرانے ہون۔',
 
-# Quickbar
-'qbsettings' => 'کوئکبار',
-'qbsettings-none' => 'کوئی نئیں',
-'qbsettings-fixedleft' => 'فکسڈ کھبے',
-'qbsettings-fixedright' => 'فکسڈ سجے',
-'qbsettings-floatingleft' => 'ہلدا کھبے',
-'qbsettings-floatingright' => 'ہلدا سجے',
-'qbsettings-directionality' => '!!!!فکسڈ، تھاڈی بولی تے لپی نال',
-
 # Preferences page
 'preferences' => 'تانگاں',
 'mypreferences' => 'میریاں تانگاں',
@@ -1061,7 +1034,6 @@ $1",
 'resetprefs' => 'ناں بچائیاں ہویاں تبدیلیاں مکاؤ',
 'restoreprefs' => 'ڈیفالٹ سیٹنگز دوبارہ لیاؤ',
 'prefs-editing' => 'لکھائی',
-'prefs-edit-boxsize' => 'تبدیلی کرن والی ونڈو دا ناپ',
 'rows' => 'قطار:',
 'columns' => 'کالم:',
 'searchresultshead' => 'کھوج',
@@ -1072,8 +1044,6 @@ $1",
 'recentchangesdays-max' => 'میکسیمم $1 {{PLURAL:$1|دن|دن}}',
 'recentchangescount' => 'ڈیفالٹ چ تبدیلیاں دی گنتی:',
 'prefs-help-recentchangescount' => 'ہن دیاں تبدیلیاں صفیاں دے رکارڈ تے لاگاں ہیگیاں نیں۔',
-'prefs-help-watchlist-token' => 'ایس فیلڈ نوں پعرنا اک لکی کنجی نال تواڈی اکھ تھلے رکھی لسٹ لئی اک آر ایس ایس فیڈ بناۓ گا۔ کوئی وی ایس فیلڈ چ جیہڑا کنجی جاندا اے  تواڈی اکھ تھلے رکھی  لسٹ نوں پڑھ لے گا، ایس لئی اک پکا نمبر چنو۔
-ایتھے اک الٹا پلٹا نمبر دتا گیا اے جینوں تسیں ورت سکدے او: $1',
 'savedprefs' => 'تواڈیاں تانگاں بچا لئیاں گئیاں نیں۔',
 'timezonelegend' => 'ویلے دا علاقہ',
 'localtime' => 'مقامی ویلا:',
@@ -1105,7 +1075,6 @@ $1",
 
 اے واپس نئیں ہوسکدا۔',
 'prefs-emailconfirm-label' => 'ای-میل کنفرمیشن:',
-'prefs-textboxsize' => 'تبدیلی کرن والی ونڈو دا ناپ',
 'youremail' => 'ای میل:',
 'username' => 'ورتن آلے دا ناں:',
 'uid' => 'ورتن والے دی آئی ڈی',
@@ -1346,7 +1315,6 @@ $1",
 'recentchangeslinked-feed' => 'ملدیاں جلدیاں تبدیلیاں',
 'recentchangeslinked-toolbox' => 'ملدیاں جلدیاں تبدیلیاں',
 'recentchangeslinked-title' => '"$1" نال تعلق آلیاں تبدیلیاں',
-'recentchangeslinked-noresult' => 'جڑیاں صفحیاں چ دتے ہوۓ ویلے چ کوئی تبدیلیاں نہیں۔',
 'recentchangeslinked-summary' => "اے اوناں تبدیلیاں دی لسٹ اے جیڑیاں تھوڑا چر پہلاں بنائیاں گئیاں اوناں صفحیاں تے جیڑے خاص صفحے تے جڑدے نے یا کسی خاص کیٹاگری دے ممبراں نوں۔<br />
 تواڈی [[Special:Watchlist|اکھ تھلے صفحے]] '''موٹے''' نیں۔",
 'recentchangeslinked-page' => 'صفے دا ناں:',
@@ -1573,7 +1541,6 @@ $1",
 'http-read-error' => 'ایچ ٹی ٹی پی  غلطی پڑھدی اے۔',
 'http-timed-out' => 'ایچ ٹی ٹی پی  دی مانگ ویلیوں بار۔',
 'http-curl-error' => 'ایچ ٹی ٹی پی  : $1 لیان چ غلطی۔',
-'http-host-unreachable' => 'ایچ ٹی ٹی پی  تک ناں پونچ سکیا۔',
 'http-bad-status' => 'ایچ ٹی ٹی پی : $1 $2 دی مانگ ویلے رپھڑ',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1720,12 +1687,6 @@ $1",
 'statistics-users-active-desc' => 'ورتنوالے جناں نیں پچھلے {{PLURAL:$1|دن|$1 دناں}}  چ کم کیتا اے۔',
 'statistics-mostpopular' => 'سب توں بوتے ویکھے گۓ صفے',
 
-'disambiguations' => 'اوہ صفے جیہڑے گنجل کھول صفیاں نال جڑدے نیں۔',
-'disambiguationspage' => 'سانچہ: ڈسایمبگ',
-'disambiguations-text' => "تھلے دتے گۓ صفیاں دا اک '''گنجل کھول''' نال جوڑ اے۔
-ایدے بجاۓ ایدا جوڑ کسے ٹھیک سرناویں نال جوڑو<br />
-اک صفہ گنجل کھول صفے لئی منیا جائیگا  اگر اے اک ٹمپلیٹ ورتدا جیدا جوڑ [[MediaWiki:Disambiguationspage]] نال ہووے۔",
-
 'doubleredirects' => 'دوہری ریڈیرکٹس',
 'doubleredirectstext' => 'ایس صفے تے اوناں صفیاں دی لسٹ اے جیہڑے ریڈائرکٹ کردے نیں دوجے ریڈائرکٹ صفیاں ول۔
 ہر قطار چ جوڑ نیں  پہلے تے دوجے ریڈائرکٹ نال ، نال دوجے دیڑائرکٹ ول دا تارگٹ نیں جیہڑا کے ٹھیک تارگٹ صفہ ہوندا اے جیہڑا کہ پہلے ریڈائرکٹ نوں اشارہ کرنا چائیدا اے۔
@@ -1964,10 +1925,9 @@ $1",
 'unwatchthispage' => 'اکھ رکھنا چھڈو',
 'notanarticle' => 'لکھن صفہ نئیں۔',
 'notvisiblerev' => 'آخری ریوین کسے ہور ورتن والے دی مٹادتی گئی اے۔',
-'watchnochange' => 'دسے گۓ ویلے چ تھواڈیاں ویکھیاںشیواں نئیں بدلیاں گیاں۔',
 'watchlist-details' => '{{PLURAL:$1|$1 صفحہ|$1 صفحہ}} تواڈی اکھ تھلے گلاں باتاں شامل نہیں۔',
 'wlheader-enotif' => 'ای-میل نوٹیفیکیشن قابل',
-'wlheader-showupdated' => '*  صفے جیہڑے بدلے کۓ تھواڈے آخری وار آن مکرون  اونان نوں موٹا کرکے دسیا گیا اے۔',
+'wlheader-showupdated' => ' صفے جیہڑے بدلے کۓ تھواڈے آخری وار آن مکرون  اونان نوں موٹا کرکے دسیا گیا اے۔',
 'watchmethod-recent' => 'نیڑے ہویاں تبدیلیاں چائیدے صفیاں دیاں ویکھے جان والے صفیاں لئی۔',
 'watchmethod-list' => 'ویکھے کے صفے نیڑے ہون والیاں تبدیلیاں دی پڑتال',
 'watchlistcontains' => 'تھواڈی اکھ تھلے رکھی لسٹ چ $1 {{PLURAL:$1|صفہ|صفے}}  نیں۔',
@@ -2370,12 +2330,9 @@ $1',
 اینوں $2 دی رینج چ روکیا گیا، جینوں کھولیا جاسکدا اے۔',
 'ip_range_invalid' => 'ناں منی جان والی آئی پی رینج۔',
 'ip_range_toolarge' => 'رینج روکاں /$1 توں وڈیاں دی اجازت نئیں۔',
-'blockme' => 'مینوں روکو',
 'proxyblocker' => 'دوروں روکن والا',
-'proxyblocker-disabled' => 'اس کم نوں روک دتا گیا اے۔',
 'proxyblockreason' => 'تواڈا آئی پی پتہ تے روک لگادتی گئی جے کیوں جے اے اک کھلا پراکسی اے۔
 مہربانی کرکے اپنے انٹرنٹ سروس دین والے نال  یا تکنیکی مدد دین والے نال تے اوناں ایس بچاؤ خطرے بارے دسو۔',
-'proxyblocksuccess' => 'ہوگیا۔',
 'sorbsreason' => 'تیرا آئی پی پتہ اک کھلی پراکسی وانگوں دتا گیا اے ڈی این ایس بی ایل چ {{سائیٹناں}} نے۔',
 'sorbs_create_account_reason' => 'تواڈا پتہ اک کھلا پراکسی لسٹ چ اے ڈی این ایس بی ایل نال {{سائیٹناں}} چ۔
 تسیں اک کھاتہ نئیں کھول سکدے۔',
@@ -2812,7 +2769,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'چوڑائی',
 'exif-imagelength' => 'اچائی',
 'exif-bitspersample' => 'اک کمپوننٹ وچ بٹ',
@@ -2990,7 +2947,7 @@ $1',
 'exif-originalimageheight' => 'مورت دی اچائی کٹن توں پہلے',
 'exif-originalimagewidth' => 'مورت دی چوڑائی کٹن توں پہلے',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'کھولی گئی',
 'exif-compression-2' => 'سی سی آئی ٹی ٹی گروپ 3 1-ڈائمینشنل موڈیفائیڈ ہفمین رن فل لنتھ انکوڈنگ',
 'exif-compression-3' => 'سی سی آئی ٹی ٹی گروپ 3 فیکس اینکوڈنگ',
@@ -3380,7 +3337,6 @@ $5
 'version-other' => 'دوجے',
 'version-mediahandlers' => 'میڈیا ہینڈلرز',
 'version-hooks' => 'ہکز',
-'version-extension-functions' => 'ایکسٹنشن فنکشن',
 'version-parser-extensiontags' => 'پاسر ایکسٹنشن ٹیگز',
 'version-parser-function-hooks' => 'پاسر فنکشن ہکز',
 'version-hook-name' => 'ہک ناں',
@@ -3399,13 +3355,6 @@ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 'version-software-product' => 'پراڈکٹ',
 'version-software-version' => 'ورژن',
 
-# Special:FilePath
-'filepath' => 'فائل راہ',
-'filepath-page' => 'فائل:',
-'filepath-submit' => 'چلو',
-'filepath-summary' => 'اے خاص صفہاک فائل دا پورا راہ دسدا اے۔
-مورتاں پورے ریزولوشن چ دسیاں گیاں نئیں، دوجیاں فائل ٹائپ نوں نوں اوناں دے رلدے پروکراماں نال ٹوریا گیا اے۔',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'دوہری فائلاں دی کھوج کرو',
 'fileduplicatesearch-summary' => 'دوہریاں فائلاں دی کھوج ہیش ویلیو تے اے۔',
diff --git a/languages/messages/MessagesPnt.php b/languages/messages/MessagesPnt.php
index 84691d93..ad44e5a5 100644
--- a/languages/messages/MessagesPnt.php
+++ b/languages/messages/MessagesPnt.php
@@ -233,7 +233,7 @@ $messages = array(
 'jumptonavigation' => 'Πορπάτεμαν',
 'jumptosearch' => 'Αράεμαν',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Περί {{SITENAME}}',
 'aboutpage' => 'Project:Σχετικά',
 'copyright' => 'Το περιεχόμενον εν άμον ντο λεει η $1.',
@@ -243,7 +243,6 @@ $messages = array(
 'disclaimers' => 'Ιμπρέσουμ',
 'disclaimerpage' => 'Project:Ιμπρέσουμ',
 'edithelp' => "Βοήθεια για τ' αλλαγμαν",
-'edithelppage' => 'Help:Άλλαγμαν',
 'helppage' => 'Help:Περιεχόμενα',
 'mainpage' => 'Αρχικόν σελίδα',
 'mainpage-description' => 'Αρχικόν σελίδα',
@@ -413,7 +412,7 @@ $messages = array(
 'newpassword' => 'Καινούρεον σημάδιν:',
 'retypenew' => 'Γράψον ξαν το νέον σημάδιν:',
 'resetpass_submit' => 'Ορίστεν το σημάδιν κι ελάτεν απές',
-'resetpass_success' => 'Το σημάδιν ελλάεν!
+'changepassword-success' => 'Το σημάδιν ελλάεν!
 Ατώρα συνδέουμε σας...',
 'resetpass_forbidden' => "Τα σημάδια για να εμπάτεν 'κ επορούν ν'αλλάζνε",
 'resetpass-no-info' => "Επρέπ να ελάτεν απές για ν'ελέπετε αούτον τη σελίδαν κιάλλο τογρία.",
@@ -593,7 +592,6 @@ $messages = array(
 'prevn' => '{{PLURAL:$1|$1}} προηγουμένων',
 'nextn' => '{{PLURAL:$1|$1}} επομένων',
 'viewprevnext' => 'Τέρεν ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Περιεχόμενα',
 'searchprofile-images' => 'Πολυμέσα',
 'searchprofile-everything' => 'Όλεα',
 'search-result-size' => '$1 ({{PLURAL:$2|1 λέξη|$2 λέξεις}})',
@@ -614,9 +612,6 @@ $messages = array(
 'powersearch-togglenone' => 'Τιδέν',
 'search-external' => 'Εύρον σα εξ μερέαν',
 
-# Quickbar
-'qbsettings-none' => 'Τιδέν',
-
 # Preferences page
 'preferences' => 'Αγαπεμένα',
 'mypreferences' => "Τ' εμά τ' αγαπεμένα",
@@ -750,7 +745,6 @@ $messages = array(
 'recentchangeslinked-feed' => 'Σχετικά αλλαγάς',
 'recentchangeslinked-toolbox' => 'Σχετικά αλλαγάς',
 'recentchangeslinked-title' => 'Αλλαγάς τη "$1"',
-'recentchangeslinked-noresult' => "Σ' αβούτα τα σελίδας 'κ εγένταν αλλαγάς.",
 'recentchangeslinked-summary' => "Αβούτος εν κατάλογον με τ' υστερνά τ' αλλαγάς σελιδίων με σύνδεσμον ασ' έναν συγκεκριμένον σελίδαν (για σε σελίδας συγκεκριμένου κατηγορίας).
 Τα σελίδας σον [[Special:Watchlist|κατάλογον ωριαγματί]] είν' '''σκηρά'''.",
 'recentchangeslinked-page' => 'Όνεμαν σελίδας:',
@@ -852,8 +846,6 @@ $messages = array(
 'statistics' => 'Στατιστικήν',
 'statistics-pages' => 'Σελίδας',
 
-'disambiguations' => 'Σελίδας εξηγησίων',
-
 'doubleredirects' => 'Περισσά διπλά συνδέσμ',
 
 'brokenredirects' => 'Τσακωμένα διπλά συνδέσμ',
@@ -1110,8 +1102,6 @@ $messages = array(
 'blocklogentry' => 'εσπάλισεν [[$1]] για $2 $3',
 'unblocklogentry' => 'άνοιγμαν ασπαλιγματί τη $1',
 'block-log-flags-nocreate' => "ποίσιμον λογαρίας 'κ ίνεται",
-'blockme' => 'Ασπάλισον με',
-'proxyblocksuccess' => 'Εγέντον.',
 
 # Developer tools
 'lockdb' => 'Ασπάλιγμαν βάσης δογμενίων',
@@ -1306,7 +1296,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Πλάτος',
 'exif-imagelength' => 'Ύψηλος',
 'exif-bitspersample' => 'Bits ανά στοιχείο',
@@ -1408,10 +1398,6 @@ $messages = array(
 'version-software' => "Λογισμικόν ντ'εθέκεν",
 'version-software-version' => 'Έκδοση',
 
-# Special:FilePath
-'filepath-page' => 'Αρχείον:',
-'filepath-submit' => 'Δέβα',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Όνεμα αρχείου:',
 'fileduplicatesearch-submit' => 'Εύρον',
diff --git a/languages/messages/MessagesPrg.php b/languages/messages/MessagesPrg.php
index 20ec925d..ebbde804 100644
--- a/languages/messages/MessagesPrg.php
+++ b/languages/messages/MessagesPrg.php
@@ -43,9 +43,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Waidinnais gīrbin stēisan nadirīntin tērpautajan',
 'tog-oldsig' => 'Twājs tēntiskas papeisāsenis',
 'tog-fancysig' => 'Laikais papeisāsenin per wikitekstan (šlāit autōmatiskan sēisnan)',
-'tog-externaleditor' => 'Auprestaminai tērpaus izwinaīnan editōran (tēr per ekspertans, izkīnina speciālins ensadīnsenins en kōmputeŗu)',
-'tog-externaldiff' => 'Auprestaminai tērpaus izwinaīnan prōgraman waidināntin šlaitīntans  (tēr per ekspertans, izkīnina speciālins ensadīnsenins en kōmputeŗu)',
-'tog-showjumplinks' => 'Enklaūjais autengīnsenins "sākais en"',
 'tog-uselivepreview' => 'Tērpaus dināmiskan pirmādiran (JavaScript) (eksperimentālin)',
 'tog-forceeditsummary' => 'Pawakēis mi nierpilninsenin stesse ebpeisāsenin stēisan kitawīdinsnan',
 'tog-watchlisthideown' => 'Kliptinais majjans redigīsenins en listei stēisan nadirītan',
@@ -225,7 +222,7 @@ Pāusai en kategōrijai "$1"',
 'jumptonavigation' => 'nawigaciōni',
 'jumptosearch' => 'laukīsna',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Ezze {{SITENAME}}',
 'aboutpage' => 'Project:Ezze',
 'copyright' => 'Ēnturs preiēiminan pa $1 licēncin.',
@@ -235,7 +232,6 @@ Pāusai en kategōrijai "$1"',
 'disclaimers' => 'Etrāwingiskwas arāikinsenei',
 'disclaimerpage' => 'Project:Etrāwingiskwas arāikinsenei',
 'edithelp' => 'Redigīsnas pagalba',
-'edithelppage' => 'Help:Redigīsna',
 'helppage' => 'Help:Ēnturs',
 'mainpage' => 'Galwas pāusan',
 'mainpage-description' => 'Galwas pāusan',
@@ -304,18 +300,6 @@ Listi stēisan preiēiminan speciālin pāusan aupalla si [[Special:SpecialPages
 # General errors
 'error' => 'Blānda',
 'databaseerror' => 'Dātanbazis blānda',
-'dberrortext' => 'Sīntaksis blānda tikka en prasīseņu stessei dātanbazin.
-Sta mazzi būtwei blānda en prōgramijai.
-Panzdaums, niizpalts prasīsenis ast:
-<blockquote><tt>$1</tt></blockquote>
-tengīntan pra funkciōnin „<tt>$2</tt>”.
-Dātanbazi etwārtai wartinna blāndan "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Sīntaksis blānda tikka en prasīseņu stessei dātanbazin.
-Panzdaums, niizpalts prasīsenis ast:
-"$1"
-<blockquote><tt>$1</tt></blockquote>
-izwakītan iz funkciōnin „$2”.
-Dātanbazi etwārtai wartinna blāndan "$3: $4".',
 'laggedslavemode' => 'Nōda: Šin pāusan mazzi ni turritun ēn sen ukanāunaisins ernaunīnsenins.',
 'readonly' => 'Dātanbazi ast auklaūtan',
 'enterlockreason' => 'Dāis brewīnslin stesse dātanbazis auklaūsenin be enkaīnintan etklaūsenes kērdan',
@@ -359,7 +343,6 @@ Prasīsenis: $2',
 'editinginterface' => "'''Ēmpirsergīsenis:''' Tu redigijja pāusan, kawīdan turri en sen prōgraminin interfācas tekstan.
 Kitawīdinsnas en šismu pāusan wīrst kitawīdinušas interfācas pawīdan per kittans tērpautajans.
 Per tulkausnans, madli endirēis tērpautun [//translatewiki.net/wiki/Main_Page?setlang=prg translatewiki.net], - MediaWiki tulkausnan prōjaktan.",
-'sqlhidden' => '(SQL prasīsenis kliptintan)',
 'cascadeprotected' => 'Šin pāusan ast pakūnstan ezze redigīsnan, beggi ast ebīmtan en {{PLURAL:$1|ripīntsmu pāusan, kawīdan|ripīntimans pāusans, kawīdai}} turri mazīngiskwan "pakūnsnas weldīsnan" enklaūtan:
 $2',
 'namespaceprotected' => "Tū ni assei preiwērptan, kāi redigīlai pāusans en '''$1''' tītelin plattibei.",
@@ -469,7 +452,7 @@ Gēideis biskin, pirzdau tu wīrst bandāwuns etkūmps.',
 'newpassword' => 'Nāuns kliptaswīrds',
 'retypenew' => 'Āntrinais nāunan kliptaswīrdan',
 'resetpass_submit' => 'Ensadinnais kliptaswīrdan be enjaīs',
-'resetpass_success' => 'Twājs kliptaswīrds pastāi izpalewīngi kitawīdintan! Eneisnā wēraui...',
+'changepassword-success' => 'Twājs kliptaswīrds pastāi izpalewīngi kitawīdintan! Eneisnā wēraui...',
 'resetpass_forbidden' => 'Kliptaswīrdai ni mazzi būtwei kitawīdintan',
 'resetpass-no-info' => 'Tū turri būtwei engūbun, kāi turīlai entikriskan preiēisenin prei šin pāusan.',
 'resetpass-submit-loggedin' => 'Kitawīdinais kliptaswīrdan',
@@ -801,7 +784,6 @@ Nawigaciōnis autengīsenin terpausnā naikinna etrīnksenin en kōlunei.',
 'searchmenu-legend' => 'Laukīsnas mazīngiskwas',
 'searchmenu-exists' => "'''Ast pāusan \"[[:\$1]]\" en šissei wikkin''",
 'searchmenu-new' => "'''Teīkeis pāusan \"[[:\$1|\$1]]\" en šissei wikki!'''",
-'searchhelp-url' => 'Help:Ēnturs',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Pradirēis pāusans sen šin prefiksan]]',
 'searchprofile-project' => 'Pagalbas be prōjaktas pāusai',
 'searchprofile-everything' => 'Wiss',
@@ -841,14 +823,6 @@ Bandais pagaūtun laukītan frāzin sen prefiksan \"all:\", kāi pralaukīlai pa
 En šissei kērdan tu mazzi laukītun sen Google.
 Pamēnais, kāi tenēisan indicai mazzi ni būtwei aktuālin.',
 
-# Quickbar
-'qbsettings' => 'Dīwas preiēisenes sawinzli',
-'qbsettings-none' => 'Nisatausnā',
-'qbsettings-fixedleft' => 'Preidrūktintan prei kāirai',
-'qbsettings-fixedright' => 'Preidrūktintan prei tikrai',
-'qbsettings-floatingleft' => 'Plūjants prei kāirai',
-'qbsettings-floatingright' => 'Plūjants prei tikrai',
-
 # Preferences page
 'preferences' => 'Pirminiskwas',
 'mypreferences' => 'Majjas pirminiskwas',
@@ -873,7 +847,6 @@ Pamēnais, kāi tenēisan indicai mazzi ni būtwei aktuālin.',
 'saveprefs' => 'Enpeisāis',
 'resetprefs' => 'Ausadinnais nienpeisātans kitawīdinsnans',
 'restoreprefs' => 'Etwārtai wartinnais wissans auprestaminans pirminiskwans',
-'prefs-edit-boxsize' => 'Redigīsnas langstas debban.',
 'rows' => 'Rīndas:',
 'columns' => 'Kōlunis:',
 'searchresultshead' => 'Laukīs',
@@ -908,7 +881,6 @@ Pamēnais, kāi tenēisan indicai mazzi ni būtwei aktuālin.',
 'prefs-custom-css' => 'swājs CSS',
 'prefs-custom-js' => 'swājs JavaScript',
 'prefs-emailconfirm-label' => 'E-mailas padruktinsna:',
-'prefs-textboxsize' => 'Redigīsnas langstas debban',
 'youremail' => 'Twajā e-mail adressi:',
 'username' => 'Tērpautajas pabilisnā:',
 'uid' => 'Tērpautajas ID:',
@@ -1120,7 +1092,6 @@ Tū mazzi dīgi etrīnktun dātun kitēimans drāugautwei sen tin pra tērpautaj
 # Recent changes linked
 'recentchangeslinked' => 'Kitawīdinsnas en preiristamans',
 'recentchangeslinked-title' => 'Kitawīdinsnas en pāusamans, prei kawīdans "$1" autenginna',
-'recentchangeslinked-noresult' => 'Ni bēi niaīnas kitawīdinsnas en preiristamans anga autenginantimmans pāusans en etrīnktan kērdasetrapan.',
 'recentchangeslinked-summary' => 'Zemmais ast listi stēisan panzdauman kitawīdinsnan en pāusamans prei kawīdans autenginna dātan pāusan (anga en wisēimans pāusans perlānkintimans prei dātan kategōrijan).
 Pāusai iz [[Special:Watchlist|nadirītan listin]] ast pastarīntan.',
 'recentchangeslinked-page' => 'Pāusas tītels',
@@ -1371,12 +1342,6 @@ Tērpausna: ēnturas_tīps/pōtips, perw. <code>image/jpeg</code>.',
 'statistics-users-active-desc' => 'Tērpautajai sēntei aktīwai en {{PLURAL:$1|panzdauman dēinan|panzdaumans dēinans}}',
 'statistics-mostpopular' => 'Ukadeznimai kāimalukitai pāusai',
 
-'disambiguations' => 'Ainapreslinsnas pāusai',
-'disambiguationspage' => 'Template:Ainapreslinsna',
-'disambiguations-text' => "Zemmaišai pāusai autenginna prei '''ainapreslinsnas pāusan'''.
-Tenēimans prawerru autengīntun entikriskai prei pāusas ēnturan. </br>
-Pāusan ast laikātan per ainapreslinsnan pāusan ik tennan tērpaui šablōnin prei kawīdan autenginna [[MediaWiki:Disambiguationspage]]",
-
 'doubleredirects' => 'Dwigubbai prawessenei',
 'doubleredirectstext' => 'Zemmais ast listi wisēisan pāusan sen prawessenins en pāusans, kawīdai prawedda en kittan pāusan.
 Erainā rindā turri ēn sen autengīnsenins en pirman be āntran prawessenin, tīt dīgi autengīnsenin kwēi wedda āntars prawessenis. Jāuku panzdaums autengīnsenin wedda en pāusan, en kawīdan prawerru prawestun pirmasmu pāusan.
@@ -1585,10 +1550,9 @@ Eraīna šisse pāusas ēnturas kitawīdinsna anga diskusiōnis pāusas sēitan
 'unwatchthispage' => 'Wanginnais nadirītun',
 'notanarticle' => 'Sta ni ast artīkels',
 'notvisiblerev' => 'Wersiōni pastāi āupausintan',
-'watchnochange' => 'Niaīnan iz nadirītans pāusans ni bēi redigītan en padātan kērdasetrapan.',
 'watchlist-details' => 'Ast {{PLURAL:$1|$1 pāusan|$1 pāusai}} en twajjai listin stēisan nadirītan, ni gīrbawintei diskusiōnis pāusans.',
-'wlheader-enotif' => '* E-mail pawakīsenei ast enklaūtan.',
-'wlheader-showupdated' => "* Pastāi '''pastarīntan''' pāusai,  kawīdai bēi kitawīdintan ezze Twajjai panzdauman tenēisan kāimalukisnan..",
+'wlheader-enotif' => 'E-mail pawakīsenei ast enklaūtan.',
+'wlheader-showupdated' => "Pastāi '''pastarīntan''' pāusai,  kawīdai bēi kitawīdintan ezze Twajjai panzdauman tenēisan kāimalukisnan..",
 'watchmethod-recent' => 'Izbandasnā stēisan panzdauman kitawīdisnan sirzdau nadirītans pāusans',
 'watchmethod-list' => 'Izbandasnā stēisan nadirītan pāusan laukīntei panzdaumans kitawīdisnans',
 'watchlistcontains' => 'En twajjai listin stēisan nadirītan ast $1 {{PLURAL:$1|pāusan|pāusai}}.',
@@ -1891,10 +1855,7 @@ Jaīs en [[Special:BlockList|IP blōkisenin listin]] ki widālai wissans tēnti
 Sta ast, šlāit, blōkitan kāigi delīks stesse $2 ebīmtan, kawīdan mazzi būtwei etblōkitan.',
 'ip_range_invalid' => 'Nitikrōmiskas IP ebīmtan.',
 'ip_range_toolarge' => 'Ebīmtas blōkisenei mūiseisan nikāi /$1 ni ast preiēminan.',
-'blockme' => 'Blōkis min',
 'proxyblocker' => 'Proxy blōkisna',
-'proxyblocker-disabled' => 'Šī funkciōni ast izklaūtan.',
-'proxyblocksuccess' => 'Segītan.',
 'sorbsreason' => 'Twajā IP adressi ast en listei stēisan open proxy sērwerin en DBSBL, tērpautan pra {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Twajā IP adressi ast en listei stēisan open proxy sērwerin en DBSBL, tērpautan pra {{SITENAME}}.
 Tū ni mazzi teīktun rekkenan',
@@ -2254,7 +2215,7 @@ Kitāi wīrst būwusis kliptan auprestaminai.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Plattu',
 'exif-imagelength' => 'Aūktan',
 'exif-bitspersample' => 'Bittai per izimlin',
@@ -2355,7 +2316,7 @@ Kitāi wīrst būwusis kliptan auprestaminai.
 'exif-gpsareainformation' => 'GPS areālas pabilisnā',
 'exif-gpsdatestamp' => 'GPS dātan',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nikōmpresitan',
 
 'exif-unknowndate' => 'Niwaīstan dātan',
@@ -2614,7 +2575,6 @@ Tu mazzi dīgi [[Special:EditWatchlist|tērpautun stāndardiskan editōran]].',
 'version-variables' => 'Wariāblis',
 'version-other' => 'Kitāi',
 'version-hooks' => 'Ānsai',
-'version-extension-functions' => 'Plattinsenes funkciōnis',
 'version-parser-extensiontags' => 'Parseras plattinsenes zentlitajai',
 'version-parser-function-hooks' => 'Parseras funkciōnis ānsai',
 'version-hook-name' => 'Ānsas pabilisnā',
@@ -2623,15 +2583,6 @@ Tu mazzi dīgi [[Special:EditWatchlist|tērpautun stāndardiskan editōran]].',
 'version-software' => 'Instalītas prōgraminis',
 'version-software-version' => 'Wersiōni',
 
-# Special:FilePath
-'filepath' => 'Lunki en zūrbrukin',
-'filepath-page' => 'Zūrbrukis:',
-'filepath-submit' => 'Lunki',
-'filepath-summary' => 'Šin speciālin pāusan wartinna pastippan lunkin prei zūrbrukin.
-Bildei ast waīdintan en pilnan  rezōluciōnin, kitāi zūrbrukin tīpai ast etwertan en prōgramu preiristasmu prei tennans.
-
-Enpeisāis zūrbrukes pabilīsnan šlāit "{{ns:file}}:" prefiksan.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Laukīs dwigubbintans zūrbrukins',
 'fileduplicatesearch-summary' => 'Laukīs dwigubbintans zūrbrukins pa tenēisan kōntrōlingin summin.',
diff --git a/languages/messages/MessagesPs.php b/languages/messages/MessagesPs.php
index f3dea787..60bef838 100644
--- a/languages/messages/MessagesPs.php
+++ b/languages/messages/MessagesPs.php
@@ -188,7 +188,6 @@ $messages = array(
 'tog-shownumberswatching' => 'د کتونکو کارنانو شمېر ښکاره کول',
 'tog-oldsig' => 'اوسنی لاسليک:',
 'tog-fancysig' => 'لاسليک د ويکي متن په توگه په پام کې نيول (د خپلکاره تړن د تړلو پرته)',
-'tog-showjumplinks' => 'د "ورټوپ کړه" د آسانتياوو تړنې چارنول',
 'tog-uselivepreview' => 'ژوندۍ مخليدنه کارول (آزمېښتي)',
 'tog-forceeditsummary' => 'د يوه تش سمون لنډيز په ورکولو سره دې خبر راکړل شي',
 'tog-watchlisthideown' => 'په کتنلړ کې زما سمونې پټول',
@@ -201,6 +200,8 @@ $messages = array(
 'tog-diffonly' => 'د توپيرونو نه لاندې د مخ مېنځپانگه پټول',
 'tog-showhiddencats' => 'پټې وېشنيزې ښکاره کول',
 'tog-norollbackdiff' => 'پرشاتمبولو وروسته توپيرونه نه ښودل',
+'tog-useeditwarning' => 'کله چې يو سمون مخ څخه د بدلونونو د خوندي کولو پرته وځم خبر دې شم',
+'tog-prefershttps' => 'د ننوتلو پر مهال تل يوه خوندي اړيکتيا کارول',
 
 'underline-always' => 'تل',
 'underline-never' => 'هېڅکله',
@@ -264,6 +265,18 @@ $messages = array(
 'oct' => 'اکتوبر',
 'nov' => 'نومبر',
 'dec' => 'ډيسمبر',
+'january-date' => 'جنوري $1',
+'february-date' => 'فېبروري $1',
+'march-date' => 'مارچ $1',
+'april-date' => 'اپريل $1',
+'may-date' => 'مۍ $1',
+'june-date' => 'جون $1',
+'july-date' => 'جولای $1',
+'august-date' => 'اگست $1',
+'september-date' => 'سېپتمبر $1',
+'october-date' => 'اکتوبر $1',
+'november-date' => 'نومبر $1',
+'december-date' => 'دېسمبر $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|وېشنيزه|وېشنيزې}}',
@@ -345,6 +358,7 @@ $messages = array(
 'create-this-page' => 'همدا مخ ليکل',
 'delete' => 'ړنگول',
 'deletethispage' => 'دا مخ ړنگول',
+'undeletethispage' => 'دا مخ ناړنگول',
 'undelete_short' => '{{PLURAL:$1|يو سمون|$1 سمونې}} ناړنگول',
 'viewdeleted_short' => '{{PLURAL:$1|يو ړنگ شوی سمون|$1 ړنگ شوي سمونونه}} کتل',
 'protect' => 'ژغورل',
@@ -387,7 +401,7 @@ $1',
 'pool-queuefull' => 'د بهير صف ډک دی',
 'pool-errorunknown' => 'ناجوته ستونزه',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'د {{SITENAME}} په اړه',
 'aboutpage' => 'Project:په اړه',
 'copyright' => 'دا مېنځپانگه د $1 له مخې ستاسې لاسرسي ته پرته ده، خو هغه څه چې په خلاف يې وييل شوي.',
@@ -397,7 +411,6 @@ $1',
 'disclaimers' => 'ردادعاليکونه',
 'disclaimerpage' => 'Project:ټولگړی ردادعاليک',
 'edithelp' => 'د لارښود سمون',
-'edithelppage' => 'Help:سمونه',
 'helppage' => 'Help:نيوليک',
 'mainpage' => 'لومړی مخ',
 'mainpage-description' => 'لومړی مخ',
@@ -518,10 +531,13 @@ $1',
 'editinginterface' => "'''گواښنه:''' تاسو په يوه داسې مخ کې بدلون راولی کوم چې د يوې پوستکالی د ليدنمخ متن په توگه کارېږي.
 په همدې مخ کې بدلون راوستل به د نورو کارنانو د ليدنمخ بڼه اغېزمنه کړي.
 د ژباړې د ورگډولو او بدلون لپاره، مهرباني وکړی د [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]، وېبځي ته ولاړ شی. دا وېبځی د ميډياويکي د ځايتابه پروژه ده.",
-'sqlhidden' => '(د SQL پوښتن پټ دی)',
 'namespaceprotected' => "تاسې د '''$1''' په نوم-تشيال کې د مخونو د سمولو اجازه نه لرۍ.",
 'customcssprotected' => 'تاسې د دې CSS مخ د سمولو اجازه نه لرۍ، دا ځکه چې دا مخ د بل کارن شخصي امستنې لري.',
 'customjsprotected' => 'تاسې د دې جاواسکرېپټ مخ د سمولو اجازه نه لرۍ، دا ځکه چې دا مخ د بل کارن شخصي امستنې لري.',
+'mycustomcssprotected' => 'تاسې د دې CSS مخ د سمولو اجازه نلرۍ.',
+'mycustomjsprotected' => 'تاسې د دې جاوا سكريپټ مخ د سمولو اجازه نلرۍ.',
+'myprivateinfoprotected' => 'تاسې د دې شخصي مالوماتو د سمولو اجازه نلرۍ.',
+'mypreferencesprotected' => 'تاسې د خپلو غوره توبونو د سمولو اجازه نلرۍ.',
 'ns-specialprotected' => 'ځانگړي مخونو کې سمون او بدلون نه شی راوستلای.',
 'titleprotected' => 'د [[User:$1|$1]] لخوا د دې سرليک د جوړېدلو مخنيوی شوی.
 او د دې کړنې سبب "\'\'$2\'\'" ورکړ شوی.',
@@ -540,10 +556,19 @@ $1',
 'welcomecreation-msg' => 'گڼون مو جوړ شو.
 د [[Special:Preferences|{{SITENAME}} غوره توبونه]] بدلول مو مه هېروۍ.',
 'yourname' => 'کارن-نوم:',
+'userlogin-yourname' => 'کارن-نوم',
+'userlogin-yourname-ph' => 'کارن-نوم مو وليکۍ',
+'createacct-another-username-ph' => 'كارن نوم مو وركړۍ',
 'yourpassword' => 'پټنوم:',
+'userlogin-yourpassword' => 'پټنوم',
+'userlogin-yourpassword-ph' => 'پټنوم مو وليکۍ',
+'createacct-yourpassword-ph' => 'پټنوم مو وټاپۍ',
 'yourpasswordagain' => 'پټنوم بيا وليکه',
+'createacct-yourpasswordagain' => 'پټنوم مو تاييد کړۍ',
+'createacct-yourpasswordagain-ph' => 'پټنوم مو بيا وټاپۍ',
 'remembermypassword' => 'زما پټنوم په دې کمپيوټر (تر $1 {{PLURAL:$1|ورځې|ورځو}}) په ياد وساته!',
-'securelogin-stick-https' => 'وروسته د ننوتلو HTTPS سره تړلی پاتې کېدل',
+'userlogin-remembermypassword' => 'غونډال کې مې ننوتلی وساته',
+'userlogin-signwithsecure' => 'خوندي اړيکتيا کارول',
 'yourdomainname' => 'ستاسې شپول:',
 'password-change-forbidden' => 'تاسې په دې ويکي باندې خپل پټنوم نه شی بدلولی.',
 'login' => 'ننوتل',
@@ -554,18 +579,38 @@ $1',
 'logout' => 'وتل',
 'userlogout' => 'وتل',
 'notloggedin' => 'غونډال کې نه ياست ننوتي',
+'userlogin-noaccount' => 'گڼون نه لرې؟',
+'userlogin-joinproject' => 'د {{SITENAME}} سره يوځای شه',
 'nologin' => 'کارن-نوم نه لرې؟ $1.',
 'nologinlink' => 'يو گڼون جوړول',
 'createaccount' => 'گڼون جوړول',
 'gotaccount' => 'آيا وار دمخې يو گڼون لری؟ $1.',
 'gotaccountlink' => 'ننوتل',
 'userlogin-resetlink' => 'د ننوتلو مالومات مو هېر شوي؟',
+'userlogin-resetpassword-link' => 'پټنوم مو بياپرځايول',
+'createacct-join' => 'خپل مالومات لاندې ورکړۍ',
+'createacct-emailrequired' => 'برېښليک پته',
+'createacct-emailoptional' => 'برېښليک پته (اختياري)',
+'createacct-email-ph' => 'برېښليک پته مو وټاپۍ',
+'createacct-another-email-ph' => 'برېښليک پته مو ورکړۍ',
 'createaccountmail' => 'يو لنډمهاله ناټاکلی پټنوم کارول او په لاندې ورکړل شوې برېښليک پته کې ورلېږل',
+'createacct-realname' => 'آر نوم (اختياري)',
 'createaccountreason' => 'سبب:',
+'createacct-reason' => 'سبب',
+'createacct-reason-ph' => 'ولې تاسې بل گڼون جوړول غوااړۍ',
+'createacct-captcha' => 'امنيتي تدبير',
+'createacct-imgcaptcha-ph' => 'پورته تاسې ته ښکاره شوی متن وټاپۍ',
+'createacct-submit' => 'گڼون مو جوړ کړۍ',
+'createacct-another-submit' => 'بل گڼون جوړول',
+'createacct-benefit-heading' => '{{SITENAME}} ستاسې په شان خلکو لخوا جوړ شوی.',
+'createacct-benefit-body1' => '{{PLURAL:$1|سمون|سمونونه}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|مخ|مخونه}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|وروستنی ونډه وال|وروستني ونډه وال}}',
 'badretype' => 'دا پټنوم چې تاسې ليکلی د مخکني پټنوم سره ورته نه دی.',
 'userexists' => 'کوم کارن نوم چې تاسې ورکړی هغه بل چا کارولی.
 لطفاً يو بل نوم وټاکۍ.',
 'loginerror' => 'د ننوتنې ستونزه',
+'createacct-error' => 'د گڼون جوړېدنې ستونزه',
 'createaccounterror' => 'گڼون مو جوړ نه شو: $1',
 'nocookiesnew' => 'ستاسې گڼون جوړ شو، خو تاسې لا غونډال ته نه ياست ورننوتلي.
 {{SITENAME}} کې د ننوتلو لپاره کوکيز کارېږي.
@@ -638,7 +683,7 @@ $1',
 'newpassword' => 'نوی پټنوم:',
 'retypenew' => 'نوی پټنوم بيا وليکه:',
 'resetpass_submit' => 'پټنوم مو وټاکۍ او بيا غونډال ته ورننوځۍ',
-'resetpass_success' => 'ستاسې پټنوم په برياليتوب سره بدل شو!
+'changepassword-success' => 'ستاسې پټنوم په برياليتوب سره بدل شو!
 اوس غونډال کې د ورننوتلو په حال کې يو ...',
 'resetpass_forbidden' => 'پټنومونه مو نه شي بدلېدلای',
 'resetpass-no-info' => 'دې مخ ته د لاسرسي لپاره بايد غونډال کې ورننوځۍ.',
@@ -649,10 +694,8 @@ $1',
 
 # Special:PasswordReset
 'passwordreset' => 'پټنوم بياپرځايول',
-'passwordreset-text' => 'د برېښليک د  بياپرځای کېدنې لپاره دا فورمه ډکه کړۍ.',
 'passwordreset-legend' => 'پټنوم بياپرځايول',
 'passwordreset-disabled' => 'په دې ويکي پټنوم بياپرځای کولو کړنه ناچارنه شوې.',
-'passwordreset-pretext' => '{{PLURAL:$1||د لاندې اومتوک يوه برخه مالومات وليکۍ}}',
 'passwordreset-username' => 'کارن-نوم:',
 'passwordreset-domain' => 'شپول:',
 'passwordreset-capture' => 'د پايلې برېښليک کتل غواړې؟',
@@ -821,6 +864,7 @@ $1',
 داسې ښکاري چې دا مخ ړنگ شوی.',
 'edit-conflict' => 'د سمولو خنډ',
 'edit-no-change' => 'ستاسې سمون بابېزه وګڼل شو، دا ځکه چې تاسې په متن کې کوم بدلون نه دی راوستلی.',
+'postedit-confirmation' => 'ستاسې سمون خوندي شو.',
 'edit-already-exists' => 'په دې نوم يو نوی مخ جوړ نه شو.
 پدې نوم د پخوا نه يو مخ شته.',
 'defaultmessagetext' => 'تلواليزه پيغام متن',
@@ -933,6 +977,7 @@ $1',
 'compareselectedversions' => 'ټاکلې بڼې سره پرتلل',
 'showhideselectedversions' => 'ټاکلې بڼې ښکاره کول/پټول',
 'editundo' => 'ناکړ',
+'diff-empty' => '(بې توپيره)',
 'diff-multi' => ' د ({{PLURAL:$2| يو کارن|$2 کارنانو}} لخوا {{PLURAL:$1|يوه منځګړې بڼه|$1 منځګړې بڼې}}د  نه ده ښکاره شوې)',
 
 # Search results
@@ -954,7 +999,6 @@ $1',
 'searchmenu-legend' => 'د پلټلو خوښنې',
 'searchmenu-exists' => "'''په دې ويکي يو مخ د \"[[:\$1]]\" په نامه دی'''",
 'searchmenu-new' => "'''په دې ويکي د \"[[:\$1]]\" مخ جوړول!'''",
-'searchhelp-url' => 'Help:لړليک',
 'searchprofile-articles' => 'مېنځپانگيز مخونه',
 'searchprofile-project' => 'د لارښود او پروژې مخونه',
 'searchprofile-images' => 'گڼرسنۍ',
@@ -994,14 +1038,6 @@ $1',
 'powersearch-togglenone' => 'هېڅ',
 'search-external' => 'باندنۍ پلټنه',
 
-# Quickbar
-'qbsettings' => 'چټک پټه',
-'qbsettings-none' => 'هېڅ',
-'qbsettings-fixedleft' => 'ثابته کيڼ',
-'qbsettings-fixedright' => 'ثابته ښي',
-'qbsettings-floatingleft' => 'کيڼه لامبا',
-'qbsettings-floatingright' => 'ښي لامبا',
-
 # Preferences page
 'preferences' => 'غوره توبونه',
 'mypreferences' => 'غوره توبونه',
@@ -1032,7 +1068,6 @@ $1',
 'resetprefs' => 'بيا سمول',
 'restoreprefs' => 'ټولې تلواليزې امستنې پرځای کول',
 'prefs-editing' => 'سمېدنې کې دی',
-'prefs-edit-boxsize' => 'د سمون کړکۍ کچه.',
 'rows' => 'ليکې:',
 'columns' => 'ستنې:',
 'searchresultshead' => 'پلټل',
@@ -1070,7 +1105,6 @@ $1',
 'prefs-custom-js' => 'ځاني جاواسکرېپټ',
 'prefs-common-css-js' => 'د ټولو پوښونو لپاره د CSS/جاواسکرېپټ دوتنه:',
 'prefs-emailconfirm-label' => 'د برېښليک باورتيا:',
-'prefs-textboxsize' => 'د سمون کړکۍ کچه',
 'youremail' => 'برېښليک *',
 'username' => '{{GENDER:$1|کارن نوم}}:',
 'uid' => '{{GENDER:$1|کارن}} پېژندنه:',
@@ -1097,6 +1131,8 @@ $1',
 'prefs-dateformat' => 'د نېټې بڼه',
 'prefs-timeoffset' => 'د وخت واټن',
 'prefs-advancedediting' => 'ټولگړی',
+'prefs-editor' => 'سمونگر',
+'prefs-preview' => 'مخليدنه',
 'prefs-advancedrc' => 'پرمختللې خوښنې',
 'prefs-advancedrendering' => 'پرمختللې خوښنې',
 'prefs-advancedsearchoptions' => 'پرمختللې خوښنې',
@@ -1257,7 +1293,6 @@ $1',
 'recentchangeslinked-feed' => 'اړونده بدلونونه',
 'recentchangeslinked-toolbox' => 'اړونده بدلونونه',
 'recentchangeslinked-title' => '"$1" ته اړونده بدلونونه',
-'recentchangeslinked-noresult' => 'په دې موده، په تړل شويو مخونو کې هېڅ کوم بدلونونه نه دي راپېښ شوي.',
 'recentchangeslinked-summary' => "دا د هغه بدلونونو لړليک دی چې وروستۍ ځل په تړن لرونکيو مخونو کې د يوه ځانگړي مخ (او يا هم د يوې ځانگړې وېشنيزې غړو) نه رامېنځ ته شوي.
 [[Special:Watchlist|ستاسې د کتنلړ]] مخونه په '''زغرد ليک''' کې ښکاري.",
 'recentchangeslinked-page' => 'د مخ نوم:',
@@ -1269,7 +1304,7 @@ $1',
 'reuploaddesc' => 'پورته کېدنه ناگارل او بېرته د پورته کېدنې فورمې ته ورگرځېدل',
 'upload-tryagain' => 'د بدلون موندلې دوتنې څرگندونې سپارل',
 'uploadnologin' => 'غونډال کې نه ياست ننوتي',
-'uploadnologintext' => 'ددې لپاره چې دوتنې پورته کړای شۍ، نو لومړی غونډال کې [[Special:UserLogin|ورننوځۍ]].',
+'uploadnologintext' => 'د دوتنې پورته کولو لپاره بايد $1',
 'uploaderror' => 'د پورته کولو ستونزه',
 'uploadtext' => "د دوتنې د پورته کېدو لپاره لاندينی چوکاټ وکاروۍ.
 که چېرته د پخونيو پورته شويو دوتنو کتل او پلټل غواړۍ نو [[Special:FileList|د پورته شويو دوتنو لړليک]] ته ورشۍ، [[Special:Log/upload|د (بيا) پورته شويو دوتنو يادښتونه]] او [[Special:Log/delete|د ړنگېدو يادښتونه]] هم کتلای شی.
@@ -1471,9 +1506,6 @@ $1',
 'statistics-users-active-desc' => 'هغه کارنان چې په {{PLURAL:$1|وروستۍ ورځ|وروستيو $1 ورځو}} کې فعاله ونډه لرلې',
 'statistics-mostpopular' => 'ډېر کتل شوي مخونه',
 
-'disambiguations' => 'د مبهمو مخونو سره تړلي مخونه',
-'disambiguationspage' => 'Template:ناجوت',
-
 'pageswithprop-submit' => 'ورځه',
 
 'doubleredirects' => 'دوه ځلي ورگرځېدنې',
@@ -1682,7 +1714,7 @@ $1',
 'notanarticle' => 'يو منځپانګيز مخ نه دی',
 'watchlist-details' => 'ستاسې کتنلړ کې {{PLURAL:$1|$1 مخ دی|$1 مخونه دي}}، د خبرو اترو مخونه مو پکې نه دي شمېرلي.',
 'wlheader-enotif' => 'د برېښليک له لارې خبرول چارن شوی.*',
-'wlheader-showupdated' => "* هغه مخونه چې وروستی ځل ستاسو د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک نښه شوي.",
+'wlheader-showupdated' => "هغه مخونه چې وروستی ځل ستاسو د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک نښه شوي.",
 'watchlistcontains' => 'ستاسې کتنلړ $1 {{PLURAL:$1|مخ|مخونه}} لري.',
 'iteminvalidname' => "د '$1' توکي سره ستونزه، ناسم نوم ...",
 'wlnote' => "دلته لاندې {{PLURAL:$1|وروستی بدلون دی|وروستي '''$1''' بدلونونه دي}} چې په {{PLURAL:$2|تېر ساعت|تېرو '''$2''' ساعتونو}} کې تر $3 نېټې او $4 بجو پېښ شوي.",
@@ -1970,8 +2002,6 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'ipb-needreblock' => 'پر $1 د پخوا نه بنديز لگېدلی.
 آيا تاسې د امستنو بدلول غواړۍ؟',
 'ipb-otherblocks-header' => '{{PLURAL:$1|بل بنديز|نور بنديزونه}}',
-'blockme' => 'پر ما بنديز لگول',
-'proxyblocksuccess' => 'ترسره شو.',
 
 # Developer tools
 'lockdb' => 'توکبنسټ تړل',
@@ -2158,11 +2188,9 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'tooltip-summary' => 'يو لنډ لنډيز کښل',
 
 # Stylesheets
-'nostalgia.css' => '/* د CSS هره بڼه چې دلته ځای پر ځای کېږي هغه به د نوستالجيا د پوښ ټولو کارنانو لپاره کار کوي */',
 'vector.css' => '/* د CSS هره بڼه چې دلته ځای پر ځای کېږي هغه به د وېکټور د پوښ ټولو کارنانو لپاره کار کوي */',
 
 # Scripts
-'nostalgia.js' => '/* د جاوا هر يو سکرېپټ چې دلته ځای پر ځای کېږي هغه به د نوستالجيا د پوښ ټولو کارنانو لپاره کار کوي */',
 'vector.js' => '/* د جاوا هر يو سکرېپټ چې دلته ځای پر ځای کېږي هغه به د وېکټور د پوښ ټولو کارنانو لپاره کار کوي */',
 
 # Attribution
@@ -2204,13 +2232,8 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'pageinfo-category-files' => 'د دوتنو شمېر',
 
 # Skin names
-'skinname-standard' => 'کلاسيک',
-'skinname-nostalgia' => 'نوستالژي',
 'skinname-cologneblue' => 'شين کلون',
 'skinname-monobook' => 'مونوبوک',
-'skinname-myskin' => 'زمابڼه',
-'skinname-chick' => 'شيک',
-'skinname-simple' => 'ساده',
 'skinname-modern' => 'نوی',
 'skinname-vector' => 'وېکټور',
 
@@ -2292,7 +2315,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'سوروالی',
 'exif-imagelength' => 'لوړوالی',
 'exif-datetime' => 'د دوتنې د بدلون وخت او نېټه',
@@ -2631,10 +2654,6 @@ $5
 'version-software-product' => 'اېبره',
 'version-software-version' => 'بڼه',
 
-# Special:FilePath
-'filepath-page' => 'دوتنه:',
-'filepath-submit' => 'ورځه',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'د دوه گونو دوتنو پلټنه',
 'fileduplicatesearch-legend' => 'د دوه گونو دوتنو پلټنه',
@@ -2680,6 +2699,9 @@ $5
 'tag-filter-submit' => 'چاڼگر',
 'tags-display-header' => 'د بدلون په لړليکونو کې ښکارېدنه',
 'tags-description-header' => 'د مانا بشپړه څرگندونه',
+'tags-active-header' => 'فعال؟',
+'tags-active-yes' => 'هو',
+'tags-active-no' => 'نه',
 'tags-edit' => 'سمول',
 'tags-hitcount' => '$1 {{PLURAL:$1|بدلون|بدلونونه}}',
 
@@ -2708,6 +2730,8 @@ $5
 'htmlform-submit' => 'سپارل',
 'htmlform-reset' => 'بدلونونه ناکړل',
 'htmlform-selectorother-other' => 'بل',
+'htmlform-no' => 'نه',
+'htmlform-yes' => 'هو',
 
 # New logging system
 'logentry-delete-delete' => '$1 د $3 مخ {{GENDER:$2|ړنگ کړ}}',
diff --git a/languages/messages/MessagesPt.php b/languages/messages/MessagesPt.php
index d82a2f70..9a6ff9e8 100644
--- a/languages/messages/MessagesPt.php
+++ b/languages/messages/MessagesPt.php
@@ -9,9 +9,11 @@
  *
  * @author Alchimista
  * @author Andresilvazito
+ * @author Cainamarques
  * @author Capmo
  * @author Crazymadlover
  * @author Daemorris
+ * @author DanielTom
  * @author Dannyps
  * @author Dicionarista
  * @author Francisco Leandro
@@ -37,6 +39,7 @@
  * @author McDutchie
  * @author MetalBrasil
  * @author Minh Nguyen
+ * @author Nemo bis
  * @author Nuno Tavares
  * @author OTAVIO1981
  * @author Opraco
@@ -346,9 +349,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostrar o número de utilizadores a vigiar',
 'tog-oldsig' => 'Assinatura existente:',
 'tog-fancysig' => 'Tratar assinatura como texto wiki (sem link automático)',
-'tog-externaleditor' => 'Por omissão, utilizar um editor externo (só para utilizadores avançados, exige configurações adicionais no seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-externaldiff' => 'Por omissão, utilizar diferenças externas (só para utilizadores avançados, exige configurações adicionais no seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-showjumplinks' => 'Possibilitar links de acessibilidade "{{int:jumpto}}"',
 'tog-uselivepreview' => 'Usar a antevisão ao vivo (experimental)',
 'tog-forceeditsummary' => 'Avisar-me se deixar o resumo da edição vazio',
 'tog-watchlisthideown' => 'Esconder as minhas edições ao listar mudanças às páginas vigiadas',
@@ -362,6 +362,8 @@ $messages = array(
 'tog-showhiddencats' => 'Mostrar categorias ocultas',
 'tog-noconvertlink' => 'Impossibilitar a conversão dos títulos de links',
 'tog-norollbackdiff' => 'Omitir diferenças depois de reverter edições em bloco',
+'tog-useeditwarning' => 'Avisar-me ao abandonar uma página editada sem gravar as alterações.',
+'tog-prefershttps' => 'Sempre utilizar uma conexão segura ao iniciar sessão',
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Nunca',
@@ -425,6 +427,18 @@ $messages = array(
 'oct' => 'Out.',
 'nov' => 'Nov.',
 'dec' => 'Dez.',
+'january-date' => '$1 de Janeiro',
+'february-date' => '$1 de Fevereiro',
+'march-date' => '$1 de Março',
+'april-date' => '$1 de Abril',
+'may-date' => '$1 de Maio',
+'june-date' => '$1 de Junho',
+'july-date' => '$1 de Julho',
+'august-date' => '$1 de Agosto',
+'september-date' => '$1 de Setembro',
+'october-date' => '$1 de Outubro',
+'november-date' => '$1 de Novembro',
+'december-date' => '$1 de Dezembro',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
@@ -506,6 +520,7 @@ $messages = array(
 'create-this-page' => 'Criar esta página',
 'delete' => 'Eliminar',
 'deletethispage' => 'Eliminar esta página',
+'undeletethispage' => 'Restaurar esta página',
 'undelete_short' => 'Restaurar {{PLURAL:$1|uma edição|$1 edições}}',
 'viewdeleted_short' => 'Ver {{PLURAL:$1|uma edição eliminada|$1 edições eliminadas}}',
 'protect' => 'Proteger',
@@ -549,7 +564,7 @@ $1',
 'pool-queuefull' => 'A fila de processos está cheia',
 'pool-errorunknown' => 'Erro desconhecido',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Sobre a {{SITENAME}}',
 'aboutpage' => 'Project:Sobre',
 'copyright' => 'Conteúdo disponibilizado nos termos da $1, salvo indicação em contrário.',
@@ -559,7 +574,6 @@ $1',
 'disclaimers' => 'Exoneração de responsabilidade',
 'disclaimerpage' => 'Project:Aviso_geral',
 'edithelp' => 'Ajuda de edição',
-'edithelppage' => 'Help:Editar',
 'helppage' => 'Help:Conteúdos',
 'mainpage' => 'Página principal',
 'mainpage-description' => 'Página principal',
@@ -637,17 +651,11 @@ Encontra uma lista das páginas especiais válidas em [[Special:SpecialPages|{{i
 # General errors
 'error' => 'Erro',
 'databaseerror' => 'Erro na base de dados',
-'dberrortext' => 'Ocorreu um erro sintáctico na pesquisa à base de dados.
-Isto poderá indicar um defeito no software.
-A última pesquisa executada na base de dados foi:
-<blockquote><code>$1</code></blockquote>
-na função "<code>$2</code>".
-A base de dados devolveu o erro "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ocorreu um erro sintáctico na pesquisa à base de dados.
-A última tentativa de consulta à base de dados foi:
-"$1"
-na função "$2".
-A base de dados devolveu o erro "$3: $4"',
+'databaseerror-text' => 'Ocorreu um erro na consulta à base de dados.
+Isto pode indicar um defeito no programa.',
+'databaseerror-textcl' => 'Ocorreu um erro na consulta à base de dados.',
+'databaseerror-query' => 'Consulta:$1',
+'databaseerror-error' => 'Erro: $1',
 'laggedslavemode' => "'''Aviso:''' A página pode não conter as atualizações mais recentes.",
 'readonly' => 'Base de dados bloqueada (limitada a leituras)',
 'enterlockreason' => 'Introduza um motivo para bloquear, incluindo uma estimativa de quando será desbloqueada',
@@ -681,6 +689,7 @@ Pode já ter sido eliminado por outro utilizador.',
 'cannotdelete-title' => 'Não é possível eliminar a página "$1"',
 'delete-hook-aborted' => 'A eliminação foi cancelada por um "hook".
 Não foi dada nenhuma explicação.',
+'no-null-revision' => 'Não foi possível criar uma nova revisão nula para a página "$1"',
 'badtitle' => 'Título inválido',
 'badtitletext' => 'O título de página solicitado era inválido, vazio, ou um link interlínguas ou interwikis incorrecto.
 Talvez contenha um ou mais caracteres que não podem ser usados em títulos.',
@@ -700,12 +709,15 @@ Consulta: $2',
 'viewyourtext' => "Pode ver e copiar o código-fonte das '''suas edições''' desta página:",
 'protectedinterface' => 'Esta página fornece o texto da interface ao software, e está protegida para prevenir abusos.',
 'editinginterface' => "'''Aviso:''' Está a editar uma página usada para fornecer texto de interface ao software. Alterações a esta página afetarão a aparência da interface de utilizador para os outros utilizadores. Para traduções, considere utilizar a [//translatewiki.net/wiki/Main_Page?setlang=pt translatewiki.net], um projeto destinado à tradução do MediaWiki.",
-'sqlhidden' => '(Consulta SQL em segundo-plano)',
 'cascadeprotected' => 'Esta página foi protegida contra edições por estar incluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de proteção "em cascata" ativada):
 $2',
 'namespaceprotected' => "Não possui permissão para editar páginas no espaço nominal '''$1'''.",
 'customcssprotected' => 'Não tem permissões para editar esta página de CSS porque ela contém as configurações pessoais de outro utilizador.',
 'customjsprotected' => 'Não tem permissões para editar esta página de JavaScript porque ela contém as configurações pessoais de outro utilizador.',
+'mycustomcssprotected' => 'Não tem permissão para editar esta página de CSS.',
+'mycustomjsprotected' => 'Não tem permissão para editar esta página de JavaScript.',
+'myprivateinfoprotected' => 'Você não tem permissão para editar sua informação privada.',
+'mypreferencesprotected' => 'Você não tem permissão para editar as suas preferências.',
 'ns-specialprotected' => 'Não é possível editar páginas especiais',
 'titleprotected' => 'Este título foi protegido contra criação por [[User:$1|$1]].
 A justificação foi "\'\'$2\'\'".',
@@ -730,10 +742,19 @@ Tenha em atenção que algumas páginas poderão continuar a ser apresentadas co
 'welcomecreation-msg' => 'A sua conta foi criada.
 Não se esqueça de personalizar as suas [[Special:Preferences|preferências]].',
 'yourname' => 'Nome de utilizador:',
+'userlogin-yourname' => 'Nome de utilizador(a):',
+'userlogin-yourname-ph' => 'Digite seu nome de utilizador(a)',
+'createacct-another-username-ph' => 'Digite o nome de utilizador',
 'yourpassword' => 'Palavra-chave:',
+'userlogin-yourpassword' => 'Palavra-chave',
+'userlogin-yourpassword-ph' => 'Digite sua palavra-chave',
+'createacct-yourpassword-ph' => 'Digite uma palavra-chave',
 'yourpasswordagain' => 'Repita a palavra-chave:',
+'createacct-yourpasswordagain' => 'Confirme a palavra-chave',
+'createacct-yourpasswordagain-ph' => 'Digite a palavra-chave novamente',
 'remembermypassword' => 'Recordar os meus dados neste computador (no máximo, por $1 {{PLURAL:$1|dia|dias}})',
-'securelogin-stick-https' => 'Manter a ligação HTTPS após a autenticação',
+'userlogin-remembermypassword' => 'Manter-me autenticado',
+'userlogin-signwithsecure' => 'Use uma ligação segura',
 'yourdomainname' => 'O seu domínio:',
 'password-change-forbidden' => 'Não pode alterar senhas nesta wiki.',
 'externaldberror' => 'Ocorreu um erro externo à base de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.',
@@ -745,18 +766,44 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências]].'
 'logout' => 'Sair',
 'userlogout' => 'Sair',
 'notloggedin' => 'Não autenticado',
+'userlogin-noaccount' => 'Não tem uma conta?',
+'userlogin-joinproject' => 'Junte-se ao projeto {{SITENAME}}',
 'nologin' => 'Não possui uma conta? $1.',
 'nologinlink' => 'Criar uma conta',
 'createaccount' => 'Criar conta',
 'gotaccount' => "Já possui uma conta? '''$1'''.",
 'gotaccountlink' => 'Autentique-se',
 'userlogin-resetlink' => 'Esqueceu-se do seu nome de utilizador ou da palavra-chave?',
+'userlogin-resetpassword-link' => 'Recuperar palavra-chave',
+'helplogin-url' => 'Help:Autenticação',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda a fazer login]]',
+'userlogin-loggedin' => 'Já está {{GENDER:$1|autenticado|autenticada|autenticado}} com o nome $1.
+Use o formulário abaixo para iniciar uma sessão com outro nome.',
+'userlogin-createanother' => 'Criar outra conta',
+'createacct-join' => 'Insira a sua informação abaixo.',
+'createacct-another-join' => 'Digite a informação da nova conta abaixo.',
+'createacct-emailrequired' => 'Endereço de email',
+'createacct-emailoptional' => 'Endereço de email (opcional)',
+'createacct-email-ph' => 'Digite seu endereço de email',
+'createacct-another-email-ph' => 'Digite o endereço de e-mail',
 'createaccountmail' => 'Usar uma palavra passe aleatória e temporária e enviar para o endereço de correio eletrónico especificado',
+'createacct-realname' => 'Nome verdadeiro (opcional)',
 'createaccountreason' => 'Motivo:',
+'createacct-reason' => 'Razão',
+'createacct-reason-ph' => 'Porque está a criar outra conta',
+'createacct-captcha' => 'Verificar segurança',
+'createacct-imgcaptcha-ph' => 'Digite o texto que vê acima',
+'createacct-submit' => 'Crie a sua conta',
+'createacct-another-submit' => 'Criar uma outra conta',
+'createacct-benefit-heading' => '{{SITENAME}} é feito por pessoas como você.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edição|edições}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|página|páginas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contribuidor|contribuidores}} recentes',
 'badretype' => 'As palavras-chave que introduziu não são iguais.',
 'userexists' => 'O nome de utilizador introduzido já existe.
 Por favor escolha um nome diferente.',
 'loginerror' => 'Erro de autenticação',
+'createacct-error' => 'Erro na criação da conta',
 'createaccounterror' => 'Não foi possível criar a conta: $1',
 'nocookiesnew' => "A conta de utilizador foi criada, mas neste momento não está autenticado.
 A {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.
@@ -818,11 +865,13 @@ Deve agora autenticar-se e alterar a sua palavra-chave.
 
 Se a conta foi criada por engano, pode ignorar esta mensagem.',
 'usernamehasherror' => 'O nome de utilizador não pode conter o símbolo de cardinal (#).',
-'login-throttled' => 'Realizou demasiadas tentativas de autenticação com esta conta.
-Aguarde antes de tentar novamente, por favor.',
+'login-throttled' => 'Você realizou demasiadas tentativas de autenticação com esta conta.
+Aguarde $1 antes de tentar novamente, por favor.',
 'login-abort-generic' => 'A sua autenticação não teve êxito - Cancelada',
 'loginlanguagelabel' => 'Língua: $1',
 'suspicious-userlogout' => 'O seu pedido para sair foi negado porque parece ter sido enviado por um browser danificado ou por um proxy com cache.',
+'createacct-another-realname-tip' => 'O fornecimento do nome verdadeiro é opcional.
+Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.',
 
 # Email sending
 'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
@@ -839,7 +888,7 @@ Para prosseguir, será necessário definir uma nova palavra-chave.',
 'newpassword' => 'Palavra-chave nova:',
 'retypenew' => 'Repita a palavra-chave nova:',
 'resetpass_submit' => 'Definir palavra-chave e entrar',
-'resetpass_success' => 'A sua palavra-chave foi alterada! Autenticação em curso...',
+'changepassword-success' => 'A sua palavra-chave foi alterada com êxito!',
 'resetpass_forbidden' => 'Não é possível alterar palavras-chave',
 'resetpass-no-info' => 'Precisa estar autenticado para aceder diretamente a esta página.',
 'resetpass-submit-loggedin' => 'Alterar palavra-chave',
@@ -851,10 +900,11 @@ Pode ter já alterado com sucesso a sua palavra-chave ou solicitado uma nova pal
 
 # Special:PasswordReset
 'passwordreset' => 'Repor palavra-chave',
-'passwordreset-text' => 'Preencha este formulário para repor a sua palavra-passe.',
+'passwordreset-text-one' => 'Preencha este formulário para repor a sua palavra-passe.',
+'passwordreset-text-many' => '{{PLURAL:$1|Preencha um dos campos para redefinir sua senha.}}',
 'passwordreset-legend' => 'Reiniciar a palavra-chave',
 'passwordreset-disabled' => 'O reinício da palavra-chave foi impossibilitado nesta wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
+'passwordreset-emaildisabled' => 'Recursos de e-mail foram desativados neste wiki.',
 'passwordreset-username' => 'Nome de utilizador:',
 'passwordreset-domain' => 'Domínio:',
 'passwordreset-capture' => 'Ver o email resultante?',
@@ -877,7 +927,7 @@ Deve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez
 Palavra-chave temporária: $2',
 'passwordreset-emailsent' => 'Foi enviado um correio eletrónico para recuperação da palavra-passe.',
 'passwordreset-emailsent-capture' => 'Foi enviado um e-mail de recuperação da palavra-passe, que é mostrado abaixo.',
-'passwordreset-emailerror-capture' => 'Foi gerado o lembrete de e-mail mostrado abaixo, contudo falhou o envio para o utilizador: $1',
+'passwordreset-emailerror-capture' => 'Foi gerado o e-mail de reposição de palavra-passe mostrado abaixo, contudo falhou o seu envio para {{GENDER:$2|o utilizador|a utilizadora}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Alterar o endereço de correio electrónico',
@@ -891,6 +941,19 @@ Palavra-chave temporária: $2',
 'changeemail-submit' => 'Alterar correio electrónico',
 'changeemail-cancel' => 'Cancelar',
 
+# Special:ResetTokens
+'resettokens' => 'Redefinir chaves',
+'resettokens-text' => 'Pode redefinir as chaves de acesso a certos dados privados associados à sua conta aqui.
+
+Deve fazê-lo se as divulgou acidentalmente a alguém ou se a sua conta tiver sido comprometida.',
+'resettokens-no-tokens' => 'Não há chaves para redefinir.',
+'resettokens-legend' => 'Redefinir chaves',
+'resettokens-tokens' => 'Chaves:',
+'resettokens-token-label' => '$1 (valor actual: $2)',
+'resettokens-watchlist-token' => "Chave para o ''feed'' Atom/RSS de [[Special:Watchlist|mudanças às páginas vigiadas]]",
+'resettokens-done' => 'As chaves foram redefinidas.',
+'resettokens-resetbutton' => 'Redefinir chaves selecionadas',
+
 # Edit page toolbar
 'bold_sample' => 'Texto a negrito',
 'bold_tip' => 'Texto a negrito',
@@ -1099,12 +1162,15 @@ Não foi dada nenhuma explicação.',
 Ela parece ter sido eliminada.',
 'edit-conflict' => 'Conflito de edição.',
 'edit-no-change' => 'A sua edição foi ignorada, uma vez que o texto não sofreu alterações.',
+'postedit-confirmation' => 'A sua edição foi gravada.',
 'edit-already-exists' => 'Não foi possível criar uma página nova.
 Ela já existia.',
 'defaultmessagetext' => 'Texto da mensagem padrão',
 'content-failed-to-parse' => 'Falha ao analisar conteúdo $2 para modelo $1:$3',
 'invalid-content-data' => 'Dados de conteúdo inválidos',
 'content-not-allowed-here' => 'Conteúdo do tipo "$1" não é permitido na página [[$2]]',
+'editwarning-warning' => 'Sair desta página fará com que você perca quaisquer alterações feitas por você.
+Se você se autenticou, pode desabilitar este aviso na seção "Edição" das suas preferências.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -1140,6 +1206,7 @@ Depois grave as alterações, para finalizar e desfazer a edição.',
 'undo-failure' => 'Não foi possível desfazer a edição por conflito com alterações intermédias.',
 'undo-norev' => 'Não foi possível desfazer a edição porque ela não existe ou foi apagada.',
 'undo-summary' => 'Desfeita a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussão]])',
+'undo-summary-username-hidden' => 'Desfazer a revisão  $1  por um usuário oculto',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Não é possível criar uma conta',
@@ -1324,6 +1391,7 @@ Note que, se usar os links de navegação, os botões de opção voltarão aos v
 'compareselectedversions' => 'Comparar as versões selecionadas',
 'showhideselectedversions' => 'Mostrar/ocultar versões selecionadas',
 'editundo' => 'desfazer',
+'diff-empty' => '(Sem diferenças)',
 'diff-multi' => '({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de {{PLURAL:$2|um utilizador|$2 utilizadores}} {{PLURAL:$1|não apresentada|não apresentadas}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de mais de {{PLURAL:$2|um utilizador|$2 utilizadores}} não {{PLURAL:$1|apresentada|apresentadas}})',
 'difference-missing-revision' => '{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.
@@ -1351,7 +1419,6 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Opções de pesquisa',
 'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" nesta wiki'''",
 'searchmenu-new' => "'''Crie a página \"[[:\$1]]\" nesta wiki!'''",
-'searchhelp-url' => 'Help:Conteúdos',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navegar as páginas com este prefixo]]',
 'searchprofile-articles' => 'Páginas de conteúdo',
 'searchprofile-project' => 'Páginas de ajuda e de projeto',
@@ -1395,15 +1462,7 @@ Tente usar o prefixo ''all:'' para pesquisar todo o conteúdo (incluindo página
 'searchdisabled' => 'Foi impossibilitada a realização de pesquisas na {{SITENAME}}.
 Entretanto, pode realizar pesquisas através do Google.
 Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode estar desatualizada.',
-
-# Quickbar
-'qbsettings' => 'Barra Rápida',
-'qbsettings-none' => 'Nenhuma',
-'qbsettings-fixedleft' => 'Fixa à esquerda',
-'qbsettings-fixedright' => 'Fixa à direita',
-'qbsettings-floatingleft' => 'Flutuante à esquerda',
-'qbsettings-floatingright' => 'Flutuante à direita',
-'qbsettings-directionality' => 'Fixa, conforme a direccionalidade da escrita na sua língua',
+'search-error' => 'Um erro ocorreu enquanto se efectuava a busca: $1',
 
 # Preferences page
 'preferences' => 'Preferências',
@@ -1437,7 +1496,6 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
 'resetprefs' => 'Eliminar as alterações que não foram gravadas',
 'restoreprefs' => 'Repor todas as configurações padrão (em todas as secções)',
 'prefs-editing' => 'Edição',
-'prefs-edit-boxsize' => 'Dimensões da janela de edição.',
 'rows' => 'Linhas:',
 'columns' => 'Colunas:',
 'searchresultshead' => 'Pesquisar',
@@ -1448,9 +1506,9 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
 'recentchangesdays-max' => 'Máximo: $1 {{PLURAL:$1|dia|dias}}',
 'recentchangescount' => 'Número de edições a apresentar por omissão:',
 'prefs-help-recentchangescount' => 'Inclui mudanças recentes, histórico de páginas e registos.',
-'prefs-help-watchlist-token' => "Preencher este campo com uma chave secreta gera um ''feed'' RSS para a sua lista de páginas vigiadas.
-Qualquer pessoa que conheça esta chave será capaz de ler a sua lista de páginas vigiadas, por isso escolha um valor seguro.
-Eis um valor gerado aleatoriamente, que pode usar: $1",
+'prefs-help-watchlist-token2' => "Esta é a chave secreta para o ''feed'' RSS da sua lista de páginas vigiadas.
+Qualquer pessoa que conheça a chave será capaz de ler a sua lista de páginas vigiadas, por isso não a divulgue.
+[[Special:ResetTokens|Clique aqui para redefini-la]].",
 'savedprefs' => 'As suas preferências foram gravadas.',
 'timezonelegend' => 'Fuso horário:',
 'localtime' => 'Hora local:',
@@ -1482,7 +1540,6 @@ Eis um valor gerado aleatoriamente, que pode usar: $1",
 As suas preferências serão modificadas para os valores predefinidos do site.
 Esta operação não pode ser desfeita.',
 'prefs-emailconfirm-label' => 'Confirmação do endereço:',
-'prefs-textboxsize' => 'Tamanho da janela de edição',
 'youremail' => 'Correio electrónico:',
 'username' => 'Nome de {{GENDER:$1|utilizador|utilizadora}}:',
 'uid' => 'Identificação de {{GENDER:$1|utilizador|utilizadora}}:',
@@ -1516,6 +1573,7 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu
 'prefs-dateformat' => 'Formato de data',
 'prefs-timeoffset' => 'Desvio horário',
 'prefs-advancedediting' => 'Opções gerais',
+'prefs-preview' => 'Antevisão',
 'prefs-advancedrc' => 'Opções avançadas',
 'prefs-advancedrendering' => 'Opções avançadas',
 'prefs-advancedsearchoptions' => 'Opções avançadas',
@@ -1523,6 +1581,7 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu
 'prefs-displayrc' => 'Opções de visionamento',
 'prefs-displaysearchoptions' => 'Opções de apresentação',
 'prefs-displaywatchlist' => 'Opções de apresentação',
+'prefs-tokenwatchlist' => 'Chave',
 'prefs-diffs' => 'Diferenças',
 
 # User preference: email validation using jQuery
@@ -1550,6 +1609,8 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu
 'userrights-notallowed' => 'A sua conta não tem permissão para adicionar ou remover privilégios a utilizadores.',
 'userrights-changeable-col' => 'Grupos que pode alterar',
 'userrights-unchangeable-col' => 'Grupos que não pode alterar',
+'userrights-conflict' => 'Conflito com os privilégios dos utilizadores! Por favor, aplique as suas mudanças novamente.',
+'userrights-removed-self' => 'Você removeu com sucesso os seus privilégios. Como resultado disso, já não consegue aceder a esta página.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1615,11 +1676,13 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu
 'right-proxyunbannable' => 'Contornar bloqueios automáticos de proxies',
 'right-unblockself' => 'Desbloquearem-se a si próprios',
 'right-protect' => 'Mudar níveis de proteção e editar páginas protegidas em cascata',
-'right-editprotected' => 'Editar páginas protegidas (sem protecção em cascata)',
+'right-editprotected' => 'Editar páginas protegidas como "{{int:protect-level-sysop}}"',
 'right-editinterface' => 'Editar a interface de utilizador',
 'right-editusercssjs' => 'Editar os ficheiros CSS e JS de outros utilizadores',
 'right-editusercss' => 'Editar os ficheiros CSS de outros utilizadores',
 'right-edituserjs' => 'Editar os ficheiros JS de outros utilizadores',
+'right-editmyusercss' => 'Editar os seus próprios ficheiros CSS de utilizador',
+'right-editmyuserjs' => 'Editar os seus próprios ficheiros JavaScript de utilizador',
 'right-rollback' => 'Reverter rapidamente as edições do último utilizador que editou uma página em particular',
 'right-markbotedits' => 'Marcar edições revertidas como edições de bot',
 'right-noratelimit' => 'Não ser afetado pelos limites de velocidade de operação',
@@ -1687,6 +1750,7 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu
 'recentchanges' => 'Mudanças recentes',
 'recentchanges-legend' => 'Opções das mudanças recentes',
 'recentchanges-summary' => 'Acompanhe nesta página as mudanças mais recentes da wiki.',
+'recentchanges-noresult' => 'Nenhuma alteração correspondente a esses critérios foi realizada durante o período selecionado.',
 'recentchanges-feed-description' => "Acompanhe neste ''feed'' as mudanças mais recentes da wiki.",
 'recentchanges-label-newpage' => 'Esta edição criou uma página nova',
 'recentchanges-label-minor' => 'Esta é uma edição menor',
@@ -1723,7 +1787,6 @@ Se optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu
 'recentchangeslinked-feed' => 'Alterações relacionadas',
 'recentchangeslinked-toolbox' => 'Alterações relacionadas',
 'recentchangeslinked-title' => 'Alterações relacionadas com "$1"',
-'recentchangeslinked-noresult' => 'Nenhuma mudança nas páginas relacionadas durante o período.',
 'recentchangeslinked-summary' => "Lista das mudanças recentes a todas as páginas para as quais a página fornecida contém links (ou de todas as que pertencem à categoria fornecida).
 As suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
 'recentchangeslinked-page' => 'Nome da página:',
@@ -1735,7 +1798,7 @@ As suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
 'reuploaddesc' => 'Cancelar o envio e voltar ao formulário de carregamento',
 'upload-tryagain' => 'Submeta a descrição do ficheiro modificado',
 'uploadnologin' => 'Não autenticado',
-'uploadnologintext' => 'Tem de estar [[Special:UserLogin|autenticado]] para enviar ficheiros.',
+'uploadnologintext' => 'Tem de $1 para enviar ficheiros.',
 'upload_directory_missing' => 'O diretório de carregamento de ficheiros ($1) não existe e o servidor de internet não conseguiu criá-lo.',
 'upload_directory_read_only' => 'O servidor de internet não possui permissão de escrita no diretório de carregamento de ficheiros ($1).',
 'uploaderror' => 'Erro ao carregar',
@@ -1971,7 +2034,6 @@ Para optimizar a segurança, o img_auth.php está impossibilitado de executar.',
 'http-read-error' => 'Erro de leitura HTTP.',
 'http-timed-out' => 'O pedido HTTP expirou.',
 'http-curl-error' => 'Ocorreu um erro ao aceder à URL: $1',
-'http-host-unreachable' => 'Não foi possível aceder à URL',
 'http-bad-status' => 'Ocorreu um problema durante o pedido HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2000,6 +2062,8 @@ Verifique se o endereço está correto e o site disponível, por favor.',
 'listfiles_size' => 'Tamanho',
 'listfiles_description' => 'Descrição',
 'listfiles_count' => 'Versões',
+'listfiles-show-all' => 'Incluir versões antigas de imagens',
+'listfiles-latestversion-no' => 'Não',
 
 # File description page
 'file-anchor-link' => 'Ficheiro',
@@ -2094,6 +2158,10 @@ Talvez queira editar a descrição na [$2 página original de descrição do fic
 'randompage' => 'Página aleatória',
 'randompage-nopages' => 'Não há páginas {{PLURAL:$2|no seguinte espaço nominal|nos seguintes espaços nominais}}: $1.',
 
+# Random page in category
+'randomincategory-nopages' => 'Não há páginas na categoria [[:Category:$1|$1]].',
+'randomincategory-selectcategory-submit' => 'Ir',
+
 # Random redirect
 'randomredirect' => 'Redirecionamento aleatório',
 'randomredirect-nopages' => 'Não há redirecionamentos no espaço nominal "$1".',
@@ -2119,17 +2187,13 @@ Talvez queira editar a descrição na [$2 página original de descrição do fic
 'statistics-users-active-desc' => 'Utilizadores que efectuaram uma operação {{PLURAL:$1|no último dia|nos últimos $1 dias}}',
 'statistics-mostpopular' => 'Páginas mais vistas',
 
-'disambiguations' => 'Páginas com ligações para páginas de desambiguação',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "As páginas abaixo contêm pelo menos um link para uma '''página de desambiguação'''.
-Estes links deviam ser desambiguados, apontando-os para uma página mais apropriada.<br />
-Considera-se que uma página é de desambiguação se nela for utilizada uma predefinição que esteja definida em [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Páginas com uma propriedade',
 'pageswithprop-legend' => 'Páginas com uma propriedade',
 'pageswithprop-text' => 'Esta página lista páginas que usam uma propriedade em particular.',
 'pageswithprop-prop' => 'Nome da propriedade:',
 'pageswithprop-submit' => 'Avançar',
+'pageswithprop-prophidden-long' => 'foi ocultado o valor da propriedade por ser um texto muito longo ($1 kilobytes)',
+'pageswithprop-prophidden-binary' => 'foi ocultado o valor da propriedade por ser binário ($1 kilobytes)',
 
 'doubleredirects' => 'Redirecionamentos duplos',
 'doubleredirectstext' => 'Esta página lista todas as páginas que redirecionam para outras páginas de redirecionamento.
@@ -2188,6 +2252,7 @@ Agora redirecciona para [[$2]].',
 'mostrevisions' => 'Páginas com mais revisões',
 'prefixindex' => 'Todas as páginas iniciadas por',
 'prefixindex-namespace' => 'Todas as páginas com prefixo (espaço nominal $1)',
+'prefixindex-strip' => 'Remover prefixo',
 'shortpages' => 'Páginas curtas',
 'longpages' => 'Páginas longas',
 'deadendpages' => 'Páginas sem saída',
@@ -2380,10 +2445,9 @@ Modificações futuras desta página e da respetiva página de discussão serão
 'unwatchthispage' => 'Parar de vigiar esta página',
 'notanarticle' => 'Não é uma página de conteúdo',
 'notvisiblerev' => 'Edição eliminada',
-'watchnochange' => 'Nenhuma das páginas vigiadas foi editada no período apresentado.',
 'watchlist-details' => '{{PLURAL:$1|Existe $1 página|Existem $1 páginas}} na sua lista de páginas vigiadas, excluindo páginas de discussão.',
-'wlheader-enotif' => '* A notificação por correio electrónico está activada.',
-'wlheader-showupdated' => "* As páginas modificadas desde a última vez que as visitou aparecem destacadas a '''negrito'''",
+'wlheader-enotif' => 'A notificação por correio electrónico está activa.',
+'wlheader-showupdated' => "As páginas modificadas desde a última vez que as visitou aparecem destacadas a '''negrito'''.",
 'watchmethod-recent' => 'a procurar páginas vigiadas nas mudanças recentes',
 'watchmethod-list' => 'a procurar mudanças recentes nas páginas vigiadas',
 'watchlistcontains' => 'A sua lista de páginas vigiadas contém $1 {{PLURAL:$1|página|páginas}}.',
@@ -2634,7 +2698,7 @@ $1',
 'contributions' => 'Contribuições {{GENDER:$1|do utilizador|da utilizadora}}',
 'contributions-title' => 'Contribuições {{GENDER:$1|do utilizador|da utilizadora}} $1',
 'mycontris' => 'Contribuições',
-'contribsub2' => 'Para $1 ($2)',
+'contribsub2' => 'Para {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Não foram encontradas alterações com este critério.',
 'uctop' => '(atual)',
 'month' => 'Até o mês:',
@@ -2790,14 +2854,12 @@ Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloque
 'ipb_blocked_as_range' => 'Erro: O IP $1 não se encontra bloqueado de forma direta e não pode ser desbloqueado deste modo. No entanto, está bloqueado como parte da gama $2, a qual pode ser desbloqueada.',
 'ip_range_invalid' => 'Gama de IPs inválida.',
 'ip_range_toolarge' => 'Não são permitidas gamas de IPs maiores do que /$1.',
-'blockme' => 'Bloquear-me',
 'proxyblocker' => 'Bloqueador de proxies',
-'proxyblocker-disabled' => 'Esta função foi impossibilitada.',
 'proxyblockreason' => "O seu endereço IP foi bloqueado por ser um ''proxy'' público.
 Contacte o seu fornecedor de internet ou o serviço de apoio técnico e informe-os deste grave problema de segurança, por favor.",
-'proxyblocksuccess' => 'Feito.',
 'sorbsreason' => "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela {{SITENAME}}.",
 'sorbs_create_account_reason' => "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela {{SITENAME}}. Não pode criar uma conta",
+'xffblockreason' => 'Um endereço IP presente no cabeçalho X-Forwarded-For, seja seu ou de um servidor de proxy que estiver a usar, foi bloqueado. A razão do bloqueio original foi: $1',
 'cant-block-while-blocked' => 'Não pode bloquear outros utilizadores enquanto estiver bloqueado.',
 'cant-see-hidden-user' => "O utilizador que está tentando bloquear já está bloqueado e oculto.
 Como não tem o privilégio para ocultar utilizadores ''(hideuser)'', não pode ver ou editar o bloqueio deste utilizador.",
@@ -2961,6 +3023,8 @@ Se deseja colaborar na localização genérica do MediaWiki, visite [//www.media
 'thumbnail-more' => 'Ampliar',
 'filemissing' => 'Ficheiro não encontrado',
 'thumbnail_error' => 'Erro ao criar miniatura: $1',
+'thumbnail_error_remote' => 'Mensagem de erro de $1 :
+$2',
 'djvu_page_error' => 'página DjVu inacessível',
 'djvu_no_xml' => 'Não foi possível aceder ao XML para o ficheiro DjVU',
 'thumbnail-temp-create' => 'Não foi possível criar o ficheiro temporário da miniatura',
@@ -3114,27 +3178,16 @@ Permite colocar uma justificação no resumo da edição.',
 
 # Stylesheets
 'common.css' => '/* Código CSS colocado aqui será aplicado a todos os temas */',
-'standard.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Clássico */',
-'nostalgia.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Nostalgia */',
 'cologneblue.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Azul colonial */',
 'monobook.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Monobook */',
-'myskin.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema MySkin */',
-'chick.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Chique */',
-'simple.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Simples */',
 'modern.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Moderno */',
 'vector.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Vector */',
 'print.css' => '/* Código CSS colocado aqui afectará as impressões */',
-'handheld.css' => '/* Código CSS colocado aqui afectará dispositivos móveis baseados no tema configurado em $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Código Javascript colocado aqui será carregado para todos os utilizadores em cada carregamento de página */',
-'standard.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Clássico */',
-'nostalgia.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Nostalgia */',
 'cologneblue.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Azul colonial */',
 'monobook.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Monobook */',
-'myskin.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema MySkin */',
-'chick.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Chick */',
-'simple.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Simples */',
 'modern.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Moderno */',
 'vector.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Vector */',
 
@@ -3210,13 +3263,8 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con
 'pageinfo-category-files' => 'Número de ficheiros',
 
 # Skin names
-'skinname-standard' => 'Clássico',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Azul colonial',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chique',
-'skinname-simple' => 'Simples',
 'skinname-modern' => 'Moderno',
 'skinname-vector' => 'Vector',
 
@@ -3295,11 +3343,25 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
 'minutes' => '{{PLURAL:$1|um minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|uma hora|$1 horas}}',
 'days' => '{{PLURAL:$1|um dia|$1 dias}}',
+'weeks' => '{{PLURAL:$1|$1 semana|$1 semanas}}',
 'months' => '{{PLURAL:$1|1 mês|$1 meses}}',
 'years' => '{{PLURAL:$1|1 ano|$1 anos}}',
 'ago' => '$1 atrás',
 'just-now' => 'agora mesmo',
 
+# Human-readable timestamps
+'hours-ago' => 'há $1 {{PLURAL:$1|hora|horas}}',
+'minutes-ago' => 'há $1 {{PLURAL:$1|minuto|minutos}}',
+'seconds-ago' => 'há $1 {{PLURAL:$1|segundo|segundos}}',
+'monday-at' => 'Segunda-feira às $1',
+'tuesday-at' => 'Terça-feira às $1',
+'wednesday-at' => 'Quarta-feira às $1',
+'thursday-at' => 'Quinta-feira às $1',
+'friday-at' => 'Sexta-feira às $1',
+'saturday-at' => 'Sábado às $1',
+'sunday-at' => 'Domingo às $1',
+'yesterday-at' => 'Ontem às $1',
+
 # Bad image list
 'bad_image_list' => 'O formato é o seguinte:
 
@@ -3328,7 +3390,7 @@ Caso o ficheiro tenha sido modificado a partir do seu estado original, alguns de
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Largura',
 'exif-imagelength' => 'Altura',
 'exif-bitspersample' => 'Bits por componente',
@@ -3506,7 +3568,7 @@ Caso o ficheiro tenha sido modificado a partir do seu estado original, alguns de
 'exif-originalimageheight' => 'Altura da imagem antes de ser cortada',
 'exif-originalimagewidth' => 'Largura da imagem antes de ser cortada',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Descomprimido',
 'exif-compression-2' => 'CCITT Grupo 3 1-D Codificação Unidimensional Huffman Modificado e Run Length Encoding',
 'exif-compression-3' => 'CCITT Grupo 3 codificação de fax',
@@ -3906,7 +3968,6 @@ Também pode [[Special:EditWatchlist|editar a lista da maneira convencional]].',
 'version-other' => 'Diversos',
 'version-mediahandlers' => 'Leitura e tratamento de multimédia',
 'version-hooks' => 'Hooks',
-'version-extension-functions' => 'Funções de extensão',
 'version-parser-extensiontags' => 'Extensões do analisador sintático',
 'version-parser-function-hooks' => "''Hooks'' das funções do analisador sintático",
 'version-hook-name' => 'Nome do hook',
@@ -3928,12 +3989,17 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'version-entrypoints-header-entrypoint' => 'Ponto de entrada',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Endereço de ficheiro',
-'filepath-page' => 'Ficheiro:',
-'filepath-submit' => 'Ir',
-'filepath-summary' => 'Esta página especial retorna o endereço completo de um ficheiro.
-Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de outro tipo serão abertos pelo browser diretamente no programa que lhes está associado no seu computador.',
+# Special:Redirect
+'redirect' => 'Redirecionar pelo ID do ficheiro, utilizador ou revisão',
+'redirect-legend' => 'Redirecionar para um ficheiro ou página',
+'redirect-summary' => 'Esta página especial redireciona a um ficheiro (dado o nome do ficheiro), a uma página (dado um ID de revisão) ou a uma página de utilizador (dado o ID do utilizador).',
+'redirect-submit' => 'Ir',
+'redirect-lookup' => 'Pesquisa:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'Identificador do utilizador',
+'redirect-revision' => 'Revisão da página',
+'redirect-file' => 'Nome do ficheiro',
+'redirect-not-exists' => 'Valor não encontrado',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ficheiros duplicados',
@@ -3982,11 +4048,13 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 'tags' => 'Etiquetas de modificação válidas',
 'tag-filter' => 'Filtro de [[Special:Tags|etiquetas]]:',
 'tag-filter-submit' => 'Filtrar',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)',
 'tags-title' => 'Etiquetas',
 'tags-intro' => 'Esta página lista as etiquetas com que o software poderá marcar uma edição, e o seu significado.',
 'tags-tag' => 'Nome da etiqueta',
 'tags-display-header' => 'Aparência nas listas de modificações',
 'tags-description-header' => 'Descrição completa do significado',
+'tags-active-header' => 'Ativa?',
 'tags-hitcount-header' => 'Modificações etiquetadas',
 'tags-edit' => 'editar',
 'tags-hitcount' => '$1 {{PLURAL:$1|modificação|modificações}}',
@@ -4023,6 +4091,9 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 'htmlform-submit' => 'Enviar',
 'htmlform-reset' => 'Desfazer alterações',
 'htmlform-selectorother-other' => 'Outros',
+'htmlform-no' => 'Não',
+'htmlform-yes' => 'Sim',
+'htmlform-chosen-placeholder' => 'Selecione uma opção',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 com suporte de pesquisa de texto completo',
@@ -4140,4 +4211,10 @@ Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário se
 # Image rotation
 'rotate-comment' => 'Imagem rodada em $1 {{PLURAL:$1|grau|graus}} no sentido dos ponteiros do relógio',
 
+# Limit report
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Tamanho dos argumentos da predefinição',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+
 );
diff --git a/languages/messages/MessagesPt_br.php b/languages/messages/MessagesPt_br.php
index 776227fa..d60517ae 100644
--- a/languages/messages/MessagesPt_br.php
+++ b/languages/messages/MessagesPt_br.php
@@ -45,9 +45,11 @@
  * @author Luckas Blade
  * @author Malafaya
  * @author ManoDbo
+ * @author Matheus Sousa L.T
  * @author McDutchie
  * @author MetalBrasil
  * @author MisterSanderson
+ * @author Nemo bis
  * @author OTAVIO1981
  * @author Opraco
  * @author Pedroca cerebral
@@ -55,6 +57,7 @@
  * @author Rafael Vargas
  * @author Raylton P. Sousa
  * @author Rodrigo Calanca Nishino
+ * @author Rodrigo Padula
  * @author Sir Lestaty de Lioncourt
  * @author Teles
  * @author TheGabrielZaum
@@ -353,9 +356,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostrar o número de usuários que estão vigiando',
 'tog-oldsig' => 'Assinatura existente:',
 'tog-fancysig' => 'Tratar assinatura como wikitexto (sem link automático)',
-'tog-externaleditor' => 'Utilizar editor externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-externaldiff' => 'Utilizar comparador de versões externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-showjumplinks' => 'Ativar links de acessibilidade "ir para"',
 'tog-uselivepreview' => 'Utilizar pré-visualização em tempo real (experimental)',
 'tog-forceeditsummary' => 'Avisar-me ao introduzir um sumário de edição vazio',
 'tog-watchlisthideown' => 'Ocultar as minhas edições da lista de páginas vigiadas',
@@ -369,6 +369,8 @@ $messages = array(
 'tog-showhiddencats' => 'Exibir categorias ocultas',
 'tog-noconvertlink' => 'Desabilitar conversão de títulos de links',
 'tog-norollbackdiff' => 'Omitir diferenças após desfazer edições em bloco',
+'tog-useeditwarning' => 'Avisar-me quando eu deixar uma janela de edição sem ter salvo as alterações',
+'tog-prefershttps' => 'Usar sempre uma conexão segura quando estiver conectado',
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Nunca',
@@ -432,6 +434,18 @@ $messages = array(
 'oct' => 'out',
 'nov' => 'nov',
 'dec' => 'dez',
+'january-date' => '$1 de janeiro',
+'february-date' => '$1 de fevereiro',
+'march-date' => '$1 de março',
+'april-date' => '$1 de abril',
+'may-date' => '$1 de maio',
+'june-date' => '$1 de junho',
+'july-date' => '$1 de julho',
+'august-date' => '$1 de agosto',
+'september-date' => '$1 de setembro',
+'october-date' => '$1 de outubro',
+'november-date' => '$1 de novembro',
+'december-date' => '$1 de dezembro',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
@@ -513,6 +527,7 @@ $messages = array(
 'create-this-page' => 'Iniciar esta página',
 'delete' => 'Eliminar',
 'deletethispage' => 'Eliminar esta página',
+'undeletethispage' => 'Restaure esta página',
 'undelete_short' => 'Restaurar {{PLURAL:$1|uma edição|$1 edições}}',
 'viewdeleted_short' => 'Ver {{PLURAL:$1|uma edição eliminada|$1 edições eliminadas}}',
 'protect' => 'Proteger',
@@ -556,7 +571,7 @@ $1',
 'pool-queuefull' => 'A fila de processos está cheia',
 'pool-errorunknown' => 'Erro desconhecido',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Sobre {{SITENAME}}',
 'aboutpage' => 'Project:Sobre',
 'copyright' => 'Conteúdo disponível sob $1, salvo indicação em contrário.',
@@ -566,7 +581,6 @@ $1',
 'disclaimers' => 'Exoneração de responsabilidade',
 'disclaimerpage' => 'Project:Aviso_geral',
 'edithelp' => 'Ajuda de edição',
-'edithelppage' => 'Help:Editar',
 'helppage' => 'Help:Conteúdos',
 'mainpage' => 'Página principal',
 'mainpage-description' => 'Página principal',
@@ -644,17 +658,12 @@ Uma lista de páginas especiais válidas poderá ser encontrada em [[Special:Spe
 # General errors
 'error' => 'Erro',
 'databaseerror' => 'Erro no banco de dados',
-'dberrortext' => 'Ocorreu um erro de sintaxe na busca no banco de dados.
-Isto pode indicar um bug no software.
-A última tentativa de busca no banco de dados foi:
-<blockquote><code>$1</code></blockquote>
-na função "<code>$2</code>".
-O banco de dados retornou o erro "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Ocorreu um erro de sintaxe de busca no banco de dados.
-A última tentativa de busca no banco de dados foi:
-"$1"
-na função "$2".
-O banco de dados retornou o erro "$3: $4".',
+'databaseerror-text' => 'Houve um erro na consulta ao banco de dados.
+Isto pode indicar um bug no software.',
+'databaseerror-textcl' => 'Houve um erro na consulta ao banco de dados.',
+'databaseerror-query' => 'Consulta: $1',
+'databaseerror-function' => 'Função: $1',
+'databaseerror-error' => 'Erro: $1',
 'laggedslavemode' => 'Aviso: a página poderá não conter atualizações recentes.',
 'readonly' => 'Banco de dados disponível no modo "somente leitura"',
 'enterlockreason' => 'Entre com um motivo para trancá-lo, incluindo uma estimativa de quando poderá novamente ser destrancado',
@@ -688,6 +697,7 @@ Anote a URL e reporte o ocorrido a um [[Special:ListUsers/sysop|administrador]].
 'cannotdelete-title' => 'Não é possível excluir a página " $1 "',
 'delete-hook-aborted' => 'A eliminação foi cancelada por um "hook".
 Não foi dada nenhuma explicação.',
+'no-null-revision' => 'Não foi possível criar nova revisão nula para a página "$1"',
 'badtitle' => 'Título inválido',
 'badtitletext' => 'O título de página solicitado era inválido, vazio, ou um link interlínguas ou interwikis incorreto.
 Talvez contenha um ou mais caracteres que não podem ser usados em títulos.',
@@ -711,12 +721,15 @@ Para adicionar ou alterar traduções em todos os wikis, utilize o [//translatew
 'editinginterface' => "'''Aviso:''' Você se encontra prestes a editar uma página que é utilizada para fornecer texto de interface ao software.
 Alterações nesta página irão afetar a aparência da interface de usuário para outros usuários deste wiki.
 Para alterar ou adicionar traduções, considere utilizar a [//translatewiki.net/wiki/Main_Page?setlang=pt-br translatewiki.net], um projeto destinado para a tradução do MediaWiki.",
-'sqlhidden' => '(Consulta SQL em segundo-plano)',
 'cascadeprotected' => 'Esta página foi protegida contra edições por estar incluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de "proteção progressiva" ativada):
 $2',
 'namespaceprotected' => "Você não possui permissão para editar páginas no espaço nominal '''$1'''.",
 'customcssprotected' => 'Você não tem permissão para editar esta página CSS, porque ele contém configurações pessoais de outro usuário.',
 'customjsprotected' => 'Você não tem permissão para editar esta página de JavaScript, porque ele contém configurações pessoais de outro usuário.',
+'mycustomcssprotected' => 'Você não tem permissão para editar esta página CSS',
+'mycustomjsprotected' => 'Você não tem permissão para editar esta página JavaScript',
+'myprivateinfoprotected' => 'Você não tem permissão para editar suas informações privadas.',
+'mypreferencesprotected' => 'Você não tem permissão para editar suas preferências.',
 'ns-specialprotected' => 'Não é possível editar páginas especiais',
 'titleprotected' => "Este título foi protegido, para que não seja criado.
 Quem o protegeu foi [[User:$1|$1]], com a justificativa: ''$2''.",
@@ -741,10 +754,19 @@ Note que algumas páginas podem continuar sendo exibidas como se você ainda est
 'welcomecreation-msg' => 'A sua conta foi criada.
 Não se esqueça de personalizar as suas [[Special:Preferences|preferências no wiki {{SITENAME}}]].',
 'yourname' => 'Nome de usuário:',
+'userlogin-yourname' => 'Nome de usuário',
+'userlogin-yourname-ph' => 'Escreva seu nome de usuário',
+'createacct-another-username-ph' => 'Forneça o nome de usuário',
 'yourpassword' => 'Senha:',
+'userlogin-yourpassword' => 'Senha',
+'userlogin-yourpassword-ph' => 'Digite sua senha',
+'createacct-yourpassword-ph' => 'Digite uma senha',
 'yourpasswordagain' => 'Redigite sua senha',
+'createacct-yourpasswordagain' => 'Confirmar senha',
+'createacct-yourpasswordagain-ph' => 'Digite a senha novamente',
 'remembermypassword' => 'Lembrar meu login neste navegador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
-'securelogin-stick-https' => 'Permanecer conectado ao HTTPS após a autenticação',
+'userlogin-remembermypassword' => 'Mantenha-me conectado',
+'userlogin-signwithsecure' => 'Use a conexão segura',
 'yourdomainname' => 'Seu domínio:',
 'password-change-forbidden' => 'Você não pode alterar senhas nessa wiki.',
 'externaldberror' => 'Ocorreu ou um erro no banco de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.',
@@ -756,18 +778,43 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências no
 'logout' => 'Sair',
 'userlogout' => 'Sair',
 'notloggedin' => 'Não autenticado',
+'userlogin-noaccount' => 'Não possui uma conta?',
+'userlogin-joinproject' => 'Junte-se ao projeto {{SITENAME}}',
 'nologin' => 'Não possui uma conta? $1.',
 'nologinlink' => 'Criar uma conta',
 'createaccount' => 'Criar conta',
 'gotaccount' => "Já possui uma conta? '''$1'''.",
 'gotaccountlink' => 'Autenticar-se',
 'userlogin-resetlink' => 'Esqueceu-se do seu nome de usuário ou da senha?',
+'userlogin-resetpassword-link' => 'Troque sua senha',
+'helplogin-url' => 'Help:Iniciar sessão',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda para iniciar sessão]]',
+'userlogin-loggedin' => 'Você já está conectado como {{GENDER:$1|$1}}.
+Use o formulário abaixo para iniciar sessão como outro usuário.',
+'createacct-join' => 'Insira suas informações abaixo.',
+'createacct-another-join' => 'Preeencha as informações para a nova conta',
+'createacct-emailrequired' => 'Endereço de e-mail',
+'createacct-emailoptional' => 'Endereço de e-mail (opcional)',
+'createacct-email-ph' => 'Confirme seu endereço de e-mail',
+'createacct-another-email-ph' => 'Forneça o endereço de e-mail',
 'createaccountmail' => 'Usar uma senha aleatória e temporária que será enviada ao endereço de e-mail especificado a seguir',
+'createacct-realname' => 'Nome real (opcional)',
 'createaccountreason' => 'Motivo:',
+'createacct-reason' => 'Motivo',
+'createacct-reason-ph' => 'Por que você está criando outra conta',
+'createacct-captcha' => 'Verificação de segurança',
+'createacct-imgcaptcha-ph' => 'Digite o texto acima',
+'createacct-submit' => 'Crie sua conta',
+'createacct-another-submit' => 'Criar outra conta',
+'createacct-benefit-heading' => '{{SITENAME}} é feita por pessoas como você.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edição|edições}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|página|páginas}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contribuidor|contribuidores}} recentes',
 'badretype' => 'As senhas que você digitou não são iguais.',
 'userexists' => 'O nome de usuário fornecido já está em uso.
 Escolha um nome diferente.',
 'loginerror' => 'Erro de autenticação',
+'createacct-error' => 'Erro ao criar a conta',
 'createaccounterror' => 'Não foi possível criar a conta: $1',
 'nocookiesnew' => "A conta do usuário foi criada, mas você não foi autenticado.
 {{SITENAME}} utiliza ''cookies'' para autenticar os usuários.
@@ -824,11 +871,13 @@ Você deve se autenticar e alterar sua senha.
 
 Ignore esta mensagem caso a conta tenha sido criada por engano.',
 'usernamehasherror' => 'Nome de usuário não pode conter o símbolo de cardinal (#).',
-'login-throttled' => 'Você fez tentativas demais de se autenticar com esta conta recentemente.
-Por favor aguarde antes de tentar novamente.',
+'login-throttled' => 'Você recentemente tentou iniciar sessão muitas vezes.
+Por favor aguarde $1 antes de tentar novamente.',
 'login-abort-generic' => 'A sua autenticação não teve êxito - Abortada',
 'loginlanguagelabel' => 'Idioma: $1',
 'suspicious-userlogout' => 'Sua solicitação para sair foi negada porque aparentemente foi enviada por um navegador danificado ou por um servidor proxy com cache.',
+'createacct-another-realname-tip' => 'O nome verdadeiro é opcional.
+Se você optar por fornecê-lo, este nome será utilizado para dar ao usuário a atribuição de seu trabalho.',
 
 # Email sending
 'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
@@ -844,8 +893,7 @@ Por favor aguarde antes de tentar novamente.',
 'newpassword' => 'Nova senha',
 'retypenew' => 'Reintroduza a nova senha',
 'resetpass_submit' => 'Definir senha e entrar',
-'resetpass_success' => 'Sua senha foi alterada com sucesso!
-Conectando-o...',
+'changepassword-success' => 'Sua senha foi alterada com sucesso!',
 'resetpass_forbidden' => 'As senhas não podem ser alteradas',
 'resetpass-no-info' => 'Você precisa estar autenticado para acessar esta página diretamente.',
 'resetpass-submit-loggedin' => 'Alterar senha',
@@ -857,10 +905,11 @@ Você pode já ter alterado com sucesso a sua senha, ou solicitado uma nova senh
 
 # Special:PasswordReset
 'passwordreset' => 'Redefinir senha',
-'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta pelo e-mail.',
+'passwordreset-text-one' => 'Complete este formulário para trocar sua senha.',
+'passwordreset-text-many' => '{{PLURAL:$1|Preencha um dos campos para trocar sua senha.}}',
 'passwordreset-legend' => 'Reiniciar a senha',
 'passwordreset-disabled' => 'Redefinições de senha foram desabilitadas nesta wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
+'passwordreset-emaildisabled' => 'Os recursos de e-mail foram desativados nesta wiki.',
 'passwordreset-username' => 'Nome de usuário:',
 'passwordreset-domain' => 'Domínio:',
 'passwordreset-capture' => 'Ver o e-mail resultante?',
@@ -887,7 +936,7 @@ $2
 Senha temporária: $2',
 'passwordreset-emailsent' => 'Foi enviado um e-mail de lembrete.',
 'passwordreset-emailsent-capture' => 'Foi enviado um e-mail de lembrete, que é mostrado abaixo.',
-'passwordreset-emailerror-capture' => 'Foi gerado o lembrete de e-mail mostrado abaixo, contudo falhou o envio para o usuário: $1',
+'passwordreset-emailerror-capture' => 'Foi gerado um e-mail de recuperação da senha, conforme mostrado abaixo, mas o envio {{GENDER:$2|ao usuário|à usuária}} falhou. $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Alterar o endereço de e-mail',
@@ -901,6 +950,18 @@ Senha temporária: $2',
 'changeemail-submit' => 'Alterar e-mail',
 'changeemail-cancel' => 'Cancelar',
 
+# Special:ResetTokens
+'resettokens' => 'Reiniciar os tokens',
+'resettokens-text' => 'Você pode reiniciar os tokens, que permitem o acesso a certos dados privados associados à sua conta, aqui.
+
+Você só deve reiniciá-los se compartilhou-os com alguém ou se a sua conta foi comprometida.',
+'resettokens-no-tokens' => 'Não existem tokens para reiniciar.',
+'resettokens-legend' => 'Reiniciar tokens',
+'resettokens-token-label' => '$1 (valor atual: $2)',
+'resettokens-watchlist-token' => 'Tokens para o feed da web (Atom/RSS) das [[Special:Watchlist|mudanças de páginas em sua lista de páginas vigiadas]]',
+'resettokens-done' => 'Tokens reiniciados.',
+'resettokens-resetbutton' => 'Reiniciar tokens selecionados',
+
 # Edit page toolbar
 'bold_sample' => 'Texto em negrito',
 'bold_tip' => 'Texto em negrito',
@@ -1101,12 +1162,15 @@ Ele não deu nenhuma explicação.",
 Ela parece ter sido eliminada.',
 'edit-conflict' => 'Conflito de edição.',
 'edit-no-change' => 'A sua edição foi ignorada, uma vez que o texto não sofreu alterações.',
+'postedit-confirmation' => 'Sua edição foi salva',
 'edit-already-exists' => 'Não foi possível criar uma nova página.
 Ela já existia.',
 'defaultmessagetext' => 'Texto da mensagem padrão',
 'content-failed-to-parse' => 'Falha ao analisar o conteúdo $2 para o modelo $1: $3',
 'invalid-content-data' => 'Dados de conteúdo inválidos',
 'content-not-allowed-here' => 'Conteúdo do tipo "$1" não é permitido na página [[$2]]',
+'editwarning-warning' => 'Abandonar esta página pode fazer com que você perca todas as alterações que fez.
+Se você estiver autenticado, você pode desabilitar este aviso na seção "Edição" de suas preferências.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -1141,6 +1205,7 @@ Estes argumentos foram omitidos.',
 'undo-failure' => 'A edição não pôde ser desfeita devido a alterações intermediárias conflitantes.',
 'undo-norev' => 'A edição não pôde ser desfeita porque não existe ou foi apagada.',
 'undo-summary' => 'Desfeita a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussão]])',
+'undo-summary-username-hidden' => 'Desfazer a revisão $1 de um usuário oculto',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Não é possível criar uma conta',
@@ -1319,6 +1384,7 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'compareselectedversions' => 'Comparar as versões selecionadas',
 'showhideselectedversions' => 'Exibir/ocultar edições selecionadas',
 'editundo' => 'desfazer',
+'diff-empty' => '(Sem diferença)',
 'diff-multi' => '({{PLURAL:$1|Uma edição intermediária|$1 edições intermediárias}} de {{PLURAL:$2|um usuário|$2 usuários}} {{PLURAL:$1|não apresentada|não apresentadas}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|Uma edição intermediária|$1 edições intermediárias}} de mais de {{PLURAL:$2|um usuário|$2 usuário}} não {{PLURAL:$1|apresentada|apresentadas}})',
 'difference-missing-revision' => '{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.
@@ -1346,7 +1412,6 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Opções de pesquisa',
 'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" nesta wiki'''",
 'searchmenu-new' => "'''Criar a página \"[[:\$1|\$1]]\" nesta wiki!'''",
-'searchhelp-url' => 'Help:Conteúdos',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navegue pelas páginas com este prefixo]]',
 'searchprofile-articles' => 'Páginas de conteúdo',
 'searchprofile-project' => 'Ajuda e páginas de projeto',
@@ -1390,15 +1455,7 @@ Tente utilizar o prefixo ''all:'' em sua busca, para pesquisar por todos os cont
 'searchdisabled' => 'A busca em {{SITENAME}} se encontra desativada.
 Você poderá pesquisar através do Google enquanto isso.
 Note que os índices do sistema de busca externo poderão conter referências desatualizadas a {{SITENAME}}.',
-
-# Quickbar
-'qbsettings' => 'Configurações da Barra Rápida',
-'qbsettings-none' => 'Nenhuma',
-'qbsettings-fixedleft' => 'Fixo à esquerda',
-'qbsettings-fixedright' => 'Fixo à direita',
-'qbsettings-floatingleft' => 'Flutuando à esquerda',
-'qbsettings-floatingright' => 'Flutuando à direita',
-'qbsettings-directionality' => 'Fixado, dependendo da direcionalidade do seu alfabeto e da sua língua',
+'search-error' => 'Ocorreu um erro ao buscar por: $1',
 
 # Preferences page
 'preferences' => 'Preferências',
@@ -1432,7 +1489,6 @@ Note que os índices do sistema de busca externo poderão conter referências de
 'resetprefs' => 'Eliminar as alterações não-salvas',
 'restoreprefs' => 'Restaurar todas as configurações padrão (em todas as seções)',
 'prefs-editing' => 'Opções de edição',
-'prefs-edit-boxsize' => 'Tamanho da janela de edição.',
 'rows' => 'Linhas:',
 'columns' => 'Colunas:',
 'searchresultshead' => 'Pesquisar',
@@ -1443,9 +1499,9 @@ Note que os índices do sistema de busca externo poderão conter referências de
 'recentchangesdays-max' => '(máximo: $1 {{PLURAL:$1|dia|dias}})',
 'recentchangescount' => 'Número de edições a serem exibidas por padrão:',
 'prefs-help-recentchangescount' => 'Isto inclui mudanças recentes, histórico de páginas e registros.',
-'prefs-help-watchlist-token' => "O preenchimento deste campo com uma senha secreta irá gerar um ''feed'' RSS para a sua lista de páginas vigiadas.
-Qualquer um que conheça a senha deste campo será capaz de ler sua lista de páginas vigiadas, então escolha um valor seguro.
-Eis um valor gerado aleatoriamente que você pode usar: $1",
+'prefs-help-watchlist-token2' => 'Esta é a senha secreta para o feed da Web com sua lista de tokens vigiados.
+Qualquer pessoa que descobrir esta senha será capaz de ler sua lista, então não a compartilhe.
+[[Special:ResetTokens|Clique aqui para redefini-la]].',
 'savedprefs' => 'As suas preferências foram salvas.',
 'timezonelegend' => 'Fuso horário:',
 'localtime' => 'Horário local:',
@@ -1476,7 +1532,6 @@ Eis um valor gerado aleatoriamente que você pode usar: $1",
 'prefs-reset-intro' => 'Você pode usar esta página para restaurar as suas preferências para os valores predefinidos do sítio.
 Esta ação não pode ser desfeita.',
 'prefs-emailconfirm-label' => 'Confirmação do e-mail:',
-'prefs-textboxsize' => 'Tamanho da janela de edição',
 'youremail' => 'Seu e-mail:',
 'username' => 'Nome de {{GENDER:$1|usuário|usuária}}:',
 'uid' => 'ID de {{GENDER:$1|usuário|usuária}}:',
@@ -1510,6 +1565,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'prefs-dateformat' => 'Formato de data',
 'prefs-timeoffset' => 'Desvio horário',
 'prefs-advancedediting' => 'Opções gerais',
+'prefs-preview' => 'Pré-visualizar',
 'prefs-advancedrc' => 'Opções avançadas',
 'prefs-advancedrendering' => 'Opções avançadas',
 'prefs-advancedsearchoptions' => 'Opções avançadas',
@@ -1517,7 +1573,9 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'prefs-displayrc' => 'Opções de exibição',
 'prefs-displaysearchoptions' => 'Opções de exibição',
 'prefs-displaywatchlist' => 'Opções de exibição',
+'prefs-tokenwatchlist' => 'Senha',
 'prefs-diffs' => 'Diferenças',
+'prefs-help-prefershttps' => 'Esta preferência terá efeito no seu próximo início de sessão.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Parece válido',
@@ -1544,6 +1602,8 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'userrights-notallowed' => 'Você não tem permissão para adicionar ou remover privilégios a usuários.',
 'userrights-changeable-col' => 'Grupos que pode alterar',
 'userrights-unchangeable-col' => 'Grupos que não pode alterar',
+'userrights-conflict' => 'Há um comflito de permissões de usuário! Por favor, revise e confirme as alterações novamente.',
+'userrights-removed-self' => 'Você removeu com sucesso seus direitos de usuário. Como tal, você agora está impossibilitado de acessar esta página.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1609,11 +1669,19 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'right-proxyunbannable' => 'Contornar bloqueios automáticos de proxies',
 'right-unblockself' => 'Desbloquear a si mesmo',
 'right-protect' => 'Mudar níveis de proteção e editar páginas protegidas em cascata',
-'right-editprotected' => 'Editar páginas protegidas (sem proteção em cascata)',
+'right-editprotected' => 'Editar páginas protegidas como "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Editar páginas protegidas como "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Editar a interface de usuário',
 'right-editusercssjs' => 'Editar os arquivos CSS e JS de outros usuários',
 'right-editusercss' => 'Editar os arquivos CSS de outros usuários',
 'right-edituserjs' => 'Editar os arquivos JS de outros usuários',
+'right-editmyusercss' => 'Edite seu próprio arquivo CSS de usuário',
+'right-editmyuserjs' => 'Edite seu próprio arquivo JavaScript de usuário',
+'right-viewmywatchlist' => 'Ver sua lista de vigiados',
+'right-editmywatchlist' => 'Editar sua lista de vigiados. Observe que algumas ações seguirão adicionando páginas, mesmo sem este direito.',
+'right-viewmyprivateinfo' => 'Ver seus próprios dados privados (por exemplo: endereço de e-mail, nome real)',
+'right-editmyprivateinfo' => 'Editar seus próprios dados privados (exemplo: endereço de e-mail, nome real)',
+'right-editmyoptions' => 'Modifique suas preferências.',
 'right-rollback' => 'Reverter rapidamente o último usuário que editou uma página em particular',
 'right-markbotedits' => 'Marcar edições revertidas como edições de bot',
 'right-noratelimit' => 'Não afetado pelos limites de velocidade de operação',
@@ -1675,12 +1743,19 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'action-userrights-interwiki' => 'editar privilégios de usuários de outros wikis',
 'action-siteadmin' => 'bloquear ou desbloquear o banco de dados',
 'action-sendemail' => 'enviar e-mails',
+'action-editmywatchlist' => 'modifique sua lista de páginas vigiadas',
+'action-viewmywatchlist' => 'veja sua lista de páginas vigiadas',
+'action-viewmyprivateinfo' => 'veja suas informações privadas',
+'action-editmyprivateinfo' => 'modifique suas informações privadas',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|alteração|alterações}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|desde a última visita}}',
+'enhancedrc-history' => 'histórico',
 'recentchanges' => 'Mudanças recentes',
 'recentchanges-legend' => 'Opções das mudanças recentes',
 'recentchanges-summary' => 'Acompanhe nesta página as mudanças mais recentes deste wiki.',
+'recentchanges-noresult' => 'Nenhuma alteração correspondente a esses critérios foi realizada durante o período selecionado.',
 'recentchanges-feed-description' => 'Acompanhe neste feed as mudanças mais recentes do wiki.',
 'recentchanges-label-newpage' => 'Esta edição criou uma nova página',
 'recentchanges-label-minor' => 'Esta é uma edição menor',
@@ -1717,7 +1792,6 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'recentchangeslinked-feed' => 'Alterações relacionadas',
 'recentchangeslinked-toolbox' => 'Alterações relacionadas',
 'recentchangeslinked-title' => 'Alterações relacionadas com "$1"',
-'recentchangeslinked-noresult' => 'Nenhuma mudança nas páginas relacionadas durante o período.',
 'recentchangeslinked-summary' => "Esta página lista alterações feitas recentemente em páginas com links a uma em específico (ou de membros de uma categoria especificada).
 Páginas de sua [[Special:Watchlist|lista de páginas vigiadas]] são exibidas em '''negrito'''.",
 'recentchangeslinked-page' => 'Nome da página:',
@@ -1729,7 +1803,7 @@ Páginas de sua [[Special:Watchlist|lista de páginas vigiadas]] são exibidas e
 'reuploaddesc' => 'Cancelar o envio e retornar ao formulário de upload',
 'upload-tryagain' => 'Enviar descrição de arquivo modificada',
 'uploadnologin' => 'Não autenticado',
-'uploadnologintext' => 'É necessário estar [[Special:UserLogin|autenticado]] para enviar arquivos.',
+'uploadnologintext' => 'Você precisa $1 para enviar arquivos.',
 'upload_directory_missing' => 'O diretório de upload ($1) não existe e não pôde ser criado pelo servidor.',
 'upload_directory_read_only' => 'O diretório de upload ($1) não tem permissões de escrita para o servidor.',
 'uploaderror' => 'Erro ao enviar arquivo',
@@ -1969,7 +2043,6 @@ Para melhor segurança, o img_auth.php está desativado.',
 'http-read-error' => 'Erro de leitura HTTP.',
 'http-timed-out' => 'Esgotado o tempo de espera da requisição HTTP.',
 'http-curl-error' => 'Erro ao requisitar a URL: $1',
-'http-host-unreachable' => 'Não foi possível atingir a URL.',
 'http-bad-status' => 'Ocorreu um problema durante a requisição HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1997,6 +2070,10 @@ Para melhor segurança, o img_auth.php está desativado.',
 'listfiles_size' => 'Tamanho',
 'listfiles_description' => 'Descrição',
 'listfiles_count' => 'Versões',
+'listfiles-show-all' => 'Incluir versões antigas das imagens',
+'listfiles-latestversion' => 'Versão atual',
+'listfiles-latestversion-yes' => 'Sim',
+'listfiles-latestversion-no' => 'Não',
 
 # File description page
 'file-anchor-link' => 'Arquivo',
@@ -2092,6 +2169,13 @@ Talvez você deseje editar a descrição na sua [$2 página de descrição de ar
 'randompage' => 'Página aleatória',
 'randompage-nopages' => 'Não há páginas {{PLURAL:$2|no seguinte espaço nominal|nos seguintes espaços nominais}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Página aleatória na categoria',
+'randomincategory-invalidcategory' => '"$1" não é um nome de categoria válido.',
+'randomincategory-nopages' => 'Não há paginas em [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Obter página aleatória da categoria: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Avançar',
+
 # Random redirect
 'randomredirect' => 'Redirecionamento aleatório',
 'randomredirect-nopages' => 'Não há redirecionamentos no espaço nominal "$1".',
@@ -2117,12 +2201,6 @@ Talvez você deseje editar a descrição na sua [$2 página de descrição de ar
 'statistics-users-active-desc' => 'Usuários que efetuaram uma ação {{PLURAL:$1|no último dia|nos últimos $1 dias}}',
 'statistics-mostpopular' => 'Páginas mais visitadas',
 
-'disambiguations' => 'Páginas com links para páginas de desambiguação',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "As páginas a seguir possuem pelo menos um link para uma '''página de desambiguação'''.
-Talvez fosse melhor que possuissem links para uma página mais específica.</br>
-Uma página é considerada como de desambiguação se utilizar uma predefinição que esteja definida em [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Páginas com uma propriedade de página',
 'pageswithprop-legend' => 'Páginas com uma propriedade de página',
 'pageswithprop-text' => 'Esta página lista as páginas que usam uma determinada propriedade de página.',
@@ -2185,6 +2263,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'mostrevisions' => 'Páginas de conteúdo com mais revisões',
 'prefixindex' => 'Todas as páginas com prefixo',
 'prefixindex-namespace' => 'Todas as páginas com prefixo (espaço nominal $1)',
+'prefixindex-strip' => 'Remover prefixo',
 'shortpages' => 'Páginas curtas',
 'longpages' => 'Páginas longas',
 'deadendpages' => 'Páginas sem saída',
@@ -2200,6 +2279,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'listusers' => 'Lista de usuários',
 'listusers-editsonly' => 'Mostrar apenas usuários com edições',
 'listusers-creationsort' => 'Ordenar por data de criação',
+'listusers-desc' => 'Listar em ordem decrescente',
 'usereditcount' => '$1 {{PLURAL:$1|edição|edições}}',
 'usercreated' => '{{GENDER:$3|Criado|Criada}} em $1 às $2',
 'newpages' => 'Páginas novas',
@@ -2376,10 +2456,9 @@ Futuras modificações em tal página e páginas de discussão relacionadas ser
 'unwatchthispage' => 'Parar de vigiar esta página',
 'notanarticle' => 'Não é uma página de conteúdo',
 'notvisiblerev' => 'Edição eliminada',
-'watchnochange' => 'Nenhuma das páginas vigiadas foi editada no período exibido.',
 'watchlist-details' => '{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo páginas de discussão.',
-'wlheader-enotif' => '* A notificação por email encontra-se ativada.',
-'wlheader-showupdated' => "* As páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
+'wlheader-enotif' => 'A notificação por email encontra-se ativada.',
+'wlheader-showupdated' => "Páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
 'watchmethod-recent' => 'verificando edições recentes para as páginas vigiadas',
 'watchmethod-list' => 'verificando páginas vigiadas para edições recentes',
 'watchlistcontains' => 'Sua lista de páginas vigiadas contém $1 {{PLURAL:$1|página|páginas}}.',
@@ -2628,7 +2707,7 @@ $1',
 'contributions' => 'Contribuições {{GENDER:$1|do usuário|da usuária}}',
 'contributions-title' => 'Contribuições {{GENDER:$1|do usuário|da usuária}} $1',
 'mycontris' => 'Contribuições',
-'contribsub2' => 'Para $1 ($2)',
+'contribsub2' => 'Para {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Não foram encontradas mudanças com este critério.',
 'uctop' => '(atual)',
 'month' => 'Mês (inclusive anteriores):',
@@ -2783,13 +2862,11 @@ Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloque
 'ipb_blocked_as_range' => 'Erro: O IP $1 não se encontra bloqueado de forma direta, não podendo ser desbloqueado deste modo. Se encontra bloqueado como parte do "range" $2, o qual pode ser desbloqueado.',
 'ip_range_invalid' => 'Gama de IPs inválida.',
 'ip_range_toolarge' => 'Intervalos de bloqueio maiores do que /$1 não são permitidos',
-'blockme' => 'Bloquear-me',
 'proxyblocker' => 'Bloqueador de proxy',
-'proxyblocker-disabled' => 'Esta função está desabilitada.',
 'proxyblockreason' => 'O seu endereço de IP foi bloqueado por ser um proxy público. Por favor contacte o seu fornecedor do serviço de Internet ou o apoio técnico e informe-os deste problema de segurança grave.',
-'proxyblocksuccess' => 'Concluído.',
 'sorbsreason' => 'O seu endereço IP encontra-se listado como proxy aberto pela DNSBL utilizada por {{SITENAME}}.',
 'sorbs_create_account_reason' => 'O seu endereço de IP encontra-se listado como proxy aberto na DNSBL utilizada por {{SITENAME}}. Você não pode criar uma conta',
+'xffblockreason' => 'Um endereço IP presente no cabeçalho X-Forwarded-For, seu ou do servidor proxy que está usando, foi bloqueado. O motivo original do bloqueio foi: $1',
 'cant-block-while-blocked' => 'Você não pode bloquear outros usuários enquanto estiver bloqueado.',
 'cant-see-hidden-user' => 'O usuário que você está tentando bloquear já está bloqueado ou oculto. Como você não possui privilégio de ocultar usuários, você não pode ver ou editar o bloqueio desse usuário.',
 'ipbblocked' => 'Não é possível que você bloqueie ou desbloqueie outros usuários, já que você se encontra bloqueado',
@@ -2951,6 +3028,7 @@ Acesse [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//trans
 'thumbnail-more' => 'Ampliar',
 'filemissing' => 'arquivo não encontrado',
 'thumbnail_error' => 'Erro ao criar miniatura: $1',
+'thumbnail_error_remote' => 'Mensagem de erro para $1, $2',
 'djvu_page_error' => 'página DjVu inacessível',
 'djvu_no_xml' => 'Não foi possível acessar o XML do arquivo DjVU',
 'thumbnail-temp-create' => 'Não foi possível criar o arquivo temporário de miniatura',
@@ -3101,18 +3179,12 @@ Permite colocar uma justificativa no sumário da edição.',
 
 # Stylesheets
 'common.css' => '/** o código CSS colocado aqui será aplicado a todos os temas */',
-'nostalgia.css' => '/* O CSS colocado aqui terá efeito nos usuários do tema Nostalgia */',
 'monobook.css' => '/* o código CSS colocado aqui terá efeito nos usuários do tema Monobook */',
 
 # Scripts
 'common.js' => '/* Códigos JavaScript aqui colocados serão carregados por todos aqueles que acessarem alguma página deste wiki */',
-'standard.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Clássico */',
-'nostalgia.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Nostalgia */',
 'cologneblue.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Azul colonial */',
 'monobook.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin MonoBook */',
-'myskin.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin MySkin */',
-'chick.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Chique */',
-'simple.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Simples */',
 'modern.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Moderno */',
 'vector.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Vector */',
 
@@ -3188,13 +3260,8 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
 'pageinfo-category-files' => 'Número de arquivos',
 
 # Skin names
-'skinname-standard' => 'Clássico',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Azul colonial',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chique',
-'skinname-simple' => 'Simples',
 'skinname-modern' => 'Moderno',
 
 # Patrolling
@@ -3272,11 +3339,25 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
 'minutes' => '{{PLURAL:$1|um minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|uma hora|$1 horas}}',
 'days' => '{{PLURAL:$1|um dia|$1 dias}}',
+'weeks' => '{{PLURAL:$1|$1 semana|$1 semanas}}',
 'months' => '{{PLURAL:$1|$1 mês|$1 meses}}',
 'years' => '{{PLURAL:$1|$1 ano|$1 anos}}',
 'ago' => '$1 atrás',
 'just-now' => 'agora mesmo',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|hora|horas}} atrás',
+'minutes-ago' => '$1 {{PLURAL:$1|minuto|minutos}} atrás',
+'seconds-ago' => '$1 {{PLURAL:$1|segundo|segundos}} atrás',
+'monday-at' => 'Segunda-feira às $1',
+'tuesday-at' => 'Terça-feira às $1',
+'wednesday-at' => 'Quarta-feira às $1',
+'thursday-at' => 'Quinta-feira às $1',
+'friday-at' => 'Sexta-feira às $1',
+'saturday-at' => 'Sábado às $1',
+'sunday-at' => 'Domingo às $1',
+'yesterday-at' => 'Ontem às $1',
+
 # Bad image list
 'bad_image_list' => 'O formato é o seguinte:
 
@@ -3306,7 +3387,7 @@ Por padrão, outros campos estarão ocultos.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Largura',
 'exif-imagelength' => 'Altura',
 'exif-bitspersample' => 'Bits por componente',
@@ -3484,7 +3565,7 @@ Por padrão, outros campos estarão ocultos.
 'exif-originalimageheight' => 'Altura da imagem antes de ser cortada',
 'exif-originalimagewidth' => 'Largura da imagem antes de ser cortada',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sem compressão',
 'exif-compression-2' => 'CCITT Grupo 3 Codificação run length de Huffman modificado unidimensional',
 'exif-compression-3' => 'CCITT Grupo 3 codificação de fax',
@@ -3880,7 +3961,6 @@ Você também pode [[Special:EditWatchlist|editar a lista da maneira convenciona
 'version-other' => 'Diversos',
 'version-mediahandlers' => 'Executores de média',
 'version-hooks' => 'Hooks',
-'version-extension-functions' => 'Funções de extensão',
 'version-parser-extensiontags' => 'Etiquetas de extensões de tipo "parser"',
 'version-parser-function-hooks' => 'Funções "hooks" de "parser"',
 'version-hook-name' => 'Nome do hook',
@@ -3889,6 +3969,7 @@ Você também pode [[Special:EditWatchlist|editar a lista da maneira convenciona
 'version-license' => 'Licença',
 'version-poweredby-credits' => "Este é um wiki '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'outros',
+'version-poweredby-translators' => 'tradutores da translatewiki.net',
 'version-credits-summary' => 'Gostaríamos de agradecer às seguintes pessoas por suas contribuições no [[Special:Version|MediaWiki]]',
 'version-license-info' => 'O MediaWiki é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.
 
@@ -3902,12 +3983,17 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'version-entrypoints-header-entrypoint' => 'Ponto de entrada',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Diretório do arquivo',
-'filepath-page' => 'arquivo:',
-'filepath-submit' => 'Ir',
-'filepath-summary' => 'Esta página especial retorna o endereço completo de um arquivo.
-As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos serão abertos diretamente pelos programas associados.',
+# Special:Redirect
+'redirect' => 'Redirecionar por arquivo, usuário ou ID de revisão',
+'redirect-legend' => 'Redirecionar para um arquivo ou página',
+'redirect-summary' => 'Esta página especial redireciona a um arquivo (dado o nome do arquivo), a uma página (dado um ID de revisão) ou a uma página de usuário (dado o ID do usuário).',
+'redirect-submit' => 'Ir',
+'redirect-lookup' => 'Buscar',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'ID do usuário',
+'redirect-revision' => 'Revisão da página',
+'redirect-file' => 'Nome do arquivo',
+'redirect-not-exists' => 'Valor não encontrado',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Procurar por arquivos duplicados',
@@ -3956,12 +4042,16 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'tags' => 'Etiquetas de modificação válidas',
 'tag-filter' => 'Filtrar [[Special:Tags|etiquetas]]:',
 'tag-filter-submit' => 'Filtrar',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetas}}]]: $2)',
 'tags-title' => 'Etiquetas',
 'tags-intro' => 'Esta página lista as etiquetas com que o software poderá marcar uma edição, e o seu significado.',
 'tags-tag' => 'Nome da etiqueta',
 'tags-display-header' => 'Aparência nas listas de modificações',
 'tags-description-header' => 'Descrição completa do significado',
+'tags-active-header' => 'Ativo?',
 'tags-hitcount-header' => 'Modificações etiquetadas',
+'tags-active-yes' => 'Sim',
+'tags-active-no' => 'Não',
 'tags-edit' => 'editar',
 'tags-hitcount' => '$1 {{PLURAL:$1|modificação|modificações}}',
 
@@ -3982,6 +4072,7 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'dberr-problems' => 'Desculpe! Este sítio está passando por dificuldades técnicas.',
 'dberr-again' => 'Experimente esperar alguns minutos e atualizar.',
 'dberr-info' => '(Não foi possível contactar o servidor de base de dados: $1)',
+'dberr-info-hidden' => '(Não foi possível contatar o banco de dados do servidor)',
 'dberr-usegoogle' => 'Você pode tentar pesquisar no Google entretanto.',
 'dberr-outofdate' => 'Note que os seus índices relativos ao nosso conteúdo podem estar desatualizados.',
 'dberr-cachederror' => 'A seguinte página é uma cópia em cache da página pedida e pode não ser atual.',
@@ -3997,6 +4088,9 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'htmlform-submit' => 'Enviar',
 'htmlform-reset' => 'Desfazer alterações',
 'htmlform-selectorother-other' => 'Outros',
+'htmlform-no' => 'Não',
+'htmlform-yes' => 'Sim',
+'htmlform-chosen-placeholder' => 'Selecione uma opção',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 com suporte de pesquisa de texto completo',
@@ -4114,4 +4208,19 @@ Caso contrário, você poderá usar o formulário simplificado a seguir. Seu com
 # Image rotation
 'rotate-comment' => 'Imagem girada por $1 {{PLURAL:$1|grau|graus}} no sentido horário',
 
+# Limit report
+'limitreport-title' => 'Analisador de dados de perfis:',
+'limitreport-cputime' => 'Tempo de uso da CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-walltime' => 'Tempo de uso real',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|segundo|segundos}}',
+'limitreport-ppvisitednodes' => 'Número de nós visitados pelo pré-processador',
+'limitreport-ppgeneratednodes' => 'Número de nós gerados pelo pré-processador',
+'limitreport-postexpandincludesize' => 'Tamanho de inclusão pós-expansão',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-templateargumentsize' => 'Argumento do tamanho da predefinição',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte|bytes}}',
+'limitreport-expansiondepth' => 'Máxima profundidade de expansão',
+'limitreport-expensivefunctioncount' => 'Conta da função expansiva do analizador',
+
 );
diff --git a/languages/messages/MessagesQqq.php b/languages/messages/MessagesQqq.php
index 11c24617..cdb8a914 100644
--- a/languages/messages/MessagesQqq.php
+++ b/languages/messages/MessagesQqq.php
@@ -8,6 +8,7 @@
  * @file
  *
  * @author *Surak*
+ * @author 127.0.0.1
  * @author Abanima
  * @author Ahonc
  * @author Aleator
@@ -34,6 +35,7 @@
  * @author Dalibor Bosits
  * @author Darth Kule
  * @author Deadelf
+ * @author Dekel E
  * @author Dsvyas
  * @author Emilkris33
  * @author Erwin
@@ -81,6 +83,7 @@
  * @author Mido
  * @author Mihai
  * @author Minh Nguyen
+ * @author Moha
  * @author Mormegil
  * @author Mpradeep
  * @author Murma174
@@ -114,6 +117,7 @@
  * @author SPQRobin
  * @author Sanbec
  * @author Sborsody
+ * @author Se4598
  * @author Seb35
  * @author Sherbrooke
  * @author Shirayuki
@@ -146,6 +150,7 @@
  * @author Yyy
  * @author Žekřil71pl
  * @author פוילישער
+ * @author គីមស៊្រុន
  * @author 아라
  */
 
@@ -195,9 +200,6 @@ Is only shown if {{msg-mw|tog-enotifusertalkpages}} or/and {{msg-mw|tog-enotifwa
 'tog-shownumberswatching' => 'Toggle option used in [[Special:Preferences]], in the section for recent changes. When this option is activated, the entries in recent changes includes the number of users who watch pages. {{Gender}}',
 'tog-oldsig' => 'Used in [[Special:Preferences]], tab User profile. {{Gender}}',
 'tog-fancysig' => 'In user preferences under the signature box.  {{Gender}}',
-'tog-externaleditor' => "[[Special:Preferences]], tab 'Edit'. Offers user to use an external editor by default. {{Gender}}",
-'tog-externaldiff' => "[[Special:Preferences]], tab 'Edit'. Offers user to use an external diff program by default. {{Gender}}",
-'tog-showjumplinks' => 'Toggle option used in [[Special:Preferences]]. The "jump to" part should be the same with {{msg-mw|jumpto}} (or you can use <nowiki>{{int:jumpto}}</nowiki>). These links are shown in some of the older skins as "jump to: navigation, search" but they are hidden by default (you can enable them with this option). {{Gender}}',
 'tog-uselivepreview' => '{{Gender}}
 Toggle option used in [[Special:Preferences]].
 
@@ -217,6 +219,8 @@ Live preview is an experimental feature (unavailable by default) to use edit pre
 ''(the message is considered optional because it is only used in wikis with language variants)''",
 'tog-norollbackdiff' => "Option in [[Special:Preferences]], 'Misc' tab. Only shown for users with the rollback right. By default a diff is shown below the return screen of a rollback. Checking this preference toggle will suppress that. {{Gender}}
 {{Identical|Rollback}}",
+'tog-useeditwarning' => 'Used as label for the checkbox in [[Special:Preferences#mw-prefsection-editing|Special:Preferences]].',
+'tog-prefershttps' => 'Toggle option used in [[Special:Preferences]] that indicates if the user wants to use a secure connection when logged in',
 
 'underline-always' => 'Used in [[Special:Preferences#mw-prefsection-rendering|Preferences]].
 
@@ -348,6 +352,18 @@ One of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}},
 'dec' => 'Abbreviation of December, the twelfth month of the Gregorian calendar
 
 One of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.',
+'january-date' => 'A date in the Gregorian month of January. $1 is the numerical date, for example "23".',
+'february-date' => 'A date in the Gregorian month of February. $1 is the numerical date, for example "23".',
+'march-date' => 'A date in the Gregorian month of March. $1 is the numerical date, for example "23".',
+'april-date' => 'A date in the Gregorian month of April. $1 is the numerical date, for example "23".',
+'may-date' => 'A date in the Gregorian month of May. $1 is the numerical date, for example "23". The month name is not abbreviated.',
+'june-date' => 'A date in the Gregorian month of June. $1 is the numerical date, for example "23".',
+'july-date' => 'A date in the Gregorian month of July. $1 is the numerical date, for example "23".',
+'august-date' => 'A date in the Gregorian month of August. $1 is the numerical date, for example "23".',
+'september-date' => 'A date in the Gregorian month of September. $1 is the numerical date, for example "23".',
+'october-date' => 'A date in the Gregorian month of October. $1 is the numerical date, for example "23".',
+'november-date' => 'A date in the Gregorian month of November. $1 is the numerical date, for example "23".',
+'december-date' => 'A date in the Gregorian month of December. $1 is the numerical date, for example "23".',
 
 # Categories related messages
 'pagecategories' => 'Used in the categories section of pages.
@@ -585,6 +601,7 @@ See also:
 {{Identical|Delete}}',
 'deletethispage' => 'In the Cologne Blue skin this is the text for link to delete the page in admin view, at the bottom of the page.
 {{Identical|Delete this page}}',
+'undeletethispage' => 'In the Cologne Blue skin this is the text for link to undelete the page in admin view, at the bottom of the page.',
 'undelete_short' => "It is tab label. It's really can be named ''nstab-undelete''. Parameters:
 * $1 - number of edits",
 'viewdeleted_short' => 'Tab label for the undelete button when the user has permission to view the deleted history but not undelete.
@@ -683,7 +700,7 @@ For explanation of 'lock' see [[w:Lock_(computer_science)|wikipedia]].",
 'pool-errorunknown' => 'Part of {{msg-mw|view-pool-error}}.
 {{Identical|Unknown error}}',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Used as the label of the link that appears at the footer of every page on the wiki (in most of  the skins) and leads to the page that contains the site description. The link target is {{msg-mw|aboutpage}}.
 
 [[mw:Manual:Interface/Aboutsite|MediaWiki manual]].
@@ -719,8 +736,6 @@ See also:
 'disclaimerpage' => '{{doc-important|Do not change the <code>Project:</code> part.}}
 Used as page for that contains the site disclaimer. Used at the bottom of every page on the wiki. Example: [[{{MediaWiki:Disclaimerpage}}|{{MediaWiki:Disclaimers}}]].',
 'edithelp' => 'This is the text that appears on the editing help link that is near the bottom of the editing page',
-'edithelppage' => 'The help page displayed when a user clicks on editing help link which is present on the right of Show changes button.
-{{doc-important|Do not change the "<tt>Help:</tt>" part.}}',
 'helppage' => '{{doc-important|Do not change the <code>Help:</code> part.}}
 The link destination used by default in the sidebar, and in {{msg-mw|Noarticletext}}.
 {{Identical|HelpContent}}',
@@ -862,7 +877,6 @@ Parameters:
 'editsection' => 'Display name of link to edit a section on a content page. Example: [{{MediaWiki:Editsection}}].
 
 {{Identical|Edit}}',
-'editsection-brackets' => '{{optional}}',
 'editold' => '{{Identical|Edit}}',
 'viewsourceold' => '{{Identical|View source}}',
 'editlink' => 'Text of the edit link shown next to every (editable) template in the list of used templates below the edit window. See also {{msg-mw|Viewsourcelink}}.
@@ -1039,16 +1053,23 @@ The title of this error is the message {{msg-mw|Nosuchspecialpage}}.',
 # General errors
 'error' => '{{Identical|Error}}',
 'databaseerror' => 'Used as title of error message {{msg-mw|Databaseerrortext}}.',
-'dberrortext' => 'Parameters:
-* $1 - The last SQL command/query
-* $2 - SQL function name
-* $3 - Error number
-* $4 - Error description',
-'dberrortextcl' => 'Parameters:
-* $1 - The last SQL command/query
-* $2 - SQL function name
-* $3 - Error number
-* $4 - Error description',
+'databaseerror-text' => 'A list of technical details might (or might not) follow, depending on server configuration. Do not use wiki markup.
+
+See also:
+* {{msg-mw|Databaseerror-textcl}} - abridged form',
+'databaseerror-textcl' => 'Abridged form of {{msg-mw|databaseerror-text}}, suitable for use in command-line scripts run by the server administrator. Do not use wiki markup.',
+'databaseerror-query' => 'Identifies, in the list of technical details, the [[wikipedia:SQL|SQL]] statement that failed.
+Parameters:
+* $1 - SQL statement (shown within a box)
+{{Identical|Query}}',
+'databaseerror-function' => 'Identifies, in the list of technical details, the function that tried to execute the database query.
+Parameters:
+* $1 - Name of function
+{{Identical|Function}}',
+'databaseerror-error' => 'Identifies, in the list of technical details, the error message the database server returned.
+Parameters:
+* $1 - Error message from the database server, probably in English
+{{Identical|Error}}',
 'laggedslavemode' => 'Used as warning when getting the timestamp of the latest version, if in LaggedSlaveMode.',
 'readonly' => 'Used as title of error message when database is locked.',
 'enterlockreason' => 'For developers when locking the database',
@@ -1115,6 +1136,14 @@ See also:
 'cannotdelete-title' => 'Title of error page when the user cannot delete a page. Parameters:
 * $1 - the page name',
 'delete-hook-aborted' => 'Error message shown when an extension hook prevents a page deletion, but does not provide an error message.',
+'no-null-revision' => 'Error message shown when no null revision could be created to reflect a protection level change.
+
+About "null revision":
+* Create a new null-revision for insertion into a page\'s history. This will not re-save the text, but simply refer to the text from the previous version.
+* Such revisions can for instance identify page rename operations and other such meta-modifications.
+
+Parameters:
+* $1 - page title',
 'badtitle' => 'The page title when a user requested a page with invalid page name. The content will be {{msg-mw|badtitletext}}.',
 'badtitletext' => 'The message shown when a user requested a page with invalid page name. The page title will be {{msg-mw|badtitle}}.
 
@@ -1161,7 +1190,6 @@ See also {{msg-mw|editinginterface}}.',
 'editinginterface' => 'A message shown when editing pages in the namespace MediaWiki:.
 
 See also {{msg-mw|protectedinterface}}.',
-'sqlhidden' => 'This message indicates the SQL is hidden for security reasons.',
 'cascadeprotected' => 'Parameters:
 * $1 - number of cascade-protected pages, used for PLURAL
 * $2 - list of cascade-protected pages',
@@ -1169,6 +1197,10 @@ See also {{msg-mw|protectedinterface}}.',
 * $1 - namespace name',
 'customcssprotected' => 'Used as error message.',
 'customjsprotected' => 'Used as error message.',
+'mycustomcssprotected' => 'Used as error message.',
+'mycustomjsprotected' => 'Used as error message.',
+'myprivateinfoprotected' => 'Used as error message.',
+'mypreferencesprotected' => 'Used as error message.',
 'ns-specialprotected' => 'Error message displayed when trying to edit a page in the Special namespace',
 'titleprotected' => 'Used as error message. Parameters:
 * $1 - username; GENDER supported
@@ -1214,14 +1246,45 @@ Parameters:
 Replaces welcomecreation in 1.21wmf5, see [[bugzilla:42215]]',
 'yourname' => 'Since 1.22 no longer used in core, but used by some extensions.
 {{Identical|Username}}',
+'userlogin-yourname' => "In user login & create account forms, label for username field.
+{{doc-important|<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.}}
+
+See examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Username}}",
+'userlogin-yourname-ph' => 'Placeholder text in login & create account form field.
+
+See example: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
+'createacct-another-username-ph' => 'Placeholder text in create account form field when one user creates an account for another.',
 'yourpassword' => 'In user preferences
 
 {{Identical|Password}}',
+'userlogin-yourpassword' => 'In login & create account forms, label for password field.
+
+See examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Password}}',
+'userlogin-yourpassword-ph' => 'Placeholder text in login form for password field.
+
+See examples: [[Special:UserLogin]] and [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Enter password}}',
+'createacct-yourpassword-ph' => 'Placeholder text in create account form for password field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Enter password}}',
 'yourpasswordagain' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED',
+'createacct-yourpasswordagain' => 'In create account form, label for field to re-enter password
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Confirm password}}',
+'createacct-yourpasswordagain-ph' => 'Placeholder text in create account form for re-enter password field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
 'remembermypassword' => 'Used as checkbox label in [[Special:UserLogin]]. Parameters:
 * $1 - number of days
 {{Identical|Remember my login on this computer}}',
-'securelogin-stick-https' => 'Used as label for checkbox.',
+'userlogin-remembermypassword' => 'The text for a check box in [[Special:UserLogin]].',
+'userlogin-signwithsecure' => 'Text of link to HTTPS login form.
+
+See example: [[Special:UserLogin]]',
 'yourdomainname' => 'Used as label for listbox.',
 'password-change-forbidden' => 'Error message shown when an external authentication source does not allow the password to be changed.',
 'externaldberror' => 'This message is thrown when a valid attempt to change the wiki password for a user fails because of a database error or an error from an external system.',
@@ -1254,6 +1317,11 @@ See also:
 'notloggedin' => 'This message is displayed in the standard skin when not logged in. The message is placed above the login link in the top right corner of pages.
 
 {{Identical|Not logged in}}',
+'userlogin-noaccount' => 'In the [[Special:Userlogin]] form, this is the text prior to button inviting user to join project.
+{{Identical|Do not have an account}}',
+'userlogin-joinproject' => 'Text of button inviting user to create an account.
+
+See example: [[Special:UserLogin]]',
 'nologin' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED. Parameters:
 * $1 - a link to the account creation form, and the text of it is {{msg-mw|Nologinlink}}
 {{Identical|Do not have an account}}',
@@ -1269,16 +1337,110 @@ It is also used on the submit button in the form/special page where you register
 'gotaccountlink' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.
 {{Identical|Log in}}',
 'userlogin-resetlink' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED.',
+'userlogin-resetpassword-link' => 'Used as link text on login form.
+
+The link points to the local [[Special:PasswordReset]].
+
+See example: [[Special:UserLogin]]
+
+userlogin-resetpassword-link may have to be shorter than the old {{msg-mw|userlogin-resetlink}}',
+'helplogin-url' => '{{doc-important|Do not translate the namespace name <code>Help</code>.}}
+Used as name of the page that provides information about logging into the wiki.
+
+Used as a link target in the message {{msg-mw|Userlogin-helplink}}.',
+'userlogin-helplink' => '{{doc-important|Do not change <code><nowiki>{{MediaWiki:helplogin-url}}</nowiki></code>.}}
+Wikitext linking to login help.
+
+See example: [[Special:UserLogin]]
+
+See also:
+* {{msg-mw|Helplogin-url}}',
+'userlogin-loggedin' => 'Used as warning on [[Special:UserLogin]] when the current user is already logged in.
+
+Followed by the Login form.
+
+See example: [[Special:UserLogin]].
+
+Parameters:
+* $1 - user name (used for display and for gender support)',
+'userlogin-createanother' => 'Used as label for the button on [[Special:UserLogin]] shown when the current user is already logged in.
+{{Identical|Create another account}}',
+'createacct-join' => 'Subheading of vertical-layout create account form encouraging user to join the wiki.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
+'createacct-another-join' => 'Subheading of create account form when one user creates an account for another.',
+'createacct-emailrequired' => 'Label in create account form for email field when it is required.
+
+See also:
+* {{msg-mw|Createacct-emailoptional}}
+{{Identical|E-mail address}}',
+'createacct-emailoptional' => 'Label in vertical-layout create account form for email field when it is optional.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+
+See also:
+* {{msg-mw|Createacct-emailrequired}}',
+'createacct-email-ph' => 'Placeholder in vertical-layout create account form for email field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
+'createacct-another-email-ph' => 'Placeholder in create account form for email field when one user creates an account for another.',
 'createaccountmail' => 'The label for the checkbox for creating a new account and sending the new password to the specified email address directly, as used on [[Special:UserLogin/signup]] when one user creates an account for another (if creating accounts by email is allowed).
 
 See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
+'createacct-realname' => 'In vertical-layout create account form, label for field to enter optional real name.',
 'createaccountreason' => 'Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED
 
 {{Identical|Reason}}',
+'createacct-reason' => 'In create account form, label for field to enter reason to create an account when already logged-in.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+{{Identical|Reason}}',
+'createacct-reason-ph' => 'Placeholder in vertical-layout create account form for reason field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
+'createacct-captcha' => 'Label in vertical-layout create account form for CAPTCHA input field when repositioned by JavaScript.',
+'createacct-imgcaptcha-ph' => 'Placehodler text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.',
+'createacct-submit' => 'Submit button on vertical-layout create account form.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]',
+'createacct-another-submit' => 'Submit button of  [[Special:UserLogin/signup]] ([[Special:CreateAccount]]) when accessed by a registered user.
+
+The original means "create an account in addition to the one you already have"; sometimes, but not always, it means you are going to "Create the account on behalf of somebody else" or "Create account for another".
+{{Identical|Create another account}}',
+'createacct-benefit-heading' => 'In vertical-layout create account form, the heading for the section describing the benefits of creating an account. See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+
+If in your language you need to know the gender of the name for the wiki (which is the subject of the English sentence), please adapt the sentence as much as you need for your translation to fit.',
+'createacct-benefit-body1' => 'In vertical-layout create account form, the text for the first benefit.
+
+Preceded by the message {{msg-mw|Createacct-benefit-head1}} (number of edits).
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+
+Parameters:
+* $1 - number of edits
+{{Identical|Edit}}',
+'createacct-benefit-body2' => 'In vertical-layout create account form, the text for the second benefit.
+
+Preceded by the message {{msg-mw|Createacct-benefit-head2}} (number of pages).
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+
+Parameters:
+* $1 - number of pages
+{{Identical|Page}}',
+'createacct-benefit-body3' => 'In vertical-layout create account form, the text for the third benefit.
+
+Preceded by the message {{msg-mw|Createacct-benefit-head3}} (number of contributors).
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]
+
+Parameters:
+* $1 - number of contributors (users)',
 'badretype' => 'Used as error message when the new password and its retype do not match.',
 'userexists' => 'Used as error message in creating a user account.',
 'loginerror' => 'Used as title of error message.
 {{Identical|Login error}}',
+'createacct-error' => 'Used as heading for the error message.',
 'createaccounterror' => 'Parameters:
 * $1 is an error message',
 'nocookiesnew' => "This message is displayed when a new account was successfully created, but the browser doesn't accept cookies.",
@@ -1389,12 +1551,32 @@ Parameters:
 * $3 - a password (randomly generated)
 * $4 - a URL to the wiki ('<' + server name + script name + '>')
 * $5 - (Unused) number of days to password expiry date",
-'login-throttled' => 'Error message shown at [[Special:UserLogin]] after 5 wrong passwords. The hardcoded waiting time is 300 seconds.',
+'login-throttled' => 'Error message shown at [[Special:UserLogin]] after the user has tried to login with incorrect password too many times; also used by [[Special:ChangeEmail]] and [[Special:ChangePassword]].
+
+The user has to wait a certain time before trying to log in again.
+
+Parameters:
+* $1 - the time to wait before the next login attempt. Automatically formatted using the following duration messages:
+** {{msg-mw|Duration-millennia}}
+** {{msg-mw|Duration-centuries}}
+** {{msg-mw|Duration-decades}}
+** {{msg-mw|Duration-years}}
+** {{msg-mw|Duration-weeks}}
+** {{msg-mw|Duration-days}}
+** {{msg-mw|Duration-hours}}
+** {{msg-mw|Duration-minutes}}
+** {{msg-mw|Duration-seconds}}
+
+This is a protection against robots trying to find the password by trying lots of them.
+The number of attempts and waiting time are configured via [[mw:Manual:$wgPasswordAttemptThrottle|$wgPasswordAttemptThrottle]].',
 'login-abort-generic' => 'The generic unsuccessful login message is used unless otherwise specified by hook writers',
 'loginlanguagelabel' => 'Used on [[Special:UserLogin]] if $wgLoginLanguageSelector is true. Parameters:
 * $1 - a pipe-separated list built from the names that appear in the message {{msg-mw|Loginlanguagelinks}}.
 {{Identical|Language}}',
 'suspicious-userlogout' => 'Used when the logout request looks suspicious, in Special:UserLogout.',
+'createacct-another-realname-tip' => "{{doc-singularthey}}
+Used on the account creation form when creating another user's account. Similar to {{msg-mw|prefs-help-realname}}.
+{{Identical|Real name attribution}}",
 
 # Email sending
 'php-mail-error-unknown' => 'Used as error message when <code>mail()</code> returned empty error message.',
@@ -1414,7 +1596,7 @@ Parameters:
 'newpassword' => '{{Identical|New password}}',
 'retypenew' => "Appears on the 'User profile' tab of the 'Preferences' special page in the 'Change password' section. It appears next to the text box for entering the new password a second time.",
 'resetpass_submit' => 'Submit button on [[Special:ChangePassword]]',
-'resetpass_success' => 'Used in [[Special:ChangePassword]].',
+'changepassword-success' => 'Used in [[Special:ChangePassword]].',
 'resetpass_forbidden' => "Used as error message in changing password. Maybe the external auth plugin won't allow local password changes.",
 'resetpass-no-info' => 'Error message for [[Special:ChangePassword]].',
 'resetpass-submit-loggedin' => 'Button on [[Special:ResetPass]] to submit new password.
@@ -1429,12 +1611,18 @@ Parameters:
 # Special:PasswordReset
 'passwordreset' => 'Title of [[Special:PasswordReset]].
 {{Identical|Reset password}}',
-'passwordreset-text' => 'Text on [[Special:PasswordReset]]',
+'passwordreset-text-one' => 'Text on [[Special:PasswordReset]] that appears when there is only one way of resetting the password.
+
+{{msg-mw|Passwordreset-text-many}} will be used, when there are multiple ways of resetting the password.',
+'passwordreset-text-many' => 'Text on [[Special:PasswordReset]] that appears when there are multiple ways of resetting the password.
+
+Parameters:
+* $1 - the number of password reset routes
+
+{{msg-mw|Passwordreset-text-one}} will be used, when there is only one way of resetting the password.',
 'passwordreset-legend' => '{{Identical|Reset password}}',
 'passwordreset-disabled' => 'Used as error message in changing password.',
-'passwordreset-pretext' => 'These instructions are shown on the password reset dialogue, which can, in principle, take the user\'s email address as well as, or instead of, their username. This text displays above one or more fields, at least one of which needs to be completed, and the message does not know which routes are available, so it needs to refer to some vague noun rather than specifically "username".
-"One of the pieces of data" means "an info"/"a datum" (probably to be translatea with a singular noun in your language if available). Parameters:
-* $1 is the number of password reset routes. This is never 1, but always two or more. Thus, the first plural option is empty in English.',
+'passwordreset-emaildisabled' => "Used as error message in changing password when site's email feature is disabled.",
 'passwordreset-username' => '{{Identical|Username}}',
 'passwordreset-domain' => 'A domain like used in Domain Name System (DNS) or more specifically like a domain component in the Lightweight Directory Access Protocol (LDAP)',
 'passwordreset-capture' => 'Label for checkbox asking the user whether they want to see the contents of the password reset email (only shown if they have the <code>passwordreset</code> permission).',
@@ -1470,8 +1658,9 @@ See also:
 See also:
 * {{msg-mw|Passwordreset-emailsent}}
 * {{msg-mw|Passwordreset-emailerror-capture}}',
-'passwordreset-emailerror-capture' => 'Error message displayed in [[Special:PasswordReset]] when sending an e-mail fails. Parameters:
-* $1 - the name of a user who was supposed to get the e-mail
+'passwordreset-emailerror-capture' => 'Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:
+* $1 - error message
+* $2 - username, used for GENDER
 See also:
 * {{msg-mw|Passwordreset-emailsent}}
 * {{msg-mw|Passwordreset-emailsent-capture}}',
@@ -1492,6 +1681,23 @@ See also:
 
 {{Identical|Cancel}}',
 
+# Special:ResetTokens
+'resettokens' => '{{doc-special|ResetTokens}}
+In this case "token" may be translated as "key", or similar.
+{{Identical|Reset token}}',
+'resettokens-text' => 'Text on [[Special:ResetTokens]].',
+'resettokens-no-tokens' => 'Additional text on [[Special:ResetTokens]] if the user has no tokens.',
+'resettokens-legend' => 'Form legend on [[Special:ResetTokens]].
+{{Identical|Reset token}}',
+'resettokens-tokens' => 'Form label on [[Special:ResetTokens]].
+{{Identical|Token}}',
+'resettokens-token-label' => 'Label for each checkbox on [[Special:ResetTokens]]. Parameters:
+* $1 - short information about the token (for example {{msg-mw|resettokens-watchlist-token}})
+* $2 - its current value',
+'resettokens-watchlist-token' => 'Label for watchlist token checkbox on [[Special:ResetTokens]] (see {{msg-mw|prefs-watchlist-token}} at [[Special:Preferences#mw-prefsection-watchlist]]).',
+'resettokens-done' => 'Message shown on [[Special:ResetTokens]] after the tokens have been reset successfully.',
+'resettokens-resetbutton' => 'Form submit button on [[Special:ResetTokens]].',
+
 # Edit page toolbar
 'bold_sample' => 'This is the sample text that you get when you press the first button on the left on the edit toolbar.
 
@@ -1881,6 +2087,11 @@ See also:
 * {{msg-mw|edit-gone-missing}}
 * {{msg-mw|edit-conflict}}
 * {{msg-mw|edit-already-exists}}',
+'postedit-confirmation' => '{{gender}}
+Confirmation message that is displayed upon successful edit.
+
+Parameters:
+* $1 - (Optional) the current user, for GENDER support',
 'edit-already-exists' => 'Used as error message.
 
 See also:
@@ -1903,6 +2114,9 @@ Parameters:
 'content-not-allowed-here' => 'Error message indicating that the desired content model is not supported in given localtion.
 * $1 - the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
 * $2 - the title of the page in question',
+'editwarning-warning' => "{{doc-important|Do ''not'' use <nowiki>{{int:prefs-editing}}</nowiki> for \"Editing\". It is forbidden in this message, see [[mwr:68405]].}}
+
+but you can see the text of that button here: {{msg-mw|Prefs-editing}}",
 
 # Content models
 'content-model-wikitext' => 'Name for the wikitext content model, used when decribing what type of content a page contains.
@@ -2021,6 +2235,12 @@ See also:
 * $1 - revision ID
 * $2 - username
 {{Identical|Undo}}',
+'undo-summary-username-hidden' => 'Edit summary for an undo action where the username of the old revision is hidden.
+
+Parameters:
+* $1 - the revision ID being undone
+See also:
+* {{msg-mw|Undo-summary}}',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Used as title of the error message {{msg-mw|Cantcreateaccount-text}}.',
@@ -2507,6 +2727,7 @@ See also:
 
 This message has sometimes a tooltip {{msg-mw|tooltip-undo}}
 {{Identical|Undo}}',
+'diff-empty' => 'This message appears instead of a "diff" when comparing two revisions that are identical.',
 'diff-multi' => "This message appears in the revision history of a page when comparing two versions which aren't consecutive.
 
 Parameters:
@@ -2600,9 +2821,6 @@ Parameters:
 
 Parameters:
 * $1 - page title',
-'searchhelp-url' => 'Description: The URL of the search help page.
-{{doc-important|Do not change the "<tt>Help:</tt>" part.}}
-{{Identical|HelpContent}}',
 'searchmenu-prefix' => '{{doc-important|Do not translate "Special:PrefixIndex"}}
 Parameters:
 * $1 - prefix string',
@@ -2730,15 +2948,8 @@ See also:
 In this sentence, "their indexes" refers to "Google\'s indexes".
 
 Shown on [[Special:Search]] when the internal search is disabled.',
-
-# Quickbar
-'qbsettings' => 'The title of the section in [[Special:Preferences]], only shown when using the skins "Standard/Classic" or "Cologne Blue". The quicbar is the same as the sidebar.',
-'qbsettings-none' => '{{Identical|None}}',
-'qbsettings-fixedleft' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-fixedright' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-floatingleft' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-floatingright' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-directionality' => '"Fixed", as in the position "fixed left or right". For left-to-right languages, the quickbar will be positioned at the left, for right-to-left languages at the right.',
+'search-error' => 'Shown when an error has occurred when performing a search
+* $1 is the localized error that was returned',
 
 # Preferences page
 'preferences' => 'Title of the [[Special:Preferences]] page.
@@ -2818,7 +3029,6 @@ Also used as label for the Submit button in [[Special:Preferences/reset]].',
 'prefs-editing' => 'Title of a tab in [[Special:Preferences]].
 When changing this message, please also update {{msg-mw|vector-editwarning-warning}} which references to this message.
 {{Identical|Editing}}',
-'prefs-edit-boxsize' => 'Used on [[Special:Preferences]].',
 'rows' => 'Used on [[Special:Preferences]], "Editing" section in the "Size of editing window" fieldset.
 {{Identical|Row}}',
 'columns' => 'Used on [[Special:Preferences]], "Editing" section in the "Size of editing window" fieldset',
@@ -2836,7 +3046,7 @@ See also:
 * {{msg-mw|Prefs-watchlist-days-max}}',
 'recentchangescount' => 'Used in [[Special:Preferences]], tab "Recent changes".',
 'prefs-help-recentchangescount' => 'Used in [[Special:Preferences]], tab "Recent changes".',
-'prefs-help-watchlist-token' => 'Used in [[Special:Preferences]], tab Watchlist.',
+'prefs-help-watchlist-token2' => 'Used in [[Special:Preferences]], tab Watchlist. (Formerly in {{msg-mw|prefs-help-watchlist-token}}.)',
 'savedprefs' => 'This message appears after saving changes to your user preferences.',
 'timezonelegend' => '{{Identical|Time zone}}',
 'localtime' => 'Used as label in [[Special:Preferences#mw-prefsection-datetime|preferences]].',
@@ -2884,7 +3094,6 @@ Parameters:
 'prefs-common-css-js' => 'Used as label in [[Special:Preferences#mw-prefsection-rendering|preferences]], tab "Appearance", section "Skin".',
 'prefs-reset-intro' => 'Used in [[Special:Preferences/reset]].',
 'prefs-emailconfirm-label' => 'Sub-heading in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.',
-'prefs-textboxsize' => "Header for the box specifying the size of the editing window, displayed on the 'editing' tab of the [[Special:Preferences|user preferences]] special page.",
 'youremail' => 'Label of the e-mail text box of the "E-mail options" section of [[Special:Preferences]].
 Also used on create account form.
 
@@ -2986,6 +3195,11 @@ See also:
 'prefs-timeoffset' => 'Used in [[Special:Preferences]], tab "Date and time".',
 'prefs-advancedediting' => 'Used in [[Special:Preferences]], tab "Editing".
 This used to say "Advanced options", the key name is a left over from that.',
+'prefs-editor' => 'Used in [[Special:Preferences]], tab "Editing" ({{int:prefs-editing}}).
+
+{{Identical|Editor}}',
+'prefs-preview' => 'Used in [[Special:Preferences]], tab "Editing".
+{{Identical|Preview}}',
 'prefs-advancedrc' => 'Used in [[Special:Preferences]], tab "Recent changes".
 {{Identical|Advanced options}}',
 'prefs-advancedrendering' => 'Used in [[Special:Preferences]], tab "Appearence".
@@ -3008,7 +3222,15 @@ Used in [[Special:Preferences]], tab "Search options". The display options refer
 Used in [[Special:Preferences]], tab "Watchlist". The display options refer to:
 * {{msg-mw|Prefs-watchlist-days}}
 * {{msg-mw|Prefs-watchlist-edits}}',
+'prefs-tokenwatchlist' => 'Section heading.
+Used in [[Special:Preferences]], tab "Watchlist".
+{{Identical|Token}}',
 'prefs-diffs' => 'Used in [[Special:Preferences]], tab "Misc".',
+'prefs-help-prefershttps' => 'Used as help text for the checkbox in [[Special:Preferences]].
+
+The checkbox has the label {{msg-mw|Tog-prefershttps}}.
+
+See example: [[mw:Special:Preferences]].',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Used as hint for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is valid.',
@@ -3077,6 +3299,8 @@ Parameters:
 'userrights-irreversible-marker' => '{{optional}}
 Parameters:
 * $1 - group member',
+'userrights-conflict' => "Shown on [[Special:UserRights]] if the target's rights have been changed since the form was loaded.",
+'userrights-removed-self' => 'Shown on [[Special:UserRights]] in a green box after the user removed its own rights to access that page.',
 
 # Groups
 'group' => '{{Identical|Group}}',
@@ -3226,7 +3450,16 @@ This user automatically bypasses IP blocks, auto-blocks and range blocks - so I
 'right-proxyunbannable' => '{{doc-right|proxyunbannable}}',
 'right-unblockself' => '{{doc-right|unblockself}}',
 'right-protect' => '{{doc-right|protect}}',
-'right-editprotected' => '{{doc-right|editprotected}}',
+'right-editprotected' => '{{doc-right|editprotected}}
+Refers to {{msg-mw|Protect-level-sysop}}.
+
+See also:
+* {{msg-mw|Right-editsemiprotected}}',
+'right-editsemiprotected' => '{{doc-right|editsemiprotected}}
+Refers to {{msg-mw|Protect-level-autoconfirmed}}.
+
+See also:
+* {{msg-mw|Right-editprotected}}',
 'right-editinterface' => '{{doc-right|editinterface}}',
 'right-editusercssjs' => '{{doc-right|editusercssjs}}',
 'right-editusercss' => '{{doc-right|editusercss}}
@@ -3235,6 +3468,17 @@ See also:
 'right-edituserjs' => '{{doc-right|edituserjs}}
 See also:
 * {{msg-mw|Right-editmyuserjs}}',
+'right-editmyusercss' => '{{doc-right|editmyusercss}}
+See also:
+* {{msg-mw|Right-editusercss}}',
+'right-editmyuserjs' => '{{doc-right|editmyuserjs}}
+See also:
+* {{msg-mw|Right-edituserjs}}',
+'right-viewmywatchlist' => '{{doc-right|viewmywatchlist}}',
+'right-editmywatchlist' => '{{doc-right|editmywatchlist}}',
+'right-viewmyprivateinfo' => '{{doc-right|viewmyprivateinfo}}',
+'right-editmyprivateinfo' => '{{doc-right|editmyprivateinfo}}',
+'right-editmyoptions' => '{{doc-right|editmyoptions}}',
 'right-rollback' => '{{doc-right|rollback}}
 {{Identical|Rollback}}',
 'right-markbotedits' => '{{doc-right|markbotedits}}
@@ -3309,6 +3553,12 @@ This action allows editing of all of the "user rights", not just the rights of t
 'action-userrights-interwiki' => '{{Doc-action|userrights-interwiki}}',
 'action-siteadmin' => '{{Doc-action|siteadmin}}',
 'action-sendemail' => '{{doc-action|sendemail}}',
+'action-editmywatchlist' => '{{doc-action|editmywatchlist}}
+{{Identical|Edit your watchlist}}',
+'action-viewmywatchlist' => '{{doc-action|viewmywatchlist}}
+{{Identical|View your watchlist}}',
+'action-viewmyprivateinfo' => '{{doc-action|viewmyprivateinfo}}',
+'action-editmyprivateinfo' => '{{doc-action|editmyprivateinfo}}',
 
 # Recent changes
 'nchanges' => 'Appears on enhanced watchlist and recent changes when page has more than one change on given date, linking to a diff of the changes.
@@ -3316,6 +3566,17 @@ This action allows editing of all of the "user rights", not just the rights of t
 Parameters:
 * $1 - the number of changes on that day (2 or more)
 Three messages are shown side-by-side: ({{msg-mw|Nchanges}} | {{msg-mw|Enhancedrc-since-last-visit}} | {{msg-mw|Enhancedrc-history}}).',
+'enhancedrc-since-last-visit' => "Appears on enhanced watchlist and recent changes when page has more than one change on given date and at least one that the user hasn't seen yet, linking to a diff of the unviewed changes.
+
+Parameters:
+* $1 - the number of unviewed changes (1 or more)
+Three messages are shown side-by-side: ({{msg-mw|nchanges}} | {{msg-mw|enhancedrc-since-last-visit}} | {{msg-mw|enhancedrc-history}}).",
+'enhancedrc-history' => 'Appears on enhanced watchlist and recent changes when page has more than one change on given date, linking to its history.
+
+This is the same as {{msg-mw|hist}}, but not abbreviated.
+
+Three messages are shown side-by-side: ({{msg-mw|nchanges}} | {{msg-mw|enhancedrc-since-last-visit}} | {{msg-mw|enhancedrc-history}}).
+{{Identical|History}}',
 'recentchanges' => 'The text of the link in sidebar going to the special page [[Special:RecentChanges]]. Also the page title of that special page.
 
 See also:
@@ -3325,6 +3586,7 @@ See also:
 {{Identical|Recent changes}}',
 'recentchanges-legend' => 'Legend of the fieldset of [[Special:RecentChanges]]',
 'recentchanges-summary' => 'Summary of [[Special:RecentChanges]].',
+'recentchanges-noresult' => 'Used in [[Special:RecentChanges]], [[Special:RecentChangesLinked]], and [[Special:Watchlist]] when there are no changes to be shown.',
 'recentchanges-feed-description' => 'Used in feed of RecentChanges. See example [{{canonicalurl:Special:RecentChanges|feed=atom}} feed].',
 'recentchanges-label-newpage' => 'Tooltip for {{msg-mw|newpageletter}}',
 'recentchanges-label-minor' => 'Tooltip for {{msg-mw|minoreditletter}}',
@@ -3447,7 +3709,6 @@ This message is followed by {{msg-mw|Recentchangeslinked-feed}}.
 
 Parameters:
 * \$1 - the name of the page for which related changes are shown",
-'recentchangeslinked-noresult' => 'Used in [[Special:RecentChangesLinked]], when there are no changes.',
 'recentchangeslinked-summary' => 'Summary of [[Special:RecentChangesLinked]].',
 'recentchangeslinked-page' => '{{Identical|Page name}}',
 'recentchangeslinked-to' => 'Checkbox in [[Special:RecentChangesLinked]].',
@@ -3480,8 +3741,12 @@ See also:
 * {{msg-mw|reuploaddesc|button text}}',
 'uploadnologin' => 'Used as title of the error message {{msg-mw|Uploadnologintext}}.
 {{Identical|Not logged in}}',
-'uploadnologintext' => 'Used as error message. The title for this message is {{msg-mw|Uploadnologin}}.
+'uploadnologintext' => 'Used as error message.
+
+The title for this message is {{msg-mw|Uploadnologin}}.
 
+Parameters:
+* $1 - link text {{msg-mw|Loginreqlink}}. The link points to [[Special:UserLogin]].
 See also:
 * {{msg-mw|Whitelistedittext}}
 * {{msg-mw|Nocreatetext}}
@@ -4127,12 +4392,6 @@ See also:
 Known messages are:
 * {{msg-mw|http-host-unreachable}}
 * {{msg-mw|http-timed-out}}',
-'http-host-unreachable' => 'Used as error message when executing HTTP request.
-
-See also:
-* {{msg-mw|Http-request-error}}
-* {{msg-mw|Http-read-error}}
-* {{msg-mw|Http-timed-out|28}}',
 'http-bad-status' => 'Parameters:
 * $1 - an HTTP error code (e.g. 404)
 * $2 - the HTTP error message (e.g. File Not Found)',
@@ -4196,6 +4455,24 @@ See also:
 {{Identical|Description}}',
 'listfiles_count' => 'One of the table column headers in [[Special:Listfiles]] denoting the amount of saved versions of that file.
 {{Identical|Version}}',
+'listfiles-show-all' => 'Used as checkbox label in [[Special:ListFiles]].',
+'listfiles-latestversion' => 'Used as label for the field.
+
+This probably means "The latest version".
+
+Followed by any one of the following messages:
+* {{msg-mw|Listfiles-latestversion-yes}}
+* {{msg-mw|Listfiles-latestversion-no}}',
+'listfiles-latestversion-yes' => 'Used as value for the field which has the label {{msg-mw|Listfiles-latestversion}}.
+
+See also:
+* {{msg-mw|Listfiles-latestversion-no}}
+{{Identical|Yes}}',
+'listfiles-latestversion-no' => 'Used as value for the field which has the label {{msg-mw|Listfiles-latestversion}}.
+
+See also:
+* {{msg-mw|Listfiles-latestversion-yes}}
+{{Identical|No}}',
 
 # File description page
 'file-anchor-link' => '{{Identical|File}}',
@@ -4455,6 +4732,28 @@ See also:
 See also:
 * {{msg-mw|Randomredirect-nopages}}',
 
+# Random page in category
+'randomincategory' => '{{doc-special|RandomInCategory}}',
+'randomincategory-invalidcategory' => 'Message shown if an invalid category is specified.
+
+Parameters:
+* $1 - the invalid category name given
+
+(Note, if the category is simply empty, but could possibly exist, {{msg-mw|randomincategory-nopages}} is shown instead)',
+'randomincategory-nopages' => 'Message shown from [[Special:RandomInCategory]] if the category is empty.
+
+Parameters:
+* $1 - the category name (without the namespace prefix)',
+'randomincategory-selectcategory' => 'Shown on [[Special:RandomInCategory]] if no category is selected.
+
+Displays a form allowing the user to input a category name.
+
+Parameters:
+* $1 - the text field input box
+* $2 - the go button which has the label {{msg-mw|randomincategory-selectcategory-submit}}.',
+'randomincategory-selectcategory-submit' => 'Used as label for the Submit button which is used as <code>$2</code> in {{msg-mw|Randomincategory-selectcategory}}.
+{{Identical|Go}}',
+
 # Random redirect
 'randomredirect' => '{{doc-special|RandomRedirect}}',
 'randomredirect-nopages' => 'Parameters:
@@ -4495,16 +4794,6 @@ Used in [[Special:Statistics]].',
 * \$1 - Value of <code>\$wgRCMaxAge</code> in days",
 'statistics-mostpopular' => 'Used in [[Special:Statistics]]',
 
-'disambiguations' => '{{doc-special|Disambiguations}}',
-'disambiguationspage' => 'This message is the name of the template used for marking disambiguation pages. It is used by [[Special:Disambiguations]] to find all pages which link to disambiguation pages.
-
-{{doc-important|Don\'t translate the "Template:" part!}}
-{{Identical|Template:disambig}}',
-'disambiguations-text' => '{{doc-important|Do not change the link "<code><nowiki>[[MediaWiki:Disambiguationspage]]</nowiki></code>", even because it is listed as problematic. Be sure the "D" is in uppercase, so not "d".}}
-This block of text is shown on [[:Special:Disambiguations]].
-
-\'\'\'Background information:\'\'\' Beyond telling about links going to disambiguation pages, that they are generally bad, it should explain which pages in the article namespace are seen as disambiguations: [[MediaWiki:Disambiguationspage]] usually holds a list of disambiguation templates of the local wiki. Pages linking to one of them (by transclusion) will count as disambiguation pages. Pages linking to these disambiguation pages, instead to the disambiguated article itself, are listed on [[:Special:Disambiguations]].',
-
 'pageswithprop' => '{{doc-special|PagesWithProp}}
 {{Identical|Page with page property}}',
 'pageswithprop-legend' => 'Legend for the input form on [[Special:PagesWithProp]].
@@ -4514,6 +4803,18 @@ This block of text is shown on [[:Special:Disambiguations]].
 {{Identical|Property name}}',
 'pageswithprop-submit' => 'Label for the submit button on [[Special:PagesWithProp]].
 {{Identical|Go}}',
+'pageswithprop-prophidden-long' => 'Information shown on [[Special:PagesWithProp]] when property value is longer than 1 kilobyte.
+
+Parameters:
+* $1 - size of property value in kilobytes
+See also:
+* {{msg-mw|pageswithprop-prophidden-binary}}',
+'pageswithprop-prophidden-binary' => 'Information shown on [[Special:PagesWithProp]] when property value contains binary data.
+
+Parameters:
+* $1 - size of property value in kilobytes
+See also:
+* {{msg-mw|pageswithprop-prophidden-long}}',
 
 'doubleredirects' => '{{doc-special|DoubleRedirects}}',
 'doubleredirectstext' => 'Shown on top of [[Special:Doubleredirects]]',
@@ -4619,6 +4920,11 @@ Parameters:
 'prefixindex' => '{{doc-special|PrefixIndex}}
 When the user limits the list to a certain namespace, {{msg-mw|allinnamespace}} is used instead.',
 'prefixindex-namespace' => 'The page title of [[Special:PrefixIndex]] limited to a specific namespace. Similar to {{msg-mw|allinnamespace}}. $1 is the name of the namespace',
+'prefixindex-strip' => 'Label for a checkbox. If the checkbox is checked, the prefix searched will be removed from the title displayed in the list. Used in [[Special:PrefixIndex]].
+
+See the following search results:
+* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10}} Special:PrefixIndex?prefix=Doc&namespace=10] (prefix NOT stripped)
+* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10&stripprefix=1}} Special:PrefixIndex?prefix=Doc&namespace=10&stripprefix=1] (prefix stripped)',
 'shortpages' => '{{doc-special|ShortPages}}',
 'longpages' => '{{doc-special|LongPages}}',
 'deadendpages' => '{{doc-special|DeadendPages}}',
@@ -4634,6 +4940,7 @@ When the user limits the list to a certain namespace, {{msg-mw|allinnamespace}}
 'listusers' => '{{doc-special|ListUsers}}',
 'listusers-editsonly' => 'Option in [[Special:ListUsers]].',
 'listusers-creationsort' => 'Option in [[Special:ListUsers]].',
+'listusers-desc' => 'Used as label for the checkbox.',
 'usereditcount' => 'Shown behind every username on [[Special:ListUsers]]. Parameters:
 * $1 - number of edits',
 'usercreated' => 'Used in [[Special:ListUsers]]. Parameters:
@@ -5078,7 +5385,6 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
 
 See also:
 * {{msg-mw|Cantrollback}}',
-'watchnochange' => 'Used in [[Special:Watchlist]] if there is nothing to show.',
 'watchlist-details' => 'Message on [[Special:Watchlist]]. Parameters:
 * $1 - number of pages in your watchlist
 This is paired with the message {{msg-mw|Nowatchlist}} which appears instead of Watchlist-details when $1 is 0.
@@ -5087,13 +5393,12 @@ See also:
 * {{msg-mw|Wlheader-enotif|watchlist header}}
 * {{msg-mw|enotif reset|Submit button text}}
 * {{msg-mw|Watchlistcontains}}',
-'wlheader-enotif' => 'Used in [[Special:Watchlist]].
+'wlheader-enotif' => 'Message at the top of [[Special:Watchlist]], after {{msg-mw|watchlist-details}}. Has to be a full sentence.
 
 See also:
 * {{msg-mw|Watchlist-options|fieldset}}
-* {{msg-mw|Watchlist-details|watchlist header}}
 * {{msg-mw|enotif reset|Submit button text}}',
-'wlheader-showupdated' => 'This message shows up near top of users watchlist page.',
+'wlheader-showupdated' => 'Message at the top of [[Special:Watchlist]], after {{msg-mw|watchlist-details}}. Has to be a full sentence.',
 'watchmethod-recent' => 'See also:
 * {{msg-mw|Watchmethod-list}}',
 'watchmethod-list' => 'See also:
@@ -5745,6 +6050,7 @@ See also:
 'contribsub2' => 'Contributions for "user" (links). Parameters:
 * $1 is an IP address or a username, with a link which points to the user page (if registered user).
 * $2 is list of tool links. The list contains a link which has text {{msg-mw|Sp-contributions-talk}}.
+* $3 is a plain text username used for GENDER.
 {{Identical|For $1}}',
 'nocontribs' => 'Used in [[Special:Contributions]] and [[Special:DeletedContributions]].
 
@@ -6312,33 +6618,18 @@ See also:
 * {{msg-mw|Range block disabled}}
 * {{msg-mw|Ip range invalid}}
 * {{msg-mw|Ip range toolarge}}',
-'blockme' => '{{doc-special|BlockMe|unlisted=1}}
-This feature is disabled by default.',
 'proxyblocker' => 'Used in [[Special:BlockMe]].
 
 See also:
 * {{msg-mw|proxyblocker-disabled}}
 * {{msg-mw|proxyblockreason}}
 * {{msg-mw|proxyblocksuccess}}',
-'proxyblocker-disabled' => 'Used in [[Special:BlockMe]].
-
-See also:
-* {{msg-mw|proxyblocker}}
-* {{msg-mw|proxyblockreason}}
-* {{msg-mw|proxyblocksuccess}}',
 'proxyblockreason' => 'Used as explanation of the reason in [[Special:BlockMe]].
 
 See also:
 * {{msg-mw|proxyblocker-disabled}}
 * {{msg-mw|proxyblocker}}
 * {{msg-mw|proxyblocksuccess}}',
-'proxyblocksuccess' => 'Used in [[Special:BlockMe]].
-
-See also:
-* {{msg-mw|proxyblocker-disabled}}
-* {{msg-mw|proxyblocker}}
-* {{msg-mw|proxyblockreason}}
-{{Identical|Done}}',
 'sorbs' => '{{optional}}',
 'sorbsreason' => 'See also:
 * {{msg-mw|Sorbsreason}}
@@ -6348,6 +6639,8 @@ See also:
 See also:
 * {{msg-mw|Sorbsreason}}
 * {{msg-mw|Sorbs create account_reason}}',
+'xffblockreason' => "This text is shown to the user as a block reason and describes that the user is being blocked because an IP in the X-Forwarded-For header (which lists the user's IP as well as all IPs of the transparent proxy servers they went through) sent when they loaded the page has been blocked:
+* $1 is the original block reason for the IP address matched in the X-Forwarded-For header",
 'cant-see-hidden-user' => 'Used as (red) error message on [[Special:Block]] when you try to change (as sysop without the hideuser right) the block of a hidden user.',
 'ipbblocked' => 'Error message shown when a user tries to alter block settings when they are themselves blocked.',
 'ipbnounblockself' => 'Error message shown when a user without the <code>unblockself</code> right tries to unblock themself.',
@@ -6863,6 +7156,11 @@ The reason $1 is one of the following messages:
 * {{msg-mw|Djvu page error}}
 * {{msg-mw|Svg-long-error}}
 * other custom string',
+'thumbnail_error_remote' => 'Message shown in a thumbnail frame when creation of the thumbnail fails.
+
+Parameters:
+* $1 - the name of the shared repository, see {{msg-mw|Sharedupload}}
+* $2 - the reason, see {{msg-mw|Thumbnail error}}',
 'djvu_page_error' => 'Used as error message.
 
 See also:
@@ -7542,23 +7840,19 @@ See also:
 * {{msg-mw|Summary}}
 * {{msg-mw|Accesskey-summary}}
 * {{msg-mw|Tooltip-summary}}',
+'interlanguage-link-title' => 'Format of a sidebar interwiki link tooltip. Parameters:
+* $1 - page name in the target wiki
+* $2 - target wiki language autonym',
 
 # Stylesheets
 'common.css' => '{{optional}}
 CSS applied to all users.',
-'standard.css' => '{{optional}}',
-'nostalgia.css' => 'CSS file for the nostalgia skin',
 'cologneblue.css' => '{{optional}}',
 'monobook.css' => '{{optional}}
 CSS applied to users using Monobook skin.',
-'myskin.css' => '{{optional}}',
-'chick.css' => '{{optional}}',
-'simple.css' => '{{optional}}',
 'modern.css' => '{{optional}}',
 'vector.css' => '{{optional}}',
 'print.css' => '{{optional}}',
-'handheld.css' => '{{optional}}
-Style that can be applied on [[w:handheld devices|handheld devices]] (e.g. mobile phones), <code>$wgHandheldStyle</code> is an optional configuration variable which specifies a style sheet file for handheld devices.',
 'noscript.css' => '{{optional}}',
 'group-autoconfirmed.css' => '{{doc-group|autoconfirmed|css}}',
 'group-bot.css' => '{{doc-group|bot|css}}',
@@ -7568,14 +7862,9 @@ Style that can be applied on [[w:handheld devices|handheld devices]] (e.g. mobil
 # Scripts
 'common.js' => '{{optional}}
 JS for all users.',
-'standard.js' => '{{optional}}',
-'nostalgia.js' => 'JS file for the nostalgia skin',
 'cologneblue.js' => '{{optional}}',
 'monobook.js' => '{{optional}}
 JS for users using Monobook skin.',
-'myskin.js' => '{{optional}}',
-'chick.js' => '{{optional}}',
-'simple.js' => '{{optional}}',
 'modern.js' => '{{optional}}',
 'vector.js' => '{{optional}}',
 'group-autoconfirmed.js' => '{{doc-group|autoconfirmed|js}}',
@@ -7798,14 +8087,8 @@ See also:
 * {{msg-mw|Pageinfo-category-subcats}}',
 
 # Skin names
-'skinname-standard' => '{{optional}}
-{{Identical|Classic}}',
-'skinname-nostalgia' => 'Name of Nostalgia skin',
 'skinname-cologneblue' => '{{optional}}',
 'skinname-monobook' => '{{optional}}',
-'skinname-myskin' => '{{optional}}',
-'skinname-chick' => '{{optional}}',
-'skinname-simple' => '{{optional}}',
 'skinname-modern' => '{{optional}}',
 'skinname-vector' => '{{optional}}',
 
@@ -8054,6 +8337,8 @@ See also {{msg-mw|hours-abbrev}}, {{msg-mw|hours-ago}}.',
 See also {{msg-mw|Days-abbrev}}
 
 {{Identical|Day}}',
+'weeks' => 'Full word for "weeks". Parameters:
+* $1 is the number of weeks',
 'months' => 'Full word for "months". $1 is the number of months.',
 'years' => 'Full word for "years".
 
@@ -8064,6 +8349,60 @@ Parameters:
 {{Identical|Ago}}',
 'just-now' => 'Phrase for indicating something happened just now.',
 
+# Human-readable timestamps
+'hours-ago' => 'Phrase for indicating that something occurred a certain number of hours ago.
+
+Parameters:
+* $1 - number of hours',
+'minutes-ago' => 'Phrase for indicating that something occurred a certain number of minutes ago.
+
+Parameters:
+* $1 - number of minutes',
+'seconds-ago' => 'Phrase for indicating that something occurred a certain number of seconds ago.
+
+Parameters:
+* $1 - number of seconds',
+'monday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Monday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+'tuesday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Tuesday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+'wednesday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Wednesday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+'thursday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Thursday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+'friday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Friday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+'saturday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Saturday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+'sunday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Sunday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+'yesterday-at' => 'Phrase for indicating that something occurred at a particular time yesterday.
+
+Parameters:
+* $1 - the time (localized)
+{{Related|Day-at}}',
+
 # Bad image list
 'bad_image_list' => '箇条信息只出现在引导管理员用正确个格式加链接。弗会徕Mediawiki别荡处出现。',
 
@@ -8175,7 +8514,7 @@ Parameters:
 'metadata-langitem-default' => '{{optional}}
 Similar to "metadata-langitem" but for the case where a multilingual property has a default specified that does not specify what language the default is in. $1 is the value of the property.',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 {{Identical|Width}}',
 'exif-imagelength' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
@@ -8628,7 +8967,7 @@ Parameters:
 * $1 - numeric IPTC subject news code (one of http://cv.iptc.org/newscodes/subjectcode )
 * $2 - one of 17 broad categories that the code falls into. For example any code starting with 15 has the contents of {{msg-mw|Exif-iimcategory-spo}} for $2.',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '{{Related|Exif-compression}}',
 'exif-compression-2' => '{{Related|Exif-compression}}',
 'exif-compression-3' => '{{Related|Exif-compression}}',
@@ -9196,7 +9535,6 @@ px is the abbreviation for "pixel".',
 'comma-separator' => '{{optional}}',
 'colon-separator' => "{{optional}}
 Change it only if your language uses another character for ':' or it needs an extra space before the colon.",
-'autocomment-prefix' => '{{optional}}',
 'pipe-separator' => '{{optional}}',
 'word-separator' => '{{optional}}
 This is a string which is (usually) put between words of the language. It is used, e.g. when messages are concatenated (appended to each other). Note that you must express a space as html entity &amp;#32; because the editing and updating process strips leading and trailing spaces from messages.
@@ -9552,7 +9890,6 @@ This message is followed by the list of SPAM prevention extensions.',
 'version-mediahandlers' => 'Used in [[Special:Version]]. It is the title of a section for media handler extensions (e.g. [[mw:Extension:OggHandler]]).
 There are no such extensions here, so look at [[wikipedia:Special:Version]] for an example.',
 'version-hooks' => 'Shown in [[Special:Version]]',
-'version-extension-functions' => 'Shown in [[Special:Version]]',
 'version-parser-extensiontags' => 'Part of [[Special:Version]].
 This message is followed by the list of parser extension tags like <code><nowiki><charinsert></nowiki></code>, <code><nowiki><coordinates></nowiki></code>, etc.',
 'version-parser-function-hooks' => 'Shown in [[Special:Version]]',
@@ -9574,6 +9911,11 @@ Used in [[Special:Version]], preceeding the Subversion revision numbers of the e
 * $1 - the current year
 * $2 - a list of selected MediaWiki authors',
 'version-poweredby-others' => "Used at the end of {{msg-mw|version-poweredby-credits}} on [[Special:Version]]. First, there's a long list of selected MediaWiki authors, then a comma and then this translation, which is supposed to credit the many other people than developer helping with MediaWiki.",
+'version-poweredby-translators' => 'Used as label for a link to [[Translating:MediaWiki/Credits]].
+
+Preceded by {{msg-mw|version-poweredby-others}} and {{msg-mw|and}}.
+
+Used at the end of {{msg-mw|version-poweredby-credits}} on [[Special:Version]].',
 'version-credits-summary' => 'Summary of the [[Special:Version/Credits]] sub page, which lists all developers etc. who contributed to MediaWiki. Shown at the top.',
 'version-license-info' => '[[wikipedia:GNU GPL|GNU GPL]] notice shown at [[Special:Version]]. See //www.gnu.org/licenses/old-licenses/gpl-2.0-translations.html for available translations.',
 'version-software' => 'Message shown on [[Special:Version]].
@@ -9590,14 +9932,29 @@ A short description of the article path entry point. Links to the mediawiki.org
 'version-entrypoints-scriptpath' => '{{Optional}}
 A short description of the script path entry point. Links to the mediawiki.org documentation page for $wgScriptPath.',
 
-# Special:FilePath
-'filepath' => 'Legend of fieldset around input box in [[Special:FilePath]].',
-'filepath-page' => 'Shown next to input box in [[Special:FilePath]]
-
-{{Identical|File}}',
-'filepath-submit' => 'Button label in [[Special:FilePath]].
+# Special:Redirect
+'redirect' => "{{doc-special|Redirect}}
+This means \"Redirect by file'''name''', user '''ID''', or revision ID\".",
+'redirect-legend' => 'Legend of fieldset around input box in [[Special:Redirect]]',
+'redirect-summary' => 'Shown at top of [[Special:Redirect]]',
+'redirect-submit' => 'Button label in [[Special:Redirect]].
 {{Identical|Go}}',
-'filepath-summary' => 'Shown in [[Special:FilePath]]',
+'redirect-lookup' => 'First field label in [[Special:Redirect]].
+
+Followed by the select box which has the following options:
+* {{msg-mw|Redirect-user}}
+* {{msg-mw|Redirect-revision}}
+* {{msg-mw|Redirect-file}}',
+'redirect-value' => 'Second field label in [[Special:Redirect]]
+{{Identical|Value}}',
+'redirect-user' => 'Description of lookup type for [[Special:Redirect]].
+{{Identical|User ID}}',
+'redirect-revision' => "Description of lookup type for [[Special:Redirect]].
+
+This means \"Page revision '''ID'''\".",
+'redirect-file' => 'Description of lookup type for [[Special:Redirect]].
+{{Identical|Filename}}',
+'redirect-not-exists' => 'Used as error message in [[Special:Redirect]]',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Name of special page [[Special:FileDuplicateSearch]].',
@@ -9673,12 +10030,33 @@ It appears that the word 'valid' describes 'tags', not 'change'. It also appears
 'tag-filter-submit' => 'Caption of the submit button displayed next to the tag filter on lists of changes (e.g. [[Special:Log]], [[Special:Contributions]], [[Special:Newpages]], [[Special:Recentchanges]], [[Special:Recentchangeslinked]], page histories)
 
 {{Identical|Filter}}',
+'tag-list-wrapper' => 'Wrapper for the list of tags shown on recent changes, watchlists, history pages and diffs.
+
+Parameters:
+* $1 - number of distinct tags for given edit
+* $2 - comma-separated list of tags for given edit',
 'tags-title' => 'The title of [[Special:Tags]]',
 'tags-intro' => 'Explanation on top of [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
 'tags-tag' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
 'tags-display-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
 'tags-description-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
+'tags-active-header' => 'Caption of a column in [[Special:Tags]]. Values are "Yes" or "No" to indicate if a tag that was ever used is current still registered.
+
+See example: [[mw:Special:Tags]].
+
+For more information on tags see [[mw:Manual:Tags|MediaWiki]].
+{{Identical|Active}}',
 'tags-hitcount-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].',
+'tags-active-yes' => 'Table cell contents if given tag is "active".
+
+See also:
+* {{msg-mw|Tags-active-no}}
+{{Identical|Yes}}',
+'tags-active-no' => 'Table cell contents if given tag is not "active".
+
+See also:
+* {{msg-mw|Tags-active-yes}}
+{{Identical|No}}',
 'tags-edit' => 'Used on [[Special:Tags]]. Verb. Used as display text on a link to create/edit a description.
 {{Identical|Edit}}',
 'tags-hitcount' => 'Shown in the "{{msg-mw|Tags-hitcount-header}}" column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].
@@ -9710,6 +10088,10 @@ Parameters:
 * $1 - database server name
 See also:
 * {{msg-mw|Dberr-info-hidden}} - hides database server name',
+'dberr-info-hidden' => 'This message does not allow any wiki nor html markup.
+
+See also:
+* {{msg-mw|Dberr-info}} - shows database server name',
 'dberr-usegoogle' => 'This message does not allow any wiki nor html markup.',
 'dberr-outofdate' => "{{doc-singularthey}}
 In this sentence, '''their''' indexes refers to '''Google's''' indexes. This message does not allow any wiki nor html markup.",
@@ -9783,6 +10165,11 @@ See also:
 * stub threshold (appearance tab)
 
 {{Identical|Other}}',
+'htmlform-no' => 'Used in form, such as with radio buttons, for generic yes / no questions.
+{{Identical|No}}',
+'htmlform-yes' => 'Used in form, such as with radio buttons, for generic yes / no questions.
+{{Identical|Yes}}',
+'htmlform-chosen-placeholder' => 'Used as initial placeholder text in select multiple "chosen" input boxes',
 
 # SQLite database support
 'sqlite-has-fts' => 'Shown on [[Special:Version]].
@@ -10056,4 +10443,59 @@ Parameters:
 'rotate-comment' => 'Edit summary for the act of rotating an image. Parameters:
 * $1 - degrees to rotate image clockwise',
 
+# Limit report
+'limitreport-title' => 'Title for the preview limit report table.',
+'limitreport-cputime' => 'Label for the "CPU time usage" row in the limit report table.
+
+See also:
+* {{msg-mw|Limitreport-walltime}}',
+'limitreport-cputime-value' => 'Format for the "CPU time usage" value in the limit report table. Parameters:
+* $1 - the time usage in seconds
+{{Identical|Second}}',
+'limitreport-walltime' => 'Label for the "Real time usage" row in the limit report table.
+
+See also:
+* {{msg-mw|Limitreport-cputime}}',
+'limitreport-walltime-value' => 'Format for the "Real time usage" value in the limit report table. Parameters:
+* $1 - the time usage in seconds
+{{Identical|Second}}',
+'limitreport-ppvisitednodes' => 'Label for the "Preprocessor visited node count" row in the limit report table',
+'limitreport-ppvisitednodes-value' => '{{optional}}
+Format for the "Preprocessor visited node count" row in the limit report table.
+
+Parameters:
+* $1 - the usage
+* $2 - the maximum',
+'limitreport-ppgeneratednodes' => 'Label for the "Preprocessor generated node count" row in the limit report table',
+'limitreport-ppgeneratednodes-value' => '{{optional}}
+Format for the "Preprocessor generated node count" row in the limit report table.
+
+Parameters:
+* $1 - the usage
+* $2 - the maximum',
+'limitreport-postexpandincludesize' => 'Label for the "Post-expand include size" row in the limit report table',
+'limitreport-postexpandincludesize-value' => 'Format for the "Post-expand include size" row in the limit report table. Parameters:
+* $1 - the usage (in bytes)
+* $2 - the maximum (in bytes)',
+'limitreport-templateargumentsize' => 'Label for the "Template argument size" row in the limit report table',
+'limitreport-templateargumentsize-value' => 'Format for the "Template argument size" row in the limit report table.
+
+Parameters:
+* $1 - the usage (in bytes)
+* $2 - the maximum (in bytes)',
+'limitreport-expansiondepth' => 'Label for the "Highest expansion depth" row in the limit report table',
+'limitreport-expansiondepth-value' => '{{optional}}
+Format for the "Highest expansion depth" row in the limit report table.
+
+Parameters:
+* $1 - the depth
+* $2 - the maximum',
+'limitreport-expensivefunctioncount' => 'Label for the "Expensive parser function count" row in the limit report table',
+'limitreport-expensivefunctioncount-value' => '{{optional}}
+Format for the "Expensive parser function count" row in the limit report table.
+
+Parameters:
+* $1 - the usage
+* $2 - the maximum',
+
 );
diff --git a/languages/messages/MessagesQu.php b/languages/messages/MessagesQu.php
index f5a570da..c03c5bf8 100644
--- a/languages/messages/MessagesQu.php
+++ b/languages/messages/MessagesQu.php
@@ -272,12 +272,12 @@ $messages = array(
 'tog-hidepatrolled' => "Patrullasqa llamk'apusqakunata ñaqha hukchasqapi pakay",
 'tog-newpageshidepatrolled' => "Patrullasqa llamk'apusqakunata musuq p'anqakunapi pakay",
 'tog-extendwatchlist' => "Watiqana sutisuyuta tukuy rurachinalla hukchaykunaman mast'ay, ama lliwmanta aswan ñaqhallachu",
-'tog-usenewrc' => "Huñu hukchasqakuna p'anqallakama ñaqha hukchasqakunapi watiqasqakunapipas (JavaScript nisqallawanmi llamk'an)",
+'tog-usenewrc' => "Huñu hukchasqakuna p'anqallakama ñaqha hukchasqakunapi watiqasqakunapipas",
 'tog-numberheadings' => "Uma siq'ikunata kikinmanta yupay",
 'tog-showtoolbar' => "Llamk'apuna sillwita rikuchiy",
-'tog-editondblclick' => "P'anqakunata llamk'apuy iskaylla ñit'iywan (JavaScript)",
+'tog-editondblclick' => "P'anqakunata llamk'apuy iskaylla ñit'iywan",
 'tog-editsection' => "Rakirilla llamk'apuyta saqillay [qillqay] t'inkiwan",
-'tog-editsectiononrightclick' => "Rakirilla llamk'apuyta saqillay paña butunta rakirip sutinpi ñit'ispa (JavaScript)",
+'tog-editsectiononrightclick' => "Rakirilla llamk'apuyta saqillay paña butunta rakirip sutinpi ñit'ispa",
 'tog-showtoc' => "Yuyarina wachuchasqata rikuchiy (kimsamanta aswan uma siq'iyuq p'anqakunapaq)",
 'tog-rememberpassword' => "Ruraqpa sutiyta yaykuna rimaytapas yuyaykuy kay llika wamp'unapi ({{PLURAL:$1|huk p'unchawkama|$1 p'unchawkama}})",
 'tog-watchcreations' => "Qallarisqay p'anqakunata churkusqay willañiqikunatapas watiqay",
@@ -295,10 +295,7 @@ $messages = array(
 'tog-shownumberswatching' => "Rikuchiy hayk'a watiqaq ruraqkuna",
 'tog-oldsig' => "Kachkaqña silq'uy:",
 'tog-fancysig' => "Silq'uyta wiki qillqa hinata llamk'achiy (mana kikinmanta t'inkichaq silq'uy)",
-'tog-externaleditor' => "Kikinmanta hawa llamk'apunata llamk'achiy (kamayuqkunallapaq, antañiqiqniykipi sapaq allinkachinakuna kananmi. [//www.mediawiki.org/wiki/Manual:External_editors Astawan ñawiriy.])",
-'tog-externaldiff' => "Kikinmanta hawa ''diff'' (wakin kay) nisqata llamk'achiy (kamayuqkunallapaq, antañiqiqniykipi sapaq allinkachinakuna kananmi. [//www.mediawiki.org/wiki/Manual:External_editors Astawan ñawiriy.])",
-'tog-showjumplinks' => "«Chayman phinkiy» aypanalla t'inkikunata saqillay",
-'tog-uselivepreview' => "''Live preview'' nisqa ñawpaq qhawayta llamk'achiy (JavaScript) (llamiy aknaraq)",
+'tog-uselivepreview' => "''Live preview'' nisqa ñawpaq qhawayta llamk'achiy (llamiy aknaraq)",
 'tog-forceeditsummary' => "Ch'usaq llamk'apuy waqaychasqa kachkaptinqa ch'itiyay.",
 'tog-watchlisthideown' => "Watiqasqaykunapiqa ñuqap llamk'apusqaykunata pakay",
 'tog-watchlisthidebots' => "Watiqasqaykunapiqa rurana antachakunap llamk'apusqankunata pakay",
@@ -311,6 +308,8 @@ $messages = array(
 'tog-showhiddencats' => 'Pakasqa katiguriyakunata rikuchiy',
 'tog-noconvertlink' => "T'inki suti t'ikrayman ama niy",
 'tog-norollbackdiff' => 'Ruraqpa hukchasqankunata kutichispa ama wakin kayta willaychu',
+'tog-useeditwarning' => "Yuyampaway p'anqata saqiptiy manaraq rurarqusqay hukchasqakunata waqaychaspay.",
+'tog-prefershttps' => "Yaykurqaspaqa hayk'appas takyasqa t'inkiwan llamk'ay",
 
 'underline-always' => "Hayk'appas",
 'underline-never' => "Mana hayk'appas",
@@ -374,6 +373,18 @@ $messages = array(
 'oct' => 'ukt',
 'nov' => 'nuw',
 'dec' => 'dis',
+'january-date' => '$1 ñiqin inirupi',
+'february-date' => '$1 ñiqin phiwrirupi',
+'march-date' => '$1 ñiqin marsupi',
+'april-date' => '$1 ñiqin awrilpi',
+'may-date' => '$1 ñiqin mayukillapi',
+'june-date' => '$1 ñiqin hunyupi',
+'july-date' => '$1 ñiqin hulyupi',
+'august-date' => '$1 ñiqin awustupi',
+'september-date' => '$1 ñiqin sitimripi',
+'october-date' => '$1 ñiqin uktuwripi',
+'november-date' => '$1 ñiqin nuwimripi',
+'december-date' => '$1 ñiqin disimripi',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Katiguriya|Katiguriyakuna}}',
@@ -399,7 +410,7 @@ $messages = array(
 'newwindow' => '(Musuq wintanam kichakun)',
 'cancel' => 'Ama niy',
 'moredotdotdot' => 'Aswan...',
-'morenotlisted' => 'Aswanqa sutisuyupi manam kanchu...',
+'morenotlisted' => "Kay sutisuyuqa manaraqmi hunt'asqachu.",
 'mypage' => "P'anqay",
 'mytalk' => 'Rimachinay',
 'anontalk' => 'Kay IP huchhapaq rimanakuy',
@@ -455,6 +466,7 @@ $messages = array(
 'create-this-page' => "Kay p'anqata kamariy",
 'delete' => 'Qulluy',
 'deletethispage' => "Kay p'anqata qulluy",
+'undeletethispage' => "Kay p'anqata qullusqamanta paqarichiy",
 'undelete_short' => "Paqarichiy {{PLURAL:$1|huk llamk'apusqa|$1 llamk'apusqa}}",
 'viewdeleted_short' => '{{PLURAL:$1|qullusqa hukchasqa|$1 qullusqa hukchasqa}} qhaway',
 'protect' => 'Amachay',
@@ -498,17 +510,16 @@ $1",
 'pool-queuefull' => "Suyana siq'iqa huntasqañam",
 'pool-errorunknown' => 'Mana riqsisqa pantasqa',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}manta',
 'aboutpage' => 'Project:{{SITENAME}}manta',
-'copyright' => "Ch'aqtasqakunataqa llamk'achinkiman <i>$1</i> nisqap ruraq hayñinkama",
+'copyright' => "Samiqwanqa llamk'ankiman $1 nisqa ruraq hayñikama, mana wakin hina willaptinqa.",
 'copyrightpage' => '{{ns:project}}:Ruraqpa hayñin',
 'currentevents' => 'Kunan pacha',
 'currentevents-url' => 'Project:Kunan pacha',
 'disclaimers' => 'Chiqakunamanta rikuchiy',
 'disclaimerpage' => 'Project:Sapsilla saywachasqa paqtachiy',
 'edithelp' => "Llamk'ana yanapay",
-'edithelppage' => 'Help:Qillqa yanapay',
 'helppage' => 'Help:Yanapana',
 'mainpage' => "Qhapaq p'anqa",
 'mainpage-description' => "Qhapaq p'anqa",
@@ -585,17 +596,6 @@ Allin sapaq p'anqakunataqa tarinki [[Special:SpecialPages|Sapaq p'anqakuna]] nis
 # General errors
 'error' => 'Pantasqa',
 'databaseerror' => 'Willañiqintin pantasqa',
-'dberrortext' => 'Willañiqimanta mañakuptiyki sintaksis pantasqam tukurqan.
-Llamp\'u kaq wakichipi pantasqachá.
-Qayna willañiqimanta mañakusqaqa karqan kaypacham:
-<blockquote><code>$1</code></blockquote>
-kay ruraypim: "<code>$2</code>".
-Willañiqintinpa kutichisqan pantasqaqa karqan "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Willañiqimanta mañakuptiyki sintaksis pantasqam tukurqan.
-Qayna willañiqimanta mañakusqaqa karqan kaymi:
-"$1"
-kay ruraymantam: "$2".
-MySQL-pa kutichisqan pantasqaqa karqan "$3: $4".',
 'laggedslavemode' => "'''Paqtataq''': Kay p'anqapiqa manaraqchá kachkanchu aswan qayna musuqchasqakuna.",
 'readonly' => "Willañiqintinqa hark'asqam",
 'enterlockreason' => "Qillqamuy imarayku hark'asqa karqan, hayk'appas manañachá hark'asqachu kanqa",
@@ -649,12 +649,13 @@ Tukuy wikikunapi uyapuraman t'ikrasqakunata yapayta icha hukchayta munaspaykiqa,
 'editinginterface' => "'''Paqtataq:''' Llamp'u kaqpaq uyapura qillqakuna ruranapaq p'anqatam llamk'apuchkanki.
 Hukchaptiykiqa, chay uyapurap rikch'ayninqa hukyanqa kay wikipi huk ruraqkunapaqpas.
 Uyapuraman t'ikrasqakunata yapayta icha hukchayta munaspaykiqa, [//translatewiki.net/wiki/Main_Page?setlang=qu translatewiki.net] nisqa MediaWiki t'ikrana ruraykamay llika tiyaypi ruranaykimanta hamut'ariy.",
-'sqlhidden' => '(SQL tapunaqa pakasqam)',
 'cascadeprotected' => "Kay p'anqaqa amachasqam kachkan, ''phaqcha'' nisqa kamachiwan amachasqa kay {{PLURAL:$1|p'anqapi|p'anqakunapi}} ch'aqtasqa kaspanmi:
 $2",
 'namespaceprotected' => "'''$1''' nisqa suti k'ititaqa llamk'apuyta manam saqillasunkichu.",
 'customcssprotected' => "Manam saqillasunkichu kay CSS p'anqata llamk'apuyta, huk ruraqpa kikin tiyachisqankunayuq kaptinmi.",
 'customjsprotected' => "Manam saqillasunkichu kay JavaScript p'anqata llamk'apuyta, huk ruraqpa kikin tiyachisqankunayuq kaptinmi.",
+'mycustomcssprotected' => "Kay CSS p'anqataqa manam llamk'apuyta atinkichu.",
+'mycustomjsprotected' => "Kay JavaScript p'anqataqa manam llamk'apuyta atinkichu.",
 'ns-specialprotected' => "{{ns:special}} suti k'itipi p'anqakunaqa manam llamk'apunallachu.",
 'titleprotected' => "Kay p'anqa sutitaqa [[User:$1|$1]] sutiyuq ruraq kamariymanta hark'arqanmi, kayraykum nispa: ''$2''.",
 'filereadonlyerror' => 'Manam atinichu "$1" sutiyuq willañiqita hukchayta, "$2" sutiyuq willañiqi churamuna ñawirillanapaq kachkaptinmi.
@@ -673,15 +674,23 @@ Amachaq kamachiqqa kayrayku amachani nispa nirqanmi: "$3".',
 # Login and logout pages
 'logouttext' => "'''Llamk'apuy tiyayniykiqa puchukasqañam.'''
 
-Sutinnaq kaspaykipas {{SITENAME}}pi wamp'uytam atinki. Mana hinataq munaspaykiqa, <span class='plainlinks'>[$1 musuqmanta yaykuy]</span> ñawpaq icha huk sutiwan. Huk p'anqakunaqa kaqllam rikch'akunqa, ''cache'' nisqa pakasqa hallch'ata mana ch'usaqchaptiykiqa.",
+Huk p'anqakunaqa kaqllam rikch'akunqa, ''cache'' nisqa pakasqa hallch'ata mana ch'usaqchaptiykiqa.",
 'welcomeuser' => 'Allinmi hamusqayki, $1!',
 'welcomecreation-msg' => 'Rakiqunaykiqa kamarisqañam.
 Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] hukchayta.',
 'yourname' => 'Ruraq sutiyki:',
+'userlogin-yourname' => 'Ruraqpa sutin',
+'userlogin-yourname-ph' => 'Ruraqpa sutiykita yaykuchiy',
 'yourpassword' => 'Yaykuna rimayki',
+'userlogin-yourpassword' => 'Yaykuna rima',
+'userlogin-yourpassword-ph' => 'Yaykuna rimaykita yaykuchiy',
+'createacct-yourpassword-ph' => 'Yaykuna rimata yaykuchiy',
 'yourpasswordagain' => 'Yaykuna rimaykita kutipayay',
+'createacct-yourpasswordagain' => 'Yaykuna rimata takyachiy',
+'createacct-yourpasswordagain-ph' => 'Yaykuna rimata musuqmanta yaykuchiy',
 'remembermypassword' => "Ruraqpa sutiyta yaykuna rimaytapas yuyaykuy llamk'ay tiyayniypura ({{PLURAL:$1|huk p'unchawkama|$1 p'unchawkama}})",
-'securelogin-stick-https' => "Yaykurquspa HTTPS nisqawan t'inkisqa kakuy",
+'userlogin-remembermypassword' => 'Yaykusqa kakunaytam munani',
+'userlogin-signwithsecure' => "Amachasqa t'inkinakusqata llamk'achiy",
 'yourdomainname' => 'Duminyuykip sutin',
 'password-change-forbidden' => 'Kay wikipi yaykuna rimataqa manam hukchayta atinkichu.',
 'externaldberror' => 'Hawa yaykuna pantasqam karqan, ichataq manam saqillasunkichu hawa rakiqunaykita musuqchayta.',
@@ -693,18 +702,38 @@ Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] hukchay
 'logout' => 'Lluqsiy',
 'userlogout' => 'Lluqsiy',
 'notloggedin' => 'Manam yaykurqankichu',
+'userlogin-noaccount' => 'Rakiqunaykiri manachu kanchu?',
+'userlogin-joinproject' => '{{SITENAME}}man yaykuy',
 'nologin' => "Manaraqchu rakiqunaykichu kachkan? '''$1'''.",
 'nologinlink' => 'Kichariy',
 'createaccount' => 'Musuq rakiqunata kichariy',
 'gotaccount' => "Rakiqunaykiñachu kachkan? '''$1'''.",
 'gotaccountlink' => 'Rakiqunaykita willaway',
 'userlogin-resetlink' => 'Yaykuna willayniykikunatari qunqarqankichu?',
-'createaccountmail' => "Kikinmanta tukusqa mit'alla yaykuna rimata llamk'achispa kay qatiqpi kaq e-chaski imamaytaman kachay",
+'userlogin-resetpassword-link' => 'Yaykuna rimaykita kutichiy',
+'helplogin-url' => 'Help:Yaykuy',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Yaykunapaq yanapa]]',
+'createacct-join' => 'Kay qatiqpi willaykita yaykuchiy.',
+'createacct-emailrequired' => 'E-chaski imamayta',
+'createacct-emailoptional' => 'E-chaski imamayta (munaspayki)',
+'createacct-email-ph' => 'E-chaski imamaytaykita yaykuchiy',
+'createaccountmail' => "Kikinmanta tukusqa mit'alla yaykuna rimata llamk'achispa akllasqa e-chaski imamaytaman kachay",
+'createacct-realname' => 'Chiqap suti (munaspayki)',
 'createaccountreason' => 'Kayrayku:',
+'createacct-reason' => 'Kayrayku',
+'createacct-reason-ph' => 'Imaraykutaq huk rakiqunata kamarichkanki',
+'createacct-captcha' => 'Amachana llanchiy',
+'createacct-imgcaptcha-ph' => 'Hanaqpi rikusqayki qillqata yaykuchiy',
+'createacct-submit' => 'Rakiqunaykita kamariy',
+'createacct-benefit-heading' => '{{SITENAME}}taqa qam hina runakunam ruran.',
+'createacct-benefit-body1' => "{{PLURAL:$1|llamk'apusqa|llamk'apusqakuna}}",
+'createacct-benefit-body2' => "{{PLURAL:$1|p'anqa|p'anqakuna}}",
+'createacct-benefit-body3' => "{{PLURAL:$1|llamk'apuq|llamk'apuqkuna}}",
 'badretype' => 'Qusqayki yaykuna rimakunaqa manam kaqllachu.',
 'userexists' => 'Munasqayki ruraqpa sutiykiqa kachkanñam.
 Ama hina kaspa, huk ruraqpa sutiykita akllay.',
 'loginerror' => "Pantasqa llamk'apuy tiyaypa qallarisqan",
+'createacct-error' => 'Rakiquna kamariy pantasqa',
 'createaccounterror' => 'Manam atinichu rakiqunata kamariyta: $1',
 'nocookiesnew' => "Ruraqpa rakiqunaykiqa kichasqañam, ichataq manaraqmi yaykurqankichu. {{SITENAME}}qa <em>kuki</em> nisqakunatam llamk'achin ruraqkunata kikinyachinapaq. Antañiqiqniykipiqa manam <em>kuki</em> nisqakuna atinchu. Ama hina kaspa, atichispa huk kutita yaykuykachay.",
 'nocookieslogin' => "{{SITENAME}} <em>kuki</em> nisqakunata llamk'achin ruraqkunata kikinyachinapaq. Antañiqiqniykipiqa manam <em>kuki</em> nisqakuna atinchu. Ama hina kaspa, atichispa huk kutita ruraykachay.",
@@ -755,7 +784,7 @@ Ama hina kaspa, chaskispaykiqa ruraqpa sutiykita nispa musuqmanta yaykuy.',
 
 Kay willay pantasqa kaptinqa, qhawarparillay.',
 'usernamehasherror' => 'Ruraqpa sutinqa ama iskaychakana (<nowiki>#</nowiki>) sananchayuqchu kachun',
-'login-throttled' => 'Nisyu kutitachá kay rakiqunapaq yaykuna rimawan ñaqha yaykuykachanki. Ama hina kaspa, suyariy manaraq musuqmanta yaykuykachaspa.',
+'login-throttled' => 'Nisyu kutitachá kay rakiqunapaq yaykuna rimawan ñaqha yaykuykachanki. Ama hina kaspa, $1 suyariy manaraq musuqmanta yaykuykachaspa.',
 'login-abort-generic' => 'Yaykuykachaspayki manam ayparqankichu - Allqasqa',
 'loginlanguagelabel' => 'Rimay: $1',
 'suspicious-userlogout' => "Lluqsiy mañakuyniykiqa mananchasqam karqan, waqllisqa wamp'unamanta icha pakaq proksimanta kachasqa kaspanchá.",
@@ -774,7 +803,7 @@ Kay willay pantasqa kaptinqa, qhawarparillay.',
 'newpassword' => 'Musuq yaykuna rima:',
 'retypenew' => 'Musuq yaykuna rimaykita takyachiy:',
 'resetpass_submit' => 'Yaykuna rimata hukchaspa yaykuy',
-'resetpass_success' => 'Yaykuna rimaykiqa hukchasqañam. Yaykamuchkankim...',
+'changepassword-success' => 'Yaykuna rimaykiqa aypalla hukchasqañam.',
 'resetpass_forbidden' => 'Manam saqillanchu yaykuna rimata hukchayta',
 'resetpass-no-info' => "Yaykunaykim tiyan kay p'anqata chiqalla aypanaykipaq.",
 'resetpass-submit-loggedin' => 'Yaykuna rimata hukchay',
@@ -786,10 +815,11 @@ Yaykuna rimaykitaqa aypalla hukcharqunkiñachá icha huk mit'alla yaykuna rimata
 
 # Special:PasswordReset
 'passwordreset' => 'Yaykuna rimata kutichiy',
-'passwordreset-text' => "Kay hunt'ana p'anqata hunt'ay, yaykuna rimaykita kutichinaykipaq.",
+'passwordreset-text-one' => "Kay hunt'ana p'anqata hunt'ay, yaykuna rimaykita kutichinaykipaq.",
+'passwordreset-text-many' => "{{PLURAL:$1|Kay k'itichakunamanta hukta hunt'achiy, yaykuna rimaykita kutichinaykipaq.}}",
 'passwordreset-legend' => 'Yaykuna rimata kutichiy',
 'passwordreset-disabled' => 'Kay wikipiqa yaykuna rimata manam kutichiyta atinkichu.',
-'passwordreset-pretext' => '{{PLURAL:$1||Qatiqpi kaq willa rakikunamanta huktam yaykuchiy}}',
+'passwordreset-emaildisabled' => "Kay wikipiqa e-chaski llamk'anakunaman ama nisqam.",
 'passwordreset-username' => 'Ruraqpa sutin:',
 'passwordreset-domain' => 'Duminyu:',
 'passwordreset-capture' => 'Llalliwaq e-chaskita qhawayta munankichu?',
@@ -820,7 +850,7 @@ kay willayta mana qhawaspa mana imatapas ruraspa ñawpaq yaykuna rimaykiwanmi ll
 Mit'alla yaykuna rima: $2",
 'passwordreset-emailsent' => 'Yaykuna rimata kutichina e-chaskiqa kachasqañam.',
 'passwordreset-emailsent-capture' => 'Yaykuna rimata kutichina e-chaskiqa kachasqañam, kay qatiqpi rikunki.',
-'passwordreset-emailerror-capture' => 'Yuyachina e-chaskiqa rurasqa karqan, imatachus kay qatiqpi rikunki, ichataq kachasqa kaptin pantasqam tukurqan: $1',
+'passwordreset-emailerror-capture' => '{{GENDER:$2|}}Yaykuna rimata kutichina e-chaskiqa rurasqa karqan, imatachus kay qatiqpi rikunki, ichataq kachasqa kaptin pantasqam tukurqan: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-chaski imamaytata wakinchay',
@@ -906,7 +936,7 @@ Astasqachá icha qullusqachá qhawachkaptiyki.',
 'accmailtitle' => 'Yaykuna rimaqa kachasqañam.',
 'accmailtext' => "Kikinmanta kamarisqa [[User talk:$1|$1]]-paq yaykuna rimaqa $2-manmi kachasqaña.
 
-Yaykurqaspaqa ''[[Special:ChangePassword|yaykuna rima hukchana]]'' p'anqapi kay musuq rakiqunapaq yaykuna rimata hukchaytam atinki.",
+Yaykurqaspaqa ''[[Special:ChangePassword|yaykuna rima hukchana]]'' p'anqapi kay yaykuna rimata hukchaytam atinki.",
 'newarticle' => '(Musuq)',
 'newarticletext' => "Manaraq kachkaq p'anqatam llamk'apuchkanki. Musuq p'anqata kamariyta munaspaykiqa, qillqarillay. Astawan ñawiriyta munaspaykiqa, [[{{MediaWiki:Helppage}}|yanapana p'anqata]] qhaway. Mana munaspaykitaq, ñawpaq p'anqaman ripuy.",
 'anontalkpagetext' => "---- ''Kayqa huk sutinnaq icha mana sutinta llamk'achiq ruraqpa rimanakuyninmi. IP huchhantam hallch'asunchik payta sutinchanapaq. Achka ruraqkunam huklla IP huchhanta llamk'achiyta atin. Sutinnaq ruraq kaspaykiqa, mana qampa rurasqaykimanta willamusqakunata rikuspaykiqa, ama hina kaspa [[Special:UserLogin/signup|rakiqunaykita kamariy]] icha [[Special:UserLogin|yaykuy]] huk sutinnaq ruraqkunawan ama pantasqa kanaykipaq.''",
@@ -998,7 +1028,7 @@ Hallch'api qhipaq kaq yaykuchisqataqa kay qatiqpim rikunki willasunaykipaq:",
 'nocreate-loggedin' => "Manam saqillasunkichu musuq p'anqakunata kamariyta.",
 'sectioneditnotsupported-title' => "Raki allichayqa manam q'imisqachu",
 'sectioneditnotsupported-text' => "Raki allichayqa kay p'anqapi manam q'imisqachu.",
-'permissionserrors' => 'Saqillay pantasqakuna',
+'permissionserrors' => 'Saqillay pantasqa',
 'permissionserrorstext' => 'Manam saqillasunkichu, {{PLURAL:$1|kayraykum|kayraykum}}:',
 'permissionserrorstext-withaction' => 'Manam saqillasunkichu $2-ta, {{PLURAL:$1|kayraykum|kayraykum}}:',
 'recreate-moveddeleted-warn' => "'''Paqtataq: Ñawpaqta qullusqaña p'anqatam musuqmanta kamarichkanki.'''
@@ -1014,12 +1044,15 @@ Manam nirqanchu imarayku.",
 Qullusqachá.",
 'edit-conflict' => "Tuylla llamk'apuymanta sasachakuy.",
 'edit-no-change' => "Manapuni hukchaptiykim, llamk'apusqayki manam hallch'asqachu.",
+'postedit-confirmation' => "Llamk'apusqaykiqa waqaychasqañam.",
 'edit-already-exists' => "Manam atinichu musuq p'anqata kamariyta.
 Kachkañam.",
 'defaultmessagetext' => 'Ñawpaq qillqa',
 'content-failed-to-parse' => "Manam atinichu $2 samiqta $1 kikinchapaq t'ikrayta: $3",
 'invalid-content-data' => 'Samiqmanta willaykunaqa manam allinchu',
 'content-not-allowed-here' => '"$1" nisqa samiqqa [[$2]] sutiyuq p\'anqapi manam saqillasqachu',
+'editwarning-warning' => "Kay p'anqata saqispaykiqa lliw rurarqusqayki hukchasqakunatachá chinkachiykiman.
+Yaykusqa kaspaykiqa, kay yuyampayta hark'ayta atinki allinkachinaykikunapi \"Llamk'apusqa\" rakipi.",
 
 # Content models
 'content-model-wikitext' => 'wiki qillqa',
@@ -1080,8 +1113,8 @@ $3-qa nirqan kayraykum: ''$2''",
 (ñawpaq) = ñawpaq kachkasqanwan huk kaykuna, a = aslla hukchasqa",
 'history-fieldset-title' => 'Wiñay kawsaypi maskay',
 'history-show-deleted' => 'Qullusqalla',
-'histfirst' => 'Ñawpaqkuna',
-'histlast' => 'Qhipaqkuna',
+'histfirst' => 'ñawpaqkuna',
+'histlast' => 'qhipaqkuna',
 'historysize' => '({{PLURAL:$1|1 byte|$1 byte}})',
 'historyempty' => "(ch'usaq)",
 
@@ -1258,7 +1291,6 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
 'searchmenu-legend' => 'Maskaypaq akllanakuna',
 'searchmenu-exists' => "'''Kay wikipiqa «[[$1]]» sutiyuq p'anqam kachkan'''",
 'searchmenu-new' => "'''Kay wikipi \"[[:\$1]]\" sutiyuq p'anqata kamariy!'''",
-'searchhelp-url' => 'Help:Yanapana',
 'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Kay ñawpa k'askaqchayuq huk p'anqakunata maskay]]",
 'searchprofile-articles' => "Samiq p'anqakuna",
 'searchprofile-project' => "Yanapanapaq ruraykamaypaqpas p'anqakuna",
@@ -1299,15 +1331,7 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
 'powersearch-togglenone' => 'Mana imapas',
 'search-external' => 'Hawapi maskay',
 'searchdisabled' => "{{SITENAME}} nisqapi maskaymanqa ama nisqam. Hinachkaptinqa, maskariy google nisqawan icha huk hawa maskanakunawan, ichataq yuyariy, {{SITENAME}}manta hallch'asqankunaqa manañachá musuqllachu.",
-
-# Quickbar
-'qbsettings' => 'Utqaytawna ("Quickbar") allinkachinakuna',
-'qbsettings-none' => 'Mana imapas',
-'qbsettings-fixedleft' => "Lluq'iman watay",
-'qbsettings-fixedright' => 'Pañaman watay',
-'qbsettings-floatingleft' => "Lluq'iman tuytuy",
-'qbsettings-floatingright' => 'Pañaman tuytuy',
-'qbsettings-directionality' => 'Watasqa, rimayniykip qillqa puririyninmanta wachariq',
+'search-error' => 'Maskaypiqa pantasqam tukurqan: $1',
 
 # Preferences page
 'preferences' => 'Allinkachinakuna',
@@ -1339,9 +1363,8 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
 'prefs-rendering' => "Rikch'akuynin",
 'saveprefs' => 'Allinkachinakunata waqaychay',
 'resetprefs' => 'Mana waqaychasqa hukchasqakunaman ama niy',
-'restoreprefs' => 'Tukuy kikinmanta allinkachinakunata kutichimuy',
+'restoreprefs' => 'Tukuy kikinmanta allinkachinakunata kutichimuy (tukuy rakirikunapi)',
 'prefs-editing' => "Llamk'apusqa",
-'prefs-edit-boxsize' => "Llamk'apuna wintanap chhikan.",
 'rows' => 'Sinrukuna:',
 'columns' => 'Wachukuna:',
 'searchresultshead' => 'Maskay',
@@ -1352,8 +1375,6 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
 'recentchangesdays-max' => "(ama $1-manta aswan {{PLURAL:$1|p'unchaw|p'unchaw}} kachunchu)",
 'recentchangescount' => 'Rikuchina hukchasqakunap yupaynin, kikinmanta:',
 'prefs-help-recentchangescount' => "Kaypiqa ñaqha hukchasqakunam, p'anqap wiñay kawsayninkunam, hallch'akunapas.",
-'prefs-help-watchlist-token' => "Kay k'itichata pakasqa llawiwan hunt'aspaykiqa, watiqasqaykikunapaq RSS mikhuchinatam kamarinki.
-Pi kay k'itichapi llawiykita riqsiqpas watiqasqaykikunata ñawiriytam atinqa. Chayrayku takyaq chanita akllay. Kaypiqa kikinmanta kamarisqa akllanallayki chanitam rikunki: $1",
 'savedprefs' => "Allinkachinaykikunaqa hallch'asqañam.",
 'timezonelegend' => "Pacha t'urpi:",
 'localtime' => 'Tiyaylla pacha:',
@@ -1384,7 +1405,6 @@ Pi kay k'itichapi llawiykita riqsiqpas watiqasqaykikunata ñawiriytam atinqa. Ch
 'prefs-reset-intro' => "Kay p'anqataqa llamk'achiyta atinki allinkachinaykikunata kikinmanta kasqaman kutichinaykipaq.
 Chaytataq manam kutichiyta atinkichu.",
 'prefs-emailconfirm-label' => 'E-chaskita takyachiy:',
-'prefs-textboxsize' => "Llamk'apuna wintanap chhikan kaynin",
 'youremail' => 'E-chaski imamaytayki',
 'username' => '{{GENDER:$1|Ruraqpa sutin}}:',
 'uid' => '{{GENDER:$1|Ruraqpa}} ID-nin:',
@@ -1399,11 +1419,11 @@ Chaytataq manam kutichiyta atinkichu.",
 'badsig' => "Chawa silq'usqaykiqa manam allinchu; HTML sananchakunata llanchiy.",
 'badsiglength' => 'Chutu sutiykiqa nisyu sunim.
 $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
-'yourgender' => 'Qhari icha warmi:',
-'gender-unknown' => 'Mana riqsisqa',
-'gender-male' => 'Qhari',
-'gender-female' => 'Warmi',
-'prefs-help-gender' => "Munaspaykiqa: llamp'u kaqpa allinlla warmi icha qhari nispa napaykusunaykipaq. Kay willayqa sapsim kanqa.",
+'yourgender' => 'Ima hina nisunkikutaq munanki?',
+'gender-unknown' => 'Manam willayta munanichu',
+'gender-male' => "Qharim wikita llamk'apun",
+'gender-female' => "Warmim wikita llamk'apun",
+'prefs-help-gender' => "Munaspaykiqa: llamp'u kaqpa allinlla warmi icha qhari nispa napaykusunaykipaq huk runakunaman willananpaqpas. Kay willayqa sapsim kanqa.",
 'email' => 'E-chaski',
 'prefs-help-realname' => "* Chiqap sutiyki (munaspaqa): quwaptiykiqa, llamk'apusqaykikunam paywan sananchasqa kanqa.",
 'prefs-help-email' => 'E-chaskita munaspayki akllayta atinki. Arí nispaykiqa, yaykuna rimata qunqaspayki musuq yaykuna rimata e-chaski imamaytaykiman kachachikamuyta atinki.',
@@ -1414,7 +1434,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'prefs-signature' => "Silq'uy",
 'prefs-dateformat' => "P'unchaw rikch'ay",
 'prefs-timeoffset' => 'Pacha wakinyay',
-'prefs-advancedediting' => 'Ñawparikusqa akllanakuna',
+'prefs-advancedediting' => 'Sapsi akllanakuna',
 'prefs-advancedrc' => 'Ñawparikusqa akllanakuna',
 'prefs-advancedrendering' => 'Ñawparikusqa akllanakuna',
 'prefs-advancedsearchoptions' => 'Ñawparikusqa akllanakuna',
@@ -1449,6 +1469,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'userrights-notallowed' => 'Qampa rakiqunaykiwanqa manam ruraqkunap hayñinkunata yapayta icha qichuyta atinkichu.',
 'userrights-changeable-col' => 'Hukchanayki huñukuna',
 'userrights-unchangeable-col' => 'Mana hukchanayki huñukuna',
+'userrights-conflict' => 'Ruraqpa hayñin hukchay tupanakuymi. Ama hina kaspa, hukchasqaykikunata musuqmanta quy.',
 
 # Groups
 'group' => 'Huñu:',
@@ -1492,7 +1513,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'right-reupload-shared' => 'Rakinakusqa midya waqaychanallapi kaq willañiqikunata huknachay',
 'right-upload_by_url' => 'URL tiyaymanta willañiqita churkuy',
 'right-purge' => "''Cache'' nisqa pakasqa hallch'ata ch'usaqchay mana takyachina p'anqawan",
-'right-autoconfirmed' => "Kuskan amachasqa p'anqakunata llamk'apuy",
+'right-autoconfirmed' => 'IP-pi tiksisqa achura saywakunapa manam saywachasqan kanqachu',
 'right-bot' => 'Rurana antachap ruraykachasqanta hina hatalliy',
 'right-nominornewtalk' => 'Kikinpa rimachinanpi uchuylla hukchasqakunata "musuq willaykuna" nisqapi mana rikuy',
 'right-apihighlimits' => "API maskanakunapi aswan hanaq saywakunata llamk'achiy",
@@ -1513,12 +1534,14 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'right-ipblock-exempt' => "IP hark'ayta, kikinmanta hark'ayta, tawqa hark'aytapas pulqaspa pasay",
 'right-proxyunbannable' => "Kikinmanta ''proxy'' nisqa sirwiq hark'ayta pulqaspa pasay",
 'right-unblockself' => "Kikinta hark'asqamanta qispikuy",
-'right-protect' => "Amachasqa kachkayta hukchay, amachasqa p'anqakunata llamk'apuy",
-'right-editprotected' => "Amachasqa p'anqakunata llamk'apuy (mana phaqcha amachasqa)",
+'right-protect' => "Amachasqa kachkayta hukchay, ch'aqtasqa amachasqa p'anqakunata llamk'apuy",
+'right-editprotected' => 'Amachasqa p\'anqakunata "{{int:protect-level-sysop}}" hina llamk\'apuy',
 'right-editinterface' => "Ruraqpaq uyapurata llamk'apuy",
 'right-editusercssjs' => "Huk ruraqkunap CSS, JS willañiqinkunata llamk'apuy",
 'right-editusercss' => "Huk ruraqkunap CSS willañiqinkunata llamk'apuy",
 'right-edituserjs' => "Huk ruraqkunap JS willañiqinkunata llamk'apuy",
+'right-editmyusercss' => "Kikiykip ruraqpaq CSS willañiqiykikunata llamk'apuy",
+'right-editmyuserjs' => "Kikiykip ruraqpaq JavaScript willañiqiykikunata llamk'apuy",
 'right-rollback' => "Huk p'anqapi qhipaq llamk'apuqpa hukchasqankunata utqaylla kutichiy",
 'right-markbotedits' => "Kutichisqa llamk'apusqakunata rurana antachap llamk'apusqankunata hina sananchay",
 'right-noratelimit' => 'Achura saywakunap manam chayachisqanchu',
@@ -1570,8 +1593,8 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'action-block' => "kay ruraqta llamk'apuymanta hark'ay",
 'action-protect' => "kay p'anqapaq amachana kamachisqakunata hukchay",
 'action-rollback' => "huk p'anqapi qhipaq llamk'apuqpa hukchasqankunata utqaylla kutichiy",
-'action-import' => "kay p'anqata hawa wikimanta chaskimuy",
-'action-importupload' => "kay p'anqata willañiqi churkusqamanta chaskimuy",
+'action-import' => "p'anqakunata hawa wikimanta chaskimuy",
+'action-importupload' => "p'anqakunata willañiqi churkusqamanta chaskimuy",
 'action-patrol' => "huk ruraqpa llamk'apusqanta patrullasqa nispa sananchay",
 'action-autopatrol' => "kikiykip llamk'apusqaykita patrullasqa nispa sananchakuy",
 'action-unwatchedpages' => "mana watiqasqa p'anqa sutisuyuta qhaway",
@@ -1613,7 +1636,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'rc_categories_any' => 'Imallapas',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|byte}} hukchasqa kaptinña',
 'newsectionsummary' => 'Musuq raki: /* $1 */',
-'rc-enhanced-expand' => 'Imaymanachakunata rikuchiy (JavaScript kananmi)',
+'rc-enhanced-expand' => 'Imaymanachakunata rikuchiy',
 'rc-enhanced-hide' => 'Imaymanachakunata pakay',
 'rc-old-title' => 'ñawpaqta "$1" sutiwan kamarisqa',
 
@@ -1622,7 +1645,6 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'recentchangeslinked-feed' => "T'inkisqapi hukchasqakuna",
 'recentchangeslinked-toolbox' => "T'inkisqapi hukchasqakuna",
 'recentchangeslinked-title' => '"$1"-wan t\'inkisqa hukchasqa',
-'recentchangeslinked-noresult' => "Nisqa mit'apiqa manam hukchasqa t'inkimuqkuna kanchu.",
 'recentchangeslinked-summary' => "Kay sapaq p'anqaqa t'inkisqa p'anqakunapi ñaqha hukchasqakunatam rikuchin. Watiqasqayki p'anqakunaqa '''yanasapa qillqasqam'''.",
 'recentchangeslinked-page' => "P'anqap sutin:",
 'recentchangeslinked-to' => "Qusqa p'anqaman t'inkimuq p'anqakunapi hukchasqakunata rikuchiy chay ranti",
@@ -1633,7 +1655,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'reuploaddesc' => "Churkuna hunt'ana p'anqaman kutimuy.",
 'upload-tryagain' => 'Hukchasqa willañiqimanta willaykunata kachay',
 'uploadnologin' => 'Manaraqmi yaykurqunkichu',
-'uploadnologintext' => '[[Special:UserLogin|Yaykunaykim]] tiyan willañiqikunata churkunaykipaq.',
+'uploadnologintext' => '$1 tiyan willañiqikunata churkunaykipaq.',
 'upload_directory_missing' => 'Churkuna willañiqi churanaqa ($1) manam kanchu. Llika sirwiqpas manam atinchu churkuna willañiqi churanata kamariyta.',
 'upload_directory_read_only' => "Llika sirwiqqa manam atinchu churkuna hallch'aman ($1) qillqayta.",
 'uploaderror' => 'Willañiqita churkunayaptiyki pantasqam tukurqan',
@@ -1836,7 +1858,6 @@ Lliwmanta aswan alliku kanapaqqa, img_auth.php manam atinchu.',
 'http-read-error' => 'HTTP ñawiriy pantasqa.',
 'http-timed-out' => "HTTP mañakuypa mit'anqa lluqsikusqañam.",
 'http-curl-error' => 'URL apamuypi pantasqa: $1',
-'http-host-unreachable' => 'Manam aypanichu URL-ta.',
 'http-bad-status' => 'HTTP mañakuypi sasachakuymi tukukurqan: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1853,8 +1874,7 @@ Lliwmanta aswan alliku kanapaqqa, img_auth.php manam atinchu.',
 'upload_source_file' => ' (antañiqiqniykipi willañiqi)',
 
 # Special:ListFiles
-'listfiles-summary' => "Kay sapaq p'anqapiqa tukuy churkusqa willañiqikunatam rikunki.
-Ruraqkama ch'illchispaykiqa, chay ruraq qhipaq churkuq kaptillan willañiqikunatam sutisuyup patanpi rikunki.",
+'listfiles-summary' => "Kay sapaq p'anqapiqa tukuy churkusqa willañiqikunatam rikunki.",
 'listfiles_search_for' => 'Rikchap sutinta maskay:',
 'imgfile' => 'willañiqi',
 'listfiles' => 'Rikchakuna',
@@ -1984,12 +2004,6 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun
 'statistics-users-active-desc' => "Ñaqha {{PLURAL:$1|p'unchawpi|$1 p'unchawkunapi}} llamk'apuq ruraqkuna",
 'statistics-mostpopular' => "Lliwmanta astawan rikusqa p'anqakuna",
 
-'disambiguations' => "Sut'ichana qillqakunaman t'inkimuq p'anqakuna",
-'disambiguationspage' => "Template:Sut'ichana qillqa",
-'disambiguations-text' => "Kay qatiq p'anqakunam t'inkimun '''sut'ichana qillqa''' nisqaman.
-Chay rantiqa chiqap, hukchanasqa p'anqamanmi t'inkichun.<br />
-P'anqa [[MediaWiki:Disambiguationspage]] plantillayuq kaspaqa sut'ichana qillqam kanqa.",
-
 'pageswithprop' => "Kaqninniyuq p'anqakuna",
 'pageswithprop-legend' => "Kaqninniyuq p'anqakuna",
 'pageswithprop-text' => "Kay p'anqapiqa sapaq kaqninniyuq p'anqakunatam sutisuyupi rikunki.",
@@ -2170,7 +2184,8 @@ Q\'imichisqa tantari {{PLURAL:$2|qillqa|qillqakuna}}: <code>$1</code> (mana mayq
 'listgrouprights' => 'Ruraq huñup hayñinkuna',
 'listgrouprights-summary' => "Kay qatiq sutisuyupiqa kay wikipi sut'ichasqa ruraq huñukunatam, kikinpa chayamuna hayñinkunatawan rikunki.
 Chay kikinkunap hayñinkunamanta astawan ñawirinaykipaqqa [[{{MediaWiki:Listgrouprights-helppage}}|kaypi qhaway]].",
-'listgrouprights-key' => '* <span class="listgrouprights-granted">Qusqa hayñi</span>
+'listgrouprights-key' => 'T\'iktuna:
+* <span class="listgrouprights-granted">Qusqa hayñi</span>
 * <span class="listgrouprights-revoked">Qichusqa hayñi</span>',
 'listgrouprights-group' => 'Huñu',
 'listgrouprights-rights' => 'Hayñikuna',
@@ -2240,10 +2255,9 @@ Qampa [[Special:Preferences|allinkachinaykikunapi]] qillqakamachisqayki imamayta
 'unwatchthispage' => 'Amaña watiqaychu',
 'notanarticle' => 'Manam qillqachu',
 'notvisiblerev' => 'Musuqchasqaqa qullusqam',
-'watchnochange' => "Manam ima watiqasqayki qillqapas llamk'apusqachu karqan rikuchisqa mit'api.",
 'watchlist-details' => "Watiqana sutisuyuykipiqa {{PLURAL:$1|huk p'anqam|$1 p'anqakunam}}, rimanakuna p'anqakunata mana yupaspa.",
-'wlheader-enotif' => '* E-chaskimanta musyachinaman arí nisqañam.',
-'wlheader-showupdated' => "* Qayna watukamusqaykimantapacha hukchasqa p'anqakunataqa '''yanasapa''' nisqapim rikunki.",
+'wlheader-enotif' => 'E-chaskimanta musyachinaman arí nisqañam.',
+'wlheader-showupdated' => "Qayna watukamusqaykimantapacha hukchasqa p'anqakunataqa '''yanasapa''' nisqapim rikunki.",
 'watchmethod-recent' => "watiqasqayki p'anqakunapaq ñaqha hukchasqakunata llanchispa",
 'watchmethod-list' => "watiqasqayki p'anqakunata ñaqha hukchasqakunapaq llanchispa",
 'watchlistcontains' => "Watiqana sutisuyuykipiqa $1 {{PLURAL:$1|p'anqam|p'anqakunam}} kachkan.",
@@ -2326,9 +2340,11 @@ $2 nisqa p\'anqata qhaway ñaqha qullusqakunata rikunaykipaq.',
 'deleteotherreason' => 'Huk rayku:',
 'deletereasonotherlist' => 'Huk rayku',
 'deletereason-dropdown' => "*Qulluypaq sapsi raykukuna
-** Kikin kamariqpa mañakusqan
+** Spam nisqa millay rurasqa
+** Wandaluchasqa
 ** Ruraqpa hayñinta k'irisqa
-** Wandaluchasqa",
+** Kikin kamariqpa mañakusqan
+** P'itisqa pusapuna",
 'delete-edit-reasonlist' => "Qullusqapaq raykukunata llamk'apuy",
 'delete-toobig' => "Kay p'anqaqa ancha wiñay kawsaysapa, $1-manta aswan {{PLURAL:$1|musuqchasqayuq|musuqchasqayuq}}. Kay hina p'anqakunata qulluyqa saywachasqam, {{SITENAME}}ta mana waqllinapaq.",
 'delete-warning-toobig' => "Kay p'anqaqa ancha wiñay kawsaysapa, $1-manta aswan {{PLURAL:$1|musuqchasqayuq|musuqchasqayuq}}. Kay hina p'anqata qulluspaykiqa, {{SITENAME}}ta waqllinkimanchá. Kay ruraymanta anchata yuyaychakuspa hamut'ay.",
@@ -2346,7 +2362,7 @@ $2 nisqa p\'anqata qhaway ñaqha qullusqakunata rikunaykipaq.',
 Qhipaq kaq llamk'apusqaqa [[User:$3|$3]]-pa ([[User talk:$3|rimanakuy]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) rurasqanmi.",
 'editcomment' => "Llamk'apusqakunamanta pisichasqaqa kay hinam: \"''\$1''\".",
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|rimachina]]) sutiyuq ruraqpa hukchasqankunaqa kutichisqam [[User:$1|$1]]-pa ñawpaq hukchasqanman',
-'revertpage-nouser' => "Ruraqpa hukchasqankunaqa (sutinqa qichusqam) kutichisqañam [[User:$1|$1]]-pa ñawpaq llamk'apusqanta paqarichispa",
+'revertpage-nouser' => "Ruraqpa hukchasqankunaqa (sutinqa qichusqam) kutichisqañam {{GENDER:$1|[[User:$1|$1]]}}-pa ñawpaq llamk'apusqanta paqarichispa",
 'rollback-success' => "$1-pa hukchasqankunaqa kutichisqañam $2-pa ñawpaq llamk'apusqanta paqarichispa.",
 
 # Edit tokens
@@ -2480,7 +2496,7 @@ $1',
 'contributions' => "{{GENDER:$1|Ruraqpa}} llamk'apusqankuna",
 'contributions-title' => "$1 sutiyuq ruraqpa llamk'apusqankuna",
 'mycontris' => "Llamk'apusqaykuna",
-'contribsub2' => '$1 ($2)',
+'contribsub2' => '{{GENDER:$3|$1}}paq ($2)',
 'nocontribs' => 'Manam kay hina hukchasqakuna kanchu.',
 'uctop' => '(qhipaq hukchasqa)',
 'month' => 'Kay killamanta (ñawpaqmantapas):',
@@ -2631,11 +2647,8 @@ Willariy imaraykum hark'anki (ahinataq: sapaq wandaluchasqa p'anqakunamanta will
 'ipb_blocked_as_range' => "Pantasqa: IP $1 huchhaqa manam chiqallachu hark'asqa kaptinmi manam paskanallachu. Chaywanpas, $2 patayayku kaspataq hark'asqam kachkan. Chay patayaykuqa hark'asqamanta paskanallam.",
 'ip_range_invalid' => "IP huchha k'itiqa manam chanichkanchu.",
 'ip_range_toolarge' => "/$1-manta aswan hatun k'iti hark'aykunaqa manam saqillasqachu.",
-'blockme' => "Hark'away",
 'proxyblocker' => "Proxy hark'aq",
-'proxyblocker-disabled' => 'Kay ruranamanqa ama nisqam.',
 'proxyblockreason' => "IP huchhaykiqa hark'asqam kichasqa proxy kaptinmi. Ama hina kaspa, internet mink'aqniykiman icha allwiya yanapaqniykiman kay hatun qasi sasachakuymanta willay.",
-'proxyblocksuccess' => 'Rurasqañam.',
 'sorbsreason' => 'IP huchhaykiqa kichasqa proxy nispa {{SITENAME}}pi DNSBL nisqapi qillqasqam.',
 'sorbs_create_account_reason' => 'IP huchhaykiqa kichasqa proxy nispa {{SITENAME}}pi DNSBL nisqapi qillqasqam. Manam atinkichu rakiqunata kichayta',
 'cant-block-while-blocked' => "Kikiyki hark'asqa kaspaykiqa, manam huk ruraqkunata hark'ayta atinkichu.",
@@ -2792,6 +2805,7 @@ Ama hina kaspa, [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] n
 'thumbnail-more' => 'Hatunchay',
 'filemissing' => 'Manam willañiqi kachkanchu',
 'thumbnail_error' => 'Manam atinichu rikchachata kamayta: $1',
+'thumbnail_error_remote' => '$1 nisqamanta pantasqa willasqa: $2',
 'djvu_page_error' => "DjVu nisqa p'anqaqa nisyum",
 'djvu_no_xml' => 'Manam atinichu XML-ta apamuy DjVu willañiqipaq',
 'thumbnail-temp-create' => "Manam atinichu mit'alla rikch'acha willañiqita kamariyta.",
@@ -2939,26 +2953,15 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 
 # Stylesheets
 'common.css' => "/* Churamusqa CSS chantakunaqa tukuy qarakunapim llamk'anqa */",
-'standard.css' => "/* Churamusqa CSS chantakunaqa ''Standard skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
-'nostalgia.css' => "/* Churamusqa CSS chantakunaqa ''Nostalgia skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
 'cologneblue.css' => "/* Churamusqa CSS chantakunaqa ''Cologne Blue skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
 'monobook.css' => '/* Kayman churasqa CSS nisqaqa Monobook qaratam hukchanqa tukuy internet tiyanapaq */',
-'myskin.css' => "/* Churamusqa CSS chantakunaqa ''MySkin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
-'chick.css' => "/* Churamusqa CSS chantakunaqa ''Chick skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
-'simple.css' => "/* Churamusqa CSS chantakunaqa ''Simple skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
 'modern.css' => "/* Churamusqa CSS chantakunaqa ''Modern skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
 'print.css' => "/* Churamusqa CSS chantakunaqa ch'ipachinap rikch'akuynintam hukchanqa */",
-'handheld.css' => "/* Churamusqa CSS chantakunaqa makiwan hap'isqa qarapi tiksisqa \$wgHandheldStyle nisqapi allichasqa antakunap llamk'aynintam hukchanqa */",
 
 # Scripts
 'common.js' => "/* Ima kaypi kaq JavaScript qillqapas tukuy ruraqkunapaq tukuy p'anqakunap tukuy chaqnankunapi chaqnamusqa kanqa. */",
-'standard.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Standard skin'' nisqa sapsi qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-'nostalgia.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Nostalgia skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
 'cologneblue.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Cologne Blue skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
 'monobook.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas MonoBook nisqata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-'myskin.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''MySkin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-'chick.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Chick skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-'simple.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Simple skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
 'modern.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Modern skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
 
 # Metadata
@@ -2997,13 +3000,13 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 'pageinfo-length' => "P'anqap chhikan (byte)",
 'pageinfo-article-id' => "P'anqap ID-nin",
 'pageinfo-language' => "P'anqap rimaynin",
-'pageinfo-robot-policy' => 'Maskana kuyuchinap kachkaynin',
-'pageinfo-robot-index' => 'Maskana yuyarinapaqpas',
-'pageinfo-robot-noindex' => 'Mana maskana yuyarinapaq',
+'pageinfo-robot-policy' => 'Maskana kuyuchinam yuyarinachan',
+'pageinfo-robot-index' => 'Saqillasqa',
+'pageinfo-robot-noindex' => 'Mana saqillasqa',
 'pageinfo-views' => "Hayk'a qhawaykuna",
 'pageinfo-watchers' => "P'anqata hayk'a watiqaqkuna",
 'pageinfo-few-watchers' => '$1-manta aswan pisi {{PLURAL:$1|qhawaq|qhawaqkuna}}',
-'pageinfo-redirects-name' => "Kay p'anqaman pusampuqkuna",
+'pageinfo-redirects-name' => "Kay p'anqaman hayk'a pusampuqkuna",
 'pageinfo-subpages-name' => "Kay p'anqap urin p'anqankuna",
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|pusapuna|pusapunakuna}}; $3 {{PLURAL:$3|mana pusapuna|mana pusapunakuna}})',
 'pageinfo-firstuser' => "P'anqap kamariqnin",
@@ -3106,11 +3109,25 @@ Payta rurachiyqa antañiqiqniykita llikaykitapas waqllinqachá.",
 'minutes' => '{{PLURAL:$1|huk minutu|$1 minutu}}',
 'hours' => '{{PLURAL:$1|huk ura|$1 ura}}',
 'days' => "{{PLURAL:$1|huk p'unchaw|$1 p'unchaw}}",
+'weeks' => '{{PLURAL:$1|huk simana|$1 simana}}',
 'months' => '{{PLURAL:$1|huk killa|$1 killa}}',
 'years' => '{{PLURAL:$1|huk wata|$1 wata}}',
 'ago' => '$1 ñaqha',
 'just-now' => 'kunallan',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ura|urakuna}} ñaqha',
+'minutes-ago' => '$1 {{PLURAL:$1|minutu|minutukuna}} ñaqha',
+'seconds-ago' => '$1 {{PLURAL:$1|sikundu|sikundukuna}} ñaqha',
+'monday-at' => 'Killachaw $1 pachapi',
+'tuesday-at' => 'Atipachaw $1 pachapi',
+'wednesday-at' => 'Quyllurchaw $1 pachapi',
+'thursday-at' => 'Illapachaw $1 pachapi',
+'friday-at' => "Ch'askachaw $1 pachapi",
+'saturday-at' => "K'uychichaw $1 pachapi",
+'sunday-at' => 'Intichaw $1 pachapi',
+'yesterday-at' => "Qayna p'unchaw $1 pachapi",
+
 # Bad image list
 'bad_image_list' => "Chantaqa kay hinam:
 
@@ -3137,7 +3154,7 @@ Kikin siq'ipi ima qatiq t'inkillapas sapaqllatam hamut'arisqa, ahinataq siq'ipi
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Suni kay',
 'exif-imagelength' => 'Hanaq kay',
 'exif-bitspersample' => 'Bitkuna ñawpariqninman',
@@ -3315,14 +3332,14 @@ Kikin siq'ipi ima qatiq t'inkillapas sapaqllatam hamut'arisqa, ahinataq siq'ipi
 'exif-originalimageheight' => "Manaraq rutusqa rikch'ap hanaq kaynin",
 'exif-originalimagewidth' => "Manaraq rutusqa rikch'ap suni kaynin",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => "Mana mat'isqa",
 'exif-compression-2' => 'CCITT Huñu 3 1-tupu wakinchasqa Huffman purina suni llawiy',
 'exif-compression-3' => 'CCITT Huñu 3 tilifaks llawiy',
 'exif-compression-4' => 'CCITT Huñu 4 tilifaks llawiy',
 
 'exif-copyrighted-true' => 'Iskaychay hayñi kan',
-'exif-copyrighted-false' => 'Sapsi kapuy',
+'exif-copyrighted-false' => "Ruraqpa iskaychay hayñin kachkayqa mana sut'ichasqachu",
 
 'exif-unknowndate' => "Mana riqsisqa p'unchaw",
 
@@ -3580,7 +3597,7 @@ Kay takyachina tuyruqa $4 pachapim puchukanqa.',
 'confirmemail_body_set' => 'Pipas, qamchiki, $1 IP huchhayuq tiyaymanta,
 hukcharqan {{SITENAME}}pi "$2" sutiyuq rakiqunapaq e-chaski imamaytatam kay imamaytaman.
 
-Kay rakiquna chiqapta qamman kapuptinqa, kay t\'inkita qatiy {{SITENAME}}pi e-chaski ruranaykita musuqmanta takyachinaykipaq:
+Kay rakiquna chiqapta qamman kapuptinqa, kay t\'inkita qatiy {{SITENAME}}pi e-chaski ruranaykita takyachinaykipaq:
 
 $3
 
@@ -3693,7 +3710,6 @@ Sapsilla ñawpaq qhawariyta tukuykachay.',
 'version-other' => 'Wakin',
 'version-mediahandlers' => "Midya llamk'apuq",
 'version-hooks' => "Ch'iwinakuna",
-'version-extension-functions' => "Mast'arina ruranakuna",
 'version-parser-extensiontags' => "T'ikrana mast'arina ruranakuna",
 'version-parser-function-hooks' => "T'ikrana rurana ch'iwinakuna",
 'version-hook-name' => "Ch'iwinap sutin",
@@ -3715,12 +3731,16 @@ MediaWikitaqa mast'ariyku runakunata yanapanapaqmi, ichataq MANAM FIYAKUYTA ATIY
 'version-entrypoints-header-entrypoint' => "Yaykuna t'uksi",
 'version-entrypoints-header-url' => 'URL tiyay',
 
-# Special:FilePath
-'filepath' => 'Willañiqi ñan',
-'filepath-page' => 'Willañiqi:',
-'filepath-submit' => 'Riy',
-'filepath-summary' => "Kay sapaq p'anqaqa willañiqipaq tukuy ñannintam kutichin.
-Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapusqa wakichiwanmi chiqalla kicharikun.",
+# Special:Redirect
+'redirect' => 'Willañiqikama, ruraqkama icha musuqchay ID-kama pusapuy',
+'redirect-legend' => "Willañiqiman icha p'anqaman pusapuy",
+'redirect-submit' => 'Riy',
+'redirect-lookup' => 'Maskay:',
+'redirect-value' => 'Chani:',
+'redirect-user' => 'Ruraqpa kikin kaynin',
+'redirect-revision' => "P'anqamanta musuqchasqa",
+'redirect-file' => 'Willañiqip sutin',
+'redirect-not-exists' => 'Chaniqa manam tarisqachu',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Iskaychasqa willañiqikunata maskay',
@@ -3810,6 +3830,9 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
 'htmlform-submit' => 'Kachay',
 'htmlform-reset' => 'Hukchasqakunata kutichiy',
 'htmlform-selectorother-other' => 'Wakin',
+'htmlform-no' => 'Mana',
+'htmlform-yes' => 'Arí',
+'htmlform-chosen-placeholder' => 'Akllanata akllay',
 
 # SQLite database support
 'sqlite-has-fts' => "$1 hunt'a qillqa maskana yanapawan",
diff --git a/languages/messages/MessagesQug.php b/languages/messages/MessagesQug.php
index 0544c246..47e5546a 100644
--- a/languages/messages/MessagesQug.php
+++ b/languages/messages/MessagesQug.php
@@ -63,7 +63,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Mashna rurakkunaka chay pankata rikukuncha rikuchina',
 'tog-oldsig' => 'Kunan pachapak aspina:',
 'tog-fancysig' => 'aspinata Wiki-killkay shina rikuchina (mana ñapash tinkita churashpa)',
-'tog-showjumplinks' => '"chayman kallpana" tinkikunata sakina',
 'tog-forceeditsummary' => 'Mana uchilla willayta churashpa killkakpi willaway',
 'tog-watchlisthideown' => 'Rikushka pankakunapak mushuk killkaykunapi, ñukapak killkaykunata mana rikuchina',
 'tog-watchlisthidebots' => 'Rikushka pankakunapak mushuk killkaykunapi, antawakunapak killkaykunata mana rikuchina',
@@ -249,7 +248,7 @@ $1',
 'pool-queuefull' => 'Lankankapak suyana uku ña huntashkami',
 'pool-errorunknown' => 'Na riksishka pantay',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}manta',
 'aboutpage' => 'Project:{{SITENAME}}manta',
 'copyright' => 'Kay panka hawapi, $1 killkakunapak hayñikunaka tiyanmi',
@@ -259,7 +258,6 @@ $1',
 'disclaimers' => 'Kamachikmanta willaykuna',
 'disclaimerpage' => 'Project:Kamachikmanta kapak willaykuna',
 'edithelp' => 'Llankanapaa yanapa',
-'edithelppage' => 'Help:Imashina killkankapa yanapana ?',
 'helppage' => 'Help:Yanapa',
 'mainpage' => 'Kapak Panka',
 'mainpage-description' => 'Kapak panka',
@@ -569,7 +567,6 @@ Shuk rurakkunaka kikinpa e-chaski ''dirección''ta mana yachankachu.",
 'recentchangeslinked' => 'Shukchishka mushuk killkaykuna',
 'recentchangeslinked-toolbox' => 'Tinkishka mushuk killkaykuna',
 'recentchangeslinked-title' => '"$1"-wan tinkishka mushuk killkaykuna',
-'recentchangeslinked-noresult' => 'Tinkishka pankakunaka kay akllashka pachipi mana kutin killkashkachu karka.',
 'recentchangeslinked-summary' => "Kay pankaka tukuy shuk pankamanta pushashka pankakunapi (icha tukuy shuk ayllupi tiyak pankakunapi) mushuk killkaykunata rikuchiy. Kikinka shuk pankata [[Special:Watchlist|rikukpika]], chay pankapi mushuk killkaykunata '''yanachishkami''' kanka.",
 'recentchangeslinked-page' => 'Pankapa shuti',
 'recentchangeslinked-to' => 'Ama pankata rikuchina, ranti tukuy kay pankaman tinkiyuk pankakunapi mushuk killkaykunatalla rikuchina',
@@ -607,8 +604,6 @@ Shuk rurakkunaka kikinpa e-chaski ''dirección''ta mana yachankachu.",
 # Statistics
 'statistics' => 'Kay wikimanta yupaykuna',
 
-'disambiguationspage' => 'Template:Alli killkata akllankapak yanapa',
-
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
 'nmembers' => '$1 {{PLURAL:$1|panka|pankakuna}}',
diff --git a/languages/messages/MessagesRgn.php b/languages/messages/MessagesRgn.php
index 354c9842..d7c6e0c4 100644
--- a/languages/messages/MessagesRgn.php
+++ b/languages/messages/MessagesRgn.php
@@ -44,8 +44,6 @@ $messages = array(
 'tog-shownumberswatching' => "Fam' avdè e' nòmar d'j utent ch'j tèn sta pàgina sot occ",
 'tog-oldsig' => 'Anteprèma dla fírma bona',
 'tog-fancysig' => "Tràta la firma cumpagna e' test int'la wiki (senza nissön ligam automatich)",
-'tog-externaleditor' => "Drova sempar un prugràma d'scritura esteran (editor testuale)",
-'tog-externaldiff' => 'Drova sempar un prugràma comparator esteran (sol par j utent espert)',
 'tog-showjumplinks' => "Fa' funzionè j leghèm d'acesibilitè tipo \"Va' a\"",
 'tog-uselivepreview' => 'Drova la funziòn "Anteprèma dal viv" (u j vo Javascript; sperimentêl)',
 'tog-forceeditsummary' => "Dam la vos quènd l'ugèt dla mudèfica l'è vut",
diff --git a/languages/messages/MessagesRm.php b/languages/messages/MessagesRm.php
index 9fe45233..f944b968 100644
--- a/languages/messages/MessagesRm.php
+++ b/languages/messages/MessagesRm.php
@@ -72,9 +72,6 @@ $messages = array(
 'tog-shownumberswatching' => "Mussar il dumber d'utilisaders che obervan questa pagina",
 'tog-oldsig' => 'Signatura actuala:',
 'tog-fancysig' => "Suttascripziun senza link automatic tar la pagina da l'utilisader.",
-'tog-externaleditor' => 'Utilisar sco standard in editur extern (be per experts, basegna ina configuraziun speziala da des computer. [//www.mediawiki.org/wiki/Manual:External_editors Dapli infurmaziuns.])',
-'tog-externaldiff' => 'Utilisar sco standard in program extern per visualisar differenzas tranter versiuns (be per experts, basegna ina configuraziun speziala da des computer. [//www.mediawiki.org/wiki/Manual:External_editors Dapli infurmaziuns.])',
-'tog-showjumplinks' => 'Activar las colliaziuns "seglir a"',
 'tog-uselivepreview' => 'Utilisar la prevista dinamica (basegna JavaScript) (experiment!)',
 'tog-forceeditsummary' => 'Avertir durant memoriar sche la resumaziun manca',
 'tog-watchlisthideown' => "Zuppentar mias modificaziuns en la glista d'observaziun",
@@ -273,7 +270,7 @@ $1',
 'pool-queuefull' => 'La colona da spetga dil pool è plaina',
 'pool-errorunknown' => 'Errur nunenconuschenta',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Davart {{SITENAME}}',
 'aboutpage' => 'Project:Davart',
 'copyright' => 'Cuntegn disponibel sut $1.',
@@ -283,7 +280,6 @@ $1',
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Agid per modifitgar',
-'edithelppage' => 'Help:Prims pass',
 'helppage' => 'Help:Cuntegn',
 'mainpage' => 'Pagina principala',
 'mainpage-description' => 'Pagina principala',
@@ -362,17 +358,6 @@ Ina glista da las paginas spezialas existentas chattais vus sut [[Special:Specia
 # General errors
 'error' => 'Errur',
 'databaseerror' => 'Sbagl da la datoteca',
-'dberrortext' => 'In sbagl da la sintaxa da la dumonda a la banca da datas è capità.
-Quai po esser in sbagl en la software.
-L\'ultima dumonda per la banca da datas era:
-<blockquote><code>$1</code></blockquote>
-ord la funcziun "<code>$2</code>".
-La banca da datas ha rapportà l\'errur "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'In sbagl da la sintaxa da la dumonda a la banca da datas è capità.
-L\'ultima dumonda per la banca da datas era:
-"$1"
-ord la funcziun "$2".
-La banca da datas ha rapportà l\'errur "$3: $4"',
 'laggedslavemode' => 'Attenziun: La pagina mussada na cuntign eventualmain betg anc las ultimas midadas.',
 'readonly' => 'Banca da datas bloccada',
 'enterlockreason' => 'Inditgescha ina raschun per la bloccada da la banca da datas ed il temp cura che ti quintas che la bloccada po vegnir annullada',
@@ -428,7 +413,6 @@ Emprova danovamain en in per minutas.',
 'editinginterface' => "'''Attenziun:''' Questa pagina cuntegna text che vegn duvra en la interfatscha da questa software. 
 Midadas influenzeschan directamain l'interfatscha per tut ils utilisaders sin questa vichi. 
 Sche ti vuls far translaziuns u correcturas per tut las vichis, lura utilisescha [//translatewiki.net/ translatewiki.net], il project per translatar MediaWiki.",
-'sqlhidden' => '(Zuppentà la dumonda da SQL)',
 'cascadeprotected' => "Questa pagina è protegida da modificaziuns perquai ch'ella è integrada en suandanta{{PLURAL:$1| pagina, ch'è protegida|s paginas, ch'èn protegidas}} entras l'opziun «protecziun ertada»: 
 $2",
 'namespaceprotected' => "Ti n'has betg la lubientscha da modifitgar paginas dal tip da pagina '''$1'''.",
@@ -461,7 +445,6 @@ N'emblida betg da midar tias [[Special:Preferences|{{SITENAME}} preferenzas]].",
 'yourpassword' => 'pled-clav',
 'yourpasswordagain' => 'repeter pled-clav',
 'remembermypassword' => "S'annunziar permanantamain sin quest computer (per maximalmain $1 {{PLURAL:$1|di|dis}})",
-'securelogin-stick-https' => "Restar collià entras HTTPS suenter l'annunzia",
 'yourdomainname' => 'Vossa domain',
 'password-change-forbidden' => 'Ti na pos betg midar pleds-clav sin quest vichi.',
 'externaldberror' => "U ch'i è capità ina errur cun l'autentificaziun externa u che ti na dastgas betg actualisar tes conto extern.",
@@ -562,7 +545,7 @@ Per finir da t'annunziar stos ti definir qua in nov pled-clav:",
 'newpassword' => 'pled-clav nov:',
 'retypenew' => 'repeter pled-clav nov:',
 'resetpass_submit' => "Definir il pled clav e m'annunziar",
-'resetpass_success' => 'Tes pled-clav è vegnì midà cun success. 
+'changepassword-success' => 'Tes pled-clav è vegnì midà cun success. 
 Ti vegns annunzià…',
 'resetpass_forbidden' => 'Il pled-clav na po betg vegnir midà',
 'resetpass-no-info' => "Ti stos t'annunziar per acceder directamain questa pagina.",
@@ -574,10 +557,8 @@ Eventualmain has ti gia midà cun success tes pled-clav u dumandà per in nov pl
 
 # Special:PasswordReset
 'passwordreset' => 'Redefinir il pled-clav',
-'passwordreset-text' => "Emplenescha quest formular per retschaiver in e-mail che cuntegna ils detagls per acceder tes conto d'utilisader.",
 'passwordreset-legend' => 'Redefinir il pled-clav',
 'passwordreset-disabled' => 'La pussaivladad da redefinir il pled-clav è vegnida deactivada sin questa wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Endatescha in dals tocs da data sutvart}}',
 'passwordreset-username' => "Num d'utilisader:",
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => "Mussar l'e-mail che resultescha?",
@@ -1068,7 +1049,6 @@ Detagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/delete|page={{FULL
 'searchmenu-legend' => 'Opziuns da tschertgar',
 'searchmenu-exists' => "'''Igl exista ina pagina cun il num \"[[:\$1]] sin questa vichi\"'''",
 'searchmenu-new' => "'''Crear la pagina \"[[:\$1]]\" sin questa vichi!'''",
-'searchhelp-url' => 'Help:Cuntegn',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Mussar tut las paginas cun quest prefix]]',
 'searchprofile-articles' => 'Paginas da cuntegn',
 'searchprofile-project' => 'Agid e paginas dal project',
@@ -1113,15 +1093,6 @@ Scriva il prefix ''all:'' avant il term che ti vuls tschertgar, per tschertgar e
 Ti pos tschertgar en il fratemp cun Google. 
 Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli actualas.",
 
-# Quickbar
-'qbsettings' => 'Glista laterala',
-'qbsettings-none' => 'Nagins',
-'qbsettings-fixedleft' => 'Sanester, fixà',
-'qbsettings-fixedright' => 'Dretg, fixà',
-'qbsettings-floatingleft' => 'Sanester, flottand',
-'qbsettings-floatingright' => 'Dretg, flottand',
-'qbsettings-directionality' => 'Fixà, dependent da la direcziun da scriver da tia lingua',
-
 # Preferences page
 'preferences' => 'Preferenzas',
 'mypreferences' => 'Preferenzas',
@@ -1154,7 +1125,6 @@ Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli
 'resetprefs' => 'remetter las preferenzas (reset)',
 'restoreprefs' => 'Restituir tut las preferenzas da standard',
 'prefs-editing' => 'Modifitgar',
-'prefs-edit-boxsize' => 'Grondezza da la fanestra da modifitgar',
 'rows' => 'Lingias:',
 'columns' => 'Colonnas:',
 'searchresultshead' => 'Tschertga',
@@ -1165,9 +1135,6 @@ Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli
 'recentchangesdays-max' => 'Maximalmain $1 {{PLURAL:$1|di|dis}}',
 'recentchangescount' => 'Dumber da modificaziuns che duai vegnir mussà sco standard:',
 'prefs-help-recentchangescount' => 'Quai cumpiglia las ultimas midadas, la cronologia da paginas ed ils protocols.',
-'prefs-help-watchlist-token' => "Emplenir quest champ cun ina clav secreta vegn a generar in feed RSS per tia glista d'observaziun.
-Mintgin che enconuscha questa clav vegn ad esser abel da leger tia glista d'observaziun, tscherna pia ina clav segira.
-Qua è ina valur casuali che ti pos utilisar: $1",
 'savedprefs' => 'Tias preferenzas èn vegnidas memorisadas.',
 'timezonelegend' => "Zona d'urari:",
 'localtime' => 'Temp local:',
@@ -1198,7 +1165,6 @@ Qua è ina valur casuali che ti pos utilisar: $1",
 'prefs-reset-intro' => 'Ti pos utilisar questa pagina per restituir las valurs da standard da questa pagina per tias preferenzas. 
 Questa operaziun na po betg vegnir revocada.',
 'prefs-emailconfirm-label' => 'Confirmaziun per e-mail:',
-'prefs-textboxsize' => 'Grondezza da la fanestra da modifitgar',
 'youremail' => 'Adressa dad e-mail:',
 'username' => "{{GENDER:$1|Num d'utilisader|Num da l'utilisadra}}:",
 'uid' => "ID da l'{{GENDER:$1|utilisader|utilisadra}}:",
@@ -1439,7 +1405,6 @@ Tia adressa dad e-mail na vegn betg mussada sche auters utilisaders ta contactes
 'recentchangeslinked-feed' => 'midadas sin paginas colliadas',
 'recentchangeslinked-toolbox' => 'midadas sin paginas colliadas',
 'recentchangeslinked-title' => 'Midadas en artitgels ch\'èn colliads cun "$1"',
-'recentchangeslinked-noresult' => 'Naginas midadas sin artitgels collads durant la perioda endatada.',
 'recentchangeslinked-summary' => "Quest è ina glista da las midadas ch'èn vegnidas fatgas da curt en artitgels ch'èn colliads cun ina pagina specifica (ni en commembers d'ina categoria specifica).
 Paginas sin [[Special:Watchlist|tia glista d'observaziun]] èn '''grassas'''.",
 'recentchangeslinked-page' => 'Num da la pagina:',
@@ -1672,7 +1637,6 @@ Per cuntanscher segirezza opgimala è img_auth.php deactivà.",
 'http-read-error' => 'Sbagl da leger HTTP.',
 'http-timed-out' => 'Surpassà il temp durant la dumonda HTTP.',
 'http-curl-error' => "Errur cun recuperar l'URL: $1",
-'http-host-unreachable' => "Impussibel da cuntanscher l'URL.",
 'http-bad-status' => 'Durant la dumonda HTTP è ina errur capitada: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1825,12 +1789,6 @@ Betg emblida da controllar sche autras colliaziuns mainan als models avant ch'al
 'statistics-users-active-desc' => "Utilisaders che han fatg almain ina acziun {{PLURAL:$1|l'ultim di|ils ultims $1 dis}}",
 'statistics-mostpopular' => 'Paginas visitadas il pli savens',
 
-'disambiguations' => 'Paginas cun colliaziuns sin paginas per la decleraziun da noziuns',
-'disambiguationspage' => 'Template:disambiguiziun',
-'disambiguations-text' => "Las suandantas paginas cuntegnan almain ina colliaziun ad ina '''pagina per la decleraziun da noziuns'''.
-Eventualmain duessan ellas plitost esser cun il dretg artitgel. 
-Ina pagina vegn tractada sco pagina per la decleraziun da noziuns sch'ella cuntegna almain in dals models enumerads sin [[MediaWiki:Disambiguationspage]].",
-
 'doubleredirects' => 'Renviaments dubels',
 'doubleredirectstext' => "Questa glista mussa renviaments che mainan puspè a renviaments.
 Mintga colonna cuntegna colliaziuns a l'emprim ed al segund renviaments, sco era la pagina finala dal segund renviament che è probablamain la pagina a la quala duess vegnir renvià.
@@ -2079,10 +2037,9 @@ Midadas futuras vid questa pagina e la pagina da discussiun appertegnenta vegnan
 'unwatchthispage' => 'Betg pli observar',
 'notanarticle' => "Quai n'è betg ina pagina da cuntegn",
 'notvisiblerev' => "L'ultima versiun d'in auter utilisader è vegnida stizzada",
-'watchnochange' => 'Nagin dals artitgels che ti observeschas è vegnì midà durant la perioda da temp inditgada.',
 'watchlist-details' => "{{PLURAL:$1|Ina pagina|$1 paginas}} èn sin tia glista d'observaziun (senza dumbrar las paginas da discussiun).",
-'wlheader-enotif' => "* Il servetsch d'infurmaziun per e-mail è activà.",
-'wlheader-showupdated' => "* Artitgels ch'èn vegnids midads suenter che ti has vis els la davosa giada èn mussads '''grass'''",
+'wlheader-enotif' => "Il servetsch d'infurmaziun per e-mail è activà.",
+'wlheader-showupdated' => "Artitgels ch'èn vegnids midads suenter che ti has vis els la davosa giada èn mussads '''grass'''",
 'watchmethod-recent' => "intercurir las davosas midadas per la glista d'observaziun",
 'watchmethod-list' => 'intercurir las paginas observadas davart novas midadas',
 'watchlistcontains' => "Tia glista d'observaziun cuntegna $1 {{PLURAL:$1|pagina|paginas}}.",
@@ -2495,12 +2452,9 @@ Eventualmain è ella gia vegnida annulada.",
 Ella e bloccada en la zona d'adressas IP $2 che po vegnir debloccà.",
 'ip_range_invalid' => "Zona d'adressas IP nunvalida.",
 'ip_range_toolarge' => "Zonas da bloccadas pli grondas che /$1 n'èn betg lubidas.",
-'blockme' => 'Bloccar mai',
 'proxyblocker' => 'Bloccar proxys',
-'proxyblocker-disabled' => 'Questa funcziun è deactivada.',
 'proxyblockreason' => "Tia adressa IP è vegnida bloccada perquai ch'ella è in proxy avert. 
 Contactescha tes provider dals survetschs d'internet u ils administraturs dal sistem ed als infurmescha davart quest problem da segirezza pussaivel.",
-'proxyblocksuccess' => 'Terminà.',
 'sorbsreason' => 'Tia adressa IP fa part da la glista da proxys averts da DNSBL che vegn utilisada da {{SITENAME}}.',
 'sorbs_create_account_reason' => "Tia adressa IP fa part da la glista da proxys averts da DNSBL che vegn utilisada da {{SITENAME}}.
 Ti na pos betg crear in conto d'utilisader.",
@@ -2998,7 +2952,7 @@ Sche la datoteca è vegnida midada dal status original èn tscherts detagls even
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ladezza',
 'exif-imagelength' => 'Autezza',
 'exif-bitspersample' => 'Bits per cumponenta da colur',
@@ -3176,7 +3130,7 @@ Sche la datoteca è vegnida midada dal status original èn tscherts detagls even
 'exif-originalimageheight' => 'Autezza avant tagliar',
 'exif-originalimagewidth' => 'Ladezza avant tagliar',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Betg cumprimà',
 'exif-compression-2' => 'GGITT gruppa 3 codaziun da lunghezza currenta Hufman modifitgada en 1 dimensiun',
 'exif-compression-3' => 'CCITT gruppa 3 codaziun da fax',
@@ -3570,7 +3524,6 @@ Ti pos era utilisar [[Special:EditWatchlist|la pagina da standard]].',
 'version-other' => 'Auter',
 'version-mediahandlers' => 'Manipulaturs da meds',
 'version-hooks' => 'Hooks',
-'version-extension-functions' => 'Funcziuns dad extensiuns',
 'version-parser-extensiontags' => 'Tags che extendan il parser',
 'version-parser-function-hooks' => 'Hooks per funcziuns dal parser',
 'version-hook-name' => 'Num dal hook',
@@ -3592,15 +3545,6 @@ Ti duessas avair retschavì [{{SERVER}}{{SCRIPTPATH}}/COPYING ina copia da la GN
 'version-entrypoints-header-entrypoint' => "Punct d'entrada",
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Percurs da la datoteca',
-'filepath-page' => 'Datoteca:',
-'filepath-submit' => 'Dai',
-'filepath-summary' => 'Questa pagina speciala inditgescha l\'adressa cumpletta per ina datoteca. 
-Maletgs vegnan mussads en resoluziun cumpletta, auters tips da datoteca vegnan averts directamain cun lur program assozià. 
-
-Endatescha il num da datoteca senza il prefix "{{ns:file}}:".',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Tschertgar datotecas dublas',
 'fileduplicatesearch-summary' => 'Tschertgar datotecas dublas a basa da valurs da hash.',
diff --git a/languages/messages/MessagesRo.php b/languages/messages/MessagesRo.php
index 2eb7e599..2304fb67 100644
--- a/languages/messages/MessagesRo.php
+++ b/languages/messages/MessagesRo.php
@@ -328,9 +328,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Arată numărul utilizatorilor care urmăresc',
 'tog-oldsig' => 'Semnătură actuală:',
 'tog-fancysig' => 'Tratează semnătura ca wikitext (fără o legătură automată)',
-'tog-externaleditor' => 'Utilizează, în mod implicit, un editor extern (Doar pentru experți; necesită setări speciale pe calculatorul dumneavoastră. [//www.mediawiki.org/wiki/Manual:External_editors Mai multe informații.])',
-'tog-externaldiff' => 'Utilizează, în mod implicit, un program extern pentru diferențele între versiuni (Doar pentru experți; necesită setări speciale pe calculatorul dumneavoastră. [//www.mediawiki.org/wiki/Manual:External_editors Mai multe informații.])',
-'tog-showjumplinks' => 'Activează legăturile de accesibilitate „sari la”',
 'tog-uselivepreview' => 'Folosește previzualizarea în timp real (experimental)',
 'tog-forceeditsummary' => 'Avertizează-mă când uit să descriu modificările',
 'tog-watchlisthideown' => 'Ascunde modificările mele la lista mea de urmărire',
@@ -344,6 +341,8 @@ $messages = array(
 'tog-showhiddencats' => 'Arată categoriile ascunse',
 'tog-noconvertlink' => 'Dezactivează conversia titlurilor',
 'tog-norollbackdiff' => 'Nu arăta diferența după efectuarea unei reveniri',
+'tog-useeditwarning' => 'Avertizează-mă când părăsesc o pagină fără a salva modificările',
+'tog-prefershttps' => 'Utilizează întotdeauna o conexiune securizată când sunt autentificat(ă)',
 
 'underline-always' => 'Întotdeauna',
 'underline-never' => 'Niciodată',
@@ -407,6 +406,18 @@ $messages = array(
 'oct' => 'oct',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1 ianuarie',
+'february-date' => '$1 februarie',
+'march-date' => '$1 martie',
+'april-date' => '$1 aprilie',
+'may-date' => '$1 mai',
+'june-date' => '$1 iunie',
+'july-date' => '$1 iulie',
+'august-date' => '$1 august',
+'september-date' => '$1 septembrie',
+'october-date' => '$1 octombrie',
+'november-date' => '$1 noiembrie',
+'december-date' => '$1 decembrie',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorie|Categorii}}',
@@ -427,7 +438,7 @@ $messages = array(
 'noindex-category' => 'Pagini neindexate',
 'broken-file-category' => 'Pagini cu legături invalide către fișiere',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Despre',
 'article' => 'Articol',
@@ -490,6 +501,7 @@ $messages = array(
 'create-this-page' => 'Creați această pagină',
 'delete' => 'Ștergere',
 'deletethispage' => 'Șterge pagina',
+'undeletethispage' => 'Recuperează această pagină',
 'undelete_short' => 'Recuperarea {{PLURAL:$1|unei modificări|a $1 modificări|a $1 de modificări}}',
 'viewdeleted_short' => 'Vedeți {{PLURAL:$1|o modificare ștearsă|$1 (de) modificări șterse}}',
 'protect' => 'Protejare',
@@ -506,7 +518,7 @@ $messages = array(
 'articlepage' => 'Vedeți articolul',
 'talk' => 'Discuție',
 'views' => 'Vizualizări',
-'toolbox' => 'Trusa de unelte',
+'toolbox' => 'Unelte',
 'userpage' => 'Vizualizați pagina utilizatorului',
 'projectpage' => 'Vizualizați pagina proiectului',
 'imagepage' => 'Vizualizați pagina fișierului',
@@ -533,7 +545,7 @@ $1',
 'pool-queuefull' => 'Coada de așteptare este plină',
 'pool-errorunknown' => 'Eroare necunoscută',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Despre {{SITENAME}}',
 'aboutpage' => 'Project:Despre',
 'copyright' => 'Conținutul este disponibil sub $1, exceptând cazurile în care se specifică altfel.',
@@ -543,7 +555,6 @@ $1',
 'disclaimers' => 'Termeni',
 'disclaimerpage' => 'Project:Termeni',
 'edithelp' => 'Ajutor pentru modificare',
-'edithelppage' => 'Help:Cum să modifici o pagină',
 'helppage' => 'Help:Ajutor',
 'mainpage' => 'Pagina principală',
 'mainpage-description' => 'Pagina principală',
@@ -620,17 +631,12 @@ O listă cu paginile speciale valide se poate găsi la [[Special:SpecialPages|{{
 # General errors
 'error' => 'Eroare',
 'databaseerror' => 'Eroare la baza de date',
-'dberrortext' => 'A apărut o eroare în sintaxa interogării bazei de date.
-Acest lucru poate indica o problemă în program.
-Ultima interogare trimisă către baza de date a fost:
-<blockquote><code>$1</code></blockquote>
-din cadrul funcției „<code>$2</code>”.
-Baza de date a returnat eroarea „<samp>$3: $4</samp>”.',
-'dberrortextcl' => 'A apărut o eroare de sintaxă în interogare.
-Ultima interogare încercată a fost:
-„$1”
-din funcția „$2”.
-Baza de date a returnat eroarea „$3: $4”',
+'databaseerror-text' => 'A apărut o eroare la interogarea bazei de date.
+Acest lucru poate însemna o problemă de software.',
+'databaseerror-textcl' => 'A apărut o eroare la interogarea bazei de date.',
+'databaseerror-query' => 'Interogare: $1',
+'databaseerror-function' => 'Funcție: $1',
+'databaseerror-error' => 'Eroare: $1',
 'laggedslavemode' => 'Atenție: S-ar putea ca pagina să nu conțină ultimele actualizări.',
 'readonly' => 'Baza de date este blocată la scriere',
 'enterlockreason' => 'Precizează motivul pentru blocare, incluzând o estimare a termenului de deblocare a bazei de date',
@@ -664,6 +670,7 @@ S-ar putea ca acesta să fi fost deja șters de altcineva.',
 'cannotdelete-title' => 'Imposibil de șters pagina „$1”',
 'delete-hook-aborted' => 'Ștergerea a fost abandonată din cauza unui hook.
 Nicio explicație furnizată.',
+'no-null-revision' => 'Nu s-a putut crea o nouă versiune nulă pentru pagina „$1”',
 'badtitle' => 'Titlu incorect',
 'badtitletext' => 'Titlul paginii căutate este incorect, gol sau este o legătură interlinguală sau interwiki incorectă.
 Poate conține unul sau mai multe caractere ce nu pot fi folosite în titluri.',
@@ -686,12 +693,15 @@ Pentru a adăuga sau modifica traduceri corespunzătoare tuturor wikiurilor, uti
 'editinginterface' => "'''Avertizare''': Modificați o pagină care este folosită pentru a furniza textul interfeței software.
 Modificările aduse acestei pagini vor afecta aspectul interfeței pentru alți utilizatori ai acestui wiki.
 Pentru a adăuga sau modifica traduceri corespunzătoare tuturor wikiurilor, utilizați [//translatewiki.net/ translatewiki.net], proiectul MediaWiki de localizare.",
-'sqlhidden' => '(interogare SQL ascunsă)',
 'cascadeprotected' => 'Această pagină a fost protejată la scriere deoarece este inclusă în {{PLURAL:$1|următoarea pagină|următoarele pagini}}, care {{PLURAL:$1|este protejată|sunt protejate}} în cascadă:
 $2',
 'namespaceprotected' => "Nu aveți permisiunea de a modifica pagini din spațiul de nume '''$1'''.",
 'customcssprotected' => 'Nu aveți permisiunea de a modifica această pagină CSS, deoarece conține setările personale ale altui utilizator.',
 'customjsprotected' => 'Nu aveți permisiunea de a modifica această pagină JavaScript, deoarece conține setările personale ale altui utilizator.',
+'mycustomcssprotected' => 'Nu aveți permisiunea să modificați această pagină CSS.',
+'mycustomjsprotected' => 'Nu aveți permisiunea să modificați această pagină JavaScript.',
+'myprivateinfoprotected' => 'Nu aveți permisiunea să vă modificați informațiile personale.',
+'mypreferencesprotected' => 'Nu aveți permisiunea să vă modificați preferințele.',
 'ns-specialprotected' => 'Paginile din spațiul de nume {{ns:special}} nu pot fi editate.',
 'titleprotected' => "Acest titlu a fos protejat la creare de [[User:$1|$1]].
 Motivul invocat este ''$2''.",
@@ -716,10 +726,19 @@ Administratorul care a efectuat blocarea a furnizat explicația: „$3”.',
 'welcomecreation-msg' => 'Contul dumneavoastră a fost creat.
 Nu uitați să vă modificați [[Special:Preferences|preferințele]] pentru {{SITENAME}}.',
 'yourname' => 'Nume de utilizator:',
+'userlogin-yourname' => 'Nume de utilizator',
+'userlogin-yourname-ph' => 'Introduceți numele de utilizator',
+'createacct-another-username-ph' => 'Introduceți numele de utilizator',
 'yourpassword' => 'Parolă:',
+'userlogin-yourpassword' => 'Parolă',
+'userlogin-yourpassword-ph' => 'Introduceți parola',
+'createacct-yourpassword-ph' => 'Introduceți o parolă',
 'yourpasswordagain' => 'Repetați parola:',
+'createacct-yourpasswordagain' => 'Confirmare parolă',
+'createacct-yourpasswordagain-ph' => 'Introduceți parola din nou',
 'remembermypassword' => 'Autentificare automată de la acest calculator (expiră după {{PLURAL:$1|24 de ore|$1 zile|$1 de zile}})',
-'securelogin-stick-https' => 'Rămâi conectat la HTTPS după autentificare',
+'userlogin-remembermypassword' => 'Păstrează-mă autentificat',
+'userlogin-signwithsecure' => 'Utilizează conexiunea securizată',
 'yourdomainname' => 'Domeniul dumneavoastră:',
 'password-change-forbidden' => 'Nu puteți schimba parole pe acest wiki.',
 'externaldberror' => 'A fost fie o eroare de bază de date pentru o autentificare extenă sau nu aveți permisiunea să actualizați contul extern.',
@@ -731,18 +750,44 @@ Nu uitați să vă modificați [[Special:Preferences|preferințele]] pentru {{SI
 'logout' => 'Închidere sesiune',
 'userlogout' => 'Închide sesiunea',
 'notloggedin' => 'Nu sunteți autentificat',
+'userlogin-noaccount' => 'Nu aveți cont încă?',
+'userlogin-joinproject' => 'Înscrieți-vă la {{SITENAME}}',
 'nologin' => 'Nu aveți cont încă? $1.',
 'nologinlink' => 'Creați-vă un cont de utilizator acum',
 'createaccount' => 'Creare cont',
 'gotaccount' => "Aveți deja un cont de utilizator? '''$1'''.",
 'gotaccountlink' => 'Autentificați-vă',
 'userlogin-resetlink' => 'Ați uitat datele de autentificare?',
+'userlogin-resetpassword-link' => 'Resetare parolă',
+'helplogin-url' => 'Help:Autentificare',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajutor la autentificare]]',
+'userlogin-loggedin' => 'Sunteți deja {{GENDER:$1|autentificat|autentificată}} ca {{GENDER:$1|$1}}.
+Utilizați formularul de mai jos pentru a vă autentifica cu alt nume de utilizator.',
+'userlogin-createanother' => 'Creează un alt cont',
+'createacct-join' => 'Introduceți-vă informațiile mai jos.',
+'createacct-another-join' => 'Introduceți, mai jos, informațiile noului cont.',
+'createacct-emailrequired' => 'Adresă de e-mail',
+'createacct-emailoptional' => 'Adresă de e-mail (opțională)',
+'createacct-email-ph' => 'Introduceți adresa dumnevoastră de e-mail',
+'createacct-another-email-ph' => 'Introduceți adresa de e-mail',
 'createaccountmail' => 'Utilizează o parolă temporară aleasă la întâmplare și o trimite la adresa de e-mail indicată',
+'createacct-realname' => 'Nume real (opțional)',
 'createaccountreason' => 'Motiv:',
+'createacct-reason' => 'Motiv',
+'createacct-reason-ph' => 'De ce creați un alt cont',
+'createacct-captcha' => 'Verificare de securitate',
+'createacct-imgcaptcha-ph' => 'Introduceți textul pe care îl vedeți deasupra',
+'createacct-submit' => 'Creați-vă contul',
+'createacct-another-submit' => 'Creează un alt cont',
+'createacct-benefit-heading' => '{{SITENAME}} este un proiect clădit de oameni ca dumneavoastră.',
+'createacct-benefit-body1' => '{{PLURAL:$1|modificare|modificări|de modificări}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pagină|pagini|de pagini}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contribuitor recent|contribuitori recenți|de contribuitori recenți}}',
 'badretype' => 'Parolele pe care le-ați introdus diferă.',
 'userexists' => 'Numele de utilizator pe care l-ați introdus este deja folosit.
 Vă rugăm să alegeți un alt nume.',
 'loginerror' => 'Eroare de autentificare',
+'createacct-error' => 'Eroare la crearea contului',
 'createaccounterror' => 'Nu pot crea contul: $1',
 'nocookiesnew' => 'Contul a fost creat, dar nu sunteți autentificat{{GENDER:||ă|}}. {{SITENAME}} folosește module cookie pentru a reține utilizatorii autentificați. Navigatorul dumneavoastră are aceste module cookie dezactivate. Vă rugăm să le activați și să vă reautentificați folosind noul nume de utilizator și noua parolă.',
 'nocookieslogin' => '{{SITENAME}} folosește module cookie pentru a autentifica utilizatorii. Browser-ul dvs. are cookie-urile dezactivate. Vă rugăm să le activați și să incercați din nou.',
@@ -797,11 +842,13 @@ Este de dorit să vă autentificați și să schimbați parola cât mai repede.
 
 Ignorați acest mesaj dacă crearea contului s-a produs în urma unei greșeli.',
 'usernamehasherror' => 'Numele de utilizator nu poate conține caractere diez (#)',
-'login-throttled' => 'Ați avut prea multe încercări de a vă autentifica.
-Vă rugăm să așteptați până să mai încercați.',
+'login-throttled' => 'Ați avut prea multe încercări recente de a vă autentifica.
+Vă rugăm să așteptați $1 până să reîncercați.',
 'login-abort-generic' => 'Procesul de autentificare a eșuat și a fost abandonat',
 'loginlanguagelabel' => 'Limba: $1',
 'suspicious-userlogout' => 'Cererea dumneavoastră de a închide sesiunea a fost refuzată întrucât pare că a fost trimisă printr-o eroare a navigatorului sau de un proxy memorat în cache.',
+'createacct-another-realname-tip' => 'Numele real este opțional.
+Dacă decideți furnizarea sa, acesta va fi folosit pentru a atribui utilizatorului munca sa.',
 
 # Email sending
 'php-mail-error-unknown' => 'Eroare necunoscută în funcția PHP mail()',
@@ -817,7 +864,7 @@ Vă rugăm să așteptați până să mai încercați.',
 'newpassword' => 'Parola nouă:',
 'retypenew' => 'Reintroduceți noua parolă:',
 'resetpass_submit' => 'Setează parola și autentifică',
-'resetpass_success' => 'Parola a fost schimbată cu succes! Autentificare în curs...',
+'changepassword-success' => 'Parola dumneavoastră a fost schimbată cu succes!',
 'resetpass_forbidden' => 'Parolele nu pot fi schimbate.',
 'resetpass-no-info' => 'Trebuie să fiți autentificat pentru a accesa această pagină direct.',
 'resetpass-submit-loggedin' => 'Modifică parola',
@@ -829,10 +876,11 @@ Este posibil să fi reușit deja schimbarea parolei sau să fi cerut o parolă t
 
 # Special:PasswordReset
 'passwordreset' => 'Resetare parolă',
-'passwordreset-text' => 'Completați acest formular pentru a vă reseta parola.',
+'passwordreset-text-one' => 'Completați acest formular pentru a vă reseta parola.',
+'passwordreset-text-many' => '{{PLURAL:$1|Completați unul din câmpuri pentru a vă reseta parola.}}',
 'passwordreset-legend' => 'Resetare parolă',
 'passwordreset-disabled' => 'Resetarea parolei a fost dezactivată pe acest wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Introduceți mai jos o parte din informații}}',
+'passwordreset-emaildisabled' => 'Funcțiile de e-mail au fost dezactivate de pe acest wiki.',
 'passwordreset-username' => 'Nume de utilizator:',
 'passwordreset-domain' => 'Domeniu:',
 'passwordreset-capture' => 'Vizualizați e-mailul rezultat?',
@@ -859,7 +907,7 @@ Ar trebui să vă autentificați și să alegeți acum o nouă parolă. Dacă al
 Parolă temporară: $2',
 'passwordreset-emailsent' => 'A fost trimis un e-mail de resetare a parolei.',
 'passwordreset-emailsent-capture' => 'Un mesaj de resetare a parolei a fost trimis, fiind afișat mai jos.',
-'passwordreset-emailerror-capture' => 'Un mesaj de resetare a parolei a fost generat (fiind afișat mai jos), dar trimiterea sa către utilizator a eșuat: $1',
+'passwordreset-emailerror-capture' => 'Un mesaj de resetare a parolei a fost generat (fiind afișat mai jos), dar trimiterea sa către {{GENDER:$2|utilizator}} a eșuat: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Modificare adresă de e-mail',
@@ -873,6 +921,19 @@ Parolă temporară: $2',
 'changeemail-submit' => 'Modifică adresa de e-mail',
 'changeemail-cancel' => 'Revocare',
 
+# Special:ResetTokens
+'resettokens' => 'Resetare jetoane',
+'resettokens-text' => 'Puteți reseta, aici, jetoanele care permit accesul la anumite date asociate contului dumneavoastră.
+
+Ar trebui să faceți acest lucru numai dacă le-ați partajat accidental cu altcineva ori contul dumneavoastră a fost compromis.',
+'resettokens-no-tokens' => 'Nu există jetoane de resetat.',
+'resettokens-legend' => 'Resetare jetoane',
+'resettokens-tokens' => 'Jetoane:',
+'resettokens-token-label' => '$1 (valoare actuală: $2)',
+'resettokens-watchlist-token' => 'Jeton pentru fluxul web (Atom/RSS) al [[Special:Watchlist|modificărilor aduse paginilor pe care le urmăriți]]',
+'resettokens-done' => 'Jetoane resetate.',
+'resettokens-resetbutton' => 'Resetează jetoanele selectate',
+
 # Edit page toolbar
 'bold_sample' => 'Text aldin',
 'bold_tip' => 'Text aldin',
@@ -1072,12 +1133,15 @@ Nicio explicație furnizată.',
 Se pare că a fost ștearsă.',
 'edit-conflict' => 'Conflict de modificare.',
 'edit-no-change' => 'Modificarea dvs. a fost ignorată deoarece nu s-a efectuat nicio schimbare.',
+'postedit-confirmation' => 'Modificarea dumneavoastră a fost salvată.',
 'edit-already-exists' => 'Pagina nouă nu a putut fi creată.
 Ea există deja.',
 'defaultmessagetext' => 'Textul implicit',
 'content-failed-to-parse' => 'Nu s-a putut analiza conținutul de tip $2 pentru modelul $1: $3',
 'invalid-content-data' => 'Date de conținut invalide',
 'content-not-allowed-here' => 'Conținutul de tip „$1” nu este permis pe pagina [[$2]]',
+'editwarning-warning' => 'Părăsind această pagină, există riscul pierderii modificărilor efectuate.
+Dacă sunteți autentificat, puteți dezactiva această avertizare în secțiunea „Modificare” a preferințelor dumneavoastră.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1112,6 +1176,7 @@ Acsete argumente au fost omise.',
 'undo-failure' => 'Modificarea nu poate fi reversibilă datorită conflictului de modificări intermediare.',
 'undo-norev' => 'Modificarea nu poate fi reversibilă pentru că nu există sau pentru că a fost ștearsă.',
 'undo-summary' => 'Anularea modificării $1 făcute de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discuție]])',
+'undo-summary-username-hidden' => 'Anularea versiunii $1 a unui utilizator ascuns',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Crearea contului nu poate fi realizată',
@@ -1290,6 +1355,7 @@ Folosirea linkurilor de navigare va reseta această coloană.',
 'compareselectedversions' => 'Compară versiunile marcate',
 'showhideselectedversions' => 'Șterge/recuperează versiunile marcate',
 'editundo' => 'anulare',
+'diff-empty' => '(Nicio diferență)',
 'diff-multi' => '(Nu {{PLURAL:$1|s-a afișat o versiune intermediară efectuată|s-au afișat $1 versiuni intermediare efectuate|s-au afișat $1 de versiuni intermediare efectuate}} de {{PLURAL:$2|un utilizator|$2 utilizatori|$2 de utilizatori}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|O versiune intermediară efectuată de|$1 (de) versiuni intermediare efectuate de peste}} $2 {{PLURAL:$2|utilizator|utilizatori}} {{PLURAL:$1|neafișată|neafișate}})',
 'difference-missing-revision' => '{{PLURAL:$2|O versiune a|$2 versiuni ale|$2 de versiuni ale}} acestei diferențe ($1) nu {{PLURAL:$2|a fost găsită|au fost găsite}}.
@@ -1317,7 +1383,6 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'searchmenu-legend' => 'Opțiuni căutare',
 'searchmenu-exists' => "'''Există o pagină cu titlul „[[:$1]]'” pe acest site.'''",
 'searchmenu-new' => "'''Creați pagina „[[:$1]]” pe acest wiki!'''",
-'searchhelp-url' => 'Help:Ajutor',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Răsfoiește paginile cu acest prefix]]',
 'searchprofile-articles' => 'Pagini cu conținut',
 'searchprofile-project' => 'Pagini din spațiile Proiect și Ajutor',
@@ -1359,15 +1424,7 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'powersearch-togglenone' => 'Nimic',
 'search-external' => 'Căutare externă',
 'searchdisabled' => '<p>Ne pare rău! Căutarea după text a fost dezactivată temporar, din motive de performanță. Între timp puteți folosi căutarea prin Google mai jos, însă aceasta poate să dea rezultate învechite.</p>',
-
-# Quickbar
-'qbsettings' => 'Setări pentru bara rapidă',
-'qbsettings-none' => 'Fără',
-'qbsettings-fixedleft' => 'Fixă, în stânga',
-'qbsettings-fixedright' => 'Fixă, în dreapta',
-'qbsettings-floatingleft' => 'Liberă',
-'qbsettings-floatingright' => 'Plutire la dreapta',
-'qbsettings-directionality' => 'Fixat, în funcție de direcția în care se face scrierea în limba dumneavoastră',
+'search-error' => 'A apărut o eroare în timpul căutării: $1',
 
 # Preferences page
 'preferences' => 'Preferințe',
@@ -1401,7 +1458,6 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'resetprefs' => 'Resetează preferințele',
 'restoreprefs' => 'Restaurează toate valorile implicite (în toate secțiunile)',
 'prefs-editing' => 'Modificare',
-'prefs-edit-boxsize' => 'Mărimea ferestrei de modificare.',
 'rows' => 'Rânduri:',
 'columns' => 'Coloane:',
 'searchresultshead' => 'Parametri căutare',
@@ -1412,9 +1468,9 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'recentchangesdays-max' => '(maxim {{PLURAL:$1|o zi|$1 zile}})',
 'recentchangescount' => 'Numărul modificărilor afișate implicit:',
 'prefs-help-recentchangescount' => 'Sunt incluse schimbările recente, istoricul paginilor și jurnalele.',
-'prefs-help-watchlist-token' => 'Completând această căsuță cu o cheie secretă se va genera un flux RSS pentru lista dumneavoastră de pagini urmărite.
-Oricine cunoaște cheia din această căsuță va putea citi această listă, așa că alegeți o combinație sigură.
-Aici se află o combinație generată aleator pe care o puteți folosi: $1',
+'prefs-help-watchlist-token2' => 'Aceasta este cheia secretă pentru fluxul web al listei dumneavoastră de pagini urmărite.
+Oricine o cunoaște vă va putea citi lista de pagini urmărite, așa că n-o partajați cu nimeni.
+[[Special:ResetTokens|Faceți clic aici dacă doriți să o resetați]].',
 'savedprefs' => 'Preferințele dumneavoastră au fost salvate.',
 'timezonelegend' => 'Fus orar:',
 'localtime' => 'Ora locală:',
@@ -1445,7 +1501,6 @@ Aici se află o combinație generată aleator pe care o puteți folosi: $1',
 'prefs-reset-intro' => 'Poți folosi această pagină pentru a reseta preferințele la valorile implicite.
 Acțiunea nu este reversibilă.',
 'prefs-emailconfirm-label' => 'Confirmare e-mail:',
-'prefs-textboxsize' => 'Mărime căsuță de modificare',
 'youremail' => 'Adresă de e-mail:',
 'username' => '{{GENDER:$1|Nume de utilizator}}:',
 'uid' => 'ID {{GENDER:$1|utilizator|utilizatoare}}:',
@@ -1479,6 +1534,8 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'prefs-dateformat' => 'Format dată',
 'prefs-timeoffset' => 'Decalaj orar',
 'prefs-advancedediting' => 'Opțiuni generale',
+'prefs-editor' => 'Editor',
+'prefs-preview' => 'Previzualizare',
 'prefs-advancedrc' => 'Opțiuni avansate',
 'prefs-advancedrendering' => 'Opțiuni avansate',
 'prefs-advancedsearchoptions' => 'Opțiuni avansate',
@@ -1486,7 +1543,9 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'prefs-displayrc' => 'Opțiuni de afișare',
 'prefs-displaysearchoptions' => 'Opțiuni de afișare',
 'prefs-displaywatchlist' => 'Opțiuni de afișare',
+'prefs-tokenwatchlist' => 'Jeton',
 'prefs-diffs' => 'Diferențe',
+'prefs-help-prefershttps' => 'Această preferință va avea efect la următoarea autentificare.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Adresa de e-mail pare validă',
@@ -1513,6 +1572,8 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'userrights-notallowed' => 'Nu aveți permisiunea de a acorda sau elimina drepturi utilizatorilor.',
 'userrights-changeable-col' => 'Grupuri pe care le puteți schimba',
 'userrights-unchangeable-col' => 'Grupuri pe care nu le puteți schimba',
+'userrights-conflict' => 'Conflict al schimbării drepturilor de utilizator! Reverificați și confirmați-vă modificările.',
+'userrights-removed-self' => 'V-ați eliminat cu succes propriile drepturi. Ca urmare, nu mai puteți accesa această pagină.',
 
 # Groups
 'group' => 'Grup:',
@@ -1578,11 +1639,19 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'right-proxyunbannable' => 'Trece peste blocarea automată a proxy-urilor',
 'right-unblockself' => 'Se deblochează singur',
 'right-protect' => 'Schimbă nivelurile de protejare și modifică pagini protejate în cascadă',
-'right-editprotected' => 'Modificare pagini protejate (fără protejare în cascadă)',
+'right-editprotected' => 'Modifică pagini protejate ca „{{int:protect-level-sysop}}”',
+'right-editsemiprotected' => 'Modifică pagini protejate ca „{{int:protect-level-autoconfirmed}}”',
 'right-editinterface' => 'Modificare interfața cu utilizatorul',
 'right-editusercssjs' => 'Modifică fișierele CSS și JS ale altor utilizatori',
 'right-editusercss' => 'Modifică fișierele CSS ale altor utilizatori',
 'right-edituserjs' => 'Modifică fișierele JS ale altor utilizatori',
+'right-editmyusercss' => 'Modificați-vă propriile fișiere CSS',
+'right-editmyuserjs' => 'Modificați-vă propriile fișiere JavaScript',
+'right-viewmywatchlist' => 'Vizualizați propria listă de pagini urmărite',
+'right-editmywatchlist' => 'Modificați propria listă de pagini urmărite. Rețineți că anumite acțiuni vor adăuga pagini chiar și fără acest drept.',
+'right-viewmyprivateinfo' => 'Vizualizați-vă datele private (de ex. adresa de e-mail, numele real)',
+'right-editmyprivateinfo' => 'Modificați-vă datele private (de ex. adresa de e-mail, numele real)',
+'right-editmyoptions' => 'Modificați-vă preferințele',
 'right-rollback' => 'Revocă rapid modificările ultimului utilizator care a modificat o pagină particulară',
 'right-markbotedits' => 'Marchează revenirea ca modificare efectuată de robot',
 'right-noratelimit' => 'Neafectat de limitele raportului',
@@ -1644,12 +1713,19 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'action-userrights-interwiki' => 'modificați permisiunile utilizatorilor de pe alte wiki',
 'action-siteadmin' => 'blocați sau deblocați baza de date',
 'action-sendemail' => 'trimite e-mailuri',
+'action-editmywatchlist' => 'vă modificați lista de pagini urmărite',
+'action-viewmywatchlist' => 'vă vizualizați lista de pagini urmărite',
+'action-viewmyprivateinfo' => 'vă vizualizați informațiile personale',
+'action-editmyprivateinfo' => 'să vă modificați informațiile personale',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|modificare|modificări|de modificări}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|de la ultima vizită}}',
+'enhancedrc-history' => 'istoric',
 'recentchanges' => 'Schimbări recente',
 'recentchanges-legend' => 'Opțiuni schimbări recente',
 'recentchanges-summary' => 'Urmăriți cele mai recente modificări din wiki pe această pagină.',
+'recentchanges-noresult' => 'Nicio modificare din intervalul specificat nu corespunde acestor criterii.',
 'recentchanges-feed-description' => 'Urmărește cele mai recente schimbări folosind acest flux.',
 'recentchanges-label-newpage' => 'Această modificare a creat o pagină nouă',
 'recentchanges-label-minor' => 'Aceasta este o modificare minoră',
@@ -1689,7 +1765,6 @@ $3',
 'recentchangeslinked-feed' => 'Modificări corelate',
 'recentchangeslinked-toolbox' => 'Modificări corelate',
 'recentchangeslinked-title' => 'Modificări legate de „$1”',
-'recentchangeslinked-noresult' => 'Nici o schimbare la paginile legate în perioada dată.',
 'recentchangeslinked-summary' => "Aceasta este o listă a schimbărilor efectuate recent asupra paginilor cu legături de la o anumită pagină (sau asupra membrilor unei anumite categorii).
 Paginile pe care le [[Special:Watchlist|urmăriți]] apar în '''aldine'''.",
 'recentchangeslinked-page' => 'Numele paginii:',
@@ -1701,7 +1776,7 @@ Paginile pe care le [[Special:Watchlist|urmăriți]] apar în '''aldine'''.",
 'reuploaddesc' => 'Revocare încărcare și întoarcere la formularul de trimitere.',
 'upload-tryagain' => 'Trimiteți descrierea fișierului modificată',
 'uploadnologin' => 'Nu sunteți autentificat',
-'uploadnologintext' => 'Trebuie să fiți [[Special:UserLogin|autentificat]] pentru a putea trimite fișiere.',
+'uploadnologintext' => 'Trebuie să vă $1 pentru a încărca fișiere.',
 'upload_directory_missing' => 'Directorul în care sunt încărcate fișierele ($1) lipsește și nu poate fi creat de serverul web.',
 'upload_directory_read_only' => 'Directorul de încărcare ($1) nu poate fi scris de server.',
 'uploaderror' => 'Eroare la trimitere fișier',
@@ -1914,7 +1989,6 @@ Pentru securitate optimă, img_auth.php este dezactivat.',
 'http-read-error' => 'S-a produs o eroare în timpul citirii HTTP.',
 'http-timed-out' => 'Cererea HTTP a expirat.',
 'http-curl-error' => 'Eroare la preluarea adresei URL: $1',
-'http-host-unreachable' => 'Adresa URL nu a putut fi accesată.',
 'http-bad-status' => 'A apărut o problemă în timpul solicitării HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1945,6 +2019,10 @@ Poate doriți să încercați la o oră mai puțin ocupată.',
 'listfiles_size' => 'Mărime (octeți)',
 'listfiles_description' => 'Descriere',
 'listfiles_count' => 'Versiuni',
+'listfiles-show-all' => 'Include versiunile vechi ale imaginilor',
+'listfiles-latestversion' => 'Versiunea curentă',
+'listfiles-latestversion-yes' => 'Da',
+'listfiles-latestversion-no' => 'Nu',
 
 # File description page
 'file-anchor-link' => 'Fișier',
@@ -2052,6 +2130,13 @@ Lista tipurilor MIME recunoscute de MediaWiki poate fi găsită la [http://svn.w
 'randompage' => 'Pagină aleatorie',
 'randompage-nopages' => 'Nu există pagini în {{PLURAL:$2|spațiul|spațiile}} de nume: $1.',
 
+# Random page in category
+'randomincategory' => 'Pagină aleatorie din categorie',
+'randomincategory-invalidcategory' => '„$1” nu este un nume de categorie valid.',
+'randomincategory-nopages' => 'Nu există pagini în [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Obțineți, aleatoriu, o pagină din categoria: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Du-te',
+
 # Random redirect
 'randomredirect' => 'Redirecționare aleatorie',
 'randomredirect-nopages' => 'Nu există redirecționări în spațiul de nume "$1".',
@@ -2077,17 +2162,13 @@ Lista tipurilor MIME recunoscute de MediaWiki poate fi găsită la [http://svn.w
 'statistics-users-active-desc' => 'Utilizatori care au efectuat o acțiune în {{PLURAL:$1|ultima zi|ultimele $1 zile}}',
 'statistics-mostpopular' => 'Paginile cele mai vizualizate',
 
-'disambiguations' => 'Pagini care trimit către pagini de dezambiguizare',
-'disambiguationspage' => 'Template:Dezambiguizare',
-'disambiguations-text' => "Paginile următoare conțin cel puțin o legătură către o '''pagină de dezambiguizare'''.
-Acestea ar trebui să conțină legături către un articol mai potrivit.<br />
-O pagină este considerată o pagină de dezambiguizare dacă folosește formate care apar la [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Pagini cu o proprietate de pagină',
 'pageswithprop-legend' => 'Pagini cu o proprietate de pagină',
 'pageswithprop-text' => 'Această pagină listează paginile care utilizează o anumită proprietate de pagină.',
 'pageswithprop-prop' => 'Numele proprietății:',
 'pageswithprop-submit' => 'Du-te',
+'pageswithprop-prophidden-long' => 'valoarea proprietății de text lung ascunsă ($1)',
+'pageswithprop-prophidden-binary' => 'valoarea proprietății binare ascunsă ($1)',
 
 'doubleredirects' => 'Redirecționări duble',
 'doubleredirectstext' => 'Această listă conține pagini care redirecționează la alte pagini de redirecționare.
@@ -2145,6 +2226,7 @@ Intrările <del>tăiate</del> au fost rezolvate.',
 'mostrevisions' => 'Articole cu cele mai multe revizuiri',
 'prefixindex' => 'Toate paginile cu prefix',
 'prefixindex-namespace' => 'Toate paginile cu prefix (spațiul de nume $1)',
+'prefixindex-strip' => 'Înlătură prefixul din cadrul listei',
 'shortpages' => 'Pagini scurte',
 'longpages' => 'Pagini lungi',
 'deadendpages' => 'Pagini fără legături',
@@ -2160,6 +2242,7 @@ Intrările <del>tăiate</del> au fost rezolvate.',
 'listusers' => 'Listă utilizatori',
 'listusers-editsonly' => 'Arată doar utilizatorii cu modificări',
 'listusers-creationsort' => 'Sortează după data creării',
+'listusers-desc' => 'Sortează descrescător',
 'usereditcount' => '$1 {{PLURAL:$1|editare|editări}}',
 'usercreated' => '{{GENDER:$3|Creat}} în $1 la $2',
 'newpages' => 'Pagini noi',
@@ -2336,10 +2419,9 @@ Modificările viitoare efectuate asupra acestei pagini dar și asupra paginii de
 'unwatchthispage' => 'Nu mai urmări',
 'notanarticle' => 'Nu este un articol',
 'notvisiblerev' => 'Versiunea a fost ștearsă',
-'watchnochange' => 'Nici una dintre paginile pe care le urmăriți nu a fost modificată în perioada de timp afișată.',
 'watchlist-details' => '{{PLURAL:$1|O pagină|$1 pagini urmărite|$1 de pagini urmărite}}, excluzând paginile de discuție.',
-'wlheader-enotif' => '*Notificarea prin e-mail este activată.',
-'wlheader-showupdated' => "* Paginile care au fost modificate după ultima dumneavoastră vizită sunt afișate '''îngroșat'''.",
+'wlheader-enotif' => 'Notificarea prin e-mail este activată.',
+'wlheader-showupdated' => "Paginile care au fost modificate ulterior accesării lor ultima dată de către dumneavoastră sunt '''îngroșate'''.",
 'watchmethod-recent' => 'căutarea schimbărilor recente pentru paginile urmărite',
 'watchmethod-list' => 'căutarea paginilor urmărite pentru schimbări recente',
 'watchlistcontains' => 'Lista de pagini urmărite conține $1 {{PLURAL:$1|element|elemente|de elemente}}.',
@@ -2585,7 +2667,7 @@ $1',
 'contributions' => 'Contribuții {{GENDER:$1|utilizator}}',
 'contributions-title' => 'Contribuțiile utilizatorului $1',
 'mycontris' => 'Contribuții',
-'contribsub2' => 'Pentru $1 ($2)',
+'contribsub2' => 'Pentru {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Nu a fost găsită nici o modificare care să satisfacă acest criteriu.',
 'uctop' => '(actuală)',
 'month' => 'Din luna (și dinainte):',
@@ -2742,15 +2824,13 @@ Jurnalul suprimărilor este indicat mai jos:',
 Face parte din area de blocare $2, care nu poate fi deblocată.',
 'ip_range_invalid' => 'Serie IP invalidă.',
 'ip_range_toolarge' => 'Blocările mai mari de /$1 nu sunt permise.',
-'blockme' => 'Blochează-mă',
 'proxyblocker' => 'Blocaj de proxy',
-'proxyblocker-disabled' => 'Această funcție este dezactivată.',
 'proxyblockreason' => 'Adresa dumneavoastră IP a fost blocată pentru că este un proxy deschis.
 Vă rugăm să vă contactați furnizorul de servicii Internet sau tehnicienii IT și să-i informați asupra acestei probleme serioase de securitate.',
-'proxyblocksuccess' => 'Realizat.',
 'sorbsreason' => 'Adresa dumneavoastră IP este listată ca un proxy deschis în DNSBL.',
 'sorbs_create_account_reason' => 'Adresa dumneavoastră IP este listată ca un proxy deschis în lista neagră DNS.
 Nu vă puteți crea un cont',
+'xffblockreason' => 'O adresă IP prezentă în antetul X-Forwarded-For — fie a dumneavoastră, fie a serverului proxy pe care îl folosiți — a fost blocată. Motivul original al blocării a fost: $1',
 'cant-block-while-blocked' => 'Nu puteți bloca alți utilizatori în timp ce sunteți dumneavoastră înșivă blocat.',
 'cant-see-hidden-user' => 'Utilizatorul pe care încercați să îl blocați este deja blocat și ascuns. Atata timp cât nu aveți drept de hideuser, nu puteți vedea sau modifica blocarea acestuia.',
 'ipbblocked' => 'Nu puteți bloca sau debloca alți utilizatori în timp ce sunteți dumneavoastră înșivă blocat.',
@@ -2919,6 +2999,8 @@ Vă rugăm să vizitați [//www.mediawiki.org/wiki/Localisation MediaWiki Locali
 'thumbnail-more' => 'Extindere',
 'filemissing' => 'Fișier lipsă',
 'thumbnail_error' => 'Eroare la generarea previzualizării: $1',
+'thumbnail_error_remote' => 'Mesaj de eroare de la $1:
+$2',
 'djvu_page_error' => 'Numărul paginii DjVu eronat',
 'djvu_no_xml' => 'Imposibil de obținut XML-ul pentru fișierul DjVu',
 'thumbnail-temp-create' => 'Imposibil de creat miniatura temporară',
@@ -3066,16 +3148,12 @@ Un dosar temporar lipsește.',
 Permite adăugarea unui motiv în descrierea modificărilor',
 'tooltip-preferences-save' => 'Salvează preferințele',
 'tooltip-summary' => 'Descrieți pe scurt modificarea',
+'tooltip-iwiki' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/** CSS plasate aici vor fi aplicate tuturor aparițiilor */',
-'standard.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Standard */',
-'nostalgia.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Nostalgia  */',
 'cologneblue.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Cologne Blue */',
 'monobook.css' => '/* modificați acest fișier pentru a adapta înfățișarea monobook-ului pentru tot situl*/',
-'myskin.css' => '/* CSS plasate aici vor afecta utilizatorii stilului MySkin */',
-'chick.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Chick */',
-'simple.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Simple */',
 'modern.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Modern */',
 'vector.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Vector */',
 'print.css' => '/* CSS plasate aici vor afecta modul în care paginile vor fi imprimate */',
@@ -3151,13 +3229,8 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 'pageinfo-category-files' => 'Număr de fișiere',
 
 # Skin names
-'skinname-standard' => 'Clasic',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Albastru de Cologne',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'StilulMeu',
-'skinname-chick' => 'Șic',
-'skinname-simple' => 'Simplu',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -3237,11 +3310,25 @@ Executându-l, sistemul dvs. poate fi compromis.",
 'minutes' => '{{PLURAL:$1|un minut|$1 minute|$1 de minute}}',
 'hours' => '{{PLURAL:$1|o oră|$1 ore|$1 de ore}}',
 'days' => '{{PLURAL:$1|o zi|$1 zile|$1 de zile}}',
+'weeks' => '{{PLURAL:$1|$1 săptămână|$1 săptămâni|$1 de săptămâni}}',
 'months' => '{{PLURAL:$1|$1 lună|$1 luni|$1 de luni}}',
 'years' => '{{PLURAL:$1|$1 an|$1 ani|$1 de ani}}',
 'ago' => '$1 în urmă',
 'just-now' => 'Chiar acum',
 
+# Human-readable timestamps
+'hours-ago' => 'acum $1 {{PLURAL:$1|oră|ore|de ore}}',
+'minutes-ago' => 'acum $1 {{PLURAL:$1|minut|minute|de minute}}',
+'seconds-ago' => 'acum {{PLURAL:$1|o secundă|$1 secunde|$1 de secunde}}',
+'monday-at' => 'Luni, la $1',
+'tuesday-at' => 'Marți, la $1',
+'wednesday-at' => 'Miercuri, la $1',
+'thursday-at' => 'Joi,la $1',
+'friday-at' => 'Vineri, la $1',
+'saturday-at' => 'Sâmbătă, la $1',
+'sunday-at' => 'Duminică, la $1',
+'yesterday-at' => 'Ieri, la $1',
+
 # Bad image list
 'bad_image_list' => 'Formatul este următorul:
 
@@ -3273,7 +3360,7 @@ Altele vor fi ascunse implicit.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lățime',
 'exif-imagelength' => 'Înălțime',
 'exif-bitspersample' => 'Biți pe componentă',
@@ -3451,7 +3538,7 @@ Altele vor fi ascunse implicit.
 'exif-originalimageheight' => 'Înălțimea imaginii înainte de trunchiere',
 'exif-originalimagewidth' => 'Lățimea imaginii înainte de trunchiere',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Necomprimată',
 'exif-compression-2' => 'CCITT Grupa 3 Lungimea codificării Huffman modificată de dimensiune 1',
 'exif-compression-3' => 'CCITT Grupa 3 codificare fax',
@@ -3835,7 +3922,6 @@ Puteți folosi în schimb [[Special:EditWatchlist|editorul standard]].',
 'version-other' => 'Altele',
 'version-mediahandlers' => 'Suport media',
 'version-hooks' => 'Hook-uri',
-'version-extension-functions' => 'Funcțiile extensiilor',
 'version-parser-extensiontags' => 'Taguri extensie parser',
 'version-parser-function-hooks' => 'Hook-uri funcții parser',
 'version-hook-name' => 'Nume hook',
@@ -3844,6 +3930,7 @@ Puteți folosi în schimb [[Special:EditWatchlist|editorul standard]].',
 'version-license' => 'Licență',
 'version-poweredby-credits' => "Acest wiki este dezvoltat de '''[//www.mediawiki.org/ MediaWiki]''', drepturi de autor © 2001-$1 $2.",
 'version-poweredby-others' => 'alții',
+'version-poweredby-translators' => 'traducătorii de la translatewiki.net',
 'version-credits-summary' => 'Am dori să amintim următoarele persoane pentru contribuțiile aduse proiectului [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki este un software liber pe care îl puteți redistribui și/sau modifica sub termenii Licenței Publice Generale GNU publicată de Free Software Foundation – fie a doua versiune a acesteia, fie, la alegerea dumneavoastră, orice altă versiune ulterioară. 
 
@@ -3857,12 +3944,17 @@ MediaWiki este distribuit în speranța că va fi folositor, dar FĂRĂ VREO GAR
 'version-entrypoints-header-entrypoint' => 'Punct de intrare',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Cale fișier',
-'filepath-page' => 'Fișier:',
-'filepath-submit' => 'Du-te',
-'filepath-summary' => 'Această pagină specială recreează calea completă a fișierului.
-Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fișiere vor porni direct în programele asociate.',
+# Special:Redirect
+'redirect' => 'Redirecționare după fișier, utilizator sau ID-ul versiunii',
+'redirect-legend' => 'Redirecționare către un fișier sau o pagină',
+'redirect-summary' => 'Această pagină specială vă redirecționează către un fișier (dat fiind un nume de fișier), o pagină (dat fiind ID-ul unei versiuni) sau o pagină de utilizator (dat fiind un ID numeric al utilizatorului).',
+'redirect-submit' => 'Du-te',
+'redirect-lookup' => 'Căutare:',
+'redirect-value' => 'Valoare:',
+'redirect-user' => 'ID utilizator',
+'redirect-revision' => 'Versiune de pagină',
+'redirect-file' => 'Nume de fișier',
+'redirect-not-exists' => 'Valoarea nu a fot găsită',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Căutare fișiere duplicate',
@@ -3912,12 +4004,16 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'tags' => 'Etichete valabile pentru marcarea modificărilor',
 'tag-filter' => 'Filtru pentru [[Special:Tags|etichete]]:',
 'tag-filter-submit' => 'Filtru',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Etichetă|Etichete}}]]: $2)',
 'tags-title' => 'Etichete',
 'tags-intro' => 'Această pagină afișează etichetele, inclusiv semnificația lor, pe care software-ul le poate folosi la marcarea modificărilor.',
 'tags-tag' => 'Numele etichetei',
 'tags-display-header' => 'Apariția în listele cu schimbări',
 'tags-description-header' => 'Descrierea completă a sensului',
+'tags-active-header' => 'Activă?',
 'tags-hitcount-header' => 'Modificări etichetate',
+'tags-active-yes' => 'Da',
+'tags-active-no' => 'Nu',
 'tags-edit' => 'modificare',
 'tags-hitcount' => '$1 {{PLURAL:$1|modificare|modificări}}',
 
@@ -3938,6 +4034,7 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'dberr-problems' => 'Ne cerem scuze! Acest site întâmpină dificultăți tehnice.',
 'dberr-again' => 'Așteptați câteva minute și încercați din nou.',
 'dberr-info' => '(Nu se poate contacta serverul bazei de date: $1)',
+'dberr-info-hidden' => '(Nu se poate contacta serverul bazei de date)',
 'dberr-usegoogle' => 'Între timp puteți efectua căutarea folosind Google.',
 'dberr-outofdate' => 'De reținut că indexarea conținutului nostru de către ei poate să nu fie actualizată.',
 'dberr-cachederror' => 'Următoarea pagină este o copie în cache a paginii cerute, care s-ar putea să nu fie actualizată.',
@@ -3953,6 +4050,9 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'htmlform-submit' => 'Trimite',
 'htmlform-reset' => 'Anulează modificările',
 'htmlform-selectorother-other' => 'Altul',
+'htmlform-no' => 'Nu',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Alegeți o opțiune',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 cu suport de căutare în tot textul',
@@ -4070,4 +4170,19 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 # Image rotation
 'rotate-comment' => 'Imagine rotită în sensul acelor de ceasornic cu $1 {{PLURAL:$1|grad|grade|de grade}}',
 
+# Limit report
+'limitreport-title' => 'Date de optimizare a analizorului:',
+'limitreport-cputime' => 'Timp de utilizare CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|secundă|secunde|de secunde}}',
+'limitreport-walltime' => 'Timp real de utilizare',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|secundă|secunde|de secunde}}',
+'limitreport-ppvisitednodes' => 'Număr de noduri de preprocesor vizitate',
+'limitreport-ppgeneratednodes' => 'Număr de noduri de preprocesor generate',
+'limitreport-postexpandincludesize' => 'Mărimea includerii post-expansiune',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|octet|octeți|de octeți}}',
+'limitreport-templateargumentsize' => 'Mărimea argumentului formatului',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|octet|octeți|de octeți}}',
+'limitreport-expansiondepth' => 'Cea mai mare profunzime a expansiunii',
+'limitreport-expensivefunctioncount' => 'Număr de funcții de analiză costisitoare',
+
 );
diff --git a/languages/messages/MessagesRoa_tara.php b/languages/messages/MessagesRoa_tara.php
index 910a7940..425d0e1f 100644
--- a/languages/messages/MessagesRoa_tara.php
+++ b/languages/messages/MessagesRoa_tara.php
@@ -54,11 +54,6 @@ $messages = array(
 'tog-shownumberswatching' => "Fa vedè 'u numere de le utinde ca uardene",
 'tog-oldsig' => 'Firme esistende:',
 'tog-fancysig' => "Firma grezze cumme a 'nu teste de Uicchi (senza collegamende automatiche)",
-'tog-externaleditor' => "Ause n'editore esterne pe default (sulamende pe l'esperte, abbesogne de 'na configurazione speciele sus a 'u combiuter tune. <br />
-[//www.mediawiki.org/wiki/Manual:External_editors Pe cchiù 'mbormaziune.])",
-'tog-externaldiff' => "Ause 'na differenze esterne pe default (sulamende pe l'esperte, abbesogne de 'na configuraziona speciele sus a 'u computer tune. <br />
-[//www.mediawiki.org/wiki/Manual:External_editors More information.])",
-'tog-showjumplinks' => 'Abbilite "zumbe a" pe scè sus a le collegaminde',
 'tog-uselivepreview' => "Ause l'andeprime da 'u vive (Sperimendale)",
 'tog-forceeditsummary' => "Ciércame conferme quanne stoche a 'nzerische 'nu riepighe vianghe",
 'tog-watchlisthideown' => "Scunne le cangiaminde mije da l'elenghe de le pàggene condrollate",
@@ -72,6 +67,8 @@ $messages = array(
 'tog-showhiddencats' => 'Fa vedè le categorije scunnute',
 'tog-noconvertlink' => "Disabbilite 'a conversione d'u titele de collegamende",
 'tog-norollbackdiff' => "Non sce penzanne a le differenze apprisse l'esecuzione de 'nu rollback",
+'tog-useeditwarning' => "Avvisave quanne jie lasse 'na pàgene cangiate senze ca agghie sarvate le cangiaminde",
+'tog-prefershttps' => "Ause sembre 'na connessione secure quanne trase",
 
 'underline-always' => 'Sembre',
 'underline-never' => 'Maje',
@@ -135,6 +132,18 @@ $messages = array(
 'oct' => 'Ott',
 'nov' => 'Nov',
 'dec' => 'Dec',
+'january-date' => 'Scennare $1',
+'february-date' => 'Febbrare $1',
+'march-date' => 'Màrze $1',
+'april-date' => 'Abbrile $1',
+'may-date' => 'Màsce $1',
+'june-date' => 'Sciugne $1',
+'july-date' => 'Luglie $1',
+'august-date' => 'Aguste $1',
+'september-date' => 'Settemmre $1',
+'october-date' => 'Ottommre $1',
+'november-date' => 'Novemmre $1',
+'december-date' => 'Decemmre $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorije|Categorije}}',
@@ -156,7 +165,7 @@ $messages = array(
 'broken-file-category' => 'Pàggene cu collegaminde a le file scuasciate',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Sus a',
 'article' => 'Pàgene de le condenute',
@@ -219,6 +228,7 @@ $messages = array(
 'create-this-page' => "Ccreje 'a pàgene",
 'delete' => 'Scangìlle',
 'deletethispage' => 'Scangille sta pàgene',
+'undeletethispage' => 'Repristine sta pàgene',
 'undelete_short' => "Annulle {{PLURAL:$1|'nu camgiamende|$1 cangiaminde}}",
 'viewdeleted_short' => "Vide {{PLURAL:$1|'nu cangiamende scangellate|$1 cangiaminde scangellate}}",
 'protect' => 'Prutette',
@@ -262,7 +272,7 @@ $1",
 'pool-queuefull' => "'A code de le sondagge jè chiene",
 'pool-errorunknown' => 'Errore scanusciute',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Sus a {{SITENAME}}',
 'aboutpage' => 'Project:Sus a',
 'copyright' => "'U condenute jè disponibile sotte a $1.",
@@ -272,7 +282,6 @@ $1",
 'disclaimers' => 'No ne sacce ninde',
 'disclaimerpage' => 'Project:Scareca uarrile',
 'edithelp' => "Cangianne l'ajute",
-'edithelppage' => 'Help:Cangiaminde',
 'helppage' => 'Help:Condenute',
 'mainpage' => 'Pàgene Prengepàle',
 'mainpage-description' => 'Pàgene Prengepàle',
@@ -304,7 +313,6 @@ Vide [[Special:Version|Versione d'a pàgene]].",
 'newmessagesdifflinkplural' => 'urteme {{PLURAL:$1|cangiamende|cangiaminde}}',
 'youhavenewmessagesmulti' => "T'onne arrevete mèssagge nueve sus 'a $1",
 'editsection' => 'cange',
-'editsection-brackets' => '[$1]',
 'editold' => 'cange',
 'viewsourceold' => 'vide sorgende',
 'editlink' => 'cange',
@@ -356,17 +364,12 @@ Pe 'na liste de le pàggene speciele cirche aqquà [[Special:SpecialPages|{{int:
 # General errors
 'error' => 'Errore',
 'databaseerror' => "Errore de l'archivije",
-'dberrortext' => "Ha assute n'errore de sindassi de 'na inderrogazione sus a 'u database.
-Quiste pò indicà 'nu bochere jndr'à 'u software.
-L'urteme tendative de inderrogazione sus a 'u database ha state:
-<blockquote><code>\$1</code></blockquote>
-cu 'a funzione \"<code>\$2</code>\".
-'U database ha returnate l'errore \"<samp>\$3: \$4</samp>\".",
-'dberrortextcl' => 'A assute \'n\'errore de sindasse sus a \'n\'inderrogazione d\'u database.
-L\'urteme tendative de inderrogazione sus a \'u database ha state:
-"$1"
-ausanne \'a funzione "$2".
-\'U database ha returnate l\'errore "$3: $4"',
+'databaseerror-text' => "Ha assute 'n'errore sus a 'n'inderrogazione d'u database.
+Quiste pò significaà ca ste 'nu bochere jndr'à 'u softuer.",
+'databaseerror-textcl' => "Ha assute 'n'errore sus a 'n'inderrogazione d'u database.",
+'databaseerror-query' => 'Inderrogazione: $1',
+'databaseerror-function' => 'Funzione: $1',
+'databaseerror-error' => 'Errore: $1',
 'laggedslavemode' => "Attenzione: 'A pàgene no ge tène cangiaminde recente.",
 'readonly' => 'Archivie blocchete',
 'enterlockreason' => "Mitte 'na raggione p'u blocche, 'ncludenne 'na stime de quanne 'u blocche avène luate.",
@@ -400,6 +403,7 @@ Pò essere ca ggià ha state scangellete da quacche otre.',
 'cannotdelete-title' => 'Non ge puè scangellà \'a pàgene "$1"',
 'delete-hook-aborted' => "Cangiamende annullete da  'nu ''hook''.
 Non g'à date nisciune mutive.",
+'no-null-revision' => 'Non ge se pò ccrejà \'na revisiona nove vacande pa pàgene "$1"',
 'badtitle' => 'Titele sbagliete',
 'badtitletext' => "'A pàgene ca è cerchete tène 'nu titele errete, vacande, o jè 'nu collegamende inter-lènghe o inter-uicchi errete.
 Pò essere ca tène une o cchiù carattere ca non ge ponne essere ausete jndr'à le titele.",
@@ -423,12 +427,15 @@ Pe aggiungere o cangià le traduziune pe tutte le uicchi, pe piacere ause [//tra
 'editinginterface' => "'''Fà attenziò:'''  Tu ste cange 'na pàgene ca jè ausate pe dà 'n'inderfacce de teste p'u software.
 Le cangiaminde de sta pàgene vonne a mettene mane sus a l'inderfacce utende pe l'otre utinde de sta Uicchi.
 Pe aggiungere o cangià le traduziune, pe piacere vide ce ause [//translatewiki.net/ translatewiki.net], 'u pruggette de localizzazione de MediaUicchi.",
-'sqlhidden' => '(query SQL ascunnute)',
 'cascadeprotected' => 'Sta pàgene ha state prutette da le cangiaminde, purcè jè ingluse jndr\'à {{PLURAL:$1|seguende pàgene, ca jè|le seguende pàggene, ca sonde}} prutette cu l\'opzione "a caschete":
 $2',
 'namespaceprotected' => "Non ge tine 'u permesse pe cangià pàggene d'u neimspeise '''$1'''.",
 'customcssprotected' => "Non ge tine 'u permesse pe cangià sta pàgene de CSS, purcè tène otre configurazione personale.",
 'customjsprotected' => "Non ge tine 'u permesse pe cangià sta pàgene de Javascript, purcè tène otre configurazione personale.",
+'mycustomcssprotected' => 'Non ge tìne le permesse pe cangià sta pàgene CSS',
+'mycustomjsprotected' => 'Non ge tìne le permesse pe cangià sta pàgene JavaScript',
+'myprivateinfoprotected' => "Non ge tìne le permesse pe cangià le 'mbormaziune private tune.",
+'mypreferencesprotected' => 'Non ge tìne le permesse pe cangià le preferenze tune.',
 'ns-specialprotected' => 'Le pàgene speciale no ponne essere cangete.',
 'titleprotected' => "Stu titele ha state prutette da 'a ccreazione da [[User:$1|$1]].
 'U mutive jè ''$2''.",
@@ -453,10 +460,19 @@ Note Bbuene ca certe pàggene ponne condinuà a essere viste cumme ce tu ste ang
 'welcomecreation-msg' => "'U cunde tue ha state ccrejete.
 No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze tue]].",
 'yourname' => 'Nome utende:',
+'userlogin-yourname' => 'Nome utende',
+'userlogin-yourname-ph' => "Mitte 'u nome utende tune",
+'createacct-another-username-ph' => "Mitte 'u nome utende",
 'yourpassword' => 'Passuord:',
+'userlogin-yourpassword' => 'Passuord',
+'userlogin-yourpassword-ph' => "Mitte 'a passuord toje",
+'createacct-yourpassword-ph' => "Mitte 'na passuord",
 'yourpasswordagain' => "Scrive 'a passuord notra vote:",
+'createacct-yourpasswordagain' => "Conferme 'a passuord",
+'createacct-yourpasswordagain-ph' => "Mitte arrete 'a passuord",
 'remembermypassword' => "Arrencuerdete 'u nome mije sus a stu combiuter (pe 'nu massime de $1 {{PLURAL:$1|sciurne|sciurne}})",
-'securelogin-stick-https' => "Statte collegate ô HTTPS apprisse 'a trasute",
+'userlogin-remembermypassword' => 'Arrecuèrdeme',
+'userlogin-signwithsecure' => "Ause 'na connessione secure",
 'yourdomainname' => "'U nome d'u dominie tue:",
 'password-change-forbidden' => 'Non ge puè cangià le passuord sus a sta uicchi.',
 'externaldberror' => "Vide bbuene, o stè 'n'errore de autendicazione a 'u database oppure tu non ge puè aggiorna 'u cunde tue esterne.",
@@ -468,18 +484,41 @@ No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze
 'logout' => 'Isse',
 'userlogout' => 'Isse',
 'notloggedin' => 'Non ge sì colleghete',
+'userlogin-noaccount' => "Non ge tìne 'nu cunde?",
+'userlogin-joinproject' => "Tràse jndr'à {{SITENAME}}",
 'nologin' => "Non ge tine n'utenze? '''$1'''.",
 'nologinlink' => "Ccreje 'nu cunde utende",
 'createaccount' => "Ccreje 'nu cunde",
 'gotaccount' => "Tine già 'nu cunde? '''$1'''.",
 'gotaccountlink' => 'Tràse',
 'userlogin-resetlink' => "T'è scurdate le dettaglie pe trasè?",
+'userlogin-resetpassword-link' => "Azzere 'a passuord toje",
+'helplogin-url' => 'Help:Trasenne',
+'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Aijute cu 'a trasute]]",
+'createacct-join' => "Mitte le 'mbormaziune tune aqquà sotte.",
+'createacct-another-join' => "Mitte le 'mbormaziune d'u cunde nuève aqquà sotte.",
+'createacct-emailrequired' => 'Indirizze email',
+'createacct-emailoptional' => 'Indirizze email (opzionale)',
+'createacct-email-ph' => "Mitte l'indirizze email tune",
+'createacct-another-email-ph' => "Mitte l'indirizze email",
 'createaccountmail' => "Ause 'na passuord temboranèe a uecchije e mannale a l'indirizze email specificate",
+'createacct-realname' => 'Nome vere (opzionale)',
 'createaccountreason' => 'Mutive:',
+'createacct-reason' => 'Mutive',
+'createacct-reason-ph' => "Purcé tu ste ccreje 'n'otre cunde utende?",
+'createacct-captcha' => 'Verifiche de securezze',
+'createacct-imgcaptcha-ph' => "Mitte 'u teste tune aqquà sus",
+'createacct-submit' => "Ccreje 'u cunde utende tune",
+'createacct-another-submit' => "Ccreje 'n'otre cunde",
+'createacct-benefit-heading' => '{{SITENAME}} jè fatte da crestiane cumme a te.',
+'createacct-benefit-body1' => '{{PLURAL:$1|cangiamende|cangiaminde}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pàgene|pàggene}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|condrebbutore}} recende',
 'badretype' => 'Le passuord ca è scritte non ge sonde uguale.',
 'userexists' => "'U nome de l'utende ca è scritte jè già ausate.
 Pe piacere scacchiane n'otre.",
 'loginerror' => 'Errore de collegamende',
+'createacct-error' => "Errore sus 'a ccrejazione d'u cunde",
 'createaccounterror' => "Non ge puè ccrejà 'u cunde utende: $1",
 'nocookiesnew' => "'U cunde utende ha state ccrejete ma angore non g'è trasute jndr'à {{SITENAME}}.
 
@@ -547,11 +586,13 @@ Tu, mò, t\'avisse a collegà e cangià \'a password toje.
 
 Tu puè pure cacà stu messagge, ce stu cunde utende ha state ccrejete pe errore.',
 'usernamehasherror' => "'U nome utende non ge pò tenè carattere hash",
-'login-throttled' => "Urtemamende tu è pruvate troppe vote a trasè jndr'à Uicchipèdie
-Pe piacere vide c'aspitte 'nu picche de timbe apprime de pruvà 'n'otra vote.",
+'login-throttled' => "Urtemamende tu è pruvate troppe vote a trasè jndr'à Uicchipèdie.
+Pe piacere vide c'aspitte $1 apprime de pruvà 'n'otra vote.",
 'login-abort-generic' => "Non g'è riuscite a trasè - Annullate",
 'loginlanguagelabel' => 'Lénga: $1',
 'suspicious-userlogout' => "'A richiesta toje de assè ha state bloccate purcè pare ca ha state mannate da 'nu browser scuasciate o da 'a cache de 'nu proxy.",
+'createacct-another-realname-tip' => "'U nome vere jè facoltative.
+Ce tu scacchie de metterle, quiste avène ausate pe dà 'u giuste merite a 'a fatìe de l'utende.",
 
 # Email sending
 'php-mail-error-unknown' => "Errore scanusciute jndr'à funzione PHP mail()",
@@ -568,8 +609,7 @@ Pe spiccià 'a procedure de collegamende, tu a 'mbostà 'na password nove aqquà
 'newpassword' => 'Nova passuord:',
 'retypenew' => "Scrive n'otra vota 'a passuord nova:",
 'resetpass_submit' => "'Mboste 'a passuord e colleghete",
-'resetpass_success' => "'A passuord toje ha state cangiate!
-Mò puè trasè...",
+'changepassword-success' => "'A password toje ha state cangiate!",
 'resetpass_forbidden' => 'Le Password non ge ponne cangià',
 'resetpass-no-info' => 'Tu a essere colleghete pe accedere a sta pàgene direttamende.',
 'resetpass-submit-loggedin' => "Cange 'a password",
@@ -581,10 +621,11 @@ Pò essere ca tu è già cangete 'a password toje o è richieste una temboranea
 
 # Special:PasswordReset
 'passwordreset' => "Azzere 'a passuord",
-'passwordreset-text' => "Comblete stu module pe ricevere 'na mail de promemorie de le dettaglie d'u cunde tune.",
+'passwordreset-text-one' => "Comblete stu module pe azzerà 'a passuord toje.",
+'passwordreset-text-many' => "{{PLURAL:$1|Inghie une de le cambe de date pe azzerà 'a passuord toje.}}",
 'passwordreset-legend' => "Azzere 'a passuord",
 'passwordreset-disabled' => "'U reset de le passuord ha state desabbilitate sus a sta uicchi.",
-'passwordreset-pretext' => '{{PLURAL:$1||Mitte une de le stuèzze de le date aqquà sotte}}',
+'passwordreset-emaildisabled' => "Le funziune de l'email onne state disabbilitate sus a sta uicchi.",
 'passwordreset-username' => 'Nome utende:',
 'passwordreset-domain' => 'Dominie:',
 'passwordreset-capture' => "Vide 'a mail resultande?",
@@ -608,7 +649,7 @@ Tu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta
 Passuord temboranèe: $2',
 'passwordreset-emailsent' => "'N'e-mail pe arrecurdarte ha state mannate.",
 'passwordreset-emailsent-capture' => "'Na e-mail pe azzeramende d'a passuord ha state mannate, ca jè fatte vedè aqquà sotte.",
-'passwordreset-emailerror-capture' => "'Na e-mail de azzeramende d'a passuord ha state generate, ca jè fatte vedè aqquà sotte, ma 'u 'nvie a l'utende ha fallite: $1",
+'passwordreset-emailerror-capture' => "'Na e-mail de azzeramende d'a passuord ha state generate, ca jè fatte vedè aqquà sotte, ma 'u 'nvie a {{GENDER:$2|l'utende}} ha fallite: $1",
 
 # Special:ChangeEmail
 'changeemail' => "Cange 'u 'ndirizze e-mail",
@@ -622,6 +663,19 @@ Passuord temboranèe: $2',
 'changeemail-submit' => 'Cange e-mail',
 'changeemail-cancel' => 'Annulle',
 
+# Special:ResetTokens
+'resettokens' => 'Azzere le gettone',
+'resettokens-text' => "Tu puè azzerà le gettone le quale te donne l'accesse a certe date private collegate cu 'u cunde tune aqquà.
+
+Tu avissa farle ce pe sbaglie l'è condivise cu otre o ce 'u cunde tune ha state combromesse.",
+'resettokens-no-tokens' => 'Non ge stonne gettone de azzerà.',
+'resettokens-legend' => 'Azzere le gettone',
+'resettokens-tokens' => 'Gettone:',
+'resettokens-token-label' => '$1 (valore de mò: $2)',
+'resettokens-watchlist-token' => 'Gettone pu feed web (Atom/RSS) de [[Special:Watchlist|le cangiaminde de le pàggene condrollate]]',
+'resettokens-done' => 'Gettone azzerate.',
+'resettokens-resetbutton' => 'Azzere le gettone scacchiate',
+
 # Edit page toolbar
 'bold_sample' => 'Teste grascette',
 'bold_tip' => 'Teste grascette',
@@ -831,11 +885,14 @@ Non g'à date nisciune mutive.",
 Pare proprie ca l'onne scangellete.",
 'edit-conflict' => 'conflitte de cangiaminde.',
 'edit-no-change' => "'U cangiamende ca p fatte, avène scettate purcè 'u teste non g'à cangete manghe de 'na virgola.",
+'postedit-confirmation' => "'U cangiamende tune ha state reggistrate.",
 'edit-already-exists' => "Non ge puè ccrejà 'na pàgene nove purcè esiste già!",
 'defaultmessagetext' => 'Messàgge de teste de base',
 'content-failed-to-parse' => "L'analise d'u condenute $2 pu modelle $1 ha fallite: $3",
 'invalid-content-data' => "Condenute d'u date invalide",
 'content-not-allowed-here' => '"$1" condenute non g\'è permesse sus \'a pàgene [[$2]]',
+'editwarning-warning' => 'Assenne da sta pàgene tu puè perdè tutte le date ca è cangiate.
+Ce tu è trasute, tu puè disabbilità st\'avvertimende jndr\'à sezione "Cangiaminde..." de le preferenze tune.',
 
 # Content models
 'content-model-wikitext' => 'Uicchiteste',
@@ -871,6 +928,7 @@ Pe piacere verifichesce 'u combronde sotte pe condrollà ca quiste ca tu vuè cc
 'undo-failure' => "'U cangiamende non ge pò essere annullete purcè stè 'nu conflitte de cangiaminde indermedije.",
 'undo-norev' => "'U cangiamende non ge pò essere annullete purcè non g'esiste o a state scangellete.",
 'undo-summary' => "Repristine 'a revisione $1 da [[Special:Contributions/$2|$2]] ([[User talk:$2|'Ngazzaminde]])",
+'undo-summary-username-hidden' => "Annulle 'a revisione $1 da 'n'utende scunnute",
 
 # Account creation failure
 'cantcreateaccounttitle' => "Non ge puè ccrejà 'nu cunde utende",
@@ -1054,6 +1112,7 @@ Vide Bbuene ca ausanne le collegaminde de navigazzione sta culonne avène azzera
 'compareselectedversions' => 'Combronde le versiune selezionete',
 'showhideselectedversions' => 'Fà vedè/scunne le revisiune selezionate',
 'editundo' => 'annulle',
+'diff-empty' => '(Nisciuna differenze)',
 'diff-multi' => "({{PLURAL:$1|'na versione de mmienze|$1 cchiù versiune de mmienze}} de {{PLURAL:$2|'n'utende|$2 utinde}} non ge se vèdene)",
 'diff-multi-manyusers' => "({{PLURAL:$1|'Na revisione de 'mmienze|$1 revisiune de 'mmienze}} non g'è viste da cchiù de $2 {{PLURAL:$2|utende|utinde}})",
 'difference-missing-revision' => "{{PLURAL:$2|'Na revisione|$2 revisiune}} de sta differenze ($1) {{PLURAL:$2|non g'onne|non g'onne}} state acchiate.
@@ -1081,7 +1140,6 @@ Le dettaglie le puè acchià jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={
 'searchmenu-legend' => 'Opzione de ricerche',
 'searchmenu-exists' => "'''Stè 'na pàgene nnumenete \"[[\$1]]\" sus 'a sta Uicchipèdie'''",
 'searchmenu-new' => "'''[[:\$1|Ccreje]] 'a pàgene \"[[:\$1|\$1]]\" sus 'a sta Uicchipèdie!'''",
-'searchhelp-url' => 'Help:Condenute',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sfogghije le pàggene cu stu prefisse]]',
 'searchprofile-articles' => 'Vôsce',
 'searchprofile-project' => 'Pàggene de ajiute e de pruggette',
@@ -1125,15 +1183,7 @@ Prueve mettènne nnande a l'inderrogaziona toje 'u prefisse '''all:''' pe cercà
 'searchdisabled' => "'A ricerche sus a {{SITENAME}} ha state disabbilitete.
 Tu puè cercà ausanne Google.
 Però fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàggene ca non ge sonde aggiornate.",
-
-# Quickbar
-'qbsettings' => 'Barra veloce',
-'qbsettings-none' => 'Ninde',
-'qbsettings-fixedleft' => 'Fissete a sinistre (Fixed left)',
-'qbsettings-fixedright' => 'Fissete a destre (Fixed right)',
-'qbsettings-floatingleft' => 'Volanne a sinistre (Floating left)',
-'qbsettings-floatingright' => 'Volanne a destre (Floating right)',
-'qbsettings-directionality' => "Corrette, depende da 'a direzionalità d'u script tune e da 'a lènga toje",
+'search-error' => "S'ha verificate 'n'errore mendre ste cercave: $1",
 
 # Preferences page
 'preferences' => 'Me piece accussì',
@@ -1167,7 +1217,6 @@ Però fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàgg
 'resetprefs' => "Pulizze le cangiaminde ca non g'è reggistrete",
 'restoreprefs' => "Repristine tutte le 'mbostaziune origgenale",
 'prefs-editing' => 'Stoche a cange',
-'prefs-edit-boxsize' => "Dimenzione d'a pàgene de cangiamende.",
 'rows' => 'Righe:',
 'columns' => 'Culonne:',
 'searchresultshead' => 'Cirche',
@@ -1178,9 +1227,9 @@ Però fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàgg
 'recentchangesdays-max' => '(massime $1 {{PLURAL:$1|sciurne|sciurne}})',
 'recentchangescount' => 'Numere de cangiaminde da fà vedè pe default:',
 'prefs-help-recentchangescount' => "Quiste 'nglude le urteme cangiaminde, le storie de le pàggene e le archivije.",
-'prefs-help-watchlist-token' => "Anghienne stu cambe cu le chiave segrete avène generate 'nu RSS feed pa liste de le pàggene condrollate.<br />
-Ogneune ca canosce 'a chiave de stu cambe se pò leggere 'a liste de le pàggene condrollate tue, accussì scacchie 'nu valore secure.<br />
-Aqquà ste 'nu valore generate a uecchije ca tu puè ausà: $1",
+'prefs-help-watchlist-token2' => "Queste jè 'a chiave segrete a le feed d'u web de l'elenghe de le pàggene condrollate tune.
+Cengate vò ccu canosce ce pò leggere l'elenghe de le pàggene condrollate tune, accussì non g'ù pò condividere.
+[[Special:ResetTokens|Cazze aqquà ce tìne abbesogne de azzerarle]].",
 'savedprefs' => 'Le preferenze tue onne state aggiornete.',
 'timezonelegend' => "Orarie d'a zone:",
 'localtime' => 'Orarie lochele:',
@@ -1211,7 +1260,6 @@ Aqquà ste 'nu valore generate a uecchije ca tu puè ausà: $1",
 'prefs-reset-intro' => "Tu puè ausà sta pàgene pe azzerà le preferenze tue a quidde de default d'u site.
 Quiste non ge pò essere annullate.",
 'prefs-emailconfirm-label' => "Conferme de l'e-mail:",
-'prefs-textboxsize' => "Dimenzione d'a finestre de le cangiaminde",
 'youremail' => 'Poste:',
 'username' => "{{GENDER:$1|Nome de l'utende}}:",
 'uid' => '{{GENDER:$1|ID Utende}}:',
@@ -1246,6 +1294,8 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'prefs-dateformat' => "Formate d'a data",
 'prefs-timeoffset' => "Differenze d'orarie",
 'prefs-advancedediting' => 'Opziune avanzate',
+'prefs-editor' => 'Cangiatore',
+'prefs-preview' => 'Andeprime',
 'prefs-advancedrc' => 'Opzione avanzate',
 'prefs-advancedrendering' => 'Opzione avanzate',
 'prefs-advancedsearchoptions' => 'Opzione avanzate',
@@ -1253,7 +1303,9 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'prefs-displayrc' => "Fà vedè l'opzione",
 'prefs-displaysearchoptions' => "Fà vedè l'opzione",
 'prefs-displaywatchlist' => "Fà vedè l'opzione",
+'prefs-tokenwatchlist' => 'Gettone',
 'prefs-diffs' => 'Diff',
+'prefs-help-prefershttps' => 'Sta preferenze pigghie effette sulamende quanne tràse arrete.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => "L'indirizze e-mail pare valide",
@@ -1281,6 +1333,8 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'userrights-changeable-col' => 'Gruppe ca tu puè cangià',
 'userrights-unchangeable-col' => 'Gruppe ca tu non ge puè cangià',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Conflitte sus a le cangiaminde de le deritte utende! Pe piacere revide e conferme le cangiaminde tune.',
+'userrights-removed-self' => "T'è luate le deritte tune. Mò non ge puè cchiù trasè jndr'à sta pàgene.",
 
 # Groups
 'group' => 'Gruppe:',
@@ -1347,10 +1401,18 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'right-unblockself' => 'Sbluecche da sule',
 'right-protect' => 'Cange le levèlle de protezione e cange le pàggene prutette',
 'right-editprotected' => 'Cange le pàggene prutette (senza protezzione a cascata)',
+'right-editsemiprotected' => 'Cange le pàggene prutette cumme a "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => "Cange l'inderfacce utende",
 'right-editusercssjs' => "Cange 'u CSS e 'u JS de l'otre utinde",
 'right-editusercss' => "Cange 'u CSS de l'otre utinde",
 'right-edituserjs' => "Cange 'u JS de l'otre utinde",
+'right-editmyusercss' => 'Cange le file tune de CSS',
+'right-editmyuserjs' => 'Cange le file tune de JavaScript',
+'right-viewmywatchlist' => "'Ndruche le pàggene condrollate tune",
+'right-editmywatchlist' => 'Cange le pàggene condrollate tune. Vide bbuene ca certe aziune vonne a aggiungere pàggene pure ca non ge stonne le deritte.',
+'right-viewmyprivateinfo' => "'Ndruche le date private tune (p.e. indirizze email, nome vere)",
+'right-editmyprivateinfo' => 'Cange le date private tune (p.e. indirizze email, nome vere)',
+'right-editmyoptions' => 'Cange le preferenze tune',
 'right-rollback' => "Annulle velocemende le cangiaminde de l'urteme utende ca ha cangiate 'na pàgena particolare",
 'right-markbotedits' => 'Marche le cangiaminde annullate cumme cangiaminde de bot',
 'right-noratelimit' => "Non g'à state tuccate da le limite de le pundegge",
@@ -1412,12 +1474,19 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'action-userrights-interwiki' => "cange le deritte de l'utende de l'utinde de le otre Uicchi",
 'action-siteadmin' => "blocche o sblocche 'u database",
 'action-sendemail' => 'manne e-mail',
+'action-editmywatchlist' => 'cange le pàggene condrollate tune',
+'action-viewmywatchlist' => "'ndruche le pàggene condrollate tune",
+'action-viewmyprivateinfo' => "'ndruche le 'mbormaziune private tune",
+'action-editmyprivateinfo' => "cange le 'mbormaziune private tune",
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|cangiaminde|cangiaminde}}',
+'enhancedrc-since-last-visit' => "$1 {{PLURAL:$1|da l'urtema visite}}",
+'enhancedrc-history' => 'cunde',
 'recentchanges' => 'Cangiaminde recende',
 'recentchanges-legend' => 'Opzione pe le cangiaminde recende',
 'recentchanges-summary' => 'Tracce le cchiù recednde cangiaminde de Uicchi sus a sta pàgene.',
+'recentchanges-noresult' => "Nisciune cangiamende duranne 'u periode ca ste soddisfe stu criterie.",
 'recentchanges-feed-description' => "Tracce le urteme cangiaminde sus 'a sta Uicchipedie jndr'à quiste feed.",
 'recentchanges-label-newpage' => "Stu cangiamende ha ccrejate 'na pàgena nove",
 'recentchanges-label-minor' => "Quiste ète 'nu cangiamende stuèdeche",
@@ -1456,7 +1525,6 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'recentchangeslinked-feed' => 'Cangiaminde culleghete',
 'recentchangeslinked-toolbox' => 'Cangiaminde culleghete',
 'recentchangeslinked-title' => 'Cangiaminde culleghete a "$1"',
-'recentchangeslinked-noresult' => "Non g'onne state fatte cangiaminde sus 'a sta pàgene jndr'à 'u periede selezionete.",
 'recentchangeslinked-summary' => "Queste jè 'a liste de le cangiaminde fatte de recende a le pàggene culleghete da ' na pàgene specifiche (o a le membre de 'na specifiche categorije).
 Pàggene sus 'a [[Special:Watchlist|le Pàggene condrollete]] sonde in '''grascette'''.",
 'recentchangeslinked-page' => "Nome d'a vôsce:",
@@ -1468,7 +1536,7 @@ Pàggene sus 'a [[Special:Watchlist|le Pàggene condrollete]] sonde in '''grasce
 'reuploaddesc' => "Scangille 'u carecamende e tuerne a 'a schermete de le carecaminde",
 'upload-tryagain' => "Conferme 'u cangiamende d'a descrizione d'u file",
 'uploadnologin' => 'non ge sinde colleghete',
-'uploadnologintext' => 'Tu a essere [[Special:UserLogin|colleghete]] pe carecà le file.',
+'uploadnologintext' => 'Tu a essere $1 pe carecà le file.',
 'upload_directory_missing' => "'A cartelle de le carecaminde ($1) s'à perdute o pò essere ca non g'à state ccreate da 'u webserver.",
 'upload_directory_read_only' => "'A cartelle d'u carecamende ($1) non ge se pò fà scrivere da 'u webserver.",
 'uploaderror' => 'Errore de carecamende',
@@ -1703,7 +1771,6 @@ Pe 'na securezze a uerre proprie, img_auth.php jè disabbilitate.",
 'http-read-error' => "Errore jndr'à letture de l' HTTP",
 'http-timed-out' => 'Richieste HTTP fore timbe.',
 'http-curl-error' => "Errore analizzanne l'URL: $1",
-'http-host-unreachable' => "Non ge riesche a raggiungere l'URL",
 'http-bad-status' => "Ha state 'nu probbleme duranne 'a richieste HTTP: $1, $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1735,6 +1802,10 @@ Quanne jè filtrate da l'utende, sulamende le file addò quidde utende ave carec
 'listfiles_size' => 'Dimenzione',
 'listfiles_description' => 'Descrizione',
 'listfiles_count' => 'Versiune',
+'listfiles-show-all' => "'Nglude le versiune vicchie de le immaggine",
+'listfiles-latestversion' => 'Versione de mò',
+'listfiles-latestversion-yes' => 'Sìne',
+'listfiles-latestversion-no' => 'None',
 
 # File description page
 'file-anchor-link' => 'File',
@@ -1833,6 +1904,13 @@ Arrecuèrdete de condrollà pe otre collegaminde a le template apprime de scange
 'randompage' => 'Pàgene a uecchie',
 'randompage-nopages' => "Non ge stonne pàggene jndr'à {{PLURAL:$2|'u seguende namespace|le seguende namespace}}: $1.",
 
+# Random page in category
+'randomincategory' => "Pàggene a uecchije jndr'à categorije",
+'randomincategory-invalidcategory' => '"$1" non g\'è \'nu nome d\'a categorije valide.',
+'randomincategory-nopages' => "Non ge stonne pàggene jndr'à [[:Category:$1]].",
+'randomincategory-selectcategory' => "Pigghie pàggene a uecchije da 'a categorije: $1 $2.",
+'randomincategory-selectcategory-submit' => 'Véje',
+
 # Random redirect
 'randomredirect' => 'Redirezionamende a uecchie',
 'randomredirect-nopages' => 'Non ge stonne redirezionaminde jndr\'à \'u namespace "$1".',
@@ -1858,17 +1936,13 @@ Arrecuèrdete de condrollà pe otre collegaminde a le template apprime de scange
 'statistics-users-active-desc' => "Sonde l'utinde ca onne fatte quacchecose jndr'à l'urteme {{PLURAL:$1|giurne|$1 giurne}}",
 'statistics-mostpopular' => 'Pàggene cchiù visitete',
 
-'disambiguations' => 'Pàggene collegate a le pàggene de disambiguazione',
-'disambiguationspage' => 'Template:disambigue',
-'disambiguations-text' => "Le pàggene seguende appondene a 'na '''pàgene de disambiguazione'''.
-'Nvece avessere appondà a 'a temateca appropriate.<br />
-'Na pàgene jè trattate cumme pàgene de disambiguazione ce tu ause 'nu template ca è appundate da [[MediaWiki:Disambiguationspage]]",
-
 'pageswithprop' => "Pàggene cu 'na probbietà d'a pàgene",
 'pageswithprop-legend' => "Pàggene cu 'na probbietà d'a pàgene",
 'pageswithprop-text' => "Sta pàgene elenghe le pàggene ca ausane 'na particolare probbietà d'a pàgene.",
 'pageswithprop-prop' => "Nome d'a probbietà:",
 'pageswithprop-submit' => 'Véje',
+'pageswithprop-prophidden-long' => "valore d'a probbietà d'u teste lunghe scunnute ($1)",
+'pageswithprop-prophidden-binary' => 'valore probbietà binarie scunnute ($1)',
 
 'doubleredirects' => 'Ridirezionaminde a doppie',
 'doubleredirectstext' => "Sta pàgene elenghe le pàggene ca se ridirezionane sus a otre pàggene de ridirezionaminde.
@@ -1927,6 +2001,7 @@ Mò s'avène redirette a [[$2]].",
 'mostrevisions' => 'Pàggene cchiù cangete',
 'prefixindex' => "Tutte le pàggene cu 'u prefisse",
 'prefixindex-namespace' => "Tutte le pàggene cu 'u prefisse ($1 namespace)",
+'prefixindex-strip' => "Strisce d'u prefisse jndr'à l'elenghe",
 'shortpages' => 'Pàggene corte',
 'longpages' => 'Pàggene longhe',
 'deadendpages' => 'Pàggene senza collegamende',
@@ -2122,7 +2197,6 @@ Le cangiaminde future a sta pàgene e 'a pàgene de le 'ngazzaminde associete le
 'unwatchthispage' => "No condrollà cchiù 'a pàgene",
 'notanarticle' => "Non g'è 'na vosce",
 'notvisiblerev' => "'A revisione ha state scangellete",
-'watchnochange' => "Niscune de le vôsce condrollete onne state cangete jndr'à 'u periode visualizzate.",
 'watchlist-details' => "{{PLURAL:$1|$1 pàgene|$1 pàggene}} jndr'à liste de le pàggene condrollete, scartanne le pàggene de le 'ngazzaminde.",
 'wlheader-enotif' => '* Notifiche pe email abbilitate.',
 'wlheader-showupdated' => "* Le pàggene ca onne state cangiate da l'urtema visite avènene fatte vedè in '''grascette'''",
@@ -2541,16 +2615,14 @@ Pò essere ca ha state già sbloccate.",
 Jidde ha state bloccate cumme parte de l'indervalle $2, ca pò essere sbloccate.",
 'ip_range_invalid' => "L'indervalle de l'IP non g'è valide.",
 'ip_range_toolarge' => 'Le indervalle de le blocche cchiù larie de /$1 non ge sonde permesse.',
-'blockme' => 'Bloccheme',
 'proxyblocker' => 'Bloccaore de proxy',
-'proxyblocker-disabled' => "'A funzione ha state disabbilitete.",
 'proxyblockreason' => "L'indirizze IP tue ha state bloccate purcè jè 'nu proxy apirte.
 Pe piacere condatte 'u provider de Indernette tue o 'u supporte tecniche e 'mbormescele de stu serie probbleme de securezze.",
-'proxyblocksuccess' => 'Spicciete.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => "L'indirizze IP tue jè elegate cumme a 'nu proxy apirte jndr'à DNSBL ausate da {{SITENAME}}.",
 'sorbs_create_account_reason' => "L'indirizze IP tue jè elegate cumme a 'nu proxy apirte jndr'à DNSBL ausate da {{SITENAME}}.
 Tu nonge puè ccrejà 'nu cunde utende",
+'xffblockreason' => "'N'indirizze IP presende jndr'à testate X-Forwarded-For, tutte e doje le tune o 'nu server proxy ca ste ause, onne state bloccate. 'U mutive d'u blocche origgenale ere: $1",
 'cant-block-while-blocked' => 'Tu non ge puè bloccà otre utinde quanne tu si blocchete.',
 'cant-see-hidden-user' => "L'utende ca tu ste pruève a bloccà ha state già bloccate e scunnute. Ce tu non ge tine le deritte ''hideuser'', tu non ge puè vedè o cangià 'u blocche de l'utende.",
 'ipbblocked' => 'Tu non ge puè bloccà o sbloccà otre utinde, purcé tu sì ppure bloccate',
@@ -2717,6 +2789,8 @@ Pe piacere vè vide [//www.mediawiki.org/wiki/Localisation Localizzazione de Med
 'thumbnail-more' => 'Allarije',
 'filemissing' => 'File perdute',
 'thumbnail_error' => "Errore ccrejanne l'andeprime picenne: $1",
+'thumbnail_error_remote' => "Messàgge d'errore da $1:
+$2",
 'djvu_page_error' => 'Pàgene DjVu fore da le limite',
 'djvu_no_xml' => "Non ge riesche a esaminà l'XML d'u file DjVu",
 'thumbnail-temp-create' => "Non ge se pò ccrejà 'na miniature temboranèe d'u file",
@@ -2871,17 +2945,11 @@ Permette de aggiungere 'nu mutive jndr'à 'u riepileghe",
 
 # Stylesheets
 'common.css' => "/* 'U CSS ca se iacchie aqquà avène applicate a tutte le masckere */",
-'standard.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Standard */",
-'nostalgia.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Nostalgie */",
 'cologneblue.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Blu Cologne */",
 'monobook.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Monobook */",
-'myskin.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Personalizzate */",
-'chick.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Purecine */",
-'simple.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Semblice */",
 'modern.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Moderne */",
 'vector.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Vettore */",
 'print.css' => "/* 'U CSS ca se iacchie aqquà avène applicate a 'u resultate d'a stambe */",
-'handheld.css' => "/* 'U CSS ca se iacchie aqquà l'ausane le dispositive de gestione manuale basate sus a masckere configurate in \$wgHandheldStyle */",
 'noscript.css' => "/* 'U CSS ca se iacchie aqquà l'ausane le utinde cu 'u Javascript disabbilitate */",
 'group-autoconfirmed.css' => "/* 'U CSS ca se iacchie aqquà ave effettue seulamende sus a le utinde autoconfirmatarie */",
 'group-bot.css' => "/* 'U CSS ca se iacchie aqquà ave effettue seulamende sus a le bot */",
@@ -2890,12 +2958,8 @@ Permette de aggiungere 'nu mutive jndr'à 'u riepileghe",
 
 # Scripts
 'common.js' => '/* Ogne JavaScript aqquà avène carecate pe tutte le utinde sus a ogne pàgene carecate. */',
-'standard.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Standard */",
-'nostalgia.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Nostalgie */",
 'cologneblue.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Blu Cologne */",
 'monobook.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere MonoBook */",
-'myskin.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Personalizzate */",
-'chick.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Purecine */",
 'modern.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Moderne */",
 'vector.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Vettore */",
 'group-autoconfirmed.js' => '/* Ogne JavaScript aqquà avène carecate pe le utinde autoconfirmatarie */',
@@ -2976,13 +3040,8 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
 'pageinfo-category-files' => 'Numere de file',
 
 # Skin names
-'skinname-standard' => 'Classeche',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Blu Cologne',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Personalizzate',
-'skinname-chick' => 'Purecine',
-'skinname-simple' => 'Semblice',
 'skinname-modern' => 'Moderne',
 'skinname-vector' => 'Vettore',
 
@@ -3067,11 +3126,25 @@ Ce l'esegue sus a 'u sisteme tue pò essere ca se combromette.",
 'minutes' => '{{PLURAL:$1|$1 minute|$1 minute}}',
 'hours' => '{{PLURAL: $1|$1ore|$1 ore}}',
 'days' => '{{PLURAL: $1|$1 sciurne|$1 sciurne}}',
+'weeks' => '{{PLURAL:$1|$1 sumàne}}',
 'months' => '{{PLURAL:$1|$1 mese|$1 mise}}',
 'years' => '{{PLURAL:$1|$1 anne}}',
 'ago' => '$1 fà',
 'just-now' => 'mò mò',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ore}} fà',
+'minutes-ago' => '$1 {{PLURAL:$1|minute}} fà',
+'seconds-ago' => '$1 {{PLURAL:$1|seconde}} fà',
+'monday-at' => 'Lunedìe a le $1',
+'tuesday-at' => 'Martedìe a le $1',
+'wednesday-at' => 'Mercrudìe a le $1',
+'thursday-at' => 'Sciuvedìe a le $1',
+'friday-at' => 'Venerdìe a le $1',
+'saturday-at' => 'Sabbète a le $1',
+'sunday-at' => 'Dumeneche a le $1',
+'yesterday-at' => 'Aijere a le $1',
+
 # Bad image list
 'bad_image_list' => "'U formete jè 'u seguende:
 
@@ -3156,7 +3229,7 @@ Otre avènene scunnute pe defolt.
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larghezze',
 'exif-imagelength' => 'Altezze',
 'exif-bitspersample' => 'Bit pe combonende',
@@ -3349,7 +3422,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'No combresse',
 'exif-compression-2' => "Gruppe CCITT 3 Decodifeche de Esecuzione d'a lunghezze 1-Dimenzionale Cangiate de Huffman",
 'exif-compression-3' => "Gruppe CCITT 3 de decodifeche d'u fax",
@@ -3691,7 +3764,6 @@ Pe piacere conferme ca tu vuè avveramende reccrejà sta pàgene.",
 'semicolon-separator' => ';&#32;',
 'comma-separator' => ',&#32;',
 'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
 'pipe-separator' => '&#32;•&#32;',
 'word-separator' => '&#32;',
 'ellipsis' => '...',
@@ -3861,7 +3933,6 @@ Tu puè pure [[Special:EditWatchlist|ausà 'u cangiatore standàrd]].",
 'version-other' => 'Otre',
 'version-mediahandlers' => 'Gestore de le Media',
 'version-hooks' => 'Hook',
-'version-extension-functions' => 'Funziune estese',
 'version-parser-extensiontags' => "Tag pe l'estenziune de l'analizzatore",
 'version-parser-function-hooks' => "Funziune hook de l'analizzatore",
 'version-hook-name' => "Nome de l'hook",
@@ -3871,6 +3942,7 @@ Tu puè pure [[Special:EditWatchlist|ausà 'u cangiatore standàrd]].",
 'version-license' => 'Licenze',
 'version-poweredby-credits' => "Sta Uicchi jè fatte da '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'otre',
+'version-poweredby-translators' => 'tradutture de translatewiki.net',
 'version-credits-summary' => 'Nuje vulesseme acchià le persone seguende pe le lore condrebbute a [[Special:Version|MediaUicchi]].',
 'version-license-info' => "MediaUicchi jè 'nu softuare libbere, tu 'u puè redestribbuì  e/o cangiarle sotte le termine d'a GNU (Licenze Pubbleche Generale) cumme pubblecate da 'a Free Software Foundation; endrambe le versiune 2 d'a Licenze, o (a scelta toje) 'le versiune cchiù nnove.
 
@@ -3884,12 +3956,17 @@ Avisse avè ricevute [{{SERVER}}{{SCRIPTPATH}}/COPYING 'na copie d'a GNU (Licenz
 'version-entrypoints-header-entrypoint' => "Punde d'ingresse",
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => "Percorse d'u fail",
-'filepath-page' => 'File:',
-'filepath-submit' => 'Véje',
-'filepath-summary' => "Sta pàgena speciale retorne 'u percorse comblete pe 'nu file.<br />
-Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file rechiamane 'u lore programme associate direttamende.",
+# Special:Redirect
+'redirect' => "Redirette da 'u file, utende o ID d'a revisione",
+'redirect-legend' => "Redirette a 'nu file o 'na pàgene",
+'redirect-summary' => "Sta pàgena speciale redirezione a 'nu file (date 'u nome d'u file), 'na pàgene (fate 'n'ID de revisione), o 'na pàgene utende (date 'n'ID numeriche de l'utende).",
+'redirect-submit' => 'Véje',
+'redirect-lookup' => 'Mappature:',
+'redirect-value' => 'Valore:',
+'redirect-user' => "ID de l'utende",
+'redirect-revision' => "Revisione d'a pàgene",
+'redirect-file' => "Nome d'u file",
+'redirect-not-exists' => 'Valore non acchiate',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Cirche pe le file duplichete',
@@ -3939,6 +4016,7 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
 'tags' => 'Cangiaminde de le tag valide',
 'tag-filter' => 'Filtre de le [[Special:Tags|tag]]:',
 'tag-filter-submit' => 'Filtre',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)',
 'tags-title' => 'Tag',
 'tags-intro' => "Sta pàgene elenghe le tag ca 'u software pò marcà cu 'nu cangiamende e 'u lore significate.",
 'tags-tag' => "Nome d'u tag",
@@ -3965,6 +4043,7 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
 'dberr-problems' => "Simw spiacende! Stu site stè 'ngondre de le diffcoltà tecniche.",
 'dberr-again' => 'Aspitte quacche minute e pò recareche.',
 'dberr-info' => "(Non ge riuscime a condattà 'u server d'u database: $1)",
+'dberr-info-hidden' => "(Non ge pozze condattà 'u server d'u database)",
 'dberr-usegoogle' => 'Pu mumende tu puè pruvà a cercà cu Google.',
 'dberr-outofdate' => 'Vide ca le indice lore de le condenute nuèstre ponne essere non aggiornate.',
 'dberr-cachederror' => "Queste jè 'na copie ''cache'' d'a pàgene ca è cercate e allore non g'à puè cangià.",
@@ -3980,6 +4059,9 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
 'htmlform-submit' => 'Conferme',
 'htmlform-reset' => 'Annulle le cangiaminde',
 'htmlform-selectorother-other' => 'Otre',
+'htmlform-no' => 'None',
+'htmlform-yes' => 'Sìne',
+'htmlform-chosen-placeholder' => "Scacchie 'n'opzione",
 
 # SQLite database support
 'sqlite-has-fts' => "$1 cu 'u supporte d'a ricerche full-text",
@@ -4097,4 +4179,19 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
 # Image rotation
 'rotate-comment' => 'Immaggine rotate de $1 {{PLURAL:$1|grade}} in sienze orarie',
 
+# Limit report
+'limitreport-title' => "Analizzatore de le date d'a profilazione:",
+'limitreport-cputime' => "Tiembe de ause d'a CPU",
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|seconde}}',
+'limitreport-walltime' => 'Tiembe de ause in dirette',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|seconde}}',
+'limitreport-ppvisitednodes' => "Preprocessore d'u cunde de le node 'ndrucate",
+'limitreport-ppgeneratednodes' => "Preprocessore d'u cunde de le node generate",
+'limitreport-postexpandincludesize' => "Espanzione de apprisse ca 'nglude 'a dimenzione",
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte}}',
+'limitreport-templateargumentsize' => "Dimenzione de le argomende d'u template",
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte}}',
+'limitreport-expansiondepth' => 'Espanzione massime de profonnetà',
+'limitreport-expensivefunctioncount' => "Analizzatore d'u cunde d'a funzione ca coste assaije",
+
 );
diff --git a/languages/messages/MessagesRu.php b/languages/messages/MessagesRu.php
index d768cdea..a595abe6 100644
--- a/languages/messages/MessagesRu.php
+++ b/languages/messages/MessagesRu.php
@@ -15,11 +15,14 @@
  * @author AlexSm
  * @author Alexander Sigachov (alexander.sigachov@gmail.com)
  * @author Alexandr Efremov
+ * @author Altai uul
+ * @author Am81
  * @author Amikeco
  * @author Amire80
  * @author Anonim.one
  * @author Askarmuk
  * @author Assele
+ * @author BellaIlabekyan
  * @author Biathlon
  * @author Bouron
  * @author Chilin
@@ -30,6 +33,7 @@
  * @author Daniyar
  * @author Dim Grits
  * @author Don Alessandro
+ * @author Ekulikovdo
  * @author Eleferen
  * @author Erdemaslancan
  * @author EugeneZelenko
@@ -61,6 +65,8 @@
  * @author KorneySan
  * @author Kv75
  * @author Lockal
+ * @author Lord Dimetr
+ * @author Lunacy1911
  * @author Matma Rex
  * @author MaxBioHazard
  * @author MaxSem
@@ -75,6 +81,7 @@
  * @author Sagan
  * @author Shirayuki
  * @author Sk
+ * @author Soul Train
  * @author Spider
  * @author Sunpriat
  * @author TarzanASG
@@ -87,6 +94,7 @@
  * @author Гусейн
  * @author ОйЛ
  * @author Умар
+ * @author Чаховіч Уладзіслаў
  * @author לערי ריינהארט
  * @author გიორგიმელა
  */
@@ -124,16 +132,17 @@ $specialPageAliases = array(
 	'Activeusers'               => array( 'Активные_участники' ),
 	'Allmessages'               => array( 'Системные_сообщения' ),
 	'Allpages'                  => array( 'Все_страницы' ),
+	'Badtitle'                  => array( 'Недопустимое_название' ),
 	'Blankpage'                 => array( 'Пустая_страница' ),
 	'Block'                     => array( 'Заблокировать' ),
 	'Blockme'                   => array( 'Заблокируй_меня' ),
 	'Booksources'               => array( 'Источники_книг' ),
 	'BrokenRedirects'           => array( 'Разорванные_перенаправления' ),
 	'Categories'                => array( 'Категории' ),
-	'ChangeEmail'               => array( 'Сменить_e-mail' ),
+	'ChangeEmail'               => array( 'Сменить_e-mail', 'Сменить_почту' ),
 	'ChangePassword'            => array( 'Сменить_пароль' ),
 	'ComparePages'              => array( 'Сравнение_страниц' ),
-	'Confirmemail'              => array( 'Подтвердить_e-mail' ),
+	'Confirmemail'              => array( 'Подтвердить_e-mail', 'Подтвердить_почту' ),
 	'Contributions'             => array( 'Вклад' ),
 	'CreateAccount'             => array( 'Создать_учётную_запись', 'Создать_пользователя', 'Зарегистрироваться' ),
 	'Deadendpages'              => array( 'Тупиковые_страницы' ),
@@ -143,9 +152,12 @@ $specialPageAliases = array(
 	'EditWatchlist'             => array( 'Править_список_наблюдения' ),
 	'Emailuser'                 => array( 'Письмо_участнику', 'Отправить_письмо' ),
 	'Export'                    => array( 'Экспорт', 'Выгрузка' ),
+	'Fewestrevisions'           => array( 'Редко_редактируемые' ),
 	'FileDuplicateSearch'       => array( 'Поиск_дубликатов_файлов' ),
 	'Filepath'                  => array( 'Путь_к_файлу' ),
 	'Import'                    => array( 'Импорт' ),
+	'Invalidateemail'           => array( 'Отменить_подтверждение_адреса' ),
+	'JavaScriptTest'            => array( 'Тестирование_JavaScript' ),
 	'BlockList'                 => array( 'Список_блокировок', 'Блокировки' ),
 	'LinkSearch'                => array( 'Поиск_ссылок' ),
 	'Listadmins'                => array( 'Список_администраторов' ),
@@ -160,7 +172,13 @@ $specialPageAliases = array(
 	'Longpages'                 => array( 'Длинные_страницы' ),
 	'MergeHistory'              => array( 'Объединение_историй' ),
 	'MIMEsearch'                => array( 'Поиск_по_MIME' ),
+	'Mostcategories'            => array( 'Самые_категоризованные' ),
 	'Mostimages'                => array( 'Самые_используемые_файлы' ),
+	'Mostinterwikis'            => array( 'Наибольшее_количество_интервики-ссылок' ),
+	'Mostlinked'                => array( 'Самые_используемые_страницы' ),
+	'Mostlinkedcategories'      => array( 'Самые_используемые_категории' ),
+	'Mostlinkedtemplates'       => array( 'Самые_используемые_шаблоны' ),
+	'Mostrevisions'             => array( 'Наибольшее_количество_версий' ),
 	'Movepage'                  => array( 'Переименовать_страницу', 'Переименование', 'Переименовать' ),
 	'Mycontributions'           => array( 'Мой_вклад' ),
 	'Mypage'                    => array( 'Моя_страница' ),
@@ -172,9 +190,11 @@ $specialPageAliases = array(
 	'PermanentLink'             => array( 'Постоянная_ссылка' ),
 	'Popularpages'              => array( 'Популярные_страницы' ),
 	'Preferences'               => array( 'Настройки' ),
+	'Prefixindex'               => array( 'Указатель_по_началу_названия' ),
 	'Protectedpages'            => array( 'Защищённые_страницы' ),
 	'Protectedtitles'           => array( 'Защищённые_названия' ),
 	'Randompage'                => array( 'Случайная_страница', 'Случайная' ),
+	'Randomredirect'            => array( 'Случайное_перенаправление' ),
 	'Recentchanges'             => array( 'Свежие_правки' ),
 	'Recentchangeslinked'       => array( 'Связанные_правки' ),
 	'Revisiondelete'            => array( 'Удаление_правки' ),
@@ -189,6 +209,7 @@ $specialPageAliases = array(
 	'Uncategorizedpages'        => array( 'Некатегоризованные_страницы' ),
 	'Uncategorizedtemplates'    => array( 'Некатегоризованные_шаблоны' ),
 	'Undelete'                  => array( 'Восстановить', 'Восстановление' ),
+	'Unlockdb'                  => array( 'Разблокировка_БД' ),
 	'Unusedcategories'          => array( 'Неиспользуемые_категории' ),
 	'Unusedimages'              => array( 'Неиспользуемые_файлы' ),
 	'Unusedtemplates'           => array( 'Неиспользуемые_шаблоны' ),
@@ -247,6 +268,7 @@ $magicWords = array(
 	'pagenamee'                 => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ_2', 'PAGENAMEE' ),
 	'namespace'                 => array( '1', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
 	'namespacee'                => array( '1', 'ПРОСТРАНСТВО_ИМЁН_2', 'NAMESPACEE' ),
+	'namespacenumber'           => array( '1', 'НОМЕР_ПРОСТРАНСТВА_ИМЁН', 'NAMESPACENUMBER' ),
 	'talkspace'                 => array( '1', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ', 'TALKSPACE' ),
 	'talkspacee'                => array( '1', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ_2', 'TALKSPACEE' ),
 	'subjectspace'              => array( '1', 'ПРОСТРАНСТВО_СТАТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
@@ -294,6 +316,7 @@ $magicWords = array(
 	'localurl'                  => array( '0', 'ЛОКАЛЬНЫЙ_АДРЕС:', 'LOCALURL:' ),
 	'localurle'                 => array( '0', 'ЛОКАЛЬНЫЙ_АДРЕС_2:', 'LOCALURLE:' ),
 	'articlepath'               => array( '0', 'ПУТЬ_К_СТАТЬЕ', 'ARTICLEPATH' ),
+	'pageid'                    => array( '0', 'ИДЕНТИФИКАТОР_СТРАНИЦЫ', 'PAGEID' ),
 	'server'                    => array( '0', 'СЕРВЕР', 'SERVER' ),
 	'servername'                => array( '0', 'НАЗВАНИЕ_СЕРВЕРА', 'SERVERNAME' ),
 	'scriptpath'                => array( '0', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
@@ -355,6 +378,10 @@ $magicWords = array(
 	'url_path'                  => array( '0', 'ПУТЬ', 'PATH' ),
 	'url_wiki'                  => array( '0', 'ВИКИ', 'WIKI' ),
 	'url_query'                 => array( '0', 'ЗАПРОС', 'QUERY' ),
+	'pagesincategory_all'       => array( '0', 'все', 'all' ),
+	'pagesincategory_pages'     => array( '0', 'страницы', 'pages' ),
+	'pagesincategory_subcats'   => array( '0', 'подкатегории', 'subcats' ),
+	'pagesincategory_files'     => array( '0', 'файлы', 'files' ),
 );
 
 
@@ -441,9 +468,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Показывать число участников, включивших страницу в свой список наблюдения',
 'tog-oldsig' => 'Текущая подпись:',
 'tog-fancysig' => 'Собственная вики-разметка подписи (без автоматической ссылки)',
-'tog-externaleditor' => 'Использовать по умолчанию внешний редактор (только для специалистов, необходима особая настройка компьютера; [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
-'tog-externaldiff' => 'Использовать по умолчанию внешнюю программу сравнения (только для специалистов, необходима особая настройка компьютера; [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
-'tog-showjumplinks' => 'Включить вспомогательные ссылки «перейти к»',
 'tog-uselivepreview' => 'Использовать быстрый предварительный просмотр (экспериментально)',
 'tog-forceeditsummary' => 'Предупреждать, когда не заполнено поле описания правки',
 'tog-watchlisthideown' => 'Скрывать мои правки из списка наблюдения',
@@ -457,6 +481,8 @@ $messages = array(
 'tog-showhiddencats' => 'Показывать скрытые категории',
 'tog-noconvertlink' => 'Отключить ссылку на преобразование заголовка',
 'tog-norollbackdiff' => 'Не показывать разницу версий после выполнения отката',
+'tog-useeditwarning' => 'Предупреждать, когда я покидаю страницу с несохранёнными изменениями',
+'tog-prefershttps' => 'Всегда использовать защищённое соединение после представления системе',
 
 'underline-always' => 'Всегда',
 'underline-never' => 'Никогда',
@@ -520,6 +546,18 @@ $messages = array(
 'oct' => 'окт',
 'nov' => 'ноя',
 'dec' => 'дек',
+'january-date' => 'Январь $1',
+'february-date' => 'Февраль $1',
+'march-date' => 'Март $1',
+'april-date' => 'Апрель $1',
+'may-date' => 'Май $1',
+'june-date' => 'Июнь $1',
+'july-date' => 'Июль $1',
+'august-date' => 'Август $1',
+'september-date' => 'Сентябрь $1',
+'october-date' => 'Октябрь $1',
+'november-date' => 'Ноябрь $1',
+'december-date' => 'Декабрь $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категория|Категории}}',
@@ -601,6 +639,7 @@ $messages = array(
 'create-this-page' => 'Создать эту страницу',
 'delete' => 'Удалить',
 'deletethispage' => 'Удалить эту страницу',
+'undeletethispage' => 'Восстановить эту страницу',
 'undelete_short' => 'Восстановить $1 {{PLURAL:$1|правку|правки|правок}}',
 'viewdeleted_short' => 'Просмотр $1 {{PLURAL:$1|удалённой правки|удалённых правок|удалённых правок}}',
 'protect' => 'Защитить',
@@ -644,7 +683,7 @@ $1',
 'pool-queuefull' => 'Накопитель запросов полон',
 'pool-errorunknown' => 'Неизвестная ошибка',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Описание {{grammar:genitive|{{SITENAME}}}}',
 'aboutpage' => 'Project:Описание',
 'copyright' => 'Содержимое доступно по лицензии $1 (если не указано иное).',
@@ -654,7 +693,6 @@ $1',
 'disclaimers' => 'Отказ от ответственности',
 'disclaimerpage' => 'Project:Отказ от ответственности',
 'edithelp' => 'Справка по редактированию',
-'edithelppage' => 'Help:Как править статьи',
 'helppage' => 'Help:Содержание',
 'mainpage' => 'Заглавная страница',
 'mainpage-description' => 'Заглавная страница',
@@ -732,17 +770,12 @@ $1',
 # General errors
 'error' => 'Ошибка',
 'databaseerror' => 'Ошибка базы данных',
-'dberrortext' => 'Обнаружена ошибка синтаксиса запроса к базе данных.
-Это может означать ошибку в программном обеспечении.
-Последний запрос к базе данных:
-: <code>$1</code>
-произошёл из функции «<code>$2</code>».
-База данных возвратила ошибку «<code>$3: $4</code>».',
-'dberrortextcl' => 'Обнаружена ошибка синтаксиса запроса к базе данных.
-Последний запрос к базе данных:
-: «<code>$1</code>»
-произошёл из функции «<code>$2</code>».
-База данных возвратила ошибку «<code>$3: $4</code>».',
+'databaseerror-text' => 'Произошла ошибка в базе данных.
+Это может указывать на ошибку в программном обеспечении.',
+'databaseerror-textcl' => 'Произошла ошибка в базе данных.',
+'databaseerror-query' => 'Запрос: $1',
+'databaseerror-function' => 'Функция: $1',
+'databaseerror-error' => 'Ошибка: $1',
 'laggedslavemode' => 'Внимание: страница может не содержать последних обновлений.',
 'readonly' => 'Запись в базу данных заблокирована',
 'enterlockreason' => 'Укажите причину и намеченный срок блокировки.',
@@ -775,6 +808,7 @@ $1',
 'cannotdelete-title' => 'Нельзя удалить страницу «$1»',
 'delete-hook-aborted' => 'Правка отменена процедурой-перехватчиком.
 Дополнительных пояснений не приведено.',
+'no-null-revision' => 'Не удалось создать новую нулевую правку для страницы «$1»',
 'badtitle' => 'Недопустимое название',
 'badtitletext' => 'Запрашиваемое название страницы неправильно, пусто, либо неверно указано межъязыковое или интервики название. Возможно, в названии используются недопустимые символы.',
 'perfcached' => 'Следующие данные взяты из кэша и могут не учитывать последних изменений. В кэше хранится не более $1 {{PLURAL:$1|записи|записей|записей}}.',
@@ -796,12 +830,15 @@ $1',
 'editinginterface' => "'''Внимание:''' Вы редактируете страницу, содержащую текст интерфейса программного обеспечения.
 Её изменение повлияет на внешний вид интерфейса для других пользователей этой вики.
 Чтобы добавить или изменить перевод этого сообщения, пожалуйста, используйте сайт локализации MediaWiki [//translatewiki.net/ translatewiki.net].",
-'sqlhidden' => '(SQL запрос скрыт)',
 'cascadeprotected' => 'Страница защищена от изменений, поскольку она включена в {{PLURAL:$1|следующую страницу, для которой|следующие страницы, для которых}} включена каскадная защита:
 $2',
 'namespaceprotected' => 'У вас нет разрешения редактировать страницы в пространстве имён «$1».',
 'customcssprotected' => 'У вас нет разрешения редактировать эту CSS-страницу, так как она содержит личные настройки другого участника.',
 'customjsprotected' => 'У вас нет разрешения редактировать эту JavaScript-страницу, так как она содержит личные настройки другого участника.',
+'mycustomcssprotected' => 'У вас нет прав для редактирования этого CSS страницы.',
+'mycustomjsprotected' => 'У вас нет прав для редактирования JavaScript на странице.',
+'myprivateinfoprotected' => 'У вас нет разрешения на изменение вашей личной информации',
+'mypreferencesprotected' => 'У вас нет прав для редактирования ваших настроек.',
 'ns-specialprotected' => 'Страницы пространства имён «{{ns:special}}» не могут правиться.',
 'titleprotected' => "Создание страницы с таким заголовком было запрещено участником [[Участник:$1|$1]].
 Указана следующая причина: ''$2''.",
@@ -826,10 +863,19 @@ $2',
 'welcomecreation-msg' => 'Ваша учётная запись создана.
 Не забудьте провести [[Special:Preferences|персональную настройку]] сайта {{SITENAME}}.',
 'yourname' => 'Имя учётной записи:',
+'userlogin-yourname' => 'Имя учётной записи',
+'userlogin-yourname-ph' => 'Введите имя вашей учётной записи',
+'createacct-another-username-ph' => 'Введите имя вашей учётной записи',
 'yourpassword' => 'Пароль:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Введите свой пароль',
+'createacct-yourpassword-ph' => 'Введите пароль',
 'yourpasswordagain' => 'Повторный набор пароля:',
+'createacct-yourpasswordagain' => 'Подтвердите пароль',
+'createacct-yourpasswordagain-ph' => 'Введите пароль еще раз',
 'remembermypassword' => 'Помнить мою учётную запись на этом компьютере (не более $1 {{PLURAL:$1|дня|дней|дней}})',
-'securelogin-stick-https' => 'Продолжить подключение по HTTPS после входа',
+'userlogin-remembermypassword' => 'Оставаться в системе',
+'userlogin-signwithsecure' => 'Защищённое соединение',
 'yourdomainname' => 'Ваш домен:',
 'password-change-forbidden' => 'Вы не можете изменить пароль в этой вики.',
 'externaldberror' => 'Произошла ошибка при аутентификации с помощью внешней базы данных или у вас недостаточно прав для внесения изменений в свою внешнюю учётную запись.',
@@ -841,18 +887,44 @@ $2',
 'logout' => 'Завершение сеанса',
 'userlogout' => 'Завершение сеанса',
 'notloggedin' => 'Вы не представились системе',
+'userlogin-noaccount' => 'Нет учетной записи?',
+'userlogin-joinproject' => 'Присоединиться к проекту',
 'nologin' => 'Нет учётной записи? $1.',
 'nologinlink' => 'Создать учётную запись',
 'createaccount' => 'Создать учётную запись',
 'gotaccount' => "Вы уже зарегистрированы? '''$1'''.",
 'gotaccountlink' => 'Представьтесь',
 'userlogin-resetlink' => 'Забыли данные для входа?',
+'userlogin-resetpassword-link' => 'Сброс пароля',
+'helplogin-url' => 'Help:Представление системе',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помощь со входом в систему]]',
+'userlogin-loggedin' => 'Вы уже вошли как {{GENDER:$1|$1}}.
+Используйте форму ниже, чтобы войти под другим пользователем.',
+'userlogin-createanother' => 'Создать другую учётную запись',
+'createacct-join' => 'Введите свои данные ниже.',
+'createacct-another-join' => 'Введите данные новой учётной записи ниже.',
+'createacct-emailrequired' => 'Адрес электронной почты',
+'createacct-emailoptional' => 'Адрес электронной почты (необязательно)',
+'createacct-email-ph' => 'Введите свой адрес электронной почты',
+'createacct-another-email-ph' => 'Введите адрес электронной почты',
 'createaccountmail' => 'Использовать сгенерированный случайным образом временный пароль и выслать мне его на указанный адрес электронной почты',
+'createacct-realname' => 'Настоящее имя (необязательно)',
 'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-reason-ph' => 'Зачем вы создаёте другую учетную запись',
+'createacct-captcha' => 'Проверка безопасности',
+'createacct-imgcaptcha-ph' => 'Введите текст, который вы видите выше',
+'createacct-submit' => 'Создать учётную запись',
+'createacct-another-submit' => 'Создать ещё одну учётную запись',
+'createacct-benefit-heading' => '{{SITENAME}} создана такими же людьми, как вы.',
+'createacct-benefit-body1' => '{{PLURAL:$1|правка|правки|правок}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|статья|статьи|статей}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|участник|участника|участников}} за последнее время',
 'badretype' => 'Введённые вами пароли не совпадают.',
 'userexists' => 'Введённое имя участника уже используется.
 Пожалуйста, выберите другое имя.',
 'loginerror' => 'Ошибка опознавания участника',
+'createacct-error' => 'Ошибка создания учётной записи',
 'createaccounterror' => 'Невозможно создать учётную запись: $1',
 'nocookiesnew' => 'Участник зарегистрирован, но не представлен. {{SITENAME}} использует «cookies» для представления участников. У вас «cookies» запрещены. Пожалуйста, разрешите их, а затем представьтесь со своиим новым именем участника и паролем.',
 'nocookieslogin' => '{{SITENAME}} использует «cookies» для представления участников. Вы их отключили. Пожалуйста, включите их и попробуйте снова.',
@@ -914,10 +986,12 @@ $2',
 Проигнорируйте данное сообщение, если учётная запись была создана по ошибке.',
 'usernamehasherror' => 'Имя участника не может содержать символ «решётки»',
 'login-throttled' => 'Вы сделали слишком много попыток представиться системе.
-Пожалуйста, подождите перед тем, как попробовать снова.',
+Пожалуйста, подождите $1 перед тем, как попробовать снова.',
 'login-abort-generic' => 'Неудачная попытка представиться системе',
 'loginlanguagelabel' => 'Язык: $1',
 'suspicious-userlogout' => 'Ваш запрос на завершение сеанса отклонён, так как он похож на запрос, отправленный некорректным браузером или кэширующим прокси.',
+'createacct-another-realname-tip' => 'Настоящее имя (необязательное поле).
+Если вы укажете его, то оно будет использовано для того, чтобы показать, кем была внесена правка страницы.',
 
 # Email sending
 'php-mail-error-unknown' => 'Неизвестная ошибка в PHP-функции mail()',
@@ -933,8 +1007,7 @@ $2',
 'newpassword' => 'Новый пароль:',
 'retypenew' => 'Повторите ввод нового пароля:',
 'resetpass_submit' => 'Установить пароль и представиться',
-'resetpass_success' => 'Ваш пароль был успешно изменён!
-Производится вход в систему…',
+'changepassword-success' => 'Ваш пароль был успешно изменён!',
 'resetpass_forbidden' => 'Пароль не может быть изменён',
 'resetpass-no-info' => 'Чтобы обращаться непосредственно к этой странице, вам следует представиться системе.',
 'resetpass-submit-loggedin' => 'Изменить пароль',
@@ -946,10 +1019,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Сброс пароля',
-'passwordreset-text' => 'Чтобы сбросить свой пароль, заполните эту форму.',
+'passwordreset-text-one' => 'Заполните эту форму, чтобы сбросить свой пароль.',
+'passwordreset-text-many' => '{{PLURAL:$1|Заполните одно из полей для сброса пароля.}}',
 'passwordreset-legend' => 'Сбросить пароль',
 'passwordreset-disabled' => 'Сбросы пароля отключены на этой вики.',
-'passwordreset-pretext' => '{{PLURAL:$1||Введите одну из частей данных, показанных ниже}}',
+'passwordreset-emaildisabled' => 'Функции электронной почты отключены в этой вики.',
 'passwordreset-username' => 'Имя участника:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Просмотреть получившееся письмо?',
@@ -978,7 +1052,7 @@ $2
 Временный пароль: $2',
 'passwordreset-emailsent' => 'Отправлено электронное письмо с информацией о сбросе пароля.',
 'passwordreset-emailsent-capture' => 'Отправлено электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже.',
-'passwordreset-emailerror-capture' => 'Ниже приведено созданное письмо-напоминание, его отправка не удалась по причине: $1',
+'passwordreset-emailerror-capture' => 'Было создано электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже, однако его не удалось отправить {{GENDER:$2|участнику|участнице}} по следующей причине: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Изменить адрес электронной почты',
@@ -992,6 +1066,19 @@ $2
 'changeemail-submit' => 'Изменить адрес',
 'changeemail-cancel' => 'Отмена',
 
+# Special:ResetTokens
+'resettokens' => 'Сбросить токены',
+'resettokens-text' => 'Вы можете сбросить токены, которые позволяют иметь доступ к некоторым личным данным, которые связаны с вашей учётной записью. 
+
+Вам необходимо сделать это, если вы случайно поделился ими с кем-то, или если ваш аккаунт был взломан.',
+'resettokens-no-tokens' => 'Нет токенов для сброса.',
+'resettokens-legend' => 'Сбросить токены',
+'resettokens-tokens' => 'Токены:',
+'resettokens-token-label' => '$1 (текущее значение: $2)',
+'resettokens-watchlist-token' => 'Токен для веб-канала (Atom/RSS)  [[Special:Watchlist|изменений страниц в вашем списке наблюдения]]',
+'resettokens-done' => 'Токены сброшены.',
+'resettokens-resetbutton' => 'Сбросить выбранные токены',
+
 # Edit page toolbar
 'bold_sample' => 'Полужирное начертание',
 'bold_tip' => 'Полужирное начертание',
@@ -1193,12 +1280,15 @@ $2
 Вероятно, она была удалена.',
 'edit-conflict' => 'Конфликт редактирования.',
 'edit-no-change' => 'Ваша правка была отклонена, так как в тексте не было сделано изменений.',
+'postedit-confirmation' => 'Ваша правка сохранена.',
 'edit-already-exists' => 'Невозможно создать новую страницу.
 Она уже существует.',
 'defaultmessagetext' => 'Текст по умолчанию',
 'content-failed-to-parse' => 'Содержимое $2 не соответствует типу $1: $3.',
 'invalid-content-data' => 'Недопустимые данные',
 'content-not-allowed-here' => 'Содержимое "$1" недопустимо на странице [[$2]]',
+'editwarning-warning' => 'Переход на другую страницу может привести к потере сделанных вами изменений.
+Если вы зарегистрированы в системе, то вы можете отключить это предупреждение в разделе «Редактирование» ваших настроек.',
 
 # Content models
 'content-model-wikitext' => 'вики-текст',
@@ -1233,6 +1323,7 @@ $2
 'undo-failure' => 'Правка не может быть отменена из-за несовместимости промежуточных изменений.',
 'undo-norev' => 'Правка не может быть отменена, так как её не существует или она была удалена.',
 'undo-summary' => 'Отмена правки $1, сделанной {{GENDER:$2|участником|участницей}} [[Special:Contributions/$2|$2]] ([[User talk:$2|обс.]])',
+'undo-summary-username-hidden' => 'Отмена правки $1, сделанной участником, чьё имя скрыто',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Невозможно создать учётную запись',
@@ -1412,6 +1503,7 @@ $1",
 'compareselectedversions' => 'Сравнить выбранные версии',
 'showhideselectedversions' => 'Показать/скрыть выбранные версии',
 'editundo' => 'отменить',
+'diff-empty' => '(нет различий)',
 'diff-multi' => '({{PLURAL:$1|не показана $1 промежуточная версия|не показаны $1 промежуточные версии|не показаны $1 промежуточных версий}} {{PLURAL:$2|$2 участника|$2 участников}})',
 'diff-multi-manyusers' => '(не {{PLURAL:$1|показана $1 промежуточная версия|показаны $1 промежуточные версии|показаны $1 промежуточных версий}}, сделанные более чем $2 {{PLURAL:$2|участником|участниками}})',
 'difference-missing-revision' => '{{PLURAL:$2|$2 версия|$2 версии|$2 версий}} для этого сравнения ($1) {{PLURAL:$2|не обнаружена|не обнаружены}}.
@@ -1439,7 +1531,6 @@ $1",
 'searchmenu-legend' => 'Настройки поиска',
 'searchmenu-exists' => "'''В этой вики есть страница «[[:$1]]»'''",
 'searchmenu-new' => "'''Создать страницу «[[:$1]]» в этом вики-проекте!'''",
-'searchhelp-url' => 'Help:Содержание',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Показать страницы с этим префиксом]]',
 'searchprofile-articles' => 'Основные страницы',
 'searchprofile-project' => 'Страницы справки и проекта',
@@ -1480,15 +1571,7 @@ $1",
 'powersearch-togglenone' => 'Ничего',
 'search-external' => 'Внешний поиск',
 'searchdisabled' => 'Извините, но встроенный полнотекстовый поиск выключен. Вы можете воспользоваться поиском по сайту через поисковые системы общего назначения, однако имейте в виду, что копия сайта в их кэше может быть несколько устаревшей.',
-
-# Quickbar
-'qbsettings' => 'Панель навигации',
-'qbsettings-none' => 'Не показывать',
-'qbsettings-fixedleft' => 'Неподвижная слева',
-'qbsettings-fixedright' => 'Неподвижная справа',
-'qbsettings-floatingleft' => 'Плавающая слева',
-'qbsettings-floatingright' => 'Плавающая справа',
-'qbsettings-directionality' => 'Закреплённая, в зависимости от направления письменности вашего языка',
+'search-error' => 'Произошла ошибка при поиске: $1',
 
 # Preferences page
 'preferences' => 'Настройки',
@@ -1522,7 +1605,6 @@ $1",
 'resetprefs' => 'Сбросить',
 'restoreprefs' => 'Восстановить настройки по умолчанию',
 'prefs-editing' => 'Редактирование',
-'prefs-edit-boxsize' => 'Размер окна редактирования.',
 'rows' => 'Строк:',
 'columns' => 'Столбцов:',
 'searchresultshead' => 'Поиск',
@@ -1533,9 +1615,8 @@ $1",
 'recentchangesdays-max' => '(не более $1 {{PLURAL:$1|дня|дней|дней}})',
 'recentchangescount' => 'Количество правок, отображаемое по умолчанию:',
 'prefs-help-recentchangescount' => 'Включает свежие правки, истории страниц, журналы.',
-'prefs-help-watchlist-token' => 'Заполнение этого поля секретным ключом будет создавать RSS-трансляцию для вашего списка наблюдений.
-Каждый, кто знает ключ в этом поле, сможет читать ваш список наблюдения, поэтому выбирайте секретное значение.
-Вы можете использовать сгенерированное случайным образом значение: $1',
+'prefs-help-watchlist-token2' => 'Это секретный ключ для веб-канала вашего списка наблюдений.
+Любой, кто знает его, сможет читать ваш список наблюдения, поэтому не сообщайте его другим. [[Special:ResetTokens|Нажмите здесь, если вам нужно сбросить его]].',
 'savedprefs' => 'Ваши настройки сохранены.',
 'timezonelegend' => 'Часовой пояс:',
 'localtime' => 'Местное время:',
@@ -1566,7 +1647,6 @@ $1",
 'prefs-reset-intro' => 'Эта страница может быть использована для сброса ваших настроек на настройки по умолчанию.
 Подтвердив данное действие, вы не сможете его отменить.',
 'prefs-emailconfirm-label' => 'Подтверждение электронной почты:',
-'prefs-textboxsize' => 'Размер окна редактирования',
 'youremail' => 'Электронная почта:',
 'username' => '{{GENDER:$1|Имя участника|Имя участницы}}:',
 'uid' => 'Код {{GENDER:$1|участника|участницы}}:',
@@ -1600,6 +1680,8 @@ $1",
 'prefs-dateformat' => 'Формат даты',
 'prefs-timeoffset' => 'Смещение поясного времени',
 'prefs-advancedediting' => 'Общие параметры',
+'prefs-editor' => 'редактор',
+'prefs-preview' => 'предварительный просмотр',
 'prefs-advancedrc' => 'Расширенные настройки',
 'prefs-advancedrendering' => 'Расширенные настройки',
 'prefs-advancedsearchoptions' => 'Расширенные настройки',
@@ -1607,7 +1689,9 @@ $1",
 'prefs-displayrc' => 'Настройки отображения',
 'prefs-displaysearchoptions' => 'Настройки отображения',
 'prefs-displaywatchlist' => 'Настройки отображения',
+'prefs-tokenwatchlist' => 'Токен',
 'prefs-diffs' => 'Разница версий',
+'prefs-help-prefershttps' => 'Эта настройка будет применена после следующего представления системе.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Выглядит корректно',
@@ -1634,6 +1718,8 @@ $1",
 'userrights-notallowed' => 'У вас нет разрешения добавлять и удалять права участников.',
 'userrights-changeable-col' => 'Группы, которые вы можете изменять',
 'userrights-unchangeable-col' => 'Группы, которые вы не можете изменять',
+'userrights-conflict' => 'Конфликт изменения прав участника! Пожалуйста, проверьте и примените изменения заново.',
+'userrights-removed-self' => 'Вы успешно удалили собственные права. Таким образом, вы больше не сможете получить доступ к этой странице.',
 
 # Groups
 'group' => 'Группа:',
@@ -1699,11 +1785,19 @@ $1",
 'right-proxyunbannable' => 'обход автоматической блокировки прокси',
 'right-unblockself' => 'Разблокировать себя',
 'right-protect' => 'Изменение уровня защиты страниц и правка каскадно защищённых страниц',
-'right-editprotected' => 'Редактировать защищённые страницы (без каскадной защиты)',
+'right-editprotected' => 'Правка страниц, защищённых как «{{int:protect-level-sysop}}»',
+'right-editsemiprotected' => 'Правка страниц, защищённых как «{{int:protect-level-autoconfirmed}}»',
 'right-editinterface' => 'изменение пользовательского интерфейса',
 'right-editusercssjs' => 'правка CSS- и JS-файлов других участников',
 'right-editusercss' => 'правка CSS-файлов других участников',
 'right-edituserjs' => 'правка JavaScript-файлов других участников',
+'right-editmyusercss' => 'Редактирование файлов CSS пользователя',
+'right-editmyuserjs' => 'Редактировать свои пользовательские JavaScript-файлы',
+'right-viewmywatchlist' => 'Посмотреть свой список наблюдения',
+'right-editmywatchlist' => 'Редактировать свой список наблюдения. Обратите внимание, что некоторые действия будут добавлять страницы даже без такого права.',
+'right-viewmyprivateinfo' => 'Просмотр собственных личных данных (например, адрес электронной почты, настоящее имя)',
+'right-editmyprivateinfo' => 'Правка собственных личных данных (например, адрес электронной почты, настоящее имя)',
+'right-editmyoptions' => 'Редактировать собственные предпочтения',
 'right-rollback' => 'быстрый откат правок последнего участника на определенной странице',
 'right-markbotedits' => 'отметка откатываемых правок как правок бота',
 'right-noratelimit' => 'нет ограничений по скорости',
@@ -1765,12 +1859,19 @@ $1",
 'action-userrights-interwiki' => 'изменение прав участников в других вики',
 'action-siteadmin' => 'блокировка и разблокировка базы данных',
 'action-sendemail' => 'отправка электронных писем',
+'action-editmywatchlist' => 'редактирование вашего списка наблюдения',
+'action-viewmywatchlist' => 'просмотр вашего списка наблюдения',
+'action-viewmyprivateinfo' => 'просмотр вашей частной информации',
+'action-editmyprivateinfo' => 'редактирование вашей частной информации',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|изменение|изменения|изменений}}',
+'enhancedrc-since-last-visit' => '$1 с последнего посещения',
+'enhancedrc-history' => 'история',
 'recentchanges' => 'Свежие правки',
 'recentchanges-legend' => 'Настройки свежих правок',
 'recentchanges-summary' => 'Ниже в хронологическом порядке перечислены последние изменения на страницах {{grammar:genitive|{{SITENAME}}}}.',
+'recentchanges-noresult' => 'Изменений в указанный период, соответствующих указанным условиям, нет.',
 'recentchanges-feed-description' => 'Отслеживать в этом потоке последние изменения в вики.',
 'recentchanges-label-newpage' => 'Этой правкой была создана новая страница.',
 'recentchanges-label-minor' => 'Это незначительное изменение',
@@ -1808,7 +1909,6 @@ $1",
 'recentchangeslinked-feed' => 'Связанные правки',
 'recentchangeslinked-toolbox' => 'Связанные правки',
 'recentchangeslinked-title' => 'Связанные правки для «$1»',
-'recentchangeslinked-noresult' => 'На связанных страницах не было изменений за указанный период.',
 'recentchangeslinked-summary' => "Это список недавних изменений в страницах, на которые ссылается указанная страница (или входящих в указанную категорию).
 Страницы, входящие в [[Special:Watchlist|ваш список наблюдения]] '''выделены'''.",
 'recentchangeslinked-page' => 'Название страницы:',
@@ -1820,7 +1920,7 @@ $1",
 'reuploaddesc' => 'Вернуться к форме загрузки',
 'upload-tryagain' => 'Отправить изменённое описание файла',
 'uploadnologin' => 'Вы не представились системе',
-'uploadnologintext' => 'Вы должны [[Special:UserLogin|представиться системе]], чтобы иметь возможность загружать файлы.',
+'uploadnologintext' => 'Вы должны $1, чтобы загружать файлы на сервер.',
 'upload_directory_missing' => 'Директория для загрузок ($1) отсутствует и не может быть создана веб-сервером.',
 'upload_directory_read_only' => 'Веб-сервер не имеет прав записи в папку ($1), в которой предполагается хранить загружаемые файлы.',
 'uploaderror' => 'Ошибка загрузки файла',
@@ -2045,7 +2145,6 @@ $1',
 'http-read-error' => 'Ошибка чтения HTTP.',
 'http-timed-out' => 'Истекло время ожидания HTTP-запроса.',
 'http-curl-error' => 'Ошибка обращения к URL: $1',
-'http-host-unreachable' => 'Невозможно обратиться по указанному URL.',
 'http-bad-status' => 'Во время обработки HTTP-запроса обнаружена проблема: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2073,6 +2172,10 @@ $1',
 'listfiles_size' => 'Размер',
 'listfiles_description' => 'Описание',
 'listfiles_count' => 'Версий',
+'listfiles-show-all' => 'Включить старые версии изображений',
+'listfiles-latestversion' => 'Текущая версия',
+'listfiles-latestversion-yes' => 'Да',
+'listfiles-latestversion-no' => 'Нет',
 
 # File description page
 'file-anchor-link' => 'Файл',
@@ -2169,6 +2272,13 @@ $1',
 'randompage' => 'Случайная статья',
 'randompage-nopages' => 'В {{PLURAL:$2|следующем пространстве имён отсутствуют страницы|следующих пространствах имён нет страниц}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Случайная страница в категории',
+'randomincategory-invalidcategory' => 'Категории «$1» не существует.',
+'randomincategory-nopages' => 'Нет страниц в категории [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Перейти на случайную страницу из категории: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Перейти',
+
 # Random redirect
 'randomredirect' => 'Случайное перенаправление',
 'randomredirect-nopages' => 'Пространство имён «$1» не содержит перенаправлений.',
@@ -2194,17 +2304,13 @@ $1',
 'statistics-users-active-desc' => 'Участники, совершившие какое-либо действие за {{PLURAL:$1|последний $1 день|последние $1 дня|последние $1 дней}}',
 'statistics-mostpopular' => 'Наиболее часто просматриваемые страницы',
 
-'disambiguations' => 'Страницы, ссылающиеся на страницы разрешения неоднозначности',
-'disambiguationspage' => 'Template:Неоднозначность',
-'disambiguations-text' => "Следующие страницы содержат по меньшей мере одну ссылку на '''многозначную страницу'''.
-Вместо этого они, вероятно, должны указывать на соответствующую конкретную страницу.<br />
-Страница считается многозначной, если на ней размещён шаблон, имя которого указано на странице [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Страницы с переопределёнными свойствами',
 'pageswithprop-legend' => 'Страницы с переопределёнными свойствами',
 'pageswithprop-text' => 'Здесь перечислены страницы, у которых были вручную переопределены отдельные свойства.',
 'pageswithprop-prop' => 'Название свойства:',
 'pageswithprop-submit' => 'Найти',
+'pageswithprop-prophidden-long' => 'длинное значение текстового свойства скрыто ($1)',
+'pageswithprop-prophidden-binary' => 'значение двоичного свойства скрыто ($1)',
 
 'doubleredirects' => 'Двойные перенаправления',
 'doubleredirectstext' => 'На этой странице представлен список перенаправлений на другие перенаправления.
@@ -2262,6 +2368,7 @@ $1',
 'mostrevisions' => 'Наиболее часто редактировавшиеся страницы',
 'prefixindex' => 'Указатель по началу названий страниц',
 'prefixindex-namespace' => 'Указатель по началу страниц (пространство имён «{{ns:$1}}»)',
+'prefixindex-strip' => 'Скрыть префикс в списке результатов',
 'shortpages' => 'Короткие страницы',
 'longpages' => 'Длинные страницы',
 'deadendpages' => 'Тупиковые страницы',
@@ -2277,6 +2384,7 @@ $1',
 'listusers' => 'Список участников',
 'listusers-editsonly' => 'Показать только тех участников, кто сделал хотя бы одну правку',
 'listusers-creationsort' => 'Упорядочить по дате создания',
+'listusers-desc' => 'Сортировать по убыванию',
 'usereditcount' => '$1 {{PLURAL:$1|правка|правки|правок}}',
 'usercreated' => '{{GENDER:$3|зарегистрировался|зарегистрировалась}} $1 в $2',
 'newpages' => 'Новые страницы',
@@ -2456,10 +2564,9 @@ $1',
 'unwatchthispage' => 'Прекратить наблюдение',
 'notanarticle' => 'Не статья',
 'notvisiblerev' => 'Версия была удалена',
-'watchnochange' => 'За этот период ни одна страница из списка наблюдения не менялась.',
 'watchlist-details' => 'В вашем списке наблюдения $1 {{PLURAL:$1|страница|страницы|страниц}}, не считая страниц обсуждения.',
-'wlheader-enotif' => '* Уведомление по эл. почте включено.',
-'wlheader-showupdated' => "* Страницы, изменившиеся с вашего последнего их посещения, выделены '''жирным''' шрифтом.",
+'wlheader-enotif' => 'Уведомления по эл. почте включены.',
+'wlheader-showupdated' => "Страницы, изменившиеся с вашего последнего их посещения, выделены '''жирным''' шрифтом.",
 'watchmethod-recent' => 'просмотр последних изменений для наблюдаемых страниц',
 'watchmethod-list' => 'просмотр наблюдаемых страниц для последних изменений',
 'watchlistcontains' => 'Ваш список наблюдения содержит $1 {{PLURAL:$1|страница|страницы|страниц}}.',
@@ -2706,7 +2813,7 @@ $1',
 'contributions' => 'Вклад {{GENDER:$1|участника|участницы}}',
 'contributions-title' => 'Вклад {{GENDER:$1|участника|участницы}} $1',
 'mycontris' => 'Вклад',
-'contribsub2' => 'Для $1 ($2)',
+'contribsub2' => 'Вклад {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Изменений, соответствующих заданным условиям, найдено не было.',
 'uctop' => '(текущая)',
 'month' => 'С месяца (и ранее):',
@@ -2860,13 +2967,11 @@ $1',
 'ipb_blocked_as_range' => 'Ошибка: IP-адрес $1 был заблокирован не напрямую и не может быть разблокирован. Однако, он принадлежит к заблокированному диапазону $2, который можно разблокировать.',
 'ip_range_invalid' => 'Недопустимый диапазон IP-адресов.',
 'ip_range_toolarge' => 'Блокировки диапазонов свыше /$1 запрещены.',
-'blockme' => 'Заблокируй меня',
 'proxyblocker' => 'Блокировка прокси',
-'proxyblocker-disabled' => 'Функция отключена.',
 'proxyblockreason' => 'Ваш IP-адрес заблокирован потому, что это открытый прокси-сервер. Пожалуйста, свяжитесь со своиим интернет-провайдером или службой поддержки, и сообщите им об этой серьёзной проблеме безопасности.',
-'proxyblocksuccess' => 'Выполнено.',
 'sorbsreason' => 'Ваш IP-адрес числится как открытый прокси в DNSBL.',
 'sorbs_create_account_reason' => 'Ваш IP-адрес числится как открытый прокси в DNSBL. Вы не можете создать учётную запись.',
+'xffblockreason' => 'Был заблокирован IP-адрес, присутствующий в заголовке X-Forwarded-For и принадлежащий либо вам, либо используемому вами прокси-серверу. Первоначальная причина блокировки была следующей: $1',
 'cant-block-while-blocked' => 'Вы не можете блокировать других участников, пока вы сами заблокированы.',
 'cant-see-hidden-user' => 'Участник, которого вы пытаетесь заблокировать, уже заблокирован и скрыт. Поскольку у вас нет разрешения на работу по сокрытию участников, вы не можете просмотреть или изменить данную блокировку.',
 'ipbblocked' => 'Вы не можете блокировать или разблокировать других участников, так как вы сами заблокированы',
@@ -3034,6 +3139,8 @@ $1',
 'thumbnail-more' => 'Увеличить',
 'filemissing' => 'Файл не найден',
 'thumbnail_error' => 'Ошибка создания миниатюры: $1',
+'thumbnail_error_remote' => 'Сообщение об ошибке от $1:
+$2',
 'djvu_page_error' => 'Номер страницы DjVu вне досягаемости',
 'djvu_no_xml' => 'Невозможно получить XML для DjVu',
 'thumbnail-temp-create' => 'Не удаётся создать временный файл эскиза',
@@ -3178,20 +3285,15 @@ $1',
 'tooltip-undo' => 'Убрать внесённую правку и показать предпросмотр, с возможностью указать причину отмены',
 'tooltip-preferences-save' => 'Сохранить настройки',
 'tooltip-summary' => 'Введите краткое описание',
+'tooltip-iwiki' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/* Размещённый здесь CSS будет применяться ко всем темам оформления */',
-'standard.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Standard */',
-'nostalgia.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Nostalgia */',
 'cologneblue.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Cologne Blue */',
 'monobook.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Monobook */',
-'myskin.css' => '/* Размещённый здесь CSS будет применяться к теме оформления MySkin */',
-'chick.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Chick */',
-'simple.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Simple */',
 'modern.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Modern */',
 'vector.css' => '/* Размещённый здесь CSS будет применяться к векторной теме оформления  */',
 'print.css' => '/* Размещённый здесь CSS будет применяться к версии для печати */',
-'handheld.css' => '/* Размещённый здесь CSS-код будет применяться для мобильных устройств, использующих тему оформления, указанную в $wgHandheldStyle */',
 'noscript.css' => '/* Размещённый здесь CSS будет применяться для участников с отключенным JavaScript  */',
 'group-autoconfirmed.css' => '/* Размещённый здесь CSS будет применяться для автоподтверждённых участников */',
 'group-bot.css' => '/* Размещённый здесь CSS будет применяться только для ботов */',
@@ -3200,13 +3302,8 @@ $1',
 
 # Scripts
 'common.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */',
-'standard.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Standard */',
-'nostalgia.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Nostalgia */',
 'cologneblue.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Cologne Blue */',
 'monobook.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления MonoBook */',
-'myskin.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления MySkin  */',
-'chick.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Chick */',
-'simple.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Simple */',
 'modern.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Modern */',
 'vector.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Vector */',
 'group-autoconfirmed.js' => '/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус автоподтверждённых (autoconfirmed) */',
@@ -3288,12 +3385,7 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-category-files' => 'Количество файлов',
 
 # Skin names
-'skinname-standard' => 'Классическое',
-'skinname-nostalgia' => 'Ностальгия',
 'skinname-cologneblue' => 'Кёльнская тоска',
-'skinname-myskin' => 'Своё',
-'skinname-chick' => 'Цыпа',
-'skinname-simple' => 'Простое',
 'skinname-modern' => 'Современное',
 'skinname-vector' => 'Векторное',
 
@@ -3378,11 +3470,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 минута|$1 минуты|$1 минут}}',
 'hours' => '{{PLURAL:$1|$1 час|$1 часа|$1 часов}}',
 'days' => '{{PLURAL:$1|$1 день|$1 дня|$1 дней}}',
+'weeks' => '{{PLURAL:$1|$1 неделя|$1 недели|$1 недель}}',
 'months' => '{{PLURAL:$1|$1 месяц|$1 месяца|$1 месяцев}}',
 'years' => '{{PLURAL:$1|$1 год|$1 года|$1 лет}}',
 'ago' => '$1 назад',
 'just-now' => 'только что',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|час|часа|часов}} назад',
+'minutes-ago' => '$1 {{PLURAL:$1|минуту|минуты|минут}} назад',
+'seconds-ago' => '$1 {{PLURAL:$1|секунду|секунды|секунд}} назад',
+'monday-at' => 'в понедельник в $1',
+'tuesday-at' => 'во вторник в $1',
+'wednesday-at' => 'в среду в $1',
+'thursday-at' => 'в четверг в $1',
+'friday-at' => 'в пятницу в $1',
+'saturday-at' => 'в субботу в $1',
+'sunday-at' => 'в воскресенье в $1',
+'yesterday-at' => 'Вчера в $1',
+
 # Bad image list
 'bad_image_list' => 'Формат должен быть следующим:
 
@@ -3410,7 +3516,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Высота',
 'exif-bitspersample' => 'Глубина цвета',
@@ -3589,7 +3695,7 @@ $1',
 'exif-originalimageheight' => 'Высота изображения до кадрирования',
 'exif-originalimagewidth' => 'Ширина изображения до кадрирования',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Несжатый',
 'exif-compression-2' => 'CCITT Group 3, 1-мерная модификация кодирования длин серий Хаффмана',
 'exif-compression-3' => 'CCITT Group 3, факсовое кодирование',
@@ -4065,7 +4171,6 @@ $5
 'version-other' => 'Иное',
 'version-mediahandlers' => 'Обработчики медиа',
 'version-hooks' => 'Перехватчики',
-'version-extension-functions' => 'Функции расширений',
 'version-parser-extensiontags' => 'Теги расширений синтаксического анализатора',
 'version-parser-function-hooks' => 'Перехватчики функций синтаксического анализатора',
 'version-hook-name' => 'Имя перехватчика',
@@ -4074,6 +4179,7 @@ $5
 'version-license' => 'Лицензия',
 'version-poweredby-credits' => "Эта вики работает на движке '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'другие',
+'version-poweredby-translators' => 'переводчики translatewiki.net',
 'version-credits-summary' => 'Хотим поблагодарить следующих участников за их вклад в развитие [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki является свободным программным обеспечением, которое вы можете распространять и/или изменять в соответствии с условиями лицензии GNU General Public License, опубликованной фондом свободного программного обеспечения; второй версии, либо любой более поздней версии.
 
@@ -4089,12 +4195,17 @@ MediaWiki распространяется в надежде, что она бу
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Путь к статье]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Путь к скрипту]',
 
-# Special:FilePath
-'filepath' => 'Путь к файлу',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Перейти',
-'filepath-summary' => 'Данная служебная страница возвращает полный путь к файлу.
-Изображения показываются в полном разрешении, другие типы файлов открываются напрямую в связанных с ними программах.',
+# Special:Redirect
+'redirect' => 'Перенаправление с файла, участника или идентификатора версии',
+'redirect-legend' => 'Перенаправление на файл или страницу',
+'redirect-summary' => 'Эта специальная страница перенаправляет на файл (с имени файла), страницу (с идентификатора версии) или страницу участника (с числового идентификатора участника).',
+'redirect-submit' => 'Перейти',
+'redirect-lookup' => 'Поиск:',
+'redirect-value' => 'Значение:',
+'redirect-user' => 'Идентификатор участника',
+'redirect-revision' => 'Версия страницы',
+'redirect-file' => 'Название файла',
+'redirect-not-exists' => 'Значение не найдено',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Поиск одинаковых файлов',
@@ -4144,12 +4255,16 @@ MediaWiki распространяется в надежде, что она бу
 'tags' => 'Действующие метки изменений',
 'tag-filter' => 'Фильтр [[Special:Tags|меток]]:',
 'tag-filter-submit' => 'Отфильтровать',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Метка|Метки}}]]: $2)',
 'tags-title' => 'Метки',
 'tags-intro' => 'На этой странице приведён список меток, которыми программное обеспечение отмечает правки, а также значения этих меток.',
 'tags-tag' => 'Имя метки',
 'tags-display-header' => 'Отображение в списках изменений',
 'tags-description-header' => 'Полное описание значения',
+'tags-active-header' => 'Активна?',
 'tags-hitcount-header' => 'Отмеченные правки',
+'tags-active-yes' => 'Да',
+'tags-active-no' => 'Нет',
 'tags-edit' => 'править',
 'tags-hitcount' => '$1 {{PLURAL:$1|изменение|изменения|изменений}}',
 
@@ -4170,6 +4285,7 @@ MediaWiki распространяется в надежде, что она бу
 'dberr-problems' => 'Извините! На данном сайте возникли технические трудности.',
 'dberr-again' => 'Попробуйте обновить страницу через несколько минут.',
 'dberr-info' => '(невозможно соединиться с сервером баз данных: $1)',
+'dberr-info-hidden' => '(Невозможно соединиться с сервером баз данных)',
 'dberr-usegoogle' => 'Пока вы можете попробовать поискать с помощью Google.',
 'dberr-outofdate' => 'Но имейте в виду, что его индекс может оказаться устаревшим.',
 'dberr-cachederror' => 'Ниже представлена закэшированная версия запрашиваемой страницы, возможно, она не отражает последних изменений.',
@@ -4185,6 +4301,9 @@ MediaWiki распространяется в надежде, что она бу
 'htmlform-submit' => 'Отправить',
 'htmlform-reset' => 'Отменить изменения',
 'htmlform-selectorother-other' => 'Иное',
+'htmlform-no' => 'Нет',
+'htmlform-yes' => 'Да',
+'htmlform-chosen-placeholder' => 'Выберите вариант',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 с поддержкой полнотекстового поиска',
@@ -4302,4 +4421,19 @@ MediaWiki распространяется в надежде, что она бу
 # Image rotation
 'rotate-comment' => 'Изображение повёрнуто на $1 градус{{PLURAL:$1||а|ов}} по часовой стрелке',
 
+# Limit report
+'limitreport-title' => 'Данные анализатора:',
+'limitreport-cputime' => 'Использование времени процессора',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|секунда|секунды|секунд}}',
+'limitreport-walltime' => 'Использование в режиме реального времени',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунда|секунды|секунд}}',
+'limitreport-ppvisitednodes' => 'Количество узлов, посещённых препроцессором',
+'limitreport-ppgeneratednodes' => 'Количество сгенерированных препроцессором узлов',
+'limitreport-postexpandincludesize' => 'Размер раскрытых включений',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт|байта|байтов}}',
+'limitreport-templateargumentsize' => 'Размер аргумента шаблона',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт|байта|байтов}}',
+'limitreport-expansiondepth' => 'Наибольшая глубина расширения',
+'limitreport-expensivefunctioncount' => 'Количество «дорогих» функций анализатора',
+
 );
diff --git a/languages/messages/MessagesRue.php b/languages/messages/MessagesRue.php
index 64d33e1f..a82354e0 100644
--- a/languages/messages/MessagesRue.php
+++ b/languages/messages/MessagesRue.php
@@ -148,9 +148,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Вказати кілько хоснователїв придало сторінку до свого списку слїдованых',
 'tog-oldsig' => 'Існуючій підпис:',
 'tog-fancysig' => 'Хосновати про підпис вікітекст (без автоматічного одказу)',
-'tog-externaleditor' => 'Імпліцітно хосновати екстерный едітор (лем про скусеных, выжадує шпеціалне наштелёваня компютера; [//www.mediawiki.org/wiki/Manual:External_editors далшы інформації])',
-'tog-externaldiff' => 'Імпліцітно хосновати проґрам про порівнаваня (лем про скусеных, выжадує шпеціалне наштелёваня компютера; [//www.mediawiki.org/wiki/Manual:External_editors далшы інформації])',
-'tog-showjumplinks' => 'Актівізовати помічны одказы "перейти дo"',
 'tog-uselivepreview' => 'Хосновати швыдкый нагляд (експеріментално)',
 'tog-forceeditsummary' => 'Упозорнити ня, кідь не є выповнене згорнутя едітованя',
 'tog-watchlisthideown' => 'Сховати мої едітованя на списку слїдованых сторінок',
@@ -163,6 +160,8 @@ $messages = array(
 'tog-diffonly' => 'Не вказовати обсяг сторінкы під роздїлом  верзій',
 'tog-showhiddencats' => 'Вказати схованы катеґорії',
 'tog-norollbackdiff' => 'По вернутю зміны не вказовати порівнаня роздїлів',
+'tog-useeditwarning' => 'Упозорнити ня, кідь буду опущати сторінку без уложіня змін',
+'tog-prefershttps' => 'По приголошіню все хосновате беспечне споїня',
 
 'underline-always' => 'Все',
 'underline-never' => 'Нїґда',
@@ -226,6 +225,18 @@ $messages = array(
 'oct' => 'окт',
 'nov' => 'нов',
 'dec' => 'дец',
+'january-date' => '$1. януара',
+'february-date' => '$1. фебруара',
+'march-date' => '$1. марца',
+'april-date' => '$1. апріля',
+'may-date' => '$1. мая',
+'june-date' => '$1. юна',
+'july-date' => '$1. юла',
+'august-date' => '$1. авґуста',
+'september-date' => '$1. септембра',
+'october-date' => '$1. октобра',
+'november-date' => '$1. новембра',
+'december-date' => '$1. децембра',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Катеґорія|Катеґорії}}',
@@ -307,6 +318,7 @@ $messages = array(
 'create-this-page' => 'Створити тоту сторінку',
 'delete' => 'Вымазати',
 'deletethispage' => 'Змазати тоту сторінку',
+'undeletethispage' => 'Обновити тоту сторінку',
 'undelete_short' => 'Обновити $1 {{PLURAL:$1|верзію|верзії|верзії}}',
 'viewdeleted_short' => 'Видїти {{PLURAL:$1|змазанов едітаціёв|$1 змазаны едітації|$1 змазаных едітацій}}',
 'protect' => 'Всокотити',
@@ -350,7 +362,7 @@ $1',
 'pool-queuefull' => 'Фронта є повна',
 'pool-errorunknown' => 'Незнама хыба',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'О&nbsp;{{grammar:genitive|{{SITENAME}}}}',
 'aboutpage' => 'Project:{{SITENAME}}',
 'copyright' => 'Обсяг є доступный з $1.',
@@ -360,7 +372,6 @@ $1',
 'disclaimers' => 'Вылучіня одповідности',
 'disclaimerpage' => 'Project:Вылучіня одповідности',
 'edithelp' => 'Поміч едітованя',
-'edithelppage' => 'Help:Едітованя',
 'helppage' => 'Help:Обсяг',
 'mainpage' => 'Головна сторінка',
 'mainpage-description' => 'Головна сторінка',
@@ -437,17 +448,12 @@ $1',
 # General errors
 'error' => 'Хыба',
 'databaseerror' => 'Датабазова хыба',
-'dberrortext' => 'Найджена  сінтактічна хыба в запросї до датабазы.
-Тото може вказовати на хыбу в проґрамовім забеспечіню.
-Послїднїй запрос до датабазы:
-<blockquote><code>$1</code></blockquote>
-з функції "<code>$2</code>".
-Датабаза вернула хыбу "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Найджена сінтактічна хыба в запросї до датабазы.
-Послїднїй запрос до датабазы:
-«$1»
-з функції «$2».
-Датабаза вернула хыбу «$3: $4».',
+'databaseerror-text' => 'При запытї до датабазы ся трафіла хыба.
+Тото може вказовати на хыбу в проґрамовім забеспечіню.',
+'databaseerror-textcl' => 'При запытї до датабазы ся трафіла хыба.',
+'databaseerror-query' => 'Запыт: $1',
+'databaseerror-function' => 'Функція: $1',
+'databaseerror-error' => 'Хыба: $1',
 'laggedslavemode' => 'Увага: Сторінка не мусить быти актуална',
 'readonly' => 'Датабаза є замкнута',
 'enterlockreason' => 'Удайте причіну замкнутя і приближный термін одомкнутя',
@@ -480,6 +486,7 @@ $1',
 Може уж быв(а)  змазаный(а) дакым іншым.',
 'cannotdelete-title' => 'Не годен змазати сторінку "$1"',
 'delete-hook-aborted' => 'Едітованя было сторноване процедуров пунктом припоёваня без близшого пояснїня.',
+'no-null-revision' => 'Не годен створити нову нулову ревізію сторінкы "$1"',
 'badtitle' => 'Неприпустна назва',
 'badtitletext' => 'Пожадована назва сторінкы неправилна, порожня, або неправилно одказована як міджі-язычного ці міджі-вікі назва.
 Може ся хоснують сімболы, котры не можуть быти хоснованы в назвах.',
@@ -501,12 +508,15 @@ $1',
 'editinginterface' => "'''Позірь:''' Едітуєте сторінку,котра є частинов текстового інтерфейсу.
 Зміны той сторінкы выкличуть зміну інтерфейсу про іншых хоснователїв той вікі. 
 Додати ці змінити переклады на вшыткых вікі просиме хоснуйте [//translatewiki.net/wiki/Main_Page?setlang=uk translatewiki.net] — проєкт, што ся занимать локалізаціов MediaWiki.",
-'sqlhidden' => '(SQL запрос скрытый)',
 'cascadeprotected' => 'Сторінка є замнкута, бо є вложена до  {{PLURAL:$1|наслїдуючой сторінкы замкнуты|наслїдуючіх сторінок замнкнутых|наслїдуючіх сторінок замнкнутых}} каскадовым замком:
 $2',
 'namespaceprotected' => 'Не маєте права едітовати сторінкы в просторї  назв «$1».',
 'customcssprotected' => 'Не маєте права едітовати тоту сторінку з CSS, бо обсягує персоналны наставлїна іншого хоснователя.',
 'customjsprotected' => 'Не маєте права едітовати тоту сторінку з JavaScript-ом, бо обсягує персоналны наставлїна іншого хоснователя.',
+'mycustomcssprotected' => 'Не мате права на управы той CSS сторінкы.',
+'mycustomjsprotected' => 'Не мате права на едітованя той JavaScript сторінкы.',
+'myprivateinfoprotected' => 'Не мате дозволїня мінити свої пріватны інформації.',
+'mypreferencesprotected' => 'Не мате дозволїня мінити свої наставлїня.',
 'ns-specialprotected' => 'Шпеціалны сторінкы не є можне едітовати.',
 'titleprotected' => "Створїня сторінкы з таков назвов было заборонене хоснователём [[User:$1|$1]] з причінов: ''$2''.",
 'filereadonlyerror' => "Не годно змінити файл „$1“, бо архів файлів „$2“ є теперь лем на чітаня.
@@ -530,10 +540,19 @@ $2',
 'welcomecreation-msg' => 'Ваше конто было вытворене.
 Не забудьте змінити свої [[Special:Preferences|наставлїня {{grammar:2sg|{{SITENAME}}}}]].',
 'yourname' => 'Імя хоснователя:',
+'userlogin-yourname' => 'Імя хоснователя',
+'userlogin-yourname-ph' => 'Уведьте ваше імя хоснователя',
+'createacct-another-username-ph' => 'Уведьте імя хоснователя',
 'yourpassword' => 'Гесло:',
+'userlogin-yourpassword' => 'Гесло',
+'userlogin-yourpassword-ph' => 'Уведьте ваше гесло',
+'createacct-yourpassword-ph' => 'Уведьте ваше гесло',
 'yourpasswordagain' => 'Повторяйте гесло:',
+'createacct-yourpasswordagain' => 'Потвердьте гесло',
+'createacct-yourpasswordagain-ph' => 'Уведьте гесло знову',
 'remembermypassword' => 'Запамнятати моє приголошіня на тім компютерї (максімално $1 {{PLURAL:$1|день|днів}})',
-'securelogin-stick-https' => 'Останьте  припоєны через HTTPS по приголошіню',
+'userlogin-remembermypassword' => 'Приголосити ня на довго',
+'userlogin-signwithsecure' => 'Хосновати забеспечене споїня',
 'yourdomainname' => 'Ваша домена:',
 'password-change-forbidden' => 'На тій вікі не можете мінити гесла.',
 'externaldberror' => 'Або ся стала хыба екстерной автентіфікачной датабазы, або не маєте дозволено мінити своє екстерне конто.',
@@ -545,18 +564,41 @@ $2',
 'logout' => 'Одголосити',
 'userlogout' => 'Одголошіня',
 'notloggedin' => 'Не сьте приголошеный(а)',
+'userlogin-noaccount' => 'Не мате конто?',
+'userlogin-joinproject' => 'Придайте ся {{grammar:3sg|{{SITENAME}}}}',
 'nologin' => "До теперь не маєте конто? '''$1'''.",
 'nologinlink' => 'Створити конто',
 'createaccount' => 'Вытворити конто',
 'gotaccount' => "Уж сьте реґістрованы? '''$1'''.",
 'gotaccountlink' => 'Приголошіня',
 'userlogin-resetlink' => 'Забыли сьте вашы даны на приголошіня?',
+'userlogin-resetpassword-link' => 'Ресетовати ваше гесло',
+'helplogin-url' => 'Help:Приголошіня',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Поміч з приголошованём]]',
+'createacct-join' => 'Ниже уведьте вашы інформації',
+'createacct-another-join' => 'Ниже уведьте інформації нового конта',
+'createacct-emailrequired' => 'Адреса електронічной пошты',
+'createacct-emailoptional' => 'Адреса електронічной пошты (не обовязково)',
+'createacct-email-ph' => 'Уведьте вашу адресу електронічной пошты',
+'createacct-another-email-ph' => 'Уведьте адресу електронічной пошты',
 'createaccountmail' => 'Схосновати дочасне гесло та загнати го на вказану адресу електронічной пошты',
+'createacct-realname' => 'Правдиве імя (не обовязково)',
 'createaccountreason' => 'Причіна:',
+'createacct-reason' => 'Прічіна',
+'createacct-reason-ph' => 'Чом собі робите друге конто',
+'createacct-captcha' => 'Перевірка беспекы',
+'createacct-imgcaptcha-ph' => 'Опиште текст што видите высше',
+'createacct-submit' => 'Створити конто',
+'createacct-another-submit' => 'Створити інше конто',
+'createacct-benefit-heading' => '{{grammar:4sg|{{SITENAME}}}} творять люде як вы.',
+'createacct-benefit-body1' => '{{PLURAL:$1|едітованя|едітованя|едітовань}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|сторінка|сторінкы|сторінок}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|недавный приспіватель|недавны приспівателї|недавных приспівателїв}}',
 'badretype' => 'Вами написаны гесла не сугласять.',
 'userexists' => 'Уведжене імя хоснователя ся уж хоснує.
 Просиме, выберьте інше імя.',
 'loginerror' => 'Хыба при приголошованю',
+'createacct-error' => 'Хыба створїня конта',
 'createaccounterror' => 'Не вдало ся створити конто хоснователя: $1',
 'nocookiesnew' => 'Конто хоснователя было створене, але не сьте приголошены.
 {{SITENAME}} хоснує cookies про приголошіня але вы маєте cookies выпнуты .
@@ -614,10 +656,12 @@ $2',
 Іґноруйте дане повідомлїня, кідь конто было створено помылково.',
 'usernamehasherror' => 'Мено хоснователя не сміє обсяговати сімбол мережка (#)',
 'login-throttled' => 'Зробили сьте дуже много спроб о приголошіня.
-Просиме Вас, почекайте перед далшов спробов.',
+Просиме Вас, почекайте $1 перед далшов спробов.',
 'login-abort-generic' => 'Не вдало ся войти до сістемы.',
 'loginlanguagelabel' => 'Язык: $1',
 'suspicious-userlogout' => 'Ваша пожадавка на одголошіня была одвергнута, бо вызерає то так, же была послана розбитым переглядачом або кешуючім проксі-сервером.',
+'createacct-another-realname-tip' => 'Правдиве імя є волительне.
+Кідь вы зволите го додати, тото буде пак хосноване на доданя участникового попису про ёго роботу.',
 
 # Email sending
 'php-mail-error-unknown' => 'Незнама хыба у PHP mail() функції',
@@ -632,8 +676,7 @@ $2',
 'newpassword' => 'Нове гесло:',
 'retypenew' => 'Напиште знову нове гесло:',
 'resetpass_submit' => 'Наставити гесло і приголосити ся',
-'resetpass_success' => 'Ваше гесло было успішно змінене!
-Такой входиме...',
+'changepassword-success' => 'Ваше гесло было успішно змінено!',
 'resetpass_forbidden' => 'Гесла не є можне змінити',
 'resetpass-no-info' => 'Ку тій сторінцї мають прямый приступ лем приголошены хоснователї.',
 'resetpass-submit-loggedin' => 'Змінити гесло',
@@ -645,10 +688,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Ресет гесла',
-'passwordreset-text' => 'Выпиште тот формуларь, жебы ся вам могло обновити гесло',
+'passwordreset-text-one' => 'Выпиште тот формуларь, жебы сьте могли здобыти нове гесло',
+'passwordreset-text-many' => '{{PLURAL:$1|На здобытя нового гесла доповньте єдно з даных.}}',
 'passwordreset-legend' => 'Знову наставити гесло',
 'passwordreset-disabled' => 'Зновунаставлїня гесла є на тій вікі заказане',
-'passwordreset-pretext' => '{{PLURAL:$1||Задайте єден з дат ниже}}',
+'passwordreset-emaildisabled' => 'Функції електронічной пошты были выпнуы на тій вікі.',
 'passwordreset-username' => 'Мено хоснователя:',
 'passwordreset-domain' => 'Домена:',
 'passwordreset-capture' => 'Посмотрити выслїдный імейл?',
@@ -674,7 +718,7 @@ $2
 Дочасне гесло: $2',
 'passwordreset-emailsent' => 'Імейл з геслом быв посланый.',
 'passwordreset-emailsent-capture' => 'Быв выґенерованый імейл з геслом, што є вказаный ниже.',
-'passwordreset-emailerror-capture' => 'Быв выґенерованый припоминаючій імейл, котрый є указаный ниже, але одослати хоснователёви ся го не вдало: $1',
+'passwordreset-emailerror-capture' => 'Быв выґенерованый імейл з геслом, котрый є указаный ниже, але ся го не вдало загнати {{GENDER:$2|хоснователёви|хосновательцї}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Зміна імейловой адресы',
@@ -688,6 +732,19 @@ $2
 'changeemail-submit' => 'Змінити імейл',
 'changeemail-cancel' => 'Сторно',
 
+# Special:ResetTokens
+'resettokens' => 'Реініціалізація клічів',
+'resettokens-text' => 'На тій сторінцї можете реініціалізовати клічі, якы уможнюють приступ к даякым пріватным даным звязаным з вашым контом.
+
+{{GENDER:|Мав|Мала|Мали}} бы сьте то учінити тогды, колы сьте помылково дакому {{GENDER:|прозрадив|прозрадила|прозрадили}}, або ваше конто было зрушене.',
+'resettokens-no-tokens' => 'Не є ниякых клічів на реініціалізацію.',
+'resettokens-legend' => 'Реініціалізація клічів',
+'resettokens-tokens' => 'Клічі:',
+'resettokens-token-label' => '$1 (актуалне значіня: $2)',
+'resettokens-watchlist-token' => 'Кліч до вебового канала (Atom/RSS) [[Special:Watchlist|змін слїдованых сторінок]]',
+'resettokens-done' => 'Клічі были реініціалізованы.',
+'resettokens-resetbutton' => 'Реініціалізовати зволены клічі',
+
 # Edit page toolbar
 'bold_sample' => 'Товстый текст',
 'bold_tip' => 'Шырокый текст',
@@ -873,11 +930,14 @@ $2
 Асі была змазана.',
 'edit-conflict' => 'Конфлікт едітованя.',
 'edit-no-change' => 'Ваша едітація была іґнорована, бо ся не зробила жадна зміна тексту.',
+'postedit-confirmation' => 'Ваше едітованя было уложене.',
 'edit-already-exists' => 'Не вдало ся створити нову сторінку, бо она уж існує.',
 'defaultmessagetext' => 'Преднаставленый текст повідомлїня',
 'content-failed-to-parse' => 'Не вдало ся проаналізовати $2 як тіп $1: $3',
 'invalid-content-data' => 'Неприпустны даны',
 'content-not-allowed-here' => 'Обсяг «$1» недозволеный на сторінцї [[$2]]',
+'editwarning-warning' => 'Зохаблїнём той стрінкы ся можуть вшыткы учінены зміны стратити.
+Кідь сьте приголошеный, можете тото варованя выпнути на картї „Едітованя“ в хосновательскім інтерфейсї.',
 
 # Content models
 'content-model-wikitext' => 'вікітекст',
@@ -912,6 +972,7 @@ $2
 'undo-failure' => 'Едітованя не могло быти зрушене про конфлікт міджілеглых змін.',
 'undo-norev' => 'Тото едітованя не можете вернути назад, бо не екзістує або было змазане.',
 'undo-summary' => 'Зрушена верзія $1 од хоснователя [[Special:Contributions/$2|$2]] ([[User talk:$2|діскузія]])',
+'undo-summary-username-hidden' => 'Зрушыти ревізію $1 скрытого хоснователя',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Не є можне вытворити конто',
@@ -1090,6 +1151,7 @@ $1",
 'compareselectedversions' => 'Порівнати выбраны верзії',
 'showhideselectedversions' => 'Вказати/скрыти выбраны ревізії',
 'editundo' => 'вернути назад',
+'diff-empty' => '(Не є роздїлне)',
 'diff-multi' => '({{PLURAL:$1|Не є зображена єдна міджілегла верзія|Не суть зображены $1 міджілеглы верзії|Не є зображено $1 міджілеглых верзій}} од {{PLURAL:$2|1 хоснователя|$2 хоснователїв}} .)',
 'diff-multi-manyusers' => '(Не є зображено $1 міджілеглых верзій од веце як $2 {{PLURAL:$2|хоснователя|хоснователїв}}.)',
 'difference-missing-revision' => '{{PLURAL:$2|Єдна з ревізій|$2 ревізії|$2 ревізій}} к пожадованому порівнаню ($1) {{PLURAL:$2|не є|не суть|не є}}.
@@ -1117,7 +1179,6 @@ $1",
 'searchmenu-legend' => 'Параметры гляданя',
 'searchmenu-exists' => "'''У тій вікі є сторінка з назвов «[[:$1]]»'''",
 'searchmenu-new' => "'''Створити сторінку «[[:$1]]» у тій вікі!'''",
-'searchhelp-url' => 'Help:Обсяг',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Вказати сторінкы з тым префіксом]]',
 'searchprofile-articles' => 'Статї',
 'searchprofile-project' => 'Сторінкы помочі і проєкту',
@@ -1159,15 +1220,7 @@ $1",
 'powersearch-togglenone' => 'Жадный',
 'search-external' => 'Екстерне гляданя',
 'searchdisabled' => '<p>Перебачте. Повнотекстове гляданя є дочасно недоступне. Затля можете спробовати гляданя Google; є але можне, же ёго резултаты не мусять быти актуалны.</p>',
-
-# Quickbar
-'qbsettings' => 'Панел навіґації',
-'qbsettings-none' => 'Жадный',
-'qbsettings-fixedleft' => 'Лежыть влїво',
-'qbsettings-fixedright' => 'Лежыть вправо',
-'qbsettings-floatingleft' => 'Плаваюча влїво',
-'qbsettings-floatingright' => 'Плаваюча вправо',
-'qbsettings-directionality' => 'Певный, в залежности на напрями вашого письма',
+'search-error' => 'Як ся глядало трафіла ся хыба: $1',
 
 # Preferences page
 'preferences' => 'Наставлїня',
@@ -1201,7 +1254,6 @@ $1",
 'resetprefs' => 'Вернути неуложены зміны',
 'restoreprefs' => 'Обновити вшыткы штандартны наставлїня (у вшыткых секціях)',
 'prefs-editing' => 'Едітованя',
-'prefs-edit-boxsize' => 'Розмір окна едітованя:',
 'rows' => 'Рядкы:',
 'columns' => 'Колонкы:',
 'searchresultshead' => 'Гляданя',
@@ -1212,9 +1264,8 @@ $1",
 'recentchangesdays-max' => '(максімум $1 {{PLURAL:$1|день|днї|днїв}})',
 'recentchangescount' => 'Чісло імпліцітно зображованых едітовань:',
 'prefs-help-recentchangescount' => 'Тыкать ся послїднїх змін, історії сторінок і протоколовачіх записів.',
-'prefs-help-watchlist-token' => 'Кідь до того поля выповните тайный ключ, буде створеный RSS канал вашых слїдованых сторінок.
-Хоцьхто хто знає тот ключ, пак буде мочі ваш список слїдованых сторінок чітати, та же не забывайте на беспечность.
-Можете схосновати тото трафунково выґенероване значіня: $1',
+'prefs-help-watchlist-token2' => 'Гевсе є тайный кліч до вебового порталу вашых слїдованых сторінок. Хоцьхто, хто тот кліч буде мав, буде міг ваш список слїдованых сторінок чітати, та же го никому не давайте.
+[[Special:ResetTokens|Кликнутём гев го можете реініціалізовати.]]',
 'savedprefs' => 'Ваше наставлїня было уложене.',
 'timezonelegend' => 'Часова зона:',
 'localtime' => 'Містный час:',
@@ -1245,7 +1296,6 @@ $1",
 'prefs-reset-intro' => 'Помочов той сторінкы можете вшыткы наставлїня вернути на імпліцітны годноты.
 Тоту операцію не годен вернути назад.',
 'prefs-emailconfirm-label' => 'Потверджіня електронічной пошты:',
-'prefs-textboxsize' => 'Розмір окна едітованя',
 'youremail' => 'Адреса електронічной пошты:',
 'username' => '{{GENDER:$1|Імя хоснователя}}:',
 'uid' => 'Ідентіфікатор {{GENDER:$1|хоснователя}}:',
@@ -1279,6 +1329,8 @@ $1",
 'prefs-dateformat' => 'Формат датуму',
 'prefs-timeoffset' => 'Часовый посун',
 'prefs-advancedediting' => 'Общі параметры',
+'prefs-editor' => 'Едітор',
+'prefs-preview' => 'Нагляд',
 'prefs-advancedrc' => 'Росшырены можности',
 'prefs-advancedrendering' => 'Розшырены можности',
 'prefs-advancedsearchoptions' => 'Розшырены можности',
@@ -1286,7 +1338,9 @@ $1",
 'prefs-displayrc' => 'Наставлїня  взгляду',
 'prefs-displaysearchoptions' => 'Наставлїня  взгляду',
 'prefs-displaywatchlist' => 'Наставлїня  взгляду',
+'prefs-tokenwatchlist' => 'Кліч',
 'prefs-diffs' => 'Порівнаня верзії',
+'prefs-help-prefershttps' => 'Тот параметер набуде чінности по вашім далшім входї до сістемы.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Адреса ел. пошты вызерать быти правилна',
@@ -1313,6 +1367,8 @@ $1",
 'userrights-notallowed' => 'Вы не мате права придати або одстранити хосновательскы права.',
 'userrights-changeable-col' => 'Ґрупы, котры можете змінити',
 'userrights-unchangeable-col' => 'Ґрупы, котры не можете змінити',
+'userrights-conflict' => 'Конфлікт змін прав хоснователїв! Просиме, перевірьте зміны і потвердьте їх.',
+'userrights-removed-self' => 'Вы успішно позбавили ся властных прав. Зато уж веце не мате приступ до той сторінкы.',
 
 # Groups
 'group' => 'Ґрупа:',
@@ -1379,11 +1435,19 @@ $1",
 'right-proxyunbannable' => 'Обходжіня автоматічного блокованя проксі серверів',
 'right-unblockself' => 'Одблоковати самого себе',
 'right-protect' => 'Зміна ровни замків і едітованя каскадово замкнутых сторінок',
-'right-editprotected' => 'Едітованя замкнутых сторінок (без каскадового замку)',
+'right-editprotected' => 'Едітованя сторінок замкнутых на „{{int:protect-level-sysop}}“',
+'right-editsemiprotected' => 'Едітованя сторінок замкнутых на „{{int:protect-level-autoconfirmed}}“',
 'right-editinterface' => 'Едітованя інтерфейсу хоснователя',
 'right-editusercssjs' => 'Едітованя CSS і JS файлів іншых хоснователїв',
 'right-editusercss' => 'Едітованя CSS файлів іншых хоснователїв',
 'right-edituserjs' => 'Едітованя JS файлів іншых хоснователїв',
+'right-editmyusercss' => 'Едітовати вашы властны хосновательскы CSS файлы.',
+'right-editmyuserjs' => 'Едітовати вашы властны хосновательскы JavaScript файлы',
+'right-viewmywatchlist' => 'Перезераня властного списку слїдованых сторінок',
+'right-editmywatchlist' => 'Едітованя властного списку слїдованых сторінок. Усвідомте собі, же дакотры дїї будуть до нёго придавати сторінкы і без такого права.',
+'right-viewmyprivateinfo' => 'Перезераня властных пріватных даных (напр. імейлова адреса, правдиве імя)',
+'right-editmyprivateinfo' => 'Зміна вашых пріватных даных (напр. імейлова адреса, правдиве імя)',
+'right-editmyoptions' => 'Зміна вашых хосновательскых наставлїнь',
 'right-rollback' => 'Швыдкый реверт управ послїднёго хоснователя едітуючого дану сторінку',
 'right-markbotedits' => 'Означованя ревертів як едітованя робота',
 'right-noratelimit' => 'Не має обмеджіня в швыдкости',
@@ -1445,12 +1509,18 @@ $1",
 'action-userrights-interwiki' => 'зміна прав хоснователїв на іншых вікі',
 'action-siteadmin' => 'замыкати або одомыкати датабазу',
 'action-sendemail' => 'посылати імейлы',
+'action-editmywatchlist' => 'едітовати ваш список слїдованых сторінок',
+'action-viewmywatchlist' => 'перезерати ваш список слїдованых сторінок',
+'action-viewmyprivateinfo' => 'перезерати вашы пріватны даны',
+'action-editmyprivateinfo' => 'едітовати вашы пріватны інформації',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|зміна|зміны|змін}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|од остатнёй навщівы}}',
 'recentchanges' => 'Послїднї зміны',
 'recentchanges-legend' => 'Можности послїднїх змін',
 'recentchanges-summary' => 'Слїдуйте послїднї зміны на {{grammar:genitive|{{SITENAME}}}}  на тій сторінцї.',
+'recentchanges-noresult' => 'В данім періодї, не было ниякых змін, штобы одповідали тым крітеріям.',
 'recentchanges-feed-description' => 'На тотїм каналу слїдуєте послїднї зміны на {{grammar:6sg|{{SITENAME}}}}.',
 'recentchanges-label-newpage' => 'Тым едітованём была створена нова сторінка',
 'recentchanges-label-minor' => 'Тото є мала зміна',
@@ -1487,7 +1557,6 @@ $1",
 'recentchangeslinked-feed' => 'Повязаны зміны',
 'recentchangeslinked-toolbox' => 'Повязаны зміны',
 'recentchangeslinked-title' => 'Зміны звязаны з «$1»',
-'recentchangeslinked-noresult' => 'В зазначенім часї не были жадны зміны на одказованых сторінках.',
 'recentchangeslinked-summary' => "Тото є список недавных змін на сторінках на котры одказує задана сторінка (або котры належать до той катеґорії).
 Сторінкы з [[Special:Watchlist|вашого списку слїдованых]] суть вызначены '''тучно'''.",
 'recentchangeslinked-page' => 'Назва сторінкы:',
@@ -1499,7 +1568,7 @@ $1",
 'reuploaddesc' => 'Зрушыти ладованя а вернути ся до формы наладовованя',
 'upload-tryagain' => 'Уложыти зміненый попис файлу',
 'uploadnologin' => 'Не сьте приголошеный(а)',
-'uploadnologintext' => 'Жебы наладовати файл, мусите ся [[Special:UserLogin|приголосити]].',
+'uploadnologintext' => 'Про наладованя файлу ся мусите $1.',
 'upload_directory_missing' => 'Адресарь про наладовованя файлів ($1) хыбить тай вебовый сервер го не годен створити.',
 'upload_directory_read_only' => 'До адресаря наладованых файлів ($1) не мать вебовый сервер права запису.',
 'uploaderror' => 'Під час ладованя ся притрафила хыба',
@@ -1705,7 +1774,6 @@ $1',
 'http-read-error' => 'Хыба чітаня HTTP.',
 'http-timed-out' => 'Час про HTTP пожадавкы уплинув.',
 'http-curl-error' => 'Хыба при чітаню з URL: $1',
-'http-host-unreachable' => 'Не вдало ся досягнути URL.',
 'http-bad-status' => 'Під час HTTP пожадавкы притрафив ся проблем: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1733,6 +1801,10 @@ $1',
 'listfiles_size' => 'Розмір (в байтах)',
 'listfiles_description' => 'Опис',
 'listfiles_count' => 'Верзії',
+'listfiles-show-all' => 'Включати стары верзії образчіків',
+'listfiles-latestversion' => 'Актуална верзія',
+'listfiles-latestversion-yes' => 'Гей',
+'listfiles-latestversion-no' => 'Нї',
 
 # File description page
 'file-anchor-link' => 'Файл',
@@ -1828,6 +1900,12 @@ $1',
 'randompage' => 'Трафункова статя',
 'randompage-nopages' => 'Не є сторінок в {{PLURAL:$2|просторі назв|просторах назв}} $1.',
 
+# Random page in category
+'randomincategory' => 'Трафункова сторінка в катеґорії',
+'randomincategory-invalidcategory' => '" $1 " не є платна назва катеґорії.',
+'randomincategory-nopages' => 'В [[:Category:$1|катеґорії $1]] не суть ниякы сторінкы.',
+'randomincategory-selectcategory' => 'Дістати трафункову сторінку з катеґорії: $1 $2.',
+
 # Random redirect
 'randomredirect' => 'Трафункове напрямлїня',
 'randomredirect-nopages' => 'Простор назв „$1“ не обсягує жадны напрямлїня.',
@@ -1853,17 +1931,13 @@ $1',
 'statistics-users-active-desc' => 'Хоснователї, котры в {{plural:$1|минулого дня|минулых  $1 днїв}} провели даяку операцію',
 'statistics-mostpopular' => 'Найчітанїшы сторінкы',
 
-'disambiguations' => 'Сторінкы одказуючі на богатозначны статї',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Слїдуючі сторінкы включають найменше єден одказ на '''чеперушку'''.
-Асі намісто того мали бы одказовати на конкретнїшу сторінку.<br />
-Сторінка є тримана за чеперушку, кідь хоснує дакотру із шаблон одказованых на [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Сторінкы з властностями',
 'pageswithprop-legend' => 'Сторінкы з властностёв',
 'pageswithprop-text' => 'Тота сторінка обсягує список сторінкы, што хоснують вызначену властность сторінкы.',
 'pageswithprop-prop' => 'Назва властности:',
 'pageswithprop-submit' => 'Выконати',
+'pageswithprop-prophidden-long' => 'довге значіня текстовой властности сховане ($1)',
+'pageswithprop-prophidden-binary' => 'значіня бінарной властности є сховане ($1)',
 
 'doubleredirects' => 'Двоїты напрямлїня',
 'doubleredirectstext' => 'На тій сторінцї є список напрямлїн ведучіх на далшы напрямлїня.
@@ -1921,6 +1995,7 @@ $1',
 'mostrevisions' => 'Сторінкы з найвеце ревізіями',
 'prefixindex' => 'Вшыткы сторінкы з початком назв',
 'prefixindex-namespace' => 'Вшыткы сторінкы з префіксом (простор назв $1)',
+'prefixindex-strip' => 'Одсїчі початок назвы в списку',
 'shortpages' => 'Курты статї',
 'longpages' => 'Найдовшы статті',
 'deadendpages' => 'Слїпы сторінкы',
@@ -2113,7 +2188,6 @@ $1',
 'unwatchthispage' => 'Не слїдовати сторінку',
 'notanarticle' => 'Тото не є статя',
 'notvisiblerev' => 'Верзія была змазана',
-'watchnochange' => 'Жадна із слїдованых положок не была едітована в часї, котрый є указаный.',
 'watchlist-details' => '{{PLURAL:$1|Єдна слїдована сторінка|слїдованы сторінкы|слїдованых сторінок}} (не рахувчі діскузны сторінкы).',
 'wlheader-enotif' => 'Упозорнїня  ел. поштов є запнуте.',
 'wlheader-showupdated' => "Сторінкы, котры ся змінили од вашой послїднёй навщівы суть вказаны '''грубо'''",
@@ -2512,14 +2586,12 @@ $1',
 'ipb_blocked_as_range' => 'Хыба: IP-адреса $1 не є блокована прямо а так єй не є можне одблоковати. Є частёв заблокованого россягу $2, котрый може быти одблокованый.',
 'ip_range_invalid' => 'Неплатный IP россяг.',
 'ip_range_toolarge' => 'Блокованя россягів векшых як  /$1 не є дозволене.',
-'blockme' => 'Заблокуй ня',
 'proxyblocker' => 'Блокованя проксі',
-'proxyblocker-disabled' => 'Тота фунція є выпнута.',
 'proxyblockreason' => 'Ваша IP-адреса была заблокована, зато же фунґує як отвореный проксі сервер. 
 Контактуйте свого Інтернет-провайдера або технічну підпору і інформуйте їх о тім серьёзнім беспечностнім проблемі.',
-'proxyblocksuccess' => 'Готово.',
 'sorbsreason' => 'Ваша IP-адреса є веджена як отвореный проксі в DNSBL.',
 'sorbs_create_account_reason' => 'Ваша IP-адреса є веджена як одкрытый проксі в DNSBL. З той адресы собі не можете створити конто.',
+'xffblockreason' => 'IP адреса написана в голові X-Forwarded-For, ці уж ваша, або проксі сервера, што хоснуєете, была заблокована. Оріґінална прічіна того блокованя: $1',
 'cant-block-while-blocked' => 'Не можете блоковати іншых хоснователїв, кідь сьте сам заблокованый(а).',
 'cant-see-hidden-user' => 'Хоснователь, котрого хочете заблоковати, уж быв заблокованый і схованый. Кідьже не маєте права hideuser, не можете собі наставлїня блокованя того хоснователя посмотрити ани го змінити.',
 'ipbblocked' => 'Не можете блоковати або одблоковати іншых хоснователїв, {{GENDER:|сам|сама|сам}} сьте {{GENDER:|заблокованый|заблокована|заблокованый}}',
@@ -2681,6 +2753,8 @@ $1',
 'thumbnail-more' => 'Звекшыти',
 'filemissing' => 'Файл хыбить',
 'thumbnail_error' => 'Хыба створїня нагляду: $1',
+'thumbnail_error_remote' => 'Хыбове голошіня з {{grammar:2sg|$1}}:
+$2',
 'djvu_page_error' => 'Сторінка DjVu мімо россяг',
 'djvu_no_xml' => 'Створїня XML про файл DjVu ся не вдало.',
 'thumbnail-temp-create' => 'Дочасный файл нагляду негодно было створити',
@@ -2971,11 +3045,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 минута|$1 минуты|$1 минут}}',
 'hours' => '{{PLURAL:$1|$1 година|$1 годины|$1 годин}}',
 'days' => '{{PLURAL:$1|$1 день|$1 днї|$1 днїв}}',
+'weeks' => '{{PLURAL:$1|$1 тыждень|$1 тыжднї|$1 тыжднїв}}',
 'months' => '{{PLURAL:$1|$1 місяць|$1 місяцї|$1 місяцїв}}',
 'years' => '{{PLURAL:$1|$1 рік|$1 рокы|$1 років}}',
 'ago' => '$1 тому',
 'just-now' => 'акурат теперь',
 
+# Human-readable timestamps
+'hours-ago' => 'перед $1 {{PLURAL:$1|годинов|годинами}}',
+'minutes-ago' => '$1 {{PLURAL:$1|минуту|минуты|минут}} тому',
+'seconds-ago' => '$1 {{PLURAL:$1|секунду|секунды|секунд}} тому',
+'monday-at' => 'В понедїлёк о $1',
+'tuesday-at' => 'У вівторок о $1',
+'wednesday-at' => 'В середу о $1',
+'thursday-at' => 'В четверь о $1',
+'friday-at' => 'В пятніцю о $1',
+'saturday-at' => 'В суботу о $1',
+'sunday-at' => 'В недїлю о $1',
+'yesterday-at' => 'Вчера о $1',
+
 # Bad image list
 'bad_image_list' => 'Формат має быти наступным:
 
@@ -3005,7 +3093,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Шырька',
 'exif-imagelength' => 'Вышка',
 'exif-bitspersample' => 'Глубка фарбы',
@@ -3183,7 +3271,7 @@ $1',
 'exif-originalimageheight' => 'Вышка образчіка перед орїзанём',
 'exif-originalimagewidth' => 'Шырка образчіка перед орїзанём',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Нестиснутый',
 'exif-compression-2' => '1-дімензіоналне Гуффманове кодованя довжкы бігу CCITT Group 3',
 'exif-compression-3' => 'Кодованя факсів CCITT Group 3',
@@ -3568,7 +3656,6 @@ $5
 'version-other' => 'Інше',
 'version-mediahandlers' => 'Обслуга медії',
 'version-hooks' => 'Припойны пункты',
-'version-extension-functions' => 'Функції розшыриня',
 'version-parser-extensiontags' => 'Приданы сінтактічны значкы',
 'version-parser-function-hooks' => 'Функціа парсера',
 'version-hook-name' => 'Назва припойного пункту',
@@ -3577,6 +3664,7 @@ $5
 'version-license' => 'Ліценція',
 'version-poweredby-credits' => "Тота вікі біжыть на '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'іншы',
+'version-poweredby-translators' => 'перекладателї на translatewiki.net',
 'version-credits-summary' => 'Слїдуючім людям бы сьме радо подяковали за їх приспівкы [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki є слободный софтвер; можете го шырити або управляти в згодї з условіями GNU General Public License, выдаваной Free Software Foundation; будь верзія 2 той ліценції або (як уважыте) будьяка пізнїша верзія.
 
@@ -3590,11 +3678,17 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'version-entrypoints-header-entrypoint' => 'Вступный пункт',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Стежка ку файлу',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Выконати',
-'filepath-summary' => 'Тота шпеціална сторінка вертать повну стежку к файлу. Образкы ся зобразять в повнім розлишіню, іншы тіпы файлів ся отворять в асоціованых проґрамах.',
+# Special:Redirect
+'redirect' => 'Напрямлїня за файлом, хоснователям або ID ревізії',
+'redirect-legend' => 'Напрямити на файл або сторінку',
+'redirect-summary' => 'Тота шпеціална сторінка напрямує на файл (по назві), сторінку (по ID ревізії) або хоснователя (по чіселнім хоснователёвім ID).',
+'redirect-submit' => 'Перейти',
+'redirect-lookup' => 'Найти:',
+'redirect-value' => 'Значіня',
+'redirect-user' => 'ID хоснователя',
+'redirect-revision' => 'Ревізія сторінкы',
+'redirect-file' => 'Назва файлу',
+'redirect-not-exists' => 'Значіня ся не нашло',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Гляданя дуплікатных файлів',
@@ -3644,6 +3738,7 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'tags' => 'Платны значкы про зміны',
 'tag-filter' => 'Філтер [[Special:Tags|значок]]:',
 'tag-filter-submit' => 'Філтровати',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Значка|Значкы}}]]: $2)',
 'tags-title' => 'Значкы',
 'tags-intro' => 'Тота сторінка обсягує список значок, котрыма може софтвер означовати єднотливы едітованя і їх значіня.',
 'tags-tag' => 'Назва значкы',
@@ -3670,6 +3765,7 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'dberr-problems' => 'Перебачте! Тот сервер має теперь технічны проблемы.',
 'dberr-again' => 'Спробуйте обновити сторінку за пару мінут.',
 'dberr-info' => '(не годен навязати споїня з датабазовым сервером: $1)',
+'dberr-info-hidden' => '(Не годен навязати споїня з датабазовым сервером)',
 'dberr-usegoogle' => 'Можете спробовати поглядати за допомогов Google.',
 'dberr-outofdate' => 'Майте на увазї, же ёго індексы можуть быти застарілыма.',
 'dberr-cachederror' => 'Наслїдуюча сторінка є копія з кеш і не мусить быти актуалне.',
@@ -3685,6 +3781,9 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'htmlform-submit' => 'Одослати',
 'htmlform-reset' => 'Вернути зміны',
 'htmlform-selectorother-other' => 'Інше',
+'htmlform-no' => 'Нє',
+'htmlform-yes' => 'Гей',
+'htmlform-chosen-placeholder' => 'Звольте параметер',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 з підпоров повнотекстового гляданя',
@@ -3802,4 +3901,17 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 # Image rotation
 'rotate-comment' => 'Образчік обернутый о $1 {{PLURAL:$1|ґрадус|ґрадусів}} за цайґером',
 
+# Limit report
+'limitreport-title' => 'Дата профілованя парсера:',
+'limitreport-cputime' => 'Час хоснованя CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|секунда|секунды|секунд}}',
+'limitreport-walltime' => 'Хоснованя реалного часу',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунда|секунды|секунд}}',
+'limitreport-ppvisitednodes' => 'Чісло ґузів навщівленых препроцесором',
+'limitreport-ppgeneratednodes' => 'Чісло ґузів выґенерованых препроцесором',
+'limitreport-postexpandincludesize' => 'Розмір по включіню до росшырїня',
+'limitreport-templateargumentsize' => 'Розмір арґументів шаблоны',
+'limitreport-expansiondepth' => 'Найвысша глубка росшырїня',
+'limitreport-expensivefunctioncount' => 'Чісло дорогой функції аналізатора',
+
 );
diff --git a/languages/messages/MessagesRup.php b/languages/messages/MessagesRup.php
index 2d43144b..f19be29c 100644
--- a/languages/messages/MessagesRup.php
+++ b/languages/messages/MessagesRup.php
@@ -7,7 +7,6 @@
  * @ingroup Language
  * @file
  *
- * @author D'AroemenenZullenNiVergaan
  * @author Dumitrachi T. Fundu
  * @author Hakka
  */
@@ -21,18 +20,18 @@ $messages = array(
 'thursday' => 'Gioia',
 'friday' => 'Vinirã',
 'saturday' => 'Sãmbãtã',
-'january' => 'yinar',
-'february' => 'șcurtu',
-'march' => 'marțu',
-'april' => 'aprir',
-'may_long' => 'maiu',
-'june' => 'cirișar',
-'july' => 'alunar',
-'august' => 'avgustu',
-'september' => 'yizmăciun',
-'october' => 'xumedru',
-'november' => 'brumar',
-'december' => 'andreu',
+'january' => 'Yinar',
+'february' => 'Shcurtu',
+'march' => 'Martsu',
+'april' => 'Aprir',
+'may_long' => 'Mailu',
+'june' => 'Cirishar',
+'july' => 'Alunar',
+'august' => 'Avgustu',
+'september' => 'Yizmaciunjle',
+'october' => 'Xumedru',
+'november' => 'Brumar',
+'december' => 'Andreulu',
 'january-gen' => 'Yinar',
 'february-gen' => 'Shcurtu',
 'march-gen' => 'Martsu',
@@ -45,92 +44,58 @@ $messages = array(
 'october-gen' => 'Xumedru',
 'november-gen' => 'Brumar',
 'december-gen' => 'Andreulu',
-'jan' => 'yinar',
-'feb' => 'șcurtu',
-'mar' => 'marțu',
-'apr' => 'aprir',
-'may' => 'maiu',
-'jun' => 'cirișar',
-'jul' => 'alunar',
-'aug' => 'avgustu',
-'sep' => 'yizmăciun',
-'oct' => 'xumedru',
-'nov' => 'brumar',
-'dec' => 'andreu',
-
-# Categories related messages
-'pagecategories' => '{{PLURAL:$1|Categorie|Categorii}}',
-'category_header' => 'Frândzâ ti categoria "$1"',
-'hidden-categories' => '{{PLURAL:$1|Categorie ascumsâ|Categorii ascumsi}}',
 
 'article' => 'Articlu',
 'cancel' => 'Alasã',
 'mytalk' => 'Zburare-a mea',
-'navigation' => 'Navigație',
+'navigation' => 'Navigatsia',
 
 # Cologne Blue skin
 'qbedit' => 'Alãxiri',
 'qbspecialpages' => 'Frãndzã spetsiale',
 
-# Vector skin
-'vector-view-history' => 'Vedz istoric',
-'namespaces' => 'Spațiu di numi',
-'variants' => 'Variante',
-
-'tagline' => 'Ditu {{SITENAME}}',
 'help' => 'Agiutor',
-'search' => 'Câftare',
+'search' => 'Caftã',
 'searchbutton' => 'Caftã',
 'go' => 'Du-vã',
 'searcharticle' => 'Du-vã',
-'history_short' => 'Istoric',
+'history_short' => 'Istoria',
 'printableversion' => 'Verzia ti tipuseare',
-'permalink' => 'Legătură permanentă',
-'edit' => 'Alâxire',
+'permalink' => 'Ligãtura permanentã',
+'edit' => 'Alãxiri',
 'delete' => 'Ashcirdzire',
 'protect' => 'Apurã',
-'newpage' => 'Frândzâ nauă',
-'talkpagelinktext' => 'Zburari',
 'talk' => 'Discusiur',
-'views' => 'Videri',
 'toolbox' => 'Cutia di hãlate',
 'otherlanguages' => 'Pi alte limbe',
 'jumptonavigation' => 'Navigatsia',
-'jumptosearch' => 'Câftare',
+'jumptosearch' => 'Caftã',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Tu {{SITENAME}}',
 'currentevents' => 'Evenimente di tora',
 'disclaimers' => 'Nipricunuschire',
 'edithelp' => 'Agiutor ti alãxire',
-'helppage' => 'Help:Conținut',
-'mainpage' => 'Prota frândză',
+'mainpage' => 'Prota frãndzã',
 'mainpage-description' => 'Prota frãndzã',
-'portal' => 'Portal-a comunitatiľei',
-'portal-url' => 'Project:Portal-a comunitatiľei',
-'privacy' => 'Politică di confidențialitate',
+'portal' => 'Portal-a comunitatiljei',
 
 'newmessageslink' => 'dimãndare nao',
 'youhavenewmessagesmulti' => 'Avets nãi dimãndãri pi $1',
-'editsection' => 'alâxire',
-'editold' => 'Alâxiri',
-'viewsourceold' => 'videari izvor',
-'viewsourcelink' => 'videari izvor',
-'editsectionhint' => 'Alâxire parti: $1',
-'site-atom-feed' => '$1 Atom feed',
-'red-link-title' => '$1 (frândza nu easti)',
+'editsection' => 'Alãxiri',
+'editold' => 'Alãxiri',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Articlu',
 'nstab-user' => 'Frãndza-a ufilizitirolui',
-'nstab-special' => 'Frândzâ specială',
-'nstab-template' => 'Format',
-'nstab-category' => 'Categorie',
+'nstab-template' => 'Shablon',
 
 # General errors
 'viewsource' => 'Videts-u fãntãnã',
 
 # Login and logout pages
+'welcomecreation' => '== Ghine vinish, $1 ==
+
+Isape a vostrã ira adratã. Nu agãrshits s-le alãxits alidzerle-a vostre ti {{SITENAME}}.',
 'yourname' => 'Numa di ufilizitor:',
 'yourpassword' => 'Cljao:',
 'yourpasswordagain' => 'Bãgats-u cljao iara:',
@@ -152,19 +117,7 @@ $messages = array(
 'showdiff' => 'Spuni le-alãxirle',
 'loginreqlink' => 'Ligats-vã',
 
-# Diffs
-'lineno' => 'Linia $1:',
-'editundo' => 'arisire',
-
 # Search results
-'searchresults' => 'Rezultate di câftare',
-'searchresults-title' => 'Rezultate di câftare ti "$1"',
-'shown-title' => 'Vedz $1 {{PLURAL:$1|rezultat|rezultate}} pi frândză',
-'searchprofile-everything' => 'Tuti',
-'searchprofile-project-tooltip' => 'Câftare ti $1',
-'search-result-size' => '$1 ({{PLURAL:$2|1 zbor|$2 zboarâ}})',
-'search-section' => '(partea $1)',
-'searchall' => 'tuti',
 'powersearch' => 'Caftã',
 
 # Preferences page
@@ -176,15 +129,12 @@ $messages = array(
 'username' => 'Numa di ufilizitor:',
 
 # Recent changes
-'recentchanges' => 'Alâxiri',
-'diff' => 'dif',
-'hist' => 'ist',
-'show' => 'Vedz',
+'recentchanges' => 'Alãxiri',
 
 # Recent changes linked
 'recentchangeslinked' => 'Alãxiri ligate',
 'recentchangeslinked-feed' => 'Alãxiri ligate',
-'recentchangeslinked-toolbox' => 'Alâxiri ligate',
+'recentchangeslinked-toolbox' => 'Alãxiri ligate',
 
 # Upload
 'upload' => 'Pitritsets file',
@@ -193,17 +143,13 @@ $messages = array(
 'filedesc' => 'Rezime',
 'watchthisupload' => 'Mutrits-u frãndzã aistã',
 
-# File description page
-'file-anchor-link' => 'Fișier',
-
 # Random page
-'randompage' => 'Frândză di nipandică',
+'randompage' => 'Frãndzã di nipandicã',
 
 'brokenredirects-edit' => 'Alãxiri',
 'brokenredirects-delete' => 'Ashcirdzire',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|octet|octeți}}',
 'newpages-username' => 'Numa di ufilizitor:',
 'move' => 'Tradzets',
 'movethispage' => 'Tradzets-u frãndza aistã',
@@ -232,9 +178,6 @@ $messages = array(
 # Undelete
 'undelete-search-submit' => 'Caftã',
 
-# Namespace form on various pages
-'blanknamespace' => '(Prota)',
-
 # Contributions
 'contributions' => 'Ufilizitor:Contributsiur',
 'mycontris' => 'Contributsiile-a meale',
@@ -243,12 +186,10 @@ $messages = array(
 
 # What links here
 'whatlinkshere' => 'Tsi s-leadze cu aistu',
-'whatlinkshere-page' => 'Frândză:',
 
 # Block/unblock
 'ipbreason' => 'Itia:',
 'ipblocklist-submit' => 'Caftã',
-'contribslink' => 'contribuții',
 
 # Move page
 'move-page-legend' => 'Tradzets-u frãndzã',
@@ -264,11 +205,7 @@ $messages = array(
 # Tooltip help for the actions
 'tooltip-pt-preferences' => 'Alidzerle-a meale',
 'tooltip-pt-logout' => 'Disligats-vã',
-'tooltip-search' => 'Câftare tru {{SITENAME}}',
 'tooltip-p-logo' => 'Prota frãndzã',
-'tooltip-n-mainpage' => 'Vedz prota frândză',
-'tooltip-t-specialpages' => 'Unâ listâ di tuti frândzele',
-'tooltip-ca-nstab-category' => 'Vedz frândza di categorie',
 
 # Special:NewFiles
 'ilsubmit' => 'Caftã',
@@ -280,6 +217,6 @@ $messages = array(
 'table_pager_limit_submit' => 'Du-vã',
 
 # Special:SpecialPages
-'specialpages' => 'Frândzâ speciale',
+'specialpages' => 'Frãndzã spetsiale',
 
 );
diff --git a/languages/messages/MessagesSa.php b/languages/messages/MessagesSa.php
index 18dda21d..15635a1d 100644
--- a/languages/messages/MessagesSa.php
+++ b/languages/messages/MessagesSa.php
@@ -172,7 +172,7 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-	'redirect'                  => array( '0', '#पुनर्निदेशन', '#REDIRECT' ),
+	'redirect'                  => array( '0', '#पुनर्निदेशन', '#अनुप्रेषित', '#REDIRECT' ),
 	'notoc'                     => array( '0', '__नैवअनुक्रमणी__', '__NOTOC__' ),
 	'nogallery'                 => array( '0', '__नैवसंक्रमणका__', '__NOGALLERY__' ),
 	'forcetoc'                  => array( '0', '__अनुक्रमणीसचते__', '__FORCETOC__' ),
@@ -308,9 +308,6 @@ $messages = array(
 'tog-shownumberswatching' => 'निरीक्षमाणानां योजकानां संख्या दर्श्यताम्',
 'tog-oldsig' => 'विद्यमानं हस्ताङ्कनम्:',
 'tog-fancysig' => 'हस्ताक्षराणि विकिपाठवत् सन्तु (स्वचालित-संबंधनेभ्यः रहितानि)।',
-'tog-externaleditor' => 'Use external editor by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'अकथिते (बाइ डिफाल्ट् इति), बाह्य अंतरक्रमादेशं प्रयोजयतु (केवलेभ्यः निपुणेभ्यः, भवतः संगणके विशेषाः न्यासाः आवश्यकाः)।',
-'tog-showjumplinks' => '"इत्येतत् प्रति कूर्दयतु" इति संबंधनानि समर्थयतु।',
 'tog-uselivepreview' => 'संपादनेन सहैव प्राग्दृश्यं दर्शयतु (जावालिपिः अपेक्ष्यते) (प्रयोगात्मकम्)।',
 'tog-forceeditsummary' => 'सम्पादनसारांशः न ददामि चेत् तदा मां ज्ञापयतु।',
 'tog-watchlisthideown' => 'मम सम्पादनानि अवेक्षणसूच्याः गोप्यन्ताम्।',
@@ -323,6 +320,7 @@ $messages = array(
 'tog-diffonly' => 'आवृत्तिसु अंतरं दर्शयन् पुरातनाः आवृत्तयः मा दर्शयतु।',
 'tog-showhiddencats' => 'निगूढाः वर्गाः दर्श्यन्ताम्',
 'tog-norollbackdiff' => 'पूर्णप्रतिगमने कृते मा दर्शयतु तद् अंतरम्।',
+'tog-useeditwarning' => 'सम्पादनानन्तरं रक्षणेन विना पृष्ठत्यागावसरे स्मार्यताम्',
 
 'underline-always' => 'सर्वदा',
 'underline-never' => 'कदापि न',
@@ -509,7 +507,7 @@ $1',
 'pool-queuefull' => 'कुण्डपंक्तिः (पूल् क्यू इत्येषा) पूर्णा अस्ति।',
 'pool-errorunknown' => 'अज्ञाता त्रुटिः',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} इत्यस्य विषये',
 'aboutpage' => 'Project:एतद्विषयकम्',
 'copyright' => 'अस्य घटकानि $1 इत्यस्यान्तर्गतानि उपलब्धानि।',
@@ -519,7 +517,6 @@ $1',
 'disclaimers' => 'प्रत्याख्यानम्',
 'disclaimerpage' => 'Project:साधारणं प्रत्याख्यानम्',
 'edithelp' => 'सम्पादनार्थं सहाय्यम्',
-'edithelppage' => 'Help:सम्पादनम्',
 'helppage' => 'Help:आन्तर्यम्',
 'mainpage' => 'मुख्यपृष्ठम्',
 'mainpage-description' => 'मुख्यपृष्ठम्',
@@ -596,17 +593,6 @@ $1',
 # General errors
 'error' => 'दोषः',
 'databaseerror' => 'दत्ताधारे दोषः',
-'dberrortext' => 'समंकाधार पृच्छायां वाक्यरचनात्रुटिरेका अभवत्।
-अनेन अस्माकं तन्त्रांशे त्रुटिरपि निर्दिष्टा स्यात्।
-अन्तिमा चेष्टिता समंकाधार-पृच्छा आसीत्:
-<blockquote><code>$1</code></blockquote>
- "<code>$2</code>" इत्यस्मात् फलनात्।
-समंकाधारे त्रुटिरासीत्:  "<samp>$3: $4</samp>" इति।',
-'dberrortextcl' => 'समंकाधार पृच्छायां वाक्यरचना त्रुटिरेका अभवत्।
-अन्तिमा चेष्टिता समंकाधार पृच्छा आसीत् : 
-"$1"
-"$2" इति फलनात्।
-समंकाधारे "$3:$4" इति त्रुटिर्जाता।',
 'laggedslavemode' => 'प्राक्प्रबोधनम्:अस्मिन् पृष्ठे सद्योजातानि परिशोधनानि न स्युः ।',
 'readonly' => 'दत्तधारः कीलितः',
 'enterlockreason' => 'तन्त्रितीकरणस्य कारणं ददातु, अपि च आकलितं ददातु यत् तन्त्रणं कदा उद्घाट्यिष्यते।',
@@ -655,7 +641,6 @@ $1',
 'viewyourtext' => "भवान् अस्य पृष्ठस्य स्रोतसि '''भवतः सम्पादनानि''' द्रष्टुं प्रतिलिपिं कर्तुं च अर्हति ।",
 'protectedinterface' => 'इदं पृष्ठं तंत्रांशाय अन्तराफलकं ददाति, तथा च दुरुपयोगात् वारणाय सुरक्षितमस्ति ।',
 'editinginterface' => "'''अवधीयताम्'''  तन्त्रांशस्य विन्यासं यत् पृष्ठं रचयति तद् भवान् अधुना सम्पादयति । अत्र कृतानि परिवर्तनानि अन्येषाम् उपयोक्तॄणां पृष्ठविन्यासमपि परिवर्तयन्ति ।  अनुवादार्थम्   [//translatewiki.net/wiki/Main_Page?setlang=sa translatewiki.net] स्थानीयतानयनपरियोजनायाः उपयोगः क्रियताम्  ।",
-'sqlhidden' => '(निगूढा एसक्यूएल्- पृच्छा)',
 'cascadeprotected' => 'इदं पृष्ठं संपादनात् सुरक्षितमस्ति, यतः इदं अधोलिखितानां {{PLURAL:$1| पृष्ठस्य|पृष्ठाणां}} सुरक्षा-सोपाने समाहितं वर्तते।
 $2',
 'namespaceprotected' => 'भवान् "$1" इति नामाकाशे विद्यमानान् पृष्ठान् परिवर्तितुं अनुमतिं न धारयति।',
@@ -684,10 +669,15 @@ $2',
 'welcomecreation-msg' => 'भवतः लेखा रचिताऽस्ति।
 स्वकीयानां [[Special:Preferences|{{SITENAME}} इष्टतमानां]]. निगदनं मा विस्मर्यताम्।',
 'yourname' => 'योजकनामन्:',
+'userlogin-yourname' => 'प्रयोक्तुः नाम',
+'userlogin-yourname-ph' => 'स्वकीयं प्रयोक्तृनाम दीयताम्',
 'yourpassword' => 'कूटशब्दः',
+'userlogin-yourpassword-ph' => 'स्वकीयं कूटशब्दं दीयताम्',
+'createacct-yourpassword-ph' => 'कूटशब्दः प्रविश्यताम्',
 'yourpasswordagain' => 'कूटशब्दः पुनः लिख्यताम् ।',
+'createacct-yourpasswordagain-ph' => 'कूटशब्दः पुनः प्रविश्यताम्',
 'remembermypassword' => 'अस्मिन् सङ्गणके मम प्रवेशः स्मर्यताम् (अधिकतमम् $1 {{PLURAL:$1|दिनम्|दिनानि}})',
-'securelogin-stick-https' => 'प्रवेशोपरान्तं एचटीटीपीएस(HTTPS) इत्यनेन सह संबद्धः तिष्ठतु।',
+'userlogin-remembermypassword' => 'अहं प्रविष्टमेव तिष्ठेयम्',
 'yourdomainname' => 'भवतः प्रक्षेत्रम्:',
 'password-change-forbidden' => 'अस्यां विक्यां निकुञ्चं परिवर्तयितुं न शक्नोति ।',
 'externaldberror' => 'तत्र प्रमाणीकरण समंकाधारे त्रुटिर्जाता, अथवा भवान् स्वकीयां बाह्य-लेखां अद्यतनीकर्तुं अनुमतिं न धारयति।',
@@ -699,14 +689,19 @@ $2',
 'logout' => 'निर्गमनम्',
 'userlogout' => 'निर्गमनम्',
 'notloggedin' => 'नैव प्रविष्टः',
+'userlogin-noaccount' => 'सदस्यता नास्ति किम्?',
 'nologin' => 'पूर्वमेव योजकः नास्ति किम् ? $1।',
 'nologinlink' => 'सदस्यता प्राप्यताम्',
 'createaccount' => 'सदस्यता प्राप्यताम्',
 'gotaccount' => 'पूर्वमेव योजकः अस्ति किम् ? $1।',
 'gotaccountlink' => 'प्रविश्यताम्',
 'userlogin-resetlink' => 'प्रवेशविवरणानि विस्मृतानि किम् ?',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|प्रवेशनार्थं सहायता]]',
+'createacct-join' => 'स्वकीया सूचना अधस्तात् प्रवेश्यताम्।',
 'createaccountmail' => 'ईपत्रद्वारा',
 'createaccountreason' => 'कारणम्',
+'createacct-reason' => 'कारणम्',
+'createacct-reason-ph' => 'भवान् अन्यां लेखां किमर्थं रचितुमिच्छसि?',
 'badretype' => 'भवता प्रदत्ते कूटशब्दे न खलु समाने स्तः। कृपया पुनः लिखतु।',
 'userexists' => 'भवतः प्रदत्तः प्रयोक्तृनाम अन्येन प्रयुज्यमानम् अस्ति। कृपया अन्यदेकं प्रयोक्तृनाम चिनोतु।',
 'loginerror' => 'प्रवेशने प्रमादः',
@@ -798,7 +793,7 @@ You may ignore this message, if this account was created in error.',
 'newpassword' => 'नूतनः कूटशब्दः',
 'retypenew' => 'नूतनः कूटशब्दः पुनः लिख्यताम्:',
 'resetpass_submit' => 'कूटशब्दः योज्यतां प्रविश्यतां च',
-'resetpass_success' => 'भवतः कूटशब्दः सफलतया परिवर्तितः!
+'changepassword-success' => 'भवतः कूटशब्दः सफलतया परिवर्तितः!
 अधुना भवान् प्रवेश्यते ...',
 'resetpass_forbidden' => 'कूटशब्दाः परिवर्तयितुं न शक्यन्ते',
 'resetpass-no-info' => 'भवता एतत्पृष्ठं प्रत्यक्षतया सम्प्राप्तुं प्रवेशः अवश्यमेव कर्त्तव्यः।',
@@ -810,10 +805,8 @@ You may ignore this message, if this account was created in error.',
 
 # Special:PasswordReset
 'passwordreset' => 'कूटशब्द पुनःस्थापनम्',
-'passwordreset-text' => 'भवतः सदस्यताविवरणानि ईपत्रद्वारा प्राप्तुम् इदं प्रपत्रं पूर्यताम् ।',
 'passwordreset-legend' => 'कूटशब्द पुनःस्थापनम्',
 'passwordreset-disabled' => 'अस्मिन् विक्यां कूटशब्द पुनःस्थापनं असमर्थीकृतमस्ति।',
-'passwordreset-pretext' => '{{PLURAL:$1| |समंकेषु एकम् अधस्यात् प्रविष्टीकरोतु।}}',
 'passwordreset-username' => 'योजकनामन्:',
 'passwordreset-domain' => 'क्षेत्रम्:',
 'passwordreset-capture' => 'फलितरूपम् ईपत्रं किं दृश्यते ?',
@@ -1039,6 +1032,8 @@ $2
 'defaultmessagetext' => 'सन्देशपाठं स्थिरयतु ।',
 'invalid-content-data' => 'अमान्यः सामग्रीदत्तांशः',
 'content-not-allowed-here' => '[[$2]] इति पृष्ठे "$1" सामग्री अनुमता नास्ति।',
+'editwarning-warning' => 'अस्मात् पृष्ठात् गमनेन अत्र भवता कृतानि परिवर्तनानि निष्फलानि भवेयुः ।
+भवता यदि प्रविष्टं तर्हि मम इष्टतमानि इत्यत्र अस्मिन् विभागे सम्पादनेन एषः प्रबोधः यथा न आगच्छेत् तथा कर्तुं शक्यते ।',
 
 # Content models
 'content-model-wikitext' => 'विकिपाठः',
@@ -1260,7 +1255,6 @@ You can still [$1 view this revision]",
 'searchmenu-legend' => 'अन्वेषणस्य विकल्पाः ।',
 'searchmenu-exists' => 'अस्मिन् विकिमध्ये "[[:$1]]"नामकं पृष्ठं विद्यते।',
 'searchmenu-new' => "'''अस्यां विक्यां \"[[:\$1]]\" इति पृष्ठं सृज्यताम्!'''",
-'searchhelp-url' => 'Help: साहाय्यम् : आधेयाः ।',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|एतदुपसर्गयुक्तपुटं पश्यतु ]]',
 'searchprofile-articles' => 'आन्तर्यम्',
 'searchprofile-project' => 'सहायता प्रकल्पपृष्ठानि च',
@@ -1306,15 +1300,6 @@ You can still [$1 view this revision]",
 अश्मिन् समये भवान् गूगल माध्यमेन अन्वेषणं कर्तुं शक्नोति
 स्मरयतु यत् {{SITENAME}} इति स्थलस्य क्रमाङ्का नैव अद्यातना  इति सोच्यते।',
 
-# Quickbar
-'qbsettings' => 'शीघ्रपट',
-'qbsettings-none' => 'नास्ति',
-'qbsettings-fixedleft' => 'बामे स्थापितः',
-'qbsettings-fixedright' => 'दक्षिणे स्थापितः',
-'qbsettings-floatingleft' => 'वामप्लवनम् ।',
-'qbsettings-floatingright' => 'दक्षिणे प्लवनम् ।',
-'qbsettings-directionality' => 'निश्चितम् । ते भाषालिप्याः दिशात्मकतानुसारं भवति ।',
-
 # Preferences page
 'preferences' => 'इष्टतमानि',
 'mypreferences' => 'मम इष्टतमानि',
@@ -1347,7 +1332,6 @@ You can still [$1 view this revision]",
 'resetprefs' => 'असंरक्षितानि परिवर्तनानि विलुप्यन्ताम्',
 'restoreprefs' => 'समग्राः व्यवस्थादय व्यवस्थानुसारं पुनः संरक्ष्यताम्',
 'prefs-editing' => 'सम्पादनम्',
-'prefs-edit-boxsize' => 'सम्पादनकोष्ठस्य आकारः ।',
 'rows' => 'पंक्ति',
 'columns' => 'अध: पंक्त्याः',
 'searchresultshead' => 'अन्वेषणम्',
@@ -1358,7 +1342,6 @@ You can still [$1 view this revision]",
 'recentchangesdays-max' => 'अधिकतम $1 {{PLURAL:$1|दिवसः|दिवसानि}}',
 'recentchangescount' => 'सम्पादन संख्यकानि व्यवस्थानुसारेण दृश्यतु:',
 'prefs-help-recentchangescount' => 'अत्र सद्यः परिवर्तनानि, पुटेतिहासाः, प्रवेशाः च अन्तर्गताः ।',
-'prefs-help-watchlist-token' => 'अत्र रहस्यकुञ्चिकया पूरणेन भवतः नीरीक्षावल्यां RSS पूरितं भवति । रहस्यकुञ्चिकां यः जानाति तेन भवतः निरीक्षावली दृष्टुं शक्यते । अतः कृपया सुरक्षमौल्यं चिनोतु । अत्र यादृच्छया निर्मितं मौल्यं भवान्  $1 द्वारा पश्यति ।',
 'savedprefs' => 'आद्यताः संरक्षिताः ।',
 'timezonelegend' => 'समय मण्डल:',
 'localtime' => 'स्थानीय समय:',
@@ -1388,7 +1371,6 @@ You can still [$1 view this revision]",
 'prefs-common-css-js' => 'सर्वावरणानां कृते विभक्त सि.एस्.एस्./ जावालिपिः ।',
 'prefs-reset-intro' => 'आद्यतानां पुनर्निदेशार्थम् एतत्पुटम् उपयोक्तुं शकोति । एतत् अकृतं न भवति ।',
 'prefs-emailconfirm-label' => 'विद्युन्मानसङ्केतस्य दृढीकरणम् ।',
-'prefs-textboxsize' => 'सम्पादनकोष्ठस्य आकारः ।',
 'youremail' => 'ईपत्रसङ्केतः',
 'username' => 'योजकनामन्:',
 'uid' => 'प्रयोक्तृ-क्रमांकः :',
@@ -1629,7 +1611,6 @@ You can still [$1 view this revision]",
 'recentchangeslinked-feed' => 'पृष्ठ-सम्बन्धितानि परिवर्तनानि',
 'recentchangeslinked-toolbox' => 'पृष्ठसम्बद्धानि परिवर्तनानि',
 'recentchangeslinked-title' => '"$1" इत्यस्मिन् जातानि परिवर्तनानि',
-'recentchangeslinked-noresult' => 'निर्दिष्टे अवधौ सम्बद्धे पृष्ठे कोपि परिवर्तनं न जातम् ।',
 'recentchangeslinked-summary' => "एषा विशेषपृष्ठसम्बद्धेषु पॄष्ठेषु अथवा वर्गविशेषे अन्तर्भूतेषु पृष्ठेषु सद्योजातानां परिवर्तनानाम् आवलिः।
 
 [[Special:Watchlist|भवतः अवेक्षणसूच्यां]] विद्यमानानि पृष्ठानि '''स्थूलाक्षरैः''' दर्शितानि।",
@@ -1856,7 +1837,6 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'http-read-error' => 'HTTP पठनदोषः।',
 'http-timed-out' => 'HTTP अभ्यर्थनं कालातीतम् ।',
 'http-curl-error' => 'दोषाहरणस्य URL: $1',
-'http-host-unreachable' => 'URL प्राप्तुं न शक्यते ।',
 'http-bad-status' => 'HTTP : $1 $2अभ्यर्थने समस्या आसीत् ।',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2009,12 +1989,6 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'statistics-users-active-desc' => 'गतेषु {{PLURAL:$1|day|$1 दिनेषु}} सक्रियाः योजकाः  ।',
 'statistics-mostpopular' => 'अत्यवलोकितपुटानि ।',
 
-'disambiguations' => 'द्वैधीभावरहितपुटानाम् अनुबन्धितपुटानि ।',
-'disambiguationspage' => 'Template:असन्दिग्धम्',
-'disambiguations-text' => 'अधो निदेशितपुटानि असन्धिग्धपुटेन अनुबन्धितानि । 
-एतानि यथार्थविषैः योजनीयानि । <br />
-यदि कोऽपि पुटेन प्रकृतिं प्रयोजयति यः  [[MediaWiki:Disambiguationspage]] इत्यनेन अनुबद्धः  ससन्दिग्धपुटम् इति उच्यते ।',
-
 'pageswithprop' => 'प्रगुणविशेषयुतानि पृष्ठानि',
 'pageswithprop-legend' => 'प्रगुणविशेषयुतानि पृष्ठानि',
 
@@ -2264,10 +2238,9 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'unwatchthispage' => 'अवलोकनेन अलम् ।',
 'notanarticle' => 'न आधेयं पुटम् ।',
 'notvisiblerev' => 'अन्ययोजकेन कृतम् अवतरणम् अपमर्जितम् ।',
-'watchnochange' => 'दर्शितावधौ अवलोकितपदार्थाः न सम्पादिताः ।',
 'watchlist-details' => '{{PLURAL:$1|$1 पृष्ठं|$1 पृष्ठानि}} भवतः अवेक्षणसूच्यां सन्ति, सम्भाषणपृष्ठानि नात्र गणितानि।',
-'wlheader-enotif' => '* विद्युन्मानपत्रस्य सूचनाः सक्रियाः ।',
-'wlheader-showupdated' => '* भवतः सन्दर्शनस्य पश्चात् परिवर्तितानि पुटानि स्थूलाक्षरैः निर्दिष्टानि ।',
+'wlheader-enotif' => 'विद्युन्मानपत्रस्य सूचनाः सक्रियाः ।',
+'wlheader-showupdated' => 'भवतः सन्दर्शनस्य पश्चात् परिवर्तितानि पुटानि स्थूलाक्षरैः निर्दिष्टानि ।',
 'watchmethod-recent' => 'अवलोकितपुटानां सद्यः सम्पादनस्य परीक्षणम् ।',
 'watchmethod-list' => 'सद्यः सम्पादनार्थम् अवलोकितपुटानां परीक्षणम् ।',
 'watchlistcontains' => 'भवतः अवलोकनावली $1 युक्तास्ति ।{{PLURAL:$1|page|pages}}.',
@@ -2666,12 +2639,9 @@ $1 इत्यस्य अवरोधस्य कारणं तु "$2" 
 $2 इति प्रकारस्य अवरोधं कर्तुं शक्यते यत् अनवरोधमिच्छति ।',
 'ip_range_invalid' => 'अमान्यः ऐपिप्रकारः',
 'ip_range_toolarge' => '/$1 तः अधिकं वृहत्प्रकारकः अवरोधः नानुमतः ।',
-'blockme' => 'माम् अवरुणद्धु ।',
 'proxyblocker' => 'प्रतिहस्तकः अवरोधकः ।',
-'proxyblocker-disabled' => 'अयं कार्यकलापः निष्क्रियः ।',
 'proxyblockreason' => 'भवतः ऐपि सङ्केतः अवरुद्धः  यतः अयं कश्चन मुक्तप्रतिहस्तकः । 
 अन्तर्जालसेवादायकं सम्पर्कयतु गभीरायाः सुरक्षासमस्यायाः विषये सूचयतु च',
-'proxyblocksuccess' => 'समापित ।',
 'sorbsreason' => 'DNSBL उपयोगः {{SITENAME}} कृतस्य भवतः ऐपिसङ्केतः मुक्तप्रतिहस्तकः इति आवलीगतः',
 'sorbs_create_account_reason' => 'DNSBL उपयुक्तः {{SITENAME}} अतः भवतः ऐपिसङ्केतः अवरुद्धः यतः अयं मुक्तप्रतिहस्तकः इति आवलीगतः । अतः भवान् योजकस्थानं निर्मातुं न शक्नोति ।',
 'cant-block-while-blocked' => 'अन्ययोजकान् अवरोद्धुं भवान् नैव शक्नोति यतः भवान् अवरुद्धः ।',
@@ -3050,12 +3020,8 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'pageinfo-category-files' => 'सञ्चिकानां सङ्ख्या',
 
 # Skin names
-'skinname-standard' => 'पूर्व',
-'skinname-nostalgia' => 'पुराण',
 'skinname-cologneblue' => 'नील',
 'skinname-monobook' => 'पुस्तक',
-'skinname-myskin' => 'मे चर्मन्',
-'skinname-chick' => 'Chick',
 
 # Patrolling
 'markaspatrolleddiff' => 'आरक्षितमिति अङ्कयतु ।',
@@ -3164,7 +3130,7 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'विस्तारः',
 'exif-imagelength' => 'औन्नत्यम्',
 'exif-bitspersample' => 'प्रत्येकं भागस्य अंशः ।',
@@ -3342,7 +3308,7 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'exif-originalimageheight' => 'कर्तनात्पूरव चित्रस्य औन्नत्यम् ।',
 'exif-originalimagewidth' => 'कर्तनात् पूर्वं चित्रस्य व्यासः ।',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'असङ्कोचितम् ।',
 'exif-compression-2' => 'CCITT समूहः 3 1- Dimensional Modified Huffman run length encoding',
 'exif-compression-3' => 'CCITT समूह ३ फेक्स  सङ्केतीकरणम् ।',
@@ -3726,7 +3692,6 @@ $5
 'version-other' => 'अन्यत्',
 'version-mediahandlers' => 'माध्यनिर्वाहकाः ।',
 'version-hooks' => 'आलम्बाः ।',
-'version-extension-functions' => 'विस्तरणस्य कार्यकलापाः ।',
 'version-parser-extensiontags' => 'विन्यासविस्तारणस्य सूत्रम् ।',
 'version-parser-function-hooks' => 'विन्यासकलापस्य आलम्बाः ।',
 'version-hook-name' => 'आलम्बस्य नाम ।',
@@ -3748,13 +3713,6 @@ $5
 'version-entrypoints-header-entrypoint' => 'प्रवेशबिन्दुः ।',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'सञ्चिकापथः ।',
-'filepath-page' => 'सञ्चिका:',
-'filepath-submit' => 'गम्यताम्',
-'filepath-summary' => 'एतद्विशेषपुटं सञ्चिकायाः पूर्णपथं प्रदर्शयति । 
-चित्राणि परिपूर्णसत्वयुतानि दर्शितानि । अन्यसञ्चिकाभेदाः सम्बद्धकार्यकलापैः प्रत्यक्षं आरब्धाः ।',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'प्रतिकृतिसञ्चिकार्थम् अन्विषतु ।',
 'fileduplicatesearch-summary' => 'सम्मिश्रमौल्यामूलयुतर्थं  प्रतिकृतिसञ्चिकार्थम् अन्विषतु ।',
diff --git a/languages/messages/MessagesSah.php b/languages/messages/MessagesSah.php
index 5697cda0..ebc7d1c2 100644
--- a/languages/messages/MessagesSah.php
+++ b/languages/messages/MessagesSah.php
@@ -13,6 +13,7 @@
  * @author HalanTul
  * @author Kaganer
  * @author Meno25
+ * @author Nemo bis
  * @author Urhixidur
  */
 
@@ -73,9 +74,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Сирэйи кэтээн көрөр дьон ахсаанын көрдөр',
 'tog-oldsig' => 'Баар илии баттааһын:',
 'tog-fancysig' => 'Бэйэ илии баттааһына (ыйынньыга суох)',
-'tog-externaleditor' => 'Атын этиллибэтэҕинэ тас эрэдээктэри туһан (билэр дьоҥҥо аналлаах, сиһилии [//www.mediawiki.org/wiki/Manual:External_editors манна] көр)',
-'tog-externaldiff' => 'Атын этиллибэтэҕинэ барыллары тэҥниир тас программаны туһан (билэр дьоҥҥо аналлаах, сиһилии [//www.mediawiki.org/wiki/Manual:External_editors манна] көр)',
-'tog-showjumplinks' => '"Манна бар" ыйынньыктары көрдөр',
 'tog-uselivepreview' => 'Хайдах буолуохтааҕын тутатына эрдэ көрүү (тургутуу быһыытынан)',
 'tog-forceeditsummary' => 'Тугу уларыппытым туһунан суруйбатахпына сэрэт',
 'tog-watchlisthideown' => 'Кэтээн көрүү испииһэгэр бэйэм уларытыыларбын көрдөрүмэ',
@@ -88,6 +86,8 @@ $messages = array(
 'tog-diffonly' => 'Икки барылы тэҥнииргэ сирэй иһин көрдөрүмэ',
 'tog-showhiddencats' => 'Кистэммит категориялары көрдөр',
 'tog-norollbackdiff' => 'Төннөрүү кэнниттэн барыллар уратыларын көрдөрүмэ',
+'tog-useeditwarning' => 'Эрэдээксийэлиир сирэйтэн уларытыыларбын бигэргэппэккэ тахсаары гыннахпына сэрэтээр',
+'tog-prefershttps' => 'Манна киирэргэ куруук көмүскэллээх холбонууну туттарга',
 
 'underline-always' => 'Куруук',
 'underline-never' => 'Аннынан тардыма',
@@ -151,6 +151,18 @@ $messages = array(
 'oct' => 'Алт',
 'nov' => 'Сэт',
 'dec' => 'Ахс',
+'january-date' => 'Тохсунньу $1',
+'february-date' => 'Олунньу $1',
+'march-date' => 'Кулун тутар $1',
+'april-date' => 'Муус устар $1',
+'may-date' => 'Ыам ыйын $1',
+'june-date' => 'Бэс ыйын $1',
+'july-date' => 'От ыйын $1',
+'august-date' => 'Атырдьах ыйын $1',
+'september-date' => 'Балаҕан ыйын $1',
+'october-date' => 'Алтынньы $1',
+'november-date' => 'Сэтинньи $1',
+'december-date' => 'Ахсынньы $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категория|Категориялар}}',
@@ -232,6 +244,7 @@ $messages = array(
 'create-this-page' => 'Бу сирэйи ай',
 'delete' => 'Соттор',
 'deletethispage' => 'Бу сирэйи соттор',
+'undeletethispage' => 'Бу сирэйи сөргүт (төннөр)',
 'undelete_short' => 'Төттөрү аҕал {{PLURAL:$1|биир уларытыыны|$1 уларытыылары}}',
 'viewdeleted_short' => '{{PLURAL:$1|Соҕотох сотторуллубут көннөрүүнү|$1 сотторуллубут көннөрүүнү}} көрүү',
 'protect' => 'Уларыппат гын',
@@ -275,7 +288,7 @@ $1',
 'pool-queuefull' => 'Көрдөбүллэри хомуйуу туолбут',
 'pool-errorunknown' => 'Биллибэт алҕас',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} туһунан',
 'aboutpage' => 'Project:туһунан',
 'copyright' => 'Маны туһанары $1 көҥүллүүр.',
@@ -285,7 +298,6 @@ $1',
 'disclaimers' => 'Бүк охсунуу',
 'disclaimerpage' => 'Project:Бүк охсунуу',
 'edithelp' => 'Уларытааччыларга көмө',
-'edithelppage' => 'Help:Уларытарга көмө',
 'helppage' => 'Help:Көмө',
 'mainpage' => 'Сүрүн сирэй',
 'mainpage-description' => 'Сүрүн сирэй',
@@ -360,17 +372,11 @@ $1',
 # General errors
 'error' => 'Алҕас',
 'databaseerror' => 'Билии олоҕор сыыһа',
-'dberrortext' => 'Билии олоҕор ыйытык синтаксииһа сыыһалаах эбит.
-Ол бырагырааммаҕар баар сыыһаттан буолуон сөп.
-Билии олоҕор бүтэһик ыйытык маннык:
-: <code>$1</code>
-(бу пуунсуйаттан тахсыбыт «<code>$2</code>»).
-Билии олоҕо сыыһаны көрдөрдө «<code>$3: $4</code>».',
-'dberrortextcl' => 'Билии олоҕор ыйытык синтаксииһын сыыһата таҕыста.
-Билии олоҕор бүтэһик ыйытык:
-"$1"
-"$2" пуунсуйаттан тахсыбыт.
-Билии олоҕо маннык сыыһаны көрдөрдө "$3: $4"',
+'databaseerror-text' => 'Билии олоҕор алҕас таҕыста.
+Бырагыраамма алҕаһа буолуон сөп.',
+'databaseerror-textcl' => 'Билии олоҕор алҕас таҕыста.',
+'databaseerror-query' => 'Ыйытык: $1',
+'databaseerror-error' => 'Алҕас: $1',
 'laggedslavemode' => 'Болҕой: Бу сирэй бүтэһик уларытыылара суох буолуон сөп',
 'readonly' => 'Билии олоҕун уларытар бобуллубут',
 'enterlockreason' => 'Уларытыыны бобуу төрүөтүн уонна төһө өр бобулларын ый.',
@@ -423,12 +429,15 @@ $1',
 'editinginterface' => "'''Болҕой:''' Быраҕыраамма тас көстүүтүн (интерфейсын) хааччыйар тиэкиһи уларытаары гынан эрэҕин.
 Бу сирэйи уларыттаххына атын кыттааччылар көрөллөрүгэр бырагыраамма көстүүтэ уларыйыа. 
 Тылбааһын уларытыаххын эбэтэр эбиэххин баҕарар буоллаххына Медиавики бырайыактарын тылбаастыыр сиргэ киир [//translatewiki.net/ translatewiki.net].",
-'sqlhidden' => '(SQL ыйытык кистэммит)',
 'cascadeprotected' => 'Бу сирэй уларыйар кыаҕа суох, тоҕо диэтэххэ уларыйара бобуллубут (каскаднай көмүскэл холбоммут) {{PLURAL:$1|сирэй бөлөҕөр|сирэйдэр бөлөхтөрүгэр}} киирэр:
 $2',
 'namespaceprotected' => "Эн '''$1''' аат эйгэтигэр киирэр сирэйдэри уларытар кыаҕыҥ суох.",
 'customcssprotected' => 'Эн бу CSS-сирэйи уларытар кыаҕыҥ суох, тоҕо диэтэххэ онтуҥ атын киһи тус бэйэтин туруорууларын таарыйар.',
 'customjsprotected' => 'Эн бу JavaScript-сирэйи уларытар кыаҕыҥ суох, тоҕо диэтэххэ онтуҥ атын киһи тус бэйэтин туруорууларын таарыйар.',
+'mycustomcssprotected' => 'CSS-сирэйи уларытар кыаҕыҥ суох эбит.',
+'mycustomjsprotected' => 'Сирэйгэ JavaScript уларытар кыаҕыҥ суох эбит.',
+'myprivateinfoprotected' => 'Бэйэҥ тускунан информацияны уларытар кыаҕыҥ суох эбит.',
+'mypreferencesprotected' => 'Бэйэҥ туруорууларгын уларытар кыаҕыҥ суох эбит.',
 'ns-specialprotected' => '{{ns:special}} ааттаах сирэйдэр уларытыллыбаттар.',
 'titleprotected' => "Бу бас тыл оҥоһулларын [[User:$1|$1]] боппут.
 Төрүөтэ - ''$2''",
@@ -453,10 +462,19 @@ $2',
 'welcomecreation-msg' => 'Аатыҥ бэлиэтэннэ.
 {{SITENAME}} ситим-сиргэ үлэлииргэ табыгастаах буоллун диэн [[Special:Preferences|тус туруорууларгын]] уларытыаххын сөп.',
 'yourname' => 'Кыттааччы аатыҥ:',
+'userlogin-yourname' => 'Бэлиэ-аат',
+'userlogin-yourname-ph' => 'Бэлиэ-ааккын киллэр',
+'createacct-another-username-ph' => 'Ааккын суруй',
 'yourpassword' => 'Киирии тыла:',
+'userlogin-yourpassword' => 'Киирии тыл',
+'userlogin-yourpassword-ph' => 'Киирии тылгын суруй',
+'createacct-yourpassword-ph' => 'Киирии тылгын суруй',
 'yourpasswordagain' => 'Киирии тылгын хатылаа:',
+'createacct-yourpasswordagain' => 'Киирии тылгын бигэргэт',
+'createacct-yourpasswordagain-ph' => 'Киирии тылгын хатылаа',
 'remembermypassword' => 'Миигин бу көмпүүтэргэ сигээ ($1 {{PLURAL:$1|күн|күнтэн ордуга суох}})',
-'securelogin-stick-https' => 'Киирэн баран HTTPS нөҥүө холбонууну салгыырга',
+'userlogin-remembermypassword' => 'Тиһиликтэн тахсыма',
+'userlogin-signwithsecure' => 'Бигэ холбонуу',
 'yourdomainname' => 'Эн дөмүөнүҥ:',
 'password-change-forbidden' => 'Бу биикигэ киирии тылы уоарытар табыллыбат.',
 'externaldberror' => 'Тас киирии билиитин олоҕун сыыһата буолла, эбэтэр тас киирии билииҥ олоҕун саҥардар кыаҕыҥ суох.',
@@ -468,18 +486,41 @@ $2',
 'logout' => 'Тахсыы',
 'userlogout' => 'Тахсыы',
 'notloggedin' => 'Ааккын эппэтиҥ',
+'userlogin-noaccount' => 'Бэлиэтэнэ иликкин дуо?',
+'userlogin-joinproject' => '{{SITENAME}} ситим-сиргэ киирии',
 'nologin' => "Бэлиэтэнэ иликкин дуо? '''$1'''.",
 'nologinlink' => 'Бэлиэтэнии',
 'createaccount' => 'Бэлиэтэнии',
 'gotaccount' => "Бэлиэтэммитиҥ дуо? '''$1'''.",
 'gotaccountlink' => 'Аатыҥ',
 'userlogin-resetlink' => 'Киирэр тылгын умнубуккун дуо?',
+'userlogin-resetpassword-link' => 'Киирии тылы уларытыы',
+'helplogin-url' => 'Help:Бэлиэ-ааты киллэрии',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Бэлиэтэниигэ көмө]]',
+'createacct-join' => 'Аллара суруй.',
+'createacct-another-join' => 'Саҥа бэлиэ-аат туһунан аллара суруй.',
+'createacct-emailrequired' => 'Email аадырыс',
+'createacct-emailoptional' => 'Email аадырыс (булгуччута суох)',
+'createacct-email-ph' => 'Эл аадырыскын суруй',
+'createacct-another-email-ph' => 'Эл. почтаҕын киллэр',
 'createaccountmail' => 'Быстах киирии тылы туһаныы уонна ону ыйыллыбыт аадырыска ыытыы',
+'createacct-realname' => 'Дьиҥнээх аатыҥ (булгуччута суох)',
 'createaccountreason' => 'Төрүөтэ:',
+'createacct-reason' => 'Төрүөтэ',
+'createacct-reason-ph' => 'Саҥа аатынан тоҕо киирэҕиний',
+'createacct-captcha' => 'Куттал суох буолуутун тургутуу',
+'createacct-imgcaptcha-ph' => 'Үөһэ көстөрү хатылаа',
+'createacct-submit' => 'Бэлиэтэнии',
+'createacct-another-submit' => 'Атын аатынан бэлиэтэн',
+'createacct-benefit-heading' => '{{SITENAME}} ситим-сири эн курдук дьон оҥороллор.',
+'createacct-benefit-body1' => '{{PLURAL:$1|уларытыы|уларытыы}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|сирэй|сирэй}}',
+'createacct-benefit-body3' => 'кэнники {{PLURAL:$1|кыттааччы|кыттааччы}}',
 'badretype' => 'Киирии тылларыҥ сөп түбэспэтилэр.',
 'userexists' => 'Суруйбут аатыҥ бэлиэр баар.
 Бука диэн, атын аатта тал.',
 'loginerror' => 'Ааккын система билбэтэ',
+'createacct-error' => 'Бэлиэтэнии кэмигэр алҕас таҕыста',
 'createaccounterror' => 'Саҥа аат бэлиэтиир кыах суох: $1',
 'nocookiesnew' => 'Маннык ааттаах кыттааччы баар буолла гынан баран, систиэмэҕэ киирэ илик. {{SITENAME}} «cookies» туттар, оттон эн көмпүүтэргэр ону туһанар бобуллубут. Бука диэн «cookies» холбоо, онтон өссө киирэн көр.',
 'nocookieslogin' => '{{SITENAME}} дьону билэргэ «cookies» туттар. Эн көмпүүтэргэр «cookies» бобуллубут. Ону холбоон баран өссө киирэн көр.',
@@ -539,11 +580,13 @@ $2',
 
 Саҥа аат сыыһа оҥоһуллубут буоллаҕына тугу да гыныа суоххун сөп.',
 'usernamehasherror' => 'Аакка эрэһиэккэ бэлиэтин туттар сатаммат',
-'login-throttled' => 'Наһаа элбэхтик бэйэҥ ааккын билиһиннэрэ сатаатыҥ.
-Бука диэн кыратык тохтуу түһэн баран өссө боруобалаа.',
+'login-throttled' => 'Ааккын аһара элбэхтик билиһиннэрэ сатаатыҥ.
+Бука диэн $1 буолан баран өссө киирэн көрөөр.',
 'login-abort-generic' => 'Бу аатынан сатаан киирбэтиҥ - быстан хаалла',
 'loginlanguagelabel' => 'Омугун тыла: $1',
 'suspicious-userlogout' => 'Сеансы түмүктүүр ыйытыгыҥ ылыныллыбата, тоҕо диэтэххэ браузер эбэтэр кээштыыр прокси алҕас ыыппыт ыйытыктарыгар майгынныыр.',
+'createacct-another-realname-tip' => 'Дьиҥнээх аатыҥ булгуччута суох.
+Ыйдаххына уларыппыт сирэйиҥ устуоруйатыгар көстөр буолуоҕа.',
 
 # Email sending
 'php-mail-error-unknown' => 'mail() PHP-функциятыгар туох эрэ алҕас тахсыбыт',
@@ -559,8 +602,7 @@ $2',
 'newpassword' => 'Саҥа киирии тыл:',
 'retypenew' => 'Саҥа киирии тылы хатылаа:',
 'resetpass_submit' => 'Киирии тылы уларыт уонна киир',
-'resetpass_success' => 'Your password has been changed successfully! Now logging you in...
-Киирии тылыҥ этэҥҥэ уларыйда. Сотору кэминэн киириэҥ...',
+'changepassword-success' => 'Киирии тылыҥ этэҥҥэ уларыйда!',
 'resetpass_forbidden' => 'Киирии тылы уларытар сатаммат',
 'resetpass-no-info' => 'Ааккын билиһиннэрдэххинэ эрэ бу сирэйгэ быһа тиийиэххин сөп.',
 'resetpass-submit-loggedin' => 'Киирии тылы уларытыы',
@@ -572,10 +614,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Киирии тылы саҥаттан',
-'passwordreset-text' => 'Урукку киирии тылы уларытарга бу форманы толор.',
+'passwordreset-text-one' => 'Урукку киирии тылы уларытарга бу форманы толор.',
+'passwordreset-text-many' => '{{PLURAL:$1|Киирии тылы уларытарга түннүктэртэн биирдэстэрин толор.}}',
 'passwordreset-legend' => 'Киирии тылы саҥаттан',
 'passwordreset-disabled' => 'Бу биикигэ киирии тылы саҥардыы бобуллубут.',
-'passwordreset-pretext' => '{{PLURAL:$1||Аллара көстөр дааннайдартан биирин талан суруй}}',
+'passwordreset-emaildisabled' => 'Бу биикигэ эл. почтаны туттуу араарыллыбыт',
 'passwordreset-username' => 'Кыттааччы:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Суруллубут суругу көрөҕүн дуо?',
@@ -606,7 +649,7 @@ $2
 Быстах киирии тыл: $2',
 'passwordreset-emailsent' => 'Киирии тылы уларытар туһунан сурук барда.',
 'passwordreset-emailsent-capture' => 'Киирии тылы уларытар туһунан сурук аллара эмиэ көрдөрүлүннэ.',
-'passwordreset-emailerror-capture' => 'Манна санатар сурук көрдөрүлүннэ, бу төрүөттэн сатаан барбата: $1',
+'passwordreset-emailerror-capture' => 'Манна киирии тылы уларытар туһунан сурук көрдөрүлүннэ. Ол эрэн сурук бу төрүөттэн $2 кыттааччыга сатаан барбата: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ааадырыһын уларыт',
@@ -620,6 +663,11 @@ $2
 'changeemail-submit' => 'Аадырыһы уларыт',
 'changeemail-cancel' => 'Тохтот',
 
+# Special:ResetTokens
+'resettokens' => 'Токеннары бырах',
+'resettokens-legend' => 'Токеннары бырах',
+'resettokens-tokens' => 'Токеннар:',
+
 # Edit page toolbar
 'bold_sample' => 'Модьу бичик',
 'bold_tip' => 'Модьу бичик',
@@ -815,12 +863,15 @@ IP-аадырыһа эрэ көстөр.
 Арааһа сотуллубут быһыылаах.',
 'edit-conflict' => 'Көннөрүүлэр утарсыылара.',
 'edit-no-change' => 'Эн көннөрүүҥ киирбэтэ, тоҕо диэтэххэ тугу да уларыппатаххын.',
+'postedit-confirmation' => 'Көннөрүүҥ бигэргэннэ.',
 'edit-already-exists' => 'Саҥа сирэйи оҥорор табыллыбат.
 Маннык сирэй баар эбит.',
 'defaultmessagetext' => 'Туспа этиллибэтэҕинэ суруллар тиэкис',
 'content-failed-to-parse' => '$2 иһинээҕитэ $1 көрүҥэр сөп түбэспэт: $3.',
 'invalid-content-data' => 'Алҕастаах дааннайдар',
 'content-not-allowed-here' => '[[$2]] сирэйгэ "$1" туттуллуо суохтаах',
+'editwarning-warning' => 'Атын сирэйгэ көстөххүнэ билигин оҥорбут уларытыыҥ барыта сүтэн хаалыаҕа.
+Бэлиэтэммит буоллаххына, бу сэрэтиини туруорууларыҥ «Уларытыы» салаатыгар араарар кыахтааххын.',
 
 # Content models
 'content-model-wikitext' => 'биики-тиэкис',
@@ -855,6 +906,7 @@ IP-аадырыһа эрэ көстөр.
 'undo-failure' => 'Уларытыы төннөр кыаҕа суох. Ыккардынааҕы көннөрүүлэр бэйэ бэйэлэригэр сөп түбэспэттэр.',
 'undo-norev' => 'Бу көннөрүү сотуллар кыаҕа суох, тоҕо диэтэххэ ончу суох эбэтэр номнуо сотуллубут.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] кыттааччы ([[User talk:$2|ырытыы]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]]) $1 нүөмэрдээх уларытыытын сотон оннугар түһэрэргэ.',
+'undo-summary-username-hidden' => 'Кистэммит кыттааччы $1 уларытыытын төннөр',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Саҥа ааты киллэрэр сатаммат',
@@ -1036,6 +1088,7 @@ $1",
 'compareselectedversions' => 'Талыллыбыт торумнары тэҥнээ',
 'showhideselectedversions' => 'Талыллыбыт барыллары көрдөр/кистээ',
 'editundo' => 'төнүн',
+'diff-empty' => '(уратыта суох)',
 'diff-multi' => '({{PLURAL:$2|$2 кыттааччы|$2 ахсааннаах кыттааччы}} {{PLURAL:$1|$1 ыккардынааҕы барыла көрдөрүллүбэтэ|$1 ахсааннаах ыккардынааҕы барыла көрдөрүллүбэтэ|$1.}})',
 'diff-multi-manyusers' => '(Кырата {{PLURAL:$2|$1 кыттааччы|$2 ахсааннаах кыттааччы}} оҥорбут {{PLURAL:$1|ыккардынааҕы $1 барыла|ыккардынааҕы $1 барыллара}} көрдөрүллүбэтэ)',
 'difference-missing-revision' => '$2 барыл бу тэҥнээһиҥҥэ ($1) көстүбэтэ.
@@ -1063,7 +1116,6 @@ $1",
 'searchmenu-legend' => 'Көрдөөһүн туруоруулара',
 'searchmenu-exists' => "'''Бу биикигэ бу сирэй маннык ааттаах \"[[\$1]]\"'''",
 'searchmenu-new' => "'''Бу биикигэ \"[[:\$1]]\" сирэйи айарга!'''",
-'searchhelp-url' => 'Help:Көмө',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Маннык префикстаах сирэйдэри көрөргө]]',
 'searchprofile-articles' => 'Ыстатыйалар истэрэ',
 'searchprofile-project' => 'Көмө уонна Бырайыак сирэйдэрэ',
@@ -1104,15 +1156,7 @@ $1",
 'powersearch-togglenone' => 'Бэлиэтээмэ',
 'search-external' => 'Тастан көрдөөһүн',
 'searchdisabled' => '{{SITENAME}} көрдүүр тэрилэ араарыллыбыт. Атын көрдүүр системаларынан наадыйар сирэйдэргитин көрдөтүөххүтүн сөп. Ол гынан баран поисковик кээһигэр баар торум эргэрбит буолуон сөп.',
-
-# Quickbar
-'qbsettings' => 'Навигация панела',
-'qbsettings-none' => 'Көрдөрүмэ',
-'qbsettings-fixedleft' => 'Хаҥас өттө хамсаабат',
-'qbsettings-fixedright' => 'Уҥа өттө хамсаабат',
-'qbsettings-floatingleft' => 'Хаҥас өттө устаҥныыр',
-'qbsettings-floatingright' => 'Уҥа өттө устаҥныыр',
-'qbsettings-directionality' => 'Туттарыллыбыт, тылыҥ суругун-бичигин хайысхатыттан тутулуктаах',
+'search-error' => 'Көрдүүр кэмҥэ алҕас таҕыста: $1',
 
 # Preferences page
 'preferences' => 'Уларытыылар',
@@ -1146,7 +1190,6 @@ $1",
 'resetprefs' => 'Бигэргэтиллибэтэх уларыйыылары сот',
 'restoreprefs' => 'Туруоруулары саҥаттан (салааларга барыларыгар)',
 'prefs-editing' => 'Уларытыы',
-'prefs-edit-boxsize' => 'Эрэдээксийэлиир түннүк улахана.',
 'rows' => 'Строкаалара:',
 'columns' => 'Колонкалара:',
 'searchresultshead' => 'Көрдөөһүн түмүгэ',
@@ -1157,9 +1200,6 @@ $1",
 'recentchangesdays-max' => '(улааппыта $1 күн)',
 'recentchangescount' => 'Саҥа уларытыылар көрдөрүллэр ахсааннара:',
 'prefs-help-recentchangescount' => 'Бу саҥа көннөрүүлэри, сирэй устуоруйаларын уонна сурунааллары көрдөрөр.',
-'prefs-help-watchlist-token' => 'Бу түннүккэ кистэлэҥ күлүүһү суруйдаххына эн кэтээн көрүүҥ тиһигин RSS-трансляцията оҥоһуллуо.
-Бу күлүүһү билэр ханнык баҕарар киһи эн кэтээн көрөр тиһиккин көрүөн сөп, онон дьон дөбөҥнүк билбэт кистэлэҥ күлүүстэрин суруй.
-Ылбычча айыллыбыт күлүүһү туттуоххун сөп: $1',
 'savedprefs' => 'Эн туруорууларыҥ олохтоннулар.',
 'timezonelegend' => 'Олохтоох кэм:',
 'localtime' => 'Олохтоох кэмим:',
@@ -1190,7 +1230,6 @@ $1",
 'prefs-reset-intro' => 'Бу сирэй көмөтүнэн туруорууларгын саҥаттан туруорар турукка төннөрүөххүн сөп.
 Маны бигэргэттэххинэ билигин баар туруоруулары дэбигис сөргүппэккин.',
 'prefs-emailconfirm-label' => 'Эл. почтаны бигэргэтии:',
-'prefs-textboxsize' => 'Эрэдээкисэйлиир түннүк улахана',
 'youremail' => 'E-mail-ыҥ:',
 'username' => '{{GENDER:$1|Бэлиэтэммит аатыҥ}}:',
 'uid' => '{{GENDER:$1|Кыттааччы}} ID-та:',
@@ -1222,6 +1261,8 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'prefs-dateformat' => 'Күн-дьыл көрүҥэ (формаата)',
 'prefs-timeoffset' => 'Кэм уратыта',
 'prefs-advancedediting' => 'Сүрүн туруоруулар',
+'prefs-editor' => 'Эрэдээктэр',
+'prefs-preview' => 'Инники көрүү',
 'prefs-advancedrc' => 'Дириҥэтиллибит туруоруулар',
 'prefs-advancedrendering' => 'Дириҥэтиллибит туруоруулар',
 'prefs-advancedsearchoptions' => 'Дириҥэтиллибит туруоруулар',
@@ -1230,6 +1271,7 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'prefs-displaysearchoptions' => 'Көстүүтүн туруоруулара',
 'prefs-displaywatchlist' => 'Көстүүтүн туруоруулара',
 'prefs-diffs' => 'Уратылара',
+'prefs-help-prefershttps' => 'Аныгыскы киириигэр үлэлиир буолуо.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Сөп курдук көстөр',
@@ -1256,6 +1298,8 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'userrights-notallowed' => 'Атын кыттааччы быраабын эбэр уонна уларытар кыаҕыҥ суох эбит.',
 'userrights-changeable-col' => 'Эн уларытар кыахтаах бөлөхтөрүҥ',
 'userrights-unchangeable-col' => 'Бу бөлөхтөрү уларытар кыаҕыҥ суох',
+'userrights-conflict' => 'Кыттааччы быраабын быһаарарга алҕас таҕыста! Хатылаан көр.',
+'userrights-removed-self' => 'Бэйэҥ кыаххын сарбынныҥ. Онон бу сирэйгэ киирэр кыаҕыҥ суох буолла.',
 
 # Groups
 'group' => 'Бөлөх:',
@@ -1321,11 +1365,19 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'right-proxyunbannable' => 'Прокси аптааматынан хааччахтааһынын тумнуу',
 'right-unblockself' => 'Хааччаҕы бэйэ устуута',
 'right-protect' => 'Сирэйдэр көмүскэллэрин таһымын уонна каскаадынан көмүскэммит сирэйдэри уларытыы',
-'right-editprotected' => 'Көмүскэллээх сирэйдэри уларытыыы (каскаднай көмүскэллэрэ суох буоллаҕына)',
+'right-editprotected' => 'Уларытыллар сирэйдэр "{{int:protect-level-sysop}}" таһымынан көмүскэммиттэр',
+'right-editsemiprotected' => 'Уларытыллар сирэйдэр "{{int:protect-level-autoconfirmed}}" таһымынан көмүскэммиттэр',
 'right-editinterface' => 'Кыттааччы интерфейсын уларытыы',
 'right-editusercssjs' => 'Атын кыттааччылар CSS- и JS-билэлэрин уларытыы',
 'right-editusercss' => 'Атын кыттааччылар CSS-билэлэрин уларытыы',
 'right-edituserjs' => 'Атын кыттааччылар JS-билэлэрин уларытыы',
+'right-editmyusercss' => 'Кыттааччы CSS-билэтин уларытыы',
+'right-editmyuserjs' => 'Бэйэ JavaScript-билэлэрин уларытыы',
+'right-viewmywatchlist' => 'Бэйэ кэтиир тиһигин көрүү',
+'right-editmywatchlist' => 'Бэйэ кэтиир тиһигин уларытыы. Болҕой, сорох дьайыыларыҥ бу быраабы биэрбэтэҕиҥ да иһин сирэйдэри тиһиккэ эбиэхтэрин сөп.',
+'right-viewmyprivateinfo' => 'Бэйэҥ тускунан (холобур, эл. почтаҥ, дьиҥнээх аатыҥ)',
+'right-editmyprivateinfo' => 'Бэйэҥ тус дааннайданнаргын уларыт (холобур, эл. почтаҕын, дьиҥнээх ааккын)',
+'right-editmyoptions' => 'Бэйэ туруорууларын уларытыы',
 'right-rollback' => 'Кыттааччы оҥорбут көннөрүүлэрин талыллыбыт биир сирэйгэ суох гыныы',
 'right-markbotedits' => 'Төннөрүллэр көннөрүүлэри робот уларытыытын курдук бэлиэтээһин',
 'right-noratelimit' => 'Нуорманнан хааччахтааһын суох',
@@ -1387,12 +1439,18 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'action-userrights-interwiki' => 'атын биикигэ кыттыы бырааптарын уларытыы',
 'action-siteadmin' => 'билэ олоҕун хааччахтааһын уонна хааччахтааһынын устуу',
 'action-sendemail' => 'сурук ыытыы',
+'action-editmywatchlist' => 'кэтиир тиһиккин уларыт',
+'action-viewmywatchlist' => 'кэтиир тиһиккин көрүү',
+'action-viewmyprivateinfo' => 'бэйэҥ тускунан көрүү',
+'action-editmyprivateinfo' => 'бэйэҥ тускунан суруллубуту уларыт',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|уларытыы|уларытыылар}}',
+'enhancedrc-history' => 'устуоруйата',
 'recentchanges' => 'Кэнники уларытыылар',
 'recentchanges-legend' => 'Кэлиҥҥи уларытыылар хайдах көстөллөрүн туруоруу',
 'recentchanges-summary' => 'Манна хаһан оҥоһуллубуттарынан сааһыланан {{SITENAME}} кэнники уларыытыылара көстөллөр.',
+'recentchanges-noresult' => 'Этиллибит уларытыылар эппит кэмҥэр оҥоһуллубатахтар.',
 'recentchanges-feed-description' => 'Бу ботуокка биики бүтэһик уларыйыыларын кэтииргэ.',
 'recentchanges-label-newpage' => 'Бу уларытыы түмүгэр саҥа сирэй айыллыбыт.',
 'recentchanges-label-minor' => 'Бу улахан суолтата суох уларытыы',
@@ -1429,7 +1487,6 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'recentchangeslinked-feed' => 'Сигэнэр уларытыылар',
 'recentchangeslinked-toolbox' => 'Сигэнэр уларытыылар',
 'recentchangeslinked-title' => '"$1" кытта сибээстээх уларытыылар',
-'recentchangeslinked-noresult' => 'Сигэммит сирэйдэргэ этиллибит кэмҥэ уларытыылар оҥоһуллубатылар.',
 'recentchangeslinked-summary' => "Бу анал сирэйгэ сигэнэр сирэйдэр бүтэһик уларыйыылара көһүннүлэр. [[Special:Watchlist|Кэтэнэр сирэйдэр]] '''модьу бичигинэн''' бэлиэтэннилэр.",
 'recentchangeslinked-page' => 'Сирэй аата:',
 'recentchangeslinked-to' => 'Төттөрүтүн, ыйыллыбыт сирэйгэ сигэнэр сирэйдэри көрдөр',
@@ -1440,7 +1497,7 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'reuploaddesc' => 'Тохтот уонна киллэрии форматыгар төнүн',
 'upload-tryagain' => 'Билэ туһунан сурук уларытыытын ыыт',
 'uploadnologin' => 'Биикигэ ааккын билиһиннэрбэтиҥ',
-'uploadnologintext' => 'Билэлэри киллэрэргэ манна [[Special:UserLogin|бэлиэтэниэххэ]] наада',
+'uploadnologintext' => 'Билэлэри киллэрэргэ $1 наада',
 'upload_directory_missing' => 'Суруйуу паапката ($1) суох, ону ааһан сиэрбэр ону бэйэтэ оҥорор кыаҕа суох.',
 'upload_directory_read_only' => '($1) директорияҕа сиэрбэр билэни суруйар кыаҕа суох.',
 'uploaderror' => 'Билэ суруллубата',
@@ -1668,7 +1725,6 @@ $1',
 'http-read-error' => 'HTTP ааҕыытын алҕаһа.',
 'http-timed-out' => 'HTTP-көрдөбүл толоруллуохтаах болдьоҕо ааста.',
 'http-curl-error' => 'URL-га тахсыы алҕаһа: $1',
-'http-host-unreachable' => 'URL-га тахсыы сатаммата.',
 'http-bad-status' => 'HTTP-ыйытыгы көрүү кэмигэр туох эрэ сатаммата: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1696,6 +1752,9 @@ $1',
 'listfiles_size' => 'Кээмэйэ',
 'listfiles_description' => 'Быһаарыыта',
 'listfiles_count' => 'Барыллар',
+'listfiles-latestversion' => 'Билиҥҥи барыла',
+'listfiles-latestversion-yes' => 'Сөп',
+'listfiles-latestversion-no' => 'Суох',
 
 # File description page
 'file-anchor-link' => 'Билэ',
@@ -1791,6 +1850,13 @@ $1',
 'randompage' => 'Түбэспиччэ сирэй',
 'randompage-nopages' => 'Бу {{PLURAL:$2|аат дала кураана|аат далларыгар сирэйдэр суохтар}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Категория түбэспиччэ ыстатыйата',
+'randomincategory-invalidcategory' => '"$1" диэн категория суох эбит.',
+'randomincategory-nopages' => 'Бу категорияҕа [[:Category:$1]] киирэр ыстатыйалар суохтар.',
+'randomincategory-selectcategory' => 'Категория түбэспиччэ сирэйигэр көс: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Көс',
+
 # Random redirect
 'randomredirect' => 'Түбэспиччэ утаарыы',
 'randomredirect-nopages' => 'Бу аат далыгар($1) көһөрөр ыйынньыктар суохтар.',
@@ -1816,17 +1882,13 @@ $1',
 'statistics-users-active-desc' => 'Ааспыт {{PLURAL:$1|биир хонук иһигэр|$1 хонукка}} тугу эмэ оҥорбут кыттааччылар',
 'statistics-mostpopular' => 'Саамай элбэхтик көрүллэр ыстатыйалар',
 
-'disambiguations' => 'Элбэх суолталаах өйдөбүллэргэ сигэнэр сирэйдэр',
-'disambiguationspage' => 'Template:элбэх суолталаах өйдөбүллэр',
-'disambiguations-text' => "Маннык сирэйдэр '''хас да суолталаах сирэйгэ''' сигэнэллэр. 
-Ол оннугар ханнык эрэ чопчу сирэйгэ сигэниэхтээхтэр.<br />
-Быһаарыы: [[MediaWiki:Disambiguationspage]] халыып баар сирэйдэрэ хас да суолталаах сирэй ахсааныгар киирэллэр.",
-
 'pageswithprop' => 'Эрдэттэн туруоруулаах сирэйдэр',
 'pageswithprop-legend' => 'Уларытыллыбыт туруоруулаах сирэйдэр',
 'pageswithprop-text' => 'Манна сорох туруоруулара уларытыллыбыт сирэйдэр көстүбүттэр.',
 'pageswithprop-prop' => 'Туруоруу аата:',
 'pageswithprop-submit' => 'Толор',
+'pageswithprop-prophidden-long' => 'уһун тиэкис кистэммит ($1)',
+'pageswithprop-prophidden-binary' => 'бинаар суолта кистэммит ($1)',
 
 'doubleredirects' => 'Хос көһөрөөһүн',
 'doubleredirectstext' => 'Бу сирэйгэ атын сиргэ утаарар хос утаарыылар тиһиктэрэ көстөр.
@@ -1884,6 +1946,7 @@ $1',
 'mostrevisions' => 'Саамай элбэхтик уларытыллыбыт ыстатыйалар',
 'prefixindex' => 'Мантан саҕаланар (префикстаах) сирэйдэр барыта',
 'prefixindex-namespace' => 'Сирэй саҕаланыытынан наардаан көрдөрүү ($1 аат далыгар)',
+'prefixindex-strip' => 'Түмүк тиһигэр префиксы көрдөрүмэ',
 'shortpages' => 'Кылгас ыстатыйалар',
 'longpages' => 'Уһун ыстатыйалар',
 'deadendpages' => 'Dead-end (Бүтэй) сирэйдэр',
@@ -2075,10 +2138,9 @@ $1',
 'unwatchthispage' => 'Кэтиири тохтот',
 'notanarticle' => 'Бу ыстатыйа буолбатах',
 'notvisiblerev' => 'Торум сотуллубут',
-'watchnochange' => 'Кэтиир сирэйдэргиттэн этиллибит кэмҥэ биир да уларыйбатах.',
 'watchlist-details' => '{{PLURAL:$1|$1 сирэйи кэтиигин|$1 сирэй кэтэбилгэ сылдьар}}, ырытыы сирэйдэрин аахпатахха.',
-'wlheader-enotif' => '* эл. почтанан биллэрии холбоммут.',
-'wlheader-showupdated' => "* Бүтэһик киириигит кэннэ уларыйбыт сирэйдэр '''модьу''' бичигинэн бэлиэтэннилэр",
+'wlheader-enotif' => 'Эл. почтанан биллэрии холбоммут.',
+'wlheader-showupdated' => "Бүтэһик киирииҥ кэннэ уларыйбыт сирэйдэр '''модьу''' бичигинэн бэлиэтэннилэр.",
 'watchmethod-recent' => 'кэтээн көрүү бүтэһик уларыйыыларын көрүү',
 'watchmethod-list' => 'кэтээһин бүтэһик уларыйыылара',
 'watchlistcontains' => '$1 сирэйи кэтээн көрөҕүн.',
@@ -2481,13 +2543,11 @@ $1',
 'ipb_blocked_as_range' => 'Сыыһа: $1 IP-та чопчу бобуллубатах (не блокирован), онон аһыллар кыаҕа суох. Ол гынан баран IP бу $2 диапазон сорҕотун быһыытынан бобуллубут, ону арыйыахха (бобуутун устуохха) сөп.',
 'ip_range_invalid' => 'IP-лар диапазоннара сатаммат.',
 'ip_range_toolarge' => 'Мантан  /$1 үөһэ диапазоннары хааччахтыыр сатаммат.',
-'blockme' => 'Миигин боп (блокируйдаа)',
 'proxyblocker' => 'Прокси бобуллуута',
-'proxyblocker-disabled' => 'Бу дьайыы араарыллыбыт.',
 'proxyblockreason' => 'Эн IP-ҥ аһаҕас прокси эбит, онон бобулунна. Интернет-провайдергын эбэтэр техническэй сулууспаны кытта сибээстэһэн кутталлаах суол баарын биллэр.',
-'proxyblocksuccess' => 'Сатанна.',
 'sorbsreason' => 'Эн IP-ҥ {{SITENAME}} саайт DNSBL-гар аһаҕас прокси быһыытынан сылдьар.',
 'sorbs_create_account_reason' => 'Эн IP-ҥ {{SITENAME}} саайт DNSBL-гар аһаҕас прокси быһыытынан сылдьар. Саҥаттан бэлиэтэнэр кыаҕыҥ суох.',
+'xffblockreason' => 'X-Forwarded-For баһыгар баар IP-аадырыс бобуллубут. Бу IP Эйиэнэ эбэтэр туһанар проксиҥ гиэнэ буолуон сөп. Бобуу төрүөтэ маннык эбит: $1',
 'cant-block-while-blocked' => 'Бэйэҥ хааччахтаммыт кэмҥэр атын кыттааччылары хааччахтыыр кыаҕыҥ суох.',
 'cant-see-hidden-user' => 'Эн хааччахтаары гыммыт кыттааччыҥ урут хааччахтаммыт уонна кистэммит эбит. Кыттааччылары кистиир кыаҕыҥ суох буолан ол туһунан суругу көрөр да уларытар да быраабыҥ суох.',
 'ipbblocked' => 'Атын кыттааччылары хааччахтыыр да, хааччахтарын да устар кыаҕыҥ суох, тоҕо диэтэххэ бэйэҥ хааччахтааххын',
@@ -2656,6 +2716,8 @@ $1',
 'thumbnail-more' => 'Улаатыннар',
 'filemissing' => 'Билэ көстүбэтэ',
 'thumbnail_error' => 'Кыра ойууну оҥоруу сатаммата: $1',
+'thumbnail_error_remote' => '$1 алҕас туһунан биллэрдэ:
+$2',
 'djvu_page_error' => 'DjVu сирэй тиһик таһыгар эбит',
 'djvu_no_xml' => 'DjVu билэтигэр аналлаах XML кыайан ылыллыбата',
 'thumbnail-temp-create' => 'Эскииз быстах билэтин оҥорор табыллыбата',
@@ -2882,11 +2944,6 @@ $1',
 'pageinfo-category-files' => 'Билэ ахсаана',
 
 # Skin names
-'skinname-standard' => 'Классика',
-'skinname-nostalgia' => 'Мунчаарыы',
-'skinname-myskin' => 'Миэнэ',
-'skinname-chick' => 'Чуппууска',
-'skinname-simple' => 'Судургу',
 'skinname-modern' => 'Билиҥҥи',
 
 # Patrolling
@@ -2967,11 +3024,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 мүнүүтэ|$1 мүнүүтэ}}',
 'hours' => '{{PLURAL:$1|$1 чаас|$1 чаас}}',
 'days' => '{{PLURAL:$1|$1 күн|$1 күн}}',
+'weeks' => '$1 нэдиэлэ',
 'months' => '$1 ый',
 'years' => '$1 сыл',
 'ago' => '$1 ынараа өттүгэр',
 'just-now' => 'сибилигин',
 
+# Human-readable timestamps
+'hours-ago' => '$1 чаас ынараа өттүгэр',
+'minutes-ago' => '$1 мүнүүтэ ынараа өттүгэр',
+'seconds-ago' => '$1 сөкүүндэ ынараа өттүгэр',
+'monday-at' => 'Бэнидиэнньиккэ, баччаҕа: $1',
+'tuesday-at' => 'оптуорунньукка, баччаҕа: $1',
+'wednesday-at' => 'сэрэдэҕэ, баччаҕа: $1',
+'thursday-at' => 'чэппиэргэ, баччаҕа: $1',
+'friday-at' => 'бээтинсэҕэ, баччаҕа: $1',
+'saturday-at' => 'субуотаҕа, баччаҕа: $1',
+'sunday-at' => 'өрөбүлгэ, баччаҕа: $1',
+'yesterday-at' => 'Бэҕэһээ, баччаҕа: $1',
+
 # Bad image list
 'bad_image_list' => 'Формаата маннык буолуохтаах:
 
@@ -2997,7 +3068,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Кэтитэ',
 'exif-imagelength' => 'Үрдүгэ',
 'exif-bitspersample' => 'Глубина цвета',
@@ -3176,7 +3247,7 @@ $1',
 'exif-originalimageheight' => 'Ойуу быһылла илигинээҕи үрдүгэ',
 'exif-originalimagewidth' => 'Ойуу быһылла илигинээҕи кэтитэ',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Хам тутуллубатах',
 'exif-compression-2' => 'CCITT Group 3, 1-мерная модификация кодирования длин серий Хаффмана',
 'exif-compression-3' => 'CCITT Group 3, факс куодтааһына',
@@ -3567,7 +3638,6 @@ $5
 'version-other' => 'Атын',
 'version-mediahandlers' => 'Медиа уларытааччылар',
 'version-hooks' => 'Перехватчиктар',
-'version-extension-functions' => 'Расширениялар функциялара',
 'version-parser-extensiontags' => 'Синтаксииһы анаалыстыыр тэрил расширениятын тиэктэрэ',
 'version-parser-function-hooks' => 'Синтаксииһы анаалыстыыр тэрил функциятын перехватчиктара',
 'version-hook-name' => 'Перехватчик аата',
@@ -3576,6 +3646,7 @@ $5
 'version-license' => 'Лиссиэнзийэ',
 'version-poweredby-credits' => "Бу биики бу движокка олоҕурар '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'атыттар',
+'version-poweredby-translators' => 'translatewiki.net тылбаасчыттара',
 'version-credits-summary' => '[[Special:Version|MediaWiki]] сайдыытыгар үлэлэрин иһин манна ахтыллыбыт дьоҥҥо махтанабыт.',
 'version-license-info' => 'MediaWiki көҥүл тарҕанар бырагырааммаларга киирэр, кинини көмпүүтэр аһаҕас бырагырааммаларын пуондатын GNU General Public License усулуобуйатынан көҥүл тарҕатаргыт уонна/эбэтэр уларытаргыт көҥүллэнэр; иккис эбэтэр онтон хойукку ханнык баҕарар барылыттан саҕалаан.
 
@@ -3589,12 +3660,16 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'version-entrypoints-header-entrypoint' => 'Киирии сирэ',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Билэ суола',
-'filepath-page' => 'Билэ:',
-'filepath-submit' => 'Көс',
-'filepath-summary' => 'Бу аналлаах сирэй билэ ханна сытарын толору көрдөрөр.
-Ойуулар толору көрдөрүллэллэр, атын билэлэр ситимнээх бырагырааммаларыгар тута арыллаллар.',
+# Special:Redirect
+'redirect' => 'Билэттэн, кыттааччыттан эбэтэр барыл идентификаторыттан утаарыы',
+'redirect-legend' => 'Билэҕэ эбэтэр сирэйгэ утаарыы',
+'redirect-submit' => 'Толор',
+'redirect-lookup' => 'Көрдөт:',
+'redirect-value' => 'Суолтата:',
+'redirect-user' => 'Кыттааччы нүөмэрэ',
+'redirect-revision' => 'Сирэй барыла',
+'redirect-file' => 'Билэ аата',
+'redirect-not-exists' => 'Суолта көстүбэтэ',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Хос билэлэри көрдөөһүн',
@@ -3644,6 +3719,7 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'tags' => 'Билигин туттуллар уларытыы бэлиэлэрэ',
 'tag-filter' => '[[Special:Tags|Бэлиэлэр]] фильтрдара:',
 'tag-filter-submit' => 'Фильтр',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Тиэк|Тиэктэр}}]]: $2)',
 'tags-title' => 'Бэлиэлэр (тиэктэр)',
 'tags-intro' => 'Бу сирэйгэ бырагыраамма уларытыылары бэлиэтиир анал бэлиэлэрин (тиэктэрин) тиһиктэрэ уонна ол бэлиэлэр суолталара көстөр.',
 'tags-tag' => 'Бэлиэ (тиэк) аата',
@@ -3685,6 +3761,9 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'htmlform-submit' => 'Ыыт',
 'htmlform-reset' => 'Уларытыыны төннөр',
 'htmlform-selectorother-other' => 'Атын',
+'htmlform-no' => 'Суох',
+'htmlform-yes' => 'Сөп',
+'htmlform-chosen-placeholder' => 'Барылы тал',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 толору тиэкистээх көрдөөһүнү өйүүр',
diff --git a/languages/messages/MessagesSat.php b/languages/messages/MessagesSat.php
index 9a45a39e..0b18a5c5 100644
--- a/languages/messages/MessagesSat.php
+++ b/languages/messages/MessagesSat.php
@@ -50,9 +50,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ńelok laṛcaṛkoaḱ songkha uduḱme',
 'tog-oldsig' => 'Menaḱ signạtar',
 'tog-fancysig' => 'Signạcar do wikiṭesk hisạbte moneyemẽ (jahan acte hoyoḱ joṛao bạgikate)',
-'tog-externaleditor' => 'Etohoṕre bahre reaḱ sompadonićaḱ beohar hoyoḱma (khali sẽṛa beoharić lạgit́te, kompeuṭare asokae seṭing jạruṛa. [//www.mediawiki.org/wiki/manual:External_editors More information.])',
-'tog-externaldiff' => 'Etohoṕre bahre reaḱ sompadonićaḱ beohar hoyoḱma (khali sẽṛa beoharić lạgit́te, kompeuṭare asokae seṭing jạruṛa. [//www.mediawiki.org/wiki/manual:External_editors More information.])',
-'tog-showjumplinks' => '"Calaḱmẽ" beohar joṛao ehop hoyoḱma',
 'tog-uselivepreview' => 'Jewet́ ńeloḱ beoharme (JavaScript jaruṛ menaḱa)',
 'tog-forceeditsummary' => 'Khạli sompadon guṭkatha em oktere iń baḍae ocoyiń hoyoḱma',
 'tog-watchlisthideown' => 'Ńeloḱ talikare ińaḱ joṛao kamiko danaṅme',
@@ -249,7 +246,7 @@ $1',
 'pool-queuefull' => 'Pul reaḱ sakam perećena',
 'pool-errorunknown' => 'Bań baḍayaḱ bhul',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'babo̠tre',
 'aboutpage' => 'Project: Babo̠t',
 'copyright' => '$1 re bhitrire ńamoḱa.',
@@ -259,7 +256,6 @@ $1',
 'disclaimers' => 'Dạbi bạnuḱko',
 'disclaimerpage' => 'Project: Sadharon ḍiskleimarko(General disclaimer)',
 'edithelp' => 'Tońge goṛo',
-'edithelppage' => 'Help:So̠mpado̠n',
 'helppage' => 'Help: Bhitri renaḱ',
 'mainpage' => 'Mukhiạ Sakam',
 'mainpage-description' => 'Mukhiạ sakam',
@@ -332,17 +328,6 @@ Noa do noṅkanaḱ menkana je {{SITENAME}} sayeṭre beoharen sofṭower re mit
 # General errors
 'error' => 'bhul',
 'databaseerror' => 'Ḍaṭabase vul',
-'dberrortext' => 'Database query syntexre vul hoeakana.
-Sofṭoyerre jahan bag karonte noa do hoe daṛeyaḱa.
-Joto khon mucạt́ database query do tahẽkana noṅka:
-<blockquote><tt>$1</tt><blockquote>
-"<tt>$2</tt>" bhitrire tahẽna.
-Database okaṭaḱ vule em akada:"<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Ḍaṭabes query sintxexṭre vul hoeakana.
-Mucạt́ ḍaṭabes query do tahẽkana:
-"$1"
-"$2" faṅson reaḱ bhitri khon.
-Ḍatabes okaṭaḱ vule kulakaḱ: "$3: $4:',
 'laggedslavemode' => "'''Sontoroḱme:''' sakamre do nahaḱ nãwãnaḱko paseć bạnuḱa.",
 'readonly' => 'Ḍaṭabes do talagea',
 'enterlockreason' => 'Cạbie reaḱ karon do cet́kana ma lạimẽ, Saõte tinre tala cạbim jhija ona okte hõ lạimẽ',
@@ -385,7 +370,6 @@ Query: $2',
 'viewsourcetext' => 'Noa sakam do am ńel ar ńamoḱaḱ ṭhạiem kopi hatao daṛeaḱa:',
 'viewyourtext' => "Am do '''Amaḱ sompadon''' noa sakam ńel arem kopi hatao daṛeaḱa:",
 'protectedinterface' => 'Noa sakam reaḱ babotko do wiki sofṭoyer reaḱ mit́ṭen inṭarfes khobore ema, onate noa do rukhiyạ doho hoeakana.',
-'sqlhidden' => '(SQL query do ukure menaḱa)',
 'cascadeprotected' => 'Noa sakam do sompadon khon rukhiyạre menaḱa, karon sakam do latar reaḱ {{PLURAL:$1 gan sakam reaḱ gan sakam reaḱ}} bhitrire, oka sakam do (cascading) te rukhiyạ menaḱa:
 $2',
 'namespaceprotected' => "Amaḱ do sakamko joṛao lạgit́te ạidạri banuḱ tama '''$1''' ńutumjayga.",
@@ -400,10 +384,10 @@ $2',
 'welcomeuser' => 'Johar',
 'welcomecreation-msg' => 'Amaḱ ekaunṭ do̠ jhićena. Amaḱ pạsindko bodol alom hiṛińa.',
 'yourname' => 'Beoboharicaḱ ńutum',
+'userlogin-yourname-ph' => 'Amaḱ beohar ńutum emme.',
 'yourpassword' => 'Uku namber',
 'yourpasswordagain' => 'Arhõ oku namber olme',
 'remembermypassword' => 'Mitṭen khon bạṛti khata reaḱ cạbi disạ dohoḱma (Jạsti $1 {{PLURAL:$1 din reaḱ din reaḱ}} lạgit)',
-'securelogin-stick-https' => 'Bhitri bolo kate HTTPS re soṅge tãhenme',
 'yourdomainname' => 'Amaḱ ḍomen:',
 'externaldberror' => 'Hoe daṛeyaḱa jahan bahre reaḱ jacaeaḱ ḍaṭabes vul hoeakana se amaḱ bahre reaḱ ekaunṭ do nahaḱ halot aguire ạidạri bạnuḱa.',
 'login' => "bolok' duar",
@@ -484,7 +468,7 @@ Arhõ kurumuṭue lahare dayakate thoṛagan tạṅgiemẽ.',
 'newpassword' => 'Nãwã oku nomber',
 'retypenew' => 'Doṛhate oku namber olme',
 'resetpass_submit' => 'Oku namber joṛao ar bhitri bolok',
-'resetpass_success' => 'Amaḱ oku namber do napayte bodolena!
+'changepassword-success' => 'Amaḱ oku namber do napayte bodolena!
 Nitoḱ do am bhitritem boloḱkana...',
 'resetpass_forbidden' => 'Oku namber do baṅ bodoloklena',
 'resetpass-no-info' => 'Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.',
@@ -494,10 +478,8 @@ Nitoḱ do am bhitritem boloḱkana...',
 
 # Special:PasswordReset
 'passwordreset' => 'Nãwãte oku nambar emme',
-'passwordreset-text' => 'Amaḱ ekaunṭ reaḱ purapuri thuti e-mail hotete ńam lạgit́te latar reaḱ forom purạomẽ.',
 'passwordreset-legend' => 'Nãwãte oku nambar emme',
 'passwordreset-disabled' => 'Noa wikire amaḱ uku nambar nãwãte em lạgit subita do bando gea.',
-'passwordreset-pretext' => '{{PLURAL:$1 latar re menaḱ ḍaṭako khon mit́ṭen emmẽ}}',
 'passwordreset-username' => 'Beoharicaḱ ńutum:',
 'passwordreset-domain' => 'Ḍomen:',
 'passwordreset-capture' => 'Sendra fol reaḱ e-mail ńelmẽ?',
@@ -713,7 +695,6 @@ Unuduḱ: '''({{int:cur}})''' = nahaḱ nãwã aroeko saõte tulạo, '''({{int:
 'viewprevnext' => 'Ńelme ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Noa wiki re do \"[[:\$1]] ńutum sakam menaḱa",
 'searchmenu-new' => 'wiki re [[:$1]]nãwã sakam tear',
-'searchhelp-url' => 'Help: Goṛawaḱ',
 'searchprofile-articles' => 'Menaḱaḱ sakamko',
 'searchprofile-project' => 'Go̠ṛo ar Project sakam',
 'searchprofile-images' => 'Multimedia',
@@ -740,9 +721,6 @@ Unuduḱ: '''({{int:cur}})''' = nahaḱ nãwã aroeko saõte tulạo, '''({{int:
 'powersearch-toggleall' => 'Sanamaḱ',
 'powersearch-togglenone' => 'Okaṭaḱ hõ baṅ',
 
-# Quickbar
-'qbsettings-none' => 'Okaṭaḱ hõ baṅ',
-
 # Preferences page
 'preferences' => 'Pạsindko',
 'mypreferences' => 'Iñaḱ pạsindko',
@@ -838,7 +816,6 @@ Amaḱ e-mail ṭhikạna do bań cabaḱa tinre onko do ko beohara',
 'recentchangeslinked' => 'Sãotenaḱ bodolko',
 'recentchangeslinked-toolbox' => 'Noṛjoṛ palaṭko',
 'recentchangeslinked-title' => 'Bodolaḱko do "$1" sãote joṛao geya',
-'recentchangeslinked-noresult' => 'Joṛao sakam re emoḱ oktere jahanaḱ bodolko bạnuḱa.',
 'recentchangeslinked-summary' => "Noa do ona tạlika kana oka do nebetarge bodol hoyakan oka do asokayte hatao akan sakam khon.
 
 [[Special:Watchlist|your watchlist]] renaḱ sakamko do '''bold''' .",
@@ -896,8 +873,6 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
 'statistics' => 'Halot',
 'statistics-pages' => 'Sakamko',
 
-'disambiguationspage' => 'sujhi',
-
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|baiṭ|baiṭ}}',
 'nmembers' => '$1 {{PLURAL:$1 Gaõtaren Gaõtarenko}}',
@@ -1060,8 +1035,6 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
 'block-log-flags-nocreate' => 'Ekaunṭ benao do bondogeya',
 'block-log-flags-noemail' => 'E-mail do esetgea',
 'block-log-flags-hiddenname' => 'Beoharićaḱ ńutum do ukugea',
-'blockme' => 'Esedińmẽ',
-'proxyblocksuccess' => 'Hoena',
 
 # Move page
 'movepagebtn' => 'Sakam ocogmẽ, Sakam kulmẽ',
@@ -1181,7 +1154,7 @@ f nombor
 isospeeddratings
 jeleń',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ganḍe',
 'exif-imagelength' => 'Usul',
 'exif-datetime' => 'Rẽt bodol reaḱ tạrikh ar okte',
diff --git a/languages/messages/MessagesSc.php b/languages/messages/MessagesSc.php
index 7f5ef9c5..705e4170 100644
--- a/languages/messages/MessagesSc.php
+++ b/languages/messages/MessagesSc.php
@@ -177,7 +177,7 @@ $messages = array(
 'index-category' => 'Pàginas indicizadas',
 'noindex-category' => 'Pàginas no indicitzadas',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'A propòsitu de',
 'article' => 'Artìculu',
@@ -270,7 +270,7 @@ $messages = array(
 'jumptosearch' => 'chirca',
 'pool-errorunknown' => 'Faddina disconnota',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'A propòsitu de {{SITENAME}}',
 'aboutpage' => 'Project:Informatziones',
 'copyright' => 'Cuntènnidu a suta licèntzia $1.',
@@ -280,7 +280,6 @@ $messages = array(
 'disclaimers' => 'Abbertimentos',
 'disclaimerpage' => 'Project:Abbertimentos generales',
 'edithelp' => "Agiudu pro s'acontzu o sa scritura",
-'edithelppage' => 'Help:Acontzare',
 'helppage' => 'Help:Agiudu',
 'mainpage' => 'Pàgina Base',
 'mainpage-description' => 'Pàgina Base',
@@ -300,7 +299,6 @@ $messages = array(
 'newmessagesdifflink' => 'ùrtima mudàntzia',
 'youhavenewmessagesmulti' => 'Tenes messàgios noos in $1',
 'editsection' => 'acontza',
-'editsection-brackets' => '[$1]',
 'editold' => 'acontza',
 'viewsourceold' => 'càstia mitza',
 'editlink' => 'acontza',
@@ -346,12 +344,6 @@ Una lista de pàginas ispetziales bàlidas d'agatas in [[Special:SpecialPages|{{
 # General errors
 'error' => 'Faddina',
 'databaseerror' => 'Faddina de su database',
-'dberrortext' => 'Faddina de sintassi in sa pregunta fata a su database.
-Custu podet indicare unu sbàlliu de su software.
-S\'ùrtima consulta imbiada a su database est istada:
-<blockquote><tt>$1</tt></blockquote>
-aintru de sa funtzione "<tt>$2</tt>".
-Su database at torradu custa faddina "<tt>$3: $4</tt>".',
 'readonly' => 'Database bloccadu',
 'enterlockreason' => 'Inserta su motivu de su bloccu, ispetzifichende su momentu probabile chi su bloccu at a acabai',
 'readonlytext' => "In custu momentu su database est bloccadu dae aciunturas e àteras modificas, probabilmente pro ordinaria manutentzione a su database, a pustis de custas at a èssere normale torra.
@@ -380,7 +372,6 @@ Podet èsser stadu burradu dae calicunu àteru.',
 'badtitletext' => "Su tìtulu de sa pàgina ch'as pediu est bùidu, isballiau, o iscritu in is cullegamentus inter-wiki in manera non currègia o cun caràteres no amìtius.",
 'viewsource' => 'Càstia mitza',
 'actionthrottled' => 'Atzione rimandada',
-'sqlhidden' => '(Consulta SQL cuada)',
 'namespaceprotected' => "Non tenes su permissu de acontzare is pàginas in su nùmene-lugu '''$1'''.",
 'ns-specialprotected' => 'Is pàginas ispetziales non podent èssere acontzadas.',
 
@@ -631,7 +622,6 @@ Cosas de ammentare: '''({{int:cur}})''' = diferèntzias cun sa versione currente
 'shown-title' => 'Ammustra $1 {{PLURAL:$1|resurtadu|resurtados}} pro pàgina',
 'viewprevnext' => 'Càstia ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Possibilidades de chirca',
-'searchhelp-url' => 'Help:Agiudu',
 'searchprofile-everything' => 'Totu',
 'searchprofile-advanced' => 'Avantzada',
 'searchprofile-articles-tooltip' => 'Chirca in $1',
@@ -660,14 +650,6 @@ Prova a seberare ''totu:'' pro chircare in totu su cuntènnidu (inclùdidas pàg
 'powersearch-toggleall' => 'Totu',
 'powersearch-togglenone' => 'Nudda',
 
-# Quickbar
-'qbsettings' => 'Settaggio della barra menu',
-'qbsettings-none' => 'Nessuno',
-'qbsettings-fixedleft' => 'Fisso a sinistra',
-'qbsettings-fixedright' => 'Fisso a destra',
-'qbsettings-floatingleft' => 'Fluttuante a sinistra',
-'qbsettings-floatingright' => 'Fluttuante a destra',
-
 # Preferences page
 'preferences' => 'Preferèntzias',
 'mypreferences' => 'Preferèntzias meas',
@@ -925,8 +907,6 @@ Càstia sa [[Special:NewFiles|galleria de files nous]] pro una presentada prus b
 'statistics-header-users' => 'Statìsticas subra is usuàrios',
 'statistics-pages' => 'Pàginas',
 
-'disambiguationspage' => 'Template:Disambìgua',
-
 'doubleredirects' => 'Redirects dòpios',
 'doubleredirectstext' => 'Custa pàgina cuntenet una lista de pàginas ki re-indiritzant a àteras pàginas de re-indiritzamentu.
 Ogni lìnia cuntenet ligàmines a su primu e a su de duos re-indiritzamentu, aici comente sa prima lìnia de sa de duos re-indiritzamentos, chi de sòlitu adòbiat s\'artìculu "beru", a sa cale fintzas su primu re-indiritzamentu dia depet puntare.
@@ -1228,8 +1208,6 @@ Abbàida sa [[Special:BlockList|lista de IP bloccados]] pro bìder sas bloccadur
 'blocklogentry' => 'bloccau [[$1]] pro unu tempu de $2 $3',
 'unblocklogentry' => 'at sbloccau $1',
 'block-log-flags-nocreate' => 'creatzione account bloccada',
-'blockme' => 'Blocca·mi',
-'proxyblocksuccess' => 'Fatu.',
 'sorbs' => 'DNSBL',
 
 # Developer tools
@@ -1428,14 +1406,14 @@ Is acàpius chi sighint in sa matessi lìnia sunt cunsideraus comente eccetzione
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-artist' => 'Autore',
 'exif-exposuretime-format' => '$1 s ($2)',
 'exif-fnumber-format' => 'f/$1',
 'exif-flash' => 'Flash',
 'exif-focallength-format' => '$1 mm',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-6' => 'JPEG',
 
 'exif-photometricinterpretation-2' => 'RGB',
@@ -1483,7 +1461,6 @@ Is acàpius chi sighint in sa matessi lìnia sunt cunsideraus comente eccetzione
 'semicolon-separator' => ';&#32;',
 'comma-separator' => ',&#32;',
 'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
 'word-separator' => '&#32;',
 'ellipsis' => '…',
 'percent' => '$1%',
@@ -1531,10 +1508,6 @@ Is acàpius chi sighint in sa matessi lìnia sunt cunsideraus comente eccetzione
 'version-license' => 'Licèntzia',
 'version-software-version' => 'Versione',
 
-# Special:FilePath
-'filepath-page' => 'Nùmene de su file:',
-'filepath-submit' => 'Bae',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Chirca',
 
diff --git a/languages/messages/MessagesScn.php b/languages/messages/MessagesScn.php
index 9ca19e3c..4a257c8d 100644
--- a/languages/messages/MessagesScn.php
+++ b/languages/messages/MessagesScn.php
@@ -182,9 +182,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ammustra lu nùmmiru di utenti ca sèquinu la pàggina',
 'tog-oldsig' => 'Firma attuali:',
 'tog-fancysig' => 'Interpitra li cumanna wiki nâ firma (senza liami automaticu)',
-'tog-externaleditor' => 'Usa di default nu editor esternu (sulu pi li esperti, abbisognanu mpustazzioni particulari pô tò computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => "Usa di default un prugramma di diff sternu (sulu pi utilizzatura sperti, addumanna l'usu di mpustazzioni particulari supra lu sò computer. [//www.mediawiki.org/wiki/Manual:External_editors Pi cchiossai nfurmazzioni.])",
-'tog-showjumplinks' => "Attiva li culligamenti accissìbbili 'và a'",
 'tog-uselivepreview' => "Attiva la funzioni ''Live preview'' (richiedi JavaScript; spirimintali)",
 'tog-forceeditsummary' => "Chiedi cunferma siddu l'uggettu dû canciamentu è vacanti",
 'tog-watchlisthideown' => "Ammuccia li mè canciamenti nta l'ossirvati spiciali",
@@ -197,6 +194,8 @@ $messages = array(
 'tog-diffonly' => "Nun visualizzari lu cuntinutu dâ pàggina quannu s'esequi na ''diff'' tra dui virsioni",
 'tog-showhiddencats' => 'Ammustra li catigurìi ammucciati.',
 'tog-norollbackdiff' => "Umettiri li ''diff'' doppu aviri fattu nu ''rollback''",
+'tog-useeditwarning' => 'Avvisa quannu si lasaa na paggina di canci cu canci nu sarbati',
+'tog-prefershttps' => 'Usa sempri na cunnissioni sicura quannu trasi',
 
 'underline-always' => 'sempri',
 'underline-never' => 'mai',
@@ -260,6 +259,18 @@ $messages = array(
 'oct' => 'utt',
 'nov' => 'nuv',
 'dec' => 'Dic',
+'january-date' => '$1 jinnaru',
+'february-date' => '$1 frivaru',
+'march-date' => '$1 di marzu',
+'april-date' => '$1 di aprili',
+'may-date' => '$1 di maiu',
+'june-date' => '$1 di giugnu',
+'july-date' => '$1 di giugnettu',
+'august-date' => '$1 di austu',
+'september-date' => '$1 di sittèmmiru',
+'october-date' => '$1 di uttùviru',
+'november-date' => '$1 di nuvèmmiru',
+'december-date' => '$1 di dicèmmiru',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Catigurìa|Catigurìi}}',
@@ -341,6 +352,7 @@ $messages = array(
 'create-this-page' => 'Crea sta pàggina',
 'delete' => 'elìmina',
 'deletethispage' => 'Elìmina sta pàggina',
+'undeletethispage' => 'Annulla la scancillazzioni di sta pàggina',
 'undelete_short' => 'Ricùpira {{PLURAL:$1|na rivisioni|$1 rivisioni}}',
 'viewdeleted_short' => 'Talìa {{PLURAL:$1|nu canciamentu scancillatu|$1 canciamenti scancillati}}',
 'protect' => 'Pruteggi',
@@ -382,7 +394,7 @@ $1",
 'pool-queuefull' => 'La cuda dû pool è china',
 'pool-errorunknown' => 'Erruri scanusciutu',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Àutri nfurmazzioni supra {{SITENAME}}',
 'aboutpage' => 'Project:Àutri nformazzioni',
 'copyright' => 'Lu cuntinutu è utilizzàbbili secunnu la $1.',
@@ -392,7 +404,6 @@ $1",
 'disclaimers' => 'Avvirtenzi',
 'disclaimerpage' => 'Project:Avvirtenzi ginirali',
 'edithelp' => 'Guida',
-'edithelppage' => 'Help:Canciamentu',
 'helppage' => 'Help:Cuntinuti',
 'mainpage' => 'Pàggina principali',
 'mainpage-description' => 'Pàggina principali',
@@ -469,17 +480,6 @@ L'alencu dî pàggini spiciali vàlidi s'attrova 'n [[Special:SpecialPages|Alenc
 # General errors
 'error' => 'Erruri',
 'databaseerror' => 'Erruri dû database',
-'dberrortext' => 'Erruri di sintassi ntâ richiesta nultrata a lu databbasi.
-Chistu putissi innicari la prisenza d\'un bug ntô software.
-L\'ùrtima query mannata a lu database fu:
-<blockquote><tt>$1</tt></blockquote>
-richiamata dâ funzioni "<tt>$2</tt>".
-Lu databbasi desi l\'erruri "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Erruri di sintassi ntâ richiesta nultrata a lu database.
-L\'ùrtima query mannata a lu database hà stata:
-"$1"
-richiamata dâ funzioni "$2".
-MySQL hà ristituitu lu siquenti erruri "$3: $4".',
 'laggedslavemode' => "Accura: La pàggina putissi nun ripurtari l'aggiurnamenti cchiù ricenti.",
 'readonly' => 'Database bluccatu',
 'enterlockreason' => "Ìnnica lu mutivu dû bloccu, spicificannu lu mumentu 'n cui è prisumìbbili ca veni rimossu.",
@@ -527,7 +527,6 @@ Query: $2',
 'viewyourtext' => "È pussibbili visualizzarei cupiari lu còdici surgenti dî '''tò canciamenti''' nti sta pàggina:",
 'protectedinterface' => "Sta pàggina cunteni un elementu ca fà parti dâ nterfaccia utenti dû software eggh'è  prutetta p'evitari pussìbbili abbusi. Pi jùnciri o canciari li traduzzioni pi tutti li wiki usari [//translatewiki.net/translatewiki.net] lu pruggettu di lucalizzazzioni di Mediawiki.",
 'editinginterface' => "'''Accura:''' Lu testu di sta pàggina fà parti dî interfaccia utenti dû situ. Tutti li canciamenti appurtati a sta pàggina si riflèttinu supra li missaggi visualizzati pi tutti l'utenti. Pi li traduzioni, cunsidira â pussibilità di usari [//translatewiki.net/wiki/Main_Page?setlang=scn translatewiki.net], u prugettu di localizzazioni MediaWiki.",
-'sqlhidden' => '(la query SQL hà statu ammucciata)',
 'cascadeprotected' => 'Supra sta pàggina nun è pussìbbili effittuari canciamenti pirchì veni nclusa nt{{PLURAL:$1|â pàggina siquenti, ca fu prutetta|ê pàggini siquenti, ca foru prutetti}} silizziunannu la prutizzioni "ricursiva":
 $2',
 'namespaceprotected' => "Nun hai lu pirmissu pi canciari li pàggini ntô namespace '''$1'''.",
@@ -551,10 +550,18 @@ Accura chi quarchi pàggina pò cuntinuari a èssiri ammustrata comu si nun avis
 'welcomeuser' => 'Bommegna, $1!',
 'welcomecreation-msg' => 'Lu cuntu fu criatu. Nun ascurdàriti di pirsunalizzari li prifirenzi pi {{SITENAME}}',
 'yourname' => "Lu tò nomu d'utenti (''user name'')",
+'userlogin-yourname' => 'Nomu utenti',
+'userlogin-yourname-ph' => 'Nzirìsci lu tò nomu utenti',
 'yourpassword' => "La tò ''password''",
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => 'Nzirisci la tò password',
+'createacct-yourpassword-ph' => 'Nzirisci na password',
 'yourpasswordagain' => "Scrivi la password n'àutra vota",
+'createacct-yourpasswordagain' => 'Cunfirma la password',
+'createacct-yourpasswordagain-ph' => 'Nzirisci la password attorna',
 'remembermypassword' => 'Arricorda la password supra stu computer (pi ô massimu $1 {{PLURAL:$1|jornu|jorna}})',
-'securelogin-stick-https' => 'Resta cunnittutu cu HTTPS doppu la trasuta',
+'userlogin-remembermypassword' => 'Mantènimi culligatu',
+'userlogin-signwithsecure' => 'Usa na cunnissioni sicura',
 'yourdomainname' => 'Lu tò dominiu',
 'password-change-forbidden' => 'Nun putiti canciari la password nti sta wiki',
 'externaldberror' => "S'havi virificatu n'erruri cû server d'autinticazzioni sternu, oppuru nun si disponi di l'auturizzazzioni nicissari p'aggiurnari lu propiu accessu sternu.",
@@ -566,14 +573,32 @@ Accura chi quarchi pàggina pò cuntinuari a èssiri ammustrata comu si nun avis
 'logout' => 'Nesci',
 'userlogout' => 'Nesci',
 'notloggedin' => "Nun v'aviti riggistratu",
+'userlogin-noaccount' => "Nun ci l'hai nu cuntu?",
+'userlogin-joinproject' => 'Scrìviti a {{SITENAME}}',
 'nologin' => "Nun nn'aviti nu cuntu pi ccà? '''$1'''.",
 'nologinlink' => 'Criati nu cuntu sùbbitu',
 'createaccount' => 'Criati un cuntu novu',
 'gotaccount' => "Hai già nu cuntu? '''$1'''.",
 'gotaccountlink' => 'Trasi',
 'userlogin-resetlink' => "T'ascurdasti li dittagli pâ trasuta?",
+'userlogin-resetpassword-link' => 'Reinizzializza la tò password',
+'helplogin-url' => 'Help:Cunnissioni',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aiutu câ fasi di login]]',
+'createacct-join' => 'Nzirisci li tò nfurnazzioni ccà',
+'createacct-emailrequired' => 'Nnirizzu e-mail',
+'createacct-emailoptional' => 'Nnirizzu e-mail (facurtativu)',
+'createacct-email-ph' => 'Nzirisci lu tò nnirizzu e-mail',
 'createaccountmail' => 'Utilizzari na password timpurania casuali e mannàrila ô nnirizzu e-mail spicificatu ccàssutta',
+'createacct-realname' => 'Nomu riali (facurtativu)',
 'createaccountreason' => 'Mutivu:',
+'createacct-reason' => 'Mutivu',
+'createacct-reason-ph' => "Pirchì stai criannu n'àutru cuntu?",
+'createacct-captcha' => 'Cuntrollu di sicurezza',
+'createacct-imgcaptcha-ph' => 'Nzirìsci lu testu ca vidi ccassupra',
+'createacct-submit' => 'Crèa nu cuntu',
+'createacct-benefit-heading' => '{{SITENAME}} è fatta di pirsunu comu a tìa.',
+'createacct-benefit-body1' => '{{PLURAL:$1|cuntribbutu|cuntribbuti}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pàggina|pàggini}}',
 'badretype' => "La ''password'' chi mittisti nun è bona.",
 'userexists' => 'Lu nomu utenti nzeritu è già usatu. Ti prijamu pirciò di vuliri scègghiri nu nomu utenti diversu.',
 'loginerror' => "Erruri nta l'accessu",
@@ -636,7 +661,7 @@ Aspetta tanticchia prima di pruvari  n'àutra vota.",
 'newpassword' => 'Password nova:',
 'retypenew' => "Scrivi n'àutra vota la password",
 'resetpass_submit' => 'Mposta la password e accedi',
-'resetpass_success' => "Lu canciu password hà statu effittuatu cu successu! Ora stai effittuannu l'accessu...",
+'changepassword-success' => "Lu canciu password hà statu effittuatu cu successu! Ora stai effittuannu l'accessu...",
 'resetpass_forbidden' => 'Li password nun ponnu èssiri canciati sùpira sta wiki',
 'resetpass-no-info' => 'Pi tràsiri nta sta pàggina hà èssiri riggistratu',
 'resetpass-submit-loggedin' => 'Cancia la password',
@@ -647,6 +672,7 @@ Pò èssiri ca ggià canciasti cu successu la tò password o c'addumannasti na n
 
 # Special:PasswordReset
 'passwordreset' => 'Resetta la password',
+'passwordreset-text-one' => 'Jinchi stu mòdulu pi reimpostari la password',
 
 # Special:ChangeEmail
 'changeemail-submit' => 'Cancia e-mail',
@@ -814,6 +840,7 @@ Nun desi nudda spiecazzioni.",
 Pari ca fu scancillata.',
 'edit-conflict' => 'Cunflittu di edizzioni.',
 'edit-no-change' => 'La mudifica fu ignurata pirchì nu foru appurtati canci ntô testu.',
+'postedit-confirmation' => 'Lu canciamentu fu sarbatu.',
 'edit-already-exists' => 'Mpussìbbili criari na nova pàggina.
 Esisti ggià.',
 
@@ -1010,7 +1037,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 'searchmenu-legend' => 'Opzioni di circata',
 'searchmenu-exists' => "* Pàggina '''[[$1]]'''",
 'searchmenu-new' => "'''Crea la pàggina \"[[:\$1]]\" supra sta wiki!'''",
-'searchhelp-url' => 'Help:Cuntinuti',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Visualizza li pàggini cu stu prifissu]]',
 'searchprofile-articles' => 'Pàggini di cuntinutu',
 'searchprofile-project' => "Pàggini d'ajutu e dô pruggettu",
@@ -1052,14 +1078,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 'search-external' => 'Ricerca sterna',
 'searchdisabled' => 'La circata nterna di {{SITENAME}} hà statu disabbilitata. Nta stu mentri, poi usari la circata supra Google o supra àutri muturi di circata. Accura ca li sò ìnnici dê cuntinuti di {{SITENAME}} ponnu nun èssiri aggiurnati.',
 
-# Quickbar
-'qbsettings' => 'Pusizzioni QuickBar',
-'qbsettings-none' => 'Nuddu',
-'qbsettings-fixedleft' => 'Fissu a manu manca',
-'qbsettings-fixedright' => 'Fissu a manu dritta',
-'qbsettings-floatingleft' => 'Fluttuanti a manu manca',
-'qbsettings-floatingright' => 'Fluttuanti a manu dritta',
-
 # Preferences page
 'preferences' => 'prifirenzi',
 'mypreferences' => 'Li mè prifirenzi',
@@ -1089,7 +1107,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 'resetprefs' => 'Annulla',
 'restoreprefs' => 'Ripristina li mpustazzioni di default',
 'prefs-editing' => 'Cancia',
-'prefs-edit-boxsize' => 'Diminzioni dâ finestra di mudìfica.',
 'rows' => 'Righi:',
 'columns' => 'Culonni:',
 'searchresultshead' => 'Circata',
@@ -1100,7 +1117,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 'recentchangesdays-max' => '(màssimu $1 {{PLURAL:$1|jornu|jorna}})',
 'recentchangescount' => 'Nùmmiru di canciamenti da ammustrari di default:',
 'prefs-help-recentchangescount' => 'Ciò includi li canciamenti ricenti, storii e riggistri.',
-'prefs-help-watchlist-token' => "Cumpilannu stu campu cu na chiavi sigreta sarà giniratu nu feed RSS pi propri ossirvati spiciali. Chiunqui sa sta chiavi ni stu campu putrà leggiri li osservati speciali, quindi assicurati di nsiriri nu valori sicuru. Ccà c'è nu valori ginirato casualmenti ca si pò usari: $1",
 'savedprefs' => 'Li tò prifirenzi foru sarvati.',
 'timezonelegend' => 'Fusu orariu:',
 'localtime' => 'Uràriu lucali',
@@ -1130,7 +1146,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 'prefs-reset-intro' => "È pussibili usari sta pàggina pi reimpustari li propri prifirenzi a chiddi pridifiniti dô situ.
 L'operazioni nun pò èssiri annullata.",
 'prefs-emailconfirm-label' => 'Conferma dâ e-mail:',
-'prefs-textboxsize' => 'Diminsioni dâ casedda di canciamentu',
 'youremail' => 'Lu tò nnirizzu email:',
 'username' => "Nomu d'utenti:",
 'uid' => 'ID utenti:',
@@ -1350,7 +1365,6 @@ L'operazioni nun pò èssiri annullata.",
 'recentchangeslinked-feed' => 'Canciamenti culligati',
 'recentchangeslinked-toolbox' => 'Canciamenti culligati',
 'recentchangeslinked-title' => 'Canciamenti culligati a "$1"',
-'recentchangeslinked-noresult' => 'Nuddu canciamentu ê pàggini culligati ntô pirìudu spicificatu.',
 'recentchangeslinked-summary' => "Chista pàggina spiciali ammustra li canciamenti cchiù ricenti ê pàggini culligati a chidda spicificata. Li pàggini taliati ni la tou [[Special:Watchlist|lista taliata]] sunu evidenziati 'n '''grassettu'''.",
 'recentchangeslinked-page' => 'Nnomu dâ pàggina:',
 'recentchangeslinked-to' => 'Vidi sulu li canciamenti ê pàggini culligati a chidda spicificata',
@@ -1596,11 +1610,6 @@ Appressu veni ammustrata la discrizioni prisenti nâ [$2 paggina di discrizzioni
 'statistics-users-active-desc' => "Utilizzatura chi fìciru n'azzioni {{PLURAL:$1|ni l'ultimu ionnu|nî l'ultimi $1 ionna}}",
 'statistics-mostpopular' => 'Pàggini cchiù visitati',
 
-'disambiguations' => 'Pàggini cu liami ambìgui',
-'disambiguationspage' => 'Template:Disambigua',
-'disambiguations-text' => "Li pàggini ntâ lista ca sequi cuntèninu dî culligamenti a '''pàggini di disambiguazzioni''' e nun a l'argumentu cui avìssiru a fari rifirimentu.<br />
-Vèninu cunzidirati pàggini di disambiguazzioni tutti chiddi ca cuntèninu li template alincati 'n [[MediaWiki:Disambiguationspage]]",
-
 'doubleredirects' => 'Rinnirizzamenti duppi',
 'doubleredirectstext' => 'Chista pàggina alenca li pàggini chi rinnirìzzanu a àutri pàggini di rinnirizzamentu.
 Ognuna riga cunteni li culligamenti a lu primu e a lu secunnu redirect, oltri â prima riga di testu dû secunnu redirect ca di sòlitu cunteni la pàggina di distinazzioni "curretta" â quali avissi a puntari macari lu primu redirect.
@@ -1812,10 +1821,9 @@ Protucolli suppurtati: <code>$1</code>',
 'unwatchthispage' => 'Smetti di sèquiri',
 'notanarticle' => "Nun è n'artìculu",
 'notvisiblerev' => 'La revisioni fu cancillata',
-'watchnochange' => 'Nudda dî pàggini ossirvati hà statu canciata ntô pirìudu cunzidiratu.',
 'watchlist-details' => 'La lista dê pàggini taliati cunteni {{PLURAL:$1|na pàggina (cu la rispittiva pàggina di discussioni)|$1 pàggini (cu li rispittivi pàggini di discussioni)}}.',
-'wlheader-enotif' => '* La nutìfica via e-mail è attivata.',
-'wlheader-showupdated' => "* Li pàggini ca hannu statu canciati dâ tò ùrtima vìsita sunnu evidinziati 'n '''grassettu'''",
+'wlheader-enotif' => 'La nutìfica via e-mail è attivata.',
+'wlheader-showupdated' => "Li pàggini ca hannu statu canciati dâ tò ùrtima vìsita sunnu evidinziati 'n '''grassettu'''",
 'watchmethod-recent' => "cuntrollu dî canciamenti ricenti pi l'ossirvati spiciali",
 'watchmethod-list' => "cuntrollu di l'ossirvati spiciali pi canciamenti ricenti",
 'watchlistcontains' => 'La tò lista di ossirvati spiciali cunteni {{PLURAL:$1|na pàggina|$1 pàggini}}.',
@@ -2137,11 +2145,8 @@ Pi maggiuri nfurmazzioni, talìa la [[Special:BlockList|lista di l'IP bluccati]]
 'ipb_cant_unblock' => 'Erruri: Mpussìbbili attruvari lu bloccu cu ID $1. Putissi aviri già statu sbluccatu.',
 'ipb_blocked_as_range' => 'Sbagghiu: Lu ndirizzu IP $1 nun è suggettu a bloccu ndividuali e non pò èssiri sbloccatu. Lu bloccu è attivu mmeci a liveddu dû ntirvallu $2, ca pò èssiri sbluccatu.',
 'ip_range_invalid' => 'Ntervallu di ndirizzi IP nun vàlidu.',
-'blockme' => 'Blocca a mia',
 'proxyblocker' => 'Blocca proxy',
-'proxyblocker-disabled' => 'Sta funzioni nun è attiva.',
 'proxyblockreason' => "Lu tò ndirizzu IP hà statu bluccatu pirchì è un open proxy. Pi favuri cuntatta lu tò furnituri d'accessu a Internet o lu supportu tècnicu e nfòrmali di stu gravi prubbrema di sicurizza.",
-'proxyblocksuccess' => 'Esiquitu.',
 'sorbsreason' => 'Lu tò ndirizzu IP è alincatu comu proxy apertu ntâ lista DNSBL.',
 'sorbs_create_account_reason' => 'Lu tò ndirizzu IP è alincatu comu open proxy ntâ DNSBL. Nun poi criari un utenti.',
 'cant-block-while-blocked' => 'Nun putiti bluccari àutri utenti ntô mentri ca vui stissi siti bluccati.',
@@ -2430,13 +2435,8 @@ Visita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//trans
 'pageinfo-toolboxlink' => 'Nfurmazzioni ncapu la pàggina',
 
 # Skin names
-'skinname-standard' => 'Classicu',
-'skinname-nostalgia' => 'Nustargìa',
 'skinname-cologneblue' => 'Cologne Blu',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Sìmprici',
 'skinname-modern' => 'Mudernu',
 
 # Patrolling
@@ -2521,7 +2521,7 @@ Li lijami succissivi, supra la stissa riga, sunnu cunzidirati comu eccizzioni (p
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larghizza',
 'exif-imagelength' => 'Autizza',
 'exif-bitspersample' => 'Bit pi campiuni',
@@ -2635,7 +2635,7 @@ Li lijami succissivi, supra la stissa riga, sunnu cunzidirati comu eccizzioni (p
 'exif-gpsdatestamp' => 'Data GPS',
 'exif-gpsdifferential' => 'Currezzioni diffirinziali GPS',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nuddu',
 
 'exif-unknowndate' => 'Data scanusciuta',
@@ -2917,7 +2917,6 @@ Stu còdici di cunferma scadi automaticamenti a li $4.',
 'version-other' => 'Àutru',
 'version-mediahandlers' => 'Gistori di cuntinuti multimediali',
 'version-hooks' => 'Hook',
-'version-extension-functions' => 'Funzioni ntrudotti di estenzioni',
 'version-parser-extensiontags' => 'Tag canusciuti dô parser ntrudotti di estenzioni',
 'version-parser-function-hooks' => 'Hook pi funzioni dû parser',
 'version-hook-name' => "Nomu di l'hook",
@@ -2928,14 +2927,6 @@ Stu còdici di cunferma scadi automaticamenti a li $4.',
 'version-software-product' => 'Prodottu',
 'version-software-version' => 'Virsioni',
 
-# Special:FilePath
-'filepath' => 'Pircorsu di nu file',
-'filepath-page' => 'Nnomu dô file:',
-'filepath-submit' => 'Pircorsu',
-'filepath-summary' => 'Sta pàggina spiciali rimanna arredi lu traggittu cumpretu di nu file. Li mmàggini sù ammustrati cu la cchiù àuta risoluzzioni dispunìbbili, pi l\'àutri tipi di file parti direttamenti lu prugramma assuciatu.
-
-Mèttiri lu nomu dû file senza lu prifissu "{{ns:file}}:"',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Circata dê file duppiuni',
 'fileduplicatesearch-summary' => "Circata di pussìbbili dupppiuni dû file 'n basi ô valuri di ''hash''.",
@@ -3011,6 +3002,7 @@ Mèttiri lu nomu dû file senza lu prifissu "{{ns:file}}:"',
 'htmlform-submit' => 'Mànna',
 'htmlform-reset' => 'Annulla li canciamenti',
 'htmlform-selectorother-other' => 'Àutru',
+'htmlform-chosen-placeholder' => 'Silizziona na opzioni',
 
 # New logging system
 'logentry-delete-delete' => '$1 cancillau la pàggina $3',
diff --git a/languages/messages/MessagesSco.php b/languages/messages/MessagesSco.php
index 0e7fe6e7..736c64fe 100644
--- a/languages/messages/MessagesSco.php
+++ b/languages/messages/MessagesSco.php
@@ -52,9 +52,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Shaw ma email address in notification mails',
 'tog-shownumberswatching' => 'Shaw the nummer o watching uisers',
 'tog-fancysig' => 'Raw seignaturs (athoot automatic airtin)',
-'tog-externaleditor' => 'Uise external editor bi defaut',
-'tog-externaldiff' => 'Uise external diff bi defaut',
-'tog-showjumplinks' => 'Enable "loup til" accessibility airtins',
 'tog-uselivepreview' => 'Uise leeve preview (JavaScript) (Prattik)',
 'tog-forceeditsummary' => 'Gie me a jottin when A dinnae put in a edit summary',
 'tog-watchlisthideown' => 'Hide yer ain edits frae yer watchleet',
@@ -233,7 +230,7 @@ $messages = array(
 'jumptonavigation' => 'navigation',
 'jumptosearch' => 'rake',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Aboot {{SITENAME}}',
 'aboutpage' => 'Project:Aboot',
 'copyright' => 'Aa text is available unner $1',
@@ -243,7 +240,6 @@ $messages = array(
 'disclaimers' => 'Disclamation',
 'disclaimerpage' => 'Project:General_disclamation',
 'edithelp' => 'Editin help',
-'edithelppage' => 'Help:Editin',
 'helppage' => 'Help:Contents',
 'mainpage' => 'Main Page',
 'mainpage-description' => 'Main Page',
@@ -312,8 +308,6 @@ A leet o valid byordinar pages can be funnd at [[Special:SpecialPages|{{int:spec
 # General errors
 'error' => 'Error',
 'databaseerror' => 'Database error',
-'dberrortext' => 'A database query syntax error haes occurt. This micht indicate a bug in the saftware. The last attemptit database query wis: <blockquote><tt>$1</tt></blockquote> frae athin function "<tt>$2</tt>". Database returned error "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'A database query syntax error haes occurt. The last attemptit database query wis: "$1" frae athin function "$2". Database returned error "$3: $4".',
 'laggedslavemode' => 'Warning: Page micht nae contain recent updates',
 'readonly' => 'Database lockit',
 'enterlockreason' => "Enter a raeson for the lock, includin an estimate o whan the lock'll be lowsed",
@@ -359,7 +353,6 @@ Aks: $2',
 'editinginterface' => "'''Warning:''' You are editing a page which is used to provide interface text for the software.
 Changes to this page will affect the appearance of the user interface for other users.
 For translations, please consider using [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden' => '(SQL query hidden)',
 'cascadeprotected' => 'This page haes been protectit fra editin, acause it is includit in the followin {{PLURAL:$1|page|pages}}, that are protectit wi the "cascading" option turnit on:
 $2',
 'namespaceprotected' => "Ye dinna hae permeession tae edit pages in the '''$1''' namespace.",
@@ -454,7 +447,7 @@ Ye dinna hae tae heed this message, if this accoont wis creatit by mistak.',
 'oldpassword' => 'Auld password',
 'newpassword' => 'New passwaird:',
 'resetpass_submit' => 'Mak passwaird an log in',
-'resetpass_success' => 'Yer passwaird chynge wis braw! Nou loggin ye in...',
+'changepassword-success' => 'Yer passwaird chynge wis braw! Nou loggin ye in...',
 'resetpass_forbidden' => 'Passwords canna be chynged',
 'resetpass-no-info' => 'Ye maun be loggit in tae access this page directly.',
 'resetpass-submit-loggedin' => 'Chynge passwaird',
@@ -709,7 +702,6 @@ there micht be parteeculars in the [{{fullurl:{{#Special:Log}}/suppress|page={{F
 'viewprevnext' => 'View ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''There is a page named \"[[:\$1]]\" oan this wiki.'''",
 'searchmenu-new' => "'''Mak the page \"[[:\$1]]\" on this wiki!'''",
-'searchhelp-url' => 'Help:Contents',
 'searchprofile-articles' => 'Content pages',
 'searchprofile-project' => 'Help and Project pages',
 'searchprofile-images' => 'Multimedia',
@@ -739,9 +731,6 @@ there micht be parteeculars in the [{{fullurl:{{#Special:Log}}/suppress|page={{F
 'powersearch-toggleall' => 'Aw',
 'searchdisabled' => 'Rakin throu {{SITENAME}} is disabled for performance raesons. Ye can rake via Google juist nou. Mynd that thair indexes o {{SITENAME}} content micht be oot o date.',
 
-# Quickbar
-'qbsettings-none' => 'Nane',
-
 # Preferences page
 'mypreferences' => 'Ma preferences',
 'prefsnologin' => 'No loggit in',
@@ -855,7 +844,6 @@ Yer e-mail address insae revealed whin ither uisers contact ye.",
 'recentchangeslinked-feed' => 'Relatit chynges',
 'recentchangeslinked-toolbox' => 'Relatit chynges',
 'recentchangeslinked-title' => 'Changes related to "$1"',
-'recentchangeslinked-noresult' => "Na changes oan linked pages during th' given period.",
 'recentchangeslinked-summary' => "This is a leet o' changes made recently tae pages linked frae a specified page (or tae members o' a specified category).
 Pages on [[Special:Watchlist|your watchleet]] are '''bold'''.",
 'recentchangeslinked-page' => 'Page name:',
@@ -959,8 +947,6 @@ Th' description oan tis [$2 file description page] thare is shown below.",
 'statistics-header-hooks' => 'Ither statistics',
 'statistics-pages' => 'Pages',
 
-'disambiguationspage' => 'Template:disambig',
-
 'doubleredirects' => 'Dooble reguidals',
 'doubleredirectstext' => 'Ilka raw hauds airtins tae the first an saicont reguidal, as weel as the first line o the saicont reguidal text, for usual giein the "rael" tairget page, that the first reguidal shuid pynt til.',
 
@@ -1081,7 +1067,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchthispage' => 'Leuk ower this page',
 'unwatch' => 'Unwatch',
 'notanarticle' => 'No a content page',
-'watchnochange' => 'Nane o yer watched items were edited in the time period displayed.',
 'watchlist-details' => "{{PLURAL:$1|$1 page|$1 pages}} on yer watchleet, nae countin' collogue pages.",
 'watchlistcontains' => 'Yer watchleet contains $1 {{PLURAL:$1|page|pages}}.',
 'iteminvalidname' => "Trouble wi eitem '$1', invalid name...",
@@ -1245,7 +1230,6 @@ tae an afore-blockit IP address or uisername.',
 'block-log-flags-nocreate' => 'accoont-makkin blockit',
 'range_block_disabled' => 'The administrator abeility tae mak range blocks is disabled.',
 'proxyblockreason' => 'Yer IP address haes been blockit sith it is an open proxy. Please contact yer Internet service provider or tech support an inform them o this serious security problem.',
-'proxyblocksuccess' => 'Duin',
 'sorbsreason' => 'Yer IP address is leetit as an open proxy in the DNSBL.',
 'sorbs_create_account_reason' => 'Yer IP address is leetit as an open proxy in the DNSBL. Ye canna mak an accoont',
 
@@ -1452,7 +1436,7 @@ If th' file haes bin modified frae tis original state, some details kin nae full
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-copyright' => 'Copyricht hauder',
 'exif-colorspace' => 'Colour space',
 'exif-componentsconfiguration' => 'Meanin o ilka component',
@@ -1535,9 +1519,6 @@ Please confirm that ye really want tae recreate this airticle.",
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'Wairnin:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
 
-# Special:FilePath
-'filepath-page' => 'File:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Filename:',
 'fileduplicatesearch-submit' => 'Rake',
diff --git a/languages/messages/MessagesSd.php b/languages/messages/MessagesSd.php
index 1e83fcaa..3e8bbae9 100644
--- a/languages/messages/MessagesSd.php
+++ b/languages/messages/MessagesSd.php
@@ -311,7 +311,7 @@ $messages = array(
 'protectedpage' => 'تحفظيل صفحو',
 'jumptosearch' => 'ڳولا',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} بابت',
 'aboutpage' => 'Project:بابت',
 'copyright' => 'سمورو مواد $1 تحت ميسر ڪجي ٿو',
@@ -321,7 +321,6 @@ $messages = array(
 'disclaimers' => 'غيرجوابداريناما',
 'disclaimerpage' => 'Project:عام غيرجوابدارينامو',
 'edithelp' => 'مدد براءِ ترميم',
-'edithelppage' => 'Help:سنوارڻ',
 'helppage' => 'Help:فهرست',
 'mainpage' => 'مُک صفحو',
 'mainpage-description' => 'مُک صفحو',
@@ -524,7 +523,6 @@ You cannot use the 'e-mail this user' feature unless a valid e-mail address is s
 'prevn' => 'پويان {{PLURAL:$1|$1}}',
 'nextn' => 'اڳيان {{PLURAL:$1|$1}}',
 'viewprevnext' => 'ڏسو ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:فهرست',
 'powersearch' => 'نفيس ڳولا',
 'powersearch-redir' => 'چورڻن جي فهرست ڏيکاريو',
 
@@ -584,7 +582,6 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننڍي هوڻ گھرجي.',
 'recentchangeslinked-feed' => 'لاڳاپيل تبديليون',
 'recentchangeslinked-toolbox' => 'لاڳاپيل تبديليون',
 'recentchangeslinked-title' => '"$1" سان لاڳاپيل تبديليون',
-'recentchangeslinked-noresult' => 'ڄاڻايل مدي دوران ڳنڍيل صفحن ۾ ڪا به تبديلي ناهي ٿي.',
 
 # Upload
 'upload' => 'فائيل چاڙهيو',
@@ -629,8 +626,6 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننڍي هوڻ گھرجي.',
 # Statistics
 'statistics' => 'انگ اکر',
 
-'disambiguations' => 'سلجھائپ صفحا',
-
 'doubleredirects' => 'ٻٽا چورڻا',
 
 'brokenredirects' => 'ٽٽل چورڻا',
@@ -912,7 +907,7 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننڍي هوڻ گھرجي.',
 'metadata-expand' => 'توسيعي تفصيل ڏيکاريو',
 'metadata-collapse' => 'توسيعي تفصيل لڪايو',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ويڪر',
 'exif-imagelength' => 'اوچائي',
 'exif-bitspersample' => 'ٻٽڻيون في جُز',
diff --git a/languages/messages/MessagesSdc.php b/languages/messages/MessagesSdc.php
index e09bb1f6..2c4cb3b2 100644
--- a/languages/messages/MessagesSdc.php
+++ b/languages/messages/MessagesSdc.php
@@ -133,9 +133,6 @@ $messages = array(
 'tog-enotifrevealaddr' => "Rivera lu me' indirizzu di postha erettrònica i' l'imbasciaddi d'avvisu",
 'tog-shownumberswatching' => "Musthra lu nùmaru d'utenti ch'àni la pàgina abbaidadda",
 'tog-fancysig' => "Interpreta i cumandi wiki i' la fimma (chena cullegaumentu otomatiggu)",
-'tog-externaleditor' => 'Impustha cumenti pridifiniddu un cumponidori di testhi esthernu',
-'tog-externaldiff' => 'Impustha cumenti pridifiniddu un prugramma di diff esthernu',
-'tog-showjumplinks' => "Attiba li cullegamenti atzessibili 'vai a'",
 'tog-uselivepreview' => "Attiba la funzioni ''Live preview'' (dumanda JavaScript; ippirimintari)",
 'tog-forceeditsummary' => "Dumanda cunfèimma si l'oggettu di la mudìfigga è bioddu",
 'tog-watchlisthideown' => "Cua li me' mudìfigghi i' l'abbaidaddi ippiziari",
@@ -296,7 +293,7 @@ $messages = array(
 'jumptonavigation' => 'nabiggazioni',
 'jumptosearch' => 'zercha',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Infuimmazioni in {{SITENAME}}',
 'aboutpage' => 'Project:Infuimmazioni',
 'copyright' => "Cuntinuddi suggetti a licèntzia d'usu $1.",
@@ -306,7 +303,6 @@ $messages = array(
 'disclaimers' => 'Avvirthènzi',
 'disclaimerpage' => 'Project:Avvirthènzi ginarari',
 'edithelp' => 'Ghia',
-'edithelppage' => 'Help:Mudìfigga',
 'helppage' => 'Help:Indizi',
 'mainpage' => 'Pàgina prinzipari',
 'mainpage-description' => 'Pàgina prinzipari',
@@ -370,17 +366,6 @@ $messages = array(
 # General errors
 'error' => 'Errori',
 'databaseerror' => 'Errori di la bancadati',
-'dberrortext' => 'Errori di sintassi i\' la prigonta inviadda a la bancadati.
-Lu chi pudaria indicà la prisènzia d\'un bacu i\' lu software.
-L\'ulthima interrogazioni inviadda a la bancadati è isthadda:
-<blockquote><tt>$1</tt></blockquote>
-riciamadda da la funzioni "<tt>$2</tt>".
-MySQL à turraddu lu sighenti errori "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Errori di sintassi i\' la prigonta inviadda a la bancadati.
-L\'ulthima interrogazioni inviadda a la bancadati è isthadda:
-"$1"
-riciamadda da la funzioni "$2".
-MySQL à turraddu lu sighenti errori "$3: $4".',
 'laggedslavemode' => "Attinzioni: la pàgina pudia no cuntinì l'aggiornamenti più rizzenti.",
 'readonly' => 'Bancadati broccadda',
 'enterlockreason' => 'Indica lu mutibu di lu broccu, ippizzifichendi candu po’ assé chi venghia buggaddu.',
@@ -423,7 +408,6 @@ Interrogazioni: $2",
 'viewsourcetext' => 'È pussìbiri visuarizzà e cupià lu còdizi di chistha pàgina:',
 'protectedinterface' => "Chistha pàgina cunteni un'erementu chi fazzi parthi di l'interfàccia utenti di lu software; è dunca prutiggidda pa evità pussìbiri abusi.",
 'editinginterface' => "'''Attinzioni:''' Lu testhu di chistha pàgina fazzi parthi di l'interfàccia utenti di lu situ. Tutti li mudìfigghi arriggaddi a chistha pàgina si rifrèttini i' l'imbasciaddi visuarizzaddi pa tutti l'utenti. Pa li traduzioni, pa piazeri utirizà [//translatewiki.net/wiki/Main_Page?setlang=sdc translatewiki.net], lu prugettu di lucarizazioni MediaWiki.",
-'sqlhidden' => "(l'interrogazioni SQL è isthadda cuadda)",
 'cascadeprotected' => 'In chistha pàgina nò è pussìbiri effettuà mudìfigghi parchí è isthadda incrusa {{PLURAL:$1|i la sighenti pàgina indicadda, ch\'è isthadda prutiggidda|i li sighenti pàgini indicaddi, chi so isthaddi prutiggiddi}} chirriendi la prutizioni "ricussiba":
 $2',
 'namespaceprotected' => "Nò si diponi di li pimmissi nezzessàri pa mudifiggà li pagini di lu tipu di pagina '''$1'''.",
@@ -512,7 +496,7 @@ Pa cumprità la registhrazioni è nezzessàriu impusthà una noba paràura d'ór
 'newpassword' => "Noba paràura d'órdhini:",
 'retypenew' => "Turra a ischribì la noba paràura d'órdhini:",
 'resetpass_submit' => "Impustha la paràura d'órdhini e intra",
-'resetpass_success' => "La paràura d'órdhini tóia è isthadda mudìfiggadda. Abà sei intrendi...",
+'changepassword-success' => "La paràura d'órdhini tóia è isthadda mudìfiggadda. Abà sei intrendi...",
 'resetpass_forbidden' => "No è pussìbiri mudifiggà li paràuri d'órdhini in {{SITENAME}}.",
 
 # Edit page toolbar
@@ -776,7 +760,6 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
 'nextn' => 'sighenti {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Vèdi ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Opzioni di zercha',
-'searchhelp-url' => 'Help:Indizi',
 'searchprofile-everything' => 'Tuttu',
 'search-result-size' => '$1 ({{PLURAL:$2|una paraura|$2 parauri}})',
 'search-redirect' => '(rinviu $1)',
@@ -800,14 +783,6 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
 'powersearch-togglenone' => 'Nisciunu',
 'searchdisabled' => 'Abà no pói zirchà in {{SITENAME}}; proba cun Google o sìmiri, ma ammèntaddi chi li cuntinuddi di {{SITENAME}} poni assé no aggiornaddi.',
 
-# Quickbar
-'qbsettings' => 'Prifirenzi di lu menù',
-'qbsettings-none' => 'Nisciunu',
-'qbsettings-fixedleft' => 'Fissu a manca',
-'qbsettings-fixedright' => 'Fissu a drestha',
-'qbsettings-floatingleft' => 'Galliggianti a manca',
-'qbsettings-floatingright' => 'Galliggianti a drestha',
-
 # Preferences page
 'preferences' => 'Prifirenzi',
 'mypreferences' => "Li me' prifirenzi",
@@ -951,7 +926,6 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
 'recentchangeslinked-feed' => 'Mudìfigghi curriraddi',
 'recentchangeslinked-toolbox' => 'Mudìfigghi curriraddi',
 'recentchangeslinked-title' => 'Mudìfigghi curriraddi a "$1"',
-'recentchangeslinked-noresult' => "Nisciuna mudìfigga a li pàgini curriraddi i' lu perìodu sciubaraddu.",
 'recentchangeslinked-summary' => "Chistha pàgina ippiziari musthra li mudìfigghi più rizzenti a li pàgini curriraddi a chidda sciubaradda (o a li membri di un'ippizzifica categuria). Li [[Special:Watchlist|pàgini abbaidaddi]] so evidenziaddi in '''grasseddu'''.",
 'recentchangeslinked-page' => 'Innòmmu di la pàgina:',
 'recentchangeslinked-to' => 'Musthra soru li mudifigghi a li pagini curriraddi a chidda isciubaradda',
@@ -1128,10 +1102,6 @@ Si si diponi di l'immàgina i' la risoruzioni originari, pa piazeri carriggalla.
 'statistics-pages' => 'Pagini',
 'statistics-mostpopular' => 'Pàgini più visitaddi',
 
-'disambiguations' => 'Pàgini cu lu matessi innòmmu',
-'disambiguationspage' => 'Template:Matessi innòmmu',
-'disambiguations-text' => "Li pàgini i' la sighenti listha cuntènani cullegamenti a '''pàgini cu' lu matessi innòmmu''' e nò a la rasgiòni a chi dubaristhia fà rifirimentu.<br />So cunsidaraddi pàgini cu lu matessi innòmmu tutti chissi chi cuntènini li mudelli erencaddi in [[MediaWiki:Disambiguationspage]].",
-
 'doubleredirects' => 'Rinvii doppi',
 'doubleredirectstext' => 'Inogghi v\'è una listha di li pàgini chi puntani a pàgini di rinviu. Ogna riga cunteni i cullegamenti a lu primmu e sigundu rinviu, cumenti a la disthinazioni di lu sigundu rinviu, che noimmaimmenti è la pàgina "curretta" a la quari dubia puntà puru lu primmu rinviu.',
 
@@ -1283,10 +1253,9 @@ Si daboi s'à gana d'eliminà la pàgina da la listha di l'abbaidaddi ippiziarii
 'unwatchthispage' => 'Zissa di sighì',
 'notanarticle' => 'Chistha pàgina nò è una bozi',
 'notvisiblerev' => 'La ribisioni è isthadda canzilladda',
-'watchnochange' => "Nisciuna di li pàgini abbaidaddi è isthadda mudìfiggadda i' lu perìodu cunsidaraddu.",
 'watchlist-details' => "La listha di l'abbaidaddi ippiziari cunteni {{PLURAL:$1|una pagina (e la rippettiba pagina di dischussioni)|$1 pagini (e li rippettibi pagini di dischussioni)}}.",
-'wlheader-enotif' => '* La nutìfica via postha erettrònica è attiba.',
-'wlheader-showupdated' => "* Li pàgini chi so isthaddi mudìfiggaddi daboi l'ulthima vìsita so evidenziaddi in '''grasseddu'''",
+'wlheader-enotif' => 'La nutìfica via postha erettrònica è attiba.',
+'wlheader-showupdated' => "Li pàgini chi so isthaddi mudìfiggaddi daboi l'ulthima vìsita so evidenziaddi in '''grasseddu'''",
 'watchmethod-recent' => "cuntrollu di li mudìfigghi rizzenti pa l'abbaidaddi ippiziari",
 'watchmethod-list' => "cuntrollu di l'abbaidaddi ippiziari pa mudìfigghi rizzenti",
 'watchlistcontains' => "La listha di l'abbaidaddi ippiziari cunteni {{PLURAL:$1|una pàgina|$1 pàgini}}.",
@@ -1544,11 +1513,8 @@ $1",
 'ipb_cant_unblock' => 'Errori: Impussìbiri acciappà lu broccu cun ID $1. Lu broccu pudia assé già isthaddu buggaddu.',
 'ipb_blocked_as_range' => "Errori: L'indirizzu IP $1 nò è broccaddu individuaimmenti e nò pó assé ibbruccaddu. Lu broccu è inveci attibu a libellu di l'intervallu  $2, chi pó assé ibbruccaddu.",
 'ip_range_invalid' => "Intervallu d'indirizzi ip nò vàriddu.",
-'blockme' => 'Broccami',
 'proxyblocker' => 'Broccu di li proxy abbérthi',
-'proxyblocker-disabled' => 'Chistha funzioni nò è attiba.',
 'proxyblockreason' => "Chisth'indirizzu IP è isthaddu broccaddu parchí risultha assé un proxy abbérthu. Pa piazeri cuntattà lu propriu frunidori di sivvìzi pa la reti pa infuimmalli di chisthu grabi probrema di sigguriddai.",
-'proxyblocksuccess' => 'Broggu eseguiddu.',
 'sorbsreason' => "Chisth'indirizzu IP è erencaddu cumenti proxy abbérthu i' la listha-niedda DNSBL utirizadda da {{SITENAME}}.",
 'sorbs_create_account_reason' => "Nò è pussìbiri crià nobi registhrazioni da chisthu indirizzu IP parchí è erencaddu cumenti proxy abbérthu i' la listha-niedda DNSBL utirizadda da {{SITENAME}}.",
 
@@ -1841,7 +1807,7 @@ So cunsidaraddi soru l'erenchi puntaddi (righi ch'ischumenzani cu' lu caràtteri
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larghèzia',
 'exif-imagelength' => 'Althèzia',
 'exif-bitspersample' => 'Bit pa campioni',
@@ -2017,11 +1983,6 @@ Pa piazeri, cunfèimma chi vòi ricrià avveru chistha pàgina.",
 'version-other' => 'Althru',
 'version-software-version' => 'Versioni',
 
-# Special:FilePath
-'filepath' => "Parchossu d'un file",
-'filepath-page' => 'Innommu di lu file:',
-'filepath-submit' => 'Parchossu',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-legend' => "Zercha d'un dupricaddu",
 'fileduplicatesearch-filename' => 'Innòommu di lu file:',
diff --git a/languages/messages/MessagesSe.php b/languages/messages/MessagesSe.php
index 9565ae27..32339884 100644
--- a/languages/messages/MessagesSe.php
+++ b/languages/messages/MessagesSe.php
@@ -52,12 +52,13 @@ $specialPageAliases = array(
 	'Block'                     => array( 'Hehtte', 'Hehtte_geavaheaddji', 'Hehtte_IP' ),
 	'Blockme'                   => array( 'Hehtte_mu' ),
 	'Booksources'               => array( 'Girjegáldut' ),
-	'BrokenRedirects'           => array( 'Feaillalaš_stivremat', 'Feaillalaš_ođđasitstivremat' ),
+	'BrokenRedirects'           => array( 'Boatkanan_stivremat', 'Boatkanan_ođđasitstivremat' ),
 	'Categories'                => array( 'Kategoriijat' ),
+	'ChangeEmail'               => array( 'Rievdat_E-poastta' ),
 	'ComparePages'              => array( 'Veardit_siidduid' ),
 	'Confirmemail'              => array( 'Sihkaraste_e-poastta' ),
 	'Contributions'             => array( 'Rievdadusat' ),
-	'CreateAccount'             => array( 'Ráhkat_dovddaldaga' ),
+	'CreateAccount'             => array( 'Ráhkat_dovddaldaga', 'Ráhkat_konttu' ),
 	'DeletedContributions'      => array( 'Sihkkojuvvon_rievdadusat' ),
 	'Disambiguations'           => array( 'Liŋkkat_dárkonsiidduide' ),
 	'DoubleRedirects'           => array( 'Guoktegeardásaš_ođđasitstivremat' ),
@@ -69,7 +70,7 @@ $specialPageAliases = array(
 	'Listadmins'                => array( 'Administráhtorlistu', 'Listu_administráhtoriin' ),
 	'Listbots'                  => array( 'Bohttalistu', 'Listu_bohtain' ),
 	'Listfiles'                 => array( 'Fiilalogahallan' ),
-	'Listgrouprights'           => array( 'Listu_joavkkuid_vuoigavuođain' ),
+	'Listgrouprights'           => array( 'Listu_joavkkuid_vuoigatvuođain' ),
 	'Listredirects'             => array( 'Stivrenlistu', 'Listu_stivremiin', 'Listu_ođđasitstivremiin' ),
 	'Listusers'                 => array( 'Geavaheaddjelistu', 'Listu_geavaheddjiin' ),
 	'Log'                       => array( 'Loggat', 'Logga' ),
@@ -95,10 +96,10 @@ $specialPageAliases = array(
 	'Specialpages'              => array( 'Erenoamáš_siiddut', 'Doaibmasiiddut' ),
 	'Statistics'                => array( 'Statistihkat' ),
 	'Unblock'                   => array( 'Sihko_hehttema' ),
-	'Uncategorizedcategories'   => array( 'Kategoriserekeahtes_kategoriijat' ),
-	'Uncategorizedimages'       => array( 'Kategoriserekeahtes_govat', 'Kategoriserekeahtes_fiillat' ),
-	'Uncategorizedpages'        => array( 'Kategoriserekeahtes_siiddut' ),
-	'Uncategorizedtemplates'    => array( 'Kategoriserekeahtes_mállet' ),
+	'Uncategorizedcategories'   => array( 'Klassifiserekeahtes_kategoriijat' ),
+	'Uncategorizedimages'       => array( 'Klassifiserekeahtes_fiillat', 'Klassifiserekeahtes_govat' ),
+	'Uncategorizedpages'        => array( 'Klassifiserekeahtes_siiddut' ),
+	'Uncategorizedtemplates'    => array( 'Klassifiserekeahtes_mállet' ),
 	'Undelete'                  => array( 'Máhccat' ),
 	'Unusedcategories'          => array( 'Geavatkeahtes_kategoriijat' ),
 	'Unusedimages'              => array( 'Geavatkeahtes_govat', 'Geavatkeahtes_fiillat' ),
@@ -119,7 +120,22 @@ $specialPageAliases = array(
 
 $magicWords = array(
 	'redirect'                  => array( '0', '#STIVREN', '#OĐĐASITSTIVREN', '#REDIRECT' ),
-	'numberofarticles'          => array( '1', 'ARTIHKKALIIDMEARRI', 'NUMBEROFARTICLES' ),
+	'notoc'                     => array( '0', '__IISISDOALLU__', '__IISIS__', '__NOTOC__' ),
+	'nogallery'                 => array( '0', '__IIGALLERIIJA__', '__NOGALLERY__' ),
+	'toc'                       => array( '0', '__SISDOALLU__', ' __SIS__', '__TOC__' ),
+	'noeditsection'             => array( '0', '__IIRIEVDADITOASI__', '__NOEDITSECTION__' ),
+	'numberofarticles'          => array( '1', 'ARTIHKKALIIDMEARRI', ' ARTIHKALMEARRI', 'NUMBEROFARTICLES' ),
+	'numberoffiles'             => array( '1', 'FIILLAIDMEARRI', 'FIILAMEARRI', ' GOVAIDMEARRI', ' GOVVAMEARRI', 'NUMBEROFFILES' ),
+	'numberofusers'             => array( '1', 'GEAVAHEDDJIIDMEARRI', ' GEAVAHEADDJIMEARRI', ' GEAVAHEADDJEMEARRI', 'NUMBEROFUSERS' ),
+	'numberofactiveusers'       => array( '1', 'AKTIIVAGEAVAHEDDJIIDMEARRI', ' AKTIIVAGEAVAHEADDJIMEARRI', ' AKTIIVAGEAVAHEADDJEMEARRI', 'NUMBEROFACTIVEUSERS' ),
+	'numberofedits'             => array( '1', 'RIEVDADUSAIDMEARRI', ' RIEVDADUSMEARRI', 'NUMBEROFEDITS' ),
+	'subst'                     => array( '0', 'LIIBME:', 'SUBST:' ),
+	'img_thumbnail'             => array( '1', 'mini', 'thumbnail', 'thumb' ),
+	'img_manualthumb'           => array( '1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+	'img_right'                 => array( '1', 'olgeš', 'right' ),
+	'img_left'                  => array( '1', 'gurut', 'left' ),
+	'img_center'                => array( '1', 'gasku', 'center', 'centre' ),
+	'img_link'                  => array( '1', 'liŋka=$1', 'link=$1' ),
 );
 
 $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
@@ -306,7 +322,7 @@ $messages = array(
 'jumptonavigation' => 'navigašuvdnii',
 'jumptosearch' => 'ohcamii',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} birra',
 'aboutpage' => 'Project:Dieđut',
 'copyright' => 'Sisdoalu sáhttá geavahit liseanssain $1.',
@@ -315,7 +331,6 @@ $messages = array(
 'disclaimers' => 'Friijavuohta vástideamis',
 'disclaimerpage' => 'Project:Friijavuohta vástideamis',
 'edithelp' => 'Rievdadanrávvagat',
-'edithelppage' => 'Help:Mo rievdadit siidduid',
 'helppage' => 'Help:Sisdoallu',
 'mainpage' => 'Váldosiidu',
 'mainpage-description' => 'Váldosiidu',
@@ -382,7 +397,6 @@ $messages = array(
 'viewsource' => 'Geahča gáldu',
 'protectedpagetext' => 'Dát siidu lea suodjaluvvon rievdadusain.',
 'viewsourcetext' => 'Sáhtát geahčat ja kopieret dán siiddu gáldokoda:',
-'sqlhidden' => '(SQL-jearahallan lea čihkojuvvon)',
 
 # Login and logout pages
 'logouttext' => "'''Don leat dál loggen olggos {{GRAMMAR:elative|{{SITENAME}}}}s.'''
@@ -447,7 +461,7 @@ Sáhtát joatkit {{GRAMMAR:genitive|{{SITENAME}}}} geavaheami anonyman dahje log
 'newpassword' => 'Ođđa suollemassátni',
 'retypenew' => 'Ođđa suollemassátni ođđasit',
 'resetpass_submit' => 'Čále suollemassáni ja čálligoađe sisa',
-'resetpass_success' => 'Suollemassáni rievdadeapmim lihkosmuvai.',
+'changepassword-success' => 'Suollemassáni rievdadeapmim lihkosmuvai.',
 'resetpass_forbidden' => 'Suollemassániid rievdan ii lihkosmuva dán wikis.',
 'resetpass-submit-loggedin' => 'Molsso suollemassáni',
 
@@ -603,7 +617,6 @@ Eará bajasdoallit sáhtet lohkat čihkojuvvon sisdoalu ja máhcahit dan.",
 
 $1 {{int:pipe-separator}} $2',
 'searchmenu-new' => "'''Álggat siiddu ''[[:$1]]'' dán Wikipediai'''",
-'searchhelp-url' => 'Help:Rávvagat',
 'searchprofile-articles' => 'Sisdoallosiiddut',
 'searchprofile-project' => 'Veahkke- ja prošeaktasiiddut',
 'searchprofile-everything' => 'Buot',
@@ -617,13 +630,6 @@ $1 {{int:pipe-separator}} $2',
 'powersearch-toggleall' => 'Buot',
 'powersearch-togglenone' => 'Ii mihkkege',
 
-# Quickbar
-'qbsettings-none' => 'Ii maidige',
-'qbsettings-fixedleft' => 'Teaksta mielde, gurut',
-'qbsettings-fixedright' => 'Teaksta mielde, olgeš',
-'qbsettings-floatingleft' => 'Biso gurutbealde',
-'qbsettings-floatingright' => 'Biso olgesbealde',
-
 # Preferences page
 'preferences' => 'Ásahusat',
 'mypreferences' => 'Ásahusat',
@@ -884,8 +890,6 @@ $1 {{int:pipe-separator}} $2',
 'statistics-users-active-desc' => 'Geavaheaddjit, geat leat bargan juoidá maŋimus {{PLURAL:$1|beaivvi|$1 beaivvi}} áigge.',
 'statistics-mostpopular' => 'Eanemusta gehčojuvvon siiddut',
 
-'disambiguations' => 'Liŋkkat dárkonsiidduide',
-
 'doubleredirects' => 'Guovttegeardán ođđasitstivremat',
 
 'brokenredirects' => 'Bieđganan ođđasitstivremat',
@@ -1030,10 +1034,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatch' => 'Heaite čuovvumis',
 'unwatchthispage' => 'Heaite čuovvumis',
 'notanarticle' => 'Ii leat siidu',
-'watchnochange' => 'Válljejuvvon áigodagas oktage du čuovvunlisttui gullevaš siidu leat rievdaduvvon.',
 'watchlist-details' => 'Du čuovvunlisttus {{PLURAL:$1|lea $1 siidu|leat $1 siiddu}}. Lohkui eai leat váldojuvvon ságastallansiidduid.',
-'wlheader-enotif' => '* E-poastaalmmuhusat leat anus.',
-'wlheader-showupdated' => "* Siiddut, mat leat rievdaduvvon du maŋimus geavahangearddi maŋŋá leat merkojuvvon '''buoiddes teavsttain'''",
+'wlheader-enotif' => 'E-poastaalmmuhusat leat anus.',
+'wlheader-showupdated' => "Siiddut, mat leat rievdaduvvon du maŋimus geavahangearddi maŋŋá leat merkojuvvon '''buoiddes teavsttain'''",
 'watchmethod-recent' => 'dárkistuvvo varas rievdadusat čuovvunlisttu siidduide',
 'watchmethod-list' => 'dárkistuvvo čuovvunlisttu siidduid varas rievdadusat',
 'watchlistcontains' => 'Du čuovvunlisttus {{PLURAL:$1|lea okta siidu|leat $1 siiddu}}.',
@@ -1211,7 +1214,6 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'blocklink' => 'hehtte',
 'contribslink' => 'rievdadusat',
 'blocklogentry' => 'esttii geavaheaddji dahje IP-čujuhusa [[$1]], eastima bistin lea $2 $3',
-'proxyblocksuccess' => 'Gárvvis.',
 
 # Developer tools
 'lockdb' => 'Gidde diehtovuođu',
@@ -1351,7 +1353,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'metadata-expand' => 'Čájet buot sisdoallogovvádusaid',
 'metadata-collapse' => 'Čájet beare dehaleamos sisdoallogovvádusaid',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Viidodat',
 'exif-imagelength' => 'Allodat',
 'exif-bitspersample' => 'Bihtá komponeanttas',
diff --git a/languages/messages/MessagesSei.php b/languages/messages/MessagesSei.php
index 8d3ebd65..e1d8e0d1 100644
--- a/languages/messages/MessagesSei.php
+++ b/languages/messages/MessagesSei.php
@@ -42,9 +42,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Xuniim henadressade e-iitom notificacionde e-iitóm',
 'tog-shownumberswatching' => 'Cohuatlöx caitóm cáminotómde numberam',
 'tog-fancysig' => 'Signaturenám brazzinám (sans linkám automaticám)',
-'tog-externaleditor' => 'Usadad ticpatlöx externöx auto',
-'tog-externaldiff' => 'Usadad diff extern auto',
-'tog-showjumplinks' => 'Záj "jumpöx" accessibilitiit linkám',
 'tog-uselivepreview' => 'Usadad cuáxiit live (JavaScript) (Experimentam)',
 'tog-forceeditsummary' => 'Ixuniimticpatlöx he jan nenenterom abvuatlde ticpatlöx',
 'tog-watchlisthideown' => 'Cíiitám he ticpatlöxde listade cáminot zo',
@@ -190,7 +187,7 @@ $messages = array(
 'jumptonavigation' => 'navigacion',
 'jumptosearch' => 'Yahöx',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} mii',
 'aboutpage' => 'Project:Miilà',
 'copyright' => 'Contentua coitáamb $1 tan.',
@@ -200,7 +197,6 @@ $messages = array(
 'disclaimers' => 'Isój cacóomx',
 'disclaimerpage' => 'Project:Isoj cacóomx geniiraloj',
 'edithelp' => 'Help ticpatlöx',
-'edithelppage' => 'Help:Ticpatlöx',
 'helppage' => 'Help:Caálixötöj',
 'mainpage' => 'Caálixötöj',
 'mainpage-description' => 'Caálixötöj',
@@ -262,17 +258,6 @@ Meccan páhina extrava valide pac [[Special:SpecialPages]] iti.',
 # General errors
 'error' => 'Römj',
 'databaseerror' => 'Römjde database',
-'dberrortext' => 'Römjde syntaxde database query coccebj icmaaniit.
-Jan pos-coccebj bug zo software zo iti.
-Hunattemptöx database query coccebjöx:
-<blockquote><tt>$1</tt></blockquote>
-funccion xi "<tt>$2</tt>".
-MySQL returnöx römj iti "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Römjde syntaxde database query coccebj icmaaniit.
-Hunattemptöx database query coccebjöx:
-"$1"
-funccion xi "$2".
-MySQL returnöx römj iti "$3: $4"',
 'laggedslavemode' => 'Attencion: Páhina necoccebj updatenám cmaa.',
 'readonly' => 'Database protectáme',
 'enterlockreason' => 'Enterom raede lockom zo, includom estimacionde janxepe lockom zo releasom',
@@ -308,7 +293,6 @@ Query: $2',
 'editinginterface' => "'''Warning:''' You are editing a page which is used to provide interface text for the software.
 Changes to this page will affect the appearance of the user interface for other users.
 For translations, please consider using [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden' => '(SQL querynam cíiitámöx)',
 'cascadeprotected' => 'Jan páhina coccebj protectöxde ticpatlöx, zo coccebj cascadande jan {{PLURAL:$1|páhina|páhinám}}, jan coccebj protëctox cascadanöx opcion zo mii:
 $2',
 'namespaceprotected' => "Me necoccebj permiccion ticpatlöx páhinám '''$1''' ipartuatl zo iti.",
@@ -386,7 +370,7 @@ confirmom account zo coccebj de'me.",
 'newpassword' => 'Hunquimx canj:',
 'retypenew' => 'Vanhunquimx canj:',
 'resetpass_submit' => 'Vanquimx canj ö caápo',
-'resetpass_success' => 'Me quimx canj coccebj quiixde success! Caápo cmaa...',
+'changepassword-success' => 'Me quimx canj coccebj quiixde success! Caápo cmaa...',
 'resetpass_forbidden' => 'Quimx cánj nereset jan wiki iti',
 
 # Edit page toolbar
@@ -579,13 +563,8 @@ Informacion: (curt) = quiíxde vercion currentua,
 'prevn' => 'jan {{PLURAL:$1|$1}}',
 'nextn' => 'hun {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Cohuatlöx ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url' => 'Help:Caálixötöj',
 'powersearch' => 'Yahöx',
 
-# Quickbar
-'qbsettings' => 'Zuónaát',
-'qbsettings-none' => 'Nepartám',
-
 # Preferences page
 'preferences' => 'Quáatlaác',
 'mypreferences' => 'Hequáatlaác',
@@ -1023,7 +1002,7 @@ iitom e-iitomde diijömde caitóm.',
 'ilsubmit' => 'Yahöx',
 'bydate' => 'de datum',
 
-# EXIF tags
+# Exif tags
 'exif-fnumber' => 'F Numberam',
 'exif-gpslatitude' => 'Latitudam',
 'exif-gpslongitude' => 'Longitudam',
diff --git a/languages/messages/MessagesSg.php b/languages/messages/MessagesSg.php
index c8f15a86..a0cff5af 100644
--- a/languages/messages/MessagesSg.php
+++ b/languages/messages/MessagesSg.php
@@ -137,6 +137,7 @@ $messages = array(
 'qbbrowse' => 'Hasa',
 'qbedit' => 'Sepe',
 'qbpageoptions' => 'Lêmbëtï sô',
+'qbpageinfo' => 'Ndongoro',
 'qbmyoptions' => 'Âlêmbëtï tî mbï',
 'qbspecialpages' => 'Âlêmbëtï ndê',
 'faq' => 'Âhûnda',
diff --git a/languages/messages/MessagesSgs.php b/languages/messages/MessagesSgs.php
index 0411b80c..95e53d89 100644
--- a/languages/messages/MessagesSgs.php
+++ b/languages/messages/MessagesSgs.php
@@ -87,9 +87,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ruodītė keravuojantiu nauduotuoju skatliu',
 'tog-oldsig' => 'Esams parašos:',
 'tog-fancysig' => 'Parašos kāp wiki tekstos (ba autuomatėniu nūruodu)',
-'tog-externaleditor' => 'Vagol nutīliejėma nauduotė ėšuorini radaktuoriu (tėktās specam, rēk specēliū nustatīmu kompioteriō. [//www.mediawiki.org/wiki/Manual:External_editors Daugiau infuormacėjės.])',
-'tog-externaldiff' => 'Palē nutīliejėma nauduotė ėšuorinė skėrtomu ruodīma pruograma (tėktās specam, rēk specēliū nustatīmu kompioteriō. [//www.mediawiki.org/wiki/Manual:External_editors Daugiau infuormacėjės.])',
-'tog-showjumplinks' => 'Ijongtė „paršuoktė i“ pasėikiamoma nūruodas',
 'tog-uselivepreview' => 'Nauduotė tėisiogėne parvėiza (JavaScript) (Eksperimentėnis)',
 'tog-forceeditsummary' => 'Klaustė, kumet palėiku toščē pakeitėma kuomentara',
 'tog-watchlisthideown' => 'Kavuotė mona pakeitėmos keravuojamu sarašė',
@@ -281,7 +278,7 @@ Prašuom palaukat ė mieginkat i ton poslapi patekt vieliau.
 $1',
 'pool-errorunknown' => 'Nežėnuoma klaida',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Aple {{SITENAME}}',
 'aboutpage' => 'Project:Aple',
 'copyright' => 'Turinīs pateikts so $1 licencėjė.',
@@ -291,7 +288,6 @@ $1',
 'disclaimers' => 'Atsakuomībės aprėbuojims',
 'disclaimerpage' => 'Project:Atsakuomībės aprėbuojims',
 'edithelp' => 'Kāp redagoutė',
-'edithelppage' => 'Help:Redagavėms',
 'helppage' => 'Help:Torėnīs',
 'mainpage' => 'Pėrms poslapis',
 'mainpage-description' => 'Pėrms poslapis',
@@ -385,7 +381,6 @@ Ožklausėms: $2',
 'viewsourcetext' => 'Tomsta galėt veizietė ėr kopėjoutė poslapė kuoda:',
 'protectedinterface' => 'Šėtom poslapi īr pruogramėnės ironguos sasajuos teksts katros īr apsauguots, kū neprietelē anū nasogadėntu.',
 'editinginterface' => "'''Diemesė:''' Tamsta keitat poslapi, katros īr nauduojams programėnės irongas sōsajės tekstė. Pakeitėmā tamė poslapū tēpuogi pakeis nauduotuojė sōsajės ėšruoda ė kėtėims nauduotujams. Jēgo nuorėt pargoldītė, siūluom pasėnauduotė [//translatewiki.net/wiki/Main_Page?setlang=bat-smg „translatewiki.net“], „MediaWiki“ lokalėzacėjės pruojėktu.",
-'sqlhidden' => '(SQL ožklausa pakavuota)',
 'namespaceprotected' => "Tamsta netorėt teisiu keistė poslapiu '''$1''' srėtī.",
 'ns-specialprotected' => 'Specēlė̅ jė poslapē negal būtė keitamė.',
 
@@ -473,7 +468,7 @@ nebus siontamas ni vėinam žemiau ėšvardėntam puoslaugiō.',
 'newpassword' => 'Naus slaptažuodis:',
 'retypenew' => 'Pakartuokėt nauja slaptažuodi:',
 'resetpass_submit' => 'Nostatītė slaptažuodi ė prėsėjongtė',
-'resetpass_success' => 'Tamstas slaptažuodis pakeists siekmėngā! Daba prėsėjongiama...',
+'changepassword-success' => 'Tamstas slaptažuodis pakeists siekmėngā! Daba prėsėjongiama...',
 'resetpass-temp-password' => 'Laikėns slaptažuodis:',
 
 # Edit page toolbar
@@ -725,7 +720,6 @@ Kėtė admėnėstratuorē šėtom pruojekte vėsdar galės pasėiktė pasliepta
 'searchmenu-legend' => 'Paėiškuos nustatīmā',
 'searchmenu-exists' => "'''Poslapis pavadėnts „[[$1]]“ šėtuo wiki'''",
 'searchmenu-new' => "'''Sokortė poslapi „[[:$1]]“ šėtuo wiki!'''",
-'searchhelp-url' => 'Help:Torėnīs',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ėiškuotė poslapiu so šėtuom prīšdielio]]',
 'searchprofile-articles' => 'Torėnė poslapē',
 'searchprofile-project' => 'Pagelbas ė pruojekta poslapē',
@@ -762,10 +756,6 @@ Kėtė admėnėstratuorē šėtom pruojekte vėsdar galės pasėiktė pasliepta
 'powersearch-field' => 'Ėiškoutė',
 'search-external' => 'Ėšuorėnė paėiška',
 
-# Quickbar
-'qbsettings' => 'Greitasā pasėrėnkėms',
-'qbsettings-none' => 'Neruodītė',
-
 # Preferences page
 'preferences' => 'Nustatīmā',
 'mypreferences' => 'Mona nustatīmā',
@@ -790,7 +780,6 @@ Kėtė admėnėstratuorē šėtom pruojekte vėsdar galės pasėiktė pasliepta
 'resetprefs' => 'Atstatītė nostatīmos',
 'restoreprefs' => 'Atstatītė vėsus numatītūsius nustatīmus',
 'prefs-editing' => 'Redagavėms',
-'prefs-edit-boxsize' => 'Redagavėma longa dėdoms.',
 'rows' => 'Eilotės:',
 'columns' => 'Štolpalē:',
 'searchresultshead' => 'Paėiškuos nostatīmā',
@@ -928,7 +917,6 @@ Ana gal sodarītė ne daugiau kāp $1 {{PLURAL:$1|sėmbuolis|sėmbuolē|sėmbuol
 'recentchangeslinked-feed' => 'Sosėjėn pakeitėmā',
 'recentchangeslinked-toolbox' => 'Sosėjėn pakeitėmā',
 'recentchangeslinked-title' => 'So $1 sosėje pakeitimā',
-'recentchangeslinked-noresult' => 'Nier juokiū pakeitėmu sosėitous poslapious douto čieso.',
 'recentchangeslinked-summary' => "Šėtom specēliajam poslapi ruodomė vielībė̅jė pakeitėmā poslapiūs, i katrūs īr nuruodoma. Poslapē ėš Tamstas [[Special:Watchlist|keravuojamu sāraša]] īr '''pastuorėntė'''.",
 'recentchangeslinked-page' => 'Poslapė pavadinėms:',
 'recentchangeslinked-to' => 'Ruodītė so doutu poslapiu sosėjosiu puslapiu pakeitėmus',
@@ -1102,9 +1090,6 @@ Infuormacėjė ėš [$2 faila aprašīma poslapė] īr pateikta žemiau.',
 'statistics-users-active' => 'Aktīviu nauduotuoju',
 'statistics-mostpopular' => 'Daugiausē ruodītė poslapē',
 
-'disambiguations' => 'Daugiareikšmiu žuodiu poslapē',
-'disambiguationspage' => 'Template:Tor daug reikšmiū',
-
 'doubleredirects' => 'Dvėgobė paradresavėmā',
 'doubleredirectstext' => 'Tėi paradresavėmā ruod i kėtus paradresavėma poslapius. Kuožnuo eilotē pamėnavuots pėrmasā ėr ontrasā paradresavėmā, tēpuogi ontrojė paradresavėma paskėrtis, katra paprastā ė paruod i tėkraji poslapi, i katra pėrmasā paradresavėms ė torietu ruodītė.',
 'double-redirect-fixed-move' => '[[$1]] bova parkelts, daba tas īr paradresavėms i [[$2]]',
@@ -1268,10 +1253,9 @@ Jēgo bikumet ožsėnuorietomiet liautėis keravuotė straipsnė, spauskat \"neb
 'unwatch' => 'Nebkeravuotė',
 'unwatchthispage' => 'Nustuotė keravuotė',
 'notanarticle' => 'Ne torėnė poslapis',
-'watchnochange' => 'Pasėrėnkto čieso nebova redagouts nė vėins keravuojams straipsnis.',
 'watchlist-details' => 'Keravuojama $1 {{PLURAL:$1|poslapis|$1 poslapē|$1 poslapiu}} neskaitlioujant aptarėmu poslapiu.',
-'wlheader-enotif' => '* El. pašta primėnėmā ijongtė īr.',
-'wlheader-showupdated' => "* Poslapē, katrėi pakeistė nu Tamstas paskotėnė apsėlonkėma čiesa anūs, īr pažīmietė '''pastuorintā'''",
+'wlheader-enotif' => 'El. pašta primėnėmā ijongtė īr.',
+'wlheader-showupdated' => "Poslapē, katrėi pakeistė nu Tamstas paskotėnė apsėlonkėma čiesa anūs, īr pažīmietė '''pastuorintā'''",
 'watchmethod-recent' => 'tėkrėnamė vielībė̅jė pakeitėmā keravuojamiems poslapiams',
 'watchmethod-list' => 'Ėiškuoma vielībūju pakeitėmu keravuojamūs poslapiūs',
 'watchlistcontains' => 'Tamstas kervuojamu sārašė īr $1 {{PLURAL:$1|poslapis|poslapē|poslapiu}}.',
@@ -1548,7 +1532,6 @@ onkstiau ožbluokoutam IP adresō a nauduotuojō.',
 'ipb_expiry_invalid' => 'Galiuojėma čiesos nelaistėns.',
 'ipb_already_blocked' => '„$1“ jau ožblokouts',
 'ipb-needreblock' => '$1 jau īr ožblokouts. A nuorėt pakeistė nustatīmus?',
-'proxyblocksuccess' => 'Padarīt.',
 
 # Developer tools
 'unlockdbtext' => 'Atrakėnos doumenū baze grōžėns galimībe vėsėm
@@ -1773,7 +1756,7 @@ Vėsas kėtas nūoruodas tuo patiuo eilotie īr laikomas ėšėmtim, tas rēšk
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Platoms',
 'exif-imagelength' => 'Aukštoms',
 'exif-orientation' => 'Pasokims',
@@ -1908,10 +1891,6 @@ Tamsta tēpuogi galėt [[Special:EditWatchlist/raw|redagoutė grīnaji keravuoja
 'version' => 'Versėjė',
 'version-license' => 'Licenzėjė',
 
-# Special:FilePath
-'filepath' => 'Faila maršrots',
-'filepath-page' => 'Fails:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ėiškuotė doblikoutu failu',
 'fileduplicatesearch-legend' => 'Ėiškuotė doblėkatu',
diff --git a/languages/messages/MessagesSh.php b/languages/messages/MessagesSh.php
index 2b8efea8..5bafdd5b 100644
--- a/languages/messages/MessagesSh.php
+++ b/languages/messages/MessagesSh.php
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Kaganer
+ * @author Nemo bis
  * @author OC Ripper
  * @author לערי ריינהארט
  */
@@ -237,9 +238,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži broj korisnika koji prate',
 'tog-oldsig' => 'Postojeći potpis:',
 'tog-fancysig' => 'Smatraj potpis kao wikitekst (bez automatskog linka)',
-'tog-externaleditor' => 'Redovno koristite eksterni editor (samo za naprednije korisnike, potrebne su posebne postavke na vašem računaru)',
-'tog-externaldiff' => 'Redovno koristi vanjski (diff) program za prikaz razlika (samo za naprednije korisnike, potrebne posebne postavke na vašem računaru [//www.mediawiki.org/wiki/Manual:External_editors Više informacija.])',
-'tog-showjumplinks' => 'Omogući opciju "skoči na" linkove',
 'tog-uselivepreview' => 'Koristite pretpregled uživo (potreban JavaScript) (eksperimentalno)',
 'tog-forceeditsummary' => 'Opomeni me pri unosu praznog sažetka',
 'tog-watchlisthideown' => 'Sakrij moje izmjene sa spiska praćenih članaka',
@@ -252,6 +250,7 @@ $messages = array(
 'tog-diffonly' => 'Ne prikazuj sadržaj stranice ispod prikaza razlika',
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
 'tog-norollbackdiff' => 'Nakon povrata zanemari prikaz razlika',
+'tog-useeditwarning' => 'Upozori me kad napuštam stranicu za uređivanje bez snimanja izmjena',
 
 'underline-always' => 'Uvijek',
 'underline-never' => 'Nikad',
@@ -315,6 +314,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. mart',
+'april-date' => '$1. april',
+'may-date' => '$1. maj',
+'june-date' => '$1. jun',
+'july-date' => '$1. jul',
+'august-date' => '$1. august',
+'september-date' => '$1. septembar',
+'october-date' => '$1. oktobar',
+'november-date' => '$1. novembar',
+'december-date' => '$1. decembar',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorije}}',
@@ -396,6 +407,7 @@ $messages = array(
 'create-this-page' => 'Stvori ovu stranicu',
 'delete' => 'Obriši',
 'deletethispage' => 'Obriši ovu stranicu',
+'undeletethispage' => 'Vrati ovu stranicu',
 'undelete_short' => 'Vrati obrisanih {{PLURAL:$1|$1 izmjenu|$1 izmjene|$1 izmjena}}',
 'viewdeleted_short' => 'Pogledaj {{PLURAL:$1|jednu obrisanu izmjenu|$1 obrisane izmjene|$1 obrisanih izmjena}}',
 'protect' => 'Zaštiti',
@@ -439,7 +451,7 @@ $1',
 'pool-queuefull' => 'Red na pool je prenapunjen',
 'pool-errorunknown' => 'nepoznata greška',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'O projektu {{SITENAME}}',
 'aboutpage' => 'Project:O_projektu_{{SITENAME}}',
 'copyright' => 'Sadržaj je dostupan pod $1.',
@@ -449,7 +461,6 @@ $1',
 'disclaimers' => 'Odricanje odgovornosti',
 'disclaimerpage' => 'Project:Uslovi korištenja, pravne napomene i odricanje odgovornosti',
 'edithelp' => 'Pomoć pri uređivanju',
-'edithelppage' => 'Help:Uređivanje',
 'helppage' => 'Help:Sadržaj',
 'mainpage' => 'Glavna strana',
 'mainpage-description' => 'Glavna strana',
@@ -526,17 +537,6 @@ Lista valjanih posebnih stranica se može naći na [[Special:SpecialPages|{{int:
 # General errors
 'error' => 'Greška',
 'databaseerror' => 'Greška u bazi podataka',
-'dberrortext' => 'Došlo je do sintaktičke greške u bazi.
-Možda se radi o grešci u softveru.
-Posljednji pokušaj upita je glasio:
-<blockquote><code>$1</code></blockquote>
-unutar funkcije „<code>$2</code>“.
-Baza podataka je prijavila grešku „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Desila se sintaksna greška upita baze.
-Posljednji pokušani upit je bio:
-"$1"
-iz funkcije "$2".
-MySQL je vratio grešku "$3: $4".',
 'laggedslavemode' => "'''Upozorenje''': Stranica ne mora sadržavati posljednja ažuriranja.",
 'readonly' => 'Baza podataka je zaključana',
 'enterlockreason' => 'Unesite razlog za zaključavanje, uključujući procjenu vremena otključavanja',
@@ -591,12 +591,15 @@ Pretraga: $2',
 'editinginterface' => "'''Upozorenje:''' Mijenjate stranicu koja se koristi za tekst interfejsa za softver.
 Promjene na ovoj stranici će izazvati promjene korisničkog interfejsa za druge korisnike na ovoj wiki.
 Za prijevode, molimo Vas koristite [//translatewiki.net/wiki/Main_Page?setlang=bs translatewiki.net], projekt lokalizacije MediaWiki.",
-'sqlhidden' => '(SQL pretraga sakrivena)',
 'cascadeprotected' => 'Ova stranica je zaštićena od uređivanja, jer je uključena u {{PLURAL:$1|stranicu zaštićenu|stranice zaštićene}} od uređivanja sa uključenom kaskadnom opcijom:
 $2',
 'namespaceprotected' => "Nemate dozvolu uređivati stranice imenskog prostora '''$1'''.",
 'customcssprotected' => 'Nemate dozvolu za mijenjanje ove CSS stranice jer sadrži osobne postavke nekog drugog korisnika.',
 'customjsprotected' => 'Nemate dozvolu za mijenjanje ove JavaScript stranice jer sadrži osobne postavke nekog drugog korisnika.',
+'mycustomcssprotected' => 'Nemate ovlasti za uređivanje ove CSS stranice.',
+'mycustomjsprotected' => 'Nemate dozvolu da uređujete ovu stranicu sa JavaScriptom.',
+'myprivateinfoprotected' => 'Nemate dozvolu da uređujete svoje privatne informacije.',
+'mypreferencesprotected' => 'Nemate dozvolu da uređujete svoje postavke.',
 'ns-specialprotected' => 'Posebne stranice se ne mogu uređivati.',
 'titleprotected' => 'Naslov stranice je zaštićen od postavljanja od strane korisnika [[User:$1|$1]].
 Kao razlog je naveden "\'\'$2\'\'".',
@@ -622,10 +625,19 @@ Obratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još
 'welcomecreation-msg' => 'Vaš korisnički račun je napravljen.
 Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].',
 'yourname' => 'Korisničko ime:',
+'userlogin-yourname' => 'Korisničko ime',
+'userlogin-yourname-ph' => 'Unesite svoje korisničko ime',
+'createacct-another-username-ph' => 'Unesi korisničko ime',
 'yourpassword' => 'Lozinka/zaporka:',
+'userlogin-yourpassword' => 'Lozinka/zaporka',
+'userlogin-yourpassword-ph' => 'Unesite svoju lozinku/zaporku',
+'createacct-yourpassword-ph' => 'Unesite lozinku/zaporku',
 'yourpasswordagain' => 'Ponovno utipkajte lozinku/zaporku:',
+'createacct-yourpasswordagain' => 'Potvrdite lozinku/zaporku',
+'createacct-yourpasswordagain-ph' => 'Unesite lozinku/zaporku ponovno',
 'remembermypassword' => 'Upamti moju lozinku na ovom kompjuteru (za maksimum od $1 {{PLURAL:$1|dan|dana}})',
-'securelogin-stick-https' => 'Ostanite povezani na HTTPS nakon prijave',
+'userlogin-remembermypassword' => 'Držite me ulogiranog/u',
+'userlogin-signwithsecure' => 'Koristite sigurnu vezu',
 'yourdomainname' => 'Vaš domen:',
 'password-change-forbidden' => 'Ne možete da promenite lozinku na ovom vikiju.',
 'externaldberror' => 'Došlo je do greške pri vanjskoj autorizaciji baze podataka ili vam nije dopušteno osvježavanje Vašeg vanjskog korisničkog računa.',
@@ -637,18 +649,41 @@ Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].
 'logout' => 'Odjavi me',
 'userlogout' => 'Odjava',
 'notloggedin' => 'Niste prijavljeni',
+'userlogin-noaccount' => 'Nemate račun?',
+'userlogin-joinproject' => 'Pridružite se {{SITENAME}}',
 'nologin' => "Nemate korisničko ime? '''$1'''.",
 'nologinlink' => 'Otvorite račun',
 'createaccount' => 'Napravi korisnički račun',
 'gotaccount' => "Imate račun? '''$1'''.",
 'gotaccountlink' => 'Prijavi se',
 'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
+'userlogin-resetpassword-link' => 'Resetirajte svoju lozinku/zaporku',
+'helplogin-url' => 'Help:Logiranje',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri logiranju]]',
+'createacct-join' => 'Unesite svoje informacije ispod',
+'createacct-another-join' => 'Dolje unesite informacije o novom računu.',
+'createacct-emailrequired' => 'E-mail adresa',
+'createacct-emailoptional' => 'E-mail adresa (opcionalno)',
+'createacct-email-ph' => 'Unesite svoju E-mail adresu',
+'createacct-another-email-ph' => 'Postavite E-mail adresu',
 'createaccountmail' => 'Koristite privremenu slučajno stvorenu lozinku i pošaljite na dolje specificiranu e-mail adresu',
+'createacct-realname' => 'Stvarno ime (opcionalno)',
 'createaccountreason' => 'Razlog:',
+'createacct-reason' => 'Razlog',
+'createacct-reason-ph' => 'Zašto stvarate novi račun',
+'createacct-captcha' => 'Sigurnosna provjera',
+'createacct-imgcaptcha-ph' => 'Unesite tekst koji vidite iznad',
+'createacct-submit' => 'Stvorite svoj račun',
+'createacct-another-submit' => 'Stvorite novi račun',
+'createacct-benefit-heading' => '{{SITENAME}} se stvara od ljudi poput vas.',
+'createacct-benefit-body1' => '$1 {{PLURAL:$1|izmjena|izmjene}}',
+'createacct-benefit-body2' => '$1 {{PLURAL:$1|stranica|stranice|stranica}}',
+'createacct-benefit-body3' => 'nedavni {{PLURAL:$1|donator|donatora}}',
 'badretype' => 'Lozinke koje ste unijeli se ne poklapaju.',
 'userexists' => 'Uneseno korisničko ime već je u upotrebi.
 Unesite neko drugo ime.',
 'loginerror' => 'Greška pri prijavljivanju',
+'createacct-error' => 'Pogreška u stvaranju računa',
 'createaccounterror' => 'Ne može se napraviti račun: $1',
 'nocookiesnew' => "Korisnički nalog je napravljen, ali niste prijavljeni.
 {{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.
@@ -731,7 +766,7 @@ Da biste završili prijavu, morate unijeti novu šifru ovdje:',
 'newpassword' => 'Nova šifra:',
 'retypenew' => 'Ukucajte ponovo novu šifru:',
 'resetpass_submit' => 'Odredi lozinku i prijavi se',
-'resetpass_success' => 'Vaša šifra je uspiješno promjenjena! Prijava u toku...',
+'changepassword-success' => 'Vaša šifra je uspiješno promjenjena! Prijava u toku...',
 'resetpass_forbidden' => 'Šifre ne mogu biti promjenjene',
 'resetpass-no-info' => 'Morate biti prijavljeni da bi ste pristupili ovoj stranici direktno.',
 'resetpass-submit-loggedin' => 'Promijeni lozinku',
@@ -743,10 +778,11 @@ Možda ste već uspješno promijenili Vašu lozinku ili ste tražili novu privre
 
 # Special:PasswordReset
 'passwordreset' => 'Ponovno postavi lozinku',
-'passwordreset-text' => 'Dovršite ovaj obrazac kako biste resetirali svoju lozinku/zaporku.',
+'passwordreset-text-one' => 'Dovršite ovaj obrazac kako biste resetirali svoju lozinku/zaporku.',
+'passwordreset-text-many' => '{{PLURAL:$1|Ispunite jedno od polja kako bi ste resetirali svoju lozinku/zaporku.}}',
 'passwordreset-legend' => 'Ponovno postavi lozinku',
 'passwordreset-disabled' => 'Ponovno postavljanje lozinke je onemogućeno na ovom wikiju.',
-'passwordreset-pretext' => '{{PLURAL:$1||Unesite jedan dio podataka ispod}}',
+'passwordreset-emaildisabled' => 'Postavke E-maila su deaktivirane na ovoj wiki.',
 'passwordreset-username' => 'Korisničko ime:',
 'passwordreset-domain' => 'Domena:',
 'passwordreset-capture' => 'Pogledati krajnji e-mail?',
@@ -775,7 +811,7 @@ možete zanemariti ovu poruku i nastaviti koristiti staru lozinku.',
 Privremena šifra: $2',
 'passwordreset-emailsent' => 'E-mail za resetiranje lozinke/zaporke je poslan.',
 'passwordreset-emailsent-capture' => 'E-mail za resetiranje lozinke/zaporke je poslan (prikazan dolje).',
-'passwordreset-emailerror-capture' => 'E-mail s podsjetnikom, prikazan dolje, je poslan, ali slanje korisniku nije uspjelo: $1',
+'passwordreset-emailerror-capture' => 'E-mail za resetiranje lozinke/zaporke, prikazan dolje, je poslan, ali slanje {{GENDER:$2|korisniku|korisnici|korisniku}} nije uspjelo: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Promijeni e-mail adresu',
@@ -992,12 +1028,15 @@ Nije ponuđeno nikakvo objašnjenje.',
 Izgleda da je obrisana.',
 'edit-conflict' => 'Sukob izmjena.',
 'edit-no-change' => 'Vaša izmjena je ignorirana, jer nije bilo promjena teksta stranice.',
+'postedit-confirmation' => 'Vaša izmjena je snimljena.',
 'edit-already-exists' => 'Stranica nije mogla biti kreirana.
 Izgleda da već postoji.',
 'defaultmessagetext' => 'Uobičajeni tekst poruke',
 'content-failed-to-parse' => 'Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3',
 'invalid-content-data' => 'Neispravni podaci sadržaja',
 'content-not-allowed-here' => 'Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]',
+'editwarning-warning' => 'Napuštanje ove stranice može dovesti do gubitka svih promjena koje ste načinili.
+Ako ste prijavljeni, možete isključiti ovo upozorenje u sekciji "Uređivanje" vaših postavki.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1033,6 +1072,7 @@ Molimo da provjerite usporedbu ispod da budete sigurni da to želite učiniti, a
 'undo-failure' => 'Izmjene se ne mogu vratiti zbog konflikta sa izmjenama u međuvremenu.',
 'undo-norev' => 'Izmjena se ne može vratiti jer ne postoji ranija ili je obrisana.',
 'undo-summary' => 'Vraćena izmjena $1 [[Special:Contributions/$2|korisnika $2]] ([[User talk:$2|razgovor]])',
+'undo-summary-username-hidden' => 'Poništi izmjenu $1 od skrivenog korisnika',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Nije moguće napraviti korisnički račun',
@@ -1214,6 +1254,7 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
 'compareselectedversions' => 'Uporedite označene verzije',
 'showhideselectedversions' => 'Pokaži/sakrij odabrane verzije',
 'editundo' => 'ukloni ovu izmjenu',
+'diff-empty' => '(nema razlike)',
 'diff-multi' => '({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}}) od strane {{PLURAL:$2|korisnika|korisnika}}',
 'diff-multi-manyusers' => '({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}}) od strane {{PLURAL:$2|korisnika|korisnika}}',
 'difference-missing-revision' => 'Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).
@@ -1241,7 +1282,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Opcije pretrage',
 'searchmenu-exists' => "'''Postoji stranica pod nazivom \"[[:\$1]]\" na ovoj wiki'''",
 'searchmenu-new' => "'''Napravi stranicu \"[[:\$1|\$1]]\" na ovoj wiki!'''",
-'searchhelp-url' => 'Help:Sadržaj',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Pregledaj stranice sa ovim prefiksom]]',
 'searchprofile-articles' => 'Stranice sadržaja',
 'searchprofile-project' => 'Stranice pomoći i projekta',
@@ -1285,15 +1325,7 @@ Pokušajte u svoju pretragu staviti ''all:'' da se pretražuje cjelokupan sadrž
 'searchdisabled' => 'Pretraga teksta na ovoj Wiki je trenutno onemogućena.
 U međuvremenu možete pretraživati preko Googlea.
 Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
-
-# Quickbar
-'qbsettings' => 'Podešavanja brze palete',
-'qbsettings-none' => 'Nikakva',
-'qbsettings-fixedleft' => 'Fiksirana lijevo',
-'qbsettings-fixedright' => 'Fiksirana desno',
-'qbsettings-floatingleft' => 'Plutajuća lijevo',
-'qbsettings-floatingright' => 'Plutajuća desno',
-'qbsettings-directionality' => 'Fiksno, ovisno o smjeru pisma Vašeg jezika',
+'search-error' => 'Dogodila se pogreška prilikom pretraživanja: $1',
 
 # Preferences page
 'preferences' => 'Postavke',
@@ -1327,7 +1359,6 @@ Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
 'resetprefs' => 'Poništi nesnimljene promjene postavki',
 'restoreprefs' => 'Vrati sve pretpostavljene postavke',
 'prefs-editing' => 'Uređivanje',
-'prefs-edit-boxsize' => 'Veličina prozora za uređivanje.',
 'rows' => 'Redova:',
 'columns' => 'Kolona:',
 'searchresultshead' => 'Postavke rezultata pretrage',
@@ -1338,9 +1369,6 @@ Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
 'recentchangesdays-max' => '(najviše $1 {{PLURAL:$1|dan|dana}})',
 'recentchangescount' => 'Broj uređivanja za prikaz po pretpostavkama:',
 'prefs-help-recentchangescount' => 'Ovo uključuje nedavne izmjene, historije stranice i registre.',
-'prefs-help-watchlist-token' => 'Popunjavanjem ovog polja tajnim ključem će generisati RSS feed za Vaš spisak praćenja.
-Svako ko zna ključ u ovom polju će biti u mogućnosti da pročita Vaš spisak praćenja, tako da trebate izabrati sigurnu vrijednost.
-Ovdje su navedene neke nasumično odabrane vrijednosti koje možete koristiti: $1',
 'savedprefs' => 'Vaša postavke su snimljene.',
 'timezonelegend' => 'Vremenska zona:',
 'localtime' => 'Lokalno vrijeme:',
@@ -1371,7 +1399,6 @@ Ovdje su navedene neke nasumično odabrane vrijednosti koje možete koristiti: $
 'prefs-reset-intro' => 'Možete koristiti ovu stranicu da poništite Vaše postavke na ovom sajtu na pretpostavljene vrijednosti.
 Ovo se ne može vratiti unazad.',
 'prefs-emailconfirm-label' => 'E-mail potvrda:',
-'prefs-textboxsize' => 'Veličina prozora za uređivanje',
 'youremail' => 'E-mail:',
 'username' => 'Ime {{GENDER:$1|korisnika|korisnice}}:',
 'uid' => '{{GENDER:$1|Korisnički}} ID:',
@@ -1405,6 +1432,8 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'prefs-dateformat' => 'Format datuma',
 'prefs-timeoffset' => 'Vremenska razlika',
 'prefs-advancedediting' => 'Općenito',
+'prefs-editor' => 'Uređivač',
+'prefs-preview' => 'Pretpregled',
 'prefs-advancedrc' => 'Napredne opcije',
 'prefs-advancedrendering' => 'Napredne opcije',
 'prefs-advancedsearchoptions' => 'Napredne opcije',
@@ -1439,6 +1468,8 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'userrights-notallowed' => 'Vaš račun Vam ne daje dozvolu da postavljate i uklanjate korisnička prava.',
 'userrights-changeable-col' => 'Grupe koje možete mijenjati',
 'userrights-unchangeable-col' => 'Grupe koje ne možete mijenjati',
+'userrights-conflict' => 'Sukob u korisničkim pravima! Molimo pošaljite Vaše promjene ponovno.',
+'userrights-removed-self' => 'Uspješno ste uklonili vlastite prava. Zbog toga više niste u stanju pristupiti ovoj stranici.',
 
 # Groups
 'group' => 'Grupa:',
@@ -1504,11 +1535,19 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'right-proxyunbannable' => 'Zaobilaženje automatskih blokada proxy-ja',
 'right-unblockself' => 'Deblokiranje samog sebe',
 'right-protect' => 'Promjena nivoa zaštite i uređivanje kaskadno zaštićenih stranica',
-'right-editprotected' => 'Uređivanje zaštićenih stranica (bez povezanih zaštita)',
+'right-editprotected' => 'Uređivanje stranice zaštićenih kao "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Uređivanje stranica zaštićenih kao  "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Uređivanje korisničkog interfejsa',
 'right-editusercssjs' => 'Uređivanje CSS i JS datoteka drugih korisnika',
 'right-editusercss' => 'Uređivanje CSS datoteka drugih korisnika',
 'right-edituserjs' => 'Uređivanje Javascript datoteka drugih korisnika',
+'right-editmyusercss' => 'Uredite svoje vlastite CSS datoteke',
+'right-editmyuserjs' => 'Uredite vlastite korisničke JavaScript datoteke',
+'right-viewmywatchlist' => 'Pregled vlastitog popisa praćenih stranica',
+'right-editmywatchlist' => 'Uredite vlastiti spisak praćenja. Obratite pažnju da će neke akcije dodati stranice čak bez ovog prava.',
+'right-viewmyprivateinfo' => 'Vidite svoje privatne podatke (npr. adresu e-pošte, stvarno ime)',
+'right-editmyprivateinfo' => 'Uredite svoje privatne podatke (npr. adresa e-pošte, stvarno ime)',
+'right-editmyoptions' => 'Uredite svoje postavke',
 'right-rollback' => 'Brzo vraćanje izmjena na zadnjeg korisnika koji je uređivao određenu stranicu',
 'right-markbotedits' => 'Označavanje vraćenih izmjena kao izmjene bota',
 'right-noratelimit' => 'Izbjegavanje ograničenja uzrokovanih brzinom',
@@ -1570,12 +1609,17 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'action-userrights-interwiki' => 'uređivanje korisničkih prava na drugim wikijima',
 'action-siteadmin' => 'zaključavanje i otključavanje baze podataka',
 'action-sendemail' => 'pošalji e-poštu',
+'action-editmywatchlist' => 'uredite svoj spisak praćenja',
+'action-viewmywatchlist' => 'pogledajte svoj spisak praćenja',
+'action-viewmyprivateinfo' => 'pogledajte svoje privatne informacije',
+'action-editmyprivateinfo' => 'uredite svoje privatne informacije',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}',
 'recentchanges' => 'Nedavne izmjene',
 'recentchanges-legend' => 'Postavke za Nedavne promjene',
 'recentchanges-summary' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
+'recentchanges-noresult' => 'Bez promjena tokom cijelog perioda koji ispunjava ove kriterije.',
 'recentchanges-feed-description' => 'Praćenje nedavnih izmjena na ovom wikiju u ovom feedu.',
 'recentchanges-label-newpage' => 'Ovom izmjenom je stvorena nova stranica',
 'recentchanges-label-minor' => 'Ovo je manja izmjena',
@@ -1612,7 +1656,6 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'recentchangeslinked-feed' => 'Srodne izmjene',
 'recentchangeslinked-toolbox' => 'Srodne izmjene',
 'recentchangeslinked-title' => 'Srodne promjene sa "$1"',
-'recentchangeslinked-noresult' => 'Nema izmjena na povezanim stranicama u zadanom periodu.',
 'recentchangeslinked-summary' => "Ova posebna stranica prikazuje promjene na povezanim stranicama.
 Stranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podebljane'''.",
 'recentchangeslinked-page' => 'Naslov stranice:',
@@ -1624,7 +1667,7 @@ Stranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podeblja
 'reuploaddesc' => 'Vratite se na upitnik za slanje',
 'upload-tryagain' => 'Pošaljite izmijenjeni opis datoteke',
 'uploadnologin' => 'Niste prijavljeni',
-'uploadnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] da bi ste slali datoteke.',
+'uploadnologintext' => 'Morate biti $1 da bi ste slali datoteke.',
 'upload_directory_missing' => 'Folder za postavljanje ($1) nedostaje i webserver ga ne može napraviti.',
 'upload_directory_read_only' => 'Folder za postavljanje ($1) na webserveru je postavljen samo za čitanje.',
 'uploaderror' => 'Greška pri slanju',
@@ -1844,7 +1887,6 @@ Za optimalnu sigurnost, img_auth.php je onemogućena.',
 'http-read-error' => 'Greška pri čitanju HTTP.',
 'http-timed-out' => 'Istekao HTTP zahtjev.',
 'http-curl-error' => 'Greška pri otvaranju URLa: $1',
-'http-host-unreachable' => 'Ovaj URL nije bilo moguće otvoriti',
 'http-bad-status' => 'Nastao je problem tokom HTTP zahtjeva: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1997,12 +2039,6 @@ Prije brisanja provjerite da li druge stranice vode na te šablone.',
 'statistics-users-active-desc' => 'Korisnici koju su izvršili akciju u toku {{PLURAL:$1|zadnjeg dana|zadnja $1 dana|zadnjih $1 dana}}',
 'statistics-mostpopular' => 'Najviše pregledane stranice',
 
-'disambiguations' => 'Stranice do višeznačnih odrednica',
-'disambiguationspage' => 'Template:Višeznačna odrednica',
-'disambiguations-text' => "Slijedeće stranice su povezane sa '''stranicom za razvrstavanje'''.
-One se možda moraju povezati sa konkretnim člankom.<br />
-Stranica se smatra stranicom za razvrstavanje, ukoliko koristi šablon koji je povezan sa spiskom [[MediaWiki:Disambiguationspage|stranica za razvrstavanje]]",
-
 'pageswithprop' => 'Stranice sa svojstvom stranice',
 'pageswithprop-legend' => 'Stranice sa svojstvom stranice',
 'pageswithprop-text' => 'Ova stranica navodi stranice sa specifičnim svojstvom stranice.',
@@ -2257,7 +2293,6 @@ Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti n
 'unwatchthispage' => 'Ukinite praćenje',
 'notanarticle' => 'Nije članak',
 'notvisiblerev' => 'Posljednja izmjena drugog korisnika je bila izbrisana',
-'watchnochange' => 'Ništa što pratite nije promjenjeno u prikazanom vremenu.',
 'watchlist-details' => '{{PLURAL:$1|$1 stranica praćena|$1 stranice praćene|$1 stranica praćeno}} ne računajući stranice za razgovor.',
 'wlheader-enotif' => '* Obavještavanje e-poštom je omogućeno.',
 'wlheader-showupdated' => "* Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
@@ -2673,15 +2708,13 @@ Možda je već deblokirana.',
 Međutim, možda je blokirana kao dio bloka $2, koji se može deblokirati.',
 'ip_range_invalid' => 'Netačan raspon IP adresa.',
 'ip_range_toolarge' => 'Grupne blokade veće od /$1 nisu dozvoljene.',
-'blockme' => 'Blokiraj me',
 'proxyblocker' => 'Bloker proksija',
-'proxyblocker-disabled' => 'Ova funkcija je onemogućena.',
 'proxyblockreason' => 'Vaša IP adresa je blokirana jer je ona otvoreni proksi.  
 Molimo vas da kontaktirate vašeg davatelja internetskih usluga (Internet Service Provider-a) ili tehničku podršku i obavijestite ih o ovom ozbiljnom sigurnosnom problemu.',
-'proxyblocksuccess' => 'Proksi uspješno blokiran.',
 'sorbsreason' => 'Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL koji koristi {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL korišten od {{SITENAME}}.
 Ne možete napraviti račun',
+'xffblockreason' => 'IP adresa koja postoji u zagljavlju X-Forwarded-For, ili Vaša ili od proxy servera koji koristite, je blokirana. Originalni razlog za blokiranje je bio: $1',
 'cant-block-while-blocked' => 'Ne možete blokirati druge korisnike dok ste blokirani.',
 'cant-see-hidden-user' => 'Korisnik kojeg pokušavate blokirati je već blokiran i sakriven. 
 Pošto nemate prava hideuser (sakrivanje korisnika), ne možete vidjeti ni urediti korisnikovu blokadu.',
@@ -2846,6 +2879,8 @@ Molimo posjetite [//www.mediawiki.org/wiki/Localisation MediaWiki lokalizaciju]
 'thumbnail-more' => 'Uvećaj',
 'filemissing' => 'Nedostaje datoteka',
 'thumbnail_error' => 'Greška pri pravljenju umanjene slike: $1',
+'thumbnail_error_remote' => 'Poruka o pogrešci o $1:
+$2',
 'djvu_page_error' => 'DjVu stranica je van opsega',
 'djvu_no_xml' => 'Za XML-datoteku se ne može pozvati DjVu datoteka',
 'thumbnail-temp-create' => 'Ne mogu da napravim privremenu smanjenu sliku',
@@ -3145,11 +3180,25 @@ Njegovim izvršavanjem možete da ugrozite Vaš sistem.",
 'minutes' => '{{PLURAL:$1|$1 minut|$1 minuta|$1 minuta}}',
 'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
 'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
+'weeks' => '{{PLURAL:$1|$1 sedmica}}',
 'months' => '{{PLURAL:$1|$1 mjesec|$1 mjeseci}}',
 'years' => '{{PLURAL:$1|$1 godina|$1 godine|$1 godina}}',
 'ago' => 'prije $1',
 'just-now' => 'upravo sada',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|sat|sati}}',
+'minutes-ago' => '$1 {{PLURAL:$1|minut|minuta}}',
+'seconds-ago' => '$1 {{PLURAL:$1|sekunda|sekunde}}',
+'monday-at' => 'ponedjeljak u $1',
+'tuesday-at' => 'utorak u $1',
+'wednesday-at' => 'srijeda u $1',
+'thursday-at' => 'četvrtak u $1',
+'friday-at' => 'petak u $1',
+'saturday-at' => 'subota u $1',
+'sunday-at' => 'nedjelja u $1',
+'yesterday-at' => 'jučer u $1',
+
 # Bad image list
 'bad_image_list' => "Koristi se sljedeći format:
 
@@ -3177,7 +3226,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Širina',
 'exif-imagelength' => 'Visina',
 'exif-bitspersample' => 'Bita po komponenti',
@@ -3357,7 +3406,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
 'exif-originalimageheight' => 'Visina slike prije nego što je odrezana',
 'exif-originalimagewidth' => 'Širina slike prije nego što je odrezana',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nekompresovano',
 'exif-compression-2' => 'CCITT Grupa 3 1 — Dimenzionalno izmijenjeo Huffmanovo šifriranje po dužini',
 'exif-compression-3' => 'CCITT Group 3 faks kodiranje',
@@ -3752,7 +3801,6 @@ Također možete [[Special:EditWatchlist|koristiti standardni uređivač]].',
 'version-other' => 'Ostalo',
 'version-mediahandlers' => 'Upravljači medije',
 'version-hooks' => 'Kuke',
-'version-extension-functions' => 'Funkcije proširenja (ekstenzije)',
 'version-parser-extensiontags' => "Parser proširenja (''tagovi'')",
 'version-parser-function-hooks' => 'Kuke parserske funkcije',
 'version-hook-name' => 'Naziv kuke',
@@ -3774,12 +3822,17 @@ Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] z
 'version-entrypoints-header-entrypoint' => 'Ulazna tačka',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Putanja datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Idi',
-'filepath-summary' => 'Ova posebna stranica prikazuje potpunu putanju za datoteku.
-Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktno sa, s njima povezanim, programom.',
+# Special:Redirect
+'redirect' => 'Preusmjeravanje preko datoteke, korisnika ili ID-a izmjene',
+'redirect-legend' => 'Preusmjeravanje na datoteku ili stranicu',
+'redirect-summary' => 'Ova posebna stranica preusmjerava na datoteku (ako je navedeno ime datoteke), stranicu (ako postoji ID revizije) ili korisničku stranicu (ako postoji brojčani ID korisnika).',
+'redirect-submit' => 'Idi',
+'redirect-lookup' => 'Pregled:',
+'redirect-value' => 'Vrijednost:',
+'redirect-user' => 'Korisnički ID',
+'redirect-revision' => 'Izmjena stranice',
+'redirect-file' => 'Naziv datoteke',
+'redirect-not-exists' => 'Vrijednost nije pronađena',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Potraga za duplim datotekama',
@@ -3829,6 +3882,7 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'tags' => 'Oznake valjane izmjene',
 'tag-filter' => 'Filter [[Special:Tags|oznaka]]:',
 'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|tag|tagova}}]]: $2)',
 'tags-title' => 'Oznake',
 'tags-intro' => 'Ova stranica prikazuje spisak oznaka (tagova) koje softver može staviti na svaku izmjenu i njihovo značenje.',
 'tags-tag' => 'Naziv oznake',
@@ -3870,6 +3924,9 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'htmlform-submit' => 'Unesi',
 'htmlform-reset' => 'Vrati izmjene',
 'htmlform-selectorother-other' => 'Ostalo',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Odaberi opciju',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 sa podrškom pretrage cijelog teksta',
diff --git a/languages/messages/MessagesShi.php b/languages/messages/MessagesShi.php
index 02cac985..35fbfed4 100644
--- a/languages/messages/MessagesShi.php
+++ b/languages/messages/MessagesShi.php
@@ -43,9 +43,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ml uṭṭun n Midn lli swurn ɣ tasna yad',
 'tog-oldsig' => 'Asmmaql (Tiẓṛi) n ukrraj n ufus lli illan:',
 'tog-fancysig' => 'Skr akrrag n ufus s taɣarast  n  wikitext (bla azday utumatik)',
-'tog-externaleditor' => 'Swwur s yan umẓṛg u uṭṛiṣ n brra ( i imskarn lli bahra ḥrcnin, ira mayad riglaj iẓlin ɣ urdinatur)',
-'tog-externaldiff' => 'Skr s yan umsnaḥya abrrani ( i midn lli bahra ḥrcnin, mayad ira riglaj ɣ urdinatur)',
-'tog-showjumplinks' => 'Srɣ izdayn « Amuddu » d « acnubc » niḍ « Asiǧl » ɣ uflla n tasna',
 'tog-uselivepreview' => 'Skr s umẓri amaynu izrbn (ira JavaScript) (Arm)',
 'tog-forceeditsummary' => 'Ayyit tini iɣ ur iwiɣ imsmun n imbdln',
 'tog-watchlisthideown' => 'hbo ghayli bdlgh gh omdfor inu',
@@ -239,7 +236,7 @@ $1',
 'pool-queuefull' => 'Umuɣ n twuri iẓun (iεmr)',
 'pool-errorunknown' => 'Anzri (error) ur ittuyssan.',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'F {{SITENAME}}',
 'aboutpage' => "Project:f' mayad",
 'copyright' => 'Mayllan gis illa ɣ ddu $1.',
@@ -249,7 +246,6 @@ $1',
 'disclaimers' => 'Ur darssuq',
 'disclaimerpage' => 'Project: Ur illa maddar illa ssuq',
 'edithelp' => 'Aws ɣ tirra',
-'edithelppage' => 'Help:Imaratn',
 'helppage' => 'Help:Mayllan',
 'mainpage' => 'Tasana tamzwarut',
 'mainpage-description' => 'Tasna tamzwarut',
@@ -276,7 +272,6 @@ $1',
 'newmessagesdifflink' => 'Imbddeln imĝura',
 'youhavenewmessagesmulti' => 'Dark tibratin timaynutin ɣ $1',
 'editsection' => 'Ẓreg (bddel)',
-'editsection-brackets' => '[$1]',
 'editold' => 'Ẓreg (bddel)',
 'viewsourceold' => 'Mel aɣbalu',
 'editlink' => 'Ẓreg (bddel)',
@@ -326,12 +321,6 @@ Tifilit n tasnayin gaddanin ratn taft ɣid [[Special:SpecialPages|{{int:specialp
 # General errors
 'error' => 'Laffut',
 'databaseerror' => 'Laffut ɣ database',
-'dberrortext' => 'Tlla laffut ɣikli s tskert database.
-Ulla mayad kis kra ntmukrist.
-May igguran ittu isigal ɣ mayad igat.
-<blockquote><tt>$1</tt></blockquote>
-S ussiglad "<tt>$2</tt>".
-laffut d yurrin ɣ database "<tt>$3: $4</tt>".',
 'laggedslavemode' => 'Ḥan tasnayad ur gis graygan ambddel amaynu.',
 'readonly' => 'Tqqn tabase',
 'missing-article' => 'lqaa\'ida n lbayanat ortofa nass ad gh tawriqt  liss ikhssa asti taf limism "$1" $2.
@@ -416,7 +405,7 @@ Ussaɣ n isqdacn ḥiln hlli.
 'newpassword' => 'Awal iḥḍan amaynu:',
 'retypenew' => 'Als i tirra n w-awal iḥḍan:',
 'resetpass_submit' => 'Sbadl awal n uzri tkcmt',
-'resetpass_success' => 'Awal n uzri nk ibudl mzyan! rad nit tilit ɣ ifalan',
+'changepassword-success' => 'Awal n uzri nk ibudl mzyan! rad nit tilit ɣ ifalan',
 'resetpass_forbidden' => 'Iwaliwn n uzri ur ufan ad badln.',
 'resetpass-no-info' => 'illa fllak ad zwar tilit ɣ ifalan bac ad tkcmt s tasna yad',
 'resetpass-submit-loggedin' => 'Bdl awal n ukccum (tangalt)',
@@ -614,7 +603,6 @@ Tigira n ujbbad ns, ar takka yat tayafut bahra imqqurn,  ɣayan afan ur ttili.',
 'searchmenu-legend' => 'Istayn ucnubc',
 'searchmenu-exists' => '"\'Tlla yat tasna lli ilan assaɣ « [[:$1]] » ɣ wiki yad',
 'searchmenu-new' => "'''Skr Tasna « [[:$1|$1]] » ɣ wiki !'''",
-'searchhelp-url' => 'Help:Mayllan',
 'searchprofile-articles' => 'Mayllan ɣ tasna',
 'searchprofile-project' => 'Tisniwin n w-aws n usnfar',
 'searchprofile-images' => 'Multimedia',
@@ -657,14 +645,6 @@ Tigira n ujbbad ns, ar takka yat tayafut bahra imqqurn,  ɣayan afan ur ttili.',
 Tzdar at cabbat ɣilad ɣ Google.
 Izdar ad urtili ɣ isbidn n mayllan ɣ {{SITENAME}} .',
 
-# Quickbar
-'qbsettings' => 'Tafeggagt izrbn',
-'qbsettings-none' => 'Ur iḥudda',
-'qbsettings-fixedleft' => 'Aẓẓugz azlmaḍ',
-'qbsettings-fixedright' => 'Azzugz afasi',
-'qbsettings-floatingleft' => 'Yaywul su uzlmad',
-'qbsettings-floatingright' => 'Yaywul su ufasi',
-
 # Preferences page
 'preferences' => 'Timssusmin',
 'mypreferences' => 'Timssusmin',
@@ -689,7 +669,6 @@ Izdar ad urtili ɣ isbidn n mayllan ɣ {{SITENAME}} .',
 'resetprefs' => 'hiyd tghyirat li orsjilnin',
 'restoreprefs' => 'sglbd kollo regalega',
 'prefs-editing' => 'tahrir',
-'prefs-edit-boxsize' => 'hajm nafida n thrir',
 'rows' => 'sfof:',
 'columns' => 'aamida:',
 'searchresultshead' => 'Cabba',
@@ -793,7 +772,6 @@ Izdar ad urtili ɣ isbidn n mayllan ɣ {{SITENAME}} .',
 'recentchangeslinked-feed' => 'Imbddeln zund ɣwid',
 'recentchangeslinked-toolbox' => 'Imbddeln zund ɣwid',
 'recentchangeslinked-title' => 'Imbddeln li izdin "$1"',
-'recentchangeslinked-noresult' => 'Ur illi may budeln ɣ tisniwin li dar izdayn s ɣid',
 'recentchangeslinked-summary' => 'Ɣid umuɣ iymbddeln li ittyskarnin tigira yad ɣ tisniwin li ittuyzdayn d kra n tasna (ulla i igmamn n kra taggayt ittuyzlayn). Tisniwin  ɣ [[Special:Watchlist|Umuɣ n tisniwin li ttsaggat]].',
 'recentchangeslinked-page' => 'Assaɣ n tasna',
 'recentchangeslinked-to' => 'Afficher les changements vers les pages liées au lieu de la page donnée
@@ -847,8 +825,6 @@ Mel imbddeln z tisniwin li ittuyzdayni bla tasna li trit.',
 # Statistics
 'statistics' => 'Tisnaddanin',
 
-'disambiguationspage' => 'Template:Homonymie',
-
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byt|byt}}',
 'ncategories' => '$1 {{PLURAL:$1|taggayt|taggayin}}',
@@ -1286,17 +1262,12 @@ Wiyyaḍ raggis ḥbun s ɣiklli sttin kkan gantn.
 'version-other' => 'wayya',
 'version-mediahandlers' => 'motahakkimat lmedia',
 'version-hooks' => 'lkhtatif',
-'version-extension-functions' => 'lkhdaym n limtidad',
 'version-parser-extensiontags' => 'imarkiwn n limtidad n lmohalil',
 'version-parser-function-hooks' => 'lkhtatif ndala',
 'version-poweredby-others' => 'wiyyad',
 'version-software-product' => 'lmntoj',
 'version-software-version' => 'noskha',
 
-# Special:FilePath
-'filepath-page' => 'Asdaw:',
-'filepath-submit' => 'Ftu',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'smiyt n-wasdaw:',
 'fileduplicatesearch-submit' => 'Sigl',
diff --git a/languages/messages/MessagesSi.php b/languages/messages/MessagesSi.php
index 24b27a8a..4f40b1fd 100644
--- a/languages/messages/MessagesSi.php
+++ b/languages/messages/MessagesSi.php
@@ -222,9 +222,6 @@ $messages = array(
 'tog-shownumberswatching' => 'මුර කරනු ලබන පරිශීලකයන් සංඛ්‍යාව පෙන්වන්න',
 'tog-oldsig' => 'පවතින අත්සන:',
 'tog-fancysig' => 'අත්සන විකිපෙළ (ස්වයංක්‍රීය සබැඳියක් විරහිතව) ලෙසින් සලකන්න',
-'tog-externaleditor' => 'බාහිර සම්පාදකයක් භාවිත කරන්න (ප්‍රවීණයන් සඳහා පමණි, ඔබගේ පරිගණකයේ විශේෂිත වූ සැකසුම් අවශ්‍ය වේ. [//www.mediawiki.org/wiki/Manual:External_editors තවත් තොරතුරු.])',
-'tog-externaldiff' => 'බාහිර ප්‍රභේදයක් භාවිත කරන්න (ප්‍රවීණයන් සඳහා පමණි, ඔබගේ පරිගණකයේ විශේෂිත වූ සැකසුම් අවශ්‍ය වේ. [//www.mediawiki.org/wiki/Manual:External_editors තවත් තොරතුරු.])',
-'tog-showjumplinks' => '"වෙත පනින්න"  යන ප්‍රවේශතා සබැඳියන් සක්‍රීය කරන්න',
 'tog-uselivepreview' => 'තත්කාල පෙර-දසුන භාවිතා කරන්න (ජාවාස්ක්‍රිප්ට්) (පරීක්ෂණාත්මක)',
 'tog-forceeditsummary' => 'හිස් සංස්කරණ සාරාංශයකට මා ඇතුළු වන විට මාහට ඉඟි කරන්න',
 'tog-watchlisthideown' => 'මුර-ලැයිස්තුවෙන් මාගේ සංස්කරණ සඟවන්න',
@@ -238,6 +235,7 @@ $messages = array(
 'tog-showhiddencats' => 'සැඟවුනු ප්‍රවර්ග පෙන්වන්න',
 'tog-noconvertlink' => 'සබැඳියන්ගේ ශීර්ෂ පෙරැළීම අක්‍රීය කරන්න',
 'tog-norollbackdiff' => 'පුනරාවර්තනයක් කිරීමෙන් පසු වෙනස්වීම් අත්හරින්න',
+'tog-useeditwarning' => 'මා සංස්කරණ පිටුවක් සුරකිනු නොලැබූ වෙනස්කිරීම් සමඟ අතහැර යන විට අවවාද කරන්න',
 
 'underline-always' => 'සැමවිටම කරන්න',
 'underline-never' => 'කිසිවිටෙක නොකරන්න',
@@ -301,6 +299,18 @@ $messages = array(
 'oct' => 'ඔක්',
 'nov' => 'නොවැ',
 'dec' => 'දෙසැ',
+'january-date' => 'ජනවාරි $1',
+'february-date' => 'පෙබරවාරි $1',
+'march-date' => 'මාර්තු $1',
+'april-date' => 'අප්‍රේල් $1',
+'may-date' => 'මැයි $1',
+'june-date' => 'ජූනි $1',
+'july-date' => 'ජූලි $1',
+'august-date' => 'අගෝස්තු $1',
+'september-date' => 'සැප්තැම්බර් $1',
+'october-date' => 'ඔක්තොම්බර් $1',
+'november-date' => 'නොවැම්බර් $1',
+'december-date' => 'දෙසැම්බර් $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|ප්‍රවර්ගය|ප්‍රවර්ග}}',
@@ -321,7 +331,7 @@ $messages = array(
 'noindex-category' => 'සූචිගත නොකළ පිටු',
 'broken-file-category' => 'භින්න වූ ගොනු සබැඳි සහිත පිටු',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'පිළිබඳ',
 'article' => 'පටුන',
@@ -384,6 +394,7 @@ $messages = array(
 'create-this-page' => 'මෙම පිටුව තනන්න',
 'delete' => 'මකන්න',
 'deletethispage' => 'මෙම පිටුව මකන්න',
+'undeletethispage' => 'මෙම පිටුව මැකුම අවලංගු කරන්න',
 'undelete_short' => '{{PLURAL:$1|එක් සංස්කරණයක|සංස්කරණ $1 ක}} මකා දැමීම ප්‍රතිලෝම කරන්න',
 'viewdeleted_short' => 'මකා දමනු ලැබූ {{PLURAL:$1|එක් සංස්කරණයක්|සංස්කරණ $1  ක්}} බලන්න',
 'protect' => 'ආරක්‍ෂණය',
@@ -427,7 +438,7 @@ $1",
 'pool-queuefull' => 'පොරොත්තු ලේඛනය පිරී ඇත',
 'pool-errorunknown' => 'හඳුනා නොගත් දෝෂය',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} පිළිබඳ',
 'aboutpage' => 'Project:පිළිබඳ',
 'copyright' => ' $1 යටතේ අන්තර්ගතය දැක ගත හැක.',
@@ -437,7 +448,6 @@ $1",
 'disclaimers' => 'වියාචනයන්',
 'disclaimerpage' => 'Project:පොදු වියාචන',
 'edithelp' => 'සංස්කරණ උදවු',
-'edithelppage' => 'Help:සංස්කරණ',
 'helppage' => 'Help:පටුන',
 'mainpage' => 'මුල් පිටුව',
 'mainpage-description' => 'මුල් පිටුව',
@@ -466,7 +476,6 @@ $1",
 'newmessagesdifflinkplural' => 'අවසන් {{PLURAL:$1|වෙනස්වීම|වෙනස්වීම්}}',
 'youhavenewmessagesmulti' => 'ඔබ හට $1 හි නව පණිවුඩ ඇත',
 'editsection' => 'සංස්කරණය',
-'editsection-brackets' => '[$1]',
 'editold' => 'සංස්කරණය',
 'viewsourceold' => 'මූලාශ්‍රය නරඹන්න',
 'editlink' => 'සංස්කරණය',
@@ -518,17 +527,6 @@ $1",
 # General errors
 'error' => 'දෝෂය',
 'databaseerror' => 'දත්ත-ගබඩා දෝෂය',
-'dberrortext' => 'දත්තසංචිත විමසුම් කාරක-රීති දෝෂයක් සිදුවී ඇත.
-මෙය මෘදුකාංගයේ දෝෂයක් හඟවන්නක් විය හැක.
-අවසන් වරට උත්සාහ කල දත්ත-ගබඩා විමසුම:
-"<tt>$2</tt>" ශ්‍රිතය අනුසාරයෙන්
-<blockquote><tt>$1</tt></blockquote> විය.
-දත්තසංචිතය විසින් වාර්තාකල දෝෂය "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'දත්ත-ගබඩා විමසුමෙහි කාරක-රීති දෝෂයක් හට ගෙන ඇත.
-අවසන් වරට උත්සාහ කල දත්ත-ගබඩා විමසුම:
-"$2" ශ්‍රිතය අනුසාරයෙන්,
-"$1" විය
-දත්ත-ගබඩාව විසින් වාර්තා කල දෝෂය "$3: $4"',
 'laggedslavemode' => "'''අවවාදයයි:''' මෑත යාවත්කාලීන කිරීම් මෙම පිටුවෙහි අඩංගු නොවීමට ඉඩ ඇත.",
 'readonly' => 'දත්තසංචිතය අගුළුලා ඇත',
 'enterlockreason' => 'අවුරා දැමීමට හේතුවක් සපයන අතරතුර, ඇවිරීම මුදාහැරීමට බලාපොරොත්තු වන කාලසීමාව නිමානය කර දක්වන්න',
@@ -584,12 +582,15 @@ URL  සඳහන් කරමින්, මෙම කරුණ [[Special:ListUs
 'editinginterface' => "'''අවවාදයයි:''' මෘදුකාංගයට අතුරුමුව පෙළ සැපයීමට භාවිතා වන පිටුවක් ඔබ විසින් සංස්කරණය කරනු ලබයි.
 මෙම පිටුවට සිදු කරන වෙනස්වීම් විසින් අනෙකුත් පරිශීලකයන්ගේ පරිශීලක අතුරුමුවෙහි පෙනුමට බලපෑම් එල්ල කෙරෙනු ඇත.
 පරිවර්තන සඳහා, මීඩියාවිකි ප්‍රාදේශීයකරන ව්‍යාපෘතිය, [//translatewiki.net/wiki/Main_Page?setlang=si translatewiki.net], භාවිතා කිරීම සලකා බැලීමට කාරුණික වන්න.",
-'sqlhidden' => '(SQL query සඟවා ඇත)',
 'cascadeprotected' => '"තීරු දර්ශන" විකල්පය සක්‍රීයනය කොට එමගින් ආරක්‍ෂණය කල පහත දැක්වෙන {{PLURAL:$1|පිටුව|පිටු}} අඩංගු කර ඇති බැවින්, මෙම පිටුව සංස්කරණය කිරීමෙන් වලකා ඇත:
 $2',
 'namespaceprotected' => "'''$1''' නාමඅවකාශයෙහි පිටු සංස්කරණය කිරීමට ඔබහට අවසර නොමැත.",
 'customcssprotected' => 'මෙම CSS පිටුව සංස්කරණය කිරීමට ඔබට අවසර නොමැත්තේ එහි අනෙකුත් පරිශීලකයෙකුගේ පුද්ගලික පරිස්ථිතීන් අඩංගු බැවිනි.',
 'customjsprotected' => 'මෙම ජාවාස්ක්‍රිට් පිටුව සංස්කරණය කිරීමට ඔබට අවසර නොමැත්තේ එහි අනෙකුත් පරිශීලකයෙකුගේ පුද්ගලික පරිස්ථිතීන් අඩංගු බැවිනි.',
+'mycustomcssprotected' => 'මෙම CSS පිටුව සංස්කරණය කිරීමට ඔබට අවසර නොමැත.',
+'mycustomjsprotected' => 'මෙම ජාවාස්ක්‍රිප්ට් පිටුව සංස්කරණය කිරීමට ඔබට අවසර නොමැත.',
+'myprivateinfoprotected' => 'ඔබගේ පෞද්ගලික තොරතුරු සංස්කරණය කිරීමට ඔබට අවසර නොමැත.',
+'mypreferencesprotected' => 'ඔබගේ අභිරුචීන් සංස්කරණය කිරීමට ඔබට අවසර නොමැත.',
 'ns-specialprotected' => 'විශේෂ පිටු සංස්කරණය කිරීම සිදු කල නොහැක.',
 'titleprotected' => "මෙම ශීර්ෂ-නාමය තැනීම  [[User:$1|$1]] විසින් වාරණය කොට ඇත.
 මේ සඳහා  ''$2''  හේතුව දක්වා ඇත.",
@@ -609,10 +610,18 @@ $2',
 'welcomecreation-msg' => 'ඔබගේ ගිණුම තනා ඇත.
 ඔබගේ [[Special:Preferences|{{SITENAME}} අභිරුචීන්]] නෙස් කිරීමට අමතක නොකරන්න.',
 'yourname' => 'පරිශීලක නාමය:',
+'userlogin-yourname' => 'පරිශීලක නම',
+'userlogin-yourname-ph' => 'ඔබගේ පරිශීලක නම ඇතුළු කරන්න',
 'yourpassword' => 'මුරපදය:',
+'userlogin-yourpassword' => 'මුර පදය',
+'userlogin-yourpassword-ph' => 'ඔබගේ මුර පදය ඇතුළු කරන්න',
+'createacct-yourpassword-ph' => 'මුර පදයක් ඇතුළු කරන්න',
 'yourpasswordagain' => 'මුරපදය යළි ඇතුළු කරන්න:',
+'createacct-yourpasswordagain' => 'මුර පදය සනාථ කරන්න',
+'createacct-yourpasswordagain-ph' => 'මුර පදය යළි ඇතුළු කරන්න',
 'remembermypassword' => 'මාගේ පිවිසීම මෙම ගවේෂක මතකයෙහි (උපරිම ලෙස {{PLURAL:$1|දින|දින}}) $1 ක් මතක තබාගන්න',
-'securelogin-stick-https' => 'ඇතුල්වීමෙන් පසුවද HTTPS හරහා සම්බන්ධ වන්න',
+'userlogin-remembermypassword' => 'මා ප්‍රවිෂ්ටයෙහි තබන්න',
+'userlogin-signwithsecure' => 'ආරක්‍ෂිත සබඳතාව භාවිතා කරන්න',
 'yourdomainname' => 'ඔබගේ වසම:',
 'password-change-forbidden' => 'ඔබට මෙම විකියෙහි මුරපද වෙනස් කල නොහැක.',
 'externaldberror' => 'එක්කෝ සත්‍යාවත් දත්ත-ගබඩා දෝෂයක් පැවතුනි නැතිනම් ඔබගේ බාහිර ගිණුම යාවත්කාලීන කිරීමට ඔබ හට අවසර දී නොමැත.',
@@ -624,18 +633,34 @@ $2',
 'logout' => 'නික්මීම',
 'userlogout' => 'නික්මීම',
 'notloggedin' => 'ප්‍රවිසී නැත',
+'userlogin-noaccount' => 'ගිණුමක් නොමැතිද?',
+'userlogin-joinproject' => '{{SITENAME}}හා එක්වන්න',
 'nologin' => "ඔබ හට ගිණුමක් නොමැතිද? '''$1'''.",
 'nologinlink' => 'ගිණුමක් තනන්න',
 'createaccount' => 'අලුත් ගිණුමක් තනන්න',
 'gotaccount' => 'දැනටමත් ගිණුමක් තිබේද? $1.',
 'gotaccountlink' => 'පිවිසෙන්න',
 'userlogin-resetlink' => 'ඔබේ පිවිසුම් තොරතුරු අමතකද?',
+'helplogin-url' => 'Help:ප්‍රවිෂ්ට වීම',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ප්‍රවිෂ්ට වීමට උදවු වන්න]]',
+'createacct-join' => 'ඔබගේ තොරතුරු පහත ඇතුළු කරන්න.',
+'createacct-emailrequired' => 'වි-තැපෑල ලිපිනය',
+'createacct-emailoptional' => 'වි-තැපෑල ලිපිනය (විකල්ප)',
+'createacct-email-ph' => 'ඔබගේ වි-තැපෑල ලිපිනය ඇතුළු කරන්න',
 'createaccountmail' => 'තාවකාලික අහුඹු මුර පදයක් භාවිතා කර එය පහත දක්වා ඇති වි-තැපැල් ලිපිනයට යවන්න',
+'createacct-realname' => 'නියම නම (වෛකල්පීය)',
 'createaccountreason' => 'හේතුව:',
+'createacct-reason' => 'හේතුව',
+'createacct-reason-ph' => 'ඔබ තවත් ගිණුමක් තනන්නේ කුමක් නිසාද',
+'createacct-captcha' => 'ආරක්ෂක පරික්ෂාව',
+'createacct-benefit-body1' => '{{PLURAL:$1|සංස්කරණය|සංස්කරණ}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|පිටුව|පිටු}}',
+'createacct-benefit-body3' => 'මෑත{{PLURAL:$1|දායකයා|දායකයෝ}}',
 'badretype' => 'ඔබ ඇතුළු කල මුරපදය නොගැලපේ.',
 'userexists' => 'ඔබ ඇතුළු කල පරිශීලක නාමය දැනටමත් භාවිතයෙහි ඇත.
 කරුණාකර වෙනත් නමක් තෝරා ගන්න.',
 'loginerror' => 'පිවිසීමේ දෝෂයකි',
+'createacct-error' => 'ගිණුම් තැනීමේ දෝෂය',
 'createaccounterror' => 'ගිණුම නිර්මාණය කළ නොහැකි විය:$1',
 'nocookiesnew' => 'පරිශීලක ගිණුම තනා ඇති නමුදු, ඔබ ප්‍රවිසී නැත.
 පරිශීලකයන් ප්‍රවිෂ්ට කර ගැනීම සඳහා, {{SITENAME}} විසින් කුකී භාවිතා කරයි.
@@ -717,7 +742,7 @@ $2',
 'newpassword' => 'නව මුර-පදය:',
 'retypenew' => 'නව මුර-පදය නැවත ඇතුළු කරන්න:',
 'resetpass_submit' => 'මුර-පදය පූරණය කොට ඉන් පසු ප්‍රවිෂ්ට වන්න',
-'resetpass_success' => 'ඔබගේ මුර-පදය සාර්ථක ලෙස වෙනස් කරන ලදි! දැන් ඔබව ප්‍රවිෂ්ට කරගනිමින්...',
+'changepassword-success' => 'ඔබගේ මුර-පදය සාර්ථක ලෙස වෙනස් කරන ලදි! දැන් ඔබව ප්‍රවිෂ්ට කරගනිමින්...',
 'resetpass_forbidden' => 'මුර-පදයන් වෙනස් කිරීම  සිදු කල නොහැක',
 'resetpass-no-info' => 'මෙම පිටුව සෘජු ලෙස පරිශීලනය කෙරුමට ඔබ පළමු ප්‍රවිෂ්ට විය යුතුය.',
 'resetpass-submit-loggedin' => 'මුර-පදය වෙනස්කරන්න',
@@ -728,10 +753,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'මුරපදය වෙනස් කරන්න',
-'passwordreset-text' => 'ඔබගේ මුරපදය යළි සැකසීම සදහා මෙම ආකෘතිපත්‍රය පුරවන්න.',
 'passwordreset-legend' => 'මුරපදය යළි පිහිටුවන්න',
 'passwordreset-disabled' => 'මෙම විකියෙහි මුර පද ප්‍රත්‍යාරම්භ කිරීම් අක්‍රීය කොට ඇත.',
-'passwordreset-pretext' => '{{PLURAL:$1||පහත දැක්වෙන දත්ත කණ්ඩ වලින් එකක් ඇතුල් කරන්න}}',
 'passwordreset-username' => 'පරිශීලක නාමය:',
 'passwordreset-domain' => 'වසම:',
 'passwordreset-capture' => 'ප්‍රතිපලදායක විද්‍යුත් තැපෑල නරඹනවාද?',
@@ -964,10 +987,13 @@ $2
 එය මකා දමා ඇති බවක් පෙනේ.',
 'edit-conflict' => 'සංස්කරණ ගැටුම.',
 'edit-no-change' => 'පෙළට කිසිදු වෙනසක් සිදු නොකල  බැවින් ඔබගේ සංස්කරණය නොසලකාහරින ලදි.',
+'postedit-confirmation' => 'ඔබගේ සංස්කරණය සුරකින ලදී.',
 'edit-already-exists' => 'නව පිටුවක් තැනිය නොහැකි විය.
 එය දැනටමත් පවතියි.',
 'defaultmessagetext' => 'සාමාන්‍ය පණිවුඩ පෙළ',
 'invalid-content-data' => 'වලංගු නොවන අන්තර්ගත දත්ත',
+'editwarning-warning' => 'අවධානයට: මෙම පිටුවෙන් නික්ම යාම ඔබ සිදු කළ වෙනස්කම් නැතිවී යෑමට හේතු විය හැක.
+ඔබ ප්‍රවිෂ්ටවී ඇත්නම්, ඔබගේ වරණයන්වල "සංසකරණය කිරීම්" කොටසේ ඇති මෙම අනතුරු ඇඟවීම අක්‍රීය කළ හැක.',
 
 # Content models
 'content-model-wikitext' => 'විකිපෙළ',
@@ -1198,7 +1224,6 @@ $1",
 'searchmenu-legend' => 'ගවේෂණ තෝරාගැනීම්',
 'searchmenu-exists' => "'''මෙම විකියෙහි \"[[:\$1]]\" ලෙස නම් කර ඇති පිටුවක් ඇත.'''",
 'searchmenu-new' => "'''මෙම විකියෙහි \"[[:\$1]]\" පිටුව තනන්න!'''",
-'searchhelp-url' => 'Help:පටුන',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|මෙම උපසර්ගය භාවිත කරමින් පිටු පිරික්සන්න]]',
 'searchprofile-articles' => 'අන්තර්ගත පිටු',
 'searchprofile-project' => 'උදවු හා ව්‍යාපෘති පිටු',
@@ -1243,14 +1268,6 @@ $1",
 මේ අතරතුර ඔබ හට ගූගල් ඔස්සේ ගවේෂණය කල හැක.
 {{SITENAME}} අන්තර්ගතය පිළිබඳ ඔවුන්ගේ සූචි යල් පැන ගොස් ඇතිවා විය හැකි බව සටහන් කර ගන්න.',
 
-# Quickbar
-'qbsettings' => 'යුහුතීරුව',
-'qbsettings-none' => 'කිසිවක් නොමැත',
-'qbsettings-fixedleft' => 'ස්ථාවර වම',
-'qbsettings-fixedright' => 'ස්ථාවර දකුණ',
-'qbsettings-floatingleft' => 'ප්ලාවක වම',
-'qbsettings-floatingright' => 'ප්ලාවක දකුණ',
-
 # Preferences page
 'preferences' => 'අභිරුචි',
 'mypreferences' => 'අභිරුචීන්',
@@ -1283,7 +1300,6 @@ $1",
 'resetprefs' => 'නොසුරැකූ වෙනස්වීම් නිෂ්කාශනය කරන්න',
 'restoreprefs' => 'පෙරනිමි සැකසුම් සියල්ලම යළි-පිහිටුවන්න',
 'prefs-editing' => 'සංස්කරණය කිරීම්',
-'prefs-edit-boxsize' => 'සංස්කරණ ‍කවුළුවෙහි ප්‍රමාණය.',
 'rows' => 'පේළි:',
 'columns' => 'තීරු:',
 'searchresultshead' => 'ගවේෂණය',
@@ -1294,9 +1310,6 @@ $1",
 'recentchangesdays-max' => '(උපරිමයෙන් {{PLURAL:$1|එක් දිනක්|දින $1 ක්}})',
 'recentchangescount' => 'පෙරනිමියෙන් පෙන්විය යුතු සංස්කරණ ගණන:',
 'prefs-help-recentchangescount' => 'මෑත වෙනස්වීම්, පිටු ඉතිහාසයන්, සහ ලඝු-සටහන් මෙයට ඇතුලත් වෙති.',
-'prefs-help-watchlist-token' => 'මෙම පාටීරය වෙත රහස් කේතයක් ඇතුළු කිරීමෙන් ඔබගේ මුරලැයිස්තුව වෙත RSS පෝෂකයක් ජනනය වනු ඇත.
-මෙම පාටීරයෙහි කේතය දන්නා ඕනෑම අයෙකුට ඔබගේ මුරලැයිස්තුව කියවිය හැකි වන අතර, එබැවින්ම විරල එකක් තෝරාගන්න.
-ඔබට භාවිතා කල හැකි අහඹු ලෙස-ජනනය වූ අගයක් මෙන්න: $1',
 'savedprefs' => 'අභිරුචීන් සුරැකිනි.',
 'timezonelegend' => 'වේලා කලාපය:',
 'localtime' => 'ප්‍රාදේශීය වේලාව:',
@@ -1327,7 +1340,6 @@ $1",
 'prefs-reset-intro' => 'ඔබගේ අභිප්‍රේතයන්, අඩවි පෙරනිමි වෙතට යළි-පිහිටුවීම සඳහා, ඔබ හට මෙම පිටුව භාවිතා කල හැක.
 මෙය අහෝසි කල නොහැක.',
 'prefs-emailconfirm-label' => 'විද්‍යුත්-ලිපිනය තහවුරුකිරීම:',
-'prefs-textboxsize' => 'සංස්කරණ කවුළුවෙහි ප්‍රමාණය',
 'youremail' => 'විද්‍යුත් තැපෑල:',
 'username' => '{{GENDER:$1|පරිශීලක නාමය}}:',
 'uid' => '{{GENDER:$1|පරිශීලක}} අනන්‍යාංකය:',
@@ -1566,7 +1578,6 @@ HTML ටැගයන් පිරික්සන්න.',
 'recentchangeslinked-feed' => 'සහසම්බන්ධිත වෙනස්වීම්',
 'recentchangeslinked-toolbox' => 'සහසම්බන්ධිත වෙනස්වීම්',
 'recentchangeslinked-title' => '"$1" ආශ්‍රිත වෙනස්කිරීම්',
-'recentchangeslinked-noresult' => 'සලකා බැලූ කාලසීමාවෙහිදී, සබැඳි පිටු වල කිසිදු වෙනසක් සිදුවී නොමැත.',
 'recentchangeslinked-summary' => "විශේෂී ලෙස නිරූපිත පිටුවකට (හෝ විශේෂි ලෙස නිරූපිත ප්‍රවර්ගයක සාමාජීකයන්ට) සබැඳි පිටුවල මෑතදී සිදුවූ වෙනස්වීම් දැක්වෙන ලැයිස්තුවක් මෙහි දැක්වේ.
 [[Special:Watchlist|ඔබගේ  මුර-ලැයිස්තුවෙහි]] පිටු '''තදකුරු''' වලින් දක්වා ඇත.",
 'recentchangeslinked-page' => 'පිටු නාමය:',
@@ -1800,7 +1811,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization බලන්න.',
 'http-read-error' => 'HTTP කියැවුම් දෝෂය.',
 'http-timed-out' => 'HTTP අයැදුම සඳහා වූ කාලය ඉක්මව ඇත.',
 'http-curl-error' => 'අන්තර්ජාල ලිපිනය පමුණුවාගෙන ඒමේ දෝෂය : $1',
-'http-host-unreachable' => 'අන්තර්ජාල ලිපිනය වෙත සේන්දු විය නොහැකි විය',
 'http-bad-status' => 'HTTP ආයාචනයෙහිදී ගැටළුවක් පැන නැගුනි: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1948,12 +1958,6 @@ When filtered by user, only files where that user uploaded the most recent versi
 'statistics-users-active-desc' => 'පසුගිය {{PLURAL:$1|දිනය|දින $1}} තුලදී කිසියම් ක්‍රියාවක් සිදු කල පරිශීලකයන්',
 'statistics-mostpopular' => 'බෙහෙවින් නරඹනු ලබන පිටු',
 
-'disambiguations' => 'නිරාකරණ පිටු සඳහා සබැදෙන පිටු',
-'disambiguationspage' => 'Template:තේරුම් නිරාකරණය',
-'disambiguations-text' => "පහත දැක්වෙන පිටු අතර '''වක්‍රෝත්තිහරණ පිටුවකට''' සබැඳෙන එක් සබැඳියක් හෝ ඇත.
-ඒවා ඒ වෙනුවට අනුරූප මාතෘකාවට සබැඳිය යුතුය.<br />
-යම් පිටුවක් වක්‍රෝත්තිහරණ පිටුවක් ලෙස සලකනුයේ එය [[MediaWiki:Disambiguationspage]] වෙතින් සබැඳුනු සැකිල්ලක් භාවිතා කරන්නේ නම්ය.",
-
 'doubleredirects' => 'ද්විත්ව යළි-යොමුකිරීම්',
 'doubleredirectstext' => 'අනෙකුත් යළි-යොමුවීම් පිටුවලට යළි-යොමුවන පිටුවල ලැයිස්තුවක් මෙම පිටුවේ දැක්වේ.
 එක් එක් පේළියක අඩංගු වන්නේ පළමු හා දෙවන යළි-යොමුවීම් වලට සබැඳි හා ඒ සමග පළමු යළි-යොමුව එල්ල වන්නාවූ, සාමාන්‍යයෙන් "සත්‍ය" ඉලක්ක පිටුව වන, දෙවන යළි-යොමුවේ ඉලක්කයයි.<del>කපා හැරි</del> නිවේශිතයන් පිලිබඳ ගැටළු විසඳා ඇත.',
@@ -2193,10 +2197,9 @@ When filtered by user, only files where that user uploaded the most recent versi
 'unwatchthispage' => 'මුර-කිරීම නවතින්න',
 'notanarticle' => 'අන්තර්ගත පිටුවක් නොවේ',
 'notvisiblerev' => 'සංශෝධනය මකාදමා ඇත',
-'watchnochange' => 'ඔබ විසින් මුරකෙරෙන කිසිදු අයිතමයක් දක්වා ඇති කාල සීමාවෙහිදී  සංස්කරණයට භාජනය වී නොමැත.',
 'watchlist-details' => 'සාකච්ඡා පිටු නොගිණුනු කල, ඔබගේ මුර ලැයිස්තුවෙහි {{PLURAL:$1|එක් පිටුවක්|පිටු $1 ක්}} ඇත.',
-'wlheader-enotif' => '* විද්‍යුත්-තැපැල් දැනුම්දීම සක්‍රීය කෙරිණි.',
-'wlheader-showupdated' => "* ඔබ විසින් ඒවාට අවසන් වරට පිවිසුනු පසුව වෙනස්කෙරුනු පිටු  '''තදකුරු''' වලින් පෙන්වා ඇත",
+'wlheader-enotif' => 'විද්‍යුත්-තැපැල් දැනුම්දීම සක්‍රීය කෙරිණි.',
+'wlheader-showupdated' => "ඔබ විසින් ඒවාට අවසන් වරට පිවිසුනු පසුව වෙනස්කෙරුනු පිටු  '''තදකුරු''' වලින් පෙන්වා ඇත",
 'watchmethod-recent' => 'මුර-කෙරෙන පිටු සඳහා මෑත සංස්කරණයන් පරික්‍ෂා කරමින්',
 'watchmethod-list' => 'මෑත සංස්කරණයන් සඳහා මුර-කෙරෙන පිටු පරික්‍ෂා කරමින්',
 'watchlistcontains' => 'ඔබගේ මුර-ලැයිස්තුවෙහි  {{PLURAL:$1|එක් පිටුවක්|පිටු $1 ක්}} අඩංගුය.',
@@ -2598,12 +2601,9 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 එනමුදු, එය, $2 පරාසයෙහි කොටසක් ලෙස වාරණයට ලක් කොට ඇති අතර, එහි වාරණය අත්හිටුවිය හැක.',
 'ip_range_invalid' => 'අනීතික අන්තර්ජාල ලිපින පරාසයකි.',
 'ip_range_toolarge' => '/$1 ට වඩා විශාල පරාස කොටස්වලට ඉඩ ලබා නොදේ.',
-'blockme' => 'මා වාරණය කරන්න',
 'proxyblocker' => 'ප්‍රතියුක්ත (ප්‍රොක්සි) වාරණකරු',
-'proxyblocker-disabled' => 'මෙම කෘත්‍යය අක්‍රීය කොට ඇත.',
 'proxyblockreason' => 'ඔබගේ අන්තර්ජාල ලිපිනය විවෘත ප්‍රතියුක්තයක් (ප්‍රොක්සි) බැවින් එය වාරණය කොට ඇත.
 ඔබගේ අන්තර්ජාල සේවා ප්‍රතිපාදකයා හෝ තාක්ෂණික අනුග්‍රාහකයා හෝ අමතා මෙම බරපතළ ආරක්ෂණ ගැටළුව ඔවුනට නිරාවරණය කරන්න.',
-'proxyblocksuccess' => 'සිදුකලා.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'ඔබගේ අන්තර්ජාල ලිපිනය, {{SITENAME}} විසින් භාවිත වන DNSBL හි විවෘත නියුතුවක් (ප්‍රොක්සියක්) ලෙස ලැයිස්තුගත කොට ඇත.',
 'sorbs_create_account_reason' => 'ඔබගේ අන්තර්ජාල ලිපිනය, {{SITENAME}} විසින් භාවිත වන DNSBL හි විවෘත නියුතුවක් (ප්‍රොක්සියක්) ලෙස ලැයිස්තුගත කොට ඇත.
@@ -2916,26 +2916,15 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 
 # Stylesheets
 'common.css' => '/* මෙහි CSS  බහාලීම සියළු ඡවියයන් භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'standard.css' => '/* මෙහි CSS  බහාලීම සම්මත ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'nostalgia.css' => '/* මෙහි CSS  බහාලීම පිළිසැමරුම් ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
 'cologneblue.css' => '/* මෙහි CSS  බහාලීම "Cologne Blue" ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
 'monobook.css' => '/* මෙහි CSS  බහාලීම ඒකායන ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'myskin.css' => '/* මෙහි CSS  බහාලීම මගේ-ඡවිය ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'chick.css' => '/* මෙහි CSS  බහාලීම හැඩකාරී ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'simple.css' => '/* මෙහි CSS  බහාලීම සරල ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
 'modern.css' => '/* මෙහි CSS  බහාලීම නූතන ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
 'print.css' => '/* මෙහි CSS  බහාලීම මුද්‍රණ ප්‍රතිදානයට බලපෑම් සිදු කල හැක */',
-'handheld.css' => '/* මෙහි බහාලන CSS විසින් $wgHandheldStyle හි වින්‍යාසකෙරෙන ජවිය මත පදනම් වූ අතේ ගෙන යා හැකි උපකරණ වලට බලපෑම් කල හැක*/',
 
 # Scripts
 'common.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සෑම පිටු ප්‍රවේශනයකදීම සියළු පරිශීලකයන්හට ප්‍රවේශනය කෙරේ. */',
-'standard.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සම්මත ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
-'nostalgia.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් පිළි සැමරුම් ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
 'cologneblue.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සිහිල්-සුවඳ-පැන් ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
 'monobook.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් ඒකායන ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
-'myskin.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් මගේ-ඡවිය ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
-'chick.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් හැඩකාරී ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
-'simple.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සරල ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
 'modern.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් නූතන ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
 
 # Metadata
@@ -3141,7 +3130,7 @@ Others will be hidden by default.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'පළල',
 'exif-imagelength' => 'උස',
 'exif-bitspersample' => 'එක් සංරචකයකට බිට් ගණන',
@@ -3320,7 +3309,7 @@ Others will be hidden by default.
 'exif-personinimage' => 'පුද්ගලික වචනයෙන් විස්තර කරන ලද',
 'exif-originalimageheight' => 'කප්පාදුවට පෙර රූපයෙහි උස',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'අසංක්ෂිප්ත',
 'exif-compression-3' => 'CCITT සමූහය 3 ෆැක්ස් කේතීකරණය',
 'exif-compression-4' => 'CCITT සමූහය 4 ෆැක්ස් කේතීකරණය',
@@ -3797,7 +3786,6 @@ This confirmation code will expire at $4.',
 'version-other' => 'වෙනත්',
 'version-mediahandlers' => 'මාධ්‍ය හසුරුවනය',
 'version-hooks' => 'හසුරු',
-'version-extension-functions' => 'ප්‍රසර්ජිත කාර්යයන්',
 'version-parser-extensiontags' => 'ව්‍යාකරණ  විග්‍රහක ප්‍රසර්ජන ටැගයන්',
 'version-parser-function-hooks' => 'වයාකරණ විග්‍රහක ශ්‍රිත හසුරු',
 'version-hook-name' => 'හසුරු නම',
@@ -3818,13 +3806,6 @@ MediaWiki බෙදාහැර ඇත්තේ එය ප්‍රයෝජන
 'version-entrypoints-header-entrypoint' => 'නිවේශන ලක්ෂ්‍යය',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'ගොනු පෙත',
-'filepath-page' => 'ගොනුව:',
-'filepath-submit' => 'යන්න',
-'filepath-summary' => 'මෙම විශේෂ පිටුව ගොනුවකට අදාල සම්පූර්ණ පෙත හුවා දක්වයි.
-රූප පූර්ණ විසර්ජනයෙන් දැක්වෙන අතර, අනෙකුත් ගොනු වර්ග ඒවායේ ආශ්‍රිත ක්‍රමලේඛයන් අනුසාරයෙන් සෘජුව ආරම්භ කෙරේ.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'අනුපිටපත් ගොනු සඳහා ගවේෂණය කරන්න',
 'fileduplicatesearch-summary' => 'එහි පූරක අගය පාදක කර ගෙන අනුපිටපත් ගොනු සඳහා ගවේෂණය කරන්න.',
diff --git a/languages/messages/MessagesSk.php b/languages/messages/MessagesSk.php
index 31107f43..65f1589f 100644
--- a/languages/messages/MessagesSk.php
+++ b/languages/messages/MessagesSk.php
@@ -17,6 +17,7 @@
  * @author Maros
  * @author Michawiki
  * @author Mormegil
+ * @author Nemo bis
  * @author Palica
  * @author Pitr2311
  * @author Ragimiri
@@ -313,9 +314,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Zobraziť počet používateľov sledujúcich stránku',
 'tog-oldsig' => 'Súčasný podpis:',
 'tog-fancysig' => 'Považovať podpisy za wikitext (bez automatických odkazov)',
-'tog-externaleditor' => 'Používať štandardne externý editor (iba pre expertov, vyžaduje špeciálne nastavenie vášho počítača. [//www.mediawiki.org/wiki/Manual:External_editors Ďalšie informácie.])',
-'tog-externaldiff' => 'Používať štandardne externý diff (iba pre expertov, vyžaduje špeciálne nastavenie vášho počítača. [//www.mediawiki.org/wiki/Manual:External_editors Ďalšie informácie.])',
-'tog-showjumplinks' => 'Používať odkazy „skočiť na“ pre lepšiu dostupnosť',
 'tog-uselivepreview' => 'Používať živý náhľad(experimentálna funkcia)',
 'tog-forceeditsummary' => 'Upozoriť ma, keď nevyplním zhrnutie úprav',
 'tog-watchlisthideown' => 'Skryť moje úpravy zo zoznamu sledovaných',
@@ -329,6 +327,8 @@ $messages = array(
 'tog-showhiddencats' => 'Zobraziť skryté kategórie',
 'tog-noconvertlink' => 'Vypnúť konverziu názvov odkazov',
 'tog-norollbackdiff' => 'Vynechať rozdiel po vykonaní rollbacku',
+'tog-useeditwarning' => 'Upozorniť ma, keď opúšťam upravovaciu stránku s neuloženými zmenami',
+'tog-prefershttps' => 'Po prihlásení používať vždy zabezpečené pripojenie',
 
 'underline-always' => 'Vždy',
 'underline-never' => 'Nikdy',
@@ -392,6 +392,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1. januára',
+'february-date' => '$1. februára',
+'march-date' => '$1. marca',
+'april-date' => '$1. apríla',
+'may-date' => '$1. mája',
+'june-date' => '$1. júna',
+'july-date' => '$1. júla',
+'august-date' => '$1. augusta',
+'september-date' => '$1. septembra',
+'october-date' => '$1. októbra',
+'november-date' => '$1. novembra',
+'december-date' => '$1. decembra',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategória|Kategórie|Kategórie}}',
@@ -473,6 +485,7 @@ $messages = array(
 'create-this-page' => 'Vytvoriť túto stránku',
 'delete' => 'Vymazať',
 'deletethispage' => 'Vymazať túto stránku',
+'undeletethispage' => 'Obnoviť túto stránku',
 'undelete_short' => 'Obnoviť {{PLURAL:$1|jednu úpravu|$1 úpravy|$1 úprav}}',
 'viewdeleted_short' => 'Zobraziť {{PLURAL:$1|jednu zmazanú úpravu|$1 zmazané úpravy|$1 zmazaných úprav}}',
 'protect' => 'Zamknúť',
@@ -516,7 +529,7 @@ $1',
 'pool-queuefull' => 'Front je plný',
 'pool-errorunknown' => 'Neznáma chyba',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'O {{GRAMMAR:lokál|{{SITENAME}}}}',
 'aboutpage' => 'Project:Úvod',
 'copyright' => 'Obsah je dostupný pod $1, pokiaľ nie je uvedené inak.',
@@ -526,7 +539,6 @@ $1',
 'disclaimers' => 'Vylúčenie zodpovednosti',
 'disclaimerpage' => 'Project:Vylúčenie zodpovednosti',
 'edithelp' => 'Ako upravovať stránku',
-'edithelppage' => 'Help:Ako upravovať stránku',
 'helppage' => 'Help:Obsah',
 'mainpage' => 'Hlavná stránka',
 'mainpage-description' => 'Hlavná stránka',
@@ -603,17 +615,11 @@ Zoznam platných špeciálnych stránok nájdete na [[Special:SpecialPages|{{int
 # General errors
 'error' => 'Chyba',
 'databaseerror' => 'Chyba v databáze',
-'dberrortext' => 'V databázovom dopyte sa vyskytla syntaktická chyba.
-Príčinou môže byť chyba v softvéri.
-Posledný dopyt bol:
-<blockquote><tt>$1</tt></blockquote>
-z funkcie „<tt>$2</tt>“.
-Databáza vrátila chybu „<tt>$3: $4</tt>“.',
-'dberrortextcl' => 'Nastala syntaktická chyba pri požiadavke do databázy.
-Posledná požiadavka na databázu bola:
-„$1“
-z funkcie „$2“.
-Databáza vrátila chybu „$3: $4“.',
+'databaseerror-text' => 'Došlo k chybe pri otázke do databázy.
+Môže to byť spôsobené chybou v softvéri.',
+'databaseerror-query' => 'Otázka: $1',
+'databaseerror-function' => 'Funkcia: $1',
+'databaseerror-error' => 'Chyba: $1',
 'laggedslavemode' => 'Upozornenie: Je možné, že stránka neobsahuje posledné aktualizácie.',
 'readonly' => 'Databáza je zamknutá',
 'enterlockreason' => 'Zadajte dôvod požadovaného zamknutia vrátane odhadu, kedy očakávate odomknutie',
@@ -647,6 +653,7 @@ Možno ju už zmazal nieto iný.',
 'cannotdelete-title' => 'Nemôžete zmazať stránku „$1“',
 'delete-hook-aborted' => 'Zmazanie zrušila prídavná funkcia (prípojný bod syntaktického analyzátora).
 Neudala vysvetlenie.',
+'no-null-revision' => 'Nepodarilo sa vytvoriť novú prázdnu revíziu stránky „$1“',
 'badtitle' => 'Neplatný nadpis',
 'badtitletext' => 'Požadovaný nadpis bol neplatný, nezadaný, alebo nesprávne odkazovaný z inej jazykovej verzie {{GRAMMAR:genitív|{{SITENAME}}}}. Mohol tiež obsahovať jeden alebo viac znakov, ktoré nie je možné použiť v nadpisoch.',
 'perfcached' => 'Nasledujúce údaje pochádzajú z vyrovnávacej pamäte a nemusia byť úplne aktuálne. Vo vyrovnávacej pamäti {{PLURAL:$1|je dostupný|sú dostupné|je dostupných}} najviac {{PLURAL:$1|jeden výsledok|$1 výsledky|$1 výsledkov}}.',
@@ -667,12 +674,15 @@ Ak chcete pridať alebo zmeniť preklady pre všetky wiki, prosím, použite [//
 'editinginterface' => "'''Upozornenie:''' Upravujete stránku, ktorá poskytuje text používateľského rozhrania.
 Zmeny tejto stránky ovplyvnia vzhľad používateľského rozhrania ostatným používateľom.
 Ak chcete pridať alebo zmeniť preklady pre všetky wiki, prosím, použite [//translatewiki.net/wiki/Main_Page?setlang=sk translatewiki.net], projekt lokalizácie MediaWiki.",
-'sqlhidden' => '(SQL príkaz je skrytý)',
 'cascadeprotected' => 'Táto stránka bola zamknutá proti úpravám, pretože je použitá na {{PLURAL:$1|nasledovnej stránke, ktorá je zamknutá|nasledovných stránkach, ktoré sú zamknuté}} voľbou „kaskádového zamknutia“:
 $2',
 'namespaceprotected' => "Nemáte povolenie upravovať stránky v mennom priestore '''$1'''.",
 'customcssprotected' => 'Nemáte právo upravovať túto CSS stránku, pretože obsahuje osobné nastavenie iného používateľa.',
 'customjsprotected' => 'Nemáte právo upravovať túto JavaScript stránku, pretože obsahuje osobné nastavenie iného používateľa.',
+'mycustomcssprotected' => 'Nemáte povolenie na úpravu tejto CSS stránky.',
+'mycustomjsprotected' => 'Nemáte povolenie na úpravu tejto JavaScriptovej stránky.',
+'myprivateinfoprotected' => 'Nemáte povolenie na úpravu vašich súkromných informácií.',
+'mypreferencesprotected' => 'Nemáte povolenie na úpravu vašich nastavení.',
 'ns-specialprotected' => 'Stránky v mennom priestore {{ns:special}} nie je možné upravovať.',
 'titleprotected' => "Používateľ [[User:$1|$1]] zabránil vytváraniu stránky s týmto názvom.
 Udaný dôvod: ''$2''.",
@@ -697,10 +707,19 @@ Uvedomte si, že niektoré stránky sa môžu naďalej zobrazovať ako keby ste
 'welcomecreation-msg' => 'Váš účet bol vytvorený.
 Nezabudnite zmeniť svoje [[Special:Preferences|Predvoľby {{GRAMMAR:genitív|{{SITENAME}}}}]].',
 'yourname' => 'Používateľské meno:',
+'userlogin-yourname' => 'Používateľské meno',
+'userlogin-yourname-ph' => 'Zadajte svoje používateľské meno',
+'createacct-another-username-ph' => 'Zadajte svoje používateľské meno',
 'yourpassword' => 'Heslo:',
+'userlogin-yourpassword' => 'Heslo',
+'userlogin-yourpassword-ph' => 'Zadajte svoje heslo',
+'createacct-yourpassword-ph' => 'Zadajte heslo',
 'yourpasswordagain' => 'Zopakujte heslo:',
+'createacct-yourpasswordagain' => 'Potvrdiť heslo',
+'createacct-yourpasswordagain-ph' => 'Zadajte heslo znova',
 'remembermypassword' => 'Pamätať si prihlásenie na tomto počítači (naviac $1 {{PLURAL:$1|deň|dni|dní}})',
-'securelogin-stick-https' => 'Zostať pripojený cez HTTPS po prihlásení',
+'userlogin-remembermypassword' => 'Zapamätať si ma',
+'userlogin-signwithsecure' => 'Použiť zabezpečené pripojenie',
 'yourdomainname' => 'Vaša doména:',
 'password-change-forbidden' => 'Na tejto wiki si nemôžete zmeniť heslo.',
 'externaldberror' => 'Buď nastala chyba externej autentifikačnej databázy alebo vám nie je povolené aktualizovať váš externý účet.',
@@ -712,18 +731,44 @@ Nezabudnite zmeniť svoje [[Special:Preferences|Predvoľby {{GRAMMAR:genitív|{{
 'logout' => 'Odhlásiť',
 'userlogout' => 'Odhlásiť',
 'notloggedin' => 'Neprihlásený/á',
+'userlogin-noaccount' => 'Nemáte ešte účet?',
+'userlogin-joinproject' => 'Pridajte sa k {{GRAMMAR:lokál|{{SITENAME}}}}',
 'nologin' => 'Nemáte ešte účet? $1.',
 'nologinlink' => 'Vytvoriť nový účet',
 'createaccount' => 'Vytvoriť nový účet',
 'gotaccount' => "Máte už vytvorený účet? '''$1'''.",
 'gotaccountlink' => 'Prihlásiť',
 'userlogin-resetlink' => 'Zabudli ste svoje prihlasovacie údaje?',
+'userlogin-resetpassword-link' => 'Obnoviť heslo',
+'helplogin-url' => 'Help:Prihlasovanie',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc s prihlásením]]',
+'userlogin-loggedin' => 'Ste už {{GENDER:$1|prihĺasený|prihlásená}} ako $1.
+Pomocou formulára nižšie sa môžete prihlásiť ako iný redaktor.',
+'userlogin-createanother' => 'Vytvoriť ďalší účet',
+'createacct-join' => 'Vyplňte svoje údaje.',
+'createacct-another-join' => 'Vyplňte údaje nového účtu.',
+'createacct-emailrequired' => 'E-mailová adresa',
+'createacct-emailoptional' => 'E-mailová adresa (nepovinné)',
+'createacct-email-ph' => 'Zadajte vašu e-mailovú adresu',
+'createacct-another-email-ph' => 'Zadajte vašu e-mailovú adresu',
 'createaccountmail' => 'Použiť dočasné náhodné heslo a poslať ho na uvedenú emailovú adresu',
+'createacct-realname' => 'Skutočné meno (nepovinné)',
 'createaccountreason' => 'Dôvod:',
+'createacct-reason' => 'Dôvod',
+'createacct-reason-ph' => 'Prečo si vytvárate ďalší účet',
+'createacct-captcha' => 'Bezpečnostná kontrola',
+'createacct-imgcaptcha-ph' => 'Zadajte text, ktorý vidíte vyššie',
+'createacct-submit' => 'Vytvoriť účet',
+'createacct-another-submit' => 'Vytvoriť ďalší účet',
+'createacct-benefit-heading' => '{{grammar:4sg|{{SITENAME}}}} tvoria ľudia ako vy.',
+'createacct-benefit-body1' => '{{PLURAL:$1|úprava|úpravy|úprav}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|stránka|stránky|stránok}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nedávny prispievateľ|nedávni prispievatelia|nedávnych prispievateľov}}',
 'badretype' => 'Zadané heslá nie sú rovnaké.',
 'userexists' => 'Zadané používateľské meno sa už používa.
 Prosím, zvoľte si iné meno.',
 'loginerror' => 'Chyba pri prihlasovaní',
+'createacct-error' => 'Chyba pri vytváraní účtu',
 'createaccounterror' => 'Nepodarilo sa vytvoriť účet: $1',
 'nocookiesnew' => 'Používateľské konto bolo vytvorené, ale nie ste prihlásený. {{SITENAME}} používa cookies na prihlásenie. Máte cookies vypnuté. Zapnite ich a potom sa prihláste pomocou vášho nového používateľského mena a hesla.',
 'nocookieslogin' => '{{SITENAME}} používa cookies na prihlásenie. Vy máte cookies vypnuté. Prosíme, zapnite ich a skúste znovu.',
@@ -781,8 +826,8 @@ Z tohto dôvodu nemôžu návštevníci z tejto IP adresy momentálne vytvoriť
 
 Ak bol účet vytvorený omylom, túto správu môžete ignorovať.',
 'usernamehasherror' => 'Používateľské meno nemôže obsahovať znak mriežky.',
-'login-throttled' => 'Nedávno ste uskutočnili príliš mnoho neúspešných pokusov o prihlásenie.
-Prosím, počkajte predtým, než to skúsite znova.',
+'login-throttled' => 'Uskutočnili ste príliš mnoho neúspešných pokusov o prihlásenie.
+Prosím, počkajte $1 predtým, než to skúsite znova.',
 'login-abort-generic' => 'Vaše prihlásenie nebolo úspešné - zrušené',
 'loginlanguagelabel' => 'Jazyk: $1',
 'suspicious-userlogout' => 'Vaša požiadavka odhlásiť sa bola zamietnutá, pretože to vyzerá, že ju poslal pokazený prehliadač alebo proxy server.',
@@ -801,7 +846,7 @@ Prosím, počkajte predtým, než to skúsite znova.',
 'newpassword' => 'Nové heslo:',
 'retypenew' => 'Nové heslo (ešte raz):',
 'resetpass_submit' => 'Nastaviť heslo a prihlásiť sa',
-'resetpass_success' => 'Vaše heslo bolo úspešne zmenené! Prebieha prihlasovanie...',
+'changepassword-success' => 'Vaše heslo bolo úspešne zmenené! Prebieha prihlasovanie...',
 'resetpass_forbidden' => 'Heslá nie je možné zmeniť',
 'resetpass-no-info' => 'Aby ste mohli priamo pristupovať k tejto stránke, musíte sa prihlásiť.',
 'resetpass-submit-loggedin' => 'Zmeniť heslo',
@@ -813,10 +858,11 @@ Je možné, že sa vám už podarilo úspešne zmeniť svoje heslo alebo ste si
 
 # Special:PasswordReset
 'passwordreset' => 'Reset hesla',
-'passwordreset-text' => 'Vyplnením tohto formulára si vytvoríte nové heslo.',
+'passwordreset-text-one' => 'Pre získanie nového hesla vyplňte tento formulár.',
+'passwordreset-text-many' => '{{PLURAL:$1|Pre získanie nového hesla zadajte jeden z údajov.}}',
 'passwordreset-legend' => 'Obnoviť heslo',
 'passwordreset-disabled' => 'Obnovenie hesla bolo na tejto wiki zakázané.',
-'passwordreset-pretext' => '{{PLURAL:$1|Zadajte nižšie uvedený údaj|Zadajte jeden z nižšie uvedených údajov}}',
+'passwordreset-emaildisabled' => 'E-mailové funkcie boli na tejto wiki vypnuté.',
 'passwordreset-username' => 'Používateľské meno:',
 'passwordreset-domain' => 'Doména:',
 'passwordreset-capture' => 'Zobraziť výsledný e-mail?',
@@ -845,7 +891,7 @@ ignorovať a ďalej používať vaše staré heslo.',
 Dočasné heslo:$2',
 'passwordreset-emailsent' => 'Email s novým heslom bol odoslaný.',
 'passwordreset-emailsent-capture' => 'Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie.',
-'passwordreset-emailerror-capture' => 'Bol vytvorený pripomienkový e-mail, ktorý je zobrazený nižšie, ale nepodarilo sa ho odoslať používateľovi: $1',
+'passwordreset-emailerror-capture' => 'Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie, ale nepodarilo sa ho odoslať používateľovi: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Zmeniť emailovú adresu',
@@ -859,6 +905,9 @@ Dočasné heslo:$2',
 'changeemail-submit' => 'Zmeniť e-mail',
 'changeemail-cancel' => 'Zrušiť',
 
+# Special:ResetTokens
+'resettokens-tokens' => 'Tokeny:',
+
 # Edit page toolbar
 'bold_sample' => 'Tučný text',
 'bold_tip' => 'Tučný text',
@@ -1058,12 +1107,15 @@ Neudala vysvetlenie.',
 Zdá sa, že bola zmazaná.',
 'edit-conflict' => 'Konflikt pri upravovaní.',
 'edit-no-change' => 'Vaša úprava bola ignorovaná, pretože ste v texte nič nezmenili.',
+'postedit-confirmation' => 'Vaša úprava bola uložená.',
 'edit-already-exists' => 'Nebolo možné vytvoriť novú stránku.
 Už existuje.',
 'defaultmessagetext' => 'Predvolený text správy',
 'content-failed-to-parse' => 'Nepodarilo sa spracovať obsah $2 pre model $1: $3',
 'invalid-content-data' => 'Neplatné dáta obsahu',
 'content-not-allowed-here' => 'Obsah „$1“ nie je povolený na stránke [[$2]]',
+'editwarning-warning' => 'Ak opustíte túto stránku, môžete tým stratiť všetky vykonané zmeny.
+Ak ste prihlásený, toto upozornenie môžete vypnúť v sekcii „{{int:prefs-editing}}“ svojich nastavení.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1277,6 +1329,7 @@ Uistite sa, že táto zmena zachová historickú kontinuitu zmien stránky.',
 'compareselectedversions' => 'Porovnať označené verzie',
 'showhideselectedversions' => 'Zobraziť/skryť vybrané revízie',
 'editundo' => 'vrátiť',
+'diff-empty' => '(Žiaden rozdiel)',
 'diff-multi' => '{{PLURAL:$1|Jedna medziľahlá revízia|$1 medziľahlé revízie|$1 medziľahlých revízií}} od {{PLURAL:$2|jedného používateľa|$2 používateľov}} {{PLURAL:$1|nie je zobrazená|nie sú zobrazené|nie je zobrazených}}.',
 'diff-multi-manyusers' => '({{PLURAL:$1|$1 medziľahlá revízia|$1 medziľahlé revízie|$1 medziľahlých revízií}} od viac ako {{PLURAL:$2|$2 používateľa|$2 používateľov}} {{PLURAL:$1|nie je zobrazená|nie sú zobrazené|nie je zobrazených}})',
 'difference-missing-revision' => '{{PLURAL:$2|$2 revízia|$2 revízie|$2 revízií}} pre požadovaný rozdiel ($1) {{PLURAL:$2|neexistuje|neexistujú|neexistuje}}.
@@ -1304,7 +1357,6 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'searchmenu-legend' => 'Možnosti hľadania',
 'searchmenu-exists' => "*Stránka '''[[$1]]'''",
 'searchmenu-new' => "'''Vytvoriť stránku „[[:$1|$1]]“ na tejto wiki'''",
-'searchhelp-url' => 'Help:Obsah',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Prehliadať stránky s touto predponou]]',
 'searchprofile-articles' => 'Stránky s obsahom',
 'searchprofile-project' => 'Stránky pomocníka a projektu',
@@ -1345,15 +1397,7 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'powersearch-togglenone' => 'Žiadne',
 'search-external' => 'Externé vyhľadávanie',
 'searchdisabled' => 'Prepáčte! Fulltextové vyhľadávanie bolo dočasne vypnuté z dôvodu preťaženia. Zatiaľ môžete použiť hľadanie pomocou Google, ktoré však nemusí byť aktuálne.',
-
-# Quickbar
-'qbsettings' => 'Navigačný panel',
-'qbsettings-none' => 'Žiadne',
-'qbsettings-fixedleft' => 'Ukotvené vľavo',
-'qbsettings-fixedright' => 'Ukotvené vpravo',
-'qbsettings-floatingleft' => 'Plávajúce vľavo',
-'qbsettings-floatingright' => 'Plávajúce vpravo',
-'qbsettings-directionality' => 'Pevný, v závislosti na smerovosti písma vášho jazyka',
+'search-error' => 'Pri hľadaní sa vyskytla chyba:$1',
 
 # Preferences page
 'preferences' => 'Nastavenia',
@@ -1387,7 +1431,6 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'resetprefs' => 'Obnoviť pôvodné nastavenia',
 'restoreprefs' => 'Obnoviť všetky nastavenia na štandardné hodnoty',
 'prefs-editing' => 'Úpravy',
-'prefs-edit-boxsize' => 'Veľkosť okna na úpravy.',
 'rows' => 'Riadky:',
 'columns' => 'Stĺpce:',
 'searchresultshead' => 'Vyhľadávanie',
@@ -1398,8 +1441,6 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'recentchangesdays-max' => '(maximálne $1 {{PLURAL:$1|deň|dni|dní}})',
 'recentchangescount' => 'Štandardne zobrazovaný počet úprav:',
 'prefs-help-recentchangescount' => 'Toto sa týka posledných úprav, histórií stránok a záznamov.',
-'prefs-help-watchlist-token' => 'Ak vyplníte toto pole tajným kľúčom, bude sa tvoriť RSS kanál vášho zoznamu sledovaných. Ktokoľvek, kto pozná tajný kľúč v tomto poli bude môcť čítať váš zoznam sledovaných, preto dbajte na to, aby bol bezpečený.
-Tu je náhodne vytvorená hodnota, ktorú môžete použiť: $1',
 'savedprefs' => 'Vaše nastavenia boli uložené.',
 'timezonelegend' => 'Časové pásmo:',
 'localtime' => 'Miestny čas:',
@@ -1430,7 +1471,6 @@ Tu je náhodne vytvorená hodnota, ktorú môžete použiť: $1',
 'prefs-reset-intro' => 'Túto stránku môžete použiť na vrátenie predvolených hodnôt vašich nastavení.
 Túto operáciu nemožno vrátiť.',
 'prefs-emailconfirm-label' => 'Potvrdenie emailu:',
-'prefs-textboxsize' => 'Veľkosť okna na úpravy',
 'youremail' => 'Váš e-mail²',
 'username' => 'Používateľské meno:',
 'uid' => 'ID používateľa:',
@@ -1461,6 +1501,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'prefs-dateformat' => 'Formát dátumu',
 'prefs-timeoffset' => 'Časový posun',
 'prefs-advancedediting' => 'Rozšírené možnosti',
+'prefs-preview' => 'Náhľad',
 'prefs-advancedrc' => 'Rozšírené možnosti',
 'prefs-advancedrendering' => 'Rozšírené možnosti',
 'prefs-advancedsearchoptions' => 'Rozšírené možnosti',
@@ -1565,6 +1606,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'right-editusercssjs' => 'Upravovať CSS a JS súbory ostatných používateľov',
 'right-editusercss' => 'Upravovať CSS súbory ostatných používateľov',
 'right-edituserjs' => 'Upravovať JS súbory ostatných používateľov',
+'right-editmyoptions' => 'Upraviť vlastné nastavenia',
 'right-rollback' => 'Rýchlo vrátiť úpravy posledného používateľa, ktorý upravoval danú stránku',
 'right-markbotedits' => 'Označiť vrátené úpravy ako úpravy robota',
 'right-noratelimit' => 'Neovplyvnené obmedzeniami',
@@ -1626,12 +1668,18 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'action-userrights-interwiki' => 'upravovať práva používateľov na iných wiki',
 'action-siteadmin' => 'zamykať alebo odomykať databázu',
 'action-sendemail' => 'posielať e-maily',
+'action-editmywatchlist' => 'upraviť zoznam sledovaných stránok',
+'action-viewmywatchlist' => 'zobraziť zoznam sledovaných stránok',
+'action-viewmyprivateinfo' => 'zobraziť vaše súkromné údaje',
+'action-editmyprivateinfo' => 'upraviť vaše súkromné údaje',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|zmena|zmeny|zmien}}',
+'enhancedrc-history' => 'história',
 'recentchanges' => 'Posledné úpravy',
 'recentchanges-legend' => 'Možnosti posledných zmien',
 'recentchanges-summary' => 'Pomocou tejto stránky sledujete posledné úpravy wiki.',
+'recentchanges-noresult' => 'V danom období nie sú zmeny spĺňajúce tieto kritériá.',
 'recentchanges-feed-description' => 'Sledovať posledné úpravy tejto wiki týmto kanálom.',
 'recentchanges-label-newpage' => 'Táto úprava vytvorila novú stránku.',
 'recentchanges-label-minor' => 'Toto je drobná úprava',
@@ -1668,7 +1716,6 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'recentchangeslinked-feed' => 'Súvisiace úpravy',
 'recentchangeslinked-toolbox' => 'Súvisiace úpravy',
 'recentchangeslinked-title' => 'Zmeny týkajúce sa „$1”',
-'recentchangeslinked-noresult' => 'V zadanom období neboli odkazované stránky zmenené.',
 'recentchangeslinked-summary' => "Táto špeciálna stránka obsahuje zoznam posledných úprav stránok, ''na ktoré odkazuje'' zadaná stránka (alebo ktoré patria do zadanej kategórie).
 Stránky, ktoré sa nachádzajú vo vašom [[Special:Watchlist|zozname sledovaných]] sú vyznačené '''hrubo'''.",
 'recentchangeslinked-page' => 'Názov stránky:',
@@ -1680,7 +1727,7 @@ Stránky, ktoré sa nachádzajú vo vašom [[Special:Watchlist|zozname sledovan
 'reuploaddesc' => 'Zrušiť nahrávanie a vrátiť sa späť na nahrávací formulár.',
 'upload-tryagain' => 'Poslať zmenený popis súboru',
 'uploadnologin' => 'Nie ste prihlásený',
-'uploadnologintext' => 'Musíte byť [[Special:UserLogin|prihlásený/á]], aby ste mohli nahrávať súbory.',
+'uploadnologintext' => 'Musíte sa $1, aby ste mohli nahrávať súbory.',
 'upload_directory_missing' => 'Adresár pre nahrávanie ($1) chýba a webový server ho nedokáže vytvoriť.',
 'upload_directory_read_only' => 'Webový server nemôže zapisovať do adresára pre nahrávanie ($1).',
 'uploaderror' => 'Chyba pri nahrávaní',
@@ -1907,7 +1954,6 @@ Aby bolo zabezpečenie optimálne, img_auth.php je vypnutý.',
 'http-read-error' => 'Chyba čítania HTTP.',
 'http-timed-out' => 'Vyhradený čas požiadavky HTTP vypršal.',
 'http-curl-error' => 'Chyba pri sťahovaní URL: $1',
-'http-host-unreachable' => 'URL nie je dostupný',
 'http-bad-status' => 'Počas požiadavky HTTP nastal problém: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1935,6 +1981,10 @@ Aby bolo zabezpečenie optimálne, img_auth.php je vypnutý.',
 'listfiles_size' => 'Veľkosť (v bajtoch)',
 'listfiles_description' => 'Popis',
 'listfiles_count' => 'Verzie',
+'listfiles-show-all' => 'Vrátane starších verzií obrázkov',
+'listfiles-latestversion' => 'Aktuálna verzia',
+'listfiles-latestversion-yes' => 'Áno',
+'listfiles-latestversion-no' => 'Nie',
 
 # File description page
 'file-anchor-link' => 'Súbor',
@@ -2027,6 +2077,13 @@ Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
 'randompage' => 'Náhodná stránka',
 'randompage-nopages' => '{{PLURAL:$2|V mennom priestore „$1“ nie sú žiadne stránky.|V nasledovných menných priestoroch nie sú žiadne stránky: $1}}',
 
+# Random page in category
+'randomincategory' => 'Náhodná stránka v kategórii',
+'randomincategory-invalidcategory' => '"$1" nie je platný názov kategórie.',
+'randomincategory-nopages' => 'V [[:Category:$1|kategórii $1]] nie sú žiadne stránky.',
+'randomincategory-selectcategory' => 'Získať náhodnú stránku z kategórie: $1 $2',
+'randomincategory-selectcategory-submit' => 'Ísť na',
+
 # Random redirect
 'randomredirect' => 'Náhodná presmerovacia stránka',
 'randomredirect-nopages' => 'V mennom „$1“ priestore nie sú žiadne presmerovania.',
@@ -2052,12 +2109,6 @@ Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
 'statistics-users-active-desc' => 'Používatelia, ktorí za {{PLURAL:$1|posledný deň|posledné $1 dni|posledných $1 dní}} vykonali nejakú operáciu',
 'statistics-mostpopular' => 'Najčastejšie prezerané stránky',
 
-'disambiguations' => 'Stránky odkazujúce na rozlišovacie stránky',
-'disambiguationspage' => 'Template:Rozlišovacia stránka',
-'disambiguations-text' => "Nasledovné stránky odkazujú na '''rozlišovaciu stránku'''.
-Mali by však odkazovať priamo na príslušnú tému.<br />
-Stránka sa považuje za rozlišovaciu, keď používa šablónu, na ktorú odkazuje [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Stránky s vlastnosťou stránky',
 'pageswithprop-legend' => 'Stránky s vlastnosťou stránky',
 'pageswithprop-text' => 'Táto stránka obsahuje stránky, ktoré používajú konkrétnu vlastnosť stránky.',
@@ -2120,6 +2171,7 @@ Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riad
 'mostrevisions' => 'Stránky s najväčším počtom úprav',
 'prefixindex' => 'Všetky stránky s predponou',
 'prefixindex-namespace' => 'Všetky stránky s predponou (menný priestor $1)',
+'prefixindex-strip' => 'Zobraziť bez predpony',
 'shortpages' => 'Krátke stránky',
 'longpages' => 'Dlhé stránky',
 'deadendpages' => 'Slepé stránky',
@@ -2311,10 +2363,9 @@ Budú tam uvedené aj budúce úpravy tejto stránky a jej diskusie.',
 'unwatchthispage' => 'Prestať sledovať túto stránku',
 'notanarticle' => 'Toto nie je stránka',
 'notvisiblerev' => 'Revízia bola zmazaná',
-'watchnochange' => 'V rámci zobrazeného času nebola upravená žiadna z vašich sledovaných stránok.',
 'watchlist-details' => '{{PLURAL:$1|Jedna sledovaná stránka|$1 sledované stránky|$1 sledovaných stránok}}, nepočítajúc diskusné stránky.',
-'wlheader-enotif' => '* Upozorňovanie e-mailom je zapnuté.',
-'wlheader-showupdated' => "* Stránky, ktoré boli zmené od vašej poslednej návštevy sú zobrazené '''tučne'''.",
+'wlheader-enotif' => 'Upozorňovanie e-mailom je zapnuté.',
+'wlheader-showupdated' => "Stránky, ktoré boli zmenené od vašej poslednej návštevy sú zobrazené '''tučne'''.",
 'watchmethod-recent' => 'kontrolujú sa sledované stránky v posledných úpravách',
 'watchmethod-list' => 'kontrolujú posledné úpravy v sledovaných stránkach',
 'watchlistcontains' => 'Váš zoznam sledovaných obsahuje {{PLURAL:$1|jednu stránku|$1 stránky|$1 stránok}}.',
@@ -2709,11 +2760,8 @@ blokované IP adresy nie sú zahrnuté. Pozri zoznam
 'ipb_blocked_as_range' => 'Chyba: IP adresa $1 nie je blokovaná priamo a nie je ju teda možné odblokovať. Je však blokovaná v rámci rozsahu $2, ktorý je možné odblokovať.',
 'ip_range_invalid' => 'Neplatný IP rozsah.',
 'ip_range_toolarge' => 'Bloky rozsahov väčšie ako /$1 nie sú povolené.',
-'blockme' => 'Zablokuj ma',
 'proxyblocker' => 'Blokovač proxy',
-'proxyblocker-disabled' => 'Táto funkcia je vypnutá.',
 'proxyblockreason' => 'Vaša IP adresa bola zablokovaná, pretože je otvorená proxy. Prosím kontaktujte vášho internetového poskytovateľa alebo technickú podporu a informujte ich o tomto vážnom bezpečnostnom probléme.',
-'proxyblocksuccess' => 'Hotovo.',
 'sorbsreason' => 'Vaša IP adresa je vedená ako nezabezpečený proxy server v DNSBL.',
 'sorbs_create_account_reason' => 'Vaša IP adresa je vedená ako nezabezpečený proxy server v databáze DNSBL, ktorú používa {{SITENAME}}. Nemôžete si vytvoriť účet.',
 'cant-block-while-blocked' => 'Nemôžete blokovať iných používateľov, kým ste zablokovaný.',
@@ -2891,6 +2939,8 @@ Prosím, navštívte [//www.mediawiki.org/wiki/Localisation MediaWiki Localisati
 'thumbnail-more' => 'Zväčšiť',
 'filemissing' => 'Chýbajúci súbor',
 'thumbnail_error' => 'Chyba pri vytváraní náhľadu: $1',
+'thumbnail_error_remote' => 'Chybová správa z $1:
+$2',
 'djvu_page_error' => 'DjVu stránka mimo rozsahu',
 'djvu_no_xml' => 'Nebolo možné priniesť XML DjVu súboru',
 'thumbnail-temp-create' => 'Nie je možné vytvoriť dočasný súbor náhľadu',
@@ -3040,17 +3090,11 @@ Umožnuje do zhrnutia pridanie dôvodu.',
 
 # Stylesheets
 'common.css' => '/* Tu umiestnené CSS bude ovplyvňovať všetky štýly */',
-'standard.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Klasický */',
-'nostalgia.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Nostalgia */',
 'cologneblue.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Kolínska modrá */',
 'monobook.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Monobook */',
-'myskin.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Môjvzhľad */',
-'chick.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Kuriatko */',
-'simple.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Jednoduchý */',
 'modern.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Moderný */',
 'vector.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Vector */',
 'print.css' => '/* Tu umiestnené CSS bude ovplyvňovať tlačový výstup */',
-'handheld.css' => '/* Tu umiestnené CSS bude ovplyvňovať prenosné zariadenia vychádzajúceho zo štýlu nastaveného v $wgHandheldStyle */',
 'noscript.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov s vypnutým JavaScriptom */',
 'group-autoconfirmed.css' => '/* Tu umiestnené CSS bude ovplyvňovať iba používateľov s overenou emailovou adresou */',
 'group-bot.css' => '/* Tu umiestnené CSS bude ovplyvňovať iba robotov */',
@@ -3059,13 +3103,8 @@ Umožnuje do zhrnutia pridanie dôvodu.',
 
 # Scripts
 'common.js' => '/* Tu uvedený JavaScript sa nahrá všetkým používateľom pri každom nahraní stránky. */',
-'standard.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Klasický */',
-'nostalgia.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Nostalgia */',
 'cologneblue.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Kolínska modrá */',
 'monobook.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Monobook */',
-'myskin.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Môjvzhľad */',
-'chick.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Kuriatko */',
-'simple.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Jednoduchý */',
 'modern.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Moderný */',
 'vector.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Vector */',
 'group-autoconfirmed.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom s potvrdenou emailovou adresou */',
@@ -3145,13 +3184,8 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
 'pageinfo-category-files' => 'Počet súborov',
 
 # Skin names
-'skinname-standard' => 'Klasický',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Kolínska modrá',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Môj vzhľad',
-'skinname-chick' => 'Kuriatko',
-'skinname-simple' => 'Jednoduchý',
 'skinname-modern' => 'Moderný',
 'skinname-vector' => 'Vector',
 
@@ -3230,11 +3264,25 @@ Jeho spustením môžete kompromitovať svoj systém.",
 'minutes' => '{{PLURAL:$1|$1 minúta|$1 minúty|$1 minút}}',
 'hours' => '{{PLURAL:$1|$1 hodina|$1 hodiny|$1 hodín}}',
 'days' => '{{PLURAL:$1|$1 deň|$1 dni|$1 dní}}',
+'weeks' => '{{PLURAL:$1|$1 týždeň|$1 týždne|$1 týždňov}}',
 'months' => '{{PLURAL:$1|$1 mesiac|$1 mesiace|$1 mesiacov}}',
 'years' => '{{PLURAL:$1|$1 rok|$1 rok|$1 rokov}}',
 'ago' => 'pred: $1',
 'just-now' => 'Pred chvíľkou',
 
+# Human-readable timestamps
+'hours-ago' => 'pred $1 {{PLURAL:$1|hodinou|hodinami}}',
+'minutes-ago' => 'pred $1 {{PLURAL:$1|minútou|minútami}}',
+'seconds-ago' => 'pred $1 {{PLURAL:$1|sekundou|sekundami}}',
+'monday-at' => 'v pondelok o $1',
+'tuesday-at' => 'v utorok o $1',
+'wednesday-at' => 'v stredu o $1',
+'thursday-at' => 'vo štvrtok o $1',
+'friday-at' => 'v piatok o $1',
+'saturday-at' => 'v sobotu o $1',
+'sunday-at' => 'v nedeľu o $1',
+'yesterday-at' => 'včera o $1',
+
 # Bad image list
 'bad_image_list' => 'Formát je nasledovný:
 
@@ -3262,7 +3310,7 @@ Ostatné budú predvolene skryté.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Šírka',
 'exif-imagelength' => 'Výška',
 'exif-bitspersample' => 'Bitov na zložku',
@@ -3440,7 +3488,7 @@ Ostatné budú predvolene skryté.
 'exif-originalimageheight' => 'Výška obrázka pred orezaním',
 'exif-originalimagewidth' => 'Šírka obrázka pred orezaním',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Bez kompresie',
 'exif-compression-2' => 'CCITT Group 3 1-rozmerné modifikované Huffmanovo kódovanie RLE',
 'exif-compression-3' => 'CCITT Group 3 faxové kódovanie',
@@ -3840,7 +3888,6 @@ Tiež môžete [[Special:EditWatchlist|použiť štandardný editor]].',
 'version-other' => 'Iné',
 'version-mediahandlers' => 'Obsluha multimédií',
 'version-hooks' => 'Prípojné body',
-'version-extension-functions' => 'Rozširujúce funkcie',
 'version-parser-extensiontags' => 'Rozširujúce značky syntaxe',
 'version-parser-function-hooks' => 'Prípojné body funkcií syntaktického analyzátora',
 'version-hook-name' => 'Názov prípojného bodu',
@@ -3849,6 +3896,7 @@ Tiež môžete [[Special:EditWatchlist|použiť štandardný editor]].',
 'version-license' => 'Licencia',
 'version-poweredby-credits' => "Táto wiki beží na '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'ďalší',
+'version-poweredby-translators' => 'prekladatelia na translatewiki.net',
 'version-credits-summary' => 'Nasledujúcim osobám by sme radi poďakovali za ich príspevky k vývoju [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki je slobodný softvér; môžete ho šíriť a / alebo modifikovať podľa podmienok GNU General Public License, ktorú vydala Free Software Foundation; a to buď verzie 2 tejto licencie alebo (podľa vášho uváženia) ktorejkoľvek neskoršej verzie. 
 
@@ -3862,12 +3910,17 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 'version-entrypoints-header-entrypoint' => 'Vstupný bod',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Cesta k súboru',
-'filepath-page' => 'Súbor:',
-'filepath-submit' => 'Vykonať',
-'filepath-summary' => 'Táto špeciálna stránka vráti úplnú cestu k súboru.
-Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v príslušnom priradenom programe.',
+# Special:Redirect
+'redirect' => 'Presmerovanie podľa súboru, používateľa alebo ID revízie',
+'redirect-legend' => 'Presmerovanie na súbor alebo stránku',
+'redirect-summary' => 'Táto špeciálna stránka presmerováva na súbor (podľa názvu), stránku (podľa identifikátora revízie) alebo používateľa (podľa číselného identifikátora používateľa).',
+'redirect-submit' => 'Ísť',
+'redirect-lookup' => 'Vyhľadať:',
+'redirect-value' => 'Hodnota:',
+'redirect-user' => 'ID používateľa',
+'redirect-revision' => 'Revíziu stránky',
+'redirect-file' => 'Názov súboru',
+'redirect-not-exists' => 'Hodnota nebola nájdená',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Hľadať duplicitné súbory',
@@ -3917,12 +3970,15 @@ Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v p
 'tags' => 'Platné označenia zmien',
 'tag-filter' => 'Filter [[Special:Tags|značiek]]:',
 'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Značka|Značky}}]]: $2)',
 'tags-title' => 'Značky',
 'tags-intro' => 'Táto stránka obsahuje zoznam značiek, s ktorým softvér môže pracovať a upravovať ich a ich význam.',
 'tags-tag' => 'Názov značky',
 'tags-display-header' => 'Vzhľad v zoznamoch úprav',
 'tags-description-header' => 'Úplný popis významu',
 'tags-hitcount-header' => 'Označené úpravy',
+'tags-active-yes' => 'Áno',
+'tags-active-no' => 'Nie',
 'tags-edit' => 'upraviť',
 'tags-hitcount' => '$1 {{PLURAL:$1|zmena|zmeny|zmien}}',
 
@@ -3943,6 +3999,7 @@ Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v p
 'dberr-problems' => 'Prepáčte! Táto stránka má práve technické problémy.',
 'dberr-again' => 'Skúste niekoľko minút počkať a potom opäť načítať stránku.',
 'dberr-info' => '(Spojenie s databázovým serverom neúspešné: $1)',
+'dberr-info-hidden' => '(Nie je možné kontaktovať databázový server)',
 'dberr-usegoogle' => 'Zatiaľ môžete skúsiť hľadať pomocou Google.',
 'dberr-outofdate' => 'Pamätajte, že ich indexy nemusia byť aktuálne.',
 'dberr-cachederror' => 'Toto je kópia požadovanej stránky z vyrovnávacej pamäte a nemusí byť aktuálna.',
@@ -3958,6 +4015,9 @@ Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v p
 'htmlform-submit' => 'Odoslať',
 'htmlform-reset' => 'Vrátiť zmeny',
 'htmlform-selectorother-other' => 'Iné',
+'htmlform-no' => 'Nie',
+'htmlform-yes' => 'Áno',
+'htmlform-chosen-placeholder' => 'Vyberte možnosť',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 s podporou vyhľadávania v plnom texte',
@@ -4075,4 +4135,11 @@ V opačnom prípade môžete použiť zjednodušený formulár nižšie. Váš k
 # Image rotation
 'rotate-comment' => 'Obrázok otočený o $1 {{PLURAL:$1|stupeň|stupne|stupňov}} v smere hodinových ručičiek',
 
+# Limit report
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtov}}',
+'limitreport-templateargumentsize' => 'Veľkosť argumentov šablón',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|bajt|bajty|bajtov}}',
+'limitreport-expansiondepth' => 'Najväčšia hĺbka expanzie',
+'limitreport-expensivefunctioncount' => 'Počet náročných funkcií parseru',
+
 );
diff --git a/languages/messages/MessagesSl.php b/languages/messages/MessagesSl.php
index 23a5cfb2..040fef74 100644
--- a/languages/messages/MessagesSl.php
+++ b/languages/messages/MessagesSl.php
@@ -11,7 +11,9 @@
  * @author Eleassar
  * @author Freakolowsky
  * @author Irena Plahuta
+ * @author Matej1234
  * @author McDutchie
+ * @author Nemo bis
  * @author Smihael
  * @author Vadgt
  * @author XJamRastafire
@@ -216,9 +218,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži število uporabnikov, ki spremljajo temo',
 'tog-oldsig' => 'Trenutni podpis:',
 'tog-fancysig' => 'Obravnavaj podpis kot wikibesedilo (brez samodejne povezave)',
-'tog-externaleditor' => 'Po privzetem uporabljaj zunanji urejevalnik (samo za strokovnjake; potrebuje posebne nastavitve na vašem računalniku; [//www.mediawiki.org/wiki/Manual:External_editors več informacij])',
-'tog-externaldiff' => 'Po privzetem uporabljaj zunanje primerjanje (samo za strokovnjake; potrebuje posebne nastavitve na vašem računalniku; [//www.mediawiki.org/wiki/Manual:External_editors več informacij])',
-'tog-showjumplinks' => 'Prikaži pomožni povezavi »Skoči na«',
 'tog-uselivepreview' => 'Uporabi hitri predogled (preizkusno)',
 'tog-forceeditsummary' => 'Ob vpisu praznega povzetka urejanja me opozori',
 'tog-watchlisthideown' => 'Na spisku nadzorov skrij moja urejanja',
@@ -231,6 +230,8 @@ $messages = array(
 'tog-diffonly' => 'Pod primerjavo ne prikaži vsebine strani',
 'tog-showhiddencats' => 'Prikaži skrite kategorije',
 'tog-norollbackdiff' => 'Ne prikaži primerjave po izvedeni vrnitvi',
+'tog-useeditwarning' => 'Opozori me, ko skušam zapreti urejevalno polje z neshranjenimi spremembami',
+'tog-prefershttps' => 'Med prijavo vedno uporabljaj varno povezavo',
 
 'underline-always' => 'Vedno',
 'underline-never' => 'Nikoli',
@@ -294,6 +295,18 @@ $messages = array(
 'oct' => 'okt.',
 'nov' => 'nov.',
 'dec' => 'dec.',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. marec',
+'april-date' => '$1. april',
+'may-date' => '$1. maj',
+'june-date' => '$1. junij',
+'july-date' => '$1. julij',
+'august-date' => '$1. avgust',
+'september-date' => '$1. september',
+'october-date' => '$1. oktober',
+'november-date' => '$1. november',
+'december-date' => '$1. december',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorija|Kategoriji|Kategorije}}',
@@ -375,6 +388,7 @@ $messages = array(
 'create-this-page' => 'Ustvari stran',
 'delete' => 'Briši',
 'deletethispage' => 'Briši stran',
+'undeletethispage' => 'Obnovi stran',
 'undelete_short' => 'Vrni $1 {{PLURAL:$1|izbrisano urejanje|izbrisani urejanji|izbrisana urejanja|izbrisanih urejanj|izbrisanih urejanj}}',
 'viewdeleted_short' => 'Ogled {{PLURAL:$1|enega izbrisanega urejanja|$1 izbrisanih urejanj}}',
 'protect' => 'Zaščiti',
@@ -418,7 +432,7 @@ $1',
 'pool-queuefull' => 'Čakalna vrsta zaloge je polna',
 'pool-errorunknown' => 'Neznana napaka',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'O {{GRAMMAR:dajalnik|{{SITENAME}}}}',
 'aboutpage' => 'Project:O {{GRAMMAR:dajalnik|{{SITENAME}}}}',
 'copyright' => 'Razen, kjer je navedeno drugače, je besedilo na razpolago pod pogoji licence $1.',
@@ -428,7 +442,6 @@ $1',
 'disclaimers' => 'Zanikanja odgovornosti',
 'disclaimerpage' => 'Project:Splošno zanikanje odgovornosti',
 'edithelp' => 'Pomoč pri urejanju',
-'edithelppage' => 'Help:Urejanje',
 'helppage' => 'Help:Vsebina',
 'mainpage' => 'Glavna stran',
 'mainpage-description' => 'Glavna stran',
@@ -506,17 +519,12 @@ Seznam vseh prepoznanih posebnih strani je na razpolago na strani [[Special:Spec
 # General errors
 'error' => 'Napaka',
 'databaseerror' => 'Napaka zbirke podatkov',
-'dberrortext' => 'Prišlo je do napake podatkovne zbirke.
-Vzrok je lahko programski hrošč v programju.
-Zadnja poskušana poizvedba po zbirki podatkov:
-<blockquote><code>$1</code></blockquote>
-znotraj funkcije »<code>$2</code>«.
-Zbirka podatkov je vrnila napako »<samp>$3: $4</samp>«.',
-'dberrortextcl' => 'Pri iskanju v podatkoovni zbirki je prišlo do skladenjske napake.
-Zadnje iskanje v zbirki podatkov:
-»$1«
-iz funkcije »$2«.
-Podatkovna zbirka je vrnila napako »$3: $4«.',
+'databaseerror-text' => 'Prišlo je do napake poizvedbe v zbirki podatkov.
+To lahko pomeni hrošča v programju.',
+'databaseerror-textcl' => 'Prišlo je do napake poizvedbe v zbirki podatkov.',
+'databaseerror-query' => 'Poizvedba: $1',
+'databaseerror-function' => 'Funkcija: $1',
+'databaseerror-error' => 'Napaka: $1',
 'laggedslavemode' => "'''Opozorilo:''' Stran morda ne vsebuje najnovejših posodobitev.",
 'readonly' => 'Zbirka podatkov je zaklenjena',
 'enterlockreason' => 'Vnesite razlog za zaklenitev in oceno, kdaj bo urejanje spet mogoče',
@@ -550,6 +558,7 @@ Morda jo je izbrisal že kdo drug.',
 'cannotdelete-title' => 'Ne morem izbrisati strani »$1«',
 'delete-hook-aborted' => 'Zanka je prekinila brisanje.
 Vrnila ni nobene razlage.',
+'no-null-revision' => 'Ne morem ustvariti nove ničelne redakcije strani »$1«',
 'badtitle' => 'Nepravilen naslov',
 'badtitletext' => 'Navedeni naslov strani je neveljaven, prazen, napačno povezan k drugim jezikom oziroma wikiprojektom.
 Morda vsebuje enega ali več nepodprtih znakov.',
@@ -573,12 +582,15 @@ Za dodajanje ali spreminjanje prevodov vseh wikijev uporabite [//translatewiki.n
 'editinginterface' => "'''Opozorilo:''' Urejate stran, ki vsebuje besedilo ali drug element uporabniškega vmesnika programja.
 Spremembe te strani bodo vplivale na podobo uporabniškega vmesnika ostalih uporabnikov na tem wikiju.
 Za dodajanje ali spreminjanje prevodov vseh wikijev uporabite [//translatewiki.net/ translatewiki.net], projekt za lokalizacijo MediaWiki.",
-'sqlhidden' => '(Poizvedba SQL je skrita)',
 'cascadeprotected' => 'Ta stran je bila zaščitena pred urejanji, ker je vključena na {{PLURAL:$1|sledečo stran, ki je bila zaščitena|sledeči strani, ki sta bili zaščiteni|sledeče strani, ki so bile zaščitene}} z vključeno kaskadno možnostjo:
 $2',
 'namespaceprotected' => "Za urejanje strani v imenskem prostoru '''$1''' nimate dovoljenja.",
 'customcssprotected' => 'Nimate pravice urejati te strani CSS, ker vsebuje osebne nastavitve drugega uporabnika.',
 'customjsprotected' => 'Nimate pravice urejati te strani JavaScript, ker vsebuje osebne nastavitve drugega uporabnika.',
+'mycustomcssprotected' => 'Nimate pravic za urejanje te strani s CSS.',
+'mycustomjsprotected' => 'Nimate pravic za urejanje te strani z JavaScriptom.',
+'myprivateinfoprotected' => 'Nimate dovoljenja za urejanje svojih zasebnih podatkov.',
+'mypreferencesprotected' => 'Nimate dovoljenja za urejanje svojih nastavitev.',
 'ns-specialprotected' => 'Posebnih strani ni mogoče urejati.',
 'titleprotected' => "Uporabnik [[User:$1|$1]] je preprečil ustvarjanje strani s takim naslovom.
 Podani razlog je bil »''$2''«.",
@@ -603,10 +615,19 @@ Nekatere strani bodo morda še naprej prikazane, kot da ste prijavljeni, dokler
 'welcomecreation-msg' => 'Ustvarili ste račun.
 Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rodilnik|{{SITENAME}}}}]].',
 'yourname' => 'Uporabniško ime:',
+'userlogin-yourname' => 'Uporabniško ime',
+'userlogin-yourname-ph' => 'Vnesite svoje uporabniško ime',
+'createacct-another-username-ph' => 'Vnesite uporabniško ime',
 'yourpassword' => 'Geslo:',
+'userlogin-yourpassword' => 'Geslo',
+'userlogin-yourpassword-ph' => 'Vnesite svoje geslo',
+'createacct-yourpassword-ph' => 'Vnesite geslo',
 'yourpasswordagain' => 'Ponovno vpišite geslo',
+'createacct-yourpasswordagain' => 'Potrdite geslo',
+'createacct-yourpasswordagain-ph' => 'Ponovno vnesite geslo',
 'remembermypassword' => 'Zapomni si me na tem računalniku (za največ $1 {{PLURAL:$1|dan|dneva|dni}})',
-'securelogin-stick-https' => 'Po prijavi ostani povezan preko HTTPS',
+'userlogin-remembermypassword' => 'Zapomni si me',
+'userlogin-signwithsecure' => 'Uporabi varno povezavo',
 'yourdomainname' => 'Domena',
 'password-change-forbidden' => 'Na tem wikiju ne morete spreminjati gesel.',
 'externaldberror' => 'Pri potrjevanju istovetnosti je prišlo do notranje napake ali pa za osveževanje zunanjega računa nimate dovoljenja.',
@@ -618,18 +639,44 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
 'logout' => 'Odjava',
 'userlogout' => 'Odjava',
 'notloggedin' => 'Niste prijavljeni',
+'userlogin-noaccount' => 'Nimate uporabniškega računa?',
+'userlogin-joinproject' => 'Pridružite se {{GRAMMAR:dajalnik|{{SITENAME}}}}',
 'nologin' => 'Še nimate uporabniškega računa? $1!',
 'nologinlink' => 'Registrirajte se',
 'createaccount' => 'Registracija',
 'gotaccount' => 'Račun že imate? $1.',
 'gotaccountlink' => 'Prijavite se',
 'userlogin-resetlink' => 'Ste pozabili svoje prijavne podatke?',
+'userlogin-resetpassword-link' => 'Ponastavite svoje geslo',
+'helplogin-url' => 'Help:Prijava',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoč pri prijavi]]',
+'userlogin-loggedin' => 'Ste že prijavljeni kot {{GENDER:$1|$1}}.
+Uporabite spodnji obrazec, da se prijavite kot drug uporabnik.',
+'userlogin-createanother' => 'Ustvari drug račun',
+'createacct-join' => 'Spodaj vnesite svoje informacije.',
+'createacct-another-join' => 'Spodaj vnesite informacije o novem računu.',
+'createacct-emailrequired' => 'E-poštni naslov',
+'createacct-emailoptional' => 'E-poštni naslov (izbirno)',
+'createacct-email-ph' => 'Vnesite svoj e-poštni naslov',
+'createacct-another-email-ph' => 'Vnesite e-poštni naslov',
 'createaccountmail' => 'Ustvari začasno naključno geslo in ga pošlji na spodaj navedeni e-poštni naslov',
+'createacct-realname' => 'Pravo ime (izbirno)',
 'createaccountreason' => 'Razlog:',
+'createacct-reason' => 'Razlog',
+'createacct-reason-ph' => 'Zakaj ustvarjate drug račun',
+'createacct-captcha' => 'Varnostno preverjanje',
+'createacct-imgcaptcha-ph' => 'Vnesite zgornje besedilo',
+'createacct-submit' => 'Ustvarite svoj račun',
+'createacct-another-submit' => 'Ustvarite še en račun',
+'createacct-benefit-heading' => '{{GRAMMAR:tožilnik|{{SITENAME}}}} ustvarjajo ljudje, kot ste vi.',
+'createacct-benefit-body1' => '{{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|stran|strani}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|nedavni sodelavec|nedavna sodelavca|nedavni sodelavci|nedavnih sodelavcev}}',
 'badretype' => 'Gesli, ki ste ju vnesli, se ne ujemata.',
 'userexists' => 'Uporabniško ime, ki ste ga vnesli, je že zasedeno.
 Prosimo, izberite drugo.',
 'loginerror' => 'Napaka ob prijavi',
+'createacct-error' => 'Napaka pri ustvarjanju računa',
 'createaccounterror' => 'Ne morem ustvariti računa: $1',
 'nocookiesnew' => 'Uporabniški račun je ustvarjen, vendar niste prijavljeni.
 {{SITENAME}} za prijavo uporabnikov uporablja piškotke, ki pa so pri vas onemogočeni.
@@ -696,10 +743,12 @@ Prosimo, vpišite pravilno oblikovanega ali polje izpraznite.',
 To sporočilo lahko prezrete, če je bil račun ustvarjen pomotoma.',
 'usernamehasherror' => "Uporabniško ime ne sme vsebovati ''hash'' znakov",
 'login-throttled' => 'Nedavno ste izvedli preveč poskusov prijave.
-Prosimo počakajte, preden poskusite znova.',
+Prosimo, počakajte $1, preden poskusite znova.',
 'login-abort-generic' => 'Vaša prijava ni bila uspešna – Prekinjeno',
 'loginlanguagelabel' => 'Jezik: $1',
 'suspicious-userlogout' => 'Vaša zahteva za odjavo je bila zavrnjena, saj kaže, da je bila poslana iz pokvarjenega brskalnika ali proxyja s predpomnilnikom.',
+'createacct-another-realname-tip' => 'Pravo ime ni obvezno.
+Če se ga odločite navesti, bo uporabljeno za priznavanje uporabnikovega dela.',
 
 # Email sending
 'php-mail-error-unknown' => 'Neznana napaka v funkciji PHP mail()',
@@ -716,8 +765,7 @@ Za zaključitev prijave, morate tukaj nastaviti novo geslo:',
 'newpassword' => 'Novo geslo:',
 'retypenew' => 'Ponovno vpišite geslo:',
 'resetpass_submit' => 'Nastavi geslo in se prijavi',
-'resetpass_success' => 'Vaše geslo je bilo uspešno spremenjeno!
-Prijavljanje ...',
+'changepassword-success' => 'Vaše geslo je bilo uspešno spremenjeno!',
 'resetpass_forbidden' => 'Gesla ne morete spremeniti',
 'resetpass-no-info' => 'Za neposreden dostop do te strani morate biti prijavljeni.',
 'resetpass-submit-loggedin' => 'Spremenite geslo',
@@ -729,10 +777,11 @@ Morda ste že uspešno spremenili geslo ali pa ste zahtevali novo začasno geslo
 
 # Special:PasswordReset
 'passwordreset' => 'Ponastavitev gesla',
-'passwordreset-text' => 'Izpolnite obrazec, da ponastavite geslo.',
+'passwordreset-text-one' => 'Izpolnite obrazec, da ponastavite svoje geslo.',
+'passwordreset-text-many' => 'Izpolnite {{PLURAL:$1|polje|enega od polj}}, da ponastavite svoje geslo.',
 'passwordreset-legend' => 'Ponastavitev gesla',
 'passwordreset-disabled' => 'Ponastavljanje gesla je na tem wikiju onemogočeno.',
-'passwordreset-pretext' => '{{PLURAL:$1||Vnesite enega od dela podatkov spodaj}}',
+'passwordreset-emaildisabled' => 'Na tem wikiju so možnosti e-pošte onemogočene.',
 'passwordreset-username' => 'Uporabniško ime:',
 'passwordreset-domain' => 'Domena:',
 'passwordreset-capture' => 'Ogled nastale e-pošte?',
@@ -764,7 +813,7 @@ svojega starega gesla.',
 Začasno geslo: $2',
 'passwordreset-emailsent' => 'Poslali smo e-pošto za postavitev gesla.',
 'passwordreset-emailsent-capture' => 'Poslali smo e-pošto za ponastavitev gesla, ki je prikazana spodaj.',
-'passwordreset-emailerror-capture' => 'Ustvarili smo e-pošto za ponastavitev gesla, ki je prikazana spodaj, vendar pa pošiljanje uporabniku ni uspelo: $1',
+'passwordreset-emailerror-capture' => 'Ustvarili smo e-pošto za ponastavitev gesla, ki je prikazana spodaj, vendar pa pošiljanje {{GENDER:$2|uporabniku|uporabnici}} ni uspelo: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Sprememba e-poštnega naslova',
@@ -778,6 +827,19 @@ Začasno geslo: $2',
 'changeemail-submit' => 'Spremeni e-naslov',
 'changeemail-cancel' => 'Prekliči',
 
+# Special:ResetTokens
+'resettokens' => 'Ponastavitev žetonov',
+'resettokens-text' => 'Žetone lahko ponastavite, kar omogoča dostop do nekaterih zasebnih podatkov, povezanih z vašim računom.
+
+To storite, če ste po nesreči žetone z nekom delili, ali če je bil vaš račun ogrožen.',
+'resettokens-no-tokens' => 'Ni nobenih žetonov za ponastavitev.',
+'resettokens-legend' => 'Ponastavitev žetonov',
+'resettokens-tokens' => 'Žetoni:',
+'resettokens-token-label' => '$1 (trenutna vrednost: $2)',
+'resettokens-watchlist-token' => 'Žeton spletnega vira (Atom/RSS) [[Special:Watchlist|sprememb strani na vašem spisku nadzorov]]',
+'resettokens-done' => 'Žetone sem ponastavil.',
+'resettokens-resetbutton' => 'Ponastavi izbrane žetone',
+
 # Edit page toolbar
 'bold_sample' => 'Krepko besedilo',
 'bold_tip' => 'Krepko besedilo',
@@ -972,11 +1034,14 @@ Spodaj sta za sklicevanje na razpolago dnevnik brisanja in dnevnik prestavljanja
 Izgleda, da je bila izbrisana.',
 'edit-conflict' => 'Navzkrižje urejanj.',
 'edit-no-change' => 'Vaše urejanje je bilo prezrto, saj ni vsebovalo sprememb.',
+'postedit-confirmation' => 'Vaše urejanje smo shranili.',
 'edit-already-exists' => 'Ni bilo mogoče ustvariti nove strani, ker že obstaja.',
 'defaultmessagetext' => 'Prednastavljeno besedilo',
 'content-failed-to-parse' => 'Nisem mogel razčleniti vsebine $2 za obliko $1: $3',
 'invalid-content-data' => 'Neveljavni podatki vsebine',
 'content-not-allowed-here' => 'Vsebina »$1« ni dovoljena na strani [[$2]]',
+'editwarning-warning' => 'Če zapustite stran, boste morda izgubili vse spremembe, ki ste jih naredili.
+Če ste prijavljeni, lahko to opozorilo onemogočite v razdelku »Urejanje« v svojih nastavitvah.',
 
 # Content models
 'content-model-wikitext' => 'wikibesedilo',
@@ -1011,6 +1076,7 @@ Naslednji argumenti so bili izpuščeni.",
 'undo-failure' => 'Zaradi navzkrižij urejanj, ki so se vmes pojavila, tega urejanja ni moč razveljaviti.',
 'undo-norev' => 'Urejanja ni mogoče razveljaviti, ker ne obstaja ali je bilo izbrisano.',
 'undo-summary' => 'Redakcija $1 uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) razveljavljena',
+'undo-summary-username-hidden' => 'Razveljavi redakcijo $1 skritega uporabnika',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Računa ni moč ustvariti',
@@ -1192,6 +1258,7 @@ Upoštevajte, da bo uporaba navigacijskih gumbov ponastavila ta stolpec.',
 'compareselectedversions' => 'Primerjaj izbrani redakciji',
 'showhideselectedversions' => 'Prikaži/skrij izbrane redakcije',
 'editundo' => 'razveljavi',
+'diff-empty' => '(Ni razlike)',
 'diff-multi' => '({{PLURAL:$1|$1 vmesna redakcija|$1 vmesni redakciji|$1 vmesne redakcije|$1 vmesnih redakcij}} {{PLURAL:$2|$2 uporabnika|$2 uporabnikov}} {{PLURAL:$1|ni prikazana|nista prikazani|niso prikazane|ni prikazanih}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|$1 vmesna redakcija|$1 vmesni redakciji|$1 vmesne redakcije|$1 vmesnih redakcij}} več kot $2 {{PLURAL:$2|uporabnika|uporabnikov}} {{PLURAL:$1|ni prikazana|nista prikazani|niso prikazane|ni prikazanih}})',
 'difference-missing-revision' => '{{PLURAL:$2|Ene redakcije|$2 redakcij}} razlike ($1) {{PLURAL:$2|nisem}} našel.
@@ -1219,7 +1286,6 @@ Podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'searchmenu-legend' => 'Možnosti za iskanje',
 'searchmenu-exists' => "'''Na tem wikiju obstaja stran »[[:$1]]«'''",
 'searchmenu-new' => "'''Ustvari stran »[[:$1]]« na tem wikiju!'''",
-'searchhelp-url' => 'Help:Vsebina',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Iskanje strani s to predpono]]',
 'searchprofile-articles' => 'Članki',
 'searchprofile-project' => 'Pomoč in projektne strani',
@@ -1262,15 +1328,7 @@ Podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'searchdisabled' => 'Iskanje po {{GRAMMAR:dajalnik|{{SITENAME}}}} je onemogoočeno.
 Medtem lahko iščete preko Googla.
 Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} morda zastareli.',
-
-# Quickbar
-'qbsettings' => 'Nastavitve hitre vrstice',
-'qbsettings-none' => 'Brez',
-'qbsettings-fixedleft' => 'Levo nepomično',
-'qbsettings-fixedright' => 'Desno nepomično',
-'qbsettings-floatingleft' => 'Levo leteče',
-'qbsettings-floatingright' => 'Desno leteče',
-'qbsettings-directionality' => 'Stalno, odvisno od usmerjenosti pisave vašega jezika',
+'search-error' => 'Med iskanjem je prišlo do napake: $1',
 
 # Preferences page
 'preferences' => 'Nastavitve',
@@ -1304,7 +1362,6 @@ Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} mo
 'resetprefs' => 'Počisti neshranjene spremembe',
 'restoreprefs' => 'Obnovi vse privzete nastavitve (v vseh razdelkih)',
 'prefs-editing' => 'Urejanje',
-'prefs-edit-boxsize' => 'Velikost okna za urejanje.',
 'rows' => 'Vrstic:',
 'columns' => 'Stolpcev:',
 'searchresultshead' => 'Nastavitve poizvedovanja',
@@ -1315,9 +1372,7 @@ Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} mo
 'recentchangesdays-max' => 'Največ $1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
 'recentchangescount' => 'Privzeto število prikazanih urejanj:',
 'prefs-help-recentchangescount' => 'Vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.',
-'prefs-help-watchlist-token' => 'Izpolnjevanje tega polja s skrivnim ključem bo ustvarilo vir RSS za vaš spisek nadzorov.
-Kdorkoli pozna ta ključ bo lahko bral vaš spisek nadzorov, zato izbrite varen in čim daljši ključ.
-Tukaj je naključno ustvarjena vrednost, ki jo lahko uporabite: $1',
+'prefs-help-watchlist-token2' => 'To je skrivni ključ do spletnega vira vašega spiska nadzorov. Kdor ve zanj, lahko bere vaš spisek nadzorov, zato ključa ne delite. [[Special:ResetTokens|Kliknite tukaj, če ga želite ponastaviti]].',
 'savedprefs' => 'Spremembe so bile uspešno shranjene.',
 'timezonelegend' => 'Časovni pas',
 'localtime' => 'Krajevni čas:',
@@ -1348,7 +1403,6 @@ Tukaj je naključno ustvarjena vrednost, ki jo lahko uporabite: $1',
 'prefs-reset-intro' => 'To stran lahko uporabite za ponastavitev nastavitev na privzete za to spletišče.
 Tega ni mogoče razveljaviti.',
 'prefs-emailconfirm-label' => 'Potrditev e-pošte:',
-'prefs-textboxsize' => 'Velikost urejevalnega polja',
 'youremail' => 'E-poštni naslov:',
 'username' => '{{GENDER:$1|Uporabniško|Uporabničino}} ime:',
 'uid' => 'ID {{GENDER:$1|uporabnika|uporabnice}}:',
@@ -1384,6 +1438,8 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'prefs-dateformat' => 'Zapis datuma',
 'prefs-timeoffset' => 'Časovni odmik',
 'prefs-advancedediting' => 'Splošne možnosti',
+'prefs-editor' => 'Urejevalnik',
+'prefs-preview' => 'Predogled',
 'prefs-advancedrc' => 'Napredne možnosti',
 'prefs-advancedrendering' => 'Napredne možnosti',
 'prefs-advancedsearchoptions' => 'Napredne možnosti',
@@ -1391,7 +1447,9 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'prefs-displayrc' => 'Možnosti prikaza',
 'prefs-displaysearchoptions' => 'Možnosti prikaza',
 'prefs-displaywatchlist' => 'Možnosti prikaza',
+'prefs-tokenwatchlist' => 'Žeton',
 'prefs-diffs' => 'Primerjave',
+'prefs-help-prefershttps' => 'Nastavitev bo začela veljati ob vaši naslednji prijavi.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Izgleda veljaven',
@@ -1418,6 +1476,8 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'userrights-notallowed' => 'Za dodajanje ali odstranjevanje uporabniških pravic nimate dovoljenja.',
 'userrights-changeable-col' => 'Skupine, ki jih lahko spremenite',
 'userrights-unchangeable-col' => 'Skupine, ki jih ne morete spremeniti',
+'userrights-conflict' => 'Spor sprememb uporabniških pravic! Prosimo, da pregledate in potrdite svoje spremembe.',
+'userrights-removed-self' => 'Uspešno ste odstranili svoje pravice. Tako sedaj ne morete več dostopati do te strani.',
 
 # Groups
 'group' => 'Skupina:',
@@ -1483,11 +1543,19 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'right-proxyunbannable' => 'Izogne se samodejnim blokadam proxyjev',
 'right-unblockself' => 'Odblokiraj se',
 'right-protect' => 'Spreminjanje stopenj zaščite in urejanje kaskadno zaščitenih strani',
-'right-editprotected' => 'Urejanje zaščitenih strani (brez kaskadne zaščite)',
+'right-editprotected' => 'Urejanje strani, zaščitenih kot »{{int:protect-level-sysop}}«',
+'right-editsemiprotected' => 'Urejanje strani, zaščitenih kot »{{int:protect-level-autoconfirmed}}«',
 'right-editinterface' => 'Urejanje uporabniškega vmesnika',
 'right-editusercssjs' => 'Urejanje CSS- in JS-datotek drugih uporabnikov',
 'right-editusercss' => 'Uredi CSS datotek drugih uporabnikov',
 'right-edituserjs' => 'Uredi JS datotek drugih uporabnikov',
+'right-editmyusercss' => 'Uredite svoje uporabniške datoteke CSS',
+'right-editmyuserjs' => 'Uredite svoje uporabniške datoteke JavaScript',
+'right-viewmywatchlist' => 'Ogledovanje svojega spiska nadzorov',
+'right-editmywatchlist' => 'Urejanje vašega spiska nadzorov. Vedite, da bodo nekatera dejanja dodala strani nanj tudi brez te pravice.',
+'right-viewmyprivateinfo' => 'Ogled svojih zasebnih podatkov (npr. e-poštnega naslova, pravega imena)',
+'right-editmyprivateinfo' => 'Urejanje svojih zasebnih podatkov (npr. e-poštnega naslova, pravega imena)',
+'right-editmyoptions' => 'Urejanje svojih nastavitev',
 'right-rollback' => 'Hitro vračanje urejanj zadnjega uporabnika, ki je urejal določeno stran',
 'right-markbotedits' => 'Označi vrnjena urejanja kot urejanja botov',
 'right-noratelimit' => 'Omejitve dejavnosti ne veljajo',
@@ -1549,12 +1617,19 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'action-userrights-interwiki' => 'upravljanje uporabniških pravic za uporabnike drugih wikijev',
 'action-siteadmin' => 'zaklenitev ali odklepanje podatkovne baze',
 'action-sendemail' => 'pošiljanje e-sporočil',
+'action-editmywatchlist' => 'urejanje svojega spiska nadzorov',
+'action-viewmywatchlist' => 'ogleda svojega spiska nadzorov',
+'action-viewmyprivateinfo' => 'ogled svojih zasebnih informacij',
+'action-editmyprivateinfo' => 'urejanje svojih zasebnih informacij',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|od zadnjega obiska}}',
+'enhancedrc-history' => 'zgodovina',
 'recentchanges' => 'Zadnje spremembe',
 'recentchanges-legend' => 'Možnosti zadnjih sprememb',
 'recentchanges-summary' => 'Na tej strani lahko spremljate najnovejše spremembe wikija.',
+'recentchanges-noresult' => 'V podanem obdobju nobena sprememba ne ustreza tem merilom.',
 'recentchanges-feed-description' => 'Spremljajte zadnje spremembe wikija prek tega vira.',
 'recentchanges-label-newpage' => 'S tem urejanjem je bila ustvarjena nova stran',
 'recentchanges-label-minor' => 'Manjše urejanje',
@@ -1591,7 +1666,6 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'recentchangeslinked-feed' => 'Sorodne spremembe',
 'recentchangeslinked-toolbox' => 'Sorodne spremembe',
 'recentchangeslinked-title' => 'Spremembe, povezane z "$1"',
-'recentchangeslinked-noresult' => 'Na povezanih straneh v določenem obdobju ni bilo nobenih sprememb.',
 'recentchangeslinked-summary' => "To je seznam nedavnih sprememb strani povezanih na določeno stran (ali iz določene kategorije).
 Strani iz [[Special:Watchlist|vašega spiska nadzorov]] so '''odebeljene'''.",
 'recentchangeslinked-page' => 'Naslov strani:',
@@ -1603,7 +1677,7 @@ Strani iz [[Special:Watchlist|vašega spiska nadzorov]] so '''odebeljene'''.",
 'reuploaddesc' => 'Prekliči nalaganje in se vrni na obrazec za nalaganje',
 'upload-tryagain' => 'Vnesite spremenjen opis datoteke',
 'uploadnologin' => 'Niste prijavljeni',
-'uploadnologintext' => 'Za nalaganje datotek se [[Special:UserLogin|prijavite]].',
+'uploadnologintext' => 'Za nalaganje datotek se morate $1.',
 'upload_directory_missing' => 'Mapa za nalaganje datotek ($1) manjka in je ni bilo mogoče ustvariti s spletnim strežnikom.',
 'upload_directory_read_only' => 'V mapo za nalaganje datotek ($1) spletni strežnik ne more pisati.',
 'uploaderror' => 'Napaka',
@@ -1838,7 +1912,6 @@ Za optimalno varnost je img_auth.php onemogočen.',
 'http-read-error' => 'Napaka branja HTTP.',
 'http-timed-out' => 'Zahteva HTTP je potekla.',
 'http-curl-error' => 'Napaka pri doseganju URL: $1',
-'http-host-unreachable' => 'Ni mogoče doseči URL.',
 'http-bad-status' => 'Med zahtevo HTTP je prišlo do težave: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1869,6 +1942,10 @@ Morda želite poskusiti ob času manjše zasedenosti.',
 'listfiles_size' => 'Velikost',
 'listfiles_description' => 'Opis',
 'listfiles_count' => 'Različice',
+'listfiles-show-all' => 'Vključuje stare različice slik',
+'listfiles-latestversion' => 'Trenutna različica',
+'listfiles-latestversion-yes' => 'Da',
+'listfiles-latestversion-no' => 'Ne',
 
 # File description page
 'file-anchor-link' => 'Datoteka',
@@ -1966,6 +2043,13 @@ Preden jih izbrišete, preverite še druge povezave nanje.',
 'randompage' => 'Naključni članek',
 'randompage-nopages' => 'V {{PLURAL:$2|naslednjem imenskem prostoru|naslednjih imenskih prostorih}} ni strani: $1.',
 
+# Random page in category
+'randomincategory' => 'Naključna stran v kategoriji',
+'randomincategory-invalidcategory' => '»$1« ni veljavno ime kategorije.',
+'randomincategory-nopages' => 'V kategoriji [[:Category:$1]] ni nobene strani.',
+'randomincategory-selectcategory' => 'Dobi naključno stran iz kategorije: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Pojdi',
+
 # Random redirect
 'randomredirect' => 'Naključna preusmeritev',
 'randomredirect-nopages' => 'V imenskem prostoru »$1« ni preusmeritev.',
@@ -1991,17 +2075,13 @@ Preden jih izbrišete, preverite še druge povezave nanje.',
 'statistics-users-active-desc' => 'Uporabniki, ki so izvedli dejanje v {{PLURAL:$1|zadnjem dnevu|zadnjih $1 dneh}}',
 'statistics-mostpopular' => 'Strani z največ ogledi',
 
-'disambiguations' => 'Strani s povezavami na razločitvene strani',
-'disambiguationspage' => 'Template:Razločitev',
-'disambiguations-text' => "Naslednje strani vsebujejo vsaj eno povezavo na '''razločitvene strani'''.
-Namesto tega bi morda bilo bolje, da se povezujejo na primernejše strani.<br />
-Stran se obravnava kot razločitvena, če uporablja predloge, povezane z [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Strani z lastnostmi strani',
 'pageswithprop-legend' => 'Strani z lastnostmi strani',
 'pageswithprop-text' => 'Stran navaja vse strani, ki uporabljajo določene lastnosti strani.',
 'pageswithprop-prop' => 'Ime lastnosti:',
 'pageswithprop-submit' => 'Pojdi',
+'pageswithprop-prophidden-long' => 'dolga besedilna vrednost lastnosti je skrita ($1)',
+'pageswithprop-prophidden-binary' => 'dvojiška vrednost lastnosti je skrita ($1)',
 
 'doubleredirects' => 'Dvojne preusmeritve',
 'doubleredirectstext' => 'Ta stran navaja strani, ki se preusmerjajo na druge preusmeritvene strani.
@@ -2060,6 +2140,7 @@ Sedaj je preusmeritev na [[$2]].',
 'mostrevisions' => 'Največkrat urejane strani',
 'prefixindex' => 'Vse strani s predpono',
 'prefixindex-namespace' => 'Vse strani s predpono (imenski prostor $1)',
+'prefixindex-strip' => 'Na seznamu odreži predpono',
 'shortpages' => 'Kratke strani',
 'longpages' => 'Dolge strani',
 'deadendpages' => 'Članki brez delujočih povezav',
@@ -2075,6 +2156,7 @@ Sedaj je preusmeritev na [[$2]].',
 'listusers' => 'Seznam uporabnikov',
 'listusers-editsonly' => 'Pokaži samo uporabnike z urejanji',
 'listusers-creationsort' => 'Razvrsti po datumu ustvaritve',
+'listusers-desc' => 'Razvrsti padajoče',
 'usereditcount' => '$1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}',
 'usercreated' => '{{GENDER:$3|Ustvarjen|Ustvarjena}} dne $1 ob $2',
 'newpages' => 'Nove strani',
@@ -2251,10 +2333,9 @@ Tam bodo navedene prihodnje spremembe te strani in pripadajoče pogovorne strani
 'unwatchthispage' => 'Prenehaj opazovati stran',
 'notanarticle' => 'Ni članek',
 'notvisiblerev' => 'Redakcija je bila izbrisana',
-'watchnochange' => 'V prikazanem časovnem obdobju ni nihče spremenil nadzorovanih strani.',
 'watchlist-details' => 'Spremljate $1 {{PLURAL:$1|stran|strani|strani|strani|strani}} (pogovorne strani niso vštete).',
-'wlheader-enotif' => '* Obveščanje po elektronski pošti je omogočeno.',
-'wlheader-showupdated' => "* Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
+'wlheader-enotif' => 'Obveščanje po elektronski pošti je omogočeno.',
+'wlheader-showupdated' => "Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
 'watchmethod-recent' => 'med nedavnimi urejanji iščem spremljane strani',
 'watchmethod-list' => 'med spremljanimi stranmi iščem nedavna urejanja',
 'watchlistcontains' => 'Spremljate $1 {{PLURAL:$1|stran|strani}}.',
@@ -2507,7 +2588,7 @@ $1',
 'contributions' => '{{GENDER:$1|Uporabnikovi|Uporabničini}} prispevki',
 'contributions-title' => 'Prispevki uporabnika $1',
 'mycontris' => 'Prispevki',
-'contribsub2' => 'Uporabnik: $1 ($2)',
+'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Ne najdem nobene merilom ustrezajoče spremembe.',
 'uctop' => '(trenutno)',
 'month' => 'Od meseca (in prej):',
@@ -2665,15 +2746,13 @@ Ali želite spremeniti nastavitve blokade?',
 Je pa blokiran kot del območja $2, ki ga lahko odblokirate.',
 'ip_range_invalid' => 'Neveljaven IP-razpon.',
 'ip_range_toolarge' => 'Območja blokade večja od /$1 niso dovoljena.',
-'blockme' => 'Blokiraj me',
 'proxyblocker' => 'Blokator posredniških strežnikov',
-'proxyblocker-disabled' => 'Funkcija je onemogočena.',
 'proxyblockreason' => 'Ker uporabljate odprti posredniški strežnik, je urejanje z vašega IP-naslova preprečeno.
 Gre za resno varnostno težavo, o kateri obvestite svojega internetnega ponudnika ali tehnično podporo.',
-'proxyblocksuccess' => 'Storjeno.',
 'sorbsreason' => 'Vaš IP-naslov je v DNSBL uvrščen med odprte posredniške strežnike.',
 'sorbs_create_account_reason' => 'Vaš IP-naslov je v DNSBL, ki ga uporablja {{GRAMMAR:tožilnik|{{SITENAME}}}}, naveden kot odprti posredniški strežnik (proxy).
 Računa žal ne morete ustvariti.',
+'xffblockreason' => 'IP-naslov, prisoten v glavi X-Forwarded-For, ali vaš ali od strežnika proxy, ki ga uporabljate, je blokiran. Izvirni razlog za blokado: $1',
 'cant-block-while-blocked' => 'Ne morete blokirati drugih uporabnikove, medtem ko ste sami blokirani.',
 'cant-see-hidden-user' => 'Uporabnik, ki ga poskušate blokirate, je že blokiran in skrit.
 Ker nimate pravice hideuser, si ne morete ogledati ali urejati uporabnikove blokade.',
@@ -2840,6 +2919,8 @@ Za lokalizacijo in prevajanje obiščite [//www.mediawiki.org/wiki/Localisation
 'thumbnail-more' => 'Povečaj',
 'filemissing' => 'Datoteka manjka',
 'thumbnail_error' => 'Napaka pri izdelavi sličice: $1',
+'thumbnail_error_remote' => 'Sporočilo o napaki od $1:
+$2',
 'djvu_page_error' => 'Stran DjVu je izven območja',
 'djvu_no_xml' => 'Ni mogoče pridobiti XML za datoteko DjVu',
 'thumbnail-temp-create' => 'Ne morem ustvariti začasne datoteke sličice',
@@ -3142,11 +3223,25 @@ Z njenim zagonom lahko ogrozite vaš sistem.",
 'minutes' => '$1 {{PLURAL:$1|minuta|minuti|minute|minut}}',
 'hours' => '$1 {{PLURAL:$1|ura|uri|ure|ur}}',
 'days' => '$1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
+'weeks' => '$1 {{PLURAL:$1|teden|tedna|tedni|tednov}}',
 'months' => '$1 {{PLURAL:$1|mesec|meseca|mesece|mesecev}}',
 'years' => '$1 {{PLURAL:$1|leto|leti|leta|let}}',
 'ago' => 'pred $1',
 'just-now' => 'pravkar',
 
+# Human-readable timestamps
+'hours-ago' => 'pred $1 {{PLURAL:$1|uro|urama|urami}}',
+'minutes-ago' => 'pred $1 {{PLURAL:$1|minuto|minutama|minutami}}',
+'seconds-ago' => 'pred $1 {{PLURAL:$1|sekundo|sekundama|sekundami}}',
+'monday-at' => 'Ponedeljek ob $1',
+'tuesday-at' => 'Torek ob $1',
+'wednesday-at' => 'Sreda ob $1',
+'thursday-at' => 'Četrtek ob $1',
+'friday-at' => 'Petek ob $1',
+'saturday-at' => 'Sobota ob $1',
+'sunday-at' => 'Nedelja ob $1',
+'yesterday-at' => 'Včeraj ob $1',
+
 # Bad image list
 'bad_image_list' => 'Oblika je naslednja:
 
@@ -3175,7 +3270,7 @@ Druga bodo po privzetem skrita.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Širina',
 'exif-imagelength' => 'Višina',
 'exif-bitspersample' => 'Bitov na barvni gradnik',
@@ -3353,7 +3448,7 @@ Druga bodo po privzetem skrita.
 'exif-originalimageheight' => 'Višina slike, preden je bila obrezana',
 'exif-originalimagewidth' => 'Širina slike, preden je bila obrezana',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nestisnjeno',
 'exif-compression-2' => 'Kodiranje CCITT skupina 3 1-razsežnostna spremenjena dolžina teka Huffman',
 'exif-compression-3' => 'Kodiranje CCITT skupina 3 faks',
@@ -3753,7 +3848,6 @@ Uporabite lahko tudi [[Special:EditWatchlist|standardni urejevalnik]].',
 'version-other' => 'Ostalo',
 'version-mediahandlers' => 'Upravljavci predstavnostnih vsebin',
 'version-hooks' => 'Razširitve',
-'version-extension-functions' => 'Funkcije razširitev',
 'version-parser-extensiontags' => 'Etikete razširitev razčlenjevalnika',
 'version-parser-function-hooks' => 'Funkcije razširitev razčlenjevalnika',
 'version-hook-name' => 'Ime razširitve',
@@ -3762,6 +3856,7 @@ Uporabite lahko tudi [[Special:EditWatchlist|standardni urejevalnik]].',
 'version-license' => 'Licenca',
 'version-poweredby-credits' => "Ta wiki poganja '''[//www.mediawiki.org/ MediaWiki]''', vse pravice pridržave © 2001-$1 $2.",
 'version-poweredby-others' => 'drugi',
+'version-poweredby-translators' => 'Prevajalci translatewiki.net',
 'version-credits-summary' => 'Radi bi priznali prispevek naslednjih oseb k [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki je prosto programje; lahko ga razširjate in / ali spreminjate pod pogoji GNU General Public License, kot ga je objavila Free Software Foundation; bodisi License različice 2 ali (po vaši izbiri) katere koli poznejše različice.
 
@@ -3777,14 +3872,17 @@ Skupaj s programom bi morali bi prejeti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopijo
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Pot članka]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Pot skripta]',
 
-# Special:FilePath
-'filepath' => 'Pot do datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Pojdi',
-'filepath-summary' => 'Ta posebna stran vrne polno pot do datoteke.
-Slike so prikazane v polni ločljivosti, druge vrste datotek pa se zaženejo v zanje določenih programih.
-
-Vnesite ime datoteke brez predpone »{{ns:file}}:«.',
+# Special:Redirect
+'redirect' => 'Preusmeri po datoteki, uporabniku ali ID-ju redakcije',
+'redirect-legend' => 'Preusmeritev na datoteko ali stran',
+'redirect-summary' => 'Posebna stran preusmeri na datoteko (če podate ime datoteke), stran (če podate ID redakcije) ali uporabniško stran (če podatek številski ID uporabnika).',
+'redirect-submit' => 'Pojdi',
+'redirect-lookup' => 'Iskanje:',
+'redirect-value' => 'Vrednost:',
+'redirect-user' => 'ID uporabnika',
+'redirect-revision' => 'Redakcija strani',
+'redirect-file' => 'Ime datoteke',
+'redirect-not-exists' => 'Vrednosti ni mogoče najti',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Iskanje podvojenih datotek',
@@ -3834,12 +3932,16 @@ Vnesite ime datoteke brez predpone »{{ns:file}}:«.',
 'tags' => 'Veljavne etikete sprememb',
 'tag-filter' => 'Filter [[Special:Tags|oznak]]:',
 'tag-filter-submit' => 'Filtriraj',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Oznaka|Oznaki|Oznake}}]]: $2)',
 'tags-title' => 'Etikete',
 'tags-intro' => 'Ta stran navaja etikete, s katerimi lahko programje označi urejanja, in njihov pomen.',
 'tags-tag' => 'Ime oznake',
 'tags-display-header' => 'Prikaz na seznamu sprememb',
 'tags-description-header' => 'Polni opis pomena',
+'tags-active-header' => 'Dejavno?',
 'tags-hitcount-header' => 'Etiketirane spremembe',
+'tags-active-yes' => 'Da',
+'tags-active-no' => 'Ne',
 'tags-edit' => 'uredi',
 'tags-hitcount' => '$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}',
 
@@ -3860,6 +3962,7 @@ Vnesite ime datoteke brez predpone »{{ns:file}}:«.',
 'dberr-problems' => 'Oprostite! Ta stran se sooča s tehničnimi težavami.',
 'dberr-again' => 'Poskusite počakati nekaj minut in ponovno naložite stran.',
 'dberr-info' => '(Ne morem se povezati s strežnikom zbirke podatkov: $1)',
+'dberr-info-hidden' => '(Ne morem se povezati s strežnikom zbirke podatkov)',
 'dberr-usegoogle' => 'V vmesnem času lahko poskusite z iskanjem preko Googla',
 'dberr-outofdate' => 'Pomnite, da so njegovi imeniki naših vsebin lahko zastareli.',
 'dberr-cachederror' => 'To je shranjena kopija zahtevane strani, ki morda ni najnovejša.',
@@ -3875,6 +3978,9 @@ Vnesite ime datoteke brez predpone »{{ns:file}}:«.',
 'htmlform-submit' => 'Pošlji',
 'htmlform-reset' => 'Razveljavi spremembe',
 'htmlform-selectorother-other' => 'Drugo',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Izberite možnost',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 s podporo iskanju polnih besedil',
@@ -3992,4 +4098,19 @@ V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bom
 # Image rotation
 'rotate-comment' => 'Slika zavrti s  $1  {{PLURAL:$1| degree|degrees}} v smeri urinega kazalca',
 
+# Limit report
+'limitreport-title' => 'Podatki profiliranja razčlenjevalnika:',
+'limitreport-cputime' => 'Poraba časa CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekunda|sekundi|sekunde|sekund}}',
+'limitreport-walltime' => 'Realna poraba časa',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekunda|sekundi|sekunde|sekund}}',
+'limitreport-ppvisitednodes' => 'Število predprocesorjevih ogledanih vozlišč',
+'limitreport-ppgeneratednodes' => 'Število predprocesorjevih ustvarjenih vozlišč',
+'limitreport-postexpandincludesize' => 'Velikost vključitve po razširitvi',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|zlog|zloga|zloge|zlogov}}',
+'limitreport-templateargumentsize' => 'Velikost argumentov predloge',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|zlog|zloga|zloge|zlogov}}',
+'limitreport-expansiondepth' => 'Največja globina razširitve',
+'limitreport-expensivefunctioncount' => 'Število dragih funkcij razčlenjevalnika',
+
 );
diff --git a/languages/messages/MessagesSli.php b/languages/messages/MessagesSli.php
index e028a80f..d9f04125 100644
--- a/languages/messages/MessagesSli.php
+++ b/languages/messages/MessagesSli.php
@@ -55,9 +55,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Oazoahl derr beobachtenden Nutzer oazäan',
 'tog-oldsig' => 'Vorschau der aktuella Signatur:',
 'tog-fancysig' => 'Signatur ols Wikitext behandeln (ohne automatische Verlinkung)',
-'tog-externaleditor' => "Extern'n Editor als Standard benutza (nur fier Experta, is missa spezielle Einstellungen uff dam eegenen Rechner vurgenumma warn)",
-'tog-externaldiff' => 'Externes Diff-Programm als Standard benutza (nur fier Experta, is missa spezielle Einstellungen uff dam eegenen Rechner vurgenumma warn)',
-'tog-showjumplinks' => '„Wechseln zu“-Verknipfunga aktiviern',
 'tog-uselivepreview' => 'Direkte Vurschau notza (beneetigt JavaScript) (vrsuchsweise)',
 'tog-forceeditsummary' => 'Warnen, wenn bem Speichern de Zsoammafassung fahln tutt',
 'tog-watchlisthideown' => 'Eigene Bearbeitungen ausblenden',
@@ -235,7 +232,7 @@ Bitte warte eenige Minuta, bevur du 's noo eemool versuchst.
 
 $1",
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Ieber {{SITENAME}}',
 'aboutpage' => 'Project:Ieber',
 'copyright' => 'Inhalt ies verfügbar unter der $1.',
@@ -245,7 +242,6 @@ $1",
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Bearbeitungshilfe',
-'edithelppage' => 'Help:Bearbeitungshilfe',
 'helppage' => 'Help:Hilfe',
 'mainpage' => 'Hauptseite',
 'mainpage-description' => 'Hauptseite',
@@ -309,15 +305,6 @@ Oalle verfügbara Spezialseyta sein ei der [[Special:SpecialPages|Liste der Spez
 
 # General errors
 'databaseerror' => 'Fehler ei der Datenbank',
-'dberrortext' => 'Is ies a Datenbankfahler uffgetreten.
-Dar Grund koan a Programmierfahler sei.
-De letzte Datenbankoabfroage lautete:
-<blockquote><tt>$1</tt></blockquote>
-aus dar Funksjonn „<tt>$2</tt>“.
-De Datenbank meldete dann Fahler „<tt>$3: $4</tt>“.',
-'dberrortextcl' => "Is goab an'n Syntaxfahler ei dar Datenbankobfroage.
-De letzte Datenbankobfroage lautete: „$1“ aus dar Funksjonn „<tt>$2</tt>“.
-De Datenbank meldete dann Fahler: „<tt>$3: $4</tt>“.",
 'laggedslavemode' => 'Achtung: Die angezeigte Seite enthält unter Umständen nicht die jüngsten Bearbeitungen.',
 'readonly' => 'Datenbanksperre',
 'missing-article' => 'Der Text von „$1“ $2 wurde nicht in der Datenbank gefunden.
@@ -347,7 +334,6 @@ Abfroage: $2',
 'editinginterface' => "'''Warnung:''' Diese Seite enthält vu der MediaWiki-Software benutzta Text.
 Änderunga wirka siech uff de Benutzeroberfläche aus.
 Fier Iebersetzunga ziehe bitte ei Betracht, diese eim [//translatewiki.net/wiki/Main_Page?setlang=de Translatewiki], damm MediaWiki-Lokalisierungsprojekt, durchzufiehra.",
-'sqlhidden' => '(SQL-Abfroage versteckt)',
 'cascadeprotected' => 'Diese Seite ies zur Beoarbeetung gesperrt. Se ies ei de {{PLURAL:$1|fulgende Seite|fulgenda Seita}} eengebunda, de mittels der Kaskadensperroption geschitzt {{PLURAL:$1|ies|sein}}:
 $2',
 'namespaceprotected' => "Du host kenne Berechtigung, de Seite eim '''$1'''-Noamensraum zu bearbta.",
@@ -449,7 +435,7 @@ Bitte warte, bevor du is erneut probierst.',
 'newpassword' => 'Neues Passwurt:',
 'retypenew' => 'Neues Passwurt (nuchmoal):',
 'resetpass_submit' => 'Poaßwurt iebermitteln und oamelda',
-'resetpass_success' => 'Dei Poaßwurt wurde erfolgreich geändert. Is fulgt de Oameldung …',
+'changepassword-success' => 'Dei Poaßwurt wurde erfolgreich geändert. Is fulgt de Oameldung …',
 'resetpass_forbidden' => 'Doas Poaßwurt koan ne geändert waan.',
 'resetpass-no-info' => 'Du muoßt diech oamelda, im uff diese Seite direkt zuzugreifa.',
 'resetpass-submit-loggedin' => 'Poaßwurt ändern',
@@ -808,10 +794,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
 'powersearch-togglenone' => 'Kenne',
 'searchdisabled' => 'De {{SITENAME}}-Suche ies deaktiviert. Du koast underdessa miet Google sucha. Bitte bedenke, doaß der Suchindex fier {{SITENAME}} veraltet sei koan.',
 
-# Quickbar
-'qbsettings' => 'Seytaleiste',
-'qbsettings-none' => 'Keene',
-
 # Preferences page
 'preferences' => 'Eenstellunga',
 'mypreferences' => 'Meene Eistellunga',
@@ -829,7 +811,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
 'saveprefs' => 'Eenstallunga speichern',
 'restoreprefs' => 'Olle Standardeinstallunga wiederherstalla',
 'prefs-editing' => 'Bearbta',
-'prefs-edit-boxsize' => 'Griße des Beoarbeetungsfansters:',
 'rows' => 'Zeila:',
 'columns' => 'Spalta:',
 'resultsperpage' => 'Treffer pro Seite:',
@@ -848,7 +829,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
 'prefs-namespaces' => 'Noamasräume',
 'defaultns' => 'Andernfoalls ei diesen Noamasräumen sucha:',
 'prefs-custom-js' => 'Nutzerdefiniertes JS',
-'prefs-textboxsize' => 'Griße des Beoarbeetungsfansters',
 'youremail' => 'E-Mail-Adresse:',
 'username' => 'Benutzernoame:',
 'prefs-memberingroups' => 'Mitglied dar {{PLURAL:$1|Nutzergruppe|Nutzergruppen}}:',
@@ -1038,7 +1018,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
 'recentchangeslinked-feed' => 'Änderunga oa verlinkta Seyta',
 'recentchangeslinked-toolbox' => 'Änderunga oa verlinkta Seyta',
 'recentchangeslinked-title' => 'Änneronga oa Seyta, de voo „$1“ verlinkt sein',
-'recentchangeslinked-noresult' => 'Eim ausgewählta Zeitraum wurden oa dann verlinkten Seyta kenne Änderunga vurgenumma.',
 'recentchangeslinked-summary' => "Diese Spezialseyte listet de letzta Änderunga oa dan verlinkta Seyta uff (bzw. bei Kategoria oa dan Mitgliedern dieser Kategorie). Seyta uff denner [[Special:Watchlist|Beobachtungsliste]] sein '''fett''' dargestellt.",
 'recentchangeslinked-page' => 'Seite:',
 'recentchangeslinked-to' => 'Zeige Änneronga uff Seita, de hierher verlinka',
@@ -1228,10 +1207,6 @@ Ieberpriefe andere Links zu den Vurlooga, bevur du diese läscht.',
 'statistics-users-active-desc' => 'Nutzer miet Beoarbeetunga {{PLURAL:$1|enn letzta 24 Stunden|enn vergangenen $1 Tagen}}',
 'statistics-mostpopular' => 'Meistbesichte Seyta',
 
-'disambiguations' => 'Begriffsklärungsseyta',
-'disambiguationspage' => 'Template:Begriffsklärung',
-'disambiguations-text' => 'De fulgenda Seita verlinka uff anne Seite zur Begriefsklärung. Se sullta stoats dassens uff de eigentlich gemeente Seite verlinka.<br />Anne Seite werd ols Begriefsklärungsseite behandelt, wenn [[MediaWiki:Disambiguationspage]] uff se verlinkt.<br />Links aus Noamasräumen waan hier ne uffgelistet.',
-
 'doubleredirects' => 'Doppelte Weiterleitunga',
 'doubleredirectstext' => 'Diese Liste enthält Weiterleitunga, de uff wettere Wetterleitunga verlinka.
 Jede Zeile enthält Links zu dar erschta und zweeta Wetterleitung suwie doas Ziel dar zweeta Wetterleitung, welches fier gewehnlich die gewünschte Zielseyte ies, uff de bereits de erschte Wetterleitung zeiga sullte.
@@ -1415,10 +1390,9 @@ Wenn du de Seite wieder vu denner Beobachtungsliste entferna mechtest, klicke uf
 'unwatch' => 'nä mehr beobachta',
 'unwatchthispage' => 'Nä mehr beobachta',
 'notanarticle' => 'Keene Seite',
-'watchnochange' => 'Kenne dar vu dir beobachteta Seyta wurde während des oagezeigta Zeitraums beoarbeetet.',
 'watchlist-details' => 'Du beobachtest {{PLURAL:$1|1 Seite|$1 Seita}}.',
-'wlheader-enotif' => '* Dar E-Mail-Benoachrichtigungsdienst ies aktiviert.',
-'wlheader-showupdated' => "* Seyta miet noo ne gesehenen Änderunga waan '''fett''' dargestellt.",
+'wlheader-enotif' => 'Dar E-Mail-Benoachrichtigungsdienst ies aktiviert.',
+'wlheader-showupdated' => "Seyta miet noo ne gesehenen Änderunga waan '''fett''' dargestellt.",
 'watchmethod-recent' => 'Ieberprifa dar letzta Beoarbeetunga fier de Beobachtungsliste',
 'watchmethod-list' => 'Ieberpriefa dar Beobachtungsliste noach letzta Beoarbeetunga',
 'watchlistcontains' => 'Denne Beobachtungsliste enthält $1 {{PLURAL:$1|Seite|Seita}}.',
@@ -1720,10 +1694,7 @@ Siehe de [[Special:BlockList|Liste dar gesperrta IP-Atressa und Nutzernoama]] fi
 'ipb_cant_unblock' => 'Fahler: Sperr-ID $1 ne gefunda. De Sperre wurde bereits uffgehuba.',
 'ipb_blocked_as_range' => 'Fahler: De IP-Atresse $1 wurde ols Teel dar Bereichssperre $2 indirekt gesperrt. Anne Entsperrung vu $1 alleene ies ne meeglich.',
 'ip_range_invalid' => 'Ungiltiger IP-Atressbereich.',
-'blockme' => 'Sperre miech',
-'proxyblocker-disabled' => 'Diese Funksjonn ies deaktiviert.',
 'proxyblockreason' => 'Denne IP-Atresse wurde gesperrt, do se a offener Proxy ies. Bitte kontaktiere denn Internet-Provider oder denne Systemadministratoren und informiere se ieber dieses meegliche Sicherheetsproblem.',
-'proxyblocksuccess' => 'Fattich',
 'sorbsreason' => 'De IP-Atresse ies ei dar DNSBL vu {{SITENAME}} ols offener PROXY gelistet.',
 'sorbs_create_account_reason' => 'De IP-Atresse ies ei dar DNSBL vu {{SITENAME}} ols offener PROXY gelistet. Doas Oalega neuer Nutzer ies ne meeglich.',
 'cant-block-while-blocked' => 'Du koast kenne andern Nutzer sperra, während du selbst gesperrt best',
@@ -2047,7 +2018,7 @@ Weitere werden standardmäßig nicht angezeigt.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagelength' => 'Länge',
 'exif-bitspersample' => 'Bits pro Forbkomponente',
 'exif-compression' => 'Oart dar Kompression',
@@ -2293,18 +2264,11 @@ Du koast au de [[Special:EditWatchlist|Standard-Beoarbeetungsseyte]] benutza.',
 'version-specialpages' => 'Spezialseyta',
 'version-other' => 'Oanderes',
 'version-hooks' => "Schnittstalla ''(Hooks)''",
-'version-extension-functions' => 'Funksjonnsuffruffe',
 'version-parser-extensiontags' => "Parser-Erweiterunga ''(tags)''",
 'version-parser-function-hooks' => 'Parser-Funksjonna',
 'version-hook-name' => 'Schnittstallanoame',
 'version-hook-subscribedby' => 'Uffruff vu',
 
-# Special:FilePath
-'filepath-submit' => 'Pfad sucha',
-'filepath-summary' => 'Miet dieser Spezialseyte lässt siech dar komplette Pfad dar aktuella Version einer Datei ohne Umweg obfroaga. De oagefroagte Datei werd direkt dargestallt bzw. miet der verkniepfta Oawendung gestartet.
-
-De Eengabe muuß ohne dann Zusatz „{{ns:file}}:“ erfolga.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-summary' => 'Suche noach Dateiduplikaten uff Basis ihres Hashwertes.',
 'fileduplicatesearch-legend' => 'Suche noach Duplikata',
diff --git a/languages/messages/MessagesSm.php b/languages/messages/MessagesSm.php
index edf772b6..137ffc4d 100644
--- a/languages/messages/MessagesSm.php
+++ b/languages/messages/MessagesSm.php
@@ -167,7 +167,7 @@ $messages = array(
 # Special:AllPages
 'allpagessubmit' => 'Alu',
 
-# Email user
+# E-mail user
 'emailuser' => "'Imeli mai le tagata lenei",
 'emailmessage' => "Fe'au",
 
diff --git a/languages/messages/MessagesSma.php b/languages/messages/MessagesSma.php
index 32474003..42fa0c0d 100644
--- a/languages/messages/MessagesSma.php
+++ b/languages/messages/MessagesSma.php
@@ -788,7 +788,7 @@ Jeatjebh dajveh lea gaptjedh goh sïejhme, bine vuesehte gåessie taabelle stoer
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Gamte',
 'exif-imagelength' => 'Gåhkoe',
 'exif-model' => 'Guvviedahke hammohke',
diff --git a/languages/messages/MessagesSn.php b/languages/messages/MessagesSn.php
index ad74a735..db4716bb 100644
--- a/languages/messages/MessagesSn.php
+++ b/languages/messages/MessagesSn.php
@@ -88,6 +88,9 @@ $messages = array(
 'viewsource' => 'Wona mabviro',
 
 # Login and logout pages
+'welcomecreation' => '== Tigashire, $1! ==
+Akaunzi yako yagadzirwa.
+Usakanganwe kuchinga [[Special:Preferences|mapreferences ako {{SITENAME}}]].',
 'yourname' => 'Zita:',
 'yourpassword' => 'Password:',
 'yourpasswordagain' => 'Nyorazve password:',
diff --git a/languages/messages/MessagesSo.php b/languages/messages/MessagesSo.php
index 8345e130..cfba54fe 100644
--- a/languages/messages/MessagesSo.php
+++ b/languages/messages/MessagesSo.php
@@ -44,9 +44,6 @@ $messages = array(
 'tog-shownumberswatching' => "I'tus tirada isticmaalayaasha wax waardiyeynaayo",
 'tog-oldsig' => 'Saxiixa jiro:',
 'tog-fancysig' => "u isticmaal saxiixa sida qoraalada wiki  (ayada oo linki auomaatik la'aan)",
-'tog-externaleditor' => "Isticmaal qoraal wax ka bedelyaal ka madaxbanaan (La'iskuogyahay)",
-'tog-externaldiff' => "Isticmaal qoraal wax ka bedelyaal ka madaxbanaan oo (La'iskuogyahay)",
-'tog-showjumplinks' => 'Shid "ku bood" links-ka la geli karo',
 'tog-uselivepreview' => 'Isticmaal horfiirinta tooska ah (JavaScript) (Wuxuu ku jiraa tijaabo)',
 'tog-forceeditsummary' => "I'xasuusi markii uusan qoraalkeyga raacsiisnay faahfaahin gaaban",
 'tog-watchlisthideown' => 'Ka qari wax bedelkeyga  liiska waardiyaha',
@@ -243,7 +240,7 @@ $1',
 'pool-queuefull' => 'Safka shaqeenta Pool woo buuxsamay',
 'pool-errorunknown' => 'Qalad la aqoon',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Ku saabsan {{SITENAME}}',
 'aboutpage' => 'Project:ku saabsan',
 'copyright' => 'Qoraalka wuxuu ku salaysanyahay $1.',
@@ -253,7 +250,6 @@ $1',
 'disclaimers' => "Masuul la'aan",
 'disclaimerpage' => "Project:Masuul la'aan guud",
 'edithelp' => 'Caawinaada wax ka bedelka',
-'edithelppage' => 'Help:Wax ka bedelka',
 'helppage' => 'Help:Caawinaad',
 'mainpage' => 'Bogga Hore',
 'mainpage-description' => 'Bogga Hore',
@@ -387,9 +383,18 @@ Sababta neh waxaa waaye "\'\'$2\'\'".',
 Waad sii isticmaali kartaa {{SITENAME}} adoona lagu aqoon, ama <span class='plainlinks'>[$1 gudaha gal]</span> adiga oo isticmaalaya magacaagii hore ama mid ka duwan. OGEYSIIS waxaa lagayabaa bogyaasha qaarkood in ay yiraahdaan wali gudaha ayaad ku jirtaa, ilaa inta aad ka nadiifineesid browsahaaga Internetka.",
 'welcomeuser' => 'Soo dhowoow, $1',
 'yourname' => 'Magaca gudagalka:',
+'userlogin-yourname' => 'Magaca gudagalka',
+'userlogin-yourname-ph' => 'Gasho magacaada kuu gaarka ah',
 'yourpassword' => 'Eraysir:',
+'userlogin-yourpassword' => 'Erey sir',
+'userlogin-yourpassword-ph' => 'Gali erey sir',
+'createacct-yourpassword-ph' => 'Gali erey sir',
 'yourpasswordagain' => 'Markale qor ereysirka:',
+'createacct-yourpasswordagain' => 'Hubi erey sirta',
+'createacct-yourpasswordagain-ph' => 'Mar kale gali erey sirta',
 'remembermypassword' => 'Kumbuyuutarkaan ku xasuusnaaw magaceyga gudagalka (ilaa  $1 {{PLURAL:$1|maalin|maalmood}})',
+'userlogin-remembermypassword' => 'Ka dhig mid diyaar ah mar waliba',
+'userlogin-signwithsecure' => 'Adeegso khad la hubo',
 'yourdomainname' => 'Magacaga shabakada',
 'password-change-forbidden' => 'Ma badali kartid Eraysir ee wiki.',
 'login' => 'Gudaha gal',
@@ -400,18 +405,33 @@ Waad sii isticmaali kartaa {{SITENAME}} adoona lagu aqoon, ama <span class='plai
 'logout' => 'Ka bax',
 'userlogout' => 'Ka bax',
 'notloggedin' => 'Gudaha kuma jirtid',
+'userlogin-noaccount' => 'Akoon ma heysatid?',
+'userlogin-joinproject' => 'Ku biir {{SITENAME}}',
 'nologin' => 'Akoon ma heysatid? $1.',
 'nologinlink' => 'Akoon sameyso',
 'createaccount' => 'Sameey gudagale',
 'gotaccount' => "Waan heystaa gudagale? '''$1'''.",
 'gotaccountlink' => 'Gudaha gal',
 'userlogin-resetlink' => 'Ma ilaawday tafaasiisha gudagalahaada?',
+'userlogin-resetpassword-link' => 'Dib usoo cesho erey sirtaada',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Caawinaad habka gudagalka]]',
+'createacct-join' => 'Gali macluumaadkaada gaarka ah.',
+'createacct-emailoptional' => 'Ciwaanka e-mail-ka (dooqasho)',
+'createacct-email-ph' => 'Gali Ciwaankaada e-mail-ka',
 'createaccountmail' => 'E-mail ahaan',
 'createaccountreason' => 'Sababta:',
+'createacct-captcha' => 'Hubin amni',
+'createacct-imgcaptcha-ph' => 'Gali qoraalka aad kor ku aragto',
+'createacct-submit' => 'Sameeyso akoonkaada',
+'createacct-benefit-heading' => 'Bogga {{SITENAME}} waxaa sameeyey dad kula mid ah.',
+'createacct-benefit-body1' => '{{PLURAL:$1|bedel|bedelaadyo}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|bog|Bogag}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributor|wax qoreyaasha}}',
 'badretype' => 'Ereyada sirta ah oo qortay ma islahan.',
 'userexists' => 'Magaca isticmaalaha aad qortay wuu jiraa.
 Fadlan dooro magac kale.',
 'loginerror' => 'Qalad gudagalista',
+'createacct-error' => 'Qalad dhacay samaynta akoonka',
 'createaccounterror' => 'Ma sameeyn karin akoon: $1',
 'nocookiesnew' => "Akoonka isticmaalahaan waa la sameeyay, laakiin adiga gudaha uma soo gelin.
 {{SITENAME}} wuxuu isticmaalaa cookies si ee gudaha u galaan isticmaale yaasha.
@@ -484,7 +504,7 @@ Hadii aad rabtid in aad dhameestirtid gudagelkaaga, waa in aad meeshaan ku qorta
 'newpassword' => 'Ereysir cusub:',
 'retypenew' => 'Qor mar labaad ereysirka cusub:',
 'resetpass_submit' => 'Qor eraysirka gudaha neh gal',
-'resetpass_success' => 'Ereysirkaada si fiican oo kuugu bedelmay!
+'changepassword-success' => 'Ereysirkaada si fiican oo kuugu bedelmay!
 Hadda gudaha ku gal',
 'resetpass_forbidden' => 'ereyada sirta ah mala bedeli karo',
 'resetpass-no-info' => 'Waa in aad gudaha u gashaa hadii aad rabto in aad si toos ah ugu soo gudubto boggaan.',
@@ -494,6 +514,7 @@ Hadda gudaha ku gal',
 
 # Special:PasswordReset
 'passwordreset' => 'Bedel ereysirka',
+'passwordreset-text-many' => '{{PLURAL:$1|Gali mid ka mid ah macluumaadkaada asaasiga ah si erey sirtaada usoo ceshato.}}',
 'passwordreset-legend' => 'Bedel ereysirka',
 'passwordreset-username' => 'Magaca gudagalka',
 'passwordreset-email' => 'Ciwaanka e-mailka',
@@ -741,7 +762,6 @@ sababteeda neh waxaa laga heli kartaa  [{{fullurl:{{#Special:Log}}/delete|page={
 'searchmenu-legend' => 'Raadi doorashooyinka',
 'searchmenu-exists' => "'''Wikigaan wuu ku jiraa bog la dhoho  \"[[:\$1]]\" .'''",
 'searchmenu-new' => "'''Ku sameey bogga  \"[[:\$1]]\" wikigaan!'''",
-'searchhelp-url' => 'Help:Caawinaad',
 'searchprofile-articles' => 'Maqaalada kooban',
 'searchprofile-project' => 'Caawin iyo Bogga mashruuca',
 'searchprofile-images' => 'Multimedia-ha',
@@ -776,9 +796,6 @@ sababteeda neh waxaa laga heli kartaa  [{{fullurl:{{#Special:Log}}/delete|page={
 'powersearch-toggleall' => 'Dhamaan',
 'powersearch-togglenone' => 'Waxna',
 
-# Quickbar
-'qbsettings-none' => 'Waxna',
-
 # Preferences page
 'preferences' => 'Dooqyada',
 'mypreferences' => 'Dooqyadeyda',
@@ -875,6 +892,7 @@ E-mailkaada mala sheegaayo markii ee dadka kale kula soo xiriirayaan.',
 'recentchanges' => 'Isbedelada dhow',
 'recentchanges-legend' => 'Dooqyada isbedelada dhow',
 'recentchanges-summary' => 'Dabagal isbedelada dhow ee wikiga ee ku dhacay bogaan.',
+'recentchanges-noresult' => 'Ma jiraan wax is bedel ah xilliga aad soo koobtay ee u dhigma habkaan.',
 'recentchanges-feed-description' => 'Dabagal isbedelada dhow ee wikiga oo ku dhacay feedkaan',
 'recentchanges-label-newpage' => 'Wax bedelkaan wuxuu sameeyay bog cusub',
 'recentchanges-label-minor' => 'Kan waa bedel yar',
@@ -905,7 +923,6 @@ E-mailkaada mala sheegaayo markii ee dadka kale kula soo xiriirayaan.',
 'recentchangeslinked' => "Isbedelada la'xiriira",
 'recentchangeslinked-toolbox' => "Isbedelada la'xiriira",
 'recentchangeslinked-title' => 'Wax bedelka la xiriiro "$1"',
-'recentchangeslinked-noresult' => 'Wax isbedel ah laguma sameyn boggaga ilaa xiligii la doortay.',
 'recentchangeslinked-summary' => "Liiskaan waa badalyada mardhow lagu sameeyay bogyaasha la xiriiray boggaga khaaska ah  (ama ka mid ahaa qeybaha khaaska ah).
 Boggaga ku jiro  [[Special:Watchlist|liiskaaga waardiyaha]] waa '''butac'''.",
 'recentchangeslinked-page' => 'Magaca bogga:',
@@ -1283,8 +1300,6 @@ Eeg [[Special:BlockList|Mamnuucyada]] si aad u aragto liiska mamnuucyada ee hadd
 'block-log-flags-nocreate' => 'sameynta gudagalah lamaogola',
 'block-log-flags-noemail' => 'e-mailka laga mamnuucay',
 'ipb-needreblock' => '$1 mar hore aa la mamnuucay. marabtaa in aad wax ka bedesho habka?',
-'blockme' => 'I mamnuuc',
-'proxyblocksuccess' => 'waa la sameeyay.',
 
 # Move page
 'movenologin' => 'Gudaha kuma jirtid',
@@ -1416,7 +1431,7 @@ Hadii faylka wax laga badalay sida oo markiisa hore ahaa, waxaa laga yaabaa in e
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-iimcategory' => 'Qeybta',
 
 # External editor support
@@ -1462,9 +1477,8 @@ waxaad awoodaa [[Special:EditWatchlist/raw|Liiska wax ka bedel]].',
 # Special:Version
 'version-poweredby-others' => 'kuwa kale',
 
-# Special:FilePath
-'filepath-page' => 'Fayl:',
-'filepath-submit' => 'Soco',
+# Special:Redirect
+'redirect-file' => 'Magaca faylka',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch-legend' => 'Raadi mid tusaale ah',
@@ -1509,4 +1523,8 @@ waxaad awoodaa [[Special:EditWatchlist/raw|Liiska wax ka bedel]].',
 'api-error-unknown-warning' => 'Digniin la aqoon: $1',
 'api-error-uploaddisabled' => 'Soo gelinta waa laga xiray wikigaan.',
 
+# Limit report
+'limitreport-cputime' => 'Waqtiga adeegsiga CPU',
+'limitreport-walltime' => 'Waqtiga dhabta ah adeegsiga',
+
 );
diff --git a/languages/messages/MessagesSq.php b/languages/messages/MessagesSq.php
index 1ee106ed..35a67cbe 100644
--- a/languages/messages/MessagesSq.php
+++ b/languages/messages/MessagesSq.php
@@ -246,9 +246,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Trego numrin e përdoruesve që vëzhgojnë këtë faqe',
 'tog-oldsig' => 'Nënshkrimi ekzistues:',
 'tog-fancysig' => 'Mbaje nënshkrimin si wikitekst (pa lidhje automatike)',
-'tog-externaleditor' => 'Përdor si rregull program të jashtëm redaktimi (vetëm për ekspertë, kërkon regjistrime speciale të kompjuterit. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Përdor si rregull program të jashtëm diff (vetëm për ekspertë, kërkon regjistrime speciale të kompjuterit. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => 'Lejo lidhje "shko tek"',
 'tog-uselivepreview' => 'Trego bocetin në mënyrë të drejtëpërdrejtë (kërkon JavaScript) (eksperimentale)',
 'tog-forceeditsummary' => 'Më njofto kur e lë përmbledhjen e redaktimit bosh',
 'tog-watchlisthideown' => 'Fshih redaktimet e mia nga lista e faqeve të vëzhguara',
@@ -261,6 +258,7 @@ $messages = array(
 'tog-diffonly' => 'Mos trego përmbajtjen e faqes nën diff-e',
 'tog-showhiddencats' => 'Trego kategoritë e fshehura',
 'tog-norollbackdiff' => 'Ndryshimi pas rikthimit do të fshihet',
+'tog-useeditwarning' => 'Më paralajmëro kur unë lë një redaktim faqeje me ndryshime të paruajtura',
 
 'underline-always' => 'Gjithmonë',
 'underline-never' => 'Asnjëherë',
@@ -324,6 +322,18 @@ $messages = array(
 'oct' => 'Tet',
 'nov' => 'Nën',
 'dec' => 'Dhje',
+'january-date' => '$1 janar',
+'february-date' => '$1 shkurt',
+'march-date' => '$1 mars',
+'april-date' => '$1 prill',
+'may-date' => '$1 maj',
+'june-date' => '$1 qershor',
+'july-date' => '$1 korrik',
+'august-date' => '$1 gusht',
+'september-date' => '$1 shtator',
+'october-date' => '$1 tetor',
+'november-date' => '$1 nëntor',
+'december-date' => '$1 dhjetor',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategoria|Kategoritë}}',
@@ -405,6 +415,7 @@ $messages = array(
 'create-this-page' => 'Krijoje këtë faqe',
 'delete' => 'Grise',
 'deletethispage' => 'Grise këtë faqe',
+'undeletethispage' => 'Rikthe faqen',
 'undelete_short' => 'Anullo fshirjen {{PLURAL:$1|një redaktim|$1 redaktime}}',
 'viewdeleted_short' => 'Shiko {{PLURAL:$1|një redaktim të fshirë|$1 redaktime të fshira}}',
 'protect' => 'Mbroje',
@@ -448,7 +459,7 @@ $1",
 'pool-queuefull' => 'Radha e proceseve është mbushur',
 'pool-errorunknown' => 'Gabim i panjohur',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Rreth {{SITENAME}}',
 'aboutpage' => 'Project:Rreth',
 'copyright' => 'Përmbajtja është në disponim nëpërmjet licencës $1.',
@@ -458,7 +469,6 @@ $1",
 'disclaimers' => 'Shfajësimet',
 'disclaimerpage' => 'Project:Shfajësimet e përgjithshme',
 'edithelp' => 'Ndihmë për redaktim',
-'edithelppage' => 'Help:Redaktimi',
 'helppage' => 'Help:Përmbajtje',
 'mainpage' => 'Faqja kryesore',
 'mainpage-description' => 'Faqja kryesore',
@@ -535,18 +545,6 @@ Kjo mund të vijë edhe si rezultat i një gabimi në programin e përdorur nga
 # General errors
 'error' => 'Gabim',
 'databaseerror' => 'Gabim në databazë',
-'dberrortext' => 'Ka ndodhur një gabim me pyetjen e regjistrit.
-Kjo mund të ndodhi n.q.s. pyetja nuk është e vlehshme,
-ose mund të jetë një yçkël e softuerit.
-Pyetja e fundit që i keni bërë regjistrit ishte:
-<blockquote><tt>$1</tt></blockquote>
-nga funksioni "<tt>$2</tt>".
-MySQL kthehu gabimin "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Ka ndodhur një gabim me sintaksën query në databazë. 
-Query e fundit që i keni bërë regjistrit ishte:
-"$1"
-nga funksioni "$2".
-MySQL kthehu gabimin "$3: $4".',
 'laggedslavemode' => "'''Kujdes:''' Kjo faqe nuk mund të ketë përditësime të kohëve të fundit.",
 'readonly' => 'Databaza e kyçur',
 'enterlockreason' => 'Shëno arsyen e kyçjes, gjithashtu shëno se kur mund të hapet.',
@@ -601,7 +599,6 @@ Ju lutemi, provojeni përsëri pas disa minutash.',
 'editinginterface' => "'''Kujdes:''' Po redaktoni një faqe që përdoret për tekstin dritares së programit. 
 Ndryshimet në këtë faqe do të ndikojnë pamjen e dritares për përdoruesit e tjerë.
 Për përkthime, ju lutem konsideroni përdorimin e [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], projektin e lokalizimit MediaWiki.",
-'sqlhidden' => '(Query SQL e fshehur)',
 'cascadeprotected' => 'Kjo faqe është mbrojtur nga redaktimi pasi është përfshirë në {{PLURAL:$1|faqen|faqet}} e mëposhtme që {{PLURAL:$1|është|janë}} mbrojtur sipas metodës "cascading":
 $2',
 'namespaceprotected' => "Nuk ju lejohet redaktimi i faqeve në hapsirën '''$1'''.",
@@ -632,10 +629,19 @@ Administratori i cili e mbylli atë e dha këtë shpjegim: "$3".',
 'welcomecreation-msg' => 'Llogaria juaj u krijua. 
 Mos harroni të ndryshoni [[Special:Preferences|{{SITENAME}} preferencat]] tuaja.',
 'yourname' => 'Fusni nofkën tuaj',
+'userlogin-yourname' => 'Emri i përdoruesit',
+'userlogin-yourname-ph' => 'Shtypni emrin tuaj të përdoruesit',
+'createacct-another-username-ph' => 'Shtypni emrin e përdoruesit',
 'yourpassword' => 'Fusni fjalëkalimin tuaj',
+'userlogin-yourpassword' => 'Fjalëkalimi',
+'userlogin-yourpassword-ph' => 'Shtypni fjalëkalimin tuaj',
+'createacct-yourpassword-ph' => 'Shtypni një fjalëkalim',
 'yourpasswordagain' => 'Fusni fjalëkalimin përsëri',
+'createacct-yourpasswordagain' => 'Konfirmoni fjalëkalimin',
+'createacct-yourpasswordagain-ph' => 'Shtypni fjalëkalimin përsëri',
 'remembermypassword' => 'Mbaj mënd fjalëkalimin tim për tërë vizitat e ardhshme (për një kohë maksimale prej $1 {{PLURAL:$1|dite|ditësh}})',
-'securelogin-stick-https' => 'Qëndro i lidhur me HTTPS pas hyrjes me emrin përkatës',
+'userlogin-remembermypassword' => 'Më mbaj të kyçur',
+'userlogin-signwithsecure' => 'Përdor lidhje të sigurtë',
 'yourdomainname' => 'Faqja juaj',
 'password-change-forbidden' => 'Ju nuk mund të ndryshoni fjalëkalimet në këtë wiki.',
 'externaldberror' => 'Ose kishte një gabim tek regjistri i identifikimit të jashtëm, ose nuk ju lejohet të përtërini llogarinë tuaje të jashtme.',
@@ -647,12 +653,17 @@ Mos harroni të ndryshoni [[Special:Preferences|{{SITENAME}} preferencat]] tuaja
 'logout' => 'Dalje',
 'userlogout' => 'Dalje',
 'notloggedin' => 'Nuk keni hyrë brenda',
+'userlogin-noaccount' => 'Nuk keni një llogari?',
+'userlogin-joinproject' => 'Bashkohu me ne në {{SITENAME}}',
 'nologin' => "Nuk keni një llogari? '''$1'''.",
 'nologinlink' => 'Hapeni',
 'createaccount' => 'Hap një llogari',
 'gotaccount' => "Keni një llogari? '''$1'''.",
 'gotaccountlink' => 'Hyni',
 'userlogin-resetlink' => 'Keni harruar të dhënat tuaja të identifikimit?',
+'userlogin-resetpassword-link' => 'Rivendos fjalëkalimin',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Më ndihmo të futem në Wikipedia]]',
+'createacct-join' => 'Jepni informacionin tuaj më poshtë',
 'createaccountmail' => 'me email',
 'createaccountreason' => 'Arsyeja:',
 'badretype' => 'Fjalëkalimet nuk janë njësoj.',
@@ -728,7 +739,7 @@ Për të hyrë tërësisht duhet të vendosni një fjalëkalim të ri këtu:',
 'newpassword' => 'I riu',
 'retypenew' => 'I riu përsëri',
 'resetpass_submit' => 'Ndrysho fjalëkalimin dhe hyni brenda',
-'resetpass_success' => 'Fjalëkalimi juaj është ndryshuar me sukses! Mund të hyni brenda...',
+'changepassword-success' => 'Fjalëkalimi juaj është ndryshuar me sukses! Mund të hyni brenda...',
 'resetpass_forbidden' => 'Fjalëkalimet nuk mund të ndryshohen',
 'resetpass-no-info' => 'Duhet të jeni i kyçur që të keni qasje direkte në këtë faqe.',
 'resetpass-submit-loggedin' => 'Ndrysho fjalëkalimin',
@@ -738,10 +749,8 @@ Për të hyrë tërësisht duhet të vendosni një fjalëkalim të ri këtu:',
 
 # Special:PasswordReset
 'passwordreset' => 'Ndrysho fjalkalimin',
-'passwordreset-text' => 'Plotësoni këtë formular për të marrë një këshillë e-mail të dhënat e llogarisë suaj.',
 'passwordreset-legend' => 'Ndrysho fjalkalimin',
 'passwordreset-disabled' => 'Rivendosja e fjalëkalimit është deaktivizuar në këtë wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Shkruani një nga pjesët e të dhënave më poshtë}}',
 'passwordreset-username' => 'Nofka:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Dëshiron të shikosh e-mail-in që rezulton?',
@@ -983,6 +992,8 @@ Duket se është grisur.',
 'edit-already-exists' => 'Faqja nuk mundej të hapet.
 Ajo tanimë ekziston.',
 'defaultmessagetext' => 'Teksti i porosisë së parazgjedhur',
+'editwarning-warning' => 'Lënia e kësaj faqeje mund t\'ju shkaktojë humbjen e çdo ndryshimi që keni bërë.
+Nëse keni hyrë brenda, ju mund ta hiqni këtë paralajmërim në seksionin "Redaktimi" tek preferencat tuaja.',
 
 # Content models
 'content-model-text' => 'tekst i thejshtë',
@@ -1208,7 +1219,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'searchmenu-legend' => 'Parazgjedhjet e kërkimit',
 'searchmenu-exists' => "'''Në këtë wiki kjo faqe është emëruar \"[[:\$1]]\"'''",
 'searchmenu-new' => "'''Hapë faqen \"[[:\$1]]\" në këtë wiki!'''",
-'searchhelp-url' => 'Help:Ndihmë',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Shfletoi faqet me këtë parashtesë]]',
 'searchprofile-articles' => 'Përmbajtja e faqeve',
 'searchprofile-project' => 'Ndihmë dhe faqet e Projektit',
@@ -1250,15 +1260,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'search-external' => 'Kërkim i jashtëm',
 'searchdisabled' => '<p>Kërkimi me tekst të plotë është bllokuar tani për tani ngaqë shërbyesi është shumë i ngarkuar; shpresojmë ta nxjerrim prapë në gjendje normale pas disa punimeve. Deri atëherë mund të përdorni Google-in për kërkime:</p>',
 
-# Quickbar
-'qbsettings' => 'Vendime të shpejta',
-'qbsettings-none' => 'Asnjë',
-'qbsettings-fixedleft' => 'Lidhur majtas',
-'qbsettings-fixedright' => 'Lidhur djathtas',
-'qbsettings-floatingleft' => 'Pezull majtas',
-'qbsettings-floatingright' => 'Pezull djathtas',
-'qbsettings-directionality' => 'Fikse, në varësi të skriptës së drejtuar në gjuhën tuaj',
-
 # Preferences page
 'preferences' => 'Parapëlqimet',
 'mypreferences' => 'Parapëlqimet',
@@ -1291,7 +1292,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'resetprefs' => 'Rikthe parapëlqimet',
 'restoreprefs' => 'Rikthe të gjitha të dhënat e mëparshme',
 'prefs-editing' => 'Redaktimi',
-'prefs-edit-boxsize' => 'Madhësia e dritares së redaktimit.',
 'rows' => 'Rreshta:',
 'columns' => 'Kollona:',
 'searchresultshead' => 'Kërkimi',
@@ -1302,9 +1302,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|dit|ditë}})',
 'recentchangescount' => 'Numri i redaktimeve për të treguar:',
 'prefs-help-recentchangescount' => 'Kjo përfshin ndryshimet e freskëta, historikun e faqes dhe regjistrat.',
-'prefs-help-watchlist-token' => 'Plotësimi në këtë fushë me një kyç të fshehtë do të gjenerojë një RSS për të listës mbikqyrëse tuaj. 
- Kushdo që e di të rëndësishme në këtë fushë do të jetë në gjendje për të lexuar lista mbikqyrëse e juaj, kështu që zgjidhni një vlerë të sigurt. 
- Këtu ka një vlerë të rastësishme-generated ju mund të përdorni: $1',
 'savedprefs' => 'Parapëlqimet tuaja janë ruajtur.',
 'timezonelegend' => 'Zona kohore:',
 'localtime' => 'Ora lokale:',
@@ -1335,7 +1332,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'prefs-reset-intro' => 'Mundeni me përdorë këtë faqe për me i kthy parapëlqimet tueja në ato të paracaktuemet e faqes.
 Kjo nuk mundet me u zhbâ.',
 'prefs-emailconfirm-label' => 'Konfirmimi i emailit:',
-'prefs-textboxsize' => 'Madhësia e dritares së redakrimit',
 'youremail' => 'Adresa e email-it*',
 'username' => 'Nofka e përdoruesit:',
 'uid' => 'Nr. i identifikimit:',
@@ -1574,7 +1570,6 @@ Kjo informatë është publike.',
 'recentchangeslinked-feed' => 'Ndryshime të ndërvarura',
 'recentchangeslinked-toolbox' => 'Ndryshime të ndërvarura',
 'recentchangeslinked-title' => 'Ndryshime që kanë lidhje me "$1"',
-'recentchangeslinked-noresult' => 'Nuk ka pasur ndryshime tek faqet e lidhura gjatë kohës së dhënë.',
 'recentchangeslinked-summary' => "Kjo është një listë e ndryshimeve së fundmi të faqeve të lidhura nga faqja e dhënë (ose bëjnë pjesë tek kategoria e dhënë).
 Faqet [[Special:Watchlist|nën mbikqyrjen tuaj]] duken të '''theksuara'''.",
 'recentchangeslinked-page' => 'Emri i faqes:',
@@ -1796,7 +1791,6 @@ Për siguri optimale, img_auth.php është çaktivizuar.',
 'http-read-error' => 'Gabim në leximin e HTTP.',
 'http-timed-out' => 'Kërkesës HTTP i kaloi koha.',
 'http-curl-error' => 'Gabim gjatë gjetjes së URL-së: $1',
-'http-host-unreachable' => 'Nuk mund të lidheni me adresën URL.',
 'http-bad-status' => 'Ndodhi një problem gjatë kërkesës HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1945,12 +1939,6 @@ Mos harroni të shihni nyje tjera të stampave para grisjes së tyre.',
 'statistics-users-active-desc' => 'Përdoruesit që kanë së paku një veprim në {{PLURAL:$1|ditën|$1 ditët}} e fundit',
 'statistics-mostpopular' => 'Faqet më të shikuara',
 
-'disambiguations' => 'Faqet që lidhen te faqet kthjelluese',
-'disambiguationspage' => 'Template:Kthjellim',
-'disambiguations-text' => "Faqet e mëposhtme lidhen tek një '''faqe kthjelluese'''.
-Ato duhet të kenë lidhje të drejtpërdrejtë tek artikujt e nevojshëm.<br />
-Një faqe trajtohet si faqe kthjelluese nëse përdor stampat e lidhura nga [[MediaWiki:Disambiguationspage]]",
-
 'doubleredirects' => 'Përcjellime dopjo',
 'doubleredirectstext' => "Kjo faqe liston faqet përcjellëse tek faqet e tjera përcjellëse.
 Secili rresht përmban lidhjet tek përcjellimi i parë dhe përcjellimi i dytë, gjithashtu synimin e përcjellimit të dytë, që është zakonisht faqja synuese '''e vërtetë''', që faqja w parë duhej të ishte përcjellëse e kësaj faqeje.
@@ -2194,10 +2182,9 @@ Në qoftë se dëshironi të hiqni një faqe nga lista mbikqyrëse më vonë, sh
 'unwatchthispage' => 'Mos e mbikqyr',
 'notanarticle' => 'Nuk është artikull',
 'notvisiblerev' => 'Revizioni është grisur',
-'watchnochange' => 'Asnjë nga artikujt nën mbikqyrje nuk është redaktuar gjatë kohës së dhënë.',
 'watchlist-details' => '{{PLURAL:$1|$1 faqe|$1 faqe}} nën mbikqyrje duke mos numëruar faqet e diskutimit.',
-'wlheader-enotif' => '* Njoftimi me email është lejuar.',
-'wlheader-showupdated' => "* Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të '''trasha'''",
+'wlheader-enotif' => 'Njoftimi me email është lejuar.',
+'wlheader-showupdated' => "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të '''trasha'''",
 'watchmethod-recent' => 'duke parë ndryshimet e fundit për faqet nën mbikqyrje',
 'watchmethod-list' => 'duke parë faqet nën mbikqyrje për ndryshimet e fundit',
 'watchlistcontains' => 'Lista mbikqyrëse e juaj ka $1 {{PLURAL:$1|faqe|faqe}}.',
@@ -2614,11 +2601,8 @@ Mund të jetë zhbllokuar.',
 Ajo është, megjithatë, e bllokuar si pjesë e rangut $2, që nuk mund të zhbllokohet.',
 'ip_range_invalid' => 'Shtrirje IP gabim.',
 'ip_range_toolarge' => 'Radhitja e bllokimeve më të mëdha se /$1 nuk lejohet.',
-'blockme' => 'Më blloko',
 'proxyblocker' => 'Bllokuesi i ndërmjetëseve',
-'proxyblocker-disabled' => 'Ky funksion është pamundësuar.',
 'proxyblockreason' => 'IP adresa juaj është bllokuar sepse është një ndërmjetëse e hapur. Ju lutem lidhuni me kompaninë e shërbimeve të Internetit që përdorni dhe i informoni për këtë problem sigurije.',
-'proxyblocksuccess' => 'Mbaruar.',
 'sorbsreason' => 'Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL.',
 'sorbs_create_account_reason' => 'Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL që përdoret nga {{SITENAME}}. Nuk ju lejohet të hapni një llogari.',
 'cant-block-while-blocked' => 'Ju nuk mund të bllokoni përdorues të tjerë ndërkohë që jeni i bllokuar.',
@@ -2959,8 +2943,6 @@ Ju lutemi provoni përsëri.',
 'pageinfo-authors' => 'Numri i autorëve të veçantë',
 
 # Skin names
-'skinname-standard' => 'Standarte',
-'skinname-nostalgia' => 'Nostalgjike',
 'skinname-cologneblue' => 'Kolonjë Blu',
 
 # Patrolling
@@ -3062,7 +3044,7 @@ Në qoftë se skeda është ndryshuar nga gjendja origjinale, disa hollësira mu
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Gjerësia',
 'exif-imagelength' => 'Gjatësia',
 'exif-bitspersample' => 'Bit për komponent',
@@ -3240,7 +3222,7 @@ Në qoftë se skeda është ndryshuar nga gjendja origjinale, disa hollësira mu
 'exif-originalimageheight' => 'Lartësia e fotografisë para se të shkurtohej',
 'exif-originalimagewidth' => 'Gjerësia e fotografisë para se të shkurtohej',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'E pangjeshur',
 'exif-compression-2' => 'CCITT Grupi 3 1-Dimensional Kodimi i Modifikuar Huffman i linjës së gjatësisë',
 'exif-compression-3' => 'CCITT Grupi 3 faks kodimi',
@@ -3627,7 +3609,6 @@ Ju gjithashtu mund [[Special:EditWatchlist|të përdorni redaktuesin standart]].
 'version-other' => 'Të tjera',
 'version-mediahandlers' => 'Mbajtesit e Media-s',
 'version-hooks' => 'Goditjet',
-'version-extension-functions' => 'Funksionet shtese',
 'version-parser-extensiontags' => 'Parser etiketat shtese',
 'version-parser-function-hooks' => 'Parser goditjet e funksionit',
 'version-hook-name' => 'Emri i goditjes',
@@ -3646,13 +3627,6 @@ Ju duhet të keni marrë [{{SERVER}}{{SCRIPTPATH}}/COPYING një kopje të GNU Ge
 'version-software-version' => 'Versioni',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Vendndodhja e skedave',
-'filepath-page' => 'Skeda:',
-'filepath-submit' => 'Shko',
-'filepath-summary' => 'Kjo faqe speciale jep vendndodhjen e plotë të një skede.
-Figurat tregohen me madhësi të plotë, skedat e tjera hapen me programet përkatëse.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Kërkoni për skeda të dyfishta',
 'fileduplicatesearch-summary' => 'Kërkoni për dyfishime të skedave në bazë të vlerës përmbledhëse («hash»).',
diff --git a/languages/messages/MessagesSr_ec.php b/languages/messages/MessagesSr_ec.php
index d365b193..88c90c4a 100644
--- a/languages/messages/MessagesSr_ec.php
+++ b/languages/messages/MessagesSr_ec.php
@@ -27,6 +27,7 @@
  * @author TheStefan12345
  * @author Јованвб
  * @author Жељко Тодоровић
+ * @author Милан Јелисавчић
  * @author Михајло Анђелковић
  * @author לערי ריינהארט
  */
@@ -425,9 +426,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Прикажи број корисника који надгледају',
 'tog-oldsig' => 'Текући потпис:',
 'tog-fancysig' => 'Сматрај потпис као викитекст (без самоповезивања)',
-'tog-externaleditor' => 'Увек користи спољни уређивач (само за напредне — потребне су посебне поставке на рачунару)',
-'tog-externaldiff' => 'Увек користи спољни програм за упоређивање (само за напредне — потребне су посебне поставке на рачунару)',
-'tog-showjumplinks' => 'Омогући помоћне везе „Иди на“',
 'tog-uselivepreview' => 'Користи тренутан преглед (експериментално)',
 'tog-forceeditsummary' => 'Упозори ме када не унесем опис измене',
 'tog-watchlisthideown' => 'Сакриј моје измене са списка надгледања',
@@ -441,6 +439,8 @@ $messages = array(
 'tog-showhiddencats' => 'Прикажи скривене категорије',
 'tog-noconvertlink' => 'Онемогући претварање наслова веза',
 'tog-norollbackdiff' => 'Изостави разлику након извршеног враћања',
+'tog-useeditwarning' => 'Упозори ме када напуштам страницу са несачуваним променама',
+'tog-prefershttps' => 'Увек користи сигурну конекцију када сам пријављен.',
 
 'underline-always' => 'увек подвлачи',
 'underline-never' => 'никад не подвлачи',
@@ -504,6 +504,18 @@ $messages = array(
 'oct' => 'окт',
 'nov' => 'нов',
 'dec' => 'дец',
+'january-date' => '$1 јануар',
+'february-date' => '$1 фебруар',
+'march-date' => '$1 март',
+'april-date' => '$1 април',
+'may-date' => '$1 мај',
+'june-date' => '$1 јун',
+'july-date' => '$1 јул',
+'august-date' => '$1 август',
+'september-date' => '$1 семптембар',
+'october-date' => '$1 окотобар',
+'november-date' => '$1 новембар',
+'december-date' => '$1 децембар',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категорија|Категорије}}',
@@ -524,7 +536,7 @@ $messages = array(
 'noindex-category' => 'Непописане странице',
 'broken-file-category' => 'Странице с неисправним везама до датотека',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'О нама',
 'article' => 'Страница са садржајем',
@@ -587,6 +599,7 @@ $messages = array(
 'create-this-page' => 'Направи ову страницу',
 'delete' => 'Обриши',
 'deletethispage' => 'Обриши ову страницу',
+'undeletethispage' => 'Поврати ову страницу',
 'undelete_short' => 'Врати {{PLURAL:$1|једну обрисану измену|$1 обрисане измене|$1 обрисаних измена}}',
 'viewdeleted_short' => 'Погледај {{PLURAL:$1|обрисану измену|$1 обрисане измене|$1 обрисаних измена}}',
 'protect' => 'Заштити',
@@ -630,7 +643,7 @@ $1',
 'pool-queuefull' => 'Ред је пун захтева',
 'pool-errorunknown' => 'Непозната грешка',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'О пројекту {{SITENAME}}',
 'aboutpage' => 'Project:О нама',
 'copyright' => 'Садржај је доступан под лиценцом $1.',
@@ -640,7 +653,6 @@ $1',
 'disclaimers' => 'Одрицање одговорности',
 'disclaimerpage' => 'Project:Одрицање одговорности',
 'edithelp' => 'Помоћ при уређивању',
-'edithelppage' => 'Help:Уређивање',
 'helppage' => 'Help:Садржај',
 'mainpage' => 'Главна страна',
 'mainpage-description' => 'Главна страна',
@@ -672,7 +684,6 @@ $1',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|последњу измену|последње измене}}',
 'youhavenewmessagesmulti' => 'Имате нових порука на $1',
 'editsection' => 'уреди',
-'editsection-brackets' => '[$1]',
 'editold' => 'уреди',
 'viewsourceold' => 'изворни код',
 'editlink' => 'уреди',
@@ -724,17 +735,8 @@ $1',
 # General errors
 'error' => 'Грешка',
 'databaseerror' => 'Грешка у бази података',
-'dberrortext' => 'Дошло је до синтактичке грешке у бази.
-Можда се ради о грешци у софтверу.
-Последњи покушај упита је гласио:
-<blockquote><code>$1</code></blockquote>
-унутар функције „<code>$2</code>“.
-База података је пријавила грешку „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Дошло је до синтактичке грешке у бази.
-Последњи покушај упита је гласио:
-„$1“
-унутар функције „$2“.
-База података је пријавила грешку „$3: $4“',
+'databaseerror-function' => 'Функција: $1',
+'databaseerror-error' => 'Грешка: $1',
 'laggedslavemode' => "'''Упозорење:''' страница је можда застарела.",
 'readonly' => 'База података је закључана',
 'enterlockreason' => 'Унесите разлог за закључавање, укључујући и време откључавања',
@@ -790,12 +792,15 @@ $1',
 'editinginterface' => "'''Упозорење:''' уређујете страницу која се користи за приказивање текста корисничког окружења.
 Измене на овој страници ће утицати на све кориснике овог викија.
 Да бисте додали или изменили преводе свих викија, посетите [//translatewiki.net/wiki/Main_Page?setlang=sr_ec Транслејтвики], пројекат за локализацију Медијавикија.",
-'sqlhidden' => '(SQL упит је сакривен)',
 'cascadeprotected' => 'Ова страница је закључана јер садржи {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом“ заштитом:
 $2',
 'namespaceprotected' => "Немате дозволу да уређујете странице у именском простору '''$1'''.",
 'customcssprotected' => 'Немате дозволу да мењате ову CSS страницу јер садржи личне поставке другог корисника.',
 'customjsprotected' => 'Немате дозволу да мењате ову страницу јаваскрипта јер садржи личне поставке другог корисника.',
+'mycustomcssprotected' => 'Немате дозволу за мењање ове CSS странице.',
+'mycustomjsprotected' => 'Немате дозволу за мењање ове JavaScript странице.',
+'myprivateinfoprotected' => 'Немате дозволу за мењање ваших личних информација.',
+'mypreferencesprotected' => 'Немате дозволу за мењање ваших подешавања.',
 'ns-specialprotected' => 'Посебне странице се не могу уређивати.',
 'titleprotected' => "Овај наслов је {{GENDER:$1|заштитио корисник|заштитила корисница|заштитио корисник}} [[User:$1|$1]].
 Наведени разлог: ''$2''.",
@@ -820,10 +825,19 @@ $2',
 'welcomecreation-msg' => 'Ваш налог је отворен.
 Не заборавите да промените своја [[Special:Preferences|подешавања]].',
 'yourname' => 'Корисничко име:',
+'userlogin-yourname' => 'Корисничко име',
+'userlogin-yourname-ph' => 'Унесите ваше корисничко име',
+'createacct-another-username-ph' => 'Унесите корисничко име',
 'yourpassword' => 'Лозинка:',
+'userlogin-yourpassword' => 'Лозинка',
+'userlogin-yourpassword-ph' => 'Унесите вашу лозинку',
+'createacct-yourpassword-ph' => 'Унесите нову лозинку',
 'yourpasswordagain' => 'Потврда лозинке:',
+'createacct-yourpasswordagain' => 'Потврдите лозинку',
+'createacct-yourpasswordagain-ph' => 'Унесите лозинку још једном',
 'remembermypassword' => 'Запамти моју лозинку на овом прегледачу (најдуже $1 {{PLURAL:$1|дан|дана}})',
-'securelogin-stick-https' => 'Останите повезани са HTTPS након пријаве',
+'userlogin-remembermypassword' => 'Остави ме пријављеног/у',
+'userlogin-signwithsecure' => 'Користите сигурну конекцију',
 'yourdomainname' => 'Домен:',
 'password-change-forbidden' => 'Не можете да промените лозинку на овом викију.',
 'externaldberror' => 'Дошло је до грешке при препознавању базе података или немате овлашћења да ажурирате свој спољни налог.',
@@ -835,17 +849,41 @@ $2',
 'logout' => 'Одјава',
 'userlogout' => 'Одјави ме',
 'notloggedin' => 'Нисте пријављени',
+'userlogin-noaccount' => 'Немате налог?',
+'userlogin-joinproject' => 'Отворите га',
 'nologin' => 'Немате налог? Идите на страницу $1.',
 'nologinlink' => 'Отварање налога',
 'createaccount' => 'Отвори налог',
 'gotaccount' => 'Већ имате налог? Идите на страницу „$1“.',
 'gotaccountlink' => 'Пријава',
 'userlogin-resetlink' => 'Заборавили сте податке за пријаву?',
+'userlogin-resetpassword-link' => 'Ресетујте лозинку',
+'helplogin-url' => 'Help:Logging in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помоћ при пријављивању]]',
+'userlogin-createanother' => 'Отвори још један налог',
+'createacct-join' => 'Унесите своје податке испод',
+'createacct-another-join' => 'Унесите податке за нови налог испод.',
+'createacct-emailrequired' => 'Адреса е-поште',
+'createacct-emailoptional' => 'Адреса е-поште (опционо)',
+'createacct-email-ph' => 'Унесите вашу адресу е-поште',
+'createacct-another-email-ph' => 'Унесите адресу е-поште',
 'createaccountmail' => 'Користите привремену, случајно створену лозинку и пошаљите на наведену адресу електронске поште',
+'createacct-realname' => 'Право име (опционо)',
 'createaccountreason' => 'Разлог:',
+'createacct-reason' => 'Разлог',
+'createacct-reason-ph' => 'Зашто правите још један налог?',
+'createacct-captcha' => 'Сигурносна провера',
+'createacct-imgcaptcha-ph' => 'Унесите текст који видите изнад',
+'createacct-submit' => 'Отвори налог',
+'createacct-another-submit' => 'Отвори још један налог',
+'createacct-benefit-heading' => '{{SITENAME}} је направљен од стране људи као што сте ви.',
+'createacct-benefit-body1' => '{{PLURAL:$1|измена}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|страница}}',
+'createacct-benefit-body3' => 'скорашњих {{PLURAL:$1|доприноса}}',
 'badretype' => 'Унете лозинке се не поклапају.',
 'userexists' => 'Корисничко име је заузето. Изаберите друго.',
 'loginerror' => 'Грешка при пријављивању',
+'createacct-error' => 'Дошло је до грешке при креирању налога',
 'createaccounterror' => 'Не могу да отворим налог: $1',
 'nocookiesnew' => 'Кориснички налог је отворен, али нисте пријављени.
 Овај вики користи колачиће за пријаву. Вама су колачићи онемогућени.
@@ -908,10 +946,12 @@ $2',
 Ако је ово грешка, занемарите ову поруку.',
 'usernamehasherror' => 'Корисничко име не може садржати тарабе',
 'login-throttled' => 'Превише пута сте покушали да се пријавите.
-Сачекајте неколико минута и покушајте поново.',
+Молимо вас да сачекате $1 пре него што покушате поново.',
 'login-abort-generic' => 'Неуспешна пријава – прекинуто',
 'loginlanguagelabel' => 'Језик: $1',
 'suspicious-userlogout' => 'Ваш захтев за одјаву је одбијен јер је послат од стране неисправног прегледача или посредника.',
+'createacct-another-realname-tip' => 'Право име није обавезно.
+Ако изаберете да га унесете, оно ће бити коришћено за приписивање вашег рада.',
 
 # Email sending
 'php-mail-error-unknown' => 'Непозната грешка у функцији PHP mail().',
@@ -928,8 +968,7 @@ $2',
 'newpassword' => 'Нова лозинка:',
 'retypenew' => 'Потврда лозинке:',
 'resetpass_submit' => 'Постави лозинку и пријави ме',
-'resetpass_success' => 'Ваша лозинка је успешно промењена!
-Пријављујем вас...',
+'changepassword-success' => 'Ваша лозинка је успешно промењена!',
 'resetpass_forbidden' => 'Лозинка не може бити промењена',
 'resetpass-no-info' => 'Морате бити пријављени да бисте приступили овој страници.',
 'resetpass-submit-loggedin' => 'Промени лозинку',
@@ -941,10 +980,10 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Обнављање лозинке',
-'passwordreset-text' => 'Попуните овај образац да бисте ресетовали лозинку.',
+'passwordreset-text-one' => 'Попуните овај образац да бисте ресетовали лозинку.',
 'passwordreset-legend' => 'Поништи лозинку',
 'passwordreset-disabled' => 'Обнављање лозинке је онемогућено на овом викију.',
-'passwordreset-pretext' => '{{PLURAL:$1||Унесите један од делова података испод}}',
+'passwordreset-emaildisabled' => 'Е-пошта је онемогућена на овом викију.',
 'passwordreset-username' => 'Корисничко име:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Погледати крајњу поруку?',
@@ -969,7 +1008,7 @@ $2
 Привремена лозинка: $2',
 'passwordreset-emailsent' => 'Подсетник о лозинци је послат на вашу адресу.',
 'passwordreset-emailsent-capture' => 'Послат је подсетник преко е-поште (приказан доле).',
-'passwordreset-emailerror-capture' => 'Направљен је подсетник за слање преко е-поште (приказан доле), али га не могу послати кориснику: $1',
+'passwordreset-emailerror-capture' => 'Е-порука за ресетовање лозинке, приказана испод је послата, али слање {{GENDER:$2|кориснику|корисници}} није успело: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Промена е-адресе',
@@ -1187,12 +1226,15 @@ $2
 Изгледа да је обрисана.',
 'edit-conflict' => 'Сукоб измена.',
 'edit-no-change' => 'Ваша измена је занемарена јер није било никаквих измена у тексту.',
+'postedit-confirmation' => 'Ваша измена је сачувана.',
 'edit-already-exists' => 'Не могу да направим страницу.
 Изгледа да она већ постоји.',
 'defaultmessagetext' => 'Подразумевани текст поруке',
 'content-failed-to-parse' => 'Не могу да рашчланим садржај типа $2 за модел $1: $3',
 'invalid-content-data' => 'Неисправни подаци садржаја',
 'content-not-allowed-here' => 'Садржај модела „$1“ није дозвољен на страници [[$2]]',
+'editwarning-warning' => 'Ако напустите ову страницу, изгубићете све измене које сте направили.
+Ако сте пријављени, можете онемогућити ово упозорење у својим подешавањима, у одељку „Уређивање“.',
 
 # Content models
 'content-model-wikitext' => 'викитекст',
@@ -1228,6 +1270,7 @@ $2
 'undo-failure' => 'Не могу да вратим измену због постојања сукобљених међуизмена.',
 'undo-norev' => 'Не могу да вратим измену јер не постоји или је обрисана.',
 'undo-summary' => 'Поништена измена $1  {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])',
+'undo-summary-username-hidden' => 'Поништи измену $1 скривеног корисника',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Не могу да отворим налог',
@@ -1409,6 +1452,7 @@ $1",
 'compareselectedversions' => 'Упореди изабране измене',
 'showhideselectedversions' => 'Прикажи/сакриј изабране измене',
 'editundo' => 'поништи',
+'diff-empty' => '(Нема разлике)',
 'diff-multi' => '({{PLURAL:$1|није приказана међуизмена|нису приказане $1 међуизмене|није приказано $1 међуизмена}} {{PLURAL:$2|једног|$2|$2}} корисника)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Није приказана међуизмена|Нису приказане $1 међуизмене|Није приказано $1 међуизмена}} од више од $2 корисника)',
 'difference-missing-revision' => 'Не могу да пронађем {{PLURAL:$2|једну измену|$2 измене|$2 измена}} од ове разлике ($1).
@@ -1436,7 +1480,6 @@ $1",
 'searchmenu-legend' => 'Поставке претраге',
 'searchmenu-exists' => "'''Постоји и чланак под називом „[[:$1]]“.'''",
 'searchmenu-new' => "'''Направите страницу „[[:$1]]“.'''",
-'searchhelp-url' => 'Help:Садржај',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Прегледај странице с овим префиксом]]',
 'searchprofile-articles' => 'Чланци',
 'searchprofile-project' => 'Странице помоћи и пројеката',
@@ -1481,15 +1524,6 @@ $1",
 У међувремену можете тражити преко Гугла.
 Упамтите да његови пописи овог викија могу бити застарели.',
 
-# Quickbar
-'qbsettings' => 'Бочна палета',
-'qbsettings-none' => 'Ништа',
-'qbsettings-fixedleft' => 'Причвршћена лево',
-'qbsettings-fixedright' => 'Причвршћена десно',
-'qbsettings-floatingleft' => 'Плутајућа лево',
-'qbsettings-floatingright' => 'Плутајућа десно',
-'qbsettings-directionality' => 'Фиксно, у зависности од смера писања вашег језика',
-
 # Preferences page
 'preferences' => 'Подешавања',
 'mypreferences' => 'Подешавања',
@@ -1522,7 +1556,6 @@ $1",
 'resetprefs' => 'Очисти несачуване измене',
 'restoreprefs' => 'Врати све на подразумевано (у свим одељцима)',
 'prefs-editing' => 'Уређивање',
-'prefs-edit-boxsize' => 'Величина оквира за уређивање.',
 'rows' => 'Редова:',
 'columns' => 'Колоне:',
 'searchresultshead' => 'Претрага',
@@ -1533,9 +1566,6 @@ $1",
 'recentchangesdays-max' => '(највише $1 {{PLURAL:$1|дан|дана|дана}})',
 'recentchangescount' => 'Број измена за приказ:',
 'prefs-help-recentchangescount' => 'Подразумева скорашње измене, историје страница и дневнике.',
-'prefs-help-watchlist-token' => 'Попуњавањем овог поља с тајном шифром направиће RSS довод вашег списка надгледања.
-Свако ко зна ту шифру биће у могућности да види ваша надгледања, зато изаберите безбедну.
-На пример: $1',
 'savedprefs' => 'Ваша подешавања су сачувана.',
 'timezonelegend' => 'Временска зона:',
 'localtime' => 'Локално време:',
@@ -1566,7 +1596,6 @@ $1",
 'prefs-reset-intro' => 'Можете користити ову страницу да поништите своје поставке на подразумеване вредности.
 Ова радња се не може вратити.',
 'prefs-emailconfirm-label' => 'Потврда е-адресе:',
-'prefs-textboxsize' => 'Величина оквира за уређивање',
 'youremail' => 'Е-адреса:',
 'username' => '{{GENDER:$1|Корисничко име}}:',
 'uid' => '{{GENDER:$1|Кориснички}} ID:',
@@ -1602,6 +1631,8 @@ $1",
 'prefs-dateformat' => 'Формат датума',
 'prefs-timeoffset' => 'Временска разлика',
 'prefs-advancedediting' => 'Главна подешавања',
+'prefs-editor' => 'Уређивач',
+'prefs-preview' => 'Претпреглед',
 'prefs-advancedrc' => 'Напредне поставке',
 'prefs-advancedrendering' => 'Напредне поставке',
 'prefs-advancedsearchoptions' => 'Напредне поставке',
@@ -1610,6 +1641,7 @@ $1",
 'prefs-displaysearchoptions' => 'Поставке приказа',
 'prefs-displaywatchlist' => 'Поставке приказа',
 'prefs-diffs' => 'Разлике',
+'prefs-help-prefershttps' => 'Ова подешавања ће ступити на снагу при следећој пријави.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Е-адреса је исправна',
@@ -1702,11 +1734,15 @@ $1",
 'right-proxyunbannable' => 'заобилажење самоблокирања посредника',
 'right-unblockself' => 'Одблокирај самог себе',
 'right-protect' => 'Промени нивое заштите и уреди каскадно заштићене странице',
-'right-editprotected' => 'уређивање заштићених страница (с преносивом заштитом)',
+'right-editprotected' => 'Уреди странице под заштитом „{{int:protect-level-sysop}}“',
+'right-editsemiprotected' => 'Уреди странице под заштитом „{{int:protect-level-autoconfirmed}}“',
 'right-editinterface' => 'уређивање корисничког окружења',
 'right-editusercssjs' => 'уређивање туђих CSS и јаваскрипт датотека',
 'right-editusercss' => 'уређивање туђих CSS датотека',
 'right-edituserjs' => 'уређивање туђих јаваскрипт датотека',
+'right-viewmyprivateinfo' => 'Видите своје личне податке (нпр. адресу е-поште, право име)',
+'right-editmyprivateinfo' => 'Уреди своје личне податке (нпр. адресу е-поште, право име)',
+'right-editmyoptions' => 'Уредите своја подешавања',
 'right-rollback' => 'брзо враћање измена последњег корисника који је мењао одређену страницу',
 'right-markbotedits' => 'означавање враћених измена као измене бота',
 'right-noratelimit' => 'отпорност на ограничења',
@@ -1768,9 +1804,12 @@ $1",
 'action-userrights-interwiki' => 'уређивање корисничких права на другим викијима',
 'action-siteadmin' => 'закључавање или откључавање базе података',
 'action-sendemail' => 'слање е-порука',
+'action-editmywatchlist' => 'измени свој списак надгледања',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|измена|измене|измена}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|измена од ваше последње посете}}',
+'enhancedrc-history' => 'историја',
 'recentchanges' => 'Скорашње измене',
 'recentchanges-legend' => 'Поставке скорашњих измена',
 'recentchanges-summary' => 'Пратите скорашње измене на овој страници.',
@@ -1812,7 +1851,6 @@ $1",
 'recentchangeslinked-feed' => 'Сродне измене',
 'recentchangeslinked-toolbox' => 'Сродне измене',
 'recentchangeslinked-title' => 'Сродне измене са „$1“',
-'recentchangeslinked-noresult' => 'Нема измена на повезаним страницама у заданом периоду.',
 'recentchangeslinked-summary' => "Ова посебна страница приказује списак последњих измена на страницама које су повезане (или чланови одређене категорије).
 Странице с [[Special:Watchlist|вашег списка надгледања]] су '''подебљане'''.",
 'recentchangeslinked-page' => 'Назив странице:',
@@ -1824,7 +1862,7 @@ $1",
 'reuploaddesc' => 'Назад на образац за отпремање',
 'upload-tryagain' => 'Пошаљи измењени опис датотеке',
 'uploadnologin' => 'Нисте пријављени',
-'uploadnologintext' => 'Морате бити [[Special:UserLogin|пријављени]] да бисте отпремали датотеке.',
+'uploadnologintext' => 'Морате бити $1 да бисте отпремали датотеке.',
 'upload_directory_missing' => 'Фасцикла за слање ($1) недостаје и сервер је не може направити.',
 'upload_directory_read_only' => 'Сервер не може да пише по фасцикли за слање ($1).',
 'uploaderror' => 'Грешка при отпремању',
@@ -2062,7 +2100,6 @@ $1',
 'http-read-error' => 'HTTP грешка при читању.',
 'http-timed-out' => 'Захтев HTTP је истекао.',
 'http-curl-error' => 'Грешка при отварању адресе: $1',
-'http-host-unreachable' => 'Не могу да приступим адреси.',
 'http-bad-status' => 'Дошло је до проблема током захтева HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2093,6 +2130,9 @@ $1',
 'listfiles_size' => 'Величина',
 'listfiles_description' => 'Опис',
 'listfiles_count' => 'Верзије',
+'listfiles-latestversion' => 'Тренутна верзија',
+'listfiles-latestversion-yes' => 'Да',
+'listfiles-latestversion-no' => 'Не',
 
 # File description page
 'file-anchor-link' => 'Датотека',
@@ -2191,6 +2231,10 @@ $1',
 'randompage' => 'Случајна страница',
 'randompage-nopages' => 'Нема страница у {{PLURAL:$2|следећем именском простору|следећим именским просторима}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Случајна страница у категорији',
+'randomincategory-selectcategory-submit' => 'Иди',
+
 # Random redirect
 'randomredirect' => 'Случајно преусмерење',
 'randomredirect-nopages' => 'Нема преусмерења у именском простору „$1”.',
@@ -2216,12 +2260,6 @@ $1',
 'statistics-users-active-desc' => 'Корисници који су извршили бар једну радњу {{PLURAL:$1|претходни дан|у последња $1 дана|у последњих $1 дана}}',
 'statistics-mostpopular' => 'Најпосећеније странице',
 
-'disambiguations' => 'Странице до вишезначних одредница',
-'disambiguationspage' => 'Template:Вишезначна одредница',
-'disambiguations-text' => "Следеће странице садрже бар једну везу до '''вишезначне одреднице'''.
-Уместо тога, ваљало би да воде до одговарајуће теме.
-Страница се сматра вишезначном одредницом ако користи шаблон који води од [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Стране с особином стране',
 'pageswithprop-legend' => 'Стране с особином стране',
 'pageswithprop-text' => 'Ова страна излистава стране које имају одређену особину',
@@ -2481,10 +2519,9 @@ $1',
 'unwatchthispage' => 'Прекини надгледање',
 'notanarticle' => 'Није страница са садржајем',
 'notvisiblerev' => 'Измена је обрисана',
-'watchnochange' => 'Ништа што надгледате није промењено у приказаном времену.',
 'watchlist-details' => '{{PLURAL:$1|$1 страница|$1 странице|$1 страница}} на вашем списку надгледања, не рачунајући странице за разговор.',
-'wlheader-enotif' => '* Е-обавештење је омогућено.',
-'wlheader-showupdated' => "* Странице које су измењене откад сте их последњи пут посетили су '''подебљане'''",
+'wlheader-enotif' => 'Обавештење е-поруком је омогућено.',
+'wlheader-showupdated' => "Странице које су измењене откад сте их последњи пут посетили су '''подебљане'''.",
 'watchmethod-recent' => 'проверава се да ли има надгледаних страница у скорашњим изменама',
 'watchmethod-list' => 'проверава се да ли има скорашњих измена у надгледаним страницама',
 'watchlistcontains' => 'Ваш списак надгледања садржи $1 {{PLURAL:$1|страницу|странице|страница}}.',
@@ -2739,7 +2776,7 @@ $1',
 'contributions' => '{{GENDER:$1|Кориснички}} доприноси',
 'contributions-title' => 'Доприноси {{GENDER:$1|корисника|кориснице|корисника}} $1',
 'mycontris' => 'Доприноси',
-'contribsub2' => 'За $1 ($2)',
+'contribsub2' => 'За {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Измене које одговарају овим условима нису пронађене.',
 'uctop' => '(последња)',
 'month' => 'од месеца (и раније):',
@@ -2897,12 +2934,9 @@ $1',
 Она је блокирана као део блокаде $2, која може бити деблокирана.',
 'ip_range_invalid' => 'Неисправан распод ИП адреса.',
 'ip_range_toolarge' => 'Опсежна блокирања већа од /$1 нису дозвољена.',
-'blockme' => 'Блокирај ме',
 'proxyblocker' => 'Блокер посредника',
-'proxyblocker-disabled' => 'Ова функција је онемогућена.',
 'proxyblockreason' => 'Ваша ИП адреса је блокирана јер представља отворени посредник.
 Обратите се вашем добављачу интернет услуга или техничку подршку и обавестите их о овом озбиљном безбедносном проблему.',
-'proxyblocksuccess' => 'Урађено.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Ваша ИП адреса је наведена као отворени посредник у DNSBL-у који користи {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Ваша ИП адреса је наведена као отворени посредник у DNSBL-у који користи {{SITENAME}}.
@@ -3226,17 +3260,11 @@ $1',
 
 # Stylesheets
 'common.css' => '/** CSS постављен овде ће се одразити на све теме */',
-'standard.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Стандардно“ */',
-'nostalgia.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Носталгија“ */',
 'cologneblue.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Келнско плава“ */',
 'monobook.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Монобук“ */',
-'myskin.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Моја тема“ */',
-'chick.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Шик“ */',
-'simple.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Просто“ */',
 'modern.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Савремено“ */',
 'vector.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Векторско“ */',
 'print.css' => '/* CSS постављен овде ће утицати на издање за штампу */',
-'handheld.css' => '/* CSS постављен овде ће утицати на ручне уређаје с темом прилагођеном у $wgHandheldStyle */',
 'noscript.css' => '/* CSS постављен овде ће утицати на све кориснике којима је онемогућен јаваскрипт */',
 'group-autoconfirmed.css' => '/* CSS постављен овде ће утицати на самопотврђене кориснике */',
 'group-bot.css' => '/* CSS постављен овде ће утицати само на ботове */',
@@ -3245,13 +3273,8 @@ $1',
 
 # Scripts
 'common.js' => '/* Јаваскрипт постављен овде ће се користити за све кориснике при отварању сваке странице. */',
-'standard.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Стандардно“ */',
-'nostalgia.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Носталгија“ */',
 'cologneblue.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Келнско плава“ */',
 'monobook.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Монобук“ */',
-'myskin.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе „Моју тему“ */',
-'chick.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Шик“ */',
-'simple.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Просто“ */',
 'modern.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Савремено“ */',
 'vector.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Векторско“ */',
 'group-autoconfirmed.js' => '/* Јаваскрипт постављен овде ће се учитати за самопотврђене кориснике */',
@@ -3331,13 +3354,8 @@ $1',
 'pageinfo-category-files' => 'Број датотека',
 
 # Skin names
-'skinname-standard' => 'Класично',
-'skinname-nostalgia' => 'Носталгија',
 'skinname-cologneblue' => 'Келнско плава',
 'skinname-monobook' => 'Монобук',
-'skinname-myskin' => 'Моја тема',
-'skinname-chick' => 'Шик',
-'skinname-simple' => 'Просто',
 'skinname-modern' => 'Савремено',
 'skinname-vector' => 'Векторско',
 
@@ -3422,11 +3440,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 минут|$1 минута|$1 минута}}',
 'hours' => '{{PLURAL:$1|$1 сат|$1 сата|$1 сати}}',
 'days' => '{{PLURAL:$1|$1 дан|$1 дана|$1 дана}}',
+'weeks' => '{{PLURAL:$1|$1 седмица}}',
 'months' => '{{PLURAL:$1|$1 месец|$1 месеци}}',
 'years' => '{{PLURAL:$1|$1 година|$1 године}}',
 'ago' => 'пре $1',
 'just-now' => 'управо сад',
 
+# Human-readable timestamps
+'hours-ago' => 'Пре $1 {{PLURAL:$1|сат|сати}}',
+'minutes-ago' => 'Пре $1 {{PLURAL:$1|минут|минута}}',
+'seconds-ago' => 'Пре $1 {{PLURAL:$1|секунда|секунди}}',
+'monday-at' => 'Понедељак у $1',
+'tuesday-at' => 'Уторак у $1',
+'wednesday-at' => 'Среда у $1',
+'thursday-at' => 'Четвртак у $1',
+'friday-at' => 'Петак у $1',
+'saturday-at' => 'Субота у $1',
+'sunday-at' => 'Недеља у $1',
+'yesterday-at' => 'Јуче у $1',
+
 # Bad image list
 'bad_image_list' => 'Формат је следећи:
 
@@ -3510,7 +3542,7 @@ Variants for Chinese language
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Висина',
 'exif-bitspersample' => 'Дубина боје',
@@ -3703,7 +3735,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Несажето',
 'exif-compression-2' => 'CCITT Group 3 1 – Димензионално измењено Хафманово кодирање по дужини',
 'exif-compression-3' => 'CCITT Group 3 факс кодирање',
@@ -4043,7 +4075,6 @@ $5
 'semicolon-separator' => ';&#32;',
 'comma-separator' => ',&#32;',
 'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
 'pipe-separator' => '&#32;•&#32;',
 'word-separator' => '&#32;',
 'ellipsis' => '…',
@@ -4197,7 +4228,6 @@ $5
 'version-other' => 'Друго',
 'version-mediahandlers' => 'Руководиоци медијима',
 'version-hooks' => 'Куке',
-'version-extension-functions' => 'Функције',
 'version-parser-extensiontags' => 'Ознаке',
 'version-parser-function-hooks' => 'Куке',
 'version-hook-name' => 'Назив куке',
@@ -4207,6 +4237,7 @@ $5
 'version-license' => 'Лиценца',
 'version-poweredby-credits' => "Овај вики покреће '''[//www.mediawiki.org/ Медијавики]''', ауторска права © 2001-$1 $2.",
 'version-poweredby-others' => 'остали',
+'version-poweredby-translators' => 'translatewiki.net преводиоци',
 'version-credits-summary' => 'Желели бисмо да захвалимо следећим људима на њиховом доприносу [[Special:Version|Медијавикији]].',
 'version-license-info' => 'Медијавики је слободан софтвер можете га редистрибуирати и/или модификовати под условима ГНУ-ове опште јавне лиценце верзија 2 или сваке следеће коју објави Задужбина за слободан софтвер.
 
@@ -4220,12 +4251,12 @@ $5
 'version-entrypoints-header-entrypoint' => 'Улазна тачка',
 'version-entrypoints-header-url' => 'Адреса',
 
-# Special:FilePath
-'filepath' => 'Путања датотеке',
-'filepath-page' => 'Датотека:',
-'filepath-submit' => 'Иди',
-'filepath-summary' => 'Ова посебна страница приказује потпуну путању датотеке.
-Слике су приказане у пуној величини, а друге врсте датотека се покрећу помоћу њима придруженим програмима.',
+# Special:Redirect
+'redirect-legend' => 'Преусмери на датотеку или страницу',
+'redirect-submit' => 'Иди',
+'redirect-value' => 'Вредност:',
+'redirect-file' => 'Назив датотеке',
+'redirect-not-exists' => 'Вредност није пронађена',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Претрага дупликата',
@@ -4275,6 +4306,7 @@ $5
 'tags' => 'Важеће ознаке измена',
 'tag-filter' => 'Филтер за [[Special:Tags|ознаке]]:',
 'tag-filter-submit' => 'Филтрирај',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Ознака|Ознаке}}]]: $2)',
 'tags-title' => 'Ознаке',
 'tags-intro' => 'На овој страници је наведен списак ознака с којима програм може да означи измене и његово значење.',
 'tags-tag' => 'Назив ознаке',
@@ -4316,6 +4348,9 @@ $5
 'htmlform-submit' => 'Пошаљи',
 'htmlform-reset' => 'Врати измене',
 'htmlform-selectorother-other' => 'Друго',
+'htmlform-no' => 'Не',
+'htmlform-yes' => 'Да',
+'htmlform-chosen-placeholder' => 'Изаберите опцију',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 с подршком претраге целог текста',
@@ -4433,4 +4468,9 @@ $5
 # Image rotation
 'rotate-comment' => 'Слика је ротирана у смеру казаљке на сату за {{PLURAL:$1|степени}}',
 
+# Limit report
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунда|секунди}}',
+'limitreport-postexpandincludesize-value' => '$1/$2 бајтова',
+'limitreport-templateargumentsize-value' => '$1/$2 бајтова',
+
 );
diff --git a/languages/messages/MessagesSr_el.php b/languages/messages/MessagesSr_el.php
index 4d423832..55ce97bd 100644
--- a/languages/messages/MessagesSr_el.php
+++ b/languages/messages/MessagesSr_el.php
@@ -18,6 +18,7 @@
  * @author Red Baron
  * @author Reedy
  * @author Slaven Kosanovic
+ * @author TheStefan12345
  * @author Жељко Тодоровић
  * @author Михајло Анђелковић
  * @author לערי ריינהארט
@@ -334,9 +335,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži broj korisnika koji nadgledaju',
 'tog-oldsig' => 'Tekući potpis:',
 'tog-fancysig' => 'Smatraj potpis kao vikitekst (bez samopovezivanja)',
-'tog-externaleditor' => 'Uvek koristi spoljni uređivač (samo za napredne — potrebne su posebne postavke na računaru)',
-'tog-externaldiff' => 'Uvek koristi spoljni program za upoređivanje (samo za napredne — potrebne su posebne postavke na računaru)',
-'tog-showjumplinks' => 'Omogući pomoćne veze „Idi na“',
 'tog-uselivepreview' => 'Koristi trenutan pregled (eksperimentalno)',
 'tog-forceeditsummary' => 'Upozori me kada ne unesem opis izmene',
 'tog-watchlisthideown' => 'Sakrij moje izmene sa spiska nadgledanja',
@@ -350,6 +348,7 @@ $messages = array(
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
 'tog-noconvertlink' => 'Onemogući pretvaranje naslova veza',
 'tog-norollbackdiff' => 'Izostavi razliku nakon izvršenog vraćanja',
+'tog-useeditwarning' => 'Upozori me kada napuštam stranicu sa nesačuvanim promenama',
 
 'underline-always' => 'uvek podvlači',
 'underline-never' => 'nikad ne podvlači',
@@ -413,6 +412,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. mart',
+'april-date' => '$1. april',
+'may-date' => '$1. maj',
+'june-date' => '$1. jun',
+'july-date' => '$1. jul',
+'august-date' => '$1. august',
+'september-date' => '$1. septembar',
+'october-date' => '$1. oktobar',
+'november-date' => '$1. novembar',
+'december-date' => '$1. decembar',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorije}}',
@@ -433,7 +444,7 @@ $messages = array(
 'noindex-category' => 'Nepopisane stranice',
 'broken-file-category' => 'Stranice s neispravnim vezama do datoteka',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'O nama',
 'article' => 'Stranica sa sadržajem',
@@ -538,7 +549,7 @@ $1',
 'pool-queuefull' => 'Red je pun zahteva',
 'pool-errorunknown' => 'Nepoznata greška',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'O projektu {{SITENAME}}',
 'aboutpage' => 'Project:O nama',
 'copyright' => 'Sadržaj je dostupan pod licencom $1.',
@@ -548,7 +559,6 @@ $1',
 'disclaimers' => 'Odricanje odgovornosti',
 'disclaimerpage' => 'Project:Odricanje odgovornosti',
 'edithelp' => 'Pomoć pri uređivanju',
-'edithelppage' => 'Help:Uređivanje',
 'helppage' => 'Help:Sadržaj',
 'mainpage' => 'Glavna strana',
 'mainpage-description' => 'Glavna strana',
@@ -580,7 +590,6 @@ Pogledajte stranicu za [[Special:Version|izdanje]].',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|poslednju izmenu|poslednje izmene}}',
 'youhavenewmessagesmulti' => 'Imate novih poruka na $1',
 'editsection' => 'uredi',
-'editsection-brackets' => '[$1]',
 'editold' => 'uredi',
 'viewsourceold' => 'izvornik',
 'editlink' => 'uredi',
@@ -632,17 +641,6 @@ Spisak svih posebnih stranica nalazi se [[Special:SpecialPages|ovde]].',
 # General errors
 'error' => 'Greška',
 'databaseerror' => 'Greška u bazi podataka',
-'dberrortext' => 'Došlo je do sintaktičke greške u bazi.
-Možda se radi o grešci u softveru.
-Poslednji pokušaj upita je glasio:
-<blockquote><code>$1</code></blockquote>
-unutar funkcije „<code>$2</code>“.
-Baza podataka je prijavila grešku „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Došlo je do sintaktičke greške u bazi.
-Poslednji pokušaj upita je glasio:
-„$1“
-unutar funkcije „$2“.
-Baza podataka je prijavila grešku „$3: $4“',
 'laggedslavemode' => "'''Upozorenje:''' stranica je možda zastarela.",
 'readonly' => 'Baza podataka je zaključana',
 'enterlockreason' => 'Unesite razlog za zaključavanje, uključujući i vreme otključavanja',
@@ -698,7 +696,6 @@ Da biste dodali ili izmenili prevode svih vikija, posetite [//translatewiki.net/
 'editinginterface' => "'''Upozorenje:''' uređujete stranicu koja se koristi za prikazivanje teksta korisničkog okruženja.
 Izmene na ovoj stranici će uticati na sve korisnike ovog vikija.
 Da biste dodali ili izmenili prevode svih vikija, posetite [//translatewiki.net/wiki/Main_Page?setlang=sr_ec Translejtviki], projekat za lokalizaciju Medijavikija.",
-'sqlhidden' => '(SQL upit je sakriven)',
 'cascadeprotected' => 'Ova stranica je zaključana jer sadrži {{PLURAL:$1|sledeću stranicu koja je zaštićena|sledeće stranice koje su zaštićene}} „prenosivom“ zaštitom:
 $2',
 'namespaceprotected' => "Nemate dozvolu da uređujete stranice u imenskom prostoru '''$1'''.",
@@ -726,10 +723,18 @@ Administrator koji ju je zaključao ponudio je sledeće objašnjenje: „$3“.'
 Imajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste još prijavljeni, sve dok ne očistite privremenu memoriju svog pregledača.",
 'welcomeuser' => 'Dobrodošli, $1!',
 'yourname' => 'Korisničko ime:',
+'userlogin-yourname' => 'Korisničko ime',
+'userlogin-yourname-ph' => 'Unesite vaše korisničko ime',
 'yourpassword' => 'Lozinka:',
+'userlogin-yourpassword' => 'Lozinka',
+'userlogin-yourpassword-ph' => 'Unesite vašu lozinku',
+'createacct-yourpassword-ph' => 'Unesite novu lozinku',
 'yourpasswordagain' => 'Potvrda lozinke:',
+'createacct-yourpasswordagain' => 'Potvrdite lozinku',
+'createacct-yourpasswordagain-ph' => 'Unesite lozinku još jednom',
 'remembermypassword' => 'Zapamti me na ovom pregledaču (najduže $1 {{PLURAL:$1|dan|dana|dana}})',
-'securelogin-stick-https' => 'Ostanite povezani sa HTTPS nakon prijave',
+'userlogin-remembermypassword' => 'Ostavi me prijavljenog/u',
+'userlogin-signwithsecure' => 'Koristite sigurnu konekciju',
 'yourdomainname' => 'Domen:',
 'password-change-forbidden' => 'Ne možete da promenite lozinku na ovom vikiju.',
 'externaldberror' => 'Došlo je do greške pri prepoznavanju baze podataka ili nemate ovlašćenja da ažurirate svoj spoljni nalog.',
@@ -741,17 +746,35 @@ Imajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste još pr
 'logout' => 'Odjava',
 'userlogout' => 'Odjavi me',
 'notloggedin' => 'Niste prijavljeni',
+'userlogin-noaccount' => 'Nemate nalog?',
+'userlogin-joinproject' => 'Otvorite ga',
 'nologin' => 'Nemate nalog? Idite na stranicu $1.',
 'nologinlink' => 'Otvaranje naloga',
 'createaccount' => 'Otvori nalog',
 'gotaccount' => 'Već imate nalog? Idite na stranicu „$1“.',
 'gotaccountlink' => 'Prijava',
 'userlogin-resetlink' => 'Zaboravili ste podatke za prijavu?',
+'userlogin-resetpassword-link' => 'Resetuj lozinku',
+'helplogin-url' => 'Help:Logging in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavljivanju]]',
+'createacct-join' => 'Unesite svoje podatke ispod.',
+'createacct-emailrequired' => 'Adresa e-pošte',
+'createacct-emailoptional' => 'Adresa e-pošte (opciono)',
+'createacct-email-ph' => 'Unesite vašu adresu e-pоšte',
 'createaccountmail' => 'Koristite privremenu, slučajno stvorenu lozinku i pošaljite na navedenu adresu elektronske pošte',
+'createacct-realname' => 'Pravo ime (opciono)',
 'createaccountreason' => 'Razlog:',
+'createacct-reason' => 'Razlog',
+'createacct-reason-ph' => 'Zašto pravite još jedan nalog?',
+'createacct-captcha' => 'Sigurnosna provera',
+'createacct-imgcaptcha-ph' => 'Unesite tekst koji vidite iznad',
+'createacct-submit' => 'Otvori nalog',
+'createacct-benefit-heading' => '{{SITENAME}} je napravljen od strane ljudi kao što ste vi.',
+'createacct-benefit-body3' => 'skorašnjih {{PLURAL:$1|doprinosa}}',
 'badretype' => 'Unete lozinke se ne poklapaju.',
 'userexists' => 'Korisničko ime je zauzeto. Izaberite drugo.',
 'loginerror' => 'Greška pri prijavljivanju',
+'createacct-error' => 'Došlo je do greške pri kreiranju naloga',
 'createaccounterror' => 'Ne mogu da otvorim nalog: $1',
 'nocookiesnew' => 'Korisnički nalog je otvoren, ali niste prijavljeni.
 Ovaj viki koristi kolačiće za prijavu. Vama su kolačići onemogućeni.
@@ -813,8 +836,8 @@ Prijavite se i promenite svoju lozinku.
 
 Ako je ovo greška, zanemarite ovu poruku.',
 'usernamehasherror' => 'Korisničko ime ne može sadržati tarabe',
-'login-throttled' => 'Previše puta ste pokušali da se prijavite.
-Sačekajte nekoliko minuta i pokušajte ponovo.',
+'login-throttled' => 'Previše puta ste pokušali da se prijavite. 
+Molimo vas da sačekate $1 pre nego što pokušate ponovo.',
 'login-abort-generic' => 'Neuspešna prijava – prekinuto',
 'loginlanguagelabel' => 'Jezik: $1',
 'suspicious-userlogout' => 'Vaš zahtev za odjavu je odbijen jer je poslat od strane neispravnog pregledača ili posrednika.',
@@ -833,8 +856,7 @@ Da biste završili prijavu, podesite novu lozinku ovde:',
 'newpassword' => 'Nova lozinka:',
 'retypenew' => 'Potvrda lozinke:',
 'resetpass_submit' => 'Postavi lozinku i prijavi me',
-'resetpass_success' => 'Vaša lozinka je promenjena.
-Prijavljivanje je u toku…',
+'changepassword-success' => 'Vaša lozinka je uspešno promenjena.',
 'resetpass_forbidden' => 'Lozinka ne može biti promenjena',
 'resetpass-no-info' => 'Morate biti prijavljeni da biste pristupili ovoj stranici.',
 'resetpass-submit-loggedin' => 'Promeni lozinku',
@@ -845,10 +867,9 @@ Možda ste već promenili lozinku ili ste zatražili novu privremenu lozinku.',
 
 # Special:PasswordReset
 'passwordreset' => 'Obnavljanje lozinke',
-'passwordreset-text' => 'Popunite ovaj obrazac da biste primili e-poruku sa svojim podacima za prijavu.',
+'passwordreset-text-one' => 'Popunite ovaj obrazac da biste resetovali lozinku.',
 'passwordreset-legend' => 'Poništi lozinku',
 'passwordreset-disabled' => 'Obnavljanje lozinke je onemogućeno na ovom vikiju.',
-'passwordreset-pretext' => '{{PLURAL:$1||Unesite jedan od delova podataka ispod}}',
 'passwordreset-username' => 'Korisničko ime:',
 'passwordreset-domain' => 'Domen:',
 'passwordreset-capture' => 'Pogledati krajnju poruku?',
@@ -873,7 +894,7 @@ Prijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili
 Privremena lozinka: $2',
 'passwordreset-emailsent' => 'Podsetnik o lozinci je poslat na vašu adresu.',
 'passwordreset-emailsent-capture' => 'Poslat je podsetnik preko e-pošte (prikazan dole).',
-'passwordreset-emailerror-capture' => 'Napravljen je podsetnik za slanje preko e-pošte (prikazan dole), ali ga ne mogu poslati korisniku: $1',
+'passwordreset-emailerror-capture' => 'E-poruka za resetovanje lozinke, prikazana ispod je poslata, ali slanje {{GENDER:$2|korisniku|korisnici}} nije uspelo: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Promena e-adrese',
@@ -1090,12 +1111,15 @@ Nije dato nikakvo obrazloženje.',
 Izgleda da je obrisana.',
 'edit-conflict' => 'Sukob izmena.',
 'edit-no-change' => 'Vaša izmena je zanemarena jer nije bilo nikakvih izmena u tekstu.',
+'postedit-confirmation' => 'Vaša izmena je sačuvana.',
 'edit-already-exists' => 'Ne mogu da napravim stranicu.
 Izgleda da ona već postoji.',
 'defaultmessagetext' => 'Podrazumevani tekst poruke',
 'content-failed-to-parse' => 'Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3',
 'invalid-content-data' => 'Neispravni podaci sadržaja',
 'content-not-allowed-here' => 'Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]',
+'editwarning-warning' => 'Ako napustite ovu stranicu, izgubićete sve izmene koje ste napravili.
+Ako ste prijavljeni, možete onemogućiti ovo upozorenje u svojim podešavanjima, u odeljku „Uređivanje“.',
 
 # Content models
 'content-model-wikitext' => 'vikitekst',
@@ -1339,7 +1363,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'searchmenu-legend' => 'Postavke pretrage',
 'searchmenu-exists' => "'''Postoji i članak pod nazivom „[[:$1]]“.'''",
 'searchmenu-new' => "'''Napravite stranicu „[[:$1]]“.'''",
-'searchhelp-url' => 'Help:Sadržaj',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Pregledaj stranice s ovim prefiksom]]',
 'searchprofile-articles' => 'Članci',
 'searchprofile-project' => 'Stranice pomoći i projekata',
@@ -1384,15 +1407,6 @@ Ako želite sve da pretražite, dodajte prefiks '''all:''' ispred traženog sadr
 U međuvremenu možete tražiti preko Gugla.
 Upamtite da njegovi popisi ovog vikija mogu biti zastareli.',
 
-# Quickbar
-'qbsettings' => 'Bočna paleta',
-'qbsettings-none' => 'Ništa',
-'qbsettings-fixedleft' => 'Pričvršćena levo',
-'qbsettings-fixedright' => 'Pričvršćena desno',
-'qbsettings-floatingleft' => 'Plutajuća levo',
-'qbsettings-floatingright' => 'Plutajuća desno',
-'qbsettings-directionality' => 'Fiksno, u zavisnosti od smera pisanja vašeg jezika',
-
 # Preferences page
 'preferences' => 'Podešavanja',
 'mypreferences' => 'Podešavanja',
@@ -1425,7 +1439,6 @@ Upamtite da njegovi popisi ovog vikija mogu biti zastareli.',
 'resetprefs' => 'Očisti nesačuvane izmene',
 'restoreprefs' => 'Vrati sve na podrazumevano (u svim odeljcima)',
 'prefs-editing' => 'Uređivanje',
-'prefs-edit-boxsize' => 'Veličina okvira za uređivanje.',
 'rows' => 'Redova:',
 'columns' => 'Kolone:',
 'searchresultshead' => 'Pretraga',
@@ -1436,9 +1449,6 @@ Upamtite da njegovi popisi ovog vikija mogu biti zastareli.',
 'recentchangesdays-max' => '(najviše $1 {{PLURAL:$1|dan|dana|dana}})',
 'recentchangescount' => 'Broj izmena za prikaz:',
 'prefs-help-recentchangescount' => 'Podrazumeva skorašnje izmene, istorije stranica i dnevnike.',
-'prefs-help-watchlist-token' => 'Popunjavanjem ovog polja s tajnom šifrom napraviće RSS dovod vašeg spiska nadgledanja.
-Svako ko zna tu šifru biće u mogućnosti da vidi vaša nadgledanja, zato izaberite bezbednu.
-Na primer: $1',
 'savedprefs' => 'Vaša podešavanja su sačuvana.',
 'timezonelegend' => 'Vremenska zona:',
 'localtime' => 'Lokalno vreme:',
@@ -1469,7 +1479,6 @@ Na primer: $1',
 'prefs-reset-intro' => 'Možete koristiti ovu stranicu da poništite svoje postavke na podrazumevane vrednosti.
 Ova radnja se ne može vratiti.',
 'prefs-emailconfirm-label' => 'Potvrda e-adrese:',
-'prefs-textboxsize' => 'Veličina okvira za uređivanje',
 'youremail' => 'E-adresa:',
 'username' => '{{GENDER:$1|Korisničko ime}}:',
 'uid' => '{{GENDER:$1|Korisnički}} ID:',
@@ -1605,7 +1614,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'right-proxyunbannable' => 'zaobilaženje samoblokiranja posrednika',
 'right-unblockself' => 'Odblokiraj samog sebe',
 'right-protect' => 'Promeni nivoe zaštite i uredi kaskadno zaštićene stranice',
-'right-editprotected' => 'uređivanje zaštićenih stranica (s prenosivom zaštitom)',
+'right-editprotected' => 'Uredi stranice pod zaštitom „{{int:protect-level-sysop}}“',
 'right-editinterface' => 'uređivanje korisničkog sučelja',
 'right-editusercssjs' => 'uređivanje tuđih CSS i javaskript datoteka',
 'right-editusercss' => 'uređivanje tuđih CSS datoteka',
@@ -1715,7 +1724,6 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'recentchangeslinked-feed' => 'Srodne izmene',
 'recentchangeslinked-toolbox' => 'Srodne izmene',
 'recentchangeslinked-title' => 'Srodne izmene sa „$1“',
-'recentchangeslinked-noresult' => 'Nema izmena na povezanim stranicama u zadanom periodu.',
 'recentchangeslinked-summary' => "Ova posebna stranica prikazuje spisak poslednjih izmena na stranicama koje su povezane (ili članovi određene kategorije).
 Stranice s [[Special:Watchlist|vašeg spiska nadgledanja]] su '''podebljane'''.",
 'recentchangeslinked-page' => 'Naziv stranice:',
@@ -1727,7 +1735,7 @@ Stranice s [[Special:Watchlist|vašeg spiska nadgledanja]] su '''podebljane'''."
 'reuploaddesc' => 'Nazad na obrazac za otpremanje',
 'upload-tryagain' => 'Pošalji izmenjeni opis datoteke',
 'uploadnologin' => 'Niste prijavljeni',
-'uploadnologintext' => 'Morate biti [[Special:UserLogin|prijavljeni]] da biste otpremali datoteke.',
+'uploadnologintext' => 'Morate biti $1 da biste otpremali datoteke.',
 'upload_directory_missing' => 'Fascikla za slanje ($1) nedostaje i server je ne može napraviti.',
 'upload_directory_read_only' => 'Server ne može da piše po fascikli za slanje ($1).',
 'uploaderror' => 'Greška pri otpremanju',
@@ -1965,7 +1973,6 @@ Radi sigurnosti, img_auth.php je onemogućen.',
 'http-read-error' => 'HTTP greška pri čitanju.',
 'http-timed-out' => 'Zahtev HTTP je istekao.',
 'http-curl-error' => 'Greška pri otvaranju adrese: $1',
-'http-host-unreachable' => 'Ne mogu da pristupim adresi.',
 'http-bad-status' => 'Došlo je do problema tokom zahteva HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2119,12 +2126,6 @@ Pre brisanja proverite da li druge stranice vode do tih šablona.',
 'statistics-users-active-desc' => 'Korisnici koji su izvršili bar jednu radnju {{PLURAL:$1|prethodni dan|u poslednja $1 dana|u poslednjih $1 dana}}',
 'statistics-mostpopular' => 'Najposećenije stranice',
 
-'disambiguations' => 'Stranice do višeznačnih odrednica',
-'disambiguationspage' => 'Template:Višeznačna odrednica',
-'disambiguations-text' => "Sledeće stranice sadrže bar jednu vezu do '''višeznačne odrednice'''.
-Umesto toga, valjalo bi da vode do odgovarajuće teme.
-Stranica se smatra višeznačnom odrednicom ako koristi šablon koji vodi od [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop-prop' => 'Ime osobine:',
 'pageswithprop-submit' => 'Idi',
 
@@ -2381,10 +2382,9 @@ Buduće izmene ove stranice i njene stranice za razgovor biće navedene tamo.',
 'unwatchthispage' => 'Prekini nadgledanje',
 'notanarticle' => 'Nije stranica sa sadržajem',
 'notvisiblerev' => 'Izmena je obrisana',
-'watchnochange' => 'Ništa što nadgledate nije promenjeno u prikazanom vremenu.',
 'watchlist-details' => '{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} na vašem spisku nadgledanja, ne računajući stranice za razgovor.',
-'wlheader-enotif' => '* E-obaveštenje je omogućeno.',
-'wlheader-showupdated' => "* Stranice koje su izmenjene otkad ste ih poslednji put posetili su '''podebljane'''",
+'wlheader-enotif' => 'Obaveštenje e-porukom je omogućeno.',
+'wlheader-showupdated' => "Stranice koje su izmenjene otkad ste ih poslednji put posetili su '''podebljane'''.",
 'watchmethod-recent' => 'proverava se da li ima nadgledanih stranica u skorašnjim izmenama',
 'watchmethod-list' => 'proverava se da li ima skorašnjih izmena u nadgledanim stranicama',
 'watchlistcontains' => 'Vaš spisak nadgledanja sadrži $1 {{PLURAL:$1|stranicu|stranice|stranica}}.',
@@ -2629,7 +2629,7 @@ $1',
 'contributions' => '{{GENDER:$1|Korisnički}} doprinosi',
 'contributions-title' => 'Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}} $1',
 'mycontris' => 'Doprinosi',
-'contribsub2' => 'Za $1 ($2)',
+'contribsub2' => 'Za {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Izmene koje odgovaraju ovim uslovima nisu pronađene.',
 'uctop' => '(poslednja)',
 'month' => 'od meseca (i ranije):',
@@ -2787,12 +2787,9 @@ Tekuće zabrane i blokiranja možete naći [[Special:BlockList|ovde]].',
 Ona je blokirana kao deo blokade $2, koja može biti deblokirana.',
 'ip_range_invalid' => 'Neispravan raspod IP adresa.',
 'ip_range_toolarge' => 'Opsežna blokiranja veća od /$1 nisu dozvoljena.',
-'blockme' => 'Blokiraj me',
 'proxyblocker' => 'Bloker posrednika',
-'proxyblocker-disabled' => 'Ova funkcija je onemogućena.',
 'proxyblockreason' => 'Vaša IP adresa je blokirana jer predstavlja otvoreni posrednik.
 Obratite se vašem dobavljaču internet usluga ili tehničku podršku i obavestite ih o ovom ozbiljnom bezbednosnom problemu.',
-'proxyblocksuccess' => 'Urađeno.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Vaša IP adresa je navedena kao otvoreni posrednik u DNSBL-u koji koristi {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Vaša IP adresa je navedena kao otvoreni posrednik u DNSBL-u koji koristi {{SITENAME}}.
@@ -3115,17 +3112,11 @@ Pokušajte ponovo.',
 
 # Stylesheets
 'common.css' => '/** CSS postavljen ovde će se odraziti na sve teme */',
-'standard.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Standardno“ */',
-'nostalgia.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Nostalgija“ */',
 'cologneblue.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Kelnsko plava“ */',
 'monobook.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Monobuk“ */',
-'myskin.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Moja tema“ */',
-'chick.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Šik“ */',
-'simple.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Prosto“ */',
 'modern.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Savremeno“ */',
 'vector.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Vektorsko“ */',
 'print.css' => '/* CSS postavljen ovde će uticati na izdanje za štampu */',
-'handheld.css' => '/* CSS postavljen ovde će uticati na ručne uređaje s temom prilagođenom u $wgHandheldStyle */',
 'noscript.css' => '/* CSS postavljen ovde će uticati na sve korisnike kojima je onemogućen javaskript */',
 'group-autoconfirmed.css' => '/* CSS postavljen ovde će uticati na samopotvrđene korisnike */',
 'group-bot.css' => '/* CSS postavljen ovde će uticati samo na botove */',
@@ -3134,13 +3125,8 @@ Pokušajte ponovo.',
 
 # Scripts
 'common.js' => '/* Javaskript postavljen ovde će se koristiti za sve korisnike pri otvaranju svake stranice. */',
-'standard.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Standardno“ */',
-'nostalgia.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Nostalgija“ */',
 'cologneblue.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Kelnsko plava“ */',
 'monobook.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Monobuk“ */',
-'myskin.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste „Moju temu“ */',
-'chick.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Šik“ */',
-'simple.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Prosto“ */',
 'modern.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Savremeno“ */',
 'vector.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Vektorsko“ */',
 'group-autoconfirmed.js' => '/* Javaskript postavljen ovde će se učitati za samopotvrđene korisnike */',
@@ -3219,13 +3205,8 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'pageinfo-category-files' => 'Broj datoteka',
 
 # Skin names
-'skinname-standard' => 'Klasično',
-'skinname-nostalgia' => 'Nostalgija',
 'skinname-cologneblue' => 'Kelnsko plava',
 'skinname-monobook' => 'Monobuk',
-'skinname-myskin' => 'Moja tema',
-'skinname-chick' => 'Šik',
-'skinname-simple' => 'Prosto',
 'skinname-modern' => 'Savremeno',
 'skinname-vector' => 'Vektorsko',
 
@@ -3396,7 +3377,7 @@ Ako je prvobitno stanje datoteke promenjeno, moguće je da neki detalji ne opisu
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Širina',
 'exif-imagelength' => 'Visina',
 'exif-bitspersample' => 'Dubina boje',
@@ -3589,7 +3570,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nesažeto',
 'exif-compression-2' => 'CCITT Group 3 1 – Dimenzionalno izmenjeno Hafmanovo kodiranje po dužini',
 'exif-compression-3' => 'CCITT Group 3 faks kodiranje',
@@ -3928,7 +3909,6 @@ Potvrdite da stvarno želite da napravite stranicu.",
 'semicolon-separator' => ';&#32;',
 'comma-separator' => ',&#32;',
 'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
 'pipe-separator' => '&#32;•&#32;',
 'word-separator' => '&#32;',
 'ellipsis' => '…',
@@ -4082,7 +4062,6 @@ Možete da [[Special:EditWatchlist|koristite i običan uređivač]].',
 'version-other' => 'Drugo',
 'version-mediahandlers' => 'Rukovodioci medijima',
 'version-hooks' => 'Kuke',
-'version-extension-functions' => 'Funkcije',
 'version-parser-extensiontags' => 'Oznake',
 'version-parser-function-hooks' => 'Kuke',
 'version-hook-name' => 'Naziv kuke',
@@ -4105,12 +4084,12 @@ Trebalo bi da ste primili [{{SERVER}}{{SCRIPTPATH}}/COPYING primerak GNU-ove op
 'version-entrypoints-header-entrypoint' => 'Ulazna tačka',
 'version-entrypoints-header-url' => 'Adresa',
 
-# Special:FilePath
-'filepath' => 'Putanja datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Idi',
-'filepath-summary' => 'Ova posebna stranica prikazuje potpunu putanju datoteke.
-Slike su prikazane u punoj veličini, a druge vrste datoteka se pokreću pomoću njima pridruženim programima.',
+# Special:Redirect
+'redirect-legend' => 'Preusmeri na datoteku ili stranicu',
+'redirect-submit' => 'Idi',
+'redirect-value' => 'Vrednost:',
+'redirect-file' => 'Naziv datoteke',
+'redirect-not-exists' => 'Vrednost nije pronađen',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Pretraga duplikata',
@@ -4201,6 +4180,9 @@ Slike su prikazane u punoj veličini, a druge vrste datoteka se pokreću pomoću
 'htmlform-submit' => 'Pošalji',
 'htmlform-reset' => 'Vrati izmene',
 'htmlform-selectorother-other' => 'Drugo',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Izaberite opciju',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 s podrškom pretrage celog teksta',
diff --git a/languages/messages/MessagesSrn.php b/languages/messages/MessagesSrn.php
index ce0037dd..d210911a 100644
--- a/languages/messages/MessagesSrn.php
+++ b/languages/messages/MessagesSrn.php
@@ -179,9 +179,6 @@ $messages = array(
 'tog-enotifminoredits' => 'E-mail mi fu pikin kenki fu peprewoysi opo mi sirey',
 'tog-enotifrevealaddr' => 'Sori mi e-mail nen ini den e-mail boskopu',
 'tog-shownumberswatching' => 'Sori omeni kebroikiman e tan luku a papira disi',
-'tog-externaleditor' => 'Tan kebroiki wan dorosey kenki-wrokosani (soso gi sabiman - spesrutu seti de fanowdu gi disi)',
-'tog-externaldiff' => 'Tan kebroiki wan dorosey agersi-wrokosani (soso gi sabiman - spesrutu set de fanowdu gi disi)',
-'tog-showjumplinks' => 'Sori den "go na" miti',
 'tog-uselivepreview' => 'Kebroiki "wanten sori-na-fesi" (JavaScript – ondrosuku fasi)',
 'tog-forceeditsummary' => 'Gi wan boskopu efu a "Syatu" boksu leygi',
 'tog-watchlisthideown' => 'Kibri mi eygi kenki ini mi Tan luku réy',
@@ -338,7 +335,7 @@ $messages = array(
 'jumptonavigation' => 'fenipresi',
 'jumptosearch' => 'suku',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Abra {{SITENAME}}',
 'aboutpage' => 'Project:Abra',
 'copyright' => 'Ala san skrifi dyaso de ondro $1.',
@@ -348,7 +345,6 @@ $messages = array(
 'disclaimers' => 'Disclaimers',
 'disclaimerpage' => 'Project:Disclaimer gi ala',
 'edithelp' => 'Yepi nanga kenki',
-'edithelppage' => 'Help:Kenki',
 'helppage' => 'Help:San de',
 'mainpage' => 'Fesipapira',
 'mainpage-description' => 'Fesipapira',
@@ -638,17 +634,8 @@ A kan ben trowe efu dribi.
 'prevn' => '{{PLURAL:$1|$1}} di psa',
 'nextn' => '{{PLURAL:$1|$1}} trawan',
 'viewprevnext' => 'Luku ($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url' => 'Help:San de',
 'powersearch' => 'Suku moro dipi',
 
-# Quickbar
-'qbsettings' => 'Kwikbak',
-'qbsettings-none' => 'Nowan',
-'qbsettings-fixedleft' => 'Set na ku',
-'qbsettings-fixedright' => 'Set na pe',
-'qbsettings-floatingleft' => 'Han na ku',
-'qbsettings-floatingright' => 'Han na pe',
-
 # Preferences page
 'preferences' => 'Seti',
 'mypreferences' => 'Mi seti',
@@ -756,7 +743,6 @@ A kan ben trowe efu dribi.
 'recentchangeslinked-feed' => 'Kenki di abi wan sani fu du nanga disi',
 'recentchangeslinked-toolbox' => 'Kenki di abi wan sani fu du nanga disi',
 'recentchangeslinked-title' => 'Kenki di abi wan sani fu du nanga "$1"',
-'recentchangeslinked-noresult' => 'Noti ben kenki ini den miti papira ini a pisi di gi.',
 'recentchangeslinked-summary' => "A spesrutu papira disi e sori den laste kenki di ben meki tapu papira di miti tapu wan papira di sori (noso go na memre fu wan grupu di sori).
 Papira ini [[Special:Watchlist|yu Tan Luku réy]] '''fatu'''.",
 
@@ -851,8 +837,6 @@ Papira ini [[Special:Watchlist|yu Tan Luku réy]] '''fatu'''.",
 'statistics' => 'Den statistiek',
 'statistics-header-users' => 'Masyininfrumasi',
 
-'disambiguations' => 'Seni doro papira',
-
 'doubleredirects' => 'Seni doro tu leisi',
 'doubleredirectstext' => 'Disi rei abi peprewoysi dy stir na trawan stir. Ies rei abi skaki na a foswan nanga a fostu stirpapira nanga wan skaki na a duli fu a fosty stirpapira. Pasa den ten ben a bakaseywan papira a tru duli.',
 
diff --git a/languages/messages/MessagesSt.php b/languages/messages/MessagesSt.php
index 327b587a..65d5e967 100644
--- a/languages/messages/MessagesSt.php
+++ b/languages/messages/MessagesSt.php
@@ -138,7 +138,7 @@ $messages = array(
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
 
-# Email user
+# E-mail user
 'emailuser' => 'Romela motho enwa email',
 'emailfrom' => 'E tswa ho:',
 'emailto' => 'Ho:',
diff --git a/languages/messages/MessagesStq.php b/languages/messages/MessagesStq.php
index 6f58e152..89997c08 100644
--- a/languages/messages/MessagesStq.php
+++ b/languages/messages/MessagesStq.php
@@ -74,10 +74,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Antaal fon do beooboachtjende Benutsere anwiese',
 'tog-oldsig' => 'Aktuälle Signatuur:',
 'tog-fancysig' => 'Unnerskrift as Wikitext behonnelje (sunner automatiske Ferlinkenge)',
-'tog-externaleditor' => 'Externen Editor as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide. [//www.mediawiki.org/wiki/Manual:External_editors Moor Information hiertou.])',
-'tog-externaldiff' => 'Extern Diff-Program as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide.
- [//www.mediawiki.org/wiki/Manual:External_editors Wiedere Informatione hiertou.])',
-'tog-showjumplinks' => '"Wikselje tou"-Links muugelk moakje',
 'tog-uselivepreview' => 'Live-Foarbekiek nutsje (JavaScript) (experimentell)',
 'tog-forceeditsummary' => 'Woarskauje, wan bie dät Spiekerjen ju Touhoopefoatenge failt',
 'tog-watchlisthideown' => 'Oaine Biedraage in ju Beooboachtengslieste ferbierge',
@@ -275,7 +271,7 @@ $1',
 'pool-queuefull' => 'Pooltäiweslange is ful',
 'pool-errorunknown' => 'Uunbekoanden Failer',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Uur {{SITENAME}}',
 'aboutpage' => 'Project:Uur_{{SITENAME}}',
 'copyright' => 'Inhoold is ferföichboar unner de $1.',
@@ -285,7 +281,6 @@ $1',
 'disclaimers' => 'Begriepskläärenge',
 'disclaimerpage' => 'Project:Siede tou Begriepskläärenge',
 'edithelp' => 'Beoarbaidengshälpe',
-'edithelppage' => 'Help:Beoarbaidengshälpe',
 'helppage' => 'Help:Hälpe',
 'mainpage' => 'Haudsiede',
 'mainpage-description' => 'Haudsiede',
@@ -358,15 +353,6 @@ Aal ferföichboare Spezioalsieden sunt in ju [[Special:SpecialPages|Lieste fon d
 # General errors
 'error' => 'Failer',
 'databaseerror' => 'Failer in ju Doatenboank',
-'dberrortext' => 'Der is n Doatenboankfailer aptreeden.
-Die Gruund kon n Programmierfailer weese.
-Ju lääste Doatenboankoufroage lutte:
-<blockquote><tt>$1</tt></blockquote>
-uut de Funktion "<tt>$2</tt>".
-Die Doatenboank mäldede dän Failer "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Dät roate n Syntaxfailer in ju Doatenboankoufroage.
-Ju lääste Doatenboankoufroage lutte: „$1“ uut ju Funktion „<tt>$2</tt>“.
-Die Doatenboank mäldede dän Failer: „<tt>$3: $4</tt>“.',
 'laggedslavemode' => 'Woarskauenge: Ju anwiesde Siede kon unner Umstande do jungste Beoarbaidengen noch nit be-ienhoolde.',
 'readonly' => 'Doatenboank is speerd',
 'enterlockreason' => 'Reek n Gruund ien, wieruum ju Doatenboank speerd wäide skuul un ne Ouskätsenge uur ju Duur fon ju Speerenge',
@@ -417,7 +403,6 @@ Oufroage: $2',
 'editinginterface' => "'''Woarskauenge:''' Du beoarbaidest ne Siede ju der bruukt wäd, Interface-Text foar ju Software tou lääwerjen.
 Annerengen ap disse Siede wirkje sik uut ap ju Benutseruurfläche foar uur Bruukere.
 Foar Uursättengen koast du fielicht beeter [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] bruuke, dät is dät MediaWiki Lokalisierengsprojekt.",
-'sqlhidden' => '(SQL-Oufroage ferbierged)',
 'cascadeprotected' => 'Disse Siede is tou Beoarbaidenge speerd. Ju is in do {{PLURAL:$1|foulgjende Siede|foulgjende Sieden}} ienbuunen, do der middels ju Kaskadenspeeroption skutsed {{PLURAL:$1|is|sunt}}:
 $2',
 'namespaceprotected' => "Du hääst neen Begjuchtigenge, ju Siede in dän '''$1'''-Noomensruum tou beoarbaidjen.",
@@ -448,7 +433,6 @@ Beoachtje, dät eenige Sieden noch anwiese konnen, dät du oumälded bäst, solo
 'yourpassword' => 'Paaswoud:',
 'yourpasswordagain' => 'Paaswoud wierhoalje:',
 'remembermypassword' => 'Ap dissen Computer duurhaft ounmälded blieuwe (Maximoal foar $1 {{PLURAL:$1|Dai|Deege}})',
-'securelogin-stick-https' => 'Ätter dät Anmäldjen mäd HTTOS ferbuunen blieuwe',
 'yourdomainname' => 'Dien Domain:',
 'externaldberror' => 'Äntweeder deer lait n Failer bie ju externe Authentifizierenge foar, of du duurst din extern Benutzerkonto nit aktualisierje.',
 'login' => 'Anmäldje',
@@ -540,7 +524,7 @@ Täif, eer du fon näien fersäkst.',
 'newpassword' => 'Näi Paaswoud:',
 'retypenew' => 'Näi Paaswoud (nochmoal):',
 'resetpass_submit' => 'Paaswoud ienbrange un anmäldje',
-'resetpass_success' => 'Dien Paaswoud wuude mäd Ärfoulch annerd. Nu foulget ju Anmäldenge...',
+'changepassword-success' => 'Dien Paaswoud wuude mäd Ärfoulch annerd. Nu foulget ju Anmäldenge...',
 'resetpass_forbidden' => 'Dät Paaswoud kon nit annerd wäide.',
 'resetpass-no-info' => 'Du moast die anmäldje, uum ap disse Siede direkt toutougriepen.',
 'resetpass-submit-loggedin' => 'Paaswoud annerje',
@@ -551,10 +535,8 @@ Muugelkerwiese hääst du dien Paaswoud al mäd Ärfoulch annerd of n näi tiede
 
 # Special:PasswordReset
 'passwordreset' => 'Paaswoud touräächsätte',
-'passwordreset-text' => 'Dit Formular uutfälle, uum per E-Mail ne Ärinnerenge tou do Anmäldeinformatione tou kriegen.',
 'passwordreset-legend' => 'Paaswoud touräächsätte',
 'passwordreset-disabled' => 'Dät Touräächsätten fon Paaswoude wuud in dissen Wiki deaktivierd.',
-'passwordreset-pretext' => '{{PLURAL:$1||Reek aan fon do foulgjende Doaten ien}}',
 'passwordreset-username' => 'Benutsernoome:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Ju E-Mail-Ättergjucht bekiekje?',
@@ -980,7 +962,6 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
 'searchmenu-legend' => 'Säikoptione',
 'searchmenu-exists' => "'''Dät rakt n Siede mäd Noome \"[[:\$1]]\" ap dissen Wiki'''",
 'searchmenu-new' => "'''Moak ju Siede „[[:$1]]“ in dissen Wiki.'''",
-'searchhelp-url' => 'Help:Hälpe',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Wies aal Sieden, do mäd dän Säikbegriep ounfange]]',
 'searchprofile-articles' => 'Inhooldssieden',
 'searchprofile-project' => 'Hälpe un Projektsieden',
@@ -1022,15 +1003,6 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
 'search-external' => 'Externe Säike',
 'searchdisabled' => 'Ju {{SITENAME}} Fultextsäike is weegen Uurläästenge apstuuns deaktivierd. Du koast insteede deerfon ne Google- of Yahoo-Säike startje. Do Resultoate foar {{SITENAME}} speegelje oawers nit uunbedingd dän aktuällen Stand wier.',
 
-# Quickbar
-'qbsettings' => 'Siedenlieste',
-'qbsettings-none' => 'Naan',
-'qbsettings-fixedleft' => 'Links, fääst',
-'qbsettings-fixedright' => 'Gjuchts, fääst',
-'qbsettings-floatingleft' => 'Links, swieuwjend',
-'qbsettings-floatingright' => 'Gjuchts, swieuwjend',
-'qbsettings-directionality' => 'Fääst, ouhongich fon de Skrieuwgjuchte fon ju wäälde Sproake',
-
 # Preferences page
 'preferences' => 'Ienstaalengen',
 'mypreferences' => 'Ienstaalengen',
@@ -1060,7 +1032,6 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
 'resetprefs' => 'Nit spiekerde Annerengen fersmiete',
 'restoreprefs' => 'Aal Standoard-Ienstaalengen wier häärstaale',
 'prefs-editing' => 'Beoarbaidje',
-'prefs-edit-boxsize' => 'Grööte fon dät Beoarbaidengsfinster:',
 'rows' => 'Riegen',
 'columns' => 'Spalten',
 'searchresultshead' => 'Säike (010)',
@@ -1071,9 +1042,6 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
 'recentchangesdays-max' => '(Maximoal $1 {{PLURAL:$1|Dai|Deege}})',
 'recentchangescount' => 'Antaal fon do standoardmäitich anwiesde Beoarbaidengen:',
 'prefs-help-recentchangescount' => 'Dit uumfoatet ju Lieste fon do lääste Annerengen, ju Versionsgeskichte un do Logbouke.',
-'prefs-help-watchlist-token' => 'Dät Uutfällen fon dit Fäild mäd ne stilkene Koaie generiert n RSS-Feed foar dien Beooboachtengslieste.
-Älk, die disse Koaie koant, kon dien Beooboachtengslieste iensjo. Wääl also n sicheren Wäid.
-Hier n toufällich generierden Wäid, dän du ferweende koast: $1',
 'savedprefs' => 'Dien Ienstaalengen wuuden spiekerd.',
 'timezonelegend' => 'Tiedzone:',
 'localtime' => 'Tied bie Jou:',
@@ -1104,7 +1072,6 @@ Hier n toufällich generierden Wäid, dän du ferweende koast: $1',
 'prefs-reset-intro' => 'Du koast disse Siede bruuke, uum do Ienstaalengen ap do Standoarde touräächtousätten.
 Dät kon nit moor tourääch troald wäide.',
 'prefs-emailconfirm-label' => 'E-Mail-Bestäätigenge:',
-'prefs-textboxsize' => 'Grööte fon dät Beoarbaidengsfinster',
 'youremail' => 'E-Mail-Adrässe:',
 'username' => 'Benutsernoome:',
 'uid' => 'Benutser-ID:',
@@ -1337,7 +1304,6 @@ Ju duur maximoal $1 {{PLURAL:$1|Teeken|Teekene}} loang weese.',
 'recentchangeslinked-feed' => 'Annerengen an ferlinkede Sieden',
 'recentchangeslinked-toolbox' => 'Annerengen an ferlinkede Sieden',
 'recentchangeslinked-title' => 'Annerengen an Sieden, do der fon „$1“ ferbuunden sunt',
-'recentchangeslinked-noresult' => 'In dän uutwäälde Tiedruum wuuden an do ferbuundene Sieden neen Annerengen foarnuumen.',
 'recentchangeslinked-summary' => "Disse Spezioalsiede liestet do lääste Annerengen fon ferbuundene Sieden ap (blw. bie Kategorien an do Meegliedere fon disse Kategorie). Sieden ap dien [[Special:Watchlist|Beooboachtengslieste]] sunt '''fat''' skrieuwen.",
 'recentchangeslinked-page' => 'Siede:',
 'recentchangeslinked-to' => 'Wies Annerengen ap Sieden, do hierhäär ferlinkje',
@@ -1525,7 +1491,6 @@ Uut Sicherhaidsgruunde is img_auth.php deaktivierd.',
 'http-read-error' => 'HTTP-Leesefailer.',
 'http-timed-out' => 'Tied is ferron bie ju HTTP-Anfroage.',
 'http-curl-error' => 'Failer bier dän Ouroup fon ju URL: $1',
-'http-host-unreachable' => 'URL is nit tou beloangjen',
 'http-bad-status' => 'Unner ju HTTP-Anfroage is n Failer aptreeden: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1665,12 +1630,6 @@ Ne [[Special:WhatLinksHere/$2|fulständige Lieste]] is ferföigboar.',
 'statistics-users-active-desc' => 'Benutsere mäd Beoarbaidengen {{PLURAL:$1|in do lääste 24 Uuren|in do fergeene $1 Deege}}',
 'statistics-mostpopular' => 'Maast besoachte Sieden',
 
-'disambiguations' => 'Sieden do der ap Begriepskläärengssieden ferlinkje',
-'disambiguationspage' => 'Template:Begriepskläärenge',
-'disambiguations-text' => "Do foulgjende Sieden ferlinkje ap ne Siede tou ju '''Begriepskläärenge'''.
-Jie skuulen insteede deerfon ap ju eegentelk meende Siede ferlinkje.<br />
-Ne Siede wäd as Begriepskläärengssiede behonneld, wan [[MediaWiki:Disambiguationspage]] ap ju ferlinket.",
-
 'doubleredirects' => 'Dubbelde Fäärelaitengen',
 'doubleredirectstext' => 'Disse Lieste änthoalt Fääreleedengen, do der ap wiedere Fääreleedengen ferlinkje.
 Älke Riege änthoalt Links tou ju eerste un twäide Fääreleedenge as uk dät Siel fon ju twäide Fääreleedenge, wät foar gewöönelk ju wonskede Sielsiede is, ap ju al ju eerste Fääreleedenge wiese skuul.
@@ -1905,10 +1864,9 @@ Wan du die Artikkel wier fon ju Foulgelieste ou hoalje moatest, klik ap ju Siede
 'unwatchthispage' => 'Nit moor beooboachtje',
 'notanarticle' => 'Naan Artikkel',
 'notvisiblerev' => 'Version wuude läsked',
-'watchnochange' => 'Neen fon do Sieden, do du beooboachtest, wuude in dän läästen Tiedruum beoarbaided.',
 'watchlist-details' => 'Jie beooboachtje {{PLURAL:$1|1 Siede|$1 Sieden}} (Diskussionssieden wuuden hier nit meetäld).',
-'wlheader-enotif' => '* E-Mail-Beskeed is aktivierd.',
-'wlheader-showupdated' => "* Sieden, do ätter dien lääste Besäik annerd wuuden sunt, wäide '''fat''' deerstoald.",
+'wlheader-enotif' => 'E-Mail-Beskeed is aktivierd.',
+'wlheader-showupdated' => "Sieden, do ätter dien lääste Besäik annerd wuuden sunt, wäide '''fat''' deerstoald.",
 'watchmethod-recent' => 'Uurpröiwjen fon do lääste Beoarbaidengen foar ju Beooboachtengslieste',
 'watchmethod-list' => 'Uurpröiwjen fon ju Beooboachtengslieste ätter lääste Beoarbaidengen',
 'watchlistcontains' => 'Jou Beooboachtengslieste änthaalt $1 {{PLURAL:$1|Siede|Sieden}}.',
@@ -2279,11 +2237,8 @@ Sjuch ju [[Special:BlockList|Lieste fon de speerde IP-Adrässen un Benutsernoome
 'ipb_blocked_as_range' => 'Failer: Ju IP-Adresse $1 wuude as Deel fon ju Beräksspeere $2 indirekt speerd. Ne Äntspeerenge fon $1 alleene is nit muugelk.',
 'ip_range_invalid' => 'Uungultige IP-Adräsberäk.',
 'ip_range_toolarge' => 'Adräsberäkke, do der gratter sunt as /$1, sunt nit ferlööwed.',
-'blockme' => 'Speer mie',
 'proxyblocker' => 'Proxy blokker',
-'proxyblocker-disabled' => 'Disse Funktion is deaktivierd.',
 'proxyblockreason' => 'Jou IP-Adrässe wuude speerd, deer ju n eepenen Proxy is. Kontaktierje jädden Jou Provider af Jou Systemtechnik un informierje Jou jou uur dit muugelke Sicherhaidsproblem.',
-'proxyblocksuccess' => 'Kloor.',
 'sorbsreason' => 'Dien IP-Adrässe is in ju DNSBL fon {{SITENAME}} as eepene PROXY liested.',
 'sorbs_create_account_reason' => 'Dien IP-Adrässe is in ju DNSBL fon {{SITENAME}} as eepene PROXY liested. Du koast neen Benutser-Account anlääse.',
 'cant-block-while-blocked' => 'Du duurst neen uur Benutsere speere, wan du sälwen speerd bäst.',
@@ -2696,7 +2651,7 @@ Wiedere wäide standoardmäitich nit anwiesd.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Bratte',
 'exif-imagelength' => 'Laangte',
 'exif-bitspersample' => 'Bits pro Faawenkomponente',
@@ -2854,7 +2809,7 @@ Wiedere wäide standoardmäitich nit anwiesd.
 'exif-copyrighted' => 'Uurhieuwergjuchtstoatus',
 'exif-copyrightowner' => 'Uurhieuwergjuchtsienhääber',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Uunkomprimierd',
 
 'exif-unknowndate' => 'Uunbekoand Doatum',
@@ -3168,7 +3123,6 @@ Du koast dien Beooboachtengslieste uk in dät [[Special:EditWatchlist/raw|Lieste
 'version-other' => 'Uurswät',
 'version-mediahandlers' => 'Medien-Handlere',
 'version-hooks' => "Snitsteeden ''(Hooks)''",
-'version-extension-functions' => 'Funktionsaproupe',
 'version-parser-extensiontags' => "Parser-Ärwiederengen ''(tags)''",
 'version-parser-function-hooks' => 'Parser-Funktione',
 'version-hook-name' => 'Snitsteedennoome',
@@ -3186,12 +3140,6 @@ Ne [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie fon ju ''GNU General Public License''
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Version',
 
-# Special:FilePath
-'filepath' => 'Doatäipaad',
-'filepath-page' => 'Doatäi:',
-'filepath-submit' => 'Gung',
-'filepath-summary' => 'Mäd disse Spezialsiede lät sik die komplette Paad fon ju aktuelle Version fon ne Doatäi sunner Uumwai oufräigje. Ju anfräigede Doatäi wäd fluks deerstoald blw. mäd ju ferknätte Anweendenge started.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Doatäi-Duplikoat-Säike',
 'fileduplicatesearch-summary' => 'Säike ätter Doatäi-Duplikoate ap Basis fon hieren Hash-Wäid.',
diff --git a/languages/messages/MessagesSu.php b/languages/messages/MessagesSu.php
index 2c8b70ad..410e1ba2 100644
--- a/languages/messages/MessagesSu.php
+++ b/languages/messages/MessagesSu.php
@@ -159,9 +159,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Témbongkeun jumlah nu ngawaskeun',
 'tog-oldsig' => 'Paraf nu geus aya:',
 'tog-fancysig' => 'Témbongkeun paraf salaku wikitext (tanpa tumbu otomatis)',
-'tog-externaleditor' => 'Paké éditor éxternal dumasar asalna (ukur pikeun nu ahli, perlu sétingan husus dina komputer anjeun. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Paké diff éxternal dumasar asalna (ukur pikeun nu ahli, perlu sétingan husus dina komputer anjeun. [//www.mediawiki.org/wiki/Manual:External_editors Émbaran lengkep.])',
-'tog-showjumplinks' => 'Aktifkeun tumbu panyambung "luncat ka"',
 'tog-uselivepreview' => 'Paké pramidang saharita (JavaScript) (ujicoba)',
 'tog-forceeditsummary' => 'Mun kotak ringkesan éditan masih kosong, béjaan!',
 'tog-watchlisthideown' => 'Sumputkeun éditan kuring dina daptar awaskeuneun',
@@ -175,6 +172,7 @@ $messages = array(
 'tog-showhiddencats' => 'Témbongkeun kategori nyumput',
 'tog-noconvertlink' => 'Non-aktifkeun konvérsi judul tumbu',
 'tog-norollbackdiff' => 'Liwat béda sanggeus malikkeun révisi',
+'tog-useeditwarning' => 'Béjaan kuring lamun ninggalkeun kaca édit anu parobahanana can disimpen',
 
 'underline-always' => 'Salawasna',
 'underline-never' => 'Ulah',
@@ -360,7 +358,7 @@ $1',
 'pool-queuefull' => 'Antrian geus pinuh',
 'pool-errorunknown' => 'Éror teu dipikawanoh',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Ngeunaan {{SITENAME}}',
 'aboutpage' => 'Project:Ngeunaan',
 'copyright' => 'Sadaya kandungan ieu loka ditangtayungan ku $1',
@@ -370,7 +368,6 @@ $1',
 'disclaimers' => 'Bantahan',
 'disclaimerpage' => 'Project:Bantahan_umum',
 'edithelp' => 'Pitulung ngédit',
-'edithelppage' => 'Help:Ngédit',
 'helppage' => 'Help:Pitulung',
 'mainpage' => 'Tepas',
 'mainpage-description' => 'Tepas',
@@ -442,17 +439,6 @@ Kaca husus anu bener bisa ditempo béréndélanana dina [[Special:SpecialPages|{
 # General errors
 'error' => 'Kasalahan',
 'databaseerror' => 'Kasalahan gudang data',
-'dberrortext' => 'Éror rumpaka kueri pangkalan data.
-Ieu bisa jadi alatan ayana bug dina sopwérna.
-Kueri pangkalan data nu panungtung nyaéta:
-<blockquote><tt>$1</tt></blockquote>
-ti antara fungsi "<tt>$2</tt>".
-Éror ti pangkalan data "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Éror rumpaka kueri pangkalan data.
-Kueri pangkalan data nu panungtung nyaéta:
-"$1"
-ti antara fungsi "$2".
-Éror ti pangkalan data "$3: $4".',
 'laggedslavemode' => 'Awas: kandungan kaca bisa baé teu mutahir.',
 'readonly' => 'pangkalan data dikonci',
 'enterlockreason' => 'Asupkeun alesan pikeun ngonci, kaasup kira-kira iraha konci ieu rék dibuka',
@@ -501,7 +487,6 @@ Sigana geus dihapus ku nu séjén.',
 'editinginterface' => "'''Awas:''' Anjeun keur ngédit kaca nu dipaké pikeun nyadiakeun téks antarmuka pikeun sopwérna.
 Parobahan kana ieu kaca bakal mangaruhan pidangan antarmuka pikeun pamaké séjén.
 Pikeun alihbasa, mangga sumping ka [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], proyék lokalisasi MediaWiki.",
-'sqlhidden' => '(Pamenta SQL disumputkeun)',
 'cascadeprotected' => 'Kaca ieu geus dikonci ti éditan alatan disartakeun di {{PLURAL:$1|kaca|kaca-kaca}} katut anu geus dikonci kalawan pilihan "runtun": $2',
 'namespaceprotected' => "Anjeun teu ngabogaan hak pikeun ngédit kaca di ngaranspasi '''$1'''.",
 'customcssprotected' => 'Anjeun teu teu diwenangkeun pikeun ngédit ieu kaca CSS, sabab ngandung setélan pribadi kontributor séjén.',
@@ -523,7 +508,6 @@ Mangkahadé, sababaraha kaca bakal tetep némbongkeun saolah-olah anjeun asup lo
 'yourpassword' => 'Sandi anjeun',
 'yourpasswordagain' => 'Ketik deui sandi anjeun',
 'remembermypassword' => 'Apalkeun login kuring dina ieu komputer (pikeun paling lila $1 {{PLURAL:$1|poé|poé}})',
-'securelogin-stick-https' => 'Terus nyambung ka HTTPS sanggeus login',
 'yourdomainname' => 'Domain anjeun',
 'externaldberror' => 'Aya kasalahan dina pangkalan data oténtikasi luar, atawa anjeun mémang teu diwenangkeun pikeun ngaropéa rekening luar anjeun.',
 'login' => 'Asup log',
@@ -614,7 +598,7 @@ Tungguan heula sakeudeung, laju cobaan deui.',
 'newpassword' => 'Sandi anyar:',
 'retypenew' => 'Ketik ulang sandi',
 'resetpass_submit' => 'Setél log asup katut sandina',
-'resetpass_success' => 'Kecap sandi Anjeun geus junun dirobah! Ayeuna proses asup log Anjeun...',
+'changepassword-success' => 'Kecap sandi Anjeun geus junun dirobah! Ayeuna proses asup log Anjeun...',
 'resetpass_forbidden' => 'Sandi henteu bisa dirobah',
 'resetpass-no-info' => 'Anjeun kudu asup log pkeun bisa muka ieu kaca sacara langsung.',
 'resetpass-submit-loggedin' => 'Ganti kecap sandi rekening',
@@ -625,10 +609,8 @@ Bisa jadi anjeun geus ngaganti sandina atawa ménta sandi saheulaanan anu anyar.
 
 # Special:PasswordReset
 'passwordreset' => 'Setél ulang sandi',
-'passwordreset-text' => 'Lengkepan ieu formulir pikeun nampa surélék pangéling ngeunaan wincikan akun anjeun.',
 'passwordreset-legend' => 'Setél ulang sandi',
 'passwordreset-disabled' => 'Dina ieu wiki, sandi teu bisa disetél ulang.',
-'passwordreset-pretext' => '{{PLURAL:$1||Asupkeun salah sahiji data di handap ieu}}',
 'passwordreset-username' => 'Sandiasma:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Témbongkeun surat-é hasilna?',
@@ -1046,7 +1028,6 @@ Pastikeun yén ieu parobahan bisa miara jujutan kaca sagemblengna.',
 'searchmenu-legend' => 'Pilihan nyungsi',
 'searchmenu-exists' => "'''Dina wiki ieu geus aya kaca nu ngaranna \"[[:\$1]]\"'''",
 'searchmenu-new' => "'''Jieun kaca \"[[:\$1]]\" dina ieu wiki!'''",
-'searchhelp-url' => 'Help:Pitulung',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Sungsi kaca-kaca nu dimimitian ku ieu awalan]]',
 'searchprofile-articles' => 'Kaca eusi',
 'searchprofile-project' => 'Kaca Pitulung jeung Proyék',
@@ -1089,14 +1070,6 @@ Coba susud dimimitian ku ''all:'' pikeun nyusud sakabéh kandunganana (kaasup ka
 'search-external' => 'Panéangan luar',
 'searchdisabled' => 'Punten! Néangan téks lengkep di {{SITENAME}} kanggo samentawis ditumpurkeun pikeun alesan kinerja. Jalaran kitu, saheulaanan anjeun bisa nyungsi di Google di handap ieu. Catet yén indéxna ngeunaan eusi {{SITENAME}} bisa jadi teu mutahir.',
 
-# Quickbar
-'qbsettings' => 'Bar gancang',
-'qbsettings-none' => 'Henteu aya',
-'qbsettings-fixedleft' => 'Angger beulah kenca',
-'qbsettings-fixedright' => 'Angger beulah katuhu',
-'qbsettings-floatingleft' => 'Ngambang ka kenca',
-'qbsettings-floatingright' => 'Ngambang ka katuhu',
-
 # Preferences page
 'preferences' => 'Préferénsi',
 'mypreferences' => 'Préferéns',
@@ -1127,7 +1100,6 @@ Coba susud dimimitian ku ''all:'' pikeun nyusud sakabéh kandunganana (kaasup ka
 'resetprefs' => 'Sét ulang préferénsi',
 'restoreprefs' => 'Larapkeun setélan buhun',
 'prefs-editing' => 'Ukuran kotak téks',
-'prefs-edit-boxsize' => 'Ukuran jandéla édit.',
 'rows' => 'Baris',
 'columns' => 'Kolom',
 'searchresultshead' => 'Aturan hasil néang',
@@ -1168,7 +1140,6 @@ Coba susud dimimitian ku ''all:'' pikeun nyusud sakabéh kandunganana (kaasup ka
 'prefs-reset-intro' => 'Anjeun bisa maké ieu kaca pikeun mulangkeun préferénsi anjeun ka nu baku.
 Mun geus anggeus teu bisa dibolaykeun.',
 'prefs-emailconfirm-label' => 'Konfirmasi surélék:',
-'prefs-textboxsize' => 'Lega jandéla ngédit',
 'youremail' => 'Surélék:',
 'username' => 'Landihan:',
 'uid' => 'ID pamaké:',
@@ -1392,7 +1363,6 @@ Mun geus anggeus teu bisa dibolaykeun.',
 'recentchangeslinked-feed' => 'Parobahan nu patali',
 'recentchangeslinked-toolbox' => 'Parobahan nu patali',
 'recentchangeslinked-title' => 'Parobahan patali ka "$1"',
-'recentchangeslinked-noresult' => 'Dina selang waktu anu dipénta, euweuh parobahan dina kaca-kaca anu numbu.',
 'recentchangeslinked-summary' => "Ieu kaca husus ngabéréndélkeun parobahan anyar anu numbu ti kaca husus (atawa uesi katagori husus). Kaca anu [[Special:Watchlist|diawaskeun]] némbongan '''kandel'''.",
 'recentchangeslinked-page' => 'Ngaran kaca:',
 'recentchangeslinked-to' => 'Témbongkeun parobahan ka kaca-kaca nu ditumbukeun ka kaca nu dimaksud',
@@ -1533,7 +1503,6 @@ Pariksa heula jujutan hapusanana saméméh neruskeun ngamuat deui éta berkas.',
 # HTTP errors
 'http-invalid-url' => 'URL teu bener: $1',
 'http-invalid-scheme' => 'URL anu skémana "$1" teu karojong',
-'http-host-unreachable' => 'URL teu kahontal.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL teu kahontal',
@@ -1657,12 +1626,6 @@ Saméméh ngahapus, pariksa heula bisi aya tumbu ka ieu citakan.',
 'statistics-users-active-desc' => 'Kontributor nu ngoprék salila {{PLURAL:$1|poé|$1 poé}} panungtung',
 'statistics-mostpopular' => 'Kaca nu pangmindengna dibuka',
 
-'disambiguations' => 'Kaca disambiguasi',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Kaca-kaca ieu ngabogaan tumbu ka hiji ''kaca disambiguasi''.
-Kaca eta sakuduna numbu ka topik-topik anu luyu.<br />
-Sahiji kaca dianggap minangka kaca disambiguasi lamun kaca kasebut ngagunakeun citakan anu nyambung ka [[MediaWiki:Disambiguationspage]].",
-
 'doubleredirects' => 'Alihan ganda',
 'doubleredirectstext' => 'Ieu kaca ngabéréndélkeun kaca-kaca alihan ka kaca alihan lianna. Unggal baris ngandung tutumbu ka alihan kahiji jeung kadua, ogé tujul alihan kadua anu biasana tujul kaca anu "bener", anu sakuduna dituju ku alihan kahiji. Ëntri nu <del>dicorét</del> geus diropéa.',
 'double-redirect-fixed-move' => '[[$1]] geus pindah, dialihkeun ka [[$2]].',
@@ -1881,10 +1844,9 @@ Jaga, parobahan na kaca ieu katut kaca obrolanana bakal dibéréndélkeun di din
 'unwatchthispage' => 'Eureun ngawaskeun',
 'notanarticle' => 'Sanés kaca eusi',
 'notvisiblerev' => 'Révisi geus dihapus',
-'watchnochange' => 'Sadaya awaseun anjeun taya nu diédit dina jangka wanci nu ditémbongkeun.',
 'watchlist-details' => 'Aya {{PLURAL:$1|$1 kaca|$1 kaca}} nu ku anjeun diawaskeun, teu kaasup kaca obrolan/sawala.',
-'wlheader-enotif' => '* Pangémbar surélék difungsikeun.',
-'wlheader-showupdated' => "* Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun kalawan '''kandel'''",
+'wlheader-enotif' => 'Pangémbar surélék difungsikeun.',
+'wlheader-showupdated' => "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun kalawan '''kandel'''",
 'watchmethod-recent' => 'mariksa nu anyar robah na kaca nu diawaskeun',
 'watchmethod-list' => 'mariksa nu anyar robah na kaca nu diawaskeun',
 'watchlistcontains' => 'Anjeun ngawaskeun $1 {{PLURAL:$1|kaca|kaca}}.',
@@ -2195,11 +2157,8 @@ Pikeun rujukan, logna dipidangkeun di handap ieu:',
 'unblock-hideuser' => 'Anjeun teu bisa muka peungpeuk ieu pamaké, kusabab landihanan keur disumputkeun.',
 'ipb_cant_unblock' => 'Éror: ID peungpeuk $1 teu kapanggih. Sigana mah geus dibuka.',
 'ip_range_invalid' => 'Angka IP teu bener.',
-'blockme' => 'Peungpeuk kuring',
 'proxyblocker' => 'Pameungpeuk proxy',
-'proxyblocker-disabled' => 'Ieu fungsi keur ditumpurkeun.',
 'proxyblockreason' => "Alamat IP anjeun dipeungpeuk sabab mangrupa proxy muka. Mangga tepungan ''Internet service provider'' atanapi ''tech support'' anjeun, béjakeun masalah serius ieu.",
-'proxyblocksuccess' => 'Réngsé.',
 'sorbsreason' => "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL.",
 'sorbs_create_account_reason' => "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL. Anjeun teu bisa nyieun rekening",
 'cant-block-while-blocked' => 'Lamun keur dipeungpeuk, anjeun teu bisa meungpeuk séjén kontributor.',
@@ -2551,7 +2510,7 @@ Nu séjénna bakal disumputkeun sakumaha asalna.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lega',
 'exif-imagelength' => 'Luhur',
 'exif-compression' => 'Skéma komprési',
@@ -2953,7 +2912,6 @@ Coba ku sawangan normal.',
 'version-variables' => 'Variabel',
 'version-other' => 'Séjén',
 'version-hooks' => 'Kait',
-'version-extension-functions' => 'Fungsi éksténsi',
 'version-parser-extensiontags' => 'Tag éksténsi parser',
 'version-hook-name' => 'Ngaran kait',
 'version-hook-subscribedby' => 'Didaptarkeun ku',
@@ -2963,11 +2921,6 @@ Coba ku sawangan normal.',
 'version-software-product' => 'Produk',
 'version-software-version' => 'Vérsi',
 
-# Special:FilePath
-'filepath' => 'Jalur koropak',
-'filepath-page' => 'Koropak:',
-'filepath-submit' => 'Jalur',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Sungsi gambar duplikat',
 'fileduplicatesearch-legend' => 'Sungsi duplikat',
diff --git a/languages/messages/MessagesSv.php b/languages/messages/MessagesSv.php
index 47b4ec6f..30dd4d02 100644
--- a/languages/messages/MessagesSv.php
+++ b/languages/messages/MessagesSv.php
@@ -21,6 +21,7 @@
  * @author Grillo
  * @author Habj
  * @author Habjchen
+ * @author Hangsna
  * @author Hannibal
  * @author Haxpett
  * @author Jon Harald Søby
@@ -29,6 +30,7 @@
  * @author LPfi
  * @author Lejonel
  * @author Leo Johannes
+ * @author Liftarn
  * @author Lokal Profil
  * @author M.M.S.
  * @author MagnusA
@@ -36,6 +38,7 @@
  * @author Mikez
  * @author NH
  * @author Najami
+ * @author Nemo bis
  * @author Nghtwlkr
  * @author Ozp
  * @author Per
@@ -353,10 +356,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Visa antalet användare som bevakar',
 'tog-oldsig' => 'Nuvarande signatur:',
 'tog-fancysig' => 'Rå signatur som wikitext (utan en automatisk länk)',
-'tog-externaleditor' => 'Använd extern editor som standard (endast för avancerade användare, speciella inställningar på din dator krävs. [//www.mediawiki.org/wiki/Manual:External_editors Mer information.])',
-'tog-externaldiff' => 'Använd externt diff-verktyg som förval (endast för avancerade användare, kräver speciella inställningar i din dator.
-[//www.mediawiki.org/wiki/Manual:External_editors Mer information.])',
-'tog-showjumplinks' => 'Aktivera "hoppa till"-tillgänglighetslänkar',
 'tog-uselivepreview' => 'Använd direktuppdaterad förhandsgranskning (experimentell)',
 'tog-forceeditsummary' => 'Påminn mig om jag inte fyller i en redigeringskommentar',
 'tog-watchlisthideown' => 'Visa inte mina redigeringar i bevakningslistan',
@@ -370,6 +369,8 @@ $messages = array(
 'tog-showhiddencats' => 'Visa dolda kategorier',
 'tog-noconvertlink' => 'Stäng av konvertering av sidtitlar',
 'tog-norollbackdiff' => 'Visa inte diff efter tillbakarullning',
+'tog-useeditwarning' => 'Varna mig om jag lämnar en redigeringssida där jag gjort ändringar men inte sparat.',
+'tog-prefershttps' => 'Använd alltid en säker anslutning när jag är inloggad',
 
 'underline-always' => 'Alltid',
 'underline-never' => 'Aldrig',
@@ -433,6 +434,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1 januari',
+'february-date' => '$1 februari',
+'march-date' => '$1 mars',
+'april-date' => '$1 april',
+'may-date' => '$1 maj',
+'june-date' => '$1 juni',
+'july-date' => '$1 juli',
+'august-date' => '$1 augusti',
+'september-date' => '$1 september',
+'october-date' => '$1 oktober',
+'november-date' => '$1 november',
+'december-date' => '$1 december',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategorier}}',
@@ -514,6 +527,7 @@ $messages = array(
 'create-this-page' => 'Skapa denna sida',
 'delete' => 'Radera',
 'deletethispage' => 'Radera denna sida',
+'undeletethispage' => 'Återställ denna sida',
 'undelete_short' => 'Återställ {{PLURAL:$1|en version|$1 versioner}}',
 'viewdeleted_short' => 'Visa {{PLURAL:$1|en raderad redigering|$1 raderade redigeringar}}',
 'protect' => 'Skrivskydda',
@@ -530,7 +544,7 @@ $messages = array(
 'articlepage' => 'Visa innehållssida',
 'talk' => 'Diskussion',
 'views' => 'Visningar',
-'toolbox' => 'Verktygslåda',
+'toolbox' => 'Verktyg',
 'userpage' => 'Visa användarsida',
 'projectpage' => 'Visa projektsida',
 'imagepage' => 'Visa filsida',
@@ -557,7 +571,7 @@ $1',
 'pool-queuefull' => 'Kön är full',
 'pool-errorunknown' => 'Okänt fel',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Om {{SITENAME}}',
 'aboutpage' => 'Project:Om',
 'copyright' => 'Innehållet är tillgängligt under $1.',
@@ -567,7 +581,6 @@ $1',
 'disclaimers' => 'Förbehåll',
 'disclaimerpage' => 'Project:Allmänt förbehåll',
 'edithelp' => 'Redigeringshjälp',
-'edithelppage' => 'Help:Redigering',
 'helppage' => 'Help:Innehåll',
 'mainpage' => 'Huvudsida',
 'mainpage-description' => 'Huvudsida',
@@ -644,17 +657,12 @@ I [[Special:SpecialPages|listan över specialsidor]] kan du se vilka specialsido
 # General errors
 'error' => 'Fel',
 'databaseerror' => 'Databasfel',
-'dberrortext' => 'Ett syntaxfel i databasfrågan har uppstått.
-Detta kan indikera en bugg i mjukvaran.
-Den senaste databasfrågan att köras var:
-<blockquote><tt>$1</tt></blockquote>
-från funktionen "<tt>$2</tt>".
-Databasen returnerade felet "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Det har uppstått ett syntaxfel i databassökningen.
-Senaste sökbegrepp var:
-"$1"
-från funktionen "$2".
-Databasen svarade med felmeddelandet "$3: $4"',
+'databaseerror-text' => 'Ett fel inträffade vid en databasfråga.
+Detta kan tyda på en bugg i mjukvaran.',
+'databaseerror-textcl' => 'Ett fel inträffade vid en databasfråga.',
+'databaseerror-query' => 'Fråga: $1',
+'databaseerror-function' => 'Funktion: $1',
+'databaseerror-error' => 'Fel: $1',
 'laggedslavemode' => 'Varning: Sidan kan sakna de senaste uppdateringarna.',
 'readonly' => 'Databasen är skrivskyddad',
 'enterlockreason' => 'Ange varför sidan skrivskyddats, och ge en uppskattning av hur länge skrivskyddet bör behållas.',
@@ -688,6 +696,7 @@ Den kanske redan har raderats av någon annan.',
 'cannotdelete-title' => 'Sidan "$1" kan inte raderas',
 'delete-hook-aborted' => 'Borttagning avbruten av hook.
 Den gav ingen förklaring.',
+'no-null-revision' => 'Kunde inte skapa ny tom version för sidan "$1"',
 'badtitle' => 'Felaktig titel',
 'badtitletext' => 'Den begärda sidtiteln är antingen ogiltig eller tom, eller så är titeln felaktigt länkad från en annan wiki.
 Den kan innehålla ett eller flera tecken som inte får användas i sidtitlar.',
@@ -707,12 +716,15 @@ För att lägga till eller ändra översättningar för alla wikis, var god anv
 'editinginterface' => "'''Varning:''' Du redigerar en sida som används till texten i gränssnittet.
 Ändringar på denna sida kommer att påverka gränssnittets utseende för alla användare på denna wiki.
 För att lägga till eller ändra översättningar för alla wikis, var god använd [//translatewiki.net/ translatewiki.net], översättningsprojektet för MediaWiki.",
-'sqlhidden' => '(gömd SQL-förfrågan)',
 'cascadeprotected' => 'Den här sidan har skyddats från redigering eftersom den inkluderas på följande {{PLURAL:$1|sida|sidor}} som skrivskyddats med "kaskaderande skydd":
 $2',
 'namespaceprotected' => "Du har inte behörighet att redigera sidor i namnrymden '''$1'''.",
 'customcssprotected' => 'Du har inte behörighet att redigera denna CSS-sidan eftersom den innehåller en annan användares personliga inställningar.',
 'customjsprotected' => 'Du har inte behörighet att redigera denna JavaScript-sidan eftersom den innehåller en annan användares personliga inställningar.',
+'mycustomcssprotected' => 'Du har inte rättigheten att redigera denna CSS-sida.',
+'mycustomjsprotected' => 'Du har inte rättigheten att redigera denna JavaScript-sida.',
+'myprivateinfoprotected' => 'Du har inte behörighet att redigera din privata information.',
+'mypreferencesprotected' => 'Du har inte behörighet att redigera dina inställningar.',
 'ns-specialprotected' => 'Specialsidor kan inte redigeras.',
 'titleprotected' => 'Denna sidtitel har skyddats från att skapas av [[User:$1|$1]].
 Den uppgivna anledningen är "\'\'$2\'\'".',
@@ -737,10 +749,19 @@ Observera att det, tills du tömmer din webbläsares cache, på vissa sidor kan
 'welcomecreation-msg' => 'Ditt konto har skapats.
 Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].',
 'yourname' => 'Användarnamn:',
+'userlogin-yourname' => 'Användarnamn',
+'userlogin-yourname-ph' => 'Ange ditt användarnamn',
+'createacct-another-username-ph' => 'Skriv in användarnamnet',
 'yourpassword' => 'Lösenord:',
+'userlogin-yourpassword' => 'Lösenord',
+'userlogin-yourpassword-ph' => 'Ange ditt lösenord',
+'createacct-yourpassword-ph' => 'Ange ett lösenord',
 'yourpasswordagain' => 'Upprepa lösenord',
+'createacct-yourpasswordagain' => 'Bekräfta lösenordet',
+'createacct-yourpasswordagain-ph' => 'Ange lösenordet igen',
 'remembermypassword' => 'Spara min inloggning på den här datorn (i max $1 {{PLURAL:$1|dygn|dygn}})',
-'securelogin-stick-https' => 'Fortsätt vara ansluten till HTTPS efter inloggning',
+'userlogin-remembermypassword' => 'Håll mig inloggad',
+'userlogin-signwithsecure' => 'Använd säker anslutning',
 'yourdomainname' => 'Din domän',
 'password-change-forbidden' => 'Du kan inte ändra lösenord på denna wiki.',
 'externaldberror' => 'Antingen inträffade autentiseringsproblem med en extern databas, eller så får du inte uppdatera ditt externa konto.',
@@ -752,18 +773,44 @@ Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].
 'logout' => 'Logga ut',
 'userlogout' => 'Logga ut',
 'notloggedin' => 'Inte inloggad',
+'userlogin-noaccount' => 'Har du inget konto?',
+'userlogin-joinproject' => 'Gå med i {{SITENAME}}',
 'nologin' => 'Har du inget användarkonto? $1.',
 'nologinlink' => 'Skapa ett användarkonto',
 'createaccount' => 'Skapa ett konto',
 'gotaccount' => "Har du redan ett användarkonto? '''$1'''.",
 'gotaccountlink' => 'Logga in',
 'userlogin-resetlink' => 'Har du glömt dina inloggningsuppgifter?',
+'userlogin-resetpassword-link' => 'Återställ ditt lösenord',
+'helplogin-url' => 'Help:Logga in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjälp med inloggning]]',
+'userlogin-loggedin' => 'Du är redan inloggad som {{GENDER:$1|$1}}.
+Använd formuläret nedan för att logga in som en annan användare.',
+'userlogin-createanother' => 'Skapa ett annat konto',
+'createacct-join' => 'Ange din information nedan.',
+'createacct-another-join' => 'Ange information för det nya kontot nedan.',
+'createacct-emailrequired' => 'E-postadress',
+'createacct-emailoptional' => 'E-postadress (valfritt)',
+'createacct-email-ph' => 'Bekräfta din e-postadress',
+'createacct-another-email-ph' => 'Skriv in e-postadress',
 'createaccountmail' => 'Använd ett tillfälligt slumpvis valt lösenord och skicka det till den angivna e-postadressen',
+'createacct-realname' => 'Riktigt namn (valfritt)',
 'createaccountreason' => 'Orsak:',
+'createacct-reason' => 'Anledning',
+'createacct-reason-ph' => 'Varför du skapar ett annat konto',
+'createacct-captcha' => 'Säkerhetskontroll',
+'createacct-imgcaptcha-ph' => 'Fyll i texten du ser ovan',
+'createacct-submit' => 'Skapa ditt konto',
+'createacct-another-submit' => 'Skapa ett till konto',
+'createacct-benefit-heading' => '{{SITENAME}} är skapad av människor som dig.',
+'createacct-benefit-body1' => '{{PLURAL:$1|redigering|redigeringar}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|sida|sidor}}',
+'createacct-benefit-body3' => 'senaste {{PLURAL:$1|bidragsgivare}}',
 'badretype' => 'De lösenord du uppgett överensstämmer inte med varandra.',
 'userexists' => 'Det valda användarnamnet används redan.
 Var god välj ett annat namn.',
 'loginerror' => 'Inloggningsproblem',
+'createacct-error' => 'Fel när konto skulle skapas',
 'createaccounterror' => 'Kunde inte skapa konto: $1',
 'nocookiesnew' => 'Användarkontot skapades, men du är inte inloggad.
 {{SITENAME}} använder cookies för att logga in användare.
@@ -820,10 +867,12 @@ Skriv in en adress med korrekt format eller töm fältet.',
 Du kan ignorera detta meddelande om kontot skapats av misstag.',
 'usernamehasherror' => 'Användarnamnet får inte innehålla #.',
 'login-throttled' => 'Du har gjort för många misslyckade inloggningsförsök till det här kontot.
-Vänta innan du försöker igen.',
+Vänta $1 innan du försöker igen.',
 'login-abort-generic' => 'Din inloggning misslyckades - Avbröts',
 'loginlanguagelabel' => 'Språk: $1',
 'suspicious-userlogout' => 'Din begäran om att logga ut nekades eftersom det ser ut som det skickades av en trasig webbläsare eller cachande proxy.',
+'createacct-another-realname-tip' => 'Riktiga namnet är valfritt.
+Om du väljer att ange det, kommer det användas för att tillskriva användaren för sitt arbete.',
 
 # Email sending
 'php-mail-error-unknown' => "Okänt fel i PHP's mail()-funktion",
@@ -839,8 +888,7 @@ Vänta innan du försöker igen.',
 'newpassword' => 'Nytt lösenord:',
 'retypenew' => 'Upprepa det nya lösenordet:',
 'resetpass_submit' => 'Spara lösenord och logga in',
-'resetpass_success' => 'Ditt lösenord har ändrats!
-Du loggas nu in…',
+'changepassword-success' => 'Ditt lösenord har ändrats!',
 'resetpass_forbidden' => 'Lösenord kan inte ändras',
 'resetpass-no-info' => 'Du måste vara inloggad för att komma åt den här sidan direkt.',
 'resetpass-submit-loggedin' => 'Ändra lösenord',
@@ -852,10 +900,11 @@ Du kanske redan har lyckats ändra ditt lösenord eller begärt ett nytt tillfä
 
 # Special:PasswordReset
 'passwordreset' => 'Lösenordsåterställning',
-'passwordreset-text' => 'Fyll i detta formulär för att återställa ditt lösenord.',
+'passwordreset-text-one' => 'Fyll i detta formulär för att återställa ditt lösenord.',
+'passwordreset-text-many' => '{{PLURAL:$1|Fyll i ett av fälten för att återställa ditt lösenord.}}',
 'passwordreset-legend' => 'Återställ lösenord',
 'passwordreset-disabled' => 'Lösenordsåterställning har inaktiverats på denna wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ange en av datadelarna nedan}}',
+'passwordreset-emaildisabled' => 'E-postfunktioner har inaktiverats på denna wiki.',
 'passwordreset-username' => 'Användarnamn:',
 'passwordreset-domain' => 'Domän:',
 'passwordreset-capture' => 'Visa resulterande e-post?',
@@ -878,7 +927,7 @@ Du bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna
 Tillfälligt lösenord: $2',
 'passwordreset-emailsent' => 'En lösenordsåterställning via e-post har skickats.',
 'passwordreset-emailsent-capture' => 'En lösenordsåterställning via e-post har skickats, som visas nedan.',
-'passwordreset-emailerror-capture' => 'En lösenordsåterställning via e-post har skapats, som visas nedan, men det gick inte att skicka den till användaren: $1',
+'passwordreset-emailerror-capture' => 'En lösenordsåterställning via e-post har skapats, som visas nedan, men det gick inte att skicka den till {{GENDER:$2|användaren}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ändra e-postadress',
@@ -892,6 +941,19 @@ Tillfälligt lösenord: $2',
 'changeemail-submit' => 'Ändra e-post',
 'changeemail-cancel' => 'Avbryt',
 
+# Special:ResetTokens
+'resettokens' => 'Återställ nycklar',
+'resettokens-text' => 'Du kan återställa nycklar som tillåter åtkomst till vissa privata uppgifter som är associerade till ditt konto här.
+
+Du bör återställa om du av misstag delade dem med någon eller om ditt konto har äventyrats.',
+'resettokens-no-tokens' => 'Det finns inga nycklar att återställa.',
+'resettokens-legend' => 'Återställ nycklar',
+'resettokens-tokens' => 'Nycklar:',
+'resettokens-token-label' => '$1 (aktuellt värde: $2)',
+'resettokens-watchlist-token' => 'Nyckel för webbflöde (Atom/RSS) av [[Special:Watchlist|ändringar i sidor på din bevakningslista]]',
+'resettokens-done' => 'Nycklarna är återställda.',
+'resettokens-resetbutton' => 'Återställ valda nycklar',
+
 # Edit page toolbar
 'bold_sample' => 'Fet text',
 'bold_tip' => 'Fet stil',
@@ -1088,12 +1150,15 @@ Den gav ingen förklaring.',
 Det verkar som att den har raderats.',
 'edit-conflict' => 'Redigeringskonflikt.',
 'edit-no-change' => 'Din redigering ignorerades, eftersom ingen ändring gjordes i texten.',
+'postedit-confirmation' => 'Din redigering sparades.',
 'edit-already-exists' => 'Sidan kunde inte skapas.
 Den finns redan.',
 'defaultmessagetext' => 'Standardtext för meddelande',
 'content-failed-to-parse' => 'Det gick inte att parsa $2 innehåll för $1 modell: $3',
 'invalid-content-data' => 'Ogiltig innehållsdata',
 'content-not-allowed-here' => 'innehåll av "$1" är inte tillåtet på sidan [[$2]]',
+'editwarning-warning' => 'Om du lämnar den här sidan kommer du att förlora alla ändringar du har gjort.
+Om du är inloggad kan du slå av den här varningen under "Redigering" i dina inställningar.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1129,6 +1194,7 @@ Var god och kontrollera jämförelsen nedan för att bekräfta att detta är vad
 'undo-failure' => 'Redigeringen kunde inte göras ogjord på grund av konflikt med mellanliggande redigeringar.',
 'undo-norev' => 'Redigeringen kan inte göras ogjord eftersom den inte finns eller har raderats.',
 'undo-summary' => 'Gör version $1 av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskussion]]) ogjord',
+'undo-summary-username-hidden' => 'Gör version $1 av en dold användare ogjord',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Kan inte skapa konto',
@@ -1310,6 +1376,7 @@ Se till att sidhistorikens kontinuitet behålls när du sammanfogar historik.',
 'compareselectedversions' => 'Jämför angivna versioner',
 'showhideselectedversions' => 'Visa/dölj valda versioner',
 'editundo' => 'gör ogjord',
+'diff-empty' => '(Ingen skillnad)',
 'diff-multi' => '({{PLURAL:$1|En mellanliggande version|$1 mellanliggande versioner}} av {{PLURAL:$2|en användare|$2 användare}} visas inte)',
 'diff-multi-manyusers' => '({{PLURAL:$1|En mellanliggande version|$1 mellanliggande versioner}} av mer än $2 användare visas inte)',
 'difference-missing-revision' => '{{PLURAL:$2|En revision|$2 revisioner}} av denna skillnad ($1) kunde inte hittas.
@@ -1337,7 +1404,6 @@ Detaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchmenu-legend' => 'Sökalternativ',
 'searchmenu-exists' => "'''Det finns en sida med namnet \"[[:\$1]]\" på denna wiki.'''",
 'searchmenu-new' => "'''Skapa sidan \"[[:\$1]]\" på denna wiki!'''",
-'searchhelp-url' => 'Help:Innehåll',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bläddra igenom sidor med detta prefix]]',
 'searchprofile-articles' => 'Innehållssidor',
 'searchprofile-project' => 'Hjälp- och projektsidor',
@@ -1380,15 +1446,7 @@ Detaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchdisabled' => 'Sökfunktionen på {{SITENAME}} är avstängd.
 Du kan istället göra sökningar med hjälp av Google.
 Notera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.',
-
-# Quickbar
-'qbsettings' => 'Snabbmeny',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Fast vänster',
-'qbsettings-fixedright' => 'Fast höger',
-'qbsettings-floatingleft' => 'Flytande vänster',
-'qbsettings-floatingright' => 'Flytande höger',
-'qbsettings-directionality' => 'Fast, beroende på riktningen av ditt skript och språk',
+'search-error' => 'Ett fel uppstod under sökningen: $1',
 
 # Preferences page
 'preferences' => 'Inställningar',
@@ -1422,7 +1480,6 @@ Notera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.',
 'resetprefs' => 'Återställ osparade ändringar',
 'restoreprefs' => 'Återgå till standardinställningar',
 'prefs-editing' => 'Redigering',
-'prefs-edit-boxsize' => 'Storlek på redigeringsfönstret.',
 'rows' => 'Rader:',
 'columns' => 'Kolumner:',
 'searchresultshead' => 'Sökning',
@@ -1433,9 +1490,9 @@ Notera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.',
 'recentchangesdays-max' => '(maximalt $1 {{PLURAL:$1|dygn|dygn}})',
 'recentchangescount' => 'Antal redigeringar som visas som standard:',
 'prefs-help-recentchangescount' => 'Detta inkluderar senaste ändringarna, sidhistorik och loggar.',
-'prefs-help-watchlist-token' => 'Om du fyller i detta fält med en hemlig nyckel så skapas ett RSS-flöde för din bevakningslista.
-Alla som kan nyckeln kan också läsa din bevakningslista, så välj ett säkert värde.
-Här är ett slumpmässigt genererat värde som du kan använda: $1',
+'prefs-help-watchlist-token2' => 'Detta är den hemliga nyckeln till webbflödet i din bevakningslista.
+Någon som vet den kommer att kunna läsa din bevakningslista, så inte dela ut den.
+[[Special:ResetTokens|Klicka här om du behöver återställa den]].',
 'savedprefs' => 'Dina inställningar har sparats',
 'timezonelegend' => 'Tidszon:',
 'localtime' => 'Lokal tid:',
@@ -1466,7 +1523,6 @@ Här är ett slumpmässigt genererat värde som du kan använda: $1',
 'prefs-reset-intro' => 'Du kan använda den här sidan till att återställa dina inställningar till webbplatsens standardinställningar.
 Detta kan inte återställas.',
 'prefs-emailconfirm-label' => 'E-postbekräftelse:',
-'prefs-textboxsize' => 'Storlek på redigeringsrutan',
 'youremail' => 'E-post:',
 'username' => '{{GENDER:$1|Användarnamn}}:',
 'uid' => '{{GENDER:$1|Användar}}-ID:',
@@ -1491,7 +1547,7 @@ Programvaran använder detta värde för att adressera dig till andra med rätt
 'prefs-help-realname' => 'Riktigt namn behöver inte anges.
 Om du väljer att ange ditt riktiga namn, kommer det att användas för att tillskriva dig ditt arbete.',
 'prefs-help-email' => 'Att ange e-postadress är valfritt, men gör det möjligt att få ditt lösenord mejlat till dig om du glömmer det.',
-'prefs-help-email-others' => 'Du kan också välja att låta andra användare kontakta dig genom din användar-eller diskussionssida utan att avslöja din identitet.',
+'prefs-help-email-others' => 'Du kan också välja att låta andra användare kontakta dig genom din användar- eller diskussionssida utan att avslöja din identitet.',
 'prefs-help-email-required' => 'E-postadress måste anges.',
 'prefs-info' => 'Grundläggande information',
 'prefs-i18n' => 'Internationalisering',
@@ -1499,6 +1555,8 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'prefs-dateformat' => 'Datumformat',
 'prefs-timeoffset' => 'Tidsförskjutning',
 'prefs-advancedediting' => 'Allmänna alternativ',
+'prefs-editor' => 'Redigerare',
+'prefs-preview' => 'Förhandsvisa',
 'prefs-advancedrc' => 'Avancerade alternativ',
 'prefs-advancedrendering' => 'Avancerade alternativ',
 'prefs-advancedsearchoptions' => 'Avancerade alternativ',
@@ -1506,7 +1564,9 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'prefs-displayrc' => 'Visningsalternativ',
 'prefs-displaysearchoptions' => 'Visningalternativ',
 'prefs-displaywatchlist' => 'Visningalternativ',
+'prefs-tokenwatchlist' => 'Nyckel',
 'prefs-diffs' => 'Skillnader',
+'prefs-help-prefershttps' => 'Ändringar av denna inställning börjar gälla nästa gång du loggar in',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Ser giltig ut',
@@ -1533,6 +1593,8 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'userrights-notallowed' => 'Du har inte behörighet till att lägga till eller ta bort användarrättigheter.',
 'userrights-changeable-col' => 'Grupper du kan ändra',
 'userrights-unchangeable-col' => 'Grupper du inte kan ändra',
+'userrights-conflict' => 'Konflikt vid ändringar av användarrättigheter! Var god granska och bekräfta dina ändringar.',
+'userrights-removed-self' => 'Du tog bort dina egna rättigheter. Som sådan, kan du inte längre komma åt denna sida.',
 
 # Groups
 'group' => 'Grupp:',
@@ -1598,11 +1660,19 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'right-proxyunbannable' => 'Kan redigera från blockerade proxyer',
 'right-unblockself' => 'Avblockera sig själv',
 'right-protect' => 'Ändra skyddsnivåer och redigera kaskadskyddade sidor',
-'right-editprotected' => 'Redigera skyddade sidor',
+'right-editprotected' => 'Redigera skyddade sidor som "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Redigera skyddade sidor som "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Redigera användargränssnittet',
 'right-editusercssjs' => 'Redigera andra användares CSS- och JS-filer',
 'right-editusercss' => 'Redigera andra användares CSS-filer',
 'right-edituserjs' => 'Redigera andra användares JS-filer',
+'right-editmyusercss' => 'Redigera din egen användares CSS-filer',
+'right-editmyuserjs' => 'Redigera din egen användares JavaScript-filer',
+'right-viewmywatchlist' => 'Visa din egen bevakningslista',
+'right-editmywatchlist' => 'Redigera din egen bevakningslista. Observera att en del åtgärder kommer fortfarande lägga till sidor även utan denna rättighet.',
+'right-viewmyprivateinfo' => 'Visa dina egna privata data (t.ex. e-postadress, riktiga namn)',
+'right-editmyprivateinfo' => 'Redigera dina egen privata data (t.ex. e-postadress, riktiga namn)',
+'right-editmyoptions' => 'Redigera dina egna inställningar',
 'right-rollback' => 'Rulla tillbaka den användare som senast redigerat en sida',
 'right-markbotedits' => 'Markera tillbakarullningar som robotändringar',
 'right-noratelimit' => 'Påverkas inte av hastighetsgränser',
@@ -1664,12 +1734,19 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'action-userrights-interwiki' => 'ändra rättigheter för användare på andra wikier',
 'action-siteadmin' => 'låsa eller låsa upp databasen',
 'action-sendemail' => 'skicka e-post',
+'action-editmywatchlist' => 'redigera din bevakningslista',
+'action-viewmywatchlist' => 'visa din bevakningslista',
+'action-viewmyprivateinfo' => 'visa din privata information',
+'action-editmyprivateinfo' => 'redigera din privata information',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|ändring|ändringar}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sedan senaste besöket}}',
+'enhancedrc-history' => 'historik',
 'recentchanges' => 'Senaste ändringarna',
 'recentchanges-legend' => 'Alternativ för senaste ändringarna',
 'recentchanges-summary' => 'Följ de senaste ändringarna i wikin på denna sida.',
+'recentchanges-noresult' => 'Inga ändringar under den angivna perioden matchar dessa kriterier.',
 'recentchanges-feed-description' => 'Följ de senaste ändringarna i wikin genom den här matningen.',
 'recentchanges-label-newpage' => 'Denna redigering skapade en ny sida',
 'recentchanges-label-minor' => 'Detta är en mindre ändring',
@@ -1706,7 +1783,6 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'recentchangeslinked-feed' => 'Relaterade ändringar',
 'recentchangeslinked-toolbox' => 'Relaterade ändringar',
 'recentchangeslinked-title' => 'Ändringar relaterade till $1',
-'recentchangeslinked-noresult' => 'Inga ändringar på länkade sidor under den angivna tidsperioden.',
 'recentchangeslinked-summary' => "Detta är en lista över de senaste ändringarna på sidor som länkas till från en given sida (eller på sidor som hör till en viss kategori).
 Sidor på [[Special:Watchlist|din bevakningslista]] är markerade med '''fetstil'''.",
 'recentchangeslinked-page' => 'Sidnamn:',
@@ -1718,7 +1794,7 @@ Sidor på [[Special:Watchlist|din bevakningslista]] är markerade med '''fetstil
 'reuploaddesc' => 'Avbryt uppladdningen och gå tillbaka till uppladdningsformuläret.',
 'upload-tryagain' => 'Skicka modifierad filbeskrivning',
 'uploadnologin' => 'Inte inloggad',
-'uploadnologintext' => 'Du måste vara [[Special:UserLogin|inloggad]] för att kunna ladda upp filer.',
+'uploadnologintext' => 'Du måste $1 för att ladda upp filer.',
 'upload_directory_missing' => 'Uppladdningskatalogen ($1) saknas och kunde inte skapas av webbservern.',
 'upload_directory_read_only' => 'Webbservern kan inte skriva till uppladdningskatalogen ($1).',
 'uploaderror' => 'Fel vid uppladdningen',
@@ -1946,7 +2022,6 @@ För optimal säkerhet, har img_auth.php blivit avaktiverad.',
 'http-read-error' => 'HTTP-läsfel.',
 'http-timed-out' => 'Time out för HTTP-begäran.',
 'http-curl-error' => 'Fel vid hämtning av URL: $1',
-'http-host-unreachable' => 'URL:en kunde inte nås.',
 'http-bad-status' => 'Det uppstod ett problem under HTTP-begäran: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1974,6 +2049,10 @@ För optimal säkerhet, har img_auth.php blivit avaktiverad.',
 'listfiles_size' => 'Storlek (byte)',
 'listfiles_description' => 'Beskrivning',
 'listfiles_count' => 'Versioner',
+'listfiles-show-all' => 'Visa även äldre versioner av bilder',
+'listfiles-latestversion' => 'Nuvarande version',
+'listfiles-latestversion-yes' => 'Ja',
+'listfiles-latestversion-no' => 'Nej',
 
 # File description page
 'file-anchor-link' => 'Fil',
@@ -2070,6 +2149,13 @@ Innan mallarna raderas, kontrollera att det inte finns andra länkar till dem.',
 'randompage' => 'Slumpsida',
 'randompage-nopages' => 'Det finns inte några sidor i följande {{PLURAL:$2|namnrymd|namnrymder}}: $1.',
 
+# Random page in category
+'randomincategory' => 'Slumpsida i kategori',
+'randomincategory-invalidcategory' => '"$1" är inte ett giltigt kategorinamn.',
+'randomincategory-nopages' => 'Det finns inga sidor i [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Få slumpsida från kategori: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Gå',
+
 # Random redirect
 'randomredirect' => 'Slumpvald omdirigering',
 'randomredirect-nopages' => 'Det finns inte några omdirigeringar i namnrymden "$1".',
@@ -2095,17 +2181,13 @@ Innan mallarna raderas, kontrollera att det inte finns andra länkar till dem.',
 'statistics-users-active-desc' => 'Användare som utfört någon åtgärd under {{PLURAL:$1|det senaste dygnet|de senaste $1 dygnen}}',
 'statistics-mostpopular' => 'Mest besökta sidor',
 
-'disambiguations' => 'Sidor som länkar till förgreningssidor',
-'disambiguationspage' => 'Template:Förgrening',
-'disambiguations-text' => "Följande sidorna innehåller minst en länk till en '''förgreningssida'''.
-De bör troligtvis ändras så att de länkar till en mer passande sida istället.<br />
-En sida anses vara en förgreningssida om den inkluderar en mall som länkas till från [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Sidor med en sidegenskap',
 'pageswithprop-legend' => 'Sidor med en sidegenskap',
 'pageswithprop-text' => 'Denna sida listar sidor som använder en speciell sidegenskap.',
 'pageswithprop-prop' => 'Egenskapsnamn:',
 'pageswithprop-submit' => 'Gå',
+'pageswithprop-prophidden-long' => 'dold långt textegenskapsvärde ($1)',
+'pageswithprop-prophidden-binary' => 'dold binärt egenskapsvärde ($1)',
 
 'doubleredirects' => 'Dubbla omdirigeringar',
 'doubleredirectstext' => 'Det här är en lista över sidor som dirigerar om till andra omdirigeringssidor. 
@@ -2163,6 +2245,7 @@ Varje rad innehåller länkar till den första och andra omdirigeringsidan, samt
 'mostrevisions' => 'Sidor med flest ändringar',
 'prefixindex' => 'Alla sidor med prefix',
 'prefixindex-namespace' => 'Alla sidor med prefix ($1 namnrymder)',
+'prefixindex-strip' => 'Avlägsna prefix i lista',
 'shortpages' => 'Korta sidor',
 'longpages' => 'Långa sidor',
 'deadendpages' => 'Sidor utan länkar',
@@ -2178,6 +2261,7 @@ Varje rad innehåller länkar till den första och andra omdirigeringsidan, samt
 'listusers' => 'Användarlista',
 'listusers-editsonly' => 'Visa endast användare som redigerat',
 'listusers-creationsort' => 'Sortera efter datum skapat',
+'listusers-desc' => 'Sortera i fallande ordning',
 'usereditcount' => '$1 {{PLURAL:$1|redigering|redigeringar}}',
 'usercreated' => '{{GENDER:$3|Skapat}} $1 $2',
 'newpages' => 'Nya sidor',
@@ -2354,10 +2438,9 @@ Framtida ändringar av den här sidan och dess diskussionssida kommer att listas
 'unwatchthispage' => 'Sluta bevaka',
 'notanarticle' => 'Inte en artikel',
 'notvisiblerev' => 'Sidversionen har raderats',
-'watchnochange' => 'Inga av dina bevakade sidor har ändrats inom den visade tidsperioden.',
 'watchlist-details' => 'Du har $1 {{PLURAL:$1|sida|sidor}} på din bevakningslista (diskussionssidor är inte medräknade).',
-'wlheader-enotif' => '* Bekräftelse per e-post är aktiverad.',
-'wlheader-showupdated' => "* Sidor som har ändrats sedan ditt senaste besök visas i '''fetstil.'''",
+'wlheader-enotif' => 'E-postmeddelanden är aktiverade.',
+'wlheader-showupdated' => "Sidor som har ändrats sedan ditt senaste besök visas i '''fetstil.'''",
 'watchmethod-recent' => 'letar efter bevakade sidor bland senaste ändringar',
 'watchmethod-list' => 'letar efter nyligen gjorda ändringar bland bevakade sidor',
 'watchlistcontains' => 'Din bevakningslista innehåller $1 {{PLURAL:$1|sida|sidor}}.',
@@ -2603,7 +2686,7 @@ $1',
 'contributions' => '{{GENDER:$1|Användarbidrag}}',
 'contributions-title' => 'Bidrag av $1',
 'mycontris' => 'Bidrag',
-'contribsub2' => 'För $1 ($2)',
+'contribsub2' => 'För {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Inga ändringar som motsvarar dessa kriterier hittades.',
 'uctop' => '(senaste)',
 'month' => 'Från månad (och tidigare):',
@@ -2761,14 +2844,12 @@ Se [[Special:BlockList|blockeringslistan]] för en översikt av gällande blocke
 'ipb_blocked_as_range' => 'Fel: IP-adressen $1 är inte direkt blockerad, och kan därför inte avblockeras. Adressen är blockerad som en del av IP-intervallet $2, som kan avblockeras.',
 'ip_range_invalid' => 'Ogiltigt IP-intervall.',
 'ip_range_toolarge' => 'Blockering av block större än /$1 är inte tillåtna.',
-'blockme' => 'Blockera mig',
 'proxyblocker' => 'Proxy-block',
-'proxyblocker-disabled' => 'Den här funktionen är avaktiverad.',
 'proxyblockreason' => 'Din IP-adress har blivit blockerad eftersom den tillhör en öppen proxy. Kontakta din internetleverantör eller din organisations eller företags tekniska support, och informera dem om denna allvarliga säkerhetsrisk.',
-'proxyblocksuccess' => 'Gjort.',
 'sorbsreason' => 'Din IP-adress är listad som öppen proxy i den DNSBL {{SITENAME}} använder.',
 'sorbs_create_account_reason' => 'Din IP-adress är listad som en öppen proxy i den DNSBL som används av {{SITENAME}}.
 Du får inte skapa ett användarkonto',
+'xffblockreason' => 'En IP-adress i sidhuvudet X-Forwarded-For, antingen din adress eller en proxyserver som du använder, har blockerats. Den ursprungliga anledningen till blockeringen var: $1',
 'cant-block-while-blocked' => 'Du kan inte blockera andra användare medan du är blockerad.',
 'cant-see-hidden-user' => 'Användaren du försöker blockera är redan blockerad och gömd. Eftersom du inte har hideuser-rättigheter, kan du inte se eller redigera användarens blockering.',
 'ipbblocked' => 'Du kan inte blockera eller avblockera andra användare, eftersom du själv är blockerad',
@@ -2931,6 +3012,8 @@ Besök [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] eller [//t
 'thumbnail-more' => 'Förstora',
 'filemissing' => 'Fil saknas',
 'thumbnail_error' => 'Fel vid skapande av miniatyrbild: $1',
+'thumbnail_error_remote' => 'Felmeddelande från $1:
+$2',
 'djvu_page_error' => 'DjVu-sida utanför gränserna',
 'djvu_no_xml' => 'Kan inte hämta DjVu-filens XML',
 'thumbnail-temp-create' => 'Kunde inte skapa temporär miniatyrfil',
@@ -3078,20 +3161,15 @@ Vänligen använd förhandsgranskningsknappen innan du sparar.',
 Ger möjlighet att skriva en motivering i redigeringssammanfattningen',
 'tooltip-preferences-save' => 'Spara inställningar',
 'tooltip-summary' => 'Skriv en kort sammanfattning',
+'tooltip-iwiki' => '$1 - $2',
 
 # Stylesheets
 'common.css' => '/* CSS som skrivs här påverkar alla skal */',
-'standard.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Standard */',
-'nostalgia.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Nostalgi */',
 'cologneblue.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Cologne blå */',
 'monobook.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Monobook */',
-'myskin.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Mitt utseende */',
-'chick.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Chick */',
-'simple.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Enkel */',
 'modern.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Modern */',
 'vector.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Vector */',
 'print.css' => '/* CSS som skrivs här kommer att påverka utskriftsversionen */',
-'handheld.css' => '/* CSS som placeras här kommer att påverka handhållna enheter som baseras på skalet som konfigurerats i $wgHandheldStyle */',
 'noscript.css' => '/* CSS som placeras här kommer att påverka användare med JavaScript inaktiverat */',
 'group-autoconfirmed.css' => '/* CSS som placeras här kommer bara att påverka bekräftade användare */',
 'group-bot.css' => '/* CSS som placeras här kommer bara att påverka robotar */',
@@ -3100,13 +3178,8 @@ Ger möjlighet att skriva en motivering i redigeringssammanfattningen',
 
 # Scripts
 'common.js' => '/* JavaScript som skrivs här körs varje gång en användare laddar en sida. */',
-'standard.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Standard */',
-'nostalgia.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Nostalgi */',
 'cologneblue.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Cologne blå */',
 'monobook.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Monobook */',
-'myskin.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Mitt utseende */',
-'chick.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Chick */',
-'simple.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Enkel */',
 'modern.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Modern */',
 'vector.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Vector */',
 'group-autoconfirmed.js' => '/* JavaScript här kommer att laddas för bekräftade användare */',
@@ -3186,13 +3259,8 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
 'pageinfo-category-files' => 'Antal filer',
 
 # Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Nostalgi',
 'skinname-cologneblue' => 'Cologne blå',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Mitt utseende',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Enkel',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -3272,11 +3340,25 @@ Om du kör den kan din dator skadas.",
 'minutes' => '{{PLURAL:$1|$1 minut|$1 minuter}}',
 'hours' => '{{PLURAL:$1|$1 timme|$1 timmar}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dagar}}',
+'weeks' => '{{PLURAL:$1|$1 vecka|$1 veckor}}',
 'months' => '{{PLURAL:$1|$1 månad|$1 månader}}',
 'years' => '{{PLURAL:$1|$1 år}}',
 'ago' => '$1 sedan',
 'just-now' => 'precis nu',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|timme|timmar}} sedan',
+'minutes-ago' => '$1 {{PLURAL:$1|minut|minuter}} sedan',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund|sekunder}} sedan',
+'monday-at' => 'Måndag kl. $1',
+'tuesday-at' => 'Tisdag kl. $1',
+'wednesday-at' => 'Onsdag kl. $1',
+'thursday-at' => 'Torsdag kl. $1',
+'friday-at' => 'Fredag kl. $1',
+'saturday-at' => 'Lördag kl. $1',
+'sunday-at' => 'Söndag kl. $1',
+'yesterday-at' => 'Igår kl. $1',
+
 # Bad image list
 'bad_image_list' => 'Listan fungerar enligt följande:
 
@@ -3305,7 +3387,7 @@ Andra kommer att gömmas som standard
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Bredd',
 'exif-imagelength' => 'Höjd',
 'exif-bitspersample' => 'Bitar per komponent',
@@ -3483,7 +3565,7 @@ Andra kommer att gömmas som standard
 'exif-originalimageheight' => 'Bildens höjd innan den beskärdes',
 'exif-originalimagewidth' => 'Bildens bredd innan den beskärdes',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Inte komprimerad',
 'exif-compression-2' => 'CCITT Grupp 3 1-dimensionell modifierad Huffman-skurlängdskodning',
 'exif-compression-3' => 'CCITT Grupp 3 fax-kodning',
@@ -3876,7 +3958,6 @@ Du kan också [[Special:EditWatchlist|använda standardeditorn]].',
 'version-other' => 'Annat',
 'version-mediahandlers' => 'Mediahanterare',
 'version-hooks' => 'Hakar',
-'version-extension-functions' => 'Tilläggsfunktioner',
 'version-parser-extensiontags' => 'Tilläggstaggar',
 'version-parser-function-hooks' => 'Parserfunktioner',
 'version-hook-name' => 'Namn',
@@ -3885,6 +3966,7 @@ Du kan också [[Special:EditWatchlist|använda standardeditorn]].',
 'version-license' => 'Licens',
 'version-poweredby-credits' => "Den här wikin drivs av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'andra',
+'version-poweredby-translators' => 'översättare från translatewiki.net',
 'version-credits-summary' => 'Vi skulle vilja tacka följande personer för deras bidrag till [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki är fri programvara; du kan distribuera det och/eller modifiera det under villkoren i GNU General Public License, publicerad av Free Software Foundation; antingen version 2 av licensen, eller (om du önskar) någon senare version. 
 
@@ -3898,12 +3980,17 @@ Du bör ha fått [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopia av GNU General Publi
 'version-entrypoints-header-entrypoint' => 'Startpunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Sökväg till fil',
-'filepath-page' => 'Fil:',
-'filepath-submit' => 'Sökväg',
-'filepath-summary' => 'Den här specialsidan ger den fullständiga sökvägen till en fil.
-Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som är associerade till dem.',
+# Special:Redirect
+'redirect' => 'Omdirigering efter filnamn, användar-ID eller versions-ID',
+'redirect-legend' => 'Omdirigera till en fil eller sida',
+'redirect-summary' => 'Den här specialsidan omdirigerar till en fil (efter filnamn), en sida (efter versions-id) eller en användarsida (efter användar-id).',
+'redirect-submit' => 'Kör',
+'redirect-lookup' => 'Slå upp:',
+'redirect-value' => 'Värde:',
+'redirect-user' => 'Användar-ID',
+'redirect-revision' => 'Sidversion',
+'redirect-file' => 'Filnamn',
+'redirect-not-exists' => 'Värdet hittades inte',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Sök efter dubblettfiler',
@@ -3953,12 +4040,16 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
 'tags' => 'Giltiga ändringsmärken',
 'tag-filter' => 'Filter för [[Special:Tags|märken]]:',
 'tag-filter-submit' => 'Filter',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Märke|Märken}}]]: $2)',
 'tags-title' => 'Märken',
 'tags-intro' => 'Denna sida listar märkena som mjukvaran kan markera en redigering med, och deras betydelse.',
 'tags-tag' => 'Märkesnamn',
 'tags-display-header' => 'Utseende på listor över ändringar',
 'tags-description-header' => 'Full beskrivning av betydelse',
+'tags-active-header' => 'Aktiv?',
 'tags-hitcount-header' => 'Märkta ändringar',
+'tags-active-yes' => 'Ja',
+'tags-active-no' => 'Nej',
 'tags-edit' => 'redigera',
 'tags-hitcount' => '$1 {{PLURAL:$1|ändring|ändringar}}',
 
@@ -3979,6 +4070,7 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
 'dberr-problems' => 'Ursäkta! Denna sajt har just nu tekniska problem.',
 'dberr-again' => 'Pröva med att vänta några minuter och ladda om.',
 'dberr-info' => '(Kan inte kontakta databasservern: $1)',
+'dberr-info-hidden' => '(Kan inte kontakta databasservern)',
 'dberr-usegoogle' => 'Du kan pröva att söka med Google under tiden.',
 'dberr-outofdate' => 'Observera att deras index av vårt innehåll kan vara föråldrat.',
 'dberr-cachederror' => 'Följande är en cachad kopia av den efterfrågade sidan, och kan vara föråldrad.',
@@ -3994,6 +4086,9 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
 'htmlform-submit' => 'Spara',
 'htmlform-reset' => 'Ogör ändringar',
 'htmlform-selectorother-other' => 'Andra',
+'htmlform-no' => 'Nej',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Välj ett alternativ',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 med stöd för fulltextsökning',
@@ -4111,4 +4206,19 @@ Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att lä
 # Image rotation
 'rotate-comment' => 'Bilden roteras $1 {{PLURAL:$1|grad|grader}} medurs',
 
+# Limit report
+'limitreport-title' => 'Profildata för parser:',
+'limitreport-cputime' => 'Processortidsanvändning',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'limitreport-walltime' => 'Realtidsanvändning',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'limitreport-ppvisitednodes' => 'Antal nodbesök för preprocessor',
+'limitreport-ppgeneratednodes' => 'Antal noder genererade av preprocessor',
+'limitreport-postexpandincludesize' => 'Inkluderad storlek efter mallutvidgning',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|byte}}',
+'limitreport-templateargumentsize' => 'Storlek på mallargument',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|byte}}',
+'limitreport-expansiondepth' => 'Största expansionsdjup',
+'limitreport-expensivefunctioncount' => 'Antal dyra parser-funktioner',
+
 );
diff --git a/languages/messages/MessagesSw.php b/languages/messages/MessagesSw.php
index 973f6f90..d8ef3761 100644
--- a/languages/messages/MessagesSw.php
+++ b/languages/messages/MessagesSw.php
@@ -14,6 +14,7 @@
  * @author Malangali
  * @author Marcos
  * @author Muddyb Blast Producer
+ * @author Nemo bis
  * @author Robert Ullmann
  * @author Stephenwanjau
  * @author לערי ריינהארט
@@ -154,9 +155,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Onyesha idadi ya watumiaji waangalizi',
 'tog-oldsig' => 'Sahihi iliyopo:',
 'tog-fancysig' => 'Weka sahihi tu (bila kujiweka kiungo yenyewe)',
-'tog-externaleditor' => 'Tumia kiharirio cha nje inaposhindikana (kwa wataalamu tu, inahitaji marekebisho maalum kwenye tarakilishi yako. [//www.mediawiki.org/wiki/Manual:External_editors Maelezo zaidi.])',
-'tog-externaldiff' => 'Tumia diff za nje inaposhindikana (kwa wataalamu tu, inahitaji marekebisho maalum kwenye tarakilishi yako. [//www.mediawiki.org/wiki/Manual:External_editors Maelezo zaidi.])',
-'tog-showjumplinks' => 'Wezesha "ruka hadi" viungo vya mafikio',
 'tog-uselivepreview' => 'Tumia kihakikio cha papohapo (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Nishtue pale ninapoingiza muhtasari mtupu wa kuhariri',
 'tog-watchlisthideown' => 'Ficha kuhariri kwangu kwenye orodha ya maangalizi',
@@ -170,6 +168,7 @@ $messages = array(
 'tog-showhiddencats' => 'Onyesha jamii zilizofichwa',
 'tog-noconvertlink' => 'Lemaza kiungo cha jina la badiliko',
 'tog-norollbackdiff' => 'Ondoa faili za diff baada ya kufanyakazi ya kurejesha',
+'tog-useeditwarning' => 'Unionyeshe ilani ninapotaka kutoka kwenye ukurasa ninouhariri, bila kuhifadhi mabadiliko',
 
 'underline-always' => 'Muda wote',
 'underline-never' => 'Kamwe',
@@ -233,6 +232,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Des',
+'january-date' => '$1 Januari',
+'february-date' => '$1 Februari',
+'march-date' => '$1 Machi',
+'april-date' => '$1 Aprili',
+'may-date' => '$1 Mei',
+'june-date' => '$1 Juni',
+'july-date' => '$1 Julai',
+'august-date' => '$1 Agosti',
+'september-date' => '$1 Septemba',
+'october-date' => '$1 Oktoba',
+'november-date' => '$1 Novemba',
+'december-date' => '$1 Desemba',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Jamii}}',
@@ -356,7 +367,7 @@ $1',
 'pool-queuefull' => 'Foleni ya michakato imejaa',
 'pool-errorunknown' => 'Hitilafu isiyojulikana',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Kuhusu {{SITENAME}}',
 'aboutpage' => 'Project:Kuhusu',
 'copyright' => 'Yaliyomo yafuata $1.',
@@ -366,7 +377,6 @@ $1',
 'disclaimers' => 'Kanusho',
 'disclaimerpage' => 'Project:Kanusho kwa jumla',
 'edithelp' => 'Usaidizi kwa uhariri',
-'edithelppage' => 'Help:Usaidizi kwa uhariri',
 'helppage' => 'Help:Yaliyomo',
 'mainpage' => 'Mwanzo',
 'mainpage-description' => 'Mwanzo',
@@ -444,17 +454,6 @@ Orodha ya kurasa maalumu zinapatika kwenye [[Special:SpecialPages|{{int:kurasama
 # General errors
 'error' => 'Hitilafu',
 'databaseerror' => 'Hitilafu ya hifadhidata',
-'dberrortext' => 'Shina la kuulizia kihifadhidata kuna hitilafu imetokea.
-Hii inaweza kuashiria kuna mdudu katika bidhaa pepe.
-Jaribio la ulizio la mwisho la kihifadhidata lilikuwa:
-<blockquote><tt>$1</tt></blockquote>
-kutoka ndani ya kitendea "<tt>$2</tt>".
-Kihifadhidata kikarejesha tatizo "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Shina la kuulizia kihifadhidata kuna hitilafu imetokea.
-Jaribio la ulizio la mwisho la kihifadhidata lilikuwa:
-"$1"
-kutoka ndani ya kitendea "$2".
-Kihifadhidata kikarejesha tatizo "<tt>$3: $4</tt>".',
 'laggedslavemode' => "'''Ilani:'''Labda masahihisho ya hivi karibuni bado hayajaonekana.",
 'readonly' => 'Hifadhidata imefungika',
 'enterlockreason' => 'Ingiza sababu za kufunga, pamoja na makisio yake lini itafunguliwa',
@@ -507,7 +506,6 @@ Tafadhali jaribu tena baada ya muda mfupi.',
 'editinginterface' => "'''Ilani:''' Una hariri ukurasa unaotumika kutoa maelezo ya msingi ya bidhaa pepe.
 Mabadiliko katika ukurasa huu yataathiri mwonekano mzima wa viungo vya watumiaji wengine.
 Kwa lengo la kutaka kutafsiri, tafadhali fikiria kutumia  [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], kwa kuweka miradi ya MediaWiki kwa kienyeji.",
-'sqlhidden' => '(maulizo ya SQL yamefichwa)',
 'cascadeprotected' => 'Ukurasa huu umekingwa usihaririwe, kwa sababu umejumlishwa katika {{PLURAL:$1|ukurasa ufuatao, ambao umekingwa|kurasa zifuatazo, ambazo zimekingwa}} na chagua la "cascadi" iliwashwa:
 $2',
 'namespaceprotected' => "Huna ruhusa ya kuhariri kurasa za eneo la wiki la '''$1'''.",
@@ -530,10 +528,13 @@ Sababu zilizotolewa ni "\'\'$2\'\'".',
 Unaweza kuendelea kutumia {{SITENAME}} bila kutaja jina lako, au unaweza <span class='plainlinks'>[$1 kuingia tena]</span> kwenye akaunti yako. Kumbuka kwamba kurasa nyingine zitaendelea kuonekana kana kwamba bado hujatoka kwenye akaunti yako, hadi utakaposafisha kache ya kivinjari.",
 'welcomeuser' => 'Karibu, $1!',
 'yourname' => 'Jina la mtumiaji:',
+'userlogin-yourname' => 'Jina la mtumiaji',
+'userlogin-yourname-ph' => 'Weka jina lako la mtumiaji',
 'yourpassword' => 'Neno la siri:',
+'userlogin-yourpassword' => 'Neno la siri',
+'userlogin-yourpassword-ph' => 'Weka neno lako la siri',
 'yourpasswordagain' => 'Andika tena neno la siri',
 'remembermypassword' => 'Kumbuka kuingia kwangu katika kivinjari hiki (kwa muda usiozidi {{PLURAL:$1|siku}} $1)',
-'securelogin-stick-https' => 'Endelea kuunganishwa na HTTPS baada ya kuingia',
 'yourdomainname' => 'Tovuti yako:',
 'password-change-forbidden' => 'Hauwezi kubadili nywila katika Wiki hii.',
 'externaldberror' => 'Huenda kulikuwa na hitilafu ya database au labda hauruhusiwi kubadilisha akaunti yako ya nje.',
@@ -545,6 +546,8 @@ Unaweza kuendelea kutumia {{SITENAME}} bila kutaja jina lako, au unaweza <span c
 'logout' => 'Toka',
 'userlogout' => 'Toka',
 'notloggedin' => 'Hujaingia',
+'userlogin-noaccount' => 'Huna akaunti ya kuingilia?',
+'userlogin-joinproject' => 'Jiunga na {{SITENAME}}',
 'nologin' => "Huna akaunti ya kuingilia? '''$1'''.",
 'nologinlink' => 'Sajili akaunti',
 'createaccount' => 'Sajili akaunti',
@@ -638,7 +641,7 @@ Kumalizia kuingia ndani, ni lazima urekebishe neno la siri jipya hapa:',
 'newpassword' => 'Neno jipya la siri:',
 'retypenew' => 'Andika neno la siri tena:',
 'resetpass_submit' => 'Rekebisha neno la siri na uingie',
-'resetpass_success' => 'Neno lako la siri limefanikiwa kubadilishwa! Sasa unaingia...',
+'changepassword-success' => 'Neno lako la siri limefanikiwa kubadilishwa! Sasa unaingia...',
 'resetpass_forbidden' => 'Maneno ya siri hayawezi kubadilishwa',
 'resetpass-no-info' => 'Lazima uwe umeingia ili kuweza kutumia kurasa hii moja kwa moja.',
 'resetpass-submit-loggedin' => 'Badilisha neno la siri',
@@ -649,10 +652,8 @@ Inawezekana ikawa tayari umefaulu kubadilisha neno lako la siri au neno la siri
 
 # Special:PasswordReset
 'passwordreset' => 'Seti upya neno la siri',
-'passwordreset-text' => 'Jaza fomu hii ili upate barua pepe inayotoa maelezo ya akaunti yako.',
 'passwordreset-legend' => 'Seti upya neno la siri',
 'passwordreset-disabled' => 'Kuweka neno la siri jipya kumeshitishwa katika wiki hii.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ingiza moja kati ya data hizi hapo chini}}',
 'passwordreset-username' => 'Jina la mtumiaji:',
 'passwordreset-domain' => 'Miliki',
 'passwordreset-capture' => 'Ioneshe barua-pepe itakayotumwa?',
@@ -884,6 +885,8 @@ Inaonekana kwamba ukurasa umefutwa.',
 'edit-already-exists' => 'Haikufanikiwa kuanzisha ukurasa mpya.
 Ukurasa wa jina hilo unapatikana tayari.',
 'defaultmessagetext' => 'Ujumbe uliopo',
+'editwarning-warning' => 'Ukitoka kwenye ukurasa huu labda utapoteza madabiliko uliyoyafanya.
+Unaweza kuondoa ilani hii ukienda kwenye sehemu ya "{{int:prefs-editing}}" kwenye mapendekezo yako.',
 
 # Content models
 'content-model-javascript' => 'HatiJava',
@@ -1077,7 +1080,6 @@ Tazama [[Special:BlockList|IP block orodha ya uzuio wa IP]] kuona orodha ya zuio
 'searchmenu-legend' => 'Hitiari za kutafuta',
 'searchmenu-exists' => "'''Ukurasa wa \"[[:\$1]]\" upo kwenye wiki hii'''",
 'searchmenu-new' => "'''Anzisha ukurasa wa \"[[:\$1]]\" katika wiki hii!'''",
-'searchhelp-url' => 'Help:Yaliyomo',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Tafuta kurasa kwenye eneo hili la wiki]]',
 'searchprofile-articles' => 'Kurasa kwa kusudi ya wiki',
 'searchprofile-project' => 'Kurasa za msaada na za mradi',
@@ -1122,14 +1124,6 @@ Ukitaka kutafuta kwenye maeneo yote (pamoja na kurasa za majadiliano, vigezo, nk
 Unaweza kutafuta kwa kutumia Google punde si punde.
 Ujue lakini kwamba kumbukumbu za {{SITENAME}} kule Google labda zilipitwa na wakati.',
 
-# Quickbar
-'qbsettings' => 'Mwambaa pembe',
-'qbsettings-none' => 'Hakuna',
-'qbsettings-fixedleft' => 'Kushoto tuli',
-'qbsettings-fixedright' => 'Kulia tuli',
-'qbsettings-floatingleft' => 'Kushoto geugeu',
-'qbsettings-floatingright' => 'Kulia geugeu',
-
 # Preferences page
 'preferences' => 'Mapendekezo',
 'mypreferences' => 'Mapendekezo',
@@ -1162,7 +1156,6 @@ Ujue lakini kwamba kumbukumbu za {{SITENAME}} kule Google labda zilipitwa na wak
 'resetprefs' => 'Utupe mabadiliko yasijahifadhika',
 'restoreprefs' => 'Rudisha mapendekezo ya msingi',
 'prefs-editing' => 'Kuhariri',
-'prefs-edit-boxsize' => 'Ukubwa wa dirisha la kuhariri.',
 'rows' => 'Mistari:',
 'columns' => 'Safu:',
 'searchresultshead' => 'Kutafuta',
@@ -1173,9 +1166,6 @@ Ujue lakini kwamba kumbukumbu za {{SITENAME}} kule Google labda zilipitwa na wak
 'recentchangesdays-max' => 'Isizidi {{PLURAL:$1|siku}} $1',
 'recentchangescount' => 'Idadi ya masahihisho yatakayoonyeshwa kwa kawaida:',
 'prefs-help-recentchangescount' => 'Kwenye kurasa za mabadiliko ya karibuni, za historia ya ukurasa, na za kumbukumbu.',
-'prefs-help-watchlist-token' => 'Ukiandika ufunguo wa siri kwenye kisanduku hiki, programu itaanzisha tawanyiko la RSS kwa ajili ya maangalizi yako.
-Mtu wowote anayejua ufunguo wa siri huu ataweza kusoma orodha yako ya maangalizi, kwa hiyo chagua ufunguo salama.
-Hapo kuna ufunguo uliotolewa na programu kwa kubahatisha, ambao unaweza kuutumia: $1',
 'savedprefs' => 'Mapendekezo yako yamehifadhiwa.',
 'timezonelegend' => 'Ukanda saa:',
 'localtime' => 'Saa ya kwetu:',
@@ -1206,7 +1196,6 @@ Hapo kuna ufunguo uliotolewa na programu kwa kubahatisha, ambao unaweza kuutumia
 'prefs-reset-intro' => 'Unaweza kutumia ukurasa huu ili kurudisha mapendekezo yako kwenye yale ya msingi ya tovuti.
 Hutaweza kulibatilisha tendo hili baadaye.',
 'prefs-emailconfirm-label' => 'Kuhakikisha barua pepe:',
-'prefs-textboxsize' => 'Ukubwa wa sanduku la kuhariri',
 'youremail' => 'Barua pepe yako:',
 'username' => 'Jina la mtumiaji:',
 'uid' => 'Namba ya mtumiaji:',
@@ -1427,7 +1416,6 @@ Taarifa hii itakuwa wazi.',
 'recentchangeslinked-feed' => 'Mabadiliko husika',
 'recentchangeslinked-toolbox' => 'Mabadiliko husika',
 'recentchangeslinked-title' => 'Mabadiliko kuhusiana na "$1"',
-'recentchangeslinked-noresult' => 'Hakuna mabadiliko kwenye kurasa zilizounganishwa wakati wa muda huo.',
 'recentchangeslinked-summary' => "Ukurasa maalum huu unaorodhesha mabadiliko ya hivi karibuni katika kurasa zinazoungwa (au katika jamii fulani).  Kurasa katika [[Special:Watchlist|maangalizi yako]] ni za '''koze'''.",
 'recentchangeslinked-page' => 'Jina la ukurasa:',
 'recentchangeslinked-to' => 'Onyesha mabadiliko yaliyotokea kwenye kurasa zile zinazoungwa kufikia ukurasa uliotajwa',
@@ -1609,7 +1597,6 @@ Haliwezi kukaguliwa vilivyo kwa sababu za kiusalama.',
 'http-read-error' => 'Hitilafu ya kusoma HTTP.',
 'http-timed-out' => 'Ombi la HTTP muda umepita.',
 'http-curl-error' => 'Hitilafu ya kuleta URL: $1',
-'http-host-unreachable' => 'KISARA (URL) haikupatikana',
 'http-bad-status' => 'Kulikuwa na tatizo wakati wa kutekeleza ombi la HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1761,12 +1748,6 @@ Kumbuka kuhakikisha kwamba hakuna viungo vingine vinavyoelekea kigezo fulani kab
 'statistics-users-active-desc' => 'Watumiaji waliofanya kazi katika siku {{PLURAL:$1|iliyopita|$1 zilizopita}}',
 'statistics-mostpopular' => 'Kurasa zinazotazamwa sana',
 
-'disambiguations' => 'Kurasa zinazoungana na kurasa za uanishaji',
-'disambiguationspage' => 'Template:Maana',
-'disambiguations-text' => "Kurasa zinazofuata zina angalau kiungo kimoja kinachoelekea kwa '''kurasa ya kutofautishana maana'''.
-Ni afadhali kiungo kiende makala yanayostahili moja kwa moja.<br />
-Ukurasa unatibiwa kama ukurasa wa kutofautishana maana inazotumia kigezo kinachoorodheshwa katika ukurasa wa [[MediaWiki:Disambiguationspage]].",
-
 'doubleredirects' => 'Maelekezo mawilimawili',
 'doubleredirectstext' => 'Ukurasa huu unaorodhesha kurasa zinazoelekeza kurasa zingine za kuelekeza.
 Katika kila mstari kuna viungo vinavyokwenda katika kurasa za kuelekeza zote mbili, pamoja na ukurasa wa mwishilio mwa elekezo la pili. Ukurasa huu wa mwishilio huwa ni ukurasa unaostahili kuelekezwa kutoka kwa ukurasa wa kuelekeza wa kwanza. Vitu <del>vilivyokatwa kwa mstari</del> vimeshatatuliwa.',
@@ -2003,10 +1984,9 @@ Ukitaka kufuta ukurasa huo kutoka maangalizi yako baadaye, bonyeza \"Acha kufuat
 'unwatchthispage' => 'Acha kufuatilia',
 'notanarticle' => 'Ukurasa nje ya kusudi ya wiki',
 'notvisiblerev' => 'Haririo ya mwisho, iliotendwa na mtumiaji mwingine, imefutwa',
-'watchnochange' => 'Hakuna kitu kati ya maangalizi yako kilichohaririwa katika kipindi kilichotajwa.',
 'watchlist-details' => 'Unafuatilia {{PLURAL:$1|ukurasa $1|kurasa $1}} bila kuzingatia kurasa za majadiliano.',
-'wlheader-enotif' => '* Huduma ya kuarifu kwa barua pepe imewezeshwa.',
-'wlheader-showupdated' => "* Kurasa zilizobadilika tangu ulivyotembelea mara ya mwisho zinaonyeshwa katika hali ya '''kukooza'''",
+'wlheader-enotif' => 'Huduma ya kuarifu kwa barua pepe imewezeshwa.',
+'wlheader-showupdated' => "Kurasa zilizobadilika tangu ulivyotembelea mara ya mwisho zinaonyeshwa katika hali ya '''kukooza'''",
 'watchmethod-recent' => 'kupitia madabiliko ya karibuni ili kupata kurasa za maangalizi',
 'watchmethod-list' => 'Kupitia kurasa za maangalizi ili kupata madabiliko ya karibuni',
 'watchlistcontains' => 'Orodha ya maangalizi yako ina {{PLURAL:$1|pages|kurasa}}.',
@@ -2314,8 +2294,6 @@ Andika sababu ya kuzuia chini (kwa mfano, kwa kutaja mifano ya kurasa zilizohari
 'block-log-flags-noemail' => 'barua pepe imezuiliwa',
 'block-log-flags-hiddenname' => 'jina la mtumiaji limefichwa',
 'ipb_already_blocked' => '"$1" tayari imeshazuiwa',
-'blockme' => 'Nizuie',
-'proxyblocksuccess' => 'Tayari.',
 
 # Developer tools
 'lockdb' => 'Funga hifadhidata',
@@ -2668,7 +2646,7 @@ likifupishwa. Nyuga zingine zitafichwa kama chaguo-msingi.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Upana',
 'exif-imagelength' => 'Urefu',
 'exif-jpeginterchangeformatlength' => 'Idadi ya baiti za data ya JPEG',
@@ -3042,12 +3020,6 @@ Huwa unapokea [{{SERVER}}{{SCRIPTPATH}}/COPYING nakala ya GNU General Public Lic
 'version-software-version' => 'Toleo',
 'version-entrypoints-header-url' => 'KISARA Kioneshi Sanifu Raslimali',
 
-# Special:FilePath
-'filepath' => 'Njia ya faili',
-'filepath-page' => 'Faili:',
-'filepath-submit' => 'Nenda',
-'filepath-summary' => 'Ukurasa huu maalumu unarejesha njia kamili ya faili. Picha inaonyeshwa ukubwa wote, faili za aina zingine zinaanza na programu zake zinazohusiana moja kwa moja.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Tafuta mafaili ya nakili',
 'fileduplicatesearch-summary' => 'Kutafuta mafaili ya nakili kwa kuzingatia thamani za reli.',
@@ -3131,6 +3103,8 @@ Huwa unapokea [{{SERVER}}{{SCRIPTPATH}}/COPYING nakala ya GNU General Public Lic
 'htmlform-submit' => 'Wasilisha',
 'htmlform-reset' => 'Tengua mabadiliko',
 'htmlform-selectorother-other' => 'Nyingine',
+'htmlform-no' => 'Hapana',
+'htmlform-yes' => 'Ndiyo',
 
 # New logging system
 'logentry-delete-delete' => '$1 alifuta ukurasa wa $3',
diff --git a/languages/messages/MessagesSzl.php b/languages/messages/MessagesSzl.php
index 03d6c194..c70d6279 100644
--- a/languages/messages/MessagesSzl.php
+++ b/languages/messages/MessagesSzl.php
@@ -94,9 +94,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Pokoż, wjela sprowjorzy dowo pozůr',
 'tog-oldsig' => 'Teroźni wyglůnd Twojygo szrajbowańo',
 'tog-fancysig' => 'Szrajbńij s kodůma wiki (bez autůmatycznygo linka)',
-'tog-externaleditor' => 'Sztandardowo używej zewnyntrzny edytor (jyno do ekspertůw, trza mjyć ekstra sztalowańy we systymje)',
-'tog-externaldiff' => 'Sztandardowo używej zewnyntrzny program do filowańo we pomjyńańach (jyno do ekspertůw, trza mjyć ekstra sztalowańy we systymje)',
-'tog-showjumplinks' => 'Zapńij cajchnůndzki "przyńdź do"',
 'tog-uselivepreview' => 'Używej dynamiczne uobźyrańy (JavaScript) (eksperymentalny)',
 'tog-forceeditsummary' => 'Pedź, kejbych ńic ńy naszkryfloł we uopiśe pomjyńań',
 'tog-watchlisthideown' => 'Schow moje pomjyńańa we artiklach, na kere dowom pozůr',
@@ -292,7 +289,7 @@ $1',
 'pool-queuefull' => 'Kolejka zadań jest pełna',
 'pool-errorunknown' => 'Feler ńyznany',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Uo {{GRAMMAR:MS.lp|{{SITENAME}}}}',
 'aboutpage' => 'Project:Uo serwiśe',
 'copyright' => 'Tekst udostympńany na licencyji $1.',
@@ -302,7 +299,6 @@ $1',
 'disclaimers' => 'Prawne informacyje',
 'disclaimerpage' => 'Project:Prawne informacyje',
 'edithelp' => 'Půmoc we půmjyńańy',
-'edithelppage' => 'Help:Jak půmjyńać zajta',
 'helppage' => 'Help:Treść',
 'mainpage' => 'Przodńo zajta',
 'mainpage-description' => 'Przodńo zajta',
@@ -373,14 +369,6 @@ Lista špecyjalnych zajtůw znejdźeš na [[Special:SpecialPages|{{int:specialpa
 # General errors
 'error' => 'Feler',
 'databaseerror' => 'Feler bazy danych',
-'dberrortext' => 'Zdorziu sie feler we skuadńi zapytańo do bazy danych. Uostatńy, ńyudane zapytańy to:
-<blockquote><tt>$1</tt></blockquote>
-wysuane bez funkcja "<tt>$2</tt>".
-MySQL zguośiu feler "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Zdorziu śe feler we skuadńi zapytańo do bazy danych. Uostatńy, ńyudane zapytańy to:
-"$1"
-kere wywououa funkcyjo "$2".
-MySQL zguośiu feler "$3: $4"',
 'laggedslavemode' => 'Dej pozůr: Ta zajta može ńy mjeć nojnowšych aktualizacyjůw.',
 'readonly' => 'Baza danych je zawarto',
 'enterlockreason' => 'Naškryflej sam powůd zawarća bazy danych a za wjela (myńi-wjyncyj) ja uodymkńeš',
@@ -428,7 +416,6 @@ Zapytańy: $2',
 'viewyourtext' => 'We tekst zdrzůduowy tyj zajty możno dali filować, idźe go tyż kopjować.',
 'protectedinterface' => 'Na tyj zajće znojduje śe tekst interfejsu uoprogramowańo, bestož uůna je zawarto uod sprowjańo.',
 'editinginterface' => "''''Dej pozůr:''' Sprowjosz zajta, na keryj je tekst interfejsu uoprogramowańo. Pomjyńyńa na tyj zajće zmjyńům wyglůnd interfejsu lo inkšych užytkowńikůw.",
-'sqlhidden' => '(schowano zapytańy SQL)',
 'cascadeprotected' => 'Ta zajta je zawarto uod sprowjańo, po takymu, co uůna je zauončono na {{PLURAL:$1|nastympujůncyj zajće, kero zostaua zawarto|nastympujůncych zajtach, kere zostauy zawarte}} ze zauončonům opcyjům dźedźičyńo:
 $2',
 'namespaceprotected' => "Ńy moš uprowńyń, coby sprowjać zajty we přestřeńi mjan '''$1'''.",
@@ -456,7 +443,6 @@ Dej pozůr, co na ńykerych zajtach přeglůndarka može dali pokozywać co jež
 'yourpassword' => 'Hasło:',
 'yourpasswordagain' => 'Naszkryflej ausdruk zaś',
 'remembermypassword' => 'Pamjyntej můj ausdruk na tym kůmputrze (nojdalij bez $1 {{PLURAL:$1|dźyń|dńůw}})',
-'securelogin-stick-https' => 'Po zalogowańy mjyj połonczenie bez HTTPS',
 'yourdomainname' => 'Twoja domyna',
 'externaldberror' => 'Je jaki feler we zewnyntřnyj baźe autentyfikacyjnyj, abo ńy moš uprawńyń potřebnych do aktualizacyji zewnyntřnego kůnta.',
 'login' => 'Zaloguj śe',
@@ -545,7 +531,7 @@ Coby powstřimać nadužyća, možliwość wysyuańa připůmńeń naštalowano
 'newpassword' => 'Nowe hasło',
 'retypenew' => 'Naszkryflej jeszcze roz nowe hasło:',
 'resetpass_submit' => 'Naštaluj hasuo a zalůguj',
-'resetpass_success' => 'Twoje hasuo zostouo půmyślńy pomjyńone! Trwo logůwańe...',
+'changepassword-success' => 'Twoje hasuo zostouo půmyślńy pomjyńone! Trwo logůwańe...',
 'resetpass_forbidden' => 'Ńy idźe sam půmjyńyć hasuůw.',
 'resetpass-no-info' => 'Muśysz być zalogowany, coby uzyskać bezpostrzedńi dostymp do tyj zajty.',
 'resetpass-submit-loggedin' => 'Zmjyń hasło',
@@ -556,10 +542,8 @@ Możliwe co właśńy zmjyńiłżeś swoje hasło abo poprosiłżeś uo nowe tym
 
 # Special:PasswordReset
 'passwordreset' => 'Wyczyść hasło',
-'passwordreset-text' => 'Wypełnij formularz, aby otrzymać e‐mail z przypomnieniem danych Twojego konta.',
 'passwordreset-legend' => 'Wyczyść hasło',
 'passwordreset-disabled' => 'No tyj wiki zamkńynto resytowańy hasył.',
-'passwordreset-pretext' => '{{PLURAL:$1||Wćep jydną z danych}}',
 'passwordreset-username' => 'Mjano używacza:',
 'passwordreset-domain' => 'Domyna:',
 'passwordreset-capture' => 'Czy pokazywać treść wiadomości e‐mail?',
@@ -941,7 +925,6 @@ $1',
 'searchmenu-legend' => 'Uopcyje sznupańo',
 'searchmenu-exists' => "'''Ńy ma zajty uo mjańy \"[[:\$1]]\" na tyj wiki'''",
 'searchmenu-new' => "'''Stwůrz zajta „[[:$1|$1]]” na tyj wiki!'''",
-'searchhelp-url' => 'Help:Pomoc',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Przeglůndej zajty kere s anfanga majům tyn przedrostek]]',
 'searchprofile-articles' => 'Zajty',
 'searchprofile-project' => 'Zajty půmocy a projektu',
@@ -983,14 +966,6 @@ $1',
 'search-external' => 'Šnupańy zewnyntřne',
 'searchdisabled' => 'Šnupańy we {{GRAMMAR:MS.lp|{{SITENAME}}}} zostouo zawarte. Zańim go zouůnčům, možeš sprůbować šnupańo bez Google. Ino zauwaž, co informacyje uo treśći {{GRAMMAR:MS.lp|{{SITENAME}}}} můgům być we Google ńyakuratne.',
 
-# Quickbar
-'qbsettings' => 'Gurt šybkigo dostympu',
-'qbsettings-none' => 'Brak',
-'qbsettings-fixedleft' => 'Stouy, s lewyj',
-'qbsettings-fixedright' => 'Stouy, s prawyj',
-'qbsettings-floatingleft' => 'Unošůncy śe, s lewyj',
-'qbsettings-floatingright' => 'Unošůncy śe, s prawyj',
-
 # Preferences page
 'preferences' => 'Preferyncyje',
 'mypreferences' => 'Moje preferyncyje',
@@ -1023,7 +998,6 @@ $1',
 'resetprefs' => 'Preferencyje důmyślne',
 'restoreprefs' => 'Wćep wszyjskie důmyślne preferencyje',
 'prefs-editing' => 'Sprowjańy',
-'prefs-edit-boxsize' => 'Rozmjor uokna edycyji.',
 'rows' => 'Wjerše:',
 'columns' => 'Kůlumny:',
 'searchresultshead' => 'Šnupańy',
@@ -1262,7 +1236,6 @@ $1',
 'recentchangeslinked-feed' => 'Pomjyńańa we adresowanych',
 'recentchangeslinked-toolbox' => 'Půmjyńańa we nalinkowanych',
 'recentchangeslinked-title' => 'Pomjyńyńo w adrésowanych s "$1"',
-'recentchangeslinked-noresult' => 'Nikt nic niy pomjyńoł w dolinkowanych bez čas uo kery žeś pytou.',
 'recentchangeslinked-summary' => "Ńiżyj je lista ńydowno půmjyńanych na zajtach, na kere uobrano zajta linkuje (abo wszyjskich zajtach patrzůncych do uobranyj kategoryje).
 Zajty z [[Special:Watchlist|pozůrlisty]] sům '''rube'''",
 'recentchangeslinked-page' => 'Mjano zajty',
@@ -1480,11 +1453,6 @@ Niżyj sům informacyje ze [$2 zajty popisu] tygo pliku.',
 'statistics-users-active-desc' => 'Użytkowńiki, kere bůły aktywne bez {{PLURAL:$1|uostatńi dźyń|uostatńich $1 dńi}}',
 'statistics-mostpopular' => 'Zajty we kere nojčyńśći sam filujom',
 
-'disambiguations' => 'Zajty ujydnoznačńajůnce',
-'disambiguationspage' => '{{ns:template}}:disambig',
-'disambiguations-text' => "Artikle půńižej uodwouůjům śe do '''zajtůw ujydnoznačńajůncych''', a powinny uodwouywać śe bezpostředńo do hasua kere je zwjůnzane ze treśćům artikla.<br />
-Zajta uznawano je za ujydnoznačńajůnco kej zawiyro šablůn uokreślůny we [[MediaWiki:Disambiguationspage]].",
-
 'doubleredirects' => 'Podwůjne překierowańa',
 'doubleredirectstext' => 'Na tyi liśće mogům znojdować śe překerowańo pozorne. Uoznača to, aže půńižej pjyrwšej lińii artikla, zawjerajůncyj "#REDIRECT ...", može znojdować śe dodotkowy tekst. Koždy wjerš listy zawjero uodwouańo do pjyrwšygo i drůgygo překerowańo a pjyrwšom lińjům tekstu drůgygo překerowańo. Uůmožliwjo to na ogůu uodnaleźyńy wuaśćiwygo artikla, do kerygo powinno śe překerowywać.',
 'double-redirect-fixed-move' => 'zajta [[$1]] zostoła zastůmpjůno bez przekerowańy, skiż jeij przekludzyńo ku [[$2]]',
@@ -1691,10 +1659,9 @@ Na tyi liśće bydźeš mjou rejer přišuych sprowjyń tyi zajty i jeji zajty g
 'unwatchthispage' => 'Přestoń dować pozůr',
 'notanarticle' => 'To ńy je artikel',
 'notvisiblerev' => 'Wersyja zostoua wyćepano',
-'watchnochange' => 'Žodno ze zajtůw, na kere dowoš pozůr, ńy bůua sprowjano w podanym uokreśe.',
 'watchlist-details' => 'Na pozorliśće {{PLURAL:$1|je 1 artikel|sům $1 artikle|je $1 artikli}} ńy rachujůnc zajtůw godek.',
-'wlheader-enotif' => '* Wysůuańy powjadůmjyń na adres e-brif je zouůnčůne',
-'wlheader-showupdated' => "* Zajty, kere bouy sprowjane uod Twoi uostatńi wizyty na ńych zostoy naškryflane '''tuustym'''",
+'wlheader-enotif' => 'Wysůuańy powjadůmjyń na adres e-brif je zouůnčůne',
+'wlheader-showupdated' => "Zajty, kere bouy sprowjane uod Twoi uostatńi wizyty na ńych zostoy naškryflane '''tuustym'''",
 'watchmethod-recent' => 'šnupańy za půmjyńanymi na uostatku w zajtach, na kere dowoš pozůr',
 'watchmethod-list' => 'šnupańy w zajtach, na kere dowoš pozůr pośrůd půmjyńanych na uostatku',
 'watchlistcontains' => 'Lista zajtůw, na kere dowoš pozůr mo {{PLURAL:$1|jedna pozycja|$1 pozycje|$1 pozycyji}}.',
@@ -2035,12 +2002,9 @@ Coby přejřeć lista uobecńy aktywnych zawarć, přyńdź na zajta [[Special:B
 'ipb_blocked_as_range' => 'Feler: Adres IP $1 ńy zostou zawarty bezpośredńo i ńy može zostać uodymkńjynty.
 Noležy uůn do zawartygo zakresu adresůw $2. Uodymknůńć možno ino couki zakres.',
 'ip_range_invalid' => 'Ńypoprowny zakres adresów IP.',
-'blockme' => 'Zawryj mi sprowjyńa',
 'proxyblocker' => 'Zawjyrańe proxy',
-'proxyblocker-disabled' => 'Ta fůnkcyjo je wůuůnčůna.',
 'proxyblockreason' => 'Twůj adres IP zostou zawarty, bo je to adres uotwartygo proxy.
 Sprawa noležy wyjaśńić s dostawcům Internetu abo půmocům techńičnům informujůnc uo tym powažnym problymje s bezpječyństwym.',
-'proxyblocksuccess' => 'Wykůnane.',
 'sorbsreason' => 'Twůj adres IP znojdowo śe na liśće serwerůw open proxy w DNSBL, užywanej bez {{GRAMMAR:B.lp|{{SITENAME}}}}.',
 'sorbs_create_account_reason' => 'Twůj adres IP znojdowo śe na liśće serwerůw open proxy w DNSBL, užywanej bez {{GRAMMAR:B.lp|{{SITENAME}}}}.
 Ńy možeš utwořić kůnta',
@@ -2380,7 +2344,7 @@ Eli plik był modyfikowany, dane mogům w tajli ńy być we zgodźe ze parametr
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Šyrokość',
 'exif-imagelength' => 'Wysokość',
 'exif-bitspersample' => 'Bitůw na průbka',
@@ -2494,7 +2458,7 @@ Eli plik był modyfikowany, dane mogům w tajli ńy być we zgodźe ze parametr
 'exif-gpsdatestamp' => 'Data GPS',
 'exif-gpsdifferential' => 'Korekcyjo růžńicy GPS',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ńyskůmpresowany',
 
 'exif-unknowndate' => 'ńyznano data',
@@ -2775,7 +2739,6 @@ Možeš tyž [[Special:EditWatchlist|užyć standardowygo edytora]].',
 'version-other' => 'Inkše',
 'version-mediahandlers' => 'Wtyčki uobsůgi medjůw',
 'version-hooks' => 'Haki (ang. hooks)',
-'version-extension-functions' => 'Fůnkcyje rozšyřyń',
 'version-parser-extensiontags' => 'Značńiki rozšeřyń do analizatora skuadńi',
 'version-parser-function-hooks' => 'Fůnkcyje hokůw analizatora skuadńi (ang. parser function hooks)',
 'version-hook-name' => 'Mjano haka (ang. hook name)',
@@ -2786,15 +2749,6 @@ Možeš tyž [[Special:EditWatchlist|užyć standardowygo edytora]].',
 'version-software-product' => 'Mjano',
 'version-software-version' => 'Wersjo',
 
-# Special:FilePath
-'filepath' => 'Śćežka do plika',
-'filepath-page' => 'Plik:',
-'filepath-submit' => 'Śćežka',
-'filepath-summary' => 'Ta ekstra zajta zwraco peuno śćyžka do plika.
-Grafiki sům pokazywane w peunyj rozdźelčośći, inkše typy plikůw sům uodmykane we skojařůnym ś ńimi průgramje.
-
-Naškryflej sam mjano plika bez prefiksu „{{ns:file}}:”.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Šnupej za duplikatym plika',
 'fileduplicatesearch-summary' => 'Šnupej za duplikatůma plika na podstawje wartośći fůnkcyji skrůtu.',
diff --git a/languages/messages/MessagesTa.php b/languages/messages/MessagesTa.php
index 2a52bd28..d2fd4c6a 100644
--- a/languages/messages/MessagesTa.php
+++ b/languages/messages/MessagesTa.php
@@ -115,9 +115,6 @@ $messages = array(
 'tog-shownumberswatching' => 'கவனிக்கும் பயனர்களின் எண்ணிக்கையைக் காட்டவும்',
 'tog-oldsig' => 'நடப்பு கையொப்பம்:',
 'tog-fancysig' => 'வெற்றுக் கையொப்பம் (தானியங்கி இணைப்பின்றி)',
-'tog-externaleditor' => 'இயல்பிருப்பாக வெளித் தொகுப்பு மென்பொருளைப் பயன்படுத்து (இது வல்லுநர்களுக்கு மட்டும், உங்கள் கணினியில் சிறப்பு அமைப்புகள் தேவைப்படும் [மேலும் விவரங்களுக்கு //www.mediawiki.org/wiki/Manual:External_editors .])',
-'tog-externaldiff' => 'வெளி வேறுபாட்டை இயல்பிருப்பாகப் பயன்படுத்து (இது வல்லுநர்களுக்கு மட்டும்; உங்கள் கணினியில் சிறப்பு அமைப்புகள் தேவைப்படும் [மேலும் விவரங்களுக்கு //www.mediawiki.org/wiki/Manual:External_editors .])',
-'tog-showjumplinks' => '"தாவிச் செல்லவும்" இணைப்புகளை செயலாக்கவும்',
 'tog-uselivepreview' => 'நேரடி முன்தோற்றத்தைப் பயன்படுத்து (சோதனையிலுள்ளது)',
 'tog-forceeditsummary' => 'தொகுப்புச் சுருக்கம் வெற்றாக இருக்கும் போது எனக்கு நினைவூட்டு',
 'tog-watchlisthideown' => 'எனது தொகுப்புக்களைக் கவனிப்புப் பட்டியலிலிருந்து மறை',
@@ -130,6 +127,8 @@ $messages = array(
 'tog-diffonly' => 'மாற்றங்களை ஒப்பிடும் போது அதன் கீழ் பக்க உள்ளடக்கத்தைக் காட்டாதே',
 'tog-showhiddencats' => 'மறைக்கப்பட்ட பகுப்புகளைக் காட்டு',
 'tog-norollbackdiff' => 'முன்பிருந்த நிலைக்குக் கொண்டுவந்தபின் வித்தியாசங்களை விட்டுவிடவும் (காட்டத்தேவையில்லை).',
+'tog-useeditwarning' => 'தொகுத்துக் கொண்டிருக்கும் பக்கத்தை சேமிக்காமல் வெளியேறினால் எனக்கு எச்சரிக்கை செய்',
+'tog-prefershttps' => 'புகுபதிகை செய்யும்போது எப்போதுமே பாதுகாப்பான இணைப்பை பயன்படுத்தவும்',
 
 'underline-always' => 'எப்பொழுதும்',
 'underline-never' => 'எப்போதுமில்லை',
@@ -193,6 +192,18 @@ $messages = array(
 'oct' => 'அக்',
 'nov' => 'நவ',
 'dec' => 'டிச',
+'january-date' => 'ஜனவரி $1',
+'february-date' => 'பெப்ரவரி $1',
+'march-date' => 'மார்ச் $1',
+'april-date' => 'மார்ச் $1',
+'may-date' => 'மே $1',
+'june-date' => 'ஜூன் $1',
+'july-date' => 'ஜூலை $1',
+'august-date' => 'ஆகஸ்ட் $1',
+'september-date' => 'செப்டம்பர் $1',
+'october-date' => 'அக்டோபர் $1',
+'november-date' => 'நவம்பர் $1',
+'december-date' => 'டிசம்பர் $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|பகுப்பு|பகுப்புகள்}}',
@@ -276,6 +287,7 @@ $messages = array(
 'create-this-page' => 'இப்பக்கத்தை உருவாக்கு',
 'delete' => 'நீக்கவும்',
 'deletethispage' => 'இப்பக்கத்தை நீக்கு',
+'undeletethispage' => 'அழித்த பக்கத்தை மறுபடியும் கொண்டு வா',
 'undelete_short' => '{{PLURAL:$1|ஒரு தொகுப்பை|$1 தொகுப்புக்களை}} மீட்டெடு',
 'viewdeleted_short' => '{{PLURAL:$1|ஒரு நீக்கப்பட்ட தொகுப்பை|$1 நீக்கப்பட்ட தொகுப்புகளை}}  பார்.',
 'protect' => 'காக்கவும்',
@@ -319,7 +331,7 @@ $1',
 'pool-queuefull' => 'பணி வரிசையில் இடம் இல்லை',
 'pool-errorunknown' => 'அறியப்படாத தவறு',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} பற்றி',
 'aboutpage' => 'Project:விவரம்',
 'copyright' => 'உள்ளடக்கங்கள் $1 இன் கீழ் கிடைக்கின்றன.',
@@ -329,7 +341,6 @@ $1',
 'disclaimers' => 'பொறுப்புத் துறப்புகள்',
 'disclaimerpage' => 'Project:பொதுவான பொறுப்புத் துறப்புகள்',
 'edithelp' => 'தொகுத்தலுக்கான உதவி',
-'edithelppage' => 'Help:ஒருவர் பக்கமொன்றைத் தொகுப்பது எப்படி?',
 'helppage' => 'Help:உதவி',
 'mainpage' => 'முதற் பக்கம்',
 'mainpage-description' => 'முதற் பக்கம்',
@@ -404,17 +415,6 @@ $1',
 # General errors
 'error' => 'தவறு',
 'databaseerror' => 'தரவுத்தள தவறு',
-'dberrortext' => 'தரவுத்தள வினவல் தொடரமைப்பில் தவறு ஏற்பட்டுள்ளது.
-இது மென்பொருலில் இருக்கும் ஒரு பிழை குறிக்கக்கூடும்.
-கடைசியாக முயற்சிக்கப்பட்ட தரவுத்தள வினவல்:
-<blockquote><code>$1</code></blockquote>
-"<code>$2</code>" என்னும் செயலுக்குள் இருந்து.
-தரவுத்தளம் "<samp>$3: $4</samp>" என்னும் பிழையை விளைவாக்கியது.',
-'dberrortextcl' => 'ஒரு தரவுத்தள வினவல் தொடரமைப்புத் தவறு ஏற்பட்டுள்ளது.
-கடைசியாக முயற்சிக்கப்பட்ட தரவுத்தள வினவல்:
-"$1"
-செயலுக்குள்(function) இருந்து "$2".
-MySQL returned error "$3: $4".',
 'laggedslavemode' => 'எச்சரிக்கை: இப்பக்கம் அண்மையில் இற்றைப்படுத்தப்படாமல் இருக்கலாம்.',
 'readonly' => 'தரவுத்தளம் பூட்டப்பட்டுள்ளது',
 'enterlockreason' => 'பூட்டுக்கான காரணத்தைத் தருக. பூட்டு எப்பொழுது திறக்கப்படும் என்பதையும் குறிப்பிடுக.',
@@ -465,11 +465,14 @@ MySQL returned error "$3: $4".',
 'viewyourtext' => "நீங்கள் இந்த பக்கத்திற்கான ''' உங்கள் திருத்தங்களுக்கான ''' மூலத்தைக் காணவும்  நகலெடுக்கவும் முடியும்.",
 'protectedinterface' => 'இப்பக்கம் இம்மென் பொருளுக்கான பயனர் இடைமுக உரைகளை வழங்குகிறது, விசம தொகுப்புக்களை தவிர்ப்பதற்க்காக இப்பக்கம் பூட்டப்பட்டுள்ளது.',
 'editinginterface' => "'''எச்சரிக்கை:''' நீங்கள் இம்மென் பொருளுக்கான பயனர் இடைமுக உரைகளை வழங்கும் பக்கமொன்றை தொகுக்க முயற்சி செய்கிறீர்கள். இதில் செய்யப்படும் மாற்றங்கள் ஏனைய பயனர்களது பயனர் இடைமுகங்களிலும் மாற்றங்களை ஏற்படுத்தும். மொழிபெயர்ப்புகளுக்கு, அருள் கூர்ந்து மிடியாவிக்கி மொழிபெயர்ப்புத் திட்டமான [//translatewiki.net/wiki/Main_Page?setlang=ta பீட்டாவிக்கி] திட்டத்தை பயன்படுத்தவும்.",
-'sqlhidden' => '(SQL கோரிக்கை மறைக்கப்பட்டுள்ளது)',
 'cascadeprotected' => 'படிநிலைக் காப்புக்குட்படுத்தப்பட்டுள்ள பின்வரும் {{PLURAL:$1|பக்கத்தில்|பக்கங்களில்}} இப்பக்கம் இணைக்கப் பட்டுள்ளமையால் இப்பக்கம் தொகுப்பதிலிருந்து காக்கப்பட்டுள்ளது:$2',
 'namespaceprotected' => "'''$1''' பெயர்வெளியில் தொகுப்புக்களைச் செய்வதற்கு உங்களுக்கு அனுமதி கிடையாது.",
 'customcssprotected' => 'வேறு பயனர் ஒருவரின் தனிப்பட்ட அமைப்புகள் காணப்படுவதால் இப்பக்கத்தை தொகுக்க உங்களுக்கு அனுமதி கிடையாது.',
 'customjsprotected' => 'வேறு பயனர் ஒருவரின் தனிப்பட்ட அமைப்புகள் காணப்படுவதால் இந்த JavaScript பக்கத்தை தொகுக்க உங்களுக்கு அனுமதி கிடையாது.',
+'mycustomcssprotected' => 'இந்த CSS பக்கத்தை தொகுக்கும் அனுமதி உங்களுக்கு இல்லை.',
+'mycustomjsprotected' => 'இந்த JavaScript பக்கத்தை தொகுக்கும் அனுமதி உங்களுக்கு இல்லை.',
+'myprivateinfoprotected' => 'உங்களின் தனிப்பட்ட தகவல்களை தொகுக்கும் அனுமதி உங்களுக்கு இல்லை.',
+'mypreferencesprotected' => 'உங்களின் தனிப்பட்ட தகவல்களை தொகுக்கும் அனுமதி உங்களுக்கு இல்லை.',
 'ns-specialprotected' => 'சிறப்புப் பக்கங்களைத் தொகுக்க முடியாது.',
 'titleprotected' => "பயனர் [[User:$1|$1]] இத்தலைப்பு உருவாக்கப்படுவதை தவிர்க்கும் வகையில் தடுத்துள்ளார்.
 கொடுக்கப்பட்டக் காரணம் ''$2''.",
@@ -491,10 +494,19 @@ MySQL returned error "$3: $4".',
 'welcomeuser' => 'வருக $1',
 'welcomecreation-msg' => 'உங்களுக்கான பயனர் கணக்கு உருவாக்கப்பட்டுள்ளது. உங்களுக்கேற்றவாறு [[Special:Preferences|{{SITENAME}} விருப்பத்தேர்வுகளை]] மாற்றிக் கொள்ள மறவாதீர்கள்.',
 'yourname' => 'பயனர் பெயர்:',
+'userlogin-yourname' => 'பயனர் பெயர்',
+'userlogin-yourname-ph' => 'உங்கள் பயனர் பெயரை உள்ளிடுக',
+'createacct-another-username-ph' => 'பயனர் பெயரொன்றை இடுக:',
 'yourpassword' => 'கடவுச்சொல்:',
+'userlogin-yourpassword' => 'கடவுச்சொல்',
+'userlogin-yourpassword-ph' => 'உங்கள் கடவுச்சொல்லை உள்ளிடுக',
+'createacct-yourpassword-ph' => 'கடவுச்சொல்லை உள்ளிடுக',
 'yourpasswordagain' => 'கடவுச்சொல்லைத் திரும்ப தட்டச்சிடுக:',
+'createacct-yourpasswordagain' => 'கடவுச்சொல்லை உறுதிசெய்க',
+'createacct-yourpasswordagain-ph' => 'கடவுச்சொல்லை மீளவும் இடுக',
 'remembermypassword' => 'எனது கடவுச்சொல்லை (கூடியது $1 {{PLURAL:$1|நாள்|நாட்கள்}}) அமர்வுகளிடையே நினைவில் வைத்திருக்கவும்.',
-'securelogin-stick-https' => 'புகுபதிகைக்குப் பிறகும் HTTPS-இலேயே இருக்கவும்',
+'userlogin-remembermypassword' => 'இடுபதிந்தே இருக்கவிடவும்',
+'userlogin-signwithsecure' => 'பாதுகாப்பான தொடர்பை உபயோகிக்கவும்',
 'yourdomainname' => 'உங்கள் உரிமைப்பரப்பு:',
 'password-change-forbidden' => 'நீங்கள் விக்கிகளில் கடவுச் சொற்களை மாற்ற முடியாது',
 'externaldberror' => 'வெளி உறுதிப்படுத்தலில் ஏற்பட்ட தவறு காரணமாக உங்கள் வெளி கணக்கை இற்றைப்படுத்த முடியாது.',
@@ -506,18 +518,41 @@ MySQL returned error "$3: $4".',
 'logout' => 'விடுபதிகை',
 'userlogout' => 'விடுபதிகை',
 'notloggedin' => 'புகுபதிகை செய்யப்படவில்லை',
+'userlogin-noaccount' => 'பயனர் கணக்கு இல்லையா?',
+'userlogin-joinproject' => 'இணைக {{SITENAME}}',
 'nologin' => "பயனர் கணக்கு இல்லையா? '''$1'''.",
 'nologinlink' => 'கணக்கு ஒன்றை உருவாக்கவும்',
 'createaccount' => 'புதிய கணக்கை உருவாக்கு',
 'gotaccount' => "ஏற்கனவே பயனர் கணக்கு உள்ளதா? '''$1'''.",
 'gotaccountlink' => 'புகுபதிகை',
 'userlogin-resetlink' => 'உங்கள் புகுபதிகைக் குறிப்புகளை மறந்துவிட்டீர்களா?',
+'userlogin-resetpassword-link' => 'உங்கள் கடவுச்சொல் மறந்துவிட்டதா?',
+'helplogin-url' => 'Help:புகுபதிகை',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|புகுபதிவதற்கான உதவி]]',
+'createacct-join' => 'உங்களின் தகவலை கீழிடவும்',
+'createacct-another-join' => 'கீழே புதிய கணக்கிற்கான தகவல்களை உள்ளிடவும்.',
+'createacct-emailrequired' => 'மின்னஞ்சல் முகவரி',
+'createacct-emailoptional' => 'மின்னஞ்சல் முகவரி (விருப்பத்தேர்வு)',
+'createacct-email-ph' => 'உங்கள் மின்னஞ்சல் முகவரியை உள்ளிடுக',
+'createacct-another-email-ph' => 'உங்கள் மின்னஞ்சல் முகவரியை உள்ளிடுக',
 'createaccountmail' => 'தற்காலிகமாக எழுந்தமான ஒரு கடவுச்சொல்லை பயன்படுத்துக, அதை குறித்துள்ள மின்னஞ்சலுக்கு அனுப்புக',
+'createacct-realname' => 'உண்மைப் பெயர் (விருப்பத்தேர்வு)',
 'createaccountreason' => 'காரணம்:',
+'createacct-reason' => 'காரணம்',
+'createacct-reason-ph' => 'தாங்கள் ஏன் மற்றொரு கணக்கைத் துவங்குகிறீர்கள்?',
+'createacct-captcha' => 'பாதுகாப்பு சோதனை',
+'createacct-imgcaptcha-ph' => 'மேலே காணும் சொற்களை உள்ளிடுக',
+'createacct-submit' => 'உங்கள் கணக்கை உருவாக்குக',
+'createacct-another-submit' => 'மற்றொரு கணக்கு ஒன்றை உருவாக்கவும்',
+'createacct-benefit-heading' => '{{SITENAME}} தங்களைப் போன்றோர்களால் உருவாக்கப்பட்டது',
+'createacct-benefit-body1' => '{{PLURAL:$1|தொகுப்பு|தொகுப்புகள்}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|பக்கம்|பக்கங்கள்}}',
+'createacct-benefit-body3' => 'அண்மைய {{PLURAL:$1|பங்களிப்பாளர்|பங்களிப்பாளர்கள்}}',
 'badretype' => 'நீங்கள் பதிந்த கடவுச்சொற்கள்  பொருந்தவில்லை.',
 'userexists' => 'உள்ளிட்ட பயனர்பெயர் ஏற்கனவே உபயோகத்தில் உள்ளது.
 தயவுகூர்ந்து வேறு பெயரை தேர்ந்தெடுக்கவும்.',
 'loginerror' => 'புகுபதிகைத் தவறு',
+'createacct-error' => 'கணக்கு உருவாக்குதலில் பிழை',
 'createaccounterror' => 'இந்த கணக்கை உருவாக்க முடியவில்லை: $1',
 'nocookiesnew' => '{{SITENAME}} தளத்துக்கான உங்கள் பயனர் கணக்கு உருவாக்கப்பட்டுள்ளது, ஆனால் நீங்கள் புகுபதிகை செய்யவில்லை. பயனர்களைப் புகுபதிகை செய்ய {{SITENAME}} தளம் ஞாபகிகளைப் (குக்கிகள்) பயன்படுத்துகிறது. நீங்கள் ஞாபகிகளைச் செயலற்றவையாக்கியுள்ளீர்கள். தயவுசெய்து அவற்றைச் செயற்படுத்தியப் பின் உங்கள் புதிய பயனர் பெயருடனும், கடவுச் சொல்லுடனும் புகுபதிகை செய்யுங்கள்.',
 'nocookieslogin' => '{{SITENAME}} தளம் பயனர்களைப் புகுபதிகை செய்வதற்கு ஞாபகிகளைப் (குக்கிகள்) பயன்படுத்துகிறது. நீங்கள் ஞாபகிகளைச் செயலிழக்கச் செய்துள்ளீர்கள். தயவுசெய்து அவற்றைச் செயற்பாடுள்ளதாக்கித் திரும்பவும் முயலுங்கள்.',
@@ -570,12 +605,14 @@ MySQL returned error "$3: $4".',
 
 இக்கணக்கு தவறுதலாக தொடங்கப்பட்டிருந்தால், இத்தகவலைப் புறக்கணிக்கலாம்.',
 'usernamehasherror' => "பயனர் பெயரில் '#' எழுத்தைப் பயன்படுத்த முடியாது",
-'login-throttled' => 'தாங்கள் பலமுறை தற்போது புகுபதிகை செய்ய முயற்சி செய்துள்ளீர்கள்.
+'login-throttled' => 'தாங்கள் மிக அண்மையில் பலமுறை புகுபதிகை செய்ய முயற்சி செய்துள்ளீர்கள்.
 
-அடுத்தபடியாக முயற்சி செய்வதற்கு முன் சிறிது நேரம் காத்திருக்கவும்.',
+மீண்டும் முயற்சிக்கும் முன் $1 காத்திருக்கவும்.',
 'login-abort-generic' => 'உங்கள் உள்நுழைவு தோல்வியுற்றது - Aborted',
 'loginlanguagelabel' => 'மொழி: $1',
 'suspicious-userlogout' => 'உங்கள் விடுபதிகை கோரிக்கை மறுக்கப்பட்டது ஏனென்றால் அது அறுபட்ட உலாவி அல்லது மாற்று இடைக்கிடங்கியால் அனுப்பப்பட்டுள்ளது.',
+'createacct-another-realname-tip' => 'உண்மையான பெயர் கட்டாயமற்றது.
+நீங்கள் இதை கொடுத்தால் உங்கள் ஆக்கங்களுக்கான உரிமையளிப்புகளின் போது இது பயன்படும்.',
 
 # Email sending
 'php-mail-error-unknown' => "PHP 's mail() செயல்பாட்டில் அறியப்படாத பிழை.",
@@ -590,7 +627,7 @@ MySQL returned error "$3: $4".',
 'newpassword' => 'புதிய கடவுச்சொல்:',
 'retypenew' => 'புதிய கடவுச்சொல்லை மீண்டும் தட்டச்சிடு',
 'resetpass_submit' => 'கடவுச்சொல்லை பதிவுசெய்து புகுபதிகை செய்',
-'resetpass_success' => 'உங்களது கடவுச்சொல் வெற்றிகரமாக மாற்றப்பட்டுள்ளது! உங்களை புகுபதிகை செய்யப்படுகிறது...',
+'changepassword-success' => 'உங்களது கடவுச்சொல் வெற்றிகரமாக மாற்றப்பட்டுள்ளது!',
 'resetpass_forbidden' => 'கடவுச்சொற்கள் மாற்றப்பட முடியாது',
 'resetpass-no-info' => 'இப்பக்கத்தை நேரடியாக அணுகுவதற்கு நீங்கள் புகுபதிகை செய்திருக்கவேண்டும்.',
 'resetpass-submit-loggedin' => 'கடவுச்சொல்லை மாற்று',
@@ -601,10 +638,8 @@ MySQL returned error "$3: $4".',
 
 # Special:PasswordReset
 'passwordreset' => 'கடவுச்சொல்லை மீட்டமை',
-'passwordreset-text' => 'உங்கள் கடவுச்சொல்லை மீட்டமைக்க இப்படிவத்தை பூர்த்தி செய்யவும்.',
 'passwordreset-legend' => 'கடவுச்சொல்லை மீட்டமை',
 'passwordreset-disabled' => 'கடவுச்சொல் மீட்டமைப்பு இந்த விக்கியில் செயலிழக்க செய்யப்பட்டுள்ளது.',
-'passwordreset-pretext' => '{{PLURAL:$1|| தரவு பகுதி ஒன்றை கீழே உள்ளிடு}}',
 'passwordreset-username' => 'பயனர் பெயர்:',
 'passwordreset-domain' => 'இணையதள முகவரி:',
 'passwordreset-capture' => 'விளைவு மின்னஞ்சலை காண்',
@@ -629,7 +664,7 @@ $2
 தற்காலிகக் கடவுச்சொல்: $2',
 'passwordreset-emailsent' => 'கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல் அனுப்பப்பட்டது.',
 'passwordreset-emailsent-capture' => 'கீழே காண்பிக்கப்பட்டுள்ளது போல் கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல் அனுப்பப்பட்டது.',
-'passwordreset-emailerror-capture' => 'நினைவுபடுத்தி மின்னஞ்சல்  உருவாக்கப்பட்டுவிட்டது,அது கீழே காட்டப்பட்டுள்ளது, ஆனால் பயனீட்டாளருக்கு அனுப்புவது தோல்வியடைந்தது:$1',
+'passwordreset-emailerror-capture' => 'கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல்  உருவாக்கப்பட்டுவிட்டது, அது கீழே காட்டப்பட்டுள்ளது, ஆனால் பயனீட்டாளருக்கு அனுப்புவது தோல்வியடைந்தது:$1',
 
 # Special:ChangeEmail
 'changeemail' => 'மின்னஞ்சல் முகவரியை மாற்று',
@@ -824,6 +859,7 @@ $1 எனும் பயனரையோ வேறு [[{{MediaWiki:Grouppage-sy
 இது நீக்கப்பட்டதாக இருக்கலாம்.',
 'edit-conflict' => 'முரண்பாடுகளைத் தொகுக்கவும்.',
 'edit-no-change' => 'வாசகங்களுக்கு எந்த மாற்றமும் செய்யப்படவில்லை என்பதனால் உங்கள் தொகுப்பு புறக்கணிக்கப்பட்டது.',
+'postedit-confirmation' => 'உங்களது தொகுப்பு சேமிக்கப்பட்டது.',
 'edit-already-exists' => 'புதிய பக்கமொன்றை உருவாக்க முடியாது.
 இப்பக்கம் ஏற்கனவே உள்ளது.',
 'defaultmessagetext' => 'இயல்பிருப்பு தகவல் உரை',
@@ -1042,6 +1078,7 @@ $1",
 'compareselectedversions' => 'தெரிவு செய்யப்பட்ட பதிப்புக்களை ஒப்பிடவும்',
 'showhideselectedversions' => 'தெரிவு செய்யப்பட்ட மாற்றங்களை காட்டு/மறை',
 'editundo' => 'மீளமை',
+'diff-empty' => '(வேறுபாடு ஏதுமில்லை)',
 'diff-multi' => '({{PLURAL:$1|ஒரு இடைப்பட்ட திருத்தம்|$1 இடைப்பட்ட திருத்தங்கள்}} {{PLURAL:$2|பயனர்|$2 பயனர்கள்}}  செய்தவைகளை காட்டப்படவில்லை.)',
 'diff-multi-manyusers' => '({{PLURAL:$2|பயனரால்|$2 பயனர்களால்}} செய்யப்பட்ட {{PLURAL:$1|ஒரு இடைப்பட்ட திருத்தம்|$1 இடைப்பட்ட திருத்தங்கள்}}  காட்டப்படவில்லை.)',
 
@@ -1065,7 +1102,6 @@ $1",
 'searchmenu-legend' => 'தேடல் விருப்பு',
 'searchmenu-exists' => "'''\"[[:\$1]]\" என்னும் பெயருடைய பக்கம் இந்த விக்கியில் உள்ளது'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" பக்கத்தை இந்த விக்கியில் உருவாக்கவும்!'''",
-'searchhelp-url' => 'Help:உதவி',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|இந்த முன்னொட்டுடன் உலவித்தேடு]]',
 'searchprofile-articles' => 'உள்ளடக்கப் பக்கங்களின் பட்டியல்',
 'searchprofile-project' => 'உதவி மற்றும் திட்டப் பக்கங்கள்',
@@ -1110,15 +1146,7 @@ $1",
 'powersearch-togglenone' => 'ஏதுமில்லை',
 'search-external' => 'வெளித்தேடல்',
 'searchdisabled' => '{{SITENAME}} தளத்தின் தேடல் வசதிகள் தற்காலிகமாக முடக்கப்பட்டுள்ளது. அதுவரை நீங்கள் கீழேயுள்ள கூகிள் தேடலைப் பயன்படுத்தலாம். இது சில சமயம் இற்றைப்படுத்தப்படாததாய் இருக்கக்கூடும்.',
-
-# Quickbar
-'qbsettings' => 'விரைவுச் சட்ட அமைவுகள்',
-'qbsettings-none' => 'எதுவுமில்லை',
-'qbsettings-fixedleft' => 'நிலைத்த இடது',
-'qbsettings-fixedright' => 'நிலைத்த வலது',
-'qbsettings-floatingleft' => 'மிதப்பு இடது',
-'qbsettings-floatingright' => 'மிதப்பு வலது',
-'qbsettings-directionality' => 'உங்கள் மொழியைப் படிக்கும் திசைக்கு ஏற்ப, நிறுவப்பட்டது',
+'search-error' => 'தேடுகையில் ஒரு பிழை ஏற்பட்டுள்ளது:$1',
 
 # Preferences page
 'preferences' => 'விருப்பங்கள்',
@@ -1152,7 +1180,6 @@ $1",
 'resetprefs' => 'சேமிக்காத மாற்றங்கள் நீக்குக',
 'restoreprefs' => 'எல்லோருக்கும் பொதுவான வடிவமைப்பைத் திரும்பக்கொண்டுவரவும்.',
 'prefs-editing' => 'தொகுத்தல்',
-'prefs-edit-boxsize' => 'தொகுக்கும் சாளரத்தின் அளவு.',
 'rows' => 'நிரைகள் (கிடை வரிசைகள்):',
 'columns' => 'நிரல்கள்',
 'searchresultshead' => 'தேடுக',
@@ -1193,7 +1220,6 @@ $1",
 'prefs-reset-intro' => ' இந்த பக்கத்தை பயன்படுத்தி உங்கள் விருப்பங்களை தள இயல்புநிலைக்கு மீட்டமைக்கலாம்.
 இது செய்யாமல் இருக்க இயலாது.',
 'prefs-emailconfirm-label' => 'மின்னஞ்சலை உறுதிசெய்தல்:',
-'prefs-textboxsize' => 'தொகுக்கும் சாளரத்தின் அளவு',
 'youremail' => 'மின்னஞ்சல்:',
 'username' => '{{GENDER:$1|பயனர் பெயர்}}:',
 'uid' => '{{GENDER:$1|User}} ID:',
@@ -1225,6 +1251,8 @@ $1",
 'prefs-dateformat' => 'தேதியின் வடிவமைப்பு',
 'prefs-timeoffset' => 'நேர வித்தியாசம்',
 'prefs-advancedediting' => 'மேம்பட்ட விருப்பத்தேர்வுகள்',
+'prefs-editor' => 'தொகுப்பாளர்',
+'prefs-preview' => 'முன்தோற்றம்',
 'prefs-advancedrc' => 'மேம்பட்ட விருப்பத்தேர்வுகள்',
 'prefs-advancedrendering' => 'மேம்பட்ட விருப்பத்தேர்வுகள்',
 'prefs-advancedsearchoptions' => 'மேம்பட்ட விருப்பத்தேர்வுகள்',
@@ -1434,7 +1462,6 @@ $1",
 'recentchangeslinked-feed' => 'தொடர்பான மாற்றங்கள்',
 'recentchangeslinked-toolbox' => 'தொடர்பான மாற்றங்கள்',
 'recentchangeslinked-title' => '"$1" பக்கத்துடன் தொடர்புடைய மாற்றங்கள்',
-'recentchangeslinked-noresult' => 'குறித்த நேரத்தில் இப்பக்கத்துடன் இணைக்கப்பட்ட பக்கங்களில் மாற்றங்கள் ஏதுமில்லை.',
 'recentchangeslinked-summary' => 'இந்த சிறப்புப் பக்கம் அண்மைய மாற்றங்களுக்குச் சென்று இந்தக் கட்டுரைக்கான மாற்றங்களைத் தேடுவதைத் தவிர்த்து, இந்தக் கட்டுரையுடன் தொடர்புடைய (அல்லது சிறப்புப் பட்டியலிலுள்ள அங்கத்தவர்களுக்கு) அண்மைய மாற்றங்களை மட்டும் பட்டியலிடுகிறது.இங்கு [[Special:Watchlist|உங்கள் கவனிப்புப் பட்டியலில்]] உள்ள பக்கங்கள் தடித்த எழுத்துக்களில் உள்ளன என்பதைக் கவனத்தில் கொள்ளவும்.',
 'recentchangeslinked-page' => 'பக்கப் பெயர்:',
 'recentchangeslinked-to' => 'இதற்குப் பதிலாக இப்பக்கத்தினை இணைத்த பக்கங்களின் மாற்றங்களைக் காட்டவும்',
@@ -1641,7 +1668,6 @@ $1',
 'http-read-error' => 'HTTP படிப்பதில் பிழை.',
 'http-timed-out' => 'HTTP கோரியதற்கான நேரம் முடிவடைந்துவிட்டது.',
 'http-curl-error' => '$1 உரலியை பெறுவதில் பிழை நேரிட்டது',
-'http-host-unreachable' => 'இணைய முகவரியை (URL) சென்றடைய முடியவில்லை',
 'http-bad-status' => 'HTTP கோரிக்கையில் பிரச்சினை ஏற்பட்டுள்ளது:$1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1785,10 +1811,6 @@ $1',
 'statistics-users-active-desc' => 'கடந்த {{PLURAL:$1|நாள்|$1 நாட்களில்}} ஒன்று அல்லது அதற்கு மேற்பட்ட செயலைச் செய்த பயனர்கள்',
 'statistics-mostpopular' => 'அதிகம் பார்க்கப்பட்ட பக்கங்கள்',
 
-'disambiguations' => 'வழிநெறிப்படுத்தல் பக்கங்களை இணைக்கும் பக்கங்கள்',
-'disambiguationspage' => 'Template:பக்கவழி நெறிப்படுத்தல்',
-'disambiguations-text' => "பின்வரும் பக்கங்கள் '''பக்கவழி நெறிப்படுத்தல் பக்கத்துக்கு''' இணைக்கப்பட்டுள்ளன. மாறாக இவை பொருத்தமன தலைப்பிற்கு இணைக்கப்பட வேண்டும். <br />[[MediaWiki:Disambiguationspage|பக்கவழி நெறிப்படுத்தல் பக்கங்கத்தில்]] உள்ள வார்ப்புரு இணைக்கப்பட்ட பக்கங்கள்  பக்கவழி நெறிப்படுத்தல் பக்கங்கள் என் கருதப்படும்.",
-
 'pageswithprop' => 'பக்கப் பண்புடைய பக்கங்கள்',
 'pageswithprop-submit' => 'செல்க',
 
@@ -2026,10 +2048,9 @@ $1',
 'unwatchthispage' => 'கவனிப்பதை நிறுத்தவும்',
 'notanarticle' => 'ஒரு கட்டுரைப் பக்கமல்ல',
 'notvisiblerev' => 'திருத்தம் நீக்கப்பட்டுள்ளது',
-'watchnochange' => 'காட்சிப்படுத்தப்பட்ட கால இடைவெளியில், கவனிப்பிலுள்ள, உங்கள் விடயமெதுவும் தொகுக்கப்பட்டிருக்கவில்லை.',
 'watchlist-details' => 'பேச்சுப் பக்கங்களைத் தவிர்த்து, {{PLURAL:$1|$1 பக்கம் கவனிக்கப்பட்டது.|$1 பக்கங்கள் கவனிக்கப்பட்டன.}}',
-'wlheader-enotif' => '* மின்னஞ்சல் அறிவித்தல்கள் செயல்படுத்தப்பட்டுள்ளன.',
-'wlheader-showupdated' => "* உமது கடைசி வருகைக்குப் பின்னர் மாற்றங்கள் செய்யப்பட்ட பக்கங்கள் '''தடித்த எழுத்துக்களால்''' காட்டப்பட்டுள்ளன",
+'wlheader-enotif' => 'மின்னஞ்சல் அறிவித்தல்கள் செயல்படுத்தப்பட்டுள்ளன.',
+'wlheader-showupdated' => "உமது கடைசி வருகைக்குப் பின்னர் மாற்றங்கள் செய்யப்பட்ட பக்கங்கள் '''தடித்த எழுத்துக்களால்''' காட்டப்பட்டுள்ளன",
 'watchmethod-recent' => 'கவனிக்கப்படுகின்ற பக்கங்களுக்காக, அண்மைய தொகுப்புகள் தேடிப் பார்க்கப்படுகிறன',
 'watchmethod-list' => 'அண்மைய தொகுப்புகளுக்காக, கவனிக்கப்படுகின்ற பக்கங்கள் தேடிப் பார்க்கப்படுகிறன',
 'watchlistcontains' => 'உங்கள் கவனிப்புப் பட்டியல் {{PLURAL:$1|ஒரு பக்கத்தைக்|$1 பக்கங்களைக்}} கொண்டுள்ளது.',
@@ -2408,12 +2429,9 @@ $1',
 'ipb_blocked_as_range' => 'தவறு:இந்த ஐ.பி. $1 நேரடியாக தடைச் செய்யப்படவில்லை எனவே தடையை நீக்க முடியாது. இது $2 என்ற ஐ.பி. வீச்சு தடைச் செய்யப்பட்டதால் தடைச் செய்யப்பட்டுள்ளது இவ்வீச்சிற்கான தடையை நீக்க முடியும்.',
 'ip_range_invalid' => 'செல்லுபடியற்ற ஐ.பி. வீச்சு',
 'ip_range_toolarge' => '/$1 க்கு பெரிய வரம்பு தடுப்புகள் அனுமதிக்கப்படவில்லை.',
-'blockme' => 'என்னை தடைச் செய்',
 'proxyblocker' => 'மறைவணுக்கம் (புரொக்சி) தடுப்பி',
-'proxyblocker-disabled' => 'இந்தச் செயல் செயலிழக்கச் முடக்கப்பட்டுள்ளது.',
 'proxyblockreason' => 'உங்கள் IP முகவரி தடை செய்யப்பட்டுள்ளது ஏனெனில் இது ஒரு திறந்த பதிலி(proxy).
 தயவுசெய்து உங்கள் இணைய சேவை வழங்குபவரையோ அல்லது உங்கள் நிறுவனத்தின் தொழில்நுட்ப ஆதரவையோ தொடர்பு கொள்ளவும் மேலும் அவர்களிடம் இந்த கடுமையான பாதுகாப்பு பிரச்சினை பற்றி தெரிவியுங்கள்.',
-'proxyblocksuccess' => 'வெற்றி.',
 'sorbsreason' => 'உங்கள் IP முகவரி ஒரு திறந்த பதிலியாக  DNSBL  பயன்படுத்தப்படுவதாக  {{SITENAME}} ல் பட்டியலிடப்பட்டுள்ளது.',
 'sorbs_create_account_reason' => 'உங்கள் IP முகவரி ஒரு திறந்த பதிலியாக  DNSBL  பயன்படுத்தப்படுவதாக  {{SITENAME}} ல் பட்டியலிடப்பட்டுள்ளது.
 உங்களால் கணக்கை உருவாக்க இயலாது.',
@@ -2707,6 +2725,7 @@ $1',
 'tooltip-undo' => '"பின்வாங்கு" என்பது முன்பு செய்த தொகுப்புக்களை இல்லாது செய்கிறது. மேலும் தாங்கள் செய்த தொகுப்பினை முன்தோற்ற நிலைக்கு கொண்டுவந்து காட்டும். அது தங்களுக்குச் சிறுகுறிப்புப் பகுதியில் அதற்கான காரணத்தைக் கூற அனுமதிக்கிறது.',
 'tooltip-preferences-save' => 'விருப்பங்களை சேமி',
 'tooltip-summary' => 'குறுகிய சுருக்கத்தை உள்ளிடவும்.',
+'tooltip-iwiki' => '$1 - $2',
 
 # Metadata
 'notacceptable' => 'உங்களது சேவையாளர் வாசிக்க கூடிய விதத்தில் இந்த விக்கியால தரவுகளை வழங்க முடியாது.',
@@ -2772,8 +2791,6 @@ $1',
 'pageinfo-category-files' => 'கோப்புகளின் எண்ணிக்கை',
 
 # Skin names
-'skinname-standard' => 'இயல்பான',
-'skinname-nostalgia' => 'பசுமை நினைவு (Nostalgia)',
 'skinname-cologneblue' => 'கொலோன் (Cologne) நீலம் Blue',
 
 # Patrolling
@@ -2850,6 +2867,16 @@ $1',
 'ago' => '$1 முன்பு',
 'just-now' => 'சடுதியில்.',
 
+# Human-readable timestamps
+'monday-at' => 'திங்கள் $1 மணிக்கு',
+'tuesday-at' => 'செவ்வாய் $1 மணிக்கு',
+'wednesday-at' => 'புதன் $1 மணிக்கு',
+'thursday-at' => 'வியாழன் $1 மணிக்கு',
+'friday-at' => 'வெள்ளி $1 மணிக்கு',
+'saturday-at' => 'சனி $1 மணிக்கு',
+'sunday-at' => 'ஞாயிறு $1 மணிக்கு',
+'yesterday-at' => 'நேற்று $1 மணிக்கு',
+
 # Bad image list
 'bad_image_list' => 'முறை பின்வருமாறு:
 
@@ -2877,7 +2904,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'அகலம்',
 'exif-imagelength' => 'உயரம்',
 'exif-bitspersample' => 'ஒவ்வொரு உறுப்பின்படி பிட்கள்.',
@@ -3054,7 +3081,7 @@ $1',
 'exif-originalimageheight' => 'சரிசெய்யப்படும் முன் படத்தின் உயரம்',
 'exif-originalimagewidth' => 'சரிசெய்யப்படும் முன் படத்தின் அகலம்',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'சுருக்கப்படாத',
 
 'exif-copyrighted-true' => 'பதிப்புரிமைப்பட்டது',
@@ -3431,7 +3458,6 @@ $5
 'version-other' => 'பிறர்',
 'version-mediahandlers' => 'ஊடக கையாளிகள்',
 'version-hooks' => 'கொக்கிகள்',
-'version-extension-functions' => 'நீட்சி செயற்பாடுகள்',
 'version-parser-extensiontags' => 'இலக்கணப் பாகுபடுத்தி நீட்சி குறிச்சொற்கள்',
 'version-parser-function-hooks' => 'இலக்கணப் பாகுபடுத்தி செயற்பாட்டு கொக்கிகள்',
 'version-hook-name' => 'கொக்கியின் பெயர்',
@@ -3450,12 +3476,11 @@ $5
 'version-entrypoints-header-entrypoint' => 'நுழைவு புள்ளி',
 'version-entrypoints-header-url' => 'உரலி (URL)',
 
-# Special:FilePath
-'filepath' => 'கோப்பு வழி',
-'filepath-page' => 'கோப்பு:',
-'filepath-submit' => 'செல்',
-'filepath-summary' => 'இச்சிறப்புப் பக்கம் கோப்பு ஒன்றுக்கான முழுமையான முகவரியை பெற்றுக் கொடுக்கிறது.
-படிமங்கள் அவற்றின் முழு அளவில் காட்டபடுவதோடு ஏனைய கோப்புகள் அவற்றுக்கான மென்பொருளில் நேரடியாகத் திறக்கப்படும்.',
+# Special:Redirect
+'redirect-submit' => 'செல்க',
+'redirect-lookup' => 'கவனிக்கவும்:',
+'redirect-file' => 'கோப்பின் பெயர்',
+'redirect-not-exists' => 'மதிப்பு காணப்பெறவில்லை',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'நகல் கோப்புகளைத் தேடுக',
@@ -3510,6 +3535,8 @@ $5
 'tags-display-header' => 'கவனிப்புப் பட்டியலில் தெரியும் பெயர்',
 'tags-description-header' => 'விரிவான விளக்கம்',
 'tags-hitcount-header' => 'மாற்றங்களின் எண்ணிக்கை',
+'tags-active-yes' => 'ஆம்',
+'tags-active-no' => 'இல்லை',
 'tags-edit' => 'தொகு',
 'tags-hitcount' => '$1 {{PLURAL:$1|மாற்றம்|மாற்றங்கள்}}',
 
@@ -3545,6 +3572,9 @@ $5
 'htmlform-submit' => 'சமர்ப்பி',
 'htmlform-reset' => 'மாற்றங்களை இல்லாது செய்',
 'htmlform-selectorother-other' => 'மற்றவை',
+'htmlform-no' => 'இல்லை',
+'htmlform-yes' => 'ஆம்',
+'htmlform-chosen-placeholder' => 'விருப்பத்தினைத் தேர்க',
 
 # SQLite database support
 'sqlite-has-fts' => '$1முழு-உரை தேடல் ஆதரவுடன்',
diff --git a/languages/messages/MessagesTcy.php b/languages/messages/MessagesTcy.php
index 163d3643..238be258 100644
--- a/languages/messages/MessagesTcy.php
+++ b/languages/messages/MessagesTcy.php
@@ -43,8 +43,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ಪುಟೊನು ತೂವೊಂದುಪ್ಪುನಂಚಿನ ಸದಸ್ಯೆರ್’ನ ಸಂಖ್ಯೆನ್ ತೊಜ್ಪಾಲೆ',
 'tog-oldsig' => 'ಇತ್ತೆದ ಸಹಿ',
 'tog-fancysig' => 'ಸರಳ ಸಹಿಗಳು (ಲಿಂಕ್ ಇಜ್ಜಂದಿಲೆಕ)',
-'tog-externaleditor' => 'ಯಾಪಲ ಪಿದಯಿದ ಸಂಪಾದನೆ ಉಪಕರಣದ ಉಪಯೋಗ ಮನ್ಪುಲೆ (ಅನುಭವ ಉಪ್ಪುನಂಚಿನ ಸದಸ್ಯೆರೆಗ್ ಮಾತ್ರ, ನಿಕ್ಲೆನ ಕಂಪ್ಯೂಟರ್’ಡ್ ವಿಶೇಷವಾಯಿನ ಬದಲಾವಣೆಲು ಬೋಡಾಪುಂಡು)',
-'tog-externaldiff' => 'ಬಾಹ್ಯ ಮುನ್ನೋಟನ್ ಯಾಪಲ ಉಪಯೋಗ ಮಲ್ಪುಲೆ (ಅನುಭವ ಉಪ್ಪುನಂಚಿನ ಸದಸ್ಯೆರೆಗ್ ಮಾತ್ರ, ನಿಕ್ಲೆನ ಕಂಪ್ಯೂಟರ್’ಡ್ ವಿಶೇಷ ಬದಲಾವಣೆಲು ಬೋಡಾಪುಂಡು)',
 'tog-uselivepreview' => 'ನೇರ ಮುನ್ನೋಟನ್ ಉಪಯೋಗ ಮಲ್ಪುಲೆ (JavaScript) (ಪ್ರಾಯೋಗಿಕ)',
 'tog-forceeditsummary' => 'ಸಂಪಾದನೆ ಸಾರಾಂಶೊನು ಖಾಲಿ ಬುಡ್’ನ್ಡ್ ಎಂಕ್ ನೆನಪು ಮಲ್ಪುಲೆ',
 'tog-watchlisthideown' => 'ವೀಕ್ಷಣಾಪಟ್ಟಿಡ್ ಎನ್ನ ಸಂಪಾದನೆಲೆನ್ ತೊಜ್’ಪಾವೊಚಿ',
@@ -233,7 +231,7 @@ $messages = array(
 'jumptosearch' => 'ನಾಡ್’ಲೆ',
 'pool-errorunknown' => 'ಗೊತ್ತಿಂಜಂದಿನ  ದೋಷ',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} ದ ಬಗ್ಗೆ',
 'aboutpage' => 'Project:ನಮ್ಮ ಬಗ್ಗೆ',
 'copyright' => 'ಉಂದು ಈ ಕಾಪಿರೈಟ್‌ಡ್ ಲಭ್ಯವುಂಡು $1.',
@@ -243,7 +241,6 @@ $messages = array(
 'disclaimers' => 'ಅಬಾಧ್ಯತೆಲು',
 'disclaimerpage' => 'Project:ಸಾಮಾನ್ಯ ಅಬಾಧ್ಯತೆಲು',
 'edithelp' => 'ಸಂಪಾದನೆ(ಎಡಿಟ್) ಮಲ್ಪೆರೆ ಸಹಾಯ',
-'edithelppage' => 'Help:ಸಂಪಾದನೆ',
 'helppage' => 'Help:ಪರಿವಿಡಿ',
 'mainpage' => 'ಮುಖ್ಯ ಪುಟ',
 'mainpage-description' => 'ಮುಖ್ಯ ಪುಟ',
@@ -268,7 +265,6 @@ $messages = array(
 'newmessagesdifflink' => 'ಕಡೆತ ಬದಲಾವಣೆ',
 'youhavenewmessagesmulti' => '$1 ಡ್ ಇರೆಗ್ ಪೊಸ ಸಂದೇಶೊಲು ಉಂಡು',
 'editsection' => 'ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ',
-'editsection-brackets' => '[$1]',
 'editold' => 'ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ',
 'viewsourceold' => 'ಮೂಲೊನು ತೂಲೆ',
 'editlink' => 'ಎಡಿಟ್ ಮಲ್ಪುಲೆ',
@@ -565,7 +561,6 @@ $messages = array(
 'nextn' => 'ಬೊಕ್ಕದ {{PLURAL:$1|$1}}',
 'viewprevnext' => 'ತೂಲೆ ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'ನಾಡಾಟದ ಆಯ್ಕೆಲು',
-'searchhelp-url' => 'Help:ಪರಿವಿಡಿ',
 'searchprofile-articles' => 'ಲೇಖನ ಪುಟೊ',
 'searchprofile-images' => 'ಬಹುಮಾಧ್ಯಮ',
 'searchprofile-everything' => 'ಪ್ರತಿಯೊಂಜಿ',
@@ -690,7 +685,6 @@ $messages = array(
 'recentchangeslinked-feed' => 'ಸಂಬಂಧ ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು',
 'recentchangeslinked-toolbox' => 'ಸಂಬಂಧ ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು',
 'recentchangeslinked-title' => '"$1" ಪುಟೊಟು ಆತಿನ ಬದಲಾವಣೆಲು',
-'recentchangeslinked-noresult' => 'ಕೊರ್ತಿನ ಸಮಯೊಡು ಲಿಂಕ್ ಉಪ್ಪುನ ಪುಟೊಲೆಡ್ ಓವುಲಾ ಬದಲಾವಣೆಲು ಆತಿಜಿ.',
 'recentchangeslinked-summary' => "ಒಂಜಿ ನಿರ್ದಿಷ್ಟ ಪುಟೊರ್ದು (ಅತ್ತ್’ನ್ಡ ನಿರ್ದಿಷ್ಟ ವರ್ಗೊಗು ಸೇರ್ದಿನ ಪುಟೊಲೆರ್ದ್) ಸಂಪರ್ಕ ಉಪ್ಪುನ ಪುಟೊಲೆಡ್ ಇಂಚಿಪ ಮಲ್ತಿನಂಚಿನ ಬದಲಾವಣೆಲೆನ್ ತಿರ್ತ್ ಪಟ್ಟಿ ಮಲ್ಪೆರಾತ್’ನ್ಡ್.
 [[Special:Watchlist|ಇರೆನ ವೀಕ್ಷಣಾಪಟ್ಟಿಡ್]] ಉಪ್ಪುನ ಪುಟೊಲು '''ದಪ್ಪ ಅಕ್ಷರೊಡು''' ಉಂಡು.",
 'recentchangeslinked-page' => 'ಪುಟೊತ ಪುದರ್:',
@@ -743,8 +737,6 @@ $messages = array(
 'statistics' => 'ಅಂಕಿ ಅಂಶೊಲು',
 'statistics-header-pages' => 'ಪುಟೊತ ಅಂಕಿ ಅಂಶಲು',
 
-'disambiguationspage' => 'ದ್ವಂದ್ವ ನಿವಾರಣೆ',
-
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}',
 'nmembers' => '$1 {{PLURAL:$1|ಸದಸ್ಯೆ|ಸದಸ್ಯೆರ್}}',
diff --git a/languages/messages/MessagesTe.php b/languages/messages/MessagesTe.php
index 1aab5ea4..8e8cbb84 100644
--- a/languages/messages/MessagesTe.php
+++ b/languages/messages/MessagesTe.php
@@ -174,9 +174,6 @@ $messages = array(
 'tog-shownumberswatching' => 'వీక్షకుల సంఖ్యను చూపించు',
 'tog-oldsig' => 'ప్రస్తుత సంతకం:',
 'tog-fancysig' => 'సంతకాన్ని వికీపాఠ్యంగా తీసుకో (ఆటోమెటిక్‌ లింకు లేకుండా)',
-'tog-externaleditor' => 'మామూలుగా బయటి ఎడిటరును వాడు (నిపుణులకు మాత్రమే. మీ కంప్యూటర్లో ప్రత్యేక అమరికలు అవసరమవుతాయి. [//www.mediawiki.org/wiki/Manual:External_editors మరింత సమాచారం.])',
-'tog-externaldiff' => 'మార్పులను చూడటానికి బయటి సాఫ్టువేరును వాడు (నిపుణులకు మాత్రమే, మీ కంప్యూటర్లో ప్రత్యేక అమరికలు అవసరమవుతాయి. [//www.mediawiki.org/wiki/Manual:External_editors మరింత సమాచారం.])',
-'tog-showjumplinks' => '"ఇక్కడికి గెంతు" లింకులను చూపించు',
 'tog-uselivepreview' => 'రాస్తున్నదానిని ఎప్పటికప్పుడు సరిచూడండి (జావాస్క్రిప్టు) (పరీక్షాదశలో ఉంది)',
 'tog-forceeditsummary' => 'దిద్దుబాటు సారాంశం ఖాళీగా ఉంటే ఆ విషయాన్ని నాకు సూచించు',
 'tog-watchlisthideown' => 'నా మార్పులను వీక్షణా జాబితాలో చూపించొద్దు',
@@ -189,6 +186,7 @@ $messages = array(
 'tog-diffonly' => 'తేడాలను చూపిస్తున్నపుడు, కింద చూపించే పేజీలోని సమాచారాన్ని చూపించొద్దు',
 'tog-showhiddencats' => 'దాచిన వర్గాలను చూపించు',
 'tog-norollbackdiff' => 'రద్దు చేసాక తేడాలు చూపించవద్దు',
+'tog-useeditwarning' => 'ఏదైనా పేజీని నేను వదిలివెళ్తున్నప్పుడు దానిలో భద్రపరచని మార్పులు ఉంటే నన్ను హెచ్చరించు',
 
 'underline-always' => 'ఎల్లప్పుడూ',
 'underline-never' => 'ఎప్పటికీ వద్దు',
@@ -252,6 +250,18 @@ $messages = array(
 'oct' => 'అక్టో',
 'nov' => 'నవం',
 'dec' => 'డిసెం',
+'january-date' => 'జనవరి $1',
+'february-date' => 'ఫిబ్రవరి $1',
+'march-date' => 'మార్చి $1',
+'april-date' => 'ఏప్రిల్ $1',
+'may-date' => 'మే $1',
+'june-date' => 'జూన్ $1',
+'july-date' => 'జూలై $1',
+'august-date' => 'ఆగస్టు $1',
+'september-date' => 'సెప్టెంబర్ $1',
+'october-date' => 'అక్టోబర్ $1',
+'november-date' => 'నవంబర్ $1',
+'december-date' => 'డిసెంబర్ $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|వర్గం|వర్గాలు}}',
@@ -375,7 +385,7 @@ $1',
 'pool-queuefull' => 'సమూహపు వరుస నిండుగా ఉంది',
 'pool-errorunknown' => 'గుర్తుతెలియని పొరపాటు',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} గురించి',
 'aboutpage' => 'Project:గురించి',
 'copyright' => 'విషయ సంగ్రహం $1  కి లోబడి లభ్యం.',
@@ -385,7 +395,6 @@ $1',
 'disclaimers' => 'అస్వీకారములు',
 'disclaimerpage' => 'Project:సాధారణ నిష్పూచీ',
 'edithelp' => 'దిద్దుబాటు సహాయం',
-'edithelppage' => 'Help:దిద్దుబాట్లు ఎలా చెయ్యాలి',
 'helppage' => 'Help:సూచిక',
 'mainpage' => 'మొదటి పేజీ',
 'mainpage-description' => 'తలపుట',
@@ -462,17 +471,6 @@ $1',
 # General errors
 'error' => 'లోపం',
 'databaseerror' => 'డేటాబేసు లోపం',
-'dberrortext' => 'డేటాబేసుకు పంపిన క్వీరీలో ఒక తప్పు దొర్లింది.
-ఇది సాఫ్టువేరులోనే ఉన్న లోపం గావచ్చు.
-చివరి సారిగా డేటాబేసుకు పంపిన క్వీరీ ఇది:
-<blockquote><tt>$1</tt></blockquote>
-దీనిని "<tt>$2</tt>" అనే ఫంక్షను నుండి వచ్చింది.
-డేటాబేసు ఇచ్చిన లోప-సమాచారం "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'డేటాబేసుకు పంపిన క్వీరీలో ఒక తప్పు దొర్లింది.
-చివరి సారిగా డేటాబేసుకు పంపిన క్వీరీ ఇది:
-"$1"
-దీనిని "$2" అనే ఫంక్షను నుండి వచ్చింది.
-డేటాబేసు ఇచ్చిన లోప-సమాచారం "$3: $4".',
 'laggedslavemode' => 'హెచ్చరిక: పేజీలో ఇటీవల జరిగిన మార్పులు ఉండకపోవచ్చు.',
 'readonly' => 'డేటాబేసు లాక్‌చెయ్యబడింది',
 'enterlockreason' => 'డేటాబేసుకు వేయబోతున్న లాకుకు కారణం తెలుపండి, దానితోపాటే ఎంతసమయం తరువాత ఆ లాకు తీసేస్తారో కూడా తెలుపండి',
@@ -525,7 +523,6 @@ $1',
 'editinginterface' => "'''హెచ్చరిక''': సాఫ్టువేరుకు ఇంటరుఫేసు టెక్స్టును అందించే పేజీని మీరు సరిదిద్దుతున్నారు.
 ఈ పేజీలో చేసే మార్పుల వల్ల ఇతర వాడుకరులకు ఇంటరుఫేసు కనబడే విధానంలో తేడావస్తుంది.
 అనువాదాల కొరకైతే, [//translatewiki.net/wiki/Main_Page?setlang=te ట్రాన్స్‌లేట్ వికీ.నెట్], మీడియావికీ స్థానికీకరణ ప్రాజెక్టు, ని వాడండి.",
-'sqlhidden' => '(SQL క్విరీని చూపించటం లేదు)',
 'cascadeprotected' => 'కింది {{PLURAL:$1|పేజీని|పేజీలను}} కాస్కేడింగు ఆప్షనుతో చేసి సంరక్షించారు. ప్రస్తుత పేజీ, ఈ పేజీల్లో ఇంక్లూడు అయి ఉంది కాబట్టి, దిద్దుబాటు చేసే వీలు లేకుండా ఇది కూడా రక్షణలో ఉంది.
 $2',
 'namespaceprotected' => "'''$1''' నేంస్పేసులో మార్పులు చేయటానికి మీకు అనుమతి లేదు.",
@@ -553,10 +550,17 @@ $2',
 *వికీని త్వరగా అర్థం చేసుకునేందుకు [[వికీపీడియా:5 నిమిషాల్లో వికీ|5 నిమిషాల్లో వికీ]] పేజీని చూడండి.
 *తెలుగులో రాసేందుకు ఇంగ్లీషు అక్షరాల ఉచ్ఛారణతో తెలుగు టైపు చేసే [[వికీపీడియా:టైపింగు సహాయం| టైపింగ్  సహాయం]] వాడవచ్చు. మరిన్ని ఉపకరణాల కొరకు [[కీ బోర్డు]] మరియు   తెరపై తెలుగు సరిగా లేకపోతే[[వికీపీడియా:Setting up your browser for Indic scripts|ఈ పేజీ]]  చూడండి.',
 'yourname' => 'వాడుకరి పేరు:',
+'userlogin-yourname' => 'వాడుకరి పేరు',
+'userlogin-yourname-ph' => 'మీ వాడుకరి పేరును ఇవ్వండి',
 'yourpassword' => 'సంకేతపదం:',
+'userlogin-yourpassword' => 'సంకేతపదం',
+'userlogin-yourpassword-ph' => 'మీ సంకేతపదాన్ని ఇవ్వండి',
+'createacct-yourpassword-ph' => 'సంకేతపదాన్ని ఇవ్వండి',
 'yourpasswordagain' => 'సంకేతపదాన్ని మళ్ళీ ఇవ్వండి:',
+'createacct-yourpasswordagain' => 'సంకేతపదాన్ని నిర్ధారించండి',
+'createacct-yourpasswordagain-ph' => 'సంకేతపదాన్ని మళ్ళీ ఇవ్వండి',
 'remembermypassword' => 'ఈ కంప్యూటరులో నా ప్రవేశాన్ని గుర్తుంచుకో (గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజుల}}కి)',
-'securelogin-stick-https' => 'ప్రవేశం తర్వాత కూడా HTTPSకి అనుసంధానమై ఉండు',
+'userlogin-remembermypassword' => 'నన్ను ప్రవేశింపజేసి ఉంచు',
 'yourdomainname' => 'మీ డోమైను',
 'password-change-forbidden' => 'ఈ వికీలో మీరు సంకేతపదాలను మార్చలేరు.',
 'externaldberror' => 'డేటాబేసు అధీకరణలో పొరపాటు జరిగింది లేదా మీ బయటి ఖాతాని తాజాకరించడానికి మీకు అనుమతి లేదు.',
@@ -568,18 +572,37 @@ $2',
 'logout' => 'నిష్క్రమించు',
 'userlogout' => 'నిష్క్రమించు',
 'notloggedin' => 'లోనికి ప్రవేశించి లేరు',
+'userlogin-noaccount' => 'మీకు ఖాతా లేదా?',
+'userlogin-joinproject' => '{{SITENAME}}లో చేరండి',
 'nologin' => 'ఖాతా లేదా? $1.',
 'nologinlink' => 'ఖాతాని సృష్టించుకోండి',
 'createaccount' => 'ఖాతాని సృష్టించు',
 'gotaccount' => 'ఇప్పటికే మీకు ఖాతా ఉందా? $1.',
 'gotaccountlink' => 'ప్రవేశించండి',
 'userlogin-resetlink' => 'మీ ప్రవేశ వివరాలను మరచిపోయారా?',
+'userlogin-resetpassword-link' => 'మీ దాటుమాటను మార్చుకోండి',
+'helplogin-url' => 'Help:ప్రవేశించడం',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ప్రవేశించడానికి సహాయం]]',
+'createacct-join' => 'మీ సమాచారాన్ని క్రింద ఇవ్వండి.',
+'createacct-emailrequired' => 'ఈమెయిలు చిరునామా',
+'createacct-emailoptional' => 'ఈమెయిలు చిరునామా (ఐచ్చికం)',
+'createacct-email-ph' => 'మీ ఈమెయిలు చిరునామాను ఇవ్వండి',
 'createaccountmail' => 'తాత్కాలిక యాదృచ్చిక సంకేతపదాన్ని వాడి దాన్ని ఈ క్రింద ఇచ్చిన ఈమెయిలు చిరునామాకు పంపించు',
+'createacct-realname' => 'అసలు పేరు (ఐచ్చికం)',
 'createaccountreason' => 'కారణం:',
+'createacct-reason' => 'కారణం',
+'createacct-reason-ph' => 'మీరు మరో ఖాతాను ఎందుకు సృష్టించుకుంటున్నారు',
+'createacct-captcha' => 'భద్రతా తనిఖీ',
+'createacct-imgcaptcha-ph' => 'పైన కనబడే మాటలను ఇక్కడ ఇవ్వండి',
+'createacct-submit' => 'మీ ఖాతాను సృష్టించుకోండి',
+'createacct-benefit-heading' => '{{SITENAME}}ను తయారుచేసేది మీలాంటి ప్రజలే.',
+'createacct-benefit-body1' => '{{PLURAL:$1|మార్పు|మార్పులు}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|పేజీ|పేజీలు}}',
 'badretype' => 'మీరు ఇచ్చిన రెండు సంకేతపదాలు ఒకదానితో మరొకటి సరిపోలడం లేదు.',
 'userexists' => 'ఇచ్చిన వాడుకరిపేరు ఇప్పటికే వాడుకలో ఉంది.
 వేరే పేరును ఎంచుకోండి.',
 'loginerror' => 'ప్రవేశంలో పొరపాటు',
+'createacct-error' => 'పద్దు తెరవడములో తప్పు',
 'createaccounterror' => 'ఖాతాని సృష్టించలేకపోయాం: $1',
 'nocookiesnew' => 'ఖాతాని సృష్టించాం, కానీ మీరు ఇంకా లోనికి ప్రవేశించలేదు.
 వాడుకరుల ప్రవేశానికి {{SITENAME}} కూకీలను వాడుతుంది.
@@ -656,7 +679,7 @@ $2',
 'newpassword' => 'కొత్త సంకేతపదం:',
 'retypenew' => 'సంకేతపదం, మళ్ళీ',
 'resetpass_submit' => 'సంకేతపదాన్ని మార్చి లోనికి ప్రవేశించండి',
-'resetpass_success' => 'మీ సంకేతపదాన్ని జయప్రదంగా మార్చాం! ఇక మిమ్మల్ని లోనికి ప్రవేశింపచేస్తున్నాం...',
+'changepassword-success' => 'మీ సంకేతపదాన్ని జయప్రదంగా మార్చాం! ఇక మిమ్మల్ని లోనికి ప్రవేశింపచేస్తున్నాం...',
 'resetpass_forbidden' => 'సంకేతపదాలను మార్చటం కుదరదు',
 'resetpass-no-info' => 'ఈ పేజీని నేరుగా చూడటానికి మీరు లోనికి ప్రవేశించివుండాలి.',
 'resetpass-submit-loggedin' => 'సంకేతపదాన్ని మార్చు',
@@ -667,10 +690,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'సంకేతపదాన్ని మార్చుకోండి',
-'passwordreset-text' => 'మీ ఖాతా వివరాలను గుర్తు చేసే ఈమెయిలు కోసం ఈ ఫారాన్ని పూర్తి చెయ్యండి.',
 'passwordreset-legend' => 'సంకేతపదాన్ని మార్చుకోండి',
 'passwordreset-disabled' => 'ఈ వికీలో సంకేతపదాల మార్పును అచేతనం చేసాం.',
-'passwordreset-pretext' => '{{PLURAL:$1||డేటా శకలాల్లోంచి ఒకదాన్ని ఇవ్వండి}}',
 'passwordreset-username' => 'వాడుకరి పేరు:',
 'passwordreset-domain' => 'డొమైన్:',
 'passwordreset-email' => 'ఈ-మెయిలు చిరునామా:',
@@ -885,10 +906,13 @@ $2
 దీన్ని తొలగించినట్టున్నారు.',
 'edit-conflict' => 'మార్పు సంఘర్షణ.',
 'edit-no-change' => 'పాఠ్యంలో ఏమీ మార్పులు లేవు గనక, మీ మార్పుని పట్టించుకోవట్లేదు.',
+'postedit-confirmation' => 'మీ మార్పు భద్రమయ్యింది.',
 'edit-already-exists' => 'కొత్త పేజీని సృష్టించలేము.
 అది ఇప్పటికే ఉంది.',
 'defaultmessagetext' => 'అప్రమేయ సందేశపు పాఠ్యం',
 'invalid-content-data' => 'తప్పుడు విషయం',
+'editwarning-warning' => 'ఈ పేజీని వదిలివెళ్ళడం వల్ల మీరు చేసిన మార్పులను కోల్పోయే అవకాశం ఉంది.
+మీరు ప్రవేశించివుంటే, ఈ హెచ్చరికని మీ అభిరుచులలో "మరపులు" అనే విభాగంలో అచేతనం చేసుకోవచ్చు.',
 
 # Content models
 'content-model-wikitext' => 'వికీపాఠ్యం',
@@ -1117,7 +1141,6 @@ $1",
 'searchmenu-legend' => 'అన్వేషణ ఎంపికలు',
 'searchmenu-exists' => "'''ఈ వికీలో \"[[:\$1]]\" అనే పేజీ ఉంది'''",
 'searchmenu-new' => "'''ఈ వికీలో \"[[:\$1]]\" అనే పేరుతో పేజీని సృష్టించు!'''",
-'searchhelp-url' => 'Help:సూచిక',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ఈ ఉపసర్గ ఉన్న పేజీలను చూడండి]]',
 'searchprofile-articles' => 'విషయపు పేజీలు',
 'searchprofile-project' => 'సహాయం మరియు ప్రాజెక్టు పేజీలు',
@@ -1159,15 +1182,6 @@ $1",
 'search-external' => 'బయటి అన్వేషణ',
 'searchdisabled' => '{{SITENAME}} అన్వేషణ తాత్కాలికంగా పని చెయ్యడం లేదు. ఈలోగా మీరు గూగుల్‌ ఉపయోగించి అన్వేషించవచ్చు. ఒక గమనిక: గూగుల్‌ ద్వారా కాలదోషం పట్టిన ఫలితాలు రావడానికి అవకాశం ఉంది.',
 
-# Quickbar
-'qbsettings' => 'క్విక్‌బార్',
-'qbsettings-none' => 'ఏదీకాదు',
-'qbsettings-fixedleft' => 'స్థిర ఎడమ',
-'qbsettings-fixedright' => 'స్థిర కుడి',
-'qbsettings-floatingleft' => 'ఎడమకు ఒదిగి',
-'qbsettings-floatingright' => 'కుడికి ఒదిగి',
-'qbsettings-directionality' => 'స్థిరం, మీ లిపి మరియు భాషల యొక్క దిశ ఆధారంగా',
-
 # Preferences page
 'preferences' => 'అభిరుచులు',
 'mypreferences' => 'అభిరుచులు',
@@ -1200,7 +1214,6 @@ $1",
 'resetprefs' => 'మునుపటి వలె',
 'restoreprefs' => 'సృష్టించబడినప్పటి అభిరుచులు తిరిగి తీసుకురా',
 'prefs-editing' => 'మార్పులు',
-'prefs-edit-boxsize' => 'మార్పుల కిటికీ యొక్క పరిమాణం.',
 'rows' => 'వరుసలు',
 'columns' => 'వరుసలు:',
 'searchresultshead' => 'అన్వేషణ',
@@ -1211,8 +1224,6 @@ $1",
 'recentchangesdays-max' => '($1 {{PLURAL:$1|రోజు|రోజులు}} గరిష్ఠం)',
 'recentchangescount' => 'అప్రమేయంగా చూపించాల్సిన దిద్దుబాట్ల సంఖ్య:',
 'prefs-help-recentchangescount' => 'ఇది ఇటీవలి మార్పులు, పేజీ చరిత్రలు, మరియు చిట్టాలకు వర్తిస్తుంది.',
-'prefs-help-watchlist-token' => 'ఈ క్షేత్రాన్ని ఒక రహస్య కీతో నింపితే, మీ వీక్షణ జాబితాకు ఒక RSS వడ్డన తయారవుతుంది.  ఆ కీ తెలిసిన వారెవరైనా మీ వీక్షణజాబితాను చూడగలుగుతారు. అందుచేత కీని జాగ్రత్తగా ఎంచుకోండి.
-ఇదిగో, అనామతుగా సృష్టించిన ఒక కీ -మీకోసం: $1',
 'savedprefs' => 'మీ అభిరుచులను భద్రపరిచాం.',
 'timezonelegend' => 'కాల మండలం:',
 'localtime' => 'స్థానిక సమయం:',
@@ -1242,7 +1253,6 @@ $1",
 'prefs-common-css-js' => 'అన్ని అలంకారాలకై పంచుకోబడిన CSS/JS:',
 'prefs-reset-intro' => 'ఈ పేజీలో, మీ అభిరుచులను సైటు డిఫాల్టు విలువలకు మార్చుకోవచ్చు. మళ్ళీ వెనక్కి తీసుకుపోలేరు.',
 'prefs-emailconfirm-label' => 'ఈ-మెయిల్ నిర్ధారణ:',
-'prefs-textboxsize' => 'దిద్దుబాటు కిటికీ పరిమాణం',
 'youremail' => 'మీ ఈ-మెయిలు*',
 'username' => '{{GENDER:$1|వాడుకరి పేరు}}:',
 'uid' => '{{GENDER:$1|వాడుకరి}} ID:',
@@ -1440,6 +1450,7 @@ $1",
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|ఒక మార్పు|$1 మార్పులు}}',
+'enhancedrc-history' => 'చరితం',
 'recentchanges' => 'ఇటీవలి మార్పులు',
 'recentchanges-legend' => 'ఇటీవలి మార్పుల ఎంపికలు',
 'recentchanges-summary' => 'వికీలో ఇటీవలే జరిగిన మార్పులను ఈ పేజీలో గమనించవచ్చు.',
@@ -1479,7 +1490,6 @@ $1",
 'recentchangeslinked-feed' => 'సంబంధిత మార్పులు',
 'recentchangeslinked-toolbox' => 'పొంతనగల మార్పులు',
 'recentchangeslinked-title' => '$1 కు సంబంధించిన మార్పులు',
-'recentchangeslinked-noresult' => 'మీరిచ్చిన కాలంలో ఇక్కడికి లింకు ఉన్న పేజీలలో ఎటువంటు మార్పులూ జరగలేదు.',
 'recentchangeslinked-summary' => "దీనికి లింకై ఉన్న పేజీల్లో జరిగిన చివరి మార్పులు ఇక్కడ చూడవచ్చు. మీ వీక్షణ జాబితాలో ఉన్న పేజీలు '''బొద్దు'''గా ఉంటాయి.",
 'recentchangeslinked-page' => 'పేజీ పేరు:',
 'recentchangeslinked-to' => 'ఇచ్చిన పేజీకి లింకయివున్న పేజీలలో జరిగిన మార్పులను చూపించు',
@@ -1661,7 +1671,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'http-read-error' => 'HTTP చదువుటలో పొరపాటు.',
 'http-timed-out' => 'HTTP అభ్యర్థనకి కాలం చెల్లింది.',
 'http-curl-error' => 'URLని తేవడంలో పొరపాటు: $1',
-'http-host-unreachable' => 'URLని చేరలేకపోయాం.',
 'http-bad-status' => 'HTTP అభ్యర్ధన చేస్తున్నప్పుడు సమస్య ఉంది: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1807,10 +1816,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'statistics-users-active-desc' => 'గత {{PLURAL:$1|రోజు|$1 రోజుల}}లో ఒక్క చర్యైనా చేసిన వాడుకరులు',
 'statistics-mostpopular' => 'ఎక్కువగా చూసిన పేజీలు',
 
-'disambiguations' => 'అయోమయ నివృత్తి పుటలకు లింకున్న పుటలు',
-'disambiguationspage' => 'Template:అయోమయ నివృత్తి',
-'disambiguations-text' => "కింది పేజీలు '''అయోమయ నివృత్తి''' పేజీకి లింకవుతున్నాయి. కానీ అవి సంబంధిత పేజీకి నేరుగా లింకు అవాలి. <br /> [[MediaWiki:Disambiguationspage]] నుంది లింకు ఉన్న మూసను వాడే పేజీని అయోమయ నివృత్తి పేజీగా భావిస్తారు.",
-
 'pageswithprop-submit' => 'వెళ్ళు',
 
 'doubleredirects' => 'జంట దారిమార్పులు',
@@ -2050,10 +2055,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'unwatchthispage' => 'వీక్షణను ఆపు',
 'notanarticle' => 'వ్యాసం పేజీ కాదు',
 'notvisiblerev' => 'ఈ కూర్పును తొలగించాం',
-'watchnochange' => 'మీ వీక్షణ జాబితాలోని ఏ పేజీలోనూ ఈ కాల అవధిలో మార్పులు జరగలేదు.',
 'watchlist-details' => 'మీ వీక్షణ జాబితాలో {{PLURAL:$1|ఒక పేజీ ఉంది|$1 పేజీలు ఉన్నాయి}}, చర్చా పేజీలని వదిలేసి.',
-'wlheader-enotif' => '* ఈ-మెయిలు ప్రకటనలు పంపబడతాయి.',
-'wlheader-showupdated' => "* మీ గత సందర్శన తరువాత మారిన పేజీలు '''బొద్దు'''గా చూపించబడ్డాయి.",
+'wlheader-enotif' => 'ఈ-మెయిలు ప్రకటనలు పంపబడతాయి.',
+'wlheader-showupdated' => "మీ గత సందర్శన తరువాత మారిన పేజీలు '''బొద్దు'''గా చూపించబడ్డాయి.",
 'watchmethod-recent' => 'వీక్షణ జాబితాలోని పేజీల కొరకు ఇటీవలి మార్పులు పరిశీలించబడుతున్నాయి',
 'watchmethod-list' => 'ఇటీవలి మార్పుల కొరకు వీక్షణ జాబితాలోని పేజీలు పరిశీలించబడుతున్నాయి',
 'watchlistcontains' => 'మీ వీక్షణ జాబితాలో {{PLURAL:$1|ఒక పేజీ ఉంది|$1 పేజీలు ఉన్నాయి}}.',
@@ -2429,11 +2433,8 @@ $1',
 'ipb_blocked_as_range' => 'లోపం: ఐపీ $1 ను నేరుగా నిరోధించలేదు, అంచేత నిరోధాన్ని రద్దుపరచలేము.  అయితే, అది $2 శ్రేణిలో భాగంగా నిరోధానికి గురైంది, ఈ శ్రేణిపై ఉన్న నిరోధాన్ని రద్దుపరచవచ్చు.',
 'ip_range_invalid' => 'సరైన ఐపీ శ్రేణి కాదు.',
 'ip_range_toolarge' => '/$1  కంటే పెద్దవైన సామూహిక నిరోధాలు అనుమతించబడవు.',
-'blockme' => 'నన్ను నిరోధించు',
 'proxyblocker' => 'ప్రాక్సీ నిరోధకం',
-'proxyblocker-disabled' => 'ఈ ఫంక్షన్ను అశక్తం చేసాం.',
 'proxyblockreason' => 'మీ ఐపీ అడ్రసు ఒక ఓపెన్ ప్రాక్సీ కాబట్టి దాన్ని నిరోధించాం. మీ ఇంటర్నెట్ సేవాదారుని గానీ, సాంకేతిక సహాయకుని గానీ సంప్రదించి తీవ్రమైన ఈ భద్రతా వైఫల్యాన్ని గురించి తెలపండి.',
-'proxyblocksuccess' => 'పూర్తయింది.',
 'sorbsreason' => '{{SITENAME}} వాడే DNSBLలో మీ ఐపీ అడ్రసు ఒక ఓపెన్ ప్రాక్సీగా నమోదై ఉంది.',
 'sorbs_create_account_reason' => 'మీ ఐపీ అడ్రసు DNSBL లో ఓపెను ప్రాక్సీగా నమోదయి ఉంది. మీరు ఎకౌంటును సృష్టించజాలరు.',
 'cant-block-while-blocked' => 'నిరోధంలో ఉన్న మీరు ఇతర వాడుకరులపై నిరోధం అమలుచేయలేరు.',
@@ -2763,13 +2764,8 @@ $1',
 'pageinfo-category-files' => 'దస్త్రాల సంఖ్య',
 
 # Skin names
-'skinname-standard' => 'సంప్రదాయ',
-'skinname-nostalgia' => 'నాస్టాల్జియా',
 'skinname-cologneblue' => 'కలోన్ నీలం',
 'skinname-monobook' => 'మోనోబుక్',
-'skinname-myskin' => 'నాఅలంకారం',
-'skinname-chick' => 'చిక్',
-'skinname-simple' => 'సరళ',
 'skinname-modern' => 'ఆధునిక',
 'skinname-vector' => 'వెక్టర్',
 
@@ -2844,11 +2840,25 @@ $1',
 'minutes' => '{{PLURAL:$1|ఒక నిమిషం|$1 నిమిషాల}}',
 'hours' => '{{PLURAL:$1|ఒక గంట|$1 గంటల}}',
 'days' => '{{PLURAL:$1|ఒక రోజు|$1 రోజుల}}',
+'weeks' => '{{PLURAL:$1|$1 వారం|$1 వారాలు}}',
 'months' => '{{PLURAL:$1|ఒక నెల|$1 నెలల}}',
 'years' => '{{PLURAL:$1|ఒక సంవత్సరం|$1 సంవత్సరాల}}',
 'ago' => '$1 క్రితం',
 'just-now' => 'ఇప్పుడే',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|గంట|గంటల}} క్రితం',
+'minutes-ago' => '$1 {{PLURAL:$1|నిమిషం|నిమిషాల}} క్రితం',
+'seconds-ago' => '$1 {{PLURAL:$1|క్షణం|క్షణాల}} క్రితం',
+'monday-at' => 'సోమవారం నాడు $1కి',
+'tuesday-at' => 'మంగళవారం నాడు $1కి',
+'wednesday-at' => 'బుధవారం నాడు $1కి',
+'thursday-at' => 'గురువారం నాడు $1కి',
+'friday-at' => 'శుక్రవారం నాడు $1కి',
+'saturday-at' => 'శనివారం నాడు $1కి',
+'sunday-at' => 'ఆదివారం నాడు $1కి',
+'yesterday-at' => 'నిన్న $1కి',
+
 # Bad image list
 'bad_image_list' => 'కింద తెలిపిన తీరులో కలపాలి:
 
@@ -2875,7 +2885,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'వెడల్పు',
 'exif-imagelength' => 'ఎత్తు',
 'exif-bitspersample' => 'ఒక్కో కాంపొనెంటుకు బిట్లు',
@@ -3041,7 +3051,7 @@ $1',
 'exif-originalimageheight' => 'కత్తిరించబడక ముందు బొమ్మ యొక్క ఎత్తు',
 'exif-originalimagewidth' => 'కత్తిరించబడక ముందు బొమ్మ యొక్క వెడల్పు',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'కుదించని',
 
 'exif-copyrighted-true' => 'నకలుహక్కులుకలది',
@@ -3399,7 +3409,6 @@ $5
 'version-other' => 'ఇతర',
 'version-mediahandlers' => 'మీడియాను ఫైళ్లను నడిపించే పొడిగింపులు',
 'version-hooks' => 'కొక్కాలు',
-'version-extension-functions' => 'పొడిగింపు ఫంక్షనులు',
 'version-parser-extensiontags' => 'పార్సరు పొడిగింపు ట్యాగులు',
 'version-parser-function-hooks' => 'పార్సరుకు కొక్కాలు',
 'version-hook-name' => 'కొక్కెం పేరు',
@@ -3420,13 +3429,13 @@ $5
 'version-entrypoints-header-entrypoint' => 'ప్రవేశ బిందువు',
 'version-entrypoints-header-url' => 'చిరునామా',
 
-# Special:FilePath
-'filepath' => 'పూర్తి చిరునామా',
-'filepath-page' => '{{ns:file}}:',
-'filepath-submit' => 'వెళ్ళు',
-'filepath-summary' => 'ఈ ప్రత్యేక పేజీలో ఫైళ్ల పేర్లు ఇస్తే వాటి పూర్తి చిరునామలు వస్తాయి. బొమ్మలైతే వాటి పూర్తి సైజుతో తెరుచుకుంటాయి, బొమ్మలు కాని ఇతర ఫైళ్లు వాటి అనుబంధ ప్రోగ్రాములతో తెరుచుకుంటాయి.
-
-పేరుకు ముందు "{{ns:file}}:" అని చేర్చవద్దు.',
+# Special:Redirect
+'redirect-submit' => 'వెళ్ళు',
+'redirect-value' => 'విలువ:',
+'redirect-user' => 'వాడుకరి ID',
+'redirect-revision' => 'పేజీ కూర్పు',
+'redirect-file' => 'దస్త్రపు పేరు',
+'redirect-not-exists' => 'విలువ కనబడలేదు',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ఫైళ్ల మారుప్రతుల కోసం వెతుకు',
@@ -3517,6 +3526,8 @@ $5
 'htmlform-submit' => 'దాఖలుచెయ్యి',
 'htmlform-reset' => 'మార్పులను రద్దుచెయ్యి',
 'htmlform-selectorother-other' => 'ఇతర',
+'htmlform-no' => 'కాదు',
+'htmlform-yes' => 'అవును',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 పూర్తి-పాఠ్య అన్వేషణ తోడ్పాటుతో',
diff --git a/languages/messages/MessagesTet.php b/languages/messages/MessagesTet.php
index 5549db2f..51a6d736 100644
--- a/languages/messages/MessagesTet.php
+++ b/languages/messages/MessagesTet.php
@@ -228,7 +228,7 @@ $messages = array(
 'jumptonavigation' => 'hatudu-dalan',
 'jumptosearch' => 'buka',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Kona-ba {{SITENAME}}',
 'aboutpage' => 'Project:Kona-ba',
 'copyright' => 'Testu pájina nian iha $1 okos.',
@@ -238,7 +238,6 @@ $messages = array(
 'disclaimers' => 'Avisu legál',
 'disclaimerpage' => 'Project:Avisu legál',
 'edithelp' => 'Ajuda kona-ba edita',
-'edithelppage' => 'Help:Edita',
 'helppage' => 'Help:Konteúdu',
 'mainpage' => 'Pájina Mahuluk',
 'mainpage-description' => 'Pájina Mahuluk',
@@ -859,10 +858,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 'siteusers' => "{{PLURAL:$2|uza-na'in|uza-na'in}} {{SITENAME}} nian $1",
 
 # Skin names
-'skinname-standard' => 'Klásiku',
 'skinname-cologneblue' => 'Kolónia azúl',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Manu',
 
 # Browsing diffs
 'previousdiff' => '←Versaun molok',
@@ -882,7 +878,7 @@ Liña hotu tenke komesa ho *
 Ligasaun uluk iha liña tenke ligasaun bá imajen aat.
 Ligasaun seluk iha liña - ne'e pájina sira iha ne'ebé bele inklui imajen aat.",
 
-# EXIF tags
+# Exif tags
 'exif-make' => 'Fabrikante kámara nian',
 'exif-model' => 'Kámara',
 'exif-artist' => 'Autór',
@@ -963,10 +959,6 @@ Ligasaun seluk iha liña - ne'e pájina sira iha ne'ebé bele inklui imajen aat.
 'version-software-product' => 'Produtu',
 'version-software-version' => 'Versaun',
 
-# Special:FilePath
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Bá',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Buka',
 
diff --git a/languages/messages/MessagesTg_cyrl.php b/languages/messages/MessagesTg_cyrl.php
index 9a9c71fb..f7ea5cd2 100644
--- a/languages/messages/MessagesTg_cyrl.php
+++ b/languages/messages/MessagesTg_cyrl.php
@@ -100,9 +100,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Нишон додани шумораи корбарони пайгир',
 'tog-oldsig' => 'Пешнамоиши имзои вуҷуддошта:',
 'tog-fancysig' => 'Имзоро ба сурати викиматн ба назар бигир (бе пайванди худкор)',
-'tog-externaleditor' => 'Истифода аз вироишгари хориҷӣ ба таври пешфарз (фақат барои корбарони пешрафта, ниёзманди танзимоти вижа дар ройонаи шумо аст. [//www.mediawiki.org/wiki/Manual:External_editors Иттилооти бештар.])',
-'tog-externaldiff' => 'Истифода аз тафовутгири (diff) хориҷӣ ба таври пешфарз (фақат барои корбарони пешрафта, ниёзманди танзимоти вижа дар ройонаи шумо аст. [//www.mediawiki.org/wiki/Manual:External_editors Иттилооти бештар.])',
-'tog-showjumplinks' => 'Намоиши пайвандҳои дастрасии "ҷаҳиш ба" дар феҳристи мундариҷот',
 'tog-uselivepreview' => 'Истифода аз пешнамоиши зинда (ҶаваСкрипт) (Озмоишӣ)',
 'tog-forceeditsummary' => 'Ҳангоме ки хулосаи вироиш нанавиштаам юа ман ислоҳ бидеҳ',
 'tog-watchlisthideown' => 'Пинҳон намудани вироишҳои ман дар феҳристи назарот',
@@ -295,7 +292,7 @@ $messages = array(
 $1',
 'pool-errorunknown' => 'Хатогии ношинос',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Дар бораи {{SITENAME}}',
 'aboutpage' => 'Project:Дар бораи',
 'copyright' => 'Мӯҳтаво таҳти иҷозатномаи $1 дастрас аст.',
@@ -305,7 +302,6 @@ $1',
 'disclaimers' => 'Такзибнома',
 'disclaimerpage' => 'Project:Такзибномаи умумӣ',
 'edithelp' => 'Роҳнамои вироиш',
-'edithelppage' => 'Help:Вироиш',
 'helppage' => 'Help:Мундариҷа',
 'mainpage' => 'Саҳифаи Аслӣ',
 'mainpage-description' => 'Саҳифаи Аслӣ',
@@ -375,17 +371,6 @@ $1',
 # General errors
 'error' => 'Иштибоҳ',
 'databaseerror' => 'Хатои бойгоҳи дода',
-'dberrortext' => 'Ишколе дар дастури фиристанда шуда ба пойгоҳи дода рух дод.
-Далели ин мушкил метавонад эроде дар нармафзор бошад.
-Ин охирин дастуре буд ки барои пойгоҳи дода фиристода шуд:
-<blockquote><tt>$1</tt></blockquote>
-ин дастур аз даруни амалгир "<tt>$2</tt>".
-Погоҳи дода ин хаторо бозгардонд "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Хатое дар дастури фиристодашуда ба пойгоҳи дода рух дод.
-Охирин дастуре ки ба пойгоҳи дода фиристода шуд ин буд:
-"$1"
-аз даруни амалгар фиристода шуд "$2".
-Пойгоҳи дода (MySQL) ин хаторо бозгардонд "$3: $4"',
 'laggedslavemode' => 'Ҳушдор: Саҳифа мумкин аст рӯзрасониҳои охирро дар бар нагирад.',
 'readonly' => 'Бойгоҳи дода қуфл шудааст',
 'enterlockreason' => 'Далелеро барои қуфл кардан зикр кунед, ва тақрибан вақти аз қуфл озод шуданашро ҳам зикр кунед',
@@ -429,7 +414,6 @@ $1',
 'viewsourcetext' => 'Шумо метавонед матни викии ин саҳифаро назар кунед ё нусха бардоред:',
 'protectedinterface' => 'Ин саҳифа ороишдиҳандаи матни ин нармафзор аст, ва ба манзури пешгирӣ аз харобкорӣ қуфл шудааст.',
 'editinginterface' => "'''Огоҳӣ:''' Шумо саҳифаеро вироиш карда истодаед, ки матни интерфейси барнома мебошад. Тағйироти ин саҳифа барои намуди интерфейси дигар корбарон таъсир хоҳад расонид. Барои тарҷумаҳо, лутфан аз [//translatewiki.net/wiki/Main_Page?setlang=tg Бетавики], ки лоиҳаи маҳаликунонии МедиаВики мебошад, истифода кунед.",
-'sqlhidden' => '(Дастури SQL пинҳонист)',
 'cascadeprotected' => 'Ин саҳифа аз вироиш муҳофизат шудааст, барои ин ки  дар {{PLURAL:$1|саҳифаи|саҳифаҳои}} муҳофизатшудаи зерин, ки гузаинаи "обшорӣ" дар {{PLURAL:$1|он|онҳо}} интихоб шудааст, фаро гирифтааст: $2',
 'namespaceprotected' => "Шумо иҷозати вироиши саҳифаҳои фазоиноми '''$1'''-ро надоред.",
 'ns-specialprotected' => 'Саҳифаҳои вижа ғайри қобили вироиш ҳастанд.',
@@ -527,7 +511,7 @@ $1',
 'newpassword' => 'Калимаи нави убур:',
 'retypenew' => 'Калимаи нави убурро такроран нависед:',
 'resetpass_submit' => 'Калимаи убурро танзим карда ба систем вуруд кунед',
-'resetpass_success' => 'Калимаи убури шумо бо муваффақият тағйир дода шуд! Дар ҳоли ворид кардани шумо ба систем...',
+'changepassword-success' => 'Калимаи убури шумо бо муваффақият тағйир дода шуд! Дар ҳоли ворид кардани шумо ба систем...',
 'resetpass_forbidden' => 'Дар {{SITENAME}} калимаҳои убурро наметавон тағйир дод',
 'resetpass-no-info' => 'Барои дастрасии мустақим ба ин саҳифа шумо бояд ба систем ворид шуда бошед.',
 'resetpass-submit-loggedin' => 'Тағйири гузарвожа',
@@ -829,7 +813,6 @@ $1',
 'searchmenu-legend' => 'Гузинаҳои ҷустуҷӯ',
 'searchmenu-exists' => "'''Саҳифае бо номи \"[[:\$1]]\" дар ин вики вуҷуд дорад.'''",
 'searchmenu-new' => "'''Эҷоди саҳифаи \"[[:\$1]]\" дар ин вики!'''",
-'searchhelp-url' => 'Help:Мундариҷа',
 'searchprofile-articles' => 'Саҳифаҳои мӯҳтаво',
 'searchprofile-project' => 'Саҳифаҳои роҳномо ва лоиҳа',
 'searchprofile-images' => 'Чандрасонаӣ',
@@ -864,14 +847,6 @@ $1',
 'search-external' => 'Ҷустуҷӯи хориҷӣ',
 'searchdisabled' => 'Ҷустуҷу дар {{SITENAME}} ғайрифаъол карда шудааст. Шумо метавонед тариқи Google дар ҳол ҷустуҷӯ кунед. Таваҷҷӯҳ кунед, ки натоиҷи ҷустуҷӯ {{SITENAME}} метавонад барӯз набошад.',
 
-# Quickbar
-'qbsettings' => 'Танзимоти тезхат (Quickbar)',
-'qbsettings-none' => 'Набошад',
-'qbsettings-fixedleft' => 'Сабти чап',
-'qbsettings-fixedright' => 'Сабти рост',
-'qbsettings-floatingleft' => 'Шиновар чап',
-'qbsettings-floatingright' => 'Шиновар рост',
-
 # Preferences page
 'preferences' => 'Тарҷиҳот',
 'mypreferences' => 'Танзимот',
@@ -893,7 +868,6 @@ $1',
 'saveprefs' => 'Захираи тарҷиҳот',
 'resetprefs' => 'Тозакунии тағйироти захиранашуда',
 'prefs-editing' => 'Дар ҳоли вироиш',
-'prefs-edit-boxsize' => 'Ҳаҷми равзанаи вироиш.',
 'rows' => 'Теъдоди сатрҳо:',
 'columns' => 'Теъдоди сутунҳо:',
 'searchresultshead' => 'Ҷустуҷӯ',
@@ -1073,7 +1047,6 @@ $1',
 'recentchangeslinked-feed' => 'Таъғироти монандӣ',
 'recentchangeslinked-toolbox' => 'Таъғироти монандӣ',
 'recentchangeslinked-title' => 'Тағйирҳои алоқаманд ба "$1"',
-'recentchangeslinked-noresult' => 'Дар давоми замони додашуда тағйире дар саҳифаҳои пайваста рух надодааст.',
 'recentchangeslinked-summary' => "Ин феҳристи тағйироти охир барои саҳифаҳои пайваста аз саҳифаи мушаххасшуда мебошад (ё ба аъзоёни гурӯҳи мушаххасшуда).
 Саҳифаҳои дар [[Special:Watchlist|феҳристи назароти шумо]] буда  '''пурранг''' ҳастанд.",
 'recentchangeslinked-page' => 'Номи саҳифа:',
@@ -1268,10 +1241,6 @@ $1',
 'statistics-users-active' => 'Корбарони фаъол',
 'statistics-mostpopular' => 'Саҳифаҳои бисёр назаркардашуда',
 
-'disambiguations' => 'Саҳифаҳои ибҳомзудоӣ',
-'disambiguationspage' => 'Template:ибҳомзудоӣ',
-'disambiguations-text' => "Саҳифаҳои зерин пайванд ба '''саҳифаи ибҳомзудоӣ''' доранд. Ин саҳифаҳо бояд ба мавзӯъи муносиби худ пайваст шаванд.<br />Саҳифа Ибҳомзудоӣ дар назар гирифта мешавад, ки дар он шаблоне, ки ба [[MediaWiki:Disambiguationspage]] пайванд дорад истифода шуда бошад",
-
 'doubleredirects' => 'Тағйири масирҳои дутоӣ',
 'doubleredirectstext' => 'Ҳар сатр дар бар дорандаи пайвандҳое ба тағйири масири аввал ва дувум ва ҳамчунин хати нахуст тагйири масири дувум аст. Маъмулан саҳифаи мақсади воқеъӣ, ки нахустин тағйири масир бояд ба он бошад ба ин гуна мушаххас мешавад.',
 'double-redirect-fixer' => 'Таъмиркори тағйирмасирҳо',
@@ -1450,10 +1419,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatchthispage' => 'Тавқифи пайгирии ин саҳифа',
 'notanarticle' => 'Мақола нест',
 'notvisiblerev' => 'Нусха ҳазф шуд',
-'watchnochange' => 'Ягон мавриди пайгириҳои шумо дар давраи замони намоишёфта вироиш нашуда аст.',
 'watchlist-details' => '{{PLURAL:$1|$1 саҳифаи|$1 саҳифаҳои}} дар феҳристи пайгириҳои шумо, бидуни ҳисоби саҳифаҳои баҳс.',
-'wlheader-enotif' => '* Иттилоорасонии тариқи почтаи электронӣ (E-mail) имконпазир аст.',
-'wlheader-showupdated' => "* Саҳифаҳое, ки пас аз охирин сар заданатон ба онҳо тағйир кардаанд '''пурранг''' нишон дода шудаанд",
+'wlheader-enotif' => 'Иттилоорасонии тариқи почтаи электронӣ (E-mail) имконпазир аст.',
+'wlheader-showupdated' => "Саҳифаҳое, ки пас аз охирин сар заданатон ба онҳо тағйир кардаанд '''пурранг''' нишон дода шудаанд",
 'watchmethod-recent' => 'баррасии вироишҳои охир барои саҳифаҳои пайгиришуда',
 'watchmethod-list' => 'баррасии саҳифаҳои пайгиришуда барои вироишҳои охир',
 'watchlistcontains' => 'Феҳристи пайгириҳои шумо $1 {{PLURAL:$1|саҳифаро|саҳифаҳоро}} дар бар мегирад.',
@@ -1752,11 +1720,8 @@ $1',
 'ipb_cant_unblock' => 'Хато: Нишонаи баста шудани $1 ёфт нашуд. Мумкин аст пештар боз шуда бошад.',
 'ipb_blocked_as_range' => 'Хато: Нишонаи IP-и $1 ба шакли мустақим баста нашудааст ва наметавонад боз шавад. Ин нишона ҳамроҳи $2, баста шуда қобили боз шудан аст.',
 'ip_range_invalid' => 'Сафи IP номӯътабар аст.',
-'blockme' => 'Дастрасии манро қать кун',
 'proxyblocker' => 'Проксибанд',
-'proxyblocker-disabled' => 'Ин амал ғайрифаъол шудааст.',
 'proxyblockreason' => 'Аз сабаби пешкор боз (open proxy) буданаш, нишонаи IP-и шумо баста шудааст. Лутфан бо таъминкунандаи хизматҳои Интернетии худ ё пуштибони техникӣ тамос бигиред ва онҳоро бо ин мушкилии амниятии муҳим огоҳ кунед.',
-'proxyblocksuccess' => 'Анҷом шуд.',
 'sorbsreason' => 'Нишонаи IP-и шумо ҳамчун як проксии кушода дар DNSBL феҳрист шудааст, ки аз тарафи {{SITENAME}} истифода мешавад.',
 'sorbs_create_account_reason' => 'Нишонаи IP-и шумо ҳамчун проксии кушода дар DNSBL, ки аз тарафи {{SITENAME}} истифода мешавад, феҳрист шудааст. Шумо наметавонед ҳисоби корабариеро эҷод кунед',
 
@@ -2092,7 +2057,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Васеъӣ',
 'exif-imagelength' => 'Баландӣ',
 'exif-bitspersample' => 'Нуқта дар ҳар ҷузъ',
@@ -2206,7 +2171,7 @@ $1',
 'exif-gpsdatestamp' => 'Таърихи ҶПС',
 'exif-gpsdifferential' => 'Тасҳеҳи ҷузъии ҶПС',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ғайрифишурда',
 
 'exif-unknowndate' => 'Таърихи номаълум',
@@ -2496,7 +2461,6 @@ $5
 'version-other' => 'Дигар',
 'version-mediahandlers' => 'Бадастгирандаҳои расонаҳо',
 'version-hooks' => 'Қолабҳо',
-'version-extension-functions' => 'Амалгарҳои афзуна',
 'version-parser-extensiontags' => 'Барчасбҳои афзунаҳои таҷзеҳгар',
 'version-parser-function-hooks' => 'Қолабҳои амалгарҳои таҷзеҳгар',
 'version-hook-name' => 'Номи қолаб',
@@ -2507,15 +2471,6 @@ $5
 'version-software-product' => 'Маҳсул',
 'version-software-version' => 'Нусха',
 
-# Special:FilePath
-'filepath' => 'Масири парванда',
-'filepath-page' => 'Парванда:',
-'filepath-submit' => 'Масир',
-'filepath-summary' => 'Ин саҳифаи вижа нишонаи комил барои як парвандаро нишон медиҳад.
-Аксҳо бо кайфият бо ҳаҷми пурраашон нишон дода мешаванд, дигар навъҳои парвандаҳои дигар бо барномаҳои алоқаманди махсус ба худашон боз мешаванд.
-
-Нишонаи пайвандро бидуни пешванд "{{ns:file}}:" ворид кунед.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ҷустуҷӯ барои парвандаҳои такрорӣ',
 'fileduplicatesearch-summary' => 'Ҷустуҷӯ барои парвандаҳои такрорӣ бар асоси миқдори дар ҳам шудаи онҳо сурат мегирад.',
diff --git a/languages/messages/MessagesTg_latn.php b/languages/messages/MessagesTg_latn.php
index 61887afa..40debf6b 100644
--- a/languages/messages/MessagesTg_latn.php
+++ b/languages/messages/MessagesTg_latn.php
@@ -42,9 +42,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Nişon dodani şumorai korbaroni pajgir',
 'tog-oldsig' => 'Peşnamoişi imzoi vuçuddoşta:',
 'tog-fancysig' => 'Imzoro ba surati vikimatn ba nazar bigir (be pajvandi xudkor)',
-'tog-externaleditor' => 'Istifoda az viroişgari xoriçī ba tavri peşfarz (faqat baroi korbaroni peşrafta, nijozmandi tanzimoti viƶa dar rojonai şumo ast. [//www.mediawiki.org/wiki/Manual:External_editors Ittilooti beştar.])',
-'tog-externaldiff' => 'Istifoda az tafovutgiri (diff) xoriçī ba tavri peşfarz (faqat baroi korbaroni peşrafta, nijozmandi tanzimoti viƶa dar rojonai şumo ast. [//www.mediawiki.org/wiki/Manual:External_editors Ittilooti beştar.])',
-'tog-showjumplinks' => 'Namoişi pajvandhoi dastrasiji "çahiş ba" dar fehristi mundariçot',
 'tog-uselivepreview' => 'Istifoda az peşnamoişi zinda (ÇavaSkript) (Ozmoişī)',
 'tog-forceeditsummary' => 'Hangome ki xulosai viroiş nanaviştaam jua man isloh bideh',
 'tog-watchlisthideown' => 'Pinhon namudani viroişhoi man dar fehristi nazarot',
@@ -236,7 +233,7 @@ Lutfan qabl az taloş dubora baroi didani in sahifa muddate sabr kuned.
 $1",
 'pool-errorunknown' => 'Xatogiji noşinos',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Dar borai {{SITENAME}}',
 'aboutpage' => 'Project:Dar borai',
 'copyright' => 'Mūhtavo tahti içozatnomai $1 dastras ast.',
@@ -246,7 +243,6 @@ $1",
 'disclaimers' => 'Takzibnoma',
 'disclaimerpage' => 'Project:Takzibnomai umumī',
 'edithelp' => 'Rohnamoi viroiş',
-'edithelppage' => 'Help:Viroiş',
 'helppage' => 'Help:Mundariça',
 'mainpage' => 'Sahifai Aslī',
 'mainpage-description' => 'Sahifai Aslī',
@@ -316,12 +312,6 @@ Fehristi sahifahoi viƶai durustro metavoned dar inço [[Special:SpecialPages|{{
 # General errors
 'error' => 'Iştiboh',
 'databaseerror' => 'Xatoi bojgohi doda',
-'dberrortext' => 'Işkole dar dasturi firistanda şuda ba pojgohi doda rux dod.
-Daleli in muşkil metavonad erode dar narmafzor boşad.
-In oxirin dasture bud ki baroi pojgohi doda firistoda şud:
-<blockquote><tt>$1</tt></blockquote>
-in dastur az daruni amalgir "<tt>$2</tt>".
-Pogohi doda in xatoro bozgardond "<tt>$3: $4</tt>".',
 'laggedslavemode' => 'Huşdor: Sahifa mumkin ast rūzrasonihoi oxirro dar bar nagirad.',
 'readonly' => 'Bojgohi doda qufl şudaast',
 'enterlockreason' => 'Dalelero baroi qufl kardan zikr kuned, va taqriban vaqti az qufl ozod şudanaşro ham zikr kuned',
@@ -363,7 +353,6 @@ Pursuçū: $2',
 'protectedpagetext' => 'In sahifa baroi çilavgirī az viroiş qufl şudaast.',
 'viewsourcetext' => 'Şumo metavoned matni vikiji in sahifaro nazar kuned jo nusxa bardored:',
 'protectedinterface' => 'In sahifa oroişdihandai matni in narmafzor ast, va ba manzuri peşgirī az xarobkorī qufl şudaast.',
-'sqlhidden' => '(Dasturi SQL pinhonist)',
 'cascadeprotected' => 'In sahifa az viroiş muhofizat şudaast, baroi in ki  dar {{PLURAL:$1|sahifai|sahifahoi}} muhofizatşudai zerin, ki guzainai "obşorī" dar {{PLURAL:$1|on|onho}} intixob şudaast, faro giriftaast: $2',
 'namespaceprotected' => "Şumo içozati viroişi sahifahoi fazoinomi '''$1'''-ro nadored.",
 'ns-specialprotected' => 'Sahifahoi viƶa ƣajri qobili viroiş hastand.',
@@ -450,7 +439,7 @@ Lutfan peş az on, ki dubora taloş kuned, sabr kuned.',
 'newpassword' => 'Kalimai navi ubur:',
 'retypenew' => 'Kalimai navi uburro takroran navised:',
 'resetpass_submit' => 'Kalimai uburro tanzim karda ba sistem vurud kuned',
-'resetpass_success' => 'Kalimai uburi şumo bo muvaffaqijat taƣjir doda şud! Dar holi vorid kardani şumo ba sistem...',
+'changepassword-success' => 'Kalimai uburi şumo bo muvaffaqijat taƣjir doda şud! Dar holi vorid kardani şumo ba sistem...',
 'resetpass-no-info' => 'Baroi dastrasiji mustaqim ba in sahifa şumo bojad ba sistem vorid şuda boşed.',
 'resetpass-submit-loggedin' => 'Taƣjiri guzarvoƶa',
 'resetpass-wrong-oldpass' => "Guzarvoƶai muvaqat jo oxir nomū'tabar.
@@ -704,7 +693,6 @@ Itminon hosil kuned, ki in taƣjir davomnokiji ta'rixiji sahifaro nigoh dorad.",
 'viewprevnext' => 'Namoiş ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Guzinahoi çustuçū',
 'searchmenu-new' => "'''Eçodi sahifai \"[[:\$1]]\" dar in viki!'''",
-'searchhelp-url' => 'Help:Mundariça',
 'searchprofile-advanced' => 'Peşrafta',
 'searchprofile-articles-tooltip' => 'Çustuçū dar $1',
 'searchprofile-project-tooltip' => 'Çustuçū dar $1',
@@ -733,14 +721,6 @@ Itminon hosil kuned, ki in taƣjir davomnokiji ta'rixiji sahifaro nigoh dorad.",
 'search-external' => 'Çustuçūi xoriçī',
 'searchdisabled' => "Çustuçu dar {{SITENAME}} ƣajrifa'ol karda şudaast. Şumo metavoned tariqi Google dar hol çustuçū kuned. Tavaççūh kuned, ki natoiçi çustuçū {{SITENAME}} metavonad barūz naboşad.",
 
-# Quickbar
-'qbsettings' => 'Tanzimoti tezxat (Quickbar)',
-'qbsettings-none' => 'Naboşad',
-'qbsettings-fixedleft' => 'Sabti cap',
-'qbsettings-fixedright' => 'Sabti rost',
-'qbsettings-floatingleft' => 'Şinovar cap',
-'qbsettings-floatingright' => 'Şinovar rost',
-
 # Preferences page
 'preferences' => 'Tarçihot',
 'mypreferences' => 'Tarçihoti man',
@@ -761,7 +741,6 @@ Itminon hosil kuned, ki in taƣjir davomnokiji ta'rixiji sahifaro nigoh dorad.",
 'saveprefs' => 'Zaxirai tarçihot',
 'resetprefs' => 'Tozakuniji taƣjiroti zaxiranaşuda',
 'prefs-editing' => 'Dar holi viroiş',
-'prefs-edit-boxsize' => 'Haçmi ravzanai viroiş.',
 'rows' => "Te'dodi satrho:",
 'columns' => "Te'dodi sutunho:",
 'searchresultshead' => 'Çustuçū',
@@ -933,7 +912,6 @@ On bojad kamtar az $1 {{PLURAL:$1|alomat|alomatho}} boşad.',
 'recentchangeslinked-feed' => "Ta'ƣiroti monandī",
 'recentchangeslinked-toolbox' => "Ta'ƣiroti monandī",
 'recentchangeslinked-title' => 'Taƣjirhoi aloqamand ba "$1"',
-'recentchangeslinked-noresult' => 'Dar davomi zamoni dodaşuda taƣjire dar sahifahoi pajvasta rux nadodaast.',
 'recentchangeslinked-summary' => "In fehristi taƣjiroti oxir baroi sahifahoi pajvasta az sahifai muşaxxasşuda meboşad (jo ba a'zojoni gurūhi muşaxxasşuda).
 Sahifahoi dar [[Special:Watchlist|fehristi nazaroti şumo]] buda  '''purrang''' hastand.",
 'recentchangeslinked-page' => 'Nomi sahifa:',
@@ -1104,10 +1082,6 @@ Jak klik kardani rūi unvoni sutunho boisi taƣjiri tartibi namoişi parvandaho
 'statistics-users-active' => "Korbaroni fa'ol",
 'statistics-mostpopular' => 'Sahifahoi bisjor nazarkardaşuda',
 
-'disambiguations' => 'Sahifahoi ibhomzudoī',
-'disambiguationspage' => 'Template:ibhomzudoī',
-'disambiguations-text' => "Sahifahoi zerin pajvand ba '''sahifai ibhomzudoī''' dorand. In sahifaho bojad ba mavzū'i munosibi xud pajvast şavand.<br />Sahifa Ibhomzudoī dar nazar girifta meşavad, ki dar on şablone, ki ba [[MediaWiki:Disambiguationspage]] pajvand dorad istifoda şuda boşad",
-
 'doubleredirects' => 'Taƣjiri masirhoi dutoī',
 'double-redirect-fixer' => "Ta'mirkori taƣjirmasirho",
 
@@ -1273,10 +1247,9 @@ Agar şumo dertar az fehristi nazarotaton in sahifaro hazv kardan xohed, dar men
 'unwatchthispage' => 'Tavqifi pajgiriji in sahifa',
 'notanarticle' => 'Maqola nest',
 'notvisiblerev' => 'Nusxa hazf şud',
-'watchnochange' => 'Jagon mavridi pajgirihoi şumo dar davrai zamoni namoişjofta viroiş naşuda ast.',
 'watchlist-details' => '{{PLURAL:$1|$1 sahifai|$1 sahifahoi}} dar fehristi pajgirihoi şumo, biduni hisobi sahifahoi bahs.',
-'wlheader-enotif' => '* Ittiloorasoniji tariqi poctai elektronī (E-mail) imkonpazir ast.',
-'wlheader-showupdated' => "* Sahifahoe, ki pas az oxirin sar zadanaton ba onho taƣjir kardaand '''purrang''' nişon doda şudaand",
+'wlheader-enotif' => 'Ittiloorasoniji tariqi poctai elektronī (E-mail) imkonpazir ast.',
+'wlheader-showupdated' => "Sahifahoe, ki pas az oxirin sar zadanaton ba onho taƣjir kardaand '''purrang''' nişon doda şudaand",
 'watchmethod-recent' => 'barrasiji viroişhoi oxir baroi sahifahoi pajgirişuda',
 'watchmethod-list' => 'barrasiji sahifahoi pajgirişuda baroi viroişhoi oxir',
 'watchlistcontains' => 'Fehristi pajgirihoi şumo $1 {{PLURAL:$1|sahifaro|sahifahoro}} dar bar megirad.',
@@ -1534,11 +1507,8 @@ Baroi fehristi mahrumijatho va basta şudanhoi amalijoti kununī ba [[Special:Bl
 'ipb_cant_unblock' => 'Xato: Nişonai basta şudani $1 joft naşud. Mumkin ast peştar boz şuda boşad.',
 'ipb_blocked_as_range' => 'Xato: Nişonai IP-i $1 ba şakli mustaqim basta naşudaast va nametavonad boz şavad. In nişona hamrohi $2, basta şuda qobili boz şudan ast.',
 'ip_range_invalid' => "Safi IP nomū'tabar ast.",
-'blockme' => 'Dastrasiji manro qatь kun',
 'proxyblocker' => 'Proksiband',
-'proxyblocker-disabled' => "In amal ƣajrifa'ol şudaast.",
 'proxyblockreason' => "Az sababi peşkor boz (open proxy) budanaş, nişonai IP-i şumo basta şudaast. Lutfan bo ta'minkunandai xizmathoi Internetiji xud jo puştiboni texnikī tamos bigired va onhoro bo in muşkiliji amnijatiji muhim ogoh kuned.",
-'proxyblocksuccess' => 'Ançom şud.',
 'sorbsreason' => 'Nişonai IP-i şumo hamcun jak proksiji kuşoda dar DNSBL fehrist şudaast, ki az tarafi {{SITENAME}} istifoda meşavad.',
 'sorbs_create_account_reason' => 'Nişonai IP-i şumo hamcun proksiji kuşoda dar DNSBL, ki az tarafi {{SITENAME}} istifoda meşavad, fehrist şudaast. Şumo nametavoned hisobi korabariero eçod kuned',
 
@@ -1871,7 +1841,7 @@ Faqat satrhoe, ki bo * şurū' şavand ba nazar girifta meşavand. Avvalin pajva
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => "Vase'ī",
 'exif-imagelength' => 'Balandī',
 'exif-bitspersample' => "Nuqta dar har çuz'",
@@ -1985,7 +1955,7 @@ Faqat satrhoe, ki bo * şurū' şavand ba nazar girifta meşavand. Avvalin pajva
 'exif-gpsdatestamp' => "Ta'rixi ÇPS",
 'exif-gpsdifferential' => "Tashehi çuz'iji ÇPS",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ƣajrifişurda',
 
 'exif-unknowndate' => "Ta'rixi noma'lum",
@@ -2269,7 +2239,6 @@ Tavaççūh kuned, ki şumo metavoned az [[Special:EditWatchlist|viroişgari sta
 'version-other' => 'Digar',
 'version-mediahandlers' => 'Badastgirandahoi rasonaho',
 'version-hooks' => 'Qolabho',
-'version-extension-functions' => 'Amalgarhoi afzuna',
 'version-parser-extensiontags' => 'Barcasbhoi afzunahoi taçzehgar',
 'version-parser-function-hooks' => 'Qolabhoi amalgarhoi taçzehgar',
 'version-hook-name' => 'Nomi qolab',
@@ -2280,15 +2249,6 @@ Tavaççūh kuned, ki şumo metavoned az [[Special:EditWatchlist|viroişgari sta
 'version-software-product' => 'Mahsul',
 'version-software-version' => 'Nusxa',
 
-# Special:FilePath
-'filepath' => 'Masiri parvanda',
-'filepath-page' => 'Parvanda:',
-'filepath-submit' => 'Masir',
-'filepath-summary' => 'In sahifai viƶa nişonai komil baroi jak parvandaro nişon medihad.
-Aksho bo kajfijat bo haçmi purraaşon nişon doda meşavand, digar nav\'hoi parvandahoi digar bo barnomahoi aloqamandi maxsus ba xudaşon boz meşavand.
-
-Nişonai pajvandro biduni peşvand "{{ns:file}}:" vorid kuned.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Çustuçū baroi parvandahoi takrorī',
 'fileduplicatesearch-summary' => 'Çustuçū baroi parvandahoi takrorī bar asosi miqdori dar ham şudai onho surat megirad.',
diff --git a/languages/messages/MessagesTh.php b/languages/messages/MessagesTh.php
index 8e04c9f5..a0d9ec1e 100644
--- a/languages/messages/MessagesTh.php
+++ b/languages/messages/MessagesTh.php
@@ -194,7 +194,7 @@ $dateFormats = array(
 	'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
 );
 
-$linkTrail = '/^([a-z]+)(.*)\$/sD';
+$linkTrail = '/^([a-z]+)(.*)$/sD';
 
 $messages = array(
 # User preference toggles
@@ -227,9 +227,6 @@ $messages = array(
 'tog-shownumberswatching' => 'แสดงจำนวนผู้ใช้ที่เฝ้าดู',
 'tog-oldsig' => 'ลายเซ็นที่ใช้อยู่:',
 'tog-fancysig' => 'ใช้คำสั่งวิกิที่ปรากฏในลายเซ็นนี้ (โดยไม่มีลิงก์อัตโนมัติ)',
-'tog-externaleditor' => 'ใช้โปรแกรมแก้ไขภายนอกโดยปริยาย (สำหรับผู้เชี่ยวชาญเท่านั้น ต้องการการตั้งค่าพิเศษบนคอมพิวเตอร์ของคุณ [//www.mediawiki.org/wiki/Manual:External_editors ข้อมูลเพิ่มเติม])',
-'tog-externaldiff' => 'ใช้โปรแกรมเปรียบเทียบภายนอกโดยปริยาย (สำหรับผู้เชี่ยวชาญเท่านั้น ต้องการการตั้งค่าพิเศษบนคอมพิวเตอร์ของคุณ [//www.mediawiki.org/wiki/Manual:External_editors ข้อมูลเพิ่มเติม])',
-'tog-showjumplinks' => 'เปิดใช้งาน "กระโดด" อัตโนมัติไปตามลิงก์',
 'tog-uselivepreview' => 'แสดงตัวอย่างการแก้ไขแบบทันที (ทดลอง)',
 'tog-forceeditsummary' => 'เตือนเมื่อช่องคำอธิบายอย่างย่อว่าง',
 'tog-watchlisthideown' => 'ซ่อนการแก้ไขของฉันจากรายการเฝ้าดู',
@@ -243,6 +240,8 @@ $messages = array(
 'tog-showhiddencats' => 'แสดงหมวดหมู่ที่ซ่อนอยู่',
 'tog-noconvertlink' => 'ปิดใช้งานการแปลงชื่อเรื่องของลิงก์',
 'tog-norollbackdiff' => 'ไม่แสดงการเปลี่ยนแปลงหลังดำเนินการย้อนกลับฉุกเฉิน',
+'tog-useeditwarning' => 'เตือนฉัน เมื่อฉันกำลังจะออกจากหน้าแก้ไขโดยมีข้อมูลที่ยังไม่ได้บันทึก',
+'tog-prefershttps' => 'ใช้การเชื่อมต่อปลอดภัยทุกครั้งเมื่อล็อกอิน',
 
 'underline-always' => 'เสมอ',
 'underline-never' => 'ไม่เคย',
@@ -306,6 +305,18 @@ $messages = array(
 'oct' => 'ต.ค.',
 'nov' => 'พ.ย.',
 'dec' => 'ธ.ค.',
+'january-date' => '$1 มกราคม',
+'february-date' => '$1 กุมภาพันธ์',
+'march-date' => '$1 มีนาคม',
+'april-date' => '$1 เมษายน',
+'may-date' => '$1 พฤษภาคม',
+'june-date' => '$1 มิถุนายน',
+'july-date' => '$1 กรกฎาคม',
+'august-date' => '$1 สิงหาคม',
+'september-date' => '$1 กันยายน',
+'october-date' => '$1 ตุลาคม',
+'november-date' => '$1 พฤศจิกายน',
+'december-date' => '$1 ธันวาคม',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|หมวดหมู่|หมวดหมู่}}',
@@ -387,6 +398,7 @@ $messages = array(
 'create-this-page' => 'สร้างหน้านี้',
 'delete' => 'ลบ',
 'deletethispage' => 'ลบหน้านี้',
+'undeletethispage' => 'กู้คืนหน้านี้',
 'undelete_short' => 'กู้คืน $1 การแก้ไข',
 'viewdeleted_short' => 'ดู $1 การแก้ไขที่ถูกลบ',
 'protect' => 'ล็อก',
@@ -430,7 +442,7 @@ $1',
 'pool-queuefull' => 'พื้นที่รองรับคิวเต็ม',
 'pool-errorunknown' => 'เกิดข้อผิดพลาดไม่ทราบสาเหตุ',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'เกี่ยวกับ{{SITENAME}}',
 'aboutpage' => 'Project:เกี่ยวกับ',
 'copyright' => 'เนื้อหาอนุญาตให้เผยแพร่ภายใต้ $1 เว้นแต่ระบุไว้เป็นอย่างอื่น',
@@ -440,7 +452,6 @@ $1',
 'disclaimers' => 'ข้อปฏิเสธความรับผิดชอบ',
 'disclaimerpage' => 'Project:ข้อปฏิเสธความรับผิดชอบทั่วไป',
 'edithelp' => 'คำอธิบายการแก้ไข',
-'edithelppage' => 'Help:การแก้ไข',
 'helppage' => 'Help:สารบัญ',
 'mainpage' => 'หน้าหลัก',
 'mainpage-description' => 'หน้าหลัก',
@@ -517,17 +528,6 @@ $1',
 # General errors
 'error' => 'ข้อผิดพลาด',
 'databaseerror' => 'ความผิดพลาดที่ฐานข้อมูล',
-'dberrortext' => 'ไวยากรณ์ในการค้นฐานข้อมูลผิดพลาด
-สาเหตุอาจเกิดจากบั๊กของซอฟต์แวร์
-การค้นฐานข้อมูลล่าสุดกระทำเมื่อ:
-<blockquote><tt>$1</tt></blockquote>
-จากฟังก์ชัน "<tt>$2</tt>"
-ฐานข้อมูลแจ้งข้อผิดพลาดว่า "<samp>$3: $4</samp>"',
-'dberrortextcl' => 'ไวยากรณ์ในการค้นฐานข้อมูลผิดพลาด
-การค้นฐานข้อมูลล่าสุดกระทำเมื่อ:
-"$1"
-จากฟังก์ชัน "$2"
-ฐานข้อมูลแจ้งข้อผิดพลาดว่า "$3: $4"',
 'laggedslavemode' => "'''คำเตือน:''' ข้อมูลในหน้าอาจไม่ใช่ข้อมูลล่าสุด",
 'readonly' => 'ฐานข้อมูลถูกล็อก',
 'enterlockreason' => 'ใส่เหตุแห่งการล็อก ทั้งเวลาที่คาดว่าจะปลดล็อก',
@@ -581,11 +581,14 @@ $1',
 'editinginterface' => "'''คำเตือน:''' คุณกำลังแก้ไขหน้าที่ใช้เพื่อให้ข้อความอินเตอร์เฟซแก่ซอฟต์แวร์
 การเปลี่ยนแปลงหน้านี้จะกระทบต่อลักษณะของอินเตอร์เฟซผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้
 ในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/wiki/Main_Page?setlang=th translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
-'sqlhidden' => '(คำสั่ง SQL ซ่อนอยู่)',
 'cascadeprotected' => 'หน้านี้ได้รับการป้องกันจากการแก้ไข เนื่องจากหน้านี้ถูกใช้เป็นส่วนหนึ่งใน{{PLURAL:$1|หน้า $2 ซึ่งได้รับการป้องกันแบบ "ทบทุกลำดับขั้น"|หน้าซึ่งได้รับการป้องกันแบบ "ทบทุกลำดับขั้น" ดังต่อไปนี้: $2}}',
 'namespaceprotected' => "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ '''$1'''",
 'customcssprotected' => 'คุณไม่มีสิทธิแก้ไขหน้าสไตล์ CSS นี้ เนื่องจากหน้านี้มีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น',
 'customjsprotected' => 'คุณไม่มีสิทธิแก้ไขหน้าจาวาสคริปต์นี้ เนื่องจากหน้านี้มีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น',
+'mycustomcssprotected' => 'คุณไม่ได้รับอนุญาตให้แก้ไขหน้าซีเอสเอสนี้',
+'mycustomjsprotected' => 'คุณไม่ได้รับอนุญาตให้แก้ไขหน้าจาวาสคริปต์นี้',
+'myprivateinfoprotected' => 'คุณไม่ได้รับอนุญาตให้แก้ไขข้อมูลส่วนตัวของคุณ',
+'mypreferencesprotected' => 'คุณไม่ได้รับอนุญาตให้แก้ไขการตั้งค่าของคุณ',
 'ns-specialprotected' => 'หน้าพิเศษไม่สามารถแก้ไขได้',
 'titleprotected' => "ชื่อเรื่องนี้ถูกป้องกันมิให้สร้างโดย [[User:$1|$1]] 
 เหตุผลที่ให้ไว้คือ ''$2''",
@@ -609,10 +612,19 @@ $1',
 'welcomecreation-msg' => 'บัญชีของคุณถูกสร้างขึ้นแล้ว
 อย่าลืมเปลี่ยนแปลง[[Special:Preferences|การตั้งค่าใน {{SITENAME}}]] ของคุณ',
 'yourname' => 'ชื่อผู้ใช้',
+'userlogin-yourname' => 'ชื่อผู้ใช้',
+'userlogin-yourname-ph' => 'กรอกชื่อผู้ใช้',
+'createacct-another-username-ph' => 'กรอกชื่อผู้ใช้',
 'yourpassword' => 'รหัสผ่าน',
+'userlogin-yourpassword' => 'รหัสผ่าน',
+'userlogin-yourpassword-ph' => 'กรอกรหัสผ่าน',
+'createacct-yourpassword-ph' => 'กรอกรหัสผ่าน',
 'yourpasswordagain' => 'พิมพ์รหัสผ่านอีกครั้ง:',
+'createacct-yourpasswordagain' => 'ยืนยันรหัสผ่าน',
+'createacct-yourpasswordagain-ph' => 'กรอกรหัสผ่านอีกครั้ง',
 'remembermypassword' => 'จำการล็อกอินของฉันบนเบราเซอร์นี้ (นานสุด $1 วัน)',
-'securelogin-stick-https' => 'ยังคงเชื่อมต่อกับ HTTPS หลังจากล็อกอิน',
+'userlogin-remembermypassword' => 'ให้ฉันอยู่ในระบบ',
+'userlogin-signwithsecure' => 'ใช้การเชื่อมต่อที่ปลอดภัย',
 'yourdomainname' => 'โดเมนของคุณ:',
 'password-change-forbidden' => 'คุณไม่สามารถเปลี่ยนรหัสผ่านบนวิกินี้',
 'externaldberror' => 'มีข้อผิดพลาดของฐานข้อมูลในการพิสูจน์ตัวจริง หรือคุณไม่ได้รับอนุญาตให้ปรับบัญชีภายนอกของคุณ',
@@ -624,17 +636,43 @@ $1',
 'logout' => 'ล็อกเอาต์',
 'userlogout' => 'ล็อกเอาต์',
 'notloggedin' => 'ไม่ได้ล็อกอิน',
+'userlogin-noaccount' => 'ไม่มีบัญชีหรือ',
+'userlogin-joinproject' => 'เข้าร่วมกับ{{SITENAME}}',
 'nologin' => 'ไม่มีบัญชีหรือ $1',
 'nologinlink' => 'สร้างบัญชี',
 'createaccount' => 'สร้างบัญชี',
 'gotaccount' => "มีบัญชีแล้วใช่ไหม '''$1'''",
 'gotaccountlink' => 'ล็อกอิน',
 'userlogin-resetlink' => 'ลืมรายละเอียดล็อกอินของคุณหรือ',
+'userlogin-resetpassword-link' => 'ตั้งรหัสผ่านใหม่',
+'helplogin-url' => 'Help:การล็อกอิน',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|คำอธิบายเรื่องการล็อกอิน]]',
+'userlogin-loggedin' => 'คุณล็อกอินในชื่อ {{GENDER:$1|$1}} แล้ว
+ใช้แบบด้านล่างเพื่อล็อกอินเป็นอีกผู้ใช้หนึ่ง',
+'userlogin-createanother' => 'สร้างอีกบัญชี',
+'createacct-join' => 'กรอกสารสนเทศของคุณด้านล่าง',
+'createacct-another-join' => 'กรอกข้อมูลของบัญชีใหม่ด้านล่าง',
+'createacct-emailrequired' => 'ที่อยู่อีเมล',
+'createacct-emailoptional' => 'ที่อยู่อีเมล (เลือกไม่ใส่ได้)',
+'createacct-email-ph' => 'กรอกที่อยู่อีเมล',
+'createacct-another-email-ph' => 'กรอกที่อยู่อีเมล',
 'createaccountmail' => 'ใช้รหัสผ่านสุ่มชั่วคราวและส่งไปยังที่อยู่อีเมลที่ระบุ',
+'createacct-realname' => 'ชื่อจริง (เลือกไม่ใส่ได้)',
 'createaccountreason' => 'เหตุผล:',
+'createacct-reason' => 'เหตุผล',
+'createacct-reason-ph' => 'เหตุใดคุณจึงสร้างอีกบัญชี',
+'createacct-captcha' => 'ตรวจสอบความปลอดภัย',
+'createacct-imgcaptcha-ph' => 'กรอกข้อความที่คุณเห็นด้านบน',
+'createacct-submit' => 'สร้างบัญชีของคุณ',
+'createacct-another-submit' => 'สร้างอีกบัญชี',
+'createacct-benefit-heading' => '{{SITENAME}}สร้างขึ้นจากคนเช่นคุณ',
+'createacct-benefit-body1' => '$1 การแก้ไข',
+'createacct-benefit-body2' => '$1 หน้า',
+'createacct-benefit-body3' => '$1 ผู้ร่วมเขียน',
 'badretype' => 'รหัสผ่านที่ใส่ไม่ตรงกัน',
 'userexists' => 'ชื่อผู้ใช้ที่กรอกมีผู้อื่นใช้ไปแล้ว กรุณาเลือกชื่ออื่น',
 'loginerror' => 'ล็อกอินผิดพลาด',
+'createacct-error' => 'การสร้างบัญชีผิดพลาด',
 'createaccounterror' => 'ไม่สามารถสร้างบัญชีผู้ใช้: $1',
 'nocookiesnew' => 'ชื่อบัญชีผู้ใช้ได้ถูกสร้างขึ้นแล้ว แต่ยังไม่ได้ล็อกอินเข้าสู่ {{SITENAME}} เนื่องจากว่าไม่ได้เปิดใช้คุกกี้ ถ้าต้องการล็อกอินให้เปิดใช้งานคุกกี้และทำการล็อกอินโดยใส่ชื่อผู้ใช้พร้อมรหัสผ่าน',
 'nocookieslogin' => '{{SITENAME}} ใช้คุกกี้สำหรับการล็อกอิน ขณะนี้คุกกี้ของคุณไม่เปิดใช้งาน กรุณาเปิดใช้งานและลองอีกครั้ง',
@@ -687,10 +725,12 @@ $1',
 คุณอาจเพิกเฉยข้อความนี้ หากการสร้างบัญชีนี้เกิดจากความผิดพลาด',
 'usernamehasherror' => 'ชื่อผู้ใช้ต้องไม่มีอักขระแฮช',
 'login-throttled' => 'ที่ผ่านมาคุณพยายามล็อกอินมากครั้งเกินไป
-กรุณารอสักครู่แล้วลองใหม่อีกครั้ง',
+กรุณารอ $1 ก่อนลองอีกครั้ง',
 'login-abort-generic' => 'การเข้าสู่ระบบของคุณไม่ประสบความสำเร็จ - ล้มเลิกแล้ว',
 'loginlanguagelabel' => 'ภาษา: $1',
 'suspicious-userlogout' => 'คำขอล็อกเอาต์ของคุณถูกปฏิเสธเพราะดูเหมือนส่งมาจากเบราว์เซอร์หรือพร็อกซีแคชที่เสีย',
+'createacct-another-realname-tip' => 'ไม่จำเป็นต้องใส่ชื่อจริง
+หากคุณเลือกใส่ชื่อจริง จะใช้เพื่อแสดงที่มาสำหรับงานของตน',
 
 # Email sending
 'php-mail-error-unknown' => 'เกิดข้อผิดพลาดไม่ทราบสาเหตุในฟังก์ชัน mail() ของพีเอชพี',
@@ -706,8 +746,7 @@ $1',
 'newpassword' => 'รหัสผ่านใหม่:',
 'retypenew' => 'พิมพ์รหัสผ่านใหม่อีกครั้ง:',
 'resetpass_submit' => 'ตั้งรหัสผ่านและล็อกอิน',
-'resetpass_success' => 'เปลี่ยนรหัสผ่านสำเร็จ!
-กำลังล็อกอิน...',
+'changepassword-success' => 'เปลี่ยนรหัสผ่านของคุณเรียบร้อย',
 'resetpass_forbidden' => 'ไม่สามารถเปลี่ยนรหัสผ่านได้',
 'resetpass-no-info' => 'คุณต้องล็อกอินเพื่อเข้าถึงหน้านี้โดยตรง',
 'resetpass-submit-loggedin' => 'เปลี่ยนรหัสผ่าน',
@@ -719,9 +758,11 @@ $1',
 
 # Special:PasswordReset
 'passwordreset' => 'ตั้งรหัสผ่านใหม่',
-'passwordreset-text' => 'กรอกแบบฟอร์มนี้เพื่อตั้งรหัสผ่านใหม่',
+'passwordreset-text-one' => 'กรอกแบบนี้เพื่อตั้งรหัสผ่านใหม่',
+'passwordreset-text-many' => '{{PLURAL:$1|กรอกเขตข้อมูลหนึ่งเพื่อตั้งรหัสผ่านใหม่}}',
 'passwordreset-legend' => 'เปลี่ยนรหัสผ่าน',
 'passwordreset-disabled' => 'การตั้งรหัสผ่านใหม่ปิดใช้งานบนวิกินี้',
+'passwordreset-emaildisabled' => 'คุณลักษณะอีเมลถูกปิดใช้งานบนวิกินี้',
 'passwordreset-username' => 'ชื่อผู้ใช้:',
 'passwordreset-domain' => 'โดเมน:',
 'passwordreset-capture' => 'ดูอีเมลที่ได้หรือไม่',
@@ -744,7 +785,7 @@ $2
 รหัสผ่านชั่วคราว: $2',
 'passwordreset-emailsent' => 'อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้ว',
 'passwordreset-emailsent-capture' => 'อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้ว ซึ่งแสดงด้านล่าง',
-'passwordreset-emailerror-capture' => 'อีเมลแจ้งเตือนถูกสร้างขึ้นแล้ว ซึ่งแสดงข้างล่าง แต่การส่งไปยังผู้ใช้ล้มเหลว: $1',
+'passwordreset-emailerror-capture' => 'อีเมลตั้งรหัสผ่านใหม่ถูกสร้างขึ้นแล้ว ซึ่งแสดงด้านล่าง แต่ไม่สามารถส่งไปยัง{{GENDER:$2|ผู้ใช้}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'เปลี่ยนที่อยู่อีเมล',
@@ -758,6 +799,19 @@ $2
 'changeemail-submit' => 'เปลี่ยนอีเมล',
 'changeemail-cancel' => 'ยกเลิก',
 
+# Special:ResetTokens
+'resettokens' => 'ตั้งโทเค็นใหม่',
+'resettokens-text' => 'คุณสามารถตั้งโทเค็นใหม่ ซึ่งให้การเข้าถึงข้อมูลส่วนตัวบางอย่างที่เกี่ยวข้องกับบัญชีของคุณที่นี่
+
+คุณควรตั้งโทเค็นใหม่ หากคุณบอกผู้อื่นโดยมิได้ตั้งใจหรือบัญชีของคุณถูกเจาะ',
+'resettokens-no-tokens' => 'ไม่มีโทเค็นให้ตั้งใหม่',
+'resettokens-legend' => 'ตั้งโทเค็นใหม่',
+'resettokens-tokens' => 'โทเค็น:',
+'resettokens-token-label' => '$1 (ค่าปัจจุบัน: $2)',
+'resettokens-watchlist-token' => 'โทเค็นการป้อนเว็บ (Atom/RSS) ของ[[Special:Watchlist|การเปลี่ยนแปลงไปยังหน้าในรายการเฝ้าดูของคุณ]]',
+'resettokens-done' => 'ตั้งโทเค็นใหม่แล้ว',
+'resettokens-resetbutton' => 'ตั้งโทเค็นที่เลือกใหม่',
+
 # Edit page toolbar
 'bold_sample' => 'ข้อความตัวหนา',
 'bold_tip' => 'ทำตัวหนา',
@@ -949,11 +1003,14 @@ $2
 เนื่องจากหน้านี้ถูกลบไปแล้ว',
 'edit-conflict' => 'แก้ชนกัน',
 'edit-no-change' => 'การแก้ไขของคุณถูกเพิกเฉย เพราะไม่มีการเปลี่ยนแปลงใด ๆ',
+'postedit-confirmation' => 'บันทึกการแก้ไขของคุณแล้ว',
 'edit-already-exists' => 'ไม่สามารถสร้างหน้าใหม่ได้
 เพราะมีหน้านี้แล้ว',
 'defaultmessagetext' => 'ข้อความสารโดยปริยาย',
 'invalid-content-data' => 'ข้อมูลเนื้อหาไม่ถูกต้อง',
 'content-not-allowed-here' => 'เนื้อหา "$1" ไม่อนุญาตในหน้า [[$2]]',
+'editwarning-warning' => 'การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณกระทำสูญหาย
+ถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน "การแก้ไข" ในการตั้งค่าของคุณ',
 
 # Content models
 'content-model-wikitext' => 'ข้อความวิกิ',
@@ -980,6 +1037,7 @@ $2
 'undo-failure' => 'การแก้ไขนี้ไม่สามารถย้อนกลับได้ เนื่องจากขัดแย้งกับการแก้ไขปัจจุบัน',
 'undo-norev' => 'ไม่สามารถย้อนการแก้ไขนี้ เพราะไม่มีหรือถูกลบไปแล้ว',
 'undo-summary' => 'ย้อนการแก้ไขรุ่น $1 โดย [[Special:Contributions/$2|$2]] ([[User talk:$2|พูดคุย]])',
+'undo-summary-username-hidden' => 'ย้อนรุ่น $1 โดยผู้ใช้ไม่ระบุชื่อ',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'ไม่สามารถสร้างบัญชีได้',
@@ -1159,6 +1217,7 @@ $1",
 'compareselectedversions' => 'เปรียบเทียบสองรุ่นที่เลือก',
 'showhideselectedversions' => 'แสดง/ซ่อนรุ่นที่เลือก',
 'editundo' => 'ย้อน',
+'diff-empty' => '(ไม่แตกต่าง)',
 'diff-multi' => '(มิได้แสดง $1 รุ่นระหว่างกลางโดย{{PLURAL:$2|ผู้ใช้คนหนึ่ง|ผู้ใช้ $2 คน}})',
 'diff-multi-manyusers' => '(มิได้แสดง $1 รุ่นระหว่างกลางโดยผู้ใช้กว่า $2 คน)',
 'difference-missing-revision' => 'ไม่พบรุ่น{{PLURAL:$2|รุ่น| $2 รุ่น}}ของผลต่างนี้ ($1)
@@ -1186,7 +1245,6 @@ $1",
 'searchmenu-legend' => 'ตัวเลือกการค้นหา',
 'searchmenu-exists' => "'''มีหน้าชื่อ \"[[:\$1]]\" บนวิกินี้'''",
 'searchmenu-new' => "'''สร้างหน้า \"[[:\$1]]\" บนวิกินี้'''",
-'searchhelp-url' => 'Help:สารบัญ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ค้นดูหน้าที่มีคำขึ้นต้นนี้]]',
 'searchprofile-articles' => 'หน้าเนื้อหา',
 'searchprofile-project' => 'คำอธิบายและหน้าโครงการ',
@@ -1228,14 +1286,7 @@ $1",
 'powersearch-togglenone' => 'ไม่เลือก',
 'search-external' => 'ค้นหาภายนอก',
 'searchdisabled' => 'การค้นหา {{SITENAME}} ปิดใช้งาน คุณสามารถค้นหาผ่านกูเกิลหรือเซิร์ชเอนจินอื่นในเวลาไม่นาน โปรดทราบว่าดัชนีเนื้อหาของ {{SITENAME}} บนเซิร์ชเอนจินอาจเป็นข้อมูลเก่า',
-
-# Quickbar
-'qbsettings' => 'แถบพิเศษ',
-'qbsettings-none' => 'ไม่มี',
-'qbsettings-fixedleft' => 'ตรึงไว้ทางซ้าย',
-'qbsettings-fixedright' => 'ตรึงไว้ทางขวา',
-'qbsettings-floatingleft' => 'ด้านซ้าย',
-'qbsettings-floatingright' => 'ด้านขวา',
+'search-error' => 'เกิดข้อผิดพลาดขณะกำลังค้นหา: $1',
 
 # Preferences page
 'preferences' => 'ตั้งค่าส่วนตัว',
@@ -1269,7 +1320,6 @@ $1",
 'resetprefs' => 'ล้างการเปลี่ยนแปลงที่ยังไม่บันทึก',
 'restoreprefs' => 'คืนการตั้งค่าโดยปริยายทั้งหมด (ในทุกส่วน)',
 'prefs-editing' => 'การแก้ไข',
-'prefs-edit-boxsize' => 'ขนาดหน้าจอกล่องแก้ไข',
 'rows' => 'แถว:',
 'columns' => 'คอลัมน์:',
 'searchresultshead' => 'ค้นหา',
@@ -1280,9 +1330,9 @@ $1",
 'recentchangesdays-max' => 'มากสุด $1 วัน',
 'recentchangescount' => 'จำนวนการแก้ไขที่แสดงโดยปริยาย:',
 'prefs-help-recentchangescount' => 'นี่รวมถึงการปรับปรุงล่าสุด ประวิติหน้า และปูม',
-'prefs-help-watchlist-token' => 'การเติมช่องนี้ด้วยรหัสลับจะสร้างฟีด RSS แก่รายการเฝ้าดูของคุณ
-ผู้ใดที่รู้รหัสในช่องนี้จะสามารถอ่านรายการเฝ้าดูของคุณได้ ฉะนั้นให้เลือกรหัสที่ปลอดภัย
-นี่คือรหัสที่สุ่มเลือกขึ้นมาที่คุณสามารถใช้ได้: $1',
+'prefs-help-watchlist-token2' => 'นี่คือแป้นลับสำหรับเข้าการป้อนเว็บรายการเฝ้าดูของคุณ
+ใครก็ตามที่ทราบจะสามารถอ่านรายการเฝ้าดูของคุณได้ ฉะนั้นอย่าบอกผู้อื่น
+[[Special:ResetTokens|คลิกที่นี่หากคุณต้องการตั้งใหม่]]',
 'savedprefs' => 'การตั้งค่าของคุณได้ถูกบันทึกแล้ว',
 'timezonelegend' => 'เขตเวลา:',
 'localtime' => 'เวลาท้องถิ่น',
@@ -1313,7 +1363,6 @@ $1",
 'prefs-reset-intro' => 'คุณสามารถใช้หน้านี้ตั้งการตั้งค่าของคุณกลับไปยังค่าตั้งต้นของเว็บใหม่
 ซึ่งไม่สามารถทำกลับได้',
 'prefs-emailconfirm-label' => 'การยืนยันอีเมล:',
-'prefs-textboxsize' => 'ขนาดหน้าต่างแก้ไข',
 'youremail' => 'อีเมล:',
 'username' => '{{GENDER:$1|ชื่อผู้ใช้}}:',
 'uid' => 'รหัสประจำตัว{{GENDER:$1|ผู้ใช้}}:',
@@ -1345,6 +1394,7 @@ $1",
 'prefs-dateformat' => 'รูปแบบวันที่',
 'prefs-timeoffset' => 'ส่วนต่างเวลา',
 'prefs-advancedediting' => 'ตัวเลือกทั่วไป',
+'prefs-preview' => 'การแสดงตัวอย่าง',
 'prefs-advancedrc' => 'ตัวเลือกขั้นสูง',
 'prefs-advancedrendering' => 'ตัวเลือกขั้นสูง',
 'prefs-advancedsearchoptions' => 'ตัวเลือกขั้นสูง',
@@ -1352,7 +1402,9 @@ $1",
 'prefs-displayrc' => 'ตัวเลือกผลแสดง',
 'prefs-displaysearchoptions' => 'ตัวเลือกผลแสดง',
 'prefs-displaywatchlist' => 'ตัวเลือกผลแสดง',
+'prefs-tokenwatchlist' => 'โทเค็น',
 'prefs-diffs' => 'ผลต่าง',
+'prefs-help-prefershttps' => 'การตั้งค่านี้จะมีผลเมื่อคุณล็อกอินครั้งถัดไป',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'ที่อยู่อีเมลดูถูกต้อง',
@@ -1379,6 +1431,8 @@ $1",
 'userrights-notallowed' => 'บัญชีของคุณไม่ได้รับอนุญาตให้เพิ่มหรือลดสิทธิผู้ใช้',
 'userrights-changeable-col' => 'กลุ่มที่คุณสามารถเปลี่ยนได้',
 'userrights-unchangeable-col' => 'กลุ่มที่คุณไม่สามารถเปลี่ยนได้',
+'userrights-conflict' => 'พบการเปลี่ยนแปลงสิทธิผู้ใช้ขัดกัน! โปรดทบทวนและยืนยันการเปลี่ยนแปลงของคุณ',
+'userrights-removed-self' => 'คุณเพิกถอนสิทธิของคุณสำเร็จแล้ว ฉะนั้น คุณจึงไม่สามารถเข้าถึงหน้านี้ได้อีกต่อไป',
 
 # Groups
 'group' => 'กลุ่ม:',
@@ -1444,11 +1498,19 @@ $1",
 'right-proxyunbannable' => 'เลี่ยงการบล็อกอัตโนมัติของพร็อกซี',
 'right-unblockself' => 'ปลดบล็อกตนเอง',
 'right-protect' => 'เปลี่ยนระดับการล็อกและแก้ไขหน้าที่ถูกล็อก',
-'right-editprotected' => 'หน้าที่ถูกล็อกเต็มที่ (ที่ไม่ล็อกแบบสืบทอด)',
+'right-editprotected' => 'แก้ไขหน้าที่ถูกล็อกซึ่ง "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'แก้ไขหน้าที่ถูกล็อกซึ่ง "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'แก้ไขอินเตอร์เฟซผู้ใช้',
 'right-editusercssjs' => 'แก้ไขไฟล์ CSS และจาวาสคริปต์ของผู้ใช้อื่น',
 'right-editusercss' => 'แก้ไขไฟล์ CSS ของผู้ใช้อื่น',
 'right-edituserjs' => 'แก้ไขไฟล์จาวาสคริปต์ของผู้ใช้อื่น',
+'right-editmyusercss' => 'แก้ไขไฟล์ซีเอสเอสผู้ใช้ของคุณเอง',
+'right-editmyuserjs' => 'แก้ไขไฟล์จาวาสคริปต์ผู้ใช้ของคุณเอง',
+'right-viewmywatchlist' => 'ดูรายการเฝ้าดูของคุณ',
+'right-editmywatchlist' => 'แก้ไขรายการเฝ้าดูของคุณ หมายเหตุว่า การกระทำบางอย่างอาจยังเพิ่มหน้าแม้จะปราศจากสิทธินี้',
+'right-viewmyprivateinfo' => 'ดูข้อมูลส่วนตัวของคุณ (เช่น ที่อยู่อีเมล ชื่อจริง)',
+'right-editmyprivateinfo' => 'แก้ไขข้อมูลส่วนตัวของคุณ (เช่น ที่อยู่อีเมล ชื่อจริง)',
+'right-editmyoptions' => 'แก้ไขการตั้งค่าของคุณ',
 'right-rollback' => 'ย้อนการแก้ไขของผู้ใช้ล่าสุดที่แก้ไขหน้าเฉพาะอย่างรวดเร็ว',
 'right-markbotedits' => 'ทำเครื่องหมายการย้อนว่าเป็นการแก้ไขโดยบอต',
 'right-noratelimit' => 'ไม่ได้รับผลกระทบจากขีดจำกัดอัตรา',
@@ -1510,12 +1572,19 @@ $1",
 'action-userrights-interwiki' => 'แก้ไขสิทธิผู้ใช้ของผู้ใช้บนวิกิอื่น',
 'action-siteadmin' => 'ล็อกหรือปลดล็อกฐานข้อมูล',
 'action-sendemail' => 'ส่งอีเมล',
+'action-editmywatchlist' => 'แก้ไขรายการเฝ้าดูของคุณ',
+'action-viewmywatchlist' => 'ดูรายการเฝ้าดูของคุณ',
+'action-viewmyprivateinfo' => 'ดูข้อมูลส่วนตัวของคุณ',
+'action-editmyprivateinfo' => 'แก้ไขข้อมูลส่วนตัวของคุณ',
 
 # Recent changes
 'nchanges' => '$1 การแก้ไข',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|ตั้งแต่การเข้าชมล่าสุด}}',
+'enhancedrc-history' => 'ประวัติ',
 'recentchanges' => 'ปรับปรุงล่าสุด',
 'recentchanges-legend' => 'ตัวเลือกปรับปรุงล่าสุด',
 'recentchanges-summary' => 'ในหน้านี้เป็นรายการการปรับปรุงล่าสุดบนวิกินี้',
+'recentchanges-noresult' => 'ไม่มีการเปลี่ยนแปลงในช่วงที่กำหนดซึ่งตรงกับเกณฑ์เหล่านี้',
 'recentchanges-feed-description' => 'ติดตามการปรับปรุงล่าสุดในวิกินี้ในฟีดนี้',
 'recentchanges-label-newpage' => 'การแก้ไขนี้สร้างหน้าใหม่',
 'recentchanges-label-minor' => 'เป็นการแก้ไขเล็กน้อย',
@@ -1553,7 +1622,6 @@ $1",
 'recentchangeslinked-feed' => 'ปรับปรุงที่เกี่ยวโยง',
 'recentchangeslinked-toolbox' => 'การปรับปรุงที่เกี่ยวโยง',
 'recentchangeslinked-title' => 'การปรับปรุงที่โยงมายัง "$1"',
-'recentchangeslinked-noresult' => 'ไม่มีการเปลี่ยนแปลงในหน้าที่ถูกโยงไป ในช่วงเวลาที่กำหนด',
 'recentchangeslinked-summary' => "หน้านี้เป็นรายการปรับปรุงล่าสุดของหน้าที่ถูกโยงไป (หรือไปยังหน้าต่าง ๆ ของหมวดหมู่ที่กำหนด) โดยหน้าที่อยู่ใน[[Special:Watchlist|รายการเฝ้าดู]]แสดงเป็น'''ตัวหนา'''",
 'recentchangeslinked-page' => 'ชื่อหน้า:',
 'recentchangeslinked-to' => 'แสดงการเปลี่ยนแปลงที่เชื่อมโยงมายังหน้านี้แทน',
@@ -1564,7 +1632,7 @@ $1",
 'reuploaddesc' => 'ยกเลิกการอัปโหลดและกลับไปยังแบบอัปโหลด',
 'upload-tryagain' => 'ส่งคำอธิบายไฟล์ที่ดัดแปรแล้ว',
 'uploadnologin' => 'ไม่ได้ล็อกอิน',
-'uploadnologintext' => 'ต้อง[[Special:UserLogin|ล็อกอิน]]ก่อนจึงจะอัปโหลดไฟล์ได้',
+'uploadnologintext' => 'ต้อง$1ก่อนจึงจะอัปโหลดไฟล์ได้',
 'upload_directory_missing' => 'ไดเรกทอรีสำหรับอัปโหลด ($1) หายไป และเว็บเซิร์ฟเวอร์ไม่สามารถสร้างได้',
 'upload_directory_read_only' => 'เว็บเซิร์ฟเวอร์ไม่สามารถเก็บข้อมูลในไดเรกทอรี ($1)',
 'uploaderror' => 'การอัปโหลดผิดพลาด',
@@ -1748,7 +1816,6 @@ $1',
 'http-read-error' => 'การอ่านข้อมูล HTTP ผิดพลาด',
 'http-timed-out' => 'คำขอข้อมูล HTTP เกินเวลาที่กำหนด',
 'http-curl-error' => 'เกิดข้อผิดพลาดในการเรียกข้อมูลจาก URL: $1',
-'http-host-unreachable' => 'ไม่สามารถเข้าถึง URL',
 'http-bad-status' => 'พบปัญหาในระหว่างการข้อข้อมูล HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1776,6 +1843,10 @@ $1',
 'listfiles_size' => 'ขนาด',
 'listfiles_description' => 'คำอธิบาย',
 'listfiles_count' => 'รุ่น',
+'listfiles-show-all' => 'รวมภาพรุ่นเก่า',
+'listfiles-latestversion' => 'รุ่นปัจจุบัน',
+'listfiles-latestversion-yes' => 'ใช่',
+'listfiles-latestversion-no' => 'ไม่',
 
 # File description page
 'file-anchor-link' => 'ไฟล์',
@@ -1873,6 +1944,13 @@ $1',
 'randompage' => 'สุ่มหน้า',
 'randompage-nopages' => 'ไม่มีหน้าใดใน{{PLURAL:$2|เนมสเปซ}}ต่อไปนี้: "$1"',
 
+# Random page in category
+'randomincategory' => 'สุ่มหน้าในหมวดหมู่',
+'randomincategory-invalidcategory' => '"$1" มิใช่ชื่อหมวดหมู่ที่ถูกต้อง',
+'randomincategory-nopages' => 'ไม่มีหน้าใน[[:Category:$1]]',
+'randomincategory-selectcategory' => 'ดึงหน้าแบบสุ่มจากหมวดหมู่: $1 $2',
+'randomincategory-selectcategory-submit' => 'ไป',
+
 # Random redirect
 'randomredirect' => 'สุ่มหน้าเปลี่ยนทาง',
 'randomredirect-nopages' => 'ไม่มีหน้าเปลี่ยนทางในเนมสเปซ "$1"',
@@ -1898,12 +1976,6 @@ $1',
 'statistics-users-active-desc' => 'ผู้ใช้ที่ดำเนินปฏิบัติการในช่วง $1 วันที่ผ่านมา',
 'statistics-mostpopular' => 'หน้าที่มีการเข้าชมมากที่สุด',
 
-'disambiguations' => 'หน้าที่เชื่อมโยงไปยังหน้าแก้ความกำกวม',
-'disambiguationspage' => 'Template:แก้กำกวม',
-'disambiguations-text' => "หน้าต่อไปนี้มีการเชื่อมโยงไปยัง'''หน้าความกำกวม'''อย่างน้อยหนึ่งแห่ง
-ซึ่งอาจต้องเชื่อมโยงไปยังหน้าที่เหมาะสมกว่าแทน<br />
-หน้าใดที่ใช้แม่แบบที่เชื่อมโยงมาจาก [[MediaWiki:Disambiguationspage]] จะถูกนับเป็นหน้าความกำกวม",
-
 'pageswithprop' => 'หน้าพร้อมคุณสมบัติหน้า',
 'pageswithprop-legend' => 'หน้าพร้อมคุณสมบัติหน้า',
 'pageswithprop-text' => 'หน้านี้แสดงรายการหน้าที่ใช้คุณสมบัติหน้าอย่างใดอย่างหนึ่งโดยเฉพาะ',
@@ -1967,6 +2039,7 @@ $1',
 'mostrevisions' => 'หน้าที่มีรุ่นมากที่สุด',
 'prefixindex' => 'ทุกหน้าพร้อมคำขึ้นต้น',
 'prefixindex-namespace' => 'ทุกหน้าพร้อมคำขึ้นต้น (เนมสเปซ $1)',
+'prefixindex-strip' => 'ลบคำขึ้นต้นในรายการออก',
 'shortpages' => 'หน้าสั้น',
 'longpages' => 'หน้ายาว',
 'deadendpages' => 'หน้าสุดทาง',
@@ -2157,10 +2230,9 @@ $1',
 'unwatchthispage' => 'เลิกเฝ้าดูหน้านี้',
 'notanarticle' => 'ไม่ใช่หน้าเนื้อหา',
 'notvisiblerev' => 'รุ่นล่าสุดโดยผู้ใช้อีกคนถูกลบแล้ว',
-'watchnochange' => 'ไม่มีการแก้ไขหน้าที่คุณเฝ้าดูในระยะเวลาที่แสดง',
 'watchlist-details' => 'มี $1 หน้าในรายการเฝ้าดูของคุณ ไม่รวมหน้าอภิปราย',
-'wlheader-enotif' => '* แจ้งเตือนผ่านอีเมลถูกเปิดใช้งาน',
-'wlheader-showupdated' => "* หน้าที่มีการเปลี่ยนแปลงตั้งแต่การเข้าชมครั้งล่าสุดของคุณแสดงใน'''ตัวหนา'''",
+'wlheader-enotif' => 'การแจ้งเตือนผ่านอีเมลถูกเปิดใช้งาน',
+'wlheader-showupdated' => "หน้าที่มีการเปลี่ยนแปลงตั้งแต่คุณเข้าชมล่าสุดแสดงใน'''ตัวหนา'''",
 'watchmethod-recent' => 'ตรวจสอบการปรับปรุงล่าสุดกับหน้าเฝ้าดู',
 'watchmethod-list' => 'ตรวจสอบหน้าเฝ้าดูกับการแก้ไขล่าสุด',
 'watchlistcontains' => 'รายการเฝ้าดูของคุณมี $1 หน้า',
@@ -2407,7 +2479,7 @@ $1',
 'contributions' => 'เรื่องที่เขียนโดย{{GENDER:$1|ผู้ใช้}}นี้',
 'contributions-title' => 'เรื่องที่เขียนโดย $1',
 'mycontris' => 'เรื่องที่เขียน',
-'contribsub2' => 'สำหรับ $1 ($2)',
+'contribsub2' => 'สำหรับ {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'ไม่พบการเปลี่ยนแปลงตรงกับเงื่อนไขเหล่านี้',
 'uctop' => '(ปัจจุบัน)',
 'month' => 'จากเดือน (และก่อนหน้า):',
@@ -2565,11 +2637,8 @@ $1',
 อย่างไรก็ตาม ไอพีนี้ถูกระงับในฐานะที่เป็นส่วนหนึ่งของเลขที่อยู่ไอพีในพิสัย $2 ซึ่งสามารถปลดบล็อกได้',
 'ip_range_invalid' => 'พิสัยไอพีไม่ถูกต้อง',
 'ip_range_toolarge' => 'พิสัยบล็อกที่มีขนาดใหญ่กว่า /$1 จะไม่ได้รับอนุญาต',
-'blockme' => 'บล็อกฉัน',
 'proxyblocker' => 'บล็อกพร็อกซี',
-'proxyblocker-disabled' => 'ฟังก์ชันนี้ถูกปิดใช้งาน',
 'proxyblockreason' => 'เลขที่อยู่ไอพีของคุณถูกบล็อกเนื่องจากเป็นพร็อกซีเปิด กรุณาติดต่อผู้ให้บริการอินเทอร์เน็ตหรือฝ่ายสนับสนุนเทคนิคขององค์การคุณ และแจ้งให้พวกเขาทราบถึงปัญหาความปลอดภัยร้ายแรงนี้',
-'proxyblocksuccess' => 'สำเร็จ',
 'sorbsreason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ {{SITENAME}} ใช้',
 'sorbs_create_account_reason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ {{SITENAME}} ใช้ 
 คุณไม่สามารถสร้างบัญชีได้',
@@ -2868,17 +2937,11 @@ $1',
 
 # Stylesheets
 'common.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ทุกสกิน */',
-'standard.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินคลาสสิก */',
-'nostalgia.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินนอสตัลเจีย */',
 'cologneblue.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโคโลญจ์บลู */',
 'monobook.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโมโนบุ๊ก */',
-'myskin.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินมายสกิน */',
-'chick.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินชิก */',
-'simple.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินซิมเปิล */',
 'modern.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโมเดิร์น */',
 'vector.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */',
 'print.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ข้อมูลส่งออกเป็นสิ่งพิมพ์ */',
-'handheld.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่อุปกรณ์เคลื่อนที่ โดยขึ้นอยู่กับสกินที่ตั้งค่าไว้ใน $wgHandheldStyle */',
 'noscript.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ปิดการใช้งานจาวาสคริปต์ */',
 'group-autoconfirmed.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ทั่วไปเท่านั้น */',
 'group-bot.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่บอตเท่านั้น */',
@@ -2887,13 +2950,8 @@ $1',
 
 # Scripts
 'common.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทุกคนในทุกหน้า */',
-'standard.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินคลาสสิก */',
-'nostalgia.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินนอสตัลเจีย */',
 'cologneblue.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโคโลญจ์บลู */',
 'monobook.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโมโนบุ๊ก */',
-'myskin.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินมายสกิน */',
-'chick.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินชิก */',
-'simple.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินซิมเปิล */',
 'modern.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโมเดิร์น */',
 'vector.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */',
 'group-autoconfirmed.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทั่วไปเท่านั้น */',
@@ -2970,13 +3028,8 @@ $1',
 'pageinfo-category-files' => 'จำนวนไฟล์',
 
 # Skin names
-'skinname-standard' => 'คลาสสิก',
-'skinname-nostalgia' => 'นอสตัลเจีย',
 'skinname-cologneblue' => 'โคโลญจ์บลู',
 'skinname-monobook' => 'โมโนบุ๊ก',
-'skinname-myskin' => 'มายสกิน',
-'skinname-chick' => 'ชิก',
-'skinname-simple' => 'ซิมเปิล',
 'skinname-modern' => 'โมเดิร์น',
 'skinname-vector' => 'เวกเตอร์',
 
@@ -3055,11 +3108,25 @@ $1',
 'minutes' => '$1 นาที',
 'hours' => '$1 ชั่วโมง',
 'days' => '$1 วัน',
+'weeks' => '$1 สัปดาห์',
 'months' => '$1 เดือน',
 'years' => '$1 ปี',
 'ago' => '$1 มาแล้ว',
 'just-now' => 'เมื่อสักครู่นี้',
 
+# Human-readable timestamps
+'hours-ago' => '$1 ชั่วโมงที่แล้ว',
+'minutes-ago' => '$1 นาทีที่แล้ว',
+'seconds-ago' => '$1 วินาทีที่แล้ว',
+'monday-at' => 'วันจันทร์เมื่อ $1 น.',
+'tuesday-at' => 'วันอังคารเมื่อ $1 น.',
+'wednesday-at' => 'วันพุธเมื่อ $1 น.',
+'thursday-at' => 'วันพฤหัสบดีเมื่อ $1 น.',
+'friday-at' => 'วันศุกร์เมื่อ $1 น.',
+'saturday-at' => 'วันเสาร์เมื่อ $1 น.',
+'sunday-at' => 'วันอาทิตย์เมื่อ $1 น.',
+'yesterday-at' => 'เมื่อวานเมื่อ $1 น.',
+
 # Bad image list
 'bad_image_list' => 'รูปแบบแสดงต่อไปนี้:
 
@@ -3086,7 +3153,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ความกว้าง',
 'exif-imagelength' => 'ความสูง',
 'exif-bitspersample' => 'บิต ต่อคอมโพเนนต์',
@@ -3210,7 +3277,7 @@ $1',
 'exif-label' => 'ป้ายฉลาก',
 'exif-usageterms' => 'ข้อตกลงในการใช้งาน',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ไม่ได้บีบอัด',
 
 'exif-unknowndate' => 'ไม่ทราบวัน',
@@ -3572,7 +3639,6 @@ $5
 'version-other' => 'อื่นๆ',
 'version-mediahandlers' => 'ตัวจัดการเกี่ยวกับสื่อ (media handler)',
 'version-hooks' => 'ฮุก',
-'version-extension-functions' => 'ฟังก์ชันจากส่วนขยายเพิ่ม (extension function)',
 'version-parser-extensiontags' => 'แท็กที่มีการใช้งานของพาร์สเซอร์',
 'version-parser-function-hooks' => 'ฮุกที่มีฟังก์ชันพาร์สเซอร์',
 'version-hook-name' => 'ชื่อฮุก',
@@ -3581,6 +3647,7 @@ $5
 'version-license' => 'สัญญาอนุญาต',
 'version-poweredby-credits' => "วิกินี้จัดทำโดย '''[//www.mediawiki.org/ MediaWiki]''', สงวนลิขสิทธิ์ © 2001-$1 โดย $2",
 'version-poweredby-others' => 'ผู้อื่น',
+'version-poweredby-translators' => 'ผู้แปล translatewiki.net',
 'version-license-info' => 'มีเดียวิกิเป็นซอฟต์แวร์เสรี คุณสามารถแจกจ่าย และ/หรือ แก้ไขได้ภายใต้เงื่อนไขแห่งสัญญาอนุญาตสาธารณะทั่วไปของกนูตามที่เผยแพร่โดยมูลนิธิซอฟต์แวร์เสรี ไม่ว่ารุ่นที่ 2 แห่งสัญญาอนุญาต หรือรุ่นภายหลังอื่นใด (ตามที่คุณเลือก)
 
 มีเดียวิกิมีถูกแจกจ่ายด้วยหวังว่าจะเป็นประโยชน์ แต่ไม่มีการรับประกันใด ๆ ทั้งสิ้น ไม่มีแม้การรับประกันโดยนัยเพื่อการค้า หรือความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ ดูรายละเอียดเพิ่มเติมที่สัญญาอนุญาตสาธารณะทั่วไปของกนู
@@ -3592,14 +3659,17 @@ $5
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath เส้นทางบทความ]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath เส้นทางสคริปต์]',
 
-# Special:FilePath
-'filepath' => 'พาธของไฟล์',
-'filepath-page' => '{{ns:file}}:',
-'filepath-submit' => 'ไป',
-'filepath-summary' => 'หน้าพิเศษนี้คืนค่าเป็นเส้นทางเต็มของไฟล์
-ไฟล์ภาพจะถูกแสดงในขนาดเต็ม และไฟล์ประเภทอื่นจะถูกเปิดด้วยโปรแกรมที่เกี่ยวข้องโดยตรง
-
-กรุณาป้อนชื่อไฟล์โดยไม่มี "{{ns:file}}:" นำหน้า',
+# Special:Redirect
+'redirect' => 'การเปลี่ยนทางตามชื่อไฟล์ รหัสประจำผู้ใช้หรือรุ่น',
+'redirect-legend' => 'การเปลี่ยนทางไปยังไฟล์หรือหน้า',
+'redirect-summary' => 'หน้าพิเศษนี้เปลี่ยนทางไปยังไฟล์ (ระบุเป็นชื่อไฟล์) หน้า (ระบุเป็นรหัสรุ่น) หรือหน้าผู้ใช้ (ระบุเป็นรหัสผู้ใช้)',
+'redirect-submit' => 'ไป',
+'redirect-lookup' => 'ค้นดู:',
+'redirect-value' => 'ค่า:',
+'redirect-user' => 'รหัสผู้ใช้',
+'redirect-revision' => 'รุ่นหน้า',
+'redirect-file' => 'ชื่อไฟล์',
+'redirect-not-exists' => 'ไม่พบค่า',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ค้นหาไฟล์ที่ซ้ำซ้อน',
@@ -3648,6 +3718,7 @@ $5
 'tags' => 'ป้ายกำกับการเปลี่ยนแปลง (ที่สามารถใช้ได้)',
 'tag-filter' => 'ตัวกรอง[[Special:Tags|ป้ายกำกับ]]:',
 'tag-filter-submit' => 'กรอง',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|ป้ายกำกับ}}]]: $2)',
 'tags-title' => 'ป้ายกำกับ',
 'tags-intro' => 'หน้านี้แสดงรายการและความหมายของป้ายกำกับต่างๆ ที่ซอฟต์แวร์อาจจะใช้ทำเครื่องหมายกำกับการแก้ไข',
 'tags-tag' => 'ชื่อป้ายกำกับ',
@@ -3689,6 +3760,8 @@ $5
 'htmlform-submit' => 'ส่งข้อมูล',
 'htmlform-reset' => 'ยกเลิกการเปลื่ยนแปลง',
 'htmlform-selectorother-other' => 'อื่น ๆ',
+'htmlform-no' => 'ไม่',
+'htmlform-yes' => 'ใช่',
 
 # SQLite database support
 'sqlite-has-fts' => 'รุ่น $1 พร้อมการสนับสนุนการค้นหาข้อความแบบเต็ม',
diff --git a/languages/messages/MessagesTk.php b/languages/messages/MessagesTk.php
index fcd08d5c..30a9c332 100644
--- a/languages/messages/MessagesTk.php
+++ b/languages/messages/MessagesTk.php
@@ -68,9 +68,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Gözegçilikde saklaýan ulanyjylaryň sanyny görkez',
 'tog-oldsig' => 'Bar bolan gol:',
 'tog-fancysig' => 'Gola wikitekst hökmünde çemeleş (awtomatik çykgytsyz)',
-'tog-externaleditor' => 'Gaýybana daşarky redaktor ulan (diňe hünärmenler üçin, kompýuteriňizde ýörite sazlamalar talap edilýär. [//www.mediawiki.org/wiki/Manual:External_editors Jikme-jik.])',
-'tog-externaldiff' => 'Başga programmalaryň üsti bilen deňeşdir (diňe hünärmenler üçin, kompýuteriňizde ýörite sazlamalar talap edilýär)',
-'tog-showjumplinks' => '"Git" çykgydyny işlet',
 'tog-uselivepreview' => 'Gönümel deslapky syny ulan (JavaScript) (Synag edilýär)',
 'tog-forceeditsummary' => 'Gysgaça mazmuny boş galdyran mahalym maňa ýatlat',
 'tog-watchlisthideown' => 'Gözegçilik sanawymdan öz özgerdişlerimi gizle',
@@ -268,7 +265,7 @@ $1',
 'pool-queuefull' => 'Howzuň nobaty doly',
 'pool-errorunknown' => 'Näbelli säwlik',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} hakynda',
 'aboutpage' => 'Project:Hakynda',
 'copyright' => 'Mazmun $1 esasynda elýeterlidir.',
@@ -278,7 +275,6 @@ $1',
 'disclaimers' => 'Jogapkärçilikden boýun gaçyrma',
 'disclaimerpage' => 'Project:Umumy jogapkärçilikden boýun gaçyrma',
 'edithelp' => 'Nähili redaktirlenýär?',
-'edithelppage' => 'Help:Redaktirleme',
 'helppage' => 'Help:Içindäkiler',
 'mainpage' => 'Baş Sahypa',
 'mainpage-description' => 'Baş Sahypa',
@@ -351,16 +347,6 @@ Bar bolan ähli ýörite sahypalary [[Special:SpecialPages|ýörite sahypalar]]
 # General errors
 'error' => 'Säwlik',
 'databaseerror' => 'Maglumat bazasynyň säwligi',
-'dberrortext' => 'Maglumat bazasy gözleginde sintaksis säwligi ýüze çykdy.
-Onuň programmadaky bir säwlik bolmagy ahmal.
-"<tt>$2</tt>" funksiýasyndan synalyp görülen iň soňky maglumat bazasy gözlegi:
-<blockquote><tt>$1</tt></blockquote>.
-Maglumat bazasy tarapyndan yzyna gaýtarylan säwlik "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Maglumat bazasy gözleginde sintaksis säwligi ýüze çykdy.
-Iň soňky maglumat bazasy gözlegi:
-"$1"
-Ulanylan funksiýa "$2".
-Maglumat bazasy tarapyndan yzyna gaýtarylan säwlik "$3: $4"',
 'laggedslavemode' => 'Duýduryş: Sahypada soňky täzelemeler ýok bolmagy ahmal.',
 'readonly' => 'Maglumat bazasy gulplandy',
 'enterlockreason' => 'Gulplamak üçin bir sebäp görkeziň. Gulpuň haçan açyljakdygy barada takmynan bir sene ýazyň.',
@@ -408,7 +394,6 @@ Talap: $2',
 'viewsourcetext' => 'Bu sahypanyň çeşmesini görüp hem-de göçürip bilersiňiz:',
 'protectedinterface' => 'Bu sahypa programma üçin interfeýs tekstini üpjün edýär. Bet niýetli hüjümlerden goramak maksady bilen gulp astyna alnandyr.',
 'editinginterface' => "'''Duýduryş:''' Programma üçin interfeýs tekstini üpjün etmekte ulanylýan bir sahypany redaktirleýärsiňiz. Bu sahypada ediljek üýtgeşmeler beýleki ulanyjylar üçin ulanyjy interfeýsiniň daşky görnüşini üýtgedýändir. Terjimeler üçin, MediaWikiniň lokalizasiýa taslamasy bolan [//translatewiki.net/wiki/Main_Page?setlang=tr translatewiki.net]i ulanmaklygyňyzy haýyş edýäris.",
-'sqlhidden' => '(SQL gizlin talap)',
 'cascadeprotected' => 'Bu sahypa redaktirlenmekden goralýar, sebäbi ol "kaskadly" opsiýasy işledilip gorag astyna alnan {{PLURAL:$1|sahypada|sahypada}} ulanylýar:
 $2',
 'namespaceprotected' => "Siziň '''$1''' giňişligindäki sahypalary redaktirlemäge rugsadyňyz ýok.",
@@ -520,7 +505,7 @@ Sessiýa açmaklygy tamamlamak üçin, bu ýere täze parol ýazyň:',
 'newpassword' => 'Täze parol:',
 'retypenew' => 'Täze paroly gaýtadan ýaz:',
 'resetpass_submit' => 'Paroly sazlaň we sessiýa açyň',
-'resetpass_success' => 'Parolyňyz şowlulyk bilen üýtgedildi! Häzir sessiýaňyz açylýar...',
+'changepassword-success' => 'Parolyňyz şowlulyk bilen üýtgedildi! Häzir sessiýaňyz açylýar...',
 'resetpass_forbidden' => 'Parollary üýtgedip bolmaýar',
 'resetpass-no-info' => 'Bu sahypany gönüden-göni açmak üçin sessiýa açmagyňyz zerurdyr.',
 'resetpass-submit-loggedin' => 'Paroly üýtget',
@@ -967,7 +952,6 @@ Nawigasiýa çykgytlaryny ulanmaklygyň bu sütüni başky ýagdaýyna getirjekd
 'searchmenu-legend' => 'Gözleg opsiýalary',
 'searchmenu-exists' => "'''Bu wikide \"[[:\$1]]\" atly sahypa bar'''",
 'searchmenu-new' => "'''Bu wikide \"[[:\$1]]\" sahypasyny döret!'''",
-'searchhelp-url' => 'Help:Içindäkiler',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Şu prefiksli sahypalara göz aýla]]',
 'searchprofile-articles' => 'Mazmunly sahypalar',
 'searchprofile-project' => 'Ýardam we Taslama sahypalary',
@@ -1012,14 +996,6 @@ Gözlegiňiziň başyna '''all:''' pristawkasyny goşup tutuş mazmuny (şol san
 Ýogsa-da, oňa çenli Google bilen gözleg geçirip bilersiňiz.
 Emma olaryň {{SITENAME}} indeksleriniň möwriti geçen bolmagy mümkindir.',
 
-# Quickbar
-'qbsettings' => 'Tiz panel',
-'qbsettings-none' => 'Hiç biri',
-'qbsettings-fixedleft' => 'Çepe berkidildi',
-'qbsettings-fixedright' => 'Saga berkidildi',
-'qbsettings-floatingleft' => 'Çepe ýaplanýar',
-'qbsettings-floatingright' => 'Saga ýaplanýar',
-
 # Preferences page
 'preferences' => 'Ileri tutmalar',
 'mypreferences' => 'Ileri tutmalar',
@@ -1050,7 +1026,6 @@ Emma olaryň {{SITENAME}} indeksleriniň möwriti geçen bolmagy mümkindir.',
 'resetprefs' => 'Ýazdyrylmadyk üýtgeşmeleri aýyr',
 'restoreprefs' => 'Ähli gaýybana sazlamalary dikelt',
 'prefs-editing' => 'Redaktirleme',
-'prefs-edit-boxsize' => 'Redaktirleme penjiresiniň ölçegi.',
 'rows' => 'Hatarlar:',
 'columns' => 'Sütünler:',
 'searchresultshead' => 'Gözleg',
@@ -1061,9 +1036,6 @@ Emma olaryň {{SITENAME}} indeksleriniň möwriti geçen bolmagy mümkindir.',
 'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|gün|gün}})',
 'recentchangescount' => 'Gaýybana görkeziljek özgerdiş sany:',
 'prefs-help-recentchangescount' => 'Muňa soňky üýtgeşmeler, sahypa geçmişleri hem-de gündelikler girýär.',
-'prefs-help-watchlist-token' => 'Bu meýdança gizlin açar ýazmagyňyz gözegçilik sanawyňyz üçin RSS translýasiýasyny döredýär.
-Bu meýdançadaky açary bilen adam gözegçilik sanawyňyzy okap biler, şonuň üçin hem başga bir howpsuz baha saýlaň.
-Gabat gelşine görä döredilen şu bahany ulanyp bilersiňiz: $1',
 'savedprefs' => 'Ileri tutmalaryňyz ýazdyryldy.',
 'timezonelegend' => 'Sagat guşaklygy',
 'localtime' => 'Ýerli wagt:',
@@ -1093,7 +1065,6 @@ Gabat gelşine görä döredilen şu bahany ulanyp bilersiňiz: $1',
 'prefs-common-css-js' => 'Ähli bezegler üçin paýlaşylýan CSS/JavaScript:',
 'prefs-reset-intro' => 'Bu sahypada öz ileri tutmalaryňyzy saýtyň gaýybana ýagdaýyna getirip bilersiňiz. Yzyna dikeldip bolmaýar.',
 'prefs-emailconfirm-label' => 'E-poçta tassyklamasy:',
-'prefs-textboxsize' => 'Redaktirleme penjiresiniň ölçegi',
 'youremail' => 'E-poçta:',
 'username' => 'Ulanyjy ady:',
 'uid' => 'Ulanyjy belgisi:',
@@ -1319,7 +1290,6 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
 'recentchangeslinked-feed' => 'Degişli üýtgeşmeler',
 'recentchangeslinked-toolbox' => 'Degişli üýtgeşmeler',
 'recentchangeslinked-title' => '"$1" bilen baglanyşykly üýtgeşmeler',
-'recentchangeslinked-noresult' => 'Berlen wagtyň dowamynda çykgyt berýän sahypalarda üýtgeşme bolmady.',
 'recentchangeslinked-summary' => "Aşakdaky sanaw, görkezilen sahypa (ýa-da görkezilen kategoriýanyň agzalaryna) çykgyt berýän sahypalarda edilen üýtgeşmeleriň sanawydyr.
 [[Special:Watchlist|Gözegçilik sanawyňyzdaky]] sahypalar '''goýy''' ýazgy bilen görkezilýär.",
 'recentchangeslinked-page' => 'Sahypanyň ady:',
@@ -1484,7 +1454,6 @@ Howpsuzlygyň optimizasiýasy üçin, img_auth.php ýapylyp goýuldy.',
 'http-read-error' => 'HTTP okamak säwligi.',
 'http-timed-out' => 'HTTP talabynyň wagty geçdi.',
 'http-curl-error' => 'URL äkelmek säwligi: $1',
-'http-host-unreachable' => 'URL-ä baryp bolmaýar',
 'http-bad-status' => 'HTTP talaby wagtynda problema döredi: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1628,12 +1597,6 @@ Giriş formaty: mazmuntip/kiçitip, meselem <code>surat/jpeg</code>.',
 'statistics-users-active-desc' => 'Soňky {{PLURAL:$1|1 günde|$1 günde}} haýsydyr bir iş geçiren ulanyjylar',
 'statistics-mostpopular' => 'Iň köp görülýän sahypalar',
 
-'disambiguations' => 'Dürli manyly sahypalar',
-'disambiguationspage' => 'Template:Dürli manylar',
-'disambiguations-text' => "Aşakdaky sahypalar '''dürli manyly sahypa''' çykgyt berýär.
-Olar muňa derek degişli anyk sahypa çykgyt bermelidir.<br />
-[[MediaWiki:Disambiguationspage]] sahypasyndan çykgyt berilýän bir şablony ulanýan bolsa, onda ol sahypa dürli manyly hökmünde çemeleşilýär.",
-
 'doubleredirects' => 'Jübüt gönükdirmeler',
 'doubleredirectstext' => 'Bu sahypa başga gönükdirme sahypalaryna gönükdirýän sahypalaryň sanawyny görkezýär.
 Her bir hatar birinji we ikinji gönükdirmeleri, şeýle-de ikinji gönükdirmäniň maksady bolup durýan hem-de şol bir wagtyň özünde birinji gönükdirmäniň adatça barmaly ýeri bolan "hakyky" maksat edinilýän sahypany öz içine alýar.
@@ -1859,10 +1822,9 @@ Aňsatlyk bilen saýlap almak üçin bolsa, [[Special:RecentChanges|soňky üýt
 'unwatchthispage' => 'Gözegçilik etmegi bes et',
 'notanarticle' => 'Makala däl',
 'notvisiblerev' => 'Başga bir ulanyja degişli iň soňky wersiýa öçürilipdir',
-'watchnochange' => 'Gözegçilik edýän sahypalaryňyzyň hiç birisi görkezilen wagtyň dowamynda redaktirlenmändir.',
 'watchlist-details' => 'Çekişme sahypalaryny hasap etmäniňde, gözegçilik sanawyňyzda {{PLURAL:$1|$1 sahypa|$1 sahypa}} bar.',
-'wlheader-enotif' => '* E-poçta bilen habar beriş açyk.',
-'wlheader-showupdated' => "* Soňky gezek baryp görenizden soňra üýtgedilen sahypalar '''goýy şrift''' bilen görkezilýär.",
+'wlheader-enotif' => 'E-poçta bilen habar beriş açyk.',
+'wlheader-showupdated' => "Soňky gezek baryp görenizden soňra üýtgedilen sahypalar '''goýy şrift''' bilen görkezilýär.",
 'watchmethod-recent' => 'soňky özgerdişlerdäki gözegçilikde saklaýan sahypalaryňyz barlanylýar',
 'watchmethod-list' => 'gözegçilikde saklaýan sahypalaryňyzdaky soňky özgerdişler barlanylýar',
 'watchlistcontains' => 'Gözegçilik sanawyňyzda $1 sany {{PLURAL:$1|sahypa|sahypa}} bar.',
@@ -2093,7 +2055,7 @@ $1',
 'contributions' => '{{GENDER:$1|Ulanyjy}} goşantlary',
 'contributions-title' => '$1 üçin ulanyjy goşantlary',
 'mycontris' => 'Goşantlar',
-'contribsub2' => '$1 ($2)',
+'contribsub2' => '{{GENDER:$3|$1}} üçin ($2)',
 'nocontribs' => 'Bu kriteriýlere gabat gelýän üýtgeşme ýok.',
 'uctop' => '(häzirki)',
 'month' => 'Aý:',
@@ -2230,12 +2192,9 @@ Blokirlemesi eýýäm aýyrylan bolmagy mümkin.',
 Emma, bu adres $2 diapazonynyň bir bölegi hökmünde blokirlenipdir, diapazon blokirlemesini aýryp bilersiňiz.',
 'ip_range_invalid' => 'Nädogry IP diapazony.',
 'ip_range_toolarge' => '/$1 blokdan uly aralyk blokirlemelere rugsat berilmeýär',
-'blockme' => 'Meni blokirle',
 'proxyblocker' => 'Proksi blokirleýji',
-'proxyblocker-disabled' => 'Bu funksiýa ýapyk.',
 'proxyblockreason' => 'IP adresiňiz açyk proksidigi sebäpli blokirlenipdir.
 Internet üpjün edijiňiz ýa-da goldaw gullugy bilen habarlaşyp, olary bu çynlakaý howpsuzlyk problemasy barada habardar ediň.',
-'proxyblocksuccess' => 'Ýerine ýetirildi.',
 'sorbsreason' => 'IP adresiňiz {{SITENAME}} tarapyndan ulanylýan DNSBL-de açyk proksi hökmünde sanawa goşulypdyr.',
 'sorbs_create_account_reason' => 'IP adresiňiz {{SITENAME}} tarapyndan ulanylýan DNSBL-de açyk proksi hökmünde sanawa goşulypdyr.
 Hasap açyp bilmeýärsiňiz.',
@@ -2616,7 +2575,7 @@ Ondan soňraky çykgyt(lar) kadadan çykma hökmünde kabul edilýär, meselem:
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'In',
 'exif-imagelength' => 'Beýiklik',
 'exif-bitspersample' => 'Komponent başyna bit',
@@ -2732,7 +2691,7 @@ Ondan soňraky çykgyt(lar) kadadan çykma hökmünde kabul edilýär, meselem:
 'exif-languagecode' => 'Dil',
 'exif-iimcategory' => 'Kategoriýa',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Gysylmadyk',
 
 'exif-unknowndate' => 'Näbelli sene',
@@ -3033,7 +2992,6 @@ Bolanyňyzdan soňra "{{int:Watchlistedit-raw-submit}}" düwmesine basyň.
 'version-other' => 'Başga',
 'version-mediahandlers' => 'Media işleýjiler',
 'version-hooks' => 'Ilgençekler',
-'version-extension-functions' => 'Giňeltme funksiýalary',
 'version-parser-extensiontags' => 'Analizator giňeltme bellikleri',
 'version-parser-function-hooks' => 'Analizator funsiýasynyň ilgençekleri',
 'version-hook-name' => 'Ilgençegiň ady',
@@ -3051,15 +3009,6 @@ Bu programmanyň ýany bilen siz [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General P
 'version-software-product' => 'Önüm',
 'version-software-version' => 'Wersiýa',
 
-# Special:FilePath
-'filepath' => 'Faýla barýan ýol',
-'filepath-page' => 'Faýl:',
-'filepath-submit' => 'Git',
-'filepath-summary' => 'Bu ýörite sahypa faýla barýan doly ýoly gaýtaryp getirýär.
-Suratlar doly ölçegde görkezilýär, beýleki faýl görnüşleri degişli programmalary bilen gönümel başladylýar.
-
-Faýlyň adyny "{{ns:file}}:" pristawkasyz giriziň.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dublikat faýllaryň gözlegi',
 'fileduplicatesearch-summary' => 'Heş kodlary boýunça meňzeş faýllary gözle.',
diff --git a/languages/messages/MessagesTl.php b/languages/messages/MessagesTl.php
index 73c7c570..1d333551 100644
--- a/languages/messages/MessagesTl.php
+++ b/languages/messages/MessagesTl.php
@@ -10,6 +10,7 @@
  * @author AnakngAraw
  * @author Dosmiin Barsbold
  * @author Felipe Aira
+ * @author Jojit fb
  * @author Kaganer
  * @author Sky Harbor
  * @author tl.wikipedia.org sysops
@@ -36,8 +37,6 @@ $namespaceNames = array(
 );
 
 $namespaceAliases = array(
-	'Talaksan'         => NS_FILE,
-	'Usapang talaksan' => NS_FILE_TALK,
 	'Suleras'          => NS_TEMPLATE,
 	'Usapang_suleras'  => NS_TEMPLATE_TALK,
 	'Kaurian'          => NS_CATEGORY,
@@ -176,9 +175,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ipakita ang bilang ng mga nagbabantay na tagagamit',
 'tog-oldsig' => 'Umiiral na lagda:',
 'tog-fancysig' => 'Ituring ang lagda bilang teksto ng wiki (walang automatikong pagkawing)',
-'tog-externaleditor' => 'Gumamit ng nakatakdang panlabas na pampatnugot ayon sa likas na pagkakatakda (para sa mga dalubhasa lamang, kailangan ng natatanging mga pagtatakda sa iyong kompyuter. [//www.mediawiki.org/wiki/Manual:External_editors Marami pang kabatiran.])',
-'tog-externaldiff' => 'Gumamit ng likas na nakatakdang panlabas na pagkakaiba (para sa mga dalubhasa lamang, kailangan ng natatanging mga pagtatakda sa iyong kompyuter. [//www.mediawiki.org/wiki/Manual:External_editors Mas marami pang kabatiran.])',
-'tog-showjumplinks' => 'Payagan ang mga "tumalon sa" na kawing pampagamit',
 'tog-uselivepreview' => 'Gamitin ang buhay na paunang tingin (JavaScript) (Eksperimental)',
 'tog-forceeditsummary' => 'Pagsabihan ako kapag nagpapasok ng walang-lamang buod ng pagbabago',
 'tog-watchlisthideown' => 'Itago ang aking mga pagbabago mula sa tala ng mga binabantayan',
@@ -192,6 +188,7 @@ $messages = array(
 'tog-showhiddencats' => 'Ipakita ang mga nakatagong kategorya',
 'tog-noconvertlink' => 'Huwag paganahin ang pagpapalit ng pamagat na pangkawing',
 'tog-norollbackdiff' => 'Alisin ang mga pagkakaiba pagkatapos isagawa ang pagpapagulong na pabalik sa dati',
+'tog-useeditwarning' => 'Magbabala sa akin kapag umalis ako sa isang pahina ng pampatnugot na hindi pa nasasagip ang mga pagbabago',
 
 'underline-always' => 'Palagi',
 'underline-never' => 'Hindi magpakailanman',
@@ -255,6 +252,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nob',
 'dec' => 'Dis',
+'january-date' => '$1 Enero',
+'february-date' => '$1 Pebrero',
+'march-date' => '$1 Marso',
+'april-date' => '$1 Abril',
+'may-date' => '$1 Mayo',
+'june-date' => '$1 Hunyo',
+'july-date' => '$1 Hulyo',
+'august-date' => '$1 Agosto',
+'september-date' => '$1 Setyembre',
+'october-date' => '$1 Oktubre',
+'november-date' => '$1 Nobyembre',
+'december-date' => '$1 Disyembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorya|Mga kategorya}}',
@@ -276,7 +285,7 @@ $messages = array(
 'broken-file-category' => 'Mga pahina na may sirang mga kawing ng talaksan',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Patungkol',
 'article' => 'Pahina ng nilalaman',
@@ -381,7 +390,7 @@ $1',
 'pool-queuefull' => 'Puno na ang pisan ng mga pila',
 'pool-errorunknown' => 'Hindi nalalamang kamalian',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Tungkol sa {{SITENAME}}',
 'aboutpage' => 'Project:Patungkol',
 'copyright' => 'Maaaring gamitin ang nilalaman sa ilalim ng $1.',
@@ -391,7 +400,6 @@ $1',
 'disclaimers' => 'Mga pagtatanggi',
 'disclaimerpage' => 'Project:Pangkalahatang pagtatanggi',
 'edithelp' => 'Tulong sa pagbabago',
-'edithelppage' => 'Help:Pagbabago',
 'helppage' => 'Help:Mga nilalaman',
 'mainpage' => 'Unang Pahina',
 'mainpage-description' => 'Unang Pahina',
@@ -423,7 +431,6 @@ Tingnan ang [[Special:Version|pahina ng bersiyon]].',
 'newmessagesdifflinkplural' => 'huling {{PLURAL:$1|pagbabago|mga pagbabago}}',
 'youhavenewmessagesmulti' => 'Mayroon kang mga bagong mensahe sa $1',
 'editsection' => 'baguhin',
-'editsection-brackets' => '[$1]',
 'editold' => 'baguhin',
 'viewsourceold' => 'tingnan ang batayan',
 'editlink' => 'baguhin',
@@ -475,17 +482,6 @@ Matatagpuan ang isang tala ng mga tamang natatanging pahina sa [[Special:Special
 # General errors
 'error' => 'Kamalian',
 'databaseerror' => 'Kamalian sa kalipunan ng datos',
-'dberrortext' => 'Naganap ang isang pagkakamali sa pag-uusisa na pampalaugnayan sa kalipunan ng datos.
-Maaaring magpahiwatig ito ng isang surot sa loob ng sopwer.
-Ang huling tinangkang pag-uusisa sa kalipunan ng datos ay:
-<blockquote><code>$1</code></blockquote>
-magmula sa loob ng tungkuling "<code>$2</code>".
-Nagbalik ang kalipunan ng dato ng kamalian na "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Nagkaroon po ng isang pagkakamali sa usisang pampalaugnayan sa kalipunan ng datos.
-Ang huling sinubukang paguusisa sa kalipunan ng datos ay:
-"$1"
-mula sa gawaing "$2".
-Ibinalik ng kalipunan ng datos ang kamaliang "$3: $4"',
 'laggedslavemode' => "'''Babala:''' Maaaring hindi naglalaman ang pahina ng mga huling dagdag.",
 'readonly' => 'Nakakandado ang kalipunan ng datos',
 'enterlockreason' => 'Maglagay ng dahilan sa pagkakandado, kasama ang taya kung kailan magtatapos ang pagkakandado',
@@ -541,12 +537,13 @@ Pakisubok na lang ulit pagkaraan ng kaunting mga minuto.",
 'editinginterface' => "'''Babala:''' Binabago mo ang isang pahinang ginagamit sa pagbibigay ng tekstong panghangganan para sa sopwer.
 Makaaapekto ang mga pagbago sa pahinang ito sa anyo ng hangganang (''interface'') pantagagamit na para sa ibang mga tagagamit sa wiking ito.
 Upang magdagag o magbago ng mga salinwika, isaaalang-alang na lang po ang paggamit ng [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], ang proyekto para sa lokalisasyon ng MediaWiki.",
-'sqlhidden' => '(nakatago ang tanong ng SQL)',
 'cascadeprotected' => 'Nakasanggalang ang pahinang ito mula sa mga pagbabago, dahil kabilang ito sa sumusunod na {{PLURAL:$1|pahinang|mga pahinang}} nakasanggalang sa pamamagitan ng binuhay na opsyong "nahuhulog" (kumakaskada):
 $2',
 'namespaceprotected' => "Wala kang pahintulot na magbago ng mga pahinang nasa ngalan-espasyong '''$1'''.",
 'customcssprotected' => 'Wala kang pahintulot na baguhin ang pahina ng CSS na ito, dahil naglalaman ito ng mga katakdaang pansarili ng ibang tagagamit.',
 'customjsprotected' => 'Wala kang pahintulot na baguhin ang pahina ng JavaScript na ito, dahil naglalaman ito ng mga katakdaang pansarili ng ibang tagagamit.',
+'mycustomcssprotected' => 'Wala kang pahintulot na baguhin itong pahinang CSS.',
+'mycustomjsprotected' => 'Wala kang pahintulot na baguhin itong pahinang JavaScript.',
 'ns-specialprotected' => 'Hindi pwedeng baguhin ang mga natatanging pahina.',
 'titleprotected' => "Nakasanggalang ang pamagat na ito mula sa paglikha ni [[User:$1|$1]].
 Ang ibinigay na dahilan ay ''$2''.",
@@ -573,9 +570,12 @@ Tandaan na may ilang pahinang maaaring magpatuloy na nagpapakitang parang nakala
 Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SITENAME}}]].',
 'yourname' => 'Bansag:',
 'yourpassword' => 'Hudyat:',
+'userlogin-yourpassword' => 'Hudyat',
+'userlogin-yourpassword-ph' => 'Ipasok ang iyong hudyat',
 'yourpasswordagain' => 'Hudyat mo uli:',
+'createacct-yourpasswordagain' => 'Tiyakin ang hudyat',
 'remembermypassword' => 'Tandaan ang paglagda ko sa kompyuter na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})',
-'securelogin-stick-https' => 'Manatiling konektado sa HTTPS matapos lumagda',
+'userlogin-remembermypassword' => 'Panatilihin akong nakalagda',
 'yourdomainname' => 'Dominyo mo:',
 'password-change-forbidden' => 'Hindi mo maaaring palitan ang mga hudyat sa wiking ito.',
 'externaldberror' => 'Maaaring may kamalian sa pagpapatotoo ng kalipunan ng mga dato o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na kuwenta o patnugutan.',
@@ -587,14 +587,19 @@ Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SIT
 'logout' => 'Umalis sa pagkakalagda',
 'userlogout' => 'Umalis sa pagkakalagda',
 'notloggedin' => 'Hindi nakalagda',
+'userlogin-noaccount' => 'Wala ka pa bang kuwenta?',
+'userlogin-joinproject' => 'Sumali sa {{SITENAME}}',
 'nologin' => 'Wala ka pang kuwenta? $1.',
 'nologinlink' => 'Lumikha ng kuwenta',
 'createaccount' => 'Lumikha ng kuwenta',
 'gotaccount' => 'May kuwenta ka na ba? $1.',
 'gotaccountlink' => 'Lumagda',
 'userlogin-resetlink' => 'Nakalimutan mo ang iyong mga detalyeng panglagda?',
+'createacct-emailrequired' => 'Direksiyong e-liham:',
 'createaccountmail' => 'Gumamit ng pansamantalang walang-piling hudyat at ipadala ito sa direksiyong e-liham na nakasaad sa ibaba',
+'createacct-realname' => 'Tunay na pangalan (maaaring wala)',
 'createaccountreason' => 'Dahilan:',
+'createacct-reason' => 'Dahilan',
 'badretype' => 'Hindi magkatugma ang ipinasok mong mga hudyat.',
 'userexists' => 'May gumagamit na ng ipinasok na bansag.
 Pumili po ng ibang pangalan.',
@@ -687,7 +692,7 @@ Para tapusin ang paglagda, dapat kang magtakda ng isang bagong hudyat dito:',
 'newpassword' => 'Bagong hudyat:',
 'retypenew' => 'Ipasok muli ang bagong hudyat:',
 'resetpass_submit' => 'Itakda ang hudyat at lumagda',
-'resetpass_success' => 'Matagumpay na nabago ang iyong hudyat!  Inilalagda ka na ngayon...',
+'changepassword-success' => 'Matagumpay na nabago ang iyong hudyat!  Inilalagda ka na ngayon...',
 'resetpass_forbidden' => 'Hindi mababago ang mga hudyat',
 'resetpass-no-info' => 'Nakalagda ka dapat para tuwirang mapuntahan ang pahina ito.',
 'resetpass-submit-loggedin' => 'Baguhin ang hudyat',
@@ -698,10 +703,8 @@ Maaaring matagumpay mo nang nabago ang iyong hudyat o nakahiling na ng isang bag
 
 # Special:PasswordReset
 'passwordreset' => 'Muling pagtatakda ng hudyat',
-'passwordreset-text' => 'Punuin ang pormularyong ito upang makatanggap ng isang pampaalalang e-liham ng iyong mga detalye ng akawnt.',
 'passwordreset-legend' => 'Itakdang muli ang hudyat',
 'passwordreset-disabled' => 'Hindi pinagagana sa wiking ito ang muling mga pagtatakda ng hudyat.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Ipasok ang isa sa mga piraso ng datos sa ibaba}}',
 'passwordreset-username' => 'Pangalan ng tagagamit:',
 'passwordreset-domain' => 'Nasasakupan:',
 'passwordreset-capture' => 'Tingnan ang lumabas na e-liham?',
@@ -949,6 +952,8 @@ Tila binura na ito.',
 'edit-already-exists' => 'Hindi makalikha ng isang bagong pahina.
 Umiiral na ito.',
 'defaultmessagetext' => 'Nakatakdang teksto ng mensahe',
+'editwarning-warning' => 'Ang paglisan mula sa pahinang ito ay maaaring makasanhi sa iyo ng pagkawala ng anumang mga pagbabagong ginawa mo.
+Kung nakalagda ka, maaari mong huwag paganahin ang babalang ito sa loob ng seksyong "May binabago" ng mga nais mo.',
 
 # Content models
 'content-model-wikitext' => 'wikiteksto',
@@ -1187,7 +1192,6 @@ Matatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={
 'searchmenu-legend' => 'Mga pagpipilian para sa paghahanap',
 'searchmenu-exists' => "'''Mayroong pahinang may pangalang \"[[:\$1]]\" dito sa wiking ito'''",
 'searchmenu-new' => "'''Likhain ang pahinang \"[[:\$1]]\" sa wiking ito!'''",
-'searchhelp-url' => 'Help:Nilalaman',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Tingnan-tingnan ang mga pahinang may ganitong unahan/unlapi]]',
 'searchprofile-articles' => 'Mga pahina ng nilalaman',
 'searchprofile-project' => 'Mga pahina ng Tulong at Proyekto',
@@ -1230,15 +1234,6 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
 'search-external' => 'Panlabas na paghahanap',
 'searchdisabled' => 'Nakapatay ang paghahanap sa {{SITENAME}}. Maaari kang pansamantalang maghanap sa pamamagitan ng Google. Tandaan na maaaring luma na ang kanilang mga indeks sa nilalaman ng {{SITENAME}}.',
 
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Wala',
-'qbsettings-fixedleft' => 'Inayos ang kaliwa',
-'qbsettings-fixedright' => 'Inayos ang kanan',
-'qbsettings-floatingleft' => 'Kaliwa lumulutang',
-'qbsettings-floatingright' => 'Kanan lumulutang',
-'qbsettings-directionality' => 'Naayos na, ayon sa kapupuntahan ng panitik ng wika mo',
-
 # Preferences page
 'preferences' => 'Mga kagustuhan',
 'mypreferences' => 'Mga nais',
@@ -1271,7 +1266,6 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
 'resetprefs' => 'Hawanin ang hindi nasagip na mga pagbabago',
 'restoreprefs' => 'Ibalik ang lahat ng likas na mga pagtatakda',
 'prefs-editing' => 'May binabago',
-'prefs-edit-boxsize' => 'Sukat ng dungawan ng ginagawang pagbabago.',
 'rows' => 'Mga pahalang na hanay:',
 'columns' => 'Mga pahabang hanay:',
 'searchresultshead' => 'Hanapin',
@@ -1282,7 +1276,6 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
 'recentchangesdays-max' => '(pinakamataas na ang $1 {{PLURAL:$1|araw|mga araw}})',
 'recentchangescount' => 'Bilang ng mga pagbabagong ipapakita sa pamamagitan ng likas na katakdaan:',
 'prefs-help-recentchangescount' => 'Kasama nito ang mga huling binago, kasaysayan ng mga pahina, at mga tala.',
-'prefs-help-watchlist-token' => "Ang pagpupuno sa lugar na ito na ginagamitan ng lihim na susi ay lilikha ng pakaing RSS para sa iyong talaan ng mga binabantayan.  Ang sinumang nakakaalam ng susi sa loob ng lugar na ito ay makababasa ng iyong talaan ng mga binabantayan, kaya't pumili ng ligtas na halaga.  Narito ang magagamit mong isang halagang nilikha ng pagkakataon: $1",
 'savedprefs' => 'Nasagip na ang mga kagustuhan mo.',
 'timezonelegend' => 'Sona ng oras:',
 'localtime' => 'Lokal na oras:',
@@ -1313,7 +1306,6 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
 'prefs-reset-intro' => 'Magagamit mo ang pahinang ito upang muling maitakda ang mga kagustuhan mo sa likas na pagtatakda ng sityo.
 Hindi ito maibabalik sa dating gawi.',
 'prefs-emailconfirm-label' => 'Kumpirmasyon ng e-liham:',
-'prefs-textboxsize' => 'Sukat ng bintana ng pagbabago',
 'youremail' => 'E-liham:',
 'username' => '{{GENDER:$1|Bansag}}:',
 'uid' => 'ID ng {{GENDER:$1|tagagamit}}:',
@@ -1560,7 +1552,6 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'recentchangeslinked-feed' => 'Kaugnay na mga pagbabago',
 'recentchangeslinked-toolbox' => 'Kaugnay na mga pagbabago',
 'recentchangeslinked-title' => 'Mga pagbabagong kaugnay ng "$1"',
-'recentchangeslinked-noresult' => 'Walang mga pagbabago sa mga pahinang nakakawing sa ibinigay na kapanahunan.',
 'recentchangeslinked-summary' => "Nililista ng natatanging pahina na ito ang huling mga pagbabago na nakaugnay. Naka '''matapang na teksto''' ang iyong mga binabantayan.",
 'recentchangeslinked-page' => 'Pangalan ng pahina:',
 'recentchangeslinked-to' => 'Ipakita ang mga pagbabago sa mga pahinang nakaugnay sa isang binigay na pahina sa halip',
@@ -1798,7 +1789,6 @@ Para sa pinakamatatag na kaligtasan, hindi pinagana ang img_auth.php.',
 'http-read-error' => 'Kamalian sa pagbasa ng HTTP.',
 'http-timed-out' => 'Huminto ang kahilingang HTTP.',
 'http-curl-error' => 'Kamalian sa pagsalok ng URL: $1',
-'http-host-unreachable' => 'Hindi marating ang URL.',
 'http-bad-status' => 'Nagkaroon ng suliranin habang hinihiling ang HTTP na: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1951,12 +1941,6 @@ Marahil ay naisa mong baguhin ang paglalarawan doon sa [$2 pahina ng paglalarawa
 'statistics-users-active-desc' => 'Mga tagagamit na nagsagawa ng isang galaw/gawain sa huling {{PLURAL:$1|araw|$1 mga araw}}',
 'statistics-mostpopular' => 'Mga pinakarinarayong pahina',
 
-'disambiguations' => 'Mga pahinang nakakawing sa mga pahina ng paglilinaw',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Ang sumusunod na mga pahina ay naglalaman ng kahit na isang kawing na papunta sa isang '''pahina ng paglilinaw'''.
-Sa halip, maaaring kailanganing kumawing ang mga ito sa isang mas naaangkop na pahina.<br />
-Ang isang pahina ay itinuturing bilang pahina ng paglilinaw kung gumagamit ito ng isang suleras na nakakawing magmula sa [[MediaWiki:Disambiguationspage|MediaWiki:Pahina ng mga paglilinaw]].",
-
 'doubleredirects' => 'Mga dobleng karga',
 'doubleredirectstext' => 'Nagtatala ang pahinang ito ng mga pahinang pumupunta sa iba pang mga pahinang nililipatan.  Naglalaman ang bawat hanay ng mga kawing sa una ang pangalawang kapupuntahan, maging ng puntiryang pangalawang kapupuntahan, na karaniwang "tunay" na puntiryang pahina, na dapat kinatuturuan ng unang pupuntahan.
 Nasugpo na ang mga ipinasok na <del>inekisan</del>.',
@@ -2206,10 +2190,9 @@ Makikita doon ang lahat ng mga susunod na pagbabago sa pahinang ito pati na ang
 'unwatchthispage' => 'Tigil Bantay',
 'notanarticle' => 'Hindi isang nilalamang pahina',
 'notvisiblerev' => 'Nabura na ang pagbabago',
-'watchnochange' => 'Wala sa binabantayan mo ang binago sa oras na nakikita.',
 'watchlist-details' => '{{PLURAL:$1|$1 pahinang|$1 mga pahinang}} nasa iyong talaan ng mga binabantayan, hindi binibilang ang mga pahina ng usapan.',
-'wlheader-enotif' => '* Umiiral ang pagpapahayag sa pamamagitan ng e-liham.',
-'wlheader-showupdated' => "* Ipinapakitang may '''makakapal na mga panitik''' ang nabagong/binagong mga pahina mula pa noong huli mong pagdalaw sa kanila",
+'wlheader-enotif' => 'Umiiral ang pagpapahayag sa pamamagitan ng e-liham.',
+'wlheader-showupdated' => "Ipinapakitang may '''makakapal na mga panitik''' ang nabagong/binagong mga pahina mula pa noong huli mong pagdalaw sa kanila",
 'watchmethod-recent' => 'sinusuri ang kamakailan lamang na mga pagbabago para sa binabantayang mga pahina',
 'watchmethod-list' => 'sinusuri ang binabantayang mga pahina para sa mga kamakailan lamang na mga pagbabago',
 'watchlistcontains' => 'Naglalaman ng $1 {{PLURAL:$1|pahina|mga pahina}} ang iyong talaan ng mga binabantayan.',
@@ -2608,11 +2591,8 @@ Tingnan ang [[Special:BlockList|talaan ng pagharang]] para sa lista ng kasalukuy
 'ipb_blocked_as_range' => 'Mali: Hindi diretsong nakaharang ang IP na $1 at hindi maaaring tanggalin sa pagkakaharang. Bagaman, bahagi ito sa sakop na $2, na maaaring tanggalin sa pagkaharang.',
 'ip_range_invalid' => 'Hindi tamang sakop ng IP.',
 'ip_range_toolarge' => 'Hindi pinapayagan ang mga saklaw ng pagharang na mas malaki kaysa /$1.',
-'blockme' => 'Harangin ako',
 'proxyblocker' => 'Pangharang ng proxy',
-'proxyblocker-disabled' => 'Nakapatay ang pagharang sa proxy.',
 'proxyblockreason' => 'Hinarang ang IP address mo dahil bukas na proxy ito. Makipag-ugnayan sa iyong tagabigay ng serbisyong Internet o suportang teknikal at ipaalam sa kanila itong seryesong suliranin sa seguridad.',
-'proxyblocksuccess' => 'Tapos na.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Nakalista ang IP address mo bilang isang bukas na proxy sa DNSBL na ginagamit ng sayt na ito.',
 'sorbs_create_account_reason' => 'Nakalista ang IP address mo bilang isang bukas na proxy sa DNSBL na ginagamit ng sayt na ito. Hindi ka makakalikha ng akawnt',
@@ -2927,17 +2907,11 @@ Maaari mong tingnan ang batayan nito.',
 
 # Stylesheets
 'common.css' => '/* Ang inilagay na CSS dito ay gagamitin para sa lahat ng mga pabalat */',
-'standard.css' => '/* Ang inilagay na CSS dito ay makakaapekto sa mga tagagamit ng Karaniwang pabalat */',
-'nostalgia.css' => '/* Ang CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Nostalgia */',
 'cologneblue.css' => "/* Ang Cascading Style Sheets na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Bughaw na Kolown (''Cologne Blue'') */",
 'monobook.css' => '/* Ang CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Monobook */',
-'myskin.css' => "/* Ang CSS na inilagay dito ay makakaapekto sa lahat ng mga tagagamit ng pabalat na Balatko (''MySkin'') */",
-'chick.css' => "/* Ang CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na ''Chick'' */",
-'simple.css' => "/* Ang CSS na iniligay dito ay makakaapekto sa mga tagagamit ng Payak (''Simple'') na pabalat */",
 'modern.css' => "/* Ang CSS na iniligay dito ay makakaapekto sa tagagamit ng Makabagong (''Modern'') pabalat */",
 'vector.css' => '/* Ang inilagay na CSS dito ay makakaapekto sa mga tagagamit ng pabalat na Vector */',
 'print.css' => '/* Ang CSS na inilagay dito ay makakaapekto sa kalalabasan o resulta ng paglilimbag */',
-'handheld.css' => "/* Ang CSS na inilagay dito ay makakaapekto sa mga aparatong nahahawakan (''handheld device'') batay sa itinakdang pabalat sa ''\$wgHandheldStyle'' */",
 'noscript.css' => '/* Ang inilagay na Cascading Style Sheets dito ay makakaapekto sa mga tagagamit na hindi nagpapagana ng JavaScript */',
 'group-autoconfirmed.css' => '/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets o CSS) dito ay makakaapekto lamang sa mga tagagamit na kusang natiyak */',
 'group-bot.css' => '/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets o CSS) dito ay makakaapekto lamang sa mga bot */',
@@ -2946,13 +2920,8 @@ Maaari mong tingnan ang batayan nito.',
 
 # Scripts
 'common.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa lahat ng mga tagagamit ng bawat pahinang ikinarga. */',
-'standard.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng Karaniwang pabalat */',
-'nostalgia.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na Nostalgia */',
 'cologneblue.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit ng pabalat na Cologne Blue o Bughaw na Kolown */',
 'monobook.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na MonoBook */',
-'myskin.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa tagagamit na gumagamit ng pabalat na MySkin o Balat Ko */',
-'chick.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na Chick */',
-'simple.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng Payak na pabalat */',
 'modern.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng Modernong pabalat */',
 'vector.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na Vector */',
 'group-autoconfirmed.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na kusang natiyak lamang */',
@@ -3018,13 +2987,8 @@ Maaaring dahil ito sa isang kawing sa isang nakatalang hinarang dahil di-kinaisn
 'pageinfo-templates' => '{{PLURAL:$1|Suleras|Mga suleras}} ($1) na nasa transklusyon (kasama sa maraming mga lugar)',
 
 # Skin names
-'skinname-standard' => 'Klasiko',
-'skinname-nostalgia' => 'Nostalhiya',
 'skinname-cologneblue' => 'Bughaw na Kolown',
 'skinname-monobook' => 'MonoAklat ("isang aklat")',
-'skinname-myskin' => 'PabalatKo',
-'skinname-chick' => "\"Pambabae\" (''Chick'')",
-'skinname-simple' => 'Payak',
 'skinname-modern' => 'Makabago (Moderno)',
 'skinname-vector' => 'Vector',
 
@@ -3192,7 +3156,7 @@ Likas na nakatakdang itago ang iba pa.
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lapad',
 'exif-imagelength' => 'Taas',
 'exif-bitspersample' => 'Mga bit (piraso) ng bawat komponente (bahagi)',
@@ -3385,7 +3349,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Walang kompresyon',
 'exif-compression-2' => 'CCITT Pangkat 3 1-kodigo sa haba ng pagtakbo ng Pangdimensiyong Huffman na May Bahagyang Pagbabago',
 'exif-compression-3' => 'Kodigo ng Pangkat 3 ng CCITT',
@@ -3725,7 +3689,6 @@ Pakitiyak kung ibig mo talagang likhain muli ang pahinang ito.",
 'semicolon-separator' => ';&#32;',
 'comma-separator' => ',&#32;',
 'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
 'pipe-separator' => '&#32;|&#32;',
 'word-separator' => '&#32;',
 'ellipsis' => '...',
@@ -3896,7 +3859,6 @@ Maaari mo ring [[Special:EditWatchlist|gamitin ang pangkaraniwang pampatnugot]].
 'version-other' => 'Iba pa',
 'version-mediahandlers' => 'Mga tagahawak/tagapamahala ng midya',
 'version-hooks' => 'Mga pangkawit',
-'version-extension-functions' => 'Mga tungkuling pangkarugtong',
 'version-parser-extensiontags' => "Mga tatak ng banghay (''parser'')",
 'version-parser-function-hooks' => "Mga pangkawit ng/sa tungkuling pambanghay (''parser'')",
 'version-hook-name' => 'Pangalan ng pangkawit',
@@ -3918,13 +3880,6 @@ Dapat na nakatanggap ka ng [{{SERVER}}{{SCRIPTPATH}}/COPYING isang sipi ng Pangk
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Landas ng artikulo]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Landas ng panitik]',
 
-# Special:FilePath
-'filepath' => 'Lokasyon ng talaksan (file path)',
-'filepath-page' => 'Talaksan:',
-'filepath-submit' => 'Gawin',
-'filepath-summary' => 'Ibinabalik ng natatanging pahinang ito ang buong landas para sa isang talaksan.  
-Ipinapakita ang mga larawan sa buong kalinawan, tuwirang sinisimulan ang ibang uri ng mga talaksan sa pamamagitan ng kaugnay nilang mga programa.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Maghanap ng kaparehong mga talaksan',
 'fileduplicatesearch-summary' => "Maghanap ng mga kaparehong mga talaksan sa baba ng kanyang halaga ng ''hash''.",
diff --git a/languages/messages/MessagesTly.php b/languages/messages/MessagesTly.php
index 0e51ca55..5e73c119 100644
--- a/languages/messages/MessagesTly.php
+++ b/languages/messages/MessagesTly.php
@@ -340,7 +340,7 @@ $messages = array(
 'pool-timeout' => 'Че блоки чәш кардә вахт сәбе.',
 'pool-errorunknown' => 'Номәлумә сәһв',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Təsvir {{SITENAME}}',
 'aboutpage' => 'Project: Тәсвир',
 'copyrightpage' => '{{ns:project}}:Мыәллифә һуғуғ',
@@ -349,7 +349,6 @@ $messages = array(
 'disclaimers' => 'Çe məsuliyyətiku imtino.',
 'disclaimerpage' => 'Project:Дејни бә гиј ныгәтеј',
 'edithelp' => 'Арајиш бо редактә кардеј',
-'edithelppage' => 'Help:Арајиш бо сәрост кардеј',
 'helppage' => 'Help:Мындәриҹот',
 'mainpage' => 'Əsosə səhifə',
 'mainpage-description' => 'Әсосә сәһифә',
@@ -591,7 +590,6 @@ $messages = array(
 'searchmenu-legend' => 'Бо нәве кукон',
 'searchmenu-exists' => "'''Бы вики-нәхшәдә һесте сәһифә «[[:$1]]»'''",
 'searchmenu-new' => "'''Сәһифә офәјеј «[[:$1]]» бә ым вики-нахшәдә!'''",
-'searchhelp-url' => 'Help:Мындәриҹот',
 'searchprofile-articles' => 'Әсосә сәһифон',
 'searchprofile-project' => 'Че араијшон ијән нахшон сәһифон',
 'searchprofile-images' => 'Мултимедијә',
@@ -691,7 +689,6 @@ $messages = array(
 'recentchangeslinked' => 'Ангыл кардә быә дәгишон',
 'recentchangeslinked-toolbox' => 'Ангыл кардә быә дәгишон',
 'recentchangeslinked-title' => 'Ангыл кардә быә дәгишон бо "$1"',
-'recentchangeslinked-noresult' => 'Нишо доә быә мыддәтәдә, ангыл кардә быә сәһифонәдә дәгишон бәнин.',
 'recentchangeslinked-summary' => "Бә ым сәһифонәдә охонә дәгишон сијоһије, бә кон сәһифон сәбон вардә ын сәһифә (јаанки дахыл кардә быән бә нишо доә быә категоријә).
 [[Special:Watchlist|Шымә ноғо доә сијоһиәдә]] быә сәһифон, де '''ғалинә''' шрифти нишо доә быән.",
 'recentchangeslinked-page' => 'Сәһифә ном:',
@@ -745,8 +742,6 @@ $messages = array(
 # Statistics
 'statistics' => 'Статистика',
 
-'disambiguationspage' => 'Template:дәгиг кардеј',
-
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|бајт|бајтон}}',
 'nmembers' => '$1 {{PLURAL:$1|узв|узвон}}',
@@ -993,7 +988,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Һовужи',
 'exif-imagelength' => 'Былынди',
 'exif-source' => 'Сәвон',
@@ -1030,10 +1025,6 @@ $messages = array(
 'version-specialpages' => 'Хысусијә сәһифон',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath-page' => 'Фајл:',
-'filepath-submit' => 'Давард',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Нәве',
 
diff --git a/languages/messages/MessagesTn.php b/languages/messages/MessagesTn.php
index 14ac27e8..cebf739e 100644
--- a/languages/messages/MessagesTn.php
+++ b/languages/messages/MessagesTn.php
@@ -88,6 +88,9 @@ $messages = array(
 'viewsource' => 'Lebelela motswedi',
 
 # Login and logout pages
+'welcomecreation' => '== Amogelesega, $1! ==
+
+O ipuletse akhaonte. O seka wa lebala go fetola tse o di dikgatlhegelo tsa gago tsa {{SITENAME}}.',
 'yourname' => 'Leina la modirisi:',
 'yourpassword' => 'Selotlolo sa sephiri:',
 'yourpasswordagain' => 'Kwala selotlolo sa gago sa sephiri gape:',
diff --git a/languages/messages/MessagesTo.php b/languages/messages/MessagesTo.php
index 6f85d0f6..13293712 100644
--- a/languages/messages/MessagesTo.php
+++ b/languages/messages/MessagesTo.php
@@ -169,7 +169,7 @@ $messages = array(
 'jumptonavigation' => 'ʻai taumuʻa',
 'jumptosearch' => 'kumi',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Kau ki: {{SITENAME}}',
 'aboutpage' => 'Project:ʻo kau ki',
 'currentevents' => 'Ngaahi ongoongo',
@@ -254,7 +254,6 @@ Eke: $2",
 'editinginterface' => "'''Warning:''' You are editing a page which is used to provide interface text for the software.
 Changes to this page will affect the appearance of the user interface for other users.
 For translations, please consider using [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden' => '(ʻOku toi ʻa e fehuʻi SQL)',
 'namespaceprotected' => "ʻOku ʻikai ngofua ke ke fatu ʻa e ngaahi kupu ʻi he vā hingoa '''$1'''.",
 
 # Login and logout pages
@@ -628,10 +627,6 @@ Ko e ʻuhinga loka ko e $1 ia.",
 'statistics-header-users' => 'Sitesitesika ʻo e ʻetita',
 'statistics-mostpopular' => 'Ko e ngaahi peesi naʻe vakai ki ai lahi taha',
 
-'disambiguations' => 'Peesi fakaʻuhingakehe',
-'disambiguationspage' => 'Template:Fakaʻuhingakehe',
-'disambiguations-text' => "ʻOku ʻi ai haʻanau fehokotaki ki ha '''Peesi fakaʻuhingakehe''' maʻa e ngaahi kupu ʻoku ʻasi ʻi lalo. ʻE taau ʻo ʻenau fehokotaki ki he kupu totonu. ʻOku kau ʻa e kupu ki he peesi fakaʻuhingakehe kapau ʻoku ngāueʻaki ha sīpinga ʻoku ʻasi ʻi he  [[MediaWiki:Disambiguationspage]].",
-
 'doubleredirects' => 'Ngaahi leʻeleʻei',
 'doubleredirectstext' => 'ʻOku ʻasi ʻi he ʻotu kotoa pē ha ongo fehokotaki ki he leʻei, mo e leʻeleʻei, mo e kamataʻanga ʻo e leʻeleʻei, taimi ʻe niʻihi ko e peesi totonu ia, ʻoku taau ʻe tuhu ki ai ʻe he leʻei.',
 
@@ -761,7 +756,6 @@ Kapau ʻaho ʻe taha, te ke fietoʻo ʻa e pēsí mei hoʻo hokohoko leʻo, lomi
 'watchthispage' => 'Leʻo he pēsí ni',
 'unwatch' => 'Taʻeleʻo',
 'unwatchthispage' => 'Tuʻu he leʻo',
-'watchnochange' => 'ʻOku ʻikai ʻaupito ʻe fatuʻi hoʻo ngaahi kupu fakaleʻo lolotonga ha taimi ʻoku ʻasi mai.',
 'watchlist-details' => 'ʻOku leʻoʻi ʻa e peesi ʻe $1, ʻikai kau ki ai ʻa e ngaahi peesi alea.',
 'wlheader-enotif' => 'Kuo fakamafeiaʻi tala mei he tohila',
 'wlheader-showupdated' => '*Ko e ngaahi peesi kuo liliu talu he taimi hoʻo ʻaʻahi ki ai, ʻoku ʻasi mai fakasinolahi',
@@ -896,7 +890,6 @@ Vakai ki he [[Special:Log/delete|hokohoko tāmateʻi]] ki he lekooti ʻo e ngaah
 'ipb_already_blocked' => 'Kuo ʻosi taʻofi ʻa e "$1"',
 'ipb_cant_unblock' => 'Hala: naʻe ʻikai ʻilo ko e taʻofi fika $1. Mahalo pē kuo ʻosi ʻene taʻetaʻofi.',
 'ip_range_invalid' => 'ʻOku taʻeʻaonga ʻa e fakavā IP',
-'proxyblocksuccess' => 'Kuo fai.',
 
 # Developer tools
 'lockdb' => 'Lokaʻi ʻa e tānekingaʻilo',
@@ -1043,7 +1036,7 @@ Pea hoko ai pē hoʻo lava tānaki ha ʻuhinga ʻi he fakanounou',
 'metadata-expand' => 'Fano kiʻi meʻa',
 'metadata-collapse' => 'Holo kiʻi meʻa',
 
-# EXIF tags
+# Exif tags
 'exif-xresolution' => 'Auiiki fakalava',
 'exif-yresolution' => 'Auiiki tuʻutonu',
 'exif-jpeginterchangeformatlength' => 'ʻŪ valu meʻaʻilo JPEG',
@@ -1221,11 +1214,6 @@ Kātaki fakapapauʻi te ke fie toe fatu ʻa e kupu ni.",
 # Special:Version
 'version' => 'Paaki',
 
-# Special:FilePath
-'filepath' => 'Hala ki he faile',
-'filepath-page' => 'Faile:',
-'filepath-submit' => 'Ko e hala',
-
 # Special:SpecialPages
 'specialpages' => 'Ngaahi peesi makehe',
 
diff --git a/languages/messages/MessagesTpi.php b/languages/messages/MessagesTpi.php
index 55dd51a4..3906b888 100644
--- a/languages/messages/MessagesTpi.php
+++ b/languages/messages/MessagesTpi.php
@@ -80,9 +80,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Soim hamas yusa i lukautim pes',
 'tog-oldsig' => 'Olsem wanem yu raitim nem nau',
 'tog-fancysig' => 'Dispela rot yu raitim long nem stap wikitext (i no gat otomatik link)',
-'tog-externaleditor' => 'Yusim long ausait edita oltaim (tasol long man bilong save, i nidim sipesol setap antap long komputa bilong yu. [//www.mediawiki.org/wiki/Manual:External_editors Lukim moa infomesen.])',
-'tog-externaldiff' => 'Yusim long ausait diff oltaim (tasol long man bilong save, i nidim sipesol setap antap long komputa bilong yu. [//www.mediawiki.org/wiki/Manual:External_editors Lukim moa infomesen.])',
-'tog-showjumplinks' => ' Setap ol "Go stret long" links bilong helpim',
 'tog-uselivepreview' => 'Soim ol senis kwiktaim taim mi wokim (i nidim Javascript)',
 'tog-forceeditsummary' => 'Tokim mi long wanem taim raitim mi nating long liklik toksave bilong senis',
 'tog-watchlisthideown' => 'Haitim ol senis mi wokim long lukautbuk bilong mi',
@@ -236,7 +233,7 @@ $messages = array(
 'jumptonavigation' => 'ol bikpela pes',
 'jumptosearch' => 'painim',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Long {{SITENAME}}',
 'aboutpage' => 'Project:Long',
 'copyrightpage' => '{{ns:project}}:Ol laisens',
@@ -245,7 +242,6 @@ $messages = array(
 'disclaimers' => 'Ol toksave bilong lo',
 'disclaimerpage' => 'Project:Ol tok warn long lo',
 'edithelp' => 'Halivim mi long pasin bilong wokim senis',
-'edithelppage' => 'Help:Senisim',
 'mainpage' => 'Fran Pes',
 'mainpage-description' => 'Fran Pes',
 'portal' => 'Bung ples',
@@ -397,9 +393,6 @@ Na tu yu tok tru nau olsem yu raitim dispela yu yet, o yu kisim long wanpela hap
 'powersearch-toggleall' => 'Olgeta',
 'powersearch-togglenone' => 'I nogat wanpela',
 
-# Quickbar
-'qbsettings-none' => 'I nogat wanpela',
-
 # Preferences page
 'preferences' => 'Ol laik',
 'mypreferences' => 'Ol laik bilong mi',
@@ -643,7 +636,7 @@ Sapos yu laik rausim dispela pes long lukautbuk bilong yu bihain, paitim \"Pinis
 'unwatch' => 'Pinis long lukautim',
 'unwatchthispage' => 'Pinis long lukautim',
 'watchlist-details' => '$1 pes istap long lukautbuk (dispela namba i no kaunim ol pes bilong toktok).',
-'wlheader-showupdated' => "* Ol pes i senis pinis bihain long taim yu lukim ol igat nem i '''strongpela'''",
+'wlheader-showupdated' => "Ol pes i senis pinis bihain long taim yu lukim ol igat nem i '''strongpela'''",
 'wlshowlast' => 'Lukim dispela $1 aua $2 de $3',
 'watchlist-options' => 'Ol laik bilong Lukautbuk',
 
@@ -805,7 +798,7 @@ Yu inap lukim as tok bilong em',
 # Metadata
 'metadata' => 'Metadata',
 
-# EXIF tags
+# Exif tags
 'exif-imagedescription' => 'Nem bilong piksa',
 
 'exif-meteringmode-255' => 'Narapela',
@@ -858,10 +851,6 @@ Yu inap lukim as tok bilong em',
 'version-license' => 'Laisens',
 'version-poweredby-others' => 'ol narapela',
 
-# Special:FilePath
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Go',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Nem bilong fail:',
 'fileduplicatesearch-submit' => 'Painim',
diff --git a/languages/messages/MessagesTr.php b/languages/messages/MessagesTr.php
index 952005df..a32169b0 100644
--- a/languages/messages/MessagesTr.php
+++ b/languages/messages/MessagesTr.php
@@ -13,6 +13,7 @@
  * @author Bilalokms
  * @author Bombola
  * @author Cekli829
+ * @author Coolland
  * @author Dbl2010
  * @author Don Alessandro
  * @author Emperyan
@@ -21,6 +22,7 @@
  * @author Fryed-peach
  * @author Geitost
  * @author Goktr001
+ * @author Gorizon
  * @author Hanberke
  * @author Hcagri
  * @author Hedda Gabler
@@ -34,11 +36,13 @@
  * @author LuCKY
  * @author Mach
  * @author Manco Capac
+ * @author Meelo
  * @author Metal Militia
  * @author Mirzali
  * @author Mskyrider
  * @author Myildirim2007
  * @author Nazif İLBEK
+ * @author Nemo bis
  * @author Rapsar
  * @author Reedy
  * @author Runningfridgesrule
@@ -379,9 +383,6 @@ $messages = array(
 'tog-shownumberswatching' => 'İzleyen kullanıcı sayısını göster',
 'tog-oldsig' => 'Mevcut imza:',
 'tog-fancysig' => 'İmzaya vikimetin muamelesi yap (otomatik bir bağlantı olmadan)',
-'tog-externaleditor' => 'Varsayılan olarak harici düzenleyici kullan (deneyimli kullanıcılar içindir ve bilgisayarınızda özel ayarlar gerektirir. [//www.mediawiki.org/wiki/Manual:External_editors Ayrıntılı bilgi için tıklayın.])',
-'tog-externaldiff' => 'Varsayılan olarak harici karşılaştırıcı kullan (deneyimli kullanıcılar içindir ve bilgisayarınızda özel ayarlar gerektirir. [//www.mediawiki.org/wiki/Manual:External_editors Ayrıntılı bilgi için tıklayın.])',
-'tog-showjumplinks' => '"{{int:jumpto}}" erişilebilirlik bağlantısı etkinleştir',
 'tog-uselivepreview' => 'Canlı önizlemeyi kullan (deneysel)',
 'tog-forceeditsummary' => 'Özeti boş bıraktığımda beni uyar',
 'tog-watchlisthideown' => 'İzleme listemden düzenlemelerimi gizle',
@@ -395,6 +396,8 @@ $messages = array(
 'tog-showhiddencats' => 'Gizli kategorileri göster',
 'tog-noconvertlink' => 'Bağlantı başlığı dönüştürmesini devre dışı bırakma',
 'tog-norollbackdiff' => 'Geridönüş uygulandıktan sonra değişikliği atla',
+'tog-useeditwarning' => 'Kaydedilmemiş değişikliğe sahip bir değişiklik sayfasından çıkarken beni uyar',
+'tog-prefershttps' => 'Oturumu açarken her zaman güvenli bağlantı kullan',
 
 'underline-always' => 'Daima',
 'underline-never' => 'Asla',
@@ -458,6 +461,18 @@ $messages = array(
 'oct' => 'Eki',
 'nov' => 'Kas',
 'dec' => 'Ara',
+'january-date' => '$1 Ocak',
+'february-date' => '$1 Şubat',
+'march-date' => '$1 Mart',
+'april-date' => '$1 Nisan',
+'may-date' => '$1 Mayıs',
+'june-date' => '$1 Haziran',
+'july-date' => '$1 Temmuz',
+'august-date' => '$1 Ağustos',
+'september-date' => '$1 Eylül',
+'october-date' => '$1 Ekim',
+'november-date' => '$1 Kasım',
+'december-date' => '$1 Aralık',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriler}}',
@@ -539,6 +554,7 @@ $messages = array(
 'create-this-page' => 'Bu sayfayı oluştur',
 'delete' => 'Sil',
 'deletethispage' => 'Bu sayfayı sil',
+'undeletethispage' => 'Bu sayfanın silme işlemini geri al',
 'undelete_short' => '$1 değişikliği geri getir',
 'viewdeleted_short' => '{{PLURAL:$1|bir silinmiş değişiklik|$1 silinmiş değişiklikleri}} görüntüle.',
 'protect' => 'Korumaya al',
@@ -582,7 +598,7 @@ $1',
 'pool-queuefull' => 'Havuz sırası dolu',
 'pool-errorunknown' => 'Bilinmeyen hata',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} hakkında',
 'aboutpage' => 'Project:Hakkında',
 'copyright' => 'Aksi belirtilmedikçe içerik $1 altındadır.',
@@ -592,7 +608,6 @@ $1',
 'disclaimers' => 'Sorumluluk reddi',
 'disclaimerpage' => 'Project:Genel sorumluluk reddi',
 'edithelp' => 'Nasıl değiştirilir?',
-'edithelppage' => 'Help:Sayfa nasıl değiştirilir',
 'helppage' => 'Help:İçindekiler',
 'mainpage' => 'Ana Sayfa',
 'mainpage-description' => 'Ana sayfa',
@@ -670,16 +685,12 @@ Bu, {{SITENAME}} sitesindeki bir hatayı da belirtebilir.",
 # General errors
 'error' => 'Hata',
 'databaseerror' => 'Veritabanı hatası',
-'dberrortext' => 'Bir veritabanı sorgusu sözdizimi hatası oluştu.
-Bu yazılımdaki bir hatadan kaynaklanabilir.
-"<tt>$2</tt>" işlevinden denenen son sorgulama:
-<blockquote><tt>$1</tt></blockquote>.
-Veritabanının rapor ettiği hata "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Veritabanı sorgu sözdizimi hatası oluştu.
-Son yapılan veritabanı sorgusu:
-"$1"
-Kullanılan fonksiyon "$2".
-Veritabanının verdiği hata mesajı "$3: $4"',
+'databaseerror-text' => 'Bir veritabanı sorgu hatası oluştu.
+Bu yazılım bir hata gösteriyor olabilir.',
+'databaseerror-textcl' => 'Bir veritabanı sorgu hatası oluştu.',
+'databaseerror-query' => 'Sorgu: $1',
+'databaseerror-function' => 'Fonksiyon: $1',
+'databaseerror-error' => 'Hata: $1',
 'laggedslavemode' => 'Uyarı: Sayfa son güncellemeleri içermeyebilir.',
 'readonly' => 'Veritabanı kilitlendi',
 'enterlockreason' => 'Koruma için bir neden belirtin. Korumanın ne zaman kaldırılacağına dair tahmini bir tarih eklemeyi unutmayın.',
@@ -713,6 +724,7 @@ Başka bir kullanıcı tarafından silinmiş olabilir.',
 'cannotdelete-title' => '"$1" sayfasını silemezsiniz',
 'delete-hook-aborted' => 'Silme işlemi kanca tarafından durduruldu. 
 Hiçbir açıklama yapılmadı.',
+'no-null-revision' => '"$1" sayfası için yeni boş bir sürüm oluşturulamadı',
 'badtitle' => 'Geçersiz başlık',
 'badtitletext' => 'Girilen sayfa adı ya hatalı ya boş ya da diller arası bağlantı veya vikiler arası bağlantı içerdiğinden geçerli değil. Başlıklarda kullanılması yasak olan bir ya da daha çok karakter içeriyor olabilir.',
 'perfcached' => 'Aşağıdaki veriler önbellekten alınmıştır ve güncel olmayabilir. Önbellekte en fazla {{PLURAL:$1|bir sonuç|$1 sonuç}} mevcut.',
@@ -731,12 +743,15 @@ Lütfen birkaç dakika sonra yeniden deneyin.',
 'viewyourtext' => "Bu sayfaya '''yaptığınız değişikliklerin''' kaynağını görünteleyip kopyalayabilirsiniz:",
 'protectedinterface' => "Bu sayfa yazılım için arayüz metni sağlamaktadır ve kötüye kullanımı önlemek için korumaya alınmıştır. Eklemek ya da bütün vikilerdeki çevirileri değiştirmek için lütfen MediaWiki yerelleştirme projesi [//translatewiki.net/ translatewiki.net]'i kullanın.",
 'editinginterface' => "'''UYARI:''' Wiki yazılımı için arayüz sağlamakta kullanılan bir sayfayı değiştirmektesiniz. Bu sayfadaki değişiklikler kullanıcı arayüzünü diğer kullanıcılar için de değiştirecektir. Çeviriler için, lütfen [//translatewiki.net/wiki/Main_Page?setlang=tr translatewiki.net]'yi kullanarak MediaWiki yerelleştirme projesini dikkate alınız.",
-'sqlhidden' => '(SQL gizli sorgu)',
 'cascadeprotected' => 'Bu sayfa değişiklik yapılması engellenmiştir, çünkü  "kademeli" seçeneği aktif hale getirilerek koruma altına alınan {{PLURAL:$1|sayfada|sayfada}} kullanılmaktadır:
 $2',
 'namespaceprotected' => "'''$1''' alandındaki sayfaları düzenlemeye izniniz bulunmamaktadır.",
 'customcssprotected' => 'Bu sayfayı değiştirmeye yetkiniz bulunmamaktadır, çünkü bu sayfa başka bir kullanıcının kişisel ayarlarını içermektedir.',
 'customjsprotected' => 'Bu Java Script sayfasını değiştirmeye yetkiniz bulunmamaktadır, çünkü bu sayfa başka bir kullanıcının kişisel ayarlarını içermektedir.',
+'mycustomcssprotected' => 'Bu CSS sayfasını değiştirmeye yetkiniz yok.',
+'mycustomjsprotected' => 'Bu JavaScript sayfasını değiştirmeye yetkiniz yok.',
+'myprivateinfoprotected' => 'Sizin özel bilgilerinizi düzenleme yetkiniz yok.',
+'mypreferencesprotected' => 'Tercihlerinizi düzenlemek için yetkiniz yok.',
 'ns-specialprotected' => '{{ns:special}} alanadı içindeki sayfalar değiştirilemez.',
 'titleprotected' => "[[User:$1|$1]] tarafından oluşturulması engellenmesi için bu sayfa koruma altına alınmıştır.
 Verilen sebep: ''$2''.",
@@ -761,10 +776,19 @@ Tarayıcınızın önbelleğini temizleyinceye kadar bazı sayfalarda, oturumunu
 'welcomecreation-msg' => 'Hesabınız açıldı.
 [[Special:Preferences|{{SITENAME}} tercihlerinizi]] değiştirmeyi unutmayın.',
 'yourname' => 'Kullanıcı adı:',
+'userlogin-yourname' => 'Kullanıcı adı',
+'userlogin-yourname-ph' => 'Kullanıcı adı girin',
+'createacct-another-username-ph' => 'Kullanıcı adınızı girin',
 'yourpassword' => 'Parola:',
+'userlogin-yourpassword' => 'Parola',
+'userlogin-yourpassword-ph' => 'Parolanızı girin',
+'createacct-yourpassword-ph' => 'Bir parola girin',
 'yourpasswordagain' => 'Parolayı yeniden girin:',
+'createacct-yourpasswordagain' => 'Parolayı onayla',
+'createacct-yourpasswordagain-ph' => 'Parolayı yeniden girin',
 'remembermypassword' => 'Girişimi bu tarayıcıda hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)',
-'securelogin-stick-https' => "Giriş yaptıktan sonra HTTPS'e bağlı kal",
+'userlogin-remembermypassword' => 'Oturumumu sürekli açık tut',
+'userlogin-signwithsecure' => 'Güvenli bağlantı kullanın',
 'yourdomainname' => 'Alan adınız:',
 'password-change-forbidden' => 'Bu vikide parolanızı değiştiremezsiniz.',
 'externaldberror' => 'Ya doğrulama veritabanı hatası var ya da kullanıcı hesabınızı güncellemeye yetkiniz yok.',
@@ -776,18 +800,41 @@ Tarayıcınızın önbelleğini temizleyinceye kadar bazı sayfalarda, oturumunu
 'logout' => 'Oturumu kapat',
 'userlogout' => 'Oturumu kapat',
 'notloggedin' => 'Oturum açık değil',
+'userlogin-noaccount' => 'Bir hesabınız yok mu?',
+'userlogin-joinproject' => '{{SITENAME}} sitesine katılın',
 'nologin' => 'Bir hesabınız yok mu? $1.',
 'nologinlink' => 'Hesap oluşturun',
 'createaccount' => 'Hesap oluştur',
 'gotaccount' => 'Zaten bir hesabınız var mı? $1.',
 'gotaccountlink' => 'Oturum açın',
 'userlogin-resetlink' => 'Giriş bilgilerinizi mi unuttunuz?',
+'userlogin-resetpassword-link' => 'Parolanızı sıfırlayın',
+'helplogin-url' => 'Help:Oturum açma',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Oturum açma konusunda yardım alın]]',
+'createacct-join' => 'Aşağıya bilgilerinizi girin.',
+'createacct-another-join' => 'Aşağıya yeni hesabınızın bilgilerini girin.',
+'createacct-emailrequired' => 'E-posta adresi',
+'createacct-emailoptional' => 'E-posta adresi (isteğe bağlı)',
+'createacct-email-ph' => 'E-posta adresinizi girin',
+'createacct-another-email-ph' => 'E-posta adresinizi girin',
 'createaccountmail' => 'Geçici bir rastgele şifre kullanabilir ve bu şifreyi belirtilen e-posta adresine gönderebilirsiniz',
+'createacct-realname' => 'Gerçek adı (isteğe bağlı)',
 'createaccountreason' => 'Sebep:',
+'createacct-reason' => 'Gerekçe',
+'createacct-reason-ph' => 'Neden başka bir hesap oluşturuyorsunuz',
+'createacct-captcha' => 'Güvenlik kontrolü',
+'createacct-imgcaptcha-ph' => 'Yukarıda gördüğünüz metni girin',
+'createacct-submit' => 'Hesabınızı oluşturun',
+'createacct-another-submit' => 'Başka bir hesap oluşturun',
+'createacct-benefit-heading' => '{{SITENAME}} sizin gibi insanlar tarafından oluşturulur.',
+'createacct-benefit-body1' => '{{PLURAL:$1|düzenleme|düzenleme}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|sayfa|sayfa}}',
+'createacct-benefit-body3' => 'en son {{PLURAL:$1|katkıda bulunan|katkıda bulunan}}',
 'badretype' => 'Girdiğiniz şifreler birbirleriyle uyuşmuyor.',
 'userexists' => 'Girdiğiniz kullanıcı adı zaten kullanımda.
 Lütfen farklı bir kullanıcı adı seçiniz.',
 'loginerror' => 'Oturum açma hatası.',
+'createacct-error' => 'Hesap oluşturma hatası',
 'createaccounterror' => 'Hesap oluşturulamıyor: $1',
 'nocookiesnew' => 'Kullanıcı hesabı oluşturuldu ama oturum açamadınız.
 Oturum açmak için {{SITENAME}} çerezleri kullanır.
@@ -843,11 +890,13 @@ Siteye giriş yapmalı ve parolanızı değiştirmelisiniz.
 
 Eğer kullanıcı hesabını yanlışlıkla oluşturmuş iseniz, bu mesajı yoksayabilirsiniz.',
 'usernamehasherror' => 'Kullanıcı adı karma karakterler içeremez',
-'login-throttled' => 'Yakın zamanda çok fazla oturum açma denemesinde bulundunuz.
-Lütfen tekrar denemeden önce bekleyin.',
+'login-throttled' => 'Çok fazla yeni oturum açma girişiminde bulundunuz.
+Devam etmeden önce $1 bekleyin.',
 'login-abort-generic' => 'Girişiniz başarısız - iptal edilmiş',
 'loginlanguagelabel' => 'Dil: $1',
 'suspicious-userlogout' => 'Çıkış isteğiniz reddedildi çünkü bozuk bir tarayıcı ya da önbellekli vekil tarafından gönerilmiş gibi görünüyor.',
+'createacct-another-realname-tip' => 'Gerçek adınız isteğe bağlıdır.
+Eğer gerçek adınızı belirtirseniz, çalışmalarınıza atıfta bulunulması için de kullanılacaktır.',
 
 # Email sending
 'php-mail-error-unknown' => "PHP's mail() fonksiyonunda bilinmeyen hata",
@@ -864,8 +913,7 @@ Girişi bitirmek için, burada yeni bir parola yazın:',
 'newpassword' => 'Yeni parola',
 'retypenew' => 'Yeni parolayı tekrar girin',
 'resetpass_submit' => 'Şifreyi ayarlayın ve oturum açın',
-'resetpass_success' => 'Parolanız başarıyla değiştirildi! 
-Şimdi oturumunuz açılıyor...',
+'changepassword-success' => 'Parolanız başarıyla değiştirildi!',
 'resetpass_forbidden' => 'Parolalar değiştirilememektedir',
 'resetpass-no-info' => 'Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.',
 'resetpass-submit-loggedin' => 'Parolayı değiştir',
@@ -877,10 +925,11 @@ Girişi bitirmek için, burada yeni bir parola yazın:',
 
 # Special:PasswordReset
 'passwordreset' => 'Parola sıfırlama',
-'passwordreset-text' => 'Hesap bilgilerinizin e-posta ile hatırlatılması için bu formu doldurunuz.',
+'passwordreset-text-one' => 'Parolanızı sıfırlamak için bu formu doldurun.',
+'passwordreset-text-many' => '{{PLURAL:$1|Parolanızı sıfırlamak için alanlardan birini doldurun.}}',
 'passwordreset-legend' => 'Şifreyi sıfırla',
 'passwordreset-disabled' => 'Parola sıfırlamaları bu wiki üzerinde devre dışı bırakıldı.',
-'passwordreset-pretext' => '{{PLURAL:$1||Aşağıdaki verilerden birini girin}}',
+'passwordreset-emaildisabled' => "Bu wiki'deki e-posta özellikleri devre dışı bırakıldı.",
 'passwordreset-username' => 'Kullanıcı adı:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Sonuç e-postasını görüntüle?',
@@ -904,7 +953,7 @@ Bu geçici parola ile giriş yapın ve yeni bir şifre seçin. Bu talep bir baş
 Geçici şifre: $2',
 'passwordreset-emailsent' => 'Parola sıfırlama e-postası gönderildi.',
 'passwordreset-emailsent-capture' => 'Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası gönderildi.',
-'passwordreset-emailerror-capture' => 'Aşağıda gözüktüğü gibi bir hatırlatma e-postası oluşturulmuştur ancak $1 adlı kullanıcıya gönderilememiştir.',
+'passwordreset-emailerror-capture' => 'Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası oluşturuldu ancak {{GENDER:$2|kullanıcıya}} gönderme işlemi başarısız oldu: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-posta adresini değiştir',
@@ -918,6 +967,20 @@ Geçici şifre: $2',
 'changeemail-submit' => "E-posta'yı değiştir",
 'changeemail-cancel' => 'İptal',
 
+# Special:ResetTokens
+'resettokens' => 'Anahtarları sıfırla',
+'resettokens-text' => 'Burada hesabınızla ilişkili bazı özel verilere erişim izin anahtarları sıfırlayabilirsiniz.
+
+
+Siz yanlışlıkla bunları paylaştıysanız veya hesabınızda bir bozulma varsa bunu yapmalısınız.',
+'resettokens-no-tokens' => 'Sıfırlamak için hiç bir belirteç bulunmuyor.',
+'resettokens-legend' => 'Anahtarları sıfırla',
+'resettokens-tokens' => 'Belirteçler:',
+'resettokens-token-label' => '$1 (geçerli değer: $2)',
+'resettokens-watchlist-token' => '[[Special:Watchlist|İzleme listenizdeki sayfa değişiklikleri]] için web beslemeleri (Atom/RSS) anahtarı',
+'resettokens-done' => 'Belirteçler sıfırlandı.',
+'resettokens-resetbutton' => 'Seçili anahtarları sıfırla',
+
 # Edit page toolbar
 'bold_sample' => 'Kalın yazı',
 'bold_tip' => 'Kalın yazı',
@@ -1110,12 +1173,15 @@ Bir açıklama verilmedi.',
 Silinmiş görünüyor.',
 'edit-conflict' => 'Değişiklik çakışması.',
 'edit-no-change' => 'Değişikliğiniz yoksayıldı, çünkü metinde bir değişiklik yapılmadı.',
+'postedit-confirmation' => 'Değişikliğiniz kaydedildi.',
 'edit-already-exists' => 'Yeni sayfa oluşturulamıyor.
 Sayfa zaten mevcut.',
 'defaultmessagetext' => 'Varsayılan mesaj metni',
 'content-failed-to-parse' => '$1 modeli için $2 içerik türü çözümlenemedi: $3',
 'invalid-content-data' => 'Geçersiz içerik verisi',
 'content-not-allowed-here' => '"$1" içeriğine, [[$2]] sayfasında izin verilmemekte.',
+'editwarning-warning' => 'Bu sayfadan ayrılmak yaptığınız herhangi bir değişikliği kaybetmenize sebep olabilir.
+Eğer giriş yaptıysanız, bu uyarıyı, tercihlerinizin "Sayfa yazma alanı" bölümünde devre dışı bırakabilirsiniz.',
 
 # Content models
 'content-model-wikitext' => 'vikimetin',
@@ -1150,6 +1216,7 @@ Bu değişkenler atlandı.",
 'undo-failure' => 'Değişikliklerin çakışması nedeniyle geri alma işlemi başarısız oldu.',
 'undo-norev' => 'Değişiklik geri alınamaz çünkü ya silinmiş ya da varolmamaktadır.',
 'undo-summary' => '$1 değişikliği [[Special:Contributions/$2|$2]] ([[User talk:$2|mesaj]]) tarafından geri alındı.',
+'undo-summary-username-hidden' => 'Gizli bir kullanıcı tarafından $1 sürümü geri alınıyor',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Hesap açılamıyor',
@@ -1330,6 +1397,7 @@ Gezinti bağlantılarının bu sütunu sıfırlayacağını unutmayın.',
 'compareselectedversions' => 'Seçilen sürümleri karşılaştır',
 'showhideselectedversions' => 'Seçili sürümleri göster/gizle',
 'editundo' => 'geri al',
+'diff-empty' => '(Fark yok)',
 'diff-multi' => '({{PLURAL:$2|Bir kullanıcı|$2 kullanıcı}} tarafından yapılan {{PLURAL:$1|bir ara revizyon|$1 ara revizyon}} gösterilmiyor)',
 'diff-multi-manyusers' => '($2 kullancıdan fazla {{PLURAL:$2|kullanıcı|kullanıcı}} tarafından yapılan {{PLURAL:$1|bir ara revizyon|$1 ara revizyon}} gösterilmiyor)',
 
@@ -1353,7 +1421,6 @@ Gezinti bağlantılarının bu sütunu sıfırlayacağını unutmayın.',
 'searchmenu-legend' => 'Arama seçenekleri',
 'searchmenu-exists' => "'''Bu vikide \"[[:\$1]]\" adında bir sayfa mevcut'''",
 'searchmenu-new' => "'''Bu vikide \"[[:\$1]]\" sayfasını oluştur!'''",
-'searchhelp-url' => 'Help:İçindekiler',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bu ön ekle sayfalara göz at]]',
 'searchprofile-articles' => 'İçerik sayfaları',
 'searchprofile-project' => 'Yardım ve proje sayfaları',
@@ -1396,15 +1463,6 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 'search-external' => 'Dış arama',
 'searchdisabled' => '{{SITENAME}} sitesinde arama yapma geçici olarak durdurulmuştur. Bu arada Google kullanarak {{SITENAME}} içinde arama yapabilirsiniz. Arama sitelerinde dizinlerin biraz eski kalmış olabileceğini göz önünde bulundurunuz.',
 
-# Quickbar
-'qbsettings' => 'Hızlı erişim sütun ayarları',
-'qbsettings-none' => 'Hiçbiri',
-'qbsettings-fixedleft' => 'Sola sabitlendi',
-'qbsettings-fixedright' => 'Sağa sabitlendi',
-'qbsettings-floatingleft' => 'Sola yaslanıyor',
-'qbsettings-floatingright' => 'Sağa yaslanıyor',
-'qbsettings-directionality' => 'Sabit, dilinizin komut dosyasının yönüne bağlı',
-
 # Preferences page
 'preferences' => 'Tercihler',
 'mypreferences' => 'Tercihler',
@@ -1437,7 +1495,6 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 'resetprefs' => 'Ayarları ilk durumuna getir',
 'restoreprefs' => 'Tüm varsayılan ayarları geri yükle',
 'prefs-editing' => 'Sayfa yazma alanı',
-'prefs-edit-boxsize' => 'Değiştirme penceresinin boyutu.',
 'rows' => 'Satır',
 'columns' => 'Sütun',
 'searchresultshead' => 'Arama',
@@ -1448,9 +1505,7 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 'recentchangesdays-max' => '(en fazla $1 {{PLURAL:$1|gün|gün}})',
 'recentchangescount' => 'Varsayılan olarak gösterilecek değişiklik sayısı:',
 'prefs-help-recentchangescount' => 'Bu, son değişiklikleri, sayfa geçmişlerini ve günlükleri içerir.',
-'prefs-help-watchlist-token' => 'Bu alanı gizli bir anahtarla doldurmak, izleme listeniz için bir RSS beslemesi oluşturur.
-Bu alandaki anahtarı bilen herkes izleme listenizi okuyabilir, bu yüzden güvenli bir değer seçin.
-Kullanabileceğiniz rastgele-üretilmiş bir değer: $1',
+'prefs-help-watchlist-token2' => 'Bu izleme listenizin gizli anahtarıdır. Anahtarı bilen herkes izleme listenizi görebilir. Bu nedenle kimseyle paylaşmayın. [[Special:ResetTokens|Bu anahtarı sıfırlamak isterseniz buraya tıklayın]].',
 'savedprefs' => 'Tercihleriniz kaydedildi.',
 'timezonelegend' => 'Zaman dilimi:',
 'localtime' => 'Yerel saat:',
@@ -1480,7 +1535,6 @@ Kullanabileceğiniz rastgele-üretilmiş bir değer: $1',
 'prefs-common-css-js' => 'Tüm temalar için paylaşılan CSS/JS:',
 'prefs-reset-intro' => 'Bu sayfayı tercihlerinizi site varsayılanına döndürmek için kullanabilirsiniz. Bu geri alınamaz.',
 'prefs-emailconfirm-label' => 'E-posta doğrulaması:',
-'prefs-textboxsize' => 'Değiştirme penceresinin boyutu',
 'youremail' => 'E-posta:',
 'username' => '{{GENDER:$1|Kullanıcı adı}}:',
 'uid' => '{{GENDER:$1|Kullanıcı}} kimliği:',
@@ -1497,8 +1551,8 @@ Kullanabileceğiniz rastgele-üretilmiş bir değer: $1',
 $1 {{PLURAL:$1|karakterin|karakterin}} altında olmalı.',
 'yourgender' => 'Nasıl açıklamayı tercih edersiniz?',
 'gender-unknown' => 'Söylemek istemiyorsanız',
-'gender-male' => 'Wiki düzenlemelerinde erkek olarak',
-'gender-female' => 'Wiki düzenlemelerinde kadın olarak',
+'gender-male' => 'Viki sayfalarını erkek olarak düzenliyorum',
+'gender-female' => 'Viki sayfalarını kadın olarak düzenliyorum',
 'prefs-help-gender' => 'Bu tercih ayarı isteğe bağlıdır.
 Yazılımda söz değerlerinin başlarında bulunan cinsiyete uygun gramerler için kullanılır.
 Bu bilgiler herkes tarafından görülebilir.',
@@ -1514,6 +1568,8 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'prefs-dateformat' => 'Tarih biçemi',
 'prefs-timeoffset' => 'Saat farkı',
 'prefs-advancedediting' => 'Genel seçenekler',
+'prefs-editor' => 'Editör',
+'prefs-preview' => 'Önizleme',
 'prefs-advancedrc' => 'Gelişmiş seçenekler',
 'prefs-advancedrendering' => 'Gelişmiş seçenekler',
 'prefs-advancedsearchoptions' => 'Gelişmiş seçenekler',
@@ -1521,6 +1577,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'prefs-displayrc' => 'Görüntü seçenekleri',
 'prefs-displaysearchoptions' => 'Görüntüleme seçenekleri',
 'prefs-displaywatchlist' => 'Görüntüleme seçenekleri',
+'prefs-tokenwatchlist' => 'Anahtar',
 'prefs-diffs' => 'Farklar',
 
 # User preference: email validation using jQuery
@@ -1617,6 +1674,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'right-editusercssjs' => 'Diğer kullanıcıların CSS ve JS dosyalarında değişiklik yap',
 'right-editusercss' => 'Diğer kullanıcıların CSS dosyalarında değişiklik yap',
 'right-edituserjs' => 'Diğer kullanıcıların JS dosyalarında değişiklik yap',
+'right-editmyoptions' => 'tercihlerini düzenle',
 'right-rollback' => 'Belirli bir sayfayı değiştiren son kullanıcının değişikliklerini hızlıca geri döndür',
 'right-markbotedits' => 'Geri döndürülen değişiklikleri, bot değişiklikleri olarak işaretle',
 'right-noratelimit' => 'Derecelendirme sınırlamalarından etkilenme',
@@ -1678,12 +1736,17 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'action-userrights-interwiki' => 'diğer vikilerde kullanıcıların, kullanıcı haklarını değiştirmeye',
 'action-siteadmin' => 'veritabanını kilitleyip açmaya',
 'action-sendemail' => 'e-posta gönder',
+'action-editmywatchlist' => 'izleme listeni düzenle',
+'action-viewmywatchlist' => 'izleme listeni gör',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|değişiklik|değişiklik}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|son ziyaretten bu yana}}',
+'enhancedrc-history' => 'geçmiş',
 'recentchanges' => 'Son değişiklikler',
 'recentchanges-legend' => 'Son değişiklikler seçenekleri',
 'recentchanges-summary' => 'Yapılan en son değişiklikleri bu sayfadan izleyin.',
+'recentchanges-noresult' => 'Belirtilen kriterlere uyan herhangi bir değişiklik bulunamadı.',
 'recentchanges-feed-description' => "Bu beslemede, viki'de yapılan en son değişiklikleri takip edin.",
 'recentchanges-label-newpage' => 'Bu değişiklik yeni bir sayfa oluşturdu',
 'recentchanges-label-minor' => 'Bu küçük bir değişiklik',
@@ -1720,7 +1783,6 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'recentchangeslinked-feed' => 'İlgili değişiklikler',
 'recentchangeslinked-toolbox' => 'İlgili değişiklikler',
 'recentchangeslinked-title' => '"$1" ile ilişkili değişiklikler',
-'recentchangeslinked-noresult' => 'Verilen dönemde bağlantılı sayfalarda değişiklik yok.',
 'recentchangeslinked-summary' => "Aşağıdaki liste, belirtilen sayfaya (ya da belirtilen kategorinin üyelerine) bağlantı veren sayfalarda yapılan son değişikliklerin listesidir.
 [[Special:Watchlist|İzleme listenizdeki]] sayfalar '''kalın''' olarak belirtilmiştir.",
 'recentchangeslinked-page' => 'Sayfa adı:',
@@ -1732,7 +1794,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'reuploaddesc' => 'Yükleme formuna geri dön.',
 'upload-tryagain' => 'Değiştirilmiş dosya açıklamasını gönder',
 'uploadnologin' => 'Oturum açık değil',
-'uploadnologintext' => 'Dosya yükleyebilmek için [[Special:UserLogin|oturum aç]]manız gerekiyor.',
+'uploadnologintext' => 'Dosya yükleyebilmek için [[$1|oturum aç]]manız gerekiyor.',
 'upload_directory_missing' => 'Yükleme dizini ($1) kayıp ve websunucusu tarafından oluşturulamıyor.',
 'upload_directory_read_only' => 'Dosya yükleme dizinine ($1) web sunucusunun yazma izni yok.',
 'uploaderror' => 'Yükleme hatası',
@@ -1930,7 +1992,6 @@ En uygun güvenlik için, img_auth.php devre dışı bırakıldı.",
 'http-read-error' => 'HTTP okuma hatası.',
 'http-timed-out' => 'HTTP isteği zaman aşımına uğradı.',
 'http-curl-error' => 'URL alınırken hata: $1',
-'http-host-unreachable' => "URL'ye ulaşılamıyor.",
 'http-bad-status' => 'HTTP isteği sırasında bir sorun oluştu: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1962,6 +2023,9 @@ Kullanıcı tarafından filtrelendiğinde, sadece o kullanıcı dosyanın en son
 'listfiles_size' => 'Boyut (bayt)',
 'listfiles_description' => 'Tanım',
 'listfiles_count' => 'Sürümler',
+'listfiles-latestversion' => 'Geçerli sürüm',
+'listfiles-latestversion-yes' => 'Evet',
+'listfiles-latestversion-no' => 'Hayır',
 
 # File description page
 'file-anchor-link' => 'Dosya',
@@ -2052,6 +2116,11 @@ Dosya açıklamasını düzenlemek isterseniz, [$2 dosya açıklama sayfası] bu
 'randompage' => 'Rastgele sayfa',
 'randompage-nopages' => 'Şu {{PLURAL:$2|ad alanında|ad alanlarında}} hiç bir sayfa yok: $1.',
 
+# Random page in category
+'randomincategory' => 'Kategoriye göre rastgele sayfa',
+'randomincategory-selectcategory' => 'Rastgele sayfa alınacak kategori: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Getir',
+
 # Random redirect
 'randomredirect' => 'Rastgele yönlendirme',
 'randomredirect-nopages' => '"$1" ad alanında hiç bir yönlendirme yok.',
@@ -2077,10 +2146,6 @@ Dosya açıklamasını düzenlemek isterseniz, [$2 dosya açıklama sayfası] bu
 'statistics-users-active-desc' => 'Son {{PLURAL:$1|gün|$1 günde}} çalışma yapan kullanıcılar',
 'statistics-mostpopular' => 'En çok ziyaret edilen sayfalar',
 
-'disambiguations' => 'Anlam ayrım sayfalarına bağlantısı olan sayfalar',
-'disambiguationspage' => 'Template:Anlam ayrımı',
-'disambiguations-text' => 'İlk satırda yer alan sayfalar bir anlam ayrım sayfasına iç bağlantı olduğunu gösterir. İkinci sırada yer alan sayfalar anlam ayrım sayfalarını gösterir. <br />Burada [[MediaWiki:Disambiguationspage]] tüm anlam ayrım şablonlarına bağlantılar verilmesi gerekmektedir.',
-
 'pageswithprop' => 'Bir sayfa özelliğine sahip sayfalar',
 'pageswithprop-text' => 'Bu sayfa belirli bir sayfa özelliğini kullanan sayfaları listeler.',
 'pageswithprop-submit' => 'Git',
@@ -2326,10 +2391,9 @@ Bundan sonra, bu sayfaya ve ilgili tartışma sayfasına yapılacak değişiklik
 'unwatchthispage' => 'Sayfa izlemeyi durdur',
 'notanarticle' => 'İçerik sayfası değil',
 'notvisiblerev' => 'Revizyon silinmiş',
-'watchnochange' => 'İzleme listenizdeki sayfaların hiçbiri, gösterilen zaman aralığında güncellenmemiş.',
 'watchlist-details' => 'Tartışma sayfaları hariç {{PLURAL:$1|$1 sayfa|$1 sayfa}} izleme listenizdedir.',
-'wlheader-enotif' => '* E-posta bildirimi etkin.',
-'wlheader-showupdated' => "* Son ziyaretinizden sonraki sayfa değişiklikleri '''kalın yazıyla''' gösterilmiştir.",
+'wlheader-enotif' => 'E-posta bildirimi etkin.',
+'wlheader-showupdated' => "Son ziyaretinizden sonraki sayfa değişiklikleri '''kalın yazıyla''' gösterilmiştir.",
 'watchmethod-recent' => 'izlediğiniz sayfalarda yapılan son değişiklikler kontrol ediliyor',
 'watchmethod-list' => 'izlediğiniz sayfalarda yapılan son değişiklikler kontrol ediliyor',
 'watchlistcontains' => 'İzleme listenizde $1 tane {{PLURAL:$1|sayfa|sayfa}} var.',
@@ -2726,12 +2790,9 @@ Engelleme kaldırılmış olabilir.',
 Ancak, bu adres $2 aralığının parçası olarak engellenmiş, aralık engellemesini kaldırabilirsiniz.',
 'ip_range_invalid' => 'Geçersiz IP aralığı.',
 'ip_range_toolarge' => '/$1 bloktan daha büyük aralık bloklarına izin verilmez.',
-'blockme' => 'Beni engelle',
 'proxyblocker' => 'Proxy engelleyici',
-'proxyblocker-disabled' => 'Bu işlev devre dışı bırakıldı.',
 'proxyblockreason' => 'IP adresiniz açık bir proxy olduğu için engellendi.
 Lütfen İnternet sevis sağlayınız ile ya da teknik destek ile irtibat kurun ve bu ciddi güvenlik probleminden haberdar edin.',
-'proxyblocksuccess' => 'Tamamlanmıştır.',
 'sorbsreason' => "IP adresiniz, {{SITENAME}} sitesi tarafından kullanılan DNSBL'de açık proxy olarak listelenmiş.",
 'sorbs_create_account_reason' => "IP adresiniz {{SITENAME}} sitesi tarafından kullanılan DNSBL'de açık proxy olarak listelenmiş.
 Hesap oluşturamazsınız",
@@ -3099,10 +3160,6 @@ Geçici dosya kayıp.',
 'pageinfo-category-files' => 'Dosya sayısı',
 
 # Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostaljik',
-'skinname-chick' => 'Şık',
-'skinname-simple' => 'Basit',
 'skinname-modern' => 'Modern',
 
 # Patrolling
@@ -3180,11 +3237,25 @@ Bunu çalıştırmak, sisteminizi tehlikeye atabilir.",
 'minutes' => '{{PLURAL:$1|$1 dakika|$1 dakika}}',
 'hours' => '{{PLURAL:$1|$1 saat|$1 saat}}',
 'days' => '{{PLURAL:$1|$1 gün|$1 gün}}',
+'weeks' => '{{PLURAL: $1|$1 hafta|$1 hafta}}',
 'months' => '{{PLURAL:$1|$1 ay|$1 ay}}',
 'years' => '{{PLURAL:$1|$1 yıl|$1 yıl}}',
 'ago' => '$1 önce',
 'just-now' => 'Hemen şimdi',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|saat|saat}} önce',
+'minutes-ago' => '$1 {{PLURAL:$1|dakika|dakika}} önce',
+'seconds-ago' => '$1 {{PLURAL:$1|saniye|saniye}} önce',
+'monday-at' => '$1 Pazartesi günü',
+'tuesday-at' => '$1 Salı günü',
+'wednesday-at' => '$1 Çarşamba günü',
+'thursday-at' => '$1 Perşembe günü',
+'friday-at' => '$1 Cuma günü',
+'saturday-at' => '$1 Cumartesi günü',
+'sunday-at' => '$1 Pazar günü',
+'yesterday-at' => '$1 dün itibariyle',
+
 # Bad image list
 'bad_image_list' => 'Biçim aşağıdaki gibidir:
 
@@ -3216,7 +3287,7 @@ Diğerleri varsayılan olarak gizlenecektir.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Genişlik',
 'exif-imagelength' => 'Yükseklik',
 'exif-bitspersample' => 'Bits per component',
@@ -3382,7 +3453,7 @@ Diğerleri varsayılan olarak gizlenecektir.
 'exif-originalimageheight' => 'Resmin kırpılmadan önceki yükseliği',
 'exif-originalimagewidth' => 'Resmin kırpılmadan önceki genişliği',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sıkıştırılmamış',
 'exif-compression-6' => 'JPEG',
 
@@ -3795,7 +3866,6 @@ Ayrıca [[Special:EditWatchlist|standart düzenleme sayfasını]] da kullanabili
 'version-other' => 'Diğer',
 'version-mediahandlers' => 'Ortam işleyiciler',
 'version-hooks' => 'Çengeller',
-'version-extension-functions' => 'Ek fonksiyonları',
 'version-parser-extensiontags' => 'Derleyici eklenti etiketleri',
 'version-parser-function-hooks' => 'Derleyici fonksiyon çengelleri',
 'version-hook-name' => 'Çengel adı',
@@ -3816,12 +3886,15 @@ Bu programla birlikte [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU Genel Kamu Lisansın
 'version-entrypoints-header-entrypoint' => 'Giriş noktası',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Dosyanın konumu',
-'filepath-page' => 'Dosya adı:',
-'filepath-submit' => 'Git',
-'filepath-summary' => 'Bu özel sayfa bir dosya için tam yolu getirir.
-Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili programlarıyla doğrudan başlatılır.',
+# Special:Redirect
+'redirect' => 'Dosya, kullanıcı veya sayfa ID yönlendirme',
+'redirect-legend' => 'Bir dosya veya sayfaya yönlendirme',
+'redirect-summary' => "Bu özel sayfa sizi bir dosya (dosya adı verilen), bir sayfa (bir revizyon ID'si verilen) veya bir kullanıcı sayfasının (sayısal kullanıcı kimliği verilen) adresine yönlendirir.",
+'redirect-submit' => 'Git',
+'redirect-value' => 'Değer:',
+'redirect-user' => 'Kullanıcı kimliği',
+'redirect-file' => 'Dosya adı',
+'redirect-not-exists' => 'Değer bulunamadı',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Benzer dosyaları ara',
@@ -3876,7 +3949,10 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'tags-tag' => 'Etiket adı',
 'tags-display-header' => 'Değişiklik listelerindeki görünüm',
 'tags-description-header' => 'Anlamının tam açıklaması',
+'tags-active-header' => 'Etkin?',
 'tags-hitcount-header' => 'Etiketli değişiklikler',
+'tags-active-yes' => 'Evet',
+'tags-active-no' => 'Hayır',
 'tags-edit' => 'değiştir',
 'tags-hitcount' => '$1 {{PLURAL:$1|değişiklik|değişiklik}}',
 
@@ -3912,6 +3988,8 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'htmlform-submit' => 'Gönder',
 'htmlform-reset' => 'Değişiklikleri geri al',
 'htmlform-selectorother-other' => 'Diğer',
+'htmlform-no' => 'Hayır',
+'htmlform-yes' => 'Evet',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 tam-metin arama desteği ile',
@@ -4007,4 +4085,17 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'duration-centuries' => '$1 {{PLURAL:$1|yüzyıl|yüzyıl}}',
 'duration-millennia' => '$1 {{PLURAL:$1|bin yıl|bin yıl}}',
 
+# Limit report
+'limitreport-title' => 'Ayrıştırıcı profil verileri:',
+'limitreport-cputime' => 'CPU süresi kullanımı',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|saniye|saniye}}',
+'limitreport-walltime' => 'Gerçek süre kullanımı',
+'limitreport-ppvisitednodes' => 'Önişlemci düğümü ziyaret sayısı',
+'limitreport-ppgeneratednodes' => 'Önişlemcinin ürettiği düğüm sayısı',
+'limitreport-postexpandincludesize' => 'Gönderi genişliği boyutu dahil',
+'limitreport-postexpandincludesize-value' => '$1/$2 bayt',
+'limitreport-templateargumentsize' => 'Şablon değişkeni boyutu',
+'limitreport-expansiondepth' => 'En yüksek genişleme derinliği',
+'limitreport-expensivefunctioncount' => 'Daha fazla ayrıştırıcı işlev sayısı',
+
 );
diff --git a/languages/messages/MessagesTru.php b/languages/messages/MessagesTru.php
index c396d495..5dd30114 100644
--- a/languages/messages/MessagesTru.php
+++ b/languages/messages/MessagesTru.php
@@ -158,7 +158,7 @@ $messages = array(
 'jumptosearch' => 'Kruxyo',
 'pool-errorunknown' => 'Fawdo nuxroyo',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '3al {{SITENAME}}',
 'aboutpage' => 'Project: 3al',
 'copyrightpage' => '{{ns:project}}:Ḥaqat duKaṭowo',
@@ -167,7 +167,6 @@ $messages = array(
 'disclaimers' => 'Disclaimers',
 'disclaimerpage' => 'Project: Disclaimer gawonoyo',
 'edithelp' => 'Editing help',
-'edithelppage' => 'Help:Mşaḥlaf',
 'helppage' => 'Help: Ḥbişoṭo',
 'mainpage' => 'Faṭo rişoyto',
 'mainpage-description' => 'Faṭo rişoyto',
@@ -400,7 +399,6 @@ Legend: '''({{int:cur}})''' = difference with latest revision, '''({{int:last}})
 'searchmenu-legend' => '3ayar duKruxyo',
 'searchmenu-exists' => "'''Kito Faṭo herke Işma \"[[:\$1]]\"yo'''",
 'searchmenu-new' => 'Kṭaw iFaṭaṭe "[[:$1]]" buWiki.',
-'searchhelp-url' => 'Help: Ḥbişoṭo',
 'searchprofile-articles' => 'Faṭoṭe daḤbişoṭo',
 'searchprofile-project' => 'Faṭoṭe du3udrono u daProjat',
 'searchprofile-images' => 'Multimediya',
@@ -504,7 +502,6 @@ Legend: '''({{int:cur}})''' = difference with latest revision, '''({{int:last}})
 'recentchangeslinked' => 'Şuḥlofe bFaṭoṭe masre',
 'recentchangeslinked-toolbox' => 'Şuḥlofe bFaṭoṭe masre',
 'recentchangeslinked-title' => 'Şuḥlofe bFaṭoṭe dkıtne masre b$1',
-'recentchangeslinked-noresult' => 'No changes on linked pages during the given period.',
 'recentchangeslinked-summary' => "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).
 Pages on [[Special:Watchlist|your watchlist]] are '''bold'''.",
 'recentchangeslinked-page' => 'Işmo diFaṭo',
@@ -543,8 +540,6 @@ The description on its [$2 file description page] there is shown below.',
 # Statistics
 'statistics' => 'Mardonwoṭo',
 
-'disambiguationspage' => 'Template:disambig',
-
 'brokenredirects-edit' => 'mşaḥlaf',
 'brokenredirects-delete' => 'slag',
 
@@ -802,7 +797,7 @@ Others will be hidden by default.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-writer' => 'Kaṭowo',
 'exif-languagecode' => 'Leşono',
 'exif-cameraownername' => 'uMoro diQamera',
@@ -824,9 +819,6 @@ Others will be hidden by default.
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'Warning:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
 
-# Special:FilePath
-'filepath-submit' => 'Zux',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Krax',
 
diff --git a/languages/messages/MessagesTs.php b/languages/messages/MessagesTs.php
index a1ad946d..a468b680 100644
--- a/languages/messages/MessagesTs.php
+++ b/languages/messages/MessagesTs.php
@@ -38,8 +38,6 @@ $messages = array(
 'tog-enotifminoredits' => 'ndzurhumele e-mail loko ku endleka mindzulamiso leyi ntsongo',
 'tog-enotifrevealaddr' => 'Paluxa e-mail yamina eka mapapila lawa ndzimarhumelaka',
 'tog-shownumberswatching' => 'Komba ntsengo wa vatirhisi lava hlaleleke tluka',
-'tog-externaleditor' => 'Tirhisa xilulamisi xalehandle hikukongoma (Nhlawulo lowu i wavatirhisi lavangani ntokoto ntsena, wu lava ku cinca kokarhi eka khompuyuta yawena. [//www.mediawiki.org/wiki/Manual:External_editors vuxokoxoko hi mhakaleyi.])',
-'tog-externaldiff' => 'Tirhisa phurogiremi yalehandle hikukongoma (Nhlawulo lowu i wavatirhisi lavangani ntokoto ntsena, wu lava ku cinca kokarhi eka khompuyuta yawena. [//www.mediawiki.org/wiki/Manual:External_editors vuxokoxoko hi mhakaleyi.])',
 'tog-forceeditsummary' => 'Ndzivutisisi loko ndzinga hoxi nkomiso wa ndzulamiso lowu ndzi wu endleke',
 'tog-watchlisthideown' => 'Tumbeta mindzulamiso ya mina eka leswi ndzi swi languteke',
 'tog-watchlisthidebots' => 'Tumbeta mindzulamiso ya rhobhoti eka leswi ndzi swi languteke',
@@ -216,7 +214,7 @@ $messages = array(
 'jumptosearch' => 'Lava',
 'pool-errorunknown' => 'xiphiqo xoka xingativeki',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'ta {{SITENAME}}',
 'aboutpage' => 'Project:ta',
 'copyright' => 'Matsalwa makumeka ehansi ka $1.',
@@ -226,7 +224,6 @@ $messages = array(
 'disclaimers' => 'Swi alanandzu',
 'disclaimerpage' => 'Project:Swithsuxa nadzu hikuangara',
 'edithelp' => 'Mpfuno hi ta mindzulamiso',
-'edithelppage' => 'Help:Mindzulamiso',
 'helppage' => 'Help:Leswinga ndzeni',
 'mainpage' => 'Tlukankulu',
 'mainpage-description' => 'Tluka-Nkulu',
@@ -300,17 +297,6 @@ Vona nxaxamelo wa ma tluka yo hlawuleka e [[Special:SpecialPages|{{int:specialpa
 # General errors
 'error' => 'Xihoxo',
 'databaseerror' => 'Xihoxo xo Database',
-'dberrortext' => 'A database query syntax error has occurred.
-This may indicate a bug in the software.
-The last attempted database query was:
-<blockquote><tt>$1</tt></blockquote>
-from within function "<tt>$2</tt>".
-MySQL returned error "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'A database query syntax error has occurred.
-The last attempted database query was:
-"$1"
-from within function "$2".
-MySQL returned error "$3: $4"',
 'laggedslavemode' => 'Warning: Page may not contain recent updates.',
 'readonly' => 'Database locked',
 'enterlockreason' => 'Enter a reason for the lock, including an estimate of when the lock will be released',
@@ -514,7 +500,6 @@ Swihlamuseri: '''({{int:sweswi}})''' = kuhambana na ndzulamiso wa sweswinyana, '
 'viewprevnext' => 'Vona ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Tluka leri vuriwaka \"[[:\$1]]\" ikhale ririkona eka wiki leyi.'''",
 'searchmenu-new' => "'''Tumbuluxa tluka ra \"[[:\$1]]\" eka wiki leyi!'''",
-'searchhelp-url' => 'Help:Leswinga ndzeni',
 'searchprofile-articles' => 'Matluka lama tsariweke',
 'searchprofile-project' => 'Mpfuno na matluka ya phurojeki',
 'searchprofile-images' => 'Tifayili ta mfpumawulo na swifaniso',
@@ -612,7 +597,6 @@ Adiresi ya wena ya e-mail yitunberile loko van'wana va bula na wena.",
 'recentchangeslinked-feed' => 'Kuncica loku yelanaka',
 'recentchangeslinked-toolbox' => 'Kuncica loku yelanaka',
 'recentchangeslinked-title' => 'Kucinca loku yelanaka na "$1"',
-'recentchangeslinked-noresult' => 'Kuhava mindzulamiso eka matluka lawa eka nkarhi lowu langiweke',
 'recentchangeslinked-summary' => "Lowu inxaxamelo wa kucinca kasweswinyana loku endliweke eka matluka la ma khwekelaka eka tluka leri u rilavaka (kumbe yinw'ana ya mitlawa leyi yelanaka).Matluka lawa [[Special:Watchlist|umalanguteke]] ma '''bumburisiwile'''.",
 'recentchangeslinked-page' => 'Vito ratluka:',
 'recentchangeslinked-to' => 'Komba kucinca eka matluka lama khwekelaka eka tluka leri ntsena',
@@ -658,8 +642,6 @@ Nhlamuselo ya yona leyi nge ndzeni ka [$2 tluka ro hlamusela] hi yona leyi kombi
 # Statistics
 'statistics' => 'Mintsengo',
 
-'disambiguationspage' => 'Template:Hambanisa marito',
-
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|wa bayiti|wa tibayit}}',
 'nmembers' => '$1 {{PLURAL:$1|museketeri| wa vaseketeri}}',
diff --git a/languages/messages/MessagesTt_cyrl.php b/languages/messages/MessagesTt_cyrl.php
index 8aa4c4e9..479dea83 100644
--- a/languages/messages/MessagesTt_cyrl.php
+++ b/languages/messages/MessagesTt_cyrl.php
@@ -240,9 +240,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Битне күзәтү исемлекләренә өстәгән кулланучылар санын күрсәтелсен',
 'tog-oldsig' => 'Хәзерге имза:',
 'tog-fancysig' => 'Имзаның шәхси вики-билгеләмәсе (автоматик сылтамасыз)',
-'tog-externaleditor' => 'Тышкы редактор куллану (бары тик белгечләргә генә һәм санак махсус көйләнгән булу зарур; [//www.mediawiki.org/wiki/Manual:External_editors тулырак...])',
-'tog-externaldiff' => 'Тышкы версия чагыштыру программасын куллану (бары тик белгечләр өчен һшм санак махсус көйләнгән булу зарур; [//www.mediawiki.org/wiki/Manual:External_editors тулырак...])',
-'tog-showjumplinks' => '«Күчү» ярдәмче сылтамалары ялгансын',
 'tog-uselivepreview' => 'Тиз карап алу кулланылсын (JavaScript, эксперименталь)',
 'tog-forceeditsummary' => 'Үзгәртүләрне тасвирлау юлы тутырылмаган булса, кисәтү',
 'tog-watchlisthideown' => 'Минем үзгәртүләрем күзәтү исемлегеннән яшерелсен',
@@ -255,6 +252,7 @@ $messages = array(
 'tog-diffonly' => 'Юрама чагыштыру астында бит эчтәлеге күрсәтелмәсен',
 'tog-showhiddencats' => 'Яшерен төркемнәр күрсәтелсен',
 'tog-norollbackdiff' => 'Кире кайтару ясагач юрамалар аермасы күрсәтелмәсен',
+'tog-useeditwarning' => 'Битне сакламыйча китү вакытында мине кисәтергә',
 
 'underline-always' => 'Һәрвакыт',
 'underline-never' => 'Бервакытта да',
@@ -318,6 +316,18 @@ $messages = array(
 'oct' => 'окт',
 'nov' => 'ноя',
 'dec' => 'дек',
+'january-date' => '$1 Гыйнвар',
+'february-date' => '$1 Февраль',
+'march-date' => '$1 Март',
+'april-date' => '$1 Апрель',
+'may-date' => '$1 Май',
+'june-date' => '$1 Июнь',
+'july-date' => '$1 Июль',
+'august-date' => '$1 Август',
+'september-date' => '$1 Сентябрь',
+'october-date' => '$1 Октябрь',
+'november-date' => '$1 Ноябрь',
+'december-date' => '$1 Декабрь',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Төркем|Төркемнәр}}',
@@ -338,7 +348,7 @@ $messages = array(
 'noindex-category' => 'Индексланмаган битләр',
 'broken-file-category' => 'Файлларга эшләми торган сылтамалар булган битләр',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Тасвирлама',
 'article' => 'Мәкалә',
@@ -400,6 +410,7 @@ $messages = array(
 'create-this-page' => 'Бу битне төзү',
 'delete' => 'Бетерү',
 'deletethispage' => 'Бу битне бетерү',
+'undeletethispage' => 'Бу битне кайтарырга',
 'undelete_short' => '$1 {{PLURAL:$1|үзгәртмәне}} торгызу',
 'viewdeleted_short' => '{{PLURAL:$1|1 бетерелгән үзгәртүне|$1 бетерелгән үзгәртүне}} карау',
 'protect' => 'Яклау',
@@ -443,7 +454,7 @@ $1',
 'pool-queuefull' => 'Сорауларны саклау  бите тулы',
 'pool-errorunknown' => 'Билгесез  хата',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} турында',
 'aboutpage' => 'Project:Тасвирлама',
 'copyright' => 'Мәгълүмат $1 буенча таратыла.',
@@ -453,7 +464,6 @@ $1',
 'disclaimers' => 'Җаваплылыктан баш тарту',
 'disclaimerpage' => 'Project:Җаваплылыктан баш тарту',
 'edithelp' => 'Үзгәртү буенча ярдәм',
-'edithelppage' => 'Help:Үзгәртү',
 'helppage' => 'Help:Эчтәлек',
 'mainpage' => 'Баш бит',
 'mainpage-description' => 'Баш бит',
@@ -483,7 +493,6 @@ $1',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|соңгы үзгәртү|соңгы үзгәртүләр}}',
 'youhavenewmessagesmulti' => 'Сезгә монда яңа хәбәрләр бар: $1',
 'editsection' => 'үзгәртү',
-'editsection-brackets' => '[$1]',
 'editold' => 'үзгәртү',
 'viewsourceold' => 'башлангыч кодны карау',
 'editlink' => 'үзгәртү',
@@ -535,17 +544,6 @@ $1',
 # General errors
 'error' => 'Хата',
 'databaseerror' => 'Мәгълүматлар базасында хата',
-'dberrortext' => 'Мәгълүматлар базасына җибәрелгән сорауда синтаксис хатасы табылды.
-Программада хата булырга мөмкин.
-Мәгълүматлар базасына җибәрелгән соңгы сорау:
-<blockquote><tt>$1</tt></blockquote>
-<tt>«$2»</tt> функциясеннән.
-База <tt>«$3: $4»</tt> хатасын кайтарды.',
-'dberrortextcl' => 'Мәгълүматлар базасына җибәрелгән сорауда синтаксик хата табылды.
-Мәгълүматлар базасына җибәрелгән соңгы сорау:
-"$1"
-«$2» функциясеннән.
-База «$3: $4» хатасын кайтарды.',
 'laggedslavemode' => 'Игътибар: биттә соңгы яңартулар күрсәтелмәгән булырга мөмкин.',
 'readonly' => 'Мәгълүматлар базасына язу ябылган',
 'enterlockreason' => 'Ябылу сәбәбен һәм вакытын күрсәтегез.',
@@ -595,12 +593,13 @@ $1',
 'viewyourtext' => "Сез '''үз төзәтмәләрегезне''' бу сәхифәдә карый һәм чыгарылма текстны күчермәли аласыз:",
 'protectedinterface' => 'Бу биттә программа тәэминатының интерфейс хәбәрләре бар. Вандализмга каршы көрәш сәбәпле, бу битне үзгәртү тыела. Әлеге хәбәрнең тәрҗемәсен өстәү яки үзгәртү өчен, зинһар өчен, MediaWiki [//translatewiki.net/ translatewiki.net] тәрҗемәләү сайтын кулланыгыз.',
 'editinginterface' => "'''Игътибар:''' Сез программа тәэминатының интерфейс тексты булган битне үзгәртәсез. Бу башка кулланучыларга да тәэсир итәчәк. Тәрҗемә өчен [//translatewiki.net/wiki/Main_Page?setlang=tt-cyrl translatewiki.net] локализацияләү проектын кулланыгыз.",
-'sqlhidden' => '(SQL-сорау яшерелгән)',
 'cascadeprotected' => 'Бу бит үзгәртүләрдән сакланган, чөнки ул каскадлы саклау кабул ителгән {{PLURAL:$1|биткә|битләргә}} өстәлгән:
 $2',
 'namespaceprotected' => "'''$1''' исем киңлегендәге битләрне үзгәртү өчен сезнең рөхсәтегез юк.",
 'customcssprotected' => 'Сез бу CSS-сәхифәне үзгәртә алмыйсыз, чөнки монда башка кулланучының шәхси көйләнмәләре саклана',
 'customjsprotected' => 'Сез бу JavaScript-сәхифәне үзгәртә алмыйсыз, чөнк монда башка кулланучының шәхси көйләнмәләре саклана',
+'mycustomcssprotected' => 'Сезнең әлеге CSS битен үзгәртергә хокукыгыз юк.',
+'mycustomjsprotected' => 'Сезнең биттә JavaScript үзгәртергә хокукларыгыз юк.',
 'ns-specialprotected' => 'Махсус битләрне үзгәртеп булмый.',
 'titleprotected' => "Бу исем белән бит ясау [[User:$1|$1]] тарафыннан тыелган.
 Ул күрсәткән сәбәп: ''$2''.",
@@ -617,10 +616,19 @@ $2',
 Кайбер битләр Сез кергән кебек күрсәтелергә мөмкин. Моны бетерү өчен браузер кэшын чистартыгыз.",
 'welcomeuser' => 'Хуш килдегез, $1!',
 'yourname' => 'Кулланучы исеме:',
+'userlogin-yourname' => 'Кулланучы исеме',
+'userlogin-yourname-ph' => 'Хисап язмасының исемен кертегез',
+'createacct-another-username-ph' => 'Хисап язмасының исемен кертегез',
 'yourpassword' => 'Серсүз:',
+'userlogin-yourpassword' => 'Серсүз',
+'userlogin-yourpassword-ph' => 'Серсүзне языгыз',
+'createacct-yourpassword-ph' => 'Серсүзне кертегез',
 'yourpasswordagain' => 'Серсүзне кабат кертү:',
+'createacct-yourpasswordagain' => 'Серсүзне раслагыз',
+'createacct-yourpasswordagain-ph' => 'Серсүзне кабаттан кертегез',
 'remembermypassword' => 'Хисап язмамны бу браузерда саклансын (иң күп $1 {{PLURAL:$1|көн|көн|көн}}гә кадәр)',
-'securelogin-stick-https' => 'Керүдән соң HTTPS буенча тоташтыру дәвам ителсен',
+'userlogin-remembermypassword' => 'Системада калырга',
+'userlogin-signwithsecure' => 'Якланган кушылу',
 'yourdomainname' => 'Сезнең доменыгыз:',
 'password-change-forbidden' => 'Сез бу викидә серсүзне үзгәртә алмыйсыз.',
 'externaldberror' => 'Тышкы мәгълүмат базасы ярдәмендә аутентификация үткәндә хата чыкты, яисә тышкы хисап язмагызга үзгәрешләр кертү хокукыгыз юк.',
@@ -632,6 +640,8 @@ $2',
 'logout' => 'Чыгу',
 'userlogout' => 'Чыгу',
 'notloggedin' => 'Сез хисап язмагызга кермәгәнсез',
+'userlogin-noaccount' => 'Аккаунт юкмы?',
+'userlogin-joinproject' => 'Проектка керү',
 'nologin' => "Кулланучы исемең юкмы? '''$1'''",
 'nologinlink' => 'Хисап язмасы төзегез',
 'createaccount' => 'Яңа кулланучы теркәү',
@@ -709,7 +719,7 @@ $2',
 'newpassword' => 'Яңа серсүз:',
 'retypenew' => 'Яңа серсүзне кабатлагыз:',
 'resetpass_submit' => 'Серсүз куеп керү',
-'resetpass_success' => 'Сезнең серсүз уңышлы үзгәртелде! Системага керү башкарыла...',
+'changepassword-success' => 'Сезнең серсүз уңышлы үзгәртелде! Системага керү башкарыла...',
 'resetpass_forbidden' => 'Серсүз үзгәртелә алмый',
 'resetpass-no-info' => 'Бу битне карау өчен сез системага үз хисап язмагыз ярдәмендә керергә тиеш.',
 'resetpass-submit-loggedin' => 'Серсүзне үзгәртү',
@@ -720,10 +730,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Серсүзне бетерү',
-'passwordreset-text' => 'Сезнең хисап язмасының параметрлары турында хат алыр өчен, түбәндәгеләрне тутырыгыз',
 'passwordreset-legend' => 'Серсүзне яңадан кую',
 'passwordreset-disabled' => 'Бу викида серсүз бетереп булмый',
-'passwordreset-pretext' => '{{PLURAL:$1||Түбәндә күрсәтелгән мәгълүматларның бер өлешен языгыз}}',
 'passwordreset-username' => 'Кулланучы исеме:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Килеп чыккан хатны күрсәтелсенме?',
@@ -961,6 +969,8 @@ $2
 'edit-no-change' => 'Текстта үзгәешләр ясалмау сәбәпле, сезнең үзгәртү кире кагыла.',
 'edit-already-exists' => 'Яңа бит төзеп булмый.
 Ул инде бар.',
+'editwarning-warning' => 'Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.
+Әгәрдә сез теркәлгән булсагыз, бу искәрмәне сез «Көйләнмәләрем» өлешендә үзгәртә аласыз.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Игътибар:''' бу биттә хәтерне еш кулланучы функцияләр артык күп.
@@ -1136,7 +1146,6 @@ $1",
 'searchmenu-legend' => 'Эзләү көйләнмәләре',
 'searchmenu-exists' => "'''Бу вики-проекта «[[:$1]]» исемле бит бар инде'''",
 'searchmenu-new' => "'''«[[:$1]]»  исемле яңа бит ясау'''",
-'searchhelp-url' => 'Help:Эчтәлек',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Бу префикслы битләрне күрсәтү]]',
 'searchprofile-articles' => 'Төп битләр',
 'searchprofile-project' => 'Ярдәм һәм проектлар бите',
@@ -1178,14 +1187,6 @@ $1",
 'powersearch-togglenone' => 'Бирни дә юк',
 'search-external' => 'Тышкы эзләү',
 
-# Quickbar
-'qbsettings' => 'Күчешләр аслыгы',
-'qbsettings-none' => 'Күрсәтмәү',
-'qbsettings-fixedleft' => 'Сулда күчерелмәс',
-'qbsettings-fixedright' => 'Уңда күчерелмәс',
-'qbsettings-floatingleft' => 'Сулда йөзмә',
-'qbsettings-floatingright' => 'Уңда йөзмә',
-
 # Preferences page
 'preferences' => 'Көйләнмәләр',
 'mypreferences' => 'Көйләнмәләр',
@@ -1215,7 +1216,6 @@ $1",
 'resetprefs' => 'Сакланмаган үзгәртүләрне бетерү',
 'restoreprefs' => 'Баштагы көйләнмәләрне кире кайтару',
 'prefs-editing' => 'Үзгәртү',
-'prefs-edit-boxsize' => 'Үзгәртү тәрәзәсенең зурлыгы',
 'rows' => 'Юллар:',
 'columns' => 'Баганалар:',
 'searchresultshead' => 'Эзләү',
@@ -1226,7 +1226,6 @@ $1",
 'recentchangesdays-max' => '( $1 {{PLURAL:$1|көннән}} дә артык булмаска тиеш)',
 'recentchangescount' => 'Төп буларак кулланучы үзгәртүләр саны:',
 'prefs-help-recentchangescount' => 'Үз өченә үзгәртүләрне, битләрнең тарихын һәм язлу көндәлеген дә кертә.',
-'prefs-help-watchlist-token' => 'Әлеге юлны серсүз белән тутыру сезнең күзәтү исемлегегезнең RSS-тасмасын барлыкка китерәчәк. Мондагы серсүзне белүче һәрбер кеше сезнең күзәтү исемлегегезне карый ала, шуңа күрә автоматик рәвештә ясалган серсүзне кулланыгыз: $1',
 'savedprefs' => 'Көйләнмәләрегез сакланды.',
 'timezonelegend' => 'Сәгать поясы:',
 'localtime' => 'Җирле вакыт',
@@ -1256,7 +1255,6 @@ $1",
 'prefs-common-css-js' => 'Барлык бизәлешләр өчен гомуми CSS/JS:',
 'prefs-reset-intro' => 'Бу бит сезнең көйләнмәләрегезне бетерү өчен кулланыла. Бу эшне башкару нәтиҗәсендә сез яңадан үз көйләнмәләрне яңадан кайтара алмыйсыз.',
 'prefs-emailconfirm-label' => 'E-mail раслау',
-'prefs-textboxsize' => 'Үзгәртү тәрәзәсенең зурлыгы',
 'youremail' => 'Электрон почта:',
 'username' => 'Кулланучы исеме:',
 'uid' => 'Кулланучының идентификаторы:',
@@ -1408,7 +1406,6 @@ $1",
 'recentchangeslinked-feed' => 'Бәйләнешле үзгәртүләр',
 'recentchangeslinked-toolbox' => 'Бәйләнешле үзгәртүләр',
 'recentchangeslinked-title' => '"$1" битенә бәйләнешле үзгәртүләр',
-'recentchangeslinked-noresult' => 'Күрсәтелгән вакытта сылташкан битләрнең үзгәртелмәләре юк иде.',
 'recentchangeslinked-summary' => "Бу күрсәтелгән бит белән сылталган (йә күрсәтелгән төркемгә керткән) битләрнең үзгәртелмәләре исемлеге.
 [[Special:Watchlist|Күзәтү исемлегегезгә]] керә торган битләр '''калын'''.",
 'recentchangeslinked-page' => 'Битнең исеме:',
@@ -1599,9 +1596,6 @@ PICT # төрле
 'statistics-users-active-desc' => '{{PLURAL:$1|$1 көн }} өчендә нинди дә булса үзгәртүләр керткән кулланучылар',
 'statistics-mostpopular' => 'Иң күп каралучы битләр',
 
-'disambiguations' => 'Күп мәгънәле сүзләр турында битләр',
-'disambiguationspage' => 'Template:disambig',
-
 'doubleredirects' => 'Икеләтә юнәлтүләр',
 
 'brokenredirects' => 'Бәйләнешсез юнәлтүләр',
@@ -1998,7 +1992,6 @@ $1',
 'block-log-flags-noemail' => 'хат җибәрү тыелган',
 'block-log-flags-hiddenname' => 'кулланучының исеме яшерелгән',
 'proxyblocker' => 'Прокси тыю',
-'proxyblocksuccess' => 'Эшләнде',
 'sorbsreason' => 'Сезнең IP адресыгыз DNSBLда ачык прокси дип санала.',
 
 # Developer tools
@@ -2174,13 +2167,8 @@ $1',
 'pageinfo-toolboxlink' => 'Бит турында мәгълүмат',
 
 # Skin names
-'skinname-standard' => 'Классик',
-'skinname-nostalgia' => 'Искә алу',
 'skinname-cologneblue' => 'Зәңгәр сагыш',
 'skinname-monobook' => 'Китап',
-'skinname-myskin' => 'Үзем',
-'skinname-chick' => 'Чеби',
-'skinname-simple' => 'Гади',
 'skinname-modern' => 'Замана',
 'skinname-vector' => 'Сызымлы',
 
@@ -2250,7 +2238,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Киңлек',
 'exif-imagelength' => 'Биеклек',
 'exif-imagedescription' => 'Рәсемнең исеме',
@@ -2460,11 +2448,6 @@ $1',
 'version-software-product' => 'Продукт',
 'version-software-version' => 'Версия',
 
-# Special:FilePath
-'filepath' => 'Файлга юл',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Күчү',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Бер үк файлларны эзләү',
 'fileduplicatesearch-submit' => 'Эзләү',
diff --git a/languages/messages/MessagesTt_latn.php b/languages/messages/MessagesTt_latn.php
index 826d8335..36d11973 100644
--- a/languages/messages/MessagesTt_latn.php
+++ b/languages/messages/MessagesTt_latn.php
@@ -122,9 +122,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Bitne küzätü isemleklärenä östägän qullanuçılar sanın kürsätelsen',
 'tog-oldsig' => 'Xäzerge imzanı aldan qaraw:',
 'tog-fancysig' => 'İmzanıñ şäxsi wiki-bilgelämäse (avtomatik sıltamasız)',
-'tog-externaleditor' => 'Tışqı redaqtor qullanu (kompyuter maxsus köylängän bulu zarur)',
-'tog-externaldiff' => 'Tışqı versiä çağıştıru programmasın qullanu (kompyuter maxsus köylängän bulu zarur)',
-'tog-showjumplinks' => '«Küçü» yärdämçe sıltamaları yalğansın',
 'tog-uselivepreview' => 'Tiz qarap alu qullanılsın (JavaScript, eksperimental)',
 'tog-forceeditsummary' => 'Üzgärtülärne taswirlaw yulı tutırılmağan bulsa, kisätü',
 'tog-watchlisthideown' => 'Minem üzgärtülärem küzätü isemlegennän yäşerelsen',
@@ -219,7 +216,7 @@ $messages = array(
 'index-category' => 'İndekslanğan bitlär',
 'noindex-category' => 'İndekslanmağan bitlär',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Taswirlama',
 'article' => 'Mäqälä',
@@ -321,7 +318,7 @@ $1',
 'pool-queuefull' => 'Sorawlarnı saqlaw  bite tulı',
 'pool-errorunknown' => 'Bilgesez  xata',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} turında',
 'aboutpage' => 'Project:Taswirlama',
 'copyright' => 'Mäğlümat $1 buyınça taratıla.',
@@ -331,7 +328,6 @@ $1',
 'disclaimers' => 'Cawaplılıqtan baş tartu',
 'disclaimerpage' => 'Project:Cawaplılıqtan baş tartu',
 'edithelp' => 'Üzgärtü buyınça yärdäm',
-'edithelppage' => 'Help:Üzgärtü',
 'helppage' => 'Help:Eçtälek',
 'mainpage' => 'Baş bit',
 'mainpage-description' => 'Baş bit',
@@ -357,7 +353,6 @@ $1',
 'newmessagesdifflink' => 'bäxäs bitegezneñ soñğı üzgärtüe',
 'youhavenewmessagesmulti' => 'Sezgä monda yaña xäbärlär bar: $1',
 'editsection' => 'üzgärtü',
-'editsection-brackets' => '[$1]',
 'editold' => 'üzgärtü',
 'viewsourceold' => 'başlanğıç kodnı qaraw',
 'editlink' => 'üzgärtü',
@@ -405,17 +400,6 @@ Maxsus bitlär isemlegen qarağız: [[Special:SpecialPages|{{int:specialpages}}]
 # General errors
 'error' => 'Xata',
 'databaseerror' => 'Mäğlümatlar bazasında xata',
-'dberrortext' => 'Mäğlümatlar bazasına cibärelgän sorawda sintaksik xata tabıldı.
-Programmada xata bulırğa mömkin.
-Mäğlümatlar bazasına cibärelgän soñğı soraw:
-<blockquote><tt>$1</tt></blockquote>
-<tt>«$2»</tt> funksiäsennän.
-Baza <tt>«$3: $4»</tt> xatasın qaytardı.',
-'dberrortextcl' => 'Mäğlümatlar bazasına cibärelgän sorawda sintaksik xata tabıldı.
-Mäğlümatlar bazasına cibärelgän soñğı soraw:
-"$1"
-«$2» funksiäsennän.
-Baza «$3: $4» xatasın qaytardı.',
 'laggedslavemode' => 'İğtibar: bittä soñğı yañartular kürsätelmägän bulırğa mömkin.',
 'readonly' => 'Mäğlümatlar bazasına yazu yabılğan',
 'enterlockreason' => 'Yabılu säbäben häm waqıtın kürsätegez.',
@@ -460,7 +444,6 @@ Soraw: $2',
 'viewsourcetext' => 'Sez bu bitneñ başlanğıç tekstın qarıy häm küçerä alasız:',
 'protectedinterface' => 'Bu bittä programma interfeysı xäbärläre bar. Vandalizmğa qarşı köräş säbäple, bu bitne üzgärtü tıyıla.',
 'editinginterface' => "'''İğtibar:''' Sez MediaWiki sistemasınıñ interfeys biten üzgärtäsez. Bu başqa qullanuçılarğa da tä'sir itäçäk. Tärcemä öçen [//translatewiki.net/wiki/Main_Page?setlang=tt-latn translatewiki.net] lokalizatsiäläw proyektın qullanığız.",
-'sqlhidden' => '(SQL-soraw yäşerelgän)',
 'cascadeprotected' => 'Bu bit üzgärtülärdän saqlanğan, çönki ul kaskadlı saqlaw qabul itelgän {{PLURAL:$1|bitkä|bitlärgä}} östälgän:
 $2',
 'namespaceprotected' => "'''$1''' isem kiñlegendäge bitlärne üzgärtü öçen sezneñ röxsätegez yuq.",
@@ -482,7 +465,6 @@ Qayber bitlär Sez kergän kebek kürsätelergä mömkin. Monı beterü öçen b
 'yourpassword' => 'Sersüz:',
 'yourpasswordagain' => 'Sersüzne qabat kertü:',
 'remembermypassword' => 'Xisap yazmamnı bu brauzerda saqlansın (iñ küp $1 {{PLURAL:$1|kön|kön|kön}}gä qädär)',
-'securelogin-stick-https' => 'Kerüdän soñ HTTPS buyınça totaştırunı däwam itärgä',
 'yourdomainname' => 'Sezneñ domenığız:',
 'externaldberror' => 'Tışqı mäğlümat bazası yärdämendä awtentifikatsiä ütkändä xata çıqtı, yäisä tışqı xisap yazmağızğa üzgäreşlär kertü xoquqığız yuq.',
 'login' => 'Kerü',
@@ -561,7 +543,7 @@ Yañadan qabatlağançı beraz kötüegez sorala.',
 'newpassword' => 'Yaña sersüz:',
 'retypenew' => 'Yaña sersüzne qabatlağız:',
 'resetpass_submit' => 'Sersüz quyıp kerü',
-'resetpass_success' => 'Sezneñ sersüz uñışlı üzgärtelde! Sistemağa kerü başqarıla...',
+'changepassword-success' => 'Sezneñ sersüz uñışlı üzgärtelde! Sistemağa kerü başqarıla...',
 'resetpass_forbidden' => 'Sersüz üzgärtelä almıy',
 'resetpass-no-info' => 'Bu bitne qaraw öçen sez sistemağa üz xisap yazmağız yärdämendä kerergä tieş.',
 'resetpass-submit-loggedin' => 'Sersüzne üzgärtü',
@@ -899,7 +881,6 @@ Sez idaräçe bulu säbäple, [$1 yäşerelgän yuramanı qarıy alasız]",
 'viewprevnext' => 'Kürsätelüe: ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Ezläw köylänmäläre',
 'searchmenu-new' => "'''«[[:$1]]»  isemle yaña bit yasaw'''",
-'searchhelp-url' => 'Help:Eçtälek',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Bu prefikslı bitlärne kürsätü]]',
 'searchprofile-articles' => 'Töp bitlär',
 'searchprofile-project' => 'Yärdäm häm proyektlar bite',
@@ -940,14 +921,6 @@ Barlıq alannarda (bäxäs bitläre, ürnäklär, h.b.) ezläw öçen ''all'' s
 'powersearch-togglenone' => 'Birni dä yuq',
 'search-external' => 'Tışqı ezläw',
 
-# Quickbar
-'qbsettings' => 'Küçeşlär aslığı',
-'qbsettings-none' => 'Kürsätmäw',
-'qbsettings-fixedleft' => 'Sulda küçerelmäs',
-'qbsettings-fixedright' => 'Uñda küçerelmäs',
-'qbsettings-floatingleft' => 'Sulda yözmä',
-'qbsettings-floatingright' => 'Uñda yözmä',
-
 # Preferences page
 'preferences' => 'Köylänmälär',
 'mypreferences' => 'Köylänmälärem',
@@ -975,7 +948,6 @@ Barlıq alannarda (bäxäs bitläre, ürnäklär, h.b.) ezläw öçen ''all'' s
 'resetprefs' => 'Saqlanmağan üzgärtülärne beterü',
 'restoreprefs' => 'Baştağı köylänmälärne kire qaytaru',
 'prefs-editing' => 'Üzgärtü',
-'prefs-edit-boxsize' => 'Üzgärtü täräzäseneñ zurlığı',
 'rows' => 'Yullar:',
 'columns' => 'Bağanalar:',
 'searchresultshead' => 'Ezläw',
@@ -986,7 +958,6 @@ Barlıq alannarda (bäxäs bitläre, ürnäklär, h.b.) ezläw öçen ''all'' s
 'recentchangesdays-max' => '( $1 {{PLURAL:$1|könnän}} dä artıq bulmasqa tieş)',
 'recentchangescount' => 'Töp bularaq qullanuçı üzgärtülär sanı:',
 'prefs-help-recentchangescount' => 'Üz öçenä üzgärtülärne, bitlärneñ tarixın häm yazlu köndälegen dä kertä.',
-'prefs-help-watchlist-token' => 'Älege yulnı sersüz belän tutıru sezneñ küzätü isemlegegezneñ RSS-tasmasın barlıqqa kiteräçäk. Mondağı sersüzne belüçe härber keşe sezneñ küzätü isemlegegezne qarıy ala, şuña kürä avtomatik räweştä yasalğan sersüzne qullanığız: $1',
 'savedprefs' => 'Köylänmäläregez saqlandı.',
 'timezonelegend' => 'Säğät poyası:',
 'localtime' => 'Cirle waqıt',
@@ -1016,7 +987,6 @@ Barlıq alannarda (bäxäs bitläre, ürnäklär, h.b.) ezläw öçen ''all'' s
 'prefs-common-css-js' => 'Barlıq bizäleşlär öçen ğomumi CSS/JS:',
 'prefs-reset-intro' => 'Bu bit sezneñ köylänmäläregezne beterü öçen qullanıla. Bu eşne başqaru näticäsendä sez yañadan üz köylänmälärne yañadan qaytara almıysız.',
 'prefs-emailconfirm-label' => 'E-mail raslaw',
-'prefs-textboxsize' => 'Üzgärtü täräzäseneñ zurlığı',
 'youremail' => 'Elektron poçta:',
 'username' => 'Qullanuçı iseme:',
 'uid' => 'Qullanuçınıñ identifikatorı:',
@@ -1163,7 +1133,6 @@ Ul $1 {{PLURAL:$1|xäreftän}} kübräk bulırğa tieş tügel.',
 'recentchangeslinked-feed' => 'Bäyläneşle üzgärtülär',
 'recentchangeslinked-toolbox' => 'Bäyläneşle üzgärtülär',
 'recentchangeslinked-title' => '"$1" bitenä bäyläneşle üzgärtülär',
-'recentchangeslinked-noresult' => 'Kürsätelgän waqıtta sıltaşqan bitlärneñ üzgärtelmäläre yuq ide.',
 'recentchangeslinked-summary' => "Bu kürsätelgän bit belän sıltalğan (yä kürsätelgän törkemgä kertkän) bitlärneñ üzgärtelmäläre isemlege.
 [[Special:Watchlist|Küzätü isemlegegezgä]] kerä torğan bitlär '''qalın'''.",
 'recentchangeslinked-page' => 'Bitneñ iseme:',
@@ -1351,8 +1320,6 @@ PICT # törle
 'statistics-users-active-desc' => '{{PLURAL:$1|$1 kön }} öçendä nindi dä bulsa üzgärtülär kertkän qullanuçılar',
 'statistics-mostpopular' => 'İñ küp qaraluçı bitlär',
 
-'disambiguations' => 'Küp mäğnäle süzlär turında bitlär',
-
 'doubleredirects' => 'İkelätä yünältülär',
 
 'brokenredirects' => 'Bäyläneşsez yünältülär',
@@ -1720,7 +1687,6 @@ $1',
 'ipb_expiry_invalid' => 'İskärü waqıtı xatalı.',
 'ip_range_invalid' => 'Xatalı IP arası.',
 'proxyblocker' => 'Proksi tıyu',
-'proxyblocksuccess' => 'Eşlände',
 'sorbsreason' => 'Sezneñ IP adresığız DNSBLda açıq proksi dip sanala.',
 
 # Developer tools
@@ -1893,13 +1859,8 @@ Zinhar başqa isem saylağız.',
 'spamprotectiontitle' => 'Spam filtrı',
 
 # Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'İskä alu',
 'skinname-cologneblue' => 'Zäñgär sağış',
 'skinname-monobook' => 'Kitap',
-'skinname-myskin' => 'Üzem',
-'skinname-chick' => 'Çebi',
-'skinname-simple' => 'Ğädi',
 'skinname-modern' => 'Zamana',
 'skinname-vector' => 'Sızımlı',
 
@@ -1970,7 +1931,7 @@ Yulnıñ berençe sıltaması quyma öçen tıyılğan räsemgä sıltama bulır
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Kiñlek',
 'exif-imagelength' => 'Bieklek',
 'exif-imagedescription' => 'Räsemneñ iseme',
@@ -2138,11 +2099,6 @@ Yulnıñ berençe sıltaması quyma öçen tıyılğan räsemgä sıltama bulır
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Versiä',
 
-# Special:FilePath
-'filepath' => 'Faylğa yul',
-'filepath-page' => 'Fayl:',
-'filepath-submit' => 'Küçü',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Ezläw',
 
diff --git a/languages/messages/MessagesTyv.php b/languages/messages/MessagesTyv.php
index 02be7746..8a1d47e4 100644
--- a/languages/messages/MessagesTyv.php
+++ b/languages/messages/MessagesTyv.php
@@ -24,57 +24,72 @@ $namespaceNames = array(
 	NS_SPECIAL          => 'Тускай',
 	NS_TALK             => 'Чугаа',
 	NS_USER             => 'Aжыглакчы',
-	NS_USER_TALK        => 'Aжыглакчы_чугаазы',
-	NS_PROJECT_TALK     => '$1_чугаазы',
+	NS_USER_TALK        => 'Aжыглакчы_чугаа',
+	NS_PROJECT_TALK     => '$1_чугаа',
 	NS_FILE             => 'Файл',
-	NS_FILE_TALK        => 'Файл_чугаазы',
+	NS_FILE_TALK        => 'Файл_чугаа',
 	NS_MEDIAWIKI        => 'МедиаВики',
-	NS_MEDIAWIKI_TALK   => 'МедиаВики_чугаазы',
+	NS_MEDIAWIKI_TALK   => 'МедиаВики_чугаа',
 	NS_TEMPLATE         => 'Майык',
-	NS_TEMPLATE_TALK    => 'Майык_чугаазы',
+	NS_TEMPLATE_TALK    => 'Майык_чугаа',
 	NS_HELP             => 'Дуза',
-	NS_HELP_TALK        => 'Дуза_чугаазы',
-	NS_CATEGORY         => 'Категория',
-	NS_CATEGORY_TALK    => 'Категория_чугаазы',
+	NS_HELP_TALK        => 'Дуза_чугаа',
+	NS_CATEGORY         => 'Аңгылал',
+	NS_CATEGORY_TALK    => 'Аңгылал_чугаа',
 );
 
+$namespaceAliases = array(
+	'Aжыглакчы_чугаазы'  => NS_USER_TALK,
+	'$1_чугаазы'         => NS_PROJECT_TALK,
+	'Файл_чугаазы'       => NS_FILE_TALK,
+	'МедиаВики_чугаазы'  => NS_MEDIAWIKI_TALK,
+	'Майык_чугаазы'      => NS_TEMPLATE_TALK,
+	'Дуза_чугаазы'       => NS_HELP_TALK,
+	'Категория'          => NS_CATEGORY,
+	'Категория_чугаазы'  => NS_CATEGORY_TALK,
+);
 
 $magicWords = array(
-	'redirect'                  => array( '0', '#ШИГЛЕДИР', '#REDIRECT' ),
-	'notoc'                     => array( '0', '__ДОПЧУЗУЧОК__', '__NOTOC__' ),
-	'toc'                       => array( '0', '__ДОПЧУЗУ__', '__TOC__' ),
-	'currentmonth'              => array( '1', 'АМГЫАЙ', 'АМГЫАЙ2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-	'currentmonth1'             => array( '1', 'АМГЫАЙ1', 'CURRENTMONTH1' ),
-	'currentmonthname'          => array( '1', 'АМГЫАЙНЫҢАДЫ', 'CURRENTMONTHNAME' ),
-	'currentday'                => array( '1', 'АМГЫХҮН', 'CURRENTDAY' ),
-	'currentday2'               => array( '1', 'АМГЫХҮН2', 'CURRENTDAY2' ),
-	'currentdayname'            => array( '1', 'АМГЫХҮННҮҢАДЫ', 'CURRENTDAYNAME' ),
-	'currentyear'               => array( '1', 'АМГЫЧЫЛ', 'CURRENTYEAR' ),
-	'currenttime'               => array( '1', 'АМГЫҮЕ', 'CURRENTTIME' ),
-	'currenthour'               => array( '1', 'АМГЫШАК', 'CURRENTHOUR' ),
-	'numberofpages'             => array( '1', 'АРЫННАРНЫҢСАНЫ', 'NUMBEROFPAGES' ),
-	'numberofarticles'          => array( '1', 'ЧҮҮЛДЕРНИҢСАНЫ', 'NUMBEROFARTICLES' ),
-	'numberoffiles'             => array( '1', 'ФАЙЛДАРНЫҢСАНЫ', 'NUMBEROFFILES' ),
-	'numberofusers'             => array( '1', 'АЖЫГЛАКЧЫЛАРНЫҢСАНЫ', 'NUMBEROFUSERS' ),
-	'numberofedits'             => array( '1', 'ӨСКЕРЛИИШКИННЕРНИҢСАНЫ', 'NUMBEROFEDITS' ),
-	'pagename'                  => array( '1', 'АРЫННЫҢАДЫ', 'PAGENAME' ),
-	'namespace'                 => array( '1', 'АТТАРДЕЛГЕМИ', 'NAMESPACE' ),
-	'namespacee'                => array( '1', 'АТТАРДЕЛГЕМИ2', 'NAMESPACEE' ),
+	'redirect'                  => array( '0', '#көжүрүлге', '#ШИГЛЕДИР', '#перенаправление', '#перенапр', '#REDIRECT' ),
+	'notoc'                     => array( '0', '__ЭГЕ_ЧОК__', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
+	'nogallery'                 => array( '0', '__ГАЛЕРЕЯ_ЧОК__', '__БЕЗ_ГАЛЕРЕИ__', '__NOGALLERY__' ),
+	'forcetoc'                  => array( '0', '__АЛБАН_ЭГЕ__', '__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
+	'toc'                       => array( '0', '__ДОПЧУ__', '__ОГЛАВЛЕНИЕ__', '__ОГЛ__', '__TOC__' ),
+	'noeditsection'             => array( '0', '__ҮЛЕГ_ЭДИЛГЕЗИ_ЧОК__', '__БЕЗ_РЕДАКТИРОВАНИЯ_РАЗДЕЛА__', '__NOEDITSECTION__' ),
+	'currentmonth'              => array( '1', '__АМГЫ_АЙ', '__АМГЫ_АЙ_2__', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+	'currentmonth1'             => array( '1', '__АМГЫ_АЙ_1__', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
+	'currentmonthname'          => array( '1', 'АМГЫАЙНЫҢАДЫ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА', 'CURRENTMONTHNAME' ),
+	'currentday'                => array( '1', 'АМГЫХҮН', 'ТЕКУЩИЙ_ДЕНЬ', 'CURRENTDAY' ),
+	'currentday2'               => array( '1', 'АМГЫХҮН2', 'ТЕКУЩИЙ_ДЕНЬ_2', 'CURRENTDAY2' ),
+	'currentdayname'            => array( '1', 'АМГЫХҮННҮҢАДЫ', 'НАЗВАНИЕ_ТЕКУЩЕГО_ДНЯ', 'CURRENTDAYNAME' ),
+	'currentyear'               => array( '1', 'АМГЫЧЫЛ', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+	'currenttime'               => array( '1', 'АМГЫҮЕ', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+	'currenthour'               => array( '1', 'АМГЫШАК', 'ТЕКУЩИЙ_ЧАС', 'CURRENTHOUR' ),
+	'numberofpages'             => array( '1', 'АРЫННАРНЫҢСАНЫ', 'КОЛИЧЕСТВО_СТРАНИЦ', 'NUMBEROFPAGES' ),
+	'numberofarticles'          => array( '1', 'ЧҮҮЛДЕРНИҢСАНЫ', 'КОЛИЧЕСТВО_СТАТЕЙ', 'NUMBEROFARTICLES' ),
+	'numberoffiles'             => array( '1', 'ФАЙЛДАРНЫҢСАНЫ', 'КОЛИЧЕСТВО_ФАЙЛОВ', 'NUMBEROFFILES' ),
+	'numberofusers'             => array( '1', 'АЖЫГЛАКЧЫЛАРНЫҢСАНЫ', 'КОЛИЧЕСТВО_УЧАСТНИКОВ', 'NUMBEROFUSERS' ),
+	'numberofedits'             => array( '1', 'ӨСКЕРЛИИШКИННЕРНИҢСАНЫ', 'КОЛИЧЕСТВО_ПРАВОК', 'NUMBEROFEDITS' ),
+	'pagename'                  => array( '1', 'АРЫННЫҢАДЫ', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
+	'namespace'                 => array( '1', 'АТТАРДЕЛГЕМИ', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
+	'namespacee'                => array( '1', 'АТТАРДЕЛГЕМИ2', 'ПРОСТРАНСТВО_ИМЁН_2', 'NAMESPACEE' ),
 	'namespacenumber'           => array( '1', 'АТТАРДЕЛГЕМИНИҢСАНЫ', 'NAMESPACENUMBER' ),
-	'talkspace'                 => array( '1', 'ЧУГААДЕЛГЕМИ', 'TALKSPACE' ),
-	'talkspacee'                => array( '1', 'ЧУГААДЕЛГЕМИ2', 'TALKSPACEE' ),
-	'img_right'                 => array( '1', 'оң', 'right' ),
-	'img_left'                  => array( '1', 'солагай', 'left' ),
-	'img_center'                => array( '1', 'төп', 'center', 'centre' ),
-	'sitename'                  => array( '1', 'САЙТТЫҢАДЫ', 'SITENAME' ),
-	'ns'                        => array( '0', 'АД:', 'NS:' ),
-	'nse'                       => array( '0', 'АД2:', 'NSE:' ),
-	'currentweek'               => array( '1', 'АМГЫЧЕДИХОНУК', 'CURRENTWEEK' ),
-	'currentdow'                => array( '1', 'АМГЫЧЕДИХОНУКТУҢХҮНҮ', 'CURRENTDOW' ),
-	'raw'                       => array( '0', 'ЧИГ:', 'RAW:' ),
-	'language'                  => array( '0', '#ДЫЛ:', '#LANGUAGE:' ),
-	'special'                   => array( '0', 'тускай', 'special' ),
-	'tag'                       => array( '0', 'демдек', 'tag' ),
+	'talkspace'                 => array( '1', 'ЧУГААДЕЛГЕМИ', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ', 'TALKSPACE' ),
+	'talkspacee'                => array( '1', 'ЧУГААДЕЛГЕМИ2', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ_2', 'TALKSPACEE' ),
+	'img_right'                 => array( '1', 'оң', 'справа', 'right' ),
+	'img_left'                  => array( '1', 'солагай', 'слева', 'left' ),
+	'img_center'                => array( '1', 'төп', 'центр', 'center', 'centre' ),
+	'sitename'                  => array( '1', 'САЙТТЫҢАДЫ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
+	'ns'                        => array( '0', 'АД:', 'ПИ:', 'NS:' ),
+	'nse'                       => array( '0', 'АД2:', 'ПИК:', 'NSE:' ),
+	'currentweek'               => array( '1', 'АМГЫЧЕДИХОНУК', 'ТЕКУЩАЯ_НЕДЕЛЯ', 'CURRENTWEEK' ),
+	'currentdow'                => array( '1', 'АМГЫЧЕДИХОНУКТУҢХҮНҮ', 'ТЕКУЩИЙ_ДЕНЬ_НЕДЕЛИ', 'CURRENTDOW' ),
+	'raw'                       => array( '0', 'ЧИГ:', 'НЕОБРАБ:', 'RAW:' ),
+	'language'                  => array( '0', '#ДЫЛ:', '#ЯЗЫК:', '#LANGUAGE:' ),
+	'special'                   => array( '0', 'тускай', 'служебная', 'special' ),
+	'tag'                       => array( '0', 'демдек', 'метка', 'тег', 'тэг', 'tag' ),
+	'hiddencat'                 => array( '1', '__ЧАЖЫТ_АҢГЫЛАЛ__', '__СКРЫТАЯ_КАТЕГОРИЯ__', '__HIDDENCAT__' ),
+	'pagesincategory'           => array( '1', '__АҢГЫЛАЛ_АРЫННАРЫ__', 'СТРАНИЦ_В_КАТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
 	'pagesincategory_all'       => array( '0', 'шупту', 'all' ),
 	'pagesincategory_pages'     => array( '0', 'арыннар', 'pages' ),
 	'pagesincategory_files'     => array( '0', 'файлдар', 'files' ),
@@ -281,7 +296,7 @@ $messages = array(
 'jumptosearch' => 'дилээри',
 'pool-errorunknown' => 'Билбес алдаг',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} дугайында',
 'aboutpage' => 'Project:Дугайында',
 'copyrightpage' => '{{ns:project}}:Чогаалчының эргелери',
@@ -290,7 +305,6 @@ $messages = array(
 'disclaimers' => 'Ажыглаар харысаалгазын чөрчүүрү (ойталаары)',
 'disclaimerpage' => 'Project:Ажыглаар харысаалгазын ойталаары',
 'edithelp' => 'Эдеринге дуза',
-'edithelppage' => 'Help:Эдери',
 'helppage' => 'Help:Допчузу',
 'mainpage' => 'Кол Арын',
 'mainpage-description' => 'Кол Арын',
@@ -368,7 +382,6 @@ $messages = array(
 Адында таарышпас демдектер бары чадапчок.',
 'viewsource' => 'Дөзүн көөрү',
 'actionthrottled' => 'Шеглээн дүрген',
-'sqlhidden' => '(SQL айтырыгны чажырган)',
 'exception-nologin' => 'Кирбес',
 
 # Login and logout pages
@@ -593,7 +606,6 @@ Please check if you want to create/edit this page.',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) көөрү',
 'searchmenu-exists' => "'''Бо викиде \"[[:\$1]]\" деп арын бар.'''",
 'searchmenu-new' => "'''Бо викиде «[[:$1]]» арынны чогаадыры'''",
-'searchhelp-url' => 'Help:Допчузу',
 'searchprofile-articles' => 'үндезин арыннар',
 'searchprofile-project' => 'Төлевилел биле дуза арыннары',
 'searchprofile-images' => 'Мультимедиа',
@@ -638,7 +650,6 @@ Please check if you want to create/edit this page.',
 'saveprefs' => 'Шыгжаары',
 'restoreprefs' => 'Шупту баштайгы ниити шилилгелерни restore',
 'prefs-editing' => 'Өскертир',
-'prefs-edit-boxsize' => 'Өскертир көзенектиң хемчээли.',
 'rows' => 'Одуруглар:',
 'columns' => 'Баганалар:',
 'searchresultshead' => 'Дилээр',
@@ -656,7 +667,6 @@ Please check if you want to create/edit this page.',
 'prefs-files' => 'файлдар',
 'prefs-custom-css' => 'Бодуңар CSS',
 'prefs-custom-js' => 'Бодуңар JavaScript',
-'prefs-textboxsize' => 'Өскертир көзенектиң хемчээли',
 'youremail' => 'Э-чагааңар:',
 'username' => 'Aжыглакчының ады:',
 'uid' => 'Ажыглакчынын саны (ID):',
@@ -767,7 +777,6 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'recentchangeslinked' => 'Хамааржыр өскерлиишкиннер',
 'recentchangeslinked-toolbox' => 'Хамааржыр өскерлиишкиннер',
 'recentchangeslinked-title' => '«$1» деп арынга хамаарыштырган өскерлиишкиннер',
-'recentchangeslinked-noresult' => 'Холбаштырган арыннарда айыткан үе иштинде кандыг-даа өскертилге турбаан.',
 'recentchangeslinked-summary' => "Айыткан арынның (азы айыткан аңгылалга хамаарышкан) шөлүлүглериниң чедер арыннарнының чаа өскерилгер даңзызы.
 [[Special:Watchlist|Силерниң хайгаарал даңзызынче]] кирип турар арыннарны '''ылгап каан'''.",
 'recentchangeslinked-page' => 'Арынның ады:',
@@ -860,8 +869,6 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'statistics' => 'Статистика',
 'statistics-pages' => 'Арыннар',
 
-'disambiguationspage' => 'Майык: уш-бажы билдинмес',
-
 'brokenredirects-edit' => 'өскертири',
 'brokenredirects-delete' => 'ырадыры',
 
@@ -1195,13 +1202,8 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'anonymous' => '{{grammar:genitive|{{SITENAME}}}} ат эвес {{PLURAL:$1|ажыглакчызы|ажыглакчылары}}',
 
 # Skin names
-'skinname-standard' => 'Классик',
-'skinname-nostalgia' => 'Ностальгия',
 'skinname-cologneblue' => 'Cologne Blue',
 'skinname-monobook' => 'МоноБук',
-'skinname-myskin' => 'МайСкин',
-'skinname-chick' => 'Чикк',
-'skinname-simple' => 'Симпел',
 'skinname-modern' => 'Модерн',
 'skinname-vector' => 'Вектор',
 
@@ -1262,7 +1264,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Калбаа',
 'exif-imagelength' => 'Бедик',
 'exif-imagedescription' => 'Чуруктуң ады',
@@ -1340,10 +1342,6 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'version-other' => 'Өске',
 'version-software-version' => 'Үндүрери',
 
-# Special:FilePath
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Күүcедири',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Файлдың ады:',
 'fileduplicatesearch-submit' => 'Дилээри',
diff --git a/languages/messages/MessagesUdm.php b/languages/messages/MessagesUdm.php
index 9f2d03fe..ac03870d 100644
--- a/languages/messages/MessagesUdm.php
+++ b/languages/messages/MessagesUdm.php
@@ -23,8 +23,8 @@ $namespaceNames = array(
 	NS_USER             => 'Викиавтор',
 	NS_USER_TALK        => 'Викиавтор_сярысь_вераськон',
 	NS_PROJECT_TALK     => '$1_сярысь_вераськон',
-	NS_FILE             => 'Суред',
-	NS_FILE_TALK        => 'Суред_сярысь_вераськон',
+	NS_FILE             => 'Файл',
+	NS_FILE_TALK        => 'Файл_сярысь_вераськон',
 	NS_MEDIAWIKI        => 'MediaWiki',
 	NS_MEDIAWIKI_TALK   => 'MediaWiki_сярысь_вераськон',
 	NS_TEMPLATE         => 'Шаблон',
@@ -35,6 +35,11 @@ $namespaceNames = array(
 	NS_CATEGORY_TALK    => 'Категория_сярысь_вераськон',
 );
 
+$namespaceAliases = array(
+	'Суред'                  => NS_FILE,
+	'Суред_сярысь_вераськон' => NS_FILE_TALK,
+);
+
 // Remove Russian aliases
 $namespaceGenderAliases = array();
 
@@ -57,7 +62,7 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Cекциосты шырлэн бур кнопкаез заголовок вылын зӥбиськыкуз тупатыны (JavaScript кулэ)',
 'tog-showtoc' => 'Пуштросэз возьматоно (2-лэсь трос заголовокъем бамъёс понна)',
 'tog-rememberpassword' => 'Мынам пыроннимме та браузерлэн тодаз возьыны ($1 яке $1-лэсь ӧжытгес нунал ӵоже гинэ)',
-'tog-watchcreations' => 'Мынэсьтым кылдытэм бамъёсме но ӝуткам файлъёсме чаклан списокам пыртыны',
+'tog-watchcreations' => 'Бамъёсты, кудъёстэс мон кылдытӥсько, мынам чаклкан списокам пыртыны',
 'tog-watchdefault' => 'Бамъёсты, кудъёстэс мон тупатӥсько, мынам чаклкан списокам пыртыны',
 'tog-watchmoves' => 'Бамъёсты, кудъёстэс мон мукет интые выжтӥсько, мынам чаклкан списокам пыртыны',
 'tog-watchdeletion' => 'Бамъёсты, кудъёстэс мон ӵушисько, мынам чаклкан списоке пыртыны',
@@ -129,7 +134,7 @@ $messages = array(
 'dec' => 'тст',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Категория|Категориос}}',
+'pagecategories' => '$1 категория',
 'category_header' => '«$1» категориысь бамъёс',
 'subcategories' => 'Подкатегориос',
 'category-media-header' => '«$1» категориысь файлъёс',
@@ -146,7 +151,7 @@ $messages = array(
 'index-category' => 'Индексировать кароно бамъёс',
 'noindex-category' => 'Индексировать каронтэм бамъёс',
 
-'linkprefix' => '/^(.*?)(„|«)$/sDu',
+'linkprefix' => '/^((?>.*(?<!(?:„|«)$)))(.+)$/sDu',
 
 'about' => 'Та сярысь',
 'article' => 'Статья',
@@ -216,10 +221,9 @@ $messages = array(
 'viewsource' => 'Кодзэ учкыны',
 
 # Login and logout pages
-'login' => 'Пырон',
+'login' => 'Википедие пырон',
 'nav-login-createaccount' => 'Нимдэс вераны / Регистрациез ортчытыны',
 'userlogin' => 'Регистрациез ортчытыны яке Википедие пырыны',
-'userloginnocreate' => 'Пырон',
 'logout' => 'Кошкыны',
 'userlogout' => 'Кошкыны',
 'createaccount' => 'выль вики-авторлэн регистрациез',
@@ -269,7 +273,7 @@ $messages = array(
 'nbytes' => '$1 байт',
 'move' => 'Мукет интые выжтыны',
 
-# Email user
+# E-mail user
 'emailmessage' => 'Ивортон:',
 
 # Watchlist
diff --git a/languages/messages/MessagesUg_arab.php b/languages/messages/MessagesUg_arab.php
index b2af2074..16c052b3 100644
--- a/languages/messages/MessagesUg_arab.php
+++ b/languages/messages/MessagesUg_arab.php
@@ -22,17 +22,27 @@ $namespaceNames = array(
 	NS_SPECIAL          => 'ئالاھىدە',
 	NS_TALK             => 'مۇنازىرە',
 	NS_USER             => 'ئىشلەتكۈچى',
-	NS_USER_TALK        => 'ئىشلەتكۈچى مۇنازىرىسى',
-	NS_PROJECT_TALK     => 'مۇنازىرىسى$1',
+	NS_USER_TALK        => 'ئىشلەتكۈچى_مۇنازىرىسى',
+	NS_PROJECT_TALK     => '$1مۇنازىرىسى',
 	NS_FILE             => 'ھۆججەت',
-	NS_FILE_TALK        => 'ھۆججەت مۇنازىرىسى',
-	NS_MEDIAWIKI_TALK   => 'MediaWiki مۇنازىرىسى',
+	NS_FILE_TALK        => 'ھۆججەت_مۇنازىرىسى',
+	NS_MEDIAWIKI_TALK   => 'MediaWiki_مۇنازىرىسى',
 	NS_TEMPLATE         => 'قېلىپ',
-	NS_TEMPLATE_TALK    => 'قېلىپ مۇنازىرىسى',
+	NS_TEMPLATE_TALK    => 'قېلىپ_مۇنازىرىسى',
 	NS_HELP             => 'ياردەم',
-	NS_HELP_TALK        => 'ياردەم مۇنازىرىسى',
+	NS_HELP_TALK        => 'ياردەم_مۇنازىرىسى',
 	NS_CATEGORY         => 'تۈر',
-	NS_CATEGORY_TALK    => 'تۈر مۇنازىرىسى',
+	NS_CATEGORY_TALK    => 'تۈر_مۇنازىرىسى',
+);
+
+$namespaceAliases = array(
+	'مۇنازىرىسى$1' => NS_PROJECT_TALK,
+);
+
+$specialPageAliases = array(
+	'Allmessages'               => array( 'بارلىق_خەۋەرلەر' ),
+	'Allpages'                  => array( 'بارلىق_بەتلەر' ),
+	'Ancientpages'              => array( 'كونا_بەتلەر' ),
 );
 
 $messages = array(
@@ -66,10 +76,6 @@ $messages = array(
 'tog-shownumberswatching' => 'بۇ بەتنى كۆزىتىۋاتقان ئىشلەتكۈچى سانىنى كۆرسەت',
 'tog-oldsig' => 'نۆۋەتتىكى ئىمزا:',
 'tog-fancysig' => 'ئىمزاغا wiki تېكستى سۈپىتىدە مۇئامىلە قىل (ئۆزلۈكىدىن ئۇلانما ھاسىل بولمايدۇ)',
-'tog-externaleditor' => 'كۆڭۈلدىكى ئەھۋالدا سىرتقى تەھرىرلىگۈچ ئىشلىتىدۇ (ئالىي ئىشلەتكۈچىگە تەمىنلىنىدۇ، كومپيۇتېرىڭىزدا بىر قىسىم ئالاھىدە تەڭشەش ئېلىپ بېرىشىڭىز لازىم
-[//www.mediawiki.org/wiki/Manual:External_editors تېخىمۇ كۆپ ئۇچۇر.])',
-'tog-externaldiff' => 'كۆڭۈلدىكى ئەھۋالدا سىرتقى پەرق تەھلىلى ئىشلىتىدۇ (ئالىي ئىشلەتكۈچىگە تەمىنلىنىدۇ، كومپيۇتېرىڭىزدا بىر قىسىم ئالاھىدە تەڭشەش ئېلىپ بېرىشىڭىز لازىم. [//www.mediawiki.org/wiki/Manual:External_editors تېخىمۇ كۆپ ئۇچۇر.])',
-'tog-showjumplinks' => '"ئاتلا" زىيارەت ئۇلانمىسىنى قوزغات',
 'tog-uselivepreview' => 'رىئال ۋاقىتلىق ئالدىن كۆزىتىشنى ئىشلەت (JavaScript زۆرۈر) (سىناق)',
 'tog-forceeditsummary' => 'ئۈزۈندە كىرگۈزمىگەندە مېنى ئەسكەرت',
 'tog-watchlisthideown' => 'كۆزەت تىزىملىكىدىن مېنىڭ تەھرىرلىگىنىمنى يوشۇر',
@@ -167,7 +173,7 @@ $messages = array(
 'broken-file-category' => 'ھۆججەت ئۇلىنىشى بۇزۇلغان بەتلەر',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'ھەققىدە',
 'article' => 'مۇندەرىجە',
@@ -273,7 +279,7 @@ $1',
 'pool-queuefull' => 'قاچا ئۆچرىتى توشتى',
 'pool-errorunknown' => 'نامەلۇم خاتالىق',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} ھەققىدە',
 'aboutpage' => 'Project:ھەققىدە',
 'copyright' => 'بۇ بېكەتتىكى بارلىق تېكست مەزمۇنى $1 ماددىسىغا ئاساسەن تەمىنلىنىدۇ.',
@@ -283,7 +289,6 @@ $1',
 'disclaimers' => 'جاۋابكارلىقنى كەچۈرۈم قىلىش باياناتى',
 'disclaimerpage' => 'Project:ئادەتتىكى جاۋابكارلىقنى كەچۈرۈم قىلىش باياناتى',
 'edithelp' => 'تەھرىرلەش ياردىمى',
-'edithelppage' => 'Help:تەھرىرلەۋاتىدۇ',
 'helppage' => 'Help:مەزمۇنلار',
 'mainpage' => 'باش بەت',
 'mainpage-description' => 'باش بەت',
@@ -316,7 +321,6 @@ $1',
 'newmessagesdifflinkplural' => 'ئاخىرقى $1 {{PLURAL:$1|ئۆزگەرتىش|ئۆزگەرتىش}}',
 'youhavenewmessagesmulti' => '$1 يېڭى ئۇچۇرىڭىز بار',
 'editsection' => 'تەھرىر',
-'editsection-brackets' => '[$1]',
 'editold' => 'تەھرىر',
 'viewsourceold' => 'مەنبەنى كۆرسەت',
 'editlink' => 'تەھرىر',
@@ -371,17 +375,6 @@ URL نى خاتا كىرگۈزۈپ قالدىڭىز ياكى خاتا ئۇلان
 # General errors
 'error' => 'خاتالىق',
 'databaseerror' => 'ساندان خاتالىقى',
-'dberrortext' => 'ساندان سۈرۈشتۈرۈشتە گرامماتىكىلىق خاتالىق يۈز بەردى.
-يۇمشاق دېتالنىڭ ئۆزىدىكى خاتالىقتىن كېلىپ چىققان بولۇشى مۇمكىن.
-ئاخىرقى قېتىملىق ساندان سۈرۈشتۈرۈش بۇيرۇقى:
-<blockquote><code>$1</code></blockquote>
- "<code>$2</code>"فۇنكسىيىدىن كەلگەن.
-ساندان قايتۇرغان خاتالىق "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'ساندان سۈرۈشتۈرۈشتە گرامماتىكىلىق خاتالىق يۈز بەردى.
-ئاخىرقى قېتىملىق ساندان سۈرۈشتۈرۈش بۇيرۇقى:
-"$1"
-"$2" فۇنكسىيىدىن كەلگەن.
-MySQL قايتۇرغان خاتالىقى"$3: $4"',
 'laggedslavemode' => 'ئاگاھلاندۇرۇش: بەت يېقىنقى يېڭىلاشنى ئۆز ئىچىگە ئالمىغان بولۇشى مۇمكىن.',
 'readonly' => 'ساندان قۇلۇپلانغان',
 'enterlockreason' => 'قۇلۇپلىنىش سەۋەبىنى كىرگۈزۈڭ، قايتا ئېچىشنىڭ مۆلچەر ۋاقتىنىمۇ ئۆز ئىچىگە ئالىدۇ',
@@ -446,7 +439,6 @@ MySQL قايتۇرغان خاتالىقى"$3: $4"',
 بۇ بەت ئۆزگەرتىلسە باشقا ئىشلەتكۈچىلەرنىڭ كۆرۈنۈش ئۇسلۇبىغا تەسىر كۆرسىتىدۇ.
 
 مەسىلەن ئەگەر تەرجىمە قىلسىڭىز [//translatewiki.net/wiki/Main_Page?setlang=ug translatewiki.net] ئۇنداقتا MediaWiki يەرلىكلەشتۈرۈش پىلانىنى ئىشلىتىشنى ئويلىشىڭ.",
-'sqlhidden' => '(SQL سۈرۈشتۈرۈش يوشۇرۇلدى)',
 'cascadeprotected' => 'بۇ بەت قوغدالغان چۈنكى تۆۋەندىكى {{PLURAL:$1|بىر|بىر قانچە}} بەت مەزكۇر بەتنى ئۆز ئىچىگە ئېلىش بىلەن بىللە "زەنجىرسىمان قوغداش" قوزغىتىلغان.
 
 $2',
@@ -483,7 +475,6 @@ $2',
 'yourpassword' => 'ئىم:',
 'yourpasswordagain' => 'ئاچقۇچنى قايتا بەسىڭ:',
 'remembermypassword' => 'بۇ كومپيۇتېردا كىرگىنىمنى ئەستە ساقلا(ئەڭ ئۇزۇن بولغاندا $1 {{PLURAL:$1|كۈن|كۈن}})',
-'securelogin-stick-https' => 'تىزىمغا كىرگەندىن كېيىن HTTPS باغلىنىشنى داۋاملاشتۇر',
 'yourdomainname' => 'دائىرە ئاتىڭىز:',
 'password-change-forbidden' => 'بۇ ۋىكىدىكى ئىمنى ئۆزگەرتەلمەيسىز.',
 'externaldberror' => 'بۇ سانداننى دەلىللەش خاتالىقى ياكى سىرتقى ھېساباتىڭىزنى يېڭىلاشنى چەكلىگەنلىكتىن بولغان بولۇشى مۇمكىن.',
@@ -601,7 +592,7 @@ cookies نى قوزغاتقانلىقىڭىزنى جەزملەڭ، بۇ بەتن
 'newpassword' => 'يېڭى ئىم:',
 'retypenew' => 'يېڭى ئىمنى قايتا كىرگۈزۈڭ:',
 'resetpass_submit' => 'ئىم بەلگىلەپ تىزىمغا كىرىڭ',
-'resetpass_success' => 'سىز ئىمنى مۇۋەپپەقىيەتلىك ئۆزگەرتتىڭىز!
+'changepassword-success' => 'سىز ئىمنى مۇۋەپپەقىيەتلىك ئۆزگەرتتىڭىز!
  تىزىمغا كىرىۋاتىسىز…',
 'resetpass_forbidden' => 'ئىمنى ئۆزگەرتەلمىدى',
 'resetpass-no-info' => 'سىز تىزىمغا كىرگەندىن كېيىن بىۋاسىتە بۇ بەتكە كىرىشىڭىز لازىم.',
@@ -614,10 +605,8 @@ cookies نى قوزغاتقانلىقىڭىزنى جەزملەڭ، بۇ بەتن
 
 # Special:PasswordReset
 'passwordreset' => 'ئىمنى ئەسلىگە قايتۇرماق',
-'passwordreset-text' => 'بۇ جەدۋەل تاماملانسا ھېسابات تەپسىلاتىڭىزنى ئېلخەتىڭىزدە تاپشۇرۇۋالىسىز.',
 'passwordreset-legend' => 'ئىمنى ئەسلىگە قايتۇرماق',
 'passwordreset-disabled' => 'بۇ ۋىكىدا ئىمنى ئەسلىگە قايتۇرۇش چەكلەنگەن.',
-'passwordreset-pretext' => '{{PLURAL:$1||تۆۋەندىكى سانلىق مەلۇماتتىن بىرنى كىرگۈزۈڭ}}',
 'passwordreset-username' => 'ئىشلەتكۈچى ئاتى:',
 'passwordreset-domain' => 'دائىرە:',
 'passwordreset-capture' => 'ھاسىل قىلىنغان ئېلخەتنى كۆرسىتەمدۇ؟',
@@ -1112,7 +1101,6 @@ $1",
 'searchmenu-legend' => 'ئىزدەش تاللانما',
 'searchmenu-exists' => "'''بۇ wiki دا  \"[[:\$1]]\" ئاتلىق بەت بار '''",
 'searchmenu-new' => "'''بۇ wiki دا  \"[[:\$1]]\" ئاتلىق بەت قۇر!'''",
-'searchhelp-url' => 'Help:مەزمۇنلار',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1| بۇنى ئالدى قوشۇلغۇچى قىلغان بەتكە كۆز يۈگۈرت ]]',
 'searchprofile-articles' => 'مەزمۇن بېتى',
 'searchprofile-project' => 'ياردەم ۋە قۇرۇلۇش بەتلەر',
@@ -1156,15 +1144,6 @@ $1",
 'searchdisabled' => '{{SITENAME}} نىڭ ئىزدىشى چەكلەنگەن. سىز ھازىرچە Google ئىشلىتىپ ئىزدەپ تۇرۇڭ،.
 دىققەت ئۇلار ئىندېكسلىغان {{SITENAME}} مەزمۇنىنىڭ ۋاقتى ئۆتكەن بولۇشى مۇمكىن.',
 
-# Quickbar
-'qbsettings' => 'تېز يولباشچى ستونى',
-'qbsettings-none' => 'يوق',
-'qbsettings-fixedleft' => 'سول تەرەپ مۇقىم',
-'qbsettings-fixedright' => 'ئوڭ تەرەپ مۇقىم',
-'qbsettings-floatingleft' => 'سول تەرەپ لەيلىمە',
-'qbsettings-floatingright' => 'ئوڭ تەرەپ لەيلىمە',
-'qbsettings-directionality' => 'تىلىڭىزدىكى تېكىست ۋە قوليازمىنىڭ يۆنىلىشىگە ئاساسەن مۇقىملاشتۇرىدۇ.',
-
 # Preferences page
 'preferences' => 'مايىللىق',
 'mypreferences' => 'مايىللىق',
@@ -1197,7 +1176,6 @@ $1",
 'resetprefs' => 'ساقلىمىغان ئۆزگەرتىشلەرنى تازىلا',
 'restoreprefs' => 'بارلىق كۆڭۈلدىكى تەڭشەكنى ئەسلىگە كەلتۈر',
 'prefs-editing' => 'تەھرىرلەۋاتىدۇ',
-'prefs-edit-boxsize' => 'تەھرىرلەش كۆزنىكىنىڭ چوڭلۇقى',
 'rows' => 'قۇر:',
 'columns' => 'ستون:',
 'searchresultshead' => 'ئىزدە',
@@ -1208,9 +1186,6 @@ $1",
 'recentchangesdays-max' => 'ئەڭ چوڭ $1 {{PLURAL:$1|كۈن|كۈن}}',
 'recentchangescount' => 'كۆرسىتىدىغان تەھرىرنىڭ كۆڭۈلدىكى سانى:',
 'prefs-help-recentchangescount' => 'بۇ يېقىنقى ئۆزگەرتىش، بەت تارىخى ۋە خاتىرىنى ئۆز ئىچىگە ئالىدۇ،',
-'prefs-help-watchlist-token' => 'بۇ سۆز بۆلىكىگە تولدۇرغان شىفىرلىق ئاچقۇچ كۆزەت تىزىملىكىڭىزنىڭ RSS قانىلىنى ھاسىل قىلالايدۇ.
-بۇ سۆز بۆلىكىنىڭ شىفىرلىق ئاچقۇچىنى بىلىدىغان ھەر قانداق كىشى سىزنىڭ كۆزەت تىزىملىكىڭىزنى ئوقۇيالايدۇ، شۇڭلاشقا بىخەتەر قىممەت ئىشلىتىڭ.
-بۇ جايدا ئىختىيارى ھاسىل قىلىنغان سانلىق قىممەت پايدىلىنىشىڭىز ئۈچۈن تەمىنلەندى: $1',
 'savedprefs' => 'مايىللىق تەڭشىكىڭىز ساقلاندى.',
 'timezonelegend' => 'ۋاقىت رايونى:',
 'localtime' => 'يەرلىك ۋاقىت:',
@@ -1241,7 +1216,6 @@ $1",
 'prefs-reset-intro' => 'سىز بۇ بەتنى ئىشلىتىپ تەڭشەكلىرىڭىزنى تور بېكەتنىڭ كۆڭۈلدىكى قىممىتىگە تەڭشىيەلەيسىز.
 بۇ مەشغۇلاتتىن يانغىلى بولمايدۇ.',
 'prefs-emailconfirm-label' => 'ئېلخەت جەزملەش:',
-'prefs-textboxsize' => 'تەھرىر كۆزنەك چوڭلۇقى',
 'youremail' => 'ئېلخەت:',
 'username' => '{{GENDER:$1|ئىشلەتكۇچى ئىسمى}}:',
 'uid' => '{{GENDER:$1|ئىشلەتكۇچى}} كىملىك:',
@@ -1492,7 +1466,6 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
 'recentchangeslinked-feed' => 'مۇناسىۋەتلىك ئۆزگەرتىشلەر',
 'recentchangeslinked-toolbox' => 'مۇناسىۋەتلىك ئۆزگەرتىشلەر',
 'recentchangeslinked-title' => '"$1" مۇناسىۋەتلىك ئۇلانما ئۆزگەردى',
-'recentchangeslinked-noresult' => 'بېرىلگەن ۋاقىتتا ئۇلانغان بەتلەردە ئۆزگىرىش يوق.',
 'recentchangeslinked-summary' => "بۇ ئالاھىدە بەت يۈزى كۆرسەتكەن بەتتىن ئۇلىنىپ چىققان يېقىنقى ئۆزگەرتىش تىزىملىكى (ياكى ئالاھىدە تۈرنىڭ ئەزاسى).
  [[Special:Watchlist|كۆزەت تىزىملىكىڭىز]] دىكى بەت يۈزى '''توم''' كۆرسىتىلىدۇ.",
 'recentchangeslinked-page' => 'بەت ئاتى:',
@@ -1726,7 +1699,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization',
 'http-read-error' => 'HTTP ئوقۇش خاتالىقى.',
 'http-timed-out' => 'HTTP ئىلتىماسى ۋاقىت ھالقىدى.',
 'http-curl-error' => 'URL ئاجراتقاندا خاتالىق كۆرۈلدى: $1',
-'http-host-unreachable' => 'URL غا ئۇلىشالمىدى.',
 'http-bad-status' => 'HTTP ئىلتىماس قىلغاندا مەسىلە كۆرۈلدى: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1880,12 +1852,6 @@ URL نىڭ توغرىلىقى ۋە تور بېكەتنى زىيارەت قىلى
 'statistics-users-active-desc' => 'ئالدىنقى {{PLURAL:$1|كۈن|$1 كۈن}} دىكى مەشغۇلات قىلغان ئىشلەتكۈچىلەر',
 'statistics-mostpopular' => 'ئەڭ كۆپ كۆرۈلگەن بەتلەر',
 
-'disambiguations' => 'ئىككى بىسلىق بەتكە ئۇلانغلىكبەتلەر.',
-'disambiguationspage' => 'Template:ئىككى بىسلىق بەت',
-'disambiguations-text' => "تۆۋەندىكى بەتلەر '''ئىككى بىسلىق بەت'''كە ئۇلانغان.
-ئەمما ئۇلار مۇۋاپىق ماۋزۇغا ئۇلىنىشى كېرەك ئىدى.<br />
-ئەگەر بىر بەت [[MediaWiki:Disambiguationspage]] غا ئۇلانغان بولسا ئىككى بىسلىق بەت دەپ قارىلىدۇ.",
-
 'doubleredirects' => 'قوش قايتا نىشانلانغان بەت',
 'doubleredirectstext' => 'بۇ بەتتە قايتا نىشانلانغان بەت يەنە بىر قايتا نىشانلانغان بەتنى نىشانغانلىق تىزىملىكى كۆرسىتىلدى.
 ھەر بىر قۇردا بىرىنچى ۋە ئىككىنچى قايتا نىشانلانغان بەتنىڭ ئۇلانمىسىنى شۇنداقلا ئىككىنچى قايتا نىشانلانغان بەتنىڭ نىشانىنى ئۆز ئىچىگە ئالىدۇ، ئادەتتە كۆرسىتىلىدىغىنى  "ھەقىقىي" نىشان بەت، مۇنداقچە ئېيتقاندا بىرىنچى نىشانلانغان بەت نىشانلايدىغان بەتتۇر.',
@@ -2136,10 +2102,9 @@ URL نىڭ توغرىلىقى ۋە تور بېكەتنى زىيارەت قىلى
 'unwatchthispage' => 'كۆزەتنى توختات',
 'notanarticle' => 'مەزمۇن بېتى ئەمەس',
 'notvisiblerev' => 'تۈزىتىلگەن نەشرى ئۆچۈرۈلدى',
-'watchnochange' => 'كۆرسەتكەن ۋاقىت بۆلىكىدە سىزنىڭ كۆزەت بېتىڭىزدە ئۆزگىرىش بولمىدى.',
 'watchlist-details' => 'كۆزەت تىزىملىكىڭىزدە {{PLURAL:$1|$1 بەت|$1 بەت}}  بار، مۇنازىرە بېتىنى ئۆز ئىچىگە ئالمايدۇ.',
-'wlheader-enotif' => '* ئېلخەتتە ئەسكەرتىش ئىقتىدارى قوزغىتىلدى.',
-'wlheader-showupdated' => "* سىز ئالدىنقى قېتىم كۆرگەندىن كېيىن ئۆزگەرتىلگەن بەتلەر '''توم''' كۆرۈنىدۇ",
+'wlheader-enotif' => 'ئېلخەتتە ئەسكەرتىش ئىقتىدارى قوزغىتىلدى.',
+'wlheader-showupdated' => "سىز ئالدىنقى قېتىم كۆرگەندىن كېيىن ئۆزگەرتىلگەن بەتلەر '''توم''' كۆرۈنىدۇ",
 'watchmethod-recent' => 'كۆزىتىۋاتقان بەتنىڭ يېقىنقى ئۆزگەرتىشىنى تەكشۈر',
 'watchmethod-list' => 'كۆزىتىۋاتقان بەتنىڭ يېقىنقى ئۆزگەرتىشىنى تەكشۈر',
 'watchlistcontains' => 'كۆزەت تىزىملىكىڭىزدە $1 {{PLURAL:$1|بەت|بەت}} بار.',
@@ -2553,12 +2518,9 @@ $1',
 ئەمما ئۇ $2 نىڭ چەكلەش دائىرىسى ئىچىدە، بۇ دائىرىنى چەكلەشتىن بىكار قىلغىلى بولىدۇ.',
 'ip_range_invalid' => 'IP دائىرىسى ئىناۋەتسىز.',
 'ip_range_toolarge' => '/$1 دىن چوڭ بولغان چەكلەش دائىرىسىگە يول قويۇلمايدۇ.',
-'blockme' => 'مېنى چەكلە',
 'proxyblocker' => 'ۋاكالەتچىنى چەكلىگۈچى',
-'proxyblocker-disabled' => 'بۇ ئىقتىدار چەكلەنگەن.',
 'proxyblockreason' => 'IP ئادرېسىڭىز ئوچۇق ۋاكالەتچى، ئۇ ئاللىبۇرۇن چەكلەنگەن.
 ئىنتېرنېت مۇلازىمىتى تەمىنلىگۈچى سودىگەر ياكى تېخنىكىلىق قوللىغۇچى بىلەن ئالاقىلىشىڭ ھەمدە ئۇلارغا بۇ ئېغىر بىخەتەرلىك مەسىلىسىنى ئۇقتۇرۇڭ.',
-'proxyblocksuccess' => 'تامام',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'IP ئادرېسىڭىز {{SITENAME}} دا DNSBL تەرىپىدىن ئوچۇق ۋاكالەتچى تىزىملىكىگە قوشۇلغان.',
 'sorbs_create_account_reason' => 'IP ئادرېسىڭىز {{SITENAME}} دا DNSBL تەرىپىدىن ئوچۇق ۋاكالەتچى تىزىملىكىگە قوشۇلغان.
@@ -2886,13 +2848,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/* CSS placed here will be applied to all skins */',
-'standard.css' => '/* CSS placed here will affect users of the Standard skin */',
-'nostalgia.css' => '/* CSS placed here will affect users of the Nostalgia skin */',
 'cologneblue.css' => '/* CSS placed here will affect users of the Cologne Blue skin */',
 'monobook.css' => '/* CSS placed here will affect users of the Monobook skin */',
-'myskin.css' => '/* CSS placed here will affect users of the MySkin skin */',
-'chick.css' => '/* CSS placed here will affect users of the Chick skin */',
-'simple.css' => '/* CSS placed here will affect users of the Simple skin */',
 'modern.css' => '/* CSS placed here will affect users of the Modern skin */',
 'vector.css' => '/* CSS placed here will affect users of the Vector skin */',
 'print.css' => '/* CSS placed here will affect the print output */',
@@ -2904,13 +2861,8 @@ $1',
 
 # Scripts
 'common.js' => '/* Any JavaScript here will be loaded for all users on every page load. */',
-'standard.js' => '/* Any JavaScript here will be loaded for users using the Standard skin */',
-'nostalgia.js' => '/* Any JavaScript here will be loaded for users using the Nostalgia skin */',
 'cologneblue.js' => '/* Any JavaScript here will be loaded for users using the Cologne Blue skin */',
 'monobook.js' => '/* Any JavaScript here will be loaded for users using the MonoBook skin */',
-'myskin.js' => '/* Any JavaScript here will be loaded for users using the MySkin skin */',
-'chick.js' => '/* Any JavaScript here will be loaded for users using the Chick skin */',
-'simple.js' => '/* Any JavaScript here will be loaded for users using the Simple skin */',
 'modern.js' => '/* Any JavaScript here will be loaded for users using the Modern skin */',
 'vector.js' => '/* Any JavaScript here will be loaded for users using the Vector skin */',
 'group-autoconfirmed.js' => '/* Any JavaScript here will be loaded for autoconfirmed users only */',
@@ -2990,13 +2942,8 @@ $1',
 'pageinfo-category-files' => 'ھۆججەت سانى',
 
 # Skin names
-'skinname-standard' => 'Classic',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Cologne Blue',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -3147,7 +3094,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'كەڭلىك',
 'exif-imagelength' => 'ئېگىزلىك',
 'exif-bitspersample' => 'ھەر بىر نۇقتىنىڭ بىت سانى',
@@ -3325,7 +3272,7 @@ Variants for Chinese language
 'exif-originalimageheight' => 'كېسىشتىن ئىلگىرىكى سۈرەتنىڭ ئېگىزلىكى',
 'exif-originalimagewidth' => 'كېسىشتىن ئىلگىرىكى سۈرەتنىڭ كەڭلىكى',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'پرىسلانمىغان',
 'exif-compression-2' => 'CCITT 3-گۇرۇپپا بىر ئۆلچەملىك ئۆزگەرتىلگەن خۇفمان ئىجرا كودلىنىشى',
 'exif-compression-3' => 'CCITT نىڭ 3-گۇرۇپپا فاكس كودلىنىشى',
@@ -3716,7 +3663,6 @@ $5
 'version-other' => 'باشقا',
 'version-mediahandlers' => 'ۋاسىتە بىر تەرەپ قىلغۇچ',
 'version-hooks' => 'ئىلمەك',
-'version-extension-functions' => 'تەھلىلچى فونكسىيە',
 'version-parser-extensiontags' => 'تەھلىلچى كېڭەيتىلمە خەتكۈچ',
 'version-parser-function-hooks' => 'تەھلىلچى فونكسىيە ئىلمىكى',
 'version-hook-name' => 'ئىلمەك ئاتى',
@@ -3738,13 +3684,6 @@ MediaWiki ئىشلىتىش مەقسىتىنى ئاساس قىلىپ ئېلان 
 'version-entrypoints-header-entrypoint' => 'كىرىش نۇقتىسى',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'ھۆججەت يولى',
-'filepath-page' => 'ھۆججەت:',
-'filepath-submit' => 'يۆتكەل',
-'filepath-summary' => '!بۇ ئالاھىدە بەت ھۆججەتنىڭ تولۇق يولىنى قايتۇرىدۇ.
-سۈرەت تولۇق ئېنىقلىقتا كۆرسىتىلىدۇ، باشقا ھۆججەت تىپى بىۋاسىتە ئۇلانغان قوللىنىشچان پروگراممىدا ئېچىلىدۇ',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'تەكرار ھۆججەت ئىزدە',
 'fileduplicatesearch-summary' => 'چاچما (hash) قىممىتىگە ئاساسەن تەكرار ھۆججەت ئىزدە.',
diff --git a/languages/messages/MessagesUk.php b/languages/messages/MessagesUk.php
index 4b1c0c0d..da3ebcd5 100644
--- a/languages/messages/MessagesUk.php
+++ b/languages/messages/MessagesUk.php
@@ -14,6 +14,7 @@
  * @author Aleksandrit
  * @author Alex Khimich
  * @author AlexSm
+ * @author Amire80
  * @author Andrijko Z.
  * @author Andriykopanytsia
  * @author Arturyatsko
@@ -34,6 +35,7 @@
  * @author Kalan
  * @author Matma Rex
  * @author Microcell
+ * @author Nemo bis
  * @author NickK
  * @author Olvin
  * @author Prima klasy4na
@@ -170,6 +172,7 @@ $specialPageAliases = array(
 	'PermanentLink'             => array( 'Постійне_посилання' ),
 	'Popularpages'              => array( 'Популярні_сторінки' ),
 	'Preferences'               => array( 'Налаштування' ),
+	'Prefixindex'               => array( 'Покажчик_за_початком_назви' ),
 	'Protectedpages'            => array( 'Захищені_сторінки' ),
 	'Protectedtitles'           => array( 'Захищені_назви_сторінок' ),
 	'Randompage'                => array( 'Випадкова_сторінка' ),
@@ -313,7 +316,7 @@ $magicWords = array(
 	'revisionmonth1'            => array( '1', 'МІСЯЦЬ_ВЕРСІЇ_1', 'МЕСЯЦ_ВЕРСИИ_1', 'REVISIONMONTH1' ),
 	'revisionyear'              => array( '1', 'РІК_ВЕРСІЇ', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
 	'revisiontimestamp'         => array( '1', 'МІТКА_ЧАСУ_ВЕРСІЇ', 'ОТМЕТКА_ВРЕМЕНИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
-	'revisionuser'              => array( '1', 'ВЕРСІЯ_КОРИСТУВАЧА', 'ВЕРСИЯ_УЧАСНИКА', 'ВЕРСИЯ_УЧАСТНИКА', 'REVISIONUSER' ),
+	'revisionuser'              => array( '1', 'ВЕРСІЯ_КОРИСТУВАЧА', 'ВЕРСИЯ_УЧАСТНИКА', 'REVISIONUSER' ),
 	'plural'                    => array( '0', 'МНОЖИНА:', 'МНОЖЕСТВЕННОЕ_ЧИСЛО:', 'PLURAL:' ),
 	'fullurl'                   => array( '0', 'ПОВНА_АДРЕСА:', 'ПОЛНЫЙ_АДРЕС:', 'FULLURL:' ),
 	'fullurle'                  => array( '0', 'ПОВНА_АДРЕСА_2:', 'ПОЛНЫЙ_АДРЕС_2:', 'FULLURLE:' ),
@@ -390,9 +393,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Показувати число користувачів, які додали сторінку до свого списку спостереження',
 'tog-oldsig' => 'Існуючий підпис:',
 'tog-fancysig' => 'Власна вікі-розмітка підпису (без автоматичного посилання)',
-'tog-externaleditor' => "Використовувати зовнішній редактор за умовчанням (тільки для досвідчених користувачів, вимагає спеціальних налаштувань вашого комп'ютера [//www.mediawiki.org/wiki/Manual:External_editors Детальніше.])",
-'tog-externaldiff' => "Використовувати зовнішню програму порівняння версій за умовчанням (тільки для експертів, вимагає спеціальних налаштувань вашого комп'ютера. [//www.mediawiki.org/wiki/Manual:External_editors Детальніше.])",
-'tog-showjumplinks' => 'Активізувати допоміжні посилання «перейти до»',
 'tog-uselivepreview' => 'Використовувати швидкий попередній перегляд (експериментально)',
 'tog-forceeditsummary' => 'Попереджати, коли не зазначений короткий опис редагування',
 'tog-watchlisthideown' => 'Приховати мої редагування у списку спостереження',
@@ -406,6 +406,8 @@ $messages = array(
 'tog-showhiddencats' => 'Показувати приховані категорії',
 'tog-noconvertlink' => 'Вимкнути конвертацію назви посилання',
 'tog-norollbackdiff' => 'Не показувати різницю версій після виконання відкоту',
+'tog-useeditwarning' => 'Попереджати мене, якщо я залишаю сторінку редагування з незбереженими змінами',
+'tog-prefershttps' => "Завжди використовувати безпечне з'єднання при вході у систему",
 
 'underline-always' => 'Завжди',
 'underline-never' => 'Ніколи',
@@ -469,6 +471,18 @@ $messages = array(
 'oct' => 'жов',
 'nov' => 'лис',
 'dec' => 'груд',
+'january-date' => '$1 січня',
+'february-date' => '$1 лютого',
+'march-date' => '$1 березня',
+'april-date' => '$1 квітня',
+'may-date' => '$1 травня',
+'june-date' => '$1 червня',
+'july-date' => '$1 липня',
+'august-date' => '$1 серпня',
+'september-date' => '$1 вересня',
+'october-date' => '$1 жовтня',
+'november-date' => '$1 листопада',
+'december-date' => '$1 грудня',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категорія|Категорії}}',
@@ -490,7 +504,7 @@ $messages = array(
 'broken-file-category' => 'Сторінки, що посилаються на неіснуючі файли',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
-'linkprefix' => '/^(.*?)(„|«)$/sD',
+'linkprefix' => '/^((?>.*(?<!(?:„|«)$)))(.+)$/sDu',
 
 'about' => 'Про',
 'article' => 'Стаття',
@@ -553,6 +567,7 @@ $messages = array(
 'create-this-page' => 'Створити цю сторінку',
 'delete' => 'Вилучити',
 'deletethispage' => 'Вилучити цю сторінку',
+'undeletethispage' => 'Відновити цю сторінку',
 'undelete_short' => 'Відновити $1 {{PLURAL:$1|редагування|редагування|редагувань}}',
 'viewdeleted_short' => 'Переглянути {{PLURAL:$1|одне вилучене редагування|$1 вилучених редагування|$1 вилучених редагувань}}',
 'protect' => 'Захистити',
@@ -596,7 +611,7 @@ $1',
 'pool-queuefull' => 'Сервер запитів заповнений',
 'pool-errorunknown' => 'Невідома помилка',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Про {{grammar:accusative|{{SITENAME}}}}',
 'aboutpage' => 'Project:Про',
 'copyright' => 'Вміст доступний на умовах $1, якщо не вказано інше.',
@@ -606,7 +621,6 @@ $1',
 'disclaimers' => 'Відмова від відповідальності',
 'disclaimerpage' => 'Project:Відмова від відповідальності',
 'edithelp' => 'Довідка про редагування',
-'edithelppage' => 'Help:Редагування',
 'helppage' => 'Help:Довідка',
 'mainpage' => 'Головна сторінка',
 'mainpage-description' => 'Головна сторінка',
@@ -636,7 +650,6 @@ $1',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|остання зміна|останні зміни|останніх змін}}',
 'youhavenewmessagesmulti' => 'Ви отримали нові повідомлення на $1',
 'editsection' => 'ред.',
-'editsection-brackets' => '[$1]',
 'editold' => 'ред.',
 'viewsourceold' => 'переглянути вихідний код',
 'editlink' => 'редагувати',
@@ -688,17 +701,12 @@ $1',
 # General errors
 'error' => 'Помилка',
 'databaseerror' => 'Помилка бази даних',
-'dberrortext' => 'Знайдено синтаксичну помилку в запиті до бази даних.
-Це може вказувати на помилку в програмному забезпеченні.
-Останній запит до бази даних:
-<blockquote><code>$1</code></blockquote>
-відбувся з функції "<code>$2</code>".
-База даних виявила помилку "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Знайдено синтаксичну помилку в запиті до бази даних.
-Останній запит до бази даних:
-«$1»
-відбувся з функції «$2».
-База даних виявила помилку «$3: $4».',
+'databaseerror-text' => 'При запиті до бази даних сталася помилка.
+Це може вказувати на помилку у програмному забезпеченні.',
+'databaseerror-textcl' => 'При запиті до бази даних сталася помилка.',
+'databaseerror-query' => 'Запит: $1',
+'databaseerror-function' => 'Функція: $1',
+'databaseerror-error' => 'Помилка: $1',
 'laggedslavemode' => 'Увага: сторінка може не містити останніх редагувань.',
 'readonly' => 'Запис до бази даних заблокований',
 'enterlockreason' => 'Зазначте причину і приблизний термін блокування',
@@ -732,6 +740,7 @@ $1',
 'cannotdelete-title' => 'Не вдається видалити сторінку «$1»',
 'delete-hook-aborted' => 'Вилучення було скасовано процедурою-перехоплювачем. 
 Ніяких поясненень надано не було.',
+'no-null-revision' => 'Не вдалося створити нульову версію сторінки «$1»',
 'badtitle' => 'Неприпустима назва',
 'badtitletext' => 'Запитана назва сторінки неправильна, порожня, або неправильно зазначена міжмовна чи міжвікі назва.
 Можливо, в назві використовуються недопустимі символи.',
@@ -750,11 +759,14 @@ $1',
 'viewyourtext' => "Ви можете переглянути та скопіювати текст '''ваших редагувань''' на цій сторінці:",
 'protectedinterface' => 'Ця сторінка є частиною інтерфейсу програмного забезпечення цієї вікі і її можуть редагувати лише адміністратори проекту. Щоб додати або змінити переклади для усіх вікі, відвідайте [//translatewiki.net/ translatewiki.net], проект локалізації MediaWiki.',
 'editinginterface' => "'''Увага:''' Ви редагуєте сторінку, що є частиною текстового інтерфейсу. Зміни цієї сторінки спричинять зміну інтерфейсу для інших користувачів. Для перекладу повідомлення використовуйте [//translatewiki.net/wiki/Main_Page?setlang=uk translatewiki.net] — проект, що займається локалізацією MediaWiki.",
-'sqlhidden' => '(SQL запит приховано)',
 'cascadeprotected' => 'Сторінка захищена від змін, оскільки її включено до {{PLURAL:$1|сторінки, для якої|наступних сторінок, для яких}} установлено каскадний захист: $2',
 'namespaceprotected' => 'У вас нема дозволу редагувати сторінки в просторі назв «$1».',
 'customcssprotected' => 'У вас немає прав на редагування цієї CSS-сторінки, так як вона містить особисті налаштування іншого користувача.',
 'customjsprotected' => 'У вас немає дозволу на редагування цієї JavaScript-сторінки, так як вона містить особисті налаштування іншого користувача.',
+'mycustomcssprotected' => 'У вас немає прав для редагування цієї CSS сторінки.',
+'mycustomjsprotected' => 'Ви не маєте дозволу для редагування цієї сторінки JavaScript.',
+'myprivateinfoprotected' => 'У Вас немає дозволу на редагування своєї приватної інформації.',
+'mypreferencesprotected' => 'У Вас немає дозволу на редагування своїх налаштувань.',
 'ns-specialprotected' => 'Спеціальні сторінки не можна редагувати.',
 'titleprotected' => "Створення сторінки з такою назвою було заборонене користувачем [[User:$1|$1]].
 Зазначена наступна причина: ''$2''.",
@@ -778,10 +790,19 @@ $1',
 'welcomecreation-msg' => 'Ваш акаунт було створено.
 Не забудьте змінити свої [[Special:Preferences|налаштування у {{GRAMMAR:genitive|{{SITENAME}}}}]].',
 'yourname' => "Ім'я користувача:",
+'userlogin-yourname' => "Ім'я користувача",
+'userlogin-yourname-ph' => "Введіть ім'я користувача",
+'createacct-another-username-ph' => "Введіть ім'я користувача",
 'yourpassword' => 'Пароль:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Введіть ваш пароль',
+'createacct-yourpassword-ph' => 'Введіть пароль',
 'yourpasswordagain' => 'Повторний набір пароля:',
+'createacct-yourpasswordagain' => 'Підтвердіть пароль',
+'createacct-yourpasswordagain-ph' => 'Введіть пароль знову',
 'remembermypassword' => "Запам'ятати мій обліковий запис на цьому комп'ютері (на строк не більше $1 {{PLURAL:$1|дня|днів}})",
-'securelogin-stick-https' => 'Залишайтись підключенним через HTTPS після входу',
+'userlogin-remembermypassword' => "Запам'ятати мене",
+'userlogin-signwithsecure' => "Захищене з'єднання",
 'yourdomainname' => 'Ваш домен:',
 'password-change-forbidden' => 'Ви не можна змінити пароль на цій вікі.',
 'externaldberror' => 'Сталася помилка при автентифікації за допомогою зовнішньої бази даних, або у вас недостатньо прав для внесення змін до свого зовнішнього облікового запису.',
@@ -793,18 +814,44 @@ $1',
 'logout' => 'Вихід із системи',
 'userlogout' => 'Вихід із системи',
 'notloggedin' => 'Ви не ввійшли до системи',
+'userlogin-noaccount' => 'Немає облікового запису?',
+'userlogin-joinproject' => 'Приєднатися до {{GRAMMAR:genitive|{{SITENAME}}}}',
 'nologin' => 'Ви ще не зареєструвались? $1.',
 'nologinlink' => 'Створіть обліковий запис',
 'createaccount' => 'Зареєструватися',
 'gotaccount' => "Ви вже зареєстровані? '''$1'''.",
 'gotaccountlink' => 'Увійдіть',
 'userlogin-resetlink' => 'Забули дані, потрібні для входу?',
+'userlogin-resetpassword-link' => 'Скинути пароль',
+'helplogin-url' => 'Help:Вхід до системи',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Допомога в реєстрації]]',
+'userlogin-loggedin' => 'Ви вже увійшли як {{GENDER:$1|$1}}.
+Використайте нижче форму для входу як інший користувач.',
+'userlogin-createanother' => 'Створити інший обліковий запис',
+'createacct-join' => 'Введіть вашу інформацію нижче.',
+'createacct-another-join' => 'Введіть нижче дані нового облікового запису.',
+'createacct-emailrequired' => 'Адреса електронної пошти',
+'createacct-emailoptional' => "Адреса електронної пошти (не обов'язково)",
+'createacct-email-ph' => 'Введіть Вашу адресу електронної пошти',
+'createacct-another-email-ph' => 'Введіть адресу електронної пошти',
 'createaccountmail' => 'Використати тимчасовий випадковий пароль і надіслати його на вказану адресу електронної пошти',
+'createacct-realname' => "Справжнє ім'я (не обов'язково)",
 'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-reason-ph' => 'Чому Ви створюєте інший обліковий запис',
+'createacct-captcha' => 'Перевірка безпеки',
+'createacct-imgcaptcha-ph' => 'Введіть текст, що Ви бачите вище',
+'createacct-submit' => 'Створіть Ваш обліковий запис',
+'createacct-another-submit' => 'Створити інший обліковий запис',
+'createacct-benefit-heading' => '{{SITENAME}} створюється такими ж людьми, як і ви.',
+'createacct-benefit-body1' => '{{PLURAL:$1|редагування|редагування|редагувань}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|сторінка|сторінки|сторінок}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|дописувач|дописувачі|дописувачів}} цього місяця',
 'badretype' => 'Уведені вами паролі не збігаються.',
 'userexists' => "Уведене ім'я користувача вже існує.
 Будь ласка оберіть інше ім'я.",
 'loginerror' => 'Помилка при вході до системи',
+'createacct-error' => 'Помилка створення облікового запису',
 'createaccounterror' => 'Не в змозі створити обліковий запис: $1',
 'nocookiesnew' => 'Користувач зареєструвався, але не ввійшов до системи.
 {{SITENAME}} використовує куки для входу до системи.
@@ -870,10 +917,12 @@ $1',
 Проігноруйте дане повідомлення, якщо обліковий запис було створено помилково.',
 'usernamehasherror' => "Ім'я користувача не може містити символу «решітка»",
 'login-throttled' => 'Ви зробили надто багато спроб ввійти до системи.
-Будь ласка, зачекайте перед повторною спробою.',
+Будь ласка, зачекайте $1 перед повторною спробою.',
 'login-abort-generic' => 'Не вдалося ввійти до системи',
 'loginlanguagelabel' => 'Мова: $1',
 'suspicious-userlogout' => 'Ваш запит на завершення сеанса відхилений, оскільки він схожий на запит, відправлений зіпсованим веб-оглядачем або кешуючим проксі-сервером.',
+'createacct-another-realname-tip' => "Справжнє ім'я є необов'язковим.
+Якщо ви вирішите надати його, то воно буде використовуватися для присвоєння користувачу авторства до його роботи.",
 
 # Email sending
 'php-mail-error-unknown' => 'Невідома помилка в PHP-функції mail()',
@@ -889,8 +938,7 @@ $1',
 'newpassword' => 'Новий пароль:',
 'retypenew' => 'Ще раз введіть новий пароль:',
 'resetpass_submit' => 'Установити пароль і ввійти',
-'resetpass_success' => 'Ваш пароль вже успішно змінено!
-Зараз входимо…',
+'changepassword-success' => 'Ваш пароль успішно змінено!',
 'resetpass_forbidden' => 'Пароль не можна змінювати',
 'resetpass-no-info' => 'Щоб звертатися безпосередньо до цієї сторінки, вам слід увійти до системи.',
 'resetpass-submit-loggedin' => 'Змінити пароль',
@@ -902,10 +950,11 @@ $1',
 
 # Special:PasswordReset
 'passwordreset' => 'Скинути пароль',
-'passwordreset-text' => 'Заповніть цю форму для відновлення пароля.',
+'passwordreset-text-one' => 'Заповніть цю форму для відновлення пароля.',
+'passwordreset-text-many' => '{{PLURAL:$1|Заповніть одне з полів для скидання пароля.}}',
 'passwordreset-legend' => 'Перевстановити пароль',
 'passwordreset-disabled' => 'У цій вікі вимкнена можливість скидання пароля.',
-'passwordreset-pretext' => '{{PLURAL:$1||Введіть одну з частин даних}}',
+'passwordreset-emaildisabled' => 'Функції електронної пошти вимкнуто в цій вікі.',
 'passwordreset-username' => "Ім'я користувача:",
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Продивитись результуючий електронний лист?',
@@ -928,7 +977,7 @@ $2
 Тимчасовий пароль: $2",
 'passwordreset-emailsent' => 'Електронний лист для відновлення пароля відправлений.',
 'passwordreset-emailsent-capture' => 'Електронний лист скидання паролю було надіслано, як показано нижче.',
-'passwordreset-emailerror-capture' => 'Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання користувачеві $1 не вдалося.',
+'passwordreset-emailerror-capture' => 'Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання {{GENDER:$2|користувачеві|користувачці}} $1 не вдалося.',
 
 # Special:ChangeEmail
 'changeemail' => 'Змінити адресу електронної пошти',
@@ -942,6 +991,18 @@ $2
 'changeemail-submit' => 'Змінити адресу електронної пошти',
 'changeemail-cancel' => 'Скасувати',
 
+# Special:ResetTokens
+'resettokens' => 'Скидання жетонів',
+'resettokens-text' => "Ви можете скинути жетони, що забезпечують доступ до певних особистих даних, пов'язаних тут із Вашим обліковим записом.
+Вам слід це зробити, якщо Ви випадково поділились жетонами з кимось, або якщо Ваш обліковий запис було зламано.",
+'resettokens-no-tokens' => 'Немає жетонів до скидання.',
+'resettokens-legend' => 'Скинути жетони',
+'resettokens-tokens' => 'Жетони:',
+'resettokens-token-label' => '$1 (поточне значення: $2)',
+'resettokens-watchlist-token' => 'Маркер стрічки новин (Atom/RSS) з [[Special:Watchlist|змін на сторінку у вашому списку спостереження]]',
+'resettokens-done' => 'Жетони скинуто.',
+'resettokens-resetbutton' => 'Скинути обрані жетони',
+
 # Edit page toolbar
 'bold_sample' => 'Жирний текст',
 'bold_tip' => 'Жирний текст',
@@ -1146,12 +1207,15 @@ $2
 Імовірно, вона була вилучена.',
 'edit-conflict' => 'Конфлікт редагувань.',
 'edit-no-change' => 'Ваше редагування відхилене, оскільки в тексті не було зроблено змін.',
+'postedit-confirmation' => 'Ваше редагування збережено',
 'edit-already-exists' => 'Неможливо створити нову сторінку.
 Вона вже існує.',
 'defaultmessagetext' => 'Текст «за замовчування»',
 'content-failed-to-parse' => 'Не вдалось проаналізувати $2 як тип $1: $3',
 'invalid-content-data' => 'Неприпустимі дані',
 'content-not-allowed-here' => 'Вміст «$1» недопустимий на сторінці [[$2]]',
+'editwarning-warning' => 'Перехід на іншу сторінку призведе до втрати ваших змін.
+Якщо ви ввійшли до системи, то ви можете відключити це попередження в розділі «Редагування» ваших налаштувань.',
 
 # Content models
 'content-model-wikitext' => 'вікітекст',
@@ -1187,6 +1251,7 @@ $2
 'undo-failure' => 'Неможливо скасувати редагування через несумісність проміжних змін.',
 'undo-norev' => 'Редагування не може бути скасоване, бо воно не існує або було вилучене.',
 'undo-summary' => 'Скасування редагування № $1 користувача [[Special:Contributions/$2|$2]] ([[User talk:$2|обговорення]])',
+'undo-summary-username-hidden' => 'Скасувати перевірку $1 прихованого користувача',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Неможливо створити обліковий запис',
@@ -1367,6 +1432,7 @@ $1",
 'compareselectedversions' => 'Порівняти вибрані версії',
 'showhideselectedversions' => 'Показати/приховати обрані версії',
 'editundo' => 'скасувати',
+'diff-empty' => '(Немає відмінностей)',
 'diff-multi' => '({{PLURAL:$1|Одна проміжна версія одного користувача не показана|$1 проміжні версії {{PLURAL:$2|одного користувача|$2 користувачів}} не показані|$1 проміжних версій {{PLURAL:$2|одного користувача|$2 користувачів}} не показані}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|не показана $1 проміжна я версія|не показані $1 проміжні версії|не показано $1 проміжних версій}}, зроблених більш, ніж {{PLURAL:$2|$1 користувачем|$2 користувачами}})',
 'difference-missing-revision' => '{{PLURAL:$2|$2 версія|$2 версії|$2 версій}} для цього порівняння ($1) не {{PLURAL:$2|знайдена|знайдені}}.
@@ -1394,7 +1460,6 @@ $1",
 'searchmenu-legend' => 'Параметри пошуку',
 'searchmenu-exists' => "'''У цій вікі є сторінка з назвою «[[:$1]]»'''",
 'searchmenu-new' => "'''Створити сторінку «[[:$1]]» у цій вікі!'''",
-'searchhelp-url' => 'Help:Довідка',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Показати сторінки з цим префіксом]]',
 'searchprofile-articles' => 'Статті',
 'searchprofile-project' => 'Сторінки довідки і проекту',
@@ -1435,15 +1500,7 @@ $1",
 'powersearch-togglenone' => 'Жодний',
 'search-external' => 'Зовнішній пошук',
 'searchdisabled' => '<p>Вибачте, повнотекстовий пошук тимчасово недоступний через перевантаження сервера; передбачається, що ця функція буде знову включена після установки нового обладнання. Поки що ми пропонуємо вам скористатися Google чи Yahoo!:</p>',
-
-# Quickbar
-'qbsettings' => 'Панель навігації',
-'qbsettings-none' => 'Не показувати панель',
-'qbsettings-fixedleft' => 'Фіксована ліворуч',
-'qbsettings-fixedright' => 'Фіксована праворуч',
-'qbsettings-floatingleft' => 'Плаваюча ліворуч',
-'qbsettings-floatingright' => 'Плаваюча праворуч',
-'qbsettings-directionality' => 'Фіксована, залежно від напрямку письма вашої мови',
+'search-error' => 'Сталася помилка під час пошуку:$1',
 
 # Preferences page
 'preferences' => 'Налаштування',
@@ -1477,7 +1534,6 @@ $1",
 'resetprefs' => 'Скасувати незбережені зміни',
 'restoreprefs' => 'Відновити всі стандартні налаштування (у всіх розділах)',
 'prefs-editing' => 'Редагування',
-'prefs-edit-boxsize' => 'Розмір вікна редагування.',
 'rows' => 'Рядків:',
 'columns' => 'Колонок:',
 'searchresultshead' => 'Пошук',
@@ -1488,9 +1544,9 @@ $1",
 'recentchangesdays-max' => '(максимум $1 {{PLURAL:$1|день|дні|днів}})',
 'recentchangescount' => 'Кількість редагувань для показу за умовчанням:',
 'prefs-help-recentchangescount' => 'Це стосується нових редагувань, історій сторінок і журналів.',
-'prefs-help-watchlist-token' => 'Заповнення цього поля секретним ключем буде створювати RSS-трансляцію для вашого списку спостереження.
-Кожен, хто знає ключ в цьому полі, зможе читати ваш список спостереження, тому оберіть секретне значення.
-Ви можете використати це випадково згенероване значення: $1',
+'prefs-help-watchlist-token2' => 'Це секретний ключ до веб-каналу вашого списку спостереження.
+Будь-хто, хто його знає, матиме можливість читати ваш список спостереження, тому не поширюйте його.
+[[Special:ResetTokens|Натисніть тут, якщо вам потрібно скинути його]].',
 'savedprefs' => 'Ваші налаштування збережено.',
 'timezonelegend' => 'Часовий пояс:',
 'localtime' => 'Місцевий час:',
@@ -1521,7 +1577,6 @@ $1",
 'prefs-reset-intro' => 'Ця сторінка може бути використана для зміни ваших налаштувань на стандартні.
 Після виконання цієї дії ви не зможете відкотити зміни.',
 'prefs-emailconfirm-label' => 'Підтвердження електронної пошти:',
-'prefs-textboxsize' => 'Розмір вікна редагування',
 'youremail' => 'Адреса електронної пошти:',
 'username' => "{{GENDER:$1|Ім'я користувача|Ім'я користувачки}}:",
 'uid' => 'Ідентифікатор {{GENDER:$1|користувача}}:',
@@ -1557,6 +1612,8 @@ $1",
 'prefs-dateformat' => 'Формат дати',
 'prefs-timeoffset' => 'Зсув часу',
 'prefs-advancedediting' => 'Загальні параметри',
+'prefs-editor' => 'Редактор',
+'prefs-preview' => 'Попередній перегляд',
 'prefs-advancedrc' => 'Розширені налаштування',
 'prefs-advancedrendering' => 'Розширені налаштування',
 'prefs-advancedsearchoptions' => 'Розширені налаштування',
@@ -1564,7 +1621,9 @@ $1",
 'prefs-displayrc' => 'Налаштування показу',
 'prefs-displaysearchoptions' => 'Налаштування показу',
 'prefs-displaywatchlist' => 'Налаштування показу',
+'prefs-tokenwatchlist' => 'Жетон',
 'prefs-diffs' => 'Різниці версій',
+'prefs-help-prefershttps' => 'Цей параметр набуде чинності при вашому наступному вході у систему.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Адреса електронної пошти є чинною',
@@ -1592,6 +1651,8 @@ $1",
 'userrights-changeable-col' => 'Групи, які ви можете змінити',
 'userrights-unchangeable-col' => 'Групи, які ви не можете змінити',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Конфлікт зміни прав користувача! Будь ласка, перевірте та  підтвердіть зміни знову.',
+'userrights-removed-self' => 'Ви успішно позбавили себе власних прав. Через це Ви більше не маєте доступу до цієї сторінки.',
 
 # Groups
 'group' => 'Група:',
@@ -1657,11 +1718,19 @@ $1",
 'right-proxyunbannable' => 'Уникнення автоматичного блокування проксі-серверів',
 'right-unblockself' => 'Розблоковувати себе',
 'right-protect' => 'Зміна рівнів захисту та редагування захищених каскадно сторінок',
-'right-editprotected' => 'Редагування захищених сторінок (без каскадного захисту)',
+'right-editprotected' => 'Редагування сторінок з рівнем захисту "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'Редагування сторінок з рівнем захисту "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'Редагування інтерфейсу користувача',
 'right-editusercssjs' => 'Редагування CSS- і JS-файлів інших користувачів',
 'right-editusercss' => 'Редагування CSS-файлів інших користувачів',
 'right-edituserjs' => 'Редагування JS-файлів інших користувачів',
+'right-editmyusercss' => 'Редагування власних CSS-файлів користувача',
+'right-editmyuserjs' => 'Редагування власних JavaScript-файлів користувача',
+'right-viewmywatchlist' => 'Переглядати власний список спостереження',
+'right-editmywatchlist' => 'Редагувати власний список спостереження. Зверніть увагу, що деякі дії будуть додавати сторінки навіть без такого права.',
+'right-viewmyprivateinfo' => "Перегляд власних приватних даних (напр., адреса електронної пошти, справжнє ім'я)",
+'right-editmyprivateinfo' => "Редагування власних приватних даних (напр., адреса електронної пошти, справжнє ім'я)",
+'right-editmyoptions' => 'Редагування власних налаштувань',
 'right-rollback' => 'Швидкий відкіт редагувань останнього користувача, який редагував сторінку',
 'right-markbotedits' => 'Позначення відкинутих редагувань як редагування бота',
 'right-noratelimit' => 'Нема обмежень за швидкістю',
@@ -1723,12 +1792,19 @@ $1",
 'action-userrights-interwiki' => 'зміну прав користувачів у інших вікі',
 'action-siteadmin' => 'блокування і розблоковування баз даних',
 'action-sendemail' => 'відправка електронної пошти',
+'action-editmywatchlist' => 'редагування Вашого списку спостереження',
+'action-viewmywatchlist' => 'перегляд власного списку спостереження',
+'action-viewmyprivateinfo' => 'перегляд своєї приватної інформації',
+'action-editmyprivateinfo' => 'редагування своєї приватної інформації',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|зміна|зміни|змін}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|зміна з останнього візиту|зміни з останнього візиту|змін з останнього візиту}}',
+'enhancedrc-history' => 'історія',
 'recentchanges' => 'Нові редагування',
 'recentchanges-legend' => 'Налаштування нових редагувань',
 'recentchanges-summary' => 'Відстеження останніх змін на сторінках {{grammar:genitive|{{SITENAME}}}}.',
+'recentchanges-noresult' => 'Немає змін за даний період, що відповідають цим критеріям.',
 'recentchanges-feed-description' => 'Відстежувати останні зміни у вікі в цьому потоці.',
 'recentchanges-label-newpage' => 'Цим редагуванням створена нова сторінка',
 'recentchanges-label-minor' => 'Це незначна зміна',
@@ -1767,7 +1843,6 @@ $1",
 'recentchangeslinked-feed' => "Пов'язані редгування",
 'recentchangeslinked-toolbox' => "Пов'язані редагування",
 'recentchangeslinked-title' => "Пов'язані редагування для «$1»",
-'recentchangeslinked-noresult' => "На пов'язаних сторінках не було змін протягом зазначеного періоду.",
 'recentchangeslinked-summary' => "Це список нещодавніх змін на сторінках, на які посилається зазначена сторінка (або на сторінках, що містяться в цій категорії).
 Сторінки з [[Special:Watchlist|вашого списку спостереження]] виділено '''жирним шрифтом'''.",
 'recentchangeslinked-page' => 'Назва сторінки:',
@@ -1779,7 +1854,7 @@ $1",
 'reuploaddesc' => 'Повернутися до форми завантаження',
 'upload-tryagain' => 'Зберегти змінений опис файлу',
 'uploadnologin' => 'Ви не ввійшли в систему',
-'uploadnologintext' => 'Ви повинні [[Special:UserLogin|ввійти до системи]], щоб завантажувати файли.',
+'uploadnologintext' => 'Ви повинні $1, щоб завантажувати файли.',
 'upload_directory_missing' => 'Директорія для завантажень ($1) відсутня і не може бути створена веб-сервером.',
 'upload_directory_read_only' => 'Веб-сервер не має прав запису в папку ($1), в якій планується зберігати завантажувані файли.',
 'uploaderror' => 'Помилка завантаження файлу',
@@ -2012,7 +2087,6 @@ $1',
 'http-read-error' => 'Помилка читання HTTP.',
 'http-timed-out' => 'Перевищення часу очікування HTTP-запиту.',
 'http-curl-error' => 'Помилка звертання до URL: $1',
-'http-host-unreachable' => 'Неможливо досягнути вказану URL-адресу.',
 'http-bad-status' => 'Під час HTTP-запиту виникла проблема: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2042,6 +2116,10 @@ $1',
 'listfiles_size' => 'Розмір (в байтах)',
 'listfiles_description' => 'Опис',
 'listfiles_count' => 'Версії',
+'listfiles-show-all' => 'Включати старі версії зображень',
+'listfiles-latestversion' => 'Поточна версія',
+'listfiles-latestversion-yes' => 'Так',
+'listfiles-latestversion-no' => 'Ні',
 
 # File description page
 'file-anchor-link' => 'Файл',
@@ -2139,6 +2217,13 @@ $1',
 'randompage' => 'Випадкова стаття',
 'randompage-nopages' => 'Нема сторінок в {{PLURAL:$2|просторі назв|просторах назв}} $1.',
 
+# Random page in category
+'randomincategory' => 'Випадкова сторінка у категорії',
+'randomincategory-invalidcategory' => '" $1 " не є дійсним іменем категорії.',
+'randomincategory-nopages' => 'У [[:Category:$1]] немає сторінок.',
+'randomincategory-selectcategory' => 'Перейти на випадкову сторінку з категорії: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Перейти',
+
 # Random redirect
 'randomredirect' => 'Випадкове перенаправлення',
 'randomredirect-nopages' => 'Простір назв «$1» не містить перенаправлень.',
@@ -2164,17 +2249,13 @@ $1',
 'statistics-users-active-desc' => 'Користувачі, які здійснили якусь дію протягом {{PLURAL:$1|минулого дня|минулих $1 днів}}',
 'statistics-mostpopular' => 'Сторінки, які найчастіше переглядають',
 
-'disambiguations' => 'Сторінки, що посилаються на сторінки неоднозначності.',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Наступні сторінки посилаються на '''багатозначні сторінки'''. 
-Ймовірно, вони повинні вказувати на відповідну конкретну статтю.<br />
-Сторінка вважається багатозначною, якщо на ній розміщений шаблон, назва якого є на сторінці [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Сторінки з перевизначеними властивостями',
 'pageswithprop-legend' => 'Сторінки з перевизначеними властивостями',
 'pageswithprop-text' => 'Тут перераховані сторінки, у яких були вручну перевизначені окремі властивості.',
 'pageswithprop-prop' => 'Назва властивості:',
 'pageswithprop-submit' => 'Перейти',
+'pageswithprop-prophidden-long' => 'довге значення текстової властивості приховано ($1)',
+'pageswithprop-prophidden-binary' => 'двійкове значення властивості приховано ($1)',
 
 'doubleredirects' => 'Подвійні перенаправлення',
 'doubleredirectstext' => 'На цій сторінці наведено список перенаправлень на інші перенаправлення.
@@ -2232,6 +2313,7 @@ $1',
 'mostrevisions' => 'Статті з найбільшою кількістю редагувань',
 'prefixindex' => 'Покажчик за початком назв сторінок',
 'prefixindex-namespace' => 'Усі сторінки з префіксом (простір назв $1)',
+'prefixindex-strip' => 'Опустити префікс у списку',
 'shortpages' => 'Короткі статті',
 'longpages' => 'Довгі статті',
 'deadendpages' => 'Сторінки без посилань',
@@ -2247,6 +2329,7 @@ $1',
 'listusers' => 'Список користувачів',
 'listusers-editsonly' => 'Показати лише користувачів, які зробили принаймні одне редагування',
 'listusers-creationsort' => 'Сортувати за датою створення',
+'listusers-desc' => 'Сортувати за спадним порядком',
 'usereditcount' => '$1 {{PLURAL:$1|редагування|редагування|редагувань}}',
 'usercreated' => '{{GENDER:$3|Створено}} $1 о $2',
 'newpages' => 'Нові сторінки',
@@ -2427,10 +2510,9 @@ $1',
 'unwatchthispage' => 'Скасувати спостереження',
 'notanarticle' => 'Не стаття',
 'notvisiblerev' => 'Версія була вилучена',
-'watchnochange' => 'За вказаний період в статтях з списку спостереження нічого не змінено.',
 'watchlist-details' => 'У вашому списку спостереження $1 {{PLURAL:$1|сторінка|сторінки|сторінок}} (не враховуючи сторінок обговорення).',
-'wlheader-enotif' => '* Сповіщення електронною поштою ввімкнено.',
-'wlheader-showupdated' => "* Сторінки, що змінилися після вашого останнього їх відвідування, виділені '''жирним''' шрифтом.",
+'wlheader-enotif' => 'Сповіщення електронною поштою ввімкнено.',
+'wlheader-showupdated' => "Сторінки, що змінилися після вашого останнього їх відвідування, виділені '''жирним''' шрифтом.",
 'watchmethod-recent' => 'перегляд останніх редагувань статей за якими ведеться спостереження',
 'watchmethod-list' => 'перегляд статей за якими ведеться спостереження',
 'watchlistcontains' => 'Ваш список спостереження містить $1 {{PLURAL:$1|сторінку|сторінки|сторінок}}.',
@@ -2676,7 +2758,7 @@ $1',
 'contributions' => 'Внесок {{GENDER:$1|користувача|користувачки}}',
 'contributions-title' => 'Внесок користувача $1',
 'mycontris' => 'Внесок',
-'contribsub2' => 'Внесок $1 ($2)',
+'contribsub2' => 'Для {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'Редагувань, що задовольняють заданим умовам не знайдено.',
 'uctop' => '(поточна)',
 'month' => 'До місяця (включно):',
@@ -2831,15 +2913,13 @@ $1',
 'ipb_blocked_as_range' => 'Помилка: IP-адреса $1 була заблокована не напряму і не може бути розблокована. Однак, вона належить до заблокованого діапазону $2, який можна розблокувати.',
 'ip_range_invalid' => 'Неприпустимий діапазон IP-адрес.',
 'ip_range_toolarge' => 'Блокування діапазонів, більших за /$1, не дозволені.',
-'blockme' => 'Заблокуй мене',
 'proxyblocker' => 'Блокування проксі',
-'proxyblocker-disabled' => 'Функція відключена.',
 'proxyblockreason' => "Ваша IP-адреса заблокована, тому що це — відкритий проксі.
 Будь ласка, зв'яжіться з вашим Інтернет-провайдером чи службою підтримки й повідомте їм про цю серйозну проблему безпеки.",
-'proxyblocksuccess' => 'Виконано.',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Ваша IP-адреса числиться як відкритий проксі в DNSBL.',
 'sorbs_create_account_reason' => 'Ваша IP-адреса числиться як відкритий проксі в DNSBL. Ви не можете створити обліковий запис.',
+'xffblockreason' => 'IP-адреса в X-Forwarded-For полі заголовка, або ваша, або проксі сервера, що використовується вами, заблокована. Початкова причина блокування була:$1',
 'cant-block-while-blocked' => 'Ви не можете блокувати інших користувачів, поки ви самі заблоковані.',
 'cant-see-hidden-user' => 'Користувача, якого ви хочете заблокувати, вже заблоковано та приховано. Оскільки у вас немає прав щодо приховання користувачів, ви не можете переглянути або змінити дане блокування.',
 'ipbblocked' => 'Ви не можете блокувати чи розблоковувати інших користувачів, оскільки самі заблоковані',
@@ -3001,6 +3081,8 @@ $1',
 'thumbnail-more' => 'Збільшити',
 'filemissing' => 'Файл не знайдено',
 'thumbnail_error' => 'Помилка створення мініатюри: $1',
+'thumbnail_error_remote' => 'Повідомлення про помилку від $1:
+$2',
 'djvu_page_error' => 'Номер сторінки DjVu недосяжний',
 'djvu_no_xml' => 'Неможливо отримати XML для DjVu',
 'thumbnail-temp-create' => 'Не вдалося створити тимчасовий файл мініатюри',
@@ -3145,20 +3227,15 @@ $1',
 'tooltip-undo' => 'Прибрати внесені зміни і показати попередній перегляд. Дозволяє зазначити причину скасування.',
 'tooltip-preferences-save' => 'Зберегти налаштування',
 'tooltip-summary' => 'Введіть короткий опис',
+'tooltip-iwiki' => '$1 — $2',
 
 # Stylesheets
 'common.css' => '/** Розміщений тут CSS буде застосовуватися до всіх тем оформлення */',
-'standard.css' => '/* Розміщений тут CSS-код буде використаний для користувачів з налаштованою темою оформлення Стандартне */',
-'nostalgia.css' => '/* Розміщений тут CSS-код буде використаний для користувачів з налаштованою темою оформлення Ностальгія */',
 'cologneblue.css' => '/* Розміщений тут CSS-код буде використаний для користувачів з налаштованою темою оформлення Кельнське блакитне */',
 'monobook.css' => '/* Розміщений тут CSS буде застосовуватися до всіх тем оформлення Monobook */',
-'myskin.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Власне */',
-'chick.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Курча */',
-'simple.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Просте */',
 'modern.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Сучасне */',
 'vector.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Векторне */',
 'print.css' => '/* Розміщений тут CSS-код буде використаний для друкованої версії */',
-'handheld.css' => '/* Розміщений тут CSS-код буде використаний для мобільних пристроїв, що використовують тему оформлення налаштовану в $wgHandheldStyle */',
 'noscript.css' => '/* Розміщений тут CSS-код буде використаний для користувачів у яких вимкнено JavaScript */',
 'group-autoconfirmed.css' => '/* Розміщений тут CSS-код буде використаний для автопідтверджених користувачів */',
 'group-bot.css' => '/* Розміщений тут CSS-код буде використаний тільки для ботів */',
@@ -3167,13 +3244,8 @@ $1',
 
 # Scripts
 'common.js' => '/* Розміщений тут код JavaScript буде завантажений всім користувачам при зверненні до будь-якої сторінки */',
-'standard.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують стандартну тему оформлення */',
-'nostalgia.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Ностальгія */',
 'cologneblue.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Кельнське синє */',
 'monobook.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Моно-книга */',
-'myskin.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують власну тему оформлення */',
-'chick.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Курча */',
-'simple.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують просту тему оформлення */',
 'modern.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Сучасне */',
 'vector.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують векторну тему оформлення */',
 'group-autoconfirmed.js' => '/* Розміщений тут код JavaScript буде завантажений тільки для автопідтверджених користувачів */',
@@ -3254,13 +3326,8 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-category-files' => 'Кількість файлів',
 
 # Skin names
-'skinname-standard' => 'Стандартне',
-'skinname-nostalgia' => 'Ностальгія',
 'skinname-cologneblue' => 'Кельнське синє',
 'skinname-monobook' => 'Моно-книга',
-'skinname-myskin' => 'Своє',
-'skinname-chick' => 'Курча',
-'skinname-simple' => 'Просте',
 'skinname-modern' => 'Сучасне',
 'skinname-vector' => 'Векторне',
 
@@ -3344,11 +3411,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 хвилина|$1 хвилини|$1 хвилин}}',
 'hours' => '{{PLURAL:$1|$1 година|$1 години|$1 годин}}',
 'days' => '{{PLURAL:$1|$1 день|$1 дні|$1 днів}}',
+'weeks' => '{{PLURAL:$1|$1 тиждень|$1 тижні|$1 тижнів}}',
 'months' => '{{PLURAL:$1|$1 місяць|$1 місяці|$1 місяців}}',
 'years' => '{{PLURAL:$1|$1 рік|$1 роки|$1 років}}',
 'ago' => '$1 тому',
 'just-now' => 'щойно',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|годину|години|годин}} тому',
+'minutes-ago' => '$1 {{PLURAL:$1|хвилину|хвилини|хвилин}} тому',
+'seconds-ago' => '$1 {{PLURAL:$1|секунду|секунди|секунд}} тому',
+'monday-at' => 'У понеділок о $1',
+'tuesday-at' => 'У вівторок о $1',
+'wednesday-at' => 'У середу о $1',
+'thursday-at' => 'У четвер о $1',
+'friday-at' => "У п'ятницю о $1",
+'saturday-at' => 'У суботу о $1',
+'sunday-at' => 'У неділю о $1',
+'yesterday-at' => 'Учора о $1',
+
 # Bad image list
 'bad_image_list' => 'Формат має бути наступним:
 
@@ -3426,7 +3507,7 @@ Variants for Chinese language
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Висота',
 'exif-bitspersample' => 'Глибина кольору',
@@ -3619,7 +3700,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Нестиснутий',
 'exif-compression-2' => 'CCITT Group 3, 1-мірна модифікація кодування довжин серій Хаффмана',
 'exif-compression-3' => 'CCITT Group 3, факсове кодування',
@@ -3960,7 +4041,6 @@ $5
 'semicolon-separator' => ';&#32;',
 'comma-separator' => ',&#32;',
 'colon-separator' => ':&#32;',
-'autocomment-prefix' => '-&#32;',
 'pipe-separator' => '&#32;•&#32;',
 'word-separator' => '&#32;',
 'ellipsis' => '...',
@@ -4110,7 +4190,6 @@ $5
 'version-other' => 'Інше',
 'version-mediahandlers' => 'Обробники медіа',
 'version-hooks' => 'Перехоплювачі',
-'version-extension-functions' => 'Функції розширень',
 'version-parser-extensiontags' => 'Теги розширень синтаксичного аналізатора',
 'version-parser-function-hooks' => 'Перехоплювачі функцій синтаксичного аналізатора',
 'version-hook-name' => "Ім'я перехоплювача",
@@ -4120,6 +4199,7 @@ $5
 'version-license' => 'Ліцензія',
 'version-poweredby-credits' => "Ця Вікі працює на системі управління вмістом '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'інші',
+'version-poweredby-translators' => 'перекладачі translatewiki.net',
 'version-credits-summary' => 'Нам хотілося б відзначити наступних осіб, що зробили внесок у [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki є вільним програмним забезпеченням, ви можете розповсюджувати та/або модифікувати його відповідно до умов GNU General Public License, яка опублікованя фондом вільного програмного забезпечення; або версії 2 Ліцензії, або (на Ваш розсуд) будь-якої наступної версії. 
 
@@ -4135,12 +4215,17 @@ MediaWiki поширюється в надії, що вона буде кори
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Шлях до статей]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Шлях до скриптів]',
 
-# Special:FilePath
-'filepath' => 'Шлях до файлу',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Виконати',
-'filepath-summary' => 'Ця спеціальна сторінка повертає повний шлях до файлу. 
-Зображення показуються в оригінальному розмірі. Інші типи файлів відкриваються пов’язаними програмами.',
+# Special:Redirect
+'redirect' => 'Перенаправлення за файлом, користувачем або ID версії',
+'redirect-legend' => 'Перенаправити на файл чи сторінку',
+'redirect-summary' => 'Ця спеціальна сторінка перенаправляє на файл (за поданою назвою файлу), сторінку (за поданим ID версії) або сторінку користувача (за поданим числовим ID користувача).',
+'redirect-submit' => 'Перейти',
+'redirect-lookup' => 'Шукати:',
+'redirect-value' => 'Значення:',
+'redirect-user' => 'ID користувача',
+'redirect-revision' => 'Версія сторінки',
+'redirect-file' => 'Назва файлу',
+'redirect-not-exists' => 'Значення не знайдено',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Пошук файлів-дублікатів',
@@ -4190,12 +4275,16 @@ MediaWiki поширюється в надії, що вона буде кори
 'tags' => 'Чинні мітки змін',
 'tag-filter' => 'Фільтр [[Special:Tags|міток]]:',
 'tag-filter-submit' => 'Відфільтрувати',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Мітка|Мітки|Міток}}]]: $2)',
 'tags-title' => 'Мітки',
 'tags-intro' => 'На цій сторінці наведений список міток, якими програмне забезпечення помічає редагування, а також значення цих міток.',
 'tags-tag' => 'Назва мітки',
 'tags-display-header' => 'Показ у списках змін',
 'tags-description-header' => 'Повний опис значення',
+'tags-active-header' => 'Активний?',
 'tags-hitcount-header' => 'Помічені редагування',
+'tags-active-yes' => 'Так',
+'tags-active-no' => 'Ні',
 'tags-edit' => 'редагувати',
 'tags-hitcount' => '$1 {{PLURAL:$1|зміна|зміни|змін}}',
 
@@ -4216,6 +4305,7 @@ MediaWiki поширюється в надії, що вона буде кори
 'dberr-problems' => 'Вибачте! На цьому сайті виникли технічні труднощі.',
 'dberr-again' => 'Спробуйте оновити сторінку за кілька хвилин.',
 'dberr-info' => "(неможливо з'єднатися з сервером баз даних: $1)",
+'dberr-info-hidden' => "(Не вдається зв'язатися з сервером бази даних)",
 'dberr-usegoogle' => 'Можете спробувати пошукати за допомогою Google.',
 'dberr-outofdate' => 'Майте на увазі, що його індекси можуть бути застарілими.',
 'dberr-cachederror' => 'Нижче наведена закешована версія запитаної сторінки, можливо, вона не показує останні зміни.',
@@ -4231,6 +4321,9 @@ MediaWiki поширюється в надії, що вона буде кори
 'htmlform-submit' => 'Відправити',
 'htmlform-reset' => 'Відкотити зміни',
 'htmlform-selectorother-other' => 'Інше',
+'htmlform-no' => 'Ні',
+'htmlform-yes' => 'Так',
+'htmlform-chosen-placeholder' => 'Виберіть параметр',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 з підтримкою повнотекстового пошуку',
@@ -4348,4 +4441,19 @@ MediaWiki поширюється в надії, що вона буде кори
 # Image rotation
 'rotate-comment' => 'Зображення повернуте на $1 {{PLURAL:$1|градус|градусів}} за годинниковою стрілкою',
 
+# Limit report
+'limitreport-title' => 'Аналізатор профілювання даних:',
+'limitreport-cputime' => 'Час використання ЦП',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|секунда|секунди|секунд}}',
+'limitreport-walltime' => 'Використання реального часу',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|секунда|секунди|секунд}}',
+'limitreport-ppvisitednodes' => 'Число вузлів відвіданих препроцесором',
+'limitreport-ppgeneratednodes' => 'Число вузлів згенерованих препроцесором',
+'limitreport-postexpandincludesize' => 'Включений розмір після розширення',
+'limitreport-postexpandincludesize-value' => '$1/$2 {{PLURAL:$2|байт|байти|байтів}}',
+'limitreport-templateargumentsize' => 'Розмір аргументів шаблону',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|байт|байти|байтів}}',
+'limitreport-expansiondepth' => 'Найвища глибина розширення',
+'limitreport-expensivefunctioncount' => 'Число дорогої функції аналізатора',
+
 );
diff --git a/languages/messages/MessagesUr.php b/languages/messages/MessagesUr.php
index dd88713b..cc5d0f7b 100644
--- a/languages/messages/MessagesUr.php
+++ b/languages/messages/MessagesUr.php
@@ -28,17 +28,17 @@ $fallback8bitEncoding = 'windows-1256';
 $rtl = true;
 
 $namespaceNames = array(
-	NS_MEDIA            => 'زریعہ',
+	NS_MEDIA            => 'وسیط',
 	NS_SPECIAL          => 'خاص',
 	NS_MAIN             => '',
 	NS_TALK             => 'تبادلۂ_خیال',
 	NS_USER             => 'صارف',
 	NS_USER_TALK        => 'تبادلۂ_خیال_صارف',
 	NS_PROJECT_TALK     => 'تبادلۂ_خیال_$1',
-	NS_FILE             => 'تصویر',
-	NS_FILE_TALK        => 'تبادلۂ_خیال_تصویر',
-	NS_MEDIAWIKI        => 'میڈیاوکی',
-	NS_MEDIAWIKI_TALK   => 'تبادلۂ_خیال_میڈیاوکی',
+	NS_FILE             => 'ملف',
+	NS_FILE_TALK        => 'تبادلۂ_خیال_ملف',
+	NS_MEDIAWIKI        => 'میڈیاویکی',
+	NS_MEDIAWIKI_TALK   => 'تبادلۂ_خیال_میڈیاویکی',
 	NS_TEMPLATE         => 'سانچہ',
 	NS_TEMPLATE_TALK    => 'تبادلۂ_خیال_سانچہ',
 	NS_HELP             => 'معاونت',
@@ -47,6 +47,14 @@ $namespaceNames = array(
 	NS_CATEGORY_TALK    => 'تبادلۂ_خیال_زمرہ',
 );
 
+$namespaceAliases = array(
+	'زریعہ'            => NS_MEDIA,
+	'تصویر'            => NS_FILE,
+	'تبادلۂ_خیال_تصویر'   => NS_FILE_TALK,
+	'میڈیاوکی'          => NS_MEDIAWIKI,
+	'تبادلۂ_خیال_میڈیاوکی' => NS_MEDIAWIKI_TALK,
+);
+
 $specialPageAliases = array(
 	'Activeusers'               => array( 'متحرک_صارفین' ),
 	'Allmessages'               => array( 'تمام_پیغامات' ),
@@ -54,13 +62,13 @@ $specialPageAliases = array(
 	'Ancientpages'              => array( 'قدیم_صفحات' ),
 	'Badtitle'                  => array( 'خراب_عنوان' ),
 	'Blankpage'                 => array( 'خالی_صفحہ' ),
-	'Block'                     => array( 'پابندی،_دستور_شبکی_پابندی،_پابندی_بر_صارف' ),
+	'Block'                     => array( 'پابندی', 'دستور_شبکی_پابندی', 'پابندی_بر_صارف' ),
 	'Blockme'                   => array( 'میری_پابندی' ),
 	'Booksources'               => array( 'کتابی_وسائل' ),
 	'BrokenRedirects'           => array( 'شکستہ_رجوع_مکررات' ),
 	'Categories'                => array( 'زمرہ_جات' ),
 	'ChangeEmail'               => array( 'ڈاک_تبدیل' ),
-	'ChangePassword'            => array( 'کلمہ_شناخت_تبدیل،_تنظیم_کلمہ_شناخت' ),
+	'ChangePassword'            => array( 'کلمہ_شناخت_تبدیل', 'تنظیم_کلمہ_شناخت' ),
 	'ComparePages'              => array( 'موازنہ_صفحات' ),
 	'Confirmemail'              => array( 'تصدیق_ڈاک' ),
 	'Contributions'             => array( 'شراکتیں' ),
@@ -78,15 +86,15 @@ $specialPageAliases = array(
 	'Import'                    => array( 'درآمدگی' ),
 	'Invalidateemail'           => array( 'ڈاک_تصدیق_منسوخ' ),
 	'JavaScriptTest'            => array( 'تجربہ_جاوا_اسکرپٹ' ),
-	'BlockList'                 => array( 'فہرست_ممنوع،_فہرست_دستور_شبکی_ممنوع' ),
+	'BlockList'                 => array( 'فہرست_ممنوع', 'فہرست_دستور_شبکی_ممنوع' ),
 	'LinkSearch'                => array( 'تلاش_روابط' ),
 	'Listadmins'                => array( 'فہرست_منتظمین' ),
 	'Listbots'                  => array( 'فہرست_روبہ_جات' ),
-	'Listfiles'                 => array( 'فہرست_املاف،_فہرست_تصاویر' ),
-	'Listgrouprights'           => array( 'فہرست_اختیارات_گروہ،_صارفی_گروہ_اختیارات' ),
+	'Listfiles'                 => array( 'فہرست_املاف', 'فہرست_تصاویر' ),
+	'Listgrouprights'           => array( 'فہرست_اختیارات_گروہ', 'صارفی_گروہ_اختیارات' ),
 	'Listredirects'             => array( 'فہرست_رجوع_مکررات' ),
 	'Listusers'                 => array( 'فہرست_صارفین،_صارف_فہرست' ),
-	'Log'                       => array( 'نوشتہ،_نوشتہ_جات' ),
+	'Log'                       => array( 'نوشتہ', 'نوشتہ_جات' ),
 	'Lonelypages'               => array( 'یتیم_صفحات' ),
 	'Longpages'                 => array( 'طویل_صفحات' ),
 	'MergeHistory'              => array( 'ضم_تاریخچہ' ),
@@ -95,7 +103,7 @@ $specialPageAliases = array(
 	'Mypage'                    => array( 'میرا_صفحہ' ),
 	'Mytalk'                    => array( 'میری_گفتگو' ),
 	'Myuploads'                 => array( 'میرے_زبراثقالات' ),
-	'Newimages'                 => array( 'جدید_املاف،_جدید_تصاویر' ),
+	'Newimages'                 => array( 'جدید_املاف', 'جدید_تصاویر' ),
 	'Newpages'                  => array( 'جدید_صفحات' ),
 	'PermanentLink'             => array( 'مستقل_ربط' ),
 	'Popularpages'              => array( 'مقبول_صفحات' ),
@@ -103,7 +111,7 @@ $specialPageAliases = array(
 	'Prefixindex'               => array( 'اشاریہ_سابقہ' ),
 	'Protectedpages'            => array( 'محفوظ_صفحات' ),
 	'Protectedtitles'           => array( 'محفوظ_عناوین' ),
-	'Randompage'                => array( 'تصادف،_تصادفی_مقالہ' ),
+	'Randompage'                => array( 'تصادف', 'تصادفی_مقالہ' ),
 	'Randomredirect'            => array( 'تصادفی_رجوع_مکرر' ),
 	'Recentchanges'             => array( 'حالیہ_تبدیلیاں' ),
 	'Recentchangeslinked'       => array( 'متعلقہ_تبدیلیاں' ),
@@ -113,12 +121,12 @@ $specialPageAliases = array(
 	'Specialpages'              => array( 'خصوصی_صفحات' ),
 	'Statistics'                => array( 'شماریات' ),
 	'Uncategorizedcategories'   => array( 'غیر_زمرہ_بند_زمرہ_جات' ),
-	'Uncategorizedimages'       => array( 'غیر_زمرہ_بند_املاف،_غیر_زمرہ_بند_تصاویر' ),
+	'Uncategorizedimages'       => array( 'غیر_زمرہ_بند_املاف', 'غیر_زمرہ_بند_تصاویر' ),
 	'Uncategorizedpages'        => array( 'غیر_زمرہ_بند_صفحات' ),
 	'Uncategorizedtemplates'    => array( 'غیر_زمرہ_بند_سانچے' ),
 	'Undelete'                  => array( 'بحال' ),
 	'Unusedcategories'          => array( 'غیر_مستعمل_زمرہ_جات' ),
-	'Unusedimages'              => array( 'غیر_مستعمل_املاف،_غیر_مستعمل_تصاویر' ),
+	'Unusedimages'              => array( 'غیر_مستعمل_املاف', 'غیر_مستعمل_تصاویر' ),
 	'Unusedtemplates'           => array( 'غیر_مستعمل_سانچے' ),
 	'Unwatchedpages'            => array( 'نادیدہ_صفحات' ),
 	'Upload'                    => array( 'زبراثقال' ),
@@ -128,7 +136,7 @@ $specialPageAliases = array(
 	'Version'                   => array( 'اخراجہ' ),
 	'Wantedcategories'          => array( 'مطلوب_زمرہ_جات' ),
 	'Wantedfiles'               => array( 'مطلوب_املاف' ),
-	'Wantedpages'               => array( 'مطلوب_صفحات،_شکستہ_روابط' ),
+	'Wantedpages'               => array( 'مطلوب_صفحات', 'شکستہ_روابط' ),
 	'Wantedtemplates'           => array( 'مطلوب_سانچے' ),
 	'Watchlist'                 => array( 'زیر_نظر_فہرست' ),
 	'Whatlinkshere'             => array( 'یہاں_کس_کا_رابطہ' ),
@@ -140,9 +148,11 @@ $magicWords = array(
 	'notoc'                     => array( '0', '_فہرست_نہیں_', '__NOTOC__' ),
 	'toc'                       => array( '0', '__فہرست__', '__TOC__' ),
 	'noeditsection'             => array( '0', '__ناتحریرقسم__', '__NOEDITSECTION__' ),
+	'pagename'                  => array( '1', 'نام_صفحہ', 'PAGENAME' ),
+	'namespace'                 => array( '1', 'نام_فضا', 'NAMESPACE' ),
 	'msg'                       => array( '0', 'پیغام:', 'MSG:' ),
-	'subst'                     => array( '0', 'نقل:', 'SUBST:' ),
-	'safesubst'                 => array( '0', 'محفوظ_نقل:', 'SAFESUBST:' ),
+	'subst'                     => array( '0', 'جا:', 'نقل:', 'SUBST:' ),
+	'safesubst'                 => array( '0', 'محفوظ_جا:', 'محفوظ_نقل:', 'SAFESUBST:' ),
 	'img_thumbnail'             => array( '1', 'تصغیر', 'thumbnail', 'thumb' ),
 	'img_right'                 => array( '1', 'دائیں', 'right' ),
 	'img_left'                  => array( '1', 'بائیں', 'left' ),
@@ -187,10 +197,6 @@ $messages = array(
 'tog-shownumberswatching' => 'دیکھنے والے صارفین کی تعداد دکھاؤ',
 'tog-oldsig' => 'موجودہ دستخط:',
 'tog-fancysig' => '(سادہ دستخط بلا خودکار ربط)',
-'tog-externaleditor' => 'ہمیشہ بیرونی تدوین کار استعمال کرو (صرف ماہرین کیلئے، اِس کیلئے شمارندہ پر خاص ترتیبات درکار ہوتی ہیں۔
-[//www.mediawiki.org/wiki/Manual:External_editors مزید معلومات.])',
-'tog-externaldiff' => '',
-'tog-showjumplinks' => 'Enable "jump to" accessibility links',
 'tog-uselivepreview' => 'براہِ راست نمائش استعمال کرو (JavaScript چاہئے نیز تجرباتی)',
 'tog-forceeditsummary' => 'جب میں ترمیمی خلاصہ خالی چھوڑوں تو مجھے آگاہ کرو',
 'tog-watchlisthideown' => 'زیرِنظرفہرست سے میری ترمیمات چھپاؤ',
@@ -202,6 +208,7 @@ $messages = array(
 'tog-ccmeonemails' => 'دیگر صارفین کو ارسال کردہ برقی خطوط کی نقول مجھے ارسال کریں۔',
 'tog-diffonly' => 'مختلفات کے نیچے صفحے کی مشمولات مت دکھاؤ',
 'tog-showhiddencats' => 'پوشیدہ زمرہ جات دکھاؤ',
+'tog-useeditwarning' => 'خبردار مجھے جب میں غیر محفوظ کردہ تبدیلیوں کے ساتھ ایک ترمیم کے صفحے کو چھوڑ دو',
 
 'underline-always' => 'ہمیشہ',
 'underline-never' => 'کبھی نہیں',
@@ -377,7 +384,7 @@ $messages = array(
 $1',
 'pool-errorunknown' => 'نامعلوم خطا',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'تعارف {{SITENAME}}',
 'aboutpage' => 'Project:تعارف',
 'copyright' => 'تمام مواد $1 کے تحت میسر ہے۔',
@@ -387,7 +394,6 @@ $1',
 'disclaimers' => 'اعلانات',
 'disclaimerpage' => 'Project:عام اعلان',
 'edithelp' => 'معاونت براۓ ترمیم',
-'edithelppage' => 'Help:ترمیم',
 'helppage' => 'Help:فہرست',
 'mainpage' => 'صفحہ اول',
 'mainpage-description' => 'صفحہ اول',
@@ -416,7 +422,6 @@ $1',
 'newmessagesdifflinkplural' => 'آخری {{PLURAL:$1|تبدیلی|تبدیلیاں}}',
 'youhavenewmessagesmulti' => 'ء$1 پر آپ کیلئے نئے پیغامات ہیں',
 'editsection' => 'ترمیم',
-'editsection-brackets' => '[$1]',
 'editold' => 'ترمیم',
 'viewsourceold' => 'مآخذ دیکھئے',
 'editlink' => 'تدوین کریں',
@@ -467,17 +472,6 @@ $1',
 # General errors
 'error' => 'خطاء',
 'databaseerror' => 'خطائے ڈیٹابیس',
-'dberrortext' => 'ڈیٹابیس کے استفسارہ میں ایک خطائے نحوی واقع ہوئی ہے.
-اِس سے مصنع‌لطیف میں کھٹمل کی نشاندہی کا اندیشہ ہے.
-پچھلا سعی‌شدہ ڈیٹابیسی استفسارہ یہ تھا:
-<blockquote><tt>$1</tt></blockquote>
-فعلیت میں سے "<tt>$2</tt>".
-MySQL نے خطائی جواب دیا "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'ڈیٹابیس کے استفسارہ میں ایک خطائے نحوی واقع ہوئی ہے.
-پچھلا سعی‌شدہ ڈیٹابیسی استفسارہ یہ تھا:
-"$1"
-"$2" فعلیت میں سے.
-MySQL نے جوابِ خطاء دیا "$3: $4"',
 'laggedslavemode' => 'انتباہ: ممکن ہے کہ صفحہ میں حالیہ بتاریخہ جات شامل نہ ہوں.
 
 Warning: Page may not contain recent updates.',
@@ -522,7 +516,6 @@ Warning: Page may not contain recent updates.',
 'protectedinterface' => 'یہ صفحہ مصنع‌لطیف کیلئے سطح‌البینی متن فراہم کرتا ہے، اور ناجائزاستعمال کے سدِباب کیلئے اِسے مقفل کیا گیا ہے.',
 'editinginterface' => "'''انتباہ: ''' آپ ایک ایسا صفحہ تدوین کر رہے ہیں جو مصنع‌لطیف کیلئے سطح‌البینی متن فراہم کرتا ہے۔ اس صفحہ میں کی جانے والی ترمیم، دیگر صارفین کیلئے سطح‌البین کو تبدیل کردے گی۔
 براہِ کرم، ترجمہ کیلئے [//translatewiki.net/wiki/Main_Page?setlang=en '''ٹرانسلیٹ ویکی.نیٹ'''] (میڈیاویکی مقامیانی منصوبہ) استعمال کیجئے.",
-'sqlhidden' => '(SQL استفسارہ پوشیدہ)',
 'namespaceprotected' => "آپ کو '''$1''' فضائے نام میں صفحات تدوین کرنے کی اِجازت نہیں ہے.",
 'ns-specialprotected' => 'خاص صفحات کی تدوین نہیں کی جاسکتی.',
 'titleprotected' => 'اس عنوان کو [[User:$1|$1]] نے تخلیق سے محفوظ کیا ہے.
@@ -540,7 +533,10 @@ Warning: Page may not contain recent updates.',
 آپ گمنام طور پر {{SITENAME}}  کا استعمال جاری رکھ سکتے ہیں، یا دوبارہ اسی نام یا مختلف نام سے <span class='plainlinks'>[$1 دوبارہ داخلِ نوشتہ]</span> بھی ہو سکتے ہیں۔  یہ یاد آوری کرلیجیۓ کہ کچھ صفحات ایسے نظر آتے رہیں گے کہ جیسے ابھی آپ خارج نہیں ہوئے ، جب تک آپ اپنے متصفح کا ابطن صاف نہ کردیں۔",
 'yourname' => 'اسمِ رکنیت',
 'yourpassword' => 'کلمۂ شناخت',
+'createacct-yourpassword-ph' => 'ایک پاس ورڈ داخل کریں',
 'yourpasswordagain' => 'کلمۂ شناخت دوبارہ لکھیں',
+'createacct-yourpasswordagain' => 'کلمۂ اجازت تصدیق کریں',
+'createacct-yourpasswordagain-ph' => 'پاس ورڈ پھر داخل کریں',
 'remembermypassword' => 'اِس متصفح پر میرے داخلِ نوشتگی معلومات یاد رکھو (زیادہ سے زیادہ $1 {{PLURAL:$1|دِن|ایام}} کیلئے)',
 'yourdomainname' => 'آپکا ڈومین',
 'password-change-forbidden' => 'آپ اس ویکی پر پارلفظ (پاس روڈ) تبدیل نہیں کر سکتے',
@@ -559,12 +555,25 @@ Warning: Page may not contain recent updates.',
 'gotaccount' => "پہلے سے کھاتہ بنا ہوا ہے? '''$1'''.",
 'gotaccountlink' => 'داخل ہوجائیے',
 'userlogin-resetlink' => 'داخلِ نوشتہ ہونے کی تفاصیل بھول گئے ہیں؟',
+'createacct-join' => 'اپنی معلومات نیچے لکھیں۔',
+'createacct-emailrequired' => 'ای میل پتہ',
+'createacct-emailoptional' => 'ای میل ایڈریس (اختیاری)',
+'createacct-email-ph' => 'اپنا برقی پتہ لکھیں',
 'createaccountmail' => 'بذریعۂ برقی ڈاک',
+'createacct-realname' => 'اصلی نام (اختیاری)',
 'createaccountreason' => 'وجہ:',
+'createacct-reason' => 'وجہ',
+'createacct-captcha' => 'حفاظتی تدبیر',
+'createacct-imgcaptcha-ph' => 'آپ اوپر دیکھ متن داخل کریں',
+'createacct-benefit-heading' => '{{SITENAME}} آپ جیسے لوگوں کی طرف سے بنایا گیا ہے ۔',
+'createacct-benefit-body1' => 'ترمیم',
+'createacct-benefit-body2' => 'صفحات',
+'createacct-benefit-body3' => 'شرکت کرنے والے اس ماہ کے',
 'badretype' => 'درج شدہ کلمۂ شناخت اصل سے مطابقت نہیں رکھتا۔',
 'userexists' => 'داخل کردہ اسم صارف پہلے سے مستعمل ہے۔
 براہِ کرم! کوئی دوسرا اسم منتخب کیجئے۔',
 'loginerror' => 'داخلے میں غلطی',
+'createacct-error' => 'تخلیق کھاتہ میں نقص',
 'createaccounterror' => 'کھاتہ $1 بنایا نہیں جاسکا',
 'nocookiesnew' => 'کھاتۂ صارف بنادیا گیا ہے، لیکن آپ کا داخلہ نہیں ہوا.
 صارفین کے داخلہ کیلئے {{SITENAME}} کوکیز استعمال کرتا ہے.
@@ -641,7 +650,7 @@ Warning: Page may not contain recent updates.',
 'newpassword' => 'نیا کلمۂ شناخت',
 'retypenew' => 'نیا کلمۂ شناخت دوبارہ درج کریں:',
 'resetpass_submit' => 'پارلفظ بناؤ اور داخل ہوجاؤ',
-'resetpass_success' => 'آپ کا پارلفظ کامیابی سے تبدیل ہوگیا!
+'changepassword-success' => 'آپ کا پارلفظ کامیابی سے تبدیل ہوگیا!
 اَب داخلِ نوشتہ کیا جارہا ہے...',
 'resetpass_forbidden' => 'پارلفظ تبدیل نہیں ہوسکتا',
 'resetpass-no-info' => 'اِس صفحہ تک براہِ راست رسائی کیلئے آپ کو داخلِ نوشتہ ہونا پڑے گا.',
@@ -782,6 +791,7 @@ $1 نے پابندی لگائی تھی.
 لگتا ہے یہ حذف ہوچکا ہے.',
 'edit-conflict' => 'تنازعۂ تدوین.',
 'edit-no-change' => 'آپ کی تدوین کو نظرانداز کردیا گیا، کیونکہ متن میں کوئی تبدیلی نہیں ہوئی تھی.',
+'postedit-confirmation' => 'آپ کی ترمیم محفوظ ہوگئی۔',
 'edit-already-exists' => 'نیا صفحہ تخلیق نہیں کیا جاسکتا.
 یہ پہلے سے موجود ہے.',
 
@@ -905,7 +915,6 @@ $1",
 'searchmenu-legend' => 'اختیاراتِ تلاش',
 'searchmenu-exists' => "'''اِس ویکی پر \"[[:\$1]]\" نامی ایک صفحہ موجود ہے'''",
 'searchmenu-new' => "'''اِس ویکی پر صفحہ \"[[:\$1]]\" تخلیق کیجئے!'''",
-'searchhelp-url' => 'Help:فہرست',
 'searchprofile-articles' => 'مشمولاتی صفحات',
 'searchprofile-project' => 'صفحاتِ مدد و منصوبہ',
 'searchprofile-images' => 'کثیرالوسیط',
@@ -945,10 +954,6 @@ $1",
 آپ فی الحال گوگل کے ذریعے تلاش کرسکتے ہیں.
 یاد رکھئے کہ اُن کے {{SITENAME}} اشاریے ممکناً پرانے ہوسکتے ہیں.',
 
-# Quickbar
-'qbsettings' => 'فوری‌بار',
-'qbsettings-none' => 'ہیچ',
-
 # Preferences page
 'preferences' => 'ترجیحات',
 'mypreferences' => 'میری ترجیہات',
@@ -976,7 +981,6 @@ $1",
 'resetprefs' => 'نامحفوظ تبدیلیاں صاف کرو',
 'restoreprefs' => 'تمام بےنقص ترتیبات بحال کیجئے',
 'prefs-editing' => 'تدوین',
-'prefs-edit-boxsize' => 'تدوینی کھڑکی کی جسامت.',
 'rows' => 'صفیں:',
 'columns' => 'قطاریں:',
 'searchresultshead' => 'تلاش',
@@ -1006,7 +1010,6 @@ $1",
 'prefs-custom-css' => 'خودساختہ CSS',
 'prefs-custom-js' => 'خودساختہ JS',
 'prefs-emailconfirm-label' => 'برقی پتہ کی تصدیق:',
-'prefs-textboxsize' => 'خانۂ تدوین کی جسامت',
 'youremail' => '٭ برقی خط',
 'username' => 'اسم صارف',
 'uid' => 'صارف نمبر:',
@@ -1224,9 +1227,6 @@ HTML tags جانچئے.',
 'statistics' => 'اعداد و شمار',
 'statistics-header-users' => 'ارکان کے اعداد و شمار',
 
-'disambiguations' => 'ضد ابہام صفحات',
-'disambiguationspage' => 'سانچہ:ضدابہام',
-
 'doubleredirects' => 'دوہرے متبادل ربط',
 
 'brokenredirects' => 'نامکمل متبادل ربط',
@@ -1427,7 +1427,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'contribslink' => 'شـراکـت',
 'blocklogpage' => 'نوشتۂ پابندی',
 'block-log-flags-nocreate' => 'کھاتے کی تخلیق غیرفعال',
-'proxyblocksuccess' => 'کردیا.',
 
 # Move page
 'move-page' => 'منتقلی',
@@ -1568,6 +1567,9 @@ $1 × $2 عکصر (پکسلز)، حجم ملف: $3، MIME قسم: $4',
 'ilsubmit' => 'تلاش',
 'bydate' => 'بالحاظ تاریخ',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'weeks' => '{{PLURAL:$1|$1ہفتہ| $1  ہفتے}}',
+
 # Bad image list
 'bad_image_list' => 'شکلبند درج ذیل ہے:
 
diff --git a/languages/messages/MessagesUz.php b/languages/messages/MessagesUz.php
index 08bb259a..41ba94b8 100644
--- a/languages/messages/MessagesUz.php
+++ b/languages/messages/MessagesUz.php
@@ -30,8 +30,8 @@ $namespaceNames = array(
 	NS_USER             => 'Foydalanuvchi',
 	NS_USER_TALK        => 'Foydalanuvchi_munozarasi',
 	NS_PROJECT_TALK     => '$1_munozarasi',
-	NS_FILE             => 'Tasvir',
-	NS_FILE_TALK        => 'Tasvir_munozarasi',
+	NS_FILE             => 'Fayl',
+	NS_FILE_TALK        => 'Fayl_munozarasi',
 	NS_MEDIAWIKI        => 'MediaWiki',
 	NS_MEDIAWIKI_TALK   => 'MediaWiki_munozarasi',
 	NS_TEMPLATE         => 'Andoza',
@@ -44,6 +44,8 @@ $namespaceNames = array(
 
 $namespaceAliases = array(
 	'Mediya'                => NS_MEDIA,
+	'Tasvir'                => NS_FILE,
+	'Tasvir_munozarasi'     => NS_FILE_TALK,
 	'MediyaViki'            => NS_MEDIAWIKI,
 	'MediyaViki_munozarasi' => NS_MEDIAWIKI_TALK,
 	'Shablon'               => NS_TEMPLATE,
@@ -53,7 +55,7 @@ $namespaceAliases = array(
 );
 
 $magicWords = array(
-	'redirect'                  => array( '0', '#YONALTIRISH', '#REDIRECT' ),
+	'redirect'                  => array( '0', '#YOʻNALTIRISH', '#YONALTIRISH', '#REDIRECT' ),
 	'notoc'                     => array( '0', '__ICHIDAGILARYOQ__', '__NOTOC__' ),
 	'nogallery'                 => array( '0', '__GALEREYAYOQ__', '__NOGALLERY__' ),
 	'forcetoc'                  => array( '0', '__ICHIDAGILARMAJBURIY__', '__FORCETOC__' ),
@@ -89,6 +91,10 @@ $magicWords = array(
 	'numberofedits'             => array( '1', 'OZGARISHSONI', 'NUMBEROFEDITS' ),
 	'numberofviews'             => array( '1', 'KORISHSONI', 'NUMBEROFVIEWS' ),
 	'pagename'                  => array( '1', 'SAHIFANOMI', 'PAGENAME' ),
+	'namespace'                 => array( '1', 'NOMFAZO', 'NAMESPACE' ),
+	'gender'                    => array( '0', 'JINS', 'GENDER:' ),
+	'currentweek'               => array( '1', 'JORIYHAFTA', 'CURRENTWEEK' ),
+	'language'                  => array( '0', '#TIL:', '#LANGUAGE:' ),
 	'numberofadmins'            => array( '1', 'ADMINISTRATORSONI', 'NUMBEROFADMINS' ),
 	'special'                   => array( '0', 'maxsus', 'special' ),
 	'tag'                       => array( '0', 'yorliq', 'tag' ),
@@ -133,9 +139,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Sahifani kuzatuv roʻyxatiga olgan foydalanuvchilar sonini koʻrsatish',
 'tog-oldsig' => 'Joriy imzo:',
 'tog-fancysig' => 'Imzoni viki-belgi qilib koʻrsatish (avtomatik ishoratsiz)',
-'tog-externaleditor' => 'Sukut boʻyicha tashqi tahrirlash dasturidan foydalanish (faqat mutaxassislar uchun, kompyuteringizda maxsus moslamalar boʻlishi zarur. [//www.mediawiki.org/wiki/Manual:External_editors Batafsil])',
-'tog-externaldiff' => 'Sukut boʻyicha tashqi taqqoslash dasturidan foydalanish (faqat mutaxassislar uchun, kompyuteringizda maxsus moslamalar boʻlishi zarur. [//www.mediawiki.org/wiki/Manual:External_editors Batafsil])',
-'tog-showjumplinks' => 'Yordamchi «tez oʻtish» havolalarini yoqish',
 'tog-uselivepreview' => 'Tez koʻrib chiqish (JavaScript orqali) (sinovda)',
 'tog-forceeditsummary' => 'Qisqa tavsif oynasi toʻldirilmagani haqida ogohlantirish koʻrsatilsin',
 'tog-watchlisthideown' => 'Oʻz tahrirlarim kuzatuv roʻyxatimda koʻrsatilmasin',
@@ -149,6 +152,7 @@ $messages = array(
 'tog-showhiddencats' => 'Yashirin turkumlarni koʻrsatish',
 'tog-noconvertlink' => 'Sarlavhani oʻzgartirish havolasini oʻchirib qoʻyish',
 'tog-norollbackdiff' => 'Tahrir qaytarilganda, versiyalar taqqosi koʻrsatilmasin',
+'tog-useeditwarning' => 'Kiritgan oʻzgarishlarimni saqlamay sahifadan chiqib ketayotganim haqida ogohlantirilsin',
 
 'underline-always' => 'Har doim',
 'underline-never' => 'Hech qachon',
@@ -232,7 +236,7 @@ $messages = array(
 'noindex-category' => 'Indekslanmaydigan sahifalar',
 'broken-file-category' => 'Ishlamaydigan fayl havolalari bor sahifalar',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xffʻʼ«„]+)$/sDu',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xffʻʼ«„])))(.+)$/sDu',
 
 'about' => 'Haqida',
 'article' => 'Sahifa',
@@ -338,7 +342,7 @@ $1',
 'pool-queuefull' => 'Soʻrovlar jamlanmasi toʻldi',
 'pool-errorunknown' => 'Nomaʼlum xato',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} haqida',
 'aboutpage' => 'Project:Haqida',
 'copyright' => 'Keltirilgan maʼlumotlar $1 orqali tarqatilmoqda.',
@@ -348,7 +352,6 @@ $1',
 'disclaimers' => 'Ogohlantirishlar',
 'disclaimerpage' => 'Project:Umumiy ogohlantirish',
 'edithelp' => 'Tahrirlash yordami',
-'edithelppage' => 'Help:Tahrirlash',
 'helppage' => 'Help:Mundarija',
 'mainpage' => 'Bosh sahifa',
 'mainpage-description' => 'Bosh sahifa',
@@ -452,10 +455,17 @@ Ushbu xabar tarjimasini qoʻshish yoki oʻzgartirish uchun, iltimos, MediaWikini
 {{SITENAME}} saytidan anonim holda foydalanishda davom etishindiz mumkin. Yoki siz yana hozirgi yoki boshqa foydalanuvchi nomi bilan qaytadan tizimga kirishingiz mumkin.
 Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguningizga qadar xuddi tizimga kirganingizdagidek ko'rinishda davom etaverishi mumkin.",
 'yourname' => 'Foydalanuvchi nomi:',
+'userlogin-yourname' => 'Foydalanuvchi nomi',
+'userlogin-yourname-ph' => 'Foydalanuvchi nomingizni kiriting',
 'yourpassword' => 'Maxfiy soʻz:',
+'userlogin-yourpassword-ph' => 'Maxfiy soʻzni kiriting',
+'createacct-yourpassword-ph' => 'Maxfiy soʻzni kiriting',
 'yourpasswordagain' => 'Maxfiy so‘zni qayta kiriting:',
+'createacct-yourpasswordagain' => 'Maxfiy soʻzni tasdiqlang',
+'createacct-yourpasswordagain-ph' => 'Maxfiy soʻzni yana bir bor kiriting',
 'remembermypassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 {{PLURAL:$1|kunga|kunga}})',
-'securelogin-stick-https' => 'Kirgandan keyin HTTPS boʻyicha ulanishni davom ettirish',
+'userlogin-remembermypassword' => 'Esda saqla',
+'userlogin-signwithsecure' => 'Himoyalangan holda kirish',
 'yourdomainname' => 'Sizning domeningiz:',
 'password-change-forbidden' => 'Siz bu vikida maxfiy soʻzni oʻzgartira olmaysiz.',
 'login' => 'Kirish',
@@ -466,14 +476,28 @@ Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguning
 'logout' => 'Chiqish',
 'userlogout' => 'Chiqish',
 'notloggedin' => 'Siz tizimga kirmagansiz',
+'userlogin-noaccount' => 'Hisobingiz yoʻqmi?',
+'userlogin-joinproject' => '{{SITENAME}}ga aʼzo boʻlish',
 'nologin' => "Hisobingiz yoʻqmi? '''$1'''.",
 'nologinlink' => 'Hisob yaratish',
 'createaccount' => 'Hisob yaratish',
 'gotaccount' => "Hisobingiz bormi? '''$1'''.",
 'gotaccountlink' => 'Kirish',
 'userlogin-resetlink' => 'Kirish maʻlumotlaringiz esdan chiqdimi?',
+'userlogin-resetpassword-link' => 'Maxfiy soʻzni yangilash',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Kirish uchun yordam]]',
+'createacct-join' => 'Maʼlumotlaringizni quyiga yozing',
+'createacct-emailoptional' => 'Elektron pochta manzili (majburiy emas)',
+'createacct-email-ph' => 'Elektron pochtangiz manzilini kiriting',
 'createaccountmail' => "E-mail orqali maxfiy so'zni jo'natish",
 'createaccountreason' => 'Sabab:',
+'createacct-captcha' => 'Xavfsizlik tekshiruvi',
+'createacct-imgcaptcha-ph' => 'Yuqoridagi yozuvni bu yerga kiriting',
+'createacct-submit' => 'Hisob yaratish',
+'createacct-benefit-heading' => '{{SITENAME}} Sizga oʻxshagan odamlar tomonidan yaratiladi',
+'createacct-benefit-body1' => 'tahrirlar soni',
+'createacct-benefit-body2' => 'maqolalar soni',
+'createacct-benefit-body3' => 'soʻnggi paytdagi ishtirokchilar soni',
 'badretype' => "Siz tomondan kiritilgan maxfiy so'zlar mos kelmayapti.",
 'loginerror' => 'Foydalanuvchini aniqlashda xatolik',
 'createaccounterror' => 'Hisob yozuvi yaratishning iloji yoʻq: $1',
@@ -507,9 +531,9 @@ Ism yozilishini tekshirib koʻring.',
 
 # Special:PasswordReset
 'passwordreset' => 'Maxfiy soʻzni yangilash',
-'passwordreset-text' => 'Mahfiy soʻzni tashlash uchun ushbu oynalarni toʻltiring.',
+'passwordreset-text-one' => 'Mahfiy soʻzni tashlash uchun ushbu oynalarni toʻltiring.',
+'passwordreset-text-many' => '{{PLURAL:$1|Maxfiy soʻzni yangilash uchun quyidagi oynalardan birini toʻldiring.}}',
 'passwordreset-legend' => 'Maxfiy soʻzni yangilash',
-'passwordreset-pretext' => '{{PLURAL:$1||Quyidagi maʼlumotlardan birorta qismini keltiring}}',
 'passwordreset-username' => 'Foydalanuvchi nomi:',
 'passwordreset-domain' => 'Domen:',
 'passwordreset-email' => 'Elektron pochta manzili:',
@@ -628,6 +652,7 @@ Qulaylik uchun quyida yoʻqotilish qaydlari keltirilgan:",
 Maʼlumot uchun quyida oʻchirish va qayta nomlash jurnallaridan mos yozuvlar keltirilgan.',
 'log-fulllog' => 'Qaydlarni toʻliq koʻrish',
 'edit-conflict' => 'Tahrirlash toʻqnashuvi.',
+'postedit-confirmation' => 'Tahriringiz saqlandi.',
 'defaultmessagetext' => "Boshlang'ich matn",
 
 # Parser/template warnings
@@ -733,7 +758,6 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'searchmenu-legend' => 'Qidiruv shartlari',
 'searchmenu-exists' => "'''Ushbu vikida \"[[:\$1]]\" nomli sahifa mavjud.'''",
 'searchmenu-new' => "'''Ushbu vikida \"[[:\$1]]\" sahifasini yarat!'''",
-'searchhelp-url' => 'Help:Mundarija',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Shu prefiksli sahifalarni koʻrsatish]]',
 'searchprofile-articles' => 'Asosiy sahifalar',
 'searchprofile-project' => 'Yordam va loyiha sahifalari',
@@ -773,14 +797,6 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'powersearch-togglenone' => 'Hech qaysini',
 'search-external' => 'Tashqi qidiruv',
 
-# Quickbar
-'qbsettings' => 'Saytda harakatlanish darchasi',
-'qbsettings-none' => "Ko'rsatmaslik",
-'qbsettings-fixedleft' => "Qo'zg'almas chap",
-'qbsettings-fixedright' => "Qo'zg'almas o'ng",
-'qbsettings-floatingleft' => 'Suzuvchi chap',
-'qbsettings-floatingright' => "Suzuvchi o'ng",
-
 # Preferences page
 'preferences' => 'Moslamalar',
 'mypreferences' => 'Moslamalarim',
@@ -809,7 +825,6 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'resetprefs' => 'Bekor qilish',
 'restoreprefs' => 'Barcha moslamalarni dastlabki holatiga qaytarish',
 'prefs-editing' => 'Tahrirlash',
-'prefs-edit-boxsize' => 'Tahrir oynasining oʻlchami',
 'rows' => 'Qatorlar soni:',
 'columns' => 'Ustunlar soni:',
 'searchresultshead' => 'Qidiruv',
@@ -848,7 +863,6 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'prefs-custom-js' => 'Shaxsiy JavaScript',
 'prefs-common-css-js' => 'Umumiy CSS/JavaScript (barcha tashqi koʻrinishlar uchun):',
 'prefs-emailconfirm-label' => 'Elektron pochta manzilini tasdiqlash:',
-'prefs-textboxsize' => 'Tahrir oynasining oʻlchami',
 'youremail' => 'E-mail:',
 'username' => 'Foydalanuvchi nomi',
 'uid' => 'Identifikator:',
@@ -974,7 +988,6 @@ Agar keltirsangiz, undan sahifa kim tomonidan tahrirlanganini koʻrsatish uchun
 'recentchangeslinked-feed' => 'Bogʻliq oʻzgarishlar',
 'recentchangeslinked-toolbox' => 'Bogʻliq oʻzgarishlar',
 'recentchangeslinked-title' => '"$1"ga aloqador oʻzgarishlar',
-'recentchangeslinked-noresult' => 'Berilgan davrda bogʻlangan sahifalarda oʻzgarishlar boʻlmagan.',
 'recentchangeslinked-summary' => "Ushbu maxsus sahifa unga bogʻlangan sahifalardagi soʻnggi oʻzgarishlarni koʻrsatadi. [[Special:Watchlist|Kuzatuv roʻyxatingizdagi]] sahifalar '''qalin''' qilib koʻrsatilgan.",
 'recentchangeslinked-page' => 'Sahifa nomi:',
 'recentchangeslinked-to' => 'Koʻrsatilgan sahifaga bogʻlangan sahifalardagi oʻzgarishlarni koʻrish',
@@ -1065,8 +1078,6 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'statistics-users-active' => 'Faol foydalanuvchilar',
 'statistics-users-active-desc' => 'Oxirgi $1 kun ichida kamida bitta amal qilgan foydalanuvchilar',
 
-'disambiguationspage' => '{{ns:template}}:Disambig',
-
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bayt}}',
 'ncategories' => '$1 {{PLURAL:$1|turkum|turkumlar}}',
@@ -1452,7 +1463,6 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'blocklogentry' => '$2 muddatga [[$1]]ni chetlashtirdi $3',
 'block-log-flags-nocreate' => 'hisob ochish toʻxtatilgan',
 'block-log-flags-nousertalk' => "o'zining munozara sahifasini tahrirlay olmaydi",
-'proxyblocksuccess' => 'Bajarildi.',
 
 # Move page
 'move-page' => '$1 — qayta nomlash',
@@ -1584,12 +1594,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'pageinfo-redirectsto' => 'Qayta yoʻnaltirish',
 
 # Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => "Sog'inch",
 'skinname-cologneblue' => 'Kyolncha sogʻinch',
-'skinname-myskin' => "O'zimniki",
-'skinname-chick' => "Jo'ja",
-'skinname-simple' => 'Oddiy',
 'skinname-modern' => 'Zamonaviy',
 'skinname-vector' => 'Vektor',
 
@@ -1618,7 +1623,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'metadata-expand' => 'Batafsil axborotni koʻrsatish',
 'metadata-collapse' => 'Batafsil axborotni yashirish',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Eni',
 'exif-imagelength' => 'Boʻyi',
 'exif-artist' => 'Muallif',
diff --git a/languages/messages/MessagesVe.php b/languages/messages/MessagesVe.php
index 70892fb5..4732fb68 100644
--- a/languages/messages/MessagesVe.php
+++ b/languages/messages/MessagesVe.php
@@ -12,12 +12,12 @@
  */
 
 $messages = array(
-'search' => 'Ṱolani',
+'search'       => 'Ṱolani',
 'searchbutton' => 'Ṱolani',
-'talk' => 'Ambani',
+'talk'         => 'Ambani',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'mainpage' => 'Hayani',
+'mainpage'             => 'Hayani',
 'mainpage-description' => 'Hayani',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
@@ -27,12 +27,12 @@ $messages = array(
 'error' => 'Vhukhakhi',
 
 # Login and logout pages
-'yourname' => 'Dzina ḽa mushumisi:',
+'yourname'     => 'Dzina ḽa mushumisi:',
 'yourpassword' => 'Phasiwede:',
 
 # Preferences page
 'changepassword' => 'Shandukisani phasiwede',
-'username' => 'Dzina ḽa mushumisi:',
+'username'       => 'Dzina ḽa mushumisi:',
 
 # Miscellaneous special pages
 'newpages-username' => 'Dzina ḽa mushumisi:',
diff --git a/languages/messages/MessagesVec.php b/languages/messages/MessagesVec.php
index a00868cf..cd96f55b 100644
--- a/languages/messages/MessagesVec.php
+++ b/languages/messages/MessagesVec.php
@@ -14,6 +14,7 @@
  * @author GatoSelvadego
  * @author Kaganer
  * @author Malafaya
+ * @author Nemo bis
  * @author Nick1915
  * @author Omnipaedista
  * @author OrbiliusMagister
@@ -126,6 +127,7 @@ $specialPageAliases = array(
 	'Randomredirect'            => array( 'UnRimandoAOcio' ),
 	'Recentchanges'             => array( 'ÙltimiCanbiamenti' ),
 	'Recentchangeslinked'       => array( 'CanbiamentiLigà' ),
+	'Redirect'                  => array( 'Rimando' ),
 	'Revisiondelete'            => array( 'ScancelaRevision' ),
 	'Search'                    => array( 'Serca' ),
 	'Shortpages'                => array( 'PaginePiCurte' ),
@@ -187,9 +189,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostra el numaro de utenti che i ga ła pajina en oservasion',
 'tog-oldsig' => 'Anteprima de ła firma:',
 'tog-fancysig' => 'Interpreta i comandi wiki in te la firma (sensa colegamento automatego)',
-'tog-externaleditor' => "Dopara par default un editor de testo esterno (soło par utenti esperti. Richiede l'uxo de inpostasion particołari sol proprio computer)",
-'tog-externaldiff' => "Dopara par default un programa de diff esterno (soło par utenti esperti. Richiede l'uxo de inpostasion particołari sol proprio computer)",
-'tog-showjumplinks' => 'Ativa i cołegamenti acesibiłi "va a"',
 'tog-uselivepreview' => 'Ativa ła funsion "Line preview" (el dimanda JavaScript; sperimentałe)',
 'tog-forceeditsummary' => "Chiedi conferma se l'ozeto de ła modifega el xé vodo",
 'tog-watchlisthideown' => 'Scondi łe me modifeghe ne i oservai spesałi',
@@ -202,6 +201,7 @@ $messages = array(
 'tog-diffonly' => 'No visuałisar el contenuo de ła pajina dopo el confronto tra version',
 'tog-showhiddencats' => 'Mostra łe categorie sconte',
 'tog-norollbackdiff' => 'No mostrare el confronto tra version dopo aver efetuà on rollback',
+'tog-useeditwarning' => 'Dime se sto lassando na pagina de modifica sensa aver salvà',
 
 'underline-always' => 'Senpre',
 'underline-never' => 'Mai',
@@ -265,6 +265,18 @@ $messages = array(
 'oct' => 'oto',
 'nov' => 'nov',
 'dec' => 'dis',
+'january-date' => '$1 de zenaro',
+'february-date' => '$1 de febraro',
+'march-date' => '$1 de marso',
+'april-date' => '$1 de avril',
+'may-date' => '$1 de majo',
+'june-date' => '$1 de zugno',
+'july-date' => '$1 de lujo',
+'august-date' => '$1 de agosto',
+'september-date' => '$1 de setenbre',
+'october-date' => '$1 de otobre',
+'november-date' => '$1 de novenbre',
+'december-date' => '$1 de desenbre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categorie}}',
@@ -346,6 +358,7 @@ $messages = array(
 'create-this-page' => 'Crea sta pagina',
 'delete' => 'Scansela',
 'deletethispage' => 'Scansela sta pagina',
+'undeletethispage' => 'Recupera sta pagina',
 'undelete_short' => 'Recupera {{PLURAL:$1|na revision|$1 revision}}',
 'viewdeleted_short' => 'Vedi {{PLURAL:$1|na modifega cancełà|$1 modifeghe cancełade}}',
 'protect' => 'Protezi',
@@ -389,7 +402,7 @@ $1',
 'pool-queuefull' => 'La cóa de laorassion la xe piena',
 'pool-errorunknown' => 'Eror sconossùo',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Se parla de {{SITENAME}}',
 'aboutpage' => 'Project:Se parla de',
 'copyright' => "Contenui sojeti a licensa d'uso $1.",
@@ -399,7 +412,6 @@ $1',
 'disclaimers' => 'Avertense',
 'disclaimerpage' => 'Project:Avertense xenerali',
 'edithelp' => 'Guida',
-'edithelppage' => 'Help:Modifega',
 'helppage' => 'Help:Ajuto',
 'mainpage' => 'Pajina prinsipałe',
 'mainpage-description' => 'Pajina prinsipałe',
@@ -476,17 +488,6 @@ L'elenco de le pagine speciali te lo cati su [[Special:SpecialPages|{{int:specia
 # General errors
 'error' => 'Erore',
 'databaseerror' => 'Erore del database',
-'dberrortext' => 'Eror de sintasi inte ła dimanda inoltrà al database.
-Ciò podaria indicar ła prexensa de un bug inte\'l software.
-L\'ultema query invià al database ła xè sta:
-<blockquote><tt>$1</tt></blockquote>
-riciamà da ła funsion "<tt>$2</tt>".
-El database el ga restituio el seguente eror "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Erore de sintasi ne ła richiesta inoltrà al database.
-L\'ultima query invià al database xè sta:
-"$1"
-riciamà da ła funsion "$2".
-El database ga restituio el seguente erore "$3: $4".',
 'laggedslavemode' => "'''Atension:''' ła pajina podaria no riportare i azornamenti pì resenti.",
 'readonly' => 'Database blocà',
 'enterlockreason' => 'Indicare el motivo del bloco, spesifegando el momento in cui xè presumibiłe che el venga rimoso',
@@ -540,7 +541,6 @@ Query: $2',
 Par xontar o modifegar tradusion par tute łe wiki doparar [//translatewiki.net/ translatewiki.net], el projeto de locałixasion de MediaWiki.",
 'editinginterface' => "'''Ocio:''' El testo de sta pàjina el fa parte de l'interfacia utente del sito. Tute łe modifeghe aportae a sta pajina se riflete so i mesaji visuałixà par tuti i utenti so sta wiki.
 Par xontare o modifegar łe tradusion vałide so tute łe wiki, considera ła posibiłità de doparar [//translatewiki.net/wiki/Main_Page?setlang=vec translatewiki.net], el projeto MediaWiki par ła localixasion.",
-'sqlhidden' => '(ła query SQL ła xè sta sconta)',
 'cascadeprotected' => 'So sta pajina no xè posibiłe efetuare modifeghe parché xè sta inclusa {{PLURAL:$1|ne ła pajina indicà de seguito, che xè sta proteta|ne łe pajine indicae de seguito, che e xè sta protete}} sełesionando ła protesion "ricorsiva":
 $2',
 'namespaceprotected' => "No se dispone de i parmesi nesesari par modifegare łe pajine del namespace '''$1'''.",
@@ -571,10 +571,19 @@ Ocio che serte pagine podarìa èssar che ti 'e vedi come se te fussi 'ncora dre
 'welcomecreation-msg' => 'El to nome utente el xe stà creà.
 Nó desmentegarte de personałixare łe [[Special:Preferences|prefarense de {{SITENAME}}]].',
 'yourname' => 'Nome utente:',
+'userlogin-yourname' => 'Nome utente',
+'userlogin-yourname-ph' => 'Inserissi el to nome utente',
+'createacct-another-username-ph' => 'Inserissi el nome utente:',
 'yourpassword' => 'Password:',
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => 'Inserisi ła to password',
+'createacct-yourpassword-ph' => 'Inserisi na password',
 'yourpasswordagain' => 'De novo la password:',
+'createacct-yourpasswordagain' => 'Conferma la password',
+'createacct-yourpasswordagain-ph' => 'Inserissi da novo la password',
 'remembermypassword' => 'Tiente in mente la password su sto conputer (par un massimo de $1 {{PLURAL:$1|zorno|zorni}})',
-'securelogin-stick-https' => 'Resta tacà par HTTPS dopo èssar entrà',
+'userlogin-remembermypassword' => 'Tienme colegà',
+'userlogin-signwithsecure' => 'Entra con na conesion segura',
 'yourdomainname' => 'Spesifegare el dominio',
 'password-change-forbidden' => 'Nó xe posibiłe canbiar ła password so sta wiki.',
 'externaldberror' => "Se xè verifegà n'erore con el server de autenticasion esterno, opure no se dispone de łe autorizasion nesesarie par ajornare el proprio aceso esterno.",
@@ -586,18 +595,39 @@ Nó desmentegarte de personałixare łe [[Special:Preferences|prefarense de {{SI
 'logout' => 'Và fora',
 'userlogout' => 'và fora',
 'notloggedin' => 'No te sì entrà col to nome utente',
+'userlogin-noaccount' => 'Gheto mia na utensa?',
+'userlogin-joinproject' => 'Unìssete a {{SITENAME}}',
 'nologin' => "No te sito gnancora iscrito? '''$1'''.",
 'nologinlink' => 'Falo desso',
 'createaccount' => 'Crea un utente novo',
 'gotaccount' => "Sito zà iscrito? '''$1'''.",
 'gotaccountlink' => 'Entra',
 'userlogin-resetlink' => "Desmentegà i to dati d'aceso?",
+'userlogin-resetpassword-link' => 'Reinposta la to password',
+'helplogin-url' => 'Help:Login',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuto col login]]',
+'createacct-join' => 'Meti le to informassion qua soto.',
+'createacct-emailrequired' => 'Indirisso e-mail',
+'createacct-emailoptional' => 'Indiriso e-mail (opsionałe)',
+'createacct-email-ph' => 'Inserissi el to indirizo de e-mail',
 'createaccountmail' => 'Dopara na password caxuałe tenporanea e inviała al indiriso e-mail spesifegà cuà soto',
+'createacct-realname' => 'Nome reale (opsionale)',
 'createaccountreason' => 'Motivassion:',
+'createacct-reason' => 'Motivo',
+'createacct-reason-ph' => "Com'èla te sì drio crear n'altra utensa",
+'createacct-captcha' => 'Controlo de sicuresa',
+'createacct-imgcaptcha-ph' => 'Inserissi el testo che te vedi de sora',
+'createacct-submit' => 'Crea la to utensa',
+'createacct-another-submit' => "Crèa n'altra utensa",
+'createacct-benefit-heading' => '{{SITENAME}} xe fato da gente come ti.',
+'createacct-benefit-body1' => '$1 {{PLURAL:$1|contributo|contributi}}',
+'createacct-benefit-body2' => '$1 {{PLURAL:$1|pàxena|pàxene}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributor recente|contributori recenti}}',
 'badretype' => 'Le do password le xe difarenti.',
 'userexists' => 'El nome utente inserido vien xa doparà da cualchedun altro.
 Prova co un nome utente difarente.',
 'loginerror' => "Erore ne l'aceso",
+'createacct-error' => "Eror durante la creasion de l'utensa",
 'createaccounterror' => "No se pole crear l'utente: $1",
 'nocookiesnew' => "Ła rejistrasion xè sta conpletà, ma no xè sta posibiłe asedare a {{SITENAME}} parché i cookie i xè disativai. Riprovare l'aceso con el nome utente e ła password pena creai dopo aver ativà i cookie nel proprio browser.",
 'nocookieslogin' => "L'aceso a {{SITENAME}} richiede l'uso de i cookie, che i risulta disativai. Riprovare l'aceso dopo aver ativà i cookie nel proprio browser.",
@@ -651,7 +681,7 @@ La password par l\'utente "$2" la xe inpostà a "$3". Xe oportuno eseguir un ace
 Se l\'acesso el xe stà creà par sbaglio, se pol ignorar sto messagio.',
 'usernamehasherror' => "El nome utente no'l pode contegner caràteri hash",
 'login-throttled' => 'Te ghè fato massa tentativi de autenticarte.
-Spèta un tocheto prima de proàr da novo.',
+Spèta $1 prima de proàr da novo.',
 'login-abort-generic' => 'El to login no xe riusido - Anułà.',
 'loginlanguagelabel' => 'Lengua: $1',
 'suspicious-userlogout' => 'Ła to richiesta de disconesion xè sta negà parché e a senbra invià da on browser non funsionante o on proxy de caching.',
@@ -670,7 +700,7 @@ Spèta un tocheto prima de proàr da novo.',
 'newpassword' => 'Nova password:',
 'retypenew' => 'Riscrivi la password nova:',
 'resetpass_submit' => 'Inposta la password e acedi al sito',
-'resetpass_success' => 'La password la xe stà modificà. Acesso in corso...',
+'changepassword-success' => 'La password la xe stà modificà!',
 'resetpass_forbidden' => 'No se pol modificar le password',
 'resetpass-no-info' => "Te ghè da ver fato l'acesso per poder entrar in sta pàxena.",
 'resetpass-submit-loggedin' => 'Cànbia password',
@@ -682,10 +712,9 @@ Forse te ghè zà canbià la to password o te ghè domandà na password tenporan
 
 # Special:PasswordReset
 'passwordreset' => 'Rinposta ła password',
-'passwordreset-text' => 'Conpleta sto moduło par resetar la to password.',
 'passwordreset-legend' => 'Rinposta ła password',
 'passwordreset-disabled' => 'Ła rinpostasion deła password xe stà dixabiłità so sto projeto wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1|| Inserisi una dełe porsion de dati cua soto}}',
+'passwordreset-emaildisabled' => 'Le funsionalità de posta eletrònega le xe stà disabilità su sta wiki.',
 'passwordreset-username' => 'Nome utente:',
 'passwordreset-domain' => 'Dominio',
 'passwordreset-capture' => 'Vixuałixare el contenuto del mesajo de posta ełetronega?',
@@ -710,7 +739,7 @@ Sarìa mejo acedare e deçidare na nova password sùito. Se no te si stà ti a f
 Password tenporanea: $2',
 'passwordreset-emailsent' => 'Xe stà invià na mail de reset password.',
 'passwordreset-emailsent-capture' => 'Xe stà invià na mail de reset password: el contegù xe riportà cuà de seguito.',
-'passwordreset-emailerror-capture' => "Xe stà generà el promemoria riportà cuà de seguito. L'invio al utente no xe riusido: $1",
+'passwordreset-emailerror-capture' => "Xe stà generà na mail de reset password, riportà cuà de seguito. L'invio a {{GENDER:$2|l'utente}} no xe riusido: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Canbia indiriso de posta ełetronega',
@@ -724,6 +753,9 @@ Password tenporanea: $2',
 'changeemail-submit' => 'Canbia indiriso de posta ełetronega',
 'changeemail-cancel' => 'Anuła',
 
+# Special:ResetTokens
+'resettokens-token-label' => '$1 (valor atuale: $2)',
+
 # Edit page toolbar
 'bold_sample' => 'Testo in grosso',
 'bold_tip' => 'Testo in grosso',
@@ -917,6 +949,8 @@ La esiste de zà.',
 'content-failed-to-parse' => "Inposibiłe anałixare $2 pa'l modèl $1: $3",
 'invalid-content-data' => 'Dati contegnui nó vałidi',
 'content-not-allowed-here' => 'Contegnùo in "$1" nó consentio inte ła pàjina [[$2]]',
+'editwarning-warning' => 'Se te vè via da sta pagina te podaressi pèrdar tute le modìfeghe che te ghè fato.
+Se te sì loggà, te poli disabilitar sto aviso in te la sezion "{{int:prefs-editing}} de le to preferense.',
 
 # Content models
 'content-model-wikitext' => 'wikitesto',
@@ -1126,6 +1160,7 @@ Assicùrete che la continuità storica de la pagina no la vegna alterà.',
 'compareselectedversions' => 'Confronta le version segnàe',
 'showhideselectedversions' => 'Mostra/scondi version selessionà',
 'editundo' => 'tira indrìo',
+'diff-empty' => '(Nissuna difarensa)',
 'diff-multi' => '({{PLURAL:$1|Una revision intermedia|$1 revision intermedie}} de {{PLURAL:$2|un utente|$2 utenti}} mia mostrà)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Una revision intermedia|$1 revision intermedie}} de pi de {{PLURAL:$2|un utente|$2 utenti}} mia mostrà)',
 'difference-missing-revision' => "{{PLURAL:$2|Na version|$2 version}} de sta difarensa ($1) {{PLURAL:$2|nó ła xe sta trovà|nó łe xe stae trovae}}.
@@ -1153,7 +1188,6 @@ I detaji i pol esar catai inte'l [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'searchmenu-legend' => 'Opzion de riserca',
 'searchmenu-exists' => 'Su sto sito ghe xe na pagina che se ciama "[[:$1]]"',
 'searchmenu-new' => "'''Crèa la pagina \"[[:\$1]]\" su sta wiki!'''",
-'searchhelp-url' => 'Help:Ajuto',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Varda tute le pagine che taca co ste létere]]',
 'searchprofile-articles' => 'Pagine de contenuti',
 'searchprofile-project' => 'Pagine de progeto e de ajuto',
@@ -1195,15 +1229,7 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
 'powersearch-togglenone' => 'Nissun',
 'search-external' => 'Riserca esterna',
 'searchdisabled' => 'La riserca interna de {{SITENAME}} no la xe ativa; par intanto te pol proár a doparar un motore de riserca esterno come Google. (Nota però che i contenuti de {{SITENAME}} presenti in sti motori i podarìa èssar mìà agiornà.)',
-
-# Quickbar
-'qbsettings' => 'Settaggio barra menu',
-'qbsettings-none' => 'Nessun',
-'qbsettings-fixedleft' => 'Fisso a sinistra',
-'qbsettings-fixedright' => 'Fisso a destra',
-'qbsettings-floatingleft' => 'Fluttuante a sinistra',
-'qbsettings-floatingright' => 'Fluttuante a destra',
-'qbsettings-directionality' => 'Fiso, a seconda de ła diresion del testo nte ła to lengua',
+'search-error' => 'Se gà verifegà un eror durante la riserca: $1',
 
 # Preferences page
 'preferences' => 'Prefarense',
@@ -1237,7 +1263,6 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
 'resetprefs' => 'Reinposta le preferense',
 'restoreprefs' => 'Ripristina le inpostassion predefinìe',
 'prefs-editing' => 'Canbiamento',
-'prefs-edit-boxsize' => 'Dimension de la finestra de modìfega.',
 'rows' => 'Righe:',
 'columns' => 'Cołone:',
 'searchresultshead' => 'Riserca',
@@ -1248,7 +1273,6 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
 'recentchangesdays-max' => '($1 {{PLURAL:$1|zorno|zorni}} massimo)',
 'recentchangescount' => 'Nùmaro de modìfeghe da far védar (valor predefinìo):',
 'prefs-help-recentchangescount' => 'Questo include i ùltimi canbiamenti, el stòrico de le pàxene e i registri.',
-'prefs-help-watchlist-token' => 'Conpilando sto canpo co na ciave segreta vegnarà generà un feed RSS par i propri osservati speciali. Chiunque conossa la ciave in sto canpo el podarà lèzar i osservati speciali, quindi se racomanda de inserir un valore sicuro. Qua ghe xe un valore generà casualmente che se pol doparar: $1',
 'savedprefs' => 'Le to preferense łe xè stà salvae.',
 'timezonelegend' => 'Fuso orario:',
 'localtime' => 'Ora locale:',
@@ -1279,7 +1303,6 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
 'prefs-reset-intro' => 'Te pol doparar sta pagina par riportar le to preferense a quele predefinìe.
 Sta operassion no la pol èssar anulà.',
 'prefs-emailconfirm-label' => "Conferma de l'e-mail:",
-'prefs-textboxsize' => 'Dimension de la casèla de modifica',
 'youremail' => 'La to e-mail',
 'username' => '{{GENDER:$1|Nome utente}}:',
 'uid' => '{{GENDER:$1|ID utente}}:',
@@ -1345,6 +1368,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'userrights-notallowed' => 'No te ghe i parmesi necesari par xontarghe o cavarghe diriti ai utenti.',
 'userrights-changeable-col' => 'Grupi che te pol canbiar',
 'userrights-unchangeable-col' => 'Grupi che no te pol canbiar',
+'userrights-conflict' => 'Conflito de diriti utente! Aplica de novo le to modifiche.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1479,6 +1503,8 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|canbiamento|canbiamenti}}',
+'enhancedrc-since-last-visit' => "$1 {{PLURAL:$1|da l'ultima visita}}",
+'enhancedrc-history' => 'storia',
 'recentchanges' => 'Ultimi canbiamenti',
 'recentchanges-legend' => 'Prefarense par i ultimi canbiamenti',
 'recentchanges-summary' => 'Qua se vede i ultimi canbiamenti fati a sto sito.',
@@ -1518,7 +1544,6 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'recentchangeslinked-feed' => 'Canbiamenti ligà a sta pagina',
 'recentchangeslinked-toolbox' => 'Canbiamenti ligà a sta pagina',
 'recentchangeslinked-title' => 'Canbiamenti ligà a "$1"',
-'recentchangeslinked-noresult' => 'Nel periodo specificà no ghe xe stà nissuna modifica a le pagine colegà.',
 'recentchangeslinked-summary' => "Sti qua i xe i canbiamenti fati ultimamente a pagine pontà da na pagina indicà da ti (o a pagine de na categoria indicà da ti).
 Le pagine [[Special:Watchlist|tegnùe d'ocio]] le xe in '''grosso'''.",
 'recentchangeslinked-page' => 'Nome de la pagina:',
@@ -1741,7 +1766,6 @@ Par na major sicuressa, img_auth.php el xe disabilità.',
 'http-read-error' => 'Eror de letura HTTP.',
 'http-timed-out' => 'Richiesta HTTP scadùa.',
 'http-curl-error' => "Eror nel recupero de l'URL: $1",
-'http-host-unreachable' => 'URL mìa ragiungibile',
 'http-bad-status' => 'Ghe xe stà un problema durante la richiesta HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1770,6 +1794,9 @@ Se l'utente modifega l'ordenamento, vien mostradi soło i file caricadi pi de re
 'listfiles_size' => 'Dimension in byte',
 'listfiles_description' => 'Descrizion',
 'listfiles_count' => 'Versioni',
+'listfiles-latestversion' => 'Version atuale',
+'listfiles-latestversion-yes' => 'Sì',
+'listfiles-latestversion-no' => 'No',
 
 # File description page
 'file-anchor-link' => 'File',
@@ -1864,6 +1891,11 @@ Probabilmente te vui modifegar ła descrision prexente inte ła [$2 pàjina de d
 'randompage' => 'Na pagina a ocio',
 'randompage-nopages' => 'No ghe xe nissuna pàxena in {{PLURAL:$2|tel|tei}} namespace "$1".',
 
+# Random page in category
+'randomincategory' => 'Pagina a ocio in te na categoria',
+'randomincategory-nopages' => 'No ghe xe mia pagine in [[:Category:$1]].',
+'randomincategory-selectcategory-submit' => 'Và',
+
 # Random redirect
 'randomredirect' => 'Un redirect a caso',
 'randomredirect-nopages' => 'No ghe xe nissun rimando in tel namespace "$1".',
@@ -1889,12 +1921,6 @@ Probabilmente te vui modifegar ła descrision prexente inte ła [$2 pàjina de d
 'statistics-users-active-desc' => "Utenti che gà fato almanco un'azion in {{PLURAL:$1|tel'ultimo zorno|in tei ultimi $1 zorni}}",
 'statistics-mostpopular' => 'Pagine piassè visità',
 
-'disambiguations' => 'Pajine cołegade a pajine de dixanbiguasion',
-'disambiguationspage' => 'Template:Disambigua',
-'disambiguations-text' => "Łe pàjine inte ła lista cuà soto łe ga drento almanco un ligamento a na '''pàjina de dixanbiguasion'''.
-Łe podaria dover puntar a na pàjina pì apropià.<br />
-Vien considerae pàjine de dixanbiguasion tute cuełe che łe ga drento i modełi elencai in [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Pagine co na proprietà de pagina',
 'pageswithprop-legend' => 'Pagine co na proprietà de pagina',
 'pageswithprop-text' => 'Sta pagina la elenca le pagine che dòpara na particolare proprietà de pagina.',
@@ -2147,10 +2173,9 @@ I futuri canbiamenti a sta pàjina e a ła so pàjina de discusion i vegnarà el
 'unwatchthispage' => "Desmeti de tegner d'ocio",
 'notanarticle' => 'Sta pagina no la xè na pagina de contenuto',
 'notvisiblerev' => 'La revision la xe stà scancelà',
-'watchnochange' => "Nissuna pagina tegnùa d'ocio la xe stà canbià nel periodo mostrà.",
 'watchlist-details' => "Te sì drio tegner d'ocio {{PLURAL:$1|una pagina (e la so pagina de discussion)|$1 pagine (e le so pagine de discussion)}}.",
-'wlheader-enotif' => '* Xe ativà la notifica via e-mail.',
-'wlheader-showupdated' => "* Le pagine che xe stà canbià da la to ultima visita le xe segnà in '''grosso'''",
+'wlheader-enotif' => 'Xe ativà la notifica via e-mail.',
+'wlheader-showupdated' => "Le pagine che xe stà canbià da la to ultima visita le xe segnà in '''grosso'''",
 'watchmethod-recent' => 'controło de łe ultime modifeghe par i osservati speciałi',
 'watchmethod-list' => 'controło de i osservati speciałi par modifeghe recenti',
 'watchlistcontains' => 'La lista de i osservati speciałi la contien {{PLURAL:$1|una pagina|$1 pagine}}.',
@@ -2542,13 +2567,11 @@ Qua soto ghe xe el registro de le sopression:',
 'ipb_blocked_as_range' => "Eror: L'indirizo IP $1 no'l xe sogeto a bloco individual e no'l pol èssar sblocà. El bloco el xe invesse ativo a livel de l'intervalo $2, che el pol èssar sblocà.",
 'ip_range_invalid' => 'Intervało de indirissi IP mìa vałido.',
 'ip_range_toolarge' => 'No se pol mia blocar intervali piassè grandi de /$1',
-'blockme' => 'Blòcheme',
 'proxyblocker' => 'Bloco dei proxy verti',
-'proxyblocker-disabled' => 'Sta funzion la xe disabilità.',
 'proxyblockreason' => 'Sto indirizo IP el xe stà blocà parché el risulta èssar un proxy verto. Se prega de contatar el proprio fornitor de acesso a Internet o el suporto tènico e dirghe de sto grave problema de sicureza.',
-'proxyblocksuccess' => 'Fatto.',
 'sorbsreason' => 'Sto indirizo IP el xe elencà come proxy verto ne la lista nera DNSBL doparà da {{SITENAME}}.',
 'sorbs_create_account_reason' => 'No se pol crear acessi novi da sto indirizo IP parché el xe elencà come proxy verto ne la lista nera DNSBL doparà da {{SITENAME}}.',
+'xffblockreason' => "Un indiriso IP presente ne l'intestasion X-Forwarded-For, tuo o del server proxy che te sì drio doparar, el xe stà blocà. La motivasion originale del bloco la xe: $1",
 'cant-block-while-blocked' => 'No se pode blocar altri utenti finché se xe blocài.',
 'cant-see-hidden-user' => "L'utente che te vol blocar el xe zà stà blocà e sconto. Sicome a no te ghè mia i diriti de hideuser, no te pol mia védar o canbiar el bloco de l'utente.",
 'ipbblocked' => 'No te pui blocare o sblocare altri utenti, parché ti steso te si blocà',
@@ -2707,6 +2730,8 @@ Par piaser visita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
 'thumbnail-more' => 'Ingrandissi',
 'filemissing' => 'File mancante',
 'thumbnail_error' => 'Eror ne la creazion de la miniatura: $1',
+'thumbnail_error_remote' => 'Messajo de eror da $1:
+$2',
 'djvu_page_error' => 'Nùmaro de pagina DjVu sbaglià',
 'djvu_no_xml' => "Inpossibile otegner l'XML par el file DjVu",
 'thumbnail-temp-create' => 'Inposibiłe crear el file tenporaneo de łe miniadure',
@@ -2999,11 +3024,25 @@ La so esecuzion la podarìa danegiar el to computer.",
 'minutes' => '{{PLURAL:$1|un minuto|$1 minuti}}',
 'hours' => "{{PLURAL:$1|un'ora|$1 ore}}",
 'days' => '{{PLURAL:$1|un zorno|$1 zorni}}',
+'weeks' => '{{PLURAL:$1|$1 stimana|$1 stimane}}',
 'months' => '{{PLURAL:$1|$1 mexe|$1 mexi}}',
 'years' => '{{PLURAL:$1|$1 ano|$1 ani}}',
 'ago' => '$1 fa',
 'just-now' => 'giusto desso',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ora|ore}} fa',
+'minutes-ago' => '$1 {{PLURAL:$1|minuto|minuti}} fa',
+'seconds-ago' => '$1 {{PLURAL:$1|secondo|secondi}} fa',
+'monday-at' => 'Luni a le $1',
+'tuesday-at' => 'Marti a le $1',
+'wednesday-at' => 'Mèrcore a le $1',
+'thursday-at' => 'Zòbia a le $1',
+'friday-at' => 'Vènere a le $1',
+'saturday-at' => 'Sabo a le $1',
+'sunday-at' => 'Doménega a le $1',
+'yesterday-at' => 'Jèri a le $1',
+
 # Bad image list
 'bad_image_list' => 'El formato xe sto qua:
 
@@ -3031,7 +3070,7 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Largheza',
 'exif-imagelength' => 'Alteza',
 'exif-bitspersample' => 'Bit par campione',
@@ -3209,7 +3248,7 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
 'exif-originalimageheight' => "Altesa de l'imaxene prima che ła fuse tajà",
 'exif-originalimagewidth' => "Larghesa de l'imaxene prima che ła fuse tajà",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'No conpresso',
 'exif-compression-2' => 'CCITT grupo 3 monodimensionałe - codifega run length de Huffman modifegà',
 'exif-compression-3' => 'Codifega fax CCITT Group 3',
@@ -3599,7 +3638,6 @@ Nota che te pol anca [[Special:EditWatchlist|modificar la lista con l'interfacia
 'version-other' => 'Altro',
 'version-mediahandlers' => 'Gestori de contenuti multimediài',
 'version-hooks' => 'Hook',
-'version-extension-functions' => 'Funzion introdote da estensioni',
 'version-parser-extensiontags' => 'Tag riconossiùi dal parser introdoti da estensioni',
 'version-parser-function-hooks' => 'Hook par funzioni del parser',
 'version-hook-name' => "Nome de l'hook",
@@ -3608,6 +3646,7 @@ Nota che te pol anca [[Special:EditWatchlist|modificar la lista con l'interfacia
 'version-license' => 'Licensa',
 'version-poweredby-credits' => "Sta wiki la va con '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'altri',
+'version-poweredby-translators' => 'tradutori de translatewiki.net',
 'version-credits-summary' => "Semo contenti de riconosare łe seguenti persone p' 'ver contribuio a [[Special:Version|MediaWiki]].",
 'version-license-info' => "MediaWiki xe un software lìbaro; te pol redistribuirlo e/o modificarlo secondo i termini de la Licensa Publica Zeneral GNU publicà da la Free Software Foundation; secondo la version 2 de la Licensa, o (a scelta tua) una qualunque altra version sucessiva.
 
@@ -3621,12 +3660,17 @@ Insieme co sto programa te dovaressi 'ver ricevùo na copia de la Licensa Public
 'version-entrypoints-header-entrypoint' => 'Punti de aceso',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Percorso de un file',
-'filepath-page' => 'Nome del file:',
-'filepath-submit' => 'Va',
-'filepath-summary' => 'Sta pagina speciale la restituìsse el percorso conpleto de un file.
-Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tipi de file vien avià diretamente el programa associà.',
+# Special:Redirect
+'redirect' => 'Rimando par file, utente, o ID de revision.',
+'redirect-legend' => 'Rimandar a un file o na pagina',
+'redirect-summary' => "Sta pagina speciale la rimanda a un file (dato el nome del file), a na pagina (dato l'ID de la revision), o a na pagina utente (dato l'ID de l'utente).",
+'redirect-submit' => 'Và',
+'redirect-lookup' => 'Ciave de riserca:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'ID utente',
+'redirect-revision' => 'Revision de la pagina',
+'redirect-file' => 'Nome del file',
+'redirect-not-exists' => 'Valor mia catà',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Riçerca dei file duplicà',
@@ -3675,6 +3719,7 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
 'tags' => 'Tag de le modifiche valide',
 'tag-filter' => '[[Special:Tags|Tag]] filtro:',
 'tag-filter-submit' => 'Filtro',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|Eticheta|Etichete}}]]: $2)',
 'tags-title' => 'Tag',
 'tags-intro' => 'Sta pàxena la elenca i tag che el software el podarìa marcar come na modifica e el so significato.',
 'tags-tag' => 'Nome del tag',
@@ -3716,6 +3761,9 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
 'htmlform-submit' => 'Manda',
 'htmlform-reset' => 'Scancèla modifiche',
 'htmlform-selectorother-other' => 'Altro',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Sì',
+'htmlform-chosen-placeholder' => 'Selessiona na opzione',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con la possibilità de riserca completa nel testo',
diff --git a/languages/messages/MessagesVep.php b/languages/messages/MessagesVep.php
index 7872798a..a724c1e8 100644
--- a/languages/messages/MessagesVep.php
+++ b/languages/messages/MessagesVep.php
@@ -118,9 +118,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ozutada niiden kävutajiden lugu, kudambad oma mülütanuded lehtpolen ičeze kaclendnimikirjutesihe',
 'tog-oldsig' => 'Nügüdläine allekirjutez',
 'tog-fancysig' => 'Ičeze allekirjutesen wiki-znamišt (avtomatižeta kosketuseta)',
-'tog-externaleditor' => 'Kävutada irdredaktor augotižjärgendusen mödhe (vaiše ekspertoiden täht; pidab järgeta specialižikš kompjuter; [//www.mediawiki.org/wiki/Manual:External_editors Enamb informacijad.])',
-'tog-externaldiff' => 'Kävutada irdredaktor augotižjärgendusen mödhe (vaiše ekspertoiden täht; pidab järgeta specialižikš kompjuter; [//www.mediawiki.org/wiki/Manual:External_editors Enamb informacijad.])',
-'tog-showjumplinks' => 'Ližata "hüpähtada..."-abukosketused',
 'tog-uselivepreview' => 'Kävutada hered ezikacund (JavaScript) (Eksperimentaline)',
 'tog-forceeditsummary' => 'Varutada, kunz toižetusen ümbrikirjutandan pöud ei ole täuttud',
 'tog-watchlisthideown' => 'Peitta minun redakcijad kaclendnimikirjutesespäi',
@@ -319,7 +316,7 @@ $1",
 'pool-queuefull' => 'Ecindoiden varadim om üläkormatud.',
 'pool-errorunknown' => 'Tundmatoi petuz',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Informacii saitas {{SITENAME}}',
 'aboutpage' => 'Project:Informacii',
 'copyright' => 'südäiolend kävutadas $1-licenzijan mödhe.',
@@ -329,7 +326,6 @@ $1",
 'disclaimers' => 'Pučind vastusenpidandaspäi',
 'disclaimerpage' => 'Project:Pučind vastusenpidandaspäi',
 'edithelp' => 'Abu redaktiruindas',
-'edithelppage' => 'Help:Abu redaktiruindas',
 'helppage' => 'Help:südäiolend',
 'mainpage' => 'Pälehtpol’',
 'mainpage-description' => 'Pälehtpol’',
@@ -403,11 +399,6 @@ Kc. [[Special:SpecialPages|specialižiden lehtpoliden nimikirj]].",
 # General errors
 'error' => 'Petuz',
 'databaseerror' => 'Andmusiden bazan petuz',
-'dberrortextcl' => 'Andmusiden bazas ectes ozaižihe petuz.
-Jäl\'gmäine ecind andmusiden bazas oli:
-"$1"
-funkcijaspäi "$2".
-Andmusiden baz pördi petusen "$3: $4"',
 'laggedslavemode' => "Varutuz: voib olda, lehtpolen versijal ei ole jäl'gmäižid ližadusid.",
 'readonly' => 'Andmusiden baz om luklostadud',
 'enterlockreason' => 'Kirjutagat sü da pandud blokiruindan strok',
@@ -455,7 +446,6 @@ Ecind: $2',
 'editinginterface' => "'''Homaikat:''' Tö ladit redaktiruida lehtpol't, kudambal om programman interfeistekst.
 Mugoi tegend toižetab interfeisan irdnägu toižiden kävutajiden täht.
 Kändmižen täht om paremb kävutada [//translatewiki.net/wiki/Main_Page?setlang=vep translatewiki.net] - MediaWikin lokalizacijan projekt.",
-'sqlhidden' => '(SQL-küzelend om peittud)',
 'namespaceprotected' => "Teil ei ole oiktust redaktiruida lehtpolid '''$1'''-nimiavaruses.",
 'customcssprotected' => 'Teil ei ole oiktust redaktiruida nece CSS-lehtpol’, sikš sil oma toižen ühtnijan personaližed järgendused.',
 'customjsprotected' => 'Teil ei ole oiktust redaktiruida nece JavaScript-lehtpol’, sikš sil oma toižen ühtnijan personaližed järgendused.',
@@ -477,7 +467,6 @@ Otkat sil'mnägubale, miše erasid lehtpolid ozutaškatas mugažo, kut i edel te
 'yourpassword' => 'Peitsana:',
 'yourpasswordagain' => 'Kirjutagat peitsana udes:',
 'remembermypassword' => 'Panda muštho minun tulendandmused neciš kompjuteras (enintään $1 {{PLURAL:$1|päivä|päivää}})',
-'securelogin-stick-https' => "Jäda sidotud HTTPS-ha tulendan jäl'ghe",
 'yourdomainname' => 'Teiden domen:',
 'externaldberror' => 'Ozaižihe petuz autentifikacijan, kudamb tehtihe andmusiden irdbazan turbiš, aigan, vai teile ei ulotu oiktusid toižetada ičetoi irdregistracijad.',
 'login' => 'Kirjutadas sistemha',
@@ -559,7 +548,7 @@ Miše tulda sistemha lopuližikš, teile pidab säta uz' peitsana naku:",
 'newpassword' => "Uz' peitsana:",
 'retypenew' => "Toštkat uz' peitsana:",
 'resetpass_submit' => 'Säta peitsana da kirjutadas sistemha',
-'resetpass_success' => 'Teiden peisana om vajehtadud jügedusita! Tulend sistemha...',
+'changepassword-success' => 'Teiden peisana om vajehtadud jügedusita! Tulend sistemha...',
 'resetpass_forbidden' => 'Ei voi vajehtada peitsanad',
 'resetpass-no-info' => 'Miše kirjutada necil lehtpolel, teile pidab kirjutadas sistemha.',
 'resetpass-submit-loggedin' => 'Vajehtada peitsana',
@@ -929,7 +918,6 @@ Tö ei voigoi kävutada sidä.',
 'searchmenu-legend' => 'Ecindan järgendused',
 'searchmenu-exists' => "'''Neciš Wikiš om jo lehtpol' ningoižen nimenke: \"[[:\$1]]\"'''",
 'searchmenu-new' => "'''Säta lehtpol' \"[[:\$1]]\" neciš Wikiš!'''",
-'searchhelp-url' => 'Help:Südäiolend',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ozutada kaik lehtpoled necen prefiksanke]]',
 'searchprofile-articles' => 'Südäimištlehtpoled',
 'searchprofile-project' => 'Abun da projektoiden lehtpoled',
@@ -974,14 +962,6 @@ Kävutagat prefiks ''all:'', miše ectä kaikes südäimištospäi (lodulehtpoli
 Tö voit nügüd' ectä Google'n turbiš.
 Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda vanhtunuden.",
 
-# Quickbar
-'qbsettings' => "Navigacijan panel'",
-'qbsettings-none' => 'Ala ozuta',
-'qbsettings-fixedleft' => 'Likumatoi huralpäi',
-'qbsettings-fixedright' => 'Likumatoi oiktalpäi',
-'qbsettings-floatingleft' => 'Ujui huralpäi',
-'qbsettings-floatingright' => 'Ujui oiktalpäi',
-
 # Preferences page
 'preferences' => 'Järgendused',
 'mypreferences' => 'Järgendused',
@@ -1013,7 +993,6 @@ Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda v
 'resetprefs' => 'Čuta kaičematomad toižetused',
 'restoreprefs' => 'Endištada kaik augotižjärgendused',
 'prefs-editing' => 'Redaktiruind',
-'prefs-edit-boxsize' => 'Redaktiruindan iknan suruz.',
 'rows' => 'Rivid:',
 'columns' => 'Pachid:',
 'searchresultshead' => 'Ecind',
@@ -1054,7 +1033,6 @@ Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda v
 'prefs-reset-intro' => "Tö sat kävutada nece lehtpol', miše pördutada teiden järgendused saitan ezijärgendusidennoks.
 Necidä tegendad ei sa toižetada.",
 'prefs-emailconfirm-label' => 'E-počtan vahvištand:',
-'prefs-textboxsize' => 'Redaktiruindan iknan suruz',
 'youremail' => 'E-počt:',
 'username' => 'Kävutajan nimi:',
 'uid' => 'Kävutajan nomer:',
@@ -1282,7 +1260,6 @@ Ku tö kirjutat sen, nece nimi kävutadas, miše ozutada lehtpolen toižetajad.'
 'recentchangeslinked-feed' => 'Sidotud toižetused',
 'recentchangeslinked-toolbox' => 'Sidotud toižetused',
 'recentchangeslinked-title' => '"$1"-lehtpol\'he sidotud toižetused',
-'recentchangeslinked-noresult' => 'Sidotud lehtpolil ei olend toižetusid anttud pordon aigan.',
 'recentchangeslinked-summary' => "Neciš nimikirjuteses om tantoižid toižetusid lehtpoliš, kudambid kosketab ozutadud lehtpol'.
 [[Special:Watchlist|Teiden kaclendnimikirjutesen]] lehtpoled oma erigoittud lihavoitud šriftal.",
 'recentchangeslinked-page' => 'Lehtpolen nimi:',
@@ -1409,7 +1386,6 @@ Ku problem jäb jäl'ghepäi-ki, säkat pagin [[Special:ListUsers/sysop|sistemad
 'http-read-error' => "HTTP'd lugemižen petuz.",
 'http-timed-out' => 'HTTP-he küzelendan aig om lopnus.',
 'http-curl-error' => "Petuz URL'ad ecmäs: $1",
-'http-host-unreachable' => 'Ei voi säta sidod URL:anke',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'Ei voi säta sidod URL:anke',
@@ -1540,9 +1516,6 @@ Informacijad sen [$2 andmusiden lehtpolelpäi] om anttud alemba.',
 'statistics-users-active-desc' => "Kävutajad, kudambad ozutiba aktivižut {{PLURAL:$1|jäl’gmäižen päivän|$1 jäl'gmäižil päivil}}",
 'statistics-mostpopular' => 'Kaikiš populärižembad lehtpoled',
 
-'disambiguations' => 'Lehtpoled, kudambil om kosketusid lehtpolihe, kus om äiznamoičendusen laskendoid.',
-'disambiguationspage' => 'Template:Äiznamoičenduz',
-
 'doubleredirects' => 'Kaksitadud läbikosketused',
 'double-redirect-fixed-move' => "[[$1]]-lehtpol' om udesnimitadud. Se läbikosketab nügüd' [[$2]]-lehtpolele.",
 'double-redirect-fixer' => 'Läbikosketusiden kohendai',
@@ -1749,7 +1722,7 @@ Kc. mugažo [[Special:WantedCategories|ectud kategorijoiden nimikirjutez]].',
 'notanarticle' => "Nece ei ole lehtpol'",
 'notvisiblerev' => 'Versijad oma čutud',
 'watchlist-details' => "Teiden kaclendnimikirjuteses om {{PLURAL:$1|$1 lehtpol'|$1 lehtpol't}}. Lodulehtpoled ei olgoi neciš lugus.",
-'wlheader-enotif' => '* Tedotand e-počtadme om kävutamas.',
+'wlheader-enotif' => 'Tedotand e-počtadme om kävutamas.',
 'watchmethod-recent' => 'ozutadas kaceltud lehtpoliden tantoižed toižetused',
 'watchmethod-list' => 'kaceltud lehtpoliden kodvind tantoižid toižetusid ectes',
 'watchlistcontains' => "Teiden kaclendnimikirjuteses om $1 {{PLURAL:$1|lehtpol'|lehtpol't}}.",
@@ -2102,12 +2075,9 @@ Alemba om anttud blokiruindaiglehtez:',
 'ipb_cant_unblock' => 'Petuz: ei voi löuta ID $1:n blokiruindad.
 Voib olda, se om jo heittud.',
 'ip_range_invalid' => 'Vär IP-diapazon.',
-'blockme' => 'Blokiruigat mindai',
 'proxyblocker' => 'Proxy-blokator',
-'proxyblocker-disabled' => 'Nece funkcii ei ole kävutamas.',
 'proxyblockreason' => 'Teiden IP-adres om blokiruidud, sikš miše se om avoin proksi.
 Olgat hüväd, säkat pagin teiden Internet-provaideranke i kirjutagat hänele necen varuitomuden problemas.',
-'proxyblocksuccess' => 'Vaumiž.',
 'sorbsreason' => 'Teiden IP-adres om ozutadud kut avaitud proksi {{SITENAME}}-saitan DNSBL-an mustas nimikirjuteses.',
 'cant-block-while-blocked' => 'Teile ei sa blokiruida toižid kävutajid, sikš miše tö iče olet blokiruidud.',
 
@@ -2371,13 +2341,8 @@ Voib olda, necil lehtpolel om kosketuz irdsaitale, kudamb om mustas nimikirjutes
 'pageinfo-authors' => 'Erazvuiččiden avtoroiden lugu',
 
 # Skin names
-'skinname-standard' => 'Klassine',
-'skinname-nostalgia' => "Nostal'gii",
 'skinname-cologneblue' => "Köl'nan sinine",
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Ičeze',
-'skinname-chick' => 'Cipuine',
-'skinname-simple' => 'Koveritoi',
 'skinname-modern' => "Nügüd'aigaine",
 
 # Patrolling
@@ -2478,7 +2443,7 @@ Ku fail redaktiruidihe sändan polhe, erased parametrad voidas erineda nügüdl
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Leveduz',
 'exif-imagelength' => 'Korktuz’',
 'exif-bitspersample' => 'Mujun süvuz',
@@ -2610,7 +2575,7 @@ Ku fail redaktiruidihe sändan polhe, erased parametrad voidas erineda nügüdl
 'exif-label' => 'Arbaine',
 'exif-pngfilecomment' => 'Kommentarii PNG-failha',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ahtištamatoi',
 
 'exif-unknowndate' => 'Tundmatoi dat',
@@ -2945,7 +2910,6 @@ Kävutagat normaline ezikacund.',
 'version-other' => 'Toine',
 'version-mediahandlers' => 'Median radimed',
 'version-hooks' => 'Sabutajad',
-'version-extension-functions' => 'Ližoiden funkcijad',
 'version-parser-extensiontags' => 'Sintaksižen analizatoran ližoiden virgad',
 'version-parser-function-hooks' => 'Sintaksižen analizatoran funkcijoiden sabutajad',
 'version-hook-name' => 'Sabustajan nimi',
@@ -2958,11 +2922,6 @@ Kävutagat normaline ezikacund.',
 'version-software-version' => 'Versii',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Te failannoks',
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Te',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ectä kaksitadud failad',
 'fileduplicatesearch-summary' => 'Ühtejiččiden failoiden ecmine niiden heš-kodan mödhe.',
diff --git a/languages/messages/MessagesVi.php b/languages/messages/MessagesVi.php
index e80bb060..c5803edd 100644
--- a/languages/messages/MessagesVi.php
+++ b/languages/messages/MessagesVi.php
@@ -58,7 +58,7 @@ $namespaceAliases = array(
 
 $specialPageAliases = array(
 	'Activeusers'               => array( 'Người_dùng_tích_cực' ),
-	'Allmessages'               => array( 'Mọi_thông_báo' ),
+	'Allmessages'               => array( 'Mọi_thông_điệp', 'Mọi_thông_báo' ),
 	'Allpages'                  => array( 'Mọi_bài' ),
 	'Ancientpages'              => array( 'Trang_cũ' ),
 	'Badtitle'                  => array( 'Tựa_đề_hỏng' ),
@@ -73,7 +73,7 @@ $specialPageAliases = array(
 	'ComparePages'              => array( 'So_sánh_trang' ),
 	'Confirmemail'              => array( 'Xác_nhận_thư' ),
 	'Contributions'             => array( 'Đóng_góp' ),
-	'CreateAccount'             => array( 'Đăng_ký', 'Đăng_kí' ),
+	'CreateAccount'             => array( 'Mở_tài_khoản', 'Đăng_ký', 'Đăng_kí' ),
 	'Deadendpages'              => array( 'Trang_đường_cùng' ),
 	'DeletedContributions'      => array( 'Đóng_góp_bị_xóa', 'Đóng_góp_bị_xoá' ),
 	'Disambiguations'           => array( 'Trang_định_hướng' ),
@@ -103,6 +103,7 @@ $specialPageAliases = array(
 	'MIMEsearch'                => array( 'Tìm_MIME' ),
 	'Mostcategories'            => array( 'Thể_loại_lớn_nhất' ),
 	'Mostimages'                => array( 'Tập_tin_liên_kết_nhiều_nhất' ),
+	'Mostinterwikis'            => array( 'Nhiều_liên_wiki_nhất', 'Nhiều_interwiki_nhất' ),
 	'Mostlinked'                => array( 'Liên_kết_nhiều_nhất' ),
 	'Mostlinkedcategories'      => array( 'Thể_loại_liên_kết_nhiều_nhất' ),
 	'Mostlinkedtemplates'       => array( 'Bản_mẫu_liên_kết_nhiều_nhất', 'Tiêu_bản_liên_kết_nhiều_nhất' ),
@@ -114,18 +115,19 @@ $specialPageAliases = array(
 	'Myuploads'                 => array( 'Tập_tin_tôi' ),
 	'Newimages'                 => array( 'Tập_tin_mới', 'Hình_mới' ),
 	'Newpages'                  => array( 'Trang_mới' ),
+	'PagesWithProp'             => array( 'Trang_theo_thuộc_tính' ),
 	'PasswordReset'             => array( 'Tái_tạo_mật_khẩu', 'Đặt_lại_mật_khẩu' ),
 	'PermanentLink'             => array( 'Liên_kết_thường_trực' ),
 	'Popularpages'              => array( 'Trang_phổ_biến' ),
 	'Preferences'               => array( 'Tùy_chọn', 'Tuỳ_chọn' ),
 	'Prefixindex'               => array( 'Tiền_tố' ),
-	'Protectedpages'            => array( 'Trang_khóa' ),
-	'Protectedtitles'           => array( 'Tựa_đề_bị_khóa' ),
+	'Protectedpages'            => array( 'Trang_khóa', 'Trang_khoá' ),
+	'Protectedtitles'           => array( 'Tựa_đề_bị_khóa', 'Tựa_đề_bị_khoá' ),
 	'Randompage'                => array( 'Ngẫu_nhiên' ),
 	'Randomredirect'            => array( 'Đổi_hướng_ngẫu_nhiên' ),
 	'Recentchanges'             => array( 'Thay_đổi_gần_đây' ),
 	'Recentchangeslinked'       => array( 'Thay_đổi_liên_quan' ),
-	'Revisiondelete'            => array( 'Xóa_phiên_bản' ),
+	'Revisiondelete'            => array( 'Xóa_phiên_bản', 'Xoá_phiên_bản' ),
 	'Search'                    => array( 'Tìm_kiếm' ),
 	'Shortpages'                => array( 'Trang_ngắn' ),
 	'Specialpages'              => array( 'Trang_đặc_biệt' ),
@@ -146,7 +148,7 @@ $specialPageAliases = array(
 	'UploadStash'               => array( 'Hàng_đợi_tải_lên' ),
 	'Userlogin'                 => array( 'Đăng_nhập' ),
 	'Userlogout'                => array( 'Đăng_xuất' ),
-	'Userrights'                => array( 'Quyền_thành_viên' ),
+	'Userrights'                => array( 'Quyền_thành_viên', 'Quyền_người_dùng' ),
 	'Version'                   => array( 'Phiên_bản' ),
 	'Wantedcategories'          => array( 'Thể_loại_cần_thiết' ),
 	'Wantedfiles'               => array( 'Tập_tin_cần_thiết' ),
@@ -159,7 +161,7 @@ $specialPageAliases = array(
 
 $magicWords = array(
 	'redirect'                  => array( '0', '#đổi', '#REDIRECT' ),
-	'notoc'                     => array( '0', '__KHÔNGMỤCMỤC__', '__NOTOC__' ),
+	'notoc'                     => array( '0', '__KHÔNGMỤCLỤC__', '__NOTOC__' ),
 	'nogallery'                 => array( '0', '__KHÔNGALBUM__', '__NOGALLERY__' ),
 	'forcetoc'                  => array( '0', '__LUÔNMỤCLỤC__', '__FORCETOC__' ),
 	'toc'                       => array( '0', '__MỤCLỤC__', '__TOC__' ),
@@ -193,6 +195,7 @@ $magicWords = array(
 	'pagename'                  => array( '1', 'TÊNTRANG', 'PAGENAME' ),
 	'pagenamee'                 => array( '1', 'TÊNTRANG2', 'PAGENAMEE' ),
 	'namespace'                 => array( '1', 'KHÔNGGIANTÊN', 'NAMESPACE' ),
+	'namespacenumber'           => array( '1', 'SỐKHÔNGGIANTÊN', 'NAMESPACENUMBER' ),
 	'talkspace'                 => array( '1', 'KGTTHẢOLUẬN', 'TALKSPACE' ),
 	'subjectspace'              => array( '1', 'KGTNỘIDUNG', 'SUBJECTSPACE', 'ARTICLESPACE' ),
 	'fullpagename'              => array( '1', 'TÊNTRANGĐỦ', 'FULLPAGENAME' ),
@@ -212,6 +215,13 @@ $magicWords = array(
 	'img_framed'                => array( '1', 'khung', 'framed', 'enframed', 'frame' ),
 	'img_page'                  => array( '1', 'trang=$1', 'trang $1', 'page=$1', 'page $1' ),
 	'img_upright'               => array( '1', 'đứng', 'đứng=$1', 'đứng $1', 'upright', 'upright=$1', 'upright $1' ),
+	'img_baseline'              => array( '1', 'chân-chữ', 'baseline' ),
+	'img_sub'                   => array( '1', 'chỉ-số-dưới', 'sub' ),
+	'img_super'                 => array( '1', 'chỉ-số-trên', 'super', 'sup' ),
+	'img_top'                   => array( '1', 'trên', 'top' ),
+	'img_text_top'              => array( '1', 'trên-chữ', 'text-top' ),
+	'img_bottom'                => array( '1', 'dưới', 'bottom' ),
+	'img_text_bottom'           => array( '1', 'dưới-chữ', 'text-bottom' ),
 	'img_link'                  => array( '1', 'liên_kết=$1', 'link=$1' ),
 	'img_class'                 => array( '1', 'lớp=$1', 'class=$1' ),
 	'int'                       => array( '0', 'NỘI:', 'INT:' ),
@@ -236,13 +246,23 @@ $magicWords = array(
 	'revisionmonth'             => array( '1', 'THÁNGBẢN', 'REVISIONMONTH' ),
 	'revisionmonth1'            => array( '1', 'THÁNGBẢN1', 'REVISIONMONTH1' ),
 	'revisionyear'              => array( '1', 'NĂMBẢN', 'REVISIONYEAR' ),
+	'revisiontimestamp'         => array( '1', 'MỐCTHỜIGIANBẢN', 'DẤUTHỜIGIANBẢN', 'REVISIONTIMESTAMP' ),
+	'revisionuser'              => array( '1', 'NGƯỜIDÙNGBẢN', 'REVISIONUSER' ),
 	'plural'                    => array( '0', 'SỐNHIỀU:', 'PLURAL:' ),
 	'fullurl'                   => array( '0', 'URLĐỦ:', 'FULLURL:' ),
+	'canonicalurl'              => array( '0', 'URLCHUẨN:', 'CANONICALURL:' ),
+	'lcfirst'                   => array( '0', 'CHỮĐẦUHOA:', 'LCFIRST:' ),
+	'ucfirst'                   => array( '0', 'CHỮĐẦUTHƯỜNG:', 'UCFIRST:' ),
+	'lc'                        => array( '0', 'CHỮHOA:', 'LC:' ),
+	'uc'                        => array( '0', 'CHỮTHƯỜNG:', 'UC:' ),
 	'displaytitle'              => array( '1', 'TÊNHIỂNTHỊ', 'DISPLAYTITLE' ),
 	'newsectionlink'            => array( '1', '__LIÊNKẾTMỤCMỚI__', '__NEWSECTIONLINK__' ),
 	'nonewsectionlink'          => array( '1', '__KHÔNGLIÊNKẾTMỤCMỚI__', '__NONEWSECTIONLINK__' ),
 	'currentversion'            => array( '1', 'BẢNNÀY', 'CURRENTVERSION' ),
 	'urlencode'                 => array( '0', 'MÃHÓAURL:', 'URLENCODE:' ),
+	'anchorencode'              => array( '0', 'MÃHÓANEO', 'ANCHORENCODE' ),
+	'currenttimestamp'          => array( '1', 'MỐCTHỜIGIANNÀY', 'DẤUTHỜIGIANNÀY', 'CURRENTTIMESTAMP' ),
+	'localtimestamp'            => array( '1', 'MỐCTHỜIGIANĐỊAPHƯƠNG', 'DẤUTHỜIGIANĐỊAPHƯƠNG', 'LOCALTIMESTAMP' ),
 	'language'                  => array( '0', '#NGÔNNGỮ:', '#LANGUAGE:' ),
 	'contentlanguage'           => array( '1', 'NGÔNNGỮNỘIDUNG', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
 	'pagesinnamespace'          => array( '1', 'CỠKHÔNGGIANTÊN:', 'CỠKGT:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
@@ -254,6 +274,8 @@ $magicWords = array(
 	'hiddencat'                 => array( '1', '__THỂLOẠIẨN__', '__HIDDENCAT__' ),
 	'pagesincategory'           => array( '1', 'CỠTHỂLOẠI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
 	'pagesize'                  => array( '1', 'CỠTRANG', 'PAGESIZE' ),
+	'index'                     => array( '1', '__CHỈMỤC__', '__INDEX__' ),
+	'noindex'                   => array( '1', '__KHÔNGCHỈMỤC__', '__NOINDEX__' ),
 	'numberingroup'             => array( '1', 'CỠNHÓM', 'NUMBERINGROUP', 'NUMINGROUP' ),
 	'staticredirect'            => array( '1', '__ĐỔIHƯỚNGNHẤTĐỊNH__', '__STATICREDIRECT__' ),
 	'protectionlevel'           => array( '1', 'MỨCKHÓA', 'MỨCKHOÁ', 'PROTECTIONLEVEL' ),
@@ -332,9 +354,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Hiển thị số người đang xem',
 'tog-oldsig' => 'Chữ ký hiện tại:',
 'tog-fancysig' => 'Xem chữ ký là mã wiki (không có liên kết tự động)',
-'tog-externaleditor' => 'Mặc định dùng trình soạn thảo bên ngoài (chỉ dành cho người thành thạo, cần thiết lập đặc biệt trên máy tính của bạn; [//www.mediawiki.org/wiki/Manual:External_editors?uselang=vi chi tiết])',
-'tog-externaldiff' => 'Mặc định dùng trình so sánh bên ngoài (chỉ dành cho người thành thạo, cần thiết lập đặc biệt trên máy tính của bạn; [//www.mediawiki.org/wiki/Manual:External_editors?uselang=vi chi tiết])',
-'tog-showjumplinks' => 'Bật liên kết “bước tới” trên đầu trang cho bộ trình duyệt thuần văn bản hay âm thanh',
 'tog-uselivepreview' => 'Xem trước trực tiếp (thử nghiệm)',
 'tog-forceeditsummary' => 'Nhắc tôi khi tôi quên tóm lược sửa đổi',
 'tog-watchlisthideown' => 'Ẩn các sửa đổi của tôi khỏi danh sách theo dõi',
@@ -348,6 +367,8 @@ $messages = array(
 'tog-showhiddencats' => 'Hiển thị thể loại ẩn',
 'tog-noconvertlink' => 'Tắt liên kết chuyển đổi tựa đề',
 'tog-norollbackdiff' => 'Không so sánh sau khi lùi sửa',
+'tog-useeditwarning' => 'Cảnh báo khi tôi thoát trang sửa đổi mà chưa lưu trang',
+'tog-prefershttps' => 'Luôn kết nối an toàn khi đăng nhập',
 
 'underline-always' => 'Luôn luôn',
 'underline-never' => 'Không bao giờ',
@@ -411,6 +432,18 @@ $messages = array(
 'oct' => 'tháng 10',
 'nov' => 'tháng 11',
 'dec' => 'tháng 12',
+'january-date' => '$1 tháng 1',
+'february-date' => '$1 tháng 2',
+'march-date' => '$1 tháng 3',
+'april-date' => '$1 tháng 4',
+'may-date' => '$1 tháng 5',
+'june-date' => '$1 tháng 6',
+'july-date' => '$1 tháng 7',
+'august-date' => '$1 tháng 8',
+'september-date' => '$1 tháng 9',
+'october-date' => '$1 tháng 10',
+'november-date' => '$1 tháng 11',
+'december-date' => '$1 tháng 12',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Thể loại|Thể loại}}',
@@ -492,6 +525,7 @@ $messages = array(
 'create-this-page' => 'Tạo trang này',
 'delete' => 'Xóa',
 'deletethispage' => 'Xóa trang này',
+'undeletethispage' => 'Phục hồi trang này',
 'undelete_short' => 'Phục hồi {{PLURAL:$1|một sửa đổi|$1 sửa đổi}}',
 'viewdeleted_short' => 'Xem {{PLURAL:$1|sửa đổi|$1 sửa đổi}} đã xóa',
 'protect' => 'Khóa',
@@ -535,7 +569,7 @@ $1',
 'pool-queuefull' => 'Đầy hàng đợi khối ứng dụng (pool queue)',
 'pool-errorunknown' => 'Lỗi lạ',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Giới thiệu {{SITENAME}}',
 'aboutpage' => 'Project:Giới thiệu',
 'copyright' => 'Nội dung được phát hành theo $1, ngoại trừ khi có ghi chú khác.',
@@ -545,7 +579,6 @@ $1',
 'disclaimers' => 'Phủ nhận',
 'disclaimerpage' => 'Project:Phủ nhận chung',
 'edithelp' => 'Trợ giúp sửa đổi',
-'edithelppage' => 'Help:Sửa đổi',
 'helppage' => 'Help:Nội dung',
 'mainpage' => 'Trang Chính',
 'mainpage-description' => 'Trang Chính',
@@ -623,17 +656,12 @@ Có danh sách trang đặc biệt tại [[Special:SpecialPages|{{int:specialpag
 # General errors
 'error' => 'Lỗi',
 'databaseerror' => 'Lỗi cơ sở dữ liệu',
-'dberrortext' => 'Đã xảy ra lỗi cú pháp trong truy vấn cơ sở dữ liệu.
-Có vẻ như nguyên nhân của vấn đề này xuất phát từ một lỗi trong phần mềm.
-Truy vấn vừa rồi là:
-<blockquote><code>$1</code></blockquote>
-từ hàm “<code>$2</code>”.
-Cơ sở dữ liệu  báo lỗi “<samp>$3: $4</samp>”.',
-'dberrortextcl' => 'Đã xảy ra lỗi cú pháp trong truy vấn cơ sở dữ liệu.
-Truy vấn vừa rồi là:
-“$1”
-từ hàm “$2”.
-Cơ sở dữ liệu báo lỗi “$3: $4”',
+'databaseerror-text' => 'Xuất hiện lỗi truy vấn cơ sở dữ liệu.
+Điều này có thể xảy ra do một lỗi phần mềm.',
+'databaseerror-textcl' => 'Xuất hiện lỗi truy vấn cơ sở dữ liệu.',
+'databaseerror-query' => 'Truy vấn: $1',
+'databaseerror-function' => 'Hàm: $1',
+'databaseerror-error' => 'Lỗi: $1',
 'laggedslavemode' => 'Cảnh báo: Trang có thể chưa được cập nhật.',
 'readonly' => 'Cơ sở dữ liệu bị khóa',
 'enterlockreason' => 'Nêu lý do khóa, cùng với thời hạn khóa',
@@ -666,6 +694,7 @@ Xin hãy báo nó cho một [[Special:ListUsers/sysop|bảo quản viên]], tron
 'cannotdelete-title' => 'Không thể xóa trang “$1”',
 'delete-hook-aborted' => 'Một phần bổ trợ phần mềm đã bỏ qua việc xóa này.
 Không có lý do nào được đưa ra.',
+'no-null-revision' => 'Không thể tạo phiên bản không nội dung mới cho trang “$1”',
 'badtitle' => 'Tựa trang sai',
 'badtitletext' => 'Tựa trang yêu cầu không đúng, rỗng, hoặc là một liên kết ngôn ngữ hoặc liên kết wiki sai. Nó có thể chứa một hoặc nhiều ký tự mà tựa trang không thể sử dụng.',
 'perfcached' => 'Dữ liệu sau được lấy từ bộ nhớ đệm và có thể đã lỗi thời. Tối đa có sẵn {{PLURAL:$1|một kết quả|$1 kết quả}} trong bộ nhớ đệm.',
@@ -683,12 +712,15 @@ Truy vấn: $2',
 'viewyourtext' => "Bạn vẫn có thể xem và chép xuống mã nguồn '''các sửa đổi của bạn''' tại trang này:",
 'protectedinterface' => 'Trang này cung cấp một thông điệp trong giao diện phần mềm, và bị khóa để tránh phá hoại. Để bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dự án bản địa hóa của MediaWiki.',
 'editinginterface' => "'''Lưu ý:''' Bạn đang sửa chữa một trang dùng để cung cấp thông điệp giao diện cho phần mềm. Những thay đổi tại trang này sẽ ảnh hưởng đến giao diện của rất nhiều người dùng wiki này. Để bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dự án bản địa hóa của MediaWiki.",
-'sqlhidden' => '(đã giấu truy vấn SQL)',
 'cascadeprotected' => 'Trang này đã bị khóa không cho sửa đổi, vì nó được nhúng vào {{PLURAL:$1|trang|những trang}} đã bị khóa với tùy chọn “khóa theo tầng” được kích hoạt:
 $2',
 'namespaceprotected' => "Bạn không có quyền sửa các trang trong không gian tên '''$1'''.",
 'customcssprotected' => 'Bạn không có quyền sửa đổi trang CSS này vì nó chứa các tùy chọn cá nhân của một thành viên khác.',
 'customjsprotected' => 'Bạn không có quyền sửa đổi trang JavaScript này vì nó chứa các tùy chọn cá nhân của một thành viên khác.',
+'mycustomcssprotected' => 'Bạn không có quyền sửa đổi trang CSS này.',
+'mycustomjsprotected' => 'Bạn không có quyền sửa đổi trang JavaScript này.',
+'myprivateinfoprotected' => 'Bạn không có quyền sửa đổi thông tin cá nhân của bạn.',
+'mypreferencesprotected' => 'Bạn không có quyền thay đổi tùy chọn của bạn.',
 'ns-specialprotected' => 'Không thể sửa chữa các trang trong không gian tên {{ns:special}}.',
 'titleprotected' => "Tựa đề này đã bị [[User:$1|$1]] khóa không cho tạo ra.
 Lý do được cung cấp là ''$2''.",
@@ -713,10 +745,19 @@ Xin lưu ý rằng một vài trang có thể vẫn hiển thị như khi bạn
 'welcomecreation-msg' => 'Tài khoản của bạn đã được mở.
 Hãy nhớ thay đổi [[Special:Preferences|tùy chọn cá nhân {{SITENAME}}]] của bạn.',
 'yourname' => 'Tên người dùng:',
+'userlogin-yourname' => 'Tên đăng nhập',
+'userlogin-yourname-ph' => 'Nhập tên đăng nhập',
+'createacct-another-username-ph' => 'Nhập tên người dùng',
 'yourpassword' => 'Mật khẩu:',
+'userlogin-yourpassword' => 'Mật khẩu',
+'userlogin-yourpassword-ph' => 'Nhập mật khẩu',
+'createacct-yourpassword-ph' => 'Nhập vào mật khẩu',
 'yourpasswordagain' => 'Gõ lại mật khẩu',
+'createacct-yourpasswordagain' => 'Xác nhận lại mật khẩu',
+'createacct-yourpasswordagain-ph' => 'Nhập mật khẩu lần nữa',
 'remembermypassword' => 'Nhớ thông tin đăng nhập của tôi trên máy tính này (cho đến $1 ngày)',
-'securelogin-stick-https' => 'Giữ kết nối với HTTPS sau khi đăng nhập',
+'userlogin-remembermypassword' => 'Giữ trạng thái đăng nhập',
+'userlogin-signwithsecure' => 'Sử dụng kết nối an toàn',
 'yourdomainname' => 'Tên miền của bạn:',
 'password-change-forbidden' => 'Bạn không thể đổi mật khẩu trên wiki này.',
 'externaldberror' => 'Có lỗi khi xác nhận cơ sở dữ liệu bên ngoài hoặc bạn không được phép cập nhật tài khoản bên ngoài.',
@@ -728,18 +769,44 @@ Hãy nhớ thay đổi [[Special:Preferences|tùy chọn cá nhân {{SITENAME}}]
 'logout' => 'Đăng xuất',
 'userlogout' => 'Đăng xuất',
 'notloggedin' => 'Chưa đăng nhập',
+'userlogin-noaccount' => 'Bạn chưa có tài khoản?',
+'userlogin-joinproject' => 'Tham gia {{SITENAME}}',
 'nologin' => "Bạn chưa có tài khoản ở đây? '''$1'''.",
 'nologinlink' => 'Mở tài khoản mới',
 'createaccount' => 'Mở tài khoản',
 'gotaccount' => "Đã mở tài khoản rồi? '''$1'''.",
 'gotaccountlink' => 'Đăng nhập',
 'userlogin-resetlink' => 'Quên mất thông tin đăng nhập?',
+'userlogin-resetpassword-link' => 'Đặt lại mật khẩu của bạn',
+'helplogin-url' => 'Help:Đăng nhập',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Trợ giúp đăng nhập]]',
+'userlogin-loggedin' => 'Bạn đã đăng nhập với tên {{GENDER:$1}}$1.
+Hãy sử dụng biểu mẫu ở dưới để đăng nhập với tài khoản người dùng khác.',
+'userlogin-createanother' => 'Mở thêm tài khoản',
+'createacct-join' => 'Nhập thông tin của bạn bên dưới.',
+'createacct-another-join' => 'Nhập thông tin của tài khoản mới dưới đây.',
+'createacct-emailrequired' => 'Địa chỉ thư điện tử',
+'createacct-emailoptional' => 'Địa chỉ thư điện tử (tùy chọn)',
+'createacct-email-ph' => 'Nhập địa chỉ thư điện tử của bạn',
+'createacct-another-email-ph' => 'Nhập địa chỉ thư điện tử',
 'createaccountmail' => 'Sử dụng mật khẩu ngẫu nhiên tạm và gửi nó cho địa chỉ thư điện tử được chỉ định',
+'createacct-realname' => 'Tên thật (tùy chọn)',
 'createaccountreason' => 'Lý do:',
+'createacct-reason' => 'Lý do',
+'createacct-reason-ph' => 'Nhập lý do tạo một tài khoản khác',
+'createacct-captcha' => 'Kiểm tra an toàn',
+'createacct-imgcaptcha-ph' => 'Nhập dòng chữ bạn thấy bên dưới',
+'createacct-submit' => 'Tạo tài khoản',
+'createacct-another-submit' => 'Mở thêm tài khoản',
+'createacct-benefit-heading' => '{{SITENAME}} được xây dựng bởi những người như bạn.',
+'createacct-benefit-body1' => '{{PLURAL:$1}}lần sửa đổi',
+'createacct-benefit-body2' => '{{PLURAL:$1}}trang nội dung',
+'createacct-benefit-body3' => '{{PLURAL:$1}}người đóng góp gần đây',
 'badretype' => 'Hai mật khẩu không khớp.',
 'userexists' => 'Tên người dùng được nhập đã có người lấy.
 Hãy chọn một tên khác.',
 'loginerror' => 'Lỗi đăng nhập',
+'createacct-error' => 'Lỗi mở tài khoản',
 'createaccounterror' => 'Không thể mở tài khoản: $1',
 'nocookiesnew' => 'Bạn đã tạo tài khoản thành công, nhưng bạn chưa đăng nhập. {{SITENAME}} sử dụng cookie để đăng nhập vào tài khoản. Bạn đã tắt cookie. Xin hãy bật cookie lên, rồi đăng nhập lại với tên người dùng và mật khẩu mới.',
 'nocookieslogin' => '{{SITENAME}} sử dụng cookie để đăng nhập thành viên. Bạn đã tắt cookie. Xin hãy kích hoạt rồi thử lại.',
@@ -787,11 +854,13 @@ Hãy nhập một địa chỉ có định dạng đúng hoặc bỏ trống ô
 
 Xin hãy bỏ qua thông điệp này nếu tài khoản này không phải do bạn tạo ra.',
 'usernamehasherror' => 'Tên người dùng không thể chứa dấu rào',
-'login-throttled' => 'Bạn đã thử quá nhiều mật khẩu của tài khoản này.
-Xin hãy đợi chốc lát rồi thử lại.',
+'login-throttled' => 'Bạn đã hết quyền thử mật khẩu tài khoản này vì bạn đã nhập sai quá nhiều. Xin hãy đợi $1 rồi hãy thử lại.',
 'login-abort-generic' => 'Thất bại khi đăng nhập',
 'loginlanguagelabel' => 'Ngôn ngữ: $1',
 'suspicious-userlogout' => 'Đã bỏ qua yêu cầu đăng xuất bạn, hình như được gửi từ trình duyệt hoặc máy proxy nhớ đệm hư.',
+'createacct-another-realname-tip' => 'Tên thật là không bắt buộc. 
+
+Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao của bạn.',
 
 # Email sending
 'php-mail-error-unknown' => 'Lỗi không rõ trong hàm PHP mail()',
@@ -807,8 +876,7 @@ Xin hãy đợi chốc lát rồi thử lại.',
 'newpassword' => 'Mật khẩu mới:',
 'retypenew' => 'Gõ lại:',
 'resetpass_submit' => 'Chọn mật khẩu và đăng nhập',
-'resetpass_success' => 'Mật khẩu của bạn đã được thay thành công!
-Đang đăng nhập…',
+'changepassword-success' => 'Đã đổi mật khẩu thành công!',
 'resetpass_forbidden' => 'Không được đổi mật khẩu',
 'resetpass-no-info' => 'Bạn phải đăng nhập mới có thể truy cập trực tiếp trang này.',
 'resetpass-submit-loggedin' => 'Thay đổi mật khẩu',
@@ -820,10 +888,11 @@ Có thể bạn đã thay đổi thành công mật khẩu của mình hoặc đ
 
 # Special:PasswordReset
 'passwordreset' => 'Tái tạo mật khẩu',
-'passwordreset-text' => 'Hãy điền mẫu đơn này để tái tạo mật khẩu.',
+'passwordreset-text-one' => 'Hãy điền mẫu đơn này để tái tạo mật khẩu.',
+'passwordreset-text-many' => '{{PLURAL:$1|Điền vào một hộp sau để tái tạo mật khẩu.}}',
 'passwordreset-legend' => 'Tái tạo mật khẩu',
 'passwordreset-disabled' => 'Chức năng tái tạo mật khẩu đã bị tắt trên wiki này.',
-'passwordreset-pretext' => '{{PLURAL:$1||Nhập một trong những thông tin được yêu cầu ở dưới}}',
+'passwordreset-emaildisabled' => 'Tính năng gửi thư điện tử không được kích hoạt trên wiki này.',
 'passwordreset-username' => 'Tên người dùng:',
 'passwordreset-domain' => 'Tên miền:',
 'passwordreset-capture' => 'Xem thư điện tử có mật khẩu tạm',
@@ -854,7 +923,7 @@ mật khẩu cũ.',
 Mật khẩu tạm: $2',
 'passwordreset-emailsent' => 'Đã gửi thư điện tử để tái tạo mật khẩu.',
 'passwordreset-emailsent-capture' => 'Thư điện tử để tái tạo mật khẩu đã được gửi, nội dung như sau.',
-'passwordreset-emailerror-capture' => 'Chúng tôi đã tạo thư tái tạo mật khẩu dưới đây, nhưng không thể gửi đến người dùng: $1',
+'passwordreset-emailerror-capture' => 'Chúng tôi đã tạo thư tái tạo mật khẩu dưới đây, nhưng không thể gửi đến {{GENDER:$2}}người dùng: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Đổi địa chỉ thư điện tử',
@@ -868,6 +937,19 @@ Mật khẩu tạm: $2',
 'changeemail-submit' => 'Đổi địa chỉ',
 'changeemail-cancel' => 'Hủy bỏ',
 
+# Special:ResetTokens
+'resettokens' => 'Đặt lại dấu hiệu',
+'resettokens-text' => 'Bạn có thể đặt lại các dấu hiệu cho phép truy cập những dữ liệu cá nhân của tài khoản của bạn tại đây.
+
+Bạn nên sử dụng chức năng này nếu bạn đã vô tình chia sẻ các dấu hiệu với người khác hoặc tài khoản của bạn đã bị xâm phạm.',
+'resettokens-no-tokens' => 'Không có dấu hiệu để đặt lại.',
+'resettokens-legend' => 'Đặt lại dấu hiệu',
+'resettokens-tokens' => 'Dấu hiệu:',
+'resettokens-token-label' => '$1 (giá trị hiện tại: $2)',
+'resettokens-watchlist-token' => 'Dấu hiệu cho nguồn cấp [[Special:Watchlist|thay đổi trong danh sách theo dõi]] (dạng Atom/RSS)',
+'resettokens-done' => 'Đã đặt lại các dấu hiệu.',
+'resettokens-resetbutton' => 'Đặt lại các dấu hiệu được chọn',
+
 # Edit page toolbar
 'bold_sample' => 'Chữ đậm',
 'bold_tip' => 'Chữ đậm',
@@ -948,7 +1030,7 @@ Có thể nó đã bị di chuyển hoặc xóa đi trong khi bạn đang xem tr
 'accmailtitle' => 'Đã gửi mật khẩu.',
 'accmailtext' => "Một mật khẩu được tạo ngẫu nhiên cho [[User talk:$1|$1]] đã được gửi đến $2. Có thể đổi mật khẩu tại trang ''[[Special:ChangePassword|đổi mật khẩu]]'' sau khi đã đăng nhập.",
 'newarticle' => '(Mới)',
-'newarticletext' => '<div style="margin-top: 0px;" class="emptymwmsg mediawiki_newarticletext[[{{MediaWiki:Helppage}}|help page]]"></div>',
+'newarticletext' => "Bạn đi đến đây từ một liên kết đến một trang chưa tồn tại. Để tạo trang, hãy bắt đầu gõ vào ô bên dưới (xem [[{{MediaWiki:Helppage}}|trang trợ giúp]] để có thêm thông tin). Nếu bạn đến đây do nhầm lẫn, chỉ cần nhấn vào nút '''Lùi''' (''Back'') trong trình duyệt của bạn.",
 'anontalkpagetext' => "----''Đây là trang thảo luận của một người dùng vô danh chưa tạo tài khoản hoặc có tài khoản nhưng không đăng nhập.
 Do đó chúng ta phải dùng một dãy số gọi là địa chỉ IP để xác định anh/chị ta.
 Một địa chỉ IP như vậy có thể có nhiều người cùng dùng chung.
@@ -1060,12 +1142,15 @@ Không có lý do nào được đưa ra.',
 Dường như trang này đã bị xóa.',
 'edit-conflict' => 'Sửa đổi mâu thuẫn.',
 'edit-no-change' => 'Sửa đổi của bạn không được tính đến, vì nó không làm thay đổi nội dung.',
+'postedit-confirmation' => 'Sửa đổi của bạn đã được lưu.',
 'edit-already-exists' => 'Không thể tạo trang mới.
 Nó đã tồn tại.',
 'defaultmessagetext' => 'Nội dung mặc định',
 'content-failed-to-parse' => 'Thất bại phân tích nội dung $2 cho mô hình $1: $3',
 'invalid-content-data' => 'Dữ liệu nội dung không hợp lệ',
 'content-not-allowed-here' => 'Không cho phép đưa nội dung “$1” vào trang [[$2]]',
+'editwarning-warning' => 'Rời khỏi trang này sẽ khiến bạn mất các sửa đổi đã thực hiện.
+Nếu đã đăng nhập, bạn có thể tắt cảnh báo này tại mục “Sửa đổi” trong tùy chọn cá nhân.',
 
 # Content models
 'content-model-wikitext' => 'mã wiki',
@@ -1100,6 +1185,7 @@ Những tham số này sẽ bị bỏ đi.',
 'undo-failure' => 'Sửa đổi không thể phục hồi vì đã có những sửa đổi mới ở sau.',
 'undo-norev' => 'Sửa đổi không thể hồi phục vì nó không tồn tại hoặc đã bị xóa.',
 'undo-summary' => 'Đã lùi lại sửa đổi $1 của [[Special:Contributions/$2|$2]] ([[User talk:$2|Thảo luận]])',
+'undo-summary-username-hidden' => 'Đã lùi lại sửa đổi $1 của một người dùng ẩn',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Không thể mở tài khoản',
@@ -1279,6 +1365,7 @@ Xin hãy bảo đảm giữ vững tính liên tục của lịch sử trang.',
 'compareselectedversions' => 'So sánh các bản đã chọn',
 'showhideselectedversions' => 'Hiện/ẩn các phiên bản được chọn',
 'editundo' => 'lùi sửa',
+'diff-empty' => '(Không có sự khác biệt)',
 'diff-multi' => '(Không hiển thị {{PLURAL:$1||$1}} phiên bản {{PLURAL:$2||của $2 thành viên}} ở giữa)',
 'diff-multi-manyusers' => '(Không hiển thị {{PLURAL:$1||$1}} phiên bản của hơn $2 thành viên ở giữa)',
 'difference-missing-revision' => 'Không tìm thấy {{PLURAL:$2|một phiên bản|$2 phiên bản}} trong khác biệt này ($1).
@@ -1306,7 +1393,6 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'searchmenu-legend' => 'Tùy chọn tìm kiếm',
 'searchmenu-exists' => "* Trang '''[[$1]]'''",
 'searchmenu-new' => "'''Tạo trang “[[:$1]]” trên wiki này!'''",
-'searchhelp-url' => 'Help:Nội dung',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Duyệt các trang với tiền tố này]]',
 'searchprofile-articles' => 'Trang nội dung',
 'searchprofile-project' => 'Trang trợ giúp và trang dự án',
@@ -1347,15 +1433,7 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'powersearch-togglenone' => 'Không',
 'search-external' => 'Tìm kiếm từ bên ngoài',
 'searchdisabled' => 'Chức năng tìm kiếm tại {{SITENAME}} đã bị tắt. Bạn có tìm kiếm bằng Google trong thời gian này. Chú ý rằng các chỉ mục từ {{SITENAME}} của chúng có thể đã lỗi thời.',
-
-# Quickbar
-'qbsettings' => 'Thanh công cụ',
-'qbsettings-none' => 'Không có',
-'qbsettings-fixedleft' => 'Cố định trái',
-'qbsettings-fixedright' => 'Cố định phải',
-'qbsettings-floatingleft' => 'Nổi bên trái',
-'qbsettings-floatingright' => 'Nổi bên phải',
-'qbsettings-directionality' => 'Cố định, tùy theo hướng viết ngôn ngữ của bạn',
+'search-error' => 'Đã xuất hiện lỗi khi tìm kiếm: $1',
 
 # Preferences page
 'preferences' => 'Tùy chọn',
@@ -1389,7 +1467,6 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'resetprefs' => 'Mặc định lại lựa chọn',
 'restoreprefs' => 'Mặc định lại toàn bộ tùy chọn (trong tất cả các phần)',
 'prefs-editing' => 'Sửa đổi',
-'prefs-edit-boxsize' => 'Kích thước cửa sổ soạn thảo.',
 'rows' => 'Số hàng:',
 'columns' => 'Số cột:',
 'searchresultshead' => 'Tìm kiếm',
@@ -1400,9 +1477,9 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'recentchangesdays-max' => '(tối đa $1 {{PLURAL:$1|ngày|ngày}})',
 'recentchangescount' => 'Số sửa đổi hiển thị mặc định:',
 'prefs-help-recentchangescount' => 'Số này bao gồm các thay đổi gần đây, lịch sử trang, và nhật trình.',
-'prefs-help-watchlist-token' => 'Điền vào ô này một khóa bí mật để tạo ra bản tin RSS cho danh sách theo dõi của bạn.
-Bất cứ ai biết được khóa trong ô này cũng có thể đọc được danh sách theo dõi của bạn, vì vậy hãy chọn một giá trị an toàn.
-Đây là giá trị được tạo ngẫu nhiên mà bạn có thể sử dụng: $1',
+'prefs-help-watchlist-token2' => 'Đây là chìa khóa bí mật cho nguồn cấp dữ liệu danh sách theo dõi của bạn.
+Bất cứ ai biết nó sẽ có thể để đọc danh sách theo dõi của bạn, vì vậy đừng chia sẻ nó.
+[[Special:ResetTokens|Nhấn chuột vào đây nếu bạn cần phải thiết lập lại nó]].',
 'savedprefs' => 'Đã lưu các tùy chọn cá nhân.',
 'timezonelegend' => 'Múi giờ:',
 'localtime' => 'Giờ hiện tại:',
@@ -1433,7 +1510,6 @@ Bất cứ ai biết được khóa trong ô này cũng có thể đọc đượ
 'prefs-reset-intro' => 'Có thể mặc định lại toàn bộ tùy chọn dùng trang này.
 Không có thể lùi lại tác động này.',
 'prefs-emailconfirm-label' => 'Xác nhận thư điện tử:',
-'prefs-textboxsize' => 'Kích cỡ hộp sửa đổi',
 'youremail' => 'Thư điện tử:',
 'username' => '{{GENDER:$1}}Tên người dùng:',
 'uid' => '{{GENDER:$1}}Số thứ tự thành viên:',
@@ -1467,6 +1543,8 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'prefs-dateformat' => 'Kiểu ngày tháng',
 'prefs-timeoffset' => 'Chênh giờ',
 'prefs-advancedediting' => 'Tùy chọn chung',
+'prefs-editor' => 'Trình soạn',
+'prefs-preview' => 'Xem trước',
 'prefs-advancedrc' => 'Tùy chọn nâng cao',
 'prefs-advancedrendering' => 'Tùy chọn nâng cao',
 'prefs-advancedsearchoptions' => 'Tùy chọn nâng cao',
@@ -1474,7 +1552,9 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'prefs-displayrc' => 'Tùy chọn hiển thị',
 'prefs-displaysearchoptions' => 'Tùy chọn hiển thị',
 'prefs-displaywatchlist' => 'Tùy chọn hiển thị',
+'prefs-tokenwatchlist' => 'Dấu hiệu',
 'prefs-diffs' => 'Khác biệt',
+'prefs-help-prefershttps' => 'Đăng xuất và đăng nhập lại để áp dụng tùy chọn này.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'Có vẻ hợp lệ',
@@ -1501,6 +1581,8 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'userrights-notallowed' => 'Bạn không có quyền gán hoặc bãi miễn quyền cho thành viên.',
 'userrights-changeable-col' => 'Những nhóm bạn có thể thay đổi',
 'userrights-unchangeable-col' => 'Những nhóm bạn không thể thay đổi',
+'userrights-conflict' => 'Mâu thuẫn thay đổi sửa nhóm thành viên! Xin vui lòng xem lại và xác nhận các thay đổi của bạn.',
+'userrights-removed-self' => 'Bạn đã loại bỏ quyền của chính mình nên không còn truy cập được trang này.',
 
 # Groups
 'group' => 'Nhóm:',
@@ -1566,11 +1648,19 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'right-proxyunbannable' => 'Bỏ qua cấm proxy tự động',
 'right-unblockself' => 'Tự bỏ cấm',
 'right-protect' => 'Thay đổi mức khóa và sửa trang khóa theo tầng',
-'right-editprotected' => 'Sửa trang khóa (không bị khóa theo tầng)',
+'right-editprotected' => 'Sửa trang khóa ở mức “{{int:protect-level-sysop}}”',
+'right-editsemiprotected' => 'Sửa trang khóa ở mức “{{int:protect-level-autoconfirmed}}”',
 'right-editinterface' => 'Sửa giao diện người dùng',
 'right-editusercssjs' => 'Sửa tập tin CSS và JS của người dùng khác',
 'right-editusercss' => 'Sửa tập tin CSS của người dùng khác',
 'right-edituserjs' => 'Sửa đổi tập tin JavaScript của người dùng khác',
+'right-editmyusercss' => 'Sửa đổi tập tin CSS cá nhân của mình',
+'right-editmyuserjs' => 'Sửa đổi tập tin JavaScript cá nhân của mình',
+'right-viewmywatchlist' => 'Xem danh sách theo dõi của mình',
+'right-editmywatchlist' => 'Sửa đổi danh sách theo dõi của mình – một số tác vụ có thể thêm trang vào danh sách bất chấp quyền này',
+'right-viewmyprivateinfo' => 'Xem dữ liệu cá nhân của bạn (ví dụ địa chỉ thư điện tử hoặc tên thật)',
+'right-editmyprivateinfo' => 'Sửa đổi dữ liệu cá nhân của bạn (thí dụ địa chỉ thư điện tử hoặc tên thật)',
+'right-editmyoptions' => 'Sửa đổi tùy chọn của bạn',
 'right-rollback' => 'Nhanh chóng lùi tất cả sửa đổi của người dùng cuối cùng sửa đổi trang nào đó',
 'right-markbotedits' => 'Đánh dấu sửa đổi phục hồi là sửa đổi bot',
 'right-noratelimit' => 'Không bị ảnh hưởng bởi mức giới hạn tần suất sử dụng',
@@ -1632,12 +1722,19 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'action-userrights-interwiki' => 'sửa đổi quyền của người dùng tại wiki khác',
 'action-siteadmin' => 'khóa hoặc mở khóa cơ sở dữ liệu',
 'action-sendemail' => 'gửi thư điện tử',
+'action-editmywatchlist' => 'sửa đổi danh sách theo dõi của mình',
+'action-viewmywatchlist' => 'xem danh sách theo dõi của mình',
+'action-viewmyprivateinfo' => 'xem thông tin cá nhân của bạn',
+'action-editmyprivateinfo' => 'sửa đổi thông tin cá nhân của bạn',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|thay đổi|thay đổi}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|sau lần truy cập vừa rồi}}',
+'enhancedrc-history' => 'lịch sử',
 'recentchanges' => 'Thay đổi gần đây',
 'recentchanges-legend' => 'Tùy chọn thay đổi gần đây',
 'recentchanges-summary' => 'Xem các thay đổi gần đây nhất tại wiki trên trang này.',
+'recentchanges-noresult' => 'Không có thay đổi trong khoảng thời gian phù hợp với các tiêu chí này.',
 'recentchanges-feed-description' => 'Theo dõi các thay đổi gần đây nhất của wiki dùng nguồn cấp dữ liệu này.',
 'recentchanges-label-newpage' => 'Bản sửa này tạo ra trang mới',
 'recentchanges-label-minor' => 'Đây là một sửa đổi nhỏ',
@@ -1674,7 +1771,6 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'recentchangeslinked-feed' => 'Thay đổi liên quan',
 'recentchangeslinked-toolbox' => 'Thay đổi liên quan',
 'recentchangeslinked-title' => 'Thay đổi liên quan tới “$1”',
-'recentchangeslinked-noresult' => 'Không có thay đổi nào trên trang được liên kết đến trong khoảng thời gian đã chọn.',
 'recentchangeslinked-summary' => "Đây là danh sách các thay đổi được thực hiện gần đây tại những trang được liên kết đến từ một trang nào đó (hoặc tại các trang thuộc một thể loại nào đó).
 Các trang trong [[Special:Watchlist|danh sách bạn theo dõi]] được '''tô đậm'''.",
 'recentchangeslinked-page' => 'Tên trang:',
@@ -1686,7 +1782,7 @@ Các trang trong [[Special:Watchlist|danh sách bạn theo dõi]] được '''t
 'reuploaddesc' => 'Hủy tác vụ tải và quay lại mẫu tải tập tin lên',
 'upload-tryagain' => 'Lưu miêu tả tập tin được sửa đổi',
 'uploadnologin' => 'Chưa đăng nhập',
-'uploadnologintext' => 'Bạn phải [[Special:UserLogin|đăng nhập]] để tải tập tin lên.',
+'uploadnologintext' => 'Bạn phải $1 để tải tập tin lên.',
 'upload_directory_missing' => 'Thư mục tải lên ($1) không có hoặc máy chủ web không thể tạo được.',
 'upload_directory_read_only' => 'Máy chủ không thể sửa đổi thư mục tải lên ($1) được.',
 'uploaderror' => 'Lỗi khi tải lên',
@@ -1914,7 +2010,6 @@ Vì lý do bảo mật, img_auth.php đã bị tắt.',
 'http-read-error' => 'Lỗi đọc HTTP.',
 'http-timed-out' => 'Hết thời gian yêu cầu HTTP.',
 'http-curl-error' => 'Có lỗi khi truy xuất URL: $1',
-'http-host-unreachable' => 'Không thể truy cập URL',
 'http-bad-status' => 'Có vấn đề khi yêu cầu HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1942,6 +2037,10 @@ Vì lý do bảo mật, img_auth.php đã bị tắt.',
 'listfiles_size' => 'Kích cỡ',
 'listfiles_description' => 'Miêu tả',
 'listfiles_count' => 'Số phiên bản',
+'listfiles-show-all' => 'Bao gồm các phiên bản cũ của hình ảnh',
+'listfiles-latestversion' => 'Phiên bản hiện tại',
+'listfiles-latestversion-yes' => 'Có',
+'listfiles-latestversion-no' => 'Không',
 
 # File description page
 'file-anchor-link' => 'Tập tin',
@@ -2039,6 +2138,13 @@ Hãy nhớ kiểm tra các liên kết khác đến bản mẫu trước khi xó
 'randompage' => 'Trang ngẫu nhiên',
 'randompage-nopages' => 'Hiện chưa có trang nào trong {{PLURAL:$2||các}} không gian tên: $1.',
 
+# Random page in category
+'randomincategory' => 'Trang ngẫu nhiên trong thể loại',
+'randomincategory-invalidcategory' => '“$1” không phải tên thể loại hợp lệ.',
+'randomincategory-nopages' => 'Không có trang nào trong [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Xem trang ngẫu nhiên trong thể loại: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Xem',
+
 # Random redirect
 'randomredirect' => 'Trang đổi hướng ngẫu nhiên',
 'randomredirect-nopages' => 'Không có trang đổi hướng nào trong không gian tên “$1”.',
@@ -2064,15 +2170,13 @@ Hãy nhớ kiểm tra các liên kết khác đến bản mẫu trước khi xó
 'statistics-users-active-desc' => 'Những thành viên đã hoạt động trong {{PLURAL:$1|ngày|$1 ngày}} qua',
 'statistics-mostpopular' => 'Các trang được xem nhiều nhất',
 
-'disambiguations' => 'Trang liên kết đến trang định hướng',
-'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Các trang này có liên kết đến ít nhất một '''trang định hướng''', những trang này có thể có liên kết đến các trang đúng nghĩa hơn.<br />Các trang định hướng là trang sử dụng những bản mẫu được liệt kê ở [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Trang có thuộc tính trang',
 'pageswithprop-legend' => 'Các trang có thuộc tính trang',
 'pageswithprop-text' => 'Trang này liệt kê các trang sử dụng một thuộc tính trang nào đó.',
 'pageswithprop-prop' => 'Tên thuộc tính:',
 'pageswithprop-submit' => 'Xem',
+'pageswithprop-prophidden-long' => 'giá trị thuộc tính văn bản dài dòng bị ẩn ($1)',
+'pageswithprop-prophidden-binary' => 'giá trị thuộc tính nhị phân bị ẩn ($1)',
 
 'doubleredirects' => 'Đổi hướng kép',
 'doubleredirectstext' => 'Trang này liệt kê các trang đổi hướng đến một trang đổi hướng khác.
@@ -2130,6 +2234,7 @@ Các mục <del>bị gạch bỏ</del> là các trang đã được sửa.',
 'mostrevisions' => 'Trang được sửa đổi nhiều lần nhất',
 'prefixindex' => 'Tất cả các trang trùng với tiền tố',
 'prefixindex-namespace' => 'Tất cả các trang trùng với tiền tố (không gian $1)',
+'prefixindex-strip' => 'Ẩn tiền tố trong danh sách',
 'shortpages' => 'Trang ngắn nhất',
 'longpages' => 'Trang dài nhất',
 'deadendpages' => 'Trang đường cùng',
@@ -2145,6 +2250,7 @@ Các mục <del>bị gạch bỏ</del> là các trang đã được sửa.',
 'listusers' => 'Danh sách thành viên',
 'listusers-editsonly' => 'Chỉ hiện thành viên có tham gia sửa đổi',
 'listusers-creationsort' => 'Xếp theo ngày khởi tạo',
+'listusers-desc' => 'Sắp xếp thứ tự giảm dần',
 'usereditcount' => '$1 {{PLURAL:$1|sửa đổi|sửa đổi}}',
 'usercreated' => '{{GENDER:$3}}mở $1 lúc $2',
 'newpages' => 'Trang mới',
@@ -2319,10 +2425,9 @@ Những sửa đổi đối với trang này và trang thảo luận của nó s
 'unwatchthispage' => 'Ngừng theo dõi',
 'notanarticle' => 'Không phải trang có nội dung',
 'notvisiblerev' => 'Phiên bản bị xóa',
-'watchnochange' => 'Không có trang nào bạn theo dõi được sửa đổi.',
 'watchlist-details' => 'Bạn đang theo dõi {{PLURAL:$1|$1 trang|$1 trang}}, không kể các trang thảo luận.',
-'wlheader-enotif' => '* Đã bật thông báo qua thư điện tử.',
-'wlheader-showupdated' => "* Các trang đã thay đổi từ lần cuối bạn xem chúng được in '''đậm'''",
+'wlheader-enotif' => 'Đã bật thông báo qua thư điện tử.',
+'wlheader-showupdated' => "Các trang đã thay đổi kể từ lần cuối bạn xem chúng được in '''đậm'''",
 'watchmethod-recent' => 'Dưới đây hiện thay đổi mới với các trang theo dõi.',
 'watchmethod-list' => 'Dưới đây hiện danh sách các trang theo dõi.',
 'watchlistcontains' => 'Danh sách theo dõi của bạn có $1 {{PLURAL:$1|trang|trang}}.',
@@ -2406,8 +2511,8 @@ Xin xác nhận việc bạn định làm, và hiểu rõ những hệ lụy c
 'deletereason-dropdown' => '*Các lý do xóa phổ biến
 ** Đăng tỉ thư rác
 ** Phá hoại
-** Vi phạ bản quyền
-** Thiếu tôn trọng tác giả
+** Vi phạm bản quyền
+** Tác giả yêu cầu
 ** Chuyển hướng sai',
 'delete-edit-reasonlist' => 'Sửa lý do xóa',
 'delete-toobig' => 'Trang này có lịch sử sửa đổi lớn, đến hơn {{PLURAL:$1|lần|lần}} sửa đổi.
@@ -2570,7 +2675,7 @@ $1',
 'contributions' => '{{GENDER:$1}}Đóng góp của thành viên',
 'contributions-title' => 'Đóng góp của thành viên $1',
 'mycontris' => 'Đóng góp',
-'contribsub2' => 'Của $1 ($2)',
+'contribsub2' => 'Của {{GENDER:$3}}$1 ($2)',
 'nocontribs' => 'Không tìm thấy thay đổi nào khớp với yêu cầu.',
 'uctop' => '(hiện tại)',
 'month' => 'Từ tháng (trở về trước):',
@@ -2626,17 +2731,13 @@ $1',
 'ipbreason' => 'Lý do:',
 'ipbreasonotherlist' => 'Lý do khác',
 'ipbreason-dropdown' => '*Một số lý do cấm thường gặp
-** Phá hoại
-** Thêm thông tin nội dung sai lệch
-** Tẩy trống nội dung trang
-** Quảng cáo vớ vẩn
-** Đăng liên kết thư rác đến trang web bên ngoài
+** Thêm thông tin sai lệch
+** Xóa nội dung trang
+** Đăng liên kết thư rác đến trang Web bên ngoài
 ** Cho thông tin rác vào trang
 ** Có thái độ dọa dẫm/quấy rối
-** Tên thành viên không được chấp nhận
-** Tạo nhiều trang mới vi phạm bản quyền, bỏ qua thảo luận và cảnh báo
-** Truyền nhiều hình ảnh thiếu nguồn gốc hoặc bản quyền
-** Con rối của thành viên bị cấm',
+** Lạm dụng nhiều tài khoản
+** Tên thành viên không thể chấp nhận',
 'ipb-hardblock' => 'Ngăn không cho thành viên đã đăng nhập sửa đổi từ địa chỉ IP này',
 'ipbcreateaccount' => 'Cấm mở tài khoản',
 'ipbemailban' => 'Không cho gửi thư điện tử',
@@ -2725,13 +2826,11 @@ Xem lại những lần cấm tại [[Special:BlockList|danh sách cấm]].',
 'ipb_blocked_as_range' => 'Lỗi: Địa chỉ IP $1 không bị cấm trực tiếp và do đó không thể bỏ cấm. Tuy nhiên, nó bị cấm do là một bộ phận của dải IP $2, bạn có thể bỏ cấm dải này.',
 'ip_range_invalid' => 'Dải IP không hợp lệ.',
 'ip_range_toolarge' => 'Không được phép cấm dải IP lớn hơn /$1.',
-'blockme' => 'Cấm tôi',
 'proxyblocker' => 'Cấm proxy',
-'proxyblocker-disabled' => 'Chức năng này đã bị tắt.',
 'proxyblockreason' => 'Địa chỉ IP của bạn đã bị cấm vì là proxy mở. Xin hãy liên hệ nhà cung cấp dịch vụ Internet hoặc bộ phận hỗ trợ kỹ thuật của bạn và thông báo với họ về vấn đề an ninh nghiêm trọng này.',
-'proxyblocksuccess' => 'Xong.',
 'sorbsreason' => 'Địa chỉ IP của bạn bị liệt kê là một proxy mở trong DNSBL mà {{SITENAME}} đang sử dụng.',
 'sorbs_create_account_reason' => 'Địa chỉ chỉ IP của bạn bị liệt kê là một proxy mở trong DNSBL mà {{SITENAME}} đang sử dụng. Bạn không thể mở tài khoản.',
+'xffblockreason' => 'Đầu đề X-Forwarded-For chứa một địa chỉ IP đã bị cấm, địa chỉ này hoặc của bạn hoặc của một máy chủ proxy bạn đang sử dụng. Lý do cấm ban đầu là: $1',
 'cant-block-while-blocked' => 'Bạn không thể cấm thành viên khác trong khi bạn đang bị cấm.',
 'cant-see-hidden-user' => 'Thành viên bạn muốn cấm đã bị cấm trước đây hoặc đã bị ẩn đi. Vì bạn không có quyền hideuser, bạn không thể xem hoặc thay đổi mức cấm của thành viên.',
 'ipbblocked' => 'Bạn không thể cấm hay bỏ cấm người dùng khác vì chính bạn đang bị cấm.',
@@ -2895,6 +2994,8 @@ Mời vào [//www.mediawiki.org/wiki/Localisation?uselang=vi Địa phương hó
 'thumbnail-more' => 'Phóng lớn',
 'filemissing' => 'Không có tập tin',
 'thumbnail_error' => 'Hình thu nhỏ có lỗi: $1',
+'thumbnail_error_remote' => 'Thông báo lỗi từ $1:
+$2',
 'djvu_page_error' => 'Trang DjVu quá xa',
 'djvu_no_xml' => 'Không thể truy xuất XML cho tập tin DjVu',
 'thumbnail-temp-create' => 'Không thể tạo tập tin hình nhỏ tạm thời',
@@ -3040,20 +3141,15 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 'tooltip-undo' => '“Lùi lại” sẽ lùi sửa đổi này và mở trang sửa đổi ở chế độ xem trước. Cho phép thêm lý do vào tóm lược.',
 'tooltip-preferences-save' => 'Lưu tùy chọn',
 'tooltip-summary' => 'Hãy nhập câu tóm lược',
+'tooltip-iwiki' => '$1 – $2',
 
 # Stylesheets
 'common.css' => '/* Mã CSS đặt ở đây sẽ áp dụng cho mọi hình dạng */',
-'standard.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Cổ điển */',
-'nostalgia.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Vọng cổ */',
 'cologneblue.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Xanh Cologne */',
 'monobook.css' => '/* Mã CSS đặt ở đây sẽ ảnh hưởng đến thành viên sử dụng hình dạng MonoBook */',
-'myskin.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Cá nhân */',
-'chick.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Chick */',
-'simple.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Đơn giản */',
 'modern.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Hiện đại */',
 'vector.css' => '/* Mã CSS đặt ở đây sẽ ảnh hưởng đến thành viên sử dụng hình dạng Vectơ */',
 'print.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến bản để in */',
-'handheld.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến các thiết bị cầm tay dựa trên hình dạng cấu hình trong $wgHandheldStyle */',
 'noscript.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng tắt JavaScript */',
 'group-autoconfirmed.css' => '/* Mã CSS tại đây sẽ chỉ ảnh hưởng đến các thành viên tự động xác nhận */',
 'group-bot.css' => '/* Mã CSS tại đây sẽ chỉ ảnh hưởng đến các bot */',
@@ -3062,13 +3158,8 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 
 # Scripts
 'common.js' => '/* Bất kỳ mã JavaScript ở đây sẽ được tải cho tất cả các thành viên khi tải một trang nào đó lên. */',
-'standard.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng hình dạng Cổ điển */',
-'nostalgia.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng hình dạng Vọng cổ */',
 'cologneblue.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng hình dạng Xanh Cologne */',
 'monobook.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài MonoBook */',
-'myskin.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Cá nhân */',
-'chick.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Chick */',
-'simple.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Đơn giản */',
 'modern.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Hiện đại */',
 'vector.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Vectơ */',
 'group-autoconfirmed.js' => '/* Mã JavaScript tại đây sẽ chỉ được tải cho các thành viên tự động xác nhận */',
@@ -3149,11 +3240,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 'pageinfo-category-files' => 'Số tập tin',
 
 # Skin names
-'skinname-standard' => 'Cổ điển',
-'skinname-nostalgia' => 'Vọng cổ',
 'skinname-cologneblue' => 'Xanh Cologne',
-'skinname-myskin' => 'Cá nhân',
-'skinname-simple' => 'Đơn giản',
 'skinname-modern' => 'Hiện đại',
 'skinname-vector' => 'Vectơ',
 
@@ -3238,11 +3325,25 @@ Nếu thực thi nó máy tính của bạn có thể bị tiếm quyền.",
 'minutes' => '$1 phút',
 'hours' => '$1 giờ',
 'days' => '$1 ngày',
+'weeks' => '$1 tuần',
 'months' => '$1 tháng',
 'years' => '$1 năm',
 'ago' => 'cách đây $1',
 'just-now' => 'hồi nãy',
 
+# Human-readable timestamps
+'hours-ago' => 'cách đây $1 giờ',
+'minutes-ago' => 'cách đây $1 phút',
+'seconds-ago' => 'cách đây $1 giây',
+'monday-at' => 'Thứ Hai lúc $1',
+'tuesday-at' => 'Thứ Ba lúc $1',
+'wednesday-at' => 'Thứ Tư lúc $1',
+'thursday-at' => 'Thứ Năm lúc $1',
+'friday-at' => 'Thứ Sáu lúc $1',
+'saturday-at' => 'Thứ Bảy lúc $1',
+'sunday-at' => 'Chủ nhật lúc $1',
+'yesterday-at' => 'Hôm qua lúc $1',
+
 # Bad image list
 'bad_image_list' => 'Định dạng như sau:
 
@@ -3310,7 +3411,7 @@ Những thông tin khác mặc định sẽ được ẩn đi.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Chiều ngang',
 'exif-imagelength' => 'Chiều cao',
 'exif-bitspersample' => 'Bit trên mẫu',
@@ -3490,7 +3591,7 @@ Những thông tin khác mặc định sẽ được ẩn đi.
 'exif-originalimageheight' => 'Chiều cao của hình trước khi được cắt',
 'exif-originalimagewidth' => 'Chiều rộng của hình trước khi được cắt',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Không nén',
 'exif-compression-2' => 'CCITT Nhóm 3: mã hóa thời gian chạy Huffman sửa một chiều',
 'exif-compression-3' => 'CCITT Nhóm 3: mã hóa fax',
@@ -3809,7 +3910,6 @@ Xin hãy xác nhận bạn thực sự muốn tạo lại trang này.",
 'confirm-unwatch-top' => 'Bạn có muốn gỡ trang này khỏi danh sách theo dõi của bạn?',
 
 # Separators for various lists, etc.
-'autocomment-prefix' => '–&#32;',
 'ellipsis' => '…',
 
 # Multipage image navigation
@@ -3946,7 +4046,6 @@ Bạn cũng có thể [[Special:EditWatchlist|dùng trang sửa đổi bình th
 'version-other' => 'Phần mở rộng khác',
 'version-mediahandlers' => 'Bộ xử lý phương tiện',
 'version-hooks' => 'Các hook',
-'version-extension-functions' => 'Hàm mở rộng',
 'version-parser-extensiontags' => 'Thẻ mở rộng trong bộ xử lý',
 'version-parser-function-hooks' => 'Hook cho hàm cú pháp trong bộ xử lý',
 'version-hook-name' => 'Tên hook',
@@ -3955,6 +4054,7 @@ Bạn cũng có thể [[Special:EditWatchlist|dùng trang sửa đổi bình th
 'version-license' => 'Giấy phép bản quyền',
 'version-poweredby-credits' => "Wiki này chạy trên '''[//www.mediawiki.org/ MediaWiki]''', bản quyền © 2001–$1 $2.",
 'version-poweredby-others' => 'những người khác',
+'version-poweredby-translators' => 'các biên dịch viên translatewiki.net',
 'version-credits-summary' => 'Chúng tôi muốn công nhận những người sau đã đóng góp vào [[Special:Version|MediaWiki]].',
 'version-license-info' => "MediaWiki là phần mềm tự do; bạn được phép tái phân phối và/hoặc sửa đổi nó theo những điều khoản của Giấy phép Công cộng GNU do Quỹ Phần mềm Tự do xuất bản; phiên bản 2 hay bất kỳ phiên bản nào mới hơn nào của Giấy phép.
 
@@ -3975,12 +4075,17 @@ hoặc [//www.gnu.org/licenses/old-licenses/gpl-2.0.html đọc nó trực tuy
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath?uselang=vi Đường dẫn bài]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath?uselang=vi Đường dẫn kịch bản]',
 
-# Special:FilePath
-'filepath' => 'Đường dẫn tập tin',
-'filepath-page' => 'Tập tin:',
-'filepath-submit' => 'Hiển thị tập tin',
-'filepath-summary' => 'Trang này cho ra địa chỉ đầy đủ của một tập tin.
-Các hình ảnh được hiển thị ở kích thước tối đa, còn các loại tập tin khác được mở lên ngay trong chương trình mặc định.',
+# Special:Redirect
+'redirect' => 'Đổi hướng đến tập tin, người dùng, hoặc số phiên bản',
+'redirect-legend' => 'Đổi hướng đến tập tin hoặc trang',
+'redirect-summary' => 'Trang đặc biệt này đổi hướng đến một tập tin (theo tên tập tin được cho vào), trang (theo số phiên bản được cho vào), hoặc trang cá nhân (theo số thành viên).',
+'redirect-submit' => 'Đi',
+'redirect-lookup' => 'Tra cứu:',
+'redirect-value' => 'Giá trị:',
+'redirect-user' => 'Số thành viên',
+'redirect-revision' => 'Phiên bản trang',
+'redirect-file' => 'Tên tập tin',
+'redirect-not-exists' => 'Không tìm thấy giá trị',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Tìm kiếm các tập tin trùng lắp',
@@ -4030,12 +4135,16 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 'tags' => 'Thẻ đánh dấu thay đổi hợp lệ',
 'tag-filter' => 'Bộ lọc [[Special:Tags|thẻ]]:',
 'tag-filter-submit' => 'Bộ lọc',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1}}Thẻ]]: $2)',
 'tags-title' => 'Thẻ đánh dấu',
 'tags-intro' => 'Trang này liệt kê các thẻ đánh dấu mà phần mềm dùng nó để đánh dấu một sửa đổi, và ý nghĩa của nó.',
 'tags-tag' => 'Tên thẻ',
 'tags-display-header' => 'Hiển thị trên danh sách thay đổi',
 'tags-description-header' => 'Mô tả ý nghĩa đầy đủ',
+'tags-active-header' => 'Có kích hoạt?',
 'tags-hitcount-header' => 'Các thay đổi được ghi thẻ',
+'tags-active-yes' => 'Kích hoạt',
+'tags-active-no' => 'Vô hiệu',
 'tags-edit' => 'sửa',
 'tags-hitcount' => '$1 {{PLURAL:$1|thay đổi|thay đổi}}',
 
@@ -4056,6 +4165,7 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 'dberr-problems' => 'Xin lỗi! Trang này đang gặp phải những khó khăn về kỹ thuật.',
 'dberr-again' => 'Xin thử đợi vài phút rồi tải lại trang.',
 'dberr-info' => '(Không thể liên lạc với máy chủ cơ sở dữ liệu: $1)',
+'dberr-info-hidden' => '(Không thể liên lạc với máy chủ cơ sở dữ liệu)',
 'dberr-usegoogle' => 'Bạn có thể thử tìm trên Google trong khi chờ đợi.',
 'dberr-outofdate' => 'Chú ý rằng các chỉ mục của Google có thể đã lỗi thời.',
 'dberr-cachederror' => 'Sau đây là bản sao được lưu bộ đệm của trang bạn muốn xem, và có thể đã lỗi thời.',
@@ -4071,6 +4181,9 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 'htmlform-submit' => 'Đăng',
 'htmlform-reset' => 'Hủy các thay đổi',
 'htmlform-selectorother-other' => 'Khác',
+'htmlform-no' => 'Không',
+'htmlform-yes' => 'Có',
+'htmlform-chosen-placeholder' => 'Chọn một tùy chọn',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 với sự hỗ trợ tìm kiếm toàn văn',
@@ -4188,4 +4301,19 @@ Nếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới.
 # Image rotation
 'rotate-comment' => 'Đã quay hình $1 độ theo chiều kim đồng hồ',
 
+# Limit report
+'limitreport-title' => 'Dữ liệu hồ sơ bộ phân tích:',
+'limitreport-cputime' => 'Sử dụng thời gian CPU',
+'limitreport-cputime-value' => '$1 giây',
+'limitreport-walltime' => 'Sử dụng tức thời',
+'limitreport-walltime-value' => '$1 giây',
+'limitreport-ppvisitednodes' => 'Số nút được truy cập bởi bộ tiền xử lý',
+'limitreport-ppgeneratednodes' => 'Số nút do bộ tiền xử lý tạo',
+'limitreport-postexpandincludesize' => 'Kích thước bao gồm sau khi bung',
+'limitreport-postexpandincludesize-value' => '$1/$2 byte',
+'limitreport-templateargumentsize' => 'Kích thước đối số bản mẫu',
+'limitreport-templateargumentsize-value' => '$1/$2 byte',
+'limitreport-expansiondepth' => 'Độ sâu bung cao nhất',
+'limitreport-expensivefunctioncount' => 'Số lời gọi hàm cú pháp tốn cần mức độ xử lý cao',
+
 );
diff --git a/languages/messages/MessagesVls.php b/languages/messages/MessagesVls.php
index 9b732f61..44efa56e 100644
--- a/languages/messages/MessagesVls.php
+++ b/languages/messages/MessagesVls.php
@@ -169,9 +169,6 @@ $messages = array(
 # Search results
 'search-result-size' => '$1 ({{PLURAL:$2|1 woord|$2 woordn}})',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Logboek nieuwe gebrukers',
-
 # Recent changes
 'recentchanges' => 'Juste veranderd',
 
@@ -192,6 +189,9 @@ $messages = array(
 'newpages' => 'Nieuwe bloadn',
 'newpages-username' => 'Gebrukersnoame:',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Logboek nieuwe gebrukers',
+
 # Watchlist
 'mywatchlist' => 'Myn volglyste',
 'watch' => 'Volgn',
diff --git a/languages/messages/MessagesVmf.php b/languages/messages/MessagesVmf.php
index e1d44f76..11b0ea30 100644
--- a/languages/messages/MessagesVmf.php
+++ b/languages/messages/MessagesVmf.php
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Altaileopard
+ * @author Bua333
  * @author Matma Rex
  * @author Midnight Gambler
  * @author Silvicola
@@ -82,10 +83,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Dii andsôôl dr beoobachdâr ôôdsajchn',
 'tog-oldsig' => 'foorschau fon dr agduäln signaduur:',
 'tog-fancysig' => 'Signaduur is dhägsd in wighi-sindhags (alsâ ned audomaadisch â lingg)',
-'tog-externaleditor' => 'Schdandardwäässich an ägsdhärnân eedidhâr neemn (nôr for di sich ausghenn, dâdsuu
-mus mr ufm ajchnen rächnâr was ajrichdn gehnn)',
-'tog-externaldiff' => 'Â ägsdhärns Brogram dsum ôôdsjachn fon dâ wärsjoons-undârschiid neemn (nôr fir dii sich
-ausghenn, mr mus dâdsuu ufm ajchnen rächnâr was âjrichdn ghenn)',
 'tog-uselivepreview' => 'Schnäl-foorschau benudsn (brauchd JavaScript) (ärschd ân fârsuuch)',
 'tog-forceeditsummary' => 'Sich erinärn lasn, wemmâr ghâ dsusamnfasung gschriiwn had',
 'tog-watchlisthideown' => 'Ajchne bearbajdungn ned in dr beoobachdungs-lischdn uffiirn',
@@ -107,7 +104,12 @@ ausghenn, mr mus dâdsuu ufm ajchnen rächnâr was âjrichdn ghenn)',
 'friday' => 'Freidooch',
 'saturday' => 'Samsdooch',
 'sun' => 'Su',
+'mon' => 'Mon',
+'tue' => 'Die',
+'wed' => 'Mid',
 'thu' => 'Du',
+'fri' => 'Fre',
+'sat' => 'Sam',
 'january' => 'Januaar',
 'february' => 'Feebruaar',
 'march' => 'Märds',
@@ -154,6 +156,7 @@ ausghenn, mr mus dâdsuu ufm ajchnen rächnâr was âjrichdn ghenn)',
 'hidden-categories' => '{{PLURAL:$1|Fârschdegde ghadegorii|Fârschdegde ghadegoriin}}',
 'category-subcat-count' => 'Di ghadegorii umfasd {{PLURAL:$2|bloos a undâr-ghadegorii|dsam $2 undâr-ghadegoriâ, wofoo {{PLURAL:$1|nôr ôône| $1}}}} undn ôôdsajchd wärn.',
 'category-article-count' => 'Di ghadegorii umfasd {{PLURAL:$2|bloos a sajdn|$2 sajdn, wofoo hiir {{PLURAL:$1|aane undn ôôdsajchd wärd|l$1 ôôdsajchd undn wärn}}}}.',
+'category-file-count' => '{{PLURAL:$2|Di Gadegorii umfasd bloos a Dadei.|Di folgende {{PLURAL:$1|Dadei is|$1 Dadein sind}} in der Gadegorii, von insgsamd $2 Dadein anzeichd.}}',
 'listingcontinuesabbrev' => '(Fôrdsedsung)',
 'noindex-category' => 'Seidn, wou net indexierd sin',
 
@@ -224,7 +227,7 @@ ausghenn, mr mus dâdsuu ufm ajchnen rächnâr was âjrichdn ghenn)',
 'articlepage' => "D'inhalds-sajdn dsajchn",
 'talk' => 'Disghusjoon',
 'views' => 'Ôôsichdn',
-'toolbox' => 'Werchdsajch-ghisdn',
+'toolbox' => 'Werchdsajch',
 'userpage' => "D'benudsârsajdn dsajchn",
 'projectpage' => "D'brojägdsajdn dsjachn",
 'imagepage' => "D'dadhaj-sajdn dsajchn",
@@ -247,7 +250,7 @@ sajdn ham woln. Ward n'bôôr minuudn un brobiir's dan nochâmôôl.
 
 $1",
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Was {{SITENAME}} is',
 'aboutpage' => 'Project:Iibär',
 'copyright' => 'Was hiir schdäd däfmâr benudsn nach $1',
@@ -257,7 +260,6 @@ $1",
 'disclaimers' => 'Imbräsum',
 'disclaimerpage' => 'Project:Imbräsum',
 'edithelp' => 'Hilfe dsum beärbâdn',
-'edithelppage' => 'Help:Beärbâdn',
 'helppage' => 'Help:Inhalds-fârdsajchnis',
 'mainpage' => 'Haubdsajdn',
 'mainpage-description' => 'Haubdsajdn',
@@ -322,16 +324,6 @@ S'ghend aa â brogramiirfäälâr in dr sofdwäâr sâj, dii baj {{SITENAME}} le
 # General errors
 'error' => 'Feelâr',
 'databaseerror' => 'Feelâr fon dr Daadnbangg',
-'dberrortext' => 'Bam abfrôôchn fon dr daadnbangg is was schiif gangn.
-Filajchd weechn am brogramiir-feelâr?
-Jeednfals wôôr di ledsd abfrôôchn:
-<blockquote><tt>$1</tt></blockquote>
-aus dr fungdsjoon „<tt>$2</tt>“.
-Un dôôdruf had dan di daadnbangg den feelâr „<tt>$3: $4</tt>“ gmeld.',
-'dberrortextcl' => 'Dii daadnbangg-abfrôôchn wôôr falsch gschriiwn.
-Di abfrôôchn wôôr neemlich
-<blockquote><tt>$1</tt></blockquote>
-aus dr fungdsjoon "<tt>$2</tt>". Un dôôdruf had dan di daadnbangg den feelâr „$3: $4“ gmeld.',
 'laggedslavemode' => "'''Achdung:''' Filajchd dsajchd dii sajdn noch ned ales, was indswischn gändârd wôrn is.",
 'readonly' => 'Di daadnbangg is gschbärd.',
 'enterlockreason' => 'Bide schrajb, wisoo dii daadnbangg gschbärd wärn sol, un wi lang des dan dauârn mechd.',
@@ -351,7 +343,8 @@ Wen's des ned is, bisd womeeglich iwa ân feela in dr sofdwäâr gschdolbäd. In
 # Login and logout pages
 'yourname' => 'Benudsârnôômâ',
 'yourpassword' => 'Bhaswôrd:',
-'remembermypassword' => 'Af dem ghombjuudâr schdändich ôôgmäld blajm (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'yourpasswordagain' => 'Bassworrd widderhulln:',
+'remembermypassword' => 'Miid den Brauser dauerhafd ogmeld bleim (maximal $1 {{PLURAL:$1|Dooch|Dooch}})',
 'login' => 'Ôômeldn',
 'nav-login-createaccount' => 'Oomeldn / Ghondoo ooleeng',
 'loginprompt' => 'Zum Omelldn mäin Guggies agdivierd sei.',
@@ -360,7 +353,10 @@ Wen's des ned is, bisd womeeglich iwa ân feela in dr sofdwäâr gschdolbäd. In
 'userlogout' => 'Abmeldn',
 'nologin' => 'Du hast ka Nutzergonto? $1',
 'nologinlink' => 'Sich als najâr Ôôgmeldâr ôômäldn',
+'createaccount' => 'Nutzergonto olegn',
+'gotaccount' => 'Du host scho a Benudtzergondo? $1',
 'gotaccountlink' => 'Omeldn',
+'userlogin-resetlink' => 'Omeldedadn vergessn?',
 'mailmypassword' => 'Â najs passwôrd iwâr iimejl dsuschign lasn',
 'loginlanguagelabel' => 'Sproch: $1',
 
@@ -421,7 +417,8 @@ Wen'D dich awâr hiirhäär bloos fârlaafn hasd, glig ââfach af '''Zurück'''
 'noarticletext' => 'Dii sajdn gibd\'s bis eds no ned.
 Duu ghâusch nach däm ausdrug aa [[Special:Search/{{PAGENAME}}|in alle sajdn suchng]],
 <span class="plainlinks"> [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} in di dsugheerichng log-biichâr suchng] odâr dii sajdn [{{fullurl:{{FULLPAGENAME}}|action=edit}} ôôleeng un najschrajm]</span>.',
-'previewnote' => "'''Hiir siggsd bloos, wii's wärn dääd, dii sajdn is ôbâr no ned gschbaichärd!'''",
+'noarticletext-nopermission' => 'Däi Seidn endhäld momendan nu kan Dexd, [[Special:Search/{{PAGENAME}}|Du derfsd däi Seidn a net derschdelln]].',
+'previewnote' => "'''Des is blouss a Vuurschau.''' Däi Seidn is nu net gschbeicherd worrn.",
 'editing' => 'Beärbâdn fon $1',
 'editingsection' => 'Beärwâdn fo $1 (bloos abschnid)',
 'copyrightwarning' => "''Ghobhiir jôô ghâ web-sajdn, dii där ned ghärn, un benuds ghâ uurheewarrechdlich gschidsde wärgghe oone geneemichung fom uurheewâr!'''<br />
@@ -433,15 +430,24 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'template-semiprotected' => '(ned ôôgmeldede un naje benudsär däfn hiir ned schrajm)',
 'hiddencategories' => 'Dii sajdn ghäärd dsu {{PLURAL:$1|aanâr fârschdegdn|$1 fârschdegde}} ghadegoriin:',
 'permissionserrorstext-withaction' => 'Du däfsd ned $2, des{{PLURAL:$1||}}dâsweechn:',
+'recreate-moveddeleted-warn' => "'''Achdung: Du derschdellsd a Seidn, däi wou bereids fräiers glöschd worrn is.'''
+
+Bidde dou sorgfälldig ieberbriefen, ob die erneide Seidnderschdellung die Richdlinien endschbrechn doud.
+
+Zu deiner Informadion folchd des Lösch- un Verschäibungs-Logbuch miid der Begrindung vo der vuurherichen Löschung:",
+'moveddeleted-notice' => 'Däi Seidn is glöschd worrn. Zur Informadion folchds Lösch- un Verschäibungslogbuch vo dera Seidn.',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Wannung''': Däi Gräiss vo eibundne Vuurloong is zu grouss, einiche Vuurloong könna net eibundn werrn.",
 'post-expand-template-inclusion-category' => 'Seidn, in dena wou däi maximale Gräiss vo eibundne Vuurloong ieberschriddn is.',
+'post-expand-template-argument-warning' => "'''Wannung:''' Däi Seidn endhäld mindesdens an Barameder in anner Vuurlooch, der wou exbandierd zu grouß is.",
+'post-expand-template-argument-category' => 'Seidn miid ignorierde Vuurloongbarameder',
 
 # History pages
 'viewpagelogs' => 'Logbicher fär dii sajdn dsajchn',
 'currentrev-asof' => 'Jedsiche wärsjoon, am $2 um $3 gmachd',
 'revisionasof' => 'Wärsjoon fom $2 um $3 Uur',
+'revision-info' => 'Version vom $1 Uhr von $2',
 'previousrevision' => '← wärsjoon dâfoor',
 'nextrevision' => 'Nägsdnajâre wärsjoon →',
 'currentrevisionlink' => 'Geechnwärdiche wärsjoon',
@@ -451,9 +457,13 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 * '''({{int:cur}})''' = undârschiid dsur geechnwärdichn wärsjoon, '''({{int:last}})''' = undârschiid dsur foorichn wärsjoon
 * Uurdsajd/Daadum = wärsjoon dsu dära dsajd, '''{{int:minoreditletter}}''' = glane ändärung.",
 'history-fieldset-title' => 'Suchng in där wärsjoonsfolche',
+'history-show-deleted' => 'Blouss glöschde Versiona zeing',
 'histfirst' => 'älldsde',
 'histlast' => 'neisde',
 
+# Revision feed
+'history-feed-item-nocomment' => '$1 bis $2',
+
 # Revision deletion
 'rev-delundel' => 'ôôdsajng/fârbärng',
 'revdel-restore' => 'Ändârn, was oodsajchd wäd',
@@ -464,10 +474,11 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'revertmerge' => 'Dsrig fôr dii fârajnichung',
 
 # Diffs
-'history-title' => 'Wärsjoonsfolche fo „$1“',
+'history-title' => '$1: Versionsgschichd',
 'lineno' => 'Dsajln $1:',
 'compareselectedversions' => 'Ausgwäälde wärsjoona fârglajchn',
 'editundo' => 'riggängich machng',
+'diff-multi' => '({{PLURAL:$1|A dazwischaliengde Version|$1 dazwischaliengde Versiona}} von {{PLURAL:$2|am Nutzer|$2 Nutzern}} {{PLURAL:$1|wird|werrn}} ned ozeichd)',
 
 # Search results
 'searchresults' => 'Bam suchng gfundne sachng',
@@ -480,8 +491,10 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'prevn' => '{{PLURAL:$1|foorichâr|fooriche $1}}',
 'nextn' => '{{PLURAL:$1|nägschdâr|nägschde $1}}',
 'prevn-title' => '{{PLURAL:$1|Vuurherichs Ergebnis|Vuurheriche $1 Ergebniss}}',
+'nextn-title' => '{{PLURAL:$1|Folngnds Ergebnis|Folngnde $1 Ergebniss}}',
 'shown-title' => 'Zeich mer $1 {{PLURAL:$1|Ergebnis|Ergebniss}} bro Seidn',
 'viewprevnext' => 'Dsajch ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Es gidd a Seidn, däi wou´n Nooma „[[:$1]]“ hodd.'''",
 'searchmenu-new' => "'''Derschdell dai Seidn „[[:$1]]“ in diesn Wigi.'''",
 'searchprofile-articles' => 'Inhaldsseidn',
 'searchprofile-project' => 'Hilf- un Brojegdseidn',
@@ -494,6 +507,7 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'searchprofile-everything-tooltip' => 'Gsamdn Inhald durchsoung (aa Disgussionsseidn)',
 'searchprofile-advanced-tooltip' => 'Soung in weidere Namensraim',
 'search-result-size' => '$1 ({{PLURAL:$2|1 wôrd|$2 wärdâr}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Seidn|$1 Seidn}} ({{PLURAL:$2|1 Untergadegorii|$2 Untergadegoriin}}, {{PLURAL:$3|1 Dadei|$3 Dadein}})',
 'search-result-score' => 'Âjschleechich: $1 %',
 'search-redirect' => '(Wajdalajdung fon „$1“ häa)',
 'search-section' => '(Abschnid $1)',
@@ -522,14 +536,6 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'search-external' => 'Ägsdärne suach',
 'searchdisabled' => 'Diâ {{SITENAME}}-suâch ist ausgschald. Duu ghâusch so lang mid Google suâchn. Dengg drâu, des was mr dôô fir {{SITENAME}} find, ghâu iwârhoold saj.',
 
-# Quickbar
-'qbsettings' => 'Sajdn-lajsdn',
-'qbsettings-none' => 'Ghane',
-'qbsettings-fixedleft' => 'Lings, feschd',
-'qbsettings-fixedright' => 'Rächds, feschd',
-'qbsettings-floatingleft' => 'Lings, schwääbnd',
-'qbsettings-floatingright' => 'Rächds, schwääbnd',
-
 # Preferences page
 'preferences' => 'ajschdelunga',
 'mypreferences' => 'Ajschdelunga',
@@ -557,7 +563,6 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'resetprefs' => 'Nigs iwârneemn',
 'restoreprefs' => 'Uf dii uur-ajschdelungn dsrig',
 'prefs-editing' => 'Bearbajdungs-fenschdâr',
-'prefs-edit-boxsize' => 'Grees fom bearbajdungs-fenschdâr:',
 'rows' => 'Soofiil dsajln:',
 'columns' => 'Soofiil schbaldn',
 'searchresultshead' => 'Suuchn',
@@ -584,6 +589,8 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'allowemail' => 'Iimejl-embfang fon andrâ ôôschdeln',
 'youremail' => 'E-mail:',
 'yourrealname' => 'Bürcherlicher Noma:',
+'prefs-help-email' => 'Des Ogeem vo anner E-Mail-Adressn is obdional, ermöglichd obber däi Zusendung vo an Ersatzbassworrd, wennsd dei Bassworrd vergessn hosd.',
+'prefs-help-email-others' => 'Miid andre Benutzer koost a iber däi Benutzerdisgussionsseidn Kondagd afneha, ohne dass dei Idendidäd offenleeng moussd.',
 
 # Groups
 'group-sysop' => 'Adminisdradoorn',
@@ -604,13 +611,18 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'recentchanges' => 'ledsde änderunga',
 'recentchanges-legend' => 'Âjschdelunga, wii di ledsdn ändrunga dsajchd wärn solln',
 'recentchanges-feed-description' => 'Fârfolch mid dem Fiid dii ledsdn ändrungn in {{SITENAME}}.',
+'recentchanges-label-newpage' => 'Neie Seidn',
 'recentchanges-label-minor' => 'Blos a weng wôs is gändârd wôrn',
+'recentchanges-label-bot' => 'Ändrung durch an Bot',
+'recentchanges-label-unpatrolled' => 'Net-kondrollierde Ändrung',
 'rcnote' => "Des {{Plural:$1|is dii aane ändrung|sin dii '''$1''' ändrunga}}, dii in di {{Plural:$2|ledsdn 24 schdundn|ledsdn '''$2''' doochn}} gmachd wôrn {{Plural:$1|is|sin}}. Schdand is fom $4, $5 uur.",
+'rcnotefrom' => "Oozeichd werrn däi Ändrunga seid '''$2''' (max. '''$1''' Eidrääch).",
 'rclistfrom' => 'Bloos di ändrunga dsajchn sajd $1',
 'rcshowhideminor' => 'Glenâre Ändrungn $1',
 'rcshowhidebots' => 'Bods (bearbajdâr, dii ajchendlich brograme san) $1',
 'rcshowhideliu' => 'Ôôgmäldâde bearbajdâr $1',
 'rcshowhideanons' => '$1 uuôôgmäldâde bearbajdâr',
+'rcshowhidepatr' => 'Gondrollierde Ändrunga $1',
 'rcshowhidemine' => 'Ajchne bajdrääch $1',
 'rclinks' => 'Dsajch dii ledsdn $1 ändrunga fo di ledsdn $2 dooch.<br />$3',
 'diff' => 'undârschiid',
@@ -620,7 +632,7 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'minoreditletter' => 'g',
 'newpageletter' => 'N',
 'boteditletter' => 'B',
-'rc-enhanced-expand' => 'Ajndslhajdn ôôdsajchn (gäd bloos mid JavaScript)',
+'rc-enhanced-expand' => 'Eindslheidn oodseichn (gäd bloos mid JavaScript)',
 'rc-enhanced-hide' => 'Glaanichghajdn ned dsajng',
 
 # Recent changes linked
@@ -638,11 +650,13 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'uploadedimage' => 'had „[[$1]]“ naufglôôdn',
 
 'license' => 'Lizenz',
+'license-header' => 'Lizenz',
 
 # File description page
 'file-anchor-link' => 'Daddei',
 'filehist' => 'Wärsjoona bis eds',
 'filehist-help' => 'Glig af ân dsajdbhungd, um dii dôômôôliche fasung ôôdsuschaua',
+'filehist-revert' => 'zricksedzn',
 'filehist-current' => 'agduäl',
 'filehist-datetime' => 'Âjschdlungs-daadum un -dsajd',
 'filehist-thumb' => 'Schbigbildlâ',
@@ -676,6 +690,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
 'ncategories' => '$1 {{PLURAL:$1|GhadegoriiGhadegoriin}}',
 'nmembers' => '{{PLURAL:$1|1 âjdrôôch|$1 âjdrääch}}',
 'prefixindex' => 'Ale sajdn mid brääfigs',
+'usercreated' => '{{GENDER:$3|Ersschdelld}} am $1 um $2 Uhr',
 'newpages' => 'Naje sajdn',
 'move' => 'Umdaafn',
 'movethispage' => 'Sajdn umdaafn',
@@ -704,6 +719,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
 
 # Special:LinkSearch
 'linksearch' => 'Linggs nach ausârhalb',
+'linksearch-line' => '$1 is verlingt vo $2',
 
 # Special:ListGroupRights
 'listgrouprights-members' => '(Lisdn fon dâ midgliidâr)',
@@ -714,6 +730,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
 # Watchlist
 'watchlist' => 'Beoobachdungslisdn',
 'mywatchlist' => 'Beoobachdungslisdn',
+'watchlistfor2' => 'Fär $1 ($2)',
 'addedwatchtext' => "Di sajdn „[[:$1]]“ schdäd eds mid af dajnâr [[Special:Watchlist|beoobachdungs-lisdn]] .
 
 Wen sich af der sajdn oda iirâr disghusjoons-sajdn was duud, wärd se ab eds
@@ -736,6 +753,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
 'deletepage' => 'Sajdn leschn',
 'confirmdeletetext' => "Duu bisd grôd dâbaj, â sajdn midsamd alle dsugheeriche alde wärsjoona ds'leschn. Bide beschdäädich, das De wasd, was des als bewirgd, un das De Dich dâbaj aa an d'[[{{MediaWiki:Policy-url}}|richliinjen]] fo dem wighi hiir häldsd.",
 'actioncomplete' => 'Erleedichd',
+'actionfailed' => 'Agdsion fehlgschloong',
 'deletedtext' => '„$1“ is gleschd wôrn. Im $2 findsd â lisdn mid dâ ledsdn leschunga.',
 'dellogpage' => 'Logbuch fo di leschunga',
 'deletecomment' => 'Grund:',
@@ -787,10 +805,10 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
 'blanknamespace' => '(Sajdn)',
 
 # Contributions
-'contributions' => 'Ajchne bajdrääch',
+'contributions' => 'Eichne Beidrääch',
 'contributions-title' => 'Bajdrääch fo „$1“',
 'mycontris' => 'Bajdreech',
-'contribsub2' => 'Fär $1 ($2)',
+'contribsub2' => 'Von {{GENDER:$3|$1}} ($2)',
 'uctop' => '(agduell)',
 'month' => 'bis moonad:',
 'year' => 'bis dsum jôôr:',
@@ -802,6 +820,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
 'sp-contributions-talk' => 'Disgussion',
 'sp-contributions-search' => 'Bajdreech suchng',
 'sp-contributions-username' => 'IP-adresn odär nôômâ fom Ôôgmeldn:',
+'sp-contributions-toponly' => 'Blouss agduelle Versiona zeing',
 'sp-contributions-submit' => 'Suchng',
 
 # What links here
@@ -809,6 +828,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
 'whatlinkshere-title' => 'Sajdn, di af „$1“ fârwajsn',
 'whatlinkshere-page' => 'Sajdn:',
 'linkshere' => "Dii afgfiirdn sajdn fârwajsn af ''„[[:$1]]“''':",
+'nolinkshere' => "Ka Seidn verlingt af '''„[[:$1]]“'''.",
 'isredirect' => 'Wajdârlajdungssajdn',
 'istemplate' => 'Foorlaachn-ajbindung',
 'isimage' => 'Daddeilink',
@@ -818,7 +838,7 @@ Wenns'd dii sajdn irchendwan amôl nimä fârfolchn wilsd, musd bloos af „{{in
 'whatlinkshere-hideredirs' => '$1 wajdârlajdungn',
 'whatlinkshere-hidetrans' => '$1 Foorlaachn-ajbindunga',
 'whatlinkshere-hidelinks' => '$1 Fârwajse',
-'whatlinkshere-hideimages' => '$1 Bild-fârwajse',
+'whatlinkshere-hideimages' => 'Daddeilings $1',
 'whatlinkshere-filters' => 'Fildhâr',
 
 # Block/unblock
@@ -874,6 +894,7 @@ Schrajb bide den '''naja'' nôômâ fo dâr sajdn undârals '''Dsiil'' nâj un '
 
 # Thumbnails
 'thumbnail-more' => 'Grässär machng',
+'thumbnail_error' => 'Fehler beim Derschdelln von Vuurschaubilld: $1',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Daj benudsâr-sajdn',
@@ -939,17 +960,11 @@ Bidde gug's mi´m foorschau-gnobf ôô fôrm schbajchan",
 
 # Stylesheets
 'common.css' => '/* CSS hiir beâjflusd ale schelfn */',
-'standard.css' => "/* CSS hiir beâjflusd nôr dii Klassik-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an [[MediaWiki:Common.css]] was ändârn. */",
-'nostalgia.css' => "/* CSS hiir beâjflusd nôr dii Nostalgia-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
 'cologneblue.css' => "/* CSS hiir beâjflusd nôr dii Kölnisch-Blau-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
 'monobook.css' => "/* CSS hiir beâjflusd nôr dii Monobook-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
-'myskin.css' => "/* CSS hiir beâjflusd nôr dii MySkin-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
-'chick.css' => "/* CSS hiir beâjflusd nôr dii Küken-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
-'simple.css' => "/* CSS hiir beâjflusd nôr dii Simple-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
 'modern.css' => "/* CSS hiir beâjflusd nôr dii Modern-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
 'vector.css' => "/* CSS hiir beâjflusd nôr dii Vector-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
 'print.css' => '/* CSS hiir beâjflusd nôr dii drugausgaawe. */',
-'handheld.css' => '/* CSS hiir beâjflusd nôr dii handgerääde, jee nachdeem, welche schelfn in $wgHandheldStyle âjgeschdeld is. */',
 
 # Scripts
 'common.js' => '/* Des folchende JavaScript wird fir ale benudsâr glôôdn un fir ale sajdn, dii se ôôgugn. */',
@@ -989,7 +1004,7 @@ Bloos  dsajln, dii mi´m dsajchn * ôôfanga, wärn berigsichdichd. Un dä ärsc
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'brajdn',
 'exif-imagelength' => 'Heen',
 
@@ -1007,7 +1022,23 @@ Bloos  dsajln, dii mi´m dsajchn * ôôfanga, wärn berigsichdichd. Un dä ärsc
 'watchlisttools-edit' => 'Beobachdungslisdn dsajchn un ändârn',
 'watchlisttools-raw' => "In där beoobachdungslisdn ds'fuâs rumworschdln",
 
+# Core parser functions
+'duplicate-defaultsort' => 'Der Sordierungsschlissl „$2“ ieberschreibt den vuurher verwendten Schlissl „$1“.',
+
 # Special:SpecialPages
 'specialpages' => 'Schbedsjaal-sajdn',
 
+# External image whitelist
+'external_image_whitelist' => ' # Däi Zeiln net verändern.<pre>
+# Undnstehnd könna Fragmende vo reguläre Asdrigg (der Deil zwischa die //) eigeem werrn.
+# Däi werrn miid die URLs vo Bilder aus egsderne Gwelln verglichng.
+# A bositiver Vergleich fiehrt zur Ozeich vom Bild, sunsd werrds Bild blouss als Link ozeichd.
+# Zeiln, däi wou miid an # ofanga, werrn als Gommendar behandld.
+# Zwischa Grouß- un Klaaschreibung werrd net underschiedn.
+
+# Fragmende vo reguläre Asdrigg nach dera Zeiln eidroong. Däi Zeiln net verändern.</pre>',
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Marrgierungs]]-Fillder:',
+
 );
diff --git a/languages/messages/MessagesVo.php b/languages/messages/MessagesVo.php
index 05a4c2f4..b638e4a8 100644
--- a/languages/messages/MessagesVo.php
+++ b/languages/messages/MessagesVo.php
@@ -143,9 +143,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Jonön numi gebanas galädöl',
 'tog-oldsig' => 'Dispenäd dabinöl:',
 'tog-fancysig' => 'Dispenäd balugik (nen yüms lü gebanapad)',
-'tog-externaleditor' => 'Gebön nomiko redakömi plödik (te pro jäfüdisevans; paramets patik paneodons su nünöm olik)',
-'tog-externaldiff' => 'Gebön nomiko difi plödik (te pro jäfüdisevans; paramets patik paneodons su nünöm olik)',
-'tog-showjumplinks' => 'Dälön lügolovi me yüms „lübunöl“',
 'tog-uselivepreview' => 'Gebön büologedi itjäfidik (sperimäntik)',
 'tog-forceeditsummary' => 'Sagön obe, ven redakaplän brefik vagon',
 'tog-watchlisthideown' => 'Klänedön redakamis obik se galädalised',
@@ -217,6 +214,18 @@ $messages = array(
 'oct' => 'tob',
 'nov' => 'nov',
 'dec' => 'dek',
+'january-date' => 'yanul $1',
+'february-date' => 'febul $1',
+'march-date' => 'mäzul $1',
+'april-date' => 'prilul $1',
+'may-date' => 'mayul $1',
+'june-date' => 'yunul $1',
+'july-date' => 'yulul $1',
+'august-date' => 'gustul $1',
+'september-date' => 'setul $1',
+'october-date' => 'tobul $1',
+'november-date' => 'novul $1',
+'december-date' => 'dekul $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Klad|Klads}}',
@@ -293,6 +302,7 @@ $messages = array(
 'create-this-page' => 'Jafön padi at',
 'delete' => 'Moükön',
 'deletethispage' => 'Moükolös padi at',
+'undeletethispage' => 'Sämoükön padi at',
 'undelete_short' => 'Sädunön moükami {{PLURAL:$1|redakama bal|redakamas $1}}',
 'viewdeleted_short' => 'Logön {{PLURAL:$1|redakami pemoüköl bal|redakamis pemoüköls $1}}',
 'protect' => 'Jelön',
@@ -329,7 +339,7 @@ $messages = array(
 'jumptosearch' => 'suk',
 'pool-errorunknown' => 'Pöl nesevädik',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Tefü {{SITENAME}}',
 'aboutpage' => 'Project:Tefü',
 'copyright' => 'Ninäd gebidon ma el $1.',
@@ -339,7 +349,6 @@ $messages = array(
 'disclaimers' => 'Nuneds',
 'disclaimerpage' => 'Project:Gididimiedükam valemik',
 'edithelp' => 'Redakamayuf',
-'edithelppage' => 'Help:Redakam',
 'helppage' => 'Help:Ninäd',
 'mainpage' => 'Cifapad',
 'mainpage-description' => 'Cifapad',
@@ -410,17 +419,7 @@ Mögos i, das atos sinifon, das dabinon säkädil pö program fa {{SITENAME}} pa
 # General errors
 'error' => 'Pöl',
 'databaseerror' => 'Pöl in nünodem',
-'dberrortext' => 'Süntagapök pö geb vüka at ejenon.
-Atos ba sinifön, das dabinon säkäd pö program.
-Steifül lätik ad gebön vüki äbinon:
-<blockquote><code>$1</code></blockquote>
-se dunod: „<code>$2</code>“.
-Nünodem ägesedon pökanuni: „<samp>$3: $4</samp>“.',
-'dberrortextcl' => 'Süntagapök pö geb vüka at ejenon.
-Steifül lätik ad gebön vüki at äbinon:
-„$1“
-se dunod: „$2“.
-Nünodem ägesedon pökanuni: „$3: $4“',
+'databaseerror-error' => 'Pöl: $1',
 'laggedslavemode' => 'Nuned: pad ba labon votükamis brefabüik',
 'readonly' => 'Vük pefärmükon',
 'enterlockreason' => 'Penolös kodi löka, keninükamü täxet dula onik e dela, kü pomoükon',
@@ -468,7 +467,6 @@ Beg: $2',
 'editinginterface' => "'''Nuned:''' redakol padi, kel labükon vödemis bevüik pro programem.
 Votükams pada at oflunons logoti gebanasita pro gebans votik.
 Ad läükön u votükön tradutodis pro els wiki valik, demolös gebi ela [//translatewiki.net/?setlang=vo translatewiki.net]: topükamaproyeg ela MediaWiki.",
-'sqlhidden' => '(SQL beg peklänedon)',
 'cascadeprotected' => 'Pad at pejelon ta redakam, bi pakeninükon fa {{PLURAL:$1|pad|pads}} sököl, kels pejelons ma „jänajel“: $2',
 'namespaceprotected' => "No dalol redakön padis in nemaspad: '''$1'''.",
 'ns-specialprotected' => 'Pads patik no kanons paredakön.',
@@ -488,9 +486,17 @@ Kanol laigebön {{SITENAME}} nennemiko, u kanol <span class='plainlinks'>[$1 nun
 Küpälolös, das pads anik ba nog pojenons äsva no esenunädol oli, jüs uklinükol memi no laidüpik bevüresodanaföma olik.",
 'welcomeuser' => 'Benokömö, o $1!',
 'yourname' => 'Gebananem:',
+'userlogin-yourname' => 'Gebananem',
+'userlogin-yourname-ph' => 'Penolös gebananemi olik',
 'yourpassword' => 'Letavöd:',
+'userlogin-yourpassword' => 'Letavöd',
+'userlogin-yourpassword-ph' => 'Penolös letavödi olik',
+'createacct-yourpassword-ph' => 'Penolös letavödi',
 'yourpasswordagain' => 'Klavolös dönu letavödi:',
+'createacct-yourpasswordagain' => 'Fümedolös letavödi',
+'createacct-yourpasswordagain-ph' => 'Penolös letavödi dönu',
 'remembermypassword' => 'Dakipolöd ninädamanünis obik in nünöm at (muiko {{PLURAL:$1|del|dels}} $1)',
+'userlogin-remembermypassword' => 'Dakipön obi penunädöl',
 'yourdomainname' => 'Domen olik:',
 'password-change-forbidden' => 'No kanol votükön letavödis su el wiki at.',
 'externaldberror' => 'U ejenon fümükamapöl plödik nünödema, u no dalol atimükön kali plödik ola.',
@@ -502,14 +508,25 @@ Küpälolös, das pads anik ba nog pojenons äsva no esenunädol oli, jüs uklin
 'logout' => 'Senunädön oki',
 'userlogout' => 'Senunädön oki',
 'notloggedin' => 'No enunädol oli',
+'userlogin-noaccount' => 'No labol-li kali?',
+'userlogin-joinproject' => 'Sogolös oki lä {{SITENAME}}',
 'nologin' => 'No labol-li kali? $1.',
 'nologinlink' => 'Jafolös bali',
 'createaccount' => 'Jafön kali',
 'gotaccount' => "Ya labol-li kali? '''$1'''.",
 'gotaccountlink' => 'Nunädolös obi',
 'userlogin-resetlink' => 'Eglömol-li nünis kala olik?',
+'userlogin-resetpassword-link' => 'Dönuvälön letavödi olik',
+'helplogin-url' => 'Help:Nunädön',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Yuf ad nunädön]]',
+'createacct-join' => 'Penolös nünis olik dono.',
+'createacct-emailrequired' => 'Ladet leäktronik',
 'createaccountmail' => 'me pot leäktronik',
 'createaccountreason' => 'Kod:',
+'createacct-reason' => 'Kod',
+'createacct-submit' => 'Jafön kali olik',
+'createacct-benefit-body1' => '{{PLURAL:$1|redakam|redakams}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pad|pads}}',
 'badretype' => 'Letavöds fa ol pepenöls no leigons.',
 'userexists' => 'Gebananem at ya pagebon.
 Välolös, begö! nemi votik.',
@@ -568,7 +585,7 @@ Stebedolös büä osteifülol nogna.',
 'newpassword' => 'Letavöd nulik:',
 'retypenew' => 'Klavolöd dönu letavödi nulik:',
 'resetpass_submit' => 'Välön letavödi e nunädön omi',
-'resetpass_success' => 'Letavöd olik pevotükon benosekiko! Anu sit nunädon oli...',
+'changepassword-success' => 'Letavöd olik pevotükon benosekiko!',
 'resetpass_forbidden' => 'Letavöds no kanons pavotükön',
 'resetpass-no-info' => 'Mutol nunädön oli ad logön padi at nemediko.',
 'resetpass-submit-loggedin' => 'Votükön letavödi',
@@ -762,6 +779,7 @@ No enunon kodi.',
 Jiniko pemoükon.',
 'edit-conflict' => 'Redakamakonflit.',
 'edit-no-change' => 'Redakam olik penedemon, bi vödemivotükams nonik pedunons.',
+'postedit-confirmation' => 'Redakam olik pedakipolon.',
 'edit-already-exists' => 'No kanoy jafön padi nulik.
 On ya dabinon.',
 
@@ -935,7 +953,6 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'searchmenu-legend' => 'Sukaparamets',
 'searchmenu-exists' => "'''Dabinon pad labü nem: \"[[:\$1]]\" su vük at'''",
 'searchmenu-new' => "'''Jafolös padi: \"[[:\$1]]\" su vük at!'''",
-'searchhelp-url' => 'Help:Ninäd',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Logön padis labü foyümot at]]',
 'searchprofile-articles' => 'Ninädapads',
 'searchprofile-project' => 'Yufa e Proyegapads',
@@ -977,14 +994,6 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'search-external' => 'Suk plödik',
 'searchdisabled' => 'Suk in {{SITENAME}} penemogükon. Vütimo kanol sukön yufü el Google. Demolös, das liseds onik tefü ninäd in {{SITENAME}} ba no binon anuik.',
 
-# Quickbar
-'qbsettings' => 'Stumem',
-'qbsettings-none' => 'Nonik',
-'qbsettings-fixedleft' => 'nedeto (fimiko)',
-'qbsettings-fixedright' => 'Deto (fimiko)',
-'qbsettings-floatingleft' => 'nedeto (vebölo)',
-'qbsettings-floatingright' => 'deto (vebölo)',
-
 # Preferences page
 'preferences' => 'Buükams',
 'mypreferences' => 'Buükams',
@@ -1011,7 +1020,6 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'resetprefs' => 'Buükams rigik',
 'restoreprefs' => 'Geikön lü paramets kösömik valik',
 'prefs-editing' => 'Redakam',
-'prefs-edit-boxsize' => 'Gretot redakamafenäta.',
 'rows' => 'Kedets:',
 'columns' => 'Padüls:',
 'searchresultshead' => 'Suk',
@@ -1252,7 +1260,6 @@ Muton labön {{PLURAL:$1|malati|malatis}} läs $1.',
 'recentchangeslinked-feed' => 'Votükams teföl',
 'recentchangeslinked-toolbox' => 'Votükams teföl',
 'recentchangeslinked-title' => 'Votükams tefü pad: "$1"',
-'recentchangeslinked-noresult' => 'Pads ad pad at peyümöls no pevotükons ün period at.',
 'recentchangeslinked-summary' => "Su pad patik at palisedons votükams padas, lü kels pad pevälöl yumon.
 If ye pad pevälöl binon klad, palisedons is votükams nulik padas in klad at.
 Pads [[Special:Watchlist|galädaliseda olik]] '''pakazetons'''.",
@@ -1490,12 +1497,6 @@ Primanünods: ninädasot/donasot, a.s. <code>image/jpeg</code>.',
 'statistics-users-active-desc' => 'Gebans, kels edunons bosi ün {{PLURAL:$1|del lätik|dels lätik $1}}',
 'statistics-mostpopular' => 'Pads suvüno palogöls:',
 
-'disambiguations' => 'Pads lü telplänovapads yümöls',
-'disambiguationspage' => 'Template:Telplänov',
-'disambiguations-text' => "Pads sököl payümons ad '''telplanövapad'''.
-Sötons plao payümon lü yeged pötik.<br />
-Pad palelogon telplänovapad if gebon samafomoti, lü kel payümon pad [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop-submit' => 'Golön',
 
 'doubleredirects' => 'Lüodüköms telik',
@@ -1707,10 +1708,9 @@ If vilol poso moükön padi de galädalised olik, välolös lä on knopi: „neg
 'unwatchthispage' => 'No plu galädön',
 'notanarticle' => 'No binon pad ninädilabik',
 'notvisiblerev' => 'Fomam pemoükon',
-'watchnochange' => 'Nonik padas pagalädöl olik peredakon dü period löpo pejonöl.',
 'watchlist-details' => '{{PLURAL:$1|pad $1|pads $1}} su galädalised, plä bespikapads.',
-'wlheader-enotif' => '* Nunam medü pot leäktronik pemögükon.',
-'wlheader-showupdated' => "* Pads pos visit lätik ola pevotüköls papenons '''me tonats bigik'''",
+'wlheader-enotif' => 'Nunam medü pot leäktronik pemögükon.',
+'wlheader-showupdated' => "Pads pos visit lätik ola pevotüköls papenons '''me tonats bigik'''",
 'watchmethod-recent' => 'vestigam redakamas brefabüik padas galädaliseda',
 'watchmethod-list' => 'vestigam votükamas brefabüik padas galädaliseda',
 'watchlistcontains' => 'Galädalised olik labon {{PLURAL:$1|padi|padis}} $1.',
@@ -2053,12 +2053,9 @@ Logolös blokamis e xilis anu lonöfölis in [[Special:BlockList|lised blokamas]
 'ipb_blocked_as_range' => 'Pöl: ladet-IP $1 no peblokon stedöfiko e no kanon pasäblokön.
 Peblokon ye as dil ladetema: $2, kel kanon pasäblokön.',
 'ip_range_invalid' => 'Ladetem-IP no lonöföl.',
-'blockme' => 'Blokolöd obi',
 'proxyblocker' => 'Bloköm pladulömas',
-'proxyblocker-disabled' => 'Dun at penemogükon.',
 'proxyblockreason' => 'Ladet-IP olik peblokon bi binon pladulöm maifik.
 Kosikolös ko dünigevan bevüresodik u kaenastütans olik e nunolös ones sefasäkädi fefik at.',
-'proxyblocksuccess' => 'Peledunon.',
 'sorbsreason' => 'Ladet-IP olik palisedon as pladulöm maifik pö el DNSBL fa {{SITENAME}} pageböl.',
 'sorbs_create_account_reason' => 'Ladet-IP olik palisedon as pladulöm maifik pö el DNSBL fa {{SITENAME}} pageböl.
 No dalol jafön kali.',
@@ -2407,6 +2404,19 @@ If ojäfidükol oni, nünömasit olik ba podämükon.",
 'ago' => 'bü $1',
 'just-now' => 'anu',
 
+# Human-readable timestamps
+'hours-ago' => 'bü {{PLURAL:$1|düp|düps}} $1',
+'minutes-ago' => 'bü {{PLURAL:$1|minut|minuts}} $1',
+'seconds-ago' => 'bü {{PLURAL:$1|sekun|sekuns}} $1',
+'monday-at' => 'Tü mudel düp $1',
+'tuesday-at' => 'Tü tudel düp $1',
+'wednesday-at' => 'Tü vedel düp $1',
+'thursday-at' => 'Tü dödel düp $1',
+'friday-at' => 'Tü fridel düp $1',
+'saturday-at' => 'Tü zädel düp $1',
+'sunday-at' => 'Tü sudel düp $1',
+'yesterday-at' => 'Ädelo düp $1',
+
 # Bad image list
 'bad_image_list' => 'Fomät pabevobon ön mod soik:
 
@@ -2433,7 +2443,7 @@ Nünabinets votik poklänedons.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Vidot',
 'exif-imagelength' => 'Geilot',
 'exif-bitspersample' => 'Jölätabinets a köl',
@@ -2546,7 +2556,7 @@ Nünabinets votik poklänedons.
 'exif-languagecode' => 'Pük',
 'exif-iimcategory' => 'Klad',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'No pekobopedöl',
 
 'exif-unknowndate' => 'Dät nesevädik',
@@ -2808,12 +2818,9 @@ Kanol i [[Special:EditWatchlist|gebön redakametodi kösömik]].',
 'version-software-product' => 'Prodäd',
 'version-software-version' => 'Fomam',
 
-# Special:FilePath
-'filepath' => 'Ragivaluveg',
-'filepath-page' => 'Ragiv:',
-'filepath-submit' => 'Gololöd',
-'filepath-summary' => 'Pad patik at tuvon luvegi lölöfik ragiva.
-Magods pajonons ma fomät gudikün, ragivasots votik pamaifükons stedöfo kobü programs onsik.',
+# Special:Redirect
+'redirect-submit' => 'Golön',
+'redirect-file' => 'Ragivanem',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Sukön ragivis petelüköl',
@@ -2873,6 +2880,8 @@ Magods pajonons ma fomät gudikün, ragivasots votik pamaifükons stedöfo kobü
 'htmlform-submit' => 'Sedön',
 'htmlform-reset' => 'Sädunön votükamis',
 'htmlform-selectorother-other' => 'Votik',
+'htmlform-no' => 'Nö',
+'htmlform-yes' => 'Si',
 
 # New logging system
 'revdelete-restricted' => 'miedükams pelonöfükons pro guvans',
diff --git a/languages/messages/MessagesVot.php b/languages/messages/MessagesVot.php
index 0afeb398..3998ef45 100644
--- a/languages/messages/MessagesVot.php
+++ b/languages/messages/MessagesVot.php
@@ -156,7 +156,7 @@ $messages = array(
 'jumptonavigation' => 'valittsõmisiisõ',
 'jumptosearch' => 'ettsüse',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Tääteja {{GRAMMAR:elative|{{SITENAME}}}}',
 'aboutpage' => 'Project:Täätühsed',
 'copyright' => 'Sisälto on $1 litsentsii mukka svobodnoi.',
@@ -166,7 +166,6 @@ $messages = array(
 'disclaimers' => 'Ceeltümin vassamizõõ',
 'disclaimerpage' => 'Project:Ceeltümin vassamizõõ',
 'edithelp' => 'Muutuzavid',
-'edithelppage' => 'Help:Kui muuttaa cülciä',
 'helppage' => 'Help:Sisälto',
 'mainpage' => 'Esicülci',
 'mainpage-description' => 'Esicülci',
@@ -404,9 +403,6 @@ Proovvi lizät etsün alkuu ''all:'', nii ettsü etsib kõikkõõ sisältoo (taa
 'powersearch-redir' => 'Spiiska mešaitussijõ',
 'powersearch-field' => 'Etsi',
 
-# Quickbar
-'qbsettings-none' => 'Eb õõ',
-
 # Preferences page
 'preferences' => 'Koozid',
 'mypreferences' => 'Minu koozid',
@@ -488,7 +484,6 @@ Proovvi lizät etsün alkuu ''all:'', nii ettsü etsib kõikkõõ sisältoo (taa
 'recentchangeslinked-feed' => 'Sukulaizõd muutussõd',
 'recentchangeslinked-toolbox' => 'Sukulaizõd muutussõd',
 'recentchangeslinked-title' => 'Cüľľelt $1 linkitettüďďe cülcije muutuhsõd.',
-'recentchangeslinked-noresult' => 'Cüseizez aigakõhaz eväd õltu milliziitäid muuttumiziit.',
 'recentchangeslinked-summary' => "Kase osoobennoi cülci näütteb muutusõd cülcillä, kummalõõ on seltä cüľľeltä näüteltü.
 Cüľľed, kummad õmad teďďellä [[Special:Watchlist|kattsõspiizgalla]] on cirjuttõnnu '''pimmiässi'''.",
 'recentchangeslinked-page' => 'Cüľľee nimi:',
@@ -549,8 +544,6 @@ Seness [$2 kuvauhsõ lehocülless] informaattsija on alapallõ annõttu.',
 'statistics' => 'Staťisťikka',
 'statistics-pages' => 'Cülcid',
 
-'disambiguationspage' => 'Template:disambig',
-
 'brokenredirects-edit' => 'muuttaa',
 'brokenredirects-delete' => 'pühi',
 
@@ -741,7 +734,6 @@ Cüľľellä $2 on spiiska viimeiziss pühcimühsiiss.',
 'blocklogentry' => 'piätteli cäüttijää vai IP-cislaa [[$1]]. Piättelemin lõpub $2 $3',
 'unblocklogentry' => 'rooci cäüttijält $1 muutuzpiäsüss',
 'block-log-flags-nocreate' => 'lukuloomin piäteltü',
-'proxyblocksuccess' => 'On tehtü.',
 
 # Move page
 'movepagetext' => "Alla õlõvall ruumõll võitta anta cüľľelle uutt nimiä; kõik cüľľee istori leeb liikutõttu uuvvõ nimee alle.
@@ -890,7 +882,7 @@ Kui faili on muutõttu, siiz detaaľid võivad õlla kahõllaizõd muutõtull fa
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-gpstimestamp' => 'GPS-aika',
 'exif-languagecode' => 'Ceeli',
 'exif-iimcategory' => 'Gruppa',
@@ -934,10 +926,6 @@ Kui faili on muutõttu, siiz detaaľid võivad õlla kahõllaizõd muutõtull fa
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'Warning:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
 
-# Special:FilePath
-'filepath-page' => 'Faili:',
-'filepath-submit' => 'Mee',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Failinimi:',
 'fileduplicatesearch-submit' => 'Etsi',
diff --git a/languages/messages/MessagesVro.php b/languages/messages/MessagesVro.php
index 78bd15a1..7ed52782 100644
--- a/languages/messages/MessagesVro.php
+++ b/languages/messages/MessagesVro.php
@@ -72,9 +72,6 @@ $messages = array(
 'tog-shownumberswatching' => "Näütäq, ku pall'o pruukjit taa lehe perrä kaes",
 'tog-oldsig' => 'Parhillanõ alakirotus:',
 'tog-fancysig' => 'Pruugiq vikiteksti moodulist alakirotust (ilma automaatsõ lingildä)',
-'tog-externaleditor' => "Pruugiq vaikimiisi välist tekstitoimõndajat (õnnõ as'atundjilõ, nõud suq puutri ümbresäädmist, kaeq [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
-'tog-externaldiff' => "Pruugiq vaikimiisi välist võrrõlusprogrammi (õnnõ as'atundjilõ, nõud su puutri ümbresäädmist, kaeq [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
-'tog-showjumplinks' => 'Panõq lehe algustõ kipõqlingiq',
 'tog-uselivepreview' => 'Pruugiq kipõkaehust (JavaScript) (proomi)',
 'tog-forceeditsummary' => 'Annaq teedäq, ku olõ-i kirotõt kokkovõtõt',
 'tog-watchlisthideown' => 'Näüdäku-i perräkaemisnimekirän mu hindä toimõnduisi',
@@ -272,7 +269,7 @@ $1",
 'pool-queuefull' => 'Kinniqpandmiisi järekõrd om täüs',
 'pool-errorunknown' => 'Tiidmäldä hädä',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} tutvustus',
 'aboutpage' => 'Project:Pääteedüs',
 'copyright' => 'Teksti või vabalt pruukiq litsendsi $1 perrä.',
@@ -282,7 +279,6 @@ $1",
 'disclaimers' => 'Hoiatuisi',
 'disclaimerpage' => 'Project:Üledseq hoiatusõq',
 'edithelp' => 'Toimõndamisoppus',
-'edithelppage' => 'Help:Kuis_artiklit_toimõndaq',
 'helppage' => 'Help:Oppus',
 'mainpage' => 'Pääleht',
 'mainpage-description' => 'Pääleht',
@@ -353,17 +349,6 @@ Olõmanolõvaq tallitusleheküleq ommaq löüdäq leheküle päält [[Special:Sp
 # General errors
 'error' => 'Viga',
 'databaseerror' => 'Teedüskogo viga',
-'dberrortext' => 'Teedüskogo perräküsümisen oll\' süntaksiviga.
-Perräküsümine oll\' viganõ vai om tarkvaran viga.
-Viimäne teedüskogo perräküsümine oll\':
-<blockquote><tt>$1</tt></blockquote>
-ja tuu tetti funktsioonist "<tt>$2</tt>".
-Teedüskogo and\' viateedüse "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Teedüskogo perräküsümisen oll\' süntaksiviga.
-Viimäne teedüskogo perräküsümine oll\':
-"$1"
-ja tuu tetti funktsioonist "$2".
-Teedüskogo and\' viateedüse "$3: $4".',
 'laggedslavemode' => 'Hoiatus: Taa lehe pääl pruugi-i ollaq perämäidsi muutmiisi.',
 'readonly' => 'Teedüskogo kirotuskaitsõ all',
 'enterlockreason' => 'Kirodaq lukkupandmisõ põhjus ja ligikaudnõ vallalõvõtmisõ aig',
@@ -408,7 +393,6 @@ Perräküsümine: $2',
 'viewsourcetext' => 'Võit kaiaq ja kopidaq taa lehe lättekoodi:',
 'protectedinterface' => "Taa lehe pääl om tarkvara pruukjapalgõ tekst. Leht om lukku pant, et taad saasi-i ärq ts'urkiq.",
 'editinginterface' => "'''Hoiatus:''' Sa toimõndat tarkvara pruukjapalgõ tekstiga lehte. Ku siin midä muudat, mõotas tuu pruukjapalõt. Ümbrepandmisõs tasos pruukiq MediaWiki ümbrepandmisõ tüüriista [//translatewiki.net/wiki/Main_Page?setlang=fiu-vro translatewiki.net].",
-'sqlhidden' => '(SQL-perräküsümine käkit)',
 'cascadeprotected' => 'Taa leht om kirotuskaidsõt, selle et taa {{PLURAL:$1|kuulus alanolõvidõ kaidsõtuidõ lehti hulka|kuulus alanolõvidõ kaidsõtuidõ lehti hulka}}:
 $2',
 'namespaceprotected' => "Sul olõ-i lubat toimõndaq nimeruumi '''$1''' lehti.",
@@ -506,7 +490,7 @@ Oodaq vähä inne ku proovit vahtsõst.",
 'newpassword' => 'Vahtsõnõ salasõna',
 'retypenew' => 'Kirodaq viilkõrd vahtsõnõ salasõna',
 'resetpass_submit' => 'Kirodaq salasõna ja mineq nimega sisse',
-'resetpass_success' => 'Salasõna vaihtaminõ läts kõrda.',
+'changepassword-success' => 'Salasõna vaihtaminõ läts kõrda.',
 'resetpass_forbidden' => 'Salasõnno saa-i muutaq.',
 'resetpass-no-info' => 'Taa lehe pääle päsemises piät olõma nimega sisse lännüq.',
 'resetpass-submit-loggedin' => 'Muudaq salasõnna',
@@ -777,7 +761,6 @@ Lisateedüst või ollaq [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME
 'shown-title' => 'Näütäq lehe kotsilõ $1 {{PLURAL:$1|tulõmus|tulõmust}}',
 'viewprevnext' => 'Näütäq ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-new' => "'''Luuq leht päälkiräga \"[[:\$1]]\".'''",
-'searchhelp-url' => 'Help:Oppus',
 'searchprofile-articles' => 'Sisuleheq',
 'searchprofile-project' => 'Abi- ja projektileheq',
 'searchprofile-images' => 'Multimeediä',
@@ -815,14 +798,6 @@ otsisõna iin edejakku ''all:''. Ütest kimmäst nimeruumist otsmisõs pruugiq e
 'search-external' => 'Väline otsminõ',
 'searchdisabled' => "{{SITENAME}} otsminõ parhillaq ei tüütäq. Niikavva, ku otsminõ jälq tüüle saa, võit pruukiq otsmisõs alanolõvat Google'i otsikasti, a näide teedüs {{SITENAME}} sisust pruugi-i ollaq alasi kõgõ värskimb.",
 
-# Quickbar
-'qbsettings' => 'Kipõriba säädmine',
-'qbsettings-none' => 'Olõ-i',
-'qbsettings-fixedleft' => 'Kõgõ kural puul',
-'qbsettings-fixedright' => 'Kõgõ hüäl puul',
-'qbsettings-floatingleft' => 'Ujovahe kural puul',
-'qbsettings-floatingright' => 'Ujovahe hüäl puul',
-
 # Preferences page
 'preferences' => 'Säädmine',
 'mypreferences' => 'Säädmiseq',
@@ -997,7 +972,6 @@ Taa tohe-i ollaq rohkõmb ku $1 {{PLURAL:$1|märk|märki}}.",
 'recentchangeslinked-feed' => 'Siiäq putvaq muutmisõq',
 'recentchangeslinked-toolbox' => 'Siiäq putvaq muutmisõq',
 'recentchangeslinked-title' => 'Muutusõq noidõ lehti pääl, kohe näüdätäs lähe päält "$1"',
-'recentchangeslinked-noresult' => 'Taaha putvit lehti olõ-i taa ao seen muudõt.',
 'recentchangeslinked-summary' => "Taan nimekirän ommaq noidõ lehti muutmisõq, mink pääle näütäs seo lehe päält linke. Naad leheq ommaq [[Special:Watchlist|perräkaemisnimekirän]] märgidüq '''paksu kiräga'''.",
 'recentchangeslinked-page' => 'Lehe nimi:',
 'recentchangeslinked-to' => 'Näütäq muutmiisi noidõ lehti pääl, kon om näütämiisi seo lehe pääle',
@@ -1176,12 +1150,6 @@ Ku ülekaet teedüstü om sama pilt alguperälidsen suurusõn, sis olõ-i vaia e
 'statistics-users-active-desc' => 'Pruukjaq, kiä ommaq tan midägi toimõndanuq {{PLURAL:$1|viimädse päävä|viimädse $1 päävä}} seen.',
 'statistics-mostpopular' => 'Kõgõ kaetumbaq leheq',
 
-'disambiguations' => 'Lingiq, miä näütäseq täpsüstüslehekülgi pääle',
-'disambiguationspage' => 'Template:Linke täpsüstüslehekülile',
-'disambiguations-text' => "Naaq leheq näütäseq '''täpsüstüslehti''' pääle.
-Tuu asõmal pidänüq nä näütämä as'a sisu pääle.<br />
-Lehte peetäs täpsüstüslehes, ku timän om pruugit näüdüst, kohe näütäs link lehelt [[MediaWiki:Disambiguationspage]].",
-
 'doubleredirects' => 'Katõkõrdsõq ümbresaatmisõq',
 'doubleredirectstext' => 'Egä ria pääl om ärq tuud edimäne ja tõõnõ ümbresaatmisleht ja niisama tõõsõ ümbresaatmislehe link, miä näütäs hariligult kotusõ pääle, kohe edimäne ümbersaatmisleht pidänüq õkva näütämä.',
 
@@ -1329,10 +1297,9 @@ ja sul piät umin [[Special:Preferences|säädmiisin]] olõma e-postiaadrõs, et
 'unwatch' => 'Lõpõdaq perräkaeminõ ärq',
 'unwatchthispage' => 'Lõpõdaq perräkaeminõ ärq',
 'notanarticle' => 'Olõ-i artikli',
-'watchnochange' => 'Taa ao seen olõ-i üttegi perräkaetavat lehte muudõt.',
 'watchlist-details' => 'Perräkaemisnimekirän om {{PLURAL:$1|$1 leht|$1 lehte}}, rehkendämäldä arotuslehti.',
-'wlheader-enotif' => '* E-postiga teedäqandmisõq ommaq käügin.',
-'wlheader-showupdated' => "* Leheq, midä om muudõt päält su viimäst käümist, ommaq '''paksun kirän'''",
+'wlheader-enotif' => 'E-postiga teedäqandmisõq ommaq käügin.',
+'wlheader-showupdated' => "Leheq, midä om muudõt päält su viimäst käümist, ommaq '''paksun kirän'''",
 'watchmethod-recent' => 'kontrollitas perräkaetavidõ lehti perämäidsi muutmiisi',
 'watchmethod-list' => 'perräkaetavidõ lehti perämädseq muutmisõq',
 'watchlistcontains' => 'Perräkaemisnimekirän om $1 {{PLURAL:$1|leht|lehte}}.',
@@ -1595,7 +1562,6 @@ Perämäidsi kistutuisi ja tagasitegemiisi saat kaiaq [[Special:Log/delete|kistu
 'ip_range_invalid' => 'Viganõ puutri võrgoaadrõsi kujo.',
 'proxyblocker' => 'Vaihõserveri kinniqpidämine',
 'proxyblockreason' => "Su puutri võrgoaadrõs om kinniq peet, selle et taa om avalik vaihõserver. Otsiq üles uma võrgoliini pakja vai puutrias'atundja ja kõnõlõq näile taast hädäst.",
-'proxyblocksuccess' => 'Valmis.',
 'sorbsreason' => 'Su puutri võrgoaadrõs om SORBS-i mustan nimekirän ku avalik vaihõserver.',
 'sorbs_create_account_reason' => 'Su puutri võrgoaadrõs om pant SORBS-i musta nimekirjä ku avalik vaihõserver. Sa saa-i pruukjanimme tetäq',
 
@@ -1824,9 +1790,7 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
 'spam_blanking' => "Kõigin kujõn oll' linke lehele $1. Leht tühäs tett.",
 
 # Skin names
-'skinname-standard' => 'Array',
 'skinname-cologneblue' => 'Array',
-'skinname-myskin' => 'Array',
 
 # Patrolling
 'markaspatrolleddiff' => 'Märgiq ülekaetus',
@@ -1894,7 +1858,7 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lakjus',
 'exif-imagelength' => 'Korgus',
 'exif-bitspersample' => 'Bitti osa kotsilõ',
@@ -2008,7 +1972,7 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
 'exif-gpsdatestamp' => 'GPS-kuupäiv',
 'exif-gpsdifferential' => 'GPS-differentsiaalparandus',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Kokkopakmalda',
 
 'exif-unknowndate' => 'Tundmalda kuupäiv',
@@ -2237,11 +2201,6 @@ Prooviq harilikku kaehust.',
 'version-version' => '(Kujo $1)',
 'version-software-version' => 'Kujo',
 
-# Special:FilePath
-'filepath' => 'Teedüstü aadrõs',
-'filepath-page' => 'Teedüstü:',
-'filepath-submit' => 'Aadrõs',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Teedüstünimi:',
 'fileduplicatesearch-submit' => 'Otsiq',
diff --git a/languages/messages/MessagesWa.php b/languages/messages/MessagesWa.php
index d6b8740d..52b32020 100644
--- a/languages/messages/MessagesWa.php
+++ b/languages/messages/MessagesWa.php
@@ -113,9 +113,6 @@ $messages = array(
 'tog-shownumberswatching' => "Mostrer l' nombe d' uzeus ki shuvèt l' pådje",
 'tog-oldsig' => 'Siné pol moumint:',
 'tog-fancysig' => 'Sinateure avou do tecse wiki (sins loyén otomatike)',
-'tog-externaleditor' => "Eployî on dfoûtrin aspougneu d' tecse come prémetowe dujhance (po les spepieus uzeus seulmint, ca i vs fåt fé des apontiaedjes sol sopiutrece da vosse, [//www.mediawiki.org/wiki/Manual:External_editors loukîz chal po pus di racsegnes]).",
-'tog-externaldiff' => 'Eployî on dfoûtrin programe di diferinces come prémetowe dujhance (po les spepieus uzeus seulmint, ca i vs fåt fé des apontiaedjes sol sopiutrece da vosse, [//www.mediawiki.org/wiki/Manual:External_editors loukîz chal po pus di racsegnes]).',
-'tog-showjumplinks' => 'Mete en alaedje les loyéns di naiviaedje «potchî a» å dzeu del pådje (pol pea «Myskin» et ds ôtes)',
 'tog-uselivepreview' => "Eployî l' prévoeyaedje abeye (JavaScript) (Esperimintå)",
 'tog-forceeditsummary' => "M' advierti cwand dji lai vude on rascourti",
 'tog-watchlisthideown' => 'Èn nén mostrer les candjmints da minne',
@@ -127,6 +124,7 @@ $messages = array(
 'tog-ccmeonemails' => "M' evoyî ene copeye des emiles ki dj' evoye ås ôtes",
 'tog-diffonly' => "Èn nén håyner l' contnou del pådje pa dzo l' pådje des diferinces",
 'tog-showhiddencats' => 'Mostrer les categoreyes mucheyes',
+'tog-useeditwarning' => "M' advierti cwand dji cwite ene pådje k' a des candjmints nén schapés",
 
 'underline-always' => 'Tofer',
 'underline-never' => 'Måy',
@@ -298,7 +296,7 @@ Soeyoz vayant di ratinde ene miete divant di rsayî di vey cisse pådje ci.
 $1",
 'pool-errorunknown' => 'Aroke nén cnoxhowe',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Åd fwait di {{SITENAME}}',
 'aboutpage' => 'Project:Åd fwait',
 'copyright' => "Li contnou est dizo l' $1.",
@@ -306,7 +304,6 @@ $1",
 'currentevents' => 'Actouwålités',
 'currentevents-url' => 'Project:Actouwålités',
 'edithelp' => 'Aidance',
-'edithelppage' => 'Help:Kimint candjî ene pådje',
 'helppage' => 'Help:Aidance',
 'mainpage' => 'Mwaisse pådje',
 'mainpage-description' => 'Mwaisse pådje',
@@ -369,17 +366,6 @@ Motoit ki vos avoz må scrît l' hårdêye ou shuvou on cron loyén.
 # General errors
 'error' => 'Aroke',
 'databaseerror' => "Åk n' a nén stî avou l' båze di dnêyes",
-'dberrortext' => "Åk n' a nén stî avou l' sintacse do cweraedje del båze di dnêyes.
-Çoula pout esse cåze d' on bug dins l' programe.
-Li dierin cweraedje del båze di dnêyes di sayî esteut:
-<blockquote><tt>$1</tt></blockquote>
-a pårti del fonccion «<tt>$2</tt>».
-Li båze di dnêyes a rtourné l' aroke «<tt>$3: $4</tt>».",
-'dberrortextcl' => "Åk n' a nén stî avou l' sintacse do cweraedje del båze di dnêyes.
-Li dierin cweraedje del båze di dnêyes di sayî esteut:
-«$1»
-a pårti del fonccion «$2».
-Li båze di dnêyes a rtourné l' aroke «$3: $4».",
 'laggedslavemode' => "Asteme: I s' pout ki l' pådje n' åye nén co les dierins candjmints.",
 'readonly' => 'Li båze di dnêyes est aclawêye',
 'missing-article' => "Li båze di dnêyes n' a nén trové l' tecse d' ene pådje k' åreut dvou esse trovêye, lomêye «$1» $2.
@@ -502,7 +488,7 @@ Por vos fini l' elodjaedje, vos dvoz defini on novea scret:",
 'newpassword' => 'Noû scret:',
 'retypenew' => "Ritapez l' noû scret:",
 'resetpass_submit' => "Defini on scret et s' elodjî",
-'resetpass_success' => "Vosse sicret a stî candjî comifåt!
+'changepassword-success' => "Vosse sicret a stî candjî comifåt!
 Asteure l' elodjaedje...",
 'resetpass_forbidden' => "Les screts n' polèt nén esse candjîs",
 'resetpass-no-info' => 'Vos dvoz esse elodjî po pleur aveur accès a cisse pådje ci.',
@@ -514,10 +500,8 @@ Motoit ki vos l' avoz ddja candjî ou ridmandé on novea scret timporaire.",
 
 # Special:PasswordReset
 'passwordreset' => "Rifé l' sicret",
-'passwordreset-text' => 'Completez cisse formulrece ci po rçure èn emile ki dene les detays do conte da vosse.',
 'passwordreset-legend' => "Rifé l' sicret",
 'passwordreset-disabled' => "Li rfijhaedje di screts a stî dismetou so ç' wiki ci.",
-'passwordreset-pretext' => '{{PLURAL:$1||Dinez onk des elemints di dnêyes shuvants}}',
 'passwordreset-username' => "No d' elodjaedje:",
 'passwordreset-domain' => 'Dominne:',
 'passwordreset-capture' => "Vey li messaedje di l' emile?",
@@ -711,6 +695,8 @@ Motoit k' elle a stî tapêye evoye.",
 'edit-conflict' => 'Ecramiaedje di candjmints.',
 'edit-no-change' => "Vosse sicrijhaedje n' a nén passé, paski rén n' a stî candjî al modêye di dvant.",
 'edit-already-exists' => "Li novele pâdje n' a savou esse ahivêye, ca cisse pâdje la egzistêye dedja.",
+'editwarning-warning' => "Cwiter cisse pådje ci vos frè piede tos les candjmints ki vos avoz fwait.
+Si vos estoz elodjî, vos ploz dismete cist adviertixhmint ci dins l' linwete «Boesse di tecse» di vos preferinces.",
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Asteme:''' I gn a trop di modeles dins cisse pådje ci.
@@ -817,7 +803,6 @@ Les ôtes manaedjeus so {{SITENAME}} pôront todi vey li contnou catchî eyet l'
 'searchmenu-legend' => 'Tchuzes di cweraedje',
 'searchmenu-exists' => "'''Gn a ddja ene pådje lomêye « [[:$1]] » so ç' wiki ci'''",
 'searchmenu-new' => "'''Ahiver l' pådje \"[[:\$1]]\" so ç' wiki ci!'''",
-'searchhelp-url' => 'Help:Aidance',
 'searchprofile-articles' => 'Pådjes di contnou',
 'searchprofile-project' => "Pådjes d' aidance et do pordjet",
 'searchprofile-images' => 'Multimedia',
@@ -855,15 +840,6 @@ Vos ploz sayî di mete «all:» pa dvant l' tecse a cweri po cweri dins tot l' c
 'search-external' => 'Difoûtrin cweraedje',
 'searchdisabled' => "Mande escuzes! Li cweraedje å dvins des årtikes a stî dismetou pol moumint, cåze ki l' sierveu est fortcherdjî. Tot ratindant, vos ploz eployî Google po fé les rcweraedjes so {{SITENAME}}, mins çoula pout esse ene miete vî.",
 
-# Quickbar
-'qbsettings' => 'Apontiaedjes pol bår di menu',
-'qbsettings-none' => 'Nole bår',
-'qbsettings-fixedleft' => 'Aclawêye a hintche',
-'qbsettings-fixedright' => 'Aclawêye a droete',
-'qbsettings-floatingleft' => 'Flotante a hintche',
-'qbsettings-floatingright' => 'Flotante a droete',
-'qbsettings-directionality' => "Aclawêye, sorlon l' sinse di scrijhaedje di vosse lingaedje",
-
 # Preferences page
 'preferences' => 'Preferinces',
 'mypreferences' => 'Mes preferinces',
@@ -929,7 +905,6 @@ Vos ploz sayî di mete «all:» pa dvant l' tecse a cweri po cweri dins tot l' c
 'prefs-reset-intro' => "Vos ploz eployî ç' boton chal po rmete totes vos preferinces åzès prémetowès valixhances del waibe.
 Çoul n' pôrè nén esse disfwait.",
 'prefs-emailconfirm-label' => "Acertinaedje di l' emile:",
-'prefs-textboxsize' => 'Grandeu del boesse di tecse',
 'youremail' => 'Vost emile:',
 'username' => "No d' elodjaedje:",
 'uid' => "Limero d' l' uzeu:",
@@ -1282,12 +1257,6 @@ Rimimbrez vs di verifyî s' i n' a nén des ôtes loyéns divant delzès disface
 'statistics-pages-desc' => 'Totes les pådjes do "Wiki", minme les copinaedjes, les rdjiblaedjes, evnd.',
 'statistics-mostpopular' => 'Pådjes les pus veyowes',
 
-'disambiguations' => "Pådjes avou des loyéns viè des pådjes d' omonimeye",
-'disambiguationspage' => 'Template:omonimeye',
-'disambiguations-text' => "Ces pådjes ci loynut eviè ene '''pådje d' omonimeye'''.
-Ele divrént purade raloyî direk å mwaisse sudjet.<br />
-Ene pådje est waiteye come pådje d' omonimeye s' ele eploye on modele k' est loyî a [[MediaWiki:Disambiguationspage]].",
-
 'doubleredirects' => 'Dobes redjiblaedjes',
 'doubleredirectstext' => "Cisse pådje ci mostere les dobes redjiblaedjes (pådjes ki redjiblèt viè ene ôte pådje di redjiblaedje).
 Tchaeke roye a-st on loyén viè l' prumî eyet l' deujhinme redjiblaedje, avou on mostraedje del såme do deujhinme redjiblaedje, çou ki å pus sovint dene li «vraiy» årtike såme, ki l' prumî redjiblaedje divreut evoyî viè lu.
@@ -1470,10 +1439,9 @@ Si vos vloz bodjî l' pådje foû di vosse djivêye des shuvous, clitchîz so «
 'unwatch' => 'Èn pus shuve',
 'unwatchthispage' => 'Èn pus shuve li pådje',
 'notanarticle' => 'Nén èn årtike',
-'watchnochange' => "Nole des pådjes di vosse djivêye di pådjes a shuve n' a stî candjeye dins l' termene di tins dmandêye.",
 'watchlist-details' => 'Vos avoz {{PLURAL:$1|$1 pådje shuvowe|$1 pådjes shuvowes}} (sins conter les pådjes di copene).',
-'wlheader-enotif' => '* Li notifiaedje pa emile est en alaedje.',
-'wlheader-showupdated' => "* Les pådjes k' ont candjî dispoy vosse dierinne vizite sont metowes e '''cråssès letes'''",
+'wlheader-enotif' => 'Li notifiaedje pa emile est en alaedje.',
+'wlheader-showupdated' => "Les pådjes k' ont candjî dispoy vosse dierinne vizite sont metowes e '''cråssès letes'''",
 'watchmethod-recent' => "Cwerant après les pådjes k' ont stî candjeyes dierinnmint ki sont eto des pådjes shuvowes",
 'watchmethod-list' => "Cwerant après les pådjes shuvowes k' ont stî candjeyes dierinnmint",
 'watchlistcontains' => 'I gn a {{PLURAL:$1|$1 pådje|$1 pådjes}} e vosse djivêye des pådjes a shuve.',
@@ -1756,7 +1724,6 @@ Loukîz li [[Special:BlockList|djivêye des blocaedjes]] po vey les blocaedjes 
 'ip_range_invalid' => "Fortchete d' adresses IP nén valide.",
 'proxyblocker' => 'Blocaedje di procsi',
 'proxyblockreason' => "Voste adresse IP a stî blokêye paski c' est on procsi k' est å lådje. Contactez vost ahesseu Internet ou l' siervice di sopoirt tecnike eyet lzî dire po çoula, la k' c' est on problinme di såvrité serieus.",
-'proxyblocksuccess' => 'Fwait.',
 'sorbsreason' => "Voste adresse IP si trove dins l' djivêye des procsis å lådje di DNSBL.",
 'sorbs_create_account_reason' => "Voste adresse IP si trove dins l' djivêye des procsis å lådje di DNSBL. Vos n' poloz nén ahiver on conte d' uzeu.",
 
@@ -2051,7 +2018,7 @@ est raptiti. Les ôtes seront catchîs.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lårdjeur',
 'exif-imagelength' => 'Hôteur',
 'exif-bitspersample' => 'Bits pa compôzant',
@@ -2268,9 +2235,6 @@ Acertinez s' i vs plait ki vos vloz vormint rifé cisse pådje ci.",
 'version-software-product' => 'Prodût',
 'version-software-version' => 'Modêye',
 
-# Special:FilePath
-'filepath-page' => 'Fitchî:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Cweraedje après les dobes fitchîs',
 'fileduplicatesearch-submit' => 'Cweri',
diff --git a/languages/messages/MessagesWar.php b/languages/messages/MessagesWar.php
index f0b7dfa8..62e75c91 100644
--- a/languages/messages/MessagesWar.php
+++ b/languages/messages/MessagesWar.php
@@ -94,9 +94,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Igpakita an ihap han mga nangingita nga mga nagamit',
 'tog-oldsig' => 'Aada nga pirma:',
 'tog-fancysig' => 'Tratuha it pirma komo uska wikitext (nga waray automatiko nga sumpay)',
-'tog-externaleditor' => 'Gamit hin ha-gawas nga pagliwat ha default (ha mga experto la ini, nakinahanglan hin mga pinaurog nga mga seting ha imo kompyuter. [//www.mediawiki.org/wiki/Manual:External_editors More information.]  )',
-'tog-externaldiff' => 'Gamit hin ha-gawas nga diff ha default (ha mga experto la, nakinahanglan hin mga pinaurog nga mga seting ha imo kompyuter.  [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => 'Enable "jump to" accessibility links',
 'tog-uselivepreview' => 'Gamita an buhi nga pahiuna nga pagawas (eksperimental)',
 'tog-forceeditsummary' => 'Pasabti ako kun waray ko ginsurat ha dalikyat-nga-tigaman han pagliwat (edit summary)',
 'tog-watchlisthideown' => 'Tago-a an akon mga ginliwat tikang han angay timan-an',
@@ -109,6 +106,8 @@ $messages = array(
 'tog-diffonly' => 'Ayaw igpakita an sulod han pakli ha ilarom han pagkakaiba',
 'tog-showhiddencats' => 'Igpakita an mga tinago nga mga kaarangay',
 'tog-norollbackdiff' => 'Iglat-ang an kaiban kahuman himoa an libot-pabalik',
+'tog-useeditwarning' => 'Pasabti ako kun nabaya ako hin ginliwat ng pakli nga waray katipig an mga pagbag-o',
+'tog-prefershttps' => 'Pirmihi paggamit hin segurado nga koneksyon kun nakalog-in',
 
 'underline-always' => 'Pirme',
 'underline-never' => 'Diri',
@@ -172,6 +171,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nob',
 'dec' => 'Dis',
+'january-date' => 'Enero $1',
+'february-date' => 'Pebrero $1',
+'march-date' => 'Marso $1',
+'april-date' => 'Abril $1',
+'may-date' => 'Mayo $1',
+'june-date' => 'Hunyo $1',
+'july-date' => 'Hulyo $1',
+'august-date' => 'Agosto $1',
+'september-date' => 'Septyembre $1',
+'october-date' => 'Oktubre $1',
+'november-date' => 'Nobyembre $1',
+'december-date' => 'Disyembre $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kaarangay|Mga kaarangay}}',
@@ -192,7 +203,7 @@ $messages = array(
 'noindex-category' => 'Mga diri nakatudlokan nga pagkli',
 'broken-file-category' => 'Mga pakli nga mayda utod nga mga sumpay hin paypay',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^((?>.*(?<![a-zA-Z\\x80-\\xff])))(.+)$/sD',
 
 'about' => 'Mahitungod han',
 'article' => 'Pakli hin sulod',
@@ -255,6 +266,7 @@ $messages = array(
 'create-this-page' => 'Himo-a ini nga pakli',
 'delete' => 'Para-a',
 'deletethispage' => 'Para-a ini nga pakli',
+'undeletethispage' => 'Igbalik an ini nga pakli nga napara',
 'undelete_short' => 'Igkansela an pagpara {{PLURAL:$1|usa nga pagliwat|$1 nga mga pagliwat}}',
 'viewdeleted_short' => '{{PLURAL:$1|usa nga ginpara nga pagliwat|$1 ka ginpara nga mga pagliwat}}',
 'protect' => 'Panalipdi',
@@ -298,7 +310,7 @@ $1',
 'pool-queuefull' => 'Puno an katitirok nga pila',
 'pool-errorunknown' => 'Waray kasabti nga kasaypanan',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Mahitungod han {{SITENAME}}',
 'aboutpage' => 'Project:Mahitungod han',
 'copyright' => 'An sulod mabiblingan ha ilarom han $1 antes may-ada pasabot.',
@@ -308,7 +320,6 @@ $1',
 'disclaimers' => 'Mga Disclaimer',
 'disclaimerpage' => 'Project:Kasahiran nga disclaimer',
 'edithelp' => 'Bulig hin pagliwat',
-'edithelppage' => 'Help:Pagliwat',
 'helppage' => 'Help:Sulod',
 'mainpage' => 'Syahan nga Pakli',
 'mainpage-description' => 'Syahan nga Pakli',
@@ -338,7 +349,6 @@ $1',
 'newmessagesdifflinkplural' => '$1 {{PLURAL:$1|nga pagbag-o|nga mga pagbag-o}}',
 'youhavenewmessagesmulti' => 'Mayda ka mga bag-o nga mensahe ha $1',
 'editsection' => 'igliwat',
-'editsection-brackets' => '[$1]',
 'editold' => 'igliwat',
 'viewsourceold' => 'kitaa an ginkuhaan',
 'editlink' => 'igliwat',
@@ -388,17 +398,13 @@ Listahan o talaan hin puyde nga mga pinaurog nga pakli in mabibilngan ha [[Speci
 # General errors
 'error' => 'Sayop',
 'databaseerror' => 'Sayop hin database',
-'dberrortext' => 'Mayda nahinabo nga sayop hin syntax ha database nga kwery.
-Bangin ini nagpapakita hin bug dida han softweyr.
-An kataposan nga ginsari nga database nga kweri amo in:
-<blockquote><code>$1</code></blockquote>
-tikang ha sakob han funsyon nga "<code>$2</code>".
-Nagbalik an database hin sayop nga "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Mayda nahitabo nga sayop hin syntax ha database nga kwery.
-An kataposan nga ginsari nga kweri han database amo an:
-"$1"
-tikang ha sakob han funsyon nga "$2".
-Nagbalik hin sayop an database nga "$3: $4"',
+'databaseerror-text' => 'Nagkamay-ada hin database query error.
+
+Ini in indikasyon nga may-ada bug hini nga software.',
+'databaseerror-textcl' => 'Nagkamay-ada hin database query error.',
+'databaseerror-query' => 'Pakiana: $1',
+'databaseerror-function' => 'Function: $1',
+'databaseerror-error' => 'Sayop: $1',
 'laggedslavemode' => 'Pahimatngon: It pakli bangin waray mga kabag-ohan nga bag-o.',
 'readonly' => 'Gintrankahan an database',
 'enterlockreason' => 'Pagbutang hin rason para han pagtrangka, upod hin banabana kon san-o kukuha-on an pagtrangka',
@@ -431,6 +437,7 @@ Alayon la igsumat ini ha [[Special:ListUsers/sysop|administrator]], igsurat la a
 Bangin na ini ginpara hin iba.',
 'cannotdelete-title' => 'diri nakakapara han pakli "$1"',
 'delete-hook-aborted' => 'Pagpara ginpugngan han kawil.  Waray eksplenasyon an ginhatag.',
+'no-null-revision' => 'Diri nakakahimo hin bag-o nga null rebisyon para han pakli "$1"',
 'badtitle' => 'Maraot nga titulo',
 'badtitletext' => 'An ginhangyo nga pakli diri puyde, waray sulod, o sayop nga nasumpay nga inter-pinunongan o inter-wiki nga titulo.
 Bangin mayda usa o damo nga mga agi nga diri puyde magamit ha mga titulo.',
@@ -454,12 +461,15 @@ Para makadugang o makaliwat hin mga paghubad para han tanan nga mga wiki, alayon
 'editinginterface' => "'''Pahimatngon:''' Imo ginliliwat an pakli nga gingagamit paghatag hin interface text para han software.
 An mga pagbag-o hini nga pakli in makakaapekto han user interface han iba nga mga gumaramit hini nga wiki.
 Para makadugang o makabag-o han mga paghubad para han ngatanan nga mga wiki, alayon paggamit han [//translatewiki.net/ translatewiki.net], an lokalisasyon nga proyekto han MediaWiki.",
-'sqlhidden' => '(nakatago an SQL query)',
 'cascadeprotected' => 'Ini nga pakli in pinapasaliporan hin pagliwat tungod ini in nalalakip ha masunod nga {{PLURAL:$1|pakli, kun diin |mga pakli, kun diin}} pinapasaliporan hit "cascading" nga pagpili nga pinaandar:
 $2',
 'namespaceprotected' => "Diri ka gintutugutan pagliwat han mga pakli ha ngaran-lat'ang nga '''$1'''.",
 'customcssprotected' => 'Diri ka gintutugotan pagliwat hini nga CSS nga pakli, tungod nga nagsusulod ini hin kanan iba nga tawo personal nga karuyagon.',
 'customjsprotected' => 'Diri ka gintutugotan pagliwat hini nga JavaScript nga pakli, tungod nga nagsusulod ini hin kanan iba nga tawo personal nga karuyagon.',
+'mycustomcssprotected' => 'Waray nim pagtugot hin pagliwat hini nga CSS nga pakli.',
+'mycustomjsprotected' => 'Waray nim pagtugot hit pagliwat hini nga JavaScript nga pakli.',
+'myprivateinfoprotected' => 'Waray nim pagtugot hit pagliwat hit imo pribado nga impormasyon.',
+'mypreferencesprotected' => 'Waray nim pagtugot hit pagliwat hit imo mga karuyag.',
 'ns-specialprotected' => 'Diri maliliwat an mga ispisyal nga pakli.',
 'titleprotected' => 'Ini nga titulo pinasalipod ha paghimo ni [[User:$1|$1]].
 An katadungan nga ginhatag amo in "\'\'$2\'\'".',
@@ -484,10 +494,19 @@ Ginpapasabot ka la nga an iba nga pakli in magpapadayon nga magpakita komo nga i
 'welcomecreation-msg' => 'An im akawnt in nahimo na.
 Ayaw kalimti pagbalyo han imo [[Special:Preferences|{{SITENAME}} preperensya]].',
 'yourname' => 'Agnay hit gumaramit:',
+'userlogin-yourname' => 'Ngaran han gumaramit',
+'userlogin-yourname-ph' => 'Igbutang an imo ngaran-gumaramit',
+'createacct-another-username-ph' => 'Igbutang an imo agnay-gumaramit',
 'yourpassword' => 'Tigaman-pagsulod:',
+'userlogin-yourpassword' => 'Tigaman pagsakob',
+'userlogin-yourpassword-ph' => 'Igbutang an imo tigaman-pagsakob',
+'createacct-yourpassword-ph' => 'Pagbutang hin uska tigaman-pagsakob',
 'yourpasswordagain' => 'Utroha pagbutang an tigaman-han-pagsakob:',
+'createacct-yourpasswordagain' => 'Igkompirma an tigaman-pagsakob',
+'createacct-yourpasswordagain-ph' => 'Igbutang an tigaman-pagsakob utro',
 'remembermypassword' => "Hinumdumi an akon pan-sakob dinhi nga panngaykay ''(browser)'' (para ha pinakamaiha $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}})",
-'securelogin-stick-https' => 'Nagpapabilin nga masumpay ha HTTPS kahuman makalog-in',
+'userlogin-remembermypassword' => 'I-log-in la ako',
+'userlogin-signwithsecure' => 'Gamit hin koneksyon nga nakakasegurado',
 'yourdomainname' => 'Imo dominyo:',
 'password-change-forbidden' => 'Diri ka makakabalyo hin pulong-pagsulod ha dinhi nga wiki.',
 'externaldberror' => 'Mayda authenticaton database error o diri ka tinutugotan pag-update an imo akwant ha gawas.',
@@ -499,18 +518,44 @@ Ayaw kalimti pagbalyo han imo [[Special:Preferences|{{SITENAME}} preperensya]].'
 'logout' => 'Gawas',
 'userlogout' => 'Gawas',
 'notloggedin' => 'Diri sakob',
+'userlogin-noaccount' => 'Waray ka akawnt?',
+'userlogin-joinproject' => 'Tambong ha {{SITENAME}}',
 'nologin' => 'Waray ka akawnt? $1.',
 'nologinlink' => 'Paghimo hin akawnt',
 'createaccount' => 'Himo-a an akawnt',
 'gotaccount' => '¿Mayda kana akawnt? $1.',
 'gotaccountlink' => 'Sakob',
 'userlogin-resetlink' => 'Nangalimot han imo detalye han pagsakob?',
+'userlogin-resetpassword-link' => 'Ig-reset an imo tigaman-pagsakob',
+'helplogin-url' => 'Help:Pag-log-in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bulig han pag-log-in]]',
+'userlogin-loggedin' => 'Nakalog-in kana komo hi {{GENDER:$1|$1}}.
+Gamiti an porma ha ubos para makalog-in komo iba nga gumaramit.',
+'userlogin-createanother' => 'Paghimo hin iba nga akawnt',
+'createacct-join' => 'Igbutang an imo impormasyon ha ubos.',
+'createacct-another-join' => 'Igbutang an impormasyon han bag-o nga akwant ha ilarom.',
+'createacct-emailrequired' => 'Email address',
+'createacct-emailoptional' => 'Email address (opsyonal)',
+'createacct-email-ph' => 'Igbutang an imo email address',
+'createacct-another-email-ph' => 'Igbutang an email address',
 'createaccountmail' => 'Gamiti hin temporaryo nga bisan ano nag password ngan igpadangat ngada ha espesipikado nga e-mail address',
+'createacct-realname' => 'Tinuod nga ngaran (opsyonal)',
 'createaccountreason' => 'Rason:',
+'createacct-reason' => 'Rason',
+'createacct-reason-ph' => 'Kay ano nahimo ka hin usa pa nga akawnt',
+'createacct-captcha' => 'Pagkita han seguridad',
+'createacct-imgcaptcha-ph' => 'Igbutang an sinurat nga nakikita mo ha igbaw',
+'createacct-submit' => 'Ighimo an im akawnt',
+'createacct-another-submit' => 'Paghimo hin lain nga akant',
+'createacct-benefit-heading' => '{{SITENAME}} in ginhimo hin tawo nga sugad ha imo.',
+'createacct-benefit-body1' => '{{PLURAL:$1|pagliwat|mga pagliwat}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ka pakli|ka mga pakli}}',
+'createacct-benefit-body3' => 'bag-o pala nga {{PLURAL:$1|mag-aramot|mga mag-aramot}}',
 'badretype' => 'Diri naangay an mga tigaman-pagsulod nga im ginbutang',
 'userexists' => 'An agnay hiton gumaramit nga im ginbutang in gingamit na.
 Alayon pagpili hin lain nga ngaran.',
 'loginerror' => 'Sayop hin pagsakob',
+'createacct-error' => 'Pakyas an paghimo han akawnt',
 'createaccounterror' => 'Diri makakahimo hin akawnt: $1',
 'nocookiesnew' => 'An akawnt han gumaramit hin nahimo, pero diri ka pa nakalog-in.
 {{SITENAME}} in nagamit hin cookies para makalog-in han mga gumaramit.
@@ -574,9 +619,13 @@ Kinahanglan ka maglog-in ngan igbal-iw an imo tigaman-panakob yana dayon.
 
 Puydi nimo pabay-on ini nga mensahe, kun ini nga paghimo hin akwant in nagsayop la.',
 'usernamehasherror' => 'Agnay-hin-gumaramit in diri puydi magkamay-ada hin mga hash karakter',
+'login-throttled' => 'Damo na an imo login attempts ha pagkayana.
+Alayon paghulat hin $1 san-o ka umutro.',
 'login-abort-generic' => 'An imo paglog-in in diri malinamposon - Naundang',
 'loginlanguagelabel' => 'Pinulongan: $1',
 'suspicious-userlogout' => 'Waray ka tugoti pag-logout tungod nga baga ini ginpadangat hin usa nga broken browser o caching proxy.',
+'createacct-another-realname-tip' => 'Ada la ha imo kun karuyag mo igbutang an imo tinuod nga ngaran.
+Kun pinili mo ito ighatag, gagamiton ini paghatag hin atribusyon ha gumaramit para hit ira buhat.',
 
 # Email sending
 'php-mail-error-unknown' => 'Waray kasabti ha kanan PHP mail() function.',
@@ -592,8 +641,7 @@ Para mahuman paglalog-on, kinahanglan mo magbutang hin bag-o nga tigaman-panakob
 'newpassword' => 'Bag-o nga tigaman-pagsulod:',
 'retypenew' => 'Utroha pagbutang an bag-o nga tigaman-pagsulod:',
 'resetpass_submit' => 'Igbutang an password ngan log in',
-'resetpass_success' => 'Malinamposon nga nasalyuan na an imo tigaman-pagsulod!
-Ikaw in naglalog-in yana...',
+'changepassword-success' => 'Malinamposon an pagbal-iw hit imo tigaman-panakob!',
 'resetpass_forbidden' => 'Diri mababalyoan an mga tigaman-pagsulod',
 'resetpass-no-info' => 'Kinahanglan mo paglog-in para direkta ka makasakob dinhi nga pakli.',
 'resetpass-submit-loggedin' => 'Igbal-iw an tigaman-pagsulod',
@@ -605,9 +653,11 @@ Imo malinamposon nga ginsalyuan an imo tigaman-panakob o umaro ka na hin bag-o n
 
 # Special:PasswordReset
 'passwordreset' => 'igreset an tigaman-hit-pagsulod',
-'passwordreset-text' => 'Kumpletoha ini nga porma para makareset han imo password.',
+'passwordreset-text-one' => 'Kompletoha ini nga porma paramakareset hin imo tigaman-panakob.',
+'passwordreset-text-many' => '{{PLURAL:$1|Butanga ha usa nga mga surodlan para mareset iton imo tigaman-panakob.}}',
 'passwordreset-legend' => 'igreset an tigaman-hit-pagsulod',
 'passwordreset-disabled' => 'Waray ginpaandar an password reset hini nga wiki.',
+'passwordreset-emaildisabled' => 'Mga mga higamit ha email in waray pinaandar hini nga wiki.',
 'passwordreset-username' => 'Agnay hiton gumaramit:',
 'passwordreset-domain' => 'Dominyo:',
 'passwordreset-capture' => 'Kikitaon mo an resulta nga e-mail?',
@@ -618,7 +668,7 @@ Imo malinamposon nga ginsalyuan an imo tigaman-panakob o umaro ka na hin bag-o n
 Temporaryo nga tigaman han pagsakob: $2',
 'passwordreset-emailsent' => 'Ginpadangat an password reset email.',
 'passwordreset-emailsent-capture' => 'Ginpadangat an password reset email, nga ginpakita ha ubos.',
-'passwordreset-emailerror-capture' => 'Mayda pahinumdom nga e-mail han nahimo, kun diin ini in ginpapakita ha ubos, pero pakyas an pagpadangat ngada ha gumaramit: $1',
+'passwordreset-emailerror-capture' => 'Ginhimo an password reset email, kun diin nakikita ha ubos, pero pakyas an pagpadara ha  {{GENDER:$2|gumaramit}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Igliwan an e-mail address',
@@ -632,6 +682,18 @@ Temporaryo nga tigaman han pagsakob: $2',
 'changeemail-submit' => 'Igbalyo an e-mail',
 'changeemail-cancel' => 'Pasagdi',
 
+# Special:ResetTokens
+'resettokens' => 'Igrest an mga token',
+'resettokens-text' => 'Puydi nimo mareset an mga token para makahatag hin pipira nga pribado nga datos nga may pakahisumpay ha imo akawnt dinhi.
+Kinahanglan mo ini buhaton kun aksidenti nim nasaro hira ha iba nga tawo o an imo akawnt in nakompromiso.',
+'resettokens-no-tokens' => 'Waray token nga marereset.',
+'resettokens-legend' => 'Igreset an mga token',
+'resettokens-tokens' => 'Mga token:',
+'resettokens-token-label' => '$1 (yana nga balor: $2)',
+'resettokens-watchlist-token' => 'Token para han web feed (Atom/RSS) han[[Special:Watchlist|mga pagbag-o ha imo pakli han talaan-barantayon]]',
+'resettokens-done' => 'Narest an mga token.',
+'resettokens-resetbutton' => 'Igreset an pinili nga mga token',
+
 # Edit page toolbar
 'bold_sample' => 'dakmola an agi',
 'bold_tip' => 'Dakmola an agi',
@@ -764,6 +826,7 @@ An taramdan han pagpara ngan pagbalhin para han pakli in ginhahatag ha ubos para
 'log-fulllog' => 'Kitaa an bug-os nga taramdan',
 'edit-conflict' => 'Diri pagkakauroyon han pagliwat.',
 'edit-no-change' => 'Ginpabay-an an im pagliwat, mahitungod nga waray pagbalyo nga nabuhat ha nakasurat.',
+'postedit-confirmation' => 'Natipig an imo ginliwat.',
 'edit-already-exists' => 'Diri nakakahimo hin bag-o nga pakli.
 Aada na ito.',
 'defaultmessagetext' => 'Aada-nga-daan nga teksto han mensahe',
@@ -787,6 +850,7 @@ Ini nga mga argumento in ginlaktawan.",
 # "Undo" feature
 'undo-norev' => 'An pagliwat in diri mapapawaray-buhat tungod waray ito dida o napara na.',
 'undo-summary' => 'Ginpawara-buhat an rebisyon nga $1 ni [[Special:Contributions/$2|$2]] ([[User talk:$2|himangrawi]])',
+'undo-summary-username-hidden' => 'Igpawara-an-ginbuhat nga rebisyon $1 han uska tago nga gumaramit',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Diri makakahimo hin akawnt',
@@ -885,6 +949,7 @@ Diri mo ini malalabtan.',
 'lineno' => 'Bagis $1:',
 'compareselectedversions' => 'Igkumpara an mga pinili nga pagbabag-o',
 'editundo' => 'Igpawara an ginbuhat',
+'diff-empty' => '(Waray pagkakaiba)',
 'diff-multi' => '({{PLURAL:$1|Usa nga panbutnga nga pagbag-o|$1 nga panbutnga nga pagbag-o}} ni {{PLURAL:$2|usa nga gumaramit|$2 nga mga gumaramit}} waray ginpakita)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Uska sapit-nahiuna nga rebisyon|$1 nga mga sapit-nanhiuna nga rebisyon}} nga may labaw nga $2 {{PLURAL:$2|gumaramit|mga gumaramit}} in diri ginpapakita)',
 
@@ -907,7 +972,6 @@ Diri mo ini malalabtan.',
 'searchmenu-legend' => 'Mga pagpipilian han pamiling',
 'searchmenu-exists' => "'''May-ada pakli nga nakangaran hin \"[[:\$1]]\" hini nga wiki.'''",
 'searchmenu-new' => "'''Himoa an pakli \"[[:\$1]]\" hini nga wiki!'''",
-'searchhelp-url' => 'Help:Sulod',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ig-browse an mga pakli gamit hini nga prefix]]',
 'searchprofile-articles' => 'Mga unod nga pakli',
 'searchprofile-project' => 'Mga Bulig ngan Proyekto nga pakli',
@@ -947,14 +1011,7 @@ Diri mo ini malalabtan.',
 'searchdisabled' => '{{SITENAME}} nga pamiling in ginparong.
 Pamilnga la anay pinaagi ha Google ha pagkayana.
 Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Waray',
-'qbsettings-fixedleft' => 'Ginayad an wala',
-'qbsettings-fixedright' => 'Gin-ayad an to-o',
-'qbsettings-floatingleft' => 'Nalutaw pawala',
-'qbsettings-floatingright' => 'Nalutaw pato-o',
+'search-error' => 'May-ada sayop nga nahitabo samtang namimiling: $1',
 
 # Preferences page
 'preferences' => 'Mga karuyag',
@@ -987,7 +1044,6 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
 'resetprefs' => 'Pabay-i an diri nakatipig nga mga pagbabag-o',
 'restoreprefs' => 'Igbalik an ngatanan ngada nga aada-nga-daan nga settings (ha ngatanan nga mga bahin)',
 'prefs-editing' => 'Ginliliwat',
-'prefs-edit-boxsize' => 'Kadako han bintana han pagliwat.',
 'rows' => 'Mga rumbay pahigda:',
 'columns' => 'Mga rumbay patindog:',
 'searchresultshead' => 'Bilnga',
@@ -997,6 +1053,9 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
 'recentchangesdays-max' => 'Pinakadamo $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}',
 'recentchangescount' => 'Ihap han mga pagliwat nga igpapakita nga ginpasingada:',
 'prefs-help-recentchangescount' => 'Ini in naglalakip han mga kabag-ohan nga pagliwat, mga kaagi han pakli, ngan mga talaan.',
+'prefs-help-watchlist-token2' => 'Ini in sekreto nga susi ngadto han web feed an imo talaan han binabantayan.
+Kun hin-o man it maaram hini in puyde bumasa han imo talaan han binabantayan, tungod hini ayaw ini igsaro ha iba.
+[[Special:ResetTokens|Pidlita ini kun kinahanglan mo igreset ini]].',
 'savedprefs' => 'Gintipig an im karuyag.',
 'timezonelegend' => 'Zona hin oras',
 'localtime' => 'Oras nga lokal',
@@ -1026,7 +1085,6 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
 'prefs-common-css-js' => 'Saro nga CSS/JavaScript para han ngatanan nga mga panit:',
 'prefs-reset-intro' => 'Puydi nimo ini gamiton nga pakli para makareset han imo mga preperensya nga ginbutang nga daan han sityo. Diri ini puydi mapawaray-buhat.',
 'prefs-emailconfirm-label' => 'Kompirmasyon han email:',
-'prefs-textboxsize' => 'Kadako han editing window',
 'youremail' => 'E-mail:',
 'username' => '{{HENERO:$1|Agnay hit gumaramit}}:',
 'uid' => 'ID hit {{HENERO:$1|Gumaramit}}:',
@@ -1053,6 +1111,7 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'prefs-signature' => 'Pirma',
 'prefs-dateformat' => 'Batakan han petsa',
 'prefs-advancedediting' => 'Abansado nga mga pagpipilian',
+'prefs-preview' => 'Pahiuna nga pakita',
 'prefs-advancedrc' => 'Abansado nga mga pagpipilian',
 'prefs-advancedrendering' => 'Abansado nga mga pagpipilian',
 'prefs-advancedsearchoptions' => 'Abansado nga mga pagpipilian',
@@ -1060,7 +1119,9 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'prefs-displayrc' => 'Mga pirilion hiunong han ginpapakita',
 'prefs-displaysearchoptions' => 'Mga pirilion hiunong han ginpapakita',
 'prefs-displaywatchlist' => 'Mga pirilion hiunong han ginpapakita',
+'prefs-tokenwatchlist' => 'Token',
 'prefs-diffs' => 'Mga kaibhan',
+'prefs-help-prefershttps' => 'Ini nga preperensya in madulot ha sunod nimo nga paglog-in.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'E-mail address in baga puydi',
@@ -1136,6 +1197,9 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
 'right-editusercssjs' => 'Igliwat an kanan iba mga gumaramit nga mga paypay han CSS ngan JavaScript',
 'right-editusercss' => 'Igliwat an kanan iba mga gumaramit nga mga paypay han CSS',
 'right-edituserjs' => 'Iliwat an kanan iba mga gumaramit nga paypay han JavaScript',
+'right-viewmywatchlist' => 'Kitaa an imo kalugaringon nga talaan hin barantayon',
+'right-editmywatchlist' => 'Igliwat an imo talaan hin barantayon. Pasabot la nga an pipira ng abuhat in padayon nga madugang hin mga pakli bisan waray hini nga katungod.',
+'right-viewmyprivateinfo' => 'Kitaa an imo kalugaringon nga pribado nga datos (sugad han email address, tinuod nga ngaran)',
 'right-import' => 'Man-aangbit hin mga pakli tikang ha iba nga mga wiki',
 'right-importupload' => 'Man-aangbit hin mga pakli tikang ha uska paypay nga iginkarga-pasaka',
 'right-mergehistory' => 'Igtampo an kaagi han mga pakli',
@@ -1218,7 +1282,6 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
 'recentchangeslinked-feed' => 'Mga may kalabotan nga binag-o',
 'recentchangeslinked-toolbox' => 'Mga may kalabotan nga binag-o',
 'recentchangeslinked-title' => "Mga pagbag-o kasumpay ha ''$1''",
-'recentchangeslinked-noresult' => 'Waray pagbabag-o ha mga nakasumpay nga pakli han ginhatag nga oras.',
 'recentchangeslinked-summary' => "Ini nga taramdan hin pagbag-o nga lab-as nga hinimo ha mga pakli nga nakasumpay tikang a naka-specifico nga pakli (o ha api han uska specifico nga kaarangay).
 Mga pakli ha [[Special:Watchlist|imo angay timan-an]] in naka-'''bold'''.",
 'recentchangeslinked-page' => 'Ngaran han pakli:',
@@ -1338,7 +1401,6 @@ $1',
 'http-read-error' => 'HTTP maysayop ha pagbasa.',
 'http-timed-out' => 'Naubosan hin oras ha pagpaalayon ha HTTP.',
 'http-curl-error' => 'May sayop ha pagkuha hin URL: $1',
-'http-host-unreachable' => 'Diri nakakaabot ha URL.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'Diri nakakaabot ha URL',
@@ -1356,6 +1418,8 @@ $1',
 'listfiles_user' => 'Nagamit',
 'listfiles_size' => 'Kadako',
 'listfiles_count' => 'Mga bersyon',
+'listfiles-latestversion-yes' => 'Oo',
+'listfiles-latestversion-no' => 'Diri',
 
 # File description page
 'file-anchor-link' => 'Paypay',
@@ -1423,6 +1487,9 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 # Random page
 'randompage' => 'Bisan ano nga pakli',
 
+# Random page in category
+'randomincategory-selectcategory-submit' => 'Pakadto',
+
 # Random redirect
 'randomredirect' => 'Bisan ano la nga redirect',
 'randomredirect-nopages' => 'Waray mga redirecta ha ngaran-lat\'ang nga "$1".',
@@ -1447,9 +1514,6 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'statistics-users-active-desc' => 'Mga gumaramit nga may-ada iginbuhat ha urhi nga {{PLURAL:$1|ka adlaw|$1 ka mga adlaw}}',
 'statistics-mostpopular' => 'Gidamoi nga ginpanginanohan nga mga pakli',
 
-'disambiguations' => 'Mga pakli nga nasumpay ha mga pansayod nga pakli',
-'disambiguationspage' => 'Template:pansayod',
-
 'pageswithprop-submit' => 'Kadto-a',
 
 'doubleredirects' => 'Mga doble nga redirekta',
@@ -1734,7 +1798,7 @@ $1',
 'contributions' => 'Mga ámot ni {{GENDER:$1|User}}',
 'contributions-title' => 'Mga amot han gumaramit para ha $1',
 'mycontris' => 'Mga ámot nakon',
-'contribsub2' => 'Para ha $1 $2',
+'contribsub2' => 'Para {{HENERO:$3|$1}} ($2)',
 'uctop' => '(yana)',
 'month' => 'Tikang ha bulan (ngan uruunhan):',
 'year' => 'Tikang ha tuig (ngan uruunhan):',
@@ -1835,8 +1899,6 @@ Tanggala an pagpugong $1',
 'block-log-flags-nousertalk' => 'diri makakaliwat hit kalugaringon nga hiruhimangraw nga pakli',
 'block-log-flags-hiddenname' => 'nakatago an agnay-hit-gumaramit',
 'ipb_already_blocked' => '"$1" in ginpugngan na',
-'blockme' => 'Pugngi ako',
-'proxyblocksuccess' => 'Human na.',
 'ipbnounblockself' => 'Diri ka gintutugotan hin pagtanggal hit pagpugong ha kalugaringon',
 
 # Developer tools
@@ -2016,6 +2078,7 @@ Makikit-an nimo an ginkuhaaan',
 'tooltip-undo' => '"Igpawara an ginbuhat (undo)" in nagbabalik hinin nga pagliwat ngan nabuklad hin pagliwat nga porma ha pahiuna-nga-paggawas nga kahimtang.  Natugot liwat pagdugang hin katadungan ha dinalikyat nga sumat.',
 'tooltip-preferences-save' => 'Tipiga an mga karuyag',
 'tooltip-summary' => 'Pagbutang hin dalikyat nga sumat',
+'tooltip-iwiki' => '$1 – $2',
 
 # Attribution
 'siteuser' => '{{SITENAME}} gumaramit $1',
@@ -2129,7 +2192,7 @@ An iba in daan nakatago.
 * gpsngalongitud
 * gpsngaaltitud',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Kahaluag',
 'exif-imagelength' => 'Kahitaas',
 'exif-ycbcrpositioning' => 'Pagpoposisyon han Y ngan C',
@@ -2389,11 +2452,6 @@ An iba in daan nakatago.
 'version-entrypoints-header-entrypoint' => 'Surudlan',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Aragian han paypay',
-'filepath-page' => 'Paypay:',
-'filepath-submit' => 'Kadto-a',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Pamiling hin nadoble nga mga paypay',
 'fileduplicatesearch-legend' => 'Pamiling hin nadoble',
diff --git a/languages/messages/MessagesWo.php b/languages/messages/MessagesWo.php
index 3ab66399..092ea9d4 100644
--- a/languages/messages/MessagesWo.php
+++ b/languages/messages/MessagesWo.php
@@ -110,9 +110,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Wone limu jëfandikukat yiy topp wii xët',
 'tog-oldsig' => 'Wonendig xaatim gi teew:',
 'tog-fancysig' => 'Soppi sa xaatim (du am lëkkalekaay bu boppu)',
-'tog-externaleditor' => 'Jëfandikoo soppikaay bu biti saa su ne',
-'tog-externaldiff' => 'Jëfandiku ab méngalekaay bu biti saa su ne (ngir jëfandikukat yu xarale yi rekk, dafa laaj yenn kocc-koccal yi ci sa nosukaay)',
-'tog-showjumplinks' => 'Doxalal lëkkalekaay yii di « joowin » ak « seet »',
 'tog-uselivepreview' => 'Jëfandikul wonendi gu gaaw gi (JavaScript)',
 'tog-forceeditsummary' => 'Wax ma ko suma mottaliwul koju coppite bi',
 'tog-watchlisthideown' => 'Nëbb samay coppite ci limu toppte bi',
@@ -301,7 +298,7 @@ Taaxiirlul ba ci kanam nga jéemaat.
 
 $1',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Ci mbiri {{SITENAME}}',
 'aboutpage' => 'Project:Ci mbiri',
 'copyright' => 'Ëmbit laa ngi  jàppandi ci $1.',
@@ -311,7 +308,6 @@ $1',
 'disclaimers' => 'Ay aartu',
 'disclaimerpage' => 'Project:Aartu yu daj',
 'edithelp' => 'Ndimbal',
-'edithelppage' => 'Help:Nooy soppee aw xët',
 'helppage' => 'Help:Ndimbal',
 'mainpage' => 'Xëtu Njëlbéen',
 'mainpage-description' => 'Xët wu njëkk',
@@ -382,17 +378,6 @@ Ab limu xëti jagleel yépp, ma nees na koo gis ci [[Special:SpecialPages|{{int:
 # General errors
 'error' => 'Njuumte',
 'databaseerror' => 'Njuumtey dàttub njoxe bi',
-'dberrortext' => '�Njuumtey mbindin ci laaj bi nga yónne dàttub njoxe bi.
-Man na nekk it ab njuumte ci tëriin bi.
-Laaj bees mujje yónne ci dàttub njoxe bi moo doonoon:
-<blockquote><tt>$1</tt></blockquote>.
-bàyyikoo ci bii solo « <tt>$2</tt> ».
-Dàttub njoxe bee delloo bii njuumte « <tt>$3 : $4</tt> ».',
-'dberrortextcl' => 'Ab laajub dàttub njoxe bi jur na njuumte.
-Laaj bees mujje yónne dàttub njoxe bi moo doon :
-« $1 »
-bàyyikoo ci bii solo « $2 ».
-Dàttub njoxe bi delloo bii njuumte « $3 : $4 ».',
 'laggedslavemode' => 'Moytul, wii xët man naa bañ a man dékku coppite yi ñu mujjee def',
 'readonly' => 'Dàttub njoxe bi dañu koo caabi',
 'enterlockreason' => 'Biralal ngirtey tëj gi ak diir bi mu war a amee',
@@ -434,7 +419,6 @@ Laaj : $2',
 'viewsourcetext' => 'Man ngaa xool te duppi li nekk ci bii jukki ngir man cee liggéey :',
 'protectedinterface' => 'Xët wii dafa am ay mbind yu bokk ci jokkalekaayu tëriin wi, moo tax ñu caabi ko ngir bañ ku ci ëppal.',
 'editinginterface' => "'''Moytul''': mbindu xët wii dafa bokk ci jokkalekaayu tëriin bi. Bépp coppite boo ci def day feeñ ci bataaxal yi yeneen jëfandikukat yi di gis. Ngir tekki yi ñu lay ñaan nga dem ci   [//translatewiki.net/wiki/Main_Page?setlang=wo translatewiki.net] di am sémb ngir bennal bataaxal yi.",
-'sqlhidden' => '(Laaju SQL nëbbu na)',
 'cascadeprotected' => 'Xët wii dañ kaa aar ndaxte daa ëmbu ci {{PLURAL:$1|xët wi toftal|xët yi toftal}}, di yu ñu aar :
 $2',
 'namespaceprotected' => "Amoo sañ-sañu soppi xët yi ne ci bii barabu tur « '''$1''' ».",
@@ -529,7 +513,7 @@ Ngalla néggandikul ab diir door a jéemaat.',
 'newpassword' => 'Baatujàll bu bees :',
 'retypenew' => 'Bindaatal baatujàll bu bees bi :',
 'resetpass_submit' => 'Soppil baatujàll bi te dugg',
-'resetpass_success' => 'Coppiteeg baatujàll bi antu na : Yaa ngi dugg...',
+'changepassword-success' => 'Coppiteeg baatujàll bi antu na : Yaa ngi dugg...',
 'resetpass_forbidden' => 'Baatujàll bi manoo kaa soppi',
 'resetpass-no-info' => 'faaw nga dugg ngir man a jot ci wii xët.',
 'resetpass-submit-loggedin' => 'Soppi baatujàll bi',
@@ -882,7 +866,6 @@ Soo jëfandikoo lëkkalekaayu joow yi day neenal boyot yi nga jotoon a fal.',
 'searchmenu-legend' => 'Tànneefi ceet',
 'searchmenu-exists' => "'''wenn xët wu tudd « [[:$1]] » moo am ci bii wiki'''",
 'searchmenu-new' => "'''Sosal xët wii di « [[:$1|$1]] » ci bii wiki !'''",
-'searchhelp-url' => 'Help:Ndimbal',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Xoolal xët wi tambalee nii]]',
 'searchprofile-articles' => 'Xëti ëmbiit',
 'searchprofile-project' => 'Xëti Ndimbal ak Sémb',
@@ -924,14 +907,6 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
 'search-external' => 'Ceet gu biti',
 'searchdisabled' => 'Ceet gi ci {{SITENAME}} doxul. Ci négandiku doxal gi, man nga seet ci Google. Jàppal ne, xéj-na ëmbiti {{SITENAME}} gi ci bii seetukaay yeesaluñ leen.',
 
-# Quickbar
-'qbsettings' => 'Banqaasu jumtukaay',
-'qbsettings-none' => 'Kenn',
-'qbsettings-fixedleft' => 'Cammooñ',
-'qbsettings-fixedright' => 'Ndijoor',
-'qbsettings-floatingleft' => 'Ci cammooñ',
-'qbsettings-floatingright' => 'Ci ndijoor',
-
 # Preferences page
 'preferences' => 'Tànneef',
 'mypreferences' => 'Samay tànneef',
@@ -956,7 +931,6 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
 'resetprefs' => 'Loppanti tànneef yi',
 'restoreprefs' => 'Delloo say tànneef nañu meloon ca sag mbindu',
 'prefs-editing' => 'Boyotu coppite',
-'prefs-edit-boxsize' => 'Dayoo palanteeru coppite bi.',
 'rows' => 'Rëdd:',
 'columns' => 'Kenu :',
 'searchresultshead' => 'Seet',
@@ -993,7 +967,6 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
 'prefs-custom-js' => 'JavaScript yees jëmmal',
 'prefs-reset-intro' => 'Man ngaa jëfandikoo wii xët ngir delloowaat coppitey say tànneef delloo leen ci yi dal bi wàccaale. Doo ko man a neenal.',
 'prefs-emailconfirm-label' => 'Dëggalug sa m-bataaxal :',
-'prefs-textboxsize' => 'Dayoob palanteerub coppite bi',
 'youremail' => 'Sa màkkaanub m-bataaxal :',
 'username' => 'Turu jëfandikukat :',
 'uid' => 'Limu Jëfandikukat :',
@@ -1206,7 +1179,6 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
 'recentchangeslinked-feed' => 'Coppite yi ko ñeel',
 'recentchangeslinked-toolbox' => 'Coppite yi ko ñeel',
 'recentchangeslinked-title' => 'Coppite yi ñeel $1',
-'recentchangeslinked-noresult' => 'Benn coppite amul ci xët yi mu lëkkalool ci diir bi nga wax.',
 'recentchangeslinked-summary' => "Wii xëtu jagleel moo lay won coppite yu mujj ci xët yi lëkkalook wii. Xët yi ci sa [[Special:Watchlist|limu toppte]] ñoo '''duuf'''.",
 'recentchangeslinked-page' => 'Turu xët wi :',
 'recentchangeslinked-to' => 'Wone coppite yi ñeel xët yi lëkkalook xët wi nga joxe',
@@ -1396,12 +1368,6 @@ Bul fattee seet baxam amul yeneen lëkkalekaay yu lay jëmale ci royuwaay yi bal
 'statistics-users-active-desc' => 'Jëfandikukat yi amal ag yëngu-yëngu ci {{PLURAL:$1|bés bu mujj bi|$1 bés yu mujj yi}}',
 'statistics-mostpopular' => 'Xët yees gën a saytu',
 
-'disambiguations' => 'Xëti turandoo',
-'disambiguationspage' => 'Template:turandoo',
-'disambiguations-text' => "Xët yii di toftal dañoo ëmb ay lëkkalekaay yuy jëme ciy '''xëti turandoo'''.
-Dañoo waroon a jublu ci jukki yu baax. <br />
-Xëti turandoo yi ñooy yi ëmb benn ci royuwaay yees def fii [[MediaWiki:Disambiguationspage]]",
-
 'doubleredirects' => 'Jubluwaat ñaari yoon',
 'doubleredirectstext' => "Wii xët dafa ëmb mbooleem xët yees jubluwaatal ci yeneen xëti jubluwaat.
 Rëdd wu ne am na lëkkalekaay buy jëme ci bu njëkk ak ñaareelu jubluwaat bi, ak rëdduw mbind wu njëkk wu ñaareelu jubluwaat bi, biy ëmb xëtu jëmuwaay wu ''baax'' wi, wi jubluwaat bu njëkk bi war a jublu moom itam.",
@@ -1602,9 +1568,8 @@ Coppite yiy ñëw yu xët wi ak xëtu waxtaanuwaay wi mu àndal di nañu leen fa
 'watchthispage' => 'Topp xët wii',
 'unwatch' => 'Bul toppati',
 'unwatchthispage' => 'Bul toppati',
-'watchnochange' => 'Lenn ci xët yi ngay topp soppikuwul ci diir bii',
 'watchlist-details' => 'Topp nga $1 {{PLURAL:$1|xët|ciy xët}}, soo waññiwaalewul xëti waxtaanuwaay yi.',
-'wlheader-showupdated' => '* Xët yi ñu soppiwoon ca sa duggu bu mujj ñoom la ñu fesal ñu <b>xëm</b>',
+'wlheader-showupdated' => 'Xët yi ñu soppiwoon ca sa duggu bu mujj ñoom la ñu fesal ñu <b>xëm</b>',
 'watchmethod-recent' => 'saytug coppite yu mujj yu xët yi ngay topp',
 'watchmethod-list' => 'saytug xët yi ñuy topp ngir ay coppite yu mujj',
 'watchlistcontains' => "Sa limu toppte am na '''$1''' {{PLURAL:$1|xët|xët}}.",
@@ -1885,11 +1850,8 @@ Dangaa bëgg a soppi anam yi?',
 'ipb_cant_unblock' => 'Njuumte: téyeg $1 gisuwul. Xéj-na dañ kaa téyedi ba noppi.',
 'ipb_blocked_as_range' => 'Njuumte: màkkaan mi $1 téyewuñ ko moom kase, kon doo ko man téyedi. Ci mbooloom $2 la bokk, faww nga téyedi mbooloo mépp.',
 'ip_range_invalid' => 'Mbooloom IP mi baaxul.',
-'blockme' => 'Téye ma',
 'proxyblocker' => 'Téyekatu yóbbantekat',
-'proxyblocker-disabled' => 'Bii solo doxul.',
 'proxyblockreason' => 'Dañ téye sa IP ndax dadi ab yóbbantekat bu ubbeeku. Di la ñaan nga jublu ci sa ki la jox internet yegge ko jafe-jafeb kaaraange bi.',
-'proxyblocksuccess' => 'Jàll na.',
 'sorbsreason' => 'Sa màkkaanu IP dañ ko limaale niki ab yóbbantekat bu ubbeeku ci DNSBL bi {{SITENAME}} di jëfandikoo.',
 'sorbs_create_account_reason' => 'Sa màkkaanu IP dañ ko limaale niki ab yóbbantekat bu ubbeeku ci DNSBL bi {{SITENAME}} di jëfandikoo. Kon sag mbindu du mana nekk.',
 'cant-block-while-blocked' => 'Manoo di téye yeneen jëfandikukat ci diir bi ñu la téye.',
@@ -2058,24 +2020,14 @@ Dafay tax nga man a bind ngirte li ci boyotu tënk bi.',
 
 # Stylesheets
 'common.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci col yépp  */',
-'standard.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Standard  */',
-'nostalgia.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Nostalgia  */',
 'cologneblue.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Cologne Blue */',
 'monobook.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Monobook. */',
-'myskin.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu MySkin */',
-'chick.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Chick */',
-'simple.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Simple */',
 'modern.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Modern */',
 
 # Scripts
 'common.js' => '/* Bépp JavaScript buñ fi duggal, xët yéppa koy yeb ak jëfandikukat bumu manti doon. */',
-'standard.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Standard keppa koy yeb  */',
-'nostalgia.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Nostalgia keppa koy yeb */',
 'cologneblue.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Cologne Blue keppa koy yeb */',
 'monobook.js' => '/*Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Monobook keppa koy yeb. */',
-'myskin.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu MySkin keppa koy yeb */',
-'chick.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Chick keppa koy yeb */',
-'simple.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Simple keppa koy yeb*/',
 'modern.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Modern keppa koy yeb */',
 
 # Metadata
@@ -2136,7 +2088,7 @@ Lëkkalekaay yiy toftal, ci wenn rëdd wi, dees leen di jàppee nikiy sette, maa
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Yaatuwaay',
 'exif-imagelength' => 'Kawewaay',
 'exif-usercomment' => 'Kadduy jëfëndikookat bi',
diff --git a/languages/messages/MessagesWuu.php b/languages/messages/MessagesWuu.php
index 5827ad91..69a4b97e 100644
--- a/languages/messages/MessagesWuu.php
+++ b/languages/messages/MessagesWuu.php
@@ -49,9 +49,6 @@ $messages = array(
 'tog-shownumberswatching' => '顯示關注人數',
 'tog-oldsig' => '能界签名先望：',
 'tog-fancysig' => '畀簽名當wiki文本（弗自動鏈接）',
-'tog-externaleditor' => '默认使用外部编辑器（仅供高手使用，需要来许电脑上作出特殊设置）',
-'tog-externaldiff' => '默认使用外部分析（仅供高手使用，需要来许电脑上作出特殊设置）',
-'tog-showjumplinks' => '启用“跳转”链接',
 'tog-uselivepreview' => '用当场先望（试验）',
 'tog-forceeditsummary' => '編要空白到提醒我',
 'tog-watchlisthideown' => '關注表裏囥脫我所編',
@@ -64,6 +61,8 @@ $messages = array(
 'tog-diffonly' => '比較兩版弗樣到弗顯示頁內容',
 'tog-showhiddencats' => '顯示囥脫分類',
 'tog-norollbackdiff' => '执行退回之后弗显示两样',
+'tog-useeditwarning' => '離開編頁朆保存到提醒我',
+'tog-prefershttps' => '登录后老世用保险连接',
 
 'underline-always' => '老世',
 'underline-never' => '老世弗',
@@ -127,6 +126,18 @@ $messages = array(
 'oct' => '10月',
 'nov' => '11月',
 'dec' => '12月',
+'january-date' => '1月 $1',
+'february-date' => '2月 $1',
+'march-date' => '3月 $1',
+'april-date' => '4月 $1',
+'may-date' => '5月 $1',
+'june-date' => '6月 $1',
+'july-date' => '7月 $1',
+'august-date' => '8月 $1',
+'september-date' => '9月 $1',
+'october-date' => '10月 $1',
+'november-date' => '11月 $1',
+'december-date' => '12月 $1',
 
 # Categories related messages
 'pagecategories' => '$1个分类',
@@ -207,6 +218,7 @@ $messages = array(
 'create-this-page' => '建箇頁',
 'delete' => '刪',
 'deletethispage' => '刪箇頁',
+'undeletethispage' => '弗删箇页',
 'undelete_short' => '復原消脫個$1個編寫',
 'viewdeleted_short' => '望̺$1个删脱编写',
 'protect' => '保',
@@ -250,7 +262,7 @@ $1',
 'pool-queuefull' => '池队列满哉',
 'pool-errorunknown' => '弗识个错误',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '有关{{SITENAME}}',
 'aboutpage' => 'Project:有关',
 'copyright' => '内容侪拉$1下底发布。',
@@ -260,7 +272,6 @@ $1',
 'disclaimers' => '甮追問',
 'disclaimerpage' => 'Project:甮追問',
 'edithelp' => '编写帮助',
-'edithelppage' => 'Help:如何编辑页面',
 'helppage' => 'Help:目录',
 'mainpage' => '封面',
 'mainpage-description' => '封面',
@@ -331,12 +342,12 @@ $1',
 # General errors
 'error' => '错误',
 'databaseerror' => '数据库错误',
-'dberrortext' => '发生仔数据库查询语法错误，作兴是软件自身个错误所引起个。压末一趟数据库查询指令是：
-<blockquote><tt>$1</tt></blockquote>
-来自函数“<tt>$2</tt>”内。数据库返回错误“<tt>$3: $4</tt>”。',
-'dberrortextcl' => '发生了数据库查询语法错误。压末一趟数据库查询指令是：
-“$1”
-来自函数“$2”内。数据库返回错误“$3: $4”。',
+'databaseerror-text' => '數據庫討信出錯。
+嘸數說明軟件裏有一個bug。',
+'databaseerror-textcl' => '數據庫討信出錯。',
+'databaseerror-query' => '討信：$1',
+'databaseerror-function' => '功能ː $1',
+'databaseerror-error' => '出錯：$1',
 'laggedslavemode' => '警告: 页面可能弗包含最近个更新。',
 'readonly' => '數據庫鎖牢',
 'enterlockreason' => '请输入锁定个原因，包括预计解锁个辰光',
@@ -368,6 +379,7 @@ $1',
 'cannotdelete' => '无处删除页面或图像 "$1"。
 渠作兴已经拨别人家删除脱哉。',
 'cannotdelete-title' => '"$1"箇页删弗爻',
+'no-null-revision' => '"$1"页呒处建新个修改',
 'badtitle' => '坏标题',
 'badtitletext' => '所请求页面个标题是无效个、弗存在，跨语言或跨wiki链接个标题错误。渠作兴包含一只或多只弗好用拉标题里向字符。',
 'perfcached' => '下向是缓存数据，呒数弗是最新个。 A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
@@ -385,12 +397,15 @@ $1',
 'protectedinterface' => '箇页为箇维基个软件提供界面文本，锁牢定防乱用。
 加改全部维基个译文，用[//translatewiki.net/ translatewiki.net]，MediaWiki软件个本地化计划。',
 'editinginterface' => "'''警告：''' 侬来里编写个页面是畀软件用个界面文本。箇页变化会影响各许人个界面样子。假使要畀全部维基翻译，用 [//translatewiki.net/wiki/Main_Page?setlang=zh-hans translatewiki.net]，MediaWiki软件个本地化计划。",
-'sqlhidden' => '（SQL查询已隐藏）',
 'cascadeprotected' => '箇只页面拨保护拉许，因为箇只页面拨下底已经标注“联锁保护”个{{PLURAL:$1|一只|多只}}被保护页面包含：
 $2',
 'namespaceprotected' => "侬无没编辑'''$1'''名字空间里向页面个权限。",
 'customcssprotected' => '箇CSS页你呒处编，箇页有各许用户个私人设置。',
 'customjsprotected' => '箇JavaScript页你呒处编，箇页有各许用户个私人设置。',
+'mycustomcssprotected' => '箇CSS页你呒处编。',
+'mycustomjsprotected' => '箇JavaScript页你呒处编。',
+'myprivateinfoprotected' => '你个私人信息你呒处编。',
+'mypreferencesprotected' => '你个私人偏好你呒处编。',
 'ns-specialprotected' => '特殊页编辑是弗来三个。',
 'titleprotected' => "箇只标题已经拨[[User:$1|$1]]保护以防止创建。理由是''$2''。",
 'filereadonlyerror' => '"$1"文件呒处改，文件存勒 "$2" 是只读模式。管理员考虑畀渠锁牢个理由是："$3"。',
@@ -412,9 +427,16 @@ $2',
 'welcomecreation-msg' => '你个账号建起来哉。
 覅忘记哉走去改你个[[Special:Preferences|{{SITENAME}}个私人偏好]]。',
 'yourname' => '用户名:',
+'userlogin-yourname-ph' => '打进你侬个用户名',
+'createacct-another-username-ph' => '打进用户名',
 'yourpassword' => '密码:',
+'userlogin-yourpassword-ph' => '密码打进去',
+'createacct-yourpassword-ph' => '密码打进去',
 'yourpasswordagain' => '密码再打一遍:',
+'createacct-yourpasswordagain-ph' => '密码打一遍添',
 'remembermypassword' => '徕箇浏览器里畀我登进去个记牢（记$1{{PLURAL:$1|日|日}}）',
+'userlogin-remembermypassword' => '长期徕线里',
+'userlogin-signwithsecure' => '用保险链接',
 'yourdomainname' => '侬个域名：',
 'password-change-forbidden' => '箇wiki裏呒处改你侬个密码。',
 'externaldberror' => '迭个作兴是由于验证数据库错误或者侬拨禁止更新侬个外部账号。',
@@ -426,17 +448,42 @@ $2',
 'logout' => '登出',
 'userlogout' => '登出',
 'notloggedin' => '弗曾登录',
+'userlogin-noaccount' => '账号还呒？',
+'userlogin-joinproject' => '加进{{SITENAME}}',
 'nologin' => "你侬还呒有账号？'''$1'''。",
 'nologinlink' => '建新账号',
 'createaccount' => '建账号',
 'gotaccount' => "已经有仔帐号哉？ '''$1'''。",
 'gotaccountlink' => '登录',
 'userlogin-resetlink' => '忘记登录细节？',
+'userlogin-resetpassword-link' => '转设密码',
+'helplogin-url' => '帮助ː登进',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登进帮忙]]',
+'userlogin-loggedin' => '你侬用{{GENDER:$1|$1}}登进来哉。用下向个表以别样身份登进。',
+'userlogin-createanother' => '建别样账号',
+'createacct-join' => '下向打进你侬个信息。',
+'createacct-another-join' => '下向打进新账号个信息。',
+'createacct-emailrequired' => '电子信地址',
+'createacct-emailoptional' => '电子信地址（填弗填由你）',
+'createacct-email-ph' => '畀你侬个电子信地址打进去',
+'createacct-another-email-ph' => '电子信地址打进去',
 'createaccountmail' => '用临时随便密码发到指定个电子信地址',
+'createacct-realname' => '真名字（随意）',
 'createaccountreason' => '理由：',
+'createacct-reason' => '理由：',
+'createacct-reason-ph' => '为何物建别样账号',
+'createacct-captcha' => '保险检查',
+'createacct-imgcaptcha-ph' => '畀上向望着个字打箇里',
+'createacct-submit' => '建你侬个账号',
+'createacct-another-submit' => '建别样账号',
+'createacct-benefit-heading' => '{{SITENAME}} 是搭你侬样个人建起个。',
+'createacct-benefit-body1' => '{{PLURAL:$1|编写}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|页}}',
+'createacct-benefit-body3' => '此垡 {{PLURAL:$1|出力个人}}',
 'badretype' => '倷输入个密码搭倪个档案弗配。',
 'userexists' => '用戶名有人用哉。相勞爾揀別樣名字。',
 'loginerror' => '登录错误',
+'createacct-error' => '建账号出错',
 'createaccounterror' => '无法建立账户：$1',
 'nocookiesnew' => '侬个账户创建成功！Cookies像煞拨侬关拉许，请开开来再登录。',
 'nocookieslogin' => '本站利用Cookies进行用户登录，侬个Cookies像煞关拉许，请开开来再登录。',
@@ -486,8 +533,8 @@ $2',
 
 如果箇个账户创建错误个说话，侬可以忽略此信息。',
 'usernamehasherror' => '用户名里向弗好包含hash字符',
-'login-throttled' => '登录尝试忒多哉。
-请等脱歇再试。',
+'login-throttled' => '你侬试登忒多次哉。
+等 $1 再试试凑相。',
 'login-abort-generic' => '登录弗成功 - 流产',
 'loginlanguagelabel' => '语言：$1',
 'suspicious-userlogout' => '侬登出个要求已经拨回头脱，因为渠可能是由已损坏个浏览器或者缓存代理传送个。',
@@ -500,8 +547,8 @@ $2',
 'newpassword' => '新密码:',
 'retypenew' => '再打一遍新密码:',
 'resetpass_submit' => '设置密码再登录',
-'resetpass_success' => '密码修改成功！
-现在垃许登录...',
+'changepassword-success' => '密碼改好哉！
+能界登錄當中...',
 'resetpass_forbidden' => '密码弗好更改',
 'resetpass-no-info' => '侬必须登录仔再好直接进入箇只页面。',
 'resetpass-submit-loggedin' => '更改密码',
@@ -900,7 +947,6 @@ $1",
 'searchmenu-legend' => '搜索选项',
 'searchmenu-exists' => "'''箇wiki里有一页名字“[[:$1]]”哉'''",
 'searchmenu-new' => "'''徕箇wiki里建“[[:$1]]”页！'''",
-'searchhelp-url' => 'Help:目录',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|浏览带箇只前缀个页面]]',
 'searchprofile-articles' => '内容页',
 'searchprofile-project' => '帮助搭项目页',
@@ -942,14 +988,6 @@ $1",
 'search-external' => '外部搜索',
 'searchdisabled' => '{{SITENAME}}个搜索已禁用。侬可以暂时使用Google搜索，须注意渠拉索引个{{SITENAME}}内容作兴会过时。',
 
-# Quickbar
-'qbsettings' => '快速导航排',
-'qbsettings-none' => '呒',
-'qbsettings-fixedleft' => '左许固定',
-'qbsettings-fixedright' => '右许固定',
-'qbsettings-floatingleft' => '左许氽移',
-'qbsettings-floatingright' => '右许氽移',
-
 # Preferences page
 'preferences' => '偏好',
 'mypreferences' => '偏好设定',
@@ -977,7 +1015,6 @@ $1",
 'resetprefs' => '清除弗曾保存个更改',
 'restoreprefs' => '复原全部默认设定',
 'prefs-editing' => '编辑',
-'prefs-edit-boxsize' => '编辑框尺寸',
 'rows' => '行：',
 'columns' => '列：',
 'searchresultshead' => '搜索',
@@ -987,7 +1024,6 @@ $1",
 'recentchangesdays-max' => '最长 $1 日',
 'recentchangescount' => '默认显示个编辑数：',
 'prefs-help-recentchangescount' => '箇个包括近段辰光个改动、页面历史以及日志。',
-'prefs-help-watchlist-token' => '此栏填写个密钥可以生成侬监视列表个RSS源。任何知晓本栏密钥个人侪好阅读侬个监视列表，因此请使用安全数值。箇搭已提供一只随机生成个数值供侬挑拣：$1',
 'savedprefs' => '倷个偏好已经保存哉。',
 'timezonelegend' => '时区：',
 'localtime' => '当地辰光：',
@@ -1054,6 +1090,7 @@ $1",
 'right-reupload' => '文件以舊換新',
 'right-delete' => '刪頁面',
 'right-browsearchive' => '搜尋已刪頁',
+'right-viewmywatchlist' => '望自己個關注表',
 'right-sendemail' => '發郵件畀各許人',
 
 # Special:Log/newusers
@@ -1083,9 +1120,14 @@ $1",
 'action-userrights-interwiki' => '編用戶徠各許維基個權',
 'action-siteadmin' => '數據庫鎖牢要勿開鎖',
 'action-sendemail' => '發郵件',
+'action-editmywatchlist' => '編關注表',
+'action-viewmywatchlist' => '望關注表',
+'action-viewmyprivateinfo' => '望私人信息',
+'action-editmyprivateinfo' => '編私人信息',
 
 # Recent changes
 'nchanges' => '$1趟更改',
+'enhancedrc-history' => '歷史',
 'recentchanges' => '箇阶段个变化',
 'recentchanges-legend' => '箇阶段个变化选项',
 'recentchanges-summary' => '登该个页面浪跟踪最近对维基百科个改动。',
@@ -1200,6 +1242,8 @@ $1",
 'listfiles_user' => '用户',
 'listfiles_size' => '尺寸 （bytes）',
 'listfiles_description' => '描述',
+'listfiles-latestversion-yes' => '正是',
+'listfiles-latestversion-no' => '弗是',
 
 # File description page
 'file-anchor-link' => '文件',
@@ -1252,6 +1296,10 @@ $1",
 # Random page
 'randompage' => '随便望望',
 
+# Random page in category
+'randomincategory' => '分類裏個隨便一頁',
+'randomincategory-selectcategory-submit' => '去',
+
 # Statistics
 'statistics' => '统计',
 'statistics-header-users' => '用户资料',
@@ -1497,7 +1545,6 @@ $1",
 'blocklogtext' => '箇是用戶封搭解封操作個記錄。自動封個IP地址弗排。到[[Special:BlockList|IP 封表]]裏望目前生效個封表。',
 'unblocklogentry' => '$1已经拨解封',
 'block-log-flags-nocreate' => '建账号禁用哉',
-'proxyblocksuccess' => '好哉。',
 
 # Developer tools
 'lockdb' => '鎖數據庫',
@@ -1618,6 +1665,7 @@ $1",
 'tooltip-rollback' => '揿一记“回转”就回退到上一位贡献者个编辑状态',
 'tooltip-undo' => '“撤销”可以恢复该编辑并且垃拉预览模式下头打开编辑表单。渠允许垃拉摘要里向说明原因。',
 'tooltip-summary' => '打进短摘要',
+'tooltip-iwiki' => '̩$1 - $2',
 
 # Attribution
 'anonymous' => '{{SITENAME}}浪个匿名用户',
@@ -1676,7 +1724,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-artist' => '作者',
 
 'exif-componentsconfiguration-0' => '弗存在',
@@ -1770,14 +1818,16 @@ $5
 # Special:Version
 'version' => '版本',
 
-# Special:FilePath
-'filepath' => '文件路径',
-'filepath-page' => '文件：',
-'filepath-submit' => '路径',
-
 # Special:SpecialPages
 'specialpages' => '特殊页',
 
+# Special:Tags
+'tags-active-yes' => '好',
+'tags-active-no' => '弗',
+
+# Database error messages
+'dberr-info-hidden' => '（數據庫服務器連弗上）',
+
 # New logging system
 'revdelete-restricted' => '已将限制应用到管理员',
 'revdelete-unrestricted' => '已移除对管理员个限制',
diff --git a/languages/messages/MessagesXal.php b/languages/messages/MessagesXal.php
index f20dfd16..a0edc0c5 100644
--- a/languages/messages/MessagesXal.php
+++ b/languages/messages/MessagesXal.php
@@ -86,9 +86,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Тер халх шинҗлдг демнчнрин то үзүлх',
 'tog-oldsig' => 'Бәәдг тәвсн һарна хәләвр:',
 'tog-fancysig' => 'Эврән тәвсн һарна бики темдлһн (авто заалһта уга)',
-'tog-externaleditor' => 'Һаза чикллгч олзлх (һанцхн эрдмчнрт, тана тоолцврт шишлң көг кергтә. [//www.mediawiki.org/wiki/Manual:External_editors Дәкәд өггцн.])',
-'tog-externaldiff' => 'Һаза йилһән үзүлдг програм олзлх (һанцхн эрдмчнрт, тана тоолцврт шишлң көг кергтә [//www.mediawiki.org/wiki/Manual:External_editors Дәкәд өггцн.])',
-'tog-showjumplinks' => 'Туслмҗ заалһуд «-д/-т һарх» йовулх',
 'tog-uselivepreview' => 'Шамдһа хәләвр олзлх (JavaScript кергтә, амслһн)',
 'tog-forceeditsummary' => 'Учр-утх хоосн бәәхлә медүлх',
 'tog-watchlisthideown' => 'Шинҗллһнә сеткүлд мини сольлһиг бултулх',
@@ -279,7 +276,7 @@ $messages = array(
 
 $1',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}} тускар',
 'aboutpage' => 'Project:Тодлҗ бичлһн',
 'copyright' => 'Өггцн $1 йоста орҗ болм',
@@ -289,7 +286,6 @@ $1',
 'disclaimers' => 'Дааврас эс зөвшәрлһн',
 'disclaimerpage' => 'Project:Даарас эс зөвшәрлһн',
 'edithelp' => 'Чикллһнә дөң',
-'edithelppage' => 'Help:Чикллһн',
 'helppage' => 'Help:Һарг',
 'mainpage' => 'Нүр халх',
 'mainpage-description' => 'Нүр халх',
@@ -359,17 +355,6 @@ $1',
 # General errors
 'error' => 'Эндү',
 'databaseerror' => 'Өггцнә базин эндү',
-'dberrortext' => 'Өггцнә базд сурврин синтаксисин эндү аҗглв.
-Эн заклһна теткүлин эндү болвза.
-Шидрә өггцнә базд сурвр:
-<blockquote><tt>$1</tt></blockquote>
-<tt>«$2»</tt> функцас һарад бәәнә.
-Өггцнә баз <tt>«$3: $4»</tt> эндү хәрү өгв.',
-'dberrortextcl' => 'Өггцнә базд сурврин синтаксисин эндү аҗглв.
-Шидрә өггцнә базд сурвр:
-«$1»
-«$2» функцас һарад бәәнә.
-Өггцнә баз «$3: $4» эндү хәрү өгв.',
 'missing-article' => 'Өггцнә халһлд сурсн халхин бичг олв уга. Эн халх олх йоста: "$1" нертә $2.
 
 Тер йовдл һарһсн халхна тууҗин өңгрсн заалһиг дахлһна арһ болад бәәнә.
@@ -387,7 +372,6 @@ $1',
 'badtitletext' => 'Сурсн нерн буру, хоосн, аль му бичсн келн хоорнд нертә. Тиим чигн биз, нерн зөв уга үзгтә.',
 'viewsource' => 'Ишиг хәләх',
 'actionthrottled' => 'Хурдна заг',
-'sqlhidden' => '(SQL сурвр бултулсн)',
 'ns-specialprotected' => 'Шишлң халх чиклсн бәәх болшго.',
 
 # Virus scanner
@@ -449,7 +433,7 @@ $1',
 'oldpassword' => 'Көгшн нууц үг:',
 'newpassword' => 'Шин нууц үг:',
 'retypenew' => 'Шин нууц үгиг дәкәд бичтн:',
-'resetpass_success' => 'Тана нууц үгиг йовудта сольв! Та ода орнат...',
+'changepassword-success' => 'Тана нууц үгиг йовудта сольв! Та ода орнат...',
 'resetpass-submit-loggedin' => 'Нууц үгиг сольх',
 'resetpass-submit-cancel' => 'Уга кех',
 
@@ -604,9 +588,6 @@ $1',
 'powersearch-field' => 'Хәәх',
 'powersearch-togglenone' => 'Уга',
 
-# Quickbar
-'qbsettings' => 'Ормин самбр',
-
 # Preferences page
 'preferences' => 'Дурллһн',
 'mypreferences' => 'Көгүд',
@@ -750,7 +731,6 @@ $1',
 'recentchangeslinked-feed' => 'Садта чикллһн',
 'recentchangeslinked-toolbox' => 'Садта чикллһн',
 'recentchangeslinked-title' => '$1 садта сольлһн',
-'recentchangeslinked-noresult' => 'Садта халх заасн цагт сольсн уга',
 'recentchangeslinked-summary' => "Эн тер халх заалдг халхсин (аль тер янзин халхсин) шидрә сольлһн.
 Тана [[Special:Watchlist|шинҗллһнә сеткүлин]] халхс '''тарһн''' бичәтә.",
 'recentchangeslinked-page' => 'Халхна нернь:',
@@ -1010,7 +990,6 @@ $2 шидрә һарһлһна төлә хәләтн.',
 'blocklogentry' => '[[$1]] бүслсн $2 күртл, $3 учрта',
 'unblocklogentry' => '$1-г бүслсн биш болулв',
 'block-log-flags-nocreate' => 'бичгдлһиг бүтәҗ болшго',
-'blockme' => 'Намаг бүслчк',
 
 # Move page
 'movepagetext' => "Та дораһар цаасар, халхин сольлһна тууҗ көндәд, терүнә нериг сольх.
@@ -1156,7 +1135,7 @@ $2 шидрә һарһлһна төлә хәләтн.',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Өргн',
 'exif-imagelength' => 'Өндр',
 'exif-bitspersample' => 'Өңгин гүн',
@@ -1234,11 +1213,6 @@ $2 шидрә һарһлһна төлә хәләтн.',
 'version-software-product' => 'Һарц',
 'version-software-version' => 'Һарц',
 
-# Special:FilePath
-'filepath' => 'Боомгд хаалһ',
-'filepath-page' => 'Боомг:',
-'filepath-submit' => 'Орх',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Боомгин нерн:',
 'fileduplicatesearch-submit' => 'Хәәх',
diff --git a/languages/messages/MessagesXh.php b/languages/messages/MessagesXh.php
index 08473de8..0fb07c33 100644
--- a/languages/messages/MessagesXh.php
+++ b/languages/messages/MessagesXh.php
@@ -86,6 +86,9 @@ $messages = array(
 'viewsource' => 'Jonga i Source',
 
 # Login and logout pages
+'welcomecreation' => '== Wamkelekile, $1! ==
+
+I Account yakhgo ivuliwe, ungalibali ukutshitsha izinto ozithandayo ngo {{SITENAME}}.',
 'yourname' => 'Igama lelungu:',
 'yourpassword' => 'Igama elifihlakeleyo lelungu:',
 'yourpasswordagain' => 'Faka kwakhona igama elifihlakeleyo:',
diff --git a/languages/messages/MessagesXmf.php b/languages/messages/MessagesXmf.php
index 4f21adc8..d3e036ae 100644
--- a/languages/messages/MessagesXmf.php
+++ b/languages/messages/MessagesXmf.php
@@ -180,7 +180,7 @@ $messages = array(
 'jumptonavigation' => 'ნავიგაცია',
 'jumptosearch' => 'გორუა',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '{{SITENAME}}-შენი',
 'aboutpage' => 'Project:შენი',
 'copyright' => 'დინორე მიწორინაფილი რე $1–იშ ჯოხოთ.',
@@ -190,7 +190,6 @@ $messages = array(
 'disclaimers' => 'გამამინჯალაშ ვარება',
 'disclaimerpage' => 'Project:გამამინჯალაშ ვარება',
 'edithelp' => 'მოხვარა რედაქტირაფას',
-'edithelppage' => 'Help:ტექსტიშ რედაქტირაფა',
 'helppage' => 'Help:დინორე',
 'mainpage' => 'დუდხასჷლა',
 'mainpage-description' => 'დუდხასჷლა',
@@ -411,7 +410,6 @@ $messages = array(
 'viewprevnext' => 'ქოძირ  ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => 'თე ვიკის "[[:$1]]" ჯოხოთ ხასჷლა რე',
 'searchmenu-new' => "''ქჷდარსხი \"[[:\$1]]\" ხასჷლა თე ვიკის'''",
-'searchhelp-url' => 'Help:მოხვარა',
 'searchprofile-articles' => 'სტატიეფი',
 'searchprofile-project' => 'მოხვარაშ დო პროექტიშ ხასჷლეფი',
 'searchprofile-images' => 'მულტიმედია',
@@ -502,7 +500,6 @@ $messages = array(
 'recentchangeslinked-feed' => 'აკოხვალამირ თირაფეფ',
 'recentchangeslinked-toolbox' => 'აკოხვალამირ თირაფეფ',
 'recentchangeslinked-title' => '"$1"-შა მებუნაფილ თირაფეფი',
-'recentchangeslinked-noresult' => 'წურაფილ პერიოდს თირაფეფ აკოხვალამირ ხასილეფს ვა ჸოფერენ.',
 'recentchangeslinked-summary' => "თენა რე მეწურაფილი ხასილაწკუმა (ვარა მეწურაფილი კატეგორიაშ მაკათურეფწკუმა) გინორცხუაფილი ხასილეფს ეკონია ბორჯის ღოლამირი თირაფეფიშ ერკებულ. ხასილეფი [[Special:Watchlist|your watchlist]] გიმორთილი რე '''ფსქელას'''.\"",
 'recentchangeslinked-page' => 'ხასილაშ ჯოხო:',
 'recentchangeslinked-to' => 'მანგიერო ქაძირე ათე ხასილაშა მერცხილ ხასილეფშა მიშაღალირ თირაფეფ',
@@ -550,8 +547,6 @@ $messages = array(
 # Statistics
 'statistics' => 'სტატისტიკა',
 
-'disambiguationspage' => 'Template:ანდობურმნიშვნელიანი',
-
 'withoutinterwiki' => 'ხასილეფ ნინაშ რსხილეფიშ გარეშე',
 
 # Miscellaneous special pages
@@ -882,7 +877,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'სიგანე',
 'exif-imagelength' => 'სიმაღალე',
 
diff --git a/languages/messages/MessagesYi.php b/languages/messages/MessagesYi.php
index 1e626929..22c9ed3b 100644
--- a/languages/messages/MessagesYi.php
+++ b/languages/messages/MessagesYi.php
@@ -46,6 +46,10 @@ $namespaceAliases = array(
 	'באזונדער' => NS_SPECIAL,
 	'באנוצער' => NS_USER,
 	'באנוצער_רעדן' => NS_USER_TALK,
+	'משתמש' => NS_USER,
+	'שיחת_משתמש' => NS_USER_TALK,
+	'משתמשת' => NS_USER,
+	'שיחת_משתמשת' => NS_USER_TALK,
 	'בילד' => NS_FILE,
 	'בילד_רעדן' => NS_FILE_TALK,
 	'מעדיעוויקי' => NS_MEDIAWIKI,
@@ -55,6 +59,10 @@ $namespaceAliases = array(
 	'באניצער' => NS_USER,
 	'באניצער_רעדן' => NS_USER_TALK,
 );
+$namespaceGenderAliases = array(
+	NS_USER      => array( 'male' => 'באַניצער', 'female' => 'באַניצערין' ),
+	NS_USER_TALK => array( 'male' => 'באַניצער_רעדן', 'female' => 'באַניצערין_רעדן' ),
+);
 
 $specialPageAliases = array(
 	'Activeusers'               => array( 'טעטיגע_באניצער' ),
@@ -92,6 +100,7 @@ $specialPageAliases = array(
 	'MIMEsearch'                => array( 'זוכן_MIME' ),
 	'Mostcategories'            => array( 'מערסטע_קאטעגאריעס' ),
 	'Mostimages'                => array( 'מערסטע_פארבונדענע_בילדער' ),
+	'Mostinterwikis'            => array( 'מערסטע_פארבונדענע_אינטערוויקיס' ),
 	'Mostlinked'                => array( 'מערסטע_פארבונדענע_בלעטער' ),
 	'Mostlinkedcategories'      => array( 'מערסטע_פארבונדענע_קאטעגאריעס' ),
 	'Mostlinkedtemplates'       => array( 'מערסטע_פארבונדענע_מוסטערן' ),
@@ -216,11 +225,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ווייזן דעם נומער פון בלאט אויפֿפאסערס',
 'tog-oldsig' => 'איצטיגער אונטערשריפֿט:',
 'tog-fancysig' => 'באַהאַנדלן  אונטערשריפט אַלס וויקיטעקסט (אָן אויטאמאטישן לינק)',
-'tog-externaleditor' => 'ניצן א דרויסנדיגן רעדאקטירער גרונטלעך (נאר פֿאר מומחים, דאס פֿאדערט באזונדערע קאמפיוטער שטעלונגען).
-[//www.mediawiki.org/wiki/Manual:External_editors ווײַטערע אינפֿארמאַציע.]',
-'tog-externaldiff' => 'ניצן א דרויסנדיגן פֿאַרגלײַכער גרונטלעך (נאר פֿאר מומחים, דאס פֿאדערט באזונדערע קאמפיוטער שטעלונגען)
-[//www.mediawiki.org/wiki/Manual:External_editors ווײַטערע אינפֿארמאַציע.]',
-'tog-showjumplinks' => 'באמעגלעך צוטריט לינקס פון "שפרינג צו"',
 'tog-uselivepreview' => 'באניצן זיך מיט גיכער פאראויסדיגער ווייזונג (עקספערימענטאל)',
 'tog-forceeditsummary' => 'ווארן מיך ווען איך לייג א ליידיג קורץ ווארט ענדערונג',
 'tog-watchlisthideown' => 'באהאלט מיינע ענדערונגען פון דער אויפפאסן ליסטע',
@@ -233,6 +237,8 @@ $messages = array(
 'tog-diffonly' => 'ווייז נישט אינהאלט אונטער די דיפערענץ',
 'tog-showhiddencats' => 'ווײַז באהאלטענע קאטעגאריעס',
 'tog-norollbackdiff' => 'היפט איבער ווײַזן אונטערשייד נאכן אויספֿירן א צוריקדריי',
+'tog-useeditwarning' => 'שטעלן א ווארענונג ווען איך לאז איבער א רעדאקטירונג בלאט מיט נישט אויפגעהיטענע ענדערונגען',
+'tog-prefershttps' => 'ניצט שטענדיק א זיכערע פארבינדונג ווען ארײַנגלאגירט',
 
 'underline-always' => 'אייביג',
 'underline-never' => 'קיינמאל',
@@ -296,6 +302,18 @@ $messages = array(
 'oct' => 'אָקט׳',
 'nov' => 'נאָוו׳',
 'dec' => 'דעצ׳',
+'january-date' => '$1 יאנואר',
+'february-date' => '$1 פעברואר',
+'march-date' => '$1 מערץ',
+'april-date' => '$1 אפריל',
+'may-date' => '$1 מיי',
+'june-date' => '$1 יוני',
+'july-date' => '$1 יולי',
+'august-date' => '$1 אויגוסט',
+'september-date' => '$1 סעפטעמבער',
+'october-date' => '$1 אקטאבער',
+'november-date' => '$1 נאוועמבער',
+'december-date' => '$1 דעצעמבער',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|קאַטעגאָריע|קאַטעגאָריעס}}',
@@ -378,6 +396,7 @@ $messages = array(
 'create-this-page' => 'שאַפֿן דעם בלאַט',
 'delete' => 'אויסמעקן',
 'deletethispage' => 'אויסמעקן דעם בלאַט',
+'undeletethispage' => 'צוריקשטעלן דעם בלאט',
 'undelete_short' => 'צוריקשטעלן {{PLURAL:$1|איין רעדאַקטירונג|$1 רעדאַקטירונגען}}',
 'viewdeleted_short' => 'באַקוקן {{PLURAL:$1|איין געמעקטע ענדערונג|$1 געמעקטע ענדערונגען}}',
 'protect' => 'באשיצן',
@@ -421,7 +440,7 @@ $1',
 'pool-queuefull' => 'ריי איז פֿול',
 'pool-errorunknown' => 'אומבאַקאַנטער פֿעלער',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'וועגן {{SITENAME}}',
 'aboutpage' => 'Project:וועגן',
 'copyright' => 'דער אינהאַלט איז פֿאַראַן אונטער $1 ווען נישט באוויזן אנדערש.',
@@ -431,7 +450,6 @@ $1',
 'disclaimers' => 'געזעצליכע אויפֿקלערונג',
 'disclaimerpage' => 'Project:קלארשטעלונג',
 'edithelp' => 'הילף וויאזוי צו ענדערן',
-'edithelppage' => 'Help:ענדערן',
 'helppage' => 'Help:אינהאַלט',
 'mainpage' => 'הויפט זייט',
 'mainpage-description' => 'הויפט זייט',
@@ -512,17 +530,12 @@ $1',
 # General errors
 'error' => 'פעלער',
 'databaseerror' => 'דאטנבאזע פעלער',
-'dberrortext' => 'א דאטנבאזע זוכונג סינטאקס גרייז האט פאסירט.
-דאס קען זיין צוליב א באג אינעם ווייכווארג.
-די לעצטע דאטנבאזע זוכונג איז געווען:
-<blockquote><code>$1</code></blockquote>
-פון דער פונקציע "<code>$2</code>".
-דאטנבאזע האט צוריקגעגעבן גרייז "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'א דאטנבאזע זוכונג סינטאקס גרייז האט פאסירט.
-די לעצטע דאטנבאזע זוכונג איז געווען:
-"$1"
-פון דער פונקציע "$2".
-דאטנבאזע האט צוריקגעגעבן גרייז "$3: $4".',
+'databaseerror-text' => "ס'האט פאסירט א דאטנבאזע פֿראגע פֿעלער.
+קען אפשר זיין א באַג אינעם ווייכווארג.",
+'databaseerror-textcl' => "ס'האט פאסירט א דאטנבאזע פֿראגע פֿעלער.",
+'databaseerror-query' => 'פֿראגע: $1',
+'databaseerror-function' => 'פֿונקציע: $1',
+'databaseerror-error' => 'פֿעלער: $1',
 'laggedslavemode' => 'ווארענונג: בלאט טוט מעגליך נישט אנטהאלטן לעצטיגע דערהײַנטיגונגען.',
 'readonly' => 'דאַטנבאַזע פאַרשפאַרט',
 'enterlockreason' => 'שטעלט א סיבה פארן אפשפאר, אריינגערעכנט א געשאצטער צייט אויף ווען דאס וועט זיך צוריקעפענען די פארשפארונג.',
@@ -556,6 +569,7 @@ $1',
 'cannotdelete-title' => 'מען קען נישט אויסמעקן בלאט "$1"',
 'delete-hook-aborted' => 'אויסמעקונג אנולירט דורך hook.
 נישט געגעבן קיין דערקלערונג.',
+'no-null-revision' => 'נישט מעגלעך צו שאפן א נול־ווערסיע פונעם בלאט "$1".',
 'badtitle' => 'שלעכט קעפל',
 'badtitletext' => "דאס קעפל פון דעם געזוכטן בלאט איז געווען אומגעזעצליך, ליידיג, אן אינטערשפראך אדער אינטערוויקי לינק וואס פאסט נישט, אדער אנטהאט כאראקטערס וואס מ'קען נישט ניצן אין א קעפל.",
 'perfcached' => "די פאלגנדע דאטן זענען גענומען פונעם 'זאַפאַס' און מעגלעך נישט אקטועל. מאקסימום {{PLURAL:$1|איין רעזולטאט איז|$1 רעזולטאטן זענען}} פאראן אין זאפאס.",
@@ -576,13 +590,16 @@ $1',
 כדי צולייגן אדער ענדערן איבערזעצונגען פאר אלע וויקיס, זייט אזוי גוט ניצן [//translatewiki.net/ translatewiki.net], דער מעדיעוויקי לאקאליזאציע פראיעקט.',
 'editinginterface' => "'''ווארענונג:''' איר באַאַרבעט א בלאט וואס איז געניצט צוצושטעלן אינטערפֿייס טעקסט פאר דער ווייכווארג. ענדערונגען אין דעם בלאַט וועלן טוישן דאס אויסזען פון די סיסטעם מודעות פאר אלע אנדערע באניצער אויף דער וויקי.
 כדי צולייגן אדער ענדערן איבערזעצונגען, באַטראַכטס באַניצן [//translatewiki.net/ translatewiki.net], דער מעדיעוויקי לאקאַליזאציע פראיעקט.",
-'sqlhidden' => '(SQL פארלאנג באהאלטן)',
 'cascadeprotected' => 'דער בלאט איז פארשפארט צום ענדערן וויבאלד ער איז איינגעשלאסן אין איינע פון די פאלגנדע {{PLURAL:$1|בלאט, וואס איז|בלעטער, וואס זענען}} באשיצט מיט דער קאסקייד אפציע:
 
 $2',
 'namespaceprotected' => "איר זענט נישט ערלויבט צו רעדאקטירן בלעטער אינעם '''$1''' נאמענטייל.",
 'customcssprotected' => 'איר האט נישט רשות צו רעדאַקטירן דעם CSS בלאַט, ווײַל ער אַנטהאַלט די פערזענלעכע באַשטימונגען פון אַן אַנדער באַניצער.',
 'customjsprotected' => 'איר האט נישט רשות צו רעדאַקטירן דעם JavaScript בלאַט, ווײַל ער אַנטהאַלט די פערזענלעכע באַשטימונגען פון אַן אַנדער באַניצער.',
+'mycustomcssprotected' => 'איר זענט נישט ערלויבט צו רעדאקטירן דעם CSS בלאט.',
+'mycustomjsprotected' => 'איר זענט נישט ערלויבט צו רעדאקטירן דעם JavaScript בלאט.',
+'myprivateinfoprotected' => 'איר האט נישט קיין דערלויבניש צו רעדאקטירן אייער פריוואטע אינפארמאציע.',
+'mypreferencesprotected' => 'איר האט נישט קיין דערלויבניש צו רעדאקטירן אייערע פרעפערענצן.',
 'ns-specialprotected' => 'מען קען נישט רעדאגירן ספעציעלע בלעטער.',
 'titleprotected' => 'דער טיטל איז געשיצט פון ווערן געשאפֿן דורך  [[User:$1|$1]].
 די אורזאך איז  \'\'$2".',
@@ -606,10 +623,19 @@ $2',
 'welcomecreation-msg' => "מ'האט געשאפן אייער קאנטע.
 פארגעסט נישט צו ענדערן אייערע [[Special:Preferences|{{SITENAME}} פרעפערענצן]].",
 'yourname' => 'באַניצער נאָמען:',
+'userlogin-yourname' => 'באַניצער נאָמען',
+'userlogin-yourname-ph' => 'גיט אריין אייער באניצער נאמען',
+'createacct-another-username-ph' => 'אריינגעבן באניצער נאמען',
 'yourpassword' => 'פאסווארט',
+'userlogin-yourpassword' => 'פאַסווארט',
+'userlogin-yourpassword-ph' => 'אַרײַנגעבן אײַער פאַסווארט',
+'createacct-yourpassword-ph' => 'אַרײַנגעבן א פאַסווארט',
 'yourpasswordagain' => 'ווידער אריינקלאפן פאסווארט',
+'createacct-yourpasswordagain' => 'באשטעטיקן פאסווארט',
+'createacct-yourpasswordagain-ph' => 'ארײַנגעבן פאסווארט נאכאמאל',
 'remembermypassword' => 'געדיינק מײַן אַרײַנלאגירן אויף דעם קאמפיוטער (ביז  $1 {{PLURAL:$1|טאָג|טעג}})',
-'securelogin-stick-https' => 'בלייַבן פארבונדן צו HTTPS נאָכן ארײַנלאָגירן',
+'userlogin-remembermypassword' => 'לאז מיך בלײַבן ארײַנלאגירט',
+'userlogin-signwithsecure' => 'ניצן זיכערן סארווער',
 'yourdomainname' => 'אײַער געביט:',
 'password-change-forbidden' => 'איר קען נישט ענדערן פאסווערטער אויף דער וויקי.',
 'externaldberror' => 'עס איז אדער פארגעקומען אן אויטענטיקאציע דאטנבאזע פעלער אדער איר זענט נישט ערמעגליכט צו דערהיינטיגן אייער דרויסנדיגע קאנטע.',
@@ -621,18 +647,44 @@ $2',
 'logout' => 'אַרױסלאָגירן',
 'userlogout' => 'אַרױסלאָגירן',
 'notloggedin' => 'נישט איינגעשריבן',
+'userlogin-noaccount' => 'איר האט נישט קיין קאנטע?',
+'userlogin-joinproject' => 'איינטרעטן ביי {{SITENAME}}',
 'nologin' => "איר האט נישט קיין קאנטע? '''$1'''.",
 'nologinlink' => 'שאַפֿן אַ קאנטע',
 'createaccount' => 'שאַפֿן אַ נײַע קאנטע',
 'gotaccount' => "האסטו שוין א קאנטע? '''$1'''.",
 'gotaccountlink' => 'אַרײַנלאגירן',
 'userlogin-resetlink' => 'פארגעסן אײַערע אַרײַנלאָגירן פרטים?',
+'userlogin-resetpassword-link' => 'צוריקשטעלן אײַער פאַסווארט',
+'helplogin-url' => 'Help:אריינלאגירן',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|הילף מיט אריינלאגירן]]',
+'userlogin-loggedin' => 'איר זענט שוין אריינלאגירט ווי {{GENDER:$1|$1}}.
+ניצט די פארעם אונטן כדי אריינלאגירן ווי אן אנדער באניצער.',
+'userlogin-createanother' => 'שאפֿן נאך א קאנטע',
+'createacct-join' => 'גיט ארײַן אײַער אינפֿארמאציע אונטן.',
+'createacct-another-join' => 'ארײַנגעבן דער נײַער קאנטעס אינפארמאציע אונטן.',
+'createacct-emailrequired' => 'בליצפּאָסט אַדרעס',
+'createacct-emailoptional' => 'בליצפאסט אדרעס (אפציאנאל)',
+'createacct-email-ph' => 'קלאַפט ארײַן אײַער בליצפּאָסט אַדרעס',
+'createacct-another-email-ph' => 'אַרײַנגעבן בליצפּאָסט אַדרעס',
 'createaccountmail' => 'ניצן א פראוויזאריש פאסווארט און שיקן צום געצייכנטן ע-פאסט אדרעס',
+'createacct-realname' => 'עכטער נאמען (אפציאנאל)',
 'createaccountreason' => 'אורזאַך:',
+'createacct-reason' => 'אורזאך',
+'createacct-reason-ph' => 'פֿארוואס שאפֿט איר נאך א קאנטע',
+'createacct-captcha' => 'פארזיכערן קאנטראל',
+'createacct-imgcaptcha-ph' => 'קלאפט ארײַן דעם טעקסט איר זעט אויבן',
+'createacct-submit' => 'שאפֿט אײַער קאנטע',
+'createacct-another-submit' => 'שאפן נאך א קאנטע',
+'createacct-benefit-heading' => '{{SITENAME}} איז געמאכט דורך מענטשן ווי איר.',
+'createacct-benefit-body1' => '{{PLURAL:$1|רעדאַקטירונג|$1 רעדאַקטירונגען}}',
+'createacct-benefit-body2' => '$1 {{PLURAL:$1|בלאַט|בלעטער}}',
+'createacct-benefit-body3' => 'לעצטיקע {{PLURAL:$1|בײַשטײַערער}}',
 'badretype' => 'די פאסווערטער וואס איר האט אריינגעלייגט זענען נישט אייניג.',
 'userexists' => 'דער באַניצער נאָמען איז שוין געניצט.
 ביטע קלײַבט אױס אַן אַנדער נאָמען.',
 'loginerror' => 'לאגירן פֿעלער',
+'createacct-error' => 'קאנטע שאפן פעלער',
 'createaccounterror' => 'האט נישט געקענט שאַפֿן קאנטע: $1',
 'nocookiesnew' => 'די באניצער קאנטע איז באשאפן, אבער איר זענט נישט אריינלאגירט.
 {{SITENAME}} ניצט קיכלעך אריינצולאגירן באניצער.
@@ -697,10 +749,12 @@ $2',
 איר קענט איגנארירן די מעלדונג, ווען די קאנטע איז באשאפֿן בטעות.',
 'usernamehasherror' => 'באַניצער נאמען טאָר נישט אַנטהאַלטן קיין לייטער סימבאל',
 'login-throttled' => 'איר האט געפרוווט צופֿיל מאל אריינלאגירן.
-זייט אזוי גוט און וואַרט איידער איר פרוווט נאכאמאל.',
+זייט אזוי גוט און וואַרט $1 איידער איר פרוווט נאכאמאל.',
 'login-abort-generic' => 'אײַער ארײַנלאגירונג איז נישט געווען דערפֿאלגרייך—אָפגעשטעלט',
 'loginlanguagelabel' => 'שפראך: $1',
 'suspicious-userlogout' => ' אײַער בקשה אַרויסלאָגירן זיך איז אפגעלייגט געווארן ווייַל אייגנטלעך איז זי געשיקט דורך אַ צעבראכענעם בלעטערער אָדער א פראקסי מיט א זאפאס.',
+'createacct-another-realname-tip' => 'עכטער נאמען איז אפציאנאל.
+אויב איר וויילט אויס צוצושטעלן אים, וועט דאס גענוצט ווערן צו געבן אטריבוציע פאר זייער ארבעט.',
 
 # Email sending
 'php-mail-error-unknown' => 'אומבאַקאַנט טעות אין()mail פֿונקציע פֿון PHP.',
@@ -716,7 +770,7 @@ $2',
 'newpassword' => 'ניי פּאסוואָרט:',
 'retypenew' => 'ווידער שרײַבן פאַסווארט:',
 'resetpass_submit' => 'שטעלן פאסווארט און אריינלאגירן',
-'resetpass_success' => 'אייער פאַסווארט איז געטוישט געווארן מיט דערפֿאלג! איצט טוט מען אייך אריינלאגירן…',
+'changepassword-success' => 'אייער פאַסווארט איז געטוישט געווארן מיט דערפֿאלג!',
 'resetpass_forbidden' => 'פאסווערטער קענען נישט ווערן געטוישט',
 'resetpass-no-info' => 'איר דארפֿט זיין אריינלאגירט צוצוקומען גלייך צו דעם דאזיגן בלאט.',
 'resetpass-submit-loggedin' => 'טוישן פאסווארט',
@@ -728,10 +782,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'צוריקשטעלן פאַסווארט',
-'passwordreset-text' => 'דערגאַנצט די פאָרעם צוריקצושטעלן אײַער פאַסווארט.',
+'passwordreset-text-one' => 'דערגאַנצט די פאָרעם צוריקצושטעלן אײַער פאַסווארט.',
+'passwordreset-text-many' => '{{PLURAL:$1|דערגאַנצט איינע פֿון די פֿעלדער צוריקצושטעלן אײַער פאַסווארט.}}',
 'passwordreset-legend' => 'צוריקשטעלן פאַסווארט',
 'passwordreset-disabled' => 'מען האט אומאַקטיוויטר צוריקשטעלן פאַסווערטער אויף דער וויקי.',
-'passwordreset-pretext' => '{{PLURAL:$1| | קלאַפט אַרײַן איינע פֿון די דאַטן אונטן}}',
+'passwordreset-emaildisabled' => 'ע-פאסט דינסטן זענען געווארן אומאקטיווירט אויף דער דאזיקער וויקי.',
 'passwordreset-username' => 'באַניצער נאָמען:',
 'passwordreset-domain' => 'דאמען:',
 'passwordreset-capture' => 'זען  דעם געשיקטן ע־בריוו?',
@@ -760,7 +815,7 @@ $2
 פראוויזארישער פּאַראָל: $2',
 'passwordreset-emailsent' => "מ'האט געשיקט א פאסווארט צוריקשטעלן ע-פּאָסט.",
 'passwordreset-emailsent-capture' => 'מען האט געשיקט א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן.',
-'passwordreset-emailerror-capture' => 'מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום באניצער איז דורכגעפאלן: $1',
+'passwordreset-emailerror-capture' => 'מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום {{GENDER:$2|באניצער}}איז דורכגעפאלן: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ענדערן ע-פּאָסט אַדרעס',
@@ -774,6 +829,16 @@ $2
 'changeemail-submit' => 'ענדערן ע־פאסט אדרעס',
 'changeemail-cancel' => 'אַנולירן',
 
+# Special:ResetTokens
+'resettokens' => 'צוריקזעצן טאקנס',
+'resettokens-no-tokens' => 'נישט פאראן קיין טאקנס צוריקצוזעצן.',
+'resettokens-legend' => 'צוריקזעצן טאקנס',
+'resettokens-tokens' => 'טאקנס:',
+'resettokens-token-label' => '$1 (אקטועלער ווערט: $2)',
+'resettokens-watchlist-token' => 'טאקן פארן וועב־פֿיד (Atom/RSS) פון [[Special:Watchlist|ענדערונגען צו בלעטער אויף אייער אויפֿפאסונג ליסטע]]',
+'resettokens-done' => 'טאקנס צוריקגעזעצט.',
+'resettokens-resetbutton' => 'צוריקזעצן אויסגעקליבענע טאקנס',
+
 # Edit page toolbar
 'bold_sample' => 'דיקער טעקסט',
 'bold_tip' => 'דיקער טעקסט',
@@ -975,12 +1040,15 @@ $2
 ס'ווייזט אויס אז ער איז אויסגעמעקט.",
 'edit-conflict' => 'רעדאקטירן קאנפֿליקט.',
 'edit-no-change' => "מ'האט איגנארירט אײַער רעדאַקטירונג, ווײַל קיין שום ענדערונג איז נישט געמאַכט צום טעקסט.",
+'postedit-confirmation' => 'אייער רעדאקטירונג איז געווארן אויפגעהיטן.',
 'edit-already-exists' => 'נישט מעגליך צו שאַפֿן נייעם בלאט.
 ער עקזיסטירט שוין.',
 'defaultmessagetext' => 'גרונטלעכער מעלדונג טעקסט',
 'content-failed-to-parse' => 'פארזן $2 אינהאלט פאר $1 מאדעל דורכגעפאלן: $3',
 'invalid-content-data' => 'אומגילטיקע אינהאלט דאטן',
 'content-not-allowed-here' => '"$1" אינהאלט נישט דערלויבט אויף בלאט [[$2]]',
+'editwarning-warning' => 'איבערלאזן דעם בלאט קען גורם זײַן פֿארלירן אײַערע ענדערונגען.
+אויב איר זענט ארײַנלאגירט, קענט איר מבטל זײַן די דאזיגע ווארענונג אין דער "באארבעטן" אפטיילונג פון אײַערע פרעפערענצן.',
 
 # Content models
 'content-model-wikitext' => 'וויקיטעקסט',
@@ -1013,6 +1081,7 @@ $2
 'undo-failure' => 'די ענדערונג קען נישט מבוטל ווערן צוליב סתירות מיט צווישנצייטלעכע ענדערונגען.',
 'undo-norev' => "ס'איז נישט מעגלעך צוריקקערן די רעדאַקטירונג ווײַל זי עקסיסטירט נישט אדער איז אויסגעמעקט.",
 'undo-summary' => 'זיי מבטל רי-ווערסיע $1 פון [[Special:Contributions/$2|$2]] ([[User talk:$2|רעדן]])',
+'undo-summary-username-hidden' => 'זײַט מבטל ווערסיע $1 פון א באהאלטענעם באניצער',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'מען קען נישט באשאפֿן קאנטע',
@@ -1194,6 +1263,7 @@ $1",
 'compareselectedversions' => 'פארגלייך סעלעקטירטע ווערסיעס',
 'showhideselectedversions' => 'ווײַזן/באַהאַלטן געקליבענע רעוויזיעס',
 'editundo' => 'אַנולירן',
+'diff-empty' => '(קיין אונטערשייד)',
 'diff-multi' => '({{PLURAL:$1|איין מיטלסטע ווערסיע |$1 מיטלסטע ווערסיעס}} פֿון {{PLURAL:$2|איין באַניצער|$2 באַניצער}} נישט געוויזן.)',
 'diff-multi-manyusers' => '({{PLURAL:$1|איין מיטלסטע ווערסיע |$1 מיטלסטע ווערסיעס}} פֿון מער ווי {{PLURAL:$2|איין באַניצער|$2 באַניצער}} נישט געוויזן.)',
 'difference-missing-revision' => '{{PLURAL:$2|איין ווערסיע|$2 ווערסיעס}} פון דעם דיפערענץ ($1) {{PLURAL:$2|האט}} מען נישט געטראפן.
@@ -1221,7 +1291,6 @@ $1",
 'searchmenu-legend' => 'זוכן ברירות',
 'searchmenu-exists' => "'''ס'איז פֿאַראַן א בלאַט מיטן נאמען \"[[:\$1]]\" אין דער וויקי'''",
 'searchmenu-new' => "'''באַשאַפֿן דעם בלאַט \"[[:\$1]]\" אויף דער וויקי'''",
-'searchhelp-url' => 'Help:אינהאַלט',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|בלעטערן בלעטער מיט דעם פרעפֿיקס]]',
 'searchprofile-articles' => 'אינהאלט בלעטער',
 'searchprofile-project' => 'הילף און פראיעקט בלעטער',
@@ -1265,15 +1334,7 @@ $1",
 'searchdisabled' => "{{SITENAME}} זוך איז אָפאַקטיווירט.
 צווישנצײַט קענט איר זוכן מיט גוגל.
 געב אכט אז ס'איז מעגלעך אַז זייער אינדעקס פֿון {{SITENAME}} אינהאַלט איז אפשר פֿאַרעלטערט.",
-
-# Quickbar
-'qbsettings' => 'גיכפאַס',
-'qbsettings-none' => 'גארנישט',
-'qbsettings-fixedleft' => 'קבוע לינקס',
-'qbsettings-fixedright' => 'קבוע רעכטס',
-'qbsettings-floatingleft' => 'שווימנדיג לינקס',
-'qbsettings-floatingright' => 'שווימנדיג רעכטס',
-'qbsettings-directionality' => 'פֿעסט, אפהענגיק אויף דער שריפֿט ריכטונג פֿון אײַער שפראַך.',
+'search-error' => "ס'האט פאסירט א פֿעלער ביים זוכן: $1",
 
 # Preferences page
 'preferences' => 'פרעפֿערענצן',
@@ -1307,7 +1368,6 @@ $1",
 'resetprefs' => 'אוועקנעמען נישט-אויפגעהיטענע ענדערונגען',
 'restoreprefs' => 'צוריקשטעלן אלע גרונטלעכע שטעלונגען (אין אלע אפטיילן)',
 'prefs-editing' => 'באַאַרבעטן',
-'prefs-edit-boxsize' => 'גרויס פונעם רעדאקטירונג פענסטער.',
 'rows' => 'שורות:',
 'columns' => 'עמודים:',
 'searchresultshead' => 'זוכן',
@@ -1318,6 +1378,9 @@ $1",
 'recentchangesdays-max' => 'מאַקסימום $1 {{PLURAL:$1|טאָג|טעג}}',
 'recentchangescount' => 'די צאָל רעדאַקטירונגען צו ווײַזן גרונטלעך:',
 'prefs-help-recentchangescount' => 'כולל לעצטע ענדערונגען, בלאַט היסטאָריעס, און לאָגביכער.',
+'prefs-help-watchlist-token2' => 'דאס איז דער געהיימער שליסל צום וועבפֿיד פון אײַער אויפֿפאסונג ליסטע.
+יעדער וואס ווייסט אים וועט קענען לייענען אײַער אויפֿפאסונג ליסטע; טוט אים נישט טיילן.
+[[Special:ResetTokens|קליקט דא ווען איר דארפט אים צוריקשטעלן]].',
 'savedprefs' => 'אייערע פרעפערענצן איז אפגעהיטן געווארן.',
 'timezonelegend' => 'צײַט זאנע:',
 'localtime' => 'לאקאלע צייט:',
@@ -1348,7 +1411,6 @@ $1",
 'prefs-reset-intro' => 'איר קענט ניצן דעם בלאַט צוריקצושטעלן אײַערע פרעפֿערענצן גרונטלעך פֿאַרן ארט.
 מען קען דאָס נישט אַנולירן.',
 'prefs-emailconfirm-label' => 'ע-פאסט באַשטעטיקונג:',
-'prefs-textboxsize' => 'גרייס פֿון רעדאַקטירונג פֿענסטער',
 'youremail' => 'ע-פאסט:',
 'username' => '{{GENDER:$1|באַניצער־נאָמען}}:',
 'uid' => '{{GENDER:$1|באַנוצער־נומער}}:',
@@ -1381,6 +1443,8 @@ $1",
 'prefs-dateformat' => 'דאַטע פֿארמאַט',
 'prefs-timeoffset' => 'צײַט אונטערשייד',
 'prefs-advancedediting' => 'אַלגעמיינע ברירות',
+'prefs-editor' => 'רעדאַקטאָר',
+'prefs-preview' => 'פֿאראויסשטעלונג',
 'prefs-advancedrc' => 'פֿארגעשריטענע אפציעס',
 'prefs-advancedrendering' => 'פֿארגעשריטענע אפציעס',
 'prefs-advancedsearchoptions' => 'פֿארגעשריטענע אפציעס',
@@ -1388,7 +1452,9 @@ $1",
 'prefs-displayrc' => 'ווײַזן אפציעס',
 'prefs-displaysearchoptions' => 'ווײַזן אפציעס',
 'prefs-displaywatchlist' => 'ווײַזן אפציעס',
+'prefs-tokenwatchlist' => 'טאקן',
 'prefs-diffs' => 'צווישנשיידן',
+'prefs-help-prefershttps' => 'דער פרעפערענץ וועט ארבעטן ביי אײַער נעקסטער ארײַנלאגירונג.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => 'ע-פּאָסט אַדרעס זעט אויס גילטיק',
@@ -1479,11 +1545,18 @@ $1",
 'right-ipblock-exempt' => 'ארומגיין IP בלאקן, אויטאבלאקן און גרייך־בלאקן',
 'right-unblockself' => 'זיך אליין אויפֿשפאַרן',
 'right-protect' => 'ענדערן שוץ ניוואען און רעדאַגירן קאסקאד־געשיצטע בלעטער',
-'right-editprotected' => 'רעדאַגירן געשיצטע בלעטער (אָן קאַסקאַדן שוץ)',
+'right-editprotected' => 'רעדאַגירן בלעטער געשיצט ווי "{{int:protect-level-sysop}}"',
+'right-editsemiprotected' => 'רעדאַגירן בלעטער געשיצט ווי "{{int:protect-level-autoconfirmed}}"',
 'right-editinterface' => 'רעדאַקטירן די באַניצער אייבערפֿלאַך',
 'right-editusercssjs' => 'רעדאַקטירן אַנדערע באַניצערס CSS און JS טעקעס',
 'right-editusercss' => 'רעדאַקטירן אַנדערע באַניצערס CSS טעקעס',
 'right-edituserjs' => 'רעדאַקטירן אַנדערע באַניצערס JS טעקעס',
+'right-editmyusercss' => 'רעדאקטירע אײַערע אייגענע באניצער CSS טעקעס',
+'right-editmyuserjs' => 'רעדאקטירן אײַערע אייגענע באניצער JavaScript טעקעס',
+'right-viewmywatchlist' => 'באקוקן אייער אייגענע אויפפאסונג ליסטע',
+'right-viewmyprivateinfo' => 'באקוקן אײַער אייגענע פריוואטע דאטן (צ"ב ע־פאסט אדרעס, אמתער נאמען)',
+'right-editmyprivateinfo' => 'רעדאקטירן אײַער אייגענע פריוואטע דאטן (צ"ב ע־פאסט אדרעס, אמתער נאמען)',
+'right-editmyoptions' => 'רעדאקטירן אײַערע אייגענע פרעפערענצן',
 'right-rollback' => 'גיך צוריקדרייען די רעדאַקטירונגען פונעם לעצטן באַניצער וואס האט רעדאַקטירט א געוויסן בלאַט',
 'right-markbotedits' => 'מאַרקירן צוריקגעזעצטע רעדאַגירונגען ווי באט רעדאַגירונגען',
 'right-noratelimit' => 'נישט ווערן באַגרענעצט דורך לימיטאַציע',
@@ -1545,12 +1618,19 @@ $1",
 'action-userrights-interwiki' => 'רעדאַקטירן רעכטן פון באַניצער אויף אַנדערע וויקיס',
 'action-siteadmin' => 'שליסן אדער אויפשליסן די דאטנבאזע',
 'action-sendemail' => 'שיקן ע־פאסט',
+'action-editmywatchlist' => 'רעדאקטירן אײַער אויפֿפאסונג ליסטע',
+'action-viewmywatchlist' => 'באקוקן אײַער אויפֿפאסונג ליסטע',
+'action-viewmyprivateinfo' => 'באקוקן אײַער פריוואטע אינפארמאציע',
+'action-editmyprivateinfo' => 'רעדאקטירן אײַער פריוואטע אינפארמאציע',
 
 # Recent changes
 'nchanges' => '{{PLURAL:$1|ענדערונג|$1 ענדערונגען}}',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|זײַט לעצטן וויזיט}}',
+'enhancedrc-history' => 'היסטאריע',
 'recentchanges' => 'לעצטע ענדערונגען',
 'recentchanges-legend' => 'ברירות פאר לעצטע ענדערונגען',
 'recentchanges-summary' => 'גיי נאך די לעצטע ענדערונגען צו דער וויקי אויף דעם בלאט.',
+'recentchanges-noresult' => 'קיין ענדערונגען ווערנט דער דאזיקער תקופה זענען צוגעפאסט צו די קריטעריע.',
 'recentchanges-feed-description' => 'גייט נאך די לעצטע ענדערונגען צו דער וויקי אין דעם בלאט.',
 'recentchanges-label-newpage' => 'די רעדאַקטירונג האט באשאפֿן א נײַעם בלאַט',
 'recentchanges-label-minor' => 'דאָס איז אַ מינערדיקע רעדאַקטירונג',
@@ -1587,7 +1667,6 @@ $1",
 'recentchangeslinked-feed' => 'פֿאַרבונדענע ענדערונגען',
 'recentchangeslinked-toolbox' => 'פֿאַרבונדענע ענדערונגען',
 'recentchangeslinked-title' => 'ענדערונגען פֿארבונדן מיט $1',
-'recentchangeslinked-noresult' => 'נישט געווען קיין ענדערונגען אין פֿארבונדענע בלעטער אין דער תקופה.',
 'recentchangeslinked-summary' => "אט א רשימה פון נייע ענדערונגען צו בלעטער פארבונדן פון א ספעציפישן בלאט (אדער מיטגליד בלעטער פון א ספעציפישער קאטעגאריע).
 בלעטער אויף [[Special:Watchlist|אייער אויפפאסונג ליסטע]] זענען געוויזן '''דיק'''.",
 'recentchangeslinked-page' => 'בלאַט נאָמען:',
@@ -1599,7 +1678,7 @@ $1",
 'reuploaddesc' => 'אַנולירן אַרויפֿלאָד און צוריקגיין צו דער אַרויפֿלאָדן פֿארעם',
 'upload-tryagain' => 'פֿאָרלייגן מאדיפֿיצירטע טעקע באַשרײַבונג',
 'uploadnologin' => 'נישט אַרײַנלאגירט',
-'uploadnologintext' => 'איר מוזט זײַן [[Special:UserLogin| אַרײַנלאָָגירט]] כדי ארויפֿצולאָדן טעקעס',
+'uploadnologintext' => 'איר דארפֿט זײַן $1 כדי ארויפֿצולאָדן טעקעס.',
 'upload_directory_missing' => 'די ארויפלאד דירעקטאריע ($1) פעלט און דער וועבסערווירער קען זי נישט שאפן.',
 'upload_directory_read_only' => 'דער וועבסארווער קען נישט שרייבן צום ארויפלאדן ארכיוו "$1".',
 'uploaderror' => 'אַרויפֿלאָדן פֿעלער',
@@ -1788,7 +1867,6 @@ $1",
 'http-read-error' => 'HTTP לייענען גרײַז.',
 'http-timed-out' => 'HTTP בקשה אויסגעגאַנגען.',
 'http-curl-error' => 'גרײַז בײַם ברענגען URL: $1',
-'http-host-unreachable' => "מ'קען נישט דערגרייכן דעם URL",
 'http-bad-status' => "ס'איז געווען א פראבלעם ביים HTTP פֿאַרלאַנג: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1814,6 +1892,10 @@ $1",
 'listfiles_size' => 'גרייס',
 'listfiles_description' => 'באַשרײַבונג',
 'listfiles_count' => 'ווערסיעס',
+'listfiles-show-all' => 'שליסט אײַן אלטע ווערסיעס פון בילדער',
+'listfiles-latestversion' => 'לויפיקע ווערסיע',
+'listfiles-latestversion-yes' => 'יא',
+'listfiles-latestversion-no' => 'ניין',
 
 # File description page
 'file-anchor-link' => 'בילד טעקע',
@@ -1908,6 +1990,13 @@ $1",
 'randompage' => 'צופֿעליגער אַרטיקל',
 'randompage-nopages' => 'נישטא קיין בלעטער אין {{PLURAL:$2|דעם פאלגנדן נאמענטייל |די פאלגנדע נאמענטיילן}} "$1".',
 
+# Random page in category
+'randomincategory' => 'צופעליקער בלאט אין קאטעגאריע',
+'randomincategory-invalidcategory' => '"$1" איז נישט קיין גילטיקער קאטעגאריע נאמען.',
+'randomincategory-nopages' => 'נישט פאראן קיין בלעטער אין [[:Category:$1]].',
+'randomincategory-selectcategory' => 'באקומען צופעליקן בלאט פון קאטעגאריע: $1, $2.',
+'randomincategory-selectcategory-submit' => 'גיין',
+
 # Random redirect
 'randomredirect' => 'צופֿעליק ווײַטערפֿירן',
 'randomredirect-nopages' => 'נישטא קיין ווײַטערפֿירונגען אין דעם נאמענטייל $1.',
@@ -1933,10 +2022,6 @@ $1",
 'statistics-users-active-desc' => 'באניצערס וואס האבן דורכגעפירט א פעולה אין די לעצטע {{PLURAL:$1|טאג|$1 טעג}}',
 'statistics-mostpopular' => 'מערסטע געזען בלעטער',
 
-'disambiguations' => 'בלעטער וואס פֿארבינדן מיט באדייטן בלעטער',
-'disambiguationspage' => 'Template:באדייטן',
-'disambiguations-text' => "די קומענדיגע בלעטער פארבינדן צו א '''באדייטן בלאט'''. זיי ברויכן ענדערשט פֿארבינדן צו דעם רעלעוואנטן טעמע בלאט.<br />א בלאט ווערט פאררעכענט פאר א באדײַטן בלאט אויב ער באניצט זיך מיט א מוסטער וואס איז פארבינדען פון [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'בלעטער מיט א בלאט אייגנשאפט',
 'pageswithprop-legend' => 'בלעטער מיט א בלאט אייגנשאפט',
 'pageswithprop-text' => 'דער בלאט האלט א רשימה פון בלעטער וואס ניצן א געוויסע בלאט אייגנשאפט.',
@@ -2186,10 +2271,9 @@ $1",
 'unwatchthispage' => 'ענדיגן אויפֿפאַסן',
 'notanarticle' => 'דאס איז נישט קיין אינהאלט בלאט',
 'notvisiblerev' => 'די באארבעטונג איז געווארן אויסגעמעקט',
-'watchnochange' => 'קיינע פֿון אײַערע אויפֿגעפאַסטע בלעטער האבן זיך געענדערט אין דעם צײַט פעריאד געוויזן.',
 'watchlist-details' => '{{PLURAL:$1|איין בלאט|$1 בלעטער}} אין אייער אויפֿפאסן ליסטע (נישט רעכענען  רעדן בלעטער).',
-'wlheader-enotif' => '* ע-פאסט מעלדונג ערמעגליכט.',
-'wlheader-showupdated' => "* בלעטער געענדערט זײַט אײַער לעצטן וויזיט זען געוויזן '''דיק'''",
+'wlheader-enotif' => 'ע-פאסט מעלדונג ערמעגליכט.',
+'wlheader-showupdated' => "בלעטער געענדערט זײַט אײַער לעצטן וויזיט זען געוויזן '''דיק'''.",
 'watchmethod-recent' => 'קאנטראלירן לעצטע ענדערונגען פֿאַר אויפֿגעפאַסטע בלעטער',
 'watchmethod-list' => 'קאנטראלירן בלעטער אין אַכטונג־ליסטע פֿאַר לעצטע ענדערונגען',
 'watchlistcontains' => 'אייער אויפֿפאסונג ליסטע אנטהאלט {{PLURAL:$1|איין בלאט|$1 בלעטער}}.',
@@ -2431,7 +2515,7 @@ $1',
 'contributions' => '{{GENDER:$1|באניצער}} בײַשטײַערונגען',
 'contributions-title' => 'בײַשטײַערונגען פֿון באַניצער $1',
 'mycontris' => 'בײַשטײַערונגען',
-'contribsub2' => 'וועגן $1 ($2)',
+'contribsub2' => 'פֿאַר {{GENDER:$3|$1}} ($2)',
 'nocontribs' => 'נישט געטראפן קיין ענדערונגען צוזאמעגעפאסט מיט די קריטעריעס.',
 'uctop' => '(לויפֿיק)',
 'month' => 'ביז חודש:',
@@ -2597,11 +2681,8 @@ $1',
 דאך איז ער בלאקירט אַלס א טייל פֿון דעם אָפשטאַנד $2, וואָס מ'קען יא אויפֿבלאקירן.",
 'ip_range_invalid' => 'אומריכטיגער IP גרייך.',
 'ip_range_toolarge' => 'אָפשטאַנדן גרעסער ווי /$1 קען מען נישט בלאקירן.',
-'blockme' => 'בלאקירט מיך',
 'proxyblocker' => 'פראקסי בלאקער',
-'proxyblocker-disabled' => 'די  פֿונקציע איז אומאַקטיווירט.',
 'proxyblockreason' => 'אייער איי.פי. אדרעס איז געווארן געבלאקט צוליב דעם ווייל דאס איז א אפענער פראקסי. ביטע פארבינדט זיך מיט אייער אינטערנעט סערוויס פראוויידער אדער טעקס סאפארט צו אינפארמירן זיי איבער דעם ערענסטן זיכערהייט פראבלעם.',
-'proxyblocksuccess' => 'געטאן.',
 'cant-block-while-blocked' => 'איר קען נישט בלאקירן קיין אנדערע באניצער ווען איר זענט אליין בלאקירט.',
 'ipbblocked' => 'איר קען נישט בלאקירן אדער אויפבלאקירן אנדערע באניצער, ווייל איר זענט אליין בלאקירט.',
 'ipbnounblockself' => 'איר זענט נישט ערלויבט זיך אליין אויסבלאקירן',
@@ -2760,6 +2841,8 @@ $1',
 'thumbnail-more' => 'פארגרעסער',
 'filemissing' => 'טעקע פֿעלט',
 'thumbnail_error' => 'גרײַז בײַם באשאפֿן דאס קליינבילד: $1',
+'thumbnail_error_remote' => 'פֿעלער־מעלדונג פֿון $1:
+$2',
 'djvu_page_error' => 'DjVu בלאט ארויס פֿון גרייך',
 'djvu_no_xml' => "מ'קען נישט באקומען דעם XML פֿאַר דער DjVu טעקע",
 'thumbnail-temp-create' => "מ'קען נישט שאפן א פראוויזארישע פארקלענערטע טעקע",
@@ -2909,13 +2992,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/* CSS געשריבן דא וועט אפילירן און באיינפלוסן אלע סקינס */',
-'standard.css' => '/* CSS געשטעלט דא ווירקט אויפן סטאנדארט סקין */',
-'nostalgia.css' => '/* CSS געשטעלט דא ווירקט נאר אויפן נאסטאלגיע סקין */',
 'cologneblue.css' => '/* CSS געשטעלט דא ווירקט נאר אויפן קעלנישן־בלוי סקין */',
 'monobook.css' => '/* סטייל דא געלייגט וועט באאיינפלוסן דעם Monobook סקין */',
-'myskin.css' => '/* CSS געשטעלט דא ווירקט אויפן MySkin סקין */',
-'chick.css' => '/* CSS געשטעלט דא ווירקט אויפן טשיק סקין */',
-'simple.css' => '/* CSS געשטעלט דא ווירקט אויפן איינפאך סקין */',
 'modern.css' => '/* CSS געשטעלט דא ווירקט אויפן מאדערנעם סקין */',
 'vector.css' => '/* CSS געשטעלט דא ווירקט נאר אויפן וועקטאר סקין */',
 
@@ -2991,13 +3069,8 @@ $1',
 'pageinfo-category-files' => 'צאָל טעקעס',
 
 # Skin names
-'skinname-standard' => 'קלאסיש',
-'skinname-nostalgia' => 'נאסטאלגיע',
 'skinname-cologneblue' => 'קעלניש בלוי',
 'skinname-monobook' => 'מאנאבוק',
-'skinname-myskin' => 'מיין סקין',
-'skinname-chick' => 'טשיק',
-'skinname-simple' => 'איינפֿאַך',
 'skinname-modern' => 'מאדערן',
 'skinname-vector' => 'וועקטאר',
 
@@ -3077,11 +3150,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 מינוט|$1 מינוט}}',
 'hours' => '{{PLURAL:$1|$1 שעה|$1 שעה}}',
 'days' => '{{PLURAL:$1|$1 טאג|$1 טעג}}',
+'weeks' => '{{PLURAL:$1|$1 וואך|$1 וואכן}}',
 'months' => '{{PLURAL:$1|איין מאנאַט|$1 מאנאַטן}}',
 'years' => '{{PLURAL:$1|איין יאָר|$1 יאָר}}',
 'ago' => 'פֿאַר $1',
 'just-now' => 'גראדע יעצט',
 
+# Human-readable timestamps
+'hours-ago' => "פֿאר $1 {{PLURAL:$1|שעה|שעה'ן}}",
+'minutes-ago' => 'פֿאר $1 {{PLURAL:$1|מינוט}}',
+'seconds-ago' => 'פֿאַר $1 {{PLURAL:$1|סעקונדע|סעקונדעס}}',
+'monday-at' => 'מאנטיק $1',
+'tuesday-at' => 'דינסטיק $1',
+'wednesday-at' => 'מיטוואך $1',
+'thursday-at' => 'דאנערשטיק $1',
+'friday-at' => 'פֿרײַטיק $1',
+'saturday-at' => 'שבת $1',
+'sunday-at' => 'זונטיק $1',
+'yesterday-at' => 'נעכטן $1',
+
 # Bad image list
 'bad_image_list' => 'דער פֿאָרמאַט איז װי פֿאָלגנדיק:
 
@@ -3114,7 +3201,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ברייט',
 'exif-imagelength' => 'הייך',
 'exif-bitspersample' => 'ביטס פער באשטאנדטייל',
@@ -3269,7 +3356,7 @@ $1',
 'exif-organisationinimage' => 'אויסגעשטעלטע ארגאניזאציע',
 'exif-personinimage' => 'אויסגעשטעלטער מענטש',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'אומ-צאמגעקוועטשט',
 
 'exif-copyrighted-true' => 'געשיצט מיט קאפירעכט',
@@ -3645,12 +3732,12 @@ $5
 'version-skins' => 'באניצער־אייבערפלאכן',
 'version-other' => 'אנדער',
 'version-hooks' => 'Hook סטרוקטורן',
-'version-extension-functions' => 'פארברייטערן פונקציעס',
 'version-parser-extensiontags' => 'פארזער פארברייטערן טאַגן',
 'version-hook-name' => 'נאמען פון hook',
 'version-version' => '(ווערסיע $1)',
 'version-license' => 'ליצענץ',
 'version-poweredby-others' => 'אַנדערע',
+'version-poweredby-translators' => 'translatewiki.net איבערזעצער',
 'version-credits-summary' => 'מיר ווילן אנערקענען די פֿאלגנדע מענטשן פֿאר זייער בײַשטײַערוג צו [[Special:Version|מעדיעוויקי]].',
 'version-software' => 'אינסטאַלירט ווייכוואַרג',
 'version-software-product' => 'פראדוקט',
@@ -3658,10 +3745,15 @@ $5
 'version-entrypoints-header-entrypoint' => 'אריינגאנג פונקט',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'טעקע שטעג',
-'filepath-page' => 'טעקע:',
-'filepath-submit' => 'גיין',
+# Special:Redirect
+'redirect-legend' => 'ווײַטערײַטערפירונג צו א טעקע אדער בלאט',
+'redirect-submit' => 'גייט',
+'redirect-lookup' => 'זוכן:',
+'redirect-value' => 'ווערט:',
+'redirect-user' => 'באַניצער־נומער:',
+'redirect-revision' => 'בלאט ווערסיע',
+'redirect-file' => 'טעקע נאמען',
+'redirect-not-exists' => 'ווערט נישט געטראפן',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'זוכן דופליקאַטע טעקעס',
@@ -3709,6 +3801,7 @@ $5
 'tags' => 'גילטיקע ענדערונג טאַגן',
 'tag-filter' => '[[Special:Tags|מאַרקירונג]] פֿילטער:',
 'tag-filter-submit' => 'פֿילטער',
+'tag-list-wrapper' => '([[Special:Tags|{{PLURAL:$1|טאַג|טאַגן}}]]: $2)',
 'tags-title' => 'טאַגן',
 'tags-intro' => 'דער בלאַט ווײַזט די טאַגן מיט וואס דאס ווייכווארג קען צייכענען אַ רעדאַגירונג, און זייער באַטייַט.',
 'tags-tag' => 'טאַג נאָמען',
@@ -3750,6 +3843,8 @@ $5
 'htmlform-submit' => 'אײַנגעבן',
 'htmlform-reset' => 'צוריקשטעלן ענדערונגען',
 'htmlform-selectorother-other' => 'אַנדער',
+'htmlform-no' => 'ניין',
+'htmlform-yes' => 'יא',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 מיט פולן-טעקסט זוכן שטיץ',
@@ -3867,4 +3962,19 @@ $5
 # Image rotation
 'rotate-comment' => 'בילד געדרייט דורך $1 {{PLURAL:$1|גראד}} זייגערווייז',
 
+# Limit report
+'limitreport-title' => 'פארזער פראפילירן דאטן:',
+'limitreport-cputime' => 'צײַט באניץ CPU',
+'limitreport-cputime-value' => '$1 {{PLURAL:$1|סעקונדע|סעקונדעס}}',
+'limitreport-walltime' => 'עכטע צייט ניצונג',
+'limitreport-walltime-value' => '$1 {{PLURAL:$1|סעקונדע|סעקונדעס}}',
+'limitreport-ppvisitednodes' => 'פאר־פראצעסאר באזוכן נאדן־צאל',
+'limitreport-ppgeneratednodes' => 'פאר־פראצעסאר גענערירט נאדן־צאל',
+'limitreport-postexpandincludesize' => 'טעקסט גרייס נאכן שפרייטן',
+'limitreport-postexpandincludesize-value' => '{{PLURAL:$2|בייט|בייטן}}$1/$2',
+'limitreport-templateargumentsize' => ' מוסטער פאראמעטער גרייס',
+'limitreport-templateargumentsize-value' => '$1/$2 {{PLURAL:$2|בייט|בייטן}}',
+'limitreport-expansiondepth' => 'גרעסטע אויסשפרייט טיף',
+'limitreport-expensivefunctioncount' => 'צאל פזרנישע פארזער־פֿונקציעס',
+
 );
diff --git a/languages/messages/MessagesYo.php b/languages/messages/MessagesYo.php
index 6d420c2a..1d2c0b26 100644
--- a/languages/messages/MessagesYo.php
+++ b/languages/messages/MessagesYo.php
@@ -83,9 +83,6 @@ $messages = array(
 'tog-shownumberswatching' => "S'àfihàn iye àwọn oníṣe tí wọn tẹjú mọ́ọ",
 'tog-oldsig' => 'Ìtọwọ́bọ̀wé tówà:',
 'tog-fancysig' => 'Ṣe ìtọwọ́bọ̀wé bíi ìkọ wiki (láìní ìjápọ̀ fúnrararẹ̀)',
-'tog-externaleditor' => 'Lo aláàtúnṣe ọ̀tọ̀ látìbẹ̀rẹ̀ (fún àwọn tó mọ̀ nìkan, ìtò ọ̀tọ̀ọ̀tọ̀ pọndandan lórí kọ̀mpútà yín. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Lo awoìyàtò ọ̀tọ̀ látìbẹ̀rẹ̀ (fún àwọn tó mọ̀ nìkan, ìtò ọ̀tọ̀ọ̀tọ̀ pọndandan lórí kọ̀mpútà yín. [//www.mediawiki.org/wiki/Manual:External_editors Ìfọ̀rọ̀tónilétí mìhínhìn.])',
-'tog-showjumplinks' => 'Ìgbàláyè "fò lọ sí" àwọn ìjápọ̀ ìṣeégbà',
 'tog-uselivepreview' => 'Ìlo àkọ́kọ́yẹ̀wò lẹ́ṣẹ̀kẹṣẹ̀ (JavaScript pọndandan) (aládànhánwò)',
 'tog-forceeditsummary' => 'Kìlọ̀ fún mi tí àkótán àtúnṣe bá jẹ́ òfo',
 'tog-watchlisthideown' => 'Ìbòmọ́lẹ̀ àwọn àtúnṣe mi nínú ìmójútó',
@@ -98,6 +95,7 @@ $messages = array(
 'tog-diffonly' => 'Kò gbọdọ̀ ṣàfihàn àkóónú ojúewé lábẹ́ àwọn ìyàtọ̀',
 'tog-showhiddencats' => "Ṣ'àfihàn àwọn ẹ̀ka pípamọ́",
 'tog-norollbackdiff' => 'Fo ìyàtọ̀ lẹ́yín síṣe ìyísẹ́yìn',
+'tog-useeditwarning' => 'Kìlọ̀ fún mi tí mo bá únkúrò ní ojúewé àtúnṣe láì tíì mupamọ́',
 
 'underline-always' => 'Nígbà gbogbo',
 'underline-never' => 'Rárá',
@@ -161,6 +159,18 @@ $messages = array(
 'oct' => 'Oṣù 10',
 'nov' => 'Oṣù 11',
 'dec' => 'Oṣù 12',
+'january-date' => '$1 Oṣù Kínní',
+'february-date' => '$1 Oṣù Kejì',
+'march-date' => '$1 Oṣù Kẹta',
+'april-date' => '$1 Oṣù Kẹrin',
+'may-date' => '$1 Oṣù Kàrún',
+'june-date' => '$1 Oṣù Kẹfà',
+'july-date' => '$1 Oṣù Keje',
+'august-date' => '$1 Oṣù Kẹjọ',
+'september-date' => '$1 Oṣù Kẹ̀sán',
+'october-date' => '$1 Oṣù Kẹ̀wá',
+'november-date' => '$1 Oṣù Kọkànlá',
+'december-date' => '$1 Oṣù Kejìlá',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Ẹ̀ka|Àwọn ẹ̀ka}}',
@@ -242,6 +252,7 @@ $messages = array(
 'create-this-page' => "Ṣè'dá ojúewé yìí",
 'delete' => 'Ìparẹ́',
 'deletethispage' => 'Pa ojúewé yi rẹ́',
+'undeletethispage' => 'Mú ìparẹ́ kúrò fún ojúewé yìí',
 'undelete_short' => 'Ìdápadà ìparẹ́ {{PLURAL:$1|àtúnṣe kan|àwọn àtúnṣe $1}}',
 'viewdeleted_short' => 'Ìwòran {{PLURAL:$1|àtúnṣe ajẹ́píparẹ́ kan|àwọn àtúnṣe ajẹ́píparẹ́ $1}}',
 'protect' => 'Àbò',
@@ -285,7 +296,7 @@ $1',
 'pool-queuefull' => 'Oríìlà dátà ti kún',
 'pool-errorunknown' => 'Àsìṣe àwámárìdí',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Nípa {{SITENAME}}',
 'aboutpage' => 'Project:Nípa',
 'copyright' => 'Gbogbo ohun inú ibí yìí wà lábẹ́  $1.',
@@ -295,7 +306,6 @@ $1',
 'disclaimers' => 'Ikìlọ̀',
 'disclaimerpage' => 'Project:Ìkìlọ̀ gbogbo',
 'edithelp' => 'Ìrànlọ́wọ́ fún àtúnṣe',
-'edithelppage' => 'Help:Àtúnṣe',
 'helppage' => 'Help:Àwon àkóónú',
 'mainpage' => 'Ojúewé Àkọ́kọ́',
 'mainpage-description' => 'Ojúewé Àkọ́kọ́',
@@ -373,17 +383,6 @@ $1',
 # General errors
 'error' => 'Àsìṣe',
 'databaseerror' => 'Àsìṣe ibùdó dátà',
-'dberrortext' => 'Àṣìṣe ìsoọ̀rọ̀pọ̀ ìtọrọ ibùdó-dátà kan ti ṣẹlẹ̀.
-Ó lè jẹ́ nítorí àṣìṣe inú atòlànà.
-Ìgbìyànjú ìtọrọ ibùdó-dátà ṣẹlẹ̀ jẹ́: 
-<blockquote><code>$1</code></blockquote>
-láti inú ìmúṣiṣẹ́ "<code>$2</code>".
-Ibùdó-dátà mú àṣìṣe "<samp>$3: $4</samp>" padà.',
-'dberrortextcl' => 'Àṣìṣe ìsoọ̀rọ̀pọ̀ ìtọrọ ibùdó-dátà kan ti ṣẹlẹ̀.
-Ìgbìyànjú ìtọrọ ibùdó-dátà ṣẹlẹ̀ jẹ́: 
-"$1"
-láti inú ìmúṣiṣẹ́ "$2".
-Ibùdó-dátà mú àṣìṣe "$3: $4" padà',
 'laggedslavemode' => "'''Ìkìlọ̀:''' Ojúewé náà le mọ́ nìí àwọn àtúnṣe tuntun.",
 'readonly' => 'Títìpa ibùdó dátà',
 'enterlockreason' => 'Ẹ ṣàlàyé ìtìpa náà, àti ìgbàtí ẹ rò pé ìtìpa náà yíò kúrò.',
@@ -439,11 +438,12 @@ Kò ṣe àlàyé kankan.',
 'editinginterface' => "'''Ìkìlọ̀:''' Ẹ ún ṣàtúnṣe ojúewé tó jẹ́ lílò láti pèsè ìkọ ìfojúkojú fún àtòlànà kọ̀mpútà.
 Àwọn ìyípadà sí ojúewé yìí yíò kan ìhànsí ìfojúkojú oníṣe fún àwọn oníṣe míràn lọ́rí wiki yìí.
 Láti ṣ'àfikún tàbí ṣ'àyípadà àwọn ìyédèpadà fún gbogbo àwọn wiki, ẹ jọ̀wọ́ ẹ lo [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], iṣẹ́-ọwọ́ ìṣọdìbílẹ̀ MediaWiki.",
-'sqlhidden' => '(bíbòmọ́lẹ̀ ìbéèrè SQL)',
 'cascadeprotected' => 'Ojúewé yìí ti jẹ́ dídáàbòbò sí àtùnṣe, nítorípé ó wà nínú {{PLURAL:$1|ojúewé ìsàlẹ̀ yìí, tó jẹ́|àwọn ojúewé ìsàlẹ̀ wọ̀nyí, tí wọ́n jẹ́}} dídáàbòbò pẹ̀lú ìyàn "ajámọ́ra" ní títàn: $2',
 'namespaceprotected' => "A kò gbàyín ní ààyè láti ṣ'àtúnṣe àwọn ojúewé tó wà nínú orúkọàyè '''$1'''.",
 'customcssprotected' => 'Ẹ kò ní ìyọ̀nda láti ṣàtúnṣe ojúewé CSS yìí nítorípé ó ní àwọn ìtòjọ oníṣe ẹlòmíràn.',
 'customjsprotected' => 'Ẹ kò ní ìyọ̀nda láti ṣàtúnṣe ojúewé JavaScript yìí nítorípé ó ní àwọn ìtòjọ oníṣe ẹlòmíràn.',
+'mycustomcssprotected' => 'Ẹ kò ní ìyọ̀nda láti ṣàtúnṣe ojúewé CSS yìí.',
+'mycustomjsprotected' => 'Ẹ kò ní ìyọ̀nda láti ṣàtúnṣe ojúewé JavaScript yìí.',
 'ns-specialprotected' => 'Àtúnṣe kò ṣe é ṣe sí àwọn ojúewé pàtàkì.',
 'titleprotected' => "[[User:$1|$1]] ti dínà sí dídá àkọlé yìí. Ìdí rẹ̀ ni pé ''$2''.",
 'filereadonlyerror' => 'Àtúnṣe kò ṣe é ṣe sí fáìlì "$1" nítorípé ibi-àkójọ fáìlì "$2" jẹ́ fún wíwò nìkàn.
@@ -468,10 +468,18 @@ Olùṣeàmójútó tó típa ṣe àlàyé yìí: "$3".',
 'welcomecreation-msg' => "A ti ṣ'èdá àpamọ́ yín.
 Ẹ mọ́ gbàgbé l'áti ṣ'àtúnṣe [[Special:Preferences|{{SITENAME}} àwọn ìfẹ́ràn]] yín.",
 'yourname' => 'Orúkọ oníṣe:',
+'userlogin-yourname' => 'Orúkọ olùṣe',
+'userlogin-yourname-ph' => 'Ẹ kọ orúkọ olùṣe yín',
 'yourpassword' => 'Ọ̀rọ̀ìpamọ́:',
+'userlogin-yourpassword' => 'Ọ̀rọ̀ìpamọ́',
+'userlogin-yourpassword-ph' => 'Ẹ kọ ọ̀rọ̀ìpamọ́ yín',
+'createacct-yourpassword-ph' => 'Ẹ kọ ọ̀rọ̀ìpamọ́',
 'yourpasswordagain' => 'Kọ ọ̀rọ̀ìpamọ́ lẹ́ẹ̀kansí:',
+'createacct-yourpasswordagain' => 'Ẹ ṣe ìfidájú ọ̀rọ̀ìpamọ́',
+'createacct-yourpasswordagain-ph' => 'Ẹ kọ ọ̀rọ̀ìpamọ́ lẹ́ẹ̀kan síi',
 'remembermypassword' => "Ṣè'rántí ìwọlé mi lórí kọ̀mpútà yìí (fún ó pẹ́ jù {{PLURAL:$1|ọjọ́|ọjọ́}} $1)",
-'securelogin-stick-https' => 'Ìwàní sísopọ̀ mọ́ HTTPS lẹ́yín ìwọlé',
+'userlogin-remembermypassword' => 'Fi mí sí ìwọlé',
+'userlogin-signwithsecure' => 'Lo ìsopọ̀ ẹ̀rọ tó ní àbò',
 'yourdomainname' => 'Domain yín:',
 'password-change-forbidden' => 'Ẹ kò le ṣe ìyípadà ọ̀rọ̀ìpamọ́ lórí wiki yìí.',
 'externaldberror' => 'Bóyá àsìṣe ìfidájú ibùdó dátà ló ṣẹlẹ̀ tàbí ẹ kò jẹ́ gbígbà ní ààyè láti sọ àpamọ́ òde yín di ọ̀tun.',
@@ -483,18 +491,38 @@ Olùṣeàmójútó tó típa ṣe àlàyé yìí: "$3".',
 'logout' => 'Ìjáde',
 'userlogout' => 'Ìjáde',
 'notloggedin' => "Ẹ kò tí w'ọlé",
+'userlogin-noaccount' => 'Ṣé ẹ kò ní àkópamọ́?',
+'userlogin-joinproject' => 'Ẹ darapọ̀mọ́ {{SITENAME}}',
 'nologin' => "Ṣé ẹ fẹ́ wọlé? '''$1'''.",
 'nologinlink' => 'Ìforúkọsílẹ̀',
 'createaccount' => 'Ẹ fi orúkọ sílẹ̀',
 'gotaccount' => "Ṣé ẹ ti ní àpamọ́ tẹ́lẹ̀? '''$1'''.",
 'gotaccountlink' => "Ẹ w'ọlé",
 'userlogin-resetlink' => 'À bí ẹ gbàgbé ìwọlé yín?',
+'userlogin-resetpassword-link' => 'Ìtúntò ọ̀rọ̀ìpamọ́ yín',
+'helplogin-url' => 'Help:Ìwolé',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ìrànlọ́wọ́ láti ìwọlé]]',
+'createacct-join' => 'Ẹ kọ ìsọ̀rọ̀nípa yín sísàlẹ̀',
+'createacct-emailrequired' => 'Àdírẹ̀sì email',
+'createacct-emailoptional' => 'Àdírẹ̀sì email (kò pọndandan)',
+'createacct-email-ph' => 'Ẹ kọ àdírẹ̀sì email yín',
 'createaccountmail' => 'Lo ọ̀rọ̀ìpamọ́ àrìnnàkò ìgbàdíẹ̀ ná, kí o sì fi ránsẹ́ sí àdírẹ̀sì email tó wà nísàlẹ̀',
+'createacct-realname' => 'Orúkọ yín gangan (kò pọndandan)',
 'createaccountreason' => 'Ìdíẹ̀:',
+'createacct-reason' => 'Ìdí',
+'createacct-reason-ph' => 'Ìdí tí ẹ ṣe fẹ́ dá àkópamọ́ míràn',
+'createacct-captcha' => 'Àyẹ̀wò àbò',
+'createacct-imgcaptcha-ph' => 'Ẹ kọ ìkọ̀rọ̀ tí ẹ rí lókè',
+'createacct-submit' => 'Ìdá àkópamọ́ yín',
+'createacct-benefit-heading' => 'Àwọn ènìyàn bíi yín ni wọ́n dá {{SITENAME}}.',
+'createacct-benefit-body1' => '{{PLURAL:$1|àtúnṣe|àwọn àtúnṣe}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|ojúewé|àwọn ojúewé}}',
+'createacct-benefit-body3' => ' {{PLURAL:$1|olùkópa|Àwọn olùkópa}} aṣẹ̀ṣẹ̀ṣe',
 'badretype' => 'Àwọn ọ̀rọ̀ìpamọ́ tí ẹ kọ kò jọ ra wọn.',
 'userexists' => 'Orúkọ oníṣe tí ẹ mú wà lọ́wọ́ ẹlòmíràn.
 Ẹjọ̀wọ́ ẹ yan orúkọ mìíràn tó yàtọ̀.',
 'loginerror' => 'Àsìṣe ìwọlé',
+'createacct-error' => 'Àṣìṣe ìdá àkópamọ́',
 'createaccounterror' => 'Kò le dá àkópamọ́: $1',
 'nocookiesnew' => 'A ti dá àpamọ́ oníṣe, ṣugbọ́n ẹ kò tíì wọlé.
 {{SITENAME}} ún lo cookies láti gba àwọn oníṣe wọlé.
@@ -580,7 +608,7 @@ Láti parí ìmúwọlẹ́, ẹ gbọ́dọ̀ ṣètò ọ̀rọ̀ìpamọ́ tu
 'newpassword' => 'Ọ̀rọ̀ìpamọ́ tuntun:',
 'retypenew' => 'Àtúntẹ̀ ọ̀rọ̀ìpamọ́ tuntun:',
 'resetpass_submit' => 'Ẹ ṣe àtúntò ọ̀rọ̀ìpamọ́ kí ẹ tó wọlé',
-'resetpass_success' => 'Ìyípadà ọ̀rọ̀ìpamọ́ yín ti já sí rere! Ẹ̀ ún wọlé lọ́wọ́...',
+'changepassword-success' => 'Ìyípadà ọ̀rọ̀ìpamọ́ yín ti já sí rere! Ẹ̀ ún wọlé lọ́wọ́...',
 'resetpass_forbidden' => 'Àwọn ọ̀rọ̀ìpamọ́ kò ṣe é yípadà',
 'resetpass-no-info' => 'Ẹ gbọ́dọ̀ wọlẹ́ láti le lọ sí ojúewé yìí tààrà.',
 'resetpass-submit-loggedin' => 'Ìyípadà ọ̀rọ̀ìpamọ́',
@@ -592,10 +620,9 @@ Láti parí ìmúwọlẹ́, ẹ gbọ́dọ̀ ṣètò ọ̀rọ̀ìpamọ́ tu
 
 # Special:PasswordReset
 'passwordreset' => 'Ìtúntò ọ̀rọ̀ìpamọ́',
-'passwordreset-text' => 'Ẹ parí fọ́ọ̀mù yìí láti ṣe ìtúntò ọ̀rọ̀ìpamọ́ yín.',
 'passwordreset-legend' => 'Ìtúntò ọ̀rọ̀ìpamọ́',
 'passwordreset-disabled' => 'Ìdálẹ́kun ìtúntò ọ̀rọ̀ìpamọ́ lórí wiki yìí.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ẹ kọ ìkan nínú àwọn wẹ́wẹ́ dátà ìsàlẹ̀}}',
+'passwordreset-emaildisabled' => 'Ìdálẹ́kun lílo email lórí wiki yìí.',
 'passwordreset-username' => 'Orúkọ oníṣe:',
 'passwordreset-domain' => 'Àbùgbé:',
 'passwordreset-capture' => 'Wo e-mail tí yíò jáde?',
@@ -839,12 +866,15 @@ Kò ṣe àlàyé kankan.',
 Ó dà bíi pé a ti paárẹ́.',
 'edit-conflict' => 'Ìtakora áwọn àtúnṣe',
 'edit-no-change' => 'A ṣe àìkàsí àtúnṣe yín, nítorípé ìkọ̀wé kò ní àtúnṣe kankan.',
+'postedit-confirmation' => 'Àtúnṣe yín ti jẹ́ gbígbépamọ́.',
 'edit-already-exists' => "A kò le è ṣè'dá ojúewé tuntun.
 Ó pilẹ̀ ti wà.",
 'defaultmessagetext' => 'Ìkọ ìránṣẹ́ àtìbẹ̀rẹ̀',
 'content-failed-to-parse' => 'Ìkùnà láti ṣàtúwò àkóónú $2 fún àfijúwe $1: $3',
 'invalid-content-data' => 'Àkóónú dátà tí kò yẹ',
 'content-not-allowed-here' => 'Àkóónú "$1" kò ní ìyọ̀nda lórí ojúewé [[$2]]',
+'editwarning-warning' => 'Kíkúrò ní ojúewé yìí yíò jẹ́ kí ẹ pòfo àwọn àtúnṣe tí ẹ ti ṣe.
+Tó bá jẹ́ pé ẹ ti wọlé, ẹ lè dẹ́kun ìkìlọ̀ yìí nínù abala "Àtúnṣe ṣíṣe" ti àwọn ìfẹ́ràn yín.',
 
 # Content models
 'content-model-wikitext' => 'ìkọ̀rọ̀ wiki',
@@ -1088,7 +1118,6 @@ Kò ṣe é bòmọ́lẹ̀.',
 'searchmenu-legend' => 'Àwọn àṣàyàn àwáàrí',
 'searchmenu-exists' => "'''Ojúewé tó ún jẹ́ \"[[:\$1]]\" wà lórí wiki yìí'''",
 'searchmenu-new' => "'''Dá ojúewé \"[[:\$1]]\" sí orí wiki yìí!'''",
-'searchhelp-url' => 'Help:Àwon àkóónú',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ẹ lọ sí àwọn ojúewé tí wọ́n ní àsopọ̀ yìí]]',
 'searchprofile-articles' => 'Àwọn ojúewé Àkóónú',
 'searchprofile-project' => 'Àwọn ojúewé Ìrànwọ́ àti Iṣẹ́-ọwọ́',
@@ -1133,15 +1162,6 @@ Kò ṣe é bòmọ́lẹ̀.',
 Ní báyìí ná ẹ le ṣàwárí lọ́dọ̀ Google.
 Àkíyèsí pé àwọn atọ́ka wọn fún àkóónú {{SITENAME}} le mọ́ jẹ́ tuntun.',
 
-# Quickbar
-'qbsettings' => 'Pẹpẹ ìṣárémúlò',
-'qbsettings-none' => 'Ìkankan',
-'qbsettings-fixedleft' => 'Kíkàn sí òsì',
-'qbsettings-fixedright' => 'Kíkàn sí ọ̀tún',
-'qbsettings-floatingleft' => 'Léfòó sí òsì',
-'qbsettings-floatingright' => 'Léfòó sí ọ̀tún',
-'qbsettings-directionality' => 'Fi sí ẹ̀gbẹ́, gẹ́gẹ́ bí ìdojúkọ lẹ́tà-ọ̀rọ̀ èdè yín bá ṣe rí',
-
 # Preferences page
 'preferences' => 'Àwọn ìfẹ́ràn',
 'mypreferences' => 'Àwọn ìfẹ́ràn',
@@ -1174,7 +1194,6 @@ Ní báyìí ná ẹ le ṣàwárí lọ́dọ̀ Google.
 'resetprefs' => 'Ìpalẹ̀mọ́ àwọn àyípadà àìmúpamọ́',
 'restoreprefs' => 'Ìdápadà áwọn ìtò àtìbẹ̀rẹ̀',
 'prefs-editing' => 'Àtúnṣe ṣíṣẹ',
-'prefs-edit-boxsize' => 'Ìtóbi fèrèsé àtúnṣe',
 'rows' => 'Àwọn ìtẹ̀lé gbọlọjọ:',
 'columns' => 'Àwọn ìtẹ̀lé gogoro:',
 'searchresultshead' => 'Àwárí',
@@ -1185,9 +1204,6 @@ Ní báyìí ná ẹ le ṣàwárí lọ́dọ̀ Google.
 'recentchangesdays-max' => '{{PLURAL:$1|Ọjọ́|Ọjọ́}} $1 púpọ̀jùlọ',
 'recentchangescount' => 'Iye àtúnṣe láti fihàn látìbẹ̀rẹ̀:',
 'prefs-help-recentchangescount' => 'Àwọn àtúnṣe tuntun, ìtàn ojúewé, àti àkọọ́lẹ̀ wà nínú èyí.',
-'prefs-help-watchlist-token' => 'Tí ẹ bá fílì fọ́ọ̀mù yìí pẹ̀lú kọ́kọ́rọ́ àmìọ̀rọ̀ àsírí yíò dá feed RSS fún ìmójútó yín.
-Ẹnikẹ́ni tó bá mọ kọ́kọ́rọ́ àmìọ̀rọ̀ náà nínú fọ́ọ̀mù yìí yíò le ka ìmójútó yín, nítoríẹ̀ ẹ mú nọ́mbà tó pamọ́.
-Nọ́mbà àrìnnàkò kan nìyí tí ẹ le lò: $1',
 'savedprefs' => 'Àwọn ìfẹ́ràn yín ti jẹ́mímúpapọ́.',
 'timezonelegend' => 'Àsìkò ilẹ̀àmùrè:',
 'localtime' => 'Àkókò ìbílẹ̀:',
@@ -1218,7 +1234,6 @@ Nọ́mbà àrìnnàkò kan nìyí tí ẹ le lò: $1',
 'prefs-reset-intro' => 'Ẹ le lo ojúewé yìí láti ṣàtùntò àwọn ìfẹ́ràn yín sí àkọ́kọ́ṣe ibiìtakùn yìí.
 Kò ní ṣeé dápadà mọ́.',
 'prefs-emailconfirm-label' => 'E-mail ìmúdájú:',
-'prefs-textboxsize' => 'Ìtóbi fèrèsé àtúnṣe',
 'youremail' => 'E-mail:',
 'username' => '{{GENDER:$1|Orúkọ oníṣe}}:',
 'uid' => 'Nọmba ìdámọ̀ {{GENDER:$1|oníṣe}}:',
@@ -1460,7 +1475,6 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iṣẹ́ yín fún yín.',
 'recentchangeslinked-feed' => 'Àtúnṣe tó báramu',
 'recentchangeslinked-toolbox' => 'Àtúnṣe tó báramu',
 'recentchangeslinked-title' => 'Àtúnṣe tó báramu mọ́ "$1"',
-'recentchangeslinked-noresult' => 'Kò sí ìyàtọ̀ nínú àwọn ojúewé ìjápọ̀ láàrin ìgbà tí ẹ sọ.',
 'recentchangeslinked-summary' => "Àkójọ àwọn àtúnṣe tí a sẹ̀sẹ̀ ṣe sí àwọn ojúewé tó jápọ̀ wá láti ojúewé pàtó kan (tàbí sí ìkan nìnú ẹ̀ka pàtó kan).
 Àwọn ojúewé inú [[Special:Watchlist|ìmójútó yín]] jẹ́ '''kedere'''.",
 'recentchangeslinked-page' => 'Orúkọ ojúewé:',
@@ -1472,7 +1486,7 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iṣẹ́ yín fún yín.',
 'reuploaddesc' => 'Fagilé ìrùsókè kí ó tó padà sí fọ́ọ̀mù ìrùsókè',
 'upload-tryagain' => 'Ìkóólẹ̀ fáìlì ìjúwe aláàtúnṣe',
 'uploadnologin' => 'Ẹ kò tíì wọlé',
-'uploadnologintext' => 'Ẹ gbọ́dọ̀ [[Special:UserLogin|wọlè]] láti rùsókè faili.',
+'uploadnologintext' => 'Ẹ gbọ́dọ̀ [[Special:UserLogin|wọlè]] láti ṣe ìrùsókè faili.',
 'upload_directory_missing' => 'Àpò ìrùsókè ($1) kòsí bẹ́ẹ̀sìni kò le jẹ́ dídá látọwọ́ ẹ̀rọ-ìwọ̀fà.',
 'upload_directory_read_only' => 'Àpò ìrùsókè ($1) kò ṣeékọ sí nínú látọwọ́ ẹ̀rọ-ìwọ̀fà.',
 'uploaderror' => 'Àsìse ìrùsókè',
@@ -1696,7 +1710,6 @@ Fún àbò kúnkún, img_auth.php ti jẹ́ dídálẹ́kun.',
 'http-read-error' => 'Àṣìṣe kíkà HTTP.',
 'http-timed-out' => 'Àsìkò ìtọrọ HTTP ti tán.',
 'http-curl-error' => 'Àsìṣe ìmúwá URL: $1',
-'http-host-unreachable' => 'Kò le dé ibi URL.',
 'http-bad-status' => 'Ìṣòro kan ṣẹlẹ̀ nìgbà ìtọrọ HTTP: $1, $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1849,12 +1862,6 @@ Tó bá jẹ́ jíjọ̀ gẹ́gẹ́bí oníṣe, àwọn fáìlì tí oníṣe
 'statistics-users-active-desc' => 'Àwọn oníṣe tí wọ́n ti ṣe ìgbéṣe kan ní {{PLURAL:$1|ọjọ́ kan|ọjọ́ $1}} sẹ́yìn',
 'statistics-mostpopular' => 'Àwọn ojúewé tí wọ́n jẹ́ wíwò jùlọ',
 
-'disambiguations' => 'Àwọn ojúewé tó jápọ̀ mọ́ àwọn ojúewé ìṣeojútùú',
-'disambiguationspage' => 'Template:ojútùú',
-'disambiguations-text' => "Àwọn ojúewé ìsàlẹ̀ yìí, ó kéréjù ní àjápọ̀ kan sí '''ojúewé ìṣeojúùtú'''.
-Ó yẹ kí wọn ó jápọ̀ sí ojúewé tó yẹ wọ́n.<br />
-Ojúewé kan jẹ́ ṣíṣe bíi ojúewé ìṣeojúùtú tí ó bá lo àdàkọ tó jápọ̀ láti [[MediaWiki:Disambiguationspage]].",
-
 'pageswithprop' => 'Àwọn ojúewé tó ní ohun-ìní ojúewé',
 'pageswithprop-legend' => 'Àwọn ojúewé tó ní ohun-ìní ojúewé',
 'pageswithprop-text' => 'Ojúewé yìí ṣe àtòjọ àwọn ojúewé tó únlo ohun-ìní ojúewé pàtò kan.',
@@ -2109,10 +2116,9 @@ A óò ṣ\'àkójọ àwọn àtúnṣe ọjọ́wajú sí ojúewé yìí àti
 'unwatchthispage' => "Já'wọ́ ìmójútó ojúewé yi",
 'notanarticle' => 'Kìí ṣe ojúewé àkóónú',
 'notvisiblerev' => 'Àtúnyẹ̀wò gbígbẹ̀yìn látọwọ́ oníṣe míràn ti jẹ́ píparẹ́',
-'watchnochange' => 'Kò sí ìkankan nínú àwọn ohun ìmójútó yín tó jẹ́ títúnṣe láàrin àsìkò títẹ́kalẹ̀.',
 'watchlist-details' => '{{PLURAL:$1|Ojúewé $1|Àwọn ojúewé $1}} ló wà nínú ìmójútó yín, tí a kò bá ka àwọn ojúewé ọ̀rọ̀.',
-'wlheader-enotif' => '* Ìfitónilétí e-mail wà ní gbígbàláyè.',
-'wlheader-showupdated' => "* Àwọn ojúewé tí wọn ti yípadà látìgbà tí ẹ ṣàbẹ̀wò wọn gbẹ̀yìn jẹ́ fífihàn ní ''kedere'''",
+'wlheader-enotif' => 'Ìfitónilétí e-mail wà ní gbígbàláyè.',
+'wlheader-showupdated' => "Àwọn ojúewé tí wọn ti yípadà látìgbà tí ẹ ṣàbẹ̀wò wọn gbẹ̀yìn jẹ́ fífihàn ní ''kedere'''",
 'watchmethod-recent' => 'únwo àwọn àtúnṣe tuntun fún àwọn ojúewé mímójútó',
 'watchmethod-list' => 'únwo àwọn ojúewé mímójútó fún àwọn àtúnṣe tuntun',
 'watchlistcontains' => 'Àwọn ìmójútó yín ní {{PLURAL:$1|ojúewé|àwọn ojúewé}} $1 nínú.',
@@ -2524,11 +2530,8 @@ $1',
 Sùgbọ́n ó jẹ́ dídílọ́nà gẹ́gẹ́bí ìkan nínú ìgbàjá $2, èyí sì ṣe é mọ́ dí lọ́nà mọ́.',
 'ip_range_invalid' => 'Àdìmọ́ IP aláìníìbámu.',
 'ip_range_toolarge' => 'Ìgbàjá ìdínà tó tóbi ju /$1 kò jẹ́ gbígbà ní àyè.',
-'blockme' => 'Dínà mi',
 'proxyblocker' => 'Olùdínà ẹ̀rọ-ìwọ̀fà ẹlòmíràn',
-'proxyblocker-disabled' => 'Ìmúṣe yìí jẹ́ dídálẹ́kun.',
 'proxyblockreason' => 'Àdírẹ́ẹ̀sì IP yín ti jẹ́ dídílọ́nà nítorípé ó jẹ́ ẹ̀rọ alàìlórúkọ ẹlòmíràn ìgboro. Ẹ sọ ìsòro yìí fún olùpèsè ìwọ̀fà Internet yín tàbí aṣeàtìlẹyìn ẹ̀rọ-ìpèsè ibiiṣẹ́ yín.',
-'proxyblocksuccess' => 'Ṣetán',
 'sorbsreason' => 'Àdírẹ́ẹ̀sì IP yín jẹ́ títòjọ bíi ẹ̀rọ-ìwọ̀fà ẹlòmíràn àsíílẹ̀ nínú DNSBL tí {{SITENAME}} lò.',
 'sorbs_create_account_reason' => 'Àdírẹ́ẹ̀sì IP yín jẹ́ títòjọ bíi ẹ̀rọ-ìwọ̀fà ẹlòmíràn àsíílẹ̀ nínú DNSBL tí {{SITENAME}} lò.
 Ẹ kò le dá àpamọ́.',
@@ -2997,6 +3000,16 @@ Tí ẹ bá jẹ́ ó ṣiṣẹ́, ẹ̀rọ sístẹ́mù yín le kó sí ewu.
 'ago' => '$1 sẹ́yìn',
 'just-now' => 'nísinsìnyí',
 
+# Human-readable timestamps
+'monday-at' => 'Ọjọ́ajé ní ago $1',
+'tuesday-at' => 'Ọjọ́ìṣẹ́gun ní ago $1',
+'wednesday-at' => 'Ọjọ́rú ní ago $1',
+'thursday-at' => 'Ọjọ́bọ̀ ní ago $1',
+'friday-at' => 'Ọjọ́ẹtì ní ago $1',
+'saturday-at' => 'Ọjọ́àbámẹ́ta ní ago $1',
+'sunday-at' => 'Ọjọ́àìkú ní ago $1',
+'yesterday-at' => 'Àná ní ago $1',
+
 # Bad image list
 'bad_image_list' => 'Onírú jẹ́ gẹ́gẹ́ bíi àtèlé yìí:
 Àwọn ohun àkójọ nìkan (àwọn ìlà tí wọ́n bẹ̀rẹ̀ pẹ̀lú *) ni wọ́n jẹ́ gbígbérò.
@@ -3025,7 +3038,7 @@ Tóbájẹ́pé fáìlì ọ̀hún ti jẹ́ títúnṣe sí bóṣewà ní bẹ
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Fífẹ̀sí',
 'exif-imagelength' => 'Gígasí',
 'exif-bitspersample' => 'Bit fún àkóónú kọ̀ọ̀kan',
@@ -3147,7 +3160,7 @@ Tóbájẹ́pé fáìlì ọ̀hún ti jẹ́ títúnṣe sí bóṣewà ní bẹ
 'exif-organisationinimage' => 'Àgbájọ tó ṣe',
 'exif-personinimage' => 'Ẹni àfihàn',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Àìtẹ̀pọ̀',
 
 'exif-copyrighted-true' => 'Ó ní ẹ̀tọ́-àwòkọ',
@@ -3430,7 +3443,6 @@ $5
 'version-skins' => 'Skin (Àwọ̀)',
 'version-other' => 'Òmíràn',
 'version-hooks' => 'Àwọn hook',
-'version-extension-functions' => 'Àwọn ìmúṣe ìfàgùn',
 'version-hook-name' => 'Orúkọ hook',
 'version-version' => '(Àtẹ̀jáde $1)',
 'version-license' => 'Ìwé àṣẹ',
@@ -3444,13 +3456,6 @@ $5
 'version-entrypoints-header-entrypoint' => 'Ojú ìwọlé',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Ipaṣẹ̀ fáìlì',
-'filepath-page' => 'Faili:',
-'filepath-submit' => 'Lọ',
-'filepath-summary' => 'Ojúewé pàtàkì yìí úndá gbogbo ipasẹ̀ fáìlì kan padà.
-Àwọn àwòrán únhàn ní kedere, àwọn irú fáìlì míràn jẹ́ bíbẹ̀rẹ̀ pẹ̀lú ètò ìbáṣe wọn tàràtà.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ìṣàwárí fún àwọn fáìlì àdáwòkọ',
 'fileduplicatesearch-summary' => 'Ìṣàwárí fún àwọn fáìlì àdáwòkọ gẹ́gẹ́bí nọ́mbà hash',
diff --git a/languages/messages/MessagesYue.php b/languages/messages/MessagesYue.php
index c19bd068..f0a9494a 100644
--- a/languages/messages/MessagesYue.php
+++ b/languages/messages/MessagesYue.php
@@ -13,6 +13,7 @@
  * @author Kaganer
  * @author KaiesTse
  * @author Mark85296341
+ * @author Nemo bis
  * @author Simon Shek
  * @author Waihorace
  * @author William915
@@ -263,9 +264,6 @@ $messages = array(
 'tog-shownumberswatching' => '顯示有幾多人監視',
 'tog-oldsig' => '原有簽名嘅預覽：',
 'tog-fancysig' => '將簽名以維基字對待（冇自動連結）',
-'tog-externaleditor' => '預設用外掛編輯器（高階者專用，需要響你部電腦度做一啲特別設定。[//www.mediawiki.org/wiki/Manual:External_editors 更多資訊。]）',
-'tog-externaldiff' => '預設用外掛比較器（高階者專用，需要響你部電腦度做一啲特別設定。[//www.mediawiki.org/wiki/Manual:External_editors 更多資訊。]）',
-'tog-showjumplinks' => '啟用 "跳至" 協助連結',
 'tog-uselivepreview' => '用即時預覽（需要JavaScript）（實驗緊）',
 'tog-forceeditsummary' => '我冇入修改註解時通知我',
 'tog-watchlisthideown' => '響監視清單度隱藏我嘅編輯',
@@ -279,6 +277,8 @@ $messages = array(
 'tog-showhiddencats' => '顯示隱藏類',
 'tog-noconvertlink' => '唔轉連結標題',
 'tog-norollbackdiff' => '進行反轉之後略過差異',
+'tog-useeditwarning' => '當我離開未保存好嘅修改嗰陣警告我',
+'tog-prefershttps' => '簽到後繼續用加密連線',
 
 'underline-always' => '全部',
 'underline-never' => '永不',
@@ -463,7 +463,7 @@ $1',
 'pool-queuefull' => '隊池已滿',
 'pool-errorunknown' => '未知嘅錯誤',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '關於{{SITENAME}}',
 'aboutpage' => 'Project:關於',
 'copyright' => '響版度嘅內容係根據$1嘅條款發佈。',
@@ -473,7 +473,6 @@ $1',
 'disclaimers' => '免責聲明',
 'disclaimerpage' => 'Project:一般免責聲明',
 'edithelp' => '編輯協助',
-'edithelppage' => 'Help:編輯',
 'helppage' => 'Help:目錄',
 'mainpage' => '頭版',
 'mainpage-description' => '頭版',
@@ -544,17 +543,6 @@ $1',
 # General errors
 'error' => '錯誤',
 'databaseerror' => '資料庫錯誤',
-'dberrortext' => '資料庫查詢語法錯咗。
-咁係可能指出軟件中可能有臭蟲。
-最後一次資料庫嘅嘗試係：
-<blockquote><tt>$1</tt></blockquote>
-於 "<tt>$2</tt>" 功能中。
-數據庫嘅錯誤回應 "<tt>$3: $4</tt>"。',
-'dberrortextcl' => '資料庫查詢語法錯咗。
-最後一次資料庫嘅嘗試係：
-"$1"
-於 "$2"功能中。
-數據庫嘅錯誤回應 "$3: $4"',
 'laggedslavemode' => '警告：呢頁可能未包括最新嘅更新。',
 'readonly' => '資料庫鎖咗',
 'enterlockreason' => '輸入鎖資料庫嘅原因，同埋預計幾耐後會解鎖',
@@ -600,7 +588,6 @@ $1',
 'viewsourcetext' => '你可以睇吓或者複製呢一頁嘅原始碼：',
 'protectedinterface' => '呢一頁提供軟件嘅介面文字，呢一頁已經保護咗以預防濫用。',
 'editinginterface' => "'''警告：'''你而家編輯緊嘅呢一個用嚟提供介面文字嘅頁面。響呢一頁嘅更改會影響到其他用戶使用中嘅介面外觀。要翻譯，請考慮利用[//translatewiki.net/wiki/Main_Page?setlang=yue translatewiki.net]，一個用來為MediaWiki軟件本地化嘅計劃。",
-'sqlhidden' => '(SQL 查詢隱藏)',
 'cascadeprotected' => '呢一版已經保護咗唔能夠編輯，因為佢係響以下嘅{{PLURAL:$1|一|幾}}頁度包含咗，當中啟用咗"連串"保護選項來保護嗰一版: $2',
 'namespaceprotected' => "你無權編輯響'''$1'''空間名裏面嘅呢一版。",
 'ns-specialprotected' => '特別頁係唔可以編輯嘅。',
@@ -620,7 +607,6 @@ $1',
 'yourpassword' => '密碼:',
 'yourpasswordagain' => '再輸入密碼:',
 'remembermypassword' => '響呢個瀏覽器度記住我嘅登入資料 (最高維持$1{{PLURAL:$1|日|日}})',
-'securelogin-stick-https' => '登入後繼續以HTTPS連接',
 'yourdomainname' => '你嘅網域:',
 'externaldberror' => '驗證資料庫出錯，或者唔允許你更新你嘅外部帳戶。',
 'login' => '登入',
@@ -677,7 +663,7 @@ $1',
 'passwordsent' => '新嘅密碼已經寄咗畀呢位用戶 "$1" 嘅電郵地址。收到之後請重新登入。',
 'blocked-mailpassword' => '你嘅IP地址被鎖住，唔可以用密碼復原功能以防止濫用。',
 'eauthentsent' => '確認電郵已經傳送到指定嘅電郵地址。喺其它嘅郵件傳送到呢個戶口之前，你需要按電郵嘅指示，嚟確認呢個戶口真係屬於你嘅。',
-'throttled-mailpassword' => '一個密碼提醒已經響$1個鐘頭之前發送咗。為咗防止濫用，響$1個鐘頭之內只可以發送一個密碼提醒。',
+'throttled-mailpassword' => '一個密碼提醒已經響$1{{PLURAL:$1|個鐘頭}}之前發送咗。為咗防止濫用，響$1{{PLURAL:$1|個鐘頭}}之內只可以發送一個密碼提醒。',
 'mailerror' => '傳送電郵錯誤： $1',
 'acct_creation_throttle_hit' => '利用你呢個IP地址嘅訪客響上一日已經開咗 $1 個戶口，係響呢段時間嘅上限。
 結果，利用呢個IP地址嘅訪客唔可以響呢段時間再開多個戶口。',
@@ -709,7 +695,7 @@ $1',
 'newpassword' => '新密碼:',
 'retypenew' => '打多次新密碼:',
 'resetpass_submit' => '設定密碼同登入',
-'resetpass_success' => '你嘅密碼已經成功噉改咗！
+'changepassword-success' => '你嘅密碼已經成功噉改咗！
 而家幫你登入緊...',
 'resetpass_forbidden' => '唔可以更改密碼',
 'resetpass-no-info' => '你一定要登入咗去直接入來呢一版。',
@@ -905,6 +891,8 @@ $1',
 'edit-no-change' => '你嘅編輯已經略過，因為文字無改過。',
 'edit-already-exists' => '唔可以開一新版。
 佢已經存在。',
+'editwarning-warning' => '離開呢一版會令到你嘅修改唔見咗。
+你可以響你嘅喜好設定嘅"{{int:prefs-editing}}"小節度停用呢個警告。',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => '警告: 呢一版有太多耗費嘅語法功能呼叫。
@@ -1122,7 +1110,6 @@ $1",
 'searchmenu-legend' => '搵嘢選項',
 'searchmenu-exists' => "'''響呢個wiki度有一版叫做\"[[:\$1]]\"。'''",
 'searchmenu-new' => "'''響呢個wiki度開呢版\"[[:\$1]]\"！'''",
-'searchhelp-url' => 'Help:目錄',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|去睇以呢個做開頭嘅版]]',
 'searchprofile-articles' => '內容頁',
 'searchprofile-project' => '幫手同計劃頁',
@@ -1164,14 +1151,6 @@ $1",
 'search-external' => '出面搵嘢',
 'searchdisabled' => '{{SITENAME}}嘅搜尋功能已經關閉。你可以利用Google嚟搵。不過佢哋對{{SITENAME}}嘅索引可能唔係最新嘅。',
 
-# Quickbar
-'qbsettings' => '快捷列',
-'qbsettings-none' => '無',
-'qbsettings-fixedleft' => '左邊固定',
-'qbsettings-fixedright' => '右邊固定',
-'qbsettings-floatingleft' => '左邊浮動',
-'qbsettings-floatingright' => '右邊浮動',
-
 # Preferences page
 'preferences' => '喜好設定',
 'mypreferences' => '自訂喜好',
@@ -1201,7 +1180,6 @@ $1",
 'resetprefs' => '清除未保存嘅更改',
 'restoreprefs' => '恢復全部預設設定',
 'prefs-editing' => '編輯中',
-'prefs-edit-boxsize' => '編寫框大細',
 'rows' => '列：',
 'columns' => '行：',
 'searchresultshead' => '搵嘢',
@@ -1212,9 +1190,6 @@ $1",
 'recentchangesdays-max' => '最多 $1 日',
 'recentchangescount' => '預設顯示嘅編輯數：',
 'prefs-help-recentchangescount' => '呢個包埋最近修改、頁歷史同埋日誌紀錄。',
-'prefs-help-watchlist-token' => '響呢欄加入一個秘密匙會生成一個對你監視清單嘅RSS源。
-任何一位知道響呢個欄位嘅匙會睇到你嘅監視清單，請揀一個安全嘅值。
-呢度有一個任意生成嘅值，你係可以去揀嘅: $1',
 'savedprefs' => '你嘅喜好設定已經儲存。',
 'timezonelegend' => '時區:',
 'localtime' => '本地時間:',
@@ -1244,7 +1219,6 @@ $1",
 'prefs-common-css-js' => '共有嘅CSS同埋JavaScript畀所有畫面用：',
 'prefs-reset-intro' => '你可以用呢版去重設你嘅喜好設定到網站預設值。呢個動作無得番轉頭。',
 'prefs-emailconfirm-label' => '電郵確認:',
-'prefs-textboxsize' => '編寫框大細',
 'youremail' => '電郵:',
 'username' => '用戶名:',
 'uid' => '用戶 ID:',
@@ -1476,7 +1450,6 @@ $1",
 'recentchangeslinked-feed' => '連結頁嘅更改',
 'recentchangeslinked-toolbox' => '連結頁嘅更改',
 'recentchangeslinked-title' => '對「$1」有關嘅更改',
-'recentchangeslinked-noresult' => '響呢一段時間內連結頁並無更改。',
 'recentchangeslinked-summary' => "呢一個特別頁列示咗''由''所畀到嘅一版連結到頁嘅最近更改（或者係指定分類嘅成員）。
 響[[Special:Watchlist|你張監視清單]]嘅版會以'''粗體'''顯示。",
 'recentchangeslinked-page' => '頁名:',
@@ -1646,7 +1619,6 @@ $1',
 'http-read-error' => 'HTTP讀取錯誤。',
 'http-timed-out' => 'HTTP請求已過時。',
 'http-curl-error' => '擷取URL嗰陣出錯：$1',
-'http-host-unreachable' => '到唔到URL。',
 'http-bad-status' => '當做緊HTTP請求嗰陣出現咗問題：$1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1789,11 +1761,6 @@ $1',
 'statistics-users-active-desc' => '響$1日前做過動作嘅用戶',
 'statistics-mostpopular' => '最多人睇嘅頁',
 
-'disambiguations' => '搞清楚頁',
-'disambiguationspage' => 'Template:disambig
-Template:搞清楚',
-'disambiguations-text' => "以下呢啲頁面連結去一個'''搞清楚頁'''。佢哋先至應該指去正確嘅主題。<br />如果一個頁面連結自[[MediaWiki:Disambiguationspage]]，噉就會當佢係搞清楚頁。",
-
 'doubleredirects' => '雙重跳轉',
 'doubleredirectstext' => '每一行都順次序寫住第一頁名，佢嘅目的頁，同埋目的頁再指去邊度。改嘅時候，應該將第一個跳轉頁轉入第三頁。
 <del>劃咗</del>嘅項目係已經解決咗嘅。',
@@ -2017,10 +1984,9 @@ Template:搞清楚',
 'unwatchthispage' => '停止監視',
 'notanarticle' => '唔係一個內容頁',
 'notvisiblerev' => '上次由唔同用戶嘅修訂已經刪除咗',
-'watchnochange' => '響顯示嘅時間之內，你所監視嘅頁面並無任何嘅更改。',
 'watchlist-details' => '唔計討論頁，有 $1 版響你個監視清單度。',
-'wlheader-enotif' => '* 電子郵件通知已經啟用。',
-'wlheader-showupdated' => "* '''粗體字'''嘅頁響你上次嚟之後被人改過",
+'wlheader-enotif' => '電子郵件通知已經啟用。',
+'wlheader-showupdated' => "'''粗體字'''嘅頁響你上次嚟之後被人改過",
 'watchmethod-recent' => '睇緊最近修改中有邊頁監視緊',
 'watchmethod-list' => '睇緊被監視頁有乜新修改',
 'watchlistcontains' => '你嘅監視清單裏面有$1頁。',
@@ -2362,11 +2328,8 @@ $1',
 'ipb_blocked_as_range' => '錯誤：個IP $1 無直接封鎖，唔可以解封。但係佢係響 $2 嘅封鎖範圍之內，嗰段範圍係可以解封嘅。',
 'ip_range_invalid' => '無效嘅IP範圍',
 'ip_range_toolarge' => '大過 /$1 嘅封鎖範圍係唔容許嘅。',
-'blockme' => '封鎖我',
 'proxyblocker' => 'Proxy 封鎖器',
-'proxyblocker-disabled' => '呢個功能已經停用。',
 'proxyblockreason' => '你嘅IP係一個公開（指任何人都可以用，無須身份認證？）嘅代理地址，因此被封鎖。請聯絡你嘅Internet服務提供商或技術支援，向佢哋報告呢個嚴重嘅安全問題。',
-'proxyblocksuccess' => '完成。',
 'sorbsreason' => '你嘅IP地址已經畀響{{SITENAME}}度用嘅DNSBL列咗做公開代理。',
 'sorbs_create_account_reason' => '你嘅IP地址已經畀響{{SITENAME}}度用嘅DNSBL列咗做公開代理。你唔可以開新戶口。',
 'cant-block-while-blocked' => '當你被封鎖嗰陣唔可以封鎖其他用戶。',
@@ -2646,27 +2609,16 @@ $1',
 
 # Stylesheets
 'common.css' => '/* 響呢度放 CSS 碼來改成個網站嘅畫面 */',
-'standard.css' => '/* 響呢度放 CSS 碼去改用戶用嘅傳統畫面 */',
-'nostalgia.css' => '/* 響呢度放 CSS 碼去改用戶用嘅懷舊畫面 */',
 'cologneblue.css' => '/* 響呢度放 CSS 碼去改用戶用嘅科隆藍畫面 */',
 'monobook.css' => '/* 響呢度放 CSS 碼去改用戶用嘅 Monobook 畫面 */',
-'myskin.css' => '/* 響呢度放 CSS 碼去改用戶用嘅我嘅畫面 */',
-'chick.css' => '/* 響呢度放 CSS 碼去改用戶用嘅俏畫面 */',
-'simple.css' => '/* 響呢度放 CSS 碼去改用戶用嘅簡單畫面 */',
 'modern.css' => '/* 響呢度放 CSS 碼去改用戶用嘅摩登畫面 */',
 'vector.css' => '/* 響呢度放 CSS 碼去改用戶用嘅域達畫面 */',
 'print.css' => '/* 響呢度放 CSS 碼去改打印輸出 */',
-'handheld.css' => '/* 響呢度放 CSS 碼去改響 $wgHandheldStyle 設定手提裝置畫面 */',
 
 # Scripts
 'common.js' => '/* 響每一次個頁面載入時，所有用戶都會載入呢度任何嘅JavaScript。 */',
-'standard.js' => '/* 響每一次個頁面載入時，用標準畫面嘅用戶都會載入呢度任何嘅JavaScript */',
-'nostalgia.js' => '/* 響每一次個頁面載入時，用懷舊畫面嘅用戶都會載入呢度任何嘅JavaScript */',
 'cologneblue.js' => '/* 響每一次個頁面載入時，用科隆藍畫面嘅用戶都會載入呢度任何嘅JavaScript */',
 'monobook.js' => '/* 響每一次個頁面載入時，用 Monobook 畫面嘅用戶都會載入呢度任何嘅JavaScript */',
-'myskin.js' => '/* 響每一次個頁面載入時，用我嘅畫面嘅用戶都會載入呢度任何嘅JavaScript */',
-'chick.js' => '/* 響每一次個頁面載入時，用俏畫面嘅用戶都會載入呢度任何嘅JavaScript */',
-'simple.js' => '/* 響每一次個頁面載入時，用簡單畫面嘅用戶都會載入呢度任何嘅JavaScript */',
 'modern.js' => '/* 響每一次個頁面載入時，用摩登畫面嘅用戶都會載入呢度任何嘅JavaScript */',
 'vector.js' => '/* 響每一次個頁面載入時，用域達畫面嘅用戶都會載入呢度任何嘅JavaScript */',
 
@@ -2695,13 +2647,8 @@ $1',
 'spam_blanking' => '全部版本都含有指去$1嘅連結，留空',
 
 # Skin names
-'skinname-standard' => '傳統',
-'skinname-nostalgia' => '懷舊',
 'skinname-cologneblue' => '科隆藍',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => '我嘅畫面',
-'skinname-chick' => '俏',
-'skinname-simple' => '簡單',
 'skinname-modern' => '摩登',
 'skinname-vector' => 'Vector',
 
@@ -2765,6 +2712,12 @@ $1',
 'bydate' => '以時間',
 'sp-newimages-showfrom' => '顯示由$1 $2嘅新檔',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'hours' => '$1{{PLURAL:$1|個鐘}}',
+
+# Human-readable timestamps
+'hours-ago' => '$1{{PLURAL:$1|個鐘}}之前',
+
 # Bad image list
 'bad_image_list' => '請根據下面嘅格式去寫:
 
@@ -2818,7 +2771,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '闊',
 'exif-imagelength' => '高',
 'exif-bitspersample' => '每部位位元數',
@@ -2934,7 +2887,7 @@ Variants for Chinese language
 'exif-gpsdifferential' => 'GPS 差動修正',
 'exif-objectname' => '短標題',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '未壓過',
 
 'exif-unknowndate' => '未知日期',
@@ -3069,7 +3022,7 @@ Variants for Chinese language
 'exif-gpsmeasuremode-3' => '三維量度',
 
 # Pseudotags used for GPSSpeedRef
-'exif-gpsspeed-k' => '千米/小時',
+'exif-gpsspeed-k' => '公里/小時',
 'exif-gpsspeed-m' => '英里/小時',
 'exif-gpsspeed-n' => '浬/小時',
 
@@ -3244,7 +3197,6 @@ $5
 'version-other' => '其他',
 'version-mediahandlers' => '媒體處理器',
 'version-hooks' => '鈎',
-'version-extension-functions' => '擴展函數',
 'version-parser-extensiontags' => '語法擴展標籤',
 'version-parser-function-hooks' => '語法函數鈎',
 'version-hook-name' => '鈎名',
@@ -3262,12 +3214,6 @@ MediaWiki是基於使用目的而加以發佈，但係就唔會負上任何嘅
 'version-software-product' => '產品',
 'version-software-version' => '版本',
 
-# Special:FilePath
-'filepath' => '檔案路徑',
-'filepath-page' => '檔名:',
-'filepath-submit' => '去',
-'filepath-summary' => '呢個特別頁拎一個檔案嘅完整路徑。圖像會以完整嘅解像度顯示，其它嘅檔案類型會以同佢哋關聯咗嘅程式啟動。',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '㨂重覆檔案',
 'fileduplicatesearch-summary' => '用重覆檔案嘅切細值去搵個檔案係唔係重覆。',
@@ -3367,4 +3313,7 @@ MediaWiki是基於使用目的而加以發佈，但係就唔會負上任何嘅
 'searchsuggest-search' => '搵嘢',
 'searchsuggest-containing' => '名單傳送緊...',
 
+# Durations
+'duration-hours' => '$1{{PLURAL:$1|個鐘}}',
+
 );
diff --git a/languages/messages/MessagesZea.php b/languages/messages/MessagesZea.php
index 2715b8f1..c14af626 100644
--- a/languages/messages/MessagesZea.php
+++ b/languages/messages/MessagesZea.php
@@ -73,9 +73,6 @@ $messages = array(
 'tog-shownumberswatching' => "'t Antal gebrukers weerheven 't a deêze pahina volg",
 'tog-oldsig' => 'Bestaende onderteêkenienge',
 'tog-fancysig' => "As wikitekst behandel'n (zonder automaotische verwiezienge ni de gebrukersbladzie)",
-'tog-externaleditor' => 'Standard een externe tekstbewerker gebruken (alleêne vò experts - vò deêze functie ben speciaole ienstellienge nudig. [//www.mediawiki.org/wiki/Manual:External_editors Meê informaosie]).',
-'tog-externaldiff' => 'Standard een extern verheliekiengsprohramma gebruken (alleên vò experts - vò deêze functie ben speciaole ienstelliengen nudig. [//www.mediawiki.org/wiki/Manual:External_editors Meê informaosie]).',
-'tog-showjumplinks' => '“hi nae”-toehankelijkeidslienks inschaokelen',
 'tog-uselivepreview' => '“live voevertoônienge” gebruken (JavaScript vereist – experimenteêl)',
 'tog-forceeditsummary' => 'Heef me een meldieng bie een lehe saemenvattieng',
 'tog-watchlisthideown' => 'Eihen bewerkiengen op men volglieste verberhen',
@@ -273,7 +270,7 @@ $1",
 'pool-queuefull' => 'De wachtrieë von de poel is vaol',
 'pool-errorunknown' => "Er is 'n onbekande fout ophetreed'n",
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => 'Over {{SITENAME}}',
 'aboutpage' => 'Project:Info',
 'copyright' => 'Den inoud is beschikbaer onder de $1.',
@@ -283,7 +280,6 @@ $1",
 'disclaimers' => 'Voebehoud',
 'disclaimerpage' => 'Project:Alhemeên voebehoud',
 'edithelp' => "Ulpe bie't bewerken",
-'edithelppage' => 'Help:Bewerken',
 'helppage' => 'Help:Inoud',
 'mainpage' => 'Vòblad',
 'mainpage-description' => 'Vòblad',
@@ -350,17 +346,6 @@ Een lieste mie speciaole pagina’s sti op [[Special:SpecialPages|speciaole pagi
 # General errors
 'error' => 'Fout',
 'databaseerror' => 'Databasefout',
-'dberrortext' => "Der is een syntaxisfout in 't databaseverzoek opetreeën.
-Meuhlijk zit der een fout in de software.
-'t Lèste verzoek an de database was:
-<blockquote><tt>$1</tt></blockquote>
-vanuut de functie “<tt>$2</tt>”.
-MySQL haf de foutmeldieng “<tt>$3: $4</tt>”.",
-'dberrortextcl' => "Der is een syntaxisfout in 't databaseverzoek opetreeën.
-'t Lèste verzoek an de database was:
-“$1”
-vanuut de functie “$2”.
-MySQL haf de volhende foutmeldieng: “$3: $4”",
 'laggedslavemode' => "Waerschuwieng: de pahina zou verouwerd kunn'n zien.",
 'readonly' => 'Database heblokkeerd',
 'enterlockreason' => 'Heef een reeën op voe de blokkaode en heef op wunnir a die warschijnlijk wor opeheven',
@@ -404,7 +389,6 @@ Probeer 't over een antal menuten wee.",
 'viewsourcetext' => 'Je kan de brontekst van deêze pagina bekieken en kopiëren:',
 'protectedinterface' => "Deêze pagina bevat tekst voe berichen van de software en is beveiligd om misbruuk te voorkomm'n.",
 'editinginterface' => "'''Waerschuwienge:''' Je bewerk een pagina die a gebruukt wor deur de software. Bewerkiengen op deêze pagina beïnvloeden de gebrukersinterface van iedereên. Overweeg voe vertaeliengen om [//translatewiki.net/wiki/Main_Page?setlang=zea translatewiki.net] te gebruken, 't vertaeliengsproject voe MediaWiki.",
-'sqlhidden' => '(SQL-zoekopdracht verborhen)',
 'cascadeprotected' => "Deêze pagina kan nie bewerkt worn, omda 't een is openomen in de volhende {{PLURAL:$1|pagina|pagina's}} die beveiligd {{PLURAL:$1|is|zien}} mie de cascaode-optie:
 $2",
 'namespaceprotected' => "Je ei hin rechen om pagina's in de naemruumte '''$1''' te bewerken.",
@@ -495,7 +479,7 @@ Neheer dit bericht as deêze gebruker zonder joe medeweten is anemikt.',
 'newpassword' => 'Nieuw wachtwoôrd:',
 'retypenew' => 'Herhaolieng nieuwe wachtwoôrd:',
 'resetpass_submit' => "Wachtwoôrd instell'n en anmelden",
-'resetpass_success' => 'Je wachtwoord is ewiezigd. Bezig mie anmelden ...',
+'changepassword-success' => 'Je wachtwoord is ewiezigd. Bezig mie anmelden ...',
 'resetpass_forbidden' => "Wachtwoôrden kunn'n op {{SITENAME}} nie ewiezigd worn",
 
 # Edit page toolbar
@@ -811,7 +795,6 @@ Zurg da je bie deêze wiezigieng de heschiedenisdeurloôpendeid van de pagina be
 'viewprevnext' => 'Bekiek ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Er is 'n pagina genaemd \"[[:\$1]]\" op deêze wiki.'''",
 'searchmenu-new' => "'''De pagina \"[[:\$1]]\" anmaek'n op deêze wiki.'''",
-'searchhelp-url' => 'Help:Inoud',
 'searchprofile-articles' => "Inhoudelike pagina's",
 'searchprofile-project' => "Hilp- en projectpagina's",
 'searchprofile-images' => 'Multimedia',
@@ -842,14 +825,6 @@ Zurg da je bie deêze wiezigieng de heschiedenisdeurloôpendeid van de pagina be
 Je kan gebruuk maeken van Google.
 De hehevens over {{SITENAME}} zien meuhlijk nie bie'ewerkt.",
 
-# Quickbar
-'qbsettings' => 'Menubalke',
-'qbsettings-none' => 'Uuteschaokeld',
-'qbsettings-fixedleft' => 'Lienks vast',
-'qbsettings-fixedright' => 'Rechs vast',
-'qbsettings-floatingleft' => 'Lienks zwevend',
-'qbsettings-floatingright' => 'Rechs zwevend',
-
 # Preferences page
 'preferences' => 'Vòkeuren',
 'mypreferences' => 'Mien vòkeuren',
@@ -991,7 +966,6 @@ Een nie anekruusd vienkvakje beteêken da de gebruker hin lid is van de hroep.",
 'recentchangeslinked-feed' => 'Gerelateerde bewerkiengen',
 'recentchangeslinked-toolbox' => 'Gerelateerde bewerkiengen',
 'recentchangeslinked-title' => 'Wiezigiengen verwant an "$1"',
-'recentchangeslinked-noresult' => "Der zien hin bewerkiengen in de heheven periode ewist op de pagina's die an vanaf ier elienkt worn.",
 'recentchangeslinked-summary' => "Deze speciaole pagina geeft de laetste bewerkiengen weer op pagina's waerheê verwezen òdt vanof 'n angegeven pagina of vanuut pagina's in 'n angegeven categorie.
 Pagina's die op [[Special:Watchlist|je volglieste]] staen wòdde '''vet''' weergegeven.",
 'recentchangeslinked-page' => 'Paginanaem:',
@@ -1062,8 +1036,6 @@ De [$2 pagina mè de bestandsbeschrievienge] wòdt hieronder weergegeev'n.",
 # Statistics
 'statistics' => "Stattistiek'n",
 
-'disambiguationspage' => 'Template:Deurverwiespagina',
-
 'brokenredirectstext' => 'De volgende deuverwieziengen stiere deu nae bladzie die nie bestae:',
 
 # Miscellaneous special pages
@@ -1136,7 +1108,6 @@ A je de bladzie laeter weêr van je volglieste afaele wil, klik dan op \"nie me
 'watch' => 'Volg',
 'watchthispage' => 'Bekiek deêze bladzie',
 'unwatch' => 'Nie meêr volge',
-'watchnochange' => "D'r is in d'n opgevrogen tied niks op je volglieste veranderd.",
 'watchlist-details' => "Er {{PLURAL:$1|sti eên pagina|staen $1 pagina's}} op je volglieste, exclusief overlegpagina's.",
 'watchlistcontains' => 'Uw volglieste bevat $1 {{PLURAL:$1|bladzie|bladzies}}.',
 'wlshowlast' => 'Laetste $1 uur, $2 daegen bekieken ($3)',
diff --git a/languages/messages/MessagesZh_hans.php b/languages/messages/MessagesZh_hans.php
index dadd9049..9d66edec 100644
--- a/languages/messages/MessagesZh_hans.php
+++ b/languages/messages/MessagesZh_hans.php
@@ -33,6 +33,7 @@
  * @author Hydra
  * @author Hzy980512
  * @author Jding2010
+ * @author Jetlag
  * @author Jidanni
  * @author Jimmy xu wrk
  * @author Kaganer
@@ -58,6 +59,7 @@
  * @author Simon Shek
  * @author Slboat
  * @author StephDC
+ * @author Stevenliuyi
  * @author Supaiku
  * @author Tommyang
  * @author Waihorace
@@ -125,15 +127,15 @@ $namespaceAliases = array(
 
 $specialPageAliases = array(
 	'Activeusers'               => array( '活跃用户' ),
-	'Allmessages'               => array( '所有消息' ),
+	'Allmessages'               => array( '所有信息' ),
 	'Allpages'                  => array( '所有页面' ),
-	'Ancientpages'              => array( '最早页面' ),
+	'Ancientpages'              => array( '最老页面' ),
 	'Badtitle'                  => array( '无效标题' ),
 	'Blankpage'                 => array( '空白页面' ),
 	'Block'                     => array( '封禁用户' ),
 	'Blockme'                   => array( '自我封禁' ),
 	'Booksources'               => array( '网络书源' ),
-	'BrokenRedirects'           => array( '损坏的重定向页' ),
+	'BrokenRedirects'           => array( '受损重定向页' ),
 	'Categories'                => array( '页面分类' ),
 	'ChangeEmail'               => array( '修改邮箱' ),
 	'ChangePassword'            => array( '修改密码' ),
@@ -387,9 +389,6 @@ $messages = array(
 'tog-shownumberswatching' => '显示监视用户数',
 'tog-oldsig' => '当前签名：',
 'tog-fancysig' => '将签名视为维基文本（不自动生成链接）',
-'tog-externaleditor' => '默认使用外部编辑器（供高级用户使用，需要在您的计算机上做特别设置。[//www.mediawiki.org/wiki/Manual:External_editors 更多信息。]）',
-'tog-externaldiff' => '默认使用外部版本差异工具（供高级用户使用，需要在您的计算机上做特别设置。[//www.mediawiki.org/wiki/Manual:External_editors 更多信息。]）',
-'tog-showjumplinks' => '启用“跳转到”访问链接',
 'tog-uselivepreview' => '使用实时预览（实验）',
 'tog-forceeditsummary' => '未输入编辑摘要时提醒我',
 'tog-watchlisthideown' => '隐藏监视列表中的我的编辑',
@@ -403,6 +402,8 @@ $messages = array(
 'tog-showhiddencats' => '显示隐藏分类',
 'tog-noconvertlink' => '停用链接文字转换',
 'tog-norollbackdiff' => '执行回退后不显示差异',
+'tog-useeditwarning' => '当我离开有未保存更改的编辑页面时提醒我',
+'tog-prefershttps' => '登录时始终使用安全连接',
 
 'underline-always' => '始终',
 'underline-never' => '从不',
@@ -466,6 +467,18 @@ $messages = array(
 'oct' => '10月',
 'nov' => '11月',
 'dec' => '12月',
+'january-date' => '1月$1日',
+'february-date' => '2月$1日',
+'march-date' => '3月$1日',
+'april-date' => '4月$1日',
+'may-date' => '5月$1日',
+'june-date' => '6月$1日',
+'july-date' => '7月$1日',
+'august-date' => '8月$1日',
+'september-date' => '9月$1日',
+'october-date' => '10月$1日',
+'november-date' => '11月$1日',
+'december-date' => '12月$1日',
 
 # Categories related messages
 'pagecategories' => '$1个分类',
@@ -548,6 +561,7 @@ $messages = array(
 'create-this-page' => '创建本页',
 'delete' => '删除',
 'deletethispage' => '删除本页',
+'undeletethispage' => '恢复本页',
 'undelete_short' => '恢复$1个编辑',
 'viewdeleted_short' => '查看$1个被删除的编辑',
 'protect' => '保护',
@@ -589,7 +603,7 @@ $1',
 'pool-queuefull' => '请求队列已满',
 'pool-errorunknown' => '未知错误',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '关于{{SITENAME}}',
 'aboutpage' => 'Project:关于',
 'copyright' => '除非另有声明，本网站内容采用$1授权。',
@@ -599,7 +613,6 @@ $1',
 'disclaimers' => '免责声明',
 'disclaimerpage' => 'Project:免责声明',
 'edithelp' => '编辑帮助',
-'edithelppage' => 'Help:编辑',
 'helppage' => 'Help:目录',
 'mainpage' => '首页',
 'mainpage-description' => '首页',
@@ -675,15 +688,11 @@ $1',
 # General errors
 'error' => '出错',
 'databaseerror' => '数据库错误',
-'dberrortext' => '发生数据库查询语法错误。
-可能是由于软件自身的错误所引起。
-最后一次数据库查询指令是：
-<blockquote><code>$1</code></blockquote>
-来自于函数“<code>$2</code>”。
-数据库返回错误“<samp>$3: $4</samp>”。',
-'dberrortextcl' => '发生了数据库查询语法错误。最后一次数据库查询指令是：
-“$1”
-来自函数“$2”内。数据库返回错误“$3: $4”。',
+'databaseerror-text' => '数据库查询出错。这可能表明软件中存在漏洞（bug）。',
+'databaseerror-textcl' => '数据库查询出错。',
+'databaseerror-query' => '查询：$1',
+'databaseerror-function' => '函数：$1',
+'databaseerror-error' => '出错：$1',
 'laggedslavemode' => "'''警告：'''页面可能没有包含最近的更新。",
 'readonly' => '数据库被锁定',
 'enterlockreason' => '请输入锁定的原因（包括预计解锁的时间）',
@@ -715,6 +724,7 @@ $1',
 它可能已被其他人删除了。',
 'cannotdelete-title' => '无法删除“$1”',
 'delete-hook-aborted' => '删除被扩展钩子取消。钩子并没有给出解释。',
+'no-null-revision' => '无法创建对"$1"页面新的空白修订',
 'badtitle' => '错误标题',
 'badtitletext' => '所请求页面的标题是无效的、不存在，跨语言或跨wiki链接的标题错误。它可能包含一个或更多的不能用于标题的字符。',
 'perfcached' => '下列数据已缓存，但可能已过时。最高{{PLURAL:$1|一个结果|$1个结果}}在缓存中可用。',
@@ -736,12 +746,15 @@ $1',
 'editinginterface' => "'''警告：'''您正在编辑的页面是用于提供软件的界面文字。
 改变此页将影响其他在此wiki上的用户界面外观。
 如欲修改所有wiki的翻译，请到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化计划。",
-'sqlhidden' => '（SQL查询已隐藏）',
 'cascadeprotected' => '此页面已被保护，因为这个页面被以下已标注“联锁保护”的{{PLURAL:$1|一个|多个}}被保护页面包含：
 $2',
 'namespaceprotected' => "您没有权限编辑'''$1'''名字空间内的页面。",
 'customcssprotected' => '您没有权限编辑此CSS页面，因为它包含另一位用户的个人设置。',
 'customjsprotected' => '您没有权限编辑此JavaScript页面，因为它包含另一位用户的个人设置。',
+'mycustomcssprotected' => '您没有权限编辑这个 CSS 页面。',
+'mycustomjsprotected' => '您没有权限编辑这个 JavaScript 页面。',
+'myprivateinfoprotected' => '您没有权限来编辑您的私人信息。',
+'mypreferencesprotected' => '您没有权限来编辑您的个人设置。',
 'ns-specialprotected' => '特殊页面不可编辑。',
 'titleprotected' => '此标题已被[[User:$1|$1]]保护以防止创建。理由是“$2”。',
 'filereadonlyerror' => '因为媒体库$2处于只读模式而无法修改文件$1。
@@ -764,10 +777,19 @@ $2',
 'welcomeuser' => '欢迎，$1！',
 'welcomecreation-msg' => '你的账户已创建。请不要忘记更改你的[[Special:Preferences|{{SITENAME}}设置]]。',
 'yourname' => '用户名：',
+'userlogin-yourname' => '用户名',
+'userlogin-yourname-ph' => '请输入你的用户名',
+'createacct-another-username-ph' => '请输入用户名',
 'yourpassword' => '密码：',
+'userlogin-yourpassword' => '密码',
+'userlogin-yourpassword-ph' => '请输入你的密码',
+'createacct-yourpassword-ph' => '请输入一个密码',
 'yourpasswordagain' => '请再次输入密码：',
+'createacct-yourpasswordagain' => '确认密码',
+'createacct-yourpasswordagain-ph' => '请再次输入密码',
 'remembermypassword' => '在该浏览器记住我的登录状态（最长$1天）',
-'securelogin-stick-https' => '登录后继续使用HTTPS连接',
+'userlogin-remembermypassword' => '记住我的登录状态',
+'userlogin-signwithsecure' => '使用安全连接',
 'yourdomainname' => '您的域名：',
 'password-change-forbidden' => '您不能在本wiki上更改密码。',
 'externaldberror' => '验证数据库出错或您被禁止更新您的外部账号。',
@@ -779,17 +801,43 @@ $2',
 'logout' => '退出',
 'userlogout' => '退出',
 'notloggedin' => '未登录',
+'userlogin-noaccount' => '没有账户？',
+'userlogin-joinproject' => '加入{{SITENAME}}',
 'nologin' => '没有账户？$1。',
 'nologinlink' => '创建账户',
 'createaccount' => '创建账户',
 'gotaccount' => '已经拥有账户？请$1。',
 'gotaccountlink' => '登录',
 'userlogin-resetlink' => '忘记你的登录信息？',
+'userlogin-resetpassword-link' => '重置你的密码',
+'helplogin-url' => 'Help:登录',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登录帮助]]',
+'userlogin-loggedin' => '您已经作为{{GENDER:$1|$1}}登录。
+使用以下表单以作为另一账户登录。',
+'userlogin-createanother' => '创建另一个帐户',
+'createacct-join' => '请在下面输入你的信息。',
+'createacct-another-join' => '在下方输入新帐户信息。',
+'createacct-emailrequired' => '电子邮件地址',
+'createacct-emailoptional' => '电子邮件地址（可选）',
+'createacct-email-ph' => '请输入您的电子邮件地址',
+'createacct-another-email-ph' => '输入电子邮件地址',
 'createaccountmail' => '使用一个临时的随机密码并将其发送到指定的电子邮件地址中',
+'createacct-realname' => '真实姓名 (可选)',
 'createaccountreason' => '原因：',
+'createacct-reason' => '原因',
+'createacct-reason-ph' => '为什么您要创建另一个帐户',
+'createacct-captcha' => '安全检查',
+'createacct-imgcaptcha-ph' => '请输入上图中的文字',
+'createacct-submit' => '创建您的账户',
+'createacct-another-submit' => '创建另一个帐户',
+'createacct-benefit-heading' => '{{SITENAME}}是由像您这样的人建立的。',
+'createacct-benefit-body1' => '{{PLURAL:$1|编辑}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|页面}}',
+'createacct-benefit-body3' => '最近{{PLURAL:$1|贡献者}}',
 'badretype' => '您所输入的密码并不相同。',
 'userexists' => '用户名已存在。请使用其他名称。',
 'loginerror' => '登录错误',
+'createacct-error' => '账户创建出错',
 'createaccounterror' => '无法建立账户：$1',
 'nocookiesnew' => '该用户帐户已被创建，但登录失败。{{SITENAME}}使用Cookie实现用户登录。您已禁用Cookie，请启用Cookie，然后使用你的新用户名与密码登录。',
 'nocookieslogin' => '{{SITENAME}}使用Cookie实现用户登录。您已停用Cookie。请启用Cookie后再试。',
@@ -838,10 +886,12 @@ $2',
 
 如果该账户创建错误的话，您可以忽略此信息。',
 'usernamehasherror' => '用户名中不可包含哈希（hash）字符',
-'login-throttled' => '你最近尝试登录的次数过多。请稍后重试。',
+'login-throttled' => '你最近尝试登录的次数过多。请等待$1后再试。',
 'login-abort-generic' => '登录失败 - 已终止',
 'loginlanguagelabel' => '语言：$1',
 'suspicious-userlogout' => '注销请求被拒绝，因为它似乎是由有设计缺陷的浏览器或缓存代理发出的。',
+'createacct-another-realname-tip' => '真实姓名是选填项目。
+如果你选择提供它，它将会用于贡献署名。',
 
 # Email sending
 'php-mail-error-unknown' => '在 PHP 的 mail() 函数中的未知错误',
@@ -857,8 +907,7 @@ $2',
 'newpassword' => '新密码：',
 'retypenew' => '确认密码：',
 'resetpass_submit' => '设定密码并登录',
-'resetpass_success' => '您的密码已经更改成功！
-现在将带您登录...',
+'changepassword-success' => '您已经修改了您的密码！',
 'resetpass_forbidden' => '无法更改密码',
 'resetpass-no-info' => '您必须登录后直接进入这个页面。',
 'resetpass-submit-loggedin' => '更改密码',
@@ -869,10 +918,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => '重置密码',
-'passwordreset-text' => '完成该表格以重设你的密码。',
+'passwordreset-text-one' => '请输入你要重置的用户名。',
+'passwordreset-text-many' => '{{PLURAL:$1|填充部分字段以重置您的密码。}}',
 'passwordreset-legend' => '重置密码',
 'passwordreset-disabled' => '此Wiki已经禁用密码重置。',
-'passwordreset-pretext' => '{{PLURAL:$1||输入下面的数据项之一}}',
+'passwordreset-emaildisabled' => '此Wiki上无法使用邮件功能。',
 'passwordreset-username' => '用户名：',
 'passwordreset-domain' => '域：',
 'passwordreset-capture' => '查看生成的电子邮件吗？',
@@ -893,7 +943,7 @@ $2
 临时密码：$2',
 'passwordreset-emailsent' => '密码重置邮件已发送。',
 'passwordreset-emailsent-capture' => '密码重设电子邮件已发送，并在下面显示。',
-'passwordreset-emailerror-capture' => '生成的提醒电子邮件如下所示，但发送失败：$1',
+'passwordreset-emailerror-capture' => '重置密码邮件已生成，但是无法向{{GENDER:$2|下列用户}} 发送：$1',
 
 # Special:ChangeEmail
 'changeemail' => '更改电子邮件地址',
@@ -908,6 +958,19 @@ $2
 'changeemail-submit' => '更改电子邮件地址',
 'changeemail-cancel' => '取消',
 
+# Special:ResetTokens
+'resettokens' => '重置权标',
+'resettokens-text' => '您可以重置权标，其允许访问某些与您的帐户相关联的私人数据。
+
+如果您意外地与他人共享权标，或您的帐户已遭到破坏，您应该重置权标。',
+'resettokens-no-tokens' => '没有可重置得权标。',
+'resettokens-legend' => '重置权标',
+'resettokens-tokens' => '权标：',
+'resettokens-token-label' => '$1（当前值：$2）',
+'resettokens-watchlist-token' => '请在[[Special:Watchlist|您的监视列表]]中更改Web订阅（Atom或RSS）的权标',
+'resettokens-done' => '权标已重置。',
+'resettokens-resetbutton' => '重置所选的权标',
+
 # Edit page toolbar
 'bold_sample' => '粗体文字',
 'bold_tip' => '粗体文字',
@@ -1074,12 +1137,14 @@ $2
 它可能刚刚被删除。',
 'edit-conflict' => '编辑冲突。',
 'edit-no-change' => '因为没有文字更改，你的编辑已被忽略。',
+'postedit-confirmation' => '你的编辑已保存。',
 'edit-already-exists' => '不可以建立一个新页面。
 它已经存在。',
 'defaultmessagetext' => '默认消息文本',
 'content-failed-to-parse' => '未能将 $2 内容转换为 $1：$3',
 'invalid-content-data' => '无效的内容数据',
 'content-not-allowed-here' => '[[$2]]页面上不允许“$1”内容',
+'editwarning-warning' => '离开这个页面会令您遗失之前的所有更改。若您已经登入，您可在您参数设置的“编辑”节中关闭此警告。',
 
 # Content models
 'content-model-wikitext' => 'wiki语法',
@@ -1113,6 +1178,7 @@ $2
 'undo-failure' => '因存在冲突的中间编辑，本编辑不能撤销。',
 'undo-norev' => '由于其修订版本不存在或已删除，此编辑不能撤销。',
 'undo-summary' => '撤销[[Special:Contributions/$2|$2]]（[[User talk:$2|讨论]]）的版本$1',
+'undo-summary-username-hidden' => '取消由一匿名用户所作的修订$1',
 
 # Account creation failure
 'cantcreateaccounttitle' => '无法创建账户',
@@ -1273,6 +1339,7 @@ $1",
 'compareselectedversions' => '对比选择的版本',
 'showhideselectedversions' => '显示/隐藏选择的版本',
 'editundo' => '撤销',
+'diff-empty' => '（没有差异）',
 'diff-multi' => '（未显示$2个用户的$1个中间版本）',
 'diff-multi-manyusers' => '（未显示超过$2个用户的$1个中间版本）',
 'difference-missing-revision' => '此差异对比的{{PLURAL:$2|一个修订|$2个修订}}（$1）{{PLURAL:$2|没有}}找到。
@@ -1300,7 +1367,6 @@ $1",
 'searchmenu-legend' => '搜索选项',
 'searchmenu-exists' => "'''本wiki上有名为“[[:$1]]”的页面。'''",
 'searchmenu-new' => "'''在本wiki上新建名为“[[:$1]]”的页面！'''",
-'searchhelp-url' => 'Help:目录',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|去浏览以此为首的页面]]',
 'searchprofile-articles' => '内容页面',
 'searchprofile-project' => '帮助和项目页面',
@@ -1341,15 +1407,7 @@ $1",
 'powersearch-togglenone' => '全不选',
 'search-external' => '外部搜索',
 'searchdisabled' => '{{SITENAME}}的搜索已被禁用。您可以暂时使用Google进行搜索，须注意他们索引的{{SITENAME}}内容可能会过时。',
-
-# Quickbar
-'qbsettings' => '快速导航栏',
-'qbsettings-none' => '无',
-'qbsettings-fixedleft' => '左侧固定',
-'qbsettings-fixedright' => '右侧固定',
-'qbsettings-floatingleft' => '左侧漂移',
-'qbsettings-floatingright' => '右侧漂移',
-'qbsettings-directionality' => '根据您的语言文本方向固定位置',
+'search-error' => '搜索时发生错误：$1',
 
 # Preferences page
 'preferences' => '设置',
@@ -1383,7 +1441,6 @@ $1",
 'resetprefs' => '清除未保存的更改',
 'restoreprefs' => '恢复所有默认设置（所有部分）',
 'prefs-editing' => '编辑',
-'prefs-edit-boxsize' => '编辑框尺寸',
 'rows' => '行：',
 'columns' => '列：',
 'searchresultshead' => '搜索',
@@ -1394,7 +1451,9 @@ $1",
 'recentchangesdays-max' => '最多$1天',
 'recentchangescount' => '默认显示的编辑数：',
 'prefs-help-recentchangescount' => '该项包含最近更改、页面历史和日志。',
-'prefs-help-watchlist-token' => '此栏填写的密钥可以生成您监视列表的RSS源。任何知晓本栏密钥的人都能阅读您的监视列表，因此请使用安全的数值。这里已提供了一个随机生成的数值供您选择：$1',
+'prefs-help-watchlist-token2' => '这是您的监视列表网络订阅源密钥的关键。
+知道它的人将能够读取您的监视列表，所以不应分享它。
+[[Special:ResetTokens|点击这里以重置它]]。',
 'savedprefs' => '你的系统设置已保存。',
 'timezonelegend' => '时区：',
 'localtime' => '当地时间：',
@@ -1424,7 +1483,6 @@ $1",
 'prefs-common-css-js' => '所有皮肤共用的CSS/JavaScript：',
 'prefs-reset-intro' => '你可以使用本页面重置你的系统设置为网站默认值。该操作不能撤销。',
 'prefs-emailconfirm-label' => '电子邮件确认：',
-'prefs-textboxsize' => '编辑框大小',
 'youremail' => '电子邮件：',
 'username' => '{{GENDER:$1|用户名}}：',
 'uid' => '{{GENDER:$1|用户}}ID：',
@@ -1456,6 +1514,8 @@ $1",
 'prefs-dateformat' => '日期格式',
 'prefs-timeoffset' => '时差',
 'prefs-advancedediting' => '一般选项',
+'prefs-editor' => '编辑',
+'prefs-preview' => '预览',
 'prefs-advancedrc' => '高级选项',
 'prefs-advancedrendering' => '高级选项',
 'prefs-advancedsearchoptions' => '高级选项',
@@ -1463,7 +1523,9 @@ $1",
 'prefs-displayrc' => '显示',
 'prefs-displaysearchoptions' => '显示',
 'prefs-displaywatchlist' => '显示',
+'prefs-tokenwatchlist' => '权标',
 'prefs-diffs' => '差异对比',
+'prefs-help-prefershttps' => '此首选项将在您下次登录时生效。',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => '电子邮件地址有效',
@@ -1490,6 +1552,8 @@ $1",
 'userrights-notallowed' => '你没有权限添加或删除用户权限。',
 'userrights-changeable-col' => '你可以更改的用户组',
 'userrights-unchangeable-col' => '你不能更改的用户组',
+'userrights-conflict' => '用户权限的更改存在冲突！请检查并确认您的更改。',
+'userrights-removed-self' => '您已成功删除您自己的权利。因此，您不再能够访问此页。',
 
 # Groups
 'group' => '用户组：',
@@ -1555,11 +1619,19 @@ $1",
 'right-proxyunbannable' => '避开代理服务器的自动封禁',
 'right-unblockself' => '自我解封',
 'right-protect' => '更改保护级别和编辑受连锁保护的页面',
-'right-editprotected' => '编辑保护页面（无连锁保护）',
+'right-editprotected' => '编辑页面保护需要“{{int:protect-level-sysop}}”',
+'right-editsemiprotected' => '编辑页面保护需要“{{int:protect-level-autoconfirmed}}”',
 'right-editinterface' => '编辑用户界面',
 'right-editusercssjs' => '编辑其他用户的CSS和JavaScript文件',
 'right-editusercss' => '编辑其他用户的CSS文件',
 'right-edituserjs' => '编辑其他用户的JavaScript文件',
+'right-editmyusercss' => '编辑您自己的用户 CSS 文件',
+'right-editmyuserjs' => '编辑您自己的用户 JavaScript 文件',
+'right-viewmywatchlist' => '查看你的监视列表',
+'right-editmywatchlist' => '编辑您的监视列表。请注意即使没有这种权利，某些操作仍将添加页面。',
+'right-viewmyprivateinfo' => '查看您自己的私人数据 （如电子邮件地址、 真实姓名）',
+'right-editmyprivateinfo' => '编辑您自己的私人数据 （如电子邮件地址、 真实姓名）',
+'right-editmyoptions' => '编辑您的个人设置',
 'right-rollback' => '快速回退最后编辑特定页面的用户的编辑',
 'right-markbotedits' => '标记回退编辑为机器人编辑',
 'right-noratelimit' => '不受速率限制影响',
@@ -1621,12 +1693,19 @@ $1",
 'action-userrights-interwiki' => '编辑其它wiki的用户的用户权限',
 'action-siteadmin' => '锁定或解锁数据库',
 'action-sendemail' => '电邮联系其他用户',
+'action-editmywatchlist' => '编辑你的监视列表',
+'action-viewmywatchlist' => '查看你的监视列表',
+'action-viewmyprivateinfo' => '查看您的私人信息',
+'action-editmyprivateinfo' => '编辑您的私人信息',
 
 # Recent changes
 'nchanges' => '$1个更改',
+'enhancedrc-since-last-visit' => '$1 {{PLURAL:$1|自上次访问}}',
+'enhancedrc-history' => '历史',
 'recentchanges' => '最近更改',
 'recentchanges-legend' => '最近更改选项',
 'recentchanges-summary' => '在此页面上跟踪维基的更改。',
+'recentchanges-noresult' => '在此期间没有符合这些条件的编辑',
 'recentchanges-feed-description' => '用这个源跟踪本wiki的最近更改。',
 'recentchanges-label-newpage' => '该编辑创建了新页面',
 'recentchanges-label-minor' => '这是一个小编辑',
@@ -1663,7 +1742,6 @@ $1",
 'recentchangeslinked-feed' => '相关更改',
 'recentchangeslinked-toolbox' => '相关更改',
 'recentchangeslinked-title' => '与“$1”有关的更改',
-'recentchangeslinked-noresult' => '在这一段时间中链接的页面并无更改。',
 'recentchangeslinked-summary' => "这是链接自指定页面（或至指定分类的成员）的页面的最近更改的列表。[[Special:Watchlist|你的监视列表]]中的页面以'''粗体'''显示。",
 'recentchangeslinked-page' => '页面名称：',
 'recentchangeslinked-to' => '显示链到所给出的页面',
@@ -1674,7 +1752,7 @@ $1",
 'reuploaddesc' => '取消上传并返回上传表单',
 'upload-tryagain' => '提交修改后的文件描述',
 'uploadnologin' => '未登录',
-'uploadnologintext' => '您必须先[[Special:UserLogin|登录]]才能上传文件。',
+'uploadnologintext' => '您必须先$1才能上传文件。',
 'upload_directory_missing' => '上传目录（$1）遗失，不能由网页服务器建立。',
 'upload_directory_read_only' => '上传目录（$1）不存在或无写权限。',
 'uploaderror' => '上传错误',
@@ -1875,7 +1953,6 @@ $1',
 'http-read-error' => 'HTTP读取错误。',
 'http-timed-out' => 'HTTP请求已过时。',
 'http-curl-error' => '撷取URL时出错：$1',
-'http-host-unreachable' => '无法到达URL。',
 'http-bad-status' => '进行HTTP请求时出现问题：$1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1903,6 +1980,10 @@ $1',
 'listfiles_size' => '大小',
 'listfiles_description' => '说明',
 'listfiles_count' => '版本',
+'listfiles-show-all' => '包括图片的旧版本',
+'listfiles-latestversion' => '当前版本',
+'listfiles-latestversion-yes' => '是',
+'listfiles-latestversion-no' => '否',
 
 # File description page
 'file-anchor-link' => '文件',
@@ -1995,9 +2076,16 @@ $1',
 'randompage' => '随机页面',
 'randompage-nopages' => '在以下{{PLURAL:$2|名字空间}}中没有页面：$1。',
 
+# Random page in category
+'randomincategory' => '分类中的随机页面',
+'randomincategory-invalidcategory' => '“$1”不是一个有效的分类名称。',
+'randomincategory-nopages' => '[[:Category:$1]]中没有页面。',
+'randomincategory-selectcategory' => '从分类获取随机页面：$1 $2。',
+'randomincategory-selectcategory-submit' => '显示',
+
 # Random redirect
 'randomredirect' => '随机重定向',
-'randomredirect-nopages' => '在 "$1" 名字空间中没有重定向页面。',
+'randomredirect-nopages' => '“$1”名字空间中没有重定向。',
 
 # Statistics
 'statistics' => '统计',
@@ -2020,15 +2108,13 @@ $1',
 'statistics-users-active-desc' => '在前$1天中操作过的用户',
 'statistics-mostpopular' => '浏览最多的页面',
 
-'disambiguations' => '链接至消歧义页面的页面',
-'disambiguationspage' => 'Template:消歧义',
-'disambiguations-text' => "以下页面包含至少一个至'''消歧义页面'''的链接。它们可能应该链接至更适当的页面。<br />如果页面使用了链自[[MediaWiki:Disambiguationspage]]的模板，则被视为消歧义页面。",
-
 'pageswithprop' => '有页面属性的页面',
 'pageswithprop-legend' => '有页面属性的页面',
 'pageswithprop-text' => '此页面列出了使用特定页面属性的页面名单。',
 'pageswithprop-prop' => '属性名称：',
 'pageswithprop-submit' => '提交',
+'pageswithprop-prophidden-long' => '长文本属性值已隐藏($1)',
+'pageswithprop-prophidden-binary' => '已隐藏二进制属性值($1)',
 
 'doubleredirects' => '双重重定向',
 'doubleredirectstext' => '本页面列出重定向至其他重定向页的页面。每行含有第一及第二重定向的链接和第二重定向的目标（通常是第一重定向应该指向的“真实”目标页面）。<del>带删除线的</del>条目已被解决。',
@@ -2084,6 +2170,7 @@ $1',
 'mostrevisions' => '最多版本页面',
 'prefixindex' => '所有有前缀的页面',
 'prefixindex-namespace' => '所有有前缀的页面（$1名字空间）',
+'prefixindex-strip' => '在列表中省略前缀',
 'shortpages' => '短页面',
 'longpages' => '长页面',
 'deadendpages' => '断链页面',
@@ -2099,6 +2186,7 @@ $1',
 'listusers' => '用户列表',
 'listusers-editsonly' => '只显示有编辑的用户',
 'listusers-creationsort' => '按创建日期排序',
+'listusers-desc' => '降序排序',
 'usereditcount' => '$1次编辑',
 'usercreated' => '{{GENDER:$3|创建}}于$1 $2',
 'newpages' => '新页面',
@@ -2272,10 +2360,9 @@ $1',
 'unwatchthispage' => '停止监视',
 'notanarticle' => '非内容页面',
 'notvisiblerev' => '上次由不同用户所作的修订版本已经删除',
-'watchnochange' => '在显示的时间段内您所监视的页面没有更改。',
 'watchlist-details' => '不计讨论页面，你的监视列表中有$1个页面。',
-'wlheader-enotif' => '* 已经启动电子邮件通知功能。',
-'wlheader-showupdated' => "*你上次访问后更改的页面以'''粗体'''显示",
+'wlheader-enotif' => '已启用电子邮件通知。',
+'wlheader-showupdated' => "你上次访问后更改的页面以'''粗体'''显示",
 'watchmethod-recent' => '检查被监视页面的最近编辑',
 'watchmethod-list' => '查看监视页中的最新修改',
 'watchlistcontains' => '您的监视列表包含$1个页面。',
@@ -2511,7 +2598,7 @@ $1',
 'contributions' => '{{GENDER:$1|用户}}贡献',
 'contributions-title' => '$1的用户贡献',
 'mycontris' => '贡献',
-'contribsub2' => '$1的贡献（$2）',
+'contribsub2' => '{{GENDER:$3|$1}}的贡献（$2）',
 'nocontribs' => '没有找到符合特征的更改。',
 'uctop' => '（当前）',
 'month' => '截止月份：',
@@ -2665,13 +2752,11 @@ $1被封禁的理由是：“$2”',
 'ipb_blocked_as_range' => '错误：IP地址$1未被直接封禁，故无法解除封禁。然而，它位于IP地址段$2的封禁范围内，后者可被解除封禁。',
 'ip_range_invalid' => '无效的IP地址段。',
 'ip_range_toolarge' => '不允许大于/$1的段封禁。',
-'blockme' => '封禁我',
 'proxyblocker' => '代理封禁器',
-'proxyblocker-disabled' => '此功能已禁用。',
 'proxyblockreason' => '您的IP地址为已被封禁的公开代理。请联系您的互联网服务提供商或技术支持者，并告知他们此严重的安全问题。',
-'proxyblocksuccess' => '完成。',
 'sorbsreason' => '在{{SITENAME}}使用的DNSBL中，您的IP地址被列为公开代理。',
 'sorbs_create_account_reason' => '在{{SITENAME}}使用的DNSBL中，您的IP地址被列为公开代理，因此您不能创建新账户。',
+'xffblockreason' => '您或您正在使用的代理服务器呈现在X-Forwarded-For数据包头的一个IP地址已被封禁。封禁原因为：$1',
 'cant-block-while-blocked' => '您无法在封禁期内封禁其他用户。',
 'cant-see-hidden-user' => '您尝试封禁的用户已被封禁并隐藏。
 由于您尚无隐藏用户的权限，您无法查看或编辑此用户的封禁。',
@@ -2831,6 +2916,8 @@ $1被封禁的理由是：“$2”',
 'thumbnail-more' => '放大',
 'filemissing' => '无法找到文件',
 'thumbnail_error' => '生成缩略图出错：$1',
+'thumbnail_error_remote' => '来自$1的错误消息从：
+$2',
 'djvu_page_error' => 'DjVu页面超出范围',
 'djvu_no_xml' => '无法在DjVu文件中获取XML',
 'thumbnail-temp-create' => '无法创建临时缩略图文件',
@@ -2974,20 +3061,15 @@ $1被封禁的理由是：“$2”',
 'tooltip-undo' => '“撤销”可以恢复该编辑并在预览模式下打开编辑表单。它允许在摘要中加入原因。',
 'tooltip-preferences-save' => '保存系统设置',
 'tooltip-summary' => '请输入简短的摘要',
+'tooltip-iwiki' => '$1——$2',
 
 # Stylesheets
 'common.css' => '/* 此处的 CSS 将应用于所有的皮肤 */',
-'standard.css' => '/* 此处的 CSS 将影响使用标准皮肤的用户 */',
-'nostalgia.css' => '/* 此处的 CSS 将影响使用怀旧皮肤的用户 */',
 'cologneblue.css' => '/* 此处的 CSS 将影响使用科隆香水蓝皮肤的用户 */',
 'monobook.css' => '/* 此处的 CSS 将影响使用 Monobook 皮肤的用户 */',
-'myskin.css' => '/* 此处的 CSS 将影响使用 MySkin 皮肤的用户 */',
-'chick.css' => '/* 此处的 CSS 将影响使用 Chick 皮肤的用户 */',
-'simple.css' => '/* 此处的 CSS 将影响使用 Simple 皮肤的用户 */',
 'modern.css' => '/* 此处的 CSS 将影响使用 Modern 皮肤的用户 */',
 'vector.css' => '/* 此处的 CSS 将影响使用 Vector 皮肤的用户 */',
 'print.css' => '/* 此处的 CSS 将影响打印输出 */',
-'handheld.css' => '/* 此处的 CSS 将影响在 $wgHandheldStyle 设置手提装置面板 */',
 'noscript.css' => '/* 此处的 CSS 将影响没有启用 JavaScript 的用户 */',
 'group-autoconfirmed.css' => '/* 此处的 CSS 将只会影响自动确认用户 */',
 'group-bot.css' => '/* 此处的 CSS 将只会影响机器人 */',
@@ -2996,13 +3078,8 @@ $1被封禁的理由是：“$2”',
 
 # Scripts
 'common.js' => '/* 此处的JavaScript将加载于所有用户每一个页面。 */',
-'standard.js' => '/* 此处的JavaScript将加载于使用标准皮肤的用户 */',
-'nostalgia.js' => '/* 此处的JavaScript将加载于使用怀旧皮肤的用户 */',
 'cologneblue.js' => '/* 此处的JavaScript将加载于使用科隆香水蓝皮肤的用户 */',
 'monobook.js' => '/* 此处的JavaScript将加载于使用Monobook皮肤的用户 */',
-'myskin.js' => '/* 此处的JavaScript将加载于使用MySkin皮肤的用户 */',
-'chick.js' => '/* 此处的JavaScript将加载于使用Chick皮肤的用户 */',
-'simple.js' => '/* 此处的JavaScript将加载于使用Simple皮肤的用户 */',
 'modern.js' => '/* 此处的JavaScript将加载于使用Modern皮肤的用户 */',
 'vector.js' => '/* 此处的JavaScript将加载于使用Vector皮肤的用户 */',
 'group-autoconfirmed.js' => '/* 此处的JavaScript将仅加载于自动确认用户 */',
@@ -3082,10 +3159,7 @@ $1被封禁的理由是：“$2”',
 'pageinfo-category-files' => '文件数',
 
 # Skin names
-'skinname-standard' => '标准',
-'skinname-nostalgia' => '怀旧',
 'skinname-cologneblue' => '科隆香水蓝',
-'skinname-simple' => '简单',
 'skinname-modern' => '现代',
 
 # Patrolling
@@ -3166,11 +3240,25 @@ $1',
 'minutes' => '$1分',
 'hours' => '$1小时',
 'days' => '$1天',
+'weeks' => '$1周',
 'months' => '$1个月',
 'years' => '$1年',
 'ago' => '$1前',
 'just-now' => '刚刚',
 
+# Human-readable timestamps
+'hours-ago' => '$1小时前',
+'minutes-ago' => '$1分前',
+'seconds-ago' => '$1秒前',
+'monday-at' => '周一$1',
+'tuesday-at' => '周二$1',
+'wednesday-at' => '周三$1',
+'thursday-at' => '周四$1',
+'friday-at' => '周五$1',
+'saturday-at' => '周六$1',
+'sunday-at' => '周日$1',
+'yesterday-at' => '昨天$1',
+
 # Bad image list
 'bad_image_list' => '格式如下：
 
@@ -3220,7 +3308,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '宽度',
 'exif-imagelength' => '高度',
 'exif-bitspersample' => '每像素字节数',
@@ -3398,7 +3486,7 @@ Variants for Chinese language
 'exif-originalimageheight' => '裁剪前的图像高度',
 'exif-originalimagewidth' => '裁剪前的图像宽度',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '未压缩',
 'exif-compression-2' => 'CCITT第3组一维修改霍夫曼游程编码',
 'exif-compression-3' => 'CCITT第3组传真编码',
@@ -3789,7 +3877,6 @@ $5
 'version-other' => '其他',
 'version-mediahandlers' => '媒体文件处理器',
 'version-hooks' => '钩',
-'version-extension-functions' => '扩展函数',
 'version-parser-extensiontags' => '解析器扩展标签',
 'version-parser-function-hooks' => '解析器函数钩',
 'version-hook-name' => '钩名',
@@ -3798,6 +3885,7 @@ $5
 'version-license' => '授权协议',
 'version-poweredby-credits' => "本Wiki由'''[//www.mediawiki.org/ MediaWiki]'''驱动，版权所有 © 2001-$1 $2。",
 'version-poweredby-others' => '其他',
+'version-poweredby-translators' => 'translatewiki.net上的翻译者',
 'version-credits-summary' => '我们感谢下列人士为[[Special:Version|MediaWiki]]作出的贡献。',
 'version-license-info' => "MediaWiki是自由软件，你可以依据自由软件基金会发行的'''GNU公众授权协议'''第2版或任意后续版本的条款，传播和/或修改本软件。
 
@@ -3813,11 +3901,17 @@ MediaWiki发表时预期有用，但对此'''无任何保证'''，亦无隐含
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath 条目路径]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath 脚本路径]',
 
-# Special:FilePath
-'filepath' => '文件路径',
-'filepath-page' => '文件名：',
-'filepath-submit' => '提交',
-'filepath-summary' => '本特殊页面返回文件的完整路径。图像以完整分辨率显示，其它文件类型以关联程序直接打开。',
+# Special:Redirect
+'redirect' => '重定向（按文件、用户或版本ID）',
+'redirect-legend' => '重定向至文件或页面',
+'redirect-summary' => '本特殊页面会重定向到一个文件（给予文件名），一个页面（给予修订版本ID），或一个用户页面（给予用户数字ID）。',
+'redirect-submit' => '提交',
+'redirect-lookup' => '基于：',
+'redirect-value' => '值：',
+'redirect-user' => '用户ID',
+'redirect-revision' => '页面修订',
+'redirect-file' => '文件名',
+'redirect-not-exists' => '没找到相应值',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '搜索重复文件',
@@ -3866,12 +3960,16 @@ MediaWiki发表时预期有用，但对此'''无任何保证'''，亦无隐含
 'tags' => '有效的更改标签',
 'tag-filter' => '[[Special:Tags|标签]]过滤器：',
 'tag-filter-submit' => '过滤器',
+'tag-list-wrapper' => '（[[Special:Tags|$1个标签]]：$2）',
 'tags-title' => '标签',
 'tags-intro' => '本页面列出了软件可能用于标记编辑的标签和它们的含义。',
 'tags-tag' => '标签名称',
 'tags-display-header' => '更改列表中的表现形式',
 'tags-description-header' => '完整含义说明',
+'tags-active-header' => '是否活跃？',
 'tags-hitcount-header' => '标记的更改数',
+'tags-active-yes' => '是',
+'tags-active-no' => '否',
 'tags-edit' => '编辑',
 'tags-hitcount' => '$1个更改',
 
@@ -3892,6 +3990,7 @@ MediaWiki发表时预期有用，但对此'''无任何保证'''，亦无隐含
 'dberr-problems' => '抱歉！本网站出现了一些技术问题。',
 'dberr-again' => '请等待几分钟后重试。',
 'dberr-info' => '（无法连接到数据库服务器：$1）',
+'dberr-info-hidden' => '（无法连接到数据库服务器）',
 'dberr-usegoogle' => '在此期间您可以尝试用 Google 来搜索。',
 'dberr-outofdate' => '须注意他们索引出来的内容可能不是最新的。',
 'dberr-cachederror' => '这是所请求页面的缓存副本，可能不是最新的。',
@@ -3907,6 +4006,9 @@ MediaWiki发表时预期有用，但对此'''无任何保证'''，亦无隐含
 'htmlform-submit' => '提交',
 'htmlform-reset' => '撤销更改',
 'htmlform-selectorother-other' => '其他',
+'htmlform-no' => '否',
+'htmlform-yes' => '是',
+'htmlform-chosen-placeholder' => '选择选项',
 
 # SQLite database support
 'sqlite-has-fts' => '带全文搜索的版本$1',
@@ -4023,4 +4125,19 @@ MediaWiki发表时预期有用，但对此'''无任何保证'''，亦无隐含
 # Image rotation
 'rotate-comment' => '图像已顺时针方向旋转了 $1 {{PLURAL:$1|度}}',
 
+# Limit report
+'limitreport-title' => '分析器分析数据：',
+'limitreport-cputime' => 'CPU使用时间',
+'limitreport-cputime-value' => '$1秒',
+'limitreport-walltime' => '实际使用时间',
+'limitreport-walltime-value' => '$1秒',
+'limitreport-ppvisitednodes' => '预处理器访问节点计数',
+'limitreport-ppgeneratednodes' => '预处理器生成节点计数',
+'limitreport-postexpandincludesize' => '展开后大小',
+'limitreport-postexpandincludesize-value' => '$1/$2字节',
+'limitreport-templateargumentsize' => '模板参数大小',
+'limitreport-templateargumentsize-value' => '$1/$2 字节',
+'limitreport-expansiondepth' => '最高扩展深度',
+'limitreport-expensivefunctioncount' => '高级函数分析器',
+
 );
diff --git a/languages/messages/MessagesZh_hant.php b/languages/messages/MessagesZh_hant.php
index 29f57c84..992db6b7 100644
--- a/languages/messages/MessagesZh_hant.php
+++ b/languages/messages/MessagesZh_hant.php
@@ -17,6 +17,7 @@
  * @author Danny0838
  * @author FireJackey
  * @author Frankou
+ * @author Gakmo
  * @author Gaoxuewei
  * @author Hakka
  * @author Horacewai2
@@ -31,6 +32,7 @@
  * @author Lauhenry
  * @author Liangent
  * @author Liflon
+ * @author Littletung
  * @author Liuxinyu970226
  * @author Mark85296341
  * @author Oapbtommy
@@ -38,6 +40,7 @@
  * @author Pbdragonwang
  * @author PhiLiP
  * @author Philip
+ * @author Radish10cm
  * @author Shinjiman
  * @author Shirayuki
  * @author Shizhao
@@ -181,6 +184,7 @@ $specialPageAliases = array(
 	'Randomredirect'            => array( '隨機重定向頁面' ),
 	'Recentchanges'             => array( '最近更改' ),
 	'Recentchangeslinked'       => array( '鏈出更改' ),
+	'Redirect'                  => array( '重定向' ),
 	'Revisiondelete'            => array( '刪除或恢復版本' ),
 	'Search'                    => array( '搜索' ),
 	'Shortpages'                => array( '短頁面' ),
@@ -214,6 +218,7 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
+	'redirect'                  => array( '0', '#重定向', '#REDIRECT' ),
 	'notoc'                     => array( '0', '__無目錄__', '__无目录__', '__NOTOC__' ),
 	'nogallery'                 => array( '0', '__無圖庫__', '__无图库__', '__NOGALLERY__' ),
 	'forcetoc'                  => array( '0', '__強制目錄__', '__强显目录__', '__FORCETOC__' ),
@@ -235,10 +240,10 @@ $magicWords = array(
 	'img_page'                  => array( '1', '頁=$1', '$1頁', '页数=$1', '$1页', 'page=$1', 'page $1' ),
 	'img_link'                  => array( '1', '連結=$1', '链接=$1', 'link=$1' ),
 	'sitename'                  => array( '1', '網站名稱', '站点名称', 'SITENAME' ),
-	'ns'                        => array( '0', '名字空間', '名字空间:', 'NS:' ),
-	'nse'                       => array( '0', '名字空間E', '名字空间E:', 'NSE:' ),
-	'localurl'                  => array( '0', '本地URL', '本地URL:', 'LOCALURL:' ),
-	'localurle'                 => array( '0', '本地URLE', '本地URLE:', 'LOCALURLE:' ),
+	'ns'                        => array( '0', '名字空間:', '名字空间:', 'NS:' ),
+	'nse'                       => array( '0', '名字空間E:', '名字空间E:', 'NSE:' ),
+	'localurl'                  => array( '0', '本地URL:', 'LOCALURL:' ),
+	'localurle'                 => array( '0', '本地URLE:', 'LOCALURLE:' ),
 	'pageid'                    => array( '0', '頁面ID', '页面ID', 'PAGEID' ),
 	'server'                    => array( '0', '伺服器', '服务器', 'SERVER' ),
 	'servername'                => array( '0', '伺服器名稱', '服务器名', 'SERVERNAME' ),
@@ -247,6 +252,7 @@ $magicWords = array(
 	'nocontentconvert'          => array( '0', '__不轉換內容__', '__不转换内容__', '__NOCONTENTCONVERT__', '__NOCC__' ),
 	'displaytitle'              => array( '1', '顯示標題', '显示标题', 'DISPLAYTITLE' ),
 	'currentversion'            => array( '1', '當前版本', '当前版本', 'CURRENTVERSION' ),
+	'language'                  => array( '0', '#語言:', '#语言:', '#LANGUAGE:' ),
 	'hiddencat'                 => array( '1', '__隱藏分類__', '__隐藏分类__', '__HIDDENCAT__' ),
 	'staticredirect'            => array( '1', '__靜態重定向__', '__静态重定向__', '__STATICREDIRECT__' ),
 );
@@ -289,9 +295,6 @@ $messages = array(
 'tog-shownumberswatching' => '顯示正在監視的使用者數目',
 'tog-oldsig' => '原有簽名：',
 'tog-fancysig' => '將簽名視為圍記文字（Wikitext）（不會自動產生連結）',
-'tog-externaleditor' => '預設使用外部編輯器（進階者專用，您的電腦需要特殊設定。[//www.mediawiki.org/wiki/Manual:External_editors 更多訊息。]）',
-'tog-externaldiff' => '預設使用外部程式做差異比對（進階者專用，您的電腦需要特殊設定。[//www.mediawiki.org/wiki/Manual:External_editors 更多訊息。]）',
-'tog-showjumplinks' => '啟用「跳轉到」訪問連結',
 'tog-uselivepreview' => '使用即時預覽（實驗性）',
 'tog-forceeditsummary' => '未輸入編輯摘要時提醒我',
 'tog-watchlisthideown' => '監視列表中隱藏我的編輯',
@@ -305,6 +308,8 @@ $messages = array(
 'tog-showhiddencats' => '顯示隱藏分類',
 'tog-noconvertlink' => '不轉換連結標題',
 'tog-norollbackdiff' => '回退後不做差異比對',
+'tog-useeditwarning' => '當離開頁面時編輯仍未儲存，請提醒我',
+'tog-prefershttps' => '登入時始終使用安全連線',
 
 'underline-always' => '總是使用',
 'underline-never' => '從不使用',
@@ -368,6 +373,18 @@ $messages = array(
 'oct' => '10月',
 'nov' => '11月',
 'dec' => '12月',
+'january-date' => '1月$1日',
+'february-date' => '2月$1日',
+'march-date' => '3月$1日',
+'april-date' => '4月$1日',
+'may-date' => '5月$1日',
+'june-date' => '6月$1日',
+'july-date' => '7月$1日',
+'august-date' => '8月$1日',
+'september-date' => '9月$1日',
+'october-date' => '10月$1日',
+'november-date' => '11月$1日',
+'december-date' => '12月$1日',
 
 # Categories related messages
 'pagecategories' => '$1 個分類',
@@ -449,6 +466,7 @@ $messages = array(
 'create-this-page' => '建立本頁',
 'delete' => '刪除',
 'deletethispage' => '刪除本頁',
+'undeletethispage' => '取消刪除此頁',
 'undelete_short' => '反刪除$1項修訂',
 'viewdeleted_short' => '查看$1項已刪除的修訂',
 'protect' => '保護',
@@ -490,7 +508,7 @@ $1',
 'pool-queuefull' => '請求池已滿',
 'pool-errorunknown' => '未知錯誤',
 
-# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).
 'aboutsite' => '關於 {{SITENAME}}',
 'aboutpage' => 'Project:關於',
 'copyright' => '除非另有說明，否則本站內容均以$1條款提供。',
@@ -500,7 +518,6 @@ $1',
 'disclaimers' => '免責聲明',
 'disclaimerpage' => 'Project:一般免責聲明',
 'edithelp' => '編輯幫助',
-'edithelppage' => 'Help:如何編輯頁面',
 'helppage' => 'Help:目錄',
 'mainpage' => '首頁',
 'mainpage-description' => '首頁',
@@ -578,17 +595,12 @@ $1',
 # General errors
 'error' => '錯誤',
 'databaseerror' => '資料庫錯誤',
-'dberrortext' => '發生資料庫查詢語法錯誤。
-可能是由於軟體自身的錯誤所引起。
-最後一次資料庫查詢指令是：
-<blockquote><code>$1</code></blockquote>
-來自於函數“<code>$2</code>”。
-資料庫返回錯誤“<samp>$3: $4</samp>”。',
-'dberrortextcl' => '發生資料庫查詢語法錯誤。
-最後一次的資料庫查詢是:
-「$1」
-來自於函數「$2」。
-數據庫返回錯誤「$3: $4」。',
+'databaseerror-text' => '出現資料庫查詢錯誤。
+這可能表示軟件中存在錯誤。',
+'databaseerror-textcl' => '資料庫查詢錯誤。',
+'databaseerror-query' => '查詢：$1',
+'databaseerror-function' => '功能：$1',
+'databaseerror-error' => '錯誤：$1',
 'laggedslavemode' => "'''警告：'''頁面可能不包含最近的更新。",
 'readonly' => '資料庫禁止訪問',
 'enterlockreason' => '請輸入禁止訪問原因, 包括估計重新開放的時間',
@@ -623,6 +635,7 @@ $1',
 'cannotdelete-title' => '無法刪除頁面「$1」',
 'delete-hook-aborted' => '刪除被勾點中止。
 它沒有提供解釋。',
+'no-null-revision' => '無法創建對"$1"頁面新的空白修訂',
 'badtitle' => '錯誤的標題',
 'badtitletext' => '所請求頁面的標題是無效的、不存在，跨語言或跨wiki連結的標題錯誤。它可能包含一個或更多的不能用於標題的字符。',
 'perfcached' => '下列是快取資料，因此可能不是最新的。最多{{PLURAL:$1|只有1個結果|$1個結果}}可用。',
@@ -645,12 +658,15 @@ $1',
 'editinginterface' => "'''警告：'''您正在編輯的頁面是用於提供軟體的介面文字。
 改變此頁將影響其他在此wiki上的用戶介面外觀。
 如欲修改所有wiki的翻譯，請到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化計畫。",
-'sqlhidden' => '（隱藏SQL查詢）',
 'cascadeprotected' => '這個頁面已經被保護，因為這個頁面被以下已標註"聯鎖保護"的{{PLURAL:$1|一個|多個}}被保護頁面包含：
 $2',
 'namespaceprotected' => "您並沒有權限編輯'''$1'''名字空間的頁面。",
 'customcssprotected' => '你並無權限編輯此CSS頁面，因為它包含了其他用戶的個人設置。',
 'customjsprotected' => '你並無權限去編輯此JavaScript頁面，因為他包含了另一位用戶的個人設定。',
+'mycustomcssprotected' => '你沒有編輯這CSS頁面的權限。',
+'mycustomjsprotected' => '你沒有編輯這JavaScript頁面的權限。',
+'myprivateinfoprotected' => '您沒有權限來編輯您的個人信息。',
+'mypreferencesprotected' => '您沒有權限編輯您的設定。',
 'ns-specialprotected' => '特殊頁面是不可以編輯的。',
 'titleprotected' => "這個標題已經被[[User:$1|$1]]保護以防止建立。理由是''$2''。",
 'filereadonlyerror' => '無法修改文件「$1」因為文件庫「$2」處於唯讀模式。 ！
@@ -673,10 +689,19 @@ $2',
 'welcomecreation-msg' => '您的帳號已建立。
 不要忘記變更您的[[Special:Preferences| {{SITENAME}} 的偏好設定]]。',
 'yourname' => '使用者名稱：',
+'userlogin-yourname' => '使用者名稱：',
+'userlogin-yourname-ph' => '輸入您的使用者名稱',
+'createacct-another-username-ph' => '輸入帳號名稱',
 'yourpassword' => '您的密碼：',
+'userlogin-yourpassword' => '密碼',
+'userlogin-yourpassword-ph' => '輸入您的密碼',
+'createacct-yourpassword-ph' => '輸入密碼',
 'yourpasswordagain' => '再次輸入密碼：',
+'createacct-yourpasswordagain' => '確認密碼',
+'createacct-yourpasswordagain-ph' => '再次輸入密碼',
 'remembermypassword' => '在這個瀏覽器上記住我的登入資訊（可維持 $1 {{PLURAL:$1|天}}）',
-'securelogin-stick-https' => '登入後繼續以HTTPS連接',
+'userlogin-remembermypassword' => '保持我的登入狀態',
+'userlogin-signwithsecure' => '使用安全連線',
 'yourdomainname' => '您的網域：',
 'password-change-forbidden' => '您不可變更此圍記（Wiki）上的密碼。',
 'externaldberror' => '這可能是由於驗證資料庫錯誤，或是您被禁止更新您的外部帳號。',
@@ -688,17 +713,43 @@ $2',
 'logout' => '登出',
 'userlogout' => '登出',
 'notloggedin' => '未登入',
+'userlogin-noaccount' => '沒有帳號嗎？',
+'userlogin-joinproject' => '參與 {{SITENAME}}',
 'nologin' => '您還沒有帳號嗎？$1。',
 'nologinlink' => '建立帳號',
 'createaccount' => '建立帳號',
 'gotaccount' => '已經擁有帳號？$1。',
 'gotaccountlink' => '登入',
 'userlogin-resetlink' => '忘記了您的登入細節？',
+'userlogin-resetpassword-link' => '重設密碼',
+'helplogin-url' => 'Help:登入',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登入幫助]]',
+'userlogin-loggedin' => '您已作為{{GENDER:$1|$1}}登錄。
+利用以下表單以作為另一賬戶登錄。',
+'userlogin-createanother' => '建立另一賬戶',
+'createacct-join' => '輸入您的基本資料：',
+'createacct-another-join' => '在下方輸入新帳號的資訊。',
+'createacct-emailrequired' => '電子郵件',
+'createacct-emailoptional' => '電子郵件（可選）',
+'createacct-email-ph' => '設定信件位址',
+'createacct-another-email-ph' => '輸入信件位址',
 'createaccountmail' => '使用一個臨時的隨機密碼，並將它發送到指定的電子郵件地址',
+'createacct-realname' => '真實姓名（可選）',
 'createaccountreason' => '理由：',
+'createacct-reason' => '原因',
+'createacct-reason-ph' => '您為什麼要建立另一個帳號',
+'createacct-captcha' => '安全驗證',
+'createacct-imgcaptcha-ph' => '輸入您在上方看到的文字',
+'createacct-submit' => '建立帳號',
+'createacct-another-submit' => '建立另一個使用者帳號',
+'createacct-benefit-heading' => '{{SITENAME}}是由像您一樣的人建立。',
+'createacct-benefit-body1' => '{{PLURAL:$1|次編輯}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|篇頁面}}',
+'createacct-benefit-body3' => '位近期{{PLURAL:$1|貢獻者}}',
 'badretype' => '您所輸入的密碼並不符合。',
 'userexists' => '您所輸入的使用者名稱已存在，請另選一個名稱。',
 'loginerror' => '登入錯誤',
+'createacct-error' => '帳號建立錯誤',
 'createaccounterror' => '無法建立帳號：$1',
 'nocookiesnew' => '已成功建立新帳號！偵測到您已關閉 Cookies，請開啟它並登入。',
 'nocookieslogin' => '本站利用 Cookies 進行使用者登入，偵測到您已關閉 Cookies，請開啟它並重新登入。',
@@ -753,10 +804,12 @@ $2',
 如果該賬戶建立錯誤的話，您可以忽略此訊息。',
 'usernamehasherror' => '用戶名稱不可以包含切細字元',
 'login-throttled' => '您已經嘗試多次的登入動作。
-請稍等多一會再試。',
+請稍等$1後再試。',
 'login-abort-generic' => '登入錯誤 - 中止',
 'loginlanguagelabel' => '語言：$1',
 'suspicious-userlogout' => '您登出的要求已經被拒絕，因為它可能是由已損壞的瀏覽器或者快取代理傳送。',
+'createacct-another-realname-tip' => '真實姓名為選填。
+如果您選擇提供，它將用於貢獻署名。',
 
 # Email sending
 'php-mail-error-unknown' => '在 PHP 的 mail() 參數中的未知錯誤',
@@ -772,8 +825,7 @@ $2',
 'newpassword' => '新密碼：',
 'retypenew' => '確認密碼：',
 'resetpass_submit' => '設定密碼並登入',
-'resetpass_success' => '您的密碼已經被成功更改！
-現在正為您登入...',
+'changepassword-success' => '您的密碼已成功變更！',
 'resetpass_forbidden' => '無法變更密碼',
 'resetpass-no-info' => '您必須登入後直接進入這個頁面。',
 'resetpass-submit-loggedin' => '變更密碼',
@@ -785,10 +837,11 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => '重新設定密碼',
-'passwordreset-text' => '完成此表格以重置您的密碼。',
+'passwordreset-text-one' => '完成此表格以重新設定您的密碼。',
+'passwordreset-text-many' => '{{PLURAL:$1|輸入其中一項以重新設定您的密碼。}}',
 'passwordreset-legend' => '重設密碼',
 'passwordreset-disabled' => '此圍記（Wiki）已禁用重設密碼。',
-'passwordreset-pretext' => '{{PLURAL:$1||輸入下列其中一項}}',
+'passwordreset-emaildisabled' => '此圍記（Wiki）已禁用電子郵件功能。',
 'passwordreset-username' => '使用者名稱：',
 'passwordreset-domain' => '域名：',
 'passwordreset-capture' => '檢視產生的電子郵件嗎？',
@@ -814,7 +867,7 @@ $2
 臨時密碼：$2',
 'passwordreset-emailsent' => '已發送重設密碼的電子郵件。',
 'passwordreset-emailsent-capture' => '已發送重設密碼的電子郵件，並在下面顯示。',
-'passwordreset-emailerror-capture' => '生成的提醒電子郵件如下所示，但發送失敗：$1',
+'passwordreset-emailerror-capture' => '產生的重設密碼的電子郵件如下所示，但發送給{{GENDER:$2|使用者}}失敗：$1',
 
 # Special:ChangeEmail
 'changeemail' => '變更電子郵件位址',
@@ -828,6 +881,19 @@ $2
 'changeemail-submit' => '變更電子郵件',
 'changeemail-cancel' => '取消',
 
+# Special:ResetTokens
+'resettokens' => '重設密鑰',
+'resettokens-text' => '你可以在這裡重設與您的帳戶私隱有關連的密鑰。
+
+如果您意外地與任何一個人分享這些密鑰，或者您的帳戶被入侵、受到破壞，您應該重設密鑰。',
+'resettokens-no-tokens' => '沒有可重設的密鑰。',
+'resettokens-legend' => '重設密鑰。',
+'resettokens-tokens' => '密鑰:',
+'resettokens-token-label' => '$1（現時為$2）',
+'resettokens-watchlist-token' => '請於[[Special:Watchlist|監視列表]]中更改網上訂閱（Atom或RSS）的權杖',
+'resettokens-done' => '已重設密鑰。',
+'resettokens-resetbutton' => '重設所選的密鑰',
+
 # Edit page toolbar
 'bold_sample' => '粗體文字',
 'bold_tip' => '粗體文字',
@@ -1016,12 +1082,14 @@ $2
 它可能剛剛被刪除。',
 'edit-conflict' => '編輯衝突。',
 'edit-no-change' => '您的編輯已經略過，因為文字無任何改動。',
+'postedit-confirmation' => '您的編輯已儲存。',
 'edit-already-exists' => '不可以建立一個新頁面。
 它已經存在。',
 'defaultmessagetext' => '預設訊息文字',
 'content-failed-to-parse' => '未能轉換$2 內容成為$1：$3',
 'invalid-content-data' => '內容資料無效',
 'content-not-allowed-here' => '[[$2]]頁面上不允許「$1」內容',
+'editwarning-warning' => '離開這個頁面可能會令您失去之前作出的所有更改。若您已經登入，您可在偏好設定的「編輯」部份裡關閉此警告。',
 
 # Content models
 'content-model-wikitext' => '圍記文字（Wikitext）',
@@ -1056,6 +1124,7 @@ $2
 'undo-failure' => '由於中途的編輯不一致，此編輯不能撤銷。',
 'undo-norev' => '由於其修訂版本不存在或已刪除，此編輯不能撤銷。',
 'undo-summary' => '取消由[[Special:Contributions/$2|$2]] （[[User talk:$2|對話]]）所作出的修訂 $1',
+'undo-summary-username-hidden' => '隱藏的用戶撤銷$1的修訂',
 
 # Account creation failure
 'cantcreateaccounttitle' => '無法建立帳號',
@@ -1217,6 +1286,7 @@ $1",
 'compareselectedversions' => '比較選定的修訂版本',
 'showhideselectedversions' => '顯示／隱藏選定的修訂版本',
 'editundo' => '復原',
+'diff-empty' => '（沒有差異）',
 'diff-multi' => '（由{{PLURAL:$2|1名用戶|$2名用戶}}作出的{{PLURAL:$1|一個中途修訂版本|$1個中途修訂版本}}未被顯示）',
 'diff-multi-manyusers' => '（由多於$2名用戶作出的{{PLURAL:$1|一個中途修訂版本|$1個中途修訂版本}} 未被顯示）',
 'difference-missing-revision' => '{{PLURAL:$2|1次修訂|$2 次修訂}}差異($1)不存在。
@@ -1244,7 +1314,6 @@ $1",
 'searchmenu-legend' => '搜尋選項',
 'searchmenu-exists' => "'''在這個 wiki 上已有一頁面叫做「[[:$1]]」。'''",
 'searchmenu-new' => "'''在這個 wiki 上建立這個頁面「[[:$1]]」！'''",
-'searchhelp-url' => 'Help:目錄',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|去瀏覽以此為首的頁面]]',
 'searchprofile-articles' => '內容頁面',
 'searchprofile-project' => '幫助和計劃頁面',
@@ -1285,15 +1354,7 @@ $1",
 'powersearch-togglenone' => '無',
 'search-external' => '外部搜尋',
 'searchdisabled' => '{{SITENAME}}由於性能方面的原因，全文搜索已被暫時停用。您可以暫時透過Google搜索。請留意他們的索引可能會過時。',
-
-# Quickbar
-'qbsettings' => '快速導航條',
-'qbsettings-none' => '無',
-'qbsettings-fixedleft' => '左側固定',
-'qbsettings-fixedright' => '右側固定',
-'qbsettings-floatingleft' => '左側漂移',
-'qbsettings-floatingright' => '右側漂移',
-'qbsettings-directionality' => '固定，取決於你的語言腳本的方向性',
+'search-error' => '搜尋時發生錯誤：$1',
 
 # Preferences page
 'preferences' => '偏好設定',
@@ -1327,7 +1388,6 @@ $1",
 'resetprefs' => '清除未儲存的變更',
 'restoreprefs' => '還原所有預設設定（所有部分）',
 'prefs-editing' => '編輯',
-'prefs-edit-boxsize' => '編輯框尺寸',
 'rows' => '行：',
 'columns' => '列：',
 'searchresultshead' => '搜尋',
@@ -1338,9 +1398,8 @@ $1",
 'recentchangesdays-max' => '最多$1{{PLURAL:$1|天}}',
 'recentchangescount' => '預設顯示的編輯數：',
 'prefs-help-recentchangescount' => '這個包括最近更改、頁面歷史以及日誌。',
-'prefs-help-watchlist-token' => '在這欄加入一個秘密鑰會生成一個對您監視列表中的 RSS 源。
-任何一位知道在這個欄位上的匙可以閱讀到您的監視列表，請選擇一個安全的值。
-這裡有一個任意生成的值，供您選擇：$1',
+'prefs-help-watchlist-token2' => '這是一個秘密的密鑰，用於訂源您的監視列表。
+知道它的人將能夠讀取您的監視列表，所以您不應該分享它。[[Special:ResetTokens|如有需要重設此密鑰，請點擊這裡]]。',
 'savedprefs' => '您的偏好設定已儲存。',
 'timezonelegend' => '時區：',
 'localtime' => '當地時間：',
@@ -1370,7 +1429,6 @@ $1",
 'prefs-common-css-js' => '共用 CSS/JavaScript 於所有的外觀中：',
 'prefs-reset-intro' => '您可以利用這個頁面去重設您的參數設置到網站預設值。這個動作無法復原。',
 'prefs-emailconfirm-label' => '電子郵件確認：',
-'prefs-textboxsize' => '編輯框大小',
 'youremail' => '電子郵件：',
 'username' => '{{GENDER:$1|使用者名稱}}：',
 'uid' => '{{GENDER:$1|使用者 ID}}：',
@@ -1404,6 +1462,8 @@ $1",
 'prefs-dateformat' => '日期格式',
 'prefs-timeoffset' => '時間偏移',
 'prefs-advancedediting' => '一般選項',
+'prefs-editor' => '編輯器',
+'prefs-preview' => '預覽',
 'prefs-advancedrc' => '進階選項',
 'prefs-advancedrendering' => '進階選項',
 'prefs-advancedsearchoptions' => '進階選項',
@@ -1411,7 +1471,9 @@ $1",
 'prefs-displayrc' => '顯示選項',
 'prefs-displaysearchoptions' => '顯示選項',
 'prefs-displaywatchlist' => '顯示選項',
+'prefs-tokenwatchlist' => '密鑰',
 'prefs-diffs' => '差異',
+'prefs-help-prefershttps' => '此選項將於您下次登入時生效。',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => '電子郵件位址有效',
@@ -1438,6 +1500,8 @@ $1",
 'userrights-notallowed' => '你無權加入或刪除使用者權限。',
 'userrights-changeable-col' => '您可以更改的群組',
 'userrights-unchangeable-col' => '您不可以更改的群組',
+'userrights-conflict' => '使用者權限更改發生衝突！請檢視並確認你的更改。',
+'userrights-removed-self' => '您已成功移除自己的權限，故此您沒法再次訪問此頁。',
 
 # Groups
 'group' => '群組：',
@@ -1503,11 +1567,19 @@ $1",
 'right-proxyunbannable' => '繞過Proxy的自動封鎖',
 'right-unblockself' => '解除封鎖自己',
 'right-protect' => '更改保護等級以及編輯被連鎖保護的頁面',
-'right-editprotected' => '編輯保護頁面（無連鎖保護）',
+'right-editprotected' => '編輯保護層級為「{{int:protect-level-sysop}}」的頁面',
+'right-editsemiprotected' => '編輯保護層級為「{{int:protect-level-autoconfirmed}}」的頁面',
 'right-editinterface' => '編輯用戶界面',
 'right-editusercssjs' => '編輯其他用戶的CSS和JavaScript檔案',
 'right-editusercss' => '編輯其他用戶的CSS檔案',
 'right-edituserjs' => '編輯其他用戶的JavaScript檔案',
+'right-editmyusercss' => '編輯你自己的用戶CSS檔',
+'right-editmyuserjs' => '編輯你自己的用戶JavaScript檔',
+'right-viewmywatchlist' => '檢視您的監視列表',
+'right-editmywatchlist' => '編輯您的監視列表。請注意即使沒有這種權利，某些操作仍將添加頁面。',
+'right-viewmyprivateinfo' => '檢視自己的私隱資料（如電郵地址及真實姓名）',
+'right-editmyprivateinfo' => '編輯自己的私隱資料（如電郵地址及真實姓名）',
+'right-editmyoptions' => '編輯您的設定',
 'right-rollback' => '快速復原上位用戶對某一頁面之編輯',
 'right-markbotedits' => '標示復原編輯作機械人編輯',
 'right-noratelimit' => '沒有使用頻率限制',
@@ -1569,12 +1641,19 @@ $1",
 'action-userrights-interwiki' => '編輯在其它wiki上用戶的權限',
 'action-siteadmin' => '鎖定和解除鎖定資料庫',
 'action-sendemail' => '發送電郵',
+'action-editmywatchlist' => '編輯您的監視列表�',
+'action-viewmywatchlist' => '查看您的監視列表',
+'action-viewmyprivateinfo' => '查看您的個人資料',
+'action-editmyprivateinfo' => '編輯您的個人資料',
 
 # Recent changes
 'nchanges' => '$1次更改',
+'enhancedrc-since-last-visit' => '自上次訪問已有$1',
+'enhancedrc-history' => '歷史',
 'recentchanges' => '最近變更',
 'recentchanges-legend' => '近期變更選項',
 'recentchanges-summary' => '追蹤該圍記（Wiki）的近期變更。',
+'recentchanges-noresult' => '在所選擇的時間裡沒有任何更改與所給條件吻合。',
 'recentchanges-feed-description' => '訂閱該圍記（Wiki）的近期變更。',
 'recentchanges-label-newpage' => '這次編輯建立了一個新頁面',
 'recentchanges-label-minor' => '這是一個小編輯',
@@ -1611,7 +1690,6 @@ $1",
 'recentchangeslinked-feed' => '相關變更',
 'recentchangeslinked-toolbox' => '相關變更',
 'recentchangeslinked-title' => '與「$1」有關的變更',
-'recentchangeslinked-noresult' => '在這一段時間中連結的頁面並無更改。',
 'recentchangeslinked-summary' => "這一個特殊頁面列示''由''所給出的一個頁面之連結到頁面的最近更改（或者是對於指定分類的成員）。
 在[[Special:Watchlist|您的監視列表]]中的頁面會以'''粗體'''顯示。",
 'recentchangeslinked-page' => '頁面名稱:',
@@ -1623,8 +1701,7 @@ $1",
 'reuploaddesc' => '取消上載並返回上載表單',
 'upload-tryagain' => '提交修改後的檔案描述',
 'uploadnologin' => '未登入',
-'uploadnologintext' => '您必須先[[Special:UserLogin|登入]]
-才能上載檔案。',
+'uploadnologintext' => '您必須先$1才能上載檔案。',
 'upload_directory_missing' => '上傳目錄（$1）遺失，不能由網頁伺服器建立。',
 'upload_directory_read_only' => '上傳目錄（$1）不存在或無寫權限。',
 'uploaderror' => '上傳錯誤',
@@ -1830,7 +1907,6 @@ $1',
 'http-read-error' => 'HTTP讀取錯誤。',
 'http-timed-out' => 'HTTP請求已過時。',
 'http-curl-error' => '擷取URL時出錯：$1',
-'http-host-unreachable' => '無法到達URL。',
 'http-bad-status' => '進行HTTP請求時出現問題：$1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1858,6 +1934,10 @@ $1',
 'listfiles_size' => '大小',
 'listfiles_description' => '描述',
 'listfiles_count' => '版本',
+'listfiles-show-all' => '包括圖片的舊版本',
+'listfiles-latestversion' => '目前版本',
+'listfiles-latestversion-yes' => '是',
+'listfiles-latestversion-no' => '否',
 
 # File description page
 'file-anchor-link' => '檔案',
@@ -1954,6 +2034,13 @@ $1',
 'randompage' => '隨機頁面',
 'randompage-nopages' => '在以下的{{PLURAL:$2|名字空間}}中沒有頁面：$1',
 
+# Random page in category
+'randomincategory' => '分類中的隨機頁面',
+'randomincategory-invalidcategory' => '"$1" 不是一個有效的分類名稱。',
+'randomincategory-nopages' => '[[:Category:$1]]中沒有頁面。',
+'randomincategory-selectcategory' => '從分類中獲取隨機頁面：$1 $2',
+'randomincategory-selectcategory-submit' => '顯示',
+
 # Random redirect
 'randomredirect' => '隨機重定向',
 'randomredirect-nopages' => '在「$1」名字空間中沒有重定向頁面。',
@@ -1979,21 +2066,13 @@ $1',
 'statistics-users-active-desc' => '在前$1天中操作過的用戶',
 'statistics-mostpopular' => '被查閱次數最多的頁面',
 
-'disambiguations' => '鏈接到消歧義頁的頁面',
-'disambiguationspage' => 'Template:disambig
-Template:消含糊
-Template:消除含糊
-Template:消歧义
-Template:消除歧义
-Template:消歧義
-Template:消除歧義',
-'disambiguations-text' => "以下的頁面都有至少一個連到'''消歧義頁'''的鏈接，但它們應鏈接到合適的頁面。<br />一個頁面如果使用了[[MediaWiki:Disambiguationspage]]內的模板，則會被視為消歧義頁。",
-
 'pageswithprop' => '有頁面屬性的頁面',
 'pageswithprop-legend' => '有頁面屬性的頁面',
 'pageswithprop-text' => '此頁列出所有頁面使用了特定的頁面屬性。',
 'pageswithprop-prop' => '屬性名稱：',
 'pageswithprop-submit' => '進入',
+'pageswithprop-prophidden-long' => '長文本屬性值已被隱藏（$1）',
+'pageswithprop-prophidden-binary' => '已隱藏二進位屬性值（$1）',
 
 'doubleredirects' => '雙重的重新導向',
 'doubleredirectstext' => '這一頁列出所有重定向頁面重定向到另一個重定向頁的頁面。每一行都包含到第一和第二個重定向頁面的連結，以及第二個重定向頁面的目標，通常顯示的都會是"真正"的目標頁面，也就是第一個重定向頁面應該指向的頁面。
@@ -2050,6 +2129,7 @@ Template:消除歧義',
 'mostrevisions' => '最多修訂頁面',
 'prefixindex' => '所有有前綴的頁面',
 'prefixindex-namespace' => '帶有前綴的頁面（屬於$1名字空間）',
+'prefixindex-strip' => '於列表中省略前綴',
 'shortpages' => '短頁面',
 'longpages' => '長頁面',
 'deadendpages' => '斷連頁面',
@@ -2065,6 +2145,7 @@ Template:消除歧義',
 'listusers' => '用戶列表',
 'listusers-editsonly' => '只顯示有編輯的用戶',
 'listusers-creationsort' => '按建立日期排序',
+'listusers-desc' => '使用降冪排序',
 'usereditcount' => '$1 次{{PLURAL:$1|編輯}}',
 'usercreated' => '$1 $2{{GENDER:$3|創建}}',
 'newpages' => '最新頁面',
@@ -2240,10 +2321,9 @@ Template:消除歧義',
 'unwatchthispage' => '停止監視',
 'notanarticle' => '不是頁面',
 'notvisiblerev' => '上次由不同用戶所作的修訂版本已經刪除',
-'watchnochange' => '在顯示的時間段內您所監視的頁面沒有更改。',
 'watchlist-details' => '不包含討論頁，您的監視列表上有 $1 個頁面。',
-'wlheader-enotif' => '* 已經啟動電子郵件通知功能。',
-'wlheader-showupdated' => "* 在{{GENDER:|你|妳|你}}上次檢視後有被修改過的頁面會顯示為'''粗體'''",
+'wlheader-enotif' => '已經啟動電子郵件通知功能。',
+'wlheader-showupdated' => "在{{GENDER:|你|妳|你}}上次檢視後有被修改過的頁面會顯示為'''粗體'''。",
 'watchmethod-recent' => '檢查被監視頁面的最近編輯',
 'watchmethod-list' => '檢查最近編輯的被監視頁面',
 'watchlistcontains' => '您的監視列表包含$1個頁面。',
@@ -2487,7 +2567,7 @@ $1',
 'contributions' => '{{GENDER:$1|用戶}}貢獻',
 'contributions-title' => '$1 的使用者貢獻',
 'mycontris' => '我的貢獻',
-'contribsub2' => '$1的貢獻 （$2）',
+'contribsub2' => '{{GENDER:$3|$1}} 的貢獻 （$2）',
 'nocontribs' => '沒有找到符合特徵的更改。',
 'uctop' => '（最新修改）',
 'month' => '從該月份 （或更早）:',
@@ -2641,13 +2721,11 @@ $1被封禁的理由是“$2”',
 'ipb_blocked_as_range' => '錯誤: 該IP $1 無直接查封，不可以解除封禁。但是它是在 $2 的查封範圍之內，該段範圍是可以解除封禁的。',
 'ip_range_invalid' => '無效的IP範圍。',
 'ip_range_toolarge' => '大於 /$1 的封鎖範圍是不容許的。',
-'blockme' => '查封我',
 'proxyblocker' => '代理封鎖器',
-'proxyblocker-disabled' => '這個功能已經停用。',
 'proxyblockreason' => '您的IP位址是一個開放的代理，它已經被封鎖。請聯繫您的網際網路服務提供商或技術支援者並告知告知他們該嚴重的安全問題。',
-'proxyblocksuccess' => '完成。',
 'sorbsreason' => '您的IP位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器。',
 'sorbs_create_account_reason' => '由於您的IP位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器，所以您無法建立賬號。',
+'xffblockreason' => '您或您使用的代理伺服器X-Forwarded-For字段所包含的一個IP地址已被封禁。原始封禁理由：$1',
 'cant-block-while-blocked' => '當您被封鎖時不可以封鎖其他用戶。',
 'cant-see-hidden-user' => '您現正嘗試封鎖的用戶已經被封鎖或隱藏。
 您現在沒有隱藏用戶的權限，您不可以檢視或者編輯這位用戶的封鎖。',
@@ -2814,6 +2892,8 @@ $1被封禁的理由是“$2”',
 'thumbnail-more' => '放大',
 'filemissing' => '無法找到檔案',
 'thumbnail_error' => '創建縮圖錯誤: $1',
+'thumbnail_error_remote' => '$1發出的電子郵件：
+$2',
 'djvu_page_error' => 'DjVu頁面超出範圍',
 'djvu_no_xml' => '無法在DjVu檔案中擷取XML',
 'thumbnail-temp-create' => '無法創建臨時縮略圖文件',
@@ -2962,17 +3042,11 @@ $1被封禁的理由是“$2”',
 
 # Stylesheets
 'common.css' => '/* 此處的 CSS 將應用於所有的面板 */',
-'standard.css' => '/* 此處的 CSS 將影響使用標準面板的用戶 */',
-'nostalgia.css' => '/* 此處的 CSS 將影響使用懷舊面板的用戶 */',
 'cologneblue.css' => '/* 此處的 CSS 將影響使用科隆香水藍面板的用戶 */',
 'monobook.css' => '/* 此處的 CSS 將影響使用 Monobook 面板的用戶 */',
-'myskin.css' => '/* 此處的 CSS 將影響使用 MySkin 面板的用戶 */',
-'chick.css' => '/* 此處的 CSS 將影響使用 Chick 面板的用戶 */',
-'simple.css' => '/* 此處的 CSS 將影響使用 Simple 面板的用戶 */',
 'modern.css' => '/* 此處的 CSS 將影響使用 Modern 面板的用戶 */',
 'vector.css' => '/* 此處的 CSS 將影響使用 Vector 面板的用戶 */',
 'print.css' => '/* 此處的 CSS 將影響打印輸出 */',
-'handheld.css' => '/* 此處的 CSS 將影響在 $wgHandheldStyle 設定手提裝置面板 */',
 'noscript.css' => '/* 此處的 CSS 將影響沒有啓用 JavaScript 的用戶 */',
 'group-autoconfirmed.css' => '/* 此處的 CSS 將只會影響自動確認用戶 */',
 'group-bot.css' => '/* 此處的 CSS 將只會影響機器人 */',
@@ -2981,13 +3055,8 @@ $1被封禁的理由是“$2”',
 
 # Scripts
 'common.js' => '/* 此處的JavaScript將載入於所有用戶每一個頁面。 */',
-'standard.js' => '/* 此處的JavaScript將載入於使用標準面板的用戶 */',
-'nostalgia.js' => '/* 此處的JavaScript將載入於使用懷舊面板的用戶 */',
 'cologneblue.js' => '/* 此處的JavaScript將載入於使用科隆香水藍面板的用戶 */',
 'monobook.js' => '/* 此處的JavaScript將載入於使用Monobook面板的用戶 */',
-'myskin.js' => '/* 此處的JavaScript將載入於使用MySkin面板的用戶 */',
-'chick.js' => '/* 此處的JavaScript將載入於使用Chick面板的用戶 */',
-'simple.js' => '/* 此處的JavaScript將載入於使用Simple面板的用戶 */',
 'modern.js' => '/* 此處的JavaScript將載入於使用Modern面板的用戶 */',
 'vector.js' => '/* 此處的JavaScript將載入於使用Vector面板的用戶 */',
 
@@ -3063,10 +3132,7 @@ $1被封禁的理由是“$2”',
 'pageinfo-category-files' => '編輯數量',
 
 # Skin names
-'skinname-standard' => '標準',
-'skinname-nostalgia' => '懷舊',
 'skinname-cologneblue' => '科隆香水藍',
-'skinname-simple' => '簡單',
 'skinname-modern' => '現代',
 
 # Patrolling
@@ -3144,11 +3210,25 @@ $1',
 'minutes' => '$1分鍾',
 'hours' => '$1小時',
 'days' => '$1天',
+'weeks' => '{{PLURAL:$1|$1周}}',
 'months' => '{{PLURAL:$1|$1個月}}',
 'years' => '{{PLURAL:$1|$1年}}',
 'ago' => '$1前',
 'just-now' => '剛才',
 
+# Human-readable timestamps
+'hours-ago' => '$1小時前',
+'minutes-ago' => '$1分鐘前',
+'seconds-ago' => '$1秒前',
+'monday-at' => '於星期一$1',
+'tuesday-at' => '於星期二$1',
+'wednesday-at' => '於星期三$1',
+'thursday-at' => '於星期四$1',
+'friday-at' => '於星期五$1',
+'saturday-at' => '於星期六$1',
+'sunday-at' => '於星期日$1',
+'yesterday-at' => '昨天$1',
+
 # Bad image list
 'bad_image_list' => '請按照下列格式編寫：
 
@@ -3197,7 +3277,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '寬度',
 'exif-imagelength' => '高度',
 'exif-bitspersample' => '每象素比特數',
@@ -3375,7 +3455,7 @@ Variants for Chinese language
 'exif-originalimageheight' => '被裁剪前高度',
 'exif-originalimagewidth' => '被裁剪前寬度',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '未壓縮',
 'exif-compression-2' => 'CCITT第3組一維修改霍夫曼遊程編碼',
 'exif-compression-3' => 'CCITT第3組傳真編碼',
@@ -3767,7 +3847,6 @@ $5
 'version-other' => '其他',
 'version-mediahandlers' => '媒體處理器',
 'version-hooks' => '鈎',
-'version-extension-functions' => '擴展函數',
 'version-parser-extensiontags' => '語法擴展標籤',
 'version-parser-function-hooks' => '語法函數鈎',
 'version-hook-name' => '鈎名',
@@ -3776,6 +3855,7 @@ $5
 'version-license' => '授權',
 'version-poweredby-credits' => "此維基由'''[//www.mediawiki.org/ MediaWiki]'''驅動，版權所有 © 2001-$1 $2。",
 'version-poweredby-others' => '其他',
+'version-poweredby-translators' => 'translatewiki.net 上的翻譯者',
 'version-credits-summary' => '我們感謝以下人士為[[Special:Version|MediaWiki]]作出的貢獻。',
 'version-license-info' => 'MediaWiki為自由軟件；您可依據自由軟件基金會所發表的GNU通用公共授權條款規定，就本程式再為發佈與／或修改；無論您依據的是本授權的第二版或（您自行選擇的）任一日後發行的版本。
 
@@ -3790,11 +3870,17 @@ MediaWiki是基於使用目的而加以發佈，然而不負任何擔保責任
 'version-entrypoints-header-url' => 'URL',
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath 條目路徑]',
 
-# Special:FilePath
-'filepath' => '檔案路徑',
-'filepath-page' => '檔案名：',
-'filepath-submit' => '前往',
-'filepath-summary' => '這個特殊頁面擷取一個檔案的完整路徑。圖片會以完整的解像度顯示，其它的檔案類型會以同它們已關聯程式啟動。',
+# Special:Redirect
+'redirect' => '重定向檔案、用戶ID或頁面修訂ID',
+'redirect-legend' => '重定向到檔案或頁面',
+'redirect-summary' => '此特殊頁面重定向到檔案（指定的檔案名稱）、頁面 （指定的頁面修訂ID） 或用戶頁面（指定的用戶ID數值）。',
+'redirect-submit' => '提交',
+'redirect-lookup' => '尋找：',
+'redirect-value' => '值：',
+'redirect-user' => '用戶ID：',
+'redirect-revision' => '頁面修訂ID',
+'redirect-file' => '檔案名稱',
+'redirect-not-exists' => '找不到',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '選擇重覆檔案',
@@ -3844,12 +3930,16 @@ MediaWiki是基於使用目的而加以發佈，然而不負任何擔保責任
 'tags' => '有效標籤',
 'tag-filter' => '[[Special:Tags|標籤]]過濾器:',
 'tag-filter-submit' => '搜尋',
+'tag-list-wrapper' => '（[[Special:Tags|$1個標籤]]：$2）',
 'tags-title' => '標籤',
 'tags-intro' => '這個頁面列示出在軟件中已標示的編輯，以及它們的解釋。',
 'tags-tag' => '標籤名稱',
 'tags-display-header' => '在更改清單中的出現方式',
 'tags-description-header' => '解釋完整描述',
+'tags-active-header' => '存檔？',
 'tags-hitcount-header' => '已加上標籤的更改',
+'tags-active-yes' => '是',
+'tags-active-no' => '否',
 'tags-edit' => '編輯',
 'tags-hitcount' => '$1次更改',
 
@@ -3870,6 +3960,7 @@ MediaWiki是基於使用目的而加以發佈，然而不負任何擔保責任
 'dberr-problems' => '歉！這個網站出現了一些技術上的問題。',
 'dberr-again' => '嘗試等候數分鐘後，然後再試。',
 'dberr-info' => '（無法連繫到資料庫伺服器: $1）',
+'dberr-info-hidden' => '（無法與資料庫伺服器聯繫）',
 'dberr-usegoogle' => '在現階段您可以嘗試透過 Google 搜尋。',
 'dberr-outofdate' => '留意他們索引出來之內容可能不是最新的。',
 'dberr-cachederror' => '這個是所要求出來的快取複本，可能不是最新的。',
@@ -3885,6 +3976,9 @@ MediaWiki是基於使用目的而加以發佈，然而不負任何擔保責任
 'htmlform-submit' => '提交',
 'htmlform-reset' => '撤銷更改',
 'htmlform-selectorother-other' => '其他',
+'htmlform-no' => '否',
+'htmlform-yes' => '是',
+'htmlform-chosen-placeholder' => '選項',
 
 # SQLite database support
 'sqlite-has-fts' => '帶全文搜尋的版本$1',
@@ -4001,4 +4095,19 @@ MediaWiki是基於使用目的而加以發佈，然而不負任何擔保責任
 # Image rotation
 'rotate-comment' => '順時針旋轉圖像$1{{PLURAL:$1|度}}',
 
+# Limit report
+'limitreport-title' => '分析器分析資料：',
+'limitreport-cputime' => 'CPU使用時間',
+'limitreport-cputime-value' => '$1秒',
+'limitreport-walltime' => '實際使用時間',
+'limitreport-walltime-value' => '$1秒',
+'limitreport-ppvisitednodes' => '預處理器訪問節點計數',
+'limitreport-ppgeneratednodes' => '預處理器生成節點計數',
+'limitreport-postexpandincludesize' => '展開後大小',
+'limitreport-postexpandincludesize-value' => '$1/$2 個{{PLURAL:$2|位元組}}',
+'limitreport-templateargumentsize' => '模板參數大小',
+'limitreport-templateargumentsize-value' => '$1/$2 個{{PLURAL:$2|位元組}}',
+'limitreport-expansiondepth' => '最高展開深度',
+'limitreport-expensivefunctioncount' => '昂貴分析器函數計數',
+
 );
diff --git a/languages/messages/MessagesZh_tw.php b/languages/messages/MessagesZh_tw.php
index 7d984604..2d9b8185 100644
--- a/languages/messages/MessagesZh_tw.php
+++ b/languages/messages/MessagesZh_tw.php
@@ -875,12 +875,7 @@ $NEWPAGE
 只有列示項目（以 * 開頭的項目）會被考慮。第一個連結一定要連接去壞圖片中。
 然後在同一行的連結會考慮作例外，即是幅圖片可以在哪一個頁面中同時顯示。',
 
-/*
-Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
-Variants for Chinese language
-*/
+# Variants for Chinese language
 'variantname-zh-tw' => '台灣繁體',
 
 # Metadata
diff --git a/languages/messages/MessagesZu.php b/languages/messages/MessagesZu.php
index 380cf32e..5efa16a9 100644
--- a/languages/messages/MessagesZu.php
+++ b/languages/messages/MessagesZu.php
@@ -9,8 +9,6 @@
  *
  * @author Jose77 (on zu.wikipedia.org)
  * @author Joziboy (on zu.wikipedia.org)
- * @author Rosinah3
- * @author Vogone
  * @author לערי ריינהארט
  */
 
@@ -25,18 +23,18 @@ $messages = array(
 'thursday' => 'uLwesine',
 'friday' => 'uLwesihlanu',
 'saturday' => 'uMgqibelo',
-'january' => 'Umasingana',
-'february' => 'uNhlolanja',
-'march' => 'uMbasa',
-'april' => 'uNdasa',
-'may_long' => 'uNhlaba',
-'june' => 'uNhlangulana',
-'july' => 'uNtulikazi',
-'august' => 'uNcwaba',
-'september' => 'uMandulo',
-'october' => 'uMfumfu',
-'november' => 'uLwezi',
-'december' => 'uZibandlela',
+'january' => 'uJanuwali',
+'february' => 'uFebruwari',
+'march' => 'uMashi',
+'april' => 'u-Apreli',
+'may_long' => 'uMeyi',
+'june' => 'uJuni',
+'july' => 'uJulayi',
+'august' => 'u-Agasti',
+'september' => 'uSepthemba',
+'october' => 'u-Okthoba',
+'november' => 'uNovemba',
+'december' => 'uDisemba',
 'january-gen' => 'uJanuwali',
 'february-gen' => 'uFebruwari',
 'march-gen' => 'uMashi',
@@ -101,7 +99,6 @@ $messages = array(
 'portal' => 'Umnyango wamgwamanda',
 'portal-url' => 'Project:Umnyango wamgwamanda',
 
-'ok' => 'Kulungile',
 'newmessageslink' => 'Imilayezo emisha',
 'youhavenewmessagesmulti' => 'Uyanemilayezo emisha e $1',
 'editsection' => 'hlela',
@@ -124,8 +121,9 @@ $messages = array(
 'internalerror' => 'Icala lingaphakathi',
 
 # Login and logout pages
-'welcomeuser' => 'Umbingelelo, $1!',
-'welcomecreation-msg' => 'Ikhawundi lakho liyadalwa. Musa ukukhohlwa ukuguqula [[Special:Preferences|amakhethelo]] a-Wikipedia wakho.',
+'welcomecreation' => '== Umbingelelo, $1! ==
+
+ikhawundi lakho liyadalwa. musa ukukhohlwa ukuguqula amakhethelo a-{{SITENAME}} wakho.',
 'yourname' => 'Isiga',
 'yourpassword' => 'Izwi elingenangozi',
 'yourpasswordagain' => 'Bhala izwi elingenangozi lakho kabusha',
@@ -191,7 +189,7 @@ $messages = array(
 'mypreferences' => 'Amakhethelo ami',
 'prefsnologin' => 'Awungenile',
 'changepassword' => 'Guqula izwi elingenangozi',
-'saveprefs' => 'Ukonga',
+'saveprefs' => 'Saveprefs',
 'searchresultshead' => 'Sesha',
 'timezonelegend' => 'Isifunda sasikhathi',
 'localtime' => 'Isikhathi siyalapha',
@@ -244,7 +242,7 @@ $messages = array(
 'allinnamespace' => 'Onke amakhasi ($1 namespace)',
 'allpagessubmit' => 'Hamba',
 
-# Email user
+# E-mail user
 'emailuser' => 'Thumela umlayezo lo msebenzisi',
 'noemailtitle' => 'Akukho ikheli likaposi',
 'emailsubject' => 'Indaba',
@@ -258,6 +256,8 @@ $messages = array(
 'unwatch' => "Mus'ukubukela",
 'notanarticle' => 'Akulona ikhasi elinakho okuqukethwe',
 
+'enotif_newpagetext' => 'Lelikhasi liyasha.',
+
 # Delete
 'deletepage' => 'Sula ikhasi',
 'confirm' => 'Qinisekisa',
@@ -278,7 +278,6 @@ $messages = array(
 'mycontris' => 'Amanikelo ami',
 
 # What links here
-'nolinkshere' => "Akukho amakhasi ukuthi balayela lapha '''[[:$1]]'''.",
 'isredirect' => 'Ikhasi silayela',
 
 # Block/unblock
@@ -316,12 +315,6 @@ $messages = array(
 # Special:Import
 'import-interwiki-submit' => 'Ngenisa',
 
-# Tooltip help for the actions
-'tooltip-search' => 'Phenya',
-'tooltip-search-fulltext' => '
-Phenya amakhasi ukuze uthole lombhalo',
-'tooltip-p-logo' => 'vakashela ikhasi elikhulu',
-
 # Attribution
 'others' => 'Abanye',
 
@@ -368,7 +361,7 @@ Phenya amakhasi ukuze uthole lombhalo',
 'exif-sharpness-1' => 'Kuntofontofo',
 'exif-sharpness-2' => 'Kulukhuni',
 
-# Email address confirmation
+# E-mail address confirmation
 'confirmemail' => 'Qinisekisa ikheli likagesi',
 'confirmemail_loggedin' => 'Ikheli likagesi lakho liqinisekiswa.',
 
diff --git a/languages/utils/CLDRPluralRuleEvaluator.php b/languages/utils/CLDRPluralRuleEvaluator.php
index 56627f7d..d3a863b4 100644
--- a/languages/utils/CLDRPluralRuleEvaluator.php
+++ b/languages/utils/CLDRPluralRuleEvaluator.php
@@ -67,7 +67,7 @@ class CLDRPluralRuleEvaluator {
 	public static function evaluateCompiled( $number, array $rules ) {
 		// The compiled form is RPN, with tokens strictly delimited by
 		// spaces, so this is a simple RPN evaluator.
-		foreach ( $rules as $i => $rule  ) {
+		foreach ( $rules as $i => $rule ) {
 			$stack = array();
 			$zero = ord( '0' );
 			$nine = ord( '9' );
@@ -104,7 +104,7 @@ class CLDRPluralRuleEvaluator {
 	 */
 	private static function doOperation( $token, $left, $right ) {
 		if ( in_array( $token, array( 'in', 'not-in', 'within', 'not-within' ) ) ) {
-			if ( !($right instanceof CLDRPluralRuleEvaluator_Range ) ) {
+			if ( !( $right instanceof CLDRPluralRuleEvaluator_Range ) ) {
 				$right = new CLDRPluralRuleEvaluator_Range( $right );
 			}
 		}
@@ -127,7 +127,7 @@ class CLDRPluralRuleEvaluator {
 				return !$right->isNumberWithin( $left );
 			case 'mod':
 				if ( is_int( $left ) ) {
-					return (int) fmod( $left, $right );
+					return (int)fmod( $left, $right );
 				}
 				return fmod( $left, $right );
 			case ',':
@@ -305,7 +305,7 @@ class CLDRPluralRuleConverter {
 				continue;
 			} else {
 				// Operator
-				if  ( !$expectOperator ) {
+				if ( !$expectOperator ) {
 					$token->error( 'unexpected operator' );
 				}
 				// Resolve higher precedence levels
@@ -381,7 +381,7 @@ class CLDRPluralRuleConverter {
 
 		// Word
 		if ( !preg_match( self::WORD_REGEX, $this->rule, $m, 0, $this->pos ) ) {
-			$this->error( 'unexpected character "' . $this->rule[$this->pos] . '"'  );
+			$this->error( 'unexpected character "' . $this->rule[$this->pos] . '"' );
 		}
 		$word1 = strtolower( $m[0] );
 		$word2 = '';
diff --git a/load.php b/load.php
index f363c3fa..1790f483 100644
--- a/load.php
+++ b/load.php
@@ -25,15 +25,11 @@
 // Bail if PHP is too low
 if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
 	// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
-	require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
+	require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
 	wfPHPVersionError( 'load.php' );
 }
 
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-	require ( 'phase3/includes/WebStart.php' );
-} else {
-	require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
 
 wfProfileIn( 'load.php' );
 
diff --git a/maintenance/Doxyfile b/maintenance/Doxyfile
index e6862acd..ffc8c3b0 100644
--- a/maintenance/Doxyfile
+++ b/maintenance/Doxyfile
@@ -1,5 +1,7 @@
-# Doxyfile 1.7.5.1
+# Doxyfile 1.7.6.1
 
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for MediaWiki.
 #
 # Some placeholders have been added for MediaWiki usage:
 # {{OUTPUT_DIRECTORY}}
@@ -44,7 +46,7 @@ QT_AUTOBRIEF           = NO
 MULTILINE_CPP_IS_BRIEF = NO
 INHERIT_DOCS           = YES
 SEPARATE_MEMBER_PAGES  = NO
-TAB_SIZE               = 8
+TAB_SIZE               = 4
 ALIASES =	"type{1}=<b> \1 </b>:" \
 		"types{2}=<b> \1 </b> or <b> \2 </b>:" \
 		"types{3}=<b> \1 </b>, <b> \2 </b>, or <b> \3 </b>:" \
@@ -64,6 +66,7 @@ ALIASES =	"type{1}=<b> \1 </b>:" \
 		"copyright=\note" \
 		"license=\note" \
 		"codeCoverageIgnore="
+TCL_SUBST              =
 OPTIMIZE_OUTPUT_FOR_C  = NO
 OPTIMIZE_OUTPUT_JAVA   = NO
 OPTIMIZE_FOR_FORTRAN   = NO
@@ -72,13 +75,14 @@ EXTENSION_MAPPING      =
 BUILTIN_STL_SUPPORT    = NO
 CPP_CLI_SUPPORT        = NO
 SIP_SUPPORT            = NO
-IDL_PROPERTY_SUPPORT   = NO
+IDL_PROPERTY_SUPPORT   = YES
 DISTRIBUTE_GROUP_DOC   = YES
 SUBGROUPING            = YES
 INLINE_GROUPED_CLASSES = NO
 INLINE_SIMPLE_STRUCTS  = NO
 TYPEDEF_HIDES_STRUCT   = NO
 SYMBOL_CACHE_SIZE      = 0
+LOOKUP_CACHE_SIZE      = 1
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
@@ -176,6 +180,7 @@ FILE_PATTERNS          = *.c \
                          *.txt \
                          README
 RECURSIVE              = YES
+EXCLUDE                = {{EXCLUDE}}
 EXCLUDE_SYMLINKS       = YES
 EXCLUDE_PATTERNS       = LocalSettings.php AdminSettings.php StartProfiler.php .svn */.git/* {{EXCLUDE_PATTERNS}}
 EXCLUDE_SYMBOLS        =
@@ -216,7 +221,7 @@ HTML_STYLESHEET        =
 HTML_EXTRA_FILES       =
 HTML_COLORSTYLE_HUE    = 220
 HTML_COLORSTYLE_SAT    = 100
-HTML_COLORSTYLE_GAMMA  =  80
+HTML_COLORSTYLE_GAMMA  = 80
 HTML_TIMESTAMP         = YES
 HTML_ALIGN_MEMBERS     = YES
 HTML_DYNAMIC_SECTIONS  = NO
@@ -358,7 +363,7 @@ MSCFILE_DIRS           =
 DOT_GRAPH_MAX_NODES    = 50
 MAX_DOT_GRAPH_DEPTH    = 1000
 DOT_TRANSPARENT        = NO
-DOT_MULTI_TARGETS      = NO
+DOT_MULTI_TARGETS      = YES
 GENERATE_LEGEND        = YES
 DOT_CLEANUP            = YES
 
diff --git a/maintenance/Maintenance.php b/maintenance/Maintenance.php
index a13453df..30e93c90 100644
--- a/maintenance/Maintenance.php
+++ b/maintenance/Maintenance.php
@@ -23,7 +23,7 @@
 // Make sure we're on PHP5.3.2 or better
 if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
 	// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
-	require_once( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
+	require_once dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
 	wfPHPVersionError( 'cli' );
 }
 
@@ -54,8 +54,8 @@ abstract class Maintenance {
 	 * Constants for DB access type
 	 * @see Maintenance::getDbType()
 	 */
-	const DB_NONE  = 0;
-	const DB_STD   = 1;
+	const DB_NONE = 0;
+	const DB_STD = 1;
 	const DB_ADMIN = 2;
 
 	// Const for getStdin()
@@ -153,7 +153,7 @@ abstract class Maintenance {
 			return false; // last call should be to this function
 		}
 		$includeFuncs = array( 'require_once', 'require', 'include', 'include_once' );
-		for( $i=1; $i < $count; $i++ ) {
+		for ( $i = 1; $i < $count; $i++ ) {
 			if ( !in_array( $bt[$i]['function'], $includeFuncs ) ) {
 				return false; // previous calls should all be "requires"
 			}
@@ -327,7 +327,7 @@ abstract class Maintenance {
 		}
 		if ( $channel === null ) {
 			$this->cleanupChanneled();
-			print( $out );
+			print $out;
 		} else {
 			$out = preg_replace( '/\n\z/', '', $out );
 			$this->outputChanneled( $out, $channel );
@@ -426,9 +426,10 @@ abstract class Maintenance {
 		$this->addOption( 'server', "The protocol and server name to use in URLs, e.g. " .
 				"http://en.wikipedia.org. This is sometimes necessary because " .
 				"server name detection may fail in command line scripts.", false, true );
+		$this->addOption( 'profiler', 'Set to "text" or "trace" to show profiling output', false, true );
 
 		# Save generic options to display them separately in help
-		$this->mGenericParameters = $this->mParams ;
+		$this->mGenericParameters = $this->mParams;
 
 		# Script dependant options:
 
@@ -452,11 +453,11 @@ abstract class Maintenance {
 	 */
 	public function runChild( $maintClass, $classFile = null ) {
 		// Make sure the class is loaded first
-		if ( !MWInit::classExists( $maintClass ) ) {
+		if ( !class_exists( $maintClass ) ) {
 			if ( $classFile ) {
-				require_once( $classFile );
+				require_once $classFile;
 			}
-			if ( !MWInit::classExists( $maintClass ) ) {
+			if ( !class_exists( $maintClass ) ) {
 				$this->error( "Cannot spawn child: $maintClass" );
 			}
 		}
@@ -476,15 +477,20 @@ abstract class Maintenance {
 	 * Do some sanity checking and basic setup
 	 */
 	public function setup() {
-		global $wgCommandLineMode, $wgRequestTime;
+		global $IP, $wgCommandLineMode, $wgRequestTime;
 
 		# Abort if called from a web server
 		if ( isset( $_SERVER ) && isset( $_SERVER['REQUEST_METHOD'] ) ) {
 			$this->error( 'This script must be run from the command line', true );
 		}
 
+		if ( $IP === null ) {
+			$this->error( "\$IP not set, aborting!\n" .
+				'(Did you forget to call parent::__construct() in your maintenance script?)', 1 );
+		}
+
 		# Make sure we can handle script parameters
-		if ( !function_exists( 'hphp_thread_set_warmup_enabled' ) && !ini_get( 'register_argc_argv' ) ) {
+		if ( !defined( 'HPHP_VERSION' ) && !ini_get( 'register_argc_argv' ) ) {
 			$this->error( 'Cannot get command line arguments, register_argc_argv is set to false', true );
 		}
 
@@ -515,7 +521,7 @@ abstract class Maintenance {
 		$wgCommandLineMode = true;
 
 		# Turn off output buffering if it's on
-		while( ob_get_level() > 0 ) {
+		while ( ob_get_level() > 0 ) {
 			ob_end_flush();
 		}
 
@@ -634,7 +640,7 @@ abstract class Maintenance {
 			} elseif ( substr( $arg, 0, 1 ) == '-' ) {
 				# Short options
 				for ( $p = 1; $p < strlen( $arg ); $p++ ) {
-					$option = $arg { $p } ;
+					$option = $arg { $p };
 					if ( !isset( $this->mParams[$option] ) && isset( $this->mShortParamsMap[$option] ) ) {
 						$option = $this->mShortParamsMap[$option];
 					}
@@ -712,7 +718,7 @@ abstract class Maintenance {
 	 * @param $force boolean Whether to force the help to show, default false
 	 */
 	protected function maybeHelp( $force = false ) {
-		if( !$force && !$this->hasOption( 'help' ) ) {
+		if ( !$force && !$this->hasOption( 'help' ) ) {
 			return;
 		}
 
@@ -743,8 +749,9 @@ abstract class Maintenance {
 				} else {
 					$output .= '[' . $arg['name'] . ']';
 				}
-				if ( $k < count( $this->mArgList ) - 1 )
+				if ( $k < count( $this->mArgList ) - 1 ) {
 					$output .= ' ';
+				}
 			}
 		}
 		$this->output( "$output\n\n" );
@@ -765,7 +772,7 @@ abstract class Maintenance {
 		$this->output( "\n" );
 
 		$scriptDependantParams = $this->mDependantParameters;
-		if( count($scriptDependantParams) > 0 ) {
+		if ( count( $scriptDependantParams ) > 0 ) {
 			$this->output( "Script dependant parameters:\n" );
 			// Parameters description
 			foreach ( $scriptDependantParams as $par => $info ) {
@@ -790,7 +797,7 @@ abstract class Maintenance {
 			$this->mGenericParameters,
 			$this->mDependantParameters
 		);
-		if( count($scriptSpecificParams) > 0 ) {
+		if ( count( $scriptSpecificParams ) > 0 ) {
 			$this->output( "Script specific parameters:\n" );
 			// Parameters description
 			foreach ( $scriptSpecificParams as $par => $info ) {
@@ -806,7 +813,7 @@ abstract class Maintenance {
 		}
 
 		// Print arguments
-		if( count( $this->mArgList ) > 0 ) {
+		if ( count( $this->mArgList ) > 0 ) {
 			$this->output( "Arguments:\n" );
 			// Arguments description
 			foreach ( $this->mArgList as $info ) {
@@ -839,7 +846,7 @@ abstract class Maintenance {
 		$wgCommandLineMode = true;
 
 		# Override $wgServer
-		if( $this->hasOption( 'server') ) {
+		if ( $this->hasOption( 'server' ) ) {
 			$wgServer = $this->getOption( 'server', $wgServer );
 		}
 
@@ -876,6 +883,16 @@ abstract class Maintenance {
 		$wgShowSQLErrors = true;
 		@set_time_limit( 0 );
 		$this->adjustMemoryLimit();
+
+		// Per-script profiling; useful for debugging
+		$forcedProfiler = $this->getOption( 'profiler' );
+		if ( $forcedProfiler === 'text' ) {
+			Profiler::setInstance( new ProfilerSimpleText( array() ) );
+			Profiler::instance()->setTemplated( true );
+		} elseif ( $forcedProfiler === 'trace' ) {
+			Profiler::setInstance( new ProfilerSimpleTrace( array() ) );
+			Profiler::instance()->setTemplated( true );
+		}
 	}
 
 	/**
@@ -906,7 +923,7 @@ abstract class Maintenance {
 
 		if ( isset( $this->mOptions['conf'] ) ) {
 			$settingsFile = $this->mOptions['conf'];
-		} elseif ( defined("MW_CONFIG_FILE") ) {
+		} elseif ( defined( "MW_CONFIG_FILE" ) ) {
 			$settingsFile = MW_CONFIG_FILE;
 		} else {
 			$settingsFile = "$IP/LocalSettings.php";
@@ -1025,7 +1042,7 @@ abstract class Maintenance {
 						( strpos( file_get_contents( $file ), '$maintClass' ) === false ) ) {
 						continue;
 					}
-					require( $file );
+					require $file;
 					$vars = get_defined_vars();
 					if ( array_key_exists( 'maintClass', $vars ) ) {
 						self::$mCoreScripts[$vars['maintClass']] = $file;
@@ -1076,7 +1093,7 @@ abstract class Maintenance {
 	 * @param &$db DatabaseBase object
 	 */
 	private function unlockSearchindex( &$db ) {
-		$db->unlockTables(  __CLASS__ . '::' . __METHOD__ );
+		$db->unlockTables( __CLASS__ . '::' . __METHOD__ );
 	}
 
 	/**
@@ -1143,8 +1160,7 @@ abstract class Maintenance {
 			$title = $titleObj->getPrefixedDBkey();
 			$this->output( "$title..." );
 			# Update searchindex
-			# TODO: pass the Content object to SearchUpdate, let the search engine decide how to deal with it.
-			$u = new SearchUpdate( $pageId, $titleObj->getText(), $rev->getContent()->getTextForSearchIndex() );
+			$u = new SearchUpdate( $pageId, $titleObj->getText(), $rev->getContent() );
 			$u->doUpdate();
 			$this->output( "\n" );
 		}
@@ -1160,7 +1176,7 @@ abstract class Maintenance {
 	 * @return bool
 	 */
 	public static function posix_isatty( $fd ) {
-		if ( !MWInit::functionExists( 'posix_isatty' ) ) {
+		if ( !function_exists( 'posix_isatty' ) ) {
 			return !$fd;
 		} else {
 			return posix_isatty( $fd );
@@ -1190,7 +1206,9 @@ abstract class Maintenance {
 					$st = fgets( STDIN, 1024 );
 				}
 			}
-			if ( $st === false ) return false;
+			if ( $st === false ) {
+				return false;
+			}
 			$resp = trim( $st );
 			return $resp;
 		}
diff --git a/maintenance/archives/patch-archive-ar_id.sql b/maintenance/archives/patch-archive-ar_id.sql
new file mode 100644
index 00000000..ddd1d7b4
--- /dev/null
+++ b/maintenance/archives/patch-archive-ar_id.sql
@@ -0,0 +1,8 @@
+--
+-- patch-archive-ar_id.sql
+--
+-- Bug 39675. Add archive.ar_id.
+
+ALTER TABLE /*$wgDBprefix*/archive
+    ADD COLUMN ar_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
+    ADD PRIMARY KEY (ar_id);
diff --git a/maintenance/archives/patch-change_tag.sql b/maintenance/archives/patch-change_tag.sql
index 030e086b..3079a5bb 100644
--- a/maintenance/archives/patch-change_tag.sql
+++ b/maintenance/archives/patch-change_tag.sql
@@ -13,20 +13,3 @@ CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag
 CREATE UNIQUE INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag (ct_rev_id,ct_tag);
 -- Covering index, so we can pull all the info only out of the index.
 CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
-
--- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT that only works on MySQL 4.1+
-CREATE TABLE /*_*/tag_summary (
-	ts_rc_id int NULL,
-	ts_log_id int NULL,
-	ts_rev_id int NULL,
-	ts_tags BLOB NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
-CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
-
-
-CREATE TABLE /*_*/valid_tag (
-	vt_tag varchar(255) NOT NULL PRIMARY KEY
-) /*$wgDBTableOptions*/;
diff --git a/maintenance/archives/patch-eu_local_id.sql b/maintenance/archives/patch-eu_local_id.sql
deleted file mode 100644
index bb59d067..00000000
--- a/maintenance/archives/patch-eu_local_id.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-ALTER TABLE /*_*/external_user
-CHANGE COLUMN eu_wiki_id
-eu_local_id int unsigned NOT NULL;
diff --git a/maintenance/archives/patch-external_user.sql b/maintenance/archives/patch-external_user.sql
deleted file mode 100644
index 176b46d4..00000000
--- a/maintenance/archives/patch-external_user.sql
+++ /dev/null
@@ -1,9 +0,0 @@
-CREATE TABLE /*_*/external_user (
-  -- Foreign key to user_id
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-
-  -- Some opaque identifier provided by the external database
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
diff --git a/maintenance/archives/patch-externallinks-el_id.sql b/maintenance/archives/patch-externallinks-el_id.sql
new file mode 100644
index 00000000..d4b51b51
--- /dev/null
+++ b/maintenance/archives/patch-externallinks-el_id.sql
@@ -0,0 +1,8 @@
+--
+-- patch-extenallinks-el_id.sql
+--
+-- Bug 15441. Add externallinks.el_id.
+
+ALTER TABLE /*$wgDBprefix*/externallinks
+    ADD COLUMN el_id int unsigned NOT NULL AUTO_INCREMENT FIRST,
+    ADD PRIMARY KEY (el_id);
diff --git a/maintenance/archives/patch-iwl_prefix_title_from-non-unique.sql b/maintenance/archives/patch-iwl_prefix_title_from-non-unique.sql
new file mode 100644
index 00000000..bff63c74
--- /dev/null
+++ b/maintenance/archives/patch-iwl_prefix_title_from-non-unique.sql
@@ -0,0 +1,5 @@
+--
+-- Makes the iwl_prefix_title_from index for the iwlinks table non-unique
+--
+DROP INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks;
+CREATE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
diff --git a/maintenance/archives/patch-iwlinks-from-title-index.sql b/maintenance/archives/patch-iwlinks-from-title-index.sql
new file mode 100644
index 00000000..8b73f9e3
--- /dev/null
+++ b/maintenance/archives/patch-iwlinks-from-title-index.sql
@@ -0,0 +1,4 @@
+--
+-- Recreates the iwl_prefix_from_title index for the iwlinks table
+--
+CREATE INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
diff --git a/maintenance/archives/patch-kill-iwl_pft.sql b/maintenance/archives/patch-kill-iwl_pft.sql
deleted file mode 100644
index 96e14356..00000000
--- a/maintenance/archives/patch-kill-iwl_pft.sql
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- Kill the old iwl_prefix_from_title index, which may be present on some
--- installs if they ran update.php between it being added and being renamed
---
-
-DROP INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks;
-
diff --git a/maintenance/archives/patch-tag_summary.sql b/maintenance/archives/patch-tag_summary.sql
new file mode 100644
index 00000000..a81b3680
--- /dev/null
+++ b/maintenance/archives/patch-tag_summary.sql
@@ -0,0 +1,12 @@
+-- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT that only works on MySQL 4.1+
+-- Andrew Garrett, 2009-01
+CREATE TABLE /*_*/tag_summary (
+	ts_rc_id int NULL,
+	ts_log_id int NULL,
+	ts_rev_id int NULL,
+	ts_tags BLOB NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/tag_summary_rc_id ON /*_*/tag_summary (ts_rc_id);
+CREATE UNIQUE INDEX /*i*/tag_summary_log_id ON /*_*/tag_summary (ts_log_id);
+CREATE UNIQUE INDEX /*i*/tag_summary_rev_id ON /*_*/tag_summary (ts_rev_id);
diff --git a/maintenance/archives/patch-valid_tag.sql b/maintenance/archives/patch-valid_tag.sql
new file mode 100644
index 00000000..994a5d53
--- /dev/null
+++ b/maintenance/archives/patch-valid_tag.sql
@@ -0,0 +1,4 @@
+-- Andrew Garrett, 2009-01
+CREATE TABLE /*_*/valid_tag (
+	vt_tag varchar(255) NOT NULL PRIMARY KEY
+) /*$wgDBTableOptions*/;
diff --git a/maintenance/archives/upgradeLogging.php b/maintenance/archives/upgradeLogging.php
index f0806458..0749bbf6 100644
--- a/maintenance/archives/upgradeLogging.php
+++ b/maintenance/archives/upgradeLogging.php
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceArchive
  */
 
-require( __DIR__ . '/../commandLine.inc' );
+require __DIR__ . '/../commandLine.inc';
 
 /**
  * Maintenance script that upgrade for log_id/log_deleted fields in a
diff --git a/maintenance/attachLatest.php b/maintenance/attachLatest.php
index 475cafc9..2cf277fe 100644
--- a/maintenance/attachLatest.php
+++ b/maintenance/attachLatest.php
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to correct wrong values in the `page_latest` field
@@ -83,4 +83,4 @@ class AttachLatest extends Maintenance {
 }
 
 $maintClass = "AttachLatest";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/backup.inc b/maintenance/backup.inc
index e3dc488b..3dc94c88 100644
--- a/maintenance/backup.inc
+++ b/maintenance/backup.inc
@@ -40,17 +40,17 @@ class BackupDumper {
 	var $reportingInterval = 100;
 	var $reporting = true;
 	var $pageCount = 0;
-	var $revCount  = 0;
-	var $server    = null; // use default
-	var $pages     = null; // all pages
+	var $revCount = 0;
+	var $server = null; // use default
+	var $pages = null; // all pages
 	var $skipHeader = false; // don't output <mediawiki> and <siteinfo>
 	var $skipFooter = false; // don't output </mediawiki>
-	var $startId    = 0;
-	var $endId      = 0;
+	var $startId = 0;
+	var $endId = 0;
 	var $revStartId = 0;
-	var $revEndId   = 0;
-	var $sink       = null; // Output filters
-	var $stubText   = false; // include rev_text_id instead of text; for 2-pass dump
+	var $revEndId = 0;
+	var $sink = null; // Output filters
+	var $stubText = false; // include rev_text_id instead of text; for 2-pass dump
 	var $dumpUploads = false;
 	var $dumpUploadFileContents = false;
 	var $lastTime = 0;
@@ -116,7 +116,7 @@ class BackupDumper {
 	 */
 	function loadPlugin( $class, $file ) {
 		if ( $file != '' ) {
-			require_once( $file );
+			require_once $file;
 		}
 		$register = array( $class, 'register' );
 		call_user_func_array( $register, array( &$this ) );
@@ -133,7 +133,7 @@ class BackupDumper {
 			$matches = array();
 			if ( preg_match( '/^--(.+?)(?:=(.+?)(?::(.+?))?)?$/', $arg, $matches ) ) {
 				@list( /* $full */ , $opt, $val, $param ) = $matches;
-				switch( $opt ) {
+				switch ( $opt ) {
 				case "plugin":
 					$this->loadPlugin( $val, $param );
 					break;
@@ -170,11 +170,8 @@ class BackupDumper {
 					break;
 				case "force-normal":
 					if ( !function_exists( 'utf8_normalize' ) ) {
-						wfDl( "php_utfnormal.so" );
-						if ( !function_exists( 'utf8_normalize' ) ) {
-							$this->fatalError( "Failed to load UTF-8 normalization extension. " .
-								"Install or remove --force-normal parameter to use slower code." );
-						}
+						$this->fatalError( "UTF-8 normalization extension not loaded. " .
+							"Install or remove --force-normal parameter to use slower code." );
 					}
 					break;
 				default:
@@ -202,8 +199,9 @@ class BackupDumper {
 	function dump( $history, $text = WikiExporter::TEXT ) {
 		# Notice messages will foul up your XML output even if they're
 		# relatively harmless.
-		if ( ini_get( 'display_errors' ) )
+		if ( ini_get( 'display_errors' ) ) {
 			ini_set( 'display_errors', 'stderr' );
+		}
 
 		$this->initProgress( $history );
 
@@ -215,8 +213,9 @@ class BackupDumper {
 		$wrapper = new ExportProgressFilter( $this->sink, $this );
 		$exporter->setOutputSink( $wrapper );
 
-		if ( !$this->skipHeader )
+		if ( !$this->skipHeader ) {
 			$exporter->openStream();
+		}
 		# Log item dumps: all or by range
 		if ( $history & WikiExporter::LOGS ) {
 			if ( $this->startId || $this->endId ) {
@@ -225,7 +224,7 @@ class BackupDumper {
 				$exporter->allLogs();
 			}
 		# Page dumps: all or by page ID range
-		} else if ( is_null( $this->pages ) ) {
+		} elseif ( is_null( $this->pages ) ) {
 			if ( $this->startId || $this->endId ) {
 				$exporter->pagesByRange( $this->startId, $this->endId );
 			} elseif ( $this->revStartId || $this->revEndId ) {
@@ -238,8 +237,9 @@ class BackupDumper {
 			$exporter->pagesByName( $this->pages );
 		}
 
-		if ( !$this->skipFooter )
+		if ( !$this->skipFooter ) {
 			$exporter->closeStream();
+		}
 
 		$this->report( true );
 	}
@@ -365,7 +365,7 @@ class BackupDumper {
 
 	function fatalError( $msg ) {
 		$this->progress( "$msg\n" );
-		die(1);
+		die( 1 );
 	}
 }
 
diff --git a/maintenance/backupPrefetch.inc b/maintenance/backupPrefetch.inc
index cc0a7e17..04352b9b 100644
--- a/maintenance/backupPrefetch.inc
+++ b/maintenance/backupPrefetch.inc
@@ -51,7 +51,7 @@ class BaseDump {
 		$this->infiles = explode( ';', $infile );
 		$this->reader = new XMLReader();
 		$infile = array_shift( $this->infiles );
-		if (defined( 'LIBXML_PARSEHUGE' ) ) {
+		if ( defined( 'LIBXML_PARSEHUGE' ) ) {
 			$this->reader->open( $infile, null, LIBXML_PARSEHUGE );
 		}
 		else {
@@ -110,8 +110,8 @@ class BaseDump {
 			}
 		} else {
 			$this->close();
-			if (count($this->infiles)) {
-				$infile = array_shift($this->infiles);
+			if ( count( $this->infiles ) ) {
+				$infile = array_shift( $this->infiles );
 				$this->reader->open( $infile );
 				$this->atEnd = false;
 			}
@@ -181,7 +181,7 @@ class BaseDump {
 		}
 		$buffer = "";
 		while ( $this->reader->read() ) {
-			switch( $this->reader->nodeType ) {
+			switch ( $this->reader->nodeType ) {
 			case XMLReader::TEXT:
 //			case XMLReader::WHITESPACE:
 			case XMLReader::SIGNIFICANT_WHITESPACE:
diff --git a/maintenance/backupTextPass.inc b/maintenance/backupTextPass.inc
index 0b8b3445..c515c6fe 100644
--- a/maintenance/backupTextPass.inc
+++ b/maintenance/backupTextPass.inc
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/backup.inc' );
+require_once __DIR__ . '/backup.inc';
 
 /**
  * @ingroup Maintenance
@@ -141,8 +141,9 @@ class TextPassDumper extends BackupDumper {
 	function dump( $history, $text = WikiExporter::TEXT ) {
 		// Notice messages will foul up your XML output even if they're
 		// relatively harmless.
-		if ( ini_get( 'display_errors' ) )
+		if ( ini_get( 'display_errors' ) ) {
 			ini_set( 'display_errors', 'stderr' );
+		}
 
 		$this->initProgress( $this->history );
 
@@ -182,7 +183,7 @@ class TextPassDumper extends BackupDumper {
 		global $IP;
 		$url = $this->processFileOpt( $val, $param );
 
-		switch( $opt ) {
+		switch ( $opt ) {
 		case 'prefetch':
 			require_once "$IP/maintenance/backupPrefetch.inc";
 			$this->prefetch = new BaseDump( $url );
@@ -214,7 +215,7 @@ class TextPassDumper extends BackupDumper {
 	function processFileOpt( $val, $param ) {
 		$fileURIs = explode( ';', $param );
 		foreach ( $fileURIs as $URI ) {
-			switch( $val ) {
+			switch ( $val ) {
 				case "file":
 					$newURI = $URI;
 					break;
@@ -298,7 +299,7 @@ class TextPassDumper extends BackupDumper {
 	}
 
 	function checkIfTimeExceeded() {
-		if ( $this->maxTimeAllowed &&  ( $this->lastTime - $this->timeOfCheckpoint  > $this->maxTimeAllowed ) ) {
+		if ( $this->maxTimeAllowed && ( $this->lastTime - $this->timeOfCheckpoint > $this->maxTimeAllowed ) ) {
 			return true;
 		}
 		return false;
@@ -413,6 +414,8 @@ class TextPassDumper extends BackupDumper {
 	 * @throws MWException
 	 */
 	function getText( $id ) {
+		global $wgContentHandlerUseDB;
+
 		$prefetchNotTried = true; // Whether or not we already tried to get the text via prefetch.
 		$text = false; // The candidate for a good text. false if no proper value.
 		$failures = 0; // The number of times, this invocation of getText already failed.
@@ -478,7 +481,28 @@ class TextPassDumper extends BackupDumper {
 				if ( ! isset( $this->db ) ) {
 					throw new MWException( "No database available" );
 				}
-				$revLength = $this->db->selectField( 'revision', 'rev_len', array( 'rev_id' => $revID ) );
+
+				$revLength = strlen( $text );
+				if ( $wgContentHandlerUseDB ) {
+					$row = $this->db->selectRow(
+						'revision',
+						array( 'rev_len', 'rev_content_model' ),
+						array( 'rev_id' => $revID ),
+						__METHOD__
+					);
+					if ( $row ) {
+						// only check the length for the wikitext content handler,
+						// it's a wasted (and failed) check otherwise
+						if ( $row->rev_content_model == CONTENT_MODEL_WIKITEXT ) {
+							$revLength = $row->rev_len;
+						}
+					}
+
+				}
+				else {
+					$revLength = $this->db->selectField( 'revision', 'rev_len', array( 'rev_id' => $revID ) );
+				}
+
 				if ( strlen( $text ) == $revLength ) {
 					if ( $tryIsPrefetch ) {
 						$this->prefetchCount++;
@@ -611,17 +635,21 @@ class TextPassDumper extends BackupDumper {
 
 	private function closeSpawn() {
 		wfSuppressWarnings();
-		if ( $this->spawnRead )
+		if ( $this->spawnRead ) {
 			fclose( $this->spawnRead );
+		}
 		$this->spawnRead = false;
-		if ( $this->spawnWrite )
+		if ( $this->spawnWrite ) {
 			fclose( $this->spawnWrite );
+		}
 		$this->spawnWrite = false;
-		if ( $this->spawnErr )
+		if ( $this->spawnErr ) {
 			fclose( $this->spawnErr );
+		}
 		$this->spawnErr = false;
-		if ( $this->spawnProc )
+		if ( $this->spawnProc ) {
 			pclose( $this->spawnProc );
+		}
 		$this->spawnProc = false;
 		wfRestoreWarnings();
 	}
@@ -631,11 +659,15 @@ class TextPassDumper extends BackupDumper {
 
 		$ok = fwrite( $this->spawnWrite, "$id\n" );
 		// $this->progress( ">> $id" );
-		if ( !$ok ) return false;
+		if ( !$ok ) {
+			return false;
+		}
 
 		$ok = fflush( $this->spawnWrite );
 		// $this->progress( ">> [flush]" );
-		if ( !$ok ) return false;
+		if ( !$ok ) {
+			return false;
+		}
 
 		// check that the text id they are sending is the one we asked for
 		// this avoids out of sync revision text errors we have encountered in the past
@@ -649,18 +681,24 @@ class TextPassDumper extends BackupDumper {
 
 		$len = fgets( $this->spawnRead );
 		// $this->progress( "<< " . trim( $len ) );
-		if ( $len === false ) return false;
+		if ( $len === false ) {
+			return false;
+		}
 
 		$nbytes = intval( $len );
 		// actual error, not zero-length text
-		if ( $nbytes < 0 ) return false;
+		if ( $nbytes < 0 ) {
+			return false;
+		}
 
 		$text = "";
 
 		// Subprocess may not send everything at once, we have to loop.
 		while ( $nbytes > strlen( $text ) ) {
 			$buffer = fread( $this->spawnRead, $nbytes - strlen( $text ) );
-			if ( $buffer === false ) break;
+			if ( $buffer === false ) {
+				break;
+			}
 			$text .= $buffer;
 		}
 
diff --git a/maintenance/benchmarks/Benchmarker.php b/maintenance/benchmarks/Benchmarker.php
index 98b35b53..dd558f32 100644
--- a/maintenance/benchmarks/Benchmarker.php
+++ b/maintenance/benchmarks/Benchmarker.php
@@ -27,7 +27,7 @@
  * @ingroup Benchmark
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Base class for benchmark scripts.
@@ -48,20 +48,20 @@ abstract class Benchmarker extends Maintenance {
 
 		foreach( $benchs as $bench ) {
 			// handle empty args
-			if(!array_key_exists( 'args', $bench )) {
+			if( !array_key_exists( 'args', $bench ) ) {
 				$bench['args'] = array();
 			}
 
 			$bench_number++;
 			$start = microtime( true );
-			for( $i=0; $i<$count; $i++ ) {
+			for( $i = 0; $i < $count; $i++ ) {
 				call_user_func_array( $bench['function'], $bench['args'] );
 			}
 			$delta = microtime( true ) - $start;
 
 			// function passed as a callback
 			if( is_array( $bench['function'] ) ) {
-				$ret = get_class( $bench['function'][0] ). '->' . $bench['function'][1];
+				$ret = get_class( $bench['function'][0] ) . '->' . $bench['function'][1];
 				$bench['function'] = $ret;
 			}
 
@@ -85,7 +85,7 @@ abstract class Benchmarker extends Maintenance {
 				join( ', ', $res['arguments'] )
 			);
 			$ret .= sprintf( "   %6.2fms (%6.2fms each)\n",
-				$res['delta']   * 1000,
+				$res['delta'] * 1000,
 				$res['average'] * 1000
 			);
 		}
diff --git a/maintenance/benchmarks/README b/maintenance/benchmarks/README
new file mode 100644
index 00000000..c021abd2
--- /dev/null
+++ b/maintenance/benchmarks/README
@@ -0,0 +1,7 @@
+This directory hold several benchmarking scripts used as a proof of speed
+or to track PHP performances over time.
+
+To get somehow accurate result, you might want to bound the PHP process
+to a specific CPU with `taskset` and raise its priority with `nice`. Example:
+
+ $ taskset 1 nice -n-10 php bench_wfIsWindows.php
diff --git a/maintenance/benchmarks/bench_HTTP_HTTPS.php b/maintenance/benchmarks/bench_HTTP_HTTPS.php
index fa76ae22..6f800fb3 100644
--- a/maintenance/benchmarks/bench_HTTP_HTTPS.php
+++ b/maintenance/benchmarks/bench_HTTP_HTTPS.php
@@ -24,7 +24,7 @@
  * @author  Platonides
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * Maintenance script that benchmarks HTTP request vs HTTPS request.
@@ -62,4 +62,4 @@ class bench_HTTP_HTTPS extends Benchmarker {
 }
 
 $maintClass = 'bench_HTTP_HTTPS';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/bench_delete_truncate.php b/maintenance/benchmarks/bench_delete_truncate.php
index d9741496..3eff534b 100644
--- a/maintenance/benchmarks/bench_delete_truncate.php
+++ b/maintenance/benchmarks/bench_delete_truncate.php
@@ -21,7 +21,7 @@
  * @ingroup Benchmark
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * Maintenance script that benchmarks SQL DELETE vs SQL TRUNCATE.
@@ -101,4 +101,4 @@ class BenchmarkDeleteTruncate extends Benchmarker {
 }
 
 $maintClass = "BenchmarkDeleteTruncate";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/bench_if_switch.php b/maintenance/benchmarks/bench_if_switch.php
index 1f590d4d..80fd9623 100644
--- a/maintenance/benchmarks/bench_if_switch.php
+++ b/maintenance/benchmarks/bench_if_switch.php
@@ -24,7 +24,7 @@
  * @author  Platonides
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * Maintenance script that benchmark if elseif... versus switch case.
@@ -93,4 +93,4 @@ class bench_if_switch extends Benchmarker {
 }
 
 $maintClass = 'bench_if_switch';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/bench_strtr_str_replace.php b/maintenance/benchmarks/bench_strtr_str_replace.php
index 10c5cd0b..bd21b186 100644
--- a/maintenance/benchmarks/bench_strtr_str_replace.php
+++ b/maintenance/benchmarks/bench_strtr_str_replace.php
@@ -23,7 +23,7 @@
  * @ingroup Benchmark
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 function bfNormalizeTitleStrTr( $str ) {
 	return strtr( $str, '_', ' ' );
@@ -75,4 +75,4 @@ class bench_strtr_str_replace extends Benchmarker {
 }
 
 $maintClass = 'bench_strtr_str_replace';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/bench_utf8_title_check.php b/maintenance/benchmarks/bench_utf8_title_check.php
index f5987800..078293eb 100644
--- a/maintenance/benchmarks/bench_utf8_title_check.php
+++ b/maintenance/benchmarks/bench_utf8_title_check.php
@@ -21,7 +21,7 @@
  * @ingroup Benchmark
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * This little benchmark executes the regexp used in Language->checkTitleEncoding()
@@ -38,7 +38,7 @@ class bench_utf8_title_check extends Benchmarker {
 	public function __construct() {
 		parent::__construct();
 
-		$this->data = array (
+		$this->data = array(
 			"",
 			"United States of America", // 7bit ASCII
 			"S%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e",
@@ -123,4 +123,4 @@ class bench_utf8_title_check extends Benchmarker {
 }
 
 $maintClass = 'bench_utf8_title_check';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/bench_wfBaseConvert.php b/maintenance/benchmarks/bench_wfBaseConvert.php
index a1e5c6a4..f8a21562 100644
--- a/maintenance/benchmarks/bench_wfBaseConvert.php
+++ b/maintenance/benchmarks/bench_wfBaseConvert.php
@@ -22,7 +22,7 @@
  * @author Tyler Romeo
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * Maintenance script that benchmarks wfBaseConvert().
@@ -74,4 +74,4 @@ class bench_wfBaseConvert extends Benchmarker {
 }
 
 $maintClass = 'bench_wfBaseConvert';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/bench_wfIsWindows.php b/maintenance/benchmarks/bench_wfIsWindows.php
index 85439827..1cd2016b 100644
--- a/maintenance/benchmarks/bench_wfIsWindows.php
+++ b/maintenance/benchmarks/bench_wfIsWindows.php
@@ -24,7 +24,7 @@
  * @author  Platonides
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * Maintenance script that benchmarks wfIsWindows().
@@ -66,4 +66,4 @@ class bench_wfIsWindows extends Benchmarker {
 }
 
 $maintClass = 'bench_wfIsWindows';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/benchmarkHooks.php b/maintenance/benchmarks/benchmarkHooks.php
index fdb016f4..3f5d6db0 100644
--- a/maintenance/benchmarks/benchmarkHooks.php
+++ b/maintenance/benchmarks/benchmarkHooks.php
@@ -21,7 +21,7 @@
  * @ingroup Benchmark
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * Maintenance script that benchmarks %MediaWiki hooks.
@@ -84,4 +84,4 @@ class BenchmarkHooks extends Benchmarker {
 }
 
 $maintClass = 'BenchmarkHooks';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/benchmarkPurge.php b/maintenance/benchmarks/benchmarkPurge.php
index ec686b2a..fd863d52 100644
--- a/maintenance/benchmarks/benchmarkPurge.php
+++ b/maintenance/benchmarks/benchmarkPurge.php
@@ -21,7 +21,7 @@
  * @ingroup Benchmark
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * Maintenance script that benchmarks Squid purge.
@@ -112,4 +112,4 @@ class BenchmarkPurge extends Benchmarker {
 }
 
 $maintClass = "BenchmarkPurge";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cdb.php b/maintenance/cdb.php
index c06c2cd0..d42f9f7a 100644
--- a/maintenance/cdb.php
+++ b/maintenance/cdb.php
@@ -23,12 +23,12 @@
  */
 
 /** */
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
 
 function cdbShowHelp( $command ) {
 	$commandList = array(
 		'load' => 'load a cdb file for reading',
-		'get'  => 'get a value for a key',
+		'get' => 'get a value for a key',
 		'exit' => 'exit cdb',
 		'quit' => 'exit cdb',
 		'help' => 'help about a command',
@@ -55,7 +55,9 @@ do {
 	static $fileHandle;
 
 	$line = Maintenance::readconsole();
-	if ( $line === false ) exit;
+	if ( $line === false ) {
+		exit;
+	}
 
 	$args = explode( ' ', $line );
 	$command = array_shift( $args );
@@ -67,25 +69,25 @@ do {
 			cdbShowHelp( array_shift( $args ) );
 			break;
 		case 'load':
-			if( !isset( $args[0] ) ) {
+			if ( !isset( $args[0] ) ) {
 				print "Need a filename there buddy\n";
 				break;
 			}
 			$file = $args[0];
 			print "Loading cdb file $file...";
 			$fileHandle = CdbReader::open( $file );
-			if( !$fileHandle ) {
+			if ( !$fileHandle ) {
 				print "not a cdb file or unable to read it\n";
 			} else {
 				print "ok\n";
 			}
 			break;
 		case 'get':
-			if( !$fileHandle ) {
+			if ( !$fileHandle ) {
 				print "Need to load a cdb file first\n";
 				break;
 			}
-			if( !isset( $args[0] ) ) {
+			if ( !isset( $args[0] ) ) {
 				print "Need to specify a key, Luke\n";
 				break;
 			}
diff --git a/maintenance/changePassword.php b/maintenance/changePassword.php
index 861610b7..5d98e1f5 100644
--- a/maintenance/changePassword.php
+++ b/maintenance/changePassword.php
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to change the password of a given user.
@@ -62,4 +62,4 @@ class ChangePassword extends Maintenance {
 }
 
 $maintClass = "ChangePassword";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/checkBadRedirects.php b/maintenance/checkBadRedirects.php
index 4ba7e66b..a96e9b80 100644
--- a/maintenance/checkBadRedirects.php
+++ b/maintenance/checkBadRedirects.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to check that pages marked as being redirects really are.
@@ -61,4 +61,4 @@ class CheckBadRedirects extends Maintenance {
 }
 
 $maintClass = "CheckBadRedirects";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/checkImages.php b/maintenance/checkImages.php
index c05d9151..e6aea537 100644
--- a/maintenance/checkImages.php
+++ b/maintenance/checkImages.php
@@ -20,7 +20,7 @@
  * @file
  * @ingroup Maintenance
  */
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to check images to see if they exist, are readable, etc.
@@ -87,4 +87,4 @@ class CheckImages extends Maintenance {
 }
 
 $maintClass = "CheckImages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/checkLess.php b/maintenance/checkLess.php
new file mode 100644
index 00000000..d02d8a7b
--- /dev/null
+++ b/maintenance/checkLess.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Checks LESS files in known resources for errors
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * @ingroup Maintenance
+ */
+class CheckLess extends Maintenance {
+	public function __construct() {
+		parent::__construct();
+		$this->mDescription = 'Checks LESS files for errors';
+	}
+
+	public function execute() {
+		$result = false;
+		$resourceLoader = new ResourceLoader();
+		foreach ( $resourceLoader->getModuleNames() as $name ) {
+			/** @var ResourceLoaderFileModule $module */
+			$module = $resourceLoader->getModule( $name );
+			if ( !$module || !$module instanceof ResourceLoaderFileModule ) {
+				continue;
+			}
+
+			$hadErrors = false;
+			foreach ( $module->getAllStyleFiles() as $file ) {
+				if ( $module->getStyleSheetLang( $file ) !== 'less' ) {
+					continue;
+				}
+				try {
+					$compiler = ResourceLoader::getLessCompiler();
+					$compiler->compileFile( $file );
+				} catch ( Exception $e ) {
+					if ( !$hadErrors ) {
+						$this->error( "Errors checking module $name:\n" );
+						$hadErrors = true;
+					}
+					$this->error( $e->getMessage() . "\n" );
+					$result = true;
+				}
+			}
+		}
+		if ( !$result ) {
+			$this->output( "No errors found\n" );
+		} else {
+			die( 1 );
+		}
+	}
+}
+
+$maintClass = 'CheckLess';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/checkSyntax.php b/maintenance/checkSyntax.php
index 1e44e239..dc8626df 100644
--- a/maintenance/checkSyntax.php
+++ b/maintenance/checkSyntax.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to check syntax of all PHP files in MediaWiki.
@@ -221,12 +221,14 @@ class CheckSyntax extends Maintenance {
 	private function isSuitableFile( $file ) {
 		$file = str_replace( '\\', '/', $file );
 		$ext = pathinfo( $file, PATHINFO_EXTENSION );
-		if ( $ext != 'php' && $ext != 'inc' && $ext != 'php5' )
+		if ( $ext != 'php' && $ext != 'inc' && $ext != 'php5' ) {
 			return false;
+		}
 		foreach ( $this->mIgnorePaths as $regex ) {
 			$m = array();
-			if ( preg_match( "~{$regex}~", $file, $m ) )
+			if ( preg_match( "~{$regex}~", $file, $m ) ) {
 				return false;
+			}
 		}
 		return true;
 	}
@@ -328,14 +330,15 @@ class CheckSyntax extends Maintenance {
 	private function checkForMistakes( $file ) {
 		foreach ( $this->mNoStyleCheckPaths as $regex ) {
 			$m = array();
-			if ( preg_match( "~{$regex}~", $file, $m ) )
+			if ( preg_match( "~{$regex}~", $file, $m ) ) {
 				return;
+			}
 		}
 
 		$text = file_get_contents( $file );
 		$tokens = token_get_all( $text );
 
-		$this->checkEvilToken( $file, $tokens, '@', 'Error supression operator (@)');
+		$this->checkEvilToken( $file, $tokens, '@', 'Error supression operator (@)' );
 		$this->checkRegex( $file, $text, '/^[\s\r\n]+<\?/', 'leading whitespace' );
 		$this->checkRegex( $file, $text, '/\?>[\s\r\n]*$/', 'trailing ?>' );
 		$this->checkRegex( $file, $text, '/^[\xFF\xFE\xEF]/', 'byte-order mark' );
@@ -367,4 +370,4 @@ class CheckSyntax extends Maintenance {
 }
 
 $maintClass = "CheckSyntax";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/checkUsernames.php b/maintenance/checkUsernames.php
index dd5e0022..6df189fc 100644
--- a/maintenance/checkUsernames.php
+++ b/maintenance/checkUsernames.php
@@ -21,8 +21,7 @@
  * @ingroup Maintenance
  */
 
-
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to check that database usernames are actually valid.
@@ -37,25 +36,34 @@ class CheckUsernames extends Maintenance {
 	public function __construct() {
 		parent::__construct();
 		$this->mDescription = "Verify that database usernames are actually valid";
+		$this->setBatchSize( 1000 );
 	}
 
 	function execute() {
 		$dbr = wfGetDB( DB_SLAVE );
 
-		$res = $dbr->select( 'user',
-			array( 'user_id', 'user_name' ),
-			null,
-			__METHOD__
-		);
+		$maxUserId = 0;
+		do {
+			$res = $dbr->select( 'user',
+				array( 'user_id', 'user_name' ),
+				array( 'user_id > ' . $maxUserId ),
+				__METHOD__,
+				array(
+					'ORDER BY' => 'user_id',
+					'LIMIT' => $this->mBatchSize,
+				)
+			);
 
-		foreach ( $res as $row ) {
-			if ( ! User::isValidUserName( $row->user_name ) ) {
-				$this->error( sprintf( "%s: %6d: '%s'\n", wfWikiID(), $row->user_id, $row->user_name ) );
-				wfDebugLog( 'checkUsernames', $row->user_name );
+			foreach ( $res as $row ) {
+				if ( ! User::isValidUserName( $row->user_name ) ) {
+					$this->error( sprintf( "%s: %6d: '%s'\n", wfWikiID(), $row->user_id, $row->user_name ) );
+					wfDebugLog( 'checkUsernames', $row->user_name );
+				}
 			}
-		}
+			$maxUserId = $row->user_id;
+		} while ( $res->numRows() );
 	}
 }
 
 $maintClass = "CheckUsernames";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupAncientTables.php b/maintenance/cleanupAncientTables.php
index dbc2e0d3..694efaa6 100644
--- a/maintenance/cleanupAncientTables.php
+++ b/maintenance/cleanupAncientTables.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to cleans up old database tables, dropping old indexes
@@ -38,7 +38,7 @@ class CleanupAncientTables extends Maintenance {
 	}
 
 	public function execute() {
-		if( !$this->hasOption( 'force' ) ) {
+		if ( !$this->hasOption( 'force' ) ) {
 			$this->error( "This maintenance script will remove old columns and indexes.\n"
 				. "It is recommended to backup your database first, and ensure all your data has been migrated to newer tables\n"
 				. "If you want to continue, run this script again with the --force \n"
@@ -61,7 +61,7 @@ class CleanupAncientTables extends Maintenance {
 			'validate', // 1.6
 		);
 
-		foreach( $ancientTables as $table ) {
+		foreach ( $ancientTables as $table ) {
 			if ( $db->tableExists( $table, __METHOD__ ) ) {
 				$this->output( "Dropping table $table..." );
 				$db->dropTable( $table, __METHOD__ );
@@ -78,7 +78,7 @@ class CleanupAncientTables extends Maintenance {
 			'user_timestamp',
 			'usertext_timestamp',
 		);
-		foreach( $oldIndexes as $index ) {
+		foreach ( $oldIndexes as $index ) {
 			if ( $db->indexExists( 'text', $index, __METHOD__ ) ) {
 				$this->output( "Dropping index $index from the text table..." );
 				$db->query( "DROP INDEX " . $db->addIdentifierQuotes( $index )
@@ -97,7 +97,7 @@ class CleanupAncientTables extends Maintenance {
 			'old_minor_edit',
 			'inverse_timestamp',
 		);
-		foreach( $oldFields as $field ) {
+		foreach ( $oldFields as $field ) {
 			if ( $db->fieldExists( 'text', $field, __METHOD__ ) ) {
 				$this->output( "Dropping the $field field from the text table..." );
 				$db->query( "ALTER TABLE  " . $db->tableName( 'text' )
@@ -110,4 +110,4 @@ class CleanupAncientTables extends Maintenance {
 }
 
 $maintClass = "CleanupAncientTables";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupCaps.php b/maintenance/cleanupCaps.php
index ec2aa957..1a47ac4e 100644
--- a/maintenance/cleanupCaps.php
+++ b/maintenance/cleanupCaps.php
@@ -29,7 +29,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/cleanupTable.inc' );
+require_once __DIR__ . '/cleanupTable.inc';
 
 /**
  * Maintenance script to clean up broken page links when somebody turns on $wgCapitalLinks.
@@ -103,4 +103,4 @@ class CapsCleanup extends TableCleanup {
 }
 
 $maintClass = "CapsCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupImages.php b/maintenance/cleanupImages.php
index 4e7b937d..0e0b6194 100644
--- a/maintenance/cleanupImages.php
+++ b/maintenance/cleanupImages.php
@@ -29,7 +29,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/cleanupTable.inc' );
+require_once __DIR__ . '/cleanupTable.inc';
 
 /**
  * Maintenance script to clean up broken, unparseable upload filenames.
@@ -213,4 +213,4 @@ class ImageCleanup extends TableCleanup {
 }
 
 $maintClass = "ImageCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupPreferences.php b/maintenance/cleanupPreferences.php
index c0a526b7..06ae17fb 100644
--- a/maintenance/cleanupPreferences.php
+++ b/maintenance/cleanupPreferences.php
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that removes hidden preferences from the database.
@@ -36,7 +36,7 @@ class CleanupPreferences extends Maintenance {
 
 		$dbw = wfGetDB( DB_MASTER );
 		$dbw->begin( __METHOD__ );
-		foreach( $wgHiddenPrefs as $item ) {
+		foreach ( $wgHiddenPrefs as $item ) {
 			$dbw->delete(
 				'user_properties',
 				array( 'up_property' => $item ),
@@ -49,4 +49,4 @@ class CleanupPreferences extends Maintenance {
 }
 
 $maintClass = 'CleanupPreferences'; // Tells it to run the class
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupRemovedModules.php b/maintenance/cleanupRemovedModules.php
index 2085da94..84eec289 100644
--- a/maintenance/cleanupRemovedModules.php
+++ b/maintenance/cleanupRemovedModules.php
@@ -22,7 +22,7 @@
  * @author Roan Kattouw
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to remove cache entries for removed ResourceLoader modules
@@ -58,7 +58,7 @@ class CleanupRemovedModules extends Maintenance {
 			$this->output( "Batch $i: $numRows rows\n" );
 			$i++;
 			wfWaitForSlaves( $maxlag );
-		} while( $numRows > 0 );
+		} while ( $numRows > 0 );
 		$this->output( "done\n" );
 
 		$this->output( "Cleaning up msg_resource table...\n" );
@@ -72,7 +72,7 @@ class CleanupRemovedModules extends Maintenance {
 			$this->output( "Batch $i: $numRows rows\n" );
 			$i++;
 			wfWaitForSlaves( $maxlag );
-		} while( $numRows > 0 );
+		} while ( $numRows > 0 );
 		$this->output( "done\n" );
 
 		$this->output( "Cleaning up msg_resource_links table...\n" );
@@ -85,10 +85,10 @@ class CleanupRemovedModules extends Maintenance {
 			$this->output( "Batch $i: $numRows rows\n" );
 			$i++;
 			wfWaitForSlaves( $maxlag );
-		} while( $numRows > 0 );
+		} while ( $numRows > 0 );
 		$this->output( "done\n" );
 	}
 }
 
 $maintClass = "CleanupRemovedModules";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupSpam.php b/maintenance/cleanupSpam.php
index a41423ae..4b8c9feb 100644
--- a/maintenance/cleanupSpam.php
+++ b/maintenance/cleanupSpam.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to cleanup all spam from a given hostname.
@@ -141,4 +141,4 @@ class CleanupSpam extends Maintenance {
 }
 
 $maintClass = "CleanupSpam";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupTable.inc b/maintenance/cleanupTable.inc
index 57acfd82..cbd1be6b 100644
--- a/maintenance/cleanupTable.inc
+++ b/maintenance/cleanupTable.inc
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Generic class to cleanup a database table. Already subclasses Maintenance.
@@ -41,6 +41,8 @@ class TableCleanup extends Maintenance {
 	public $batchSize = 100;
 	public $reportInterval = 100;
 
+	protected $processed, $updated, $count, $startTime, $table;
+
 	public function __construct() {
 		parent::__construct();
 		$this->addOption( 'dry-run', 'Perform a dry run' );
@@ -66,6 +68,9 @@ class TableCleanup extends Maintenance {
 		$this->table = $table;
 	}
 
+	/**
+	 * @param int $updated
+	 */
 	protected function progress( $updated ) {
 		$this->updated += $updated;
 		$this->processed++;
@@ -96,12 +101,16 @@ class TableCleanup extends Maintenance {
 		flush();
 	}
 
+	/**
+	 * @param array $params
+	 * @throws MWException
+	 */
 	public function runTable( $params ) {
 		$dbr = wfGetDB( DB_SLAVE );
 
 		if ( array_diff( array_keys( $params ),
-			array( 'table', 'conds', 'index', 'callback' ) ) )
-		{
+			array( 'table', 'conds', 'index', 'callback' ) )
+		) {
 			throw new MWException( __METHOD__ . ': Missing parameter ' . implode( ', ', $params ) );
 		}
 
@@ -111,7 +120,6 @@ class TableCleanup extends Maintenance {
 		$this->init( $count, $table );
 		$this->output( "Processing $table...\n" );
 
-
 		$index = (array)$params['index'];
 		$indexConds = array();
 		$options = array(
@@ -156,6 +164,10 @@ class TableCleanup extends Maintenance {
 		$this->output( "Finished $table... $this->updated of $this->processed rows updated\n" );
 	}
 
+	/**
+	 * @param array $matches
+	 * @return string
+	 */
 	protected function hexChar( $matches ) {
 		return sprintf( "\\x%02x", ord( $matches[1] ) );
 	}
diff --git a/maintenance/cleanupTitles.php b/maintenance/cleanupTitles.php
index 66f9e87f..5b5ef184 100644
--- a/maintenance/cleanupTitles.php
+++ b/maintenance/cleanupTitles.php
@@ -29,7 +29,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/cleanupTable.inc' );
+require_once __DIR__ . '/cleanupTable.inc';
 
 /**
  * Maintenance script to clean up broken, unparseable titles.
@@ -42,6 +42,9 @@ class TitleCleanup extends TableCleanup {
 		$this->mDescription = "Script to clean up broken, unparseable titles";
 	}
 
+	/**
+	 * @param object $row
+	 */
 	protected function processRow( $row ) {
 		global $wgContLang;
 		$display = Title::makeName( $row->page_namespace, $row->page_title );
@@ -51,40 +54,54 @@ class TitleCleanup extends TableCleanup {
 		if ( !is_null( $title )
 			&& $title->canExist()
 			&& $title->getNamespace() == $row->page_namespace
-			&& $title->getDBkey() === $row->page_title )
-		{
-			return $this->progress( 0 );  // all is fine
+			&& $title->getDBkey() === $row->page_title
+		) {
+			$this->progress( 0 ); // all is fine
+
+			return;
 		}
 
 		if ( $row->page_namespace == NS_FILE && $this->fileExists( $row->page_title ) ) {
 			$this->output( "file $row->page_title needs cleanup, please run cleanupImages.php.\n" );
-			return $this->progress( 0 );
+			$this->progress( 0 );
 		} elseif ( is_null( $title ) ) {
 			$this->output( "page $row->page_id ($display) is illegal.\n" );
 			$this->moveIllegalPage( $row );
-			return $this->progress( 1 );
+			$this->progress( 1 );
 		} else {
 			$this->output( "page $row->page_id ($display) doesn't match self.\n" );
 			$this->moveInconsistentPage( $row, $title );
-			return $this->progress( 1 );
+			$this->progress( 1 );
 		}
 	}
 
+	/**
+	 * @param string $name
+	 * @return bool
+	 */
 	protected function fileExists( $name ) {
 		// XXX: Doesn't actually check for file existence, just presence of image record.
 		// This is reasonable, since cleanupImages.php only iterates over the image table.
 		$dbr = wfGetDB( DB_SLAVE );
 		$row = $dbr->selectRow( 'image', array( 'img_name' ), array( 'img_name' => $name ), __METHOD__ );
+
 		return $row !== false;
 	}
 
+	/**
+	 * @param object $row
+	 */
 	protected function moveIllegalPage( $row ) {
 		$legal = 'A-Za-z0-9_/\\\\-';
 		$legalized = preg_replace_callback( "!([^$legal])!",
 			array( &$this, 'hexChar' ),
 			$row->page_title );
-		if ( $legalized == '.' ) $legalized = '(dot)';
-		if ( $legalized == '_' ) $legalized = '(space)';
+		if ( $legalized == '.' ) {
+			$legalized = '(dot)';
+		}
+		if ( $legalized == '_' ) {
+			$legalized = '(space)';
+		}
 		$legalized = 'Broken/' . $legalized;
 
 		$title = Title::newFromText( $legalized );
@@ -100,9 +117,11 @@ class TitleCleanup extends TableCleanup {
 
 		$dest = $title->getDBkey();
 		if ( $this->dryrun ) {
-			$this->output( "DRY RUN: would rename $row->page_id ($row->page_namespace,'$row->page_title') to ($row->page_namespace,'$dest')\n" );
+			$this->output( "DRY RUN: would rename $row->page_id ($row->page_namespace," .
+				"'$row->page_title') to ($row->page_namespace,'$dest')\n" );
 		} else {
-			$this->output( "renaming $row->page_id ($row->page_namespace,'$row->page_title') to ($row->page_namespace,'$dest')\n" );
+			$this->output( "renaming $row->page_id ($row->page_namespace," .
+				"'$row->page_title') to ($row->page_namespace,'$dest')\n" );
 			$dbw = wfGetDB( DB_MASTER );
 			$dbw->update( 'page',
 				array( 'page_title' => $dest ),
@@ -111,6 +130,10 @@ class TitleCleanup extends TableCleanup {
 		}
 	}
 
+	/**
+	 * @param object $row
+	 * @param Title $title
+	 */
 	protected function moveInconsistentPage( $row, $title ) {
 		if ( $title->exists() || $title->getInterwiki() || !$title->canExist() ) {
 			if ( $title->getInterwiki() || !$title->canExist() ) {
@@ -121,7 +144,9 @@ class TitleCleanup extends TableCleanup {
 
 			# Old cleanupTitles could move articles there. See bug 23147.
 			$ns = $row->page_namespace;
-			if ( $ns < 0 ) $ns = 0;
+			if ( $ns < 0 ) {
+				$ns = 0;
+			}
 
 			$clean = 'Broken/' . $prior;
 			$verified = Title::makeTitleSafe( $ns, $clean );
@@ -139,9 +164,11 @@ class TitleCleanup extends TableCleanup {
 		$dest = $title->getDBkey();
 
 		if ( $this->dryrun ) {
-			$this->output( "DRY RUN: would rename $row->page_id ($row->page_namespace,'$row->page_title') to ($ns,'$dest')\n" );
+			$this->output( "DRY RUN: would rename $row->page_id ($row->page_namespace," .
+				"'$row->page_title') to ($ns,'$dest')\n" );
 		} else {
-			$this->output( "renaming $row->page_id ($row->page_namespace,'$row->page_title') to ($ns,'$dest')\n" );
+			$this->output( "renaming $row->page_id ($row->page_namespace," .
+				"'$row->page_title') to ($ns,'$dest')\n" );
 			$dbw = wfGetDB( DB_MASTER );
 			$dbw->update( 'page',
 				array(
@@ -156,4 +183,4 @@ class TitleCleanup extends TableCleanup {
 }
 
 $maintClass = "TitleCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupUploadStash.php b/maintenance/cleanupUploadStash.php
index 441e8ae3..c2ba5558 100644
--- a/maintenance/cleanupUploadStash.php
+++ b/maintenance/cleanupUploadStash.php
@@ -25,7 +25,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to remove old or broken uploads from temporary uploaded
@@ -65,7 +65,7 @@ class UploadStashCleanup extends Maintenance {
 		} else {
 			// finish the read before starting writes.
 			$keys = array();
-			foreach( $res as $row ) {
+			foreach ( $res as $row ) {
 				array_push( $keys, $row->us_key );
 			}
 
@@ -76,15 +76,15 @@ class UploadStashCleanup extends Maintenance {
 			$stash = new UploadStash( $repo );
 
 			$i = 0;
-			foreach( $keys as $key ) {
+			foreach ( $keys as $key ) {
 				$i++;
 				try {
 					$stash->getFile( $key, true );
 					$stash->removeFileNoAuth( $key );
 				} catch ( UploadStashBadPathException $ex ) {
-					$this->output( "Failed removing stashed upload with key: $key\n"  );
+					$this->output( "Failed removing stashed upload with key: $key\n" );
 				} catch ( UploadStashZeroLengthFileException $ex ) {
-					$this->output( "Failed removing stashed upload with key: $key\n"  );
+					$this->output( "Failed removing stashed upload with key: $key\n" );
 				}
 				if ( $i % 100 == 0 ) {
 					$this->output( "$i\n" );
@@ -94,7 +94,7 @@ class UploadStashCleanup extends Maintenance {
 		}
 
 		// Delete all the corresponding thumbnails...
-		$dir      = $tempRepo->getZonePath( 'thumb' );
+		$dir = $tempRepo->getZonePath( 'thumb' );
 		$iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir ) );
 		$this->output( "Deleting old thumbnails...\n" );
 		$i = 0;
@@ -112,8 +112,8 @@ class UploadStashCleanup extends Maintenance {
 		$this->output( "$i done\n" );
 
 		// Apparently lots of stash files are not registered in the DB...
-		$dir      = $tempRepo->getZonePath( 'public' );
-		$iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir ) );
+		$dir = $tempRepo->getZonePath( 'public' );
+		$iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir, 'adviseStat' => 1 ) );
 		$this->output( "Deleting orphaned temp files...\n" );
 		if ( strpos( $dir, '/local-temp' ) === false ) { // sanity check
 			$this->error( "Temp repo is not using the temp container.", 1 ); // die
@@ -140,4 +140,4 @@ class UploadStashCleanup extends Maintenance {
 }
 
 $maintClass = "UploadStashCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/cleanupWatchlist.php b/maintenance/cleanupWatchlist.php
index fbab6a3c..f1a7b481 100644
--- a/maintenance/cleanupWatchlist.php
+++ b/maintenance/cleanupWatchlist.php
@@ -29,7 +29,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/cleanupTable.inc' );
+require_once __DIR__ . '/cleanupTable.inc';
 
 /**
  * Maintenance script to remove broken, unparseable titles in the watchlist table.
@@ -77,9 +77,9 @@ class WatchlistCleanup extends TableCleanup {
 		if ( !$this->dryrun && $this->hasOption( 'fix' ) ) {
 			$dbw = wfGetDB( DB_MASTER );
 			$dbw->delete( 'watchlist', array(
-				'wl_user'      => $row->wl_user,
+				'wl_user' => $row->wl_user,
 				'wl_namespace' => $row->wl_namespace,
-				'wl_title'     => $row->wl_title ),
+				'wl_title' => $row->wl_title ),
 			__METHOD__ );
 			$this->output( "- removed\n" );
 			return 1;
@@ -90,4 +90,4 @@ class WatchlistCleanup extends TableCleanup {
 }
 
 $maintClass = "WatchlistCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/clearCacheStats.php b/maintenance/clearCacheStats.php
index 7a0d664a..6a966121 100644
--- a/maintenance/clearCacheStats.php
+++ b/maintenance/clearCacheStats.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to remove all statistics tracking from the cache.
@@ -57,4 +57,4 @@ class ClearCacheStats extends Maintenance {
 }
 
 $maintClass = "ClearCacheStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/clearInterwikiCache.php b/maintenance/clearInterwikiCache.php
index 88769df2..80c9004e 100644
--- a/maintenance/clearInterwikiCache.php
+++ b/maintenance/clearInterwikiCache.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to clear the cache of interwiki prefixes for all local wikis.
@@ -55,4 +55,4 @@ class ClearInterwikiCache extends Maintenance {
 }
 
 $maintClass = "ClearInterwikiCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/commandLine.inc b/maintenance/commandLine.inc
index 86a558d0..be071422 100644
--- a/maintenance/commandLine.inc
+++ b/maintenance/commandLine.inc
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 global $optionsWithArgs;
 if ( !isset( $optionsWithArgs ) ) {
@@ -55,5 +55,5 @@ class CommandLineInc extends Maintenance {
 }
 
 $maintClass = 'CommandLineInc';
-require( RUN_MAINTENANCE_IF_MAIN );
+require RUN_MAINTENANCE_IF_MAIN;
 
diff --git a/maintenance/compareParsers.php b/maintenance/compareParsers.php
index 1f3ac1c3..fabc2571 100644
--- a/maintenance/compareParsers.php
+++ b/maintenance/compareParsers.php
@@ -28,7 +28,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/dumpIterator.php' );
+require_once __DIR__ . '/dumpIterator.php';
 
 /**
  * Maintenance script to take page text out of an XML dump file and render
@@ -55,8 +55,8 @@ class CompareParsers extends DumpIterator {
 	}
 
 	public function checkOptions() {
-		if ( $this->hasOption('save-failed') ) {
-			$this->saveFailed = $this->getOption('save-failed');
+		if ( $this->hasOption( 'save-failed' ) ) {
+			$this->saveFailed = $this->getOption( 'save-failed' );
 		}
 
 		$this->stripParametersEnabled = $this->hasOption( 'strip-parameters' );
@@ -87,8 +87,9 @@ class CompareParsers extends DumpIterator {
 
 	public function conclusions() {
 		$this->error( "{$this->failed} failed revisions out of {$this->count}" );
-		if ($this->count > 0)
+		if ( $this->count > 0 ) {
 			$this->output( " (" . ( $this->failed / $this->count ) . "%)\n" );
+		}
 	}
 
 	function stripParameters( $text ) {
@@ -155,4 +156,4 @@ class CompareParsers extends DumpIterator {
 }
 
 $maintClass = "CompareParsers";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/convertLinks.php b/maintenance/convertLinks.php
index 5f7b02e4..17b91110 100644
--- a/maintenance/convertLinks.php
+++ b/maintenance/convertLinks.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to convert from the old links schema (string->ID)
@@ -80,9 +80,9 @@ This gives a huge speed improvement for very large links tables which are MyISAM
 
 		# --------------------------------------------------------------------
 
-		list ( $cur, $links, $links_temp, $links_backup ) = $dbw->tableNamesN( 'cur', 'links', 'links_temp', 'links_backup' );
+		list( $cur, $links, $links_temp, $links_backup ) = $dbw->tableNamesN( 'cur', 'links', 'links_temp', 'links_backup' );
 
-		if( $dbw->tableExists( 'pagelinks' ) ) {
+		if ( $dbw->tableExists( 'pagelinks' ) ) {
 			$this->output( "...have pagelinks; skipping old links table updates\n" );
 			return;
 		}
@@ -177,15 +177,16 @@ This gives a huge speed improvement for very large links tables which are MyISAM
 				}
 				$dbw->freeResult( $res );
 				# $this->output( "rowOffset: $rowOffset\ttuplesAdded: $tuplesAdded\tnumBadLinks: $numBadLinks\n" );
-				if ( $tuplesAdded != 0  ) {
+				if ( $tuplesAdded != 0 ) {
 					if ( $reportLinksConvProgress ) {
 						$this->output( "Inserting $tuplesAdded tuples into $links_temp..." );
 					}
 					$dbw->query( implode( "", $sqlWrite ) );
 					$totalTuplesInserted += $tuplesAdded;
-					if ( $reportLinksConvProgress )
+					if ( $reportLinksConvProgress ) {
 						$this->output( " done. Total $totalTuplesInserted tuples inserted.\n" );
-						$this->performanceLog( $fh, $totalTuplesInserted . " " . ( $this->getMicroTime() - $baseTime ) . "\n"  );
+						$this->performanceLog( $fh, $totalTuplesInserted . " " . ( $this->getMicroTime() - $baseTime ) . "\n" );
+					}
 				}
 			}
 			$this->output( "$totalTuplesInserted valid titles and $numBadLinks invalid titles were processed.\n\n" );
@@ -258,4 +259,4 @@ This gives a huge speed improvement for very large links tables which are MyISAM
 }
 
 $maintClass = "ConvertLinks";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/convertUserOptions.php b/maintenance/convertUserOptions.php
index e2223e1a..34c643bb 100644
--- a/maintenance/convertUserOptions.php
+++ b/maintenance/convertUserOptions.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to convert user options to the new `user_properties` table.
@@ -96,4 +96,4 @@ class ConvertUserOptions extends Maintenance {
 }
 
 $maintClass = "ConvertUserOptions";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/copyFileBackend.php b/maintenance/copyFileBackend.php
index f2c4ac54..21ef4ffa 100644
--- a/maintenance/copyFileBackend.php
+++ b/maintenance/copyFileBackend.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Copy all files in one container of one backend to another.
@@ -35,6 +35,8 @@ require_once( __DIR__ . '/Maintenance.php' );
  * @ingroup Maintenance
  */
 class CopyFileBackend extends Maintenance {
+	protected $statCache = array();
+
 	public function __construct() {
 		parent::__construct();
 		$this->mDescription = "Copy files in one backend to another.";
@@ -43,8 +45,10 @@ class CopyFileBackend extends Maintenance {
 		$this->addOption( 'containers', 'Pipe separated list of containers', true, true );
 		$this->addOption( 'subdir', 'Only do items in this child directory', false, true );
 		$this->addOption( 'ratefile', 'File to check periodically for batch size', false, true );
+		$this->addOption( 'prestat', 'Stat the destination files first (try to use listings)' );
 		$this->addOption( 'skiphash', 'Skip SHA-1 sync checks for files' );
 		$this->addOption( 'missingonly', 'Only copy files missing from destination listing' );
+		$this->addOption( 'syncviadelete', 'Delete destination files missing from source listing' );
 		$this->addOption( 'utf8only', 'Skip source files that do not have valid UTF-8 names' );
 		$this->setBatchSize( 50 );
 	}
@@ -53,7 +57,7 @@ class CopyFileBackend extends Maintenance {
 		$src = FileBackendGroup::singleton()->get( $this->getOption( 'src' ) );
 		$dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) );
 		$containers = explode( '|', $this->getOption( 'containers' ) );
-		$subDir = $this->getOption( rtrim( 'subdir', '/' ), '' );
+		$subDir = rtrim( $this->getOption( 'subdir', '' ), '/' );
 
 		$rateFile = $this->getOption( 'ratefile' );
 
@@ -61,7 +65,6 @@ class CopyFileBackend extends Maintenance {
 			$this->error( "Cannot check for UTF-8, mbstring extension missing.", 1 ); // die
 		}
 
-		$count = 0;
 		foreach ( $containers as $container ) {
 			if ( $subDir != '' ) {
 				$backendRel = "$container/$subDir";
@@ -71,40 +74,46 @@ class CopyFileBackend extends Maintenance {
 				$this->output( "Doing container '$container'...\n" );
 			}
 
-			$srcPathsRel = $src->getFileList( array(
-				'dir' => $src->getRootStoragePath() . "/$backendRel" ) );
-			if ( $srcPathsRel === null ) {
-				$this->error( "Could not list files in $container.", 1 ); // die
-			}
-
-			// Do a listing comparison if specified
 			if ( $this->hasOption( 'missingonly' ) ) {
-				$relFilesSrc = array();
-				$relFilesDst = array();
-				foreach ( $srcPathsRel as $srcPathRel ) {
-					$relFilesSrc[] = $srcPathRel;
+				$this->output( "\tBuilding list of missing files..." );
+				$srcPathsRel = $this->getListingDiffRel( $src, $dst, $backendRel );
+				$this->output( count( $srcPathsRel ) . " file(s) need to be copied.\n" );
+			} else {
+				$srcPathsRel = $src->getFileList( array(
+					'dir' => $src->getRootStoragePath() . "/$backendRel",
+					'adviseStat' => true // avoid HEADs
+				) );
+				if ( $srcPathsRel === null ) {
+					$this->error( "Could not list files in $container.", 1 ); // die
 				}
+			}
+
+			if ( $this->getOption( 'prestat' ) && !$this->hasOption( 'missingonly' ) ) {
+				// Build the stat cache for the destination files
+				$this->output( "\tBuilding destination stat cache..." );
 				$dstPathsRel = $dst->getFileList( array(
-					'dir' => $dst->getRootStoragePath() . "/$backendRel" ) );
+					'dir' => $dst->getRootStoragePath() . "/$backendRel",
+					'adviseStat' => true // avoid HEADs
+				) );
 				if ( $dstPathsRel === null ) {
 					$this->error( "Could not list files in $container.", 1 ); // die
 				}
+				$this->statCache = array(); // clear
 				foreach ( $dstPathsRel as $dstPathRel ) {
-					$relFilesDst[] = $dstPathRel;
+					$path = $dst->getRootStoragePath() . "/$backendRel/$dstPathRel";
+					$this->statCache[sha1( $path )] = $dst->getFileStat( array( 'src' => $path ) );
 				}
-				// Only copy the missing files over in the next loop
-				$srcPathsRel = array_diff( $relFilesSrc, $relFilesDst );
-				$this->output( count( $srcPathsRel ) . " file(s) need to be copied.\n" );
-				unset( $relFilesSrc );
-				unset( $relFilesDst );
+				$this->output( "done [" . count( $this->statCache ) . " file(s)]\n" );
 			}
 
+			$this->output( "\tCopying file(s)...\n" );
+			$count = 0;
 			$batchPaths = array();
 			foreach ( $srcPathsRel as $srcPathRel ) {
 				// Check up on the rate file periodically to adjust the concurrency
 				if ( $rateFile && ( !$count || ( $count % 500 ) == 0 ) ) {
 					$this->mBatchSize = max( 1, (int)file_get_contents( $rateFile ) );
-					$this->output( "Batch size is now {$this->mBatchSize}.\n" );
+					$this->output( "\tBatch size is now {$this->mBatchSize}.\n" );
 				}
 				$batchPaths[$srcPathRel] = 1; // remove duplicates
 				if ( count( $batchPaths ) >= $this->mBatchSize ) {
@@ -117,6 +126,36 @@ class CopyFileBackend extends Maintenance {
 				$this->copyFileBatch( array_keys( $batchPaths ), $backendRel, $src, $dst );
 				$batchPaths = array(); // done
 			}
+			$this->output( "\tCopied $count file(s).\n" );
+
+			if ( $this->hasOption( 'syncviadelete' ) ) {
+				$this->output( "\tBuilding list of excess destination files..." );
+				$delPathsRel = $this->getListingDiffRel( $dst, $src, $backendRel );
+				$this->output( count( $delPathsRel ) . " file(s) need to be deleted.\n" );
+
+				$this->output( "\tDeleting file(s)...\n" );
+				$count = 0;
+				$batchPaths = array();
+				foreach ( $delPathsRel as $delPathRel ) {
+					// Check up on the rate file periodically to adjust the concurrency
+					if ( $rateFile && ( !$count || ( $count % 500 ) == 0 ) ) {
+						$this->mBatchSize = max( 1, (int)file_get_contents( $rateFile ) );
+						$this->output( "\tBatch size is now {$this->mBatchSize}.\n" );
+					}
+					$batchPaths[$delPathRel] = 1; // remove duplicates
+					if ( count( $batchPaths ) >= $this->mBatchSize ) {
+						$this->delFileBatch( array_keys( $batchPaths ), $backendRel, $dst );
+						$batchPaths = array(); // done
+					}
+					++$count;
+				}
+				if ( count( $batchPaths ) ) { // left-overs
+					$this->delFileBatch( array_keys( $batchPaths ), $backendRel, $dst );
+					$batchPaths = array(); // done
+				}
+
+				$this->output( "\tDeleted $count file(s).\n" );
+			}
 
 			if ( $subDir != '' ) {
 				$this->output( "Finished container '$container', directory '$subDir'.\n" );
@@ -125,15 +164,58 @@ class CopyFileBackend extends Maintenance {
 			}
 		}
 
-		$this->output( "Done [$count file(s)].\n" );
+		$this->output( "Done.\n" );
 	}
 
+	/**
+	 * @param FileBackend $src
+	 * @param FileBackend $dst
+	 * @param string $backendRel
+	 * @return array (rel paths in $src minus those in $dst)
+	 */
+	protected function getListingDiffRel( FileBackend $src, FileBackend $dst, $backendRel ) {
+		$srcPathsRel = $src->getFileList( array(
+			'dir' => $src->getRootStoragePath() . "/$backendRel" ) );
+		if ( $srcPathsRel === null ) {
+			$this->error( "Could not list files in source container.", 1 ); // die
+		}
+		$dstPathsRel = $dst->getFileList( array(
+			'dir' => $dst->getRootStoragePath() . "/$backendRel" ) );
+		if ( $dstPathsRel === null ) {
+			$this->error( "Could not list files in destination container.", 1 ); // die
+		}
+		// Get the list of destination files
+		$relFilesDstSha1 = array();
+		foreach ( $dstPathsRel as $dstPathRel ) {
+			$relFilesDstSha1[sha1( $dstPathRel )] = 1;
+		}
+		unset( $dstPathsRel ); // free
+		// Get the list of missing files
+		$missingPathsRel = array();
+		foreach ( $srcPathsRel as $srcPathRel ) {
+			if ( !isset( $relFilesDstSha1[sha1( $srcPathRel )] ) ) {
+				$missingPathsRel[] = $srcPathRel;
+			}
+		}
+		unset( $srcPathsRel ); // free
+
+		return $missingPathsRel;
+	}
+
+	/**
+	 * @param array $srcPathsRel
+	 * @param string $backendRel
+	 * @param FileBackend $src
+	 * @param FileBackend $dst
+	 * @return void
+	 */
 	protected function copyFileBatch(
 		array $srcPathsRel, $backendRel, FileBackend $src, FileBackend $dst
 	) {
 		$ops = array();
 		$fsFiles = array();
 		$copiedRel = array(); // for output message
+		$wikiId = $src->getWikiId();
 
 		// Download the batch of source files into backend cache...
 		if ( $this->hasOption( 'missingonly' ) ) {
@@ -144,8 +226,8 @@ class CopyFileBackend extends Maintenance {
 			$t_start = microtime( true );
 			$fsFiles = $src->getLocalReferenceMulti( array( 'srcs' => $srcPaths, 'latest' => 1 ) );
 			$ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
-			$this->output( "\nDownloaded these file(s) [{$ellapsed_ms}ms]:\n" .
-				implode( "\n", $srcPaths ) . "\n\n" );
+			$this->output( "\n\tDownloaded these file(s) [{$ellapsed_ms}ms]:\n\t" .
+				implode( "\n\t", $srcPaths ) . "\n\n" );
 		}
 
 		// Determine what files need to be copied over...
@@ -153,22 +235,30 @@ class CopyFileBackend extends Maintenance {
 			$srcPath = $src->getRootStoragePath() . "/$backendRel/$srcPathRel";
 			$dstPath = $dst->getRootStoragePath() . "/$backendRel/$srcPathRel";
 			if ( $this->hasOption( 'utf8only' ) && !mb_check_encoding( $srcPath, 'UTF-8' ) ) {
-				$this->error( "Detected illegal (non-UTF8) path for $srcPath." );
+				$this->error( "$wikiId: Detected illegal (non-UTF8) path for $srcPath." );
 				continue;
-			} elseif ( $this->filesAreSame( $src, $dst, $srcPath, $dstPath ) ) {
-				$this->output( "Already have $srcPathRel.\n" );
+			} elseif ( !$this->hasOption( 'missingonly' )
+				&& $this->filesAreSame( $src, $dst, $srcPath, $dstPath ) )
+			{
+				$this->output( "\tAlready have $srcPathRel.\n" );
 				continue; // assume already copied...
 			}
 			$fsFile = array_key_exists( $srcPath, $fsFiles )
 				? $fsFiles[$srcPath]
 				: $src->getLocalReference( array( 'src' => $srcPath, 'latest' => 1 ) );
 			if ( !$fsFile ) {
-				$this->error( "Could not get local copy of $srcPath.", 1 ); // die
+				$src->clearCache( array( $srcPath ) );
+				if ( $src->fileExists( array( 'src' => $srcPath, 'latest' => 1 ) ) === false ) {
+					$this->error( "$wikiId: File '$srcPath' was listed but does not exist." );
+				} else {
+					$this->error( "$wikiId: Could not get local copy of $srcPath." );
+				}
+				continue;
 			} elseif ( !$fsFile->exists() ) {
 				// FSFileBackends just return the path for getLocalReference() and paths with
 				// illegal slashes may get normalized to a different path. This can cause the
 				// local reference to not exist...skip these broken files.
-				$this->error( "Detected possible illegal path for $srcPath." );
+				$this->error( "$wikiId: Detected possible illegal path for $srcPath." );
 				continue;
 			}
 			$fsFiles[] = $fsFile; // keep TempFSFile objects alive as needed
@@ -176,7 +266,7 @@ class CopyFileBackend extends Maintenance {
 			$status = $dst->prepare( array( 'dir' => dirname( $dstPath ), 'bypassReadOnly' => 1 ) );
 			if ( !$status->isOK() ) {
 				$this->error( print_r( $status->getErrorsArray(), true ) );
-				$this->error( "Could not copy $srcPath to $dstPath.", 1 ); // die
+				$this->error( "$wikiId: Could not copy $srcPath to $dstPath.", 1 ); // die
 			}
 			$ops[] = array( 'op' => 'store',
 				'src' => $fsFile->getPath(), 'dst' => $dstPath, 'overwrite' => 1 );
@@ -193,26 +283,75 @@ class CopyFileBackend extends Maintenance {
 		$ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
 		if ( !$status->isOK() ) {
 			$this->error( print_r( $status->getErrorsArray(), true ) );
-			$this->error( "Could not copy file batch.", 1 ); // die
+			$this->error( "$wikiId: Could not copy file batch.", 1 ); // die
 		} elseif ( count( $copiedRel ) ) {
-			$this->output( "\nCopied these file(s) [{$ellapsed_ms}ms]:\n" .
-				implode( "\n", $copiedRel ) . "\n\n" );
+			$this->output( "\n\tCopied these file(s) [{$ellapsed_ms}ms]:\n\t" .
+				implode( "\n\t", $copiedRel ) . "\n\n" );
+		}
+	}
+
+	/**
+	 * @param array $dstPathsRel
+	 * @param string $backendRel
+	 * @param FileBackend $dst
+	 * @return void
+	 */
+	protected function delFileBatch(
+		array $dstPathsRel, $backendRel, FileBackend $dst
+	) {
+		$ops = array();
+		$deletedRel = array(); // for output message
+		$wikiId = $dst->getWikiId();
+
+		// Determine what files need to be copied over...
+		foreach ( $dstPathsRel as $dstPathRel ) {
+			$dstPath = $dst->getRootStoragePath() . "/$backendRel/$dstPathRel";
+			$ops[] = array( 'op' => 'delete', 'src' => $dstPath );
+			$deletedRel[] = $dstPathRel;
+		}
+
+		// Delete the batch of source files...
+		$t_start = microtime( true );
+		$status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) );
+		if ( !$status->isOK() ) {
+			sleep( 10 ); // wait and retry copy again
+			$status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) );
+		}
+		$ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
+		if ( !$status->isOK() ) {
+			$this->error( print_r( $status->getErrorsArray(), true ) );
+			$this->error( "$wikiId: Could not delete file batch.", 1 ); // die
+		} elseif ( count( $deletedRel ) ) {
+			$this->output( "\n\tDeleted these file(s) [{$ellapsed_ms}ms]:\n\t" .
+				implode( "\n\t", $deletedRel ) . "\n\n" );
 		}
 	}
 
+	/**
+	 * @param FileBackend $src
+	 * @param FileBackend $dst
+	 * @param string $sPath
+	 * @param string $dPath
+	 * @return bool
+	 */
 	protected function filesAreSame( FileBackend $src, FileBackend $dst, $sPath, $dPath ) {
 		$skipHash = $this->hasOption( 'skiphash' );
+		$srcStat = $src->getFileStat( array( 'src' => $sPath ) );
+		$dPathSha1 = sha1( $dPath );
+		$dstStat = isset( $this->statCache[$dPathSha1] )
+			? $this->statCache[$dPathSha1]
+			: $dst->getFileStat( array( 'src' => $dPath ) );
 		return (
-			( $src->fileExists( array( 'src' => $sPath, 'latest' => 1 ) )
-				=== $dst->fileExists( array( 'src' => $dPath, 'latest' => 1 ) ) // short-circuit
-			) && ( $src->getFileSize( array( 'src' => $sPath, 'latest' => 1 ) )
-				=== $dst->getFileSize( array( 'src' => $dPath, 'latest' => 1 ) ) // short-circuit
-			) && ( $skipHash || ( $src->getFileSha1Base36( array( 'src' => $sPath, 'latest' => 1 ) )
+			is_array( $srcStat ) // sanity check that source exists
+			&& is_array( $dstStat ) // dest exists
+			&& $srcStat['size'] === $dstStat['size']
+			&& ( !$skipHash || $srcStat['mtime'] <= $dstStat['mtime'] )
+			&& ( $skipHash || $src->getFileSha1Base36( array( 'src' => $sPath, 'latest' => 1 ) )
 				=== $dst->getFileSha1Base36( array( 'src' => $dPath, 'latest' => 1 ) )
-			) )
+			)
 		);
 	}
 }
 
 $maintClass = 'CopyFileBackend';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/copyJobQueue.php b/maintenance/copyJobQueue.php
new file mode 100644
index 00000000..e833115b
--- /dev/null
+++ b/maintenance/copyJobQueue.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Copy all jobs from one job queue system to another.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Copy all jobs from one job queue system to another.
+ * This uses an ad-hoc $wgJobQueueMigrationConfig setting,
+ * which is a map of queue system names to JobQueue::factory() parameters.
+ * The parameters should not have wiki or type settings and thus partial.
+ *
+ * @ingroup Maintenance
+ */
+class CopyJobQueue extends Maintenance {
+	public function __construct() {
+		parent::__construct();
+		$this->mDescription = "Copy jobs from one queue system to another.";
+		$this->addOption( 'src', 'Key to $wgJobQueueMigrationConfig for source', true, true );
+		$this->addOption( 'dst', 'Key to $wgJobQueueMigrationConfig for destination', true, true );
+		$this->addOption( 'type', 'Types of jobs to copy (use "all" for all)', true, true );
+		$this->setBatchSize( 500 );
+	}
+
+	public function execute() {
+		global $wgJobQueueMigrationConfig;
+
+		$srcKey = $this->getOption( 'src' );
+		$dstKey = $this->getOption( 'dst' );
+
+		if ( !isset( $wgJobQueueMigrationConfig[$srcKey] ) ) {
+			$this->error( "\$wgJobQueueMigrationConfig not set for '$srcKey'.", 1 );
+		} elseif ( !isset( $wgJobQueueMigrationConfig[$dstKey] ) ) {
+			$this->error( "\$wgJobQueueMigrationConfig not set for '$dstKey'.", 1 );
+		}
+
+		$types = ( $this->getOption( 'type' ) === 'all' )
+			? JobQueueGroup::singleton()->getQueueTypes()
+			: array( $this->getOption( 'type' ) );
+
+		foreach ( $types as $type ) {
+			$baseConfig = array( 'type' => $type, 'wiki' => wfWikiID() );
+			$src = JobQueue::factory( $baseConfig + $wgJobQueueMigrationConfig[$srcKey] );
+			$dst = JobQueue::factory( $baseConfig + $wgJobQueueMigrationConfig[$dstKey] );
+
+			list( $total, $totalOK ) = $this->copyJobs( $src, $dst, $src->getAllQueuedJobs() );
+			$this->output( "Copied $totalOK/$total queued $type jobs.\n" );
+
+			list( $total, $totalOK ) = $this->copyJobs( $src, $dst, $src->getAllDelayedJobs() );
+			$this->output( "Copied $totalOK/$total delayed $type jobs.\n" );
+		}
+	}
+
+	protected function copyJobs( JobQueue $src, JobQueue $dst, $jobs ) {
+		$total = 0;
+		$totalOK = 0;
+		$batch = array();
+		foreach ( $jobs as $job ) {
+			++$total;
+			$batch[] = $job;
+			if ( count( $batch ) >= $this->mBatchSize ) {
+				if ( $dst->push( $batch ) ) {
+					$totalOK += count( $batch );
+				}
+				$batch = array();
+				$dst->waitForBackups();
+			}
+		}
+		if ( count( $batch ) ) {
+			if ( $dst->push( $batch ) ) {
+				$totalOK += count( $batch );
+			}
+			$dst->waitForBackups();
+		}
+		return array( $total, $totalOK );
+	}
+}
+
+$maintClass = 'CopyJobQueue';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/createAndPromote.php b/maintenance/createAndPromote.php
index 81fbbb3d..aa25ee60 100644
--- a/maintenance/createAndPromote.php
+++ b/maintenance/createAndPromote.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Creates an account and grant it administrator rights.
+ * Creates an account and grants it rights.
  *
  * 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
@@ -23,26 +23,26 @@
  * @author Pablo Castellano <pablo@anche.no>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
- * Maintenance script to create an account and grant it administrator rights.
+ * Maintenance script to create an account and grant it rights.
  *
  * @ingroup Maintenance
  */
 class CreateAndPromote extends Maintenance {
 
-	static $permitRoles = array( 'sysop', 'bureaucrat' );
+	static $permitRoles = array( 'sysop', 'bureaucrat', 'bot' );
 
 	public function __construct() {
 		parent::__construct();
 		$this->mDescription = "Create a new user account and/or grant it additional rights";
 		$this->addOption( "force", "If acccount exists already, just grant it rights or change password." );
-		foreach( self::$permitRoles as $role ) {
+		foreach ( self::$permitRoles as $role ) {
 			$this->addOption( $role, "Add the account to the {$role} group" );
 		}
 		$this->addArg( "username", "Username of new user" );
-		$this->addArg( "password", "Password to set (not required if --force is used)", false);
+		$this->addArg( "password", "Password to set (not required if --force is used)", false );
 	}
 
 	public function execute() {
@@ -60,10 +60,10 @@ class CreateAndPromote extends Maintenance {
 
 		if ( $exists && !$force ) {
 			$this->error( "Account exists. Perhaps you want the --force option?", true );
-		} else if ( !$exists && !$password ) {
+		} elseif ( !$exists && !$password ) {
 			$this->error( "Argument <password> required!", false );
 			$this->maybeHelp( true );
-		} else if ( $exists ) {
+		} elseif ( $exists ) {
 			$inGroups = $user->getGroups();
 		}
 
@@ -72,7 +72,7 @@ class CreateAndPromote extends Maintenance {
 		if ( $exists && !$password && count( $promotions ) === 0 ) {
 			$this->output( "Account exists and nothing to do.\n" );
 			return;
-		} else if ( count( $promotions ) !== 0 ) {
+		} elseif ( count( $promotions ) !== 0 ) {
 			$promoText = "User:{$username} into " . implode( ', ', $promotions ) . "...\n";
 			if ( $exists ) {
 				$this->output( wfWikiID() . ": Promoting $promoText" );
@@ -114,4 +114,4 @@ class CreateAndPromote extends Maintenance {
 }
 
 $maintClass = "CreateAndPromote";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteArchivedFiles.inc b/maintenance/deleteArchivedFiles.inc
index 792ee6c6..d58e9a40 100644
--- a/maintenance/deleteArchivedFiles.inc
+++ b/maintenance/deleteArchivedFiles.inc
@@ -42,7 +42,7 @@ class DeleteArchivedFilesImplementation {
 			$group = $row->fa_storage_group;
 			$id = $row->fa_id;
 			$path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
-			if( isset( $row->fa_sha1 ) ) {
+			if ( isset( $row->fa_sha1 ) ) {
 				$sha1 = $row->fa_sha1;
 			} else {
 				// old row, populate from key
diff --git a/maintenance/deleteArchivedFiles.php b/maintenance/deleteArchivedFiles.php
index 85ffc23b..ad7b54d0 100644
--- a/maintenance/deleteArchivedFiles.php
+++ b/maintenance/deleteArchivedFiles.php
@@ -24,8 +24,8 @@
  * @author Aaron Schulz
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
-require_once( __DIR__ . '/deleteArchivedFiles.inc' );
+require_once __DIR__ . '/Maintenance.php';
+require_once __DIR__ . '/deleteArchivedFiles.inc';
 
 /**
  * Maintenance script to delete archived (non-current) files from the database.
@@ -55,4 +55,4 @@ class DeleteArchivedFiles extends Maintenance {
 }
 
 $maintClass = "DeleteArchivedFiles";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteArchivedRevisions.php b/maintenance/deleteArchivedRevisions.php
index 4b658bbb..ffd581c1 100644
--- a/maintenance/deleteArchivedRevisions.php
+++ b/maintenance/deleteArchivedRevisions.php
@@ -24,8 +24,8 @@
  * @author Aaron Schulz
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
-require_once( __DIR__ . '/deleteArchivedRevisions.inc' );
+require_once __DIR__ . '/Maintenance.php';
+require_once __DIR__ . '/deleteArchivedRevisions.inc';
 
 /**
  * Maintenance script to delete archived (deleted from public) revisions
@@ -59,4 +59,4 @@ class DeleteArchivedRevisions extends Maintenance {
 }
 
 $maintClass = "DeleteArchivedRevisions";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteBatch.php b/maintenance/deleteBatch.php
index 936a52b8..c1cc03cd 100644
--- a/maintenance/deleteBatch.php
+++ b/maintenance/deleteBatch.php
@@ -28,7 +28,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to delete a batch of pages.
@@ -121,4 +121,4 @@ class DeleteBatch extends Maintenance {
 }
 
 $maintClass = "DeleteBatch";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteDefaultMessages.php b/maintenance/deleteDefaultMessages.php
index 4ab6d1d9..7d8c80e4 100644
--- a/maintenance/deleteDefaultMessages.php
+++ b/maintenance/deleteDefaultMessages.php
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that deletes all pages in the MediaWiki namespace
@@ -51,7 +51,7 @@ class DeleteDefaultMessages extends Maintenance {
 			)
 		);
 
-		if( $dbr->numRows( $res ) == 0 ) {
+		if ( $dbr->numRows( $res ) == 0 ) {
 			# No more messages left
 			$this->output( "done.\n" );
 			return;
@@ -86,4 +86,4 @@ class DeleteDefaultMessages extends Maintenance {
 }
 
 $maintClass = "DeleteDefaultMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteEqualMessages.php b/maintenance/deleteEqualMessages.php
index 7048140b..81758913 100644
--- a/maintenance/deleteEqualMessages.php
+++ b/maintenance/deleteEqualMessages.php
@@ -19,7 +19,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that deletes all pages in the MediaWiki namespace
@@ -41,7 +41,7 @@ class DeleteEqualMessages extends Maintenance {
 	 * @param string|bool $langCode See --lang-code option.
 	 */
 	protected function fetchMessageInfo( $langCode, array &$messageInfo ) {
-		global $wgUser, $wgContLang;
+		global $wgContLang;
 
 		if ( $langCode ) {
 			$this->output( "\n... fetching message info for language: $langCode" );
@@ -70,7 +70,13 @@ class DeleteEqualMessages extends Maintenance {
 				$default = wfMessage( $key )->inLanguage( $langCode )->useDatabase( false )->plain();
 
 				$messageInfo['relevantPages']++;
-				if ( $actual === $default ) {
+
+				if (
+					// Exclude messages that are empty by default, such as sitenotice, specialpage
+					// summaries and accesskeys.
+					$default !== '' && $default !== '-' &&
+						$actual === $default
+				) {
 					$hasTalk = isset( $statuses['talks'][$key] );
 					$messageInfo['results'][] = array(
 						'title' => $key . $titleSuffix,
@@ -152,6 +158,7 @@ class DeleteEqualMessages extends Maintenance {
 		if ( !$user ) {
 			$this->error( "Invalid username", true );
 		}
+		global $wgUser;
 		$wgUser = $user;
 
 		// Hide deletions from RecentChanges
@@ -183,4 +190,4 @@ class DeleteEqualMessages extends Maintenance {
 }
 
 $maintClass = "DeleteEqualMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteImageMemcached.php b/maintenance/deleteImageMemcached.php
index 3c8c5fdd..835de352 100644
--- a/maintenance/deleteImageMemcached.php
+++ b/maintenance/deleteImageMemcached.php
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that deletes image information from the object cache.
@@ -59,13 +59,15 @@ class DeleteImageCache extends Maintenance {
 		$total = $this->getImageCount();
 
 		foreach ( $res as $row ) {
-			if ( $i % $this->report == 0 )
+			if ( $i % $this->report == 0 ) {
 				$this->output( sprintf( "%s: %13s done (%s)\n", wfWikiID(), "$i/$total", wfPercent( $i / $total * 100 ) ) );
+			}
 			$md5 = md5( $row->img_name );
 			$wgMemc->delete( wfMemcKey( 'Image', $md5 ) );
 
-			if ( $sleep != 0 )
+			if ( $sleep != 0 ) {
 				usleep( $sleep );
+			}
 
 			++$i;
 		}
@@ -78,4 +80,4 @@ class DeleteImageCache extends Maintenance {
 }
 
 $maintClass = "DeleteImageCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteOldRevisions.php b/maintenance/deleteOldRevisions.php
index 114aefd7..847d8634 100644
--- a/maintenance/deleteOldRevisions.php
+++ b/maintenance/deleteOldRevisions.php
@@ -22,7 +22,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that deletes old (non-current) revisions from the database.
@@ -100,4 +100,4 @@ class DeleteOldRevisions extends Maintenance {
 }
 
 $maintClass = "DeleteOldRevisions";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteOrphanedRevisions.php b/maintenance/deleteOrphanedRevisions.php
index f0da9a82..f0a96928 100644
--- a/maintenance/deleteOrphanedRevisions.php
+++ b/maintenance/deleteOrphanedRevisions.php
@@ -24,7 +24,7 @@
  * @todo More efficient cleanup of text records
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that deletes revisions which refer to a nonexisting page.
@@ -54,8 +54,9 @@ class DeleteOrphanedRevisions extends Maintenance {
 
 		# Stash 'em all up for deletion (if needed)
 		$revisions = array();
-		foreach ( $res as $row )
+		foreach ( $res as $row ) {
 			$revisions[] = $row->rev_id;
+		}
 		$count = count( $revisions );
 		$this->output( "found {$count}.\n" );
 
@@ -83,11 +84,12 @@ class DeleteOrphanedRevisions extends Maintenance {
 	 * @param $dbw DatabaseBase class (needs to be a master)
 	 */
 	private function deleteRevs( $id, &$dbw ) {
-		if ( !is_array( $id ) )
+		if ( !is_array( $id ) ) {
 			$id = array( $id );
+		}
 		$dbw->delete( 'revision', array( 'rev_id' => $id ), __METHOD__ );
 	}
 }
 
 $maintClass = "DeleteOrphanedRevisions";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteRevision.php b/maintenance/deleteRevision.php
index ad6470d9..6bc0f7cd 100644
--- a/maintenance/deleteRevision.php
+++ b/maintenance/deleteRevision.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that deletes one or more revisions by moving them
@@ -85,4 +85,4 @@ class DeleteRevision extends Maintenance {
 }
 
 $maintClass = "DeleteRevision";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/deleteSelfExternals.php b/maintenance/deleteSelfExternals.php
index da220d64..a0976228 100644
--- a/maintenance/deleteSelfExternals.php
+++ b/maintenance/deleteSelfExternals.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that deletes self-references to $wgServer
@@ -47,10 +47,12 @@ class DeleteSelfExternals extends Maintenance {
 				. $db->buildLike( $wgServer . '/', $db->anyString() ), $this->mBatchSize );
 			$this->output( "Deleting a batch\n" );
 			$db->query( $q );
-			if ( !$db->affectedRows() ) return;
+			if ( !$db->affectedRows() ) {
+				return;
+			}
 		}
 	}
 }
 
 $maintClass = "DeleteSelfExternals";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/dev/includes/router.php b/maintenance/dev/includes/router.php
index 1d5070b1..a3cc0ba3 100644
--- a/maintenance/dev/includes/router.php
+++ b/maintenance/dev/includes/router.php
@@ -25,8 +25,8 @@ if ( PHP_SAPI != 'cli-server' ) {
 	die( "This script can only be run by php's cli-server sapi." );
 }
 
-ini_set('display_errors', 1);
-error_reporting(E_ALL);
+ini_set( 'display_errors', 1 );
+error_reporting( E_ALL );
 
 if ( isset( $_SERVER["SCRIPT_FILENAME"] ) ) {
 	# Known resource, sometimes a script sometimes a file
@@ -58,7 +58,7 @@ if ( $ext == 'php' || $ext == 'php5' ) {
 	# We use require and return true here because when you return false
 	# the php webserver will discard post data and things like login
 	# will not function in the dev environment.
-	require( $file );
+	require $file;
 	return true;
 }
 $mime = false;
@@ -83,16 +83,16 @@ if ( $mime ) {
 	# This way we can serve things like .svg files that the built-in
 	# PHP webserver doesn't understand.
 	# ;) Nicely enough we just happen to bundle a mime.types file
-	$f = fopen($file, 'rb');
+	$f = fopen( $file, 'rb' );
 	if ( preg_match( '#^text/#', $mime ) ) {
 		# Text should have a charset=UTF-8 (php's webserver does this too)
-		header("Content-Type: $mime; charset=UTF-8");
+		header( "Content-Type: $mime; charset=UTF-8" );
 	} else {
-		header("Content-Type: $mime");
+		header( "Content-Type: $mime" );
 	}
-	header("Content-Length: " . filesize($file));
+	header( "Content-Length: " . filesize( $file ) );
 	// Stream that out to the browser
-	fpassthru($f);
+	fpassthru( $f );
 	return true;
 }
 
diff --git a/maintenance/dictionary/mediawiki.dic b/maintenance/dictionary/mediawiki.dic
new file mode 100644
index 00000000..164b5b05
--- /dev/null
+++ b/maintenance/dictionary/mediawiki.dic
@@ -0,0 +1,4556 @@
+ænglisc
+ævar
+&add
+&amp
+&bar
+&sim
+&url
+ABNF
+API
+Aacute
+Aborted
+Abuse
+Account
+Accum
+Acirc
+Action
+Activity
+Agrave
+All
+Allocations
+Ancientpages
+Anim
+Api
+Apitestsysop
+Apitestuser
+Aring
+Article
+As
+Atilde
+Auml
+Autopromote
+BACKCOMPAT
+Backlinks
+Blacklist
+Block
+Blocked
+Blocks
+Bodytext
+Broken
+COMPUTERNAME
+CRLF
+CURLOPT
+Campaign
+Capture
+Categories
+Category
+Ccedil
+Central
+Changes
+Check
+Click
+Client
+Clientfor
+Colorer
+Compare
+Config
+Console
+Continue
+Contribs
+Contributions
+Conversiontable
+Coordinates
+Create
+Creation
+Cview
+DDLMODE
+DWIM
+DWIMD
+Daily
+Dbkeyform
+Deadendpages
+Debugtext
+Delete
+Deletedrevs
+Denied
+Dfile
+Double
+Duplicate
+EAGAIN
+EBML
+ECMA
+EDITFILTERMERGED
+EINPROGRESS
+EINTR
+EOCDR
+ETAG
+Eacute
+Ecirc
+Edit
+Editor
+Education
+Egrave
+Ehcache
+Elig
+Email
+Empty
+End
+English
+Enlist
+Euml
+Eval
+Events
+Exists
+Expand
+Expression
+Ext
+External
+Extracts
+Extraneous
+FFFD
+FOLLOWLOCATION
+Failure
+Featured
+Feed
+Feedback
+Feedbackv
+Feeds
+Fewestrevisions
+Ffile
+File
+Filearchive
+Filedelete
+Files
+Filter
+Filters
+Flag
+Flagged
+GI
+GRAPHEME
+Gadget
+Gadgets
+Geo
+Get
+Global
+Groups
+HEA
+HTM
+Hardblock
+Help
+Helpful
+ID
+IPTC
+IWBacklinks
+IWLinks
+Iacute
+Icirc
+Igrave
+Illegal
+Image
+Images
+Implict
+Import
+Info
+Invalidateemail
+Isarticle
+Item
+Iuml
+LOCALISATIONCACHE
+Lang
+Lastmod
+Links
+Linktags
+List
+Listredirects
+Living
+Log
+Login
+Logout
+Logs
+Lonelypages
+Longpages
+Love
+Ltitle
+MSVC
+Mark
+Match
+Matrix
+Members
+Mesg
+Messages
+Metatags
+Mobile
+Mostcategories
+Mostimages
+Mostinterwikis
+Mostlinked
+Mostlinkedcategories
+Mostlinkedtemplates
+Mostrevisions
+Move
+Mssql
+Mwstore
+Myuploads
+NEWPAGE
+NOTIC
+Name
+Need
+No
+Noscript
+Not
+Notalk
+Notice
+Notification
+Ntilde
+Oacute
+Ocirc
+Ograve
+Oldreviewedpages
+Open
+Options
+Oslash
+Otilde
+Ouml
+PAGEEDITDATE
+PAGEEDITOR
+PAGEEDITTIME
+PAGEINTRO
+PAGEMINOREDIT
+PAGESUMMARY
+PARSEHUGE
+PARSERFIRSTCALLINIT
+PHPTAL
+PMID
+Page
+Pages
+Param
+Parse
+Parsers
+Pass
+Passpass
+Patrol
+People
+Plugin
+Possible
+Program
+Props
+Protect
+Protected
+Protectexpiry
+Protectother
+Protectreason
+Protectreasonother
+Purge
+Query
+Queued
+Random
+Rapid
+Ratings
+Raw
+Recent
+Redirects
+Redis
+Referer
+Refresh
+Regexlike
+Replacer
+Reset
+Resursive
+Revert
+Review
+Revisions
+Rollback
+Rsd
+SEGSIZE
+STDERR
+SYSDBA
+Scaron
+Scribunto
+Search
+Section
+Set
+Shortpages
+Site
+Siteinfo
+Solr
+Stabilize
+Stash
+Stats
+Status
+Success
+Syntax
+TMPDIR
+TOOLBOXEND
+TRANSLIT
+Tagging
+Tags
+Template
+Templates
+Textform
+Tfile
+Throttled
+Timestamp
+Title
+Titles
+Token
+Tokens
+Tracking
+Transcode
+Triage
+UNWATCHURL
+Uacute
+Ucirc
+Ugrave
+Unblock
+Uncategorizedcategories
+Uncategorizedimages
+Uncategorizedpages
+Uncategorizedtemplates
+Undelete
+Unusedcategories
+Unusedimages
+Unusedtemplates
+Unwatchedpages
+Upload
+Urlform
+Usage
+User
+Usercreate
+Userdir
+Userlang
+Userrights
+Users
+Useruser
+Ustart
+Uuml
+Value
+Video
+View
+Visual
+WATCHINGUSERNAME
+WEBPVP
+Wantedcategories
+Wantedfiles
+Wantedpages
+Wantedtemplates
+Warning
+Watch
+Watchingusers
+Watchlist
+Wiki
+Wikibase
+Withoutinterwiki
+Wrong
+XX
+Xml
+YYYY
+YYYYMMDDHHMMSS
+Yacute
+Yuml
+\
+a
+aa
+aacute
+abbrv
+abcdefghijklmnopqrstuvwxyz
+abf
+aboutpage
+aboutsite
+abusefilter
+abusefiltercheckmatch
+abusefilterchecksyntax
+abusefilterevalexpression
+abusefilters
+abusefilterunblockautopromote
+abuselog
+abusive
+ac
+acad
+accel
+acceptlang
+accessdenied
+accesskey
+accesskeycache
+accesskeys
+accessors
+acchits
+account
+accountcreator
+accum
+acirc
+aclimit
+acprefix
+action
+actioncomplete
+actionhidden
+actions
+actiontext
+actionthrottled
+actionthrottledtext
+actiontoken
+activeusers
+activity
+acuxvalidate
+add
+addablegroups
+addbegin
+addedline
+addedwatchtext
+addergroup
+addergroups
+addin
+adding
+additional
+addr
+address
+addresses
+addsection
+addstudent
+admin
+administrator
+adnum
+adrelid
+adsrc
+advancedediting
+advancedrc
+advancedrendering
+advancedsearchoptions
+advancedwatchlist
+aelig
+af
+afl
+aft
+afttest
+afvf
+age
+aggregators
+agrave
+ahandler
+ahttp
+ai
+aifc
+aiff
+aiprop
+ajaxwatch
+al
+alefsym
+algo
+algos
+all
+all's
+allcategories
+alldata
+alle
+allexamples
+allhidden
+allimages
+allimit
+alllinks
+alllogstext
+allmessages
+allmonths
+allowedctypes
+allowedonly
+allowemail
+allowsduplicates
+allowusertalk
+allpages
+allpagesbadtitle
+allpagesprefix
+allpagesredirect
+allpagessubmit
+allrev
+alltitles
+alltransclusions
+allusers
+aloption
+alprefix
+alreadyblocked
+alreadydone
+alreadyexists
+alreadyrolled
+alunique
+am
+anchor
+anchorclose
+anchorencode
+and
+andconvert
+andtitle
+anon
+anoneditwarning
+anonlogin
+anonnotice
+anononly
+anonpreviewwarning
+anontalk
+anontalkpagetext
+anontoken
+anonuserpage
+anonymous
+anti
+antispoof
+antivirus
+anymap
+ap
+apcond
+apdir
+api
+api's
+apibase
+apihelp
+apihighlimits
+apis
+aplimit
+apnamespace
+apng
+apos
+appendnotsupported
+appendtext
+apprefix
+approve
+aprops
+aqbt
+aqct
+archivename
+aren
+args
+argsarams
+aring
+arnfjörð
+article
+articleexists
+articlefeedbackv
+articleid
+articlelink
+articlepage
+articlepath
+articles
+aryeh
+asc
+ascending
+asctime
+asdf
+aspx
+assert
+astriks
+asymp
+async
+asynccopyuploaddisabled
+asyncdownload
+at
+atend
+atext
+atid
+atilde
+atime
+atlimit
+atoi
+atom
+atprefix
+atthasdef
+attibs
+attibute
+attlen
+attname
+attnum
+attrdef
+attrelid
+attrib
+attribs
+attributename
+attrs
+atttypid
+atunique
+au
+auml
+authplugins
+autoaccount
+autobiography
+autoblock
+autoblocked
+autoblockedtext
+autoblocker
+autoblockid
+autoblocking
+autoblockip
+autoblocks
+autocad
+autocomment
+autocomments
+autocomplete
+autoconfirm
+autoconfirmed
+autocreate
+autocreated
+autocreation
+autodetection
+autoflag
+autofocus
+autogen
+autogenerated
+autohide
+autoload
+autoloader
+autoloaders
+autoloading
+automagically
+automatic
+autonym
+autopatrol
+autoplay
+autopromote
+autopromoted
+autopromotion
+autoreview
+autoreviewer
+autoreviewrestore
+autosumm
+autosummaries
+autosummary
+axto
+azərbaycanca
+backends
+backlink
+backlinks
+backlinksubtitle
+backported
+backslashed
+backtraces
+bad
+badaccess
+badarticleerror
+badcontinue
+baddiff
+bademail
+badfilename
+badformat
+badgenerator
+badhookmsg
+badinterwiki
+badip
+badipaddress
+badkey
+badmd
+badmime
+badminpassword
+badminuser
+badnamespace
+badoption
+badparams
+badport
+badretype
+badrevids
+badsig
+badsiglength
+badsyntax
+badtag
+badtimestamp
+badtitle
+badtitletext
+badtoken
+badtype
+badupload
+baduser
+badversion
+balancer
+balancers
+banjar
+barstein
+base
+basefont
+basename
+basepagename
+basepagenamee
+basetimestamp
+bashkir
+bashpid
+bcancel
+bceffd
+bcmath
+bcompress
+bcpio
+bdop
+bdquo
+becampus
+beinstructor
+belarusian
+beonline
+bereviewer
+berror
+bestq
+besttype
+bg
+bgcolor
+bgzip
+bidi
+bigdelete
+binhex
+bitdepth
+bitfield
+bitfields
+bitmask
+bjarmason
+bk
+bkey
+bkinvalidparammix
+bkmissingparam
+bkusers
+bl
+blanking
+blanknamespace
+blankpage
+blegh
+bleh
+blinvalidparammix
+blksize
+blmissingparam
+block
+blockable
+blocked
+blockedasrange
+blockedby
+blockedbyid
+blockedemailuser
+blockedexpiry
+blockedfrommail
+blockednoreason
+blockedreason
+blockedtext
+blockedtitle
+blockemail
+blockexpiry
+blockid
+blockinfo
+blockip
+blocklink
+blocklogentry
+blocklogpage
+blocklogtext
+blockme
+blockquote
+blockreason
+blocks
+blocktoken
+bloggs
+blogs
+blogspot
+bltitle
+bluelink
+bluelinks
+bmwschema
+bmysql
+bname
+bodycontent
+boldening
+bolding
+booksources
+bool
+boolean
+borderhack
+bot
+botedit
+boteditletter
+bots
+bottom
+bottomscripts
+bpassword
+bpatch
+bpchar
+bport
+bprefix
+broeck
+brokenlibxml
+brokenredirects
+brokenredirectstext
+browsearchive
+brvbar
+bserver
+bservers
+bssl
+btestpassword
+btestuser
+btype
+bucket
+bucketcount
+bugfix
+bugfixes
+buglist
+bugzilla
+buildpath
+buildpathentry
+bulgakov
+bulkdelcourses
+bulkdelorgs
+bureaucrat
+buser
+by
+byemail
+byid
+bytea
+bytesleft
+bytesread
+bytevalue
+cacheable
+cached
+cachedcount
+cachedsidebar
+cachedspecial
+cachedtimestamp
+calimit
+callargs
+campaign
+campus
+cancelto
+cannotdelete
+cannotundelete
+canonicalised
+canonicalization
+canonicalize
+canonicalizes
+canonicalizing
+canremember
+canreset
+cansecurelogin
+cantblock
+cantcreate
+cantdelete
+cantedit
+cantexecute
+canthide
+cantimport
+cantmove
+cantmovefile
+cantopenfile
+cantoverwrite
+cantrollback
+cantsend
+cantunblock
+cantundelete
+capitalizeallnouns
+captchaid
+captchas
+captchaword
+cascade
+cascadeable
+cascadeon
+cascadeprotected
+cascadeprotectedwarning
+cascading
+cascadingness
+categories
+categories's
+categorieshtml
+category
+categoryfinder
+categoryinfo
+categorylinks
+categorymembers
+categorypage
+categoryviewer
+catids
+catlinks
+catpage
+catrope
+cattitles
+ccedil
+ccme
+ccmeonemails
+cdab
+cdel
+cdlink
+cedil
+ceebc
+cellpadding
+cellspacing
+central
+centralauth
+centralnotice
+centralnoticeallocations
+centralnoticelogs
+centralnoticequerycampaign
+cgroup
+cgroups
+change
+change's
+changeablegroups
+changed
+changedby
+changedorcreated
+changeemail
+changelog
+changeslist
+changing
+characters
+chardiff
+charoff
+chars
+checkfreq
+checkmatrix
+checkstatus
+checkuser
+checkuserlog
+chgrp
+childs
+chillu
+chmoding
+choicesstring
+chrs
+chunk
+chunked
+chunking
+ci
+cidr
+cidrtoobroad
+circ
+citeseer
+ckers
+ckey
+cl
+clamav
+clamscan
+classname
+clcategorie
+cldir
+cldr
+clear
+clearable
+clearyourcache
+clfrom
+clickjacking
+clicktracking
+clientfor
+clientpool
+cllimit
+clober
+closed
+clto
+cm
+cminvalidparammix
+cmmissingparam
+cmnamespace
+cmtitle
+co
+code
+codemap
+codepoint
+codestr
+coi
+colgroup
+collapsable
+collectionsaveascommunitypage
+collectionsaveasuserpage
+colname
+cologneblue
+colonseparator
+colorer
+colspan
+commafy
+commafying
+comment
+commentedit
+commenthidden
+comments
+commitdiff
+commoncssjs
+compactpro
+compare
+compat
+complete
+cond
+condcomment
+condeferrable
+condeferred
+conds
+config
+confirmdeletetext
+confirmed
+confirmedittext
+confirmemail
+confirmrecreate
+conflimit
+confstr
+conkey
+conname
+conrelid
+console
+content
+contentformat
+contenthandler
+contentlanguage
+contentless
+contentmodel
+contenttoobig
+continue
+contribs
+contribslink
+conttitle
+contype
+conv
+converttitles
+convmv
+cookieprefix
+cooltalk
+coord
+coordinates
+copyrightico
+copyrightpage
+copyrightwarning
+copyuploadbaddomain
+copyuploaddisabled
+copyvio
+copywarn
+cors
+couldn
+counter
+countmsg
+country
+course
+courseid
+cpio
+cprefs
+cprotected
+crarr
+crashbug
+create
+createaccount
+createonly
+createpage
+createtalk
+creationsort
+creativecommons
+creditspage
+crocker
+cryptrand
+csize
+csrf
+css
+cssclass
+csslinks
+cssprefs
+cta
+ctime
+ctor
+ctype
+cu
+cul
+curation
+curdiff
+curid
+curlink
+curren
+currentarticle
+currentbrowser
+currentday
+currentdayname
+currentdow
+currenthour
+currentmonth
+currentmonthabbrev
+currentmonthname
+currentmonthnamegen
+currentrev
+currentrevisionlink
+currenttime
+currenttimestamp
+currentversion
+currentweek
+currentyear
+customcssprotected
+customised
+customjsprotected
+cut
+cyber
+cygwin
+cyrl
+d'oh
+dadedad
+dairiki
+danga
+danielc
+darr
+datalen
+dataset
+datasets
+datasize
+datatable
+datatype
+datedefault
+dateformat
+dateheader
+dateopts
+daysago
+dbcnt
+dbconnect
+dberrortext
+dbg
+dbgfm
+dbkey
+dbkeys
+dbks
+dbname
+dbrepllag
+dbsettings
+dbtype
+dbversion
+ddjvu
+de
+deadend
+deadendpagestext
+deadenpages
+dealies
+debughtml
+decline
+declined
+decls
+decr
+decrease
+default
+defaultcontentmodel
+defaultmessagetext
+defaultmissing
+defaultns
+defaultsort
+defaultval
+deferr
+definite
+deflimit
+defs
+deja
+delete
+deleteall
+deletecomment
+deleteconfirm
+deleted
+deletedhistory
+deletedline
+deletedonly
+deletedrevision
+deletedrevs
+deletedtext
+deletedwhileediting
+deleteeducation
+deleteglobalaccount
+deletelogentry
+deleteone
+deleteotherreason
+deletepage
+deletereason
+deletereasonotherlist
+deleterevision
+deleteset
+deletethispage
+deletetoken
+deletion
+deletionlog
+delim
+dellogpage
+dellogpagetext
+delundel
+deprecated
+deps
+depth
+dequeue
+dequeued
+dequeueing
+dequeues
+derivatives
+desc
+descending
+description
+descriptionmsg
+descriptionmsgparams
+descriptionurl
+deserialization
+deserialize
+dest
+detail
+details
+devangari
+devel
+df
+dflt
+dhtml
+diams
+didn
+diff
+diff's
+diffchange
+diffhist
+difflink
+diffonly
+difftext
+diffto
+difftocontent
+difftotext
+dim
+dimensions
+dir
+direction
+directionmark
+directorycreateerror
+directorynotreadableerror
+directoryreadonlyerror
+dirmark
+dirname
+disabled
+disabledtranscode
+disablemail
+disablepp
+disablesuggest
+disclaimerpage
+diskussion
+displayname
+displayrc
+displaysearchoptions
+displaytitle
+displaytitles
+displaywatchlist
+distclean
+distro
+djava
+djob
+djvu
+djvudump
+djvulibre
+djvutoxml
+djvutxt
+djvuxml
+djvuzone
+dkjsagfjsgashfajsh
+dlen
+dltk
+dmoz
+dnsbl
+dnsblacklist
+dnumber
+docm
+docroot
+doctype
+doctypes
+docx
+dodiff
+doesn
+domain
+domainnames
+domainpart
+domainparts
+domas
+doms
+dotdotcount
+dotm
+dotsc
+dotsi
+dotsm
+dotso
+dotwise
+dotx
+doubleclick
+doublequote
+doxygen
+dpos
+dr
+dropdown
+dump
+dumpfm
+dupfunc
+duplicatefiles
+duplicatesoffile
+dvips
+dwfx
+dwhitelist
+e
+eacute
+earth
+eauth
+ecirc
+ecmascript
+edit
+editbutton
+editconflict
+editconflicts
+editcount
+editfont
+editform
+edithelp
+edithelppage
+edithelpurl
+editingcomment
+editinginterface
+editingold
+editingsection
+editinterface
+editintro
+edititis
+editlink
+editmyoptions
+editmyprivateinfo
+editmyusercss
+editmyuserjs
+editmywatchlist
+editnotice
+editnotsupported
+editondblclick
+editor
+editownusertalk
+editpage
+editprotected
+editreasons
+editredlink
+editrestriction
+edits
+editsection
+editsectionhint
+editsectiononrightclick
+editsemiprotected
+editsonly
+editthispage
+edittime
+edittoken
+edittools
+editurl
+editusercss
+editusercssjs
+edituserjs
+edoe
+egrave
+ehcache
+ei
+eich
+eiinvalidparammix
+eimissingparam
+eititle
+el
+elapsedreal
+elemname
+elink
+eltitle
+email
+emailable
+emailaddress
+emailauthenticated
+emailauthentication
+emailauthenticationclass
+emailcapture
+emailconfirm
+emailconfirmed
+emailconfirmlink
+emaildisabled
+emailling
+emaillink
+emailnotauthenticated
+emailtoken
+emailuser
+embeddedin
+empty
+emptyfile
+emptynewsection
+emptypage
+emsenhuber
+emsp
+en
+enabled
+enabledonly
+enableparser
+encapsed
+enctype
+end
+endcode
+endcond
+endian
+endid
+endl
+endsortkey
+endsortkeyprefix
+endtime
+endverbatim
+enhancedchanges
+enlist
+enotif
+enotifminoredits
+enotifrevealaddr
+enotifusertalkpages
+enotifwatchlistpages
+enqueueing
+enroll
+ensp
+entirewatchlist
+entityid
+envcmd
+enwiki
+eocdr
+ep
+eparticle
+epcampus
+epcoordinator
+epinstructor
+eponline
+erevoke
+errno
+error
+errorbox
+errormessage
+errorpagetitle
+errors
+errorstr
+errortext
+errorunknown
+errstr
+es
+escapenoentities
+escapeshellarg
+esearch
+español
+española
+etag
+eu
+euml
+event
+eventid
+ex
+exampleextension
+examples
+excludegroup
+excludepage
+excludeuser
+executables
+exempt
+existingwiki
+exists
+exiv
+expandtab
+expandtemplates
+expandurl
+experiment
+expertise
+expiry
+expiryarray
+explainconflict
+export
+exportnowrap
+exportxml
+expression
+exptime
+extauth
+extendwatchlist
+extensionname
+extensions
+extensiontags
+external
+externaldberror
+externaldiff
+externaledit
+externaleditor
+externallinks
+externalstore
+extet
+extiw
+extlink
+extlinks
+extracts
+extradata
+extrafields
+extraq
+extratags
+exturlusage
+extuser
+exxaammppllee
+fa
+facto
+failback
+failover
+failsafe
+fallbacks
+false
+falsy
+fancysig
+fastcgi
+faux
+favicon
+fclose
+fdef
+fdff
+feature
+featured
+featuredfeed
+feed
+feed's
+feedback
+feedbackid
+feedcontributions
+feedformat
+feeditems
+feedlink
+feedlinks
+feedurl
+feedwatchlist
+feff
+female
+fetchfileerror
+fffe
+ffff
+fffff
+ffffff
+fieldname
+fieldset
+fieldsets
+file
+filearchive
+filebackend
+filecache
+filecopyerror
+filedelete
+filedeleteerror
+fileexists
+fileextensions
+filehidden
+filehist
+filehistory
+fileinfo
+filejournal
+filekey
+filelinks
+filemissing
+filemover
+filemtime
+filename
+filenames
+filenotfound
+filepage
+filepath
+filerenameerror
+filerepo
+filerevert
+filerevisions
+files
+filesize
+filesort
+filesorts
+filesystem's
+filesystems
+filetoc
+filetoobig
+filetype
+filetypemismatch
+fileversions
+filter
+filterbots
+filteriw
+filterlanglinks
+filterlocal
+filterredir
+filterwatched
+findnext
+finfo
+firefox
+firstname
+firstrev
+firsttime
+fishbowl
+fixme
+fixup
+flac
+flag
+flagconfig
+flagged
+flags
+flagtype
+flatlist
+flds
+float
+fmttime
+fname
+fnof
+foldmarker
+foldmethod
+followpolicy
+footericon
+footericons
+footerlinks
+fopen
+for
+forall
+forbidden
+forcearticlepath
+forcebot
+forceditsummary
+forceeditsummary
+forcelinkupdate
+forcetoc
+forcontent
+formaction
+format
+formatmodules
+formatted
+formatters
+formatting
+formedness
+formenctype
+formnovalidate
+formtype
+forupdate
+found
+founder
+fr
+frac
+frameless
+framesets
+frasl
+fread
+freedomdefined
+freeform
+freenode
+frickin
+from
+fromdb
+fromdbmaster
+fromid
+fromrev
+fromrevid
+fromtitle
+frontends
+fseek
+fsockopen
+fsync
+ftp
+fullhistory
+fullpagename
+fullpagenamee
+fulluri
+fullurl
+funcname
+functionhooks
+functionname
+futuresplash
+fvalue
+ga
+gack
+gadgetcategories
+gadgets
+gaid
+gaifilterredir
+gallerybox
+gallerycaption
+gallerytext
+gapdir
+gapfilterredir
+gaplimit
+gapprefix
+garber
+gblblock
+gblock
+gblrights
+gc
+gcldir
+gcllimit
+gender
+general
+generatexml
+generator
+geocoordinate
+geosearch
+gerrit
+getcookie
+getenv
+getheader
+getimagesize
+getlink
+getmac
+getmarkashelpfulitem
+getmypid
+getrusage
+gettimeofday
+gettingstarted
+gettoken
+getuid
+gfdl
+ggp
+ghostscript
+gimpbaseenums
+git
+gitblit
+gitdir
+github
+global
+globalauth
+globalblock
+globalblocks
+globalgroupmembership
+globalgrouppermissions
+globalgroups
+globalsettings
+globalunblock
+globalusage
+globaluserinfo
+globe
+gmail
+gmdate
+goodtitle
+gopher
+graymap
+grayscale
+greant
+greymap
+group
+groupcounts
+groupless
+groupmember
+grouppage
+groupperms
+groupprms
+groups
+growinglink
+grxml
+gs
+gtar
+gu
+guesstimezone
+gui
+guid
+gunblock
+guser
+gwicke
+gzcompress
+gzdeflate
+gzencode
+gzhandler
+gzip
+gzipped
+gzipping
+hacky
+hansm
+hant
+hardblocks
+hardcode
+hardcoding
+harr
+hash
+hashar
+hashcheckfailed
+hashsearchdisabled
+hashtable
+hashtables
+hasmatch
+hasmsg
+hasn
+hasrelated
+headelement
+headerpos
+headhtml
+headitems
+headlinks
+headscripts
+height
+hellip
+help
+helpful
+helppage
+helptext
+helpurl
+helpurls
+helpwindow
+hexdump
+hexstring
+hidden
+hiddencat
+hiddencategories
+hiddencats
+hide
+hideanons
+hidebots
+hidediff
+hideliu
+hideminor
+hidemyself
+hidename
+hidepatrolled
+hideredirects
+hiderevision
+hideuser
+hidpi
+highlimit
+highmax
+highuse
+hilfe
+hiphop
+histfirst
+histlast
+historyempty
+historysubmit
+historywarning
+hit
+hitcount
+hitcounter
+hits
+hmac
+hmtl
+hobby
+homelink
+hookaborted
+horohoe
+hostnames
+hours
+hphp
+hplist
+hpos
+hreflang
+hslots
+htaccess
+htcp
+html
+htmlelements
+htmlescaped
+htmlform
+htmlish
+htmllist
+htmlnest
+htmlpair
+htmlpairs
+htmlsingle
+htmlsingleallowed
+htmlsingleonly
+htmlspecialchars
+htmltidy
+http
+httpaccept
+httpbl
+https
+i
+ia
+iabn
+iacute
+icirc
+icononly
+iconv
+icubench
+icutest
+id
+idanduser
+ids
+ie's
+ieinternals
+ietf
+iexcl
+ifconfig
+iframe
+igbinary
+iges
+ignorewarnings
+igrave
+ii
+iicontinue
+iiprop
+iiurlparam
+iiurlwidth
+iker
+ilfrom
+ilto
+im
+image
+imagegetsize
+imageinfo
+imageinvalidfilename
+imagelinks
+imagemagick
+imagemaxsize
+imagenocrossnamespace
+imagepage
+imagerepository
+imagerotate
+images
+imagesize
+imagetype
+imagetypemismatch
+imageusage
+imagick
+imgmultigo
+imgmultigoto
+imgmultipagenext
+imgmultipageprev
+imgs
+imgserv
+immobilenamespace
+implicitgroups
+import
+importbadinterwiki
+importcantopen
+importlogpage
+importlogpagetext
+importnofile
+importtoken
+importupload
+importuploaderrorpartial
+importuploaderrorsize
+importuploaderrortemp
+in
+iname
+inbound
+includable
+include
+includecomments
+includelocal
+includeonly
+includexmlnamespace
+incr
+increase
+indefinite
+index
+indexfield
+indexpageids
+indexpolicy
+indstr
+infin
+infinite
+infiniteblock
+info
+infoaction
+infobox
+infoline
+infomsg
+ingroups
+injectjs
+inkscape
+inlanguagecode
+inlined
+inno
+inputneeded
+insb
+inser
+instantcommons
+institution
+instructor
+int
+integer
+integeroutofrange
+intentionallyblankpage
+interlang
+interlangs
+interlanguage
+internal
+internaledit
+internalerror
+interwiki
+interwikimap
+interwikipage
+interwikis
+interwikisource
+intnull
+intoken
+intra
+intro
+intrw
+ints
+intval
+invalid
+invalidaction
+invalidations
+invalidcategory
+invaliddomain
+invalidemail
+invalidemailaddress
+invalidexpiry
+invalidip
+invalidlang
+invalidlevel
+invalidmode
+invalidoldimage
+invalidpage
+invalidpageid
+invalidparameter
+invalidparammix
+invalidpath
+invalidrange
+invalidsection
+invalidsessiondata
+invalidsha
+invalidspecialpage
+invalidtags
+invalidtime
+invalidtitle
+invalidtoken
+invaliduser
+invalue
+iorm
+ip
+ipbblocked
+ipblock
+ipblocks
+ipbnounblockself
+ipchain
+ipedits
+iphash
+ipinrange
+ipusers
+iquest
+irc
+ircs
+isam
+isapi
+isbot
+isconnected
+iscur
+isin
+isip
+ismap
+isminor
+ismodsince
+ismulti
+isnew
+ispermalink
+isself
+isset
+istainted
+istalk
+iswatch
+it
+item
+itemid
+itemprop
+itemref
+itemscope
+itemtype
+iter
+iu
+iuinvalidparammix
+iumissingparam
+iuml
+iw
+iwbacklinks
+iwbl
+iwlfrom
+iwlinks
+iwlprefix
+iwltitle
+iwprefix
+iwtitle
+iwurl
+javascript
+javascripttest
+jbartsh
+jconds
+jdk's
+jhtml
+jimbo
+joaat
+jobqueue
+jointype
+jorsch
+journaling
+jpeg
+jpegtran
+jslint
+jsmimetype
+jsminplus
+json
+jsonfm
+jsparse
+jstext
+jsvarurl
+justthis
+kabardian
+kangxi
+kashubia
+kattouw
+kblength
+kernowek
+key
+keygen
+keylen
+keyname
+keynames
+keytype
+khash
+kludgy
+knownnamespace
+konqueror
+kpos
+kuza
+labarga
+labelmsg
+laggedslavemode
+laggy
+lang
+langbacklinks
+langcode
+langcodes
+langconversion
+langlinks
+langprop
+langs
+language
+languagelinks
+languages
+languageshtml
+laquo
+large
+larr
+last
+lastdiff
+lastdot
+lastedit
+lasteditor
+lastedittime
+lastlink
+lastmod
+lastmodifiedat
+lastname
+lastrevid
+lastvisited
+latgalian
+laxström
+lbase
+lbl
+lcattrib
+lceil
+lcomments
+lcount
+lcrocker
+ldquo
+le
+leavemessage
+len
+length
+leprop
+lesque
+lettercase
+level
+lfloor
+lg
+lgname
+lgpassword
+lgpl
+lgtoken
+lguserid
+lgusername
+libcurl
+libel
+libgimpbase
+libketama
+libmemcached
+libre
+libtidy
+ligabue
+lighttpd
+limit
+limitable
+line
+linenumber
+linestart
+link
+linkarr
+linkcolour
+linkprefix
+links
+linkstoimage
+linktbl
+linktext
+linktodiffs
+linktrail
+linktype
+linkupdate
+list
+listable
+listadmins
+listbots
+listfiles
+listgrouprights
+listinfo
+listingcontinuesabbrev
+listoutput
+listresult
+lists
+listtags
+listuser
+listusers
+listusersfrom
+livepreview
+ll
+llfrom
+lllang
+lltitle
+lnumber
+local
+localday
+localdayname
+localdow
+locale
+localhour
+localmonth
+localmonthabbrev
+localmonthname
+localmonthnamegen
+localname
+localonly
+localsettings
+localtimezone
+localweek
+localyear
+lock
+lockandhid
+lockdb
+lockdir
+locked
+lockmanager
+log
+logaction
+logentry
+logevent
+logevents
+logextract
+loggedin
+logid
+login
+loginend
+loginerror
+loginfo
+loginlanguagelinks
+loginlink
+loginprompt
+loginreqlink
+loginreqpagetext
+loginreqtitle
+logins
+loginstart
+logitem
+loglink
+loglist
+logname
+logonly
+logopath
+logourl
+logout
+logpage
+logtext
+logtitle
+logtype
+longpage
+longpageerror
+lookie
+lookups
+loopback
+lossless
+lossy
+lowast
+lowercaps
+lowercased
+lowlimit
+lsaquo
+lsquo
+ltags
+ltitle
+ltrimmed
+lurl
+lysator
+möller
+macr
+magicarr
+magicfile
+magick
+magicword
+magicwordkey
+magicwords
+magnus
+mahaction
+mailerror
+mailmypassword
+mailnologin
+mailparts
+mailpassword
+mailtext
+mailto
+mainmodule
+mainpage
+maintainership
+makesafe
+male
+malloc
+manske
+manualthumb
+mark
+markashelpful
+markaspatrolledlink
+markaspatrolledtext
+markbot
+markbotedits
+markedaspatrollederror
+markpatrolled
+masse
+match
+matchcount
+mathml
+mathtt
+matrixes
+matroska
+max
+maxage
+maxdim
+maxlag
+maxlength
+maxlifetime
+maxqueue
+maxresults
+maxsize
+maxuploadsize
+maxwidth
+mazeland
+mbresponse
+mbstring
+mckey
+mcklmqw
+mcrypt
+mcvalue
+md
+mdash
+medialink
+mediaqueries
+mediatype
+mediawarning
+mediawiki's
+mediawikipage
+megapixels
+member
+memberingroups
+members
+memc
+memcache
+memcached
+memlimit
+memoryp
+memsw
+merge
+mergeable
+merged
+mergehistory
+mergelog
+mergelogpagetext
+message
+messagekey
+messagename
+messagepattern
+messages
+messagetype
+meta
+metacharacters
+metachars
+metadata
+metadataversion
+metafile
+mhash
+mhtml
+micrblogging
+microdata
+microsyntaxes
+microtime
+middot
+migurski
+millitime
+mime
+mimer
+mimesearchdisabled
+mimetype
+min
+minangkabau
+minh
+minification
+minified
+minifier
+minifies
+minify
+minifying
+minimal
+minor
+minordefault
+minoredit
+minoreditletter
+minsize
+misconfigured
+misermode
+mismatch
+misresolved
+missing
+missingcommentheader
+missingcommenttext
+missingdata
+missingparam
+missingpermission
+missingresult
+missingrev
+missingsummary
+missingtext
+missingtitle
+missinguser
+mituzas
+mixedapproval
+mkdir
+mms
+mobile
+mobileformat
+mobileview
+modified
+modifiedarticleprotection
+modify
+modsecurity
+modsince
+module
+moduledisabled
+modulename
+modules
+monitor
+monobook
+monospace
+monospaced
+month
+monthsall
+moodbar
+moredotdotdot
+morelinkstoimage
+morethan
+move
+movedarticleprotection
+moveddeleted
+movedto
+movefile
+movelogpage
+movelogpagetext
+movenologintext
+movenotallowed
+movenotallowedfile
+moveonly
+moveoverredirect
+movepage
+moves
+movestable
+movesubpages
+movetalk
+movethispage
+movetoken
+mozilla
+mpeg
+mpegurl
+mpga
+mplink
+mptitle
+msdn
+msdownload
+msec
+msexcel
+msgid
+msgkey
+msgs
+msgsize
+msgsmall
+msgtext
+msie
+msmetafile
+mssql
+msvideo
+msword
+mtime
+mtype
+mullane
+multi
+multibyte
+multicast
+multipage
+multipageimage
+multipageimagenavbox
+multipart
+multiselect
+multisource
+multithreaded
+multival
+multivalue
+multpages
+munge
+musso
+mustbeloggedin
+mustbeposted
+mutator
+mutators
+muxers
+mwdumper
+mwfile
+mwstore
+mwsuggest
+mwuser
+mxircecho
+mycontributions
+mycontris
+myext
+myextension
+myisam
+mykey
+mypage
+mypreferences
+mysqldump
+mytalk
+mytext
+mywatchlist
+nabla
+name
+namehidden
+nameinlowercase
+names
+namespace
+namespacealiases
+namespacebanner
+namespacee
+namespacenotice
+namespacenumber
+namespaceoptions
+namespaceprotected
+namespaces
+namespacesall
+namespaceselector
+namespacing
+nassert
+nbase
+nbsp
+nbytes
+nchanges
+ncount
+ndash
+nearmatch
+nedersaksies
+nedersaksisch
+needreblock
+needservers
+needtoken
+netcdf
+netware
+never
+new
+newaddr
+newarticletext
+newarticletextanon
+newer
+newerthanrevid
+newgroups
+newheader
+newid
+newimages
+newlen
+newmessagesdifflink
+newmessagesdifflinkplural
+newmessageslink
+newmessageslinkplural
+newname
+newnames
+newnamespace
+newpage
+newpageletter
+newpages
+newpageshidepatrolled
+newparams
+newpass
+newpassword
+newpos
+newquery
+newrevid
+news
+newsectionlink
+newsectionsummary
+newset
+newsfeed
+newsize
+newtalk
+newtalks
+newtalkseparator
+newtext
+newtimestamp
+newtitle
+newuser
+newuserlogpage
+newuserlogpagetext
+newusers
+newwidth
+newwindow
+nextdiff
+nextid
+nextlink
+nextn
+nextpage
+nextredirect
+nextrevision
+nextval
+nfkc
+nginx
+nheight
+niklas
+nlink
+nlinks
+nmime
+nnnn
+nntp
+no
+noanimatethumb
+noanontoken
+noapiwrite
+noarchivename
+noarticle
+noarticletext
+noarticletextanon
+noautopatrol
+noblock
+nobots
+nobucket
+nobuffer
+nochange
+nochanges
+noclasses
+nocode
+nocomment
+nocomplete
+nocontent
+nocontentconvert
+nocontinue
+noconvertlink
+nocookiesfornew
+nocopyright
+nocourseid
+nocreate
+nocreatetext
+nocredits
+nocta
+nodata
+nodatabase
+nodb
+nodefault
+nodeid
+nodeleteablefile
+nodeletion
+nodelist
+nodename
+nodirection
+nodotdot
+noedit
+noeditsection
+noemail
+noemailprefs
+noemailtitle
+noeventid
+noexec
+noexpertise
+noexpression
+nofeed
+nofeedbackid
+nofile
+nofilekey
+nofilename
+nofilter
+noflagtype
+noflip
+nofollow
+nofound
+nogallery
+nogomatch
+nogroup
+noheader
+noheadings
+nohires
+noids
+noimage
+noimageredirect
+noimages
+noinclude
+noindex
+noindexing
+nointerwikipage
+nointerwikiuserrights
+noitem
+nojs
+nolabel
+nolang
+nolicense
+nolimit
+nolink
+nolinkstoimage
+nologging
+nologin
+nomahaction
+nominornewtalk
+nomodule
+non
+noname
+nonamespacenumber
+nonascii
+noncascading
+nondefaults
+none
+nonewsectionlink
+nonexistent
+nonfile
+nonfilenamespace
+nonincludable
+noninfringement
+noninitial
+nonlocal
+nonote
+nonredirects
+nonsense
+nonunicodebrowser
+noobjective
+noofexpiries
+noofprotections
+noop
+nooptions
+nooverride
+nopaction
+nopage
+nopageid
+nopagetext
+nopagetitle
+noparser
+nopathinfo
+nopermission
+noport
+noprefix
+noproject
+noprop
+noprotections
+noquestion
+noradius
+noratelimit
+norating
+norcid
+noread
+noreason
+noredir
+noredirect
+norequest
+norestrictiontypes
+noresult
+noreturnto
+norev
+norevid
+noreviewed
+normalizedtitle
+norole
+norollbackdiff
+noscale
+noschema
+noscript
+nosearch
+nosectiontitle
+nosession
+noshade
+noskipnotif
+noslash
+nosniff
+nosort
+nosortdirection
+nosource
+nospecialpagetext
+nost
+nosubaction
+nosubject
+nosubpage
+nosubpages
+nosuccess
+nosuchaction
+nosuchactiontext
+nosuchdatabase
+nosuchlogid
+nosuchpageid
+nosuchrcid
+nosuchrevid
+nosuchsection
+nosuchsectiontext
+nosuchsectiontitle
+nosuchspecialpage
+nosuchuser
+nosuchusershort
+nosummary
+notacceptable
+notag
+notaglist
+notalk
+notallowed
+notanarticle
+notarget
+notcached
+notdeleted
+note
+notempdir
+notemplate
+notext
+nothumb
+notif
+notificationtimestamp
+notificationtimestamps
+notin
+notitle
+notitleconvert
+notloggedin
+notminor
+noto
+notoc
+notoggle
+notoken
+notransform
+notreviewable
+notrustworthy
+notspecialpage
+notsuspended
+notvisiblerev
+notwatched
+notwikitext
+notype
+noudp
+noupdates
+nouploadmodule
+nouser
+nouserid
+nousername
+nouserspecified
+novalues
+noview
+nowatchlist
+nowellwritten
+nowiki
+nowlocal
+nowserver
+nparsing
+ns
+nsassociated
+nsfrom
+nsinvert
+nslinks
+nslist
+nsname
+nsnum
+nspname
+nsselect
+nstab
+nsub
+ntfs
+ntilde
+ntitle
+nuke
+null
+nullable
+numauthors
+number
+numberheadings
+numberingroup
+numberof
+numberofactiveusers
+numberofadmins
+numberofarticles
+numberofedits
+numberoffiles
+numberofpages
+numberofusers
+numberofviews
+numberofwatchingusers
+numedits
+numentries
+numericized
+numgroups
+numtalkauthors
+numtalkedits
+numwatchers
+nwidth
+oacute
+objectcache
+objective
+ocirc
+ocount
+oelig
+of
+officedocument
+offset
+offsite
+ofname
+ogevents
+ogghandler
+ograve
+old
+oldaddr
+oldcountable
+older
+olderror
+oldfile
+oldgroups
+oldid
+oldimage
+oldlen
+oldnamespace
+oldquery
+oldrev
+oldrevid
+oldreviewedpages
+oldshared
+oldsig
+oldsize
+oldtext
+oldtitle
+oldtitlemsg
+oline
+oname
+onkeyup
+online
+onload
+onlyauthor
+onlyinclude
+onlypst
+onlyquery
+onsubmit
+onthisday
+ontop
+openbasedir
+opendoc
+opendocument
+opensearch
+opensearchdescription
+openssl's
+openxml
+openxmlformats
+oplus
+oppositedm
+optgroup
+optgroups
+optionname
+options
+optionstoken
+optionvalue
+optstack
+or
+ordertype
+ordf
+ordm
+org
+origcategory
+ortime
+oslash
+other
+otherlanguages
+otherlist
+otheroption
+otherreason
+othertime
+otilde
+otimes
+otitle
+ouml
+outparam
+outputter
+outputtype
+outreachwiki
+over
+overridable
+override
+oversight
+oversighted
+oversighter
+overwrite
+overwroteimage
+own
+owner
+paction
+page
+pagecannotexist
+pagecategories
+pagecategorieslink
+pageclass
+pagecontent
+pagecount
+pagecss
+pagedeleted
+pagedlinks
+pageid
+pageids
+pageimages
+pageinfo
+pagelink
+pagelinks
+pagemerge
+pagename
+pagenamee
+pagenames
+pagenum
+pageoffset
+pagepropnames
+pageprops
+pagerestrictions
+pages
+pageselector
+pageset
+pagesetmodule
+pagesincategory
+pagesinnamespace
+pageswithprop
+pagetextmsg
+pagetitle
+pagetools
+pagetriage
+pagetriageaction
+pagetriagelist
+pagetriagestats
+pagetriagetagging
+pagetriagetemplate
+pageurl
+pageview
+param
+parameters
+paraminfo
+paramlist
+paramname
+params
+paren
+parens
+parentid
+parenttree
+parms
+parse
+parsedcomment
+parseddescription
+parsedsummary
+parseerror
+parseinline
+parsemag
+parser
+parsercache
+parserfuncs
+parserfunctions
+parserhook
+parserrender
+parsetree
+parsevalue
+parsoid
+partialupload
+partname
+pass's
+passthru
+password
+passwordfor
+passwordreset
+passwordtooshort
+paste
+pastexpiry
+pathchar
+pathinfo
+pathname
+patrol
+patroldisabled
+patrolled
+patrollink
+patrolmarks
+patroltoken
+pattern
+pcache
+pcntl
+pcomment
+pdbk
+pdf's
+pendingdelta
+perc
+perfcached
+perfcachedts
+perm
+perma
+permalink
+permdenied
+permil
+permissiondenied
+permissionerror
+permissionserrors
+permissionserrorstext
+permissiontype
+perp
+perrow
+pgsql
+photoshop
+php
+php's
+phpfm
+phps
+phpsapi
+phpunit
+phpversion
+phpwiki
+phrasewise
+phtml
+pi
+pipermail
+pixmap
+pkey
+pkuk
+pl
+plain
+plainlink
+plainlinks
+plaintext
+plfrom
+plink
+pllimit
+plns
+plpgsql
+pltitle
+pltitles
+plusminus
+plusmn
+pname
+pnmtojpeg
+pnmtopng
+poolcounter
+popts
+popularpages
+portlet
+portlets
+posplus
+possible
+postcomment
+postgre
+postsep
+potd
+potm
+potx
+poweredby
+poweredbyico
+powersearch
+pp
+ppam
+ppsm
+ppsx
+pptm
+pptx
+precaching
+precompiled
+preferences
+preferencestoken
+prefill
+prefilled
+prefix
+prefixindex
+prefixsearchdisabled
+prefs
+prefsection
+prefsnologin
+prefsnologintext
+prefsubmit
+preload
+preloads
+preloadtitle
+prepending
+prependtext
+preprocess
+preprocessing
+preprocessors
+presentationml
+presep
+prevchar
+prevdiff
+previd
+previewconflict
+previewhead
+previewheader
+previewnote
+previewonfirst
+previewontop
+previewtext
+previousrevision
+prevlink
+prevn
+prexpiry
+prfiltercascade
+prfx
+primary
+printableversion
+printfooter
+printurl
+privacypage
+private
+privs
+prlevel
+probabalistically
+probs
+proc
+processings
+procs
+prodromou
+profession
+profileinfo
+programmatically
+project
+projectpage
+promotion
+prop
+properties
+property
+propname
+props
+prot
+protect
+protectcomment
+protectedarticle
+protectedinterface
+protectednamespace
+protectedpage
+protectedpages
+protectedpagetext
+protectedpagewarning
+protectedtitle
+protectedtitles
+protection
+protections
+protectlevel
+protectlogpage
+protectlogtext
+protectthispage
+protecttoken
+proto
+protocol
+protocols
+protos
+proxied
+proxyblocker
+proxyblockreason
+proxyunbannable
+prtype
+psir
+pst
+psttext
+psychedelix
+pt
+ptext
+ptool
+pubdate
+publicsuffix
+publishfailed
+punycode
+purge
+purged
+qabardjajəbza
+qbar
+qbsettings
+qmoicj
+qp
+quasit
+query
+querycache
+querycachetwo
+querycur
+querydiff
+querykey
+querymodule
+querymodules
+querypage
+querypages
+querystring
+querytype
+question
+queuefull
+quickbar
+quicktemplate
+quicktime
+qunit
+quux
+qvalues
+rabdiff
+radic
+radius
+raggett
+raii
+raimond
+random
+randompage
+randomredirect
+randstr
+range
+rangeblock
+rangeblocks
+rangedisabled
+rangeend
+rangestart
+raquo
+rarr
+rarticle
+rasterizations
+rasterize
+rasterized
+rasterizer
+ratelimited
+ratelimits
+rating
+ratings
+raw
+rawfm
+rawrow
+rbspan
+rc
+rcdays
+rceil
+rcfeed
+rcid
+rcids
+rclimit
+rcoptions
+rcpatroldisabled
+rctitle
+rctoken
+rdev
+rdfa
+rdfrom
+rdftype
+rdquo
+read
+readable
+readapidenied
+readarray
+reader
+readline
+readonlyreason
+readonlytext
+readonlywarning
+readrequired
+readrights
+realaudio
+realllly
+realname
+realpath
+reason
+reasonlist
+reasonstr
+reblock
+rebuildtextindex
+recache
+recached
+recaching
+recalc
+recentchange
+recentchanges
+recentchangescount
+recentchangesdays
+recentchangeslinked
+recentchangestext
+recenteditcount
+recentedits
+recip
+recips
+recreate
+recurse
+recurses
+redir
+redirect
+redirectable
+redirectcreated
+redirectedfrom
+redirections
+redirectpagesub
+redirectparams
+redirects
+redirectsnippet
+redirectstofile
+redirecttitle
+redirectto
+redirid
+redirlinks
+redirs
+redis
+redlink
+redlinks
+redocument
+reedyboy
+reenables
+reencode
+reference
+refetch
+refresheducation
+refreshlinks
+regexes
+regexlike
+region
+registered
+registration
+registrationdate
+reimport
+reindexation
+reindexed
+releasenotes
+relevance
+relevant
+relicense
+relimit
+relkind
+relname
+relnamespace
+remarticle
+remembermypassword
+rememberpassword
+removablegroups
+removal
+remove
+removed
+removedwatchtext
+removetags
+remreviewer
+remstudent
+renameuser
+renaming
+renderable
+renormalized
+repeating
+repl
+replaceafter
+replacer
+replacers
+replag
+replyto
+reporttime
+repos
+request
+requested
+requestid
+requeue
+required
+rerender
+rerendered
+rescnt
+researcher
+resends
+reset
+resetkinds
+resetlink
+resetpass
+resized
+resolutioninfo
+resolutionunit
+resolve
+resolved
+resourceloader
+responsecode
+restore
+restorelink
+restoreprefs
+restricted
+result
+resultset
+resultsperpage
+retrievedfrom
+returnto
+returntoquery
+retval
+reupload
+revalidate
+revalidation
+revdel
+revdelete
+revdelete'd
+revdelundel
+revert
+reverting
+revertpage
+reverts
+revid
+revids
+review
+reviewactivity
+reviewed
+reviewer
+reviewing
+revision
+revisionasof
+revisionday
+revisiondelete
+revisionid
+revisionmonth
+revisions
+revisiontext
+revisiontimestamp
+revisionuser
+revisionyear
+revlink
+revwrongpage
+rfloor
+rgba
+richtext
+rights
+rightscode
+rightsinfo
+rightslog
+rightslogtext
+rked
+rmdir
+rn
+rnlimit
+robotstxt
+roff
+role
+rollback
+rollbacker
+rollbacklink
+rollbacklinkcount
+rollbacktoken
+rootpage
+rootuserpages
+rowcount
+rown
+rownum
+rowsarr
+rowset
+rowspan
+rowspans
+rsaquo
+rsargs
+rsd
+rsdf
+rsquo
+rss
+rsvg
+ruleset
+rulesets
+rusyn
+rv
+rvcontinue
+rvdiffto
+rvlimit
+rvparse
+rvprop
+rvstart
+rvstartid
+rvtoken
+sabino
+safemode
+safesubst
+sais
+sameorigin
+samp
+sansserif
+save
+savearticle
+savedprefs
+saveprefs
+saveusergroups
+sawfish
+sbin
+sbquo
+scaler
+scalers
+scaron
+score
+screensize
+scribunto
+scriptable
+scriptbuilder
+scriptpath
+scrolltop
+sdot
+search
+search's
+searchaction
+searcharticle
+searchboxes
+searchbutton
+searcheverything
+searchform
+searchindex
+searchinfo
+searchlimit
+searchmenu
+searchnamespaces
+searchoptions
+searchresulttext
+searchstring
+searchtitle
+secondary
+section
+sectionanchor
+sectionedit
+sectioneditnotsupported
+sectionformat
+sectionnumber
+sectionprop
+sections
+sectionsnippet
+sectionsnotsupported
+sectiontitle
+securelogin
+seiten
+selectandother
+selectorother
+self
+selflink
+selfmove
+semiglobal
+semiprotected
+semiprotectedpagewarning
+sendemail
+sendmail
+sentences
+serialize
+servedby
+servername
+servertime
+serverurl
+sess
+session
+sessionfailure
+sessionid
+sessionkey
+setchange
+setcookie
+setemail
+setext
+setglobalaccountstatus
+setnewtype
+setnotificationtimestamp
+setopt
+setrename
+setrlimit
+setstatus
+sha
+shar
+sharding
+shared
+shareddescriptionfollows
+sharedfile
+sharedrepo
+sharedupload
+shellscript
+shiftwidth
+shockwave
+short
+shorturl
+shouldn
+shouting
+show
+showalldb
+showbots
+showdeleted
+showdiff
+showdifflinks
+showfilename
+showhiddencats
+showhideminor
+showhooks
+showingresults
+showinitializer
+showjumplinks
+showlinkedto
+showme
+showmeta
+shownavigation
+shownumberswatching
+showpreview
+showredirs
+showreviewed
+showsizediff
+showtoc
+showtoolbar
+showunreviewed
+shtml
+si
+siebrand
+sighhhh
+sigkill
+sigmaf
+signup
+sigsegv
+sigterm
+sii
+siit
+siiurlwidth
+simplesearch
+singlegroup
+singularthey
+sinumberingroup
+siprop
+site
+siteadmin
+sitecsspreview
+sitedir
+siteinfo
+sitejspreview
+sitemap
+sitemaps
+sitematrix
+sitename
+sitenotice
+siteprop
+sitesearch
+sitestats
+sitestatsupdate
+siteuser
+sitewide
+size
+sizediff
+sizediffdisabled
+sizes
+skey
+skinclass
+skinkey
+skinname
+skinnameclass
+skins
+skipcache
+skipcaptcha
+skipnotif
+skname
+sktemplate
+slideshow
+sm
+smaxage
+smil
+smtp
+snippet
+sodipodi
+softtabstop
+solaris
+somecontent
+somefeed
+someuser
+sorani
+sorbs
+sorbsreason
+sort
+sortdirection
+sortkey
+sortkeyprefix
+sortkeys
+source
+soxred
+spam
+spamdetected
+spamprotected
+spamprotectionmatch
+spamprotectiontext
+spamprotectiontitle
+spcontent
+special
+specialpage
+specialpagealiases
+specialpageattributes
+specialpagegroup
+specialpages
+specialprotected
+speedtip
+speedy
+speex
+spekking
+spellcheck
+spezial
+spoofable
+spreadsheetml
+sprefs
+sprintf
+sprotected
+sql's
+sqlite
+sqltotal
+sr
+srchres
+srcset
+srgs
+srprop
+srwhat
+stabilize
+stable
+stablesettings
+stansvik
+start
+startid
+startime
+startsortkey
+startsortkeyprefix
+starttime
+starttimestamp
+stash
+stashfailed
+stashimageinfo
+state
+staticredirect
+statistics
+statline
+status
+statuskey
+stdclass
+stdout
+steward
+stopwords
+storedversion
+strcasecmp
+strcmp
+string
+stripos
+stripslashes
+strlen
+strpos
+strrpos
+strtime
+strtok
+strtolower
+strtotime
+strtr
+struct
+strval
+stubthreshold
+student
+studies
+stuffit
+stxt
+stylename
+stylepath
+styleversion
+subaction
+subarray
+subcat
+subcats
+subclassing
+subcond
+subconds
+subdir
+subdomain
+subdomains
+sube
+subelement
+subelements
+subfunction
+subfunctions
+subimages
+subitem
+subitems
+subject
+subjectid
+subjectids
+subjectpagename
+subjectpagenamee
+subjectspace
+subjectspacee
+subkey
+subkeys
+sublevels
+submatch
+submodule
+submodule's
+submodules
+subnet
+subpage
+subpagename
+subpagenamee
+subpages
+subpagestr
+subparents
+subprocesses
+subsql
+substr
+succ
+success
+successbox
+suckage
+suggest
+suggestion
+suhosin
+suhosin's
+summ
+summary
+summarymissed
+summaryrequired
+supe
+superdomain
+superglobals
+superset
+suppress
+suppressed
+suppressedredirect
+suppressionlog
+suppressionlogtext
+suppressredirect
+suppressrevision
+svgs
+svn
+svnroot
+sybase
+symlinked
+syms
+sysinfo
+sysop
+system
+systemnachrichten
+szdiff
+szlig
+szymon
+t
+tabindex
+tablealign
+tablecell
+tablename
+tablesorter
+tablestack
+tabletags
+tabletype
+tabstop
+tag
+tagfilter
+tagline
+taglist
+tags
+tagset
+tagstack
+tailorings
+talk
+talkable
+talkfrom
+talkid
+talkids
+talkmove
+talkmoveoverredirect
+talkpage
+talkpageheader
+talkpagelinktext
+talkpagename
+talkpagenamee
+talkpagetext
+talkspace
+talkspacee
+talkto
+taraškievica
+tarask
+target
+tb
+tbase
+tbody
+tboverride
+tcount
+tcsh
+tddate
+tdtime
+teardown
+telnet
+temp
+tempdir
+template
+templatelinks
+templatepage
+templates
+templatesused
+templatesusedpreview
+templatesusedsection
+tempname
+tempout
+test
+testclean
+testdata
+testmailuser
+testpass
+testrunner
+testswarm
+testuser
+testutf
+texi
+texinfo
+text
+textarea
+textareas
+textares
+textbox
+textboxsize
+texthidden
+textid
+textlink
+textmissing
+textoverride
+textsf
+textsize
+textvector
+texvc
+tfoot
+tful
+tg
+that'll
+thead
+thelink
+theora
+thetasym
+thinsp
+thisisdeleted
+thispage
+thumbborder
+thumbcaption
+thumberror
+thumbheight
+thumbhtml
+thumbimage
+thumbinner
+thumbmime
+thumbnail
+thumbnailing
+thumbnailsize
+thumbname
+thumbsize
+thumbtext
+thumburl
+thumbwidth
+timeago
+timeanddate
+timecond
+timecorrection
+timeframe
+timekey
+timeoffset
+timep
+timespans
+timestamp
+timestamps
+timestamptz
+timezonelegend
+timezoneregion
+timezoneuseoffset
+timezoneuseserverdefault
+tino
+title
+titleblacklist
+titleconversion
+titleexists
+titlemsg
+titleprefixeddbkey
+titleprotected
+titleprotectedwarning
+titles
+titlesnippet
+titletext
+titlevector
+tl
+tllimit
+tltemplates
+tmpfile
+to
+toclevel
+tocline
+tocnumber
+tocsection
+toctext
+toctitle
+tofragment
+toggle
+toid
+token
+tokenname
+tokens
+tolang
+tongminh
+toobig
+toofewexpiries
+toohigh
+toolarray
+toolbarparent
+toolboxend
+toolboxlink
+toolong
+toolow
+tooltiponly
+tooshort
+top
+toparse
+topbar
+toplevel
+toplinks
+toponly
+torev
+torevid
+tornevall
+torunblocked
+totalcnt
+totalcount
+totalhits
+totalmemory
+totaltime
+totitle
+touched
+tplarg
+transcludable
+transclude
+transcluded
+transcluding
+transclusion
+transclusions
+transcode
+transcodekey
+transcoder
+transcodereset
+transcodestatus
+transcoding
+translatewiki
+transstat
+transwiki
+troff
+true
+truespeed
+trustworthy
+truthy
+tsearch
+tsquery
+tuple
+tweakblogs
+tweakers
+txt
+txtfm
+type
+typemustmatch
+typeof
+typname
+tzstring
+uacute
+uarr
+uc
+ucfirst
+ucirc
+udpprofile
+ufffd
+ugrave
+ui
+uint
+ulimit
+ulink
+ulinks
+uname
+unanchored
+unapprove
+unary
+unattached
+unauthenticate
+unavailable
+unblock
+unblocklogentry
+unblockself
+unblocktoken
+unbuffered
+uncacheable
+uncached
+uncategorized
+unclosable
+uncompress
+undel
+undelete
+undeleted
+undeletion
+undo
+undoafter
+undofailure
+undorev
+unescape
+unescaped
+unfeature
+unfeatured
+unflag
+ungrouped
+unhelpful
+unhidden
+unhide
+unidata
+unindent
+unindexed
+uniq
+unique
+universaleditbutton
+unixtime
+unknown
+unknownerror
+unknownnamespace
+unlock
+unlockdb
+unlogged
+unmakesafe
+unmark
+unmerge
+unmodified
+unoversight
+unoversighted
+unpadded
+unpatrolled
+unpatrolledletter
+unprefixed
+unprintables
+unprotect
+unprotectedarticle
+unprotection
+unprotectthispage
+unredacted
+unrequest
+unrequested
+unresolve
+unresolved
+unreviewed
+unreviewedpages
+unsanitized
+unseed
+unserialization
+unserialize
+unserialized
+unserializing
+unsetting
+unstub
+unstubbed
+unstubbing
+unstubs
+unsupportednamespace
+unsupportedrepo
+untaint
+untracked
+untrustworthiness
+unused
+unusual
+unversioned
+unviewable
+unviewed
+unwatch
+unwatched
+unwatchedpages
+unwatching
+unwatchthispage
+unwikified
+unwritable
+upconvert
+updateddate
+updatedtime
+updatelog
+upgradedoc
+upgrader
+upload
+upload's
+uploaddisabled
+uploadedimage
+uploadjava
+uploadlogpage
+uploadlogpagetext
+uploadnewversion
+uploadnologintext
+uploadpage
+uploadscripted
+uploadsource
+uploadstash
+uploadvirus
+uppercased
+upsih
+urandom
+url
+url's
+urlaction
+urldecode
+urldecoded
+urlencode
+urlencoded
+urlheight
+urlparam
+urlparm
+urlpath
+urlvar
+urlwidth
+ursh
+us
+usedomain
+useemail
+uselang
+uselivepreview
+usemod
+usemsgcache
+usenewrc
+user
+useragent
+useragents
+userblock
+usercan
+usercontribs
+usercreate
+usercreated
+usercss
+usercsspreview
+usercssyoucanpreview
+userdailycontribs
+userdir
+userdoesnotexist
+usereditcount
+useredits
+useremail
+userexists
+usergroup
+usergroups
+userhidden
+userid
+userinfo
+userinvalidcssjstitle
+userips
+userjs
+userjsprev
+userjspreview
+userjsyoucanpreview
+userlang
+userlangattributes
+userlink
+userlinks
+userlogin
+userloginlink
+userloginprompt
+userlogout
+usermaildisabled
+usermessage
+username
+usernameless
+usernames
+userpage
+userpages
+userpageurl
+userprefix
+userrights
+userrightstoken
+users
+usersbody
+userspace
+usertalk
+usertalklink
+usertext
+usertoollinks
+useskin
+useto
+usort
+ustar
+ustoken
+utfnormal
+uuml
+validate
+validationbuilder
+valign
+vals
+value
+values
+vandal
+vandalism
+variables
+variant
+variantarticlepath
+varlang
+varname
+vars
+varval
+vasiliev
+vasilvv
+vbase
+vbscript
+vcount
+vcsize
+venema's
+verbosify
+version
+versioning
+versionlink
+versionlog
+versionrequired
+versionrequiredtext
+very
+vhost
+vi
+vibber
+videoinfo
+view
+viewcount
+viewdeleted
+viewhelppage
+viewmyprivateinfo
+viewmywatchlist
+viewprevnext
+viewsource
+viewsourcelink
+viewsourcetext
+viewvc
+viewyourtext
+visible
+visualeditor
+viurlwidth
+voff
+vofp
+voicexml
+vorbis
+vpad
+vrml
+vslow
+vvcv
+vxml
+wais
+wait
+wakeup
+walltime
+warmup
+warning
+wasdeleted
+wasn
+watch
+watchcreations
+watchdefault
+watchdeletion
+watched
+watchlist
+watchlistdays
+watchlisthideanons
+watchlisthidebots
+watchlisthideliu
+watchlisthideminor
+watchlisthideown
+watchlisthidepatrolled
+watchlistraw
+watchlists
+watchlisttoken
+watchmoves
+watchthis
+watchthispage
+watchtoken
+watchuser
+wb
+wbmp
+wbxml
+wddx
+wddxfm
+weblog
+webm
+webp
+webrequest
+webserver
+weeks
+weierp
+weight
+wellwritten
+werdna
+wget
+what
+whatlinkshere
+whatwg
+wheely
+wheter
+whitelist
+whitelisted
+whitelistedittext
+whitelisting
+whois
+wicke
+width
+widthx
+wierkosz
+wietse
+wiki
+wiki'd
+wiki's
+wikia
+wikiadmin
+wikibase
+wikibits
+wikibooks
+wikidb
+wikifarm
+wikiid
+wikilink
+wikilinks
+wikilove
+wikiloveimagelog
+wikimedia
+wikimediacommons
+wikipage
+wikipedia
+wikipedian
+wikipedias
+wikis
+wikisyntax
+wikitable
+wikitables
+wikitech
+wikitext
+wikiuser
+wiktionary
+wincache
+wininet
+withaccess
+withaction
+witheditsonly
+withlanglinks
+withoutlanglinks
+wl
+wlallrev
+wldir
+wlend
+wlexcludeuser
+wllimit
+wlowner
+wlprop
+wltoken
+wmf's
+wml
+wmlc
+wmls
+wmlsc
+wmlscript
+wmlscriptc
+wordcount
+wordprocessingml
+wordwg
+workalike
+worldwind
+wouldn
+wr
+writeapi
+writeapidenied
+writedisabled
+writerequired
+writerights
+wrongpassword
+x
+xbitmap
+xcache
+xcancel
+xdebug
+xdiff
+xdomain
+xdomains
+xff
+xhtmldefaultnamespace
+xhtmlnamespaces
+xiff
+xlam
+xlsb
+xlsm
+xlsx
+xltm
+xltx
+xml
+xmldoublequote
+xmlfm
+xmlimport
+xmlns
+xmlsafe
+xmlselect
+xor
+xpinstall
+xpixmap
+xpsdocument
+xtended
+xwindowdump
+xxxx
+xxxxx
+yacute
+yaml
+yamlfm
+year
+yes
+youhavenewmessages
+youhavenewmessagesfromusers
+youhavenewmessagesmanyusers
+youhavenewmessagesmulti
+yourdiff
+yourdomainname
+youremail
+yourgender
+yourinternal
+yourlanguage
+yourname
+yournick
+yourpassword
+yourrealname
+yourtext
+yourvariant
+yourwiki
+yuml
+yyyymmddhhiiss
+zhdaemon
+zhengzhu
+zhtable
+zijdel
+zlib
+zoffset
+zwnj
diff --git a/maintenance/doMaintenance.php b/maintenance/doMaintenance.php
index 15b00167..3bd508cb 100644
--- a/maintenance/doMaintenance.php
+++ b/maintenance/doMaintenance.php
@@ -34,7 +34,7 @@ if ( !defined( 'RUN_MAINTENANCE_IF_MAIN' ) ) {
 // Wasn't included from the file scope, halt execution (probably wanted the class)
 // If a class is using commandLine.inc (old school maintenance), they definitely
 // cannot be included and will proceed with execution
-if( !Maintenance::shouldExecute() && $maintClass != 'CommandLineInc' ) {
+if ( !Maintenance::shouldExecute() && $maintClass != 'CommandLineInc' ) {
 	return;
 }
 
@@ -53,27 +53,29 @@ $maintenance->setup();
 // to $maintenance->mSelf. Keep that here for b/c
 $self = $maintenance->getName();
 
-// Detect compiled mode
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-	define( 'MW_COMPILED', 1 );
-} else {
-	# Get the MWInit class
-	require_once( "$IP/includes/Init.php" );
-	require_once( "$IP/includes/AutoLoader.php" );
-}
-
+# Start the autoloader, so that extensions can derive classes from core files
+require_once "$IP/includes/AutoLoader.php";
 # Stub the profiler
-require_once( MWInit::compiledPath( 'includes/profiler/Profiler.php' ) );
+require_once "$IP/includes/profiler/Profiler.php";
+
+# Start the profiler
+$wgProfiler = array();
+if ( file_exists( "$IP/StartProfiler.php" ) ) {
+	require "$IP/StartProfiler.php";
+}
 
 // Some other requires
-if ( !defined( 'MW_COMPILED' ) ) {
-	require_once( "$IP/includes/Defines.php" );
+require_once "$IP/includes/Defines.php";
+require_once "$IP/includes/DefaultSettings.php";
+
+# Load composer's autoloader if present
+if ( is_readable( "$IP/vendor/autoload.php" ) ) {
+	require_once "$IP/vendor/autoload.php";
 }
-require_once( MWInit::compiledPath( 'includes/DefaultSettings.php' ) );
 
 if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
 	# Use a callback function to configure MediaWiki
-	MWFunction::call( MW_CONFIG_CALLBACK );
+	call_user_func( MW_CONFIG_CALLBACK );
 } else {
 	if ( file_exists( "$IP/../wmf-config/wikimedia-mode" ) ) {
 		// Load settings, using wikimedia-mode if needed
@@ -82,25 +84,26 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
 		# Maybe a hook?
 		global $cluster;
 		$cluster = 'pmtpa';
-		require( MWInit::interpretedPath( '../wmf-config/wgConf.php' ) );
+		require "$IP/../wmf-config/wgConf.php";
 	}
 	// Require the configuration (probably LocalSettings.php)
-	require( $maintenance->loadSettings() );
+	require $maintenance->loadSettings();
 }
 
 if ( $maintenance->getDbType() === Maintenance::DB_ADMIN &&
 	is_readable( "$IP/AdminSettings.php" ) )
 {
-	require( MWInit::interpretedPath( 'AdminSettings.php' ) );
+	require "$IP/AdminSettings.php";
 }
 
 if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
-	if ( $wgLocalisationCacheConf['storeClass'] === false && ( $wgLocalisationCacheConf['store'] == 'db' || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) ) )
+	if ( $wgLocalisationCacheConf['storeClass'] === false && ( $wgLocalisationCacheConf['store'] == 'db' || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) ) ) {
 		$wgLocalisationCacheConf['storeClass'] = 'LCStore_Null';
+	}
 }
 $maintenance->finalSetup();
 // Some last includes
-require_once( MWInit::compiledPath( 'includes/Setup.php' ) );
+require_once "$IP/includes/Setup.php";
 
 // Much much faster startup than creating a title object
 $wgTitle = null;
@@ -123,6 +126,6 @@ try {
 	$factory->commitMasterChanges();
 	$factory->shutdown();
 } catch ( MWException $mwe ) {
-	echo( $mwe->getText() );
+	echo $mwe->getText();
 	exit( 1 );
 }
diff --git a/maintenance/dumpBackup.php b/maintenance/dumpBackup.php
index c9546c60..25a777cd 100644
--- a/maintenance/dumpBackup.php
+++ b/maintenance/dumpBackup.php
@@ -27,10 +27,10 @@
 
 $originalDir = getcwd();
 
-$optionsWithArgs = array( 'pagelist', 'start', 'end', 'revstart', 'revend');
+$optionsWithArgs = array( 'pagelist', 'start', 'end', 'revstart', 'revend' );
 
-require_once( __DIR__ . '/commandLine.inc' );
-require_once( __DIR__ . '/backup.inc' );
+require_once __DIR__ . '/commandLine.inc';
+require_once __DIR__ . '/backup.inc';
 
 $dumper = new BackupDumper( $argv );
 
@@ -44,8 +44,8 @@ if ( isset( $options['pagelist'] ) ) {
 	$pages = file( $options['pagelist'] );
 	chdir( $olddir );
 	if ( $pages === false ) {
-		echo( "Unable to open file {$options['pagelist']}\n" );
-		die(1);
+		echo "Unable to open file {$options['pagelist']}\n";
+		die( 1 );
 	}
 	$pages = array_map( 'trim', $pages );
 	$dumper->pages = array_filter( $pages, create_function( '$x', 'return $x !== "";' ) );
@@ -79,7 +79,7 @@ if ( isset( $options['full'] ) ) {
 	$dumper->dump( WikiExporter::STABLE, $textMode );
 } elseif ( isset( $options['logs'] ) ) {
 	$dumper->dump( WikiExporter::LOGS );
-} elseif ( isset($options['revrange'] ) ) {
+} elseif ( isset( $options['revrange'] ) ) {
 	$dumper->dump( WikiExporter::RANGE, $textMode );
 } else {
 	$dumper->progress( <<<ENDS
diff --git a/maintenance/dumpIterator.php b/maintenance/dumpIterator.php
index 870d6321..dd468a9f 100644
--- a/maintenance/dumpIterator.php
+++ b/maintenance/dumpIterator.php
@@ -26,7 +26,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Base class for interating over a dump.
@@ -47,13 +47,13 @@ abstract class DumpIterator extends Maintenance {
 	}
 
 	public function execute() {
-		if (! ( $this->hasOption('file') ^ $this->hasOption('dump') ) ) {
-			$this->error("You must provide a file or dump", true);
+		if ( !( $this->hasOption( 'file' ) ^ $this->hasOption( 'dump' ) ) ) {
+			$this->error( "You must provide a file or dump", true );
 		}
 
 		$this->checkOptions();
 
-		if ( $this->hasOption('file') ) {
+		if ( $this->hasOption( 'file' ) ) {
 			$revision = new WikiRevision;
 
 			$revision->setText( file_get_contents( $this->getOption( 'file' ) ) );
@@ -64,10 +64,10 @@ abstract class DumpIterator extends Maintenance {
 
 		$this->startTime = microtime( true );
 
-		if ( $this->getOption('dump') == '-' ) {
+		if ( $this->getOption( 'dump' ) == '-' ) {
 			$source = new ImportStreamSource( $this->getStdin() );
 		} else {
-			$this->error("Sorry, I don't support dump filenames yet. Use - and provide it on stdin on the meantime.", true);
+			$this->error( "Sorry, I don't support dump filenames yet. Use - and provide it on stdin on the meantime.", true );
 		}
 		$importer = new WikiImporter( $source );
 
@@ -81,9 +81,10 @@ abstract class DumpIterator extends Maintenance {
 		$this->conclusions();
 
 		$delta = microtime( true ) - $this->startTime;
-		$this->error( "Done {$this->count} revisions in " . round($delta, 2) . " seconds " );
-		if ($delta > 0)
-			$this->error( round($this->count / $delta, 2) . " pages/sec" );
+		$this->error( "Done {$this->count} revisions in " . round( $delta, 2 ) . " seconds " );
+		if ( $delta > 0 ) {
+			$this->error( round( $this->count / $delta, 2 ) . " pages/sec" );
+		}
 
 		# Perform the memory_get_peak_usage() when all the other data has been output so there's no damage if it dies.
 		# It is only available since 5.2.0 (since 5.2.1 if you haven't compiled with --enable-memory-limit)
@@ -96,7 +97,7 @@ abstract class DumpIterator extends Maintenance {
 		if ( $this->getDbType() == Maintenance::DB_NONE ) {
 			global $wgUseDatabaseMessages, $wgLocalisationCacheConf, $wgHooks;
 			$wgUseDatabaseMessages = false;
-			$wgLocalisationCacheConf['storeClass'] =  'LCStore_Null';
+			$wgLocalisationCacheConf['storeClass'] = 'LCStore_Null';
 			$wgHooks['InterwikiLoadPrefix'][] = 'DumpIterator::disableInterwikis';
 		}
 	}
@@ -122,9 +123,10 @@ abstract class DumpIterator extends Maintenance {
 
 		$this->count++;
 		if ( isset( $this->from ) ) {
-			if ( $this->from != $title )
+			if ( $this->from != $title ) {
 				return;
-			$this->output( "Skipped " . ($this->count - 1) . " pages\n" );
+			}
+			$this->output( "Skipped " . ( $this->count - 1 ) . " pages\n" );
 
 			$this->count = 1;
 			$this->from = null;
@@ -175,4 +177,4 @@ class SearchDump extends DumpIterator {
 }
 
 $maintClass = "SearchDump";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/dumpLinks.php b/maintenance/dumpLinks.php
index 08aae295..be0b4633 100644
--- a/maintenance/dumpLinks.php
+++ b/maintenance/dumpLinks.php
@@ -30,7 +30,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that generates a plaintext link dump.
@@ -63,16 +63,17 @@ class DumpLinks extends Maintenance {
 					$this->output( "\n" );
 				}
 				$page = Title::makeTitle( $row->page_namespace, $row->page_title );
-				$this->output( $page->getPrefixedUrl() );
+				$this->output( $page->getPrefixedURL() );
 				$lastPage = $row->page_id;
 			}
 			$link = Title::makeTitle( $row->pl_namespace, $row->pl_title );
-			$this->output( " " . $link->getPrefixedUrl() );
+			$this->output( " " . $link->getPrefixedURL() );
 		}
-		if ( isset( $lastPage ) )
+		if ( isset( $lastPage ) ) {
 			$this->output( "\n" );
+		}
 	}
 }
 
 $maintClass = "DumpLinks";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/dumpSisterSites.php b/maintenance/dumpSisterSites.php
index e05e154e..5f0c5b7c 100644
--- a/maintenance/dumpSisterSites.php
+++ b/maintenance/dumpSisterSites.php
@@ -25,7 +25,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that generates a page name dump for SisterSites usage.
@@ -43,14 +43,15 @@ class DumpSisterSites extends Maintenance {
 		$dbr->bufferResults( false );
 		$result = $dbr->select( 'page',
 			array( 'page_namespace', 'page_title' ),
-			array( 'page_namespace'   => NS_MAIN,
-				   'page_is_redirect' => 0,
+			array(
+				'page_namespace' => NS_MAIN,
+				'page_is_redirect' => 0,
 			),
 			__METHOD__ );
 
 		foreach ( $result as $row ) {
 			$title = Title::makeTitle( $row->page_namespace, $row->page_title );
-			$url = $title->getFullUrl();
+			$url = $title->getFullURL();
 			$text = $title->getPrefixedText();
 			$this->output( "$url $text\n" );
 		}
@@ -58,4 +59,4 @@ class DumpSisterSites extends Maintenance {
 }
 
 $maintClass = "DumpSisterSites";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/dumpTextPass.php b/maintenance/dumpTextPass.php
index 2e0d03b1..5d783cb9 100644
--- a/maintenance/dumpTextPass.php
+++ b/maintenance/dumpTextPass.php
@@ -26,8 +26,8 @@
 
 $originalDir = getcwd();
 
-require_once( __DIR__ . '/commandLine.inc' );
-require_once( __DIR__ . '/backupTextPass.inc' );
+require_once __DIR__ . '/commandLine.inc';
+require_once __DIR__ . '/backupTextPass.inc';
 
 
 $dumper = new TextPassDumper( $argv );
diff --git a/maintenance/dumpUploads.php b/maintenance/dumpUploads.php
index 0d0dfcf3..1a9293cb 100644
--- a/maintenance/dumpUploads.php
+++ b/maintenance/dumpUploads.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to dump a the list of files uploaded,
@@ -125,4 +125,4 @@ By default, outputs relative paths against the parent directory of \$wgUploadDir
 }
 
 $maintClass = "UploadDumper";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/edit.php b/maintenance/edit.php
index 93fc3e79..7c24f0fa 100644
--- a/maintenance/edit.php
+++ b/maintenance/edit.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to make a page edit.
@@ -52,6 +52,8 @@ class EditCLI extends Maintenance {
 		$noRC = $this->hasOption( 'no-rc' );
 
 		$wgUser = User::newFromName( $userName );
+		$context = RequestContext::getMain();
+		$context->setUser( $wgUser );
 		if ( !$wgUser ) {
 			$this->error( "Invalid username", true );
 		}
@@ -63,6 +65,7 @@ class EditCLI extends Maintenance {
 		if ( !$wgTitle ) {
 			$this->error( "Invalid title", true );
 		}
+		$context->setTitle( $wgTitle );
 
 		$page = WikiPage::factory( $wgTitle );
 
@@ -92,4 +95,4 @@ class EditCLI extends Maintenance {
 }
 
 $maintClass = "EditCLI";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/eraseArchivedFile.php b/maintenance/eraseArchivedFile.php
new file mode 100644
index 00000000..1c3f0376
--- /dev/null
+++ b/maintenance/eraseArchivedFile.php
@@ -0,0 +1,119 @@
+<?php
+/**
+ * Delete archived (non-current) files from storage
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Aaron Schulz
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to delete archived (non-current) files from storage.
+ *
+ * @TODO: Maybe add some simple logging
+ *
+ * @ingroup Maintenance
+ * @since 1.22
+ */
+class EraseArchivedFile extends Maintenance {
+	public function __construct() {
+		parent::__construct();
+		$this->mDescription = "Erases traces of deleted files.";
+		$this->addOption( 'delete', 'Perform the deletion' );
+		$this->addOption( 'filename', 'File name', false, true );
+		$this->addOption( 'filekey', 'File storage key (with extension) or "*"', true, true );
+	}
+
+	public function execute() {
+		if ( !$this->hasOption( 'delete' ) ) {
+			$this->output( "Use --delete to actually confirm this script\n" );
+		}
+
+		$filekey = $this->getOption( 'filekey' );
+		$filename = $this->getOption( 'filename' );
+
+		if ( $filekey === '*' ) { // all versions by name
+			if ( !strlen( $filename ) ) {
+				$this->error( "Missing --filename parameter.", 1 );
+			}
+			$afile = false;
+		} else { // specified version
+			$dbw = wfGetDB( DB_MASTER );
+			$row = $dbw->selectRow( 'filearchive', '*',
+				array( 'fa_storage_group' => 'deleted', 'fa_storage_key' => $filekey ),
+				__METHOD__ );
+			if ( !$row ) {
+				$this->error( "No deleted file exists with key '$filekey'.", 1 );
+			}
+			$filename = $row->fa_name;
+			$afile = ArchivedFile::newFromRow( $row );
+		}
+
+		$file = wfLocalFile( $filename );
+		if ( $file->exists() ) {
+			$this->error( "File '$filename' is still a public file, use the delete form.\n", 1 );
+		}
+
+		$this->output( "Purging all thumbnails for file '$filename'..." );
+		$file->purgeCache();
+		$file->purgeHistory();
+		$this->output( "done.\n" );
+
+		if ( $afile instanceof ArchivedFile ) {
+			$this->scrubVersion( $afile );
+		} else {
+			$this->output( "Finding deleted versions of file '$filename'...\n" );
+			$this->scrubAllVersions( $filename );
+			$this->output( "Done\n" );
+		}
+	}
+
+	protected function scrubAllVersions( $name ) {
+		$dbw = wfGetDB( DB_MASTER );
+		$res = $dbw->select( 'filearchive', '*',
+			array( 'fa_name' => $name, 'fa_storage_group' => 'deleted' ),
+			__METHOD__ );
+		foreach ( $res as $row ) {
+			$this->scrubVersion( ArchivedFile::newFromRow( $row ) );
+		}
+	}
+
+	protected function scrubVersion( ArchivedFile $archivedFile ) {
+		$key = $archivedFile->getStorageKey();
+		$name = $archivedFile->getName();
+		$ts = $archivedFile->getTimestamp();
+		$repo = RepoGroup::singleton()->getLocalRepo();
+		$path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
+		if ( $this->hasOption( 'delete' ) ) {
+			$status = $repo->getBackend()->delete( array( 'src' => $path ) );
+			if ( $status->isOK() ) {
+				$this->output( "Deleted version '$key' ($ts) of file '$name'\n" );
+			} else {
+				$this->output( "Failed to delete version '$key' ($ts) of file '$name'\n" );
+				$this->output( print_r( $status->getErrorsArray(), true ) );
+			}
+		} else {
+			$this->output( "Would delete version '{$key}' ({$ts}) of file '$name'\n" );
+		}
+	}
+}
+
+$maintClass = "EraseArchivedFile";
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/eval.php b/maintenance/eval.php
index 95f46ffa..abedc61a 100644
--- a/maintenance/eval.php
+++ b/maintenance/eval.php
@@ -34,7 +34,7 @@
 $optionsWithArgs = array( 'd' );
 
 /** */
-require_once( __DIR__ . "/commandLine.inc" );
+require_once __DIR__ . "/commandLine.inc";
 
 if ( isset( $options['d'] ) ) {
 	$d = $options['d'];
diff --git a/maintenance/fetchText.php b/maintenance/fetchText.php
index a705bcca..05470d30 100644
--- a/maintenance/fetchText.php
+++ b/maintenance/fetchText.php
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script used to fetch page text in a subprocess.
@@ -45,7 +45,7 @@ class FetchText extends Maintenance {
 	 *
 	 * note that that the text string itself is *not* followed by newline
 	 */
-	 public function execute() {
+	public function execute() {
 		$db = wfGetDB( DB_SLAVE );
 		$stdin = $this->getStdin();
 		while ( !feof( $stdin ) ) {
@@ -56,12 +56,12 @@ class FetchText extends Maintenance {
 			}
 			$textId = intval( $line );
 			$text = $this->doGetText( $db, $textId );
-			if ($text === false) {
+			if ( $text === false ) {
 				# actual error, not zero-length text
 				$textLen = "-1";
 			}
 			else {
-				$textLen = strlen($text);
+				$textLen = strlen( $text );
 			}
 			$this->output( $textId . "\n" . $textLen . "\n" . $text );
 		}
@@ -88,4 +88,4 @@ class FetchText extends Maintenance {
 }
 
 $maintClass = "FetchText";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fileOpPerfTest.php b/maintenance/fileOpPerfTest.php
index 008d7686..9dba8183 100644
--- a/maintenance/fileOpPerfTest.php
+++ b/maintenance/fileOpPerfTest.php
@@ -21,10 +21,8 @@
  * @ingroup Maintenance
  */
 
-$wgProfiler = array( 'class' => 'ProfilerSimpleText' );
 error_reporting( E_ALL );
-
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to test fileop performance.
@@ -44,6 +42,8 @@ class TestFileOpPerformance extends Maintenance {
 	}
 
 	public function execute() {
+		Profiler::setInstance( new ProfilerSimpleText( array() ) ); // clear
+
 		$backend = FileBackendGroup::singleton()->get( $this->getOption( 'b1' ) );
 		$this->doPerfTest( $backend );
 
@@ -52,10 +52,8 @@ class TestFileOpPerformance extends Maintenance {
 			$this->doPerfTest( $backend );
 		}
 
-		$profiler = Profiler::instance();
-		$profiler->setTemplated( true );
-
-		//NOTE: as of MW1.21, $profiler->logData() is called implicitly by doMaintenance.php.
+		Profiler::instance()->setTemplated( true );
+		// NOTE: as of MW1.21, $profiler->logData() is called implicitly by doMaintenance.php.
 	}
 
 	protected function doPerfTest( FileBackend $backend ) {
@@ -79,7 +77,7 @@ class TestFileOpPerformance extends Maintenance {
 				$this->output( "Using '$dirname/$file' in operations.\n" );
 				$dst = $baseDir . '/' . wfBaseName( $file );
 				$ops1[] = array( 'op' => 'store',
-					'src' => "$dirname/$file", 'dst' => $dst, 'overwrite' => 1);
+					'src' => "$dirname/$file", 'dst' => $dst, 'overwrite' => 1 );
 				$ops2[] = array( 'op' => 'copy',
 					'src' => "$dst", 'dst' => "$dst-1", 'overwrite' => 1 );
 				$ops3[] = array( 'op' => 'move',
@@ -106,7 +104,7 @@ class TestFileOpPerformance extends Maintenance {
 		$e = ( microtime( true ) - $start ) * 1000;
 		if ( $status->getErrorsArray() ) {
 			print_r( $status->getErrorsArray() );
-			exit(0);
+			exit( 0 );
 		}
 		$this->output( $backend->getName() . ": Stored " . count( $ops1 ) . " files in $e ms.\n" );
 
@@ -115,7 +113,7 @@ class TestFileOpPerformance extends Maintenance {
 		$e = ( microtime( true ) - $start ) * 1000;
 		if ( $status->getErrorsArray() ) {
 			print_r( $status->getErrorsArray() );
-			exit(0);
+			exit( 0 );
 		}
 		$this->output( $backend->getName() . ": Copied " . count( $ops2 ) . " files in $e ms.\n" );
 
@@ -124,7 +122,7 @@ class TestFileOpPerformance extends Maintenance {
 		$e = ( microtime( true ) - $start ) * 1000;
 		if ( $status->getErrorsArray() ) {
 			print_r( $status->getErrorsArray() );
-			exit(0);
+			exit( 0 );
 		}
 		$this->output( $backend->getName() . ": Moved " . count( $ops3 ) . " files in $e ms.\n" );
 
@@ -133,7 +131,7 @@ class TestFileOpPerformance extends Maintenance {
 		$e = ( microtime( true ) - $start ) * 1000;
 		if ( $status->getErrorsArray() ) {
 			print_r( $status->getErrorsArray() );
-			exit(0);
+			exit( 0 );
 		}
 		$this->output( $backend->getName() . ": Deleted " . count( $ops4 ) . " files in $e ms.\n" );
 
@@ -142,11 +140,11 @@ class TestFileOpPerformance extends Maintenance {
 		$e = ( microtime( true ) - $start ) * 1000;
 		if ( $status->getErrorsArray() ) {
 			print_r( $status->getErrorsArray() );
-			exit(0);
+			exit( 0 );
 		}
 		$this->output( $backend->getName() . ": Deleted " . count( $ops5 ) . " files in $e ms.\n" );
 	}
 }
 
 $maintClass = "TestFileOpPerformance";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/findHooks.php b/maintenance/findHooks.php
index 778da5a1..373170ff 100644
--- a/maintenance/findHooks.php
+++ b/maintenance/findHooks.php
@@ -34,7 +34,7 @@
  * @author Antoine Musso <hashar at free dot fr>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that compares documented and actually present mismatches.
@@ -248,4 +248,4 @@ class FindHooks extends Maintenance {
 }
 
 $maintClass = 'FindHooks';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fixDoubleRedirects.php b/maintenance/fixDoubleRedirects.php
index 19b97777..523be7ef 100644
--- a/maintenance/fixDoubleRedirects.php
+++ b/maintenance/fixDoubleRedirects.php
@@ -25,7 +25,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that fixes double redirects.
@@ -134,4 +134,4 @@ class FixDoubleRedirects extends Maintenance {
 }
 
 $maintClass = "FixDoubleRedirects";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fixExtLinksProtocolRelative.php b/maintenance/fixExtLinksProtocolRelative.php
index 2403ec68..55fbd9a3 100644
--- a/maintenance/fixExtLinksProtocolRelative.php
+++ b/maintenance/fixExtLinksProtocolRelative.php
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that fixes any entriy for protocol-relative URLs
@@ -85,4 +85,4 @@ class FixExtLinksProtocolRelative extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "FixExtLinksProtocolRelative";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fixSlaveDesync.php b/maintenance/fixSlaveDesync.php
index ab7603de..e4e557fe 100644
--- a/maintenance/fixSlaveDesync.php
+++ b/maintenance/fixSlaveDesync.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that fixes erroneous page_latest values
@@ -106,10 +106,10 @@ class FixSlaveDesync extends Maintenance {
 			$db = wfGetDB( $i );
 			/*
 			if ( !$db->masterPosWait( $masterFile, $masterPos, 10 ) ) {
-				   $this->output( "Slave is too lagged, aborting\n" );
-				   $dbw->commit( __METHOD__ );
-				   sleep(10);
-				   return;
+				$this->output( "Slave is too lagged, aborting\n" );
+				$dbw->commit( __METHOD__ );
+				sleep(10);
+				return;
 			}*/
 			$latest = $db->selectField( 'page', 'page_latest', array( 'page_id' => $pageID ), __METHOD__ );
 			$max = $db->selectField( 'revision', 'MAX(rev_id)', false, __METHOD__ );
@@ -213,4 +213,4 @@ class FixSlaveDesync extends Maintenance {
 }
 
 $maintClass = "FixSlaveDesync";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fixTimestamps.php b/maintenance/fixTimestamps.php
index 84d08d39..b0609d17 100644
--- a/maintenance/fixTimestamps.php
+++ b/maintenance/fixTimestamps.php
@@ -25,7 +25,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that fixes timestamp corruption caused by one or
@@ -125,4 +125,4 @@ class FixTimestamps extends Maintenance {
 }
 
 $maintClass = "FixTimestamps";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fixUserRegistration.php b/maintenance/fixUserRegistration.php
index 91d42a5d..097936c9 100644
--- a/maintenance/fixUserRegistration.php
+++ b/maintenance/fixUserRegistration.php
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that fixes the user_registration field.
@@ -58,4 +58,4 @@ class FixUserRegistration extends Maintenance {
 }
 
 $maintClass = "FixUserRegistration";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/formatInstallDoc.php b/maintenance/formatInstallDoc.php
index 691ed80c..e2b3c419 100644
--- a/maintenance/formatInstallDoc.php
+++ b/maintenance/formatInstallDoc.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ .'/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that formats RELEASE-NOTE file to wiki text or HTML markup.
@@ -75,4 +75,4 @@ class MaintenanceFormatInstallDoc extends Maintenance {
 }
 
 $maintClass = 'MaintenanceFormatInstallDoc';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fuzz-tester.php b/maintenance/fuzz-tester.php
index 4c039807..548bb2f2 100644
--- a/maintenance/fuzz-tester.php
+++ b/maintenance/fuzz-tester.php
@@ -118,7 +118,6 @@ Wiki configuration for testing:
   // Enable weird and wonderful options:
 							  // Increase default error reporting level.
   error_reporting (E_ALL);    // At a later date could be increased to E_ALL | E_STRICT
-  $wgBlockOpenProxies = true; // Some block pages require this to be true in order to test.
   $wgEnableUploads = true;    // enable uploads.
   $wgDBerrorLog = "/root/mediawiki-db-error-log.txt";  // log DB errors, replace with suitable path.
   $wgShowSQLErrors = true;    // Show SQL errors (instead of saying the query was hidden).
@@ -127,17 +126,17 @@ Wiki configuration for testing:
   $wgEnableWriteAPI = true;   // enable API.
 
   // Install & enable Parser Hook extensions to increase code coverage. E.g.:
-  require_once("extensions/ParserFunctions/ParserFunctions.php");
-  require_once("extensions/Cite/Cite.php");
-  require_once("extensions/inputbox/inputbox.php");
-  require_once("extensions/Sort/Sort.php");
-  require_once("extensions/wikihiero/wikihiero.php");
-  require_once("extensions/CharInsert/CharInsert.php");
-  require_once("extensions/FixedImage/FixedImage.php");
+  require_once "extensions/ParserFunctions/ParserFunctions.php";
+  require_once "extensions/Cite/Cite.php";
+  require_once "extensions/inputbox/inputbox.php";
+  require_once "extensions/Sort/Sort.php";
+  require_once "extensions/wikihiero/wikihiero.php";
+  require_once "extensions/CharInsert/CharInsert.php";
+  require_once "extensions/FixedImage/FixedImage.php";
 
   // Install & enable Special Page extensions to increase code coverage. E.g.:
-  require_once("extensions/Cite/SpecialCite.php");
-  require_once("extensions/Renameuser/SpecialRenameuser.php");
+  require_once "extensions/Cite/SpecialCite.php";
+  require_once "extensions/Renameuser/SpecialRenameuser.php";
   // --------- End ---------
 
   If you want to try E_STRICT error logging, add this to the above:
@@ -181,7 +180,7 @@ TODO:
 // ///////////////////////// COMMAND LINE HELP ////////////////////////////////////
 
 // This is a command line script, load MediaWiki env (gives command line options);
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
 
 // if the user asked for an explanation of command line options.
 if ( isset( $options["help"] ) ) {
@@ -657,6 +656,7 @@ class wikiFuzz {
 			"}}",
 			"{{INT:googlesearch|",
 			"}}",
+                        "{{ROOTPAGENAME}}",
 			"{{BASEPAGENAME}}",
 			"{{CONTENTLANGUAGE}}",
 			"{{PAGESINNAMESPACE:}}",
@@ -1482,24 +1482,6 @@ class watchlistTest extends pageTest {
 	}
 }
 
-
-/**
- ** a page test for "Special:Blockme"
- */
-class specialBlockmeTest extends pageTest {
-	function __construct() {
-		$this->pagePath = "index.php?title=Special:Blockme";
-
-		$this->params = array ();
-
-		// sometimes we specify "ip", and sometimes we don't.
-		if ( wikiFuzz::randnum( 1 ) == 0 ) {
-			$this->params["ip"] = wikiFuzz::chooseInput( array( "10.12.41.213", wikiFuzz::randnum( 8134, -10 ), wikiFuzz::makeFuzz( 2 ) ) );
-		}
-	}
-}
-
-
 /**
  ** a page test for "Special:Movepage"
  */
@@ -1972,7 +1954,7 @@ class specialChemicalsourcesTest extends pageTest {
  ** returns the help screen - so currently a lot of the tests aren't actually doing much
  ** because something wasn't right in the query.
  **
- ** @todo: Incomplete / unfinished; Runs too fast (suggests not much testing going on).
+ ** @todo Incomplete / unfinished; Runs too fast (suggests not much testing going on).
  */
 class api extends pageTest {
 
@@ -2160,7 +2142,7 @@ class GeSHi_Test extends pageTest {
 /**
  ** selects a page test to run.
  * @param $count
- * @return \api|\confirmEmail|\contributionsTest|\editPageTest|\imagelistTest|\imagepageTest|\ipblocklistTest|\listusersTest|\mimeSearchTest|\newImagesTest|\pageDeletion|\pageHistoryTest|\pageProtectionForm|\prefixindexTest|\profileInfo|\recentchangesTest|\redirectTest|\searchTest|\specialAllmessagesTest|\specialAllpagesTest|\specialBlockip|\specialBlockmeTest|\specialBooksourcesTest|\specialCategoryTree|\specialChemicalsourcesTest|\specialCitePageTest|\specialExportTest|\specialFilepathPageTest|\specialImportPageTest|\specialLinksearch|\specialLockdbPageTest|\specialLogTest|\specialMovePage|\specialNewpagesPageTest|\specialRenameuserPageTest|\specialRevisionDeletePageTest|\specialUndeletePageTest|\specialUnlockdbPageTest|\specialUserrights|\successfulUserLoginTest|\thumbTest|\userLoginTest|\viewPageTest|\watchlistTest
+ * @return \api|\confirmEmail|\contributionsTest|\editPageTest|\imagelistTest|\imagepageTest|\ipblocklistTest|\listusersTest|\mimeSearchTest|\newImagesTest|\pageDeletion|\pageHistoryTest|\pageProtectionForm|\prefixindexTest|\profileInfo|\recentchangesTest|\redirectTest|\searchTest|\specialAllmessagesTest|\specialAllpagesTest|\specialBlockip|\specialBooksourcesTest|\specialCategoryTree|\specialChemicalsourcesTest|\specialCitePageTest|\specialExportTest|\specialFilepathPageTest|\specialImportPageTest|\specialLinksearch|\specialLockdbPageTest|\specialLogTest|\specialMovePage|\specialNewpagesPageTest|\specialRenameuserPageTest|\specialRevisionDeletePageTest|\specialUndeletePageTest|\specialUnlockdbPageTest|\specialUserrights|\successfulUserLoginTest|\thumbTest|\userLoginTest|\viewPageTest|\watchlistTest
  */
 function selectPageTest( $count ) {
 
@@ -2196,7 +2178,6 @@ function selectPageTest( $count ) {
 		case 20: return new redirectTest();
 		case 21: return new confirmEmail();
 		case 22: return new watchlistTest();
-		case 23: return new specialBlockmeTest();
 		case 24: return new specialUndeletePageTest();
 		case 25: return new specialMovePage();
 		case 26: return new specialUnlockdbPageTest();
@@ -2542,7 +2523,7 @@ function runWikiTest( pageTest $test, &$testname, $can_overwrite = false ) {
 		if ( !$valid ) print "\nW3C web validation failed - view details with: html2text " . DIRECTORY . "/" . $testname . ".validator_output.html";
 	}
 
-	// Get tidy to check the page, unless we already know it produces non-XHTML output.
+	// Get tidy to check the page, unless we already know it produces non-(X)HTML output.
 	if ( $test->tidyValidate() ) {
 		$valid = tidyCheckFile( $testname . HTML_FILE ) && $valid;
 	}
diff --git a/maintenance/generateSitemap.php b/maintenance/generateSitemap.php
index adea97ea..0b21a1fe 100644
--- a/maintenance/generateSitemap.php
+++ b/maintenance/generateSitemap.php
@@ -26,7 +26,7 @@
  * @see http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that generates a sitemap for the site.
@@ -167,7 +167,7 @@ class GenerateSitemap extends Maintenance {
 		}
 		$this->identifier = $this->getOption( 'identifier', wfWikiID() );
 		$this->compress = $this->getOption( 'compress', 'yes' ) !== 'no';
-		$this->skipRedirects = $this->getOption( 'skip-redirects', false ) !== false ;
+		$this->skipRedirects = $this->getOption( 'skip-redirects', false ) !== false;
 		$this->dbr = wfGetDB( DB_SLAVE );
 		$this->generateNamespaces();
 		$this->timestamp = wfTimestamp( TS_ISO_8601, wfTimestampNow() );
@@ -231,7 +231,7 @@ class GenerateSitemap extends Maintenance {
 			wfMkdirParents( $fspath, null, __METHOD__ ) or die( "Can not create directory $fspath.\n" );
 		}
 
-		return realpath( $fspath ) . DIRECTORY_SEPARATOR ;
+		return realpath( $fspath ) . DIRECTORY_SEPARATOR;
 	}
 
 	/**
@@ -255,8 +255,9 @@ class GenerateSitemap extends Maintenance {
 			)
 		);
 
-		foreach ( $res as $row )
+		foreach ( $res as $row ) {
 			$this->namespaces[] = $row->page_namespace;
+		}
 	}
 
 	/**
@@ -319,7 +320,7 @@ class GenerateSitemap extends Maintenance {
 			$this->output( "$namespace ($fns)\n" );
 			$skippedRedirects = 0;  // Number of redirects skipped for that namespace
 			foreach ( $res as $row ) {
-				if ($this->skipRedirects && $row->page_is_redirect ) {
+				if ( $this->skipRedirects && $row->page_is_redirect ) {
 					$skippedRedirects++;
 					continue;
 				}
@@ -346,7 +347,9 @@ class GenerateSitemap extends Maintenance {
 				if ( $wgContLang->hasVariants() ) {
 					$variants = $wgContLang->getVariants();
 					foreach ( $variants as $vCode ) {
-						if ( $vCode == $wgContLang->getCode() ) continue; // we don't want default variant
+						if ( $vCode == $wgContLang->getCode() ) {
+							continue; // we don't want default variant
+						}
 						$entry = $this->fileEntry( $title->getCanonicalURL( '', $vCode ), $date, $this->priority( $namespace ) );
 						$length += strlen( $entry );
 						$this->write( $this->file, $entry );
@@ -354,7 +357,7 @@ class GenerateSitemap extends Maintenance {
 				}
 			}
 
-			if ($this->skipRedirects && $skippedRedirects > 0) {
+			if ( $this->skipRedirects && $skippedRedirects > 0 ) {
 				$this->output( "  skipped $skippedRedirects redirect(s)\n" );
 			}
 
@@ -374,8 +377,8 @@ class GenerateSitemap extends Maintenance {
 	 */
 	function open( $file, $flags ) {
 		$resource = $this->compress ? gzopen( $file, $flags ) : fopen( $file, $flags );
-		if( $resource === false ) {
-			wfDebugDieBacktrace( __METHOD__ . " error opening file $file with flags $flags. Check permissions?" );
+		if ( $resource === false ) {
+			throw new MWException( __METHOD__ . " error opening file $file with flags $flags. Check permissions?" );
 		}
 		return $resource;
 	}
@@ -384,23 +387,25 @@ class GenerateSitemap extends Maintenance {
 	 * gzwrite() / fwrite() wrapper
 	 */
 	function write( &$handle, $str ) {
-		if( $handle === true || $handle === false ) {
-			wfDebugDieBacktrace( __METHOD__ . " was passed a boolean as a file handle.\n" );
+		if ( $handle === true || $handle === false ) {
+			throw new MWException( __METHOD__ . " was passed a boolean as a file handle.\n" );
 		}
-		if ( $this->compress )
+		if ( $this->compress ) {
 			gzwrite( $handle, $str );
-		else
+		} else {
 			fwrite( $handle, $str );
+		}
 	}
 
 	/**
 	 * gzclose() / fclose() wrapper
 	 */
 	function close( &$handle ) {
-		if ( $this->compress )
+		if ( $this->compress ) {
 			gzclose( $handle );
-		else
+		} else {
 			fclose( $handle );
+		}
 	}
 
 	/**
@@ -485,7 +490,8 @@ class GenerateSitemap extends Maintenance {
 	function fileEntry( $url, $date, $priority ) {
 		return
 			"\t<url>\n" .
-			"\t\t<loc>$url</loc>\n" .
+			// bug 34666: $url may contain bad characters such as ampersands.
+			"\t\t<loc>" . htmlspecialchars( $url ) . "</loc>\n" .
 			"\t\t<lastmod>$date</lastmod>\n" .
 			"\t\t<priority>$priority</priority>\n" .
 			"\t</url>\n";
@@ -516,4 +522,4 @@ class GenerateSitemap extends Maintenance {
 }
 
 $maintClass = "GenerateSitemap";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/getConfiguration.php b/maintenance/getConfiguration.php
index 83b5b029..5a5eb587 100644
--- a/maintenance/getConfiguration.php
+++ b/maintenance/getConfiguration.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Print serialized output of MediaWiki config vars
+ * Print serialized output of MediaWiki config vars.
  *
  * 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
@@ -20,10 +20,10 @@
  * @file
  * @ingroup Maintenance
  * @author Tim Starling
- * @author Antoine Musso
+ * @author Antoine Musso <hashar@free.fr>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Print serialized output of MediaWiki config vars
@@ -31,33 +31,123 @@ require_once( __DIR__ . '/Maintenance.php' );
  * @ingroup Maintenance
  */
 class GetConfiguration extends Maintenance {
+
+	protected $regex = null;
+
+	protected $settings_list = array();
+
+	/**
+	 * List of format output internally supported.
+	 * Each item MUST be lower case.
+	 */
+	protected static $outFormats = array(
+		'json',
+		'php',
+		'serialize',
+		'vardump',
+	);
+
 	public function __construct() {
 		parent::__construct();
 		$this->mDescription = "Get serialized MediaWiki site configuration";
-		$this->addOption( 'settings', 'Space-separated list of wg* variables', true, true );
-		$this->addOption( 'format', 'PHP or JSON', true, true );
-		$this->addOption( 'wiki', 'Wiki ID', true, true );
+		$this->addOption( 'regex', 'regex to filter variables with', false, true );
+		$this->addOption( 'iregex', 'same as --regex but case insensitive', false, true );
+		$this->addOption( 'settings', 'Space-separated list of wg* variables', false, true );
+		$this->addOption( 'format', join( ', ', self::$outFormats ), false, true );
+	}
+
+	protected function validateParamsAndArgs() {
+		$error_out = false;
+
+		# Get the format and make sure it is set to a valid default value
+		$format = strtolower( $this->getOption( 'format', 'PHP' ) );
+
+		$validFormat = in_array( $format, self::$outFormats );
+		if ( ! $validFormat ) {
+			$this->error( "--format set to an unrecognized format", 0 );
+			$error_out = true;
+		}
+
+		if ( $this->getOption( 'regex' ) && $this->getOption( 'iregex' ) ) {
+			$this->error( "Can only use either --regex or --iregex" );
+			$error_out = true;
+		}
+
+		parent::validateParamsAndArgs();
+
+		if ( $error_out ) {
+			# Force help and quit
+			$this->maybeHelp( true );
+		}
+	}
+
+	/**
+	 * finalSetup() since we need MWException
+	 */
+	public function finalSetup() {
+		parent::finalSetup();
+
+		$this->regex = $this->getOption( 'regex' ) ? : $this->getOption( 'iregex' );
+		if ( $this->regex ) {
+			$this->regex = '/' . $this->regex . '/';
+			if ( $this->hasOption( 'iregex' ) ) {
+				$this->regex .= 'i';  # case insensitive regex
+			}
+		}
+
+		if ( $this->hasOption( 'settings' ) ) {
+			$this->settings_list = explode( ' ', $this->getOption( 'settings' ) );
+			# Values validation
+			foreach ( $this->settings_list as $name ) {
+				if ( !preg_match( '/^wg[A-Z]/', $name ) ) {
+					throw new MWException( "Variable '$name' does start with 'wg'." );
+				} elseif ( !isset( $GLOBALS[$name] ) ) {
+					throw new MWException( "Variable '$name' is not set." );
+				} elseif ( !$this->isAllowedVariable( $GLOBALS[$name] ) ) {
+					throw new MWException( "Variable '$name' includes non-array, non-scalar, items." );
+				}
+			}
+		}
 	}
 
 	public function execute() {
+		// Settings we will display
 		$res = array();
-		foreach ( explode( ' ', $this->getOption( 'settings' ) ) as $name ) {
-			if ( !preg_match( '/^wg[A-Z]/', $name ) ) {
-				throw new MWException( "Variable '$name' does start with 'wg'." );
-			} elseif ( !isset( $GLOBALS[$name] ) ) {
-				throw new MWException( "Variable '$name' is not set." );
-			} elseif ( !$this->isAllowedVariable( $GLOBALS[$name] ) ) {
-				throw new MWException( "Variable '$name' includes non-array, non-scalar, items." );
+
+		# Sane default: dump any wg / wmg variable
+		if ( ! $this->regex && ! $this->getOption( 'settings' ) ) {
+			$this->regex = '/^wm?g/';
+		}
+
+		# Filter out globals based on the regex
+		if ( $this->regex ) {
+			$res = array();
+			foreach ( $GLOBALS as $name => $value ) {
+				if ( preg_match( $this->regex, $name ) ) {
+					$res[$name] = $value;
+				}
 			}
-			$res[$name] = $GLOBALS[$name];
 		}
 
+		# Explicitly dumps a list of provided global names
+		if ( $this->settings_list ) {
+			foreach ( $this->settings_list as $name ) {
+				$res[$name] = $GLOBALS[$name];
+			}
+		}
+
+		ksort( $res );
+
 		$out = null;
-		switch( $this->getOption( 'format' ) ) {
-			case 'PHP':
+		switch ( strtolower( $this->getOption( 'format' ) ) ) {
+			case 'serialize':
+			case 'php':
 				$out = serialize( $res );
 				break;
-			case 'JSON':
+			case 'vardump':
+				$out = $this->formatVarDump( $res );
+				break;
+			case 'json':
 				$out = FormatJson::encode( $res );
 				break;
 			default:
@@ -67,7 +157,22 @@ class GetConfiguration extends Maintenance {
 			throw new MWException( "Failed to serialize the requested settings." );
 		}
 
-		$this->output( $out . "\n" );
+		if ( $out ) {
+			$this->output( $out . "\n" );
+		}
+	}
+
+	protected function formatVarDump( $res ) {
+		$ret = '';
+		foreach ( $res as $key => $value ) {
+			ob_start();  # intercept var_dump() output
+			print "\${$key} = ";
+			var_dump( $value );
+			# grab var_dump() output and discard it from the output buffer
+			$ret .= trim( ob_get_clean() ) . ";\n";
+		}
+
+		return trim( $ret, "\n" );
 	}
 
 	private function isAllowedVariable( $value ) {
@@ -86,4 +191,4 @@ class GetConfiguration extends Maintenance {
 }
 
 $maintClass = "GetConfiguration";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/getLagTimes.php b/maintenance/getLagTimes.php
index 72b1d48a..7365a2ee 100644
--- a/maintenance/getLagTimes.php
+++ b/maintenance/getLagTimes.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that displays replication lag times.
@@ -39,7 +39,7 @@ class GetLagTimes extends Maintenance {
 
 		if ( $lb->getServerCount() == 1 ) {
 			$this->error( "This script dumps replication lag times, but you don't seem to have\n"
-						  . "a multi-host db server configuration." );
+				. "a multi-host db server configuration." );
 		} else {
 			$lags = $lb->getLagTimes();
 			foreach ( $lags as $n => $lag ) {
@@ -59,4 +59,4 @@ class GetLagTimes extends Maintenance {
 }
 
 $maintClass = "GetLagTimes";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/getSlaveServer.php b/maintenance/getSlaveServer.php
index ec9ed20a..d618825f 100644
--- a/maintenance/getSlaveServer.php
+++ b/maintenance/getSlaveServer.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that reports the hostname of a slave server.
@@ -51,4 +51,4 @@ class GetSlaveServer extends Maintenance {
 }
 
 $maintClass = "GetSlaveServer";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/getText.php b/maintenance/getText.php
index f6adfe2b..9c4bdfb8 100644
--- a/maintenance/getText.php
+++ b/maintenance/getText.php
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that outputs page text to stdout.
@@ -62,4 +62,4 @@ class GetTextMaint extends Maintenance {
 }
 
 $maintClass = "GetTextMaint";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/hiphop/compiler.conf b/maintenance/hiphop/compiler.conf
deleted file mode 100644
index 3e01640d..00000000
--- a/maintenance/hiphop/compiler.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-GenerateSourceInfo = true
-EnableEval = 2
-AllDynamic = true
-EnableHipHopSyntax = true
-EnableHipHopExperimentalSyntax = true
diff --git a/maintenance/hiphop/extra-files b/maintenance/hiphop/extra-files
deleted file mode 100644
index f07f7c7c..00000000
--- a/maintenance/hiphop/extra-files
+++ /dev/null
@@ -1,34 +0,0 @@
-img_auth.php
-includes/AutoLoader.php
-includes/DefaultSettings.php
-includes/Defines.php
-includes/GlobalFunctions.php
-includes/ImageFunctions.php
-includes/OutputHandler.php
-includes/ProxyTools.php
-includes/SeleniumWebSettings.php
-includes/Setup.php
-includes/StreamFile.php
-includes/WebStart.php
-includes/filerepo/NullRepo.php
-includes/normal/UtfNormalDefines.php
-includes/normal/UtfNormalUtil.php
-index.php
-languages/Names.php
-load.php
-maintenance/Maintenance.php
-maintenance/commandLine.inc
-maintenance/doMaintenance.php
-maintenance/eval.php
-opensearch_desc.php
-profileinfo.php
-redirect.php
-resources/Resources.php
-serialized/serialize.php
-skins/MonoBook.deps.php
-skins/MonoBook.php
-skins/Vector.deps.php
-skins/Vector.php
-thumb.php
-trackback.php
-
diff --git a/maintenance/hiphop/make b/maintenance/hiphop/make
deleted file mode 100644
index 13e3163a..00000000
--- a/maintenance/hiphop/make
+++ /dev/null
@@ -1,311 +0,0 @@
-#!/usr/bin/hphpi -f
-<?php
-
-define( 'MW_CONFIG_CALLBACK', 'MakeHipHop::noConfigNeeded' );
-require( __DIR__ . '/../Maintenance.php' );
-
-class MakeHipHop extends Maintenance {
-	function noConfigNeeded() {}
-
-	function execute() {
-		global $wgHipHopBuildDirectory;
-
-		$startTime = time();
-
-		$thisDir = realpath( __DIR__ );
-		$IP = realpath( "$thisDir/../.." );
-		if ( strval( $wgHipHopBuildDirectory ) !== '' ) {
-			$buildDir = $wgHipHopBuildDirectory;
-		} else {
-			$buildDir = "$thisDir/build";
-		}
-		$extensionsDir = realpath( MWInit::getExtensionsDirectory() );
-		$outDir = "$buildDir/hiphop-output";
-		$persistentDir = "$buildDir/persistent";
-
-		if ( !is_dir( $buildDir ) ) {
-			mkdir( $buildDir, 0777, true );
-		}
-		if ( !is_dir( $persistentDir ) ) {
-			mkdir( $persistentDir, 0777, true );
-		}
-
-		if ( realpath( "$IP/../phase3" ) !== $IP
-			|| realpath( "$IP/../extensions" ) !== $extensionsDir )
-		{
-			# Set up a fake source directory with the correct layout
-			$sourceBase = "$buildDir/source";
-			$this->setupFakeSourceBase( $IP, $extensionsDir, $sourceBase );
-		} else {
-			$sourceBase = realpath( "$IP/.." );
-			unlink( "$buildDir/source" );
-		}
-
-		# With the CentOS RPMs, you just get g++44, no g++, so we have to
-		# use the environment
-		if ( isset( $_ENV['CXX'] ) ) {
-			$cxx = $_ENV['CXX'];
-		} else {
-			$cxx = 'g++';
-		}
-
-		# Create a function that provides the HipHop compiler version, and
-		# doesn't exist when MediaWiki is invoked in interpreter mode.
-		$version = str_replace( PHP_EOL, ' ', trim( `hphp --version` ) );
-		file_put_contents(
-			"$buildDir/HipHopCompilerVersion.php",
-			"<" . "?php\n" .
-			"function wfHipHopCompilerVersion() {\n" .
-			"return " . var_export( $version, true ) . ";\n" .
-			"}\n"
-		);
-
-		# Generate the file list
-		$files = $this->getFileList();
-		file_put_contents(
-			"$buildDir/file-list",
-			implode( "\n", $files ) . "\n" );
-
-		# Generate the C++
-		passthru(
-			'hphp' .
-			' --target=cpp' .
-			' --format=file' .
-			' --input-dir=' . wfEscapeShellArg( $sourceBase ) .
-			' --input-list=' . wfEscapeShellArg( "$buildDir/file-list" ) .
-			' --inputs=' . wfEscapeShellArg( "$buildDir/HipHopCompilerVersion.php" ) .
-			' -c ' . wfEscapeShellArg( "$thisDir/compiler.conf" ) .
-			' --parse-on-demand=false' .
-			' --program=mediawiki-hphp' .
-			' --output-dir=' . wfEscapeShellArg( $outDir ) .
-			' --log=3', $ret );
-
-		if ( $ret ) {
-			$this->error( "hphp hit an error. Stopping build.\n" );
-			exit( 1 );
-		}
-
-		# Sanity check, quickly make sure we've got an output directory
-		if( !is_dir( $outDir ) ) {
-			$this->error( "No output directory", true );
-		}
-
-		# Warn about volatile classes
-		$this->checkVolatileClasses( $outDir );
-
-		# Copy the generated C++ files into the source directory for cmake
-		$iter = new RecursiveIteratorIterator(
-			new RecursiveDirectoryIterator( $outDir ),
-			RecursiveIteratorIterator::SELF_FIRST );
-		$sourceFiles = array();
-		$regenerateMakefile = false;
-		$numFiles = 0;
-		$numFilesChanged = 0;
-		foreach ( $iter as $sourcePath => $file ) {
-			$name = substr( $sourcePath, strlen( $outDir ) + 1 );
-			$sourceFiles[$name] = true;
-			$destPath = "$persistentDir/$name";
-			if ( $file->isDir() ) {
-				if ( !is_dir( $destPath ) ) {
-					mkdir( $destPath );
-				}
-				continue;
-			}
-
-			$numFiles++;
-			# Remove any files that weren't touched, these may have been removed
-			# from file-list, we should not compile them
-			if ( $file->getMTime() < $startTime ) {
-				if ( file_exists( $destPath ) ) {
-					unlink( $destPath );
-					# Files removed, regenerate the makefile
-					$regenerateMakefile = true;
-				}
-				unlink( $sourcePath );
-				$numFilesChanged++;
-				continue;
-			}
-
-			if ( file_exists( $destPath ) ) {
-				$sourceHash = md5( file_get_contents( $sourcePath ) );
-				$destHash = md5( file_get_contents( $destPath ) );
-				if ( $sourceHash == $destHash ) {
-					continue;
-				}
-			} else {
-				# New files added, regenerate the makefile
-				$regenerateMakefile = true;
-			}
-			$numFilesChanged++;
-			copy( $sourcePath, $destPath );
-		}
-
-		echo "MediaWiki: $numFilesChanged files changed out of $numFiles\n";
-
-		if ( !file_exists( "$persistentDir/CMakeLists.txt" ) ) {
-			# Run cmake for the first time
-			$regenerateMakefile = true;
-		}
-
-		# Do our own version of $HPHP_HOME/bin/run.sh, which isn't so broken.
-		# HipHop's RELEASE mode seems to be stuck always on, so symbols get
-		# stripped. Also we will try keeping the generated .o files instead of
-		# throwing away hours of CPU time every time you make a typo.
-
-		chdir( $persistentDir );
-
-		if ( $regenerateMakefile ) {
-			copy( $_ENV['HPHP_HOME'] . '/bin/CMakeLists.base.txt',
-				"$persistentDir/CMakeLists.txt" );
-
-			if ( file_exists( "$persistentDir/CMakeCache.txt" ) ) {
-				unlink( "$persistentDir/CMakeCache.txt" );
-			}
-
-			$cmd = 'cmake' .
-				" -D CMAKE_BUILD_TYPE:string=" . wfEscapeShellArg( $GLOBALS['wgHipHopBuildType'] ) .
-				' -D PROGRAM_NAME:string=mediawiki-hphp';
-
-			if ( file_exists( '/usr/bin/ccache' ) ) {
-				$cmd .= ' -D CMAKE_CXX_COMPILER:string=ccache' .
-					' -D CMAKE_CXX_COMPILER_ARG1:string=' . wfEscapeShellArg( $cxx );
-			}
-
-			$cmd .= ' .';
-			echo "$cmd\n";
-			passthru( $cmd );
-		}
-
-		# Determine appropriate make concurrency
-		# Compilation can take a lot of memory, let's assume that that is limiting.
-		$procs = $this->getNumProcs();
-
-		# Run make. This is the slow step.
-		passthru( 'make -j' . wfEscapeShellArg( $procs ) );
-
-		$elapsed = time() - $startTime;
-
-		echo "Completed in ";
-		if ( $elapsed >= 3600 ) {
-			$hours = floor( $elapsed / 3600 );
-			echo $hours . 'h ';
-			$elapsed -= $hours * 3600;
-		}
-		if ( $elapsed >= 60 ) {
-			$minutes = floor( $elapsed / 60 );
-			echo $minutes . 'm ';
-			$elapsed -= $minutes * 60;
-		}
-		echo $elapsed . "s\n";
-		echo "The MediaWiki executable is at $buildDir/persistent/mediawiki-hphp\n";
-	}
-
-	function checkVolatileClasses( $dir ) {
-		$lines = file( "$dir/sys/dynamic_table_class.cpp" );
-		$classes = array();
-		foreach ( $lines as $line ) {
-			if ( preg_match( '/^\s+\(const char \*\)"([^"]*)", \(const char \*\)-1/', $line, $m ) ) {
-				$classes[] = $m[1];
-			}
-		}
-		if ( !count( $classes ) ) {
-			print "No volatile classes found\n";
-			return;
-		}
-		sort( $classes );
-		$classes = array_unique( $classes );
-		print "WARNING: The following classes are volatile: " . implode( ', ', $classes ) . "\n";
-	}
-
-	function getNumProcs() {
-		global $wgHipHopCompilerProcs;
-		if ( $wgHipHopCompilerProcs !== 'detect' ) {
-			return intval( $wgHipHopCompilerProcs );
-		}
-
-		if ( !file_exists( '/proc/meminfo' ) ) {
-			return 1;
-		}
-		$mem = false;
-		foreach ( file( '/proc/meminfo' ) as $line ) {
-			if ( preg_match( '/^MemTotal:\s+(\d+)\s+kB/', $line, $m ) ) {
-				$mem = intval( $m[1] );
-				break;
-			}
-		}
-		if ( $mem ) {
-			// At least one process
-			return max( 1, floor( $mem / 1000000 ) );
-		} else {
-			return 1;
-		}
-	}
-
-	function setupFakeSourceBase( $phase3, $extensions, $dest ) {
-		if ( !file_exists( $dest ) ) {
-			mkdir( $dest, 0777, true );
-		}
-
-		$this->forceCreateLink( "$dest/phase3", $phase3 );
-		$this->forceCreateLink( "$dest/extensions", $extensions );
-	}
-
-	function forceCreateLink( $target, $link ) {
-		if ( file_exists( $target ) ) {
-			if ( readlink( $target ) === $link ) {
-				return;
-			}
-			unlink( $target );
-		}
-		symlink( $target, $link );
-	}
-
-	function getFileList() {
-		global $wgAutoloadClasses, $wgAutoloadLocalClasses, $wgCompiledFiles;
-		$inputFiles = array_merge(
-			array_values( $wgAutoloadClasses ),
-			array_values( $wgAutoloadLocalClasses ),
-			$wgCompiledFiles
-		);
-		$processedFiles = array();
-		foreach ( $inputFiles as $file ) {
-			if ( substr( $file, 0, 1 ) === '/' ) {
-				$processedFiles[] = $this->absoluteToRelative( $file );
-			} elseif ( preg_match( '/^extensions/', $file ) ) {
-				$processedFiles[] = $file;
-			} else {
-				$processedFiles[] = "phase3/$file";
-			}
-		}
-
-		$extraCoreFiles = array_map( 'trim', file( __DIR__ . '/extra-files' ) );
-		foreach ( $extraCoreFiles as $file ) {
-			if ( $file === '' ) {
-				continue;
-			}
-			$processedFiles[] = "phase3/$file";
-		}
-		return array_unique( $processedFiles );
-	}
-
-	function absoluteToRelative( $file ) {
-		global $IP;
-
-		$coreBase = realpath( $IP ) . '/';
-		$extBase = realpath( MWInit::getExtensionsDirectory() ) . '/';
-		$file = realpath( $file );
-
-		if ( substr( $file, 0, strlen( $extBase ) ) === $extBase ) {
-			return 'extensions/' . substr( $file, strlen( $extBase ) );
-		} elseif ( substr( $file, 0, strlen( $coreBase ) ) === $coreBase ) {
-			return 'phase3/' . substr( $file, strlen( $coreBase ) );
-		} else {
-			$this->error( "The following file is registered for compilation but is not in \$IP or " .
-				"\$wgExtensionsDirectory: $file \n" );
-			exit( 1 );
-		}
-	}
-}
-
-$maintClass = 'MakeHipHop';
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/hiphop/run-server b/maintenance/hiphop/run-server
index 1adfe29f..2d71b871 100644
--- a/maintenance/hiphop/run-server
+++ b/maintenance/hiphop/run-server
@@ -1,68 +1,21 @@
-#!/usr/bin/hphpi -f
+#!/usr/bin/hhvm -f
 <?php
 
-require( __DIR__ . '/../Maintenance.php' );
+require __DIR__ . '/../Maintenance.php';
 
 class RunHipHopServer extends Maintenance {
 	function __construct() {
 		parent::__construct();
-		$this->addOption( 'interpret', 'Run in interpreted mode' );
 	}
 
 	function execute() {
-		if ( $this->hasOption( 'interpret' ) ) {
-			$this->runInterpreted();
-		} else {
-			$this->runCompiled();
-		}
-	}
-
-	function runCompiled() {
-		global $wgHipHopBuildDirectory;
-		$thisDir = realpath( __DIR__ );
-		$IP = realpath( "$thisDir/../.." );
-		if ( strval( $wgHipHopBuildDirectory ) !== '' ) {
-			$buildDir = $wgHipHopBuildDirectory;
-		} else {
-			$buildDir = "$thisDir/build";
-		}
-
-		if ( file_exists( "$buildDir/source" ) ) {
-			$sourceBase = "$buildDir/source";
-		} else {
-			$sourceBase = realpath( "$IP/.." );
-		}
-
-		passthru(
-			'cd ' . wfEscapeShellArg( $sourceBase ) . " && " .
-			'MW_INSTALL_PATH=' . wfEscapeShellArg( $IP ) . ' ' .
-			wfEscapeShellArg(
-				"$buildDir/persistent/mediawiki-hphp",
-				'-c', "$thisDir/server.conf",
-				'-v', "Server.SourceRoot=$sourceBase",
-				'-v', "Server.IncludeSearchPaths.0=$sourceBase",
-				'-v', 'ServerVariables.MW_COMPILED=1',
-				'--mode=server',
-				'--port=8080'
-			),
-			$ret
-		);
-		exit( $ret );
-	}
-
-	function runInterpreted() {
-		$thisDir = realpath( __DIR__ );
-		$IP = realpath( "$thisDir/../.." );
-		$sourceBase = realpath( "$IP/.." );
+		global $IP;
 
 		passthru(
-			'cd ' . wfEscapeShellArg( $sourceBase ) . " && " .
-			'MW_INSTALL_PATH=' . wfEscapeShellArg( $IP ) . ' ' .
+			'cd ' . wfEscapeShellArg( $IP ) . " && " .
 			wfEscapeShellArg(
-				'hphpi',
-				'-c', "$thisDir/server.conf",
-				'-v', "Server.SourceRoot=$sourceBase",
-				'-v', "Server.IncludeSearchPaths.0=$sourceBase",
+				'hhvm',
+				'-c', __DIR__."/server.conf",
 				'--mode=server',
 				'--port=8080'
 			),
@@ -72,4 +25,4 @@ class RunHipHopServer extends Maintenance {
 	}
 }
 $maintClass = 'RunHipHopServer';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/hiphop/server.conf b/maintenance/hiphop/server.conf
index 16af0f2f..558bdad8 100644
--- a/maintenance/hiphop/server.conf
+++ b/maintenance/hiphop/server.conf
@@ -12,7 +12,7 @@ Debug {
 }
 Server {
 	EnableStaticContentCache = false
-	EnableStaticContentFromDisk = false
+	EnableStaticContentFromDisk = true
 	AlwaysUseRelativePath = true
 }
 VirtualHost {
@@ -22,7 +22,7 @@ VirtualHost {
 		RewriteRules {
 			* {
 				pattern = ^/wiki/(.*)$
-				to = /phase3/index.php?title=$1
+				to = /index.php?title=$1
 				qsa = true
 			}
 		}
diff --git a/maintenance/importDump.php b/maintenance/importDump.php
index 904b6247..1f47cf12 100644
--- a/maintenance/importDump.php
+++ b/maintenance/importDump.php
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that imports XML dump files into the current wiki.
@@ -34,16 +34,16 @@ require_once( __DIR__ . '/Maintenance.php' );
 class BackupReader extends Maintenance {
 	public $reportingInterval = 100;
 	public $pageCount = 0;
-	public $revCount  = 0;
-	public $dryRun    = false;
-	public $uploads   = false;
+	public $revCount = 0;
+	public $dryRun = false;
+	public $uploads = false;
 	public $imageBasePath = false;
-	public $nsFilter  = false;
+	public $nsFilter = false;
 
 	function __construct() {
 		parent::__construct();
-		$gz = in_array('compress.zlib', stream_get_wrappers()) ? 'ok' : '(disabled; requires PHP zlib module)';
-		$bz2 = in_array('compress.bzip2', stream_get_wrappers()) ? 'ok' : '(disabled; requires PHP bzip2 module)';
+		$gz = in_array( 'compress.zlib', stream_get_wrappers() ) ? 'ok' : '(disabled; requires PHP zlib module)';
+		$bz2 = in_array( 'compress.bzip2', stream_get_wrappers() ) ? 'ok' : '(disabled; requires PHP bzip2 module)';
 
 		$this->mDescription = <<<TEXT
 This script reads pages from an XML file as produced from Special:Export or
@@ -73,7 +73,7 @@ TEXT;
 	}
 
 	public function execute() {
-		if( wfReadOnly() ) {
+		if ( wfReadOnly() ) {
 			$this->error( "Wiki is in read-only mode; you'll need to disable it for import to work.", true );
 		}
 
@@ -91,7 +91,7 @@ TEXT;
 			$this->setNsfilter( explode( '|', $this->getOption( 'namespaces' ) ) );
 		}
 
-		if( $this->hasArg() ) {
+		if ( $this->hasArg() ) {
 			$this->importFromFile( $this->getArg() );
 		} else {
 			$this->importFromStdin();
@@ -247,7 +247,7 @@ TEXT;
 
 	function importFromStdin() {
 		$file = fopen( 'php://stdin', 'rt' );
-		if( self::posix_isatty( $file ) ) {
+		if ( self::posix_isatty( $file ) ) {
 			$this->maybeHelp( true );
 		}
 		return $this->importFromHandle( $file );
@@ -259,14 +259,14 @@ TEXT;
 		$source = new ImportStreamSource( $handle );
 		$importer = new WikiImporter( $source );
 
-		if( $this->hasOption( 'debug' ) ) {
+		if ( $this->hasOption( 'debug' ) ) {
 			$importer->setDebug( true );
 		}
 		if ( $this->hasOption( 'no-updates' ) ) {
 			$importer->setNoUpdates( true );
 		}
 		$importer->setPageCallback( array( &$this, 'reportPage' ) );
-		$this->importCallback =  $importer->setRevisionCallback(
+		$this->importCallback = $importer->setRevisionCallback(
 			array( &$this, 'handleRevision' ) );
 		$this->uploadCallback = $importer->setUploadCallback(
 			array( &$this, 'handleUpload' ) );
@@ -288,4 +288,4 @@ TEXT;
 }
 
 $maintClass = 'BackupReader';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/importImages.inc b/maintenance/importImages.inc
index 2b3d5514..5ae6d6be 100644
--- a/maintenance/importImages.inc
+++ b/maintenance/importImages.inc
@@ -99,7 +99,9 @@ function findAuxFile( $file, $auxExtension, $maxStrip = 1 ) {
 		}
 
 		$idx = strrpos( $n, '.' );
-		if ( !$idx ) break;
+		if ( !$idx ) {
+			break;
+		}
 
 		$n = substr( $n, 0, $idx );
 		$maxStrip -= 1;
diff --git a/maintenance/importImages.php b/maintenance/importImages.php
index 782f502d..54fd4e2d 100644
--- a/maintenance/importImages.php
+++ b/maintenance/importImages.php
@@ -35,11 +35,11 @@ $optionsWithArgs = array(
 	'extensions', 'comment', 'comment-file', 'comment-ext', 'summary', 'user',
 	'license', 'sleep', 'limit', 'from', 'source-wiki-url', 'timestamp',
 );
-require_once( __DIR__ . '/commandLine.inc' );
-require_once( __DIR__ . '/importImages.inc' );
+require_once __DIR__ . '/commandLine.inc';
+require_once __DIR__ . '/importImages.inc';
 $processed = $added = $ignored = $skipped = $overwritten = $failed = 0;
 
-echo( "Import Images\n\n" );
+echo "Import Images\n\n";
 
 # Need a path
 if ( count( $args ) == 0 ) {
@@ -104,15 +104,15 @@ if ( $limit ) {
 $timestamp = isset( $options['timestamp'] ) ? $options['timestamp'] : false;
 
 # Get the upload comment. Provide a default one in case there's no comment given.
-$comment = 'Importing image file';
+$comment = 'Importing file';
 
 if ( isset( $options['comment-file'] ) ) {
-	$comment =  file_get_contents( $options['comment-file'] );
+	$comment = file_get_contents( $options['comment-file'] );
 	if ( $comment === false || $comment === null ) {
 		die( "failed to read comment file: {$options['comment-file']}\n" );
 	}
 } elseif ( isset( $options['comment'] ) ) {
-	$comment =  $options['comment'];
+	$comment = $options['comment'];
 }
 
 $commentExt = isset( $options['comment-ext'] ) ? $options['comment-ext'] : false;
@@ -132,7 +132,7 @@ if ( $count > 0 ) {
 		# Validate a title
 		$title = Title::makeTitleSafe( NS_FILE, $base );
 		if ( !is_object( $title ) ) {
-			echo( "{$base} could not be imported; a valid title cannot be produced\n" );
+			echo "{$base} could not be imported; a valid title cannot be produced\n";
 			continue;
 		}
 
@@ -148,7 +148,7 @@ if ( $count > 0 ) {
 		if ( $checkUserBlock && ( ( $processed % $checkUserBlock ) == 0 ) ) {
 			$user->clearInstanceCache( 'name' ); // reload from DB!
 			if ( $user->isBlocked() ) {
-				echo( $user->getName() . " was blocked! Aborting.\n" );
+				echo $user->getName() . " was blocked! Aborting.\n";
 				break;
 			}
 		}
@@ -157,10 +157,10 @@ if ( $count > 0 ) {
 		$image = wfLocalFile( $title );
 		if ( $image->exists() ) {
 			if ( isset( $options['overwrite'] ) ) {
-				echo( "{$base} exists, overwriting..." );
+				echo "{$base} exists, overwriting...";
 				$svar = 'overwritten';
 			} else {
-				echo( "{$base} exists, skipping\n" );
+				echo "{$base} exists, skipping\n";
 				$skipped++;
 				continue;
 			}
@@ -172,23 +172,24 @@ if ( $count > 0 ) {
 				$dupes = $repo->findBySha1( $sha1 );
 
 				if ( $dupes ) {
-					echo( "{$base} already exists as " . $dupes[0]->getName() . ", skipping\n" );
+					echo "{$base} already exists as " . $dupes[0]->getName() . ", skipping\n";
 					$skipped++;
 					continue;
 				}
 			}
 
-			echo( "Importing {$base}..." );
+			echo "Importing {$base}...";
 			$svar = 'added';
 		}
 
 		if ( isset( $options['source-wiki-url'] ) ) {
 			/* find comment text directly from source wiki, through MW's API */
 			$real_comment = getFileCommentFromSourceWiki( $options['source-wiki-url'], $base );
-			if ( $real_comment === false )
+			if ( $real_comment === false ) {
 				$commentText = $comment;
-			else
+			} else {
 				$commentText = $real_comment;
+			}
 
 			/* find user directly from source wiki, through MW's API */
 			$real_user = getFileUserFromSourceWiki( $options['source-wiki-url'], $base );
@@ -198,7 +199,7 @@ if ( $count > 0 ) {
 				$wgUser = User::newFromName( $real_user );
 				if ( $wgUser === false ) {
 					# user does not exist in target wiki
-					echo ( "failed: user '$real_user' does not exist in target wiki." );
+					echo "failed: user '$real_user' does not exist in target wiki.";
 					continue;
 				}
 			}
@@ -209,11 +210,11 @@ if ( $count > 0 ) {
 			if ( $commentExt ) {
 				$f = findAuxFile( $file, $commentExt );
 				if ( !$f ) {
-					echo( " No comment file with extension {$commentExt} found for {$file}, using default comment. " );
+					echo " No comment file with extension {$commentExt} found for {$file}, using default comment. ";
 				} else {
 					$commentText = file_get_contents( $f );
 					if ( !$commentText ) {
-						echo( " Failed to load comment file {$f}, using default comment. " );
+						echo " Failed to load comment file {$f}, using default comment. ";
 					}
 				}
 			}
@@ -225,28 +226,37 @@ if ( $count > 0 ) {
 
 		# Import the file
 		if ( isset( $options['dry'] ) ) {
-			echo( " publishing {$file} by '" . $wgUser->getName() . "', comment '$commentText'... " );
+			echo " publishing {$file} by '" . $wgUser->getName() . "', comment '$commentText'... ";
 		} else {
-			$archive = $image->publish( $file );
+			$props = FSFile::getPropsFromPath( $file );
+			$flags = 0;
+			$publishOptions = array();
+			$handler = MediaHandler::getHandler( $props['mime'] );
+			if ( $handler ) {
+				$publishOptions['headers'] = $handler->getStreamHeaders( $props['metadata'] );
+			} else {
+				$publishOptions['headers'] = array();
+			}
+			$archive = $image->publish( $file, $flags, $publishOptions );
 			if ( !$archive->isGood() ) {
-				echo( "failed. (" .
+				echo "failed. (" .
 					$archive->getWikiText() .
-					")\n" );
+					")\n";
 				$failed++;
 				continue;
 			}
 		}
 
 		$commentText = SpecialUpload::getInitialPageText( $commentText, $license );
-		if ( !$summary ) {
+		if ( !isset( $options['summary'] ) ) {
 			$summary = $commentText;
 		}
 
 		if ( isset( $options['dry'] ) ) {
-			echo( "done.\n" );
-		} elseif ( $image->recordUpload2( $archive->value, $summary, $commentText, false, $timestamp ) ) {
+			echo "done.\n";
+		} elseif ( $image->recordUpload2( $archive->value, $summary, $commentText, $props, $timestamp ) ) {
 			# We're done!
-			echo( "done.\n" );
+			echo "done.\n";
 
 			$doProtect = false;
 
@@ -269,21 +279,21 @@ if ( $count > 0 ) {
 					sleep( 2.0 ); # Why this sleep?
 					wfWaitForSlaves();
 
-					echo( "\nSetting image restrictions ... " );
+					echo "\nSetting image restrictions ... ";
 
 					$cascade = false;
 					$restrictions = array();
-					foreach( $title->getRestrictionTypes() as $type ) {
+					foreach ( $title->getRestrictionTypes() as $type ) {
 						$restrictions[$type] = $protectLevel;
 					}
 
 					$page = WikiPage::factory( $title );
 					$status = $page->doUpdateRestrictions( $restrictions, array(), $cascade, '', $user );
-					echo( ( $status->isOK() ? 'done' : 'failed' ) . "\n" );
+					echo ( $status->isOK() ? 'done' : 'failed' ) . "\n";
 			}
 
 		} else {
-			echo( "failed. (at recordUpload stage)\n" );
+			echo "failed. (at recordUpload stage)\n";
 			$svar = 'failed';
 		}
 
@@ -300,23 +310,24 @@ if ( $count > 0 ) {
 	}
 
 	# Print out some statistics
-	echo( "\n" );
+	echo "\n";
 	foreach ( array( 'count' => 'Found', 'limit' => 'Limit', 'ignored' => 'Ignored',
 		'added' => 'Added', 'skipped' => 'Skipped', 'overwritten' => 'Overwritten',
 		'failed' => 'Failed' ) as $var => $desc ) {
-		if ( $$var > 0 )
-			echo( "{$desc}: {$$var}\n" );
+		if ( $$var > 0 ) {
+			echo "{$desc}: {$$var}\n";
+		}
 	}
 
 } else {
-	echo( "No suitable files could be found for import.\n" );
+	echo "No suitable files could be found for import.\n";
 }
 
 exit( 0 );
 
 function showUsage( $reason = false ) {
 	if ( $reason ) {
-		echo( $reason . "\n" );
+		echo $reason . "\n";
 	}
 
 	echo <<<TEXT
@@ -336,7 +347,7 @@ Options:
 --sleep=<sec>           Sleep between files. Useful mostly for debugging.
 --user=<username>       Set username of uploader, default 'Maintenance script'
 --check-userblock       Check if the user got blocked during import.
---comment=<text>        Set file description, default 'Importing image file'.
+--comment=<text>        Set file description, default 'Importing file'.
 --comment-file=<file>   Set description to the content of <file>.
 --comment-ext=<ext>     Causes the description for each file to be loaded from a file with the same name
                         but the extension <ext>. If a global description is also given, it is appended.
diff --git a/maintenance/importSiteScripts.php b/maintenance/importSiteScripts.php
index fabc6dc6..fd768b34 100644
--- a/maintenance/importSiteScripts.php
+++ b/maintenance/importSiteScripts.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to import all scripts in the MediaWiki namespace from a
@@ -105,4 +105,4 @@ class ImportSiteScripts extends Maintenance {
 }
 
 $maintClass = 'ImportSiteScripts';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/importTextFile.php b/maintenance/importTextFile.php
index c04989c0..e081c20b 100644
--- a/maintenance/importTextFile.php
+++ b/maintenance/importTextFile.php
@@ -24,15 +24,15 @@
 
 $options = array( 'help', 'nooverwrite', 'norc' );
 $optionsWithArgs = array( 'title', 'user', 'comment' );
-require_once( __DIR__ . '/commandLine.inc' );
-echo( "Import Text File\n\n" );
+require_once __DIR__ . '/commandLine.inc';
+echo "Import Text File\n\n";
 
 if ( count( $args ) < 1 || isset( $options['help'] ) ) {
 	showHelp();
 } else {
 
 	$filename = $args[0];
-	echo( "Using {$filename}..." );
+	echo "Using {$filename}...";
 	if ( is_file( $filename ) ) {
 
 		$title = isset( $options['title'] ) ? $options['title'] : titleFromFilename( $filename );
@@ -40,7 +40,7 @@ if ( count( $args ) < 1 || isset( $options['help'] ) ) {
 
 		if ( is_object( $title ) ) {
 
-			echo( "\nUsing title '" . $title->getPrefixedText() . "'..." );
+			echo "\nUsing title '" . $title->getPrefixedText() . "'...";
 			if ( !$title->exists() || !isset( $options['nooverwrite'] ) ) {
 
 				$text = file_get_contents( $filename );
@@ -49,31 +49,31 @@ if ( count( $args ) < 1 || isset( $options['help'] ) ) {
 
 				if ( is_object( $user ) ) {
 
-					echo( "\nUsing username '" . $user->getName() . "'..." );
+					echo "\nUsing username '" . $user->getName() . "'...";
 					$wgUser =& $user;
 					$comment = isset( $options['comment'] ) ? $options['comment'] : 'Importing text file';
 					$flags = 0 | ( isset( $options['norc'] ) ? EDIT_SUPPRESS_RC : 0 );
 
-					echo( "\nPerforming edit..." );
+					echo "\nPerforming edit...";
 					$page = WikiPage::factory( $title );
 					$content = ContentHandler::makeContent( $text, $title );
 					$page->doEditContent( $content, $comment, $flags, false, $user );
-					echo( "done.\n" );
+					echo "done.\n";
 
 				} else {
-					echo( "invalid username.\n" );
+					echo "invalid username.\n";
 				}
 
 			} else {
-				echo( "page exists.\n" );
+				echo "page exists.\n";
 			}
 
 		} else {
-			echo( "invalid title.\n" );
+			echo "invalid title.\n";
 		}
 
 	} else {
-		echo( "does not exist.\n" );
+		echo "does not exist.\n";
 	}
 
 }
diff --git a/maintenance/initEditCount.php b/maintenance/initEditCount.php
index 3135b4c7..4b046835 100644
--- a/maintenance/initEditCount.php
+++ b/maintenance/initEditCount.php
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 class InitEditCount extends Maintenance {
 	public function __construct() {
@@ -107,4 +107,4 @@ in the load balancer, usually indicating a replication environment.' );
 }
 
 $maintClass = "InitEditCount";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/initSiteStats.php b/maintenance/initSiteStats.php
index 19906592..92268b3e 100644
--- a/maintenance/initSiteStats.php
+++ b/maintenance/initSiteStats.php
@@ -23,7 +23,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to re-initialise or update the site statistics table
@@ -48,7 +48,7 @@ class InitSiteStats extends Maintenance {
 		$edits = $counter->edits();
 		$this->output( "{$edits}\nCounting number of articles..." );
 
-		$good  = $counter->articles();
+		$good = $counter->articles();
 		$this->output( "{$good}\nCounting total pages..." );
 
 		$pages = $counter->pages();
@@ -85,4 +85,4 @@ class InitSiteStats extends Maintenance {
 }
 
 $maintClass = "InitSiteStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/install.php b/maintenance/install.php
index 935a2966..d118747a 100644
--- a/maintenance/install.php
+++ b/maintenance/install.php
@@ -22,14 +22,14 @@
  */
 
 if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
-	require_once( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
+	require_once dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
 	wfPHPVersionError( 'cli' );
 }
 
 define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
 define( 'MEDIAWIKI_INSTALL', true );
 
-require_once( dirname( __DIR__ )."/maintenance/Maintenance.php" );
+require_once dirname( __DIR__ ) . "/maintenance/Maintenance.php";
 
 /**
  * Maintenance script to install and configure MediaWiki
@@ -41,7 +41,7 @@ class CommandLineInstaller extends Maintenance {
 		parent::__construct();
 		global $IP;
 
-		$this->addArg( 'name', 'The name of the wiki', true);
+		$this->addArg( 'name', 'The name of the wiki', true );
 
 		$this->addArg( 'admin', 'The username of the wiki administrator (WikiSysop)', true );
 		$this->addOption( 'pass', 'The password for the wiki administrator.', false, true );
@@ -109,13 +109,13 @@ class CommandLineInstaller extends Maintenance {
 			InstallerOverrides::getCliInstaller( $siteName, $adminName, $this->mOptions );
 
 		$status = $installer->doEnvironmentChecks();
-		if( $status->isGood() ) {
+		if ( $status->isGood() ) {
 			$installer->showMessage( 'config-env-good' );
 		} else {
 			$installer->showStatusMessage( $status );
 			return;
 		}
-		if( !$this->hasOption( 'env-checks' ) ) {
+		if ( !$this->hasOption( 'env-checks' ) ) {
 			$installer->execute();
 			$installer->writeConfigurationFile( $this->getOption( 'confpath', $IP ) );
 		}
@@ -130,4 +130,4 @@ class CommandLineInstaller extends Maintenance {
 
 $maintClass = "CommandLineInstaller";
 
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/jsduck/MetaTags.rb b/maintenance/jsduck/MetaTags.rb
index 84e40213..83cc0884 100644
--- a/maintenance/jsduck/MetaTags.rb
+++ b/maintenance/jsduck/MetaTags.rb
@@ -3,6 +3,22 @@
 # - https://github.com/senchalabs/jsduck/wiki/Custom-tags
 require 'jsduck/meta_tag'
 
+class SourceTag < JsDuck::MetaTag
+  def initialize
+    # This defines the name of the @tag
+    @name = 'source'
+  end
+
+  # Generate HTML output for this tag.
+  # One can make use of the #format method to easily support
+  # Markdown and {@link} tags inside the contents of the tag.
+  #
+  # @param tags All matches of this tag on one class.
+  def to_html(tags)
+    '<h3 class="pa">Source</h3>' + tags.map {|tag| format(tag) }.join("\n")
+  end
+end
+
 class ContextTag < JsDuck::MetaTag
   def initialize
     @name = 'context'
diff --git a/maintenance/jsduck/categories.json b/maintenance/jsduck/categories.json
index 4a8ba8c3..f96902d8 100644
--- a/maintenance/jsduck/categories.json
+++ b/maintenance/jsduck/categories.json
@@ -9,20 +9,29 @@
 					"mw.Map",
 					"mw.Message",
 					"mw.loader",
+					"mw.log",
 					"mw.html",
 					"mw.html.Cdata",
-					"mw.html.Raw"
+					"mw.html.Raw",
+					"mw.hook"
 				]
 			},
 			{
 				"name": "General",
 				"classes": [
 					"mw.Title",
+					"mw.inspect",
+					"mw.inspect.reports",
 					"mw.notification",
+					"mw.user",
 					"mw.util",
-					"mw.plugin.notify"
+					"mw.plugin.*"
 				]
 			},
+			{
+				"name": "Actions",
+				"classes": ["mw.toolbar"]
+			},
 			{
 				"name": "API",
 				"classes": ["mw.Api*"]
@@ -32,10 +41,6 @@
 	{
 		"name": "jQuery",
 		"groups": [
-			{
-				"name": "Core",
-				"classes": ["jQuery", "jQuery.Event", "jQuery.Promise", "jQuery.Deferred", "jQuery.jqXHR"]
-			},
 			{
 				"name": "Plugins",
 				"classes": ["jQuery.plugin.*"]
@@ -43,10 +48,14 @@
 		]
 	},
 	{
-		"name": "Misc",
+		"name": "Upstream",
 		"groups": [
 			{
-				"name": "Native",
+				"name": "jQuery",
+				"classes": ["jQuery", "jQuery.Event", "jQuery.Callbacks", "jQuery.Promise", "jQuery.Deferred", "jQuery.jqXHR", "QUnit"]
+			},
+			{
+				"name": "JavaScript",
 				"classes": ["Array", "Boolean", "Date", "Function", "Number", "Object", "RegExp", "String"]
 			}
 		]
diff --git a/maintenance/jsduck/config.json b/maintenance/jsduck/config.json
index c4705d8f..e6e0f658 100644
--- a/maintenance/jsduck/config.json
+++ b/maintenance/jsduck/config.json
@@ -1,18 +1,27 @@
 {
-	"--title": "MediaWiki Code Documentation",
+	"--title": "MediaWiki core - Documentation",
+	"--footer": "Documentation for MediaWiki core. Generated on {DATE} by {JSDUCK} {VERSION}.",
 	"--categories": "./categories.json",
 	"--meta-tags": "./MetaTags.rb",
+	"--eg-iframe": "./eg-iframe.html",
 	"--warnings": ["-no_doc"],
 	"--builtin-classes": true,
 	"--output": "../../docs/js",
 	"--": [
 		"./external.js",
 		"../../resources/mediawiki/mediawiki.js",
+		"../../resources/mediawiki/mediawiki.log.js",
 		"../../resources/mediawiki/mediawiki.util.js",
 		"../../resources/mediawiki/mediawiki.Title.js",
+		"../../resources/mediawiki/mediawiki.inspect.js",
 		"../../resources/mediawiki/mediawiki.notify.js",
 		"../../resources/mediawiki/mediawiki.notification.js",
+		"../../resources/mediawiki/mediawiki.user.js",
+		"../../resources/mediawiki.action/mediawiki.action.edit.js",
+		"../../resources/mediawiki.action/mediawiki.action.view.postEdit.js",
+		"../../resources/mediawiki.page/mediawiki.page.startup.js",
 		"../../resources/mediawiki.api",
-		"../../resources/jquery/jquery.localize.js"
+		"../../resources/jquery/jquery.localize.js",
+		"../../resources/jquery/jquery.spinner.js"
 	]
-}
\ No newline at end of file
+}
diff --git a/maintenance/jsduck/eg-iframe.html b/maintenance/jsduck/eg-iframe.html
index f53b4044..86eae4b6 100644
--- a/maintenance/jsduck/eg-iframe.html
+++ b/maintenance/jsduck/eg-iframe.html
@@ -2,19 +2,87 @@
 <html>
 <head>
     <meta charset="utf-8">
-    <title>MediaWiki Examples</title>
+    <title>MediaWiki Code Example</title>
+    <script src="modules/startup.js"></script>
     <script>
-        function loadInlineExample(code, options, callback) {
+        function startUp() {
+            mw.config = new mw.Map();
+        }
+    </script>
+    <script src="modules/jquery/jquery.js"></script>
+    <script src="modules/mediawiki/mediawiki.js"></script>
+    <style>
+        .mw-jsduck-log {
+            position: relative;
+            min-height: 3em;
+            margin-top: 2em;
+            background: #f7f7f7;
+            border: 1px solid #e4e4e4;
+        }
+
+        .mw-jsduck-log::after {
+            position: absolute;
+            bottom: 100%;
+            right: -1px;
+            padding: 0.5em;
+            background: #fff;
+            border: 1px solid #e4e4e4;
+            border-bottom: 0;
+            border-radius: 0.5em 0.5em 0 0;
+            font: normal 0.5em sans-serif;
+            content: 'console';
+        }
+
+        .mw-jsduck-log-line {
+            padding: 0.2em 0.5em;
+            white-space: pre-wrap;
+        }
+
+        .mw-jsduck-log-line:nth-child(odd) {
+            background: #fff;
+        }
+    </style>
+</head>
+<body>
+    <script>
+        /**
+         * Basic log console for the example iframe in documentation pages.
+         */
+        ( function () {
+            var pre;
+            mw.log = function () {
+                var str, i, len, line;
+                if ( !pre ) {
+                    pre = document.createElement( 'pre' );
+                    pre.className = 'mw-jsduck-log';
+                    document.body.appendChild( pre );
+                }
+                str = [];
+                for ( i = 0, len = arguments.length; i < len; i++ ) {
+                    str.push( String( arguments[ i ] ) );
+                }
+                line = document.createElement( 'div' );
+                line.className = 'mw-jsduck-log-line';
+                line.appendChild(
+                    document.createTextNode( str.join( ' , ' ) + '\n' )
+                );
+                pre.appendChild( line );
+            };
+        }() );
+
+        /**
+         * Method called by jsduck to execute the example code.
+         */
+        function loadInlineExample( code, options, callback ) {
             try {
-                document.body.innerHTML = '';
-                eval(code);
-                callback && callback(true);
+                eval( code );
+                callback && callback( true );
             } catch (e) {
-                document.body.innerHTML = document.createTextNode(e);
-                callback && callback(false, e);
+                mw.log( 'Uncaught exception: ' + e );
+                callback && callback( false, e );
+                throw e;
             }
         }
     </script>
-</head>
-<body></body>
+</body>
 </html>
diff --git a/maintenance/jsduck/external.js b/maintenance/jsduck/external.js
index 8ab102f4..4bb83694 100644
--- a/maintenance/jsduck/external.js
+++ b/maintenance/jsduck/external.js
@@ -1,26 +1,44 @@
 /**
  * @class jQuery
+ * @source <http://api.jquery.com/>
  */
 
 /**
  * @method ajax
+ * @static
+ * @source <http://api.jquery.com/jQuery.ajax/>
  * @return {jqXHR}
  */
 
 /**
  * @class jQuery.Event
+ * @source <http://api.jquery.com/Types/#Event>
+ */
+
+/**
+ * @class jQuery.Callbacks
+ * @source <http://api.jquery.com/jQuery.Callbacks/>
  */
 
 /**
  * @class jQuery.Promise
+ * @source <http://api.jquery.com/Types/#Promise>
  */
 
 /**
  * @class jQuery.Deferred
  * @mixins jQuery.Promise
+ * @source <http://api.jquery.com/jQuery.Deferred/>
  */
 
 /**
  * @class jQuery.jqXHR
+ * @source <http://api.jquery.com/Types/#jqXHR>
  * @alternateClassName jqXHR
  */
+
+
+/**
+ * @class QUnit
+ * @source <http://api.qunitjs.com/>
+ */
diff --git a/maintenance/jsparse.php b/maintenance/jsparse.php
index 1a2e121c..3f0a9ba7 100644
--- a/maintenance/jsparse.php
+++ b/maintenance/jsparse.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to do test JavaScript validity parses using jsmin+'s parser
@@ -50,7 +50,7 @@ class JSParseHelper extends Maintenance {
 			wfSuppressWarnings();
 			$js = file_get_contents( $filename );
 			wfRestoreWarnings();
-			if ($js === false) {
+			if ( $js === false ) {
 				$this->output( "$filename ERROR: could not read file\n" );
 				$this->errs++;
 				continue;
@@ -58,7 +58,7 @@ class JSParseHelper extends Maintenance {
 
 			try {
 				$parser->parse( $js, $filename, 1 );
-			} catch (Exception $e) {
+			} catch ( Exception $e ) {
 				$this->errs++;
 				$this->output( "$filename ERROR: " . $e->getMessage() . "\n" );
 				continue;
@@ -67,11 +67,11 @@ class JSParseHelper extends Maintenance {
 			$this->output( "$filename OK\n" );
 		}
 
-		if ($this->errs > 0) {
-			exit(1);
+		if ( $this->errs > 0 ) {
+			exit( 1 );
 		}
 	}
 }
 
 $maintClass = "JSParseHelper";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/lag.php b/maintenance/lag.php
index 3df11692..410bf756 100644
--- a/maintenance/lag.php
+++ b/maintenance/lag.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to show database lag.
@@ -68,4 +68,4 @@ class DatabaseLag extends Maintenance {
 }
 
 $maintClass = "DatabaseLag";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/StatOutputs.php b/maintenance/language/StatOutputs.php
index 20fb4778..e9d8c86d 100644
--- a/maintenance/language/StatOutputs.php
+++ b/maintenance/language/StatOutputs.php
@@ -1,5 +1,7 @@
 <?php
-if ( !defined( 'MEDIAWIKI' ) ) die();
+if ( !defined( 'MEDIAWIKI' ) ) {
+	die();
+}
 /**
  * Statistic output classes.
  *
@@ -52,9 +54,9 @@ class wikiStatsOutput extends statsOutput {
 		echo "'''Note:''' These statistics can be generated by running <code>php maintenance/language/transstat.php</code>.\n\n";
 		echo "For additional information on specific languages (the message names, the actual problems, etc.), run <code>php maintenance/language/checkLanguage.php --lang=foo</code>.\n\n";
 		echo 'English (en) is excluded because it is the default localization';
-		if( is_array( $wgDummyLanguageCodes ) ) {
+		if ( is_array( $wgDummyLanguageCodes ) ) {
 			$dummyCodes = array();
-			foreach( $wgDummyLanguageCodes as $dummyCode => $correctCode ) {
+			foreach ( $wgDummyLanguageCodes as $dummyCode => $correctCode ) {
 				$dummyCodes[] = Language::fetchLanguageName( $dummyCode ) . ' (' . $dummyCode . ')';
 			}
 			echo ', as well as the following languages that are not intended for system message translations, usually because they redirect to other language codes: ' . implode( ', ', $dummyCodes );
@@ -80,7 +82,9 @@ class wikiStatsOutput extends statsOutput {
 			# Weigh reverse with factor 20 so coloring takes effect more quickly as
 			# this option is used solely for reporting 'bad' percentages.
 			$v = $v * 20;
-			if ( $v > 255 ) $v = 255;
+			if ( $v > 255 ) {
+				$v = 255;
+			}
 			$v = 255 - $v;
 		}
 		if ( $v < 128 ) {
diff --git a/maintenance/language/alltrans.php b/maintenance/language/alltrans.php
index 8caf8677..d0e6e849 100644
--- a/maintenance/language/alltrans.php
+++ b/maintenance/language/alltrans.php
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that gets all messages as defined by the
@@ -44,4 +44,4 @@ class AllTrans extends Maintenance {
 }
 
 $maintClass = "AllTrans";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/checkDupeMessages.php b/maintenance/language/checkDupeMessages.php
index 6abf7b44..381ddae1 100644
--- a/maintenance/language/checkDupeMessages.php
+++ b/maintenance/language/checkDupeMessages.php
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../commandLine.inc' );
+require_once __DIR__ . '/../commandLine.inc';
 $messagesDir = __DIR__ . '/../../languages/messages/';
 $runTest = false;
 $run = false;
@@ -52,7 +52,7 @@ Options:
 	* mode:  Output format, can be either:
 		* text:   Text output on the console (default)
 		* wiki:   Wiki format, with * at beginning of each line
-		* php:    Output text as PHP syntax in a array $dupeMessages
+		* php:    Output text as PHP syntax in an array named \$dupeMessages
 		* raw:    Raw output for duplicates
 TEXT;
 }
@@ -80,35 +80,37 @@ if ( $run ) {
 	} elseif ( !strcmp( $runMode, 'raw' ) ) {
 		$runMode = 'raw';
 	}
-	include( $messagesFile );
+	include $messagesFile;
 	$messageExist = isset( $messages );
-	if ( $messageExist )
+	if ( $messageExist ) {
 		$wgMessages[$langCode] = $messages;
-	include( $messagesFileC );
+	}
+	include $messagesFileC;
 	$messageCExist = isset( $messages );
-	if ( $messageCExist )
+	if ( $messageCExist ) {
 		$wgMessages[$langCodeC] = $messages;
+	}
 	$count = 0;
 
 	if ( ( $messageExist ) && ( $messageCExist ) ) {
 
 		if ( !strcmp( $runMode, 'php' ) ) {
-			print( "<?php\n" );
-			print( '$dupeMessages = array(' . "\n" );
+			print "<?php\n";
+			print '$dupeMessages = array(' . "\n";
 		}
 		foreach ( $wgMessages[$langCodeC] as $key => $value ) {
 			foreach ( $wgMessages[$langCode] as $ckey => $cvalue ) {
 				if ( !strcmp( $key, $ckey ) ) {
 					if ( ( !strcmp( $key, $ckey ) ) && ( !strcmp( $value, $cvalue ) ) ) {
 						if ( !strcmp( $runMode, 'raw' ) ) {
-							print( "$key\n" );
+							print "$key\n";
 						} elseif ( !strcmp( $runMode, 'php' ) ) {
-							print( "'$key' => '',\n" );
+							print "'$key' => '',\n";
 						} elseif ( !strcmp( $runMode, 'wiki' ) ) {
 							$uKey = ucfirst( $key );
-							print( "* MediaWiki:$uKey/$langCode\n" );
+							print "* MediaWiki:$uKey/$langCode\n";
 						} else {
-							print( "* $key\n" );
+							print "* $key\n";
 						}
 						$count++;
 					}
@@ -116,7 +118,7 @@ if ( $run ) {
 			}
 		}
 		if ( !strcmp( $runMode, 'php' ) ) {
-			print( ");\n" );
+			print ");\n";
 		}
 		if ( !strcmp( $runMode, 'text' ) ) {
 			if ( $count == 1 ) {
@@ -126,9 +128,11 @@ if ( $run ) {
 			}
 		}
 	} else {
-		if ( !$messageExist )
+		if ( !$messageExist ) {
 			echo "There are no messages defined in $langCode.\n";
-		if ( !$messageCExist )
+		}
+		if ( !$messageCExist ) {
 			echo "There are no messages defined in $langCodeC.\n";
+		}
 	}
 }
diff --git a/maintenance/language/checkExtensions.php b/maintenance/language/checkExtensions.php
index ebc62b60..79a4dd98 100644
--- a/maintenance/language/checkExtensions.php
+++ b/maintenance/language/checkExtensions.php
@@ -21,14 +21,14 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../commandLine.inc' );
-require_once( 'languages.inc' );
-require_once( 'checkLanguage.inc' );
+require_once __DIR__ . '/../commandLine.inc';
+require_once 'languages.inc';
+require_once 'checkLanguage.inc';
 
 if ( !class_exists( 'MessageGroups' ) || !class_exists( 'PremadeMediawikiExtensionGroups' ) ) {
 	echo <<<TEXT
 Please add the Translate extension to LocalSettings.php, and enable the extension groups:
-	require_once( 'extensions/Translate/Translate.php' );
+	require_once 'extensions/Translate/Translate.php';
 	\$wgTranslateEC = array_keys( \$wgTranslateAC );
 If you still get this message, update Translate to its latest version.
 
diff --git a/maintenance/language/checkLanguage.inc b/maintenance/language/checkLanguage.inc
index 1860f4a5..4b49ada3 100644
--- a/maintenance/language/checkLanguage.inc
+++ b/maintenance/language/checkLanguage.inc
@@ -25,7 +25,7 @@
  * @ingroup MaintenanceLanguage
  */
 class CheckLanguageCLI {
-	protected $code  = null;
+	protected $code = null;
 	protected $level = 2;
 	protected $doLinks = false;
 	protected $linksPrefix = '';
@@ -46,7 +46,7 @@ class CheckLanguageCLI {
 	public function __construct( array $options ) {
 		if ( isset( $options['help'] ) ) {
 			echo $this->help();
-			exit(1);
+			exit( 1 );
 		}
 
 		if ( isset( $options['lang'] ) ) {
@@ -134,24 +134,24 @@ class CheckLanguageCLI {
 	protected function getChecks() {
 		return array(
 			'untranslated' => 'getUntranslatedMessages',
-			'duplicate'    => 'getDuplicateMessages',
-			'obsolete'     => 'getObsoleteMessages',
-			'variables'    => 'getMessagesWithMismatchVariables',
-			'plural'       => 'getMessagesWithoutPlural',
-			'empty'        => 'getEmptyMessages',
-			'whitespace'   => 'getMessagesWithWhitespace',
-			'xhtml'        => 'getNonXHTMLMessages',
-			'chars'        => 'getMessagesWithWrongChars',
-			'links'        => 'getMessagesWithDubiousLinks',
-			'unbalanced'   => 'getMessagesWithUnbalanced',
-			'namespace'    => 'getUntranslatedNamespaces',
-			'projecttalk'  => 'getProblematicProjectTalks',
-			'magic'        => 'getUntranslatedMagicWords',
-			'magic-old'    => 'getObsoleteMagicWords',
-			'magic-over'   => 'getOverridingMagicWords',
-			'magic-case'   => 'getCaseMismatchMagicWords',
-			'special'      => 'getUntraslatedSpecialPages',
-			'special-old'  => 'getObsoleteSpecialPages',
+			'duplicate' => 'getDuplicateMessages',
+			'obsolete' => 'getObsoleteMessages',
+			'variables' => 'getMessagesWithMismatchVariables',
+			'plural' => 'getMessagesWithoutPlural',
+			'empty' => 'getEmptyMessages',
+			'whitespace' => 'getMessagesWithWhitespace',
+			'xhtml' => 'getNonXHTMLMessages',
+			'chars' => 'getMessagesWithWrongChars',
+			'links' => 'getMessagesWithDubiousLinks',
+			'unbalanced' => 'getMessagesWithUnbalanced',
+			'namespace' => 'getUntranslatedNamespaces',
+			'projecttalk' => 'getProblematicProjectTalks',
+			'magic' => 'getUntranslatedMagicWords',
+			'magic-old' => 'getObsoleteMagicWords',
+			'magic-over' => 'getOverridingMagicWords',
+			'magic-case' => 'getCaseMismatchMagicWords',
+			'special' => 'getUntraslatedSpecialPages',
+			'special-old' => 'getObsoleteSpecialPages',
 		);
 	}
 
@@ -163,14 +163,14 @@ class CheckLanguageCLI {
 	 */
 	protected function getTotalCount() {
 		return array(
-			'namespace'    => array( 'getNamespaceNames', 'en' ),
-			'projecttalk'  => null,
-			'magic'        => array( 'getMagicWords', 'en' ),
-			'magic-old'    => array( 'getMagicWords', null ),
-			'magic-over'   => array( 'getMagicWords', null ),
-			'magic-case'   => array( 'getMagicWords', null ),
-			'special'      => array( 'getSpecialPageAliases', 'en' ),
-			'special-old'  => array( 'getSpecialPageAliases', null ),
+			'namespace' => array( 'getNamespaceNames', 'en' ),
+			'projecttalk' => null,
+			'magic' => array( 'getMagicWords', 'en' ),
+			'magic-old' => array( 'getMagicWords', null ),
+			'magic-over' => array( 'getMagicWords', null ),
+			'magic-case' => array( 'getMagicWords', null ),
+			'special' => array( 'getSpecialPageAliases', 'en' ),
+			'special-old' => array( 'getSpecialPageAliases', null ),
 		);
 	}
 
@@ -181,24 +181,24 @@ class CheckLanguageCLI {
 	protected function getDescriptions() {
 		return array(
 			'untranslated' => '$1 message(s) of $2 are not translated to $3, but exist in en:',
-			'duplicate'    => '$1 message(s) of $2 are translated the same in en and $3:',
-			'obsolete'     => '$1 message(s) of $2 do not exist in en or are in the ignore list, but exist in $3:',
-			'variables'    => '$1 message(s) of $2 in $3 don\'t match the variables used in en:',
-			'plural'       => '$1 message(s) of $2 in $3 don\'t use {{plural}} while en uses:',
-			'empty'        => '$1 message(s) of $2 in $3 are empty or -:',
-			'whitespace'   => '$1 message(s) of $2 in $3 have trailing whitespace:',
-			'xhtml'        => '$1 message(s) of $2 in $3 contain illegal XHTML:',
-			'chars'        => '$1 message(s) of $2 in $3 include hidden chars which should not be used in the messages:',
-			'links'        => '$1 message(s) of $2 in $3 have problematic link(s):',
-			'unbalanced'   => '$1 message(s) of $2 in $3 have unbalanced {[]}:',
-			'namespace'    => '$1 namespace name(s) of $2 are not translated to $3, but exist in en:',
-			'projecttalk'  => '$1 namespace name(s) and alias(es) in $3 are project talk namespaces without the parameter:',
-			'magic'        => '$1 magic word(s) of $2 are not translated to $3, but exist in en:',
-			'magic-old'    => '$1 magic word(s) of $2 do not exist in en, but exist in $3:',
-			'magic-over'   => '$1 magic word(s) of $2 in $3 do not contain the original en word(s):',
-			'magic-case'   => '$1 magic word(s) of $2 in $3 change the case-sensitivity of the original en word:',
-			'special'      => '$1 special page alias(es) of $2 are not translated to $3, but exist in en:',
-			'special-old'  => '$1 special page alias(es) of $2 do not exist in en, but exist in $3:',
+			'duplicate' => '$1 message(s) of $2 are translated the same in en and $3:',
+			'obsolete' => '$1 message(s) of $2 do not exist in en or are in the ignore list, but exist in $3:',
+			'variables' => '$1 message(s) of $2 in $3 don\'t match the variables used in en:',
+			'plural' => '$1 message(s) of $2 in $3 don\'t use {{plural}} while en uses:',
+			'empty' => '$1 message(s) of $2 in $3 are empty or -:',
+			'whitespace' => '$1 message(s) of $2 in $3 have trailing whitespace:',
+			'xhtml' => '$1 message(s) of $2 in $3 contain illegal XHTML:',
+			'chars' => '$1 message(s) of $2 in $3 include hidden chars which should not be used in the messages:',
+			'links' => '$1 message(s) of $2 in $3 have problematic link(s):',
+			'unbalanced' => '$1 message(s) of $2 in $3 have unbalanced {[]}:',
+			'namespace' => '$1 namespace name(s) of $2 are not translated to $3, but exist in en:',
+			'projecttalk' => '$1 namespace name(s) and alias(es) in $3 are project talk namespaces without the parameter:',
+			'magic' => '$1 magic word(s) of $2 are not translated to $3, but exist in en:',
+			'magic-old' => '$1 magic word(s) of $2 do not exist in en, but exist in $3:',
+			'magic-over' => '$1 magic word(s) of $2 in $3 do not contain the original en word(s):',
+			'magic-case' => '$1 magic word(s) of $2 in $3 change the case-sensitivity of the original en word:',
+			'special' => '$1 special page alias(es) of $2 are not translated to $3, but exist in en:',
+			'special-old' => '$1 special page alias(es) of $2 do not exist in en, but exist in $3:',
 		);
 	}
 
@@ -222,7 +222,7 @@ Parameters:
 	--links: Link the message values (default off).
 	--prefix: prefix to add to links.
 	--wikilang: For the links, what is the content language of the wiki to display the output in (default en).
-	--noexif: Do not check for EXIF messages (a bit hard and boring to translate), if you know
+	--noexif: Do not check for Exif messages (a bit hard and boring to translate), if you know
 		that they are currently not translated and want to focus on other problems (default off).
 	--whitelist: Do only the following checks (form: code,code).
 	--blacklist: Do not do the following checks (form: code,code).
@@ -299,6 +299,7 @@ ENDS;
 	 */
 	protected function getCheckBlacklist() {
 		global $checkBlacklist;
+
 		return $checkBlacklist;
 	}
 
@@ -313,6 +314,7 @@ ENDS;
 		$results = array();
 		if ( $this->level === 0 ) {
 			$this->L->getMessages( $code );
+
 			return $results;
 		}
 
@@ -320,7 +322,8 @@ ENDS;
 		$checkBlacklist = $this->getCheckBlacklist();
 		foreach ( $this->checks as $check ) {
 			if ( isset( $checkBlacklist[$code] ) &&
-				in_array( $check, $checkBlacklist[$code] ) ) {
+				in_array( $check, $checkBlacklist[$code] )
+			) {
 				$results[$check] = array();
 				continue;
 			}
@@ -384,7 +387,7 @@ ENDS;
 						echo "[messages are hidden]\n";
 					} else {
 						foreach ( $messages as $key => $value ) {
-							if( !in_array( $check, $this->nonMessageChecks() ) ) {
+							if ( !in_array( $check, $this->nonMessageChecks() ) ) {
 								$key = $this->formatKey( $key, $code );
 							}
 							if ( $this->level == 2 || empty( $value ) ) {
@@ -411,7 +414,7 @@ ENDS;
 			$problems = 0;
 			$detailTextForLangChecks = array();
 			foreach ( $results as $check => $messages ) {
-				if( in_array( $check, $this->nonMessageChecks() ) ) {
+				if ( in_array( $check, $this->nonMessageChecks() ) ) {
 					continue;
 				}
 				$count = count( $messages );
@@ -427,7 +430,6 @@ ENDS;
 				} else {
 					$numbers[] = $count;
 				}
-
 			}
 
 			if ( count( $detailTextForLangChecks ) ) {
@@ -463,13 +465,14 @@ EOL;
 	 * @return bool True if there are any results, false if not.
 	 */
 	protected function isEmpty() {
-		foreach( $this->results as $results ) {
-			foreach( $results as $messages ) {
-				if( !empty( $messages ) ) {
+		foreach ( $this->results as $results ) {
+			foreach ( $results as $messages ) {
+				if ( !empty( $messages ) ) {
 					return false;
 				}
 			}
 		}
+
 		return true;
 	}
 }
@@ -488,7 +491,7 @@ class CheckExtensionsCLI extends CheckLanguageCLI {
 	public function __construct( array $options, $extension ) {
 		if ( isset( $options['help'] ) ) {
 			echo $this->help();
-			exit(1);
+			exit( 1 );
 		}
 
 		if ( isset( $options['lang'] ) ) {
@@ -645,16 +648,16 @@ ENDS;
 	 * @throws MWException
 	 */
 	protected function checkLanguage( $code ) {
-		foreach( $this->extensions as $extension ) {
+		foreach ( $this->extensions as $extension ) {
 			$this->L = $extension;
 			$this->results = array();
 			$this->results[$code] = parent::checkLanguage( $code );
 
-			if( !$this->isEmpty() ) {
+			if ( !$this->isEmpty() ) {
 				echo $extension->name() . ":\n";
 
-				if( $this->level > 0 ) {
-					switch( $this->output ) {
+				if ( $this->level > 0 ) {
+					switch ( $this->output ) {
 						case 'plain':
 							$this->outputText();
 							break;
@@ -675,48 +678,49 @@ ENDS;
 # Blacklist some checks for some languages
 $checkBlacklist = array(
 #'code'        => array( 'check1', 'check2' ... )
-'az'           => array( 'plural' ),
-'bo'           => array( 'plural' ),
-'dz'           => array( 'plural' ),
-'id'           => array( 'plural' ),
-'fa'           => array( 'plural' ),
-'gan'          => array( 'plural' ),
-'gan-hans'     => array( 'plural' ),
-'gan-hant'     => array( 'plural' ),
-'gn'           => array( 'plural' ),
-'hak'          => array( 'plural' ),
-'hu'           => array( 'plural' ),
-'ja'           => array( 'plural' ), // Does not use plural
-'jv'           => array( 'plural' ),
-'ka'           => array( 'plural' ),
-'kk-arab'      => array( 'plural' ),
-'kk-cyrl'      => array( 'plural' ),
-'kk-latn'      => array( 'plural' ),
-'km'           => array( 'plural' ),
-'kn'           => array( 'plural' ),
-'ko'           => array( 'plural' ),
-'lzh'          => array( 'plural' ),
-'mn'           => array( 'plural' ),
-'ms'           => array( 'plural' ),
-'my'           => array( 'plural', 'chars' ),  // Uses a lot zwnj
-'sah'          => array( 'plural' ),
-'sq'           => array( 'plural' ),
-'tet'          => array( 'plural' ),
-'th'           => array( 'plural' ),
-'to'           => array( 'plural' ),
-'tr'           => array( 'plural' ),
-'vi'           => array( 'plural' ),
-'wuu'          => array( 'plural' ),
-'xmf'          => array( 'plural' ),
-'yo'           => array( 'plural' ),
-'yue'          => array( 'plural' ),
-'zh'           => array( 'plural' ),
-'zh-classical' => array( 'plural' ),
-'zh-cn'        => array( 'plural' ),
-'zh-hans'      => array( 'plural' ),
-'zh-hant'      => array( 'plural' ),
-'zh-hk'        => array( 'plural' ),
-'zh-sg'        => array( 'plural' ),
-'zh-tw'        => array( 'plural' ),
-'zh-yue'       => array( 'plural' ),
+	'az' => array( 'plural' ),
+	'bo' => array( 'plural' ),
+	'cdo' => array( 'plural' ),
+	'dz' => array( 'plural' ),
+	'id' => array( 'plural' ),
+	'fa' => array( 'plural' ),
+	'gan' => array( 'plural' ),
+	'gan-hans' => array( 'plural' ),
+	'gan-hant' => array( 'plural' ),
+	'gn' => array( 'plural' ),
+	'hak' => array( 'plural' ),
+	'hu' => array( 'plural' ),
+	'ja' => array( 'plural' ), // Does not use plural
+	'jv' => array( 'plural' ),
+	'ka' => array( 'plural' ),
+	'kk-arab' => array( 'plural' ),
+	'kk-cyrl' => array( 'plural' ),
+	'kk-latn' => array( 'plural' ),
+	'km' => array( 'plural' ),
+	'kn' => array( 'plural' ),
+	'ko' => array( 'plural' ),
+	'lzh' => array( 'plural' ),
+	'mn' => array( 'plural' ),
+	'ms' => array( 'plural' ),
+	'my' => array( 'plural', 'chars' ), // Uses a lot zwnj
+	'sah' => array( 'plural' ),
+	'sq' => array( 'plural' ),
+	'tet' => array( 'plural' ),
+	'th' => array( 'plural' ),
+	'to' => array( 'plural' ),
+	'tr' => array( 'plural' ),
+	'vi' => array( 'plural' ),
+	'wuu' => array( 'plural' ),
+	'xmf' => array( 'plural' ),
+	'yo' => array( 'plural' ),
+	'yue' => array( 'plural' ),
+	'zh' => array( 'plural' ),
+	'zh-classical' => array( 'plural' ),
+	'zh-cn' => array( 'plural' ),
+	'zh-hans' => array( 'plural' ),
+	'zh-hant' => array( 'plural' ),
+	'zh-hk' => array( 'plural' ),
+	'zh-sg' => array( 'plural' ),
+	'zh-tw' => array( 'plural' ),
+	'zh-yue' => array( 'plural' ),
 );
diff --git a/maintenance/language/checkLanguage.php b/maintenance/language/checkLanguage.php
index 99ba4e98..ec6e1226 100644
--- a/maintenance/language/checkLanguage.php
+++ b/maintenance/language/checkLanguage.php
@@ -21,9 +21,9 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../commandLine.inc' );
-require_once( 'checkLanguage.inc' );
-require_once( 'languages.inc' );
+require_once __DIR__ . '/../commandLine.inc';
+require_once 'checkLanguage.inc';
+require_once 'languages.inc';
 
 $cli = new CheckLanguageCLI( $options );
 
diff --git a/maintenance/language/countMessages.php b/maintenance/language/countMessages.php
index 5058a549..95a7154b 100644
--- a/maintenance/language/countMessages.php
+++ b/maintenance/language/countMessages.php
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that counts how many messages we have defined
@@ -59,7 +59,7 @@ class CountMessages extends Maintenance {
 
 	private function getNumMessages( $file ) {
 		// Separate function to limit scope
-		require( $file );
+		require $file;
 		if ( isset( $messages ) ) {
 			return count( $messages );
 		} else {
@@ -69,4 +69,4 @@ class CountMessages extends Maintenance {
 }
 
 $maintClass = "CountMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/date-formats.php b/maintenance/language/date-formats.php
index ed12b786..14634185 100644
--- a/maintenance/language/date-formats.php
+++ b/maintenance/language/date-formats.php
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that tests various language time and date functions.
@@ -79,4 +79,4 @@ class DateFormats extends Maintenance {
 }
 
 $maintClass = "DateFormats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/digit2html.php b/maintenance/language/digit2html.php
index 9d4cbe7e..a6e0456a 100644
--- a/maintenance/language/digit2html.php
+++ b/maintenance/language/digit2html.php
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that check digit transformation.
@@ -49,7 +49,7 @@ class Digit2Html extends Maintenance {
 			$filename = Language::getMessagesFileName( $code );
 			$this->output( "Loading language [$code] ... " );
 			unset( $digitTransformTable );
-			require_once( $filename );
+			require_once $filename;
 			if ( !isset( $digitTransformTable ) ) {
 				$this->error( "\$digitTransformTable not found for lang: $code" );
 				continue;
@@ -66,4 +66,4 @@ class Digit2Html extends Maintenance {
 }
 
 $maintClass = "Digit2Html";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/dumpMessages.php b/maintenance/language/dumpMessages.php
index 0292d314..a72e25b8 100644
--- a/maintenance/language/dumpMessages.php
+++ b/maintenance/language/dumpMessages.php
@@ -23,7 +23,7 @@
  * @todo Make this more useful, right now just dumps $wgContLang
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that dumps an entire language, using the keys from English.
@@ -49,4 +49,4 @@ class DumpMessages extends Maintenance {
 }
 
 $maintClass = "DumpMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/generateCollationData.php b/maintenance/language/generateCollationData.php
index 12823c0c..fcf2c960 100644
--- a/maintenance/language/generateCollationData.php
+++ b/maintenance/language/generateCollationData.php
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ .'/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Generate first letter data files for Collation.php
@@ -102,7 +102,7 @@ class GenerateCollationData extends Maintenance {
 				$error .= "You are using outdated version of ICU ($icuVersion), intended for "
 					. ( $unicodeVersion ? "Unicode $unicodeVersion" : "an unknown version of Unicode" )
 					. "; this file might not be avalaible for it, and it's not supported by MediaWiki. "
-					." You are on your own; consider upgrading PHP's intl extension or try "
+					. " You are on your own; consider upgrading PHP's intl extension or try "
 					. "one of the files available at:";
 			} elseif ( version_compare( $icuVersion, "51.0", ">=" ) ) {
 				// Extra recent version
@@ -386,7 +386,7 @@ class UcdXmlReader {
 		$this->xml = new XMLReader;
 		$this->xml->open( $this->fileName );
 		if ( !$this->xml ) {
-			throw new MWException( __METHOD__.": unable to open {$this->fileName}" );
+			throw new MWException( __METHOD__ . ": unable to open {$this->fileName}" );
 		}
 		while ( $this->xml->name !== 'ucd' && $this->xml->read() );
 		$this->xml->read();
@@ -466,4 +466,4 @@ class UcdXmlReader {
 }
 
 $maintClass = 'GenerateCollationData';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/generateNormalizerData.php b/maintenance/language/generateNormalizerData.php
index c03162c4..216445e4 100644
--- a/maintenance/language/generateNormalizerData.php
+++ b/maintenance/language/generateNormalizerData.php
@@ -21,9 +21,9 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../../includes/normal/UtfNormalUtil.php' );
+require_once __DIR__ . '/../../includes/normal/UtfNormalUtil.php';
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Generates normalizer data files for Arabic and Malayalam.
@@ -156,4 +156,4 @@ class GenerateNormalizerData extends Maintenance {
 }
 
 $maintClass = 'GenerateNormalizerData';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/langmemusage.php b/maintenance/language/langmemusage.php
index ad29efb2..14485f98 100644
--- a/maintenance/language/langmemusage.php
+++ b/maintenance/language/langmemusage.php
@@ -22,8 +22,8 @@
  */
 
 /** This is a command line script */
-require_once( __DIR__ . '/../Maintenance.php' );
-require_once( __DIR__ . '/languages.inc' );
+require_once __DIR__ . '/../Maintenance.php';
+require_once __DIR__ . '/languages.inc';
 
 /**
  * Maintenance script that tries to get the memory usage for each language file.
@@ -39,8 +39,9 @@ class LangMemUsage extends Maintenance {
 	}
 
 	public function execute() {
-		if ( !function_exists( 'memory_get_usage' ) )
+		if ( !function_exists( 'memory_get_usage' ) ) {
 			$this->error( "You must compile PHP with --enable-memory-limit", true );
+		}
 
 		$langtool = new languages();
 		$memlast = $memstart = memory_get_usage();
@@ -61,4 +62,4 @@ class LangMemUsage extends Maintenance {
 }
 
 $maintClass = "LangMemUsage";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/language/languages.inc b/maintenance/language/languages.inc
index dcd9b9b4..6070f4ab 100644
--- a/maintenance/language/languages.inc
+++ b/maintenance/language/languages.inc
@@ -43,10 +43,10 @@ class languages {
 	 * Load the list of languages: all the Messages*.php
 	 * files in the languages directory.
 	 *
-	 * @param $exif bool Treat the EXIF messages?
+	 * @param $exif bool Treat the Exif messages?
 	 */
 	function __construct( $exif = true ) {
-		require( __DIR__ . '/messageTypes.inc' );
+		require __DIR__ . '/messageTypes.inc';
 		$this->mIgnoredMessages = $wgIgnoredMessages;
 		if ( $exif ) {
 			$this->mOptionalMessages = array_merge( $wgOptionalMessages );
@@ -107,7 +107,7 @@ class languages {
 		$this->mSpecialPageAliases[$code] = array();
 		$filename = Language::getMessagesFileName( $code );
 		if ( file_exists( $filename ) ) {
-			require( $filename );
+			require $filename;
 			if ( isset( $messages ) ) {
 				$this->mRawMessages[$code] = $messages;
 			}
@@ -154,7 +154,7 @@ class languages {
 			if ( isset( $this->mGeneralMessages['required'][$key] ) ) {
 				$this->mMessages[$code]['required'][$key] = $value;
 				$this->mMessages[$code]['translated'][$key] = $value;
-			} else if ( isset( $this->mGeneralMessages['optional'][$key] ) ) {
+			} elseif ( isset( $this->mGeneralMessages['optional'][$key] ) ) {
 				$this->mMessages[$code]['optional'][$key] = $value;
 				$this->mMessages[$code]['translated'][$key] = $value;
 			} else {
@@ -184,7 +184,7 @@ class languages {
 		foreach ( $this->mGeneralMessages['all'] as $key => $value ) {
 			if ( in_array( $key, $this->mIgnoredMessages ) ) {
 				$this->mGeneralMessages['ignored'][$key] = $value;
-			} else if ( in_array( $key, $this->mOptionalMessages ) ) {
+			} elseif ( in_array( $key, $this->mOptionalMessages ) ) {
 				$this->mGeneralMessages['optional'][$key] = $value;
 				$this->mGeneralMessages['translatable'][$key] = $value;
 			} else {
@@ -466,11 +466,11 @@ class languages {
 			'[POP]' => "\xE2\x80\xAC",
 			'[LRO]' => "\xE2\x80\xAD",
 			'[RLO]' => "\xE2\x80\xAB",
-			'[ZWSP]'=> "\xE2\x80\x8B",
-			'[NBSP]'=> "\xC2\xA0",
-			'[WJ]'  => "\xE2\x81\xA0",
+			'[ZWSP]' => "\xE2\x80\x8B",
+			'[NBSP]' => "\xC2\xA0",
+			'[WJ]' => "\xE2\x81\xA0",
 			'[BOM]' => "\xEF\xBB\xBF",
-			'[FFFD]'=> "\xEF\xBF\xBD",
+			'[FFFD]' => "\xEF\xBF\xBD",
 		);
 		$wrongRegExp = '/(' . implode( '|', array_values( $wrongChars ) ) . ')/sDu';
 		$wrongCharsMessages = array();
@@ -500,8 +500,8 @@ class languages {
 		foreach ( $this->mMessages[$code]['translated'] as $key => $value ) {
 			$matches = array();
 			preg_match_all( "/\[\[([{$tc}]+)(?:\\|(.+?))?]]/sDu", $value, $matches );
-			for ($i = 0; $i < count($matches[0]); $i++ ) {
-				if ( preg_match( "/.*project.*/isDu",  $matches[1][$i] ) ) {
+			for ( $i = 0; $i < count( $matches[0] ); $i++ ) {
+				if ( preg_match( "/.*project.*/isDu", $matches[1][$i] ) ) {
 					$messages[$key][] = $matches[0][$i];
 				}
 			}
@@ -563,7 +563,9 @@ class languages {
 		$this->loadFile( 'en' );
 		$this->loadFile( $code );
 		$namespacesDiff = array_diff_key( $this->mNamespaceNames['en'], $this->mNamespaceNames[$code] );
-		if ( isset( $namespacesDiff[NS_MAIN] ) ) unset( $namespacesDiff[NS_MAIN] );
+		if ( isset( $namespacesDiff[NS_MAIN] ) ) {
+			unset( $namespacesDiff[NS_MAIN] );
+		}
 		return $namespacesDiff;
 	}
 
@@ -579,7 +581,7 @@ class languages {
 		$namespaces = array();
 
 		# Check default namespace name
-		if( isset( $this->mNamespaceNames[$code][NS_PROJECT_TALK] ) ) {
+		if ( isset( $this->mNamespaceNames[$code][NS_PROJECT_TALK] ) ) {
 			$default = $this->mNamespaceNames[$code][NS_PROJECT_TALK];
 			if ( strpos( $default, '$1' ) === false ) {
 				$namespaces[$default] = 'default';
@@ -587,7 +589,7 @@ class languages {
 		}
 
 		# Check namespace aliases
-		foreach( $this->mNamespaceAliases[$code] as $key => $value ) {
+		foreach ( $this->mNamespaceAliases[$code] as $key => $value ) {
 			if ( $value == NS_PROJECT_TALK && strpos( $key, '$1' ) === false ) {
 				$namespaces[$key] = '';
 			}
@@ -758,9 +760,9 @@ class extensionLanguages extends languages {
 	 * @param $code string The language code.
 	 */
 	protected function loadFile( $code ) {
-		if( !isset( $this->mRawMessages[$code] ) ) {
+		if ( !isset( $this->mRawMessages[$code] ) ) {
 			$this->mRawMessages[$code] = $this->mMessageGroup->load( $code );
-			if( empty( $this->mRawMessages[$code] ) ) {
+			if ( empty( $this->mRawMessages[$code] ) ) {
 				$this->mRawMessages[$code] = array();
 			}
 		}
diff --git a/maintenance/language/messageTypes.inc b/maintenance/language/messageTypes.inc
index 66cc1dcc..8676d741 100644
--- a/maintenance/language/messageTypes.inc
+++ b/maintenance/language/messageTypes.inc
@@ -96,7 +96,6 @@ $wgIgnoredMessages = array(
 	'talkpageheader',
 	'anonnotice',
 	'autoblock_whitelist',
-	'searchmenu-help',
 	'searchmenu-new-nocreate',
 	'googlesearch',
 	'opensearch-desc',
@@ -142,6 +141,7 @@ $wgIgnoredMessages = array(
 	'statistics-footer',
 	'talkpagetext',
 	'uploadfooter',
+	'upload-default-description',
 	'listgrouprights-link',
 	'search-interwiki-custom',
 	'allpages-summary',
@@ -224,6 +224,8 @@ $wgIgnoredMessages = array(
 	'deletedarticle',
 	// 'uploadedimage',
 	// 'overwroteimage',
+	'createacct-helpusername',
+	'createacct-imgcaptcha-help',
 	'userlogout-summary',
 	'changeemail-summary',
 	'changepassword-summary',
@@ -242,18 +244,29 @@ $wgIgnoredMessages = array(
 	'version-summary',
 	'tags-summary',
 	'comparepages-summary',
+	'resettokens-summary',
 	'version-entrypoints-index-php',
 	'version-entrypoints-api-php',
 	'version-entrypoints-load-php',
 	'ipb-default-expiry',
 	'pageinfo-header',
 	'pageinfo-footer',
+	'createacct-benefit-head1',
+	'createacct-benefit-icon1',
+	'createacct-benefit-head2',
+	'createacct-benefit-icon2',
+	'createacct-benefit-head3',
+	'createacct-benefit-icon3',
+	'today-at',
+	'redirect-text',
+	'edithelppage',
+	'autocomment-prefix',
+	'move-redirect-text',
 );
 
 /** Optional messages, which may be translated only if changed in the target language. */
 $wgOptionalMessages = array(
 	'linkprefix',
-	'editsection-brackets',
 	'feed-atom',
 	'feed-rss',
 	'unit-pixel',
@@ -297,40 +310,24 @@ $wgOptionalMessages = array(
 	'resetpass_text',
 	'image_sample',
 	'media_sample',
-	'skinname-standard',
-	'skinname-nostalgia',
 	'skinname-cologneblue',
 	'skinname-monobook',
-	'skinname-myskin',
-	'skinname-chick',
-	'skinname-simple',
 	'skinname-modern',
 	'skinname-vector',
 	'common.css',
-	'standard.css',
-	'nostalgia.css',
 	'cologneblue.css',
 	'monobook.css',
-	'myskin.css',
-	'chick.css',
-	'simple.css',
 	'modern.css',
 	'vector.css',
 	'print.css',
-	'handheld.css',
 	'noscript.css',
 	'group-autoconfirmed.css',
 	'group-bot.css',
 	'group-sysop.css',
 	'group-bureaucrat.css',
 	'common.js',
-	'standard.js',
-	'nostalgia.js',
 	'cologneblue.js',
 	'monobook.js',
-	'myskin.js',
-	'chick.js',
-	'simple.js',
 	'modern.js',
 	'vector.js',
 	'group-autoconfirmed.js',
@@ -460,7 +457,6 @@ $wgOptionalMessages = array(
 	'percent',
 	'parentheses',
 	'brackets',
-	'autocomment-prefix',
 	'listgrouprights-right-display',
 	'listgrouprights-right-revoked',
 	'timezone-utc',
@@ -485,9 +481,14 @@ $wgOptionalMessages = array(
 	'pageinfo-redirects-value',
 	'created', // @deprecated. Remove in MediaWiki 1.23.
 	'changed', // @deprecated. Remove in MediaWiki 1.23.
+	'limitreport-ppvisitednodes-value',
+	'limitreport-ppgeneratednodes-value',
+	'limitreport-expansiondepth-value',
+	'limitreport-expensivefunctioncount-value',
+	'tooltip-iwiki',
 );
 
-/** EXIF messages, which may be set as optional in several checks, but are generally mandatory */
+/** Exif messages, which may be set as optional in several checks, but are generally mandatory */
 $wgEXIFMessages = array(
 	'exif-imagewidth',
 	'exif-imagelength',
diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc
index c2d5847d..5e8e9744 100644
--- a/maintenance/language/messages.inc
+++ b/maintenance/language/messages.inc
@@ -56,9 +56,6 @@ $wgMessageStructure = array(
 		'tog-shownumberswatching',
 		'tog-oldsig',
 		'tog-fancysig',
-		'tog-externaleditor',
-		'tog-externaldiff',
-		'tog-showjumplinks',
 		'tog-uselivepreview',
 		'tog-forceeditsummary',
 		'tog-watchlisthideown',
@@ -72,6 +69,8 @@ $wgMessageStructure = array(
 		'tog-showhiddencats',
 		'tog-noconvertlink',
 		'tog-norollbackdiff',
+		'tog-useeditwarning',
+		'tog-prefershttps'
 	),
 	'underline' => array(
 		'underline-always',
@@ -136,6 +135,18 @@ $wgMessageStructure = array(
 		'oct',
 		'nov',
 		'dec',
+		'january-date',
+		'february-date',
+		'march-date',
+		'april-date',
+		'may-date',
+		'june-date',
+		'july-date',
+		'august-date',
+		'september-date',
+		'october-date',
+		'november-date',
+		'december-date',
 	),
 	'categorypages' => array(
 		'pagecategories',
@@ -226,6 +237,7 @@ $wgMessageStructure = array(
 		'create-this-page',
 		'delete',
 		'deletethispage',
+		'undeletethispage',
 		'undelete_short',
 		'viewdeleted_short',
 		'protect',
@@ -313,7 +325,6 @@ $wgMessageStructure = array(
 		'youhavenewmessagesmulti',
 		'newtalkseparator',
 		'editsection',
-		'editsection-brackets',
 		'editold',
 		'viewsourceold',
 		'editlink',
@@ -366,8 +377,11 @@ $wgMessageStructure = array(
 	'errors' => array(
 		'error',
 		'databaseerror',
-		'dberrortext',
-		'dberrortextcl',
+		'databaseerror-text',
+		'databaseerror-textcl',
+		'databaseerror-query',
+		'databaseerror-function',
+		'databaseerror-error',
 		'laggedslavemode',
 		'readonly',
 		'enterlockreason',
@@ -392,6 +406,7 @@ $wgMessageStructure = array(
 		'cannotdelete',
 		'cannotdelete-title',
 		'delete-hook-aborted',
+		'no-null-revision',
 		'badtitle',
 		'badtitletext',
 		'perfcached',
@@ -407,11 +422,14 @@ $wgMessageStructure = array(
 		'viewyourtext',
 		'protectedinterface',
 		'editinginterface',
-		'sqlhidden',
 		'cascadeprotected',
 		'namespaceprotected',
 		'customcssprotected',
 		'customjsprotected',
+		'mycustomcssprotected',
+		'mycustomjsprotected',
+		'myprivateinfoprotected',
+		'mypreferencesprotected',
 		'ns-specialprotected',
 		'titleprotected',
 		'filereadonlyerror',
@@ -430,10 +448,20 @@ $wgMessageStructure = array(
 		'welcomeuser',
 		'welcomecreation-msg',
 		'yourname',
+		'userlogin-yourname',
+		'userlogin-yourname-ph',
+		'createacct-another-username-ph',
+		'createacct-helpusername',
 		'yourpassword',
+		'userlogin-yourpassword',
+		'userlogin-yourpassword-ph',
+		'createacct-yourpassword-ph',
 		'yourpasswordagain',
+		'createacct-yourpasswordagain',
+		'createacct-yourpasswordagain-ph',
 		'remembermypassword',
-		'securelogin-stick-https',
+		'userlogin-remembermypassword',
+		'userlogin-signwithsecure',
 		'yourdomainname',
 		'password-change-forbidden',
 		'externaldberror',
@@ -446,17 +474,49 @@ $wgMessageStructure = array(
 		'userlogout',
 		'userlogout-summary',
 		'notloggedin',
+		'userlogin-noaccount',
+		'userlogin-joinproject',
 		'nologin',
 		'nologinlink',
 		'createaccount',
 		'gotaccount',
 		'gotaccountlink',
 		'userlogin-resetlink',
+		'userlogin-resetpassword-link',
+		'helplogin-url',
+		'userlogin-helplink',
+		'userlogin-loggedin',
+		'userlogin-createanother',
+		'createacct-join',
+		'createacct-another-join',
+		'createacct-emailrequired',
+		'createacct-emailoptional',
+		'createacct-email-ph',
+		'createacct-another-email-ph',
 		'createaccountmail',
+		'createacct-realname',
 		'createaccountreason',
+		'createacct-reason',
+		'createacct-reason-ph',
+		'createacct-captcha',
+		'createacct-imgcaptcha-help',
+		'createacct-imgcaptcha-ph',
+		'createacct-submit',
+		'createacct-another-submit',
+		'createacct-benefit-heading',
+		'createacct-benefit-icon1',
+		'createacct-benefit-head1',
+		'createacct-benefit-body1',
+		'createacct-benefit-icon2',
+		'createacct-benefit-head2',
+		'createacct-benefit-body2',
+		'createacct-benefit-icon3',
+		'createacct-benefit-head3',
+		'createacct-benefit-body3',
 		'badretype',
 		'userexists',
 		'loginerror',
+		'createacct-error',
 		'createaccounterror',
 		'nocookiesnew',
 		'nocookieslogin',
@@ -508,6 +568,7 @@ $wgMessageStructure = array(
 		'loginlanguagelabel',
 		'loginlanguagelinks',
 		'suspicious-userlogout',
+		'createacct-another-realname-tip',
 	),
 	'mail' => array(
 		'pear-mail-error',
@@ -525,7 +586,7 @@ $wgMessageStructure = array(
 		'newpassword',
 		'retypenew',
 		'resetpass_submit',
-		'resetpass_success',
+		'changepassword-success',
 		'resetpass_forbidden',
 		'resetpass-no-info',
 		'resetpass-submit-loggedin',
@@ -536,10 +597,11 @@ $wgMessageStructure = array(
 	),
 	'passwordreset' => array(
 		'passwordreset',
-		'passwordreset-text',
+		'passwordreset-text-one',
+		'passwordreset-text-many',
 		'passwordreset-legend',
 		'passwordreset-disabled',
-		'passwordreset-pretext',
+		'passwordreset-emaildisabled',
 		'passwordreset-username',
 		'passwordreset-domain',
 		'passwordreset-capture',
@@ -566,6 +628,18 @@ $wgMessageStructure = array(
 		'changeemail-submit',
 		'changeemail-cancel',
 	),
+	'resettokens' => array(
+		'resettokens',
+		'resettokens-summary',
+		'resettokens-text',
+		'resettokens-no-tokens',
+		'resettokens-legend',
+		'resettokens-tokens',
+		'resettokens-token-label',
+		'resettokens-watchlist-token',
+		'resettokens-done',
+		'resettokens-resetbutton',
+	),
 	'toolbar' => array(
 		'bold_sample',
 		'bold_tip',
@@ -689,6 +763,7 @@ $wgMessageStructure = array(
 		'edit-gone-missing',
 		'edit-conflict',
 		'edit-no-change',
+		'postedit-confirmation',
 		'edit-already-exists',
 		'addsection-preload',
 		'addsection-editintro',
@@ -696,6 +771,7 @@ $wgMessageStructure = array(
 		'content-failed-to-parse',
 		'invalid-content-data',
 		'content-not-allowed-here',
+		'editwarning-warning',
 	),
 	'contentmodels' => array(
 		'content-model-wikitext',
@@ -726,6 +802,7 @@ $wgMessageStructure = array(
 		'undo-failure',
 		'undo-norev',
 		'undo-summary',
+		'undo-summary-username-hidden',
 	),
 	'cantcreateaccount' => array(
 		'cantcreateaccounttitle',
@@ -874,6 +951,7 @@ $wgMessageStructure = array(
 		'compareselectedversions',
 		'showhideselectedversions',
 		'editundo',
+		'diff-empty',
 		'diff-multi',
 		'diff-multi-manyusers',
 		'difference-missing-revision',
@@ -900,9 +978,7 @@ $wgMessageStructure = array(
 		'searchmenu-exists',
 		'searchmenu-new',
 		'searchmenu-new-nocreate',
-		'searchhelp-url',
 		'searchmenu-prefix',
-		'searchmenu-help',
 		'searchprofile-articles',
 		'searchprofile-project',
 		'searchprofile-images',
@@ -944,19 +1020,11 @@ $wgMessageStructure = array(
 		'search-external',
 		'searchdisabled',
 		'googlesearch',
+		'search-error',
 	),
 	'opensearch' => array(
 		'opensearch-desc',
 	),
-	'quickbar' => array(
-		'qbsettings',
-		'qbsettings-none',
-		'qbsettings-fixedleft',
-		'qbsettings-fixedright',
-		'qbsettings-floatingleft',
-		'qbsettings-floatingright',
-		'qbsettings-directionality',
-	),
 	'preferences' => array(
 		'preferences',
 		'preferences-summary',
@@ -991,7 +1059,6 @@ $wgMessageStructure = array(
 		'resetprefs',
 		'restoreprefs',
 		'prefs-editing',
-		'prefs-edit-boxsize',
 		'rows',
 		'columns',
 		'searchresultshead',
@@ -1002,7 +1069,7 @@ $wgMessageStructure = array(
 		'recentchangesdays-max',
 		'recentchangescount',
 		'prefs-help-recentchangescount',
-		'prefs-help-watchlist-token',
+		'prefs-help-watchlist-token2',
 		'savedprefs',
 		'timezonelegend',
 		'localtime',
@@ -1033,7 +1100,6 @@ $wgMessageStructure = array(
 		'prefs-common-css-js',
 		'prefs-reset-intro',
 		'prefs-emailconfirm-label',
-		'prefs-textboxsize',
 		'youremail',
 		'username',
 		'uid',
@@ -1068,6 +1134,8 @@ $wgMessageStructure = array(
 		'prefs-dateformat',
 		'prefs-timeoffset',
 		'prefs-advancedediting',
+		'prefs-editor',
+		'prefs-preview',
 		'prefs-advancedrc',
 		'prefs-advancedrendering',
 		'prefs-advancedsearchoptions',
@@ -1075,7 +1143,9 @@ $wgMessageStructure = array(
 		'prefs-displayrc',
 		'prefs-displaysearchoptions',
 		'prefs-displaywatchlist',
+		'prefs-tokenwatchlist',
 		'prefs-diffs',
+		'prefs-help-prefershttps',
 	),
 	'preferences-email' => array(
 		'email-address-validity-valid',
@@ -1102,6 +1172,8 @@ $wgMessageStructure = array(
 		'userrights-changeable-col',
 		'userrights-unchangeable-col',
 		'userrights-irreversible-marker',
+		'userrights-conflict',
+		'userrights-removed-self',
 	),
 	'group' => array(
 		'group',
@@ -1170,10 +1242,18 @@ $wgMessageStructure = array(
 		'right-unblockself',
 		'right-protect',
 		'right-editprotected',
+		'right-editsemiprotected',
 		'right-editinterface',
 		'right-editusercssjs',
 		'right-editusercss',
 		'right-edituserjs',
+		'right-editmyusercss',
+		'right-editmyuserjs',
+		'right-viewmywatchlist',
+		'right-editmywatchlist',
+		'right-viewmyprivateinfo',
+		'right-editmyprivateinfo',
+		'right-editmyoptions',
 		'right-rollback',
 		'right-markbotedits',
 		'right-noratelimit',
@@ -1235,14 +1315,21 @@ $wgMessageStructure = array(
 		'action-userrights-interwiki',
 		'action-siteadmin',
 		'action-sendemail',
+		'action-editmywatchlist',
+		'action-viewmywatchlist',
+		'action-viewmyprivateinfo',
+		'action-editmyprivateinfo',
 	),
 	'recentchanges' => array(
 		'nchanges',
+		'enhancedrc-since-last-visit',
+		'enhancedrc-history',
 		'recentchanges',
 		'recentchanges-url',
 		'recentchanges-legend',
 		'recentchanges-summary',
 		'recentchangestext',
+		'recentchanges-noresult',
 		'recentchanges-feed-description',
 		'recentchanges-label-newpage',
 		'recentchanges-label-minor',
@@ -1282,7 +1369,6 @@ $wgMessageStructure = array(
 		'recentchangeslinked-feed',
 		'recentchangeslinked-toolbox',
 		'recentchangeslinked-title',
-		'recentchangeslinked-noresult',
 		'recentchangeslinked-summary',
 		'recentchangeslinked-page',
 		'recentchangeslinked-to',
@@ -1304,6 +1390,7 @@ $wgMessageStructure = array(
 		'upload-preferred',
 		'upload-prohibited',
 		'uploadfooter',
+		'upload-default-description',
 		'uploadlog',
 		'uploadlogpage',
 		'uploadlogpagetext',
@@ -1481,7 +1568,6 @@ $wgMessageStructure = array(
 		'http-read-error',
 		'http-timed-out',
 		'http-curl-error',
-		'http-host-unreachable',
 		'http-bad-status',
 	),
 
@@ -1512,6 +1598,10 @@ $wgMessageStructure = array(
 		'listfiles_size',
 		'listfiles_description',
 		'listfiles_count',
+		'listfiles-show-all',
+		'listfiles-latestversion',
+		'listfiles-latestversion-yes',
+		'listfiles-latestversion-no',
 	),
 	'filedescription' => array(
 		'file-anchor-link',
@@ -1605,6 +1695,13 @@ $wgMessageStructure = array(
 		'randompage-nopages',
 		'randompage-url',
 	),
+	'randomincategory' => array(
+		'randomincategory',
+		'randomincategory-invalidcategory',
+		'randomincategory-nopages',
+		'randomincategory-selectcategory',
+		'randomincategory-selectcategory-submit',
+	),
 	'randomredirect' => array(
 		'randomredirect',
 		'randomredirect-nopages',
@@ -1632,12 +1729,6 @@ $wgMessageStructure = array(
 		'statistics-mostpopular',
 		'statistics-footer',
 	),
-	'disambiguations' => array(
-		'disambiguations',
-		'disambiguations-summary',
-		'disambiguationspage',
-		'disambiguations-text',
-	),
 	'pageswithprop' => array(
 		'pageswithprop',
 		'pageswithprop-summary',
@@ -1645,6 +1736,8 @@ $wgMessageStructure = array(
 		'pageswithprop-text',
 		'pageswithprop-prop',
 		'pageswithprop-submit',
+		'pageswithprop-prophidden-long',
+		'pageswithprop-prophidden-binary',
 	),
 	'doubleredirects' => array(
 		'doubleredirects',
@@ -1728,6 +1821,7 @@ $wgMessageStructure = array(
 		'prefixindex',
 		'prefixindex-namespace',
 		'prefixindex-summary',
+		'prefixindex-strip',
 		'shortpages',
 		'shortpages-summary',
 		'longpages',
@@ -1749,6 +1843,7 @@ $wgMessageStructure = array(
 		'listusers-summary',
 		'listusers-editsonly',
 		'listusers-creationsort',
+		'listusers-desc',
 		'usereditcount',
 		'usercreated',
 		'newpages',
@@ -1934,7 +2029,6 @@ $wgMessageStructure = array(
 		'unwatchthispage',
 		'notanarticle',
 		'notvisiblerev',
-		'watchnochange',
 		'watchlist-details',
 		'wlheader-enotif',
 		'wlheader-showupdated',
@@ -2284,14 +2378,12 @@ $wgMessageStructure = array(
 		'ipb_blocked_as_range',
 		'ip_range_invalid',
 		'ip_range_toolarge',
-		'blockme',
 		'proxyblocker',
-		'proxyblocker-disabled',
 		'proxyblockreason',
-		'proxyblocksuccess',
 		'sorbs',
 		'sorbsreason',
 		'sorbs_create_account_reason',
+		'xffblockreason',
 		'cant-block-while-blocked',
 		'cant-see-hidden-user',
 		'ipbblocked',
@@ -2355,6 +2447,7 @@ $wgMessageStructure = array(
 		'movesubpagetext',
 		'movenosubpage',
 		'movereason',
+		'move-redirect-text',
 		'revertmove',
 		'delete_and_move',
 		'delete_and_move_text',
@@ -2416,6 +2509,7 @@ $wgMessageStructure = array(
 		'thumbnail-more',
 		'filemissing',
 		'thumbnail_error',
+		'thumbnail_error_remote',
 		'djvu_page_error',
 		'djvu_no_xml',
 		'thumbnail-temp-create',
@@ -2488,7 +2582,7 @@ $wgMessageStructure = array(
 		'javascripttest-pagetext-noframework',
 		'javascripttest-pagetext-unknownframework',
 		'javascripttest-pagetext-frameworks',
-		'javascripttest-pagetext-skins' ,
+		'javascripttest-pagetext-skins',
 		'javascripttest-qunit-name',
 		'javascripttest-qunit-intro',
 		'javascripttest-qunit-heading',
@@ -2633,20 +2727,15 @@ $wgMessageStructure = array(
 		'tooltip-undo',
 		'tooltip-preferences-save',
 		'tooltip-summary',
+		'interlanguage-link-title',
 	),
 	'stylesheets' => array(
 		'common.css',
-		'standard.css',
-		'nostalgia.css',
 		'cologneblue.css',
 		'monobook.css',
-		'myskin.css',
-		'chick.css',
-		'simple.css',
 		'modern.css',
 		'vector.css',
 		'print.css',
-		'handheld.css',
 		'noscript.css',
 		'group-autoconfirmed.css',
 		'group-bot.css',
@@ -2655,13 +2744,8 @@ $wgMessageStructure = array(
 	),
 	'scripts' => array(
 		'common.js',
-		'standard.js',
-		'nostalgia.js',
 		'cologneblue.js',
 		'monobook.js',
-		'myskin.js',
-		'chick.js',
-		'simple.js',
 		'modern.js',
 		'vector.js',
 		'group-autoconfirmed.js',
@@ -2692,6 +2776,7 @@ $wgMessageStructure = array(
 		'spam_reverting',
 		'spam_blanking',
 		'spam_deleting',
+		'simpleantispam-label',
 	),
 	'info' => array(
 		'pageinfo-header',
@@ -2743,13 +2828,8 @@ $wgMessageStructure = array(
 		'pageinfo-category-files'
 	),
 	'skin' => array(
-		'skinname-standard',
-		'skinname-nostalgia',
 		'skinname-cologneblue',
 		'skinname-monobook',
-		'skinname-myskin',
-		'skinname-chick',
-		'skinname-simple',
 		'skinname-modern',
 		'skinname-vector',
 	),
@@ -2832,11 +2912,26 @@ $wgMessageStructure = array(
 		'minutes',
 		'hours',
 		'days',
+		'weeks',
 		'months',
 		'years',
 		'ago',
 		'just-now',
 	),
+	'human-timestamps' => array(
+		'hours-ago',
+		'minutes-ago',
+		'seconds-ago',
+		'monday-at',
+		'tuesday-at',
+		'wednesday-at',
+		'thursday-at',
+		'friday-at',
+		'saturday-at',
+		'sunday-at',
+		'today-at',
+		'yesterday-at',
+	),
 	'badimagelist' => array(
 		'bad_image_list',
 	),
@@ -3192,16 +3287,16 @@ $wgMessageStructure = array(
 		'exif-lightsource-255',
 	),
 	'exif-flash' => array(
-		'exif-flash-fired-0' ,
-		'exif-flash-fired-1' ,
-		'exif-flash-return-0' ,
-		'exif-flash-return-2' ,
-		'exif-flash-return-3' ,
-		'exif-flash-mode-1' ,
-		'exif-flash-mode-2' ,
-		'exif-flash-mode-3' ,
-		'exif-flash-function-1' ,
-		'exif-flash-redeye-1' ,
+		'exif-flash-fired-0',
+		'exif-flash-fired-1',
+		'exif-flash-return-0',
+		'exif-flash-return-2',
+		'exif-flash-return-3',
+		'exif-flash-mode-1',
+		'exif-flash-mode-2',
+		'exif-flash-mode-3',
+		'exif-flash-function-1',
+		'exif-flash-redeye-1',
 	),
 	'exif-focalplaneresolutionunit' => array(
 		'exif-focalplaneresolutionunit-2',
@@ -3596,7 +3691,6 @@ $wgMessageStructure = array(
 		'version-other',
 		'version-mediahandlers',
 		'version-hooks',
-		'version-extension-functions',
 		'version-parser-extensiontags',
 		'version-parser-function-hooks',
 		'version-hook-name',
@@ -3606,6 +3700,7 @@ $wgMessageStructure = array(
 		'version-license',
 		'version-poweredby-credits',
 		'version-poweredby-others',
+		'version-poweredby-translators',
 		'version-credits-summary',
 		'version-license-info',
 		'version-software',
@@ -3620,11 +3715,18 @@ $wgMessageStructure = array(
 		'version-entrypoints-api-php',
 		'version-entrypoints-load-php',
 	),
-	'filepath' => array(
-		'filepath',
-		'filepath-page',
-		'filepath-submit',
-		'filepath-summary',
+	'redirect' => array(
+		'redirect',
+		'redirect-legend',
+		'redirect-text',
+		'redirect-summary',
+		'redirect-submit',
+		'redirect-lookup',
+		'redirect-value',
+		'redirect-user',
+		'redirect-revision',
+		'redirect-file',
+		'redirect-not-exists',
 	),
 	'fileduplicatesearch' => array(
 		'fileduplicatesearch',
@@ -3666,12 +3768,16 @@ $wgMessageStructure = array(
 		'tags-summary',
 		'tag-filter',
 		'tag-filter-submit',
+		'tag-list-wrapper',
 		'tags-title',
 		'tags-intro',
 		'tags-tag',
 		'tags-display-header',
 		'tags-description-header',
+		'tags-active-header',
 		'tags-hitcount-header',
+		'tags-active-yes',
+		'tags-active-no',
 		'tags-edit',
 		'tags-hitcount',
 	),
@@ -3693,6 +3799,7 @@ $wgMessageStructure = array(
 		'dberr-problems',
 		'dberr-again',
 		'dberr-info',
+		'dberr-info-hidden',
 		'dberr-usegoogle',
 		'dberr-outofdate',
 		'dberr-cachederror',
@@ -3708,6 +3815,9 @@ $wgMessageStructure = array(
 		'htmlform-submit',
 		'htmlform-reset',
 		'htmlform-selectorother-other',
+		'htmlform-no',
+		'htmlform-yes',
+		'htmlform-chosen-placeholder',
 	),
 	'sqlite' => array(
 		'sqlite-has-fts',
@@ -3856,6 +3966,25 @@ $wgMessageStructure = array(
 	'rotation' => array(
 		'rotate-comment',
 	),
+	'limitreport' => array(
+		'limitreport-title',
+		'limitreport-cputime',
+		'limitreport-cputime-value',
+		'limitreport-walltime',
+		'limitreport-walltime-value',
+		'limitreport-ppvisitednodes',
+		'limitreport-ppvisitednodes-value',
+		'limitreport-ppgeneratednodes',
+		'limitreport-ppgeneratednodes-value',
+		'limitreport-postexpandincludesize',
+		'limitreport-postexpandincludesize-value',
+		'limitreport-templateargumentsize',
+		'limitreport-templateargumentsize-value',
+		'limitreport-expansiondepth',
+		'limitreport-expansiondepth-value',
+		'limitreport-expensivefunctioncount',
+		'limitreport-expensivefunctioncount-value',
+	),
 );
 
 /** Comments for each block */
@@ -3864,8 +3993,8 @@ $wgBlockComments = array(
 begin with * or ** are discarded, furthermore lines that do begin with ** and
 do not contain | are also discarded, but do not depend on this behavior for
 future releases. Also note that since each list value is wrapped in a unique
-XHTML id it should only appear once and include characters that are legal
-XHTML id names.",
+(X)HTML id it should only appear once and include characters that are legal
+(X)HTML id names.",
 	'toggles'             => 'User preference toggles',
 	'underline'           => '',
 	'editfont'            => 'Font style option in Special:Preferences',
@@ -3876,7 +4005,7 @@ XHTML id names.",
 	'cologneblue'         => 'Cologne Blue skin',
 	'vector'              => 'Vector skin',
 	'miscellaneous2'      => '',
-	'links'               => 'All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).',
+	'links'               => 'All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage).',
 	'badaccess'           => '',
 	'versionrequired'     => '',
 	'miscellaneous3'      => '',
@@ -3890,6 +4019,7 @@ XHTML id names.",
 	'resetpass'           => 'Change password dialog',
 	'passwordreset'       => 'Special:PasswordReset',
 	'changeemail'         => 'Special:ChangeEmail',
+	'resettokens'         => 'Special:ResetTokens',
 	'toolbar'             => 'Edit page toolbar',
 	'edit'                => 'Edit pages',
 	'parserwarnings'      => 'Parser/template warnings',
@@ -3905,7 +4035,6 @@ XHTML id names.",
 	'diffs'               => 'Diffs',
 	'search'              => 'Search results',
 	'opensearch'          => 'OpenSearch description',
-	'quickbar'            => 'Quickbar',
 	'preferences'         => 'Preferences page',
 	'preferences-email'   => 'User preference: email validation using jQuery',
 	'userrights'          => 'User rights',
@@ -3937,9 +4066,9 @@ XHTML id names.",
 	'listredirects'       => 'List redirects',
 	'unusedtemplates'     => 'Unused templates',
 	'randompage'          => 'Random page',
+	'randomincategory'    => 'Random page in category',
 	'randomredirect'      => 'Random redirect',
 	'statistics'          => 'Statistics',
-	'disambiguations'     => '',
 	'pageswithprop'       => '',
 	'doubleredirects'     => '',
 	'brokenredirects'     => '',
@@ -3995,8 +4124,9 @@ XHTML id names.",
 	'patrol-log'          => 'Patrol log',
 	'imagedeletion'       => 'Image deletion',
 	'browsediffs'         => 'Browsing diffs',
-	'newfiles'           => 'Special:NewFiles',
+	'newfiles'            => 'Special:NewFiles',
 	'video-info'          => 'Video information, used by Language::formatTimePeriod() to format lengths in the above messages',
+	'human-timestamps'    => 'Human-readable timestamps',
 	'badimagelist'        => 'Bad image list',
 	'variantname-zh'      => "Short names for language variants used for language conversion links.
 Variants for Chinese language",
@@ -4009,9 +4139,9 @@ Variants for Chinese language",
 	'variantname-shi'     => 'Variants for Tachelhit language',
 	'media-info'          => 'Media information',
 	'metadata'            => 'Metadata',
-	'exif'                           => 'EXIF tags',
+	'exif'                           => 'Exif tags',
 	'exif-values'                    => 'Make & model, can be wikified in order to link to the camera and model name',
-	'exif-compression'               => 'EXIF attributes',
+	'exif-compression'               => 'Exif attributes',
 	'exif-copyrighted'               => '',
 	'exif-unknowndate'               => '',
 	'exif-photometricinterpretation' => '',
@@ -4080,7 +4210,7 @@ Variants for Chinese language",
 	'signatures'            => 'Signatures',
 	'CoreParserFunctions'   => 'Core parser functions',
 	'version'               => 'Special:Version',
-	'filepath'              => 'Special:FilePath',
+	'redirect'              => 'Special:Redirect',
 	'fileduplicatesearch'   => 'Special:FileDuplicateSearch',
 	'special-specialpages'  => 'Special:SpecialPages',
 	'special-blank'         => 'Special:BlankPage',
@@ -4098,4 +4228,5 @@ Variants for Chinese language",
 	'duration'              => 'Durations',
 	'cachedspecial'         => 'SpecialCachedPage',
 	'rotation'              => 'Image rotation',
+	'limitreport'           => 'Limit report',
 );
diff --git a/maintenance/language/rebuildLanguage.php b/maintenance/language/rebuildLanguage.php
index ad839054..66948aeb 100644
--- a/maintenance/language/rebuildLanguage.php
+++ b/maintenance/language/rebuildLanguage.php
@@ -22,9 +22,9 @@
  * @defgroup MaintenanceLanguage MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../commandLine.inc' );
-require_once( 'languages.inc' );
-require_once( 'writeMessagesArray.inc' );
+require_once __DIR__ . '/../commandLine.inc';
+require_once 'languages.inc';
+require_once 'writeMessagesArray.inc';
 
 /**
  * Rewrite a messages array.
@@ -56,13 +56,13 @@ function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknow
  */
 function removeDupes( $oldMsgArray, $dupeMsgSource ) {
 	if ( file_exists( $dupeMsgSource ) ) {
-		include( $dupeMsgSource );
+		include $dupeMsgSource;
 		if ( !isset( $dupeMessages ) ) {
-			echo( "There are no duplicated messages in the source file provided." );
+			echo "There are no duplicated messages in the source file provided.";
 			exit( 1 );
 		}
 	} else {
-		echo ( "The specified file $dupeMsgSource cannot be found." );
+		echo "The specified file $dupeMsgSource cannot be found.";
 		exit( 1 );
 	}
 	$newMsgArray = $oldMsgArray;
diff --git a/maintenance/language/transstat.php b/maintenance/language/transstat.php
index ba503224..61b84a07 100644
--- a/maintenance/language/transstat.php
+++ b/maintenance/language/transstat.php
@@ -28,9 +28,9 @@
  */
 $optionsWithArgs = array( 'output' );
 
-require_once( __DIR__ . '/../commandLine.inc' );
-require_once( 'languages.inc' );
-require_once( __DIR__ . '/StatOutputs.php' );
+require_once __DIR__ . '/../commandLine.inc';
+require_once 'languages.inc';
+require_once __DIR__ . '/StatOutputs.php';
 
 
 if ( isset( $options['help'] ) ) {
@@ -96,7 +96,7 @@ $wgRequiredMessagesNumber = count( $wgGeneralMessages['required'] );
 
 foreach ( $wgLanguages->getLanguages() as $code ) {
 	# Don't check English, RTL English or dummy language codes
-	if ( $code == 'en' || $code == 'enRTL' || (is_array( $wgDummyLanguageCodes ) &&
+	if ( $code == 'en' || $code == 'enRTL' || ( is_array( $wgDummyLanguageCodes ) &&
 		isset( $wgDummyLanguageCodes[$code] ) ) ) {
 		continue;
 	}
diff --git a/maintenance/language/validate.php b/maintenance/language/validate.php
index 4f00496f..63d9b847 100644
--- a/maintenance/language/validate.php
+++ b/maintenance/language/validate.php
@@ -36,8 +36,8 @@ define( 'NOT_REALLY_MEDIAWIKI', 1 );
 
 $IP = __DIR__ . '/../..';
 
-require_once( "$IP/includes/Defines.php" );
-require_once( "$IP/languages/Language.php" );
+require_once "$IP/includes/Defines.php";
+require_once "$IP/languages/Language.php";
 
 $files = array();
 foreach ( $argv as $arg ) {
@@ -57,7 +57,7 @@ foreach ( $files as $filename ) {
 }
 
 function getVars( $filename ) {
-	require( $filename );
+	require $filename;
 	$vars = get_defined_vars();
 	unset( $vars['filename'] );
 	return $vars;
diff --git a/maintenance/language/writeMessagesArray.inc b/maintenance/language/writeMessagesArray.inc
index b2e04c7f..fc0da3f5 100644
--- a/maintenance/language/writeMessagesArray.inc
+++ b/maintenance/language/writeMessagesArray.inc
@@ -50,25 +50,27 @@ class MessageWriter {
 		$sortedMessages = $messages[1];
 
 		# Write to the file
-		if ( $messagesFolder )
+		if ( $messagesFolder ) {
 			$filename = Language::getFileName( "$messagesFolder/Messages", $code );
-		else
+		} else {
 			$filename = Language::getMessagesFileName( $code );
+		}
 
-		if ( file_exists( $filename ) )
+		if ( file_exists( $filename ) ) {
 			$contents = file_get_contents( $filename );
-		else
+		} else {
 			$contents = '<?php
 $messages = array(
 );
 ';
+		}
 
-		if( strpos( $contents, '$messages' ) !== false ) {
+		if ( strpos( $contents, '$messages' ) !== false ) {
 			$contents = explode( '$messages', $contents );
-			if( $messagesText == '$messages' . $contents[1] ) {
+			if ( $messagesText == '$messages' . $contents[1] ) {
 				echo "Generated messages for language $code. Same as the current file.\n";
 			} else {
-				if( $write ) {
+				if ( $write ) {
 					$new = $contents[0];
 					$new .= $messagesText;
 					file_put_contents( $filename, $new );
@@ -77,12 +79,13 @@ $messages = array(
 					echo "Generated messages for language $code. Please run the script again (without the parameter \"dry-run\") to write the array to the file.\n";
 				}
 			}
-			if( $listUnknown && isset( $sortedMessages['unknown'] ) && !empty( $sortedMessages['unknown'] ) ) {
-				if ( $removeUnknown )
+			if ( $listUnknown && isset( $sortedMessages['unknown'] ) && !empty( $sortedMessages['unknown'] ) ) {
+				if ( $removeUnknown ) {
 					echo "\nThe following " . count( $sortedMessages['unknown'] ) . " unknown messages have been removed:\n";
-				else
+				} else {
 					echo "\nThere are " . count( $sortedMessages['unknown'] ) . " unknown messages, please check them:\n";
-				foreach( $sortedMessages['unknown'] as $key => $value ) {
+				}
+				foreach ( $sortedMessages['unknown'] as $key => $value ) {
 					echo "* " . $key . "\n";
 				}
 			}
@@ -107,22 +110,22 @@ $messages = array(
 		# Load messages
 		$dir = $prefix ? $prefix : __DIR__;
 
-		require( $dir . '/messages.inc' );
+		require $dir . '/messages.inc';
 		self::$messageStructure = $wgMessageStructure;
 		self::$blockComments = $wgBlockComments;
 
-		require( $dir . '/messageTypes.inc' );
+		require $dir . '/messageTypes.inc';
 		self::$ignoredMessages = $wgIgnoredMessages;
 		self::$optionalMessages = $wgOptionalMessages;
 
 		# Sort messages to blocks
 		$sortedMessages['unknown'] = $messages;
-		foreach( self::$messageStructure as $blockName => $block ) {
+		foreach ( self::$messageStructure as $blockName => $block ) {
 			/**
 			 * @var $block array
 			 */
-			foreach( $block as $key ) {
-				if( array_key_exists( $key, $sortedMessages['unknown'] ) ) {
+			foreach ( $block as $key ) {
+				if ( array_key_exists( $key, $sortedMessages['unknown'] ) ) {
 					$sortedMessages[$blockName][$key] = $sortedMessages['unknown'][$key];
 					unset( $sortedMessages['unknown'][$key] );
 				}
@@ -132,13 +135,13 @@ $messages = array(
 		# Write all the messages
 		$messagesText = "\$messages = array(
 ";
-		foreach( $sortedMessages as $block => $messages ) {
+		foreach ( $sortedMessages as $block => $messages ) {
 			# Skip if it's the block of unknown messages - handle that in the end of file
-			if( $block == 'unknown' ) {
+			if ( $block == 'unknown' ) {
 				continue;
 			}
 
-			if( $ignoredComments ) {
+			if ( $ignoredComments ) {
 				$ignored = self::$ignoredMessages;
 				$optional = self::$optionalMessages;
 			} else {
@@ -175,10 +178,10 @@ $messages = array(
 		$commentArray = array();
 
 		# List of keys only
-		foreach( $messages as $key ) {
-			if( in_array( $key, $ignored ) ) {
+		foreach ( $messages as $key ) {
+			if ( in_array( $key, $ignored ) ) {
 				$commentArray[$key] = ' # ' . self::$ignoredComment;
-			} elseif( in_array( $key, $optional ) ) {
+			} elseif ( in_array( $key, $optional ) ) {
 				$commentArray[$key] = ' # ' . self::$optionalComment;
 			}
 		}
@@ -202,13 +205,13 @@ $messages = array(
 		$blockText = '';
 
 		# Skip the block if it includes no messages
-		if( empty( $messages ) ) {
+		if ( empty( $messages ) ) {
 			return '';
 		}
 
 		# Format the block comment (if exists); check for multiple lines comments
-		if( !empty( $blockComment ) ) {
-			if( strpos( $blockComment, "\n" ) === false ) {
+		if ( !empty( $blockComment ) ) {
+			if ( strpos( $blockComment, "\n" ) === false ) {
 				$blockText .= "$prefix# $blockComment
 ";
 			} else {
@@ -223,7 +226,7 @@ $blockComment
 		$maxKeyLength = max( array_map( 'strlen', array_keys( $messages ) ) );
 
 		# Format the messages
-		foreach( $messages as $key => $value ) {
+		foreach ( $messages as $key => $value ) {
 			# Add the key name
 			$blockText .= "$prefix'$key'";
 
@@ -241,16 +244,16 @@ $blockComment
 			$single = "'";
 			$double = '"';
 
-			if( strpos( $value, $single ) === false ) {
+			if ( strpos( $value, $single ) === false ) {
 				# Nothing ugly, just use '
-				$blockText .= $single.$value.$single;
-			} elseif( strpos( $value, $double ) === false && !preg_match('/\$[a-zA-Z_\x7f-\xff]/', $value) ) {
+				$blockText .= $single . $value . $single;
+			} elseif ( strpos( $value, $double ) === false && !preg_match( '/\$[a-zA-Z_\x7f-\xff]/', $value ) ) {
 				# No "-quotes, no variables that need quoting, use "
-				$blockText .= $double.$value.$double;
+				$blockText .= $double . $value . $double;
 			} else {
 				# Something needs quoting, pick the quote which causes less quoting
 				$quote = substr_count( $value, $double ) + substr_count( $value, '$' ) >= substr_count( $value, $single ) ? $single : $double;
-				if( $quote === $double ) {
+				if ( $quote === $double ) {
 					$extra = '$';
 				} else {
 					$extra = '';
@@ -262,7 +265,7 @@ $blockComment
 			$blockText .= ',';
 
 			# Add comments, if there is any
-			if( array_key_exists( $key, $messageComments ) ) {
+			if ( array_key_exists( $key, $messageComments ) ) {
 				$blockText .= $messageComments[$key];
 			}
 
diff --git a/maintenance/mcc.php b/maintenance/mcc.php
index 6ff8a176..7b7b7614 100644
--- a/maintenance/mcc.php
+++ b/maintenance/mcc.php
@@ -23,7 +23,7 @@
  */
 
 /** */
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
 
 $options = getopt( '', array( 'debug', 'help', 'cache:' ) );
 
@@ -48,7 +48,7 @@ if ( $cache ) {
 	$servers = $wgObjectCaches[$cache]['servers'];
 } elseif ( $wgMainCacheType === CACHE_MEMCACHED ) {
 	$mcc->set_servers( $wgMemCachedServers );
-} elseif( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
+} elseif ( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
 	$mcc->set_servers( $wgObjectCaches[$wgMainCacheType]['servers'] );
 } else {
 	print "MediaWiki isn't configured for Memcached usage\n";
@@ -116,7 +116,9 @@ do {
 	$quit = false;
 
 	$line = Maintenance::readconsole();
-	if ( $line === false ) exit;
+	if ( $line === false ) {
+		exit;
+	}
 
 	$args = explode( ' ', $line );
 	$command = array_shift( $args );
diff --git a/maintenance/mctest.php b/maintenance/mctest.php
index 469feca2..eda101e7 100644
--- a/maintenance/mctest.php
+++ b/maintenance/mctest.php
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that  makes several 'set', 'incr' and 'get' requests
@@ -34,7 +34,7 @@ class mcTest extends Maintenance {
 	public function __construct() {
 		parent::__construct();
 		$this->mDescription = "Makes several 'set', 'incr' and 'get' requests on every"
-							  . " memcached server and shows a report";
+			. " memcached server and shows a report";
 		$this->addOption( 'i', 'Number of iterations', false, true );
 		$this->addOption( 'cache', 'Use servers from this $wgObjectCaches store', false, true );
 		$this->addArg( 'server[:port]', 'Memcached server to test, with optional port', false );
@@ -54,15 +54,22 @@ class mcTest extends Maintenance {
 			$servers = array( $this->getArg() );
 		} elseif ( $wgMainCacheType === CACHE_MEMCACHED ) {
 			global $wgMemCachedServers;
-			$servers = $wgMemCachedServers ;
+			$servers = $wgMemCachedServers;
 		} elseif ( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
 			$servers = $wgObjectCaches[$wgMainCacheType]['servers'];
 		} else {
 			$this->error( "MediaWiki isn't configured for Memcached usage", 1 );
 		}
 
+		# find out the longest server string to nicely align output later on
+		$maxSrvLen = $servers ? max( array_map( 'strlen', $servers ) ) : 0;
+
 		foreach ( $servers as $server ) {
-			$this->output( $server . " ", $server );
+			$this->output(
+				str_pad( $server, $maxSrvLen ),
+				$server  # output channel
+			);
+
 			$mcc = new MemCachedClientforWiki( array(
 				'persistant' => true,
 				'timeout' => $wgMemCachedTimeout
@@ -73,7 +80,7 @@ class mcTest extends Maintenance {
 			$get = 0;
 			$time_start = $this->microtime_float();
 			for ( $i = 1; $i <= $iterations; $i++ ) {
-				if ( !is_null( $mcc->set( "test$i", $i ) ) ) {
+				if ( $mcc->set( "test$i", $i ) ) {
 					$set++;
 				}
 			}
@@ -90,7 +97,7 @@ class mcTest extends Maintenance {
 			}
 			$exectime = $this->microtime_float() - $time_start;
 
-			$this->output( "set: $set   incr: $incr   get: $get time: $exectime", $server );
+			$this->output( " set: $set   incr: $incr   get: $get time: $exectime", $server );
 		}
 	}
 
@@ -105,4 +112,4 @@ class mcTest extends Maintenance {
 }
 
 $maintClass = "mcTest";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/mergeMessageFileList.php b/maintenance/mergeMessageFileList.php
index 62596b20..e9183377 100644
--- a/maintenance/mergeMessageFileList.php
+++ b/maintenance/mergeMessageFileList.php
@@ -25,7 +25,7 @@
 # Start from scratch
 define( 'MW_NO_EXTENSION_MESSAGES', 1 );
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 $maintClass = 'MergeMessageFileList';
 $mmfl = false;
 
@@ -36,10 +36,14 @@ $mmfl = false;
  * @ingroup Maintenance
  */
 class MergeMessageFileList extends Maintenance {
+	/**
+	 * @var bool
+	 */
+	protected $hasError;
 
 	function __construct() {
 		parent::__construct();
-		$this->addOption( 'list-file', 'A file containing a list of extension setup files, one per line.', true, true );
+		$this->addOption( 'list-file', 'A file containing a list of extension setup files, one per line.', false, true );
 		$this->addOption( 'extensions-dir', 'Path where extensions can be found.', false, true );
 		$this->addOption( 'output', 'Send output to this file (omit for stdout)', false, true );
 		$this->mDescription = 'Merge $wgExtensionMessagesFiles from various extensions to produce a ' .
@@ -47,21 +51,29 @@ class MergeMessageFileList extends Maintenance {
 	}
 
 	public function execute() {
-		global $mmfl;
+		global $mmfl, $wgExtensionEntryPointListFiles;
+
+		if ( !count( $wgExtensionEntryPointListFiles )
+			&& !$this->hasOption( 'list-file' )
+			&& !$this->hasOption( 'extensions-dir' )
+		) {
+			$this->error( "Either --list-file or --extensions-dir must be provided if " .
+				"\$wgExtensionEntryPointListFiles is not set", 1 );
+		}
+
+		$mmfl = array( 'setupFiles' => array() );
 
 		# Add setup files contained in file passed to --list-file
-		$lines = file( $this->getOption( 'list-file' ) );
-		if ( $lines === false ) {
-			$this->error( 'Unable to open list file.' );
+		if ( $this->hasOption( 'list-file' ) ) {
+			$extensionPaths = $this->readFile( $this->getOption( 'list-file' ) );
+			$mmfl['setupFiles'] = array_merge( $mmfl['setupFiles'], $extensionPaths );
 		}
-		$mmfl = array( 'setupFiles' => array_map( 'trim', $lines ) );
 
 		# Now find out files in a directory
-		$hasError = false;
 		if ( $this->hasOption( 'extensions-dir' ) ) {
 			$extdir = $this->getOption( 'extensions-dir' );
 			$entries = scandir( $extdir );
-			foreach( $entries as $extname ) {
+			foreach ( $entries as $extname ) {
 				if ( $extname == '.' || $extname == '..' || !is_dir( "$extdir/$extname" ) ) {
 					continue;
 				}
@@ -69,13 +81,19 @@ class MergeMessageFileList extends Maintenance {
 				if ( file_exists( $extfile ) ) {
 					$mmfl['setupFiles'][] = $extfile;
 				} else {
-					$hasError = true;
+					$this->hasError = true;
 					$this->error( "Extension {$extname} in {$extdir} lacks expected {$extname}.php" );
 				}
 			}
 		}
 
-		if ( $hasError ) {
+		# Add setup files defined via configuration
+		foreach ( $wgExtensionEntryPointListFiles as $points ) {
+			$extensionPaths = $this->readFile( $points );
+			$mmfl['setupFiles'] = array_merge( $mmfl['setupFiles'], $extensionPaths );
+		}
+
+		if ( $this->hasError ) {
 			$this->error( "Some files are missing (see above). Giving up.", 1 );
 		}
 
@@ -86,19 +104,54 @@ class MergeMessageFileList extends Maintenance {
 			$mmfl['quiet'] = true;
 		}
 	}
+
+	/**
+	 * @param string $fileName
+	 * @return array List of absolute extension paths
+	 */
+	private function readFile( $fileName ) {
+		global $IP;
+
+		$files = array();
+		$fileLines = file( $fileName );
+		if ( $fileLines === false ) {
+			$this->hasError = true;
+			$this->error( "Unable to open list file $fileName." );
+			return $files;
+		}
+		# Strip comments, discard empty lines, and trim leading and trailing
+		# whitespace. Comments start with '#' and extend to the end of the line.
+		foreach ( $fileLines as $extension ) {
+			$extension = trim( preg_replace( '/#.*/', '', $extension ) );
+			if ( $extension !== '' ) {
+				# Paths may use the string $IP to be substituted by the actual value
+				$extension = str_replace( '$IP', $IP, $extension );
+				if ( file_exists( $extension ) ) {
+					$files[] = $extension;
+				} else {
+					$this->hasError = true;
+					$this->error( "Extension {$extension} doesn't exist" );
+				}
+			}
+		}
+		return $files;
+	}
 }
 
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
 
 foreach ( $mmfl['setupFiles'] as $fileName ) {
 	if ( strval( $fileName ) === '' ) {
 		continue;
 	}
-	$fileName = str_replace( '$IP', $IP, $fileName );
 	if ( empty( $mmfl['quiet'] ) ) {
 		fwrite( STDERR, "Loading data from $fileName\n" );
 	}
-	include_once( $fileName );
+	// Include the extension to update $wgExtensionMessagesFiles
+	if ( !( include_once( $fileName ) ) ) {
+		fwrite( STDERR, "Unable to read $fileName\n" );
+		exit( 1 );
+	}
 }
 fwrite( STDERR, "\n" );
 $s =
@@ -114,10 +167,7 @@ $dirs = array(
 );
 
 foreach ( $dirs as $dir ) {
-	$s = preg_replace(
-		"/'" . preg_quote( $dir, '/' ) . "([^']*)'/",
-		'"$IP\1"',
-		$s );
+	$s = preg_replace( "/'" . preg_quote( $dir, '/' ) . "([^']*)'/", '"$IP\1"', $s );
 }
 
 if ( isset( $mmfl['output'] ) ) {
diff --git a/maintenance/migrateUserGroup.php b/maintenance/migrateUserGroup.php
index f3e5957c..6903365b 100644
--- a/maintenance/migrateUserGroup.php
+++ b/maintenance/migrateUserGroup.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that re-assigns users from an old group to a new one.
@@ -106,4 +106,4 @@ class MigrateUserGroup extends Maintenance {
 }
 
 $maintClass = "MigrateUserGroup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/minify.php b/maintenance/minify.php
index 0846a64c..ec936c83 100644
--- a/maintenance/minify.php
+++ b/maintenance/minify.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that minifies a file or set of files.
@@ -144,4 +144,4 @@ class MinifyScript extends Maintenance {
 }
 
 $maintClass = 'MinifyScript';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/moveBatch.php b/maintenance/moveBatch.php
index 7d15959c..34e64282 100644
--- a/maintenance/moveBatch.php
+++ b/maintenance/moveBatch.php
@@ -34,7 +34,7 @@
  * e.g. immobile_namespace for namespaces which can't be moved
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to move a batch of pages.
@@ -116,4 +116,4 @@ class MoveBatch extends Maintenance {
 }
 
 $maintClass = "MoveBatch";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/mssql/tables.sql b/maintenance/mssql/tables.sql
index ad996175..7356c38f 100644
--- a/maintenance/mssql/tables.sql
+++ b/maintenance/mssql/tables.sql
@@ -159,6 +159,7 @@ CREATE TABLE /*$wgDBprefix*/text (
 -- Cannot reasonably create views on this table, due to the presence of TEXT
 -- columns.
 CREATE TABLE /*$wgDBprefix*/archive (
+   ar_id NOT NULL PRIMARY KEY clustered IDENTITY,
    ar_namespace SMALLINT NOT NULL DEFAULT 0,
    ar_title NVARCHAR(255) NOT NULL DEFAULT '',
    ar_text NVARCHAR(MAX) NOT NULL,
@@ -298,6 +299,7 @@ CREATE INDEX /*$wgDBprefix*/lc_lang_key ON /*$wgDBprefix*/l10n_cache (lc_lang, l
 -- Track links to external URLs
 -- IE >= 4 supports no more than 2083 characters in a URL
 CREATE TABLE /*$wgDBprefix*/externallinks (
+   el_id INT NOT NULL PRIMARY KEY clustered IDENTITY,
    el_from INT NOT NULL DEFAULT '0',
    el_to VARCHAR(2083) NOT NULL,
    el_index VARCHAR(896) NOT NULL,
@@ -305,17 +307,6 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
 -- Maximum key length ON SQL Server is 900 bytes
 CREATE INDEX /*$wgDBprefix*/externallinks_index   ON /*$wgDBprefix*/externallinks(el_index);
 
---
--- Track external user accounts, if ExternalAuth is used
---
-CREATE TABLE /*$wgDBprefix*/external_user (
-	-- Foreign key to user_id
-	eu_local_id INT NOT NULL PRIMARY KEY,
-	-- opaque identifier provided by the external database
-	eu_external_id NVARCHAR(255) NOT NULL,
-);
-CREATE UNIQUE INDEX /*$wgDBprefix*/eu_external_idx ON /*$wgDBprefix*/external_user(eu_external_id);
-
 --
 -- Track INTerlanguage links
 --
@@ -516,8 +507,6 @@ CREATE TABLE /*$wgDBprefix*/recentchanges (
    rc_this_oldid INT DEFAULT 0,
    rc_last_oldid INT DEFAULT 0,
    rc_type tinyint DEFAULT 0,
-   rc_moved_to_ns BIT DEFAULT 0,
-   rc_moved_to_title NVARCHAR(255)  DEFAULT '',
    rc_patrolled BIT DEFAULT 0,
    rc_ip NCHAR(40) DEFAULT '',
    rc_old_len INT DEFAULT 0,
diff --git a/maintenance/mwdoc-filter.php b/maintenance/mwdoc-filter.php
index 6eeb48d3..c80981b5 100644
--- a/maintenance/mwdoc-filter.php
+++ b/maintenance/mwdoc-filter.php
@@ -18,6 +18,6 @@ if ( PHP_SAPI != 'cli' ) {
 $source = file_get_contents( $argv[1] );
 $regexp = '#\@var\s+([^\s]+)([^/]+)/\s+(var|public|protected|private)\s+(\$[^\s;=]+)#';
 $replac = '${2} */ ${3} ${1} ${4}';
-$source = preg_replace($regexp, $replac, $source);
+$source = preg_replace( $regexp, $replac, $source );
 
 echo $source;
diff --git a/maintenance/mwdocgen.php b/maintenance/mwdocgen.php
index 4fad7a7f..b22dd885 100644
--- a/maintenance/mwdocgen.php
+++ b/maintenance/mwdocgen.php
@@ -8,12 +8,6 @@
  * Usage:
  *   php mwdocgen.php
  *
- * KNOWN BUGS:
- *
- * - pass_thru seems to always use buffering (even with ob_implicit_flush()),
- * that make output slow when doxygen parses language files.
- * - the menu doesnt work, got disabled at revision 13740. Need to code it.
- *
  * 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 2 of the License, or
@@ -39,237 +33,135 @@
  * @version first release
  */
 
-#
-# Variables / Configuration
-#
-
-if ( PHP_SAPI != 'cli' ) {
-	echo 'Run "' . __FILE__ . '" from the command line.';
-	die( -1 );
-}
-
-/** Figure out the base directory for MediaWiki location */
-$mwPath = dirname( __DIR__ ) . DIRECTORY_SEPARATOR;
-
-/** doxygen binary script */
-$doxygenBin = 'doxygen';
-
-/** doxygen configuration template for mediawiki */
-$doxygenTemplate = $mwPath . 'maintenance/Doxyfile';
-
-/** doxygen input filter to tweak source file before they are parsed */
-$doxygenInputFilter = "php {$mwPath}maintenance/mwdoc-filter.php";
-
-/** where Phpdoc should output documentation */
-$doxyOutput = $mwPath . 'docs' . DIRECTORY_SEPARATOR ;
-
-$doxyVersion = 'master';
-
-/** MediaWiki subpaths */
-$mwPathI = $mwPath . 'includes/';
-$mwPathL = $mwPath . 'languages/';
-$mwPathM = $mwPath . 'maintenance/';
-$mwPathS = $mwPath . 'skins/';
-
-/** Ignored paths relative to $mwPath */
-$mwExcludePaths = array(
-	'images',
-	'static',
-);
-
-/** Variable to get user input */
-$input = '';
-$excludePatterns = '';
-/** Whether to generates man pages: */
-$doxyGenerateMan = false;
-
-#
-# Functions
-#
-
-define( 'MEDIAWIKI', true );
-require_once( "$mwPath/includes/GlobalFunctions.php" );
-
-/**
- * Read a line from the shell
- * @param $prompt String
- * @return string
- */
-function readaline( $prompt = '' ) {
-	print $prompt;
-	$fp = fopen( "php://stdin", "r" );
-	$resp = trim( fgets( $fp, 1024 ) );
-	fclose( $fp );
-	return $resp;
-}
+require_once __DIR__ . '/Maintenance.php';
 
 /**
- * Generate a configuration file given user parameters and return the temporary filename.
- * @param $doxygenTemplate String: full path for the template.
- * @param $outputDirectory String: directory where the stuff will be output.
- * @param $stripFromPath String: path that should be stripped out (usually mediawiki base path).
- * @param $currentVersion String: Version number of the software
- * @param $input String: Path to analyze.
- * @param $exclude String: Additionals path regex to exclude
- * @param $excludePatterns String: Additionals path regex to exclude
- *                 (LocalSettings.php, AdminSettings.php, .svn and .git directories are always excluded)
- * @param $doxyGenerateMan Boolean
- * @return string
+ * Maintenance script that builds doxygen documentation.
+ * @ingroup Maintenance
  */
-function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath, $currentVersion, $input, $exclude, $excludePatterns, $doxyGenerateMan, $doxygenInputFilter ) {
-
-	$template = file_get_contents( $doxygenTemplate );
-	// Replace template placeholders by correct values.
-	$replacements = array(
-		'{{OUTPUT_DIRECTORY}}' => $outputDirectory,
-		'{{STRIP_FROM_PATH}}'  => $stripFromPath,
-		'{{CURRENT_VERSION}}'  => $currentVersion,
-		'{{INPUT}}'            => $input,
-		'{{EXCLUDE}}'          => $exclude,
-		'{{EXCLUDE_PATTERNS}}' => $excludePatterns,
-		'{{HAVE_DOT}}'         => `which dot` ? 'YES' : 'NO',
-		'{{GENERATE_MAN}}'     => $doxyGenerateMan ? 'YES' : 'NO',
-		'{{INPUT_FILTER}}'     => $doxygenInputFilter,
-	);
-	$tmpCfg = str_replace( array_keys( $replacements ), array_values( $replacements ), $template );
-	$tmpFileName = tempnam( wfTempDir(), 'mwdocgen-' );
-	file_put_contents( $tmpFileName, $tmpCfg ) or die( "Could not write doxygen configuration to file $tmpFileName\n" );
+class MWDocGen extends Maintenance {
+
+	/**
+	 * Prepare Maintenance class
+	 */
+	public function __construct() {
+		parent::__construct();
+		$this->mDescription = 'Build doxygen documentation';
+
+		$this->addOption( 'doxygen',
+			'Path to doxygen',
+			false, true );
+		$this->addOption( 'version',
+			'Pass a MediaWiki version',
+			false, true );
+		$this->addOption( 'generate-man',
+			'Whether to generate man files' );
+		$this->addOption( 'file',
+			"Only process given file or directory. Multiple values " .
+			"accepted with comma separation. Path relative to \$IP.",
+			false, true );
+		$this->addOption( 'output',
+			'Path to write doc to',
+			false, true );
+		$this->addOption( 'no-extensions',
+			'Ignore extensions' );
+	}
 
-	return $tmpFileName;
-}
+	public function getDbType() {
+		return Maintenance::DB_NONE;
+	}
 
-#
-# Main !
-#
+	protected function init() {
+		global $IP;
 
-unset( $file );
+		$this->doxygen = $this->getOption( 'doxygen', 'doxygen' );
+		$this->mwVersion = $this->getOption( 'version', 'master' );
 
-if ( is_array( $argv ) ) {
-	for ($i = 0; $i < count($argv); $i++ ) {
-		switch( $argv[$i] ) {
-		case '--all':         $input = 0; break;
-		case '--includes':    $input = 1; break;
-		case '--languages':   $input = 2; break;
-		case '--maintenance': $input = 3; break;
-		case '--skins':       $input = 4; break;
-		case '--file':
-			$input = 5;
-			$i++;
-			if ( isset( $argv[$i] ) ) {
-				$file = $argv[$i];
-			}
-			break;
-		case '--no-extensions': $input = 6; break;
-		case '--output':
-			$i++;
-			if ( isset( $argv[$i] ) ) {
-				$doxyOutput = realpath( $argv[$i] );
-			}
-			break;
-		case '--version':
-			$i++;
-			if ( isset( $argv[$i] ) ) {
-				$doxyVersion = $argv[$i];
-			}
-			break;
-		case '--generate-man':
-			$doxyGenerateMan = true;
-			break;
-		case '--help':
-			print <<<END
-Usage: php mwdocgen.php [<command>] [<options>]
+		$this->input = '';
+		$inputs = explode( ',', $this->getOption( 'file', '' ) );
+		foreach ( $inputs as $input ) {
+			# Doxygen inputs are space separted and double quoted
+			$this->input .= " \"$IP/$input\"";
+		}
 
-Commands:
-    --all           Process entire codebase
-    --includes      Process only files in includes/ dir
-    --languages     Process only files in languages/ dir
-    --maintenance   Process only files in maintenance/ dir
-    --skins         Process only files in skins/ dir
-    --file <file>   Process only the given file
-    --no-extensions Process everything but extensions directorys
+		$this->output = $this->getOption( 'output', "$IP/docs" );
+
+		$this->inputFilter = wfShellWikiCmd(
+			$IP . '/maintenance/mwdoc-filter.php' );
+		$this->template = $IP . '/maintenance/Doxyfile';
+		$this->excludes = array(
+			'vendor',
+			'images',
+			'static',
+		);
+		$this->excludePatterns = array();
+		if ( $this->hasOption( 'no-extensions' ) ) {
+			$this->excludePatterns[] = 'extensions';
+		}
 
-If no command is given, you will be prompted.
+		$this->doDot = `which dot`;
+		$this->doMan = $this->hasOption( 'generate-man' );
+	}
 
-Other options:
-    --output <dir>  Set output directory (default: $doxyOutput)
-    --generate-man  Generates man page documentation
-    --version       Project version to display in the outut (default: $doxyVersion)
-    --help          Show this help and exit.
+	public function execute() {
+		global $IP;
 
+		$this->init();
 
-END;
-			exit(0);
-			break;
+		# Build out directories we want to exclude
+		$exclude = '';
+		foreach ( $this->excludes as $item ) {
+			$exclude .= " $IP/$item";
 		}
-	}
-}
 
-// TODO : generate a list of paths ))
-
-if ( $input === '' ) {
-	echo <<<OPTIONS
-Several documentation possibilities:
- 0 : whole documentation (1 + 2 + 3 + 4)
- 1 : only includes
- 2 : only languages
- 3 : only maintenance
- 4 : only skins
- 5 : only a given file
- 6 : all but the extensions directory
-OPTIONS;
-	while ( !is_numeric( $input ) )
-	{
-		$input = readaline( "\nEnter your choice [0]:" );
-		if ( $input == '' ) {
-			$input = 0;
+		$excludePatterns = implode( ' ', $this->excludePatterns );
+
+		$conf = strtr( file_get_contents( $this->template ),
+			array(
+				'{{OUTPUT_DIRECTORY}}' => $this->output,
+				'{{STRIP_FROM_PATH}}' => $IP,
+				'{{CURRENT_VERSION}}' => $this->mwVersion,
+				'{{INPUT}}' => $this->input,
+				'{{EXCLUDE}}' => $exclude,
+				'{{EXCLUDE_PATTERNS}}' => $excludePatterns,
+				'{{HAVE_DOT}}' => $this->doDot ? 'YES' : 'NO',
+				'{{GENERATE_MAN}}' => $this->doMan ? 'YES' : 'NO',
+				'{{INPUT_FILTER}}' => $this->inputFilter,
+			)
+		);
+
+		$tmpFile = tempnam( wfTempDir(), 'MWDocGen-' );
+		if ( file_put_contents( $tmpFile, $conf ) === false ) {
+			$this->error( "Could not write doxygen configuration to file $tmpFile\n",
+				/** exit code: */ 1 );
 		}
-	}
-}
-
-switch ( $input ) {
-case 0: $input = $mwPath;  break;
-case 1: $input = $mwPathI; break;
-case 2: $input = $mwPathL; break;
-case 3: $input = $mwPathM; break;
-case 4: $input = $mwPathS; break;
-case 5:
-	if ( !isset( $file ) ) {
-		$file = readaline( "Enter file name $mwPath" );
-	}
-	$input = $mwPath . $file;
-	break;
-case 6:
-	$input = $mwPath;
-	$excludePatterns = 'extensions';
-}
 
-// Generate path exclusions
-$excludedPaths = $mwPath . join( " $mwPath", $mwExcludePaths );
-print "EXCLUDE: $excludedPaths\n\n";
+		$command = $this->doxygen . ' ' . $tmpFile;
+		$this->output( "Executing command:\n$command\n" );
 
-$generatedConf = generateConfigFile( $doxygenTemplate, $doxyOutput, $mwPath, $doxyVersion, $input, $excludedPaths, $excludePatterns, $doxyGenerateMan, $doxygenInputFilter );
-$command = $doxygenBin . ' ' . $generatedConf;
+		$exitcode = 1;
+		system( $command, $exitcode );
 
-echo <<<TEXT
+		$this->output( <<<TEXT
 ---------------------------------------------------
-Launching the command:
-
-$command
+Doxygen execution finished.
+Check above for possible errors.
 
+You might want to delete the temporary file:
+ $tmpFile
 ---------------------------------------------------
 
-TEXT;
-
-$exitcode = 1;
-passthru( $command, $exitcode );
+TEXT
+	);
 
-echo <<<TEXT
----------------------------------------------------
-Doxygen execution finished.
-Check above for possible errors.
+		if ( $exitcode !== 0 ) {
+			$this->error( "Something went wrong (exit: $exitcode)\n",
+				$exitcode );
+		}
 
-You might want to delete the temporary file $generatedConf
+	}
 
-TEXT;
+}
 
-exit( $exitcode );
+$maintClass = 'MWDocGen';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/mwjsduck-gen b/maintenance/mwjsduck-gen
index fbd428f1..bc10bc2c 100644
--- a/maintenance/mwjsduck-gen
+++ b/maintenance/mwjsduck-gen
@@ -1,2 +1,21 @@
-#!/usr/bin/env sh
-jsduck --config=$(cd $(dirname $0)/..; pwd)/maintenance/jsduck/config.json && echo 'JSDuck execution finished.'
+#!/usr/bin/env bash
+
+JSDUCK_MWVERSION=master
+if [[ "$1" == "--version" && "$2" != "" ]]
+then
+	JSDUCK_MWVERSION="$2"
+elif [[ "$*" != "" ]]
+then
+	echo "Usage $0: [--version <mediawiki version>]"
+	echo
+	exit 1
+fi
+
+MWCORE_DIR=$(cd $(dirname $0)/..; pwd)
+
+jsduck \
+--config=$MWCORE_DIR/maintenance/jsduck/config.json \
+--footer="Documentation for MediaWiki core ($JSDUCK_MWVERSION). Generated on {DATE} by {JSDUCK} {VERSION}." \
+&& echo 'JSDuck execution finished.'
+
+ln -s ../../resources $MWCORE_DIR/docs/js/modules
diff --git a/maintenance/namespaceDupes.php b/maintenance/namespaceDupes.php
index 6067a826..ff024682 100644
--- a/maintenance/namespaceDupes.php
+++ b/maintenance/namespaceDupes.php
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that checks for articles to fix after
@@ -185,7 +185,7 @@ class NamespaceConflictChecker extends Maintenance {
 	}
 
 	/**
-	 * @todo: do this for reals
+	 * @todo Do this for real
 	 * @param $key
 	 * @param $prefix
 	 * @param $fix
@@ -207,10 +207,10 @@ class NamespaceConflictChecker extends Maintenance {
 	 * @return array
 	 */
 	private function getConflicts( $ns, $name ) {
-		$page  = 'page';
+		$page = 'page';
 		$table = $this->db->tableName( $page );
 
-		$prefix     = $this->db->strencode( $name );
+		$prefix = $this->db->strencode( $name );
 		$encNamespace = $this->db->addQuotes( $ns );
 
 		$titleSql = "TRIM(LEADING '$prefix:' FROM {$page}_title)";
@@ -318,12 +318,12 @@ class NamespaceConflictChecker extends Maintenance {
 		$this->db->update( $table,
 			array(
 				"{$prefix}_namespace" => $newTitle->getNamespace(),
-				"{$prefix}_title"     => $newTitle->getDBkey(),
+				"{$prefix}_title" => $newTitle->getDBkey(),
 			),
 			array(
 				// "{$prefix}_namespace" => 0,
-				// "{$prefix}_title"     => $row->oldtitle,
-				"{$prefix}_id"		 => $row->id,
+				// "{$prefix}_title" => $row->oldtitle,
+				"{$prefix}_id" => $row->id,
 			),
 			__METHOD__ );
 		$this->output( "ok.\n" );
@@ -332,4 +332,4 @@ class NamespaceConflictChecker extends Maintenance {
 }
 
 $maintClass = "NamespaceConflictChecker";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/nextJobDB.php b/maintenance/nextJobDB.php
index 1be5146e..219b5d8e 100644
--- a/maintenance/nextJobDB.php
+++ b/maintenance/nextJobDB.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that picks a database that has pending jobs.
@@ -116,4 +116,4 @@ class nextJobDB extends Maintenance {
 }
 
 $maintClass = "nextJobDb";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/nukeNS.php b/maintenance/nukeNS.php
index c471a441..479dcf76 100644
--- a/maintenance/nukeNS.php
+++ b/maintenance/nukeNS.php
@@ -33,7 +33,7 @@
  * based on nukePage by Rob Church
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that removes pages with only one revision from the
@@ -66,7 +66,7 @@ class NukeNS extends Maintenance {
 		foreach ( $res as $row ) {
 			// echo "$ns_name:".$row->page_title, "\n";
 			$title = Title::makeTitle( $ns, $row->page_title );
-			$id   = $title->getArticleID();
+			$id = $title->getArticleID();
 
 			// Get corresponding revisions
 			$res2 = $dbw->query( "SELECT rev_id FROM $tbl_rev WHERE rev_page = $id" );
@@ -94,7 +94,7 @@ class NukeNS extends Maintenance {
 					$n_deleted ++;
 				}
 			} else {
-			  $this->output( "skip: " . $title->getPrefixedText() . "\n" );
+				$this->output( "skip: " . $title->getPrefixedText() . "\n" );
 			}
 		}
 		$dbw->commit( __METHOD__ );
@@ -119,4 +119,4 @@ class NukeNS extends Maintenance {
 }
 
 $maintClass = "NukeNS";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/nukePage.php b/maintenance/nukePage.php
index 89dffe0c..1870273e 100644
--- a/maintenance/nukePage.php
+++ b/maintenance/nukePage.php
@@ -23,7 +23,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that erases a page record from the database.
@@ -54,7 +54,7 @@ class NukePage extends Maintenance {
 		$this->output( "Searching for \"$name\"..." );
 		$title = Title::newFromText( $name );
 		if ( $title ) {
-			$id   = $title->getArticleID();
+			$id = $title->getArticleID();
 			$real = $title->getPrefixedText();
 			$isGoodArticle = $title->isContentPage();
 			$this->output( "found \"$real\" with ID $id.\n" );
@@ -117,4 +117,4 @@ class NukePage extends Maintenance {
 }
 
 $maintClass = "NukePage";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/oracle/alterSharedConstraints.php b/maintenance/oracle/alterSharedConstraints.php
index a46c5e1f..435625d5 100644
--- a/maintenance/oracle/alterSharedConstraints.php
+++ b/maintenance/oracle/alterSharedConstraints.php
@@ -27,7 +27,7 @@
  * i.e.: GRANT REFERENCES (user_id) ON mwuser TO hubclient;
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 class AlterSharedConstraints extends Maintenance {
 	public function __construct() {
@@ -49,11 +49,11 @@ class AlterSharedConstraints extends Maintenance {
 
 		$dbw = wfGetDB( DB_MASTER );
 		foreach ( $wgSharedTables as $table ) {
-			$stable = $dbw->tableNameInternal($table);
+			$stable = $dbw->tableNameInternal( $table );
 			if ( $wgSharedPrefix != null ) {
 				$ltable = preg_replace( "/^$wgSharedPrefix(.*)/i", "$wgDBprefix\\1", $stable );
 			} else {
-				$ltable = "{$wgDBprefix}{$stable}" ;
+				$ltable = "{$wgDBprefix}{$stable}";
 			}
 
 			$result = $dbw->query( "SELECT uc.constraint_name, uc.table_name, ucc.column_name, uccpk.table_name pk_table_name, uccpk.column_name pk_column_name, uc.delete_rule, uc.deferrable, uc.deferred
@@ -62,14 +62,14 @@ class AlterSharedConstraints extends Maintenance {
 					   AND ucc.constraint_name = uc.constraint_name
 					   AND uccpk.constraint_name = uc.r_constraint_name
 					   AND uccpk.table_name = '$ltable'" );
-			while (($row = $result->fetchRow()) !== false) {
+			while ( ( $row = $result->fetchRow() ) !== false ) {
 
-					$this->output( "Altering {$row['constraint_name']} ...");
+					$this->output( "Altering {$row['constraint_name']} ..." );
 
 					try {
 						$dbw->query( "ALTER TABLE {$row['table_name']} DROP CONSTRAINT {$wgDBprefix}{$row['constraint_name']}" );
-					} catch (DBQueryError $exdb) {
-						if ($exdb->errno != 2443) {
+					} catch ( DBQueryError $exdb ) {
+						if ( $exdb->errno != 2443 ) {
 							throw $exdb;
 						}
 					}
@@ -88,4 +88,4 @@ class AlterSharedConstraints extends Maintenance {
 }
 
 $maintClass = "AlterSharedConstraints";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/oracle/archives/patch-archive-ar_id.sql b/maintenance/oracle/archives/patch-archive-ar_id.sql
new file mode 100644
index 00000000..a43f7602
--- /dev/null
+++ b/maintenance/oracle/archives/patch-archive-ar_id.sql
@@ -0,0 +1,6 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.archive ADD (
+ar_id NUMBER NOT NULL,
+);
+ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_pk PRIMARY KEY (ar_id);
diff --git a/maintenance/oracle/archives/patch-externallinks-el_id.sql b/maintenance/oracle/archives/patch-externallinks-el_id.sql
new file mode 100644
index 00000000..a8c443f4
--- /dev/null
+++ b/maintenance/oracle/archives/patch-externallinks-el_id.sql
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.externallinks ADD el_id NUMBER NOT NULL;
+ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_pk PRIMARY KEY (el_id);
\ No newline at end of file
diff --git a/maintenance/oracle/tables.sql b/maintenance/oracle/tables.sql
index ba69da1b..acfabc33 100644
--- a/maintenance/oracle/tables.sql
+++ b/maintenance/oracle/tables.sql
@@ -129,7 +129,9 @@ CREATE TABLE &mw_prefix.pagecontent ( -- replaces reserved word 'text'
 );
 ALTER TABLE &mw_prefix.pagecontent ADD CONSTRAINT &mw_prefix.pagecontent_pk PRIMARY KEY (old_id);
 
+CREATE SEQUENCE archive_ar_id_seq;
 CREATE TABLE &mw_prefix.archive (
+  ar_id          NUMBER NOT NULL,
   ar_namespace   NUMBER    DEFAULT 0 NOT NULL,
   ar_title       VARCHAR2(255)         NOT NULL,
   ar_text        CLOB,
@@ -149,6 +151,7 @@ CREATE TABLE &mw_prefix.archive (
   ar_content_model VARCHAR2(32),
   ar_content_format VARCHAR2(64)
 );
+ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_pk PRIMARY KEY (ar_id);
 ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk1 FOREIGN KEY (ar_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
 CREATE INDEX &mw_prefix.archive_i01 ON &mw_prefix.archive (ar_namespace,ar_title,ar_timestamp);
 CREATE INDEX &mw_prefix.archive_i02 ON &mw_prefix.archive (ar_user_text,ar_timestamp);
@@ -208,23 +211,19 @@ ALTER TABLE &mw_prefix.category ADD CONSTRAINT &mw_prefix.category_pk PRIMARY KE
 CREATE UNIQUE INDEX &mw_prefix.category_u01 ON &mw_prefix.category (cat_title);
 CREATE INDEX &mw_prefix.category_i01 ON &mw_prefix.category (cat_pages);
 
+CREATE SEQUENCE externallinks_el_id_seq;
 CREATE TABLE &mw_prefix.externallinks (
+  el_id     NUMBER  NOT NULL,
   el_from   NUMBER  NOT NULL,
   el_to     VARCHAR2(2048) NOT NULL,
   el_index  VARCHAR2(2048) NOT NULL
 );
+ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_pk PRIMARY KEY (el_id);
 ALTER TABLE &mw_prefix.externallinks ADD CONSTRAINT &mw_prefix.externallinks_fk1 FOREIGN KEY (el_from) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
 CREATE INDEX &mw_prefix.externallinks_i01 ON &mw_prefix.externallinks (el_from, el_to);
 CREATE INDEX &mw_prefix.externallinks_i02 ON &mw_prefix.externallinks (el_to, el_from);
 CREATE INDEX &mw_prefix.externallinks_i03 ON &mw_prefix.externallinks (el_index);
 
-CREATE TABLE &mw_prefix.external_user (
-  eu_local_id NUMBER NOT NULL,
-  eu_external_id varchar2(255) NOT NULL
-);
-ALTER TABLE &mw_prefix.external_user ADD CONSTRAINT &mw_prefix.external_user_pk PRIMARY KEY (eu_local_id);
-CREATE UNIQUE INDEX &mw_prefix.external_user_u01 ON &mw_prefix.external_user (eu_external_id);
-
 CREATE TABLE &mw_prefix.langlinks (
   ll_from    NUMBER  NOT NULL,
   ll_lang    VARCHAR2(20),
@@ -416,8 +415,6 @@ CREATE TABLE &mw_prefix.recentchanges (
   rc_this_oldid      NUMBER      DEFAULT 0 NOT NULL,
   rc_last_oldid      NUMBER      DEFAULT 0 NOT NULL,
   rc_type            CHAR(1)         DEFAULT '0' NOT NULL,
-  rc_moved_to_ns     NUMBER          DEFAULT 0 NOT NULL,
-  rc_moved_to_title  VARCHAR2(255),
   rc_patrolled       CHAR(1)         DEFAULT '0' NOT NULL,
   rc_ip              VARCHAR2(15),
   rc_old_len         NUMBER,
@@ -643,10 +640,11 @@ ALTER TABLE &mw_prefix.valid_tag ADD CONSTRAINT &mw_prefix.valid_tag_pk PRIMARY
 
 -- This table is not used unless profiling is turned on
 --CREATE TABLE &mw_prefix.profiling (
---  pf_count   NUMBER         DEFAULT 0 NOT NULL,
---  pf_time    NUMERIC(18,10)  DEFAULT 0 NOT NULL,
---  pf_name    CLOB            NOT NULL,
---  pf_server  CLOB            NULL
+--  pf_count   NUMBER          DEFAULT 0 NOT NULL,
+--  pf_time    NUMBER(18,10)   DEFAULT 0 NOT NULL,
+--  pf_memory  NUMBER(18,10)   DEFAULT 0 NOT NULL,
+--  pf_name    VARCHAR2(255),
+--  pf_server  VARCHAR2(30)
 --);
 --CREATE UNIQUE INDEX &mw_prefix.profiling_u01 ON &mw_prefix.profiling (pf_name, pf_server);
 
diff --git a/maintenance/orphans.php b/maintenance/orphans.php
index 3b1a9b0e..b4d255ab 100644
--- a/maintenance/orphans.php
+++ b/maintenance/orphans.php
@@ -28,7 +28,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that looks for 'orphan' revisions hooked to pages which
@@ -171,7 +171,7 @@ class Orphans extends Maintenance {
 	 */
 	private function checkSeparation( $fix ) {
 		$dbw = wfGetDB( DB_MASTER );
-		$page     = $dbw->tableName( 'page' );
+		$page = $dbw->tableName( 'page' );
 		$revision = $dbw->tableName( 'revision' );
 
 		if ( $fix ) {
@@ -209,7 +209,7 @@ class Orphans extends Maintenance {
 							'revision',
 							'rev_id',
 							array(
-								'rev_page'      => $row->page_id,
+								'rev_page' => $row->page_id,
 								'rev_timestamp' => $row2->max_timestamp ) );
 						$this->output( "... updating to revision $maxId\n" );
 						$maxRev = Revision::newFromId( $maxId );
@@ -239,4 +239,4 @@ class Orphans extends Maintenance {
 }
 
 $maintClass = "Orphans";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/parse.php b/maintenance/parse.php
index 58e76b0a..3ac7a281 100644
--- a/maintenance/parse.php
+++ b/maintenance/parse.php
@@ -49,7 +49,7 @@
  * @license GNU General Public License 2.0 or later
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to parse some wikitext.
@@ -85,12 +85,12 @@ class CLIParser extends Maintenance {
 	 */
 	protected function Wikitext() {
 
-		$php_stdin  = 'php://stdin';
+		$php_stdin = 'php://stdin';
 		$input_file = $this->getArg( 0, $php_stdin );
 
-		if( $input_file === $php_stdin ) {
+		if ( $input_file === $php_stdin ) {
 			$ctrl = wfIsWindows() ? 'CTRL+Z' : 'CTRL+D';
-			$this->error( basename(__FILE__) .": warning: reading wikitext from STDIN. Press $ctrl to parse.\n" );
+			$this->error( basename( __FILE__ ) . ": warning: reading wikitext from STDIN. Press $ctrl to parse.\n" );
 		}
 
 		return file_get_contents( $input_file );
@@ -113,7 +113,7 @@ class CLIParser extends Maintenance {
 		$title =
 			$this->getOption( 'title' )
 			? $this->getOption( 'title' )
-			: 'CLIParser' ;
+			: 'CLIParser';
 		return Title::newFromText( $title );
 	}
 
@@ -131,4 +131,4 @@ class CLIParser extends Maintenance {
 }
 
 $maintClass = "CLIParser";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/patchSql.php b/maintenance/patchSql.php
index 1f393556..31ce1566 100644
--- a/maintenance/patchSql.php
+++ b/maintenance/patchSql.php
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that manually runs an SQL patch outside of the general updaters.
@@ -62,4 +62,4 @@ class PatchSql extends Maintenance {
 }
 
 $maintClass = "PatchSql";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateCategory.php b/maintenance/populateCategory.php
index ae54d698..4c8cdaa1 100644
--- a/maintenance/populateCategory.php
+++ b/maintenance/populateCategory.php
@@ -22,7 +22,7 @@
  * @author Simetrical
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Mainteance script to populate the category table.
@@ -142,4 +142,4 @@ TEXT;
 }
 
 $maintClass = "PopulateCategory";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateFilearchiveSha1.php b/maintenance/populateFilearchiveSha1.php
index 27e692d1..c579d4fc 100644
--- a/maintenance/populateFilearchiveSha1.php
+++ b/maintenance/populateFilearchiveSha1.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once dirname( __FILE__ ) . '/Maintenance.php';
 
 /**
  * Maintenance script to populate the fa_sha1 field.
@@ -86,7 +86,7 @@ class PopulateFilearchiveSha1 extends LoggedUpdateMaintenance {
 			}
 
 			$done += $i;
-			if( $i !== $batchSize ) {
+			if ( $i !== $batchSize ) {
 				break;
 			}
 
@@ -94,7 +94,7 @@ class PopulateFilearchiveSha1 extends LoggedUpdateMaintenance {
 			$this->output( sprintf(
 				"id %d done (up to %d), %5.3f%%  \r", $lastId, $endId, $lastId / $endId * 100 ) );
 			wfWaitForSlaves();
-		} while( true );
+		} while ( true );
 
 		$processingTime = microtime( true ) - $startTime;
 		$this->output( sprintf( "\nDone %d files in %.1f seconds\n", $done, $processingTime ) );
@@ -104,4 +104,4 @@ class PopulateFilearchiveSha1 extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "PopulateFilearchiveSha1";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateImageSha1.php b/maintenance/populateImageSha1.php
index 37429a34..126d22d9 100644
--- a/maintenance/populateImageSha1.php
+++ b/maintenance/populateImageSha1.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to populate the img_sha1 field.
@@ -164,4 +164,4 @@ class PopulateImageSha1 extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "PopulateImageSha1";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateLogSearch.php b/maintenance/populateLogSearch.php
index 99d81557..d65635e5 100644
--- a/maintenance/populateLogSearch.php
+++ b/maintenance/populateLogSearch.php
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that makes the required database updates for populating the
@@ -75,7 +75,9 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
 				if ( LogEventsList::typeAction( $row, $delTypes, 'revision' ) ) {
 					$params = LogPage::extractParams( $row->log_params );
 					// Param format: <urlparam> <item CSV> [<ofield> <nfield>]
-					if ( count( $params ) < 2 ) continue; // bad row?
+					if ( count( $params ) < 2 ) {
+						continue; // bad row?
+					}
 					$field = RevisionDeleter::getRelationType( $params[0] );
 					// B/C, the params may start with a title key (<title> <urlparam> <CSV>)
 					if ( $field == null ) {
@@ -97,8 +99,9 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
 					$log->addRelations( $field, $items, $row->log_id );
 					// Determine what table to query...
 					$prefix = substr( $field, 0, strpos( $field, '_' ) ); // db prefix
-					if ( !isset( self::$tableMap[$prefix] ) )
+					if ( !isset( self::$tableMap[$prefix] ) ) {
 						continue; // bad row?
+					}
 					$table = self::$tableMap[$prefix];
 					$userField = $prefix . '_user';
 					$userTextField = $prefix . '_user_text';
@@ -109,10 +112,11 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
 						array( $field => $items )
 					);
 					foreach ( $sres as $srow ) {
-						if ( $srow->$userField > 0 )
+						if ( $srow->$userField > 0 ) {
 							$userIds[] = intval( $srow->$userField );
-						elseif ( $srow->$userTextField != '' )
+						} elseif ( $srow->$userTextField != '' ) {
 							$userIPs[] = $srow->$userTextField;
+						}
 					}
 					// Add item author relations...
 					$log->addRelations( 'target_author_id', $userIds, $row->log_id );
@@ -121,7 +125,9 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
 				} elseif ( LogEventsList::typeAction( $row, $delTypes, 'event' ) ) {
 					$params = LogPage::extractParams( $row->log_params );
 					// Param format: <item CSV> [<ofield> <nfield>]
-					if ( count( $params ) < 1 ) continue; // bad row
+					if ( count( $params ) < 1 ) {
+						continue; // bad row
+					}
 					$items = explode( ',', $params[0] );
 					$log = new LogPage( $row->log_type );
 					// Add item relations...
@@ -133,10 +139,11 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
 						array( 'log_id' => $items )
 					);
 					foreach ( $sres as $srow ) {
-						if ( $srow->log_user > 0 )
+						if ( $srow->log_user > 0 ) {
 							$userIds[] = intval( $srow->log_user );
-						elseif ( IP::isIPAddress( $srow->log_user_text ) )
+						} elseif ( IP::isIPAddress( $srow->log_user_text ) ) {
 							$userIPs[] = $srow->log_user_text;
+						}
 					}
 					$log->addRelations( 'target_author_id', $userIds, $row->log_id );
 					$log->addRelations( 'target_author_ip', $userIPs, $row->log_id );
@@ -152,4 +159,4 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "PopulateLogSearch";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateLogUsertext.php b/maintenance/populateLogUsertext.php
index fa9d512f..e579e522 100644
--- a/maintenance/populateLogUsertext.php
+++ b/maintenance/populateLogUsertext.php
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that makes the required database updates for
@@ -82,4 +82,4 @@ class PopulateLogUsertext extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "PopulateLogUsertext";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateParentId.php b/maintenance/populateParentId.php
index e81d4ffb..e29fa5f1 100644
--- a/maintenance/populateParentId.php
+++ b/maintenance/populateParentId.php
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that makes the required database updates for rev_parent_id
@@ -98,8 +98,9 @@ class PopulateParentId extends LoggedUpdateMaintenance {
 					}
 				}
 				$previousID = intval( $previousID );
-				if ( $previousID != $row->rev_parent_id )
+				if ( $previousID != $row->rev_parent_id ) {
 					$changed++;
+				}
 				# Update the row...
 				$db->update( 'revision',
 					array( 'rev_parent_id' => $previousID ),
@@ -117,4 +118,4 @@ class PopulateParentId extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "PopulateParentId";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateRevisionLength.php b/maintenance/populateRevisionLength.php
index 7c529d53..3c69125a 100644
--- a/maintenance/populateRevisionLength.php
+++ b/maintenance/populateRevisionLength.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that populates the rev_len field for old revisions
@@ -48,8 +48,8 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
 		$db = $this->getDB( DB_MASTER );
 		if ( !$db->tableExists( 'revision' ) ) {
 			$this->error( "revision table does not exist", true );
-		} else if ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
-			$this->output( "rev_sha1 column does not exist\n\n", true );
+		} elseif ( !$db->fieldExists( 'revision', 'rev_len', __METHOD__ ) ) {
+			$this->output( "rev_len column does not exist\n\n", true );
 			return false;
 		}
 
@@ -70,12 +70,16 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
 		$fields = Revision::selectFields();
 		while ( $blockStart <= $end ) {
 			$this->output( "...doing rev_id from $blockStart to $blockEnd\n" );
-			$res = $db->select( 'revision',
-						$fields,
-						array( "rev_id >= $blockStart",
-						   "rev_id <= $blockEnd",
-						   "rev_len IS NULL" ),
-						__METHOD__ );
+			$res = $db->select(
+				'revision',
+				$fields,
+				array(
+					"rev_id >= $blockStart",
+					"rev_id <= $blockEnd",
+					"rev_len IS NULL"
+				),
+				__METHOD__
+			);
 			# Go through and update rev_len from these rows.
 			foreach ( $res as $row ) {
 				$rev = new Revision( $row );
@@ -105,4 +109,4 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "PopulateRevisionLength";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/populateRevisionSha1.php b/maintenance/populateRevisionSha1.php
index 113eef49..89bfb85b 100644
--- a/maintenance/populateRevisionSha1.php
+++ b/maintenance/populateRevisionSha1.php
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that fills the rev_sha1 and ar_sha1 columns of revision
@@ -48,7 +48,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
 			$this->error( "revision table does not exist", true );
 		} elseif ( !$db->tableExists( 'archive' ) ) {
 			$this->error( "archive table does not exist", true );
-		} else if ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
+		} elseif ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
 			$this->output( "rev_sha1 column does not exist\n\n", true );
 			return false;
 		}
@@ -189,9 +189,9 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
 				array( 'ar_sha1' => Revision::base36Sha1( $text ) ),
 				array(
 					'ar_namespace' => $row->ar_namespace,
-					'ar_title'     => $row->ar_title,
+					'ar_title' => $row->ar_title,
 					'ar_timestamp' => $row->ar_timestamp,
-					'ar_len'       => $row->ar_len // extra sanity
+					'ar_len' => $row->ar_len // extra sanity
 				),
 				__METHOD__
 			);
@@ -201,4 +201,4 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "PopulateRevisionSha1";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/postgres/archives/patch-external_user.sql b/maintenance/postgres/archives/patch-external_user.sql
deleted file mode 100644
index 6058a706..00000000
--- a/maintenance/postgres/archives/patch-external_user.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE TABLE external_user (
-  eu_local_id     INTEGER  NOT NULL  PRIMARY KEY,
-  eu_external_id TEXT
-);
-
-CREATE UNIQUE INDEX eu_external_id ON external_user (eu_external_id);
diff --git a/maintenance/postgres/archives/patch-kill-iwl_pft.sql b/maintenance/postgres/archives/patch-kill-iwl_pft.sql
deleted file mode 100644
index 4419d9e9..00000000
--- a/maintenance/postgres/archives/patch-kill-iwl_pft.sql
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- Kill the old iwl_prefix_from_title index, which may be present on some
--- installs if they ran update.php between it being added and being renamed
---
-
-DROP INDEX iwl_prefix_from_title;
-
diff --git a/maintenance/postgres/archives/patch-profiling.sql b/maintenance/postgres/archives/patch-profiling.sql
index 1c4dce4e..5a2710a8 100644
--- a/maintenance/postgres/archives/patch-profiling.sql
+++ b/maintenance/postgres/archives/patch-profiling.sql
@@ -1,6 +1,7 @@
 CREATE TABLE profiling (
   pf_count   INTEGER         NOT NULL DEFAULT 0,
-  pf_time    NUMERIC(18,10)  NOT NULL DEFAULT 0,
+  pf_time    FLOAT           NOT NULL DEFAULT 0,
+  pf_memory  FLOAT           NOT NULL DEFAULT 0,
   pf_name    TEXT            NOT NULL,
   pf_server  TEXT            NULL
 );
diff --git a/maintenance/postgres/archives/patch-rename-iwl_prefix.sql b/maintenance/postgres/archives/patch-rename-iwl_prefix.sql
index a4bdb6a9..0eb792ea 100644
--- a/maintenance/postgres/archives/patch-rename-iwl_prefix.sql
+++ b/maintenance/postgres/archives/patch-rename-iwl_prefix.sql
@@ -1,2 +1,2 @@
 DROP INDEX iwl_prefix;
-CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_from, iwl_title);
+CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_title, iwl_from);
diff --git a/maintenance/postgres/tables.sql b/maintenance/postgres/tables.sql
index 9cbabfdf..bc2428e4 100644
--- a/maintenance/postgres/tables.sql
+++ b/maintenance/postgres/tables.sql
@@ -18,6 +18,8 @@ DROP SEQUENCE IF EXISTS recentchanges_rc_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS logging_log_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS job_job_id_seq CASCADE;
 DROP SEQUENCE IF EXISTS category_cat_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS archive_ar_id_seq CASCADE;
+DROP SEQUENCE IF EXISTS externallinks_el_id_seq CASCADE;
 DROP FUNCTION IF EXISTS page_deleted() CASCADE;
 DROP FUNCTION IF EXISTS ts2_page_title() CASCADE;
 DROP FUNCTION IF EXISTS ts2_page_text() CASCADE;
@@ -156,7 +158,9 @@ ALTER TABLE page_props ADD CONSTRAINT page_props_pk PRIMARY KEY (pp_page,pp_prop
 CREATE INDEX page_props_propname ON page_props (pp_propname);
 CREATE UNIQUE INDEX pp_propname_page ON page_props (pp_propname,pp_page);
 
+CREATE SEQUENCE archive_ar_id_seq;
 CREATE TABLE archive (
+  ar_id             INTEGER      NOT NULL  PRIMARY KEY DEFAULT nextval('archive_ar_id_seq'),
   ar_namespace      SMALLINT     NOT NULL,
   ar_title          TEXT         NOT NULL,
   ar_text           TEXT, -- technically should be bytea, but not used anymore
@@ -224,7 +228,9 @@ CREATE TABLE categorylinks (
 CREATE UNIQUE INDEX cl_from ON categorylinks (cl_from, cl_to);
 CREATE INDEX cl_sortkey     ON categorylinks (cl_to, cl_sortkey, cl_from);
 
+CREATE SEQUENCE externallinks_id_seq;
 CREATE TABLE externallinks (
+  el_id     INTEGER  NOT NULL  PRIMARY KEY DEFAULT nextval('externallinks_id_seq'),
   el_from   INTEGER  NOT NULL  REFERENCES page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
   el_to     TEXT     NOT NULL,
   el_index  TEXT     NOT NULL
@@ -232,13 +238,6 @@ CREATE TABLE externallinks (
 CREATE INDEX externallinks_from_to ON externallinks (el_from,el_to);
 CREATE INDEX externallinks_index   ON externallinks (el_index);
 
-CREATE TABLE external_user (
-  eu_local_id     INTEGER  NOT NULL  PRIMARY KEY,
-  eu_external_id TEXT
-);
-
-CREATE UNIQUE INDEX eu_external_id ON external_user (eu_external_id);
-
 CREATE TABLE langlinks (
   ll_from    INTEGER  NOT NULL  REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
   ll_lang    TEXT,
@@ -412,8 +411,6 @@ CREATE TABLE recentchanges (
   rc_this_oldid      INTEGER      NOT NULL,
   rc_last_oldid      INTEGER      NOT NULL,
   rc_type            SMALLINT     NOT NULL  DEFAULT 0,
-  rc_moved_to_ns     SMALLINT,
-  rc_moved_to_title  TEXT,
   rc_patrolled       SMALLINT     NOT NULL  DEFAULT 0,
   rc_ip              CIDR,
   rc_old_len         INTEGER,
@@ -594,8 +591,8 @@ $mw$;
 -- This table is not used unless profiling is turned on
 CREATE TABLE profiling (
   pf_count   INTEGER         NOT NULL DEFAULT 0,
-  pf_time    NUMERIC(18,10)  NOT NULL DEFAULT 0,
-  pf_memory  NUMERIC(18,10)  NOT NULL DEFAULT 0,
+  pf_time    FLOAT           NOT NULL DEFAULT 0,
+  pf_memory  FLOAT           NOT NULL DEFAULT 0,
   pf_name    TEXT            NOT NULL,
   pf_server  TEXT            NULL
 );
@@ -679,6 +676,7 @@ CREATE TABLE iwlinks (
 );
 CREATE UNIQUE INDEX iwl_from ON iwlinks (iwl_from, iwl_prefix, iwl_title);
 CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_title, iwl_from);
+CREATE UNIQUE INDEX iwl_prefix_from_title ON iwlinks (iwl_prefix, iwl_from, iwl_title);
 
 CREATE TABLE msg_resource (
   mr_resource   TEXT         NOT NULL,
diff --git a/maintenance/preprocessDump.php b/maintenance/preprocessDump.php
index bb3d68b0..0dc19e28 100644
--- a/maintenance/preprocessDump.php
+++ b/maintenance/preprocessDump.php
@@ -25,7 +25,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/dumpIterator.php' );
+require_once __DIR__ . '/dumpIterator.php';
 
 /**
  * Maintenance script that takes page text out of an XML dump file and
@@ -86,12 +86,11 @@ class PreprocessDump extends DumpIterator {
 
 		try {
 			$this->mPreprocessor->preprocessToObj( strval( $content->getNativeData() ), 0 );
-		}
-		catch(Exception $e) {
-			$this->error("Caught exception " . $e->getMessage() . " in " . $rev->getTitle()->getPrefixedText() );
+		} catch ( Exception $e ) {
+			$this->error( "Caught exception " . $e->getMessage() . " in " . $rev->getTitle()->getPrefixedText() );
 		}
 	}
 }
 
 $maintClass = "PreprocessDump";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/preprocessorFuzzTest.php b/maintenance/preprocessorFuzzTest.php
index 49c7aee3..563ea459 100644
--- a/maintenance/preprocessorFuzzTest.php
+++ b/maintenance/preprocessorFuzzTest.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
 
 $wgHooks['BeforeParserFetchTemplateAndtitle'][] = 'PPFuzzTester::templateHook';
 
@@ -29,7 +29,7 @@ class PPFuzzTester {
 	public $hairs = array(
 		'[[', ']]', '{{', '{{', '}}', '}}', '{{{', '}}}',
 		'<', '>', '<nowiki', '<gallery', '</nowiki>', '</gallery>', '<nOwIkI>', '</NoWiKi>',
-		'<!--' , '-->',
+		'<!--', '-->',
 		"\n==", "==\n",
 		'|', '=', "\n", ' ', "\t", "\x7f",
 		'~~', '~~~', '~~~~', 'subst:',
diff --git a/maintenance/protect.php b/maintenance/protect.php
index ff13bd6e..ec03f934 100644
--- a/maintenance/protect.php
+++ b/maintenance/protect.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that protects or unprotects a page.
@@ -67,7 +67,7 @@ class Protect extends Maintenance {
 		}
 
 		$restrictions = array();
-		foreach( $t->getRestrictionTypes() as $type ) {
+		foreach ( $t->getRestrictionTypes() as $type ) {
 			$restrictions[$type] = $protection;
 		}
 
@@ -86,4 +86,4 @@ class Protect extends Maintenance {
 }
 
 $maintClass = "Protect";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/proxyCheck.php b/maintenance/proxyCheck.php
deleted file mode 100644
index 2ccf703e..00000000
--- a/maintenance/proxyCheck.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/**
- * Command line script to check for an open proxy at a specified location.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-if( PHP_SAPI != 'cli' ) {
-	die( 1 );
-}
-
-/**
- *
- */
-$output = '';
-
-/**
- * Exit if there are not enough parameters, or if it's not command line mode
- */
-if ( ( isset( $_REQUEST ) && array_key_exists( 'argv', $_REQUEST ) ) || count( $argv ) < 4 ) {
-	$output .= "Incorrect parameters\n";
-} else {
-	/**
-	 * Get parameters
-	 */
-	$ip = $argv[1];
-	$port = $argv[2];
-	$url = $argv[3];
-	$host = trim(`hostname`);
-	$output = "Connecting to $ip:$port, target $url, this hostname $host\n";
-
-	# Open socket
-	$sock = @fsockopen($ip, $port, $errno, $errstr, 5);
-	if ($errno == 0 ) {
-		$output .= "Connected\n";
-		# Send payload
-		$request = "GET $url HTTP/1.0\r\n";
-#		$request .= "Proxy-Connection: Keep-Alive\r\n";
-#		$request .= "Pragma: no-cache\r\n";
-#		$request .= "Host: ".$url."\r\n";
-#		$request .= "User-Agent: MediaWiki open proxy check\r\n";
-		$request .= "\r\n";
-		@fputs($sock, $request);
-		$response = fgets($sock, 65536);
-		$output .= $response;
-		@fclose($sock);
-	} else {
-		$output .= "No connection\n";
-	}
-}
-
-$output = escapeshellarg( $output );
-
-#`echo $output >> /home/tstarling/open/proxy.log`;
diff --git a/maintenance/pruneFileCache.php b/maintenance/pruneFileCache.php
index e058e3ec..48d38977 100644
--- a/maintenance/pruneFileCache.php
+++ b/maintenance/pruneFileCache.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that prunes file cache for pages, objects, resources, etc.
@@ -108,4 +108,4 @@ class PruneFileCache extends Maintenance {
 }
 
 $maintClass = "PruneFileCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/purgeChangedFiles.php b/maintenance/purgeChangedFiles.php
new file mode 100644
index 00000000..9f83ee7f
--- /dev/null
+++ b/maintenance/purgeChangedFiles.php
@@ -0,0 +1,255 @@
+<?php
+/**
+ * Scan the logging table and purge affected files within a timeframe.
+ *
+ * @section 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that scans the deletion log and purges affected files
+ * within a timeframe.
+ *
+ * @ingroup Maintenance
+ */
+class PurgeChangedFiles extends Maintenance {
+	/**
+	 * Mapping from type option to log type and actions.
+	 * @var array
+	 */
+	private static $typeMappings = array(
+		'created' => array(
+			'upload' => array( 'upload' ),
+			'import' => array( 'upload', 'interwiki' ),
+		),
+		'deleted' => array(
+			'delete' => array( 'delete', 'revision' ),
+			'suppress' => array( 'delete', 'revision' ),
+		),
+		'modified' => array(
+			'upload' => array( 'overwrite', 'revert' ),
+			'move' => array( 'move', 'move_redir' ),
+		),
+	);
+
+	/**
+	 * @var string
+	 */
+	private $startTimestamp;
+
+	/**
+	 * @var string
+	 */
+	private $endTimestamp;
+
+	public function __construct() {
+		parent::__construct();
+		$this->mDescription = "Scan the logging table and purge files and thumbnails.";
+		$this->addOption( 'starttime', 'Starting timestamp', true, true );
+		$this->addOption( 'endtime', 'Ending timestamp', true, true );
+		$this->addOption( 'type', 'Comma-separated list of types of changes to send purges for (' .
+			implode( ',', array_keys( self::$typeMappings ) ) . ',all)', false, true );
+		$this->addOption( 'htcp-dest', 'HTCP announcement destination (IP:port)', false, true );
+		$this->addOption( 'dry-run', 'Do not send purge requests' );
+		$this->addOption( 'verbose', 'Show more output', false, false, 'v' );
+	}
+
+	public function execute() {
+		global $wgHTCPRouting;
+
+		if ( $this->hasOption( 'htcp-dest' ) ) {
+			$parts = explode( ':', $this->getOption( 'htcp-dest' ) );
+			if ( count( $parts ) < 2 ) {
+				// Add default htcp port
+				$parts[] = '4827';
+			}
+
+			// Route all HTCP messages to provided host:port
+			$wgHTCPRouting = array(
+				'' => array( 'host' => $parts[0], 'port' => $parts[1] ),
+			);
+			$this->verbose( "HTCP broadcasts to {$parts[0]}:{$parts[1]}\n" );
+		}
+
+		// Find out which actions we should be concerned with
+		$typeOpt = $this->getOption( 'type', 'all' );
+		$validTypes = array_keys( self::$typeMappings );
+		if ( $typeOpt === 'all' ) {
+			// Convert 'all' to all registered types
+			$typeOpt = implode( ',', $validTypes );
+		}
+		$typeList = explode( ',', $typeOpt );
+		foreach ( $typeList as $type ) {
+			if ( !in_array( $type, $validTypes ) ) {
+				$this->error( "\nERROR: Unknown type: {$type}\n" );
+				$this->maybeHelp( true );
+			}
+		}
+
+		// Validate the timestamps
+		$dbr = $this->getDB( DB_SLAVE );
+		$this->startTimestamp = $dbr->timestamp( $this->getOption( 'starttime' ) );
+		$this->endTimestamp = $dbr->timestamp( $this->getOption( 'endtime' ) );
+
+		if ( $this->startTimestamp > $this->endTimestamp ) {
+			$this->error( "\nERROR: starttime after endtime\n" );
+			$this->maybeHelp( true );
+		}
+
+		// Turn on verbose when dry-run is enabled
+		if ( $this->hasOption( 'dry-run' ) ) {
+			$this->mOptions['verbose'] = 1;
+		}
+
+		$this->verbose( 'Purging files that were: ' . implode( ', ', $typeList ) . "\n");
+		foreach ( $typeList as $type ) {
+			$this->verbose( "Checking for {$type} files...\n" );
+			$this->purgeFromLogType( $type );
+			if ( !$this->hasOption( 'dry-run' ) ) {
+				$this->verbose( "...{$type} files purged.\n\n" );
+			}
+		}
+	}
+
+	/**
+	 * Purge cache and thumbnails for changes of the given type.
+	 *
+	 * @param string $type Type of change to find
+	 */
+	protected function purgeFromLogType( $type ) {
+		$repo = RepoGroup::singleton()->getLocalRepo();
+		$dbr = $this->getDB( DB_SLAVE );
+
+		foreach ( self::$typeMappings[$type] as $logType => $logActions ) {
+			$this->verbose( "Scanning for {$logType}/" . implode( ',', $logActions ) . "\n" );
+
+			$res = $dbr->select(
+				'logging',
+				array( 'log_title', 'log_timestamp', 'log_params' ),
+				array(
+					'log_namespace' => NS_FILE,
+					'log_type' => $logType,
+					'log_action' => $logActions,
+					'log_timestamp >= ' . $dbr->addQuotes( $this->startTimestamp ),
+					'log_timestamp <= ' . $dbr->addQuotes( $this->endTimestamp ),
+				),
+				__METHOD__
+			);
+
+			foreach ( $res as $row ) {
+				$file = $repo->newFile( Title::makeTitle( NS_FILE, $row->log_title ) );
+
+				if ( $this->hasOption( 'dry-run' ) ) {
+					$this->verbose( "{$type}[{$row->log_timestamp}]: {$row->log_title}\n" );
+					continue;
+				}
+
+				// Purge current version and any versions in oldimage table
+				$file->purgeCache();
+				$file->purgeHistory();
+
+				if ( $logType === 'delete' ) {
+					// If there is an orphaned storage file... delete it
+					if ( !$file->exists() && $repo->fileExists( $file->getPath() ) ) {
+						$dpath = $this->getDeletedPath( $repo, $file );
+						if ( $repo->fileExists( $dpath ) ) {
+							// Sanity check to avoid data loss
+							$repo->getBackend()->delete( array( 'src' => $file->getPath() ) );
+							$this->verbose( "Deleted orphan file: {$file->getPath()}.\n" );
+
+						} else {
+							$this->error( "File was not deleted: {$file->getPath()}.\n" );
+						}
+					}
+
+					// Purge items from fileachive table (rows are likely here)
+					$this->purgeFromArchiveTable( $repo, $file );
+
+				} else if ( $logType === 'move' ) {
+					// Purge the target file as well
+
+					$params = unserialize( $row->log_params );
+					if ( isset( $params['4::target'] ) ) {
+						$target = $params['4::target'];
+						$targetFile = $repo->newFile( Title::makeTitle( NS_FILE, $target ) );
+						$targetFile->purgeCache();
+						$targetFile->purgeHistory();
+						$this->verbose( "Purged file {$target}; move target @{$row->log_timestamp}.\n" );
+					}
+				}
+
+				$this->verbose( "Purged file {$row->log_title}; {$type} @{$row->log_timestamp}.\n" );
+			}
+		}
+	}
+
+	protected function purgeFromArchiveTable( LocalRepo $repo, LocalFile $file ) {
+		$dbr = $repo->getSlaveDB();
+		$res = $dbr->select(
+			'filearchive',
+			array( 'fa_archive_name' ),
+			array( 'fa_name' => $file->getName() ),
+			__METHOD__
+		);
+
+		foreach ( $res as $row ) {
+			if ( $row->fa_archive_name === null ) {
+				// Was not an old version (current version names checked already)
+				continue;
+			}
+			$ofile = $repo->newFromArchiveName( $file->getTitle(), $row->fa_archive_name );
+			// If there is an orphaned storage file still there...delete it
+			if ( !$file->exists() && $repo->fileExists( $ofile->getPath() ) ) {
+				$dpath = $this->getDeletedPath( $repo, $ofile );
+				if ( $repo->fileExists( $dpath ) ) {
+					// Sanity check to avoid data loss
+					$repo->getBackend()->delete( array( 'src' => $ofile->getPath() ) );
+					$this->output( "Deleted orphan file: {$ofile->getPath()}.\n" );
+
+				} else {
+					$this->error( "File was not deleted: {$ofile->getPath()}.\n" );
+				}
+			}
+			$file->purgeOldThumbnails( $row->fa_archive_name );
+		}
+	}
+
+	protected function getDeletedPath( LocalRepo $repo, LocalFile $file ) {
+		$hash = $repo->getFileSha1( $file->getPath() );
+		$key = "{$hash}.{$file->getExtension()}";
+		return $repo->getDeletedHashPath( $key ) . $key;
+	}
+
+	/**
+	 * Send an output message iff the 'verbose' option has been provided.
+	 *
+	 * @param string $msg Message to output
+	 */
+	protected function verbose( $msg ) {
+		if ( $this->hasOption( 'verbose' ) ) {
+			$this->output( $msg );
+		}
+	}
+
+}
+
+$maintClass = "PurgeChangedFiles";
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/purgeChangedPages.php b/maintenance/purgeChangedPages.php
new file mode 100644
index 00000000..071ac09c
--- /dev/null
+++ b/maintenance/purgeChangedPages.php
@@ -0,0 +1,191 @@
+<?php
+/**
+ * Send purge requests for pages edited in date range to squid/varnish.
+ *
+ * @section 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that sends purge requests for pages edited in a date
+ * range to squid/varnish.
+ *
+ * Can be used to recover from an HTCP message partition or other major cache
+ * layer interruption.
+ *
+ * @ingroup Maintenance
+ */
+class PurgeChangedPages extends Maintenance {
+
+	public function __construct() {
+		parent::__construct();
+		$this->mDescription = 'Send purge requests for edits in date range to squid/varnish';
+		$this->addOption( 'starttime', 'Starting timestamp', true, true );
+		$this->addOption( 'endtime', 'Ending timestamp', true, true );
+		$this->addOption( 'htcp-dest', 'HTCP announcement destination (IP:port)', false, true );
+		$this->addOption( 'sleep-per-batch', 'Milliseconds to sleep between batches', false, true );
+		$this->addOption( 'dry-run', 'Do not send purge requests' );
+		$this->addOption( 'verbose', 'Show more output', false, false, 'v' );
+		$this->setBatchSize( 100 );
+	}
+
+	public function execute() {
+		global $wgHTCPRouting;
+
+		if ( $this->hasOption( 'htcp-dest' ) ) {
+			$parts = explode( ':', $this->getOption( 'htcp-dest' ) );
+			if ( count( $parts ) < 2 ) {
+				// Add default htcp port
+				$parts[] = '4827';
+			}
+
+			// Route all HTCP messages to provided host:port
+			$wgHTCPRouting = array(
+				'' => array( 'host' => $parts[0], 'port' => $parts[1] ),
+			);
+			if ( $this->hasOption( 'verbose' ) ) {
+				$this->output( "HTCP broadcasts to {$parts[0]}:{$parts[1]}\n" );
+			}
+		}
+
+		$dbr = $this->getDB( DB_SLAVE );
+		$minTime = $dbr->timestamp( $this->getOption( 'starttime' ) );
+		$maxTime = $dbr->timestamp( $this->getOption( 'endtime' ) );
+
+		if ( $maxTime < $minTime ) {
+			$this->error( "\nERROR: starttime after endtime\n" );
+			$this->maybeHelp( true );
+		}
+
+		$stuckCount = 0; // loop breaker
+		while ( true ) {
+			// Adjust bach size if we are stuck in a second that had many changes
+			$bSize = $this->mBatchSize + ( $stuckCount * $this->mBatchSize );
+
+			$res = $dbr->select(
+				array( 'page', 'revision' ),
+				array(
+					'rev_timestamp',
+					'page_namespace',
+					'page_title',
+				),
+				array(
+					"rev_timestamp > " . $dbr->addQuotes( $minTime ),
+					"rev_timestamp <= " . $dbr->addQuotes( $maxTime ),
+					// Only get rows where the revision is the latest for the page.
+					// Other revisions would be duplicate and we don't need to purge if
+					// there has been an edit after the interesting time window.
+					"page_latest = rev_id",
+				),
+				__METHOD__,
+				array( 'ORDER BY' => 'rev_timestamp', 'LIMIT' => $bSize ),
+				array(
+					'page' => array( 'INNER JOIN', 'rev_page=page_id' ),
+				)
+			);
+
+			if ( !$res->numRows() ) {
+				// nothing more found so we are done
+				break;
+			}
+
+			// Kludge to not get stuck in loops for batches with the same timestamp
+			list( $rows, $lastTime ) = $this->pageableSortedRows( $res, 'rev_timestamp', $bSize );
+			if ( !count( $rows ) ) {
+				++$stuckCount;
+				continue;
+			}
+			// Reset suck counter
+			$stuckCount = 0;
+
+			$this->output( "Processing changes from {$minTime} to {$lastTime}.\n" );
+
+			// Advance past the last row next time
+			$minTime = $lastTime;
+
+			// Create list of URLs from page_namespace + page_title
+			$urls = array();
+			foreach ( $rows as $row ) {
+				$title = Title::makeTitle( $row->page_namespace, $row->page_title );
+				$urls[] = $title->getInternalURL();
+			}
+
+			if ( $this->hasOption( 'dry-run' ) || $this->hasOption( 'verbose' ) ) {
+				$this->output( implode( "\n", $urls ) . "\n" );
+				if ( $this->hasOption( 'dry-run' ) ) {
+					continue;
+				}
+			}
+
+			// Send batch of purge requests out to squids
+			$squid = new SquidUpdate( $urls, count( $urls ) );
+			$squid->doUpdate();
+
+			if ( $this->hasOption( 'sleep-per-batch' ) ) {
+				// sleep-per-batch is milliseconds, usleep wants micro seconds.
+				usleep( 1000 * (int)$this->getOption( 'sleep-per-batch' ) );
+			}
+		}
+
+		$this->output( "Done!\n" );
+	}
+
+	/**
+	 * Remove all the rows in a result set with the highest value for column
+	 * $column unless the number of rows is less $limit. This returns the new
+	 * array of rows and the highest value of column $column for the rows left.
+	 * The ordering of rows is maintained.
+	 *
+	 * This is useful for paging on mostly-unique values that may sometimes
+	 * have large clumps of identical values. It should be safe to do the next
+	 * query on items with a value higher than the highest of the rows returned here.
+	 * If this returns an empty array for a non-empty query result, then all the rows
+	 * had the same column value and the query should be repeated with a higher LIMIT.
+	 *
+	 * @TODO: move this elsewhere
+	 *
+	 * @param ResultWrapper $res Query result sorted by $column (ascending)
+	 * @param string $column
+	 * @return array (array of rows, string column value)
+	 */
+	protected function pageableSortedRows( ResultWrapper $res, $column, $limit ) {
+		$rows = iterator_to_array( $res, false );
+		$count = count( $rows );
+		if ( !$count ) {
+			return array( array(), null ); // nothing to do
+		} elseif ( $count < $limit ) {
+			return array( $rows, $rows[$count - 1]->$column ); // no more rows left
+		}
+		$lastValue = $rows[$count - 1]->$column; // should be the highest
+		for ( $i = $count - 1; $i >= 0; --$i ) {
+			if ( $rows[$i]->$column === $lastValue ) {
+				unset( $rows[$i] );
+			} else {
+				break;
+			}
+		}
+		$lastValueLeft = count( $rows ) ? $rows[count( $rows ) - 1]->$column : null;
+		return array( $rows, $lastValueLeft );
+	}
+}
+
+$maintClass = "PurgeChangedPages";
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/purgeDeletedFiles.php b/maintenance/purgeDeletedFiles.php
deleted file mode 100644
index cd62716b..00000000
--- a/maintenance/purgeDeletedFiles.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-/**
- * Scan the deletion log and purges affected files within a timeframe.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script that scans the deletion log and purges affected files
- * within a timeframe.
- *
- * @ingroup Maintenance
- */
-class PurgeDeletedFiles extends Maintenance {
-	public function __construct() {
-		parent::__construct();
-		$this->mDescription = "Scan the logging table and purge files that where deleted.";
-		$this->addOption( 'starttime', 'Starting timestamp', false, true );
-		$this->addOption( 'endtime', 'Ending timestamp', false, true );
-	}
-
-	public function execute() {
-		$this->output( "Purging cache and thumbnails for deleted files...\n" );
-		$this->purgeFromLogType( 'delete' );
-		$this->output( "...deleted files purged.\n\n" );
-
-		$this->output( "Purging cache and thumbnails for suppressed files...\n" );
-		$this->purgeFromLogType( 'suppress' );
-		$this->output( "...suppressed files purged.\n" );
-	}
-
-	protected function purgeFromLogType( $logType ) {
-		$repo = RepoGroup::singleton()->getLocalRepo();
-		$db = $repo->getSlaveDB();
-
-		$conds = array(
-			'log_namespace' => NS_FILE,
-			'log_type'      => $logType,
-			'log_action'    => array( 'delete', 'revision' )
-		);
-		$start = $this->getOption( 'starttime' );
-		if ( $start ) {
-			$conds[] = 'log_timestamp >= ' . $db->addQuotes( $db->timestamp( $start ) );
-		}
-		$end = $this->getOption( 'endtime' );
-		if ( $end ) {
-			$conds[] = 'log_timestamp <= ' . $db->addQuotes( $db->timestamp( $end ) );
-		}
-
-		$res = $db->select( 'logging', array( 'log_title', 'log_timestamp' ), $conds, __METHOD__ );
-		foreach ( $res as $row ) {
-			$file = $repo->newFile( Title::makeTitle( NS_FILE, $row->log_title ) );
-
-			// Purge current version and any versions in oldimage table
-			$file->purgeCache();
-			$file->purgeHistory();
-			// Purge items from fileachive table (rows are likely here)
-			$this->purgeFromArchiveTable( $file );
-
-			$this->output( "Purged file {$row->log_title}; deleted on {$row->log_timestamp}.\n" );
-		}
-	}
-
-	protected function purgeFromArchiveTable( LocalFile $file ) {
-		$db = $file->getRepo()->getSlaveDB();
-		$res = $db->select( 'filearchive',
-			array( 'fa_archive_name' ),
-			array( 'fa_name' => $file->getName() ),
-			__METHOD__
-		);
-		foreach ( $res as $row ) {
-			$file->purgeOldThumbnails( $row->fa_archive_name );
-		}
-	}
-}
-
-$maintClass = "PurgeDeletedFiles";
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/maintenance/purgeList.php b/maintenance/purgeList.php
index b72c417e..2f895201 100644
--- a/maintenance/purgeList.php
+++ b/maintenance/purgeList.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that sends purge requests for listed pages to squid.
@@ -44,7 +44,7 @@ class PurgeList extends Maintenance {
 		if ( $this->hasOption( 'all' ) ) {
 			$this->purgeNamespace( false );
 		} elseif ( $this->hasOption( 'namespace' ) ) {
-			$this->purgeNamespace( intval( $this->getOption( 'namespace') ) );
+			$this->purgeNamespace( intval( $this->getOption( 'namespace' ) ) );
 		} else {
 			$this->doPurge();
 		}
@@ -63,7 +63,7 @@ class PurgeList extends Maintenance {
 			} elseif ( $page !== '' ) {
 				$title = Title::newFromText( $page );
 				if ( $title ) {
-					$url = $title->getInternalUrl();
+					$url = $title->getInternalURL();
 					$this->output( "$url\n" );
 					$urls[] = $url;
 					if ( $this->getOption( 'purge' ) ) {
@@ -74,7 +74,7 @@ class PurgeList extends Maintenance {
 				}
 			}
 		}
-		$this->output( "Purging " . count( $urls ). " urls\n" );
+		$this->output( "Purging " . count( $urls ) . " urls\n" );
 		$this->sendPurgeRequest( $urls );
 	}
 
@@ -88,7 +88,7 @@ class PurgeList extends Maintenance {
 			$conds = array( 'page_namespace' => $namespace );
 		}
 		while ( true ) {
-			$res = $dbr->select( 'page', 
+			$res = $dbr->select( 'page',
 				array( 'page_id', 'page_namespace', 'page_title' ),
 				$conds + array( 'page_id > ' . $dbr->addQuotes( $startId ) ),
 				__METHOD__,
@@ -104,7 +104,7 @@ class PurgeList extends Maintenance {
 			$urls = array();
 			foreach ( $res as $row ) {
 				$title = Title::makeTitle( $row->page_namespace, $row->page_title );
-				$url = $title->getInternalUrl();
+				$url = $title->getInternalURL();
 				$urls[] = $url;
 				$startId = $row->page_id;
 			}
@@ -129,7 +129,7 @@ class PurgeList extends Maintenance {
 			}
 		} else {
 			if ( $this->hasOption( 'verbose' ) ) {
-				$this->output( implode( "\n", $urls ) . "\n"  );
+				$this->output( implode( "\n", $urls ) . "\n" );
 			}
 			$u = new SquidUpdate( $urls );
 			$u->doUpdate();
@@ -139,4 +139,4 @@ class PurgeList extends Maintenance {
 }
 
 $maintClass = "PurgeList";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/purgeOldText.inc b/maintenance/purgeOldText.inc
index 111c786a..db961d81 100644
--- a/maintenance/purgeOldText.inc
+++ b/maintenance/purgeOldText.inc
@@ -34,42 +34,42 @@ function PurgeRedundantText( $delete = false ) {
 	$tbl_txt = $dbw->tableName( 'text' );
 
 	# Get "active" text records from the revisions table
-	echo( "Searching for active text records in revisions table..." );
+	echo "Searching for active text records in revisions table...";
 	$res = $dbw->query( "SELECT DISTINCT rev_text_id FROM $tbl_rev" );
 	foreach ( $res as $row ) {
 		$cur[] = $row->rev_text_id;
 	}
-	echo( "done.\n" );
+	echo "done.\n";
 
 	# Get "active" text records from the archive table
-	echo( "Searching for active text records in archive table..." );
+	echo "Searching for active text records in archive table...";
 	$res = $dbw->query( "SELECT DISTINCT ar_text_id FROM $tbl_arc" );
 	$cur = array();
 	foreach ( $res as $row ) {
 		$cur[] = $row->ar_text_id;
 	}
-	echo( "done.\n" );
+	echo "done.\n";
 
 	# Get the IDs of all text records not in these sets
-	echo( "Searching for inactive text records..." );
+	echo "Searching for inactive text records...";
 	$set = implode( ', ', $cur );
 	$res = $dbw->query( "SELECT old_id FROM $tbl_txt WHERE old_id NOT IN ( $set )" );
 	$old = array();
 	foreach ( $res as $row ) {
 		$old[] = $row->old_id;
 	}
-	echo( "done.\n" );
+	echo "done.\n";
 
 	# Inform the user of what we're going to do
 	$count = count( $old );
-	echo( "$count inactive items found.\n" );
+	echo "$count inactive items found.\n";
 
 	# Delete as appropriate
 	if ( $delete && $count ) {
-		echo( "Deleting..." );
+		echo "Deleting...";
 		$set = implode( ', ', $old );
 		$dbw->query( "DELETE FROM $tbl_txt WHERE old_id IN ( $set )" );
-		echo( "done.\n" );
+		echo "done.\n";
 	}
 
 	# Done
diff --git a/maintenance/purgeOldText.php b/maintenance/purgeOldText.php
index 1f0b063b..3d81e2df 100644
--- a/maintenance/purgeOldText.php
+++ b/maintenance/purgeOldText.php
@@ -22,7 +22,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that purges old text records from the database.
@@ -42,4 +42,4 @@ class PurgeOldText extends Maintenance {
 }
 
 $maintClass = "PurgeOldText";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/purgeParserCache.php b/maintenance/purgeParserCache.php
index e21dd176..ca2a0414 100644
--- a/maintenance/purgeParserCache.php
+++ b/maintenance/purgeParserCache.php
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require( __DIR__ . '/Maintenance.php' );
+require __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to remove old objects from the parser cache.
@@ -81,4 +81,4 @@ class PurgeParserCache extends Maintenance {
 	}
 }
 $maintClass = 'PurgeParserCache';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/reassignEdits.php b/maintenance/reassignEdits.php
index 2d79f363..7e15c09e 100644
--- a/maintenance/reassignEdits.php
+++ b/maintenance/reassignEdits.php
@@ -23,7 +23,7 @@
  * @licence GNU General Public Licence 2.0 or later
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that reassigns edits from a user or IP address
@@ -46,7 +46,7 @@ class ReassignEdits extends Maintenance {
 		if ( $this->hasArg( 0 ) && $this->hasArg( 1 ) ) {
 			# Set up the users involved
 			$from = $this->initialiseUser( $this->getArg( 0 ) );
-			$to   = $this->initialiseUser( $this->getArg( 1 ) );
+			$to = $this->initialiseUser( $this->getArg( 1 ) );
 
 			# If the target doesn't exist, and --force is not set, stop here
 			if ( $to->getId() || $this->hasOption( 'force' ) ) {
@@ -179,4 +179,4 @@ class ReassignEdits extends Maintenance {
 }
 
 $maintClass = "ReassignEdits";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildFileCache.php b/maintenance/rebuildFileCache.php
index 3165b97f..12ed9fac 100644
--- a/maintenance/rebuildFileCache.php
+++ b/maintenance/rebuildFileCache.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that builds file cache for content pages.
@@ -153,10 +153,11 @@ class RebuildFileCache extends Maintenance {
 		$this->output( "Done!\n" );
 
 		// Remove these to be safe
-		if ( isset( $wgTitle ) )
+		if ( isset( $wgTitle ) ) {
 			unset( $wgTitle );
+		}
 	}
 }
 
 $maintClass = "RebuildFileCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildImages.php b/maintenance/rebuildImages.php
index 2842b402..53bf823f 100644
--- a/maintenance/rebuildImages.php
+++ b/maintenance/rebuildImages.php
@@ -30,7 +30,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to update image metadata records.
@@ -217,4 +217,4 @@ class ImageBuilder extends Maintenance {
 }
 
 $maintClass = 'ImageBuilder';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildLocalisationCache.php b/maintenance/rebuildLocalisationCache.php
index db77564b..b7f306b1 100644
--- a/maintenance/rebuildLocalisationCache.php
+++ b/maintenance/rebuildLocalisationCache.php
@@ -29,7 +29,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to rebuild the localisation cache.
@@ -44,6 +44,8 @@ class RebuildLocalisationCache extends Maintenance {
 		$this->addOption( 'threads', 'Fork more than one thread', false, true );
 		$this->addOption( 'outdir', 'Override the output directory (normally $wgCacheDirectory)',
 			false, true );
+		$this->addOption( 'lang', 'Only rebuild these languages, comma separated.',
+			false, true );
 	}
 
 	public function memoryLimit() {
@@ -59,7 +61,7 @@ class RebuildLocalisationCache extends Maintenance {
 		# no l10n cache. Break the cycle by forcing $wgLanguageCode = 'en'.
 		global $wgLanguageCode;
 		$wgLanguageCode = 'en';
-		return parent::finalSetup();
+		parent::finalSetup();
 	}
 
 	public function execute() {
@@ -90,7 +92,19 @@ class RebuildLocalisationCache extends Maintenance {
 		}
 		$lc = new LocalisationCache_BulkLoad( $conf );
 
-		$codes = array_keys( Language::fetchLanguageNames( null, 'mwfile' ) );
+		$allCodes = array_keys( Language::fetchLanguageNames( null, 'mwfile' ) );
+		if ( $this->hasOption( 'lang' ) ) {
+			# Validate requested languages
+			$codes = array_intersect( $allCodes,
+				explode( ',', $this->getOption( 'lang' ) ) );
+			# Bailed out if nothing is left
+			if ( count( $codes ) == 0 ) {
+				$this->error( 'None of the languages specified exists.', 1 );
+			}
+		} else {
+			# By default get all languages
+			$codes = $allCodes;
+		}
 		sort( $codes );
 
 		// Initialise and split into chunks
@@ -162,4 +176,4 @@ class RebuildLocalisationCache extends Maintenance {
 }
 
 $maintClass = "RebuildLocalisationCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildall.php b/maintenance/rebuildall.php
index 882ae1b3..1268d209 100644
--- a/maintenance/rebuildall.php
+++ b/maintenance/rebuildall.php
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that rebuilds link tracking tables from scratch.
@@ -35,6 +35,10 @@ class RebuildAll extends Maintenance {
 		$this->mDescription = "Rebuild links, text index and recent changes";
 	}
 
+	public function getDbType() {
+		return Maintenance::DB_ADMIN;
+	}
+
 	public function execute() {
 		// Rebuild the text index
 		if ( wfGetDB( DB_SLAVE )->getType() != 'postgres' ) {
@@ -58,4 +62,4 @@ class RebuildAll extends Maintenance {
 }
 
 $maintClass = "RebuildAll";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildmessages.php b/maintenance/rebuildmessages.php
index a70e591f..f223f1ab 100644
--- a/maintenance/rebuildmessages.php
+++ b/maintenance/rebuildmessages.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that purges all languages from the message cache.
@@ -45,12 +45,13 @@ class RebuildMessages extends Maintenance {
 		foreach ( $databases as $db ) {
 			$this->output( "Deleting message cache for {$db}... " );
 			$messageMemc->delete( "{$db}:messages" );
-			if ( $wgEnableSidebarCache )
+			if ( $wgEnableSidebarCache ) {
 				$messageMemc->delete( "{$db}:sidebar" );
+			}
 			$this->output( "Deleted\n" );
 		}
 	}
 }
 
 $maintClass = "RebuildMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildrecentchanges.php b/maintenance/rebuildrecentchanges.php
index bfaaab54..18348258 100644
--- a/maintenance/rebuildrecentchanges.php
+++ b/maintenance/rebuildrecentchanges.php
@@ -23,7 +23,7 @@
  * @todo Document
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that rebuilds recent changes from scratch.
@@ -61,9 +61,9 @@ class RebuildRecentchanges extends Maintenance {
 		$this->output( '$wgRCMaxAge=' . $wgRCMaxAge );
 		$days = $wgRCMaxAge / 24 / 3600;
 		if ( intval( $days ) == $days ) {
-				$this->output( " (" . $days . " days)\n" );
+			$this->output( " (" . $days . " days)\n" );
 		} else {
-				$this->output( " (approx. " .  intval( $days ) . " days)\n" );
+			$this->output( " (approx. " . intval( $days ) . " days)\n" );
 		}
 
 		$cutoff = time() - $wgRCMaxAge;
@@ -99,13 +99,13 @@ class RebuildRecentchanges extends Maintenance {
 	 */
 	private function rebuildRecentChangesTablePass2() {
 		$dbw = wfGetDB( DB_MASTER );
-		list ( $recentchanges, $revision ) = $dbw->tableNamesN( 'recentchanges', 'revision' );
+		list( $recentchanges, $revision ) = $dbw->tableNamesN( 'recentchanges', 'revision' );
 
 		$this->output( "Updating links and size differences...\n" );
 
 		# Fill in the rc_last_oldid field, which points to the previous edit
 		$sql = "SELECT rc_cur_id,rc_this_oldid,rc_timestamp FROM $recentchanges " .
-		  "ORDER BY rc_cur_id,rc_timestamp";
+			"ORDER BY rc_cur_id,rc_timestamp";
 		$res = $dbw->query( $sql, DB_MASTER );
 
 		$lastCurId = 0;
@@ -142,12 +142,12 @@ class RebuildRecentchanges extends Maintenance {
 				$dbw->update( 'recentchanges',
 					array(
 						'rc_last_oldid' => $lastOldId,
-						'rc_new'        => $new,
-						'rc_type'       => $new,
-						'rc_old_len'    => $lastSize,
-						'rc_new_len'    => $size,
+						'rc_new' => $new,
+						'rc_type' => $new,
+						'rc_old_len' => $lastSize,
+						'rc_new_len' => $size,
 					), array(
-						'rc_cur_id'     => $lastCurId,
+						'rc_cur_id' => $lastCurId,
 						'rc_this_oldid' => $obj->rc_this_oldid,
 					),
 					__METHOD__
@@ -292,4 +292,4 @@ class RebuildRecentchanges extends Maintenance {
 }
 
 $maintClass = "RebuildRecentchanges";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rebuildtextindex.php b/maintenance/rebuildtextindex.php
index 534b7ca1..c651f720 100644
--- a/maintenance/rebuildtextindex.php
+++ b/maintenance/rebuildtextindex.php
@@ -25,7 +25,7 @@
  * @todo document
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that rebuilds search index table from scratch.
@@ -115,9 +115,8 @@ class RebuildTextIndex extends Maintenance {
 
 					$rev = new Revision( $s );
 					$content = $rev->getContent();
-					$text = $content->getTextForSearchIndex();
 
-					$u = new SearchUpdate( $s->page_id, $title, $text );
+					$u = new SearchUpdate( $s->page_id, $title, $content );
 					$u->doUpdate();
 				} catch ( MWContentSerializationException $ex ) {
 					$this->output( "Failed to deserialize content of revision {$s->rev_id} of page "
@@ -147,7 +146,7 @@ class RebuildTextIndex extends Maintenance {
 		$searchindex = $this->db->tableName( 'searchindex' );
 		$this->output( "\nRebuild the index...\n" );
 		$sql = "ALTER TABLE $searchindex ADD FULLTEXT si_title (si_title), " .
-		  "ADD FULLTEXT si_text (si_text)";
+			"ADD FULLTEXT si_text (si_text)";
 		$this->db->query( $sql, __METHOD__ );
 	}
 
@@ -162,4 +161,4 @@ class RebuildTextIndex extends Maintenance {
 }
 
 $maintClass = "RebuildTextIndex";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/refreshFileHeaders.php b/maintenance/refreshFileHeaders.php
index 74f0f35d..8b852e39 100644
--- a/maintenance/refreshFileHeaders.php
+++ b/maintenance/refreshFileHeaders.php
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to refresh file headers from metadata
@@ -90,4 +90,4 @@ class RefreshFileHeaders extends Maintenance {
 }
 
 $maintClass = 'RefreshFileHeaders';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/refreshImageMetadata.php b/maintenance/refreshImageMetadata.php
index 55f5b4aa..7fe5c4c1 100644
--- a/maintenance/refreshImageMetadata.php
+++ b/maintenance/refreshImageMetadata.php
@@ -27,7 +27,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to refresh image metadata fields.
@@ -99,7 +99,7 @@ class RefreshImageMetadata extends Maintenance {
 
 			if ( $res->numRows() > 0 ) {
 				$row1 = $res->current();
-				$this->output( "Processing next {$this->mBatchSize} rows starting with {$row1->img_name}.\n");
+				$this->output( "Processing next {$this->mBatchSize} rows starting with {$row1->img_name}.\n" );
 				$res->rewind();
 			} else {
 				$this->error( "No images to process.", 4 );
@@ -123,7 +123,7 @@ class RefreshImageMetadata extends Maintenance {
 						$this->output( "Warning: File:{$row->img_name} used to have " .
 						"$oldLength bytes of metadata but now has $newLength bytes.\n" );
 					} elseif ( $verbose ) {
-						$this->output("Refreshed File:{$row->img_name}.\n" );
+						$this->output( "Refreshed File:{$row->img_name}.\n" );
 					}
 				} else {
 					$leftAlone++;
@@ -138,7 +138,7 @@ class RefreshImageMetadata extends Maintenance {
 
 						}
 						if ( $verbose ) {
-							$this->output("Forcibly refreshed File:{$row->img_name}.\n" );
+							$this->output( "Forcibly refreshed File:{$row->img_name}.\n" );
 						}
 					}
 					else {
@@ -151,7 +151,7 @@ class RefreshImageMetadata extends Maintenance {
 			}
 			$conds2 = array( 'img_name > ' . $dbw->addQuotes( $row->img_name ) );
 			wfWaitForSlaves();
-		} while( $res->numRows() === $this->mBatchSize );
+		} while ( $res->numRows() === $this->mBatchSize );
 
 		$total = $upgraded + $leftAlone;
 		if ( $force ) {
@@ -173,7 +173,7 @@ class RefreshImageMetadata extends Maintenance {
 		$like = $this->getOption( 'metadata-contains', false );
 
 		if ( $end !== false ) {
-			$conds[] = 'img_name <= ' . $dbw->addQuotes( $end ) ;
+			$conds[] = 'img_name <= ' . $dbw->addQuotes( $end );
 		}
 		if ( $mime !== false ) {
 			list( $major, $minor ) = File::splitMime( $mime );
@@ -209,4 +209,4 @@ class RefreshImageMetadata extends Maintenance {
 
 
 $maintClass = 'RefreshImageMetadata';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/refreshLinks.php b/maintenance/refreshLinks.php
index 7b255664..98ea9301 100644
--- a/maintenance/refreshLinks.php
+++ b/maintenance/refreshLinks.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to refresh link tables.
@@ -160,7 +160,7 @@ class RefreshLinks extends Maintenance {
 			}
 
 			if ( !$redirectsOnly ) {
-				$this->output( "Refreshing links table.\n" );
+				$this->output( "Refreshing links tables.\n" );
 				$this->output( "Starting from page_id $start of $end.\n" );
 
 				for ( $id = $start; $id <= $end; $id++ ) {
@@ -281,12 +281,13 @@ class RefreshLinks extends Maintenance {
 			$this->output( "Retrieving illegal entries from $table... " );
 
 			// SELECT DISTINCT( $field ) FROM $table LEFT JOIN page ON $field=page_id WHERE page_id IS NULL;
-			$results = $dbr->select( array( $table, 'page' ),
-						  $field,
-						  array( 'page_id' => null ),
-						  __METHOD__,
-						  'DISTINCT',
-						  array( 'page' => array( 'LEFT JOIN', "$field=page_id" ) )
+			$results = $dbr->select(
+				array( $table, 'page' ),
+				$field,
+				array( 'page_id' => null ),
+				__METHOD__,
+				'DISTINCT',
+				array( 'page' => array( 'LEFT JOIN', "$field=page_id" ) )
 			);
 
 			$counter = 0;
@@ -315,4 +316,4 @@ class RefreshLinks extends Maintenance {
 }
 
 $maintClass = 'RefreshLinks';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/removeUnusedAccounts.php b/maintenance/removeUnusedAccounts.php
index b4528ca0..16cb17ab 100644
--- a/maintenance/removeUnusedAccounts.php
+++ b/maintenance/removeUnusedAccounts.php
@@ -23,7 +23,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that removes unused user accounts from the database.
@@ -74,9 +74,12 @@ class RemoveUnusedAccounts extends Maintenance {
 
 		# If required, go back and delete each marked account
 		if ( $count > 0 && $this->hasOption( 'delete' ) ) {
-			$this->output( "\nDeleting inactive accounts..." );
+			$this->output( "\nDeleting unused accounts..." );
 			$dbw = wfGetDB( DB_MASTER );
 			$dbw->delete( 'user', array( 'user_id' => $del ), __METHOD__ );
+			$dbw->delete( 'user_groups', array( 'ug_user' => $del ), __METHOD__ );
+			$dbw->delete( 'user_former_groups', array( 'ufg_user' => $del ), __METHOD__ );
+			$dbw->delete( 'user_properties', array( 'up_user' => $del ), __METHOD__ );
 			$dbw->delete( 'logging', array( 'log_user' => $del ), __METHOD__ );
 			$dbw->delete( 'recentchanges', array( 'rc_user' => $del ), __METHOD__ );
 			$this->output( "done.\n" );
@@ -124,4 +127,4 @@ class RemoveUnusedAccounts extends Maintenance {
 }
 
 $maintClass = "RemoveUnusedAccounts";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/renameDbPrefix.php b/maintenance/renameDbPrefix.php
index 6f244791..ed9d1f5d 100644
--- a/maintenance/renameDbPrefix.php
+++ b/maintenance/renameDbPrefix.php
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that changes the prefix of database tables.
@@ -91,4 +91,4 @@ class RenameDbPrefix extends Maintenance {
 }
 
 $maintClass = "RenameDbPrefix";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/renderDump.php b/maintenance/renderDump.php
index 2ba2b3dc..0cde28c5 100644
--- a/maintenance/renderDump.php
+++ b/maintenance/renderDump.php
@@ -28,7 +28,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that takes page text out of an XML dump file
@@ -69,9 +69,10 @@ class DumpRenderer extends Maintenance {
 		$importer->doImport();
 
 		$delta = microtime( true ) - $this->startTime;
-		$this->error( "Rendered {$this->count} pages in " . round($delta, 2) . " seconds " );
-		if ($delta > 0)
-			$this->error( round($this->count / $delta, 2) . " pages/sec" );
+		$this->error( "Rendered {$this->count} pages in " . round( $delta, 2 ) . " seconds " );
+		if ( $delta > 0 ) {
+			$this->error( round( $this->count / $delta, 2 ) . " pages/sec" );
+		}
 		$this->error( "\n" );
 	}
 
@@ -104,11 +105,10 @@ class DumpRenderer extends Maintenance {
 		$output = $content->getParserOutput( $title, null, $options );
 
 		file_put_contents( $filename,
-			"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" " .
-			"\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" .
-			"<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" .
+			"<!DOCTYPE html>\n" .
+			"<html lang=\"en\" dir=\"ltr\">\n" .
 			"<head>\n" .
-			"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n" .
+			"<meta charset=\"UTF-8\" />\n" .
 			"<title>" . htmlspecialchars( $display ) . "</title>\n" .
 			"</head>\n" .
 			"<body>\n" .
@@ -119,4 +119,4 @@ class DumpRenderer extends Maintenance {
 }
 
 $maintClass = "DumpRenderer";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/resetUserTokens.php b/maintenance/resetUserTokens.php
index d7f8c6d0..bfe04d79 100644
--- a/maintenance/resetUserTokens.php
+++ b/maintenance/resetUserTokens.php
@@ -21,9 +21,10 @@
  * @file
  * @ingroup Maintenance
  * @author Daniel Friesen <mediawiki@danielfriesen.name>
+ * @author Chris Steipp <csteipp@wikimedia.org>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to reset the user_token for all users on the wiki.
@@ -35,14 +36,21 @@ class ResetUserTokens extends Maintenance {
 		parent::__construct();
 		$this->mDescription = "Reset the user_token of all users on the wiki. Note that this may log some of them out.";
 		$this->addOption( 'nowarn', "Hides the 5 seconds warning", false, false );
+		$this->addOption( 'nulls', 'Only reset tokens that are currently null (string of \x00\'s)', false, false );
+		$this->setBatchSize( 1000 );
 	}
 
 	public function execute() {
+		$this->nullsOnly = $this->getOption( 'nulls' );
 
 		if ( !$this->getOption( 'nowarn' ) ) {
-			$this->output( "The script is about to reset the user_token for ALL USERS in the database.\n" );
-			$this->output( "This may log some of them out and is not necessary unless you believe your\n" );
-			$this->output( "user table has been compromised.\n" );
+			if ( $this->nullsOnly ) {
+				$this->output( "The script is about to reset the user_token for USERS WITH NULL TOKENS in the database.\n" );
+			} else {
+				$this->output( "The script is about to reset the user_token for ALL USERS in the database.\n" );
+				$this->output( "This may log some of them out and is not necessary unless you believe your\n" );
+				$this->output( "user table has been compromised.\n" );
+			}
 			$this->output( "\n" );
 			$this->output( "Abort with control-c in the next five seconds (skip this countdown with --nowarn) ... " );
 			wfCountDown( 5 );
@@ -50,29 +58,53 @@ class ResetUserTokens extends Maintenance {
 
 		// We list user by user_id from one of the slave database
 		$dbr = wfGetDB( DB_SLAVE );
-		$result = $dbr->select( 'user',
-			array( 'user_id' ),
-			array(),
-			__METHOD__
-			);
 
-		foreach ( $result as $id ) {
-			$user = User::newFromId( $id->user_id );
+		$where = array();
+		if ( $this->nullsOnly ) {
+			// Have to build this by hand, because \ is escaped in helper functions
+			$where = array( 'user_token = \'' . str_repeat( '\0', 32) . '\'' );
+		}
 
-			$username = $user->getName();
+		$maxid = $dbr->selectField( 'user', 'MAX(user_id)', array(), __METHOD__ );
 
-			$this->output( "Resetting user_token for $username: " );
+		$min = 0;
+		$max = $this->mBatchSize;
 
-			// Change value
-			$user->setToken();
-			$user->saveSettings();
+		do {
+			$result = $dbr->select( 'user',
+				array( 'user_id' ),
+				array_merge(
+					$where,
+					array( 'user_id > ' . $dbr->addQuotes( $min ),
+						'user_id <= ' . $dbr->addQuotes( $max )
+					)
+				),
+				__METHOD__
+			);
 
-			$this->output( " OK\n" );
+			foreach ( $result as $user ) {
+				$this->updateUser( $user->user_id );
+			}
 
-		}
+			$min = $max;
+			$max = $min + $this->mBatchSize;
+
+			wfWaitForSlaves();
+
+		} while ( $max <= $maxid );
+
+	}
 
+	private function updateUser( $userid ) {
+		$user = User::newFromId( $userid );
+		$username = $user->getName();
+		$this->output( 'Resetting user_token for "' . $username . '": ' );
+		// Change value
+		$user->setToken();
+		$user->saveSettings();
+		$this->output( " OK\n" );
 	}
 }
 
 $maintClass = "ResetUserTokens";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/rollbackEdits.php b/maintenance/rollbackEdits.php
index 4660bcef..e5e33c02 100644
--- a/maintenance/rollbackEdits.php
+++ b/maintenance/rollbackEdits.php
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to rollback all edits by a given user or IP provided
@@ -104,4 +104,4 @@ class RollbackEdits extends Maintenance {
 }
 
 $maintClass = 'RollbackEdits';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/runBatchedQuery.php b/maintenance/runBatchedQuery.php
index e1139164..93ba24a9 100644
--- a/maintenance/runBatchedQuery.php
+++ b/maintenance/runBatchedQuery.php
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to run a database query in batches and wait for slaves.
@@ -38,8 +38,9 @@ class BatchedQueryRunner extends Maintenance {
 	}
 
 	public function execute() {
-		if ( !$this->hasArg() )
+		if ( !$this->hasArg() ) {
 			$this->error( "No query specified. Specify the query as a command line parameter.", true );
+		}
 
 		$query = $this->getArg();
 		$n = 1;
@@ -61,4 +62,4 @@ class BatchedQueryRunner extends Maintenance {
 
 
 $maintClass = "BatchedQueryRunner";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/runJobs.php b/maintenance/runJobs.php
index b1be714c..429edf42 100644
--- a/maintenance/runJobs.php
+++ b/maintenance/runJobs.php
@@ -25,7 +25,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that runs pending jobs.
@@ -61,10 +61,11 @@ class RunJobs extends Maintenance {
 			$procs = intval( $this->getOption( 'procs' ) );
 			if ( $procs < 1 || $procs > 1000 ) {
 				$this->error( "Invalid argument to --procs", true );
-			}
-			$fc = new ForkController( $procs );
-			if ( $fc->start() != 'child' ) {
-				exit( 0 );
+			} elseif ( $procs != 1 ) {
+				$fc = new ForkController( $procs );
+				if ( $fc->start() != 'child' ) {
+					exit( 0 );
+				}
 			}
 		}
 		$maxJobs = $this->getOption( 'maxjobs', false );
@@ -72,7 +73,6 @@ class RunJobs extends Maintenance {
 		$startTime = time();
 		$type = $this->getOption( 'type', false );
 		$wgTitle = Title::newFromText( 'RunJobs.php' );
-		$dbw = wfGetDB( DB_MASTER );
 		$jobsRun = 0; // counter
 
 		$group = JobQueueGroup::singleton();
@@ -82,16 +82,20 @@ class RunJobs extends Maintenance {
 			$this->runJobsLog( "Executed $count periodic queue task(s)." );
 		}
 
-		$lastTime = time();
+		$flags = JobQueueGroup::USE_CACHE | JobQueueGroup::USE_PRIORITY;
+		$lastTime = time(); // time since last slave check
 		do {
 			$job = ( $type === false )
-				? $group->pop( JobQueueGroup::TYPE_DEFAULT, JobQueueGroup::USE_CACHE )
+				? $group->pop( JobQueueGroup::TYPE_DEFAULT, $flags )
 				: $group->pop( $type ); // job from a single queue
 			if ( $job ) { // found a job
 				++$jobsRun;
 				$this->runJobsLog( $job->toString() . " STARTING" );
 
+				// Set timer to stop the job if too much CPU time is used
+				set_time_limit( $maxTime ?: 0 );
 				// Run the job...
+				wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
 				$t = microtime( true );
 				try {
 					$status = $job->run();
@@ -99,15 +103,19 @@ class RunJobs extends Maintenance {
 				} catch ( MWException $e ) {
 					$status = false;
 					$error = get_class( $e ) . ': ' . $e->getMessage();
+					$e->report(); // write error to STDERR and the log
 				}
 				$timeMs = intval( ( microtime( true ) - $t ) * 1000 );
+				wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
+				// Disable the timer
+				set_time_limit( 0 );
 
 				// Mark the job as done on success or when the job cannot be retried
 				if ( $status !== false || !$job->allowRetries() ) {
 					$group->ack( $job ); // done
 				}
 
-				if ( !$status ) {
+				if ( $status === false ) {
 					$this->runJobsLog( $job->toString() . " t=$timeMs error={$error}" );
 				} else {
 					$this->runJobsLog( $job->toString() . " t=$timeMs good" );
@@ -124,15 +132,41 @@ class RunJobs extends Maintenance {
 				$timePassed = time() - $lastTime;
 				if ( $timePassed >= 5 || $timePassed < 0 ) {
 					wfWaitForSlaves();
+					$lastTime = time();
 				}
 				// Don't let any queue slaves/backups fall behind
 				if ( $jobsRun > 0 && ( $jobsRun % 100 ) == 0 ) {
 					$group->waitForBackups();
 				}
+
+				// Bail if near-OOM instead of in a job
+				$this->assertMemoryOK();
 			}
 		} while ( $job ); // stop when there are no jobs
 	}
 
+	/**
+	 * Make sure that this script is not too close to the memory usage limit
+	 * @throws MWException
+	 */
+	private function assertMemoryOK() {
+		static $maxBytes = null;
+		if ( $maxBytes === null ) {
+			$m = array();
+			if ( preg_match( '!^(\d+)(k|m|g|)$!i', ini_get( 'memory_limit' ), $m ) ) {
+				list( , $num, $unit ) = $m;
+				$conv = array( 'g' => 1024 * 1024 * 1024, 'm' => 1024 * 1024, 'k' => 1024, '' => 1 );
+				$maxBytes = $num * $conv[strtolower( $unit )];
+			} else {
+				$maxBytes = 0;
+			}
+		}
+		$usedBytes = memory_get_usage();
+		if ( $maxBytes && $usedBytes >= 0.95 * $maxBytes ) {
+			throw new MWException( "Detected excessive memory usage ($usedBytes/$maxBytes)." );
+		}
+	}
+
 	/**
 	 * Log the job message
 	 * @param $msg String The message to log
@@ -144,4 +178,4 @@ class RunJobs extends Maintenance {
 }
 
 $maintClass = "RunJobs";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/showCacheStats.php b/maintenance/showCacheStats.php
index 8f238680..cd9768d4 100644
--- a/maintenance/showCacheStats.php
+++ b/maintenance/showCacheStats.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that shows statistics from the cache.
@@ -103,4 +103,4 @@ class ShowCacheStats extends Maintenance {
 }
 
 $maintClass = "ShowCacheStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/showJobs.php b/maintenance/showJobs.php
index 8b49517f..afd7c745 100644
--- a/maintenance/showJobs.php
+++ b/maintenance/showJobs.php
@@ -25,7 +25,7 @@
  * @author Antoine Musso
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that reports the number of jobs currently waiting
@@ -38,17 +38,33 @@ class ShowJobs extends Maintenance {
 		parent::__construct();
 		$this->mDescription = "Show number of jobs waiting in master database";
 		$this->addOption( 'group', 'Show number of jobs per job type' );
+		$this->addOption( 'list', 'Show a complete list of all jobs in a machine-readable format, instead of statistics' );
 	}
 
 	public function execute() {
 		$group = JobQueueGroup::singleton();
-		if ( $this->hasOption( 'group' ) ) {
+		if ( $this->hasOption( 'list' ) ) {
 			foreach ( $group->getQueueTypes() as $type ) {
-				$queue   = $group->get( $type );
+				$queue = $group->get( $type );
+				foreach ( $queue->getAllQueuedJobs() as $job ) {
+					$this->output( $job->toString() . " status=unclaimed\n" );
+				}
+				foreach ( $queue->getAllDelayedJobs() as $job ) {
+					$this->output( $job->toString() . " status=delayed\n" );
+				}
+			}
+		} elseif ( $this->hasOption( 'group' ) ) {
+			foreach ( $group->getQueueTypes() as $type ) {
+				$queue = $group->get( $type );
 				$pending = $queue->getSize();
 				$claimed = $queue->getAcquiredCount();
+				$abandoned = $queue->getAbandonedCount();
+				$active = max( 0, $claimed - $abandoned );
 				if ( ( $pending + $claimed ) > 0 ) {
-					$this->output( "{$type}: $pending queued; $claimed acquired\n" );
+					$this->output(
+						"{$type}: $pending queued; " .
+						"$claimed claimed ($active active, $abandoned abandoned)\n"
+					);
 				}
 			}
 		} else {
@@ -62,4 +78,4 @@ class ShowJobs extends Maintenance {
 }
 
 $maintClass = "ShowJobs";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/showSiteStats.php b/maintenance/showSiteStats.php
index e7359b2f..49148b33 100644
--- a/maintenance/showSiteStats.php
+++ b/maintenance/showSiteStats.php
@@ -29,7 +29,7 @@
  * @license GNU General Public License 2.0 or later
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to show the cached statistics.
@@ -48,6 +48,7 @@ class ShowSiteStats extends Maintenance {
 			'ss_good_articles' => 'Number of articles',
 			'ss_total_pages' => 'Total pages',
 			'ss_users' => 'Number of users',
+			'ss_active_users' => 'Active users',
 			'ss_images' => 'Number of images',
 		);
 
@@ -59,7 +60,7 @@ class ShowSiteStats extends Maintenance {
 		$max_length_value = $max_length_desc = 0;
 		foreach ( $fields as $field => $desc ) {
 			$max_length_value = max( $max_length_value, strlen( $stats->$field ) );
-			$max_length_desc  = max( $max_length_desc,  strlen( $desc ) ) ;
+			$max_length_desc = max( $max_length_desc, strlen( $desc ) );
 		}
 
 		// Show them
@@ -70,4 +71,4 @@ class ShowSiteStats extends Maintenance {
 }
 
 $maintClass = "ShowSiteStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/sql.php b/maintenance/sql.php
index 11699909..a628b0bc 100644
--- a/maintenance/sql.php
+++ b/maintenance/sql.php
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that sends SQL queries from the specified file to the database.
@@ -34,16 +34,42 @@ class MwSql extends Maintenance {
 		parent::__construct();
 		$this->mDescription = "Send SQL queries to a MediaWiki database";
 		$this->addOption( 'cluster', 'Use an external cluster by name', false, true );
+		$this->addOption( 'slave', 'Use a slave server (either "any" or by name)', false, true );
 	}
 
 	public function execute() {
-		// Get a DB handle (with this wiki's DB select) from the appropriate load balancer
+		// Get the appropriate load balancer (for this wiki)
 		if ( $this->hasOption( 'cluster' ) ) {
 			$lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ) );
-			$dbw = $lb->getConnection( DB_MASTER ); // master for external LB
 		} else {
-			$dbw = wfGetDB( DB_MASTER ); // master for primary LB for this wiki
+			$lb = wfGetLB();
 		}
+		// Figure out which server to use
+		if ( $this->hasOption( 'slave' ) ) {
+			$server = $this->getOption( 'slave' );
+			if ( $server === 'any' ) {
+				$index = DB_SLAVE;
+			} else {
+				$index = null;
+				for ( $i = 0; $i < $lb->getServerCount(); ++$i ) {
+					if ( $lb->getServerName( $i ) === $server ) {
+						$index = $i;
+						break;
+					}
+				}
+				if ( $index === null ) {
+					$this->error( "No slave server configured with the name '$server'.", 1 );
+				}
+			}
+		} else {
+			$index = DB_MASTER;
+		}
+		// Get a DB handle (with this wiki's DB selected) from the appropriate load balancer
+		$dbw = $lb->getConnection( $index );
+		if ( $this->hasOption( 'slave' ) && $dbw->getLBInfo( 'master' ) !== null ) {
+			$this->error( "The server selected ({$dbw->getServer()}) is not a slave.", 1 );
+		}
+
 		if ( $this->hasArg( 0 ) ) {
 			$file = fopen( $this->getArg( 0 ), 'r' );
 			if ( !$file ) {
@@ -70,9 +96,9 @@ class MwSql extends Maintenance {
 
 		$wholeLine = '';
 		$newPrompt = '> ';
-		$prompt    = $newPrompt;
+		$prompt = $newPrompt;
 		while ( ( $line = Maintenance::readconsole( $prompt ) ) !== false ) {
-			if( !$line ) {
+			if ( !$line ) {
 				# User simply pressed return key
 				continue;
 			}
@@ -91,12 +117,12 @@ class MwSql extends Maintenance {
 				readline_add_history( $wholeLine . $dbw->getDelimiter() );
 				readline_write_history( $historyFile );
 			}
-			try{
+			try {
 				$res = $dbw->query( $wholeLine );
 				$this->sqlPrintResult( $res, $dbw );
-				$prompt    = $newPrompt;
+				$prompt = $newPrompt;
 				$wholeLine = '';
-			} catch (DBQueryError $e) {
+			} catch ( DBQueryError $e ) {
 				$doDie = ! Maintenance::posix_isatty( 0 );
 				$this->error( $e, $doDie );
 			}
@@ -132,4 +158,4 @@ class MwSql extends Maintenance {
 }
 
 $maintClass = "MwSql";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/sqlite.inc b/maintenance/sqlite.inc
index 16568ac7..08188cad 100644
--- a/maintenance/sqlite.inc
+++ b/maintenance/sqlite.inc
@@ -33,10 +33,7 @@ class Sqlite {
 	 * @return bool
 	 */
 	public static function isPresent() {
-		wfSuppressWarnings();
-		$compiled = wfDl( 'pdo_sqlite' );
-		wfRestoreWarnings();
-		return $compiled;
+		return extension_loaded( 'pdo_sqlite' );
 	}
 
 	/**
@@ -73,7 +70,9 @@ class Sqlite {
 
 			$tables = $db->query( "SELECT name FROM sqlite_master WHERE type='table'", __METHOD__ );
 			foreach ( $tables as $table ) {
-				if ( strpos( $table->name, 'sqlite_' ) === 0 ) continue;
+				if ( strpos( $table->name, 'sqlite_' ) === 0 ) {
+					continue;
+				}
 
 				$columns = $db->query( "PRAGMA table_info({$table->name})", __METHOD__ );
 				foreach ( $columns as $col ) {
@@ -89,4 +88,4 @@ class Sqlite {
 		$db->close();
 		return true;
 	}
- };
+};
diff --git a/maintenance/sqlite.php b/maintenance/sqlite.php
index 4085c59b..8a785245 100644
--- a/maintenance/sqlite.php
+++ b/maintenance/sqlite.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that performs some operations specific to SQLite database backend.
@@ -137,4 +137,4 @@ class SqliteMaintenance extends Maintenance {
 }
 
 $maintClass = "SqliteMaintenance";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/sqlite/archives/initial-indexes.sql b/maintenance/sqlite/archives/initial-indexes.sql
index 73b008cc..1a59be5a 100644
--- a/maintenance/sqlite/archives/initial-indexes.sql
+++ b/maintenance/sqlite/archives/initial-indexes.sql
@@ -28,6 +28,8 @@ DROP TABLE IF EXISTS /*_*/interwiki_tmp;
 DROP TABLE IF EXISTS /*_*/page_restrictions_tmp;
 DROP TABLE IF EXISTS /*_*/protected_titles_tmp;
 DROP TABLE IF EXISTS /*_*/page_props_tmp;
+DROP TABLE IF EXISTS /*_*/archive_tmp;
+DROP TABLE IF EXISTS /*_*/externallinks_tmp;
 
 --------------------------------------------------------------------------------
 -- Create new tables
@@ -268,6 +270,47 @@ CREATE TABLE /*_*/page_props_tmp (
 );
 CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props_tmp (pp_page,pp_propname);
 
+--
+-- Holding area for deleted articles, which may be viewed
+-- or restored by admins through the Special:Undelete interface.
+-- The fields generally correspond to the page, revision, and text
+-- fields, with several caveats.
+-- Cannot reasonably create views on this table, due to the presence of TEXT
+-- columns.
+CREATE TABLE /*$wgDBprefix*/archive_tmp (
+   ar_id NOT NULL PRIMARY KEY clustered IDENTITY,
+   ar_namespace SMALLINT NOT NULL DEFAULT 0,
+   ar_title NVARCHAR(255) NOT NULL DEFAULT '',
+   ar_text NVARCHAR(MAX) NOT NULL,
+   ar_comment NVARCHAR(255) NOT NULL,
+   ar_user INT NULL REFERENCES /*$wgDBprefix*/[user](user_id) ON DELETE SET NULL,
+   ar_user_text NVARCHAR(255) NOT NULL,
+   ar_timestamp DATETIME NOT NULL DEFAULT GETDATE(),
+   ar_minor_edit BIT NOT NULL DEFAULT 0,
+   ar_flags NVARCHAR(255) NOT NULL,
+   ar_rev_id INT,
+   ar_text_id INT,
+   ar_deleted BIT NOT NULL DEFAULT 0,
+   ar_len INT DEFAULT NULL,
+   ar_page_id INT NULL,
+   ar_parent_id INT NULL
+);
+CREATE INDEX /*$wgDBprefix*/ar_name_title_timestamp ON /*$wgDBprefix*/archive_tmp(ar_namespace,ar_title,ar_timestamp);
+CREATE INDEX /*$wgDBprefix*/ar_usertext_timestamp ON /*$wgDBprefix*/archive_tmp(ar_user_text,ar_timestamp);
+CREATE INDEX /*$wgDBprefix*/ar_user_text    ON /*$wgDBprefix*/archive_tmp(ar_user_text);
+
+--
+-- Track links to external URLs
+-- IE >= 4 supports no more than 2083 characters in a URL
+CREATE TABLE /*$wgDBprefix*/externallinks_tmp (
+   el_id INT NOT NULL PRIMARY KEY clustered IDENTITY,
+   el_from INT NOT NULL DEFAULT '0',
+   el_to VARCHAR(2083) NOT NULL,
+   el_index VARCHAR(896) NOT NULL,
+);
+-- Maximum key length ON SQL Server is 900 bytes
+CREATE INDEX /*$wgDBprefix*/externallinks_index   ON /*$wgDBprefix*/externallinks_tmp(el_index);
+
 --------------------------------------------------------------------------------
 -- Populate the new tables using INSERT SELECT
 --------------------------------------------------------------------------------
@@ -290,6 +333,8 @@ INSERT OR IGNORE INTO /*_*/interwiki_tmp SELECT * FROM /*_*/interwiki;
 INSERT OR IGNORE INTO /*_*/page_restrictions_tmp SELECT * FROM /*_*/page_restrictions;
 INSERT OR IGNORE INTO /*_*/protected_titles_tmp SELECT * FROM /*_*/protected_titles;
 INSERT OR IGNORE INTO /*_*/page_props_tmp SELECT * FROM /*_*/page_props;
+INSERT OR IGNORE INTO /*_*/archive_tmp SELECT * FROM /*_*/archive;
+INSERT OR IGNORE INTO /*_*/externallinks_tmp SELECT * FROM /*_*/externallinks;
 
 --------------------------------------------------------------------------------
 -- Do the table renames
@@ -331,6 +376,10 @@ DROP TABLE /*_*/protected_titles;
 ALTER TABLE /*_*/protected_titles_tmp RENAME TO /*_*/protected_titles;
 DROP TABLE /*_*/page_props;
 ALTER TABLE /*_*/page_props_tmp RENAME TO /*_*/page_props;
+DROP TABLE /*_*/archive;
+ALTER TABLE /*_*/archive_tmp RENAME TO /*_*/archive;
+DROP TABLE /*_*/externalllinks;
+ALTER TABLE /*_*/externallinks_tmp RENAME TO /*_*/externallinks;
 
 --------------------------------------------------------------------------------
 -- Drop and create tables with unique indexes but no valuable data
diff --git a/maintenance/sqlite/archives/patch-archive-ar_id.sql b/maintenance/sqlite/archives/patch-archive-ar_id.sql
new file mode 100644
index 00000000..00a9b071
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-archive-ar_id.sql
@@ -0,0 +1,39 @@
+DROP TABLE IF EXISTS /*_*/archive_tmp;
+
+CREATE TABLE /*$wgDBprefix*/archive_tmp (
+  ar_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  ar_namespace int NOT NULL default 0,
+  ar_title varchar(255) binary NOT NULL default '',
+  ar_text mediumblob NOT NULL,
+  ar_comment tinyblob NOT NULL,
+  ar_user int unsigned NOT NULL default 0,
+  ar_user_text varchar(255) binary NOT NULL,
+  ar_timestamp binary(14) NOT NULL default '',
+  ar_minor_edit tinyint NOT NULL default 0,
+  ar_flags tinyblob NOT NULL,
+  ar_rev_id int unsigned,
+  ar_text_id int unsigned,
+  ar_deleted tinyint unsigned NOT NULL default 0,
+  ar_len int unsigned,
+  ar_page_id int unsigned,
+  ar_parent_id int unsigned default NULL,
+  ar_sha1 varbinary(32) NOT NULL default '',
+  ar_content_model varbinary(32) DEFAULT NULL,
+  ar_content_format varbinary(64) DEFAULT NULL
+);
+
+INSERT OR IGNORE INTO /*_*/archive_tmp (
+    ar_namespace, ar_title, ar_title, ar_text, ar_comment, ar_user, ar_user_text, ar_timestamp,
+    ar_minor_edit, ar_flags, ar_rev_id, ar_text_id, ar_deleted, ar_len, ar_page_id, ar_parent_id )
+    SELECT
+    ar_namespace, ar_title, ar_title, ar_text, ar_comment, ar_user, ar_user_text, ar_timestamp,
+    ar_minor_edit, ar_flags, ar_rev_id, ar_text_id, ar_deleted, ar_len, ar_page_id, ar_parent_id
+    FROM /*_*/archive;
+
+DROP TABLE /*_*/archive;
+
+ALTER TABLE /*_*/archive_tmp RENAME TO /*_*/archive;
+
+CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
+CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
+CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
diff --git a/maintenance/sqlite/archives/patch-externallinks-el_id.sql b/maintenance/sqlite/archives/patch-externallinks-el_id.sql
new file mode 100644
index 00000000..0aad4071
--- /dev/null
+++ b/maintenance/sqlite/archives/patch-externallinks-el_id.sql
@@ -0,0 +1,19 @@
+DROP TABLE IF EXISTS /*_*/externallinks_tmp;
+
+CREATE TABLE /*$wgDBprefix*/externallinks_tmp (
+   el_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+   el_from int unsigned NOT NULL default 0,
+   el_to blob NOT NULL,
+   el_index blob NOT NULL
+);
+
+INSERT OR IGNORE INTO /*_*/externallinks_tmp (el_from, el_to, el_index) SELECT
+    el_from, el_to, el_index FROM /*_*/externallinks;
+
+DROP TABLE /*_*/externallinks;
+
+ALTER TABLE /*_*/externallinks_tmp RENAME TO /*_*/externallinks;
+
+CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
+CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
+CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
\ No newline at end of file
diff --git a/maintenance/sqlite/archives/patch-kill-iwl_pft.sql b/maintenance/sqlite/archives/patch-kill-iwl_pft.sql
deleted file mode 100644
index 8fc4b5cd..00000000
--- a/maintenance/sqlite/archives/patch-kill-iwl_pft.sql
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- Kill the old iwl_prefix_from_title index, which may be present on some
--- installs if they ran update.php between it being added and being renamed
---
-
-DROP INDEX IF EXISTS /*i*/iwl_prefix;
-
diff --git a/maintenance/sqlite/archives/patch-rename-iwl_prefix.sql b/maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
index fd4c9ec7..6d5b1bfa 100644
--- a/maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
+++ b/maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
@@ -2,4 +2,4 @@
 -- Recreates the iwl_prefix for the iwlinks table
 --
 DROP INDEX IF EXISTS /*i*/iwl_prefix;
-CREATE INDEX IF NOT EXISTS /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
+CREATE INDEX IF NOT EXISTS /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
diff --git a/maintenance/storage/checkStorage.php b/maintenance/storage/checkStorage.php
index fd9393f2..03dc113a 100644
--- a/maintenance/storage/checkStorage.php
+++ b/maintenance/storage/checkStorage.php
@@ -22,7 +22,7 @@
  */
 
 if ( !defined( 'MEDIAWIKI' ) ) {
-	require_once( __DIR__ . '/../commandLine.inc' );
+	require_once __DIR__ . '/../commandLine.inc';
 
 	$cs = new CheckStorage;
 	$fix = isset( $options['fix'] );
@@ -75,7 +75,7 @@ class CheckStorage {
 			'fixable' => array(),
 		);
 
-		for ( $chunkStart = 1 ; $chunkStart < $maxRevId; $chunkStart += $chunkSize ) {
+		for ( $chunkStart = 1; $chunkStart < $maxRevId; $chunkStart += $chunkSize ) {
 			$chunkEnd = $chunkStart + $chunkSize - 1;
 			// print "$chunkStart of $maxRevId\n";
 
@@ -443,18 +443,26 @@ class CheckStorage {
 
 	function importRevision( &$revision, &$importer ) {
 		$id = $revision->getID();
-		$text = $revision->getText();
+		$content = $revision->getContent( Revision::RAW );
+		$id = $id ? $id : '';
+
+		if ( $content === null ) {
+			echo "Revision $id is broken, we have no content available\n";
+			return;
+		}
+
+		$text = $content->serialize();
 		if ( $text === '' ) {
 			// This is what happens if the revision was broken at the time the
 			// dump was made. Unfortunately, it also happens if the revision was
 			// legitimately blank, so there's no way to tell the difference. To
 			// be safe, we'll skip it and leave it broken
-			$id = $id ? $id : '';
+
 			echo "Revision $id is blank in the dump, may have been broken before export\n";
 			return;
 		}
 
-		if ( !$id )  {
+		if ( !$id ) {
 			// No ID, can't import
 			echo "No id tag in revision, can't import\n";
 			return;
diff --git a/maintenance/storage/compressOld.php b/maintenance/storage/compressOld.php
index d6362834..8cb55487 100644
--- a/maintenance/storage/compressOld.php
+++ b/maintenance/storage/compressOld.php
@@ -41,7 +41,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that compress the text of a wiki.
@@ -53,7 +53,7 @@ class CompressOld extends Maintenance {
 	 * @todo document
 	 */
 	const LS_INDIVIDUAL = 0;
-	const LS_CHUNKED    = 1;
+	const LS_CHUNKED = 1;
 
 	public function __construct() {
 		parent::__construct();
@@ -113,9 +113,9 @@ class CompressOld extends Maintenance {
 		$this->output( "Starting from old_id $start...\n" );
 		$dbw = wfGetDB( DB_MASTER );
 		do {
-			$res = $dbw->select( 'text', array( 'old_id','old_flags','old_text' ),
+			$res = $dbw->select( 'text', array( 'old_id', 'old_flags', 'old_text' ),
 				"old_id>=$start", __METHOD__, array( 'ORDER BY' => 'old_id', 'LIMIT' => $chunksize, 'FOR UPDATE' ) );
-			if( $res->numRows() == 0 ) {
+			if ( $res->numRows() == 0 ) {
 				break;
 			}
 			$last = $start;
@@ -126,7 +126,7 @@ class CompressOld extends Maintenance {
 			}
 			$start = $last + 1; # Deletion may leave long empty stretches
 			$this->output( "$start...\n" );
-		} while( true );
+		} while ( true );
 	}
 
 	/**
@@ -223,7 +223,7 @@ class CompressOld extends Maintenance {
 			}
 			$conds[] = "rev_timestamp>'" . $beginDate . "'";
 		}
-		if ( $endDate )  {
+		if ( $endDate ) {
 			if ( !preg_match( '/^\d{14}$/', $endDate ) ) {
 				$this->error( "Invalid end date \"$endDate\"\n" );
 				return false;
@@ -254,8 +254,8 @@ class CompressOld extends Maintenance {
 
 			# Get the page row
 			$pageRes = $dbr->select( 'page',
-				array('page_id', 'page_namespace', 'page_title','page_latest'),
-				$pageConds + array('page_id' => $pageId), __METHOD__ );
+				array( 'page_id', 'page_namespace', 'page_title', 'page_latest' ),
+				$pageConds + array( 'page_id' => $pageId ), __METHOD__ );
 			if ( $pageRes->numRows() == 0 ) {
 				continue;
 			}
@@ -282,7 +282,7 @@ class CompressOld extends Maintenance {
 				$revs[] = $revRow;
 			}
 
-			if ( count( $revs ) < 2) {
+			if ( count( $revs ) < 2 ) {
 				# No revisions matching, no further processing
 				$this->output( "\n" );
 				continue;
@@ -351,21 +351,22 @@ class CompressOld extends Maintenance {
 					if ( $extdb != "" ) {
 						# Move blob objects to External Storage
 						$stored = $storeObj->store( $extdb, serialize( $chunk ));
-						if ($stored === false) {
-							$this->error(  "Unable to store object" );
+						if ( $stored === false ) {
+							$this->error( "Unable to store object" );
 							return false;
 						}
 						# Store External Storage URLs instead of Stub placeholders
-						foreach ($stubs as $stub) {
-							if ($stub===false)
+						foreach ( $stubs as $stub ) {
+							if ( $stub === false ) {
 								continue;
+							}
 							# $stored should provide base path to a BLOB
-							$url = $stored."/".$stub->getHash();
+							$url = $stored . "/" . $stub->getHash();
 							$dbw->update( 'text',
 								array( /* SET */
 									'old_text' => $url,
 									'old_flags' => 'external,utf-8',
-								), array ( /* WHERE */
+								), array( /* WHERE */
 									'old_id' => $stub->getReferrer(),
 								)
 							);
@@ -387,7 +388,7 @@ class CompressOld extends Maintenance {
 							if ( $stubs[$j] !== false && $revs[$i + $j]->rev_text_id != $primaryOldid ) {
 								$dbw->update( 'text',
 									array( /* SET */
-										'old_text' => serialize($stubs[$j]),
+										'old_text' => serialize( $stubs[$j] ),
 										'old_flags' => 'object,utf-8',
 									), array( /* WHERE */
 										'old_id' => $revs[$i + $j]->rev_text_id
@@ -411,4 +412,4 @@ class CompressOld extends Maintenance {
 }
 
 $maintClass = 'CompressOld';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/storage/dumpRev.php b/maintenance/storage/dumpRev.php
index 39f08f9d..f12bbd1b 100644
--- a/maintenance/storage/dumpRev.php
+++ b/maintenance/storage/dumpRev.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that gets the text of a revision,
@@ -46,7 +46,7 @@ class DumpRev extends Maintenance {
 			$this->error( "Row not found", true );
 		}
 
-		$flags = explode( ',',  $row->old_flags );
+		$flags = explode( ',', $row->old_flags );
 		$text = $row->old_text;
 		if ( in_array( 'external', $flags ) ) {
 			$this->output( "External $text\n" );
@@ -85,4 +85,4 @@ class DumpRev extends Maintenance {
 }
 
 $maintClass = "DumpRev";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/storage/fixBug20757.php b/maintenance/storage/fixBug20757.php
index 30cbcf1a..101aa068 100644
--- a/maintenance/storage/fixBug20757.php
+++ b/maintenance/storage/fixBug20757.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script to fix bug 20757.
@@ -348,4 +348,4 @@ class FixBug20757 extends Maintenance {
 }
 
 $maintClass = 'FixBug20757';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/storage/moveToExternal.php b/maintenance/storage/moveToExternal.php
index 1049e0cc..348fb773 100644
--- a/maintenance/storage/moveToExternal.php
+++ b/maintenance/storage/moveToExternal.php
@@ -24,9 +24,9 @@
 define( 'REPORTING_INTERVAL', 1 );
 
 if ( !defined( 'MEDIAWIKI' ) ) {
-	require_once( __DIR__ . '/../commandLine.inc' );
-	require_once( __DIR__ . '/../../includes/externalstore/ExternalStoreDB.php' );
-	require_once( 'resolveStubs.php' );
+	require_once __DIR__ . '/../commandLine.inc';
+	require_once __DIR__ . '/../../includes/externalstore/ExternalStoreDB.php';
+	require_once 'resolveStubs.php';
 
 	$fname = 'moveToExternal';
 
diff --git a/maintenance/storage/orphanStats.php b/maintenance/storage/orphanStats.php
index 4e246287..1df1501e 100644
--- a/maintenance/storage/orphanStats.php
+++ b/maintenance/storage/orphanStats.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that shows some statistics on the blob_orphans table,
@@ -74,4 +74,4 @@ class OrphanStats extends Maintenance {
 }
 
 $maintClass = "OrphanStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/storage/recompressTracked.php b/maintenance/storage/recompressTracked.php
index 030a147e..b2663165 100644
--- a/maintenance/storage/recompressTracked.php
+++ b/maintenance/storage/recompressTracked.php
@@ -23,7 +23,7 @@
  */
 
 $optionsWithArgs = RecompressTracked::getOptionsWithArgs();
-require( __DIR__ . '/../commandLine.inc' );
+require __DIR__ . '/../commandLine.inc';
 
 if ( count( $args ) < 1 ) {
 	echo "Usage: php recompressTracked.php [options] <cluster> [... <cluster>...]
@@ -279,7 +279,7 @@ class RecompressTracked {
 	 */
 	function dispatchToSlave( $slaveId, $args ) {
 		$args = (array)$args;
-		$cmd = implode( ' ',  $args );
+		$cmd = implode( ' ', $args );
 		fwrite( $this->slavePipes[$slaveId], "$cmd\n" );
 	}
 
diff --git a/maintenance/storage/resolveStubs.php b/maintenance/storage/resolveStubs.php
index 414eab81..e47d6407 100644
--- a/maintenance/storage/resolveStubs.php
+++ b/maintenance/storage/resolveStubs.php
@@ -27,7 +27,7 @@ define( 'REPORTING_INTERVAL', 100 );
 if ( !defined( 'MEDIAWIKI' ) ) {
 	$optionsWithArgs = array( 'm' );
 
-	require_once( __DIR__ . '/../commandLine.inc' );
+	require_once __DIR__ . '/../commandLine.inc';
 
 	resolveStubs();
 }
diff --git a/maintenance/storage/storageTypeStats.php b/maintenance/storage/storageTypeStats.php
index 3187c318..e33057f6 100644
--- a/maintenance/storage/storageTypeStats.php
+++ b/maintenance/storage/storageTypeStats.php
@@ -19,7 +19,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 class StorageTypeStats extends Maintenance {
 	function execute() {
@@ -112,4 +112,4 @@ SQL;
 }
 
 $maintClass = 'StorageTypeStats';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/storage/testCompression.php b/maintenance/storage/testCompression.php
index e13e1b10..fdc28d9b 100644
--- a/maintenance/storage/testCompression.php
+++ b/maintenance/storage/testCompression.php
@@ -22,7 +22,7 @@
  */
 
 $optionsWithArgs = array( 'start', 'limit', 'type' );
-require( __DIR__ . '/../commandLine.inc' );
+require __DIR__ . '/../commandLine.inc';
 
 if ( !isset( $args[0] )  ) {
 	echo "Usage: php testCompression.php [--type=<type>] [--start=<start-date>] [--limit=<num-revs>] <page-title>\n";
diff --git a/maintenance/storage/trackBlobs.php b/maintenance/storage/trackBlobs.php
index 2f3c8c6a..7857dd95 100644
--- a/maintenance/storage/trackBlobs.php
+++ b/maintenance/storage/trackBlobs.php
@@ -22,7 +22,7 @@
  * @see wfWaitForSlaves()
  */
 
-require( __DIR__ . '/../commandLine.inc' );
+require __DIR__ . '/../commandLine.inc';
 
 
 if ( count( $args ) < 1 ) {
diff --git a/maintenance/syncFileBackend.php b/maintenance/syncFileBackend.php
index 158019b7..f0be709f 100644
--- a/maintenance/syncFileBackend.php
+++ b/maintenance/syncFileBackend.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that syncs one file backend to another based on
@@ -40,6 +40,7 @@ class SyncFileBackend extends Maintenance {
 		$this->addOption( 'posdir', 'Directory to read/record journal positions', false, true );
 		$this->addOption( 'posdump', 'Just dump current journal position into the position dir.' );
 		$this->addOption( 'postime', 'For position dumps, get the ID at this time', false, true );
+		$this->addOption( 'backoff', 'Stop at entries younger than this age (sec).', false, true );
 		$this->addOption( 'verbose', 'Verbose mode', false, false, 'v' );
 		$this->setBatchSize( 50 );
 	}
@@ -88,7 +89,13 @@ class SyncFileBackend extends Maintenance {
 		} else {
 			$startFromPosFile = false;
 		}
-		$end = $this->getOption( 'end', INF );
+
+		if ( $this->hasOption( 'backoff' ) ) {
+			$time = time() - $this->getOption( 'backoff', 0 );
+			$end = (int)$src->getJournal()->getPositionAtTime( $time );
+		} else {
+			$end = $this->getOption( 'end', INF );
+		}
 
 		$this->output( "Synchronizing backend '{$dst->getName()}' to '{$src->getName()}'...\n" );
 		$this->output( "Starting journal position is $start.\n" );
@@ -289,4 +296,4 @@ class SyncFileBackend extends Maintenance {
 }
 
 $maintClass = "SyncFileBackend";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/tables.sql b/maintenance/tables.sql
index 72b4eb6c..de92ef53 100644
--- a/maintenance/tables.sql
+++ b/maintenance/tables.sql
@@ -380,6 +380,8 @@ CREATE TABLE /*_*/text (
 -- fields, with several caveats.
 --
 CREATE TABLE /*_*/archive (
+  -- Primary key
+  ar_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
   ar_namespace int NOT NULL default 0,
   ar_title varchar(255) binary NOT NULL default '',
 
@@ -445,7 +447,6 @@ CREATE TABLE /*_*/archive (
 
   -- content format, see CONTENT_FORMAT_XXX constants
   ar_content_format varbinary(64) DEFAULT NULL
-
 ) /*$wgDBTableOptions*/;
 
 CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
@@ -602,6 +603,9 @@ CREATE INDEX /*i*/cat_pages ON /*_*/category (cat_pages);
 -- Track links to external URLs
 --
 CREATE TABLE /*_*/externallinks (
+  -- Primary key
+  el_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+
   -- page_id of the referring page
   el_from int unsigned NOT NULL default 0,
 
@@ -626,21 +630,6 @@ CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
 
-
---
--- Track external user accounts, if ExternalAuth is used
---
-CREATE TABLE /*_*/external_user (
-  -- Foreign key to user_id
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-
-  -- Some opaque identifier provided by the external database
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
-
-
 --
 -- Track interlanguage links
 --
@@ -674,7 +663,8 @@ CREATE TABLE /*_*/iwlinks (
 ) /*$wgDBTableOptions*/;
 
 CREATE UNIQUE INDEX /*i*/iwl_from ON /*_*/iwlinks (iwl_from, iwl_prefix, iwl_title);
-CREATE UNIQUE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
+CREATE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
+CREATE INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
 
 
 --
@@ -774,6 +764,9 @@ CREATE TABLE /*_*/ipblocks (
 
   -- Start and end of an address range, in hexadecimal
   -- Size chosen to allow IPv6
+  -- FIXME: these fields were originally blank for single-IP blocks,
+  -- but now they are populated. No migration was ever done. They
+  -- should be fixed to be blank again for such blocks (bug 49504).
   ipb_range_start tinyblob NOT NULL,
   ipb_range_end tinyblob NOT NULL,
 
@@ -821,7 +814,7 @@ CREATE TABLE /*_*/image (
   img_width int NOT NULL default 0,
   img_height int NOT NULL default 0,
 
-  -- Extracted EXIF metadata stored as a serialized PHP array.
+  -- Extracted Exif metadata stored as a serialized PHP array.
   img_metadata mediumblob NOT NULL,
 
   -- For images, bits per pixel if known.
@@ -1066,7 +1059,7 @@ CREATE TABLE /*_*/recentchanges (
   -- rev_id of the prior revision, for generating diff links.
   rc_last_oldid int unsigned NOT NULL default 0,
 
-  -- The type of change entry (RC_EDIT,RC_NEW,RC_LOG)
+  -- The type of change entry (RC_EDIT,RC_NEW,RC_LOG,RC_EXTERNAL)
   rc_type tinyint unsigned NOT NULL default 0,
 
   -- If the Recent Changes Patrol option is enabled,
@@ -1087,7 +1080,7 @@ CREATE TABLE /*_*/recentchanges (
   -- Visibility of recent changes items, bitfield
   rc_deleted tinyint unsigned NOT NULL default 0,
 
-  -- Value corresonding to log_id, specific log entries
+  -- Value corresponding to log_id, specific log entries
   rc_logid int unsigned NOT NULL default 0,
   -- Store log type info here, or null
   rc_log_type varbinary(255) NULL default NULL,
@@ -1143,7 +1136,7 @@ CREATE TABLE /*_*/searchindex (
 
   -- Munged version of body text
   si_text mediumtext NOT NULL
-) ENGINE=MyISAM;
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
 CREATE UNIQUE INDEX /*i*/si_page ON /*_*/searchindex (si_page);
 CREATE FULLTEXT INDEX /*i*/si_title ON /*_*/searchindex (si_title);
diff --git a/maintenance/tidyUpBug37714.php b/maintenance/tidyUpBug37714.php
new file mode 100644
index 00000000..1ad9c7ee
--- /dev/null
+++ b/maintenance/tidyUpBug37714.php
@@ -0,0 +1,49 @@
+<?php
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Fixes all rows affected by https://bugzilla.wikimedia.org/show_bug.cgi?id=37714
+ */
+class TidyUpBug37714 extends Maintenance {
+	public function execute() {
+		// Search for all log entries which are about changing the visability of other log entries.
+		$result = wfGetDB( DB_SLAVE )->select(
+			'logging',
+			array( 'log_id', 'log_params' ),
+			array(
+				'log_type' => array( 'suppress', 'delete' ),
+				'log_action' => 'event',
+				'log_namespace' => NS_SPECIAL,
+				'log_title' => SpecialPage::getTitleFor( 'Log' )->getText()
+			),
+			__METHOD__
+		);
+
+		foreach ( $result as $row ) {
+			$paramLines = explode( "\n", $row->log_params );
+			$ids = explode( ',', $paramLines[0] ); // Array dereferencing is PHP >= 5.4 :(
+			$result = wfGetDB( DB_SLAVE )->select( // Work out what log entries were changed here.
+				'logging',
+				'log_type',
+				array( 'log_id' => $ids ),
+				__METHOD__,
+				'DISTINCT'
+			);
+			if ( $result->numRows() === 1 ) {
+				// If there's only one type, the target title can be set to include it.
+				$logTitle = SpecialPage::getTitleFor( 'Log', $result->current()->log_type )->getText();
+				$this->output( 'Set log_title to "' . $logTitle . '" for log entry ' . $row->log_id . ".\n" );
+				wfGetDB( DB_MASTER )->update(
+					'logging',
+					array( 'log_title' => $logTitle ),
+					array( 'log_id' => $row->log_id ),
+					__METHOD__
+				);
+				wfWaitForSlaves();
+			}
+		}
+	}
+}
+
+$maintClass = 'TidyUpBug37714';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/undelete.php b/maintenance/undelete.php
index ea8b0c4b..c890c69b 100644
--- a/maintenance/undelete.php
+++ b/maintenance/undelete.php
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 class Undelete extends Maintenance {
 	public function __construct() {
@@ -55,4 +55,4 @@ class Undelete extends Maintenance {
 }
 
 $maintClass = "Undelete";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/update.php b/maintenance/update.php
index f69a9b0d..378217fd 100644
--- a/maintenance/update.php
+++ b/maintenance/update.php
@@ -26,12 +26,12 @@
  */
 
 if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
-	require( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
+	require dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
 	wfPHPVersionError( 'cli' );
 }
 
 $wgUseMasterForMaintenance = true;
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to run database schema updates.
@@ -83,7 +83,7 @@ class UpdateMediaWiki extends Maintenance {
 	function execute() {
 		global $wgVersion, $wgTitle, $wgLang, $wgAllowSchemaUpdates;
 
-		if( !$wgAllowSchemaUpdates && !( $this->hasOption( 'force' ) || $this->hasOption( 'schema' ) || $this->hasOption( 'noschema' ) ) ) {
+		if ( !$wgAllowSchemaUpdates && !( $this->hasOption( 'force' ) || $this->hasOption( 'schema' ) || $this->hasOption( 'noschema' ) ) ) {
 			$this->error( "Do not run update.php on this wiki. If you're seeing this you should\n"
 				. "probably ask for some help in performing your schema updates or use\n"
 				. "the --noschema and --schema options to get an SQL file for someone\n"
@@ -92,12 +92,12 @@ class UpdateMediaWiki extends Maintenance {
 		}
 
 		$this->fileHandle = null;
-		if( substr( $this->getOption( 'schema' ), 0, 2 ) === "--" ) {
+		if ( substr( $this->getOption( 'schema' ), 0, 2 ) === "--" ) {
 			$this->error( "The --schema option requires a file as an argument.\n", true );
-		} else if( $this->hasOption( 'schema' ) ) {
+		} elseif ( $this->hasOption( 'schema' ) ) {
 			$file = $this->getOption( 'schema' );
 			$this->fileHandle = fopen( $file, "w" );
-			if( $this->fileHandle === false ) {
+			if ( $this->fileHandle === false ) {
 				$err = error_get_last();
 				$this->error( "Problem opening the schema file for writing: $file\n\t{$err['message']}", true );
 			}
@@ -122,7 +122,7 @@ class UpdateMediaWiki extends Maintenance {
 		$db = wfGetDB( DB_MASTER );
 
 		$this->output( "Going to run database updates for " . wfWikiID() . "\n" );
-		if( $db->getType() === 'sqlite' ) {
+		if ( $db->getType() === 'sqlite' ) {
 			$this->output( "Using SQLite file: '{$db->mDatabaseFile}'\n" );
 		}
 		$this->output( "Depending on the size of your database this may take a while!\n" );
@@ -135,21 +135,17 @@ class UpdateMediaWiki extends Maintenance {
 		$shared = $this->hasOption( 'doshared' );
 
 		$updates = array( 'core', 'extensions' );
-		if( !$this->hasOption('schema') ) {
-			if( $this->hasOption('noschema') ) {
+		if ( !$this->hasOption( 'schema' ) ) {
+			if ( $this->hasOption( 'noschema' ) ) {
 				$updates[] = 'noschema';
 			}
 			$updates[] = 'stats';
-
-			if( !$this->hasOption('nopurge') ) {
-				$updates[] = 'purge';
-			}
 		}
 
 		$updater = DatabaseUpdater::newForDb( $db, $shared, $this );
 		$updater->doUpdates( $updates );
 
-		foreach( $updater->getPostDatabaseUpdateMaintenance() as $maint ) {
+		foreach ( $updater->getPostDatabaseUpdateMaintenance() as $maint ) {
 			$child = $this->runChild( $maint );
 
 			// LoggedUpdateMaintenance is checking the updatelog itself
@@ -159,14 +155,13 @@ class UpdateMediaWiki extends Maintenance {
 				continue;
 			}
 
-			$child = $this->runChild( $maint );
 			$child->execute();
 			if ( !$isLoggedUpdate ) {
 				$updater->insertUpdateRow( $maint );
 			}
 		}
 
-		if( !$this->hasOption('nopurge') ) {
+		if ( !$this->hasOption( 'nopurge' ) ) {
 			$updater->purgeCache();
 		}
 
@@ -189,4 +184,4 @@ class UpdateMediaWiki extends Maintenance {
 }
 
 $maintClass = 'UpdateMediaWiki';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/updateArticleCount.php b/maintenance/updateArticleCount.php
index 4d49dd2d..7964a21f 100644
--- a/maintenance/updateArticleCount.php
+++ b/maintenance/updateArticleCount.php
@@ -23,7 +23,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to provide a better count of the number of articles
@@ -58,4 +58,4 @@ class UpdateArticleCount extends Maintenance {
 }
 
 $maintClass = "UpdateArticleCount";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/updateCollation.php b/maintenance/updateCollation.php
index a76a1ee6..964b3138 100644
--- a/maintenance/updateCollation.php
+++ b/maintenance/updateCollation.php
@@ -26,7 +26,7 @@
 
 #$optionsWithArgs = array( 'begin', 'max-slave-lag' );
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that will find all rows in the categorylinks table
@@ -82,6 +82,10 @@ TEXT;
 			$collation = Collation::singleton();
 		}
 
+		// Collation sanity check: in some cases the constructor will work,
+		// but this will raise an exception, breaking all category pages
+		$collation->getFirstLetter( 'MediaWiki' );
+
 		$options = array(
 			'LIMIT' => self::BATCH_SIZE,
 			'ORDER BY' => 'cl_to, cl_type, cl_from',
@@ -303,4 +307,4 @@ TEXT;
 }
 
 $maintClass = "UpdateCollation";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/updateDoubleWidthSearch.php b/maintenance/updateDoubleWidthSearch.php
index dc7398ad..41988d1b 100644
--- a/maintenance/updateDoubleWidthSearch.php
+++ b/maintenance/updateDoubleWidthSearch.php
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to normalize double-byte latin UTF-8 characters.
@@ -72,4 +72,4 @@ class UpdateDoubleWidthSearch extends Maintenance {
 }
 
 $maintClass = "UpdateDoubleWidthSearch";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/updateRestrictions.php b/maintenance/updateRestrictions.php
index 8699dc26..175447e7 100644
--- a/maintenance/updateRestrictions.php
+++ b/maintenance/updateRestrictions.php
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that updates page_restrictions table from
@@ -114,4 +114,4 @@ class UpdateRestrictions extends Maintenance {
 }
 
 $maintClass = "UpdateRestrictions";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/updateSearchIndex.php b/maintenance/updateSearchIndex.php
index ac784847..0691bee8 100644
--- a/maintenance/updateSearchIndex.php
+++ b/maintenance/updateSearchIndex.php
@@ -28,7 +28,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script for periodic off-peak updating of the search index.
@@ -60,7 +60,7 @@ class UpdateSearchIndex extends Maintenance {
 			# We can safely delete the file when we're done though.
 			$start = file_get_contents( 'searchUpdate.pos' );
 			unlink( 'searchUpdate.pos' );
-		} elseif( is_readable( $posFile ) ) {
+		} elseif ( is_readable( $posFile ) ) {
 			$start = file_get_contents( $posFile );
 		} else {
 			$start = wfTimestamp( TS_MW, time() - 86400 );
@@ -97,9 +97,8 @@ class UpdateSearchIndex extends Maintenance {
 
 		$page = $dbw->tableName( 'page' );
 		$sql = "SELECT rc_cur_id FROM $recentchanges
-		  JOIN $page ON rc_cur_id=page_id AND rc_this_oldid=page_latest
-		  WHERE rc_type != " . RC_LOG . " AND rc_timestamp BETWEEN '$start' AND '$end'
-		  ";
+			JOIN $page ON rc_cur_id=page_id AND rc_this_oldid=page_latest
+			WHERE rc_type != " . RC_LOG . " AND rc_timestamp BETWEEN '$start' AND '$end'";
 		$res = $dbw->query( $sql, __METHOD__ );
 
 		$this->updateSearchIndex( $maxLockTime, array( $this, 'searchIndexUpdateCallback' ), $dbw, $res );
@@ -113,4 +112,4 @@ class UpdateSearchIndex extends Maintenance {
 }
 
 $maintClass = "UpdateSearchIndex";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/updateSpecialPages.php b/maintenance/updateSpecialPages.php
index f92f67aa..3432cb20 100644
--- a/maintenance/updateSpecialPages.php
+++ b/maintenance/updateSpecialPages.php
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to update cached special pages.
@@ -33,41 +33,22 @@ class UpdateSpecialPages extends Maintenance {
 	public function __construct() {
 		parent::__construct();
 		$this->addOption( 'list', 'List special page names' );
-		$this->addOption( 'only', 'Only update "page". Ex: --only=BrokenRedirects', false, true );
+		$this->addOption( 'only', 'Only update "page"; case sensitive, ' .
+		'check correct case by calling this script with --list or on ' .
+		'includes/QueryPage.php. Ex: --only=BrokenRedirects', false, true );
 		$this->addOption( 'override', 'Also update pages that have updates disabled' );
 	}
 
 	public function execute() {
-		global $IP, $wgSpecialPageCacheUpdates, $wgQueryPages, $wgQueryCacheLimit, $wgDisableQueryPageUpdate;
+		global $IP, $wgQueryPages, $wgQueryCacheLimit, $wgDisableQueryPageUpdate;
 
-		$dbw = wfGetDB( DB_MASTER );
-
-		foreach ( $wgSpecialPageCacheUpdates as $special => $call ) {
-			if ( !is_callable( $call ) ) {
-				$this->error( "Uncallable function $call!" );
-				continue;
-			}
-			$this->output( sprintf( '%-30s ', $special ) );
-			$t1 = explode( ' ', microtime() );
-			call_user_func( $call, $dbw );
-			$t2 = explode( ' ', microtime() );
-			$elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
-			$hours = intval( $elapsed / 3600 );
-			$minutes = intval( $elapsed % 3600 / 60 );
-			$seconds = $elapsed - $hours * 3600 - $minutes * 60;
-			if ( $hours ) {
-				$this->output( $hours . 'h ' );
-			}
-			if ( $minutes ) {
-				$this->output( $minutes . 'm ' );
-			}
-			$this->output( sprintf( "completed in %.2fs\n", $seconds ) );
-			# Wait for the slave to catch up
-			wfWaitForSlaves();
+		if ( !$this->hasOption( 'list' ) && !$this->hasOption( 'only' ) ) {
+			$this->doSpecialPageCacheUpdates();
 		}
+		$dbw = wfGetDB( DB_MASTER );
 
 		// This is needed to initialise $wgQueryPages
-		require_once( "$IP/includes/QueryPage.php" );
+		require_once "$IP/includes/QueryPage.php";
 
 		foreach ( $wgQueryPages as $page ) {
 			list( $class, $special ) = $page;
@@ -94,13 +75,13 @@ class UpdateSpecialPages extends Maintenance {
 			} else {
 				if ( !class_exists( $class ) ) {
 					$file = $specialObj->getFile();
-					require_once( $file );
+					require_once $file;
 				}
 				$queryPage = new $class;
 			}
 
 			if ( !$this->hasOption( 'only' ) || $this->getOption( 'only' ) == $queryPage->getName() ) {
-				$this->output( sprintf( '%-30s ',  $special ) );
+				$this->output( sprintf( '%-30s ', $special ) );
 				if ( $queryPage->isExpensive() ) {
 					$t1 = explode( ' ', microtime() );
 					# Do the query
@@ -124,7 +105,7 @@ class UpdateSpecialPages extends Maintenance {
 						$this->output( sprintf( "%.2fs\n", $seconds ) );
 					}
 					# Reopen any connections that have closed
-					if ( !wfGetLB()->pingAll() )  {
+					if ( !wfGetLB()->pingAll() ) {
 						$this->output( "\n" );
 						do {
 							$this->error( "Connection failed, reconnecting in 10 seconds..." );
@@ -140,10 +121,42 @@ class UpdateSpecialPages extends Maintenance {
 				} else {
 					$this->output( "cheap, skipped\n" );
 				}
+				if ( $this->hasOption( 'only' ) ) {
+					break;
+				}
 			}
 		}
 	}
+
+	public function doSpecialPageCacheUpdates() {
+		global $wgSpecialPageCacheUpdates;
+		$dbw = wfGetDB( DB_MASTER );
+
+		foreach ( $wgSpecialPageCacheUpdates as $special => $call ) {
+			if ( !is_callable( $call ) ) {
+				$this->error( "Uncallable function $call!" );
+				continue;
+			}
+			$this->output( sprintf( '%-30s ', $special ) );
+			$t1 = explode( ' ', microtime() );
+			call_user_func( $call, $dbw );
+			$t2 = explode( ' ', microtime() );
+			$elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
+			$hours = intval( $elapsed / 3600 );
+			$minutes = intval( $elapsed % 3600 / 60 );
+			$seconds = $elapsed - $hours * 3600 - $minutes * 60;
+			if ( $hours ) {
+				$this->output( $hours . 'h ' );
+			}
+			if ( $minutes ) {
+				$this->output( $minutes . 'm ' );
+			}
+			$this->output( sprintf( "completed in %.2fs\n", $seconds ) );
+			# Wait for the slave to catch up
+			wfWaitForSlaves();
+		}
+	}
 }
 
 $maintClass = "UpdateSpecialPages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/userDupes.inc b/maintenance/userDupes.inc
index be45a111..8bd80c97 100644
--- a/maintenance/userDupes.inc
+++ b/maintenance/userDupes.inc
@@ -1,6 +1,6 @@
 <?php
 /**
- * Helper class for update.php and upgrade1_5.php.
+ * Helper class for update.php.
  *
  * Copyright © 2005 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
@@ -112,9 +112,9 @@ class UserDupes {
 		$count = count( $dupes );
 
 		$this->out( "Found $count accounts with duplicate records on " . wfWikiID() . ".\n" );
-		$this->trimmed    = 0;
+		$this->trimmed = 0;
 		$this->reassigned = 0;
-		$this->failed     = 0;
+		$this->failed = 0;
 		foreach ( $dupes as $name ) {
 			$this->examine( $name, $doDelete );
 		}
@@ -158,11 +158,7 @@ class UserDupes {
 	 * @access private
 	 */
 	function lock() {
-		if ( $this->newSchema() ) {
-			$set = array( 'user', 'revision' );
-		} else {
-			$set = array( 'user', 'cur', 'old' );
-		}
+		$set = array( 'user', 'revision' );
 		$names = array_map( array( $this, 'lockTable' ), $set );
 		$tables = implode( ',', $names );
 
@@ -173,14 +169,6 @@ class UserDupes {
 		return $this->db->tableName( $table ) . ' WRITE';
 	}
 
-	/**
-	 * @return bool
-	 * @access private
-	 */
-	function newSchema() {
-		return MWInit::classExists( 'Revision' );
-	}
-
 	/**
 	 * @access private
 	 */
@@ -223,7 +211,7 @@ class UserDupes {
 			__METHOD__ );
 
 		$firstRow = $this->db->fetchObject( $result );
-		$firstId  = $firstRow->user_id;
+		$firstId = $firstRow->user_id;
 		$this->out( "Record that will be used for '$name' is user_id=$firstId\n" );
 
 		foreach ( $result as $row ) {
@@ -266,27 +254,10 @@ class UserDupes {
 	 * @access private
 	 */
 	function editCount( $userid ) {
-		if ( $this->newSchema() ) {
-			return $this->editCountOn( 'revision', 'rev_user', $userid );
-		} else {
-			return $this->editCountOn( 'cur', 'cur_user', $userid ) +
-				$this->editCountOn( 'old', 'old_user', $userid );
-		}
-	}
-
-	/**
-	 * Count the number of hits on a given table for this account.
-	 * @param $table string
-	 * @param $field string
-	 * @param $userid int
-	 * @return int
-	 * @access private
-	 */
-	function editCountOn( $table, $field, $userid ) {
 		return intval( $this->db->selectField(
-			$table,
+			'revision',
 			'COUNT(*)',
-			array( $field => $userid ),
+			array( 'rev_user' => $userid ),
 			__METHOD__ ) );
 	}
 
@@ -296,26 +267,10 @@ class UserDupes {
 	 * @access private
 	 */
 	function reassignEdits( $from, $to ) {
-		$set = $this->newSchema()
-			? array( 'revision' => 'rev_user' )
-			: array( 'cur' => 'cur_user', 'old' => 'old_user' );
-		foreach ( $set as $table => $field ) {
-			$this->reassignEditsOn( $table, $field, $from, $to );
-		}
-	}
-
-	/**
-	 * @param $table string
-	 * @param $field string
-	 * @param $from int
-	 * @param $to int
-	 * @access private
-	 */
-	function reassignEditsOn( $table, $field, $from, $to ) {
-		$this->out( "reassigning on $table... " );
-		$this->db->update( $table,
-			array( $field => $to ),
-			array( $field => $from ),
+		$this->out( 'reassigning... ' );
+		$this->db->update( 'revision',
+			array( 'rev_user' => $to ),
+			array( 'rev_user' => $from ),
 			__METHOD__ );
 		$this->out( "ok. " );
 	}
diff --git a/maintenance/userOptions.inc b/maintenance/userOptions.inc
index cbe6b057..51da80d3 100644
--- a/maintenance/userOptions.inc
+++ b/maintenance/userOptions.inc
@@ -25,7 +25,7 @@
 $options = array( 'list', 'nowarn', 'quiet', 'usage', 'dry' );
 $optionsWithArgs = array( 'old', 'new' );
 
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
 
 /**
  * @ingroup Maintenance
@@ -38,7 +38,7 @@ class userOptions {
 	public $mOldValue;
 	public $mNewValue;
 
-	private $mMode, $mReady ;
+	private $mMode, $mReady;
 
 	/** Constructor. Will show usage and exit if script options are not correct */
 	function __construct( $opts, $args ) {
@@ -60,9 +60,9 @@ class userOptions {
 	 */
 	private function checkOpts( $opts, $args ) {
 		// The three possible ways to run the script:
-		$list   = isset( $opts['list'] );
-		$usage  = isset( $opts['usage'] ) && ( count( $args ) <= 1 );
-		$change = isset( $opts['old'] ) && isset( $opts['new'] ) && ( count( $args ) <= 1 ) ;
+		$list = isset( $opts['list'] );
+		$usage = isset( $opts['usage'] ) && ( count( $args ) <= 1 );
+		$change = isset( $opts['old'] ) && isset( $opts['new'] ) && ( count( $args ) <= 1 );
 
 		// We want only one of them
 		$isValid = ( ( $list + $usage + $change ) == 1 );
@@ -82,18 +82,18 @@ class userOptions {
 
 		$this->mQuick = isset( $opts['nowarn'] );
 		$this->mQuiet = isset( $opts['quiet'] );
-		$this->mDry   = isset( $opts['dry'] );
+		$this->mDry = isset( $opts['dry'] );
 
 		// Set object properties, specially 'mMode' used by run()
 		if ( isset( $opts['list'] ) ) {
-			$this->mMode = 'LISTER' ;
+			$this->mMode = 'LISTER';
 		} elseif ( isset( $opts['usage'] ) ) {
-			$this->mMode = 'USAGER' ;
-			$this->mAnOption = isset( $args[0] ) ? $args[0] : false ;
+			$this->mMode = 'USAGER';
+			$this->mAnOption = isset( $args[0] ) ? $args[0] : false;
 		} elseif ( isset( $opts['old'] ) && isset( $opts['new'] ) ) {
-			$this->mMode = 'CHANGER' ;
-			$this->mOldValue = $opts['old'] ;
-			$this->mNewValue = $opts['new'] ;
+			$this->mMode = 'CHANGER';
+			$this->mOldValue = $opts['old'];
+			$this->mNewValue = $opts['new'];
 			$this->mAnOption = $args[0];
 		} else {
 			die( "There is a bug in the software, this should never happen\n" );
@@ -212,7 +212,9 @@ class userOptions {
 				if ( !$this->mDry ) {
 					$user->saveSettings();
 				}
-				if ( !$this->mQuiet ) { print " OK\n"; }
+				if ( !$this->mQuiet ) {
+					print " OK\n";
+				}
 
 			} elseif ( !$this->mQuiet ) {
 				print "Not changing '$username' using <{$this->mAnOption}> = '$curValue'\n";
diff --git a/maintenance/userOptions.php b/maintenance/userOptions.php
index 1e1f24b5..e0de3574 100644
--- a/maintenance/userOptions.php
+++ b/maintenance/userOptions.php
@@ -25,7 +25,7 @@
  */
 
 // This is a command line script, load tools and parse args
-require_once( 'userOptions.inc' );
+require_once 'userOptions.inc';
 
 // Load up our tool system, exit with usage() if options are not fine
 $uo = new userOptions( $options, $args );
diff --git a/maintenance/waitForSlave.php b/maintenance/waitForSlave.php
index df83928b..a62d1618 100644
--- a/maintenance/waitForSlave.php
+++ b/maintenance/waitForSlave.php
@@ -22,7 +22,7 @@
  * @see wfWaitForSlaves()
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to wait until slave lag goes under a certain value.
@@ -40,4 +40,4 @@ class WaitForSlave extends Maintenance {
 }
 
 $maintClass = "WaitForSlave";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/mw-config/index.php b/mw-config/index.php
index 2823210a..570b426e 100644
--- a/mw-config/index.php
+++ b/mw-config/index.php
@@ -24,11 +24,7 @@ define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
 define( 'MEDIAWIKI_INSTALL', true );
 
 chdir( dirname( __DIR__ ) );
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-	require ( 'core/includes/WebStart.php' );
-} else {
-	require( dirname( __DIR__ ) . '/includes/WebStart.php' );
-}
+require dirname( __DIR__ ) . '/includes/WebStart.php';
 
 wfInstallerMain();
 
diff --git a/opensearch_desc.php b/opensearch_desc.php
index cb8b1bec..ecd5051c 100644
--- a/opensearch_desc.php
+++ b/opensearch_desc.php
@@ -20,7 +20,7 @@
  * @file
  */
 
-require_once( __DIR__ . '/includes/WebStart.php' );
+require_once __DIR__ . '/includes/WebStart.php';
 
 if ( $wgRequest->getVal( 'ctype' ) == 'application/xml' ) {
 	// Makes testing tweaks about a billion times easier
diff --git a/profileinfo.php b/profileinfo.php
index 4117d975..8120599e 100644
--- a/profileinfo.php
+++ b/profileinfo.php
@@ -28,11 +28,7 @@
 ini_set( 'zlib.output_compression', 'off' );
 
 $wgEnableProfileInfo = $wgProfileToDatabase = false;
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-	require ( 'core/includes/WebStart.php' );
-} else {
-	require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
 
 header( 'Content-Type: text/html; charset=utf-8' );
 
@@ -390,8 +386,9 @@ if ( isset( $_REQUEST['filter'] ) ) {
 	}
 
 	$s = new profile_point( 'SQL Queries', 0, $sqltotal, 0, 0 );
-	foreach ( $queries as $q )
+	foreach ( $queries as $q ) {
 		$s->add_child( $q );
+	}
 	$points[] = $s;
 
 	usort( $points, 'compare_point' );
diff --git a/redirect.php b/redirect.php
deleted file mode 100644
index 5e6cfeed..00000000
--- a/redirect.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-/**
- * Script that redirects to the article passed in the "wpDropdown" parameter.
- * This is used by the nostalgia skin for the special pages drop-down
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-	require ( 'phase3/includes/WebStart.php' );
-} else {
-	require ( __DIR__ . '/includes/WebStart.php' );
-}
-
-global $wgArticlePath;
-
-$page = $wgRequest->getVal( 'wpDropdown' );
-
-$url = str_replace( "$1", urlencode( $page ), $wgArticlePath );
-
-header( "Location: {$url}", true, 301 );
diff --git a/redirect.php5 b/redirect.php5
deleted file mode 100644
index b65f69aa..00000000
--- a/redirect.php5
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-/**
- * Version of redirect.php to used in web server requiring .php5 extension
- * to execute scripts with PHP5 engine.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-require './redirect.php';
diff --git a/redirect.phtml b/redirect.phtml
deleted file mode 100644
index 3e430bff..00000000
--- a/redirect.phtml
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-// stub file for compatibility with older versions
-include_once('./redirect.php');
diff --git a/resources/Resources.php b/resources/Resources.php
index 6205bb91..06120008 100644
--- a/resources/Resources.php
+++ b/resources/Resources.php
@@ -20,7 +20,7 @@
  * @file
  */
 
-if( !defined( 'MEDIAWIKI' ) ) {
+if ( !defined( 'MEDIAWIKI' ) ) {
 	die( 'Not an entry point.' );
 }
 
@@ -60,14 +60,11 @@ return array(
 	 *
 	 * See Vector for an example.
 	 */
-
-	'skins.chick' => array(
-		'styles' => array( 'chick/main.css' => array( 'media' => 'screen, handheld' ) ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
 	'skins.cologneblue' => array(
-		'styles' => array( 'cologneblue/screen.css' => array( 'media' => 'screen' ) ),
+		'styles' => array(
+			'cologneblue/screen.css' => array( 'media' => 'screen' ),
+			'cologneblue/print.css' => array( 'media' => 'print' ),
+		),
 		'remoteBasePath' => $GLOBALS['wgStylePath'],
 		'localBasePath' => $GLOBALS['wgStyleDirectory'],
 	),
@@ -102,37 +99,53 @@ return array(
 		'remoteBasePath' => $GLOBALS['wgStylePath'],
 		'localBasePath' => $GLOBALS['wgStyleDirectory'],
 	),
-	'skins.nostalgia' => array(
-		'styles' => array( 'nostalgia/screen.css' => array( 'media' => 'screen' ) ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-	'skins.simple' => array(
-		'styles' => array( 'simple/main.css' => array( 'media' => 'screen' ) ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-	'skins.standard' => array(
-		'styles' => array( 'standard/main.css' => array( 'media' => 'screen' ) ),
+	'skins.vector' => array(
+		// Used in the web installer. Test it after modifying this definition!
+		'styles' => array(
+			'common/commonElements.css' => array( 'media' => 'screen' ),
+			'common/commonContent.css' => array( 'media' => 'screen' ),
+			'common/commonInterface.css' => array( 'media' => 'screen' ),
+			'vector/styles.less',
+		),
 		'remoteBasePath' => $GLOBALS['wgStylePath'],
 		'localBasePath' => $GLOBALS['wgStyleDirectory'],
 	),
-	'skins.vector' => array(
-		// Keep in sync with WebInstallerOutput::getCSS()
+	'skins.vector.beta' => array(
+		// Keep in sync with skins.vector
 		'styles' => array(
 			'common/commonElements.css' => array( 'media' => 'screen' ),
 			'common/commonContent.css' => array( 'media' => 'screen' ),
 			'common/commonInterface.css' => array( 'media' => 'screen' ),
-			'vector/screen.css' => array( 'media' => 'screen' ),
-			'vector/screen-hd.css' => array( 'media' => 'screen and (min-width: 982px)' ),
+			'vector/styles-beta.less',
 		),
 		'remoteBasePath' => $GLOBALS['wgStylePath'],
 		'localBasePath' => $GLOBALS['wgStyleDirectory'],
 	),
 	'skins.vector.js' => array(
-		'scripts' => 'vector/vector.js',
+		'scripts' => array(
+			'vector/collapsibleTabs.js',
+			'vector/vector.js',
+		),
+		'position' => 'top',
+		'dependencies' => 'jquery.delayedBind',
+		'remoteBasePath' => $GLOBALS['wgStylePath'],
+		'localBasePath' => $GLOBALS['wgStyleDirectory'],
+	),
+	'skins.vector.collapsibleNav' => array(
+		'scripts' => array(
+			'vector/collapsibleNav.js',
+		),
+		'messages' => array(
+			'vector-collapsiblenav-more',
+		),
+		'dependencies' => array(
+			'jquery.client',
+			'jquery.cookie',
+			'jquery.tabIndex',
+		),
 		'remoteBasePath' => $GLOBALS['wgStylePath'],
 		'localBasePath' => $GLOBALS['wgStyleDirectory'],
+		'position' => 'bottom',
 	),
 
 	/* jQuery */
@@ -166,6 +179,7 @@ return array(
 	),
 	'jquery.byteLength' => array(
 		'scripts' => 'resources/jquery/jquery.byteLength.js',
+		'targets' => array( 'desktop', 'mobile' ),
 	),
 	'jquery.byteLimit' => array(
 		'scripts' => 'resources/jquery/jquery.byteLimit.js',
@@ -173,6 +187,11 @@ return array(
 	),
 	'jquery.checkboxShiftClick' => array(
 		'scripts' => 'resources/jquery/jquery.checkboxShiftClick.js',
+		'targets' => array( 'desktop', 'mobile' ),
+	),
+	'jquery.chosen' => array(
+		'scripts' => 'resources/jquery.chosen/chosen.jquery.js',
+		'styles' => 'resources/jquery.chosen/chosen.css',
 	),
 	'jquery.client' => array(
 		'scripts' => 'resources/jquery/jquery.client.js',
@@ -210,6 +229,7 @@ return array(
 	),
 	'jquery.getAttrs' => array(
 		'scripts' => 'resources/jquery/jquery.getAttrs.js',
+		'targets' => array( 'desktop', 'mobile' ),
 	),
 	'jquery.hidpi' => array(
 		'scripts' => 'resources/jquery/jquery.hidpi.js',
@@ -233,12 +253,14 @@ return array(
 		'scripts' => 'resources/jquery/jquery.makeCollapsible.js',
 		'styles' => 'resources/jquery/jquery.makeCollapsible.css',
 		'messages' => array( 'collapsible-expand', 'collapsible-collapse' ),
+		'targets' => array( 'desktop', 'mobile' ),
 	),
 	'jquery.mockjax' => array(
 		'scripts' => 'resources/jquery/jquery.mockjax.js',
 	),
 	'jquery.mw-jump' => array(
 		'scripts' => 'resources/jquery/jquery.mw-jump.js',
+		'targets' => array( 'desktop', 'mobile' ),
 	),
 	'jquery.mwExtension' => array(
 		'scripts' => 'resources/jquery/jquery.mwExtension.js',
@@ -246,15 +268,18 @@ return array(
 	),
 	'jquery.placeholder' => array(
 		'scripts' => 'resources/jquery/jquery.placeholder.js',
+		'targets' => array( 'desktop', 'mobile' ),
 	),
 	'jquery.qunit' => array(
 		'scripts' => 'resources/jquery/jquery.qunit.js',
 		'styles' => 'resources/jquery/jquery.qunit.css',
 		'position' => 'top',
+		'targets' => array( 'desktop', 'mobile' ),
 	),
 	'jquery.qunit.completenessTest' => array(
 		'scripts' => 'resources/jquery/jquery.qunit.completenessTest.js',
 		'dependencies' => 'jquery.qunit',
+		'targets' => array( 'desktop', 'mobile' ),
 	),
 	'jquery.spinner' => array(
 		'scripts' => 'resources/jquery/jquery.spinner.js',
@@ -276,7 +301,10 @@ return array(
 		'scripts' => 'resources/jquery/jquery.tablesorter.js',
 		'styles' => 'resources/jquery/jquery.tablesorter.css',
 		'messages' => array( 'sort-descending', 'sort-ascending' ),
-		'dependencies' => 'jquery.mwExtension',
+		'dependencies' => array(
+			'jquery.mwExtension',
+			'mediawiki.language.months',
+		),
 	),
 	'jquery.textSelection' => array(
 		'scripts' => 'resources/jquery/jquery.textSelection.js',
@@ -605,6 +633,12 @@ return array(
 			'mediawiki.Title',
 		),
 	),
+	'mediawiki.api.login' => array(
+		'scripts' => 'resources/mediawiki.api/mediawiki.api.login.js',
+		'dependencies' => array(
+			'mediawiki.api',
+		),
+	),
 	'mediawiki.api.parse' => array(
 		'scripts' => 'resources/mediawiki.api/mediawiki.api.parse.js',
 		'dependencies' => 'mediawiki.api',
@@ -616,6 +650,9 @@ return array(
 			'user.tokens',
 		),
 	),
+	'mediawiki.icon' => array(
+		'styles' => 'resources/mediawiki/mediawiki.icon.css',
+	),
 	'mediawiki.debug' => array(
 		'scripts' => 'resources/mediawiki/mediawiki.debug.js',
 		'styles' => 'resources/mediawiki/mediawiki.debug.css',
@@ -629,6 +666,14 @@ return array(
 		// must be loaded on the bottom
 		'position' => 'bottom',
 	),
+	'mediawiki.inspect' => array(
+		'scripts' => 'resources/mediawiki/mediawiki.inspect.js',
+		'dependencies' => array(
+			'jquery.byteLength',
+			'jquery.json',
+		),
+		'targets' => array( 'desktop', 'mobile' ),
+	),
 	'mediawiki.feedback' => array(
 		'scripts' => 'resources/mediawiki/mediawiki.feedback.js',
 		'styles' => 'resources/mediawiki/mediawiki.feedback.css',
@@ -663,6 +708,7 @@ return array(
 	),
 	'mediawiki.htmlform' => array(
 		'scripts' => 'resources/mediawiki/mediawiki.htmlform.js',
+		'messages' => array( 'htmlform-chosen-placeholder' ),
 	),
 	'mediawiki.notification' => array(
 		'styles' => 'resources/mediawiki/mediawiki.notification.css',
@@ -687,11 +733,15 @@ return array(
 			'jquery.client',
 			'jquery.placeholder',
 			'jquery.suggestions',
+			'mediawiki.api',
 		),
 	),
 	'mediawiki.Title' => array(
 		'scripts' => 'resources/mediawiki/mediawiki.Title.js',
-		'dependencies' => 'mediawiki.util',
+		'dependencies' => array(
+			'jquery.byteLength',
+			'mediawiki.util',
+		),
 	),
 	'mediawiki.Uri' => array(
 		'scripts' => 'resources/mediawiki/mediawiki.Uri.js',
@@ -723,16 +773,30 @@ return array(
 	'mediawiki.action.edit' => array(
 		'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.js',
 		'dependencies' => array(
+			'mediawiki.action.edit.styles',
 			'jquery.textSelection',
 			'jquery.byteLimit',
 		),
 		'position' => 'top',
 	),
+	'mediawiki.action.edit.styles' => array(
+		'styles' => 'resources/mediawiki.action/mediawiki.action.edit.styles.css',
+		'position' => 'top',
+	),
+	'mediawiki.action.edit.collapsibleFooter' => array(
+		'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js',
+		'styles' => 'resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css',
+		'dependencies' => array(
+			'jquery.makeCollapsible',
+			'mediawiki.icon',
+		),
+	),
 	'mediawiki.action.edit.preview' => array(
 		'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.preview.js',
 		'dependencies' => array(
 			'jquery.form',
 			'jquery.spinner',
+			'mediawiki.action.history.diff',
 		),
 	),
 	'mediawiki.action.history' => array(
@@ -759,11 +823,24 @@ return array(
 	),
 	'mediawiki.action.view.postEdit' => array(
 		'scripts' => 'resources/mediawiki.action/mediawiki.action.view.postEdit.js',
-		'dependencies' => 'jquery.cookie'
+		'styles' => 'resources/mediawiki.action/mediawiki.action.view.postEdit.css',
+		'dependencies' => array(
+			'jquery.cookie',
+			'mediawiki.jqueryMsg'
+		),
+		'messages' => array(
+			'postedit-confirmation',
+		),
 	),
 	'mediawiki.action.view.rightClickEdit' => array(
 		'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
 	),
+	'mediawiki.action.edit.editWarning' => array(
+		'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.editWarning.js',
+		'messages' => array(
+			'editwarning-warning',
+		),
+	),
 	// Alias for backwards compatibility
 	'mediawiki.action.watch.ajax' => array(
 		'dependencies' => 'mediawiki.page.watch.ajax'
@@ -825,6 +902,16 @@ return array(
 		'targets' => array( 'desktop', 'mobile' ),
 	),
 
+	'mediawiki.language.months' => array(
+		'scripts' => 'resources/mediawiki.language/mediawiki.language.months.js',
+		'dependencies' => 'mediawiki.language',
+		'messages' => array_merge(
+			Language::$mMonthMsgs,
+			Language::$mMonthGenMsgs,
+			Language::$mMonthAbbrevMsgs
+		)
+	),
+
 	/* MediaWiki Libs */
 
 	'mediawiki.libs.jpegmeta' => array(
@@ -833,6 +920,9 @@ return array(
 
 	/* MediaWiki Page */
 
+	'mediawiki.page.gallery' => array(
+		'scripts' => 'resources/mediawiki.page/mediawiki.page.gallery.js',
+	),
 	'mediawiki.page.ready' => array(
 		'scripts' => 'resources/mediawiki.page/mediawiki.page.ready.js',
 		'dependencies' => array(
@@ -842,6 +932,7 @@ return array(
 			'jquery.mw-jump',
 			'mediawiki.util',
 		),
+		'targets' => array( 'desktop', 'mobile' ),
 	),
 	'mediawiki.page.startup' => array(
 		'scripts' => 'resources/mediawiki.page/mediawiki.page.startup.js',
@@ -850,6 +941,7 @@ return array(
 			'mediawiki.util',
 		),
 		'position' => 'top',
+		'targets' => array( 'desktop', 'mobile' ),
 	),
 	'mediawiki.page.patrol.ajax' => array(
 		'scripts' => 'resources/mediawiki.page/mediawiki.page.patrol.ajax.js',
@@ -887,6 +979,10 @@ return array(
 			'watcherrortext',
 		),
 	),
+	'mediawiki.page.image.pagination' => array(
+		'scripts' => 'resources/mediawiki.page/mediawiki.page.image.pagination.js',
+		'dependencies' => array( 'jquery.spinner' )
+	),
 
 	/* MediaWiki Special pages */
 
@@ -913,15 +1009,21 @@ return array(
 	),
 	'mediawiki.special.changeslist' => array(
 		'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.css',
-		'dependencies' => array( 'jquery.makeCollapsible' ),
+	),
+	'mediawiki.special.changeslist.enhanced' => array(
+		'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css',
 	),
 	'mediawiki.special.movePage' => array(
 		'scripts' => 'resources/mediawiki.special/mediawiki.special.movePage.js',
 		'dependencies' => 'jquery.byteLimit',
 	),
+	'mediawiki.special.pagesWithProp' => array(
+		'styles' => 'resources/mediawiki.special/mediawiki.special.pagesWithProp.css',
+	),
 	'mediawiki.special.preferences' => array(
 		'scripts' => 'resources/mediawiki.special/mediawiki.special.preferences.js',
-		'styles'  => 'resources/mediawiki.special/mediawiki.special.preferences.css',
+		'styles' => 'resources/mediawiki.special/mediawiki.special.preferences.css',
+		'position' => 'top',
 	),
 	'mediawiki.special.recentchanges' => array(
 		'scripts' => 'resources/mediawiki.special/mediawiki.special.recentchanges.js',
@@ -941,7 +1043,7 @@ return array(
 		'scripts' => 'resources/mediawiki.special/mediawiki.special.undelete.js',
 	),
 	'mediawiki.special.upload' => array(
-		// @TODO: merge in remainder of mediawiki.legacy.upload
+		// @todo merge in remainder of mediawiki.legacy.upload
 		'scripts' => 'resources/mediawiki.special/mediawiki.special.upload.js',
 		'messages' => array(
 			'widthheight',
@@ -951,10 +1053,33 @@ return array(
 			'size-gigabytes',
 			'largefileserver',
 		),
-		'dependencies' => array( 'mediawiki.libs.jpegmeta', 'mediawiki.util' ),
+		'dependencies' => array(
+			'mediawiki.libs.jpegmeta',
+			'mediawiki.util',
+		),
+	),
+	'mediawiki.special.userlogin' => array(
+		'styles' => array(
+			'resources/mediawiki.special/mediawiki.special.vforms.css',
+			'resources/mediawiki.special/mediawiki.special.userLogin.css',
+		),
+		'position' => 'top',
+	),
+	'mediawiki.special.createaccount' => array(
+		'styles' => array(
+			'resources/mediawiki.special/mediawiki.special.vforms.css',
+			'resources/mediawiki.special/mediawiki.special.createAccount.css',
+		),
 	),
-	'mediawiki.special.userlogin.signup' => array(
-		'scripts' => 'resources/mediawiki.special/mediawiki.special.userLogin.signup.js',
+	'mediawiki.special.createaccount.js' => array(
+		'scripts' => 'resources/mediawiki.special/mediawiki.special.createAccount.js',
+		'messages' => array(
+			'createacct-captcha',
+			'createacct-emailrequired',
+			'createacct-imgcaptcha-ph'
+		),
+		'dependencies' => 'mediawiki.jqueryMsg',
+		'position' => 'top',
 	),
 	'mediawiki.special.javaScriptTest' => array(
 		'scripts' => 'resources/mediawiki.special/mediawiki.special.javaScriptTest.js',
@@ -964,6 +1089,7 @@ return array(
 		) ),
 		'dependencies' => array( 'jquery.qunit' ),
 		'position' => 'top',
+		'targets' => array( 'desktop', 'mobile' ),
 	),
 
 	/* MediaWiki Tests */
@@ -978,6 +1104,7 @@ return array(
 			'mediawiki.page.ready',
 		),
 		'position' => 'top',
+		'targets' => array( 'desktop', 'mobile' ),
 	),
 
 	/* MediaWiki Legacy */
@@ -998,14 +1125,9 @@ return array(
 		'localBasePath' => $GLOBALS['wgStyleDirectory'],
 	),
 	'mediawiki.legacy.config' => array(
+		// Used in the web installer. Test it after modifying this definition!
 		'scripts' => 'common/config.js',
-		'styles' => array( 'common/config.css', 'common/config-cc.css' ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-		'dependencies' => 'mediawiki.legacy.wikibits',
-	),
-	'mediawiki.legacy.IEFixes' => array(
-		'scripts' => 'common/IEFixes.js',
+		'styles' => array( 'common/config.css' ),
 		'remoteBasePath' => $GLOBALS['wgStylePath'],
 		'localBasePath' => $GLOBALS['wgStyleDirectory'],
 		'dependencies' => 'mediawiki.legacy.wikibits',
@@ -1015,12 +1137,12 @@ return array(
 		'remoteBasePath' => $GLOBALS['wgStylePath'],
 		'localBasePath' => $GLOBALS['wgStyleDirectory'],
 		'dependencies' => array(
-			'mediawiki.legacy.wikibits',
 			'jquery.byteLimit',
 		),
 		'position' => 'top',
 	),
 	'mediawiki.legacy.shared' => array(
+		// Used in the web installer. Test it after modifying this definition!
 		'styles' => array( 'common/shared.css' => array( 'media' => 'screen' ) ),
 		'remoteBasePath' => $GLOBALS['wgStylePath'],
 		'localBasePath' => $GLOBALS['wgStyleDirectory'],
@@ -1035,7 +1157,9 @@ return array(
 		'remoteBasePath' => $GLOBALS['wgStylePath'],
 		'localBasePath' => $GLOBALS['wgStyleDirectory'],
 		'dependencies' => array(
-			'mediawiki.legacy.wikibits',
+			'jquery.spinner',
+			'mediawiki.api',
+			'mediawiki.Title',
 			'mediawiki.util',
 		),
 	),
@@ -1048,9 +1172,11 @@ return array(
 		),
 		'position' => 'top',
 	),
-	'mediawiki.legacy.wikiprintable' => array(
-		'styles' => array( 'common/wikiprintable.css' => array( 'media' => 'print' ) ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
+	'mediawiki.ui' => array(
+		'skinStyles' => array(
+			'default' => 'resources/mediawiki.ui/mediawiki.ui.default.css',
+			'vector' => 'resources/mediawiki.ui/mediawiki.ui.vector.css',
+		),
+		'position' => 'top',
 	),
 );
diff --git a/resources/Resources.php.orig b/resources/Resources.php.orig
deleted file mode 100644
index 0a70c5a2..00000000
--- a/resources/Resources.php.orig
+++ /dev/null
@@ -1,968 +0,0 @@
-<?php
-
-return array(
-
-	/* Special modules who have their own classes */
-
-	// Scripts managed by the local wiki (stored in the MediaWiki namespace)
-	'site' => array( 'class' => 'ResourceLoaderSiteModule' ),
-	'noscript' => array( 'class' => 'ResourceLoaderNoscriptModule' ),
-	'startup' => array( 'class' => 'ResourceLoaderStartUpModule' ),
-	'filepage' => array( 'class' => 'ResourceLoaderFilePageModule' ),
-	'user.groups' => array( 'class' => 'ResourceLoaderUserGroupsModule' ),
-
-	// Scripts managed by the current user (stored in their user space)
-	'user' => array( 'class' => 'ResourceLoaderUserModule' ),
-
-	// Scripts generated based on the current user's preferences
-	'user.cssprefs' => array( 'class' => 'ResourceLoaderUserCSSPrefsModule' ),
-
-	// Populate mediawiki.user placeholders with information about the current user
-	'user.options' => array( 'class' => 'ResourceLoaderUserOptionsModule' ),
-	'user.tokens' => array( 'class' => 'ResourceLoaderUserTokensModule' ),
-
-	// Scripts for the dynamic language specific data, like grammar forms.
-	'mediawiki.language.data' => array( 'class' => 'ResourceLoaderLanguageDataModule' ),
-
-	/* Skins */
-
-	'skins.chick' => array(
-		'styles' => array( 'chick/main.css' => array( 'media' => 'screen, handheld' ) ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-	'skins.cologneblue' => array(
-		'styles' => array( 'cologneblue/screen.css' => array( 'media' => 'screen' ) ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-	'skins.modern' => array(
-		'styles' => array(
-			'modern/main.css' => array( 'media' => 'screen' ),
-			'modern/print.css' => array( 'media' => 'print' ),
-		),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-	'skins.monobook' => array(
-		'styles' => array(
-			'common/commonElements.css' => array( 'media' => 'screen' ),
-			'common/commonContent.css' => array( 'media' => 'screen' ),
-			'common/commonInterface.css' => array( 'media' => 'screen' ),
-			'monobook/main.css' => array( 'media' => 'screen' ),
-		),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-	'skins.archlinux' => array(
-		'styles' => array(
-			'common/commonElements.css' => array( 'media' => 'screen' ),
-			'common/commonContent.css' => array( 'media' => 'screen' ),
-			'common/commonInterface.css' => array( 'media' => 'screen' ),
-			'archlinux/main.css' => array( 'media' => 'screen' ),
-			'archlinux/archnavbar.css' => array( 'media' => 'screen' ),
-			'archlinux/arch.css' => array( 'media' => 'screen' ),
-			'archlinux/print.css' => array( 'media' => 'print' ),
-		),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-	'skins.nostalgia' => array(
-		'styles' => array( 'nostalgia/screen.css' => array( 'media' => 'screen' ) ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-	'skins.simple' => array(
-		'styles' => array( 'simple/main.css' => array( 'media' => 'screen' ) ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-	'skins.standard' => array(
-		'styles' => array( 'standard/main.css' => array( 'media' => 'screen' ) ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-	'skins.vector' => array(
-		// Keep in sync with WebInstallerOutput::getCSS()
-		'styles' => array(
-			'common/commonElements.css' => array( 'media' => 'screen' ),
-			'common/commonContent.css' => array( 'media' => 'screen' ),
-			'common/commonInterface.css' => array( 'media' => 'screen' ),
-			'vector/screen.css' => array( 'media' => 'screen' ),
-			'vector/screen-hd.css' => array( 'media' => 'screen and (min-width: 982px)' ),
-		),
-		'scripts' => 'vector/vector.js',
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-
-	/* jQuery */
-
-	'jquery' => array(
-		'scripts' => 'resources/jquery/jquery.js',
-		'debugRaw' => false,
-	),
-
-	/* jQuery Plugins */
-
-	'jquery.appear' => array(
-		'scripts' => 'resources/jquery/jquery.appear.js',
-	),
-	'jquery.arrowSteps' => array(
-		'scripts' => 'resources/jquery/jquery.arrowSteps.js',
-		'styles' => 'resources/jquery/jquery.arrowSteps.css',
-	),
-	'jquery.async' => array(
-		'scripts' => 'resources/jquery/jquery.async.js',
-	),
-	'jquery.autoEllipsis' => array(
-		'scripts' => 'resources/jquery/jquery.autoEllipsis.js',
-		'dependencies' => 'jquery.highlightText',
-	),
-	'jquery.badge' => array(
-		'scripts' => 'resources/jquery/jquery.badge.js',
-		'styles' => 'resources/jquery/jquery.badge.css',
-	),
-	'jquery.byteLength' => array(
-		'scripts' => 'resources/jquery/jquery.byteLength.js',
-	),
-	'jquery.byteLimit' => array(
-		'scripts' => 'resources/jquery/jquery.byteLimit.js',
-		'dependencies' => 'jquery.byteLength',
-	),
-	'jquery.checkboxShiftClick' => array(
-		'scripts' => 'resources/jquery/jquery.checkboxShiftClick.js',
-	),
-	'jquery.client' => array(
-		'scripts' => 'resources/jquery/jquery.client.js',
-	),
-	'jquery.collapsibleTabs' => array(
-		'scripts' => 'resources/jquery/jquery.collapsibleTabs.js',
-	),
-	'jquery.color' => array(
-		'scripts' => 'resources/jquery/jquery.color.js',
-		'dependencies' => 'jquery.colorUtil',
-	),
-	'jquery.colorUtil' => array(
-		'scripts' => 'resources/jquery/jquery.colorUtil.js',
-	),
-	'jquery.cookie' => array(
-		'scripts' => 'resources/jquery/jquery.cookie.js',
-	),
-	'jquery.delayedBind' => array(
-		'scripts' => 'resources/jquery/jquery.delayedBind.js',
-	),
-	'jquery.expandableField' => array(
-		'scripts' => 'resources/jquery/jquery.expandableField.js',
-		'dependencies' => 'jquery.delayedBind',
-	),
-	'jquery.farbtastic' => array(
-		'scripts' => 'resources/jquery/jquery.farbtastic.js',
-		'styles' => 'resources/jquery/jquery.farbtastic.css',
-		'dependencies' => 'jquery.colorUtil',
-	),
-	'jquery.footHovzer' => array(
-		'scripts' => 'resources/jquery/jquery.footHovzer.js',
-		'styles' => 'resources/jquery/jquery.footHovzer.css',
-	),
-	'jquery.form' => array(
-		'scripts' => 'resources/jquery/jquery.form.js',
-	),
-	'jquery.getAttrs' => array(
-		'scripts' => 'resources/jquery/jquery.getAttrs.js',
-	),
-	'jquery.highlightText' => array(
-		'scripts' => 'resources/jquery/jquery.highlightText.js',
-		'dependencies' => 'jquery.mwExtension',
-	),
-	'jquery.hoverIntent' => array(
-		'scripts' => 'resources/jquery/jquery.hoverIntent.js',
-	),
-	'jquery.json' => array(
-		'scripts' => 'resources/jquery/jquery.json.js',
-	),
-	'jquery.localize' => array(
-		'scripts' => 'resources/jquery/jquery.localize.js',
-	),
-	'jquery.makeCollapsible' => array(
-		'scripts' => 'resources/jquery/jquery.makeCollapsible.js',
-		'styles' => 'resources/jquery/jquery.makeCollapsible.css',
-		'messages' => array( 'collapsible-expand', 'collapsible-collapse' ),
-	),
-	'jquery.mockjax' => array(
-		'scripts' => 'resources/jquery/jquery.mockjax.js',
-	),
-	'jquery.mw-jump' => array(
-		'scripts' => 'resources/jquery/jquery.mw-jump.js',
-	),
-	'jquery.mwExtension' => array(
-		'scripts' => 'resources/jquery/jquery.mwExtension.js',
-	),
-	'jquery.placeholder' => array(
-		'scripts' => 'resources/jquery/jquery.placeholder.js',
-	),
-	'jquery.qunit' => array(
-		'scripts' => 'resources/jquery/jquery.qunit.js',
-		'styles' => 'resources/jquery/jquery.qunit.css',
-		'position' => 'top',
-	),
-	'jquery.qunit.completenessTest' => array(
-		'scripts' => 'resources/jquery/jquery.qunit.completenessTest.js',
-		'dependencies' => 'jquery.qunit',
-	),
-	'jquery.spinner' => array(
-		'scripts' => 'resources/jquery/jquery.spinner.js',
-		'styles' => 'resources/jquery/jquery.spinner.css',
-	),
-	'jquery.jStorage' => array(
-		'scripts' => 'resources/jquery/jquery.jStorage.js',
-		'dependencies' => 'jquery.json',
-	),
-	'jquery.suggestions' => array(
-		'scripts' => 'resources/jquery/jquery.suggestions.js',
-		'styles' => 'resources/jquery/jquery.suggestions.css',
-		'dependencies' => 'jquery.autoEllipsis',
-	),
-	'jquery.tabIndex' => array(
-		'scripts' => 'resources/jquery/jquery.tabIndex.js',
-	),
-	'jquery.tablesorter' => array(
-		'scripts' => 'resources/jquery/jquery.tablesorter.js',
-		'styles' => 'resources/jquery/jquery.tablesorter.css',
-		'messages' => array( 'sort-descending', 'sort-ascending' ),
-		'dependencies' => 'jquery.mwExtension',
-	),
-	'jquery.textSelection' => array(
-		'scripts' => 'resources/jquery/jquery.textSelection.js',
-		'dependencies' => 'jquery.client',
-	),
-	'jquery.validate' => array(
-		'scripts' => 'resources/jquery/jquery.validate.js',
-	),
-	'jquery.xmldom' => array(
-		'scripts' => 'resources/jquery/jquery.xmldom.js',
-	),
-
-	/* jQuery Tipsy */
-
-	'jquery.tipsy' => array(
-		'scripts' => 'resources/jquery.tipsy/jquery.tipsy.js',
-		'styles' => 'resources/jquery.tipsy/jquery.tipsy.css',
-	),
-
-	/* jQuery UI */
-
-	// Core
-	'jquery.ui.core' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.core.js',
-		'skinStyles' => array(
-			'default' => array(
-				'resources/jquery.ui/themes/default/jquery.ui.core.css',
-				'resources/jquery.ui/themes/default/jquery.ui.theme.css',
-			),
-			'vector' => array(
-				'resources/jquery.ui/themes/vector/jquery.ui.core.css',
-				'resources/jquery.ui/themes/vector/jquery.ui.theme.css',
-			),
-		),
-		'dependencies' => 'jquery',
-		'group' => 'jquery.ui',
-	),
-	'jquery.ui.widget' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.widget.js',
-		'group' => 'jquery.ui',
-	),
-	'jquery.ui.mouse' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.mouse.js',
-		'dependencies' => 'jquery.ui.widget',
-		'group' => 'jquery.ui',
-	),
-	'jquery.ui.position' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.position.js',
-		'group' => 'jquery.ui',
-	),
-	// Interactions
-	'jquery.ui.draggable' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.draggable.js',
-		'dependencies' => array( 'jquery.ui.core', 'jquery.ui.mouse', 'jquery.ui.widget' ),
-		'group' => 'jquery.ui',
-	),
-	'jquery.ui.droppable' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.droppable.js',
-		'dependencies' => array(
-			'jquery.ui.core', 'jquery.ui.mouse', 'jquery.ui.widget', 'jquery.ui.draggable',
-		),
-		'group' => 'jquery.ui',
-	),
-	'jquery.ui.resizable' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.resizable.js',
-		'skinStyles' => array(
-			'default' => 'resources/jquery.ui/themes/default/jquery.ui.resizable.css',
-			'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.resizable.css',
-		),
-		'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
-		'group' => 'jquery.ui',
-	),
-	'jquery.ui.selectable' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.selectable.js',
-		'skinStyles' => array(
-			'default' => 'resources/jquery.ui/themes/default/jquery.ui.selectable.css',
-			'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.selectable.css',
-		),
-		'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
-		'group' => 'jquery.ui',
-	),
-	'jquery.ui.sortable' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.sortable.js',
-		'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
-		'group' => 'jquery.ui',
-	),
-	// Widgets
-	'jquery.ui.accordion' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.accordion.js',
-		'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
-		'skinStyles' => array(
-			'default' => 'resources/jquery.ui/themes/default/jquery.ui.accordion.css',
-			'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.accordion.css',
-		),
-		'group' => 'jquery.ui',
-	),
-	'jquery.ui.autocomplete' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.autocomplete.js',
-		'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.position' ),
-		'skinStyles' => array(
-			'default' => 'resources/jquery.ui/themes/default/jquery.ui.autocomplete.css',
-			'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.autocomplete.css',
-		),
-		'group' => 'jquery.ui',
-	),
-	'jquery.ui.button' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.button.js',
-		'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
-		'skinStyles' => array(
-			'default' => 'resources/jquery.ui/themes/default/jquery.ui.button.css',
-			'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.button.css',
-		),
-		'group' => 'jquery.ui',
-	),
-	'jquery.ui.datepicker' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.datepicker.js',
-		'dependencies' => 'jquery.ui.core',
-		'skinStyles' => array(
-			'default' => 'resources/jquery.ui/themes/default/jquery.ui.datepicker.css',
-			'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.datepicker.css',
-		),
-		'languageScripts' => array(
-			'af' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-af.js',
-			'ar' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js',
-			'az' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-az.js',
-			'bg' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-bg.js',
-			'bs' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-bs.js',
-			'ca' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ca.js',
-			'cs' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-cs.js',
-			'da' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-da.js',
-			'de' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-de.js',
-			'el' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-el.js',
-			'en-gb' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js',
-			'eo' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-eo.js',
-			'es' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-es.js',
-			'et' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-et.js',
-			'eu' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js',
-			'fa' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js',
-			'fi' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fi.js',
-			'fo' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fo.js',
-			'fr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-fr.js',
-			'gl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-gl.js',
-			'he' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-he.js',
-			'hi' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hi.js',
-			'hr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hr.js',
-			'hu' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hu.js',
-			'hy' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-hy.js',
-			'id' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-id.js',
-			'is' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-is.js',
-			'it' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-it.js',
-			'ja' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js',
-			'ka' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ka.js',
-			'kk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-kk.js',
-			'km' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-km.js',
-			'ko' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ko.js',
-			'lb' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-lb.js',
-			'lt' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-lt.js',
-			'lv' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-lv.js',
-			'mk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-mk.js',
-			'ml' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ml.js',
-			'ms' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ms.js',
-			'nl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-nl.js',
-			'no' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-no.js',
-			'pl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-pl.js',
-			'pt' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-pt.js',
-			'pt-br' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js',
-			'rm' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-rm.js',
-			'ro' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ro.js',
-			'ru' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ru.js',
-			'sk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sk.js',
-			'sl' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sl.js',
-			'sq' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sq.js',
-			'sr-sr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js',
-			'sr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sr.js',
-			'sv' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-sv.js',
-			'ta' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ta.js',
-			'th' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-th.js',
-			'tr' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-tr.js',
-			'uk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-uk.js',
-			'vi' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-vi.js',
-			'zh-cn' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js',
-			'zh-hk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js',
-			'zh-tw' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js',
-		),
-		'group' => 'jquery.ui',
-	),
-	'jquery.ui.dialog' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.dialog.js',
-		'dependencies' => array(
-			'jquery.ui.core',
-			'jquery.ui.widget',
-			'jquery.ui.button',
-			'jquery.ui.draggable',
-			'jquery.ui.mouse',
-			'jquery.ui.position',
-			'jquery.ui.resizable',
-		),
-		'skinStyles' => array(
-			'default' => 'resources/jquery.ui/themes/default/jquery.ui.dialog.css',
-			'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.dialog.css',
-		),
-		'group' => 'jquery.ui',
-	),
-	'jquery.ui.progressbar' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.progressbar.js',
-		'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
-		'skinStyles' => array(
-			'default' => 'resources/jquery.ui/themes/default/jquery.ui.progressbar.css',
-			'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.progressbar.css',
-		),
-		'group' => 'jquery.ui',
-	),
-	'jquery.ui.slider' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.slider.js',
-		'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
-		'skinStyles' => array(
-			'default' => 'resources/jquery.ui/themes/default/jquery.ui.slider.css',
-			'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.slider.css',
-		),
-		'group' => 'jquery.ui',
-	),
-	'jquery.ui.tabs' => array(
-		'scripts' => 'resources/jquery.ui/jquery.ui.tabs.js',
-		'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
-		'skinStyles' => array(
-			'default' => 'resources/jquery.ui/themes/default/jquery.ui.tabs.css',
-			'vector' => 'resources/jquery.ui/themes/vector/jquery.ui.tabs.css',
-		),
-		'group' => 'jquery.ui',
-	),
-	// Effects
-	'jquery.effects.core' => array(
-		'scripts' => 'resources/jquery.effects/jquery.effects.core.js',
-		'dependencies' => 'jquery',
-		'group' => 'jquery.ui',
-	),
-	'jquery.effects.blind' => array(
-		'scripts' => 'resources/jquery.effects/jquery.effects.blind.js',
-		'dependencies' => 'jquery.effects.core',
-		'group' => 'jquery.ui',
-	),
-	'jquery.effects.bounce' => array(
-		'scripts' => 'resources/jquery.effects/jquery.effects.bounce.js',
-		'dependencies' => 'jquery.effects.core',
-		'group' => 'jquery.ui',
-	),
-	'jquery.effects.clip' => array(
-		'scripts' => 'resources/jquery.effects/jquery.effects.clip.js',
-		'dependencies' => 'jquery.effects.core',
-		'group' => 'jquery.ui',
-	),
-	'jquery.effects.drop' => array(
-		'scripts' => 'resources/jquery.effects/jquery.effects.drop.js',
-		'dependencies' => 'jquery.effects.core',
-		'group' => 'jquery.ui',
-	),
-	'jquery.effects.explode' => array(
-		'scripts' => 'resources/jquery.effects/jquery.effects.explode.js',
-		'dependencies' => 'jquery.effects.core',
-		'group' => 'jquery.ui',
-	),
-	'jquery.effects.fade' => array(
-		'scripts' => 'resources/jquery.effects/jquery.effects.fade.js',
-		'dependencies' => 'jquery.effects.core',
-		'group' => 'jquery.ui',
-	),
-	'jquery.effects.fold' => array(
-		'scripts' => 'resources/jquery.effects/jquery.effects.fold.js',
-		'dependencies' => 'jquery.effects.core',
-		'group' => 'jquery.ui',
-	),
-	'jquery.effects.highlight' => array(
-		'scripts' => 'resources/jquery.effects/jquery.effects.highlight.js',
-		'dependencies' => 'jquery.effects.core',
-		'group' => 'jquery.ui',
-	),
-	'jquery.effects.pulsate' => array(
-		'scripts' => 'resources/jquery.effects/jquery.effects.pulsate.js',
-		'dependencies' => 'jquery.effects.core',
-		'group' => 'jquery.ui',
-	),
-	'jquery.effects.scale' => array(
-		'scripts' => 'resources/jquery.effects/jquery.effects.scale.js',
-		'dependencies' => 'jquery.effects.core',
-		'group' => 'jquery.ui',
-	),
-	'jquery.effects.shake' => array(
-		'scripts' => 'resources/jquery.effects/jquery.effects.shake.js',
-		'dependencies' => 'jquery.effects.core',
-		'group' => 'jquery.ui',
-	),
-	'jquery.effects.slide' => array(
-		'scripts' => 'resources/jquery.effects/jquery.effects.slide.js',
-		'dependencies' => 'jquery.effects.core',
-		'group' => 'jquery.ui',
-	),
-	'jquery.effects.transfer' => array(
-		'scripts' => 'resources/jquery.effects/jquery.effects.transfer.js',
-		'dependencies' => 'jquery.effects.core',
-		'group' => 'jquery.ui',
-	),
-
-	/* MediaWiki */
-
-	'mediawiki' => array(
-		'scripts' => 'resources/mediawiki/mediawiki.js',
-		'debugScripts' => 'resources/mediawiki/mediawiki.log.js',
-		'debugRaw' => false,
-	),
-	'mediawiki.api' => array(
-		'scripts' => 'resources/mediawiki.api/mediawiki.api.js',
-		'dependencies' => 'mediawiki.util',
-	),
-	'mediawiki.api.category' => array(
-		'scripts' => 'resources/mediawiki.api/mediawiki.api.category.js',
-		'dependencies' => array(
-			'mediawiki.api',
-			'mediawiki.Title',
-		),
-	),
-	'mediawiki.api.edit' => array(
-		'scripts' => 'resources/mediawiki.api/mediawiki.api.edit.js',
-		'dependencies' => array(
-			'mediawiki.api',
-			'mediawiki.Title',
-		),
-	),
-	'mediawiki.api.parse' => array(
-		'scripts' => 'resources/mediawiki.api/mediawiki.api.parse.js',
-		'dependencies' => 'mediawiki.api',
-	),
-	'mediawiki.api.titleblacklist' => array(
-		'scripts' => 'resources/mediawiki.api/mediawiki.api.titleblacklist.js',
-		'dependencies' => array(
-			'mediawiki.api',
-			'mediawiki.Title',
-		),
-	),
-	'mediawiki.api.watch' => array(
-		'scripts' => 'resources/mediawiki.api/mediawiki.api.watch.js',
-		'dependencies' => array(
-			'mediawiki.api',
-			'user.tokens',
-		),
-	),
-	'mediawiki.debug' => array(
-		'scripts' => 'resources/mediawiki/mediawiki.debug.js',
-		'styles' => 'resources/mediawiki/mediawiki.debug.css',
-		'dependencies' => 'jquery.footHovzer',
-		'position' => 'bottom',
-	),
-	'mediawiki.debug.init' => array(
-		'scripts' => 'resources/mediawiki/mediawiki.debug.init.js',
-		'dependencies' => 'mediawiki.debug',
-		// Uses a custom mw.config variable that is set in debughtml,
-		// must be loaded on the bottom
-		'position' => 'bottom',
-	),
-	'mediawiki.feedback' => array(
-		'scripts' => 'resources/mediawiki/mediawiki.feedback.js',
-		'styles' => 'resources/mediawiki/mediawiki.feedback.css',
-		'dependencies' => array(
-			'mediawiki.api.edit',
-			'mediawiki.Title',
-			'mediawiki.jqueryMsg',
-			'jquery.ui.dialog',
-		),
-		'messages' => array(
-			'feedback-bugornote',
-			'feedback-subject',
-			'feedback-message',
-			'feedback-cancel',
-			'feedback-submit',
-			'feedback-adding',
-			'feedback-error1',
-			'feedback-error2',
-			'feedback-error3',
-			'feedback-thanks',
-			'feedback-close',
-			'feedback-bugcheck',
-			'feedback-bugnew',
-		),
-	),
-	'mediawiki.htmlform' => array(
-		'scripts' => 'resources/mediawiki/mediawiki.htmlform.js',
-	),
-	'mediawiki.notification' => array(
-		'styles' => 'resources/mediawiki/mediawiki.notification.css',
-		'scripts' => 'resources/mediawiki/mediawiki.notification.js',
-		'dependencies' => array(
-			'mediawiki.page.startup',
-		),
-	),
-	'mediawiki.notify' => array(
-		'scripts' => 'resources/mediawiki/mediawiki.notify.js',
-	),
-	'mediawiki.searchSuggest' => array(
-		'scripts' => 'resources/mediawiki/mediawiki.searchSuggest.js',
-		'messages' => array(
-			'searchsuggest-search',
-			'searchsuggest-containing',
-		),
-		'dependencies' => array(
-			'jquery.autoEllipsis',
-			'jquery.client',
-			'jquery.placeholder',
-			'jquery.suggestions',
-		),
-	),
-	'mediawiki.Title' => array(
-		'scripts' => 'resources/mediawiki/mediawiki.Title.js',
-		'dependencies' => 'mediawiki.util',
-	),
-	'mediawiki.Uri' => array(
-		'scripts' => 'resources/mediawiki/mediawiki.Uri.js',
-	),
-	'mediawiki.user' => array(
-		'scripts' => 'resources/mediawiki/mediawiki.user.js',
-		'dependencies' => array(
-			'jquery.cookie',
-			'mediawiki.api',
-		),
-	),
-	'mediawiki.util' => array(
-		'scripts' => 'resources/mediawiki/mediawiki.util.js',
-		'dependencies' => array(
-			'jquery.client',
-			'jquery.cookie',
-			'jquery.mwExtension',
-			'mediawiki.notify',
-		),
-		'messages' => array( 'showtoc', 'hidetoc' ),
-		'position' => 'top', // For $wgPreloadJavaScriptMwUtil
-	),
-
-	/* MediaWiki Action */
-
-	'mediawiki.action.edit' => array(
-		'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.js',
-		'dependencies' => array(
-			'jquery.textSelection',
-			'jquery.byteLimit',
-		),
-		'position' => 'top',
-	),
-	'mediawiki.action.edit.preview' => array(
-		'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.preview.js',
-		'dependencies' => array(
-			'jquery.form',
-			'jquery.spinner',
-		),
-	),
-	'mediawiki.action.history' => array(
-		'scripts' => 'resources/mediawiki.action/mediawiki.action.history.js',
-		'group' => 'mediawiki.action.history',
-	),
-	'mediawiki.action.history.diff' => array(
-		'styles' => 'resources/mediawiki.action/mediawiki.action.history.diff.css',
-		'group' => 'mediawiki.action.history',
-	),
-	'mediawiki.action.view.dblClickEdit' => array(
-		'scripts' => 'resources/mediawiki.action/mediawiki.action.view.dblClickEdit.js',
-		'dependencies' => 'mediawiki.util',
-	),
-	'mediawiki.action.view.metadata' => array(
-		'scripts' => 'resources/mediawiki.action/mediawiki.action.view.metadata.js',
-		'messages' => array(
-			'metadata-expand',
-			'metadata-collapse',
-		),
-	),
-	'mediawiki.action.view.rightClickEdit' => array(
-		'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
-	),
-	// Alias for backwards compatibility
-	'mediawiki.action.watch.ajax' => array(
-		'dependencies' => 'mediawiki.page.watch.ajax'
-	),
-
-	/* MediaWiki Language */
-
-	'mediawiki.language' => array(
-		'scripts' => 'resources/mediawiki.language/mediawiki.language.js',
-		'languageScripts' => array(
-			'bs' => 'resources/mediawiki.language/languages/bs.js',
-			'dsb' => 'resources/mediawiki.language/languages/dsb.js',
-			'fi' => 'resources/mediawiki.language/languages/fi.js',
-			'ga' => 'resources/mediawiki.language/languages/ga.js',
-			'he' => 'resources/mediawiki.language/languages/he.js',
-			'hsb' => 'resources/mediawiki.language/languages/hsb.js',
-			'hu' => 'resources/mediawiki.language/languages/hu.js',
-			'hy' => 'resources/mediawiki.language/languages/hy.js',
-			'la' => 'resources/mediawiki.language/languages/la.js',
-			'os' => 'resources/mediawiki.language/languages/os.js',
-			'ru' => 'resources/mediawiki.language/languages/ru.js',
-			'sl' => 'resources/mediawiki.language/languages/sl.js',
-			'uk' => 'resources/mediawiki.language/languages/uk.js',
-		),
-		'dependencies' => array(
-				'mediawiki.language.data',
-				'mediawiki.cldr'
-			),
-	),
-
-	'mediawiki.cldr' => array(
-		'scripts' => 'resources/mediawiki.language/mediawiki.cldr.js',
-		'dependencies' => array(
-			'mediawiki.libs.pluralruleparser',
-		),
-	),
-
-	'mediawiki.libs.pluralruleparser' => array(
-		'scripts' => 'resources/mediawiki.libs/CLDRPluralRuleParser.js',
-	),
-
-	'mediawiki.language.init' => array(
-		'scripts' => 'resources/mediawiki.language/mediawiki.language.init.js',
-	),
-
-	'mediawiki.jqueryMsg' => array(
-		'scripts' => 'resources/mediawiki/mediawiki.jqueryMsg.js',
-		'dependencies' => array(
-			'mediawiki.util',
-			'mediawiki.language',
-		),
-	),
-
-	/* MediaWiki Libs */
-
-	'mediawiki.libs.jpegmeta' => array(
-		'scripts' => 'resources/mediawiki.libs/mediawiki.libs.jpegmeta.js',
-	),
-
-	/* MediaWiki Page */
-
-	'mediawiki.page.ready' => array(
-		'scripts' => 'resources/mediawiki.page/mediawiki.page.ready.js',
-		'dependencies' => array(
-			'jquery.checkboxShiftClick',
-			'jquery.makeCollapsible',
-			'jquery.placeholder',
-			'jquery.mw-jump',
-			'mediawiki.util',
-		),
-	),
-	'mediawiki.page.startup' => array(
-		'scripts' => 'resources/mediawiki.page/mediawiki.page.startup.js',
-		'dependencies' => array(
-			'jquery.client',
-			'mediawiki.util',
-		),
-		'position' => 'top',
-	),
-	'mediawiki.page.watch.ajax' => array(
-		'scripts' => 'resources/mediawiki.page/mediawiki.page.watch.ajax.js',
-		'dependencies' => array(
-			'mediawiki.page.startup',
-			'mediawiki.api.watch',
-			'mediawiki.util',
-			'mediawiki.notify',
-			'jquery.mwExtension',
-		),
-		'messages' => array(
-			'watch',
-			'unwatch',
-			'watching',
-			'unwatching',
-			'tooltip-ca-watch',
-			'tooltip-ca-unwatch',
-			'watcherrortext',
-		),
-	),
-
-	/* MediaWiki Special pages */
-
-	'mediawiki.special' => array(
-		'scripts' => 'resources/mediawiki.special/mediawiki.special.js',
-		'styles' => 'resources/mediawiki.special/mediawiki.special.css',
-	),
-	'mediawiki.special.block' => array(
-		'scripts' => 'resources/mediawiki.special/mediawiki.special.block.js',
-		'dependencies' => array(
-			'mediawiki.util',
-		),
-	),
-	'mediawiki.special.changeemail' => array(
-		'scripts' => 'resources/mediawiki.special/mediawiki.special.changeemail.js',
-		'styles' => 'resources/mediawiki.special/mediawiki.special.changeemail.css',
-		'dependencies' => array(
-			'mediawiki.util',
-		),
-		'messages' => array(
-			'email-address-validity-valid',
-			'email-address-validity-invalid',
-		),
-	),
-	'mediawiki.special.changeslist' => array(
-		'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.css',
-		'dependencies' => array( 'jquery.makeCollapsible' ),
-	),
-	'mediawiki.special.movePage' => array(
-		'scripts' => 'resources/mediawiki.special/mediawiki.special.movePage.js',
-		'dependencies' => 'jquery.byteLimit',
-	),
-	'mediawiki.special.preferences' => array(
-		'scripts' => 'resources/mediawiki.special/mediawiki.special.preferences.js',
-		'styles'  => 'resources/mediawiki.special/mediawiki.special.preferences.css',
-	),
-	'mediawiki.special.recentchanges' => array(
-		'scripts' => 'resources/mediawiki.special/mediawiki.special.recentchanges.js',
-		'dependencies' => array( 'mediawiki.special' ),
-		'position' => 'top',
-	),
-	'mediawiki.special.search' => array(
-		'scripts' => 'resources/mediawiki.special/mediawiki.special.search.js',
-		'styles' => 'resources/mediawiki.special/mediawiki.special.search.css',
-		'messages' => array(
-			'powersearch-togglelabel',
-			'powersearch-toggleall',
-			'powersearch-togglenone',
-		),
-	),
-	'mediawiki.special.undelete' => array(
-		'scripts' => 'resources/mediawiki.special/mediawiki.special.undelete.js',
-	),
-	'mediawiki.special.upload' => array(
-		// @TODO: merge in remainder of mediawiki.legacy.upload
-		'scripts' => 'resources/mediawiki.special/mediawiki.special.upload.js',
-		'messages' => array(
-			'widthheight',
-			'size-bytes',
-			'size-kilobytes',
-			'size-megabytes',
-			'size-gigabytes',
-			'largefileserver',
-		),
-		'dependencies' => array( 'mediawiki.libs.jpegmeta', 'mediawiki.util' ),
-	),
-	'mediawiki.special.javaScriptTest' => array(
-		'scripts' => 'resources/mediawiki.special/mediawiki.special.javaScriptTest.js',
-		'messages' => array_merge( Skin::getSkinNameMessages(), array(
-			'colon-separator',
-			'javascripttest-pagetext-skins',
-		) ),
-		'dependencies' => array( 'jquery.qunit' ),
-		'position' => 'top',
-	),
-
-	/* MediaWiki Tests */
-
-	'mediawiki.tests.qunit.testrunner' => array(
-		'scripts' => 'tests/qunit/data/testrunner.js',
-		'dependencies' => array(
-			'jquery.qunit',
-			'jquery.qunit.completenessTest',
-			'mediawiki.page.startup',
-			'mediawiki.page.ready',
-		),
-		'position' => 'top',
-	),
-
-	/* MediaWiki Legacy */
-
-	'mediawiki.legacy.ajax' => array(
-		'scripts' => 'common/ajax.js',
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-		'dependencies' => array(
-			'mediawiki.util',
-			'mediawiki.legacy.wikibits',
-		),
-		'position' => 'top', // Temporary hack for legacy support
-	),
-	'mediawiki.legacy.commonPrint' => array(
-		'styles' => array( 'common/commonPrint.css' => array( 'media' => 'print' ) ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-	'mediawiki.legacy.config' => array(
-		'scripts' => 'common/config.js',
-		'styles' => array( 'common/config.css', 'common/config-cc.css' ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-		'dependencies' => 'mediawiki.legacy.wikibits',
-	),
-	'mediawiki.legacy.IEFixes' => array(
-		'scripts' => 'common/IEFixes.js',
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-		'dependencies' => 'mediawiki.legacy.wikibits',
-	),
-	'mediawiki.legacy.protect' => array(
-		'scripts' => 'common/protect.js',
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-		'dependencies' => array(
-			'mediawiki.legacy.wikibits',
-			'jquery.byteLimit',
-		),
-		'position' => 'top',
-	),
-	'mediawiki.legacy.shared' => array(
-		'styles' => array( 'common/shared.css' => array( 'media' => 'screen' ) ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-	'mediawiki.legacy.oldshared' => array(
-		'styles' => array( 'common/oldshared.css' => array( 'media' => 'screen' ) ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-	'mediawiki.legacy.upload' => array(
-		'scripts' => 'common/upload.js',
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-		'dependencies' => array(
-			'mediawiki.legacy.wikibits',
-			'mediawiki.util',
-		),
-	),
-	'mediawiki.legacy.wikibits' => array(
-		'scripts' => 'common/wikibits.js',
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-		'dependencies' => array(
-			'mediawiki.util',
-		),
-		'position' => 'top',
-	),
-	'mediawiki.legacy.wikiprintable' => array(
-		'styles' => array( 'common/wikiprintable.css' => array( 'media' => 'print' ) ),
-		'remoteBasePath' => $GLOBALS['wgStylePath'],
-		'localBasePath' => $GLOBALS['wgStyleDirectory'],
-	),
-);
diff --git a/resources/jquery.chosen/LICENSE b/resources/jquery.chosen/LICENSE
new file mode 100644
index 00000000..0675dc52
--- /dev/null
+++ b/resources/jquery.chosen/LICENSE
@@ -0,0 +1,24 @@
+# Chosen, a Select Box Enhancer for jQuery and Protoype
+## by Patrick Filler for [Harvest](http://getharvest.com)
+
+Available for use under the [MIT License](http://en.wikipedia.org/wiki/MIT_License)
+
+Copyright (c) 2011-2013 by Harvest
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/resources/jquery.chosen/chosen-sprite.png b/resources/jquery.chosen/chosen-sprite.png
new file mode 100644
index 00000000..3611ae4a
Binary files /dev/null and b/resources/jquery.chosen/chosen-sprite.png differ
diff --git a/resources/jquery.chosen/chosen-sprite@2x.png b/resources/jquery.chosen/chosen-sprite@2x.png
new file mode 100644
index 00000000..bd61d963
Binary files /dev/null and b/resources/jquery.chosen/chosen-sprite@2x.png differ
diff --git a/resources/jquery.chosen/chosen.css b/resources/jquery.chosen/chosen.css
new file mode 100644
index 00000000..17793ed7
--- /dev/null
+++ b/resources/jquery.chosen/chosen.css
@@ -0,0 +1,440 @@
+/* @group Base */
+.chzn-container {
+  font-size: 13px;
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  zoom: 1;
+  *display: inline;
+}
+.chzn-container .chzn-drop {
+  background: #fff;
+  border: 1px solid #aaa;
+  border-top: 0;
+  position: absolute;
+  top: 100%;
+  left: -9999px;
+  -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15);
+  -moz-box-shadow   : 0 4px 5px rgba(0,0,0,.15);
+  box-shadow        : 0 4px 5px rgba(0,0,0,.15);
+  z-index: 1010;
+  width: 100%;
+  -moz-box-sizing   : border-box;
+  -ms-box-sizing    : border-box;
+  -webkit-box-sizing: border-box;
+  -khtml-box-sizing : border-box;
+  box-sizing        : border-box;
+}
+
+.chzn-container.chzn-with-drop .chzn-drop {
+  left: 0;
+}
+
+/* @end */
+
+/* @group Single Chosen */
+.chzn-container-single .chzn-single {
+  background-color: #ffffff;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 );   
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
+  background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: linear-gradient(#ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); 
+  -webkit-border-radius: 5px;
+  -moz-border-radius   : 5px;
+  border-radius        : 5px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+  border: 1px solid #aaaaaa;
+  -webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  -moz-box-shadow   : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  box-shadow        : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  position: relative;
+  height: 23px;
+  line-height: 24px;
+  padding: 0 0 0 8px;
+  color: #444444;
+  text-decoration: none;
+}
+.chzn-container-single .chzn-default {
+  color: #999;
+}
+.chzn-container-single .chzn-single span {
+  margin-right: 26px;
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  -o-text-overflow: ellipsis;
+  -ms-text-overflow: ellipsis;
+  text-overflow: ellipsis;
+}
+.chzn-container-single .chzn-single abbr {
+  display: block;
+  position: absolute;
+  right: 26px;
+  top: 6px;
+  width: 12px;
+  height: 12px;
+  font-size: 1px;
+  background: url('chosen-sprite.png') -42px 1px no-repeat;
+}
+.chzn-container-single .chzn-single abbr:hover {
+  background-position: -42px -10px;
+}
+.chzn-container-single.chzn-disabled .chzn-single abbr:hover {
+  background-position: -42px -10px;
+}
+.chzn-container-single .chzn-single div {
+  position: absolute;
+  right: 0;
+  top: 0;
+  display: block;
+  height: 100%;
+  width: 18px;
+}
+.chzn-container-single .chzn-single div b {
+  background: url('chosen-sprite.png') no-repeat 0px 2px;
+  display: block;
+  width: 100%;
+  height: 100%;
+}
+.chzn-container-single .chzn-search {
+  padding: 3px 4px;
+  position: relative;
+  margin: 0;
+  white-space: nowrap;
+  z-index: 1010;
+}
+.chzn-container-single .chzn-search input {
+  background: #fff url('chosen-sprite.png') no-repeat 100% -20px;
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+  margin: 1px 0;
+  padding: 4px 20px 4px 5px;
+  outline: 0;
+  border: 1px solid #aaa;
+  font-family: sans-serif;
+  font-size: 1em;
+  width: 100%;
+  -moz-box-sizing   : border-box;
+  -ms-box-sizing    : border-box;
+  -webkit-box-sizing: border-box;
+  -khtml-box-sizing : border-box;
+  box-sizing        : border-box;
+}
+.chzn-container-single .chzn-drop {
+  margin-top: -1px;
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius   : 0 0 4px 4px;
+  border-radius        : 0 0 4px 4px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+}
+.chzn-container-single-nosearch .chzn-search {
+  position: absolute;
+  left: -9999px;
+}
+/* @end */
+
+/* @group Multi Chosen */
+.chzn-container-multi .chzn-choices {
+  background-color: #fff;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
+  border: 1px solid #aaa;
+  margin: 0;
+  padding: 0;
+  cursor: text;
+  overflow: hidden;
+  height: auto !important;
+  height: 1%;
+  position: relative;
+  width: 100%;
+  -moz-box-sizing   : border-box;
+  -ms-box-sizing    : border-box;
+  -webkit-box-sizing: border-box;
+  -khtml-box-sizing : border-box;
+  box-sizing        : border-box;
+}
+.chzn-container-multi .chzn-choices li {
+  float: left;
+  list-style: none;
+}
+.chzn-container-multi .chzn-choices .search-field {
+  white-space: nowrap;
+  margin: 0;
+  padding: 0;
+}
+.chzn-container-multi .chzn-choices .search-field input {
+  color: #666;
+  background: transparent !important;
+  border: 0 !important;
+  font-family: sans-serif;
+  font-size: 100%;
+  height: 15px;
+  padding: 5px;
+  margin: 1px 0;
+  outline: 0;
+  -webkit-box-shadow: none;
+  -moz-box-shadow   : none;
+  box-shadow        : none;
+}
+.chzn-container-multi .chzn-choices .search-field .default {
+  color: #999;
+}
+.chzn-container-multi .chzn-choices .search-choice {
+  -webkit-border-radius: 3px;
+  -moz-border-radius   : 3px;
+  border-radius        : 3px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+  background-color: #e4e4e4;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 ); 
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 
+  -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  -moz-box-shadow   : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  box-shadow        : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  color: #333;
+  border: 1px solid #aaaaaa;
+  line-height: 13px;
+  padding: 3px 20px 3px 5px;
+  margin: 3px 0 3px 5px;
+  position: relative;
+  cursor: default;
+}
+.chzn-container-multi .chzn-choices .search-choice.search-choice-disabled {
+  background-color: #e4e4e4;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
+  background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  color: #666;
+  border: 1px solid #cccccc;
+  padding-right: 5px;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus {
+  background: #d4d4d4;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
+  display: block;
+  position: absolute;
+  right: 3px;
+  top: 4px;
+  width: 12px;
+  height: 12px;
+  font-size: 1px;
+  background: url('chosen-sprite.png') -42px 1px no-repeat;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
+  background-position: -42px -10px;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
+  background-position: -42px -10px;
+}
+/* @end */
+
+/* @group Results */
+.chzn-container .chzn-results {
+  margin: 0 4px 4px 0;
+  max-height: 240px;
+  padding: 0 0 0 4px;
+  position: relative;
+  overflow-x: hidden;
+  overflow-y: auto;
+  -webkit-overflow-scrolling: touch;
+}
+.chzn-container-multi .chzn-results {
+  margin: 0;
+  padding: 0;
+}
+.chzn-container .chzn-results li {
+  display: none;
+  line-height: 15px;
+  padding: 5px 6px;
+  margin: 0;
+  list-style: none;
+}
+.chzn-container .chzn-results .active-result {
+  cursor: pointer;
+  display: list-item;
+}
+.chzn-container .chzn-results .highlighted {
+  background-color: #3875d7;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 );  
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
+  background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
+  color: #fff;
+}
+.chzn-container .chzn-results li em {
+  background: #feffde;
+  font-style: normal;
+}
+.chzn-container .chzn-results .highlighted em {
+  background: transparent;
+}
+.chzn-container .chzn-results .no-results {
+  background: #f4f4f4;
+  display: list-item;
+}
+.chzn-container .chzn-results .group-result {
+  cursor: default;
+  color: #999;
+  font-weight: bold;
+}
+.chzn-container .chzn-results .group-option {
+  padding-left: 15px;
+}
+.chzn-container-multi .chzn-drop .result-selected {
+  display: none;
+}
+.chzn-container .chzn-results-scroll {
+  background: white;
+  margin: 0 4px;
+  position: absolute;
+  text-align: center;
+  width: 321px; /* This should by dynamic with js */
+  z-index: 1;
+}
+.chzn-container .chzn-results-scroll span {
+  display: inline-block;
+  height: 17px;
+  text-indent: -5000px;
+  width: 9px;
+}
+.chzn-container .chzn-results-scroll-down {
+  bottom: 0;
+}
+.chzn-container .chzn-results-scroll-down span {
+  background: url('chosen-sprite.png') no-repeat -4px -3px;
+}
+.chzn-container .chzn-results-scroll-up span {
+  background: url('chosen-sprite.png') no-repeat -22px -3px;
+}
+/* @end */
+
+/* @group Active  */
+.chzn-container-active .chzn-single {
+  -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
+  -moz-box-shadow   : 0 0 5px rgba(0,0,0,.3);
+  box-shadow        : 0 0 5px rgba(0,0,0,.3);
+  border: 1px solid #5897fb;
+}
+.chzn-container-active.chzn-with-drop .chzn-single {
+  border: 1px solid #aaa;
+  -webkit-box-shadow: 0 1px 0 #fff inset;
+  -moz-box-shadow   : 0 1px 0 #fff inset;
+  box-shadow        : 0 1px 0 #fff inset;
+  background-color: #eee;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 );
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
+  -webkit-border-bottom-left-radius : 0;
+  -webkit-border-bottom-right-radius: 0;
+  -moz-border-radius-bottomleft : 0;
+  -moz-border-radius-bottomright: 0;
+  border-bottom-left-radius : 0;
+  border-bottom-right-radius: 0;
+}
+.chzn-container-active.chzn-with-drop .chzn-single div {
+  background: transparent;
+  border-left: none;
+}
+.chzn-container-active.chzn-with-drop .chzn-single div b {
+  background-position: -18px 2px;
+}
+.chzn-container-active .chzn-choices {
+  -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
+  -moz-box-shadow   : 0 0 5px rgba(0,0,0,.3);
+  box-shadow        : 0 0 5px rgba(0,0,0,.3);
+  border: 1px solid #5897fb;
+}
+.chzn-container-active .chzn-choices .search-field input {
+  color: #111 !important;
+}
+/* @end */
+
+/* @group Disabled Support */
+.chzn-disabled {
+  cursor: default;
+  opacity:0.5 !important;
+}
+.chzn-disabled .chzn-single {
+  cursor: default;
+}
+.chzn-disabled .chzn-choices .search-choice .search-choice-close {
+  cursor: default;
+}
+
+/* @group Right to Left */
+.chzn-rtl { text-align: right; }
+.chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; }
+.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; }
+
+.chzn-rtl .chzn-single div { left: 3px; right: auto; }
+.chzn-rtl .chzn-single abbr {
+  left: 26px;
+  right: auto;
+}
+.chzn-rtl .chzn-choices .search-field input { direction: rtl; }
+.chzn-rtl .chzn-choices li { float: right; }
+.chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; }
+.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; }
+.chzn-rtl .chzn-search { left: 9999px; }
+.chzn-rtl.chzn-with-drop .chzn-search { left: 0px; }
+.chzn-rtl .chzn-drop { left: 9999px; }
+.chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; }
+.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; }
+.chzn-rtl.chzn-container-active.chzn-with-drop .chzn-single div { border-right: none; }
+.chzn-rtl .chzn-search input {
+  background: #fff url('chosen-sprite.png') no-repeat -30px -20px;
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);  
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+  padding: 4px 5px 4px 20px;
+  direction: rtl;
+}
+.chzn-container-single.chzn-rtl .chzn-single div b {
+  background-position: 6px 2px;
+}
+.chzn-container-single.chzn-rtl.chzn-with-drop .chzn-single div b {
+  background-position: -12px 2px;
+}
+/* @end */
+
+/* @group Retina compatibility */
+@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi)  {
+  .chzn-rtl .chzn-search input, .chzn-container-single .chzn-single abbr, .chzn-container-single .chzn-single div b, .chzn-container-single .chzn-search input, .chzn-container-multi .chzn-choices .search-choice .search-choice-close, .chzn-container .chzn-results-scroll-down span, .chzn-container .chzn-results-scroll-up span {
+      background-image: url('chosen-sprite@2x.png') !important;
+      background-repeat: no-repeat !important;
+      background-size: 52px 37px !important;
+  }
+}
+/* @end */
diff --git a/resources/jquery.chosen/chosen.jquery.js b/resources/jquery.chosen/chosen.jquery.js
new file mode 100644
index 00000000..745174f7
--- /dev/null
+++ b/resources/jquery.chosen/chosen.jquery.js
@@ -0,0 +1,1103 @@
+// Chosen, a Select Box Enhancer for jQuery and Protoype
+// by Patrick Filler for Harvest, http://getharvest.com
+//
+// Version 0.9.14
+// Full source at https://github.com/harvesthq/chosen
+// Copyright (c) 2011 Harvest http://getharvest.com
+
+// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
+// This file is generated by `cake build`, do not edit it by hand.
+(function() {
+  var SelectParser;
+
+  SelectParser = (function() {
+
+    function SelectParser() {
+      this.options_index = 0;
+      this.parsed = [];
+    }
+
+    SelectParser.prototype.add_node = function(child) {
+      if (child.nodeName.toUpperCase() === "OPTGROUP") {
+        return this.add_group(child);
+      } else {
+        return this.add_option(child);
+      }
+    };
+
+    SelectParser.prototype.add_group = function(group) {
+      var group_position, option, _i, _len, _ref, _results;
+      group_position = this.parsed.length;
+      this.parsed.push({
+        array_index: group_position,
+        group: true,
+        label: group.label,
+        children: 0,
+        disabled: group.disabled
+      });
+      _ref = group.childNodes;
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        option = _ref[_i];
+        _results.push(this.add_option(option, group_position, group.disabled));
+      }
+      return _results;
+    };
+
+    SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
+      if (option.nodeName.toUpperCase() === "OPTION") {
+        if (option.text !== "") {
+          if (group_position != null) {
+            this.parsed[group_position].children += 1;
+          }
+          this.parsed.push({
+            array_index: this.parsed.length,
+            options_index: this.options_index,
+            value: option.value,
+            text: option.text,
+            html: option.innerHTML,
+            selected: option.selected,
+            disabled: group_disabled === true ? group_disabled : option.disabled,
+            group_array_index: group_position,
+            classes: option.className,
+            style: option.style.cssText
+          });
+        } else {
+          this.parsed.push({
+            array_index: this.parsed.length,
+            options_index: this.options_index,
+            empty: true
+          });
+        }
+        return this.options_index += 1;
+      }
+    };
+
+    return SelectParser;
+
+  })();
+
+  SelectParser.select_to_array = function(select) {
+    var child, parser, _i, _len, _ref;
+    parser = new SelectParser();
+    _ref = select.childNodes;
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      child = _ref[_i];
+      parser.add_node(child);
+    }
+    return parser.parsed;
+  };
+
+  this.SelectParser = SelectParser;
+
+}).call(this);
+
+/*
+Chosen source: generate output using 'cake build'
+Copyright (c) 2011 by Harvest
+*/
+
+
+(function() {
+  var AbstractChosen, root;
+
+  root = this;
+
+  AbstractChosen = (function() {
+
+    function AbstractChosen(form_field, options) {
+      this.form_field = form_field;
+      this.options = options != null ? options : {};
+      if (!AbstractChosen.browser_is_supported()) {
+        return;
+      }
+      this.is_multiple = this.form_field.multiple;
+      this.set_default_text();
+      this.set_default_values();
+      this.setup();
+      this.set_up_html();
+      this.register_observers();
+      this.finish_setup();
+    }
+
+    AbstractChosen.prototype.set_default_values = function() {
+      var _this = this;
+      this.click_test_action = function(evt) {
+        return _this.test_active_click(evt);
+      };
+      this.activate_action = function(evt) {
+        return _this.activate_field(evt);
+      };
+      this.active_field = false;
+      this.mouse_on_container = false;
+      this.results_showing = false;
+      this.result_highlighted = null;
+      this.result_single_selected = null;
+      this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
+      this.disable_search_threshold = this.options.disable_search_threshold || 0;
+      this.disable_search = this.options.disable_search || false;
+      this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
+      this.search_contains = this.options.search_contains || false;
+      this.choices = 0;
+      this.single_backstroke_delete = this.options.single_backstroke_delete || false;
+      this.max_selected_options = this.options.max_selected_options || Infinity;
+      return this.inherit_select_classes = this.options.inherit_select_classes || false;
+    };
+
+    AbstractChosen.prototype.set_default_text = function() {
+      if (this.form_field.getAttribute("data-placeholder")) {
+        this.default_text = this.form_field.getAttribute("data-placeholder");
+      } else if (this.is_multiple) {
+        this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
+      } else {
+        this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
+      }
+      return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
+    };
+
+    AbstractChosen.prototype.mouse_enter = function() {
+      return this.mouse_on_container = true;
+    };
+
+    AbstractChosen.prototype.mouse_leave = function() {
+      return this.mouse_on_container = false;
+    };
+
+    AbstractChosen.prototype.input_focus = function(evt) {
+      var _this = this;
+      if (this.is_multiple) {
+        if (!this.active_field) {
+          return setTimeout((function() {
+            return _this.container_mousedown();
+          }), 50);
+        }
+      } else {
+        if (!this.active_field) {
+          return this.activate_field();
+        }
+      }
+    };
+
+    AbstractChosen.prototype.input_blur = function(evt) {
+      var _this = this;
+      if (!this.mouse_on_container) {
+        this.active_field = false;
+        return setTimeout((function() {
+          return _this.blur_test();
+        }), 100);
+      }
+    };
+
+    AbstractChosen.prototype.result_add_option = function(option) {
+      var classes, style;
+      if (!option.disabled) {
+        option.dom_id = this.container_id + "_o_" + option.array_index;
+        classes = option.selected && this.is_multiple ? [] : ["active-result"];
+        if (option.selected) {
+          classes.push("result-selected");
+        }
+        if (option.group_array_index != null) {
+          classes.push("group-option");
+        }
+        if (option.classes !== "") {
+          classes.push(option.classes);
+        }
+        style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
+        return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
+      } else {
+        return "";
+      }
+    };
+
+    AbstractChosen.prototype.results_update_field = function() {
+      this.set_default_text();
+      if (!this.is_multiple) {
+        this.results_reset_cleanup();
+      }
+      this.result_clear_highlight();
+      this.result_single_selected = null;
+      return this.results_build();
+    };
+
+    AbstractChosen.prototype.results_toggle = function() {
+      if (this.results_showing) {
+        return this.results_hide();
+      } else {
+        return this.results_show();
+      }
+    };
+
+    AbstractChosen.prototype.results_search = function(evt) {
+      if (this.results_showing) {
+        return this.winnow_results();
+      } else {
+        return this.results_show();
+      }
+    };
+
+    AbstractChosen.prototype.choices_click = function(evt) {
+      evt.preventDefault();
+      if (!this.results_showing) {
+        return this.results_show();
+      }
+    };
+
+    AbstractChosen.prototype.keyup_checker = function(evt) {
+      var stroke, _ref;
+      stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+      this.search_field_scale();
+      switch (stroke) {
+        case 8:
+          if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
+            return this.keydown_backstroke();
+          } else if (!this.pending_backstroke) {
+            this.result_clear_highlight();
+            return this.results_search();
+          }
+          break;
+        case 13:
+          evt.preventDefault();
+          if (this.results_showing) {
+            return this.result_select(evt);
+          }
+          break;
+        case 27:
+          if (this.results_showing) {
+            this.results_hide();
+          }
+          return true;
+        case 9:
+        case 38:
+        case 40:
+        case 16:
+        case 91:
+        case 17:
+          break;
+        default:
+          return this.results_search();
+      }
+    };
+
+    AbstractChosen.prototype.generate_field_id = function() {
+      var new_id;
+      new_id = this.generate_random_id();
+      this.form_field.id = new_id;
+      return new_id;
+    };
+
+    AbstractChosen.prototype.generate_random_char = function() {
+      var chars, newchar, rand;
+      chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+      rand = Math.floor(Math.random() * chars.length);
+      return newchar = chars.substring(rand, rand + 1);
+    };
+
+    AbstractChosen.prototype.container_width = function() {
+      var width;
+      if (this.options.width != null) {
+        return this.options.width;
+      }
+      width = window.getComputedStyle != null ? parseFloat(window.getComputedStyle(this.form_field).getPropertyValue('width')) : (typeof jQuery !== "undefined" && jQuery !== null) && (this.form_field_jq != null) ? this.form_field_jq.outerWidth() : this.form_field.getWidth();
+      return width + "px";
+    };
+
+    AbstractChosen.browser_is_supported = function() {
+      var _ref;
+      if (window.navigator.appName === "Microsoft Internet Explorer") {
+        return (null !== (_ref = document.documentMode) && _ref >= 8);
+      }
+      return true;
+    };
+
+    AbstractChosen.default_multiple_text = "Select Some Options";
+
+    AbstractChosen.default_single_text = "Select an Option";
+
+    AbstractChosen.default_no_result_text = "No results match";
+
+    return AbstractChosen;
+
+  })();
+
+  root.AbstractChosen = AbstractChosen;
+
+}).call(this);
+
+/*
+Chosen source: generate output using 'cake build'
+Copyright (c) 2011 by Harvest
+*/
+
+
+(function() {
+  var $, Chosen, root,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+  root = this;
+
+  $ = jQuery;
+
+  $.fn.extend({
+    chosen: function(options) {
+      if (!AbstractChosen.browser_is_supported()) {
+        return this;
+      }
+      return this.each(function(input_field) {
+        var $this;
+        $this = $(this);
+        if (!$this.hasClass("chzn-done")) {
+          return $this.data('chosen', new Chosen(this, options));
+        }
+      });
+    }
+  });
+
+  Chosen = (function(_super) {
+
+    __extends(Chosen, _super);
+
+    function Chosen() {
+      return Chosen.__super__.constructor.apply(this, arguments);
+    }
+
+    Chosen.prototype.setup = function() {
+      this.form_field_jq = $(this.form_field);
+      this.current_selectedIndex = this.form_field.selectedIndex;
+      return this.is_rtl = this.form_field_jq.hasClass("chzn-rtl");
+    };
+
+    Chosen.prototype.finish_setup = function() {
+      return this.form_field_jq.addClass("chzn-done");
+    };
+
+    Chosen.prototype.set_up_html = function() {
+      var container_classes, container_props;
+      this.container_id = this.form_field.id.length ? this.form_field.id.replace(/[^\w]/g, '_') : this.generate_field_id();
+      this.container_id += "_chzn";
+      container_classes = ["chzn-container"];
+      container_classes.push("chzn-container-" + (this.is_multiple ? "multi" : "single"));
+      if (this.inherit_select_classes && this.form_field.className) {
+        container_classes.push(this.form_field.className);
+      }
+      if (this.is_rtl) {
+        container_classes.push("chzn-rtl");
+      }
+      container_props = {
+        'id': this.container_id,
+        'class': container_classes.join(' '),
+        'style': "width: " + (this.container_width()) + ";",
+        'title': this.form_field.title
+      };
+      this.container = $("<div />", container_props);
+      if (this.is_multiple) {
+        this.container.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:auto;" /></li></ul><div class="chzn-drop"><ul class="chzn-results"></ul></div>');
+      } else {
+        this.container.html('<a href="javascript:void(0)" class="chzn-single chzn-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chzn-drop"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>');
+      }
+      this.form_field_jq.hide().after(this.container);
+      this.dropdown = this.container.find('div.chzn-drop').first();
+      this.search_field = this.container.find('input').first();
+      this.search_results = this.container.find('ul.chzn-results').first();
+      this.search_field_scale();
+      this.search_no_results = this.container.find('li.no-results').first();
+      if (this.is_multiple) {
+        this.search_choices = this.container.find('ul.chzn-choices').first();
+        this.search_container = this.container.find('li.search-field').first();
+      } else {
+        this.search_container = this.container.find('div.chzn-search').first();
+        this.selected_item = this.container.find('.chzn-single').first();
+      }
+      this.results_build();
+      this.set_tab_index();
+      this.set_label_behavior();
+      return this.form_field_jq.trigger("liszt:ready", {
+        chosen: this
+      });
+    };
+
+    Chosen.prototype.register_observers = function() {
+      var _this = this;
+      this.container.mousedown(function(evt) {
+        _this.container_mousedown(evt);
+      });
+      this.container.mouseup(function(evt) {
+        _this.container_mouseup(evt);
+      });
+      this.container.mouseenter(function(evt) {
+        _this.mouse_enter(evt);
+      });
+      this.container.mouseleave(function(evt) {
+        _this.mouse_leave(evt);
+      });
+      this.search_results.mouseup(function(evt) {
+        _this.search_results_mouseup(evt);
+      });
+      this.search_results.mouseover(function(evt) {
+        _this.search_results_mouseover(evt);
+      });
+      this.search_results.mouseout(function(evt) {
+        _this.search_results_mouseout(evt);
+      });
+      this.search_results.bind('mousewheel DOMMouseScroll', function(evt) {
+        _this.search_results_mousewheel(evt);
+      });
+      this.form_field_jq.bind("liszt:updated", function(evt) {
+        _this.results_update_field(evt);
+      });
+      this.form_field_jq.bind("liszt:activate", function(evt) {
+        _this.activate_field(evt);
+      });
+      this.form_field_jq.bind("liszt:open", function(evt) {
+        _this.container_mousedown(evt);
+      });
+      this.search_field.blur(function(evt) {
+        _this.input_blur(evt);
+      });
+      this.search_field.keyup(function(evt) {
+        _this.keyup_checker(evt);
+      });
+      this.search_field.keydown(function(evt) {
+        _this.keydown_checker(evt);
+      });
+      this.search_field.focus(function(evt) {
+        _this.input_focus(evt);
+      });
+      if (this.is_multiple) {
+        return this.search_choices.click(function(evt) {
+          _this.choices_click(evt);
+        });
+      } else {
+        return this.container.click(function(evt) {
+          evt.preventDefault();
+        });
+      }
+    };
+
+    Chosen.prototype.search_field_disabled = function() {
+      this.is_disabled = this.form_field_jq[0].disabled;
+      if (this.is_disabled) {
+        this.container.addClass('chzn-disabled');
+        this.search_field[0].disabled = true;
+        if (!this.is_multiple) {
+          this.selected_item.unbind("focus", this.activate_action);
+        }
+        return this.close_field();
+      } else {
+        this.container.removeClass('chzn-disabled');
+        this.search_field[0].disabled = false;
+        if (!this.is_multiple) {
+          return this.selected_item.bind("focus", this.activate_action);
+        }
+      }
+    };
+
+    Chosen.prototype.container_mousedown = function(evt) {
+      if (!this.is_disabled) {
+        if (evt && evt.type === "mousedown" && !this.results_showing) {
+          evt.preventDefault();
+        }
+        if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
+          if (!this.active_field) {
+            if (this.is_multiple) {
+              this.search_field.val("");
+            }
+            $(document).click(this.click_test_action);
+            this.results_show();
+          } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chzn-single").length)) {
+            evt.preventDefault();
+            this.results_toggle();
+          }
+          return this.activate_field();
+        }
+      }
+    };
+
+    Chosen.prototype.container_mouseup = function(evt) {
+      if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
+        return this.results_reset(evt);
+      }
+    };
+
+    Chosen.prototype.search_results_mousewheel = function(evt) {
+      var delta, _ref, _ref1;
+      delta = -((_ref = evt.originalEvent) != null ? _ref.wheelDelta : void 0) || ((_ref1 = evt.originialEvent) != null ? _ref1.detail : void 0);
+      if (delta != null) {
+        evt.preventDefault();
+        if (evt.type === 'DOMMouseScroll') {
+          delta = delta * 40;
+        }
+        return this.search_results.scrollTop(delta + this.search_results.scrollTop());
+      }
+    };
+
+    Chosen.prototype.blur_test = function(evt) {
+      if (!this.active_field && this.container.hasClass("chzn-container-active")) {
+        return this.close_field();
+      }
+    };
+
+    Chosen.prototype.close_field = function() {
+      $(document).unbind("click", this.click_test_action);
+      this.active_field = false;
+      this.results_hide();
+      this.container.removeClass("chzn-container-active");
+      this.winnow_results_clear();
+      this.clear_backstroke();
+      this.show_search_field_default();
+      return this.search_field_scale();
+    };
+
+    Chosen.prototype.activate_field = function() {
+      this.container.addClass("chzn-container-active");
+      this.active_field = true;
+      this.search_field.val(this.search_field.val());
+      return this.search_field.focus();
+    };
+
+    Chosen.prototype.test_active_click = function(evt) {
+      if ($(evt.target).parents('#' + this.container_id).length) {
+        return this.active_field = true;
+      } else {
+        return this.close_field();
+      }
+    };
+
+    Chosen.prototype.results_build = function() {
+      var content, data, _i, _len, _ref;
+      this.parsing = true;
+      this.results_data = root.SelectParser.select_to_array(this.form_field);
+      if (this.is_multiple && this.choices > 0) {
+        this.search_choices.find("li.search-choice").remove();
+        this.choices = 0;
+      } else if (!this.is_multiple) {
+        this.selected_item.addClass("chzn-default").find("span").text(this.default_text);
+        if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
+          this.container.addClass("chzn-container-single-nosearch");
+        } else {
+          this.container.removeClass("chzn-container-single-nosearch");
+        }
+      }
+      content = '';
+      _ref = this.results_data;
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        data = _ref[_i];
+        if (data.group) {
+          content += this.result_add_group(data);
+        } else if (!data.empty) {
+          content += this.result_add_option(data);
+          if (data.selected && this.is_multiple) {
+            this.choice_build(data);
+          } else if (data.selected && !this.is_multiple) {
+            this.selected_item.removeClass("chzn-default").find("span").text(data.text);
+            if (this.allow_single_deselect) {
+              this.single_deselect_control_build();
+            }
+          }
+        }
+      }
+      this.search_field_disabled();
+      this.show_search_field_default();
+      this.search_field_scale();
+      this.search_results.html(content);
+      return this.parsing = false;
+    };
+
+    Chosen.prototype.result_add_group = function(group) {
+      if (!group.disabled) {
+        group.dom_id = this.container_id + "_g_" + group.array_index;
+        return '<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>';
+      } else {
+        return "";
+      }
+    };
+
+    Chosen.prototype.result_do_highlight = function(el) {
+      var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
+      if (el.length) {
+        this.result_clear_highlight();
+        this.result_highlight = el;
+        this.result_highlight.addClass("highlighted");
+        maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
+        visible_top = this.search_results.scrollTop();
+        visible_bottom = maxHeight + visible_top;
+        high_top = this.result_highlight.position().top + this.search_results.scrollTop();
+        high_bottom = high_top + this.result_highlight.outerHeight();
+        if (high_bottom >= visible_bottom) {
+          return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
+        } else if (high_top < visible_top) {
+          return this.search_results.scrollTop(high_top);
+        }
+      }
+    };
+
+    Chosen.prototype.result_clear_highlight = function() {
+      if (this.result_highlight) {
+        this.result_highlight.removeClass("highlighted");
+      }
+      return this.result_highlight = null;
+    };
+
+    Chosen.prototype.results_show = function() {
+      if (this.result_single_selected != null) {
+        this.result_do_highlight(this.result_single_selected);
+      } else if (this.is_multiple && this.max_selected_options <= this.choices) {
+        this.form_field_jq.trigger("liszt:maxselected", {
+          chosen: this
+        });
+        return false;
+      }
+      this.container.addClass("chzn-with-drop");
+      this.form_field_jq.trigger("liszt:showing_dropdown", {
+        chosen: this
+      });
+      this.results_showing = true;
+      this.search_field.focus();
+      this.search_field.val(this.search_field.val());
+      return this.winnow_results();
+    };
+
+    Chosen.prototype.results_hide = function() {
+      this.result_clear_highlight();
+      this.container.removeClass("chzn-with-drop");
+      this.form_field_jq.trigger("liszt:hiding_dropdown", {
+        chosen: this
+      });
+      return this.results_showing = false;
+    };
+
+    Chosen.prototype.set_tab_index = function(el) {
+      var ti;
+      if (this.form_field_jq.attr("tabindex")) {
+        ti = this.form_field_jq.attr("tabindex");
+        this.form_field_jq.attr("tabindex", -1);
+        return this.search_field.attr("tabindex", ti);
+      }
+    };
+
+    Chosen.prototype.set_label_behavior = function() {
+      var _this = this;
+      this.form_field_label = this.form_field_jq.parents("label");
+      if (!this.form_field_label.length && this.form_field.id.length) {
+        this.form_field_label = $("label[for=" + this.form_field.id + "]");
+      }
+      if (this.form_field_label.length > 0) {
+        return this.form_field_label.click(function(evt) {
+          if (_this.is_multiple) {
+            return _this.container_mousedown(evt);
+          } else {
+            return _this.activate_field();
+          }
+        });
+      }
+    };
+
+    Chosen.prototype.show_search_field_default = function() {
+      if (this.is_multiple && this.choices < 1 && !this.active_field) {
+        this.search_field.val(this.default_text);
+        return this.search_field.addClass("default");
+      } else {
+        this.search_field.val("");
+        return this.search_field.removeClass("default");
+      }
+    };
+
+    Chosen.prototype.search_results_mouseup = function(evt) {
+      var target;
+      target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
+      if (target.length) {
+        this.result_highlight = target;
+        this.result_select(evt);
+        return this.search_field.focus();
+      }
+    };
+
+    Chosen.prototype.search_results_mouseover = function(evt) {
+      var target;
+      target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
+      if (target) {
+        return this.result_do_highlight(target);
+      }
+    };
+
+    Chosen.prototype.search_results_mouseout = function(evt) {
+      if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
+        return this.result_clear_highlight();
+      }
+    };
+
+    Chosen.prototype.choice_build = function(item) {
+      var choice_id, html, link,
+        _this = this;
+      if (this.is_multiple && this.max_selected_options <= this.choices) {
+        this.form_field_jq.trigger("liszt:maxselected", {
+          chosen: this
+        });
+        return false;
+      }
+      choice_id = this.container_id + "_c_" + item.array_index;
+      this.choices += 1;
+      if (item.disabled) {
+        html = '<li class="search-choice search-choice-disabled" id="' + choice_id + '"><span>' + item.html + '</span></li>';
+      } else {
+        html = '<li class="search-choice" id="' + choice_id + '"><span>' + item.html + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>';
+      }
+      this.search_container.before(html);
+      link = $('#' + choice_id).find("a").first();
+      return link.click(function(evt) {
+        return _this.choice_destroy_link_click(evt);
+      });
+    };
+
+    Chosen.prototype.choice_destroy_link_click = function(evt) {
+      evt.preventDefault();
+      evt.stopPropagation();
+      if (!this.is_disabled) {
+        return this.choice_destroy($(evt.target));
+      }
+    };
+
+    Chosen.prototype.choice_destroy = function(link) {
+      if (this.result_deselect(link.attr("rel"))) {
+        this.choices -= 1;
+        this.show_search_field_default();
+        if (this.is_multiple && this.choices > 0 && this.search_field.val().length < 1) {
+          this.results_hide();
+        }
+        link.parents('li').first().remove();
+        return this.search_field_scale();
+      }
+    };
+
+    Chosen.prototype.results_reset = function() {
+      this.form_field.options[0].selected = true;
+      this.selected_item.find("span").text(this.default_text);
+      if (!this.is_multiple) {
+        this.selected_item.addClass("chzn-default");
+      }
+      this.show_search_field_default();
+      this.results_reset_cleanup();
+      this.form_field_jq.trigger("change");
+      if (this.active_field) {
+        return this.results_hide();
+      }
+    };
+
+    Chosen.prototype.results_reset_cleanup = function() {
+      this.current_selectedIndex = this.form_field.selectedIndex;
+      return this.selected_item.find("abbr").remove();
+    };
+
+    Chosen.prototype.result_select = function(evt) {
+      var high, high_id, item, position;
+      if (this.result_highlight) {
+        high = this.result_highlight;
+        high_id = high.attr("id");
+        this.result_clear_highlight();
+        if (this.is_multiple) {
+          this.result_deactivate(high);
+        } else {
+          this.search_results.find(".result-selected").removeClass("result-selected");
+          this.result_single_selected = high;
+          this.selected_item.removeClass("chzn-default");
+        }
+        high.addClass("result-selected");
+        position = high_id.substr(high_id.lastIndexOf("_") + 1);
+        item = this.results_data[position];
+        item.selected = true;
+        this.form_field.options[item.options_index].selected = true;
+        if (this.is_multiple) {
+          this.choice_build(item);
+        } else {
+          this.selected_item.find("span").first().text(item.text);
+          if (this.allow_single_deselect) {
+            this.single_deselect_control_build();
+          }
+        }
+        if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {
+          this.results_hide();
+        }
+        this.search_field.val("");
+        if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
+          this.form_field_jq.trigger("change", {
+            'selected': this.form_field.options[item.options_index].value
+          });
+        }
+        this.current_selectedIndex = this.form_field.selectedIndex;
+        return this.search_field_scale();
+      }
+    };
+
+    Chosen.prototype.result_activate = function(el) {
+      return el.addClass("active-result");
+    };
+
+    Chosen.prototype.result_deactivate = function(el) {
+      return el.removeClass("active-result");
+    };
+
+    Chosen.prototype.result_deselect = function(pos) {
+      var result, result_data;
+      result_data = this.results_data[pos];
+      if (!this.form_field.options[result_data.options_index].disabled) {
+        result_data.selected = false;
+        this.form_field.options[result_data.options_index].selected = false;
+        result = $("#" + this.container_id + "_o_" + pos);
+        result.removeClass("result-selected").addClass("active-result").show();
+        this.result_clear_highlight();
+        this.winnow_results();
+        this.form_field_jq.trigger("change", {
+          deselected: this.form_field.options[result_data.options_index].value
+        });
+        this.search_field_scale();
+        return true;
+      } else {
+        return false;
+      }
+    };
+
+    Chosen.prototype.single_deselect_control_build = function() {
+      if (this.allow_single_deselect && this.selected_item.find("abbr").length < 1) {
+        return this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
+      }
+    };
+
+    Chosen.prototype.winnow_results = function() {
+      var found, option, part, parts, regex, regexAnchor, result, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len1, _ref;
+      this.no_results_clear();
+      results = 0;
+      searchText = this.search_field.val() === this.default_text ? "" : $('<div/>').text($.trim(this.search_field.val())).html();
+      regexAnchor = this.search_contains ? "" : "^";
+      regex = new RegExp(regexAnchor + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+      zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+      _ref = this.results_data;
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        option = _ref[_i];
+        if (!option.disabled && !option.empty) {
+          if (option.group) {
+            $('#' + option.dom_id).css('display', 'none');
+          } else if (!(this.is_multiple && option.selected)) {
+            found = false;
+            result_id = option.dom_id;
+            result = $("#" + result_id);
+            if (regex.test(option.html)) {
+              found = true;
+              results += 1;
+            } else if (this.enable_split_word_search && (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0)) {
+              parts = option.html.replace(/\[|\]/g, "").split(" ");
+              if (parts.length) {
+                for (_j = 0, _len1 = parts.length; _j < _len1; _j++) {
+                  part = parts[_j];
+                  if (regex.test(part)) {
+                    found = true;
+                    results += 1;
+                  }
+                }
+              }
+            }
+            if (found) {
+              if (searchText.length) {
+                startpos = option.html.search(zregex);
+                text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length);
+                text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
+              } else {
+                text = option.html;
+              }
+              result.html(text);
+              this.result_activate(result);
+              if (option.group_array_index != null) {
+                $("#" + this.results_data[option.group_array_index].dom_id).css('display', 'list-item');
+              }
+            } else {
+              if (this.result_highlight && result_id === this.result_highlight.attr('id')) {
+                this.result_clear_highlight();
+              }
+              this.result_deactivate(result);
+            }
+          }
+        }
+      }
+      if (results < 1 && searchText.length) {
+        return this.no_results(searchText);
+      } else {
+        return this.winnow_results_set_highlight();
+      }
+    };
+
+    Chosen.prototype.winnow_results_clear = function() {
+      var li, lis, _i, _len, _results;
+      this.search_field.val("");
+      lis = this.search_results.find("li");
+      _results = [];
+      for (_i = 0, _len = lis.length; _i < _len; _i++) {
+        li = lis[_i];
+        li = $(li);
+        if (li.hasClass("group-result")) {
+          _results.push(li.css('display', 'auto'));
+        } else if (!this.is_multiple || !li.hasClass("result-selected")) {
+          _results.push(this.result_activate(li));
+        } else {
+          _results.push(void 0);
+        }
+      }
+      return _results;
+    };
+
+    Chosen.prototype.winnow_results_set_highlight = function() {
+      var do_high, selected_results;
+      if (!this.result_highlight) {
+        selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
+        do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
+        if (do_high != null) {
+          return this.result_do_highlight(do_high);
+        }
+      }
+    };
+
+    Chosen.prototype.no_results = function(terms) {
+      var no_results_html;
+      no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
+      no_results_html.find("span").first().html(terms);
+      return this.search_results.append(no_results_html);
+    };
+
+    Chosen.prototype.no_results_clear = function() {
+      return this.search_results.find(".no-results").remove();
+    };
+
+    Chosen.prototype.keydown_arrow = function() {
+      var first_active, next_sib;
+      if (!this.result_highlight) {
+        first_active = this.search_results.find("li.active-result").first();
+        if (first_active) {
+          this.result_do_highlight($(first_active));
+        }
+      } else if (this.results_showing) {
+        next_sib = this.result_highlight.nextAll("li.active-result").first();
+        if (next_sib) {
+          this.result_do_highlight(next_sib);
+        }
+      }
+      if (!this.results_showing) {
+        return this.results_show();
+      }
+    };
+
+    Chosen.prototype.keyup_arrow = function() {
+      var prev_sibs;
+      if (!this.results_showing && !this.is_multiple) {
+        return this.results_show();
+      } else if (this.result_highlight) {
+        prev_sibs = this.result_highlight.prevAll("li.active-result");
+        if (prev_sibs.length) {
+          return this.result_do_highlight(prev_sibs.first());
+        } else {
+          if (this.choices > 0) {
+            this.results_hide();
+          }
+          return this.result_clear_highlight();
+        }
+      }
+    };
+
+    Chosen.prototype.keydown_backstroke = function() {
+      var next_available_destroy;
+      if (this.pending_backstroke) {
+        this.choice_destroy(this.pending_backstroke.find("a").first());
+        return this.clear_backstroke();
+      } else {
+        next_available_destroy = this.search_container.siblings("li.search-choice").last();
+        if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {
+          this.pending_backstroke = next_available_destroy;
+          if (this.single_backstroke_delete) {
+            return this.keydown_backstroke();
+          } else {
+            return this.pending_backstroke.addClass("search-choice-focus");
+          }
+        }
+      }
+    };
+
+    Chosen.prototype.clear_backstroke = function() {
+      if (this.pending_backstroke) {
+        this.pending_backstroke.removeClass("search-choice-focus");
+      }
+      return this.pending_backstroke = null;
+    };
+
+    Chosen.prototype.keydown_checker = function(evt) {
+      var stroke, _ref;
+      stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+      this.search_field_scale();
+      if (stroke !== 8 && this.pending_backstroke) {
+        this.clear_backstroke();
+      }
+      switch (stroke) {
+        case 8:
+          this.backstroke_length = this.search_field.val().length;
+          break;
+        case 9:
+          if (this.results_showing && !this.is_multiple) {
+            this.result_select(evt);
+          }
+          this.mouse_on_container = false;
+          break;
+        case 13:
+          evt.preventDefault();
+          break;
+        case 38:
+          evt.preventDefault();
+          this.keyup_arrow();
+          break;
+        case 40:
+          this.keydown_arrow();
+          break;
+      }
+    };
+
+    Chosen.prototype.search_field_scale = function() {
+      var div, h, style, style_block, styles, w, _i, _len;
+      if (this.is_multiple) {
+        h = 0;
+        w = 0;
+        style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
+        styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
+        for (_i = 0, _len = styles.length; _i < _len; _i++) {
+          style = styles[_i];
+          style_block += style + ":" + this.search_field.css(style) + ";";
+        }
+        div = $('<div />', {
+          'style': style_block
+        });
+        div.text(this.search_field.val());
+        $('body').append(div);
+        w = div.width() + 25;
+        div.remove();
+        if (!this.f_width) {
+          this.f_width = this.container.outerWidth();
+        }
+        if (w > this.f_width - 10) {
+          w = this.f_width - 10;
+        }
+        return this.search_field.css({
+          'width': w + 'px'
+        });
+      }
+    };
+
+    Chosen.prototype.generate_random_id = function() {
+      var string;
+      string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char();
+      while ($("#" + string).length > 0) {
+        string += this.generate_random_char();
+      }
+      return string;
+    };
+
+    return Chosen;
+
+  })(AbstractChosen);
+
+  root.Chosen = Chosen;
+
+}).call(this);
diff --git a/resources/jquery.tipsy/images/tipsy.png b/resources/jquery.tipsy/images/tipsy.png
index fef8c4b5..ef17cc32 100644
Binary files a/resources/jquery.tipsy/images/tipsy.png and b/resources/jquery.tipsy/images/tipsy.png differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png
index 5b5dab2a..e425e6e4 100644
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png and b/resources/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png
index ac8b229a..72d47573 100644
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png and b/resources/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png b/resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png
index ad3d6346..3b2914a2 100644
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png and b/resources/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png b/resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png
index 42ccba26..8569c1bc 100644
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png and b/resources/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png b/resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png
index 5a46b47c..d6cc3c58 100644
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png and b/resources/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png differ
diff --git a/resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png
index 7c9fa6c6..3cd467e1 100644
Binary files a/resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png and b/resources/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png
index ee039dc0..9a9606f7 100644
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png and b/resources/jquery.ui/themes/default/images/ui-icons_222222_256x240.png differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png
index 45e8928e..08d26179 100644
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png and b/resources/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png
index 7ec70d11..80cb644a 100644
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png and b/resources/jquery.ui/themes/default/images/ui-icons_454545_256x240.png differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png
index 5ba708c3..8373712d 100644
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png and b/resources/jquery.ui/themes/default/images/ui-icons_888888_256x240.png differ
diff --git a/resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png b/resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png
index 7930a558..34fc8937 100644
Binary files a/resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png and b/resources/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png differ
diff --git a/resources/jquery.ui/themes/vector/images/button-blue-hover-large.png b/resources/jquery.ui/themes/vector/images/button-blue-hover-large.png
deleted file mode 100644
index 8f7cf74e..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-blue-hover-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-blue-hover.png b/resources/jquery.ui/themes/vector/images/button-blue-hover.png
deleted file mode 100644
index 1fc28163..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-blue-hover.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-blue-large.png b/resources/jquery.ui/themes/vector/images/button-blue-large.png
deleted file mode 100644
index 22ee5e59..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-blue-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-blue.png b/resources/jquery.ui/themes/vector/images/button-blue.png
deleted file mode 100644
index 2e6d121a..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled-blue.png b/resources/jquery.ui/themes/vector/images/button-disabled-blue.png
deleted file mode 100644
index 28eb1fcd..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled-green.png b/resources/jquery.ui/themes/vector/images/button-disabled-green.png
deleted file mode 100644
index 0e29d85b..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled-red.png b/resources/jquery.ui/themes/vector/images/button-disabled-red.png
deleted file mode 100644
index ede69988..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-red.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled.png b/resources/jquery.ui/themes/vector/images/button-disabled.png
deleted file mode 100644
index e4e4ec1c..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down-blue.png b/resources/jquery.ui/themes/vector/images/button-down-blue.png
deleted file mode 100644
index 766e5746..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-down-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down-green.png b/resources/jquery.ui/themes/vector/images/button-down-green.png
deleted file mode 100644
index 90969c39..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-down-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down-red.png b/resources/jquery.ui/themes/vector/images/button-down-red.png
deleted file mode 100644
index f6257298..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-down-red.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down.png b/resources/jquery.ui/themes/vector/images/button-down.png
deleted file mode 100644
index c6467571..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-down.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green-hover-large.png b/resources/jquery.ui/themes/vector/images/button-green-hover-large.png
deleted file mode 100644
index dd8851e1..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-green-hover-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green-hover.png b/resources/jquery.ui/themes/vector/images/button-green-hover.png
deleted file mode 100644
index 19c39911..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-green-hover.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green-large.png b/resources/jquery.ui/themes/vector/images/button-green-large.png
deleted file mode 100644
index a8e830eb..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-green-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green.png b/resources/jquery.ui/themes/vector/images/button-green.png
deleted file mode 100644
index 54c418e9..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-large-disabled-green.png b/resources/jquery.ui/themes/vector/images/button-large-disabled-green.png
deleted file mode 100644
index f76f7b05..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-large-disabled-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-large-off-green.png b/resources/jquery.ui/themes/vector/images/button-large-off-green.png
deleted file mode 100644
index f997431b..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-large-off-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off-blue.png b/resources/jquery.ui/themes/vector/images/button-off-blue.png
deleted file mode 100644
index 82dedb53..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-off-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off-green.png b/resources/jquery.ui/themes/vector/images/button-off-green.png
deleted file mode 100644
index 109907f0..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-off-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off-red.png b/resources/jquery.ui/themes/vector/images/button-off-red.png
deleted file mode 100644
index 5a85b8aa..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-off-red.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off.png b/resources/jquery.ui/themes/vector/images/button-off.png
deleted file mode 100644
index cc5eb119..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-off.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange-hover-large.png b/resources/jquery.ui/themes/vector/images/button-orange-hover-large.png
deleted file mode 100644
index 6f0dbd5d..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-orange-hover-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange-hover.png b/resources/jquery.ui/themes/vector/images/button-orange-hover.png
deleted file mode 100644
index a1077c58..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-orange-hover.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange-large.png b/resources/jquery.ui/themes/vector/images/button-orange-large.png
deleted file mode 100644
index 3d7f37f6..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-orange-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange.png b/resources/jquery.ui/themes/vector/images/button-orange.png
deleted file mode 100644
index 02347cf9..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-orange.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over-blue.png b/resources/jquery.ui/themes/vector/images/button-over-blue.png
deleted file mode 100644
index 9edb7aa2..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-over-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over-green.png b/resources/jquery.ui/themes/vector/images/button-over-green.png
deleted file mode 100644
index 47a0b1b8..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-over-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over-red.png b/resources/jquery.ui/themes/vector/images/button-over-red.png
deleted file mode 100644
index a2445365..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-over-red.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over.png b/resources/jquery.ui/themes/vector/images/button-over.png
deleted file mode 100644
index 558f1f80..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-over.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red-hover-large.png b/resources/jquery.ui/themes/vector/images/button-red-hover-large.png
deleted file mode 100644
index 11ccef06..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-red-hover-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red-hover.png b/resources/jquery.ui/themes/vector/images/button-red-hover.png
deleted file mode 100644
index 55a61743..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-red-hover.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red-large.png b/resources/jquery.ui/themes/vector/images/button-red-large.png
deleted file mode 100644
index 8d089efd..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-red-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red.png b/resources/jquery.ui/themes/vector/images/button-red.png
deleted file mode 100644
index 7a292fc1..00000000
Binary files a/resources/jquery.ui/themes/vector/images/button-red.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/titlebar-fade.png b/resources/jquery.ui/themes/vector/images/titlebar-fade.png
index f9fde8b3..12a80c88 100644
Binary files a/resources/jquery.ui/themes/vector/images/titlebar-fade.png and b/resources/jquery.ui/themes/vector/images/titlebar-fade.png differ
diff --git a/resources/jquery.ui/themes/vector/jquery.ui.button.css b/resources/jquery.ui/themes/vector/jquery.ui.button.css
index a6a1b544..ea14723f 100644
--- a/resources/jquery.ui/themes/vector/jquery.ui.button.css
+++ b/resources/jquery.ui/themes/vector/jquery.ui.button.css
@@ -12,23 +12,12 @@
 	zoom: 1;
 	overflow: visible; /* the overflow property removes extra width in IE */
 }
-.ui-button-icon-only {
-	width: 2.2em; /* to make room for the icon, a width needs to be set here */
-}
-button.ui-button-icon-only {
-	width: 2.4em; /* button elements seem to need a little more width */
-}
-.ui-button-icons-only {
-	width: 3.4em;
-}
-button.ui-button-icons-only {
-	width: 3.7em;
-}
 
 /*button text element */
 .ui-button .ui-button-text {
 	display: block;
 	line-height: 1.4;
+	text-shadow: 0 1px 1px #fff;
 }
 .ui-button-text-only .ui-button-text {
 	padding: 0.3em 1em 0.25em 1em;
@@ -90,7 +79,7 @@ input.ui-button {
 }
 .ui-buttonset .ui-button {
 	margin-left: 0;
-	margin-right: -.3em;
+	margin-right: -.4em;
 }
 
 /* workarounds */
@@ -98,17 +87,21 @@ button.ui-button::-moz-focus-inner {
 	border: 0;
 	padding: 0; /* reset extra padding in Firefox */
 }
-
-body .ui-button {
-	margin: 0.5em 0 0.5em 0.4em;
-	border: 1px solid #a6a6a6 !important;
+/* Disables the annoying dashed border Firefox puts on active buttons */
+body button.ui-button::-moz-focus-inner {
+	border: 0;
+}
+/* Give large buttons some extra padding */
+body .ui-button-large {
+	padding: 5px;
+}
+/* Use white icons for colored buttons */
+.ui-button-green .ui-icon,
+.ui-button-blue .ui-icon,
+.ui-button-red .ui-icon,
+.ui-button-orange .ui-icon {
 	/* @embed */
-	background: #f2f2f2 url(images/button-off.png) repeat-x scroll 50% 100% !important;
-	cursor: pointer;
-	font-size: 1em;
-	line-height: 1.4em;
-	width: auto;
-	overflow: visible;
+	background-image: url(images/ui-icons_ffffff_256x240.png) !important;
 }
 
 /* Corner radius */
@@ -124,6 +117,7 @@ body .ui-button {
 }
 .ui-button.ui-corner-all,
 .ui-button.ui-corner-top,
+
 .ui-button.ui-corner-right,
 .ui-button.ui-corner-tr {
 	-moz-border-radius-topright: 4px;
@@ -147,145 +141,239 @@ body .ui-button {
 	border-bottom-right-radius: 4px;
 }
 
-body .ui-button:hover {
-	border-color: #6e7273;
-	/* @embed */
-	background: #e1e1e1 url(images/button-over.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button:active,
-body .ui-button:focus {
-	border-color: #707271;
-	/* @embed */
-	background: #bfbfbf url(images/button-down.png) repeat-x scroll 50% 100% !important;
+body .ui-button {
+	color: #2779aa;
+	margin: 0.5em 0 0.5em 0.4em;
+	border: 1px solid #aaa !important;
+	background: #f0f0f0 !important;
+	background: -moz-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* FF3.6+ */
+	background: -webkit-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Chrome10+, Safari5.1+ */
+	background: -o-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Opera 11.10+ */
+	background: -ms-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* IE10+ */
+	background: linear-gradient(to bottom, #fff 0%, #ddd 90%) !important;
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#dddddd', GradientType=0); /* IE6-8 */
+	cursor: pointer;
+	font-size: 1em;
+	line-height: 1.4em;
+	width: auto;
+	overflow: visible;
+	-webkit-box-shadow: 0 1px 3px rgba(0,0,0,.2);
+	-moz-box-shadow: 0 1px 3px rgba(0,0,0,.2);
+	box-shadow: 0 1px 3px rgba(0,0,0,.2);
 }
-body .ui-button.disabled {
-	color: #7f7f7f;
-	border-color: #cccccc;
-	/* @embed */
-	background: #f2f2f2 url(images/button-disabled.png) repeat-x scroll 50% 100% !important;
+
+body .ui-button-icon-only {
+	width: 2.2em;
 }
-/* Disables the annoying dashed border Firefox puts on active buttons */
-body button.ui-button::-moz-focus-inner {
-	border: 0;
+
+body .ui-button-icons-only {
+	width: 3.4em;
 }
-/* Give large buttons some extra padding */
-body .ui-button-large {
-	padding: 5px;
+
+body .ui-button:hover {
+	color: #2779aa;
+	border-color: #bbb !important;
+	background: #fff !important;
+	background: -moz-linear-gradient(top, #fff 0%, #eee 90%) !important; /* FF3.6+ */
+	background: -webkit-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
+	background: -o-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Opera 11.10+ */
+	background: -ms-linear-gradient(top, #fff 0%, #eee 90%) !important; /* IE10+ */
+	background: linear-gradient(to bottom, #fff 0%, #eee 90%) !important;
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
+	-webkit-box-shadow: 0 1px 3px rgba(0,0,0,.1);
+	-moz-box-shadow: 0 1px 3px rgba(0,0,0,.1);
+	box-shadow: 0 1px 3px rgba(0,0,0,.1);
 }
-/* Use white icons for colored buttons */
-.ui-button-green .ui-icon, .ui-button-blue .ui-icon, .ui-button-red .ui-icon, .ui-button-orange .ui-icon {
-	/* @embed */
-	background-image: url(images/ui-icons_ffffff_256x240.png) !important;
+body .ui-button:active,
+body .ui-button:focus {
+	border-color: #8ad !important;
+	-webkit-box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+	-moz-box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+	box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+}
+body .ui-button:active {
+	background: #e0e0e0 !important;
+	background: -moz-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* FF3.6+ */
+	background: -webkit-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Chrome10+, Safari5.1+ */
+	background: -o-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Opera 11.10+ */
+	background: -ms-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* IE10+ */
+	background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 90%) !important;
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f0f0f0', endColorstr='#d0d0d0', GradientType=0); /* IE6-8 */
 }
 
 /* Green buttons */
-
+body .ui-button-green,
+body .ui-button-green .ui-button-text {
+	color: white;
+	text-shadow: 0 -1px 1px #072;
+}
 body .ui-button.ui-button-green {
-	color: white !important;
-	border-color: #97af7e !important;
-	/* @embed */
-	background: #3cb677 url(images/button-green.png) repeat-x scroll 50% 100% !important;
+	border-color: #294 !important;
+	background: #295 !important;
+	background: -moz-linear-gradient(top, #3c8 0%, #295 90%) !important; /* FF3.6+ */
+	background: -webkit-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Chrome10+, Safari5.1+ */
+	background: -o-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Opera 11.10+ */
+	background: -ms-linear-gradient(top, #3c8 0%, #295 90%) !important; /* IE10+ */
+	background: linear-gradient(to bottom, #3c8 0%, #295 90%) !important;
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33cc88', endColorstr='#229955', GradientType=0); /* IE6-8 */
+	-webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+	-moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+	box-shadow: 0 1px 3px rgba(0,0,0,.3);
 }
 body .ui-button.ui-button-green:hover {
-	border-color: #778e61 !important;
-	/* @embed */
-	background: #339b65 url(images/button-green-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-green.ui-button-large {
-	/* @embed */
-	background: #3cb677 url(images/button-green-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-green.ui-button-large:hover {
-	/* @embed */
-	background: #339b65 url(images/button-green-hover-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-green.disabled {
-	filter:alpha(opacity=50);
-	-moz-opacity:0.50;
-	-khtml-opacity: 0.50;
-	opacity: 0.50;
+	background: #33a055 !important;
+	background: -moz-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* FF3.6+ */
+	background: -webkit-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Chrome10+, Safari5.1+ */
+	background: -o-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Opera 11.10+ */
+	background: -ms-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* IE10+ */
+	background: linear-gradient(to bottom, #44d388 0%, #33a055 90%) !important;
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#44d388', endColorstr='#33a055', GradientType=0); /* IE6-8 */
+	-webkit-box-shadow: 0 1px 3px rgba(0,0,0,.25);
+	-moz-box-shadow: 0 1px 3px rgba(0,0,0,.25);
+	box-shadow: 0 1px 3px rgba(0,0,0,.25);
+}
+body .ui-button.ui-button-green:active,
+body .ui-button.ui-button-green:focus {
+	border-color: #172 !important;
+	-webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+	-moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+	box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+}
+body .ui-button.ui-button-green:active {
+	background: #338855 !important;
+	background: -moz-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* FF3.6+ */
+	background: -webkit-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Chrome10+, Safari5.1+ */
+	background: -o-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Opera 11.10+ */
+	background: -ms-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* IE10+ */
+	background: linear-gradient(to bottom, #30c080 0%, #338855 90%) !important;
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#30c080', endColorstr='#338855', GradientType=0); /* IE6-8 */
 }
 
 /* Blue buttons */
-
+body .ui-button-blue,
+body .ui-button-blue .ui-button-text {
+	color: white;
+	text-shadow: 0 -1px 1px #037;
+}
 body .ui-button.ui-button-blue {
-	color: white !important;
-	border-color: #628acb !important;
-	/* @embed */
-	background: #3365ba url(images/button-blue.png) repeat-x scroll 50% 100% !important;
+	border-color: #468 !important;
+	background: #36b !important;
+	background: -moz-linear-gradient(top, #48e 0%, #36b 90%) !important; /* FF3.6+ */
+	background: -webkit-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Chrome10+, Safari5.1+ */
+	background: -o-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Opera 11.10+ */
+	background: -ms-linear-gradient(top, #48e 0%, #36b 90%) !important; /* IE10+ */
+	background: linear-gradient(to bottom, #48e 0%, #36b 90%) !important;
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4488ee', endColorstr='#3366bb', GradientType=0); /* IE6-8 */
+	-webkit-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+	-moz-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+	box-shadow: 0 1px 3px rgba(0,0,0,.35);
 }
 body .ui-button.ui-button-blue:hover {
-	border-color: #5375ad !important;
-	/* @embed */
-	background: #2b569e url(images/button-blue-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-blue.ui-button-large {
-	/* @embed */
-	background: #3365ba url(images/button-blue-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-blue.ui-button-large:hover {
-	/* @embed */
-	background: #2b569e url(images/button-blue-hover-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-blue.disabled {
-	filter:alpha(opacity=50);
-	-moz-opacity:0.50;
-	-khtml-opacity: 0.50;
-	opacity: 0.50;
+	background: #36c !important;
+	background: -moz-linear-gradient(top, #59e 0%, #36c 90%) !important; /* FF3.6+ */
+	background: -webkit-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Chrome10+, Safari5.1+ */
+	background: -o-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Opera 11.10+ */
+	background: -ms-linear-gradient(top, #59e 0%, #36c 90%) !important; /* IE10+ */
+	background: linear-gradient(to bottom, #59e 0%, #36c 90%) !important;
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5599ee', endColorstr='#3366cc', GradientType=0); /* IE6-8 */
+}
+body .ui-button.ui-button-blue:active,
+body .ui-button.ui-button-blue:focus {
+	border-color: #357 !important;
+	-webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+	-moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+	box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+}
+body .ui-button.ui-button-blue:active {
+	background: #3060a0 !important;
+	background: -moz-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* FF3.6+ */
+	background: -webkit-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Chrome10+, Safari5.1+ */
+	background: -o-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Opera 11.10+ */
+	background: -ms-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* IE10+ */
+	background: linear-gradient(to bottom, #4080e0 0%, #3060a0 90%) !important;
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4080e0', endColorstr='#3060a0', GradientType=0); /* IE6-8 */
 }
 
 /* Red buttons */
-
+body .ui-button-red,
+body .ui-button-red .ui-button-text {
+	color: white;
+	text-shadow: 0 -1px 1px #700;
+}
 body .ui-button.ui-button-red {
-	color: white !important;
-	border-color: #af977e !important;
-	/* @embed */
-	background: #cb0000 url(images/button-red.png) repeat-x scroll 50% 100% !important;
+	border-color: #944 !important;
+	background: #a22 !important;
+	background: -moz-linear-gradient(top, #d44 0%, #a22 90%) !important; /* FF3.6+ */
+	background: -webkit-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Chrome10+, Safari5.1+ */
+	background: -o-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Opera 11.10+ */
+	background: -ms-linear-gradient(top, #d44 0%, #a22 90%) !important; /* IE10+ */
+	background: linear-gradient(to bottom, #d44 0%, #a22 90%) !important;
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dd4444', endColorstr='#aa2222', GradientType=0); /* IE6-8 */
+	-webkit-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+	-moz-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+	box-shadow: 0 1px 3px rgba(0,0,0,.35);
 }
 body .ui-button.ui-button-red:hover {
-	border-color: #8e7761 !important;
-	/* @embed */
-	background: #ad0000 url(images/button-red-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-red.ui-button-large {
-	/* @embed */
-	background: #cb0000 url(images/button-red.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-red.ui-button-large:hover {
-	/* @embed */
-	background: #ad0000 url(images/button-red-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-red.disabled {
-	filter:alpha(opacity=50);
-	-moz-opacity:0.50;
-	-khtml-opacity: 0.50;
-	opacity: 0.50;
+	border-color: #a44 !important;
+	background: #b03333 !important;
+	background: -moz-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* FF3.6+ */
+	background: -webkit-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Chrome10+, Safari5.1+ */
+	background: -o-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Opera 11.10+ */
+	background: -ms-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* IE10+ */
+	background: linear-gradient(to bottom, #ee4646 0%, #b03333 90%) !important;
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee4646', endColorstr='#b03333', GradientType=0); /* IE6-8 */
+	-webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+	-moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+	box-shadow: 0 1px 3px rgba(0,0,0,.3);
+}
+body .ui-button.ui-button-red:active,
+body .ui-button.ui-button-red:focus {
+	border-color: #747 !important;
+	-webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+	-moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+	box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+}
+body .ui-button.ui-button-red:active {
+	background: #952020 !important;
+	background: -moz-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* FF3.6+ */
+	background: -webkit-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Chrome10+, Safari5.1+ */
+	background: -o-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Opera 11.10+ */
+	background: -ms-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* IE10+ */
+	background: linear-gradient(to bottom, #d04545 0%, #952020 90%) !important;
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d04545', endColorstr='#952020', GradientType=0); /* IE6-8 */
 }
 
-/* Orange buttons */
-
-body .ui-button.ui-button-orange {
-	color: white !important;
-	border-color: #f3a863 !important;
-	/* @embed */
-	background: #f07f14 url(images/button-orange.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange:hover {
-	border-color: #ce9055 !important;
-	/* @embed */
-	background: #cc6c11 url(images/button-orange-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange.ui-button-large {
-	/* @embed */
-	background: #f07f14 url(images/button-orange-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange.ui-button-large:hover {
-	/* @embed */
-	background: #cc6c11 url(images/button-orange-hover-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange.disabled {
-	filter:alpha(opacity=50);
-	-moz-opacity:0.50;
-	-khtml-opacity: 0.50;
-	opacity: 0.50;
+/* Disabled buttons */
+body .ui-button-green.disabled,
+body .ui-button-green.disabled:hover,
+body .ui-button-green.disabled:active,
+body .ui-button-green.disabled:focus,
+body .ui-button-blue.disabled,
+body .ui-button-blue.disabled:hover,
+body .ui-button-blue.disabled:active,
+body .ui-button-blue.disabled:focus,
+body .ui-button-red.disabled,
+body .ui-button-red.disabled:hover,
+body .ui-button-red.disabled:active,
+body .ui-button-red.disabled:focus,
+body .ui-button.disabled,
+body .ui-button.disabled:hover {
+	color: #aaa;
+	border-color: #ccc !important;
+	background: #eee !important;
+	background: -moz-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* FF3.6+ */
+	background: -webkit-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
+	background: -o-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Opera 11.10+ */
+	background: -ms-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* IE10+ */
+	background: linear-gradient(to bottom, #f6f6f6 0%, #eee 90%) !important;
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
+	-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0);
+	-moz-box-shadow: 0 1px 3px rgba(0,0,0,0);
+	box-shadow: 0 1px 3px rgba(0,0,0,0);
+}
+body .ui-button-green.disabled .ui-button-text,
+body .ui-button-blue.disabled .ui-button-text,
+body .ui-button-red.disabled .ui-button-text {
+	color: #aaa;
+	text-shadow: 0 1px 1px #fff;
 }
diff --git a/resources/jquery/images/jquery.arrowSteps.divider-ltr.png b/resources/jquery/images/jquery.arrowSteps.divider-ltr.png
index 83d6ff84..84ed2a2d 100644
Binary files a/resources/jquery/images/jquery.arrowSteps.divider-ltr.png and b/resources/jquery/images/jquery.arrowSteps.divider-ltr.png differ
diff --git a/resources/jquery/images/jquery.arrowSteps.divider-rtl.png b/resources/jquery/images/jquery.arrowSteps.divider-rtl.png
index 529d7b84..7cfbfeba 100644
Binary files a/resources/jquery/images/jquery.arrowSteps.divider-rtl.png and b/resources/jquery/images/jquery.arrowSteps.divider-rtl.png differ
diff --git a/resources/jquery/images/jquery.arrowSteps.head-ltr.png b/resources/jquery/images/jquery.arrowSteps.head-ltr.png
index 3289617d..eb070280 100644
Binary files a/resources/jquery/images/jquery.arrowSteps.head-ltr.png and b/resources/jquery/images/jquery.arrowSteps.head-ltr.png differ
diff --git a/resources/jquery/images/jquery.arrowSteps.head-rtl.png b/resources/jquery/images/jquery.arrowSteps.head-rtl.png
index 3d9f70cb..7ea2fdb5 100644
Binary files a/resources/jquery/images/jquery.arrowSteps.head-rtl.png and b/resources/jquery/images/jquery.arrowSteps.head-rtl.png differ
diff --git a/resources/jquery/images/jquery.arrowSteps.tail-ltr.png b/resources/jquery/images/jquery.arrowSteps.tail-ltr.png
index 92b872b2..3ad990b6 100644
Binary files a/resources/jquery/images/jquery.arrowSteps.tail-ltr.png and b/resources/jquery/images/jquery.arrowSteps.tail-ltr.png differ
diff --git a/resources/jquery/images/marker.png b/resources/jquery/images/marker.png
index 3929bbb5..19efb6ce 100644
Binary files a/resources/jquery/images/marker.png and b/resources/jquery/images/marker.png differ
diff --git a/resources/jquery/images/mask.png b/resources/jquery/images/mask.png
index b0a4d406..fe08de0e 100644
Binary files a/resources/jquery/images/mask.png and b/resources/jquery/images/mask.png differ
diff --git a/resources/jquery/jquery.badge.css b/resources/jquery/jquery.badge.css
index d961bf3d..f313663e 100644
--- a/resources/jquery/jquery.badge.css
+++ b/resources/jquery/jquery.badge.css
@@ -1,13 +1,12 @@
 .mw-badge {
 	min-width: 7px;
-	-moz-border-radius: 2px;
-	-webkit-border-radius: 2px;
 	border-radius: 2px;
 	padding: 1px 4px;
 	text-align: center;
 	font-size: 12px;
 	line-height: 12px;
 	background-color: #d2d2d2;
+	cursor: pointer;
 }
 
 .mw-badge-content {
@@ -18,8 +17,12 @@
 }
 
 .mw-badge-inline {
-	display: inline-block;
 	margin-left: 3px;
+	display: inline-block;
+	/* Hack for IE6 and IE7 (bug 47926) */
+	zoom: 1;
+	*display: inline;
+
 }
 .mw-badge-overlay {
 	position: absolute;
diff --git a/resources/jquery/jquery.byteLength.js b/resources/jquery/jquery.byteLength.js
index 3d5b7206..398937e6 100644
--- a/resources/jquery/jquery.byteLength.js
+++ b/resources/jquery/jquery.byteLength.js
@@ -4,6 +4,8 @@
  * Calculate the byte length of a string (accounting for UTF-8).
  *
  * @author Jan Paul Posma, 2011
+ * @author Timo Tijhof, 2012
+ * @author David Chan, 2013
  */
 jQuery.byteLength = function ( str ) {
 
@@ -12,8 +14,18 @@ jQuery.byteLength = function ( str ) {
 	// Note, surrogate (\uD800-\uDFFF) characters are counted as 2 bytes, since there's two of them
 	// and the actual character takes 4 bytes in UTF-8 (2*2=4). Might not work perfectly in
 	// edge cases such as illegal sequences, but that should never happen.
+
+	// https://en.wikipedia.org/wiki/UTF-8#Description
+	// The mapping from UTF-16 code units to UTF-8 bytes is as follows:
+	// > Range 0000-007F: codepoints that become 1 byte of UTF-8
+	// > Range 0080-07FF: codepoints that become 2 bytes of UTF-8
+	// > Range 0800-D7FF: codepoints that become 3 bytes of UTF-8
+	// > Range D800-DFFF: Surrogates (each pair becomes 4 bytes of UTF-8)
+	// > Range E000-FFFF: codepoints that become 3 bytes of UTF-8 (continued)
+
 	return str
 		.replace( /[\u0080-\u07FF\uD800-\uDFFF]/g, '**' )
 		.replace( /[\u0800-\uD7FF\uE000-\uFFFF]/g, '***' )
 		.length;
+
 };
diff --git a/resources/jquery/jquery.byteLimit.js b/resources/jquery/jquery.byteLimit.js
index f2b98f09..a8c0b065 100644
--- a/resources/jquery/jquery.byteLimit.js
+++ b/resources/jquery/jquery.byteLimit.js
@@ -78,7 +78,8 @@
 		// Chop off characters from the end of the "inserted content" string
 		// until the limit is statisfied.
 		if ( fn ) {
-			while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit ) {
+			// stop, when there is nothing to slice - bug 41450
+			while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit && inpParts[1].length > 0 ) {
 				inpParts[1] = inpParts[1].slice( 0, -1 );
 			}
 		} else {
diff --git a/resources/jquery/jquery.checkboxShiftClick.js b/resources/jquery/jquery.checkboxShiftClick.js
index aced0633..b2065665 100644
--- a/resources/jquery/jquery.checkboxShiftClick.js
+++ b/resources/jquery/jquery.checkboxShiftClick.js
@@ -15,11 +15,17 @@
 		$box.click( function ( e ) {
 			// And one has been clicked before...
 			if ( prevCheckbox !== null && e.shiftKey ) {
-				// Check or uncheck this one and all in-between checkboxes
-				$box.slice(
-					Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
-					Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
-				).prop( 'checked', !!e.target.checked );
+				// Check or uncheck this one and all in-between checkboxes,
+				// except for disabled ones
+				$box
+					.slice(
+						Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
+						Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
+					)
+					.filter( function () {
+						return !this.disabled;
+					} )
+					.prop( 'checked', !!e.target.checked );
 			}
 			// Either way, update the prevCheckbox variable to the one clicked now
 			prevCheckbox = e.target;
diff --git a/resources/jquery/jquery.client.js b/resources/jquery/jquery.client.js
index b0bd6850..5a95dc5b 100644
--- a/resources/jquery/jquery.client.js
+++ b/resources/jquery/jquery.client.js
@@ -6,7 +6,7 @@
 	/* Private Members */
 
 	/**
-	 * @var profileCache {Object} Keyed by userAgent string,
+	 * @var {Object} profileCache Keyed by userAgent string,
 	 * value is the parsed $.client.profile object for that user agent.
 	 */
 	var profileCache = {};
@@ -18,9 +18,9 @@
 		/**
 		 * Get an object containing information about the client.
 		 *
-		 * @param nav {Object} An object with atleast a 'userAgent' and 'platform' key.
+		 * @param {Object} nav An object with atleast a 'userAgent' and 'platform' key.
 		 * Defaults to the global Navigator object.
-		 * @return {Object} The resulting client object will be in the following format:
+		 * @returns {Object} The resulting client object will be in the following format:
 		 *  {
 		 *   'name': 'firefox',
 		 *   'layout': 'gecko',
@@ -50,47 +50,47 @@
 					// Generic version digit
 					x = 'x',
 					// Strings found in user agent strings that need to be conformed
-					wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3'],
+					wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3', 'Iceweasel'],
 					// Translations for conforming user agent strings
 					userAgentTranslations = [
 						// Tons of browsers lie about being something they are not
-						[/(Firefox|MSIE|KHTML,\slike\sGecko|Konqueror)/, ''],
+						[/(Firefox|MSIE|KHTML,?\slike\sGecko|Konqueror)/, ''],
 						// Chrome lives in the shadow of Safari still
 						['Chrome Safari', 'Chrome'],
 						// KHTML is the layout engine not the browser - LIES!
 						['KHTML', 'Konqueror'],
 						// Firefox nightly builds
 						['Minefield', 'Firefox'],
-						// This helps keep differnt versions consistent
+						// This helps keep different versions consistent
 						['Navigator', 'Netscape'],
 						// This prevents version extraction issues, otherwise translation would happen later
 						['PLAYSTATION 3', 'PS3']
 					],
-					// Strings which precede a version number in a user agent string - combined and used as match 1 in
-					// version detectection
+					// Strings which precede a version number in a user agent string - combined and used as
+					// match 1 in version detection
 					versionPrefixes = [
 						'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'netscape6', 'opera', 'version', 'konqueror',
-						'lynx', 'msie', 'safari', 'ps3'
+						'lynx', 'msie', 'safari', 'ps3', 'android'
 					],
 					// Used as matches 2, 3 and 4 in version extraction - 3 is used as actual version number
 					versionSuffix = '(\\/|\\;?\\s|)([a-z0-9\\.\\+]*?)(\\;|dev|rel|\\)|\\s|$)',
 					// Names of known browsers
 					names = [
 						'camino', 'chrome', 'firefox', 'iceweasel', 'netscape', 'konqueror', 'lynx', 'msie', 'opera',
-						'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq'
+						'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq', 'android'
 					],
 					// Tanslations for conforming browser names
 					nameTranslations = [],
 					// Names of known layout engines
-					layouts = ['gecko', 'konqueror', 'msie', 'opera', 'webkit'],
+					layouts = ['gecko', 'konqueror', 'msie', 'trident', 'opera', 'webkit'],
 					// Translations for conforming layout names
 					layoutTranslations = [ ['konqueror', 'khtml'], ['msie', 'trident'], ['opera', 'presto'] ],
 					// Names of supported layout engines for version number
-					layoutVersions = ['applewebkit', 'gecko'],
+					layoutVersions = ['applewebkit', 'gecko', 'trident'],
 					// Names of known operating systems
-					platforms = ['win', 'mac', 'linux', 'sunos', 'solaris', 'iphone'],
+					platforms = ['win', 'wow64', 'mac', 'linux', 'sunos', 'solaris', 'iphone'],
 					// Translations for conforming operating system names
-					platformTranslations = [ ['sunos', 'solaris'] ],
+					platformTranslations = [ ['sunos', 'solaris'], ['wow64', 'win'] ],
 
 					/* Methods */
 
@@ -143,18 +143,33 @@
 				/* Edge Cases -- did I mention about how user agent string lie? */
 
 				// Decode Safari's crazy 400+ version numbers
-				if ( name.match( /safari/ ) && version > 400 ) {
+				if ( name === 'safari' && version > 400 ) {
 					version = '2.0';
 				}
 				// Expose Opera 10's lies about being Opera 9.8
-				if ( name === 'opera' && version >= 9.8) {
-					match = ua.match( /version\/([0-9\.]*)/i );
+				if ( name === 'opera' && version >= 9.8 ) {
+					match = ua.match( /\bversion\/([0-9\.]*)/ );
 					if ( match && match[1] ) {
 						version = match[1];
 					} else {
 						version = '10';
 					}
 				}
+				// And Opera 15's lies about being Chrome
+				if ( name === 'chrome' && ( match = ua.match( /\bopr\/([0-9\.]*)/ ) ) ) {
+					if ( match[1] ) {
+						name = 'opera';
+						version = match[1];
+					}
+				}
+				// And IE 11's lies about being not being IE
+				if ( layout === 'trident' && layoutversion >= 7 && ( match = ua.match( /\brv[ :\/]([0-9\.]*)/ ) ) ) {
+					if ( match[1] ) {
+						name = 'msie';
+						version = match[1];
+					}
+				}
+
 				versionNumber = parseFloat( version, 10 ) || 0.0;
 
 				/* Caching */
@@ -173,46 +188,61 @@
 		},
 
 		/**
-		 * Checks the current browser against a support map object to determine if the browser has been black-listed or
-		 * not. If the browser was not configured specifically it is assumed to work. It is assumed that the body
-		 * element is classified as either "ltr" or "rtl". If neither is set, "ltr" is assumed.
+		 * Checks the current browser against a support map object.
 		 *
 		 * A browser map is in the following format:
 		 * {
+		 *   // Multiple rules with configurable operators
+		 *   'msie': [['>=', 7], ['!=', 9]],
+		 *    // Match no versions
+		 *   'iphone': false,
+		 *    // Match any version
+		 *   'android': null
+		 * }
+		 *
+		 * It can optionally be split into ltr/rtl sections:
+		 * {
 		 *   'ltr': {
-		 *     // Multiple rules with configurable operators
-		 *     'msie': [['>=', 7], ['!=', 9]],
-		 *      // Blocked entirely
+		 *     'android': null,
 		 *     'iphone': false
 		 *   },
 		 *   'rtl': {
-		 *     // Test against a string
-		 *     'msie': [['!==', '8.1.2.3']],
-		 *     // RTL rules do not fall through to LTR rules, you must explicity set each of them
+		 *     'android': false,
+		 *     // rules are not inherited from ltr
 		 *     'iphone': false
 		 *   }
 		 * }
 		 *
-		 * @param map {Object} Browser support map
-		 * @param profile {Object} (optional) a client-profile object.
+		 * @param {Object} map Browser support map
+		 * @param {Object} [profile] A client-profile object
+		 * @param {boolean} [exactMatchOnly=false] Only return true if the browser is matched, otherwise
+		 * returns true if the browser is not found.
 		 *
-		 * @return Boolean true if browser known or assumed to be supported, false if blacklisted
+		 * @returns {boolean} The current browser is in the support map
 		 */
-		test: function ( map, profile ) {
+		test: function ( map, profile, exactMatchOnly ) {
 			/*jshint evil: true */
 
 			var conditions, dir, i, op, val;
 			profile = $.isPlainObject( profile ) ? profile : $.client.profile();
-			dir = $( 'body' ).is( '.rtl' ) ? 'rtl' : 'ltr';
+			if ( map.ltr && map.rtl ) {
+				dir = $( 'body' ).is( '.rtl' ) ? 'rtl' : 'ltr';
+				map = map[dir];
+			}
 			// Check over each browser condition to determine if we are running in a compatible client
-			if ( typeof map[dir] !== 'object' || map[dir][profile.name] === undefined ) {
-				// Unknown, so we assume it's working
-				return true;
+			if ( typeof map !== 'object' || map[profile.name] === undefined ) {
+				// Not found, return true if exactMatchOnly not set, false otherwise
+				return !exactMatchOnly;
 			}
-			conditions = map[dir][profile.name];
+			conditions = map[profile.name];
 			if ( conditions === false ) {
+				// Match no versions
 				return false;
 			}
+			if ( conditions === null ) {
+				// Match all versions
+				return true;
+			}
 			for ( i = 0; i < conditions.length; i++ ) {
 				op = conditions[i][0];
 				val = conditions[i][1];
diff --git a/resources/jquery/jquery.makeCollapsible.js b/resources/jquery/jquery.makeCollapsible.js
index 1407f53b..0cd6417c 100644
--- a/resources/jquery/jquery.makeCollapsible.js
+++ b/resources/jquery/jquery.makeCollapsible.js
@@ -18,13 +18,15 @@
 	var lpx = 'jquery.makeCollapsible> ';
 
 	/**
+	 * Handler for a click on a collapsible toggler.
+	 *
 	 * @param {jQuery} $collapsible
 	 * @param {string} action The action this function will take ('expand' or 'collapse').
 	 * @param {jQuery|null} [optional] $defaultToggle
 	 * @param {Object|undefined} options
 	 */
 	function toggleElement( $collapsible, action, $defaultToggle, options ) {
-		var $collapsibleContent, $containers;
+		var $collapsibleContent, $containers, hookCallback;
 		options = options || {};
 
 		// Validate parameters
@@ -47,6 +49,14 @@
 			return;
 		}
 
+		// Trigger a custom event to allow callers to hook to the collapsing/expanding,
+		// allowing the module to be testable, and making it possible to
+		// e.g. implement persistence via cookies
+		$collapsible.trigger( action === 'expand' ? 'beforeExpand.mw-collapsible' : 'beforeCollapse.mw-collapsible' );
+		hookCallback = function () {
+			$collapsible.trigger( action === 'expand' ? 'afterExpand.mw-collapsible' : 'afterCollapse.mw-collapsible' );
+		};
+
 		// Handle different kinds of elements
 
 		if ( !options.plainMode && $collapsible.is( 'table' ) ) {
@@ -63,11 +73,12 @@
 				// http://stackoverflow.com/questions/467336#920480
 				if ( options.instantHide ) {
 					$containers.hide();
+					hookCallback();
 				} else {
-					$containers.stop( true, true ).fadeOut();
+					$containers.stop( true, true ).fadeOut().promise().done( hookCallback );
 				}
 			} else {
-				$containers.stop( true, true ).fadeIn();
+				$containers.stop( true, true ).fadeIn().promise().done( hookCallback );
 			}
 
 		} else if ( !options.plainMode && ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) ) {
@@ -81,11 +92,12 @@
 			if ( action === 'collapse' ) {
 				if ( options.instantHide ) {
 					$containers.hide();
+					hookCallback();
 				} else {
-					$containers.stop( true, true ).slideUp();
+					$containers.stop( true, true ).slideUp().promise().done( hookCallback );
 				}
 			} else {
-				$containers.stop( true, true ).slideDown();
+				$containers.stop( true, true ).slideDown().promise().done( hookCallback );
 			}
 
 		} else {
@@ -97,11 +109,12 @@
 				if ( action === 'collapse' ) {
 					if ( options.instantHide ) {
 						$collapsibleContent.hide();
+						hookCallback();
 					} else {
-						$collapsibleContent.slideUp();
+						$collapsibleContent.slideUp().promise().done( hookCallback );
 					}
 				} else {
-					$collapsibleContent.slideDown();
+					$collapsibleContent.slideDown().promise().done( hookCallback );
 				}
 
 			// Otherwise assume this is a customcollapse with a remote toggle
@@ -110,18 +123,19 @@
 				if ( action === 'collapse' ) {
 					if ( options.instantHide ) {
 						$collapsible.hide();
+						hookCallback();
 					} else {
 						if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-							$collapsible.fadeOut();
+							$collapsible.fadeOut().promise().done( hookCallback );
 						} else {
-							$collapsible.slideUp();
+							$collapsible.slideUp().promise().done( hookCallback );
 						}
 					}
 				} else {
 					if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-						$collapsible.fadeIn();
+						$collapsible.fadeIn().promise().done( hookCallback );
 					} else {
-						$collapsible.slideDown();
+						$collapsible.slideDown().promise().done( hookCallback );
 					}
 				}
 			}
@@ -129,7 +143,7 @@
 	}
 
 	/**
-	 * Handles clicking on the collapsible element toggle and other
+	 * Handles clicking/keypressing on the collapsible element toggle and other
 	 * situations where a collapsible element is toggled (e.g. the initial
 	 * toggle for collapsed ones).
 	 *
@@ -138,20 +152,32 @@
 	 * @param {jQuery.Event|null} e either the event or null if unavailable
 	 * @param {Object|undefined} options
 	 */
-	function togglingHandler( $toggle, $collapsible, event, options ) {
+	function togglingHandler( $toggle, $collapsible, e, options ) {
 		var wasCollapsed, $textContainer, collapseText, expandText;
 
-		if ( event ) {
-			// Don't fire if a link was clicked, if requested  (for premade togglers by default)
-			if ( options.linksPassthru && $.nodeName( event.target, 'a' ) ) {
-				return true;
+		if ( options === undefined ) {
+			options = {};
+		}
+
+		if ( e ) {
+			if ( e.type === 'click' && options.linksPassthru && $.nodeName( e.target, 'a' ) ) {
+				// Don't fire if a link was clicked, if requested  (for premade togglers by default)
+				return;
+			} else if ( e.type === 'keypress' && e.which !== 13 && e.which !== 32 ) {
+				// Only handle keypresses on the "Enter" or "Space" keys
+				return;
 			} else {
-				event.preventDefault();
-				event.stopPropagation();
+				e.preventDefault();
+				e.stopPropagation();
 			}
 		}
 
-		wasCollapsed = $collapsible.hasClass( 'mw-collapsed' );
+		// This allows the element to be hidden on initial toggle without fiddling with the class
+		if ( options.wasCollapsed !== undefined ) {
+			wasCollapsed = options.wasCollapsed;
+		} else {
+			wasCollapsed = $collapsible.hasClass( 'mw-collapsed' );
+		}
 
 		// Toggle the state of the collapsible element (that is, expand or collapse)
 		$collapsible.toggleClass( 'mw-collapsed', !wasCollapsed );
@@ -179,45 +205,6 @@
 		toggleElement( $collapsible, wasCollapsed ? 'expand' : 'collapse', $toggle, options );
 	}
 
-	/**
-	 * Toggles collapsible and togglelink class and updates text label.
-	 *
-	 * @param {jQuery} $that
-	 * @param {jQuery.Event} e
-	 * @param {Object|undefined} options
-	 */
-	function toggleLinkDefault( $that, e, options ) {
-		var $collapsible = $that.closest( '.mw-collapsible' );
-		options = $.extend( { toggleClasses: true }, options );
-		togglingHandler( $that, $collapsible, e, options );
-	}
-
-	/**
-	 * Toggles collapsible and togglelink class.
-	 *
-	 * @param {jQuery} $that
-	 * @param {jQuery.Event} e
-	 * @param {Object|undefined} options
-	 */
-	function toggleLinkPremade( $that, e, options ) {
-		var $collapsible = $that.eq( 0 ).closest( '.mw-collapsible' );
-		options = $.extend( { toggleClasses: true, linksPassthru: true }, options );
-		togglingHandler( $that, $collapsible, e, options );
-	}
-
-	/**
-	 * Toggles customcollapsible.
-	 *
-	 * @param {jQuery} $that
-	 * @param {jQuery.Event} e
-	 * @param {Object|undefined} options
-	 * @param {jQuery} $collapsible
-	 */
-	function toggleLinkCustom( $that, e, options, $collapsible ) {
-		options = $.extend( {}, options );
-		togglingHandler( $that, $collapsible, e, options );
-	}
-
 	/**
 	 * Make any element collapsible.
 	 *
@@ -243,17 +230,17 @@
 	 *   div.mw-collapsible-content. May only be used with custom togglers.
 	 */
 	$.fn.makeCollapsible = function ( options ) {
-		return this.each(function () {
-			var $collapsible, collapsetext, expandtext, $toggle, $toggleLink, $firstItem, collapsibleId,
-				$customTogglers, firstval;
+		if ( options === undefined ) {
+			options = {};
+		}
 
-			if ( options === undefined ) {
-				options = {};
-			}
+		return this.each( function () {
+			var $collapsible, collapseText, expandText, $toggle, actionHandler, buildDefaultToggleLink,
+				premadeToggleHandler, $toggleLink, $firstItem, collapsibleId, $customTogglers, firstval;
 
 			// Ensure class "mw-collapsible" is present in case .makeCollapsible()
 			// is called on element(s) that don't have it yet.
-			$collapsible = $(this).addClass( 'mw-collapsible' );
+			$collapsible = $( this ).addClass( 'mw-collapsible' );
 
 			// Return if it has been enabled already.
 			if ( $collapsible.data( 'mw-made-collapsible' ) ) {
@@ -263,21 +250,35 @@
 			}
 
 			// Use custom text or default?
-			collapsetext = options.collapseText || $collapsible.attr( 'data-collapsetext' ) || mw.msg( 'collapsible-collapse' );
-			expandtext = options.expandText || $collapsible.attr( 'data-expandtext' ) || mw.msg( 'collapsible-expand' );
-
-			// Create toggle link with a space around the brackets (&nbsp;[text]&nbsp;)
-			$toggleLink =
-				$( '<a href="#"></a>' )
-					.text( collapsetext )
+			collapseText = options.collapseText || $collapsible.attr( 'data-collapsetext' ) || mw.msg( 'collapsible-collapse' );
+			expandText = options.expandText || $collapsible.attr( 'data-expandtext' ) || mw.msg( 'collapsible-expand' );
+
+			// Default click/keypress handler and toggle link to use when none is present
+			actionHandler = function ( e, opts ) {
+				var defaultOpts = {
+					toggleClasses: true,
+					toggleText: { collapseText: collapseText, expandText: expandText }
+				};
+				opts = $.extend( defaultOpts, options, opts );
+				togglingHandler( $( this ), $collapsible, e, opts );
+			};
+			// Default toggle link. Only build it when needed to avoid jQuery memory leaks (event data).
+			buildDefaultToggleLink = function () {
+				return $( '<a href="#"></a>' )
+					.text( collapseText )
 					.wrap( '<span class="mw-collapsible-toggle"></span>' )
 						.parent()
 						.prepend( '&nbsp;[' )
 						.append( ']&nbsp;' )
-						.on( 'click.mw-collapse', function ( e, opts ) {
-							opts = $.extend( { toggleText: { collapseText: collapsetext, expandText: expandtext } }, options, opts );
-							toggleLinkDefault( $(this), e, opts );
-						} );
+						.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
+			};
+
+			// Default handler for clicking on premade toggles
+			premadeToggleHandler = function ( e, opts ) {
+				var defaultOpts = { toggleClasses: true, linksPassthru: true };
+				opts = $.extend( defaultOpts, options, opts );
+				togglingHandler( $( this ), $collapsible, e, opts );
+			};
 
 			// Check if this element has a custom position for the toggle link
 			// (ie. outside the container or deeper inside the tree)
@@ -296,25 +297,21 @@
 				}
 			}
 
-			// Bind the custom togglers
+			// Bind the togglers
 			if ( $customTogglers && $customTogglers.length ) {
-				$customTogglers.on( 'click.mw-collapse', function ( e, opts ) {
-					opts = $.extend( {}, options, opts );
-					toggleLinkCustom( $(this), e, opts, $collapsible );
-				} );
-
-				// Initial state
-				if ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) {
-					// Remove here so that the toggler goes in the right direction,
-					// It re-adds the class.
-					$collapsible.removeClass( 'mw-collapsed' );
-					toggleLinkCustom( $customTogglers, null, $.extend( { instantHide: true }, options ), $collapsible );
-				}
+				actionHandler = function ( e, opts ) {
+					var defaultOpts = {};
+					opts = $.extend( defaultOpts, options, opts );
+					togglingHandler( $( this ), $collapsible, e, opts );
+				};
+
+				$toggleLink = $customTogglers;
+				$toggleLink.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
 
-			// If this is not a custom case, do the default:
-			// Wrap the contents and add the toggle link
 			} else {
-				// Elements are treated differently
+				// If this is not a custom case, do the default: wrap the
+				// contents and add the toggle link. Different elements are
+				// treated differently.
 				if ( $collapsible.is( 'table' ) ) {
 					// The toggle-link will be in one the the cells (td or th) of the first row
 					$firstItem = $collapsible.find( 'tr:first th, tr:first td' );
@@ -322,12 +319,10 @@
 
 					// If theres no toggle link, add it to the last cell
 					if ( !$toggle.length ) {
-						$firstItem.eq(-1).prepend( $toggleLink );
+						$toggleLink = buildDefaultToggleLink().prependTo( $firstItem.eq( -1 ) );
 					} else {
-						$toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
-							opts = $.extend( {}, options, opts );
-							toggleLinkPremade( $toggle, e, opts );
-						} );
+						actionHandler = premadeToggleHandler;
+						$toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
 					}
 
 				} else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
@@ -339,17 +334,16 @@
 					if ( !$toggle.length ) {
 						// Make sure the numeral order doesn't get messed up, force the first (soon to be second) item
 						// to be "1". Except if the value-attribute is already used.
-						// If no value was set WebKit returns "", Mozilla returns '-1', others return null or undefined.
+						// If no value was set WebKit returns "", Mozilla returns '-1', others return 0, null or undefined.
 						firstval = $firstItem.attr( 'value' );
 						if ( firstval === undefined || !firstval || firstval === '-1' || firstval === -1 ) {
 							$firstItem.attr( 'value', '1' );
 						}
-						$collapsible.prepend( $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent() );
+						$toggleLink = buildDefaultToggleLink();
+						$toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent().prependTo( $collapsible );
 					} else {
-						$toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
-							opts = $.extend( {}, options, opts );
-							toggleLinkPremade( $toggle, e, opts );
-						} );
+						actionHandler = premadeToggleHandler;
+						$toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
 					}
 
 				} else { // <div>, <p> etc.
@@ -364,28 +358,23 @@
 
 					// If theres no toggle link, add it
 					if ( !$toggle.length ) {
-						$collapsible.prepend( $toggleLink );
+						$toggleLink = buildDefaultToggleLink().prependTo( $collapsible );
 					} else {
-						$toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
-							opts = $.extend( {}, options, opts );
-							toggleLinkPremade( $toggle, e, opts );
-						} );
+						actionHandler = premadeToggleHandler;
+						$toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
 					}
 				}
 			}
 
-			// Initial state (only for those that are not custom,
-			// because the initial state of those has been taken care of already).
-			if (
-				( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) &&
-				( !$customTogglers || !$customTogglers.length )
-			) {
-				$collapsible.removeClass( 'mw-collapsed' );
-				// The collapsible element could have multiple togglers
-				// To toggle the initial state only click one of them (ie. the first one, eq(0) )
-				// Else it would go like: hide,show,hide,show for each toggle link.
-				// This is just like it would be in reality (only one toggle is clicked at a time).
-				$toggleLink.eq( 0 ).trigger( 'click', [ { instantHide: true } ] );
+			// Attributes for accessibility. This isn't necessary when the toggler is already
+			// an <a> or a <button> etc., but it doesn't hurt either, and it's consistent.
+			$toggleLink.prop( 'tabIndex', 0 );
+
+			// Initial state
+			if ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) {
+				// One toggler can hook to multiple elements, and one element can have
+				// multiple togglers. This is the sanest way to handle that.
+				actionHandler.call( $toggleLink.get( 0 ), null, { instantHide: true, wasCollapsed: false } );
 			}
 		} );
 	};
diff --git a/resources/jquery/jquery.placeholder.js b/resources/jquery/jquery.placeholder.js
index 7badb11a..8044d880 100644
--- a/resources/jquery/jquery.placeholder.js
+++ b/resources/jquery/jquery.placeholder.js
@@ -10,17 +10,22 @@
  */
 ( function ( $ ) {
 
-	$.fn.placeholder = function () {
+	$.fn.placeholder = function ( text ) {
+		var hasArg = arguments.length;
 
 		return this.each( function () {
 			var placeholder, $input;
 
+			if ( hasArg ) {
+				this.setAttribute( 'placeholder', text );
+			}
+
 			// If the HTML5 placeholder attribute is supported, use it
 			if ( this.placeholder && 'placeholder' in document.createElement( this.tagName ) ) {
 				return;
 			}
 
-			placeholder = this.getAttribute( 'placeholder' );
+			placeholder = hasArg ? text : this.getAttribute( 'placeholder' );
 			$input = $(this);
 
 			// Show initially, if empty
diff --git a/resources/jquery/jquery.spinner.css b/resources/jquery/jquery.spinner.css
index 4a775283..a9e06dbe 100644
--- a/resources/jquery/jquery.spinner.css
+++ b/resources/jquery/jquery.spinner.css
@@ -33,7 +33,7 @@
 .mw-spinner-inline {
 	display: inline-block;
 	vertical-align: middle;
-	
+
 	/* IE < 8 */
 	zoom: 1;
 	*display: inline;
diff --git a/resources/jquery/jquery.spinner.js b/resources/jquery/jquery.spinner.js
index 93e30b9a..27dabc6c 100644
--- a/resources/jquery/jquery.spinner.js
+++ b/resources/jquery/jquery.spinner.js
@@ -1,7 +1,9 @@
 /**
- * jQuery spinner
+ * jQuery Spinner
  *
  * Simple jQuery plugin to create, inject and remove spinners.
+ *
+ * @class jQuery.plugin.spinner
  */
 ( function ( $ ) {
 
@@ -15,36 +17,37 @@
 
 	$.extend({
 		/**
-		 * Creates a spinner element.
+		 * Create a spinner element
 		 *
 		 * The argument is an object with options used to construct the spinner. These can be:
 		 *
 		 * It is a good practice to keep a reference to the created spinner to be able to remove it later.
-		 * Alternatively one can use the id option and removeSpinner() (but make sure to choose an id
+		 * Alternatively one can use the id option and #removeSpinner (but make sure to choose an id
 		 * that's unlikely to cause conflicts, e.g. with extensions, gadgets or user scripts).
 		 *
 		 * CSS classes used:
-		 *   .mw-spinner for every spinner
-		 *   .mw-spinner-small / .mw-spinner-large for size
-		 *   .mw-spinner-block / .mw-spinner-inline for display types
+		 * - .mw-spinner for every spinner
+		 * - .mw-spinner-small / .mw-spinner-large for size
+		 * - .mw-spinner-block / .mw-spinner-inline for display types
 		 *
-		 * @example
 		 *   // Create a large spinner reserving all available horizontal space.
 		 *   var $spinner = $.createSpinner({ size: 'large', type: 'block' });
 		 *   // Insert above page content.
 		 *   $( '#mw-content-text' ).prepend( $spinner );
-		 * @example
+		 *
 		 *   // Place a small inline spinner next to the "Save" button
 		 *   var $spinner = $.createSpinner({ size: 'small', type: 'inline' });
 		 *   // Alternatively, just `$.createSpinner();` as these are the default options.
 		 *   $( '#wpSave' ).after( $spinner );
-		 * @example
+		 *
 		 *   // The following two are equivalent:
 		 *   $.createSpinner( 'magic' );
 		 *   $.createSpinner({ id: 'magic' });
 		 *
-		 * @param {Object|String} opts [optional] ID string or options:
-		 *  - id: If given, spinner will be given an id of "mw-spinner-<id>"
+		 * @static
+		 * @inheritable
+		 * @param {Object|string} [opts] ID string or options:
+		 *  - id: If given, spinner will be given an id of "mw-spinner-{id}"
 		 *  - size: 'small' (default) or 'large' for a 20-pixel or 32-pixel spinner
 		 *  - type: 'inline' (default) or 'block'. Inline creates an inline-block with width and
 		 *    height equal to spinner size. Block is a block-level element with width 100%, height
@@ -72,10 +75,12 @@
 		},
 
 		/**
-		 * Removes a spinner element.
+		 * Remove a spinner element
 		 *
-		 * @param {String} id [optional] Id of the spinner, as passed to createSpinner.
-		 * @return {jQuery} The (now detached) spinner.
+		 * @static
+		 * @inheritable
+		 * @param {string} id Id of the spinner, as passed to #createSpinner
+		 * @return {jQuery} The (now detached) spinner element
 		 */
 		removeSpinner: function ( id ) {
 			return $( '#mw-spinner-' + id ).remove();
@@ -83,13 +88,21 @@
 	});
 
 	/**
-	 * Injects a spinner after the elements in the jQuery collection
-	 * (as siblings, not children). Collection contents remain unchanged.
+	 * Inject a spinner after each element in the collection
+	 *
+	 * Inserts spinner as siblings, not children, of the target elements.
+	 * Collection contents remain unchanged.
 	 *
-	 * @param {Object|String} opts See createSpinner() for description.
+	 * @param {Object|string} [opts] See #createSpinner
 	 * @return {jQuery}
 	 */
 	$.fn.injectSpinner = function ( opts ) {
 		return this.after( $.createSpinner( opts ) );
 	};
+
+	/**
+	 * @class jQuery
+	 * @mixins jQuery.plugin.spinner
+	 */
+
 }( jQuery ) );
diff --git a/resources/jquery/jquery.suggestions.js b/resources/jquery/jquery.suggestions.js
index 44382f0d..28e2afc4 100644
--- a/resources/jquery/jquery.suggestions.js
+++ b/resources/jquery/jquery.suggestions.js
@@ -220,7 +220,7 @@ $.suggestions = {
 						} else {
 							// Expand from right
 							newCSS.left = 'auto';
-							newCSS.right = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
+							newCSS.right = $( document ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
 						}
 
 						context.data.$container.css( newCSS );
@@ -585,10 +585,12 @@ $.fn.suggestions = function () {
 					switch ( context.data.keypressed ) {
 						// This preventDefault logic is duplicated from
 						// $.suggestions.keypress(), which sucks
+						// Arrow down
 						case 40:
 							e.preventDefault();
 							e.stopImmediatePropagation();
 							break;
+						// Arrow up, Escape and Enter
 						case 38:
 						case 27:
 						case 13:
diff --git a/resources/jquery/jquery.tablesorter.js b/resources/jquery/jquery.tablesorter.js
index e08c9aaf..b3d7bb3d 100644
--- a/resources/jquery/jquery.tablesorter.js
+++ b/resources/jquery/jquery.tablesorter.js
@@ -8,8 +8,9 @@
  * http://www.opensource.org/licenses/mit-license.php
  * http://www.gnu.org/licenses/gpl.html
  *
- * Depends on mw.config (wgDigitTransformTable, wgMonthNames, wgMonthNamesShort,
- * wgDefaultDateFormat, wgContentLanguage)
+ * Depends on mw.config (wgDigitTransformTable, wgDefaultDateFormat, wgContentLanguage)
+ * and mw.language.months.
+ *
  * Uses 'tableSorterCollation' in mw.config (if available)
  */
 /**
@@ -287,44 +288,113 @@
 
 	function buildHeaders( table, msg ) {
 		var maxSeen = 0,
+			colspanOffset = 0,
 			longest,
-			realCellIndex = 0,
-			$tableHeaders = $( 'thead:eq(0) > tr', table );
-		if ( $tableHeaders.length > 1 ) {
-			$tableHeaders.each( function () {
-				if ( this.cells.length > maxSeen ) {
-					maxSeen = this.cells.length;
-					longest = this;
+			columns,
+			i,
+			$tableHeaders = $( [] ),
+			$tableRows = $( 'thead:eq(0) > tr', table );
+		if ( $tableRows.length <= 1 ) {
+			$tableHeaders = $tableRows.children( 'th' );
+		} else {
+			// We need to find the cells of the row containing the most columns
+			var rowspan,
+				headersIndex = [];
+			$tableRows.each( function ( rowIndex ) {
+				$.each( this.cells, function( index2, cell ) {
+					rowspan = Number( cell.rowSpan );
+					for ( i = 0; i < rowspan; i++ ) {
+						if ( headersIndex[rowIndex+i] === undefined ) {
+							headersIndex[rowIndex+i] = $( [] );
+						}
+						headersIndex[rowIndex+i].push( cell );
+					}
+				} );
+			} );
+			$.each( headersIndex, function ( index, cellArray ) {
+				if ( cellArray.length >= maxSeen ) {
+					maxSeen = cellArray.length;
+					longest = index;
 				}
-			});
-			$tableHeaders = $( longest );
+			} );
+			$tableHeaders = headersIndex[longest];
 		}
-		$tableHeaders = $tableHeaders.children( 'th' ).each( function ( index ) {
-			this.column = realCellIndex;
 
-			var colspan = this.colspan;
-			colspan = colspan ? parseInt( colspan, 10 ) : 1;
-			realCellIndex += colspan;
+		// as each header can span over multiple columns (using colspan=N),
+		// we have to bidirectionally map headers to their columns and columns to their headers
+		table.headerToColumns = [];
+		table.columnToHeader = [];
+
+		$tableHeaders.each( function ( headerIndex ) {
+			columns = [];
+			for ( i = 0; i < this.colSpan; i++ ) {
+				table.columnToHeader[ colspanOffset + i ] = headerIndex;
+				columns.push( colspanOffset + i );
+			}
+
+			table.headerToColumns[ headerIndex ] = columns;
+			colspanOffset += this.colSpan;
 
+			this.headerIndex = headerIndex;
 			this.order = 0;
 			this.count = 0;
 
-			if ( $( this ).is( '.unsortable' ) ) {
+			if ( $( this ).hasClass( table.config.unsortableClass ) ) {
 				this.sortDisabled = true;
 			}
 
 			if ( !this.sortDisabled ) {
-				$( this ).addClass( table.config.cssHeader ).attr( 'title', msg[1] );
+				$( this )
+					.addClass( table.config.cssHeader )
+					.prop( 'tabIndex', 0 )
+					.attr( {
+						role: 'columnheader button',
+						title: msg[1]
+					} );
 			}
 
 			// add cell to headerList
-			table.config.headerList[index] = this;
+			table.config.headerList[headerIndex] = this;
 		} );
 
 		return $tableHeaders;
 
 	}
 
+	/**
+	 * Sets the sort count of the columns that are not affected by the sorting to have them sorted
+	 * in default (ascending) order when their header cell is clicked the next time.
+	 *
+	 * @param {jQuery} $headers
+	 * @param {Number[][]} sortList
+	 * @param {Number[][]} headerToColumns
+	 */
+	function setHeadersOrder( $headers, sortList, headerToColumns ) {
+		// Loop through all headers to retrieve the indices of the columns the header spans across:
+		$.each( headerToColumns, function( headerIndex, columns ) {
+
+			$.each( columns, function( i, columnIndex ) {
+				var header = $headers[headerIndex];
+
+				if ( !isValueInArray( columnIndex, sortList ) ) {
+					// Column shall not be sorted: Reset header count and order.
+					header.order = 0;
+					header.count = 0;
+				} else {
+					// Column shall be sorted: Apply designated count and order.
+					$.each( sortList, function( j, sortColumn ) {
+						if ( sortColumn[0] === i ) {
+							header.order = sortColumn[1];
+							header.count = sortColumn[1] + 1;
+							return false;
+						}
+					} );
+				}
+			} );
+
+		} );
+	}
+
 	function isValueInArray( v, a ) {
 		var l = a.length;
 		for ( var i = 0; i < l; i++ ) {
@@ -407,12 +477,15 @@
 		var regex = [];
 		ts.monthNames = {};
 
-		for ( var i = 1; i < 13; i++ ) {
-			var name = mw.config.get( 'wgMonthNames' )[i].toLowerCase();
-			ts.monthNames[name] = i;
+		for ( var i = 0; i < 12; i++ ) {
+			var name = mw.language.months.names[i].toLowerCase();
+			ts.monthNames[name] = i + 1;
 			regex.push( $.escapeRE( name ) );
-			name = mw.config.get( 'wgMonthNamesShort' )[i].toLowerCase().replace( '.', '' );
-			ts.monthNames[name] = i;
+			name = mw.language.months.genitive[i].toLowerCase();
+			ts.monthNames[name] = i + 1;
+			regex.push( $.escapeRE( name ) );
+			name = mw.language.months.abbrev[i].toLowerCase().replace( '.', '' );
+			ts.monthNames[name] = i + 1;
 			regex.push( $.escapeRE( name ) );
 		}
 
@@ -424,10 +497,10 @@
 		ts.dateRegex[0] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i);
 
 		// Written Month name, dmy
-		ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*(\\d{2,4})\\s*$', 'i' );
+		ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
 
 		// Written Month name, mdy
-		ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*(\\d{1,2})[\\,\\.\\-\\/\'\\s]*(\\d{2,4})\\s*$', 'i' );
+		ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
 
 	}
 
@@ -572,7 +645,7 @@
 		$.each( sortObjects, function( i, sortObject ) {
 			$.each ( sortObject, function( columnIndex, order ) {
 				var orderIndex = ( order === 'desc' ) ? 1 : 0;
-				sortList.push( [columnIndex, orderIndex] );
+				sortList.push( [parseInt( columnIndex, 10 ), orderIndex] );
 			} );
 		} );
 		return sortList;
@@ -590,6 +663,7 @@
 				sortInitialOrder: 'asc',
 				sortMultiSortKey: 'shiftKey',
 				sortLocaleCompare: false,
+				unsortableClass: 'unsortable',
 				parsers: {},
 				widgets: [],
 				headers: {},
@@ -611,7 +685,6 @@
 				return $tables.each( function ( i, table ) {
 					// Declare and cache.
 					var $headers, cache, config,
-						headerToColumns, columnToHeader, colspanOffset,
 						$table = $( table ),
 						firstTime = true;
 
@@ -648,10 +721,9 @@
 					// Build headers
 					$headers = buildHeaders( table, sortMsg );
 
-					// Grab and process locale settings
+					// Grab and process locale settings.
 					buildTransformTable();
 					buildDateTable();
-					buildCollationTable();
 
 					// Precaching regexps can bring 10 fold
 					// performance improvements in some browsers.
@@ -660,6 +732,12 @@
 					function setupForFirstSort() {
 						firstTime = false;
 
+						// Defer buildCollationTable to first sort. As user and site scripts
+						// may customize tableSorterCollation but load after $.ready(), other
+						// scripts may call .tablesorter() before they have done the
+						// tableSorterCollation customizations.
+						buildCollationTable();
+
 						// Legacy fix of .sortbottoms
 						// Wrap them inside inside a tfoot (because that's what they actually want to be) &
 						// and put the <tfoot> at the end of the <table>
@@ -679,28 +757,17 @@
 						table.config.parsers = buildParserCache( table, $headers );
 					}
 
-					// as each header can span over multiple columns (using colspan=N),
-					// we have to bidirectionally map headers to their columns and columns to their headers
-					headerToColumns = [];
-					columnToHeader = [];
-					colspanOffset = 0;
-					$headers.each( function ( headerIndex ) {
-						var columns = [];
-						for ( var i = 0; i < this.colSpan; i++ ) {
-							columnToHeader[ colspanOffset + i ] = headerIndex;
-							columns.push( colspanOffset + i );
-						}
-
-						headerToColumns[ headerIndex ] = columns;
-						colspanOffset += this.colSpan;
-					} );
-
 					// Apply event handling to headers
 					// this is too big, perhaps break it out?
-					$headers.filter( ':not(.unsortable)' ).click( function ( e ) {
-						if ( e.target.nodeName.toLowerCase() === 'a' ) {
-							// The user clicked on a link inside a table header
-							// Do nothing and let the default link click action continue
+					$headers.not( '.' + table.config.unsortableClass ).on( 'keypress click', function ( e ) {
+						if ( e.type === 'click' && e.target.nodeName.toLowerCase() === 'a' ) {
+							// The user clicked on a link inside a table header.
+							// Do nothing and let the default link click action continue.
+							return true;
+						}
+
+						if ( e.type === 'keypress' && e.which !== 13 ) {
+							// Only handle keypresses on the "Enter" key.
 							return true;
 						}
 
@@ -724,7 +791,7 @@
 
 							var cell = this;
 							// Get current column index
-							var columns = headerToColumns[this.column];
+							var columns = table.headerToColumns[ this.headerIndex ];
 							var newSortList = $.map( columns, function (c) {
 								// jQuery "helpfully" flattens the arrays...
 								return [[c, cell.order]];
@@ -758,8 +825,11 @@
 								}
 							}
 
+							// Reset order/counts of cells not affected by sorting
+							setHeadersOrder( $headers, config.sortList, table.headerToColumns );
+
 							// Set CSS for headers
-							setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg, columnToHeader );
+							setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg, table.columnToHeader );
 							appendToTable(
 								$table[0], multisort( $table[0], config.sortList, cache )
 							);
@@ -798,11 +868,15 @@
 							sortList = convertSortList( sortList );
 						}
 
+						// Set each column's sort count to be able to determine the correct sort
+						// order when clicking on a header cell the next time
+						setHeadersOrder( $headers, sortList, table.headerToColumns );
+
 						// re-build the cache for the tbody cells
 						cache = buildCache( table );
 
 						// set css for headers
-						setHeadersCss( table, $headers, sortList, sortCSS, sortMsg, columnToHeader );
+						setHeadersCss( table, $headers, sortList, sortCSS, sortMsg, table.columnToHeader );
 
 						// sort the table and append it to the dom
 						appendToTable( table, multisort( table, sortList, cache ) );
diff --git a/resources/jquery/jquery.textSelection.js b/resources/jquery/jquery.textSelection.js
index daff9d93..2b5a4406 100644
--- a/resources/jquery/jquery.textSelection.js
+++ b/resources/jquery/jquery.textSelection.js
@@ -89,7 +89,7 @@
 			 * Ported from skins/common/edit.js by Trevor Parscal
 			 * (c) 2009 Wikimedia Foundation (GPLv2) - http://www.wikimedia.org
 			 *
-			 * Inserts text at the begining and end of a text selection, optionally
+			 * Inserts text at the beginning and end of a text selection, optionally
 			 * inserting text at the caret when selection is empty.
 			 *
 			 * @fixme document the options parameters
@@ -257,7 +257,7 @@
 			 * Some code copied from
 			 * http://www.dedestruct.com/2008/03/22/howto-cross-browser-cursor-position-in-textareas/
 			 *
-			 * Get the position (in resolution of bytes not nessecarily characters)
+			 * Get the position (in resolution of bytes not necessarily characters)
 			 * in a textarea
 			 *
 			 * Will focus the textarea in some browsers (IE/Opera)
diff --git a/resources/mediawiki.action/images/green-checkmark.png b/resources/mediawiki.action/images/green-checkmark.png
new file mode 100644
index 00000000..8ec604ea
Binary files /dev/null and b/resources/mediawiki.action/images/green-checkmark.png differ
diff --git a/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css b/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css
new file mode 100644
index 00000000..1af4a7a0
--- /dev/null
+++ b/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.css
@@ -0,0 +1,17 @@
+/* Styles for collapsible lists of templates used and hidden categories */
+.mw-editfooter-toggler {
+	cursor: pointer;
+	background-position: left center;
+	padding-left: 16px;
+}
+
+.mw-editfooter-list {
+	margin-bottom: 1em;
+	margin-left: 2.5em;
+}
+
+/* Show/hide animation is incorrect if the table has a margin set. Extra
+ * "table.wikitable" is needed in the selector for CSS specificity. */
+table.wikitable.preview-limit-report {
+	margin: 0;
+}
diff --git a/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js b/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js
new file mode 100644
index 00000000..7ae51aba
--- /dev/null
+++ b/resources/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js
@@ -0,0 +1,54 @@
+jQuery( document ).ready( function ( $ ) {
+	var collapsibleLists, i, handleOne;
+
+	// Collapsible lists of categories and templates
+	collapsibleLists = [
+		{
+			$list: $( '.templatesUsed ul' ),
+			$toggler: $( '.mw-templatesUsedExplanation' ),
+			cookieName: 'templates-used-list'
+		},
+		{
+			$list: $( '.hiddencats ul' ),
+			$toggler: $( '.mw-hiddenCategoriesExplanation' ),
+			cookieName: 'hidden-categories-list'
+		},
+		{
+			$list: $( '.preview-limit-report-wrapper' ),
+			$toggler: $( '.mw-limitReportExplanation' ),
+			cookieName: 'preview-limit-report'
+		}
+	];
+
+	handleOne = function ( $list, $toggler, cookieName ) {
+		var isCollapsed = $.cookie( cookieName ) !== 'expanded';
+
+		// Style the toggler with an arrow icon and add a tabIndex and a role for accessibility
+		$toggler.addClass( 'mw-editfooter-toggler' ).prop( 'tabIndex', 0 ).attr( 'role', 'button' );
+		$list.addClass( 'mw-editfooter-list' );
+
+		$list.makeCollapsible( {
+			$customTogglers: $toggler,
+			linksPassthru: true,
+			plainMode: true,
+			collapsed: isCollapsed
+		} );
+
+		$toggler.addClass( isCollapsed ? 'mw-icon-arrow-collapsed' : 'mw-icon-arrow-expanded' );
+
+		$list.on( 'beforeExpand.mw-collapsible', function () {
+			$toggler.removeClass( 'mw-icon-arrow-collapsed' ).addClass( 'mw-icon-arrow-expanded' );
+			$.cookie( cookieName, 'expanded' );
+		} );
+
+		$list.on( 'beforeCollapse.mw-collapsible', function () {
+			$toggler.removeClass( 'mw-icon-arrow-expanded' ).addClass( 'mw-icon-arrow-collapsed' );
+			$.cookie( cookieName, 'collapsed' );
+		} );
+	};
+
+	for ( i = 0; i < collapsibleLists.length; i++ ) {
+		// Pass to a function for iteration-local variables
+		handleOne( collapsibleLists[i].$list, collapsibleLists[i].$toggler, collapsibleLists[i].cookieName );
+	}
+} );
diff --git a/resources/mediawiki.action/mediawiki.action.edit.editWarning.js b/resources/mediawiki.action/mediawiki.action.edit.editWarning.js
new file mode 100644
index 00000000..89bb64df
--- /dev/null
+++ b/resources/mediawiki.action/mediawiki.action.edit.editWarning.js
@@ -0,0 +1,56 @@
+/*
+ * Javascript for module editWarning
+ */
+( function ( mw, $ ) {
+	$( function () {
+		// Check if EditWarning is enabled and if we need it
+		if ( $( '#wpTextbox1' ).length === 0 ) {
+			return true;
+		}
+		// Get the original values of some form elements
+		$( '#wpTextbox1, #wpSummary' ).each( function () {
+			$( this ).data( 'origtext', $( this ).val() );
+		});
+		var savedWindowOnBeforeUnload;
+		$( window )
+			.on( 'beforeunload.editwarning', function () {
+				var retval;
+
+				// Check if the current values of some form elements are the same as
+				// the original values
+				if (
+					mw.config.get( 'wgAction' ) === 'submit' ||
+						$( '#wpTextbox1' ).data( 'origtext' ) !== $( '#wpTextbox1' ).val() ||
+						$( '#wpSummary' ).data( 'origtext' ) !== $( '#wpSummary' ).val()
+				) {
+					// Return our message
+					retval = mw.msg( 'editwarning-warning' );
+				}
+
+				// Unset the onbeforeunload handler so we don't break page caching in Firefox
+				savedWindowOnBeforeUnload = window.onbeforeunload;
+				window.onbeforeunload = null;
+				if ( retval !== undefined ) {
+					// ...but if the user chooses not to leave the page, we need to rebind it
+					setTimeout( function () {
+						window.onbeforeunload = savedWindowOnBeforeUnload;
+					}, 1 );
+					return retval;
+				}
+			} )
+			.on( 'pageshow.editwarning', function () {
+				// Re-add onbeforeunload handler
+				if ( !window.onbeforeunload ) {
+					window.onbeforeunload = savedWindowOnBeforeUnload;
+				}
+			} );
+
+		// Add form submission handler
+		$( '#editform' ).submit( function () {
+			// Unbind our handlers
+			$( window ).off( '.editwarning' );
+		} );
+	} );
+
+}( mediaWiki, jQuery ) );
+
diff --git a/resources/mediawiki.action/mediawiki.action.edit.js b/resources/mediawiki.action/mediawiki.action.edit.js
index 2835c9cc..ba711aae 100644
--- a/resources/mediawiki.action/mediawiki.action.edit.js
+++ b/resources/mediawiki.action/mediawiki.action.edit.js
@@ -1,17 +1,20 @@
+/**
+ * Interface for the classic edit toolbar.
+ *
+ * @class mw.toolbar
+ * @singleton
+ */
 ( function ( mw, $ ) {
-	var isReady, toolbar, currentFocused, queue, $toolbar, slice;
-
-	isReady = false;
-	queue = [];
-	$toolbar = false;
-	slice = Array.prototype.slice;
+	var toolbar, isReady, $toolbar, queue, slice, $currentFocused;
 
 	/**
-	 * Internal helper that does the actual insertion
-	 * of the button into the toolbar.
-	 * See mw.toolbar.addButton for parameter documentation.
+	 * Internal helper that does the actual insertion of the button into the toolbar.
+	 *
+	 * See #addButton for parameter documentation.
+	 *
+	 * @private
 	 */
-	function insertButton( b /* imageFile */, speedTip, tagOpen, tagClose, sampleText, imageId, selectText ) {
+	function insertButton( b, speedTip, tagOpen, tagClose, sampleText, imageId ) {
 		// Backwards compatibility
 		if ( typeof b !== 'object' ) {
 			b = {
@@ -20,11 +23,10 @@
 				tagOpen: tagOpen,
 				tagClose: tagClose,
 				sampleText: sampleText,
-				imageId: imageId,
-				selectText: selectText
+				imageId: imageId
 			};
 		}
-		var $image = $( '<img>', {
+		var $image = $( '<img>' ).attr( {
 			width : 23,
 			height: 22,
 			src   : b.imageFile,
@@ -33,30 +35,43 @@
 			id    : b.imageId || undefined,
 			'class': 'mw-toolbar-editbutton'
 		} ).click( function () {
-			toolbar.insertTags( b.tagOpen, b.tagClose, b.sampleText, b.selectText );
+			toolbar.insertTags( b.tagOpen, b.tagClose, b.sampleText );
 			return false;
 		} );
 
 		$toolbar.append( $image );
-		return true;
 	}
 
+	isReady = false;
+	$toolbar = false;
+	/**
+	 * @private
+	 * @property {Array}
+	 * Contains button objects (and for backwards compatibilty, it can
+	 * also contains an arguments array for insertButton).
+	 */
+	queue = [];
+	slice = queue.slice;
+
 	toolbar = {
+
 		/**
 		 * Add buttons to the toolbar.
+		 *
 		 * Takes care of race conditions and time-based dependencies
 		 * by placing buttons in a queue if this method is called before
 		 * the toolbar is created.
-		 * @param {Object} button: Object with the following properties:
-		 * - imageFile
-		 * - speedTip
-		 * - tagOpen
-		 * - tagClose
-		 * - sampleText
-		 * - imageId
-		 * - selectText
-		 * For compatiblity, passing the above as separate arguments
+		 *
+		 * For compatiblity, passing the properties listed below as separate arguments
 		 * (in the listed order) is also supported.
+		 *
+		 * @param {Object} button Object with the following properties:
+		 * @param {string} button.imageFile
+		 * @param {string} button.speedTip
+		 * @param {string} button.tagOpen
+		 * @param {string} button.tagClose
+		 * @param {string} button.sampleText
+		 * @param {string} [button.imageId]
 		 */
 		addButton: function () {
 			if ( isReady ) {
@@ -66,18 +81,44 @@
 				queue.push( slice.call( arguments ) );
 			}
 		},
+		/**
+		 * Example usage:
+		 *     addButtons( [ { .. }, { .. }, { .. } ] );
+		 *     addButtons( { .. }, { .. } );
+		 *
+		 * @param {Object|Array} [buttons...] An array of button objects or the first
+		 *  button object in a list of variadic arguments.
+		 */
+		addButtons: function ( buttons ) {
+			if ( !$.isArray( buttons ) ) {
+				buttons = slice.call( arguments );
+			}
+			if ( isReady ) {
+				$.each( buttons, function () {
+					insertButton( this );
+				} );
+			} else {
+				// Push each button into the queue
+				queue.push.apply( queue, buttons );
+			}
+		},
 
 		/**
-		 * Apply tagOpen/tagClose to selection in textarea,
-		 * use sampleText instead of selection if there is none.
+		 * Apply tagOpen/tagClose to selection in currently focused textarea.
+		 *
+		 * Uses `sampleText` if selection is empty.
+		 *
+		 * @param {string} tagOpen
+		 * @param {string} tagClose
+		 * @param {string} sampleText
 		 */
 		insertTags: function ( tagOpen, tagClose, sampleText ) {
-			if ( currentFocused && currentFocused.length ) {
-				currentFocused.textSelection(
+			if ( $currentFocused && $currentFocused.length ) {
+				$currentFocused.textSelection(
 					'encapsulateSelection', {
-						'pre': tagOpen,
-						'peri': sampleText,
-						'post': tagClose
+						pre: tagOpen,
+						peri: sampleText,
+						post: tagClose
 					}
 				);
 			}
@@ -95,64 +136,58 @@
 	// Explose API publicly
 	mw.toolbar = toolbar;
 
-	$( document ).ready( function () {
-		var buttons, i, b, $iframe;
+	$( function () {
+		var i, b, $iframe, editBox, scrollTop, $editForm;
 
 		// currentFocus is used to determine where to insert tags
-		currentFocused = $( '#wpTextbox1' );
+		$currentFocused = $( '#wpTextbox1' );
 
 		// Populate the selector cache for $toolbar
 		$toolbar = $( '#toolbar' );
 
-		// Legacy: Merge buttons from mwCustomEditButtons
-		buttons = [].concat( queue, window.mwCustomEditButtons );
-		// Clear queue
-		queue.length = 0;
-		for ( i = 0; i < buttons.length; i++ ) {
-			b = buttons[i];
+		for ( i = 0; i < queue.length; i++ ) {
+			b = queue[i];
 			if ( $.isArray( b ) ) {
 				// Forwarded arguments array from mw.toolbar.addButton
 				insertButton.apply( toolbar, b );
 			} else {
-				// Raw object from legacy mwCustomEditButtons
+				// Raw object from mw.toolbar.addButtons
 				insertButton( b );
 			}
 		}
 
+		// Clear queue
+		queue.length = 0;
+
 		// This causes further calls to addButton to go to insertion directly
-		// instead of to the toolbar.buttons queue.
+		// instead of to the queue.
 		// It is important that this is after the one and only loop through
-		// the the toolbar.buttons queue
+		// the the queue
 		isReady = true;
 
 		// Make sure edit summary does not exceed byte limit
 		$( '#wpSummary' ).byteLimit( 255 );
 
-		/**
-		 * Restore the edit box scroll state following a preview operation,
-		 * and set up a form submission handler to remember this state
-		 */
-		( function scrollEditBox() {
-			var editBox, scrollTop, $editForm;
-
-			editBox = document.getElementById( 'wpTextbox1' );
-			scrollTop = document.getElementById( 'wpScrolltop' );
-			$editForm = $( '#editform' );
-			if ( $editForm.length && editBox && scrollTop ) {
-				if ( scrollTop.value ) {
-					editBox.scrollTop = scrollTop.value;
-				}
-				$editForm.submit( function () {
-					scrollTop.value = editBox.scrollTop;
-				});
+		// Restore the edit box scroll state following a preview operation,
+		// and set up a form submission handler to remember this state.
+		editBox = document.getElementById( 'wpTextbox1' );
+		scrollTop = document.getElementById( 'wpScrolltop' );
+		$editForm = $( '#editform' );
+		if ( $editForm.length && editBox && scrollTop ) {
+			if ( scrollTop.value ) {
+				editBox.scrollTop = scrollTop.value;
 			}
-		}() );
+			$editForm.submit( function () {
+				scrollTop.value = editBox.scrollTop;
+			});
+		}
 
-		$( 'textarea, input:text' ).focus( function () {
-			currentFocused = $(this);
-		});
+		// Apply to dynamically created textboxes as well as normal ones
+		$( document ).on( 'focus', 'textarea, input:text', function () {
+			$currentFocused = $( this );
+		} );
 
-		// HACK: make currentFocused work with the usability iframe
+		// HACK: make $currentFocused work with the usability iframe
 		// With proper focus detection support (HTML 5!) this'll be much cleaner
 		// TODO: Get rid of this WikiEditor code from MediaWiki core!
 		$iframe = $( '.wikiEditor-ui-text iframe' );
@@ -161,7 +196,7 @@
 				// for IE
 				.add( $iframe.get( 0 ).contentWindow.document.body )
 				.focus( function () {
-					currentFocused = $iframe;
+					$currentFocused = $iframe;
 				} );
 		}
 	});
diff --git a/resources/mediawiki.action/mediawiki.action.edit.preview.js b/resources/mediawiki.action/mediawiki.action.edit.preview.js
index 602aadb0..c5cd61ef 100644
--- a/resources/mediawiki.action/mediawiki.action.edit.preview.js
+++ b/resources/mediawiki.action/mediawiki.action.edit.preview.js
@@ -7,14 +7,16 @@
 	 * @param {jQuery.Event} e
 	 */
 	function doLivePreview( e ) {
-		var $wikiPreview, copySelectors, removeSelectors, $copyElements, $spinner,
+		var $wikiPreview, $editform, copySelectors, $copyElements, $spinner,
 			targetUrl, postData, $previewDataHolder;
 
 		e.preventDefault();
 
+		// Deprecated: Use mw.hook instead
 		$( mw ).trigger( 'LivePreviewPrepare' );
 
 		$wikiPreview = $( '#wikiPreview' );
+		$editform = $( '#editform' );
 
 		// Show #wikiPreview if it's hidden to be able to scroll to it
 		// (if it is hidden, it's also empty, so nothing changes in the rendering)
@@ -34,16 +36,13 @@
 			'#p-lang',
 			// Editing-related
 			'.templatesUsed',
+			'.limitreport',
 			'.mw-summary-preview'
 		];
 		$copyElements = $( copySelectors.join( ',' ) );
 
 		// Not shown during normal preview, to be removed if present
-		removeSelectors = [
-			'.mw-newarticletext'
-		];
-
-		$( removeSelectors.join( ',' ) ).remove();
+		$( '.mw-newarticletext' ).remove();
 
 		$spinner = $.createSpinner( {
 			size: 'large',
@@ -51,36 +50,29 @@
 		});
 		$wikiPreview.before( $spinner );
 		$spinner.css( {
-			position: 'absolute',
 			marginTop: $spinner.height()
 		} );
-		// Make sure preview area is at least as tall as 2x the height of the spinner.
-		// 1x because if its smaller, it will spin behind the edit toolbar.
-		// (this happens on the first preview when editPreview is still empty)
-		// 2x because the spinner has 1x margin top breathing room.
-		$wikiPreview.css( 'minHeight', $spinner.height() * 2 );
 
 		// Can't use fadeTo because it calls show(), and we might want to keep some elements hidden
 		// (e.g. empty #catlinks)
-		$copyElements.animate( {
-			opacity: 0.4
-		}, 'fast' );
+		$copyElements.animate( { opacity: 0.4 }, 'fast' );
 
 		$previewDataHolder = $( '<div>' );
-		targetUrl = $( '#editform' ).attr( 'action' );
+		targetUrl = $editform.attr( 'action' );
 
 		// Gather all the data from the form
-		postData = $( '#editform' ).formToArray();
+		postData = $editform.formToArray();
 		postData.push( {
 			name: e.target.name,
 			value: ''
 		} );
 
 		// Load new preview data.
-		// TODO: This should use the action=parse API instead of loading the entire page
-		// Though that requires figuring out how to conver that raw data into proper HTML.
+		// TODO: This should use the action=parse API instead of loading the entire page,
+		// although that requires figuring out how to convert that raw data into proper HTML.
 		$previewDataHolder.load( targetUrl + ' ' + copySelectors.join( ',' ), postData, function () {
 			var i, $from;
+
 			// Copy the contents of the specified elements from the loaded page to the real page.
 			// Also copy their class attributes.
 			for ( i = 0; i < copySelectors.length; i++ ) {
@@ -92,16 +84,19 @@
 					.attr( 'class', $from.attr( 'class' ) );
 			}
 
+			// Deprecated: Use mw.hook instead
+			$( mw ).trigger( 'LivePreviewDone', [copySelectors] );
+
+			mw.hook( 'wikipage.content' ).fire( $wikiPreview );
+
 			$spinner.remove();
 			$copyElements.animate( {
 				opacity: 1
 			}, 'fast' );
-
-			$( mw ).trigger( 'LivePreviewDone', [copySelectors] );
 		} );
 	}
 
-	$( document ).ready( function () {
+	$( function () {
 		// Do not enable on user .js/.css pages, as there's no sane way of "previewing"
 		// the scripts or styles without reloading the page.
 		if ( $( '#mw-userjsyoucanpreview' ).length || $( '#mw-usercssyoucanpreview' ).length ) {
@@ -109,32 +104,32 @@
 		}
 
 		// The following elements can change in a preview but are not output
-		// by the server when they're empty until the preview reponse.
+		// by the server when they're empty until the preview response.
 		// TODO: Make the server output these always (in a hidden state), so we don't
 		// have to fish and (hopefully) put them in the right place (since skins
 		// can change where they are output).
 
 		if ( !document.getElementById( 'p-lang' ) && document.getElementById( 'p-tb' ) ) {
 			$( '#p-tb' ).after(
-				$( '<div>' ).prop( 'id', 'p-lang' )
+				$( '<div>' ).attr( 'id', 'p-lang' )
 			);
 		}
 
 		if ( !$( '.mw-summary-preview' ).length ) {
 			$( '.editCheckboxes' ).before(
-				$( '<div>' ).prop( 'className', 'mw-summary-preview' )
+				$( '<div>' ).addClass( 'mw-summary-preview' )
 			);
 		}
 
 		if ( !document.getElementById( 'wikiDiff' ) && document.getElementById( 'wikiPreview' ) ) {
 			$( '#wikiPreview' ).after(
-				$( '<div>' ).prop( 'id', 'wikiDiff')
+				$( '<div>' ).attr( 'id', 'wikiDiff' )
 			);
 		}
 
-		// Make sure diff styles are loaded
-		mw.loader.load( 'mediawiki.action.history.diff' );
-
+		// This should be moved down to '#editform', but is kept on the body for now
+		// because the LiquidThreads extension is re-using this module with only half
+		// the EditPage (doesn't include #editform presumably, bug 55463).
 		$( document.body ).on( 'click', '#wpPreview, #wpDiff', doLivePreview );
 	} );
 
diff --git a/resources/mediawiki.action/mediawiki.action.edit.styles.css b/resources/mediawiki.action/mediawiki.action.edit.styles.css
new file mode 100644
index 00000000..4a2bab3d
--- /dev/null
+++ b/resources/mediawiki.action/mediawiki.action.edit.styles.css
@@ -0,0 +1,44 @@
+/**
+ * Styles for elements of the editing form.
+ */
+
+/* General layout */
+#wpTextbox1 {
+	margin: 0;
+	display: block;
+}
+
+.editOptions {
+	background-color: #F0F0F0;
+	border: 1px solid silver;
+	border-top: none;
+	padding: 1em 1em 1.5em 1em;
+	margin-bottom: 2em;
+}
+
+/* Adjustments to edit form elements */
+.editCheckboxes {
+	margin-bottom: 1em;
+}
+
+.editCheckboxes input:first-child {
+	margin-left: 0;
+}
+
+.cancelLink {
+	margin-left: 0.5em;
+}
+
+#editpage-copywarn {
+	font-size: 0.9em;
+}
+
+#wpSummary {
+	display: block;
+	margin-top: 0;
+	margin-bottom: 0.5em;
+}
+
+.editButtons input:first-child {
+	margin-left: .1em;
+}
diff --git a/resources/mediawiki.action/mediawiki.action.history.js b/resources/mediawiki.action/mediawiki.action.history.js
index e9d320c1..04f045a5 100644
--- a/resources/mediawiki.action/mediawiki.action.history.js
+++ b/resources/mediawiki.action/mediawiki.action.history.js
@@ -1,7 +1,7 @@
 /**
  * JavaScript for History action
  */
-jQuery( document ).ready( function ( $ ) {
+jQuery( function ( $ ) {
 	var	$historyCompareForm = $( '#mw-history-compare' ),
 		$historySubmitter,
 		$lis = $( '#pagehistory > li' );
diff --git a/resources/mediawiki.action/mediawiki.action.view.postEdit.css b/resources/mediawiki.action/mediawiki.action.view.postEdit.css
new file mode 100644
index 00000000..be88337e
--- /dev/null
+++ b/resources/mediawiki.action/mediawiki.action.view.postEdit.css
@@ -0,0 +1,77 @@
+.postedit-container {
+	margin: 0 auto;
+	position: fixed;
+	top: 0;
+	height: 0;
+	left: 50%;
+	z-index: 1000;
+	font-size: 13px;
+}
+
+.postedit-container:hover {
+	cursor: pointer;
+}
+
+.postedit {
+	position: relative;
+	top: 0.6em;
+	left: -50%;
+	padding: .6em 3.6em .6em 1.1em;
+	line-height: 1.5625em;
+	color: #626465;
+	background-color: #f4f4f4;
+	border: 1px solid #dcd9d9;
+	text-shadow: 0 0.0625em 0 rgba(255, 255, 255, 0.5);
+	border-radius: 5px;
+	-webkit-box-shadow: 0 2px 5px 0 #ccc;
+	box-shadow: 0 2px 5px 0 #ccc;
+	-webkit-transition: all 0.25s ease-in-out;
+	-moz-transition: all 0.25s ease-in-out;
+	-ms-transition: all 0.25s ease-in-out;
+	-o-transition: all 0.25s ease-in-out;
+	transition: all 0.25s ease-in-out;
+}
+
+.skin-monobook .postedit {
+	top: 6em !important;
+}
+
+.postedit-faded {
+	opacity: 0;
+}
+
+.postedit-icon {
+	padding-left: 41px; /* 25 + 8 + 8 */
+	/* like min-height, but old IE compatible and keeps text vertically aligned, too */
+	line-height: 25px;
+	background-repeat: no-repeat;
+	background-position: 8px 50%;
+}
+
+.postedit-icon-checkmark {
+	/* @embed */
+	background-image: url(images/green-checkmark.png);
+	background-position: left;
+}
+
+.postedit-close {
+	position: absolute;
+	padding: 0 .8em;
+	right: 0;
+	top: 0;
+	font-size: 1.25em;
+	font-weight: bold;
+	line-height: 2.3em;
+	color: black;
+	text-shadow: 0 0.0625em 0 white;
+	text-decoration: none;
+	opacity: 0.2;
+	filter: alpha(opacity=20);
+}
+
+.postedit-close:hover {
+	color: black;
+	text-decoration: none;
+	opacity: 0.4;
+	filter: alpha(opacity=40);
+}
diff --git a/resources/mediawiki.action/mediawiki.action.view.postEdit.js b/resources/mediawiki.action/mediawiki.action.view.postEdit.js
index a11233fa..6e4df9f0 100644
--- a/resources/mediawiki.action/mediawiki.action.view.postEdit.js
+++ b/resources/mediawiki.action/mediawiki.action.view.postEdit.js
@@ -1,15 +1,76 @@
 ( function ( mw, $ ) {
-	// Only a view can be a post-edit.
-	if ( mw.config.get( 'wgAction' ) !== 'view' ) {
-		return;
+	'use strict';
+
+	/**
+	 * @event postEdit
+	 * @member mw.hook
+	 * @param {Object} [data] Optional data
+	 * @param {string|jQuery|Array} [data.message] Message that listeners
+	 *  should use when displaying notifications. String for plain text,
+	 *  use array or jQuery object to pass actual nodes.
+	 * @param {string|mw.user} [data.user=mw.user] User that made the edit.
+	 */
+
+	/**
+	 * After the listener for #postEdit removes the notification.
+	 *
+	 * @event postEdit_afterRemoval
+	 * @member mw.hook
+	 */
+
+	var config = mw.config.get( [ 'wgAction', 'wgCookiePrefix', 'wgCurRevisionId' ] ),
+		// This should match EditPage::POST_EDIT_COOKIE_KEY_PREFIX:
+		cookieKey = config.wgCookiePrefix + 'PostEditRevision' + config.wgCurRevisionId,
+		$div, id;
+
+	function showConfirmation( data ) {
+		data = data || {};
+		if ( data.message === undefined ) {
+			data.message = $.parseHTML( mw.message( 'postedit-confirmation', data.user || mw.user ).escaped() );
+		}
+
+		$div = $(
+			'<div class="postedit-container">' +
+				'<div class="postedit">' +
+					'<div class="postedit-icon postedit-icon-checkmark postedit-content"></div>' +
+					'<a href="#" class="postedit-close">&times;</a>' +
+				'</div>' +
+			'</div>'
+		);
+
+		if ( typeof data.message === 'string' ) {
+			$div.find( '.postedit-content' ).text( data.message );
+		} else if ( typeof data.message === 'object' ) {
+			$div.find( '.postedit-content' ).append( data.message );
+		}
+
+		$div
+			.click( fadeOutConfirmation )
+			.prependTo( 'body' );
+
+		id = setTimeout( fadeOutConfirmation, 3000 );
 	}
 
-	// Matches EditPage::POST_EDIT_COOKIE_KEY_PREFIX
-	var cookieKey = mw.config.get( 'wgCookiePrefix' ) + 'PostEditRevision' + mw.config.get( 'wgCurRevisionId' );
+	function fadeOutConfirmation() {
+		clearTimeout( id );
+		$div.find( '.postedit' ).addClass( 'postedit postedit-faded' );
+		setTimeout( removeConfirmation, 500 );
 
-	if ( $.cookie( cookieKey ) === '1' ) {
-		// We just saved this page
+		return false;
+	}
+
+	function removeConfirmation() {
+		$div.remove();
+		mw.hook( 'postEdit.afterRemoval' ).fire();
+	}
+
+	mw.hook( 'postEdit' ).add( showConfirmation );
+
+	if ( config.wgAction === 'view' && $.cookie( cookieKey ) === '1' ) {
 		$.cookie( cookieKey, null, { path: '/' } );
 		mw.config.set( 'wgPostEdit', true );
+
+		mw.hook( 'postEdit' ).fire();
 	}
+
 } ( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js b/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
index 61d9d150..93befe3a 100644
--- a/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
+++ b/resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
@@ -5,10 +5,10 @@
  */
 jQuery( function ( $ ) {
 	// Select all h1-h6 elements that contain editsection links
-	// Don't use the ":has:(.editsection a)" selector because it performs very bad.
+	// Don't use the ":has:(.mw-editsection a)" selector because it performs very bad.
 	// http://jsperf.com/jq-1-7-2-vs-jq-1-8-1-performance-of-mw-has/2
 	$( document ).on( 'contextmenu', 'h1, h2, h3, h4, h5, h6', function ( e ) {
-		var $edit = $( this ).find( '.editsection a' );
+		var $edit = $( this ).find( '.mw-editsection a' );
 		if ( !$edit.length ) {
 			return;
 		}
diff --git a/resources/mediawiki.api/mediawiki.api.category.js b/resources/mediawiki.api/mediawiki.api.category.js
index 4de52911..98a9c54b 100644
--- a/resources/mediawiki.api/mediawiki.api.category.js
+++ b/resources/mediawiki.api/mediawiki.api.category.js
@@ -14,12 +14,13 @@
 		 * @return {boolean} return.done.isCategory Whether the category exists.
 		 */
 		isCategory: function ( title, ok, err ) {
-			var d = $.Deferred();
+			var d = $.Deferred(),
+				apiPromise;
+
 			// Backwards compatibility (< MW 1.20)
-			d.done( ok );
-			d.fail( err );
+			d.done( ok ).fail( err );
 
-			this.get( {
+			apiPromise = this.get( {
 					prop: 'categoryinfo',
 					titles: title.toString()
 				} )
@@ -36,7 +37,7 @@
 				})
 				.fail( d.reject );
 
-			return d.promise();
+			return d.promise( { abort: apiPromise.abort } );
 		},
 
 		/**
@@ -50,13 +51,14 @@
 		 * @return {String[]} return.done.categories Matched categories
 		 */
 		getCategoriesByPrefix: function ( prefix, ok, err ) {
-			var d = $.Deferred();
+			var d = $.Deferred(),
+				apiPromise;
+
 			// Backwards compatibility (< MW 1.20)
-			d.done( ok );
-			d.fail( err );
+			d.done( ok ).fail( err );
 
 			// Fetch with allpages to only get categories that have a corresponding description page.
-			this.get( {
+			apiPromise = this.get( {
 					list: 'allpages',
 					apprefix: prefix,
 					apnamespace: mw.config.get('wgNamespaceIds').category
@@ -72,7 +74,7 @@
 				})
 				.fail( d.reject );
 
-			return d.promise();
+			return d.promise( { abort: apiPromise.abort } );
 		},
 
 
@@ -88,12 +90,13 @@
 		 *  if title was not found.
 		 */
 		getCategories: function ( title, ok, err, async ) {
-			var d = $.Deferred();
+			var d = $.Deferred(),
+				apiPromise;
+
 			// Backwards compatibility (< MW 1.20)
-			d.done( ok );
-			d.fail( err );
+			d.done( ok ).fail( err );
 
-			this.get( {
+			apiPromise = this.get( {
 					prop: 'categories',
 					titles: title.toString()
 				}, {
@@ -114,10 +117,10 @@
 						} );
 					}
 					d.resolve( ret );
-				})
+				} )
 				.fail( d.reject );
 
-			return d.promise();
+			return d.promise( { abort: apiPromise.abort } );
 		}
 
 	} );
diff --git a/resources/mediawiki.api/mediawiki.api.edit.js b/resources/mediawiki.api/mediawiki.api.edit.js
index 3c775ad0..cc83a4b8 100644
--- a/resources/mediawiki.api/mediawiki.api.edit.js
+++ b/resources/mediawiki.api/mediawiki.api.edit.js
@@ -3,9 +3,6 @@
  */
 ( function ( mw, $ ) {
 
-	// Cache token so we don't have to keep fetching new ones for every single request.
-	var cachedToken = null;
-
 	$.extend( mw.Api.prototype, {
 
 		/**
@@ -19,32 +16,7 @@
 		 * @return {jQuery.Promise} See #post
 		 */
 		postWithEditToken: function ( params, ok, err ) {
-			var useTokenToPost, getTokenIfBad,
-				api = this;
-			if ( cachedToken === null ) {
-				// We don't have a valid cached token, so get a fresh one and try posting.
-				// We do not trap any 'badtoken' or 'notoken' errors, because we don't want
-				// an infinite loop. If this fresh token is bad, something else is very wrong.
-				useTokenToPost = function ( token ) {
-					params.token = token;
-					api.post( params, ok, err );
-				};
-				return api.getEditToken( useTokenToPost, err );
-			} else {
-				// We do have a token, but it might be expired. So if it is 'bad' then
-				// start over with a new token.
-				params.token = cachedToken;
-				getTokenIfBad = function ( code, result ) {
-					if ( code === 'badtoken' ) {
-						// force a new token, clear any old one
-						cachedToken = null;
-						api.postWithEditToken( params, ok, err );
-					} else {
-						err( code, result );
-					}
-				};
-				return api.post( params, { ok : ok, err : getTokenIfBad });
-			}
+			return this.postWithToken( 'edit', params ).done( ok ).fail( err );
 		},
 
 		/**
@@ -57,37 +29,7 @@
 		 * @return {string} return.done.token Received token.
 		 */
 		getEditToken: function ( ok, err ) {
-			var d = $.Deferred();
-			// Backwards compatibility (< MW 1.20)
-			d.done( ok );
-			d.fail( err );
-
-			this.get( {
-					action: 'tokens',
-					type: 'edit'
-				}, {
-					// Due to the API assuming we're logged out if we pass the callback-parameter,
-					// we have to disable jQuery's callback system, and instead parse JSON string,
-					// by setting 'jsonp' to false.
-					// TODO: This concern seems genuine but no other module has it. Is it still
-					// needed and/or should we pass this by default?
-					jsonp: false
-				} )
-				.done( function ( data ) {
-					var token;
-					// If token type is not available for this user,
-					// key 'edittoken' is missing or can contain Boolean false
-					if ( data.tokens && data.tokens.edittoken ) {
-						token = data.tokens.edittoken;
-						cachedToken = token;
-						d.resolve( token );
-					} else {
-						d.reject( 'token-missing', data );
-					}
-				})
-				.fail( d.reject );
-
-			return d.promise();
+			return this.getToken( 'edit' ).done( ok ).fail( err );
 		},
 
 		/**
@@ -110,8 +52,7 @@
 				text: message
 			}, ok, err );
 		}
-
-	 } );
+	} );
 
 	/**
 	 * @class mw.Api
diff --git a/resources/mediawiki.api/mediawiki.api.js b/resources/mediawiki.api/mediawiki.api.js
index cf7443f3..cdc67679 100644
--- a/resources/mediawiki.api/mediawiki.api.js
+++ b/resources/mediawiki.api/mediawiki.api.js
@@ -20,7 +20,8 @@
 
 				dataType: 'json'
 			}
-		};
+		},
+		tokenCache = {};
 
 	/**
 	 * Constructor to create an object to interact with the API of a particular MediaWiki server.
@@ -115,7 +116,8 @@
 		 */
 		ajax: function ( parameters, ajaxOptions ) {
 			var token,
-				apiDeferred = $.Deferred();
+				apiDeferred = $.Deferred(),
+				xhr;
 
 			parameters = $.extend( {}, this.defaults.parameters, parameters );
 			ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
@@ -147,7 +149,7 @@
 			}
 
 			// Make the AJAX request
-			$.ajax( ajaxOptions )
+			xhr = $.ajax( ajaxOptions )
 				// If AJAX fails, reject API call with error code 'http'
 				// and details in second argument.
 				.fail( function ( xhr, textStatus, exception ) {
@@ -172,11 +174,85 @@
 				} );
 
 			// Return the Promise
-			return apiDeferred.promise().fail( function ( code, details ) {
+			return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
 				mw.log( 'mw.Api error: ', code, details );
-			});
-		}
+			} );
+		},
+
+		/**
+		 * Post to API with specified type of token. If we have no token, get one and try to post.
+		 * If we have a cached token try using that, and if it fails, blank out the
+		 * cached token and start over. For example to change an user option you could do:
+		 *
+		 *     new mw.Api().postWithToken( 'options', {
+		 *         action: 'options',
+		 *         optionname: 'gender',
+		 *         optionvalue: 'female'
+		 *     } );
+		 *
+		 * @param {string} tokenType The name of the token, like options or edit.
+		 * @param {Object} params API parameters
+		 * @return {jQuery.Promise} See #post
+		 */
+		postWithToken: function ( tokenType, params ) {
+			var api = this, hasOwn = tokenCache.hasOwnProperty;
+			if ( hasOwn.call( tokenCache, tokenType ) && tokenCache[tokenType] !== undefined ) {
+				params.token = tokenCache[tokenType];
+				return api.post( params ).then(
+					null,
+					function ( code ) {
+						if ( code === 'badtoken' ) {
+							// force a new token, clear any old one
+							tokenCache[tokenType] = params.token = undefined;
+							return api.post( params );
+						}
+						// Pass the promise forward, so the caller gets error codes
+						return this;
+					}
+				);
+			} else {
+				return api.getToken( tokenType ).then( function ( token ) {
+					tokenCache[tokenType] = params.token = token;
+					return api.post( params );
+				} );
+			}
+		},
 
+		/**
+		 * Api helper to grab any token.
+		 *
+		 * @param {string} type Token type.
+		 * @return {jQuery.Promise}
+		 * @return {Function} return.done
+		 * @return {string} return.done.token Received token.
+		 */
+		getToken: function ( type ) {
+			var apiPromise,
+				d = $.Deferred();
+
+			apiPromise = this.get( {
+					action: 'tokens',
+					type: type
+				}, {
+					// Due to the API assuming we're logged out if we pass the callback-parameter,
+					// we have to disable jQuery's callback system, and instead parse JSON string,
+					// by setting 'jsonp' to false.
+					// TODO: This concern seems genuine but no other module has it. Is it still
+					// needed and/or should we pass this by default?
+				} )
+				.done( function ( data ) {
+					// If token type is not available for this user,
+					// key '...token' is missing or can contain Boolean false
+					if ( data.tokens && data.tokens[type + 'token'] ) {
+						d.resolve( data.tokens[type + 'token'] );
+					} else {
+						d.reject( 'token-missing', data );
+					}
+				} )
+				.fail( d.reject );
+
+			return d.promise( { abort: apiPromise.abort } );
+		}
 	};
 
 	/**
diff --git a/resources/mediawiki.api/mediawiki.api.login.js b/resources/mediawiki.api/mediawiki.api.login.js
new file mode 100644
index 00000000..ccbae06c
--- /dev/null
+++ b/resources/mediawiki.api/mediawiki.api.login.js
@@ -0,0 +1,54 @@
+/**
+ * Make the two-step login easier.
+ * @author Niklas Laxström
+ * @class mw.Api.plugin.login
+ * @since 1.22
+ */
+( function ( mw, $ ) {
+	'use strict';
+
+	$.extend( mw.Api.prototype, {
+		/**
+		 * @param {string} username
+		 * @param {string} password
+		 * @return {jQuery.Promise} See mw.Api#post
+		 */
+		login: function ( username, password ) {
+			var params, request,
+				deferred = $.Deferred(),
+				api = this;
+
+			params = {
+				action: 'login',
+				lgname: username,
+				lgpassword: password
+			};
+
+			request = api.post( params );
+			request.fail( deferred.reject );
+			request.done( function ( data ) {
+				params.lgtoken = data.login.token;
+				api.post( params )
+					.fail( deferred.reject )
+					.done( function ( data ) {
+						var code;
+						if ( data.login && data.login.result === 'Success' ) {
+							deferred.resolve( data );
+						} else {
+							// Set proper error code whenever possible
+							code = data.error && data.error.code || 'unknown';
+							deferred.reject( code, data );
+						}
+					} );
+			} );
+
+			return deferred.promise( { abort: request.abort } );
+		}
+	} );
+
+	/**
+	 * @class mw.Api
+	 * @mixins mw.Api.plugin.login
+	 */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.api/mediawiki.api.parse.js b/resources/mediawiki.api/mediawiki.api.parse.js
index ea0388c1..c4d23b82 100644
--- a/resources/mediawiki.api/mediawiki.api.parse.js
+++ b/resources/mediawiki.api/mediawiki.api.parse.js
@@ -15,13 +15,15 @@
 		 * @return {string} return.done.data Parsed HTML of `wikitext`.
 		 */
 		parse: function ( wikitext, ok, err ) {
-			var d = $.Deferred();
+			var d = $.Deferred(),
+				apiPromise;
+
 			// Backwards compatibility (< MW 1.20)
-			d.done( ok );
-			d.fail( err );
+			d.done( ok ).fail( err );
 
-			this.get( {
+			apiPromise = this.get( {
 					action: 'parse',
+					contentmodel: 'wikitext',
 					text: wikitext
 				} )
 				.done( function ( data ) {
@@ -31,7 +33,7 @@
 				} )
 				.fail( d.reject );
 
-			return d.promise();
+			return d.promise( { abort: apiPromise.abort } );
 		}
 	} );
 
diff --git a/resources/mediawiki.api/mediawiki.api.watch.js b/resources/mediawiki.api/mediawiki.api.watch.js
index c86a90a7..49a4c622 100644
--- a/resources/mediawiki.api/mediawiki.api.watch.js
+++ b/resources/mediawiki.api/mediawiki.api.watch.js
@@ -19,10 +19,12 @@
 	 * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
 	 */
 	function doWatchInternal( page, ok, err, addParams ) {
-		var params, d = $.Deferred();
+		var params,
+			d = $.Deferred(),
+			apiPromise;
+
 		// Backwards compatibility (< MW 1.20)
-		d.done( ok );
-		d.fail( err );
+		d.done( ok ).fail( err );
 
 		params = {
 			action: 'watch',
@@ -35,13 +37,13 @@
 			$.extend( params, addParams );
 		}
 
-		this.post( params )
+		apiPromise = this.post( params )
 			.done( function ( data ) {
 				d.resolve( data.watch );
 			} )
 			.fail( d.reject );
 
-		return d.promise();
+		return d.promise( { abort: apiPromise.abort } );
 	}
 
 	$.extend( mw.Api.prototype, {
diff --git a/resources/mediawiki.language/mediawiki.language.js b/resources/mediawiki.language/mediawiki.language.js
index 7f729bdc..631d13df 100644
--- a/resources/mediawiki.language/mediawiki.language.js
+++ b/resources/mediawiki.language/mediawiki.language.js
@@ -45,11 +45,34 @@ var language = {
 	 */
 	convertPlural: function ( count, forms ) {
 		var pluralRules,
+			formCount,
+			form,
+			index,
+			equalsPosition,
 			pluralFormIndex = 0;
 
 		if ( !forms || forms.length === 0 ) {
 			return '';
 		}
+
+		// Handle for explicit n= forms
+		for ( index = 0; index < forms.length; index++ ) {
+			form = forms[index];
+			if ( /^\d+=/.test( form ) ) {
+				equalsPosition = form.indexOf( '=' );
+				formCount = parseInt( form.substring( 0, equalsPosition ), 10 );
+				if ( formCount === count ) {
+					return form.substr( equalsPosition + 1 );
+				}
+				forms[index] = undefined;
+			}
+		}
+
+		// Remove explicit plural forms from the forms.
+		forms = $.map( forms, function ( form ) {
+			return form;
+		} );
+
 		pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' );
 		if ( !pluralRules ) {
 			// default fallback.
diff --git a/resources/mediawiki.language/mediawiki.language.months.js b/resources/mediawiki.language/mediawiki.language.months.js
new file mode 100644
index 00000000..3d4b7ee7
--- /dev/null
+++ b/resources/mediawiki.language/mediawiki.language.months.js
@@ -0,0 +1,54 @@
+/**
+ * Transfer of month names from messages into mw.language.
+ *
+ * Loading this module also ensures the availability of appropriate messages via mw.msg.
+ */
+( function ( mw, $ ) {
+	var
+		monthMessages = [
+			'january', 'february', 'march', 'april',
+			'may_long', 'june', 'july', 'august',
+			'september', 'october', 'november', 'december'
+		],
+		monthGenMessages = [
+			'january-gen', 'february-gen', 'march-gen', 'april-gen',
+			'may-gen', 'june-gen', 'july-gen', 'august-gen',
+			'september-gen', 'october-gen', 'november-gen', 'december-gen'
+		],
+		monthAbbrevMessages = [
+			'jan', 'feb', 'mar', 'apr',
+			'may', 'jun', 'jul', 'aug',
+			'sep', 'oct', 'nov', 'dec'
+		];
+
+	// Function suitable for passing to jQuery.map
+	// Can't use mw.msg directly because jQuery.map passes element index as second argument
+	function mwMsgMapper( key ) {
+		return mw.msg( key );
+	}
+
+	/**
+	 * Information about month names in current UI language.
+	 *
+	 * Object keys:
+	 * - `names`: array of month names (in nominative case in languages which have the distinction),
+	 *   zero-indexed
+	 * - `genitive`: array of month names in genitive case, zero-indexed
+	 * - `abbrev`: array of three-letter-long abbreviated month names, zero-indexed
+	 * - `keys`: object with three keys like the above, containing zero-indexed arrays of message keys
+	 *   for appropriate messages which can be passed to mw.msg.
+	 *
+	 * @property
+	 */
+	mw.language.months = {
+		keys: {
+			names: monthMessages,
+			genitive: monthGenMessages,
+			abbrev: monthAbbrevMessages
+		},
+		names: $.map( monthMessages, mwMsgMapper ),
+		genitive: $.map( monthGenMessages, mwMsgMapper ),
+		abbrev: $.map( monthAbbrevMessages, mwMsgMapper )
+	};
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.less/mediawiki.mixins.less b/resources/mediawiki.less/mediawiki.mixins.less
new file mode 100644
index 00000000..19a715b9
--- /dev/null
+++ b/resources/mediawiki.less/mediawiki.mixins.less
@@ -0,0 +1,46 @@
+/**
+ * Common LESS mixin library for MediaWiki
+ *
+ * By default the folder containing this file is included in $wgResourceLoaderLESSImportPaths,
+ * which makes this file importable by all less files via '@import "mediawiki.mixins";'.
+ *
+ * The mixins included below are considered a public interface for MediaWiki extensions.
+ * The signatures of parametrized mixins should be kept as stable as possible.
+ *
+ * See <http://lesscss.org/#-mixins> for more information about how to write mixins.
+ */
+
+.background-image(@url) when (embeddable(@url)) {
+	background-image: embed(@url);
+	background-image: url(@url)!ie;
+}
+
+.background-image(@url) when not (embeddable(@url)) {
+	background-image: url(@url);
+}
+
+/* Note gzip compression means that it is okay to embed twice */
+.background-image-svg(@svg, @fallback) {
+	background-image: url(@fallback);
+	/* SVG support using a transparent gradient to guarantee cross-browser
+	 * compatibility (browsers able to understand gradient syntax support also SVG) */
+	/* @embed */ background-image: -webkit-linear-gradient(transparent, transparent), url(@svg);
+	/* @embed */ background-image: linear-gradient(transparent, transparent), url(@svg);
+}
+
+/* Caution: Does not support localisable images */
+.list-style-image(@url) when (embeddable(@url)) {
+	list-style-image: embed(@url);
+	list-style-image: url(@url)!ie;
+}
+
+.list-style-image(@url) when not (embeddable(@url)) {
+	list-style-image: url(@url);
+}
+
+.transition(@string) {
+	-webkit-transition: @string;
+	-moz-transition: @string;
+	-o-transition: @string;
+	transition: @string;
+}
diff --git a/resources/mediawiki.libs/mediawiki.libs.jpegmeta.js b/resources/mediawiki.libs/mediawiki.libs.jpegmeta.js
index af49889a..22429246 100644
--- a/resources/mediawiki.libs/mediawiki.libs.jpegmeta.js
+++ b/resources/mediawiki.libs/mediawiki.libs.jpegmeta.js
@@ -274,7 +274,7 @@
 	this.JpegMeta.JpegFile.prototype._JFIF_IDENT = "JFIF\x00";
 	this.JpegMeta.JpegFile.prototype._JFXX_IDENT = "JFXX\x00";
 	
-	/* EXIF idents */
+	/* Exif idents */
 	this.JpegMeta.JpegFile.prototype._EXIF_IDENT = "Exif\x00";
 	
 	/* TIFF types */
diff --git a/resources/mediawiki.page/mediawiki.page.gallery.js b/resources/mediawiki.page/mediawiki.page.gallery.js
new file mode 100644
index 00000000..147a869d
--- /dev/null
+++ b/resources/mediawiki.page/mediawiki.page.gallery.js
@@ -0,0 +1,248 @@
+/**
+ * Show gallery captions when focused. Copied directly from jquery.mw-jump.js.
+ * Also Dynamically resize images to justify them.
+ */
+( function ( $, mw ) {
+	$( function () {
+		var isTouchScreen,
+			gettingFocus,
+			galleries = 'ul.mw-gallery-packed-overlay, ul.mw-gallery-packed-hover, ul.mw-gallery-packed';
+
+		// Is there a better way to detect a touchscreen? Current check taken from stack overflow.
+		isTouchScreen = !!( window.ontouchstart !== undefined || window.DocumentTouch !== undefined && document instanceof window.DocumentTouch );
+
+		if ( isTouchScreen ) {
+			// Always show the caption for a touch screen.
+			$( 'ul.mw-gallery-packed-hover' )
+				.addClass( 'mw-gallery-packed-overlay' )
+				.removeClass( 'mw-gallery-packed-hover' );
+		} else {
+			// Note use of just "a", not a.image, since we want this to trigger if a link in
+			// the caption receives focus
+			$( 'ul.mw-gallery-packed-hover li.gallerybox' ).on( 'focus blur', 'a', function ( e ) {
+				// Confusingly jQuery leaves e.type as focusout for delegated blur events
+				gettingFocus = e.type !== 'blur' && e.type !== 'focusout';
+				$( this ).closest( 'li.gallerybox' ).toggleClass( 'mw-gallery-focused', gettingFocus );
+			} );
+		}
+
+		// Now on to justification.
+		// We may still get ragged edges if someone resizes their window. Could bind to
+		// that event, otoh do we really want to constantly be resizing galleries?
+		$( galleries ).each( function() {
+			var lastTop,
+				$img,
+				imgWidth,
+				imgHeight,
+				rows = [],
+				$gallery = $( this );
+
+			$gallery.children( 'li' ).each( function() {
+				// Math.floor to be paranoid if things are off by 0.00000000001
+				var top = Math.floor( $(this ).position().top ),
+					$this = $( this );
+
+				if ( top !== lastTop ) {
+					rows[rows.length] = [];
+					lastTop = top;
+				}
+
+				$img = $this.find( 'div.thumb a.image img' );
+				if ( $img.length && $img[0].height ) {
+					imgHeight = $img[0].height;
+					imgWidth = $img[0].width;
+				} else {
+					// If we don't have a real image, get the containing divs width/height.
+					// Note that if we do have a real image, using this method will generally
+					// give the same answer, but can be different in the case of a very
+					// narrow image where extra padding is added.
+					imgHeight = $this.children().children( 'div:first' ).height();
+					imgWidth = $this.children().children( 'div:first' ).width();
+				}
+
+				// Hack to make an edge case work ok
+				if ( imgHeight < 30 ) {
+					// Don't try and resize this item.
+					imgHeight = 0;
+				}
+
+				rows[rows.length-1][rows[rows.length-1].length] = {
+					$elm: $this,
+					width: $this.outerWidth(),
+					imgWidth: imgWidth,
+					aspect: imgWidth / imgHeight, // XXX: can divide by 0 ever happen?
+					captionWidth: $this.children().children( 'div.gallerytextwrapper' ).width(),
+					height: imgHeight
+				};
+			});
+
+			(function () {
+				var maxWidth,
+					combinedAspect,
+					combinedPadding,
+					curRow,
+					curRowHeight,
+					wantedWidth,
+					preferredHeight,
+					newWidth,
+					padding,
+					$outerDiv,
+					$innerDiv,
+					$imageDiv,
+					$imageElm,
+					imageElm,
+					$caption,
+					hookInfo,
+					i,
+					j,
+					avgZoom,
+					totalZoom = 0;
+
+				for ( i = 0; i < rows.length; i++ ) {
+					maxWidth = $gallery.width();
+					combinedAspect = 0;
+					combinedPadding = 0;
+					curRow = rows[i];
+					curRowHeight = 0;
+
+					for ( j = 0; j < curRow.length; j++ ) {
+						if ( curRowHeight === 0 ) {
+							if ( isFinite( curRow[j].height ) ) {
+								// Get the height of this row, by taking the first
+								// non-out of bounds height
+								curRowHeight = curRow[j].height;
+							}
+						}
+
+						if ( curRow[j].aspect === 0 || !isFinite( curRow[j].aspect ) ) {
+							mw.log( 'Skipping item ' + j + ' due to aspect: ' + curRow[j].aspect );
+							// One of the dimensions are 0. Probably should
+							// not try to resize.
+							combinedPadding += curRow[j].width;
+						} else {
+							combinedAspect += curRow[j].aspect;
+							combinedPadding += curRow[j].width - curRow[j].imgWidth;
+						}
+					}
+
+					// Add some padding for inter-element spacing.
+					combinedPadding += 5 * curRow.length;
+					wantedWidth = maxWidth - combinedPadding;
+					preferredHeight = wantedWidth / combinedAspect;
+
+					if ( preferredHeight > curRowHeight * 1.5 ) {
+						// Only expand at most 1.5 times current size
+						// As that's as high a resolution as we have.
+						// Also on the off chance there is a bug in this
+						// code, would prevent accidentally expanding to
+						// be 10 billion pixels wide.
+						mw.log( 'mw.page.gallery: Cannot fit row, aspect is ' + preferredHeight/curRowHeight );
+						if ( i === rows.length - 1 ) {
+							// If its the last row, and we can't fit it,
+							// don't make the entire row huge.
+							avgZoom = ( totalZoom / ( rows.length - 1 ) ) * curRowHeight;
+							if ( isFinite( avgZoom ) && avgZoom >= 1 && avgZoom <= 1.5 ) {
+								preferredHeight = avgZoom;
+							} else {
+								// Probably a single row gallery
+								preferredHeight = curRowHeight;
+							}
+						} else {
+							preferredHeight = 1.5 * curRowHeight;
+						}
+					}
+					if ( !isFinite( preferredHeight ) ) {
+						// This *definitely* should not happen.
+						mw.log( 'mw.page.gallery: Trying to resize row ' + i + ' to ' + preferredHeight + '?!' );
+						// Skip this row.
+						continue;
+					}
+					if ( preferredHeight < 5 ) {
+						// Well something clearly went wrong...
+						mw.log( {maxWidth: maxWidth, combinedPadding: combinedPadding, combinedAspect: combinedAspect, wantedWidth: wantedWidth } );
+						mw.log( 'mw.page.gallery: [BUG!] Fitting row ' + i + ' to too small a size: ' + preferredHeight );
+						// Skip this row.
+						continue;
+					}
+
+					if ( preferredHeight / curRowHeight > 1 ) {
+						totalZoom += preferredHeight / curRowHeight;
+					} else {
+						// If we shrink, still consider that a zoom of 1
+						totalZoom += 1;
+					}
+
+					for ( j = 0; j < curRow.length; j++ ) {
+						newWidth = preferredHeight * curRow[j].aspect;
+						padding = curRow[j].width - curRow[j].imgWidth;
+						$outerDiv = curRow[j].$elm;
+						$innerDiv = $outerDiv.children( 'div' ).first();
+						$imageDiv = $innerDiv.children( 'div.thumb' );
+						$imageElm = $imageDiv.find( 'img' ).first();
+						imageElm = $imageElm.length ? $imageElm[0] : null;
+						$caption = $outerDiv.find( 'div.gallerytextwrapper' );
+
+
+						// Since we are going to re-adjust the height, the vertical
+						// centering margins need to be reset.
+						$imageDiv.children( 'div' ).css( 'margin', '0px auto' );
+
+						if ( newWidth < 60 || !isFinite( newWidth ) ) {
+							// Making something skinnier than this will mess up captions,
+							mw.log( 'mw.page.gallery: Tried to make image ' + newWidth + 'px wide but too narrow.' );
+							if ( newWidth < 1 || !isFinite( newWidth ) ) {
+								$innerDiv.height( preferredHeight );
+								// Don't even try and touch the image size if it could mean
+								// making it disappear.
+								continue;
+							}
+						} else {
+							$outerDiv.width( newWidth + padding );
+							$innerDiv.width( newWidth + padding );
+							$imageDiv.width( newWidth );
+							$caption.width( curRow[j].captionWidth + (newWidth - curRow[j].imgWidth ) );
+						}
+
+						hookInfo = {
+							fullWidth: newWidth + padding,
+							imgWidth: newWidth,
+							imgHeight: preferredHeight,
+							$innerDiv: $innerDiv,
+							$imageDiv: $imageDiv,
+							$outerDiv: $outerDiv,
+							// Whether the hook took action
+							resolved: false
+						};
+
+						/**
+						 * Gallery resize.
+						 *
+						 * If your handler resizes an image, it should also set the resolved
+						 * property to true. Additionally, because this module only exposes this
+						 * logic temporarily, you should load your module in position top to
+						 * ensure it is registered before this runs (FIXME: Don't use mw.hook)
+						 *
+						 * See TimedMediaHandler for an example.
+						 *
+						 * @event mediawiki_page_gallery_resize
+						 * @member mw.hook
+						 * @param {Object} hookInfo
+						 */
+						mw.hook( 'mediawiki.page.gallery.resize' ).fire( hookInfo );
+
+						if ( !hookInfo.resolved ) {
+							if ( imageElm ) {
+								// We don't always have an img, e.g. in the case of an invalid file.
+								imageElm.width = newWidth;
+								imageElm.height = preferredHeight;
+							} else {
+								// Not a file box.
+								$imageDiv.height( preferredHeight );
+							}
+						}
+					}
+				}
+			} )();
+		} );
+	} );
+} )( jQuery, mediaWiki );
diff --git a/resources/mediawiki.page/mediawiki.page.image.pagination.js b/resources/mediawiki.page/mediawiki.page.image.pagination.js
new file mode 100644
index 00000000..fb44a76f
--- /dev/null
+++ b/resources/mediawiki.page/mediawiki.page.image.pagination.js
@@ -0,0 +1,51 @@
+/**
+ * Change multi-page image navigation so that the current page display can be changed
+ * without a page reload. Currently, the only image formats that can be multi-page images are
+ * PDF and DjVu files
+ */
+( function (mw, $) {
+	// Use jQuery's load function to specifically select and replace table.multipageimage's child
+	// tr with the new page's table.multipageimage's tr element.
+	// table.multipageimage always has only one row.
+	function loadPage( page ) {
+		var $multipageimage = $( 'table.multipageimage' ),
+			$spinner = $.createSpinner( {
+				size: 'large',
+				type: 'block'
+			} );
+
+		// Set the spinner's dimensions equal to the table's dimensions so that
+		// the current scroll position is not lost after the table is emptied prior to
+		// its contents being updated
+		$spinner.css( {
+			height: $multipageimage.find( 'tr' ).height(),
+			width: $multipageimage.find( 'tr' ).width()
+		} );
+
+		$multipageimage.empty().append( $spinner ).load(
+			page + ' table.multipageimage tr',
+			ajaxifyPageNavigation
+		);
+	}
+
+	function ajaxifyPageNavigation() {
+		// Intercept the default action of the links in the thumbnail navigation
+		$( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
+			loadPage( this.href );
+			e.preventDefault();
+		} );
+
+		// Prevent the submission of the page select form and instead call loadPage
+		$( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
+			loadPage( this.action + '?' + $( this ).serialize() );
+			e.preventDefault();
+		} );
+	}
+
+	$( document ).ready( function() {
+		// The presence of table.multipageimage signifies that this file is a multi-page image
+		if( mw.config.get( 'wgNamespaceNumber' ) === 6 && $( 'table.multipageimage' ).length !== 0 ) {
+			ajaxifyPageNavigation();
+		}
+	} );
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.page/mediawiki.page.patrol.ajax.js b/resources/mediawiki.page/mediawiki.page.patrol.ajax.js
index d7a07d71..75908eee 100644
--- a/resources/mediawiki.page/mediawiki.page.patrol.ajax.js
+++ b/resources/mediawiki.page/mediawiki.page.patrol.ajax.js
@@ -11,7 +11,7 @@
 		// that didn't have patrolToken yet.
 		return;
 	}
-	$( document ).ready( function () {
+	$( function () {
 		var $patrolLinks = $( '.patrollink a' );
 		$patrolLinks.on( 'click', function ( e ) {
 			var $spinner, href, rcid, apiRequest;
diff --git a/resources/mediawiki.page/mediawiki.page.ready.js b/resources/mediawiki.page/mediawiki.page.ready.js
index 684f582f..ee416d67 100644
--- a/resources/mediawiki.page/mediawiki.page.ready.js
+++ b/resources/mediawiki.page/mediawiki.page.ready.js
@@ -1,28 +1,40 @@
-( function ( mw, $ ) {
-	$( function () {
+( function ( mw , $ ) {
+	var supportsPlaceholder = 'placeholder' in document.createElement( 'input' );
+
+	mw.hook( 'wikipage.content' ).add( function ( $content ) {
 		var $sortableTables;
 
-		/* Emulate placeholder if not supported by browser */
-		if ( !( 'placeholder' in document.createElement( 'input' ) ) ) {
-			$( 'input[placeholder]' ).placeholder();
+		// Run jquery.placeholder polyfill if placeholder is not supported
+		if ( !supportsPlaceholder ) {
+			$content.find( 'input[placeholder]' ).placeholder();
 		}
 
-		/* Enable makeCollapsible */
-		$( '.mw-collapsible' ).makeCollapsible();
+		// Run jquery.makeCollapsible
+		$content.find( '.mw-collapsible' ).makeCollapsible();
 
-		/* Lazy load jquery.tablesorter */
-		$sortableTables = $( 'table.sortable' );
+		// Lazy load jquery.tablesorter
+		$sortableTables = $content.find( 'table.sortable' );
 		if ( $sortableTables.length ) {
 			mw.loader.using( 'jquery.tablesorter', function () {
 				$sortableTables.tablesorter();
-			});
+			} );
 		}
 
-		/* Enable CheckboxShiftClick */
-		$( 'input[type=checkbox]:not(.noshiftselect)' ).checkboxShiftClick();
+		// Run jquery.checkboxShiftClick
+		$content.find( 'input[type="checkbox"]:not(.noshiftselect)' ).checkboxShiftClick();
+	} );
+
+	// Things outside the wikipage content
+	$( function () {
+
+		if ( !supportsPlaceholder ) {
+			// Exclude content to avoid hitting it twice for the (first) wikipage content
+			$( 'input[placeholder]' ).not( '#mw-content-text input' ).placeholder();
+		}
 
-		/* Add accesskey hints to the tooltips */
+		// Add accesskey hints to the tooltips
 		mw.util.updateTooltipAccessKeys();
 
 	} );
+
 }( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.page/mediawiki.page.startup.js b/resources/mediawiki.page/mediawiki.page.startup.js
index 6a11d3e1..38466818 100644
--- a/resources/mediawiki.page/mediawiki.page.startup.js
+++ b/resources/mediawiki.page/mediawiki.page.startup.js
@@ -5,14 +5,23 @@
 	// Client profile classes for <html>
 	// Allows for easy hiding/showing of JS or no-JS-specific UI elements
 	$( 'html' )
-		.addClass('client-js' )
+		.addClass( 'client-js' )
 		.removeClass( 'client-nojs' );
 
-	// Initialize utilities as soon as the document is ready (mw.util.$content,
-	// messageBoxNew, profile, tooltip access keys, Table of contents toggle, ..).
-	// Enqueued into domready from here instead of mediawiki.page.ready to ensure that it gets enqueued
-	// before other modules hook into document ready, so that mw.util.$content (defined by mw.util.init),
-	// is defined for them.
-	$( mw.util.init );
+	$( function () {
+		// Initialize utilities as soon as the document is ready (mw.util.$content,
+		// messageBoxNew, profile, tooltip access keys, Table of contents toggle, ..).
+		// In the domready here instead of in mediawiki.page.ready to ensure that it gets enqueued
+		// before other modules hook into domready, so that mw.util.$content (defined by
+		// mw.util.init), is defined for them.
+		mw.util.init();
+
+		/**
+		 * @event wikipage_content
+		 * @member mw.hook
+		 * @param {jQuery} $content
+		 */
+		mw.hook( 'wikipage.content' ).fire( $( '#mw-content-text' ) );
+	} );
 
 }( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.page/mediawiki.page.watch.ajax.js b/resources/mediawiki.page/mediawiki.page.watch.ajax.js
index f945fa9d..e9afa4a2 100644
--- a/resources/mediawiki.page/mediawiki.page.watch.ajax.js
+++ b/resources/mediawiki.page/mediawiki.page.watch.ajax.js
@@ -71,7 +71,7 @@
 
 		actionPaths = mw.config.get( 'wgActionPaths' );
 
-		// @todo: Does MediaWiki give action path or query param
+		// @todo Does MediaWiki give action path or query param
 		// precedence ? If the former, move this to the bottom
 		action = mw.util.getParamValue( 'action', url );
 		if ( action !== null ) {
@@ -100,7 +100,7 @@
 		updateWatchLink: updateWatchLink
 	};
 
-	$( document ).ready( function () {
+	$( function () {
 		var $links = $( '.mw-watchlink a, a.mw-watchlink, ' +
 			'#ca-watch a, #ca-unwatch a, #mw-unwatch-link1, ' +
 			'#mw-unwatch-link2, #mw-watch-link2, #mw-watch-link1' );
@@ -161,7 +161,7 @@
 					cleanTitle = title.replace( /_/g, ' ' );
 					link = mw.html.element(
 						'a', {
-							href: mw.util.wikiGetlink( title ),
+							href: mw.util.getUrl( title ),
 							title: cleanTitle
 						}, cleanTitle
 					);
diff --git a/resources/mediawiki.special/images/arrow-collapsed-ltr.png b/resources/mediawiki.special/images/arrow-collapsed-ltr.png
deleted file mode 100644
index 467a555a..00000000
Binary files a/resources/mediawiki.special/images/arrow-collapsed-ltr.png and /dev/null differ
diff --git a/resources/mediawiki.special/images/arrow-collapsed-rtl.png b/resources/mediawiki.special/images/arrow-collapsed-rtl.png
deleted file mode 100644
index 2246254f..00000000
Binary files a/resources/mediawiki.special/images/arrow-collapsed-rtl.png and /dev/null differ
diff --git a/resources/mediawiki.special/images/arrow-expanded.png b/resources/mediawiki.special/images/arrow-expanded.png
deleted file mode 100644
index 58a9fc66..00000000
Binary files a/resources/mediawiki.special/images/arrow-expanded.png and /dev/null differ
diff --git a/resources/mediawiki.special/images/glyph-people-large.png b/resources/mediawiki.special/images/glyph-people-large.png
new file mode 100644
index 00000000..0578be0b
Binary files /dev/null and b/resources/mediawiki.special/images/glyph-people-large.png differ
diff --git a/resources/mediawiki.special/images/icon-contributors.png b/resources/mediawiki.special/images/icon-contributors.png
new file mode 100644
index 00000000..f933aa69
Binary files /dev/null and b/resources/mediawiki.special/images/icon-contributors.png differ
diff --git a/resources/mediawiki.special/images/icon-edits.png b/resources/mediawiki.special/images/icon-edits.png
new file mode 100644
index 00000000..39f4f2de
Binary files /dev/null and b/resources/mediawiki.special/images/icon-edits.png differ
diff --git a/resources/mediawiki.special/images/icon-lock.png b/resources/mediawiki.special/images/icon-lock.png
new file mode 100644
index 00000000..03f0eecd
Binary files /dev/null and b/resources/mediawiki.special/images/icon-lock.png differ
diff --git a/resources/mediawiki.special/images/icon-pages.png b/resources/mediawiki.special/images/icon-pages.png
new file mode 100644
index 00000000..59513db2
Binary files /dev/null and b/resources/mediawiki.special/images/icon-pages.png differ
diff --git a/resources/mediawiki.special/mediawiki.special.block.js b/resources/mediawiki.special/mediawiki.special.block.js
index 2a158dfb..b8bcf177 100644
--- a/resources/mediawiki.special/mediawiki.special.block.js
+++ b/resources/mediawiki.special/mediawiki.special.block.js
@@ -2,7 +2,7 @@
  * JavaScript for Special:Block
  */
 ( function ( mw, $ ) {
-	$( document ).ready( function () {
+	$( function () {
 		var $blockTarget = $( '#mw-bi-target' ),
 			$anonOnlyRow = $( '#mw-input-wpHardBlock' ).closest( 'tr' ),
 			$enableAutoblockRow = $( '#mw-input-wpAutoBlock' ).closest( 'tr' ),
diff --git a/resources/mediawiki.special/mediawiki.special.changeemail.js b/resources/mediawiki.special/mediawiki.special.changeemail.js
index 14c2f036..2d22bad0 100644
--- a/resources/mediawiki.special/mediawiki.special.changeemail.js
+++ b/resources/mediawiki.special/mediawiki.special.changeemail.js
@@ -23,7 +23,7 @@
 		}
 	}
 
-	$( document ).ready( function () {
+	$( function () {
 		// Lame tip to let user know if its email is valid. See bug 22449.
 		// Only bind once for 'blur' so that the user can fill it in without errors;
 		// after that, look at every keypress for immediate feedback.
diff --git a/resources/mediawiki.special/mediawiki.special.changeslist.css b/resources/mediawiki.special/mediawiki.special.changeslist.css
index fcdeba1b..5e4af7b6 100644
--- a/resources/mediawiki.special/mediawiki.special.changeslist.css
+++ b/resources/mediawiki.special/mediawiki.special.changeslist.css
@@ -2,63 +2,6 @@
  * Styling for Special:Watchlist and Special:RecentChanges
  */
 
-table.mw-enhanced-rc {
-	border: 0;
-	border-spacing: 0;
-}
-
-table.mw-enhanced-rc th,
-table.mw-enhanced-rc td {
-	padding: 0;
-	vertical-align: top;
-}
-
-td.mw-enhanced-rc {
-	white-space: nowrap;
-	font-family: monospace;
-}
-
-.mw-enhanced-rc-time {
-	font-family: monospace;
-}
-
-table.mw-enhanced-rc td.mw-enhanced-rc-nested {
-	padding-left: 1em;
-}
-
-/* Show/hide arrows in enhanced changeslist */
-.mw-enhanced-rc .collapsible-expander {
-	float: none;
-}
-
-/* If JS is disabled, the arrows or the placeholder space shouldn't be shown */
-.client-nojs .mw-enhancedchanges-arrow-space {
-	display: none;
-}
-
-.mw-enhancedchanges-arrow-space {
-	display: inline-block;
-	*display: inline; /* IE7 and below */
-	zoom: 1;
-	width: 15px;
-	height: 15px;
-}
-
-/* let it look like it is clickable */
-.mw-enhancedchanges-arrow.mw-collapsible-toggle {
-	cursor: pointer;
-}
-
-.mw-enhancedchanges-arrow.mw-collapsible-toggle-collapsed {
-	/* @embed */
-	background: url(images/arrow-collapsed-ltr.png) no-repeat left center;
-}
-
-.mw-enhancedchanges-arrow.mw-collapsible-toggle-expanded {
-	/* @embed */
-	background: url(images/arrow-expanded.png) no-repeat left center;
-}
-
 .mw-changeslist-line-watched .mw-title {
 	font-weight: bold;
 }
diff --git a/resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css b/resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css
new file mode 100644
index 00000000..bed580d7
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.changeslist.enhanced.css
@@ -0,0 +1,66 @@
+/**
+ * Styling for Special:Watchlist and Special:RecentChanges when preference 'usenewrc'
+ * a.k.a. Enhanced Recent Changes is enabled.
+ */
+
+table.mw-enhanced-rc {
+	border: 0;
+	border-spacing: 0;
+}
+
+table.mw-enhanced-rc th,
+table.mw-enhanced-rc td {
+	padding: 0;
+	vertical-align: top;
+}
+
+td.mw-enhanced-rc {
+	white-space: nowrap;
+	font-family: monospace;
+}
+
+.mw-enhanced-rc-time {
+	font-family: monospace;
+}
+
+table.mw-enhanced-rc td.mw-enhanced-rc-nested {
+	padding-left: 1em;
+}
+
+/* Show/hide arrows in enhanced changeslist */
+.mw-enhanced-rc .collapsible-expander {
+	float: none;
+}
+
+/* If JS is disabled, the arrows or the placeholder space shouldn't be shown */
+.client-nojs .mw-enhancedchanges-arrow-space {
+	display: none;
+}
+
+/*
+ * And if it's enabled, let's optimize the collapsing a little: hide the rows
+ * that would be hidden by jquery.makeCollapsible with CSS to save us some
+ * reflows and repaints. This doesn't work on browsers that don't fully support
+ * CSS2 (IE6), but it's okay, this will be done in JavaScript with old degraded
+ * performance instead.
+ */
+.client-js table.mw-enhanced-rc.mw-collapsed tr + tr {
+	display: none;
+}
+
+.mw-enhancedchanges-arrow-space {
+	display: inline-block;
+	*display: inline; /* IE7 and below */
+	zoom: 1;
+	width: 15px;
+	height: 15px;
+}
+
+/* let it look like it is clickable */
+.mw-enhancedchanges-arrow.mw-collapsible-toggle {
+	cursor: pointer;
+}
+
+.mw-enhanced-watched .mw-enhanced-rc-time {
+	font-weight: bold;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.createAccount.css b/resources/mediawiki.special/mediawiki.special.createAccount.css
new file mode 100644
index 00000000..11d00e75
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.createAccount.css
@@ -0,0 +1,89 @@
+/* Disable the underline that Vector puts on h2 headings, and bold them. */
+.mw-ui-container h2 {
+	border: 0;
+	font-weight: bold;
+}
+
+/**** shuffled CAPTCHA ****/
+#wpCaptchaWord {
+	margin-top: 6px;
+}
+
+.mw-createacct-captcha-container {
+	background-color: #f8f8f8;
+	border: 1px solid #c9c9c9;
+	padding: 10px;
+	text-align: center;
+}
+
+.mw-createacct-captcha-assisted {
+	display: block;
+	margin-top: 0.5em;
+}
+
+/* Put a border around the fancycaptcha-image-container. */
+.mw-createacct-captcha-and-reload {
+	border: 1px solid #c9c9c9;
+	display: table-cell; /* Other display formats end up too wide */
+	width: 270px;
+	background-color: #FFF;
+}
+
+/* Make the fancycaptcha-image-container full-width within its parent.  */
+.fancycaptcha-image-container
+{
+	width: 100%;
+}
+
+/**** Benefits column CSS to the right (if it fits) of the form. ****/
+.mw-ui-container #userloginForm {
+	float: left;
+}
+
+div.mw-createacct-benefits-container {
+	/* Keeps this column compact and close to the form, but tends to squish contents. */
+	float: left;
+}
+
+div.mw-createacct-benefits-container h2 {
+	margin-bottom: 30px;
+}
+
+.mw-number-text.icon-edits {
+	/* @embed */
+	background: url(images/icon-edits.png) no-repeat left center;
+}
+
+.mw-number-text.icon-pages {
+	/* @embed */
+	background: url(images/icon-pages.png) no-repeat left center;
+}
+
+.mw-number-text.icon-contributors {
+	/* @embed */
+	background: url(images/icon-contributors.png) no-repeat left center;
+}
+
+/* Special font for numbers in benefits*/
+div.mw-number-text h3 {
+	top: 0;
+	margin: 0;
+	padding: 0;
+	color: #252525;
+	font-family: 'Georgia', serif;
+	font-weight: normal;
+	font-size: 2.2em;
+	line-height: 1.2;
+	text-align: center;
+}
+
+/* Contains a number and explanatory text, with space for an icon */
+div.mw-number-text {
+	display: block;
+	font-size: 1.2em;
+	color: #444;
+	margin-top: 1em;
+	padding: 0 0 0 95px; /* 80px wide icon plus "margin" */
+	min-height: 75px; /* matches max icon height, ensures icon emblem is visible */
+	text-align: center;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.createAccount.js b/resources/mediawiki.special/mediawiki.special.createAccount.js
new file mode 100644
index 00000000..5cbb1ee0
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.createAccount.js
@@ -0,0 +1,112 @@
+/**
+ * JavaScript for Create account form (Special:UserLogin?type=signup).
+ */
+( function ( mw, $ ) {
+
+	// When sending password by email, hide the password input fields.
+	// This function doesn't need to be loaded early by ResourceLoader, but is tiny.
+	function hidePasswordOnEmail() {
+		// Always required if checked, otherwise it depends, so we use the original
+		var $emailLabel = $( 'label[for="wpEmail"]' ),
+			originalText = $emailLabel.text(),
+			requiredText = mw.message( 'createacct-emailrequired' ).text(),
+			$createByMailCheckbox = $( '#wpCreateaccountMail' ),
+			$beforePwds = $( '.mw-row-password:first' ).prev(),
+			$pwds;
+
+		function updateForCheckbox() {
+			var checked = $createByMailCheckbox.prop( 'checked' );
+			if ( checked ) {
+				$pwds = $( '.mw-row-password' ).detach();
+				$emailLabel.text( requiredText );
+			} else {
+				if ( $pwds ) {
+					$beforePwds.after( $pwds );
+					$pwds = null;
+				}
+				$emailLabel.text( originalText );
+			}
+		}
+
+		$createByMailCheckbox.on( 'change', updateForCheckbox );
+		updateForCheckbox();
+	}
+
+	// Move the FancyCaptcha image into a more attractive container.
+	// This function does need to be run early by ResourceLoader.
+	function adjustFancyCaptcha() {
+		var $content = $( '#mw-content-text' ),
+			$submit = $content.find( '#wpCreateaccount' ),
+			tabIndex,
+			$captchaStuff,
+			$captchaImageContainer,
+			// JavaScript can't yet parse the message createacct-imgcaptcha-help when it
+			// contains a MediaWiki transclusion, so PHP parses it and sends the HTML.
+			helpMsg = mw.config.get( 'wgCreateacctImgcaptchaHelp' ),
+			helpHtml = '';
+
+		/*
+		 * CAPTCHA
+		 * The CAPTCHA is in a div style="captcha" at the top of the form.
+		 * If it's a FancyCaptcha, then we remove it and insert it lower down,
+		 * in a customized div with just what we need (e.g. no
+		 * fancycaptcha-createaccount message).
+		 */
+		if ( !$submit.length) {
+			return;
+		}
+		tabIndex = $submit.prop( 'tabindex' ) - 1;
+		$captchaStuff = $content.find ( '.captcha' );
+
+		if ( $captchaStuff.length ) {
+
+			// The FancyCaptcha has this class in the ConfirmEdit extension
+			// after 2013-04-18.
+			$captchaImageContainer = $captchaStuff.find( '.fancycaptcha-image-container' );
+			if ( $captchaImageContainer.length !== 1 ) {
+				return;
+			}
+
+			$captchaStuff.remove();
+
+			if ( helpMsg) {
+				helpHtml = '<small class="mw-createacct-captcha-assisted">' + helpMsg + '</small>';
+			}
+
+			// Insert another div before the submit button that will include the
+			// repositioned FancyCaptcha div, an input field, and possible help.
+			$submit.closest( 'div' )
+				.before( [
+			'<div>',
+				'<label for="wpCaptchaWord">' + mw.message( 'createacct-captcha' ).escaped() + '</label>',
+				'<div class="mw-createacct-captcha-container">',
+					'<div class="mw-createacct-captcha-and-reload" />',
+					'<input id="wpCaptchaWord" name="wpCaptchaWord" type="text" placeholder="' +
+						mw.message( 'createacct-imgcaptcha-ph' ).escaped() +
+						'" tabindex="' + tabIndex + '" autocapitalize="off" autocorrect="off">',
+						helpHtml,
+				'</div>',
+			'</div>'
+					].join( '' )
+				);
+
+			// Stick the FancyCaptcha container inside our bordered and framed parents.
+			$captchaImageContainer
+				.prependTo( $content.find( '.mw-createacct-captcha-and-reload' ) );
+
+			// Find the input field, add the text (if any) of the existing CAPTCHA
+			// field (although usually it's blanked out on every redisplay),
+			// and after it move over the hidden field that tells the CAPTCHA
+			// what to do.
+			$content.find( '#wpCaptchaWord' )
+				.val( $captchaStuff.find( '#wpCaptchaWord' ).val() )
+				.after( $captchaStuff.find( '#wpCaptchaId' ) );
+		}
+	}
+
+	$( function () {
+		adjustFancyCaptcha();
+		hidePasswordOnEmail();
+	} );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.movePage.js b/resources/mediawiki.special/mediawiki.special.movePage.js
index f719d07c..922eba5e 100644
--- a/resources/mediawiki.special/mediawiki.special.movePage.js
+++ b/resources/mediawiki.special/mediawiki.special.movePage.js
@@ -1,6 +1,6 @@
 /**
  * JavaScript for Special:MovePage
  */
-jQuery( document ).ready( function ( $ ) {
+jQuery( function ( $ ) {
 	$( '#wpReason, #wpNewTitleMain' ).byteLimit();
 } );
diff --git a/resources/mediawiki.special/mediawiki.special.pagesWithProp.css b/resources/mediawiki.special/mediawiki.special.pagesWithProp.css
new file mode 100644
index 00000000..7ef75d0c
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.pagesWithProp.css
@@ -0,0 +1,4 @@
+/* Distinguish actual data from information about it being hidden visually */
+.prop-value-hidden {
+	font-style: italic;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.preferences.js b/resources/mediawiki.special/mediawiki.special.preferences.js
index 6eaec6a1..03d93d00 100644
--- a/resources/mediawiki.special/mediawiki.special.preferences.js
+++ b/resources/mediawiki.special/mediawiki.special.preferences.js
@@ -1,7 +1,7 @@
 /**
  * JavaScript for Special:Preferences
  */
-jQuery( document ).ready( function ( $ ) {
+jQuery( function ( $ ) {
 	var $preftoc, $preferences, $fieldsets, $legends,
 		hash,
 		$tzSelect, $tzTextbox, $localtimeHolder, servertime;
diff --git a/resources/mediawiki.special/mediawiki.special.recentchanges.js b/resources/mediawiki.special/mediawiki.special.recentchanges.js
index d1c1354f..79d793af 100644
--- a/resources/mediawiki.special/mediawiki.special.recentchanges.js
+++ b/resources/mediawiki.special/mediawiki.special.recentchanges.js
@@ -27,7 +27,7 @@
 		}
 	};
 
-	$( document ).ready( rc.init );
+	$( rc.init );
 
 	mw.special.recentchanges = rc;
 
diff --git a/resources/mediawiki.special/mediawiki.special.search.js b/resources/mediawiki.special/mediawiki.special.search.js
index 2dab3026..035252bf 100644
--- a/resources/mediawiki.special/mediawiki.special.search.js
+++ b/resources/mediawiki.special/mediawiki.special.search.js
@@ -2,7 +2,7 @@
  * JavaScript for Special:Search
  */
 ( function ( mw, $ ) {
-	$( document ).ready( function () {
+	$( function () {
 		var $checkboxes, $headerLinks;
 
 		// Emulate HTML5 autofocus behavior in non HTML5 compliant browsers
diff --git a/resources/mediawiki.special/mediawiki.special.undelete.js b/resources/mediawiki.special/mediawiki.special.undelete.js
index d20aab51..0dea3ef9 100644
--- a/resources/mediawiki.special/mediawiki.special.undelete.js
+++ b/resources/mediawiki.special/mediawiki.special.undelete.js
@@ -1,7 +1,7 @@
 /**
  * JavaScript for Special:Undelete
  */
-jQuery( document ).ready( function ( $ ) {
+jQuery( function ( $ ) {
 	$( '#mw-undelete-invert' ).click( function ( e ) {
 		$( '#undelete input[type="checkbox"]' ).prop( 'checked', function ( i, val ) {
 			return !val;
diff --git a/resources/mediawiki.special/mediawiki.special.upload.js b/resources/mediawiki.special/mediawiki.special.upload.js
index 75532f18..3f40c549 100644
--- a/resources/mediawiki.special/mediawiki.special.upload.js
+++ b/resources/mediawiki.special/mediawiki.special.upload.js
@@ -6,7 +6,7 @@
 	/**
 	 * Add a preview to the upload form
 	 */
-	$( document ).ready( function () {
+	$( function () {
 		/**
 		 * Is the FileAPI available with sufficient functionality?
 		 */
@@ -290,7 +290,7 @@
 	/**
 	 * Disable all upload source fields except the selected one
 	 */
-	$( document ).ready( function () {
+	$( function () {
 		var i, $row,
 			$rows = $( '.mw-htmlform-field-UploadSourceField' );
 
diff --git a/resources/mediawiki.special/mediawiki.special.userLogin.css b/resources/mediawiki.special/mediawiki.special.userLogin.css
new file mode 100644
index 00000000..24c8d771
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.userLogin.css
@@ -0,0 +1,39 @@
+/* Styles just for VForm user login */
+#mw-userlogin-help {
+	text-align: center;
+}
+
+.mw-ui-vform .mw-secure {
+	/* @embed */
+	background: url(images/icon-lock.png) no-repeat scroll left center transparent;
+	margin: 0 0 0 1px;
+	padding: 0 0 0 11px;
+}
+
+/* The login form invites users to create an account */
+#mw-createaccount-cta {
+	width: 20em;
+	height: 10em;
+	/* @embed */
+	background: url(images/glyph-people-large.png) no-repeat 50%;
+	margin: 0 auto;
+}
+
+#mw-createaccount-cta h3,
+#mw-createaccount-another h3 {
+	font-size: 0.9em;
+	font-weight: normal;
+	text-align: center;
+}
+
+#mw-createaccount-cta h3 {
+	padding-top: 4em;
+}
+
+#mw-createaccount-join {
+	margin-left: 0.75em;
+	/* Separate from background image */
+	box-shadow: 4px 4px 4px 4px rgba(255, 255, 255, 1);
+	width: auto;
+	display: inline-block;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.userLogin.signup.js b/resources/mediawiki.special/mediawiki.special.userLogin.signup.js
deleted file mode 100644
index bba42605..00000000
--- a/resources/mediawiki.special/mediawiki.special.userLogin.signup.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * JavaScript for Special:UserLogin/signup
- */
-jQuery( document ).ready( function ( $ ) {
-	$( '#wpCreateaccountMail' )
-		.on( 'change', function() {
-			$( '.mw-row-password' ).toggle( !$( this ).attr( 'checked' ) );
-		} )
-		.trigger( 'change' );
-} );
diff --git a/resources/mediawiki.special/mediawiki.special.vforms.css b/resources/mediawiki.special/mediawiki.special.vforms.css
new file mode 100644
index 00000000..768a9c6e
--- /dev/null
+++ b/resources/mediawiki.special/mediawiki.special.vforms.css
@@ -0,0 +1,46 @@
+/*
+ * When inside the VForm style, disable the border that Vector and other skins
+ * put on the div surrounding the login/create account form.
+ * Also disable the margin and padding that Vector puts around the form.
+ */
+.mw-ui-container #userloginForm,
+.mw-ui-container #userlogin {
+	border: 0;
+	margin: 0;
+	padding: 0;
+}
+
+/* Reposition and resize language links, which appear on a per-wiki basis */
+.mw-ui-container #languagelinks {
+	margin-bottom: 2em;
+	font-size: 0.8em;
+}
+
+/* Put some space under template's header, which may contain CAPTCHA HTML.*/
+section.mw-form-header {
+	margin-bottom: 10px;
+}
+
+/*
+ * Styles for information boxes.
+ */
+.mw-ui-vform .errorbox,
+.mw-ui-vform .warningbox,
+.mw-ui-vform .successbox {
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	box-sizing: border-box;
+	font-size: 0.9em;
+	margin: 0 0 1em 0;
+	padding: 0.5em;
+	word-wrap: break-word;
+}
+
+/*
+ * Override the right margin of the form to give space in case a benefits
+ * column appears to the side.
+ *
+ */
+.mw-ui-container #userloginForm {
+	margin-right: 100px;
+}
diff --git a/resources/mediawiki.ui/mediawiki.ui.default.css b/resources/mediawiki.ui/mediawiki.ui.default.css
new file mode 100644
index 00000000..b0726165
--- /dev/null
+++ b/resources/mediawiki.ui/mediawiki.ui.default.css
@@ -0,0 +1,272 @@
+@charset "UTF-8";
+/**
+ * Provide Agora appearance for mw-ui-* classes when using a skin other than
+ * Vector.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+/* _effects.scss */
+/* Mixins for visual effects in CSS3 */
+/* line 7, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-left {
+  float: left;
+  margin-left: 0;
+  padding-left: 0;
+}
+
+/* line 11, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-right {
+  float: right;
+  margin-right: 0;
+  padding-right: 0;
+}
+
+/* line 15, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-center-block {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+/* line 4, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button {
+  display: -moz-inline-stack;
+  display: inline-block;
+  vertical-align: middle;
+  *vertical-align: auto;
+  zoom: 1;
+  *display: inline;
+  padding: 0.4em 1em 0.4em 1em;
+  margin: 0;
+  background-color: #c9c9c9;
+  *background-color: #c9c9c9;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFDCDCDC', endColorstr='#FFC9C9C9');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dcdcdc), color-stop(100%, #c9c9c9));
+  background-image: -webkit-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: -moz-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: -o-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: linear-gradient(top, #dcdcdc, #c9c9c9);
+  color: black;
+  text-shadow: 0 1px 1px rgba(201, 201, 201, 0.3);
+  border: 1px solid #c4c4c4;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  -ms-border-radius: 3px;
+  -o-border-radius: 3px;
+  border-radius: 3px;
+  vertical-align: middle;
+  text-align: center;
+  text-decoration: none;
+  font-weight: bold;
+  cursor: pointer;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:hover, .mw-ui-button.mw-ui-hover {
+  background-color: gainsboro;
+  *background-color: gainsboro;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFE9E9E9', endColorstr='#FFDCDCDC');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e9e9e9), color-stop(100%, #dcdcdc));
+  background-image: -webkit-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: -moz-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: -o-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: linear-gradient(top, #e9e9e9, #dcdcdc);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:active, .mw-ui-button.mw-ui-active {
+  background-image: none;
+  background-color: #c1c1c1;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+  background-image: none;
+  background-color: #c9c9c9;
+  opacity: 0.5;
+  text-shadow: none;
+}
+/* line 30, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+  cursor: default;
+}
+/* line 36, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-big {
+  font-size: 1.3em;
+}
+/* line 41, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-block {
+  display: block;
+  width: 100%;
+}
+
+/* line 49, sourcefiles/scss/components/default/_buttons.scss */
+a.mw-ui-button {
+  text-decoration: none;
+}
+
+/* line 56, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > * {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -ms-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+  float: left;
+}
+/* line 60, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:first-child {
+  -moz-border-radius-topleft: 3px;
+  -webkit-border-top-left-radius: 3px;
+  border-top-left-radius: 3px;
+  -moz-border-radius-bottomleft: 3px;
+  -webkit-border-bottom-left-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+/* line 65, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:last-child {
+  -moz-border-radius-topright: 3px;
+  -webkit-border-top-right-radius: 3px;
+  border-top-right-radius: 3px;
+  -moz-border-radius-bottomright: 3px;
+  -webkit-border-bottom-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+
+/* line 14, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 290px;
+}
+/* line 20, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div {
+  display: block;
+  margin: 0 0 15px 0;
+  padding: 0;
+  width: 100%;
+}
+/* line 28, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input,
+.mw-ui-vform > div .mw-ui-button {
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  margin: 0;
+  width: 100%;
+}
+/* line 37, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]) {
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  color: #252525;
+  padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 11, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus {
+  box-shadow: #4091ed 0px 0px 5px;
+  border-color: #4091ed;
+}
+/* line 13, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus:not([type=checkbox]):not([type=radio]) {
+  outline: 0;
+}
+/* line 41, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div label {
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  font-size: 0.9em;
+  color: #4a4a4a;
+  width: auto;
+  margin: 0 0 0.2em 0;
+  padding: 0;
+}
+/* line 38, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div label * {
+  font-weight: normal;
+}
+/* line 52, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input[type="checkbox"],
+.mw-ui-vform > div input[type="radio"] {
+  display: inline;
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  width: auto;
+}
+/* line 63, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform .error {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  font-size: 0.9em;
+  margin: 0 0 1em 0;
+  padding: 0.5em;
+  color: #cc0000;
+  border: 1px solid #fac5c5;
+  background-color: #fae3e3;
+  text-shadow: 0 1px #fae3e3;
+  word-wrap: break-word;
+}
+
+/* line 86, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform-div {
+  display: block;
+  margin: 0 0 15px 0;
+  padding: 0;
+  width: 100%;
+}
+
+/* line 96, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-input {
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  color: #252525;
+  padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 11, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-input:focus {
+  box-shadow: #4091ed 0px 0px 5px;
+  border-color: #4091ed;
+}
+/* line 13, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-input:focus:not([type=checkbox]):not([type=radio]) {
+  outline: 0;
+}
+
+/* line 103, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-label {
+  font-size: 0.9em;
+  color: #4a4a4a;
+}
+/* line 38, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-label * {
+  font-weight: normal;
+}
+
+/* line 112, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-checkbox-label, .mw-ui-radio-label {
+  margin-bottom: 0.5em;
+  cursor: pointer;
+  vertical-align: bottom;
+  line-height: normal;
+  font-weight: normal;
+}
+/* line 54, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-checkbox-label > input[type="radio"], .mw-ui-radio-label > input[type="checkbox"], .mw-ui-radio-label > input[type="radio"] {
+  width: auto;
+  height: auto;
+  margin: 0 0.1em 0em 0;
+  padding: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  cursor: pointer;
+}
diff --git a/resources/mediawiki.ui/mediawiki.ui.vector.css b/resources/mediawiki.ui/mediawiki.ui.vector.css
new file mode 100644
index 00000000..fd9e0915
--- /dev/null
+++ b/resources/mediawiki.ui/mediawiki.ui.vector.css
@@ -0,0 +1,414 @@
+@charset "UTF-8";
+/**
+ * Provide Agora appearance for mw-ui-* classes when using the Vector skin.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+/* _effects.scss */
+/* Mixins for visual effects in CSS3 */
+/* line 7, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-left {
+  float: left;
+  margin-left: 0;
+  padding-left: 0;
+}
+
+/* line 11, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-right {
+  float: right;
+  margin-right: 0;
+  padding-right: 0;
+}
+
+/* line 15, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-center-block {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+/* line 4, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button {
+  display: -moz-inline-stack;
+  display: inline-block;
+  vertical-align: middle;
+  *vertical-align: auto;
+  zoom: 1;
+  *display: inline;
+  padding: 0.4em 1em 0.4em 1em;
+  margin: 0;
+  background-color: #c9c9c9;
+  *background-color: #c9c9c9;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFDCDCDC', endColorstr='#FFC9C9C9');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dcdcdc), color-stop(100%, #c9c9c9));
+  background-image: -webkit-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: -moz-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: -o-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: linear-gradient(top, #dcdcdc, #c9c9c9);
+  color: black;
+  text-shadow: 0 1px 1px rgba(201, 201, 201, 0.3);
+  border: 1px solid #c4c4c4;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  -ms-border-radius: 3px;
+  -o-border-radius: 3px;
+  border-radius: 3px;
+  vertical-align: middle;
+  text-align: center;
+  text-decoration: none;
+  font-weight: bold;
+  cursor: pointer;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:hover, .mw-ui-button.mw-ui-hover {
+  background-color: gainsboro;
+  *background-color: gainsboro;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFE9E9E9', endColorstr='#FFDCDCDC');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e9e9e9), color-stop(100%, #dcdcdc));
+  background-image: -webkit-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: -moz-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: -o-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: linear-gradient(top, #e9e9e9, #dcdcdc);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:active, .mw-ui-button.mw-ui-active {
+  background-image: none;
+  background-color: #c1c1c1;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+  background-image: none;
+  background-color: #c9c9c9;
+  opacity: 0.5;
+  text-shadow: none;
+}
+/* line 30, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+  cursor: default;
+}
+/* line 36, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-big {
+  font-size: 1.3em;
+}
+/* line 41, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-block {
+  display: block;
+  width: 100%;
+}
+
+/* line 49, sourcefiles/scss/components/default/_buttons.scss */
+a.mw-ui-button {
+  text-decoration: none;
+}
+
+/* line 56, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > * {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -ms-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+  float: left;
+}
+/* line 60, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:first-child {
+  -moz-border-radius-topleft: 3px;
+  -webkit-border-top-left-radius: 3px;
+  border-top-left-radius: 3px;
+  -moz-border-radius-bottomleft: 3px;
+  -webkit-border-bottom-left-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+/* line 65, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:last-child {
+  -moz-border-radius-topright: 3px;
+  -webkit-border-top-right-radius: 3px;
+  border-top-right-radius: 3px;
+  -moz-border-radius-bottomright: 3px;
+  -webkit-border-bottom-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+
+/* line 3, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button {
+  font-size: 1em;
+  line-height: 1.4em;
+}
+/* line 6, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button.mw-ui-primary {
+  background-color: #3366bb;
+  *background-color: #3366bb;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF4779CD', endColorstr='#FF3366BB');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4779cd), color-stop(100%, #3366bb));
+  background-image: -webkit-linear-gradient(top, #4779cd, #3366bb);
+  background-image: -moz-linear-gradient(top, #4779cd, #3366bb);
+  background-image: -o-linear-gradient(top, #4779cd, #3366bb);
+  background-image: linear-gradient(top, #4779cd, #3366bb);
+  color: white;
+  text-shadow: 0 1px 1px rgba(51, 102, 187, 0.75);
+  border: 1px solid #3162b3;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-primary:hover, .mw-ui-button.mw-ui-primary.mw-ui-hover {
+  background-color: #4779cd;
+  *background-color: #4779cd;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF5B88D2', endColorstr='#FF4779CD');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5b88d2), color-stop(100%, #4779cd));
+  background-image: -webkit-linear-gradient(top, #5b88d2, #4779cd);
+  background-image: -moz-linear-gradient(top, #5b88d2, #4779cd);
+  background-image: -o-linear-gradient(top, #5b88d2, #4779cd);
+  background-image: linear-gradient(top, #5b88d2, #4779cd);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-primary:active, .mw-ui-button.mw-ui-primary.mw-ui-active {
+  background-image: none;
+  background-color: #305faf;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-primary:disabled, .mw-ui-button.mw-ui-primary.mw-ui-disabled {
+  background-image: none;
+  background-color: #3366bb;
+  opacity: 0.5;
+  text-shadow: none;
+}
+/* line 10, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button.mw-ui-constructive {
+  background-color: #27aa65;
+  *background-color: #27aa65;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF2EC977', endColorstr='#FF27AA65');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2ec977), color-stop(100%, #27aa65));
+  background-image: -webkit-linear-gradient(top, #2ec977, #27aa65);
+  background-image: -moz-linear-gradient(top, #2ec977, #27aa65);
+  background-image: -o-linear-gradient(top, #2ec977, #27aa65);
+  background-image: linear-gradient(top, #2ec977, #27aa65);
+  color: white;
+  text-shadow: 0 1px 1px rgba(39, 170, 101, 0.75);
+  border: 1px solid #25a260;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-constructive:hover, .mw-ui-button.mw-ui-constructive.mw-ui-hover {
+  background-color: #2ec977;
+  *background-color: #2ec977;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF3ED384', endColorstr='#FF2EC977');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #3ed384), color-stop(100%, #2ec977));
+  background-image: -webkit-linear-gradient(top, #3ed384, #2ec977);
+  background-image: -moz-linear-gradient(top, #3ed384, #2ec977);
+  background-image: -o-linear-gradient(top, #3ed384, #2ec977);
+  background-image: linear-gradient(top, #3ed384, #2ec977);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-constructive:active, .mw-ui-button.mw-ui-constructive.mw-ui-active {
+  background-image: none;
+  background-color: #249e5e;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-constructive:disabled, .mw-ui-button.mw-ui-constructive.mw-ui-disabled {
+  background-image: none;
+  background-color: #27aa65;
+  opacity: 0.5;
+  text-shadow: none;
+}
+/* line 14, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button.mw-ui-destructive {
+  background-color: #cc0000;
+  *background-color: #cc0000;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFF20000', endColorstr='#FFCC0000');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f20000), color-stop(100%, #cc0000));
+  background-image: -webkit-linear-gradient(top, #f20000, #cc0000);
+  background-image: -moz-linear-gradient(top, #f20000, #cc0000);
+  background-image: -o-linear-gradient(top, #f20000, #cc0000);
+  background-image: linear-gradient(top, #f20000, #cc0000);
+  color: white;
+  text-shadow: 0 1px 1px rgba(204, 0, 0, 0.75);
+  border: 1px solid #c20000;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-destructive:hover, .mw-ui-button.mw-ui-destructive.mw-ui-hover {
+  background-color: #f20000;
+  *background-color: #f20000;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFFF0D0D', endColorstr='#FFF20000');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ff0d0d), color-stop(100%, #f20000));
+  background-image: -webkit-linear-gradient(top, #ff0d0d, #f20000);
+  background-image: -moz-linear-gradient(top, #ff0d0d, #f20000);
+  background-image: -o-linear-gradient(top, #ff0d0d, #f20000);
+  background-image: linear-gradient(top, #ff0d0d, #f20000);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-destructive:active, .mw-ui-button.mw-ui-destructive.mw-ui-active {
+  background-image: none;
+  background-color: #bd0000;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-destructive:disabled, .mw-ui-button.mw-ui-destructive.mw-ui-disabled {
+  background-image: none;
+  background-color: #cc0000;
+  opacity: 0.5;
+  text-shadow: none;
+}
+
+/* line 14, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 290px;
+}
+/* line 20, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div {
+  display: block;
+  margin: 0 0 15px 0;
+  padding: 0;
+  width: 100%;
+}
+/* line 28, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input,
+.mw-ui-vform > div .mw-ui-button {
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  margin: 0;
+  width: 100%;
+}
+/* line 37, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]) {
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  color: #252525;
+  padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 11, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus {
+  box-shadow: #4091ed 0px 0px 5px;
+  border-color: #4091ed;
+}
+/* line 13, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div input:not([type=button]):not([type=submit]):not([type=file]):focus:not([type=checkbox]):not([type=radio]) {
+  outline: 0;
+}
+/* line 41, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div label {
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  font-size: 0.9em;
+  color: #4a4a4a;
+  width: auto;
+  margin: 0 0 0.2em 0;
+  padding: 0;
+}
+/* line 38, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div label * {
+  font-weight: normal;
+}
+/* line 52, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input[type="checkbox"],
+.mw-ui-vform > div input[type="radio"] {
+  display: inline;
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  width: auto;
+}
+/* line 63, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform .error {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  font-size: 0.9em;
+  margin: 0 0 1em 0;
+  padding: 0.5em;
+  color: #cc0000;
+  border: 1px solid #fac5c5;
+  background-color: #fae3e3;
+  text-shadow: 0 1px #fae3e3;
+  word-wrap: break-word;
+}
+
+/* line 86, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform-div {
+  display: block;
+  margin: 0 0 15px 0;
+  padding: 0;
+  width: 100%;
+}
+
+/* line 96, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-input {
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  color: #252525;
+  padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 11, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-input:focus {
+  box-shadow: #4091ed 0px 0px 5px;
+  border-color: #4091ed;
+}
+/* line 13, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-input:focus:not([type=checkbox]):not([type=radio]) {
+  outline: 0;
+}
+
+/* line 103, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-label {
+  font-size: 0.9em;
+  color: #4a4a4a;
+}
+/* line 38, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-label * {
+  font-weight: normal;
+}
+
+/* line 112, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-checkbox-label, .mw-ui-radio-label {
+  margin-bottom: 0.5em;
+  cursor: pointer;
+  vertical-align: bottom;
+  line-height: normal;
+  font-weight: normal;
+}
+/* line 54, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-checkbox-label > input[type="radio"], .mw-ui-radio-label > input[type="checkbox"], .mw-ui-radio-label > input[type="radio"] {
+  width: auto;
+  height: auto;
+  margin: 0 0.1em 0em 0;
+  padding: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  cursor: pointer;
+}
+
+/* line 5, sourcefiles/scss/components/vector/_forms.scss */
+.mw-ui-vform,
+.mw-ui-vform > div input,
+.mw-ui-input {
+  font-size: 1em;
+  line-height: 1.4em;
+}
+
+/* line 3, sourcefiles/scss/components/vector/_containers.scss */
+.mw-ui-container {
+  font-size: 1em;
+  line-height: 1.4em;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/Makefile b/resources/mediawiki.ui/sourcefiles/Makefile
new file mode 100644
index 00000000..dea90139
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/Makefile
@@ -0,0 +1,24 @@
+DATE=$(shell date +%I:%M%p)
+CHECK=\033[32m✔\033[39m
+HR=\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#
+
+build:
+	@echo "\n${HR}"
+	@echo "Building Agora..."
+	@echo "${HR}\n"
+	@compass compile
+	@echo "Compiling Compass project...            ${CHECK} Done"
+	@rm -rf .sass-cache
+	@echo "Removing .sass-cache...                 ${CHECK} Done"
+	@echo "\n${HR}"
+	@echo "Agora successfully built at ${DATE}."
+	@echo "${HR}\n"
+
+all: build
+
+watch:
+	@echo "\n${HR}"
+	@echo "Watching SCSS files for Agora..."
+	@echo "${HR}\n"
+	@compass watch
+	@echo "Started watching modules/scss at ${DATE}..."
diff --git a/resources/mediawiki.ui/sourcefiles/config.rb b/resources/mediawiki.ui/sourcefiles/config.rb
new file mode 100644
index 00000000..28c65240
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/config.rb
@@ -0,0 +1,27 @@
+# Require any additional compass plugins here.
+
+# Set this to the root of your project when deployed:
+# (unused so far): http_path = "/"
+
+# Output to parent of build directory
+css_dir = ".."
+sass_dir = "scss"
+# (unused so far): images_dir = "modules/img"
+# (unused so far): javascripts_dir = "modules/js"
+
+# You can select your preferred output style here (can be overridden via the command line):
+# output_style = :expanded or :nested or :compact or :compressed
+output_style = :expanded
+
+# To enable relative paths to assets via compass helper functions. Uncomment:
+relative_assets = true
+
+# To disable debugging comments that display the original location of your selectors. Uncomment:
+line_comments = true
+
+
+# If you prefer the indented syntax, you might want to regenerate this
+# project again passing --syntax sass, or you can uncomment this:
+# preferred_syntax = :sass
+# and then run:
+# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_default.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_default.scss
new file mode 100644
index 00000000..e7090ebc
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/_default.scss
@@ -0,0 +1,3 @@
+@import "utilities";
+@import "default/buttons";
+@import "default/forms";
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss
new file mode 100644
index 00000000..4f1dba2f
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss
@@ -0,0 +1,17 @@
+// Generic helper classes that could be used in many elements/layouts
+
+// --------------------------------------------------------------------------
+// Positioning
+// --------------------------------------------------------------------------
+
+.mw-ui-flush-left {
+    @include agora-flush-left;
+}
+
+.mw-ui-flush-right {
+    @include agora-flush-right;
+}
+
+.mw-ui-center-block {
+    @include agora-center-block;
+}
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss
new file mode 100644
index 00000000..d7cb34ae
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss
@@ -0,0 +1,4 @@
+@import "utilities";
+@import "vector/buttons";
+@import "vector/forms";
+@import "vector/containers";
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss b/resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss
new file mode 100644
index 00000000..d67810f7
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss
@@ -0,0 +1,69 @@
+$buttonBorderRadius: 3px;
+
+// Button styling
+.mw-ui-button {
+    // Container layout
+    @include inline-block;
+    padding: 0.4em 1em 0.4em 1em;
+    margin: 0;
+
+    // Container styling
+    @include buttonColors($agoraGray);
+    @include border-radius($buttonBorderRadius);
+
+    // Content styling
+    vertical-align: middle;
+
+    text: {
+        align: center;
+        decoration: none;
+    }
+
+    font: {
+        weight: bold;
+    }
+
+    // Interaction styling
+    cursor: pointer;
+
+    &:disabled,
+    &.mw-ui-disabled {
+        cursor: default;
+    }
+
+    // Button sizes and displays
+    // -----------------------------------------
+    &.mw-ui-big {
+        font: {
+            size: $baseFontSize * 1.3;
+        }
+    }
+    &.mw-ui-block {
+        display: block;
+        width: 100%;
+    }
+}
+
+// This overrides an underline declaration on a:hover and a:focus in commonElements.css, which the
+// class alone isn't specific enough to do
+a.mw-ui-button {
+    text: {
+        decoration: none;
+    }
+}
+
+// Button groups
+.mw-ui-button-group > * {
+  @include border-radius(0);
+  float: left;
+
+  &:first-child{
+    @include border-top-left-radius($buttonBorderRadius);
+    @include border-bottom-left-radius($buttonBorderRadius);
+  }
+
+  &:last-child{
+    @include border-top-right-radius($buttonBorderRadius);
+    @include border-bottom-right-radius($buttonBorderRadius);
+  }
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss
new file mode 100644
index 00000000..a9cec39a
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss
@@ -0,0 +1,114 @@
+// Form elements and layouts
+
+// --------------------------------------------------------------------------
+// Layouts
+// --------------------------------------------------------------------------
+
+// The FancyCaptcha image CAPTCHA used on WMF wikis drives the width of the
+// 'VForm' design, the form can't be narrower than this.
+$captchaContainerWidth: 290px;
+$defaultFormWidth: $captchaContainerWidth;
+
+// Style a compact vertical stacked form ("VForm") and the elements in divs
+// within it.
+.mw-ui-vform {
+    @include box-sizing(border-box);
+
+    width: $defaultFormWidth;
+
+    // Immediate divs in a vform are block and spaced-out.
+    & > div {
+        display: block;
+        margin: 0 0 15px 0;
+        padding: 0;
+        width: 100%;
+
+        // MW currently doesn't use the type attribute everywhere on inputs.
+        input,
+        .mw-ui-button {
+            display: block;
+            @include box-sizing(border-box);
+            margin: 0;
+            width: 100%;
+        }
+
+        // We exclude these because they'll generally use mw-ui-button.
+        // Otherwise, we'll unintentionally override that.
+        input:not([type=button]):not([type=submit]):not([type=file]), {
+            @include agora-field-styling; // mixins/_forms.scss
+        }
+
+        label {
+            display: block;
+            @include box-sizing(border-box);
+            @include agora-label-styling;
+            width: auto;
+            margin: 0 0 0.2em 0;
+            padding: 0;
+        }
+
+        // Override input styling just for checkboxes and radio inputs.
+        input[type="checkbox"],
+        input[type="radio"] {
+            display: inline;
+            @include box-sizing(content-box);
+            width: auto;
+        }
+
+    }
+
+    // HTMLForm uses error, SpecialUserlogin (login and create account) uses
+    // errorbox.
+    // TODO move errorbox from mediawiki.special.vforms.css into here.
+    .error {
+        -webkit-box-sizing: border-box;
+        -moz-box-sizing: border-box;
+        box-sizing: border-box;
+        font-size: 0.9em;
+        margin: 0 0 1em 0;
+        padding: 0.5em;
+        color: #cc0000;
+        border: 1px solid #fac5c5;
+        background-color: #fae3e3;
+        text-shadow: 0 1px #fae3e3;
+        word-wrap: break-word;
+    }
+}
+
+// --------------------------------------------------------------------------
+// Elements
+// --------------------------------------------------------------------------
+
+// Apply this to individual elements to style them.
+// You generally don't need to use this class on divs within an Agora
+// form container such as mw-ui-vform
+// XXX DRY: This repeats earlier styling, use an @include agora-div-styling ?
+.mw-ui-vform-div {
+	display: block;
+	margin: 0 0 15px 0;
+	padding: 0;
+	width: 100%;
+}
+
+// Apply mw-ui-input to individual input fields to style them.
+// You generally don't need to use this class if <input> is within an Agora
+// form container such as mw-ui-vform
+.mw-ui-input {
+    @include agora-field-styling; // mixins/_forms.scss
+}
+
+// Apply mw-ui-label to individual elements to style them.
+// You generally don't need to use this class if <label> is within an Agora
+// form container such as mw-ui-vform
+.mw-ui-label {
+    @include agora-label-styling; // mixins/_forms.scss
+}
+
+// Nesting an input checkbox or radio button inside a label with this class
+// improves alignment, e.g.
+//   <label class="mw-ui-checkbox-label">
+//       <input type="checkbox">The label text
+//   </label>
+.mw-ui-checkbox-label, .mw-ui-radio-label {
+    @include agora-inline-label-styling;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss
new file mode 100644
index 00000000..8d5f0b6a
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss
@@ -0,0 +1,19 @@
+@import "../default/buttons"; // Layer Vector on top of the default settings.
+
+.mw-ui-button {
+    // Button colors determined by function.
+    // -----------------------------------------
+    &.mw-ui-primary {
+        @include buttonColors($agoraBlue);
+    }
+
+    &.mw-ui-constructive {
+        @include buttonColors($agoraGreen);
+    }
+
+    &.mw-ui-destructive {
+        @include buttonColors($agoraRed);
+    }
+
+    @include vector-type;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss
new file mode 100644
index 00000000..ed01603d
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss
@@ -0,0 +1,5 @@
+// No default settings for containers yet.
+
+.mw-ui-container {
+    @include vector-type;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss
new file mode 100644
index 00000000..73ea24e2
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss
@@ -0,0 +1,7 @@
+@import "../default/forms"; // Layer Vector on top of the default settings.
+
+.mw-ui-vform,
+.mw-ui-vform > div input,
+.mw-ui-input {
+    @include vector-type;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss b/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss
new file mode 100644
index 00000000..e6db5237
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss
@@ -0,0 +1,16 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using a skin other than
+ * Vector.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+
+@charset "UTF-8";
+
+@import "compass";
+
+@import "settings/all";
+
+@import "mixins/all";
+
+@import "components/default";
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss b/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss
new file mode 100644
index 00000000..ac113eec
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss
@@ -0,0 +1,15 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using the Vector skin.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+
+@charset "UTF-8";
+
+@import "compass";
+
+@import "settings/all";
+
+@import "mixins/all";
+
+@import "components/vector";
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss
new file mode 100644
index 00000000..adc48cd8
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss
@@ -0,0 +1,4 @@
+@import "utilities";
+@import "type";
+@import "effects";
+@import "forms";
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss
new file mode 100644
index 00000000..2efff820
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss
@@ -0,0 +1,62 @@
+/* _effects.scss */
+
+/* Mixins for visual effects in CSS3 */
+
+// ----------------------------------------------------------------------------
+// Gradients
+// ----------------------------------------------------------------------------
+@mixin vertical-gradient ($startColor: lighten($agoraGray, 95%), $endColor: $agoraGray) {
+	// Fallback
+    background-color: $endColor;
+    *background-color: $endColor; // IE7
+
+    // IE6-8
+    @include filter-gradient($startColor, $endColor, vertical);
+
+    // IE9+, Opera, Gecko, WebKit
+    @include background-image(linear-gradient(top, $startColor, $endColor));
+}
+
+// ----------------------------------------------------------------------------
+// Button styling
+// ----------------------------------------------------------------------------
+@mixin buttonColors ($baseColor: $agoraGray) {
+	// Background color
+	@include vertical-gradient(lighten($baseColor, 7.5%), $baseColor);
+
+	@if $baseColor == $agoraGray {
+		color: black;
+		@include text-shadow(0 1px 1px rgba($baseColor, 0.3));
+	} @else {
+		color: white;
+		@include text-shadow(0 1px 1px rgba($baseColor, 0.75));
+	}
+
+	border: 1px solid darken($baseColor, 2%);
+
+	&:hover,
+	&.mw-ui-hover {
+		@include vertical-gradient(lighten($baseColor, 12.5%), lighten($baseColor, 7.5%));
+		text-decoration: none;
+	}
+
+	&:active,
+	&.mw-ui-active {
+		background: {
+			image: none;
+			color: darken($baseColor, 3%);
+		}
+
+		text-shadow: none;
+	}
+
+	&:disabled,
+	&.mw-ui-disabled {
+		background: {
+			image: none;
+			color: $baseColor;
+		}
+		opacity: 0.5;
+		text-shadow: none;
+	}
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss
new file mode 100644
index 00000000..0f3f6ad3
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss
@@ -0,0 +1,66 @@
+// Font is not included.
+// For Vector, that should be layered on top with vector-type
+@mixin agora-field-styling() {
+
+	border: {
+		style: solid;
+		width: 1px;
+		color: $agoraGray;
+	};
+
+	&:focus {
+		// Styling focus of native checkboxes etc on Mac is almost impossible.
+		&:not([type=checkbox]):not([type=radio]) {
+			@include reset-focus;  // Removes OS field focus
+		};
+
+		// @include box-shadow generates unneeded prefixes
+		// https://github.com/chriseppstein/compass/issues/1054 , so specify
+		// directly.
+		box-shadow: $agoraBlueShadow 0px 0px 5px;
+
+		border: {
+			color: $agoraBlueShadow;
+		};
+	}
+
+	color: $agoraTextColor;
+	padding: 0.35em 0 0.35em 0.5em;
+}
+
+@mixin agora-label-styling() {
+	font: {
+		//weight: bold;
+		size: 0.9em;
+	};
+	color: darken($agoraGray, 50%);
+
+	& * {
+		font-weight: normal;
+	}
+}
+
+@mixin agora-inline-label-styling() {
+	margin-bottom: 0.5em;
+	cursor: pointer;
+	vertical-align: bottom;
+	line-height: normal;
+
+	font: {
+		weight: normal;
+	};
+
+	& > input[type="checkbox"],
+	& > input[type="radio"] {
+		width: auto;
+		height: auto;
+		margin: 0 0.1em 0em 0;
+		padding: 0;
+		border: {
+			style: solid;
+			width: 1px;
+			color: $agoraGray;
+		}
+		cursor: pointer;
+	}
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss
new file mode 100644
index 00000000..8a93a08b
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss
@@ -0,0 +1,6 @@
+@mixin vector-type {
+    font: {
+        size: $baseFontSize;
+    }
+    line-height: $baseLineHeight;
+}
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss
new file mode 100644
index 00000000..71a93b60
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss
@@ -0,0 +1,19 @@
+@mixin agora-flush-left() {
+    float: left;
+    margin-left: 0;
+    padding-left: 0;
+}
+
+@mixin agora-flush-right() {
+    float: right;
+    margin-right: 0;
+    padding-right: 0;
+}
+
+@mixin agora-center-block() {
+    display: block;
+    margin: {
+        left: auto;
+        right: auto;
+    };
+}
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss
new file mode 100644
index 00000000..21ac292f
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss
@@ -0,0 +1,2 @@
+@import "colors";
+@import "typography";
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss
new file mode 100644
index 00000000..0c18bdb4
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss
@@ -0,0 +1,17 @@
+// Grays
+// -----------------------------------------
+$agoraGray: #c9c9c9;
+$agoraTextColor: #252525;
+
+// Blues
+// -----------------------------------------
+$agoraBlue: #3366bb;
+$agoraBlueShadow: #4091ed;
+
+// Greens
+// -----------------------------------------
+$agoraGreen: #27aa65;
+
+// Reds
+// -----------------------------------------
+$agoraRed: #cc0000;
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss
new file mode 100644
index 00000000..013d12b3
--- /dev/null
+++ b/resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss
@@ -0,0 +1,5 @@
+$baseFontSize: 1em;
+$baseLineHeight: 1.4 * $baseFontSize;
+$baseFontColor: $agoraTextColor;
+
+$smallFontSize: 0.75em;
\ No newline at end of file
diff --git a/resources/mediawiki/images/arrow-collapsed-ltr.png b/resources/mediawiki/images/arrow-collapsed-ltr.png
new file mode 100644
index 00000000..b17e578b
Binary files /dev/null and b/resources/mediawiki/images/arrow-collapsed-ltr.png differ
diff --git a/resources/mediawiki/images/arrow-collapsed-rtl.png b/resources/mediawiki/images/arrow-collapsed-rtl.png
new file mode 100644
index 00000000..a834548e
Binary files /dev/null and b/resources/mediawiki/images/arrow-collapsed-rtl.png differ
diff --git a/resources/mediawiki/images/arrow-expanded.png b/resources/mediawiki/images/arrow-expanded.png
new file mode 100644
index 00000000..2bec798e
Binary files /dev/null and b/resources/mediawiki/images/arrow-expanded.png differ
diff --git a/resources/mediawiki/mediawiki.Title.js b/resources/mediawiki/mediawiki.Title.js
index b86a14ba..5038c515 100644
--- a/resources/mediawiki/mediawiki.Title.js
+++ b/resources/mediawiki/mediawiki.Title.js
@@ -1,192 +1,368 @@
 /*!
  * @author Neil Kandalgaonkar, 2010
- * @author Timo Tijhof, 2011
+ * @author Timo Tijhof, 2011-2013
  * @since 1.18
- *
- * Relies on: mw.config (wgFormattedNamespaces, wgNamespaceIds, wgCaseSensitiveNamespaces), mw.util.wikiGetlink
  */
 ( function ( mw, $ ) {
 
-	/* Local space */
-
 	/**
 	 * @class mw.Title
 	 *
+	 * Parse titles into an object struture. Note that when using the constructor
+	 * directly, passing invalid titles will result in an exception. Use #newFromText to use the
+	 * logic directly and get null for invalid titles which is easier to work with.
+	 *
 	 * @constructor
 	 * @param {string} title Title of the page. If no second argument given,
-	 * this will be searched for a namespace.
-	 * @param {number} [namespace] Namespace id. If given, title will be taken as-is.
+	 *  this will be searched for a namespace
+	 * @param {number} [namespace=NS_MAIN] If given, will used as default namespace for the given title
+	 * @throws {Error} When the title is invalid
 	 */
 	function Title( title, namespace ) {
-		this.ns = 0; // integer namespace id
-		this.name = null; // name in canonical 'database' form
-		this.ext = null; // extension
-
-		if ( arguments.length === 2 ) {
-			setNameAndExtension( this, title );
-			this.ns = fixNsId( namespace );
-		} else if ( arguments.length === 1 ) {
-			setAll( this, title );
+		var parsed = parse( title, namespace );
+		if ( !parsed ) {
+			throw new Error( 'Unable to parse title' );
 		}
+
+		this.namespace = parsed.namespace;
+		this.title = parsed.title;
+		this.ext = parsed.ext;
+		this.fragment = parsed.fragment;
+
 		return this;
 	}
 
-var
-	/* Public methods (defined later) */
-	fn,
+	/* Private members */
+
+	var
 
 	/**
-	 * Strip some illegal chars: control chars, colon, less than, greater than,
-	 * brackets, braces, pipe, whitespace and normal spaces. This still leaves some insanity
-	 * intact, like unicode bidi chars, but it's a good start..
-	 * @ignore
-	 * @param {string} s
-	 * @return {string}
+	 * @private
+	 * @static
+	 * @property NS_MAIN
 	 */
-	clean = function ( s ) {
-		if ( s !== undefined ) {
-			return s.replace( /[\x00-\x1f\x23\x3c\x3e\x5b\x5d\x7b\x7c\x7d\x7f\s]+/g, '_' );
-		}
-	},
+	NS_MAIN = 0,
 
 	/**
-	 * Convert db-key to readable text.
-	 * @ignore
-	 * @param {string} s
-	 * @return {string}
+	 * @private
+	 * @static
+	 * @property NS_TALK
 	 */
-	text = function ( s ) {
-		if ( s !== null && s !== undefined ) {
-			return s.replace( /_/g, ' ' );
-		} else {
-			return '';
-		}
-	},
+	NS_TALK = 1,
 
 	/**
-	 * Sanitize name.
-	 * @ignore
+	 * @private
+	 * @static
+	 * @property NS_SPECIAL
 	 */
-	fixName = function ( s ) {
-		return clean( $.trim( s ) );
-	},
+	NS_SPECIAL = -1,
 
 	/**
-	 * Sanitize extension.
-	 * @ignore
+	 * Get the namespace id from a namespace name (either from the localized, canonical or alias
+	 * name).
+	 *
+	 * Example: On a German wiki this would return 6 for any of 'File', 'Datei', 'Image' or
+	 * even 'Bild'.
+	 *
+	 * @private
+	 * @static
+	 * @method getNsIdByName
+	 * @param {string} ns Namespace name (case insensitive, leading/trailing space ignored)
+	 * @return {number|boolean} Namespace id or boolean false
 	 */
-	fixExt = function ( s ) {
-		return clean( s );
+	getNsIdByName = function ( ns ) {
+		var id;
+
+		// Don't cast non-strings to strings, because null or undefined should not result in
+		// returning the id of a potential namespace called "Null:" (e.g. on null.example.org/wiki)
+		// Also, toLowerCase throws exception on null/undefined, because it is a String method.
+		if ( typeof ns !== 'string' ) {
+			return false;
+		}
+		ns = ns.toLowerCase();
+		id = mw.config.get( 'wgNamespaceIds' )[ns];
+		if ( id === undefined ) {
+			return false;
+		}
+		return id;
 	},
 
+	rUnderscoreTrim = /^_+|_+$/g,
+
+	rSplit = /^(.+?)_*:_*(.*)$/,
+
+	// See Title.php#getTitleInvalidRegex
+	rInvalid = new RegExp(
+		'[^' + mw.config.get( 'wgLegalTitleChars' ) + ']' +
+		// URL percent encoding sequences interfere with the ability
+		// to round-trip titles -- you can't link to them consistently.
+		'|%[0-9A-Fa-f]{2}' +
+		// XML/HTML character references produce similar issues.
+		'|&[A-Za-z0-9\u0080-\uFFFF]+;' +
+		'|&#[0-9]+;' +
+		'|&#x[0-9A-Fa-f]+;'
+	),
+
 	/**
-	 * Sanitize namespace id.
-	 * @ignore
-	 * @param id {Number} Namespace id.
-	 * @return {Number|Boolean} The id as-is or boolean false if invalid.
+	 * Internal helper for #constructor and #newFromtext.
+	 *
+	 * Based on Title.php#secureAndSplit
+	 *
+	 * @private
+	 * @static
+	 * @method parse
+	 * @param {string} title
+	 * @param {number} [defaultNamespace=NS_MAIN]
+	 * @return {Object|boolean}
 	 */
-	fixNsId = function ( id ) {
-		// wgFormattedNamespaces is an object of *string* key-vals (ie. arr["0"] not arr[0] )
-		var ns = mw.config.get( 'wgFormattedNamespaces' )[id.toString()];
+	parse = function ( title, defaultNamespace ) {
+		var namespace, m, id, i, fragment, ext;
 
-		// Check only undefined (may be false-y, such as '' (main namespace) ).
-		if ( ns === undefined ) {
+		namespace = defaultNamespace === undefined ? NS_MAIN : defaultNamespace;
+
+		title = title
+			// Normalise whitespace to underscores and remove duplicates
+			.replace( /[ _\s]+/g, '_' )
+			// Trim underscores
+			.replace( rUnderscoreTrim, '' );
+
+		if ( title === '' ) {
 			return false;
+		}
+
+		// Process initial colon
+		if ( title.charAt( 0 ) === ':' ) {
+			// Initial colon means main namespace instead of specified default
+			namespace = NS_MAIN;
+			title = title
+				// Strip colon
+				.substr( 1 )
+				// Trim underscores
+				.replace( rUnderscoreTrim, '' );
+		}
+
+		// Process namespace prefix (if any)
+		m = title.match( rSplit );
+		if ( m ) {
+			id = getNsIdByName( m[1] );
+			if ( id !== false ) {
+				// Ordinary namespace
+				namespace = id;
+				title = m[2];
+
+				// For Talk:X pages, make sure X has no "namespace" prefix
+				if ( namespace === NS_TALK && ( m = title.match( rSplit ) ) ) {
+					// Disallow titles like Talk:File:x (subject should roundtrip: talk:file:x -> file:x -> file_talk:x)
+					if ( getNsIdByName( m[1] ) !== false ) {
+						return false;
+					}
+				}
+			}
+		}
+
+		// Process fragment
+		i = title.indexOf( '#' );
+		if ( i === -1 ) {
+			fragment = null;
 		} else {
-			return Number( id );
+			fragment = title
+				// Get segment starting after the hash
+				.substr( i + 1 )
+				// Convert to text
+				// NB: Must not be trimmed ("Example#_foo" is not the same as "Example#foo")
+				.replace( /_/g, ' ' );
+
+			title = title
+				// Strip hash
+				.substr( 0, i )
+				// Trim underscores, again (strips "_" from "bar" in "Foo_bar_#quux")
+				.replace( rUnderscoreTrim, '' );
 		}
-	},
 
-	/**
-	 * Get namespace id from namespace name by any known namespace/id pair (localized, canonical or alias).
-	 * Example: On a German wiki this would return 6 for any of 'File', 'Datei', 'Image' or even 'Bild'.
-	 * @ignore
-	 * @param ns {String} Namespace name (case insensitive, leading/trailing space ignored).
-	 * @return {Number|Boolean} Namespace id or boolean false if unrecognized.
-	 */
-	getNsIdByName = function ( ns ) {
-		// Don't cast non-strings to strings, because null or undefined
-		// should not result in returning the id of a potential namespace
-		// called "Null:" (e.g. on nullwiki.example.org)
-		// Also, toLowerCase throws exception on null/undefined, because
-		// it is a String.prototype method.
-		if ( typeof ns !== 'string' ) {
+
+		// Reject illegal characters
+		if ( title.match( rInvalid ) ) {
 			return false;
 		}
-		ns = clean( $.trim( ns.toLowerCase() ) ); // Normalize
-		var id = mw.config.get( 'wgNamespaceIds' )[ns];
-		if ( id === undefined ) {
-			mw.log( 'mw.Title: Unrecognized namespace: ' + ns );
+
+		// Disallow titles that browsers or servers might resolve as directory navigation
+		if (
+			title.indexOf( '.' ) !== -1 && (
+				title === '.' || title === '..' ||
+				title.indexOf( './' ) === 0 ||
+				title.indexOf( '../' ) === 0 ||
+				title.indexOf( '/./' ) !== -1 ||
+				title.indexOf( '/../' ) !== -1 ||
+				title.substr( -2 ) === '/.' ||
+				title.substr( -3 ) === '/..'
+			)
+		) {
+			return false;
+		}
+
+		// Disallow magic tilde sequence
+		if ( title.indexOf( '~~~' ) !== -1 ) {
+			return false;
+		}
+
+		// Disallow titles exceeding the 255 byte size limit (size of underlying database field)
+		// Except for special pages, e.g. [[Special:Block/Long name]]
+		// Note: The PHP implementation also asserts that even in NS_SPECIAL, the title should
+		// be less than 512 bytes.
+		if ( namespace !== NS_SPECIAL && $.byteLength( title ) > 255 ) {
+			return false;
+		}
+
+		// Can't make a link to a namespace alone.
+		if ( title === '' && namespace !== NS_MAIN ) {
+			return false;
+		}
+
+		// Any remaining initial :s are illegal.
+		if ( title.charAt( 0 ) === ':' ) {
 			return false;
 		}
-		return fixNsId( id );
+
+		// For backwards-compatibility with old mw.Title, we separate the extension from the
+		// rest of the title.
+		i = title.lastIndexOf( '.' );
+		if ( i === -1 || title.length <= i + 1 ) {
+			// Extensions are the non-empty segment after the last dot
+			ext = null;
+		} else {
+			ext = title.substr( i + 1 );
+			title = title.substr( 0, i );
+		}
+
+		return {
+			namespace: namespace,
+			title: title,
+			ext: ext,
+			fragment: fragment
+		};
 	},
 
 	/**
-	 * Helper to extract namespace, name and extension from a string.
+	 * Convert db-key to readable text.
 	 *
-	 * @ignore
-	 * @param {mw.Title} title
-	 * @param {string} raw
-	 * @return {mw.Title}
+	 * @private
+	 * @static
+	 * @method text
+	 * @param {string} s
+	 * @return {string}
 	 */
-	setAll = function ( title, s ) {
-		// In normal browsers the match-array contains null/undefined if there's no match,
-		// IE returns an empty string.
-		var matches = s.match( /^(?:([^:]+):)?(.*?)(?:\.(\w+))?$/ ),
-			nsMatch = getNsIdByName( matches[1] );
-
-		// Namespace must be valid, and title must be a non-empty string.
-		if ( nsMatch && typeof matches[2] === 'string' && matches[2] !== '' ) {
-			title.ns = nsMatch;
-			title.name = fixName( matches[2] );
-			if ( typeof matches[3] === 'string' && matches[3] !== '' ) {
-				title.ext = fixExt( matches[3] );
-			}
+	text = function ( s ) {
+		if ( s !== null && s !== undefined ) {
+			return s.replace( /_/g, ' ' );
 		} else {
-			// Consistency with MediaWiki PHP: Unknown namespace -> fallback to main namespace.
-			title.ns = 0;
-			setNameAndExtension( title, s );
+			return '';
 		}
-		return title;
 	},
 
+	// Polyfill for ES5 Object.create
+	createObject = Object.create || ( function () {
+		return function ( o ) {
+			function Title() {}
+			if ( o !== Object( o ) ) {
+				throw new Error( 'Cannot inherit from a non-object' );
+			}
+			Title.prototype = o;
+			return new Title();
+		};
+	}() );
+
+
+	/* Static members */
+
 	/**
-	 * Helper to extract name and extension from a string.
+	 * Constructor for Title objects with a null return instead of an exception for invalid titles.
 	 *
-	 * @ignore
-	 * @param {mw.Title} title
-	 * @param {string} raw
-	 * @return {mw.Title}
+	 * @static
+	 * @method
+	 * @param {string} title
+	 * @param {number} [namespace=NS_MAIN] Default namespace
+	 * @return {mw.Title|null} A valid Title object or null if the title is invalid
 	 */
-	setNameAndExtension = function ( title, raw ) {
-		// In normal browsers the match-array contains null/undefined if there's no match,
-		// IE returns an empty string.
-		var matches = raw.match( /^(?:)?(.*?)(?:\.(\w+))?$/ );
-
-		// Title must be a non-empty string.
-		if ( typeof matches[1] === 'string' && matches[1] !== '' ) {
-			title.name = fixName( matches[1] );
-			if ( typeof matches[2] === 'string' && matches[2] !== '' ) {
-				title.ext = fixExt( matches[2] );
-			}
-		} else {
-			throw new Error( 'mw.Title: Could not parse title "' + raw + '"' );
+	Title.newFromText = function ( title, namespace ) {
+		var t, parsed = parse( title, namespace );
+		if ( !parsed ) {
+			return null;
 		}
-		return title;
+
+		t = createObject( Title.prototype );
+		t.namespace = parsed.namespace;
+		t.title = parsed.title;
+		t.ext = parsed.ext;
+		t.fragment = parsed.fragment;
+
+		return t;
 	};
 
+	/**
+	 * Get the file title from an image element
+	 *
+	 *     var title = mw.Title.newFromImg( $( 'img:first' ) );
+	 *
+	 * @static
+	 * @param {HTMLElement|jQuery} img The image to use as a base
+	 * @return {mw.Title|null} The file title or null if unsuccessful
+	 */
+	Title.newFromImg = function ( img ) {
+		var matches, i, regex, src, decodedSrc,
+
+			// thumb.php-generated thumbnails
+			thumbPhpRegex = /thumb\.php/,
+
+			regexes = [
+				// Thumbnails
+				/\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)\/[0-9]+px-\1[^\s\/]*$/,
+
+				// Thumbnails in non-hashed upload directories
+				/\/([^\s\/]+)\/[0-9]+px-\1[^\s\/]*$/,
+
+				// Full size images
+				/\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)$/,
+
+				// Full-size images in non-hashed upload directories
+				/\/([^\s\/]+)$/
+			],
 
-	/* Static space */
+			recount = regexes.length;
+
+		src = img.jquery ? img[0].src : img.src;
+
+		matches = src.match( thumbPhpRegex );
+
+		if ( matches ) {
+			return mw.Title.newFromText( 'File:' + mw.util.getParamValue( 'f', src ) );
+		}
+
+		decodedSrc = decodeURIComponent( src );
+
+		for ( i = 0; i < recount; i++ ) {
+			regex = regexes[i];
+			matches = decodedSrc.match( regex );
+
+			if ( matches && matches[1] ) {
+				return mw.Title.newFromText( 'File:' + matches[1] );
+			}
+		}
+
+		return null;
+	};
 
 	/**
 	 * Whether this title exists on the wiki.
+	 *
 	 * @static
-	 * @param {Mixed} title prefixed db-key name (string) or instance of Title
-	 * @return {Mixed} Boolean true/false if the information is available. Otherwise null.
+	 * @param {string|mw.Title} title prefixed db-key name (string) or instance of Title
+	 * @return {boolean|null} Boolean if the information is available, otherwise null
 	 */
 	Title.exists = function ( title ) {
-		var type = $.type( title ), obj = Title.exist.pages, match;
+		var match,
+			type = $.type( title ),
+			obj = Title.exist.pages;
+
 		if ( type === 'string' ) {
 			match = obj[title];
 		} else if ( type === 'object' && title instanceof Title ) {
@@ -194,23 +370,23 @@ var
 		} else {
 			throw new Error( 'mw.Title.exists: title must be a string or an instance of Title' );
 		}
+
 		if ( typeof match === 'boolean' ) {
 			return match;
 		}
+
 		return null;
 	};
 
-	/**
-	 * @static
-	 * @property
-	 */
 	Title.exist = {
 		/**
+		 * Boolean true value indicates page does exist.
+		 *
 		 * @static
 		 * @property {Object} exist.pages Keyed by PrefixedDb title.
-		 * Boolean true value indicates page does exist.
 		 */
 		pages: {},
+
 		/**
 		 * Example to declare existing titles:
 		 *     Title.exist.set(['User:John_Doe', ...]);
@@ -219,8 +395,8 @@ var
 		 *
 		 * @static
 		 * @property exist.set
-		 * @param {string|Array} titles Title(s) in strict prefixedDb title form.
-		 * @param {boolean} [state] State of the given titles. Defaults to true.
+		 * @param {string|Array} titles Title(s) in strict prefixedDb title form
+		 * @param {boolean} [state=true] State of the given titles
 		 * @return {boolean}
 		 */
 		set: function ( titles, state ) {
@@ -234,42 +410,60 @@ var
 		}
 	};
 
-	/* Public methods */
+	/* Public members */
 
-	fn = {
+	Title.prototype = {
 		constructor: Title,
 
 		/**
-		 * Get the namespace number.
+		 * Get the namespace number
+		 *
+		 * Example: 6 for "File:Example_image.svg".
+		 *
 		 * @return {number}
 		 */
-		getNamespaceId: function (){
-			return this.ns;
+		getNamespaceId: function () {
+			return this.namespace;
 		},
 
 		/**
-		 * Get the namespace prefix (in the content-language).
-		 * In NS_MAIN this is '', otherwise namespace name plus ':'
+		 * Get the namespace prefix (in the content language)
+		 *
+		 * Example: "File:" for "File:Example_image.svg".
+		 * In #NS_MAIN this is '', otherwise namespace name plus ':'
+		 *
 		 * @return {string}
 		 */
-		getNamespacePrefix: function (){
-			return mw.config.get( 'wgFormattedNamespaces' )[this.ns].replace( / /g, '_' ) + (this.ns === 0 ? '' : ':');
+		getNamespacePrefix: function () {
+			return this.namespace === NS_MAIN ?
+				'' :
+				( mw.config.get( 'wgFormattedNamespaces' )[ this.namespace ].replace( / /g, '_' ) + ':' );
 		},
 
 		/**
-		 * The name, like "Foo_bar"
+		 * Get the page name without extension or namespace prefix
+		 *
+		 * Example: "Example_image" for "File:Example_image.svg".
+		 *
+		 * For the page title (full page name without namespace prefix), see #getMain.
+		 *
 		 * @return {string}
 		 */
 		getName: function () {
-			if ( $.inArray( this.ns, mw.config.get( 'wgCaseSensitiveNamespaces' ) ) !== -1 ) {
-				return this.name;
+			if ( $.inArray( this.namespace, mw.config.get( 'wgCaseSensitiveNamespaces' ) ) !== -1 ) {
+				return this.title;
 			} else {
-				return $.ucFirst( this.name );
+				return $.ucFirst( this.title );
 			}
 		},
 
 		/**
-		 * The name, like "Foo bar"
+		 * Get the page name (transformed by #text)
+		 *
+		 * Example: "Example image" for "File:Example_image.svg".
+		 *
+		 * For the page title (full page name without namespace prefix), see #getMainText.
+		 *
 		 * @return {string}
 		 */
 		getNameText: function () {
@@ -277,24 +471,30 @@ var
 		},
 
 		/**
-		 * Get full name in prefixed DB form, like File:Foo_bar.jpg,
-		 * most useful for API calls, anything that must identify the "title".
-		 * @return {string}
+		 * Get the extension of the page name (if any)
+		 *
+		 * @return {string|null} Name extension or null if there is none
 		 */
-		getPrefixedDb: function () {
-			return this.getNamespacePrefix() + this.getMain();
+		getExtension: function () {
+			return this.ext;
 		},
 
 		/**
-		 * Get full name in text form, like "File:Foo bar.jpg".
+		 * Shortcut for appendable string to form the main page name.
+		 *
+		 * Returns a string like ".json", or "" if no extension.
+		 *
 		 * @return {string}
 		 */
-		getPrefixedText: function () {
-			return text( this.getPrefixedDb() );
+		getDotExtension: function () {
+			return this.ext === null ? '' : '.' + this.ext;
 		},
 
 		/**
-		 * The main title (without namespace), like "Foo_bar.jpg"
+		 * Get the main page name (transformed by #text)
+		 *
+		 * Example: "Example_image.svg" for "File:Example_image.svg".
+		 *
 		 * @return {string}
 		 */
 		getMain: function () {
@@ -302,7 +502,10 @@ var
 		},
 
 		/**
-		 * The "text" form, like "Foo bar.jpg"
+		 * Get the main page name (transformed by #text)
+		 *
+		 * Example: "Example image.svg" for "File:Example_image.svg".
+		 *
 		 * @return {string}
 		 */
 		getMainText: function () {
@@ -310,46 +513,73 @@ var
 		},
 
 		/**
-		 * Get the extension (returns null if there was none)
-		 * @return {string|null}
+		 * Get the full page name
+		 *
+		 * Eaxample: "File:Example_image.svg".
+		 * Most useful for API calls, anything that must identify the "title".
+		 *
+		 * @return {string}
 		 */
-		getExtension: function () {
-			return this.ext;
+		getPrefixedDb: function () {
+			return this.getNamespacePrefix() + this.getMain();
 		},
 
 		/**
-		 * Convenience method: return string like ".jpg", or "" if no extension
+		 * Get the full page name (transformed by #text)
+		 *
+		 * Example: "File:Example image.svg" for "File:Example_image.svg".
+		 *
 		 * @return {string}
 		 */
-		getDotExtension: function () {
-			return this.ext === null ? '' : '.' + this.ext;
+		getPrefixedText: function () {
+			return text( this.getPrefixedDb() );
+		},
+
+		/**
+		 * Get the fragment (if any).
+		 *
+		 * Note that this method (by design) does not include the hash character and
+		 * the value is not url encoded.
+		 *
+		 * @return {string|null}
+		 */
+		getFragment: function () {
+			return this.fragment;
 		},
 
 		/**
-		 * Return the URL to this title
-		 * @see mw.util#wikiGetlink
+		 * Get the URL to this title
+		 *
+		 * @see mw.util#getUrl
 		 * @return {string}
 		 */
 		getUrl: function () {
-			return mw.util.wikiGetlink( this.toString() );
+			return mw.util.getUrl( this.toString() );
 		},
 
 		/**
 		 * Whether this title exists on the wiki.
+		 *
 		 * @see #static-method-exists
-		 * @return {boolean|null} If the information is available. Otherwise null.
+		 * @return {boolean|null} Boolean if the information is available, otherwise null
 		 */
 		exists: function () {
 			return Title.exists( this );
 		}
 	};
 
-	// Alias
-	fn.toString = fn.getPrefixedDb;
-	fn.toText = fn.getPrefixedText;
+	/**
+	 * @alias #getPrefixedDb
+	 * @method
+	 */
+	Title.prototype.toString = Title.prototype.getPrefixedDb;
+
 
-	// Assign
-	Title.prototype = fn;
+	/**
+	 * @alias #getPrefixedText
+	 * @method
+	 */
+	Title.prototype.toText = Title.prototype.getPrefixedText;
 
 	// Expose
 	mw.Title = Title;
diff --git a/resources/mediawiki/mediawiki.Uri.js b/resources/mediawiki/mediawiki.Uri.js
index 643e5c3e..a2d4d6cb 100644
--- a/resources/mediawiki/mediawiki.Uri.js
+++ b/resources/mediawiki/mediawiki.Uri.js
@@ -201,7 +201,7 @@
 					uri = this,
 					matches = parser[ options.strictMode ? 'strict' : 'loose' ].exec( str );
 				$.each( properties, function ( i, property ) {
-					uri[ property ] = matches[ i+1 ];
+					uri[ property ] = matches[ i + 1 ];
 				} );
 
 				// uri.query starts out as the query string; we will parse it into key-val pairs then make
@@ -210,7 +210,7 @@
 				q = {};
 				// using replace to iterate over a string
 				if ( uri.query ) {
-					uri.query.replace( /(?:^|&)([^&=]*)(?:(=)([^&]*))?/g, function ($0, $1, $2, $3) {
+					uri.query.replace( /(?:^|&)([^&=]*)(?:(=)([^&]*))?/g, function ( $0, $1, $2, $3 ) {
 						var k, v;
 						if ( $1 ) {
 							k = Uri.decode( $1 );
diff --git a/resources/mediawiki/mediawiki.debug.js b/resources/mediawiki/mediawiki.debug.js
index 88af3c65..986917a1 100644
--- a/resources/mediawiki/mediawiki.debug.js
+++ b/resources/mediawiki/mediawiki.debug.js
@@ -229,7 +229,7 @@
 			$( '<colgroup>' ).css( 'width', 350 ).appendTo( $table );
 
 
-			entryTypeText = function( entryType ) {
+			entryTypeText = function ( entryType ) {
 				switch ( entryType ) {
 					case 'log':
 						return 'Log';
diff --git a/resources/mediawiki/mediawiki.htmlform.js b/resources/mediawiki/mediawiki.htmlform.js
index 83bf2e3a..de068598 100644
--- a/resources/mediawiki/mediawiki.htmlform.js
+++ b/resources/mediawiki/mediawiki.htmlform.js
@@ -1,7 +1,7 @@
 /**
  * Utility functions for jazzing up HTMLForm elements.
  */
-( function ( $ ) {
+( function ( mw, $ ) {
 
 	/**
 	 * jQuery plugin to fade or snap to visible state.
@@ -59,4 +59,70 @@
 
 	} );
 
-}( jQuery ) );
+	function addMulti( $oldContainer, $container ) {
+		var name = $oldContainer.find( 'input:first-child' ).attr( 'name' ),
+			oldClass = ( ' ' + $oldContainer.attr( 'class' ) + ' ' ).replace( /(mw-htmlform-field-HTMLMultiSelectField|mw-chosen)/g, '' ),
+			$select = $( '<select>' ),
+			dataPlaceholder = mw.message( 'htmlform-chosen-placeholder' );
+		oldClass = $.trim( oldClass );
+		$select.attr( {
+			name: name,
+			multiple: 'multiple',
+			'data-placeholder': dataPlaceholder.plain(),
+			'class': 'htmlform-chzn-select mw-input ' + oldClass
+		} );
+		$oldContainer.find( 'input' ).each( function () {
+			var $oldInput = $(this),
+			checked = $oldInput.prop( 'checked' ),
+			$option = $( '<option>' );
+			$option.prop( 'value', $oldInput.prop( 'value' ) );
+			if ( checked ) {
+				$option.prop( 'selected', true );
+			}
+			$option.text( $oldInput.prop( 'value' ) );
+			$select.append( $option );
+		} );
+		$container.append( $select );
+	}
+
+	function convertCheckboxesToMulti( $oldContainer, type ) {
+		var $fieldLabel = $( '<td>' ),
+		$td = $( '<td>' ),
+		$fieldLabelText = $( '<label>' ),
+		$container;
+		if ( type === 'tr' ) {
+			addMulti( $oldContainer, $td );
+			$container = $( '<tr>' );
+			$container.append( $td );
+		} else if ( type === 'div' ) {
+			$fieldLabel = $( '<div>' );
+			$container = $( '<div>' );
+			addMulti( $oldContainer, $container );
+		}
+		$fieldLabel.attr( 'class', 'mw-label' );
+		$fieldLabelText.text( $oldContainer.find( '.mw-label label' ).text() );
+		$fieldLabel.append( $fieldLabelText );
+		$container.prepend( $fieldLabel );
+		$oldContainer.replaceWith( $container );
+		return $container;
+	}
+
+	if ( $( '.mw-chosen' ).length ) {
+		mw.loader.using( 'jquery.chosen', function () {
+			$( '.mw-chosen' ).each( function () {
+				var type = this.nodeName.toLowerCase(),
+					$converted = convertCheckboxesToMulti( $( this ), type );
+				$converted.find( '.htmlform-chzn-select' ).chosen( { width: 'auto' } );
+			} );
+		} );
+	}
+
+	$( function () {
+		var $matrixTooltips = $( '.mw-htmlform-matrix .mw-htmlform-tooltip' );
+		if ( $matrixTooltips.length ) {
+			mw.loader.using( 'jquery.tipsy', function () {
+				$matrixTooltips.tipsy( { gravity: 's' } );
+			} );
+		}
+	} );
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.icon.css b/resources/mediawiki/mediawiki.icon.css
new file mode 100644
index 00000000..f61b7257
--- /dev/null
+++ b/resources/mediawiki/mediawiki.icon.css
@@ -0,0 +1,15 @@
+/* General-purpose icons via CSS. Classes here should be named "mw-icon-*". */
+
+/* For the collapsed and expanded arrows, we also provide selectors to make it
+ * easy to use them with jquery.makeCollapsible. */
+.mw-icon-arrow-collapsed,
+.mw-collapsible-arrow.mw-collapsible-toggle-collapsed {
+	/* @embed */
+	background: url(images/arrow-collapsed-ltr.png) no-repeat left bottom;
+}
+
+.mw-icon-arrow-expanded,
+.mw-collapsible-arrow.mw-collapsible-toggle-expanded {
+	/* @embed */
+	background: url(images/arrow-expanded.png) no-repeat left bottom;
+}
diff --git a/resources/mediawiki/mediawiki.inspect.js b/resources/mediawiki/mediawiki.inspect.js
new file mode 100644
index 00000000..2f2ca335
--- /dev/null
+++ b/resources/mediawiki/mediawiki.inspect.js
@@ -0,0 +1,204 @@
+/*!
+ * Tools for inspecting page composition and performance.
+ *
+ * @author Ori Livneh
+ * @since 1.22
+ */
+/*jshint devel:true */
+( function ( mw, $ ) {
+
+	function sortByProperty( array, prop, descending ) {
+		var order = descending ? -1 : 1;
+		return array.sort( function ( a, b ) {
+			return a[prop] > b[prop] ? order : a[prop] < b[prop] ? -order : 0;
+		} );
+	}
+
+	/**
+	 * @class mw.inspect
+	 * @singleton
+	 */
+	var inspect = {
+
+		/**
+		 * Calculate the byte size of a ResourceLoader module.
+		 *
+		 * @param {string} moduleName The name of the module
+		 * @return {number|null} Module size in bytes or null
+		 */
+		getModuleSize: function ( moduleName ) {
+			var module = mw.loader.moduleRegistry[ moduleName ],
+				payload = 0;
+
+			if ( mw.loader.getState( moduleName ) !== 'ready' ) {
+				return null;
+			}
+
+			if ( !module.style && !module.script ) {
+				return null;
+			}
+
+			// Tally CSS
+			if ( module.style && $.isArray( module.style.css ) ) {
+				$.each( module.style.css, function ( i, stylesheet ) {
+					payload += $.byteLength( stylesheet );
+				} );
+			}
+
+			// Tally JavaScript
+			if ( $.isFunction( module.script ) ) {
+				payload += $.byteLength( module.script.toString() );
+			}
+
+			return payload;
+		},
+
+		/**
+		 * Given CSS source, count both the total number of selectors it
+		 * contains and the number which match some element in the current
+		 * document.
+		 *
+		 * @param {string} css CSS source
+		 * @return Selector counts
+		 * @return {number} return.selectors Total number of selectors
+		 * @return {number} return.matched Number of matched selectors
+		 */
+		auditSelectors: function ( css ) {
+			var selectors = { total: 0, matched: 0 },
+				style = document.createElement( 'style' ),
+				sheet, rules;
+
+			style.textContent = css;
+			document.body.appendChild( style );
+			// Standards-compliant browsers use .sheet.cssRules, IE8 uses .styleSheet.rules…
+			sheet = style.sheet || style.styleSheet;
+			rules = sheet.cssRules || sheet.rules;
+			$.each( rules, function ( index, rule ) {
+				selectors.total++;
+				if ( document.querySelector( rule.selectorText ) !== null ) {
+					selectors.matched++;
+				}
+			} );
+			document.body.removeChild( style );
+			return selectors;
+		},
+
+		/**
+		 * Get a list of all loaded ResourceLoader modules.
+		 *
+		 * @return {Array} List of module names
+		 */
+		getLoadedModules: function () {
+			return $.grep( mw.loader.getModuleNames(), function ( module ) {
+				return mw.loader.getState( module ) === 'ready';
+			} );
+		},
+
+		/**
+		 * Print tabular data to the console, using console.table, console.log,
+		 * or mw.log (in declining order of preference).
+		 *
+		 * @param {Array} data Tabular data represented as an array of objects
+		 *  with common properties.
+		 */
+		dumpTable: function ( data ) {
+			try {
+				// Bartosz made me put this here.
+				if ( window.opera ) { throw window.opera; }
+				// Use Function.prototype#call to force an exception on Firefox,
+				// which doesn't define console#table but doesn't complain if you
+				// try to invoke it.
+				console.table.call( console, data );
+				return;
+			} catch (e) {}
+			try {
+				console.log( $.toJSON( data, null, 2 ) );
+				return;
+			} catch (e) {}
+			mw.log( data );
+		},
+
+		/**
+		 * Generate and print one more reports. When invoked with no arguments,
+		 * print all reports.
+		 *
+		 * @param {string...} [reports] Report names to run, or unset to print
+		 *  all available reports.
+		 */
+		runReports: function () {
+			var reports = arguments.length > 0 ?
+				Array.prototype.slice.call( arguments ) :
+				$.map( inspect.reports, function ( v, k ) { return k; } );
+
+			$.each( reports, function ( index, name ) {
+				inspect.dumpTable( inspect.reports[name]() );
+			} );
+		},
+
+		/**
+		 * @class mw.inspect.reports
+		 * @singleton
+		 */
+		reports: {
+			/**
+			 * Generate a breakdown of all loaded modules and their size in
+			 * kilobytes. Modules are ordered from largest to smallest.
+			 */
+			size: function () {
+				// Map each module to a descriptor object.
+				var modules = $.map( inspect.getLoadedModules(), function ( module ) {
+					return {
+						name: module,
+						size: inspect.getModuleSize( module )
+					};
+				} );
+
+				// Sort module descriptors by size, largest first.
+				sortByProperty( modules, 'size', true );
+
+				// Convert size to human-readable string.
+				$.each( modules, function ( i, module ) {
+					module.size = module.size > 1024 ?
+						( module.size / 1024 ).toFixed( 2 ) + ' KB' :
+						( module.size !== null ? module.size + ' B' : null );
+				} );
+
+				return modules;
+			},
+
+			/**
+			 * For each module with styles, count the number of selectors, and
+			 * count how many match against some element currently in the DOM.
+			 */
+			css: function () {
+				var modules = [];
+
+				$.each( inspect.getLoadedModules(), function ( index, name ) {
+					var css, stats, module = mw.loader.moduleRegistry[name];
+
+					try {
+						css = module.style.css.join();
+					} catch (e) { return; } // skip
+
+					stats = inspect.auditSelectors( css );
+					modules.push( {
+						module: name,
+						allSelectors: stats.total,
+						matchedSelectors: stats.matched,
+						percentMatched: stats.total !== 0 ?
+							( stats.matched / stats.total * 100 ).toFixed( 2 )  + '%' : null
+					} );
+				} );
+				sortByProperty( modules, 'allSelectors', true );
+				return modules;
+			},
+		}
+	};
+
+	if ( mw.config.get( 'debug' ) ) {
+		mw.log( 'mw.inspect: reports are not available in debug mode.' );
+	}
+
+	mw.inspect = inspect;
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.jqueryMsg.js b/resources/mediawiki/mediawiki.jqueryMsg.js
index 183b525e..70b9be93 100644
--- a/resources/mediawiki/mediawiki.jqueryMsg.js
+++ b/resources/mediawiki/mediawiki.jqueryMsg.js
@@ -3,6 +3,7 @@
 * See: http://www.mediawiki.org/wiki/Extension:UploadWizard/MessageParser for docs
 *
 * @author neilk@wikimedia.org
+* @author mflaschen@wikimedia.org
 */
 ( function ( mw, $ ) {
 	var oldParser,
@@ -11,6 +12,31 @@
 			magic : {
 				'SITENAME' : mw.config.get( 'wgSiteName' )
 			},
+			// This is a whitelist based on, but simpler than, Sanitizer.php.
+			// Self-closing tags are not currently supported.
+			allowedHtmlElements : [
+				'b',
+				'i'
+			],
+			// Key tag name, value allowed attributes for that tag.
+			// See Sanitizer::setupAttributeWhitelist
+			allowedHtmlCommonAttributes : [
+				// HTML
+				'id',
+				'class',
+				'style',
+				'lang',
+				'dir',
+				'title',
+
+				// WAI-ARIA
+				'role'
+			],
+
+			// Attributes allowed for specific elements.
+			// Key is element name in lower case
+			// Value is array of allowed attributes for that element
+			allowedHtmlAttributesByElement : {},
 			messages : mw.messages,
 			language : mw.language,
 
@@ -18,7 +44,7 @@
 			//
 			// Only 'text', 'parse', and 'escaped' are supported, and the
 			// actual escaping for 'escaped' is done by other code (generally
-			// through jqueryMsg).
+			// through mediawiki.js).
 			//
 			// However, note that this default only
 			// applies to direct calls to jqueryMsg. The default for mediawiki.js itself
@@ -27,6 +53,47 @@
 
 		};
 
+	/**
+	 * Wrapper around jQuery append that converts all non-objects to TextNode so append will not
+	 * convert what it detects as an htmlString to an element.
+	 *
+	 * Object elements of children (jQuery, HTMLElement, TextNode, etc.) will be left as is.
+	 *
+	 * @param {jQuery} $parent Parent node wrapped by jQuery
+	 * @param {Object|string|Array} children What to append, with the same possible types as jQuery
+	 * @return {jQuery} $parent
+	 */
+	function appendWithoutParsing( $parent, children ) {
+		var i, len;
+
+		if ( !$.isArray( children ) ) {
+			children = [children];
+		}
+
+		for ( i = 0, len = children.length; i < len; i++ ) {
+			if ( typeof children[i] !== 'object' ) {
+				children[i] = document.createTextNode( children[i] );
+			}
+		}
+
+		return $parent.append( children );
+	}
+
+	/**
+	 * Decodes the main HTML entities, those encoded by mw.html.escape.
+	 *
+	 * @param {string} encode Encoded string
+	 * @return {string} String with those entities decoded
+	 */
+	function decodePrimaryHtmlEntities( encoded ) {
+		return encoded
+			.replace( /&#039;/g, '\'' )
+			.replace( /&quot;/g, '"' )
+			.replace( /&lt;/g, '<' )
+			.replace( /&gt;/g, '>' )
+			.replace( /&amp;/g, '&' );
+	}
+
 	/**
 	 * Given parser options, return a function that parses a key and replacements, returning jQuery object
 	 * @param {Object} parser options
@@ -48,7 +115,7 @@
 			try {
 				return parser.parse( key, argsArray );
 			} catch ( e ) {
-				return $( '<span>' ).append( key + ': ' + e.message );
+				return $( '<span>' ).text( key + ': ' + e.message );
 			}
 		};
 	}
@@ -125,10 +192,10 @@
 		 */
 		return function () {
 			var $target = this.empty();
-			// TODO: Simply $target.append( failableParserFn( arguments ).contents() )
-			// or Simply $target.append( failableParserFn( arguments ) )
+			// TODO: Simply appendWithoutParsing( $target, failableParserFn( arguments ).contents() )
+			// or Simply appendWithoutParsing( $target, failableParserFn( arguments ) )
 			$.each( failableParserFn( arguments ).contents(), function ( i, node ) {
-				$target.append( node );
+				appendWithoutParsing( $target, node );
 			} );
 			return $target;
 		};
@@ -206,11 +273,13 @@
 		 * @return {Mixed} abstract syntax tree
 		 */
 		wikiTextToAst: function ( input ) {
-			var pos,
+			var pos, settings = this.settings, concat = Array.prototype.concat,
 				regularLiteral, regularLiteralWithoutBar, regularLiteralWithoutSpace, regularLiteralWithSquareBrackets,
-				backslash, anyCharacter, escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
-				whitespace, dollar, digits,
-				openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openLink, closeLink, templateName, pipe, colon,
+				doubleQuote, singleQuote, backslash, anyCharacter, asciiAlphabetLiteral,
+				escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
+				whitespace, dollar, digits, htmlDoubleQuoteAttributeValue, htmlSingleQuoteAttributeValue,
+				htmlAttributeEquals, openHtmlStartTag, optionalForwardSlash, openHtmlEndTag, closeHtmlTag,
+				openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openWikilink, closeWikilink, templateName, pipe, colon,
 				templateContents, openTemplate, closeTemplate,
 				nonWhitespaceExpression, paramExpression, expression, curlyBraceTransformExpression, result;
 
@@ -289,6 +358,15 @@
 					return result;
 				};
 			}
+
+			/**
+			 * Makes a regex parser, given a RegExp object.
+			 * The regex being passed in should start with a ^ to anchor it to the start
+			 * of the string.
+			 *
+			 * @param {RegExp} regex anchored regex
+			 * @return {Function} function to parse input based on the regex
+			 */
 			function makeRegexParser( regex ) {
 				return function () {
 					var matches = input.substr( pos ).match( regex );
@@ -315,12 +393,23 @@
 			// but some debuggers can't tell you exactly where they come from. Also the mutually
 			// recursive functions seem not to work in all browsers then. (Tested IE6-7, Opera, Safari, FF)
 			// This may be because, to save code, memoization was removed
-			regularLiteral = makeRegexParser( /^[^{}\[\]$\\]/ );
+
+			regularLiteral = makeRegexParser( /^[^{}\[\]$<\\]/ );
 			regularLiteralWithoutBar = makeRegexParser(/^[^{}\[\]$\\|]/);
 			regularLiteralWithoutSpace = makeRegexParser(/^[^{}\[\]$\s]/);
 			regularLiteralWithSquareBrackets = makeRegexParser( /^[^{}$\\]/ );
+
 			backslash = makeStringParser( '\\' );
+			doubleQuote = makeStringParser( '"' );
+			singleQuote = makeStringParser( '\'' );
 			anyCharacter = makeRegexParser( /^./ );
+
+			openHtmlStartTag = makeStringParser( '<' );
+			optionalForwardSlash = makeRegexParser( /^\/?/ );
+			openHtmlEndTag = makeStringParser( '</' );
+			htmlAttributeEquals = makeRegexParser( /^\s*=\s*/ );
+			closeHtmlTag = makeRegexParser( /^\s*>/ );
+
 			function escapedLiteral() {
 				var result = sequence( [
 					backslash,
@@ -369,6 +458,10 @@
 				return result === null ? null : result.join('');
 			}
 
+			asciiAlphabetLiteral = makeRegexParser( /[A-Za-z]+/ );
+			htmlDoubleQuoteAttributeValue = makeRegexParser( /^[^"]*/ );
+			htmlSingleQuoteAttributeValue = makeRegexParser( /^[^']*/ );
+
 			whitespace = makeRegexParser( /^\s+/ );
 			dollar = makeStringParser( '$' );
 			digits = makeRegexParser( /^\d+/ );
@@ -385,7 +478,7 @@
 			}
 			openExtlink = makeStringParser( '[' );
 			closeExtlink = makeStringParser( ']' );
-			// this extlink MUST have inner text, e.g. [foo] not allowed; [foo bar] is allowed
+			// this extlink MUST have inner contents, e.g. [foo] not allowed; [foo bar] [foo <i>bar</i>], etc. are allowed
 			function extlink() {
 				var result, parsedResult;
 				result = null;
@@ -393,11 +486,18 @@
 					openExtlink,
 					nonWhitespaceExpression,
 					whitespace,
-					expression,
+					nOrMore( 1, expression ),
 					closeExtlink
 				] );
 				if ( parsedResult !== null ) {
-					 result = [ 'LINK', parsedResult[1], parsedResult[3] ];
+					result = [ 'EXTLINK', parsedResult[1] ];
+					// TODO (mattflaschen, 2013-03-22): Clean this up if possible.
+					// It's avoiding CONCAT for single nodes, so they at least doesn't get the htmlEmitter span.
+					if ( parsedResult[3].length === 1 ) {
+						result.push( parsedResult[3][0] );
+					} else {
+						result.push( ['CONCAT'].concat( parsedResult[3] ) );
+					}
 				}
 				return result;
 			}
@@ -414,10 +514,10 @@
 				if ( result === null ) {
 					return null;
 				}
-				return [ 'LINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
+				return [ 'EXTLINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
 			}
-			openLink = makeStringParser( '[[' );
-			closeLink = makeStringParser( ']]' );
+			openWikilink = makeStringParser( '[[' );
+			closeWikilink = makeStringParser( ']]' );
 			pipe = makeStringParser( '|' );
 
 			function template() {
@@ -448,21 +548,158 @@
 				wikilinkPage // unpiped link
 			] );
 
-			function link() {
+			function wikilink() {
 				var result, parsedResult, parsedLinkContents;
 				result = null;
 
 				parsedResult = sequence( [
-					openLink,
+					openWikilink,
 					wikilinkContents,
-					closeLink
+					closeWikilink
 				] );
 				if ( parsedResult !== null ) {
 					parsedLinkContents = parsedResult[1];
-					result = [ 'WLINK' ].concat( parsedLinkContents );
+					result = [ 'WIKILINK' ].concat( parsedLinkContents );
+				}
+				return result;
+			}
+
+			// TODO: Support data- if appropriate
+			function doubleQuotedHtmlAttributeValue() {
+				var parsedResult = sequence( [
+					doubleQuote,
+					htmlDoubleQuoteAttributeValue,
+					doubleQuote
+				] );
+				return parsedResult === null ? null : parsedResult[1];
+			}
+
+			function singleQuotedHtmlAttributeValue() {
+				var parsedResult = sequence( [
+					singleQuote,
+					htmlSingleQuoteAttributeValue,
+					singleQuote
+				] );
+				return parsedResult === null ? null : parsedResult[1];
+			}
+
+			function htmlAttribute() {
+				var parsedResult = sequence( [
+					whitespace,
+					asciiAlphabetLiteral,
+					htmlAttributeEquals,
+					choice(	[
+						doubleQuotedHtmlAttributeValue,
+						singleQuotedHtmlAttributeValue
+					] )
+				] );
+				return parsedResult === null ? null : [parsedResult[1], parsedResult[3]];
+			}
+
+			/**
+			 * Checks if HTML is allowed
+			 *
+			 * @param {string} startTagName HTML start tag name
+			 * @param {string} endTagName HTML start tag name
+			 * @param {Object} attributes array of consecutive key value pairs,
+			 *  with index 2 * n being a name and 2 * n + 1 the associated value
+			 * @return {boolean} true if this is HTML is allowed, false otherwise
+			 */
+			function isAllowedHtml( startTagName, endTagName, attributes ) {
+				var i, len, attributeName;
+
+				startTagName = startTagName.toLowerCase();
+				endTagName = endTagName.toLowerCase();
+				if ( startTagName !== endTagName || $.inArray( startTagName, settings.allowedHtmlElements ) === -1 ) {
+					return false;
+				}
+
+				for ( i = 0, len = attributes.length; i < len; i += 2 ) {
+					attributeName = attributes[i];
+					if ( $.inArray( attributeName, settings.allowedHtmlCommonAttributes ) === -1 &&
+					     $.inArray( attributeName, settings.allowedHtmlAttributesByElement[startTagName] || [] ) === -1 ) {
+						return false;
+					}
+				}
+
+				return true;
+			}
+
+			function htmlAttributes() {
+				var parsedResult = nOrMore( 0, htmlAttribute )();
+				// Un-nest attributes array due to structure of jQueryMsg operations (see emit).
+				return concat.apply( ['HTMLATTRIBUTES'], parsedResult );
+			}
+
+			// Subset of allowed HTML markup.
+			// Most elements and many attributes allowed on the server are not supported yet.
+			function html() {
+				var result = null, parsedOpenTagResult, parsedHtmlContents,
+					parsedCloseTagResult, wrappedAttributes, attributes,
+					startTagName, endTagName, startOpenTagPos, startCloseTagPos,
+					endOpenTagPos, endCloseTagPos;
+
+				// Break into three sequence calls.  That should allow accurate reconstruction of the original HTML, and requiring an exact tag name match.
+				// 1. open through closeHtmlTag
+				// 2. expression
+				// 3. openHtmlEnd through close
+				// This will allow recording the positions to reconstruct if HTML is to be treated as text.
+
+				startOpenTagPos = pos;
+				parsedOpenTagResult = sequence( [
+					openHtmlStartTag,
+					asciiAlphabetLiteral,
+					htmlAttributes,
+					optionalForwardSlash,
+					closeHtmlTag
+				] );
+
+				if ( parsedOpenTagResult === null ) {
+					return null;
 				}
+
+				endOpenTagPos = pos;
+				startTagName = parsedOpenTagResult[1];
+
+				parsedHtmlContents = nOrMore( 0, expression )();
+
+				startCloseTagPos = pos;
+				parsedCloseTagResult = sequence( [
+					openHtmlEndTag,
+					asciiAlphabetLiteral,
+					closeHtmlTag
+				] );
+
+				if ( parsedCloseTagResult === null ) {
+					// Closing tag failed.  Return the start tag and contents.
+					return [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ].concat( parsedHtmlContents );
+				}
+
+				endCloseTagPos = pos;
+				endTagName = parsedCloseTagResult[1];
+				wrappedAttributes = parsedOpenTagResult[2];
+				attributes = wrappedAttributes.slice( 1 );
+				if ( isAllowedHtml( startTagName, endTagName, attributes) ) {
+					result = [ 'HTMLELEMENT', startTagName, wrappedAttributes ].concat( parsedHtmlContents );
+				} else {
+					// HTML is not allowed, so contents will remain how
+					// it was, while HTML markup at this level will be
+					// treated as text
+					// E.g. assuming script tags are not allowed:
+					//
+					// <script>[[Foo|bar]]</script>
+					//
+					// results in '&lt;script&gt;' and '&lt;/script&gt;'
+					// (not treated as an HTML tag), surrounding a fully
+					// parsed HTML link.
+					//
+					// Concatenate everything from the tag, flattening the contents.
+					result = [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ].concat( parsedHtmlContents, input.substring( startCloseTagPos, endCloseTagPos ) );
+				}
+
 				return result;
 			}
+
 			templateName = transform(
 				// see $wgLegalTitleChars
 				// not allowing : due to the need to catch "PLURAL:$1"
@@ -525,7 +762,7 @@
 			closeTemplate = makeStringParser('}}');
 			nonWhitespaceExpression = choice( [
 				template,
-				link,
+				wikilink,
 				extLinkParam,
 				extlink,
 				replacement,
@@ -533,7 +770,7 @@
 			] );
 			paramExpression = choice( [
 				template,
-				link,
+				wikilink,
 				extLinkParam,
 				extlink,
 				replacement,
@@ -542,10 +779,11 @@
 
 			expression = choice( [
 				template,
-				link,
+				wikilink,
 				extLinkParam,
 				extlink,
 				replacement,
+				html,
 				literal
 			] );
 
@@ -659,12 +897,12 @@
 			$.each( nodes, function ( i, node ) {
 				if ( node instanceof jQuery && node.hasClass( 'mediaWiki_htmlEmitter' ) ) {
 					$.each( node.contents(), function ( j, childNode ) {
-						$span.append( childNode );
+						appendWithoutParsing( $span, childNode );
 					} );
 				} else {
 					// Let jQuery append nodes, arrays of nodes and jQuery objects
 					// other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
-					$span.append( $.type( node ) === 'object' ? node : document.createTextNode( node ) );
+					appendWithoutParsing( $span, node );
 				}
 			} );
 			return $span;
@@ -704,11 +942,11 @@
 		 *
 		 * @param nodes
 		 */
-		wlink: function ( nodes ) {
+		wikilink: function ( nodes ) {
 			var page, anchor, url;
 
 			page = nodes[0];
-			url = mw.util.wikiGetlink( page );
+			url = mw.util.getUrl( page );
 
 			// [[Some Page]] or [[Namespace:Some Page]]
 			if ( nodes.length === 1 ) {
@@ -729,6 +967,36 @@
 			} ).text( anchor );
 		},
 
+		/**
+		 * Converts array of HTML element key value pairs to object
+		 *
+		 * @param {Array} nodes array of consecutive key value pairs, with index 2 * n being a name and 2 * n + 1 the associated value
+		 * @return {Object} object mapping attribute name to attribute value
+		 */
+		htmlattributes: function ( nodes ) {
+			var i, len, mapping = {};
+			for ( i = 0, len = nodes.length; i < len; i += 2 ) {
+				mapping[nodes[i]] = decodePrimaryHtmlEntities( nodes[i + 1] );
+			}
+			return mapping;
+		},
+
+		/**
+		 * Handles an (already-validated) HTML element.
+		 *
+		 * @param {Array} nodes nodes to process when creating element
+		 * @return {jQuery|Array} jQuery node for valid HTML or array for disallowed element
+		 */
+		htmlelement: function ( nodes ) {
+			var tagName, attributes, contents, $element;
+
+			tagName = nodes.shift();
+			attributes = nodes.shift();
+			contents = nodes;
+			$element = $( document.createElement( tagName ) ).attr( attributes );
+			return appendWithoutParsing( $element, contents );
+		},
+
 		/**
 		 * Transform parsed structure into external link
 		 * If the href is a jQuery object, treat it as "enclosing" the link text.
@@ -738,7 +1006,7 @@
 		 * @param {Array} of two elements, {jQuery|Function|String} and {String}
 		 * @return {jQuery}
 		 */
-		link: function ( nodes ) {
+		extlink: function ( nodes ) {
 			var $el,
 				arg = nodes[0],
 				contents = nodes[1];
@@ -752,12 +1020,11 @@
 					$el.attr( 'href', arg.toString() );
 				}
 			}
-			$el.append( contents );
-			return $el;
+			return appendWithoutParsing( $el, contents );
 		},
 
 		/**
-		 * This is basically use a combination of replace + link (link with parameter
+		 * This is basically use a combination of replace + external link (link with parameter
 		 * as url), but we don't want to run the regular replace here-on: inserting a
 		 * url as href-attribute of a link will automatically escape it already, so
 		 * we don't want replace to (manually) escape it as well.
@@ -765,7 +1032,7 @@
 		 * @param {Array} of one element, integer, n >= 0
 		 * @return {String} replacement
 		 */
-		linkparam: function ( nodes, replacements ) {
+		extlinkparam: function ( nodes, replacements ) {
 			var replacement,
 				index = parseInt( nodes[0], 10 );
 			if ( index < replacements.length) {
@@ -773,7 +1040,7 @@
 			} else {
 				replacement = '$' + ( index + 1 );
 			}
-			return this.link( [ replacement, nodes[1] ] );
+			return this.extlink( [ replacement, nodes[1] ] );
 		},
 
 		/**
@@ -865,7 +1132,7 @@
 		// Caching is somewhat problematic, because we do need different message functions for different maps, so
 		// we'd have to cache the parser as a member of this.map, which sounds a bit ugly.
 		// Do not use mw.jqueryMsg unless required
-		if ( this.format === 'plain' || !/\{\{|\[/.test(this.map.get( this.key ) ) ) {
+		if ( this.format === 'plain' || !/\{\{|[\[<>]/.test(this.map.get( this.key ) ) ) {
 			// Fall back to mw.msg's simple parser
 			return oldParser.apply( this );
 		}
diff --git a/resources/mediawiki/mediawiki.js b/resources/mediawiki/mediawiki.js
index ca987543..80223e5d 100644
--- a/resources/mediawiki/mediawiki.js
+++ b/resources/mediawiki/mediawiki.js
@@ -1,5 +1,9 @@
-/*
- * Core MediaWiki JavaScript Library
+/**
+ * Base library for MediaWiki.
+ *
+ * @class mw
+ * @alternateClassName mediaWiki
+ * @singleton
  */
 
 var mw = ( function ( $, undefined ) {
@@ -10,15 +14,67 @@ var mw = ( function ( $, undefined ) {
 	var hasOwn = Object.prototype.hasOwnProperty,
 		slice = Array.prototype.slice;
 
+	/**
+	 * Log a message to window.console, if possible. Useful to force logging of some
+	 * errors that are otherwise hard to detect (I.e., this logs also in production mode).
+	 * Gets console references in each invocation, so that delayed debugging tools work
+	 * fine. No need for optimization here, which would only result in losing logs.
+	 *
+	 * @private
+	 * @param {string} msg text for the log entry.
+	 * @param {Error} [e]
+	 */
+	function log( msg, e ) {
+		var console = window.console;
+		if ( console && console.log ) {
+			console.log( msg );
+			// If we have an exception object, log it through .error() to trigger
+			// proper stacktraces in browsers that support it. There are no (known)
+			// browsers that don't support .error(), that do support .log() and
+			// have useful exception handling through .log().
+			if ( e && console.error ) {
+				console.error( String( e ), e );
+			}
+		}
+	}
+
 	/* Object constructors */
 
 	/**
 	 * Creates an object that can be read from or written to from prototype functions
 	 * that allow both single and multiple variables at once.
+	 *
+	 *     @example
+	 *
+	 *     var addies, wanted, results;
+	 *
+	 *     // Create your address book
+	 *     addies = new mw.Map();
+	 *
+	 *     // This data could be coming from an external source (eg. API/AJAX)
+	 *     addies.set( {
+	 *         'John Doe' : '10 Wall Street, New York, USA',
+	 *         'Jane Jackson' : '21 Oxford St, London, UK',
+	 *         'Dominique van Halen' : 'Kalverstraat 7, Amsterdam, NL'
+	 *     } );
+	 *
+	 *     wanted = ['Dominique van Halen', 'George Johnson', 'Jane Jackson'];
+	 *
+	 *     // You can detect missing keys first
+	 *     if ( !addies.exists( wanted ) ) {
+	 *         // One or more are missing (in this case: "George Johnson")
+	 *         mw.log( 'One or more names were not found in your address book' );
+	 *     }
+	 *
+	 *     // Or just let it give you what it can
+	 *     results = addies.get( wanted, 'Middle of Nowhere, Alaska, US' );
+	 *     mw.log( results['Jane Jackson'] ); // "21 Oxford St, London, UK"
+	 *     mw.log( results['George Johnson'] ); // "Middle of Nowhere, Alaska, US"
+	 *
 	 * @class mw.Map
 	 *
 	 * @constructor
-	 * @param {boolean} global Whether to store the values in the global window
+	 * @param {boolean} [global=false] Whether to store the values in the global window
 	 *  object or a exclusively in the object property 'values'.
 	 */
 	function Map( global ) {
@@ -32,8 +88,8 @@ var mw = ( function ( $, undefined ) {
 		 *
 		 * If called with no arguments, all values will be returned.
 		 *
-		 * @param selection mixed String key or array of keys to get values for.
-		 * @param fallback mixed Value to use in case key(s) do not exist (optional).
+		 * @param {string|Array} selection String key or array of keys to get values for.
+		 * @param {Mixed} [fallback] Value to use in case key(s) do not exist.
 		 * @return mixed If selection was a string returns the value or null,
 		 *  If selection was an array, returns an object of key/values (value is null if not found),
 		 *  If selection was not passed or invalid, will return the 'values' object member (be careful as
@@ -73,8 +129,8 @@ var mw = ( function ( $, undefined ) {
 		/**
 		 * Sets one or multiple key/value pairs.
 		 *
-		 * @param selection {mixed} String key or array of keys to set values for.
-		 * @param value {mixed} Value to set (optional, only in use when key is a string)
+		 * @param {string|Object} selection String key to set value for, or object mapping keys to values.
+		 * @param {Mixed} [value] Value to set (optional, only in use when key is a string)
 		 * @return {Boolean} This returns true on success, false on failure.
 		 */
 		set: function ( selection, value ) {
@@ -96,7 +152,7 @@ var mw = ( function ( $, undefined ) {
 		/**
 		 * Checks if one or multiple keys exist.
 		 *
-		 * @param selection {mixed} String key or array of keys to check
+		 * @param {Mixed} selection String key or array of keys to check
 		 * @return {boolean} Existence of key(s)
 		 */
 		exists: function ( selection ) {
@@ -115,8 +171,12 @@ var mw = ( function ( $, undefined ) {
 	};
 
 	/**
-	 * Object constructor for messages,
-	 * similar to the Message class in MediaWiki PHP.
+	 * Object constructor for messages.
+	 *
+	 * Similar to the Message class in MediaWiki PHP.
+	 *
+	 * Format defaults to 'text'.
+	 *
 	 * @class mw.Message
 	 *
 	 * @constructor
@@ -134,8 +194,7 @@ var mw = ( function ( $, undefined ) {
 
 	Message.prototype = {
 		/**
-		 * Simple message parser, does $N replacement, HTML-escaping (only for
-		 * 'escaped' format), and nothing else.
+		 * Simple message parser, does $N replacement and nothing else.
 		 *
 		 * This may be overridden to provide a more complex message parser.
 		 *
@@ -259,19 +318,21 @@ var mw = ( function ( $, undefined ) {
 		}
 	};
 
-	/**
-	 * @class mw
-	 * @alternateClassName mediaWiki
-	 * @singleton
-	 */
 	return {
 		/* Public Members */
 
 		/**
-		 * Dummy function which in debug mode can be replaced with a function that
-		 * emulates console.log in console-less environments.
+		 * Dummy placeholder for {@link mw.log}
+		 * @method
 		 */
-		log: function () { },
+		log: ( function () {
+			var log = function () {};
+			log.warn = function () {};
+			log.deprecate = function ( obj, key, val ) {
+				obj[key] = val;
+			};
+			return log;
+		}() ),
 
 		// Make the Map constructor publicly available.
 		Map: Map,
@@ -280,13 +341,17 @@ var mw = ( function ( $, undefined ) {
 		Message: Message,
 
 		/**
-		 * List of configuration values
+		 * Map of configuration values
 		 *
-		 * Dummy placeholder. Initiated in startUp module as a new instance of mw.Map().
-		 * If `$wgLegacyJavaScriptGlobals` is true, this Map will have its values
-		 * in the global window object.
-		 * @property
+		 * Check out [the complete list of configuration values](https://www.mediawiki.org/wiki/Manual:Interface/JavaScript#mw.config)
+		 * on MediaWiki.org.
+		 *
+		 * If `$wgLegacyJavaScriptGlobals` is true, this Map will put its values in the
+		 * global window object.
+		 *
+		 * @property {mw.Map} config
 		 */
+		// Dummy placeholder. Re-assigned in ResourceLoaderStartupModule with an instance of `mw.Map`.
 		config: null,
 
 		/**
@@ -295,9 +360,15 @@ var mw = ( function ( $, undefined ) {
 		 */
 		libs: {},
 
-		/* Extension points */
-
 		/**
+		 * Access container for deprecated functionality that can be moved from
+		 * from their legacy location and attached to this object (e.g. a global
+		 * function that is deprecated and as stop-gap can be exposed through here).
+		 *
+		 * This was reserved for future use but never ended up being used.
+		 *
+		 * @deprecated since 1.22: Let deprecated identifiers keep their original name
+		 * and use mw.log#deprecate to create an access container for tracking.
 		 * @property
 		 */
 		legacy: {},
@@ -311,7 +382,9 @@ var mw = ( function ( $, undefined ) {
 		/* Public Methods */
 
 		/**
-		 * Gets a message object, similar to wfMessage().
+		 * Get a message object.
+		 *
+		 * Similar to wfMessage() in MediaWiki PHP.
 		 *
 		 * @param {string} key Key of message to get
 		 * @param {Mixed...} parameters Parameters for the $N replacements in messages.
@@ -324,14 +397,16 @@ var mw = ( function ( $, undefined ) {
 		},
 
 		/**
-		 * Gets a message string, similar to wfMessage()
+		 * Get a message string using 'text' format.
+		 *
+		 * Similar to wfMsg() in MediaWiki PHP.
 		 *
-		 * @see mw.Message#toString
+		 * @see mw.Message
 		 * @param {string} key Key of message to get
 		 * @param {Mixed...} parameters Parameters for the $N replacements in messages.
 		 * @return {string}
 		 */
-		msg: function ( /* key, parameters... */ ) {
+		msg: function () {
 			return mw.message.apply( mw.message, arguments ).toString();
 		},
 
@@ -420,11 +495,11 @@ var mw = ( function ( $, undefined ) {
 			 *
 			 * @private
 			 * @param {string} text CSS text
-			 * @param {Mixed} [nextnode] An Element or jQuery object for an element where
-			 * the style tag should be inserted before. Otherwise appended to the `<head>`.
-			 * @return {HTMLElement} Node reference to the created `<style>` tag.
+			 * @param {HTMLElement|jQuery} [nextnode=document.head] The element where the style tag should be
+			 *  inserted before. Otherwise it will be appended to `<head>`.
+			 * @return {HTMLElement} Reference to the created `<style>` element.
 			 */
-			function addStyleTag( text, nextnode ) {
+			function newStyleTag( text, nextnode ) {
 				var s = document.createElement( 'style' );
 				// Insert into document before setting cssText (bug 33305)
 				if ( nextnode ) {
@@ -457,7 +532,7 @@ var mw = ( function ( $, undefined ) {
 
 			/**
 			 * Checks whether it is safe to add this css to a stylesheet.
-                         * 
+			 *
 			 * @private
 			 * @param {string} cssText
 			 * @return {boolean} False if a new one must be created.
@@ -470,8 +545,13 @@ var mw = ( function ( $, undefined ) {
 			}
 
 			/**
+			 * Add a bit of CSS text to the current browser page.
+			 *
+			 * The CSS will be appended to an existing ResourceLoader-created `<style>` tag
+			 * or create a new one based on whether the given `cssText` is safe for extension.
+			 *
 			 * @param {string} [cssText=cssBuffer] If called without cssText,
-			 * the internal buffer will be inserted instead.
+			 *  the internal buffer will be inserted instead.
 			 * @param {Function} [callback]
 			 */
 			function addEmbeddedCSS( cssText, callback ) {
@@ -533,7 +613,7 @@ var mw = ( function ( $, undefined ) {
 							try {
 								styleEl.styleSheet.cssText += cssText; // IE
 							} catch ( e ) {
-								log( 'addEmbeddedCSS fail\ne.message: ' + e.message, e );
+								log( 'addEmbeddedCSS fail', e );
 							}
 						} else {
 							styleEl.appendChild( document.createTextNode( String( cssText ) ) );
@@ -543,7 +623,7 @@ var mw = ( function ( $, undefined ) {
 					}
 				}
 
-				$( addStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
+				$( newStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
 
 				cssCallbacks.fire().empty();
 			}
@@ -659,7 +739,7 @@ var mw = ( function ( $, undefined ) {
 			 *
 			 * @private
 			 * @param {string|string[]} states Module states to filter by
-			 * @param {Array} modules List of module names to filter (optional, by default the entire
+			 * @param {Array} [modules] List of module names to filter (optional, by default the entire
 			 * registry is used)
 			 * @return {Array} List of filtered module names
 			 */
@@ -711,30 +791,6 @@ var mw = ( function ( $, undefined ) {
 				return filter( 'ready', dependencies ).length === dependencies.length;
 			}
 
-			/**
-			 * Log a message to window.console, if possible. Useful to force logging of some
-			 * errors that are otherwise hard to detect (I.e., this logs also in production mode).
-			 * Gets console references in each invocation, so that delayed debugging tools work
-			 * fine. No need for optimization here, which would only result in losing logs.
-			 *
-			 * @private
-			 * @param {string} msg text for the log entry.
-			 * @param {Error} [e]
-			 */
-			function log( msg, e ) {
-				var console = window.console;
-				if ( console && console.log ) {
-					console.log( msg );
-					// If we have an exception object, log it through .error() to trigger
-					// proper stacktraces in browsers that support it. There are no (known)
-					// browsers that don't support .error(), that do support .log() and
-					// have useful exception handling through .log().
-					if ( e && console.error ) {
-						console.error( e );
-					}
-				}
-			}
-
 			/**
 			 * A module has entered state 'ready', 'error', or 'missing'. Automatically update pending jobs
 			 * and modules that depend upon this module. if the given module failed, propagate the 'error'
@@ -775,22 +831,18 @@ var mw = ( function ( $, undefined ) {
 						j -= 1;
 						try {
 							if ( hasErrors ) {
-								throw new Error( 'Module ' + module + ' failed.');
+								if ( $.isFunction( job.error ) ) {
+									job.error( new Error( 'Module ' + module + ' has failed dependencies' ), [module] );
+								}
 							} else {
 								if ( $.isFunction( job.ready ) ) {
 									job.ready();
 								}
 							}
 						} catch ( e ) {
-							if ( $.isFunction( job.error ) ) {
-								try {
-									job.error( e, [module] );
-								} catch ( ex ) {
-									// A user-defined operation raised an exception. Swallow to protect
-									// our state machine!
-									log( 'Exception thrown by job.error()', ex );
-								}
-							}
+							// A user-defined callback raised an exception.
+							// Swallow it to protect our state machine!
+							log( 'Exception thrown by job.error', e );
 						}
 					}
 				}
@@ -816,8 +868,7 @@ var mw = ( function ( $, undefined ) {
 			 */
 			function addScript( src, callback, async ) {
 				/*jshint evil:true */
-				var script, head,
-					done = false;
+				var script, head, done;
 
 				// Using isReady directly instead of storing it locally from
 				// a $.fn.ready callback (bug 31895).
@@ -829,6 +880,7 @@ var mw = ( function ( $, undefined ) {
 
 					// IE-safe way of getting the <head>. document.head isn't supported
 					// in old IE, and doesn't work when in the <head>.
+					done = false;
 					head = document.getElementsByTagName( 'head' )[0] || document.body;
 
 					script = document.createElement( 'script' );
@@ -848,12 +900,12 @@ var mw = ( function ( $, undefined ) {
 								// Handle memory leak in IE
 								script.onload = script.onreadystatechange = null;
 
-								// Remove the script
+								// Detach the element from the document
 								if ( script.parentNode ) {
 									script.parentNode.removeChild( script );
 								}
 
-								// Dereference the script
+								// Dereference the element from javascript
 								script = undefined;
 
 								callback();
@@ -950,7 +1002,7 @@ var mw = ( function ( $, undefined ) {
 					} catch ( e ) {
 						// This needs to NOT use mw.log because these errors are common in production mode
 						// and not in debug mode, such as when a symbol that should be global isn't exported
-						log( 'Exception thrown by ' + module + ': ' + e.message, e );
+						log( 'Exception thrown by ' + module, e );
 						registry[module].state = 'error';
 						handlePending( module );
 					}
@@ -967,30 +1019,37 @@ var mw = ( function ( $, undefined ) {
 					mw.messages.set( registry[module].messages );
 				}
 
-				// Make sure we don't run the scripts until all (potentially asynchronous)
-				// stylesheet insertions have completed.
-				( function () {
-					var pending = 0;
-					checkCssHandles = function () {
-						// cssHandlesRegistered ensures we don't take off too soon, e.g. when
-						// one of the cssHandles is fired while we're still creating more handles.
-						if ( cssHandlesRegistered && pending === 0 && runScript ) {
-							runScript();
-							runScript = undefined; // Revoke
-						}
-					};
-					cssHandle = function () {
-						var check = checkCssHandles;
-						pending++;
-						return function () {
-							if (check) {
-								pending--;
-								check();
-								check = undefined; // Revoke
+				if ( $.isReady || registry[module].async ) {
+					// Make sure we don't run the scripts until all (potentially asynchronous)
+					// stylesheet insertions have completed.
+					( function () {
+						var pending = 0;
+						checkCssHandles = function () {
+							// cssHandlesRegistered ensures we don't take off too soon, e.g. when
+							// one of the cssHandles is fired while we're still creating more handles.
+							if ( cssHandlesRegistered && pending === 0 && runScript ) {
+								runScript();
+								runScript = undefined; // Revoke
 							}
 						};
-					};
-				}() );
+						cssHandle = function () {
+							var check = checkCssHandles;
+							pending++;
+							return function () {
+								if (check) {
+									pending--;
+									check();
+									check = undefined; // Revoke
+								}
+							};
+						};
+					}() );
+				} else {
+					// We are in blocking mode, and so we can't afford to wait for CSS
+					cssHandle = function () {};
+					// Run immediately
+					checkCssHandles = runScript;
+				}
 
 				// Process styles (see also mw.loader.implement)
 				// * back-compat: { <media>: css }
@@ -1131,7 +1190,7 @@ var mw = ( function ( $, undefined ) {
 			 * @param {Object} moduleMap Module map, see #buildModulesString
 			 * @param {Object} currReqBase Object with other parameters (other than 'modules') to use in the request
 			 * @param {string} sourceLoadScript URL of load.php
-			 * @param {boolean} async If true, use an asynchrounous request even if document ready has not yet occurred
+			 * @param {boolean} async If true, use an asynchronous request even if document ready has not yet occurred
 			 */
 			function doRequest( moduleMap, currReqBase, sourceLoadScript, async ) {
 				var request = $.extend(
@@ -1146,10 +1205,24 @@ var mw = ( function ( $, undefined ) {
 
 			/* Public Methods */
 			return {
-				addStyleTag: addStyleTag,
+				/**
+				 * The module registry is exposed as an aid for debugging and inspecting page
+				 * state; it is not a public interface for modifying the registry.
+				 *
+				 * @see #registry
+				 * @property
+				 * @private
+				 */
+				moduleRegistry: registry,
 
 				/**
-				 * Requests dependencies from server, loading and executing when things when ready.
+				 * @inheritdoc #newStyleTag
+				 * @method
+				 */
+				addStyleTag: newStyleTag,
+
+				/**
+				 * Batch-request queued dependencies from the server.
 				 */
 				work: function () {
 					var	reqBase, splits, maxQueryLength, q, b, bSource, bGroup, bSourceGroup,
@@ -1311,15 +1384,15 @@ var mw = ( function ( $, undefined ) {
 				},
 
 				/**
-				 * Registers a module, letting the system know about it and its
+				 * Register a module, letting the system know about it and its
 				 * properties. Startup modules contain calls to this function.
 				 *
-				 * @param module {String}: Module name
-				 * @param version {Number}: Module version number as a timestamp (falls backs to 0)
-				 * @param dependencies {String|Array|Function}: One string or array of strings of module
+				 * @param {string} module Module name
+				 * @param {number} version Module version number as a timestamp (falls backs to 0)
+				 * @param {string|Array|Function} dependencies One string or array of strings of module
 				 *  names on which this module depends, or a function that returns that array.
-				 * @param group {String}: Group which the module is in (optional, defaults to null)
-				 * @param source {String}: Name of the source. Defaults to local.
+				 * @param {string} [group=null] Group which the module is in
+				 * @param {string} [source='local'] Name of the source
 				 */
 				register: function ( module, version, dependencies, group, source ) {
 					var m;
@@ -1362,9 +1435,10 @@ var mw = ( function ( $, undefined ) {
 				},
 
 				/**
-				 * Implements a module, giving the system a course of action to take
-				 * upon loading. Results of a request for one or more modules contain
-				 * calls to this function.
+				 * Implement a module given the components that make up the module.
+				 *
+				 * When #load or #using requests one or more modules, the server
+				 * response contain calls to this function.
 				 *
 				 * All arguments are required.
 				 *
@@ -1419,12 +1493,12 @@ var mw = ( function ( $, undefined ) {
 				},
 
 				/**
-				 * Executes a function as soon as one or more required modules are ready
+				 * Execute a function as soon as one or more required modules are ready.
 				 *
-				 * @param dependencies {String|Array} Module name or array of modules names the callback
+				 * @param {string|Array} dependencies Module name or array of modules names the callback
 				 *  dependends on to be ready before executing
-				 * @param ready {Function} callback to execute when all dependencies are ready (optional)
-				 * @param error {Function} callback to execute when if dependencies have a errors (optional)
+				 * @param {Function} [ready] callback to execute when all dependencies are ready
+				 * @param {Function} [error] callback to execute when if dependencies have a errors
 				 */
 				using: function ( dependencies, ready, error ) {
 					var tod = typeof dependencies;
@@ -1456,17 +1530,17 @@ var mw = ( function ( $, undefined ) {
 				},
 
 				/**
-				 * Loads an external script or one or more modules for future use
+				 * Load an external script or one or more modules.
 				 *
-				 * @param modules {mixed} Either the name of a module, array of modules,
+				 * @param {string|Array} modules Either the name of a module, array of modules,
 				 *  or a URL of an external script or style
-				 * @param type {String} mime-type to use if calling with a URL of an
+				 * @param {string} [type='text/javascript'] mime-type to use if calling with a URL of an
 				 *  external script or style; acceptable values are "text/css" and
 				 *  "text/javascript"; if no type is provided, text/javascript is assumed.
-				 * @param async {Boolean} (optional) If true, load modules asynchronously
-				 *  even if document ready has not yet occurred. If false (default),
-				 *  block before document ready and load async after. If not set, true will
-				 *  be assumed if loading a URL, and false will be assumed otherwise.
+				 * @param {boolean} [async] If true, load modules asynchronously
+				 *  even if document ready has not yet occurred. If false, block before
+				 *  document ready and load async after. If not set, true will be
+				 *  assumed if loading a URL, and false will be assumed otherwise.
 				 */
 				load: function ( modules, type, async ) {
 					var filtered, m, module, l;
@@ -1536,10 +1610,10 @@ var mw = ( function ( $, undefined ) {
 				},
 
 				/**
-				 * Changes the state of a module
+				 * Change the state of one or more modules.
 				 *
-				 * @param module {String|Object} module name or object of module name/state pairs
-				 * @param state {String} state name
+				 * @param {string|Object} module module name or object of module name/state pairs
+				 * @param {string} state state name
 				 */
 				state: function ( module, state ) {
 					var m;
@@ -1565,9 +1639,9 @@ var mw = ( function ( $, undefined ) {
 				},
 
 				/**
-				 * Gets the version of a module
+				 * Get the version of a module.
 				 *
-				 * @param module string name of module to get version for
+				 * @param {string} module Name of module to get version for
 				 */
 				getVersion: function ( module ) {
 					if ( registry[module] !== undefined && registry[module].version !== undefined ) {
@@ -1577,16 +1651,17 @@ var mw = ( function ( $, undefined ) {
 				},
 
 				/**
-				 * @deprecated since 1.18 use mw.loader.getVersion() instead
+				 * @inheritdoc #getVersion
+				 * @deprecated since 1.18 use #getVersion instead
 				 */
 				version: function () {
 					return mw.loader.getVersion.apply( mw.loader, arguments );
 				},
 
 				/**
-				 * Gets the state of a module
+				 * Get the state of a module.
 				 *
-				 * @param module string name of module to get state for
+				 * @param {string} module name of module to get state for
 				 */
 				getState: function ( module ) {
 					if ( registry[module] !== undefined && registry[module].state !== undefined ) {
@@ -1607,16 +1682,45 @@ var mw = ( function ( $, undefined ) {
 				},
 
 				/**
-				 * For backwards-compatibility with Squid-cached pages. Loads mw.user
+				 * Load the `mediawiki.user` module.
+				 *
+				 * For backwards-compatibility with cached pages from before 2013 where:
+				 *
+				 * - the `mediawiki.user` module didn't exist yet
+				 * - `mw.user` was still part of mediawiki.js
+				 * - `mw.loader.go` still existed and called after `mw.loader.load()`
 				 */
 				go: function () {
 					mw.loader.load( 'mediawiki.user' );
+				},
+
+				/**
+				 * @inheritdoc mw.inspect#runReports
+				 * @method
+				 */
+				inspect: function () {
+					var args = slice.call( arguments );
+					mw.loader.using( 'mediawiki.inspect', function () {
+						mw.inspect.runReports.apply( mw.inspect, args );
+					} );
 				}
+
 			};
 		}() ),
 
 		/**
 		 * HTML construction helper functions
+		 *
+		 *     @example
+		 *
+		 *     var Html, output;
+		 *
+		 *     Html = mw.html;
+		 *     output = Html.element( 'div', {}, new Html.Raw(
+		 *         Html.element( 'img', { src: '<' } )
+		 *     ) );
+		 *     mw.log( output ); // <div><img src="&lt;"/></div>
+		 *
 		 * @class mw.html
 		 * @singleton
 		 */
@@ -1645,40 +1749,18 @@ var mw = ( function ( $, undefined ) {
 					return s.replace( /['"<>&]/g, escapeCallback );
 				},
 
-				/**
-				 * Wrapper object for raw HTML passed to mw.html.element().
-				 * @class mw.html.Raw
-				 */
-				Raw: function ( value ) {
-					this.value = value;
-				},
-
-				/**
-				 * Wrapper object for CDATA element contents passed to mw.html.element()
-				 * @class mw.html.Cdata
-				 */
-				Cdata: function ( value ) {
-					this.value = value;
-				},
-
 				/**
 				 * Create an HTML element string, with safe escaping.
 				 *
-				 * @param name The tag name.
-				 * @param attrs An object with members mapping element names to values
-				 * @param contents The contents of the element. May be either:
+				 * @param {string} name The tag name.
+				 * @param {Object} attrs An object with members mapping element names to values
+				 * @param {Mixed} contents The contents of the element. May be either:
 				 *  - string: The string is escaped.
 				 *  - null or undefined: The short closing form is used, e.g. <br/>.
 				 *  - this.Raw: The value attribute is included without escaping.
 				 *  - this.Cdata: The value attribute is included, and an exception is
 				 *   thrown if it contains an illegal ETAGO delimiter.
 				 *   See http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.3.2
-				 *
-				 * Example:
-				 *	var h = mw.html;
-				 *	return h.element( 'div', {},
-				 *		new h.Raw( h.element( 'img', {src: '<'} ) ) );
-				 * Returns <div><img src="&lt;"/></div>
 				 */
 				element: function ( name, attrs, contents ) {
 					var v, attrName, s = '<' + name;
@@ -1727,6 +1809,22 @@ var mw = ( function ( $, undefined ) {
 					}
 					s += '</' + name + '>';
 					return s;
+				},
+
+				/**
+				 * Wrapper object for raw HTML passed to mw.html.element().
+				 * @class mw.html.Raw
+				 */
+				Raw: function ( value ) {
+					this.value = value;
+				},
+
+				/**
+				 * Wrapper object for CDATA element contents passed to mw.html.element()
+				 * @class mw.html.Cdata
+				 */
+				Cdata: function ( value ) {
+					this.value = value;
 				}
 			};
 		}() ),
@@ -1735,7 +1833,87 @@ var mw = ( function ( $, undefined ) {
 		user: {
 			options: new Map(),
 			tokens: new Map()
-		}
+		},
+
+		/**
+		 * Registry and firing of events.
+		 *
+		 * MediaWiki has various interface components that are extended, enhanced
+		 * or manipulated in some other way by extensions, gadgets and even
+		 * in core itself.
+		 *
+		 * This framework helps streamlining the timing of when these other
+		 * code paths fire their plugins (instead of using document-ready,
+		 * which can and should be limited to firing only once).
+		 *
+		 * Features like navigating to other wiki pages, previewing an edit
+		 * and editing itself – without a refresh – can then retrigger these
+		 * hooks accordingly to ensure everything still works as expected.
+		 *
+		 * Example usage:
+		 *
+		 *     mw.hook( 'wikipage.content' ).add( fn ).remove( fn );
+		 *     mw.hook( 'wikipage.content' ).fire( $content );
+		 *
+		 * Handlers can be added and fired for arbitrary event names at any time. The same
+		 * event can be fired multiple times. The last run of an event is memorized
+		 * (similar to `$(document).ready` and `$.Deferred().done`).
+		 * This means if an event is fired, and a handler added afterwards, the added
+		 * function will be fired right away with the last given event data.
+		 *
+		 * Like Deferreds and Promises, the mw.hook object is both detachable and chainable.
+		 * Thus allowing flexible use and optimal maintainability and authority control.
+		 * You can pass around the `add` and/or `fire` method to another piece of code
+		 * without it having to know the event name (or `mw.hook` for that matter).
+		 *
+		 *     var h = mw.hook( 'bar.ready' );
+		 *     new mw.Foo( .. ).fetch( { callback: h.fire } );
+		 *
+		 * Note: Events are documented with an underscore instead of a dot in the event
+		 * name due to jsduck not supporting dots in that position.
+		 *
+		 * @class mw.hook
+		 */
+		hook: ( function () {
+			var lists = {};
+
+			/**
+			 * Create an instance of mw.hook.
+			 *
+			 * @method hook
+			 * @member mw
+			 * @param {string} name Name of hook.
+			 * @return {mw.hook}
+			 */
+			return function ( name ) {
+				var list = lists[name] || ( lists[name] = $.Callbacks( 'memory' ) );
+
+				return {
+					/**
+					 * Register a hook handler
+					 * @param {Function...} handler Function to bind.
+					 * @chainable
+					 */
+					add: list.add,
+
+					/**
+					 * Unregister a hook handler
+					 * @param {Function...} handler Function to unbind.
+					 * @chainable
+					 */
+					remove: list.remove,
+
+					/**
+					 * Run a hook.
+					 * @param {Mixed...} data
+					 * @chainable
+					 */
+					fire: function () {
+						return list.fireWith( null, slice.call( arguments ) );
+					}
+				};
+			};
+		}() )
 	};
 
 }( jQuery ) );
diff --git a/resources/mediawiki/mediawiki.log.js b/resources/mediawiki/mediawiki.log.js
index ee08b12b..75e4c961 100644
--- a/resources/mediawiki/mediawiki.log.js
+++ b/resources/mediawiki/mediawiki.log.js
@@ -1,4 +1,4 @@
-/**
+/*!
  * Logger for MediaWiki javascript.
  * Implements the stub left by the main 'mediawiki' module.
  *
@@ -8,16 +8,21 @@
 
 ( function ( mw, $ ) {
 
+	/**
+	 * @class mw.log
+	 * @singleton
+	 */
+
 	/**
 	 * Logs a message to the console.
 	 *
 	 * In the case the browser does not have a console API, a console is created on-the-fly by appending
-	 * a <div id="mw-log-console"> element to the bottom of the body and then appending this and future
+	 * a `<div id="mw-log-console">` element to the bottom of the body and then appending this and future
 	 * messages to that, instead of the console.
 	 *
-	 * @param {String} First in list of variadic messages to output to console.
+	 * @param {string...} msg Messages to output to console.
 	 */
-	mw.log = function ( /* logmsg, logmsg, */ ) {
+	mw.log = function () {
 		// Turn arguments into an array
 		var	args = Array.prototype.slice.call( arguments ),
 			// Allow log messages to use a configured prefix to identify the source window (ie. frame)
@@ -54,7 +59,7 @@
 				hovzer.update();
 			}
 			$log.append(
-				$( '<div></div>' )
+				$( '<div>' )
 					.css( {
 						borderBottom: 'solid 1px #DDDDDD',
 						fontSize: 'small',
@@ -68,4 +73,54 @@
 		} );
 	};
 
+	/**
+	 * Write a message the console's warning channel.
+	 * Also logs a stacktrace for easier debugging.
+	 * Each action is silently ignored if the browser doesn't support it.
+	 *
+	 * @param {string...} msg Messages to output to console
+	 */
+	mw.log.warn = function () {
+		var console = window.console;
+		if ( console && console.warn ) {
+			console.warn.apply( console, arguments );
+			if ( console.trace ) {
+				console.trace();
+			}
+		}
+	};
+
+	/**
+	 * Create a property in a host object that, when accessed, will produce
+	 * a deprecation warning in the console with backtrace.
+	 *
+	 * @param {Object} obj Host object of deprecated property
+	 * @param {string} key Name of property to create in `obj`
+	 * @param {Mixed} val The value this property should return when accessed
+	 * @param {string} [msg] Optional text to include in the deprecation message.
+	 */
+	mw.log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
+		obj[key] = val;
+	} : function ( obj, key, val, msg ) {
+		msg = 'MWDeprecationWarning: Use of "' + key + '" property is deprecated.' +
+			( msg ? ( ' ' + msg ) : '' );
+		try {
+			Object.defineProperty( obj, key, {
+				configurable: true,
+				enumerable: true,
+				get: function () {
+					mw.log.warn( msg );
+					return val;
+				},
+				set: function ( newVal ) {
+					mw.log.warn( msg );
+					val = newVal;
+				}
+			} );
+		} catch ( err ) {
+			// IE8 can throw on Object.defineProperty
+			obj[key] = val;
+		}
+	};
+
 }( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.notification.css b/resources/mediawiki/mediawiki.notification.css
index 9a7b651d..3aa358ac 100644
--- a/resources/mediawiki/mediawiki.notification.css
+++ b/resources/mediawiki/mediawiki.notification.css
@@ -2,15 +2,25 @@
  * Stylesheet for mediawiki.notification module
  */
 
-#mw-notification-area {
+.mw-notification-area {
 	position: absolute;
-	top: 1em;
-	right: 1em;
+	top: 0;
+	right: 0;
+	padding: 1em 1em 0 0;
 	width: 20em;
 	line-height: 1.35;
 	z-index: 10000;
 }
 
+.mw-notification-area-floating {
+	position: fixed;
+}
+
+* html .mw-notification-area-floating {
+	/* Make it at least 'absolute' in IE6 since 'fixed' is not supported */
+	position: absolute;
+}
+
 .mw-notification {
 	padding: 0.25em 1em;
 	margin-bottom: 0.5em;
diff --git a/resources/mediawiki/mediawiki.notification.js b/resources/mediawiki/mediawiki.notification.js
index fd34e7ee..4ede8096 100644
--- a/resources/mediawiki/mediawiki.notification.js
+++ b/resources/mediawiki/mediawiki.notification.js
@@ -2,10 +2,10 @@
 	'use strict';
 
 	var notification,
-		isPageReady = false,
-		preReadyNotifQueue = [],
 		// The #mw-notification-area div that all notifications are contained inside.
-		$area = null;
+		$area,
+		isPageReady = false,
+		preReadyNotifQueue = [];
 
 	/**
 	 * Creates a Notification object for 1 message.
@@ -350,7 +350,9 @@
 	 * @ignore
 	 */
 	function init() {
-		$area = $( '<div id="mw-notification-area"></div>' )
+		var offset, $window = $( window );
+
+		$area = $( '<div id="mw-notification-area" class="mw-notification-area mw-notification-area-layout"></div>' )
 			// Pause auto-hide timers when the mouse is in the notification area.
 			.on( {
 				mouseenter: notification.pause,
@@ -371,6 +373,19 @@
 
 		// Prepend the notification area to the content area and save it's object.
 		mw.util.$content.prepend( $area );
+		offset = $area.offset();
+
+		function updateAreaMode() {
+			var isFloating = $window.scrollTop() > offset.top;
+			$area
+				.toggleClass( 'mw-notification-area-floating', isFloating )
+				.toggleClass( 'mw-notification-area-layout', !isFloating );
+		}
+
+		$window.on( 'scroll', updateAreaMode );
+
+		// Initial mode
+		updateAreaMode();
 	}
 
 	/**
@@ -411,6 +426,7 @@
 		 * @param {HTMLElement|jQuery|mw.Message|string} message
 		 * @param {Object} options The options to use for the notification.
 		 *  See #defaults for details.
+		 * @return {Object} Object with a close function to close the notification
 		 */
 		notify: function ( message, options ) {
 			var notif;
@@ -423,6 +439,7 @@
 			} else {
 				preReadyNotifQueue.push( notif );
 			}
+			return { close: $.proxy( notif.close, notif ) };
 		},
 
 		/**
diff --git a/resources/mediawiki/mediawiki.notify.js b/resources/mediawiki/mediawiki.notify.js
index 83d95b61..743d6517 100644
--- a/resources/mediawiki/mediawiki.notify.js
+++ b/resources/mediawiki/mediawiki.notify.js
@@ -1,22 +1,23 @@
 /**
  * @class mw.plugin.notify
  */
-( function ( mw ) {
+( function ( mw, $ ) {
 	'use strict';
 
 	/**
 	 * @see mw.notification#notify
 	 * @param message
 	 * @param options
+	 * @return {jQuery.Promise}
 	 */
 	mw.notify = function ( message, options ) {
+		var d = $.Deferred();
 		// Don't bother loading the whole notification system if we never use it.
 		mw.loader.using( 'mediawiki.notification', function () {
-			// Don't bother calling mw.loader.using a second time after we've already loaded mw.notification.
-			mw.notify = mw.notification.notify;
 			// Call notify with the notification the user requested of us.
-			mw.notify( message, options );
-		} );
+			d.resolve( mw.notification.notify( message, options ) );
+		}, d.reject );
+		return d.promise();
 	};
 
 	/**
@@ -24,4 +25,4 @@
 	 * @mixins mw.plugin.notify
 	 */
 
-}( mediaWiki ) );
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.searchSuggest.js b/resources/mediawiki/mediawiki.searchSuggest.js
index 2bc7cea9..7f078626 100644
--- a/resources/mediawiki/mediawiki.searchSuggest.js
+++ b/resources/mediawiki/mediawiki.searchSuggest.js
@@ -2,7 +2,7 @@
  * Add search suggestions to the search form.
  */
 ( function ( mw, $ ) {
-	$( document ).ready( function ( $ ) {
+	$( function () {
 		var map, resultRenderCache, searchboxesSelectors,
 			// Region where the suggestions box will appear directly below
 			// (using the same width). Can be a container element or the input
@@ -130,8 +130,6 @@
 		searchboxesSelectors = [
 			// Primary searchbox on every page in standard skins
 			'#searchInput',
-			// Secondary searchbox in legacy skins (LegacyTemplate::searchForm uses id "searchInput + unique id")
-			'#searchInput2',
 			// Special:Search
 			'#powerSearchText',
 			'#searchText',
@@ -141,36 +139,27 @@
 		$( searchboxesSelectors.join(', ') )
 			.suggestions( {
 				fetch: function ( query ) {
-					var $el, jqXhr;
+					var $el;
 
 					if ( query.length !== 0 ) {
-						$el = $(this);
-						jqXhr = $.ajax( {
-							url: mw.util.wikiScript( 'api' ),
-							data: {
-								format: 'json',
-								action: 'opensearch',
-								search: query,
-								namespace: 0,
-								suggest: ''
-							},
-							dataType: 'json',
-							success: function ( data ) {
-								if ( $.isArray( data ) && data.length ) {
-									$el.suggestions( 'suggestions', data[1] );
-								}
-							}
-						});
-						$el.data( 'request', jqXhr );
+						$el = $( this );
+						$el.data( 'request', ( new mw.Api() ).get( {
+							action: 'opensearch',
+							search: query,
+							namespace: 0,
+							suggest: ''
+						} ).done( function ( data ) {
+							$el.suggestions( 'suggestions', data[1] );
+						} ) );
 					}
 				},
 				cancel: function () {
-					var jqXhr = $(this).data( 'request' );
+					var apiPromise = $( this ).data( 'request' );
 					// If the delay setting has caused the fetch to have not even happened
-					// yet, the jqXHR object will have never been set.
-					if ( jqXhr && $.isFunction( jqXhr.abort ) ) {
-						jqXhr.abort();
-						$(this).removeData( 'request' );
+					// yet, the apiPromise object will have never been set.
+					if ( apiPromise && $.isFunction( apiPromise.abort ) ) {
+						apiPromise.abort();
+						$( this ).removeData( 'request' );
 					}
 				},
 				result: {
@@ -196,11 +185,6 @@
 			return;
 		}
 
-		// Placeholder text for search box
-		$searchInput
-			.attr( 'placeholder', mw.msg( 'searchsuggest-search' ) )
-			.placeholder();
-
 		// Special suggestions functionality for skin-provided search box
 		$searchInput.suggestions( {
 			result: {
diff --git a/resources/mediawiki/mediawiki.user.js b/resources/mediawiki/mediawiki.user.js
index e0329597..3e375fb6 100644
--- a/resources/mediawiki/mediawiki.user.js
+++ b/resources/mediawiki/mediawiki.user.js
@@ -1,67 +1,60 @@
-/*
- * Implementation for mediaWiki.user
+/**
+ * @class mw.user
+ * @singleton
  */
-
 ( function ( mw, $ ) {
+	var user,
+		callbacks = {},
+		// Extend the skeleton mw.user from mediawiki.js
+		// This is kind of ugly but we're stuck with this for b/c reasons
+		options = mw.user.options || new mw.Map(),
+		tokens = mw.user.tokens || new mw.Map();
 
 	/**
-	 * User object
+	 * Get the current user's groups or rights
+	 *
+	 * @private
+	 * @param {string} info One of 'groups' or 'rights'
+	 * @param {Function} callback
 	 */
-	function User( options, tokens ) {
-		var user, callbacks;
-
-		/* Private Members */
-
-		user = this;
-		callbacks = {};
-
-		/**
-		 * Gets the current user's groups or rights.
-		 * @param {String} info: One of 'groups' or 'rights'.
-		 * @param {Function} callback
-		 */
-		function getUserInfo( info, callback ) {
-			var api;
-			if ( callbacks[info] ) {
-				callbacks[info].add( callback );
-				return;
-			}
-			callbacks.rights = $.Callbacks('once memory');
-			callbacks.groups = $.Callbacks('once memory');
+	function getUserInfo( info, callback ) {
+		var api;
+		if ( callbacks[info] ) {
 			callbacks[info].add( callback );
-			api = new mw.Api();
-			api.get( {
-				action: 'query',
-				meta: 'userinfo',
-				uiprop: 'rights|groups'
-			} ).always( function ( data ) {
-				var rights, groups;
-				if ( data.query && data.query.userinfo ) {
-					rights = data.query.userinfo.rights;
-					groups = data.query.userinfo.groups;
-				}
-				callbacks.rights.fire( rights || [] );
-				callbacks.groups.fire( groups || [] );
-			} );
+			return;
 		}
+		callbacks.rights = $.Callbacks('once memory');
+		callbacks.groups = $.Callbacks('once memory');
+		callbacks[info].add( callback );
+		api = new mw.Api();
+		api.get( {
+			action: 'query',
+			meta: 'userinfo',
+			uiprop: 'rights|groups'
+		} ).always( function ( data ) {
+			var rights, groups;
+			if ( data.query && data.query.userinfo ) {
+				rights = data.query.userinfo.rights;
+				groups = data.query.userinfo.groups;
+			}
+			callbacks.rights.fire( rights || [] );
+			callbacks.groups.fire( groups || [] );
+		} );
+	}
 
-		/* Public Members */
-
-		this.options = options || new mw.Map();
-
-		this.tokens = tokens || new mw.Map();
-
-		/* Public Methods */
+	mw.user = user = {
+		options: options,
+		tokens: tokens,
 
 		/**
-		 * Generates a random user session ID (32 alpha-numeric characters).
+		 * Generate a random user session ID (32 alpha-numeric characters)
 		 *
 		 * This information would potentially be stored in a cookie to identify a user during a
 		 * session or series of sessions. Its uniqueness should not be depended on.
 		 *
-		 * @return String: Random set of 32 alpha-numeric characters
+		 * @return {string} Random set of 32 alpha-numeric characters
 		 */
-		this.generateRandomSessionId = function () {
+		generateRandomSessionId: function () {
 			var i, r,
 				id = '',
 				seed = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
@@ -70,33 +63,45 @@
 				id += seed.substring( r, r + 1 );
 			}
 			return id;
-		};
+		},
+
+		/**
+		 * Get the current user's database id
+		 *
+		 * Not to be confused with #id.
+		 *
+		 * @return {number} Current user's id, or 0 if user is anonymous
+		 */
+		getId: function () {
+			return mw.config.get( 'wgUserId', 0 );
+		},
 
 		/**
-		 * Gets the current user's name.
+		 * Get the current user's name
 		 *
-		 * @return Mixed: User name string or null if users is anonymous
+		 * @return {string|null} User name string or null if user is anonymous
 		 */
-		this.getName = function () {
+		getName: function () {
 			return mw.config.get( 'wgUserName' );
-		};
+		},
 
 		/**
-		 * @deprecated since 1.20 use mw.user.getName() instead
+		 * @inheritdoc #getName
+		 * @deprecated since 1.20 use #getName instead
 		 */
-		this.name = function () {
-			return this.getName();
-		};
+		name: function () {
+			return user.getName();
+		},
 
 		/**
-		 * Get date user registered, if available.
+		 * Get date user registered, if available
 		 *
-		 * @return {Date|false|null} date user registered, or false for anonymous users, or
+		 * @return {Date|boolean|null} Date user registered, or false for anonymous users, or
 		 *  null when data is not available
 		 */
-		this.getRegistration = function () {
+		getRegistration: function () {
 			var registration = mw.config.get( 'wgUserRegistration' );
-			if ( this.isAnon() ) {
+			if ( user.isAnon() ) {
 				return false;
 			} else if ( registration === null ) {
 				// Information may not be available if they signed up before
@@ -105,110 +110,109 @@
 			} else {
 				return new Date( registration );
 			}
-		};
+		},
 
 		/**
-		 * Checks if the current user is anonymous.
+		 * Whether the current user is anonymous
 		 *
-		 * @return Boolean
+		 * @return {boolean}
 		 */
-		this.isAnon = function () {
+		isAnon: function () {
 			return user.getName() === null;
-		};
+		},
 
 		/**
-		 * @deprecated since 1.20 use mw.user.isAnon() instead
+		 * @inheritdoc #isAnon
+		 * @deprecated since 1.20 use #isAnon instead
 		 */
-		this.anonymous = function () {
+		anonymous: function () {
 			return user.isAnon();
-		};
+		},
 
 		/**
-		 * Gets a random session ID automatically generated and kept in a cookie.
+		 * Get an automatically generated random ID (stored in a session cookie)
 		 *
 		 * This ID is ephemeral for everyone, staying in their browser only until they close
 		 * their browser.
 		 *
-		 * @return String: User name or random session ID
+		 * @return {string} Random session ID
 		 */
-		this.sessionId = function () {
+		sessionId: function () {
 			var sessionId = $.cookie( 'mediaWiki.user.sessionId' );
-			if ( typeof sessionId === 'undefined' || sessionId === null ) {
+			if ( sessionId === undefined || sessionId === null ) {
 				sessionId = user.generateRandomSessionId();
-				$.cookie( 'mediaWiki.user.sessionId', sessionId, { 'expires': null, 'path': '/' } );
+				$.cookie( 'mediaWiki.user.sessionId', sessionId, { expires: null, path: '/' } );
 			}
 			return sessionId;
-		};
+		},
 
 		/**
-		 * Gets the current user's name or the session ID
+		 * Get the current user's name or the session ID
 		 *
-		 * @return String: User name or random session ID
+		 * Not to be confused with #getId.
+		 *
+		 * @return {string} User name or random session ID
 		 */
-		this.id = function() {
-			var name = user.getName();
-			if ( name ) {
-				return name;
-			}
-			return user.sessionId();
-		};
+		id: function () {
+			return user.getName() || user.sessionId();
+		},
 
 		/**
-		 * Gets the user's bucket, placing them in one at random based on set odds if needed.
-		 *
-		 * @param key String: Name of bucket
-		 * @param options Object: Bucket configuration options
-		 * @param options.buckets Object: List of bucket-name/relative-probability pairs (required,
-		 * must have at least one pair)
-		 * @param options.version Number: Version of bucket test, changing this forces rebucketing
-		 * (optional, default: 0)
-		 * @param options.tracked Boolean: Track the event of bucketing through the API module of
-		 * the ClickTracking extension (optional, default: false)
-		 * @param options.expires Number: Length of time (in days) until the user gets rebucketed
-		 * (optional, default: 30)
-		 * @return String: Bucket name - the randomly chosen key of the options.buckets object
+		 * Get the user's bucket (place them in one if not done already)
 		 *
-		 * @example
 		 *     mw.user.bucket( 'test', {
-		 *         'buckets': { 'ignored': 50, 'control': 25, 'test': 25 },
-		 *         'version': 1,
-		 *         'tracked': true,
-		 *         'expires': 7
+		 *         buckets: { ignored: 50, control: 25, test: 25 },
+		 *         version: 1,
+		 *         expires: 7
 		 *     } );
+		 *
+		 * @param {string} key Name of bucket
+		 * @param {Object} options Bucket configuration options
+		 * @param {Object} options.buckets List of bucket-name/relative-probability pairs (required,
+		 *  must have at least one pair)
+		 * @param {number} [options.version=0] Version of bucket test, changing this forces
+		 *  rebucketing
+		 * @param {number} [options.expires=30] Length of time (in days) until the user gets
+		 *  rebucketed
+		 * @return {string} Bucket name - the randomly chosen key of the `options.buckets` object
 		 */
-		this.bucket = function ( key, options ) {
+		bucket: function ( key, options ) {
 			var cookie, parts, version, bucket,
 				range, k, rand, total;
 
 			options = $.extend( {
 				buckets: {},
 				version: 0,
-				tracked: false,
 				expires: 30
 			}, options || {} );
 
 			cookie = $.cookie( 'mediaWiki.user.bucket:' + key );
 
 			// Bucket information is stored as 2 integers, together as version:bucket like: "1:2"
-			if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) > 0 ) {
+			if ( typeof cookie === 'string' && cookie.length > 2 && cookie.indexOf( ':' ) !== -1 ) {
 				parts = cookie.split( ':' );
 				if ( parts.length > 1 && Number( parts[0] ) === options.version ) {
 					version = Number( parts[0] );
 					bucket = String( parts[1] );
 				}
 			}
+
 			if ( bucket === undefined ) {
 				if ( !$.isPlainObject( options.buckets ) ) {
-					throw 'Invalid buckets error. Object expected for options.buckets.';
+					throw new Error( 'Invalid bucket. Object expected for options.buckets.' );
 				}
+
 				version = Number( options.version );
+
 				// Find range
 				range = 0;
 				for ( k in options.buckets ) {
 					range += options.buckets[k];
 				}
+
 				// Select random value within range
 				rand = Math.random() * range;
+
 				// Determine which bucket the value landed in
 				total = 0;
 				for ( k in options.buckets ) {
@@ -218,39 +222,34 @@
 						break;
 					}
 				}
-				if ( options.tracked ) {
-					mw.loader.using( 'jquery.clickTracking', function () {
-						$.trackAction(
-							'mediaWiki.user.bucket:' + key + '@' + version + ':' + bucket
-						);
-					} );
-				}
+
 				$.cookie(
 					'mediaWiki.user.bucket:' + key,
 					version + ':' + bucket,
-					{ 'path': '/', 'expires': Number( options.expires ) }
+					{ path: '/', expires: Number( options.expires ) }
 				);
 			}
+
 			return bucket;
-		};
+		},
 
 		/**
-		 * Gets the current user's groups.
+		 * Get the current user's groups
+		 *
+		 * @param {Function} callback
 		 */
-		this.getGroups = function ( callback ) {
+		getGroups: function ( callback ) {
 			getUserInfo( 'groups', callback );
-		};
+		},
 
 		/**
-		 * Gets the current user's rights.
+		 * Get the current user's rights
+		 *
+		 * @param {Function} callback
 		 */
-		this.getRights = function ( callback ) {
+		getRights: function ( callback ) {
 			getUserInfo( 'rights', callback );
-		};
-	}
-
-	// Extend the skeleton mw.user from mediawiki.js
-	// This is kind of ugly but we're stuck with this for b/c reasons
-	mw.user = new User( mw.user.options, mw.user.tokens );
+		}
+	};
 
 }( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.util.js b/resources/mediawiki/mediawiki.util.js
index 5211b0d0..7383df2d 100644
--- a/resources/mediawiki/mediawiki.util.js
+++ b/resources/mediawiki/mediawiki.util.js
@@ -13,7 +13,7 @@
 		 * (don't call before document ready)
 		 */
 		init: function () {
-			var profile, $tocTitle, $tocToggleLink, hideTocCookie;
+			var profile;
 
 			/* Set tooltipAccessKeyPrefix */
 			profile = $.client.profile();
@@ -53,8 +53,9 @@
 							|| profile.name === 'konqueror' ) ) {
 				util.tooltipAccessKeyPrefix = 'ctrl-';
 
-			// Firefox 2.x and later
-			} else if ( profile.name === 'firefox' && profile.versionBase > '1' ) {
+			// Firefox/Iceweasel 2.x and later
+			} else if ( ( profile.name === 'firefox' || profile.name === 'iceweasel' )
+				&& profile.versionBase > '1' ) {
 				util.tooltipAccessKeyPrefix = 'alt-shift-';
 			}
 
@@ -105,29 +106,32 @@
 			} )();
 
 			// Table of contents toggle
-			$tocTitle = $( '#toctitle' );
-			$tocToggleLink = $( '#togglelink' );
-			// Only add it if there is a TOC and there is no toggle added already
-			if ( $( '#toc' ).length && $tocTitle.length && !$tocToggleLink.length ) {
-				hideTocCookie = $.cookie( 'mw_hidetoc' );
+			mw.hook( 'wikipage.content' ).add( function () {
+				var $tocTitle, $tocToggleLink, hideTocCookie;
+				$tocTitle = $( '#toctitle' );
+				$tocToggleLink = $( '#togglelink' );
+				// Only add it if there is a TOC and there is no toggle added already
+				if ( $( '#toc' ).length && $tocTitle.length && !$tocToggleLink.length ) {
+					hideTocCookie = $.cookie( 'mw_hidetoc' );
 					$tocToggleLink = $( '<a href="#" class="internal" id="togglelink"></a>' )
 						.text( mw.msg( 'hidetoc' ) )
 						.click( function ( e ) {
 							e.preventDefault();
 							util.toggleToc( $(this) );
 						} );
-				$tocTitle.append(
-					$tocToggleLink
-						.wrap( '<span class="toctoggle"></span>' )
-						.parent()
-							.prepend( '&nbsp;[' )
-							.append( ']&nbsp;' )
-				);
-
-				if ( hideTocCookie === '1' ) {
-					util.toggleToc( $tocToggleLink );
+					$tocTitle.append(
+						$tocToggleLink
+							.wrap( '<span class="toctoggle"></span>' )
+							.parent()
+								.prepend( '&nbsp;[' )
+								.append( ']&nbsp;' )
+					);
+
+					if ( hideTocCookie === '1' ) {
+						util.toggleToc( $tocToggleLink );
+					}
 				}
-			}
+			} );
 		},
 
 		/* Main body */
@@ -160,11 +164,18 @@
 		 * Get the link to a page name (relative to `wgServer`),
 		 *
 		 * @param {string} str Page name to get the link for.
+		 * @param {Object} params A mapping of query parameter names to values,
+		 *     e.g. { action: 'edit' }. Optional.
 		 * @return {string} Location for a page with name of `str` or boolean false on error.
 		 */
-		wikiGetlink: function ( str ) {
-			return mw.config.get( 'wgArticlePath' ).replace( '$1',
+		getUrl: function ( str, params ) {
+			var url = mw.config.get( 'wgArticlePath' ).replace( '$1',
 				util.wikiUrlencode( typeof str === 'string' ? str : mw.config.get( 'wgPageName' ) ) );
+			if ( params && !$.isEmptyObject( params ) ) {
+				url += url.indexOf( '?' ) !== -1 ? '&' : '?';
+				url += $.param( params );
+			}
+			return url;
 		},
 
 		/**
@@ -251,7 +262,7 @@
 		 * Returns null if not found.
 		 *
 		 * @param {string} param The parameter name.
-		 * @param {string} [url] URL to search through.
+		 * @param {string} [url=document.location.href] URL to search through, defaulting to the current document's URL.
 		 * @return {Mixed} Parameter value or null.
 		 */
 		getParamValue: function ( param, url ) {
@@ -279,8 +290,17 @@
 		/**
 		 * @property {RegExp}
 		 * Regex to match accesskey tooltips.
+		 *
+		 * Should match:
+		 *
+		 * - "ctrl-option-"
+		 * - "alt-shift-"
+		 * - "ctrl-alt-"
+		 * - "ctrl-"
+		 *
+		 * The accesskey is matched in group $6.
 		 */
-		tooltipAccessKeyRegexp: /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
+		tooltipAccessKeyRegexp: /\[(ctrl-)?(option-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
 
 		/**
 		 * Add the appropriate prefix to the accesskey shown in the tooltip.
@@ -301,9 +321,9 @@
 			}
 
 			$nodes.attr( 'title', function ( i, val ) {
-				if ( val && util.tooltipAccessKeyRegexp.exec( val ) ) {
+				if ( val && util.tooltipAccessKeyRegexp.test( val ) ) {
 					return val.replace( util.tooltipAccessKeyRegexp,
-						'[' + util.tooltipAccessKeyPrefix + '$5]' );
+						'[' + util.tooltipAccessKeyPrefix + '$6]' );
 				}
 				return val;
 			} );
@@ -364,87 +384,86 @@
 				$link.attr( 'title', tooltip );
 			}
 
-			// Some skins don't have any portlets
-			// just add it to the bottom of their 'sidebar' element as a fallback
-			switch ( mw.config.get( 'skin' ) ) {
-			case 'standard':
-				$( '#quickbar' ).append( $link.after( '<br/>' ) );
-				return $link[0];
-			case 'nostalgia':
-				$( '#searchform' ).before( $link ).before( ' &#124; ' );
-				return $link[0];
-			default: // Skins like chick, modern, monobook, myskin, simple, vector...
-
-				// Select the specified portlet
-				$portlet = $( '#' + portlet );
-				if ( $portlet.length === 0 ) {
-					return null;
-				}
-				// Select the first (most likely only) unordered list inside the portlet
-				$ul = $portlet.find( 'ul' ).eq( 0 );
+			// Select the specified portlet
+			$portlet = $( '#' + portlet );
+			if ( $portlet.length === 0 ) {
+				return null;
+			}
+			// Select the first (most likely only) unordered list inside the portlet
+			$ul = $portlet.find( 'ul' ).eq( 0 );
 
-				// If it didn't have an unordered list yet, create it
-				if ( $ul.length === 0 ) {
+			// If it didn't have an unordered list yet, create it
+			if ( $ul.length === 0 ) {
 
-					$ul = $( '<ul>' );
+				$ul = $( '<ul>' );
 
-					// If there's no <div> inside, append it to the portlet directly
-					if ( $portlet.find( 'div:first' ).length === 0 ) {
-						$portlet.append( $ul );
-					} else {
-						// otherwise if there's a div (such as div.body or div.pBody)
-						// append the <ul> to last (most likely only) div
-						$portlet.find( 'div' ).eq( -1 ).append( $ul );
-					}
-				}
-				// Just in case..
-				if ( $ul.length === 0 ) {
-					return null;
+				// If there's no <div> inside, append it to the portlet directly
+				if ( $portlet.find( 'div:first' ).length === 0 ) {
+					$portlet.append( $ul );
+				} else {
+					// otherwise if there's a div (such as div.body or div.pBody)
+					// append the <ul> to last (most likely only) div
+					$portlet.find( 'div' ).eq( -1 ).append( $ul );
 				}
+			}
+			// Just in case..
+			if ( $ul.length === 0 ) {
+				return null;
+			}
 
-				// Unhide portlet if it was hidden before
-				$portlet.removeClass( 'emptyPortlet' );
+			// Unhide portlet if it was hidden before
+			$portlet.removeClass( 'emptyPortlet' );
 
-				// Wrap the anchor tag in a list item (and a span if $portlet is a Vector tab)
-				// and back up the selector to the list item
-				if ( $portlet.hasClass( 'vectorTabs' ) ) {
-					$item = $link.wrap( '<li><span></span></li>' ).parent().parent();
-				} else {
-					$item = $link.wrap( '<li></li>' ).parent();
-				}
+			// Wrap the anchor tag in a list item (and a span if $portlet is a Vector tab)
+			// and back up the selector to the list item
+			if ( $portlet.hasClass( 'vectorTabs' ) ) {
+				$item = $link.wrap( '<li><span></span></li>' ).parent().parent();
+			} else {
+				$item = $link.wrap( '<li></li>' ).parent();
+			}
 
-				// Implement the properties passed to the function
-				if ( id ) {
-					$item.attr( 'id', id );
-				}
+			// Implement the properties passed to the function
+			if ( id ) {
+				$item.attr( 'id', id );
+			}
+
+			if ( tooltip ) {
+				// Trim any existing accesskey hint and the trailing space
+				tooltip = $.trim( tooltip.replace( util.tooltipAccessKeyRegexp, '' ) );
 				if ( accesskey ) {
-					$link.attr( 'accesskey', accesskey );
 					tooltip += ' [' + accesskey + ']';
-					$link.attr( 'title', tooltip );
 				}
-				if ( accesskey && tooltip ) {
+				$link.attr( 'title', tooltip );
+				if ( accesskey ) {
 					util.updateTooltipAccessKeys( $link );
 				}
+			}
 
-				// Where to put our node ?
-				// - nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
-				if ( nextnode && nextnode.parentNode === $ul[0] ) {
-					$(nextnode).before( $item );
-
-				// - nextnode is a CSS selector for jQuery
-				} else if ( typeof nextnode === 'string' && $ul.find( nextnode ).length !== 0 ) {
-					$ul.find( nextnode ).eq( 0 ).before( $item );
+			if ( accesskey ) {
+				$link.attr( 'accesskey', accesskey );
+			}
 
-				// If the jQuery selector isn't found within the <ul>,
-				// or if nextnode was invalid or not passed at all,
-				// then just append it at the end of the <ul> (this is the default behavior)
-				} else {
+			if ( nextnode ) {
+				if ( nextnode.nodeType || typeof nextnode === 'string' ) {
+					// nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
+					// or nextnode is a CSS selector for jQuery
+					nextnode = $ul.find( nextnode );
+				} else if ( !nextnode.jquery || ( nextnode.length && nextnode[0].parentNode !== $ul[0] ) ) {
+					// Fallback
 					$ul.append( $item );
+					return $item[0];
 				}
+				if ( nextnode.length === 1 ) {
+					// nextnode is a jQuery object that represents exactly one element
+					nextnode.before( $item );
+					return $item[0];
+				}
+			}
 
+			// Fallback (this is the default behavior)
+			$ul.append( $item );
+			return $item[0];
 
-				return $item[0];
-			}
 		},
 
 		/**
@@ -454,7 +473,7 @@
 		 *
 		 * @param {Mixed} message The DOM-element, jQuery object or HTML-string to be put inside the message box.
 		 * to allow CSS/JS to hide different boxes. null = no class used.
-		 * @deprecated Use mw#notify
+		 * @deprecated since 1.20 Use mw#notify
 		 */
 		jsMessage: function ( message ) {
 			if ( !arguments.length || message === '' || message === null ) {
@@ -593,6 +612,13 @@
 		}
 	};
 
+	/**
+	 * @method wikiGetlink
+	 * @inheritdoc #getUrl
+	 * @deprecated since 1.23 Use #getUrl instead.
+	 */
+	mw.log.deprecate( util, 'wikiGetlink', util.getUrl, 'Use mw.util.getUrl instead.' );
+
 	mw.util = util;
 
 }( mediaWiki, jQuery ) );
diff --git a/resources/startup.js b/resources/startup.js
index deff7e6e..b6a27d2d 100644
--- a/resources/startup.js
+++ b/resources/startup.js
@@ -10,23 +10,39 @@
  * This function will be deleted after it's used, so do not expand it to be
  * generally useful beyond startup.
  *
- * MediaWiki & jQuery compatibility:
- * - Internet Explorer 6.0+
- * - Firefox 10+
- * - Safari 5.0+
- * - Opera 11+
- * - Chrome
+ * See also:
+ * - https://www.mediawiki.org/wiki/Compatibility#Browser
+ * - http://jquerymobile.com/gbs/
+ * - http://jquery.com/browser-support/
  */
 
 /*jshint unused: false */
-function isCompatible() {
-	// IE < 6.0
-	if ( navigator.appVersion.indexOf( 'MSIE' ) !== -1
-		&& parseFloat( navigator.appVersion.split( 'MSIE' )[1] ) < 6 )
-	{
-		return false;
+function isCompatible( ua ) {
+	if ( ua === undefined ) {
+		ua = navigator.userAgent;
 	}
-	return true;
+
+	// MediaWiki JS or jQuery is known to have issues with:
+	return !(
+		// Internet Explorer < 6
+		( ua.indexOf( 'MSIE' ) !== -1 && parseFloat( ua.split( 'MSIE' )[1] ) < 6 ) ||
+		// Firefox < 3
+		( ua.indexOf( 'Firefox/' ) !== -1 && parseFloat( ua.split( 'Firefox/' )[1] ) < 3 ) ||
+		// BlackBerry < 6
+		ua.match( /BlackBerry[^\/]*\/[1-5]\./ ) ||
+		// Open WebOS < 1.5
+		ua.match( /webOS\/1\.[0-4]/ ) ||
+		// Anything PlayStation based.
+		ua.match( /PlayStation/i ) ||
+		// Any Symbian based browsers
+		ua.match( /SymbianOS|Series60/ ) ||
+		// Any NetFront based browser
+		ua.match( /NetFront/ ) ||
+		// Opera Mini, all versions
+		ua.match( /Opera Mini/ ) ||
+		// Nokia's Ovi Browser
+		ua.match( /S40OviBrowser/ )
+	);
 }
 
 /**
diff --git a/serialized/serialize.php b/serialized/serialize.php
index 09aec79e..766c1a51 100644
--- a/serialized/serialize.php
+++ b/serialized/serialize.php
@@ -24,7 +24,7 @@
 if ( !defined( 'MEDIAWIKI' ) ) {
 	$wgNoDBParam = true;
 	$optionsWithArgs = array( 'o' );
-	require_once( __DIR__ .'/../maintenance/commandLine.inc' );
+	require_once __DIR__ .'/../maintenance/commandLine.inc';
 
 	$stderr = fopen( 'php://stderr', 'w' );
 	if ( !isset( $args[0] ) ) {
@@ -65,7 +65,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 //----------------------------------------------------------------------------
 
 function getVars( $_gv_filename ) {
-	require( $_gv_filename );
+	require $_gv_filename;
 	$vars = get_defined_vars();
 	unset( $vars['_gv_filename'] );
 
diff --git a/skins/ArchLinux.php b/skins/ArchLinux.php
index d7a79616..b25d8cd8 100644
--- a/skins/ArchLinux.php
+++ b/skins/ArchLinux.php
@@ -22,8 +22,9 @@
  * @ingroup Skins
  */
 
-if( !defined( 'MEDIAWIKI' ) )
+if ( !defined( 'MEDIAWIKI' ) ) {
 	die( -1 );
+}
 
 /**
  * Inherit main code from SkinTemplate, set the CSS and template filter.
@@ -39,17 +40,10 @@ class SkinArchLinux extends SkinTemplate {
 	 * @param $out OutputPage
 	 */
 	function setupSkinUserCss( OutputPage $out ) {
-		global $wgHandheldStyle;
 		parent::setupSkinUserCss( $out );
 
 		$out->addModuleStyles( 'skins.archlinux' );
 
-		// Ugh. Can't do this properly because $wgHandheldStyle may be a URL
-		if( $wgHandheldStyle ) {
-			// Currently in testing... try 'chick/main.css'
-			$out->addStyle( $wgHandheldStyle, 'handheld' );
-		}
-
 		// TODO: Migrate all of these
 		$out->addStyle( 'archlinux/IE60Fixes.css', 'screen', 'IE 6' );
 		$out->addStyle( 'archlinux/IE70Fixes.css', 'screen', 'IE 7' );
@@ -105,39 +99,39 @@ class ArchLinuxTemplate extends BaseTemplate {
 <div id="globalWrapper">
 <div id="column-content"><div id="content" class="mw-body-primary" role="main">
 	<a id="top"></a>
-	<?php if($this->data['sitenotice']) { ?><div id="siteNotice"><?php $this->html('sitenotice') ?></div><?php } ?>
+	<?php if ( $this->data['sitenotice'] ) { ?><div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div><?php } ?>
 
 	<h1 id="firstHeading" class="firstHeading" lang="<?php
-		$this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
-		$this->html( 'pageLanguage' );
-	?>"><span dir="auto"><?php $this->html('title') ?></span></h1>
+		$this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+		$this->text( 'pageLanguage' );
+	?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
 	<div id="bodyContent" class="mw-body">
-		<div id="siteSub"><?php $this->msg('tagline') ?></div>
-		<div id="contentSub"<?php $this->html('userlangattributes') ?>><?php $this->html('subtitle') ?></div>
-<?php if($this->data['undelete']) { ?>
-		<div id="contentSub2"><?php $this->html('undelete') ?></div>
-<?php } ?><?php if($this->data['newtalk'] ) { ?>
-		<div class="usermessage"><?php $this->html('newtalk')  ?></div>
-<?php } ?><?php if($this->data['showjumplinks']) { ?>
-		<div id="jump-to-nav" class="mw-jump"><?php $this->msg('jumpto') ?> <a href="#column-one"><?php $this->msg('jumptonavigation') ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></div>
+		<div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+		<div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
+<?php if ( $this->data['undelete'] ) { ?>
+		<div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+<?php } ?><?php if ( $this->data['newtalk'] ) { ?>
+		<div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
 <?php } ?>
+		<div id="jump-to-nav" class="mw-jump"><?php $this->msg( 'jumpto' ) ?> <a href="#column-one"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div>
+
 		<!-- start content -->
-<?php $this->html('bodytext') ?>
-		<?php if($this->data['catlinks']) { $this->html('catlinks'); } ?>
+<?php $this->html( 'bodytext' ) ?>
+		<?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
 		<!-- end content -->
-		<?php if($this->data['dataAfterContent']) { $this->html ('dataAfterContent'); } ?>
+		<?php if ( $this->data['dataAfterContent'] ) { $this->html( 'dataAfterContent' ); } ?>
 		<div class="visualClear"></div>
 	</div>
 </div></div>
-<div id="column-one"<?php $this->html('userlangattributes')  ?>>
+<div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
 	<h2><?php $this->msg( 'navigation-heading' ) ?></h2>
 <?php $this->cactions(); ?>
 	<div class="portlet" id="p-personal" role="navigation">
-		<h3><?php $this->msg('personaltools') ?></h3>
+		<h3><?php $this->msg( 'personaltools' ) ?></h3>
 		<div class="pBody">
-			<ul<?php $this->html('userlangattributes') ?>>
-<?php		foreach($this->getPersonalTools() as $key => $item) { ?>
-				<?php echo $this->makeListItem($key, $item); ?>
+			<ul<?php $this->html( 'userlangattributes' ) ?>>
+<?php		foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+				<?php echo $this->makeListItem( $key, $item ); ?>
 
 <?php		} ?>
 			</ul>
@@ -148,7 +142,7 @@ class ArchLinuxTemplate extends BaseTemplate {
 			echo Html::element( 'a', array(
 				'href' => $this->data['nav_urls']['mainpage']['href'],
 				'style' => "background-image: url({$this->data['logopath']});" )
-				+ Linker::tooltipAndAccesskeyAttribs('p-logo') ); ?>
+				+ Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
 
 	</div>
 <?php
@@ -161,14 +155,14 @@ class ArchLinuxTemplate extends BaseTemplate {
 	$validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
 
 	if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) { ?>
-<div id="footer" role="contentinfo"<?php $this->html('userlangattributes') ?>>
+<div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
 <?php
 		$footerEnd = '</div>';
 	} else {
 		$footerEnd = '';
 	}
 	foreach ( $validFooterIcons as $blockName => $footerIcons ) { ?>
-	<div id="f-<?php echo htmlspecialchars($blockName); ?>ico">
+	<div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
 <?php foreach ( $footerIcons as $icon ) { ?>
 		<?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
 
@@ -180,8 +174,8 @@ class ArchLinuxTemplate extends BaseTemplate {
 		if ( count( $validFooterLinks ) > 0 ) {
 ?>	<ul id="f-list">
 <?php
-			foreach( $validFooterLinks as $aLink ) { ?>
-		<li id="<?php echo $aLink ?>"><?php $this->html($aLink) ?></li>
+			foreach ( $validFooterLinks as $aLink ) { ?>
+		<li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
 <?php
 			}
 ?>
@@ -204,13 +198,20 @@ echo $footerEnd;
 	 * @param $sidebar array
 	 */
 	protected function renderPortals( $sidebar ) {
-		if ( !isset( $sidebar['SEARCH'] ) ) $sidebar['SEARCH'] = true;
-		if ( !isset( $sidebar['TOOLBOX'] ) ) $sidebar['TOOLBOX'] = true;
-		if ( !isset( $sidebar['LANGUAGES'] ) ) $sidebar['LANGUAGES'] = true;
+		if ( !isset( $sidebar['SEARCH'] ) ) {
+			$sidebar['SEARCH'] = true;
+		}
+		if ( !isset( $sidebar['TOOLBOX'] ) ) {
+			$sidebar['TOOLBOX'] = true;
+		}
+		if ( !isset( $sidebar['LANGUAGES'] ) ) {
+			$sidebar['LANGUAGES'] = true;
+		}
 
-		foreach( $sidebar as $boxName => $content ) {
-			if ( $content === false )
+		foreach ( $sidebar as $boxName => $content ) {
+			if ( $content === false ) {
 				continue;
+			}
 
 			if ( $boxName == 'SEARCH' ) {
 				$this->searchBox();
@@ -228,19 +229,19 @@ echo $footerEnd;
 		global $wgUseTwoButtonsSearchForm;
 ?>
 	<div id="p-search" class="portlet" role="search">
-		<h3><label for="searchInput"><?php $this->msg('search') ?></label></h3>
+		<h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
 		<div id="searchBody" class="pBody">
-			<form action="<?php $this->text('wgScript') ?>" id="searchform">
-				<input type='hidden' name="title" value="<?php $this->text('searchtitle') ?>"/>
-				<?php echo $this->makeSearchInput(array( "id" => "searchInput" )); ?>
+			<form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+				<input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
+				<?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
 
-				<?php echo $this->makeSearchButton("go", array( "id" => "searchGoButton", "class" => "searchButton" ));
-				if ($wgUseTwoButtonsSearchForm): ?>&#160;
-				<?php echo $this->makeSearchButton("fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ));
-				else: ?>
+				<?php echo $this->makeSearchButton( "go", array( "id" => "searchGoButton", "class" => "searchButton" ) );
+				if ( $wgUseTwoButtonsSearchForm ) { ?>&#160;
+				<?php echo $this->makeSearchButton( "fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ) );
+				} else { ?>
 
-				<div><a href="<?php $this->text('searchaction') ?>" rel="search"><?php $this->msg('powersearch-legend') ?></a></div><?php
-				endif; ?>
+				<div><a href="<?php $this->text( 'searchaction' ) ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
+				} ?>
 
 			</form>
 		</div>
@@ -255,10 +256,10 @@ echo $footerEnd;
 	function cactions() {
 ?>
 	<div id="p-cactions" class="portlet" role="navigation">
-		<h3><?php $this->msg('views') ?></h3>
+		<h3><?php $this->msg( 'views' ) ?></h3>
 		<div class="pBody">
 			<ul><?php
-				foreach($this->data['content_actions'] as $key => $tab) {
+				foreach ( $this->data['content_actions'] as $key => $tab ) {
 					echo '
 				' . $this->makeListItem( $key, $tab );
 				} ?>
@@ -272,12 +273,12 @@ echo $footerEnd;
 	function toolbox() {
 ?>
 	<div class="portlet" id="p-tb" role="navigation">
-		<h3><?php $this->msg('toolbox') ?></h3>
+		<h3><?php $this->msg( 'toolbox' ) ?></h3>
 		<div class="pBody">
 			<ul>
 <?php
 		foreach ( $this->getToolbox() as $key => $tbitem ) { ?>
-				<?php echo $this->makeListItem($key, $tbitem); ?>
+				<?php echo $this->makeListItem( $key, $tbitem ); ?>
 
 <?php
 		}
@@ -292,14 +293,14 @@ echo $footerEnd;
 
 	/*************************************************************************************************/
 	function languageBox() {
-		if( $this->data['language_urls'] ) {
+		if ( $this->data['language_urls'] ) {
 ?>
 	<div id="p-lang" class="portlet" role="navigation">
-		<h3<?php $this->html('userlangattributes') ?>><?php $this->msg('otherlanguages') ?></h3>
+		<h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
 		<div class="pBody">
 			<ul>
-<?php		foreach($this->data['language_urls'] as $key => $langlink) { ?>
-				<?php echo $this->makeListItem($key, $langlink); ?>
+<?php		foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
+				<?php echo $this->makeListItem( $key, $langlink ); ?>
 
 <?php		} ?>
 			</ul>
@@ -321,14 +322,15 @@ echo $footerEnd;
 			$portletAttribs['title'] = $tooltip;
 		}
 		echo '	' . Html::openElement( 'div', $portletAttribs );
+		$msgObj = wfMessage( $bar );
 ?>
 
-		<h3><?php $msg = wfMessage( $bar ); echo htmlspecialchars( $msg->exists() ? $msg->text() : $bar ); ?></h3>
+		<h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3>
 		<div class='pBody'>
 <?php   if ( is_array( $cont ) ) { ?>
 			<ul>
-<?php 			foreach($cont as $key => $val) { ?>
-				<?php echo $this->makeListItem($key, $val); ?>
+<?php 			foreach ( $cont as $key => $val ) { ?>
+				<?php echo $this->makeListItem( $key, $val ); ?>
 
 <?php			} ?>
 			</ul>
diff --git a/skins/Chick.php b/skins/Chick.php
deleted file mode 100644
index 75b807ad..00000000
--- a/skins/Chick.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-/**
- * Chick: A lightweight Monobook skin with no sidebar, the sidebar links are
- * given at the bottom of the page instead, as in the unstyled MySkin.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) )
-	die( -1 );
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @ingroup Skins
- */
-class SkinChick extends SkinTemplate {
-	var $skinname = 'chick', $stylename = 'chick',
-	$template = 'MonoBookTemplate', $useHeadElement = true;
-
-	/**
-	 * @param $out OutputPage
-	 */
-	function setupSkinUserCss( OutputPage $out ) {
-		parent::setupSkinUserCss( $out );
-
-		$out->addModuleStyles( 'skins.chick' );
-
-		// TODO: Migrate all of these to RL
-		$out->addStyle( 'chick/IE60Fixes.css', 'screen,handheld', 'IE 6' );
-	}
-}
diff --git a/skins/CologneBlue.php b/skins/CologneBlue.php
index 21b07f7d..0370e05b 100644
--- a/skins/CologneBlue.php
+++ b/skins/CologneBlue.php
@@ -22,7 +22,7 @@
  * @ingroup Skins
  */
 
-if( !defined( 'MEDIAWIKI' ) ) {
+if ( !defined( 'MEDIAWIKI' ) ) {
 	die( -1 );
 }
 
@@ -39,7 +39,7 @@ class SkinCologneBlue extends SkinTemplate {
 	 * @param $out OutputPage
 	 */
 	function setupSkinUserCss( OutputPage $out ) {
-		$out->addModuleStyles( 'mediawiki.legacy.shared' );
+		parent::setupSkinUserCss( $out );
 		$out->addModuleStyles( 'mediawiki.legacy.oldshared' );
 		$out->addModuleStyles( 'skins.cologneblue' );
 	}
@@ -127,7 +127,7 @@ class CologneBlueTemplate extends BaseTemplate {
 	 *
 	 * @return string
 	 */
-	function processBottomLink( $key, $navlink, $message=null ) {
+	function processBottomLink( $key, $navlink, $message = null ) {
 		if ( !$navlink ) {
 			// Empty navlinks might be passed.
 			return null;
@@ -202,7 +202,7 @@ class CologneBlueTemplate extends BaseTemplate {
 		$companionTitle = $title->isTalkPage() ? $title->getSubjectPage() : $title->getTalkPage();
 		$companionNamespace = $companionTitle->getNamespace();
 
-		// TODO these messages appear to only be used by CologneBlue and legacy skins,
+		// TODO these messages are only be used by CologneBlue,
 		// kill and replace with something more sensibly named?
 		$nsToMessage = array(
 			NS_MAIN => 'articlepage',
@@ -234,7 +234,7 @@ class CologneBlueTemplate extends BaseTemplate {
 
 		// Use the regular navigational link, but replace its text. Everything else stays unmodified.
 		$namespacesLinks = $this->data['content_navigation']['namespaces'];
-		return $this->processBottomLink( $message,  $namespacesLinks[$key], $message );
+		return $this->processBottomLink( $message, $namespacesLinks[$key], $message );
 	}
 
 	/**
@@ -246,7 +246,7 @@ class CologneBlueTemplate extends BaseTemplate {
 	 * @param $navlink array Navigational link generated by SkinTemplate
 	 * @param $idPrefix mixed Prefix to add to id of this navlink. If false, id is removed entirely. Default is 'cb-'.
 	 */
-	function processNavlinkForDocument( $navlink, $idPrefix='cb-' ) {
+	function processNavlinkForDocument( $navlink, $idPrefix = 'cb-' ) {
 		if ( $navlink['id'] ) {
 			$navlink['single-id'] = $navlink['id']; // to allow for tooltip generation
 			$navlink['tooltiponly'] = true; // but no accesskeys
@@ -255,7 +255,7 @@ class CologneBlueTemplate extends BaseTemplate {
 			if ( $idPrefix === false ) {
 				unset( $navlink['id'] );
 			} else {
-				$navlink['id'] =  $idPrefix . $navlink['id'];
+				$navlink['id'] = $idPrefix . $navlink['id'];
 			}
 		}
 
@@ -290,8 +290,8 @@ class CologneBlueTemplate extends BaseTemplate {
 		<div id="siteNotice"><?php echo $this->getSkin()->getSiteNotice() ?></div>
 		<?php } ?>
 		<h1 id="firstHeading" lang="<?php
-			$this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
-			$this->html( 'pageLanguage' );
+			$this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+			$this->text( 'pageLanguage' );
 		?>"><span dir="auto"><?php echo $this->data['title'] ?></span></h1>
 		<?php if ( $this->translator->translate( 'tagline' ) ) { ?>
 		<p class="tagline"><?php echo htmlspecialchars( $this->translator->translate( 'tagline' ) ) ?></p>
@@ -316,7 +316,8 @@ class CologneBlueTemplate extends BaseTemplate {
 		ob_start();
 ?>
 	</div>
-	<div id="footer" role="contentinfo">
+	<div id="footer">
+		<div id="footer-navigation" role="navigation">
 <?php
 		// Page-related links
 		echo $this->bottomLinks();
@@ -328,8 +329,10 @@ class CologneBlueTemplate extends BaseTemplate {
 			$this->getSkin()->aboutLink(),
 			$this->searchForm( 'footer' )
 		) );
-		echo "\n<br />";
-
+?>
+		</div>
+		<div id="footer-info" role="contentinfo">
+<?php
 		// Standard footer info
 		$footlinks = $this->getFooterLinks();
 		if ( $footlinks['info'] ) {
@@ -338,6 +341,7 @@ class CologneBlueTemplate extends BaseTemplate {
 			}
 		}
 ?>
+		</div>
 	</div>
 </div>
 <div id="mw-navigation">
@@ -376,7 +380,7 @@ class CologneBlueTemplate extends BaseTemplate {
 		);
 
 		$personalUrls = $this->getPersonalTools();
-		foreach ( array ( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
+		foreach ( array( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
 			if ( $personalUrls[$key] ) {
 				$s[] = $this->makeListItem( $key, $personalUrls[$key], array( 'tag' => 'span' ) );
 			}
@@ -417,7 +421,7 @@ class CologneBlueTemplate extends BaseTemplate {
 
 		// Personal tools ("My pages")
 		$qbmyoptions = $this->getPersonalTools();
-		foreach ( array ( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
+		foreach ( array( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
 			$qbmyoptions[$key] = null;
 		}
 
@@ -532,18 +536,17 @@ class CologneBlueTemplate extends BaseTemplate {
 
 		$search = $this->getSkin()->getRequest()->getText( 'search' );
 		$action = $this->data['searchaction'];
-		$s = "<form id=\"searchform-" . htmlspecialchars($which) . "\" method=\"get\" class=\"inline\" action=\"$action\">";
-		if( $which == 'footer' ) {
+		$s = "<form id=\"searchform-" . htmlspecialchars( $which ) . "\" method=\"get\" class=\"inline\" action=\"$action\">";
+		if ( $which == 'footer' ) {
 			$s .= wfMessage( 'qbfind' )->text() . ": ";
 		}
 
-		$s .= "<input type='text' class=\"mw-searchInput\" name=\"search\" size=\"14\" value=\""
-			. htmlspecialchars( substr( $search, 0, 256 ) ) . "\" />"
-			. ($which == 'footer' ? " " : "<br />")
-			. "<input type='submit' class=\"searchButton\" name=\"go\" value=\"" . wfMessage( 'searcharticle' )->escaped() . "\" />";
+		$s .= $this->makeSearchInput( array( 'class' => 'mw-searchInput', 'type' => 'text', 'size' => '14' ) );
+		$s .= ( $which == 'footer' ? " " : "<br />" );
+		$s .= $this->makeSearchButton( 'go', array( 'class' => 'searchButton' ) );
 
-		if( $wgUseTwoButtonsSearchForm ) {
-			$s .= " <input type='submit' class=\"searchButton\" name=\"fulltext\" value=\"" . wfMessage( 'searchbutton' )->escaped() . "\" />\n";
+		if ( $wgUseTwoButtonsSearchForm ) {
+			$s .= $this->makeSearchButton( 'fulltext', array( 'class' => 'searchButton' ) );
 		} else {
 			$s .= '<div><a href="' . $action . '" rel="search">' . wfMessage( 'powersearch-legend' )->escaped() . "</a></div>\n";
 		}
diff --git a/skins/Modern.php b/skins/Modern.php
index 9dbefb11..8d778cf6 100644
--- a/skins/Modern.php
+++ b/skins/Modern.php
@@ -22,8 +22,9 @@
  * @ingroup Skins
  */
 
-if( !defined( 'MEDIAWIKI' ) )
+if ( !defined( 'MEDIAWIKI' ) ) {
 	die( -1 );
+}
 
 /**
  * Inherit main code from SkinTemplate, set the CSS and template filter.
@@ -39,7 +40,7 @@ class SkinModern extends SkinTemplate {
 	 */
 	function setupSkinUserCss( OutputPage $out ) {
 		parent::setupSkinUserCss( $out );
-		$out->addModuleStyles ('skins.modern');
+		$out->addModuleStyles( 'skins.modern' );
 	}
 }
 
@@ -66,9 +67,9 @@ class ModernTemplate extends MonoBookTemplate {
 
 	<!-- heading -->
 	<div id="mw_header"><h1 id="firstHeading" lang="<?php
-		$this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
-		$this->html( 'pageLanguage' );
-	?>"><span dir="auto"><?php $this->html('title') ?></span></h1></div>
+		$this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+		$this->text( 'pageLanguage' );
+	?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1></div>
 
 	<div id="mw_main">
 	<div id="mw_contentwrapper">
@@ -82,30 +83,30 @@ class ModernTemplate extends MonoBookTemplate {
 	     for the margins -->
 	<div id="mw_contentholder" class="mw-body">
 		<div class='mw-topboxes'>
-			<div id="mw-js-message" style="display:none;"<?php $this->html('userlangattributes')?>></div>
-			<div class="mw-topbox" id="siteSub"><?php $this->msg('tagline') ?></div>
-			<?php if($this->data['newtalk'] ) {
-				?><div class="usermessage mw-topbox"><?php $this->html('newtalk')  ?></div>
+			<div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
+			<div class="mw-topbox" id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+			<?php if ( $this->data['newtalk'] ) {
+				?><div class="usermessage mw-topbox"><?php $this->html( 'newtalk' ) ?></div>
 			<?php } ?>
-			<?php if($this->data['sitenotice']) {
-				?><div class="mw-topbox" id="siteNotice"><?php $this->html('sitenotice') ?></div>
+			<?php if ( $this->data['sitenotice'] ) {
+				?><div class="mw-topbox" id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
 			<?php } ?>
 		</div>
 
-		<div id="contentSub"<?php $this->html('userlangattributes') ?>><?php $this->html('subtitle') ?></div>
+		<div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
 
-		<?php if($this->data['undelete']) { ?><div id="contentSub2"><?php     $this->html('undelete') ?></div><?php } ?>
-		<?php if($this->data['showjumplinks']) { ?><div id="jump-to-nav"><?php $this->msg('jumpto') ?> <a href="#mw_portlets"><?php $this->msg('jumptonavigation') ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></div><?php } ?>
+		<?php if ( $this->data['undelete'] ) { ?><div id="contentSub2"><?php $this->html( 'undelete' ) ?></div><?php } ?>
+		<div id="jump-to-nav"><?php $this->msg( 'jumpto' ) ?> <a href="#mw_portlets"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div>
 
-		<?php $this->html('bodytext') ?>
+		<?php $this->html( 'bodytext' ) ?>
 		<div class='mw_clear'></div>
-		<?php if($this->data['catlinks']) { $this->html('catlinks'); } ?>
-		<?php $this->html ('dataAfterContent') ?>
+		<?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
+		<?php $this->html( 'dataAfterContent' ) ?>
 	</div><!-- mw_contentholder -->
 	</div><!-- mw_content -->
 	</div><!-- mw_contentwrapper -->
 
-	<div id="mw_portlets"<?php $this->html("userlangattributes") ?>>
+	<div id="mw_portlets"<?php $this->html( "userlangattributes" ) ?>>
 	<h2><?php $this->msg( 'navigation-heading' ) ?></h2>
 
 	<!-- portlets -->
@@ -120,11 +121,11 @@ class ModernTemplate extends MonoBookTemplate {
 
 	<!-- personal portlet -->
 	<div class="portlet" id="p-personal" role="navigation">
-		<h3><?php $this->msg('personaltools') ?></h3>
+		<h3><?php $this->msg( 'personaltools' ) ?></h3>
 		<div class="pBody">
 			<ul>
-<?php		foreach($this->getPersonalTools() as $key => $item) { ?>
-				<?php echo $this->makeListItem($key, $item); ?>
+<?php		foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+				<?php echo $this->makeListItem( $key, $item ); ?>
 
 <?php		} ?>
 			</ul>
@@ -133,19 +134,19 @@ class ModernTemplate extends MonoBookTemplate {
 
 
 	<!-- footer -->
-	<div id="footer" role="contentinfo"<?php $this->html('userlangattributes') ?>>
+	<div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
 			<ul id="f-list">
 <?php
-		foreach( $this->getFooterLinks("flat") as $aLink ) {
-			if( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
-?>				<li id="<?php echo$aLink?>"><?php $this->html($aLink) ?></li>
+		foreach ( $this->getFooterLinks( "flat" ) as $aLink ) {
+			if ( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
+?>				<li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
 <?php 		}
 		}
 ?>
 			</ul>
 <?php
-		foreach ( $this->getFooterIcons("nocopyright") as $blockName => $footerIcons ) { ?>
-			<div id="mw_<?php echo htmlspecialchars($blockName); ?>">
+		foreach ( $this->getFooterIcons( "nocopyright" ) as $blockName => $footerIcons ) { ?>
+			<div id="mw_<?php echo htmlspecialchars( $blockName ); ?>">
 <?php
 			foreach ( $footerIcons as $icon ) { ?>
 				<?php echo $this->getSkin()->makeFooterIcon( $icon, 'withoutImage' ); ?>
diff --git a/skins/MonoBook.php b/skins/MonoBook.php
index f03d31b8..6d66cac3 100644
--- a/skins/MonoBook.php
+++ b/skins/MonoBook.php
@@ -25,8 +25,9 @@
  * @ingroup Skins
  */
 
-if( !defined( 'MEDIAWIKI' ) )
+if ( !defined( 'MEDIAWIKI' ) ) {
 	die( -1 );
+}
 
 /**
  * Inherit main code from SkinTemplate, set the CSS and template filter.
@@ -42,17 +43,10 @@ class SkinMonoBook extends SkinTemplate {
 	 * @param $out OutputPage
 	 */
 	function setupSkinUserCss( OutputPage $out ) {
-		global $wgHandheldStyle;
 		parent::setupSkinUserCss( $out );
 
 		$out->addModuleStyles( 'skins.monobook' );
 
-		// Ugh. Can't do this properly because $wgHandheldStyle may be a URL
-		if( $wgHandheldStyle ) {
-			// Currently in testing... try 'chick/main.css'
-			$out->addStyle( $wgHandheldStyle, 'handheld' );
-		}
-
 		// TODO: Migrate all of these
 		$out->addStyle( 'monobook/IE60Fixes.css', 'screen', 'IE 6' );
 		$out->addStyle( 'monobook/IE70Fixes.css', 'screen', 'IE 7' );
@@ -82,39 +76,39 @@ class MonoBookTemplate extends BaseTemplate {
 ?><div id="globalWrapper">
 <div id="column-content"><div id="content" class="mw-body-primary" role="main">
 	<a id="top"></a>
-	<?php if($this->data['sitenotice']) { ?><div id="siteNotice"><?php $this->html('sitenotice') ?></div><?php } ?>
+	<?php if ( $this->data['sitenotice'] ) { ?><div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div><?php } ?>
 
 	<h1 id="firstHeading" class="firstHeading" lang="<?php
-		$this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
-		$this->html( 'pageLanguage' );
-	?>"><span dir="auto"><?php $this->html('title') ?></span></h1>
+		$this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+		$this->text( 'pageLanguage' );
+	?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
 	<div id="bodyContent" class="mw-body">
-		<div id="siteSub"><?php $this->msg('tagline') ?></div>
-		<div id="contentSub"<?php $this->html('userlangattributes') ?>><?php $this->html('subtitle') ?></div>
-<?php if($this->data['undelete']) { ?>
-		<div id="contentSub2"><?php $this->html('undelete') ?></div>
-<?php } ?><?php if($this->data['newtalk'] ) { ?>
-		<div class="usermessage"><?php $this->html('newtalk')  ?></div>
-<?php } ?><?php if($this->data['showjumplinks']) { ?>
-		<div id="jump-to-nav" class="mw-jump"><?php $this->msg('jumpto') ?> <a href="#column-one"><?php $this->msg('jumptonavigation') ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></div>
+		<div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+		<div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
+<?php if ( $this->data['undelete'] ) { ?>
+		<div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+<?php } ?><?php if ( $this->data['newtalk'] ) { ?>
+		<div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
 <?php } ?>
+		<div id="jump-to-nav" class="mw-jump"><?php $this->msg( 'jumpto' ) ?> <a href="#column-one"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div>
+
 		<!-- start content -->
-<?php $this->html('bodytext') ?>
-		<?php if($this->data['catlinks']) { $this->html('catlinks'); } ?>
+<?php $this->html( 'bodytext' ) ?>
+		<?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
 		<!-- end content -->
-		<?php if($this->data['dataAfterContent']) { $this->html ('dataAfterContent'); } ?>
+		<?php if ( $this->data['dataAfterContent'] ) { $this->html( 'dataAfterContent' ); } ?>
 		<div class="visualClear"></div>
 	</div>
 </div></div>
-<div id="column-one"<?php $this->html('userlangattributes')  ?>>
+<div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
 	<h2><?php $this->msg( 'navigation-heading' ) ?></h2>
 <?php $this->cactions(); ?>
 	<div class="portlet" id="p-personal" role="navigation">
-		<h3><?php $this->msg('personaltools') ?></h3>
+		<h3><?php $this->msg( 'personaltools' ) ?></h3>
 		<div class="pBody">
-			<ul<?php $this->html('userlangattributes') ?>>
-<?php		foreach($this->getPersonalTools() as $key => $item) { ?>
-				<?php echo $this->makeListItem($key, $item); ?>
+			<ul<?php $this->html( 'userlangattributes' ) ?>>
+<?php		foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+				<?php echo $this->makeListItem( $key, $item ); ?>
 
 <?php		} ?>
 			</ul>
@@ -125,7 +119,7 @@ class MonoBookTemplate extends BaseTemplate {
 			echo Html::element( 'a', array(
 				'href' => $this->data['nav_urls']['mainpage']['href'],
 				'style' => "background-image: url({$this->data['logopath']});" )
-				+ Linker::tooltipAndAccesskeyAttribs('p-logo') ); ?>
+				+ Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
 
 	</div>
 <?php
@@ -138,14 +132,14 @@ class MonoBookTemplate extends BaseTemplate {
 	$validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
 
 	if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) { ?>
-<div id="footer" role="contentinfo"<?php $this->html('userlangattributes') ?>>
+<div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
 <?php
 		$footerEnd = '</div>';
 	} else {
 		$footerEnd = '';
 	}
 	foreach ( $validFooterIcons as $blockName => $footerIcons ) { ?>
-	<div id="f-<?php echo htmlspecialchars($blockName); ?>ico">
+	<div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
 <?php foreach ( $footerIcons as $icon ) { ?>
 		<?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
 
@@ -157,8 +151,8 @@ class MonoBookTemplate extends BaseTemplate {
 		if ( count( $validFooterLinks ) > 0 ) {
 ?>	<ul id="f-list">
 <?php
-			foreach( $validFooterLinks as $aLink ) { ?>
-		<li id="<?php echo $aLink ?>"><?php $this->html($aLink) ?></li>
+			foreach ( $validFooterLinks as $aLink ) { ?>
+		<li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
 <?php
 			}
 ?>
@@ -181,13 +175,20 @@ echo $footerEnd;
 	 * @param $sidebar array
 	 */
 	protected function renderPortals( $sidebar ) {
-		if ( !isset( $sidebar['SEARCH'] ) ) $sidebar['SEARCH'] = true;
-		if ( !isset( $sidebar['TOOLBOX'] ) ) $sidebar['TOOLBOX'] = true;
-		if ( !isset( $sidebar['LANGUAGES'] ) ) $sidebar['LANGUAGES'] = true;
+		if ( !isset( $sidebar['SEARCH'] ) ) {
+			$sidebar['SEARCH'] = true;
+		}
+		if ( !isset( $sidebar['TOOLBOX'] ) ) {
+			$sidebar['TOOLBOX'] = true;
+		}
+		if ( !isset( $sidebar['LANGUAGES'] ) ) {
+			$sidebar['LANGUAGES'] = true;
+		}
 
-		foreach( $sidebar as $boxName => $content ) {
-			if ( $content === false )
+		foreach ( $sidebar as $boxName => $content ) {
+			if ( $content === false ) {
 				continue;
+			}
 
 			if ( $boxName == 'SEARCH' ) {
 				$this->searchBox();
@@ -205,19 +206,19 @@ echo $footerEnd;
 		global $wgUseTwoButtonsSearchForm;
 ?>
 	<div id="p-search" class="portlet" role="search">
-		<h3><label for="searchInput"><?php $this->msg('search') ?></label></h3>
+		<h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
 		<div id="searchBody" class="pBody">
-			<form action="<?php $this->text('wgScript') ?>" id="searchform">
-				<input type='hidden' name="title" value="<?php $this->text('searchtitle') ?>"/>
-				<?php echo $this->makeSearchInput(array( "id" => "searchInput" )); ?>
+			<form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+				<input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
+				<?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
 
-				<?php echo $this->makeSearchButton("go", array( "id" => "searchGoButton", "class" => "searchButton" ));
-				if ($wgUseTwoButtonsSearchForm): ?>&#160;
-				<?php echo $this->makeSearchButton("fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ));
-				else: ?>
+				<?php echo $this->makeSearchButton( "go", array( "id" => "searchGoButton", "class" => "searchButton" ) );
+				if ( $wgUseTwoButtonsSearchForm ) { ?>&#160;
+				<?php echo $this->makeSearchButton( "fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ) );
+				} else { ?>
 
-				<div><a href="<?php $this->text('searchaction') ?>" rel="search"><?php $this->msg('powersearch-legend') ?></a></div><?php
-				endif; ?>
+				<div><a href="<?php $this->text( 'searchaction' ) ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
+				} ?>
 
 			</form>
 		</div>
@@ -232,10 +233,10 @@ echo $footerEnd;
 	function cactions() {
 ?>
 	<div id="p-cactions" class="portlet" role="navigation">
-		<h3><?php $this->msg('views') ?></h3>
+		<h3><?php $this->msg( 'views' ) ?></h3>
 		<div class="pBody">
 			<ul><?php
-				foreach($this->data['content_actions'] as $key => $tab) {
+				foreach ( $this->data['content_actions'] as $key => $tab ) {
 					echo '
 				' . $this->makeListItem( $key, $tab );
 				} ?>
@@ -249,12 +250,12 @@ echo $footerEnd;
 	function toolbox() {
 ?>
 	<div class="portlet" id="p-tb" role="navigation">
-		<h3><?php $this->msg('toolbox') ?></h3>
+		<h3><?php $this->msg( 'toolbox' ) ?></h3>
 		<div class="pBody">
 			<ul>
 <?php
 		foreach ( $this->getToolbox() as $key => $tbitem ) { ?>
-				<?php echo $this->makeListItem($key, $tbitem); ?>
+				<?php echo $this->makeListItem( $key, $tbitem ); ?>
 
 <?php
 		}
@@ -269,14 +270,14 @@ echo $footerEnd;
 
 	/*************************************************************************************************/
 	function languageBox() {
-		if( $this->data['language_urls'] ) {
+		if ( $this->data['language_urls'] ) {
 ?>
 	<div id="p-lang" class="portlet" role="navigation">
-		<h3<?php $this->html('userlangattributes') ?>><?php $this->msg('otherlanguages') ?></h3>
+		<h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
 		<div class="pBody">
 			<ul>
-<?php		foreach($this->data['language_urls'] as $key => $langlink) { ?>
-				<?php echo $this->makeListItem($key, $langlink); ?>
+<?php		foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
+				<?php echo $this->makeListItem( $key, $langlink ); ?>
 
 <?php		} ?>
 			</ul>
@@ -298,14 +299,15 @@ echo $footerEnd;
 			$portletAttribs['title'] = $tooltip;
 		}
 		echo '	' . Html::openElement( 'div', $portletAttribs );
+		$msgObj = wfMessage( $bar );
 ?>
 
-		<h3><?php $msg = wfMessage( $bar ); echo htmlspecialchars( $msg->exists() ? $msg->text() : $bar ); ?></h3>
+		<h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3>
 		<div class='pBody'>
 <?php   if ( is_array( $cont ) ) { ?>
 			<ul>
-<?php 			foreach($cont as $key => $val) { ?>
-				<?php echo $this->makeListItem($key, $val); ?>
+<?php 			foreach ( $cont as $key => $val ) { ?>
+				<?php echo $this->makeListItem( $key, $val ); ?>
 
 <?php			} ?>
 			</ul>
diff --git a/skins/MySkin.php b/skins/MySkin.php
deleted file mode 100644
index fb49b88d..00000000
--- a/skins/MySkin.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * MySkin: Monobook without the CSS. The idea is that you
- * customise it using user or site CSS.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) )
-	die( -1 );
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @ingroup Skins
- */
-class SkinMySkin extends SkinTemplate {
-	var $skinname = 'myskin', $stylename = 'myskin',
-		$template = 'MonoBookTemplate', $useHeadElement = true;
-}
diff --git a/skins/Nostalgia.php b/skins/Nostalgia.php
deleted file mode 100644
index 3028915e..00000000
--- a/skins/Nostalgia.php
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-/**
- * Nostalgia: A skin which looks like Wikipedia did in its first year (2001).
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) ) {
-	die( -1 );
-}
-
-/**
- * @todo document
- * @ingroup Skins
- */
-class SkinNostalgia extends SkinLegacy {
-	var $skinname = 'nostalgia', $stylename = 'nostalgia',
-		$template = 'NostalgiaTemplate';
-
-	/**
-	 * @param $out OutputPage
-	 */
-	function setupSkinUserCss( OutputPage $out ) {
-		parent::setupSkinUserCss( $out );
-		$out->addModuleStyles( 'skins.nostalgia' );
-	}
-
-}
-
-class NostalgiaTemplate extends LegacyTemplate {
-
-	/**
-	 * @return string
-	 */
-	function doBeforeContent() {
-		$s = "\n<div id='content'>\n<div id='top'>\n";
-		$s .= '<div id="logo">' . $this->getSkin()->logoText( 'right' ) . '</div>';
-
-		$s .= $this->pageTitle();
-		$s .= $this->pageSubtitle() . "\n";
-
-		$s .= '<div id="topbar">';
-		$s .= $this->topLinks() . "\n<br />";
-
-		$notice = $this->getSkin()->getSiteNotice();
-		if( $notice ) {
-			$s .= "\n<div id='siteNotice'>$notice</div>\n";
-		}
-		$s .= $this->pageTitleLinks();
-
-		$ol = $this->otherLanguages();
-		if( $ol ) {
-			$s .= '<br />' . $ol;
-		}
-
-		$s .= $this->getSkin()->getCategories();
-
-		$s .= "<br clear='all' /></div><hr />\n</div>\n";
-		$s .= "\n<div id='article'>";
-
-		return $s;
-	}
-
-	/**
-	 * @return string
-	 */
-	function topLinks() {
-		$sep = " |\n";
-
-		$s = $this->getSkin()->mainPageLink() . $sep
-		  . Linker::specialLink( 'Recentchanges' );
-
-		if ( $this->data['isarticle'] ) {
-			$s .= $sep . '<strong>' . $this->editThisPage() . '</strong>' . $sep . $this->talkLink() .
-					$sep . $this->historyLink();
-		}
-
-		/* show links to different language variants */
-		$s .= $this->variantLinks();
-		$s .= $this->extensionTabLinks();
-		if ( !$this->data['loggedin'] ) {
-			$s .= $sep . Linker::specialLink( 'Userlogin' );
-		} else {
-			/* show user page and user talk links */
-			$user = $this->getSkin()->getUser();
-			$s .= $sep . Linker::link( $user->getUserPage(), wfMessage( 'mypage' )->escaped() );
-			$s .= $sep . Linker::link( $user->getTalkPage(), wfMessage( 'mytalk' )->escaped() );
-			if ( $user->getNewtalk() ) {
-				$s .= ' *';
-			}
-			/* show watchlist link */
-			$s .= $sep . Linker::specialLink( 'Watchlist' );
-			/* show my contributions link */
-			$s .= $sep . Linker::link(
-				SpecialPage::getSafeTitleFor( 'Contributions', $this->data['username'] ),
-				wfMessage( 'mycontris' )->escaped() );
-			/* show my preferences link */
-			$s .= $sep . Linker::specialLink( 'Preferences' );
-			/* show upload file link */
-			if( UploadBase::isEnabled() && UploadBase::isAllowed( $user ) === true ) {
-				$s .= $sep . $this->getUploadLink();
-			}
-
-			/* show log out link */
-			$s .= $sep . Linker::specialLink( 'Userlogout' );
-		}
-
-		$s .= $sep . $this->specialPagesList();
-
-		return $s;
-	}
-
-	/**
-	 * @return string
-	 */
-	function doAfterContent() {
-		$s = "\n</div><br clear='all' />\n";
-
-		$s .= "\n<div id='footer'><hr />";
-
-		$s .= $this->bottomLinks();
-		$s .= "\n<br />" . $this->pageStats();
-		$s .= "\n<br />" . $this->getSkin()->mainPageLink()
-				. ' | ' . $this->getSkin()->aboutLink()
-				. ' | ' . $this->searchForm();
-
-		$s .= "\n</div>\n</div>\n";
-
-		return $s;
-	}
-}
diff --git a/skins/Simple.php b/skins/Simple.php
deleted file mode 100644
index 9a3ab946..00000000
--- a/skins/Simple.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * Simple: A lightweight skin with a simple white-background sidebar and no
- * top bar.
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) )
-	die( -1 );
-
-/** */
-require_once( __DIR__ . '/MonoBook.php' );
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @ingroup Skins
- */
-class SkinSimple extends SkinTemplate {
-	var $skinname = 'simple', $stylename = 'simple',
-		$template = 'MonoBookTemplate', $useHeadElement = true;
-
-	/**
-	 * @param $out OutputPage
-	 */
-	function setupSkinUserCss( OutputPage $out ) {
-		parent::setupSkinUserCss( $out );
-
-		$out->addModuleStyles( 'skins.simple' );
-
-		/* Add some userprefs specific CSS styling */
-		$rules = array();
-		$underline = "";
-
-		if ( $this->getUser()->getOption( 'underline' ) < 2 ) {
-			$underline = "text-decoration: " . $this->getUser()->getOption( 'underline' ) ? 'underline !important' : 'none' . ";";
-		}
-		$style = implode( "\n", $rules );
-		$out->addInlineStyle( $style, 'flip' );
-
-	}
-}
diff --git a/skins/Standard.php b/skins/Standard.php
deleted file mode 100644
index 5b358e06..00000000
--- a/skins/Standard.php
+++ /dev/null
@@ -1,294 +0,0 @@
-<?php
-/**
- * Standard (a.k.a. Classic) skin: old MediaWiki default skin
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- *
- * @file
- * @ingroup Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) ) {
-	die( -1 );
-}
-
-/**
- * @todo document
- * @ingroup Skins
- */
-class SkinStandard extends SkinLegacy {
-	var $skinname = 'standard', $stylename = 'standard',
-		$template = 'StandardTemplate';
-
-	/**
-	 * @param $out OutputPage
-	 */
-	function setupSkinUserCss( OutputPage $out ) {
-		parent::setupSkinUserCss( $out );
-		$out->addModuleStyles( 'skins.standard' );
-
-		$qb = $this->qbSetting();
-		$rules = array();
-
-		if ( 2 == $qb ) { # Right
-			$rules[] = "/* @noflip */#quickbar { position: absolute; top: 4px; right: 4px; border-left: 2px solid #000000; }";
-			$rules[] = "/* @noflip */#article, #mw-data-after-content { margin-left: 4px; margin-right: 152px; }";
-			$rules[] = "/* @noflip */#topbar, #footer { margin-right: 152px; }";
-		} elseif ( 1 == $qb || 3 == $qb ) {
-			$rules[] = "/* @noflip */#quickbar { position: absolute; top: 4px; left: 4px; border-right: 1px solid gray; }";
-			$rules[] = "/* @noflip */#article, #mw-data-after-content { margin-left: 152px; margin-right: 4px; }";
-			$rules[] = "/* @noflip */#topbar, #footer { margin-left: 152px; }";
-			if( 3 == $qb ) {
-				$rules[] = "/* @noflip */#quickbar { position: fixed; padding: 4px; }";
-			}
-		} elseif ( 4 == $qb ) {
-			$rules[] = "/* @noflip */#quickbar { position: fixed; right: 0; top: 0; padding: 4px; }";
-			$rules[] = "/* @noflip */#quickbar { border-right: 1px solid gray; }";
-			$rules[] = "/* @noflip */#article, #mw-data-after-content { margin-right: 152px; margin-left: 4px; }";
-			$rules[] = "/* @noflip */#topbar, #footer { margin-right: 152px; }";
-		}
-		$style = implode( "\n", $rules );
-		$out->addInlineStyle( $style, 'flip' );
-	}
-
-}
-
-class StandardTemplate extends LegacyTemplate {
-
-	/**
-	 * @return string
-	 */
-	function doAfterContent() {
-		wfProfileIn( __METHOD__ );
-		wfProfileIn( __METHOD__ . '-1' );
-
-		$s = "\n</div><br style=\"clear:both\" />\n";
-		$s .= "\n<div id='footer'>";
-		$s .= '<table cellspacing="0"><tr>';
-
-		wfProfileOut( __METHOD__ . '-1' );
-		wfProfileIn( __METHOD__ . '-2' );
-		$l = $this->getSkin()->getLanguage()->alignStart();
-		$s .= "<td class='bottom' style='text-align: $l; vertical-align: top;'>";
-
-		$s .= $this->bottomLinks();
-		$s .= "\n<br />" . $this->getSkin()->getLanguage()->pipeList( array(
-			$this->getSkin()->mainPageLink(),
-			$this->getSkin()->aboutLink(),
-			Linker::specialLink( 'Recentchanges' ),
-			$this->searchForm() ) )
-			. '<br /><span id="pagestats">' . $this->pageStats() . '</span>';
-
-		$s .= '</td>';
-		$s .= "</tr></table>\n</div>\n</div>\n";
-
-		wfProfileOut( __METHOD__ . '-2' );
-		wfProfileIn( __METHOD__ . '-3' );
-		if ( $this->getSkin()->qbSetting() != 0 ) {
-			$s .= $this->quickBar();
-		}
-		wfProfileOut( __METHOD__ . '-3' );
-		wfProfileOut( __METHOD__ );
-		return $s;
-	}
-
-	/**
-	 * @return string
-	 */
-	function quickBar() {
-		global $wgContLang;
-
-		wfProfileIn( __METHOD__ );
-
-		$action = $this->getSkin()->getRequest()->getText( 'action' );
-		$wpPreview = $this->getSkin()->getRequest()->getBool( 'wpPreview' );
-		$title = $this->getSkin()->getTitle();
-		$tns = $title->getNamespace();
-
-		$s = "\n<div id='quickbar'>";
-		$s .= "\n" . $this->getSkin()->logoText() . "\n<hr class='sep' />";
-
-		$sep = "\n<br />";
-
-		# Use the first heading from the Monobook sidebar as the "browse" section
-		$bar = $this->getSkin()->buildSidebar();
-		unset( $bar['SEARCH'] );
-		unset( $bar['LANGUAGES'] );
-		unset( $bar['TOOLBOX'] );
-
-		$barnumber = 1;
-		foreach ( $bar as $browseLinks ) {
-			if ( is_array( $browseLinks ) ) {
-				if ( $barnumber > 1 ) {
-					$s .= "\n<hr class='sep' />";
-				}
-				foreach ( $browseLinks as $link ) {
-					if ( $link['text'] != '-' ) {
-						$s .= "<a href=\"{$link['href']}\">" .
-							htmlspecialchars( $link['text'] ) . '</a>' . $sep;
-					}
-				}
-			}
-			if ( $barnumber == 1 ) {
-				// only show watchlist link if logged in
-				if( $this->data['loggedin'] ) {
-					$s.= Linker::specialLink( 'Watchlist' ) ;
-					$s .= $sep . Linker::linkKnown(
-						SpecialPage::getTitleFor( 'Contributions' ),
-						wfMessage( 'mycontris' )->escaped(),
-						array(),
-						array( 'target' => $this->data['username'] )
-					);
-				}
-			}
-			$barnumber = $barnumber + 1;
-		}
-
-		$s .= "\n<hr class='sep' />";
-		$articleExists = $title->getArticleID();
-		if ( $this->data['isarticle'] || $action == 'edit' || $action == 'history' || $wpPreview ) {
-			if( $this->data['isarticle'] ) {
-				$s .= '<strong>' . $this->editThisPage() . '</strong>';
-			} else { # backlink to the article in edit or history mode
-				if( $articleExists ){ # no backlink if no article
-					switch( $tns ) {
-						case NS_TALK:
-						case NS_USER_TALK:
-						case NS_PROJECT_TALK:
-						case NS_FILE_TALK:
-						case NS_MEDIAWIKI_TALK:
-						case NS_TEMPLATE_TALK:
-						case NS_HELP_TALK:
-						case NS_CATEGORY_TALK:
-							$text = wfMessage('viewtalkpage');
-							break;
-						case NS_MAIN:
-							$text = wfMessage( 'articlepage' );
-							break;
-						case NS_USER:
-							$text = wfMessage( 'userpage' );
-							break;
-						case NS_PROJECT:
-							$text = wfMessage( 'projectpage' );
-							break;
-						case NS_FILE:
-							$text = wfMessage( 'imagepage' );
-							break;
-						case NS_MEDIAWIKI:
-							$text = wfMessage( 'mediawikipage' );
-							break;
-						case NS_TEMPLATE:
-							$text = wfMessage( 'templatepage' );
-							break;
-						case NS_HELP:
-							$text = wfMessage( 'viewhelppage' );
-							break;
-						case NS_CATEGORY:
-							$text = wfMessage( 'categorypage' );
-							break;
-						default:
-							$text = wfMessage( 'articlepage' );
-					}
-
-					$link = $title->getText();
-					$nstext = $wgContLang->getNsText( $tns );
-					if( $nstext ) { # add namespace if necessary
-						$link = $nstext . ':' . $link;
-					}
-
-					$s .= Linker::link( Title::newFromText( $link ), $text->escaped() );
-				} elseif( $title->getNamespace() != NS_SPECIAL ) {
-					# we just throw in a "New page" text to tell the user that he's in edit mode,
-					# and to avoid messing with the separator that is prepended to the next item
-					$s .= '<strong>' . wfMessage( 'newpage' )->escaped() . '</strong>';
-				}
-			}
-
-			# "Post a comment" link
-			if( ( $title->isTalkPage() || $this->getSkin()->getOutput()->showNewSectionLink() ) && $action != 'edit' && !$wpPreview )
-				$s .= '<br />' . Linker::link(
-					$title,
-					wfMessage( 'postcomment' )->escaped(),
-					array(),
-					array(
-						'action' => 'edit',
-						'section' => 'new'
-					)
-				);
-
-			/**
-			 * Watching could cause problems in edit mode:
-			 * if user edits article, then loads "watch this article" in background and then saves
-			 * article with "Watch this article" checkbox disabled, the article is transparently
-			 * unwatched. Therefore we do not show the "Watch this page" link in edit mode.
-			 */
-			if ( $this->data['loggedin'] && $articleExists ) {
-				if( $action != 'edit' && $action != 'submit' ) {
-					$s .= $sep . $this->watchThisPage();
-				}
-				if ( $title->userCan( 'edit' ) )
-					$s .= $sep . $this->moveThisPage();
-			}
-			if ( $this->getSkin()->getUser()->isAllowed( 'delete' ) && $articleExists ) {
-				$s .= $sep . $this->deleteThisPage() .
-				$sep . $this->protectThisPage();
-			}
-			$s .= $sep . $this->talkLink();
-			if( $articleExists && $action != 'history' ) {
-				$s .= $sep . $this->historyLink();
-			}
-			$s .= $sep . $this->whatLinksHere();
-
-			if( $this->getSkin()->getOutput()->isArticleRelated() ) {
-				$s .= $sep . $this->watchPageLinksLink();
-			}
-
-			if (
-				NS_USER == $title->getNamespace() ||
-				$title->getNamespace() == NS_USER_TALK
-			) {
-
-				$id = User::idFromName( $title->getText() );
-				$ip = User::isIP( $title->getText() );
-
-				if( $id || $ip ){
-					$s .= $sep . $this->userContribsLink();
-				}
-				if( $this->getSkin()->showEmailUser( $id ) ) {
-					$s .= $sep . $this->emailUserLink();
-				}
-			}
-			$s .= "\n<br /><hr class='sep' />";
-		}
-
-		if( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getSkin()->getUser() ) === true ) {
-			$s .= $this->getUploadLink() . $sep;
-		}
-
-		$s .= Linker::specialLink( 'Specialpages' );
-
-		global $wgSiteSupportPage;
-		if( $wgSiteSupportPage ) {
-			$s .= "\n<br /><a href=\"" . htmlspecialchars( $wgSiteSupportPage ) .
-			'" class="internal">' . wfMessage( 'sitesupport' )->escaped() . '</a>';
-		}
-
-		$s .= "\n<br /></div>\n";
-		wfProfileOut( __METHOD__ );
-		return $s;
-	}
-}
diff --git a/skins/Vector.php b/skins/Vector.php
index d0f99951..288b5fd6 100644
--- a/skins/Vector.php
+++ b/skins/Vector.php
@@ -23,7 +23,7 @@
  * @ingroup Skins
  */
 
-if( !defined( 'MEDIAWIKI' ) ) {
+if ( !defined( 'MEDIAWIKI' ) ) {
 	die( -1 );
 }
 
@@ -48,7 +48,7 @@ class SkinVector extends SkinTemplate {
 		parent::initPage( $out );
 
 		// Append CSS which includes IE only behavior fixes for hover support -
-		// this is better than including this in a CSS fille since it doesn't
+		// this is better than including this in a CSS file since it doesn't
 		// wait for the CSS file to load before fetching the HTC file.
 		$min = $this->getRequest()->getFuzzyBool( 'debug' ) ? '' : '.min';
 		$out->addHeadItem( 'csshover',
@@ -57,17 +57,19 @@ class SkinVector extends SkinTemplate {
 				"/{$this->stylename}/csshover{$min}.htc\")}</style><![endif]-->"
 		);
 
-		$out->addModules( 'skins.vector.js' );
+		$out->addModules( array( 'skins.vector.js', 'skins.vector.collapsibleNav' ) );
 	}
 
 	/**
-	 * Load skin and user CSS files in the correct order
-	 * fixes bug 22916
+	 * Loads skin and user CSS files.
 	 * @param $out OutputPage object
 	 */
 	function setupSkinUserCss( OutputPage $out ) {
 		parent::setupSkinUserCss( $out );
-		$out->addModuleStyles( 'skins.vector' );
+
+		$styles = array( 'skins.vector' );
+		wfRunHooks( 'SkinVectorStyleModules', array( &$this, &$styles ) );
+		$out->addModuleStyles( $styles );
 	}
 
 	/**
@@ -155,81 +157,50 @@ class VectorTemplate extends BaseTemplate {
 ?>
 		<div id="mw-page-base" class="noprint"></div>
 		<div id="mw-head-base" class="noprint"></div>
-		<!-- content -->
 		<div id="content" class="mw-body" role="main">
 			<a id="top"></a>
 			<div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
-			<?php if ( $this->data['sitenotice'] ): ?>
-			<!-- sitenotice -->
+			<?php if ( $this->data['sitenotice'] ) { ?>
 			<div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
-			<!-- /sitenotice -->
-			<?php endif; ?>
-			<!-- firstHeading -->
+			<?php } ?>
 			<h1 id="firstHeading" class="firstHeading" lang="<?php
-				$this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
-				$this->html( 'pageLanguage' );
+				$this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+				$this->text( 'pageLanguage' );
 			?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
-			<!-- /firstHeading -->
-			<!-- bodyContent -->
 			<div id="bodyContent">
-				<?php if ( $this->data['isarticle'] ): ?>
-				<!-- tagline -->
+				<?php if ( $this->data['isarticle'] ) { ?>
 				<div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
-				<!-- /tagline -->
-				<?php endif; ?>
-				<!-- subtitle -->
+				<?php } ?>
 				<div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
-				<!-- /subtitle -->
-				<?php if ( $this->data['undelete'] ): ?>
-				<!-- undelete -->
+				<?php if ( $this->data['undelete'] ) { ?>
 				<div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
-				<!-- /undelete -->
-				<?php endif; ?>
-				<?php if( $this->data['newtalk'] ): ?>
-				<!-- newtalk -->
-				<div class="usermessage"><?php $this->html( 'newtalk' )  ?></div>
-				<!-- /newtalk -->
-				<?php endif; ?>
-				<?php if ( $this->data['showjumplinks'] ): ?>
-				<!-- jumpto -->
+				<?php } ?>
+				<?php if ( $this->data['newtalk'] ) { ?>
+				<div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+				<?php } ?>
 				<div id="jump-to-nav" class="mw-jump">
 					<?php $this->msg( 'jumpto' ) ?>
 					<a href="#mw-navigation"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?>
 					<a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
 				</div>
-				<!-- /jumpto -->
-				<?php endif; ?>
-				<!-- bodycontent -->
 				<?php $this->html( 'bodycontent' ) ?>
-				<!-- /bodycontent -->
-				<?php if ( $this->data['printfooter'] ): ?>
-				<!-- printfooter -->
+				<?php if ( $this->data['printfooter'] ) { ?>
 				<div class="printfooter">
 				<?php $this->html( 'printfooter' ); ?>
 				</div>
-				<!-- /printfooter -->
-				<?php endif; ?>
-				<?php if ( $this->data['catlinks'] ): ?>
-				<!-- catlinks -->
+				<?php } ?>
+				<?php if ( $this->data['catlinks'] ) { ?>
 				<?php $this->html( 'catlinks' ); ?>
-				<!-- /catlinks -->
-				<?php endif; ?>
-				<?php if ( $this->data['dataAfterContent'] ): ?>
-				<!-- dataAfterContent -->
+				<?php } ?>
+				<?php if ( $this->data['dataAfterContent'] ) { ?>
 				<?php $this->html( 'dataAfterContent' ); ?>
-				<!-- /dataAfterContent -->
-				<?php endif; ?>
+				<?php } ?>
 				<div class="visualClear"></div>
-				<!-- debughtml -->
 				<?php $this->html( 'debughtml' ); ?>
-				<!-- /debughtml -->
 			</div>
-			<!-- /bodyContent -->
 		</div>
-		<!-- /content -->
 		<div id="mw-navigation">
 			<h2><?php $this->msg( 'navigation-heading' ) ?></h2>
-			<!-- header -->
 			<div id="mw-head">
 				<?php $this->renderNavigation( 'PERSONAL' ); ?>
 				<div id="left-navigation">
@@ -239,41 +210,34 @@ class VectorTemplate extends BaseTemplate {
 					<?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?>
 				</div>
 			</div>
-			<!-- /header -->
-			<!-- panel -->
 			<div id="mw-panel">
-				<!-- logo -->
 					<div id="p-logo" role="banner"><a style="background-image: url(<?php $this->text( 'logopath' ) ?>);" href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>" <?php echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ) ?>></a></div>
-				<!-- /logo -->
 				<?php $this->renderPortals( $this->data['sidebar'] ); ?>
 			</div>
-			<!-- /panel -->
 		</div>
-		<!-- footer -->
 		<div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
-			<?php foreach( $this->getFooterLinks() as $category => $links ): ?>
+			<?php foreach ( $this->getFooterLinks() as $category => $links ) { ?>
 				<ul id="footer-<?php echo $category ?>">
-					<?php foreach( $links as $link ): ?>
+					<?php foreach ( $links as $link ) { ?>
 						<li id="footer-<?php echo $category ?>-<?php echo $link ?>"><?php $this->html( $link ) ?></li>
-					<?php endforeach; ?>
+					<?php } ?>
 				</ul>
-			<?php endforeach; ?>
-			<?php $footericons = $this->getFooterIcons("icononly");
-			if ( count( $footericons ) > 0 ): ?>
+			<?php } ?>
+			<?php $footericons = $this->getFooterIcons( "icononly" );
+			if ( count( $footericons ) > 0 ) { ?>
 				<ul id="footer-icons" class="noprint">
-<?php			foreach ( $footericons as $blockName => $footerIcons ): ?>
+<?php			foreach ( $footericons as $blockName => $footerIcons ) { ?>
 					<li id="footer-<?php echo htmlspecialchars( $blockName ); ?>ico">
-<?php				foreach ( $footerIcons as $icon ): ?>
+<?php				foreach ( $footerIcons as $icon ) { ?>
 						<?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
 
-<?php				endforeach; ?>
+<?php				} ?>
 					</li>
-<?php			endforeach; ?>
+<?php			} ?>
 				</ul>
-			<?php endif; ?>
+			<?php } ?>
 			<div style="clear:both"></div>
 		</div>
-		<!-- /footer -->
 		<?php $this->printTrail(); ?>
 
 	</body>
@@ -299,11 +263,11 @@ class VectorTemplate extends BaseTemplate {
 		}
 		// Render portals
 		foreach ( $portals as $name => $content ) {
-			if ( $content === false )
+			if ( $content === false ) {
 				continue;
+			}
 
-			echo "\n<!-- {$name} -->\n";
-			switch( $name ) {
+			switch ( $name ) {
 				case 'SEARCH':
 					break;
 				case 'TOOLBOX':
@@ -318,7 +282,6 @@ class VectorTemplate extends BaseTemplate {
 					$this->renderPortal( $name, $content );
 				break;
 			}
-			echo "\n<!-- /{$name} -->\n";
 		}
 	}
 
@@ -332,29 +295,30 @@ class VectorTemplate extends BaseTemplate {
 		if ( $msg === null ) {
 			$msg = $name;
 		}
+		$msgObj = wfMessage( $msg );
 		?>
-<div class="portal" role="navigation" id='<?php echo Sanitizer::escapeId( "p-$name" ) ?>'<?php echo Linker::tooltip( 'p-' . $name ) ?>>
-	<h3<?php $this->html( 'userlangattributes' ) ?>><?php $msgObj = wfMessage( $msg ); echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg ); ?></h3>
+<div class="portal" role="navigation" id='<?php echo Sanitizer::escapeId( "p-$name" ) ?>'<?php echo Linker::tooltip( 'p-' . $name ) ?> aria-labelledby='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'>
+	<h3<?php $this->html( 'userlangattributes' ) ?> id='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg ); ?></h3>
 	<div class="body">
 <?php
-		if ( is_array( $content ) ): ?>
+		if ( is_array( $content ) ) { ?>
 		<ul>
 <?php
-			foreach( $content as $key => $val ): ?>
+			foreach ( $content as $key => $val ) { ?>
 			<?php echo $this->makeListItem( $key, $val ); ?>
 
 <?php
-			endforeach;
+			}
 			if ( $hook !== null ) {
 				wfRunHooks( $hook, array( &$this, true ) );
 			}
 			?>
 		</ul>
 <?php
-		else: ?>
+		} else { ?>
 		<?php echo $content; /* Allow raw HTML block to be defined by extensions */ ?>
 <?php
-		endif; ?>
+		} ?>
 	</div>
 </div>
 <?php
@@ -379,36 +343,35 @@ class VectorTemplate extends BaseTemplate {
 		}
 		// Render elements
 		foreach ( $elements as $name => $element ) {
-			echo "\n<!-- {$name} -->\n";
 			switch ( $element ) {
 				case 'NAMESPACES':
 ?>
-<div id="p-namespaces" role="navigation" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
-	<h3><?php $this->msg( 'namespaces' ) ?></h3>
+<div id="p-namespaces" role="navigation" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-namespaces-label">
+	<h3 id="p-namespaces-label"><?php $this->msg( 'namespaces' ) ?></h3>
 	<ul<?php $this->html( 'userlangattributes' ) ?>>
-		<?php foreach ( $this->data['namespace_urls'] as $link ): ?>
+		<?php foreach ( $this->data['namespace_urls'] as $link ) { ?>
 			<li <?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></span></li>
-		<?php endforeach; ?>
+		<?php } ?>
 	</ul>
 </div>
 <?php
 				break;
 				case 'VARIANTS':
 ?>
-<div id="p-variants" role="navigation" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+<div id="p-variants" role="navigation" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-variants-label">
 	<h3 id="mw-vector-current-variant">
-	<?php foreach ( $this->data['variant_urls'] as $link ): ?>
-		<?php if ( stripos( $link['attributes'], 'selected' ) !== false ): ?>
+	<?php foreach ( $this->data['variant_urls'] as $link ) { ?>
+		<?php if ( stripos( $link['attributes'], 'selected' ) !== false ) { ?>
 			<?php echo htmlspecialchars( $link['text'] ) ?>
-		<?php endif; ?>
-	<?php endforeach; ?>
+		<?php } ?>
+	<?php } ?>
 	</h3>
-	<h3><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
+	<h3 id="p-variants-label"><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
 	<div class="menu">
 		<ul>
-			<?php foreach ( $this->data['variant_urls'] as $link ): ?>
+			<?php foreach ( $this->data['variant_urls'] as $link ) { ?>
 				<li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" lang="<?php echo htmlspecialchars( $link['lang'] ) ?>" hreflang="<?php echo htmlspecialchars( $link['hreflang'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
-			<?php endforeach; ?>
+			<?php } ?>
 		</ul>
 	</div>
 </div>
@@ -416,30 +379,30 @@ class VectorTemplate extends BaseTemplate {
 				break;
 				case 'VIEWS':
 ?>
-<div id="p-views" role="navigation" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>">
-	<h3><?php $this->msg('views') ?></h3>
-	<ul<?php $this->html('userlangattributes') ?>>
-		<?php foreach ( $this->data['view_urls'] as $link ): ?>
+<div id="p-views" role="navigation" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-views-label">
+	<h3 id="p-views-label"><?php $this->msg( 'views' ) ?></h3>
+	<ul<?php $this->html( 'userlangattributes' ) ?>>
+		<?php foreach ( $this->data['view_urls'] as $link ) { ?>
 			<li<?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php
 				// $link['text'] can be undefined - bug 27764
 				if ( array_key_exists( 'text', $link ) ) {
-					echo array_key_exists( 'img', $link ) ?  '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />' : htmlspecialchars( $link['text'] );
+					echo array_key_exists( 'img', $link ) ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />' : htmlspecialchars( $link['text'] );
 				}
 				?></a></span></li>
-		<?php endforeach; ?>
+		<?php } ?>
 	</ul>
 </div>
 <?php
 				break;
 				case 'ACTIONS':
 ?>
-<div id="p-cactions" role="navigation" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
-	<h3><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h3>
+<div id="p-cactions" role="navigation" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-cactions-label">
+	<h3 id="p-cactions-label"><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h3>
 	<div class="menu">
 		<ul<?php $this->html( 'userlangattributes' ) ?>>
-			<?php foreach ( $this->data['action_urls'] as $link ): ?>
+			<?php foreach ( $this->data['action_urls'] as $link ) { ?>
 				<li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
-			<?php endforeach; ?>
+			<?php } ?>
 		</ul>
 	</div>
 </div>
@@ -447,8 +410,8 @@ class VectorTemplate extends BaseTemplate {
 				break;
 				case 'PERSONAL':
 ?>
-<div id="p-personal" role="navigation" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
-	<h3><?php $this->msg( 'personaltools' ) ?></h3>
+<div id="p-personal" role="navigation" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-personal-label">
+	<h3 id="p-personal-label"><?php $this->msg( 'personaltools' ) ?></h3>
 	<ul<?php $this->html( 'userlangattributes' ) ?>>
 <?php
 					$personalTools = $this->getPersonalTools();
@@ -465,21 +428,21 @@ class VectorTemplate extends BaseTemplate {
 <div id="p-search" role="search">
 	<h3<?php $this->html( 'userlangattributes' ) ?>><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
 	<form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
-		<?php if ( $wgVectorUseSimpleSearch && $this->getSkin()->getUser()->getOption( 'vector-simplesearch' ) ): ?>
+		<?php if ( $wgVectorUseSimpleSearch && $this->getSkin()->getUser()->getOption( 'vector-simplesearch' ) ) { ?>
 		<div id="simpleSearch">
-			<?php if ( $this->data['rtl'] ): ?>
+			<?php if ( $this->data['rtl'] ) { ?>
 			<?php echo $this->makeSearchButton( 'image', array( 'id' => 'searchButton', 'src' => $this->getSkin()->getSkinStylePath( 'images/search-rtl.png' ), 'width' => '12', 'height' => '13' ) ); ?>
-			<?php endif; ?>
+			<?php } ?>
 			<?php echo $this->makeSearchInput( array( 'id' => 'searchInput', 'type' => 'text' ) ); ?>
-			<?php if ( !$this->data['rtl'] ): ?>
+			<?php if ( !$this->data['rtl'] ) { ?>
 			<?php echo $this->makeSearchButton( 'image', array( 'id' => 'searchButton', 'src' => $this->getSkin()->getSkinStylePath( 'images/search-ltr.png' ), 'width' => '12', 'height' => '13' ) ); ?>
-			<?php endif; ?>
-		<?php else: ?>
+			<?php } ?>
+		<?php } else { ?>
 		<div>
 			<?php echo $this->makeSearchInput( array( 'id' => 'searchInput' ) ); ?>
 			<?php echo $this->makeSearchButton( 'go', array( 'id' => 'searchGoButton', 'class' => 'searchButton' ) ); ?>
 			<?php echo $this->makeSearchButton( 'fulltext', array( 'id' => 'mw-searchButton', 'class' => 'searchButton' ) ); ?>
-		<?php endif; ?>
+		<?php } ?>
 			<input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
 		</div>
 	</form>
@@ -488,7 +451,6 @@ class VectorTemplate extends BaseTemplate {
 
 				break;
 			}
-			echo "\n<!-- /{$name} -->\n";
 		}
 	}
 }
diff --git a/skins/archlinux/IE60Fixes.css b/skins/archlinux/IE60Fixes.css
index ec1ce430..534d3333 100644
--- a/skins/archlinux/IE60Fixes.css
+++ b/skins/archlinux/IE60Fixes.css
@@ -70,15 +70,6 @@ div#footer {
 #portal-personaltools {
 	padding-bottom: 0.1em;
 }
-#bodyContent a.external {
-	background: url(external.png) center right no-repeat;
-	padding-right: 13px;
-}
-
-.rtl #bodyContent a.external {
-	background-image: url(external-rtl.png);
-	padding-right: 13px;
-}
 
 .rtl a.feedlink {
 	background-position: right;
diff --git a/skins/archlinux/Opera6Fixes.css b/skins/archlinux/Opera6Fixes.css
deleted file mode 100644
index 77dec095..00000000
--- a/skins/archlinux/Opera6Fixes.css
+++ /dev/null
@@ -1,20 +0,0 @@
-/* opera 6 fixes */
-div#column-one {
-	position: relative;
-	max-width: 11.7em;
-}
-#p-personal {
-	width: 45em;
-	margin-left: 8.6em;
-	right: 0;
-}
-#bodyContent a.external {
-	background: url(external.png) center right no-repeat;
-	padding-right: 13px;
-}
-
-.rtl a.feedlink {
-	background-position: right;
-	padding-right: 0;
-	padding-left: 16px;
-}
diff --git a/skins/archlinux/Opera7Fixes.css b/skins/archlinux/Opera7Fixes.css
deleted file mode 100644
index 1dcba7c9..00000000
--- a/skins/archlinux/Opera7Fixes.css
+++ /dev/null
@@ -1,21 +0,0 @@
-/* small tweaks for opera seven */
-#p-cactions {
-	margin-top: .1em;
-}
-#p-cactions li a {
-	top: 2px;
-}
-#bodyContent a.external {
-	background: url(external.png) center right no-repeat;
-	padding-right: 13px;
-}
-.rtl #bodyContent a.external {
-	background-image: url(external-rtl.png);
-	padding-right: 13px;
-}
-
-.rtl a.feedlink {
-	background-position: right;
-	padding-right: 0;
-	padding-left: 16px;
-}
diff --git a/skins/archlinux/Opera9Fixes.css b/skins/archlinux/Opera9Fixes.css
deleted file mode 100644
index 9c312a84..00000000
--- a/skins/archlinux/Opera9Fixes.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.rtl #bodyContent a.external {
-	background-image: url(external-rtl.png);
-	padding-right: 13px;
-	padding-left: 0;
-}
-
-.rtl a.feedlink {
-	background-position: right;
-	padding-right: 0;
-	padding-left: 16px;
-}
diff --git a/skins/archlinux/external-ltr.png b/skins/archlinux/external-ltr.png
index acf260fc..63083831 100644
Binary files a/skins/archlinux/external-ltr.png and b/skins/archlinux/external-ltr.png differ
diff --git a/skins/archlinux/external-rtl.png b/skins/archlinux/external-rtl.png
index 7d5ee375..5313234e 100644
Binary files a/skins/archlinux/external-rtl.png and b/skins/archlinux/external-rtl.png differ
diff --git a/skins/archlinux/main.css b/skins/archlinux/main.css
index 4cbc0939..d8f25ebb 100644
--- a/skins/archlinux/main.css
+++ b/skins/archlinux/main.css
@@ -17,7 +17,7 @@ div#column-content {
 }
 div#content {
 	margin: 2.8em 0 0 12.2em;
-	padding: 0 1em 1em 1em;
+	padding: 1em;
 	position: relative;
 	z-index: 2;
 }
@@ -93,6 +93,9 @@ pre, .mw-code {
 	line-height: 1.1em;
 }
 
+#firstHeading {
+	padding-top: 0;
+}
 /*
 ** the main content area
 */
@@ -139,8 +142,7 @@ table.rimage {
 ** keep the whitespace in front of the ^=, hides rule from konqueror
 ** this is css3, the validator doesn't like it when validating as css2
 */
-#bodyContent a.external,
-#bodyContent a.external[href ^="gopher://"] {
+#bodyContent a.external {
 	/* @embed */
 	background: url(external-ltr.png) center right no-repeat;
 	padding-right: 13px;
@@ -319,7 +321,7 @@ input.searchButton {
 	position: absolute;
 	left: 0;
 	top: 0;
-	z-index: 0;
+	z-index: 3;
 }
 #p-personal {
 	width: 100%;
@@ -381,19 +383,22 @@ input.searchButton {
 #p-personal li.active a:hover {
 	background-color: transparent;
 }
-/* the icon in front of the user name, single quotes
-in bg url to hide it from iemac */
+/* The icon in front of the username / login link */
 li#pt-userpage,
 li#pt-anonuserpage,
 li#pt-login {
 	/* @embed */
 	background: url(user.gif) top left no-repeat;
 	padding-left: 20px;
-	text-transform: none;
 }
 #p-personal ul {
 	text-transform: lowercase;
 }
+/* Don't lowercase username or IP addresses (IPv6) */
+li#pt-userpage,
+li#pt-anonuserpage {
+	text-transform: none;
+}
 #p-personal li.active {
 	font-weight: bold;
 }
@@ -422,14 +427,13 @@ li#pt-login {
 	display: inline;
 	border: 1px solid #aaa;
 	border-bottom: none;
-	padding: 0 0 .1em 0;
+	padding: 0 0 1em 0;
 	margin: 0 .3em 0 0;
 	overflow: visible;
 	background: white;
 }
 #p-cactions li.selected {
 	border-color: #fabd23;
-	padding: 0 0 .2em 0;
 	font-weight: bold;
 }
 #p-cactions li a {
@@ -515,7 +519,8 @@ div#footer {
 	border-top: 1px solid #fabd23;
 	border-bottom: 1px solid #fabd23;
 	margin: .6em 0 1em 0;
-	padding: .4em 0 1.2em 0;
+	overflow: hidden;
+	padding: .4em 0 .3em 0;
 	text-align: center;
 	font-size: 90%;
 }
@@ -897,6 +902,5 @@ div.mw-lag-warn-high {
 /* mediawiki.notification */
 .skin-monobook .mw-notification {
 	-webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
-	-moz-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
 	box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
 }
diff --git a/skins/archlinux/wiki-indexed.png b/skins/archlinux/wiki-indexed.png
index 0ec584a3..799ebac8 100644
Binary files a/skins/archlinux/wiki-indexed.png and b/skins/archlinux/wiki-indexed.png differ
diff --git a/skins/chick/IE60Fixes.css b/skins/chick/IE60Fixes.css
deleted file mode 100644
index 18e9655d..00000000
--- a/skins/chick/IE60Fixes.css
+++ /dev/null
@@ -1,79 +0,0 @@
-/* 6.0 - only fixes */
-/* content area */
-/* workaround for various ie float bugs */
-#column-content {
-    float: none;
-    margin-left: 0;
-    height: 1%;
-}
-#column-content #content {
-    margin-left: 12.2em;
-    margin-top: 3em;
-    height: 1%;
-}
-#column-one {
-    position: absolute;
-    top: 0;
-    left: 0;
-    z-index: 4;
-}
-#footer {
-    margin-left: 13.6em;
-    border-left: 1px solid #fabd23;
-}
-
-/* the tabs */
-
-#p-cactions {
-    z-index: 3;
-}
-
-#p-cactions li {
-    padding-bottom: 0 !important;
-    border: none;
-    background-color: transparent;
-    cursor: default;
-    float: none !important;
-}
-#p-cactions li a {
-    display: inline-block !important;
-    vertical-align: top;
-    padding-bottom: 0;
-    border: solid #aaa;
-    border-width: 1px 1px 0;
-}
-#p-cactions li.selected a {
-    border-color: #fabd23;
-    padding-bottom: 0.17em;
-}
-#p-cactions li a:hover {
-    padding-bottom: 0.17em;
-}
-#portal-personaltools {
-    padding-bottom: 0.1em;
-}
-#bodyContent a.external {
-    background: url(external.png) center right no-repeat;
-    padding-right: 13px;
-}
-
-/* show the hand */
-#p-logo a,
-#p-logo a:hover {
-    cursor: pointer;
-}
-div.visualClear {
-    width:100%;
-    line-height: 0;
-}
-textarea {
-    width: 96%;
-}
-
-div.editsection,
-#catlinks,
-div.tright,
-div.tleft {
-    position: relative;
-}
-/*{ border:1px solid Red !important;}*/
diff --git a/skins/chick/main.css b/skins/chick/main.css
deleted file mode 100644
index 5e2a2e7a..00000000
--- a/skins/chick/main.css
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
-** MediaWiki 'chick' style sheet for PDAs or other small-screen devices.
-** Copyright Timwi
-** License: GPL (http://www.gnu.org/copyleft/gpl.html)
-**
-** Loosely based on Monobook by Gabriel Wicke
-*/
-
-body {
-	font-family: sans-serif;
-	color: black;
-	background: white;
-	margin: 0;
-	padding: 0.3em;
-}
-
-a { color: #002bb8; }
-a:visited { color: #5a3696; }
-a:active { color: #ffa500; }
-a.stub { color: #772233; }
-a.new,
-#p-personal a.new { color:#ba0000; }
-a.new:visited,
-#p-personal a.new:visited { color:#a55858; }
-
-img {
-	border: none;
-	vertical-align: middle;
-}
-p {
-	margin: 0.4em 0em 0.5em 0em;
-	line-height: 1.5em;
-}
-
-p img { margin: 0; }
-
-hr {
-	height: 1px;
-	color: #aaaaaa;
-	background-color: #aaaaaa;
-	border: 0;
-	margin: 0.2em 0 0.2em 0;
-}
-
-h1, h2, h3, h4, h5, h6 {
-	color: black;
-	background: none;
-	font-weight: normal;
-	margin: 0;
-	overflow: hidden;
-	padding-top: 0.5em;
-	padding-bottom: 0.17em;
-	border-bottom: 1px solid #aaaaaa;
-}
-.editsection {
-	font-weight: normal;
-}
-h1 { font-size: 188%; }
-h1 .editsection { font-size: 53.2%; }
-h2 { font-size: 150%; }
-h2 .editsection { font-size: 66.7%; }
-h3, h4, h5, h6 {
-	border-bottom: none;
-	font-weight: bold;
-}
-h3 { font-size: 132%; }
-h3 .editsection { font-size: 75.8%; }
-h4 { font-size: 116%; }
-h4 .editsection { font-size: 86.2%; }
-h5 { font-size: 100%; }
-h6 { font-size: 80%;  }
-h6 .editsection { font-size: 125%; }
-
-ul {
-	line-height: 1.5em;
-	margin: 0.3em 0 0 1.5em;
-	padding:0;
-}
-ol {
-	line-height: 1.5em;
-	margin: 0.3em 0 0 3.2em;
-	padding:0;
-	list-style-image: none;
-}
-li { margin-bottom: 0.1em; }
-dt {
-	font-weight: bold;
-	margin-bottom: 0.1em;
-}
-dl{
-	margin-top: 0.2em;
-	margin-bottom: 0.5em;
-}
-dd {
-	line-height: 1.5em;
-	margin-left: 2em;
-	margin-bottom: 0.1em;
-}
-
-fieldset {
-	border: 1px solid #2f6fab;
-	margin: 1em 0em 1em 0em;
-	padding: 0em 1em 1em 1em;
-	line-height: 1.5em;
-}
-legend {
-	background: white;
-	padding: 0.5em;
-	font-size: 95%;
-}
-form {
-	border: none;
-	margin: 0;
-}
-
-textarea {
-	border: 1px solid #2f6fab;
-	color: black;
-	background-color: white;
-	width: 100%;
-	padding: 0.1em;
-	overflow: auto;
-}
-/* hide this from ie/mac and konq2.2 */
-@media All {
-	head:first-child+body input {
-		visibility: visible;
-		border: 1px solid #2f6fab;
-		color: black;
-		background-color: white;
-		vertical-align: middle;
-		padding: 0.2em;
-	}
-}
-input.historysubmit {
-	padding: 0 0.3em 0.3em 0.3em !important;
-	font-size: 94%;
-	cursor: pointer;
-	height: 1.7em !important;
-	margin-left: 1.6em;
-}
-input[type="radio"],
-input[type="checkbox"] { border:none; }
-select {
-	border: 1px solid #2f6fab;
-	color: black;
-	vertical-align: top;
-}
-q {
-	font-family: Times, "Times New Roman", serif;
-	font-style: italic;
-}
-code { background-color: #f9f9f9; }
-pre, .mw-code {
-	padding: 1em;
-	border: 1px dashed #2f6fab;
-	color: black;
-	background-color: #f9f9f9;
-	line-height: 1.1em;
-}
-
-/*
-** the main content area
-*/
-
-span.subpages { display: block; }
-
-/* Some space under the headers in the content area */
-#bodyContent h1, #bodyContent h2 { margin-bottom:0.6em; }
-#bodyContent h3,
-#bodyContent h4,
-#bodyContent h5 {
-	margin-bottom: 0.3em;
-}
-#firstHeading { margin-bottom:0.1em; }
-
-/* user notification thing */
-.usermessage {
-	background-color: #ffce7b;
-	border: 1px solid #ffa500;
-	color: black;
-	font-weight: bold;
-	margin: 0.1em 0 0 0;
-	padding: 2px 5px;
-	vertical-align: middle;
-}
-#siteNotice {
-	text-align: center;
-	font-size: 95%;
-	padding: 0 0.9em 0 0.9em;
-}
-#siteNotice p { margin: 0; padding: 0; }
-.error {
-	color: red;
-	font-size: larger;
-}
-.catlinks {
-	border:1px solid #aaaaaa;
-	background-color:#f9f9f9;
-	padding: 2px 5px;
-	margin: 0.1em 0 0 0;
-	clear: both;
-}
-.catlinks { margin: 0; padding: 0; }
-
-/* emulate center */
-.center {
-	width: 100%;
-	text-align: center;
-}
-*.center * {
-	margin-left: auto;
-	margin-right: auto;
-}
-/* small for tables and similar */
-.small { font-size: 94%; }
-table.small { font-size: 100% }
-
-/*
-** content styles
-*/
-
-#toc {
-	/*border:1px solid #2f6fab;*/
-	border:1px solid #aaaaaa;
-	background-color:#f9f9f9;
-	padding:5px;
-	font-size: 95%;
-}
-#toc ul { margin: 0 2em; }
-#toc .toctoggle { font-size: 94%; }
-#toc .editsection {
-	margin-top: 0.7em;
-	font-size: 94%;
-}
-
-/* images */
-/* @noflip */div.floatright, table.floatright {
-	margin: 0;
-	border: 0.5em solid white;
-	border-width: 0.5em 0 0.8em 1.4em;
-}
-div.floatright p { font-style: italic; }
-/* @noflip */div.floatleft, table.floatleft {
-	margin: 0.3em 0.5em 0.5em 0;
-	border: 0.5em solid white;
-	border-width: 0.5em 1.4em 0.8em 0;
-}
-div.floatleft p { font-style: italic; }
-/* thumbnails */
-div.thumb {
-	margin-bottom: 0.5em;
-	width: auto;
-}
-div.thumbinner {
-	border:1px solid #cccccc;
-	padding: 3px !important;
-	background-color:#f9f9f9;
-	font-size: 94%;
-	text-align: center;
-	overflow: hidden;
-}
-html .thumbimage {
-	border:1px solid #cccccc;
-}
-html .thumbcaption {
-	border: none;
-	text-align: left;
-	line-height: 1.4em;
-	padding: 0.3em 0 0.1em 0;
-}
-div.magnify {
-	float: right;
-	border: none !important;
-	background: none !important;
-}
-div.magnify a, div.magnify img {
-	display: block;
-	border: none !important;
-	background: none !important;
-}
-/* @noflip */div.tright {
-	margin: 0.5em 0 1.3em 1.4em;
-}
-/* @noflip */div.tleft {
-	margin: 0.5em 1.4em 1.3em 0;
-}
-img.thumbborder {
-	border: 1px solid #dddddd;
-}
-
-/*
-** classes for special content elements like town boxes
-** intended to be referenced directly from the wiki src
-*/
-
-/*
-** User styles
-*/
-/* table standards */
-table.rimage {
-	float:right;
-	position:relative;
-	margin-left:1em;
-	margin-bottom:1em;
-	text-align:center;
-}
-.toccolours {
-	border:1px solid #aaaaaa;
-	background-color:#f9f9f9;
-	padding:5px;
-	font-size: 95%;
-}
-
-/*
-** edit views etc
-*/
-.special li {
-	line-height: 1.4em;
-	margin: 0;
-	padding: 0;
-}
-
-a.external { color: #3366bb; }
-div#footer { text-align: center; }
-ul#f-list li { list-style: none;  text-align: center; }
-div.portlet { margin: 0.5em 0; }
-
-.redirectText {
-	font-size:150%;
-	margin:5px;
-}
-
-ul.special li.not-patrolled, ol.special li.not-patrolled {
-	background-color: #ffa;
-}
-div.patrollink {
-	font-size: 75%;
-	text-align: right;
-}
-
-span.updatedmarker {
-	color:black;
-	background-color:#00FF00;
-}
-
-div.gallerybox {
-	width:  150px;
-}
-
-#xjump-to-nav {
-	display: none;
-}
-
-.templatesUsed { margin-top: 1.5em; }
-
-#footer {
-	background-color: white;
-	border-top: 1px solid #fabd23;
-	border-bottom: 1px solid #fabd23;
-	margin: .6em 0 1em 0;
-	padding: .4em 0 1.2em 0;
-	text-align: center;
-	font-size: 90%;
-}
-#f-poweredbyico, #f-copyrightico {
-	display: inline;
-}
diff --git a/skins/cologneblue/print.css b/skins/cologneblue/print.css
new file mode 100644
index 00000000..d4b05518
--- /dev/null
+++ b/skins/cologneblue/print.css
@@ -0,0 +1,6 @@
+#sitetitle,
+#sitesub,
+#titlelinks,
+#footer-navigation {
+	display: none;
+}
diff --git a/skins/cologneblue/screen.css b/skins/cologneblue/screen.css
index 349638aa..bc5dd316 100644
--- a/skins/cologneblue/screen.css
+++ b/skins/cologneblue/screen.css
@@ -55,6 +55,14 @@ p, pre, .mw-code, td, th, li, dd, dt {
 
 textarea {
 	overflow: auto;
+	width: 100%;
+}
+
+#editform textarea {
+	display: block;
+	-moz-box-sizing: border-box;
+	-webkit-box-sizing: border-box;
+	box-sizing: border-box;
 }
 
 #footer {
@@ -135,10 +143,6 @@ h1 {
 	line-height: 21pt;
 }
 
-h1 .editsection {
-	font-size: 55.6%;
-}
-
 h1#firstHeading {
 	padding-bottom: 0;
 	margin-bottom: 0;
@@ -197,8 +201,8 @@ input.mw-searchInput {
 
 
 #sitetitle, #sitesub, #toplinks, #linkcollection {
-	margin-top: 0; 
-	margin-bottom: 0; 
+	margin-top: 0;
+	margin-bottom: 0;
 }
 
 #sitetitle, #toplinks {
@@ -216,7 +220,7 @@ input.mw-searchInput {
 }
 #sitetitle a, #toplinks a {
 	color: white;
-	text-decoration: none; 
+	text-decoration: none;
 }
 /* Bring #sitetitle to top. Otherwise #toplinks is overlaid over it, making the link unclickable. */
 #sitetitle a {
@@ -263,6 +267,7 @@ input.mw-searchInput {
 	font-size: small;
 	margin-right: 8px;
 	text-align: right;
+	padding-left: 140px;
 }
 /* Override text justification (user preference), see bug 31990 */
 #linkcollection * {
diff --git a/skins/common/IEFixes.js b/skins/common/IEFixes.js
index dd999ed4..e35fcd1a 100644
--- a/skins/common/IEFixes.js
+++ b/skins/common/IEFixes.js
@@ -1,10 +1,17 @@
-// IE fixes javascript
+// IE fixes javascript loaded by wikibits.js for IE <= 6.0
+( function ( mw, $ ) {
 
-window.isMSIE55 = ( window.showModalDialog && window.clipboardData && window.createPopup );
-window.doneIETransform = undefined;
-window.doneIEAlphaFix = undefined;
+var doneIEAlphaFix, doneIETransform, expandedURLs, fixalpha, isMSIE55,
+	relativeforfloats, setrelative, hasClass;
 
-window.hookit = function() {
+// Also returns true for IE6, 7, 8, 9 and 10. createPopup is removed in IE11.
+// Good thing this is only loaded for IE <= 6 by wikibits.
+// Might as well set it to true.
+isMSIE55 = window.isMSIE55 = ( window.showModalDialog && window.clipboardData && window.createPopup );
+doneIETransform = window.doneIETransform = undefined;
+doneIEAlphaFix = window.doneIEAlphaFix = undefined;
+
+window.hookit = function () {
 	if ( !doneIETransform && document.getElementById && document.getElementById( 'bodyContent' ) ) {
 		doneIETransform = true;
 		relativeforfloats();
@@ -17,26 +24,27 @@ if ( document.attachEvent ) {
 }
 
 // png alpha transparency fixes
-window.fixalpha = function( logoId ) {
+fixalpha = window.fixalpha = function ( logoId ) {
 	// bg
 	if ( isMSIE55 && !doneIEAlphaFix ) {
-		var plogo = document.getElementById( logoId || 'p-logo' );
+		var bg, imageUrl, linkFix, logoa, logospan, plogo;
+		plogo = document.getElementById( logoId || 'p-logo' );
 		if ( !plogo ) {
 			return;
 		}
 
-		var logoa = plogo.getElementsByTagName('a')[0];
+		logoa = plogo.getElementsByTagName('a')[0];
 		if ( !logoa ) {
 			return;
 		}
 
-		var bg = logoa.currentStyle.backgroundImage;
-		var imageUrl = bg.substring( 5, bg.length - 2 );
+		bg = logoa.currentStyle.backgroundImage;
+		imageUrl = bg.substring( 5, bg.length - 2 );
 
 		doneIEAlphaFix = true;
 
-		if ( imageUrl.substr( imageUrl.length - 4 ).toLowerCase() == '.png' ) {
-			var logospan = logoa.appendChild( document.createElement( 'span' ) );
+		if ( imageUrl.substr( imageUrl.length - 4 ).toLowerCase() === '.png' ) {
+			logospan = logoa.appendChild( document.createElement( 'span' ) );
 
 			logoa.style.backgroundImage = 'none';
 			logospan.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=' + imageUrl + ')';
@@ -45,7 +53,7 @@ window.fixalpha = function( logoId ) {
 			logospan.style.width = logoa.currentStyle.width;
 			logospan.style.cursor = 'hand';
 			// Center image with hack for IE5.5
-			if ( document.documentElement.dir == 'rtl' ) {
+			if ( document.documentElement.dir === 'rtl' ) {
 				logospan.style.right = '50%';
 				logospan.style.setExpression( 'marginRight', '"-" + (this.offsetWidth / 2) + "px"' );
 			} else {
@@ -55,7 +63,7 @@ window.fixalpha = function( logoId ) {
 			logospan.style.top = '50%';
 			logospan.style.setExpression( 'marginTop', '"-" + (this.offsetHeight / 2) + "px"' );
 
-			var linkFix = logoa.appendChild( logoa.cloneNode() );
+			linkFix = logoa.appendChild( logoa.cloneNode() );
 			linkFix.style.position = 'absolute';
 			linkFix.style.height = '100%';
 			linkFix.style.width = '100%';
@@ -69,22 +77,23 @@ if ( isMSIE55 ) {
 }
 
 // fix ie6 disappering float bug
-window.relativeforfloats = function() {
-	var bc = document.getElementById( 'bodyContent' );
+relativeforfloats = window.relativeforfloats = function () {
+	var bc, tables, divs;
+	bc = document.getElementById( 'bodyContent' );
 	if ( bc ) {
-		var tables = bc.getElementsByTagName( 'table' );
-		var divs = bc.getElementsByTagName( 'div' );
+		tables = bc.getElementsByTagName( 'table' );
+		divs = bc.getElementsByTagName( 'div' );
 		setrelative( tables );
 		setrelative( divs );
 	}
 };
 
-window.setrelative = function( nodes ) {
+setrelative = window.setrelative = function ( nodes ) {
 	var i = 0;
 	while ( i < nodes.length ) {
-		if( ( ( nodes[i].style.float && nodes[i].style.float != ( 'none' ) ||
-			( nodes[i].align && nodes[i].align != ( 'none' ) ) ) &&
-			( !nodes[i].style.position || nodes[i].style.position != 'relative' ) ) )
+		if( ( ( nodes[i].style.float && nodes[i].style.float !== ( 'none' ) ||
+			( nodes[i].align && nodes[i].align !== ( 'none' ) ) ) &&
+			( !nodes[i].style.position || nodes[i].style.position !== 'relative' ) ) )
 		{
 			nodes[i].style.position = 'relative';
 		}
@@ -93,30 +102,31 @@ window.setrelative = function( nodes ) {
 };
 
 // Expand links for printing
-String.prototype.hasClass = function( classWanted ) {
-	var classArr = this.split(/\s/);
-	for ( var i = 0; i < classArr.length; i++ ) {
-		if ( classArr[i].toLowerCase() == classWanted.toLowerCase() ) {
+hasClass = function ( classText, classWanted ) {
+	var i = 0, classArr = classText.split(/\s/);
+	for ( i = 0; i < classArr.length; i++ ) {
+		if ( classArr[i].toLowerCase() === classWanted.toLowerCase() ) {
 			return true;
 		}
 	}
 	return false;
 };
 
-window.expandedURLs = undefined;
+expandedURLs = window.expandedURLs = undefined;
 
-window.onbeforeprint = function() {
-	expandedURLs = [];
+window.onbeforeprint = function () {
+	var allLinks, contentEl, expandedLink, expandedText, i;
 
-	var contentEl = document.getElementById( 'content' );
+	expandedURLs = [];
+	contentEl = document.getElementById( 'content' );
 
 	if ( contentEl ) {
-		var allLinks = contentEl.getElementsByTagName( 'a' );
+		allLinks = contentEl.getElementsByTagName( 'a' );
 
-		for ( var i = 0; i < allLinks.length; i++ ) {
-			if ( allLinks[i].className.hasClass( 'external' ) && !allLinks[i].className.hasClass( 'free' ) ) {
-				var expandedLink = document.createElement( 'span' );
-				var expandedText = document.createTextNode( ' (' + allLinks[i].href + ')' );
+		for ( i = 0; i < allLinks.length; i++ ) {
+			if ( hasClass( allLinks[i].className, 'external' ) && !hasClass( allLinks[i].className, 'free' ) ) {
+				expandedLink = document.createElement( 'span' );
+				expandedText = document.createTextNode( ' (' + allLinks[i].href + ')' );
 				expandedLink.appendChild( expandedText );
 				allLinks[i].parentNode.insertBefore( expandedLink, allLinks[i].nextSibling );
 				expandedURLs[i] = expandedLink;
@@ -132,3 +142,5 @@ window.onafterprint = function() {
 		}
 	}
 };
+
+}( mediaWiki, jQuery ) );
diff --git a/skins/common/ajax.js b/skins/common/ajax.js
index 121f9d12..ca74b384 100644
--- a/skins/common/ajax.js
+++ b/skins/common/ajax.js
@@ -1,15 +1,23 @@
-// remote scripting library
-// (c) copyright 2005 modernmethod, inc
-window.sajax_debug_mode = false;
-window.sajax_request_type = 'GET';
+/**
+ * Remote Scripting Library
+ * Copyright 2005 modernmethod, inc
+ * Under the open source BSD license
+ * http://www.modernmethod.com/sajax/
+ */
+
+/*jshint camelcase:false, onevar:false */
+/*global alert */
+( function ( mw ) {
 
 /**
- * if sajax_debug_mode is true, this function outputs given the message into 
- * the element with id = sajax_debug; if no such element exists in the document, 
+ * if sajax_debug_mode is true, this function outputs given the message into
+ * the element with id = sajax_debug; if no such element exists in the document,
  * it is injected.
  */
-window.sajax_debug = function(text) {
-	if (!sajax_debug_mode) return false;
+function debug( text ) {
+	if ( !window.sajax_debug_mode ) {
+		return false;
+	}
 
 	var e = document.getElementById( 'sajax_debug' );
 
@@ -33,36 +41,36 @@ window.sajax_debug = function(text) {
 	e.appendChild( m );
 
 	return true;
-};
+}
 
 /**
  * Compatibility wrapper for creating a new XMLHttpRequest object.
  */
-window.sajax_init_object = function() {
-	sajax_debug( 'sajax_init_object() called..' );
-	var A;
+function createXhr() {
+	debug( 'sajax_init_object() called..' );
+	var a;
 	try {
 		// Try the new style before ActiveX so we don't
 		// unnecessarily trigger warnings in IE 7 when
 		// set to prompt about ActiveX usage
-		A = new XMLHttpRequest();
-	} catch ( e ) {
+		a = new XMLHttpRequest();
+	} catch ( xhrE ) {
 		try {
-			A = new ActiveXObject( 'Msxml2.XMLHTTP' );
-		} catch ( e ) {
+			a = new window.ActiveXObject( 'Msxml2.XMLHTTP' );
+		} catch ( msXmlE ) {
 			try {
-				A = new ActiveXObject( 'Microsoft.XMLHTTP' );
-			} catch ( oc ) {
-				A = null;
+				a = new window.ActiveXObject( 'Microsoft.XMLHTTP' );
+			} catch ( msXhrE ) {
+				a = null;
 			}
 		}
 	}
-	if ( !A ) {
-		sajax_debug( 'Could not create connection object.' );
+	if ( !a ) {
+		debug( 'Could not create connection object.' );
 	}
 
-	return A;
-};
+	return a;
+}
 
 /**
  * Perform an AJAX call to MediaWiki. Calls are handled by AjaxDispatcher.php
@@ -80,13 +88,13 @@ window.sajax_init_object = function() {
  * (1, 2, 3) as the parameter list, and will show the result in the element
  * with id = showFoo
  */
-window.sajax_do_call = function(func_name, args, target) {
-	var i, x, n;
+function doAjaxRequest( func_name, args, target ) {
+	var i, x;
 	var uri;
 	var post_data;
 	uri = mw.util.wikiScript() + '?action=ajax';
-	if ( sajax_request_type == 'GET' ) {
-		if ( uri.indexOf( '?' ) == -1 ) {
+	if ( window.sajax_request_type === 'GET' ) {
+		if ( uri.indexOf( '?' ) === -1 ) {
 			uri = uri + '?rs=' + encodeURIComponent( func_name );
 		} else {
 			uri = uri + '&rs=' + encodeURIComponent( func_name );
@@ -102,47 +110,47 @@ window.sajax_do_call = function(func_name, args, target) {
 			post_data = post_data + '&rsargs[]=' + encodeURIComponent( args[i] );
 		}
 	}
-	x = sajax_init_object();
+	x = createXhr();
 	if ( !x ) {
 		alert( 'AJAX not supported' );
 		return false;
 	}
 
 	try {
-		x.open( sajax_request_type, uri, true );
+		x.open( window.sajax_request_type, uri, true );
 	} catch ( e ) {
-		if ( window.location.hostname == 'localhost' ) {
-			alert( "Your browser blocks XMLHttpRequest to 'localhost', try using a real hostname for development/testing." );
+		if ( location.hostname === 'localhost' ) {
+			alert( 'Your browser blocks XMLHttpRequest to "localhost", try using a real hostname for development/testing.' );
 		}
 		throw e;
 	}
-	if ( sajax_request_type == 'POST' ) {
+	if ( window.sajax_request_type === 'POST' ) {
 		x.setRequestHeader( 'Method', 'POST ' + uri + ' HTTP/1.1' );
 		x.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
 	}
 	x.setRequestHeader( 'Pragma', 'cache=yes' );
 	x.setRequestHeader( 'Cache-Control', 'no-transform' );
-	x.onreadystatechange = function() {
-		if ( x.readyState != 4 ) {
+	x.onreadystatechange = function () {
+		if ( x.readyState !== 4 ) {
 			return;
 		}
 
-		sajax_debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText );
+		debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText );
 
 		//if ( x.status != 200 )
 		//	alert( 'Error: ' + x.status + ' ' + x.statusText + ': ' + x.responseText );
 		//else
 
-		if ( typeof( target ) == 'function' ) {
+		if ( typeof target === 'function' ) {
 			target( x );
-		} else if ( typeof( target ) == 'object' ) {
-			if ( target.tagName == 'INPUT' ) {
-				if ( x.status == 200 ) {
+		} else if ( typeof target === 'object' ) {
+			if ( target.tagName === 'INPUT' ) {
+				if ( x.status === 200 ) {
 					target.value= x.responseText;
 				}
 				//else alert( 'Error: ' + x.status + ' ' + x.statusText + ' (' + x.responseText + ')' );
 			} else {
-				if ( x.status == 200 ) {
+				if ( x.status === 200 ) {
 					target.innerHTML = x.responseText;
 				} else {
 					target.innerHTML = '<div class="error">Error: ' + x.status +
@@ -150,24 +158,37 @@ window.sajax_do_call = function(func_name, args, target) {
 				}
 			}
 		} else {
-			alert( 'bad target for sajax_do_call: not a function or object: ' + target );
+			alert( 'Bad target for sajax_do_call: not a function or object: ' + target );
 		}
 	};
 
-	sajax_debug( func_name + ' uri = ' + uri + ' / post = ' + post_data );
+	debug( func_name + ' uri = ' + uri + ' / post = ' + post_data );
 	x.send( post_data );
-	sajax_debug( func_name + ' waiting..' );
-	delete x;
+	debug( func_name + ' waiting..' );
 
 	return true;
-};
+}
 
 /**
- * @return boolean whether the browser supports XMLHttpRequest
+ * @return {boolean} Whether the browser supports AJAX
  */
-window.wfSupportsAjax = function() {
-	var request = sajax_init_object();
+function wfSupportsAjax() {
+	var request = createXhr();
 	var supportsAjax = request ? true : false;
-	delete request;
+	request = undefined;
 	return supportsAjax;
-};
+}
+
+// Expose + Mark as deprecated
+var deprecationNotice = 'Sajax is deprecated, use jQuery.ajax or mediawiki.api instead.';
+
+// Variables
+mw.log.deprecate( window, 'sajax_debug_mode', false, deprecationNotice );
+mw.log.deprecate( window, 'sajax_request_type', 'GET', deprecationNotice );
+// Methods
+mw.log.deprecate( window, 'sajax_debug', debug, deprecationNotice );
+mw.log.deprecate( window, 'sajax_init_object', createXhr, deprecationNotice );
+mw.log.deprecate( window, 'sajax_do_call', doAjaxRequest, deprecationNotice );
+mw.log.deprecate( window, 'wfSupportsAjax', wfSupportsAjax, deprecationNotice );
+
+}( mediaWiki ) );
diff --git a/skins/common/commonContent.css b/skins/common/commonContent.css
index a550d97a..14d39b92 100644
--- a/skins/common/commonContent.css
+++ b/skins/common/commonContent.css
@@ -14,6 +14,43 @@
 	padding: 5px;
 	font-size: 95%;
 }
+
+/**
+ * We want to display the ToC element with intrinsic width in block mode. The fit-content
+ * value for width is however not supported by large groups of browsers.
+ *
+ * We use display:table. Even though it should only contain other table-* display
+ * elements, there are no known problems with using this.
+ *
+ * Because IE < 8, FF 2 and other older browsers don't support display:table, we fallback to
+ * using inline-block mode, which features at least intrinsic width, but won't clear preceding
+ * inline elements. In practice inline elements surrounding the TOC are uncommon enough that
+ * this is an acceptable sacrifice.
+ */
+#toc,
+.toc {
+	display: -moz-inline-block;
+	display: inline-block;
+	display: table;
+
+	/* IE7 and earlier */
+	zoom: 1;
+	*display: inline;
+
+	padding: 7px;
+}
+
+/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
+table#toc,
+table.toc {
+	border-collapse: collapse;
+}
+/* Remove additional paddings inside table-cells that are not present in <div>s */
+table#toc td,
+table.toc td {
+	padding: 0;
+}
+
 #toc h2,
 .toc h2 {
 	display: inline;
@@ -96,6 +133,7 @@ html .thumbcaption {
 div.magnify {
 	border: none !important;
 	background: none !important;
+	margin-left: 3px;
 }
 div.magnify a, div.magnify img {
 	display: block;
@@ -128,6 +166,13 @@ img.thumbborder {
 #userlogin, #userloginForm {
 	border: solid 1px #cccccc;
 	padding: 1.2em;
-	margin: .5em;
-	float: left;
+	margin: 0.5em;
+}
+
+#loginend {
+	margin: 0.5em;
+}
+
+#loginend table {
+	width: 100%;
 }
diff --git a/skins/common/commonElements.css b/skins/common/commonElements.css
index 2fa0cbaf..76ec4af7 100644
--- a/skins/common/commonElements.css
+++ b/skins/common/commonElements.css
@@ -86,15 +86,9 @@ h6 {
 h1 {
 	font-size: 188%;
 }
-h1 .editsection {
-	font-size: 53%;
-}
 h2 {
 	font-size: 150%;
 }
-h2 .editsection {
-	font-size: 67%;
-}
 h3,
 h4,
 h5,
@@ -105,28 +99,14 @@ h6 {
 h3 {
 	font-size: 132%;
 }
-h3 .editsection {
-	font-size: 76%;
-	font-weight: normal;
-}
 h4 {
 	font-size: 116%;
 }
-h4 .editsection {
-	font-size: 86%;
-	font-weight: normal; }
 h5 {
-	font-size: 100%;
-}
-h5 .editsection {
-	font-weight: normal;
+	font-size: 108%;
 }
 h6 {
-	font-size: 80%;
-}
-h6 .editsection {
-	font-size: 125%;
-	font-weight: normal;
+	font-size: 100%;
 }
 
 /* Some space under the headers in the content area */
@@ -198,7 +178,7 @@ code {
 }
 pre, .mw-code {
 	padding: 1em;
-	border: 1px dashed #2f6fab;
+	border: 1px solid #ddd;
 	color: black;
 	background-color: #f9f9f9;
 }
diff --git a/skins/common/commonPrint.css b/skins/common/commonPrint.css
index 6cb213f2..58628772 100644
--- a/skins/common/commonPrint.css
+++ b/skins/common/commonPrint.css
@@ -111,7 +111,7 @@ div#jump-to-nav,
 div.top,
 div#column-one,
 #colophon,
-.editsection,
+.mw-editsection,
 .toctoggle,
 .tochidden,
 div#f-poweredbyico,
@@ -127,6 +127,7 @@ tr.mw-metadata-show-hide-extended,
 span.mw-filepage-other-resolutions,
 #filetoc,
 .usermessage,
+.patrollink,
 #mw-navigation {
 	/* Hides all the elements irrelevant for printing */
 	display: none;
@@ -191,7 +192,7 @@ a:link, a:visited {
 #content a.external.text:after,
 #content a.external.autonumber:after {
 	/* Expand URLs for printing */
-	content: " (" attr(href) ") ";
+	content: " (" attr(href) ")";
 }
 
 #globalWrapper {
@@ -352,7 +353,7 @@ a.sortheader {
 .wikitable, .thumb, img {
 	page-break-inside: avoid;
 }
-h2, h3, h4, h5, h6, h7 {
+h2, h3, h4, h5, h6 {
 	page-break-after: avoid;
 }
 p {
diff --git a/skins/common/config.css b/skins/common/config.css
index 39206c3a..79780da9 100644
--- a/skins/common/config.css
+++ b/skins/common/config.css
@@ -88,7 +88,13 @@
 }
 
 .config-input-check {
-	margin-left: 10em;
+	margin-left: 3.7em;
+	margin-right: 2em;
+	margin-bottom: 0.25em;
+}
+
+.config-input-check input {
+	margin-left: -1em;
 }
 
 .error {
diff --git a/skins/common/config.js b/skins/common/config.js
index b1e28aba..fb8edc1f 100644
--- a/skins/common/config.js
+++ b/skins/common/config.js
@@ -1,5 +1,5 @@
 ( function ( $ ) {
-	$( document ).ready( function () {
+	$( function () {
 		var $label, labelText;
 
 		function syncText() {
@@ -25,7 +25,7 @@
 								.find( '.mw-help-field-data' )
 									.slideToggle( 'fast' );
 					} );
-		
+
 		// Show/hide code for DB-specific options
 		// FIXME: Do we want slow, fast, or even non-animated (instantaneous) showing/hiding here?
 		$( '.dbRadio' ).each( function () {
@@ -40,12 +40,12 @@
 				$wrapper.show( 'slow' );
 			}
 		} );
-		
+
 		// Scroll to the bottom of upgrade log
 		$( '#config-live-log' ).children( 'textarea' ).each( function () {
 			this.scrollTop = this.scrollHeight;
 		} );
-		
+
 		// Show/hide Creative Commons thingy
 		$( '.licenseRadio' ).click( function () {
 			var $wrapper = $( '#config-cc-wrapper' );
@@ -55,7 +55,7 @@
 				$wrapper.hide( 'slow' );
 			}
 		} );
-		
+
 		// Show/hide random stuff (email, upload)
 		$( '.showHideRadio' ).click( function () {
 			var $wrapper = $( '#' + $(this).attr( 'rel' ) );
@@ -88,7 +88,7 @@
 				$textbox.prop( 'readonly', true ).closest( '.config-block' ).slideUp( 'fast' );
 			}
 		} );
-		
+
 		// Synchronize radio button label for sitename with textbox
 		$label = $( 'label[for=config__NamespaceType_site-name]' );
 		labelText = $label.text();
@@ -97,7 +97,7 @@
 
 		// Show/Hide memcached servers when needed
 		$( 'input[name$="config_wgMainCacheType"]' ).change( function () {
-			var $memc = $( "#config-memcachewrapper" );
+			var $memc = $( '#config-memcachewrapper' );
 			if( $( 'input[name$="config_wgMainCacheType"]:checked' ).val() === 'memcached' ) {
 				$memc.show( 'slow' );
 			} else {
diff --git a/skins/common/images/Arr_u.png b/skins/common/images/Arr_u.png
index 6132836b..1aa543af 100644
Binary files a/skins/common/images/Arr_u.png and b/skins/common/images/Arr_u.png differ
diff --git a/skins/common/images/ar/button_headline.png b/skins/common/images/ar/button_headline.png
index 04fb8f11..398e5614 100644
Binary files a/skins/common/images/ar/button_headline.png and b/skins/common/images/ar/button_headline.png differ
diff --git a/skins/common/images/ar/button_nowiki.png b/skins/common/images/ar/button_nowiki.png
index 12b986b4..743ea61b 100644
Binary files a/skins/common/images/ar/button_nowiki.png and b/skins/common/images/ar/button_nowiki.png differ
diff --git a/skins/common/images/arrow_disabled_left_25.png b/skins/common/images/arrow_disabled_left_25.png
index 8f979aab..83df0684 100644
Binary files a/skins/common/images/arrow_disabled_left_25.png and b/skins/common/images/arrow_disabled_left_25.png differ
diff --git a/skins/common/images/arrow_disabled_right_25.png b/skins/common/images/arrow_disabled_right_25.png
index 11022f62..aa4fbf8c 100644
Binary files a/skins/common/images/arrow_disabled_right_25.png and b/skins/common/images/arrow_disabled_right_25.png differ
diff --git a/skins/common/images/arrow_right_25.png b/skins/common/images/arrow_right_25.png
index 9e1b550c..3f8fee38 100644
Binary files a/skins/common/images/arrow_right_25.png and b/skins/common/images/arrow_right_25.png differ
diff --git a/skins/common/images/button_hr.png b/skins/common/images/button_hr.png
index 19e4ad45..47e1ca40 100644
Binary files a/skins/common/images/button_hr.png and b/skins/common/images/button_hr.png differ
diff --git a/skins/common/images/button_nowiki.png b/skins/common/images/button_nowiki.png
index c647de2b..2ba818de 100644
Binary files a/skins/common/images/button_nowiki.png and b/skins/common/images/button_nowiki.png differ
diff --git a/skins/common/images/button_sig.png b/skins/common/images/button_sig.png
index ff7348a9..fe34b3fb 100644
Binary files a/skins/common/images/button_sig.png and b/skins/common/images/button_sig.png differ
diff --git a/skins/common/images/button_template.png b/skins/common/images/button_template.png
index 53b6f92f..94d9d0b9 100644
Binary files a/skins/common/images/button_template.png and b/skins/common/images/button_template.png differ
diff --git a/skins/common/images/critical-32.png b/skins/common/images/critical-32.png
index dce5667a..9b38e6a2 100644
Binary files a/skins/common/images/critical-32.png and b/skins/common/images/critical-32.png differ
diff --git a/skins/common/images/fa/button_nowiki.png b/skins/common/images/fa/button_nowiki.png
index 12b986b4..743ea61b 100644
Binary files a/skins/common/images/fa/button_nowiki.png and b/skins/common/images/fa/button_nowiki.png differ
diff --git a/skins/common/images/feed-icon.png b/skins/common/images/feed-icon.png
index 7188fa23..00f49f6c 100644
Binary files a/skins/common/images/feed-icon.png and b/skins/common/images/feed-icon.png differ
diff --git a/skins/common/images/icons/fileicon-psd.png b/skins/common/images/icons/fileicon-psd.png
index 5bd40cb0..598f190e 100644
Binary files a/skins/common/images/icons/fileicon-psd.png and b/skins/common/images/icons/fileicon-psd.png differ
diff --git a/skins/common/images/magnify-clip-rtl.png b/skins/common/images/magnify-clip-rtl.png
index cfddc279..ff85c077 100644
Binary files a/skins/common/images/magnify-clip-rtl.png and b/skins/common/images/magnify-clip-rtl.png differ
diff --git a/skins/common/images/question-small.png b/skins/common/images/question-small.png
new file mode 100644
index 00000000..f7405d26
Binary files /dev/null and b/skins/common/images/question-small.png differ
diff --git a/skins/common/images/question.svg b/skins/common/images/question.svg
new file mode 100644
index 00000000..27973053
--- /dev/null
+++ b/skins/common/images/question.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="21.059px" height="21.06px" viewBox="0 0 21.059 21.06" enable-background="new 0 0 21.059 21.06" xml:space="preserve">
+<path fill="#575757" d="M10.529,0C4.715,0,0,4.714,0,10.529s4.715,10.53,10.529,10.53c5.816,0,10.529-4.715,10.529-10.53
+	S16.346,0,10.529,0z M10.527,16.767c-0.861,0-1.498-0.688-1.498-1.516c0-0.862,0.637-1.534,1.498-1.534c0.828,0,1.5,0.672,1.5,1.534
+	C12.027,16.078,11.355,16.767,10.527,16.767z M12.664,10.255c-0.723,0.568-1,0.931-1,1.739v0.5H9.459v-0.603
+	c0-1.517,0.449-2.136,1.154-2.688c0.707-0.552,1.139-0.845,1.139-1.637c0-0.672-0.414-1.051-1.24-1.051
+	c-0.707,0-1.328,0.189-1.982,0.638L7.479,5.346c0.861-0.604,1.93-1.034,3.342-1.034c1.912,0,3.516,1.051,3.516,3.066
+	C14.336,8.808,13.543,9.566,12.664,10.255z"/>
+</svg>
diff --git a/skins/common/images/tick-32.png b/skins/common/images/tick-32.png
index dfde1707..34cfa9ce 100644
Binary files a/skins/common/images/tick-32.png and b/skins/common/images/tick-32.png differ
diff --git a/skins/common/images/warning-32.png b/skins/common/images/warning-32.png
index b14a8315..0400734c 100644
Binary files a/skins/common/images/warning-32.png and b/skins/common/images/warning-32.png differ
diff --git a/skins/common/oldshared.css b/skins/common/oldshared.css
index 6dcdf6f1..eea8b8ee 100644
--- a/skins/common/oldshared.css
+++ b/skins/common/oldshared.css
@@ -11,24 +11,15 @@
 h1 { font-size: 2em; }
 h2 { font-size: 1.5em; }
 h3 { font-size: 1.17em; }
-h5 { font-size: .83em; }
-h6 { font-size: .75em; }
+h4 { font-size: 1.11em; }
+h5 { font-size: 1.05em; }
+h6 { font-size: 1em; }
 h1, h2, h3, h4, h5, h6 {
 	font-weight: bolder;
 }
 
 /* Now the custom parts */
 
-/* Make edit sections (which are inside h# tags) normal-sized */
-.editsection {
-	font-weight: normal;
-}
-h1 .editsection { font-size: 50%; }
-h2 .editsection { font-size: 66.7%; }
-h3 .editsection { font-size: 85.5%; }
-h5 .editsection { font-size: 120%; }
-h6 .editsection { font-size: 133%; }
-
 #footer { clear: both }
 /* images */
 /* @noflip */
@@ -93,6 +84,7 @@ div.magnify {
 	float: right;
 	border: none !important;
 	background: none !important;
+	margin-left: 3px;
 }
 div.magnify a,
 div.magnify img {
@@ -130,6 +122,25 @@ img { border: none; }
 	padding: 5px;
 	font-size: 95%;
 	text-align: center;
+	display: -moz-inline-block;
+	display: inline-block;
+	display: table;
+
+	/* IE7 and earlier */
+	zoom: 1;
+	*display: inline;
+
+	padding: 7px;
+}
+/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
+table#toc,
+table.toc {
+	border-collapse: collapse;
+}
+/* Remove additional paddings inside table-cells that are not present in <div>s */
+table#toc td,
+table.toc td {
+	padding: 0;
 }
 #toc h2,
 .toc h2 {
@@ -161,9 +172,6 @@ img { border: none; }
 }
 
 /* preference page with js-genrated toc */
-#mw-pref-clear {
-	clear: both;
-}
 #preftoc {
 	float: left;
 	margin: 1em 1em 1em 1em;
@@ -283,7 +291,7 @@ li span.deleted {
 	font-style: italic;
 }
 
-/* Classes for EXIF data display */
+/* Classes for Exif data display */
 table.mw_metadata {
 	margin-left: 0.5em;
 }
@@ -458,4 +466,4 @@ html > body.rtl div#bodyContent ul#filetoc {
 	display: block;
 }
 
-/* RTL specific CSS ends here **/
\ No newline at end of file
+/* RTL specific CSS ends here **/
diff --git a/skins/common/protect.js b/skins/common/protect.js
index a23c0cbd..dc142ca9 100644
--- a/skins/common/protect.js
+++ b/skins/common/protect.js
@@ -1,6 +1,7 @@
+( function ( mw, $ ) {
 
-window.ProtectionForm = {
-	'existingMatch': false,
+var ProtectionForm = window.ProtectionForm = {
+	existingMatch: false,
 
 	/**
 	 * Set up the protection chaining interface (i.e. "unlock move permissions" checkbox)
@@ -12,40 +13,47 @@ window.ProtectionForm = {
 	 *     numTypes             The number of protection types
 	 *     existingMatch        True if all the existing expiry times match
 	 */
-	'init': function( opts ) {
-		if( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) )
+	init: function ( opts ) {
+		var box, boxbody, row, cell, check, label;
+
+		if ( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) ) {
 			return false;
+		}
 
-		var box = document.getElementById( opts.tableId );
-		if( !box )
+		box = document.getElementById( opts.tableId );
+		if ( !box ) {
 			return false;
-		
-		var boxbody = box.getElementsByTagName('tbody')[0];
-		var row = document.createElement( 'tr' );
+		}
+
+		boxbody = box.getElementsByTagName( 'tbody' )[0];
+		row = document.createElement( 'tr' );
 		boxbody.insertBefore( row, boxbody.firstChild.nextSibling );
 
 		this.existingMatch = opts.existingMatch;
 
-		var cell = document.createElement( 'td' );
+		cell = document.createElement( 'td' );
 		row.appendChild( cell );
 		// If there is only one protection type, there is nothing to chain
-		if( opts.numTypes > 1 ) {
-			var check = document.createElement( 'input' );
+		if ( opts.numTypes > 1 ) {
+			check = document.createElement( 'input' );
 			check.id = 'mwProtectUnchained';
 			check.type = 'checkbox';
-			cell.appendChild( check );
-			addClickHandler( check, function() { ProtectionForm.onChainClick(); } );
+			$( check ).click( function () {
+				ProtectionForm.onChainClick();
+			} );
 
-			cell.appendChild( document.createTextNode( ' ' ) );
-			var label = document.createElement( 'label' );
+			label = document.createElement( 'label' );
 			label.htmlFor = 'mwProtectUnchained';
 			label.appendChild( document.createTextNode( opts.labelText ) );
+
+			cell.appendChild( check );
+			cell.appendChild( document.createTextNode( ' ' ) );
 			cell.appendChild( label );
 
 			check.checked = !this.areAllTypesMatching();
 			this.enableUnchainedInputs( check.checked );
 		}
-		
+
 		$( '#mwProtect-reason' ).byteLimit( 180 );
 
 		this.updateCascadeCheckbox();
@@ -56,17 +64,19 @@ window.ProtectionForm = {
 	/**
 	 * Sets the disabled attribute on the cascade checkbox depending on the current selected levels
 	 */
-	'updateCascadeCheckbox': function() {
+	updateCascadeCheckbox: function () {
+		var i, lists, items, selected;
+
 		// For non-existent titles, there is no cascade option
-		if( !document.getElementById( 'mwProtect-cascade' ) ) {
+		if ( !document.getElementById( 'mwProtect-cascade' ) ) {
 			return;
 		}
-		var lists = this.getLevelSelectors();
-		for( var i = 0; i < lists.length; i++ ) {
-			if( lists[i].selectedIndex > -1 ) {
-				var items = lists[i].getElementsByTagName( 'option' );
-				var selected = items[ lists[i].selectedIndex ].value;
-				if( !this.isCascadeableLevel(selected) ) {
+		lists = this.getLevelSelectors();
+		for ( i = 0; i < lists.length; i++ ) {
+			if ( lists[i].selectedIndex > -1 ) {
+				items = lists[i].getElementsByTagName( 'option' );
+				selected = items[ lists[i].selectedIndex ].value;
+				if ( !this.isCascadeableLevel( selected ) ) {
 					document.getElementById( 'mwProtect-cascade' ).checked = false;
 					document.getElementById( 'mwProtect-cascade' ).disabled = true;
 					return;
@@ -81,7 +91,7 @@ window.ProtectionForm = {
 	 * @param level {String}
 	 * @return {Boolean}
 	 */
-	'isCascadeableLevel': function( level ) {
+	isCascadeableLevel: function (  level ) {
 		var cascadeLevels, len, i;
 
 		cascadeLevels = mw.config.get( 'wgCascadeableLevels' );
@@ -102,9 +112,10 @@ window.ProtectionForm = {
 	 *
 	 * @param source Element Level selector that changed
 	 */
-	'updateLevels': function(source) {
-		if( !this.isUnchained() )
+	updateLevels: function ( source ) {
+		if ( !this.isUnchained() ) {
 			this.setAllSelectors( source.selectedIndex );
+		}
 		this.updateCascadeCheckbox();
 	},
 
@@ -115,22 +126,24 @@ window.ProtectionForm = {
 	 * @param source Element expiry input that changed
 	 */
 
-	'updateExpiry': function(source) {
-		if( !this.isUnchained() ) {
-			var expiry = source.value;
-			this.forEachExpiryInput(function(element) {
+	updateExpiry: function ( source ) {
+		var expiry, listId, list;
+
+		if ( !this.isUnchained() ) {
+			expiry = source.value;
+			this.forEachExpiryInput( function ( element ) {
 				element.value = expiry;
-			});
+			} );
 		}
-		var listId = source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' );
-		var list = document.getElementById( listId );
-		if (list && list.value != 'othertime' ) {
+		listId = source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' );
+		list = document.getElementById( listId );
+		if ( list && list.value !== 'othertime' ) {
 			if ( this.isUnchained() ) {
 				list.value = 'othertime';
 			} else {
-				this.forEachExpirySelector(function(element) {
+				this.forEachExpirySelector( function ( element ) {
 					element.value = 'othertime';
-				});
+				} );
 			}
 		}
 	},
@@ -141,15 +154,16 @@ window.ProtectionForm = {
 	 *
 	 * @param source Element expiry selector that changed
 	 */
-	'updateExpiryList': function(source) {
-		if( !this.isUnchained() ) {
-			var expiry = source.value;
-			this.forEachExpirySelector(function(element) {
+	updateExpiryList: function ( source ) {
+		var expiry;
+		if ( !this.isUnchained() ) {
+			expiry = source.value;
+			this.forEachExpirySelector( function ( element ) {
 				element.value = expiry;
-			});
-			this.forEachExpiryInput(function(element) {
+			} );
+			this.forEachExpiryInput( function ( element ) {
 				element.value = '';
-			});
+			} );
 		}
 	},
 
@@ -157,8 +171,8 @@ window.ProtectionForm = {
 	 * Update chain status and enable/disable various bits of the UI
 	 * when the user changes the "unlock move permissions" checkbox
 	 */
-	'onChainClick': function() {
-		if( this.isUnchained() ) {
+	onChainClick: function () {
+		if ( this.isUnchained() ) {
 			this.enableUnchainedInputs( true );
 		} else {
 			this.setAllSelectors( this.getMaxLevel() );
@@ -170,16 +184,17 @@ window.ProtectionForm = {
 	/**
 	 * Returns true if the named attribute in all objects in the given array are matching
 	 */
-	'matchAttribute' : function( objects, attrName ) {
-		var value = null;
+	matchAttribute: function ( objects, attrName ) {
+		var i, element, value;
 
 		// Check levels
-		for ( var i = 0; i < objects.length; i++ ) {
-			var element = objects[i];
-			if ( value == null ) {
+		value = null;
+		for ( i = 0; i < objects.length; i++ ) {
+			element = objects[i];
+			if ( value === null ) {
 				value = element[attrName];
 			} else {
-				if ( value != element[attrName] ) {
+				if ( value !== element[attrName] ) {
 					return false;
 				}
 			}
@@ -192,7 +207,7 @@ window.ProtectionForm = {
 	 *
 	 * @return boolean
 	 */
-	'areAllTypesMatching': function() {
+	areAllTypesMatching: function () {
 		return this.existingMatch
 			&& this.matchAttribute( this.getLevelSelectors(), 'selectedIndex' )
 			&& this.matchAttribute( this.getExpirySelectors(), 'selectedIndex' )
@@ -204,7 +219,7 @@ window.ProtectionForm = {
 	 *
 	 * @return bool
 	 */
-	'isUnchained': function() {
+	isUnchained: function () {
 		var element = document.getElementById( 'mwProtectUnchained' );
 		return element
 			? element.checked
@@ -214,13 +229,13 @@ window.ProtectionForm = {
 	/**
 	 * Find the highest protection level in any selector
 	 */
-	'getMaxLevel': function() {
+	getMaxLevel: function () {
 		var maxIndex = -1;
-		this.forEachLevelSelector(function(element) {
-			if (element.selectedIndex > maxIndex) {
+		this.forEachLevelSelector( function ( element ) {
+			if ( element.selectedIndex > maxIndex ) {
 				maxIndex = element.selectedIndex;
 			}
-		});
+		} );
 		return maxIndex;
 	},
 
@@ -229,12 +244,12 @@ window.ProtectionForm = {
 	 *
 	 * @param index int Protection level
 	 */
-	'setAllSelectors': function(index) {
-		this.forEachLevelSelector(function(element) {
-			if (element.selectedIndex != index) {
+	setAllSelectors: function ( index ) {
+		this.forEachLevelSelector( function ( element ) {
+			if ( element.selectedIndex !== index ) {
 				element.selectedIndex = index;
 			}
-		});
+		} );
 	},
 
 	/**
@@ -242,10 +257,12 @@ window.ProtectionForm = {
 	 *
 	 * @param func callable Callback function
 	 */
-	'forEachLevelSelector': function(func) {
-		var selectors = this.getLevelSelectors();
-		for (var i = 0; i < selectors.length; i++) {
-			func(selectors[i]);
+	forEachLevelSelector: function ( func ) {
+		var i, selectors;
+
+		selectors = this.getLevelSelectors();
+		for ( i = 0; i < selectors.length; i++ ) {
+			func( selectors[i] );
 		}
 	},
 
@@ -254,12 +271,14 @@ window.ProtectionForm = {
 	 *
 	 * @return Array
 	 */
-	'getLevelSelectors': function() {
-		var all = document.getElementsByTagName("select");
-		var ours = [];
-		for (var i = 0; i < all.length; i++) {
-			var element = all[i];
-			if (element.id.match(/^mwProtect-level-/)) {
+	getLevelSelectors: function () {
+		var i, ours, all, element;
+
+		all = document.getElementsByTagName( 'select' );
+		ours = [];
+		for ( i = 0; i < all.length; i++ ) {
+			element = all[i];
+			if ( element.id.match( /^mwProtect-level-/ ) ) {
 				ours[ours.length] = element;
 			}
 		}
@@ -271,10 +290,12 @@ window.ProtectionForm = {
 	 *
 	 * @param func callable Callback function
 	 */
-	'forEachExpiryInput': function(func) {
-		var inputs = this.getExpiryInputs();
-		for (var i = 0; i < inputs.length; i++) {
-			func(inputs[i]);
+	forEachExpiryInput: function ( func ) {
+		var i, inputs;
+
+		inputs = this.getExpiryInputs();
+		for ( i = 0; i < inputs.length; i++ ) {
+			func( inputs[i] );
 		}
 	},
 
@@ -283,12 +304,14 @@ window.ProtectionForm = {
 	 *
 	 * @return Array
 	 */
-	'getExpiryInputs': function() {
-		var all = document.getElementsByTagName("input");
-		var ours = [];
-		for (var i = 0; i < all.length; i++) {
-			var element = all[i];
-			if (element.name.match(/^mwProtect-expiry-/)) {
+	getExpiryInputs: function () {
+		var i, all, element, ours;
+
+		all = document.getElementsByTagName( 'input' );
+		ours = [];
+		for ( i = 0; i < all.length; i++ ) {
+			element = all[i];
+			if ( element.name.match( /^mwProtect-expiry-/ ) ) {
 				ours[ours.length] = element;
 			}
 		}
@@ -299,10 +322,12 @@ window.ProtectionForm = {
 	 * Apply a callback to each expiry selector list
 	 * @param func callable Callback function
 	 */
-	'forEachExpirySelector': function(func) {
-		var inputs = this.getExpirySelectors();
-		for (var i = 0; i < inputs.length; i++) {
-			func(inputs[i]);
+	forEachExpirySelector: function ( func ) {
+		var i, inputs;
+
+		inputs = this.getExpirySelectors();
+		for ( i = 0; i < inputs.length; i++ ) {
+			func( inputs[i] );
 		}
 	},
 
@@ -311,12 +336,14 @@ window.ProtectionForm = {
 	 *
 	 * @return Array
 	 */
-	'getExpirySelectors': function() {
-		var all = document.getElementsByTagName("select");
-		var ours = [];
-		for (var i = 0; i < all.length; i++) {
-			var element = all[i];
-			if (element.id.match(/^mwProtectExpirySelection-/)) {
+	getExpirySelectors: function () {
+		var i, all, ours, element;
+
+		all = document.getElementsByTagName( 'select' );
+		ours = [];
+		for ( i = 0; i < all.length; i++ ) {
+			element = all[i];
+			if ( element.id.match( /^mwProtectExpirySelection-/ ) ) {
 				ours[ours.length] = element;
 			}
 		}
@@ -328,30 +355,33 @@ window.ProtectionForm = {
 	 *
 	 * @param val boolean Enable?
 	 */
-	'enableUnchainedInputs': function(val) {
+	enableUnchainedInputs: function ( val ) {
 		var first = true;
-		this.forEachLevelSelector(function(element) {
-			if (first) {
+
+		this.forEachLevelSelector( function ( element ) {
+			if ( first ) {
 				first = false;
 			} else {
 				element.disabled = !val;
 			}
-		});
+		} );
 		first = true;
-		this.forEachExpiryInput(function(element) {
-			if (first) {
+		this.forEachExpiryInput( function ( element ) {
+			if ( first ) {
 				first = false;
 			} else {
 				element.disabled = !val;
 			}
-		});
+		} );
 		first = true;
-		this.forEachExpirySelector(function(element) {
-			if (first) {
+		this.forEachExpirySelector( function ( element ) {
+			if ( first ) {
 				first = false;
 			} else {
 				element.disabled = !val;
 			}
-		});
+		} );
 	}
 };
+
+}( mediaWiki, jQuery ) );
diff --git a/skins/common/shared.css b/skins/common/shared.css
index 6e1c94fd..ac7265a8 100644
--- a/skins/common/shared.css
+++ b/skins/common/shared.css
@@ -59,9 +59,8 @@ input[dir="rtl"] {
 }
 
 /* Default style for semantic tags */
-abbr,
-acronym,
-.explain {
+abbr[title],
+.explain[title] {
 	border-bottom: 1px dotted;
 	cursor: help;
 }
@@ -127,21 +126,6 @@ span.texhtml {
 	cursor: pointer;
 }
 
-/* Edit section links */
-/* Correct directionality when page dir is different from site/user dir */
-/* @noflip */
-.mw-content-ltr .editsection,
-.mw-content-rtl .mw-content-ltr .editsection {
-	float: right;
-	margin-left: 5px;
-}
-/* @noflip */
-.mw-content-rtl .editsection,
-.mw-content-ltr .mw-content-rtl .editsection {
-	float: left;
-	margin-right: 5px;
-}
-
 /**
  * File description page
  */
@@ -235,6 +219,32 @@ td.mw-label {
 .prefsection table.mw-htmlform-matrix {
 	width: auto;
 }
+
+.mw-icon-question {
+	/* @embed */
+	background: url('images/question-small.png') no-repeat;
+	/* SVG support using a transparent gradient to guarantee cross-browser
+	 * compatibility (browsers able to understand gradient syntax support also SVG)
+	 * lifted from #pt-login css rule in skins/vector/screen.css */
+	/* @embed */
+	background: -webkit-linear-gradient(transparent, transparent), url('images/question.svg') no-repeat;
+	/* @embed */
+	background: linear-gradient(transparent, transparent), url('images/question.svg') no-repeat;
+	background-size: 13px 13px;
+	display: inline-block;
+	height: 13px;
+	width: 13px;
+	margin-left: 4px;
+}
+
+.mw-icon-question:lang(ar),
+.mw-icon-question:lang(fa),
+.mw-icon-question:lang(ur) {
+	-webkit-transform: scaleX(-1);
+	-ms-transform: scaleX(-1);
+	transform: scaleX(-1);
+}
+
 td.mw-submit {
 	white-space: nowrap;
 }
@@ -525,49 +535,57 @@ table.collapsed tr.collapsable {
 }
 
 /* success and error messages */
+.error,
+.warning,
 .success {
-	color: green;
 	font-size: larger;
 }
+.error {
+	color: #cc0000;
+}
 .warning {
-	color: #FFA500; /* orange */
-	font-size: larger;
+	color: #705000;
 }
-.error {
-	color: red;
-	font-size: larger;
+.success {
+	color: #009000;
 }
+
 .errorbox,
 .warningbox,
 .successbox {
-	font-size: larger;
-	border: 2px solid;
+	border: 1px solid;
 	padding: .5em 1em;
-	float: left;
-	margin-bottom: 2em;
-	color: #000;
-}
-.errorbox {
-	border-color: red;
-	background-color: #fff2f2;
-}
-.warningbox {
-	border-color: #FF8C00; /* darkorange */
-	background-color: #FFFFC0;
-}
-.successbox {
-	border-color: green;
-	background-color: #dfd;
+	margin-bottom: 1em;
+	display: -moz-inline-block;
+	display: inline-block;
+	zoom: 1;
+	*display: inline;
 }
 .errorbox h2,
 .warningbox h2,
 .successbox h2 {
 	font-size: 1em;
+	color: inherit;
 	font-weight: bold;
 	display: inline;
 	margin: 0 .5em 0 0;
 	border: none;
 }
+.errorbox {
+	color: #cc0000;
+	border-color: #fac5c5;
+	background-color: #fae3e3;
+}
+.warningbox {
+	color: #705000;
+	border-color: #fde29b;
+	background-color: #fdf1d1;
+}
+.successbox {
+	color: #009000;
+	border-color: #b7fdb5;
+	background-color: #e1fddf;
+}
 
 /* general info/warning box for SP */
 .mw-infobox {
@@ -684,7 +702,7 @@ ul#filetoc {
 	padding-right: 2em;
 }
 
-/* Classes for EXIF data display */
+/* Classes for Exif data display */
 table.mw_metadata {
 	font-size: 0.8em;
 	margin-left: 0.5em;
@@ -818,6 +836,69 @@ div.gallerytext {
 	word-wrap: break-word;
 }
 
+/* new gallery stuff */
+ul.mw-gallery-nolines li.gallerybox div.thumb {
+	background-color: transparent;
+	border: none;
+}
+
+ul.mw-gallery-nolines li.gallerybox div.gallerytext {
+	text-align: center;
+}
+
+/* height constrained gallery */
+
+ul.mw-gallery-packed li.gallerybox div.thumb,
+ul.mw-gallery-packed-overlay li.gallerybox div.thumb,
+ul.mw-gallery-packed-hover li.gallerybox div.thumb {
+	background-color: transparent;
+	border: none;
+}
+ul.mw-gallery-packed li.gallerybox div.thumb img,
+ul.mw-gallery-packed-overlay li.gallerybox div.thumb img,
+ul.mw-gallery-packed-hover li.gallerybox div.thumb img {
+	margin: 0 auto;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox,
+ul.mw-gallery-packed-overlay li.gallerybox {
+	position:relative;
+}
+
+ul.mw-gallery-packed-hover div.gallerytextwrapper {
+	overflow: hidden;
+	height: 0;
+}
+
+ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
+ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
+ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
+	position:absolute;
+	opacity:.8;
+	filter:alpha(opacity=80);
+	zoom: 1;
+	background-color:white;
+	padding: 5px 10px;
+	bottom: 0;
+	left: 0; /* Needed for IE */
+	height: auto;
+	font-weight: bold;
+	margin: 2px; /* correspond to style on div.thumb */
+}
+
+ul.mw-gallery-packed-hover,
+ul.mw-gallery-packed-overlay,
+ul.mw-gallery-packed {
+	text-align: center;
+}
+
+ul.mw-gallery-packed-hover div.gallerytext,
+ul.mw-gallery-packed-overlay div.gallerytext {
+	opacity: 1;
+	position: relative; /* Resets opacity in old IE */
+}
+
+
 .mw-ajax-loader {
 	/* @embed */
 	background-image: url(images/ajax-loader.gif);
@@ -1033,6 +1114,7 @@ ol:lang(or) li {
 	direction: ltr;
 	unicode-bidi: embed;
 }
+.diff-multi,
 .diff-otitle,
 .diff-ntitle,
 .diff-lineno {
@@ -1092,9 +1174,37 @@ table.floatleft {
 	z-index: 99;
 }
 
-.editsection, .toctoggle {
+.mw-editsection,
+.toctoggle {
 	-moz-user-select: none;
 	-webkit-user-select: none;
 	-ms-user-select: none;
 	user-select: none;
 }
+
+/* Display editsection links smaller and next to headings */
+.mw-editsection {
+	font-size: small;
+	font-weight: normal;
+	margin-left: 1em;
+	vertical-align: baseline;
+	/* Reset line-height; headings tend to have it set to larger values */
+	line-height: 1em;
+	/* As .mw-editsection is a <span> (inline element), it is treated as part */
+	/* of the heading content when selecting text by multiple clicks and thus */
+	/* selected together with heading content, despite the user-select: none; */
+	/* rule set above. This enforces non-selection without changing the look. */
+	display: inline-block;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+/* @noflip */
+.mw-content-ltr .mw-editsection,
+.mw-content-rtl .mw-content-ltr .mw-editsection {
+	margin-left: 1em;
+}
+/* @noflip */
+.mw-content-rtl .mw-editsection,
+.mw-content-ltr .mw-content-rtl .mw-editsection {
+	margin-right: 1em;
+}
diff --git a/skins/common/upload.js b/skins/common/upload.js
index df819e19..d639f63a 100644
--- a/skins/common/upload.js
+++ b/skins/common/upload.js
@@ -1,12 +1,15 @@
+/*jshint camelcase:false */
 ( function ( mw, $ ) {
-var	ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
-	fileExtensions = mw.config.get( 'wgFileExtensions' );
-
-window.licenseSelectorCheck = function() {
-	var selector = document.getElementById( "wpLicense" );
-	var selection = selector.options[selector.selectedIndex].value;
-	if( selector.selectedIndex > 0 ) {
-		if( selection == "" ) {
+var	licenseSelectorCheck, wgUploadWarningObj, wgUploadLicenseObj, fillDestFilename,
+	ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
+	fileExtensions = mw.config.get( 'wgFileExtensions' ),
+	$spinnerDestCheck, $spinnerLicense;
+
+licenseSelectorCheck = window.licenseSelectorCheck = function () {
+	var selector = document.getElementById( 'wpLicense' ),
+		selection = selector.options[selector.selectedIndex].value;
+	if ( selector.selectedIndex > 0 ) {
+		if ( !selection ) {
 			// Option disabled, but browser is broken and doesn't respect this
 			selector.selectedIndex = 0;
 		}
@@ -17,23 +20,29 @@ window.licenseSelectorCheck = function() {
 
 function uploadSetup() {
 	// Disable URL box if the URL copy upload source type is not selected
-	var e = document.getElementById( 'wpSourceTypeurl' );
-	if( e ) {
-		if( !e.checked ) {
-			var ein = document.getElementById( 'wpUploadFileURL' );
-			if(ein)
-				ein.setAttribute( 'disabled', 'disabled' );
+	var ein,
+		selector, ua, isMacIe, i,
+		optionsTable, row, td,
+		wpLicense, wpLicenseRow, wpLicenseTbody,
+		uploadSourceIds, len, onchange,
+		e = document.getElementById( 'wpSourceTypeurl' );
+	if ( e ) {
+		if ( !e.checked ) {
+			ein = document.getElementById( 'wpUploadFileURL' );
+			if ( ein ) {
+				ein.disabled = true;
+			}
 		}
 	}
 
 	// For MSIE/Mac: non-breaking spaces cause the <option> not to render.
 	// But for some reason, setting the text to itself works
-	var selector = document.getElementById("wpLicense");
-	if (selector) {
-		var ua = navigator.userAgent;
-		var isMacIe = (ua.indexOf("MSIE") != -1) && (ua.indexOf("Mac") != -1);
-		if (isMacIe) {
-			for (var i = 0; i < selector.options.length; i++) {
+	selector = document.getElementById( 'wpLicense' );
+	if ( selector ) {
+		ua = navigator.userAgent;
+		isMacIe = ua.indexOf( 'MSIE' ) !== -1 && ua.indexOf( 'Mac' ) !== -1;
+		if ( isMacIe ) {
+			for ( i = 0; i < selector.options.length; i++ ) {
 				selector.options[i].text = selector.options[i].text;
 			}
 		}
@@ -43,31 +52,31 @@ function uploadSetup() {
 	if ( ajaxUploadDestCheck ) {
 		// Insert an event handler that fetches upload warnings when wpDestFile
 		// has been changed
-		document.getElementById( 'wpDestFile' ).onchange = function ( e ) {
-			wgUploadWarningObj.checkNow(this.value);
+		document.getElementById( 'wpDestFile' ).onchange = function () {
+			wgUploadWarningObj.checkNow( this.value );
 		};
 		// Insert a row where the warnings will be displayed just below the
 		// wpDestFile row
-		var optionsTable = document.getElementById( 'mw-htmlform-description' ).tBodies[0];
-		var row = optionsTable.insertRow( 1 );
-		var td = document.createElement( 'td' );
+		optionsTable = document.getElementById( 'mw-htmlform-description' ).tBodies[0];
+		row = optionsTable.insertRow( 1 );
+		td = document.createElement( 'td' );
 		td.id = 'wpDestFile-warning';
 		td.colSpan = 2;
 
 		row.appendChild( td );
 	}
 
-	var wpLicense = document.getElementById( 'wpLicense' );
+	wpLicense = document.getElementById( 'wpLicense' );
 	if ( mw.config.get( 'wgAjaxLicensePreview' ) && wpLicense ) {
 		// License selector check
 		wpLicense.onchange = licenseSelectorCheck;
 
 		// License selector table row
-		var wpLicenseRow = wpLicense.parentNode.parentNode;
-		var wpLicenseTbody = wpLicenseRow.parentNode;
+		wpLicenseRow = wpLicense.parentNode.parentNode;
+		wpLicenseTbody = wpLicenseRow.parentNode;
 
-		var row = document.createElement( 'tr' );
-		var td = document.createElement( 'td' );
+		row = document.createElement( 'tr' );
+		td = document.createElement( 'td' );
 		row.appendChild( td );
 		td = document.createElement( 'td' );
 		td.id = 'mw-license-preview';
@@ -78,156 +87,185 @@ function uploadSetup() {
 
 
 	// fillDestFile setup
-	var	i,
-		uploadSourceIds = mw.config.get( 'wgUploadSourceIds' ),
-		len = uploadSourceIds.length;
-	for ( i = 0; i < len; i += 1 )
-		document.getElementById( uploadSourceIds[i] ).onchange = function (e) {
-			fillDestFilename( this.id );
-		};
-};
+	uploadSourceIds = mw.config.get( 'wgUploadSourceIds' );
+	len = uploadSourceIds.length;
+	onchange = function () {
+		fillDestFilename( this.id );
+	};
+	for ( i = 0; i < len; i += 1 ) {
+		document.getElementById( uploadSourceIds[i] ).onchange = onchange;
+	}
+}
 
+wgUploadWarningObj = window.wgUploadWarningObj = {
+	responseCache: { '' : '&nbsp;' },
+	nameToCheck: '',
+	typing: false,
+	delay: 500, // ms
+	timeoutID: false,
 
-window.wgUploadWarningObj = {
-	'responseCache' : { '' : '&nbsp;' },
-	'nameToCheck' : '',
-	'typing': false,
-	'delay': 500, // ms
-	'timeoutID': false,
+	keypress: function () {
+		var cached, destFile, warningElt;
 
-	'keypress': function () {
-		if ( !ajaxUploadDestCheck || !sajax_init_object() ) return;
+		if ( !ajaxUploadDestCheck ) {
+			return;
+		}
 
 		// Find file to upload
-		var destFile = document.getElementById('wpDestFile');
-		var warningElt = document.getElementById( 'wpDestFile-warning' );
-		if ( !destFile || !warningElt ) return ;
+		destFile = document.getElementById( 'wpDestFile' );
+		warningElt = document.getElementById( 'wpDestFile-warning' );
+		if ( !destFile || !warningElt ) {
+			return;
+		}
 
-		this.nameToCheck = destFile.value ;
+		this.nameToCheck = destFile.value;
 
 		// Clear timer
 		if ( this.timeoutID ) {
-			window.clearTimeout( this.timeoutID );
+			clearTimeout( this.timeoutID );
 		}
 		// Check response cache
-		for (cached in this.responseCache) {
-			if (this.nameToCheck == cached) {
+		for ( cached in this.responseCache ) {
+			if ( this.nameToCheck === cached ) {
 				this.setWarning(this.responseCache[this.nameToCheck]);
 				return;
 			}
 		}
 
-		this.timeoutID = window.setTimeout( 'wgUploadWarningObj.timeout()', this.delay );
+		this.timeoutID = setTimeout( function () {
+			wgUploadWarningObj.timeout();
+		}, this.delay );
 	},
 
-	'checkNow': function (fname) {
-		if ( !ajaxUploadDestCheck || !sajax_init_object() ) return;
+	checkNow: function ( fname ) {
+		if ( !ajaxUploadDestCheck ) {
+			return;
+		}
 		if ( this.timeoutID ) {
-			window.clearTimeout( this.timeoutID );
+			clearTimeout( this.timeoutID );
 		}
 		this.nameToCheck = fname;
 		this.timeout();
 	},
 
-	'timeout' : function() {
-		if ( !ajaxUploadDestCheck || !sajax_init_object() ) return;
-		injectSpinner( document.getElementById( 'wpDestFile' ), 'destcheck' );
-
-		// Get variables into local scope so that they will be preserved for the
-		// anonymous callback. fileName is copied so that multiple overlapping
-		// ajax requests can be supported.
-		var obj = this;
-		var fileName = this.nameToCheck;
-		sajax_do_call( 'SpecialUpload::ajaxGetExistsWarning', [this.nameToCheck],
-			function (result) {
-				obj.processResult(result, fileName)
+	timeout: function () {
+		if ( !ajaxUploadDestCheck || this.nameToCheck === '' ) {
+			return;
+		}
+		$spinnerDestCheck = $.createSpinner().insertAfter( '#wpDestFile' );
+
+		var uploadWarningObj = this;
+		( new mw.Api() ).get( {
+			action: 'query',
+			titles: ( new mw.Title( this.nameToCheck, mw.config.get( 'wgNamespaceIds' ).file ) ).getPrefixedText(),
+			prop: 'imageinfo',
+			iiprop: 'uploadwarning',
+			indexpageids: ''
+		} ).done( function ( result ) {
+			var resultOut = '';
+			if ( result.query ) {
+				resultOut = result.query.pages[result.query.pageids[0]].imageinfo[0];
 			}
-		);
+			uploadWarningObj.processResult( resultOut, uploadWarningObj.nameToCheck );
+		} );
 	},
 
-	'processResult' : function (result, fileName) {
-		removeSpinner( 'destcheck' );
-		this.setWarning(result.responseText);
-		this.responseCache[fileName] = result.responseText;
+	processResult: function ( result, fileName ) {
+		$spinnerDestCheck.remove();
+		$spinnerDestCheck = undefined;
+		this.setWarning( result.html );
+		this.responseCache[fileName] = result.html;
 	},
 
-	'setWarning' : function (warning) {
-		var warningElt = document.getElementById( 'wpDestFile-warning' );
-		var ackElt = document.getElementsByName( 'wpDestFileWarningAck' );
+	setWarning: function ( warning ) {
+		var warningElt = document.getElementById( 'wpDestFile-warning' ),
+			ackElt = document.getElementsByName( 'wpDestFileWarningAck' );
 
-		this.setInnerHTML(warningElt, warning);
+		this.setInnerHTML( warningElt, warning );
 
 		// Set a value in the form indicating that the warning is acknowledged and
 		// doesn't need to be redisplayed post-upload
-		if ( warning == '' || warning == '&nbsp;' ) {
+		if ( !warning ) {
 			ackElt[0].value = '';
 		} else {
 			ackElt[0].value = '1';
 		}
 
 	},
-	'setInnerHTML' : function (element, text) {
+	setInnerHTML: function ( element, text ) {
 		// Check for no change to avoid flicker in IE 7
-		if (element.innerHTML != text) {
+		if ( element.innerHTML !== text ) {
 			element.innerHTML = text;
 		}
 	}
 };
 
-window.fillDestFilename = function(id) {
+fillDestFilename = window.fillDestFilename = function ( id ) {
+	var e, path, slash, backslash, fname,
+		found, ext, i,
+		destFile;
 	if ( !mw.config.get( 'wgUploadAutoFill' ) ) {
 		return;
 	}
-	if (!document.getElementById) {
+	if ( !document.getElementById ) {
 		return;
 	}
 	// Remove any previously flagged errors
-	var e = document.getElementById( 'mw-upload-permitted' );
-	if( e ) e.className = '';
+	e = document.getElementById( 'mw-upload-permitted' );
+	if ( e ) {
+		e.className = '';
+	}
 
-	var e = document.getElementById( 'mw-upload-prohibited' );
-	if( e ) e.className = '';
+	e = document.getElementById( 'mw-upload-prohibited' );
+	if ( e ) {
+		e.className = '';
+	}
 
-	var path = document.getElementById(id).value;
+	path = document.getElementById( id ).value;
 	// Find trailing part
-	var slash = path.lastIndexOf('/');
-	var backslash = path.lastIndexOf('\\');
-	var fname;
-	if (slash == -1 && backslash == -1) {
+	slash = path.lastIndexOf( '/' );
+	backslash = path.lastIndexOf( '\\' );
+	if ( slash === -1 && backslash === -1 ) {
 		fname = path;
-	} else if (slash > backslash) {
-		fname = path.substring(slash+1, 10000);
+	} else if ( slash > backslash ) {
+		fname = path.substring( slash + 1, 10000 );
 	} else {
-		fname = path.substring(backslash+1, 10000);
+		fname = path.substring( backslash + 1, 10000 );
 	}
 
 	// Clear the filename if it does not have a valid extension.
 	// URLs are less likely to have a useful extension, so don't include them in the
 	// extension check.
 	if ( mw.config.get( 'wgStrictFileExtensions' ) && fileExtensions && id !== 'wpUploadFileURL' ) {
-		var found = false;
+		found = false;
 		if ( fname.lastIndexOf( '.' ) !== -1 ) {
-			var ext = fname.substr( fname.lastIndexOf( '.' ) + 1 );
-			for ( var i = 0; i < fileExtensions.length; i += 1 ) {
+			ext = fname.substr( fname.lastIndexOf( '.' ) + 1 );
+			for ( i = 0; i < fileExtensions.length; i += 1 ) {
 				if ( fileExtensions[i].toLowerCase() === ext.toLowerCase() ) {
 					found = true;
 					break;
 				}
 			}
 		}
-		if( !found ) {
+		if ( !found ) {
 			// Not a valid extension
 			// Clear the upload and set mw-upload-permitted to error
-			document.getElementById(id).value = '';
-			var e = document.getElementById( 'mw-upload-permitted' );
-			if( e ) e.className = 'error';
+			document.getElementById( id ).value = '';
+			e = document.getElementById( 'mw-upload-permitted' );
+			if ( e ) {
+				e.className = 'error';
+			}
 
-			var e = document.getElementById( 'mw-upload-prohibited' );
-			if( e ) e.className = 'error';
+			e = document.getElementById( 'mw-upload-prohibited' );
+			if ( e ) {
+				e.className = 'error';
+			}
 
 			// Clear wpDestFile as well
-			var e = document.getElementById( 'wpDestFile' );
-			if( e ) e.value = '';
+			e = document.getElementById( 'wpDestFile' );
+			if ( e ) {
+				e.value = '';
+			}
 
 			return false;
 		}
@@ -241,72 +279,78 @@ window.fillDestFilename = function(id) {
 	}
 
 	// Output result
-	var destFile = document.getElementById( 'wpDestFile' );
+	destFile = document.getElementById( 'wpDestFile' );
 	if ( destFile ) {
 		// Call decodeURIComponent function to remove possible URL-encoded characters
 		// from the file name (bug 30390). Especially likely with upload-form-url.
 		// decodeURIComponent can throw an exception in input is invalid utf-8
 		try {
 			destFile.value = decodeURIComponent( fname );
-		} catch ( e ) {
+		} catch ( err ) {
 			destFile.value = fname;
 		}
 		wgUploadWarningObj.checkNow( fname );
 	}
 };
 
-window.toggleFilenameFiller = function() {
-	if(!document.getElementById) return;
-	var upfield = document.getElementById('wpUploadFile');
-	var destName = document.getElementById('wpDestFile').value;
-	wgUploadAutoFill = ( destName == '' || destName == ' ' );
+window.toggleFilenameFiller = function () {
+	if ( !document.getElementById ) {
+		return;
+	}
+	var destName = document.getElementById( 'wpDestFile' ).value;
+	mw.config.set( 'wgUploadAutoFill', !destName );
 };
 
-window.wgUploadLicenseObj = {
+wgUploadLicenseObj = window.wgUploadLicenseObj = {
 
-	'responseCache' : { '' : '' },
+	responseCache: { '' : '' },
 
-	'fetchPreview': function( license ) {
-		if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) return;
-		for (cached in this.responseCache) {
-			if (cached == license) {
+	fetchPreview: function ( license ) {
+		var cached, title;
+		if ( !mw.config.get( 'wgAjaxLicensePreview' ) ) {
+			return;
+		}
+		for ( cached in this.responseCache ) {
+			if ( cached === license ) {
 				this.showPreview( this.responseCache[license] );
 				return;
 			}
 		}
-		injectSpinner( document.getElementById( 'wpLicense' ), 'license' );
 
-		var title = document.getElementById('wpDestFile').value;
-		if ( !title ) title = 'File:Sample.jpg';
+		$spinnerLicense = $.createSpinner().insertAfter( '#wpLicense' );
 
-		var url = mw.util.wikiScript( 'api' )
-			+ '?action=parse&text={{' + encodeURIComponent( license ) + '}}'
-			+ '&title=' + encodeURIComponent( title )
-			+ '&prop=text&pst&format=json';
+		title = document.getElementById( 'wpDestFile' ).value;
+		if ( !title ) {
+			title = 'File:Sample.jpg';
+		}
 
-		var req = sajax_init_object();
-		req.onreadystatechange = function() {
-			if ( req.readyState == 4 && req.status == 200 )
-				wgUploadLicenseObj.processResult( eval( '(' + req.responseText + ')' ), license );
-		};
-		req.open( 'GET', url, true );
-		req.send( '' );
+		( new mw.Api() ).get( {
+			action: 'parse',
+			text: '{{' + license + '}}',
+			title: title,
+			prop: 'text',
+			pst: ''
+		} ).done( function ( result ) {
+			wgUploadLicenseObj.processResult( result, license );
+		} );
 	},
 
-	'processResult' : function( result, license ) {
-		removeSpinner( 'license' );
-		this.responseCache[license] = result['parse']['text']['*'];
+	processResult: function ( result, license ) {
+		$spinnerLicense.remove();
+		$spinnerLicense = undefined;
+		this.responseCache[license] = result.parse.text['*'];
 		this.showPreview( this.responseCache[license] );
 	},
 
-	'showPreview' : function( preview ) {
+	showPreview: function ( preview ) {
 		var previewPanel = document.getElementById( 'mw-license-preview' );
-		if( previewPanel.innerHTML != preview )
+		if ( previewPanel.innerHTML !== preview ) {
 			previewPanel.innerHTML = preview;
+		}
 	}
 
 };
 
-$( document ).ready( uploadSetup );
+$( uploadSetup );
 
 }( mediaWiki, jQuery ) );
diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js
index 709cc334..d28ca0a3 100644
--- a/skins/common/wikibits.js
+++ b/skins/common/wikibits.js
@@ -1,496 +1,36 @@
 /**
  * MediaWiki legacy wikibits
  */
-( function ( mw ) {
-
-window.clientPC = navigator.userAgent.toLowerCase(); // Get client info
-window.is_gecko = /gecko/.test( clientPC ) &&
-	!/khtml|spoofer|netscape\/7\.0/.test(clientPC);
-
-window.is_safari = window.is_safari_win = window.webkit_version =
-	window.is_chrome = window.is_chrome_mac = false;
-window.webkit_match = clientPC.match(/applewebkit\/(\d+)/);
-if (webkit_match) {
-	window.is_safari = clientPC.indexOf('applewebkit') != -1 &&
-		clientPC.indexOf('spoofer') == -1;
-	window.is_safari_win = is_safari && clientPC.indexOf('windows') != -1;
-	window.webkit_version = parseInt(webkit_match[1]);
-	// Tests for chrome here, to avoid breaking old scripts safari left alone
-	// This is here for accesskeys
-	window.is_chrome = clientPC.indexOf('chrome') !== -1 &&
-		clientPC.indexOf('spoofer') === -1;
-	window.is_chrome_mac = is_chrome && clientPC.indexOf('mac') !== -1
-}
-
-// For accesskeys; note that FF3+ is included here!
-window.is_ff2 = /firefox\/[2-9]|minefield\/3/.test( clientPC );
-window.ff2_bugs = /firefox\/2/.test( clientPC );
-// These aren't used here, but some custom scripts rely on them
-window.is_ff2_win = is_ff2 && clientPC.indexOf('windows') != -1;
-window.is_ff2_x11 = is_ff2 && clientPC.indexOf('x11') != -1;
-
-window.is_opera = window.is_opera_preseven = window.is_opera_95 =
-	window.opera6_bugs = window.opera7_bugs = window.opera95_bugs = false;
-if (clientPC.indexOf('opera') != -1) {
-	window.is_opera = true;
-	window.is_opera_preseven = window.opera && !document.childNodes;
-	window.is_opera_seven = window.opera && document.childNodes;
-	window.is_opera_95 = /opera\/(9\.[5-9]|[1-9][0-9])/.test( clientPC );
-	window.opera6_bugs = is_opera_preseven;
-	window.opera7_bugs = is_opera_seven && !is_opera_95;
-	window.opera95_bugs = /opera\/(9\.5)/.test( clientPC );
-}
-// As recommended by <http://msdn.microsoft.com/en-us/library/ms537509.aspx>,
-// avoiding false positives from moronic extensions that append to the IE UA
-// string (bug 23171)
-window.ie6_bugs = false;
-if ( /msie ([0-9]{1,}[\.0-9]{0,})/.exec( clientPC ) != null
-&& parseFloat( RegExp.$1 ) <= 6.0 ) {
-	ie6_bugs = true;
-}
-
-// add any onload functions in this hook (please don't hard-code any events in the xhtml source)
-window.doneOnloadHook = undefined;
-
-if (!window.onloadFuncts) {
-	window.onloadFuncts = [];
-}
-
-window.addOnloadHook = function( hookFunct ) {
-	// Allows add-on scripts to add onload functions
-	if( !doneOnloadHook ) {
-		onloadFuncts[onloadFuncts.length] = hookFunct;
-	} else {
-		hookFunct();  // bug in MSIE script loading
-	}
-};
-
-window.importScript = function( page ) {
-	var uri = mw.config.get( 'wgScript' ) + '?title=' +
-		mw.util.wikiUrlencode( page ) +
-		'&action=raw&ctype=text/javascript';
-	return importScriptURI( uri );
-};
-
-window.loadedScripts = {}; // included-scripts tracker
-window.importScriptURI = function( url ) {
-	if ( loadedScripts[url] ) {
-		return null;
-	}
-	loadedScripts[url] = true;
-	var s = document.createElement( 'script' );
-	s.setAttribute( 'src', url );
-	s.setAttribute( 'type', 'text/javascript' );
-	document.getElementsByTagName('head')[0].appendChild( s );
-	return s;
-};
-
-window.importStylesheet = function( page ) {
-	return importStylesheetURI( mw.config.get( 'wgScript' ) + '?action=raw&ctype=text/css&title=' + mw.util.wikiUrlencode( page ) );
-};
-
-window.importStylesheetURI = function( url, media ) {
-	var l = document.createElement( 'link' );
-	l.rel = 'stylesheet';
-	l.href = url;
-	if ( media ) {
-		l.media = media;
-	}
-	document.getElementsByTagName('head')[0].appendChild( l );
-	return l;
-};
-
-window.appendCSS = function( text ) {
-	var s = document.createElement( 'style' );
-	s.type = 'text/css';
-	s.rel = 'stylesheet';
-	if ( s.styleSheet ) {
-		s.styleSheet.cssText = text; // IE
-	} else {
-		s.appendChild( document.createTextNode( text + '' ) ); // Safari sometimes borks on null
-	}
-	document.getElementsByTagName('head')[0].appendChild( s );
-	return s;
-};
-
-// Special stylesheet links for Monobook only (see bug 14717)
-var skinpath = mw.config.get( 'stylepath' ) + '/' + mw.config.get( 'skin' );
-if ( mw.config.get( 'skin' ) === 'monobook' ) {
-	if ( opera6_bugs ) {
-		importStylesheetURI( skinpath + '/Opera6Fixes.css' );
-	} else if ( opera7_bugs ) {
-		importStylesheetURI( skinpath + '/Opera7Fixes.css' );
-	} else if ( opera95_bugs ) {
-		importStylesheetURI( skinpath + '/Opera9Fixes.css' );
-	}
-}
+( function ( mw, $ ) {
+	var msg,
+		win = window,
+		ua = navigator.userAgent.toLowerCase(),
+		isIE6 = ( /msie ([0-9]{1,}[\.0-9]{0,})/.exec( ua ) && parseFloat( RegExp.$1 ) <= 6.0 ),
+		isGecko = /gecko/.test( ua ) && !/khtml|spoofer|netscape\/7\.0/.test( ua ),
+		onloadFuncts = [];
 
 if ( mw.config.get( 'wgBreakFrames' ) ) {
-	// Un-trap us from framesets
-	if ( window.top != window ) {
-		window.top.location = window.location;
+	// Note: In IE < 9 strict comparison to window is non-standard (the standard didn't exist yet)
+	// it works only comparing to window.self or window.window (http://stackoverflow.com/q/4850978/319266)
+	if ( win.top !== win.self ) {
+		// Un-trap us from framesets
+		win.top.location = win.location;
 	}
 }
 
-window.changeText = function( el, newText ) {
-	// Safari work around
-	if ( el.innerText ) {
-		el.innerText = newText;
-	} else if ( el.firstChild && el.firstChild.nodeValue ) {
-		el.firstChild.nodeValue = newText;
-	}
-};
-
-window.killEvt = function( evt ) {
-	evt = evt || window.event || window.Event; // W3C, IE, Netscape
-	if ( typeof ( evt.preventDefault ) != 'undefined' ) {
-		evt.preventDefault(); // Don't follow the link
-		evt.stopPropagation();
-	} else {
-		evt.cancelBubble = true; // IE
-	}
-	return false; // Don't follow the link (IE)
-};
-
-window.mwEditButtons = [];
-window.mwCustomEditButtons = []; // eg to add in MediaWiki:Common.js
-
-window.escapeQuotes = function( text ) {
-	var re = new RegExp( "'", "g" );
-	text = text.replace( re, "\\'" );
-	re = new RegExp( "\\n", "g" );
-	text = text.replace( re, "\\n" );
-	return escapeQuotesHTML( text );
-};
-
-window.escapeQuotesHTML = function( text ) {
-	var re = new RegExp( '&', "g" );
-	text = text.replace( re, "&amp;" );
-	re = new RegExp( '"', "g" );
-	text = text.replace( re, "&quot;" );
-	re = new RegExp( '<', "g" );
-	text = text.replace( re, "&lt;" );
-	re = new RegExp( '>', "g" );
-	text = text.replace( re, "&gt;" );
-	return text;
-};
-
-/**
- * Set the accesskey prefix based on browser detection.
- */
-window.tooltipAccessKeyPrefix = 'alt-';
-if ( is_opera ) {
-	tooltipAccessKeyPrefix = 'shift-esc-';
-} else if ( is_chrome ) {
-	tooltipAccessKeyPrefix = is_chrome_mac ? 'ctrl-option-' : 'alt-';
-} else if ( !is_safari_win && is_safari && webkit_version > 526 ) {
-	tooltipAccessKeyPrefix = 'ctrl-alt-';
-} else if ( !is_safari_win && ( is_safari
-		|| clientPC.indexOf('mac') != -1
-		|| clientPC.indexOf('konqueror') != -1 ) ) {
-	tooltipAccessKeyPrefix = 'ctrl-';
-} else if ( is_ff2 ) {
-	tooltipAccessKeyPrefix = 'alt-shift-';
-}
-window.tooltipAccessKeyRegexp = /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/;
-
-/**
- * Add the appropriate prefix to the accesskey shown in the tooltip.
- * If the nodeList parameter is given, only those nodes are updated;
- * otherwise, all the nodes that will probably have accesskeys by
- * default are updated.
- *
- * @param nodeList Array list of elements to update
- */
-window.updateTooltipAccessKeys = function( nodeList ) {
-	if ( !nodeList ) {
-		// Rather than scan all links on the whole page, we can just scan these
-		// containers which contain the relevant links. This is really just an
-		// optimization technique.
-		var linkContainers = [
-			'column-one', // Monobook and Modern
-			'mw-head', 'mw-panel', 'p-logo' // Vector
-		];
-		for ( var i in linkContainers ) {
-			var linkContainer = document.getElementById( linkContainers[i] );
-			if ( linkContainer ) {
-				updateTooltipAccessKeys( linkContainer.getElementsByTagName( 'a' ) );
-			}
-		}
-		// these are rare enough that no such optimization is needed
-		updateTooltipAccessKeys( document.getElementsByTagName( 'input' ) );
-		updateTooltipAccessKeys( document.getElementsByTagName( 'label' ) );
-		return;
-	}
-
-	for ( var i = 0; i < nodeList.length; i++ ) {
-		var element = nodeList[i];
-		var tip = element.getAttribute( 'title' );
-		if ( tip && tooltipAccessKeyRegexp.exec( tip ) ) {
-			tip = tip.replace(tooltipAccessKeyRegexp,
-					  '[' + tooltipAccessKeyPrefix + "$5]");
-			element.setAttribute( 'title', tip );
-		}
-	}
-};
-
-/**
- * Add a link to one of the portlet menus on the page, including:
- *
- * p-cactions: Content actions (shown as tabs above the main content in Monobook)
- * p-personal: Personal tools (shown at the top right of the page in Monobook)
- * p-navigation: Navigation
- * p-tb: Toolbox
- *
- * This function exists for the convenience of custom JS authors.  All
- * but the first three parameters are optional, though providing at
- * least an id and a tooltip is recommended.
- *
- * By default the new link will be added to the end of the list.  To
- * add the link before a given existing item, pass the DOM node of
- * that item (easily obtained with document.getElementById()) as the
- * nextnode parameter; to add the link _after_ an existing item, pass
- * the node's nextSibling instead.
- *
- * @param portlet String id of the target portlet ("p-cactions", "p-personal", "p-navigation" or "p-tb")
- * @param href String link URL
- * @param text String link text (will be automatically lowercased by CSS for p-cactions in Monobook)
- * @param id String id of the new item, should be unique and preferably have the appropriate prefix ("ca-", "pt-", "n-" or "t-")
- * @param tooltip String text to show when hovering over the link, without accesskey suffix
- * @param accesskey String accesskey to activate this link (one character, try to avoid conflicts)
- * @param nextnode Node the DOM node before which the new item should be added, should be another item in the same list
- *
- * @return Node -- the DOM node of the new item (an LI element) or null
- */
-window.addPortletLink = function( portlet, href, text, id, tooltip, accesskey, nextnode ) {
-	var root = document.getElementById( portlet );
-	if ( !root ) {
-		return null;
-	}
-	var uls = root.getElementsByTagName( 'ul' );
-	var node;
-	if ( uls.length > 0 ) {
-		node = uls[0];
-	} else {
-		node = document.createElement( 'ul' );
-		var lastElementChild = null;
-		for ( var i = 0; i < root.childNodes.length; ++i ) { /* get root.lastElementChild */
-			if ( root.childNodes[i].nodeType == 1 ) {
-				lastElementChild = root.childNodes[i];
-			}
-		}
-		if ( lastElementChild && lastElementChild.nodeName.match( /div/i ) ) {
-			/* Insert into the menu divs */
-			lastElementChild.appendChild( node );
-		} else {
-			root.appendChild( node );
-		}
-	}
-	if ( !node ) {
-		return null;
-	}
-
-	// unhide portlet if it was hidden before
-	root.className = root.className.replace( /(^| )emptyPortlet( |$)/, "$2" );
-
-	var link = document.createElement( 'a' );
-	link.appendChild( document.createTextNode( text ) );
-	link.href = href;
-
-	// Wrap in a span - make it work with vector tabs and has no effect on any other portlets
-	var span = document.createElement( 'span' );
-	span.appendChild( link );
-
-	var item = document.createElement( 'li' );
-	item.appendChild( span );
-	if ( id ) {
-		item.id = id;
-	}
-
-	if ( accesskey ) {
-		link.setAttribute( 'accesskey', accesskey );
-		tooltip += ' [' + accesskey + ']';
-	}
-	if ( tooltip ) {
-		link.setAttribute( 'title', tooltip );
-	}
-	if ( accesskey && tooltip ) {
-		updateTooltipAccessKeys( [link] );
-	}
-
-	if ( nextnode && nextnode.parentNode == node ) {
-		node.insertBefore( item, nextnode );
-	} else {
-		node.appendChild( item );  // IE compatibility (?)
-	}
-
-	return item;
-};
-
-window.getInnerText = function( el ) {
-	if ( typeof el == 'string' ) {
-		return el;
-	}
-	if ( typeof el == 'undefined' ) {
-		return el;
-	}
-	// Custom sort value through 'data-sort-value' attribute
-	// (no need to prepend hidden text to change sort value)
-	if ( el.nodeType && el.getAttribute( 'data-sort-value' ) !== null ) {
-		// Make sure it's a valid DOM element (.nodeType) and that the attribute is set (!null)
-		return el.getAttribute( 'data-sort-value' );
-	}
-	if ( el.textContent ) {
-		return el.textContent; // not needed but it is faster
-	}
-	if ( el.innerText ) {
-		return el.innerText; // IE doesn't have textContent
-	}
-	var str = '';
-
-	var cs = el.childNodes;
-	var l = cs.length;
-	for ( var i = 0; i < l; i++ ) {
-		switch ( cs[i].nodeType ) {
-			case 1: // ELEMENT_NODE
-				str += getInnerText( cs[i] );
-				break;
-			case 3:	// TEXT_NODE
-				str += cs[i].nodeValue;
-				break;
-		}
-	}
-	return str;
-};
-
-window.checkboxes = undefined;
-window.lastCheckbox = undefined;
-
-window.setupCheckboxShiftClick = function() {
-	checkboxes = [];
-	lastCheckbox = null;
-	var inputs = document.getElementsByTagName( 'input' );
-	addCheckboxClickHandlers( inputs );
-};
-
-window.addCheckboxClickHandlers = function( inputs, start ) {
-	if ( !start ) {
-		start = 0;
-	}
-
-	var finish = start + 250;
-	if ( finish > inputs.length ) {
-		finish = inputs.length;
-	}
-
-	for ( var i = start; i < finish; i++ ) {
-		var cb = inputs[i];
-		if ( !cb.type || cb.type.toLowerCase() != 'checkbox' || ( ' ' + cb.className + ' ' ).indexOf( ' noshiftselect ' )  != -1 ) {
-			continue;
-		}
-		var end = checkboxes.length;
-		checkboxes[end] = cb;
-		cb.index = end;
-		addClickHandler( cb, checkboxClickHandler );
-	}
-
-	if ( finish < inputs.length ) {
-		setTimeout( function() {
-			addCheckboxClickHandlers( inputs, finish );
-		}, 200 );
-	}
-};
-
-window.checkboxClickHandler = function( e ) {
-	if ( typeof e == 'undefined' ) {
-		e = window.event;
-	}
-	if ( !e.shiftKey || lastCheckbox === null ) {
-		lastCheckbox = this.index;
-		return true;
-	}
-	var endState = this.checked;
-	var start, finish;
-	if ( this.index < lastCheckbox ) {
-		start = this.index + 1;
-		finish = lastCheckbox;
-	} else {
-		start = lastCheckbox;
-		finish = this.index - 1;
-	}
-	for ( var i = start; i <= finish; ++i ) {
-		checkboxes[i].checked = endState;
-		if( i > start && typeof checkboxes[i].onchange == 'function' ) {
-			checkboxes[i].onchange(); // fire triggers
-		}
-	}
-	lastCheckbox = this.index;
-	return true;
-};
-
-
-/*
-	Written by Jonathan Snook, http://www.snook.ca/jonathan
-	Add-ons by Robert Nyman, http://www.robertnyman.com
-	Author says "The credit comment is all it takes, no license. Go crazy with it!:-)"
-	From http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
-*/
-window.getElementsByClassName = function( oElm, strTagName, oClassNames ) {
-	var arrReturnElements = [];
-	if ( typeof( oElm.getElementsByClassName ) == 'function' ) {
-		/* Use a native implementation where possible FF3, Saf3.2, Opera 9.5 */
-		var arrNativeReturn = oElm.getElementsByClassName( oClassNames );
-		if ( strTagName == '*' ) {
-			return arrNativeReturn;
-		}
-		for ( var h = 0; h < arrNativeReturn.length; h++ ) {
-			if( arrNativeReturn[h].tagName.toLowerCase() == strTagName.toLowerCase() ) {
-				arrReturnElements[arrReturnElements.length] = arrNativeReturn[h];
-			}
-		}
-		return arrReturnElements;
-	}
-	var arrElements = ( strTagName == '*' && oElm.all ) ? oElm.all : oElm.getElementsByTagName( strTagName );
-	var arrRegExpClassNames = [];
-	if( typeof oClassNames == 'object' ) {
-		for( var i = 0; i < oClassNames.length; i++ ) {
-			arrRegExpClassNames[arrRegExpClassNames.length] =
-				new RegExp("(^|\\s)" + oClassNames[i].replace(/\-/g, "\\-") + "(\\s|$)");
-		}
-	} else {
-		arrRegExpClassNames[arrRegExpClassNames.length] =
-			new RegExp("(^|\\s)" + oClassNames.replace(/\-/g, "\\-") + "(\\s|$)");
-	}
-	var oElement;
-	var bMatchesAll;
-	for( var j = 0; j < arrElements.length; j++ ) {
-		oElement = arrElements[j];
-		bMatchesAll = true;
-		for( var k = 0; k < arrRegExpClassNames.length; k++ ) {
-			if( !arrRegExpClassNames[k].test( oElement.className ) ) {
-				bMatchesAll = false;
-				break;
-			}
-		}
-		if( bMatchesAll ) {
-			arrReturnElements[arrReturnElements.length] = oElement;
-		}
-	}
-	return ( arrReturnElements );
-};
-
-window.redirectToFragment = function( fragment ) {
-	var match = navigator.userAgent.match(/AppleWebKit\/(\d+)/);
+win.redirectToFragment = function ( fragment ) {
+	var webKitVersion,
+		match = navigator.userAgent.match( /AppleWebKit\/(\d+)/ );
 	if ( match ) {
-		var webKitVersion = parseInt( match[1] );
+		webKitVersion = parseInt( match[1], 10 );
 		if ( webKitVersion < 420 ) {
 			// Released Safari w/ WebKit 418.9.1 messes up horribly
 			// Nightlies of 420+ are ok
 			return;
 		}
 	}
-	if ( window.location.hash == '' ) {
-		window.location.hash = fragment;
+	if ( !win.location.hash ) {
+		win.location.hash = fragment;
 
 		// Mozilla needs to wait until after load, otherwise the window doesn't
 		// scroll.  See <https://bugzilla.mozilla.org/show_bug.cgi?id=516293>.
@@ -498,122 +38,211 @@ window.redirectToFragment = function( fragment ) {
 		// version-testing.  If Firefox fixes the bug, they'll jump twice, but
 		// better twice than not at all, so make the fix hit future versions as
 		// well.
-		if ( is_gecko ) {
-			addOnloadHook(function() {
-				if ( window.location.hash == fragment ) {
-					window.location.hash = fragment;
+		if ( isGecko ) {
+			$( function () {
+				if ( win.location.hash === fragment ) {
+					win.location.hash = fragment;
 				}
-			});
+			} );
 		}
 	}
 };
 
 /**
- * Add a cute little box at the top of the screen to inform the user of
- * something, replacing any preexisting message.
+ * User-agent sniffing.
+ * To be removed in MediaWiki 1.23.
  *
- * @deprecated since 1.17 Use the 'mediawiki.notify' module instead.
- * @param {String|HTMLElement} message To be put inside the message box.
+ * @deprecated since 1.17 Use jquery.client instead
  */
-window.jsMsg = function () {
-	return mw.util.jsMessage.apply( mw.util, arguments );
-};
+
+msg = 'Use feature detection or module jquery.client instead';
+
+mw.log.deprecate( win, 'clientPC', ua, msg );
+
+// Ignored dummy values
+mw.log.deprecate( win, 'is_gecko', false, msg );
+mw.log.deprecate( win, 'is_chrome_mac', false, msg );
+mw.log.deprecate( win, 'is_chrome', false, msg );
+mw.log.deprecate( win, 'webkit_version', false, msg );
+mw.log.deprecate( win, 'is_safari_win', false, msg );
+mw.log.deprecate( win, 'is_safari', false, msg );
+mw.log.deprecate( win, 'webkit_match', false, msg );
+mw.log.deprecate( win, 'is_ff2', false, msg );
+mw.log.deprecate( win, 'ff2_bugs', false, msg );
+mw.log.deprecate( win, 'is_ff2_win', false, msg );
+mw.log.deprecate( win, 'is_ff2_x11', false, msg );
+mw.log.deprecate( win, 'opera95_bugs', false, msg );
+mw.log.deprecate( win, 'opera7_bugs', false, msg );
+mw.log.deprecate( win, 'opera6_bugs', false, msg );
+mw.log.deprecate( win, 'is_opera_95', false, msg );
+mw.log.deprecate( win, 'is_opera_preseven', false, msg );
+mw.log.deprecate( win, 'is_opera', false, msg );
+mw.log.deprecate( win, 'ie6_bugs', false, msg );
 
 /**
- * Inject a cute little progress spinner after the specified element
+ * DOM utilities for handling of events, text nodes and selecting elements
+ *
+ * To be removed in MediaWiki 1.23.
  *
- * @param element Element to inject after
- * @param id Identifier string (for use with removeSpinner(), below)
+ * @deprecated since 1.17 Use jQuery instead
  */
-window.injectSpinner = function( element, id ) {
-	var spinner = document.createElement( 'img' );
-	spinner.id = 'mw-spinner-' + id;
-	spinner.src = mw.config.get( 'stylepath' ) + '/common/images/spinner.gif';
-	spinner.alt = spinner.title = '...';
-	if( element.nextSibling ) {
-		element.parentNode.insertBefore( spinner, element.nextSibling );
+msg = 'Use jQuery instead';
+
+// Ignored dummy values
+mw.log.deprecate( win, 'doneOnloadHook', undefined, msg );
+mw.log.deprecate( win, 'onloadFuncts', [], msg );
+mw.log.deprecate( win, 'runOnloadHook', $.noop, msg );
+mw.log.deprecate( win, 'changeText', $.noop, msg );
+mw.log.deprecate( win, 'killEvt', $.noop, msg );
+mw.log.deprecate( win, 'addHandler', $.noop, msg );
+mw.log.deprecate( win, 'hookEvent', $.noop, msg );
+mw.log.deprecate( win, 'addClickHandler', $.noop, msg );
+mw.log.deprecate( win, 'removeHandler', $.noop, msg );
+mw.log.deprecate( win, 'getElementsByClassName', function () { return []; }, msg );
+mw.log.deprecate( win, 'getInnerText', function () { return ''; }, msg );
+
+// Run a function after the window onload event is fired
+mw.log.deprecate( win, 'addOnloadHook', function ( hookFunct ) {
+	if ( onloadFuncts ) {
+		onloadFuncts.push(hookFunct);
 	} else {
-		element.parentNode.appendChild( spinner );
+		// If func queue is gone the event has happened already,
+		// run immediately instead of queueing.
+		hookFunct();
 	}
-};
+}, msg );
 
-/**
- * Remove a progress spinner added with injectSpinner()
- *
- * @param id Identifier string
- */
-window.removeSpinner = function( id ) {
-	var spinner = document.getElementById( 'mw-spinner-' + id );
-	if( spinner ) {
-		spinner.parentNode.removeChild( spinner );
-	}
-};
+$( win ).on( 'load', function () {
+	var i, functs;
 
-window.runOnloadHook = function() {
-	// don't run anything below this for non-dom browsers
-	if ( doneOnloadHook || !( document.getElementById && document.getElementsByTagName ) ) {
+	// Don't run twice
+	if ( !onloadFuncts ) {
 		return;
 	}
 
-	// set this before running any hooks, since any errors below
-	// might cause the function to terminate prematurely
-	doneOnloadHook = true;
+	// Deference and clear onloadFuncts before running any
+	// hooks to make sure we don't miss any addOnloadHook
+	// calls.
+	functs = onloadFuncts.slice();
+	onloadFuncts = undefined;
 
-	// Run any added-on functions
-	for ( var i = 0; i < onloadFuncts.length; i++ ) {
-		onloadFuncts[i]();
+	// Execute the queued functions
+	for ( i = 0; i < functs.length; i++ ) {
+		functs[i]();
 	}
-};
+} );
 
 /**
- * Add an event handler to an element
+ * Toggle checkboxes with shift selection
+ *
+ * To be removed in MediaWiki 1.23.
  *
- * @param element Element to add handler to
- * @param attach String Event to attach to
- * @param handler callable Event handler callback
+ * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
  */
-window.addHandler = function( element, attach, handler ) {
-	if( element.addEventListener ) {
-		element.addEventListener( attach, handler, false );
-	} else if( element.attachEvent ) {
-		element.attachEvent( 'on' + attach, handler );
-	}
-};
+msg = 'Use jquery.checkboxShiftClick instead';
+mw.log.deprecate( win, 'checkboxes', [], msg );
+mw.log.deprecate( win, 'lastCheckbox', null, msg );
+mw.log.deprecate( win, 'setupCheckboxShiftClick', $.noop, msg );
+mw.log.deprecate( win, 'addCheckboxClickHandlers', $.noop, msg );
+mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
 
-window.hookEvent = function( hookName, hookFunct ) {
-	addHandler( window, hookName, hookFunct );
-};
+/**
+ * Add a button to the default editor toolbar
+ *
+ * To be removed in MediaWiki 1.23.
+ *
+ * @deprecated since 1.17 Use mw.toolbar instead
+ */
+mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead' );
+mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead' );
 
 /**
- * Add a click event handler to an element
+ * Spinner creation, injection and removal
+ *
+ * To be removed in MediaWiki 1.23.
  *
- * @param element Element to add handler to
- * @param handler callable Event handler callback
+ * @deprecated since 1.18 Use jquery.spinner instead
  */
-window.addClickHandler = function( element, handler ) {
-	addHandler( element, 'click', handler );
-};
+mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead' );
+mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead' );
 
 /**
- * Removes an event handler from an element
+ * Escape utilities
  *
- * @param element Element to remove handler from
- * @param remove String Event to remove
- * @param handler callable Event handler callback to remove
+ * To be removed in MediaWiki 1.23.
+ *
+ * @deprecated since 1.18 Use mw.html instead
  */
-window.removeHandler = function( element, remove, handler ) {
-	if( window.removeEventListener ) {
-		element.removeEventListener( remove, handler, false );
-	} else if( window.detachEvent ) {
-		element.detachEvent( 'on' + remove, handler );
+mw.log.deprecate( win, 'escapeQuotes', $.noop,'Use mw.html instead' );
+mw.log.deprecate( win, 'escapeQuotesHTML', $.noop,'Use mw.html instead' );
+
+/**
+ * Display a message to the user
+ *
+ * To be removed in MediaWiki 1.23.
+ *
+ * @deprecated since 1.17 Use mediawiki.notify instead
+ * @param {string|HTMLElement} message To be put inside the message box
+ */
+mw.log.deprecate( win, 'jsMsg', mw.util.jsMessage, 'Use mediawiki.notify instead' );
+
+/**
+ * Misc. utilities
+ *
+ * To be removed in MediaWiki 1.23.
+ *
+ * @deprecated since 1.17 Use mediawiki.util instead
+ */
+msg = 'Use mediawiki.util instead';
+mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
+mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
+mw.log.deprecate( win, 'updateTooltipAccessKeys', mw.util.updateTooltipAccessKeys, msg );
+mw.log.deprecate( win, 'addPortletLink', mw.util.addPortletLink, msg );
+mw.log.deprecate( win, 'appendCSS', mw.util.addCSS, msg );
+
+/**
+ * Wikipage import methods
+ */
+
+// included-scripts tracker
+win.loadedScripts = {};
+
+win.importScript = function ( page ) {
+	var uri = mw.config.get( 'wgScript' ) + '?title=' +
+		mw.util.wikiUrlencode( page ) +
+		'&action=raw&ctype=text/javascript';
+	return win.importScriptURI( uri );
+};
+
+win.importScriptURI = function ( url ) {
+	if ( win.loadedScripts[url] ) {
+		return null;
 	}
+	win.loadedScripts[url] = true;
+	var s = document.createElement( 'script' );
+	s.setAttribute( 'src', url );
+	s.setAttribute( 'type', 'text/javascript' );
+	document.getElementsByTagName( 'head' )[0].appendChild( s );
+	return s;
+};
+
+win.importStylesheet = function( page ) {
+	return win.importStylesheetURI( mw.config.get( 'wgScript' ) + '?action=raw&ctype=text/css&title=' + mw.util.wikiUrlencode( page ) );
+};
+
+win.importStylesheetURI = function( url, media ) {
+	var l = document.createElement( 'link' );
+	l.rel = 'stylesheet';
+	l.href = url;
+	if ( media ) {
+		l.media = media;
+	}
+	document.getElementsByTagName('head')[0].appendChild( l );
+	return l;
 };
-// note: all skins should call runOnloadHook() at the end of html output,
-//      so the below should be redundant. It's there just in case.
-hookEvent( 'load', runOnloadHook );
 
-if ( ie6_bugs ) {
-	importScriptURI( mw.config.get( 'stylepath' ) + '/common/IEFixes.js' );
+if ( isIE6 ) {
+	win.importScriptURI( mw.config.get( 'stylepath' ) + '/common/IEFixes.js' );
 }
 
-}( mediaWiki ) );
+}( mediaWiki, jQuery ) );
diff --git a/skins/common/wikiprintable.css b/skins/common/wikiprintable.css
deleted file mode 100644
index 95fcfef3..00000000
--- a/skins/common/wikiprintable.css
+++ /dev/null
@@ -1,59 +0,0 @@
-/* MediaWiki print stylesheet */
-
-body {
-	color: #000000;
-	background: #ffffff;
-}
-
-/* MSIE/Win doesn't understand 'inherit' */
-a,
-a.external,
-a.new,
-a.stub {
-	color: black !important;
-	text-decoration: none !important;
-}
-#article {
-	margin: 0 !important;
-}
-
-/* Continue ... */
-a,
-a.external,
-a.new,
-a.stub {
-	color: inherit !important;
-	text-decoration: inherit !important;
-}
-
-/* Hide UI stuff */
-#quickbar,
-#topbar,
-#logo,
-#footer,
-#siteNotice,
-.editsection,
-.toctoggle {
-	display: none;
-}
-
-/* */
-#article {
-	position: relative;
-	margin: inherit !important;
-}
-
-.printfooter {
-	border-top: solid 1px black;
-	display: block !important;
-}
-
-/* Old stuff. @todo FIXME:
-a.CBlink { color: #0000AA; text-decoration: none; font-size: 12pt; }
-a.interwiki,
-a.external { color: #3333BB; text-decoration: none; }
-h1.pagetitle { padding-bottom: 0; margin-bottom: 0; }
-i.link,
-u.link { color: #000066; }
-p.subtitle { padding-top: 0; margin-top: 0; }
-*/
diff --git a/skins/modern/external.png b/skins/modern/external.png
index acf260fc..63083831 100644
Binary files a/skins/modern/external.png and b/skins/modern/external.png differ
diff --git a/skins/modern/main.css b/skins/modern/main.css
index f201209d..40fbfd78 100644
--- a/skins/modern/main.css
+++ b/skins/modern/main.css
@@ -58,8 +58,7 @@ body {
 	font-variant: small-caps;
 }
 
-#p-personal h3,
-#p-personal h5 {
+#p-personal h3 {
 	display: none;
 }
 
@@ -177,8 +176,7 @@ textarea {
 	margin-top: .4em;
 }
 
-.portlet h3,
-.portlet h5 {
+.portlet h3 {
 	padding: 0.1em 0 0.3em 1em;
 	margin: 0 0 0 0;
 	background-color: #dddddd;
@@ -252,8 +250,7 @@ ul {
 	color: white;
 }
 
-#p-cactions h3,
-#p-cactions h5 {
+#p-cactions h3 {
 	display: none;
 }
 
@@ -340,10 +337,6 @@ a.new:visited {
 	color: #a55858;
 }
 
-span.editsection {
-	font-size: small;
-}
-
 h1, h2 {
 	border-bottom: solid 1px #003366;
 }
@@ -412,13 +405,7 @@ h1, h2, h3, h4, h5, h6 {
 	text-decoration: none;
 	color: white;
 }
-
-#mw-pref-clear {
-	clear: both;
-}
-
-#mw_content a.external,
-#mw_content a.external[href ^="gopher://"] {
+#mw_content a.external {
 	/* @embed */
 	background: url(external.png) center right no-repeat;
 	padding-right: 13px;
@@ -526,6 +513,7 @@ div.magnify {
 	float: right;
 	border: none !important;
 	background: none !important;
+	margin-left: 3px;
 }
 div.magnify a, div.magnify img {
 	display: block;
@@ -555,6 +543,27 @@ img.thumbborder {
 	border-spacing: 0;
 	background-color: #f0f0f0;
 	border: solid 1px #bbbbbb;
+	display: -moz-inline-block;
+	display: inline-block;
+	display: table;
+
+	/* IE7 and earliers */
+	zoom: 1;
+	*display: inline;
+
+	padding: 7px;
+}
+
+/* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
+table#toc,
+table.toc {
+	border-collapse: collapse;
+}
+
+/* Remove additional paddings inside table-cells that are not present in <div>s */
+table#toc td,
+table.toc td {
+	padding: 0;
 }
 
 #toc tr, #toc td {
diff --git a/skins/modern/print.css b/skins/modern/print.css
index 82784100..e97bbdb4 100644
--- a/skins/modern/print.css
+++ b/skins/modern/print.css
@@ -3,7 +3,7 @@
 #p-personal,
 #jump-to-nav,
 #footer,
-span.editsection,
+.mw-editsection,
 .noprint {
 	display: none;
 }
diff --git a/skins/monobook/IE60Fixes.css b/skins/monobook/IE60Fixes.css
index ec1ce430..534d3333 100644
--- a/skins/monobook/IE60Fixes.css
+++ b/skins/monobook/IE60Fixes.css
@@ -70,15 +70,6 @@ div#footer {
 #portal-personaltools {
 	padding-bottom: 0.1em;
 }
-#bodyContent a.external {
-	background: url(external.png) center right no-repeat;
-	padding-right: 13px;
-}
-
-.rtl #bodyContent a.external {
-	background-image: url(external-rtl.png);
-	padding-right: 13px;
-}
 
 .rtl a.feedlink {
 	background-position: right;
diff --git a/skins/monobook/Opera6Fixes.css b/skins/monobook/Opera6Fixes.css
deleted file mode 100644
index 77dec095..00000000
--- a/skins/monobook/Opera6Fixes.css
+++ /dev/null
@@ -1,20 +0,0 @@
-/* opera 6 fixes */
-div#column-one {
-	position: relative;
-	max-width: 11.7em;
-}
-#p-personal {
-	width: 45em;
-	margin-left: 8.6em;
-	right: 0;
-}
-#bodyContent a.external {
-	background: url(external.png) center right no-repeat;
-	padding-right: 13px;
-}
-
-.rtl a.feedlink {
-	background-position: right;
-	padding-right: 0;
-	padding-left: 16px;
-}
diff --git a/skins/monobook/Opera7Fixes.css b/skins/monobook/Opera7Fixes.css
deleted file mode 100644
index 1dcba7c9..00000000
--- a/skins/monobook/Opera7Fixes.css
+++ /dev/null
@@ -1,21 +0,0 @@
-/* small tweaks for opera seven */
-#p-cactions {
-	margin-top: .1em;
-}
-#p-cactions li a {
-	top: 2px;
-}
-#bodyContent a.external {
-	background: url(external.png) center right no-repeat;
-	padding-right: 13px;
-}
-.rtl #bodyContent a.external {
-	background-image: url(external-rtl.png);
-	padding-right: 13px;
-}
-
-.rtl a.feedlink {
-	background-position: right;
-	padding-right: 0;
-	padding-left: 16px;
-}
diff --git a/skins/monobook/Opera9Fixes.css b/skins/monobook/Opera9Fixes.css
deleted file mode 100644
index 9c312a84..00000000
--- a/skins/monobook/Opera9Fixes.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.rtl #bodyContent a.external {
-	background-image: url(external-rtl.png);
-	padding-right: 13px;
-	padding-left: 0;
-}
-
-.rtl a.feedlink {
-	background-position: right;
-	padding-right: 0;
-	padding-left: 16px;
-}
diff --git a/skins/monobook/external-ltr.png b/skins/monobook/external-ltr.png
index acf260fc..63083831 100644
Binary files a/skins/monobook/external-ltr.png and b/skins/monobook/external-ltr.png differ
diff --git a/skins/monobook/external-rtl.png b/skins/monobook/external-rtl.png
index 7d5ee375..5313234e 100644
Binary files a/skins/monobook/external-rtl.png and b/skins/monobook/external-rtl.png differ
diff --git a/skins/monobook/main.css b/skins/monobook/main.css
index 4cbc0939..d8f25ebb 100644
--- a/skins/monobook/main.css
+++ b/skins/monobook/main.css
@@ -17,7 +17,7 @@ div#column-content {
 }
 div#content {
 	margin: 2.8em 0 0 12.2em;
-	padding: 0 1em 1em 1em;
+	padding: 1em;
 	position: relative;
 	z-index: 2;
 }
@@ -93,6 +93,9 @@ pre, .mw-code {
 	line-height: 1.1em;
 }
 
+#firstHeading {
+	padding-top: 0;
+}
 /*
 ** the main content area
 */
@@ -139,8 +142,7 @@ table.rimage {
 ** keep the whitespace in front of the ^=, hides rule from konqueror
 ** this is css3, the validator doesn't like it when validating as css2
 */
-#bodyContent a.external,
-#bodyContent a.external[href ^="gopher://"] {
+#bodyContent a.external {
 	/* @embed */
 	background: url(external-ltr.png) center right no-repeat;
 	padding-right: 13px;
@@ -319,7 +321,7 @@ input.searchButton {
 	position: absolute;
 	left: 0;
 	top: 0;
-	z-index: 0;
+	z-index: 3;
 }
 #p-personal {
 	width: 100%;
@@ -381,19 +383,22 @@ input.searchButton {
 #p-personal li.active a:hover {
 	background-color: transparent;
 }
-/* the icon in front of the user name, single quotes
-in bg url to hide it from iemac */
+/* The icon in front of the username / login link */
 li#pt-userpage,
 li#pt-anonuserpage,
 li#pt-login {
 	/* @embed */
 	background: url(user.gif) top left no-repeat;
 	padding-left: 20px;
-	text-transform: none;
 }
 #p-personal ul {
 	text-transform: lowercase;
 }
+/* Don't lowercase username or IP addresses (IPv6) */
+li#pt-userpage,
+li#pt-anonuserpage {
+	text-transform: none;
+}
 #p-personal li.active {
 	font-weight: bold;
 }
@@ -422,14 +427,13 @@ li#pt-login {
 	display: inline;
 	border: 1px solid #aaa;
 	border-bottom: none;
-	padding: 0 0 .1em 0;
+	padding: 0 0 1em 0;
 	margin: 0 .3em 0 0;
 	overflow: visible;
 	background: white;
 }
 #p-cactions li.selected {
 	border-color: #fabd23;
-	padding: 0 0 .2em 0;
 	font-weight: bold;
 }
 #p-cactions li a {
@@ -515,7 +519,8 @@ div#footer {
 	border-top: 1px solid #fabd23;
 	border-bottom: 1px solid #fabd23;
 	margin: .6em 0 1em 0;
-	padding: .4em 0 1.2em 0;
+	overflow: hidden;
+	padding: .4em 0 .3em 0;
 	text-align: center;
 	font-size: 90%;
 }
@@ -897,6 +902,5 @@ div.mw-lag-warn-high {
 /* mediawiki.notification */
 .skin-monobook .mw-notification {
 	-webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
-	-moz-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
 	box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
 }
diff --git a/skins/monobook/wiki-indexed.png b/skins/monobook/wiki-indexed.png
index 0ec584a3..799ebac8 100644
Binary files a/skins/monobook/wiki-indexed.png and b/skins/monobook/wiki-indexed.png differ
diff --git a/skins/myskin/main.css b/skins/myskin/main.css
deleted file mode 100644
index f3ab0204..00000000
--- a/skins/myskin/main.css
+++ /dev/null
@@ -1 +0,0 @@
-/* this file must be empty */
diff --git a/skins/nostalgia/screen.css b/skins/nostalgia/screen.css
deleted file mode 100644
index aed5715b..00000000
--- a/skins/nostalgia/screen.css
+++ /dev/null
@@ -1,56 +0,0 @@
-body {
-	/* background color is set separately on page type */
-	color: black;
-}
-
-#specialform {
-	display: inline;
-}
-
-#powersearch {
-	background: #DDEEFF;
-	border-style: solid;
-	border-width: 1px;
-	padding: 2px;
-}
-
-a.new {
-	color: #ba0000;
-}
-
-a.interwiki,
-a.external {
-	color: #3366BB;
-}
-
-a.printable {
-	text-decoration: underline;
-}
-
-a.stub {
-	color: #772233;
-	text-decoration: none;
-}
-
-h1.pagetitle {
-	padding-top: 0;
-	margin-top: 0;
-	padding-bottom: 0;
-	margin-bottom: 0;
-}
-
-h2, h3, h4, h5, h6 {
-	margin-bottom: 0;
-}
-
-textarea {
-	overflow: auto;
-}
-
-p.subtitle {
-	padding-top: 0;
-	margin-top: 0;
-}
-div.sitenotice {
-	clear: both;
-}
diff --git a/skins/simple/discussionitem_icon.gif b/skins/simple/discussionitem_icon.gif
deleted file mode 100644
index e3ca6d9e..00000000
Binary files a/skins/simple/discussionitem_icon.gif and /dev/null differ
diff --git a/skins/simple/external.png b/skins/simple/external.png
deleted file mode 100644
index acf260fc..00000000
Binary files a/skins/simple/external.png and /dev/null differ
diff --git a/skins/simple/file_icon.gif b/skins/simple/file_icon.gif
deleted file mode 100644
index 69dbeaf7..00000000
Binary files a/skins/simple/file_icon.gif and /dev/null differ
diff --git a/skins/simple/link_icon.gif b/skins/simple/link_icon.gif
deleted file mode 100644
index 168c1a2f..00000000
Binary files a/skins/simple/link_icon.gif and /dev/null differ
diff --git a/skins/simple/lock_icon.gif b/skins/simple/lock_icon.gif
deleted file mode 100644
index 82844033..00000000
Binary files a/skins/simple/lock_icon.gif and /dev/null differ
diff --git a/skins/simple/mail_icon.gif b/skins/simple/mail_icon.gif
deleted file mode 100644
index cf5680d9..00000000
Binary files a/skins/simple/mail_icon.gif and /dev/null differ
diff --git a/skins/simple/main.css b/skins/simple/main.css
deleted file mode 100644
index edb1d7d4..00000000
--- a/skins/simple/main.css
+++ /dev/null
@@ -1,427 +0,0 @@
-/**
- * For clarity, explicitly state some recommendations from
- * http://www.w3.org/TR/CSS21/sample.html to make sure the editsection links scale right.
- */
-
-h1 {
-	font-size: 2em;
-}
-h2 {
-	font-size: 1.5em;
-}
-h3 {
-	font-size: 1.17em;
-}
-h5 {
-	font-size: .83em;
-}
-h6 {
-	font-size: .75em;
-}
-h1, h2, h3, h4, h5, h6 {
-	font-weight: bolder;
-}
-
-/* Now the custom parts */
-
-/* Make edit sections (which are inside h# tags) normal-sized */
-.editsection {
-	font-weight: normal;
-}
-h1 .editsection {
-	font-size: 50%;
-}
-h2 .editsection {
-	font-size: 66.7%;
-}
-h3 .editsection {
-	font-size: 85.5%;
-}
-h5 .editsection {
-	font-size: 120%;
-}
-h6 .editsection {
-	font-size: 133%;
-}
-
-#toolbar {
-	display: none;
-}
-
-div.center {
-	text-align: center;
-}
-
-#contentSub {
-	padding-left: 2em;
-}
-
-a {
-	text-decoration: none;
-}
-
-a:hover {
-	text-decoration: underline;
-}
-
-#column-content {
-	width: 100%;
-	float: right;
-	margin: 0 0 0.6em -12.2em;
-	padding: 0;
-}
-
-#content {
-	margin: 0em 0 0 12.2em;
-	padding: 0em 1em 1.5em 1em;
-	border-left: 1px solid #959595;
-	line-height: 1.5em;
-}
-
-#column-one {
-	position: absolute;
-	top: 0;
-	left: 0;
-}
-
-/* Hide, but keep accessible for screen-readers */
-#column-one h2 {
-	position: absolute;
-	top: -9999px;
-}
-
-body {
-	margin: 0;
-	padding: 0;
-}
-
-#globalWrapper {
-	width: 100%;
-	height: 100%;
-	margin: 0;
-	padding: 0;
-}
-.visualClear {
-	clear: both;
-}
-
-img {
-	border: none;
-}
-p {
-	margin: 0.4em 0em 0.5em 0em;
-	line-height: 1.5em;
-}
-p img {
-	margin: 0;
-}
-
-h1, h2, h3, h4, h5, h6 {
-	margin: 0;
-	padding-top: 0.5em;
-	padding-bottom: 0.17em;
-}
-fieldset {
-	margin: 1em 0em 1em 0em;
-	padding: 0em 1em 1em 1em;
-}
-.usermessage {
-	background-color: #ffce7b;
-	border: 1px solid #ffa500;
-	color: black;
-	font-weight: bold;
-	margin: 2em 0em 1em 0em;
-	padding: 0.5em 1em;
-	vertical-align: middle;
-}
-.error {
-	color: red;
-	font-size: larger;
-}
-
-table.rimage {
-	float: right;
-	position: relative;
-	margin-left: 1em;
-	margin-bottom: 1em;
-	text-align: center;
-}
-
-.portlet {
-	border: none;
-	float: none;
-	padding: 0;
-	width: 11.8em;
-	overflow: hidden;
-}
-.portlet h4 {
-	font-weight: normal;
-	white-space: nowrap;
-}
-.portlet h5 {
-	padding: 0em 1em 0em 0.5em;
-	display: inline;
-	height: 1em;
-	font-weight: normal;
-	white-space: nowrap;
-}
-.portlet h6 {
-	padding: 0em 1em 0em 1em;
-	display: block;
-	height: 1.2em;
-	font-weight: normal;
-	white-space: nowrap;
-}
-.pBody {
-	border-collapse: collapse;
-	padding: 0 0.8em 0.3em 0.5em;
-}
-.portlet h1,
-.portlet h2,
-.portlet h3,
-.portlet h4 {
-	margin: 0;
-	padding: 0;
-	font-size: small;
-}
-
-#p-search .pBody {
-	text-align: center;
-}
-
-#searchInput {
-	width: 100%;
-	clear: both;
-	margin: 0 0 0 0;
-}
-
-input.searchButton {
-	margin-top: 1px;
-	padding: 0 0.4em;
-	cursor: pointer;
-}
-
-#p-search .pBody {
-	padding: 0.5em 0.4em 0.4em 0.4em;
-}
-
-/* feed links */
-a.feedlink {
-	background: url(../common/images/feed-icon.png) center left no-repeat;
-	padding-left: 16px;
-}
-
-textarea {
-	width: 100%;
-}
-
-.pBody li,
-.pBody ul {
-	padding-left: 0em;
-	margin-left: 0.5em;
-}
-
-pre, .mw-code {
-	margin: 2em;
-	border: solid 1px black;
-}
-
-h1.firstHeading,
-h2 {
-	border-bottom: solid 1px black;
-}
-#bodyContent a.external,
-#bodyContent a.external[href ^="gopher://"] {
-	background: url(external.png) center right no-repeat;
-	padding-right: 13px;
-}
-#bodyContent a.external[href ^="https://"],
-.link-https {
-	background: url(lock_icon.gif) center right no-repeat;
-	padding-right: 16px;
-}
-#bodyContent a.external[href ^="mailto:"],
-.link-mailto {
-	background: url(mail_icon.gif) center right no-repeat;
-	padding-right: 18px;
-}
-#bodyContent a.external[href ^="news:"] {
-	background: url(news_icon.png) center right no-repeat;
-	padding-right: 18px;
-}
-#bodyContent a.external[href ^="ftp://"],
-.link-ftp {
-	background: url(file_icon.gif) center right no-repeat;
-	padding-right: 18px;
-}
-#bodyContent a.external[href ^="irc://"],
-#bodyContent a.external[href ^="ircs://"],
-.link-irc {
-	background: url(discussionitem_icon.gif) center right no-repeat;
-	padding-right: 18px;
-}
-
-#bodyContent a.extiw,
-#bodyContent a.extiw:active {
-	color: #5E7CFF;
-}
-
-td.diff-addedline {
-	background-color: #B9FFB0;
-}
-
-td.diff-deletedline {
-	background-color: #f8ffaa;
-}
-
-.diffchange {
-	background-color: #FFCDF3;
-	text-decoration: none;
-}
-
-#pagehistory li {
-	border: none;
-}
-
-div.tocindent {
-	margin-left: 2em;
-}
-#toc {
-	text-align: left;
-	border-top: solid 1px black;
-	border-bottom: solid 1px black;
-}
-
-/* @noflip */div.floatright, table.floatright {
-	margin: 0;
-	border-width: 0.5em 0 0.8em 1.4em;
-}
-div.floatright p {
-	font-style: italic;
-}
-/* @noflip */div.floatleft, table.floatleft {
-	margin: 0.3em 0.5em 0.5em 0;
-	border-width: 0.5em 1.4em 0.8em 0;
-}
-div.floatleft p {
-	font-style: italic;
-}
-
-/* thumbnails */
-div.thumb {
-	margin-bottom: 0.5em;
-	width: auto;
-}
-div.thumbinner {
-	padding: 3px !important;
-	text-align: center;
-	overflow: hidden;
-}
-
-html .thumbcaption {
-	border: none;
-	text-align: left;
-	line-height: 1.4;
-	padding: 0.3em 0 0.1em 0;
-}
-div.magnify {
-	float: right;
-	border: none !important;
-	background: none !important;
-}
-div.magnify a,
-div.magnify img {
-	display: block;
-	border: none !important;
-	background: none !important;
-}
-/* @noflip */div.tright {
-	border-width: 0.5em 0 0.8em 1.4em;
-}
-/* @noflip */div.tleft {
-	margin-right: 0.5em;
-	border-width: 0.5em 1.4em 0.8em 0;
-}
-img.thumbborder {
-	border: 1px solid #dddddd;
-}
-
-a.stub {
-	color: #772233;
-}
-a.new,
-#p-personal a.new {
-	color: #BA0000;
-	text-decoration: line-through;
-}
-li.new {
-	text-decoration: line-through;
-}
-/**
- * Overrides text justification (user preference)
- * See bug 31990
- */
-#catlinks {
-	text-align: center;
-}
-.catlinks {
-	text-align: center;
-	width: 80%;
-	margin-left: auto;
-	margin-right: auto;
-	padding: 3px;
-}
-
-#mytabs {
-	background-color: inherit;
-}
-#p-cactions {
-	background-color: inherit;
-}
-
-#footer {
-	padding-left: 11.8em;
-}
-
-#n-portal,
-#n-currentevents,
-#n-help,
-#n-sitesupport {
-	display: none;
-}
-
-#preftoc {
-	float: left;
-	margin: 1em;
-	width: 13em;
-}
-#preftoc li {
-}
-#preftoc li.selected {
-	border: 1px dashed #aaa;
-}
-#preftoc a,
-#preftoc a:active {
-	display: block;
-}
-div.htmlform-tip {
-	font-size: 95%;
-	margin-top: 1em;
-}
-
-#mw_trackbacks {
-	border-style: groove;
-}
-
-#jump-to-nav {
-	display: none;
-}
-
-table.collapsed tr.collapsable {
-	display: none;
-}
-
-.templatesUsed {
-	margin-top: 1.5em;
-}
-
diff --git a/skins/standard/main.css b/skins/standard/main.css
deleted file mode 100644
index a4b03a87..00000000
--- a/skins/standard/main.css
+++ /dev/null
@@ -1,188 +0,0 @@
-/**
- * This style sheet is used by the classic (aka standard) skin
- */
-
-#article {
-	padding: 4px;
-}
-
-#content {
-	margin: 0;
-	padding: 0;
-}
-
-#footer {
-	padding: 4px;
-	font-size: 95%;
-	clear: both;
-}
-
-#pagestats {
-	font-size: 9pt;
-}
-
-#powersearch {
-	background: #DDEEFF;
-	border-style: solid;
-	border-width: 1px;
-	padding: 2px;
-}
-
-#quickbar {
-	width: 140px;
-	height: 100%;
-	padding: 4px;
-	visibility: visible;
-	z-index: 99;
-	font-size: 95%;
-}
-
-#topbar {
-	padding: 4px;
-	font-size: 95%;
-}
-
-/* Table of contents */
-.toctoggle,
-.editsection {
-	font-size: smaller;
-}
-
-/* ... */
-#toolbar {
-	padding: 0;
-}
-
-#infobox {
-	background: #eeeeff;
-	color: black;
-}
-
-#editform {
-	margin-top: 1px;
-}
-
-a.interwiki,
-a.external {
-	color: #3366BB;
-}
-
-a.printable {
-	text-decoration: underline;
-}
-
-a.new {
-	color: #ba0000;
-}
-
-a.stub {
-	color: #772233;
-	text-decoration: none;
-}
-
-a:visited {
-	color: #5A3696;
-}
-
-body {
-	margin: 0;
-	padding: 4px;
-	color: black;
-}
-
-form.inline {
-	display: inline;
-}
-
-textarea {
-	overflow: auto;
-}
-
-h1.pagetitle {
-	padding-top: 0;
-	margin-top: 0;
-	padding-bottom: 0;
-	margin-bottom: 0;
-	font-size: 150%;
-}
-
-h1.pagetitle .editsection {
-	font-size: 66.7%;
-}
-
-h2 {
-	font-size: 120%;
-}
-
-h2 .editsection {
-	font-size: 83.3%;
-}
-
-h2, h3, h4, h5, h6 {
-	margin-bottom: 0;
-}
-
-h3 {
-	font-size: 106.25%;
-}
-
-h3 .editsection {
-	font-size: 94.1%;
-}
-
-h4 {
-	font-size: 103.125%;
-}
-
-h4 .editsection {
-	font-size: 97.0%;
-}
-
-h5 {
-	font-size: 100%;
-}
-
-h5 .editsection {
-	font-size: 100%;
-}
-
-h6 {
-	font-size: 95%;
-}
-
-h6 .editsection {
-	font-size: 105.3%;
-}
-
-hr.sep {
-	color: gray;
-	height: 1px;
-	background-color: gray;
-}
-
-p.subpages {
-	font-size: small;
-}
-
-p.subtitle {
-	padding-top: 0;
-	margin-top: 0;
-}
-
-.catlinks {
-	font-size: small;
-	margin-top: 0;
-	text-align:right;
-}
-
-td {
-	empty-cells: show;
-}
-
-td.bottom {
-	border-top: 1px solid gray;
-}
-
-td.top {
-	border-bottom: 1px solid gray;
-}
diff --git a/skins/vector/beta/screen.less b/skins/vector/beta/screen.less
new file mode 100644
index 00000000..6d56cd5c
--- /dev/null
+++ b/skins/vector/beta/screen.less
@@ -0,0 +1,75 @@
+/* Content */
+#content {
+	line-height: 1.5em;
+	.mw-editsection {
+		font-family: @content-font-family;
+	}
+
+	h1,
+	#firstHeading {
+		font-family: @content-heading-font-family;
+		font-size: 1.833em;
+		line-height: 22pt;
+		padding: 0;
+		margin-bottom: 4pt;
+	}
+
+	h2 {
+		font-size: 1.5em;
+		line-height: 22pt;
+	}
+
+	h2,
+	h3,
+	h4,
+	h5,
+	h6 {
+		font-family: @content-heading-font-family;
+		padding: 0;
+		margin-bottom: 4pt;
+		margin-top: 14pt;
+	}
+
+	h3 {
+		font-size: 1.17em;
+		line-height: 22pt;
+	}
+
+	h3,
+	h4 {
+		font-weight: bold;
+	}
+
+	h4,
+	h5,
+	h6 {
+		font-size: 100%; /* (reset) */
+	}
+
+	h6 {
+		font-style: italic;
+	}
+
+	p {
+		margin-bottom: 8pt;
+	}
+
+	// FIXME: this is hacky
+	#toc h2 {
+		font-size: 100%;
+	}
+}
+
+/* Personal menu */
+#p-personal a {
+	color: #555;
+}
+
+/* Main menu */
+div#mw-panel div.portal {
+	margin-left: 1.25em;
+	h3 {
+		margin: 0;
+		line-height: 1;
+	}
+}
diff --git a/skins/vector/beta/variables.less b/skins/vector/beta/variables.less
new file mode 100644
index 00000000..08e662dc
--- /dev/null
+++ b/skins/vector/beta/variables.less
@@ -0,0 +1,37 @@
+@html-font-size: 90%;
+
+@body-font-size: inherit;
+
+// Page content
+@content-font-family: "Helvetica Neue", "Helvetica", "Nimbus Sans L", "Arial", "Liberation Sans", sans-serif;
+@content-font-color: #252525;
+@content-font-size: 0.9em;
+@content-line-height: inherit;
+@content-padding: 1em;
+@content-heading-font-size: 1.6em;
+@content-heading-font-family: Georgia, "DejaVu Serif", serif;
+
+// Common menu
+@menu-link-color: #555;
+
+// Main menu
+@menu-main-font-size: 0.82em;
+@menu-main-heading-font-size: 100%;
+@menu-main-heading-padding: 5px 0;
+
+@menu-main-body-font-size: inherit;
+@menu-main-body-link-color: inherit;
+@menu-main-body-link-visited-color: inherit;
+@menu-main-body-margin: 0;
+@menu-main-body-padding: 0 0 10px;
+@menu-main-logo-left: 1.6em;
+
+// Personal menu
+@menu-personal-font-size: 0.75em;
+
+// Collapsible nav
+@collapsible-nav-heading-color: #555;
+@collapsible-nav-heading-collapsed-color: inherit;
+
+@collapsible-nav-heading-padding: 4px 0 3px 1.5em;
+@collapsible-nav-body-margin: 0 0 0 1.25em;
diff --git a/skins/vector/collapsibleNav.js b/skins/vector/collapsibleNav.js
new file mode 100644
index 00000000..67313c95
--- /dev/null
+++ b/skins/vector/collapsibleNav.js
@@ -0,0 +1,121 @@
+/**
+ * Collapsible navigation for Vector
+ */
+( function ( mw, $ ) {
+	'use strict';
+	var map;
+
+	// Use the same function for all navigation headings - don't repeat
+	function toggle( $element ) {
+		$.cookie(
+			'vector-nav-' + $element.parent().attr( 'id' ),
+			$element.parent().is( '.collapsed' ),
+			{ 'expires': 30, 'path': '/' }
+		);
+		$element
+			.parent()
+			.toggleClass( 'expanded' )
+			.toggleClass( 'collapsed' )
+			.find( '.body' )
+			.slideToggle( 'fast' );
+	}
+
+	/* Browser Support */
+
+	map = {
+		// Left-to-right languages
+		ltr: {
+			// Collapsible Nav is broken in Opera < 9.6 and Konqueror < 4
+			opera: [['>=', 9.6]],
+			konqueror: [['>=', 4.0]],
+			blackberry: false,
+			ipod: false,
+			iphone: false,
+			ps3: false
+		},
+		// Right-to-left languages
+		rtl: {
+			opera: [['>=', 9.6]],
+			konqueror: [['>=', 4.0]],
+			blackberry: false,
+			ipod: false,
+			iphone: false,
+			ps3: false
+		}
+	};
+	if ( !$.client.test( map ) ) {
+		return true;
+	}
+
+	$( function ( $ ) {
+		var $headings, tabIndex;
+
+		/* General Portal Modification */
+
+		// Always show the first portal
+		$( '#mw-panel > .portal:first' ).addClass( 'first persistent' );
+		// Apply a class to the entire panel to activate styles
+		$( '#mw-panel' ).addClass( 'collapsible-nav' );
+		// Use cookie data to restore preferences of what to show and hide
+		$( '#mw-panel > .portal:not(.persistent)' )
+			.each( function ( i ) {
+				var id = $(this).attr( 'id' ),
+					state = $.cookie( 'vector-nav-' + id );
+				// Add anchor tag to heading for better accessibility
+				$( this ).find( 'h3' ).wrapInner( $( '<a href="#"></a>' ).click( false ) );
+				// In the case that we are not showing the new version, let's show the languages by default
+				if (
+					state === 'true' ||
+					( state === null && i < 1 ) ||
+					( state === null && id === 'p-lang' )
+				) {
+					$(this)
+						.addClass( 'expanded' )
+						.removeClass( 'collapsed' )
+						.find( '.body' )
+						.hide() // bug 34450
+						.show();
+				} else {
+					$(this)
+						.addClass( 'collapsed' )
+						.removeClass( 'expanded' );
+				}
+				// Re-save cookie
+				if ( state !== null ) {
+					$.cookie( 'vector-nav-' + $(this).attr( 'id' ), state, { 'expires': 30, 'path': '/' } );
+				}
+			} );
+
+		/* Tab Indexing */
+
+		$headings = $( '#mw-panel > .portal:not(.persistent) > h3' );
+
+		// Get the highest tab index
+		tabIndex = $( document ).lastTabIndex() + 1;
+
+		// Fix the search not having a tabindex
+		$( '#searchInput' ).attr( 'tabindex', tabIndex++ );
+
+		// Make it keyboard accessible
+		$headings.attr( 'tabindex', function () {
+			return tabIndex++;
+		});
+
+		// Toggle the selected menu's class and expand or collapse the menu
+		$( '#mw-panel' )
+			.delegate( '.portal:not(.persistent) > h3', 'keydown', function ( e ) {
+				// Make the space and enter keys act as a click
+				if ( e.which === 13 /* Enter */ || e.which === 32 /* Space */ ) {
+					toggle( $(this) );
+				}
+			} )
+			.delegate( '.portal:not(.persistent) > h3', 'mousedown', function ( e ) {
+				if ( e.which !== 3 ) { // Right mouse click
+					toggle( $(this) );
+					$(this).blur();
+				}
+				return false;
+			} );
+	});
+
+}( mediaWiki, jQuery ) );
diff --git a/skins/vector/collapsibleNav.less b/skins/vector/collapsibleNav.less
new file mode 100644
index 00000000..e6f5c9aa
--- /dev/null
+++ b/skins/vector/collapsibleNav.less
@@ -0,0 +1,91 @@
+/**
+ * LESS Stylesheet for collapsible nav
+ */
+@import "mediawiki.mixins.less";
+
+#mw-panel.collapsible-nav {
+	.portal {
+		background-position: left top;
+		background-repeat: no-repeat;
+		.background-image('images/portal-break.png');
+		padding: 0.25em 0 !important;
+		margin: -11px 9px 10px 11px;
+
+		h3 {
+			font-size: @menu-main-heading-font-size;
+			color: @collapsible-nav-heading-color;
+			font-weight: normal;
+			background-position: left center;
+			background-repeat: no-repeat;
+			.background-image-svg('images/arrow-expanded.svg', 'images/arrow-expanded.png');
+			padding: @collapsible-nav-heading-padding;
+			margin-bottom: 0;
+
+			&:hover {
+				cursor: pointer;
+				text-decoration: none;
+			}
+
+			a {
+				color: @collapsible-nav-heading-color;
+				text-decoration: none;
+			}
+		}
+
+		.body {
+			margin: @collapsible-nav-body-margin;
+			background-image: none !important;
+			padding-top: 0;
+			display: none;
+
+			ul {
+				li {
+					padding: 0.25em 0;
+				}
+			}
+		}
+
+
+		/* First */
+		&.first {
+			background-image: none;
+			margin-top: 0;
+			h3 {
+				display: none;
+			}
+		}
+
+		/* Persistent */
+		&.persistent {
+			.body {
+				display: block;
+				margin-left: 0.5em;
+			}
+
+			h3 {
+				background-image: none !important;
+				padding-left: 0.7em;
+				cursor: default;
+			}
+		}
+
+		/* Collapsed */
+		&.collapsed {
+			h3 {
+				color: @collapsible-nav-heading-collapsed-color;
+				background-position: left center;
+				background-repeat: no-repeat;
+				.background-image-svg('images/arrow-collapsed-ltr.svg', 'images/arrow-collapsed-ltr.png');
+				margin-bottom: 0;
+
+				&:hover {
+					text-decoration: underline;
+				}
+
+				a {
+					color: @collapsible-nav-heading-collapsed-color;
+				}
+			}
+		}
+	}
+}
diff --git a/skins/vector/collapsibleTabs.js b/skins/vector/collapsibleTabs.js
new file mode 100644
index 00000000..e3c2c519
--- /dev/null
+++ b/skins/vector/collapsibleTabs.js
@@ -0,0 +1,210 @@
+/**
+ * Collapsible tabs jQuery Plugin
+ */
+( function ( $ ) {
+	var rtl = $( 'html' ).attr( 'dir' ) === 'rtl';
+	$.fn.collapsibleTabs = function ( options ) {
+		// return if the function is called on an empty jquery object
+		if ( !this.length ) {
+			return this;
+		}
+		// Merge options into the defaults
+		var $settings = $.extend( {}, $.collapsibleTabs.defaults, options );
+
+		this.each( function () {
+			var $el = $( this );
+			// add the element to our array of collapsible managers
+			$.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ?
+				$el : $.collapsibleTabs.instances.add( $el ) );
+			// attach the settings to the elements
+			$el.data( 'collapsibleTabsSettings', $settings );
+			// attach data to our collapsible elements
+			$el.children( $settings.collapsible ).each( function () {
+				$.collapsibleTabs.addData( $( this ) );
+			} );
+		} );
+
+		// if we haven't already bound our resize hanlder, bind it now
+		if ( !$.collapsibleTabs.boundEvent ) {
+			$( window )
+				.delayedBind( 500, 'resize', function () {
+					$.collapsibleTabs.handleResize();
+				} );
+		}
+		// call our resize handler to setup the page
+		$.collapsibleTabs.handleResize();
+		return this;
+	};
+	/**
+	 * Returns the amount of horizontal distance between the two tabs groups
+	 * (#left-navigation and #right-navigation), in pixels. If negative, this
+	 * means that the tabs overlap, and the value is the width of overlapping
+	 * parts.
+	 *
+	 * Used in default expandCondition and collapseCondition.
+	 *
+	 * @return {Numeric} distance/overlap in pixels
+	 */
+	function calculateTabDistance() {
+		var $leftTab, $rightTab, leftEnd, rightStart;
+
+		// In RTL, #right-navigation is actually on the left and vice versa.
+		// Hooray for descriptive naming.
+		if ( !rtl ) {
+			$leftTab = $( '#left-navigation' );
+			$rightTab = $( '#right-navigation' );
+		} else {
+			$leftTab = $( '#right-navigation' );
+			$rightTab = $( '#left-navigation' );
+		}
+
+		leftEnd = $leftTab.offset().left + $leftTab.width();
+		rightStart = $rightTab.offset().left;
+
+		return rightStart - leftEnd;
+	}
+	$.collapsibleTabs = {
+		instances: [],
+		boundEvent: null,
+		defaults: {
+			expandedContainer: '#p-views ul',
+			collapsedContainer: '#p-cactions ul',
+			collapsible: 'li.collapsible',
+			shifting: false,
+			expandCondition: function ( eleWidth ) {
+				// If there's at least eleWidth pixels free space, expand.
+				return calculateTabDistance() >= eleWidth;
+			},
+			collapseCondition: function () {
+				// If there's an overlap, collapse.
+				return calculateTabDistance() < 0;
+			}
+		},
+		addData: function ( $collapsible ) {
+			var $settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
+			if ( $settings !== null ) {
+				$collapsible.data( 'collapsibleTabsSettings', {
+					expandedContainer: $settings.expandedContainer,
+					collapsedContainer: $settings.collapsedContainer,
+					expandedWidth: $collapsible.width(),
+					prevElement: $collapsible.prev()
+				} );
+			}
+		},
+		getSettings: function ( $collapsible ) {
+			var $settings = $collapsible.data( 'collapsibleTabsSettings' );
+			if ( $settings === undefined ) {
+				$.collapsibleTabs.addData( $collapsible );
+				$settings = $collapsible.data( 'collapsibleTabsSettings' );
+			}
+			return $settings;
+		},
+		/**
+		 * @param {jQuery.Event} e
+		 */
+		handleResize: function () {
+			$.collapsibleTabs.instances.each( function () {
+				var $el = $( this ),
+					data = $.collapsibleTabs.getSettings( $el );
+
+				if ( data.shifting ) {
+					return;
+				}
+
+				// if the two navigations are colliding
+				if ( $el.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
+
+					$el.trigger( 'beforeTabCollapse' );
+					// move the element to the dropdown menu
+					$.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible + ':last' ) );
+				}
+
+				// if there are still moveable items in the dropdown menu,
+				// and there is sufficient space to place them in the tab container
+				if ( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0 &&
+						data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
+								data.collapsible + ':first' ) ).expandedWidth ) ) {
+					//move the element from the dropdown to the tab
+					$el.trigger( 'beforeTabExpand' );
+					$.collapsibleTabs
+						.moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' );
+				}
+			} );
+		},
+		moveToCollapsed: function ( ele ) {
+			var data, expContainerSettings, target,
+				$moving = $( ele );
+
+			data = $.collapsibleTabs.getSettings( $moving );
+			if ( !data ) {
+				return;
+			}
+			expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+			if ( !expContainerSettings ) {
+				return;
+			}
+			expContainerSettings.shifting = true;
+
+			// Remove the element from where it's at and put it in the dropdown menu
+			target = data.collapsedContainer;
+			$moving.css( 'position', 'relative' )
+				.css( ( rtl ? 'left' : 'right' ), 0 )
+				.animate( { width: '1px' }, 'normal', function () {
+					var data, expContainerSettings;
+					$( this ).hide();
+					// add the placeholder
+					$( '<span class="placeholder" style="display: none;"></span>' ).insertAfter( this );
+					// XXX: 'data' is undefined here, should the 'data' from the outer scope have
+					// a different name?
+					$( this ).detach().prependTo( target ).data( 'collapsibleTabsSettings', data );
+					$( this ).attr( 'style', 'display: list-item;' );
+					data = $.collapsibleTabs.getSettings( $( ele ) );
+					if ( data ) {
+						expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+						if ( expContainerSettings ) {
+							expContainerSettings.shifting = false;
+							$.collapsibleTabs.handleResize();
+						}
+					}
+				} );
+		},
+		moveToExpanded: function ( ele ) {
+			var data, expContainerSettings, $target, expandedWidth,
+				$moving = $( ele );
+
+			data = $.collapsibleTabs.getSettings( $moving );
+			if ( !data ) {
+				return;
+			}
+			expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+			if ( !expContainerSettings ) {
+				return;
+			}
+			expContainerSettings.shifting = true;
+
+			// grab the next appearing placeholder so we can use it for replacing
+			$target = $( data.expandedContainer ).find( 'span.placeholder:first' );
+			expandedWidth = data.expandedWidth;
+			$moving.css( 'position', 'relative' ).css( ( rtl ? 'right' : 'left' ), 0 ).css( 'width', '1px' );
+			$target.replaceWith(
+				$moving
+				.detach()
+				.css( 'width', '1px' )
+				.data( 'collapsibleTabsSettings', data )
+				.animate( { width: expandedWidth + 'px' }, 'normal', function () {
+					$( this ).attr( 'style', 'display: block;' );
+					var data, expContainerSettings;
+					data = $.collapsibleTabs.getSettings( $( this ) );
+					if ( data ) {
+						expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+						if ( expContainerSettings ) {
+							expContainerSettings.shifting = false;
+							$.collapsibleTabs.handleResize();
+						}
+					}
+				} )
+			);
+		}
+	};
+
+}( jQuery ) );
diff --git a/skins/vector/externalLinks.less b/skins/vector/externalLinks.less
new file mode 100644
index 00000000..5b02abbd
--- /dev/null
+++ b/skins/vector/externalLinks.less
@@ -0,0 +1,75 @@
+// FIXME: This size of this CSS is ridiculous. Please refactor (see bug 54604)
+@import "mediawiki.mixins.less";
+
+div#content a.external {
+	background-position: center right;
+	background-repeat: no-repeat;
+	.background-image('images/external-link-ltr-icon.png');
+	padding-right: 13px;
+}
+div#content a.external[href ^="https://"],
+.link-https {
+	background-position: center right;
+	background-repeat: no-repeat;
+	.background-image('images/lock-icon.png');
+	padding-right: 13px;
+}
+div#content a.external[href ^="mailto:"],
+.link-mailto {
+	background-position: center right;
+	background-repeat: no-repeat;
+	.background-image('images/mail-icon.png');
+	padding-right: 13px;
+}
+div#content a.external[href ^="news:"] {
+	background-position: center right;
+	background-repeat: no-repeat;
+	.background-image('images/news-icon.png');
+	padding-right: 13px;
+}
+div#content a.external[href ^="ftp://"],
+.link-ftp {
+	background-position: center right;
+	background-repeat: no-repeat;
+	.background-image('images/file-icon.png');
+	padding-right: 13px;
+}
+div#content a.external[href ^="irc://"],
+div#content a.external[href ^="ircs://"],
+.link-irc {
+	background-position: center right;
+	background-repeat: no-repeat;
+	.background-image('images/talk-icon.png');
+	padding-right: 13px;
+}
+div#content a.external[href $=".ogg"], div#content a.external[href $=".OGG"],
+div#content a.external[href $=".mid"], div#content a.external[href $=".MID"],
+div#content a.external[href $=".midi"], div#content a.external[href $=".MIDI"],
+div#content a.external[href $=".mp3"], div#content a.external[href $=".MP3"],
+div#content a.external[href $=".wav"], div#content a.external[href $=".WAV"],
+div#content a.external[href $=".wma"], div#content a.external[href $=".WMA"],
+.link-audio {
+	background-position: center right;
+	background-repeat: no-repeat;
+	.background-image('images/audio-icon.png');
+	padding-right: 13px;
+}
+div#content a.external[href $=".ogm"], div#content a.external[href $=".OGM"],
+div#content a.external[href $=".avi"], div#content a.external[href $=".AVI"],
+div#content a.external[href $=".mpeg"], div#content a.external[href $=".MPEG"],
+div#content a.external[href $=".mpg"], div#content a.external[href $=".MPG"],
+.link-video {
+	background-position: center right;
+	background-repeat: no-repeat;
+	.background-image('images/video-icon.png');
+	padding-right: 13px;
+}
+div#content a.external[href $=".pdf"], div#content a.external[href $=".PDF"],
+div#content a.external[href *=".pdf#"], div#content a.external[href *=".PDF#"],
+div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
+.link-document {
+	background-position: center right;
+	background-repeat: no-repeat;
+	.background-image('images/document-icon.png');
+	padding-right: 13px;
+}
diff --git a/skins/vector/images/arrow-collapsed-ltr.png b/skins/vector/images/arrow-collapsed-ltr.png
new file mode 100644
index 00000000..063ac6f7
Binary files /dev/null and b/skins/vector/images/arrow-collapsed-ltr.png differ
diff --git a/skins/vector/images/arrow-collapsed-ltr.svg b/skins/vector/images/arrow-collapsed-ltr.svg
new file mode 100644
index 00000000..d0c4729c
--- /dev/null
+++ b/skins/vector/images/arrow-collapsed-ltr.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   width="16"
+   height="16"
+   id="svg2">
+  <defs
+     id="defs4" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(0,-1036.0288)"
+     id="layer1">
+    <path
+       d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
+       transform="matrix(0,-2.7307791,1.576616,0,0.05143855,1066.4148)"
+       id="path2985"
+       style="fill:#797979;fill-opacity:1;stroke:none" />
+  </g>
+</svg>
diff --git a/skins/vector/images/arrow-collapsed-rtl.png b/skins/vector/images/arrow-collapsed-rtl.png
new file mode 100644
index 00000000..c3462182
Binary files /dev/null and b/skins/vector/images/arrow-collapsed-rtl.png differ
diff --git a/skins/vector/images/arrow-collapsed-rtl.svg b/skins/vector/images/arrow-collapsed-rtl.svg
new file mode 100644
index 00000000..8c5e04b9
--- /dev/null
+++ b/skins/vector/images/arrow-collapsed-rtl.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   width="16"
+   height="16"
+   id="svg2">
+  <defs
+     id="defs4" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(0,-1036.0288)"
+     id="layer1">
+    <path
+       d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
+       transform="matrix(0,2.7307791,-1.576616,0,15.948561,1021.6428)"
+       id="path2985"
+       style="fill:#797979;fill-opacity:1;stroke:none" />
+  </g>
+</svg>
diff --git a/skins/vector/images/arrow-down-focus-icon.svg b/skins/vector/images/arrow-down-focus-icon.svg
new file mode 100644
index 00000000..f2edf263
--- /dev/null
+++ b/skins/vector/images/arrow-down-focus-icon.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   width="22"
+   height="16"
+   id="svg2">
+  <defs
+     id="defs4" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(0,-1036.3622)"
+     id="layer1">
+    <path
+       d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
+       transform="matrix(2.7307791,0,0,1.576616,-11.885956,1036.4136)"
+       id="path2985"
+       style="fill:#929292;fill-opacity:1;stroke:none" />
+  </g>
+</svg>
diff --git a/skins/vector/images/arrow-down-icon.svg b/skins/vector/images/arrow-down-icon.svg
new file mode 100644
index 00000000..9218ff28
--- /dev/null
+++ b/skins/vector/images/arrow-down-icon.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   width="22"
+   height="16"
+   id="svg2">
+  <defs
+     id="defs4" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(0,-1036.3622)"
+     id="layer1">
+    <path
+       d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
+       transform="matrix(2.7307791,0,0,1.576616,-11.885956,1036.4136)"
+       id="path2985"
+       style="fill:#797979;fill-opacity:1;stroke:none" />
+  </g>
+</svg>
diff --git a/skins/vector/images/arrow-expanded.png b/skins/vector/images/arrow-expanded.png
new file mode 100644
index 00000000..0221028e
Binary files /dev/null and b/skins/vector/images/arrow-expanded.png differ
diff --git a/skins/vector/images/arrow-expanded.svg b/skins/vector/images/arrow-expanded.svg
new file mode 100644
index 00000000..60704d27
--- /dev/null
+++ b/skins/vector/images/arrow-expanded.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   width="16"
+   height="16"
+   id="svg2">
+  <defs
+     id="defs4" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(0,-1036.3622)"
+     id="layer1">
+    <path
+       d="M 10.028624,3.7729932 8.1976442,6.9443424 6.3666649,3.7729932 z"
+       transform="matrix(2.7307791,0,0,1.576616,-14.385956,1036.4136)"
+       id="path2985"
+       style="fill:#797979;fill-opacity:1;stroke:none" />
+  </g>
+</svg>
diff --git a/skins/vector/images/edit-icon.png b/skins/vector/images/edit-icon.png
index 462ca643..43e46919 100644
Binary files a/skins/vector/images/edit-icon.png and b/skins/vector/images/edit-icon.png differ
diff --git a/skins/vector/images/external-link-ltr-icon.png b/skins/vector/images/external-link-ltr-icon.png
index acf260fc..63083831 100644
Binary files a/skins/vector/images/external-link-ltr-icon.png and b/skins/vector/images/external-link-ltr-icon.png differ
diff --git a/skins/vector/images/external-link-rtl-icon.png b/skins/vector/images/external-link-rtl-icon.png
index 7d5ee375..5313234e 100644
Binary files a/skins/vector/images/external-link-rtl-icon.png and b/skins/vector/images/external-link-rtl-icon.png differ
diff --git a/skins/vector/images/mail-icon.png b/skins/vector/images/mail-icon.png
index 9823d72c..0d93a2f8 100644
Binary files a/skins/vector/images/mail-icon.png and b/skins/vector/images/mail-icon.png differ
diff --git a/skins/vector/images/news-icon.png b/skins/vector/images/news-icon.png
index ade1a376..6f27054b 100644
Binary files a/skins/vector/images/news-icon.png and b/skins/vector/images/news-icon.png differ
diff --git a/skins/vector/images/page-fade.png b/skins/vector/images/page-fade.png
index 1436cda0..b4a60342 100644
Binary files a/skins/vector/images/page-fade.png and b/skins/vector/images/page-fade.png differ
diff --git a/skins/vector/images/portal-break-ltr.png b/skins/vector/images/portal-break-ltr.png
index cec17ea1..20bf3668 100644
Binary files a/skins/vector/images/portal-break-ltr.png and b/skins/vector/images/portal-break-ltr.png differ
diff --git a/skins/vector/images/preferences-break.png b/skins/vector/images/preferences-break.png
index e59f5783..b5293082 100644
Binary files a/skins/vector/images/preferences-break.png and b/skins/vector/images/preferences-break.png differ
diff --git a/skins/vector/images/tab-break.png b/skins/vector/images/tab-break.png
index c03c72e4..6d37af5b 100644
Binary files a/skins/vector/images/tab-break.png and b/skins/vector/images/tab-break.png differ
diff --git a/skins/vector/images/talk-icon.png b/skins/vector/images/talk-icon.png
index c4434351..0332054e 100644
Binary files a/skins/vector/images/talk-icon.png and b/skins/vector/images/talk-icon.png differ
diff --git a/skins/vector/images/user-icon.svg b/skins/vector/images/user-icon.svg
new file mode 100644
index 00000000..767d5107
--- /dev/null
+++ b/skins/vector/images/user-icon.svg
@@ -0,0 +1,424 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   width="12"
+   height="13.837458"
+   id="svg2108">
+  <metadata
+     id="metadata68">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs3">
+    <linearGradient
+       id="linearGradient4356">
+      <stop
+         id="stop4358"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4360"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4344">
+      <stop
+         id="stop4346"
+         style="stop-color:#727e0a;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4348"
+         style="stop-color:#5b6508;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4338">
+      <stop
+         id="stop4340"
+         style="stop-color:#e9b15e;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4342"
+         style="stop-color:#966416;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4163">
+      <stop
+         id="stop4165"
+         style="stop-color:#3b74bc;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4167"
+         style="stop-color:#2d5990;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3824">
+      <stop
+         id="stop3826"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3828"
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3816">
+      <stop
+         id="stop3818"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3820"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3800">
+      <stop
+         id="stop3802"
+         style="stop-color:#f4d9b1;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3804"
+         style="stop-color:#df9725;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <radialGradient
+       cx="29.344931"
+       cy="17.064077"
+       r="9.1620579"
+       fx="29.344931"
+       fy="17.064077"
+       id="radialGradient3806"
+       xlink:href="#linearGradient3800"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient3822"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient3830"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="28.089741"
+       cy="27.203083"
+       r="13.56536"
+       fx="28.089741"
+       fy="27.203083"
+       id="radialGradient4169"
+       xlink:href="#linearGradient4163"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.297564,0,0,0.884831,-8.358505,4.940469)" />
+    <radialGradient
+       cx="29.344931"
+       cy="17.064077"
+       r="9.1620579"
+       fx="29.344931"
+       fy="17.064077"
+       id="radialGradient4171"
+       xlink:href="#linearGradient3800"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient4175"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.707108,0)" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient4179"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient4326"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-12.41789,-7)" />
+    <radialGradient
+       cx="29.344931"
+       cy="17.064077"
+       r="9.1620579"
+       fx="29.344931"
+       fy="17.064077"
+       id="radialGradient4328"
+       xlink:href="#linearGradient4338"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient4330"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient4332"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-13.125,-7)" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient4336"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="16.214741"
+       cy="19.836468"
+       r="13.56536"
+       fx="16.214741"
+       fy="19.836468"
+       id="radialGradient4350"
+       xlink:href="#linearGradient4344"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.681917,0,8.233773)" />
+    <linearGradient
+       x1="20.661695"
+       y1="35.817974"
+       x2="22.626925"
+       y2="36.217758"
+       id="linearGradient4362"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,6.231716,-2.651466)" />
+    <linearGradient
+       x1="22.686766"
+       y1="36.3904"
+       x2="21.408455"
+       y2="35.739632"
+       id="linearGradient4366"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,55.1096,-3.945209)" />
+    <linearGradient
+       x1="20.661695"
+       y1="35.817974"
+       x2="22.626925"
+       y2="36.217758"
+       id="linearGradient4372"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,-7.07212,-9.82492)" />
+    <linearGradient
+       x1="22.686766"
+       y1="36.3904"
+       x2="21.408455"
+       y2="35.739632"
+       id="linearGradient4374"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,41.80576,-11.11866)" />
+    <linearGradient
+       x1="22.686766"
+       y1="36.3904"
+       x2="21.408455"
+       y2="35.739632"
+       id="linearGradient1366"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,41.80576,-11.11866)" />
+    <linearGradient
+       x1="20.661695"
+       y1="35.817974"
+       x2="22.626925"
+       y2="36.217758"
+       id="linearGradient1369"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,-7.07212,-9.82492)" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient1372"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-12.41789,-7)" />
+    <radialGradient
+       cx="16.214741"
+       cy="19.836468"
+       r="13.56536"
+       fx="16.214741"
+       fy="19.836468"
+       id="radialGradient1381"
+       xlink:href="#linearGradient4344"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.681917,0,8.233773)" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient2243"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="28.089741"
+       cy="27.203083"
+       r="13.56536"
+       fx="28.089741"
+       fy="27.203083"
+       id="radialGradient2245"
+       xlink:href="#linearGradient4163"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.297564,0,0,0.884831,-8.358505,4.940469)" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient2247"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient2249"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="29.344931"
+       cy="17.064077"
+       r="9.1620579"
+       fx="29.344931"
+       fy="17.064077"
+       id="radialGradient2251"
+       xlink:href="#linearGradient3800"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
+    <linearGradient
+       x1="20.661695"
+       y1="35.817974"
+       x2="22.626925"
+       y2="36.217758"
+       id="linearGradient2253"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,6.231716,-2.651466)" />
+    <linearGradient
+       x1="22.686766"
+       y1="36.3904"
+       x2="21.408455"
+       y2="35.739632"
+       id="linearGradient2255"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,55.1096,-3.945209)" />
+  </defs>
+  <g
+     transform="translate(-5.0000039,-32.070112)"
+     id="layer1"
+     style="display:inline" />
+  <g
+     transform="translate(-5.0000039,-32.070112)"
+     id="layer2"
+     style="display:inline">
+    <g
+       transform="matrix(0.39012793,0,0,0.39012793,-1.0891578,28.22979)"
+       id="g2230">
+      <path
+         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+         transform="matrix(1.77551,0,0,0.959183,-24.25322,18.77153)"
+         id="path4306"
+         style="color:#000000;fill:url(#radialGradient2243);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 25.986174,41.636039 10.606602,0 c 3.005204,0 5.980484,-1.101932 7.071067,-4.242641 1.035639,-2.982476 0.176777,-8.662058 -6.540737,-13.258252 l -12.551146,0 c -6.717514,4.24264 -7.556991,10.044831 -6.010407,13.435028 1.575595,3.45379 4.24264,4.065865 7.424621,4.065865 z"
+         id="path4308"
+         style="color:#000000;fill:url(#radialGradient2245);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 26.693281,25.726136 c 3.18198,2.828427 4.596194,13.081476 4.596194,13.081476 0,0 1.414213,-10.253048 3.889087,-13.258252 l -8.485281,0.176776 z"
+         id="path4310"
+         style="color:#000000;fill:url(#linearGradient2247);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 28.972721,26.786797 c 0,0 -2.151323,1.660335 -1.965991,3.660533 -2.041226,-1.800794 -2.099873,-5.251524 -2.099873,-5.251524 l 4.065864,1.590991 z"
+         id="path4312"
+         style="color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 25.914862,40.593933 10.493447,-0.0221 c 2.639723,0 5.253161,-0.967919 6.211112,-3.726667 0.909689,-2.61976 -0.09472,-7.608614 -5.995279,-11.645837 L 25.099417,24.956264 c -5.900557,3.726667 -7.04262,8.823219 -5.662029,12.044182 1.380592,3.220963 3.395211,3.57139 6.477474,3.593487 z"
+         id="path4314"
+         style="opacity:0.21518986;color:#000000;fill:none;stroke:#ffffff;stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 33.410795,26.786797 c 0,0 2.151323,1.660335 1.965991,3.660533 2.041226,-1.800794 2.099873,-5.251524 2.099873,-5.251524 l -4.065864,1.590991 z"
+         id="path4316"
+         style="color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+         transform="translate(-0.125,3.5)"
+         id="path4318"
+         style="color:#000000;fill:url(#radialGradient2249);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+         id="path4320"
+         style="color:#000000;fill:url(#radialGradient2251);fill-opacity:1;fill-rule:evenodd;stroke:#c17d11;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+         transform="matrix(0.877095,0,0,0.877095,3.823927,2.336267)"
+         id="path4322"
+         style="opacity:0.19620254;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.14012825px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 21.85179,40.775197 c -1.247607,-0.544969 -1.805994,-1.858277 -1.805994,-1.858277 0.841281,-4.069136 3.719925,-7.046216 3.719925,-7.046216 0,0 -2.279321,6.411514 -1.913931,8.904493 z"
+         id="path4354"
+         style="opacity:0.22784807;color:#000000;fill:url(#linearGradient2253);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 40.757497,39.916846 c 1.231251,-0.580978 1.80438,-2.002321 1.80438,-2.002321 -0.95912,-4.042983 -3.976149,-6.842821 -3.976149,-6.842821 0,0 2.464593,6.342602 2.171769,8.845142 z"
+         id="path4364"
+         style="opacity:0.22784807;color:#000000;fill:url(#linearGradient2255);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+    </g>
+  </g>
+</svg>
diff --git a/skins/vector/images/video-icon.png b/skins/vector/images/video-icon.png
index e934a0ff..ed852322 100644
Binary files a/skins/vector/images/video-icon.png and b/skins/vector/images/video-icon.png differ
diff --git a/skins/vector/screen-hd.css b/skins/vector/screen-hd.css
deleted file mode 100644
index b90fd63b..00000000
--- a/skins/vector/screen-hd.css
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Vector screen styles for high definition displays */
-
-div#content {
-	margin-left: 11em;
-	padding: 1.25em 1.5em 1.5em 1.5em;
-}
-#p-logo {
-	left: 0.5em;
-}
-div#footer {
-	margin-left: 11em;
-	padding: 1.25em;
-}
-#mw-panel {
-	padding-left: 0.5em;
-}
-#p-search {
-	margin-right: 1em;
-}
-#left-navigation {
-	left: 11em;
-}
-#p-personal {
-	right: 1em;
-}
-#mw-head-base {
-	margin-left: 11em;
-}
diff --git a/skins/vector/screen-hd.less b/skins/vector/screen-hd.less
new file mode 100644
index 00000000..5a1fc055
--- /dev/null
+++ b/skins/vector/screen-hd.less
@@ -0,0 +1,28 @@
+/* Vector screen styles for high definition displays */
+
+div#content {
+	margin-left: 11em;
+	padding: 1.25em 1.5em 1.5em 1.5em;
+}
+#p-logo {
+	left: @menu-main-logo-left;
+}
+div#footer {
+	margin-left: 11em;
+	padding: 1.25em;
+}
+#mw-panel {
+	padding-left: 0.5em;
+}
+#p-search {
+	margin-right: 1em;
+}
+#left-navigation {
+	margin-left: 11em;
+}
+#p-personal {
+	right: 1em;
+}
+#mw-head-base {
+	margin-left: 11em;
+}
diff --git a/skins/vector/screen.css b/skins/vector/screen.css
deleted file mode 100644
index 2e09ee17..00000000
--- a/skins/vector/screen.css
+++ /dev/null
@@ -1,915 +0,0 @@
-/*
- * Any rules which should not be flipped automatically in right-to-left situations should be
- * prepended with @noflip in a comment block. Images that should be embedded as base64 data-URLs
- * should be prepended with @embed in a comment block.
- *
- * This style-sheet employs a few CSS trick to accomplish compatibility with a wide range of web
- * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
- * a rule that makes things work in IE6, and then following it with a rule that begins with
- * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
- * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
- * "IGNORED BY IE6" comments.
- */
-
-/* Framework */
-html,
-body {
-	height: 100%;
-	margin: 0;
-	padding: 0;
-	font-family: sans-serif;
-	font-size: 1em;
-}
-body {
-	background-color: #f6f6f6;
-}
-/* Content */
-div#content {
-	margin-left: 10em;
-	padding: 1em;
-	/* Border on top, left, and bottom side */
-	border: 1px solid #a7d7f9;
-	border-right-width: 0;
-	/* Merge the border with tabs' one (in their background image) */
-	margin-top: -1px;
-	background-color: white;
-	color: black;
-	direction: ltr;
-}
-/* Hide, but keep accessible for screen-readers */
-#mw-navigation h2 {
-	position: absolute;
-	top: -9999px;
-}
-/* Head */
-#mw-page-base {
-	height: 5em;
-	background-color: white;
-	/* @embed */
-	background-image: url(images/page-fade.png);
-	background-position: bottom left;
-	background-repeat: repeat-x;
-}
-#mw-head-base {
-	margin-top: -5em;
-	margin-left: 10em;
-	height: 5em;
-}
-div#mw-head {
-	position: absolute;
-	top: 0;
-	right: 0;
-	width: 100%;
-}
-div#mw-head h3,
-div#mw-head h5 {
-	margin: 0;
-	padding: 0;
-}
-/* Hide empty portlets */
-div.emptyPortlet {
-		display: none;
-}
-/* Personal */
-#p-personal {
-	position: absolute;
-	top: 0.33em;
-	right: 0.75em;
-	/* Display on top of page tabs - bug 37158 */
-	z-index: 1;
-}
-#p-personal h3,
-#p-personal h5 {
-	display: none;
-}
-#p-personal ul {
-	list-style-type: none;
-	list-style-image: none;
-	margin: 0;
-	padding-left: 10em; /* Keep from overlapping logo */
-}
-/* @noflip */
-#p-personal li {
-	line-height: 1.125em;
-	float: left;
-}
-/* This one flips! */
-#p-personal li {
-	margin-left: 0.75em;
-	margin-top: 0.5em;
-	font-size: 0.75em;
-	white-space: nowrap;
-}
-/* Navigation Containers */
-#left-navigation {
-	position: absolute;
-	left: 10em;
-	top: 2.5em;
-}
-#right-navigation {
-	float: right;
-	margin-top: 2.5em;
-}
-/* Navigation Labels */
-div.vectorTabs h3,
-div.vectorTabs h5,
-div.vectorMenu h3 span,
-div.vectorMenu h5 span {
-	display: none;
-}
-/* Namespaces and Views */
-/* @noflip */
-div.vectorTabs {
-	float: left;
-	height: 2.5em;
-}
-div.vectorTabs {
-	/* @embed */
-	background-image: url(images/tab-break.png);
-	background-position: bottom left;
-	background-repeat: no-repeat;
-	padding-left: 1px;
-}
-/* @noflip */
-div.vectorTabs ul {
-	float: left;
-}
-div.vectorTabs ul {
-	height: 100%;
-	list-style-type: none;
-	list-style-image: none;
-	margin: 0;
-	padding: 0;
-}
-/* @noflip */
-div.vectorTabs ul li {
-	float: left;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs ul li {
-	line-height: 1.125em;
-	display: inline-block;
-	height: 100%;
-	margin: 0;
-	padding: 0;
-	background-color: #f3f3f3;
-	/* @embed */
-	background-image: url(images/tab-normal-fade.png);
-	background-position: bottom left;
-	background-repeat: repeat-x;
-	white-space: nowrap;
-}
-/* IGNORED BY IE6 */
-div.vectorTabs ul > li {
-	display: block;
-}
-div.vectorTabs li.selected {
-	/* @embed */
-	background-image: url(images/tab-current-fade.png);
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs li a {
-	display: inline-block;
-	height: 1.9em;
-	padding-left: 0.5em;
-	padding-right: 0.5em;
-	color: #0645ad;
-	cursor: pointer;
-	font-size: 0.8em;
-}
-/* IGNORED BY IE6 */
-div.vectorTabs li > a {
-	display: block;
-}
-div.vectorTabs li.icon a {
-	background-position: bottom right;
-	background-repeat: no-repeat;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorTabs span a  {
-	display: inline-block;
-	padding-top: 1.25em;
-}
-/* IGNORED BY IE6 */
-/* @noflip */
-div.vectorTabs span > a {
-	float: left;
-	display: block;
-}
-div.vectorTabs span {
-	display: inline-block;
-	/* @embed */
-	background-image: url(images/tab-break.png);
-	background-position: bottom right;
-	background-repeat: no-repeat;
-}
-div.vectorTabs li.selected a,
-div.vectorTabs li.selected a:visited{
-	color: #333;
-	text-decoration: none;
-}
-div.vectorTabs li.new a,
-div.vectorTabs li.new a:visited{
-	color: #a55858;
-}
-/* Variants and Actions */
-/* @noflip */
-div.vectorMenu {
-	direction: ltr;
-	float: left;
-	/* @embed */
-	background-image: url(images/arrow-down-icon.png);
-	background-position: 100% 60%;
-	background-repeat: no-repeat;
-	cursor: pointer;
-}
-div.vectorMenuFocus {
-	/* @embed */
-	background-image: url(images/arrow-down-focus-icon.png);
-	background-position: 100% 60%;
-}
-/* @noflip */
-body.rtl div.vectorMenu {
-	direction: rtl;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-/* @noflip */
-div#mw-head div.vectorMenu h3,
-div#mw-head div.vectorMenu h5 {
-	float: left;
-	/* @embed */
-	background-image: url(images/tab-break.png);
-	background-repeat: no-repeat;
-}
-/* This will be flipped - unlike the one above it */
-div#mw-head div.vectorMenu h3,
-div#mw-head div.vectorMenu h5 {
-	background-position: bottom left;
-	margin-left: -1px;
-}
-/* IGNORED BY IE6 */
-div#mw-head div.vectorMenu > h3,
-div#mw-head div.vectorMenu > h5 {
-	background-image: none;
-}
-div#mw-head div.vectorMenu h4,
-div.vectorMenu#p-variants #mw-vector-current-variant {
-	display: inline-block;
-	float: left;
-	font-size: 0.8em;
-	padding-left: 0.5em;
-	padding-top: 1.375em;
-	font-weight: normal;
-	border: none;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-/* @noflip */
-div.vectorMenu h3 a,
-div.vectorMenu h5 a {
-	display: inline-block;
-	width: 24px;
-	height: 1.9em;
-	text-decoration: none;
-	/* @embed */
-	background-image: url(images/tab-break.png);
-	background-repeat: no-repeat;
-}
-/* This will be flipped - unlike the one above it */
-div.vectorMenu h3 a,
-div.vectorMenu h5 a {
-	background-position: bottom right;
-}
-/* IGNORED BY IE6 */
-div.vectorMenu h3 > a,
-div.vectorMenu h5 > a {
-	display: block;
-}
-div.vectorMenu div.menu {
-	position: relative;
-	display: none;
-	clear: both;
-	text-align: left;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-/* @noflip */
-body.rtl div.vectorMenu div.menu {
-	margin-left: 24px;
-}
-/* IGNORED BY IE6 */
-/* @noflip */
-body.rtl div.vectorMenu > div.menu {
-	margin-left: auto;
-}
-/* IGNORED BY IE6 */
-/* Also fixes old versions of FireFox */
-/* @noflip */
-body.rtl div.vectorMenu > div.menu,
-x:-moz-any-link {
-	margin-left: 23px;
-}
-/* Enable forcing showing of the menu for accessibility */
-div.vectorMenu:hover div.menu,
-div.vectorMenu div.menuForceShow {
-	display: block;
-}
-div.vectorMenu ul {
-	position: absolute;
-	background-color: white;
-	border: solid 1px silver;
-	border-top-width: 0;
-	list-style-type: none;
-	list-style-image: none;
-	padding: 0;
-	margin: 0;
-	margin-left: -1px;
-	text-align: left;
-}
-/* Fixes old versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link {
-	min-width: 5em;
-}
-/* Returns things back to normal in modern versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link,
-x:default {
-	min-width: 0;
-}
-div.vectorMenu li {
-	padding: 0;
-	margin: 0;
-	text-align: left;
-	line-height: 1em;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorMenu li a {
-	display: inline-block;
-	padding: 0.5em;
-	white-space: nowrap;
-	color: #0645ad;
-	cursor: pointer;
-	font-size: 0.8em;
-}
-/* IGNORED BY IE6 */
-div.vectorMenu li > a {
-	display: block;
-}
-div.vectorMenu li.selected a,
-div.vectorMenu li.selected a:visited {
-	color: #333;
-	text-decoration: none;
-}
-/* Search */
-#p-search h3,
-#p-search h5 {
-	display: none;
-}
-/* @noflip */
-#p-search {
-	float: left;
-}
-#p-search {
-	margin-right: 0.5em;
-	margin-left: 0.5em;
-}
-#p-search form,
-#p-search input {
-	margin: 0;
-	margin-top: 0.4em;
-}
-div#simpleSearch {
-	display: block;
-	width: 14em;
-	height: 1.4em;
-	margin-top: 0.65em;
-	position: relative;
-	min-height: 1px; /* Gotta trigger hasLayout for IE7 */
-	border: solid 1px #aaa;
-	color: black;
-	background-color: white;
-	/* @embed */
-	background-image: url(images/search-fade.png);
-	background-position: top left;
-	background-repeat: repeat-x;
-}
-div#simpleSearch label {
-	/*
-	 * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
-	 * this from ever being shown anyways.
-	*/
-	font-size: 13px;
-	top: 0.25em;
-	direction: ltr;
-}
-div#simpleSearch input {
-	color: black;
-	direction: ltr;
-}
-div#simpleSearch input:focus {
-	outline: none;
-}
-div#simpleSearch input.placeholder {
-	color: #999;
-}
-div#simpleSearch input::-webkit-input-placeholder {
-	color: #999;
-}
-div#simpleSearch input:-moz-placeholder {
-	color: #999;
-}
-div#simpleSearch input:-ms-input-placeholder {
-	color: #999;
-}
-div#simpleSearch input#searchInput {
-	position: absolute;
-	top: 0;
-	left: 0;
-	width: 90%;
-	margin: 0;
-	padding: 0;
-	padding-left: 0.2em;
-	padding-top: 0.2em;
-	padding-bottom: 0.2em;
-	outline: none;
-	border: none;
-	/*
-	 * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
-	 * this from ever being shown anyways.
-	*/
-	font-size: 13px;
-	background-color: transparent;
-	direction: ltr;
-}
-div#simpleSearch button#searchButton {
-	position: absolute;
-	width: 10%;
-	right: 0;
-	top: 0;
-	padding: 0;
-	padding-top: 0.3em;
-	padding-bottom: 0.2em;
-	padding-right: 0.4em;
-	margin: 0;
-	border: none;
-	cursor: pointer;
-	background-color: transparent;
-	background-image: none;
-}
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div#simpleSearch button#searchButton img {
-	border: none;
-	margin: 0;
-	margin-top: -3px;
-	padding: 0;
-}
-/* IGNORED BY IE6 */
-div#simpleSearch button#searchButton > img {
-	margin: 0;
-}
-/* Panel */
-div#mw-panel {
-	position: absolute;
-	top: 160px;
-	padding-top: 1em;
-	width: 10em;
-	left: 0;
-}
-div#mw-panel div.portal {
-	padding-bottom: 1.5em;
-	direction: ltr;
-}
-div#mw-panel div.portal h3,
-div#mw-panel div.portal h5 {
-	font-weight: normal;
-	color: #444;
-	padding: 0.25em;
-	padding-top: 0;
-	padding-left: 1.75em;
-	cursor: default;
-	border: none;
-	font-size: 0.75em;
-}
-div#mw-panel div.portal div.body {
-	margin: 0;
-	padding-top: 0.5em;
-	margin-left: 1.25em;
-	/* @embed */
-	background-image: url(images/portal-break.png);
-	background-repeat: no-repeat;
-	background-position: top left;
-}
-div#mw-panel div.portal div.body ul {
-	list-style-type: none;
-	list-style-image: none;
-	padding: 0;
-	margin: 0;
-}
-div#mw-panel div.portal div.body ul li {
-	line-height: 1.125em;
-	padding: 0;
-	padding-bottom: 0.5em;
-	margin: 0;
-	font-size: 0.75em;
-	word-wrap: break-word;
-}
-div#mw-panel div.portal div.body ul li a {
-	color: #0645ad;
-}
-div#mw-panel div.portal div.body ul li a:visited {
-	color: #0b0080;
-}
-/* Footer */
-div#footer {
-	margin-left: 10em;
-	margin-top: 0;
-	padding: 0.75em;
-	direction: ltr;
-}
-div#footer ul {
-	list-style-type: none;
-	list-style-image: none;
-	margin: 0;
-	padding: 0;
-}
-div#footer ul li {
-	margin: 0;
-	padding: 0;
-	padding-top: 0.5em;
-	padding-bottom: 0.5em;
-	color: #333;
-	font-size: 0.7em;
-}
-div#footer #footer-icons {
-	float: right;
-}
-/* @noflip */
-body.ltr div#footer #footer-places {
-	float: left;
-}
-div#footer #footer-info li {
-	line-height: 1.4em;
-}
-div#footer #footer-icons li {
-	float: left;
-	margin-left: 0.5em;
-	line-height: 2em;
-	text-align: right;
-}
-div#footer #footer-places li {
-	float: left;
-	margin-right: 1em;
-	line-height: 2em;
-}
-/* Logo */
-#p-logo {
-	position: absolute;
-	top: -160px;
-	left: 0;
-	width: 10em;
-	height: 160px;
-}
-#p-logo a {
-	display: block;
-	width: 10em;
-	height: 160px;
-	background-repeat: no-repeat;
-	background-position: center center;
-	text-decoration: none;
-}
-
-/*
- *
- * The following code is highly modified from monobook. It would be nice if the
- * preftoc id was more human readable like preferences-toc for instance,
- * howerver this would require backporting the other skins.
- */
-
-/* Preferences */
-#preftoc {
-	/* Tabs */
-	width: 100%;
-	float: left;
-	clear: both;
-	margin: 0 !important;
-	padding: 0 !important;
-	/* @embed */
-	background-image: url(images/preferences-break.png);
-	background-position: bottom left;
-	background-repeat: no-repeat;
-}
-	#preftoc li {
-		/* Tab */
-		float: left;
-		margin: 0;
-		padding: 0;
-		padding-right: 1px;
-		height: 2.25em;
-		white-space: nowrap;
-		list-style-type: none;
-		list-style-image: none;
-		/* @embed */
-		background-image: url(images/preferences-break.png);
-		background-position: bottom right;
-		background-repeat: no-repeat;
-	}
-	/* Sadly, IE6 won't understand this */
-	#preftoc li:first-child {
-		margin-left: 1px;
-	}
-	#preftoc a,
-	#preftoc a:active {
-		display: inline-block;
-		position: relative;
-		color: #0645ad;
-		padding: 0.5em;
-		text-decoration: none;
-		background-image: none;
-		font-size: 0.9em;
-	}
-	#preftoc a:hover,
-	#preftoc a:focus {
-		text-decoration: underline;
-	}
-	#preftoc li.selected a {
-		/* @embed */
-		background-image: url(images/preferences-fade.png);
-		background-position: bottom;
-		background-repeat: repeat-x;
-		color: #333;
-		text-decoration: none;
-	}
-#preferences {
-	float: left;
-	width: 100%;
-	margin: 0;
-	margin-top: -2px;
-	clear: both;
-	border: solid 1px #ccc;
-	background-color: #fafafa;
-}
-#preferences fieldset {
-	border: none;
-	border-top: solid 1px #ccc;
-}
-#preferences fieldset.prefsection {
-	border: none;
-	padding: 0;
-	margin: 1em;
-}
-#preferences legend {
-	color: #666;
-}
-#preferences fieldset.prefsection legend.mainLegend {
-	display: none;
-}
-#preferences td {
-	padding-left: 0.5em;
-	padding-right: 0.5em;
-}
-.htmlform-tip {
-	font-size: x-small;
-	padding: .2em 2em;
-	color: #666;
-}
-#preferences div.mw-prefs-buttons {
-	padding: 1em;
-}
-#preferences div.mw-prefs-buttons input {
-	margin-right: 0.25em;
-}
-
-/**
- * The following code is slightly modified from monobook
- */
-div#content {
-	line-height: 1.5em;
-}
-#bodyContent {
-	font-size: 0.8em;
-}
-
-.editsection {
-	float: right;
-}
-
-ul {
-	list-style-type: disc;
-	/* @embed */
-	list-style-image: url(images/bullet-icon.png);
-}
-
-pre, .mw-code {
-	line-height: 1.3em;
-}
-
-/* Site Notice (includes notices from CentralNotice extension) */
-#siteNotice {
-	font-size: 0.8em;
-}
-#firstHeading {
-	padding-top: 0;
-	margin-top: 0;
-	padding-top: 0;
-	font-size: 1.6em;
-}
-div#content a.external,
-div#content a.external[href ^="gopher://"] {
-	/* @embed */
-	background: url(images/external-link-ltr-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href ^="https://"],
-.link-https {
-	/* @embed */
-	background: url(images/lock-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href ^="mailto:"],
-.link-mailto {
-	/* @embed */
-	background: url(images/mail-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href ^="news:"] {
-	/* @embed */
-	background: url(images/news-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href ^="ftp://"],
-.link-ftp {
-	/* @embed */
-	background: url(images/file-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href ^="irc://"],
-div#content a.external[href ^="ircs://"],
-.link-irc {
-	/* @embed */
-	background: url(images/talk-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href $=".ogg"], div#content a.external[href $=".OGG"],
-div#content a.external[href $=".mid"], div#content a.external[href $=".MID"],
-div#content a.external[href $=".midi"], div#content a.external[href $=".MIDI"],
-div#content a.external[href $=".mp3"], div#content a.external[href $=".MP3"],
-div#content a.external[href $=".wav"], div#content a.external[href $=".WAV"],
-div#content a.external[href $=".wma"], div#content a.external[href $=".WMA"],
-.link-audio {
-	/* @embed */
-	background: url(images/audio-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href $=".ogm"], div#content a.external[href $=".OGM"],
-div#content a.external[href $=".avi"], div#content a.external[href $=".AVI"],
-div#content a.external[href $=".mpeg"], div#content a.external[href $=".MPEG"],
-div#content a.external[href $=".mpg"], div#content a.external[href $=".MPG"],
-.link-video {
-	/* @embed */
-	background: url(images/video-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-div#content a.external[href $=".pdf"], div#content a.external[href $=".PDF"],
-div#content a.external[href *=".pdf#"], div#content a.external[href *=".PDF#"],
-div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
-.link-document {
-	/* @embed */
-	background: url(images/document-icon.png) center right no-repeat;
-	padding-right: 13px;
-}
-
-/* Icon for Usernames */
-#pt-userpage,
-#pt-anonuserpage,
-#pt-login {
-	/* @embed */
-	background: url(images/user-icon.png) left top no-repeat;
-	padding-left: 15px !important;
-	text-transform: none;
-}
-
-.redirectText {
-	font-size: 140%;
-}
-
-.redirectMsg img {
-	vertical-align: text-bottom;
-}
-
-#bodyContent {
-	position: relative;
-	width: 100%;
-}
-div#bodyContent {
-	line-height: 1.5em;
-}
-
-/* mediawiki.notification */
-.skin-vector #mw-notification-area {
-	top: 7em;
-	font-size: 0.8em;
-}
-.skin-vector .mw-notification {
-	background-color: #fff;
-	background-color: rgba(255, 255, 255, 0.93);
-	padding: 0.75em 1.5em;
-	border: solid 1px #a7d7f9;
-	border-radius: 0.75em;
-	-webkit-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
-	-moz-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
-	box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
-}
-
-/* Watch/Unwatch Icon Styling */
-#ca-unwatch.icon a,
-#ca-watch.icon a {
-	margin: 0;
-	padding: 0;
-	outline: none;
-	display: block;
-	width: 26px;
-	/* This hides the text but shows the background image */
-	padding-top: 3.1em;
-	margin-top: 0;
-	/* Only applied in IE6 */
-	margin-top: -0.8em !ie;
-	height: 0;
-	overflow: hidden;
-	/* @embed */
-	background-image: url(images/watch-icons.png);
-}
-#ca-unwatch.icon a {
-	background-position: -43px 60%;
-}
-#ca-watch.icon a {
-	background-position: 5px 60%;
-}
-#ca-unwatch.icon a:hover,
-#ca-unwatch.icon a:focus {
-	background-position: -67px 60%;
-}
-#ca-watch.icon a:hover,
-#ca-watch.icon a:focus {
-	background-position: -19px 60%;
-}
-#ca-unwatch.icon a.loading,
-#ca-watch.icon a.loading {
-	/* @embed */
-	background-image: url(images/watch-icon-loading.gif);
-	background-position: 5px 60%;
-}
-#ca-unwatch.icon a span,
-#ca-watch.icon a span {
-	display: none;
-}
-div.vectorTabs ul {
-	/* @embed */
-	background-image: url(images/tab-break.png);
-	background-position: right bottom;
-	background-repeat: no-repeat;
-}
-
-/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
-.tipsy {
-	font-size: 0.8em;
-}
-
-/* Animate between standard and high definition layouts */
-
-body.vector-animateLayout div#content,
-body.vector-animateLayout div#footer {
-	-moz-transition: margin-left 250ms, padding 250ms;
-	-webkit-transition: margin-left 250ms, padding 250ms;
-	-o-transition: margin-left 250ms, padding 250ms;
-	transition: margin-left 250ms, padding 250ms;
-}
-body.vector-animateLayout #p-logo,
-body.vector-animateLayout #left-navigation {
-	-moz-transition: left 250ms;
-	-webkit-transition: left 250ms;
-	-o-transition: left 250ms;
-	transition: left 250ms;
-}
-body.vector-animateLayout #mw-panel {
-	-moz-transition: padding-left 250ms;
-	-webkit-transition: padding-left 250ms;
-	-o-transition: padding-left 250ms;
-	transition: padding-left 250ms;
-}
-body.vector-animateLayout #p-search {
-	-moz-transition: margin-right 250ms;
-	-webkit-transition: margin-right 250ms;
-	-o-transition: margin-right 250ms;
-	transition: margin-right 250ms;
-}
-body.vector-animateLayout #p-personal {
-	-moz-transition: right 250ms;
-	-webkit-transition: right 250ms;
-	-o-transition: right 250ms;
-	transition: right 250ms;
-}
-body.vector-animateLayout #mw-head-base {
-	-moz-transition: margin-left 250ms;
-	-webkit-transition: margin-left 250ms;
-	-o-transition: margin-left 250ms;
-	transition: margin-left 250ms;
-}
diff --git a/skins/vector/screen.less b/skins/vector/screen.less
new file mode 100644
index 00000000..bb4be725
--- /dev/null
+++ b/skins/vector/screen.less
@@ -0,0 +1,791 @@
+/*
+ * Any rules which should not be flipped automatically in right-to-left situations should be
+ * prepended with @noflip in a comment block.
+ *
+ * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
+ * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
+ * a rule that makes things work in IE6, and then following it with a rule that begins with
+ * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
+ * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
+ * "IGNORED BY IE6" comments.
+ */
+@import "mediawiki.mixins";
+
+/* Framework */
+html {
+	font-size: @html-font-size;
+}
+html,
+body {
+	height: 100%;
+	margin: 0;
+	padding: 0;
+	font-family: @content-font-family;
+}
+body {
+	background-color: #f6f6f6;
+	font-size: @body-font-size;
+}
+/* Content */
+div#content {
+	line-height: @content-line-height;
+	margin-left: 10em;
+	padding: @content-padding;
+	/* Border on top, left, and bottom side */
+	border: 1px solid #a7d7f9;
+	border-right-width: 0;
+	/* Merge the border with tabs' one (in their background image) */
+	margin-top: -1px;
+	background-color: white;
+	color: @content-font-color;
+	direction: ltr;
+}
+/* Hide, but keep accessible for screen-readers */
+#mw-navigation h2 {
+	position: absolute;
+	top: -9999px;
+}
+/* Head */
+#mw-page-base {
+	height: 5em;
+	background-color: white;
+	.background-image('images/page-fade.png');
+	background-position: bottom left;
+	background-repeat: repeat-x;
+}
+#mw-head-base {
+	margin-top: -5em;
+	margin-left: 10em;
+	height: 5em;
+}
+div#mw-head {
+	position: absolute;
+	top: 0;
+	right: 0;
+	width: 100%;
+}
+div#mw-head h3 {
+	margin: 0;
+	padding: 0;
+}
+/* Hide empty portlets */
+div.emptyPortlet {
+		display: none;
+}
+/* Personal */
+#p-personal {
+	position: absolute;
+	top: 0.33em;
+	right: 0.75em;
+	/* Display on top of page tabs - bugs 37158, 48078 */
+	z-index: 100;
+}
+#p-personal h3 {
+	display: none;
+}
+#p-personal ul {
+	list-style-type: none;
+	list-style-image: none;
+	margin: 0;
+	padding-left: 10em; /* Keep from overlapping logo */
+}
+#p-personal li {
+	line-height: 1.125em;
+	/* @noflip */
+	float: left;
+	margin-left: 0.75em;
+	margin-top: 0.5em;
+	font-size: @menu-personal-font-size;
+	white-space: nowrap;
+}
+/* Navigation Containers */
+#left-navigation {
+	float: left;
+	margin-left: 10em;
+	margin-top: 2.5em;
+	/* When right nav would overlap left nav, it's placed below it
+	   (normal CSS floats behavior). This rule ensures that no empty space
+	   is shown between them due to right nav's margin-top. Page layout
+	   is still broken, but at least the nav overlaps only the page title
+	   instead of half the content. */
+	margin-bottom: -2.5em;
+	/* IE 6 double-margin bug fix */
+	display: inline;
+}
+#right-navigation {
+	float: right;
+	margin-top: 2.5em;
+}
+/* Navigation Labels */
+div.vectorTabs h3,
+div.vectorMenu h3 span {
+	display: none;
+}
+/* Namespaces and Views */
+div.vectorTabs {
+	/* @noflip */
+	float: left;
+	height: 2.5em;
+}
+div.vectorTabs {
+	.background-image('images/tab-break.png');
+	background-position: bottom left;
+	background-repeat: no-repeat;
+	padding-left: 1px;
+}
+div.vectorTabs ul {
+	/* @noflip */
+	float: left;
+	height: 100%;
+	list-style-type: none;
+	list-style-image: none;
+	margin: 0;
+	padding: 0;
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorTabs ul li {
+	/* @noflip */
+	float: left;
+	line-height: 1.125em;
+	display: inline-block;
+	height: 100%;
+	margin: 0;
+	padding: 0;
+	background-color: #f3f3f3;
+	.background-image('images/tab-normal-fade.png');
+	background-position: bottom left;
+	background-repeat: repeat-x;
+	white-space: nowrap;
+}
+/* IGNORED BY IE6 */
+div.vectorTabs ul > li {
+	display: block;
+}
+div.vectorTabs li.selected {
+	.background-image('images/tab-current-fade.png');
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorTabs li a {
+	display: inline-block;
+	height: 1.9em;
+	padding-left: 0.5em;
+	padding-right: 0.5em;
+	color: @menu-link-color;
+	cursor: pointer;
+	font-size: 0.8em;
+}
+/* IGNORED BY IE6 */
+div.vectorTabs li > a {
+	display: block;
+}
+div.vectorTabs li.icon a {
+	background-position: bottom right;
+	background-repeat: no-repeat;
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorTabs span a  {
+	display: inline-block;
+	padding-top: 1.25em;
+}
+/* IGNORED BY IE6 */
+div.vectorTabs span > a {
+	/* @noflip */
+	float: left;
+	display: block;
+}
+div.vectorTabs span {
+	display: inline-block;
+	.background-image('images/tab-break.png');
+	background-position: bottom right;
+	background-repeat: no-repeat;
+}
+div.vectorTabs li.selected a,
+div.vectorTabs li.selected a:visited{
+	color: #333;
+	text-decoration: none;
+}
+div.vectorTabs li.new a,
+div.vectorTabs li.new a:visited{
+	color: #a55858;
+}
+/* Variants and Actions */
+div.vectorMenu {
+	/* @noflip */
+	direction: ltr;
+	/* @noflip */
+	float: left;
+	/* SVG support using a transparent gradient to guarantee cross-browser
+	 * compatibility (browsers able to understand gradient syntax support also SVG) */
+	.background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
+	/* @noflip */
+	background-position: 100% 60%;
+	background-repeat: no-repeat;
+	cursor: pointer;
+}
+div.vectorMenuFocus {
+	/* SVG support using a transparent gradient to guarantee cross-browser
+	 * compatibility (browsers able to understand gradient syntax support also SVG) */
+	.background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
+	background-position: 100% 60%;
+}
+body.rtl div.vectorMenu {
+	/* @noflip */
+	direction: rtl;
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div#mw-head div.vectorMenu h3 {
+	/* @noflip */
+	float: left;
+	.background-image('images/tab-break.png');
+	background-repeat: no-repeat;
+	background-position: bottom left;
+	margin-left: -1px;
+}
+/* IGNORED BY IE6 */
+div#mw-head div.vectorMenu > h3 {
+	background-image: none;
+}
+div#mw-head div.vectorMenu h4,
+div.vectorMenu#p-variants #mw-vector-current-variant {
+	display: inline-block;
+	float: left;
+	font-size: 0.8em;
+	padding-left: 0.5em;
+	padding-top: 1.375em;
+	font-weight: normal;
+	border: none;
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorMenu h3 a {
+	display: inline-block;
+	width: 24px;
+	height: 1.9em;
+	text-decoration: none;
+	.background-image('images/tab-break.png');
+	background-repeat: no-repeat;
+	background-position: bottom right;
+}
+/* IGNORED BY IE6 */
+div.vectorMenu h3 > a {
+	display: block;
+}
+div.vectorMenu div.menu {
+	position: relative;
+	display: none;
+	clear: both;
+	text-align: left;
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+body.rtl div.vectorMenu div.menu {
+	/* @noflip */
+	margin-left: 24px;
+}
+/* IGNORED BY IE6 */
+body.rtl div.vectorMenu > div.menu {
+	/* @noflip */
+	margin-left: auto;
+}
+/* IGNORED BY IE6 */
+/* Also fixes old versions of FireFox */
+body.rtl div.vectorMenu > div.menu,
+x:-moz-any-link {
+	/* @noflip */
+	margin-left: 23px;
+}
+/* Enable forcing showing of the menu for accessibility */
+div.vectorMenu:hover div.menu,
+div.vectorMenu div.menuForceShow {
+	display: block;
+}
+div.vectorMenu ul {
+	position: absolute;
+	background-color: white;
+	border: solid 1px silver;
+	border-top-width: 0;
+	list-style-type: none;
+	list-style-image: none;
+	padding: 0;
+	margin: 0;
+	margin-left: -1px;
+	text-align: left;
+}
+/* Fixes old versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link {
+	min-width: 5em;
+}
+/* Returns things back to normal in modern versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link,
+x:default {
+	min-width: 0;
+}
+div.vectorMenu li {
+	padding: 0;
+	margin: 0;
+	text-align: left;
+	line-height: 1em;
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorMenu li a {
+	display: inline-block;
+	padding: 0.5em;
+	white-space: nowrap;
+	color: @menu-link-color;
+	cursor: pointer;
+	font-size: 0.8em;
+}
+/* IGNORED BY IE6 */
+div.vectorMenu li > a {
+	display: block;
+}
+div.vectorMenu li.selected a,
+div.vectorMenu li.selected a:visited {
+	color: #333;
+	text-decoration: none;
+}
+/* Search */
+#p-search h3 {
+	display: none;
+}
+#p-search {
+	/* @noflip */
+	float: left;
+}
+#p-search {
+	margin-right: 0.5em;
+	margin-left: 0.5em;
+}
+#p-search form,
+#p-search input {
+	margin: 0;
+	margin-top: 0.4em;
+}
+div#simpleSearch {
+	display: block;
+	width: 14em;
+	height: 1.4em;
+	margin-top: 0.65em;
+	position: relative;
+	min-height: 1px; /* Gotta trigger hasLayout for IE7 */
+	border: solid 1px #aaa;
+	color: black;
+	background-color: white;
+	.background-image('images/search-fade.png');
+	background-position: top left;
+	background-repeat: repeat-x;
+}
+div#simpleSearch input:focus {
+	outline: none;
+}
+div#simpleSearch input {
+	color: black;
+}
+div#simpleSearch input.placeholder {
+	color: #999;
+}
+div#simpleSearch input::-webkit-input-placeholder {
+	color: #999;
+}
+div#simpleSearch input:-moz-placeholder {
+	color: #999;
+}
+div#simpleSearch input:-ms-input-placeholder {
+	color: #999;
+}
+div#simpleSearch input#searchInput {
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 90%;
+	margin: 0;
+	padding: 0;
+	padding-left: 0.2em;
+	padding-top: 0.2em;
+	padding-bottom: 0.2em;
+	outline: none;
+	border: none;
+	/*
+	 * DON'T PANIC! Browsers that won't scale this properly are the same browsers that have JS issues that prevent
+	 * this from ever being shown anyways.
+	*/
+	font-size: 13px;
+	background-color: transparent;
+	direction: ltr;
+}
+div#simpleSearch button#searchButton {
+	position: absolute;
+	width: 10%;
+	right: 0;
+	top: 0;
+	padding: 0;
+	padding-top: 0.3em;
+	padding-bottom: 0.2em;
+	padding-right: 0.4em;
+	margin: 0;
+	border: none;
+	cursor: pointer;
+	background-color: transparent;
+	background-image: none;
+}
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div#simpleSearch button#searchButton img {
+	border: none;
+	margin: 0;
+	margin-top: -3px;
+	padding: 0;
+}
+/* IGNORED BY IE6 */
+div#simpleSearch button#searchButton > img {
+	margin: 0;
+}
+/* Panel */
+div#mw-panel {
+	font-size: @menu-main-font-size;
+	position: absolute;
+	top: 160px;
+	padding-top: 1em;
+	width: 10em;
+	left: 0;
+}
+div#mw-panel div.portal {
+	padding-bottom: 1.5em;
+	direction: ltr;
+}
+div#mw-panel div.portal h3 {
+	font-weight: normal;
+	color: #444;
+	padding: @menu-main-heading-padding;
+	cursor: default;
+	border: none;
+	font-size: @menu-main-heading-font-size;
+}
+div#mw-panel div.portal div.body {
+	padding-top: 0.5em;
+	margin: @menu-main-body-margin;
+
+	.background-image('images/portal-break.png');
+	background-repeat: no-repeat;
+	background-position: top left;
+}
+div#mw-panel div.portal div.body ul {
+	list-style-type: none;
+	list-style-image: none;
+	padding: @menu-main-body-padding;
+	margin: 0;
+}
+div#mw-panel div.portal div.body ul li {
+	line-height: 1.125em;
+	padding: 0;
+	padding-bottom: 0.5em;
+	margin: 0;
+	font-size: @menu-main-body-font-size;
+	word-wrap: break-word;
+}
+div#mw-panel div.portal div.body ul li a {
+	color: @menu-main-body-link-color;
+	&:visited {
+		color: @menu-main-body-link-visited-color;
+	}
+}
+
+/* Footer */
+div#footer {
+	margin-left: 10em;
+	margin-top: 0;
+	padding: 0.75em;
+	direction: ltr;
+}
+div#footer ul {
+	list-style-type: none;
+	list-style-image: none;
+	margin: 0;
+	padding: 0;
+}
+div#footer ul li {
+	margin: 0;
+	padding: 0;
+	padding-top: 0.5em;
+	padding-bottom: 0.5em;
+	color: #333;
+	font-size: 0.7em;
+}
+div#footer #footer-icons {
+	float: right;
+}
+
+body.ltr div#footer #footer-places {
+	/* @noflip */
+	float: left;
+}
+div#footer #footer-info li {
+	line-height: 1.4em;
+}
+div#footer #footer-icons li {
+	float: left;
+	margin-left: 0.5em;
+	line-height: 2em;
+	text-align: right;
+}
+div#footer #footer-places li {
+	float: left;
+	margin-right: 1em;
+	line-height: 2em;
+}
+/* Logo */
+#p-logo {
+	position: absolute;
+	top: -160px;
+	left: 0;
+	width: 10em;
+	height: 160px;
+}
+#p-logo a {
+	display: block;
+	width: 10em;
+	height: 160px;
+	background-repeat: no-repeat;
+	background-position: center center;
+	text-decoration: none;
+}
+
+/*
+ *
+ * The following code is highly modified from monobook. It would be nice if the
+ * preftoc id was more human readable like preferences-toc for instance,
+ * howerver this would require backporting the other skins.
+ */
+
+/* Preferences */
+#preftoc {
+	/* Tabs */
+	width: 100%;
+	float: left;
+	clear: both;
+	margin: 0 !important;
+	padding: 0 !important;
+	.background-image('images/preferences-break.png');
+	background-position: bottom left;
+	background-repeat: no-repeat;
+}
+	#preftoc li {
+		/* Tab */
+		float: left;
+		margin: 0;
+		padding: 0;
+		padding-right: 1px;
+		height: 2.25em;
+		white-space: nowrap;
+		list-style-type: none;
+		list-style-image: none;
+		.background-image('images/preferences-break.png');
+		background-position: bottom right;
+		background-repeat: no-repeat;
+	}
+	/* Sadly, IE6 won't understand this */
+	#preftoc li:first-child {
+		margin-left: 1px;
+	}
+	#preftoc a,
+	#preftoc a:active {
+		display: inline-block;
+		position: relative;
+		color: @menu-link-color;
+		padding: 0.5em;
+		text-decoration: none;
+		background-image: none;
+		font-size: 0.9em;
+	}
+	#preftoc a:hover,
+	#preftoc a:focus {
+		text-decoration: underline;
+	}
+	#preftoc li.selected a {
+		.background-image('images/preferences-fade.png');
+		background-position: bottom;
+		background-repeat: repeat-x;
+		color: #333;
+		text-decoration: none;
+	}
+#preferences {
+	float: left;
+	width: 100%;
+	margin: 0;
+	margin-top: -2px;
+	clear: both;
+	border: solid 1px #ccc;
+	background-color: #fafafa;
+}
+#preferences fieldset {
+	border: none;
+	border-top: solid 1px #ccc;
+}
+#preferences fieldset.prefsection {
+	border: none;
+	padding: 0;
+	margin: 1em;
+}
+#preferences legend {
+	color: #666;
+}
+#preferences fieldset.prefsection legend.mainLegend {
+	display: none;
+}
+#preferences td {
+	padding-left: 0.5em;
+	padding-right: 0.5em;
+}
+.htmlform-tip {
+	font-size: x-small;
+	padding: .2em 2em;
+	color: #666;
+}
+#preferences div.mw-prefs-buttons {
+	padding: 1em;
+}
+#preferences div.mw-prefs-buttons input {
+	margin-right: 0.25em;
+}
+
+ul {
+	list-style-type: disc;
+	.list-style-image('images/bullet-icon.png');
+}
+
+pre, .mw-code {
+	line-height: 1.3em;
+}
+
+/* Site Notice (includes notices from CentralNotice extension) */
+#siteNotice {
+	font-size: 0.8em;
+}
+#firstHeading {
+	padding-top: 0;
+	margin-top: 0;
+	font-size: @content-heading-font-size;
+}
+
+/* Icon for Usernames */
+#pt-userpage,
+#pt-anonuserpage,
+#pt-login {
+	background-position: left top;
+	background-repeat: no-repeat;
+	/* SVG support using a transparent gradient to guarantee cross-browser
+	 * compatibility (browsers able to understand gradient syntax support also SVG) */
+	.background-image-svg('images/user-icon.svg', 'images/user-icon.png');
+	padding-left: 15px !important;
+}
+
+.redirectText {
+	font-size: 140%;
+}
+
+.redirectMsg img {
+	vertical-align: text-bottom;
+}
+
+#bodyContent {
+	position: relative;
+	width: 100%;
+	line-height: 1.5em;
+	font-size: @content-font-size;
+}
+
+/* mediawiki.notification */
+.skin-vector .mw-notification-area {
+	font-size: 0.8em;
+}
+.skin-vector .mw-notification-area-layout {
+	top: 7em;
+}
+.skin-vector .mw-notification {
+	background-color: #fff;
+	background-color: rgba(255, 255, 255, 0.93);
+	padding: 0.75em 1.5em;
+	border: solid 1px #a7d7f9;
+	border-radius: 0.75em;
+	-webkit-box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
+	box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
+}
+
+/* Watch/Unwatch Icon Styling */
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+	margin: 0;
+	padding: 0;
+	outline: none;
+	display: block;
+	width: 26px;
+	/* This hides the text but shows the background image */
+	padding-top: 3.1em;
+	margin-top: 0;
+	/* Only applied in IE6 */
+	margin-top: -0.8em !ie;
+	height: 0;
+	overflow: hidden;
+	.background-image('images/watch-icons.png');
+}
+#ca-unwatch.icon a {
+	background-position: -43px 60%;
+}
+#ca-watch.icon a {
+	background-position: 5px 60%;
+}
+#ca-unwatch.icon a:hover,
+#ca-unwatch.icon a:focus {
+	background-position: -67px 60%;
+}
+#ca-watch.icon a:hover,
+#ca-watch.icon a:focus {
+	background-position: -19px 60%;
+}
+#ca-unwatch.icon a.loading,
+#ca-watch.icon a.loading {
+	.background-image('images/watch-icon-loading.gif');
+	background-position: 5px 60%;
+}
+#ca-unwatch.icon a span,
+#ca-watch.icon a span {
+	display: none;
+}
+div.vectorTabs ul {
+	.background-image('images/tab-break.png');
+	background-position: right bottom;
+	background-repeat: no-repeat;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+.tipsy {
+	font-size: 0.8em;
+}
+
+/* Animate between standard and high definition layouts */
+body.vector-animateLayout {
+	div#content,
+	div#footer,
+	#left-navigation {
+		.transition(margin-left 250ms, padding 250ms;);
+	}
+
+	#p-logo {
+		.transition(left 250ms);
+	}
+
+	#mw-panel {
+		.transition(padding-right 250ms);
+	}
+
+	#p-search {
+		.transition(margin-right 250ms);
+	}
+
+	#p-personal {
+		.transition(right 250ms);
+	}
+
+	#mw-head-base {
+		.transition(margin-left 250ms);
+	}
+}
diff --git a/skins/vector/styles-beta.less b/skins/vector/styles-beta.less
new file mode 100644
index 00000000..a76b6394
--- /dev/null
+++ b/skins/vector/styles-beta.less
@@ -0,0 +1,13 @@
+@import "variables.less";
+@import "beta/variables.less";
+
+@media screen {
+	@import "screen.less";
+	@import "beta/screen.less";
+	@import "externalLinks.less";
+	@import "collapsibleNav.less";
+}
+
+@media screen and (min-width: 982px) {
+	@import "screen-hd.less";
+}
diff --git a/skins/vector/styles.less b/skins/vector/styles.less
new file mode 100644
index 00000000..bd458510
--- /dev/null
+++ b/skins/vector/styles.less
@@ -0,0 +1,11 @@
+@import "variables.less";
+
+@media screen {
+	@import "screen.less";
+	@import "externalLinks.less";
+	@import "collapsibleNav.less";
+}
+
+@media screen and (min-width: 982px) {
+	@import "screen-hd.less";
+}
diff --git a/skins/vector/variables.less b/skins/vector/variables.less
new file mode 100644
index 00000000..691e0fd5
--- /dev/null
+++ b/skins/vector/variables.less
@@ -0,0 +1,37 @@
+@html-font-size: 1em;
+
+@body-font-size: 1em;
+
+// Page content
+@content-font-family: sans-serif;
+@content-font-color: black;
+@content-font-size: 0.8em;
+@content-line-height: 1.5em;
+@content-padding: 1.5em 1.5em 1.5em 1.75em;
+@content-heading-font-size: 1.6em;
+@content-heading-font-family: sans-serif;
+
+// Common menu
+@menu-link-color: #0645ad;
+
+// Main menu
+@menu-main-font-size: inherit;
+@menu-main-heading-font-size: 0.75em;
+@menu-main-heading-padding: 0 1.75em 0.25em 0.25em;
+
+@menu-main-body-font-size: 0.75em;
+@menu-main-body-link-color: #0645ad;
+@menu-main-body-link-visited-color: #0b0080;
+@menu-main-body-margin: 0 0 0 1.25em;
+@menu-main-body-padding: 0;
+@menu-main-logo-left: 0.5em;
+
+// Personal menu
+@menu-personal-font-size: 0.75em;
+
+// Collapsible nav
+@collapsible-nav-heading-color: #4D4D4D;
+@collapsible-nav-heading-collapsed-color: #0645AD;
+
+@collapsible-nav-heading-padding: 4px 0 3px 1.5em;
+@collapsible-nav-body-margin: 0 0 0 1.25em;
diff --git a/skins/vector/vector.js b/skins/vector/vector.js
index 4427d9a3..aa64624a 100644
--- a/skins/vector/vector.js
+++ b/skins/vector/vector.js
@@ -4,18 +4,52 @@
 jQuery( function ( $ ) {
 	$( 'div.vectorMenu' ).each( function () {
 		var $el = $( this );
-		$el.find( 'h3:first a:first' )
-			// For accessibility, show the menu when the hidden link in the menu is clicked (bug 24298)
-			.click( function ( e ) {
-				$el.find( '.menu:first' ).toggleClass( 'menuForceShow' );
-				e.preventDefault();
+		$el.find( '> h3 > a' ).parent()
+			.attr( 'tabindex', '0' )
+			// For accessibility, show the menu when the h3 is clicked (bug 24298/46486)
+			.on( 'click keypress', function ( e ) {
+				if( e.type === 'click' || e.which === 13 ) {
+					$el.find( '.menu:first' ).toggleClass( 'menuForceShow' );
+					e.preventDefault();
+				}
 			} )
-			// When the hidden link has focus, also set a class that will change the arrow icon
+			// When the heading has focus, also set a class that will change the arrow icon
 			.focus( function () {
-				$el.addClass( 'vectorMenuFocus' );
+				$el.find( '> a' ).addClass( 'vectorMenuFocus' );
 			} )
 			.blur( function () {
-				$el.removeClass( 'vectorMenuFocus' );
-			} );
+				$el.find( '> a' ).removeClass( 'vectorMenuFocus' );
+			} )
+			.find( '> a:first' )
+			// As the h3 can already be focused there's no need for the link to be focusable
+			.attr( 'tabindex', '-1' );
 	} );
+
+	/**
+	 * Collapsible tabs for Vector
+	 */
+	var $cactions = $( '#p-cactions' );
+
+	// Bind callback functions to animate our drop down menu in and out
+	// and then call the collapsibleTabs function on the menu
+	$( '#p-views ul' )
+		.bind( 'beforeTabCollapse', function () {
+			// If the dropdown was hidden, show it
+			if ( $cactions.hasClass( 'emptyPortlet' ) ) {
+				$cactions
+					.removeClass( 'emptyPortlet' )
+					.find( 'h3' )
+						.css( 'width', '1px' ).animate( { 'width': '24px' }, 390 );
+			}
+		} )
+		.bind( 'beforeTabExpand', function () {
+			// If we're removing the last child node right now, hide the dropdown
+			if ( $cactions.find( 'li' ).length === 1 ) {
+				$cactions.find( 'h3' ).animate( { 'width': '1px' }, 390, function () {
+					$( this ).attr( 'style', '' )
+						.parent().addClass( 'emptyPortlet' );
+				});
+			}
+		} )
+		.collapsibleTabs();
 } );
diff --git a/tests/RunSeleniumTests.php b/tests/RunSeleniumTests.php
deleted file mode 100644
index b7320cb1..00000000
--- a/tests/RunSeleniumTests.php
+++ /dev/null
@@ -1,258 +0,0 @@
-#!/usr/bin/env php
-<?php
-/**
- * @file
- * @ingroup Maintenance
- * @copyright Copyright © Wikimedia Deuschland, 2009
- * @author Hallo Welt! Medienwerkstatt GmbH
- * @author Markus Glaser, Dan Nessett, Priyanka Dhanda
- * initial idea by Daniel Kinzler
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-if ( PHP_SAPI != 'cli' ) {
-	die( "Run me from the command line please.\n" );
-}
-
-define( 'SELENIUMTEST', true );
-
-require( __DIR__ . '/../maintenance/Maintenance.php' );
-
-require_once( 'PHPUnit/Runner/Version.php' );
-if ( version_compare( PHPUnit_Runner_Version::id(), '3.5.0', '>=' ) ) {
-	# PHPUnit 3.5.0 introduced a nice autoloader based on class name
-	require_once( 'PHPUnit/Autoload.php' );
-} else {
-	# Keep the old pre PHPUnit 3.5.0 behavior for compatibility
-	require_once( 'PHPUnit/TextUI/Command.php' );
-}
-
-require_once( 'PHPUnit/Extensions/SeleniumTestCase.php' );
-include_once( 'PHPUnit/Util/Log/JUnit.php' );
-
-require_once( __DIR__ . "/selenium/SeleniumServerManager.php" );
-
-class SeleniumTester extends Maintenance {
-	protected $selenium;
-	protected $serverManager;
-	protected $seleniumServerExecPath;
-
-	public function __construct() {
-		parent::__construct();
-		$this->mDescription = "Selenium Test Runner. For documentation, visit http://www.mediawiki.org/wiki/SeleniumFramework";
-		$this->addOption( 'port', 'Port used by selenium server. Default: 4444', false, true );
-		$this->addOption( 'host', 'Host selenium server. Default: $wgServer . $wgScriptPath', false, true );
-		$this->addOption( 'testBrowser', 'The browser used during testing. Default: firefox', false, true );
-		$this->addOption( 'wikiUrl', 'The Mediawiki installation to point to. Default: http://localhost', false, true );
-		$this->addOption( 'username', 'The login username for sunning tests. Default: empty', false, true );
-		$this->addOption( 'userPassword', 'The login password for running tests. Default: empty', false, true );
-		$this->addOption( 'seleniumConfig', 'Location of the selenium config file. Default: empty', false, true );
-		$this->addOption( 'list-browsers', 'List the available browsers.' );
-		$this->addOption( 'verbose', 'Be noisier.' );
-		$this->addOption( 'startserver', 'Start Selenium Server (on localhost) before the run.' );
-		$this->addOption( 'stopserver', 'Stop Selenium Server (on localhost) after the run.' );
-		$this->addOption( 'jUnitLogFile', 'Log results in a specified JUnit log file. Default: empty', false, true );
-		$this->addOption( 'runAgainstGrid', 'The test will be run against a Selenium Grid. Default: false.', false, true );
-		$this->deleteOption( 'dbpass' );
-		$this->deleteOption( 'dbuser' );
-		$this->deleteOption( 'globals' );
-		$this->deleteOption( 'wiki' );
-	}
-
-	public function listBrowsers() {
-		$desc = "Available browsers:\n";
-
-		foreach ( $this->selenium->getAvailableBrowsers() as $k => $v ) {
-			$desc .= "  $k => $v\n";
-		}
-
-		echo $desc;
-	}
-
-	protected function startServer() {
-		if ( $this->seleniumServerExecPath == '' ) {
-			die ( "The selenium server exec path is not set in " .
-				"selenium_settings.ini. Cannot start server \n" .
-				"as requested - terminating RunSeleniumTests\n" );
-		}
-		$this->serverManager = new SeleniumServerManager( 'true',
-			$this->selenium->getPort(),
-			$this->seleniumServerExecPath );
-		switch ( $this->serverManager->start() ) {
-			case 'started':
-				break;
-			case 'failed':
-				die ( "Unable to start the Selenium Server - " .
-					"terminating RunSeleniumTests\n" );
-			case 'running':
-				echo ( "Warning: The Selenium Server is " .
-					"already running\n" );
-				break;
-		}
-
-		return;
-	}
-
-	protected function stopServer() {
-		if ( !isset ( $this->serverManager ) ) {
-			echo ( "Warning: Request to stop Selenium Server, but it was " .
-				"not stared by RunSeleniumTests\n" .
-				"RunSeleniumTests cannot stop a Selenium Server it " .
-				"did not start\n" );
-		} else {
-			switch ( $this->serverManager->stop() ) {
-				case 'stopped':
-					break;
-				case 'failed':
-					echo ( "unable to stop the Selenium Server\n" );
-			}
-		}
-		return;
-	}
-
-	protected function runTests( $seleniumTestSuites = array() ) {
-		$result = new PHPUnit_Framework_TestResult;
-		$result->addListener( new SeleniumTestListener( $this->selenium->getLogger() ) );
-		if ( $this->selenium->getJUnitLogFile() ) {
-			$jUnitListener = new PHPUnit_Util_Log_JUnit( $this->selenium->getJUnitLogFile(), true );
-			$result->addListener( $jUnitListener );
-		}
-
-		foreach ( $seleniumTestSuites as $testSuiteName => $testSuiteFile ) {
-			require( $testSuiteFile );
-			$suite = new $testSuiteName();
-			$suite->setName( $testSuiteName );
-			$suite->addTests();
-
-			try {
-				$suite->run( $result );
-			} catch ( Testing_Selenium_Exception $e ) {
-				$suite->tearDown();
-				throw new MWException( $e->getMessage() );
-			}
-		}
-
-		if ( $this->selenium->getJUnitLogFile() ) {
-			$jUnitListener->flush();
-		}
-	}
-
-	public function execute() {
-		global $wgServer, $wgScriptPath, $wgHooks;
-
-		$seleniumSettings = array();
-		$seleniumBrowsers = array();
-		$seleniumTestSuites = array();
-
-		$configFile = $this->getOption( 'seleniumConfig', '' );
-		if ( strlen( $configFile ) > 0 ) {
-			$this->output( "Using Selenium Configuration file: " . $configFile . "\n" );
-			SeleniumConfig::getSeleniumSettings( $seleniumSettings,
-				$seleniumBrowsers,
-				$seleniumTestSuites,
-				$configFile );
-		} elseif ( !isset( $wgHooks['SeleniumSettings'] ) ) {
-			$this->output( "No command line, configuration file or configuration hook found.\n" );
-			SeleniumConfig::getSeleniumSettings( $seleniumSettings,
-				$seleniumBrowsers,
-				$seleniumTestSuites
-			);
-		} else {
-			$this->output( "Using 'SeleniumSettings' hook for configuration.\n" );
-			wfRunHooks( 'SeleniumSettings', array( $seleniumSettings,
-				$seleniumBrowsers,
-				$seleniumTestSuites ) );
-		}
-
-		// State for starting/stopping the Selenium server has nothing to do with the Selenium
-		// class. Keep this state local to SeleniumTester class. Using getOption() is clumsy, but
-		// the Maintenance class does not have a setOption()
-		if ( !isset( $seleniumSettings['startserver'] ) ) {
-			$this->getOption( 'startserver', true );
-		}
-		if ( !isset( $seleniumSettings['stopserver'] ) ) {
-			$this->getOption( 'stopserver', true );
-		}
-		if ( !isset( $seleniumSettings['seleniumserverexecpath'] ) ) {
-			$seleniumSettings['seleniumserverexecpath'] = '';
-		}
-		$this->seleniumServerExecPath = $seleniumSettings['seleniumserverexecpath'];
-
-		//set reasonable defaults if we did not find the settings
-		if ( !isset( $seleniumBrowsers ) ) {
-			$seleniumBrowsers = array( 'firefox' => '*firefox' );
-		}
-		if ( !isset( $seleniumSettings['host'] ) ) {
-			$seleniumSettings['host'] = $wgServer . $wgScriptPath;
-		}
-		if ( !isset( $seleniumSettings['port'] ) ) {
-			$seleniumSettings['port'] = '4444';
-		}
-		if ( !isset( $seleniumSettings['wikiUrl'] ) ) {
-			$seleniumSettings['wikiUrl'] = 'http://localhost';
-		}
-		if ( !isset( $seleniumSettings['username'] ) ) {
-			$seleniumSettings['username'] = '';
-		}
-		if ( !isset( $seleniumSettings['userPassword'] ) ) {
-			$seleniumSettings['userPassword'] = '';
-		}
-		if ( !isset( $seleniumSettings['testBrowser'] ) ) {
-			$seleniumSettings['testBrowser'] = 'firefox';
-		}
-		if ( !isset( $seleniumSettings['jUnitLogFile'] ) ) {
-			$seleniumSettings['jUnitLogFile'] = false;
-		}
-		if ( !isset( $seleniumSettings['runAgainstGrid'] ) ) {
-			$seleniumSettings['runAgainstGrid'] = false;
-		}
-
-		// Setup Selenium class
-		$this->selenium = new Selenium();
-		$this->selenium->setAvailableBrowsers( $seleniumBrowsers );
-		$this->selenium->setRunAgainstGrid( $this->getOption( 'runAgainstGrid', $seleniumSettings['runAgainstGrid'] ) );
-		$this->selenium->setUrl( $this->getOption( 'wikiUrl', $seleniumSettings['wikiUrl'] ) );
-		$this->selenium->setBrowser( $this->getOption( 'testBrowser', $seleniumSettings['testBrowser'] ) );
-		$this->selenium->setPort( $this->getOption( 'port', $seleniumSettings['port'] ) );
-		$this->selenium->setHost( $this->getOption( 'host', $seleniumSettings['host'] ) );
-		$this->selenium->setUser( $this->getOption( 'username', $seleniumSettings['username'] ) );
-		$this->selenium->setPass( $this->getOption( 'userPassword', $seleniumSettings['userPassword'] ) );
-		$this->selenium->setVerbose( $this->hasOption( 'verbose' ) );
-		$this->selenium->setJUnitLogFile( $this->getOption( 'jUnitLogFile', $seleniumSettings['jUnitLogFile'] ) );
-
-		if ( $this->hasOption( 'list-browsers' ) ) {
-			$this->listBrowsers();
-			exit( 0 );
-		}
-		if ( $this->hasOption( 'startserver' ) ) {
-			$this->startServer();
-		}
-
-		$logger = new SeleniumTestConsoleLogger;
-		$this->selenium->setLogger( $logger );
-
-		$this->runTests( $seleniumTestSuites );
-
-		if ( $this->hasOption( 'stopserver' ) ) {
-			$this->stopServer();
-		}
-	}
-}
-
-$maintClass = "SeleniumTester";
-
-require_once( RUN_MAINTENANCE_IF_MAIN );
diff --git a/tests/TestsAutoLoader.php b/tests/TestsAutoLoader.php
index c1c301f6..00ce13c8 100644
--- a/tests/TestsAutoLoader.php
+++ b/tests/TestsAutoLoader.php
@@ -30,14 +30,16 @@ $wgAutoloadClasses += array(
 	'DbTestPreviewer' => "$testDir/testHelpers.inc",
 	'DbTestRecorder' => "$testDir/testHelpers.inc",
 	'DelayedParserTest' => "$testDir/testHelpers.inc",
+	'ParserTestResult' => "$testDir/parser/ParserTestResult.php",
 	'TestFileIterator' => "$testDir/testHelpers.inc",
 	'TestRecorder' => "$testDir/testHelpers.inc",
+	'ITestRecorder' => "$testDir/testHelpers.inc",
 
 	# tests/phpunit
 	'MediaWikiTestCase' => "$testDir/phpunit/MediaWikiTestCase.php",
 	'MediaWikiPHPUnitCommand' => "$testDir/phpunit/MediaWikiPHPUnitCommand.php",
+	'MediaWikiPHPUnitTestListener' => "$testDir/phpunit/MediaWikiPHPUnitTestListener.php",
 	'MediaWikiLangTestCase' => "$testDir/phpunit/MediaWikiLangTestCase.php",
-	'MediaWikiProvide' => "$testDir/phpunit/includes/Providers.php",
 	'TestUser' => "$testDir/phpunit/includes/TestUser.php",
 
 	# tests/phpunit/includes
@@ -48,9 +50,7 @@ $wgAutoloadClasses += array(
 	//db
 	'ORMTableTest' => "$testDir/phpunit/includes/db/ORMTableTest.php",
 	'PageORMTableForTesting' => "$testDir/phpunit/includes/db/ORMTableTest.php",
-
-	//Selenium
-	'SeleniumTestConstants' => "$testDir/selenium/SeleniumTestConstants.php",
+	'DatabaseTestHelper' => "$testDir/phpunit/includes/db/DatabaseTestHelper.php",
 
 	# tests/phpunit/includes/api
 	'ApiFormatTestBase' => "$testDir/phpunit/includes/api/format/ApiFormatTestBase.php",
@@ -73,14 +73,25 @@ $wgAutoloadClasses += array(
 
 	# tests/phpunit/includes/parser
 	'NewParserTest' => "$testDir/phpunit/includes/parser/NewParserTest.php",
+	'MediaWikiParserTest' => "$testDir/phpunit/includes/parser/MediaWikiParserTest.php",
 
 	# tests/phpunit/includes/libs
 	'GenericArrayObjectTest' => "$testDir/phpunit/includes/libs/GenericArrayObjectTest.php",
 
+	# tests/phpunit/media
+	'FakeDimensionFile' => "$testDir/phpunit/includes/media/FakeDimensionFile.php",
+
 	# tests/phpunit/includes/site
 	'SiteTest' => "$testDir/phpunit/includes/site/SiteTest.php",
 	'TestSites' => "$testDir/phpunit/includes/site/TestSites.php",
 
+	# tests/phpunit/mocks
+	'MockFSFile' => "$testDir/phpunit/mocks/filebackend/MockFSFile.php",
+	'MockFileBackend' => "$testDir/phpunit/mocks/filebackend/MockFileBackend.php",
+	'MockBitmapHandler' => "$testDir/phpunit/mocks/media/MockBitmapHandler.php",
+	'MockImageHandler' => "$testDir/phpunit/mocks/media/MockBitmapHandler.php",
+	'MockSvgHandler' => "$testDir/phpunit/mocks/media/MockBitmapHandler.php",
+
 	# tests/phpunit/languages
 	'LanguageClassesTestCase' => "$testDir/phpunit/languages/LanguageClassesTestCase.php",
 
@@ -90,15 +101,4 @@ $wgAutoloadClasses += array(
 	# tests/parser
 	'ParserTest' => "$testDir/parser/parserTest.inc",
 	'ParserTestParserHook' => "$testDir/parser/parserTestsParserHook.php",
-
-	# tests/selenium
-	'Selenium' => "$testDir/selenium/Selenium.php",
-	'SeleniumLoader' => "$testDir/selenium/SeleniumLoader.php",
-	'SeleniumTestCase' => "$testDir/selenium/SeleniumTestCase.php",
-	'SeleniumTestConsoleLogger' => "$testDir/selenium/SeleniumTestConsoleLogger.php",
-	'SeleniumTestConstants' => "$testDir/selenium/SeleniumTestConstants.php",
-	'SeleniumTestHTMLLogger' => "$testDir/selenium/SeleniumTestHTMLLogger.php",
-	'SeleniumTestListener' => "$testDir/selenium/SeleniumTestListener.php",
-	'SeleniumTestSuite' => "$testDir/selenium/SeleniumTestSuite.php",
-	'SeleniumConfig' => "$testDir/selenium/SeleniumConfig.php",
 );
diff --git a/tests/parser/ParserTestResult.php b/tests/parser/ParserTestResult.php
new file mode 100644
index 00000000..d9ad773d
--- /dev/null
+++ b/tests/parser/ParserTestResult.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * @copyright Copyright © 2013, Antoine Musso
+ * @copyright Copyright © 2013, Wikimedia Foundation Inc.
+ * @license GNU GPL v2
+ *
+ * @file
+ */
+
+/**
+ * Represent the result of a parser test.
+ *
+ * @since 1.22
+ */
+class ParserTestResult {
+	/**
+	 * Description of the parser test.
+	 *
+	 * This is usually the text used to describe a parser test in the .txt
+	 * files.  It is initialized on a construction and you most probably
+	 * never want to change it.
+	 */
+	public $description;
+	/** Text that was expected */
+	public $expected;
+	/** Actual text rendered */
+	public $actual;
+
+	/**
+	 * @param $description string A short text describing the parser test
+	 *        usually the text in the parser test .txt file.  The description
+	 *        is later available using the property $description.
+	 */
+	public function __construct( $description ) {
+		$this->description = $description;
+	}
+
+	/** Whether the test passed */
+	public function isSuccess() {
+		return $this->expected === $this->actual;
+	}
+}
diff --git a/tests/parser/parserTest.inc b/tests/parser/parserTest.inc
index ce621f4e..58ea1ed0 100644
--- a/tests/parser/parserTest.inc
+++ b/tests/parser/parserTest.inc
@@ -1,6 +1,8 @@
 <?php
 /**
- * Helper code for the MediaWiki parser test suite.
+ * Helper code for the MediaWiki parser test suite. Some code is duplicated
+ * in PHPUnit's NewParserTests.php, so you'll probably want to update both
+ * at the same time.
  *
  * Copyright © 2004, 2010 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
@@ -31,22 +33,22 @@
  */
 class ParserTest {
 	/**
-	 * boolean $color whereas output should be colorized
+	 * @var bool $color whereas output should be colorized
 	 */
 	private $color;
 
 	/**
-	 * boolean $showOutput Show test output
+	 * @var bool $showOutput Show test output
 	 */
 	private $showOutput;
 
 	/**
-	 * boolean $useTemporaryTables Use temporary tables for the temporary database
+	 * @var bool $useTemporaryTables Use temporary tables for the temporary database
 	 */
 	private $useTemporaryTables = true;
 
 	/**
-	 * boolean $databaseSetupDone True if the database has been set up
+	 * @var bool $databaseSetupDone True if the database has been set up
 	 */
 	private $databaseSetupDone = false;
 
@@ -63,7 +65,7 @@ class ParserTest {
 	private $dbClone;
 
 	/**
-	 * string $oldTablePrefix Original table prefix
+	 * @var string $oldTablePrefix Original table prefix
 	 */
 	private $oldTablePrefix;
 
@@ -141,15 +143,14 @@ class ParserTest {
 	static function setUp() {
 		global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
 			$wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
-			$wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
+			$wgExtraNamespaces, $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
 			$parserMemc, $wgThumbnailScriptPath, $wgScriptPath,
-			$wgArticlePath, $wgStyleSheetPath, $wgScript, $wgStylePath, $wgExtensionAssetsPath,
+			$wgArticlePath, $wgScript, $wgStylePath, $wgExtensionAssetsPath,
 			$wgMainCacheType, $wgMessageCacheType, $wgParserCacheType, $wgLockManagers;
 
 		$wgScript = '/index.php';
 		$wgScriptPath = '/';
 		$wgArticlePath = '/wiki/$1';
-		$wgStyleSheetPath = '/skins';
 		$wgStylePath = '/skins';
 		$wgExtensionAssetsPath = '/extensions';
 		$wgThumbnailScriptPath = false;
@@ -181,6 +182,9 @@ class ParserTest {
 		$wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
 		$wgNamespaceAliases['Image'] = NS_FILE;
 		$wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
+		# add a namespace shadowing a interwiki link, to test
+		# proper precedence when resolving links. (bug 51680)
+		$wgExtraNamespaces[100] = 'MemoryAlpha';
 
 		// XXX: tests won't run without this (for CACHE_DB)
 		if ( $wgMainCacheType === CACHE_DB ) {
@@ -211,6 +215,73 @@ class ParserTest {
 			$wgStyleDirectory = "$IP/skins";
 		}
 
+		self::setupInterwikis();
+	}
+
+	/**
+	 * Insert hardcoded interwiki in the lookup table.
+	 *
+	 * This function insert a set of well known interwikis that are used in
+	 * the parser tests. They can be considered has fixtures are injected in
+	 * the interwiki cache by using the 'InterwikiLoadPrefix' hook.
+	 * Since we are not interested in looking up interwikis in the database,
+	 * the hook completely replace the existing mechanism (hook returns false).
+	 */
+	public static function setupInterwikis() {
+		# Hack: insert a few Wikipedia in-project interwiki prefixes,
+		# for testing inter-language links
+		Hooks::register( 'InterwikiLoadPrefix', function ( $prefix, &$iwData ) {
+			static $testInterwikis = array(
+				'wikipedia' => array(
+					'iw_url' => 'http://en.wikipedia.org/wiki/$1',
+					'iw_api' => '',
+					'iw_wikiid' => '',
+					'iw_local' => 0 ),
+				'meatball' => array(
+					'iw_url' => 'http://www.usemod.com/cgi-bin/mb.pl?$1',
+					'iw_api' => '',
+					'iw_wikiid' => '',
+					'iw_local' => 0 ),
+				'memoryalpha' => array(
+					'iw_url' => 'http://www.memory-alpha.org/en/index.php/$1',
+					'iw_api' => '',
+					'iw_wikiid' => '',
+					'iw_local' => 0 ),
+				'zh' => array(
+					'iw_url' => 'http://zh.wikipedia.org/wiki/$1',
+					'iw_api' => '',
+					'iw_wikiid' => '',
+					'iw_local' => 1 ),
+				'es' => array(
+					'iw_url' => 'http://es.wikipedia.org/wiki/$1',
+					'iw_api' => '',
+					'iw_wikiid' => '',
+					'iw_local' => 1 ),
+				'fr' => array(
+					'iw_url' => 'http://fr.wikipedia.org/wiki/$1',
+					'iw_api' => '',
+					'iw_wikiid' => '',
+					'iw_local' => 1 ),
+				'ru' => array(
+					'iw_url' => 'http://ru.wikipedia.org/wiki/$1',
+					'iw_api' => '',
+					'iw_wikiid' => '',
+					'iw_local' => 1 ),
+			);
+			if ( array_key_exists( $prefix, $testInterwikis ) ) {
+				$iwData = $testInterwikis[$prefix];
+			}
+
+			// We only want to rely on the above fixtures
+			return false;
+		} );// hooks::register
+	}
+
+	/**
+	 * Remove the hardcoded interwiki lookup table.
+	 */
+	public static function tearDownInterwikis() {
+		Hooks::clear( 'InterwikiLoadPrefix' );
 	}
 
 	public function setupRecorder( $options ) {
@@ -378,7 +449,12 @@ class ParserTest {
 	 */
 	public function runTestsFromFiles( $filenames ) {
 		$ok = false;
+
+		// be sure, ParserTest::addArticle has correct language set,
+		// so that system messages gets into the right language cache
+		$GLOBALS['wgLanguageCode'] = 'en';
 		$GLOBALS['wgContLang'] = Language::factory( 'en' );
+
 		$this->recorder->start();
 		try {
 			$this->setupDatabase();
@@ -418,6 +494,9 @@ class ParserTest {
 
 	/**
 	 * Get a Parser object
+	 *
+	 * @param string $preprocessor
+	 * @return Parser
 	 */
 	function getParser( $preprocessor = null ) {
 		global $wgParserConf;
@@ -487,9 +566,10 @@ class ParserTest {
 		} elseif ( isset( $opts['comment'] ) ) {
 			$out = Linker::formatComment( $input, $title, $local );
 		} elseif ( isset( $opts['preload'] ) ) {
-			$out = $parser->getpreloadText( $input, $title, $options );
+			$out = $parser->getPreloadText( $input, $title, $options );
 		} else {
 			$output = $parser->parse( $input, $title, $options, true, true, 1337 );
+			$output->setTOCEnabled( !isset( $opts['notoc'] ) );
 			$out = $output->getText();
 
 			if ( isset( $opts['showtitle'] ) ) {
@@ -518,18 +598,23 @@ class ParserTest {
 		}
 
 		$this->teardownGlobals();
-		return $this->showTestResult( $desc, $result, $out );
+
+		$testResult = new ParserTestResult( $desc );
+		$testResult->expected = $result;
+		$testResult->actual = $out;
+
+		return $this->showTestResult( $testResult );
 	}
 
 	/**
-	 *
+	 * Refactored in 1.22 to use ParserTestResult
 	 */
-	function showTestResult( $desc, $result, $out ) {
-		if ( $result === $out ) {
-			$this->showSuccess( $desc );
+	function showTestResult( ParserTestResult $testResult ) {
+		if ( $testResult->isSuccess() ) {
+			$this->showSuccess( $testResult );
 			return true;
 		} else {
-			$this->showFailure( $desc, $result, $out );
+			$this->showFailure( $testResult );
 			return false;
 		}
 	}
@@ -537,7 +622,7 @@ class ParserTest {
 	/**
 	 * Use a regex to find out the value of an option
 	 * @param $key String: name of option val to retrieve
-	 * @param $opts Options array to look in
+	 * @param $opts array: Options array to look in
 	 * @param $default Mixed: default value returned if not found
 	 */
 	private static function getOptionValue( $key, $opts, $default ) {
@@ -664,11 +749,10 @@ class ParserTest {
 			),
 			'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
 			'wgStylePath' => '/skins',
-			'wgStyleSheetPath' => '/skins',
 			'wgSitename' => 'MediaWiki',
 			'wgLanguageCode' => $lang,
 			'wgDBprefix' => $this->db->getType() != 'oracle' ? 'parsertest_' : 'pt_',
-			'wgRawHtml' => isset( $opts['rawhtml'] ),
+			'wgRawHtml' => self::getOptionValue( 'wgRawHtml', $opts, false ),
 			'wgLang' => null,
 			'wgContLang' => null,
 			'wgNamespacesWithSubpages' => array( 0 => isset( $opts['subpage'] ) ),
@@ -678,8 +762,10 @@ class ParserTest {
 			'wgNoFollowDomainExceptions' => array(),
 			'wgThumbnailScriptPath' => false,
 			'wgUseImageResize' => true,
+			'wgSVGConverter' => 'null',
+			'wgSVGConverters' => array( 'null' => 'echo "1">$output' ),
 			'wgLocaltimezone' => 'UTC',
-			'wgAllowExternalImages' => true,
+			'wgAllowExternalImages' => self::getOptionValue( 'wgAllowExternalImages', $opts, true ),
 			'wgUseTidy' => false,
 			'wgDefaultLanguageVariant' => $variant,
 			'wgVariantArticlePath' => false,
@@ -822,43 +908,9 @@ class ParserTest {
 				'user_name' => 'Anonymous' ) );
 		}
 
-		# Hack: insert a few Wikipedia in-project interwiki prefixes,
-		# for testing inter-language links
-		$this->db->insert( 'interwiki', array(
-			array( 'iw_prefix' => 'wikipedia',
-				'iw_url' => 'http://en.wikipedia.org/wiki/$1',
-				'iw_api' => '',
-				'iw_wikiid' => '',
-				'iw_local' => 0 ),
-			array( 'iw_prefix' => 'meatball',
-				'iw_url' => 'http://www.usemod.com/cgi-bin/mb.pl?$1',
-				'iw_api' => '',
-				'iw_wikiid' => '',
-				'iw_local' => 0 ),
-			array( 'iw_prefix' => 'zh',
-				'iw_url' => 'http://zh.wikipedia.org/wiki/$1',
-				'iw_api' => '',
-				'iw_wikiid' => '',
-				'iw_local' => 1 ),
-			array( 'iw_prefix' => 'es',
-				'iw_url' => 'http://es.wikipedia.org/wiki/$1',
-				'iw_api' => '',
-				'iw_wikiid' => '',
-				'iw_local' => 1 ),
-			array( 'iw_prefix' => 'fr',
-				'iw_url' => 'http://fr.wikipedia.org/wiki/$1',
-				'iw_api' => '',
-				'iw_wikiid' => '',
-				'iw_local' => 1 ),
-			array( 'iw_prefix' => 'ru',
-				'iw_url' => 'http://ru.wikipedia.org/wiki/$1',
-				'iw_api' => '',
-				'iw_wikiid' => '',
-				'iw_local' => 1 ),
-		) );
-
 		# Update certain things in site_stats
-		$this->db->insert( 'site_stats', array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ) );
+		$this->db->insert( 'site_stats',
+			array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ) );
 
 		# Reinitialise the LocalisationCache to match the database state
 		Language::getLocalisationCache()->unloadAll();
@@ -866,19 +918,52 @@ class ParserTest {
 		# Clear the message cache
 		MessageCache::singleton()->clear();
 
+		// Remember to update newParserTests.php after changing the below
+		// (and it uses a slightly different syntax just for teh lulz)
 		$this->uploadDir = $this->setupUploadDir();
 		$user = User::createNew( 'WikiSysop' );
 		$image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
+		# note that the size/width/height/bits/etc of the file
+		# are actually set by inspecting the file itself; the arguments
+		# to recordUpload2 have no effect.  That said, we try to make things
+		# match up so it is less confusing to readers of the code & tests.
 		$image->recordUpload2( '', 'Upload of some lame file', 'Some lame file', array(
-			'size' => 12345,
+			'size' => 7881,
 			'width' => 1941,
 			'height' => 220,
-			'bits' => 24,
+			'bits' => 8,
 			'media_type' => MEDIATYPE_BITMAP,
 			'mime' => 'image/jpeg',
 			'metadata' => serialize( array() ),
-			'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+			'sha1' => wfBaseConvert( '1', 16, 36, 31 ),
+			'fileExists' => true
+		), $this->db->timestamp( '20010115123500' ), $user );
+
+		$image = wfLocalFile( Title::makeTitle( NS_FILE, 'Thumb.png' ) );
+		# again, note that size/width/height below are ignored; see above.
+		$image->recordUpload2( '', 'Upload of some lame thumbnail', 'Some lame thumbnail', array(
+			'size' => 22589,
+			'width' => 135,
+			'height' => 135,
+			'bits' => 8,
+			'media_type' => MEDIATYPE_BITMAP,
+			'mime' => 'image/png',
+			'metadata' => serialize( array() ),
+			'sha1' => wfBaseConvert( '2', 16, 36, 31 ),
 			'fileExists' => true
+		), $this->db->timestamp( '20130225203040' ), $user );
+
+		$image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.svg' ) );
+		$image->recordUpload2( '', 'Upload of some lame SVG', 'Some lame SVG', array(
+				'size'        => 12345,
+				'width'       => 240,
+				'height'      => 180,
+				'bits'        => 24,
+				'media_type'  => MEDIATYPE_DRAWING,
+				'mime'        => 'image/svg+xml',
+				'metadata'    => serialize( array() ),
+				'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
+				'fileExists'  => true
 		), $this->db->timestamp( '20010115123500' ), $user );
 
 		# This image will be blacklisted in [[MediaWiki:Bad image list]]
@@ -891,7 +976,7 @@ class ParserTest {
 			'media_type' => MEDIATYPE_BITMAP,
 			'mime' => 'image/jpeg',
 			'metadata' => serialize( array() ),
-			'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+			'sha1' => wfBaseConvert( '3', 16, 36, 31 ),
 			'fileExists' => true
 		), $this->db->timestamp( '20010115123500' ), $user );
 	}
@@ -922,8 +1007,11 @@ class ParserTest {
 		$tables = $this->listTables();
 
 		foreach ( $tables as $table ) {
-			$sql = $this->db->getType() == 'oracle' ? "DROP TABLE pt_$table DROP CONSTRAINTS" : "DROP TABLE `parsertest_$table`";
-			$this->db->query( $sql );
+			if ( $this->db->getType() == 'oracle' ) {
+				$this->db->query( "DROP TABLE pt_$table DROP CONSTRAINTS" );
+			} else {
+				$this->db->query( "DROP TABLE `parsertest_$table`" );
+			}
 		}
 
 		if ( $this->db->getType() == 'oracle' ) {
@@ -960,9 +1048,15 @@ class ParserTest {
 
 		wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
 		copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
+		wfMkdirParents( $dir . '/e/ea', null, __METHOD__ );
+		copy( "$IP/skins/monobook/wiki.png", "$dir/e/ea/Thumb.png" );
 		wfMkdirParents( $dir . '/0/09', null, __METHOD__ );
 		copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
-
+		wfMkdirParents( $dir . '/f/ff', null, __METHOD__ );
+		copy( "$IP/skins/monobook/headbg.jpg", "$dir/f/ff/Foobar.svg" );
+		file_put_contents( "$dir/f/ff/Foobar.svg",
+			'<?xml version="1.0" encoding="utf-8"?>' .
+			'<svg xmlns="http://www.w3.org/2000/svg" />' );
 		return $dir;
 	}
 
@@ -1008,8 +1102,18 @@ class ParserTest {
 				"$dir/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg",
 				"$dir/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg",
 
+				"$dir/e/ea/Thumb.png",
+
 				"$dir/0/09/Bad.jpg",
 
+				"$dir/f/ff/Foobar.svg",
+				"$dir/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png",
+				"$dir/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png",
+				"$dir/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png",
+				"$dir/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png",
+				"$dir/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png",
+				"$dir/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png",
+
 				"$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
 			)
 		);
@@ -1023,7 +1127,13 @@ class ParserTest {
 				"$dir/thumb/3/3a/Foobar.jpg",
 				"$dir/thumb/3/3a",
 				"$dir/thumb/3",
-
+				"$dir/e/ea",
+				"$dir/e",
+				"$dir/f/ff/",
+				"$dir/f/",
+				"$dir/thumb/f/ff/Foobar.svg",
+				"$dir/thumb/f/ff/",
+				"$dir/thumb/f/",
 				"$dir/0/09/",
 				"$dir/0/",
 				"$dir/thumb",
@@ -1070,10 +1180,12 @@ class ParserTest {
 	/**
 	 * Print a happy success message.
 	 *
-	 * @param $desc String: the test name
+	 * Refactored in 1.22 to use ParserTestResult
+	 *
+	 * @param $testResult ParserTestResult
 	 * @return Boolean
 	 */
-	protected function showSuccess( $desc ) {
+	protected function showSuccess( ParserTestResult $testResult ) {
 		if ( $this->showProgress ) {
 			print $this->term->color( '1;32' ) . 'PASSED' . $this->term->reset() . "\n";
 		}
@@ -1085,28 +1197,29 @@ class ParserTest {
 	 * Print a failure message and provide some explanatory output
 	 * about what went wrong if so configured.
 	 *
-	 * @param $desc String: the test name
-	 * @param $result String: expected HTML output
-	 * @param $html String: actual HTML output
+	 * Refactored in 1.22 to use ParserTestResult
+	 *
+	 * @param $testResult ParserTestResult
 	 * @return Boolean
 	 */
-	protected function showFailure( $desc, $result, $html ) {
+	protected function showFailure( ParserTestResult $testResult ) {
 		if ( $this->showFailure ) {
 			if ( !$this->showProgress ) {
 				# In quiet mode we didn't show the 'Testing' message before the
 				# test, in case it succeeded. Show it now:
-				$this->showTesting( $desc );
+				$this->showTesting( $testResult->description );
 			}
 
 			print $this->term->color( '31' ) . 'FAILED!' . $this->term->reset() . "\n";
 
 			if ( $this->showOutput ) {
-				print "--- Expected ---\n$result\n--- Actual ---\n$html\n";
+				print "--- Expected ---\n{$testResult->expected}\n";
+				print "--- Actual ---\n{$testResult->actual}\n";
 			}
 
 			if ( $this->showDiffs ) {
-				print $this->quickDiff( $result, $html );
-				if ( !$this->wellFormed( $html ) ) {
+				print $this->quickDiff( $testResult->expected, $testResult->actual );
+				if ( !$this->wellFormed( $testResult->actual ) ) {
 					print "XML error: $this->mXmlError\n";
 				}
 			}
@@ -1125,7 +1238,9 @@ class ParserTest {
 	 * @param $outFileTail String: tailing for the output file name
 	 * @return String
 	 */
-	protected function quickDiff( $input, $output, $inFileTail = 'expected', $outFileTail = 'actual' ) {
+	protected function quickDiff( $input, $output,
+		$inFileTail = 'expected', $outFileTail = 'actual'
+	) {
 		# Windows, or at least the fc utility, is retarded
 		$slash = wfIsWindows() ? '\\' : '/';
 		$prefix = wfTempDir() . "{$slash}mwParser-" . mt_rand();
@@ -1141,9 +1256,10 @@ class ParserTest {
 
 		global $wgDiff3;
 		// we assume that people with diff3 also have usual diff
-		$diff = ( wfIsWindows() && !$wgDiff3 )
-			? `fc $shellInfile $shellOutfile`
-			: `diff -au $shellInfile $shellOutfile`;
+		$shellCommand = ( wfIsWindows() && !$wgDiff3 ) ? 'fc' : 'diff -au';
+
+		$diff = wfShellExec( "$shellCommand $shellInfile $shellOutfile" );
+
 		unlink( $infile );
 		unlink( $outfile );
 
@@ -1343,7 +1459,7 @@ class ParserTest {
 	}
 
 	static function getFakeTimestamp( &$parser, &$ts ) {
-		$ts = 123;
+		$ts = 123; //parsed as '1970-01-01T00:02:03Z'
 		return true;
 	}
 }
diff --git a/tests/parser/parserTests.txt b/tests/parser/parserTests.txt
index f0603e75..02a66b51 100644
--- a/tests/parser/parserTests.txt
+++ b/tests/parser/parserTests.txt
@@ -26,6 +26,11 @@
 # showtitle     make the first line the title
 # comment       run through Linker::formatComment() instead of main parser
 # local         format section links in edit comment text as local links
+# notoc         disable table of contents
+#
+# You can also set the following parser properties via test options:
+#  wgEnableUploads, wgAllowExternalImages, wgMaxTocLevel,
+#  wgLinkHolderBatchSize, wgRawHtml
 #
 # For testing purposes, temporary articles can created:
 # !!article / NAMESPACE:TITLE / !!text / ARTICLE TEXT / !!endarticle
@@ -116,12 +121,31 @@ Template:table_attribs
 |</noinclude>style="color: red"| Foo
 !! endarticle
 
+!! article
+Template:table_cells
+!! text
+{{table_attribs}} || Bar || Baz
+!! endarticle
+
+!! article
+Template:image_attribs
+!! text
+<noinclude>
+[[File:foobar.jpg|</noinclude>right|Caption text<noinclude>]]</noinclude>
+!! endarticle
+
 !! article
 A?b
 !! text
 Weirdo titles!
 !! endarticle
 
+!!article
+Template:Bullet
+!!text
+* Bar
+!!endarticle
+
 ###
 ### Basic tests
 ###
@@ -164,6 +188,206 @@ baz
 </p>
 !! end
 
+!! test
+Paragraphs with newline spacing with comment lines in between
+!! input
+----
+a
+<!--foo-->
+b
+----
+a
+<!--foo--><!--More than 1 comment, still stripped-->
+b
+----
+a
+ <!--foo--> <!----> <!-- bar --> 
+b
+----
+a
+<!--foo-->
+
+b
+----
+a
+
+<!--foo-->
+b
+----
+a
+<!--foo-->
+
+
+b
+----
+a
+
+
+<!--foo-->
+b
+----
+!! result
+<hr />
+<p>a
+b
+</p>
+<hr />
+<p>a
+b
+</p>
+<hr />
+<p>a
+b
+</p>
+<hr />
+<p>a
+</p><p>b
+</p>
+<hr />
+<p>a
+</p><p>b
+</p>
+<hr />
+<p>a
+</p><p><br />
+b
+</p>
+<hr />
+<p>a
+</p><p><br />
+b
+</p>
+<hr />
+
+!! end
+
+!! test
+Paragraphs with newline spacing with non-empty white-space lines in between
+!! input
+----
+a
+ 
+b
+----
+a
+ 
+ 
+b
+----
+!! result
+<hr />
+<p>a
+</p><p>b
+</p>
+<hr />
+<p>a
+</p><p><br /> 
+b
+</p>
+<hr />
+
+!! end
+
+!! test
+Paragraphs with newline spacing with non-empty mixed comment and white-space lines in between
+!! input
+----
+a
+ <!--foo-->
+b
+----
+a
+ <!--foo--><!--More than 1 comment doesn't disable stripping of this line!-->
+b
+----
+a
+ 
+<!--foo-->
+ <!--bar-->
+b
+----
+a
+ 
+ <!--foo-->
+ <!--bar-->
+ 
+b
+----
+!! result
+<hr />
+<p>a
+b
+</p>
+<hr />
+<p>a
+b
+</p>
+<hr />
+<p>a
+</p><p>b
+</p>
+<hr />
+<p>a
+</p><p><br /> 
+b
+</p>
+<hr />
+
+!! end
+
+!! test
+Extra newlines: More paragraphs with indented comment
+!! input
+a
+
+   <!--boo-->
+
+b
+!!result
+<p>a
+</p><p><br />
+b
+</p>
+!!end
+
+!! test
+Extra newlines followed by heading
+!! input
+a
+
+
+
+=b=
+[[a]]
+
+
+=b=
+!! result
+<p>a
+</p><p><br />
+</p>
+<h1><span class="mw-headline" id="b">b</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<p><a href="/index.php?title=A&amp;action=edit&amp;redlink=1" class="new" title="A (page does not exist)">a</a>
+</p><p><br />
+</p>
+<h1><span class="mw-headline" id="b_2">b</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+
+!! end
+
+!! test
+Extra newlines between heading and content are swallowed
+!! input
+=b=
+
+
+
+[[a]]
+!! result
+<h1><span class="mw-headline" id="b">b</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: b">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<p><a href="/index.php?title=A&amp;action=edit&amp;redlink=1" class="new" title="A (page does not exist)">a</a>
+</p>
+!! end
+
 !! test
 Parsing an URL
 !! input
@@ -180,9 +404,12 @@ Simple list
 * Item 1
 * Item 2
 !! result
-<ul><li> Item 1
-</li><li> Item 2
-</li></ul>
+<ul>
+<li> Item 1
+</li>
+<li> Item 2
+</li>
+</ul>
 
 !! end
 
@@ -205,25 +432,72 @@ Italics and bold
 * plain l'''italic''plain
 * plain l''''bold''' plain
 !! result
-<ul><li> plain
-</li><li> plain<i>italic</i>plain
-</li><li> plain<i>italic</i>plain<i>italic</i>plain
-</li><li> plain<b>bold</b>plain
-</li><li> plain<b>bold</b>plain<b>bold</b>plain
-</li><li> plain<i>italic</i>plain<b>bold</b>plain
-</li><li> plain<b>bold</b>plain<i>italic</i>plain
-</li><li> plain<i>italic<b>bold-italic</b>italic</i>plain
-</li><li> plain<b>bold<i>bold-italic</i>bold</b>plain
-</li><li> plain<i><b>bold-italic</b>italic</i>plain
-</li><li> plain<b><i>bold-italic</i>bold</b>plain
-</li><li> plain<i>italic<b>bold-italic</b></i>plain
-</li><li> plain<b>bold<i>bold-italic</i></b>plain
-</li><li> plain l'<i>italic</i>plain
-</li><li> plain l'<b>bold</b> plain
-</li></ul>
+<ul>
+<li> plain
+</li>
+<li> plain<i>italic</i>plain
+</li>
+<li> plain<i>italic</i>plain<i>italic</i>plain
+</li>
+<li> plain<b>bold</b>plain
+</li>
+<li> plain<b>bold</b>plain<b>bold</b>plain
+</li>
+<li> plain<i>italic</i>plain<b>bold</b>plain
+</li>
+<li> plain<b>bold</b>plain<i>italic</i>plain
+</li>
+<li> plain<i>italic<b>bold-italic</b>italic</i>plain
+</li>
+<li> plain<b>bold<i>bold-italic</i>bold</b>plain
+</li>
+<li> plain<i><b>bold-italic</b>italic</i>plain
+</li>
+<li> plain<b><i>bold-italic</i>bold</b>plain
+</li>
+<li> plain<i>italic<b>bold-italic</b></i>plain
+</li>
+<li> plain<b>bold<i>bold-italic</i></b>plain
+</li>
+<li> plain l'<i>italic</i>plain
+</li>
+<li> plain l'<b>bold</b> plain
+</li>
+</ul>
+
+!! end
+
+# this example taken from the [[simple:Moon]] article (bug 47326)
+!! test
+Italics and possessives (1)
+!! input
+obtained by ''[[Lunar Prospector]]'''s gamma-ray spectrometer
+!! result
+<p>obtained by <i><a href="/index.php?title=Lunar_Prospector&amp;action=edit&amp;redlink=1" class="new" title="Lunar Prospector (page does not exist)">Lunar Prospector</a>'</i>s gamma-ray spectrometer
+</p>
+!! end
+
+# this example taken from [[en:Flaming Pie]] (bug 49926)
+!! test
+Italics and possessives (2)
+!! input
+'''''Flaming Pie''''' is ... released in 1997. In ''Flaming Pie'''s liner notes
+!! result
+<p><i><b>Flaming Pie</b></i> is ... released in 1997. In <i>Flaming Pie'</i>s liner notes
+</p>
+!! end
 
+# this example taken from [[en:Dictionary]] (bug 49926)
+!! test
+Italics and possessives (3)
+!! input
+The first monolingual dictionary written in a Romance language was ''Sebastián Covarrubias''' ''Tesoro de la lengua castellana o española'', published in 1611 in Madrid. In 1612 the first edition of the ''Vocabolario dell'[[Accademia della Crusca]]'', for Italian, was published. In 1690 in Rotterdam was published, posthumously, the ''Dictionnaire Universel''.
+!! result
+<p>The first monolingual dictionary written in a Romance language was <i>Sebastián Covarrubias'</i> <i>Tesoro de la lengua castellana o española</i>, published in 1611 in Madrid. In 1612 the first edition of the <i>Vocabolario dell'<a href="/index.php?title=Accademia_della_Crusca&amp;action=edit&amp;redlink=1" class="new" title="Accademia della Crusca (page does not exist)">Accademia della Crusca</a></i>, for Italian, was published. In 1690 in Rotterdam was published, posthumously, the <i>Dictionnaire Universel</i>.
+</p>
 !! end
 
+
 ###
 ### 2-quote opening sequence tests
 ###
@@ -258,13 +532,26 @@ Italics and bold: 2-quote opening sequence: (2,4)
 
 
 !! test
-Italics and bold: 2-quote opening sequence: (2,5)
+Italics and bold: 2-quote opening sequence: (2,5) (php)
+!! options
+php
 !! input
 ''foo'''''
 !! result
 <p><i>foo</i>
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: 2-quote opening sequence: (2,5) (parsoid)
+!! options
+parsoid
+!! input
+''foo'''''
+!! result
+<p><i>foo</i><b></b>
+</p>
+!!end
 
 
 ###
@@ -302,13 +589,26 @@ Italics and bold: 3-quote opening sequence: (3,4)
 
 
 !! test
-Italics and bold: 3-quote opening sequence: (3,5)
+Italics and bold: 3-quote opening sequence: (3,5) (php)
+!! options
+php
 !! input
 '''foo'''''
 !! result
 <p><b>foo</b>
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: 3-quote opening sequence: (3,5) (parsoid)
+!! options
+parsoid
+!! input
+'''foo'''''
+!! result
+<p><b>foo</b><i></i>
+</p>
+!!end
 
 
 ###
@@ -346,13 +646,26 @@ Italics and bold: 4-quote opening sequence: (4,4)
 
 
 !! test
-Italics and bold: 4-quote opening sequence: (4,5)
+Italics and bold: 4-quote opening sequence: (4,5) (php)
+!! options
+php
 !! input
 ''''foo'''''
 !! result
 <p>'<b>foo</b>
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: 4-quote opening sequence: (4,5) (parsoid)
+!! options
+parsoid
+!! input
+''''foo'''''
+!! result
+<p>'<b>foo</b><i></i>
+</p>
+!!end
 
 
 ###
@@ -361,6 +674,7 @@ Italics and bold: 4-quote opening sequence: (4,5)
 
 !! test
 Italics and bold: 5-quote opening sequence: (5,2)
+!! options
 !! input
 '''''foo''
 !! result
@@ -432,23 +746,49 @@ Italics and bold: multiple quote sequences: (2,4,4)
 
 
 !! test
-Italics and bold: multiple quote sequences: (3,4,2)
+Italics and bold: multiple quote sequences: (3,4,2) (php)
+!! options
+php
 !! input
 '''foo''''bar''
 !! result
 <p><b>foo'</b>bar
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: multiple quote sequences: (3,4,2) (parsoid)
+!! options
+parsoid
+!! input
+'''foo''''bar''
+!! result
+<p><b>foo'</b>bar<i></i>
+</p>
+!!end
+
 
-
 !! test
-Italics and bold: multiple quote sequences: (3,4,3)
+Italics and bold: multiple quote sequences: (3,4,3) (php)
+!! options
+php
 !! input
 '''foo''''bar'''
 !! result
 <p><b>foo'</b>bar
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: multiple quote sequences: (3,4,3) (parsoid)
+!! options
+parsoid
+!! input
+'''foo''''bar'''
+!! result
+<p><b>foo'</b>bar<b></b>
+</p>
+!!end
 
 ###
 ### other quote tests
@@ -485,6 +825,7 @@ Italics and bold: other quote tests: (3,2,3,2)
 
 !! test
 Italics and bold: other quote tests: (3,2,3,3)
+!! options
 !! input
 '''this is about ''foo'''s family'''
 !! result
@@ -512,6 +853,23 @@ The ''[[Main Page]]'''s talk page.
 </p>
 !! end
 
+!! test
+Parsoid only: Quote balancing context should be restricted to td/th cells on the same wikitext line
+(Requires tidy for PHP parser output to be fixed up)
+!! options
+parsoid=wt2html,wt2wt
+!! input
+{|
+!''a!!''b
+|''a||''b
+|}
+!! result
+<table>
+<tbody><tr><th><i>a</i></th><th><i>b</i></th>
+<td><i>a</i></td><td><i>b</i></td></tr>
+</tbody></table>
+!! end
+
 ###
 ### Non-html5 tags
 ###
@@ -533,6 +891,74 @@ Non-html5 tags should be accepted
 </p>
 !! end
 
+!! test
+<wbr> is valid wikitext (bug 52468)
+!! input
+<wbr>
+!! result
+<p><wbr />
+</p>
+!! end
+
+# <strike> is HTML4, <s> is HTML4/5.
+!! test
+<s> or <strike> for strikethrough
+!! input
+<strike>strike</strike>
+
+<s>s</s>
+!! result
+<p><strike>strike</strike>
+</p><p><s>s</s>
+</p>
+!! end
+
+!! test
+Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
+!! input
+<b→> doesn't work! </b>
+
+<bä> doesn't work! </b>
+
+<boo> works fine </b>
+
+<s.foo>foo</s>
+
+<s.foo>s.foo</s.foo>
+
+<sub-ID#1>
+!! result
+<p>&lt;b→&gt; doesn't work! &lt;/b&gt;
+</p><p>&lt;bä&gt; doesn't work! &lt;/b&gt;
+</p><p>&lt;boo&gt; works fine &lt;/b&gt;
+</p><p>&lt;s.foo&gt;foo&lt;/s&gt;
+</p><p>&lt;s.foo&gt;s.foo&lt;/s.foo&gt;
+</p><p>&lt;sub-ID#1&gt;
+</p>
+!! end
+
+###
+### Special characters
+###
+
+!! test
+Bare pipe character (bug 52363)
+!! input
+|
+!! result
+<p>|
+</p>
+!! end
+
+!! test
+Bare pipe character from a template (bug 52363)
+!! input
+{{pipe}}
+!! result
+<p>|
+</p>
+!! end
+
 ###
 ### <nowiki> test cases
 ###
@@ -579,15 +1005,24 @@ nowiki 3
 *There is not nowiki.
 *There is <nowiki>nowiki</nowiki>.
 !! result
-<dl><dd>There is not nowiki.
-</dd><dd>There is nowiki.
-</dd></dl>
-<ol><li>There is not nowiki.
-</li><li>There is nowiki.
-</li></ol>
-<ul><li>There is not nowiki.
-</li><li>There is nowiki.
-</li></ul>
+<dl>
+<dd>There is not nowiki.
+</dd>
+<dd>There is nowiki.
+</dd>
+</dl>
+<ol>
+<li>There is not nowiki.
+</li>
+<li>There is nowiki.
+</li>
+</ol>
+<ul>
+<li>There is not nowiki.
+</li>
+<li>There is nowiki.
+</li>
+</ul>
 
 !! end
 
@@ -600,6 +1035,16 @@ Entities inside <nowiki>
 </p>
 !! end
 
+!! test
+Entities inside template parameters
+!! options
+parsoid
+!! input
+{{echo|&ndash;}}
+!! result
+<p><span typeof="mw:Transclusion mw:Entity" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&amp;ndash;"}},"i":0}}]}'>&ndash;</span>
+</p>
+!! end
 
 ###
 ### Comments
@@ -781,7 +1226,7 @@ b
 !! end
 
 ###
-### paragraph wraping tests
+### paragraph wrapping tests
 ###
 !! test
 No block tags
@@ -794,8 +1239,9 @@ b
 </p><p>b
 </p>
 !! end
+
 !! test
-Block tag on one line
+Block tag on one line (<div>)
 !! input
 a <div>foo</div>
 
@@ -807,7 +1253,19 @@ a <div>foo</div>
 !! end
 
 !! test
-Block tag on both lines
+Block tag on one line (<blockquote>)
+!! input
+a <blockquote>foo</blockquote>
+
+b
+!! result
+a <blockquote>foo</blockquote>
+<p>b
+</p>
+!! end
+
+!! test
+Block tag on both lines (<div>)
 !! input
 a <div>foo</div>
 
@@ -818,6 +1276,18 @@ b <div>foo</div>
 
 !! end
 
+!! test
+Block tag on both lines (<blockquote>)
+!! input
+a <blockquote>foo</blockquote>
+
+b <blockquote>foo</blockquote>
+!! result
+a <blockquote>foo</blockquote>
+b <blockquote>foo</blockquote>
+
+!! end
+
 !! test
 Multiple lines without block tags
 !! input
@@ -837,7 +1307,7 @@ x <div>foo</div> z
 !! end
 
 !! test
-Empty lines between block tags to test open p-tags are closed between the block tags
+Empty lines between lines with block tags
 !! input
 <div></div>
 
@@ -845,6 +1315,12 @@ Empty lines between block tags to test open p-tags are closed between the block
 <div></div>a
 
 b
+<div>a</div>b
+
+<div>b</div>d
+
+
+<div>e</div>
 !! result
 <div></div>
 <p><br />
@@ -852,6 +1328,12 @@ b
 <div></div>a
 <p>b
 </p>
+<div>a</div>b
+<div>b</div>d
+<p><br />
+</p>
+<div>e</div>
+
 !! end
 
 ###
@@ -874,6 +1356,22 @@ And a <a href="/wiki/Main_Page" title="Main Page">link</a>
 </pre>
 !! end
 
+!! test
+Tabs don't trigger preformatted text
+!! input
+	This is not
+	 preformatted text.
+ This is preformatted text.
+ 	So is this.
+!! result
+<p>	This is not
+	 preformatted text.
+</p>
+<pre>This is preformatted text.
+	So is this.
+</pre>
+!! end
+
 !! test
 Ident preformatting with inline content
 !! input
@@ -916,17 +1414,61 @@ Regression with preformatted in <center>
 
 !! end
 
-# Expected output in the following test is not really expected (there should be
-# <pre> in the output) -- it's only testing for well-formedness.
 !! test
-Bug 6200: Preformatted in <blockquote>
+Bug 52763: Preformatted in <blockquote>
 !! input
 <blockquote>
  Blah
 </blockquote>
 !! result
 <blockquote>
- Blah
+<p> Blah
+</p>
+</blockquote>
+
+!! end
+
+!! test
+Bug 51086: Double newlines in blockquotes should be turned into paragraphs
+!! input
+<blockquote>
+Foo
+
+Bar
+</blockquote>
+!! result
+<blockquote>
+<p>Foo
+</p><p>Bar
+</p>
+</blockquote>
+
+!! end
+
+!! test
+Bug 15491: <ins>/<del> in blockquote
+!! input
+<blockquote>
+Foo <del>bar</del> <ins>baz</ins> quux
+</blockquote>
+!! result
+<blockquote>
+<p>Foo <del>bar</del> <ins>baz</ins> quux
+</p>
+</blockquote>
+
+!! end
+
+# Note that the p-wrapping is newline sensitive, which could be
+# considered a bug: tidy will wrap only the 'Foo' in the example
+# below in a <p> tag. (see comment 23-25 of bug #6200)
+!! test
+Bug 15491: <ins>/<del> in blockquote (2)
+!! input
+<blockquote>Foo <del>bar</del> <ins>baz</ins> quux
+</blockquote>
+!! result
+<blockquote>Foo <del>bar</del> <ins>baz</ins> quux
 </blockquote>
 
 !! end
@@ -1156,82 +1698,253 @@ Templates: Indent-Pre: 1f: Wrapping should be based on expanded content
 </pre>
 !!end
 
+# TODO / maybe: fix wt2wt for this
 !! test
-Templates: Single-line variant of parameter whitespace stripping test
+Parsoid: Don't paragraph-wrap fosterable content
+!! options
+parsoid=wt2html
 !! input
-{{echo| a}}
+{|
+<td></td>
+<td></td>
 
-{{echo|1= a}}
 
-{{echo|{{echo| a}}}}
 
-{{echo|1={{echo| a}}}}
+|}
 !! result
-<pre>a
-</pre>
-<p>a
-</p>
-<pre>a
-</pre>
-<p>a
-</p>
+<table>
+
+<tbody>
+<tr>
+<td></td>
+
+<td></td></tr>
+
+
+
+</tbody></table>
 !! end
 
 !! test
-Templates: Strip whitespace from named parameters, but not positional ones
+Parsoid: Don't paragraph-wrap fosterable content even if table syntax is unbalanced
+!! options
+parsoid=wt2html
 !! input
-{{echo|
- foo}}
+{|
+<td>
+<td>
+</td>
 
-{{echo|
-* foo}}
+
+
+|}
+!! result
+<table>
+
+<tbody>
+<tr>
+<td></td>
+
+<td>
+</td></tr>
+
+
+
+</tbody></table>
+!! end
+
+
+#--------------------------------------------------------------------
+# Transclusion parameter whitespace stripping tests
+# Behavior is different for positional and named parameters
+#--------------------------------------------------------------------
+!! test
+Templates: Strip leading and trailing whitespace from named-param values
+!! input
+{{echo|1= a }}
+
+{{echo|1= {{echo|b}} }}
 
 {{echo| 1 =
- foo}}
+ c }}
 
 {{echo| 1 =
-* foo}}
+* d
+}}
 !! result
-<pre>foo
-</pre>
-<p><br />
-</p>
-<ul><li> foo
-</li></ul>
-<p>foo
+<p>a
+</p><p>b
+</p><p>c
 </p>
-<ul><li> foo
-</li></ul>
+<ul>
+<li> d
+</li>
+</ul>
 
 !! end
 
-###
-### Parsoid-centric tests for testing RT edge cases for pre
-###
+!! test
+Templates: Don't strip whitespace from positional-param values
+!! input
+{{echo|a }}
 
-!!test
-1a. Indent-Pre and Comments
-!!input
- a
-<!--a-->
-c
-!!result
-<pre>a
+{{echo|{{echo|b}} }}
+
+{{echo| c 
+}}
+
+{{echo| {{echo|d}}
+}}
+
+{{echo|
+ e}}
+
+{{echo|
+* f}}
+
+{{echo|
+ }}g
+!! result
+<p>a 
+</p><p>b 
+</p>
+<pre>c 
 </pre>
-<p>c
+<p><br />
 </p>
-!!end
-
-!!test
-1b. Indent-Pre and Comments
-!!input
- a
- <!--a-->
-c
-!!result
-<pre>a
+<pre>d
 </pre>
-<p>c
+<p><br />
+</p>
+<pre>e
+</pre>
+<p><br />
+</p>
+<ul>
+<li> f
+</li>
+</ul>
+<p><br />
+</p>
+<pre>g
+</pre>
+!! end
+
+!! test
+Templates: Handle empty comment-and-ws-only lines correctly
+!! input
+{{echo|foo
+<!--should be ignored-->
+ <!--should be ignored as well-->
+bar}}
+!! result
+<p>foo
+bar
+</p>
+!! end
+
+#--------------------------------------------------------------------
+# Transclusion parameter escaping tests
+#--------------------------------------------------------------------
+!! test
+Templates: Parsoid parameter escaping test 1
+!! options
+parsoid
+!! input
+{{echo|[foo]|{{echo|[bar]}}}}
+!! result
+<p about="#mwt1" typeof="mw:Transclusion"
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[foo]"},"2":{"wt":"{{echo|[bar]}}"}},"i":0}}]}'>[foo]</p>
+!! end
+
+!! test
+Parsoid: Pipes in external links in template parameter
+!! options
+parsoid
+!! input
+{{echo|[{{echo|http://example.com}} link]}}
+!! result
+<p><a rel="mw:ExtLink" href="http://example.com" about="#mwt31" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[{{echo|http://example.com}} link]"}},"i":0}}]}'>link</a></p>
+!! end
+
+!! test
+Parsoid: pipe in transclusion parameter
+!! options
+parsoid
+!! input
+{{echo|http://foo.com/a&#124;b}}
+!! result
+<p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1"
+typeof="mw:Transclusion"
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"http://foo.com/a&amp;#124;b"}},"i":0}}]}'>http://foo.com/a|b</a></p>
+!! end
+
+!! test
+Parsoid: Pipe in external link target and content in template parameter
+!! options
+parsoid=html2wt,wt2wt
+!! input
+{{echo|[http://foo.com/a&#124;b a&#124;b]}}
+!! result
+<p><a rel="mw:ExtLink" href="http://foo.com/a|b" about="#mwt1"
+typeof="mw:Transclusion"
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},
+"params":{"1":{"wt":"[http://foo.com/a|b a|b]"}},"i":0}}]}'>a|b</a></p>
+!! end
+
+!! test
+Templates: Dont escape already nowiki-escaped text in template parameters
+!! options
+parsoid=html2wt,wt2wt
+!! input
+{{echo|foo<nowiki>|</nowiki>bar}}
+{{echo|<nowiki>&lt;div&gt;</nowiki>}}
+{{echo|<nowiki></nowiki>}}
+!! result
+<p><span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo<nowiki>|</nowiki>bar"}},"i":0}}]}'}'>foo</span><span typeof="mw:Nowiki" about="#mwt1">|</span><span about="#mwt1">bar</span>
+<span typeof="mw:Transclusion mw:Nowiki" about="#mwt2" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki>&amp;lt;div&amp;gt;</nowiki>"}},"i":0}}]}'><span typeof="mw:Entity">&lt;</span>div<span typeof="mw:Entity">&gt;</span></span>
+<span typeof="mw:Transclusion mw:Nowiki" about="#mwt3" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<nowiki></nowiki>"}},"i":0}}]}'></span>
+</p>
+!! end
+
+## Bug 52824
+!! test
+Templates: '=' char in nested transclusions should not trigger nowiki escapes or conversion to named param
+!! options
+parsoid=html2wt,wt2wt
+!! input
+{{echo|{{echo|1=bar}}}}
+!! result
+<p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{echo|1=bar}}"}},"i":0}}]}'>bar</p>
+!! end
+
+###
+### Parsoid-centric tests for testing RT edge cases for pre
+###
+
+!!test
+1a. Indent-Pre and Comments
+!!input
+ a
+<!--a-->
+c
+!!result
+<pre>a
+</pre>
+<p>c
+</p>
+!!end
+
+!!test
+1b. Indent-Pre and Comments
+!!input
+ a
+ <!--a-->
+c
+!!result
+<pre>a
+</pre>
+<p>c
 </p>
 !!end
 
@@ -1248,6 +1961,20 @@ c
 </pre>
 !!end
 
+!!test
+1d. Indent-Pre and Comments
+(Pre-handler currently cannot distinguish between comment/ws order and normalizes them to [comment,ws] order)
+!!input
+<!--a--> a
+
+ <!--b-->b
+!!result
+<pre>a
+</pre>
+<pre>b
+</pre>
+!!end
+
 !!test
 2a. Indent-Pre and tables
 !!input
@@ -1307,10 +2034,12 @@ c
 !!input
  <p> foo </p>
  <div> foo </div>
+ <blockquote> foo </blockquote>
  <span> foo </span>
 !!result
  <p> foo </p>
  <div> foo </div>
+ <blockquote> foo </blockquote>
 <pre><span> foo </span>
 </pre>
 !!end
@@ -1334,6 +2063,12 @@ c
  foo
 </blockquote>
 
+<blockquote>
+<pre>
+foo
+</pre>
+</blockquote>
+
 <table><tr><td>
  foo
 </td></tr></table>
@@ -1355,7 +2090,13 @@ c
 </pre>
 </center>
 <blockquote>
- foo
+<p> foo
+</p>
+</blockquote>
+<blockquote>
+<pre>
+foo
+</pre>
 </blockquote>
 <table><tr><td>
 <pre>foo
@@ -1400,6 +2141,56 @@ b
 </pre>
 !! end
 
+!! test
+6. Pre-blocks should extend across lines with leading WS even when there is no wrappable content
+!! input
+ a
+ 
+ <!-- continue -->
+ b
+
+ c
+ 
+d
+!! result
+<pre>a
+
+b
+</pre>
+<pre>c
+
+</pre>
+<p>d
+</p>
+!! end
+
+!! test
+7a. Indent-pre and category links
+!! options
+parsoid=wt2html,wt2wt
+!! input
+ [[Category:foo]] <!-- No pre-wrapping -->
+{{echo| [[Category:foo]]}} <!-- No pre-wrapping -->
+!! result
+ <link rel="mw:WikiLink/Category" href="./Category:Foo"> <!-- No pre-wrapping -->
+<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":" [[Category:foo]]"}},"i":0}}]}'> </span>
+<link rel="mw:WikiLink/Category" href="./Category:Foo" about="#mwt1"> <!-- No pre-wrapping -->
+!! end
+
+!! test
+7b. Indent-pre and category links
+!! options
+parsoid=wt2html,wt2wt
+!! input
+ [[Category:foo]] a
+ [[Category:foo]] {{echo|b}}
+!! result
+<pre>
+<link rel="mw:WikiLink/Category" href="./Category:Foo"> a
+
+<link rel="mw:WikiLink/Category" href="./Category:Foo"> <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b"}},"i":0}}]}'>b</span></pre>
+!! end
+
 ###
 ### HTML-pre (some to spec PHP parser behavior and some Parsoid-RT-centric)
 ###
@@ -1482,8 +2273,11 @@ Simple definition
 !! input
 ; name : Definition
 !! result
-<dl><dt> name&#160;</dt><dd> Definition
-</dd></dl>
+<dl>
+<dt> name&#160;</dt>
+<dd> Definition
+</dd>
+</dl>
 
 !! end
 
@@ -1492,8 +2286,10 @@ Definition list for indentation only
 !! input
 : Indented text
 !! result
-<dl><dd> Indented text
-</dd></dl>
+<dl>
+<dd> Indented text
+</dd>
+</dl>
 
 !! end
 
@@ -1502,8 +2298,11 @@ Definition list with no space
 !! input
 ;name:Definition
 !! result
-<dl><dt>name</dt><dd>Definition
-</dd></dl>
+<dl>
+<dt>name</dt>
+<dd>Definition
+</dd>
+</dl>
 
 !!end
 
@@ -1512,8 +2311,11 @@ Definition list with URL link
 !! input
 ; http://example.com/ : definition
 !! result
-<dl><dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&#160;</dt><dd> definition
-</dd></dl>
+<dl>
+<dt> <a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&#160;</dt>
+<dd> definition
+</dd>
+</dl>
 
 !! end
 
@@ -1522,8 +2324,11 @@ Definition list with bracketed URL link
 !! input
 ;[http://www.example.com/ Example]:Something about it
 !! result
-<dl><dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt><dd>Something about it
-</dd></dl>
+<dl>
+<dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt>
+<dd>Something about it
+</dd>
+</dl>
 
 !! end
 
@@ -1532,8 +2337,11 @@ Definition list with wikilink containing colon
 !! input
 ; [[Help:FAQ]]: The least-read page on Wikipedia
 !! result
-<dl><dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt><dd> The least-read page on Wikipedia
-</dd></dl>
+<dl>
+<dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt>
+<dd> The least-read page on Wikipedia
+</dd>
+</dl>
 
 !! end
 
@@ -1543,8 +2351,11 @@ Definition list with news link containing colon
 !! input
 ;  news:alt.wikipedia.rox: This isn't even a real newsgroup!
 !! result
-<dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt><dd> This isn't even a real newsgroup!
-</dd></dl>
+<dl>
+<dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt>
+<dd> This isn't even a real newsgroup!
+</dd>
+</dl>
 
 !! end
 
@@ -1553,8 +2364,10 @@ Malformed definition list with colon
 !! input
 ;  news:alt.wikipedia.rox -- don't crash or enter an infinite loop
 !! result
-<dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
-</dt></dl>
+<dl>
+<dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
+</dt>
+</dl>
 
 !! end
 
@@ -1563,8 +2376,11 @@ Definition lists: colon in external link text
 !! input
 ; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
 !! result
-<dl><dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt><dd> OK, I made that up
-</dd></dl>
+<dl>
+<dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt>
+<dd> OK, I made that up
+</dd>
+</dl>
 
 !! end
 
@@ -1573,8 +2389,10 @@ Definition lists: colon in HTML attribute
 !! input
 ;<b style="display: inline">bold</b>
 !! result
-<dl><dt><b style="display: inline">bold</b>
-</dt></dl>
+<dl>
+<dt><b style="display: inline">bold</b>
+</dt>
+</dl>
 
 !! end
 
@@ -1583,8 +2401,11 @@ Definition lists: self-closed tag
 !! input
 ;one<br/>two : two-line fun
 !! result
-<dl><dt>one<br />two&#160;</dt><dd> two-line fun
-</dd></dl>
+<dl>
+<dt>one<br />two&#160;</dt>
+<dd> two-line fun
+</dd>
+</dl>
 
 !! end
 
@@ -1613,16 +2434,19 @@ Definition and unordered list using wiki syntax nested in unordered list using h
 <ul><li>
 ; term : description
 * unordered
-</li>
-</ul>
+</li></ul>
 !! result
 <ul><li>
-<dl><dt> term&#160;</dt><dd> description
-</dd></dl>
-<ul><li> unordered
-</li></ul>
+<dl>
+<dt> term&#160;</dt>
+<dd> description
+</dd>
+</dl>
+<ul>
+<li> unordered
 </li>
 </ul>
+</li></ul>
 
 !! end
 
@@ -1633,8 +2457,11 @@ Definition list with empty definition and following paragraph
 ; term:
 Paragraph text
 !! result
-<dl><dt> term</dt><dd>
-</dd></dl>
+<dl>
+<dt> term</dt>
+<dd>
+</dd>
+</dl>
 <p>Paragraph text
 </p>
 !! end
@@ -1663,10 +2490,14 @@ Definition Lists: No nesting: Multiple dd's
 :a
 :b
 !! result
-<dl><dt>x
-</dt><dd>a
-</dd><dd>b
-</dd></dl>
+<dl>
+<dt>x
+</dt>
+<dd>a
+</dd>
+<dd>b
+</dd>
+</dl>
 
 !! end
 
@@ -1677,12 +2508,18 @@ Definition Lists: Indentation: Regular
 ::i2
 :::i3
 !! result
-<dl><dd>i1
-<dl><dd>i2
-<dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd>i1
+<dl>
+<dd>i2
+<dl>
+<dd>i3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
 
 !! end
 
@@ -1692,11 +2529,17 @@ Definition Lists: Indentation: Missing 1st level
 ::i2
 :::i3
 !! result
-<dl><dd><dl><dd>i2
-<dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd><dl>
+<dd>i2
+<dl>
+<dd>i3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
 
 !! end
 
@@ -1705,10 +2548,16 @@ Definition Lists: Indentation: Multi-level indent
 !! input
 :::i3
 !! result
-<dl><dd><dl><dd><dl><dd>i3
-</dd></dl>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd><dl>
+<dd><dl>
+<dd>i3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
 
 !! end
 
@@ -1732,6 +2581,21 @@ should be left alone
 should be left alone
 </p>
 !! end
+
+# Bug 52473
+!! test
+Definition Lists: Hacky use to indent tables (WS-insensitive)
+!! options
+parsoid
+!! input
+: {|
+|a
+|} 
+!! result
+<dl>
+<dd> <table><tr><td>a</td></tr></table> </dd>
+</dl>
+!! end
 ## The PHP parser treats : items (dd) without a corresponding ; item (dt)
 ## as an empty dt item.  It also ignores all but the last ";" when followed
 ## by ":" later on.  So, ";" are not ignored in ";;;t3" but are ignored  in
@@ -1783,13 +2647,17 @@ Table / list interaction: indented table with lists in table contents
 
 <tr>
 <td> a
-<ul><li> b
-</li></ul>
+<ul>
+<li> b
+</li>
+</ul>
 </td></tr>
 <tr>
 <td> c
-<ul><li> d
-</li></ul>
+<ul>
+<li> d
+</li>
+</ul>
 </td></tr></table></dd></dl>
 
 !! end
@@ -1812,18 +2680,27 @@ Table / list interaction: lists nested in tables nested in indented lists
 <dl><dd><table>
 <tr>
 <td>
-<dl><dd>a
-</dd><dd>b
-</dd></dl>
+<dl>
+<dd>a
+</dd>
+<dd>b
+</dd>
+</dl>
 </td>
 <td>
-<ul><li>c
-</li><li>d
-</li></ul>
+<ul>
+<li>c
+</li>
+<li>d
+</li>
+</ul>
 </td></tr></table></dd></dl>
-<ul><li>e
-</li><li>f
-</li></ul>
+<ul>
+<li>e
+</li>
+<li>f
+</li>
+</ul>
 
 !!end
 
@@ -1911,43 +2788,91 @@ Definition Lists: Nesting: Test 4
 ::;t3
 :::d3
 !! result
-<dl><dd><dl><dd><dl><dt>t3
-</dt><dd>d3
-</dd></dl>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd><dl>
+<dd><dl>
+<dt>t3
+</dt>
+<dd>d3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
 
 !! end
 
 
+## The Parsoid team believes the following three test exposes a
+## bug in the PHP parser.  (Parsoid team thinks the PHP parser is
+## wrong to close the <dl> after the <dt> containing the <ul>.)
 !! test
-Definition Lists: Mixed Lists: Test 1
+Definition Lists: Mixed Lists: Test 1 (php)
+!! options
+php
 !! input
 :;* foo
 ::* bar
 :; baz
 !! result
-<dl><dd><dl><dt><ul><li> foo
-</li><li> bar
-</li></ul>
-</dt></dl>
-<dl><dt> baz
-</dt></dl>
-</dd></dl>
-
-!! end
-
-
+<dl>
+<dd><dl>
+<dt><ul>
+<li> foo
+</li>
+<li> bar
+</li>
+</ul>
+</dt>
+</dl>
+<dl>
+<dt> baz
+</dt>
+</dl>
+</dd>
+</dl>
+
+!! end
+!! test
+Definition Lists: Mixed Lists: Test 1 (parsoid)
+!! options
+parsoid
+!! input
+:;* foo
+::* bar
+:; baz
+!! result
+<dl>
+<dd><dl>
+<dt><ul>
+<li> foo
+</li>
+</ul></dt>
+<dd><ul>
+<li> bar
+</li>
+</ul></dd>
+<dt> baz</dt>
+</dl></dd>
+</dl>
+!! end
+
 !! test
 Definition Lists: Mixed Lists: Test 2
 !! input
 *: d1
 *: d2
 !! result
-<ul><li><dl><dd> d1
-</dd><dd> d2
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dd> d1
+</dd>
+<dd> d2
+</dd>
+</dl>
+</li>
+</ul>
 
 !! end
 
@@ -1958,12 +2883,21 @@ Definition Lists: Mixed Lists: Test 3
 *::: d1
 *::: d2
 !! result
-<ul><li><dl><dd><dl><dd><dl><dd> d1
-</dd><dd> d2
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dd><dl>
+<dd><dl>
+<dd> d1
+</dd>
+<dd> d2
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
 
 !! end
 
@@ -1974,10 +2908,17 @@ Definition Lists: Mixed Lists: Test 4
 *;d1 :d2
 *;d3 :d4
 !! result
-<ul><li><dl><dt>d1&#160;</dt><dd>d2
-</dd><dt>d3&#160;</dt><dd>d4
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dt>d1&#160;</dt>
+<dd>d2
+</dd>
+<dt>d3&#160;</dt>
+<dd>d4
+</dd>
+</dl>
+</li>
+</ul>
 
 !! end
 
@@ -1988,11 +2929,17 @@ Definition Lists: Mixed Lists: Test 5
 *:d1
 *:: d2
 !! result
-<ul><li><dl><dd>d1
-<dl><dd> d2
-</dd></dl>
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dd>d1
+<dl>
+<dd> d2
+</dd>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
 
 !! end
 
@@ -2003,13 +2950,23 @@ Definition Lists: Mixed Lists: Test 6
 #*:d1
 #*::: d3
 !! result
-<ol><li><ul><li><dl><dd>d1
-<dl><dd><dl><dd> d3
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
-</li></ol>
+<ol>
+<li><ul>
+<li><dl>
+<dd>d1
+<dl>
+<dd><dl>
+<dd> d3
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
+</li>
+</ol>
 
 !! end
 
@@ -2020,10 +2977,15 @@ Definition Lists: Mixed Lists: Test 7
 :* d1
 :* d2
 !! result
-<dl><dd><ul><li> d1
-</li><li> d2
-</li></ul>
-</dd></dl>
+<dl>
+<dd><ul>
+<li> d1
+</li>
+<li> d2
+</li>
+</ul>
+</dd>
+</dl>
 
 !! end
 
@@ -2034,12 +2996,20 @@ Definition Lists: Mixed Lists: Test 8
 :* d1
 ::* d2
 !! result
-<dl><dd><ul><li> d1
-</li></ul>
-<dl><dd><ul><li> d2
-</li></ul>
-</dd></dl>
-</dd></dl>
+<dl>
+<dd><ul>
+<li> d1
+</li>
+</ul>
+<dl>
+<dd><ul>
+<li> d2
+</li>
+</ul>
+</dd>
+</dl>
+</dd>
+</dl>
 
 !! end
 
@@ -2049,9 +3019,14 @@ Definition Lists: Mixed Lists: Test 9
 !! input
 *;foo :bar
 !! result
-<ul><li><dl><dt>foo&#160;</dt><dd>bar
-</dd></dl>
-</li></ul>
+<ul>
+<li><dl>
+<dt>foo&#160;</dt>
+<dd>bar
+</dd>
+</dl>
+</li>
+</ul>
 
 !! end
 
@@ -2061,50 +3036,171 @@ Definition Lists: Mixed Lists: Test 10
 !! input
 *#;foo :bar
 !! result
-<ul><li><ol><li><dl><dt>foo&#160;</dt><dd>bar
-</dd></dl>
-</li></ol>
-</li></ul>
+<ul>
+<li><ol>
+<li><dl>
+<dt>foo&#160;</dt>
+<dd>bar
+</dd>
+</dl>
+</li>
+</ol>
+</li>
+</ul>
 
 !! end
 
+# The Parsoid team disagrees with the PHP parser's seemingly-random
+# rules regarding dd/dt on the next two tests.  Parsoid is more
+# consistent, and recognizes the shared nesting and keeps the
+# still-open tags around until the nesting is complete.
 
 !! test
-Definition Lists: Mixed Lists: Test 11
+Definition Lists: Mixed Lists: Test 11 (php)
+!! options
+php
 !! input
 *#*#;*;;foo :bar
 *#*#;boo :baz
 !! result
-<ul><li><ol><li><ul><li><ol><li><dl><dt>foo&#160;</dt><dd><ul><li><dl><dt><dl><dt>bar
-</dt></dl>
-</dd></dl>
-</li></ul>
-</dd></dl>
-<dl><dt>boo&#160;</dt><dd>baz
-</dd></dl>
-</li></ol>
-</li></ul>
-</li></ol>
-</li></ul>
+<ul>
+<li><ol>
+<li><ul>
+<li><ol>
+<li><dl>
+<dt>foo&#160;</dt>
+<dd><ul>
+<li><dl>
+<dt><dl>
+<dt>bar
+</dt>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
+</dd>
+</dl>
+<dl>
+<dt>boo&#160;</dt>
+<dd>baz
+</dd>
+</dl>
+</li>
+</ol>
+</li>
+</ul>
+</li>
+</ol>
+</li>
+</ul>
 
 !! end
+!! test
+Definition Lists: Mixed Lists: Test 11 (parsoid)
+!! options
+parsoid
+!! input
+*#*#;*;;foo :bar
+*#*#;boo :baz
+!! result
+<ul>
+<li>
+<ol>
+<li>
+<ul>
+<li>
+<ol>
+<li>
+<dl>
+<dt>
+<ul>
+<li>
+<dl>
+<dt>
+<dl>
+<dt>foo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'>&nbsp;</span></dt>
+<dd data-parsoid='{"stx":"row"}'>bar</dd>
+</dl></dt>
+</dl></li>
+</ul></dt>
+<dt>boo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'>&nbsp;</span></dt>
+<dd data-parsoid='{"stx":"row"}'>baz</dd>
+</dl></li>
+</ol></li>
+</ul></li>
+</ol></li>
+</ul>
+!! end
 
 
 !! test
-Definition Lists: Weird Ones: Test 1
+Definition Lists: Weird Ones: Test 1 (php)
+!! options
+php
 !! input
 *#;*::;; foo : bar (who uses this?)
 !! result
-<ul><li><ol><li><dl><dt> foo&#160;</dt><dd><ul><li><dl><dd><dl><dd><dl><dt><dl><dt> bar (who uses this?)
-</dt></dl>
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
-</dd></dl>
-</li></ol>
-</li></ul>
+<ul>
+<li><ol>
+<li><dl>
+<dt> foo&#160;</dt>
+<dd><ul>
+<li><dl>
+<dd><dl>
+<dd><dl>
+<dt><dl>
+<dt> bar (who uses this?)
+</dt>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+</dd>
+</dl>
+</li>
+</ul>
+</dd>
+</dl>
+</li>
+</ol>
+</li>
+</ul>
 
+!! end
+!! test
+Definition Lists: Weird Ones: Test 1 (parsoid)
+!! options
+parsoid
+!! input
+*#;*::;; foo : bar (who uses this?)
+!! result
+<ul>
+<li>
+<ol>
+<li>
+<dl>
+<dt>
+<ul>
+<li>
+<dl>
+<dd>
+<dl>
+<dd>
+<dl>
+<dt>
+<dl>
+<dt> foo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'>&nbsp;</span></dt>
+<dd data-parsoid='{"stx":"row"}'> bar (who uses this?)</dd>
+</dl></dt>
+</dl></dd>
+</dl></dd>
+</dl></li>
+</ul></dt>
+</dl></li>
+</ol></li>
+</ul>
 !! end
 
 ###
@@ -2269,6 +3365,17 @@ External image from https: https://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
 </p>
 !! end
 
+!! test
+External image (when not allowed)
+!! options
+wgAllowExternalImages=0
+!! input
+External image: http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png
+!! result
+<p>External image: <a rel="nofollow" class="external free" href="http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png">http://meta.wikimedia.org/upload/f/f1/Ncwikicol.png</a>
+</p>
+!! end
+
 !! test
 Link to non-http image, no img tag
 !! input
@@ -2691,6 +3798,15 @@ External link containing double-single-quotes with no space separating the url f
 </p>
 !! end
 
+!! test
+External link with comments in link text
+!! input
+[http://www.google.com Google <!-- comment -->]
+!! result
+<p><a rel="nofollow" class="external text" href="http://www.google.com">Google </a>
+</p>
+!! end
+
 !! test
 URL-encoding in URL functions (single parameter)
 !! input
@@ -2763,6 +3879,28 @@ Non-extlinks in brackets
 </p>
 !! end
 
+!! test
+Parsoid: Percent encoding in external links
+!! options
+parsoid
+!! input
+[https://github.com/search?l=&q=ResourceLoader+%40wikimedia Search]
+!! result
+<p><a rel="mw:ExtLink"
+href="https://github.com/search?l=&amp;q=ResourceLoader+%40wikimedia">Search</a></p>
+!! end
+
+!! test
+Parsoid: use url link syntax for links where the content is equal the link
+target
+!! options
+parsoid
+!! input
+http://example.com
+!! result
+<p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a></p>
+!! end
+
 ###
 ### Quotes
 ###
@@ -2781,7 +3919,9 @@ Normal text. '''''Bold italic text.''''' Normal text.
 
 
 !! test
-Unclosed and unmatched quotes
+Unclosed and unmatched quotes (php)
+!! options
+php
 !! input
 '''''Bold italic text '''with bold deactivated''' in between.'''''
 
@@ -2816,6 +3956,47 @@ Plain ''italic'''s plain
 </p><p>Plain <i>italic'</i>s plain
 </p>
 !! end
+# Parsoid inserts an empty bold tag pair at the end of the line, that the PHP
+# parser strips. The wikitext contains just the first half of the bold
+# quote pair.
+!! test
+Unclosed and unmatched quotes (parsoid)
+!! options
+parsoid
+!! input
+'''''Bold italic text '''with bold deactivated''' in between.'''''
+
+'''''Bold italic text ''with italic deactivated'' in between.'''''
+
+'''Bold text..
+
+..spanning two paragraphs (should not work).'''
+
+'''Bold tag left open
+
+''Italic tag left open
+
+Normal text.
+
+<!-- Unmatching number of opening, closing tags: -->
+'''This year''''s election ''should'' beat '''last year''''s.
+
+''Tom'''s car is bigger than ''Susan'''s.
+
+Plain ''italic'''s plain
+!! result
+<p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i>
+</p><p><b><i>Bold italic text </i>with italic deactivated<i> in between.</i></b>
+</p><p><b>Bold text..</b>
+</p><p>..spanning two paragraphs (should not work).<b></b>
+</p><p><b>Bold tag left open</b>
+</p><p><i>Italic tag left open</i>
+</p><p>Normal text.
+</p><p><b>This year'</b>s election <i>should</i> beat <b>last year'</b>s.
+</p><p><i>Tom<b>s car is bigger than </b></i><b>Susan</b>s.
+</p><p>Plain <i>italic'</i>s plain
+</p>
+!! end
 
 ###
 ### Tables
@@ -2824,19 +4005,33 @@ Plain ''italic'''s plain
 ###
 
 # This should not produce <table></table> as <table><tr><td></td></tr></table>
-# is the bare minimun required by the spec, see:
+# is the bare minimum required by the spec, see:
 # http://www.w3.org/TR/xhtml-modularization/dtd_module_defs.html#a_module_Basic_Tables
 !! test
-A table with no data.
+A table with no data. (php)
+!! options
+php
+!! input
+{||}
+!! result
+!! end
+# Parsoid team replies: empty table tags are legal in HTML5
+!! test
+A table with no data. (parsoid)
+!! options
+parsoid
 !! input
 {||}
 !! result
+<table></table>
 !! end
 
 # A table with nothing but a caption is invalid XHTML, we might want to render
 # this as <p>caption</p>
 !! test
-A table with nothing but a caption
+A table with nothing but a caption (php)
+!! options
+php
 !! input
 {|
 |+ caption
@@ -2847,13 +4042,25 @@ A table with nothing but a caption
 </caption><tr><td></td></tr></table>
 
 !! end
-
+# Parsoid team replies: table with only a caption is legal in HTML5
 !! test
-A table with caption with default-spaced attributes and a table row
+A table with nothing but a caption (parsoid)
+!! options
+parsoid
 !! input
 {|
-|+ style="color: red;" | caption1
-|-
+|+ caption
+|}
+!! result
+<table><caption> caption</caption></table>
+!! end
+
+!! test
+A table with caption with default-spaced attributes and a table row
+!! input
+{|
+|+ style="color: red;" | caption1
+|-
 | foo
 |}
 !! result
@@ -3243,11 +4450,44 @@ Template-generated table cell attributes and cell content
 !! input
 {|
 |{{table_attribs}}
+| {{table_attribs}}
 |}
 !! result
 <table>
 <tr>
 <td style="color: red"> Foo
+</td>
+<td style="color: red"> Foo
+</td></tr></table>
+
+!! end
+
+!! test
+Template-generated table cell attributes and cell content (2)
+!! input
+{|
+|align=center {{table_attribs}}
+|}
+!! result
+<table>
+<tr>
+<td align="center" style="color: red"> Foo
+</td></tr></table>
+
+!! end
+
+!! test
+Template-generated table cell attributes and cell content (3)
+!! input
+{|
+|align=center {{table_cells}}
+|}
+!! result
+<table>
+<tr>
+<td align="center" style="color: red"> Foo </td>
+<td> Bar </td>
+<td> Baz
 </td></tr></table>
 
 !! end
@@ -3270,21 +4510,40 @@ Table with row followed by newlines and table heading
 
 !! end
 
+!! test
+Table with empty line following the start tag
+!! input
+{|
+
+|-
+| foo
+|}
+!! result
+<table>
+
+
+<tr>
+<td> foo
+</td></tr></table>
+
+!! end
+
 # FIXME: Preserve the attribute properly (with an empty string as value) in
 # the PHP parser. Parsoid implements the behavior below.
 !! test
 Table attributes with empty value
 !! options
-disabled
+parsoid
 !! input
 {|
 | style=| hello
 |}
 !! result
 <table>
+<tbody>
 <tr>
 <td style=""> hello
-</td></tr></table>
+</td></tr></tbody></table>
 
 !! end
 
@@ -3311,6 +4570,159 @@ Wikitext table with a lot of comments
 
 !! end
 
+!! test
+Wikitext table with double-line table cell
+!! input
+{|
+|a
+b
+|}
+!! result
+<table>
+<tr>
+<td>a
+<p>b
+</p>
+</td></tr></table>
+
+!! end
+
+!! test
+Table cell with a single comment
+!! input
+{|
+| <!-- c1 -->
+| a
+|}
+!! result
+<table>
+<tr>
+<td>
+</td>
+<td> a
+</td></tr></table>
+
+!! end
+
+# The expected HTML structure in this test is debatable. The PHP parser does
+# not parse this kind of table at all. The main focus for Parsoid is on
+# round-tripping, so this output is ok for now. TODO: revisit!
+!! test
+Wikitext table with html-syntax row (Parsoid)
+!! options
+parsoid
+!! input
+{|
+|-
+<td>foo</td>
+|}
+!! result
+<table>
+<tbody>
+<tr>
+<td>foo</td></tr></tbody></table>
+!! end
+
+!! test
+Implicit <td> after a |-
+(PHP parser relies on Tidy to add the missing <td> tags)
+!! options
+parsoid=wt2html,wt2wt
+!! input
+{|
+|-
+a
+|}
+!! result
+<table>
+<tr><td>a</td></tr>
+</table>
+!! end
+
+!! test
+Pres should be recognized in an explicit <td> context, but not in an implicit <td> context
+(PHP parser relies on Tidy to add the missing <td> tags)
+!! options
+parsoid=wt2html,wt2wt
+!! input
+{|
+|-
+|
+ a
+|-
+ b
+|}
+!! result
+<table>
+<tbody>
+<tr><td><pre>a</pre></td></tr>
+<tr><td> b</td></tr>
+</tbody>
+</table>
+!! end
+
+!! test
+Lists should be recognized in an implicit <td> context
+(PHP parser relies on Tidy to add the missing <td> tags)
+!! options
+parsoid=wt2html,wt2wt
+!! input
+{|
+|-
+*a
+|}
+!! result
+<table>
+<tr>
+<td><ul>
+<li>a</li>
+</ul></td>
+</tr>
+</table>
+!! end
+
+!! test
+Parsoid: Round-trip tables directly followed by content (bug 51219)
+!! options
+parsoid=wt2html,wt2wt
+!! input
+{|
+|foo
+|} bar
+
+{|
+|baz
+|}<b>quux</b>
+!! result
+<table><tbody>
+<tr>
+<td>foo</td></tr></tbody></table> bar
+<table>
+<tbody>
+<tr>
+<td>baz</td></tr></tbody></table><b>quux</b>
+!! end
+
+!! test
+Parsoid: Default to a newline after tables in new content (bug 51219)
+!! options
+parsoid=html2wt
+!! input
+{|
+|foo
+|}
+<nowiki> </nowiki>bar
+{|
+|baz
+|}
+'''quux'''
+!! result
+<table><tbody>
+<tr><td>foo</td></tr></tbody></table> bar
+<table><tbody>
+<tr><td>baz</td></tr></tbody></table><b>quux</b>
+!! end
+
 ###
 ### Internal links
 ###
@@ -3341,6 +4753,15 @@ Piped link
 </p>
 !! end
 
+!! test
+Piped link with comment in link text
+!! input
+[[Main Page|The Main<!--front--> Page]]
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">The Main Page</a>
+</p>
+!! end
+
 !! test
 Broken link
 !! input
@@ -3462,6 +4883,22 @@ Link to namespaces
 </p>
 !! end
 
+!! article
+MemoryAlpha:AlphaTest
+!! text
+This is an article in the MemoryAlpha namespace
+(which shadows the memoryalpha interwiki link).
+!! endarticle
+
+!! test
+Namespace takes precedence over interwiki link (bug 51680)
+!! input
+[[MemoryAlpha:AlphaTest]]
+!! result
+<p><a href="/wiki/MemoryAlpha:AlphaTest" title="MemoryAlpha:AlphaTest">MemoryAlpha:AlphaTest</a>
+</p>
+!! end
+
 !! test
 Piped link to namespace
 !! input
@@ -3526,6 +4963,33 @@ Link containing "<#" and ">#" as a hex sequences
 </p>
 !! end
 
+!! test
+Link containing an equals sign
+!! input
+[[Special:BookSources/isbn=4-00-026157-6]]
+!! result
+<p><a href="/wiki/Special:BookSources/isbn%3D4-00-026157-6" title="Special:BookSources/isbn=4-00-026157-6">Special:BookSources/isbn=4-00-026157-6</a>
+</p>
+!! end
+
+!! article
+Foo~bar
+!! text
+Just a test of an article title containing a tilde.
+!! endarticle
+
+# note that links containing signatures, like [[Foo~~~~]], are
+# massaged by the pre-save transform (PST) and so the tildes are never
+# seen by the parser.
+!! test
+Link containing a tilde
+!! input
+[[Foo~bar]]
+!! result
+<p><a href="/wiki/Foo%7Ebar" title="Foo~bar">Foo~bar</a>
+</p>
+!! end
+
 !! test
 Link containing double-single-quotes '' (bug 4598)
 !! input
@@ -3787,6 +5251,69 @@ language=kaa
 </p>
 !! end
 
+!! article
+Söfnuður
+!! text
+Test.
+!! endarticle
+
+!! test
+Internal link with is link prefix
+!! options
+language=is
+!! input
+Aðrir mótmælenda[[söfnuður|söfnuðir]] og
+!! result
+<p>Aðrir <a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðir</a> og
+</p>
+!! end
+
+!! article
+Mótmælendatrú
+!! text
+Test.
+!! endarticle
+
+!! test
+Internal link with is link trail and link prefix
+!! options
+language=is
+!! input
+[[mótmælendatrú|xxx]]ar
+[[mótmælendatrú]]ar
+mótmælenda[[söfnuður]]
+mótmælenda[[söfnuður|söfnuðir]]
+mótmælenda[[söfnuður|söfnuðir]]xxx
+!! result
+<p><a href="/wiki/M%C3%B3tm%C3%A6lendatr%C3%BA" title="Mótmælendatrú">xxxar</a>
+<a href="/wiki/M%C3%B3tm%C3%A6lendatr%C3%BA" title="Mótmælendatrú">mótmælendatrúar</a>
+<a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuður</a>
+<a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðir</a>
+<a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðirxxx</a>
+</p>
+!! end
+
+!! test
+Parsoid link trail escaping
+!! options
+parsoid=html2wt,html2html
+!! input
+[[apple]]<nowiki/>s
+!! result
+<p><a rel="mw:WikiLink" href="Apple">apple</a>s</p>
+!! end
+
+!! test
+Parsoid link prefix escaping
+!! options
+language=is
+parsoid=html2wt,html2html
+!! input
+Aðrir mótmælenda<nowiki/>[[söfnuður]]
+!! result
+<p>Aðrir mótmælenda<a rel="mw:WikiLink" href="Söfnuður">söfnuður</a></p>
+!! end
+
 !! test
 Parsoid-centric test: Whitespace in ext- and wiki-links should be preserved
 !! input
@@ -3833,9 +5360,12 @@ Interwiki link encoding conversion (bug 1636)
 *[[Wikipedia:ro:Olteni&#0355;a]]
 *[[Wikipedia:ro:Olteni&#355;a]]
 !! result
-<ul><li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
-</li><li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
-</li></ul>
+<ul>
+<li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
+</li>
+<li><a href="http://en.wikipedia.org/wiki/ro:Olteni%C5%A3a" class="extiw" title="wikipedia:ro:Olteniţa">Wikipedia:ro:Olteni&#355;a</a>
+</li>
+</ul>
 
 !! end
 
@@ -3848,6 +5378,12 @@ Interwiki link with fragment (bug 2130)
 </p>
 !! end
 
+
+###
+### Interlanguage links
+### Language links (so that searching for '### language' matches..)
+###
+
 !! test
 Interlanguage link
 !! input
@@ -3905,21 +5441,206 @@ language=ln
 </p>
 !! end
 
-##
-## XHTML tidiness
-###
-
 !! test
-<br> to <br />
+Parsoid bug 53221: Wikilinks should be properly entity-escaped
+!! options
+parsoid=html2wt
 !! input
-1<br>2<br />3
-!! result
-<p>1<br />2<br />3
-</p>
+He&amp;nbsp;llo [[Foo|He&amp;nbsp;llo]]
+
+He&amp;nbsp;llo [[He&amp;nbsp;llo]]
+!!result
+<p>He&amp;nbsp;llo <a href="Foo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
+<p>He&amp;nbsp;llo <a href="He&amp;nbsp;llo" rel="mw:WikiLink">He&amp;nbsp;llo</a></p>
 !! end
 
 !! test
-Broken br tag sanitization
+Parsoid: handle constructor well
+!! options
+parsoid
+!! input
+[[constructor]]
+
+[[constructor:foo]]
+!! result
+<p data-parsoid="{&quot;dsr&quot;:[0,15,0,0]}"><a rel="mw:WikiLink" href="./Constructor" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Constructor&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor&quot;},&quot;dsr&quot;:[0,15,2,2]}">constructor</a></p>
+
+
+<p data-parsoid="{&quot;dsr&quot;:[17,36,0,0]}"><a rel="mw:WikiLink" href="./Foo" data-parsoid="{&quot;stx&quot;:&quot;simple&quot;,&quot;a&quot;:{&quot;href&quot;:&quot;./Foo&quot;},&quot;sa&quot;:{&quot;href&quot;:&quot;constructor:foo&quot;},&quot;dsr&quot;:[17,36,2,2]}">constructor:foo</a></p>
+!! end
+
+!! test
+Parsoid: recognize interlanguage links without a target page
+!! options
+parsoid
+!! input
+[[ko:]]
+!! result
+<p>
+<link rel="mw:WikiLink/Language" href="http://ko.wikipedia.org/wiki/"></p>
+!! end
+
+!! test
+Parsoid: recognize interwiki links without a target page
+!! options
+parsoid
+!! input
+[[:ko:]]
+!! result
+<p><a rel="mw:WikiLink/Interwiki" href="http://ko.wikipedia.org/wiki/">ko:</a></p>
+!! end
+
+###
+### Redirects, Parsoid-only
+###
+!! test
+Simple redirect to page
+!! options
+parsoid
+!! input
+#REDIRECT [[Main Page]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! end
+
+!! test
+Optional colon in #REDIRECT
+!! options
+# the colon is archaic syntax.  we support it for wt2html, but we
+# don't care that it roundtrips back to the modern syntax.
+parsoid=wt2html,html2html
+!! input
+#REDIRECT:[[Main Page]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! end
+
+!! test
+Whitespace in #REDIRECT with optional colon
+!! options
+# the colon and gratuitous whitespace is archaic syntax.  we support
+# it for wt2html, but we don't care that it roundtrips back to the
+# modern syntax (without extra whitespace)
+parsoid=wt2html,html2html
+!! input
+ 
+ #REDIRECT 
+: 
+[[Main Page]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! end
+
+!! test
+Piped link in #REDIRECT
+!! options
+# content after piped link is ignored.  we support this syntax,
+# but don't care that the piped link is lost when we roundtrip this.
+parsoid=wt2html
+!! input
+#REDIRECT [[Main Page|bar]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! end
+
+!! test
+Redirect to category
+!! options
+parsoid=wt2html
+!! input
+#REDIRECT [[Category:Foo]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Category:Foo"><link rel="mw:WikiLink/Category" href="./Category:Foo">
+!! end
+
+!! test
+Redirect to category with URL encoding
+!! options
+parsoid=wt2html
+!! input
+#REDIRECT [[Category%3AFoo]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Category:Foo"><link rel="mw:WikiLink/Category" href="./Category:Foo">
+!! end
+
+!! test
+Redirect to category page
+!! options
+parsoid=wt2html,html2html
+!! input
+#REDIRECT [[:Category:Foo]]
+!! result
+<p><a rel="mw:WikiLink" href="Category:Foo">Category:Foo</a></p>
+!! end
+
+!! test
+Redirect to image page (1)
+!! options
+parsoid
+!! input
+#REDIRECT [[File:Wiki.png]]
+!! result
+<link rel="mw:PageProp/redirect" href="./File:Wiki.png">
+!! end
+
+!! test
+Redirect to image page (2)
+!! options
+parsoid
+!! input
+#REDIRECT [[Image:Wiki.png]]
+!! result
+<link rel="mw:PageProp/redirect" href="./File:Wiki.png">
+!! end
+
+!! test
+Redirect to language
+!! options
+parsoid
+!! input
+#REDIRECT [[en:File:Wiki.png]]
+!! result
+<link rel="mw:PageProp/redirect" href="File:Wiki.png">
+!! end
+
+!! test
+Redirect to interwiki
+!! options
+parsoid
+!! input
+#REDIRECT [[meatball:File:Wiki.png]]
+!! result
+<link rel="mw:PageProp/redirect" href="File:Wiki.png">
+!! end
+
+!! test
+Non-English #REDIRECT
+!! options
+parsoid
+language=is
+!! input
+#TILVÍSUN [[Main Page]]
+!! result
+<link rel="mw:PageProp/redirect" href="./Main_Page">
+!! end
+
+##
+## XHTML tidiness
+###
+
+!! test
+<br> to <br />
+!! input
+1<br>2<br />3
+!! result
+<p>1<br />2<br />3
+</p>
+!! end
+
+!! test
+Broken br tag sanitization
+!! options
+php
 !! input
 </br>
 !! result
@@ -3927,6 +5648,17 @@ Broken br tag sanitization
 </p>
 !! end
 
+# TODO: Fix html2html mode (bug 51055)!
+!! test
+Parsoid: Broken br tag recognition
+!! options
+parsoid=wt2html
+!! input
+</br>
+!! result
+<p><br></p>
+!! end
+
 !! test
 Incorrecly removing closing slashes from correctly formed XHTML
 !! input
@@ -4023,7 +5755,7 @@ Horizontal ruler -- eats additional dashes on the same line
 !! end
 
 !! test
-Horizontal ruler -- does not collaps dashes on consecutive lines
+Horizontal ruler -- does not collapse dashes on consecutive lines
 !! input
 ----
 ----
@@ -4061,10 +5793,14 @@ Common list
 * item 2
 *item 3
 !! result
-<ul><li>Common list
-</li><li> item 2
-</li><li>item 3
-</li></ul>
+<ul>
+<li>Common list
+</li>
+<li> item 2
+</li>
+<li>item 3
+</li>
+</ul>
 
 !! end
 
@@ -4075,10 +5811,14 @@ Numbered list
 #item 2
 # item 3
 !! result
-<ol><li>Numbered list
-</li><li>item 2
-</li><li> item 3
-</li></ol>
+<ol>
+<li>Numbered list
+</li>
+<li>item 2
+</li>
+<li> item 3
+</li>
+</ol>
 
 !! end
 
@@ -4101,35 +5841,67 @@ Mixed list
 *** Level 3
 #** Level 3, but ordered
 !! result
-<ul><li>Mixed list
-<ol><li> with numbers
-</li></ol>
-<ul><li> and bullets
-</li></ul>
-<ol><li> and numbers
-</li></ol>
-</li><li>bullets again
-<ul><li>bullet level 2
-<ul><li>bullet level 3
-<ol><li>Number on level 4
-</li></ol>
-</li></ul>
-</li><li>bullet level 2
-<ol><li>Number on level 3
-</li><li>Number on level 3
-</li></ol>
-</li></ul>
-<ol><li>number level 2
-</li></ol>
-</li><li>Level 1
-<ul><li><ul><li> Level 3
-</li></ul>
-</li></ul>
-</li></ul>
-<ol><li><ul><li><ul><li> Level 3, but ordered
-</li></ul>
-</li></ul>
-</li></ol>
+<ul>
+<li>Mixed list
+<ol>
+<li> with numbers
+</li>
+</ol>
+<ul>
+<li> and bullets
+</li>
+</ul>
+<ol>
+<li> and numbers
+</li>
+</ol>
+</li>
+<li>bullets again
+<ul>
+<li>bullet level 2
+<ul>
+<li>bullet level 3
+<ol>
+<li>Number on level 4
+</li>
+</ol>
+</li>
+</ul>
+</li>
+<li>bullet level 2
+<ol>
+<li>Number on level 3
+</li>
+<li>Number on level 3
+</li>
+</ol>
+</li>
+</ul>
+<ol>
+<li>number level 2
+</li>
+</ol>
+</li>
+<li>Level 1
+<ul>
+<li><ul>
+<li> Level 3
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<ol>
+<li><ul>
+<li><ul>
+<li> Level 3, but ordered
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ol>
 
 !! end
 
@@ -4139,10 +5911,14 @@ Nested lists 1
 *foo
 **bar
 !! result
-<ul><li>foo
-<ul><li>bar
-</li></ul>
-</li></ul>
+<ul>
+<li>foo
+<ul>
+<li>bar
+</li>
+</ul>
+</li>
+</ul>
 
 !! end
 
@@ -4152,10 +5928,15 @@ Nested lists 2
 **foo
 *bar
 !! result
-<ul><li><ul><li>foo
-</li></ul>
-</li><li>bar
-</li></ul>
+<ul>
+<li><ul>
+<li>foo
+</li>
+</ul>
+</li>
+<li>bar
+</li>
+</ul>
 
 !! end
 
@@ -4165,10 +5946,14 @@ Nested lists 3 (first element empty)
 *
 **bar
 !! result
-<ul><li>
-<ul><li>bar
-</li></ul>
-</li></ul>
+<ul>
+<li>
+<ul>
+<li>bar
+</li>
+</ul>
+</li>
+</ul>
 
 !! end
 
@@ -4178,10 +5963,15 @@ Nested lists 4 (first element empty)
 **
 *bar
 !! result
-<ul><li><ul><li>
-</li></ul>
-</li><li>bar
-</li></ul>
+<ul>
+<li><ul>
+<li>
+</li>
+</ul>
+</li>
+<li>bar
+</li>
+</ul>
 
 !! end
 
@@ -4191,10 +5981,15 @@ Nested lists 5 (both elements empty)
 **
 *
 !! result
-<ul><li><ul><li>
-</li></ul>
-</li><li>
-</li></ul>
+<ul>
+<li><ul>
+<li>
+</li>
+</ul>
+</li>
+<li>
+</li>
+</ul>
 
 !! end
 
@@ -4204,10 +5999,14 @@ Nested lists 6 (both elements empty)
 *
 **
 !! result
-<ul><li>
-<ul><li>
-</li></ul>
-</li></ul>
+<ul>
+<li>
+<ul>
+<li>
+</li>
+</ul>
+</li>
+</ul>
 
 !! end
 
@@ -4216,10 +6015,16 @@ Nested lists 7 (skip initial nesting levels)
 !! input
 *** foo
 !! result
-<ul><li><ul><li><ul><li> foo
-</li></ul>
-</li></ul>
-</li></ul>
+<ul>
+<li><ul>
+<li><ul>
+<li> foo
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
 
 !! end
 
@@ -4231,16 +6036,24 @@ Nested lists 8 (multiple nesting transitions)
 ** baz
 * boo
 !! result
-<ul><li> foo
-<ul><li><ul><li> bar
-</li></ul>
-</li><li> baz
-</li></ul>
-</li><li> boo
-</li></ul>
-
-!! end
-
+<ul>
+<li> foo
+<ul>
+<li><ul>
+<li> bar
+</li>
+</ul>
+</li>
+<li> baz
+</li>
+</ul>
+</li>
+<li> boo
+</li>
+</ul>
+
+!! end
+
 !! test
 1. Lists with start-of-line-transparent tokens before bullets: Comments
 !! input
@@ -4248,10 +6061,14 @@ Nested lists 8 (multiple nesting transitions)
 *<!--cmt-->bar
 <!--cmt-->*baz
 !! result
-<ul><li>foo
-</li><li>bar
-</li><li>baz
-</li></ul>
+<ul>
+<li>foo
+</li>
+<li>bar
+</li>
+<li>baz
+</li>
+</ul>
 
 !! end
 
@@ -4261,78 +6078,14 @@ Nested lists 8 (multiple nesting transitions)
 *foo {{echo|bar
 }}*baz
 !! result
-<ul><li>foo bar
-</li><li>baz
-</li></ul>
-
-!! end
-
-!! test
-Unbalanced closing block tags break a list
-(Disabled since php parser generates broken html -- relies on Tidy to fix up)
-!! options
-disabled
-!! input
-<div>
-*a</div><div>
-*b</div>
-!! result
-<div>
-<ul><li>a
-</li></ul></div><div>
-<ul><li>b
-</li></ul></div>
-!! end
-
-!! test
-Unbalanced closing non-block tags don't break a list
-(Disabled since php parser generates broken html -- relies on Tidy to fix up)
-!! options
-disabled
-!! input
-<span>
-*a</span><span>
-*b</span>
-!! result
-<p><span></span>
-</p>
-<ul><li>a<span></span>
-</li><li>b
-</li></ul>
-!! end
-
-!! test
-Unclosed formatting tags that straddle lists are closed and reopened
-(Disabled since php parser generates broken html -- relies on Tidy to fix up)
-!! options
-disabled
-!! input
-# <s> a
-# b </s>
-!! result
-<ol><li> <s> a </s>
-</li><li> <s> b </s>
-</li></ol>
-!! end
-
-!!test
-List embedded in a non-block tag
-(Ugly Parsoid output -- worth fixing; Disabled for PHP parser since it relies on Tidy)
-!! options
-parsoid
-!!input
-<small>
-* foo
-</small>
-!!result
-<p><small></small></p>
-<small>
 <ul>
-<li> foo</li>
+<li>foo bar
+</li>
+<li>baz
+</li>
 </ul>
-</small>
-<p><small></small></p>
-!!end
+
+!! end
 
 !! test
 List items are not parsed correctly following a <pre> block (bug 785)
@@ -4341,10 +6094,14 @@ List items are not parsed correctly following a <pre> block (bug 785)
 * <pre>bar</pre>
 * zar
 !! result
-<ul><li> <pre>foo</pre>
-</li><li> <pre>bar</pre>
-</li><li> zar
-</li></ul>
+<ul>
+<li> <pre>foo</pre>
+</li>
+<li> <pre>bar</pre>
+</li>
+<li> zar
+</li>
+</ul>
 
 !! end
 
@@ -4363,18 +6120,30 @@ List items from template
 * notSOL{{inner list}}
 * item 2
 !! result
-<ul><li> item 1
-</li><li> item 2
-</li></ul>
-<ul><li> item 0
-</li><li> item 1
-</li><li> item 2
-</li></ul>
-<ul><li> item 0
-</li><li> notSOL
-</li><li> item 1
-</li><li> item 2
-</li></ul>
+<ul>
+<li> item 1
+</li>
+<li> item 2
+</li>
+</ul>
+<ul>
+<li> item 0
+</li>
+<li> item 1
+</li>
+<li> item 2
+</li>
+</ul>
+<ul>
+<li> item 0
+</li>
+<li> notSOL
+</li>
+<li> item 1
+</li>
+<li> item 2
+</li>
+</ul>
 
 !! end
 
@@ -4387,14 +6156,22 @@ List interrupted by empty line or heading
 == A heading ==
 * Another list item
 !! result
-<ul><li> foo
-</li></ul>
-<ul><li><ul><li> bar
-</li></ul>
-</li></ul>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A heading">edit</a>]</span> <span class="mw-headline" id="A_heading"> A heading </span></h2>
-<ul><li> Another list item
-</li></ul>
+<ul>
+<li> foo
+</li>
+</ul>
+<ul>
+<li><ul>
+<li> bar
+</li>
+</ul>
+</li>
+</ul>
+<h2><span class="mw-headline" id="A_heading">A heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<ul>
+<li> Another list item
+</li>
+</ul>
 
 !!end
 
@@ -4413,1629 +6190,2281 @@ Multiple list tags generated by templates
 
 !!end
 
-###
-### Magic Words
-###
+!!test
+Single-comment whitespace lines dont break lists, and neither do multi-comment whitespace lines
+!!input
+*a
+<!--This line will NOT split the list-->
+*b
+ <!--This line will NOT split the list either-->
+*c
+ <!--foo--> <!----> <!--This line NOT split the list either--> 
+*d
+!!result
+<ul>
+<li>a
+</li>
+<li>b
+</li>
+<li>c
+</li>
+<li>d
+</li>
+</ul>
 
-!! test
-Magic Word: {{CURRENTDAY}}
-!! input
-{{CURRENTDAY}}
-!! result
-<p>1
-</p>
-!! end
+!!end
 
-!! test
-Magic Word: {{CURRENTDAY2}}
-!! input
-{{CURRENTDAY2}}
-!! result
-<p>01
-</p>
-!! end
+!!test
+Replacing whitespace with tabs still doesn't break the list (gerrit 78327)
+!!input
+*a
+<!--This line will NOT split the list-->	
+*b
+	<!--This line will NOT split the list either--> 	
+*c
+	<!--foo--> <!---->	<!--This line NOT split the list
+        either-->	 
+*d
+!!result
+<ul>
+<li>a
+</li>
+<li>b
+</li>
+<li>c
+</li>
+<li>d
+</li>
+</ul>
+
+!!end
+
+!!test
+Test the li-hack
+(Cannot test this with PHP parser since it relies on Tidy for the hack)
+!!options
+parsoid=wt2html,wt2wt
+!!input
+* foo
+* <li>li-hack
+* {{echo|<li>templated li-hack}}
+* <!--foo--> <li> unsupported li-hack with preceding comments
+
+<ul>
+<li><li>not a li-hack
+</li>
+</ul>
+!!result
+<ul>
+<li> foo</li>
+<li>li-hack</li>
+<li about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<li>templated li-hack"}}}}]}'>templated li-hack</li>
+<li> <!--foo--> </li>
+<li> li-hack with preceding comments</li>
+</ul>
+
+<ul>
+<li></li>
+<li>not a li-hack
+</li>
+</ul>
+!!end
 
 !! test
-Magic Word: {{CURRENTDAYNAME}}
+Parsoid: Make sure nested lists are serialized on their own line even if HTML contains no newlines
+!! options
+parsoid
 !! input
-{{CURRENTDAYNAME}}
+# foo
+## bar
+* foo
+** bar
+: foo
+:: bar
 !! result
-<p>Thursday
-</p>
+<ol>
+<li> foo<ol>
+<li> bar</li>
+</ol></li>
+</ol><ul>
+<li> foo<ul>
+<li> bar</li>
+</ul></li>
+</ul><dl>
+<dd> foo<dl>
+<dd> bar</dd>
+</dl></dd>
+</dl>
 !! end
 
 !! test
-Magic Word: {{CURRENTDOW}}
+Parsoid: Test of whitespace serialization with Templated bullets
+!! options
+parsoid
 !! input
-{{CURRENTDOW}}
+* {{bullet}}
 !! result
-<p>4
-</p>
+<ul>
+<li> </li><li about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"bullet","href":"./Template:Bullet"},"params":{},"i":0}}]}'> Bar</li>
+</ul>
 !! end
 
+# ------------------------------------------------------------------------
+# The next set of tests are about Parsoid's ability to handle badly nested
+# tags (parse, minimize scope of fixup, and roundtrip back)
+# ------------------------------------------------------------------------
+
 !! test
-Magic Word: {{CURRENTMONTH}}
+Unbalanced closing block tags break a list
+(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
+!! options
+parsoid
 !! input
-{{CURRENTMONTH}}
+<div>
+*a</div><div>
+*b</div>
 !! result
-<p>01
-</p>
+<div>
+<ul>
+<li>a
+</li>
+</ul></div><div>
+<ul>
+<li>b
+</li>
+</ul></div>
 !! end
 
 !! test
-Magic Word: {{CURRENTMONTHABBREV}}
+Unbalanced closing non-block tags don't break a list
+(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
+!! options
+parsoid
 !! input
-{{CURRENTMONTHABBREV}}
+<span>
+*a</span><span>
+*b</span>
 !! result
-<p>Jan
+<p><span></span>
 </p>
+<ul>
+<li>a<span></span>
+</li>
+<li>b
+</li>
+</ul>
 !! end
 
 !! test
-Magic Word: {{CURRENTMONTHNAME}}
+Unclosed formatting tags that straddle lists are closed and reopened
+(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
+!! options
+parsoid
 !! input
-{{CURRENTMONTHNAME}}
+# <s> a
+# b </s>
 !! result
-<p>January
-</p>
+<ol>
+<li> <s> a </s>
+</li>
+<li> <s> b </s>
+</li>
+</ol>
 !! end
 
-!! test
-Magic Word: {{CURRENTMONTHNAMEGEN}}
-!! input
-{{CURRENTMONTHNAMEGEN}}
-!! result
-<p>January
-</p>
-!! end
+!!test
+List embedded in a non-block tag
+(Ugly Parsoid output -- worth fixing; Disabled for PHP parser since it relies on Tidy)
+!! options
+parsoid
+!!input
+<small>
+* foo
+</small>
+!!result
+<p><small></small></p>
+<small>
+<ul>
+<li> foo</li>
+</ul>
+</small>
+<p><small></small></p>
+!!end
 
 !! test
-Magic Word: {{CURRENTTIME}}
+Table with missing opening <tr> tag
+!! options
+parsoid=wt2html,wt2wt
 !! input
-{{CURRENTTIME}}
+<table>
+<td>foo</td>
+</tr>
+</table>
 !! result
-<p>00:02
-</p>
+<table>
+<tr>
+<td>foo</td>
+</tr>
+</table>
 !! end
 
+###
+### Magic Words
+###
+
+# Note that the current date is hard-coded as
+#   1970-01-01T00:02:03Z (a Thursday)
+# when running parser tests.  The timezone is also fixed to GMT, so
+# local date will be identical to current date.
+
 !! test
-Magic Word: {{CURRENTWEEK}} (@bug 4594)
+Magic Word: {{CURRENTDAY}}
 !! input
-{{CURRENTWEEK}}
+{{CURRENTDAY}}
 !! result
 <p>1
 </p>
 !! end
 
 !! test
-Magic Word: {{CURRENTYEAR}}
+Magic Word: {{CURRENTDAY2}}
 !! input
-{{CURRENTYEAR}}
+{{CURRENTDAY2}}
 !! result
-<p>1970
+<p>01
 </p>
 !! end
 
 !! test
-Magic Word: {{FULLPAGENAME}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
+Magic Word: {{CURRENTDAYNAME}}
 !! input
-{{FULLPAGENAME}}
+{{CURRENTDAYNAME}}
 !! result
-<p>User:Ævar Arnfjörð Bjarmason
+<p>Thursday
 </p>
 !! end
 
 !! test
-Magic Word: {{FULLPAGENAMEE}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
+Magic Word: {{CURRENTDOW}}
 !! input
-{{FULLPAGENAMEE}}
+{{CURRENTDOW}}
 !! result
-<p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
+<p>4
 </p>
 !! end
 
 !! test
-Magic Word: {{NAMESPACE}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
+Magic Word: {{CURRENTMONTH}}
 !! input
-{{NAMESPACE}}
+{{CURRENTMONTH}}
 !! result
-<p>User
+<p>01
 </p>
 !! end
 
 !! test
-Magic Word: {{NAMESPACEE}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
+Magic Word: {{CURRENTMONTH1}}
 !! input
-{{NAMESPACEE}}
+{{CURRENTMONTH1}}
 !! result
-<p>User
+<p>1
 </p>
 !! end
 
 !! test
-Magic Word: {{NAMESPACENUMBER}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
+Magic Word: {{CURRENTMONTHABBREV}}
 !! input
-{{NAMESPACENUMBER}}
+{{CURRENTMONTHABBREV}}
 !! result
-<p>2
+<p>Jan
 </p>
 !! end
 
 !! test
-Magic Word: {{NUMBEROFFILES}}
+Magic Word: {{CURRENTMONTHNAME}}
 !! input
-{{NUMBEROFFILES}}
+{{CURRENTMONTHNAME}}
 !! result
-<p>2
+<p>January
 </p>
 !! end
 
 !! test
-Magic Word: {{PAGENAME}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
+Magic Word: {{CURRENTMONTHNAMEGEN}}
 !! input
-{{PAGENAME}}
+{{CURRENTMONTHNAMEGEN}}
 !! result
-<p>Ævar Arnfjörð Bjarmason
+<p>January
 </p>
 !! end
 
 !! test
-Magic Word: {{PAGENAME}} with metacharacters
-!! options
-title=[['foo & bar = baz']]
+Magic Word: {{CURRENTTIME}}
 !! input
-''{{PAGENAME}}''
+{{CURRENTTIME}}
 !! result
-<p><i>&#39;foo &#38; bar &#61; baz&#39;</i>
+<p>00:02
 </p>
 !! end
 
 !! test
-Magic Word: {{PAGENAME}} with metacharacters (bug 26781)
-!! options
-title=[[*RFC 1234 http://example.com/]]
+Magic Word: {{CURRENTHOUR}}
 !! input
-{{PAGENAME}}
+{{CURRENTHOUR}}
 !! result
-<p>&#42;RFC&#32;1234 http&#58;//example.com/
+<p>00
 </p>
 !! end
 
 !! test
-Magic Word: {{PAGENAMEE}}
-!! options
-title=[[User:Ævar Arnfjörð Bjarmason]]
+Magic Word: {{CURRENTWEEK}} (@bug 4594)
 !! input
-{{PAGENAMEE}}
+{{CURRENTWEEK}}
 !! result
-<p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
+<p>1
 </p>
 !! end
 
 !! test
-Magic Word: {{PAGENAMEE}} with metacharacters (bug 26781)
-!! options
-title=[[*RFC 1234 http://example.com/]]
+Magic Word: {{CURRENTYEAR}}
 !! input
-{{PAGENAMEE}}
+{{CURRENTYEAR}}
 !! result
-<p>&#42;RFC_1234_http&#58;//example.com/
+<p>1970
 </p>
 !! end
 
 !! test
-Magic Word: {{REVISIONID}}
+Magic Word: {{CURRENTTIMESTAMP}}
 !! input
-{{REVISIONID}}
+{{CURRENTTIMESTAMP}}
 !! result
-<p>1337
+<p>19700101000203
 </p>
 !! end
 
 !! test
-Magic Word: {{SCRIPTPATH}}
+Magic Words LOCAL (UTC)
 !! input
-{{SCRIPTPATH}}
+* {{LOCALMONTH}}
+* {{LOCALMONTH1}}
+* {{LOCALMONTHNAME}}
+* {{LOCALMONTHNAMEGEN}}
+* {{LOCALMONTHABBREV}}
+* {{LOCALDAY}}
+* {{LOCALDAY2}}
+* {{LOCALDAYNAME}}
+* {{LOCALYEAR}}
+* {{LOCALTIME}}
+* {{LOCALHOUR}}
+* {{LOCALWEEK}}
+* {{LOCALDOW}}
+* {{LOCALTIMESTAMP}}
 !! result
-<p>/
+<ul>
+<li> 01
+</li>
+<li> 1
+</li>
+<li> January
+</li>
+<li> January
+</li>
+<li> Jan
+</li>
+<li> 1
+</li>
+<li> 01
+</li>
+<li> Thursday
+</li>
+<li> 1970
+</li>
+<li> 00:02
+</li>
+<li> 00
+</li>
+<li> 1
+</li>
+<li> 4
+</li>
+<li> 19700101000203
+</li>
+</ul>
+
+!! end
+
+!! test
+Magic Word: {{FULLPAGENAME}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
+!! input
+{{FULLPAGENAME}}
+!! result
+<p>User:Ævar Arnfjörð Bjarmason
 </p>
 !! end
 
 !! test
-Magic Word: {{SERVER}}
+Magic Word: {{FULLPAGENAMEE}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
 !! input
-{{SERVER}}
+{{FULLPAGENAMEE}}
 !! result
-<p><a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>
+<p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
 
 !! test
-Magic Word: {{SERVERNAME}}
+Magic Word: {{TALKSPACE}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
 !! input
-{{SERVERNAME}}
+{{TALKSPACE}}
 !! result
-<p>example.org
+<p>User talk
 </p>
 !! end
 
 !! test
-Magic Word: {{SITENAME}}
+Magic Word: {{TALKSPACE}}, same namespace
+!! options
+title=[[User talk:Ævar Arnfjörð Bjarmason]]
 !! input
-{{SITENAME}}
+{{TALKSPACE}}
 !! result
-<p>MediaWiki
+<p>User talk
 </p>
 !! end
 
 !! test
-Namespace 1 {{ns:1}}
+Magic Word: {{TALKSPACE}}, main namespace
+!! options
+title=[[Parser Test]]
 !! input
-{{ns:1}}
+{{TALKSPACE}}
 !! result
 <p>Talk
 </p>
 !! end
 
 !! test
-Namespace 1 {{ns:01}}
+Magic Word: {{TALKSPACEE}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
 !! input
-{{ns:01}}
+{{TALKSPACEE}}
 !! result
-<p>Talk
+<p>User_talk
 </p>
 !! end
 
 !! test
-Namespace 0 {{ns:0}} (bug 4783)
+Magic Word: {{SUBJECTSPACE}}
+!! options
+title=[[User talk:Ævar Arnfjörð Bjarmason]]
 !! input
-{{ns:0}}
+{{SUBJECTSPACE}}
 !! result
+<p>User
+</p>
+!! end
 
+!! test
+Magic Word: {{SUBJECTSPACE}}, same namespace
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
+!! input
+{{SUBJECTSPACE}}
+!! result
+<p>User
+</p>
 !! end
 
 !! test
-Namespace 0 {{ns:00}} (bug 4783)
+Magic Word: {{SUBJECTSPACE}}, main namespace
+!! options
+title=[[Parser Test]]
 !! input
-{{ns:00}}
+{{SUBJECTSPACE}}
 !! result
 
 !! end
 
 !! test
-Namespace -1 {{ns:-1}}
+Magic Word: {{SUBJECTSPACEE}}
+!! options
+title=[[User talk:Ævar Arnfjörð Bjarmason]]
 !! input
-{{ns:-1}}
+{{SUBJECTSPACEE}}
 !! result
-<p>Special
+<p>User
 </p>
 !! end
 
 !! test
-Namespace User {{ns:User}}
+Magic Word: {{NAMESPACE}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
 !! input
-{{ns:User}}
+{{NAMESPACE}}
 !! result
 <p>User
 </p>
 !! end
 
 !! test
-Namespace User talk {{ns:User_talk}}
+Magic Word: {{NAMESPACEE}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
 !! input
-{{ns:User_talk}}
+{{NAMESPACEE}}
 !! result
-<p>User talk
+<p>User
 </p>
 !! end
 
 !! test
-Namespace User talk {{ns:uSeR tAlK}}
+Magic Word: {{NAMESPACENUMBER}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
 !! input
-{{ns:uSeR tAlK}}
+{{NAMESPACENUMBER}}
 !! result
-<p>User talk
+<p>2
 </p>
 !! end
 
 !! test
-Namespace File {{ns:File}}
+Magic Word: {{SUBPAGENAME}}
+!! options
+title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
 !! input
-{{ns:File}}
+{{SUBPAGENAME}}
 !! result
-<p>File
+<p>sub ö
 </p>
 !! end
 
 !! test
-Namespace File {{ns:Image}}
+Magic Word: {{SUBPAGENAMEE}}
+!! options
+title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
 !! input
-{{ns:Image}}
+{{SUBPAGENAMEE}}
 !! result
-<p>File
+<p>sub_%C3%B6
 </p>
 !! end
 
 !! test
-Namespace (lang=de) Benutzer {{ns:User}}
+Magic Word: {{ROOTPAGENAME}}
 !! options
-language=de
+title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
 !! input
-{{ns:User}}
+{{ROOTPAGENAME}}
 !! result
-<p>Benutzer
+<p>Ævar Arnfjörð Bjarmason
 </p>
 !! end
 
 !! test
-Namespace (lang=de) Benutzer Diskussion {{ns:3}}
+Magic Word: {{ROOTPAGENAMEE}}
 !! options
-language=de
+title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
 !! input
-{{ns:3}}
+{{ROOTPAGENAMEE}}
 !! result
-<p>Benutzer Diskussion
+<p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
 
-
 !! test
-Urlencode
+Magic Word: {{BASEPAGENAME}}
+!! options
+title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
 !! input
-{{urlencode:hi world?!}}
-{{urlencode:hi world?!|WIKI}}
-{{urlencode:hi world?!|PATH}}
-{{urlencode:hi world?!|QUERY}}
+{{BASEPAGENAME}}
 !! result
-<p>hi+world%3F%21
-hi_world%3F!
-hi%20world%3F%21
-hi+world%3F%21
+<p>Ævar Arnfjörð Bjarmason
 </p>
 !! end
 
-###
-### Magic links
-###
 !! test
-Magic links: internal link to RFC (bug 479)
+Magic Word: {{BASEPAGENAMEE}}
+!! options
+title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
 !! input
-[[RFC 123]]
+{{BASEPAGENAMEE}}
 !! result
-<p><a href="/index.php?title=RFC_123&amp;action=edit&amp;redlink=1" class="new" title="RFC 123 (page does not exist)">RFC 123</a>
+<p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
 
 !! test
-Magic links: RFC (bug 479)
+Magic Word: {{TALKPAGENAME}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
 !! input
-RFC 822
+{{TALKPAGENAME}}
 !! result
-<p><a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc822">RFC 822</a>
+<p>User talk:Ævar Arnfjörð Bjarmason
 </p>
 !! end
 
 !! test
-Magic links: ISBN (bug 1937)
+Magic Word: {{TALKPAGENAMEE}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
 !! input
-ISBN 0-306-40615-2
+{{TALKPAGENAMEE}}
 !! result
-<p><a href="/wiki/Special:BookSources/0306406152" class="internal mw-magiclink-isbn">ISBN 0-306-40615-2</a>
+<p>User_talk:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
 
 !! test
-Magic links: PMID incorrectly converts space to underscore
+Magic Word: {{SUBJECTPAGENAME}}
+!! options
+title=[[User talk:Ævar Arnfjörð Bjarmason]]
 !! input
-PMID 1234
+{{SUBJECTPAGENAME}}
 !! result
-<p><a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a>
+<p>User:Ævar Arnfjörð Bjarmason
 </p>
 !! end
 
-###
-### Templates
-####
-
 !! test
-Nonexistent template
+Magic Word: {{SUBJECTPAGENAMEE}}
+!! options
+title=[[User talk:Ævar Arnfjörð Bjarmason]]
 !! input
-{{thistemplatedoesnotexist}}
+{{SUBJECTPAGENAMEE}}
 !! result
-<p><a href="/index.php?title=Template:Thistemplatedoesnotexist&amp;action=edit&amp;redlink=1" class="new" title="Template:Thistemplatedoesnotexist (page does not exist)">Template:Thistemplatedoesnotexist</a>
+<p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
 
 !! test
-Template with invalid target containing tags
+Magic Word: {{NUMBEROFFILES}}
 !! input
-{{a<b>b</b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = b}}
+{{NUMBEROFFILES}}
 !! result
-<p>{{a<b>b</b>|foo|a=b|a = b}}
+<p>4
 </p>
 !! end
 
 !! test
-Template with invalid target containing unclosed tag
+Magic Word: {{PAGENAME}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
 !! input
-{{a<b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = b}}
+{{PAGENAME}}
 !! result
-<p>{{a<b>|foo|a=b|a = b}}</b>
+<p>Ævar Arnfjörð Bjarmason
 </p>
 !! end
 
-!! article
-Template:test
-!! text
-This is a test template
-!! endarticle
-
 !! test
-Simple template
+Magic Word: {{PAGENAME}} with metacharacters
+!! options
+title=[['foo & bar = baz']]
 !! input
-{{test}}
+''{{PAGENAME}}''
 !! result
-<p>This is a test template
+<p><i>&#39;foo &#38; bar &#61; baz&#39;</i>
 </p>
 !! end
 
 !! test
-Template with explicit namespace
+Magic Word: {{PAGENAME}} with metacharacters (bug 26781)
+!! options
+title=[[*RFC 1234 http://example.com/]]
 !! input
-{{Template:test}}
+{{PAGENAME}}
 !! result
-<p>This is a test template
+<p>&#42;RFC&#32;1234 http&#58;//example.com/
 </p>
 !! end
 
-
-!! article
-Template:paramtest
-!! text
-This is a test template with parameter {{{param}}}
-!! endarticle
-
 !! test
-Template parameter
+Magic Word: {{PAGENAMEE}}
+!! options
+title=[[User:Ævar Arnfjörð Bjarmason]]
 !! input
-{{paramtest|param=foo}}
+{{PAGENAMEE}}
 !! result
-<p>This is a test template with parameter foo
+<p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
 
-!! article
-Template:paramtestnum
-!! text
-[[{{{1}}}|{{{2}}}]]
-!! endarticle
-
 !! test
-Template unnamed parameter
+Magic Word: {{PAGENAMEE}} with metacharacters (bug 26781)
+!! options
+title=[[*RFC 1234 http://example.com/]]
 !! input
-{{paramtestnum|Main Page|the main page}}
+{{PAGENAMEE}}
 !! result
-<p><a href="/wiki/Main_Page" title="Main Page">the main page</a>
+<p>&#42;RFC_1234_http&#58;//example.com/
 </p>
 !! end
 
-!! article
-Template:templatesimple
-!! text
-(test)
-!! endarticle
-
-!! article
-Template:templateredirect
-!! text
-#redirect [[Template:templatesimple]]
-!! endarticle
-
-!! article
-Template:templateasargtestnum
-!! text
-{{{{{1}}}}}
-!! endarticle
-
-!! article
-Template:templateasargtest
-!! text
-{{template{{{templ}}}}}
-!! endarticle
-
-!! article
-Template:templateasargtest2
-!! text
-{{{{{templ}}}}}
-!! endarticle
-
 !! test
-Template with template name as unnamed argument
+Magic Word: {{REVISIONID}}
 !! input
-{{templateasargtestnum|templatesimple}}
+{{REVISIONID}}
 !! result
-<p>(test)
+<p>1337
 </p>
 !! end
 
 !! test
-Template with template name as argument
+Magic Word: {{SCRIPTPATH}}
 !! input
-{{templateasargtest|templ=simple}}
+{{SCRIPTPATH}}
 !! result
-<p>(test)
+<p>/
 </p>
 !! end
 
 !! test
-Template with template name as argument (2)
+Magic Word: {{STYLEPATH}}
 !! input
-{{templateasargtest2|templ=templatesimple}}
+{{STYLEPATH}}
 !! result
-<p>(test)
+<p>/skins
 </p>
 !! end
 
-!! article
-Template:templateasargtestdefault
-!! text
-{{{{{templ|templatesimple}}}}}
-!! endarticle
-
-!! article
-Template:templa
-!! text
-'''templ'''
-!! endarticle
-
 !! test
-Template with default value
+Magic Word: {{SERVER}}
 !! input
-{{templateasargtestdefault}}
+{{SERVER}}
 !! result
-<p>(test)
+<p><a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>
 </p>
 !! end
 
 !! test
-Template with default value (value set)
+Magic Word: {{SERVERNAME}}
 !! input
-{{templateasargtestdefault|templ=templa}}
+{{SERVERNAME}}
 !! result
-<p><b>templ</b>
+<p>example.org
 </p>
 !! end
 
 !! test
-Template redirect
+Magic Word: {{SITENAME}}
 !! input
-{{templateredirect}}
+{{SITENAME}}
 !! result
-<p>(test)
+<p>MediaWiki
 </p>
 !! end
 
 !! test
-Template with argument in separate line
+Case-sensitive magic words, when cased differently, should just be template transclusions
 !! input
-{{ templateasargtest  |
- templ = simple }}
+{{CurrentMonth}}
+{{currentday}}
+{{cURreNTweEK}}
+{{currentHour}}
 !! result
-<p>(test)
+<p><a href="/index.php?title=Template:CurrentMonth&amp;action=edit&amp;redlink=1" class="new" title="Template:CurrentMonth (page does not exist)">Template:CurrentMonth</a>
+<a href="/index.php?title=Template:Currentday&amp;action=edit&amp;redlink=1" class="new" title="Template:Currentday (page does not exist)">Template:Currentday</a>
+<a href="/index.php?title=Template:CURreNTweEK&amp;action=edit&amp;redlink=1" class="new" title="Template:CURreNTweEK (page does not exist)">Template:CURreNTweEK</a>
+<a href="/index.php?title=Template:CurrentHour&amp;action=edit&amp;redlink=1" class="new" title="Template:CurrentHour (page does not exist)">Template:CurrentHour</a>
 </p>
 !! end
 
 !! test
-Template with complex template as argument
+Case-insensitive magic words should still work with weird casing.
 !! input
-{{paramtest|
-  param ={{ templateasargtest  |
- templ = simple }}}}
+{{sErVeRNaMe}}
+{{LCFirst:AOEU}}
+{{ucFIRST:aoeu}}
+{{SERver}}
 !! result
-<p>This is a test template with parameter (test)
+<p>example.org
+aOEU
+Aoeu
+<a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>
 </p>
 !! end
 
 !! test
-Template with thumb image (with link in description)
+Namespace 1 {{ns:1}}
 !! input
-{{paramtest|
-  param =[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]}}
+{{ns:1}}
 !! result
-This is a test template with parameter <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Noimage.png" class="new" title="File:Noimage.png">File:Noimage.png</a>  <div class="thumbcaption"><a href="/index.php?title=No_link&amp;action=edit&amp;redlink=1" class="new" title="No link (page does not exist)">link</a> <a href="/index.php?title=No_link&amp;action=edit&amp;redlink=1" class="new" title="No link (page does not exist)">caption</a></div></div></div>
-
+<p>Talk
+</p>
 !! end
 
-!! article
-Template:complextemplate
-!! text
-{{{1}}} {{paramtest|
-  param ={{{param}}}}}
-!! endarticle
-
 !! test
-Template with complex arguments
+Namespace 1 {{ns:01}}
 !! input
-{{complextemplate|
-  param ={{ templateasargtest  |
- templ = simple }}|[[Template:complextemplate|link]]}}
+{{ns:01}}
 !! result
-<p><a href="/wiki/Template:Complextemplate" title="Template:Complextemplate">link</a> This is a test template with parameter (test)
+<p>Talk
 </p>
 !! end
 
 !! test
-BUG 553: link with two variables in a piped link
+Namespace 0 {{ns:0}} (bug 4783)
 !! input
-{|
-|[[{{{1}}}|{{{2}}}]]
-|}
+{{ns:0}}
 !! result
-<table>
-<tr>
-<td>[[{{{1}}}|{{{2}}}]]
-</td></tr></table>
 
 !! end
 
 !! test
-Magic variable as template parameter
+Namespace 0 {{ns:00}} (bug 4783)
 !! input
-{{paramtest|param={{SITENAME}}}}
+{{ns:00}}
 !! result
-<p>This is a test template with parameter MediaWiki
-</p>
-!! end
 
-!! article
-Template:linktest
-!! text
-[[{{{param}}}|link]]
-!! endarticle
+!! end
 
 !! test
-Template parameter as link source
+Namespace -1 {{ns:-1}}
 !! input
-{{linktest|param=Main Page}}
+{{ns:-1}}
 !! result
-<p><a href="/wiki/Main_Page" title="Main Page">link</a>
+<p>Special
 </p>
 !! end
 
-!!test
-Template-generated attribute string (k='v')
-!!input
-<span {{attr_str|id|v1}}>bar</span>
-!!result
-<p><span id="v1">bar</span>
+!! test
+Namespace User {{ns:User}}
+!! input
+{{ns:User}}
+!! result
+<p>User
 </p>
-!!end
-
-!!article
-Template:paramtest2
-!! text
-including another template, {{paramtest|param={{{arg}}}}}
-!! endarticle
+!! end
 
 !! test
-Template passing argument to another template
+Namespace User talk {{ns:User_talk}}
 !! input
-{{paramtest2|arg='hmm'}}
+{{ns:User_talk}}
 !! result
-<p>including another template, This is a test template with parameter 'hmm'
+<p>User talk
 </p>
 !! end
 
-!! article
-Template:Linktest2
-!! text
-Main Page
-!! endarticle
-
 !! test
-Template as link source
+Namespace User talk {{ns:uSeR tAlK}}
 !! input
-[[{{linktest2}}]]
-
-[[{{linktest2}}|Main Page]]
-
-[[{{linktest2}}]]Page
+{{ns:uSeR tAlK}}
 !! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p><p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p><p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>Page
+<p>User talk
 </p>
 !! end
 
+!! test
+Namespace File {{ns:File}}
+!! input
+{{ns:File}}
+!! result
+<p>File
+</p>
+!! end
 
-!! article
-Template:loop1
-!! text
-{{loop2}}
-!! endarticle
-
-!! article
-Template:loop2
-!! text
-{{loop1}}
-!! endarticle
+!! test
+Namespace File {{ns:Image}}
+!! input
+{{ns:Image}}
+!! result
+<p>File
+</p>
+!! end
 
 !! test
-Template infinite loop
+Namespace (lang=de) Benutzer {{ns:User}}
+!! options
+language=de
 !! input
-{{loop1}}
+{{ns:User}}
 !! result
-<p><span class="error">Template loop detected: <a href="/wiki/Template:Loop1" title="Template:Loop1">Template:Loop1</a></span>
+<p>Benutzer
 </p>
 !! end
 
 !! test
-Template from main namespace
+Namespace (lang=de) Benutzer Diskussion {{ns:3}}
+!! options
+language=de
 !! input
-{{:Main Page}}
+{{ns:3}}
 !! result
-<p>blah blah
+<p>Benutzer Diskussion
 </p>
 !! end
 
-!! article
-Template:table
-!! text
-{|
-| 1 || 2
-|-
-| 3 || 4
-|}
-!! endarticle
 
 !! test
-BUG 529: Template with table, not included at beginning of line
+Urlencode
 !! input
-foo {{table}}
+{{urlencode:hi world?!}}
+{{urlencode:hi world?!|WIKI}}
+{{urlencode:hi world?!|PATH}}
+{{urlencode:hi world?!|QUERY}}
 !! result
-<p>foo 
+<p>hi+world%3F%21
+hi_world%3F!
+hi%20world%3F%21
+hi+world%3F%21
 </p>
-<table>
-<tr>
-<td> 1 </td>
-<td> 2
-</td></tr>
-<tr>
-<td> 3 </td>
-<td> 4
-</td></tr></table>
+!! end
 
+###
+### Magic links
+###
+!! test
+Magic links: internal link to RFC (bug 479)
+!! input
+[[RFC 123]]
+!! result
+<p><a href="/index.php?title=RFC_123&amp;action=edit&amp;redlink=1" class="new" title="RFC 123 (page does not exist)">RFC 123</a>
+</p>
 !! end
 
 !! test
-BUG 523: Template shouldn't eat newline (or add an extra one before table)
+Magic links: RFC (bug 479)
 !! input
-foo
-{{table}}
+RFC 822
 !! result
-<p>foo
+<p><a class="external mw-magiclink-rfc" rel="nofollow" href="//tools.ietf.org/html/rfc822">RFC 822</a>
 </p>
-<table>
-<tr>
-<td> 1 </td>
-<td> 2
-</td></tr>
-<tr>
-<td> 3 </td>
-<td> 4
-</td></tr></table>
+!! end
 
+!! test
+Magic links: ISBN (bug 1937)
+!! input
+ISBN 0-306-40615-2
+!! result
+<p><a href="/wiki/Special:BookSources/0306406152" class="internal mw-magiclink-isbn">ISBN 0-306-40615-2</a>
+</p>
 !! end
 
 !! test
-BUG 41: Template parameters shown as broken links
+Magic links: PMID incorrectly converts space to underscore
 !! input
-{{{parameter}}}
+PMID 1234
 !! result
-<p>{{{parameter}}}
+<p><a class="external mw-magiclink-pmid" rel="nofollow" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a>
 </p>
 !! end
 
+###
+### Templates
+####
+
 !! test
-Template with targets containing wikilinks
+Nonexistent template
 !! input
-{{[[foo]]}}
+{{thistemplatedoesnotexist}}
+!! result
+<p><a href="/index.php?title=Template:Thistemplatedoesnotexist&amp;action=edit&amp;redlink=1" class="new" title="Template:Thistemplatedoesnotexist (page does not exist)">Template:Thistemplatedoesnotexist</a>
+</p>
+!! end
 
-{{[[{{echo|foo}}]]}}
+!! test
+Template with invalid target containing tags
+!! input
+{{a<b>b</b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = b}}
+!! result
+<p>{{a<b>b</b>|foo|a=b|a = b}}
+</p>
+!! end
 
-{{{{echo|[[foo}}]]}}
+!! test
+Template with invalid target containing unclosed tag
+!! input
+{{a<b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = b}}
 !! result
-<p>{{<a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">foo</a>}}
-</p><p>{{<a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">foo</a>}}
-</p><p>{{[[foo}}]]
+<p>{{a<b>|foo|a=b|a = b}}</b>
 </p>
 !! end
 
 !! article
-Template:MSGNW test
+Template:test
 !! text
-''None'' of '''this''' should be 
-* interpreted
- but rather passed unmodified
-{{test}}
+This is a test template
 !! endarticle
 
-# hmm, fix this or just deprecate msgnw and document its behavior?
 !! test
-msgnw keyword
-!! options
-disabled
+Simple template
 !! input
-{{msgnw:MSGNW test}}
-!! result
-<p>''None'' of '''this''' should be 
-* interpreted
- but rather passed unmodified
 {{test}}
+!! result
+<p>This is a test template
 </p>
 !! end
 
 !! test
-int keyword
+Template with explicit namespace
 !! input
-{{int:youhavenewmessages|lots of money|not!}}
+{{Template:test}}
 !! result
-<p>You have lots of money (not!).
+<p>This is a test template
 </p>
 !! end
 
+
 !! article
-Template:Includes
+Template:paramtest
 !! text
-Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
+This is a test template with parameter {{{param}}}
 !! endarticle
 
 !! test
-<includeonly> and <noinclude> being included
+Template parameter
 !! input
-{{Includes}}
+{{paramtest|param=foo}}
 !! result
-<p>Foobar
+<p>This is a test template with parameter foo
 </p>
 !! end
 
 !! article
-Template:Includes2
+Template:paramtestnum
 !! text
-<onlyinclude>Foo</onlyinclude>bar
+[[{{{1}}}|{{{2}}}]]
 !! endarticle
 
 !! test
-<onlyinclude> being included
+Template unnamed parameter
 !! input
-{{Includes2}}
+{{paramtestnum|Main Page|the main page}}
 !! result
-<p>Foo
+<p><a href="/wiki/Main_Page" title="Main Page">the main page</a>
 </p>
 !! end
 
+!! article
+Template:templatesimple
+!! text
+(test)
+!! endarticle
+
+!! article
+Template:templateredirect
+!! text
+#redirect [[Template:templatesimple]]
+!! endarticle
 
 !! article
-Template:Includes3
+Template:templateasargtestnum
 !! text
-<onlyinclude>Foo</onlyinclude>bar<includeonly>zar</includeonly>
+{{{{{1}}}}}
+!! endarticle
+
+!! article
+Template:templateasargtest
+!! text
+{{template{{{templ}}}}}
+!! endarticle
+
+!! article
+Template:templateasargtest2
+!! text
+{{{{{templ}}}}}
 !! endarticle
 
 !! test
-<onlyinclude> and <includeonly> being included
+Template with template name as unnamed argument
 !! input
-{{Includes3}}
+{{templateasargtestnum|templatesimple}}
 !! result
-<p>Foo
+<p>(test)
 </p>
 !! end
 
 !! test
-<includeonly> and <noinclude> on a page
+Template with template name as argument
 !! input
-Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
+{{templateasargtest|templ=simple}}
 !! result
-<p>Foozar
+<p>(test)
 </p>
 !! end
 
 !! test
-Un-closed <noinclude>
+Template with template name as argument (2)
 !! input
-<noinclude>
+{{templateasargtest2|templ=templatesimple}}
 !! result
+<p>(test)
+</p>
 !! end
 
+!! article
+Template:templateasargtestdefault
+!! text
+{{{{{templ|templatesimple}}}}}
+!! endarticle
+
+!! article
+Template:templa
+!! text
+'''templ'''
+!! endarticle
+
 !! test
-<onlyinclude> on a page
+Template with default value
 !! input
-<onlyinclude>Foo</onlyinclude>bar
+{{templateasargtestdefault}}
 !! result
-<p>Foobar
+<p>(test)
 </p>
 !! end
 
 !! test
-Un-closed <onlyinclude>
+Template with default value (value set)
 !! input
-<onlyinclude>
+{{templateasargtestdefault|templ=templa}}
 !! result
+<p><b>templ</b>
+</p>
 !! end
 
-!!test
-Self-closed noinclude, includeonly, onlyinclude tags
-!!input
-<noinclude />
-<includeonly />
-<onlyinclude />
-!!result
-<p><br />
+!! test
+Template redirect
+!! input
+{{templateredirect}}
+!! result
+<p>(test)
 </p>
-!!end
-
-!!test
-Unbalanced includeonly and noinclude tags
-!!input
-{|
-|a</noinclude>
-|b</noinclude></noinclude>
-|c</noinclude></includeonly>
-|d</includeonly></includeonly>
-|}
-!!result
-<table>
-<tr>
-<td>a
-</td>
-<td>b
-</td>
-<td>c&lt;/includeonly&gt;
-</td>
-<td>d&lt;/includeonly&gt;&lt;/includeonly&gt;
-</td></tr></table>
-
-!!end
-
-!! article
-Template:Includeonly section
-!! text
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section T-1==
-!!endarticle
+!! end
 
 !! test
-Bug 6563: Edit link generation for section shown by <includeonly>
+Template with argument in separate line
 !! input
-{{includeonly section}}
+{{ templateasargtest  |
+ templ = simple }}
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-1" title="Template:Includeonly section">edit</a>]</span> <span class="mw-headline" id="Includeonly_section">Includeonly section</span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-2" title="Template:Includeonly section">edit</a>]</span> <span class="mw-headline" id="Section_T-1">Section T-1</span></h2>
-
+<p>(test)
+</p>
 !! end
 
-# Uses same input as the contents of [[Template:Includeonly section]]
 !! test
-Bug 6563: Section extraction for section shown by <includeonly>
-!! options
-section=T-2
+Template with complex template as argument
 !! input
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section T-2==
+{{paramtest|
+  param ={{ templateasargtest  |
+ templ = simple }}}}
 !! result
-==Section T-2==
+<p>This is a test template with parameter (test)
+</p>
 !! end
 
 !! test
-Bug 6563: Edit link generation for section suppressed by <includeonly>
+Template with thumb image (with link in description)
 !! input
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section 1==
+{{paramtest|
+  param =[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]}}
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h2>
+This is a test template with parameter <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Noimage.png" class="new" title="File:Noimage.png">File:Noimage.png</a>  <div class="thumbcaption"><a href="/index.php?title=No_link&amp;action=edit&amp;redlink=1" class="new" title="No link (page does not exist)">link</a> <a href="/index.php?title=No_link&amp;action=edit&amp;redlink=1" class="new" title="No link (page does not exist)">caption</a></div></div></div>
 
 !! end
 
+!! article
+Template:complextemplate
+!! text
+{{{1}}} {{paramtest|
+  param ={{{param}}}}}
+!! endarticle
+
 !! test
-Bug 6563: Section extraction for section suppressed by <includeonly>
-!! options
-section=1
+Template with complex arguments
 !! input
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section 1==
+{{complextemplate|
+  param ={{ templateasargtest  |
+ templ = simple }}|[[Template:complextemplate|link]]}}
 !! result
-==Section 1==
+<p><a href="/wiki/Template:Complextemplate" title="Template:Complextemplate">link</a> This is a test template with parameter (test)
+</p>
 !! end
 
 !! test
-Un-closed <includeonly>
+BUG 553: link with two variables in a piped link
 !! input
-<includeonly>
+{|
+|[[{{{1}}}|{{{2}}}]]
+|}
 !! result
+<table>
+<tr>
+<td>[[{{{1}}}|{{{2}}}]]
+</td></tr></table>
+
 !! end
 
-###
-### <includeonly> and <noinclude> in attributes
-###
-!!test
-0. includeonly around the entire attribute
-!!input
-<span <includeonly>id="v1"</includeonly><noinclude>id="v2"</noinclude>>bar</span>
-!!result
-<p><span id="v2">bar</span>
+!! test
+Magic variable as template parameter
+!! input
+{{paramtest|param={{SITENAME}}}}
+!! result
+<p>This is a test template with parameter MediaWiki
 </p>
-!!end
+!! end
 
-!!test
-1. includeonly in html attr key
-!!input
-<span <noinclude>id</noinclude><includeonly>about</includeonly>="foo">bar</span>
-!!result
-<p><span id="foo">bar</span>
+!! article
+Template:linktest
+!! text
+[[{{{param}}}|link]]
+!! endarticle
+
+!! test
+Template parameter as link source
+!! input
+{{linktest|param=Main Page}}
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">link</a>
 </p>
-!!end
+!! end
 
 !!test
-2. includeonly in html attr value
+Template-generated attribute string (k='v')
 !!input
-<span id="<noinclude>v1</noinclude><includeonly>v2</includeonly>">bar</span>
-<span id=<noinclude>"v1"</noinclude><includeonly>"v2"</includeonly>>bar</span>
+<span {{attr_str|id|v1}}>bar</span>
 !!result
 <p><span id="v1">bar</span>
-<span id="v1">bar</span>
 </p>
 !!end
 
-!!test
-3. includeonly in part of an attr value
-!!input
-<span style="color:<noinclude>red</noinclude><includeonly>blue</includeonly>;">bar</span>
-!!result
-<p><span style="color:red;">bar</span>
-</p>
-!!end
+!!article
+Template:paramtest2
+!! text
+including another template, {{paramtest|param={{{arg}}}}}
+!! endarticle
 
-###
-### Testing parsing of templates where a template arg
-### has the same name as the template itself.
-###
+!! test
+Template passing argument to another template
+!! input
+{{paramtest2|arg='hmm'}}
+!! result
+<p>including another template, This is a test template with parameter 'hmm'
+</p>
+!! end
 
 !! article
-Template:quote
+Template:Linktest2
 !! text
-{{{quote|{{{1}}}}}}
+Main Page
 !! endarticle
 
-!!test
-Templates: Template Name/Arg clash: 1. Use of positional param
-!!input
-{{quote|foo}}
-!!result
-<p>foo
-</p>
-!!end
+!! test
+Template as link source
+!! input
+[[{{linktest2}}]]
 
-!!test
-Templates: Template Name/Arg clash: 2. Use of named param
-!!input
-{{quote|quote=foo}}
-!!result
-<p>foo
-</p>
-!!end
+[[{{linktest2}}|Main Page]]
 
-!!test
-Templates: Template Name/Arg clash: 3. Use of named param with empty input
-!!input
-{{quote|quote}}
-!!result
-<p>quote
+[[{{linktest2}}]]Page
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
+</p><p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
+</p><p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>Page
 </p>
-!!end
+!! end
 
-###
-### Parsoid-centric tests to stress Parsoid's ability to RT them unchanged
-###
 
-!!test
-Templates: 1. Simple use
-!!input
-{{echo|Foo}}
-!!result
-<p>Foo
-</p>
-!!end
-
-!!test
-Templates: 2. Inside a block tag
-!!input
-<div>{{echo|Foo}}</div>
-!!result
-<div>Foo</div>
+!! article
+Template:loop1
+!! text
+{{loop2}}
+!! endarticle
 
-!!end
+!! article
+Template:loop2
+!! text
+{{loop1}}
+!! endarticle
 
-!!test
-Templates: P-wrapping: 1a. Templates on consecutive lines
-!!input
-{{echo|Foo}}
-{{echo|bar}}
-!!result
-<p>Foo
-bar
+!! test
+Template infinite loop
+!! input
+{{loop1}}
+!! result
+<p><span class="error">Template loop detected: <a href="/wiki/Template:Loop1" title="Template:Loop1">Template:Loop1</a></span>
 </p>
-!!end
-
-!!test
-Templates: P-wrapping: 1b. Templates on consecutive lines
-!!input
-Foo
+!! end
 
-{{echo|bar}}
-{{echo|baz}}
-!!result
-<p>Foo
-</p><p>bar
-baz
+!! test
+Template from main namespace
+!! input
+{{:Main Page}}
+!! result
+<p>blah blah
 </p>
-!!end
+!! end
 
-!!test
-Templates: P-wrapping: 1c. Templates on consecutive lines
-!!input
-{{echo|Foo}}
-{{echo|bar}} <div>baz</div>
-!!result
-<p>Foo
+!! article
+Template:table
+!! text
+{|
+| 1 || 2
+|-
+| 3 || 4
+|}
+!! endarticle
+
+!! test
+BUG 529: Template with table, not included at beginning of line
+!! input
+foo {{table}}
+!! result
+<p>foo 
 </p>
-bar <div>baz</div>
+<table>
+<tr>
+<td> 1 </td>
+<td> 2
+</td></tr>
+<tr>
+<td> 3 </td>
+<td> 4
+</td></tr></table>
 
-!!end
+!! end
 
-!!test
-Templates: Inline Text: 1. Multiple tmeplate uses
-!!input
-{{echo|Foo}}bar{{echo|baz}}
-!!result
-<p>Foobarbaz
+!! test
+BUG 523: Template shouldn't eat newline (or add an extra one before table)
+!! input
+foo
+{{table}}
+!! result
+<p>foo
 </p>
-!!end
+<table>
+<tr>
+<td> 1 </td>
+<td> 2
+</td></tr>
+<tr>
+<td> 3 </td>
+<td> 4
+</td></tr></table>
 
-!!test
-Templates: Inline Text: 2. Back-to-back template uses
-!!input
-{{echo|Foo}}{{echo|bar}}
-!!result
-<p>Foobar
+!! end
+
+!! test
+BUG 41: Template parameters shown as broken links
+!! input
+{{{parameter}}}
+!! result
+<p>{{{parameter}}}
 </p>
-!!end
+!! end
 
-!!test
-Templates: Block Tags: 1. Multiple template uses
-!!input
-{{echo|<div>Foo</div>}}<div>bar</div>{{echo|<div>baz</div>}}
-!!result
-<div>Foo</div><div>bar</div><div>baz</div>
+!! test
+Template with targets containing wikilinks
+!! input
+{{[[foo]]}}
 
-!!end
+{{[[{{echo|foo}}]]}}
 
-!!test
-Templates: Block Tags: 2. Back-to-back template uses
-!!input
-{{echo|<div>Foo</div>}}{{echo|<div>bar</div>}}
-!!result
-<div>Foo</div><div>bar</div>
+{{{{echo|[[foo}}]]}}
+!! result
+<p>{{<a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">foo</a>}}
+</p><p>{{<a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">foo</a>}}
+</p><p>{{[[foo}}]]
+</p>
+!! end
 
-!!end
+!! article
+Template:MSGNW test
+!! text
+''None'' of '''this''' should be 
+* interpreted
+ but rather passed unmodified
+{{test}}
+!! endarticle
 
-!!test
-Templates: Links: 1. Simple example
-!!input
-{{echo|[[Foo|bar]]}}
-!!result
-<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
+# hmm, fix this or just deprecate msgnw and document its behavior?
+!! test
+msgnw keyword
+!! options
+disabled
+!! input
+{{msgnw:MSGNW test}}
+!! result
+<p>''None'' of '''this''' should be 
+* interpreted
+ but rather passed unmodified
+{{test}}
 </p>
-!!end
+!! end
 
-!!test
-Templates: Links: 2. Generation of link href
-!!input
-[[{{echo|Foo}}|bar]]
-!!result
-<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
+!! test
+int keyword
+!! input
+{{int:youhavenewmessages|lots of money|not!}}
+!! result
+<p>You have lots of money (not!).
 </p>
-!!end
-
-!!test
-Templates: Links: 3. Generation of part of a link href
-!!input
-[[Fo{{echo|o}}|bar]]
-
-[[Foo{{echo|bar}}]]
+!! end
 
-[[Foo{{echo|bar}}baz]]
+!! article
+Template:Includes
+!! text
+Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
+!! endarticle
 
-[[Foo{{echo|bar}}|bar]]
+!! test
+<includeonly> and <noinclude> being included
+!! input
+{{Includes}}
+!! result
+<p>Foobar
+</p>
+!! end
 
-[[:Foo{{echo|bar}}]]
+!! article
+Template:Includes2
+!! text
+<onlyinclude>Foo</onlyinclude>bar
+!! endarticle
 
-[[:Foo{{echo|bar}}|bar]]
-!!result
-<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
-</p><p><a href="/index.php?title=Foobar&amp;action=edit&amp;redlink=1" class="new" title="Foobar (page does not exist)">Foobar</a>
-</p><p><a href="/index.php?title=Foobarbaz&amp;action=edit&amp;redlink=1" class="new" title="Foobarbaz (page does not exist)">Foobarbaz</a>
-</p><p><a href="/index.php?title=Foobar&amp;action=edit&amp;redlink=1" class="new" title="Foobar (page does not exist)">bar</a>
-</p><p><a href="/index.php?title=Foobar&amp;action=edit&amp;redlink=1" class="new" title="Foobar (page does not exist)">Foobar</a>
-</p><p><a href="/index.php?title=Foobar&amp;action=edit&amp;redlink=1" class="new" title="Foobar (page does not exist)">bar</a>
+!! test
+<onlyinclude> being included
+!! input
+{{Includes2}}
+!! result
+<p>Foo
 </p>
-!!end
+!! end
 
-!!test
-Templates: Links: 4. Multiple templates generating link href
-!!input
-[[{{echo|F}}{{echo|o}}ob{{echo|ar}}]]
-!!result
-<p><a href="/index.php?title=Foobar&amp;action=edit&amp;redlink=1" class="new" title="Foobar (page does not exist)">Foobar</a>
-</p>
-!!end
 
-!!test
-Templates: Links: 5. Generation of link text
-!!input
-[[Foo|{{echo|bar}}]]
-!!result
-<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
+!! article
+Template:Includes3
+!! text
+<onlyinclude>Foo</onlyinclude>bar<includeonly>zar</includeonly>
+!! endarticle
+
+!! test
+<onlyinclude> and <includeonly> being included
+!! input
+{{Includes3}}
+!! result
+<p>Foo
 </p>
-!!end
+!! end
+
+!! test
+<includeonly> and <noinclude> on a page
+!! input
+Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
+!! result
+<p>Foozar
+</p>
+!! end
+
+!! test
+Un-closed <noinclude>
+!! input
+<noinclude>
+!! result
+!! end
+
+!! test
+<onlyinclude> on a page
+!! input
+<onlyinclude>Foo</onlyinclude>bar
+!! result
+<p>Foobar
+</p>
+!! end
+
+!! test
+Un-closed <onlyinclude>
+!! input
+<onlyinclude>
+!! result
+!! end
 
 !!test
-Templates: Links: 5. Nested templates (only outermost template should be marked)
+Self-closed noinclude, includeonly, onlyinclude tags
 !!input
-{{echo|[[{{echo|Foo}}|bar]]}}
+<noinclude />
+<includeonly />
+<onlyinclude />
 !!result
-<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
+<p><br />
 </p>
 !!end
 
 !!test
-Templates: HTML Tag: 1. Generation of HTML attr. key
+Unbalanced includeonly and noinclude tags
 !!input
-<div {{echo|style}}="color:red;">foo</div>
+{|
+|a</noinclude>
+|b</noinclude></noinclude>
+|c</noinclude></includeonly>
+|d</includeonly></includeonly>
+|}
 !!result
-<div style="color:red;">foo</div>
+<table>
+<tr>
+<td>a
+</td>
+<td>b
+</td>
+<td>c&lt;/includeonly&gt;
+</td>
+<td>d&lt;/includeonly&gt;&lt;/includeonly&gt;
+</td></tr></table>
 
 !!end
 
-!!test
-Templates: HTML Tag: 2. Generation of HTML attr. value
-!!input
-<div style={{echo|'color:red;'}}>foo</div>
-!!result
-<div style="color:red;">foo</div>
+!! article
+Template:Includeonly section
+!! text
+<includeonly>
+==Includeonly section==
+</includeonly>
+==Section T-1==
+!!endarticle
+
+!! test
+Bug 6563: Edit link generation for section shown by <includeonly>
+!! input
+{{includeonly section}}
+!! result
+<h2><span class="mw-headline" id="Includeonly_section">Includeonly section</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-1" title="Template:Includeonly section">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_T-1">Section T-1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-2" title="Template:Includeonly section">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+
+!! end
+
+# Uses same input as the contents of [[Template:Includeonly section]]
+!! test
+Bug 6563: Section extraction for section shown by <includeonly>
+!! options
+section=T-2
+!! input
+<includeonly>
+==Includeonly section==
+</includeonly>
+==Section T-2==
+!! result
+==Section T-2==
+!! end
+
+!! test
+Bug 6563: Edit link generation for section suppressed by <includeonly>
+!! input
+<includeonly>
+==Includeonly section==
+</includeonly>
+==Section 1==
+!! result
+<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+
+!! end
+
+!! test
+Bug 6563: Section extraction for section suppressed by <includeonly>
+!! options
+section=1
+!! input
+<includeonly>
+==Includeonly section==
+</includeonly>
+==Section 1==
+!! result
+==Section 1==
+!! end
+
+!! test
+Un-closed <includeonly>
+!! input
+<includeonly>
+!! result
+!! end
+
+# TODO: test with DOM fragment reuse!
+!! test
+Parsoid: DOM fragment reuse
+!! options
+parsoid=wt2wt,wt2html
+!! input
+a{{echo|b<table></table>c}}d
+
+a{{echo|b
+<table></table>
+c}}d
+
+{{echo|a
+
+<table></table>
+
+b}}
+!! result
+a<span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b
+<table></table>c"}},"i":0}}]}'>b</span>
+<table about="#mwt1"></table><span about="#mwt1">c</span>d
+
+
+<p about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["a",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b\n<table></table>\nc"}},"i":0}},"d"]}'>ab</p><span about="#mwt2">
+</span>
+<table about="#mwt2"></table><span about="#mwt2">
+</span>
+<p about="#mwt2">cd</p>
 
-!!end
 
+<p about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n\n<table></table>\n\nb"}},"i":0}}]}'>a</p><span about="#mwt3">
+
+</span>
+<table about="#mwt3"></table><span about="#mwt3">
+
+</span>
+<p about="#mwt3">b</p>
+!! end
+
+!! test
+Parsoid: Merge double tds (bug 50603)
+!! options
+parsoid
+!! input
+{|
+|{{echo|{{!}} foo}}
+|}
+!! result
+<table><tbody>
+<tr><td about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}} foo"}},"i":0}}]}'> foo</td></tr>
+</tbody></table>
+!! end
+
+!! test
+Parsoid: Merge double tds in nested transclusion content (bug 50603)
+!! options
+parsoid
+!! input
+{{echo|<div>}}
+{|
+|{{echo|{{!}} foo}}
+|}
+{{echo|</div>}}
+!! result
+<div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<div>"}},"i":0}},"\n{|\n|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"{{!}} foo"}},"i":1}},"\n|}\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"</div>"}},"i":2}}]}'>
+<table><tbody>
+<tr><td data-mw='{"parts":["|"]}'> foo</td></tr>
+</tbody></table>
+</div>
+!! end
+
+###
+### <includeonly> and <noinclude> in attributes
+###
 !!test
-Templates: HTML Tag: 3. Generation of HTML attr key and value
+0. includeonly around the entire attribute
 !!input
-<div {{echo|style}}={{echo|'color:red;'}}>foo</div>
+<span <includeonly>id="v1"</includeonly><noinclude>id="v2"</noinclude>>bar</span>
 !!result
-<div style="color:red;">foo</div>
-
+<p><span id="v2">bar</span>
+</p>
 !!end
 
 !!test
-Templates: HTML Tag: 4. Generation of starting piece of HTML attr value
+1. includeonly in html attr key
 !!input
-<div title="{{echo|This is a long title}} with just one piece templated">foo</div>
+<span <noinclude>id</noinclude><includeonly>about</includeonly>="foo">bar</span>
 !!result
-<div title="This is a long title with just one piece templated">foo</div>
-
+<p><span id="foo">bar</span>
+</p>
 !!end
 
 !!test
-Templates: HTML Tag: 5. Generation of middle piece of HTML attr value
+2. includeonly in html attr value
 !!input
-<div title="This is a long title with just {{echo|one piece}} templated">foo</div>
+<span id="<noinclude>v1</noinclude><includeonly>v2</includeonly>">bar</span>
+<span id=<noinclude>"v1"</noinclude><includeonly>"v2"</includeonly>>bar</span>
 !!result
-<div title="This is a long title with just one piece templated">foo</div>
-
+<p><span id="v1">bar</span>
+<span id="v1">bar</span>
+</p>
 !!end
 
 !!test
-Templates: HTML Tag: 6. Generation of end piece of HTML attr value
+3. includeonly in part of an attr value
 !!input
-<div title="This is a long title with just one piece {{echo|templated}}">foo</div>
+<span style="color:<noinclude>red</noinclude><includeonly>blue</includeonly>;">bar</span>
 !!result
-<div title="This is a long title with just one piece templated">foo</div>
-
+<p><span style="color:red;">bar</span>
+</p>
 !!end
 
+###
+### Testing parsing of templates where a template arg
+### has the same name as the template itself.
+###
+
+!! article
+Template:quote
+!! text
+{{{quote|{{{1}}}}}}
+!! endarticle
+
 !!test
-Templates: HTML Tables: 1. Generating start of a HTML table
+Templates: Template Name/Arg clash: 1. Use of positional param
 !!input
-{{echo|<table><tr><td>foo</td>}}</tr></table>
+{{quote|foo}}
 !!result
-<table><tr><td>foo</td></tr></table>
-
+<p>foo
+</p>
 !!end
 
 !!test
-Templates: HTML Tables: 2a. Generating middle of a HTML table
+Templates: Template Name/Arg clash: 2. Use of named param
 !!input
-<table><tr>{{echo|<td>foo</td>}}</tr></table>
+{{quote|quote=foo}}
 !!result
-<table><tr><td>foo</td></tr></table>
-
+<p>foo
+</p>
 !!end
 
 !!test
-Templates: HTML Tables: 2b. Generating middle of a HTML table
+Templates: Template Name/Arg clash: 3. Use of named param with empty input
 !!input
-<table>{{echo|<tr><td>foo</td></tr>}}</table>
+{{quote|quote}}
 !!result
-<table><tr><td>foo</td></tr></table>
-
+<p>quote
+</p>
 !!end
 
+###
+### Parsoid-centric tests to stress Parsoid's ability to RT them unchanged
+###
+
 !!test
-Templates: HTML Tables: 3. Generating end of a HTML table
+Templates: 1. Simple use
 !!input
-<table><tr>{{echo|<td>foo</td></tr></table>}}
+{{echo|Foo}}
 !!result
-<table><tr><td>foo</td></tr></table>
-
+<p>Foo
+</p>
 !!end
 
 !!test
-Templates: HTML Tables: 4a. Generating a single tag of a HTML table
+Templates: 2. Inside a block tag
 !!input
-{{echo|<table>}}<tr><td>foo</td></tr></table>
+<div>{{echo|Foo}}</div>
+<blockquote>{{echo|Foo}}</blockquote>
 !!result
-<table><tr><td>foo</td></tr></table>
+<div>Foo</div>
+<blockquote>Foo</blockquote>
 
 !!end
 
 !!test
-Templates: HTML Tables: 4b. Generating a single tag of a HTML table
+Templates: P-wrapping: 1a. Templates on consecutive lines
 !!input
-<table>{{echo|<tr>}}<td>foo</td></tr></table>
+{{echo|Foo}}
+{{echo|bar}}
 !!result
-<table><tr><td>foo</td></tr></table>
+<p>Foo
+bar
+</p>
+!!end
+
+!!test
+Templates: P-wrapping: 1b. Templates on consecutive lines
+!!input
+Foo
 
+{{echo|bar}}
+{{echo|baz}}
+!!result
+<p>Foo
+</p><p>bar
+baz
+</p>
 !!end
 
 !!test
-Templates: HTML Tables: 4c. Generating a single tag of a HTML table
+Templates: P-wrapping: 1c. Templates on consecutive lines
 !!input
-<table><tr>{{echo|<td>}}foo</td></tr></table>
+{{echo|Foo}}
+{{echo|bar}} <div>baz</div>
 !!result
-<table><tr><td>foo</td></tr></table>
+<p>Foo
+</p>
+bar <div>baz</div>
 
 !!end
 
 !!test
-Templates: HTML Tables: 4d. Generating a single tag of a HTML table
+Templates: P-wrapping: 1d. Template preceded by comment-only line
+!!options
+parsoid
 !!input
-<table><tr><td>foo{{echo|</td>}}</tr></table>
+<!-- foo -->
+{{echo|Bar}}
 !!result
-<table><tr><td>foo</td></tr></table>
+<!-- foo -->
 
+<p about="#mwt223" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"Bar"}},"i":0}}]}'>Bar</p>
 !!end
 
 !!test
-Templates: HTML Tables: 4e. Generating a single tag of a HTML table
+Templates: Inline Text: 1. Multiple tmeplate uses
 !!input
-<table><tr><td>foo</td>{{echo|</tr>}}</table>
+{{echo|Foo}}bar{{echo|baz}}
 !!result
-<table><tr><td>foo</td></tr></table>
+<p>Foobarbaz
+</p>
+!!end
 
+!!test
+Templates: Inline Text: 2. Back-to-back template uses
+!!input
+{{echo|Foo}}{{echo|bar}}
+!!result
+<p>Foobar
+</p>
 !!end
 
 !!test
-Templates: HTML Tables: 4f. Generating a single tag of a HTML table
+Templates: Block Tags: 1. Multiple template uses
 !!input
-<table><tr><td>foo</td></tr>{{echo|</table>}}
+{{echo|<div>Foo</div>}}<div>bar</div>{{echo|<div>baz</div>}}
 !!result
-<table><tr><td>foo</td></tr></table>
+<div>Foo</div><div>bar</div><div>baz</div>
 
 !!end
 
 !!test
-Templates: Wiki Tables: 1a. Fostering of entire template content
+Templates: Block Tags: 2. Back-to-back template uses
 !!input
-{|
-{{echo|a}}
-|}
+{{echo|<div>Foo</div>}}{{echo|<div>bar</div>}}
 !!result
-<table>
-a
-<tr><td></td></tr></table>
+<div>Foo</div><div>bar</div>
 
 !!end
 
 !!test
-Templates: Wiki Tables: 1b. Fostering of entire template content
+Templates: Links: 1. Simple example
 !!input
-{|
-{{echo|<div>}}
-foo
-{{echo|</div>}}
-|}
+{{echo|[[Foo|bar]]}}
 !!result
-<table>
-<div>
-<p>foo
+<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
 </p>
-</div>
-<tr><td></td></tr></table>
+!!end
 
+!!test
+Templates: Links: 2. Generation of link href
+!!input
+[[{{echo|Foo}}|bar]]
+!!result
+<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
+</p>
 !!end
 
 !!test
-Templates: Wiki Tables: 2. Fostering of partial template content
+Templates: Links: 3. Generation of part of a link href
 !!input
-{|
-{{echo|a
-<div>b</div>}}
-|}
+[[Fo{{echo|o}}|bar]]
+
+[[Foo{{echo|bar}}]]
+
+[[Foo{{echo|bar}}baz]]
+
+[[Foo{{echo|bar}}|bar]]
+
+[[:Foo{{echo|bar}}]]
+
+[[:Foo{{echo|bar}}|bar]]
 !!result
-<table>
-a
-<div>b</div>
-<tr><td></td></tr></table>
+<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
+</p><p><a href="/index.php?title=Foobar&amp;action=edit&amp;redlink=1" class="new" title="Foobar (page does not exist)">Foobar</a>
+</p><p><a href="/index.php?title=Foobarbaz&amp;action=edit&amp;redlink=1" class="new" title="Foobarbaz (page does not exist)">Foobarbaz</a>
+</p><p><a href="/index.php?title=Foobar&amp;action=edit&amp;redlink=1" class="new" title="Foobar (page does not exist)">bar</a>
+</p><p><a href="/index.php?title=Foobar&amp;action=edit&amp;redlink=1" class="new" title="Foobar (page does not exist)">Foobar</a>
+</p><p><a href="/index.php?title=Foobar&amp;action=edit&amp;redlink=1" class="new" title="Foobar (page does not exist)">bar</a>
+</p>
+!!end
 
+!!test
+Templates: Links: 4. Multiple templates generating link href
+!!input
+[[{{echo|F}}{{echo|o}}ob{{echo|ar}}]]
+!!result
+<p><a href="/index.php?title=Foobar&amp;action=edit&amp;redlink=1" class="new" title="Foobar (page does not exist)">Foobar</a>
+</p>
 !!end
 
 !!test
-Templates: Wiki Tables: 3. td-content via multiple templates
+Templates: Links: 5. Generation of link text
 !!input
-{|
-{{echo|{{pipe}}a}}{{echo|b}}
-|}
+[[Foo|{{echo|bar}}]]
 !!result
-<table>
-<tr>
-<td>ab
-</td></tr></table>
+<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
+</p>
+!!end
 
+!!test
+Templates: Links: 5. Nested templates (only outermost template should be marked)
+!!input
+{{echo|[[{{echo|Foo}}|bar]]}}
+!!result
+<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
+</p>
 !!end
 
 !!test
-Templates: Wiki Tables: 4. Templated tags, no content
+Templates: HTML Tag: 1. Generation of HTML attr. key
 !!input
-{{tbl-start}}
-{{tbl-end}}
+<div {{echo|style}}="color:red;">foo</div>
 !!result
-<table>
-<tr><td></td></tr></table>
+<div style="color:red;">foo</div>
 
 !!end
 
 !!test
-Templates: Wiki Tables: 5. Templated tags, regular td-tags
+Templates: HTML Tag: 2. Generation of HTML attr. value
 !!input
-{{tbl-start}}
-|foo
-{{tbl-end}}
+<div style={{echo|'color:red;'}}>foo</div>
 !!result
-<table>
-<tr>
-<td>foo
-</td></tr></table>
+<div style="color:red;">foo</div>
 
 !!end
 
 !!test
-Templates: Wiki Tables: 6. Templated tags, templated td-tags
+Templates: HTML Tag: 3. Generation of HTML attr key and value
 !!input
-{{tbl-start}}
-{{!}}foo
-{{tbl-end}}
+<div {{echo|style}}={{echo|'color:red;'}}>foo</div>
 !!result
-<table>
-<tr>
-<td>foo
-</td></tr></table>
+<div style="color:red;">foo</div>
 
 !!end
 
 !!test
-Templates: Lists: Multi-line list-items via templates
+Templates: HTML Tag: 4. Generation of starting piece of HTML attr value
 !!input
-*{{echo|a {{nonexistent|
-unused}}}}
-*{{echo|b {{nonexistent|
-unused}}}}
+<div title="{{echo|This is a long title}} with just one piece templated">foo</div>
 !!result
-<ul><li>a <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
-</li><li>b <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
-</li></ul>
+<div title="This is a long title with just one piece templated">foo</div>
 
 !!end
 
 !!test
-Templates: Ugly nesting: 1. Quotes opened/closed across templates (echo)
+Templates: HTML Tag: 5. Generation of middle piece of HTML attr value
 !!input
-{{echo|''a}}{{echo|b''c''d}}{{echo|''e}}
+<div title="This is a long title with just {{echo|one piece}} templated">foo</div>
 !!result
-<p><i>ab</i>c<i>d</i>e
-</p>
+<div title="This is a long title with just one piece templated">foo</div>
+
 !!end
 
 !!test
-Templates: Ugly nesting: 2. Quotes opened/closed across templates (echo_with_span)
-(PHP parser generates misnested html)
-!! options
-disabled
+Templates: HTML Tag: 6. Generation of end piece of HTML attr value
 !!input
-{{echo_with_span|''a}}{{echo_with_span|b''c''d}}{{echo_with_span|''e}}
+<div title="This is a long title with just one piece {{echo|templated}}">foo</div>
 !!result
-<p><span><i>a</i></span><i><span>b</span></i><span>c</span><i>d</i><span>e</span></p>
+<div title="This is a long title with just one piece templated">foo</div>
+
 !!end
 
 !!test
-Templates: Ugly nesting: 3. Quotes opened/closed across templates (echo_with_div)
-(PHP parser generates misnested html)
-!! options
-disabled
+Templates: HTML Tag: 7. Generation of partial attribute key string
 !!input
-{{echo_with_div|''a}}{{echo_with_div|b''c''d}}{{echo_with_div|''e}}
+<div st{{echo|yle}}="color:red;">foo</div>
 !!result
-<div><i>a</i></div>
-<div><i>b</i>c<i>d</i></div>
-<div>e</div>
+<div style="color:red;">foo</div>
+
 !!end
 
 !!test
-Templates: Ugly nesting: 4. Divs opened/closed across templates
+Templates: HTML Tables: 1. Generating start of a HTML table
 !!input
-a<div>b{{echo|c</div>d}}e
+{{echo|<table><tr><td>foo</td>}}</tr></table>
 !!result
-a<div>bc</div>de
+<table><tr><td>foo</td></tr></table>
 
 !!end
 
 !!test
-Templates: Ugly templates: 1. Navbox template parses badly leading to table misnesting
-(Parsoid-centric)
-!! options
-parsoid
+Templates: HTML Tables: 2a. Generating middle of a HTML table
 !!input
-{|
-|{{echo|foo</table>}}
-|bar
-|}
+<table><tr>{{echo|<td>foo</td>}}</tr></table>
 !!result
-<table  about="#mwt1" typeof="mw:Object/Template ">
-<tbody><tr><td>foo</td></tr></tbody></table><span about="#mwt1">
-bar</span><span about="#mwt1">
-</span>
+<table><tr><td>foo</td></tr></table>
+
 !!end
 
 !!test
-Templates: Ugly templates: 2. Navbox template parses badly leading to table misnesting
-(Parsoid-centric)
-!! options
+Templates: HTML Tables: 2b. Generating middle of a HTML table
+!!input
+<table>{{echo|<tr><td>foo</td></tr>}}</table>
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 3. Generating end of a HTML table
+!!input
+<table><tr>{{echo|<td>foo</td></tr></table>}}
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 4a. Generating a single tag of a HTML table
+!!input
+{{echo|<table>}}<tr><td>foo</td></tr></table>
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 4b. Generating a single tag of a HTML table
+!!input
+<table>{{echo|<tr>}}<td>foo</td></tr></table>
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 4c. Generating a single tag of a HTML table
+!!input
+<table><tr>{{echo|<td>}}foo</td></tr></table>
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 4d. Generating a single tag of a HTML table
+!!input
+<table><tr><td>foo{{echo|</td>}}</tr></table>
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 4e. Generating a single tag of a HTML table
+!!input
+<table><tr><td>foo</td>{{echo|</tr>}}</table>
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 4f. Generating a single tag of a HTML table
+!!input
+<table><tr><td>foo</td></tr>{{echo|</table>}}
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 5. Proper fostering of categories from inside
+!!options
+parsoid=wt2html,wt2wt
+!!input
+<table>[[Category:foo1]]<tr><td>foo</td></tr></table>
+<!--Two categories (Bug 50330)-->
+<table>[[Category:bar1]][[Category:bar2]]<tr><td>foo</td></tr></table>
+!!result
+<link rel="mw:WikiLink/Category" href="./Category:Foo1"><table><tbody><tr><td>foo</td></tr></tbody></table>
+<!--Two categories (Bug 50330)-->
+<link rel="mw:WikiLink/Category" href="./Category:Bar1"><link rel="mw:WikiLink/Category" href="./Category:Bar2"><table><tbody><tr><td>foo</td></tr></tbody></table>
+!!end
+
+!!test
+Templates: Wiki Tables: 1a. Fostering of entire template content
+!!input
+{|
+{{echo|a}}
+|}
+!!result
+<table>
+a
+<tr><td></td></tr></table>
+
+!!end
+
+!!test
+Templates: Wiki Tables: 1b. Fostering of entire template content
+!!input
+{|
+{{echo|<div>}}
+foo
+{{echo|</div>}}
+|}
+!!result
+<table>
+<div>
+<p>foo
+</p>
+</div>
+<tr><td></td></tr></table>
+
+!!end
+
+!!test
+Templates: Wiki Tables: 2. Fostering of partial template content
+!!input
+{|
+{{echo|a
+<div>b</div>}}
+|}
+!!result
+<table>
+a
+<div>b</div>
+<tr><td></td></tr></table>
+
+!!end
+
+!!test
+Templates: Wiki Tables: 3. td-content via multiple templates
+!!input
+{|
+{{echo|{{pipe}}a}}{{echo|b}}
+|}
+!!result
+<table>
+<tr>
+<td>ab
+</td></tr></table>
+
+!!end
+
+!!test
+Templates: Wiki Tables: 4. Templated tags, no content
+!!input
+{{tbl-start}}
+{{tbl-end}}
+!!result
+<table>
+<tr><td></td></tr></table>
+
+!!end
+
+!!test
+Templates: Wiki Tables: 5. Templated tags, regular td-tags
+!!input
+{{tbl-start}}
+|foo
+{{tbl-end}}
+!!result
+<table>
+<tr>
+<td>foo
+</td></tr></table>
+
+!!end
+
+!!test
+Templates: Wiki Tables: 6. Templated tags, templated td-tags
+!!input
+{{tbl-start}}
+{{!}}foo
+{{tbl-end}}
+!!result
+<table>
+<tr>
+<td>foo
+</td></tr></table>
+
+!!end
+
+!!test
+Templates: Lists: Multi-line list-items via templates
+!!input
+*{{echo|a {{nonexistent|
+unused}}}}
+*{{echo|b {{nonexistent|
+unused}}}}
+!!result
+<ul>
+<li>a <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
+</li>
+<li>b <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
+</li>
+</ul>
+
+!!end
+
+!!test
+Templates: Ugly nesting: 1. Quotes opened/closed across templates (echo)
+!!input
+{{echo|''a}}{{echo|b''c''d}}{{echo|''e}}
+!!result
+<p><i>ab</i>c<i>d</i>e
+</p>
+!!end
+
+!!test
+Templates: Ugly nesting: 2. Quotes opened/closed across templates (echo_with_span)
+(PHP parser generates misnested html)
+!! options
+parsoid
+!!input
+{{echo_with_span|''a}}{{echo_with_span|b''c''d}}{{echo_with_span|''e}}
+!!result
+<p><span about="#mwt1" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_span&quot;,&quot;href&quot;:&quot;./Template:Echo_with_span&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''a&quot;}},&quot;i&quot;:0}}]}"><i>a</i></span><i about="#mwt2" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_span&quot;,&quot;href&quot;:&quot;./Template:Echo_with_span&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;b''c''d&quot;}},&quot;i&quot;:0}},{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_span&quot;,&quot;href&quot;:&quot;./Template:Echo_with_span&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''e&quot;}},&quot;i&quot;:1}}]}"><span>b</span></i><span about="#mwt2">c</span><i about="#mwt2">d<span></span></i><span about="#mwt2">e</span></p>
+!!end
+
+!!test
+Templates: Ugly nesting: 3. Quotes opened/closed across templates (echo_with_div)
+(PHP parser generates misnested html; Parsoid html2wt mode adds newlines between {{echo}}s)
+!! options
+parsoid=wt2html,wt2wt
+!!input
+{{echo_with_div|''a}}{{echo_with_div|b''c''d}}{{echo_with_div|''e}}
+!!result
+<div about="#mwt1" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_div&quot;,&quot;href&quot;:&quot;./Template:Echo_with_div&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''a&quot;}},&quot;i&quot;:0}}]}"><i>a</i></div>
+<div about="#mwt2" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_div&quot;,&quot;href&quot;:&quot;./Template:Echo_with_div&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;b''c''d&quot;}},&quot;i&quot;:0}}]}"><i>b</i>c<i>d</i></div>
+<div about="#mwt3" typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo_with_div&quot;,&quot;href&quot;:&quot;./Template:Echo_with_div&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;''e&quot;}},&quot;i&quot;:0}}]}">e</div>
+!!end
+
+!!test
+Templates: Ugly nesting: 4. Divs opened/closed across templates
+!!input
+a<div>b{{echo|c</div>d}}e
+!!result
+a<div>bc</div>de
+
+!!end
+
+!!test
+Templates: Ugly templates: 1. Navbox template parses badly leading to table misnesting
+(Parsoid-centric)
+!! options
+parsoid
+!!input
+{|
+|{{echo|foo</table>}}
+|bar
+|}
+!!result
+<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":["{|\n|",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo</table>"}},"i":0}},"\n|bar\n|}"]}'>
+
+<tbody>
+<tr>
+<td>foo</td></tr></tbody></table><span about="#mwt1">
+</span><span about="#mwt1">bar</span><span about="#mwt1">
+</span>
+!!end
+
+!!test
+Templates: Ugly templates: 2. Navbox template parses badly leading to table misnesting
+(Parsoid-centric)
+!! options
 parsoid
 !!input
 <table>
@@ -6058,24 +8487,24 @@ parsoid
   </tr>
 </table>
 !!result
-<table  about="#mwt1" typeof="mw:Object/Template">
-  <tbody><tr >
-    <td >
-    <table >
-      <tbody><tr >
-        <td >1. foo </td></tr></tbody></table></td>
-        <td > bar </td>
-        <td >2. baz </td></tr></tbody></table><span about="#mwt1">
-      </span><span about="#mwt1">
-      
-        abc</span><span about="#mwt1">
-      </span><span about="#mwt1">
-    </span><span about="#mwt1">
-    </span><span about="#mwt1">
-  </span><span about="#mwt1">
-  
-    xyz</span><span about="#mwt1">
-  </span><span about="#mwt1">
+<table about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":["<table>\n  <tr>\n    <td>\n    <table>\n      <tr>\n        <td>1. ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo </table>"}},"i":0}},"</td>\n        <td> bar </td>\n        <td>2. ",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"baz </table>"}},"i":1}},"</td>\n      </tr>\n      <tr>\n        <td>abc</td>\n      </tr>\n    </table>\n    </td>\n  </tr>\n  <tr>\n    <td>xyz</td>\n  </tr>\n</table>"]}'>
+  <tbody><tr>
+    <td>
+    <table>
+      <tbody><tr>
+        <td>1. foo </td></tr></tbody></table></td>
+        <td> bar </td>
+        <td>2. baz </td></tr></tbody></table><span about="#mwt2">
+      </span><span about="#mwt2">
+      </span><span about="#mwt2">
+        </span><span about="#mwt2">abc</span><span about="#mwt2">
+      </span><span about="#mwt2">
+    </span><span about="#mwt2">
+    </span><span about="#mwt2">
+  </span><span about="#mwt2">
+  </span><span about="#mwt2">
+    </span><span about="#mwt2">xyz</span><span about="#mwt2">
+  </span><span about="#mwt2">
 </span>
 !!end
 
@@ -6237,10 +8666,13 @@ wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
 wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
 !!end
 
+# Leading @ in this template definition works around a limitation
+# in parsoid's parserTests which otherwise strips the <span> from the
+# result (confusing it for a template wrapper)
 !! article
 Template:dangerous
 !!text
-<span onmouseover="alert('crap')">Oh no</span>
+@<span onmouseover="alert('crap')">Oh no</span>
 !!endarticle
 
 !!test
@@ -6248,7 +8680,7 @@ Template:dangerous
 !! input
 {{Template:dangerous}}
 !! result
-<p><span>Oh no</span>
+<p>@<span>Oh no</span>
 </p>
 !! end
 
@@ -6637,15 +9069,71 @@ But not inside includeonly
 <includeonly>{{subst:Foo}}</includeonly>
 !! end
 
-###
-### Message transform tests
-###
 !! test
-message transform: magic variables
+Parsoid: Recognize nowiki with trailing space in tags
 !! options
-msg
+parsoid=wt2html
 !! input
-{{SITENAME}}
+<nowiki ><div>[[foo]]</nowiki >
+
+a<nowiki / >b
+
+c<nowiki />d
+
+e<nowiki/ >f
+!! result
+<p><span typeof="mw:Nowiki">&lt;div&gt;[[foo]]</span></p>
+<p>ab</p>
+<p>cd</p>
+<p>ef</p>
+!! end
+
+!! test
+Parsoid: Recognize nowiki with odd capitalization
+!! options
+parsoid=wt2html
+!! input
+<noWikI ><div>[[foo]]</Nowiki >
+!! result
+<p><span typeof="mw:Nowiki">&lt;div&gt;[[foo]]</span></p>
+!! end
+
+
+!! test
+Parsoid: Escape nowiki with trailing space in tags
+!! options
+parsoid=html2wt
+!! input
+&lt;nowiki &gt; foo &lt;/nowiki &gt;
+
+a&lt;nowiki /&gt;b
+
+c&lt;nowiki/ &gt;d
+!! result
+<p>&lt;nowiki &gt; foo &lt/nowiki ></p>
+<p>a&lt;nowiki /&gt;b</p>
+<p>c&lt;nowiki/ &gt;d</p>
+!! end
+
+!! test
+Parsoid: Escape weird noWikI capitalizations
+!! options
+parsoid=html2wt
+!! input
+&lt;noWikI &gt; foo &lt;/NoWikI &gt;
+!! result
+<p>&lt;noWikI &gt; foo &lt/NoWikI ></p>
+!! end
+
+###
+### Message transform tests
+###
+!! test
+message transform: magic variables
+!! options
+msg
+!! input
+{{SITENAME}}
 !! result
 MediaWiki
 !! end
@@ -6705,9 +9193,9 @@ Special:RecentChanges/param
 !! options
 msg
 !! input
-{{#special:foobarnonexistent}}
+{{#special:foobar nonexistent}}
 !! result
-No such special page
+Special:Foobar nonexistent
 !! end
 
 !! test
@@ -6735,16 +9223,21 @@ Special:RecentChanges/param
 !! options
 msg
 !! input
-{{#speciale:foobarnonexistent}}
+{{#speciale:foobar nonexistent}}
 !! result
-No_such_special_page
+Special:Foobar_nonexistent
 !! end
 
 ###
 ### Images
 ###
+### For Parsoid-specific tests, see
+#### http://www.mediawiki.org/wiki/Parsoid/MediaWiki_DOM_spec#Images
+
 !! test
-Simple image
+Simple image (php)
+!! options
+php
 !! input
 [[Image:foobar.jpg]]
 !! result
@@ -6753,16 +9246,20 @@ Simple image
 !! end
 
 !! test
-Right-aligned image
+Simple image (parsoid)
+!! options
+parsoid=wt2html
 !! input
-[[Image:foobar.jpg|right]]
+[[Image:foobar.jpg]]
 !! result
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-
+<p><span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span>
+</p>
 !! end
 
 !! test
-Simple image (using File: namespace, now canonical)
+Simple image (using File: namespace, now canonical) (php)
+!! options
+php
 !! input
 [[File:foobar.jpg]]
 !! result
@@ -6771,29 +9268,108 @@ Simple image (using File: namespace, now canonical)
 !! end
 
 !! test
-Image with caption
+Simple image (using File: namespace, now canonical) (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg]]
+!! result
+<p><span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span>
+</p>
+!! end
+
+!! test
+Right-aligned image (php)
+!! options
+php
+!! input
+[[Image:foobar.jpg|right]]
+!! result
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! end
+
+!! test
+Right-aligned image (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|right]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></figure>
+!! end
+
+!! test
+Image with caption (php)
+!! options
+php
+!! input
+[[File:Foobar.jpg|right|Caption text]]
+!! result
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
+!! end
+
+!! test
+Image with caption (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|right|Caption text]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
+!! end
+
+!! test
+Image with empty attribute (php)
+!! options
+php
 !! input
-[[Image:foobar.jpg|right|Caption text]]
+[[File:Foobar.jpg|right||Caption text]]
 !! result
 <div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
 
 !! end
 
 !! test
-Image with empty attribute
+Image with empty attribute (parsoid)
+!! options
+parsoid=wt2html
+!! input
+[[File:Foobar.jpg|right||Caption text]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
+!! end
+
+!! test
+Image with attributes from template (php)
+!! options
+php
 !! input
-[[Image:foobar.jpg|right||Caption text]]
+[[File:Foobar.jpg|{{image_attribs}}]]
 !! result
 <div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
 
 !! end
 
 !! test
-Image with link tails
+Image with attributes from template (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|{{image_attribs}}]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption text</figcaption></figure>
+!! end
+
+!! test
+Image with link tails (php)
+!! options
+php
 !! input
-123[[Image:foobar.jpg]]456
-123[[Image:foobar.jpg|right]]456
-123[[Image:foobar.jpg|thumb]]456
+123[[File:Foobar.jpg]]456
+123[[File:Foobar.jpg|right]]456
+123[[File:Foobar.jpg|thumb]]456
 !! result
 <p>123<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>456
 </p>
@@ -6803,20 +9379,48 @@ Image with link tails
 !! end
 
 !! test
-Image with multiple captions -- only last one is accepted
+Image with link tails (parsoid)
+!! options
+parsoid
+!! input
+123[[File:Foobar.jpg]]456
+123[[File:Foobar.jpg|right]]456
+123[[File:Foobar.jpg|thumb]]456
+!! result
+<p>123<span class="mw-default-size" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span>456</p>
+123<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></figure>456
+123<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="20" width="180"></a></figure>456
+!! end
+
+!! test
+Image with multiple captions -- only last one is accepted (php)
+!! options
+php
 !! input
-[[Image:foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]]
+[[File:Foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]]
 !! result
 <div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption3 - accepted"><img alt="Caption3 - accepted" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
 
 !! end
 
 !! test
-Image with width attribute at different positions
+Image with multiple captions -- only last one is accepted (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]]
+!! result
+<figure class="mw-default-size mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a><figcaption>Caption3 - accepted</figcaption></figure>
+!! end
+
+!! test
+Image with width attribute at different positions (php)
+!! options
+php
 !! input
-[[Image:foobar.jpg|200px|right|Caption]]
-[[Image:foobar.jpg|right|200px|Caption]]
-[[Image:foobar.jpg|right|Caption|200px]]
+[[File:Foobar.jpg|200px|right|Caption]]
+[[File:Foobar.jpg|right|200px|Caption]]
+[[File:Foobar.jpg|right|Caption|200px]]
 !! result
 <div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
 <div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
@@ -6825,23 +9429,84 @@ Image with width attribute at different positions
 !! end
 
 !! test
-Image with link parameter, wiki target
+Image with width attribute at different positions (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|200px|right|Caption]]
+[[File:Foobar.jpg|right|200px|Caption]]
+[[File:Foobar.jpg|right|Caption|200px]]
+!! result
+<figure class="mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>Caption</figcaption></figure>
+<figure class="mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>Caption</figcaption></figure>
+<figure class="mw-halign-right" typeof="mw:Image"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" height="23" width="200"></a><figcaption>Caption</figcaption></figure>
+!! end
+
+!! test
+Image with link parameter, wiki target (php)
+!! options
+php
 !! input
-[[Image:foobar.jpg|link=Target page]]
+[[File:Foobar.jpg|link=Main Page]]
 !! result
-<p><a href="/wiki/Target_page" title="Target page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/Main_Page" title="Main Page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
 !! test
-Image with link parameter, URL target
+Image with link parameter, wiki target (parsoid)
+!! options
+parsoid
 !! input
-[[Image:foobar.jpg|link=http://example.com/]]
+[[File:Foobar.jpg|link=Main Page]]
+!! result
+<p><span class="mw-default-size" typeof="mw:Image"><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
+!! end
+
+!! test
+Image with link parameter, URL target (php)
+!! options
+php
+!! input
+[[File:Foobar.jpg|link=http://example.com/]]
 !! result
 <p><a href="http://example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
+# parsoid bug 49293 (part 1)
+!! test
+Image with link parameter, URL target (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|link=http://example.com/]]
+!! result
+<p><span class="mw-default-size" typeof="mw:Image"><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
+!! end
+
+!! test
+Image with link parameter, protocol-less URL target (php)
+!! options
+php
+!! input
+[[File:Foobar.jpg|link=//example.com/]]
+!! result
+<p><a href="//example.com/" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
+!! end
+
+# parsoid bug 49293 (part 2)
+!! test
+Image with link parameter, protocol-less URL target (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|link=//example.com/]]
+!! result
+<p><span class="mw-default-size" typeof="mw:Image"><a href="//example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
+!! end
+
 !! test
 Image with link parameter, wgExternalLinkTarget
 !! input
@@ -6887,34 +9552,72 @@ wgExternalLinkTarget='foobar'
 !! end
 
 !! test
-Image with empty link parameter
+Image with empty link parameter (php)
+!! options
+php
 !! input
-[[Image:foobar.jpg|link=]]
+[[File:Foobar.jpg|link=]]
 !! result
 <p><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" />
 </p>
 !! end
 
 !! test
-Image with link parameter (wiki target) and unnamed parameter
+Image with empty link parameter (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|link=]]
+!! result
+<p><span class="mw-default-size" typeof="mw:Image"><span><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></span></span></p>
+!! end
+
+!! test
+Image with link parameter (wiki target) and unnamed parameter (php)
+!! options
+php
 !! input
-[[Image:foobar.jpg|link=Target page|Title]]
+[[File:Foobar.jpg|link=Main Page|Title]]
 !! result
-<p><a href="/wiki/Target_page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/Main_Page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
 !! test
-Image with link parameter (URL target) and unnamed parameter
+Image with link parameter (wiki target) and unnamed parameter (parsoid)
+!! options
+parsoid
 !! input
-[[Image:foobar.jpg|link=http://example.com/|Title]]
+[[File:Foobar.jpg|link=Main Page|Title]]
+!! result
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="Main_Page"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
+!! end
+
+!! test
+Image with link parameter (URL target) and unnamed parameter (php)
+!! options
+php
+!! input
+[[File:Foobar.jpg|link=http://example.com/|Title]]
 !! result
 <p><a href="http://example.com/" title="Title" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
+!! test
+Image with link parameter (URL target) and unnamed parameter (parsoid)
+!! options
+parsoid
+!! input
+[[File:Foobar.jpg|link=http://example.com/|Title]]
+!! result
+<p><span class="mw-default-size" typeof="mw:Image" data-mw='{"caption":"Title"}'><a href="http://example.com/"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"></a></span></p>
+!! end
+
 !! test
 Thumbnail image with link parameter
+!! options
+php
 !! input
 [[Image:foobar.jpg|thumb|link=http://example.com/|Title]]
 !! result
@@ -6922,6 +9625,61 @@ Thumbnail image with link parameter
 
 !! end
 
+!! test
+Manually-specified thumbnail image
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Foobar.jpg"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
+!! end
+
+!! test
+Manually-specified thumbnail image with explicit link to wiki page
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
+!! end
+
+!! test
+Manually-specified thumbnail image with explicit link to url
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|link=http://example.com|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="http://example.com"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
+!! end
+
+!! test
+Manually-specified thumbnail image with explicit no link
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|link=|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" />  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
+!! end
+
+!! test
+Manually-specified thumbnail image with explicit link and alt text
+!! options
+php
+!! input
+[[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|alt=alttext|Title]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="alttext" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
+!! end
+
 !! test
 Image with frame and link
 !! input
@@ -7005,6 +9763,36 @@ Thumbnail image caption with a free URL and explicit alt
 
 !! end
 
+!! test
+SVG thumbnails with no language set
+!! options
+!! input
+[[File:Foobar.svg|thumb|width=200]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>width=200</div></div></div>
+
+!! end
+
+!! test
+SVG thumbnails with language de
+!! options
+!! input
+[[File:Foobar.svg|thumb|width=200|lang=de]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=File:Foobar.svg&amp;lang=de" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>width=200</div></div></div>
+
+!! end
+
+!! test
+SVG thumbnails with invalid language code
+!! options
+!! input
+[[File:Foobar.svg|thumb|width=200|lang=invalid.language.code]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.svg" class="image"><img alt="" src="http://example.com/images/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png" width="180" height="180" class="thumbimage" srcset="http://example.com/images/thumb/f/ff/Foobar.svg/270px-Foobar.svg.png 1.5x, http://example.com/images/thumb/f/ff/Foobar.svg/360px-Foobar.svg.png 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.svg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>lang=invalid.language.code</div></div></div>
+
+!! end
+
 !! test
 BUG 1887: A ISBN with a thumbnail
 !! input
@@ -7200,38 +9988,216 @@ wgEnableUploads=0
 </p>
 !! end
 
-
-###
-### Subpages
-###
-!! article
-Subpage test/subpage
-!! text
-foo
-!! endarticle
+# Parsoid-specific testing for images
+# http://www.mediawiki.org/wiki/Parsoid/MediaWiki_DOM_spec#Images
+# Currently imperfect due to a flaw in the Parsoid testrunner
+# Work in progress
+# THESE TESTS SHOULD BE MOVED UP and merged with the php-specific
+# image tests.
 
 !! test
-Subpage link
+Parsoid-specific image handling - simple image with size and middle alignment
 !! options
-subpage title=[[Subpage test]]
+parsoid
 !! input
-[[/subpage]]
+[[Image:Foobar.jpg|50px|middle]]
 !! result
-<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a>
+<p>
+<span class="mw-valign-middle" typeof="mw:Image">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50">
+</a>
+</span>
 </p>
 !! end
 
 !! test
-Subpage noslash link
+Parsoid-specific image handling - simple image with both sizes, a baseline alignment, and a caption
 !! options
-subpage title=[[Subpage test]]
-!!input
-[[/subpage/]]
+parsoid
+!! input
+[[Image:Foobar.jpg|500x10px|baseline|caption]]
+!! result
+<p>
+<span class="mw-valign-baseline" typeof="mw:Image" data-mw="{&quot;caption&quot;:&quot;caption&quot;}">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/89px-Foobar.jpg" height="10" width="89">
+</a>
+</span>
+</p>
+!! end
+
+!! test
+Parsoid-specific image handling - simple image with border and size spec
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|50px|border|caption]]
+!! result
+<p>
+<span class="mw-image-border" typeof="mw:Image" data-mw="{&quot;caption&quot;:&quot;caption&quot;}">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50">
+</a>
+</span>
+</p>
+!! end
+
+!! test
+Parsoid-specific image handling - thumbnail with halign, valign, and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|thumb|left|baseline|caption content]]
+!! result
+<figure class="mw-default-size mw-halign-left mw-valign-baseline" typeof="mw:Image/Thumb">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" height="21" width="180" />
+</a>
+<figcaption>caption content</figcaption>
+</figure>
+!! end
+
+!! test
+Parsoid-specific image handling - thumbnail with specific size, halign, valign, and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|thumb|50x50px|right|middle|caption]]
+!! result
+<figure class="mw-halign-right mw-valign-middle" typeof="mw:Image/Thumb">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50" />
+</a>
+<figcaption>caption</figcaption>
+</figure>
+!! end
+
+!! test
+Parsoid-specific image handling - framed image with specific size and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|500x50px|frame|caption]]
+!! result
+<figure typeof="mw:Image/Frame">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
+</a>
+<figcaption>caption</figcaption>
+</figure>
+!! end
+
+!! test
+Parsoid-specific image handling - framed image with specific size, halign, valign, and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|500x50px|frame|left|baseline|caption]]
+!! result
+<figure class="mw-halign-left mw-valign-baseline" typeof="mw:Image/Frame">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
+</a>
+<figcaption>caption</figcaption>
+</figure>
+!! end
+
+!! test
+Parsoid-specific image handling - frameless image with specific size, border, and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|frameless|500x50px|border|caption]]
+!! result
+<p>
+<span class="mw-image-border" typeof="mw:Image/Frameless" data-mw="{&quot;caption&quot;:&quot;caption&quot;}">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
+</a>
+</p>
+!! end
+
+#!! test
+#Parsoid-specific image handling - simple image with a formatted caption
+#!! options
+#parsoid
+#!! input
+#[[Image:Foobar.jpg|<table><tr><td>a</td><td>b</td></tr><tr><td>c</td></tr></table>]]
+#!! result
+#<p>
+#<span typeof="mw:Image">
+#<a class="mw-default-size" href="Image:Foobar.jpg">
+#<img alt="Foobar.jpg" class="mw-default-size" src="http://example.com/images/3/3a/Foobar.jpg" height="220" width="1941">
+#</a>
+#<span>abc</span>
+#</span>
+#</p>
+
+
+###
+### Subpages
+###
+!! article
+Subpage test/subpage
+!! text
+foo
+!! endarticle
+
+!! test
+Subpage link
+!! options
+subpage title=[[Subpage test]]
+!! input
+[[/subpage]]
+!! result
+<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a>
+</p>
+!! end
+
+!! test
+Subpage noslash link
+!! options
+subpage title=[[Subpage test]]
+!!input
+[[/subpage/]]
 !! result
 <p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">subpage</a>
 </p>
 !! end
 
+# TODO: make this PHP-parser compatible!
+!! test
+Relative subpage noslash link
+!! options
+parsoid=wt2wt,wt2html,html2html
+subpage title=[[Subpage test/1/2/3/4]]
+!!input
+[[../../subpage/]]
+
+[[../../subpage]]
+!! result
+<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage/">subpage</a></p>
+<p><a rel="mw:WikiLink" href="Subpage_test/1/2/subpage">Subpage_test/1/2/subpage</a></p>
+!! end
+
+# TODO: make this PHP-parser compatible!
+!! test
+Parsoid: dot-slash prefixed wikilinks
+!! options
+parsoid=wt2wt,wt2html,html2html
+!!input
+[[./foo]]
+
+[[././bar]]
+
+[[././baz/]]
+!! result
+<p><a rel="mw:WikiLink" href="./Foo">foo</a></p>
+<p><a rel="mw:WikiLink" href="./Bar">bar</a></p>
+<p><a rel="mw:WikiLink" href="./Baz/">baz/</a></p>
+!! end
+
 !! test
 Disabled subpages
 !! input
@@ -7415,6 +10381,59 @@ Bar
 </p>
 !! end
 
+!! test
+Parsoid: Serialize link to category page with colon escape
+!! options
+parsoid
+!! input
+
+[[:Category:Foo]]
+[[:Category:Foo|Bar]]
+!! result
+<p>
+<a rel="mw:WikiLink" href="Category:Foo">Category:Foo</a>
+<a rel="mw:WikiLink" href="Category:Foo">Bar</a>
+</p>
+!! end
+
+!! test
+Parsoid: Link prefix/suffixes aren't applied to category links
+!! options
+parsoid=wt2html,wt2wt,html2html
+language=is
+!! input
+x[[Category:Foo]]y
+!! result
+<p>x<link rel="mw:WikiLink/Category" href="Category:Foo">y</p>
+!! end
+
+!! test
+Parsoid: Serialize link to file page with colon escape
+!! options
+parsoid
+!! input
+
+[[:File:Foo.png]]
+[[:File:Foo.png|Bar]]
+!! result
+<p>
+<a rel="mw:WikiLink" href="File:Foo.png">File:Foo.png</a>
+<a rel="mw:WikiLink" href="File:Foo.png">Bar</a>
+</p>
+!! end
+
+!! test
+Parsoid: Serialize a genuine category link without colon escape
+!! options
+parsoid
+!! input
+[[Category:Foo]]
+[[Category:Foo|Bar]]
+!! result
+<link rel="mw:WikiLink/Category" href="Category:Foo">
+<link rel="mw:WikiLink/Category" href="Category:Foo#Bar">
+!! end
+
 ###
 ### Inter-language links
 ###
@@ -7457,13 +10476,13 @@ More
 ===Smaller headline===
 Blah blah
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
+<h2><span class="mw-headline" id="Headline_1">Headline 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>Some text
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2">Headline 2</span></h2>
+<h2><span class="mw-headline" id="Headline_2">Headline 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>More
 </p>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Smaller headline">edit</a>]</span> <span class="mw-headline" id="Smaller_headline">Smaller headline</span></h3>
+<h3><span class="mw-headline" id="Smaller_headline">Smaller headline</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Smaller headline">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
 <p>Blah blah
 </p>
 !! end
@@ -7480,7 +10499,7 @@ Section headings with TOC
 Some text
 ===Another headline===
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Headline_1"><span class="tocnumber">1</span> <span class="toctext">Headline 1</span></a>
 <ul>
@@ -7501,15 +10520,16 @@ Some text
 </ul>
 </li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a>]</span> <span class="mw-headline" id="Subheadline_1"> Subheadline 1 </span></h3>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level"> Skipping a level </span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level_2"> Skipping a level </span></h6>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2"> Headline 2 </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Headline_1">Headline 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="Subheadline_1">Subheadline 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h5><span class="mw-headline" id="Skipping_a_level">Skipping a level</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a><span class="mw-editsection-bracket">]</span></span></h5>
+<h6><span class="mw-headline" id="Skipping_a_level_2">Skipping a level</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h2><span class="mw-headline" id="Headline_2">Headline 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>Some text
 </p>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a>]</span> <span class="mw-headline" id="Another_headline">Another headline</span></h3>
+<h3><span class="mw-headline" id="Another_headline">Another headline</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
 
 !! end
 
@@ -7528,7 +10548,7 @@ Handling of sections up to level 6 and beyond
 ========= Level 9 Heading=========
 ========== Level 10 Heading==========
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Level_1_Heading"><span class="tocnumber">1</span> <span class="toctext">Level 1 Heading</span></a>
 <ul>
@@ -7556,17 +10576,18 @@ Handling of sections up to level 6 and beyond
 </ul>
 </li>
 </ul>
-</td></tr></table>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Level 1 Heading">edit</a>]</span> <span class="mw-headline" id="Level_1_Heading"> Level 1 Heading</span></h1>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a>]</span> <span class="mw-headline" id="Level_2_Heading"> Level 2 Heading</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a>]</span> <span class="mw-headline" id="Level_3_Heading"> Level 3 Heading</span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a>]</span> <span class="mw-headline" id="Level_4_Heading"> Level 4 Heading</span></h4>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a>]</span> <span class="mw-headline" id="Level_5_Heading"> Level 5 Heading</span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a>]</span> <span class="mw-headline" id="Level_6_Heading"> Level 6 Heading</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a>]</span> <span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a>]</span> <span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=10" title="Edit section: ==== Level 10 Heading====">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D">==== Level 10 Heading====</span></h6>
+</div>
+
+<h1><span class="mw-headline" id="Level_1_Heading">Level 1 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Level 1 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h2><span class="mw-headline" id="Level_2_Heading">Level 2 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="Level_3_Heading">Level 3 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h4><span class="mw-headline" id="Level_4_Heading">Level 4 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h5><span class="mw-headline" id="Level_5_Heading">Level 5 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h5>
+<h6><span class="mw-headline" id="Level_6_Heading">Level 6 Heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h6><span class="mw-headline" id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D">==== Level 10 Heading====</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=10" title="Edit section: ==== Level 10 Heading====">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
 
 !! end
 
@@ -7580,7 +10601,7 @@ TOC regression (bug 9764)
 == title 2 ==
 === title 2.1 ===
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -7598,13 +10619,14 @@ TOC regression (bug 9764)
 </ul>
 </li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
+</div>
+
+<h2><span class="mw-headline" id="title_1">title 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h4><span class="mw-headline" id="title_1.1.1">title 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h3><span class="mw-headline" id="title_1.2">title 1.2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="title_2.1">title 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
 
 !! end
 
@@ -7620,7 +10642,7 @@ wgMaxTocLevel=3
 == title 2 ==
 === title 2.1 ===
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -7634,13 +10656,14 @@ wgMaxTocLevel=3
 </ul>
 </li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
+</div>
+
+<h2><span class="mw-headline" id="title_1">title 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h4><span class="mw-headline" id="title_1.1.1">title 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h3><span class="mw-headline" id="title_1.2">title 1.2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="title_2.1">title 2.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
 
 !! end
 
@@ -7655,7 +10678,7 @@ wgMaxTocLevel=3
 ====Section 1.1.1.1====
 ==Section 2==
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a>
 <ul>
@@ -7664,12 +10687,13 @@ wgMaxTocLevel=3
 </li>
 <li class="toclevel-1 tocsection-5"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a></li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1">Section 1.1</span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 1.1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1.1">Section 1.1.1</span></h4>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 1.1.1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1.1.1">Section 1.1.1.1</span></h4>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 2">edit</a>]</span> <span class="mw-headline" id="Section_2">Section 2</span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="Section_1.1">Section 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h4><span class="mw-headline" id="Section_1.1.1">Section 1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h4><span class="mw-headline" id="Section_1.1.1.1">Section 1.1.1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 1.1.1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h4>
+<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -7680,8 +10704,8 @@ Resolving duplicate section names
 == Foo bar ==
 == Foo bar ==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar_2"> Foo bar </span></h2>
+<h2><span class="mw-headline" id="Foo_bar">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Foo_bar_2">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -7691,8 +10715,8 @@ Resolving duplicate section names with differing case (bug 10721)
 == Foo bar ==
 == Foo Bar ==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> Foo Bar </span></h2>
+<h2><span class="mw-headline" id="Foo_bar">Foo bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Foo_Bar_2">Foo Bar</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -7711,10 +10735,10 @@ __NOTOC__
 {{sections}}
 ==Section 4==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 0">edit</a>]</span> <span class="mw-headline" id="Section_0">Section 0</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-1" title="Template:Sections">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-2" title="Template:Sections">edit</a>]</span> <span class="mw-headline" id="Section_2">Section 2</span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 4">edit</a>]</span> <span class="mw-headline" id="Section_4">Section 4</span></h2>
+<h2><span class="mw-headline" id="Section_0">Section 0</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 0">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-1" title="Template:Sections">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-2" title="Template:Sections">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_4">Section 4</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 4">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -7725,8 +10749,8 @@ __NOEDITSECTION__
 ==Section 1==
 ==Section 2==
 !! result
-<h2> <span class="mw-headline" id="Section_1">Section 1</span></h2>
-<h2> <span class="mw-headline" id="Section_2">Section 2</span></h2>
+<h2><span class="mw-headline" id="Section_1">Section 1</span></h2>
+<h2><span class="mw-headline" id="Section_2">Section 2</span></h2>
 
 !! end
 
@@ -7735,7 +10759,7 @@ Link inside a section heading
 !! input
 ==Section with a [[Main Page|link]] in it==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section with a link in it">edit</a>]</span> <span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</span></h2>
+<h2><span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section with a link in it">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -7747,7 +10771,7 @@ __TOC__
 === title 1.1 ===
 == title 2 ==
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -7756,10 +10780,11 @@ __TOC__
 </li>
 <li class="toclevel-1 tocsection-3"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a></li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="title_1">title 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -7781,10 +10806,10 @@ The line above must have a trailing space!
 --> <!-- -->
 But just in case it doesn't...
 !! result
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: =">edit</a>]</span> <span class="mw-headline" id=".3D">=</span></h1>
+<h1><span class="mw-headline" id=".3D">=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: =">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
 <p>The line above must have a trailing space!
 </p>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =">edit</a>]</span> <span class="mw-headline" id=".3D_2">=</span></h1>
+<h1><span class="mw-headline" id=".3D_2">=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
 <p>But just in case it doesn't...
 </p>
 !! end
@@ -7811,7 +10836,7 @@ section 5
 !! result
 <p>The tooltips shall not show entities to the user (ie. be double escaped)
 </p>
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#text_.3E_text"><span class="tocnumber">1</span> <span class="toctext">text &gt; text</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#text_.3C_text"><span class="tocnumber">2</span> <span class="toctext">text &lt; text</span></a></li>
@@ -7819,20 +10844,21 @@ section 5
 <li class="toclevel-1 tocsection-4"><a href="#text_.27_text"><span class="tocnumber">4</span> <span class="toctext">text ' text</span></a></li>
 <li class="toclevel-1 tocsection-5"><a href="#text_.22_text"><span class="tocnumber">5</span> <span class="toctext">text " text</span></a></li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: text > text">edit</a>]</span> <span class="mw-headline" id="text_.3E_text"> text &gt; text </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="text_.3E_text">text &gt; text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: text > text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 1
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: text &lt; text">edit</a>]</span> <span class="mw-headline" id="text_.3C_text"> text &lt; text </span></h2>
+<h2><span class="mw-headline" id="text_.3C_text">text &lt; text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: text &lt; text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 2
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: text &amp; text">edit</a>]</span> <span class="mw-headline" id="text_.26_text"> text &amp; text </span></h2>
+<h2><span class="mw-headline" id="text_.26_text">text &amp; text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: text &amp; text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 3
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: text ' text">edit</a>]</span> <span class="mw-headline" id="text_.27_text"> text ' text </span></h2>
+<h2><span class="mw-headline" id="text_.27_text">text ' text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: text ' text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 4
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: text &quot; text">edit</a>]</span> <span class="mw-headline" id="text_.22_text"> text " text </span></h2>
+<h2><span class="mw-headline" id="text_.22_text">text " text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: text &quot; text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>section 5
 </p>
 !! end
@@ -7846,18 +10872,59 @@ Headers with excess '=' characters
 =''italic'' heading==
 ==''italic'' heading=
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#foo.3D"><span class="tocnumber">1</span> <span class="toctext">foo=</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#.3Dfoo"><span class="tocnumber">2</span> <span class="toctext">=foo</span></a></li>
 <li class="toclevel-1 tocsection-3"><a href="#italic_heading.3D"><span class="tocnumber">3</span> <span class="toctext"><i>italic</i> heading=</span></a></li>
 <li class="toclevel-1 tocsection-4"><a href="#.3Ditalic_heading"><span class="tocnumber">4</span> <span class="toctext">=<i>italic</i> heading</span></a></li>
 </ul>
-</td></tr></table>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: foo=">edit</a>]</span> <span class="mw-headline" id="foo.3D">foo=</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =foo">edit</a>]</span> <span class="mw-headline" id=".3Dfoo">=foo</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: italic heading=">edit</a>]</span> <span class="mw-headline" id="italic_heading.3D"><i>italic</i> heading=</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: =italic heading">edit</a>]</span> <span class="mw-headline" id=".3Ditalic_heading">=<i>italic</i> heading</span></h1>
+</div>
+
+<h1><span class="mw-headline" id="foo.3D">foo=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: foo=">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h1><span class="mw-headline" id=".3Dfoo">=foo</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =foo">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h1><span class="mw-headline" id="italic_heading.3D"><i>italic</i> heading=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: italic heading=">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h1><span class="mw-headline" id=".3Ditalic_heading">=<i>italic</i> heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: =italic heading">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+
+!! end
+
+!! test
+HTML headers vs TOC (bug 23393)
+(__NOEDITSECTION__ for clearer output, doesn't matter here)
+!! input
+<h1>Header 1</h1>
+== Header 1.1 ==
+== Header 1.2 ==
+
+<h1>Header 2
+</h1>
+== Header 2.1 ==
+== Header 2.2 ==
+__NOEDITSECTION__
+!! result
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1"><a href="#Header_1"><span class="tocnumber">1</span> <span class="toctext">Header 1</span></a>
+<ul>
+<li class="toclevel-2 tocsection-1"><a href="#Header_1.1"><span class="tocnumber">1.1</span> <span class="toctext">Header 1.1</span></a></li>
+<li class="toclevel-2 tocsection-2"><a href="#Header_1.2"><span class="tocnumber">1.2</span> <span class="toctext">Header 1.2</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1"><a href="#Header_2"><span class="tocnumber">2</span> <span class="toctext">Header 2</span></a>
+<ul>
+<li class="toclevel-2 tocsection-3"><a href="#Header_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Header 2.1</span></a></li>
+<li class="toclevel-2 tocsection-4"><a href="#Header_2.2"><span class="tocnumber">2.2</span> <span class="toctext">Header 2.2</span></a></li>
+</ul>
+</li>
+</ul>
+</div>
+
+<h1><span class="mw-headline" id="Header_1">Header 1</span></h1>
+<h2><span class="mw-headline" id="Header_1.1">Header 1.1</span></h2>
+<h2><span class="mw-headline" id="Header_1.2">Header 1.2</span></h2>
+<h1><span class="mw-headline" id="Header_2">Header 2</span></h1>
+<h2><span class="mw-headline" id="Header_2.1">Header 2.1</span></h2>
+<h2><span class="mw-headline" id="Header_2.2">Header 2.2</span></h2>
 
 !! end
 
@@ -7953,7 +11020,7 @@ div with illegal double attributes
 !! test
 div with empty attribute value, space before equals
 !! options
-disabled
+parsoid
 !! input
 <div class =>HTML rocks</div>
 !! result
@@ -7966,7 +11033,7 @@ disabled
 !! test
 div with braces in attribute value
 !! options
-disabled
+parsoid
 !! input
 <div title="{}">Foo</div>
 !! result
@@ -7983,7 +11050,7 @@ disabled
 !! test
 div with empty attribute value, no space before equals
 !! options
-disabled
+parsoid
 !! input
 <div class=>HTML rocks</div>
 !! result
@@ -8078,6 +11145,81 @@ I always thought &xacute; was a cute letter.
 !! end
 
 
+###
+### Nesting tests (see bug 41545, 50604, 51081)
+###
+
+# This test case is fixed in Parsoid by domino 1.0.12. (bug 50604)
+# Note that html2wt is considerably more difficult if we use <b> in
+# the test case, instead of <big>
+!! test
+Ensure that HTML adoption agency algorithm is properly implemented.
+!! input
+<big>X<big>Y</big>Z</big>
+!! result
+<p><big>X<big>Y</big>Z</big>
+</p>
+!! end
+
+# This was bug 41545 in the PHP parser.
+!! test
+Nesting of <kbd>
+!! input
+<kbd>X<kbd>Y</kbd>Z</kbd>
+!! result
+<p><kbd>X<kbd>Y</kbd>Z</kbd>
+</p>
+!! end
+
+# The following cases were bug 51081 in the PHP parser.
+# Note that there are some other nestable tags (b, i, etc) which are
+# not covered; see bug 51081 for discussion.
+!! test
+Nesting of <em>
+!! input
+<em>X<em>Y</em>Z</em>
+!! result
+<p><em>X<em>Y</em>Z</em>
+</p>
+!! end
+
+!! test
+Nesting of <strong>
+!! input
+<strong>X<strong>Y</strong>Z</strong>
+!! result
+<p><strong>X<strong>Y</strong>Z</strong>
+</p>
+!! end
+
+!! test
+Nesting of <q>
+!! input
+<q>X<q>Y</q>Z</q>
+!! result
+<p><q>X<q>Y</q>Z</q>
+</p>
+!! end
+
+!! test
+Nesting of <ruby>
+!! input
+<ruby>X<ruby>Y</ruby>Z</ruby>
+!! result
+<p><ruby>X<ruby>Y</ruby>Z</ruby>
+</p>
+!! end
+
+!! test
+Nesting of <bdo>
+!! input
+<bdo>X<bdo>Y</bdo>Z</bdo>
+!! result
+<p><bdo>X<bdo>Y</bdo>Z</bdo>
+</p>
+!! end
+
+
 ###
 ### Media links
 ###
@@ -8470,70 +11612,6 @@ MSIE CSS safety test: comment in expression
 
 !! end
 
-!! test
-CSS safety test: vertical tab
-!! input
-<p style="font-size: 100px; background-image:url\b(https://www.google.com/images/srpr/logo6w.png)">A</p>
-!! result
-<p style="/* invalid control char */">A</p>
-
-!! end
-
-!! test
-MSIE CSS safety test: Fullwidth
-!! input
-<p style="font-size: 100px; color: ｅｘｐｒｅｓｓｉｏｎ((title='XSSed'),'red')">A</p>
-<div style="top:ＥＸＰＲＥＳＳＩＯＮ(alert())">B</div>
-!! result
-<p style="/* insecure input */">A</p>
-<div style="/* insecure input */">B</div>
-
-!! end
-
-!! test
-MSIE CSS safety test: IPA extensions
-!! input
-<div style="background-image:uʀʟ(javascript:alert())">A</div>
-<p style="font-size: 100px; color: expʀessɪoɴ((title='XSSed'),'red')">B</p>
-!! result
-<div style="/* insecure input */">A</div>
-<p style="/* insecure input */">B</p>
-
-!! end
-
-!! test
-MSIE CSS safety test: sup/sub script
-!! input
-<div style="background-image:url⁽javascript:alert())">A</div>
-<div style="background-image:url₍javascript:alert())">B</div>
-<p style="font-size: 100px; color: expressioⁿ((title='XSSed'),'red')">C</p>
-!! result
-<div style="/* insecure input */">A</div>
-<div style="/* insecure input */">B</div>
-<p style="/* insecure input */">C</p>
-
-!! end
-
-!! test
-MSIE CSS safety test: Repetition markers
-!! input
-<p style="font-size: 100px; color: expres〱ion((title='XSSed'),'red')">A</p>
-<p style="font-size: 100px; color: expresゝion((title='XSSed'),'red')">B</p>
-<p style="font-size: 100px; color: expresーion((title='XSSed'),'red')">C</p>
-<p style="font-size: 100px; color: expresヽion((title='XSSed'),'red')">D</p>
-<p style="font-size: 100px; color: expresﹽion((title='XSSed'),'red')">E</p>
-<p style="font-size: 100px; color: expresﹼion((title='XSSed'),'red')">F</p>
-<p style="font-size: 100px; color: expresｰion((title='XSSed'),'red')">G</p>
-!! result
-<p style="/* insecure input */">A</p>
-<p style="/* insecure input */">B</p>
-<p style="/* insecure input */">C</p>
-<p style="/* insecure input */">D</p>
-<p style="/* insecure input */">E</p>
-<p style="/* insecure input */">F</p>
-<p style="/* insecure input */">G</p>
-
-!! end
 
 !! test
 Table attribute legitimate extension
@@ -8617,7 +11695,7 @@ Expansion of multi-line templates in attribute values (bug 6255 sanity check 2)
 !! end
 
 ###
-### Parser hooks (see maintenance/parserTestsParserHook.php for the <tag> extension)
+### Parser hooks (see tests/parser/parserTestsParserHook.php for the <tag> extension)
 ###
 !! test
 Parser hook: empty input
@@ -8782,7 +11860,7 @@ array (
 !! end
 
 ###
-### (see maintenance/parserTestsStaticParserHook.php for the <statictag> extension)
+### (see tests/parser/parserTestsParserHook.php for the <statictag> extension)
 ###
 
 !! test
@@ -9014,11 +12092,13 @@ disabled
 !! result
 <ul>
 <li>One
-</li><li>Two
-</li></ul>
-
-!! end
-
+</li>
+<li>Two
+</li>
+</ul>
+
+!! end
+
 !! test
 HTML ordered list, closed tags (bug 5497)
 !! input
@@ -9046,8 +12126,10 @@ disabled
 !! result
 <ol>
 <li>One
-</li><li>Two
-</li></ol>
+</li>
+<li>Two
+</li>
+</ol>
 
 !! end
 
@@ -9092,12 +12174,16 @@ disabled
 !! result
 <ul>
 <li>One
-</li><li>Two:
+</li>
+<li>Two:
 <ul>
 <li>Sub-one
-</li><li>Sub-two
-</li></ul>
-</li></ul>
+</li>
+<li>Sub-two
+</li>
+</ul>
+</li>
+</ul>
 
 !! end
 
@@ -9142,21 +12228,27 @@ disabled
 !! result
 <ol>
 <li>One
-</li><li>Two:
+</li>
+<li>Two:
 <ol>
 <li>Sub-one
-</li><li>Sub-two
-</li></ol>
-</li></ol>
+</li>
+<li>Sub-two
+</li>
+</ol>
+</li>
+</ol>
 
 !! end
 
 !! test
 HTML ordered list item with parameters oddity
 !! input
-<ol><li id="fragment">One</li></ol>
+<ol><li id="fragment">One</li>
+</ol>
 !! result
-<ol><li id="fragment">One</li></ol>
+<ol><li id="fragment">One</li>
+</ol>
 
 !! end
 
@@ -9208,12 +12300,13 @@ Fuzz testing: Parser14
 == onmouseover= ==
 http://__TOC__
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a>]</span> <span class="mw-headline" id="onmouseover.3D"> onmouseover= </span></h2>
-http://<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+http://<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
 </ul>
-</td></tr></table>
+</div>
+
 
 !! end
 
@@ -9223,7 +12316,7 @@ Fuzz testing: Parser14-table
 ==a==
 {| STYLE=__TOC__
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: a">edit</a>]</span> <span class="mw-headline" id="a">a</span></h2>
+<h2><span class="mw-headline" id="a">a</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: a">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <table style="&#95;_TOC&#95;_">
 <tr><td></td></tr>
 </table>
@@ -9369,7 +12462,7 @@ Fuzz testing: image with bogus manual thumbnail
 !!input
 [[Image:foobar.jpg|thumbnail= ]]
 !!result
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;">Error creating thumbnail:   <div class="thumbcaption"></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;">Error creating thumbnail:   <div class="thumbcaption"></div></div></div>
 
 !!end
 
@@ -10380,17 +13473,33 @@ Handling of &#x0A; in URLs
 !! input
 **irc://&#x0A;a
 !! result
-<ul><li><ul><li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
-</li></ul>
-</li></ul>
+<ul>
+<li><ul>
+<li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
+</li>
+</ul>
+</li>
+</ul>
 
 !!end
 
 !! test
-5 quotes, code coverage +1 line
+5 quotes, code coverage +1 line (php)
+!! options
+php
+!! input
+'''''
+!! result
+!! end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+5 quotes, code coverage +1 line (parsoid)
+!! options
+parsoid
 !! input
 '''''
 !! result
+<p><b><i></i></b></p>
 !! end
 
 !! test
@@ -10404,43 +13513,78 @@ Special:Search page linking.
 
 !! test
 Say the magic word
+!! options
+title=[[Parser test]]
 !! input
 * {{PAGENAME}}
+* {{PAGENAMEE}}
+* {{FULLPAGENAME}}
+* {{FULLPAGENAMEE}}
 * {{BASEPAGENAME}}
+* {{BASEPAGENAMEE}}
 * {{SUBPAGENAME}}
 * {{SUBPAGENAMEE}}
-* {{BASEPAGENAME}}
-* {{BASEPAGENAMEE}}
+* {{ROOTPAGENAME}}
+* {{ROOTPAGENAMEE}}
 * {{TALKPAGENAME}}
 * {{TALKPAGENAMEE}}
 * {{SUBJECTPAGENAME}}
 * {{SUBJECTPAGENAMEE}}
 * {{NAMESPACEE}}
 * {{NAMESPACE}}
+* {{NAMESPACENUMBER}}
 * {{TALKSPACE}}
 * {{TALKSPACEE}}
 * {{SUBJECTSPACE}}
 * {{SUBJECTSPACEE}}
 * {{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}
 !! result
-<ul><li> Parser test
-</li><li> Parser test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> Talk:Parser test
-</li><li> Talk:Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> 
-</li><li> 
-</li><li> Talk
-</li><li> Talk
-</li><li> 
-</li><li> 
-</li><li> <a href="/index.php?title=Template:Dynamic&amp;action=edit&amp;redlink=1" class="new" title="Template:Dynamic (page does not exist)">Template:Dynamic</a>
-</li></ul>
+<ul>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> Talk:Parser test
+</li>
+<li> Talk:Parser_test
+</li>
+<li> Parser test
+</li>
+<li> Parser_test
+</li>
+<li> 
+</li>
+<li> 
+</li>
+<li> 0
+</li>
+<li> Talk
+</li>
+<li> Talk
+</li>
+<li> 
+</li>
+<li> 
+</li>
+<li> <a href="/index.php?title=Template:Dynamic&amp;action=edit&amp;redlink=1" class="new" title="Template:Dynamic (page does not exist)">Template:Dynamic</a>
+</li>
+</ul>
 
 !! end
 ### Note: Above tests excludes the "{{NUMBEROFADMINS}}" magic word because it generates a MySQL error when included.
@@ -10459,40 +13603,40 @@ image4    |300px| centre
 * image6
 </gallery>
 !! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
-			<div style="height: 150px;">Image1.png</div>
+			<div class="thumb" style="height: 150px;">Image1.png</div>
 			<div class="gallerytext">
 			</div>
 		</div></li>
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
-			<div style="height: 150px;">Image2.gif</div>
+			<div class="thumb" style="height: 150px;">Image2.gif</div>
 			<div class="gallerytext">
 <p>||||
 </p>
 			</div>
 		</div></li>
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
-			<div style="height: 150px;">Image3</div>
+			<div class="thumb" style="height: 150px;">Image3</div>
 			<div class="gallerytext">
 			</div>
 		</div></li>
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
-			<div style="height: 150px;">Image4</div>
+			<div class="thumb" style="height: 150px;">Image4</div>
 			<div class="gallerytext">
 <p>300px| centre
 </p>
 			</div>
 		</div></li>
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
-			<div style="height: 150px;">Image5.svg</div>
+			<div class="thumb" style="height: 150px;">Image5.svg</div>
 			<div class="gallerytext">
 <p><a rel="nofollow" class="external free" href="http://///////">http://///////</a>
 </p>
 			</div>
 		</div></li>
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
-			<div style="height: 150px;">* image6</div>
+			<div class="thumb" style="height: 150px;">* image6</div>
 			<div class="gallerytext">
 			</div>
 		</div></li>
@@ -10511,17 +13655,17 @@ image:foobar.jpg
 image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
 </gallery>
 !! result
-<ul class="gallery" style="max-width: 226px;_width: 226px;">
+<ul class="gallery mw-gallery-traditional" style="max-width: 226px;_width: 226px;">
 	<li class='gallerycaption'>Foo <a href="/wiki/Main_Page" title="Main Page">Main Page</a></li>
 		<li class="gallerybox" style="width: 105px"><div style="width: 105px">
-			<div style="height: 70px;">Nonexistant.jpg</div>
+			<div class="thumb" style="height: 70px;">Nonexistant.jpg</div>
 			<div class="gallerytext">
 <p>caption
 </p>
 			</div>
 		</div></li>
 		<li class="gallerybox" style="width: 105px"><div style="width: 105px">
-			<div style="height: 70px;">Nonexistant.jpg</div>
+			<div class="thumb" style="height: 70px;">Nonexistant.jpg</div>
 			<div class="gallerytext">
 			</div>
 		</div></li>
@@ -10556,7 +13700,7 @@ File:foobar.jpg|[[File:foobar.jpg|20px|desc|alt=inneralt]]|alt=galleryalt
 File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
 </gallery>
 !! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
 			<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
 			<div class="gallerytext">
@@ -10585,9 +13729,9 @@ image:foobar.jpg|some '''caption''' [[Main Page]]
 File:Foobar.jpg
 </gallery>
 !! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
-			<div style="height: 150px;">Nonexistant.jpg</div>
+			<div class="thumb" style="height: 150px;">Nonexistant.jpg</div>
 			<div class="gallerytext">
 <p><a href="/wiki/File:Nonexistant.jpg" title="File:Nonexistant.jpg">Nonexistant.jpg</a><br />
 caption
@@ -10595,7 +13739,7 @@ caption
 			</div>
 		</div></li>
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
-			<div style="height: 150px;">Nonexistant.jpg</div>
+			<div class="thumb" style="height: 150px;">Nonexistant.jpg</div>
 			<div class="gallerytext">
 <p><a href="/wiki/File:Nonexistant.jpg" title="File:Nonexistant.jpg">Nonexistant.jpg</a><br />
 </p>
@@ -10630,14 +13774,14 @@ image:foobar.jpg
 foobar.jpg
 </gallery>
 !! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
-			<div style="height: 150px;">Nonexistant.jpg</div>
+			<div class="thumb" style="height: 150px;">Nonexistant.jpg</div>
 			<div class="gallerytext">
 			</div>
 		</div></li>
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
-			<div style="height: 150px;">Nonexistant.jpg</div>
+			<div class="thumb" style="height: 150px;">Nonexistant.jpg</div>
 			<div class="gallerytext">
 			</div>
 		</div></li>
@@ -10828,13 +13972,25 @@ disabled
 !! input
 :;;;::
 !! result
-<dl><dd><dl><dt><dl><dt><dl><dt><dl><dd><dl><dd>
-</dd></dl>
-</dd></dl>
-</dt></dl>
-</dt></dl>
-</dt></dl>
-</dd></dl>
+<dl>
+<dd><dl>
+<dt><dl>
+<dt><dl>
+<dt><dl>
+<dd><dl>
+<dd>
+</dd>
+</dl>
+</dd>
+</dl>
+</dt>
+</dl>
+</dt>
+</dl>
+</dt>
+</dl>
+</dd>
+</dl>
 
 !!end
 
@@ -10861,7 +14017,7 @@ Images with the "|" character in the comment
 !! test
 HTML with raw HTML ($wgRawHtml==true)
 !! options
-rawhtml
+wgRawHtml=1
 !! input
 <html><script>alert(1);</script></html>
 !! result
@@ -10930,6 +14086,45 @@ subpage title=[[Subpage test/L1/L2/L3]]
 </p>
 !! end
 
+!! article
+Subpage test/L1/L2/L3Sibling
+!! text
+Sibling article
+!! endarticle
+
+!! test
+Transclusion of a sibling page (one level up)
+!! options
+subpage title=[[Subpage test/L1/L2/L3]]
+!! input
+{{../L3Sibling}}
+!! result
+<p>Sibling article
+</p>
+!! end
+
+!! test
+Transclusion of a child page
+!! options
+subpage title=[[Subpage test/L1/L2]]
+!! input
+{{/L3Sibling}}
+!! result
+<p>Sibling article
+</p>
+!! end
+
+!! test
+Non-transclusion because of too many up levels
+!! options
+subpage title=[[Subpage test/L1/L2/L3]]
+!! input
+{{../../../../More than parent}}
+!! result
+<p>{{../../../../More than parent}}
+</p>
+!! end
+
 !! test
 Definition list code coverage
 !! input
@@ -10937,10 +14132,17 @@ Definition list code coverage
 ; title : def
 ;title: def
 !! result
-<dl><dt> title  &#160;</dt><dd> def
-</dd><dt> title&#160;</dt><dd> def
-</dd><dt>title</dt><dd> def
-</dd></dl>
+<dl>
+<dt> title  &#160;</dt>
+<dd> def
+</dd>
+<dt> title&#160;</dt>
+<dd> def
+</dd>
+<dt>title</dt>
+<dd> def
+</dd>
+</dl>
 
 !! end
 
@@ -11004,7 +14206,7 @@ Inclusion of !userCanEdit() content
 !! input
 {{MediaWiki:Fake}}
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=MediaWiki:Fake&amp;action=edit&amp;section=T-1" title="MediaWiki:Fake">edit</a>]</span> <span class="mw-headline" id="header">header</span></h2>
+<h2><span class="mw-headline" id="header">header</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=MediaWiki:Fake&amp;action=edit&amp;section=T-1" title="MediaWiki:Fake">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -11019,7 +14221,7 @@ Out-of-order TOC heading levels
 =====5=====
 ==2==
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#2"><span class="tocnumber">1</span> <span class="toctext">2</span></a>
 <ul>
@@ -11034,13 +14236,14 @@ Out-of-order TOC heading levels
 </ul>
 </li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: 2">edit</a>]</span> <span class="mw-headline" id="2">2</span></h2>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: 6">edit</a>]</span> <span class="mw-headline" id="6">6</span></h6>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: 3">edit</a>]</span> <span class="mw-headline" id="3">3</span></h3>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: 1">edit</a>]</span> <span class="mw-headline" id="1">1</span></h1>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: 5">edit</a>]</span> <span class="mw-headline" id="5">5</span></h5>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: 2">edit</a>]</span> <span class="mw-headline" id="2_2">2</span></h2>
+</div>
+
+<h2><span class="mw-headline" id="2">2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h6><span class="mw-headline" id="6">6</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: 6">edit</a><span class="mw-editsection-bracket">]</span></span></h6>
+<h3><span class="mw-headline" id="3">3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: 3">edit</a><span class="mw-editsection-bracket">]</span></span></h3>
+<h1><span class="mw-headline" id="1">1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: 1">edit</a><span class="mw-editsection-bracket">]</span></span></h1>
+<h5><span class="mw-headline" id="5">5</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: 5">edit</a><span class="mw-editsection-bracket">]</span></span></h5>
+<h2><span class="mw-headline" id="2_2">2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -11147,14 +14350,11 @@ anchorencode encodes like the TOC generator: (bug 18431)
 {{anchorencode: _ +:.3A%3A&&amp;]] }}
 __NOEDITSECTION__
 !! result
-<h3> <span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D"> _ +:.3A%3A&amp;&amp;]] </span></h3>
+<h3><span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D">_ +:.3A%3A&amp;&amp;]]</span></h3>
 <p>.2B:.3A.253A.26.26.5D.5D
 </p>
 !! end
 
-# Expected output in the following test is not necessarily expected (there
-# should probably be <p> tags inside the <blockquote> in the output) -- it's
-# only testing for well-formedness.
 !! test
 Bug 6200: blockquotes and paragraph formatting
 !! input
@@ -11167,7 +14367,8 @@ bar
  baz
 !! result
 <blockquote>
-foo
+<p>foo
+</p>
 </blockquote>
 <p>bar
 </p>
@@ -11196,6 +14397,27 @@ bar
 </pre>
 !! end
 
+!!test
+Parsing of overlapping (improperly nested) inline html tags (PHP parser)
+!!options
+php
+!!input
+<span><s>x</span></s>
+!!result
+<p><span><s>x&lt;/span&gt;</s></span>
+</p>
+!!end
+
+!!test
+Parsing of overlapping (improperly nested) inline html tags (Parsoid)
+!!options
+parsoid
+!!input
+<span><s>x</span></s>
+!!result
+<p><span><s>x</s></span><s></s>
+</p>
+!!end
 
 ###
 ### Language variants related tests
@@ -11228,6 +14450,17 @@ title=[[Duna]] language=sr
 </p>
 !! end
 
+!! test
+Link to a section of a variant of this title shouldn't be parsed as self-link
+!! options
+title=[[Duna]] language=sr
+!! input
+[[Dуна]] is a self-link while [[Dunа#Foo]] and [[Dуна#Foo]] are not self-links.
+!! result
+<p><strong class="selflink">Dуна</strong> is a self-link while <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dunа#Foo</a> and <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dуна#Foo</a> are not self-links.
+</p>
+!! end
+
 !! test
 Link to pages in language variants
 !! options
@@ -11377,7 +14610,7 @@ language=sr variant=sr-ec
 !! input
 == -{Naslov}- ==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Уредите одељак „Naslov“">уреди</a>]</span> <span class="mw-headline" id="-.7BNaslov.7D-"> Naslov </span></h2>
+<h2><span class="mw-headline" id="-.7BNaslov.7D-">Naslov</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Уредите одељак „Naslov“">уреди</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -11490,6 +14723,30 @@ This won't take interferes with the title rule.
 </p>
 !! end
 
+!! test
+Partly disable title conversion if variant == main language code
+!! options
+language=zh variant=zh title=[[ZH]] showtitle
+!! input
+-{T|zh-cn:CN;zh-tw:TW}-
+!! result
+ZH
+<p>
+</p>
+!! end
+
+!! test
+Partly disable title conversion if variant == main language code, more
+!! options
+language=zh variant=zh title=[[ZH]] showtitle
+!! input
+-{T|TW}-
+!! result
+ZH
+<p>
+</p>
+!! end
+
 !! test
 Raw output of variant escape tags (R flag)
 !! options
@@ -11568,20 +14825,17 @@ language=sr
 </p>
 !!end
 
-!!article
-Template:Bullet
-!!text
-* Bar
-!!endarticle
-
 !! test
 Bug 529: Uncovered bullet
 !! input
 * Foo {{bullet}}
 !! result
-<ul><li> Foo 
-</li><li> Bar
-</li></ul>
+<ul>
+<li> Foo 
+</li>
+<li> Bar
+</li>
+</ul>
 
 !! end
 
@@ -11596,15 +14850,30 @@ Bug 529: Uncovered bullet leaving empty list, normally removed by tidy
 !! input
 ******* Foo {{bullet}}
 !! result
-<ul><li><ul><li><ul><li><ul><li><ul><li><ul><li><ul><li> Foo 
-</li></ul>
-</li></ul>
-</li></ul>
-</li></ul>
-</li></ul>
-</li></ul>
-</li><li> Bar
-</li></ul>
+<ul>
+<li><ul>
+<li><ul>
+<li><ul>
+<li><ul>
+<li><ul>
+<li><ul>
+<li> Foo 
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+<li> Bar
+</li>
+</ul>
 
 !! end
 
@@ -11636,9 +14905,12 @@ Bug 529: Uncovered bullet in parser function result
 !! input
 * Foo {{lc:{{bullet}} }}
 !! result
-<ul><li> Foo 
-</li><li> bar
-</li></ul>
+<ul>
+<li> Foo 
+</li>
+<li> bar
+</li>
+</ul>
 
 !! end
 
@@ -11694,7 +14966,7 @@ Morwen/13: Unclosed link followed by heading
 !! result
 <p>[[link
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span> <span class="mw-headline" id="heading">heading</span></h2>
+<h2><span class="mw-headline" id="heading">heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -11706,7 +14978,7 @@ HHP2.1: Heuristics for headings in preprocessor parenthetical structures
 !! result
 <p>{{foo|
 </p>
-<h1> <span class="mw-headline" id="heading">heading</span></h1>
+<h1><span class="mw-headline" id="heading">heading</span></h1>
 
 !! end
 
@@ -11718,7 +14990,7 @@ HHP2.2: Heuristics for headings in preprocessor parenthetical structures
 !! result
 <p>{{foo|
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span> <span class="mw-headline" id="heading">heading</span></h2>
+<h2><span class="mw-headline" id="heading">heading</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -11808,8 +15080,6 @@ B</strong>
 # Bug 6200: <blockquote> should behave like <div> with respect to line breaks
 !! test
 Bug 6200: paragraphs inside blockquotes (no extra line breaks)
-!! options
-disabled
 !! input
 <blockquote>Line one
 
@@ -11822,8 +15092,6 @@ Line two</blockquote>
 
 !! test
 Bug 6200: paragraphs inside blockquotes (extra line break on open)
-!! options
-disabled
 !! input
 <blockquote>
 Line one
@@ -11839,8 +15107,6 @@ Line two</blockquote>
 
 !! test
 Bug 6200: paragraphs inside blockquotes (extra line break on close)
-!! options
-disabled
 !! input
 <blockquote>Line one
 
@@ -11856,8 +15122,6 @@ Line two
 
 !! test
 Bug 6200: paragraphs inside blockquotes (extra line break on open and close)
-!! options
-disabled
 !! input
 <blockquote>
 Line one
@@ -12078,7 +15342,7 @@ comment title=[[Main Page]]
 !! input
 pre-comment text /* External links */ removed bogus entries
 !! result
-pre-comment text - <a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
+pre-comment text <a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
 !!end
 
 !! test
@@ -12309,6 +15573,40 @@ Screen
 </p>
 !! end
 
+!! test
+Verify that displaytitle handles inline CSS styles (bug 26547) - rejected value
+!! options
+showtitle
+title=[[Screen]]
+!! config
+wgAllowDisplayTitle=true
+wgRestrictDisplayTitle=true
+!! input
+this is not the the title
+{{DISPLAYTITLE:<span style="display: none;">s</span>creen}}
+!! result
+<span style="/* attempt to bypass $wgRestrictDisplayTitle */">s</span>creen
+<p>this is not the the title
+</p>
+!! end
+
+!! test
+Verify that displaytitle handles inline CSS styles (bug 26547) - accepted value
+!! options
+showtitle
+title=[[Screen]]
+!! config
+wgAllowDisplayTitle=true
+wgRestrictDisplayTitle=true
+!! input
+this is not the the title
+{{DISPLAYTITLE:<span style="color: red;">s</span>creen}}
+!! result
+<span style="color: red;">s</span>creen
+<p>this is not the the title
+</p>
+!! end
+
 !! test
 preload: check <noinclude> and <includeonly>
 !! options
@@ -12533,12 +15831,13 @@ title=[[Main Page]]
 __TOC__
 == ''Lost'' episodes ==
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a>]</span> <span class="mw-headline" id="Lost_episodes"> <i>Lost</i> episodes </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Lost_episodes"><i>Lost</i> episodes</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -12550,12 +15849,13 @@ title=[[Main Page]]
 __TOC__
 == '''should be bold''' then normal text ==
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a>]</span> <span class="mw-headline" id="should_be_bold_then_normal_text"> <b>should be bold</b> then normal text </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="should_be_bold_then_normal_text"><b>should be bold</b> then normal text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -12567,12 +15867,13 @@ title=[[Main Page]]
 __TOC__
 == Image [[Image:foobar.jpg]] ==
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a>]</span> <span class="mw-headline" id="Image"> Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Image">Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -12584,12 +15885,13 @@ title=[[Main Page]]
 __TOC__
 == <blockquote>Quote</blockquote> ==
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a>]</span> <span class="mw-headline" id="Quote"> <blockquote>Quote</blockquote> </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Quote"><blockquote>Quote</blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -12603,12 +15905,13 @@ __TOC__
 <small>Hanc marginis exiguitas non caperet.</small>
 QED
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Proof:_2_.3C_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 &lt; 3</span></a></li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Proof: 2 &lt; 3">edit</a>]</span> <span class="mw-headline" id="Proof:_2_.3C_3"> Proof: 2 &lt; 3 </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Proof:_2_.3C_3">Proof: 2 &lt; 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Proof: 2 &lt; 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p><small>Hanc marginis exiguitas non caperet.</small>
 QED
 </p>
@@ -12622,14 +15925,15 @@ __TOC__
 
 == <i>Foo</i> <blockquote>Bar</blockquote> ==
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Foo_Bar"><span class="tocnumber">1</span> <span class="toctext"><i>Foo</i> <b>Bar</b></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</span></a></li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar"> <i>Foo</i> <b>Bar</b> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> <i>Foo</i> <blockquote>Bar</blockquote> </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Foo_Bar"><i>Foo</i> <b>Bar</b></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Foo_Bar_2"><i>Foo</i> <blockquote>Bar</blockquote></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -12641,14 +15945,15 @@ __TOC__
 
 == <sup class="a > b">Evilbye</sup> ==
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Hello"><span class="tocnumber">1</span> <span class="toctext"><sup>Hello</sup></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#b.22.3EEvilbye"><span class="tocnumber">2</span> <span class="toctext"><sup> b"&gt;Evilbye</sup></span></a></li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Hello">edit</a>]</span> <span class="mw-headline" id="Hello"> <sup class="in-h2">Hello</sup> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;>Evilbye">edit</a>]</span> <span class="mw-headline" id="b.22.3EEvilbye"> <sup> b"&gt;Evilbye</sup> </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="Hello"><sup class="in-h2">Hello</sup></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Hello">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="b.22.3EEvilbye"><sup> b"&gt;Evilbye</sup></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;>Evilbye">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -12666,7 +15971,7 @@ __TOC__
 
 == <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> ==
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#C.2B.2B"><span class="tocnumber">1</span> <span class="toctext"><span dir="ltr">C++</span></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#.D7.96.D7.91.D7.A0.D7.92.21"><span class="tocnumber">2</span> <span class="toctext"><span dir="rtl">זבנג!</span></span></a></li>
@@ -12674,12 +15979,13 @@ __TOC__
 <li class="toclevel-1 tocsection-4"><a href="#All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span class="tocnumber">4</span> <span class="toctext"><span>All attributes on these span tags must be deleted from the TOC</span></span></a></li>
 <li class="toclevel-1 tocsection-5"><a href="#Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span class="tocnumber">5</span> <span class="toctext"><span dir="ltr">Attributes after dir on these span tags must be deleted from the TOC</span></span></a></li>
 </ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: C++">edit</a>]</span> <span class="mw-headline" id="C.2B.2B"> <span dir="ltr">C++</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: זבנג!">edit</a>]</span> <span class="mw-headline" id=".D7.96.D7.91.D7.A0.D7.92.21"> <span dir="rtl">זבנג!</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: The attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"> <span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: All attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"> <span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Attributes after dir on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"> <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> </span></h2>
+</div>
+
+<h2><span class="mw-headline" id="C.2B.2B"><span dir="ltr">C++</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: C++">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id=".D7.96.D7.91.D7.A0.D7.92.21"><span dir="rtl">זבנג!</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: זבנג!">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: The attributes on these span tags must be deleted from the TOC">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: All attributes on these span tags must be deleted from the TOC">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Attributes after dir on these span tags must be deleted from the TOC">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -12696,7 +16002,7 @@ title=[[Main Page]]
 !! input
 {{int:Bug32057}}
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a>]</span> <span class="mw-headline" id="Headline_text"> Headline text </span></h2>
+<h2><span class="mw-headline" id="Headline_text">Headline text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -12798,7 +16104,7 @@ nowiki inside link inside heading (bug 18295)
 !! input
 ==[[foo|x<nowiki>y</nowiki>z]]==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: xyz">edit</a>]</span> <span class="mw-headline" id="xyz"><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">xyz</a></span></h2>
+<h2><span class="mw-headline" id="xyz"><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">xyz</a></span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: xyz">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 
 !! end
 
@@ -12837,7 +16143,7 @@ Gallery override link with WikiLink (bug 34852)
 File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
 </gallery>
 !! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
 			<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/InterWikiLink"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
 			<div class="gallerytext">
@@ -12856,7 +16162,7 @@ Gallery override link with absolute external link (bug 34852)
 File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
 </gallery>
 !! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
 			<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
 			<div class="gallerytext">
@@ -12875,7 +16181,7 @@ Gallery override link with malicious javascript (bug 34852)
 File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
 </gallery>
 !! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
 			<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
 			<div class="gallerytext">
@@ -12894,7 +16200,7 @@ Gallery with invalid title as link (bug 43964)
 File:foobar.jpg|link=<
 </gallery>
 !! result
-<ul class="gallery">
+<ul class="gallery mw-gallery-traditional">
 		<li class="gallerybox" style="width: 155px"><div style="width: 155px">
 			<div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
 			<div class="gallerytext">
@@ -12924,6 +16230,19 @@ abc
 </p>
 !! end
 
+!!test
+Special parser function
+!! input
+{{#special:RandomPage}}
+{{#special:BaDtItLe}}
+{{#special:Foobar}}
+!! result
+<p>Special:Random
+Special:Badtitle
+Special:Foobar
+</p>
+!! end
+
 !!test
 Bug 34939 - Case insensitive link parsing ([HttP://])
 !! input
@@ -12951,6 +16270,30 @@ HttP://MediaWiki.Org/
 </p>
 !! end
 
+!!test
+Disable TOC
+!! options
+notoc
+!! input
+Lead
+== Section 1 ==
+== Section 2 ==
+== Section 3 ==
+== Section 4 ==
+== Section 5 ==
+!! result
+<p>Lead
+</p>
+
+<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 2">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_3">Section 3</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 3">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_4">Section 4</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 4">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="Section_5">Section 5</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 5">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+
+!! end
+
+
 ###
 ### Parsoids-specific tests
 ### Parsoid-PHP parser incompatibilities
@@ -12958,963 +16301,2213 @@ HttP://MediaWiki.Org/
 !!test
 1. SOL-sensitive wikitext tokens as template-args
 !!options
-disabled
+parsoid=wt2html,wt2wt
 !!input
 {{echo|*a}}
 {{echo|#a}}
 {{echo|:a}}
 !!result
-<p>*a
-#a
-:a
-</p>
+<span about="#mwt1" typeof="mw:Transclusion">
+</span><ul about="#mwt1"><li>a</li>
+</ul>
+<span about="#mwt2" typeof="mw:Transclusion">
+</span><ol about="#mwt2"><li>a</li>
+</ol>
+<span about="#mwt3" typeof="mw:Transclusion">
+</span><dl about="#mwt3"><dd>a</dd>
+</dl>
 !!end
 
-#### The following section of tests are primarily to test
-#### wikitext escaping capabilities of Parsoid.
-#### A lot of the tests are disabled for the PHP parser either
-#### because of minor newline diffs or other reasons.
-#### As Parsoid serializer can handle newlines and other HTML
-#### more robustly, some of these tests might get reenabled
-#### for the PHP parser.
-
-#### --------------- Headings ---------------
-#### 0. Unnested
-#### 1. Nested inside html <h1>=foo=</h1>
-#### 2. Outside heading nest on a single line <h1>foo</h1>*bar
-#### 3. Nested inside html with wikitext split by html tags
-#### 4. No escape needed
-#### 5. Empty headings <h1></h1>
-#### 6. Heading chars in SOL context
-#### ----------------------------------------
-!! test
-Headings: 0. Unnested
-!! input
-<nowiki>=foo=</nowiki>
+#### ----------------------------------------------------------------
+#### Parsoid-only testing of Parsoid's impl of <ref> and <references>
+#### tags. Parsoid's output for these tags differs from that of the
+#### PHP parser.
+#### ----------------------------------------------------------------
 
-<nowiki>=foo</nowiki>''a''=
-!! result
-<p>=foo=
-</p><p>=foo<i>a</i>=
-</p>
+!!test
+Ref: 1. ref-location should be replaced with an index span
+!!options
+parsoid
+!!input
+A <ref>foo</ref>
+B <ref name="x">foo</ref>
+C <ref name="y" />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span>
+B <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-2">[2]</a></span>
+C <span about="#mwt3" class="reference" data-mw='{"name":"ref","attrs":{"name":"y"}}' id="cite_ref-y-3-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-y-3">[3]</a></span></p>
 !!end
 
-!! test
-Headings: 1. Nested inside html
-!! options
-disabled
-!! input
-=<nowiki>=foo=</nowiki>=
-==<nowiki>=foo=</nowiki>==
-===<nowiki>=foo=</nowiki>===
-====<nowiki>=foo=</nowiki>====
-=====<nowiki>=foo=</nowiki>=====
-======<nowiki>=foo=</nowiki>======
-!! result
-<h1>=foo=</h1>
-<h2>=foo=</h2>
-<h3>=foo=</h3>
-<h4>=foo=</h4>
-<h5>=foo=</h5>
-<h6>=foo=</h6>
+!!test
+Ref: 2. ref-tags with identical names should all get the same index
+!!options
+parsoid
+!!input
+A <ref name="x">foo</ref>
+B <ref name="x" />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
+B <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span></p>
 !!end
 
-!! test
-Headings: 2. Outside heading nest on a single line <h1>foo</h1>*bar
-!! options
-disabled
-!! input
-=foo=
-<nowiki>*bar</nowiki>
-=foo=
-=bar
-=foo=
-<nowiki>=bar=</nowiki>
-!! result
-<h1>foo</h1>*bar
-<h1>foo</h1>=bar
-<h1>foo</h1>=bar=
+!!test
+Ref: 3. spaces in ref-names should be ignored
+!!options
+parsoid
+!!input
+A <ref name="x">foo</ref>
+B <ref name=" x " />
+C <ref name= x  />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"x"}}' id="cite_ref-x-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
+B <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span>
+C <span about="#mwt3" class="reference" data-mw='{"name":"ref","attrs":{"name":"x"}}' id="cite_ref-x-1-2" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-x-1">[1]</a></span></p>
 !!end
 
-!! test
-Headings: 3. Nested inside html with wikitext split by html tags
-!! options
-disabled
-!! input
-=<nowiki>=</nowiki>'''bold'''foo==
-!! result
-<h1>=<b>bold</b>foo=</h1>
+!!test
+Ref: 4. 'constructor' should be accepted as a valid ref-name
+(NOTE: constructor is a predefined property in JS and constructor as a ref-name can clash with it if not handled properly)
+!!options
+parsoid
+!!input
+A <ref name="constructor">foo</ref>
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"constructor"}}' id="cite_ref-constructor-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-constructor-1">[1]</a></span></p>
 !!end
 
-!! test
-Headings: 4. No escaping needed (testing just h1 and h2)
-!! options
-disabled
-!! input
-==foo=
-=foo==
-===foo==
-==foo===
-=''=''foo==
-===
-!! result
-<h1>=foo</h1>
-<h1>foo=</h1>
-<h2>=foo</h2>
-<h2>foo=</h2>
-<h1><i>=</i>foo=</h1>
-<h1>=</h1>
-!!end
+!!test
+Ref: 5. body should accept generic wikitext
+!!options
+parsoid
+!!input
+A <ref>
+ This is a '''[[bolded link]]''' and this is a {{echo|transclusion}}
+</ref>
 
-!! test
-Headings: 5. Empty headings
-!! options
-disabled
-!! input
-=<nowiki></nowiki>=
-==<nowiki></nowiki>==
-===<nowiki></nowiki>===
-====<nowiki></nowiki>====
-=====<nowiki></nowiki>=====
-======<nowiki></nowiki>======
-!! result
-<h1></h1>
-<h2></h2>
-<h3></h3>
-<h4></h4>
-<h5></h5>
-<h6></h6>
-!!end
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"This is a <b data-parsoid=\"{&amp;quot;dsr&amp;quot;:[19,40,3,3]}\"><a rel=\"mw:WikiLink\" href=\"./Bolded_link\" data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;simple&amp;quot;,&amp;quot;a&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;./Bolded_link&amp;quot;},&amp;quot;sa&amp;quot;:{&amp;quot;href&amp;quot;:&amp;quot;bolded link&amp;quot;},&amp;quot;dsr&amp;quot;:[22,37,2,2]}\">bolded link</a></b> and this is a <span about=\"#mwt5\" typeof=\"mw:Transclusion\" data-mw=\"{&amp;quot;parts&amp;quot;:[{&amp;quot;template&amp;quot;:{&amp;quot;target&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;echo&amp;quot;,&amp;quot;href&amp;quot;:&amp;quot;./Template:Echo&amp;quot;},&amp;quot;params&amp;quot;:{&amp;quot;1&amp;quot;:{&amp;quot;wt&amp;quot;:&amp;quot;transclusion&amp;quot;}},&amp;quot;i&amp;quot;:0}}]}\" data-parsoid=\"{&amp;quot;dsr&amp;quot;:[55,76,null,null],&amp;quot;pi&amp;quot;:[[{&amp;quot;k&amp;quot;:&amp;quot;1&amp;quot;,&amp;quot;spc&amp;quot;:[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]}]]}\">transclusion</span>\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
-!! test
-Headings: 6. Heading chars in SOL context
-!! options
-disabled
-!! input
-<!--cmt--><nowiki>=h1=</nowiki>
-!! result
-<p><!--cmt-->=h1=
-</p>
+<ol class="references" typeof="mw:Extension/references" about="#mwt2" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> This is a <b><a rel="mw:WikiLink" href="./Bolded_link">bolded link</a></b> and this is a <span about="#mwt3" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"transclusion"}},"i":0}}]}'>transclusion</span>
+</li>
+</ol>
 !!end
 
-#### --------------- Lists ---------------
-#### 0. Outside nests (*foo, etc.)
-#### 1. Nested inside html <ul><li>*foo</li></ul>
-#### 2. Inside definition lists
-#### 3. Only bullets at start should be escaped
-#### 4. No escapes needed
-#### 5. No unnecessary escapes
-#### 6. Escape bullets in SOL position
-#### 7. Escape bullets in a multi-line context
-#### ----------------------------------------
+!!test
+Ref: 6. indent-pres should not be output in ref-body
+!!options
+parsoid
+!!input
+A <ref>
+ foo
+ bar
+ baz
+</ref>
 
-!! test
-Lists: 0. Outside nests
-!! input
-<nowiki>*foo</nowiki>
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo\n bar\n baz\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
-<nowiki>#foo</nowiki>
-!! result
-<p>*foo
-</p><p>#foo
-</p>
+<ol class="references" typeof="mw:Extension/references" about="#mwt3" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo
+ bar
+ baz
+</li>
+</ol>
 !!end
 
-!! test
-Lists: 1. Nested inside html
-!! input
-*<nowiki>*foo</nowiki>
+!!test
+Ref: 7. No p-wrapping in ref-body
+!!options
+parsoid
+!!input
+A <ref>
+foo
 
-*<nowiki>#foo</nowiki>
+bar
 
-*<nowiki>:foo</nowiki>
 
-*<nowiki>;foo</nowiki>
+baz
 
-#<nowiki>*foo</nowiki>
 
-#<nowiki>#foo</nowiki>
 
-#<nowiki>:foo</nowiki>
+booz
+</ref>
 
-#<nowiki>;foo</nowiki>
-!! result
-<ul><li>*foo
-</li></ul>
-<ul><li>#foo
-</li></ul>
-<ul><li>:foo
-</li></ul>
-<ul><li>;foo
-</li></ul>
-<ol><li>*foo
-</li></ol>
-<ol><li>#foo
-</li></ol>
-<ol><li>:foo
-</li></ol>
-<ol><li>;foo
-</li></ol>
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo\n\nbar\n\n\nbaz\n\n\n\nbooz\n"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
 
-!!end
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo
 
-!! test
-Lists: 2. Inside definition lists
-!! input
-;<nowiki>;foo</nowiki>
+bar
 
-;<nowiki>:foo</nowiki>
 
-;<nowiki>:foo</nowiki>
-:bar
+baz
+
 
-:<nowiki>:foo</nowiki>
-!! result
-<dl><dt>;foo
-</dt></dl>
-<dl><dt>:foo
-</dt></dl>
-<dl><dt>:foo
-</dt><dd>bar
-</dd></dl>
-<dl><dd>:foo
-</dd></dl>
 
+booz
+</li>
+</ol>
 !!end
 
-!! test
-Lists: 3. Only bullets at start of text should be escaped
-!! input
-*<nowiki>*foo*bar</nowiki>
+!!test
+Ref: 8. transclusion wikitext has lower precedence
+!!options
+parsoid
+!!input
+A <ref> foo {{echo|</ref> B C}}
 
-*<nowiki>*foo</nowiki>''it''*bar
-!! result
-<ul><li>*foo*bar
-</li></ul>
-<ul><li>*foo<i>it</i>*bar
-</li></ul>
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo <span typeof=\"mw:Nowiki\" data-parsoid=\"{&amp;quot;src&amp;quot;:&amp;quot;{{&amp;quot;,&amp;quot;dsr&amp;quot;:[12,14,0,0]}\">{{</span>echo|"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C<span typeof="mw:Nowiki">}}</span></p>
 
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <span typeof="mw:Nowiki">{{</span>echo|</li>
+</ol>
 !!end
 
-!! test
-Lists: 4. No escapes needed
-!! options
-disabled
-!! input
-*foo*bar
+!!test
+Ref: 9. unclosed comments should not leak out of ref-body
+!!options
+parsoid
+!!input
+A <ref> foo <!--</ref> B C
 
-*''foo''*bar
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo <!---->"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C</p>
 
-*[[Foo]]: bar
-!! result
-<ul><li>foo*bar
-</li></ul>
-<ul><li><i>foo</i>*bar
-</li></ul>
-<ul><li><a href="Foo" rel="mw:WikiLink">Foo</a>: bar
-</li></ul>
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo <!----></li>
+</ol>
 !!end
 
-!! test
-Lists: 5. No unnecessary escapes
-!! input
-* bar <span><nowiki>[[foo]]</nowiki></span>
-
-*=bar <span><nowiki>[[foo]]</nowiki></span>
+!!test
+Ref: 10. Unclosed HTML tags should not leak out of ref-body
+!!options
+parsoid
+!!input
+A <ref> <b> foo </ref> B C
 
-*[[bar <span><nowiki>[[foo]]</nowiki></span>
+<references />
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"<b data-parsoid=\"{&amp;quot;stx&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;autoInsertedEnd&amp;quot;:true,&amp;quot;dsr&amp;quot;:[8,16,3,0]}\"> foo </b>"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B C</p>
 
-*<nowiki>]]bar </nowiki><span><nowiki>[[foo]]</nowiki></span>
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> <b> foo </b></li>
+</ol>
+!!end
+
+!!test
+Ref: 11. ref-tags acts like an inline element wrt P-wrapping
+!!options
+parsoid
+!!input
+A <ref>foo</ref> B
+C <ref>bar</ref> D
+!!result
+<p>A <span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> B
+C <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span> D</p>
+!!end
+
+!!test
+Ref: 12. ref-tags act as trailing newline migration barrier
+!!options
+parsoid
+!!input
+<!--the newline at the end of this line moves out of the p-tag-->a
+
+b<!--the newline at the end of this line stays inside the p-tag--> <ref />
+<ref />
+
+c
+!!result
+<p><!--the newline at the end of this line moves out of the p-tag-->a</p>
+
+
+<p>b<!--the newline at the end of this line stays inside the p-tag--> <span about="#mwt1" class="reference" data-mw='{"name":"ref","attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span>
+<span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span></p>
 
-*=bar <span>foo]]</span>=
-!! result
-<ul><li> bar <span>[[foo]]</span>
-</li></ul>
-<ul><li>=bar <span>[[foo]]</span>
-</li></ul>
-<ul><li>[[bar <span>[[foo]]</span>
-</li></ul>
-<ul><li>]]bar <span>[[foo]]</span>
-</li></ul>
-<ul><li>=bar <span>foo]]</span>=
-</li></ul>
 
+<p>c</p>
 !!end
 
-!! test
-Lists: 6. Escape bullets in SOL position
-!! options
-disabled
-!! input
-<!--cmt--><nowiki>*foo</nowiki>
-!! result
-<p><!--cmt-->*foo
-</p>
+!!test
+Ref: 13. ref-tags are not SOL-transparent and block indent-pres
+!!options
+parsoid
+!!input
+<ref>foo</ref> A
+<ref>bar
+</ref> B
+!!result
+<p><span about="#mwt1" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span> A
+<span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"bar\n"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span> B</p>
 !!end
 
-!! test
-Lists: 7. Escape bullets in a multi-line context
-!! input
-<nowiki>a
-*b</nowiki>
-!! result
-<p>a
-*b
-</p>
+!!test
+Ref: 14. A nested ref-tag should be emitted as plain text
+!!options
+parsoid
+!!input
+<ref>foo <ref>bar</ref> baz</ref>
+
+<references />
+!!result
+<p><span about="#mwt1" class="reference" data-mw="{&quot;name&quot;:&quot;ref&quot;,&quot;body&quot;:{&quot;html&quot;:&quot;foo &amp;lt;ref&amp;gt;bar&amp;lt;/ref&amp;gt; baz&quot;},&quot;attrs&quot;:{}}" id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt2" data-mw="{&quot;name&quot;:&quot;references&quot;,&quot;attrs&quot;:{}}">
+<li about="#cite_note-1" id="cite_note-1" data-parsoid="{}"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo &lt;ref&gt;bar&lt;/ref&gt; baz</li>
+</ol>
 !!end
 
-#### --------------- HRs ---------------
-#### 1. Single line
-#### -----------------------------------
+!!test
+Ref: 15. ref-tags with identical names should get identical indexes
+!!options
+parsoid
+!!input
+A1 <ref name="a">foo</ref> A2 <ref name="a" />
+B1 <ref name="b" /> B2 <ref name="b">bar</ref>
+
+<references />
+!!result
+<p>A1 <span about="#mwt3" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span> A2 <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span>
+B1 <span about="#mwt7" class="reference" data-mw='{"name":"ref","attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span> B2 <span about="#mwt8" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-1" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
+
+<ol about="#mwt10" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy">↑ <a href="#cite_ref-a-1-0">1.0</a> <a href="#cite_ref-a-1-1">1.1</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy">↑ <a href="#cite_ref-b-2-0">2.0</a> <a href="#cite_ref-b-2-1">2.1</a></span> bar</li>
+</ol>
+!!end
+
+!!test
+References: 1. references tag without any refs should be handled properly
+!!options
+parsoid
+!!input
+<references />
+!!result
+<ol about="#mwt2" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'></ol>
+!!end
+
+!!test
+References: 2. references tag with group only outputs references from that group
+!!options
+parsoid
+!!input
+A <ref group="a">foo</ref>
+B <ref group="b">bar</ref>
+
+<references group='a' />
+!!result
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"group":"b"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[b 1]</a></span></p>
+
+<ol about="#mwt6" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li>
+</ol>
+!!end
+
+!!test
+References: 3. ref list should be cleared after processing references
+!!options
+parsoid
+!!input
+A <ref>foo</ref>
+
+<references />
+
+B <ref>bar</ref>
+
+<references />
+!!result
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol about="#mwt4" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo</li>
+</ol>
+
+<p>B <span about="#mwt6" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span></p>
+
+<ol about="#mwt8" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bar</li>
+</ol>
+!!end
+
+!!test
+References: 4. only referenced group should be cleared after processing references
+!!options
+parsoid
+!!input
+A <ref group="a">afoo</ref>
+B <ref>bfoo</ref>
+
+<references group="a"/>
+
+C <ref>cfoo</ref>
+
+<references />
+!!result
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"afoo"},"attrs":{"group":"a"}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[a 1]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bfoo"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"<ref>bfoo</ref>","dsr":[30,45,5,6]}'><a href="#cite_note-1">[1]</a></span></p>
+
+<ol about="#mwt6" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{"group":"a"}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> afoo</li>
+</ol>
+
+<p>C <span about="#mwt8" class="reference" data-mw='{"name":"ref","body":{"html":"cfoo"},"attrs":{}}' id="cite_ref-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-2">[2]</a></span></p>
+
+<ol about="#mwt10" class="references" typeof="mw:Extension/references" data-mw='{"name":"references","attrs":{}}'><li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> bfoo</li><li about="#cite_note-2" id="cite_note-2"><span rel="mw:referencedBy"><a href="#cite_ref-2-0">↑</a></span> cfoo</li>
+</ol>
+!!end
+
+!!test
+References: 5. ref tags in references should be processed while ignoring all other content
+!!options
+parsoid
+!!input
+A <ref name="a" />
+B <ref name="b">bar</ref>
+
+<references>
+<ref name="a">foo</ref>
+This should just get lost.
+</references>
+!!result
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","attrs":{"name":"a"}}' id="cite_ref-a-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-a-1">[1]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","body":{"html":"bar"},"attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","body":{"extsrc":"<ref name=\"a\">foo</ref>\nThis should just get lost.","html":"\n<span about=\"#mwt8\" class=\"reference\" data-mw=\"{&amp;quot;name&amp;quot;:&amp;quot;ref&amp;quot;,&amp;quot;body&amp;quot;:{&amp;quot;html&amp;quot;:&amp;quot;foo&amp;quot;},&amp;quot;attrs&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;a&amp;quot;}}\" rel=\"dc:references\" typeof=\"mw:Extension/ref\"><a href=\"#cite_note-a-1\">[1]</a></span>\n"},"attrs":{}}'><li about="#cite_note-a-1" id="cite_note-a-1"><span rel="mw:referencedBy"><a href="#cite_ref-a-1-0">↑</a></span> foo</li><li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> bar</li>
+</ol>
+!!end
+
+!!test
+References: 6. <references /> from a transclusion
+!!options
+parsoid
+!!input
+{{echo|<references />}}
+!!result
+<ol class="references" about="#mwt2" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<references />"}},"i":0}}]}'></ol>
+!!end
 
 !! test
-HRs: 1. Single line
+References: 7. Multiple references tags (one without and one with nested refs) should be correctly handled
 !! options
-disabled
+parsoid
 !! input
-----
-<nowiki>----</nowiki>
-----
-<nowiki>=foo=</nowiki>
-----
-<nowiki>*foo</nowiki>
+A <ref>foo bar for a</ref>
+B <ref name="b" />
+
+<references />
+
+<references>
+<ref name="b">foo</ref>
+</references>
 !! result
-<hr/>----
-<hr/>=foo=
-<hr/>*foo
+<p>A <span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"foo bar for a"},"attrs":{}}' id="cite_ref-1-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-1">[1]</a></span>
+B <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"name":"b"}}' id="cite_ref-b-2-0" rel="dc:references" typeof="mw:Extension/ref"><a href="#cite_note-b-2">[2]</a></span></p>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt6" data-mw='{"name":"references","attrs":{}}'>
+<li about="#cite_note-1" id="cite_note-1"><span rel="mw:referencedBy"><a href="#cite_ref-1-0">↑</a></span> foo bar for a</li>
+<li about="#cite_note-b-2" id="cite_note-b-2"><span rel="mw:referencedBy"><a href="#cite_ref-b-2-0">↑</a></span> </li>
+</ol>
+
+<ol class="references" typeof="mw:Extension/references" about="#mwt8" data-mw='{"name":"references","body":{"extsrc":"<ref name=\"b\">foo</ref>","html":"\n<span about=\"#mwt10\" class=\"reference\" data-mw=\"{&amp;quot;name&amp;quot;:&amp;quot;ref&amp;quot;,&amp;quot;body&amp;quot;:{&amp;quot;html&amp;quot;:&amp;quot;foo&amp;quot;},&amp;quot;attrs&amp;quot;:{&amp;quot;name&amp;quot;:&amp;quot;b&amp;quot;}}\" rel=\"dc:references\" typeof=\"mw:Extension/ref\"><a href=\"#cite_note-b-1\">[1]</a></span>\n"},"attrs":{}}'>
+<li about="#cite_note-b-1" id="cite_note-b-1"><span rel="mw:referencedBy">↑</span> foo</li>
+</ol>
 !! end
 
-#### --------------- Tables ---------------
-#### 1a. Simple example
-#### 1b. No escaping needed (!foo)
-#### 1c. No escaping needed (|foo)
-#### 1d. No escaping needed (|}foo)
-####
-#### 2a. Nested in td (<td>foo|bar</td>)
-#### 2b. Nested in td (<td>foo||bar</td>)
-#### 2c. Nested in td -- no escaping needed(<td>foo!!bar</td>)
-####
-#### 3a. Nested in th (<th>foo!bar</th>)
-#### 3b. Nested in th (<th>foo!!bar</th>)
-#### 3c. Nested in th -- no escaping needed(<th>foo||bar</th>)
+#### ----------------------------------------------------------------
+#### The following section of tests are primarily to test
+#### wikitext escaping capabilities of Parsoid.  Given that
+#### escaping can be done any number of ways, the wikitext (input)
+#### is always adjusted to reflect how Parsoid adds nowiki
+#### escape tags.
 ####
-#### 4a. Escape -
-#### 4b. Escape +
-#### 4c. No escaping needed
-#### --------------------------------------
+#### We are marking several tests as parsoid-only since the
+#### HTML in the result section is different from what the
+#### PHP parser generates for it.
+#### ----------------------------------------------------------------
 
-!! test
-Tables: 1a. Simple example
-!! input
-<nowiki>{|
-|}</nowiki>
-!! result
-<p>{|
-|}
-</p>
-!! end
 
+#### --------------- Headings ---------------
+#### 0. Unnested
+#### 1. Nested inside html <h1>=foo=</h1>
+#### 2. Outside heading nest on a single line <h1>foo</h1>*bar
+#### 3. Nested inside html with wikitext split by html tags
+#### 4. No escape needed
+#### 5. Empty headings <h1></h1>
+#### 6. Heading chars in SOL context
+#### ----------------------------------------
 !! test
-Tables: 1b. No escaping needed
+Headings: 0. Unnested
+!! options
+parsoid
 !! input
-!foo
-!! result
-<p>!foo
-</p>
-!! end
+<nowiki>=foo=</nowiki>
 
-!! test
-Tables: 1c. No escaping needed
-!! input
-|foo
+<nowiki> =foo= </nowiki>
+<!--cmt-->
+<nowiki>=foo=</nowiki>
+
+=foo''a''<nowiki>=</nowiki>
 !! result
-<p>|foo
-</p>
-!! end
+<p><span typeof="mw:Nowiki">=foo=</span></p>
+
+<p><span typeof="mw:Nowiki"> =foo= </span>
+<!--cmt-->
+<span typeof="mw:Nowiki">=foo=</span></p>
+
+<p>=foo<i>a</i><span typeof="mw:Nowiki">=</span></p>
+!!end
 
 !! test
-Tables: 1d. No escaping needed
+Headings: 1. Nested inside html
+!! options
+parsoid
 !! input
-|}foo
+=<nowiki>=foo=</nowiki>=
+
+==<nowiki>=foo=</nowiki>==
+
+===<nowiki>=foo=</nowiki>===
+
+====<nowiki>=foo=</nowiki>====
+
+=====<nowiki>=foo=</nowiki>=====
+
+======<nowiki>=foo=</nowiki>======
 !! result
-<p>|}foo
-</p>
-!! end
+<h1><span typeof="mw:Nowiki">=foo=</span></h1>
+<h2><span typeof="mw:Nowiki">=foo=</span></h2>
+<h3><span typeof="mw:Nowiki">=foo=</span></h3>
+<h4><span typeof="mw:Nowiki">=foo=</span></h4>
+<h5><span typeof="mw:Nowiki">=foo=</span></h5>
+<h6><span typeof="mw:Nowiki">=foo=</span></h6>
+!!end
 
 !! test
-Tables: 2a. Nested in td
+Headings: 2. Outside heading nest on a single line <h1>foo</h1>*bar
 !! options
-disabled
+parsoid
 !! input
-{|
-|<nowiki>foo|bar</nowiki>
-|}
-!! result
-<table>
-<tr><td>foo|bar
-</td></tr></table>
+=foo=
+<nowiki>*</nowiki>bar
 
-!! end
+=foo=
+=bar
+
+=foo=
+<nowiki>=bar=</nowiki>
+!! result
+<h1>foo</h1>*bar
+<h1>foo</h1>=bar
+<h1>foo</h1>=bar=
+!!end
 
 !! test
-Tables: 2b. Nested in td
+Headings: 3. Nested inside html with wikitext split by html tags
 !! options
-disabled
+parsoid
 !! input
-{|
-|<nowiki>foo||bar</nowiki>
-|''it''<nowiki>foo||bar</nowiki>
-|}
+=='''bold'''<nowiki>foo=</nowiki>=
 !! result
-<table>
-<tr><td>foo||bar
-</td><td><i>it</i>foo||bar
-</td></tr></table>
-
-!! end
+<h1>=<b>bold</b><span typeof="mw:Nowiki">foo=</span></h1>
+!!end
 
 !! test
-Tables: 2c. Nested in td -- no escaping needed
+Headings: 4a. No escaping needed (testing just h1 and h2)
 !! options
-disabled
+parsoid
 !! input
-{|
-|foo!!bar
-|}
-!! result
-<table>
-<tr><td>foo!!bar
-</td></tr></table>
+==foo=
 
-!! end
+=foo==
 
-!! test
-Tables: 3a. Nested in th
-!! options
-disabled
-!! input
-{|
-!foo!bar
-|}
-!! result
-<table>
-<tr><th>foo!bar
-</th></tr></table>
+= =foo= =
 
-!! end
+==foo= bar=
 
-!! test
-Tables: 3b. Nested in th
-!! options
-disabled
-!! input
-{|
-!<nowiki>foo!!bar</nowiki>
-|}
-!! result
-<table>
-<tr><th>foo!!bar
-</th></tr></table>
+===foo==
 
-!! end
+==foo===
 
-!! test
-Tables: 3c. Nested in th -- no escaping needed
-!! options
-disabled
-!! input
-{|
-!foo||bar
-|}
-!! result
-<table>
-<tr><th>foo||bar
-</th></tr></table>
+=''=''foo==
 
-!! end
+=<nowiki>=</nowiki>=
+!! result
+<h1>=foo</h1>
+<h1>foo=</h1>
+<h1> =foo= </h1>
+<h1>=foo= bar</h1>
+<h2>=foo</h2>
+<h2>foo=</h2>
+<h1><i>=</i>foo=</h1>
+<h1><span typeof="mw:Nowiki">=</span></h1>
+!!end
 
 !! test
-Tables: 4a. Escape -
+Headings: 4b. No escaping needed (inside p-tags)
 !! options
-disabled
+parsoid
 !! input
-{|
-|-
-!-bar
-|-
-|<nowiki>-bar</nowiki>
-|}
+===
+=foo= x
+=foo= <s></s>
 !! result
-<table><tbody>
-<tr><th>-bar</th></tr>
-<tr><td>-bar</td></tr>
-</tbody></table>
-!! end
+<p>===
+=foo= x
+=foo= <s></s>
+</p>
+!!end
 
 !! test
-Tables: 4b. Escape +
+Headings: 5. Empty headings
 !! options
-disabled
+parsoid
 !! input
-{|
-|-
-!+bar
-|-
-|<nowiki>+bar</nowiki>
-|}
+=<nowiki/>=
+
+==<nowiki/>==
+
+===<nowiki/>===
+
+====<nowiki/>====
+
+=====<nowiki/>=====
+
+======<nowiki/>======
 !! result
-<table><tbody>
-<tr><th>+bar</th></tr>
-<tr><td>+bar</td></tr>
-</tbody></table>
-!! end
+<h1></h1>
+<h2></h2>
+<h3></h3>
+<h4></h4>
+<h5></h5>
+<h6></h6>
+!!end
 
 !! test
-Tables: 4c. No escaping needed
+Headings: 6a. Heading chars in SOL context (with trailing spaces)
 !! options
-disabled
+parsoid
 !! input
-{|
-|-
-|foo-bar
-|foo+bar
-|-
-|''foo''-bar
-|''foo''+bar
-|}
-!! result
-<table><tbody>
-<tr><td>foo-bar</td><td>foo+bar</td></tr>
-<tr><td><i>foo</i>-bar</td><td><i>foo</i>+bar</td></tr>
-</tbody></table>
-!! end
+<nowiki>=a=</nowiki>
 
-!! test
-Tables: 4d. No escaping needed
-!! input
-{|
-||+1
-||-2
-|}
-!! result
-<table>
-<tr>
-<td>+1
-</td>
-<td>-2
-</td></tr></table>
+<nowiki>=a=</nowiki> 
 
-!! end
+<nowiki>=a=</nowiki>	
 
-#### --------------- Links ---------------
-#### 1. Quote marks in link text
-#### 2. Wikilinks: Escapes needed
-#### 3. Wikilinks: No escapes needed
-#### 4. Extlinks: Escapes needed
-#### 5. Extlinks: No escapes needed
-#### --------------------------------------
-!! test
-Links 1. Quote marks in link text
-!! options
-disabled
-!! input
-[[Foo|<nowiki>Foo''boo''</nowiki>]]
+<nowiki>=a=</nowiki> 	
 !! result
-<a rel="mw:WikiLink" href="Foo">Foo''boo''</a>
-!! end
+<p>=a=</p>
+<p>=a= </p>
+<p>=a=	</p>
+<p>=a= 	</p>
+!!end
 
 !! test
-Links 2. WikiLinks: Escapes needed
+Headings: 6b. Heading chars in SOL context (with trailing newlines)
 !! options
-disabled
+parsoid
 !! input
-[[Foo|<nowiki>[Foobar]</nowiki>]]
-[[Foo|<nowiki>Foobar]</nowiki>]]
-[[Foo|<nowiki>x [Foobar] x</nowiki>]]
-[[Foo|<nowiki>x [http://google.com g] x</nowiki>]]
-[[Foo|<nowiki>[[Bar]]</nowiki>]]
-[[Foo|<nowiki>x [[Bar]] x</nowiki>]]
-[[Foo|<nowiki>|Bar</nowiki>]]
+<nowiki>=a=
+b</nowiki>
+
+<nowiki>=a= 
+b</nowiki>
+
+<nowiki>=a=	
+b</nowiki>
+
+<nowiki>=a=	 
+b</nowiki>
 !! result
-<a href="Foo" rel="mw:WikiLink">[Foobar]</a>
-<a href="Foo" rel="mw:WikiLink">Foobar]</a>
-<a href="Foo" rel="mw:WikiLink">x [Foobar] x</a>
-<a href="Foo" rel="mw:WikiLink">x [http://google.com g] x</a>
-<a href="Foo" rel="mw:WikiLink">[[Bar]]</a>
-<a href="Foo" rel="mw:WikiLink">x [[Bar]] x</a>
-<a href="Foo" rel="mw:WikiLink">|Bar</a>
-!! end
+<p>=a=
+b</p>
+<p>=a= 
+b</p>
+<p>=a=	
+b</p>
+<p>=a=	 
+b</p>
+</p>
+!!end
 
 !! test
-Links 3. WikiLinks: No escapes needed
+Headings: 6c. Heading chars in SOL context (leading newline break)
 !! options
-disabled
+parsoid
 !! input
-[[Foo|[Foobar]]
-[[Foo|foo|bar]]
+a
+<nowiki>=b=</nowiki>
 !! result
-<a href="Foo" rel="mw:WikiLink">[Foobar</a>
-<a href="Foo" rel="mw:WikiLink">foo|bar</a>
-!! end
+<p>a
+=b=</p>
+!!end
 
 !! test
-Links 4. ExtLinks: Escapes needed
+Headings: 6d. Heading chars in SOL context (with interspersed comments)
 !! options
-disabled
+parsoid
 !! input
-[http://google.com <nowiki>[google]</nowiki>]
-[http://google.com <nowiki>google]</nowiki>]
+<!--c0--><nowiki>=a=</nowiki>
+<!--c1-->
+<nowiki>=a=</nowiki> <!--c2-->	 <!--c3-->
 !! result
-<a href="http://google.com" rel="mw:ExtLink">[google]</a>
-<a href="http://google.com" rel="mw:ExtLink">google]</a>
-!! end
+<p><!--c0-->=a=</p>
+<p><!--c1-->=a= <!--c2-->	 <!--c3--></p>
+!!end
 
 !! test
-Links 5. ExtLinks: No escapes needed
+Headings: 6d. Heading chars in SOL context (No escaping needed)
 !! options
-disabled
+parsoid=html2wt
 !! input
-[http://google.com [google]
+=a=<div>b</div>
 !! result
-<a href="http://google.com" rel="mw:ExtLink">[google</a>
-!! end
+=a=<div>b</div>
+!!end
 
-#### --------------- Quotes ---------------
-#### 1. Quotes inside <b> and <i>
-#### 2. Link fragments separated by <i> and <b> tags
-#### 3. Link fragments inside <i> and <b>
-#### --------------------------------------
-!! test
-1. Quotes inside <b> and <i>
-!! input
-''<nowiki>'foo'</nowiki>''
-''<nowiki>''foo''</nowiki>''
-''<nowiki>'''foo'''</nowiki>''
-'''<nowiki>'foo'</nowiki>'''
-'''<nowiki>''foo''</nowiki>'''
-'''<nowiki>'''foo'''</nowiki>'''
-'''<nowiki>foo'</nowiki>''<nowiki>bar'</nowiki>''baz'''
-!! result
-<p><i>'foo'</i>
-<i>''foo''</i>
-<i>'''foo'''</i>
-<b>'foo'</b>
-<b>''foo''</b>
-<b>'''foo'''</b>
-<b>foo'<i>bar'</i>baz</b>
-</p>
-!! end
+#### --------------- Lists ---------------
+#### 0. Outside nests (*foo, etc.)
+#### 1. Nested inside html <ul><li>*foo</li></ul>
+#### 2. Inside definition lists
+#### 3. Only bullets at start should be escaped
+#### 4. No escapes needed
+#### 5. No unnecessary escapes
+#### 6. Escape bullets in SOL position
+#### 7. Escape bullets in a multi-line context
+#### ----------------------------------------
 
 !! test
-2. Link fragments separated by <i> and <b> tags
+Lists: 0. Outside nests
 !! input
-[[''foo''<nowiki>hello]]</nowiki>
+<nowiki>*</nowiki>foo
 
-[['''foo'''<nowiki>hello]]</nowiki>
+<nowiki>#</nowiki>foo
 !! result
-<p>[[<i>foo</i>hello]]
-</p><p>[[<b>foo</b>hello]]
+<p>*foo
+</p><p>#foo
 </p>
-!! end
+!!end
 
 !! test
-2. Link fragments inside <i> and <b>
-(FIXME: Escaping one or both of [[ and ]] is also acceptable --
- this is one of the shortcomings of this format)
+Lists: 1. Nested inside html
 !! input
-''[[foo''<nowiki>]]</nowiki>
+*<nowiki>*foo</nowiki>
+
+*<nowiki>#foo</nowiki>
+
+*<nowiki>:foo</nowiki>
+
+*<nowiki>;foo</nowiki>
+
+#<nowiki>*foo</nowiki>
+
+#<nowiki>#foo</nowiki>
+
+#<nowiki>:foo</nowiki>
+
+#<nowiki>;foo</nowiki>
+!! result
+<ul>
+<li>*foo
+</li>
+</ul>
+<ul>
+<li>#foo
+</li>
+</ul>
+<ul>
+<li>:foo
+</li>
+</ul>
+<ul>
+<li>;foo
+</li>
+</ul>
+<ol>
+<li>*foo
+</li>
+</ol>
+<ol>
+<li>#foo
+</li>
+</ol>
+<ol>
+<li>:foo
+</li>
+</ol>
+<ol>
+<li>;foo
+</li>
+</ol>
+
+!!end
+
+!! test
+Lists: 2. Inside definition lists
+!! input
+;<nowiki>;foo</nowiki>
+
+;<nowiki>:foo</nowiki>
+
+;<nowiki>:foo</nowiki>
+:bar
+
+:<nowiki>:foo</nowiki>
+!! result
+<dl>
+<dt>;foo
+</dt>
+</dl>
+<dl>
+<dt>:foo
+</dt>
+</dl>
+<dl>
+<dt>:foo
+</dt>
+<dd>bar
+</dd>
+</dl>
+<dl>
+<dd>:foo
+</dd>
+</dl>
+
+!!end
+
+!! test
+Lists: 3. Only bullets at start of text should be escaped
+!! input
+*<nowiki>*foo*bar</nowiki>
+
+*<nowiki>*foo</nowiki>''it''*bar
+!! result
+<ul>
+<li>*foo*bar
+</li>
+</ul>
+<ul>
+<li>*foo<i>it</i>*bar
+</li>
+</ul>
+
+!!end
+
+!! test
+Lists: 4. No escapes needed
+!! options
+parsoid
+!! input
+*foo*bar
+
+*''foo''*bar
+
+*[[Foo]]: bar
+!! result
+<ul>
+<li>foo*bar
+</li>
+</ul>
+<ul>
+<li><i>foo</i>*bar
+</li>
+</ul>
+<ul>
+<li><a rel="mw:WikiLink" href="Foo">Foo</a>: bar
+</li>
+</ul>
+!!end
+
+!! test
+Lists: 5. No unnecessary escapes
+!! input
+* bar <span><nowiki>[[foo]]</nowiki></span>
+
+*=bar <span><nowiki>[[foo]]</nowiki></span>
+
+*[[bar <span><nowiki>[[foo]]</nowiki></span>
+
+*]]bar <span><nowiki>[[foo]]</nowiki></span>
+
+*=bar <span>foo]]</span>=
+
+* <s></s>: a
+!! result
+<ul>
+<li> bar <span>[[foo]]</span>
+</li>
+</ul>
+<ul>
+<li>=bar <span>[[foo]]</span>
+</li>
+</ul>
+<ul>
+<li>[[bar <span>[[foo]]</span>
+</li>
+</ul>
+<ul>
+<li>]]bar <span>[[foo]]</span>
+</li>
+</ul>
+<ul>
+<li>=bar <span>foo]]</span>=
+</li>
+</ul>
+<ul>
+<li> <s></s>: a
+</li>
+</ul>
+
+!!end
+
+!! test
+Lists: 6. Escape bullets in SOL position
+!! options
+parsoid
+!! input
+<!--cmt--><nowiki>*foo</nowiki>
+!! result
+<p><!--cmt--><span typeof="mw:Nowiki">*foo</span></p>
+!!end
+
+!! test
+Lists: 7. Escape bullets in a multi-line context
+!! input
+a
+<nowiki>*</nowiki>b
+!! result
+<p>a
+*b
+</p>
+!!end
+
+#### --------------- HRs ---------------
+#### 1. Single line
+#### -----------------------------------
+
+!! test
+HRs: 1. Single line
+!! options
+parsoid
+!! input
+----<nowiki>----</nowiki>
+----=foo=
+----*foo
+!! result
+<hr><span typeof="mw:Nowiki">----</span>
+<hr>=foo=
+<hr>*foo
+!! end
+
+#### --------------- Tables ---------------
+#### 1a. Simple example
+#### 1b. No escaping needed (!foo)
+#### 1c. No escaping needed (|foo)
+#### 1d. No escaping needed (|}foo)
+####
+#### 2a. Nested in td (<td>foo|bar</td>)
+#### 2b. Nested in td (<td>foo||bar</td>)
+#### 2c. Nested in td -- no escaping needed(<td>foo!!bar</td>)
+####
+#### 3a. Nested in th (<th>foo!bar</th>)
+#### 3b. Nested in th (<th>foo!!bar</th>)
+#### 3c. Nested in th -- no escaping needed(<th>foo||bar</th>)
+####
+#### 4a. Escape -
+#### 4b. Escape +
+#### 4c. No escaping needed
+#### --------------------------------------
+
+!! test
+Tables: 1a. Simple example
+!! input
+<nowiki>{|
+|}</nowiki>
+!! result
+<p>{|
+|}
+</p>
+!! end
+
+!! test
+Tables: 1b. No escaping needed
+!! input
+!foo
+!! result
+<p>!foo
+</p>
+!! end
+
+!! test
+Tables: 1c. No escaping needed
+!! input
+|foo
+!! result
+<p>|foo
+</p>
+!! end
+
+!! test
+Tables: 1d. No escaping needed
+!! input
+|}foo
+!! result
+<p>|}foo
+</p>
+!! end
+
+!! test
+Tables: 2a. Nested in td
+!! options
+parsoid
+!! input
+{|
+|<nowiki>foo|bar</nowiki>
+|}
+!! result
+<table><tbody><tr>
+<td><span typeof="mw:Nowiki">foo|bar</span></td></tr></tbody></table>
+!! end
+
+!! test
+Tables: 2b. Nested in td
+!! options
+parsoid
+!! input
+{|
+|<nowiki>foo||bar</nowiki>
+|''it''<nowiki>foo||bar</nowiki>
+|}
+!! result
+<table><tbody><tr>
+<td><span typeof="mw:Nowiki">foo||bar</span></td>
+<td><i>it</i><span typeof="mw:Nowiki">foo||bar</span></td></tr></tbody></table>
+!! end
+
+!! test
+Tables: 2c. Nested in td -- no escaping needed
+!! options
+parsoid
+!! input
+{|
+|foo!!bar
+|}
+!! result
+<table><tbody><tr><td>foo!!bar
+</td></tr></tbody></table>
+
+!! end
+
+!! test
+Tables: 3a. Nested in th
+!! options
+parsoid
+!! input
+{|
+!foo!bar
+|}
+!! result
+<table><tbody><tr><th>foo!bar
+</th></tr></tbody></table>
+
+!! end
+
+!! test
+Tables: 3b. Nested in th
+!! options
+parsoid
+!! input
+{|
+!<nowiki>foo!!bar</nowiki>
+|}
+!! result
+<table>
+<tbody><tr><th><span typeof="mw:Nowiki">foo!!bar</span></th></tr>
+</tbody></table>
+!! end
+
+!! test
+Tables: 3c. Nested in th -- no escaping needed
+!! options
+parsoid
+!! input
+{|
+!<nowiki>foo||bar</nowiki>
+|}
+!! result
+<table><tbody><tr>
+<th><span typeof="mw:Nowiki">foo||bar</span></th></tr></tbody></table>
+!! end
+
+!! test
+Tables: 4a. Escape -
+!! options
+parsoid
+!! input
+{|
+!-bar
+|-
+|<nowiki>-bar</nowiki>
+|}
+!! result
+<table><tbody>
+<tr><th>-bar</th></tr>
+<tr>
+<td><span typeof="mw:Nowiki">-bar</span></td></tr></tbody></table>
+!! end
+
+!! test
+Tables: 4b. Escape +
+!! options
+parsoid
+!! input
+{|
+!+bar
+|-
+|<nowiki>+bar</nowiki>
+|}
+!! result
+<table><tbody>
+<tr><th>+bar</th></tr>
+<tr>
+<td><span typeof="mw:Nowiki">+bar</span></td></tr></tbody></table>
+!! end
+
+!! test
+Tables: 4c. No escaping needed
+!! options
+parsoid
+!! input
+{|
+|foo-bar
+|foo+bar
+|-
+|''foo''-bar
+|''foo''+bar
+|-
+|foo
+bar|baz
++bar
+-bar
+|}
+!! result
+<table><tbody>
+<tr><td>foo-bar</td><td>foo+bar</td></tr>
+<tr><td><i>foo</i>-bar</td><td><i>foo</i>+bar</td></tr>
+<tr><td>foo
+<p>bar|baz
++bar
+-bar</p></td></tr>
+</tbody></table>
+!! end
+
+### SSS FIXME: Disabled right now because accurate html2wt
+### on this snippet requires data-parsoid flags that we've
+### stripped out of these tests.  We should scheme how we
+### we want to handle these kind of tests that require
+### data-parsoid flags for accurate html2wt serialization
+
+!! test
+Tables: 4d. No escaping needed
+!! options
+disabled
+!! input
+{|
+||+1
+||-2
+|}
+!! result
+<table>
+<tr>
+<td>+1
+</td>
+<td>-2
+</td></tr></table>
+
+!! end
+
+#### --------------- Links ----------------
+#### 1. Quote marks in link text
+#### 2. Wikilinks: Escapes needed
+#### 3. Wikilinks: No escapes needed
+#### 4. Extlinks: Escapes needed
+#### 5. Extlinks: No escapes needed
+#### --------------------------------------
+!! test
+Links 1. Quote marks in link text
+!! options
+parsoid
+!! input
+[[Foo|Foo<nowiki>''boo''</nowiki>]]
+!! result
+<a rel="mw:WikiLink" href="Foo">Foo''boo''</a>
+!! end
+
+!! test
+Links 2. WikiLinks: Escapes needed
+!! options
+parsoid
+!! input
+[[Foo|<nowiki>[Foobar]</nowiki>]]
+[[Foo|<nowiki>Foobar]</nowiki>]]
+[[Foo|x [Foobar] x]]
+[[Foo|<nowiki>x [http://google.com g] x</nowiki>]]
+[[Foo|<nowiki>[[Bar]]</nowiki>]]
+[[Foo|<nowiki>x [[Bar]] x</nowiki>]]
+[[Foo|<nowiki>|Bar</nowiki>]]
+[[Foo|<nowiki>]]bar</nowiki>]]
+[[Foo|<nowiki>[[bar</nowiki>]]
+[[Foo|<nowiki>x ]] y [[ z</nowiki>]]
+!! result
+<a href="Foo" rel="mw:WikiLink">[Foobar]</a>
+<a href="Foo" rel="mw:WikiLink">Foobar]</a>
+<a href="Foo" rel="mw:WikiLink">x [Foobar] x</a>
+<a href="Foo" rel="mw:WikiLink">x [http://google.com g] x</a>
+<a href="Foo" rel="mw:WikiLink">[[Bar]]</a>
+<a href="Foo" rel="mw:WikiLink">x [[Bar]] x</a>
+<a href="Foo" rel="mw:WikiLink">|Bar</a>
+<a href="Foo" rel="mw:WikiLink">]]bar</a>
+<a href="Foo" rel="mw:WikiLink">[[bar</a>
+<a href="Foo" rel="mw:WikiLink">x ]] y [[ z</a>
+!! end
+
+!! test
+Links 3. WikiLinks: No escapes needed
+!! options
+parsoid
+!! input
+[[Foo|[Foobar]]
+[[Foo|foo|bar]]
+!! result
+<a href="Foo" rel="mw:WikiLink">[Foobar</a>
+<a href="Foo" rel="mw:WikiLink">foo|bar</a>
+!! end
+
+!! test
+Links 4. ExtLinks: Escapes needed
+!! options
+parsoid
+!! input
+[http://google.com <nowiki>[google]</nowiki>]
+[http://google.com <nowiki>google]</nowiki>]
+!! result
+<a href="http://google.com" rel="mw:ExtLink">[google]</a>
+<a href="http://google.com" rel="mw:ExtLink">google]</a>
+!! end
+
+!! test
+Links 5. ExtLinks: No escapes needed
+!! options
+parsoid
+!! input
+[http://google.com [google]
+!! result
+<a href="http://google.com" rel="mw:ExtLink">[google</a>
+!! end
+
+#### --------------- Quotes ---------------
+#### 1. Quotes inside <b> and <i>
+#### 2. Link fragments separated by <i> and <b> tags
+#### 3. Link fragments inside <i> and <b>
+#### 4. No escaping needed
+#### --------------------------------------
+!! test
+1. Quotes inside <b> and <i>
+!! options
+parsoid=html2wt,wt2wt
+!! input
+''<nowiki>'foo'</nowiki>''
+''<nowiki>''foo''</nowiki>''
+''<nowiki>'''foo'''</nowiki>''
+''foo''<nowiki/>'s
+'''<nowiki>'foo'</nowiki>'''
+'''<nowiki>''foo''</nowiki>'''
+'''<nowiki>'''foo'''</nowiki>'''
+'''<nowiki>foo'</nowiki>''<nowiki>bar'</nowiki>''baz'''
+'''foo'''<nowiki/>'s
+'''foo''
+''foo''<nowiki/>'
+'<nowiki/>''foo''<nowiki/>'
+''''foo'''
+'''foo'''<nowiki/>'
+'<nowiki/>'''foo'''<nowiki/>'
+!! result
+<p><i>'foo'</i>
+<i>''foo''</i>
+<i>'''foo'''</i>
+<i>foo</i>'s
+<b>'foo'</b>
+<b>''foo''</b>
+<b>'''foo'''</b>
+<b>foo'<i>bar'</i>baz</b>
+<b>foo</b>'s
+'<i>foo</i>
+<i>foo</i>'
+'<i>foo</i>'
+'<b>foo</b>
+<b>foo</b>'
+'<b>foo</b>'</p>
+!! end
+
+!! test
+2. Link fragments separated by <i> and <b> tags
+!! input
+[[''foo''<nowiki>hello]]</nowiki>
+
+[['''foo'''<nowiki>hello]]</nowiki>
+!! result
+<p>[[<i>foo</i>hello]]
+</p><p>[[<b>foo</b>hello]]
+</p>
+!! end
+
+!! test
+3. Link fragments inside <i> and <b>
+(FIXME: Escaping one or both of [[ and ]] is also acceptable --
+ this is one of the shortcomings of this format)
+!! input
+''[[foo''<nowiki>]]</nowiki>
+
+'''[[foo'''<nowiki>]]</nowiki>
+!! result
+<p><i>[[foo</i>]]
+</p><p><b>[[foo</b>]]
+</p>
+!! end
+
+!! test
+4. No escaping needed
+!! input
+'<span>''bar''</span>'
+'<span>'''bar'''</span>'
+!! result
+<p>'<span><i>bar</i></span>'
+'<span><b>bar</b></span>'
+</p>
+!! end
+
+#### ----------- Paragraphs ---------------
+#### 1. No unnecessary escapes
+#### --------------------------------------
+
+!! test
+1. No unnecessary escapes
+!! input
+bar <span><nowiki>[[foo]]</nowiki></span>
+
+=bar <span><nowiki>[[foo]]</nowiki></span>
+
+[[bar <span><nowiki>[[foo]]</nowiki></span>
+
+]]bar <span><nowiki>[[foo]]</nowiki></span>
+
+=bar <span>foo]]</span><nowiki>=</nowiki>
+!! result
+<p>bar <span>[[foo]]</span>
+</p><p>=bar <span>[[foo]]</span>
+</p><p>[[bar <span>[[foo]]</span>
+</p><p>]]bar <span>[[foo]]</span>
+</p><p>=bar <span>foo]]</span>=
+</p>
+!!end
+
+#### ----------------------- PRE --------------------------
+#### 1. Leading whitespace in SOL context should be escaped
+#### ------------------------------------------------------
+!! test
+1. Leading whitespace in SOL context should be escaped
+!! options
+parsoid
+!! input
+<nowiki> </nowiki>a
+
+<nowiki> </nowiki> a
+
+<nowiki>	</nowiki>a(tab)
+
+<nowiki> </nowiki>	a
+<!--cmt-->
+<nowiki> </nowiki> a
+
+a
+<nowiki> </nowiki>b
+
+a
+<nowiki>	</nowiki>b
+
+a
+<nowiki>	</nowiki> b
+!! result
+<p> a</p>
+<p>  a</p>
+<p>	a(tab)</p>
+<p> 	a</p>
+<p><!--cmt-->  a</p>
+<p>a
+ b</p>
+<p>a
+	b</p>
+<p>a
+	 b</p>
+!! end
+
+#### --------------- Behavior Switches --------------------
+!! test
+1. Valid behavior switches should be escaped
+!! options
+parsoid=html2wt
+!! input
+<nowiki>__TOC__</nowiki>
+!! result
+__TOC__
+!! end
+
+!! test
+2. Invalid behavior switches should not be escaped
+!! options
+parsoid=html2wt
+!! input
+__TOO__
+__|__
+!! result
+__TOO__
+__|__
+!! end
+
+#### --------------- HTML tags ---------------
+#### 1. a tags
+#### 2. other tags
+#### 3. multi-line html tag
+#### -----------------------------------------
+!! test
+1. a tags
+!! options
+parsoid
+!! input
+<a href="http://google.com">google</a>
+!! result
+&lt;a href=&quot;http://google.com&quot;&gt;google&lt;/a&gt;
+!! end
+
+!! test
+2. other tags
+!! input
+<nowiki><div>foo</div>
+<div style="color:red">foo</div></nowiki>
+!! result
+<p>&lt;div&gt;foo&lt;/div&gt;
+&lt;div style=&quot;color:red&quot;&gt;foo&lt;/div&gt;
+</p>
+!! end
+
+!! test
+3. multi-line html tag
+!! input
+<nowiki><div
+>foo</div
+></nowiki>
+!! result
+<p>&lt;div
+&gt;foo&lt;/div
+&gt;
+</p>
+!! end
+
+!! test
+4. extension tags
+!! input
+<nowiki><ref>foo</ref></nowiki>
+!! result
+<p>&lt;ref&gt;foo&lt;/ref&gt;
+</p>
+!! end
+
+#### --------------- Others ---------------
+!! test
+Escaping nowikis
+!! input
+&lt;nowiki&gt;foo&lt;/nowiki&gt;
+!! result
+<p>&lt;nowiki&gt;foo&lt;/nowiki&gt;
+</p>
+!! end
+
+## The quote-char in the input is necessary for triggering the bug
+!! test
+(Bug 52035) Nowiki-escaping should not get tripped by " :" in text
+!! options
+parsoid=wt2wt,html2wt
+!! input
+foo's bar :
+!! result
+<p>foo's bar :</p>
+!! end
+
+!! test
+
+Tag-like HTML structures are passed through as text
+!! input
+<x y>
+
+<x.y>
+
+<x-y>
+
+1>2
+
+x<y
+
+a>b
+
+1<d e>f
+!! result
+<p>&lt;x y&gt;
+</p><p>&lt;x.y&gt;
+</p><p>&lt;x-y&gt;
+</p><p>1&gt;2
+</p><p>x&lt;y
+</p><p>a&gt;b
+</p><p>1&lt;d e&gt;f
+</p>
+!! end
+
+
+# This was a bug in the PHP parser (see bug 17663 and its dups,
+# https://bugzilla.wikimedia.org/show_bug.cgi?id=17663)
+!! test
+Tag names followed by punctuation should not be recognized as tags
+!! input
+<s.ome> text
+!! result
+<p>&lt;s.ome&gt; text
+</p>
+!! end
+
+!! test
+HTML tag with necessary entities in attributes
+!! input
+<span title="&amp;amp;">foo</span>
+!! result
+<p><span title="&amp;amp;">foo</span>
+</p>
+!! end
+
+!! test
+HTML tag with 'unnecessary' entity encoding in attributes
+!! input
+<span title="&amp;">foo</span>
+!! result
+<p><span title="&amp;">foo</span>
+</p>
+!! end
+
+!! test
+HTML tag with broken attribute value quoting
+!! input
+<span title="Hello world>Foo</span>
+!! result
+<p><span>Foo</span>
+</p>
+!! end
+
+!! test
+Parsoid-only: HTML tag with broken attribute value quoting
+!! options
+parsoid
+!! input
+<span title="Hello world>Foo</span>
+!! result
+<p><span title="Hello world">Foo</span>
+</p>
+!! end
+
+!! test
+Table with broken attribute value quoting
+!! input
+{|
+| title="Hello world|Foo
+|}
+!! result
+<table>
+<tr>
+<td>Foo
+</td></tr></table>
+
+!! end
+
+!! test
+Table with broken attribute value quoting on consecutive lines
+!! input
+{|
+| title="Hello world|Foo
+| style="color:red|Bar
+|}
+!! result
+<table>
+<tr>
+<td>Foo
+</td>
+<td>Bar
+</td></tr></table>
+
+!! end
+
+!! test
+Parsoid-only: Table with broken attribute value quoting on consecutive lines
+!! options
+parsoid
+!! input
+{|
+| title="Hello world|Foo
+| style="color:red|Bar
+|}
+!! result
+<table><tbody>
+<tr>
+<td title="Hello world">Foo
+</td><td style="color: red">Bar
+</td></tr></tbody></table>
+
+!! end
+
+!! test
+Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
+!! options
+parsoid
+!! input
+{{}}
+!! result
+{{}}
+!! end
+
+!! test
+Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
+!! options
+parsoid
+!! input
+}}{{
+!! result
+}}{{
+!! end
+
+!!test
+Accept empty td cell attribute
+!!input
+{|
+| align="center" | foo ||  |
+|}
+!!result
+<table>
+<tr>
+<td align="center"> foo </td>
+<td>
+</td></tr></table>
+
+!!end
+
+!!test
+Non-empty attributes in th-cells
+!!input
+{|
+! Foo !! style="color: red" | Bar
+|}
+!!result
+<table>
+<tr>
+<th> Foo </th>
+<th style="color: red"> Bar
+</th></tr></table>
+
+!!end
+
+!!test
+Accept empty attributes in th-cells
+!!input
+{|
+!| foo !!| bar
+|}
+!!result
+<table>
+<tr>
+<th> foo </th>
+<th> bar
+</th></tr></table>
+
+!!end
+
+!!test
+Empty table rows go away
+!!input
+{|
+| Hello
+| there
+|- class="foo"
+|-
+|}
+!! result
+<table>
+<tr>
+<td> Hello
+</td>
+<td> there
+</td></tr>
+
+</table>
+
+!! end
+
+###
+### Parsoid-centric tests for testing RTing of inter-element separators
+### Edge cases not tested by existing parser tests and specific to
+### Parsoid-specific serialization strategies.
+###
+
+!!test
+RT-ed inter-element separators should be valid separators
+!!input
+{|
+|- [[foo]]
+|}
+!!result
+<table>
+
+</table>
+
+!!end
+
+!!test
+Trailing newlines in a deep dom-subtree that ends a wikitext line should be migrated out
+(Parsoid-only since PHP parser relies on Tidy for correct output)
+!!options
+parsoid
+!!input
+{|
+|<small>foo
+bar
+|}
+
+{|
+|<small>foo<small>
+|}
+!!result
+!!end
+
+!!test
+Empty TD followed by TD with tpl-generated attribute
+!!input
+{|
+|-
+|
+|{{echo|style='color:red'}}|foo
+|}
+!!result
+<table>
+
+<tr>
+<td>
+</td>
+<td>foo
+</td></tr></table>
+
+!!end
+
+!!test
+Indented table with an empty td
+!!input
+ {|
+ |-
+ |
+ |foo
+ |}
+!!result
+<table>
+
+<tr>
+<td>
+</td>
+<td>foo
+</td></tr></table>
+
+!!end
+
+!!test
+Empty TR followed by a template-generated TR
+(Parsoid-specific since PHP parser doesn't handle this mixed tbl-wikitext)
+!!options
+parsoid
+!!input
+{|
+|-
+{{echo|<tr><td>foo</td></tr>}}
+|}
+!!result
+<table>
+<tbody>
+<tr></tr>
+<tr about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"<tr><td>foo</td></tr>"}},"i":0}}]}'>
+<td>foo</td></tr>
+</tbody></table>
+!!end
+
+## PHP and parsoid output differ for this, and since this is primarily
+## for testing Parsoid's serializer, marking this Parsoid only
+!!test
+Empty TR followed by mixed-ws-comment line should RT correctly
+!!options
+parsoid
+!!input
+{|
+|-
+ <!--c-->
+|-
+<!--c--> <!--d-->
+|}
+!!result
+<table>
+<tbody>
+<tr></tr>
+ <!--c-->
+<tr>
+<!--c--> </tr><!--d-->
+</tbody></table>
+
+!!end
+
+!!test
+Multi-line image caption generated by templates with/without trailing newlines
+!!options
+parsoid
+!!input
+[[File:foo.jpg|thumb|300px|foo\n{{echo|A}}\n{{echo|B}}\n{{echo|C}}]]
+[[File:foo.jpg|thumb|300px|foo\n{{echo|A}}\n{{echo|B}}\n{{echo|C}}\n\n]]
+!!result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Foo.jpg" class="new" title="File:Foo.jpg">File:Foo.jpg</a>  <div class="thumbcaption">foo\nA\nB\nC</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Foo.jpg" class="new" title="File:Foo.jpg">File:Foo.jpg</a>  <div class="thumbcaption">foo\nA\nB\nC\n\n</div></div></div>
+
+!!end
+
+## PHP emits broken html for this, and since this is primarily
+## a Parsoid serializer test, marking this Parsoid only
+!!test
+Improperly nested inline or quotes tags with whitespace in between
+!!options
+parsoid
+!!input
+<span> <s>x</span> </s>
+''' ''x''' ''
+!!result
+<p><span> <s>x</s></span><s> </s>
+<b> <i>x</i></b><i> </i>
+</p>
+!!end
+
+!!test
+Encapsulate protected attributes from wt
+!!options
+parsoid
+!!input
+<div typeof="mw:placeholder stuff" data-parsoid="weird" data-parsoid-other="no" about="time" rel="mw:true">foo</div>
+!!result
+<body><div data-x-typeof="mw:placeholder stuff" data-x-data-parsoid="weird" data-x-data-parsoid-other="no" data-x-about="time" data-x-rel="mw:true">foo</div>
+</body>
+!!end
+
+## Currently the p-wrapper is fragile in how adds / removes transformations.
+## Having nested or stray pre tags results in the attempt to add duplicates,
+## causing an assertion fail. This test tries to prevent that situation.
+!!test
+Ensure ParagraphWrapper can deal with stray closing pre tags
+!!options
+parsoid=wt2html
+!!input
+plain text</pre>
+!!result
+plain text
+!!end
+
+!!test
+Ensure fostered text content is wrapped in spans
+!!options
+parsoid=wt2html
+!!input
+<table>hi</table><table>ho</table>
+!!result
+<span>hi</span>
+<table></table>
+<span>ho</span>
+<table></table>
+!!end
+
+!!test
+Encapsulation properly handles null DSR information from foster box
+!!options
+parsoid=wt2html,wt2wt
+!!input
+{{echo|<table>foo<tr><td>bar</td></tr></table>}}
+!!result
+<span typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;
+<table>foo
+<tr>
+<td>bar</td></tr></table>&quot;}},&quot;i&quot;:0}}]}">foo</span>
+<table>
+<tbody>
+<tr>
+<td>bar</td></tr></tbody></table>
+!!end
+
+!!test
+1. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+<table>{{echo|foo<tr><td>bar</td></tr>}}</table>
+!!result
+<span typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
+<table>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo
+<tr>
+<td>bar</td></tr>&quot;}},&quot;i&quot;:0}},&quot;</table>&quot;]}">foo</span>
+<table>
+<tbody>
+<tr>
+<td>bar</td></tr></tbody></table>
+!!end
+
+!!test
+2. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+<table><div>{{echo|foo}}</div><tr><td>bar</td></tr></table>
+!!result
+<div typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
+<table>
+<div>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo&quot;}},&quot;i&quot;:0}},&quot;</div>
+<tr>
+<td>bar</td></tr></table>&quot;]}">foo</div>
+<table>
+<tbody>
+<tr>
+<td>bar</td></tr></tbody></table>
+!!end
+
+!!test
+3. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+<table><div><p>{{echo|foo</p></div><tr><td>}}bar</td></tr></table>
+!!result
+<div typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
+<table>
+<div>
+<p>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo</p></div>
+<tr>
+<td>&quot;}},&quot;i&quot;:0}},&quot;bar</td></tr></table>&quot;]}">
+<p>foo</p></div>
+<table>
+<tbody>
+<tr>
+<td>bar</td></tr></tbody></table>
+!!end
+
+!!test
+4. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+<table><div><p>{{echo|foo</p></div><tr><td>}}bar</td></tr></table>
+!!result
+<div typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
+<table>
+<div>
+<p>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo</p></div>
+<tr>
+<td>&quot;}},&quot;i&quot;:0}},&quot;bar</td></tr></table>&quot;]}">
+<p>foo</p></div>
+<table>
+<tbody>
+<tr>
+<td>bar</td></tr></tbody></table>
+!!end
+
+!!test
+5. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+<table><tr><td><div><p>{{echo|foo</p></div></td>foo}}</tr></table>
+!!result
+<span typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
+<table>
+<tr>
+<td>
+<div>
+<p>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo</p></div></td>foo&quot;}},&quot;i&quot;:0}},&quot;</tr></table>&quot;]}">foo</span>
+<table>
+<tbody>
+<tr>
+<td>
+<div>
+<p>foo</p></div></td></tr></tbody></table>
+!!end
+
+!!test
+6. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+<table><tr><td><div><p>{{echo|foo</p></div></td>foo</tr></table>}}<p>ok</p>
+!!result
+<span typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
+<table>
+<tr>
+<td>
+<div>
+<p>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo</p></div></td>foo</tr></table>&quot;}},&quot;i&quot;:0}}]}">foo</span>
+<table>
+<tbody>
+<tr>
+<td>
+<div>
+<p>foo</p></div></td></tr></tbody></table>
+<p>ok</p>
+!!end
+
+!!test
+7. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+<table>{{echo|<p>foo</p>}}<td>bar</td></table>
+!!result
+<p typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;
+<table>&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;
+<p>foo</p>&quot;}},&quot;i&quot;:0}},&quot;
+<td>bar</td></table>&quot;]}">foo</p>
+<table>
+<tbody>
+<tr>
+<td>bar</td></tr></tbody></table>
+!!end
 
-'''[[foo'''<nowiki>]]</nowiki>
-!! result
-<p><i>[[foo</i>]]
-</p><p><b>[[foo</b>]]
-</p>
-!! end
+!!test
+8. Encapsulate foster-parented transclusion content
+!!options
+parsoid=wt2wt,wt2html
+!!input
+{{echo|a
+}}{|{{echo|style='color:red'}}
+|-
+|b
+|}
+!!result
+<p typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;a\n&quot;}},&quot;i&quot;:0}}]}">a</p><span typeof="mw:Transclusion" data-mw="{&quot;parts&quot;:[&quot;{|&quot;,{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;style&quot;:{&quot;wt&quot;:&quot;'color:red'&quot;}},&quot;i&quot;:0}},&quot;\n|-\n|b\n|}&quot;]}">{{{1}}}</span>
+<table>
+<tbody>
+<tr>
+<td>b</td></tr></tbody></table>
+!!end
 
-#### --------------- Paragraphs ---------------
-#### 1. No unnecessary escapes
-#### --------------------------------------
+# -----------------------------------------------------------------
+# The following section of tests are primarily to spec requirements
+# around serialization of new/edited content.
+#
+# All these tests are marked Parsoid html2wt and html2html only
+# ----------------------------------------------------------------
 
 !! test
-1. No unnecessary escapes
+Image: Modifying size of an image
+!! options
+parsoid=html2wt
 !! input
-bar <span><nowiki>[[foo]]</nowiki></span>
-
-=bar <span><nowiki>[[foo]]</nowiki></span>
-
-[[bar <span><nowiki>[[foo]]</nowiki></span>
-
-<nowiki>]]bar </nowiki><span><nowiki>[[foo]]</nowiki></span>
-
-<nowiki>=bar </nowiki><span>foo]]</span>=
+[[Image:Wiki.png|230x230px]]
 !! result
-<p>bar <span>[[foo]]</span>
-</p><p>=bar <span>[[foo]]</span>
-</p><p>[[bar <span>[[foo]]</span>
-</p><p>]]bar <span>[[foo]]</span>
-</p><p>=bar <span>foo]]</span>=
-</p>
+<p data-parsoid='{"dsr":[0,24,0,0]}'><span typeof="mw:Image" data-parsoid='{"optList":[{"ck":"width","ak":"100px"}],"cacheKey":"[[Image:Wiki.png|100px]]","img":{"h":115,"w":100,"wdset":true},"dsr":[0,24,null,null]}'><a href="./File:Wiki.png" data-parsoid='{"a":{"href":"./File:Wiki.png"}}'><img resource="./File:Wiki.png" src="//upload.wikimedia.org/wikipedia/en/thumb/b/bc/Wiki.png/100px-Wiki.png" height="230" width="200" data-parsoid='{"a":{"resource":"./File:Wiki.png"},"sa":{"resource":"Image:Wiki.png"}}'></a></span></p>
 !!end
 
-#### --------------- PRE ------------------
-#### 1. Leading space in SOL context should be escaped
-#### --------------------------------------
 !! test
-1. Leading space in SOL context should be escaped
+Image: New block level image should have \n before and after
 !! options
-disabled
+parsoid=html2wt
 !! input
-<nowiki> foo</nowiki>
-<!--cmt--><nowiki> foo</nowiki>
+123
+[[File:Wiki.png|right|thumb|150x150px]]
+456
 !! result
-<p> foo
-<!--cmt--> foo
-</p>
-!! end
+<p>123</p><figure typeof="mw:Image/Thumb" class="mw-halign-right"><a href="./File:Wiki.png"><img src="http://192.168.142.128/mw/images/thumb/b/bc/Wiki.png/131px-Wiki.png" width="131" height="150" resource="./File:Wiki.png"></a></figure><p>456</p>
+!!end
 
-#### --------------- HTML tags ---------------
-#### 1. a tags
-#### 2. other tags
-#### 3. multi-line html tag
-#### --------------------------------------
+# Wacky -- the leading newline in input is required because
+# that is what the serializer emits. To be fixed. Not fixing
+# the test because this test is required to test serialization of
+# new content and preferred whitespace style.
 !! test
-1. a tags
+Lists: Serialize correctly even when list content is wrapped in p-tags (like VE does)
 !! options
-disabled
+parsoid=html2wt
 !! input
-<a href="http://google.com">google</a>
-!! result
-&lt;a href=&quot;http://google.com&quot;&gt;google&lt;/a&gt;
-!! end
 
-!! test
-2. other tags
-!! input
-<nowiki><div>foo</div>
-<div style="color:red">foo</div></nowiki>
+* foo
 !! result
-<p>&lt;div&gt;foo&lt;/div&gt;
-&lt;div style=&quot;color:red&quot;&gt;foo&lt;/div&gt;
-</p>
+<ul>
+<li><p>foo</p></li>
+</ul>
 !! end
 
+# Wacky -- the leading newline in input is required because
+# that is what the serializer emits. To be fixed. Not fixing
+# the test because this test is required to test serialization of
+# new content and preferred whitespace style.
 !! test
-3. multi-line html tag
+Lists: Add space after bullets
+!! options
+parsoid=html2wt
 !! input
-<nowiki><div
->foo</div
-></nowiki>
-!! result
-<p>&lt;div
-&gt;foo&lt;/div
-&gt;
-</p>
-!! end
 
-#### --------------- Others ---------------
-!! test
-Escaping nowikis
-!! input
-&lt;nowiki&gt;foo&lt;/nowiki&gt;
+* foo
+* bar
+* <span> baz</span>
 !! result
-<p>&lt;nowiki&gt;foo&lt;/nowiki&gt;
-</p>
+<ul>
+<li>foo</li>
+<li> bar</li>
+<li><span> baz</span></li>
+</ul>
 !! end
 
 !! test
-Tag-like HTML structures are passed through as text
+Parsoid: Serialize positional parameters with = in them as named parameter
+!! options
+parsoid=html2wt
 !! input
-<x y>
-
-<x.y>
+{{echo|1 = f=oo}}
 
-<x-y>
-
-1>2
+{{echo|1 = f=oo|2 = bar}}
 
-x<y
+<!--Orig params with data-parsoid has heuristics for handling = chars-->
+<!--FIXME: But maybe the heuristic needs fixing to apply to new params as well-->
+{{echo|<nowiki>f=oo</nowiki>|bar}}
+!! result
+<p about="#mwt1" typeof="mw:Transclusion"
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"}},"i":0}}]}'>foo</p>
 
-a>b
+<p about="#mwt1" typeof="mw:Transclusion"
+data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"}, "2":{"wt":"bar"}},"i":0}}]}'>foo</p>
 
-1<d e>f
-!! result
-<p>&lt;x y&gt;
-</p><p>&lt;x.y&gt;
-</p><p>&lt;x-y&gt;
-</p><p>1&gt;2
-</p><p>x&lt;y
-</p><p>a&gt;b
-</p><p>1&lt;d e&gt;f
-</p>
+<!--Orig params with data-parsoid has heuristics for handling = chars-->
+<!--FIXME: But maybe the heuristic needs fixing to apply to new params as well-->
+<p data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]},{"k":"2","spc":["","","",""]}]]}' about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"f=oo"},"2":{"wt":"bar"}},"i":0}}]}'>foo</p>
 !! end
 
-
-# This fails in the PHP parser (see bug 40670,
-# https://bugzilla.wikimedia.org/show_bug.cgi?id=40670), so disabled for it.
 !! test
-Tag names followed by punctuation should not be recognized as tags
+Parsoid: Correctly serialize block-node children when they are a combination of text and p-nodes
 !! options
-disabled
+parsoid=html2wt
 !! input
-<s.ome> text
-!! result
-<p>&lt;s.ome&gt text
-</p>
-!! end
+<div>a
+b
+</div>
+<div>a
+b
+</div>
+<div>
+a
 
-!! test
-HTML tag with necessary entities in attributes
-!! input
-<span title="&amp;amp;">foo</span>
+b
+</div>
 !! result
-<p><span title="&amp;amp;">foo</span>
-</p>
+<div>a<p>b</p></div>
+<div>a
+<p>b</p></div>
+<div>
+a
+<p>b</p></div>
 !! end
 
-!! test
-HTML tag with 'unnecessary' entity encoding in attributes
-!! input
-<span title="&amp;">foo</span>
-!! result
-<p><span title="&amp;">foo</span>
-</p>
-!! end
+#-----------------------------
+# I/B quote minimization tests
+#-----------------------------
 
 !! test
-HTML tag with broken attribute value quoting
+1. I/B quote minimization: wikitext-only tags should be combined
+!! options
+parsoid=html2wt
 !! input
-<span title="Hello world>Foo</span>
+''AB''
+
+'''AB'''
+
+''A'''B'''''
+
+'''A''B'''''
+
+'''A''BC''D'''
+
+'''''AB'''''
+
+'''''AB'''''
+
+'''''AB'''''
 !! result
-<p><span>Foo</span>
-</p>
+<p><i>A</i><i>B</i></p>
+<p><b>A</b><b>B</b></p>
+<p><i>A</i><b><i>B</i></b></p>
+<p><b>A</b><i><b>B</b></i></p>
+<p><b>A</b><i><b>B</b><b>C</b></i><b>D</b></p>
+<p><i><b>A</b></i><i><b>B</b></i></p>
+<p><i><b>A</b></i><b><i>B</i></b></p>
+<p><b><i>A</i></b><i><b>B</b></i></p>
 !! end
 
 !! test
-Parsoid-only: HTML tag with broken attribute value quoting
+2. I/B quote minimization: wikitext and html tags should not be combined
 !! options
-parsoid
+parsoid=html2wt
 !! input
-<span title="Hello world>Foo</span>
-!! result
-<p><span title="Hello world">Foo</span>
-</p>
-!! end
+''A''<i>B</i>
 
-!! test
-Table with broken attribute value quoting
-!! input
-{|
-| title="Hello world|Foo
-|}
+''A'''''<i>B</i>'''
 !! result
-<table>
-<tr>
-<td>Foo
-</td></tr></table>
-
+<p><i>A</i><i data-parsoid='{"stx":"html"}'>B</i></p>
+<p><i>A</i><b><i data-parsoid='{"stx":"html"}'>B</i></b></p>
 !! end
 
 !! test
-Table with broken attribute value quoting on consecutive lines
+3. I/B quote minimization: templated content stops minimization
+!! options
+parsoid=html2wt
 !! input
-{|
-| title="Hello world|Foo
-| style="color:red|Bar
-|}
-!! result
-<table>
-<tr>
-<td>Foo
-</td>
-<td>Bar
-</td></tr></table>
+''A''{{echo|''B''}}
 
+''A''{{echo|'''''B'''''}}
+!! result
+<p><i>A</i><i about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&#39;&#39;B&#39;&#39;"}},"i":0}}]}'>B</i>
+<p><i>A</i><b about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&#39;&#39;&#39;&#39;&#39;B&#39;&#39;&#39;&#39;&#39;"}},"i":0}}]}'><i>B</i></b>
 !! end
 
 !! test
-Parsoid-only: Table with broken attribute value quoting on consecutive lines
+4. I/B quote minimization: new content should be mimimized with adjacent old content
 !! options
-parsoid
+parsoid=html2wt
 !! input
-{|
-| title="Hello world|Foo
-| style="color:red|Bar
-|}
-!! result
-<table>
-<tr>
-<td title="Hello world">Foo
-</td><td style="color: red">Bar
-</td></tr></table>
-
-!! end
-
-!!test
-Accept empty td cell attribute
-!!input
-{|
-| align="center" | foo ||  |
-|}
-!!result
-<table>
-<tr>
-<td align="center"> foo </td>
-<td>
-</td></tr></table>
-
-!!end
-
-!!test
-Non-empty attributes in th-cells
-!!input
-{|
-! Foo !! style="color: red" | Bar
-|}
-!!result
-<table>
-<tr>
-<th> Foo </th>
-<th style="color: red"> Bar
-</th></tr></table>
-
-!!end
-
-!!test
-Accept empty attributes in th-cells
-!!input
-{|
-!| foo !!| bar
-|}
-!!result
-<table>
-<tr>
-<th> foo </th>
-<th> bar
-</th></tr></table>
+''AB''
 
-!!end
+'''AB'''
 
-!!test
-Empty table rows go away
-!!input
-{|
-| Hello
-| there
-|- class="foo"
-|-
-|}
+''A'''B'''''
 !! result
-<table>
-<tr>
-<td> Hello
-</td>
-<td> there
-</td></tr>
-
-</table>
-
+<p><i>A</i><i data-parsoid='{}'>B</i></p>
+<p><b data-parsoid='{}'>A</b><b>B</b></p>
+<p><i>A</i><b data-parsoid='{}'><i data-parsoid='{}'>B</i></b></p>
 !! end
 
+# -----------------------------------------------------------------
+# End of section for Parsoid-only html2wt tests for serialization
+# of new content
+# -----------------------------------------------------------------
+
 TODO:
 more images
 more tables
diff --git a/tests/parser/preprocess/All_system_messages.expected b/tests/parser/preprocess/All_system_messages.expected
index 897c5fb0..078d8f0d 100644
--- a/tests/parser/preprocess/All_system_messages.expected
+++ b/tests/parser/preprocess/All_system_messages.expected
@@ -1239,27 +1239,6 @@ diff
 &lt;/td&gt;&lt;td&gt;
 <template lineStart="1"><title>int:Difference</title></template>
 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguations&amp;action=edit disambiguations]&lt;br&gt;
-[[MediaWiki_talk:Disambiguations|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Disambiguation pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Disambiguations</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguationspage&amp;action=edit disambiguationspage]&lt;br&gt;
-[[MediaWiki_talk:Disambiguationspage|Talk]]
-&lt;/td&gt;&lt;td&gt;
-Wiktionary:Links_to_disambiguating_pages
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Disambiguationspage</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguationstext&amp;action=edit disambiguationstext]&lt;br&gt;
-[[MediaWiki_talk:Disambiguationstext|Talk]]
-&lt;/td&gt;&lt;td&gt;
-The following pages link to a &amp;lt;i&amp;gt;disambiguation page&amp;lt;/i&amp;gt;. They should link to the appropriate topic instead.&amp;lt;br /&amp;gt;A page is treated as dismbiguation if it is linked from $1.&amp;lt;br /&amp;gt;Links from other namespaces are &amp;lt;i&amp;gt;not&amp;lt;/i&amp;gt; listed here.
-&lt;/td&gt;&lt;td&gt;
-<template lineStart="1"><title>int:Disambiguationstext</title></template>
-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
 [http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disclaimerpage&amp;action=edit disclaimerpage]&lt;br&gt;
 [[MediaWiki_talk:Disclaimerpage|Talk]]
 &lt;/td&gt;&lt;td&gt;
diff --git a/tests/parser/preprocess/All_system_messages.txt b/tests/parser/preprocess/All_system_messages.txt
index fc10d7cf..3c30da94 100644
--- a/tests/parser/preprocess/All_system_messages.txt
+++ b/tests/parser/preprocess/All_system_messages.txt
@@ -1239,27 +1239,6 @@ diff
 </td><td>
 {{int:Difference}}
 </td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguations&action=edit disambiguations]<br>
-[[MediaWiki_talk:Disambiguations|Talk]]
-</td><td>
-Disambiguation pages
-</td><td>
-{{int:Disambiguations}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguationspage&action=edit disambiguationspage]<br>
-[[MediaWiki_talk:Disambiguationspage|Talk]]
-</td><td>
-Wiktionary:Links_to_disambiguating_pages
-</td><td>
-{{int:Disambiguationspage}}
-</td></tr><tr><td>
-[http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disambiguationstext&action=edit disambiguationstext]<br>
-[[MediaWiki_talk:Disambiguationstext|Talk]]
-</td><td>
-The following pages link to a &lt;i&gt;disambiguation page&lt;/i&gt;. They should link to the appropriate topic instead.&lt;br /&gt;A page is treated as dismbiguation if it is linked from $1.&lt;br /&gt;Links from other namespaces are &lt;i&gt;not&lt;/i&gt; listed here.
-</td><td>
-{{int:Disambiguationstext}}
-</td></tr><tr><td>
 [http://tl.wiktionary.org/w/wiki.phtml?title=MediaWiki:Disclaimerpage&action=edit disclaimerpage]<br>
 [[MediaWiki_talk:Disclaimerpage|Talk]]
 </td><td>
diff --git a/tests/parserTests.php b/tests/parserTests.php
index 804a30cb..debb3575 100644
--- a/tests/parserTests.php
+++ b/tests/parserTests.php
@@ -27,8 +27,8 @@
 $otions = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'run-disabled', 'run-parsoid' );
 $optionsWithArgs = array( 'regex', 'filter', 'seed', 'setversion' );
 
-require_once( __DIR__ . '/../maintenance/commandLine.inc' );
-require_once( __DIR__ . '/TestsAutoLoader.php' );
+require_once __DIR__ . '/../maintenance/commandLine.inc';
+require_once __DIR__ . '/TestsAutoLoader.php';
 
 if ( isset( $options['help'] ) ) {
 	echo <<<ENDS
@@ -84,11 +84,11 @@ if ( isset( $options['file'] ) ) {
 
 # Print out software version to assist with locating regressions
 $version = SpecialVersion::getVersion();
-echo( "This is MediaWiki version {$version}.\n\n" );
+echo "This is MediaWiki version {$version}.\n\n";
 
 if ( isset( $options['fuzz'] ) ) {
 	$tester->fuzzTest( $files );
 } else {
 	$ok = $tester->runTestsFromFiles( $files );
-	exit ( $ok ? 0 : 1 );
+	exit( $ok ? 0 : 1 );
 }
diff --git a/tests/phpunit/AutoLoaderTest.php b/tests/phpunit/AutoLoaderTest.php
deleted file mode 100644
index c8f38685..00000000
--- a/tests/phpunit/AutoLoaderTest.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-class AutoLoaderTest extends MediaWikiTestCase {
-
-	public function testAutoLoadConfig() {
-		$results = self::checkAutoLoadConf();
-
-		$this->assertEquals(
-			$results['expected'],
-			$results['actual']
-		);
-	}
-
-	protected static function checkAutoLoadConf() {
-		global $wgAutoloadLocalClasses, $wgAutoloadClasses, $IP;
-		static $supportsParsekit;
-		$supportsParsekit = function_exists( 'parsekit_compile_file' );
-
-		// wgAutoloadLocalClasses has precedence, just like in includes/AutoLoader.php
-		$expected = $wgAutoloadLocalClasses + $wgAutoloadClasses;
-		$actual = array();
-
-		$files = array_unique( $expected );
-
-		foreach ( $files as $file ) {
-			// Only prefix $IP if it doesn't have it already.
-			// Generally local classes don't have it, and those from extensions and test suites do.
-			if ( substr( $file, 0, 1 ) != '/' && substr( $file, 1, 1 ) != ':' ) {
-				$filePath = "$IP/$file";
-			} else {
-				$filePath = $file;
-			}
-			if ( $supportsParsekit ) {
-				$parseInfo = parsekit_compile_file( "$filePath" );
-				$classes = array_keys( $parseInfo['class_table'] );
-			} else {
-				$contents = file_get_contents( "$filePath" );
-				$m = array();
-				preg_match_all( '/\n\s*(?:final)?\s*(?:abstract)?\s*(?:class|interface)\s+([a-zA-Z0-9_]+)/', $contents, $m, PREG_PATTERN_ORDER );
-				$classes = $m[1];
-			}
-			foreach ( $classes as $class ) {
-				$actual[$class] = $file;
-			}
-		}
-
-		return array(
-			'expected' => $expected,
-			'actual' => $actual,
-		);
-	}
-}
diff --git a/tests/phpunit/MediaWikiLangTestCase.php b/tests/phpunit/MediaWikiLangTestCase.php
index 0cf6e383..1131385f 100644
--- a/tests/phpunit/MediaWikiLangTestCase.php
+++ b/tests/phpunit/MediaWikiLangTestCase.php
@@ -15,6 +15,10 @@ abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
 				"\$wgContLang->getCode() (" . $wgContLang->getCode() . ")" );
 		}
 
+		// HACK: Call getLanguage() so the real $wgContLang is cached as the user language
+		// rather than our fake one. This is to avoid breaking other, unrelated tests.
+		RequestContext::getMain()->getLanguage();
+
 		$langCode = 'en'; # For mainpage to be 'Main Page'
 		$langObj = Language::factory( $langCode );
 
diff --git a/tests/phpunit/MediaWikiPHPUnitCommand.php b/tests/phpunit/MediaWikiPHPUnitCommand.php
index 12c2e003..042956a9 100644
--- a/tests/phpunit/MediaWikiPHPUnitCommand.php
+++ b/tests/phpunit/MediaWikiPHPUnitCommand.php
@@ -12,13 +12,29 @@ class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
 		'use-normal-tables' => false,
 		'reuse-db' => false,
 		'wiki=' => false,
+		'debug-tests' => false,
 	);
 
 	public function __construct() {
 		foreach ( self::$additionalOptions as $option => $default ) {
 			$this->longOptions[$option] = $option . 'Handler';
 		}
+	}
+
+	protected function handleArguments( array $argv ) {
+		parent::handleArguments( $argv );
+
+		if ( !isset( $this->arguments['listeners'] ) ) {
+			$this->arguments['listeners'] = array();
+		}
 
+		foreach ( $this->options[0] as $option ) {
+			switch ( $option[0] ) {
+				case '--debug-tests':
+					$this->arguments['listeners'][] = new MediaWikiPHPUnitTestListener( 'PHPUnitCommand' );
+					break;
+			}
+		}
 	}
 
 	public static function main( $exit = true ) {
@@ -86,7 +102,7 @@ class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
 ParserTest-specific options:
 
   --regex="<regex>"        Only run parser tests that match the given regex
-  --file="<filename>"      Prints the version and exits.
+  --file="<filename>"      File describing parser tests
   --keep-uploads           Re-use the same upload directory for each test, don't delete it
 
 
@@ -95,7 +111,9 @@ Database options:
   --reuse-db               Init DB only if tables are missing and keep after finish.
 
 
+Debugging options:
+  --debug-tests            Log testing activity to the PHPUnitCommand log channel.
+
 EOT;
 	}
-
 }
diff --git a/tests/phpunit/MediaWikiPHPUnitTestListener.php b/tests/phpunit/MediaWikiPHPUnitTestListener.php
new file mode 100644
index 00000000..7237ef32
--- /dev/null
+++ b/tests/phpunit/MediaWikiPHPUnitTestListener.php
@@ -0,0 +1,114 @@
+<?php
+class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
+
+	/**
+	 * @var string
+	 */
+	protected $logChannel;
+
+	public function __construct( $logChannel ) {
+		$this->logChannel = $logChannel;
+	}
+
+	protected function getTestName( PHPUnit_Framework_Test $test ) {
+		$name = get_class( $test );
+
+		if ( $test instanceof PHPUnit_Framework_TestCase ) {
+			$name .= '::' . $test->getName( true );
+		}
+
+		return $name;
+	}
+
+	protected function getErrorName( Exception $exception ) {
+		$name = get_class( $exception );
+		$name = "[$name] " . $exception->getMessage();
+
+		return $name;
+	}
+
+	/**
+	 * An error occurred.
+	 *
+	 * @param  PHPUnit_Framework_Test $test
+	 * @param  Exception              $e
+	 * @param  float                  $time
+	 */
+	public function addError( PHPUnit_Framework_Test $test, Exception $e, $time ) {
+		wfDebugLog( $this->logChannel, 'ERROR in ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+	}
+
+	/**
+	 * A failure occurred.
+	 *
+	 * @param  PHPUnit_Framework_Test                 $test
+	 * @param  PHPUnit_Framework_AssertionFailedError $e
+	 * @param  float                                  $time
+	 */
+	public function addFailure( PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time ) {
+		wfDebugLog( $this->logChannel, 'FAILURE in ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+	}
+
+	/**
+	 * Incomplete test.
+	 *
+	 * @param  PHPUnit_Framework_Test $test
+	 * @param  Exception              $e
+	 * @param  float                  $time
+	 */
+	public function addIncompleteTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
+		wfDebugLog( $this->logChannel, 'Incomplete test ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+	}
+
+	/**
+	 * Skipped test.
+	 *
+	 * @param  PHPUnit_Framework_Test $test
+	 * @param  Exception              $e
+	 * @param  float                  $time
+	 *
+	 * @since  Method available since Release 3.0.0
+	 */
+	public function addSkippedTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
+		wfDebugLog( $this->logChannel, 'Skipped test ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+	}
+
+	/**
+	 * A test suite started.
+	 *
+	 * @param  PHPUnit_Framework_TestSuite $suite
+	 * @since  Method available since Release 2.2.0
+	 */
+	public function startTestSuite( PHPUnit_Framework_TestSuite $suite ) {
+		wfDebugLog( $this->logChannel, 'START suite ' . $suite->getName() );
+	}
+
+	/**
+	 * A test suite ended.
+	 *
+	 * @param  PHPUnit_Framework_TestSuite $suite
+	 * @since  Method available since Release 2.2.0
+	 */
+	public function endTestSuite( PHPUnit_Framework_TestSuite $suite ) {
+		wfDebugLog( $this->logChannel, 'END suite ' . $suite->getName() );
+	}
+
+	/**
+	 * A test started.
+	 *
+	 * @param  PHPUnit_Framework_Test $test
+	 */
+	public function startTest( PHPUnit_Framework_Test $test ) {
+		wfDebugLog( $this->logChannel, 'Start test ' . $this->getTestName( $test ) );
+	}
+
+	/**
+	 * A test ended.
+	 *
+	 * @param  PHPUnit_Framework_Test $test
+	 * @param  float                  $time
+	 */
+	public function endTest( PHPUnit_Framework_Test $test, $time ) {
+		wfDebugLog( $this->logChannel, 'End test ' . $this->getTestName( $test ) );
+	}
+}
diff --git a/tests/phpunit/MediaWikiTestCase.php b/tests/phpunit/MediaWikiTestCase.php
index 7e6e0ab8..6ce78b56 100644
--- a/tests/phpunit/MediaWikiTestCase.php
+++ b/tests/phpunit/MediaWikiTestCase.php
@@ -64,7 +64,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 		'oracle'
 	);
 
-	function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+	function __construct( $name = null, array $data = array(), $dataName = '' ) {
 		parent::__construct( $name, $data, $dataName );
 
 		$this->backupGlobals = false;
@@ -137,6 +137,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 	protected function getNewTempFile() {
 		$fname = tempnam( wfTempDir(), 'MW_PHPUnit_' . get_class( $this ) . '_' );
 		$this->tmpfiles[] = $fname;
+
 		return $fname;
 	}
 
@@ -158,6 +159,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 		// where temporary directory creation is bundled and can be improved
 		unlink( $fname );
 		$this->assertTrue( wfMkdirParents( $fname ) );
+
 		return $fname;
 	}
 
@@ -171,7 +173,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 		$this->called['setUp'] = 1;
 
 		/*
-		//@todo: global variables to restore for *every* test
+		// @todo global variables to restore for *every* test
 		array(
 			'wgLang',
 			'wgContLang',
@@ -348,7 +350,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 	 * Stub. If a test needs to add additional data to the database, it should
 	 * implement this method and do so
 	 */
-	function addDBData() {}
+	function addDBData() {
+	}
 
 	private function addCoreDBData() {
 		# disabled for performance
@@ -377,7 +380,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 				'page_touched' => $this->db->timestamp(),
 				'page_latest' => 0,
 				'page_len' => 0 ), __METHOD__, array( 'IGNORE' ) );
-
 		}
 
 		User::resetIdByNameCache();
@@ -394,7 +396,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 			$user->saveSettings();
 		}
 
-
 		//Make 1 page with 1 revision
 		$page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
 		if ( !$page->getId() == 0 ) {
@@ -438,7 +439,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 	 * even if using different parameters.
 	 *
 	 * @param DatabaseBase $db The database connection
-	 * @param String  $prefix The prefix to use for the new table set (aka schema).
+	 * @param String $prefix The prefix to use for the new table set (aka schema).
 	 *
 	 * @throws MWException if the database table prefix is already $prefix
 	 */
@@ -461,6 +462,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
 		if ( ( $db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
 			CloneDatabase::changePrefix( $prefix );
+
 			return;
 		} else {
 			$dbClone->cloneTableStructure();
@@ -523,6 +525,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
 	private static function unprefixTable( $tableName ) {
 		global $wgDBprefix;
+
 		return substr( $tableName, strlen( $wgDBprefix ) );
 	}
 
@@ -534,6 +537,12 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 		global $wgDBprefix;
 
 		$tables = $db->listTables( $wgDBprefix, __METHOD__ );
+
+		if ( $db->getType() === 'mysql' ) {
+			# bug 43571: cannot clone VIEWs under MySQL
+			$views = $db->listViews( $wgDBprefix, __METHOD__ );
+			$tables = array_diff( $tables, $views );
+		}
 		$tables = array_map( array( __CLASS__, 'unprefixTable' ), $tables );
 
 		// Don't duplicate test tables from the previous fataled run
@@ -547,6 +556,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 			unset( $tables['searchindex_segments'] );
 			$tables = array_flip( $tables );
 		}
+
 		return $tables;
 	}
 
@@ -561,13 +571,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 		if ( isset( MediaWikiPHPUnitCommand::$additionalOptions[$offset] ) ) {
 			return MediaWikiPHPUnitCommand::$additionalOptions[$offset];
 		}
-
 	}
 
 	public function setCliArg( $offset, $value ) {
 
 		MediaWikiPHPUnitCommand::$additionalOptions[$offset] = $value;
-
 	}
 
 	/**
@@ -775,7 +783,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 	}
 
 	/**
-	 * Returns true iff the given namespace defaults to Wikitext
+	 * Returns true if the given namespace defaults to Wikitext
 	 * according to $wgNamespaceContentModels
 	 *
 	 * @param int $ns The namespace ID to check
@@ -839,12 +847,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 			) {
 
 				$wikitextNS = $ns;
+
 				return $wikitextNS;
 			}
 		}
 
 		// give up
-		// @todo: Inside a test, we could skip the test as incomplete.
+		// @todo Inside a test, we could skip the test as incomplete.
 		//        But frequently, this is used in fixture setup.
 		throw new MWException( "No namespace defaults to wikitext!" );
 	}
@@ -906,6 +915,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 		if ( !$loaded ) {
 			$this->markTestSkipped( "PHP extension '$extName' is not loaded, skipping." );
 		}
+
 		return $loaded;
 	}
 
@@ -914,6 +924,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 	 * the provided code.
 	 *
 	 * @since 1.21
+	 * @deprecated since 1.22 Use setExpectedException
 	 *
 	 * @param callable $code
 	 * @param string $expected
@@ -934,5 +945,4 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
 		$this->assertInstanceOf( $expected, $pokemons, $message );
 	}
-
 }
diff --git a/tests/phpunit/StructureTest.php b/tests/phpunit/StructureTest.php
deleted file mode 100644
index a9420981..00000000
--- a/tests/phpunit/StructureTest.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-/**
- * The tests here verify the structure of the code.  This is for outright bugs,
- * not just style issues.
- */
-
-class StructureTest extends MediaWikiTestCase {
-	/**
-	 * Verify all files that appear to be tests have file names ending in
-	 * Test.  If the file names do not end in Test, they will not be run.
-	 * @group medium
-	 */
-	public function testUnitTestFileNamesEndWithTest() {
-		if ( wfIsWindows() ) {
-			$this->markTestSkipped( 'This test does not work on Windows' );
-		}
-		$rootPath = escapeshellarg( __DIR__ );
-		$testClassRegex = implode( '|', array(
-			'ApiFormatTestBase',
-			'ApiTestCase',
-			'ApiQueryTestBase',
-			'ApiQueryContinueTestBase',
-			'MediaWikiLangTestCase',
-			'MediaWikiTestCase',
-			'PHPUnit_Framework_TestCase',
-			'DumpTestCase',
-		) );
-		$testClassRegex = "^class .* extends ($testClassRegex)";
-		$finder = "find $rootPath -name '*.php' '!' -name '*Test.php'" .
-			" | xargs grep -El '$testClassRegex|function suite\('";
-
-		$results = null;
-		$exitCode = null;
-		exec( $finder, $results, $exitCode );
-
-		$this->assertEquals(
-			0,
-			$exitCode,
-			'Verify find/grep command succeeds.'
-		);
-
-		$results = array_filter(
-			$results,
-			array( $this, 'filterSuites' )
-		);
-		$strip = strlen( $rootPath ) - 1;
-		foreach ( $results as $k => $v ) {
-			$results[$k] = substr( $v, $strip );
-		}
-		$this->assertEquals(
-			array(),
-			$results,
-			"Unit test file in $rootPath must end with Test."
-		);
-	}
-
-	/**
-	 * Filter to remove testUnitTestFileNamesEndWithTest false positives.
-	 */
-	public function filterSuites( $filename ) {
-		return strpos( $filename, __DIR__ . '/suites/' ) !== 0;
-	}
-}
diff --git a/tests/phpunit/bootstrap.php b/tests/phpunit/bootstrap.php
index 01caf8f4..d929b79d 100644
--- a/tests/phpunit/bootstrap.php
+++ b/tests/phpunit/bootstrap.php
@@ -11,22 +11,5 @@ if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
 You are running these tests directly from phpunit. You may not have all globals correctly set.
 Running phpunit.php instead is recommended.
 EOF;
-	require_once ( __DIR__ . "/phpunit.php" );
+	require_once __DIR__ . "/phpunit.php";
 }
-
-// Output a notice when running with older versions of PHPUnit
-if ( version_compare( PHPUnit_Runner_Version::id(), "3.6.7", "<" ) ) {
-	echo <<<EOF
-********************************************************************************
-
-These tests run best with version PHPUnit 3.6.7 or better. Earlier versions may
-show failures because earlier versions of PHPUnit do not properly implement
-dependencies.
-
-********************************************************************************
-
-EOF;
-}
-
-/** @todo Check if this is really needed */
-MessageCache::destroyInstance();
diff --git a/tests/phpunit/data/db/sqlite/tables-1.16.sql b/tests/phpunit/data/db/sqlite/tables-1.16.sql
index 6e56add2..7e8f30ec 100644
--- a/tests/phpunit/data/db/sqlite/tables-1.16.sql
+++ b/tests/phpunit/data/db/sqlite/tables-1.16.sql
@@ -146,11 +146,6 @@ CREATE TABLE /*_*/externallinks (
 CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
 CREATE TABLE /*_*/langlinks (
   ll_from int unsigned NOT NULL default 0,
   ll_lang varbinary(20) NOT NULL default '',
diff --git a/tests/phpunit/data/db/sqlite/tables-1.17.sql b/tests/phpunit/data/db/sqlite/tables-1.17.sql
index 69ae3764..e02e3e14 100644
--- a/tests/phpunit/data/db/sqlite/tables-1.17.sql
+++ b/tests/phpunit/data/db/sqlite/tables-1.17.sql
@@ -151,11 +151,6 @@ CREATE TABLE /*_*/externallinks (
 CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
 CREATE TABLE /*_*/langlinks (
   ll_from int unsigned NOT NULL default 0,
   ll_lang varbinary(20) NOT NULL default '',
diff --git a/tests/phpunit/data/db/sqlite/tables-1.18.sql b/tests/phpunit/data/db/sqlite/tables-1.18.sql
index b106d2b7..8bfc28e2 100644
--- a/tests/phpunit/data/db/sqlite/tables-1.18.sql
+++ b/tests/phpunit/data/db/sqlite/tables-1.18.sql
@@ -157,11 +157,6 @@ CREATE TABLE /*_*/externallinks (
 CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
 CREATE TABLE /*_*/langlinks (
   ll_from int unsigned NOT NULL default 0,
   ll_lang varbinary(20) NOT NULL default '',
diff --git a/tests/phpunit/data/less/common/test.common.mixins.less b/tests/phpunit/data/less/common/test.common.mixins.less
new file mode 100644
index 00000000..2fbe9b79
--- /dev/null
+++ b/tests/phpunit/data/less/common/test.common.mixins.less
@@ -0,0 +1,5 @@
+.test-mixin (@value) {
+	color: @value;
+	border: @foo solid @Foo;
+	line-height: test-sum(@bar, 10, 20);
+}
diff --git a/tests/phpunit/data/less/module/dependency.less b/tests/phpunit/data/less/module/dependency.less
new file mode 100644
index 00000000..c7725a25
--- /dev/null
+++ b/tests/phpunit/data/less/module/dependency.less
@@ -0,0 +1,3 @@
+@import "test.common.mixins";
+
+@unitTestColor: green;
diff --git a/tests/phpunit/data/less/module/styles.css b/tests/phpunit/data/less/module/styles.css
new file mode 100644
index 00000000..b78780a9
--- /dev/null
+++ b/tests/phpunit/data/less/module/styles.css
@@ -0,0 +1,6 @@
+/* @noflip */
+.unit-tests {
+  color: green;
+  border: 2px solid #eeeeee;
+  line-height: 35;
+}
diff --git a/tests/phpunit/data/less/module/styles.less b/tests/phpunit/data/less/module/styles.less
new file mode 100644
index 00000000..ecac8392
--- /dev/null
+++ b/tests/phpunit/data/less/module/styles.less
@@ -0,0 +1,6 @@
+@import "dependency";
+
+/* @noflip */
+.unit-tests {
+	.test-mixin(@unitTestColor);
+}
diff --git a/tests/phpunit/data/xmp/7.result.php b/tests/phpunit/data/xmp/7.result.php
index 9aa867bc..115cdc92 100644
--- a/tests/phpunit/data/xmp/7.result.php
+++ b/tests/phpunit/data/xmp/7.result.php
@@ -1,26 +1,26 @@
 <?php
-$result = array (
+$result = array(
 	'xmp-exif' =>
-	array (
+	array(
 		'CameraOwnerName' => 'Me!',
 	),
 	'xmp-general' =>
-	array (
+	array(
 		'LicenseUrl' => 'http://creativecommons.com/cc-by-2.9',
 		'ImageDescription' =>
-		array (
+		array(
 			'x-default' => 'Test image for the cc: xmp: xmpRights: namespaces in xmp',
 			'_type' => 'lang',
 		),
 		'ObjectName' =>
-		array (
+		array(
 			'x-default' => 'xmp core/xmp rights/cc ns test',
 			'_type' => 'lang',
 		),
 		'DateTimeDigitized' => '2005:04:03',
 		'Software' => 'The one true editor: Vi (ok i used gimp)',
 		'Identifier' =>
-		array (
+		array(
 			0 => 'http://example.com/identifierurl',
 			1 => 'urn:sha1:342524abcdef',
 			'_type' => 'ul',
@@ -33,12 +33,12 @@ $result = array (
 		'RightsCertificate' => 'http://example.com/rights-certificate/',
 		'Copyrighted' => 'True',
 		'CopyrightOwner' =>
-		array (
+		array(
 			0 => 'Bawolff is copyright owner',
 			'_type' => 'ul',
 		),
 		'UsageTerms' =>
-		array (
+		array(
 			'x-default' => 'do whatever you want',
 			'en-gb' => 'Do whatever you want in british english',
 			'_type' => 'lang',
@@ -46,7 +46,7 @@ $result = array (
 		'WebStatement' => 'http://example.com/web_statement',
 	),
 	'xmp-deprecated' =>
-	array (
+	array(
 		'Identifier' => 'http://example.com/identifierurl/wrong',
 	),
 );
diff --git a/tests/phpunit/includes/ArticleTablesTest.php b/tests/phpunit/includes/ArticleTablesTest.php
index 967ffa17..0f159ae4 100644
--- a/tests/phpunit/includes/ArticleTablesTest.php
+++ b/tests/phpunit/includes/ArticleTablesTest.php
@@ -5,7 +5,7 @@
  */
 class ArticleTablesTest extends MediaWikiLangTestCase {
 
-	function testbug14404() {
+	public function testbug14404() {
 		global $wgContLang, $wgLanguageCode, $wgLang;
 
 		$title = Title::newFromText( 'Bug 14404' );
@@ -16,18 +16,17 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
 		$wgContLang = Language::factory( 'es' );
 
 		$wgLang = Language::factory( 'fr' );
-		$status = $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', 0, false, $user );
+		$page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', 0, false, $user );
 		$templates1 = $title->getTemplateLinksFrom();
 
 		$wgLang = Language::factory( 'de' );
 		$page->mPreparedEdit = false; // In order to force the rerendering of the same wikitext
 
 		// We need an edit, a purge is not enough to regenerate the tables
-		$status = $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', EDIT_UPDATE, false, $user );
+		$page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', EDIT_UPDATE, false, $user );
 		$templates2 = $title->getTemplateLinksFrom();
 
 		$this->assertEquals( $templates1, $templates2 );
 		$this->assertEquals( $templates1[0]->getFullText(), 'Historial' );
 	}
-
 }
diff --git a/tests/phpunit/includes/ArticleTest.php b/tests/phpunit/includes/ArticleTest.php
index 867c4f00..b4d6dca6 100644
--- a/tests/phpunit/includes/ArticleTest.php
+++ b/tests/phpunit/includes/ArticleTest.php
@@ -25,14 +25,14 @@ class ArticleTest extends MediaWikiTestCase {
 		$this->article = null;
 	}
 
-	function testImplementsGetMagic() {
+	public function testImplementsGetMagic() {
 		$this->assertEquals( false, $this->article->mLatest, "Article __get magic" );
 	}
 
 	/**
 	 * @depends testImplementsGetMagic
 	 */
-	function testImplementsSetMagic() {
+	public function testImplementsSetMagic() {
 		$this->article->mLatest = 2;
 		$this->assertEquals( 2, $this->article->mLatest, "Article __set magic" );
 	}
@@ -40,13 +40,13 @@ class ArticleTest extends MediaWikiTestCase {
 	/**
 	 * @depends testImplementsSetMagic
 	 */
-	function testImplementsCallMagic() {
+	public function testImplementsCallMagic() {
 		$this->article->mLatest = 33;
 		$this->article->mDataLoaded = true;
 		$this->assertEquals( 33, $this->article->getLatest(), "Article __call magic" );
 	}
 
-	function testGetOrSetOnNewProperty() {
+	public function testGetOrSetOnNewProperty() {
 		$this->article->ext_someNewProperty = 12;
 		$this->assertEquals( 12, $this->article->ext_someNewProperty,
 			"Article get/set magic on new field" );
@@ -59,7 +59,7 @@ class ArticleTest extends MediaWikiTestCase {
 	/**
 	 * Checks for the existence of the backwards compatibility static functions (forwarders to WikiPage class)
 	 */
-	function testStaticFunctions() {
+	public function testStaticFunctions() {
 		$this->hideDeprecated( 'Article::getAutosummary' );
 		$this->hideDeprecated( 'WikiPage::getAutosummary' );
 		$this->hideDeprecated( 'CategoryPage::getAutosummary' ); // Inherited from Article
@@ -76,7 +76,7 @@ class ArticleTest extends MediaWikiTestCase {
 			"Article static functions" );
 	}
 
-	function testWikiPageFactory() {
+	public function testWikiPageFactory() {
 		$title = Title::makeTitle( NS_FILE, 'Someimage.png' );
 		$page = WikiPage::factory( $title );
 		$this->assertEquals( 'WikiFilePage', get_class( $page ) );
diff --git a/tests/phpunit/includes/BlockTest.php b/tests/phpunit/includes/BlockTest.php
index 19c9b687..21de0985 100644
--- a/tests/phpunit/includes/BlockTest.php
+++ b/tests/phpunit/includes/BlockTest.php
@@ -51,36 +51,36 @@ class BlockTest extends MediaWikiLangTestCase {
 		} else {
 			throw new MWException( "Failed to insert block for BlockTest; old leftover block remaining?" );
 		}
+
+		$this->addXffBlocks();
 	}
 
 	/**
 	 * debug function : dump the ipblocks table
 	 */
 	function dumpBlocks() {
-		$v = $this->db->query( 'SELECT * FROM unittest_ipblocks' );
+		$v = $this->db->select( 'ipblocks', '*' );
 		print "Got " . $v->numRows() . " rows. Full dump follow:\n";
 		foreach ( $v as $row ) {
 			print_r( $row );
 		}
 	}
 
-	function testInitializerFunctionsReturnCorrectBlock() {
+	public function testInitializerFunctionsReturnCorrectBlock() {
 		// $this->dumpBlocks();
 
 		$this->assertTrue( $this->block->equals( Block::newFromTarget( 'UTBlockee' ) ), "newFromTarget() returns the same block as the one that was made" );
 
 		$this->assertTrue( $this->block->equals( Block::newFromID( $this->blockId ) ), "newFromID() returns the same block as the one that was made" );
-
 	}
 
 	/**
 	 * per bug 26425
 	 */
-	function testBug26425BlockTimestampDefaultsToTime() {
+	public function testBug26425BlockTimestampDefaultsToTime() {
 		// delta to stop one-off errors when things happen to go over a second mark.
 		$delta = abs( $this->madeAt - $this->block->mTimestamp );
 		$this->assertLessThan( 2, $delta, "If no timestamp is specified, the block is recorded as time()" );
-
 	}
 
 	/**
@@ -91,7 +91,7 @@ class BlockTest extends MediaWikiLangTestCase {
 	 *
 	 * @dataProvider provideBug29116Data
 	 */
-	function testBug29116LoadWithEmptyIp( $vagueTarget ) {
+	public function testBug29116LoadWithEmptyIp( $vagueTarget ) {
 		$this->hideDeprecated( 'Block::load' );
 
 		$uid = User::idFromName( 'UTBlockee' );
@@ -111,7 +111,7 @@ class BlockTest extends MediaWikiLangTestCase {
 	 *
 	 * @dataProvider provideBug29116Data
 	 */
-	function testBug29116NewFromTargetWithEmptyIp( $vagueTarget ) {
+	public function testBug29116NewFromTargetWithEmptyIp( $vagueTarget ) {
 		$block = Block::newFromTarget( 'UTBlockee', $vagueTarget );
 		$this->assertTrue( $this->block->equals( $block ), "newFromTarget() returns the same block as the one that was made when given empty vagueTarget param " . var_export( $vagueTarget, true ) );
 	}
@@ -124,14 +124,13 @@ class BlockTest extends MediaWikiLangTestCase {
 		);
 	}
 
-	function testBlockedUserCanNotCreateAccount() {
+	public function testBlockedUserCanNotCreateAccount() {
 		$username = 'BlockedUserToCreateAccountWith';
 		$u = User::newFromName( $username );
 		$u->setPassword( 'NotRandomPass' );
 		$u->addToDatabase();
 		unset( $u );
 
-
 		// Sanity check
 		$this->assertNull(
 			Block::newFromTarget( $username ),
@@ -185,7 +184,7 @@ class BlockTest extends MediaWikiLangTestCase {
 		);
 	}
 
-	function testCrappyCrossWikiBlocks() {
+	public function testCrappyCrossWikiBlocks() {
 		// Delete the last round's block if it's still there
 		$oldBlock = Block::newFromTarget( 'UserOnForeignWiki' );
 		if ( $oldBlock ) {
@@ -228,4 +227,128 @@ class BlockTest extends MediaWikiLangTestCase {
 		$this->assertEquals( 'MetaWikiUser', $block->getByName(), 'Correct blocker name' );
 		$this->assertEquals( 0, $block->getBy(), 'Correct blocker id' );
 	}
+
+	protected function addXffBlocks() {
+		static $inited = false;
+
+		if ( $inited ) {
+			return;
+		}
+
+		$inited = true;
+
+		$blockList = array(
+			array( 'target' => '70.2.0.0/16',
+				'type' => Block::TYPE_RANGE,
+				'desc' => 'Range Hardblock',
+				'ACDisable' => false,
+				'isHardblock' => true,
+				'isAutoBlocking' => false,
+			),
+			array( 'target' => '2001:4860:4001::/48',
+				'type' => Block::TYPE_RANGE,
+				'desc' => 'Range6 Hardblock',
+				'ACDisable' => false,
+				'isHardblock' => true,
+				'isAutoBlocking' => false,
+			),
+			array( 'target' => '60.2.0.0/16',
+				'type' => Block::TYPE_RANGE,
+				'desc' => 'Range Softblock with AC Disabled',
+				'ACDisable' => true,
+				'isHardblock' => false,
+				'isAutoBlocking' => false,
+			),
+			array( 'target' => '50.2.0.0/16',
+				'type' => Block::TYPE_RANGE,
+				'desc' => 'Range Softblock',
+				'ACDisable' => false,
+				'isHardblock' => false,
+				'isAutoBlocking' => false,
+			),
+			array( 'target' => '50.1.1.1',
+				'type' => Block::TYPE_IP,
+				'desc' => 'Exact Softblock',
+				'ACDisable' => false,
+				'isHardblock' => false,
+				'isAutoBlocking' => false,
+			),
+		);
+
+		foreach ( $blockList as $insBlock ) {
+			$target = $insBlock['target'];
+
+			if ( $insBlock['type'] === Block::TYPE_IP ) {
+				$target = User::newFromName( IP::sanitizeIP( $target ), false )->getName();
+			} elseif ( $insBlock['type'] === Block::TYPE_RANGE ) {
+				$target = IP::sanitizeRange( $target );
+			}
+
+			$block = new Block();
+			$block->setTarget( $target );
+			$block->setBlocker( 'testblocker@global' );
+			$block->mReason = $insBlock['desc'];
+			$block->mExpiry = 'infinity';
+			$block->prevents( 'createaccount', $insBlock['ACDisable'] );
+			$block->isHardblock( $insBlock['isHardblock'] );
+			$block->isAutoblocking( $insBlock['isAutoBlocking'] );
+			$block->insert();
+		}
+	}
+
+	public static function providerXff() {
+		return array(
+			array( 'xff' => '1.2.3.4, 70.2.1.1, 60.2.1.1, 2.3.4.5',
+				'count' => 2,
+				'result' => 'Range Hardblock'
+			),
+			array( 'xff' => '1.2.3.4, 50.2.1.1, 60.2.1.1, 2.3.4.5',
+				'count' => 2,
+				'result' => 'Range Softblock with AC Disabled'
+			),
+			array( 'xff' => '1.2.3.4, 70.2.1.1, 50.1.1.1, 2.3.4.5',
+				'count' => 2,
+				'result' => 'Exact Softblock'
+			),
+			array( 'xff' => '1.2.3.4, 70.2.1.1, 50.2.1.1, 50.1.1.1, 2.3.4.5',
+				'count' => 3,
+				'result' => 'Exact Softblock'
+			),
+			array( 'xff' => '1.2.3.4, 70.2.1.1, 50.2.1.1, 2.3.4.5',
+				'count' => 2,
+				'result' => 'Range Hardblock'
+			),
+			array( 'xff' => '1.2.3.4, 70.2.1.1, 60.2.1.1, 2.3.4.5',
+				'count' => 2,
+				'result' => 'Range Hardblock'
+			),
+			array( 'xff' => '50.2.1.1, 60.2.1.1, 2.3.4.5',
+				'count' => 2,
+				'result' => 'Range Softblock with AC Disabled'
+			),
+			array( 'xff' => '1.2.3.4, 50.1.1.1, 60.2.1.1, 2.3.4.5',
+				'count' => 2,
+				'result' => 'Exact Softblock'
+			),
+			array( 'xff' => '1.2.3.4, <$A_BUNCH-OF{INVALID}TEXT\>, 60.2.1.1, 2.3.4.5',
+				'count' => 1,
+				'result' => 'Range Softblock with AC Disabled'
+			),
+			array( 'xff' => '1.2.3.4, 50.2.1.1, 2001:4860:4001:802::1003, 2.3.4.5',
+				'count' => 2,
+				'result' => 'Range6 Hardblock'
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider providerXff
+	 */
+	public function testBlocksOnXff( $xff, $exCount, $exResult ) {
+		$list = array_map( 'trim', explode( ',', $xff ) );
+		$xffblocks = Block::getBlocksForIPList( $list, true );
+		$this->assertEquals( $exCount, count( $xffblocks ), 'Number of blocks for ' . $xff );
+		$block = Block::chooseBlock( $xffblocks, $list );
+		$this->assertEquals( $exResult, $block->mReason, 'Correct block type for XFF header ' . $xff );
+	}
 }
diff --git a/tests/phpunit/includes/CdbTest.php b/tests/phpunit/includes/CdbTest.php
index add585d7..e3d9da7c 100644
--- a/tests/phpunit/includes/CdbTest.php
+++ b/tests/phpunit/includes/CdbTest.php
@@ -66,7 +66,6 @@ class CdbTest extends MediaWikiTestCase {
 			$this->cdbAssert( "PHP error", $key, $v1, $value );
 			$this->cdbAssert( "DBA error", $key, $v2, $value );
 		}
-
 	}
 
 	private function randomString() {
@@ -75,6 +74,7 @@ class CdbTest extends MediaWikiTestCase {
 		for ( $j = 0; $j < $len; $j++ ) {
 			$s .= chr( mt_rand( 0, 255 ) );
 		}
+
 		return $s;
 	}
 
diff --git a/tests/phpunit/includes/CollationTest.php b/tests/phpunit/includes/CollationTest.php
index c746208b..43bb3941 100644
--- a/tests/phpunit/includes/CollationTest.php
+++ b/tests/phpunit/includes/CollationTest.php
@@ -20,7 +20,7 @@ class CollationTest extends MediaWikiLangTestCase {
 	 *
 	 * @dataProvider prefixDataProvider
 	 */
-	function testIsPrefix( $lang, $base, $extended ) {
+	public function testIsPrefix( $lang, $base, $extended ) {
 		$cp = Collator::create( $lang );
 		$cp->setStrength( Collator::PRIMARY );
 		$baseBin = $cp->getSortKey( $base );
@@ -47,12 +47,13 @@ class CollationTest extends MediaWikiLangTestCase {
 			array( 'en', 'A', 'Aꦲ' ),
 		);
 	}
+
 	/**
 	 * Opposite of testIsPrefix
 	 *
 	 * @dataProvider notPrefixDataProvider
 	 */
-	function testNotIsPrefix( $lang, $base, $extended ) {
+	public function testNotIsPrefix( $lang, $base, $extended ) {
 		$cp = Collator::create( $lang );
 		$cp->setStrength( Collator::PRIMARY );
 		$baseBin = $cp->getSortKey( $base );
@@ -80,10 +81,11 @@ class CollationTest extends MediaWikiLangTestCase {
 	 *
 	 * @dataProvider firstLetterProvider
 	 */
-	function testGetFirstLetter( $collation, $string, $firstLetter ) {
+	public function testGetFirstLetter( $collation, $string, $firstLetter ) {
 		$col = Collation::factory( $collation );
 		$this->assertEquals( $firstLetter, $col->getFirstLetter( $string ) );
 	}
+
 	function firstLetterProvider() {
 		return array(
 			array( 'uppercase', 'Abc', 'A' ),
diff --git a/tests/phpunit/includes/DiffHistoryBlobTest.php b/tests/phpunit/includes/DiffHistoryBlobTest.php
index dcd9dddf..a4d5b91a 100644
--- a/tests/phpunit/includes/DiffHistoryBlobTest.php
+++ b/tests/phpunit/includes/DiffHistoryBlobTest.php
@@ -4,14 +4,17 @@ class DiffHistoryBlobTest extends MediaWikiTestCase {
 	protected function setUp() {
 		if ( !extension_loaded( 'xdiff' ) ) {
 			$this->markTestSkipped( 'The xdiff extension is not available' );
+
 			return;
 		}
 		if ( !function_exists( 'xdiff_string_rabdiff' ) ) {
 			$this->markTestSkipped( 'The version of xdiff extension is lower than 1.5.0' );
+
 			return;
 		}
-		if ( !extension_loaded( 'hash' ) && !extension_loaded( 'mhash' ) ) {
-			$this->markTestSkipped( 'Neither the hash nor mhash extension is available' );
+		if ( !extension_loaded( 'hash' ) ) {
+			$this->markTestSkipped( 'The hash extension is not available' );
+
 			return;
 		}
 		parent::setUp();
@@ -21,7 +24,7 @@ class DiffHistoryBlobTest extends MediaWikiTestCase {
 	 * Test for DiffHistoryBlob::xdiffAdler32()
 	 * @dataProvider provideXdiffAdler32
 	 */
-	function testXdiffAdler32( $input ) {
+	public function testXdiffAdler32( $input ) {
 		$xdiffHash = substr( xdiff_string_rabdiff( $input, '' ), 0, 4 );
 		$dhb = new DiffHistoryBlob;
 		$myHash = $dhb->xdiffAdler32( $input );
diff --git a/tests/phpunit/includes/EditPageTest.php b/tests/phpunit/includes/EditPageTest.php
index 00eba30a..87272a4c 100644
--- a/tests/phpunit/includes/EditPageTest.php
+++ b/tests/phpunit/includes/EditPageTest.php
@@ -9,12 +9,12 @@
  * @group medium
  *        ^--- tell phpunit that these test cases may take longer than 2 seconds.
  */
-class EditPageTest extends MediaWikiTestCase {
+class EditPageTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider provideExtractSectionTitle
 	 */
-	function testExtractSectionTitle( $section, $title ) {
+	public function testExtractSectionTitle( $section, $title ) {
 		$extracted = EditPage::extractSectionTitle( $section );
 		$this->assertEquals( $title, $extracted );
 	}
@@ -173,15 +173,90 @@ class EditPageTest extends MediaWikiTestCase {
 	}
 
 	public function testCreatePage() {
-		$text = "Hello World!";
-		$edit = array(
-			'wpTextbox1' => $text,
-			'wpSummary' => 'just testing',
+		$this->assertEdit(
+			'EditPageTest_testCreatePage',
+			null,
+			null,
+			array(
+				'wpTextbox1' => "Hello World!",
+			),
+			EditPage::AS_SUCCESS_NEW_ARTICLE,
+			"Hello World!",
+			"expected article being created"
+		)->doDeleteArticleReal( 'EditPageTest_testCreatePage' );
+
+		$this->assertEdit(
+			'EditPageTest_testCreatePage',
+			null,
+			null,
+			array(
+				'wpTextbox1' => "",
+			),
+			EditPage::AS_BLANK_ARTICLE,
+			null,
+			"expected article not being created if empty"
+		);
+
+
+		$this->assertEdit(
+			'MediaWiki:January',
+			null,
+			'UTSysop',
+			array(
+				'wpTextbox1' => "Not January",
+			),
+			EditPage::AS_SUCCESS_NEW_ARTICLE,
+			"Not January",
+			"expected MediaWiki: page being created"
+		)->doDeleteArticleReal( 'EditPageTest_testCreatePage' );
+
+		$this->assertEdit(
+			'MediaWiki:EditPageTest_testCreatePage',
+			null,
+			'UTSysop',
+			array(
+				'wpTextbox1' => "",
+			),
+			EditPage::AS_BLANK_ARTICLE,
+			null,
+			"expected not-registered MediaWiki: page not being created if empty"
 		);
 
-		$this->assertEdit( 'EditPageTest_testCreatePafe', null, null, $edit,
-			EditPage::AS_SUCCESS_NEW_ARTICLE, $text,
-			"expected successfull creation with given text" );
+		$this->assertEdit(
+			'MediaWiki:January',
+			null,
+			'UTSysop',
+			array(
+				'wpTextbox1' => "",
+			),
+			EditPage::AS_SUCCESS_NEW_ARTICLE,
+			"",
+			"expected registered MediaWiki: page being created even if empty"
+		)->doDeleteArticleReal( 'EditPageTest_testCreatePage' );
+
+		$this->assertEdit(
+			'MediaWiki:Ipb-default-expiry',
+			null,
+			'UTSysop',
+			array(
+				'wpTextbox1' => "",
+			),
+			EditPage::AS_BLANK_ARTICLE,
+			"",
+			"expected registered MediaWiki: page whose default content is empty not being created if empty"
+		);
+
+		$this->assertEdit(
+			'MediaWiki:January',
+			null,
+			'UTSysop',
+			array(
+				'wpTextbox1' => "January",
+			),
+			EditPage::AS_BLANK_ARTICLE,
+			null,
+			"expected MediaWiki: page not being created if text equals default message"
+		);
 	}
 
 	public function testUpdatePage() {
diff --git a/tests/phpunit/includes/ExternalStoreTest.php b/tests/phpunit/includes/ExternalStoreTest.php
index 99544e7e..fcffcbc2 100644
--- a/tests/phpunit/includes/ExternalStoreTest.php
+++ b/tests/phpunit/includes/ExternalStoreTest.php
@@ -5,7 +5,7 @@
 
 class ExternalStoreTest extends MediaWikiTestCase {
 
-	function testExternalFetchFromURL() {
+	public function testExternalFetchFromURL() {
 		$this->setMwGlobals( 'wgExternalStores', false );
 
 		$this->assertFalse(
diff --git a/tests/phpunit/includes/ExtraParserTest.php b/tests/phpunit/includes/ExtraParserTest.php
index 067cfc4a..6c67beb1 100644
--- a/tests/phpunit/includes/ExtraParserTest.php
+++ b/tests/phpunit/includes/ExtraParserTest.php
@@ -27,7 +27,7 @@ class ExtraParserTest extends MediaWikiTestCase {
 	}
 
 	// Bug 8689 - Long numeric lines kill the parser
-	function testBug8689() {
+	public function testBug8689() {
 		global $wgUser;
 		$longLine = '1.' . str_repeat( '1234567890', 100000 ) . "\n";
 
@@ -38,13 +38,13 @@ class ExtraParserTest extends MediaWikiTestCase {
 	}
 
 	/* Test the parser entry points */
-	function testParse() {
+	public function testParse() {
 		$title = Title::newFromText( __FUNCTION__ );
 		$parserOutput = $this->parser->parse( "Test\n{{Foo}}\n{{Bar}}", $title, $this->options );
 		$this->assertEquals( "<p>Test\nContent of <i>Template:Foo</i>\nContent of <i>Template:Bar</i>\n</p>", $parserOutput->getText() );
 	}
 
-	function testPreSaveTransform() {
+	public function testPreSaveTransform() {
 		global $wgUser;
 		$title = Title::newFromText( __FUNCTION__ );
 		$outputText = $this->parser->preSaveTransform( "Test\r\n{{subst:Foo}}\n{{Bar}}", $title, $wgUser, $this->options );
@@ -52,7 +52,7 @@ class ExtraParserTest extends MediaWikiTestCase {
 		$this->assertEquals( "Test\nContent of ''Template:Foo''\n{{Bar}}", $outputText );
 	}
 
-	function testPreprocess() {
+	public function testPreprocess() {
 		$title = Title::newFromText( __FUNCTION__ );
 		$outputText = $this->parser->preprocess( "Test\n{{Foo}}\n{{Bar}}", $title, $this->options );
 
@@ -62,7 +62,7 @@ class ExtraParserTest extends MediaWikiTestCase {
 	/**
 	 * cleanSig() makes all templates substs and removes tildes
 	 */
-	function testCleanSig() {
+	public function testCleanSig() {
 		$title = Title::newFromText( __FUNCTION__ );
 		$outputText = $this->parser->cleanSig( "{{Foo}} ~~~~" );
 
@@ -72,9 +72,8 @@ class ExtraParserTest extends MediaWikiTestCase {
 	/**
 	 * cleanSig() should do nothing if disabled
 	 */
-	function testCleanSigDisabled() {
-		global $wgCleanSignatures;
-		$wgCleanSignatures = false;
+	public function testCleanSigDisabled() {
+		$this->setMwGlobals( 'wgCleanSignatures', false );
 
 		$title = Title::newFromText( __FUNCTION__ );
 		$outputText = $this->parser->cleanSig( "{{Foo}} ~~~~" );
@@ -86,7 +85,7 @@ class ExtraParserTest extends MediaWikiTestCase {
 	 * cleanSigInSig() just removes tildes
 	 * @dataProvider provideStringsForCleanSigInSig
 	 */
-	function testCleanSigInSig( $in, $out ) {
+	public function testCleanSigInSig( $in, $out ) {
 		$this->assertEquals( Parser::cleanSigInSig( $in ), $out );
 	}
 
@@ -98,7 +97,7 @@ class ExtraParserTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testGetSection() {
+	public function testGetSection() {
 		$outputText2 = $this->parser->getSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 2 );
 		$outputText1 = $this->parser->getSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 1 );
 
@@ -106,7 +105,7 @@ class ExtraParserTest extends MediaWikiTestCase {
 		$this->assertEquals( "== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2", $outputText1 );
 	}
 
-	function testReplaceSection() {
+	public function testReplaceSection() {
 		$outputText = $this->parser->replaceSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 1, "New section 1" );
 
 		$this->assertEquals( "Section 0\nNew section 1\n\n== Heading 3 ==\nSection 3", $outputText );
@@ -115,7 +114,7 @@ class ExtraParserTest extends MediaWikiTestCase {
 	/**
 	 * Templates and comments are not affected, but noinclude/onlyinclude is.
 	 */
-	function testGetPreloadText() {
+	public function testGetPreloadText() {
 		$title = Title::newFromText( __FUNCTION__ );
 		$outputText = $this->parser->getPreloadText( "{{Foo}}<noinclude> censored</noinclude> information <!-- is very secret -->", $title, $this->options );
 
@@ -135,7 +134,7 @@ class ExtraParserTest extends MediaWikiTestCase {
 	/**
 	 * @group Database
 	 */
-	function testTrackingCategory() {
+	public function testTrackingCategory() {
 		$title = Title::newFromText( __FUNCTION__ );
 		$catName = wfMessage( 'broken-file-category' )->inContentLanguage()->text();
 		$cat = Title::makeTitleSafe( NS_CATEGORY, $catName );
@@ -148,7 +147,7 @@ class ExtraParserTest extends MediaWikiTestCase {
 	/**
 	 * @group Database
 	 */
-	function testTrackingCategorySpecial() {
+	public function testTrackingCategorySpecial() {
 		// Special pages shouldn't have tracking cats.
 		$title = SpecialPage::getTitleFor( 'Contributions' );
 		$parserOutput = $this->parser->parse( "[[file:nonexistent]]", $title, $this->options );
diff --git a/tests/phpunit/includes/FallbackTest.php b/tests/phpunit/includes/FallbackTest.php
new file mode 100644
index 00000000..f408f471
--- /dev/null
+++ b/tests/phpunit/includes/FallbackTest.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @covers Fallback
+ */
+class FallbackTest extends MediaWikiTestCase {
+
+	public function testFallbackMbstringFunctions() {
+
+		if ( !extension_loaded( 'mbstring' ) ) {
+			$this->markTestSkipped( "The mb_string functions must be installed to test the fallback functions" );
+		}
+
+		$sampleUTF = "Östergötland_coat_of_arms.png";
+
+		//mb_substr
+		$substr_params = array(
+			array( 0, 0 ),
+			array( 5, -4 ),
+			array( 33 ),
+			array( 100, -5 ),
+			array( -8, 10 ),
+			array( 1, 1 ),
+			array( 2, -1 )
+		);
+
+		foreach ( $substr_params as $param_set ) {
+			$old_param_set = $param_set;
+			array_unshift( $param_set, $sampleUTF );
+
+			$this->assertEquals(
+				call_user_func_array( 'mb_substr', $param_set ),
+				call_user_func_array( 'Fallback::mb_substr', $param_set ),
+				'Fallback mb_substr with params ' . implode( ', ', $old_param_set )
+			);
+		}
+
+		//mb_strlen
+		$this->assertEquals(
+			mb_strlen( $sampleUTF ),
+			Fallback::mb_strlen( $sampleUTF ),
+			'Fallback mb_strlen'
+		);
+
+		//mb_str(r?)pos
+		$strpos_params = array(
+			//array( 'ter' ),
+			//array( 'Ö' ),
+			//array( 'Ö', 3 ),
+			//array( 'oat_', 100 ),
+			//array( 'c', -10 ),
+			//Broken for now
+		);
+
+		foreach ( $strpos_params as $param_set ) {
+			$old_param_set = $param_set;
+			array_unshift( $param_set, $sampleUTF );
+
+			$this->assertEquals(
+				call_user_func_array( 'mb_strpos', $param_set ),
+				call_user_func_array( 'Fallback::mb_strpos', $param_set ),
+				'Fallback mb_strpos with params ' . implode( ', ', $old_param_set )
+			);
+
+			$this->assertEquals(
+				call_user_func_array( 'mb_strrpos', $param_set ),
+				call_user_func_array( 'Fallback::mb_strrpos', $param_set ),
+				'Fallback mb_strrpos with params ' . implode( ', ', $old_param_set )
+			);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/tests/phpunit/includes/FauxRequestTest.php b/tests/phpunit/includes/FauxRequestTest.php
new file mode 100644
index 00000000..9f3aa11d
--- /dev/null
+++ b/tests/phpunit/includes/FauxRequestTest.php
@@ -0,0 +1,15 @@
+<?php
+
+class FauxRequestTest extends MediaWikiTestCase {
+
+	public function testGetSetHeader() {
+		$value = 'test/test';
+
+		$request = new FauxRequest();
+		$request->setHeader( 'Content-Type', $value );
+
+		$this->assertEquals( $request->getHeader( 'Content-Type' ), $value );
+		$this->assertEquals( $request->getHeader( 'CONTENT-TYPE' ), $value );
+		$this->assertEquals( $request->getHeader( 'content-type' ), $value );
+	}
+}
diff --git a/tests/phpunit/includes/FauxResponseTest.php b/tests/phpunit/includes/FauxResponseTest.php
index 56691c9e..f9ba1b3b 100644
--- a/tests/phpunit/includes/FauxResponseTest.php
+++ b/tests/phpunit/includes/FauxResponseTest.php
@@ -30,13 +30,13 @@ class FauxResponseTest extends MediaWikiTestCase {
 		$this->response = new FauxResponse;
 	}
 
-	function testCookie() {
+	public function testCookie() {
 		$this->assertEquals( null, $this->response->getcookie( 'key' ), 'Non-existing cookie' );
 		$this->response->setcookie( 'key', 'val' );
 		$this->assertEquals( 'val', $this->response->getcookie( 'key' ), 'Existing cookie' );
 	}
 
-	function testHeader() {
+	public function testHeader() {
 		$this->assertEquals( null, $this->response->getheader( 'Location' ), 'Non-existing header' );
 
 		$this->response->header( 'Location: http://localhost/' );
@@ -47,9 +47,12 @@ class FauxResponseTest extends MediaWikiTestCase {
 
 		$this->response->header( 'Location: http://127.0.0.2/', false );
 		$this->assertEquals( 'http://127.0.0.1/', $this->response->getheader( 'Location' ), 'Same header with override disabled' );
+
+		$this->response->header( 'Location: http://localhost/' );
+		$this->assertEquals( 'http://localhost/', $this->response->getheader( 'LOCATION' ), 'Get header case insensitive' );
 	}
 
-	function testResponseCode() {
+	public function testResponseCode() {
 		$this->response->header( 'HTTP/1.1 200' );
 		$this->assertEquals( 200, $this->response->getStatusCode(), 'Header with no message' );
 
diff --git a/tests/phpunit/includes/FormOptionsInitializationTest.php b/tests/phpunit/includes/FormOptionsInitializationTest.php
index 4053683f..fb2304dc 100644
--- a/tests/phpunit/includes/FormOptionsInitializationTest.php
+++ b/tests/phpunit/includes/FormOptionsInitializationTest.php
@@ -81,5 +81,4 @@ class FormOptionsInitializationTest extends MediaWikiTestCase {
 			$this->object->getOptions()
 		);
 	}
-
 }
diff --git a/tests/phpunit/includes/GlobalFunctions/GlobalTest.php b/tests/phpunit/includes/GlobalFunctions/GlobalTest.php
index 24fc47cf..6154df1d 100644
--- a/tests/phpunit/includes/GlobalFunctions/GlobalTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/GlobalTest.php
@@ -29,7 +29,10 @@ class GlobalTest extends MediaWikiTestCase {
 		parent::tearDown();
 	}
 
-	/** @dataProvider provideForWfArrayDiff2 */
+	/**
+	 * @dataProvider provideForWfArrayDiff2
+	 * @covers ::wfArrayDiff2
+	 */
 	public function testWfArrayDiff2( $a, $b, $expected ) {
 		$this->assertEquals(
 			wfArrayDiff2( $a, $b ), $expected
@@ -53,25 +56,37 @@ class GlobalTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testRandom() {
+	/**
+	 * @covers ::wfRandom
+	 */
+	public function testRandom() {
 		# This could hypothetically fail, but it shouldn't ;)
 		$this->assertFalse(
 			wfRandom() == wfRandom() );
 	}
 
-	function testUrlencode() {
+	/**
+	 * @covers ::wfUrlencode
+	 */
+	public function testUrlencode() {
 		$this->assertEquals(
 			"%E7%89%B9%E5%88%A5:Contributions/Foobar",
 			wfUrlencode( "\xE7\x89\xB9\xE5\x88\xA5:Contributions/Foobar" ) );
 	}
 
-	function testExpandIRI() {
+	/**
+	 * @covers ::wfExpandIRI
+	 */
+	public function testExpandIRI() {
 		$this->assertEquals(
 			"https://te.wikibooks.org/wiki/ఉబుంటు_వాడుకరి_మార్గదర్శని",
 			wfExpandIRI( "https://te.wikibooks.org/wiki/%E0%B0%89%E0%B0%AC%E0%B1%81%E0%B0%82%E0%B0%9F%E0%B1%81_%E0%B0%B5%E0%B0%BE%E0%B0%A1%E0%B1%81%E0%B0%95%E0%B0%B0%E0%B0%BF_%E0%B0%AE%E0%B0%BE%E0%B0%B0%E0%B1%8D%E0%B0%97%E0%B0%A6%E0%B0%B0%E0%B1%8D%E0%B0%B6%E0%B0%A8%E0%B0%BF" ) );
 	}
 
-	function testReadOnlyEmpty() {
+	/**
+	 * @covers ::wfReadOnly
+	 */
+	public function testReadOnlyEmpty() {
 		global $wgReadOnly;
 		$wgReadOnly = null;
 
@@ -79,7 +94,10 @@ class GlobalTest extends MediaWikiTestCase {
 		$this->assertFalse( wfReadOnly() );
 	}
 
-	function testReadOnlySet() {
+	/**
+	 * @covers ::wfReadOnly
+	 */
+	public function testReadOnlySet() {
 		global $wgReadOnly, $wgReadOnlyFile;
 
 		$f = fopen( $wgReadOnlyFile, "wt" );
@@ -97,19 +115,6 @@ class GlobalTest extends MediaWikiTestCase {
 		$this->assertFalse( wfReadOnly() );
 	}
 
-	function testQuotedPrintable() {
-		$this->assertEquals(
-			"=?UTF-8?Q?=C4=88u=20legebla=3F?=",
-			UserMailer::quotedPrintable( "\xc4\x88u legebla?", "UTF-8" ) );
-	}
-
-	function testTime() {
-		$start = wfTime();
-		$this->assertInternalType( 'float', $start );
-		$end = wfTime();
-		$this->assertTrue( $end > $start, "Time is running backwards!" );
-	}
-
 	public static function provideArrayToCGI() {
 		return array(
 			array( array(), '' ), // empty
@@ -130,13 +135,17 @@ class GlobalTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideArrayToCGI
+	 * @covers ::wfArrayToCgi
 	 */
-	function testArrayToCGI( $array, $result ) {
+	public function testArrayToCGI( $array, $result ) {
 		$this->assertEquals( $result, wfArrayToCgi( $array ) );
 	}
 
 
-	function testArrayToCGI2() {
+	/**
+	 * @covers ::testWfArrayDiff2
+	 */
+	public function testArrayToCGI2() {
 		$this->assertEquals(
 			"baz=bar&foo=bar",
 			wfArrayToCgi(
@@ -161,8 +170,9 @@ class GlobalTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideCgiToArray
+	 * @covers ::wfCgiToArray
 	 */
-	function testCgiToArray( $cgi, $result ) {
+	public function testCgiToArray( $cgi, $result ) {
 		$this->assertEquals( $result, wfCgiToArray( $cgi ) );
 	}
 
@@ -181,12 +191,16 @@ class GlobalTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideCgiRoundTrip
+	 * @covers ::wfArrayToCgi
 	 */
-	function testCgiRoundTrip( $cgi ) {
+	public function testCgiRoundTrip( $cgi ) {
 		$this->assertEquals( $cgi, wfArrayToCgi( wfCgiToArray( $cgi ) ) );
 	}
 
-	function testMimeTypeMatch() {
+	/**
+	 * @covers ::mimeTypeMatch
+	 */
+	public function testMimeTypeMatch() {
 		$this->assertEquals(
 			'text/html',
 			mimeTypeMatch( 'text/html',
@@ -208,7 +222,10 @@ class GlobalTest extends MediaWikiTestCase {
 					'image/svg+xml' => 0.5 ) ) );
 	}
 
-	function testNegotiateType() {
+	/**
+	 * @covers ::wfNegotiateType
+	 */
+	public function testNegotiateType() {
 		$this->assertEquals(
 			'text/html',
 			wfNegotiateType(
@@ -249,77 +266,11 @@ class GlobalTest extends MediaWikiTestCase {
 				array( 'application/xhtml+xml' => 1.0 ) ) );
 	}
 
-	function testFallbackMbstringFunctions() {
-
-		if ( !extension_loaded( 'mbstring' ) ) {
-			$this->markTestSkipped( "The mb_string functions must be installed to test the fallback functions" );
-		}
-
-		$sampleUTF = "Östergötland_coat_of_arms.png";
-
-
-		//mb_substr
-		$substr_params = array(
-			array( 0, 0 ),
-			array( 5, -4 ),
-			array( 33 ),
-			array( 100, -5 ),
-			array( -8, 10 ),
-			array( 1, 1 ),
-			array( 2, -1 )
-		);
-
-		foreach ( $substr_params as $param_set ) {
-			$old_param_set = $param_set;
-			array_unshift( $param_set, $sampleUTF );
-
-			$this->assertEquals(
-				MWFunction::callArray( 'mb_substr', $param_set ),
-				MWFunction::callArray( 'Fallback::mb_substr', $param_set ),
-				'Fallback mb_substr with params ' . implode( ', ', $old_param_set )
-			);
-		}
-
-
-		//mb_strlen
-		$this->assertEquals(
-			mb_strlen( $sampleUTF ),
-			Fallback::mb_strlen( $sampleUTF ),
-			'Fallback mb_strlen'
-		);
-
-
-		//mb_str(r?)pos
-		$strpos_params = array(
-			//array( 'ter' ),
-			//array( 'Ö' ),
-			//array( 'Ö', 3 ),
-			//array( 'oat_', 100 ),
-			//array( 'c', -10 ),
-			//Broken for now
-		);
-
-		foreach ( $strpos_params as $param_set ) {
-			$old_param_set = $param_set;
-			array_unshift( $param_set, $sampleUTF );
-
-			$this->assertEquals(
-				MWFunction::callArray( 'mb_strpos', $param_set ),
-				MWFunction::callArray( 'Fallback::mb_strpos', $param_set ),
-				'Fallback mb_strpos with params ' . implode( ', ', $old_param_set )
-			);
-
-			$this->assertEquals(
-				MWFunction::callArray( 'mb_strrpos', $param_set ),
-				MWFunction::callArray( 'Fallback::mb_strrpos', $param_set ),
-				'Fallback mb_strrpos with params ' . implode( ', ', $old_param_set )
-			);
-		}
-
-	}
-
-
-	function testDebugFunctionTest() {
+	/**
+	 * @covers ::wfDebug
+	 * @covers ::wfDebugMem
+	 */
+	public function testDebugFunctionTest() {
 
 		global $wgDebugLogFile, $wgDebugTimestamps;
 
@@ -329,7 +280,6 @@ class GlobalTest extends MediaWikiTestCase {
 		$old_wgDebugTimestamps = $wgDebugTimestamps;
 		$wgDebugTimestamps = false;
 
-
 		wfDebug( "This is a normal string" );
 		$this->assertEquals( "This is a normal string", file_get_contents( $wgDebugLogFile ) );
 		unlink( $wgDebugLogFile );
@@ -338,7 +288,6 @@ class GlobalTest extends MediaWikiTestCase {
 		$this->assertEquals( "This is nöt an ASCII string", file_get_contents( $wgDebugLogFile ) );
 		unlink( $wgDebugLogFile );
 
-
 		wfDebug( "\00305This has böth UTF and control chars\003" );
 		$this->assertEquals( " 05This has böth UTF and control chars ", file_get_contents( $wgDebugLogFile ) );
 		unlink( $wgDebugLogFile );
@@ -351,12 +300,14 @@ class GlobalTest extends MediaWikiTestCase {
 		$this->assertGreaterThan( 5000000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
 		unlink( $wgDebugLogFile );
 
-
 		$wgDebugLogFile = $old_log_file;
 		$wgDebugTimestamps = $old_wgDebugTimestamps;
 	}
 
-	function testClientAcceptsGzipTest() {
+	/**
+	 * @covers ::wfClientAcceptsGzip
+	 */
+	public function testClientAcceptsGzipTest() {
 
 		$settings = array(
 			'gzip' => true,
@@ -387,7 +338,10 @@ class GlobalTest extends MediaWikiTestCase {
 		}
 	}
 
-	function testSwapVarsTest() {
+	/**
+	 * @covers ::swap
+	 */
+	public function testSwapVarsTest() {
 		$var1 = 1;
 		$var2 = 2;
 
@@ -398,10 +352,12 @@ class GlobalTest extends MediaWikiTestCase {
 
 		$this->assertEquals( $var1, 2, 'var1 is swapped' );
 		$this->assertEquals( $var2, 1, 'var2 is swapped' );
-
 	}
 
-	function testWfPercentTest() {
+	/**
+	 * @covers ::wfPercent
+	 */
+	public function testWfPercentTest() {
 
 		$pcts = array(
 			array( 6 / 7, '0.86%', 2, false ),
@@ -429,6 +385,7 @@ class GlobalTest extends MediaWikiTestCase {
 	/**
 	 * test @see wfShorthandToInteger()
 	 * @dataProvider provideShorthand
+	 * @covers ::wfShorthandToInteger
 	 */
 	public function testWfShorthandToInteger( $shorthand, $expected ) {
 		$this->assertEquals( $expected,
@@ -439,7 +396,7 @@ class GlobalTest extends MediaWikiTestCase {
 	/** array( shorthand, expected integer ) */
 	public static function provideShorthand() {
 		return array(
-			# Null, empty ... 
+			# Null, empty ...
 			array( '', -1 ),
 			array( '  ', -1 ),
 			array( null, -1 ),
@@ -489,6 +446,7 @@ class GlobalTest extends MediaWikiTestCase {
 	 *
 	 * @dataProvider provideMerge()
 	 * @group medium
+	 * @covers ::wfMerge
 	 */
 	public function testMerge( $old, $mine, $yours, $expectedMergeResult, $expectedText ) {
 		$this->checkHasDiff3();
@@ -564,13 +522,14 @@ class GlobalTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideMakeUrlIndexes()
+	 * @covers ::wfMakeUrlIndexes
 	 */
-	function testMakeUrlIndexes( $url, $expected ) {
+	public function testMakeUrlIndexes( $url, $expected ) {
 		$index = wfMakeUrlIndexes( $url );
 		$this->assertEquals( $expected, $index, "wfMakeUrlIndexes(\"$url\")" );
 	}
 
-	function provideMakeUrlIndexes() {
+	public static function provideMakeUrlIndexes() {
 		return array(
 			array(
 				// just a regular :)
@@ -621,13 +580,14 @@ class GlobalTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideWfMatchesDomainList
+	 * @covers ::wfMatchesDomainList
 	 */
-	function testWfMatchesDomainList( $url, $domains, $expected, $description ) {
+	public function testWfMatchesDomainList( $url, $domains, $expected, $description ) {
 		$actual = wfMatchesDomainList( $url, $domains );
 		$this->assertEquals( $expected, $actual, $description );
 	}
 
-	function provideWfMatchesDomainList() {
+	public static function provideWfMatchesDomainList() {
 		$a = array();
 		$protocols = array( 'HTTP' => 'http:', 'HTTPS' => 'https:', 'protocol-relative' => '' );
 		foreach ( $protocols as $pDesc => $p ) {
@@ -638,18 +598,30 @@ class GlobalTest extends MediaWikiTestCase {
 				array( "$p//www.example2.com", array( 'www.example.com', 'www.example2.com', 'www.example3.com' ), true, "Exact match with other domains in array, $pDesc URL" ),
 				array( "$p//www.example2.com", array( 'example.com', 'example2.com', 'example3,com' ), true, "Match without subdomain with other domains in array, $pDesc URL" ),
 				array( "$p//www.example4.com", array( 'example.com', 'example2.com', 'example3,com' ), false, "Domain not in array, $pDesc URL" ),
-
-				// FIXME: This is a bug in wfMatchesDomainList(). If and when this is fixed, update this test case
-				array( "$p//nds-nl.wikipedia.org", array( 'nl.wikipedia.org' ), true, "Substrings of domains match while they shouldn't, $pDesc URL" ),
+				array( "$p//nds-nl.wikipedia.org", array( 'nl.wikipedia.org' ), false, "Non-matching substring of domain, $pDesc URL" ),
 			) );
 		}
+
 		return $a;
 	}
 
+	/**
+	 * @covers ::wfMkdirParents
+	 */
+	public function testWfMkdirParents() {
+		// Should not return true if file exists instead of directory
+		$fname = $this->getNewTempFile();
+		wfSuppressWarnings();
+		$ok = wfMkdirParents( $fname );
+		wfRestoreWarnings();
+		$this->assertFalse( $ok );
+	}
+
 	/**
 	 * @dataProvider provideWfShellMaintenanceCmdList
+	 * @covers ::wfShellMaintenanceCmd
 	 */
-	function testWfShellMaintenanceCmd( $script, $parameters, $options, $expected, $description ) {
+	public function testWfShellMaintenanceCmd( $script, $parameters, $options, $expected, $description ) {
 		if ( wfIsWindows() ) {
 			// Approximation that's good enough for our purposes just now
 			$expected = str_replace( "'", '"', $expected );
@@ -658,8 +630,9 @@ class GlobalTest extends MediaWikiTestCase {
 		$this->assertEquals( $expected, $actual, $description );
 	}
 
-	function provideWfShellMaintenanceCmdList() {
+	public static function provideWfShellMaintenanceCmdList() {
 		global $wgPhpCli;
+
 		return array(
 			array( 'eval.php', array( '--help', '--test' ), array(),
 				"'$wgPhpCli' 'eval.php' '--help' '--test'",
@@ -675,5 +648,5 @@ class GlobalTest extends MediaWikiTestCase {
 				"Called eval.php --help --test with wrapper and php option" ),
 		);
 	}
-	/* TODO: many more! */
+	/* @TODO many more! */
 }
diff --git a/tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php b/tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
index 4879a38d..cf891e7b 100644
--- a/tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
@@ -6,13 +6,15 @@
 class GlobalWithDBTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provideWfIsBadImageList
+	 * @covers ::wfIsBadImage
 	 */
-	function testWfIsBadImage( $name, $title, $blacklist, $expected, $desc ) {
+	public function testWfIsBadImage( $name, $title, $blacklist, $expected, $desc ) {
 		$this->assertEquals( $expected, wfIsBadImage( $name, $title, $blacklist ), $desc );
 	}
 
-	function provideWfIsBadImageList() {
+	public static function provideWfIsBadImageList() {
 		$blacklist = '* [[File:Bad.jpg]] except [[Nasty page]]';
+
 		return array(
 			array( 'Bad.jpg', false, $blacklist, true,
 				'Called on a bad image' ),
diff --git a/tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php b/tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
index 4bd8c685..9bb74873 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
@@ -1,9 +1,11 @@
 <?php
 /**
- * Tests for wfAssembleUrl()
+ * @covers ::wfAssembleUrl
  */
 class WfAssembleUrlTest extends MediaWikiTestCase {
-	/** @dataProvider provideURLParts */
+	/**
+	 * @dataProvider provideURLParts
+	 */
 	public function testWfAssembleUrl( $parts, $output ) {
 		$partsDump = print_r( $parts, true );
 		$this->assertEquals(
@@ -87,7 +89,6 @@ class WfAssembleUrlTest extends MediaWikiTestCase {
 								$url .= '#' . $fragment;
 							}
 
-
 							$cases[] = array(
 								$parts,
 								$url,
diff --git a/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php b/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
index 8df038dd..a01c0d49 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Tests for wfBCP47()
+ * @covers ::wfBCP47
  */
 class WfBCP47Test extends MediaWikiTestCase {
 	/**
@@ -13,7 +13,7 @@ class WfBCP47Test extends MediaWikiTestCase {
 	 * @see http://tools.ietf.org/html/bcp47
 	 * @dataProvider provideLanguageCodes()
 	 */
-	function testBCP47( $code, $expected ) {
+	public function testBCP47( $code, $expected ) {
 		$code = strtolower( $code );
 		$this->assertEquals( $expected, wfBCP47( $code ),
 			"Applying BCP47 standard to lower case '$code'"
@@ -28,7 +28,7 @@ class WfBCP47Test extends MediaWikiTestCase {
 	/**
 	 * Array format is ($code, $expected)
 	 */
-	function provideLanguageCodes() {
+	public static function provideLanguageCodes() {
 		return array(
 			// Extracted from BCP47 (list not exhaustive)
 			# 2.1.1
@@ -115,20 +115,6 @@ class WfBCP47Test extends MediaWikiTestCase {
 			// de-419-DE
 			// a-DE
 			// ar-a-aaa-b-bbb-a-ccc
-
-			/*
-			// ISO 15924 :
-			array( 'sr-Cyrl', 'sr-Cyrl' ),
-			# @todo FIXME: Fix our function?
-			array( 'SR-lATN', 'sr-Latn' ),
-			array( 'fr-latn', 'fr-Latn' ),
-			// Use lowercase for single segment
-			// ISO 3166-1-alpha-2 code
-			array( 'US', 'us' ),  # USA
-			array( 'uS', 'us' ),  # USA
-			array( 'Fr', 'fr' ),  # France
-			array( 'va', 'va' ),  # Holy See (Vatican City State)
-			 */
 		);
 	}
 }
diff --git a/tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php b/tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
index 10b62b3c..7da804e6 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Tests for wfBaseConvert()
+ * @covers ::wfBaseConvert
  */
 class WfBaseConvertTest extends MediaWikiTestCase {
 	public static function provideSingleDigitConversions() {
@@ -152,6 +152,7 @@ class WfBaseConvertTest extends MediaWikiTestCase {
 
 			$x[] = array( $base, $str );
 		}
+
 		return $x;
 	}
 
diff --git a/tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php b/tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
index 407be8d2..8c548040 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
@@ -1,17 +1,17 @@
 <?php
 /**
- * Tests for wfBaseName()
+ * @covers ::wfBaseName
  */
 class WfBaseNameTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider providePaths
 	 */
-	function testBaseName( $fullpath, $basename ) {
+	public function testBaseName( $fullpath, $basename ) {
 		$this->assertEquals( $basename, wfBaseName( $fullpath ),
 			"wfBaseName('$fullpath') => '$basename'" );
 	}
 
-	function providePaths() {
+	public static function providePaths() {
 		return array(
 			array( '', '' ),
 			array( '/', '' ),
diff --git a/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php b/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
index c1225e3e..41230a1e 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
@@ -1,16 +1,17 @@
 <?php
 /**
- * Tests for wfExpandUrl()
+ * @covers ::wfExpandUrl
  */
 class WfExpandUrlTest extends MediaWikiTestCase {
-	/** @dataProvider provideExpandableUrls */
+	/**
+	 * @dataProvider provideExpandableUrls
+	 */
 	public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto, $server, $canServer, $httpsMode, $message ) {
 		// Fake $wgServer and $wgCanonicalServer
-		global $wgServer, $wgCanonicalServer;
-		$oldServer = $wgServer;
-		$oldCanServer = $wgCanonicalServer;
-		$wgServer = $server;
-		$wgCanonicalServer = $canServer;
+		$this->setMwGlobals( array(
+			'wgServer' => $server,
+			'wgCanonicalServer' => $canServer,
+		) );
 
 		// Fake $_SERVER['HTTPS'] if needed
 		if ( $httpsMode ) {
@@ -20,10 +21,6 @@ class WfExpandUrlTest extends MediaWikiTestCase {
 		}
 
 		$this->assertEquals( $fullUrl, wfExpandUrl( $shortUrl, $defaultProto ), $message );
-
-		// Restore $wgServer and $wgCanonicalServer
-		$wgServer = $oldServer;
-		$wgCanonicalServer = $oldCanServer;
 	}
 
 	/**
@@ -108,6 +105,7 @@ class WfExpandUrlTest extends MediaWikiTestCase {
 				}
 			}
 		}
+
 		return $retval;
 	}
 }
diff --git a/tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php b/tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
index 58cf6b95..62296245 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
@@ -1,8 +1,11 @@
 <?php
 
+/**
+ * @covers ::wfGetCaller
+ */
 class WfGetCallerTest extends MediaWikiTestCase {
 
-	function testZero() {
+	public function testZero() {
 		$this->assertEquals( __METHOD__, wfGetCaller( 1 ) );
 	}
 
@@ -10,7 +13,7 @@ class WfGetCallerTest extends MediaWikiTestCase {
 		return wfGetCaller();
 	}
 
-	function testOne() {
+	public function testOne() {
 		$this->assertEquals( 'WfGetCallerTest::testOne', self::callerOne() );
 	}
 
@@ -18,18 +21,20 @@ class WfGetCallerTest extends MediaWikiTestCase {
 		if ( $n > 0 ) {
 			return self::intermediateFunction( $level, $n - 1 );
 		}
+
 		return wfGetCaller( $level );
 	}
 
-	function testTwo() {
+	public function testTwo() {
 		$this->assertEquals( 'WfGetCallerTest::testTwo', self::intermediateFunction() );
 	}
 
-	function testN() {
+	public function testN() {
 		$this->assertEquals( 'WfGetCallerTest::testN', self::intermediateFunction( 2, 0 ) );
 		$this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( 1, 0 ) );
 
-		for ( $i = 0; $i < 10; $i++ )
+		for ( $i = 0; $i < 10; $i++ ) {
 			$this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( $i + 1, $i ) );
+		}
 	}
 }
diff --git a/tests/phpunit/includes/GlobalFunctions/wfParseUrlTest.php b/tests/phpunit/includes/GlobalFunctions/wfParseUrlTest.php
index 841a1b12..5032dc11 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfParseUrlTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfParseUrlTest.php
@@ -1,7 +1,5 @@
 <?php
 /**
- * Tests for wfParseUrl()
- *
  * Copyright © 2013 Alexandre Emsenhuber
  *
  * This program is free software; you can redistribute it and/or modify
@@ -22,6 +20,9 @@
  * @file
  */
 
+/**
+ * @covers ::wfParseUrl
+ */
 class WfParseUrlTest extends MediaWikiTestCase {
 	protected function setUp() {
 		parent::setUp();
@@ -31,7 +32,9 @@ class WfParseUrlTest extends MediaWikiTestCase {
 		) );
 	}
 
-	/** @dataProvider provideURLs */
+	/**
+	 * @dataProvider provideURLs
+	 */
 	public function testWfParseUrl( $url, $parts ) {
 		$partsDump = var_export( $parts, true );
 		$this->assertEquals(
diff --git a/tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php b/tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php
index 67861eeb..238a2c9c 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php
@@ -1,9 +1,11 @@
 <?php
 /**
- * Tests for wfRemoveDotSegments()
+ *@covers ::wfRemoveDotSegments
  */
 class WfRemoveDotSegmentsTest extends MediaWikiTestCase {
-	/** @dataProvider providePaths */
+	/**
+	 * @dataProvider providePaths
+	 */
 	public function testWfRemoveDotSegments( $inputPath, $outputPath ) {
 		$this->assertEquals(
 			$outputPath,
diff --git a/tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php b/tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
index 9d66d6b9..aadec87f 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
@@ -1,10 +1,13 @@
 <?php
 
+/**
+ * @covers ::wfShorthandToInteger
+ */
 class WfShorthandToIntegerTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provideABunchOfShorthands
 	 */
-	function testWfShorthandToInteger( $input, $output, $description ) {
+	public function testWfShorthandToInteger( $input, $output, $description ) {
 		$this->assertEquals(
 			wfShorthandToInteger( $input ),
 			$output,
@@ -12,7 +15,7 @@ class WfShorthandToIntegerTest extends MediaWikiTestCase {
 		);
 	}
 
-	function provideABunchOfShorthands() {
+	public static function provideABunchOfShorthands() {
 		return array(
 			array( '', -1, 'Empty string' ),
 			array( '     ', -1, 'String of spaces' ),
@@ -24,5 +27,4 @@ class WfShorthandToIntegerTest extends MediaWikiTestCase {
 			array( '1k', 1024, 'One kb lowercased' ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php b/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
index cf1830f5..5998f186 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
@@ -1,17 +1,18 @@
 <?php
 /*
- * Tests for wfTimestamp()
+ * @covers ::wfTimestamp
  */
 class WfTimestampTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provideNormalTimestamps
 	 */
-	function testNormalTimestamps( $input, $format, $output, $desc ) {
+	public function testNormalTimestamps( $input, $format, $output, $desc ) {
 		$this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
 	}
 
-	function provideNormalTimestamps() {
+	public static function provideNormalTimestamps() {
 		$t = gmmktime( 12, 34, 56, 1, 15, 2001 );
+
 		return array(
 			// TS_UNIX
 			array( $t, TS_MW, '20010115123456', 'TS_UNIX to TS_MW' ),
@@ -56,11 +57,11 @@ class WfTimestampTest extends MediaWikiTestCase {
 	 * See r74778 and bug 25451
 	 * @dataProvider provideOldTimestamps
 	 */
-	function testOldTimestamps( $input, $format, $output, $desc ) {
+	public function testOldTimestamps( $input, $format, $output, $desc ) {
 		$this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
 	}
 
-	function provideOldTimestamps() {
+	public static function provideOldTimestamps() {
 		return array(
 			array( '19011213204554', TS_RFC2822, 'Fri, 13 Dec 1901 20:45:54 GMT', 'Earliest time according to php documentation' ),
 			array( '20380119031407', TS_RFC2822, 'Tue, 19 Jan 2038 03:14:07 GMT', 'Latest 32 bit time' ),
@@ -95,11 +96,11 @@ class WfTimestampTest extends MediaWikiTestCase {
 	 * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
 	 * @dataProvider provideHttpDates
 	 */
-	function testHttpDate( $input, $output, $desc ) {
+	public function testHttpDate( $input, $output, $desc ) {
 		$this->assertEquals( $output, wfTimestamp( TS_MW, $input ), $desc );
 	}
 
-	function provideHttpDates() {
+	public static function provideHttpDates() {
 		return array(
 			array( 'Sun, 06 Nov 1994 08:49:37 GMT', '19941106084937', 'RFC 822 date' ),
 			array( 'Sunday, 06-Nov-94 08:49:37 GMT', '19941106084937', 'RFC 850 date' ),
@@ -113,9 +114,9 @@ class WfTimestampTest extends MediaWikiTestCase {
 	 * There are a number of assumptions in our codebase where wfTimestamp()
 	 * should give the current date but it is not given a 0 there. See r71751 CR
 	 */
-	function testTimestampParameter() {
+	public function testTimestampParameter() {
 		$now = wfTimestamp( TS_UNIX );
-		// We check that wfTimestamp doesn't return false (error) and use a LessThan assert 
+		// We check that wfTimestamp doesn't return false (error) and use a LessThan assert
 		// for the cases where the test is run in a second boundary.
 
 		$zero = wfTimestamp( TS_UNIX, 0 );
diff --git a/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php b/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
index 77685d50..ce6c82c5 100644
--- a/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
+++ b/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
@@ -1,18 +1,21 @@
 <?php
 /**
- * Tests for wfUrlencode()
- *
  * The function only need a string parameter and might react to IIS7.0
+ * @covers ::wfUrlencode
  */
 class WfUrlencodeTest extends MediaWikiTestCase {
 	#### TESTS ##############################################################
 
-	/** @dataProvider provideURLS */
+	/**
+	 * @dataProvider provideURLS
+	 */
 	public function testEncodingUrlWith( $input, $expected ) {
 		$this->verifyEncodingFor( 'Apache', $input, $expected );
 	}
 
-	/** @dataProvider provideURLS */
+	/**
+	 * @dataProvider provideURLS
+	 */
 	public function testEncodingUrlWithMicrosoftIis7( $input, $expected ) {
 		$this->verifyEncodingFor( 'Microsoft-IIS/7', $input, $expected );
 	}
diff --git a/tests/phpunit/includes/HTMLCheckMatrixTest.php b/tests/phpunit/includes/HTMLCheckMatrixTest.php
new file mode 100644
index 00000000..5bbafd37
--- /dev/null
+++ b/tests/phpunit/includes/HTMLCheckMatrixTest.php
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * Unit tests for the HTMLCheckMatrix form field
+ */
+class HtmlCheckMatrixTest extends MediaWikiTestCase {
+	static private $defaultOptions = array(
+		'rows' => array( 'r1', 'r2' ),
+		'columns' => array( 'c1', 'c2' ),
+		'fieldname' => 'test',
+	);
+
+	public function testPlainInstantiation() {
+		try {
+			$form = new HTMLCheckMatrix( array() );
+		} catch ( MWException $e ) {
+			$this->assertInstanceOf( 'HTMLFormFieldRequiredOptionsException', $e );
+			return;
+		}
+
+		$this->fail( 'Expected MWException indicating missing parameters but none was thrown.' );
+	}
+
+	public function testInstantiationWithMinimumRequiredParameters() {
+		$form = new HTMLCheckMatrix( self::$defaultOptions );
+		$this->assertTrue( true ); // form instantiation must throw exception on failure
+	}
+
+	public function testValidateCallsUserDefinedValidationCallback() {
+		$called = false;
+		$field = new HTMLCheckMatrix( self::$defaultOptions + array(
+			'validation-callback' => function() use ( &$called ) {
+				$called = true;
+				return false;
+			},
+		) );
+		$this->assertEquals( false, $this->validate( $field, array() ) );
+		$this->assertTrue( $called );
+	}
+
+	public function testValidateRequiresArrayInput() {
+		$field = new HTMLCheckMatrix( self::$defaultOptions );
+		$this->assertEquals( false, $this->validate( $field, null ) );
+		$this->assertEquals( false, $this->validate( $field, true ) );
+		$this->assertEquals( false, $this->validate( $field, 'abc' ) );
+		$this->assertEquals( false, $this->validate( $field, new stdClass ) );
+		$this->assertEquals( true, $this->validate( $field, array() ) );
+	}
+
+	public function testValidateAllowsOnlyKnownTags() {
+		$field = new HTMLCheckMatrix( self::$defaultOptions );
+		$this->assertInternalType( 'string', $this->validate( $field, array( 'foo' ) ) );
+	}
+
+	public function testValidateAcceptsPartialTagList() {
+		$field = new HTMLCheckMatrix( self::$defaultOptions );
+		$this->assertTrue( $this->validate( $field, array() ) );
+		$this->assertTrue( $this->validate( $field, array( 'c1-r1' ) ) );
+		$this->assertTrue( $this->validate( $field, array( 'c1-r1', 'c1-r2', 'c2-r1', 'c2-r2' ) ) );
+	}
+
+	/**
+	 * This form object actually has no visibility into what happens later on, but essentially
+	 * if the data submitted by the user passes validate the following is run:
+	 * foreach ( $field->filterDataForSubmit( $data ) as $k => $v ) {
+	 *     $user->setOption( $k, $v );
+	 * }
+	 */
+	public function testValuesForcedOnRemainOn() {
+		$field = new HTMLCheckMatrix( self::$defaultOptions + array(
+			'force-options-on' => array( 'c2-r1' ),
+		) );
+		$expected = array(
+			'c1-r1' => false,
+			'c1-r2' => false,
+			'c2-r1' => true,
+			'c2-r2' => false,
+		);
+		$this->assertEquals( $expected, $field->filterDataForSubmit( array() ) );
+	}
+
+	public function testValuesForcedOffRemainOff() {
+		$field = new HTMLCheckMatrix( self::$defaultOptions + array(
+			'force-options-off' => array( 'c1-r2', 'c2-r2' ),
+		) );
+		$expected = array(
+			'c1-r1' => true,
+			'c1-r2' => false,
+			'c2-r1' => true,
+			'c2-r2' => false,
+		);
+		// array_keys on the result simulates submitting all fields checked
+		$this->assertEquals( $expected, $field->filterDataForSubmit( array_keys( $expected ) ) );
+	}
+
+	protected function validate( HTMLFormField $field, $submitted ) {
+		return $field->validate(
+			$submitted,
+			array( self::$defaultOptions['fieldname'] => $submitted )
+		);
+	}
+}
diff --git a/tests/phpunit/includes/HashRingTest.php b/tests/phpunit/includes/HashRingTest.php
new file mode 100644
index 00000000..65f13696
--- /dev/null
+++ b/tests/phpunit/includes/HashRingTest.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * @group HashRing
+ */
+class HashRingTest extends MediaWikiTestCase {
+	public function testHashRing() {
+		$ring = new HashRing( array( 's1' => 1, 's2' => 1, 's3' => 2, 's4' => 2, 's5' => 2, 's6' => 3 ) );
+
+		$locations = array();
+		for ( $i = 0; $i < 20; $i++ ) {
+			$locations[ "hello$i"] = $ring->getLocation( "hello$i" );
+		}
+		$expectedLocations = array(
+			"hello0" => "s5",
+			"hello1" => "s6",
+			"hello2" => "s2",
+			"hello3" => "s5",
+			"hello4" => "s6",
+			"hello5" => "s4",
+			"hello6" => "s5",
+			"hello7" => "s4",
+			"hello8" => "s5",
+			"hello9" => "s5",
+			"hello10" => "s3",
+			"hello11" => "s6",
+			"hello12" => "s1",
+			"hello13" => "s3",
+			"hello14" => "s3",
+			"hello15" => "s5",
+			"hello16" => "s4",
+			"hello17" => "s6",
+			"hello18" => "s6",
+			"hello19" => "s3"
+		);
+
+		$this->assertEquals( $expectedLocations, $locations, 'Items placed at proper locations' );
+
+		$locations = array();
+		for ( $i = 0; $i < 5; $i++ ) {
+			$locations[ "hello$i"] = $ring->getLocations( "hello$i", 2 );
+		}
+
+		$expectedLocations = array(
+			"hello0" => array( "s5", "s6" ),
+			"hello1" => array( "s6", "s4" ),
+			"hello2" => array( "s2", "s1" ),
+			"hello3" => array( "s5", "s6" ),
+			"hello4" => array( "s6", "s4" ),
+		);
+		$this->assertEquals( $expectedLocations, $locations, 'Items placed at proper locations' );
+	}
+}
diff --git a/tests/phpunit/includes/HooksTest.php b/tests/phpunit/includes/HooksTest.php
index 89e789b1..81dd4870 100644
--- a/tests/phpunit/includes/HooksTest.php
+++ b/tests/phpunit/includes/HooksTest.php
@@ -2,81 +2,62 @@
 
 class HooksTest extends MediaWikiTestCase {
 
-	public function testOldStyleHooks() {
-		$foo = 'Foo';
-		$bar = 'Bar';
-
-		$i = new NothingClass();
-
+	function setUp() {
 		global $wgHooks;
-
-		$wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someNonStatic' );
-
-		wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
-		$this->assertEquals( 'fOO', $foo, 'Standard method' );
-		$foo = 'Foo';
-
-		$wgHooks['MediaWikiHooksTest001'][] = $i;
-
-		wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
-		$this->assertEquals( 'foo', $foo, 'onEventName style' );
-		$foo = 'Foo';
-
-		$wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someNonStaticWithData', 'baz' );
-
-		wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
-		$this->assertEquals( 'baz', $foo, 'Data included' );
-		$foo = 'Foo';
-
-		$wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someStatic' );
-
-		wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
-		$this->assertEquals( 'bah', $foo, 'Standard static method' );
-		//$foo = 'Foo';
-
+		parent::setUp();
+		Hooks::clear( 'MediaWikiHooksTest001' );
 		unset( $wgHooks['MediaWikiHooksTest001'] );
-
 	}
 
-	public function testNewStyleHooks() {
-		$foo = 'Foo';
-		$bar = 'Bar';
-
+	public static function provideHooks() {
 		$i = new NothingClass();
 
-		Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someNonStatic' ) );
-
-		Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
-		$this->assertEquals( 'fOO', $foo, 'Standard method' );
-		$foo = 'Foo';
-
-		Hooks::register( 'MediaWikiHooksTest001', $i );
-
-		Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
-		$this->assertEquals( 'foo', $foo, 'onEventName style' );
-		$foo = 'Foo';
+		return array(
+			array( 'Object and method', array( $i, 'someNonStatic' ), 'changed-nonstatic', 'changed-nonstatic' ),
+			array( 'Object and no method', array( $i ), 'changed-onevent', 'original' ),
+			array( 'Object and method with data', array( $i, 'someNonStaticWithData', 'data' ), 'data', 'original' ),
+			array( 'Object and static method', array( $i, 'someStatic' ), 'changed-static', 'original' ),
+			array( 'Class::method static call', array( 'NothingClass::someStatic' ), 'changed-static', 'original' ),
+			array( 'Global function', array( 'NothingFunction' ), 'changed-func', 'original' ),
+			array( 'Global function with data', array( 'NothingFunctionData', 'data' ), 'data', 'original' ),
+			array( 'Closure', array( function ( &$foo, $bar ) {
+				$foo = 'changed-closure';
+
+				return true;
+			} ), 'changed-closure', 'original' ),
+			array( 'Closure with data', array( function ( $data, &$foo, $bar ) {
+				$foo = $data;
+
+				return true;
+			}, 'data' ), 'data', 'original' )
+		);
+	}
 
-		Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someNonStaticWithData', 'baz' ) );
+	/**
+	 * @dataProvider provideHooks
+	 */
+	public function testOldStyleHooks( $msg, array $hook, $expectedFoo, $expectedBar ) {
+		global $wgHooks;
+		$foo = $bar = 'original';
 
-		Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
+		$wgHooks['MediaWikiHooksTest001'][] = $hook;
+		wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
 
-		$this->assertEquals( 'baz', $foo, 'Data included' );
-		$foo = 'Foo';
+		$this->assertSame( $expectedFoo, $foo, $msg );
+		$this->assertSame( $expectedBar, $bar, $msg );
+	}
 
-		Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someStatic' ) );
+	/**
+	 * @dataProvider provideHooks
+	 */
+	public function testNewStyleHooks( $msg, $hook, $expectedFoo, $expectedBar ) {
+		$foo = $bar = 'original';
 
+		Hooks::register( 'MediaWikiHooksTest001', $hook );
 		Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
 
-		$this->assertEquals( 'bah', $foo, 'Standard static method' );
-		$foo = 'Foo';
-
-		Hooks::clear( 'MediaWikiHooksTest001' );
+		$this->assertSame( $expectedFoo, $foo, $msg );
+		$this->assertSame( $expectedBar, $bar, $msg );
 	}
 
 	public function testNewStyleHookInteraction() {
@@ -85,10 +66,6 @@ class HooksTest extends MediaWikiTestCase {
 		$a = new NothingClass();
 		$b = new NothingClass();
 
-		// make sure to start with a clean slate
-		Hooks::clear( 'MediaWikiHooksTest001' );
-		unset( $wgHooks['MediaWikiHooksTest001'] );
-
 		$wgHooks['MediaWikiHooksTest001'][] = $a;
 		$this->assertTrue( Hooks::isRegistered( 'MediaWikiHooksTest001' ), 'Hook registered via $wgHooks should be noticed by Hooks::isRegistered' );
 
@@ -101,37 +78,81 @@ class HooksTest extends MediaWikiTestCase {
 		Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
 		$this->assertEquals( 1, $a->calls, 'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register' );
 		$this->assertEquals( 1, $b->calls, 'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register' );
+	}
 
-		// clean up
-		Hooks::clear( 'MediaWikiHooksTest001' );
-		unset( $wgHooks['MediaWikiHooksTest001'] );
+	/**
+	 * @expectedException MWException
+	 */
+	public function testUncallableFunction() {
+		Hooks::register( 'MediaWikiHooksTest001', 'ThisFunctionDoesntExist' );
+		Hooks::run( 'MediaWikiHooksTest001', array() );
 	}
+
+	public function testFalseReturn() {
+		Hooks::register( 'MediaWikiHooksTest001', function ( &$foo ) {
+			return false;
+		} );
+		Hooks::register( 'MediaWikiHooksTest001', function ( &$foo ) {
+			$foo = 'test';
+
+			return true;
+		} );
+		$foo = 'original';
+		Hooks::run( 'MediaWikiHooksTest001', array( &$foo ) );
+		$this->assertSame( 'original', $foo, 'Hooks continued processing after a false return.' );
+	}
+
+	/**
+	 * @expectedException FatalError
+	 */
+	public function testFatalError() {
+		Hooks::register( 'MediaWikiHooksTest001', function () {
+			return 'test';
+		} );
+		Hooks::run( 'MediaWikiHooksTest001', array() );
+	}
+}
+
+function NothingFunction( &$foo, &$bar ) {
+	$foo = 'changed-func';
+
+	return true;
+}
+
+function NothingFunctionData( $data, &$foo, &$bar ) {
+	$foo = $data;
+
+	return true;
 }
 
 class NothingClass {
 	public $calls = 0;
 
 	public static function someStatic( &$foo, &$bar ) {
-		$foo = 'bah';
+		$foo = 'changed-static';
+
 		return true;
 	}
 
 	public function someNonStatic( &$foo, &$bar ) {
 		$this->calls++;
-		$foo = 'fOO';
-		$bar = 'bAR';
+		$foo = 'changed-nonstatic';
+		$bar = 'changed-nonstatic';
+
 		return true;
 	}
 
 	public function onMediaWikiHooksTest001( &$foo, &$bar ) {
 		$this->calls++;
-		$foo = 'foo';
+		$foo = 'changed-onevent';
+
 		return true;
 	}
 
-	public function someNonStaticWithData( $foo, &$bar ) {
+	public function someNonStaticWithData( $data, &$foo, &$bar ) {
 		$this->calls++;
-		$bar = $foo;
+		$foo = $data;
+
 		return true;
 	}
 }
diff --git a/tests/phpunit/includes/HtmlFormatterTest.php b/tests/phpunit/includes/HtmlFormatterTest.php
new file mode 100644
index 00000000..a37df74f
--- /dev/null
+++ b/tests/phpunit/includes/HtmlFormatterTest.php
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * @group HtmlFormatter
+ */
+class HtmlFormatterTest extends MediaWikiTestCase {
+	/**
+	 * @dataProvider getHtmlData
+	 */
+	public function testTransform( $input, $expected, $callback = false ) {
+		$input = self::normalize( $input );
+		$formatter = new HtmlFormatter( HtmlFormatter::wrapHTML( $input ) );
+		if ( $callback ) {
+			$callback( $formatter );
+		}
+		$formatter->filterContent();
+		$html = $formatter->getText();
+		$this->assertEquals( self::normalize( $expected ), self::normalize( $html ) );
+	}
+
+	private static function normalize( $s ) {
+		return str_replace( "\n", '',
+			str_replace( "\r", '', $s ) // "yay" to Windows!
+		);
+	}
+
+	public function getHtmlData() {
+		$removeImages = function( HtmlFormatter $f ) {
+			$f->setRemoveMedia();
+		};
+		$removeTags = function( HtmlFormatter $f ) {
+			$f->remove( array( 'table', '.foo', '#bar', 'div.baz' ) );
+		};
+		$flattenSomeStuff = function( HtmlFormatter $f ) {
+			$f->flatten( array( 's', 'div' ) );
+		};
+		$flattenEverything = function( HtmlFormatter $f ) {
+			$f->flattenAllTags();
+		};
+		return array(
+			// remove images if asked
+			array(
+				'<img src="/foo/bar.jpg" alt="Blah"/>',
+				'',
+				$removeImages,
+			),
+			// basic tag removal
+			array(
+				'<table><tr><td>foo</td></tr></table><div class="foo">foo</div><div class="foo quux">foo</div><span id="bar">bar</span>
+<strong class="foo" id="bar">foobar</strong><div class="notfoo">test</div><div class="baz"/>
+<span class="baz">baz</span>',
+
+				'<div class="notfoo">test</div>
+<span class="baz">baz</span>',
+				$removeTags,
+			),
+			// don't flatten tags that start like chosen ones
+			array(
+				'<div><s>foo</s> <span>bar</span></div>',
+				'foo <span>bar</span>',
+				$flattenSomeStuff,
+			),
+			// total flattening
+			array(
+				'<div style="foo">bar<sup>2</sup></div>',
+				'bar2',
+				$flattenEverything,
+			),
+			// UTF-8 preservation and security
+			array(
+				'<span title="&quot; \' &amp;">&lt;Тест!&gt;</span> &amp;&lt;&#38;&#0038;&#x26;&#x026;',
+				'<span title="&quot; \' &amp;">&lt;Тест!&gt;</span> &amp;&lt;&amp;&amp;&amp;&amp;',
+			),
+			// https://bugzilla.wikimedia.org/show_bug.cgi?id=53086
+			array(
+				'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup> <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
+				'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup> <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
+			),
+		);
+	}
+}
diff --git a/tests/phpunit/includes/HtmlTest.php b/tests/phpunit/includes/HtmlTest.php
index 590664e8..1c62d032 100644
--- a/tests/phpunit/includes/HtmlTest.php
+++ b/tests/phpunit/includes/HtmlTest.php
@@ -37,14 +37,11 @@ class HtmlTest extends MediaWikiTestCase {
 			'wgLanguageCode' => $langCode,
 			'wgContLang' => $langObj,
 			'wgLang' => $langObj,
-			'wgHtml5' => true,
 			'wgWellFormedXml' => false,
 		) );
 	}
 
 	public function testElementBasics() {
-		global $wgWellFormedXml;
-
 		$this->assertEquals(
 			'<img>',
 			Html::element( 'img', null, '' ),
@@ -63,7 +60,7 @@ class HtmlTest extends MediaWikiTestCase {
 			'Close tag for empty element (array, string)'
 		);
 
-		$wgWellFormedXml = true;
+		$this->setMwGlobals( 'wgWellFormedXml', true );
 
 		$this->assertEquals(
 			'<img />',
@@ -72,6 +69,31 @@ class HtmlTest extends MediaWikiTestCase {
 		);
 	}
 
+	public function dataXmlMimeType() {
+		return array(
+			// ( $mimetype, $isXmlMimeType )
+			# HTML is not an XML MimeType
+			array( 'text/html', false ),
+			# XML is an XML MimeType
+			array( 'text/xml', true ),
+			array( 'application/xml', true ),
+			# XHTML is an XML MimeType
+			array( 'application/xhtml+xml', true ),
+			# Make sure other +xml MimeTypes are supported
+			# SVG is another random MimeType even though we don't use it
+			array( 'image/svg+xml', true ),
+			# Complete random other MimeTypes are not XML
+			array( 'text/plain', false ),
+		);
+	}
+
+	/**
+	 * @dataProvider dataXmlMimeType
+	 */
+	public function testXmlMimeType( $mimetype, $isXmlMimeType ) {
+		$this->assertEquals( $isXmlMimeType, Html::isXmlMimeType( $mimetype ) );
+	}
+
 	public function testExpandAttributesSkipsNullAndFalse() {
 
 		### EMPTY ########
@@ -90,8 +112,6 @@ class HtmlTest extends MediaWikiTestCase {
 	}
 
 	public function testExpandAttributesForBooleans() {
-		global $wgHtml5, $wgWellFormedXml;
-
 		$this->assertEquals(
 			'',
 			Html::expandAttributes( array( 'selected' => false ) ),
@@ -114,21 +134,13 @@ class HtmlTest extends MediaWikiTestCase {
 			'Boolean attributes have no value when value is true (passed as numerical array)'
 		);
 
-		$wgWellFormedXml = true;
+		$this->setMwGlobals( 'wgWellFormedXml', true );
 
 		$this->assertEquals(
 			' selected=""',
 			Html::expandAttributes( array( 'selected' => true ) ),
 			'Boolean attributes have empty string value when value is true (wgWellFormedXml)'
 		);
-
-		$wgHtml5 = false;
-
-		$this->assertEquals(
-			' selected="selected"',
-			Html::expandAttributes( array( 'selected' => true ) ),
-			'Boolean attributes have their key as value when value is true (wgWellFormedXml, wgHTML5 = false)'
-		);
 	}
 
 	/**
@@ -136,8 +148,6 @@ class HtmlTest extends MediaWikiTestCase {
 	 * Please note it output a string prefixed with a space!
 	 */
 	public function testExpandAttributesVariousExpansions() {
-		global $wgWellFormedXml;
-
 		### NOT EMPTY ####
 		$this->assertEquals(
 			' empty_string=""',
@@ -160,7 +170,7 @@ class HtmlTest extends MediaWikiTestCase {
 			'Number 0 value needs no quotes'
 		);
 
-		$wgWellFormedXml = true;
+		$this->setMwGlobals( 'wgWellFormedXml', true );
 
 		$this->assertEquals(
 			' empty_string=""',
@@ -240,7 +250,7 @@ class HtmlTest extends MediaWikiTestCase {
 	 * Test feature added by r96188, let pass attributes values as
 	 * a PHP array. Restricted to class,rel, accesskey.
 	 */
-	function testExpandAttributesSpaceSeparatedAttributesWithBoolean() {
+	public function testExpandAttributesSpaceSeparatedAttributesWithBoolean() {
 		$this->assertEquals(
 			' class="booltrue one"',
 			Html::expandAttributes( array( 'class' => array(
@@ -264,7 +274,7 @@ class HtmlTest extends MediaWikiTestCase {
 	 *
 	 * Feature added by r96188
 	 */
-	function testValueIsAuthoritativeInSpaceSeparatedAttributesArrays() {
+	public function testValueIsAuthoritativeInSpaceSeparatedAttributesArrays() {
 		$this->assertEquals(
 			' class=""',
 			Html::expandAttributes( array( 'class' => array(
@@ -275,7 +285,7 @@ class HtmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testNamespaceSelector() {
+	public function testNamespaceSelector() {
 		$this->assertEquals(
 			'<select id=namespace name=namespace>' . "\n" .
 				'<option value=0>(Main)</option>' . "\n" .
@@ -354,7 +364,7 @@ class HtmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testCanFilterOutNamespaces() {
+	public function testCanFilterOutNamespaces() {
 		$this->assertEquals(
 			'<select id=namespace name=namespace>' . "\n" .
 				'<option value=2>User</option>' . "\n" .
@@ -376,7 +386,7 @@ class HtmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testCanDisableANamespaces() {
+	public function testCanDisableANamespaces() {
 		$this->assertEquals(
 			'<select id=namespace name=namespace>' . "\n" .
 				'<option disabled value=0>(Main)</option>' . "\n" .
@@ -406,7 +416,7 @@ class HtmlTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provideHtml5InputTypes
 	 */
-	function testHtmlElementAcceptsNewHtml5TypesInHtml5Mode( $HTML5InputType ) {
+	public function testHtmlElementAcceptsNewHtml5TypesInHtml5Mode( $HTML5InputType ) {
 		$this->assertEquals(
 			'<input type=' . $HTML5InputType . '>',
 			Html::element( 'input', array( 'type' => $HTML5InputType ) ),
@@ -418,7 +428,7 @@ class HtmlTest extends MediaWikiTestCase {
 	 * List of input element types values introduced by HTML5
 	 * Full list at http://www.w3.org/TR/html-markup/input.html
 	 */
-	function provideHtml5InputTypes() {
+	public static function provideHtml5InputTypes() {
 		$types = array(
 			'datetime',
 			'datetime-local',
@@ -438,6 +448,7 @@ class HtmlTest extends MediaWikiTestCase {
 		foreach ( $types as $type ) {
 			$cases[] = array( $type );
 		}
+
 		return $cases;
 	}
 
@@ -446,7 +457,7 @@ class HtmlTest extends MediaWikiTestCase {
 	 * @covers Html::dropDefaults
 	 * @dataProvider provideElementsWithAttributesHavingDefaultValues
 	 */
-	function testDropDefaults( $expected, $element, $attribs, $message = '' ) {
+	public function testDropDefaults( $expected, $element, $attribs, $message = '' ) {
 		$this->assertEquals( $expected, Html::element( $element, $attribs ), $message );
 	}
 
@@ -602,6 +613,7 @@ class HtmlTest extends MediaWikiTestCase {
 				isset( $case[3] ) ? $case[3] : ''
 			);
 		}
+
 		return $ret;
 	}
 
@@ -616,5 +628,4 @@ class HtmlTest extends MediaWikiTestCase {
 			'Allow special case "step=any".'
 		);
 	}
-
 }
diff --git a/tests/phpunit/includes/HttpTest.php b/tests/phpunit/includes/HttpTest.php
index 7698776c..11d8ed60 100644
--- a/tests/phpunit/includes/HttpTest.php
+++ b/tests/phpunit/includes/HttpTest.php
@@ -5,8 +5,9 @@
 class HttpTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider cookieDomains
+	 * @covers Cookie::validateCookieDomain
 	 */
-	function testValidateCookieDomain( $expected, $domain, $origin = null ) {
+	public function testValidateCookieDomain( $expected, $domain, $origin = null ) {
 		if ( $origin ) {
 			$ok = Cookie::validateCookieDomain( $domain, $origin );
 			$msg = "$domain against origin $origin";
@@ -50,8 +51,9 @@ class HttpTest extends MediaWikiTestCase {
 	 * Test Http::isValidURI()
 	 * @bug 27854 : Http::isValidURI is too lax
 	 * @dataProvider provideURI
+	 * @covers Http::isValidURI
 	 */
-	function testIsValidUri( $expect, $URI, $message = '' ) {
+	public function testIsValidUri( $expect, $URI, $message = '' ) {
 		$this->assertEquals(
 			$expect,
 			(bool)Http::isValidURI( $URI ),
@@ -132,7 +134,7 @@ class HttpTest extends MediaWikiTestCase {
 	 * rewritten when bug 29232 is taken care of (high-level handling of
 	 * HTTP redirects).
 	 */
-	function testRelativeRedirections() {
+	public function testRelativeRedirections() {
 		$h = MWHttpRequestTester::factory( 'http://oldsite/file.ext' );
 
 		# Forge a Location header
@@ -176,7 +178,7 @@ class HttpTest extends MediaWikiTestCase {
  */
 class MWHttpRequestTester extends MWHttpRequest {
 
-	// function derived from the MWHttpRequest factory function but 
+	// function derived from the MWHttpRequest factory function but
 	// returns appropriate tester class here
 	public static function factory( $url, $options = null ) {
 		if ( !Http::$httpEngine ) {
@@ -194,6 +196,7 @@ class MWHttpRequestTester extends MWHttpRequest {
 					throw new MWException( __METHOD__ . ': allow_url_fopen needs to be enabled for pure PHP' .
 						' http requests to work. If possible, curl should be used instead. See http://php.net/curl.' );
 				}
+
 				return new PhpHttpRequestTester( $url, $options );
 			default:
 		}
diff --git a/tests/phpunit/includes/IPTest.php b/tests/phpunit/includes/IPTest.php
index 7bc29385..c074eea6 100644
--- a/tests/phpunit/includes/IPTest.php
+++ b/tests/phpunit/includes/IPTest.php
@@ -1,7 +1,12 @@
 <?php
 /**
- * Tests for IP validity functions. Ported from /t/inc/IP.t by avar.
+ * Tests for IP validity functions.
+ *
+ * Ported from /t/inc/IP.t by avar.
+ *
  * @group IP
+ * @todo Test methods in this call should be split into a method and a
+ * dataprovider.
  */
 
 class IPTest extends MediaWikiTestCase {
@@ -259,14 +264,63 @@ class IPTest extends MediaWikiTestCase {
 	}
 
 	/**
-	 * test wrapper around ip2long which might return -1 or false depending on PHP version
 	 * @covers IP::toUnsigned
+	 * @dataProvider provideToUnsigned
 	 */
-	public function testip2longWrapper() {
-		// @todo FIXME: Add more tests ?
-		$this->assertEquals( pow( 2, 32 ) - 1, IP::toUnsigned( '255.255.255.255' ) );
-		$i = 'IN.VA.LI.D';
-		$this->assertFalse( IP::toUnSigned( $i ) );
+	public function testToUnsigned( $expected, $input ) {
+		$result = IP::toUnsigned( $input );
+		$this->assertTrue( $result === false || is_string( $result ) || is_int( $result ) );
+		$this->assertEquals( $expected, $result );
+	}
+
+	/**
+	 * Provider for IP::testToUnsigned()
+	 */
+	public static function provideToUnsigned() {
+		return array(
+			array( 1, '0.0.0.1' ),
+			array( 16909060, '1.2.3.4' ),
+			array( 2130706433, '127.0.0.1' ),
+			array( '2147483648', '128.0.0.0' ),
+			array( '3735931646', '222.173.202.254' ),
+			array( pow( 2, 32 ) - 1, '255.255.255.255' ),
+			array( false, 'IN.VA.LI.D' ),
+			array( 1, '::1' ),
+			array( '42540766452641154071740215577757643572', '2001:0db8:85a3:0000:0000:8a2e:0370:7334' ),
+			array( '42540766452641154071740215577757643572', '2001:db8:85a3::8a2e:0370:7334' ),
+			array( false, 'IN:VA::LI:D' ),
+			array( false, ':::1' )
+		);
+	}
+
+	/**
+	 * @covers IP::toHex
+	 * @dataProvider provideToHex
+	 */
+	public function testToHex( $expected, $input ) {
+		$result = IP::toHex( $input );
+		$this->assertTrue( $result === false || is_string( $result ) );
+		$this->assertEquals( $expected, $result );
+	}
+
+	/**
+	 * Provider for IP::testToHex()
+	 */
+	public static function provideToHex() {
+		return array(
+			array( '00000001', '0.0.0.1' ),
+			array( '01020304', '1.2.3.4' ),
+			array( '7F000001', '127.0.0.1' ),
+			array( '80000000', '128.0.0.0' ),
+			array( 'DEADCAFE', '222.173.202.254' ),
+			array( 'FFFFFFFF', '255.255.255.255' ),
+			array( false, 'IN.VA.LI.D' ),
+			array( 'v6-00000000000000000000000000000001', '::1' ),
+			array( 'v6-20010DB885A3000000008A2E03707334', '2001:0db8:85a3:0000:0000:8a2e:0370:7334' ),
+			array( 'v6-20010DB885A3000000008A2E03707334', '2001:db8:85a3::8a2e:0370:7334' ),
+			array( false, 'IN:VA::LI:D' ),
+			array( false, ':::1' )
+		);
 	}
 
 	/**
@@ -338,7 +392,7 @@ class IPTest extends MediaWikiTestCase {
 	 * representing the network mask and the bit mask.
 	 * @covers IP::parseCIDR
 	 */
-	function testCIDRParsing() {
+	public function testCIDRParsing() {
 		$this->assertFalseCIDR( '192.0.2.0', "missing mask" );
 		$this->assertFalseCIDR( '192.0.2.0/', "missing bitmask" );
 
@@ -435,7 +489,7 @@ class IPTest extends MediaWikiTestCase {
 	 * Test for IP::splitHostAndPort().
 	 * @dataProvider provideSplitHostAndPort
 	 */
-	function testSplitHostAndPort( $expected, $input, $description ) {
+	public function testSplitHostAndPort( $expected, $input, $description ) {
 		$this->assertEquals( $expected, IP::splitHostAndPort( $input ), $description );
 	}
 
@@ -462,7 +516,7 @@ class IPTest extends MediaWikiTestCase {
 	 * Test for IP::combineHostAndPort()
 	 * @dataProvider provideCombineHostAndPort
 	 */
-	function testCombineHostAndPort( $expected, $input, $description ) {
+	public function testCombineHostAndPort( $expected, $input, $description ) {
 		list( $host, $port, $defaultPort ) = $input;
 		$this->assertEquals(
 			$expected,
@@ -486,7 +540,7 @@ class IPTest extends MediaWikiTestCase {
 	 * Test for IP::sanitizeRange()
 	 * @dataProvider provideIPCIDRs
 	 */
-	function testSanitizeRange( $input, $expected, $description ) {
+	public function testSanitizeRange( $input, $expected, $description ) {
 		$this->assertEquals( $expected, IP::sanitizeRange( $input ), $description );
 	}
 
@@ -510,7 +564,7 @@ class IPTest extends MediaWikiTestCase {
 	 * Test for IP::prettifyIP()
 	 * @dataProvider provideIPsToPrettify
 	 */
-	function testPrettifyIP( $ip, $prettified ) {
+	public function testPrettifyIP( $ip, $prettified ) {
 		$this->assertEquals( $prettified, IP::prettifyIP( $ip ), "Prettify of $ip" );
 	}
 
diff --git a/tests/phpunit/includes/JsonTest.php b/tests/phpunit/includes/JsonTest.php
deleted file mode 100644
index 96a2ead5..00000000
--- a/tests/phpunit/includes/JsonTest.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-class JsonTest extends MediaWikiTestCase {
-
-	function testPhpBug46944Test() {
-		$this->assertNotEquals(
-			'\ud840\udc00',
-			strtolower( FormatJson::encode( "\xf0\xa0\x80\x80" ) ),
-			'Test encoding an broken json_encode character (U+20000)'
-		);
-
-	}
-
-	function testDecodeVarTypes() {
-		$this->assertInternalType(
-			'object',
-			FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}' ),
-			'Default to object'
-		);
-
-		$this->assertInternalType(
-			'array',
-			FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}', true ),
-			'Optional array'
-		);
-	}
-}
diff --git a/tests/phpunit/includes/LanguageConverterTest.php b/tests/phpunit/includes/LanguageConverterTest.php
index d4d93b07..7c2134b9 100644
--- a/tests/phpunit/includes/LanguageConverterTest.php
+++ b/tests/phpunit/includes/LanguageConverterTest.php
@@ -30,39 +30,39 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
 		parent::tearDown();
 	}
 
-	function testGetPreferredVariantDefaults() {
+	public function testGetPreferredVariantDefaults() {
 		$this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
 	}
 
-	function testGetPreferredVariantHeaders() {
+	public function testGetPreferredVariantHeaders() {
 		global $wgRequest;
 		$wgRequest->setHeader( 'Accept-Language', 'tg-latn' );
 
 		$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
 	}
 
-	function testGetPreferredVariantHeaderWeight() {
+	public function testGetPreferredVariantHeaderWeight() {
 		global $wgRequest;
 		$wgRequest->setHeader( 'Accept-Language', 'tg;q=1' );
 
 		$this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
 	}
 
-	function testGetPreferredVariantHeaderWeight2() {
+	public function testGetPreferredVariantHeaderWeight2() {
 		global $wgRequest;
 		$wgRequest->setHeader( 'Accept-Language', 'tg-latn;q=1' );
 
 		$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
 	}
 
-	function testGetPreferredVariantHeaderMulti() {
+	public function testGetPreferredVariantHeaderMulti() {
 		global $wgRequest;
 		$wgRequest->setHeader( 'Accept-Language', 'en, tg-latn;q=1' );
 
 		$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
 	}
 
-	function testGetPreferredVariantUserOption() {
+	public function testGetPreferredVariantUserOption() {
 		global $wgUser;
 
 		$wgUser = new User;
@@ -75,7 +75,21 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
 		$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
 	}
 
-	function testGetPreferredVariantHeaderUserVsUrl() {
+	public function testGetPreferredVariantUserOptionForForeignLanguage() {
+		global $wgContLang, $wgUser;
+
+		$wgContLang = Language::factory( 'en' );
+		$wgUser = new User;
+		$wgUser->load(); // from 'defaults'
+		$wgUser->mId = 1;
+		$wgUser->mDataLoaded = true;
+		$wgUser->mOptionsLoaded = true;
+		$wgUser->setOption( 'variant-tg', 'tg-latn' );
+
+		$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
+	}
+
+	public function testGetPreferredVariantHeaderUserVsUrl() {
 		global $wgContLang, $wgRequest, $wgUser;
 
 		$wgContLang = Language::factory( 'tg-latn' );
@@ -85,19 +99,19 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
 		$wgUser->mFrom = 'defaults';
 		$wgUser->mOptionsLoaded = true;
 		// The user's data is ignored because the variant is set in the URL.
-		$wgUser->setOption( 'variant', 'tg-latn' ); 
+		$wgUser->setOption( 'variant', 'tg-latn' );
 		$this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
 	}
 
 
-	function testGetPreferredVariantDefaultLanguageVariant() {
+	public function testGetPreferredVariantDefaultLanguageVariant() {
 		global $wgDefaultLanguageVariant;
 
 		$wgDefaultLanguageVariant = 'tg-latn';
 		$this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() );
 	}
 
-	function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
+	public function testGetPreferredVariantDefaultLanguageVsUrlVariant() {
 		global $wgDefaultLanguageVariant, $wgRequest, $wgContLang;
 
 		$wgContLang = Language::factory( 'tg-latn' );
@@ -123,7 +137,6 @@ class TestConverter extends LanguageConverter {
 			'tg' => new ReplacementArray()
 		);
 	}
-
 }
 
 class LanguageToTest extends Language {
diff --git a/tests/phpunit/includes/LicensesTest.php b/tests/phpunit/includes/LicensesTest.php
index 212b3b3b..478a2ffc 100644
--- a/tests/phpunit/includes/LicensesTest.php
+++ b/tests/phpunit/includes/LicensesTest.php
@@ -2,7 +2,7 @@
 
 class LicensesTest extends MediaWikiTestCase {
 
-	function testLicenses() {
+	public function testLicenses() {
 		$str = "
 * Free licenses:
 ** GFDL|Debian disagrees
diff --git a/tests/phpunit/includes/LinkerTest.php b/tests/phpunit/includes/LinkerTest.php
index e353c46c..b605f08f 100644
--- a/tests/phpunit/includes/LinkerTest.php
+++ b/tests/phpunit/includes/LinkerTest.php
@@ -6,7 +6,7 @@ class LinkerTest extends MediaWikiLangTestCase {
 	 * @dataProvider provideCasesForUserLink
 	 * @covers Linker::userLink
 	 */
-	function testUserLink( $expected, $userId, $userName, $altUserName = false, $msg = '' ) {
+	public function testUserLink( $expected, $userId, $userName, $altUserName = false, $msg = '' ) {
 		$this->setMwGlobals( array(
 			'wgArticlePath' => '/wiki/$1',
 			'wgWellFormedXml' => true,
@@ -17,7 +17,7 @@ class LinkerTest extends MediaWikiLangTestCase {
 		);
 	}
 
-	function provideCasesForUserLink() {
+	public static function provideCasesForUserLink() {
 		# Format:
 		# - expected
 		# - userid
diff --git a/tests/phpunit/includes/LinksUpdateTest.php b/tests/phpunit/includes/LinksUpdateTest.php
index a79b3a25..5ade250e 100644
--- a/tests/phpunit/includes/LinksUpdateTest.php
+++ b/tests/phpunit/includes/LinksUpdateTest.php
@@ -7,7 +7,7 @@
  */
 class LinksUpdateTest extends MediaWikiTestCase {
 
-	function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+	function __construct( $name = null, array $data = array(), $dataName = '' ) {
 		parent::__construct( $name, $data, $dataName );
 
 		$this->tablesUsed = array_merge( $this->tablesUsed,
@@ -60,18 +60,30 @@ class LinksUpdateTest extends MediaWikiTestCase {
 		$po->addLink( Title::newFromText( "linksupdatetest:Foo" ) ); // interwiki link should be ignored
 		$po->addLink( Title::newFromText( "#Foo" ) ); // hash link should be ignored
 
-		$this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
+		$update = $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
 			array( NS_MAIN, 'Foo' ),
 		) );
+		$this->assertArrayEquals( array(
+			Title::makeTitle( NS_MAIN, 'Foo' ),  // newFromText doesn't yield the same internal state....
+		), $update->getAddedLinks() );
 
 		$po = new ParserOutput();
 		$po->setTitleText( $t->getPrefixedText() );
 
 		$po->addLink( Title::newFromText( "Bar" ) );
+		$po->addLink( Title::newFromText( "Talk:Bar" ) );
 
-		$this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
+		$update = $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
 			array( NS_MAIN, 'Bar' ),
+			array( NS_TALK, 'Bar' ),
 		) );
+		$this->assertArrayEquals( array(
+			Title::makeTitle( NS_MAIN, 'Bar' ),
+			Title::makeTitle( NS_TALK, 'Bar' ),
+		), $update->getAddedLinks() );
+		$this->assertArrayEquals( array(
+			Title::makeTitle( NS_MAIN, 'Foo' ),
+		), $update->getRemovedLinks() );
 	}
 
 	public function testUpdate_externallinks() {
@@ -122,7 +134,6 @@ class LinksUpdateTest extends MediaWikiTestCase {
 
 		$po->addImage( "Foo.png" );
 
-
 		$this->assertLinksUpdate( $t, $po, 'imagelinks', 'il_to', 'il_from = 111', array(
 			array( 'Foo.png' ),
 		) );
@@ -133,7 +144,6 @@ class LinksUpdateTest extends MediaWikiTestCase {
 
 		$po->addLanguageLink( Title::newFromText( "en:Foo" )->getFullText() );
 
-
 		$this->assertLinksUpdate( $t, $po, 'langlinks', 'll_lang, ll_title', 'll_from = 111', array(
 			array( 'En', 'Foo' ),
 		) );
@@ -149,7 +159,7 @@ class LinksUpdateTest extends MediaWikiTestCase {
 		) );
 	}
 
-	#@todo: test recursive, too!
+	// @todo test recursive, too!
 
 	protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput, $table, $fields, $condition, array $expectedRows ) {
 		$update = new LinksUpdate( $title, $parserOutput );
@@ -160,5 +170,6 @@ class LinksUpdateTest extends MediaWikiTestCase {
 		$update->commitTransaction();
 
 		$this->assertSelect( $table, $fields, $condition, $expectedRows );
+		return $update;
 	}
 }
diff --git a/tests/phpunit/includes/LocalFileTest.php b/tests/phpunit/includes/LocalFileTest.php
index d6f0d2ee..2501c783 100644
--- a/tests/phpunit/includes/LocalFileTest.php
+++ b/tests/phpunit/includes/LocalFileTest.php
@@ -35,72 +35,72 @@ class LocalFileTest extends MediaWikiTestCase {
 		$this->file_lc = $this->repo_lc->newFile( 'test!' );
 	}
 
-	function testGetHashPath() {
+	public function testGetHashPath() {
 		$this->assertEquals( '', $this->file_hl0->getHashPath() );
 		$this->assertEquals( 'a/a2/', $this->file_hl2->getHashPath() );
 		$this->assertEquals( 'c/c4/', $this->file_lc->getHashPath() );
 	}
 
-	function testGetRel() {
+	public function testGetRel() {
 		$this->assertEquals( 'Test!', $this->file_hl0->getRel() );
 		$this->assertEquals( 'a/a2/Test!', $this->file_hl2->getRel() );
 		$this->assertEquals( 'c/c4/test!', $this->file_lc->getRel() );
 	}
 
-	function testGetUrlRel() {
+	public function testGetUrlRel() {
 		$this->assertEquals( 'Test%21', $this->file_hl0->getUrlRel() );
 		$this->assertEquals( 'a/a2/Test%21', $this->file_hl2->getUrlRel() );
 		$this->assertEquals( 'c/c4/test%21', $this->file_lc->getUrlRel() );
 	}
 
-	function testGetArchivePath() {
+	public function testGetArchivePath() {
 		$this->assertEquals( 'mwstore://local-backend/test-public/archive', $this->file_hl0->getArchivePath() );
 		$this->assertEquals( 'mwstore://local-backend/test-public/archive/a/a2', $this->file_hl2->getArchivePath() );
 		$this->assertEquals( 'mwstore://local-backend/test-public/archive/!', $this->file_hl0->getArchivePath( '!' ) );
 		$this->assertEquals( 'mwstore://local-backend/test-public/archive/a/a2/!', $this->file_hl2->getArchivePath( '!' ) );
 	}
 
-	function testGetThumbPath() {
+	public function testGetThumbPath() {
 		$this->assertEquals( 'mwstore://local-backend/test-thumb/Test!', $this->file_hl0->getThumbPath() );
 		$this->assertEquals( 'mwstore://local-backend/test-thumb/a/a2/Test!', $this->file_hl2->getThumbPath() );
 		$this->assertEquals( 'mwstore://local-backend/test-thumb/Test!/x', $this->file_hl0->getThumbPath( 'x' ) );
 		$this->assertEquals( 'mwstore://local-backend/test-thumb/a/a2/Test!/x', $this->file_hl2->getThumbPath( 'x' ) );
 	}
 
-	function testGetArchiveUrl() {
+	public function testGetArchiveUrl() {
 		$this->assertEquals( '/testurl/archive', $this->file_hl0->getArchiveUrl() );
 		$this->assertEquals( '/testurl/archive/a/a2', $this->file_hl2->getArchiveUrl() );
 		$this->assertEquals( '/testurl/archive/%21', $this->file_hl0->getArchiveUrl( '!' ) );
 		$this->assertEquals( '/testurl/archive/a/a2/%21', $this->file_hl2->getArchiveUrl( '!' ) );
 	}
 
-	function testGetThumbUrl() {
+	public function testGetThumbUrl() {
 		$this->assertEquals( '/testurl/thumb/Test%21', $this->file_hl0->getThumbUrl() );
 		$this->assertEquals( '/testurl/thumb/a/a2/Test%21', $this->file_hl2->getThumbUrl() );
 		$this->assertEquals( '/testurl/thumb/Test%21/x', $this->file_hl0->getThumbUrl( 'x' ) );
 		$this->assertEquals( '/testurl/thumb/a/a2/Test%21/x', $this->file_hl2->getThumbUrl( 'x' ) );
 	}
 
-	function testGetArchiveVirtualUrl() {
+	public function testGetArchiveVirtualUrl() {
 		$this->assertEquals( 'mwrepo://test/public/archive', $this->file_hl0->getArchiveVirtualUrl() );
 		$this->assertEquals( 'mwrepo://test/public/archive/a/a2', $this->file_hl2->getArchiveVirtualUrl() );
 		$this->assertEquals( 'mwrepo://test/public/archive/%21', $this->file_hl0->getArchiveVirtualUrl( '!' ) );
 		$this->assertEquals( 'mwrepo://test/public/archive/a/a2/%21', $this->file_hl2->getArchiveVirtualUrl( '!' ) );
 	}
 
-	function testGetThumbVirtualUrl() {
+	public function testGetThumbVirtualUrl() {
 		$this->assertEquals( 'mwrepo://test/thumb/Test%21', $this->file_hl0->getThumbVirtualUrl() );
 		$this->assertEquals( 'mwrepo://test/thumb/a/a2/Test%21', $this->file_hl2->getThumbVirtualUrl() );
 		$this->assertEquals( 'mwrepo://test/thumb/Test%21/%21', $this->file_hl0->getThumbVirtualUrl( '!' ) );
 		$this->assertEquals( 'mwrepo://test/thumb/a/a2/Test%21/%21', $this->file_hl2->getThumbVirtualUrl( '!' ) );
 	}
 
-	function testGetUrl() {
+	public function testGetUrl() {
 		$this->assertEquals( '/testurl/Test%21', $this->file_hl0->getUrl() );
 		$this->assertEquals( '/testurl/a/a2/Test%21', $this->file_hl2->getUrl() );
 	}
 
-	function testWfLocalFile() {
+	public function testWfLocalFile() {
 		$file = wfLocalFile( "File:Some_file_that_probably_doesn't exist.png" );
 		$this->assertThat( $file, $this->isInstanceOf( 'LocalFile' ), 'wfLocalFile() returns LocalFile for valid Titles' );
 	}
diff --git a/tests/phpunit/includes/MWExceptionHandlerTest.php b/tests/phpunit/includes/MWExceptionHandlerTest.php
new file mode 100644
index 00000000..987dfa83
--- /dev/null
+++ b/tests/phpunit/includes/MWExceptionHandlerTest.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Tests for includes/Exception.php.
+ *
+ * @author Antoine Musso
+ * @copyright Copyright © 2013, Antoine Musso
+ * @copyright Copyright © 2013, Wikimedia Foundation Inc.
+ * @file
+ */
+
+class MWExceptionHandlerTest extends MediaWikiTestCase {
+
+	/**
+	 * @covers MWExceptionHandler::getRedactedTrace
+	 */
+	function testGetRedactedTrace() {
+		try {
+			$array = array( 'a', 'b' );
+			$object = new StdClass();
+			self::helperThrowAnException( $array, $object );
+		} catch (Exception $e) {
+		}
+
+		# Make sure our strack trace contains an array and an object passed to
+		# some function in the stacktrace. Else, we can not assert the trace
+		# redaction achieved its job.
+		$trace = $e->getTrace();
+		$hasObject = false;
+		$hasArray = false;
+		foreach ( $trace as $frame ) {
+			if ( ! isset( $frame['args'] ) ) {
+				continue;
+			}
+			foreach ( $frame['args'] as $arg ) {
+				$hasObject = $hasObject || is_object( $arg );
+				$hasArray = $hasArray || is_array( $arg );
+			}
+
+			if( $hasObject && $hasArray ) {
+				break;
+			}
+		}
+		$this->assertTrue( $hasObject,
+			"The stacktrace must have a function having an object has parameter" );
+		$this->assertTrue( $hasArray,
+			"The stacktrace must have a function having an array has parameter" );
+
+		# Now we redact the trace.. and make sure no function arguments are
+		# arrays or objects.
+		$redacted = MWExceptionHandler::getRedactedTrace( $e );
+
+		foreach ( $redacted as $frame ) {
+			if ( ! isset( $frame['args'] ) ) {
+				continue;
+			}
+			foreach ( $frame['args'] as $arg ) {
+				$this->assertNotInternalType( 'array', $arg);
+				$this->assertNotInternalType( 'object', $arg);
+			}
+		}
+	}
+
+	/**
+	 * Helper function for testExpandArgumentsInCall
+	 *
+	 * Pass it an object and an array :-)
+	 *
+	 * @throws Exception
+	 */
+	protected static function helperThrowAnException( $a, $b ) {
+		throw new Exception();
+	}
+}
diff --git a/tests/phpunit/includes/MWFunctionTest.php b/tests/phpunit/includes/MWFunctionTest.php
index 6c17bf48..d86f2c9b 100644
--- a/tests/phpunit/includes/MWFunctionTest.php
+++ b/tests/phpunit/includes/MWFunctionTest.php
@@ -1,27 +1,7 @@
 <?php
 
 class MWFunctionTest extends MediaWikiTestCase {
-	function testCallUserFuncWorkarounds() {
-		$this->assertEquals(
-			call_user_func( array( 'MWFunctionTest', 'someMethod' ) ),
-			MWFunction::call( 'MWFunctionTest::someMethod' )
-		);
-		$this->assertEquals(
-			call_user_func( array( 'MWFunctionTest', 'someMethod' ), 'foo', 'bar', 'baz' ),
-			MWFunction::call( 'MWFunctionTest::someMethod', 'foo', 'bar', 'baz' )
-		);
-
-		$this->assertEquals(
-			call_user_func_array( array( 'MWFunctionTest', 'someMethod' ), array() ),
-			MWFunction::callArray( 'MWFunctionTest::someMethod', array() )
-		);
-		$this->assertEquals(
-			call_user_func_array( array( 'MWFunctionTest', 'someMethod' ), array( 'foo', 'bar', 'baz' ) ),
-			MWFunction::callArray( 'MWFunctionTest::someMethod', array( 'foo', 'bar', 'baz' ) )
-		);
-	}
-
-	function testNewObjFunction() {
+	public function testNewObjFunction() {
 		$arg1 = 'Foo';
 		$arg2 = 'Bar';
 		$arg3 = array( 'Baz' );
@@ -34,32 +14,7 @@ class MWFunctionTest extends MediaWikiTestCase {
 			MWFunction::newObj( 'MWBlankClass', $args )->args,
 			$newObject->args
 		);
-
-		$this->assertEquals(
-			MWFunction::newObj( 'MWBlankClass', $args, true )->args,
-			$newObject->args,
-			'Works even with PHP version < 5.1.3'
-		);
-	}
-
-	/**
-	 * @expectedException MWException
-	 */
-	function testCallingParentFails() {
-		MWFunction::call( 'parent::foo' );
 	}
-
-	/**
-	 * @expectedException MWException
-	 */
-	function testCallingSelfFails() {
-		MWFunction::call( 'self::foo' );
-	}
-
-	public static function someMethod() {
-		return func_get_args();
-	}
-
 }
 
 class MWBlankClass {
diff --git a/tests/phpunit/includes/MWNamespaceTest.php b/tests/phpunit/includes/MWNamespaceTest.php
index 45f8dafc..10e9db61 100644
--- a/tests/phpunit/includes/MWNamespaceTest.php
+++ b/tests/phpunit/includes/MWNamespaceTest.php
@@ -125,7 +125,6 @@ class MWNamespaceTest extends MediaWikiTestCase {
 	public function testGetAssociated() {
 		$this->assertEquals( NS_TALK, MWNamespace::getAssociated( NS_MAIN ) );
 		$this->assertEquals( NS_MAIN, MWNamespace::getAssociated( NS_TALK ) );
-
 	}
 
 	### Exceptions with getAssociated()
@@ -201,7 +200,6 @@ class MWNamespaceTest extends MediaWikiTestCase {
 			NS_SPECIAL, NS_MEDIA,
 			"NS_SPECIAL and NS_MEDIA are different subject namespaces"
 		);
-
 	}
 
 	/**
@@ -346,33 +344,32 @@ class MWNamespaceTest extends MediaWikiTestCase {
 
 		$this->assertEquals(
 			array( NS_MAIN ),
-			MWNamespace::getcontentNamespaces(),
+			MWNamespace::getContentNamespaces(),
 			'$wgContentNamespaces is an array with only NS_MAIN by default'
 		);
 
-
 		# test !is_array( $wgcontentNamespaces )
 		$wgContentNamespaces = '';
-		$this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+		$this->assertEquals( array( NS_MAIN ), MWNamespace::getContentNamespaces() );
 
 		$wgContentNamespaces = false;
-		$this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+		$this->assertEquals( array( NS_MAIN ), MWNamespace::getContentNamespaces() );
 
 		$wgContentNamespaces = null;
-		$this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+		$this->assertEquals( array( NS_MAIN ), MWNamespace::getContentNamespaces() );
 
 		$wgContentNamespaces = 5;
-		$this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+		$this->assertEquals( array( NS_MAIN ), MWNamespace::getContentNamespaces() );
 
 		# test $wgContentNamespaces === array()
 		$wgContentNamespaces = array();
-		$this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+		$this->assertEquals( array( NS_MAIN ), MWNamespace::getContentNamespaces() );
 
 		# test !in_array( NS_MAIN, $wgContentNamespaces )
 		$wgContentNamespaces = array( NS_USER, NS_CATEGORY );
 		$this->assertEquals(
 			array( NS_MAIN, NS_USER, NS_CATEGORY ),
-			MWNamespace::getcontentNamespaces(),
+			MWNamespace::getContentNamespaces(),
 			'NS_MAIN is forced in $wgContentNamespaces even if unwanted'
 		);
 
@@ -380,13 +377,13 @@ class MWNamespaceTest extends MediaWikiTestCase {
 		$wgContentNamespaces = array( NS_MAIN );
 		$this->assertEquals(
 			array( NS_MAIN ),
-			MWNamespace::getcontentNamespaces()
+			MWNamespace::getContentNamespaces()
 		);
 
 		$wgContentNamespaces = array( NS_MAIN, NS_USER, NS_CATEGORY );
 		$this->assertEquals(
 			array( NS_MAIN, NS_USER, NS_CATEGORY ),
-			MWNamespace::getcontentNamespaces()
+			MWNamespace::getContentNamespaces()
 		);
 	}
 
diff --git a/tests/phpunit/includes/MessageTest.php b/tests/phpunit/includes/MessageTest.php
index c378bb8e..1e18f975 100644
--- a/tests/phpunit/includes/MessageTest.php
+++ b/tests/phpunit/includes/MessageTest.php
@@ -10,7 +10,7 @@ class MessageTest extends MediaWikiLangTestCase {
 		) );
 	}
 
-	function testExists() {
+	public function testExists() {
 		$this->assertTrue( wfMessage( 'mainpage' )->exists() );
 		$this->assertTrue( wfMessage( 'mainpage' )->params( array() )->exists() );
 		$this->assertTrue( wfMessage( 'mainpage' )->rawParams( 'foo', 123 )->exists() );
@@ -19,7 +19,7 @@ class MessageTest extends MediaWikiLangTestCase {
 		$this->assertFalse( wfMessage( 'i-dont-exist-evar' )->rawParams( 'foo', 123 )->exists() );
 	}
 
-	function testKey() {
+	public function testKey() {
 		$this->assertInstanceOf( 'Message', wfMessage( 'mainpage' ) );
 		$this->assertInstanceOf( 'Message', wfMessage( 'i-dont-exist-evar' ) );
 		$this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->text() );
@@ -28,47 +28,103 @@ class MessageTest extends MediaWikiLangTestCase {
 		$this->assertEquals( '&lt;i-dont-exist-evar&gt;', wfMessage( 'i-dont-exist-evar' )->escaped() );
 	}
 
-	function testInLanguage() {
+	public function testInLanguage() {
 		$this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inLanguage( 'en' )->text() );
 		$this->assertEquals( 'Заглавная страница', wfMessage( 'mainpage' )->inLanguage( 'ru' )->text() );
 		$this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inLanguage( Language::factory( 'en' ) )->text() );
 		$this->assertEquals( 'Заглавная страница', wfMessage( 'mainpage' )->inLanguage( Language::factory( 'ru' ) )->text() );
 	}
 
-	function testMessageParams() {
+	public function testMessageParams() {
 		$this->assertEquals( 'Return to $1.', wfMessage( 'returnto' )->text() );
 		$this->assertEquals( 'Return to $1.', wfMessage( 'returnto', array() )->text() );
 		$this->assertEquals( 'You have foo (bar).', wfMessage( 'youhavenewmessages', 'foo', 'bar' )->text() );
 		$this->assertEquals( 'You have foo (bar).', wfMessage( 'youhavenewmessages', array( 'foo', 'bar' ) )->text() );
 	}
 
-	function testMessageParamSubstitution() {
+	public function testMessageParamSubstitution() {
 		$this->assertEquals( '(Заглавная страница)', wfMessage( 'parentheses', 'Заглавная страница' )->plain() );
 		$this->assertEquals( '(Заглавная страница $1)', wfMessage( 'parentheses', 'Заглавная страница $1' )->plain() );
 		$this->assertEquals( '(Заглавная страница)', wfMessage( 'parentheses' )->rawParams( 'Заглавная страница' )->plain() );
 		$this->assertEquals( '(Заглавная страница $1)', wfMessage( 'parentheses' )->rawParams( 'Заглавная страница $1' )->plain() );
 	}
 
-	function testDeliciouslyManyParams() {
+	public function testDeliciouslyManyParams() {
 		$msg = new RawMessage( '$1$2$3$4$5$6$7$8$9$10$11$12' );
 		// One less than above has placeholders
 		$params = array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k' );
 		$this->assertEquals( 'abcdefghijka2', $msg->params( $params )->plain(), 'Params > 9 are replaced correctly' );
 	}
 
-	function testInContentLanguage() {
-		global $wgLang, $wgForceUIMsgAsContentMsg;
-		$wgLang = Language::factory( 'fr' );
+	/**
+	 * FIXME: This should not need database, but Language#formatExpiry does (bug 55912)
+	 * @group Database
+	 */
+	public function testMessageParamTypes() {
+		$lang = Language::factory( 'en' );
+
+		$msg = new RawMessage( '$1' );
+		$this->assertEquals(
+			$lang->formatNum( 123456.789 ),
+			$msg->inLanguage( $lang )->numParams( 123456.789 )->plain(),
+			'numParams is handled correctly'
+		);
+
+		$msg = new RawMessage( '$1' );
+		$this->assertEquals(
+			$lang->formatDuration( 1234 ),
+			$msg->inLanguage( $lang )->durationParams( 1234 )->plain(),
+			'durationParams is handled correctly'
+		);
+
+		$msg = new RawMessage( '$1' );
+		$this->assertEquals(
+			$lang->formatExpiry( wfTimestampNow() ),
+			$msg->inLanguage( $lang )->expiryParams( wfTimestampNow() )->plain(),
+			'expiryParams is handled correctly'
+		);
+
+		$msg = new RawMessage( '$1' );
+		$this->assertEquals(
+			$lang->formatTimePeriod( 1234 ),
+			$msg->inLanguage( $lang )->timeperiodParams( 1234 )->plain(),
+			'timeperiodParams is handled correctly'
+		);
+
+		$msg = new RawMessage( '$1' );
+		$this->assertEquals(
+			$lang->formatSize( 123456 ),
+			$msg->inLanguage( $lang )->sizeParams( 123456 )->plain(),
+			'sizeParams is handled correctly'
+		);
+
+		$msg = new RawMessage( '$1' );
+		$this->assertEquals(
+			$lang->formatBitrate( 123456 ),
+			$msg->inLanguage( $lang )->bitrateParams( 123456 )->plain(),
+			'bitrateParams is handled correctly'
+		);
+	}
+
+	public function testInContentLanguageDisabled() {
+		$this->setMwGlobals( 'wgLang', Language::factory( 'fr' ) );
 
 		$this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg disabled' );
-		$wgForceUIMsgAsContentMsg['testInContentLanguage'] = 'mainpage';
+	}
+
+	public function testInContentLanguageEnabled() {
+		$this->setMwGlobals( array(
+			'wgLang' => Language::factory( 'fr' ),
+			'wgForceUIMsgAsContentMsg' => array( 'mainpage' ),
+		) );
+
 		$this->assertEquals( 'Accueil', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg enabled' );
 	}
 
 	/**
 	 * @expectedException MWException
 	 */
-	function testInLanguageThrows() {
+	public function testInLanguageThrows() {
 		wfMessage( 'foo' )->inLanguage( 123 );
 	}
 }
diff --git a/tests/phpunit/includes/OutputPageTest.php b/tests/phpunit/includes/OutputPageTest.php
index 4084fb17..56bb0fce 100644
--- a/tests/phpunit/includes/OutputPageTest.php
+++ b/tests/phpunit/includes/OutputPageTest.php
@@ -19,7 +19,6 @@ class OutputPageTest extends MediaWikiTestCase {
 	 *
 	 * options['printableQuery'] - value of query string for printable, or omitted for none
 	 * options['handheldQuery'] - value of query string for handheld, or omitted for none
-	 * options['handheldForIPhone'] - value of the $wgHandheldForIPhone global
 	 * options['media'] - passed into the method under the same name
 	 * options['expectedReturn'] - expected return value
 	 * options['message'] - PHPUnit message for assertion
@@ -39,58 +38,38 @@ class OutputPageTest extends MediaWikiTestCase {
 		$fauxRequest = new FauxRequest( $queryData, false );
 		$this->setMWGlobals( array(
 			'wgRequest' => $fauxRequest,
-			'wgHandheldForIPhone' => $args['handheldForIPhone']
 		) );
 
 		$actualReturn = OutputPage::transformCssMedia( $args['media'] );
 		$this->assertSame( $args['expectedReturn'], $actualReturn, $args['message'] );
 	}
 
-	/**
-	 * Tests a case of transformCssMedia with both values of wgHandheldForIPhone.
-	 * Used to verify that behavior is orthogonal to that option.
-	 *
-	 * If the value of wgHandheldForIPhone should matter, use assertTransformCssMediaCase.
-	 *
-	 * @param array $args key-value array of arguments as shown in assertTransformCssMediaCase.
-	 * Will be mutated.
-	 */
-	protected function assertTransformCssMediaCaseWithBothHandheldForIPhone( $args ) {
-		$message = $args['message'];
-		foreach ( array( true, false ) as $handheldForIPhone ) {
-			$args['handheldForIPhone'] = $handheldForIPhone;
-			$stringHandheldForIPhone = var_export( $handheldForIPhone, true );
-			$args['message'] = "$message. \$wgHandheldForIPhone was $stringHandheldForIPhone";
-			$this->assertTransformCssMediaCase( $args );
-		}
-	}
-
 	/**
 	 * Tests print requests
 	 */
 	public function testPrintRequests() {
-		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+		$this->assertTransformCssMediaCase( array(
 			'printableQuery' => '1',
 			'media' => 'screen',
 			'expectedReturn' => null,
 			'message' => 'On printable request, screen returns null'
 		) );
 
-		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+		$this->assertTransformCssMediaCase( array(
 			'printableQuery' => '1',
 			'media' => self::SCREEN_MEDIA_QUERY,
 			'expectedReturn' => null,
 			'message' => 'On printable request, screen media query returns null'
 		) );
 
-		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+		$this->assertTransformCssMediaCase( array(
 			'printableQuery' => '1',
 			'media' => self::SCREEN_ONLY_MEDIA_QUERY,
 			'expectedReturn' => null,
 			'message' => 'On printable request, screen media query with only returns null'
 		) );
 
-		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+		$this->assertTransformCssMediaCase( array(
 			'printableQuery' => '1',
 			'media' => 'print',
 			'expectedReturn' => '',
@@ -103,25 +82,30 @@ class OutputPageTest extends MediaWikiTestCase {
 	 */
 	public function testScreenRequests() {
 		$this->assertTransformCssMediaCase( array(
-			'handheldForIPhone' => false,
 			'media' => 'screen',
 			'expectedReturn' => 'screen',
-			'message' => 'On screen request, with handheldForIPhone false, screen media type is preserved'
+			'message' => 'On screen request, screen media type is preserved'
+		) );
+
+		$this->assertTransformCssMediaCase( array(
+			'media' => 'handheld',
+			'expectedReturn' => 'handheld',
+			'message' => 'On screen request, handheld media type is preserved'
 		) );
 
-		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+		$this->assertTransformCssMediaCase( array(
 			'media' => self::SCREEN_MEDIA_QUERY,
 			'expectedReturn' => self::SCREEN_MEDIA_QUERY,
 			'message' => 'On screen request, screen media query is preserved.'
 		) );
 
-		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+		$this->assertTransformCssMediaCase( array(
 			'media' => self::SCREEN_ONLY_MEDIA_QUERY,
 			'expectedReturn' => self::SCREEN_ONLY_MEDIA_QUERY,
 			'message' => 'On screen request, screen media query with only is preserved.'
 		) );
 
-		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+		$this->assertTransformCssMediaCase( array(
 			'media' => 'print',
 			'expectedReturn' => 'print',
 			'message' => 'On screen request, print media type is preserved'
@@ -129,44 +113,21 @@ class OutputPageTest extends MediaWikiTestCase {
 	}
 
 	/**
-	 * Tests handheld and wgHandheldForIPhone behavior
+	 * Tests handheld behavior
 	 */
 	public function testHandheld() {
-		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+		$this->assertTransformCssMediaCase( array(
 			'handheldQuery' => '1',
 			'media' => 'handheld',
 			'expectedReturn' => '',
 			'message' => 'On request with handheld querystring and media is handheld, returns empty string'
 		) );
 
-		$this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+		$this->assertTransformCssMediaCase( array(
 			'handheldQuery' => '1',
 			'media' => 'screen',
 			'expectedReturn' => null,
 			'message' => 'On request with handheld querystring and media is screen, returns null'
 		) );
-
-		// A bit counter-intuitively, $wgHandheldForIPhone should only matter if the query handheld is false or omitted
-		$this->assertTransformCssMediaCase( array(
-			'handheldQuery' => '0',
-			'media' => 'screen',
-			'handheldForIPhone' => true,
-			'expectedReturn' => 'screen and (min-device-width: 481px)',
-			'message' => 'With $wgHandheldForIPhone true, screen media type is transformed'
-		) );
-
-		$this->assertTransformCssMediaCase( array(
-			'media' => 'handheld',
-			'handheldForIPhone' => true,
-			'expectedReturn' => 'handheld, only screen and (max-device-width: 480px)',
-			'message' => 'With $wgHandheldForIPhone true, handheld media type is transformed'
-		) );
-
-		$this->assertTransformCssMediaCase( array(
-			'media' => 'handheld',
-			'handheldForIPhone' => false,
-			'expectedReturn' => 'handheld',
-			'message' => 'With $wgHandheldForIPhone false, handheld media type is preserved'
-		) );
 	}
 }
diff --git a/tests/phpunit/includes/PathRouterTest.php b/tests/phpunit/includes/PathRouterTest.php
index 22591873..adfb215a 100644
--- a/tests/phpunit/includes/PathRouterTest.php
+++ b/tests/phpunit/includes/PathRouterTest.php
@@ -1,10 +1,17 @@
 <?php
 /**
- * Tests for the PathRouter parsing
+ * Tests for the PathRouter parsing.
+ *
+ * @todo Add covers tags.
  */
 
 class PathRouterTest extends MediaWikiTestCase {
 
+	/**
+	 * @var PathRouter
+	 */
+	protected $basicRouter;
+
 	protected function setUp() {
 		parent::setUp();
 		$router = new PathRouter;
@@ -151,18 +158,20 @@ class PathRouterTest extends MediaWikiTestCase {
 		$router->add( array( 'qwerty' => "/qwerty/$1" ), array( 'qwerty' => '$key' ) );
 		$router->add( "/$2/$1", array( 'restricted-to-y' => '$2' ), array( '$2' => 'y' ) );
 
-		foreach ( array(
-					'/Foo' => array( 'title' => 'Foo' ),
-					'/Bar' => array( 'ping' => 'pong' ),
-					'/Baz' => array( 'marco' => 'polo' ),
-					'/asdf-foo' => array( 'title' => 'qwerty-foo' ),
-					'/qwerty-bar' => array( 'title' => 'asdf-bar' ),
-					'/a/Foo' => array( 'title' => 'Foo' ),
-					'/asdf/Foo' => array( 'title' => 'Foo' ),
-					'/qwerty/Foo' => array( 'title' => 'Foo', 'qwerty' => 'qwerty' ),
-					'/baz/Foo' => array( 'title' => 'Foo', 'unrestricted' => 'baz' ),
-					'/y/Foo' => array( 'title' => 'Foo', 'restricted-to-y' => 'y' ),
-				) as $path => $result ) {
+		foreach (
+			array(
+				'/Foo' => array( 'title' => 'Foo' ),
+				'/Bar' => array( 'ping' => 'pong' ),
+				'/Baz' => array( 'marco' => 'polo' ),
+				'/asdf-foo' => array( 'title' => 'qwerty-foo' ),
+				'/qwerty-bar' => array( 'title' => 'asdf-bar' ),
+				'/a/Foo' => array( 'title' => 'Foo' ),
+				'/asdf/Foo' => array( 'title' => 'Foo' ),
+				'/qwerty/Foo' => array( 'title' => 'Foo', 'qwerty' => 'qwerty' ),
+				'/baz/Foo' => array( 'title' => 'Foo', 'unrestricted' => 'baz' ),
+				'/y/Foo' => array( 'title' => 'Foo', 'restricted-to-y' => 'y' ),
+			) as $path => $result
+		) {
 			$this->assertEquals( $router->parse( $path ), $result );
 		}
 	}
@@ -251,5 +260,4 @@ class PathRouterTest extends MediaWikiTestCase {
 		$matches = $router->parse( "/wiki/Foo" );
 		$this->assertEquals( $matches, array( 'title' => 'bar%20$1' ) );
 	}
-
 }
diff --git a/tests/phpunit/includes/PreferencesTest.php b/tests/phpunit/includes/PreferencesTest.php
index 7aa3c4a4..3dec2da0 100644
--- a/tests/phpunit/includes/PreferencesTest.php
+++ b/tests/phpunit/includes/PreferencesTest.php
@@ -4,11 +4,16 @@
  * @group Database
  */
 class PreferencesTest extends MediaWikiTestCase {
-	/** Array of User objects */
+	/**
+	 * @var User[]
+	 */
 	private $prefUsers;
+	/**
+	 * @var RequestContext
+	 */
 	private $context;
 
-	function __construct() {
+	public function __construct() {
 		parent::__construct();
 
 		$this->prefUsers['noemail'] = new User;
@@ -30,14 +35,17 @@ class PreferencesTest extends MediaWikiTestCase {
 	protected function setUp() {
 		parent::setUp();
 
-		$this->setMwGlobals( 'wgEnableEmail', true );
+		$this->setMwGlobals( array(
+			'wgEnableEmail' => true,
+			'wgEmailAuthentication' => true,
+		) );
 	}
 
 	/**
 	 * Placeholder to verify bug 34302
 	 * @covers Preferences::profilePreferences
 	 */
-	function testEmailFieldsWhenUserHasNoEmail() {
+	public function testEmailFieldsWhenUserHasNoEmail() {
 		$prefs = $this->prefsFor( 'noemail' );
 		$this->assertArrayHasKey( 'cssclass',
 			$prefs['emailaddress']
@@ -49,7 +57,7 @@ class PreferencesTest extends MediaWikiTestCase {
 	 * Placeholder to verify bug 34302
 	 * @covers Preferences::profilePreferences
 	 */
-	function testEmailFieldsWhenUserEmailNotAuthenticated() {
+	public function testEmailFieldsWhenUserEmailNotAuthenticated() {
 		$prefs = $this->prefsFor( 'notauth' );
 		$this->assertArrayHasKey( 'cssclass',
 			$prefs['emailaddress']
@@ -61,7 +69,7 @@ class PreferencesTest extends MediaWikiTestCase {
 	 * Placeholder to verify bug 34302
 	 * @covers Preferences::profilePreferences
 	 */
-	function testEmailFieldsWhenUserEmailIsAuthenticated() {
+	public function testEmailFieldsWhenUserEmailIsAuthenticated() {
 		$prefs = $this->prefsFor( 'auth' );
 		$this->assertArrayHasKey( 'cssclass',
 			$prefs['emailaddress']
@@ -70,13 +78,14 @@ class PreferencesTest extends MediaWikiTestCase {
 	}
 
 	/** Helper */
-	function prefsFor( $user_key ) {
+	protected function prefsFor( $user_key ) {
 		$preferences = array();
 		Preferences::profilePreferences(
 			$this->prefUsers[$user_key]
 			, $this->context
 			, $preferences
 		);
+
 		return $preferences;
 	}
 }
diff --git a/tests/phpunit/includes/Providers.php b/tests/phpunit/includes/Providers.php
deleted file mode 100644
index 948b6354..00000000
--- a/tests/phpunit/includes/Providers.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Generic providers for the MediaWiki PHPUnit test suite
- *
- * @author Antoine Musso
- * @copyright Copyright © 2011, Antoine Musso
- * @file
- */
-
-/** */
-class MediaWikiProvide {
-
-	/* provide an array of numbers from 1 up to @param $num */
-	private static function createProviderUpTo( $num ) {
-		$ret = array();
-		for ( $i = 1; $i <= $num; $i++ ) {
-			$ret[] = array( $i );
-		}
-		return $ret;
-	}
-
-	/* array of months numbers (as an integer) */
-	public static function Months() {
-		return self::createProviderUpTo( 12 );
-	}
-
-	/* array of days numbers (as an integer) */
-	public static function Days() {
-		return self::createProviderUpTo( 31 );
-	}
-
-	public static function DaysMonths() {
-		$ret = array();
-
-		$months = self::Months();
-		$days = self::Days();
-		foreach ( $months as $month ) {
-			foreach ( $days as $day ) {
-				$ret[] = array( $day[0], $month[0] );
-			}
-		}
-		return $ret;
-	}
-}
diff --git a/tests/phpunit/includes/RecentChangeTest.php b/tests/phpunit/includes/RecentChangeTest.php
index a1e62363..cfa3e777 100644
--- a/tests/phpunit/includes/RecentChangeTest.php
+++ b/tests/phpunit/includes/RecentChangeTest.php
@@ -9,7 +9,7 @@ class RecentChangeTest extends MediaWikiTestCase {
 	protected $user_comment;
 	protected $context;
 
-	function __construct() {
+	public function __construct() {
 		parent::__construct();
 
 		$this->title = Title::newFromText( 'SomeTitle' );
@@ -56,7 +56,7 @@ class RecentChangeTest extends MediaWikiTestCase {
 	/**
 	 * @covers LogFormatter::getIRCActionText
 	 */
-	function testIrcMsgForLogTypeBlock() {
+	public function testIrcMsgForLogTypeBlock() {
 		$sep = $this->context->msg( 'colon-separator' )->text();
 
 		# block/block
@@ -78,7 +78,7 @@ class RecentChangeTest extends MediaWikiTestCase {
 	/**
 	 * @covers LogFormatter::getIRCActionText
 	 */
-	function testIrcMsgForLogTypeDelete() {
+	public function testIrcMsgForLogTypeDelete() {
 		$sep = $this->context->msg( 'colon-separator' )->text();
 
 		# delete/delete
@@ -101,7 +101,7 @@ class RecentChangeTest extends MediaWikiTestCase {
 	/**
 	 * @covers LogFormatter::getIRCActionText
 	 */
-	function testIrcMsgForLogTypeNewusers() {
+	public function testIrcMsgForLogTypeNewusers() {
 		$this->assertIRCComment(
 			'New user account',
 			'newusers', 'newusers',
@@ -127,7 +127,7 @@ class RecentChangeTest extends MediaWikiTestCase {
 	/**
 	 * @covers LogFormatter::getIRCActionText
 	 */
-	function testIrcMsgForLogTypeMove() {
+	public function testIrcMsgForLogTypeMove() {
 		$move_params = array(
 			'4::target' => $this->target->getPrefixedText(),
 			'5::noredir' => 0,
@@ -154,7 +154,7 @@ class RecentChangeTest extends MediaWikiTestCase {
 	/**
 	 * @covers LogFormatter::getIRCActionText
 	 */
-	function testIrcMsgForLogTypePatrol() {
+	public function testIrcMsgForLogTypePatrol() {
 		# patrol/patrol
 		$this->assertIRCComment(
 			$this->context->msg( 'patrol-log-line', 'revision 777', '[[SomeTitle]]', '' )->plain(),
@@ -170,7 +170,7 @@ class RecentChangeTest extends MediaWikiTestCase {
 	/**
 	 * @covers LogFormatter::getIRCActionText
 	 */
-	function testIrcMsgForLogTypeProtect() {
+	public function testIrcMsgForLogTypeProtect() {
 		$protectParams = array(
 			'[edit=sysop] (indefinite) ‎[move=sysop] (indefinite)'
 		);
@@ -204,7 +204,7 @@ class RecentChangeTest extends MediaWikiTestCase {
 	/**
 	 * @covers LogFormatter::getIRCActionText
 	 */
-	function testIrcMsgForLogTypeUpload() {
+	public function testIrcMsgForLogTypeUpload() {
 		$sep = $this->context->msg( 'colon-separator' )->text();
 
 		# upload/upload
@@ -225,24 +225,24 @@ class RecentChangeTest extends MediaWikiTestCase {
 	}
 
 	/**
-	 * @todo: Emulate these edits somehow and extract
+	 * @todo Emulate these edits somehow and extract
 	 * raw edit summary from RecentChange object
 	 * --
 	 */
 	/*
-	function testIrcMsgForBlankingAES() {
+	public function testIrcMsgForBlankingAES() {
 		// $this->context->msg( 'autosumm-blank', .. );
 	}
 
-	function testIrcMsgForReplaceAES() {
+	public function testIrcMsgForReplaceAES() {
 		// $this->context->msg( 'autosumm-replace', .. );
 	}
 
-	function testIrcMsgForRollbackAES() {
+	public function testIrcMsgForRollbackAES() {
 		// $this->context->msg( 'revertpage', .. );
 	}
 
-	function testIrcMsgForUndoAES() {
+	public function testIrcMsgForUndoAES() {
 		// $this->context->msg( 'undo-summary', .. );
 	}
 	*/
@@ -251,10 +251,11 @@ class RecentChangeTest extends MediaWikiTestCase {
 	 * @param $expected String Expected IRC text without colors codes
 	 * @param $type String Log type (move, delete, suppress, patrol ...)
 	 * @param $action String A log type action
+	 * @param $params
 	 * @param $comment String (optional) A comment for the log action
 	 * @param $msg String (optional) A message for PHPUnit :-)
 	 */
-	function assertIRCComment( $expected, $type, $action, $params, $comment = null, $msg = '' ) {
+	protected function assertIRCComment( $expected, $type, $action, $params, $comment = null, $msg = '' ) {
 
 		$logEntry = new ManualLogEntry( $type, $action );
 		$logEntry->setPerformer( $this->user );
@@ -267,8 +268,8 @@ class RecentChangeTest extends MediaWikiTestCase {
 		$formatter = LogFormatter::newFromEntry( $logEntry );
 		$formatter->setContext( $this->context );
 
-		// Apply the same transformation as done in RecentChange::getIRCLine for rc_comment
-		$ircRcComment = RecentChange::cleanupForIRC( $formatter->getIRCActionComment() );
+		// Apply the same transformation as done in IRCColourfulRCFeedFormatter::getLine for rc_comment
+		$ircRcComment = IRCColourfulRCFeedFormatter::cleanupForIRC( $formatter->getIRCActionComment() );
 
 		$this->assertEquals(
 			$expected,
@@ -276,5 +277,4 @@ class RecentChangeTest extends MediaWikiTestCase {
 			$msg
 		);
 	}
-
 }
diff --git a/tests/phpunit/includes/RequestContextTest.php b/tests/phpunit/includes/RequestContextTest.php
index f5871716..1776b5d5 100644
--- a/tests/phpunit/includes/RequestContextTest.php
+++ b/tests/phpunit/includes/RequestContextTest.php
@@ -7,6 +7,8 @@ class RequestContextTest extends MediaWikiTestCase {
 
 	/**
 	 * Test the relationship between title and wikipage in RequestContext
+	 * @covers RequestContext::getWikiPage
+	 * @covers RequestContext::getTitle
 	 */
 	public function testWikiPageTitle() {
 		$context = new RequestContext();
@@ -25,9 +27,11 @@ class RequestContextTest extends MediaWikiTestCase {
 		$context->setTitle( $curTitle );
 		$this->assertTrue( $curTitle->equals( $context->getWikiPage()->getTitle() ),
 			"When a title is updated the WikiPage should be purged and recreated on-demand with the new title." );
-
 	}
 
+	/**
+	 * @covers RequestContext::importScopedSession
+	 */
 	public function testImportScopedSession() {
 		$context = RequestContext::getMain();
 
@@ -58,7 +62,7 @@ class RequestContextTest extends MediaWikiTestCase {
 		$this->assertEquals( $sinfo['userId'], $context->getUser()->getId(), "Correct context user ID." );
 		$this->assertEquals( 'UnitTestContextUser', $context->getUser()->getName(), "Correct context user name." );
 
-		unset ( $sc ); // restore previous context
+		unset( $sc ); // restore previous context
 
 		$info = $context->exportSession();
 		$this->assertEquals( $oInfo['ip'], $info['ip'], "Correct initial IP address." );
diff --git a/tests/phpunit/includes/ResourceLoaderTest.php b/tests/phpunit/includes/ResourceLoaderTest.php
index 60618b10..ca8b2b6e 100644
--- a/tests/phpunit/includes/ResourceLoaderTest.php
+++ b/tests/phpunit/includes/ResourceLoaderTest.php
@@ -4,6 +4,32 @@ class ResourceLoaderTest extends MediaWikiTestCase {
 
 	protected static $resourceLoaderRegisterModulesHook;
 
+	protected function setUp() {
+		parent::setUp();
+
+		// $wgResourceLoaderLESSFunctions, $wgResourceLoaderLESSImportPaths; $wgResourceLoaderLESSVars;
+
+		$this->setMwGlobals( array(
+			'wgResourceLoaderLESSFunctions' => array(
+				'test-sum' => function ( $frame, $less ) {
+					$sum = 0;
+					foreach ( $frame[2] as $arg ) {
+						$sum += (int)$arg[1];
+					}
+					return $sum;
+				},
+			),
+			'wgResourceLoaderLESSImportPaths' => array(
+				dirname( __DIR__ ) . '/data/less/common',
+			),
+			'wgResourceLoaderLESSVars' => array(
+				'foo'  => '2px',
+				'Foo' => '#eeeeee',
+				'bar' => 5,
+			),
+		) );
+	}
+
 	/* Hook Methods */
 
 	/**
@@ -11,6 +37,7 @@ class ResourceLoaderTest extends MediaWikiTestCase {
 	 */
 	public static function resourceLoaderRegisterModules( &$resourceLoader ) {
 		self::$resourceLoaderRegisterModulesHook = true;
+
 		return true;
 	}
 
@@ -21,6 +48,14 @@ class ResourceLoaderTest extends MediaWikiTestCase {
 		);
 	}
 
+	public static function provideResourceLoaderContext() {
+		$resourceLoader = new ResourceLoader();
+		$request = new FauxRequest();
+		return array(
+			array( new ResourceLoaderContext( $resourceLoader, $request ) ),
+		);
+	}
+
 	/* Test Methods */
 
 	/**
@@ -31,6 +66,7 @@ class ResourceLoaderTest extends MediaWikiTestCase {
 		self::$resourceLoaderRegisterModulesHook = false;
 		$resourceLoader = new ResourceLoader();
 		$this->assertTrue( self::$resourceLoaderRegisterModulesHook );
+
 		return $resourceLoader;
 	}
 
@@ -47,8 +83,23 @@ class ResourceLoaderTest extends MediaWikiTestCase {
 		$this->assertEquals( $module, $resourceLoader->getModule( $name ) );
 	}
 
+	/**
+	 * @dataProvider provideResourceLoaderContext
+	 * @covers ResourceLoaderFileModule::compileLessFile
+	 */
+	public function testLessFileCompilation( $context ) {
+		$basePath = __DIR__ . '/../data/less/module';
+		$module = new ResourceLoaderFileModule( array(
+			'localBasePath' => $basePath,
+			'styles' => array( 'styles.less' ),
+		) );
+		$styles = $module->getStyles( $context );
+		$this->assertStringEqualsFile( $basePath . '/styles.css', $styles['all'] );
+	}
+
 	/**
 	 * @dataProvider providePackedModules
+	 * @covers ResourceLoader::makePackedModulesString
 	 */
 	public function testMakePackedModulesString( $desc, $modules, $packed ) {
 		$this->assertEquals( $packed, ResourceLoader::makePackedModulesString( $modules ), $desc );
@@ -56,6 +107,7 @@ class ResourceLoaderTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider providePackedModules
+	 * @covers ResourceLoaderContext::expandModuleNames
 	 */
 	public function testexpandModuleNames( $desc, $modules, $packed ) {
 		$this->assertEquals( $modules, ResourceLoaderContext::expandModuleNames( $packed ), $desc );
@@ -77,14 +129,20 @@ class ResourceLoaderTest extends MediaWikiTestCase {
 				'Regression fixed in r88706 with dotless names',
 				array( 'foo', 'bar', 'baz' ),
 				'foo,bar,baz',
-			)
+			),
+			array(
+				'Prefixless modules after a prefixed module',
+				array( 'single.module', 'foobar', 'foobaz' ),
+				'single.module|foobar,foobaz',
+			),
 		);
 	}
 }
 
 /* Stubs */
 
-class ResourceLoaderTestModule extends ResourceLoaderModule {}
+class ResourceLoaderTestModule extends ResourceLoaderModule {
+}
 
 /* Hooks */
 global $wgHooks;
diff --git a/tests/phpunit/includes/RevisionStorageTest.php b/tests/phpunit/includes/RevisionStorageTest.php
index e8d8db0a..e17c7b0f 100644
--- a/tests/phpunit/includes/RevisionStorageTest.php
+++ b/tests/phpunit/includes/RevisionStorageTest.php
@@ -17,7 +17,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
 	 */
 	var $the_page;
 
-	function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+	function __construct( $name = null, array $data = array(), $dataName = '' ) {
 		parent::__construct( $name, $data, $dataName );
 
 		$this->tablesUsed = array_merge( $this->tablesUsed,
@@ -38,7 +38,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
 				'iwlinks' ) );
 	}
 
-	public function setUp() {
+	protected function setUp() {
 		global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
 
 		parent::setUp();
@@ -365,7 +365,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
 		$page = $this->createPage( 'RevisionStorageTest_testIsCurrent', 'Lorem Ipsum', CONTENT_MODEL_WIKITEXT );
 		$rev1 = $page->getRevision();
 
-		# @todo: find out if this should be true
+		# @todo find out if this should be true
 		# $this->assertTrue( $rev1->isCurrent() );
 
 		$rev1x = Revision::newFromId( $rev1->getId() );
@@ -374,7 +374,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
 		$page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 'second rev' );
 		$rev2 = $page->getRevision();
 
-		# @todo: find out if this should be true
+		# @todo find out if this should be true
 		# $this->assertTrue( $rev2->isCurrent() );
 
 		$rev1x = Revision::newFromId( $rev1->getId() );
@@ -456,15 +456,15 @@ class RevisionStorageTest extends MediaWikiTestCase {
 	 * @dataProvider provideUserWasLastToEdit
 	 */
 	public function testUserWasLastToEdit( $sinceIdx, $expectedLast ) {
-		$userA = \User::newFromName( "RevisionStorageTest_userA" );
-		$userB = \User::newFromName( "RevisionStorageTest_userB" );
+		$userA = User::newFromName( "RevisionStorageTest_userA" );
+		$userB = User::newFromName( "RevisionStorageTest_userB" );
 
 		if ( $userA->getId() === 0 ) {
-			$userA = \User::createNew( $userA->getName() );
+			$userA = User::createNew( $userA->getName() );
 		}
 
 		if ( $userB->getId() === 0 ) {
-			$userB = \User::createNew( $userB->getName() );
+			$userB = User::createNew( $userB->getName() );
 		}
 
 		$ns = $this->getDefaultWikitextNS();
diff --git a/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php b/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
index 3948e345..4e83e355 100644
--- a/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
+++ b/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
@@ -6,14 +6,9 @@
  * ^--- important, causes temporary tables to be used instead of the real database
  */
 class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
-	var $saveContentHandlerNoDB = null;
 
-	function setUp() {
-		global $wgContentHandlerUseDB;
-
-		$this->saveContentHandlerNoDB = $wgContentHandlerUseDB;
-
-		$wgContentHandlerUseDB = false;
+	protected function setUp() {
+		$this->setMwGlobals( 'wgContentHandlerUseDB', false );
 
 		$dbw = wfGetDB( DB_MASTER );
 
@@ -32,14 +27,6 @@ class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
 		parent::setUp();
 	}
 
-	function tearDown() {
-		global $wgContentHandlerUseDB;
-
-		parent::tearDown();
-
-		$wgContentHandlerUseDB = $this->saveContentHandlerNoDB;
-	}
-
 	/**
 	 * @covers Revision::selectFields
 	 */
@@ -76,7 +63,7 @@ class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
 	 */
 	public function testGetContentFormat() {
 		try {
-			//@todo: change this to test failure on using a non-standard (but supported) format
+			// @todo change this to test failure on using a non-standard (but supported) format
 			//       for a content model supported in the given location. As of 1.21, there are
 			//       no alternative formats for any of the standard content models that could be
 			//       used for this though.
@@ -91,5 +78,4 @@ class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
 			$this->assertTrue( true ); // ok
 		}
 	}
-
 }
diff --git a/tests/phpunit/includes/RevisionTest.php b/tests/phpunit/includes/RevisionTest.php
index db0245b9..b5819ff6 100644
--- a/tests/phpunit/includes/RevisionTest.php
+++ b/tests/phpunit/includes/RevisionTest.php
@@ -54,7 +54,10 @@ class RevisionTest extends MediaWikiTestCase {
 		parent::tearDown();
 	}
 
-	function testGetRevisionText() {
+	/**
+	 * @covers Revision::getRevisionText
+	 */
+	public function testGetRevisionText() {
 		$row = new stdClass;
 		$row->old_flags = '';
 		$row->old_text = 'This is a bunch of revision text.';
@@ -63,7 +66,10 @@ class RevisionTest extends MediaWikiTestCase {
 			Revision::getRevisionText( $row ) );
 	}
 
-	function testGetRevisionTextGzip() {
+	/**
+	 * @covers Revision::getRevisionText
+	 */
+	public function testGetRevisionTextGzip() {
 		$this->checkPHPExtension( 'zlib' );
 
 		$row = new stdClass;
@@ -74,7 +80,10 @@ class RevisionTest extends MediaWikiTestCase {
 			Revision::getRevisionText( $row ) );
 	}
 
-	function testGetRevisionTextUtf8Native() {
+	/**
+	 * @covers Revision::getRevisionText
+	 */
+	public function testGetRevisionTextUtf8Native() {
 		$row = new stdClass;
 		$row->old_flags = 'utf-8';
 		$row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
@@ -84,7 +93,10 @@ class RevisionTest extends MediaWikiTestCase {
 			Revision::getRevisionText( $row ) );
 	}
 
-	function testGetRevisionTextUtf8Legacy() {
+	/**
+	 * @covers Revision::getRevisionText
+	 */
+	public function testGetRevisionTextUtf8Legacy() {
 		$row = new stdClass;
 		$row->old_flags = '';
 		$row->old_text = "Wiki est l'\xe9cole superieur !";
@@ -94,7 +106,10 @@ class RevisionTest extends MediaWikiTestCase {
 			Revision::getRevisionText( $row ) );
 	}
 
-	function testGetRevisionTextUtf8NativeGzip() {
+	/**
+	 * @covers Revision::getRevisionText
+	 */
+	public function testGetRevisionTextUtf8NativeGzip() {
 		$this->checkPHPExtension( 'zlib' );
 
 		$row = new stdClass;
@@ -106,7 +121,10 @@ class RevisionTest extends MediaWikiTestCase {
 			Revision::getRevisionText( $row ) );
 	}
 
-	function testGetRevisionTextUtf8LegacyGzip() {
+	/**
+	 * @covers Revision::getRevisionText
+	 */
+	public function testGetRevisionTextUtf8LegacyGzip() {
 		$this->checkPHPExtension( 'zlib' );
 
 		$row = new stdClass;
@@ -118,7 +136,10 @@ class RevisionTest extends MediaWikiTestCase {
 			Revision::getRevisionText( $row ) );
 	}
 
-	function testCompressRevisionTextUtf8() {
+	/**
+	 * @covers Revision::compressRevisionText
+	 */
+	public function testCompressRevisionTextUtf8() {
 		$row = new stdClass;
 		$row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
 		$row->old_flags = Revision::compressRevisionText( $row->old_text );
@@ -132,11 +153,12 @@ class RevisionTest extends MediaWikiTestCase {
 			Revision::getRevisionText( $row ), "getRevisionText" );
 	}
 
-	function testCompressRevisionTextUtf8Gzip() {
+	/**
+	 * @covers Revision::compressRevisionText
+	 */
+	public function testCompressRevisionTextUtf8Gzip() {
 		$this->checkPHPExtension( 'zlib' );
-
-		global $wgCompressRevisions;
-		$wgCompressRevisions = true;
+		$this->setMwGlobals( 'wgCompressRevisions', true );
 
 		$row = new stdClass;
 		$row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
@@ -157,6 +179,8 @@ class RevisionTest extends MediaWikiTestCase {
 	 * @param string $text
 	 * @param string $title
 	 * @param string $model
+	 * @param null $format
+	 *
 	 * @return Revision
 	 */
 	function newTestRevision( $text, $title = "Test", $model = CONTENT_MODEL_WIKITEXT, $format = null ) {
@@ -196,8 +220,9 @@ class RevisionTest extends MediaWikiTestCase {
 	/**
 	 * @group Database
 	 * @dataProvider dataGetContentModel
+	 * @covers Revision::getContentModel
 	 */
-	function testGetContentModel( $text, $title, $model, $format, $expectedModel ) {
+	public function testGetContentModel( $text, $title, $model, $format, $expectedModel ) {
 		$rev = $this->newTestRevision( $text, $title, $model, $format );
 
 		$this->assertEquals( $expectedModel, $rev->getContentModel() );
@@ -216,8 +241,9 @@ class RevisionTest extends MediaWikiTestCase {
 	/**
 	 * @group Database
 	 * @dataProvider dataGetContentFormat
+	 * @covers Revision::getContentFormat
 	 */
-	function testGetContentFormat( $text, $title, $model, $format, $expectedFormat ) {
+	public function testGetContentFormat( $text, $title, $model, $format, $expectedFormat ) {
 		$rev = $this->newTestRevision( $text, $title, $model, $format );
 
 		$this->assertEquals( $expectedFormat, $rev->getContentFormat() );
@@ -235,8 +261,9 @@ class RevisionTest extends MediaWikiTestCase {
 	/**
 	 * @group Database
 	 * @dataProvider dataGetContentHandler
+	 * @covers Revision::getContentHandler
 	 */
-	function testGetContentHandler( $text, $title, $model, $format, $expectedClass ) {
+	public function testGetContentHandler( $text, $title, $model, $format, $expectedClass ) {
 		$rev = $this->newTestRevision( $text, $title, $model, $format );
 
 		$this->assertEquals( $expectedClass, get_class( $rev->getContentHandler() ) );
@@ -254,8 +281,9 @@ class RevisionTest extends MediaWikiTestCase {
 	/**
 	 * @group Database
 	 * @dataProvider dataGetContent
+	 * @covers Revision::getContent
 	 */
-	function testGetContent( $text, $title, $model, $format, $audience, $expectedSerialization ) {
+	public function testGetContent( $text, $title, $model, $format, $audience, $expectedSerialization ) {
 		$rev = $this->newTestRevision( $text, $title, $model, $format );
 		$content = $rev->getContent( $audience );
 
@@ -274,8 +302,9 @@ class RevisionTest extends MediaWikiTestCase {
 	/**
 	 * @group Database
 	 * @dataProvider dataGetText
+	 * @covers Revision::getText
 	 */
-	function testGetText( $text, $title, $model, $format, $audience, $expectedText ) {
+	public function testGetText( $text, $title, $model, $format, $audience, $expectedText ) {
 		$this->hideDeprecated( 'Revision::getText' );
 
 		$rev = $this->newTestRevision( $text, $title, $model, $format );
@@ -286,8 +315,9 @@ class RevisionTest extends MediaWikiTestCase {
 	/**
 	 * @group Database
 	 * @dataProvider dataGetText
+	 * @covers Revision::getRawText
 	 */
-	function testGetRawText( $text, $title, $model, $format, $audience, $expectedText ) {
+	public function testGetRawText( $text, $title, $model, $format, $audience, $expectedText ) {
 		$this->hideDeprecated( 'Revision::getRawText' );
 
 		$rev = $this->newTestRevision( $text, $title, $model, $format );
@@ -330,6 +360,9 @@ class RevisionTest extends MediaWikiTestCase {
 		$this->assertEquals( $expected_hash, $rev->getSha1() );
 	}
 
+	/**
+	 * @covers Revision::__construct
+	 */
 	public function testConstructWithText() {
 		$this->hideDeprecated( "Revision::getText" );
 
@@ -344,6 +377,9 @@ class RevisionTest extends MediaWikiTestCase {
 		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
 	}
 
+	/**
+	 * @covers Revision::__construct
+	 */
 	public function testConstructWithContent() {
 		$this->hideDeprecated( "Revision::getText" );
 
@@ -363,8 +399,9 @@ class RevisionTest extends MediaWikiTestCase {
 	 * Tests whether $rev->getContent() returns a clone when needed.
 	 *
 	 * @group Database
+	 * @covers Revision::getContent
 	 */
-	function testGetContentClone() {
+	public function testGetContentClone() {
 		$content = new RevisionTestModifyableContent( "foo" );
 
 		$rev = new Revision(
@@ -396,8 +433,9 @@ class RevisionTest extends MediaWikiTestCase {
 	 * Tests whether $rev->getContent() returns the same object repeatedly if appropriate.
 	 *
 	 * @group Database
+	 * @covers Revision::getContent
 	 */
-	function testGetContentUncloned() {
+	public function testGetContentUncloned() {
 		$rev = $this->newTestRevision( "hello", "testGetContentUncloned_dummy", CONTENT_MODEL_WIKITEXT );
 		$content = $rev->getContent( Revision::RAW );
 		$content2 = $rev->getContent( Revision::RAW );
@@ -405,7 +443,6 @@ class RevisionTest extends MediaWikiTestCase {
 		// for immutable content like wikitext, this should be the same object
 		$this->assertSame( $content, $content2 );
 	}
-
 }
 
 class RevisionTestModifyableContent extends TextContent {
@@ -424,7 +461,6 @@ class RevisionTestModifyableContent extends TextContent {
 	public function setText( $text ) {
 		$this->mText = $text;
 	}
-
 }
 
 class RevisionTestModifyableContentHandler extends TextContentHandler {
diff --git a/tests/phpunit/includes/SampleTest.php b/tests/phpunit/includes/SampleTest.php
index 8a881915..8516a4ce 100644
--- a/tests/phpunit/includes/SampleTest.php
+++ b/tests/phpunit/includes/SampleTest.php
@@ -33,7 +33,7 @@ class TestSample extends MediaWikiLangTestCase {
 	 * "Agile Documentation" at
 	 * http://www.phpunit.de/manual/3.4/en/other-uses-for-tests.html
 	 */
-	function testTitleObjectStringConversion() {
+	public function testTitleObjectStringConversion() {
 		$title = Title::newFromText( "text" );
 		$this->assertInstanceOf( 'Title', $title, "Title creation" );
 		$this->assertEquals( "Text", $title, "Automatic string conversion" );
@@ -98,7 +98,7 @@ class TestSample extends MediaWikiLangTestCase {
 	 * @expectedException MWException object
 	 * See http://www.phpunit.de/manual/3.4/en/appendixes.annotations.html#appendixes.annotations.expectedException
 	 */
-	function testTitleObjectFromObject() {
+	public function testTitleObjectFromObject() {
 		$title = Title::newFromText( Title::newFromText( "test" ) );
 		$this->assertEquals( "Test", $title->isLocal() );
 	}
diff --git a/tests/phpunit/includes/SanitizerTest.php b/tests/phpunit/includes/SanitizerTest.php
index c0ed4a59..81246d33 100644
--- a/tests/phpunit/includes/SanitizerTest.php
+++ b/tests/phpunit/includes/SanitizerTest.php
@@ -1,5 +1,9 @@
 <?php
 
+/**
+ * @todo Tests covering decodeCharReferences can be refactored into a single
+ * method and dataprovider.
+ */
 class SanitizerTest extends MediaWikiTestCase {
 
 	protected function setUp() {
@@ -8,7 +12,10 @@ class SanitizerTest extends MediaWikiTestCase {
 		AutoLoader::loadClass( 'Sanitizer' );
 	}
 
-	function testDecodeNamedEntities() {
+	/**
+	 * @covers Sanitizer::decodeCharReferences
+	 */
+	public function testDecodeNamedEntities() {
 		$this->assertEquals(
 			"\xc3\xa9cole",
 			Sanitizer::decodeCharReferences( '&eacute;cole' ),
@@ -16,7 +23,10 @@ class SanitizerTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testDecodeNumericEntities() {
+	/**
+	 * @covers Sanitizer::decodeCharReferences
+	 */
+	public function testDecodeNumericEntities() {
 		$this->assertEquals(
 			"\xc4\x88io bonas dans l'\xc3\xa9cole!",
 			Sanitizer::decodeCharReferences( "&#x108;io bonas dans l'&#233;cole!" ),
@@ -24,7 +34,10 @@ class SanitizerTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testDecodeMixedEntities() {
+	/**
+	 * @covers Sanitizer::decodeCharReferences
+	 */
+	public function testDecodeMixedEntities() {
 		$this->assertEquals(
 			"\xc4\x88io bonas dans l'\xc3\xa9cole!",
 			Sanitizer::decodeCharReferences( "&#x108;io bonas dans l'&eacute;cole!" ),
@@ -32,7 +45,10 @@ class SanitizerTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testDecodeMixedComplexEntities() {
+	/**
+	 * @covers Sanitizer::decodeCharReferences
+	 */
+	public function testDecodeMixedComplexEntities() {
 		$this->assertEquals(
 			"\xc4\x88io bonas dans l'\xc3\xa9cole! (mais pas &#x108;io dans l'&eacute;cole)",
 			Sanitizer::decodeCharReferences(
@@ -42,7 +58,10 @@ class SanitizerTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testInvalidAmpersand() {
+	/**
+	 * @covers Sanitizer::decodeCharReferences
+	 */
+	public function testInvalidAmpersand() {
 		$this->assertEquals(
 			'a & b',
 			Sanitizer::decodeCharReferences( 'a & b' ),
@@ -50,7 +69,10 @@ class SanitizerTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testInvalidEntities() {
+	/**
+	 * @covers Sanitizer::decodeCharReferences
+	 */
+	public function testInvalidEntities() {
 		$this->assertEquals(
 			'&foo;',
 			Sanitizer::decodeCharReferences( '&foo;' ),
@@ -58,7 +80,10 @@ class SanitizerTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testInvalidNumberedEntities() {
+	/**
+	 * @covers Sanitizer::decodeCharReferences
+	 */
+	public function testInvalidNumberedEntities() {
 		$this->assertEquals( UTF8_REPLACEMENT, Sanitizer::decodeCharReferences( "&#88888888888888;" ), 'Invalid numbered entity' );
 	}
 
@@ -69,10 +94,8 @@ class SanitizerTest extends MediaWikiTestCase {
 	 * @param String $tag Name of an HTML5 element (ie: 'video')
 	 * @param Boolean $escaped Wheter sanitizer let the tag in or escape it (ie: '&lt;video&gt;')
 	 */
-	function testRemovehtmltagsOnHtml5Tags( $tag, $escaped ) {
+	public function testRemovehtmltagsOnHtml5Tags( $tag, $escaped ) {
 		$this->setMwGlobals( array(
-			# Enable HTML5 mode
-			'wgHtml5' => true,
 			'wgUseTidy' => false
 		) );
 
@@ -90,7 +113,7 @@ class SanitizerTest extends MediaWikiTestCase {
 	/**
 	 * Provide HTML5 tags
 	 */
-	function provideHtml5Tags() {
+	public static function provideHtml5Tags() {
 		$ESCAPED = true; # We want tag to be escaped
 		$VERBATIM = false; # We want to keep the tag
 		return array(
@@ -101,31 +124,57 @@ class SanitizerTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testSelfClosingTag() {
-		$this->setMwGlobals( array(
-			'wgUseTidy' => false
-		) );
-
-		$this->assertEquals(
-			'<div>Hello world</div>',
-			Sanitizer::removeHTMLtags( '<div>Hello world</div />' ),
-			'Self-closing closing div'
+	function dataRemoveHTMLtags() {
+		return array(
+			// former testSelfClosingTag
+			array(
+				'<div>Hello world</div />',
+				'<div>Hello world</div>',
+				'Self-closing closing div'
+			),
+			// Make sure special nested HTML5 semantics are not broken
+			// http://www.whatwg.org/html/text-level-semantics.html#the-kbd-element
+			array(
+				'<kbd><kbd>Shift</kbd>+<kbd>F3</kbd></kbd>',
+				'<kbd><kbd>Shift</kbd>+<kbd>F3</kbd></kbd>',
+				'Nested <kbd>.'
+			),
+			// http://www.whatwg.org/html/text-level-semantics.html#the-sub-and-sup-elements
+			array(
+				'<var>x<sub><var>i</var></sub></var>, <var>y<sub><var>i</var></sub></var>',
+				'<var>x<sub><var>i</var></sub></var>, <var>y<sub><var>i</var></sub></var>',
+				'Nested <var>.'
+			),
+			// http://www.whatwg.org/html/text-level-semantics.html#the-dfn-element
+			array(
+				'<dfn><abbr title="Garage Door Opener">GDO</abbr></dfn>',
+				'<dfn><abbr title="Garage Door Opener">GDO</abbr></dfn>',
+				'<abbr> inside <dfn>',
+			),
 		);
 	}
 
+	/**
+	 * @dataProvider dataRemoveHTMLtags
+	 * @covers Sanitizer::removeHTMLtags
+	 */
+	public function testRemoveHTMLtags( $input, $output, $msg = null ) {
+		$GLOBALS['wgUseTidy'] = false;
+		$this->assertEquals( $output, Sanitizer::removeHTMLtags( $input ), $msg );
+	}
 
 	/**
 	 * @dataProvider provideTagAttributesToDecode
 	 * @covers Sanitizer::decodeTagAttributes
 	 */
-	function testDecodeTagAttributes( $expected, $attributes, $message = '' ) {
+	public function testDecodeTagAttributes( $expected, $attributes, $message = '' ) {
 		$this->assertEquals( $expected,
 			Sanitizer::decodeTagAttributes( $attributes ),
 			$message
 		);
 	}
 
-	function provideTagAttributesToDecode() {
+	public static function provideTagAttributesToDecode() {
 		return array(
 			array( array( 'foo' => 'bar' ), 'foo=bar', 'Unquoted attribute' ),
 			array( array( 'foo' => 'bar' ), '    foo   =   bar    ', 'Spaced attribute' ),
@@ -148,7 +197,6 @@ class SanitizerTest extends MediaWikiTestCase {
 			array( array( 'foo.' => 'baz' ), 'foo.=baz', 'A . is allowed as last character' ),
 			array( array( 'foo6' => 'baz' ), 'foo6=baz', 'Numbers are allowed' ),
 
-
 			# This bit is more relaxed than XML rules, but some extensions use
 			# it, like ProofreadPage (see bug 27539)
 			array( array( '1foo' => 'baz' ), '1foo=baz', 'Leading numbers are allowed' ),
@@ -167,7 +215,7 @@ class SanitizerTest extends MediaWikiTestCase {
 	 * @dataProvider provideDeprecatedAttributes
 	 * @covers Sanitizer::fixTagAttributes
 	 */
-	function testDeprecatedAttributesUnaltered( $inputAttr, $inputEl, $message = '' ) {
+	public function testDeprecatedAttributesUnaltered( $inputAttr, $inputEl, $message = '' ) {
 		$this->assertEquals( " $inputAttr",
 			Sanitizer::fixTagAttributes( $inputAttr, $inputEl ),
 			$message
@@ -195,7 +243,7 @@ class SanitizerTest extends MediaWikiTestCase {
 	 * @dataProvider provideCssCommentsFixtures
 	 * @covers Sanitizer::checkCss
 	 */
-	function testCssCommentsChecking( $expected, $css, $message = '' ) {
+	public function testCssCommentsChecking( $expected, $css, $message = '' ) {
 		$this->assertEquals( $expected,
 			Sanitizer::checkCss( $css ),
 			$message
@@ -205,10 +253,14 @@ class SanitizerTest extends MediaWikiTestCase {
 	public static function provideCssCommentsFixtures() {
 		/** array( <expected>, <css>, [message] ) */
 		return array(
-			array( ' ', '/**/' ),
+			// Valid comments spanning entire input
+			array( '/**/', '/**/' ),
+			array( '/* comment */', '/* comment */' ),
+			// Weird stuff
 			array( ' ', '/****/' ),
-			array( ' ', '/* comment */' ),
-			array( ' ', "\\2f\\2a foo \\2a\\2f",
+			array( ' ', '/* /* */' ),
+			array( 'display: block;', "display:/* foo */block;" ),
+			array( 'display: block;', "display:\\2f\\2a foo \\2a\\2f block;",
 				'Backslash-escaped comments must be stripped (bug 28450)' ),
 			array( '', '/* unfinished comment structure',
 				'Remove anything after a comment-start token' ),
@@ -229,7 +281,7 @@ class SanitizerTest extends MediaWikiTestCase {
 	/**
 	 * Test for support or lack of support for specific attributes in the attribute whitelist.
 	 */
-	function provideAttributeSupport() {
+	public static function provideAttributeSupport() {
 		/** array( <attributes>, <expected>, <message> ) */
 		return array(
 			array( 'div', ' role="presentation"', ' role="presentation"', 'Support for WAI-ARIA\'s role="presentation".' ),
@@ -239,12 +291,12 @@ class SanitizerTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideAttributeSupport
+	 * @covers Sanitizer::fixTagAttributes
 	 */
-	function testAttributeSupport( $tag, $attributes, $expected, $message ) {
+	public function testAttributeSupport( $tag, $attributes, $expected, $message ) {
 		$this->assertEquals( $expected,
 			Sanitizer::fixTagAttributes( $attributes, $tag ),
 			$message
 		);
 	}
-
 }
diff --git a/tests/phpunit/includes/SanitizerValidateEmailTest.php b/tests/phpunit/includes/SanitizerValidateEmailTest.php
index fe0bc64e..f13e8382 100644
--- a/tests/phpunit/includes/SanitizerValidateEmailTest.php
+++ b/tests/phpunit/includes/SanitizerValidateEmailTest.php
@@ -1,5 +1,10 @@
 <?php
 
+/**
+ * @covers Sanitizer::validateEmail
+ * @TODO all test methods in this class should be refactored and...
+ *    use a single test method and a single data provider...
+ */
 class SanitizerValidateEmailTest extends MediaWikiTestCase {
 
 	private function checkEmail( $addr, $expected = true, $msg = '' ) {
@@ -22,54 +27,56 @@ class SanitizerValidateEmailTest extends MediaWikiTestCase {
 		$this->checkEmail( $addr, false, $msg );
 	}
 
-	function testEmailWellKnownUserAtHostDotTldAreValid() {
+	public function testEmailWellKnownUserAtHostDotTldAreValid() {
 		$this->valid( 'user@example.com' );
 		$this->valid( 'user@example.museum' );
 	}
 
-	function testEmailWithUpperCaseCharactersAreValid() {
+	public function testEmailWithUpperCaseCharactersAreValid() {
 		$this->valid( 'USER@example.com' );
 		$this->valid( 'user@EXAMPLE.COM' );
 		$this->valid( 'user@Example.com' );
 		$this->valid( 'USER@eXAMPLE.com' );
 	}
 
-	function testEmailWithAPlusInUserName() {
+	public function testEmailWithAPlusInUserName() {
 		$this->valid( 'user+sub@example.com' );
 		$this->valid( 'user+@example.com' );
 	}
 
-	function testEmailDoesNotNeedATopLevelDomain() {
+	public function testEmailDoesNotNeedATopLevelDomain() {
 		$this->valid( "user@localhost" );
 		$this->valid( "FooBar@localdomain" );
 		$this->valid( "nobody@mycompany" );
 	}
 
-	function testEmailWithWhiteSpacesBeforeOrAfterAreInvalids() {
+	public function testEmailWithWhiteSpacesBeforeOrAfterAreInvalids() {
 		$this->invalid( " user@host.com" );
 		$this->invalid( "user@host.com " );
 		$this->invalid( "\tuser@host.com" );
 		$this->invalid( "user@host.com\t" );
 	}
 
-	function testEmailWithWhiteSpacesAreInvalids() {
+	public function testEmailWithWhiteSpacesAreInvalids() {
 		$this->invalid( "User user@host" );
 		$this->invalid( "first last@mycompany" );
 		$this->invalid( "firstlast@my company" );
 	}
 
-	// bug 26948 : comma were matched by an incorrect regexp range
-	function testEmailWithCommasAreInvalids() {
+	/**
+	 * bug 26948 : comma were matched by an incorrect regexp range
+	 */
+	public function testEmailWithCommasAreInvalids() {
 		$this->invalid( "user,foo@example.org" );
 		$this->invalid( "userfoo@ex,ample.org" );
 	}
 
-	function testEmailWithHyphens() {
+	public function testEmailWithHyphens() {
 		$this->valid( "user-foo@example.org" );
 		$this->valid( "userfoo@ex-ample.org" );
 	}
 
-	function testEmailDomainCanNotBeginWithDot() {
+	public function testEmailDomainCanNotBeginWithDot() {
 		$this->invalid( "user@." );
 		$this->invalid( "user@.localdomain" );
 		$this->invalid( "user@localdomain." );
@@ -78,19 +85,19 @@ class SanitizerValidateEmailTest extends MediaWikiTestCase {
 		$this->invalid( ".@a............" );
 	}
 
-	function testEmailWithFunnyCharacters() {
+	public function testEmailWithFunnyCharacters() {
 		$this->valid( "\$user!ex{this}@123.com" );
 	}
 
-	function testEmailTopLevelDomainCanBeNumerical() {
+	public function testEmailTopLevelDomainCanBeNumerical() {
 		$this->valid( "user@example.1234" );
 	}
 
-	function testEmailWithoutAtSignIsInvalid() {
+	public function testEmailWithoutAtSignIsInvalid() {
 		$this->invalid( 'useràexample.com' );
 	}
 
-	function testEmailWithOneCharacterDomainIsValid() {
+	public function testEmailWithOneCharacterDomainIsValid() {
 		$this->valid( 'user@a' );
 	}
 }
diff --git a/tests/phpunit/includes/SeleniumConfigurationTest.php b/tests/phpunit/includes/SeleniumConfigurationTest.php
deleted file mode 100644
index 3422c90c..00000000
--- a/tests/phpunit/includes/SeleniumConfigurationTest.php
+++ /dev/null
@@ -1,222 +0,0 @@
-<?php
-
-class SeleniumConfigurationTest extends MediaWikiTestCase {
-
-	/**
-	 * The file where the test temporarity stores the selenium config.
-	 * This should be cleaned up as part of teardown.
-	 */
-	private $tempFileName;
-
-	/**
-	 * String containing the a sample selenium settings
-	 */
-	private $testConfig0 = '
-[SeleniumSettings]
-browsers[firefox] 	= "*firefox"
-browsers[iexplorer] = "*iexploreproxy"
-browsers[chrome] 	= "*chrome"
-host 				= "localhost"
-port 				= "foobarr"
-wikiUrl 			= "http://localhost/deployment"
-username 			= "xxxxxxx"
-userPassword 		= ""
-testBrowser 		= "chrome"
-startserver		=
-stopserver		=
-jUnitLogFile	=
-runAgainstGrid	= false
-
-[SeleniumTests]
-testSuite[SimpleSeleniumTestSuite] = "tests/selenium/SimpleSeleniumTestSuite.php"
-testSuite[TestSuiteName] = "testSuitePath"
-';
-	/**
-	 * Array of expected browsers from $testConfig0
-	 */
-	private $testBrowsers0 = array( 'firefox' => '*firefox',
-		'iexplorer' => '*iexploreproxy',
-		'chrome' => '*chrome'
-	);
-	/**
-	 * Array of expected selenium settings from $testConfig0
-	 */
-	private $testSettings0 = array(
-		'host' => 'localhost',
-		'port' => 'foobarr',
-		'wikiUrl' => 'http://localhost/deployment',
-		'username' => 'xxxxxxx',
-		'userPassword' => '',
-		'testBrowser' => 'chrome',
-		'startserver' => null,
-		'stopserver' => null,
-		'seleniumserverexecpath' => null,
-		'jUnitLogFile' => null,
-		'runAgainstGrid' => null
-	);
-	/**
-	 * Array of expected testSuites from $testConfig0
-	 */
-	private $testSuites0 = array(
-		'SimpleSeleniumTestSuite' => 'tests/selenium/SimpleSeleniumTestSuite.php',
-		'TestSuiteName' => 'testSuitePath'
-	);
-
-	/**
-	 * Another sample selenium settings file contents
-	 */
-	private $testConfig1 =
-		'
-[SeleniumSettings]
-host 				= "localhost"
-testBrowser 		= "firefox"
-';
-	/**
-	 * Expected browsers from $testConfig1
-	 */
-	private $testBrowsers1 = null;
-	/**
-	 * Expected selenium settings from $testConfig1
-	 */
-	private $testSettings1 = array(
-		'host' => 'localhost',
-		'port' => null,
-		'wikiUrl' => null,
-		'username' => null,
-		'userPassword' => null,
-		'testBrowser' => 'firefox',
-		'startserver' => null,
-		'stopserver' => null,
-		'seleniumserverexecpath' => null,
-		'jUnitLogFile' => null,
-		'runAgainstGrid' => null
-	);
-	/**
-	 * Expected test suites from $testConfig1
-	 */
-	private $testSuites1 = null;
-
-
-	protected function setUp() {
-		parent::setUp();
-		if ( !defined( 'SELENIUMTEST' ) ) {
-			define( 'SELENIUMTEST', true );
-		}
-	}
-
-	/**
-	 * Clean up the temporary file used to store the selenium settings.
-	 */
-	protected function tearDown() {
-		if ( strlen( $this->tempFileName ) > 0 ) {
-			unlink( $this->tempFileName );
-			unset( $this->tempFileName );
-		}
-		parent::tearDown();
-	}
-
-	/**
-	 * @expectedException MWException
-	 * @group SeleniumFramework
-	 */
-	public function testErrorOnIncorrectConfigFile() {
-		$seleniumSettings = array();
-		$seleniumBrowsers = array();
-		$seleniumTestSuites = array();
-
-		SeleniumConfig::getSeleniumSettings( $seleniumSettings,
-			$seleniumBrowsers,
-			$seleniumTestSuites,
-			"Some_fake_settings_file.ini" );
-	}
-
-	/**
-	 * @expectedException MWException
-	 * @group SeleniumFramework
-	 */
-	public function testErrorOnMissingConfigFile() {
-		$seleniumSettings = array();
-		$seleniumBrowsers = array();
-		$seleniumTestSuites = array();
-		global $wgSeleniumConfigFile;
-		$wgSeleniumConfigFile = '';
-		SeleniumConfig::getSeleniumSettings( $seleniumSettings,
-			$seleniumBrowsers,
-			$seleniumTestSuites );
-	}
-
-	/**
-	 * @group SeleniumFramework
-	 */
-	public function testUsesGlobalVarForConfigFile() {
-		$seleniumSettings = array();
-		$seleniumBrowsers = array();
-		$seleniumTestSuites = array();
-		global $wgSeleniumConfigFile;
-		$this->writeToTempFile( $this->testConfig0 );
-		$wgSeleniumConfigFile = $this->tempFileName;
-		SeleniumConfig::getSeleniumSettings( $seleniumSettings,
-			$seleniumBrowsers,
-			$seleniumTestSuites );
-		$this->assertEquals( $seleniumSettings, $this->testSettings0,
-			'The selenium settings should have been read from the file defined in $wgSeleniumConfigFile'
-		);
-		$this->assertEquals( $seleniumBrowsers, $this->testBrowsers0,
-			'The available browsers should have been read from the file defined in $wgSeleniumConfigFile'
-		);
-		$this->assertEquals( $seleniumTestSuites, $this->testSuites0,
-			'The test suites should have been read from the file defined in $wgSeleniumConfigFile'
-		);
-	}
-
-	/**
-	 * @group SeleniumFramework
-	 * @dataProvider sampleConfigs
-	 */
-	public function testgetSeleniumSettings( $sampleConfig, $expectedSettings, $expectedBrowsers, $expectedSuites ) {
-		$this->writeToTempFile( $sampleConfig );
-		$seleniumSettings = array();
-		$seleniumBrowsers = array();
-		$seleniumTestSuites = null;
-
-		SeleniumConfig::getSeleniumSettings( $seleniumSettings,
-			$seleniumBrowsers,
-			$seleniumTestSuites,
-			$this->tempFileName );
-
-		$this->assertEquals( $seleniumSettings, $expectedSettings,
-			"The selenium settings for the following test configuration was not retrieved correctly" . $sampleConfig
-		);
-		$this->assertEquals( $seleniumBrowsers, $expectedBrowsers,
-			"The available browsers for the following test configuration was not retrieved correctly" . $sampleConfig
-		);
-		$this->assertEquals( $seleniumTestSuites, $expectedSuites,
-			"The test suites for the following test configuration was not retrieved correctly" . $sampleConfig
-		);
-	}
-
-	/**
-	 * create a temp file and write text to it.
-	 * @param $testToWrite the text to write to the temp file
-	 */
-	private function writeToTempFile( $textToWrite ) {
-		$this->tempFileName = tempnam( sys_get_temp_dir(), 'test_settings.' );
-		$tempFile = fopen( $this->tempFileName, "w" );
-		fwrite( $tempFile, $textToWrite );
-		fclose( $tempFile );
-	}
-
-	/**
-	 * Returns an array containing:
-	 *     The contents of the selenium cingiguration ini file
-	 *  The expected selenium configuration array that getSeleniumSettings should return
-	 *  The expected available browsers array that getSeleniumSettings should return
-	 *  The expected test suites arrya that getSeleniumSettings should return
-	 */
-	public function sampleConfigs() {
-		return array(
-			array( $this->testConfig0, $this->testSettings0, $this->testBrowsers0, $this->testSuites0 ),
-			array( $this->testConfig1, $this->testSettings1, $this->testBrowsers1, $this->testSuites1 )
-		);
-	}
-}
diff --git a/tests/phpunit/includes/SiteConfigurationTest.php b/tests/phpunit/includes/SiteConfigurationTest.php
index fc7d8d09..053d8a7d 100644
--- a/tests/phpunit/includes/SiteConfigurationTest.php
+++ b/tests/phpunit/includes/SiteConfigurationTest.php
@@ -10,6 +10,7 @@ function getSiteParams( $conf, $wiki ) {
 			break;
 		}
 	}
+
 	return array(
 		'suffix' => $site,
 		'lang' => $lang,
@@ -23,14 +24,18 @@ function getSiteParams( $conf, $wiki ) {
 }
 
 class SiteConfigurationTest extends MediaWikiTestCase {
-	var $mConf;
+
+	/**
+	 * @var SiteConfiguration
+	 */
+	protected $mConf;
 
 	protected function setUp() {
 		parent::setUp();
 
 		$this->mConf = new SiteConfiguration;
 
-		$this->mConf->suffixes = array( 'wiki' );
+		$this->mConf->suffixes = array( 'wikipedia' => 'wiki' );
 		$this->mConf->wikis = array( 'enwiki', 'dewiki', 'frwiki' );
 		$this->mConf->settings = array(
 			'simple' => array(
@@ -94,7 +99,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
 		$GLOBALS['global'] = array( 'global' => 'global' );
 	}
 
-	function testSiteFromDb() {
+	/**
+	 * @covers SiteConfiguration::siteFromDB
+	 */
+	public function testSiteFromDb() {
 		$this->assertEquals(
 			array( 'wikipedia', 'en' ),
 			$this->mConf->siteFromDB( 'enwiki' ),
@@ -119,7 +127,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testGetLocalDatabases() {
+	/**
+	 * @covers SiteConfiguration::getLocalDatabases
+	 */
+	public function testGetLocalDatabases() {
 		$this->assertEquals(
 			array( 'enwiki', 'dewiki', 'frwiki' ),
 			$this->mConf->getLocalDatabases(),
@@ -127,7 +138,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testGetConfVariables() {
+	/**
+	 * @covers SiteConfiguration::get
+	 */
+	public function testGetConfVariables() {
 		$this->assertEquals(
 			'enwiki',
 			$this->mConf->get( 'simple', 'enwiki', 'wiki' ),
@@ -239,7 +253,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testSiteFromDbWithCallback() {
+	/**
+	 * @covers SiteConfiguration::siteFromDB
+	 */
+	public function testSiteFromDbWithCallback() {
 		$this->mConf->siteParamsCallback = 'getSiteParams';
 
 		$this->assertEquals(
@@ -259,7 +276,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testParameterReplacement() {
+	/**
+	 * @covers SiteConfiguration::get
+	 */
+	public function testParameterReplacement() {
 		$this->mConf->siteParamsCallback = 'getSiteParams';
 
 		$this->assertEquals(
@@ -289,7 +309,10 @@ class SiteConfigurationTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testGetAllGlobals() {
+	/**
+	 * @covers SiteConfiguration::getAll
+	 */
+	public function testGetAllGlobals() {
 		$this->mConf->siteParamsCallback = 'getSiteParams';
 
 		$getall = array(
diff --git a/tests/phpunit/includes/StringUtilsTest.php b/tests/phpunit/includes/StringUtilsTest.php
index db3d2655..89759e5c 100644
--- a/tests/phpunit/includes/StringUtilsTest.php
+++ b/tests/phpunit/includes/StringUtilsTest.php
@@ -3,13 +3,13 @@
 class StringUtilsTest extends MediaWikiTestCase {
 
 	/**
-	 * This test StringUtils::isUtf8 whenever we have mbstring extension
+	 * This tests StringUtils::isUtf8 whenever we have the mbstring extension
 	 * loaded.
 	 *
 	 * @covers StringUtils::isUtf8
 	 * @dataProvider provideStringsForIsUtf8Check
 	 */
-	function testIsUtf8WithMbstring( $expected, $string ) {
+	public function testIsUtf8WithMbstring( $expected, $string ) {
 		if ( !function_exists( 'mb_check_encoding' ) ) {
 			$this->markTestSkipped( 'Test requires the mbstring PHP extension' );
 		}
@@ -20,16 +20,16 @@ class StringUtilsTest extends MediaWikiTestCase {
 	}
 
 	/**
-	 * This test StringUtils::isUtf8 making sure we use the pure PHP
+	 * This tests StringUtils::isUtf8 making sure we use the pure PHP
 	 * implementation used as a fallback when mb_check_encoding() is
 	 * not available.
 	 *
 	 * @covers StringUtils::isUtf8
 	 * @dataProvider provideStringsForIsUtf8Check
 	 */
-	function testIsUtf8WithPhpFallbackImplementation( $expected, $string ) {
+	public function testIsUtf8WithPhpFallbackImplementation( $expected, $string ) {
 		$this->assertEquals( $expected,
-			StringUtils::isUtf8( $string, /** disable mbstring: */ true ),
+			StringUtils::isUtf8( $string, /** disable mbstring: */true ),
 			'Testing string "' . $this->escaped( $string ) . '" with pure PHP implementation'
 		);
 	}
@@ -49,6 +49,7 @@ class StringUtilsTest extends MediaWikiTestCase {
 				$escaped .= $char;
 			}
 		}
+
 		return $escaped;
 	}
 
@@ -57,87 +58,90 @@ class StringUtilsTest extends MediaWikiTestCase {
 	 * Markus Kuhn:
 	 * http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
 	 */
-	function provideStringsForIsUtf8Check() {
+	public static function provideStringsForIsUtf8Check() {
 		// Expected return values for StringUtils::isUtf8()
 		$PASS = true;
 		$FAIL = false;
 
 		return array(
-			array( $PASS, 'Some ASCII' ),
-			array( $PASS, "Euro sign €" ),
-
-			# First possible sequences
-			array( $PASS, "\x00" ),
-			array( $PASS, "\xc2\x80" ),
-			array( $PASS, "\xe0\xa0\x80" ),
-			array( $PASS, "\xf0\x90\x80\x80" ),
-			array( $PASS, "\xf8\x88\x80\x80\x80" ),
-			array( $PASS, "\xfc\x84\x80\x80\x80\x80" ),
-
-			# Last possible sequence
-			array( $PASS, "\x7f" ),
-			array( $PASS, "\xdf\xbf" ),
-			array( $PASS, "\xef\xbf\xbf" ),
-			array( $PASS, "\xf7\xbf\xbf\xbf" ),
-			array( $PASS, "\xfb\xbf\xbf\xbf\xbf" ),
-			array( $FAIL, "\xfd\xbf\xbf\xbf\xbf\xbf" ),
-
-			# boundaries:
-			array( $PASS, "\xed\x9f\xbf" ),
-			array( $PASS, "\xee\x80\x80" ),
-			array( $PASS, "\xef\xbf\xbd" ),
-			array( $PASS, "\xf4\x8f\xbf\xbf" ),
-			array( $PASS, "\xf4\x90\x80\x80" ),
-
-			# Malformed
-			array( $FAIL, "\x80" ),
-			array( $FAIL, "\xBF" ),
-			array( $FAIL, "\x80\xbf" ),
-			array( $FAIL, "\x80\xbf\x80" ),
-			array( $FAIL, "\x80\xbf\x80\xbf" ),
-			array( $FAIL, "\x80\xbf\x80\xbf\x80" ),
-			array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf" ),
-			array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf\x80" ),
-
-			# last byte missing
-			array( $FAIL, "\xc0" ),
-			array( $FAIL, "\xe0\x80" ),
-			array( $FAIL, "\xf0\x80\x80" ),
-			array( $FAIL, "\xf8\x80\x80\x80" ),
-			array( $FAIL, "\xfc\x80\x80\x80\x80" ),
-			array( $FAIL, "\xdf" ),
-			array( $FAIL, "\xef\xbf" ),
-			array( $FAIL, "\xf7\xbf\xbf" ),
-			array( $FAIL, "\xfb\xbf\xbf\xbf" ),
-			array( $FAIL, "\xfd\xbf\xbf\xbf\xbf" ),
-
-			# impossible bytes
-			array( $FAIL, "\xfe" ),
-			array( $FAIL, "\xff" ),
-			array( $FAIL, "\xfe\xfe\xff\xff" ),
-
-			/**
-			# The PHP implementation does not handle characters
-			# being represented in a form which is too long :(
-
-			# overlong sequences
-			array( $FAIL, "\xc0\xaf" ),
-			array( $FAIL, "\xe0\x80\xaf" ),
-			array( $FAIL, "\xf0\x80\x80\xaf" ),
-			array( $FAIL, "\xf8\x80\x80\x80\xaf" ),
-			array( $FAIL, "\xfc\x80\x80\x80\x80\xaf" ),
-
-			# Maximum overlong sequences
-			array( $FAIL, "\xc1\xbf" ),
-			array( $FAIL, "\xe0\x9f\xbf" ),
-			array( $FAIL, "\xf0\x8F\xbf\xbf" ),
-			array( $FAIL, "\xf8\x87\xbf\xbf" ),
-			array( $FAIL, "\xfc\x83\xbf\xbf\xbf\xbf" ),
-			**/
-
-			# non characters
-			array( $PASS, "\xef\xbf\xbe" ),
-			array( $PASS, "\xef\xbf\xbf" ),
+			'some ASCII' => array( $PASS, 'Some ASCII' ),
+			'euro sign' => array( $PASS, "Euro sign €" ),
+
+			'first possible sequence 1 byte' => array( $PASS, "\x00" ),
+			'first possible sequence 2 bytes' => array( $PASS, "\xc2\x80" ),
+			'first possible sequence 3 bytes' => array( $PASS, "\xe0\xa0\x80" ),
+			'first possible sequence 4 bytes' => array( $PASS, "\xf0\x90\x80\x80" ),
+			'first possible sequence 5 bytes' => array( $FAIL, "\xf8\x88\x80\x80\x80" ),
+			'first possible sequence 6 bytes' => array( $FAIL, "\xfc\x84\x80\x80\x80\x80" ),
+
+			'last possible sequence 1 byte' => array( $PASS, "\x7f" ),
+			'last possible sequence 2 bytes' => array( $PASS, "\xdf\xbf" ),
+			'last possible sequence 3 bytes' => array( $PASS, "\xef\xbf\xbf" ),
+			'last possible sequence 4 bytes (U+1FFFFF)' => array( $FAIL, "\xf7\xbf\xbf\xbf" ),
+			'last possible sequence 5 bytes' => array( $FAIL, "\xfb\xbf\xbf\xbf\xbf" ),
+			'last possible sequence 6 bytes' => array( $FAIL, "\xfd\xbf\xbf\xbf\xbf\xbf" ),
+
+			'boundary 1' => array( $PASS, "\xed\x9f\xbf" ),
+			'boundary 2' => array( $PASS, "\xee\x80\x80" ),
+			'boundary 3' => array( $PASS, "\xef\xbf\xbd" ),
+			'boundary 4' => array( $PASS, "\xf2\x80\x80\x80" ),
+			'boundary 5 (U+FFFFF)' => array( $PASS, "\xf3\xbf\xbf\xbf" ),
+			'boundary 6 (U+100000)' => array( $PASS, "\xf4\x80\x80\x80" ),
+			'boundary 7 (U+10FFFF)' => array( $PASS, "\xf4\x8f\xbf\xbf" ),
+			'boundary 8 (U+110000)' => array( $FAIL, "\xf4\x90\x80\x80" ),
+
+			'malformed 1' => array( $FAIL, "\x80" ),
+			'malformed 2' => array( $FAIL, "\xbf" ),
+			'malformed 3' => array( $FAIL, "\x80\xbf" ),
+			'malformed 4' => array( $FAIL, "\x80\xbf\x80" ),
+			'malformed 5' => array( $FAIL, "\x80\xbf\x80\xbf" ),
+			'malformed 6' => array( $FAIL, "\x80\xbf\x80\xbf\x80" ),
+			'malformed 7' => array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf" ),
+			'malformed 8' => array( $FAIL, "\x80\xbf\x80\xbf\x80\xbf\x80" ),
+
+			'last byte missing 1' => array( $FAIL, "\xc0" ),
+			'last byte missing 2' => array( $FAIL, "\xe0\x80" ),
+			'last byte missing 3' => array( $FAIL, "\xf0\x80\x80" ),
+			'last byte missing 4' => array( $FAIL, "\xf8\x80\x80\x80" ),
+			'last byte missing 5' => array( $FAIL, "\xfc\x80\x80\x80\x80" ),
+			'last byte missing 6' => array( $FAIL, "\xdf" ),
+			'last byte missing 7' => array( $FAIL, "\xef\xbf" ),
+			'last byte missing 8' => array( $FAIL, "\xf7\xbf\xbf" ),
+			'last byte missing 9' => array( $FAIL, "\xfb\xbf\xbf\xbf" ),
+			'last byte missing 10' => array( $FAIL, "\xfd\xbf\xbf\xbf\xbf" ),
+
+			'extra continuation byte 1' => array( $FAIL, "e\xaf" ),
+			'extra continuation byte 2' => array( $FAIL, "\xc3\x89\xaf" ),
+			'extra continuation byte 3' => array( $FAIL, "\xef\xbc\xa5\xaf" ),
+			'extra continuation byte 4' => array( $FAIL, "\xf0\x9d\x99\xb4\xaf" ),
+
+			'impossible bytes 1' => array( $FAIL, "\xfe" ),
+			'impossible bytes 2' => array( $FAIL, "\xff" ),
+			'impossible bytes 3' => array( $FAIL, "\xfe\xfe\xff\xff" ),
+
+			'overlong sequences 1' => array( $FAIL, "\xc0\xaf" ),
+			'overlong sequences 2' => array( $FAIL, "\xc1\xaf" ),
+			'overlong sequences 3' => array( $FAIL, "\xe0\x80\xaf" ),
+			'overlong sequences 4' => array( $FAIL, "\xf0\x80\x80\xaf" ),
+			'overlong sequences 5' => array( $FAIL, "\xf8\x80\x80\x80\xaf" ),
+			'overlong sequences 6' => array( $FAIL, "\xfc\x80\x80\x80\x80\xaf" ),
+
+			'maximum overlong sequences 1' => array( $FAIL, "\xc1\xbf" ),
+			'maximum overlong sequences 2' => array( $FAIL, "\xe0\x9f\xbf" ),
+			'maximum overlong sequences 3' => array( $FAIL, "\xf0\x8f\xbf\xbf" ),
+			'maximum overlong sequences 4' => array( $FAIL, "\xf8\x87\xbf\xbf" ),
+			'maximum overlong sequences 5' => array( $FAIL, "\xfc\x83\xbf\xbf\xbf\xbf" ),
+
+			'surrogates 1 (U+D799)' => array( $PASS, "\xed\x9f\xbf" ),
+			'surrogates 2 (U+E000)' => array( $PASS, "\xee\x80\x80" ),
+			'surrogates 3 (U+D800)' => array( $FAIL, "\xed\xa0\x80" ),
+			'surrogates 4 (U+DBFF)' => array( $FAIL, "\xed\xaf\xbf" ),
+			'surrogates 5 (U+DC00)' => array( $FAIL, "\xed\xb0\x80" ),
+			'surrogates 6 (U+DFFF)' => array( $FAIL, "\xed\xbf\xbf" ),
+			'surrogates 7 (U+D800 U+DC00)' => array( $FAIL, "\xed\xa0\x80\xed\xb0\x80" ),
+
+			'noncharacters 1' => array( $PASS, "\xef\xbf\xbe" ),
+			'noncharacters 2' => array( $PASS, "\xef\xbf\xbf" ),
 		);
 	}
 }
diff --git a/tests/phpunit/includes/TemplateCategoriesTest.php b/tests/phpunit/includes/TemplateCategoriesTest.php
index a793babb..fb63a564 100644
--- a/tests/phpunit/includes/TemplateCategoriesTest.php
+++ b/tests/phpunit/includes/TemplateCategoriesTest.php
@@ -7,20 +7,37 @@ require __DIR__ . "/../../../maintenance/runJobs.php";
 
 class TemplateCategoriesTest extends MediaWikiLangTestCase {
 
-	function testTemplateCategories() {
+	/**
+	 * @covers Title::getParentCategories
+	 */
+	public function testTemplateCategories() {
 		$title = Title::newFromText( "Categorized from template" );
 		$page = WikiPage::factory( $title );
 		$user = new User();
 		$user->mRights = array( 'createpage', 'edit', 'purge' );
 
-		$status = $page->doEditContent( new WikitextContent( '{{Categorising template}}' ), 'Create a page with a template', 0, false, $user );
+		$page->doEditContent(
+			new WikitextContent( '{{Categorising template}}' ),
+			'Create a page with a template',
+			0,
+			false,
+			$user
+		);
+
 		$this->assertEquals(
 			array()
 			, $title->getParentCategories()
 		);
 
 		$template = WikiPage::factory( Title::newFromText( 'Template:Categorising template' ) );
-		$status = $template->doEditContent( new WikitextContent( '[[Category:Solved bugs]]' ), 'Add a category through a template', 0, false, $user );
+
+		$template->doEditContent(
+			new WikitextContent( '[[Category:Solved bugs]]' ),
+			'Add a category through a template',
+			0,
+			false,
+			$user
+		);
 
 		// Run the job queue
 		JobQueueGroup::destroySingletons();
@@ -33,5 +50,4 @@ class TemplateCategoriesTest extends MediaWikiLangTestCase {
 			, $title->getParentCategories()
 		);
 	}
-
 }
diff --git a/tests/phpunit/includes/TestUser.php b/tests/phpunit/includes/TestUser.php
index c4d89455..23e65031 100644
--- a/tests/phpunit/includes/TestUser.php
+++ b/tests/phpunit/includes/TestUser.php
@@ -1,6 +1,8 @@
 <?php
 
-/* Wraps the user object, so we can also retain full access to properties like password if we log in via the API */
+/**
+ * Wraps the user object, so we can also retain full access to properties like password if we log in via the API
+ */
 class TestUser {
 	public $username;
 	public $password;
@@ -8,7 +10,7 @@ class TestUser {
 	public $groups;
 	public $user;
 
-	function __construct( $username, $realname = 'Real Name', $email = 'sample@example.com', $groups = array() ) {
+	public function __construct( $username, $realname = 'Real Name', $email = 'sample@example.com', $groups = array() ) {
 		$this->username = $username;
 		$this->realname = $realname;
 		$this->email = $email;
@@ -53,6 +55,5 @@ class TestUser {
 			}
 		}
 		$this->user->saveSettings();
-
 	}
 }
diff --git a/tests/phpunit/includes/TimeAdjustTest.php b/tests/phpunit/includes/TimeAdjustTest.php
index a58702b2..0b368c25 100644
--- a/tests/phpunit/includes/TimeAdjustTest.php
+++ b/tests/phpunit/includes/TimeAdjustTest.php
@@ -4,22 +4,28 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
 	protected function setUp() {
 		parent::setUp();
 
-		$this->setMwGlobals( array(
-			'wgLocalTZoffset' => null,
-			'wgContLang' => Language::factory( 'en' ),
-			'wgLanguageCode' => 'en',
-		) );
-
 		$this->iniSet( 'precision', 15 );
 	}
 
-	# Test offset usage for a given language::userAdjust
-	function testUserAdjust() {
-		global $wgLocalTZoffset, $wgContLang;
+	/**
+	 * Test offset usage for a given Language::userAdjust
+	 * @dataProvider dataUserAdjust
+	 * @covers Language::userAdjust
+	 */
+	public function testUserAdjust( $date, $localTZoffset, $expected ) {
+		global $wgContLang;
+
+		$this->setMwGlobals( 'wgLocalTZoffset', $localTZoffset );
 
-		#  Collection of parameters for Language_t_Offset.
-		# Format: date to be formatted, localTZoffset value, expected date
-		$userAdjust_tests = array(
+		$this->assertEquals(
+			strval( $expected ),
+			strval( $wgContLang->userAdjust( $date, '' ) ),
+			"User adjust {$date} by {$localTZoffset} minutes should give {$expected}"
+		);
+	}
+
+	public static function dataUserAdjust() {
+		return array(
 			array( 20061231235959, 0, 20061231235959 ),
 			array( 20061231235959, 5, 20070101000459 ),
 			array( 20061231235959, 15, 20070101001459 ),
@@ -31,15 +37,5 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
 			array( 20061231235959, -30, 20061231232959 ),
 			array( 20061231235959, -60, 20061231225959 ),
 		);
-
-		foreach ( $userAdjust_tests as $data ) {
-			$wgLocalTZoffset = $data[1];
-
-			$this->assertEquals(
-				strval( $data[2] ),
-				strval( $wgContLang->userAdjust( $data[0], '' ) ),
-				"User adjust {$data[0]} by {$data[1]} minutes should give {$data[2]}"
-			);
-		}
 	}
 }
diff --git a/tests/phpunit/includes/TimestampTest.php b/tests/phpunit/includes/TimestampTest.php
index 0690683a..53388392 100644
--- a/tests/phpunit/includes/TimestampTest.php
+++ b/tests/phpunit/includes/TimestampTest.php
@@ -3,23 +3,20 @@
 /**
  * Tests timestamp parsing and output.
  */
-class TimestampTest extends MediaWikiTestCase {
+class TimestampTest extends MediaWikiLangTestCase {
 
 	protected function setUp() {
 		parent::setUp();
 
-		$this->setMwGlobals( array(
-			'wgLanguageCode' => 'en',
-			'wgContLang' => Language::factory( 'en' ),
-			'wgLang' => Language::factory( 'en' ),
-		) );
+		RequestContext::getMain()->setLanguage( Language::factory( 'en' ) );
 	}
 
 	/**
 	 * Test parsing of valid timestamps and outputing to MW format.
 	 * @dataProvider provideValidTimestamps
+	 * @covers MWTimestamp::getTimestamp
 	 */
-	function testValidParse( $format, $original, $expected ) {
+	public function testValidParse( $format, $original, $expected ) {
 		$timestamp = new MWTimestamp( $original );
 		$this->assertEquals( $expected, $timestamp->getTimestamp( TS_MW ) );
 	}
@@ -27,8 +24,9 @@ class TimestampTest extends MediaWikiTestCase {
 	/**
 	 * Test outputting valid timestamps to different formats.
 	 * @dataProvider provideValidTimestamps
+	 * @covers MWTimestamp::getTimestamp
 	 */
-	function testValidOutput( $format, $expected, $original ) {
+	public function testValidOutput( $format, $expected, $original ) {
 		$timestamp = new MWTimestamp( $original );
 		$this->assertEquals( $expected, (string)$timestamp->getTimestamp( $format ) );
 	}
@@ -36,32 +34,22 @@ class TimestampTest extends MediaWikiTestCase {
 	/**
 	 * Test an invalid timestamp.
 	 * @expectedException TimestampException
+	 * @covers MWTimestamp
 	 */
-	function testInvalidParse() {
-		$timestamp = new MWTimestamp( "This is not a timestamp." );
+	public function testInvalidParse() {
+		new MWTimestamp( "This is not a timestamp." );
 	}
 
 	/**
 	 * Test requesting an invalid output format.
 	 * @expectedException TimestampException
+	 * @covers MWTimestamp::getTimestamp
 	 */
-	function testInvalidOutput() {
+	public function testInvalidOutput() {
 		$timestamp = new MWTimestamp( '1343761268' );
 		$timestamp->getTimestamp( 98 );
 	}
 
-	/**
-	 * Test human readable timestamp format.
-	 */
-	function testHumanOutput() {
-		$timestamp = new MWTimestamp( time() - 3600 );
-		$this->assertEquals( "1 hour ago", $timestamp->getHumanTimestamp()->inLanguage( 'en' )->text() );
-		$timestamp = new MWTimestamp( time() - 5184000 );
-		$this->assertEquals( "2 months ago", $timestamp->getHumanTimestamp()->inLanguage( 'en' )->text() );
-		$timestamp = new MWTimestamp( time() - 31536000 );
-		$this->assertEquals( "1 year ago", $timestamp->getHumanTimestamp()->inLanguage( 'en' )->text() );
-	}
-
 	/**
 	 * Returns a list of valid timestamps in the format:
 	 * array( type, timestamp_of_type, timestamp_in_MW )
@@ -83,4 +71,234 @@ class TimestampTest extends MediaWikiTestCase {
 			array( TS_UNIX, '-62135596801', '00001231235959' )
 		);
 	}
+
+	/**
+	 * @dataProvider provideHumanTimestampTests
+	 * @covers MWTimestamp::getHumanTimestamp
+	 */
+	public function testHumanTimestamp(
+		$tsTime, // The timestamp to format
+		$currentTime, // The time to consider "now"
+		$timeCorrection, // The time offset to use
+		$dateFormat, // The date preference to use
+		$expectedOutput, // The expected output
+		$desc // Description
+	) {
+		$user = $this->getMock( 'User' );
+		$user->expects( $this->any() )
+			->method( 'getOption' )
+			->with( 'timecorrection' )
+			->will( $this->returnValue( $timeCorrection ) );
+
+		$user->expects( $this->any() )
+			->method( 'getDatePreference' )
+			->will( $this->returnValue( $dateFormat ) );
+
+		$tsTime = new MWTimestamp( $tsTime );
+		$currentTime = new MWTimestamp( $currentTime );
+
+		$this->assertEquals(
+			$expectedOutput,
+			$tsTime->getHumanTimestamp( $currentTime, $user ),
+			$desc
+		);
+	}
+
+	public static function provideHumanTimestampTests() {
+		return array(
+			array(
+				'20111231170000',
+				'20120101000000',
+				'Offset|0',
+				'mdy',
+				'Yesterday at 17:00',
+				'"Yesterday" across years',
+			),
+			array(
+				'20120717190900',
+				'20120717190929',
+				'Offset|0',
+				'mdy',
+				'just now',
+				'"Just now"',
+			),
+			array(
+				'20120717190900',
+				'20120717191530',
+				'Offset|0',
+				'mdy',
+				'6 minutes ago',
+				'X minutes ago',
+			),
+			array(
+				'20121006173100',
+				'20121006173200',
+				'Offset|0',
+				'mdy',
+				'1 minute ago',
+				'"1 minute ago"',
+			),
+			array(
+				'20120617190900',
+				'20120717190900',
+				'Offset|0',
+				'mdy',
+				'June 17',
+				'Another month'
+			),
+			array(
+				'19910130151500',
+				'20120716193700',
+				'Offset|0',
+				'mdy',
+				'15:15, January 30, 1991',
+				'Different year',
+			),
+			array(
+				'20120101050000',
+				'20120101080000',
+				'Offset|-360',
+				'mdy',
+				'Yesterday at 23:00',
+				'"Yesterday" across years with time correction',
+			),
+			array(
+				'20120714184300',
+				'20120716184300',
+				'Offset|-420',
+				'mdy',
+				'Saturday at 11:43',
+				'Recent weekday with time correction',
+			),
+			array(
+				'20120714184300',
+				'20120715040000',
+				'Offset|-420',
+				'mdy',
+				'11:43',
+				'Today at another time with time correction',
+			),
+			array(
+				'20120617190900',
+				'20120717190900',
+				'Offset|0',
+				'dmy',
+				'17 June',
+				'Another month with dmy'
+			),
+			array(
+				'20120617190900',
+				'20120717190900',
+				'Offset|0',
+				'ISO 8601',
+				'06-17',
+				'Another month with ISO-8601'
+			),
+			array(
+				'19910130151500',
+				'20120716193700',
+				'Offset|0',
+				'ISO 8601',
+				'1991-01-30T15:15:00',
+				'Different year with ISO-8601',
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider provideRelativeTimestampTests
+	 * @covers MWTimestamp::getRelativeTimestamp
+	 */
+	public function testRelativeTimestamp(
+		$tsTime, // The timestamp to format
+		$currentTime, // The time to consider "now"
+		$timeCorrection, // The time offset to use
+		$dateFormat, // The date preference to use
+		$expectedOutput, // The expected output
+		$desc // Description
+	) {
+		$user = $this->getMock( 'User' );
+		$user->expects( $this->any() )
+			->method( 'getOption' )
+			->with( 'timecorrection' )
+			->will( $this->returnValue( $timeCorrection ) );
+
+		$tsTime = new MWTimestamp( $tsTime );
+		$currentTime = new MWTimestamp( $currentTime );
+
+		$this->assertEquals(
+			$expectedOutput,
+			$tsTime->getRelativeTimestamp( $currentTime, $user ),
+			$desc
+		);
+	}
+
+	public static function provideRelativeTimestampTests() {
+		return array(
+			array(
+				'20111231170000',
+				'20120101000000',
+				'Offset|0',
+				'mdy',
+				'7 hours ago',
+				'"Yesterday" across years',
+			),
+			array(
+				'20120717190900',
+				'20120717190929',
+				'Offset|0',
+				'mdy',
+				'29 seconds ago',
+				'"Just now"',
+			),
+			array(
+				'20120717190900',
+				'20120717191530',
+				'Offset|0',
+				'mdy',
+				'6 minutes and 30 seconds ago',
+				'Combination of multiple units',
+			),
+			array(
+				'20121006173100',
+				'20121006173200',
+				'Offset|0',
+				'mdy',
+				'1 minute ago',
+				'"1 minute ago"',
+			),
+			array(
+				'19910130151500',
+				'20120716193700',
+				'Offset|0',
+				'mdy',
+				'2 decades, 1 year, 168 days, 2 hours, 8 minutes and 48 seconds ago',
+				'A long time ago',
+			),
+			array(
+				'20120101050000',
+				'20120101080000',
+				'Offset|-360',
+				'mdy',
+				'3 hours ago',
+				'"Yesterday" across years with time correction',
+			),
+			array(
+				'20120714184300',
+				'20120716184300',
+				'Offset|-420',
+				'mdy',
+				'2 days ago',
+				'Recent weekday with time correction',
+			),
+			array(
+				'20120714184300',
+				'20120715040000',
+				'Offset|-420',
+				'mdy',
+				'9 hours and 17 minutes ago',
+				'Today at another time with time correction',
+			),
+		);
+	}
 }
diff --git a/tests/phpunit/includes/TitleMethodsTest.php b/tests/phpunit/includes/TitleMethodsTest.php
index 89812c90..3079d73a 100644
--- a/tests/phpunit/includes/TitleMethodsTest.php
+++ b/tests/phpunit/includes/TitleMethodsTest.php
@@ -6,11 +6,10 @@
  *
  * @note: We don't make assumptions about the main namespace.
  *        But we do expect the Help namespace to contain Wikitext.
- *
  */
 class TitleMethodsTest extends MediaWikiTestCase {
 
-	public function setup() {
+	public function setUp() {
 		global $wgContLang;
 
 		parent::setUp();
@@ -34,7 +33,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 		$wgContLang->resetNamespaces(); # reset namespace cache
 	}
 
-	public function teardown() {
+	public function tearDown() {
 		global $wgContLang;
 
 		parent::tearDown();
@@ -57,6 +56,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideEquals
+	 * @covers Title::equals
 	 */
 	public function testEquals( $titleA, $titleB, $expectedBool ) {
 		$titleA = Title::newFromText( $titleA );
@@ -81,12 +81,16 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideInNamespace
+	 * @covers Title::inNamespace
 	 */
 	public function testInNamespace( $title, $ns, $expectedBool ) {
 		$title = Title::newFromText( $title );
 		$this->assertEquals( $expectedBool, $title->inNamespace( $ns ) );
 	}
 
+	/**
+	 * @covers Title::inNamespaces
+	 */
 	public function testInNamespaces() {
 		$mainpage = Title::newFromText( 'Main Page' );
 		$this->assertTrue( $mainpage->inNamespaces( NS_MAIN, NS_USER ) );
@@ -110,6 +114,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideHasSubjectNamespace
+	 * @covers Title::hasSubjectNamespace
 	 */
 	public function testHasSubjectNamespace( $title, $ns, $expectedBool ) {
 		$title = Title::newFromText( $title );
@@ -143,6 +148,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider dataGetContentModel
+	 * @covers Title::getContentModel
 	 */
 	public function testGetContentModel( $title, $expectedModelId ) {
 		$title = Title::newFromText( $title );
@@ -151,6 +157,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider dataGetContentModel
+	 * @covers Title::hasContentModel
 	 */
 	public function testHasContentModel( $title, $expectedModelId ) {
 		$title = Title::newFromText( $title );
@@ -181,13 +188,13 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideIsCssOrJsPage
+	 * @covers Title::isCssOrJsPage
 	 */
 	public function testIsCssOrJsPage( $title, $expectedBool ) {
 		$title = Title::newFromText( $title );
 		$this->assertEquals( $expectedBool, $title->isCssOrJsPage() );
 	}
 
-
 	public static function provideIsCssJsSubpage() {
 		return array(
 			array( 'Help:Foo', false ),
@@ -210,6 +217,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideIsCssJsSubpage
+	 * @covers Title::isCssJsSubpage
 	 */
 	public function testIsCssJsSubpage( $title, $expectedBool ) {
 		$title = Title::newFromText( $title );
@@ -230,6 +238,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideIsCssSubpage
+	 * @covers Title::isCssSubpage
 	 */
 	public function testIsCssSubpage( $title, $expectedBool ) {
 		$title = Title::newFromText( $title );
@@ -250,6 +259,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideIsJsSubpage
+	 * @covers Title::isJsSubpage
 	 */
 	public function testIsJsSubpage( $title, $expectedBool ) {
 		$title = Title::newFromText( $title );
@@ -281,10 +291,10 @@ class TitleMethodsTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideIsWikitextPage
+	 * @covers Title::isWikitextPage
 	 */
 	public function testIsWikitextPage( $title, $expectedBool ) {
 		$title = Title::newFromText( $title );
 		$this->assertEquals( $expectedBool, $title->isWikitextPage() );
 	}
-
 }
diff --git a/tests/phpunit/includes/TitlePermissionTest.php b/tests/phpunit/includes/TitlePermissionTest.php
index e2c079a7..f15c1772 100644
--- a/tests/phpunit/includes/TitlePermissionTest.php
+++ b/tests/phpunit/includes/TitlePermissionTest.php
@@ -2,6 +2,7 @@
 
 /**
  * @group Database
+ * @todo covers tags
  */
 class TitlePermissionTest extends MediaWikiLangTestCase {
 
@@ -66,10 +67,9 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
 			$this->user = $this->userUser;
 		}
-
 	}
 
-	function setUserPerm( $perm ) {
+	protected function setUserPerm( $perm ) {
 		// Setting member variables is evil!!!
 
 		if ( is_array( $perm ) ) {
@@ -79,11 +79,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 		}
 	}
 
-	function setTitle( $ns, $title = "Main_Page" ) {
+	protected function setTitle( $ns, $title = "Main_Page" ) {
 		$this->title = Title::makeTitle( $ns, $title );
 	}
 
-	function setUser( $userName = null ) {
+	protected function setUser( $userName = null ) {
 		if ( $userName === 'anon' ) {
 			$this->user = $this->anonUser;
 		} elseif ( $userName === null || $userName === $this->userName ) {
@@ -93,7 +93,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 		}
 	}
 
-	function testQuickPermissions() {
+	/**
+	 * @todo This test method should be split up into separate test methods and
+	 * data providers
+	 */
+	public function testQuickPermissions() {
 		global $wgContLang;
 		$prefix = $wgContLang->getFormattedNsText( NS_PROJECT );
 
@@ -234,7 +238,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
 		if ( $this->isWikitextNS( NS_MAIN ) ) {
 			//NOTE: some content models don't allow moving
-			//@todo: find a Wikitext namespace for testing
+			// @todo find a Wikitext namespace for testing
 
 			$this->setTitle( NS_MAIN );
 			$this->setUser( 'anon' );
@@ -317,12 +321,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 				$this->title->userCan( $action, $this->user, true ) );
 			$this->assertEquals( $check[$action][3],
 				$this->title->quickUserCan( $action, $this->user ) );
-
 			# count( User::getGroupsWithPermissions( $action ) ) < 1
 		}
 	}
 
-	function runGroupPermissions( $action, $result, $result2 = null ) {
+	protected function runGroupPermissions( $action, $result, $result2 = null ) {
 		global $wgGroupPermissions;
 
 		if ( $result2 === null ) {
@@ -350,7 +353,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 		$this->assertEquals( $result2, $res );
 	}
 
-	function testSpecialsAndNSPermissions() {
+	/**
+	 * @todo This test method should be split up into separate test methods and
+	 * data providers
+	 */
+	public function testSpecialsAndNSPermissions() {
 		global $wgNamespaceProtection;
 		$this->setUser( $this->userName );
 
@@ -401,44 +408,85 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 			$this->title->userCan( 'bogus', $this->user ) );
 	}
 
-	function testCssAndJavascriptPermissions() {
+	/**
+	 * @todo This test method should be split up into separate test methods and
+	 * data providers
+	 */
+	public function testCssAndJavascriptPermissions() {
 		$this->setUser( $this->userName );
 
+		$this->setTitle( NS_USER, $this->userName . '/test.js' );
+		$this->runCSSandJSPermissions(
+			array( array( 'badaccess-group0' ), array( 'mycustomjsprotected' ) ),
+			array( array( 'badaccess-group0' ), array( 'mycustomjsprotected' ) ),
+			array( array( 'badaccess-group0' ) ),
+			array( array( 'badaccess-group0' ), array( 'mycustomjsprotected' ) ),
+			array( array( 'badaccess-group0' ) )
+		);
+
+		$this->setTitle( NS_USER, $this->userName . '/test.css' );
+		$this->runCSSandJSPermissions(
+			array( array( 'badaccess-group0' ), array( 'mycustomcssprotected' ) ),
+			array( array( 'badaccess-group0' ) ),
+			array( array( 'badaccess-group0' ), array( 'mycustomcssprotected' ) ),
+			array( array( 'badaccess-group0' ) ),
+			array( array( 'badaccess-group0' ), array( 'mycustomcssprotected' ) )
+		);
+
 		$this->setTitle( NS_USER, $this->altUserName . '/test.js' );
 		$this->runCSSandJSPermissions(
 			array( array( 'badaccess-group0' ), array( 'customjsprotected' ) ),
 			array( array( 'badaccess-group0' ), array( 'customjsprotected' ) ),
-			array( array( 'badaccess-group0' ) ) );
+			array( array( 'badaccess-group0' ), array( 'customjsprotected' ) ),
+			array( array( 'badaccess-group0' ), array( 'customjsprotected' ) ),
+			array( array( 'badaccess-group0' ) )
+		);
 
 		$this->setTitle( NS_USER, $this->altUserName . '/test.css' );
 		$this->runCSSandJSPermissions(
+			array( array( 'badaccess-group0' ), array( 'customcssprotected' ) ),
+			array( array( 'badaccess-group0' ), array( 'customcssprotected' ) ),
 			array( array( 'badaccess-group0' ), array( 'customcssprotected' ) ),
 			array( array( 'badaccess-group0' ) ),
-			array( array( 'badaccess-group0' ), array( 'customcssprotected' ) ) );
+			array( array( 'badaccess-group0' ), array( 'customcssprotected' ) )
+		);
 
 		$this->setTitle( NS_USER, $this->altUserName . '/tempo' );
 		$this->runCSSandJSPermissions(
 			array( array( 'badaccess-group0' ) ),
 			array( array( 'badaccess-group0' ) ),
-			array( array( 'badaccess-group0' ) ) );
+			array( array( 'badaccess-group0' ) ),
+			array( array( 'badaccess-group0' ) ),
+			array( array( 'badaccess-group0' ) )
+		);
 	}
 
-	function runCSSandJSPermissions( $result0, $result1, $result2 ) {
+	protected function runCSSandJSPermissions( $result0, $result1, $result2, $result3, $result4 ) {
 		$this->setUserPerm( '' );
 		$this->assertEquals( $result0,
 			$this->title->getUserPermissionsErrors( 'bogus',
 				$this->user ) );
 
-		$this->setUserPerm( 'editusercss' );
+		$this->setUserPerm( 'editmyusercss' );
 		$this->assertEquals( $result1,
 			$this->title->getUserPermissionsErrors( 'bogus',
 				$this->user ) );
 
-		$this->setUserPerm( 'edituserjs' );
+		$this->setUserPerm( 'editmyuserjs' );
 		$this->assertEquals( $result2,
 			$this->title->getUserPermissionsErrors( 'bogus',
 				$this->user ) );
 
+		$this->setUserPerm( 'editusercss' );
+		$this->assertEquals( $result3,
+			$this->title->getUserPermissionsErrors( 'bogus',
+				$this->user ) );
+
+		$this->setUserPerm( 'edituserjs' );
+		$this->assertEquals( $result4,
+			$this->title->getUserPermissionsErrors( 'bogus',
+				$this->user ) );
+
 		$this->setUserPerm( 'editusercssjs' );
 		$this->assertEquals( array( array( 'badaccess-group0' ) ),
 			$this->title->getUserPermissionsErrors( 'bogus',
@@ -450,7 +498,11 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 				$this->user ) );
 	}
 
-	function testPageRestrictions() {
+	/**
+	 * @todo This test method should be split up into separate test methods and
+	 * data providers
+	 */
+	public function testPageRestrictions() {
 		global $wgContLang;
 
 		$prefix = $wgContLang->getFormattedNsText( NS_PROJECT );
@@ -471,39 +523,59 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
 		$this->assertEquals( array( array( 'badaccess-group0' ),
 				array( 'protectedpagetext', 'bogus' ),
-				array( 'protectedpagetext', 'protect' ),
+				array( 'protectedpagetext', 'editprotected' ),
 				array( 'protectedpagetext', 'protect' ) ),
 			$this->title->getUserPermissionsErrors( 'bogus',
 				$this->user ) );
 		$this->assertEquals( array( array( 'protectedpagetext', 'bogus' ),
-				array( 'protectedpagetext', 'protect' ),
+				array( 'protectedpagetext', 'editprotected' ),
 				array( 'protectedpagetext', 'protect' ) ),
 			$this->title->getUserPermissionsErrors( 'edit',
 				$this->user ) );
 		$this->setUserPerm( "" );
 		$this->assertEquals( array( array( 'badaccess-group0' ),
 				array( 'protectedpagetext', 'bogus' ),
-				array( 'protectedpagetext', 'protect' ),
+				array( 'protectedpagetext', 'editprotected' ),
 				array( 'protectedpagetext', 'protect' ) ),
 			$this->title->getUserPermissionsErrors( 'bogus',
 				$this->user ) );
 		$this->assertEquals( array( array( 'badaccess-groups', "*, [[$prefix:Users|Users]]", 2 ),
 				array( 'protectedpagetext', 'bogus' ),
-				array( 'protectedpagetext', 'protect' ),
+				array( 'protectedpagetext', 'editprotected' ),
 				array( 'protectedpagetext', 'protect' ) ),
 			$this->title->getUserPermissionsErrors( 'edit',
 				$this->user ) );
 		$this->setUserPerm( array( "edit", "editprotected" ) );
 		$this->assertEquals( array( array( 'badaccess-group0' ),
 				array( 'protectedpagetext', 'bogus' ),
-				array( 'protectedpagetext', 'protect' ),
 				array( 'protectedpagetext', 'protect' ) ),
 			$this->title->getUserPermissionsErrors( 'bogus',
 				$this->user ) );
-		$this->assertEquals( array(),
+		$this->assertEquals( array(
+				array( 'protectedpagetext', 'bogus' ),
+				array( 'protectedpagetext', 'protect' ) ),
 			$this->title->getUserPermissionsErrors( 'edit',
 				$this->user ) );
+
 		$this->title->mCascadeRestriction = true;
+		$this->setUserPerm( "edit" );
+		$this->assertEquals( false,
+			$this->title->quickUserCan( 'bogus', $this->user ) );
+		$this->assertEquals( false,
+			$this->title->quickUserCan( 'edit', $this->user ) );
+		$this->assertEquals( array( array( 'badaccess-group0' ),
+				array( 'protectedpagetext', 'bogus' ),
+				array( 'protectedpagetext', 'editprotected' ),
+				array( 'protectedpagetext', 'protect' ) ),
+			$this->title->getUserPermissionsErrors( 'bogus',
+				$this->user ) );
+		$this->assertEquals( array( array( 'protectedpagetext', 'bogus' ),
+				array( 'protectedpagetext', 'editprotected' ),
+				array( 'protectedpagetext', 'protect' ) ),
+			$this->title->getUserPermissionsErrors( 'edit',
+				$this->user ) );
+
+		$this->setUserPerm( array( "edit", "editprotected" ) );
 		$this->assertEquals( false,
 			$this->title->quickUserCan( 'bogus', $this->user ) );
 		$this->assertEquals( false,
@@ -521,7 +593,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 				$this->user ) );
 	}
 
-	function testCascadingSourcesRestrictions() {
+	public function testCascadingSourcesRestrictions() {
 		$this->setTitle( NS_MAIN, "test page" );
 		$this->setUserPerm( array( "edit", "bogus" ) );
 
@@ -531,6 +603,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 		$this->assertEquals( false,
 			$this->title->userCan( 'bogus', $this->user ) );
 		$this->assertEquals( array( array( "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n" ),
+				array( "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n" ),
 				array( "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n" ) ),
 			$this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
 
@@ -538,10 +611,13 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 			$this->title->userCan( 'edit', $this->user ) );
 		$this->assertEquals( array(),
 			$this->title->getUserPermissionsErrors( 'edit', $this->user ) );
-
 	}
 
-	function testActionPermissions() {
+	/**
+	 * @todo This test method should be split up into separate test methods and
+	 * data providers
+	 */
+	public function testActionPermissions() {
 		$this->setUserPerm( array( "createpage" ) );
 		$this->setTitle( NS_MAIN, "test page" );
 		$this->title->mTitleProtection['pt_create_perm'] = '';
@@ -557,12 +633,17 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
 		$this->title->mTitleProtection['pt_create_perm'] = 'sysop';
 		$this->setUserPerm( array( 'createpage', 'protect' ) );
+		$this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
+			$this->title->getUserPermissionsErrors( 'create', $this->user ) );
+		$this->assertEquals( false,
+			$this->title->userCan( 'create', $this->user ) );
+
+		$this->setUserPerm( array( 'createpage', 'editprotected' ) );
 		$this->assertEquals( array(),
 			$this->title->getUserPermissionsErrors( 'create', $this->user ) );
 		$this->assertEquals( true,
 			$this->title->userCan( 'create', $this->user ) );
 
-
 		$this->setUserPerm( array( 'createpage' ) );
 		$this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
 			$this->title->getUserPermissionsErrors( 'create', $this->user ) );
@@ -605,10 +686,9 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 			$this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
 		$this->assertEquals( false,
 			$this->title->userCan( 'move-target', $this->user ) );
-
 	}
 
-	function testUserBlock() {
+	public function testUserBlock() {
 		global $wgEmailConfirmToEdit, $wgEmailAuthentication;
 		$wgEmailConfirmToEdit = true;
 		$wgEmailAuthentication = true;
@@ -648,13 +728,13 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 		global $wgLocalTZoffset;
 		$wgLocalTZoffset = -60;
 		$this->user->mBlockedby = $this->user->getName();
-		$this->user->mBlock = new Block( '127.0.8.1', 0, 1, 'no reason given', $now, 0, 10 );
+		$this->user->mBlock = new Block( '127.0.8.1', 0, $this->user->getId(),
+			'no reason given', $now, 0, 10 );
 		$this->assertEquals( array( array( 'blockedtext',
 				'[[User:Useruser|Useruser]]', 'no reason given', '127.0.0.1',
 				'Useruser', null, '23:00, 31 December 1969', '127.0.8.1',
 				$wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ) ),
 			$this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
-
 		# $action != 'read' && $action != 'createaccount' && $user->isBlockedFrom( $this )
 		#   $user->blockedFor() == ''
 		#   $user->mBlock->mExpiry == 'infinity'
diff --git a/tests/phpunit/includes/TitleTest.php b/tests/phpunit/includes/TitleTest.php
index a9067852..6bfe5453 100644
--- a/tests/phpunit/includes/TitleTest.php
+++ b/tests/phpunit/includes/TitleTest.php
@@ -1,7 +1,6 @@
 <?php
 
 /**
- *
  * @group Database
  *        ^--- needed for language cache stuff
  */
@@ -19,7 +18,10 @@ class TitleTest extends MediaWikiTestCase {
 		) );
 	}
 
-	function testLegalChars() {
+	/**
+	 * @covers Title::legalChars
+	 */
+	public function testLegalChars() {
 		$titlechars = Title::legalChars();
 
 		foreach ( range( 1, 255 ) as $num ) {
@@ -32,13 +34,161 @@ class TitleTest extends MediaWikiTestCase {
 		}
 	}
 
+	/**
+	 * See also mediawiki.Title.test.js
+	 * @covers Title::secureAndSplit
+	 * @todo This method should be split into 2 separate tests each with a provider
+	 */
+	public function testSecureAndSplit() {
+		// Valid
+		foreach ( array(
+			'Sandbox',
+			'A "B"',
+			'A \'B\'',
+			'.com',
+			'~',
+			'"',
+			'\'',
+			'Talk:Sandbox',
+			'Talk:Foo:Sandbox',
+			'File:Example.svg',
+			'File_talk:Example.svg',
+			'Foo/.../Sandbox',
+			'Sandbox/...',
+			'A~~',
+			// Length is 256 total, but only title part matters
+			'Category:' . str_repeat( 'x', 248 ),
+			str_repeat( 'x', 252 )
+		) as $text ) {
+			$this->assertInstanceOf( 'Title', Title::newFromText( $text ), "Valid: $text" );
+		}
+
+		// Invalid
+		foreach ( array(
+			'',
+			'__  __',
+			'  __  ',
+			// Bad characters forbidden regardless of wgLegalTitleChars
+			'A [ B',
+			'A ] B',
+			'A { B',
+			'A } B',
+			'A < B',
+			'A > B',
+			'A | B',
+			// URL encoding
+			'A%20B',
+			'A%23B',
+			'A%2523B',
+			// XML/HTML character entity references
+			// Note: Commented out because they are not marked invalid by the PHP test as
+			// Title::newFromText runs Sanitizer::decodeCharReferencesAndNormalize first.
+			//'A &eacute; B',
+			//'A &#233; B',
+			//'A &#x00E9; B',
+			// Subject of NS_TALK does not roundtrip to NS_MAIN
+			'Talk:File:Example.svg',
+			// Directory navigation
+			'.',
+			'..',
+			'./Sandbox',
+			'../Sandbox',
+			'Foo/./Sandbox',
+			'Foo/../Sandbox',
+			'Sandbox/.',
+			'Sandbox/..',
+			// Tilde
+			'A ~~~ Name',
+			'A ~~~~ Signature',
+			'A ~~~~~ Timestamp',
+			str_repeat( 'x', 256 ),
+			// Namespace prefix without actual title
+			// ':', // bug 54044
+			'Talk:',
+			'Category: ',
+			'Category: #bar'
+		) as $text ) {
+			$this->assertNull( Title::newFromText( $text ), "Invalid: $text" );
+		}
+	}
+
+	public static function provideConvertByteClassToUnicodeClass() {
+		return array(
+			array(
+				' %!"$&\'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+',
+				' %!"$&\'()*,\\-./0-9:;=?@A-Z\\\\\\^_`a-z~+\\u0080-\\uFFFF',
+			),
+			array(
+				'QWERTYf-\\xFF+',
+				'QWERTYf-\\x7F+\\u0080-\\uFFFF',
+			),
+			array(
+				'QWERTY\\x66-\\xFD+',
+				'QWERTYf-\\x7F+\\u0080-\\uFFFF',
+			),
+			array(
+				'QWERTYf-y+',
+				'QWERTYf-y+',
+			),
+			array(
+				'QWERTYf-\\x80+',
+				'QWERTYf-\\x7F+\\u0080-\\uFFFF',
+			),
+			array(
+				'QWERTY\\x66-\\x80+\\x23',
+				'QWERTYf-\\x7F+#\\u0080-\\uFFFF',
+			),
+			array(
+				'QWERTY\\x66-\\x80+\\xD3',
+				'QWERTYf-\\x7F+\\u0080-\\uFFFF',
+			),
+			array(
+				'\\\\\\x99',
+				'\\\\\\u0080-\\uFFFF',
+			),
+			array(
+				'-\\x99',
+				'\\-\\u0080-\\uFFFF',
+			),
+			array(
+				'QWERTY\\-\\x99',
+				'QWERTY\\-\\u0080-\\uFFFF',
+			),
+			array(
+				'\\\\x99',
+				'\\\\x99',
+			),
+			array(
+				'A-\\x9F',
+				'A-\\x7F\\u0080-\\uFFFF',
+			),
+			array(
+				'\\x66-\\x77QWERTY\\x88-\\x91FXZ',
+				'f-wQWERTYFXZ\\u0080-\\uFFFF',
+			),
+			array(
+				'\\x66-\\x99QWERTY\\xAA-\\xEEFXZ',
+				'f-\\x7FQWERTYFXZ\\u0080-\\uFFFF',
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider provideConvertByteClassToUnicodeClass
+	 * @covers Title::convertByteClassToUnicodeClass
+	 */
+	public function testConvertByteClassToUnicodeClass( $byteClass, $unicodeClass ) {
+		$this->assertEquals( $unicodeClass, Title::convertByteClassToUnicodeClass( $byteClass ) );
+	}
+
 	/**
 	 * @dataProvider provideBug31100
+	 * @covers Title::fixSpecialName
 	 */
-	function testBug31100FixSpecialName( $text, $expectedParam ) {
+	public function testBug31100FixSpecialName( $text, $expectedParam ) {
 		$title = Title::newFromText( $text );
 		$fixed = $title->fixSpecialName();
-		$stuff = explode( '/', $fixed->getDbKey(), 2 );
+		$stuff = explode( '/', $fixed->getDBkey(), 2 );
 		if ( count( $stuff ) == 2 ) {
 			$par = $stuff[1];
 		} else {
@@ -61,10 +211,11 @@ class TitleTest extends MediaWikiTestCase {
 	 * @group Database
 	 * @param string $source
 	 * @param string $target
-	 * @param array|string|true $expected Required error
+	 * @param array|string|bool $expected Required error
 	 * @dataProvider provideTestIsValidMoveOperation
+	 * @covers Title::isValidMoveOperation
 	 */
-	function testIsValidMoveOperation( $source, $target, $expected ) {
+	public function testIsValidMoveOperation( $source, $target, $expected ) {
 		$title = Title::newFromText( $source );
 		$nt = Title::newFromText( $target );
 		$errors = $title->isValidMoveOperation( $nt, false );
@@ -81,7 +232,7 @@ class TitleTest extends MediaWikiTestCase {
 	/**
 	 * Provides test parameter values for testIsValidMoveOperation()
 	 */
-	function dataTestIsValidMoveOperation() {
+	public function dataTestIsValidMoveOperation() {
 		return array(
 			array( 'Test', 'Test', 'selfmove' ),
 			array( 'File:Test.jpg', 'Page', 'imagenocrossnamespace' )
@@ -94,12 +245,12 @@ class TitleTest extends MediaWikiTestCase {
 	 * @param array $whitelistRegexp
 	 * @param string $source
 	 * @param string $action
-	 * @param array|string|true $expected Required error
+	 * @param array|string|bool $expected Required error
 	 *
 	 * @covers Title::checkReadPermissions
 	 * @dataProvider dataWgWhitelistReadRegexp
 	 */
-	function testWgWhitelistReadRegexp( $whitelistRegexp, $source, $action, $expected ) {
+	public function testWgWhitelistReadRegexp( $whitelistRegexp, $source, $action, $expected ) {
 		// $wgWhitelistReadRegexp must be an array. Since the provided test cases
 		// usually have only one regex, it is more concise to write the lonely regex
 		// as a string. Thus we cast to an array() to honor $wgWhitelistReadRegexp
@@ -156,7 +307,7 @@ class TitleTest extends MediaWikiTestCase {
 	/**
 	 * Provides test parameter values for testWgWhitelistReadRegexp()
 	 */
-	function dataWgWhitelistReadRegexp() {
+	public function dataWgWhitelistReadRegexp() {
 		$ALLOWED = true;
 		$DISALLOWED = false;
 
@@ -192,11 +343,12 @@ class TitleTest extends MediaWikiTestCase {
 		);
 	}
 
-	function flattenErrorsArray( $errors ) {
+	public function flattenErrorsArray( $errors ) {
 		$result = array();
 		foreach ( $errors as $error ) {
 			$result[] = $error[0];
 		}
+
 		return $result;
 	}
 
@@ -208,9 +360,10 @@ class TitleTest extends MediaWikiTestCase {
 	}
 
 	/**
-	 * @dataProvider provideCasesForGetpageviewlanguage
+	 * @dataProvider provideGetPageViewLanguage
+	 * @covers Title::getPageViewLanguage
 	 */
-	function testGetpageviewlanguage( $expected, $titleText, $contLang, $lang, $variant, $msg = '' ) {
+	public function testGetPageViewLanguage( $expected, $titleText, $contLang, $lang, $variant, $msg = '' ) {
 		global $wgLanguageCode, $wgContLang, $wgLang, $wgDefaultLanguageVariant, $wgAllowUserJs;
 
 		// Setup environnement for this test
@@ -230,7 +383,7 @@ class TitleTest extends MediaWikiTestCase {
 		);
 	}
 
-	function provideCasesForGetpageviewlanguage() {
+	public static function provideGetPageViewLanguage() {
 		# Format:
 		# - expected
 		# - Title name
@@ -271,8 +424,9 @@ class TitleTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideBaseTitleCases
+	 * @covers Title::getBaseText
 	 */
-	function testExtractingBaseTextFromTitle( $title, $expected, $msg = '' ) {
+	public function testGetBaseText( $title, $expected, $msg = '' ) {
 		$title = Title::newFromText( $title );
 		$this->assertEquals( $expected,
 			$title->getBaseText(),
@@ -280,7 +434,7 @@ class TitleTest extends MediaWikiTestCase {
 		);
 	}
 
-	function provideBaseTitleCases() {
+	public static function provideBaseTitleCases() {
 		return array(
 			# Title, expected base, optional message
 			array( 'User:John_Doe/subOne/subTwo', 'John Doe/subOne' ),
@@ -290,8 +444,9 @@ class TitleTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideRootTitleCases
+	 * @covers Title::getRootText
 	 */
-	function testExtractingRootTextFromTitle( $title, $expected, $msg = '' ) {
+	public function testGetRootText( $title, $expected, $msg = '' ) {
 		$title = Title::newFromText( $title );
 		$this->assertEquals( $expected,
 			$title->getRootText(),
@@ -310,8 +465,9 @@ class TitleTest extends MediaWikiTestCase {
 	/**
 	 * @todo Handle $wgNamespacesWithSubpages cases
 	 * @dataProvider provideSubpageTitleCases
+	 * @covers Title::getSubpageText
 	 */
-	function testExtractingSubpageTextFromTitle( $title, $expected, $msg = '' ) {
+	public function testGetSubpageText( $title, $expected, $msg = '' ) {
 		$title = Title::newFromText( $title );
 		$this->assertEquals( $expected,
 			$title->getSubpageText(),
@@ -319,7 +475,7 @@ class TitleTest extends MediaWikiTestCase {
 		);
 	}
 
-	function provideSubpageTitleCases() {
+	public static function provideSubpageTitleCases() {
 		return array(
 			# Title, expected base, optional message
 			array( 'User:John_Doe/subOne/subTwo', 'subTwo' ),
diff --git a/tests/phpunit/includes/UIDGeneratorTest.php b/tests/phpunit/includes/UIDGeneratorTest.php
index 23553ca7..8f78ae51 100644
--- a/tests/phpunit/includes/UIDGeneratorTest.php
+++ b/tests/phpunit/includes/UIDGeneratorTest.php
@@ -1,8 +1,11 @@
 <?php
 
 class UIDGeneratorTest extends MediaWikiTestCase {
+
 	/**
 	 * @dataProvider provider_testTimestampedUID
+	 * @covers UIDGenerator::newTimestampedUID128
+	 * @covers UIDGenerator::newTimestampedUID88
 	 */
 	public function testTimestampedUID( $method, $digitlen, $bits, $tbits, $hostbits ) {
 		$id = call_user_func( array( 'UIDGenerator', $method ) );
@@ -46,6 +49,7 @@ class UIDGeneratorTest extends MediaWikiTestCase {
 
 	/**
 	 * array( method, length, bits, hostbits )
+	 * NOTE: When adding a new method name here please update the covers tags for the tests!
 	 */
 	public static function provider_testTimestampedUID() {
 		return array(
@@ -55,22 +59,40 @@ class UIDGeneratorTest extends MediaWikiTestCase {
 		);
 	}
 
+	/**
+	 * @covers UIDGenerator::newUUIDv4
+	 */
 	public function testUUIDv4() {
 		for ( $i = 0; $i < 100; $i++ ) {
 			$id = UIDGenerator::newUUIDv4();
 			$this->assertEquals( true,
 				preg_match( '!^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$!', $id ),
 				"UID $id has the right format" );
+		}
+	}
 
+	/**
+	 * @covers UIDGenerator::newRawUUIDv4
+	 */
+	public function testRawUUIDv4() {
+		for ( $i = 0; $i < 100; $i++ ) {
 			$id = UIDGenerator::newRawUUIDv4();
 			$this->assertEquals( true,
 				preg_match( '!^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$!', $id ),
 				"UID $id has the right format" );
+		}
+	}
 
+	/**
+	 * @covers UIDGenerator::newRawUUIDv4
+	 */
+	public function testRawUUIDv4QuickRand() {
+		for ( $i = 0; $i < 100; $i++ ) {
 			$id = UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND );
 			$this->assertEquals( true,
 				preg_match( '!^[0-9a-f]{12}4[0-9a-f]{3}[89ab][0-9a-f]{15}$!', $id ),
 				"UID $id has the right format" );
 		}
 	}
+
 }
diff --git a/tests/phpunit/includes/UserMailerTest.php b/tests/phpunit/includes/UserMailerTest.php
new file mode 100644
index 00000000..278edfaa
--- /dev/null
+++ b/tests/phpunit/includes/UserMailerTest.php
@@ -0,0 +1,14 @@
+<?php
+
+class UserMailerTest extends MediaWikiLangTestCase {
+
+	/**
+	 * @covers UserMailer::quotedPrintable
+	 */
+	public function testQuotedPrintable() {
+		$this->assertEquals(
+			"=?UTF-8?Q?=C4=88u=20legebla=3F?=",
+			UserMailer::quotedPrintable( "\xc4\x88u legebla?", "UTF-8" ) );
+	}
+
+}
\ No newline at end of file
diff --git a/tests/phpunit/includes/UserTest.php b/tests/phpunit/includes/UserTest.php
index e777179a..ff33e825 100644
--- a/tests/phpunit/includes/UserTest.php
+++ b/tests/phpunit/includes/UserTest.php
@@ -46,8 +46,16 @@ class UserTest extends MediaWikiTestCase {
 		$wgRevokePermissions['formertesters'] = array(
 			'runtest' => true,
 		);
+
+		# For the options test
+		$wgGroupPermissions['*'] = array(
+			'editmyoptions' => true,
+		);
 	}
 
+	/**
+	 * @covers User::getGroupPermissions
+	 */
 	public function testGroupPermissions() {
 		$rights = User::getGroupPermissions( array( 'unittesters' ) );
 		$this->assertContains( 'runtest', $rights );
@@ -62,6 +70,9 @@ class UserTest extends MediaWikiTestCase {
 		$this->assertNotContains( 'nukeworld', $rights );
 	}
 
+	/**
+	 * @covers User::getGroupPermissions
+	 */
 	public function testRevokePermissions() {
 		$rights = User::getGroupPermissions( array( 'unittesters', 'formertesters' ) );
 		$this->assertNotContains( 'runtest', $rights );
@@ -70,6 +81,9 @@ class UserTest extends MediaWikiTestCase {
 		$this->assertNotContains( 'nukeworld', $rights );
 	}
 
+	/**
+	 * @covers User::getRights
+	 */
 	public function testUserPermissions() {
 		$rights = $this->user->getRights();
 		$this->assertContains( 'runtest', $rights );
@@ -80,6 +94,7 @@ class UserTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideGetGroupsWithPermission
+	 * @covers User::getGroupsWithPermission
 	 */
 	public function testGetGroupsWithPermission( $expected, $right ) {
 		$result = User::getGroupsWithPermission( $right );
@@ -112,6 +127,7 @@ class UserTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideUserNames
+	 * @covers User::isValidUserName
 	 */
 	public function testIsValidUserName( $username, $result, $message ) {
 		$this->assertEquals( $this->user->isValidUserName( $username ), $result, $message );
@@ -166,6 +182,7 @@ class UserTest extends MediaWikiTestCase {
 	/**
 	 * Test User::editCount
 	 * @group medium
+	 * @covers User::getEditCount
 	 */
 	public function testEditCount() {
 		$user = User::newFromName( 'UnitTestUser' );
@@ -190,6 +207,8 @@ class UserTest extends MediaWikiTestCase {
 
 	/**
 	 * Test changing user options.
+	 * @covers User::setOption
+	 * @covers User::getOption
 	 */
 	public function testOptions() {
 		$user = User::newFromName( 'UnitTestUser' );
@@ -207,6 +226,7 @@ class UserTest extends MediaWikiTestCase {
 	/**
 	 * Bug 37963
 	 * Make sure defaults are loaded when setOption is called.
+	 * @covers User::loadOptions
 	 */
 	public function testAnonOptions() {
 		global $wgDefaultUserOptions;
diff --git a/tests/phpunit/includes/WebRequestTest.php b/tests/phpunit/includes/WebRequestTest.php
index 46f80255..f8ed14b6 100644
--- a/tests/phpunit/includes/WebRequestTest.php
+++ b/tests/phpunit/includes/WebRequestTest.php
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @group WebRequest
+ */
 class WebRequestTest extends MediaWikiTestCase {
 	protected $oldServer;
 
@@ -17,8 +20,9 @@ class WebRequestTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideDetectServer
+	 * @covers WebRequest::detectServer
 	 */
-	function testDetectServer( $expected, $input, $description ) {
+	public function testDetectServer( $expected, $input, $description ) {
 		$_SERVER = $input;
 		$result = WebRequest::detectServer();
 		$this->assertEquals( $expected, $result, $description );
@@ -100,12 +104,23 @@ class WebRequestTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideGetIP
+	 * @covers WebRequest::getIP
 	 */
-	function testGetIP( $expected, $input, $squid, $private, $description ) {
-		global $wgSquidServersNoPurge, $wgUsePrivateIPs;
+	public function testGetIP( $expected, $input, $squid, $xffList, $private, $description ) {
 		$_SERVER = $input;
-		$wgSquidServersNoPurge = $squid;
-		$wgUsePrivateIPs = $private;
+		$this->setMwGlobals( array(
+			'wgSquidServersNoPurge' => $squid,
+			'wgUsePrivateIPs' => $private,
+			'wgHooks' => array(
+				'IsTrustedProxy' => array(
+					function( &$ip, &$trusted ) use ( $xffList ) {
+						$trusted = $trusted || in_array( $ip, $xffList );
+						return true;
+					}
+				)
+			)
+		) );
+
 		$request = new WebRequest();
 		$result = $request->getIP();
 		$this->assertEquals( $expected, $result, $description );
@@ -119,6 +134,7 @@ class WebRequestTest extends MediaWikiTestCase {
 					'REMOTE_ADDR' => '127.0.0.1'
 				),
 				array(),
+				array(),
 				false,
 				'Simple IPv4'
 			),
@@ -128,9 +144,21 @@ class WebRequestTest extends MediaWikiTestCase {
 					'REMOTE_ADDR' => '::1'
 				),
 				array(),
+				array(),
 				false,
 				'Simple IPv6'
 			),
+			array(
+				'12.0.0.1',
+				array(
+					'REMOTE_ADDR' => 'abcd:0001:002:03:4:555:6666:7777',
+					'HTTP_X_FORWARDED_FOR' => '12.0.0.1, abcd:0001:002:03:4:555:6666:7777',
+				),
+				array( 'ABCD:1:2:3:4:555:6666:7777' ),
+				array(),
+				false,
+				'IPv6 normalisation'
+			),
 			array(
 				'12.0.0.3',
 				array(
@@ -138,6 +166,7 @@ class WebRequestTest extends MediaWikiTestCase {
 					'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
 				),
 				array( '12.0.0.1', '12.0.0.2' ),
+				array(),
 				false,
 				'With X-Forwaded-For'
 			),
@@ -148,6 +177,7 @@ class WebRequestTest extends MediaWikiTestCase {
 					'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
 				),
 				array(),
+				array(),
 				false,
 				'With X-Forwaded-For and disallowed server'
 			),
@@ -158,36 +188,95 @@ class WebRequestTest extends MediaWikiTestCase {
 					'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
 				),
 				array( '12.0.0.1' ),
+				array(),
 				false,
 				'With multiple X-Forwaded-For and only one allowed server'
 			),
 			array(
-				'12.0.0.2',
+				'10.0.0.3',
 				array(
 					'REMOTE_ADDR' => '12.0.0.2',
-					'HTTP_X_FORWARDED_FOR' => '10.0.0.3, 12.0.0.2'
+					'HTTP_X_FORWARDED_FOR' => '10.0.0.4, 10.0.0.3, 12.0.0.2'
 				),
 				array( '12.0.0.1', '12.0.0.2' ),
+				array(),
 				false,
-				'With X-Forwaded-For and private IP'
+				'With X-Forwaded-For and private IP (from cache proxy)'
 			),
 			array(
-				'10.0.0.3',
+				'10.0.0.4',
 				array(
 					'REMOTE_ADDR' => '12.0.0.2',
-					'HTTP_X_FORWARDED_FOR' => '10.0.0.3, 12.0.0.2'
+					'HTTP_X_FORWARDED_FOR' => '10.0.0.4, 10.0.0.3, 12.0.0.2'
+				),
+				array( '12.0.0.1', '12.0.0.2', '10.0.0.3' ),
+				array(),
+				true,
+				'With X-Forwaded-For and private IP (allowed)'
+			),
+			array(
+				'10.0.0.4',
+				array(
+					'REMOTE_ADDR' => '12.0.0.2',
+					'HTTP_X_FORWARDED_FOR' => '10.0.0.4, 10.0.0.3, 12.0.0.2'
 				),
 				array( '12.0.0.1', '12.0.0.2' ),
+				array( '10.0.0.3' ),
 				true,
 				'With X-Forwaded-For and private IP (allowed)'
 			),
+			array(
+				'10.0.0.3',
+				array(
+					'REMOTE_ADDR' => '12.0.0.2',
+					'HTTP_X_FORWARDED_FOR' => '10.0.0.4, 10.0.0.3, 12.0.0.2'
+				),
+				array( '12.0.0.1', '12.0.0.2' ),
+				array( '10.0.0.3' ),
+				false,
+				'With X-Forwaded-For and private IP (disallowed)'
+			),
+			array(
+				'12.0.0.3',
+				array(
+					'REMOTE_ADDR' => '12.0.0.1',
+					'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
+				),
+				array(),
+				array( '12.0.0.1', '12.0.0.2' ),
+				false,
+				'With X-Forwaded-For'
+			),
+			array(
+				'12.0.0.2',
+				array(
+					'REMOTE_ADDR' => '12.0.0.1',
+					'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
+				),
+				array(),
+				array( '12.0.0.1' ),
+				false,
+				'With multiple X-Forwaded-For and only one allowed server'
+			),
+			array(
+				'12.0.0.2',
+				array(
+					'REMOTE_ADDR' => '12.0.0.2',
+					'HTTP_X_FORWARDED_FOR' => '10.0.0.3, 12.0.0.2'
+				),
+				array(),
+				array( '12.0.0.2' ),
+				false,
+				'With X-Forwaded-For and private IP and hook (disallowed)'
+			),
 		);
 	}
 
 	/**
 	 * @expectedException MWException
+	 * @covers WebRequest::getIP
 	 */
-	function testGetIpLackOfRemoteAddrThrowAnException() {
+	public function testGetIpLackOfRemoteAddrThrowAnException() {
 		$request = new WebRequest();
 		# Next call throw an exception about lacking an IP
 		$request->getIP();
@@ -211,8 +300,9 @@ class WebRequestTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideLanguageData
+	 * @covers WebRequest::getAcceptLang
 	 */
-	function testAcceptLang( $acceptLanguageHeader, $expectedLanguages, $description ) {
+	public function testAcceptLang( $acceptLanguageHeader, $expectedLanguages, $description ) {
 		$_SERVER = array( 'HTTP_ACCEPT_LANGUAGE' => $acceptLanguageHeader );
 		$request = new WebRequest();
 		$this->assertSame( $request->getAcceptLang(), $expectedLanguages, $description );
diff --git a/tests/phpunit/includes/WikiPageTest.php b/tests/phpunit/includes/WikiPageTest.php
index 2501be33..e0d786b9 100644
--- a/tests/phpunit/includes/WikiPageTest.php
+++ b/tests/phpunit/includes/WikiPageTest.php
@@ -1,16 +1,16 @@
 <?php
+
 /**
  * @group ContentHandler
  * @group Database
  * ^--- important, causes temporary tables to be used instead of the real database
  * @group medium
  **/
-
 class WikiPageTest extends MediaWikiLangTestCase {
 
-	var $pages_to_delete;
+	protected $pages_to_delete;
 
-	function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+	function __construct( $name = null, array $data = array(), $dataName = '' ) {
 		parent::__construct( $name, $data, $dataName );
 
 		$this->tablesUsed = array_merge(
@@ -90,6 +90,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		return $page;
 	}
 
+	/**
+	 * @covers WikiPage::doEditContent
+	 */
 	public function testDoEditContent() {
 		$page = $this->newPage( "WikiPageTest_testDoEditContent" );
 		$title = $page->getTitle();
@@ -143,6 +146,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		$this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
 	}
 
+	/**
+	 * @covers WikiPage::doEdit
+	 */
 	public function testDoEdit() {
 		$this->hideDeprecated( "WikiPage::doEdit" );
 		$this->hideDeprecated( "WikiPage::getText" );
@@ -200,6 +206,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		$this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
 	}
 
+	/**
+	 * @covers WikiPage::doQuickEdit
+	 */
 	public function testDoQuickEdit() {
 		global $wgUser;
 
@@ -216,6 +225,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		$this->assertEquals( $text, $page->getText() );
 	}
 
+	/**
+	 * @covers WikiPage::doQuickEditContent
+	 */
 	public function testDoQuickEditContent() {
 		global $wgUser;
 
@@ -229,6 +241,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		$this->assertTrue( $content->equals( $page->getContent() ) );
 	}
 
+	/**
+	 * @covers WikiPage::doDeleteArticle
+	 */
 	public function testDoDeleteArticle() {
 		$page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT );
 		$id = $page->getId();
@@ -253,6 +268,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		$this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
 	}
 
+	/**
+	 * @covers WikiPage::doDeleteUpdates
+	 */
 	public function testDoDeleteUpdates() {
 		$page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT );
 		$id = $page->getId();
@@ -268,6 +286,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		$this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
 	}
 
+	/**
+	 * @covers WikiPage::getRevision
+	 */
 	public function testGetRevision() {
 		$page = $this->newPage( "WikiPageTest_testGetRevision" );
 
@@ -283,6 +304,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		$this->assertEquals( "some text", $rev->getContent()->getNativeData() );
 	}
 
+	/**
+	 * @covers WikiPage::getContent
+	 */
 	public function testGetContent() {
 		$page = $this->newPage( "WikiPageTest_testGetContent" );
 
@@ -296,6 +320,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		$this->assertEquals( "some text", $content->getNativeData() );
 	}
 
+	/**
+	 * @covers WikiPage::getText
+	 */
 	public function testGetText() {
 		$this->hideDeprecated( "WikiPage::getText" );
 
@@ -311,6 +338,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		$this->assertEquals( "some text", $text );
 	}
 
+	/**
+	 * @covers WikiPage::getRawText
+	 */
 	public function testGetRawText() {
 		$this->hideDeprecated( "WikiPage::getRawText" );
 
@@ -326,6 +356,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		$this->assertEquals( "some text", $text );
 	}
 
+	/**
+	 * @covers WikiPage::getContentModel
+	 */
 	public function testGetContentModel() {
 		global $wgContentHandlerUseDB;
 
@@ -339,6 +372,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() );
 	}
 
+	/**
+	 * @covers WikiPage::getContentHandler
+	 */
 	public function testGetContentHandler() {
 		global $wgContentHandlerUseDB;
 
@@ -352,6 +388,9 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		$this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
 	}
 
+	/**
+	 * @covers WikiPage::exists
+	 */
 	public function testExists() {
 		$page = $this->newPage( "WikiPageTest_testExists" );
 		$this->assertFalse( $page->exists() );
@@ -383,6 +422,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider provideHasViewableContent
+	 * @covers WikiPage::hasViewableContent
 	 */
 	public function testHasViewableContent( $title, $viewable, $create = false ) {
 		$page = $this->newPage( $title );
@@ -406,6 +446,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider provideGetRedirectTarget
+	 * @covers WikiPage::getRedirectTarget
 	 */
 	public function testGetRedirectTarget( $title, $model, $text, $target ) {
 		$page = $this->createPage( $title, $text, $model );
@@ -421,6 +462,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider provideGetRedirectTarget
+	 * @covers WikiPage::isRedirect
 	 */
 	public function testIsRedirect( $title, $model, $text, $target ) {
 		$page = $this->createPage( $title, $text, $model );
@@ -537,6 +579,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider provideIsCountable
+	 * @covers WikiPage::isCountable
 	 */
 	public function testIsCountable( $title, $model, $text, $mode, $expected ) {
 		global $wgContentHandlerUseDB;
@@ -569,12 +612,13 @@ class WikiPageTest extends MediaWikiLangTestCase {
 	public static function provideGetParserOutput() {
 		return array(
 			array( CONTENT_MODEL_WIKITEXT, "hello ''world''\n", "<p>hello <i>world</i></p>" ),
-			// @todo: more...?
+			// @todo more...?
 		);
 	}
 
 	/**
 	 * @dataProvider provideGetParserOutput
+	 * @covers WikiPage::getParserOutput
 	 */
 	public function testGetParserOutput( $model, $text, $expectedHtml ) {
 		$page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model );
@@ -587,9 +631,13 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		$text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
 
 		$this->assertEquals( $expectedHtml, $text );
+
 		return $po;
 	}
 
+	/**
+	 * @covers WikiPage::getParserOutput
+	 */
 	public function testGetParserOutput_nonexisting() {
 		static $count = 0;
 		$count++;
@@ -602,13 +650,16 @@ class WikiPageTest extends MediaWikiLangTestCase {
 		$this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." );
 	}
 
+	/**
+	 * @covers WikiPage::getParserOutput
+	 */
 	public function testGetParserOutput_badrev() {
 		$page = $this->createPage( 'WikiPageTest_testGetParserOutput', "dummy", CONTENT_MODEL_WIKITEXT );
 
 		$opt = new ParserOptions();
 		$po = $page->getParserOutput( $opt, $page->getLatest() + 1234 );
 
-		//@todo: would be neat to also test deleted revision
+		// @todo would be neat to also test deleted revision
 
 		$this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." );
 	}
@@ -678,6 +729,7 @@ more stuff
 
 	/**
 	 * @dataProvider dataReplaceSection
+	 * @covers WikiPage::replaceSection
 	 */
 	public function testReplaceSection( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
 		$this->hideDeprecated( "WikiPage::replaceSection" );
@@ -691,6 +743,7 @@ more stuff
 
 	/**
 	 * @dataProvider dataReplaceSection
+	 * @covers WikiPage::replaceSectionContent
 	 */
 	public function testReplaceSectionContent( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
 		$page = $this->createPage( $title, $text, $model );
@@ -801,6 +854,7 @@ more stuff
 
 	/**
 	 * @todo FIXME: the above rollback test is better, but it keeps failing in jenkins for some reason.
+	 * @covers WikiPage::doRollback
 	 */
 	public function testDoRollback() {
 		$admin = new User();
@@ -877,6 +931,7 @@ more stuff
 
 	/**
 	 * @dataProvider provideGetAutoSummary
+	 * @covers WikiPage::getAutosummary
 	 */
 	public function testGetAutosummary( $old, $new, $flags, $expected ) {
 		$this->hideDeprecated( "WikiPage::getAutosummary" );
@@ -949,6 +1004,7 @@ more stuff
 
 	/**
 	 * @dataProvider provideGetAutoDeleteReason
+	 * @covers WikiPage::getAutoDeleteReason
 	 */
 	public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
 		global $wgUser;
@@ -1002,6 +1058,7 @@ more stuff
 
 	/**
 	 * @dataProvider providePreSaveTransform
+	 * @covers WikiPage::preSaveTransform
 	 */
 	public function testPreSaveTransform( $text, $expected ) {
 		$this->hideDeprecated( 'WikiPage::preSaveTransform' );
@@ -1014,5 +1071,4 @@ more stuff
 
 		$this->assertEquals( $expected, $text );
 	}
-
 }
diff --git a/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php b/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
index 1d937e9b..2a723e85 100644
--- a/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
+++ b/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
@@ -6,16 +6,10 @@
  * ^--- important, causes temporary tables to be used instead of the real database
  */
 class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
-	var $saveContentHandlerNoDB = null;
-
-	function setUp() {
-		global $wgContentHandlerUseDB;
 
+	protected function setUp() {
 		parent::setUp();
-
-		$this->saveContentHandlerNoDB = $wgContentHandlerUseDB;
-
-		$wgContentHandlerUseDB = false;
+		$this->setMwGlobals( 'wgContentHandlerUseDB', false );
 
 		$dbw = wfGetDB( DB_MASTER );
 
@@ -32,14 +26,9 @@ class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
 		}
 	}
 
-	function tearDown() {
-		global $wgContentHandlerUseDB;
-
-		$wgContentHandlerUseDB = $this->saveContentHandlerNoDB;
-
-		parent::tearDown();
-	}
-
+	/**
+	 * @covers WikiPage::getContentModel
+	 */
 	public function testGetContentModel() {
 		$page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT );
 
@@ -50,6 +39,9 @@ class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
 		$this->assertEquals( CONTENT_MODEL_WIKITEXT, $page->getContentModel() );
 	}
 
+	/**
+	 * @covers WikiPage::getContentHandler
+	 */
 	public function testGetContentHandler() {
 		$page = $this->createPage( "WikiPageTest_testGetContentHandler", "some text", CONTENT_MODEL_JAVASCRIPT );
 
@@ -58,5 +50,4 @@ class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
 		$page = new WikiPage( $page->getTitle() );
 		$this->assertEquals( 'WikitextContentHandler', get_class( $page->getContentHandler() ) );
 	}
-
 }
diff --git a/tests/phpunit/includes/XmlJsTest.php b/tests/phpunit/includes/XmlJsTest.php
index c5b411fb..161468e2 100644
--- a/tests/phpunit/includes/XmlJsTest.php
+++ b/tests/phpunit/includes/XmlJsTest.php
@@ -1,9 +1,24 @@
 <?php
+
+/**
+ * @group Xml
+ */
 class XmlJs extends MediaWikiTestCase {
-	public function testConstruction() {
-		$obj = new XmlJsCode( null );
-		$this->assertNull( $obj->value );
-		$obj = new XmlJsCode( '' );
-		$this->assertSame( $obj->value, '' );
+
+	/**
+	 * @covers XmlJsCode::__construct
+	 * @dataProvider provideConstruction
+	 */
+	public function testConstruction( $value ) {
+		$obj = new XmlJsCode( $value );
+		$this->assertEquals( $value, $obj->value );
 	}
+
+	public function provideConstruction(){
+		return array(
+			array( null ),
+			array( '' ),
+		);
+	}
+
 }
diff --git a/tests/phpunit/includes/XmlSelectTest.php b/tests/phpunit/includes/XmlSelectTest.php
index d7227b4d..56d28b54 100644
--- a/tests/phpunit/includes/XmlSelectTest.php
+++ b/tests/phpunit/includes/XmlSelectTest.php
@@ -1,13 +1,18 @@
 <?php
 
-// TODO
+/**
+ * @group Xml
+ */
 class XmlSelectTest extends MediaWikiTestCase {
+
+	/**
+	 * @var XmlSelect
+	 */
 	protected $select;
 
 	protected function setUp() {
 		parent::setUp();
 		$this->setMwGlobals( array(
-			'wgHtml5' => true,
 			'wgWellFormedXml' => true,
 		) );
 		$this->select = new XmlSelect();
@@ -18,8 +23,9 @@ class XmlSelectTest extends MediaWikiTestCase {
 		$this->select = null;
 	}
 
-	### START OF TESTS ###
-
+	/**
+	 * @covers XmlSelect::__construct
+	 */
 	public function testConstructWithoutParameters() {
 		$this->assertEquals( '<select></select>', $this->select->getHTML() );
 	}
@@ -27,6 +33,7 @@ class XmlSelectTest extends MediaWikiTestCase {
 	/**
 	 * Parameters are $name (false), $id (false), $default (false)
 	 * @dataProvider provideConstructionParameters
+	 * @covers XmlSelect::__construct
 	 */
 	public function testConstructParameters( $name, $id, $default, $expected ) {
 		$this->select = new XmlSelect( $name, $id, $default );
@@ -40,7 +47,6 @@ class XmlSelectTest extends MediaWikiTestCase {
 	 *  - $id      (default: false)
 	 *  - $default (default: false)
 	 * Provides a fourth parameters representing the expected HTML output
-	 *
 	 */
 	public static function provideConstructionParameters() {
 		return array(
@@ -61,29 +67,41 @@ class XmlSelectTest extends MediaWikiTestCase {
 		);
 	}
 
-	# Begin XmlSelect::addOption() similar to Xml::option
+	/**
+	 * @covers XmlSelect::addOption
+	 */
 	public function testAddOption() {
 		$this->select->addOption( 'foo' );
 		$this->assertEquals( '<select><option value="foo">foo</option></select>', $this->select->getHTML() );
 	}
 
+	/**
+	 * @covers XmlSelect::addOption
+	 */
 	public function testAddOptionWithDefault() {
 		$this->select->addOption( 'foo', true );
 		$this->assertEquals( '<select><option value="1">foo</option></select>', $this->select->getHTML() );
 	}
 
+	/**
+	 * @covers XmlSelect::addOption
+	 */
 	public function testAddOptionWithFalse() {
 		$this->select->addOption( 'foo', false );
 		$this->assertEquals( '<select><option value="foo">foo</option></select>', $this->select->getHTML() );
 	}
 
+	/**
+	 * @covers XmlSelect::addOption
+	 */
 	public function testAddOptionWithValueZero() {
 		$this->select->addOption( 'foo', 0 );
 		$this->assertEquals( '<select><option value="0">foo</option></select>', $this->select->getHTML() );
 	}
 
-	# End XmlSelect::addOption() similar to Xml::option
-
+	/**
+	 * @covers XmlSelect::setDefault
+	 */
 	public function testSetDefault() {
 		$this->select->setDefault( 'bar1' );
 		$this->select->addOption( 'foo1' );
@@ -99,6 +117,7 @@ class XmlSelectTest extends MediaWikiTestCase {
 	 * Adding default later on should set the correct selection or
 	 * raise an exception.
 	 * To handle this, we need to render the options in getHtml()
+	 * @covers XmlSelect::setDefault
 	 */
 	public function testSetDefaultAfterAddingOptions() {
 		$this->select->addOption( 'foo1' );
@@ -111,6 +130,10 @@ class XmlSelectTest extends MediaWikiTestCase {
 				'<option value="foo2">foo2</option></select>', $this->select->getHTML() );
 	}
 
+	/**
+	 * @covers XmlSelect::setAttribute
+	 * @covers XmlSelect::getAttribute
+	 */
 	public function testGetAttributes() {
 		# create some attributes
 		$this->select->setAttribute( 'dummy', 0x777 );
diff --git a/tests/phpunit/includes/XmlTest.php b/tests/phpunit/includes/XmlTest.php
index f4823287..8205029f 100644
--- a/tests/phpunit/includes/XmlTest.php
+++ b/tests/phpunit/includes/XmlTest.php
@@ -1,8 +1,9 @@
 <?php
 
+/**
+ * @group Xml
+ */
 class XmlTest extends MediaWikiTestCase {
-	private static $oldLang;
-	private static $oldNamespaces;
 
 	protected function setUp() {
 		parent::setUp();
@@ -29,11 +30,13 @@ class XmlTest extends MediaWikiTestCase {
 
 		$this->setMwGlobals( array(
 			'wgLang' => $langObj,
-			'wgHtml5' => true,
 			'wgWellFormedXml' => true,
 		) );
 	}
 
+	/**
+	 * @covers Xml::expandAttributes
+	 */
 	public function testExpandAttributes() {
 		$this->assertNull( Xml::expandAttributes( null ),
 			'Converting a null list of attributes'
@@ -43,12 +46,18 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
+	/**
+	 * @covers Xml::expandAttributes
+	 */
 	public function testExpandAttributesException() {
 		$this->setExpectedException( 'MWException' );
 		Xml::expandAttributes( 'string' );
 	}
 
-	function testElementOpen() {
+	/**
+	 * @covers Xml::element
+	 */
+	public function testElementOpen() {
 		$this->assertEquals(
 			'<element>',
 			Xml::element( 'element', null, null ),
@@ -56,7 +65,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testElementEmpty() {
+	/**
+	 * @covers Xml::element
+	 */
+	public function testElementEmpty() {
 		$this->assertEquals(
 			'<element />',
 			Xml::element( 'element', null, '' ),
@@ -64,7 +76,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testElementInputCanHaveAValueOfZero() {
+	/**
+	 * @covers Xml::input
+	 */
+	public function testElementInputCanHaveAValueOfZero() {
 		$this->assertEquals(
 			'<input name="name" value="0" />',
 			Xml::input( 'name', false, 0 ),
@@ -72,7 +87,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testElementEscaping() {
+	/**
+	 * @covers Xml::element
+	 */
+	public function testElementEscaping() {
 		$this->assertEquals(
 			'<element>hello &lt;there&gt; you &amp; you</element>',
 			Xml::element( 'element', null, 'hello <there> you & you' ),
@@ -80,13 +98,19 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
+	/**
+	 * @covers Xml::escapeTagsOnly
+	 */
 	public function testEscapeTagsOnly() {
 		$this->assertEquals( '&quot;&gt;&lt;', Xml::escapeTagsOnly( '"><' ),
 			'replace " > and < with their HTML entitites'
 		);
 	}
 
-	function testElementAttributes() {
+	/**
+	 * @covers Xml::element
+	 */
+	public function testElementAttributes() {
 		$this->assertEquals(
 			'<element key="value" <>="&lt;&gt;">',
 			Xml::element( 'element', array( 'key' => 'value', '<>' => '<>' ), null ),
@@ -94,7 +118,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testOpenElement() {
+	/**
+	 * @covers Xml::openElement
+	 */
+	public function testOpenElement() {
 		$this->assertEquals(
 			'<element k="v">',
 			Xml::openElement( 'element', array( 'k' => 'v' ) ),
@@ -102,10 +129,16 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testCloseElement() {
+	/**
+	 * @covers Xml::closeElement
+	 */
+	public function testCloseElement() {
 		$this->assertEquals( '</element>', Xml::closeElement( 'element' ), 'closeElement() shortcut' );
 	}
 
+	/**
+	 * @covers Xml::dateMenu
+	 */
 	public function testDateMenu() {
 		$curYear = intval( gmdate( 'Y' ) );
 		$prevYear = $curYear - 1;
@@ -186,10 +219,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	#
-	# textarea
-	#
-	function testTextareaNoContent() {
+	/**
+	 * @covers Xml::textarea
+	 */
+	public function testTextareaNoContent() {
 		$this->assertEquals(
 			'<textarea name="name" id="name" cols="40" rows="5"></textarea>',
 			Xml::textarea( 'name', '' ),
@@ -197,7 +230,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testTextareaAttribs() {
+	/**
+	 * @covers Xml::textarea
+	 */
+	public function testTextareaAttribs() {
 		$this->assertEquals(
 			'<textarea name="name" id="name" cols="20" rows="10">&lt;txt&gt;</textarea>',
 			Xml::textarea( 'name', '<txt>', 20, 10 ),
@@ -205,10 +241,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	#
-	# input and label
-	#
-	function testLabelCreation() {
+	/**
+	 * @covers Xml::label
+	 */
+	public function testLabelCreation() {
 		$this->assertEquals(
 			'<label for="id">name</label>',
 			Xml::label( 'name', 'id' ),
@@ -216,7 +252,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testLabelAttributeCanOnlyBeClassOrTitle() {
+	/**
+	 * @covers Xml::label
+	 */
+	public function testLabelAttributeCanOnlyBeClassOrTitle() {
 		$this->assertEquals(
 			'<label for="id">name</label>',
 			Xml::label( 'name', 'id', array( 'generated' => true ) ),
@@ -245,7 +284,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testLanguageSelector() {
+	/**
+	 * @covers Xml::languageSelector
+	 */
+	public function testLanguageSelector() {
 		$select = Xml::languageSelector( 'en', true, null,
 			array( 'id' => 'testlang' ), wfMessage( 'yourlanguage' ) );
 		$this->assertEquals(
@@ -254,10 +296,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	#
-	# JS
-	#
-	function testEscapeJsStringSpecialChars() {
+	/**
+	 * @covers Xml::escapeJsString
+	 */
+	public function testEscapeJsStringSpecialChars() {
 		$this->assertEquals(
 			'\\\\\r\n',
 			Xml::escapeJsString( "\\\r\n" ),
@@ -265,7 +307,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testEncodeJsVarBoolean() {
+	/**
+	 * @covers Xml::encodeJsVar
+	 */
+	public function testEncodeJsVarBoolean() {
 		$this->assertEquals(
 			'true',
 			Xml::encodeJsVar( true ),
@@ -273,7 +318,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testEncodeJsVarNull() {
+	/**
+	 * @covers Xml::encodeJsVar
+	 */
+	public function testEncodeJsVarNull() {
 		$this->assertEquals(
 			'null',
 			Xml::encodeJsVar( null ),
@@ -281,7 +329,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testEncodeJsVarArray() {
+	/**
+	 * @covers Xml::encodeJsVar
+	 */
+	public function testEncodeJsVarArray() {
 		$this->assertEquals(
 			'["a",1]',
 			Xml::encodeJsVar( array( 'a', 1 ) ),
@@ -294,7 +345,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testEncodeJsVarObject() {
+	/**
+	 * @covers Xml::encodeJsVar
+	 */
+	public function testEncodeJsVarObject() {
 		$this->assertEquals(
 			'{"a":"a","b":1}',
 			Xml::encodeJsVar( (object)array( 'a' => 'a', 'b' => 1 ) ),
@@ -302,7 +356,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testEncodeJsVarInt() {
+	/**
+	 * @covers Xml::encodeJsVar
+	 */
+	public function testEncodeJsVarInt() {
 		$this->assertEquals(
 			'123456',
 			Xml::encodeJsVar( 123456 ),
@@ -310,7 +367,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testEncodeJsVarFloat() {
+	/**
+	 * @covers Xml::encodeJsVar
+	 */
+	public function testEncodeJsVarFloat() {
 		$this->assertEquals(
 			'1.23456',
 			Xml::encodeJsVar( 1.23456 ),
@@ -318,7 +378,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testEncodeJsVarIntString() {
+	/**
+	 * @covers Xml::encodeJsVar
+	 */
+	public function testEncodeJsVarIntString() {
 		$this->assertEquals(
 			'"123456"',
 			Xml::encodeJsVar( '123456' ),
@@ -326,7 +389,10 @@ class XmlTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testEncodeJsVarFloatString() {
+	/**
+	 * @covers Xml::encodeJsVar
+	 */
+	public function testEncodeJsVarFloatString() {
 		$this->assertEquals(
 			'"1.23456"',
 			Xml::encodeJsVar( '1.23456' ),
diff --git a/tests/phpunit/includes/XmlTypeCheckTest.php b/tests/phpunit/includes/XmlTypeCheckTest.php
new file mode 100644
index 00000000..8d6f1ed7
--- /dev/null
+++ b/tests/phpunit/includes/XmlTypeCheckTest.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * PHPUnit tests for XMLTypeCheck.
+ * @author physikerwelt
+ * @group Xml
+ * @covers XMLTypeCheck
+ */
+class XmlTypeCheckTest extends MediaWikiTestCase {
+	const WELL_FORMED_XML = "<root><child /></root>";
+	const MAL_FORMED_XML = "<root><child /></error>";
+
+	/**
+	 * @covers XMLTypeCheck::newFromString
+	 * @covers XMLTypeCheck::getRootElement
+	 */
+	public function testWellFormedXML() {
+		$testXML = XmlTypeCheck::newFromString( self::WELL_FORMED_XML );
+		$this->assertTrue( $testXML->wellFormed );
+		$this->assertEquals( 'root', $testXML->getRootElement() );
+	}
+
+	/**
+	 * @covers XMLTypeCheck::newFromString
+	 */
+	public function testMalFormedXML() {
+		$testXML = XmlTypeCheck::newFromString( self::MAL_FORMED_XML );
+		$this->assertFalse( $testXML->wellFormed );
+	}
+
+}
diff --git a/tests/phpunit/includes/ZipDirectoryReaderTest.php b/tests/phpunit/includes/ZipDirectoryReaderTest.php
index 3fea57a0..2627a417 100644
--- a/tests/phpunit/includes/ZipDirectoryReaderTest.php
+++ b/tests/phpunit/includes/ZipDirectoryReaderTest.php
@@ -1,7 +1,12 @@
 <?php
 
+/**
+ * @covers ZipDirectoryReader
+ * NOTE: this test is more like an integration test than a unit test
+ */
 class ZipDirectoryReaderTest extends MediaWikiTestCase {
-	var $zipDir, $entries;
+	protected $zipDir;
+	protected $entries;
 
 	protected function setUp() {
 		parent::setUp();
@@ -24,21 +29,21 @@ class ZipDirectoryReaderTest extends MediaWikiTestCase {
 		$this->assertTrue( $status->isOK(), $assertMessage );
 	}
 
-	function testEmpty() {
+	public function testEmpty() {
 		$this->readZipAssertSuccess( 'empty.zip', 'Empty zip' );
 	}
 
-	function testMultiDisk0() {
+	public function testMultiDisk0() {
 		$this->readZipAssertError( 'split.zip', 'zip-unsupported',
 			'Split zip error' );
 	}
 
-	function testNoSignature() {
+	public function testNoSignature() {
 		$this->readZipAssertError( 'nosig.zip', 'zip-wrong-format',
 			'No signature should give "wrong format" error' );
 	}
 
-	function testSimple() {
+	public function testSimple() {
 		$this->readZipAssertSuccess( 'class.zip', 'Simple ZIP' );
 		$this->assertEquals( $this->entries, array( array(
 			'name' => 'Class.class',
@@ -47,33 +52,33 @@ class ZipDirectoryReaderTest extends MediaWikiTestCase {
 		) ) );
 	}
 
-	function testBadCentralEntrySignature() {
+	public function testBadCentralEntrySignature() {
 		$this->readZipAssertError( 'wrong-central-entry-sig.zip', 'zip-bad',
 			'Bad central entry error' );
 	}
 
-	function testTrailingBytes() {
+	public function testTrailingBytes() {
 		$this->readZipAssertError( 'trail.zip', 'zip-bad',
 			'Trailing bytes error' );
 	}
 
-	function testWrongCDStart() {
+	public function testWrongCDStart() {
 		$this->readZipAssertError( 'wrong-cd-start-disk.zip', 'zip-unsupported',
 			'Wrong CD start disk error' );
 	}
 
 
-	function testCentralDirectoryGap() {
+	public function testCentralDirectoryGap() {
 		$this->readZipAssertError( 'cd-gap.zip', 'zip-bad',
 			'CD gap error' );
 	}
 
-	function testCentralDirectoryTruncated() {
+	public function testCentralDirectoryTruncated() {
 		$this->readZipAssertError( 'cd-truncated.zip', 'zip-bad',
 			'CD truncated error (should hit unpack() overrun)' );
 	}
 
-	function testLooksLikeZip64() {
+	public function testLooksLikeZip64() {
 		$this->readZipAssertError( 'looks-like-zip64.zip', 'zip-unsupported',
 			'A file which looks like ZIP64 but isn\'t, should give error' );
 	}
diff --git a/tests/phpunit/includes/api/ApiAccountCreationTest.php b/tests/phpunit/includes/api/ApiAccountCreationTest.php
index 94082e5a..68f80ac9 100644
--- a/tests/phpunit/includes/api/ApiAccountCreationTest.php
+++ b/tests/phpunit/includes/api/ApiAccountCreationTest.php
@@ -20,7 +20,7 @@ class ApiCreateAccountTest extends ApiTestCase {
 	 * a bit slow. Raise the default timeout.
 	 * @group medium
 	 */
-	function testValid() {
+	public function testValid() {
 		global $wgServer;
 
 		if ( !isset( $wgServer ) ) {
@@ -47,13 +47,16 @@ class ApiCreateAccountTest extends ApiTestCase {
 		$token = $a['token'];
 
 		// Finally create the account
-		$ret = $this->doApiRequest( array(
-			'action' => 'createaccount',
-			'name' => 'Apitestnew',
-			'password' => $password,
-			'token' => $token,
-			'email' => 'test@domain.test',
-			'realname' => 'Test Name' ), $ret[2]
+		$ret = $this->doApiRequest(
+			array(
+				'action' => 'createaccount',
+				'name' => 'Apitestnew',
+				'password' => $password,
+				'token' => $token,
+				'email' => 'test@domain.test',
+				'realname' => 'Test Name'
+			),
+			$ret[2]
 		);
 
 		$result = $ret[0];
@@ -65,8 +68,7 @@ class ApiCreateAccountTest extends ApiTestCase {
 			'action' => 'login',
 			'lgname' => 'Apitestnew',
 			'lgpassword' => $password,
-			)
-		);
+		) );
 
 		$result = $ret[0];
 		$this->assertNotInternalType( 'bool', $result );
@@ -76,12 +78,14 @@ class ApiCreateAccountTest extends ApiTestCase {
 		$this->assertEquals( 'NeedToken', $a );
 		$token = $result['login']['token'];
 
-		$ret = $this->doApiRequest( array(
-			'action' => 'login',
-			'lgtoken' => $token,
-			'lgname' => 'Apitestnew',
-			'lgpassword' => $password,
-			), $ret[2]
+		$ret = $this->doApiRequest(
+			array(
+				'action' => 'login',
+				'lgtoken' => $token,
+				'lgname' => 'Apitestnew',
+				'lgpassword' => $password,
+			),
+			$ret[2]
 		);
 
 		$result = $ret[0];
@@ -92,9 +96,11 @@ class ApiCreateAccountTest extends ApiTestCase {
 		$this->assertEquals( 'Success', $a );
 
 		// log out to destroy the session
-		$ret = $this->doApiRequest( array(
-			'action' => 'logout',
-			), $ret[2]
+		$ret = $this->doApiRequest(
+			array(
+				'action' => 'logout',
+			),
+			$ret[2]
 		);
 		$this->assertEquals( array(), $ret[0] );
 	}
@@ -103,8 +109,8 @@ class ApiCreateAccountTest extends ApiTestCase {
 	 * Make sure requests with no names are invalid.
 	 * @expectedException UsageException
 	 */
-	function testNoName() {
-		$ret = $this->doApiRequest( array(
+	public function testNoName() {
+		$this->doApiRequest( array(
 			'action' => 'createaccount',
 			'token' => LoginForm::getCreateaccountToken(),
 			'password' => 'password',
@@ -115,8 +121,8 @@ class ApiCreateAccountTest extends ApiTestCase {
 	 * Make sure requests with no password are invalid.
 	 * @expectedException UsageException
 	 */
-	function testNoPassword() {
-		$ret = $this->doApiRequest( array(
+	public function testNoPassword() {
+		$this->doApiRequest( array(
 			'action' => 'createaccount',
 			'name' => 'testName',
 			'token' => LoginForm::getCreateaccountToken(),
@@ -127,7 +133,7 @@ class ApiCreateAccountTest extends ApiTestCase {
 	 * Make sure requests with existing users are invalid.
 	 * @expectedException UsageException
 	 */
-	function testExistingUser() {
+	public function testExistingUser() {
 		$this->doApiRequest( array(
 			'action' => 'createaccount',
 			'name' => 'Apitestsysop',
@@ -141,7 +147,7 @@ class ApiCreateAccountTest extends ApiTestCase {
 	 * Make sure requests with invalid emails are invalid.
 	 * @expectedException UsageException
 	 */
-	function testInvalidEmail() {
+	public function testInvalidEmail() {
 		$this->doApiRequest( array(
 			'action' => 'createaccount',
 			'name' => 'Test User',
diff --git a/tests/phpunit/includes/api/ApiBlockTest.php b/tests/phpunit/includes/api/ApiBlockTest.php
index 94643b10..8afb748a 100644
--- a/tests/phpunit/includes/api/ApiBlockTest.php
+++ b/tests/phpunit/includes/api/ApiBlockTest.php
@@ -6,7 +6,6 @@
  * @group medium
  */
 class ApiBlockTest extends ApiTestCase {
-
 	protected function setUp() {
 		parent::setUp();
 		$this->doLogin();
@@ -35,9 +34,8 @@ class ApiBlockTest extends ApiTestCase {
 	 * Which made the Block/Unblock API to actually verify the token
 	 * previously always considered valid (bug 34212).
 	 */
-	function testMakeNormalBlock() {
-
-		$data = $this->getTokens();
+	public function testMakeNormalBlock() {
+		$tokens = $this->getTokens();
 
 		$user = User::newFromName( 'UTApiBlockee' );
 
@@ -45,19 +43,15 @@ class ApiBlockTest extends ApiTestCase {
 			$this->markTestIncomplete( "The user UTApiBlockee does not exist" );
 		}
 
-		if ( !isset( $data[0]['query']['pages'] ) ) {
+		if ( !array_key_exists( 'blocktoken', $tokens ) ) {
 			$this->markTestIncomplete( "No block token found" );
 		}
 
-		$keys = array_keys( $data[0]['query']['pages'] );
-		$key = array_pop( $keys );
-		$pageinfo = $data[0]['query']['pages'][$key];
-
-		$data = $this->doApiRequest( array(
+		$this->doApiRequest( array(
 			'action' => 'block',
 			'user' => 'UTApiBlockee',
 			'reason' => 'Some reason',
-			'token' => $pageinfo['blocktoken'] ), null, false, self::$users['sysop']->user );
+			'token' => $tokens['blocktoken'] ), null, false, self::$users['sysop']->user );
 
 		$block = Block::newFromTarget( 'UTApiBlockee' );
 
@@ -66,7 +60,6 @@ class ApiBlockTest extends ApiTestCase {
 		$this->assertEquals( 'UTApiBlockee', (string)$block->getTarget() );
 		$this->assertEquals( 'Some reason', $block->mReason );
 		$this->assertEquals( 'infinity', $block->mExpiry );
-
 	}
 
 	/**
@@ -77,7 +70,7 @@ class ApiBlockTest extends ApiTestCase {
 	 * @dataProvider provideBlockUnblockAction
 	 * @expectedException UsageException
 	 */
-	function testBlockingActionWithNoToken( $action ) {
+	public function testBlockingActionWithNoToken( $action ) {
 		$this->doApiRequest(
 			array(
 				'action' => $action,
@@ -93,7 +86,7 @@ class ApiBlockTest extends ApiTestCase {
 	/**
 	 * Just provide the 'block' and 'unblock' action to test both API calls
 	 */
-	function provideBlockUnblockAction() {
+	public static function provideBlockUnblockAction() {
 		return array(
 			array( 'block' ),
 			array( 'unblock' ),
diff --git a/tests/phpunit/includes/api/ApiEditPageTest.php b/tests/phpunit/includes/api/ApiEditPageTest.php
index 1efbaeaf..0c49b12b 100644
--- a/tests/phpunit/includes/api/ApiEditPageTest.php
+++ b/tests/phpunit/includes/api/ApiEditPageTest.php
@@ -11,10 +11,10 @@
  */
 class ApiEditPageTest extends ApiTestCase {
 
-	public function setup() {
+	public function setUp() {
 		global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
 
-		parent::setup();
+		parent::setUp();
 
 		$wgExtraNamespaces[12312] = 'Dummy';
 		$wgExtraNamespaces[12313] = 'Dummy_talk';
@@ -28,7 +28,7 @@ class ApiEditPageTest extends ApiTestCase {
 		$this->doLogin();
 	}
 
-	public function teardown() {
+	public function tearDown() {
 		global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
 
 		unset( $wgExtraNamespaces[12312] );
@@ -40,10 +40,10 @@ class ApiEditPageTest extends ApiTestCase {
 		MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
 		$wgContLang->resetNamespaces(); # reset namespace cache
 
-		parent::teardown();
+		parent::tearDown();
 	}
 
-	function testEdit() {
+	public function testEdit() {
 		$name = 'Help:ApiEditPageTest_testEdit'; // assume Help namespace to default to wikitext
 
 		// -- test new page --------------------------------------------
@@ -97,7 +97,7 @@ class ApiEditPageTest extends ApiTestCase {
 		);
 	}
 
-	function testNonTextEdit() {
+	public function testNonTextEdit() {
 		$name = 'Dummy:ApiEditPageTest_testNonTextEdit';
 		$data = serialize( 'some bla bla text' );
 
@@ -124,7 +124,7 @@ class ApiEditPageTest extends ApiTestCase {
 		$this->assertEquals( $data, $page->getContent()->serialize() );
 	}
 
-	static function provideEditAppend() {
+	public static function provideEditAppend() {
 		return array(
 			array( #0: append
 				'foo', 'append', 'bar', "foobar"
@@ -150,7 +150,7 @@ class ApiEditPageTest extends ApiTestCase {
 	/**
 	 * @dataProvider provideEditAppend
 	 */
-	function testEditAppend( $text, $op, $append, $expected ) {
+	public function testEditAppend( $text, $op, $append, $expected ) {
 		static $count = 0;
 		$count++;
 
@@ -161,13 +161,13 @@ class ApiEditPageTest extends ApiTestCase {
 		if ( $text !== null ) {
 			if ( $text === '' ) {
 				// can't create an empty page, so create it with some content
-				list( $re, , ) = $this->doApiRequestWithToken( array(
+				$this->doApiRequestWithToken( array(
 					'action' => 'edit',
 					'title' => $name,
 					'text' => '(dummy)', ) );
 			}
 
-			list( $re, , ) = $this->doApiRequestWithToken( array(
+			list( $re ) = $this->doApiRequestWithToken( array(
 				'action' => 'edit',
 				'title' => $name,
 				'text' => $text, ) );
@@ -176,7 +176,7 @@ class ApiEditPageTest extends ApiTestCase {
 		}
 
 		// -- try append/prepend --------------------------------------------
-		list( $re, , ) = $this->doApiRequestWithToken( array(
+		list( $re ) = $this->doApiRequestWithToken( array(
 			'action' => 'edit',
 			'title' => $name,
 			$op . 'text' => $append, ) );
@@ -193,15 +193,80 @@ class ApiEditPageTest extends ApiTestCase {
 		$this->assertEquals( $expected, $text );
 	}
 
-	function testEditSection() {
-		$this->markTestIncomplete( "not yet implemented" );
+	/**
+	 * Test editing of sections
+	 */
+	public function testEditSection() {
+		$name = 'Help:ApiEditPageTest_testEditSection';
+		$page = WikiPage::factory( Title::newFromText( $name ) );
+		$text = "==section 1==\ncontent 1\n==section 2==\ncontent2";
+		// Preload the page with some text
+		$page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), 'summary' );
+
+		list( $re ) = $this->doApiRequestWithToken( array(
+			'action' => 'edit',
+			'title' => $name,
+			'section' => '1',
+			'text' => "==section 1==\nnew content 1",
+		) );
+		$this->assertEquals( 'Success', $re['edit']['result'] );
+		$newtext = WikiPage::factory( Title::newFromText( $name) )->getContent( Revision::RAW )->getNativeData();
+		$this->assertEquals( $newtext, "==section 1==\nnew content 1\n\n==section 2==\ncontent2" );
+
+		// Test that we raise a 'nosuchsection' error
+		try {
+			$this->doApiRequestWithToken( array(
+				'action' => 'edit',
+				'title' => $name,
+				'section' => '9999',
+				'text' => 'text',
+			) );
+			$this->fail( "Should have raised a UsageException" );
+		} catch ( UsageException $e ) {
+			$this->assertEquals( $e->getCodeString(), 'nosuchsection' );
+		}
 	}
 
-	function testUndo() {
-		$this->markTestIncomplete( "not yet implemented" );
+	/**
+	 * Test action=edit&section=new
+	 * Run it twice so we test adding a new section on a
+	 * page that doesn't exist (bug 52830) and one that
+	 * does exist
+	 */
+	public function testEditNewSection() {
+		$name = 'Help:ApiEditPageTest_testEditNewSection';
+
+		// Test on a page that does not already exist
+		$this->assertFalse( Title::newFromText( $name )->exists() );
+		list( $re ) = $this->doApiRequestWithToken( array(
+			'action' => 'edit',
+			'title' => $name,
+			'section' => 'new',
+			'text' => 'test',
+			'summary' => 'header',
+		));
+
+		$this->assertEquals( 'Success', $re['edit']['result'] );
+		// Check the page text is correct
+		$text = WikiPage::factory( Title::newFromText( $name ) )->getContent( Revision::RAW )->getNativeData();
+		$this->assertEquals( $text, "== header ==\n\ntest" );
+
+		// Now on one that does
+		$this->assertTrue( Title::newFromText( $name )->exists() );
+		list( $re2 ) = $this->doApiRequestWithToken( array(
+			'action' => 'edit',
+			'title' => $name,
+			'section' => 'new',
+			'text' => 'test',
+			'summary' => 'header',
+		));
+
+		$this->assertEquals( 'Success', $re2['edit']['result'] );
+		$text = WikiPage::factory( Title::newFromText( $name ) )->getContent( Revision::RAW )->getNativeData();
+		$this->assertEquals( $text, "== header ==\n\ntest\n\n== header ==\n\ntest" );
 	}
 
-	function testEditConflict() {
+	public function testEditConflict() {
 		static $count = 0;
 		$count++;
 
@@ -224,7 +289,7 @@ class ApiEditPageTest extends ApiTestCase {
 
 		// try to save edit, expect conflict
 		try {
-			list( $re, , ) = $this->doApiRequestWithToken( array(
+			$this->doApiRequestWithToken( array(
 				'action' => 'edit',
 				'title' => $name,
 				'text' => 'nix bar!',
@@ -237,7 +302,7 @@ class ApiEditPageTest extends ApiTestCase {
 		}
 	}
 
-	function testEditConflict_redirect() {
+	public function testEditConflict_redirect() {
 		static $count = 0;
 		$count++;
 
@@ -280,7 +345,7 @@ class ApiEditPageTest extends ApiTestCase {
 
 		// try again, without following the redirect. Should fail.
 		try {
-			list( $re, , ) = $this->doApiRequestWithToken( array(
+			$this->doApiRequestWithToken( array(
 				'action' => 'edit',
 				'title' => $rname,
 				'text' => 'nix bar!',
@@ -293,13 +358,13 @@ class ApiEditPageTest extends ApiTestCase {
 		}
 	}
 
-	function testEditConflict_bug41990() {
+	public function testEditConflict_bug41990() {
 		static $count = 0;
 		$count++;
 
 		/*
 		* bug 41990: if the target page has a newer revision than the redirect, then editing the
-		* redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erronously
+		* redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erroneously
 		* caused an edit conflict to be detected.
 		*/
 
diff --git a/tests/phpunit/includes/api/ApiOptionsTest.php b/tests/phpunit/includes/api/ApiOptionsTest.php
index 902b7b85..ad1e73ab 100644
--- a/tests/phpunit/includes/api/ApiOptionsTest.php
+++ b/tests/phpunit/includes/api/ApiOptionsTest.php
@@ -20,9 +20,11 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 			->disableOriginalConstructor()
 			->getMock();
 
-		// Set up groups
+		// Set up groups and rights
 		$this->mUserMock->expects( $this->any() )
 			->method( 'getEffectiveGroups' )->will( $this->returnValue( array( '*', 'user' ) ) );
+		$this->mUserMock->expects( $this->any() )
+			->method( 'isAllowed' )->will( $this->returnValue( true ) );
 
 		// Set up callback for User::getOptionKinds
 		$this->mUserMock->expects( $this->any() )
@@ -116,6 +118,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 				$mapping[$key] = 'unused';
 			}
 		}
+
 		return $mapping;
 	}
 
@@ -126,12 +129,14 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 			'optionname' => null,
 			'optionvalue' => null,
 		);
+
 		return array_merge( $request, $custom );
 	}
 
 	private function executeQuery( $request ) {
 		$this->mContext->setRequest( new FauxRequest( $request, true, $this->mSession ) );
 		$this->mTested->execute();
+
 		return $this->mTested->getResult()->getData();
 	}
 
@@ -156,6 +161,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 		} catch ( UsageException $e ) {
 			$this->assertEquals( 'notloggedin', $e->getCodeString() );
 			$this->assertEquals( 'Anonymous users cannot change preferences', $e->getMessage() );
+
 			return;
 		}
 		$this->fail( "UsageException was not thrown" );
@@ -169,6 +175,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 		} catch ( UsageException $e ) {
 			$this->assertEquals( 'nooptionname', $e->getCodeString() );
 			$this->assertEquals( 'The optionname parameter must be set', $e->getMessage() );
+
 			return;
 		}
 		$this->fail( "UsageException was not thrown" );
@@ -191,6 +198,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 		} catch ( UsageException $e ) {
 			$this->assertEquals( 'nochanges', $e->getCodeString() );
 			$this->assertEquals( 'No changes were requested', $e->getMessage() );
+
 			return;
 		}
 		$this->fail( "UsageException was not thrown" );
@@ -274,21 +282,21 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 		$this->mUserMock->expects( $this->at( 2 ) )
 			->method( 'getOptions' );
 
-		$this->mUserMock->expects( $this->at( 3 ) )
+		$this->mUserMock->expects( $this->at( 4 ) )
 			->method( 'setOption' )
 			->with( $this->equalTo( 'willBeNull' ), $this->identicalTo( null ) );
 
-		$this->mUserMock->expects( $this->at( 4 ) )
+		$this->mUserMock->expects( $this->at( 5 ) )
 			->method( 'getOptions' );
 
-		$this->mUserMock->expects( $this->at( 5 ) )
+		$this->mUserMock->expects( $this->at( 6 ) )
 			->method( 'setOption' )
 			->with( $this->equalTo( 'willBeEmpty' ), $this->equalTo( '' ) );
 
-		$this->mUserMock->expects( $this->at( 6 ) )
+		$this->mUserMock->expects( $this->at( 7 ) )
 			->method( 'getOptions' );
 
-		$this->mUserMock->expects( $this->at( 7 ) )
+		$this->mUserMock->expects( $this->at( 8 ) )
 			->method( 'setOption' )
 			->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
 
@@ -306,17 +314,17 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 		$this->mUserMock->expects( $this->once() )
 			->method( 'resetOptions' );
 
-		$this->mUserMock->expects( $this->at( 3 ) )
+		$this->mUserMock->expects( $this->at( 4 ) )
 			->method( 'getOptions' );
 
-		$this->mUserMock->expects( $this->at( 4 ) )
+		$this->mUserMock->expects( $this->at( 5 ) )
 			->method( 'setOption' )
 			->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
 
-		$this->mUserMock->expects( $this->at( 5 ) )
+		$this->mUserMock->expects( $this->at( 6 ) )
 			->method( 'getOptions' );
 
-		$this->mUserMock->expects( $this->at( 6 ) )
+		$this->mUserMock->expects( $this->at( 7 ) )
 			->method( 'setOption' )
 			->with( $this->equalTo( 'name' ), $this->equalTo( 'value' ) );
 
@@ -339,19 +347,19 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 		$this->mUserMock->expects( $this->never() )
 			->method( 'resetOptions' );
 
-		$this->mUserMock->expects( $this->at( 2 ) )
+		$this->mUserMock->expects( $this->at( 3 ) )
 			->method( 'setOption' )
 			->with( $this->equalTo( 'testmultiselect-opt1' ), $this->identicalTo( true ) );
 
-		$this->mUserMock->expects( $this->at( 3 ) )
+		$this->mUserMock->expects( $this->at( 4 ) )
 			->method( 'setOption' )
 			->with( $this->equalTo( 'testmultiselect-opt2' ), $this->identicalTo( null ) );
 
-		$this->mUserMock->expects( $this->at( 4 ) )
+		$this->mUserMock->expects( $this->at( 5 ) )
 			->method( 'setOption' )
 			->with( $this->equalTo( 'testmultiselect-opt3' ), $this->identicalTo( false ) );
 
-		$this->mUserMock->expects( $this->at( 5 ) )
+		$this->mUserMock->expects( $this->at( 6 ) )
 			->method( 'setOption' )
 			->with( $this->equalTo( 'testmultiselect-opt4' ), $this->identicalTo( false ) );
 
@@ -394,7 +402,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 		$this->mUserMock->expects( $this->never() )
 			->method( 'resetOptions' );
 
-		$this->mUserMock->expects( $this->at( 2 ) )
+		$this->mUserMock->expects( $this->at( 3 ) )
 			->method( 'setOption' )
 			->with( $this->equalTo( 'userjs-option' ), $this->equalTo( '1' ) );
 
diff --git a/tests/phpunit/includes/api/ApiParseTest.php b/tests/phpunit/includes/api/ApiParseTest.php
index a42e5aa5..2d714e65 100644
--- a/tests/phpunit/includes/api/ApiParseTest.php
+++ b/tests/phpunit/includes/api/ApiParseTest.php
@@ -12,11 +12,11 @@ class ApiParseTest extends ApiTestCase {
 		$this->doLogin();
 	}
 
-	function testParseNonexistentPage() {
+	public function testParseNonexistentPage() {
 		$somePage = mt_rand();
 
 		try {
-			$data = $this->doApiRequest( array(
+			$this->doApiRequest( array(
 				'action' => 'parse',
 				'page' => $somePage ) );
 
@@ -26,5 +26,4 @@ class ApiParseTest extends ApiTestCase {
 				"Parse request for nonexistent page must give 'missingtitle' error: " . var_export( $ex->getMessageArray(), true ) );
 		}
 	}
-
 }
diff --git a/tests/phpunit/includes/api/ApiPurgeTest.php b/tests/phpunit/includes/api/ApiPurgeTest.php
index a7f9229d..28b5ff4d 100644
--- a/tests/phpunit/includes/api/ApiPurgeTest.php
+++ b/tests/phpunit/includes/api/ApiPurgeTest.php
@@ -15,7 +15,7 @@ class ApiPurgeTest extends ApiTestCase {
 	/**
 	 * @group Broken
 	 */
-	function testPurgeMainPage() {
+	public function testPurgeMainPage() {
 		if ( !Title::newFromText( 'UTPage' )->exists() ) {
 			$this->markTestIncomplete( "The article [[UTPage]] does not exist" );
 		}
@@ -37,5 +37,4 @@ class ApiPurgeTest extends ApiTestCase {
 			$this->assertArrayHasKey( $pages[$v['title']], $v );
 		}
 	}
-
 }
diff --git a/tests/phpunit/includes/api/ApiTest.php b/tests/phpunit/includes/api/ApiTest.php
index 22770288..472f8c4a 100644
--- a/tests/phpunit/includes/api/ApiTest.php
+++ b/tests/phpunit/includes/api/ApiTest.php
@@ -7,7 +7,7 @@
  */
 class ApiTest extends ApiTestCase {
 
-	function testRequireOnlyOneParameterDefault() {
+	public function testRequireOnlyOneParameterDefault() {
 		$mock = new MockApi();
 
 		$this->assertEquals(
@@ -18,7 +18,7 @@ class ApiTest extends ApiTestCase {
 	/**
 	 * @expectedException UsageException
 	 */
-	function testRequireOnlyOneParameterZero() {
+	public function testRequireOnlyOneParameterZero() {
 		$mock = new MockApi();
 
 		$this->assertEquals(
@@ -29,7 +29,7 @@ class ApiTest extends ApiTestCase {
 	/**
 	 * @expectedException UsageException
 	 */
-	function testRequireOnlyOneParameterTrue() {
+	public function testRequireOnlyOneParameterTrue() {
 		$mock = new MockApi();
 
 		$this->assertEquals(
@@ -43,7 +43,7 @@ class ApiTest extends ApiTestCase {
 	 *
 	 * @expectedException UsageException
 	 */
-	function testApi() {
+	public function testApi() {
 		$api = new ApiMain(
 			new FauxRequest( array( 'action' => 'help', 'format' => 'xml' ) )
 		);
@@ -61,14 +61,14 @@ class ApiTest extends ApiTestCase {
 	/**
 	 * Test result of attempted login with an empty username
 	 */
-	function testApiLoginNoName() {
+	public function testApiLoginNoName() {
 		$data = $this->doApiRequest( array( 'action' => 'login',
 			'lgname' => '', 'lgpassword' => self::$users['sysop']->password,
 		) );
 		$this->assertEquals( 'NoName', $data[0]['login']['result'] );
 	}
 
-	function testApiLoginBadPass() {
+	public function testApiLoginBadPass() {
 		global $wgServer;
 
 		$user = self::$users['sysop'];
@@ -81,8 +81,7 @@ class ApiTest extends ApiTestCase {
 			"action" => "login",
 			"lgname" => $user->username,
 			"lgpassword" => "bad",
-			)
-		);
+		) );
 
 		$result = $ret[0];
 
@@ -110,7 +109,7 @@ class ApiTest extends ApiTestCase {
 		$this->assertEquals( "WrongPass", $a );
 	}
 
-	function testApiLoginGoodPass() {
+	public function testApiLoginGoodPass() {
 		global $wgServer;
 
 		if ( !isset( $wgServer ) ) {
@@ -136,7 +135,7 @@ class ApiTest extends ApiTestCase {
 		$token = $result["login"]["token"];
 
 		$ret = $this->doApiRequest(
-	 		array(
+			array(
 				"action" => "login",
 				"lgtoken" => $token,
 				"lgname" => $user->username,
@@ -156,7 +155,7 @@ class ApiTest extends ApiTestCase {
 	/**
 	 * @group Broken
 	 */
-	function testApiGotCookie() {
+	public function testApiGotCookie() {
 		$this->markTestIncomplete( "The server can't do external HTTP requests, and the internal one won't give cookies" );
 
 		global $wgServer, $wgScriptPath;
@@ -202,7 +201,7 @@ class ApiTest extends ApiTestCase {
 		return $cj;
 	}
 
-	function testRunLogin() {
+	public function testRunLogin() {
 		$sysopUser = self::$users['sysop'];
 		$data = $this->doApiRequest( array(
 			'action' => 'login',
@@ -228,39 +227,33 @@ class ApiTest extends ApiTestCase {
 		return $data;
 	}
 
-	function testGettingToken() {
+	public function testGettingToken() {
 		foreach ( self::$users as $user ) {
 			$this->runTokenTest( $user );
 		}
 	}
 
 	function runTokenTest( $user ) {
-		$data = $this->getTokenList( $user );
-
-		$this->assertArrayHasKey( 'query', $data[0] );
-		$this->assertArrayHasKey( 'pages', $data[0]['query'] );
-		$keys = array_keys( $data[0]['query']['pages'] );
-		$key = array_pop( $keys );
+		$tokens = $this->getTokenList( $user );
 
 		$rights = $user->user->getRights();
 
-		$this->assertArrayHasKey( $key, $data[0]['query']['pages'] );
-		$this->assertArrayHasKey( 'edittoken', $data[0]['query']['pages'][$key] );
-		$this->assertArrayHasKey( 'movetoken', $data[0]['query']['pages'][$key] );
+		$this->assertArrayHasKey( 'edittoken', $tokens );
+		$this->assertArrayHasKey( 'movetoken', $tokens );
 
 		if ( isset( $rights['delete'] ) ) {
-			$this->assertArrayHasKey( 'deletetoken', $data[0]['query']['pages'][$key] );
+			$this->assertArrayHasKey( 'deletetoken', $tokens );
 		}
 
 		if ( isset( $rights['block'] ) ) {
-			$this->assertArrayHasKey( 'blocktoken', $data[0]['query']['pages'][$key] );
-			$this->assertArrayHasKey( 'unblocktoken', $data[0]['query']['pages'][$key] );
+			$this->assertArrayHasKey( 'blocktoken', $tokens );
+			$this->assertArrayHasKey( 'unblocktoken', $tokens );
 		}
 
 		if ( isset( $rights['protect'] ) ) {
-			$this->assertArrayHasKey( 'protecttoken', $data[0]['query']['pages'][$key] );
+			$this->assertArrayHasKey( 'protecttoken', $tokens );
 		}
 
-		return $data;
+		return $tokens;
 	}
 }
diff --git a/tests/phpunit/includes/api/ApiTestCase.php b/tests/phpunit/includes/api/ApiTestCase.php
index 552fbfbf..94ef9c68 100644
--- a/tests/phpunit/includes/api/ApiTestCase.php
+++ b/tests/phpunit/includes/api/ApiTestCase.php
@@ -52,6 +52,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
 	protected function editPage( $pageName, $text, $summary = '', $defaultNs = NS_MAIN ) {
 		$title = Title::newFromText( $pageName, $defaultNs );
 		$page = WikiPage::factory( $title );
+
 		return $page->doEditContent( ContentHandler::makeContent( $text, $title ), $summary );
 	}
 
@@ -131,17 +132,22 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
 			$session['wsEditToken'] = $session['wsToken'];
 			// add token to request parameters
 			$params['token'] = md5( $session['wsToken'] ) . User::EDIT_TOKEN_SUFFIX;
+
 			return $this->doApiRequest( $params, $session, false, $user );
 		} else {
 			throw new Exception( "request data not in right format" );
 		}
 	}
 
-	protected function doLogin() {
+	protected function doLogin( $user = 'sysop' ) {
+		if ( !array_key_exists( $user, self::$users ) ) {
+			throw new MWException( "Can not log in to undefined user $user" );
+		}
+
 		$data = $this->doApiRequest( array(
 			'action' => 'login',
-			'lgname' => self::$users['sysop']->username,
-			'lgpassword' => self::$users['sysop']->password ) );
+			'lgname' => self::$users[ $user ]->username,
+			'lgpassword' => self::$users[ $user ]->password ) );
 
 		$token = $data[0]['login']['token'];
 
@@ -149,8 +155,8 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
 			array(
 				'action' => 'login',
 				'lgtoken' => $token,
-				'lgname' => self::$users['sysop']->username,
-				'lgpassword' => self::$users['sysop']->password,
+				'lgname' => self::$users[ $user ]->username,
+				'lgpassword' => self::$users[ $user ]->password,
 			),
 			$data[2]
 		);
@@ -160,11 +166,15 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
 
 	protected function getTokenList( $user, $session = null ) {
 		$data = $this->doApiRequest( array(
-			'action' => 'query',
-			'titles' => 'Main Page',
-			'intoken' => 'edit|delete|protect|move|block|unblock|watch',
-			'prop' => 'info' ), $session, false, $user->user );
-		return $data;
+			'action' => 'tokens',
+			'type' => 'edit|delete|protect|move|block|unblock|watch'
+		), $session, false, $user->user );
+
+		if ( !array_key_exists( 'tokens', $data[0] ) ) {
+			throw new MWException( 'Api failed to return a token list' );
+		}
+
+		return $data[0]['tokens'];
 	}
 
 	public function testApiTestGroup() {
@@ -204,11 +214,14 @@ class UserWrapper {
 }
 
 class MockApi extends ApiBase {
-	public function execute() {}
+	public function execute() {
+	}
 
-	public function getVersion() {}
+	public function getVersion() {
+	}
 
-	public function __construct() {}
+	public function __construct() {
+	}
 
 	public function getAllowedParams() {
 		return array(
@@ -234,6 +247,7 @@ class ApiTestContext extends RequestContext {
 		if ( $user !== null ) {
 			$context->setUser( $user );
 		}
+
 		return $context;
 	}
 }
diff --git a/tests/phpunit/includes/api/ApiTestCaseUpload.php b/tests/phpunit/includes/api/ApiTestCaseUpload.php
index 80284917..7e18b6ed 100644
--- a/tests/phpunit/includes/api/ApiTestCaseUpload.php
+++ b/tests/phpunit/includes/api/ApiTestCaseUpload.php
@@ -47,6 +47,7 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
 			// see if it now doesn't exist; reload
 			$title = Title::newFromText( $title->getText(), NS_FILE );
 		}
+
 		return !( $title && $title instanceof Title && $title->exists() );
 	}
 
@@ -69,6 +70,7 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
 		foreach ( $dupes as $dupe ) {
 			$success &= $this->deleteFileByTitle( $dupe->getTitle() );
 		}
+
 		return $success;
 	}
 
@@ -105,7 +107,6 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
 		);
 
 		return true;
-
 	}
 
 	function fakeUploadChunk( $fieldName, $fileName, $type, & $chunkData ) {
@@ -145,5 +146,4 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
 	function clearFakeUploads() {
 		$_FILES = array();
 	}
-
 }
diff --git a/tests/phpunit/includes/api/ApiUploadTest.php b/tests/phpunit/includes/api/ApiUploadTest.php
index 0d98b04d..1540af55 100644
--- a/tests/phpunit/includes/api/ApiUploadTest.php
+++ b/tests/phpunit/includes/api/ApiUploadTest.php
@@ -16,7 +16,7 @@
 
 // TODO: port the other Upload tests, and other API tests to this framework
 
-require_once( 'ApiTestCaseUpload.php' );
+require_once 'ApiTestCaseUpload.php';
 
 /**
  * @group Database
@@ -27,12 +27,11 @@ require_once( 'ApiTestCaseUpload.php' );
  * This is pretty sucky... needs to be prettified.
  */
 class ApiUploadTest extends ApiTestCaseUpload {
-
 	/**
 	 * Testing login
 	 * XXX this is a funny way of getting session context
 	 */
-	function testLogin() {
+	public function testLogin() {
 		$user = self::$users['uploader'];
 
 		$params = array(
@@ -59,8 +58,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
 		$this->assertArrayHasKey( 'lgtoken', $result['login'] );
 
 		$this->assertNotEmpty( $session, 'API Login must return a session' );
-		return $session;
 
+		return $session;
 	}
 
 	/**
@@ -118,7 +117,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
 		$this->deleteFileByFileName( $fileName );
 		$this->deleteFileByContent( $filePath );
 
-
 		if ( !$this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath ) ) {
 			$this->markTestIncomplete( "Couldn't upload file!\n" );
 		}
@@ -140,7 +138,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 		}
 		$this->assertTrue( isset( $result['upload'] ) );
 		$this->assertEquals( 'Success', $result['upload']['result'] );
-		$this->assertEquals( $fileSize, ( int )$result['upload']['imageinfo']['size'] );
+		$this->assertEquals( $fileSize, (int)$result['upload']['imageinfo']['size'] );
 		$this->assertEquals( $mimeType, $result['upload']['imageinfo']['mime'] );
 		$this->assertFalse( $exception );
 
@@ -298,7 +296,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
 		$exception = false;
 		try {
-			list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+			list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
 				self::$users['uploader']->user );
 		} catch ( UsageException $e ) {
 			$exception = true;
@@ -307,7 +305,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
 		$this->assertEquals( 'Success', $result['upload']['result'] );
 		$this->assertFalse( $exception );
 
-
 		// second upload with the same content (but different name)
 
 		if ( !$this->fakeUploadFile( 'file', $fileNames[1], $mimeType, $filePaths[0] ) ) {
@@ -324,7 +321,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
 		$exception = false;
 		try {
-			list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+			list( $result ) = $this->doApiRequestWithToken( $params, $session,
 				self::$users['uploader']->user ); // FIXME: leaks a temporary file
 		} catch ( UsageException $e ) {
 			$exception = true;
@@ -341,7 +338,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
 		unlink( $filePaths[0] );
 	}
 
-
 	/**
 	 * @depends testLogin
 	 */
@@ -382,7 +378,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
 		$exception = false;
 		try {
-			list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+			list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
 				self::$users['uploader']->user ); // FIXME: leaks a temporary file
 		} catch ( UsageException $e ) {
 			$exception = true;
@@ -390,7 +386,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 		$this->assertFalse( $exception );
 		$this->assertTrue( isset( $result['upload'] ) );
 		$this->assertEquals( 'Success', $result['upload']['result'] );
-		$this->assertEquals( $fileSize, ( int )$result['upload']['imageinfo']['size'] );
+		$this->assertEquals( $fileSize, (int)$result['upload']['imageinfo']['size'] );
 		$this->assertEquals( $mimeType, $result['upload']['imageinfo']['mime'] );
 		$this->assertTrue( isset( $result['upload']['filekey'] ) );
 		$this->assertEquals( $result['upload']['sessionkey'], $result['upload']['filekey'] );
@@ -411,7 +407,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 		$this->clearFakeUploads();
 		$exception = false;
 		try {
-			list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+			list( $result ) = $this->doApiRequestWithToken( $params, $session,
 				self::$users['uploader']->user );
 		} catch ( UsageException $e ) {
 			$exception = true;
@@ -454,7 +450,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 		$this->deleteFileByFileName( $fileName );
 		$this->deleteFileByContent( $filePath );
 
-		// Base upload params: 
+		// Base upload params:
 		$params = array(
 			'action' => 'upload',
 			'stash' => 1,
@@ -466,7 +462,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 		// Upload chunks
 		$chunkSessionKey = false;
 		$resultOffset = 0;
-		// Open the file: 
+		// Open the file:
 		$handle = @fopen( $filePath, "r" );
 		if ( $handle === false ) {
 			$this->markTestIncomplete( "could not open file: $filePath" );
@@ -482,15 +478,15 @@ class ApiUploadTest extends ApiTestCaseUpload {
 			if ( !$chunkSessionKey ) {
 				// Upload fist chunk ( and get the session key )
 				try {
-					list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+					list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
 						self::$users['uploader']->user );
 				} catch ( UsageException $e ) {
 					$this->markTestIncomplete( $e->getMessage() );
 				}
-				// Make sure we got a valid chunk continue: 
+				// Make sure we got a valid chunk continue:
 				$this->assertTrue( isset( $result['upload'] ) );
 				$this->assertTrue( isset( $result['upload']['filekey'] ) );
-				// If we don't get a session key mark test incomplete. 
+				// If we don't get a session key mark test incomplete.
 				if ( !isset( $result['upload']['filekey'] ) ) {
 					$this->markTestIncomplete( "no filekey provided" );
 				}
@@ -509,16 +505,16 @@ class ApiUploadTest extends ApiTestCaseUpload {
 			$this->assertEquals( $resultOffset, $params['offset'] );
 			// Upload current chunk
 			try {
-				list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+				list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
 					self::$users['uploader']->user );
 			} catch ( UsageException $e ) {
 				$this->markTestIncomplete( $e->getMessage() );
 			}
-			// Make sure we got a valid chunk continue: 
+			// Make sure we got a valid chunk continue:
 			$this->assertTrue( isset( $result['upload'] ) );
 			$this->assertTrue( isset( $result['upload']['filekey'] ) );
 
-			// Check if we were on the last chunk: 
+			// Check if we were on the last chunk:
 			if ( $params['offset'] + $chunkSize >= $fileSize ) {
 				$this->assertEquals( 'Success', $result['upload']['result'] );
 				break;
@@ -548,7 +544,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 		$this->clearFakeUploads();
 		$exception = false;
 		try {
-			list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+			list( $result ) = $this->doApiRequestWithToken( $params, $session,
 				self::$users['uploader']->user );
 		} catch ( UsageException $e ) {
 			$exception = true;
@@ -559,7 +555,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
 		// clean up
 		$this->deleteFileByFilename( $fileName );
-		// don't remove downloaded temporary file for fast subquent tests. 
+		// don't remove downloaded temporary file for fast subquent tests.
 		//unlink( $filePath );
 	}
 }
diff --git a/tests/phpunit/includes/api/ApiWatchTest.php b/tests/phpunit/includes/api/ApiWatchTest.php
index aefd9398..028ea9ff 100644
--- a/tests/phpunit/includes/api/ApiWatchTest.php
+++ b/tests/phpunit/includes/api/ApiWatchTest.php
@@ -7,32 +7,25 @@
  * @todo This test suite is severly broken and need a full review
  */
 class ApiWatchTest extends ApiTestCase {
-
 	protected function setUp() {
 		parent::setUp();
 		$this->doLogin();
 	}
 
 	function getTokens() {
-		$data = $this->getTokenList( self::$users['sysop'] );
-
-		$keys = array_keys( $data[0]['query']['pages'] );
-		$key = array_pop( $keys );
-		$pageinfo = $data[0]['query']['pages'][$key];
-
-		return $pageinfo;
+		return $this->getTokenList( self::$users['sysop'] );
 	}
 
 	/**
 	 */
-	function testWatchEdit() {
-		$pageinfo = $this->getTokens();
+	public function testWatchEdit() {
+		$tokens = $this->getTokens();
 
 		$data = $this->doApiRequest( array(
 			'action' => 'edit',
 			'title' => 'Help:UTPage', // Help namespace is hopefully wikitext
 			'text' => 'new text',
-			'token' => $pageinfo['edittoken'],
+			'token' => $tokens['edittoken'],
 			'watchlist' => 'watch' ) );
 		$this->assertArrayHasKey( 'edit', $data[0] );
 		$this->assertArrayHasKey( 'result', $data[0]['edit'] );
@@ -44,9 +37,8 @@ class ApiWatchTest extends ApiTestCase {
 	/**
 	 * @depends testWatchEdit
 	 */
-	function testWatchClear() {
-
-		$pageinfo = $this->getTokens();
+	public function testWatchClear() {
+		$tokens = $this->getTokens();
 
 		$data = $this->doApiRequest( array(
 			'action' => 'query',
@@ -60,7 +52,7 @@ class ApiWatchTest extends ApiTestCase {
 					'action' => 'watch',
 					'title' => $page['title'],
 					'unwatch' => true,
-					'token' => $pageinfo['watchtoken'] ) );
+					'token' => $tokens['watchtoken'] ) );
 			}
 		}
 		$data = $this->doApiRequest( array(
@@ -75,13 +67,12 @@ class ApiWatchTest extends ApiTestCase {
 
 	/**
 	 */
-	function testWatchProtect() {
-
-		$pageinfo = $this->getTokens();
+	public function testWatchProtect() {
+		$tokens = $this->getTokens();
 
 		$data = $this->doApiRequest( array(
 			'action' => 'protect',
-			'token' => $pageinfo['protecttoken'],
+			'token' => $tokens['protecttoken'],
 			'title' => 'Help:UTPage',
 			'protections' => 'edit=sysop',
 			'watchlist' => 'unwatch' ) );
@@ -94,9 +85,8 @@ class ApiWatchTest extends ApiTestCase {
 
 	/**
 	 */
-	function testGetRollbackToken() {
-
-		$pageinfo = $this->getTokens();
+	public function testGetRollbackToken() {
+		$this->getTokens();
 
 		if ( !Title::newFromText( 'Help:UTPage' )->exists() ) {
 			$this->markTestSkipped( "The article [[Help:UTPage]] does not exist" ); //TODO: just create it?
@@ -131,7 +121,7 @@ class ApiWatchTest extends ApiTestCase {
 	 *
 	 * @depends testGetRollbackToken
 	 */
-	function testWatchRollback( $data ) {
+	public function testWatchRollback( $data ) {
 		$keys = array_keys( $data[0]['query']['pages'] );
 		$key = array_pop( $keys );
 		$pageinfo = $data[0]['query']['pages'][$key];
@@ -155,23 +145,4 @@ class ApiWatchTest extends ApiTestCase {
 			}
 		}
 	}
-
-	/**
-	 */
-	function testWatchDelete() {
-		$pageinfo = $this->getTokens();
-
-		$data = $this->doApiRequest( array(
-			'action' => 'delete',
-			'token' => $pageinfo['deletetoken'],
-			'title' => 'Help:UTPage' ) );
-		$this->assertArrayHasKey( 'delete', $data[0] );
-		$this->assertArrayHasKey( 'title', $data[0]['delete'] );
-
-		$data = $this->doApiRequest( array(
-			'action' => 'query',
-			'list' => 'watchlist' ) );
-
-		$this->markTestIncomplete( 'This test needs to verify the deleted article was added to the users watchlist' );
-	}
 }
diff --git a/tests/phpunit/includes/api/RandomImageGenerator.php b/tests/phpunit/includes/api/RandomImageGenerator.php
index 30407582..59756b21 100644
--- a/tests/phpunit/includes/api/RandomImageGenerator.php
+++ b/tests/phpunit/includes/api/RandomImageGenerator.php
@@ -34,7 +34,7 @@ class RandomImageGenerator {
 	private $shapesToDraw = 5;
 
 	/**
-	 * Orientations: 0th row, 0th column, EXIF orientation code, rotation 2x2 matrix that is opposite of orientation
+	 * Orientations: 0th row, 0th column, Exif orientation code, rotation 2x2 matrix that is opposite of orientation
 	 * n.b. we do not handle the 'flipped' orientations, which is why there is no entry for 2, 4, 5, or 7. Those
 	 * seem to be rare in real images anyway
 	 * (we also would need a non-symmetric shape for the images to test those, like a letter F)
@@ -108,6 +108,7 @@ class RandomImageGenerator {
 		foreach ( $filenames as $filename ) {
 			$this->{$imageWriteMethod}( $this->getImageSpec(), $format, $filename );
 		}
+
 		return $filenames;
 	}
 
@@ -156,7 +157,6 @@ class RandomImageGenerator {
 		}
 
 		return $filenames;
-
 	}
 
 
@@ -196,7 +196,6 @@ class RandomImageGenerator {
 				array( 'x' => $originX, 'y' => $originY - $radius )
 			);
 			$draws[] = $draw;
-
 		}
 
 		$spec['draws'] = $draws;
@@ -216,6 +215,7 @@ class RandomImageGenerator {
 		foreach ( $shape as $point ) {
 			$points[] = $point['x'] . ',' . $point['y'];
 		}
+
 		return join( " ", $points );
 	}
 
@@ -304,7 +304,7 @@ class RandomImageGenerator {
 
 	/**
 	 * Given an image specification, produce rotated version
-	 * This is used when simulating a rotated image capture with EXIF orientation
+	 * This is used when simulating a rotated image capture with Exif orientation
 	 * @param $spec Object returned by getImageSpec
 	 * @param $matrix 2x2 transformation matrix
 	 * @return transformed Spec
@@ -337,6 +337,7 @@ class RandomImageGenerator {
 			}
 			$tSpec['draws'][] = $tDraw;
 		}
+
 		return $tSpec;
 	}
 
@@ -384,6 +385,7 @@ class RandomImageGenerator {
 		$command = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " . implode( " ", $args );
 		$retval = null;
 		wfShellExec( $command, $retval );
+
 		return ( $retval === 0 );
 	}
 
@@ -397,6 +399,7 @@ class RandomImageGenerator {
 		for ( $i = 0; $i <= 2; $i++ ) {
 			$components[] = mt_rand( 0, 255 );
 		}
+
 		return 'rgb(' . join( ', ', $components ) . ')';
 	}
 
@@ -414,6 +417,7 @@ class RandomImageGenerator {
 		for ( $i = 0; $i < $count; $i += 2 ) {
 			$pairs[] = array( $lines[$i], $lines[$i + 1] );
 		}
+
 		return $pairs;
 	}
 
@@ -461,5 +465,4 @@ class RandomImageGenerator {
 
 		return $lines;
 	}
-
 }
diff --git a/tests/phpunit/includes/api/format/ApiFormatPhpTest.php b/tests/phpunit/includes/api/format/ApiFormatPhpTest.php
index a59983d8..a0bbb2dc 100644
--- a/tests/phpunit/includes/api/format/ApiFormatPhpTest.php
+++ b/tests/phpunit/includes/api/format/ApiFormatPhpTest.php
@@ -7,13 +7,11 @@
  */
 class ApiFormatPhpTest extends ApiFormatTestBase {
 
-	function testValidPhpSyntax() {
+	public function testValidPhpSyntax() {
 
 		$data = $this->apiRequest( 'php', array( 'action' => 'query', 'meta' => 'siteinfo' ) );
 
 		$this->assertInternalType( 'array', unserialize( $data ) );
 		$this->assertGreaterThan( 0, count( (array)$data ) );
-
 	}
-
 }
diff --git a/tests/phpunit/includes/api/generateRandomImages.php b/tests/phpunit/includes/api/generateRandomImages.php
index bdd15c48..87f5c4c0 100644
--- a/tests/phpunit/includes/api/generateRandomImages.php
+++ b/tests/phpunit/includes/api/generateRandomImages.php
@@ -6,8 +6,8 @@
  */
 
 // Start up MediaWiki in command-line mode
-require_once( __DIR__ . "/../../../../maintenance/Maintenance.php" );
-require( __DIR__ . "/RandomImageGenerator.php" );
+require_once __DIR__ . "/../../../../maintenance/Maintenance.php";
+require __DIR__ . "/RandomImageGenerator.php";
 
 class GenerateRandomImages extends Maintenance {
 
@@ -43,4 +43,4 @@ class GenerateRandomImages extends Maintenance {
 }
 
 $maintClass = 'GenerateRandomImages';
-require( RUN_MAINTENANCE_IF_MAIN );
+require RUN_MAINTENANCE_IF_MAIN;
diff --git a/tests/phpunit/includes/api/query/ApiQueryBasicTest.php b/tests/phpunit/includes/api/query/ApiQueryBasicTest.php
index 6d4e3711..1a2aa832 100644
--- a/tests/phpunit/includes/api/query/ApiQueryBasicTest.php
+++ b/tests/phpunit/includes/api/query/ApiQueryBasicTest.php
@@ -24,7 +24,7 @@
  * @file
  */
 
-require_once( 'ApiQueryTestBase.php' );
+require_once 'ApiQueryTestBase.php';
 
 /** These tests validate basic functionality of the api query module
  *
@@ -67,7 +67,10 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
 				'title' => 'AQBT-All',
 				'links' => array(
 					array( 'ns' => 0, 'title' => 'AQBT-Links' ),
-	) ) ) ) );
+				)
+			)
+		) )
+	);
 
 	private static $templates = array(
 		array( 'prop' => 'templates', 'titles' => 'AQBT-All' ),
@@ -78,7 +81,10 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
 				'title' => 'AQBT-All',
 				'templates' => array(
 					array( 'ns' => 10, 'title' => 'Template:AQBT-T' ),
-	) ) ) ) );
+				)
+			)
+		) )
+	);
 
 	private static $categories = array(
 		array( 'prop' => 'categories', 'titles' => 'AQBT-All' ),
@@ -89,7 +95,10 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
 				'title' => 'AQBT-All',
 				'categories' => array(
 					array( 'ns' => 14, 'title' => 'Category:AQBT-Cat' ),
-	) ) ) ) );
+				)
+			)
+		) )
+	);
 
 	private static $allpages = array(
 		array( 'list' => 'allpages', 'apprefix' => 'AQBT-' ),
@@ -98,7 +107,8 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
 			array( 'pageid' => 2, 'ns' => 0, 'title' => 'AQBT-Categories' ),
 			array( 'pageid' => 3, 'ns' => 0, 'title' => 'AQBT-Links' ),
 			array( 'pageid' => 4, 'ns' => 0, 'title' => 'AQBT-Templates' ),
-	) ) );
+		) )
+	);
 
 	private static $alllinks = array(
 		array( 'list' => 'alllinks', 'alprefix' => 'AQBT-' ),
@@ -107,40 +117,46 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
 			array( 'ns' => 0, 'title' => 'AQBT-Categories' ),
 			array( 'ns' => 0, 'title' => 'AQBT-Links' ),
 			array( 'ns' => 0, 'title' => 'AQBT-Templates' ),
-	) ) );
+		) )
+	);
 
 	private static $alltransclusions = array(
 		array( 'list' => 'alltransclusions', 'atprefix' => 'AQBT-' ),
 		array( 'alltransclusions' => array(
 			array( 'ns' => 10, 'title' => 'Template:AQBT-T' ),
 			array( 'ns' => 10, 'title' => 'Template:AQBT-T' ),
-	) ) );
+		) )
+	);
 
 	private static $allcategories = array(
 		array( 'list' => 'allcategories', 'acprefix' => 'AQBT-' ),
 		array( 'allcategories' => array(
 			array( '*' => 'AQBT-Cat' ),
-	) ) );
+		) )
+	);
 
 	private static $backlinks = array(
 		array( 'list' => 'backlinks', 'bltitle' => 'AQBT-Links' ),
 		array( 'backlinks' => array(
 			array( 'pageid' => 1, 'ns' => 0, 'title' => 'AQBT-All' ),
-	) ) );
+		) )
+	);
 
 	private static $embeddedin = array(
 		array( 'list' => 'embeddedin', 'eititle' => 'Template:AQBT-T' ),
 		array( 'embeddedin' => array(
 			array( 'pageid' => 1, 'ns' => 0, 'title' => 'AQBT-All' ),
 			array( 'pageid' => 4, 'ns' => 0, 'title' => 'AQBT-Templates' ),
-	) ) );
+		) )
+	);
 
 	private static $categorymembers = array(
 		array( 'list' => 'categorymembers', 'cmtitle' => 'Category:AQBT-Cat' ),
 		array( 'categorymembers' => array(
 			array( 'pageid' => 1, 'ns' => 0, 'title' => 'AQBT-All' ),
 			array( 'pageid' => 2, 'ns' => 0, 'title' => 'AQBT-Categories' ),
-	) ) );
+		) )
+	);
 
 	private static $generatorAllpages = array(
 		array( 'generator' => 'allpages', 'gapprefix' => 'AQBT-' ),
@@ -161,7 +177,8 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
 				'pageid' => 4,
 				'ns' => 0,
 				'title' => 'AQBT-Templates' ),
-	) ) );
+		) )
+	);
 
 	private static $generatorLinks = array(
 		array( 'generator' => 'links', 'titles' => 'AQBT-Links' ),
@@ -178,14 +195,17 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
 				'pageid' => 4,
 				'ns' => 0,
 				'title' => 'AQBT-Templates' ),
-	) ) );
+		) )
+	);
 
 	private static $generatorLinksPropLinks = array(
 		array( 'prop' => 'links' ),
 		array( 'pages' => array(
 			'1' => array( 'links' => array(
 				array( 'ns' => 0, 'title' => 'AQBT-Links' ),
-	) ) ) ) );
+			) )
+		) )
+	);
 
 	private static $generatorLinksPropTemplates = array(
 		array( 'prop' => 'templates' ),
@@ -194,7 +214,8 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
 				array( 'ns' => 10, 'title' => 'Template:AQBT-T' ) ) ),
 			'4' => array( 'templates' => array(
 				array( 'ns' => 10, 'title' => 'Template:AQBT-T' ) ) ),
-		) ) );
+		) )
+	);
 
 	/**
 	 * Test basic props
@@ -299,6 +320,32 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
 			self::$categorymembers ) );
 	}
 
+	/**
+	 * Test bug 51821
+	 */
+	public function testGeneratorRedirects() {
+		$this->editPage( 'AQBT-Target', 'test' );
+		$this->editPage( 'AQBT-Redir', '#REDIRECT [[AQBT-Target]]' );
+		$this->check( array(
+			array( 'generator' => 'backlinks', 'gbltitle' => 'AQBT-Target', 'redirects' => '1' ),
+			array(
+				'redirects' => array(
+					array(
+						'from' => 'AQBT-Redir',
+						'to' => 'AQBT-Target',
+					)
+				),
+				'pages' => array(
+					'6' => array(
+						'pageid' => 6,
+						'ns' => 0,
+						'title' => 'AQBT-Target',
+					)
+				),
+			)
+		) );
+	}
+
 	/**
 	 * Recursively merges the expected values in the $item into the $all
 	 */
diff --git a/tests/phpunit/includes/api/query/ApiQueryContinue2Test.php b/tests/phpunit/includes/api/query/ApiQueryContinue2Test.php
index 0a3ac1da..4d5ddbae 100644
--- a/tests/phpunit/includes/api/query/ApiQueryContinue2Test.php
+++ b/tests/phpunit/includes/api/query/ApiQueryContinue2Test.php
@@ -18,7 +18,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once( 'ApiQueryContinueTestBase.php' );
+require_once 'ApiQueryContinueTestBase.php';
 
 /**
  * @group API
@@ -48,7 +48,7 @@ class ApiQueryContinue2Test extends ApiQueryContinueTestBase {
 	 */
 	public function testA() {
 		$this->mVerbose = false;
-		$mk = function( $g, $p, $gDir ) {
+		$mk = function ( $g, $p, $gDir ) {
 			return array(
 				'generator' => 'allpages',
 				'gapprefix' => 'AQCT73462-',
@@ -59,10 +59,10 @@ class ApiQueryContinue2Test extends ApiQueryContinueTestBase {
 			);
 		};
 		// generator + 1 prop + 1 list
-		$data = $this->query( $mk(99,99,true), 1, 'g1p', false );
-		$this->checkC( $data, $mk(1,1,true), 6, 'g1p-11t' );
-		$this->checkC( $data, $mk(2,2,true), 3, 'g1p-22t' );
-		$this->checkC( $data, $mk(1,1,false), 6, 'g1p-11f' );
-		$this->checkC( $data, $mk(2,2,false), 3, 'g1p-22f' );
+		$data = $this->query( $mk( 99, 99, true ), 1, 'g1p', false );
+		$this->checkC( $data, $mk( 1, 1, true ), 6, 'g1p-11t' );
+		$this->checkC( $data, $mk( 2, 2, true ), 3, 'g1p-22t' );
+		$this->checkC( $data, $mk( 1, 1, false ), 6, 'g1p-11f' );
+		$this->checkC( $data, $mk( 2, 2, false ), 3, 'g1p-22f' );
 	}
 }
diff --git a/tests/phpunit/includes/api/query/ApiQueryContinueTest.php b/tests/phpunit/includes/api/query/ApiQueryContinueTest.php
index cb8f1812..f494e9ca 100644
--- a/tests/phpunit/includes/api/query/ApiQueryContinueTest.php
+++ b/tests/phpunit/includes/api/query/ApiQueryContinueTest.php
@@ -18,7 +18,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once( 'ApiQueryContinueTestBase.php' );
+require_once 'ApiQueryContinueTestBase.php';
 
 /**
  * These tests validate the new continue functionality of the api query module by
@@ -58,21 +58,21 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 	 */
 	public function test1List() {
 		$this->mVerbose = false;
-		$mk = function( $l ) {
+		$mk = function ( $l ) {
 			return array(
 				'list' => 'allpages',
 				'apprefix' => 'AQCT-',
 				'aplimit' => "$l",
 			);
 		};
-		$data = $this->query( $mk(99), 1, '1L', false );
+		$data = $this->query( $mk( 99 ), 1, '1L', false );
 
 		// 1 list
-		$this->checkC( $data, $mk(1), 5, '1L-1' );
-		$this->checkC( $data, $mk(2), 3, '1L-2' );
-		$this->checkC( $data, $mk(3), 2, '1L-3' );
-		$this->checkC( $data, $mk(4), 2, '1L-4' );
-		$this->checkC( $data, $mk(5), 1, '1L-5' );
+		$this->checkC( $data, $mk( 1 ), 5, '1L-1' );
+		$this->checkC( $data, $mk( 2 ), 3, '1L-2' );
+		$this->checkC( $data, $mk( 3 ), 2, '1L-3' );
+		$this->checkC( $data, $mk( 4 ), 2, '1L-4' );
+		$this->checkC( $data, $mk( 5 ), 1, '1L-5' );
 	}
 
 	/**
@@ -81,7 +81,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 	 */
 	public function test2Lists() {
 		$this->mVerbose = false;
-		$mk = function( $l1, $l2 ) {
+		$mk = function ( $l1, $l2 ) {
 			return array(
 				'list' => 'allpages|alltransclusions',
 				'apprefix' => 'AQCT-',
@@ -92,12 +92,12 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 			);
 		};
 		// 2 lists
-		$data = $this->query( $mk(99,99), 1, '2L', false );
-		$this->checkC( $data, $mk(1,1), 5, '2L-11' );
-		$this->checkC( $data, $mk(2,2), 3, '2L-22' );
-		$this->checkC( $data, $mk(3,3), 2, '2L-33' );
-		$this->checkC( $data, $mk(4,4), 2, '2L-44' );
-		$this->checkC( $data, $mk(5,5), 1, '2L-55' );
+		$data = $this->query( $mk( 99, 99 ), 1, '2L', false );
+		$this->checkC( $data, $mk( 1, 1 ), 5, '2L-11' );
+		$this->checkC( $data, $mk( 2, 2 ), 3, '2L-22' );
+		$this->checkC( $data, $mk( 3, 3 ), 2, '2L-33' );
+		$this->checkC( $data, $mk( 4, 4 ), 2, '2L-44' );
+		$this->checkC( $data, $mk( 5, 5 ), 1, '2L-55' );
 	}
 
 	/**
@@ -106,7 +106,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 	 */
 	public function testGen1Prop() {
 		$this->mVerbose = false;
-		$mk = function( $g, $p ) {
+		$mk = function ( $g, $p ) {
 			return array(
 				'generator' => 'allpages',
 				'gapprefix' => 'AQCT-',
@@ -116,12 +116,12 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 			);
 		};
 		// generator + 1 prop
-		$data = $this->query( $mk(99,99), 1, 'G1P', false );
-		$this->checkC( $data, $mk(1,1), 11, 'G1P-11' );
-		$this->checkC( $data, $mk(2,2), 6, 'G1P-22' );
-		$this->checkC( $data, $mk(3,3), 4, 'G1P-33' );
-		$this->checkC( $data, $mk(4,4), 3, 'G1P-44' );
-		$this->checkC( $data, $mk(5,5), 2, 'G1P-55' );
+		$data = $this->query( $mk( 99, 99 ), 1, 'G1P', false );
+		$this->checkC( $data, $mk( 1, 1 ), 11, 'G1P-11' );
+		$this->checkC( $data, $mk( 2, 2 ), 6, 'G1P-22' );
+		$this->checkC( $data, $mk( 3, 3 ), 4, 'G1P-33' );
+		$this->checkC( $data, $mk( 4, 4 ), 3, 'G1P-44' );
+		$this->checkC( $data, $mk( 5, 5 ), 2, 'G1P-55' );
 	}
 
 	/**
@@ -130,7 +130,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 	 */
 	public function testGen2Prop() {
 		$this->mVerbose = false;
-		$mk = function( $g, $p1, $p2 ) {
+		$mk = function ( $g, $p1, $p2 ) {
 			return array(
 				'generator' => 'allpages',
 				'gapprefix' => 'AQCT-',
@@ -141,17 +141,17 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 			);
 		};
 		// generator + 2 props
-		$data = $this->query( $mk(99,99,99), 1, 'G2P', false );
-		$this->checkC( $data, $mk(1,1,1), 16, 'G2P-111' );
-		$this->checkC( $data, $mk(2,2,2), 9, 'G2P-222' );
-		$this->checkC( $data, $mk(3,3,3), 6, 'G2P-333' );
-		$this->checkC( $data, $mk(4,4,4), 4, 'G2P-444' );
-		$this->checkC( $data, $mk(5,5,5), 2, 'G2P-555' );
-		$this->checkC( $data, $mk(5,1,1), 10, 'G2P-511' );
-		$this->checkC( $data, $mk(4,2,2), 7, 'G2P-422' );
-		$this->checkC( $data, $mk(2,3,3), 7, 'G2P-233' );
-		$this->checkC( $data, $mk(2,4,4), 5, 'G2P-244' );
-		$this->checkC( $data, $mk(1,5,5), 5, 'G2P-155' );
+		$data = $this->query( $mk( 99, 99, 99 ), 1, 'G2P', false );
+		$this->checkC( $data, $mk( 1, 1, 1 ), 16, 'G2P-111' );
+		$this->checkC( $data, $mk( 2, 2, 2 ), 9, 'G2P-222' );
+		$this->checkC( $data, $mk( 3, 3, 3 ), 6, 'G2P-333' );
+		$this->checkC( $data, $mk( 4, 4, 4 ), 4, 'G2P-444' );
+		$this->checkC( $data, $mk( 5, 5, 5 ), 2, 'G2P-555' );
+		$this->checkC( $data, $mk( 5, 1, 1 ), 10, 'G2P-511' );
+		$this->checkC( $data, $mk( 4, 2, 2 ), 7, 'G2P-422' );
+		$this->checkC( $data, $mk( 2, 3, 3 ), 7, 'G2P-233' );
+		$this->checkC( $data, $mk( 2, 4, 4 ), 5, 'G2P-244' );
+		$this->checkC( $data, $mk( 1, 5, 5 ), 5, 'G2P-155' );
 	}
 
 	/**
@@ -160,7 +160,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 	 */
 	public function testGen1Prop1List() {
 		$this->mVerbose = false;
-		$mk = function( $g, $p, $l ) {
+		$mk = function ( $g, $p, $l ) {
 			return array(
 				'generator' => 'allpages',
 				'gapprefix' => 'AQCT-',
@@ -174,24 +174,24 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 			);
 		};
 		// generator + 1 prop + 1 list
-		$data = $this->query( $mk(99,99,99), 1, 'G1P1L', false );
-		$this->checkC( $data, $mk(1,1,1), 11, 'G1P1L-111' );
-		$this->checkC( $data, $mk(2,2,2), 6, 'G1P1L-222' );
-		$this->checkC( $data, $mk(3,3,3), 4, 'G1P1L-333' );
-		$this->checkC( $data, $mk(4,4,4), 3, 'G1P1L-444' );
-		$this->checkC( $data, $mk(5,5,5), 2, 'G1P1L-555' );
-		$this->checkC( $data, $mk(5,5,1), 4, 'G1P1L-551' );
-		$this->checkC( $data, $mk(5,5,2), 2, 'G1P1L-552' );
+		$data = $this->query( $mk( 99, 99, 99 ), 1, 'G1P1L', false );
+		$this->checkC( $data, $mk( 1, 1, 1 ), 11, 'G1P1L-111' );
+		$this->checkC( $data, $mk( 2, 2, 2 ), 6, 'G1P1L-222' );
+		$this->checkC( $data, $mk( 3, 3, 3 ), 4, 'G1P1L-333' );
+		$this->checkC( $data, $mk( 4, 4, 4 ), 3, 'G1P1L-444' );
+		$this->checkC( $data, $mk( 5, 5, 5 ), 2, 'G1P1L-555' );
+		$this->checkC( $data, $mk( 5, 5, 1 ), 4, 'G1P1L-551' );
+		$this->checkC( $data, $mk( 5, 5, 2 ), 2, 'G1P1L-552' );
 	}
 
 	/**
 	 * Test smart continue - generator=allpages, prop=links|templates,
-	 *					   list=alllinks|alltransclusions, meta=siteinfo
+	 *                       list=alllinks|alltransclusions, meta=siteinfo
 	 * @medium
 	 */
 	public function testGen2Prop2List1Meta() {
 		$this->mVerbose = false;
-		$mk = function( $g, $p1, $p2, $l1, $l2 ) {
+		$mk = function ( $g, $p1, $p2, $l1, $l2 ) {
 			return array(
 				'generator' => 'allpages',
 				'gapprefix' => 'AQCT-',
@@ -211,16 +211,16 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 			);
 		};
 		// generator + 1 prop + 1 list
-		$data = $this->query( $mk(99,99,99,99,99), 1, 'G2P2L1M', false );
-		$this->checkC( $data, $mk(1,1,1,1,1), 16, 'G2P2L1M-11111' );
-		$this->checkC( $data, $mk(2,2,2,2,2), 9, 'G2P2L1M-22222' );
-		$this->checkC( $data, $mk(3,3,3,3,3), 6, 'G2P2L1M-33333' );
-		$this->checkC( $data, $mk(4,4,4,4,4), 4, 'G2P2L1M-44444' );
-		$this->checkC( $data, $mk(5,5,5,5,5), 2, 'G2P2L1M-55555' );
-		$this->checkC( $data, $mk(5,5,5,1,1), 4, 'G2P2L1M-55511' );
-		$this->checkC( $data, $mk(5,5,5,2,2), 2, 'G2P2L1M-55522' );
-		$this->checkC( $data, $mk(5,1,1,5,5), 10, 'G2P2L1M-51155' );
-		$this->checkC( $data, $mk(5,2,2,5,5), 5, 'G2P2L1M-52255' );
+		$data = $this->query( $mk( 99, 99, 99, 99, 99 ), 1, 'G2P2L1M', false );
+		$this->checkC( $data, $mk( 1, 1, 1, 1, 1 ), 16, 'G2P2L1M-11111' );
+		$this->checkC( $data, $mk( 2, 2, 2, 2, 2 ), 9, 'G2P2L1M-22222' );
+		$this->checkC( $data, $mk( 3, 3, 3, 3, 3 ), 6, 'G2P2L1M-33333' );
+		$this->checkC( $data, $mk( 4, 4, 4, 4, 4 ), 4, 'G2P2L1M-44444' );
+		$this->checkC( $data, $mk( 5, 5, 5, 5, 5 ), 2, 'G2P2L1M-55555' );
+		$this->checkC( $data, $mk( 5, 5, 5, 1, 1 ), 4, 'G2P2L1M-55511' );
+		$this->checkC( $data, $mk( 5, 5, 5, 2, 2 ), 2, 'G2P2L1M-55522' );
+		$this->checkC( $data, $mk( 5, 1, 1, 5, 5 ), 10, 'G2P2L1M-51155' );
+		$this->checkC( $data, $mk( 5, 2, 2, 5, 5 ), 5, 'G2P2L1M-52255' );
 	}
 
 	/**
@@ -229,7 +229,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 	 */
 	public function testSameGenAndProp() {
 		$this->mVerbose = false;
-		$mk = function( $g, $gDir, $p, $pDir ) {
+		$mk = function ( $g, $gDir, $p, $pDir ) {
 			return array(
 				'titles' => 'AQCT-1',
 				'generator' => 'templates',
@@ -241,31 +241,31 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 			);
 		};
 		// generator + 1 prop
-		$data = $this->query( $mk(99,true,99,true), 1, 'G=P', false );
+		$data = $this->query( $mk( 99, true, 99, true ), 1, 'G=P', false );
 
-		$this->checkC( $data, $mk(1,true,1,true), 4, 'G=P-1t1t' );
-		$this->checkC( $data, $mk(2,true,2,true), 2, 'G=P-2t2t' );
-		$this->checkC( $data, $mk(3,true,3,true), 2, 'G=P-3t3t' );
-		$this->checkC( $data, $mk(1,true,3,true), 4, 'G=P-1t3t' );
-		$this->checkC( $data, $mk(3,true,1,true), 2, 'G=P-3t1t' );
+		$this->checkC( $data, $mk( 1, true, 1, true ), 4, 'G=P-1t1t' );
+		$this->checkC( $data, $mk( 2, true, 2, true ), 2, 'G=P-2t2t' );
+		$this->checkC( $data, $mk( 3, true, 3, true ), 2, 'G=P-3t3t' );
+		$this->checkC( $data, $mk( 1, true, 3, true ), 4, 'G=P-1t3t' );
+		$this->checkC( $data, $mk( 3, true, 1, true ), 2, 'G=P-3t1t' );
 
-		$this->checkC( $data, $mk(1,true,1,false), 4, 'G=P-1t1f' );
-		$this->checkC( $data, $mk(2,true,2,false), 2, 'G=P-2t2f' );
-		$this->checkC( $data, $mk(3,true,3,false), 2, 'G=P-3t3f' );
-		$this->checkC( $data, $mk(1,true,3,false), 4, 'G=P-1t3f' );
-		$this->checkC( $data, $mk(3,true,1,false), 2, 'G=P-3t1f' );
+		$this->checkC( $data, $mk( 1, true, 1, false ), 4, 'G=P-1t1f' );
+		$this->checkC( $data, $mk( 2, true, 2, false ), 2, 'G=P-2t2f' );
+		$this->checkC( $data, $mk( 3, true, 3, false ), 2, 'G=P-3t3f' );
+		$this->checkC( $data, $mk( 1, true, 3, false ), 4, 'G=P-1t3f' );
+		$this->checkC( $data, $mk( 3, true, 1, false ), 2, 'G=P-3t1f' );
 
-		$this->checkC( $data, $mk(1,false,1,true), 4, 'G=P-1f1t' );
-		$this->checkC( $data, $mk(2,false,2,true), 2, 'G=P-2f2t' );
-		$this->checkC( $data, $mk(3,false,3,true), 2, 'G=P-3f3t' );
-		$this->checkC( $data, $mk(1,false,3,true), 4, 'G=P-1f3t' );
-		$this->checkC( $data, $mk(3,false,1,true), 2, 'G=P-3f1t' );
+		$this->checkC( $data, $mk( 1, false, 1, true ), 4, 'G=P-1f1t' );
+		$this->checkC( $data, $mk( 2, false, 2, true ), 2, 'G=P-2f2t' );
+		$this->checkC( $data, $mk( 3, false, 3, true ), 2, 'G=P-3f3t' );
+		$this->checkC( $data, $mk( 1, false, 3, true ), 4, 'G=P-1f3t' );
+		$this->checkC( $data, $mk( 3, false, 1, true ), 2, 'G=P-3f1t' );
 
-		$this->checkC( $data, $mk(1,false,1,false), 4, 'G=P-1f1f' );
-		$this->checkC( $data, $mk(2,false,2,false), 2, 'G=P-2f2f' );
-		$this->checkC( $data, $mk(3,false,3,false), 2, 'G=P-3f3f' );
-		$this->checkC( $data, $mk(1,false,3,false), 4, 'G=P-1f3f' );
-		$this->checkC( $data, $mk(3,false,1,false), 2, 'G=P-3f1f' );
+		$this->checkC( $data, $mk( 1, false, 1, false ), 4, 'G=P-1f1f' );
+		$this->checkC( $data, $mk( 2, false, 2, false ), 2, 'G=P-2f2f' );
+		$this->checkC( $data, $mk( 3, false, 3, false ), 2, 'G=P-3f3f' );
+		$this->checkC( $data, $mk( 1, false, 3, false ), 4, 'G=P-1f3f' );
+		$this->checkC( $data, $mk( 3, false, 1, false ), 2, 'G=P-3f1f' );
 	}
 
 	/**
@@ -274,7 +274,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 	 */
 	public function testSameGenList() {
 		$this->mVerbose = false;
-		$mk = function( $g, $gDir, $l, $pDir ) {
+		$mk = function ( $g, $gDir, $l, $pDir ) {
 			return array(
 				'generator' => 'allpages',
 				'gapprefix' => 'AQCT-',
@@ -287,27 +287,27 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
 			);
 		};
 		// generator + 1 list
-		$data = $this->query( $mk(99,true,99,true), 1, 'G=L', false );
+		$data = $this->query( $mk( 99, true, 99, true ), 1, 'G=L', false );
 
-		$this->checkC( $data, $mk(1,true,1,true), 5, 'G=L-1t1t' );
-		$this->checkC( $data, $mk(2,true,2,true), 3, 'G=L-2t2t' );
-		$this->checkC( $data, $mk(3,true,3,true), 2, 'G=L-3t3t' );
-		$this->checkC( $data, $mk(1,true,3,true), 5, 'G=L-1t3t' );
-		$this->checkC( $data, $mk(3,true,1,true), 5, 'G=L-3t1t' );
-		$this->checkC( $data, $mk(1,true,1,false), 5, 'G=L-1t1f' );
-		$this->checkC( $data, $mk(2,true,2,false), 3, 'G=L-2t2f' );
-		$this->checkC( $data, $mk(3,true,3,false), 2, 'G=L-3t3f' );
-		$this->checkC( $data, $mk(1,true,3,false), 5, 'G=L-1t3f' );
-		$this->checkC( $data, $mk(3,true,1,false), 5, 'G=L-3t1f' );
-		$this->checkC( $data, $mk(1,false,1,true), 5, 'G=L-1f1t' );
-		$this->checkC( $data, $mk(2,false,2,true), 3, 'G=L-2f2t' );
-		$this->checkC( $data, $mk(3,false,3,true), 2, 'G=L-3f3t' );
-		$this->checkC( $data, $mk(1,false,3,true), 5, 'G=L-1f3t' );
-		$this->checkC( $data, $mk(3,false,1,true), 5, 'G=L-3f1t' );
-		$this->checkC( $data, $mk(1,false,1,false), 5, 'G=L-1f1f' );
-		$this->checkC( $data, $mk(2,false,2,false), 3, 'G=L-2f2f' );
-		$this->checkC( $data, $mk(3,false,3,false), 2, 'G=L-3f3f' );
-		$this->checkC( $data, $mk(1,false,3,false), 5, 'G=L-1f3f' );
-		$this->checkC( $data, $mk(3,false,1,false), 5, 'G=L-3f1f' );
+		$this->checkC( $data, $mk( 1, true, 1, true ), 5, 'G=L-1t1t' );
+		$this->checkC( $data, $mk( 2, true, 2, true ), 3, 'G=L-2t2t' );
+		$this->checkC( $data, $mk( 3, true, 3, true ), 2, 'G=L-3t3t' );
+		$this->checkC( $data, $mk( 1, true, 3, true ), 5, 'G=L-1t3t' );
+		$this->checkC( $data, $mk( 3, true, 1, true ), 5, 'G=L-3t1t' );
+		$this->checkC( $data, $mk( 1, true, 1, false ), 5, 'G=L-1t1f' );
+		$this->checkC( $data, $mk( 2, true, 2, false ), 3, 'G=L-2t2f' );
+		$this->checkC( $data, $mk( 3, true, 3, false ), 2, 'G=L-3t3f' );
+		$this->checkC( $data, $mk( 1, true, 3, false ), 5, 'G=L-1t3f' );
+		$this->checkC( $data, $mk( 3, true, 1, false ), 5, 'G=L-3t1f' );
+		$this->checkC( $data, $mk( 1, false, 1, true ), 5, 'G=L-1f1t' );
+		$this->checkC( $data, $mk( 2, false, 2, true ), 3, 'G=L-2f2t' );
+		$this->checkC( $data, $mk( 3, false, 3, true ), 2, 'G=L-3f3t' );
+		$this->checkC( $data, $mk( 1, false, 3, true ), 5, 'G=L-1f3t' );
+		$this->checkC( $data, $mk( 3, false, 1, true ), 5, 'G=L-3f1t' );
+		$this->checkC( $data, $mk( 1, false, 1, false ), 5, 'G=L-1f1f' );
+		$this->checkC( $data, $mk( 2, false, 2, false ), 3, 'G=L-2f2f' );
+		$this->checkC( $data, $mk( 3, false, 3, false ), 2, 'G=L-3f3f' );
+		$this->checkC( $data, $mk( 1, false, 3, false ), 5, 'G=L-1f3f' );
+		$this->checkC( $data, $mk( 3, false, 1, false ), 5, 'G=L-3f1f' );
 	}
 }
diff --git a/tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php b/tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
index 47174796..fbb1e640 100644
--- a/tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
+++ b/tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
@@ -24,7 +24,7 @@
  * @file
  */
 
-require_once( 'ApiQueryTestBase.php' );
+require_once 'ApiQueryTestBase.php';
 
 abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
 
@@ -36,7 +36,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
 	/**
 	 * Run query() and compare against expected values
 	 */
-	protected function checkC( $expected, $params, $expectedCount, $id, $continue = true  ) {
+	protected function checkC( $expected, $params, $expectedCount, $id, $continue = true ) {
 		$result = $this->query( $params, $expectedCount, $id, $continue );
 		$this->assertResult( $expected, $result, $id );
 	}
@@ -52,7 +52,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
 	 */
 	protected function query( $params, $expectedCount, $id, $useContinue = true ) {
 		if ( isset( $params['action'] ) ) {
-			$this->assertEquals( 'query', $params['action'], 'Invalid query action');
+			$this->assertEquals( 'query', $params['action'], 'Invalid query action' );
 		} else {
 			$params['action'] = 'query';
 		}
@@ -64,17 +64,18 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
 		$continue = array();
 		do {
 			$request = array_merge( $params, $continue );
-			uksort( $request, function( $a, $b ) {
+			uksort( $request, function ( $a, $b ) {
 				// put 'continue' params at the end - lazy method
 				$a = strpos( $a, 'continue' ) !== false ? 'zzz ' . $a : $a;
 				$b = strpos( $b, 'continue' ) !== false ? 'zzz ' . $b : $b;
+
 				return strcmp( $a, $b );
 			} );
 			$reqStr = http_build_query( $request );
 			//$reqStr = str_replace( '&', ' & ', $reqStr );
 			$this->assertLessThan( $expectedCount, $count, "$id more data: $reqStr" );
 			if ( $this->mVerbose ) {
-				print ("$id (#$count): $reqStr\n");
+				print "$id (#$count): $reqStr\n";
 			}
 			try {
 				$data = $this->doApiRequest( $request );
@@ -103,52 +104,57 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
 				if ( $expectedCount > $count ) {
 					print "***** $id Finished early in $count turns. $expectedCount was expected\n";
 				}
+
 				return $result;
 			} elseif ( !$useContinue ) {
 				$this->assertFalse( 'Non-smart query must be requested all at once' );
 			}
-		} while( true );
+		} while ( true );
 	}
 
 	private function printResult( $data ) {
 		$q = $data['query'];
 		$print = array();
-		if (isset($q['pages'])) {
-			foreach ($q['pages'] as $p) {
+		if ( isset( $q['pages'] ) ) {
+			foreach ( $q['pages'] as $p ) {
 				$m = $p['title'];
-				if (isset($p['links'])) {
-					$m .= '/[' . implode(',', array_map(
-						function ($v) {
+				if ( isset( $p['links'] ) ) {
+					$m .= '/[' . implode( ',', array_map(
+						function ( $v ) {
 							return $v['title'];
 						},
-						$p['links'])) . ']';
+						$p['links'] ) ) . ']';
 				}
-				if (isset($p['categories'])) {
-					$m .= '/(' . implode(',', array_map(
-						function ($v) {
-							return str_replace('Category:', '', $v['title']);
+				if ( isset( $p['categories'] ) ) {
+					$m .= '/(' . implode( ',', array_map(
+						function ( $v ) {
+							return str_replace( 'Category:', '', $v['title'] );
 						},
-						$p['categories'])) . ')';
+						$p['categories'] ) ) . ')';
 				}
 				$print[] = $m;
 			}
 		}
-		if (isset($q['allcategories'])) {
-			$print[] = '*Cats/(' . implode(',', array_map(
-				function ($v) { return $v['*']; },
-				$q['allcategories'])) . ')';
+		if ( isset( $q['allcategories'] ) ) {
+			$print[] = '*Cats/(' . implode( ',', array_map(
+				function ( $v ) {
+					return $v['*'];
+				},
+				$q['allcategories'] ) ) . ')';
 		}
 		self::GetItems( $q, 'allpages', 'Pages', $print );
 		self::GetItems( $q, 'alllinks', 'Links', $print );
 		self::GetItems( $q, 'alltransclusions', 'Trnscl', $print );
-		print(' ' . implode('  ', $print) . "\n");
+		print ' ' . implode( '  ', $print ) . "\n";
 	}
 
 	private static function GetItems( $q, $moduleName, $name, &$print ) {
-		if (isset($q[$moduleName])) {
-			$print[] = "*$name/[" . implode(',',
-				array_map( function ($v) { return $v['title']; },
-						$q[$moduleName])) . ']';
+		if ( isset( $q[$moduleName] ) ) {
+			$print[] = "*$name/[" . implode( ',',
+				array_map( function ( $v ) {
+						return $v['title'];
+					},
+					$q[$moduleName] ) ) . ']';
 		}
 	}
 
@@ -164,12 +170,12 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
 			$this->assertEquals( $results, $newResult, 'Repeated result must be the same as before' );
 		} else {
 			$sort = null;
-			foreach( $newResult as $key => $value ) {
+			foreach ( $newResult as $key => $value ) {
 				if ( !$numericIds && $sort === null ) {
 					if ( !is_array( $value ) ) {
 						$sort = false;
 					} elseif ( array_key_exists( 'title', $value ) ) {
-						$sort = function( $a, $b ) {
+						$sort = function ( $a, $b ) {
 							return strcmp( $a['title'], $b['title'] );
 						};
 					} else {
diff --git a/tests/phpunit/includes/api/query/ApiQueryRevisionsTest.php b/tests/phpunit/includes/api/query/ApiQueryRevisionsTest.php
index 7f5fe91c..1bca2256 100644
--- a/tests/phpunit/includes/api/query/ApiQueryRevisionsTest.php
+++ b/tests/phpunit/includes/api/query/ApiQueryRevisionsTest.php
@@ -10,7 +10,7 @@ class ApiQueryRevisionsTest extends ApiTestCase {
 	/**
 	 * @group medium
 	 */
-	function testContentComesWithContentModelAndFormat() {
+	public function testContentComesWithContentModelAndFormat() {
 		$pageName = 'Help:' . __METHOD__;
 		$title = Title::newFromText( $pageName );
 		$page = WikiPage::factory( $title );
diff --git a/tests/phpunit/includes/api/query/ApiQueryTest.php b/tests/phpunit/includes/api/query/ApiQueryTest.php
index 7fb53073..f5645555 100644
--- a/tests/phpunit/includes/api/query/ApiQueryTest.php
+++ b/tests/phpunit/includes/api/query/ApiQueryTest.php
@@ -12,7 +12,7 @@ class ApiQueryTest extends ApiTestCase {
 		$this->doLogin();
 	}
 
-	function testTitlesGetNormalized() {
+	public function testTitlesGetNormalized() {
 
 		global $wgMetaNamespace;
 
@@ -20,7 +20,6 @@ class ApiQueryTest extends ApiTestCase {
 			'action' => 'query',
 			'titles' => 'Project:articleA|article_B' ) );
 
-
 		$this->assertArrayHasKey( 'query', $data[0] );
 		$this->assertArrayHasKey( 'normalized', $data[0]['query'] );
 
@@ -42,10 +41,9 @@ class ApiQueryTest extends ApiTestCase {
 			),
 			$data[0]['query']['normalized'][1]
 		);
-
 	}
 
-	function testTitlesAreRejectedIfInvalid() {
+	public function testTitlesAreRejectedIfInvalid() {
 		$title = false;
 		while ( !$title || Title::newFromText( $title )->exists() ) {
 			$title = md5( mt_rand( 0, 10000 ) + rand( 0, 999000 ) );
@@ -65,5 +63,4 @@ class ApiQueryTest extends ApiTestCase {
 		$this->assertArrayHasKey( 'missing', $data[0]['query']['pages'][-2] );
 		$this->assertArrayHasKey( 'invalid', $data[0]['query']['pages'][-1] );
 	}
-
 }
diff --git a/tests/phpunit/includes/api/query/ApiQueryTestBase.php b/tests/phpunit/includes/api/query/ApiQueryTestBase.php
index 7b9f8ede..8ee8ea96 100644
--- a/tests/phpunit/includes/api/query/ApiQueryTestBase.php
+++ b/tests/phpunit/includes/api/query/ApiQueryTestBase.php
@@ -24,7 +24,6 @@
  * @file
  */
 
-
 /** This class has some common functionality for testing query module
  */
 abstract class ApiQueryTestBase extends ApiTestCase {
@@ -43,11 +42,12 @@ STR;
 	protected function merge( /*...*/ ) {
 		$request = array();
 		$expected = array();
-		foreach	( func_get_args() as $v ) {
+		foreach ( func_get_args() as $v ) {
 			list( $req, $exp ) = $this->validateRequestExpectedPair( $v );
 			$request = array_merge_recursive( $request, $req );
 			$this->mergeExpected( $expected, $exp );
 		}
+
 		return array( $request, $expected );
 	}
 
@@ -57,11 +57,12 @@ STR;
 	 */
 	private function validateRequestExpectedPair( $v ) {
 		$this->assertType( 'array', $v, self::PARAM_ASSERT );
-		$this->assertEquals( 2, count($v), self::PARAM_ASSERT );
+		$this->assertEquals( 2, count( $v ), self::PARAM_ASSERT );
 		$this->assertArrayHasKey( 0, $v, self::PARAM_ASSERT );
 		$this->assertArrayHasKey( 1, $v, self::PARAM_ASSERT );
 		$this->assertType( 'array', $v[0], self::PARAM_ASSERT );
 		$this->assertType( 'array', $v[1], self::PARAM_ASSERT );
+
 		return $v;
 	}
 
@@ -71,7 +72,7 @@ STR;
 	private function mergeExpected( &$all, $item ) {
 		foreach ( $item as $k => $v ) {
 			if ( array_key_exists( $k, $all ) ) {
-				if ( is_array ( $all[$k] ) ) {
+				if ( is_array( $all[$k] ) ) {
 					$this->mergeExpected( $all[$k], $v );
 				} else {
 					$this->assertEquals( $all[$k], $v );
@@ -108,10 +109,10 @@ STR;
 			if ( is_array( $message ) ) {
 				$message = http_build_query( $message );
 			}
-			print( "\nRequest: $message\n" );
-			print( "\nExpected:\n" );
+			print "\nRequest: $message\n";
+			print "\nExpected:\n";
 			print_r( $exp );
-			print( "\nResult:\n" );
+			print "\nResult:\n";
 			print_r( $result );
 			throw $e; // rethrow it
 		}
diff --git a/tests/phpunit/includes/cache/GenderCacheTest.php b/tests/phpunit/includes/cache/GenderCacheTest.php
index ee3db3e8..ce2db5d7 100644
--- a/tests/phpunit/includes/cache/GenderCacheTest.php
+++ b/tests/phpunit/includes/cache/GenderCacheTest.php
@@ -46,8 +46,9 @@ class GenderCacheTest extends MediaWikiLangTestCase {
 	 * test usernames
 	 *
 	 * @dataProvider provideUserGenders
+	 * @covers GenderCache::getGenderOf
 	 */
-	function testUserName( $username, $expectedGender ) {
+	public function testUserName( $username, $expectedGender ) {
 		$genderCache = GenderCache::singleton();
 		$gender = $genderCache->getGenderOf( $username );
 		$this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
@@ -57,8 +58,9 @@ class GenderCacheTest extends MediaWikiLangTestCase {
 	 * genderCache should work with user objects, too
 	 *
 	 * @dataProvider provideUserGenders
+	 * @covers GenderCache::getGenderOf
 	 */
-	function testUserObjects( $username, $expectedGender ) {
+	public function testUserObjects( $username, $expectedGender ) {
 		$genderCache = GenderCache::singleton();
 		$user = User::newFromName( $username );
 		$gender = $genderCache->getGenderOf( $user );
@@ -82,8 +84,9 @@ class GenderCacheTest extends MediaWikiLangTestCase {
 	 * against the never existing username
 	 *
 	 * @dataProvider provideStripSubpages
+	 * @covers GenderCache::getGenderOf
 	 */
-	function testStripSubpages( $pageWithSubpage, $expectedGender ) {
+	public function testStripSubpages( $pageWithSubpage, $expectedGender ) {
 		$genderCache = GenderCache::singleton();
 		$gender = $genderCache->getGenderOf( $pageWithSubpage );
 		$this->assertEquals( $gender, $expectedGender, "GenderCache must strip of subpages" );
diff --git a/tests/phpunit/includes/cache/MessageCacheTest.php b/tests/phpunit/includes/cache/MessageCacheTest.php
new file mode 100644
index 00000000..803acf73
--- /dev/null
+++ b/tests/phpunit/includes/cache/MessageCacheTest.php
@@ -0,0 +1,128 @@
+<?php
+
+/**
+ * @group Database
+ * @group Cache
+ * @covers MessageCache
+ */
+class MessageCacheTest extends MediaWikiLangTestCase {
+
+	protected function setUp() {
+		parent::setUp();
+		$this->configureLanguages();
+		MessageCache::singleton()->enable();
+	}
+
+	/**
+	 * Helper function -- setup site language for testing
+	 */
+	protected function configureLanguages() {
+		// for the test, we need the content language to be anything but English,
+		// let's choose e.g. German (de)
+		$langCode = 'de';
+		$langObj = Language::factory( $langCode );
+
+		$this->setMwGlobals( array(
+			'wgLanguageCode' => $langCode,
+			'wgLang' => $langObj,
+			'wgContLang' => $langObj,
+		) );
+	}
+
+	function addDBData() {
+		$this->configureLanguages();
+
+		// Set up messages and fallbacks ab -> ru -> de
+		$this->makePage( 'FallbackLanguageTest-Full', 'ab' );
+		$this->makePage( 'FallbackLanguageTest-Full', 'ru' );
+		$this->makePage( 'FallbackLanguageTest-Full', 'de' );
+
+		// Fallbacks where ab does not exist
+		$this->makePage( 'FallbackLanguageTest-Partial', 'ru' );
+		$this->makePage( 'FallbackLanguageTest-Partial', 'de' );
+
+		// Fallback to the content language
+		$this->makePage( 'FallbackLanguageTest-ContLang', 'de' );
+
+		// Add customizations for an existing message.
+		$this->makePage( 'sunday', 'ru' );
+
+		// Full key tests -- always want russian
+		$this->makePage( 'MessageCacheTest-FullKeyTest', 'ab' );
+		$this->makePage( 'MessageCacheTest-FullKeyTest', 'ru' );
+
+		// In content language -- get base if no derivative
+		$this->makePage( 'FallbackLanguageTest-NoDervContLang', 'de', 'de/none', false );
+	}
+
+	/**
+	 * Helper function for addDBData -- adds a simple page to the database
+	 *
+	 * @param string $title Title of page to be created
+	 * @param string $lang  Language and content of the created page
+	 * @param string|null $content Content of the created page, or null for a generic string
+	 * @param bool $createSubPage Set to false if a root page should be created
+	 */
+	protected function makePage( $title, $lang, $content = null, $createSubPage = true ) {
+		global $wgContLang;
+
+		if ( $content === null ) {
+			$content = $lang;
+		}
+		if ( $lang !== $wgContLang->getCode() || $createSubPage ) {
+			$title = "$title/$lang";
+		}
+
+		$title = Title::newFromText( $title, NS_MEDIAWIKI );
+		$wikiPage = new WikiPage( $title );
+		$contentHandler = ContentHandler::makeContent( $content, $title );
+		$wikiPage->doEditContent( $contentHandler, "$lang translation test case" );
+	}
+
+	/**
+	 * Test message fallbacks, bug #1495
+	 *
+	 * @dataProvider provideMessagesForFallback
+	 */
+	public function testMessageFallbacks( $message, $lang, $expectedContent ) {
+		$result = MessageCache::singleton()->get( $message, true, $lang );
+		$this->assertEquals( $expectedContent, $result, "Message fallback failed." );
+	}
+
+	function provideMessagesForFallback() {
+		return array(
+			array( 'FallbackLanguageTest-Full', 'ab', 'ab' ),
+			array( 'FallbackLanguageTest-Partial', 'ab', 'ru' ),
+			array( 'FallbackLanguageTest-ContLang', 'ab', 'de' ),
+			array( 'FallbackLanguageTest-None', 'ab', false ),
+
+			// Existing message with customizations on the fallbacks
+			array( 'sunday', 'ab', 'амҽыш' ),
+
+			// bug 46579
+			array( 'FallbackLanguageTest-NoDervContLang', 'de', 'de/none' ),
+			// UI language different from content language should only use de/none as last option
+			array( 'FallbackLanguageTest-NoDervContLang', 'fit', 'de/none' ),
+		);
+	}
+
+	/**
+	 * There's a fallback case where the message key is given as fully qualified -- this
+	 * should ignore the passed $lang and use the language from the key
+	 *
+	 * @dataProvider provideMessagesForFullKeys
+	 */
+	public function testFullKeyBehaviour( $message, $lang, $expectedContent ) {
+		$result = MessageCache::singleton()->get( $message, true, $lang, true );
+		$this->assertEquals( $expectedContent, $result, "Full key message fallback failed." );
+	}
+
+	function provideMessagesForFullKeys() {
+		return array(
+			array( 'MessageCacheTest-FullKeyTest/ru', 'ru', 'ru' ),
+			array( 'MessageCacheTest-FullKeyTest/ru', 'ab', 'ru' ),
+			array( 'MessageCacheTest-FullKeyTest/ru/foo', 'ru', false ),
+		);
+	}
+
+}
diff --git a/tests/phpunit/includes/cache/ProcessCacheLRUTest.php b/tests/phpunit/includes/cache/ProcessCacheLRUTest.php
index c7e75d99..d3793d83 100644
--- a/tests/phpunit/includes/cache/ProcessCacheLRUTest.php
+++ b/tests/phpunit/includes/cache/ProcessCacheLRUTest.php
@@ -52,13 +52,14 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
 		for ( $i = $firstKey; $i <= $lastKey; $i++ ) {
 			$expected["cache-key-$i"] = array( "prop-$i" => "value-$i" );
 		}
+
 		return $expected;
 	}
 
 	/**
 	 * Highlight diff between assertEquals and assertNotSame
 	 */
-	function testPhpUnitArrayEquality() {
+	public function testPhpUnitArrayEquality() {
 		$one = array( 'A' => 1, 'B' => 2 );
 		$two = array( 'B' => 2, 'A' => 1 );
 		$this->assertEquals( $one, $two ); // ==
@@ -69,8 +70,8 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
 	 * @dataProvider provideInvalidConstructorArg
 	 * @expectedException MWException
 	 */
-	function testConstructorGivenInvalidValue( $maxSize ) {
-		$c = new ProcessCacheLRUTestable( $maxSize );
+	public function testConstructorGivenInvalidValue( $maxSize ) {
+		new ProcessCacheLRUTestable( $maxSize );
 	}
 
 	/**
@@ -87,7 +88,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testAddAndGetAKey() {
+	public function testAddAndGetAKey() {
 		$oneCache = new ProcessCacheLRUTestable( 1 );
 		$this->assertCacheEmpty( $oneCache );
 
@@ -98,7 +99,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
 		$this->assertEquals( 'value1', $oneCache->get( 'cache-key', 'prop1' ) );
 	}
 
-	function testDeleteOldKey() {
+	public function testDeleteOldKey() {
 		$oneCache = new ProcessCacheLRUTestable( 1 );
 		$this->assertCacheEmpty( $oneCache );
 
@@ -116,7 +117,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
 	 * @param $cacheMaxEntries Maximum entry the created cache will hold
 	 * @param $entryToFill Number of entries to insert in the created cache.
 	 */
-	function testFillingCache( $cacheMaxEntries, $entryToFill, $msg = '' ) {
+	public function testFillingCache( $cacheMaxEntries, $entryToFill, $msg = '' ) {
 		$cache = new ProcessCacheLRUTestable( $cacheMaxEntries );
 		$this->fillCache( $cache, $entryToFill );
 
@@ -125,7 +126,6 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
 			$cache->getCache(),
 			"Filling a $cacheMaxEntries entries cache with $entryToFill entries"
 		);
-
 	}
 
 	/**
@@ -145,7 +145,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
 	 * Create a cache with only one remaining entry then update
 	 * the first inserted entry. Should bump it to the top.
 	 */
-	function testReplaceExistingKeyShouldBumpEntryToTop() {
+	public function testReplaceExistingKeyShouldBumpEntryToTop() {
 		$maxEntries = 3;
 
 		$cache = new ProcessCacheLRUTestable( $maxEntries );
@@ -164,7 +164,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testRecentlyAccessedKeyStickIn() {
+	public function testRecentlyAccessedKeyStickIn() {
 		$cache = new ProcessCacheLRUTestable( 2 );
 		$cache->set( 'first', 'prop1', 'value1' );
 		$cache->set( 'second', 'prop2', 'value2' );
@@ -183,7 +183,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
 	 * Given a cache having 1,2,3 as key, updating 2 should bump 2 to
 	 * the top of the queue with the new value: 1,3,2* (* = updated).
 	 */
-	function testReplaceExistingKeyInAFullCacheShouldBumpToTop() {
+	public function testReplaceExistingKeyInAFullCacheShouldBumpToTop() {
 		$maxEntries = 3;
 
 		$cache = new ProcessCacheLRUTestable( $maxEntries );
@@ -204,7 +204,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testBumpExistingKeyToTop() {
+	public function testBumpExistingKeyToTop() {
 		$cache = new ProcessCacheLRUTestable( 3 );
 		$this->fillCache( $cache, 3 );
 
@@ -218,9 +218,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
 			),
 			$cache->getCache()
 		);
-
 	}
-
 }
 
 /**
diff --git a/tests/phpunit/includes/content/ContentHandlerTest.php b/tests/phpunit/includes/content/ContentHandlerTest.php
index 19ceadd5..aedf594d 100644
--- a/tests/phpunit/includes/content/ContentHandlerTest.php
+++ b/tests/phpunit/includes/content/ContentHandlerTest.php
@@ -10,9 +10,9 @@
  */
 class ContentHandlerTest extends MediaWikiTestCase {
 
-	public function setup() {
+	public function setUp() {
 		global $wgContLang;
-		parent::setup();
+		parent::setUp();
 
 		$this->setMwGlobals( array(
 			'wgExtraNamespaces' => array(
@@ -70,6 +70,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider dataGetDefaultModelFor
+	 * @covers ContentHandler::getDefaultModelFor
 	 */
 	public function testGetDefaultModelFor( $title, $expectedModelId ) {
 		$title = Title::newFromText( $title );
@@ -78,6 +79,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider dataGetDefaultModelFor
+	 * @covers ContentHandler::getForTitle
 	 */
 	public function testGetForTitle( $title, $expectedContentModel ) {
 		$title = Title::newFromText( $title );
@@ -97,6 +99,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider dataGetLocalizedName
+	 * @covers ContentHandler::getLocalizedName
 	 */
 	public function testGetLocalizedName( $id, $expected ) {
 		$name = ContentHandler::getLocalizedName( $id );
@@ -131,6 +134,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider dataGetPageLanguage
+	 * @covers ContentHandler::getPageLanguage
 	 */
 	public function testGetPageLanguage( $title, $expected ) {
 		if ( is_string( $title ) ) {
@@ -145,62 +149,81 @@ class ContentHandlerTest extends MediaWikiTestCase {
 		$this->assertEquals( $expected->getCode(), $lang->getCode() );
 	}
 
-	public function testGetContentText_Null() {
-		global $wgContentHandlerTextFallback;
+	public static function dataGetContentText_Null() {
+		return array(
+			array( 'fail' ),
+			array( 'serialize' ),
+			array( 'ignore' ),
+		);
+	}
 
-		$content = null;
+	/**
+	 * @dataProvider dataGetContentText_Null
+	 * @covers ContentHandler::getContentText
+	 */
+	public function testGetContentText_Null( $contentHandlerTextFallback ) {
+		$this->setMwGlobals( 'wgContentHandlerTextFallback', $contentHandlerTextFallback );
 
-		$wgContentHandlerTextFallback = 'fail';
-		$text = ContentHandler::getContentText( $content );
-		$this->assertEquals( '', $text );
+		$content = null;
 
-		$wgContentHandlerTextFallback = 'serialize';
 		$text = ContentHandler::getContentText( $content );
 		$this->assertEquals( '', $text );
+	}
 
-		$wgContentHandlerTextFallback = 'ignore';
-		$text = ContentHandler::getContentText( $content );
-		$this->assertEquals( '', $text );
+	public static function dataGetContentText_TextContent() {
+		return array(
+			array( 'fail' ),
+			array( 'serialize' ),
+			array( 'ignore' ),
+		);
 	}
 
-	public function testGetContentText_TextContent() {
-		global $wgContentHandlerTextFallback;
+	/**
+	 * @dataProvider dataGetContentText_TextContent
+	 * @covers ContentHandler::getContentText
+	 */
+	public function testGetContentText_TextContent( $contentHandlerTextFallback ) {
+		$this->setMwGlobals( 'wgContentHandlerTextFallback', $contentHandlerTextFallback );
 
 		$content = new WikitextContent( "hello world" );
 
-		$wgContentHandlerTextFallback = 'fail';
-		$text = ContentHandler::getContentText( $content );
-		$this->assertEquals( $content->getNativeData(), $text );
-
-		$wgContentHandlerTextFallback = 'serialize';
-		$text = ContentHandler::getContentText( $content );
-		$this->assertEquals( $content->serialize(), $text );
-
-		$wgContentHandlerTextFallback = 'ignore';
 		$text = ContentHandler::getContentText( $content );
 		$this->assertEquals( $content->getNativeData(), $text );
 	}
 
-	public function testGetContentText_NonTextContent() {
-		global $wgContentHandlerTextFallback;
+	/**
+	 * ContentHandler::getContentText should have thrown an exception for non-text Content object
+	 * @expectedException MWException
+	 * @covers ContentHandler::getContentText
+	 */
+	public function testGetContentText_NonTextContent_fail() {
+		$this->setMwGlobals( 'wgContentHandlerTextFallback', 'fail' );
 
 		$content = new DummyContentForTesting( "hello world" );
 
-		$wgContentHandlerTextFallback = 'fail';
+		ContentHandler::getContentText( $content );
+	}
 
-		try {
-			$text = ContentHandler::getContentText( $content );
+	/**
+	 * @covers ContentHandler::getContentText
+	 */
+	public function testGetContentText_NonTextContent_serialize() {
+		$this->setMwGlobals( 'wgContentHandlerTextFallback', 'serialize' );
 
-			$this->fail( "ContentHandler::getContentText should have thrown an exception for non-text Content object" );
-		} catch ( MWException $ex ) {
-			// as expected
-		}
+		$content = new DummyContentForTesting( "hello world" );
 
-		$wgContentHandlerTextFallback = 'serialize';
 		$text = ContentHandler::getContentText( $content );
 		$this->assertEquals( $content->serialize(), $text );
+	}
+
+	/**
+	 * @covers ContentHandler::getContentText
+	 */
+	public function testGetContentText_NonTextContent_ignore() {
+		$this->setMwGlobals( 'wgContentHandlerTextFallback', 'ignore' );
+
+		$content = new DummyContentForTesting( "hello world" );
 
-		$wgContentHandlerTextFallback = 'ignore';
 		$text = ContentHandler::getContentText( $content );
 		$this->assertNull( $text );
 	}
@@ -231,6 +254,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider dataMakeContent
+	 * @covers ContentHandler::makeContent
 	 */
 	public function testMakeContent( $data, $title, $modelId, $format, $expectedModelId, $expectedNativeData, $shouldFail ) {
 		$title = Title::newFromText( $title );
@@ -247,8 +271,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 		} catch ( MWException $ex ) {
 			if ( !$shouldFail ) {
 				$this->fail( "ContentHandler::makeContent failed unexpectedly: " . $ex->getMessage() );
-			}
-			else {
+			} else {
 				// dummy, so we don't get the "test did not perform any assertions" message.
 				$this->assertTrue( true );
 			}
@@ -261,6 +284,9 @@ class ContentHandlerTest extends MediaWikiTestCase {
 	}
 	*/
 
+	/**
+	 * @covers ContentHandler::runLegacyHooks
+	 */
 	public function testRunLegacyHooks() {
 		Hooks::register( 'testRunLegacyHooks', __CLASS__ . '::dummyHookHandler' );
 
@@ -308,6 +334,7 @@ class DummyContentHandlerForTesting extends ContentHandler {
 	 */
 	public function unserializeContent( $blob, $format = null ) {
 		$d = unserialize( $blob );
+
 		return new DummyContentForTesting( $d );
 	}
 
diff --git a/tests/phpunit/includes/content/CssContentTest.php b/tests/phpunit/includes/content/CssContentTest.php
index 8f53dd3e..bd6d41fe 100644
--- a/tests/phpunit/includes/content/CssContentTest.php
+++ b/tests/phpunit/includes/content/CssContentTest.php
@@ -50,12 +50,18 @@ class CssContentTest extends MediaWikiTestCase {
 		);
 	}
 
+	/**
+	 * @covers CssContent::getModel
+	 */
 	public function testGetModel() {
 		$content = $this->newContent( 'hello world.' );
 
 		$this->assertEquals( CONTENT_MODEL_CSS, $content->getModel() );
 	}
 
+	/**
+	 * @covers CssContent::getContentHandler
+	 */
 	public function testGetContentHandler() {
 		$content = $this->newContent( 'hello world.' );
 
@@ -73,9 +79,9 @@ class CssContentTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider dataEquals
+	 * @covers CssContent::equals
 	 */
 	public function testEquals( Content $a, Content $b = null, $equal = false ) {
 		$this->assertEquals( $equal, $a->equals( $b ) );
 	}
-
 }
diff --git a/tests/phpunit/includes/content/JavaScriptContentTest.php b/tests/phpunit/includes/content/JavaScriptContentTest.php
index 2d693feb..c8616ff0 100644
--- a/tests/phpunit/includes/content/JavaScriptContentTest.php
+++ b/tests/phpunit/includes/content/JavaScriptContentTest.php
@@ -89,6 +89,9 @@ class JavaScriptContentTest extends TextContentTest {
 		);
 	}
 
+	/**
+	 * @covers JavaScriptContent::addSectionHeader
+	 */
 	public function testAddSectionHeader() {
 		$content = $this->newContent( 'hello world' );
 		$c = $content->addSectionHeader( 'test' );
@@ -137,7 +140,7 @@ class JavaScriptContentTest extends TextContentTest {
 	}
 
 	/**
-	 * @todo: test needs database!
+	 * @todo Test needs database!
 	 */
 	/*
 	public function getRedirectChain() {
@@ -147,7 +150,7 @@ class JavaScriptContentTest extends TextContentTest {
 	*/
 
 	/**
-	 * @todo: test needs database!
+	 * @todo Test needs database!
 	 */
 	/*
 	public function getUltimateRedirectTarget() {
@@ -233,6 +236,9 @@ class JavaScriptContentTest extends TextContentTest {
 		);
 	}
 
+	/**
+	 * @covers JavaScriptContent::matchMagicWord
+	 */
 	public function testMatchMagicWord() {
 		$mw = MagicWord::get( "staticredirect" );
 
@@ -240,6 +246,9 @@ class JavaScriptContentTest extends TextContentTest {
 		$this->assertFalse( $content->matchMagicWord( $mw ), "should not have matched magic word, since it's not wikitext" );
 	}
 
+	/**
+	 * @covers JavaScriptContent::updateRedirect
+	 */
 	public function testUpdateRedirect() {
 		$target = Title::newFromText( "testUpdateRedirect_target" );
 
@@ -249,12 +258,18 @@ class JavaScriptContentTest extends TextContentTest {
 		$this->assertTrue( $content->equals( $newContent ), "content should be unchanged since it's not wikitext" );
 	}
 
+	/**
+	 * @covers JavaScriptContent::getModel
+	 */
 	public function testGetModel() {
 		$content = $this->newContent( "hello world." );
 
 		$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $content->getModel() );
 	}
 
+	/**
+	 * @covers JavaScriptContent::getContentHandler
+	 */
 	public function testGetContentHandler() {
 		$content = $this->newContent( "hello world." );
 
@@ -269,5 +284,4 @@ class JavaScriptContentTest extends TextContentTest {
 			array( new JavaScriptContent( "hallo" ), new JavaScriptContent( "HALLO" ), false ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/includes/content/TextContentTest.php b/tests/phpunit/includes/content/TextContentTest.php
index 382f71a8..a1f099f3 100644
--- a/tests/phpunit/includes/content/TextContentTest.php
+++ b/tests/phpunit/includes/content/TextContentTest.php
@@ -51,6 +51,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider dataGetParserOutput
+	 * @covers TextContent::getParserOutput
 	 */
 	public function testGetParserOutput( $title, $model, $text, $expectedHtml, $expectedFields = null ) {
 		$title = Title::newFromText( $title );
@@ -96,6 +97,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider dataPreSaveTransform
+	 * @covers TextContent::preSaveTransform
 	 */
 	public function testPreSaveTransform( $text, $expected ) {
 		global $wgContLang;
@@ -119,6 +121,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider dataPreloadTransform
+	 * @covers TextContent::preloadTransform
 	 */
 	public function testPreloadTransform( $text, $expected ) {
 		global $wgContLang;
@@ -140,6 +143,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider dataGetRedirectTarget
+	 * @covers TextContent::getRedirectTarget
 	 */
 	public function testGetRedirectTarget( $text, $expected ) {
 		$content = $this->newContent( $text );
@@ -154,6 +158,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider dataGetRedirectTarget
+	 * @covers TextContent::isRedirect
 	 */
 	public function testIsRedirect( $text, $expected ) {
 		$content = $this->newContent( $text );
@@ -162,7 +167,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 	}
 
 	/**
-	 * @todo: test needs database! Should be done by a test class in the Database group.
+	 * @todo Test needs database! Should be done by a test class in the Database group.
 	 */
 	/*
 	public function getRedirectChain() {
@@ -172,7 +177,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 	*/
 
 	/**
-	 * @todo: test needs database! Should be done by a test class in the Database group.
+	 * @todo Test needs database! Should be done by a test class in the Database group.
 	 */
 	/*
 	public function getUltimateRedirectTarget() {
@@ -209,17 +214,14 @@ class TextContentTest extends MediaWikiLangTestCase {
 	/**
 	 * @dataProvider dataIsCountable
 	 * @group Database
+	 * @covers TextContent::isCountable
 	 */
 	public function testIsCountable( $text, $hasLinks, $mode, $expected ) {
-		global $wgArticleCountMethod;
-
-		$old = $wgArticleCountMethod;
-		$wgArticleCountMethod = $mode;
+		$this->setMwGlobals( 'wgArticleCountMethod', $mode );
 
 		$content = $this->newContent( $text );
 
 		$v = $content->isCountable( $hasLinks, $this->context->getTitle() );
-		$wgArticleCountMethod = $old;
 
 		$this->assertEquals( $expected, $v, 'isCountable() returned unexpected value ' . var_export( $v, true )
 			. ' instead of ' . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
@@ -244,6 +246,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider dataGetTextForSummary
+	 * @covers TextContent::getTextForSummary
 	 */
 	public function testGetTextForSummary( $text, $maxlength, $expected ) {
 		$content = $this->newContent( $text );
@@ -251,12 +254,18 @@ class TextContentTest extends MediaWikiLangTestCase {
 		$this->assertEquals( $expected, $content->getTextForSummary( $maxlength ) );
 	}
 
+	/**
+	 * @covers TextContent::getTextForSearchIndex
+	 */
 	public function testGetTextForSearchIndex() {
 		$content = $this->newContent( 'hello world.' );
 
 		$this->assertEquals( 'hello world.', $content->getTextForSearchIndex() );
 	}
 
+	/**
+	 * @covers TextContent::copy
+	 */
 	public function testCopy() {
 		$content = $this->newContent( 'hello world.' );
 		$copy = $content->copy();
@@ -265,30 +274,45 @@ class TextContentTest extends MediaWikiLangTestCase {
 		$this->assertEquals( 'hello world.', $copy->getNativeData() );
 	}
 
+	/**
+	 * @covers TextContent::getSize
+	 */
 	public function testGetSize() {
 		$content = $this->newContent( 'hello world.' );
 
 		$this->assertEquals( 12, $content->getSize() );
 	}
 
+	/**
+	 * @covers TextContent::getNativeData
+	 */
 	public function testGetNativeData() {
 		$content = $this->newContent( 'hello world.' );
 
 		$this->assertEquals( 'hello world.', $content->getNativeData() );
 	}
 
+	/**
+	 * @covers TextContent::getWikitextForTransclusion
+	 */
 	public function testGetWikitextForTransclusion() {
 		$content = $this->newContent( 'hello world.' );
 
 		$this->assertEquals( 'hello world.', $content->getWikitextForTransclusion() );
 	}
 
+	/**
+	 * @covers TextContent::getModel
+	 */
 	public function testGetModel() {
 		$content = $this->newContent( "hello world." );
 
 		$this->assertEquals( CONTENT_MODEL_TEXT, $content->getModel() );
 	}
 
+	/**
+	 * @covers TextContent::getContentHandler
+	 */
 	public function testGetContentHandler() {
 		$content = $this->newContent( "hello world." );
 
@@ -306,6 +330,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider dataIsEmpty
+	 * @covers TextContent::isEmpty
 	 */
 	public function testIsEmpty( $text, $empty ) {
 		$content = $this->newContent( $text );
@@ -325,6 +350,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider dataEquals
+	 * @covers TextContent::equals
 	 */
 	public function testEquals( Content $a, Content $b = null, $equal = false ) {
 		$this->assertEquals( $equal, $a->equals( $b ) );
@@ -346,6 +372,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider dataGetDeletionUpdates
+	 * @covers TextContent::getDeletionUpdates
 	 */
 	public function testDeletionUpdates( $title, $model, $text, $expectedStuff ) {
 		$ns = $this->getDefaultWikitextNS();
@@ -414,6 +441,7 @@ class TextContentTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider provideConvert
+	 * @covers TextContent::convert
 	 */
 	public function testConvert( $text, $model, $lossy, $expectedNative ) {
 		$content = $this->newContent( $text );
@@ -427,5 +455,4 @@ class TextContentTest extends MediaWikiLangTestCase {
 			$this->assertEquals( $expectedNative, $converted->getNativeData() );
 		}
 	}
-
 }
diff --git a/tests/phpunit/includes/content/WikitextContentHandlerTest.php b/tests/phpunit/includes/content/WikitextContentHandlerTest.php
index 0f6a968b..75a72784 100644
--- a/tests/phpunit/includes/content/WikitextContentHandlerTest.php
+++ b/tests/phpunit/includes/content/WikitextContentHandlerTest.php
@@ -16,6 +16,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 		$this->handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
 	}
 
+	/**
+	 * @covers WikitextContentHandler::serializeContent
+	 */
 	public function testSerializeContent() {
 		$content = new WikitextContent( 'hello world' );
 
@@ -30,6 +33,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 		}
 	}
 
+	/**
+	 * @covers WikitextContentHandler::unserializeContent
+	 */
 	public function testUnserializeContent() {
 		$content = $this->handler->unserializeContent( 'hello world' );
 		$this->assertEquals( 'hello world', $content->getNativeData() );
@@ -45,6 +51,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 		}
 	}
 
+	/**
+	 * @covers WikitextContentHandler::makeEmptyContent
+	 */
 	public function testMakeEmptyContent() {
 		$content = $this->handler->makeEmptyContent();
 
@@ -60,8 +69,40 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 		);
 	}
 
+	/**
+	 * @dataProvider provideMakeRedirectContent
+	 * @param Title|string $title Title object or string for Title::newFromText()
+	 * @param string $expected Serialized form of the content object built
+	 * @covers WikitextContentHandler::makeRedirectContent
+	 */
+	public function testMakeRedirectContent( $title, $expected ) {
+		global $wgContLang;
+		$wgContLang->resetNamespaces();
+
+		if ( is_string( $title ) ) {
+			$title = Title::newFromText( $title );
+		}
+		$content = $this->handler->makeRedirectContent( $title );
+		$this->assertEquals( $expected, $content->serialize() );
+	}
+
+	public static function provideMakeRedirectContent() {
+		return array(
+			array( 'Hello', '#REDIRECT [[Hello]]' ),
+			array( 'Template:Hello', '#REDIRECT [[Template:Hello]]' ),
+			array( 'Hello#section', '#REDIRECT [[Hello#section]]' ),
+			array( 'user:john_doe#section', '#REDIRECT [[User:John doe#section]]' ),
+			array( 'MEDIAWIKI:FOOBAR', '#REDIRECT [[MediaWiki:FOOBAR]]' ),
+			array( 'Category:Foo', '#REDIRECT [[:Category:Foo]]' ),
+			array( Title::makeTitle( NS_MAIN, 'en:Foo' ), '#REDIRECT [[en:Foo]]' ),
+			array( Title::makeTitle( NS_MAIN, 'Foo', '', 'en' ), '#REDIRECT [[:en:Foo]]' ),
+			array( Title::makeTitle( NS_MAIN, 'Bar', 'fragment', 'google' ), '#REDIRECT [[google:Bar#fragment]]' ),
+		);
+	}
+
 	/**
 	 * @dataProvider dataIsSupportedFormat
+	 * @covers WikitextContentHandler::isSupportedFormat
 	 */
 	public function testIsSupportedFormat( $format, $supported ) {
 		$this->assertEquals( $supported, $this->handler->isSupportedFormat( $format ) );
@@ -101,6 +142,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider dataMerge3
+	 * @covers WikitextContentHandler::merge3
 	 */
 	public function testMerge3( $old, $mine, $yours, $expected ) {
 		$this->checkHasDiff3();
@@ -158,6 +200,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider dataGetAutosummary
+	 * @covers WikitextContentHandler::getAutosummary
 	 */
 	public function testGetAutosummary( $old, $new, $flags, $expected ) {
 		$oldContent = is_null( $old ) ? null : new WikitextContent( $old );
@@ -181,5 +224,4 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 	/*
 	public function testGetUndoContent( Revision $current, Revision $undo, Revision $undoafter = null ) {}
 	*/
-
 }
diff --git a/tests/phpunit/includes/content/WikitextContentTest.php b/tests/phpunit/includes/content/WikitextContentTest.php
index c9eecf7f..9f20073d 100644
--- a/tests/phpunit/includes/content/WikitextContentTest.php
+++ b/tests/phpunit/includes/content/WikitextContentTest.php
@@ -64,6 +64,7 @@ more stuff
 	/**
 	 * @dataProvider dataGetSecondaryDataUpdates
 	 * @group Database
+	 * @covers WikitextContent::getSecondaryDataUpdates
 	 */
 	public function testGetSecondaryDataUpdates( $title, $model, $text, $expectedStuff ) {
 		$ns = $this->getDefaultWikitextNS();
@@ -116,6 +117,7 @@ just a test"
 
 	/**
 	 * @dataProvider dataGetSection
+	 * @covers WikitextContent::getSection
 	 */
 	public function testGetSection( $text, $sectionId, $expectedText ) {
 		$content = $this->newContent( $text );
@@ -167,6 +169,7 @@ just a test"
 
 	/**
 	 * @dataProvider dataReplaceSection
+	 * @covers WikitextContent::replaceSection
 	 */
 	public function testReplaceSection( $text, $section, $with, $sectionTitle, $expected ) {
 		$content = $this->newContent( $text );
@@ -175,6 +178,9 @@ just a test"
 		$this->assertEquals( $expected, is_null( $c ) ? null : $c->getNativeData() );
 	}
 
+	/**
+	 * @covers WikitextContent::addSectionHeader
+	 */
 	public function testAddSectionHeader() {
 		$content = $this->newContent( 'hello world' );
 		$content = $content->addSectionHeader( 'test' );
@@ -240,7 +246,7 @@ just a test"
 	}
 
 	/**
-	 * @todo: test needs database! Should be done by a test class in the Database group.
+	 * @todo Test needs database! Should be done by a test class in the Database group.
 	 */
 	/*
 	public function getRedirectChain() {
@@ -250,7 +256,7 @@ just a test"
 	*/
 
 	/**
-	 * @todo: test needs database! Should be done by a test class in the Database group.
+	 * @todo Test needs database! Should be done by a test class in the Database group.
 	 */
 	/*
 	public function getUltimateRedirectTarget() {
@@ -319,6 +325,9 @@ just a test"
 		);
 	}
 
+	/**
+	 * @covers WikitextContent::matchMagicWord
+	 */
 	public function testMatchMagicWord() {
 		$mw = MagicWord::get( "staticredirect" );
 
@@ -329,6 +338,9 @@ just a test"
 		$this->assertFalse( $content->matchMagicWord( $mw ), "should not have matched magic word" );
 	}
 
+	/**
+	 * @covers WikitextContent::updateRedirect
+	 */
 	public function testUpdateRedirect() {
 		$target = Title::newFromText( "testUpdateRedirect_target" );
 
@@ -348,12 +360,18 @@ just a test"
 		$this->assertEquals( $target->getFullText(), $newContent->getRedirectTarget()->getFullText() );
 	}
 
+	/**
+	 * @covers WikitextContent::getModel
+	 */
 	public function testGetModel() {
 		$content = $this->newContent( "hello world." );
 
 		$this->assertEquals( CONTENT_MODEL_WIKITEXT, $content->getModel() );
 	}
 
+	/**
+	 * @covers WikitextContent::getContentHandler
+	 */
 	public function testGetContentHandler() {
 		$content = $this->newContent( "hello world." );
 
@@ -380,7 +398,7 @@ just a test"
 				CONTENT_MODEL_WIKITEXT, "hello [[world test 21344]]\n",
 				array( 'LinksDeletionUpdate' => array() )
 			),
-			// @todo: more...?
+			// @todo more...?
 		);
 	}
 }
diff --git a/tests/phpunit/includes/db/DatabaseMysqlBaseTest.php b/tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
new file mode 100644
index 00000000..ba63c091
--- /dev/null
+++ b/tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
@@ -0,0 +1,209 @@
+<?php
+/**
+ * Holds tests for DatabaseMysqlBase MediaWiki class.
+ *
+ * @section 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Antoine Musso
+ * @author Bryan Davis
+ * @copyright © 2013 Antoine Musso
+ * @copyright © 2013 Bryan Davis
+ * @copyright © 2013 Wikimedia Foundation Inc.
+ */
+
+/**
+ * Fake class around abstract class so we can call concrete methods.
+ */
+class FakeDatabaseMysqlBase extends DatabaseMysqlBase {
+	// From DatabaseBase
+	protected function closeConnection() {}
+	protected function doQuery( $sql ) {}
+
+	// From DatabaseMysql
+	protected function mysqlConnect( $realServer ) {}
+	protected function mysqlFreeResult( $res ) {}
+	protected function mysqlFetchObject( $res ) {}
+	protected function mysqlFetchArray( $res ) {}
+	protected function mysqlNumRows( $res ) {}
+	protected function mysqlNumFields( $res ) {}
+	protected function mysqlFieldName( $res, $n ) {}
+	protected function mysqlDataSeek( $res, $row ) {}
+	protected function mysqlError( $conn = null ) {}
+	protected function mysqlFetchField( $res, $n ) {}
+	protected function mysqlPing() {}
+
+	// From interface DatabaseType
+	function insertId() {}
+	function lastErrno() {}
+	function affectedRows() {}
+	function getServerVersion() {}
+}
+
+class DatabaseMysqlBaseTest extends MediaWikiTestCase {
+
+	/**
+	 * @dataProvider provideDiapers
+	 * @covers DatabaseMysqlBase::addIdentifierQuotes
+	 */
+	public function testAddIdentifierQuotes( $expected, $in ) {
+		$db = new FakeDatabaseMysqlBase();
+		$quoted = $db->addIdentifierQuotes( $in );
+		$this->assertEquals($expected, $quoted);
+	}
+
+
+	/**
+	 * Feeds testAddIdentifierQuotes
+	 *
+	 * Named per bug 20281 convention.
+	 */
+	function provideDiapers() {
+		return array(
+			// Format: expected, input
+			array( '``', '' ),
+
+			// Yeah I really hate loosely typed PHP idiocies nowadays
+			array( '``', null ),
+
+			// Dear codereviewer, guess what addIdentifierQuotes()
+			// will return with thoses:
+			array( '``', false ),
+			array( '`1`', true ),
+
+			// We never know what could happen
+			array( '`0`', 0 ),
+			array( '`1`', 1 ),
+
+			// Whatchout! Should probably use something more meaningful
+			array( "`'`", "'" ),  # single quote
+			array( '`"`', '"' ),  # double quote
+			array( '````', '`' ), # backtick
+			array( '`’`', '’' ),  # apostrophe (look at your encyclopedia)
+
+			// sneaky NUL bytes are lurking everywhere
+			array( '``', "\0" ),
+			array( '`xyzzy`', "\0x\0y\0z\0z\0y\0" ),
+
+			// unicode chars
+			array(
+				self::createUnicodeString( '`\u0001a\uFFFFb`' ),
+				self::createUnicodeString( '\u0001a\uFFFFb' )
+			),
+			array(
+				self::createUnicodeString( '`\u0001\uFFFF`' ),
+				self::createUnicodeString( '\u0001\u0000\uFFFF\u0000' )
+			),
+			array( '`☃`', '☃' ),
+			array( '`メインページ`', 'メインページ' ),
+			array( '`Басты_бет`', 'Басты_бет' ),
+
+			// Real world:
+			array( '`Alix`', 'Alix' ),  # while( ! $recovered ) { sleep(); }
+			array( '`Backtick: ```', 'Backtick: `' ),
+			array( '`This is a test`', 'This is a test' ),
+		);
+	}
+
+	private static function createUnicodeString($str) {
+		return json_decode( '"' . $str . '"' );
+	}
+
+	function getMockForViews() {
+		$db = $this->getMockBuilder( 'DatabaseMysql' )
+			->disableOriginalConstructor()
+			->setMethods( array( 'fetchRow', 'query' ) )
+			->getMock();
+
+		$db->expects( $this->any() )
+			->method( 'query' )
+			->with( $this->anything() )
+			->will(
+				$this->returnValue( null )
+			);
+
+		$db->expects( $this->any() )
+			->method( 'fetchRow' )
+			->with( $this->anything() )
+			->will( $this->onConsecutiveCalls(
+				array( 'Tables_in_' => 'view1' ),
+				array( 'Tables_in_' => 'view2' ),
+				array( 'Tables_in_' => 'myview' ),
+				false  # no more rows
+			));
+		return $db;
+	}
+	/**
+	 * @covers DatabaseMysqlBase::listViews
+	 */
+	function testListviews() {
+		$db = $this->getMockForViews();
+
+		// The first call populate an internal cache of views
+		$this->assertEquals( array( 'view1', 'view2', 'myview'),
+			$db->listViews() );
+		$this->assertEquals( array( 'view1', 'view2', 'myview'),
+			$db->listViews() );
+
+		// Prefix filtering
+		$this->assertEquals( array( 'view1', 'view2' ),
+			$db->listViews( 'view' ) );
+		$this->assertEquals( array( 'myview' ),
+			$db->listViews( 'my' ) );
+		$this->assertEquals( array(),
+			$db->listViews( 'UNUSED_PREFIX' ) );
+		$this->assertEquals( array( 'view1', 'view2', 'myview'),
+			$db->listViews( '' ) );
+	}
+
+	/**
+	 * @covers DatabaseMysqlBase::isView
+	 * @dataProvider provideViewExistanceChecks
+	 */
+	function testIsView( $isView, $viewName ) {
+		$db = $this->getMockForViews();
+
+		switch( $isView ) {
+			case true:
+				$this->assertTrue( $db->isView( $viewName ),
+					"$viewName should be considered a view" );
+			break;
+
+			case false:
+				$this->assertFalse( $db->isView( $viewName ),
+					"$viewName has not been defined as a view" );
+			break;
+		}
+
+	}
+
+	function provideViewExistanceChecks() {
+		return array(
+			// format: whether it is a view, view name
+			array( true, 'view1' ),
+			array( true, 'view2' ),
+			array( true, 'myview' ),
+
+			array( false, 'user' ),
+
+			array( false, 'view10' ),
+			array( false, 'my' ),
+			array( false, 'OH_MY_GOD' ),  # they killed kenny!
+		);
+	}
+
+}
diff --git a/tests/phpunit/includes/db/DatabaseSQLTest.php b/tests/phpunit/includes/db/DatabaseSQLTest.php
index 09792438..bdd567e7 100644
--- a/tests/phpunit/includes/db/DatabaseSQLTest.php
+++ b/tests/phpunit/includes/db/DatabaseSQLTest.php
@@ -2,35 +2,44 @@
 
 /**
  * Test the abstract database layer
- * Using Mysql for the sql at the moment TODO
- *
- * @group Database
+ * This is a non DBMS depending test.
  */
 class DatabaseSQLTest extends MediaWikiTestCase {
 
+	/**
+	 * @var DatabaseTestHelper
+	 */
+	private $database;
+
 	protected function setUp() {
 		parent::setUp();
-		// TODO support other DBMS or find another way to do it
-		if ( $this->db->getType() !== 'mysql' ) {
-			$this->markTestSkipped( 'No mysql database' );
-		}
+		$this->database = new DatabaseTestHelper( __CLASS__ );
+	}
+
+	protected function assertLastSql( $sqlText ) {
+		$this->assertEquals(
+			$this->database->getLastSqls(),
+			$sqlText
+		);
 	}
 
 	/**
-	 * @dataProvider provideSelectSQLText
+	 * @dataProvider provideSelect
+	 * @covers DatabaseBase::select
 	 */
-	function testSelectSQLText( $sql, $sqlText ) {
-		$this->assertEquals( trim( $this->db->selectSQLText(
-			isset( $sql['tables'] ) ? $sql['tables'] : array(),
-			isset( $sql['fields'] ) ? $sql['fields'] : array(),
+	public function testSelect( $sql, $sqlText ) {
+		$this->database->select(
+			$sql['tables'],
+			$sql['fields'],
 			isset( $sql['conds'] ) ? $sql['conds'] : array(),
 			__METHOD__,
 			isset( $sql['options'] ) ? $sql['options'] : array(),
 			isset( $sql['join_conds'] ) ? $sql['join_conds'] : array()
-		) ), $sqlText );
+		);
+		$this->assertLastSql( $sqlText );
 	}
 
-	public static function provideSelectSQLText() {
+	public static function provideSelect() {
 		return array(
 			array(
 				array(
@@ -38,8 +47,8 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 					'fields' => array( 'field', 'alias' => 'field2' ),
 					'conds' => array( 'alias' => 'text' ),
 				),
-				"SELECT  field,field2 AS alias  " .
-					"FROM `unittest_table`  " .
+				"SELECT field,field2 AS alias " .
+					"FROM table " .
 					"WHERE alias = 'text'"
 			),
 			array(
@@ -49,9 +58,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 					'conds' => array( 'alias' => 'text' ),
 					'options' => array( 'LIMIT' => 1, 'ORDER BY' => 'field' ),
 				),
-				"SELECT  field,field2 AS alias  " .
-					"FROM `unittest_table`  " .
-					"WHERE alias = 'text'  " .
+				"SELECT field,field2 AS alias " .
+					"FROM table " .
+					"WHERE alias = 'text' " .
 					"ORDER BY field " .
 					"LIMIT 1"
 			),
@@ -65,9 +74,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 						'LEFT JOIN', 'tid = t2.id'
 					) ),
 				),
-				"SELECT  tid,field,field2 AS alias,t2.id  " .
-					"FROM `unittest_table` LEFT JOIN `unittest_table2` `t2` ON ((tid = t2.id))  " .
-					"WHERE alias = 'text'  " .
+				"SELECT tid,field,field2 AS alias,t2.id " .
+					"FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
+					"WHERE alias = 'text' " .
 					"ORDER BY field " .
 					"LIMIT 1"
 			),
@@ -81,9 +90,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 						'LEFT JOIN', 'tid = t2.id'
 					) ),
 				),
-				"SELECT  tid,field,field2 AS alias,t2.id  " .
-					"FROM `unittest_table` LEFT JOIN `unittest_table2` `t2` ON ((tid = t2.id))  " .
-					"WHERE alias = 'text'  " .
+				"SELECT tid,field,field2 AS alias,t2.id " .
+					"FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
+					"WHERE alias = 'text' " .
 					"GROUP BY field HAVING COUNT(*) > 1 " .
 					"LIMIT 1"
 			),
@@ -97,20 +106,457 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 						'LEFT JOIN', 'tid = t2.id'
 					) ),
 				),
-				"SELECT  tid,field,field2 AS alias,t2.id  " .
-					"FROM `unittest_table` LEFT JOIN `unittest_table2` `t2` ON ((tid = t2.id))  " .
-					"WHERE alias = 'text'  " .
+				"SELECT tid,field,field2 AS alias,t2.id " .
+					"FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
+					"WHERE alias = 'text' " .
 					"GROUP BY field,field2 HAVING (COUNT(*) > 1) AND field = '1' " .
 					"LIMIT 1"
 			),
+			array(
+				array(
+					'tables' => array( 'table' ),
+					'fields' => array( 'alias' => 'field' ),
+					'conds' => array( 'alias' => array( 1, 2, 3, 4 ) ),
+				),
+				"SELECT field AS alias " .
+					"FROM table " .
+					"WHERE alias IN ('1','2','3','4')"
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider provideUpdate
+	 * @covers DatabaseBase::update
+	 */
+	public function testUpdate( $sql, $sqlText ) {
+		$this->database->update(
+			$sql['table'],
+			$sql['values'],
+			$sql['conds'],
+			__METHOD__,
+			isset( $sql['options'] ) ? $sql['options'] : array()
+		);
+		$this->assertLastSql( $sqlText );
+	}
+
+	public static function provideUpdate() {
+		return array(
+			array(
+				array(
+					'table' => 'table',
+					'values' => array( 'field' => 'text', 'field2' => 'text2' ),
+					'conds' => array( 'alias' => 'text' ),
+				),
+				"UPDATE table " .
+					"SET field = 'text'" .
+					",field2 = 'text2' " .
+					"WHERE alias = 'text'"
+			),
+			array(
+				array(
+					'table' => 'table',
+					'values' => array( 'field = other', 'field2' => 'text2' ),
+					'conds' => array( 'id' => '1' ),
+				),
+				"UPDATE table " .
+					"SET field = other" .
+					",field2 = 'text2' " .
+					"WHERE id = '1'"
+			),
+			array(
+				array(
+					'table' => 'table',
+					'values' => array( 'field = other', 'field2' => 'text2' ),
+					'conds' => '*',
+				),
+				"UPDATE table " .
+					"SET field = other" .
+					",field2 = 'text2'"
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider provideDelete
+	 * @covers DatabaseBase::delete
+	 */
+	public function testDelete( $sql, $sqlText ) {
+		$this->database->delete(
+			$sql['table'],
+			$sql['conds'],
+			__METHOD__
+		);
+		$this->assertLastSql( $sqlText );
+	}
+
+	public static function provideDelete() {
+		return array(
+			array(
+				array(
+					'table' => 'table',
+					'conds' => array( 'alias' => 'text' ),
+				),
+				"DELETE FROM table " .
+					"WHERE alias = 'text'"
+			),
+			array(
+				array(
+					'table' => 'table',
+					'conds' => '*',
+				),
+				"DELETE FROM table"
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider provideUpsert
+	 * @covers DatabaseBase::upsert
+	 */
+	public function testUpsert( $sql, $sqlText ) {
+		$this->database->upsert(
+			$sql['table'],
+			$sql['rows'],
+			$sql['uniqueIndexes'],
+			$sql['set'],
+			__METHOD__
+		);
+		$this->assertLastSql( $sqlText );
+	}
+
+	public static function provideUpsert() {
+		return array(
+			array(
+				array(
+					'table' => 'upsert_table',
+					'rows' => array( 'field' => 'text', 'field2' => 'text2' ),
+					'uniqueIndexes' => array( 'field' ),
+					'set' => array( 'field' => 'set' ),
+				),
+				"BEGIN; " .
+					"UPDATE upsert_table " .
+					"SET field = 'set' " .
+					"WHERE ((field = 'text')); " .
+					"INSERT IGNORE INTO upsert_table " .
+					"(field,field2) " .
+					"VALUES ('text','text2'); " .
+					"COMMIT"
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider provideDeleteJoin
+	 * @covers DatabaseBase::deleteJoin
+	 */
+	public function testDeleteJoin( $sql, $sqlText ) {
+		$this->database->deleteJoin(
+			$sql['delTable'],
+			$sql['joinTable'],
+			$sql['delVar'],
+			$sql['joinVar'],
+			$sql['conds'],
+			__METHOD__
+		);
+		$this->assertLastSql( $sqlText );
+	}
+
+	public static function provideDeleteJoin() {
+		return array(
+			array(
+				array(
+					'delTable' => 'table',
+					'joinTable' => 'table_join',
+					'delVar' => 'field',
+					'joinVar' => 'field_join',
+					'conds' => array( 'alias' => 'text' ),
+				),
+				"DELETE FROM table " .
+					"WHERE field IN (" .
+					"SELECT field_join FROM table_join WHERE alias = 'text'" .
+					")"
+			),
+			array(
+				array(
+					'delTable' => 'table',
+					'joinTable' => 'table_join',
+					'delVar' => 'field',
+					'joinVar' => 'field_join',
+					'conds' => '*',
+				),
+				"DELETE FROM table " .
+					"WHERE field IN (" .
+					"SELECT field_join FROM table_join " .
+					")"
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider provideInsert
+	 * @covers DatabaseBase::insert
+	 */
+	public function testInsert( $sql, $sqlText ) {
+		$this->database->insert(
+			$sql['table'],
+			$sql['rows'],
+			__METHOD__,
+			isset( $sql['options'] ) ? $sql['options'] : array()
+		);
+		$this->assertLastSql( $sqlText );
+	}
+
+	public static function provideInsert() {
+		return array(
+			array(
+				array(
+					'table' => 'table',
+					'rows' => array( 'field' => 'text', 'field2' => 2 ),
+				),
+				"INSERT INTO table " .
+					"(field,field2) " .
+					"VALUES ('text','2')"
+			),
+			array(
+				array(
+					'table' => 'table',
+					'rows' => array( 'field' => 'text', 'field2' => 2 ),
+					'options' => 'IGNORE',
+				),
+				"INSERT IGNORE INTO table " .
+					"(field,field2) " .
+					"VALUES ('text','2')"
+			),
+			array(
+				array(
+					'table' => 'table',
+					'rows' => array(
+						array( 'field' => 'text', 'field2' => 2 ),
+						array( 'field' => 'multi', 'field2' => 3 ),
+					),
+					'options' => 'IGNORE',
+				),
+				"INSERT IGNORE INTO table " .
+					"(field,field2) " .
+					"VALUES " .
+					"('text','2')," .
+					"('multi','3')"
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider provideInsertSelect
+	 * @covers DatabaseBase::insertSelect
+	 */
+	public function testInsertSelect( $sql, $sqlText ) {
+		$this->database->insertSelect(
+			$sql['destTable'],
+			$sql['srcTable'],
+			$sql['varMap'],
+			$sql['conds'],
+			__METHOD__,
+			isset( $sql['insertOptions'] ) ? $sql['insertOptions'] : array(),
+			isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : array()
+		);
+		$this->assertLastSql( $sqlText );
+	}
+
+	public static function provideInsertSelect() {
+		return array(
+			array(
+				array(
+					'destTable' => 'insert_table',
+					'srcTable' => 'select_table',
+					'varMap' => array( 'field_insert' => 'field_select', 'field' => 'field2' ),
+					'conds' => '*',
+				),
+				"INSERT INTO insert_table " .
+					"(field_insert,field) " .
+					"SELECT field_select,field2 " .
+					"FROM select_table"
+			),
+			array(
+				array(
+					'destTable' => 'insert_table',
+					'srcTable' => 'select_table',
+					'varMap' => array( 'field_insert' => 'field_select', 'field' => 'field2' ),
+					'conds' => array( 'field' => 2 ),
+				),
+				"INSERT INTO insert_table " .
+					"(field_insert,field) " .
+					"SELECT field_select,field2 " .
+					"FROM select_table " .
+					"WHERE field = '2'"
+			),
+			array(
+				array(
+					'destTable' => 'insert_table',
+					'srcTable' => 'select_table',
+					'varMap' => array( 'field_insert' => 'field_select', 'field' => 'field2' ),
+					'conds' => array( 'field' => 2 ),
+					'insertOptions' => 'IGNORE',
+					'selectOptions' => array( 'ORDER BY' => 'field' ),
+				),
+				"INSERT IGNORE INTO insert_table " .
+					"(field_insert,field) " .
+					"SELECT field_select,field2 " .
+					"FROM select_table " .
+					"WHERE field = '2' " .
+					"ORDER BY field"
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider provideReplace
+	 * @covers DatabaseBase::replace
+	 */
+	public function testReplace( $sql, $sqlText ) {
+		$this->database->replace(
+			$sql['table'],
+			$sql['uniqueIndexes'],
+			$sql['rows'],
+			__METHOD__
+		);
+		$this->assertLastSql( $sqlText );
+	}
+
+	public static function provideReplace() {
+		return array(
+			array(
+				array(
+					'table' => 'replace_table',
+					'uniqueIndexes' => array( 'field' ),
+					'rows' => array( 'field' => 'text', 'field2' => 'text2' ),
+				),
+				"DELETE FROM replace_table " .
+					"WHERE ( field='text' ); " .
+					"INSERT INTO replace_table " .
+					"(field,field2) " .
+					"VALUES ('text','text2')"
+			),
+			array(
+				array(
+					'table' => 'module_deps',
+					'uniqueIndexes' => array( array( 'md_module', 'md_skin' ) ),
+					'rows' => array(
+						'md_module' => 'module',
+						'md_skin' => 'skin',
+						'md_deps' => 'deps',
+					),
+				),
+				"DELETE FROM module_deps " .
+					"WHERE ( md_module='module' AND md_skin='skin' ); " .
+					"INSERT INTO module_deps " .
+					"(md_module,md_skin,md_deps) " .
+					"VALUES ('module','skin','deps')"
+			),
+			array(
+				array(
+					'table' => 'module_deps',
+					'uniqueIndexes' => array( array( 'md_module', 'md_skin' ) ),
+					'rows' => array(
+						array(
+							'md_module' => 'module',
+							'md_skin' => 'skin',
+							'md_deps' => 'deps',
+						), array(
+							'md_module' => 'module2',
+							'md_skin' => 'skin2',
+							'md_deps' => 'deps2',
+						),
+					),
+				),
+				"DELETE FROM module_deps " .
+					"WHERE ( md_module='module' AND md_skin='skin' ); " .
+					"INSERT INTO module_deps " .
+					"(md_module,md_skin,md_deps) " .
+					"VALUES ('module','skin','deps'); " .
+					"DELETE FROM module_deps " .
+					"WHERE ( md_module='module2' AND md_skin='skin2' ); " .
+					"INSERT INTO module_deps " .
+					"(md_module,md_skin,md_deps) " .
+					"VALUES ('module2','skin2','deps2')"
+			),
+			array(
+				array(
+					'table' => 'module_deps',
+					'uniqueIndexes' => array( 'md_module', 'md_skin' ),
+					'rows' => array(
+						array(
+							'md_module' => 'module',
+							'md_skin' => 'skin',
+							'md_deps' => 'deps',
+						), array(
+							'md_module' => 'module2',
+							'md_skin' => 'skin2',
+							'md_deps' => 'deps2',
+						),
+					),
+				),
+				"DELETE FROM module_deps " .
+					"WHERE ( md_module='module' ) OR ( md_skin='skin' ); " .
+					"INSERT INTO module_deps " .
+					"(md_module,md_skin,md_deps) " .
+					"VALUES ('module','skin','deps'); " .
+					"DELETE FROM module_deps " .
+					"WHERE ( md_module='module2' ) OR ( md_skin='skin2' ); " .
+					"INSERT INTO module_deps " .
+					"(md_module,md_skin,md_deps) " .
+					"VALUES ('module2','skin2','deps2')"
+			),
+			array(
+				array(
+					'table' => 'module_deps',
+					'uniqueIndexes' => array(),
+					'rows' => array(
+						'md_module' => 'module',
+						'md_skin' => 'skin',
+						'md_deps' => 'deps',
+					),
+				),
+				"INSERT INTO module_deps " .
+					"(md_module,md_skin,md_deps) " .
+					"VALUES ('module','skin','deps')"
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider provideNativeReplace
+	 * @covers DatabaseBase::nativeReplace
+	 */
+	public function testNativeReplace( $sql, $sqlText ) {
+		$this->database->nativeReplace(
+			$sql['table'],
+			$sql['rows'],
+			__METHOD__
+		);
+		$this->assertLastSql( $sqlText );
+	}
+
+	public static function provideNativeReplace() {
+		return array(
+			array(
+				array(
+					'table' => 'replace_table',
+					'rows' => array( 'field' => 'text', 'field2' => 'text2' ),
+				),
+				"REPLACE INTO replace_table " .
+					"(field,field2) " .
+					"VALUES ('text','text2')"
+			),
 		);
 	}
 
 	/**
 	 * @dataProvider provideConditional
+	 * @covers DatabaseBase::conditional
 	 */
-	function testConditional( $sql, $sqlText ) {
-		$this->assertEquals( trim( $this->db->conditional(
+	public function testConditional( $sql, $sqlText ) {
+		$this->assertEquals( trim( $this->database->conditional(
 			$sql['conds'],
 			$sql['true'],
 			$sql['false']
@@ -145,4 +591,131 @@ class DatabaseSQLTest extends MediaWikiTestCase {
 			),
 		);
 	}
+
+	/**
+	 * @dataProvider provideBuildConcat
+	 * @covers DatabaseBase::buildConcat
+	 */
+	public function testBuildConcat( $stringList, $sqlText ) {
+		$this->assertEquals( trim( $this->database->buildConcat(
+			$stringList
+		) ), $sqlText );
+	}
+
+	public static function provideBuildConcat() {
+		return array(
+			array(
+				array( 'field', 'field2' ),
+				"CONCAT(field,field2)"
+			),
+			array(
+				array( "'test'", 'field2' ),
+				"CONCAT('test',field2)"
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider provideBuildLike
+	 * @covers DatabaseBase::buildLike
+	 */
+	public function testBuildLike( $array, $sqlText ) {
+		$this->assertEquals( trim( $this->database->buildLike(
+			$array
+		) ), $sqlText );
+	}
+
+	public static function provideBuildLike() {
+		return array(
+			array(
+				'text',
+				"LIKE 'text'"
+			),
+			array(
+				array( 'text', new LikeMatch( '%' ) ),
+				"LIKE 'text%'"
+			),
+			array(
+				array( 'text', new LikeMatch( '%' ), 'text2' ),
+				"LIKE 'text%text2'"
+			),
+			array(
+				array( 'text', new LikeMatch( '_' ) ),
+				"LIKE 'text_'"
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider provideUnionQueries
+	 * @covers DatabaseBase::unionQueries
+	 */
+	public function testUnionQueries( $sql, $sqlText ) {
+		$this->assertEquals( trim( $this->database->unionQueries(
+			$sql['sqls'],
+			$sql['all']
+		) ), $sqlText );
+	}
+
+	public static function provideUnionQueries() {
+		return array(
+			array(
+				array(
+					'sqls' => array( 'RAW SQL', 'RAW2SQL' ),
+					'all' => true,
+				),
+				"(RAW SQL) UNION ALL (RAW2SQL)"
+			),
+			array(
+				array(
+					'sqls' => array( 'RAW SQL', 'RAW2SQL' ),
+					'all' => false,
+				),
+				"(RAW SQL) UNION (RAW2SQL)"
+			),
+			array(
+				array(
+					'sqls' => array( 'RAW SQL', 'RAW2SQL', 'RAW3SQL' ),
+					'all' => false,
+				),
+				"(RAW SQL) UNION (RAW2SQL) UNION (RAW3SQL)"
+			),
+		);
+	}
+
+	/**
+	 * @covers DatabaseBase::commit
+	 */
+	public function testTransactionCommit() {
+		$this->database->begin( __METHOD__ );
+		$this->database->commit( __METHOD__ );
+		$this->assertLastSql( 'BEGIN; COMMIT' );
+	}
+
+	/**
+	 * @covers DatabaseBase::rollback
+	 */
+	public function testTransactionRollback() {
+		$this->database->begin( __METHOD__ );
+		$this->database->rollback( __METHOD__ );
+		$this->assertLastSql( 'BEGIN; ROLLBACK' );
+	}
+
+	/**
+	 * @covers DatabaseBase::dropTable
+	 */
+	public function testDropTable() {
+		$this->database->setExistingTables( array( 'table' ) );
+		$this->database->dropTable( 'table', __METHOD__ );
+		$this->assertLastSql( 'DROP TABLE table' );
+	}
+
+	/**
+	 * @covers DatabaseBase::dropTable
+	 */
+	public function testDropNonExistingTable() {
+		$this->assertFalse(
+			$this->database->dropTable( 'non_existing', __METHOD__ )
+		);
+	}
 }
diff --git a/tests/phpunit/includes/db/DatabaseSqliteTest.php b/tests/phpunit/includes/db/DatabaseSqliteTest.php
index 7b84d471..70ee9465 100644
--- a/tests/phpunit/includes/db/DatabaseSqliteTest.php
+++ b/tests/phpunit/includes/db/DatabaseSqliteTest.php
@@ -9,6 +9,7 @@ class MockDatabaseSqlite extends DatabaseSqliteStandalone {
 
 	function query( $sql, $fname = '', $tempIgnore = false ) {
 		$this->lastQuery = $sql;
+
 		return true;
 	}
 
@@ -26,6 +27,10 @@ class MockDatabaseSqlite extends DatabaseSqliteStandalone {
  * @group medium
  */
 class DatabaseSqliteTest extends MediaWikiTestCase {
+
+	/**
+	 * @var MockDatabaseSqlite
+	 */
 	var $db;
 
 	protected function setUp() {
@@ -82,6 +87,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideAddQuotes()
+	 * @covers DatabaseSqlite::addQuotes
 	 */
 	public function testAddQuotes( $value, $expected ) {
 		// check quoting
@@ -104,6 +110,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 		}
 	}
 
+	/**
+	 * @covers DatabaseSqlite::replaceVars
+	 */
 	public function testReplaceVars() {
 		$this->assertEquals( 'foo', $this->replaceVars( 'foo' ), "Don't break anything accidentally" );
 
@@ -142,6 +151,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 		);
 	}
 
+	/**
+	 * @covers DatabaseSqlite::tableName
+	 */
 	public function testTableName() {
 		// @todo Moar!
 		$db = new DatabaseSqliteStandalone( ':memory:' );
@@ -152,6 +164,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 		$this->assertEquals( 'foobar', $db->tableName( 'bar' ) );
 	}
 
+	/**
+	 * @covers DatabaseSqlite::duplicateTableStructure
+	 */
 	public function testDuplicateTableStructure() {
 		$db = new DatabaseSqliteStandalone( ':memory:' );
 		$db->query( 'CREATE TABLE foo(foo, barfoo)' );
@@ -173,6 +188,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 		);
 	}
 
+	/**
+	 * @covers DatabaseSqlite::duplicateTableStructure
+	 */
 	public function testDuplicateTableStructureVirtual() {
 		$db = new DatabaseSqliteStandalone( ':memory:' );
 		if ( $db->getFulltextSearchModule() != 'FTS3' ) {
@@ -193,6 +211,9 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 		);
 	}
 
+	/**
+	 * @covers DatabaseSqlite::deleteJoin
+	 */
 	public function testDeleteJoin() {
 		$db = new DatabaseSqliteStandalone( ':memory:' );
 		$db->query( 'CREATE TABLE a (a_1)', __METHOD__ );
@@ -232,7 +253,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 
 	/**
 	 * Runs upgrades of older databases and compares results with current schema
-	 * @todo: currently only checks list of tables
+	 * @todo Currently only checks list of tables
 	 */
 	public function testUpgrades() {
 		global $IP, $wgVersion, $wgProfileToDatabase;
@@ -305,13 +326,19 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 		}
 	}
 
+	/**
+	 * @covers DatabaseSqlite::insertId
+	 */
 	public function testInsertIdType() {
 		$db = new DatabaseSqliteStandalone( ':memory:' );
-		$this->assertInstanceOf( 'ResultWrapper',
-			$db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ ), "Database creationg" );
-		$this->assertTrue( $db->insert( 'a', array( 'a_1' => 10 ), __METHOD__ ),
-			"Insertion worked" );
-		$this->assertEquals( "integer", gettype( $db->insertId() ), "Actual typecheck" );
+
+		$databaseCreation = $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ );
+		$this->assertInstanceOf( 'ResultWrapper', $databaseCreation, "Database creation" );
+
+		$insertion = $db->insert( 'a', array( 'a_1' => 10 ), __METHOD__ );
+		$this->assertTrue( $insertion, "Insertion worked" );
+
+		$this->assertInternalType( 'integer', $db->insertId(), "Actual typecheck" );
 		$this->assertTrue( $db->close(), "closing database" );
 	}
 
@@ -327,12 +354,14 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 		$db->sourceFile( "$IP/tests/phpunit/data/db/sqlite/tables-$version.sql" );
 		$updater = DatabaseUpdater::newForDB( $db, false, $maint );
 		$updater->doUpdates( array( 'core' ) );
+
 		return $db;
 	}
 
 	private function getTables( $db ) {
 		$list = array_flip( $db->listTables() );
 		$excluded = array(
+			'external_user', // removed from core in 1.22
 			'math', // moved out of core in 1.18
 			'trackbacks', // removed from core in 1.19
 			'searchindex',
@@ -348,6 +377,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 		}
 		$list = array_flip( $list );
 		sort( $list );
+
 		return $list;
 	}
 
@@ -359,6 +389,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 			$cols[$col->name] = $col;
 		}
 		ksort( $cols );
+
 		return $cols;
 	}
 
@@ -376,10 +407,11 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 			$indexes[$index->name] = $index;
 		}
 		ksort( $indexes );
+
 		return $indexes;
 	}
 
-	function testCaseInsensitiveLike() {
+	public function testCaseInsensitiveLike() {
 		// TODO: Test this for all databases
 		$db = new DatabaseSqliteStandalone( ':memory:' );
 		$res = $db->query( 'SELECT "a" LIKE "A" AS a' );
diff --git a/tests/phpunit/includes/db/DatabaseTest.php b/tests/phpunit/includes/db/DatabaseTest.php
index 65c80d1d..301fc990 100644
--- a/tests/phpunit/includes/db/DatabaseTest.php
+++ b/tests/phpunit/includes/db/DatabaseTest.php
@@ -5,7 +5,11 @@
  * @group DatabaseBase
  */
 class DatabaseTest extends MediaWikiTestCase {
-	var $db, $functionTest = false;
+	/**
+	 * @var DatabaseBase
+	 */
+	var $db;
+	var $functionTest = false;
 
 	protected function setUp() {
 		parent::setUp();
@@ -19,8 +23,10 @@ class DatabaseTest extends MediaWikiTestCase {
 			$this->functionTest = false;
 		}
 	}
-
-	function testAddQuotesNull() {
+	/**
+	 * @covers DatabaseBase::dropTable
+	 */
+	public function testAddQuotesNull() {
 		$check = "NULL";
 		if ( $this->db->getType() === 'sqlite' || $this->db->getType() === 'oracle' ) {
 			$check = "''";
@@ -28,7 +34,7 @@ class DatabaseTest extends MediaWikiTestCase {
 		$this->assertEquals( $check, $this->db->addQuotes( null ) );
 	}
 
-	function testAddQuotesInt() {
+	public function testAddQuotesInt() {
 		# returning just "1234" should be ok too, though...
 		# maybe
 		$this->assertEquals(
@@ -36,20 +42,20 @@ class DatabaseTest extends MediaWikiTestCase {
 			$this->db->addQuotes( 1234 ) );
 	}
 
-	function testAddQuotesFloat() {
+	public function testAddQuotesFloat() {
 		# returning just "1234.5678" would be ok too, though
 		$this->assertEquals(
 			"'1234.5678'",
 			$this->db->addQuotes( 1234.5678 ) );
 	}
 
-	function testAddQuotesString() {
+	public function testAddQuotesString() {
 		$this->assertEquals(
 			"'string'",
 			$this->db->addQuotes( 'string' ) );
 	}
 
-	function testAddQuotesStringQuote() {
+	public function testAddQuotesStringQuote() {
 		$check = "'string''s cause trouble'";
 		if ( $this->db->getType() === 'mysql' ) {
 			$check = "'string\'s cause trouble'";
@@ -84,36 +90,46 @@ class DatabaseTest extends MediaWikiTestCase {
 			$quote = '';
 		} elseif ( $this->db->getType() === 'mysql' ) {
 			$quote = '`';
+		} elseif ( $this->db->getType() === 'oracle' ) {
+			$quote = '/*Q*/';
 		} else {
 			$quote = '"';
 		}
 
 		if ( $database !== null ) {
-			$database = $quote . $database . $quote . '.';
+			if ( $this->db->getType() === 'oracle' ) {
+				$database = $quote . $database . '.';
+			} else {
+				$database = $quote . $database . $quote . '.';
+			}
 		}
 
 		if ( $prefix === null ) {
 			$prefix = $this->dbPrefix();
 		}
 
-		return $database . $quote . $prefix . $table . $quote;
+		if ( $this->db->getType() === 'oracle' ) {
+			return strtoupper($database . $quote . $prefix . $table);
+		} else {
+			return $database . $quote . $prefix . $table . $quote;
+		}
 	}
 
-	function testTableNameLocal() {
+	public function testTableNameLocal() {
 		$this->assertEquals(
 			$this->prefixAndQuote( 'tablename' ),
 			$this->db->tableName( 'tablename' )
 		);
 	}
 
-	function testTableNameRawLocal() {
+	public function testTableNameRawLocal() {
 		$this->assertEquals(
 			$this->prefixAndQuote( 'tablename', null, null, 'raw' ),
 			$this->db->tableName( 'tablename', 'raw' )
 		);
 	}
 
-	function testTableNameShared() {
+	public function testTableNameShared() {
 		$this->assertEquals(
 			$this->prefixAndQuote( 'tablename', 'sharedatabase', 'sh_' ),
 			$this->getSharedTableName( 'tablename', 'sharedatabase', 'sh_' )
@@ -125,7 +141,7 @@ class DatabaseTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testTableNameRawShared() {
+	public function testTableNameRawShared() {
 		$this->assertEquals(
 			$this->prefixAndQuote( 'tablename', 'sharedatabase', 'sh_', 'raw' ),
 			$this->getSharedTableName( 'tablename', 'sharedatabase', 'sh_', 'raw' )
@@ -137,21 +153,21 @@ class DatabaseTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testTableNameForeign() {
+	public function testTableNameForeign() {
 		$this->assertEquals(
 			$this->prefixAndQuote( 'tablename', 'databasename', '' ),
 			$this->db->tableName( 'databasename.tablename' )
 		);
 	}
 
-	function testTableNameRawForeign() {
+	public function testTableNameRawForeign() {
 		$this->assertEquals(
 			$this->prefixAndQuote( 'tablename', 'databasename', '', 'raw' ),
 			$this->db->tableName( 'databasename.tablename', 'raw' )
 		);
 	}
 
-	function testFillPreparedEmpty() {
+	public function testFillPreparedEmpty() {
 		$sql = $this->db->fillPrepared(
 			'SELECT * FROM interwiki', array() );
 		$this->assertEquals(
@@ -159,7 +175,7 @@ class DatabaseTest extends MediaWikiTestCase {
 			$sql );
 	}
 
-	function testFillPreparedQuestion() {
+	public function testFillPreparedQuestion() {
 		$sql = $this->db->fillPrepared(
 			'SELECT * FROM cur WHERE cur_namespace=? AND cur_title=?',
 			array( 4, "Snicker's_paradox" ) );
@@ -171,7 +187,7 @@ class DatabaseTest extends MediaWikiTestCase {
 		$this->assertEquals( $check, $sql );
 	}
 
-	function testFillPreparedBang() {
+	public function testFillPreparedBang() {
 		$sql = $this->db->fillPrepared(
 			'SELECT user_id FROM ! WHERE user_name=?',
 			array( '"user"', "Slash's Dot" ) );
@@ -183,7 +199,7 @@ class DatabaseTest extends MediaWikiTestCase {
 		$this->assertEquals( $check, $sql );
 	}
 
-	function testFillPreparedRaw() {
+	public function testFillPreparedRaw() {
 		$sql = $this->db->fillPrepared(
 			"SELECT * FROM cur WHERE cur_title='This_\\&_that,_WTF\\?\\!'",
 			array( '"user"', "Slash's Dot" ) );
@@ -192,7 +208,7 @@ class DatabaseTest extends MediaWikiTestCase {
 			$sql );
 	}
 
-	function testStoredFunctions() {
+	public function testStoredFunctions() {
 		if ( !in_array( wfGetDB( DB_MASTER )->getType(), array( 'mysql', 'postgres' ) ) ) {
 			$this->markTestSkipped( 'MySQL or Postgres required' );
 		}
@@ -209,4 +225,10 @@ class DatabaseTest extends MediaWikiTestCase {
 				. ( $this->db->getType() == 'postgres' ? '()' : '' )
 		);
 	}
+
+	public function testUnknownTableCorruptsResults() {
+		$res = $this->db->select( 'page', '*', array( 'page_id' => 1 ) );
+		$this->assertFalse( $this->db->tableExists( 'foobarbaz' ) );
+		$this->assertInternalType( 'int', $res->numRows() );
+	}
 }
diff --git a/tests/phpunit/includes/db/DatabaseTestHelper.php b/tests/phpunit/includes/db/DatabaseTestHelper.php
new file mode 100644
index 00000000..790f273c
--- /dev/null
+++ b/tests/phpunit/includes/db/DatabaseTestHelper.php
@@ -0,0 +1,166 @@
+<?php
+
+/**
+ * Helper for testing the methods from the DatabaseBase class
+ * @since 1.22
+ */
+class DatabaseTestHelper extends DatabaseBase {
+
+	/**
+	 * __CLASS__ of the test suite,
+	 * used to determine, if the function name is passed every time to query()
+	 */
+	protected $testName = array();
+
+	/**
+	 * Array of lastSqls passed to query(),
+	 * This is an array since some methods in DatabaseBase can do more than one
+	 * query. Cleared when calling getLastSqls().
+	 */
+	protected $lastSqls = array();
+
+	/**
+	 * Array of tables to be considered as existing by tableExist()
+	 * Use setExistingTables() to alter.
+	 */
+	protected $tablesExists;
+
+	public function __construct( $testName ) {
+		$this->testName = $testName;
+	}
+
+	/**
+	 * Returns SQL queries grouped by '; '
+	 * Clear the list of queries that have been done so far.
+	 */
+	public function getLastSqls() {
+		$lastSqls = implode( '; ', $this->lastSqls );
+		$this->lastSqls = array();
+
+		return $lastSqls;
+	}
+
+	public function setExistingTables( $tablesExists ) {
+		$this->tablesExists = (array)$tablesExists;
+	}
+
+	protected function addSql( $sql ) {
+		// clean up spaces before and after some words and the whole string
+		$this->lastSqls[] = trim( preg_replace(
+			'/\s{2,}(?=FROM|WHERE|GROUP BY|ORDER BY|LIMIT)|(?<=SELECT|INSERT|UPDATE)\s{2,}/',
+			' ', $sql
+		) );
+	}
+
+	protected function checkFunctionName( $fname ) {
+		if ( substr( $fname, 0, strlen( $this->testName ) ) !== $this->testName ) {
+			throw new MWException( 'function name does not start with test class. ' .
+				$fname . ' vs. ' . $this->testName . '. ' .
+				'Please provide __METHOD__ to database methods.' );
+		}
+	}
+
+	function strencode( $s ) {
+		// Choose apos to avoid handling of escaping double quotes in quoted text
+		return str_replace( "'", "\'", $s );
+	}
+
+	public function addIdentifierQuotes( $s ) {
+		// no escaping to avoid handling of double quotes in quoted text
+		return $s;
+	}
+
+	public function query( $sql, $fname = '', $tempIgnore = false ) {
+		$this->checkFunctionName( $fname );
+		$this->addSql( $sql );
+
+		return parent::query( $sql, $fname, $tempIgnore );
+	}
+
+	public function tableExists( $table, $fname = __METHOD__ ) {
+		$this->checkFunctionName( $fname );
+
+		return in_array( $table, (array)$this->tablesExists );
+	}
+
+	// Redeclare parent method to make it public
+	public function nativeReplace( $table, $rows, $fname ) {
+		return parent::nativeReplace( $table, $rows, $fname );
+	}
+
+	function getType() {
+		return 'test';
+	}
+
+	function open( $server, $user, $password, $dbName ) {
+		return false;
+	}
+
+	function fetchObject( $res ) {
+		return false;
+	}
+
+	function fetchRow( $res ) {
+		return false;
+	}
+
+	function numRows( $res ) {
+		return -1;
+	}
+
+	function numFields( $res ) {
+		return -1;
+	}
+
+	function fieldName( $res, $n ) {
+		return 'test';
+	}
+
+	function insertId() {
+		return -1;
+	}
+
+	function dataSeek( $res, $row ) {
+		/* nop */
+	}
+
+	function lastErrno() {
+		return -1;
+	}
+
+	function lastError() {
+		return 'test';
+	}
+
+	function fieldInfo( $table, $field ) {
+		return false;
+	}
+
+	function indexInfo( $table, $index, $fname = 'Database::indexInfo' ) {
+		return false;
+	}
+
+	function affectedRows() {
+		return -1;
+	}
+
+	function getSoftwareLink() {
+		return 'test';
+	}
+
+	function getServerVersion() {
+		return 'test';
+	}
+
+	function getServerInfo() {
+		return 'test';
+	}
+
+	protected function closeConnection() {
+		return false;
+	}
+
+	protected function doQuery( $sql ) {
+		return array();
+	}
+}
diff --git a/tests/phpunit/includes/db/ORMRowTest.php b/tests/phpunit/includes/db/ORMRowTest.php
index 596d0bd0..27d4d0e8 100644
--- a/tests/phpunit/includes/db/ORMRowTest.php
+++ b/tests/phpunit/includes/db/ORMRowTest.php
@@ -76,6 +76,7 @@ abstract class ORMRowTest extends \MediaWikiTestCase {
 	 */
 	protected function getRowInstance( array $data, $loadDefaults ) {
 		$class = $this->getRowClass();
+
 		return new $class( $this->getTableInstance(), $data, $loadDefaults );
 	}
 
diff --git a/tests/phpunit/includes/db/ORMTableTest.php b/tests/phpunit/includes/db/ORMTableTest.php
index 4cadf31c..e583d1bc 100644
--- a/tests/phpunit/includes/db/ORMTableTest.php
+++ b/tests/phpunit/includes/db/ORMTableTest.php
@@ -45,6 +45,7 @@ class ORMTableTest extends MediaWikiTestCase {
 	 */
 	public function getTable() {
 		$class = $this->getTableClass();
+
 		return $class::singleton();
 	}
 
@@ -84,7 +85,6 @@ class ORMTableTest extends MediaWikiTestCase {
 
 		$db->ignoreErrors( false );
 	}
-
 }
 
 /**
diff --git a/tests/phpunit/includes/db/TestORMRowTest.php b/tests/phpunit/includes/db/TestORMRowTest.php
index 263553ac..f65642b8 100644
--- a/tests/phpunit/includes/db/TestORMRowTest.php
+++ b/tests/phpunit/includes/db/TestORMRowTest.php
@@ -64,23 +64,40 @@ class TestORMRowTest extends ORMRowTest {
 		$dbw = wfGetDB( DB_MASTER );
 
 		$isSqlite = $GLOBALS['wgDBtype'] === 'sqlite';
+		$isPostgres = $GLOBALS['wgDBtype'] === 'postgres';
 
 		$idField = $isSqlite ? 'INTEGER' : 'INT unsigned';
 		$primaryKey = $isSqlite ? 'PRIMARY KEY AUTOINCREMENT' : 'auto_increment PRIMARY KEY';
 
-		$dbw->query(
-			'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . '(
-				test_id                    ' . $idField . '        NOT NULL ' . $primaryKey . ',
-				test_name                  VARCHAR(255)        NOT NULL,
-				test_age                   TINYINT unsigned    NOT NULL,
-				test_height                FLOAT               NOT NULL,
-				test_awesome               TINYINT unsigned    NOT NULL,
-				test_stuff                 BLOB                NOT NULL,
-				test_moarstuff             BLOB                NOT NULL,
-				test_time                  varbinary(14)       NOT NULL
-			);',
-			__METHOD__
-		);
+		if ( $isPostgres ) {
+			$dbw->query(
+				'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . "(
+					test_id serial PRIMARY KEY,
+					test_name TEXT NOT NULL DEFAULT '',
+					test_age INTEGER NOT NULL DEFAULT 0,
+					test_height REAL NOT NULL DEFAULT 0,
+					test_awesome INTEGER NOT NULL DEFAULT 0,
+					test_stuff BYTEA,
+					test_moarstuff BYTEA,
+					test_time TIMESTAMPTZ
+					);",
+					__METHOD__
+				);
+		} else {
+			$dbw->query(
+				'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . '(
+					test_id                    ' . $idField . '        NOT NULL ' . $primaryKey . ',
+					test_name                  VARCHAR(255)        NOT NULL,
+					test_age                   TINYINT unsigned    NOT NULL,
+					test_height                FLOAT               NOT NULL,
+					test_awesome               TINYINT unsigned    NOT NULL,
+					test_stuff                 BLOB                NOT NULL,
+					test_moarstuff             BLOB                NOT NULL,
+					test_time                  varbinary(14)       NOT NULL
+				);',
+				__METHOD__
+			);
+		}
 	}
 
 	protected function tearDown() {
@@ -91,11 +108,12 @@ class TestORMRowTest extends ORMRowTest {
 	}
 
 	public function constructorTestProvider() {
+		$dbw = wfGetDB( DB_MASTER );
 		return array(
 			array(
 				array(
 					'name' => 'Foobar',
-					'time' => '20120101020202',
+					'time' => $dbw->timestamp( '20120101020202' ),
 					'age' => 42,
 					'height' => 9000.1,
 					'awesome' => true,
@@ -122,10 +140,10 @@ class TestORMRowTest extends ORMRowTest {
 			'blob' => new stdClass()
 		);
 	}
-
 }
 
-class TestORMRow extends ORMRow {}
+class TestORMRow extends ORMRow {
+}
 
 class TestORMTable extends ORMTable {
 
@@ -194,6 +212,4 @@ class TestORMTable extends ORMTable {
 	protected function getFieldPrefix() {
 		return 'test_';
 	}
-
-
 }
diff --git a/tests/phpunit/includes/debug/MWDebugTest.php b/tests/phpunit/includes/debug/MWDebugTest.php
index 9026cb90..6926b1c8 100644
--- a/tests/phpunit/includes/debug/MWDebugTest.php
+++ b/tests/phpunit/includes/debug/MWDebugTest.php
@@ -21,7 +21,7 @@ class MWDebugTest extends MediaWikiTestCase {
 		parent::tearDown();
 	}
 
-	function testAddLog() {
+	public function testAddLog() {
 		MWDebug::log( 'logging a string' );
 		$this->assertEquals(
 			array( array(
@@ -33,7 +33,7 @@ class MWDebugTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testAddWarning() {
+	public function testAddWarning() {
 		MWDebug::warning( 'Warning message' );
 		$this->assertEquals(
 			array( array(
@@ -45,7 +45,7 @@ class MWDebugTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testAvoidDuplicateDeprecations() {
+	public function testAvoidDuplicateDeprecations() {
 		MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
 		MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
 
@@ -56,7 +56,7 @@ class MWDebugTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testAvoidNonConsecutivesDuplicateDeprecations() {
+	public function testAvoidNonConsecutivesDuplicateDeprecations() {
 		MWDebug::deprecated( 'wfOldFunction', '1.0', 'component' );
 		MWDebug::warning( 'some warning' );
 		MWDebug::log( 'we could have logged something too' );
diff --git a/tests/phpunit/includes/filebackend/FileBackendTest.php b/tests/phpunit/includes/filebackend/FileBackendTest.php
index 9fbf7bb0..fcfa724f 100644
--- a/tests/phpunit/includes/filebackend/FileBackendTest.php
+++ b/tests/phpunit/includes/filebackend/FileBackendTest.php
@@ -6,14 +6,21 @@
  * @group medium
  */
 class FileBackendTest extends MediaWikiTestCase {
-	private $backend, $multiBackend;
+
+	/** @var FileBackend */
+	private $backend;
+	/** @var FileBackendMultiWrite */
+	private $multiBackend;
+	/** @var FSFileBackend */
+	public $singleBackend;
 	private $filesToPrune = array();
 	private static $backendToUse;
 
 	protected function setUp() {
 		global $wgFileBackends;
 		parent::setUp();
-		$tmpPrefix = wfTempDir() . '/filebackend-unittest-' . time() . '-' . mt_rand();
+		$uniqueId = time() . '-' . mt_rand();
+		$tmpPrefix = wfTempDir() . '/filebackend-unittest-' . $uniqueId;
 		if ( $this->getCliArg( 'use-filebackend=' ) ) {
 			if ( self::$backendToUse ) {
 				$this->singleBackend = self::$backendToUse;
@@ -36,32 +43,34 @@ class FileBackendTest extends MediaWikiTestCase {
 			}
 		} else {
 			$this->singleBackend = new FSFileBackend( array(
-				'name'        => 'localtesting',
+				'name' => 'localtesting',
 				'lockManager' => 'fsLockManager',
 				#'parallelize' => 'implicit',
+				'wikiId' => wfWikiID() . $uniqueId,
 				'containerPaths' => array(
 					'unittest-cont1' => "{$tmpPrefix}-localtesting-cont1",
 					'unittest-cont2' => "{$tmpPrefix}-localtesting-cont2" )
 			) );
 		}
 		$this->multiBackend = new FileBackendMultiWrite( array(
-			'name'        => 'localtesting',
+			'name' => 'localtesting',
 			'lockManager' => 'fsLockManager',
 			'parallelize' => 'implicit',
-			'backends'    => array(
+			'wikiId' => wfWikiId() . $uniqueId,
+			'backends' => array(
 				array(
-					'name'          => 'localmultitesting1',
-					'class'         => 'FSFileBackend',
-					'lockManager'   => 'nullLockManager',
+					'name' => 'localmultitesting1',
+					'class' => 'FSFileBackend',
+					'lockManager' => 'nullLockManager',
 					'containerPaths' => array(
 						'unittest-cont1' => "{$tmpPrefix}-localtestingmulti1-cont1",
 						'unittest-cont2' => "{$tmpPrefix}-localtestingmulti1-cont2" ),
 					'isMultiMaster' => false
 				),
 				array(
-					'name'          => 'localmultitesting2',
-					'class'         => 'FSFileBackend',
-					'lockManager'   => 'nullLockManager',
+					'name' => 'localmultitesting2',
+					'class' => 'FSFileBackend',
+					'lockManager' => 'nullLockManager',
 					'containerPaths' => array(
 						'unittest-cont1' => "{$tmpPrefix}-localtestingmulti2-cont1",
 						'unittest-cont2' => "{$tmpPrefix}-localtestingmulti2-cont2" ),
@@ -82,13 +91,14 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testIsStoragePath
+	 * @covers FileBackend::isStoragePath
 	 */
 	public function testIsStoragePath( $path, $isStorePath ) {
 		$this->assertEquals( $isStorePath, FileBackend::isStoragePath( $path ),
 			"FileBackend::isStoragePath on path '$path'" );
 	}
 
-	function provider_testIsStoragePath() {
+	public static function provider_testIsStoragePath() {
 		return array(
 			array( 'mwstore://', true ),
 			array( 'mwstore://backend', true ),
@@ -106,13 +116,14 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testSplitStoragePath
+	 * @covers FileBackend::splitStoragePath
 	 */
 	public function testSplitStoragePath( $path, $res ) {
 		$this->assertEquals( $res, FileBackend::splitStoragePath( $path ),
 			"FileBackend::splitStoragePath on path '$path'" );
 	}
 
-	function provider_testSplitStoragePath() {
+	public static function provider_testSplitStoragePath() {
 		return array(
 			array( 'mwstore://backend/container', array( 'backend', 'container', '' ) ),
 			array( 'mwstore://backend/container/', array( 'backend', 'container', '' ) ),
@@ -130,13 +141,14 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_normalizeStoragePath
+	 * @covers FileBackend::normalizeStoragePath
 	 */
 	public function testNormalizeStoragePath( $path, $res ) {
 		$this->assertEquals( $res, FileBackend::normalizeStoragePath( $path ),
 			"FileBackend::normalizeStoragePath on path '$path'" );
 	}
 
-	function provider_normalizeStoragePath() {
+	public static function provider_normalizeStoragePath() {
 		return array(
 			array( 'mwstore://backend/container', 'mwstore://backend/container' ),
 			array( 'mwstore://backend/container/', 'mwstore://backend/container' ),
@@ -156,13 +168,14 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testParentStoragePath
+	 * @covers FileBackend::parentStoragePath
 	 */
 	public function testParentStoragePath( $path, $res ) {
 		$this->assertEquals( $res, FileBackend::parentStoragePath( $path ),
 			"FileBackend::parentStoragePath on path '$path'" );
 	}
 
-	function provider_testParentStoragePath() {
+	public static function provider_testParentStoragePath() {
 		return array(
 			array( 'mwstore://backend/container/path/to/obj', 'mwstore://backend/container/path/to' ),
 			array( 'mwstore://backend/container/path/to', 'mwstore://backend/container/path' ),
@@ -177,6 +190,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testExtensionFromPath
+	 * @covers FileBackend::extensionFromPath
 	 */
 	public function testExtensionFromPath( $path, $res ) {
 		$this->assertEquals( $res, FileBackend::extensionFromPath( $path ),
@@ -210,6 +224,9 @@ class FileBackendTest extends MediaWikiTestCase {
 		$this->tearDownFiles();
 	}
 
+	/**
+	 * @covers FileBackend::doOperation
+	 */
 	private function doTestStore( $op ) {
 		$backendName = $this->backendClass();
 
@@ -281,6 +298,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testCopy
+	 * @covers FileBackend::doOperation
 	 */
 	public function testCopy( $op ) {
 		$this->backend = $this->singleBackend;
@@ -312,6 +330,7 @@ class FileBackendTest extends MediaWikiTestCase {
 				"Source file $source does not exist ($backendName)." );
 			$this->assertEquals( false, $this->backend->fileExists( array( 'src' => $dest ) ),
 				"Destination file $dest does not exist ($backendName)." );
+
 			return; // done
 		}
 
@@ -400,6 +419,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testMove
+	 * @covers FileBackend::doOperation
 	 */
 	public function testMove( $op ) {
 		$this->backend = $this->singleBackend;
@@ -431,6 +451,7 @@ class FileBackendTest extends MediaWikiTestCase {
 				"Source file $source does not exist ($backendName)." );
 			$this->assertEquals( false, $this->backend->fileExists( array( 'src' => $dest ) ),
 				"Destination file $dest does not exist ($backendName)." );
+
 			return; // done
 		}
 
@@ -520,6 +541,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testDelete
+	 * @covers FileBackend::doOperation
 	 */
 	public function testDelete( $op, $withSource, $okStatus ) {
 		$this->backend = $this->singleBackend;
@@ -611,6 +633,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testDescribe
+	 * @covers FileBackend::doOperation
 	 */
 	public function testDescribe( $op, $withSource, $okStatus ) {
 		$this->backend = $this->singleBackend;
@@ -678,6 +701,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testCreate
+	 * @covers FileBackend::doOperation
 	 */
 	public function testCreate( $op, $alreadyExists, $okStatus, $newSize ) {
 		$this->backend = $this->singleBackend;
@@ -798,6 +822,9 @@ class FileBackendTest extends MediaWikiTestCase {
 		return $cases;
 	}
 
+	/**
+	 * @covers FileBackend::doQuickOperations
+	 */
 	public function testDoQuickOperations() {
 		$this->backend = $this->singleBackend;
 		$this->doTestDoQuickOperations();
@@ -817,32 +844,66 @@ class FileBackendTest extends MediaWikiTestCase {
 			"$base/unittest-cont1/e/fileB.a",
 			"$base/unittest-cont1/e/fileC.a"
 		);
-		$ops = array();
+		$createOps = array();
 		$purgeOps = array();
 		foreach ( $files as $path ) {
 			$status = $this->prepare( array( 'dir' => dirname( $path ) ) );
 			$this->assertGoodStatus( $status,
 				"Preparing $path succeeded without warnings ($backendName)." );
-			$ops[] = array( 'op' => 'create', 'dst' => $path, 'content' => mt_rand(0, 50000) );
+			$createOps[] = array( 'op' => 'create', 'dst' => $path, 'content' => mt_rand( 0, 50000 ) );
+			$copyOps[] = array( 'op' => 'copy', 'src' => $path, 'dst' => "$path-2" );
+			$moveOps[] = array( 'op' => 'move', 'src' => "$path-2", 'dst' => "$path-3" );
 			$purgeOps[] = array( 'op' => 'delete', 'src' => $path );
+			$purgeOps[] = array( 'op' => 'delete', 'src' => "$path-3" );
 		}
 		$purgeOps[] = array( 'op' => 'null' );
-		$status = $this->backend->doQuickOperations( $ops );
-		$this->assertGoodStatus( $status,
-			"Creation of source files succeeded ($backendName)." );
 
+		$this->assertGoodStatus(
+			$this->backend->doQuickOperations( $createOps ),
+			"Creation of source files succeeded ($backendName)." );
 		foreach ( $files as $file ) {
 			$this->assertTrue( $this->backend->fileExists( array( 'src' => $file ) ),
 				"File $file exists." );
 		}
 
-		$status = $this->backend->doQuickOperations( $purgeOps );
-		$this->assertGoodStatus( $status,
-			"Quick deletion of source files succeeded ($backendName)." );
+		$this->assertGoodStatus(
+			$this->backend->doQuickOperations( $copyOps ),
+			"Quick copy of source files succeeded ($backendName)." );
+		foreach ( $files as $file ) {
+			$this->assertTrue( $this->backend->fileExists( array( 'src' => "$file-2" ) ),
+				"File $file-2 exists." );
+		}
 
+		$this->assertGoodStatus(
+			$this->backend->doQuickOperations( $moveOps ),
+			"Quick move of source files succeeded ($backendName)." );
+		foreach ( $files as $file ) {
+			$this->assertTrue( $this->backend->fileExists( array( 'src' => "$file-3" ) ),
+				"File $file-3 move in." );
+			$this->assertFalse( $this->backend->fileExists( array( 'src' => "$file-2" ) ),
+				"File $file-2 moved away." );
+		}
+
+		$this->assertGoodStatus(
+			$this->backend->quickCopy( array( 'src' => $files[0], 'dst' => $files[0] ) ),
+			"Copy of file {$files[0]} over itself succeeded ($backendName)." );
+		$this->assertTrue( $this->backend->fileExists( array( 'src' => $files[0] ) ),
+			"File {$files[0]} still exists." );
+
+		$this->assertGoodStatus(
+			$this->backend->quickMove( array( 'src' => $files[0], 'dst' => $files[0] ) ),
+			"Move of file {$files[0]} over itself succeeded ($backendName)." );
+		$this->assertTrue( $this->backend->fileExists( array( 'src' => $files[0] ) ),
+			"File {$files[0]} still exists." );
+
+		$this->assertGoodStatus(
+			$this->backend->doQuickOperations( $purgeOps ),
+			"Quick deletion of source files succeeded ($backendName)." );
 		foreach ( $files as $file ) {
 			$this->assertFalse( $this->backend->fileExists( array( 'src' => $file ) ),
 				"File $file purged." );
+			$this->assertFalse( $this->backend->fileExists( array( 'src' => "$file-3" ) ),
+				"File $file-3 purged." );
 		}
 	}
 
@@ -855,6 +916,7 @@ class FileBackendTest extends MediaWikiTestCase {
 		$this->backend = $this->singleBackend;
 		$this->tearDownFiles();
 		$this->doTestConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus );
+		$this->filesToPrune[] = $op['dst']; # avoid file leaking
 		$this->tearDownFiles();
 
 		$this->backend = $this->multiBackend;
@@ -873,8 +935,8 @@ class FileBackendTest extends MediaWikiTestCase {
 		foreach ( $srcs as $i => $source ) {
 			$this->prepare( array( 'dir' => dirname( $source ) ) );
 			$ops[] = array(
-				'op'      => 'create', // operation
-				'dst'     => $source, // source
+				'op' => 'create', // operation
+				'dst' => $source, // source
 				'content' => $srcsContent[$i]
 			);
 			$expContent .= $srcsContent[$i];
@@ -927,7 +989,7 @@ class FileBackendTest extends MediaWikiTestCase {
 		}
 	}
 
-	function provider_testConcatenate() {
+	public static function provider_testConcatenate() {
 		$cases = array();
 
 		$rand = mt_rand( 0, 2000000000 ) . time();
@@ -979,6 +1041,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testGetFileStat
+	 * @covers FileBackend::getFileStat
 	 */
 	public function testGetFileStat( $path, $content, $alreadyExists ) {
 		$this->backend = $this->singleBackend;
@@ -1041,7 +1104,7 @@ class FileBackendTest extends MediaWikiTestCase {
 		}
 	}
 
-	function provider_testGetFileStat() {
+	public static function provider_testGetFileStat() {
 		$cases = array();
 
 		$base = self::baseStorePath();
@@ -1054,6 +1117,8 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testGetFileContents
+	 * @covers FileBackend::getFileContents
+	 * @covers FileBackend::getFileContentsMulti
 	 */
 	public function testGetFileContents( $source, $content ) {
 		$this->backend = $this->singleBackend;
@@ -1096,7 +1161,7 @@ class FileBackendTest extends MediaWikiTestCase {
 		}
 	}
 
-	function provider_testGetFileContents() {
+	public static function provider_testGetFileContents() {
 		$cases = array();
 
 		$base = self::baseStorePath();
@@ -1113,6 +1178,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testGetLocalCopy
+	 * @covers FileBackend::getLocalCopy
 	 */
 	public function testGetLocalCopy( $source, $content ) {
 		$this->backend = $this->singleBackend;
@@ -1164,7 +1230,7 @@ class FileBackendTest extends MediaWikiTestCase {
 		$tmpFile->bind( $obj );
 	}
 
-	function provider_testGetLocalCopy() {
+	public static function provider_testGetLocalCopy() {
 		$cases = array();
 
 		$base = self::baseStorePath();
@@ -1182,6 +1248,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testGetLocalReference
+	 * @covers FileBackend::getLocalReference
 	 */
 	public function testGetLocalReference( $source, $content ) {
 		$this->backend = $this->singleBackend;
@@ -1230,7 +1297,7 @@ class FileBackendTest extends MediaWikiTestCase {
 		}
 	}
 
-	function provider_testGetLocalReference() {
+	public static function provider_testGetLocalReference() {
 		$cases = array();
 
 		$base = self::baseStorePath();
@@ -1246,6 +1313,10 @@ class FileBackendTest extends MediaWikiTestCase {
 		return $cases;
 	}
 
+	/**
+	 * @covers FileBackend::getLocalCopy
+	 * @covers FileBackend::getLocalReference
+	 */
 	public function testGetLocalCopyAndReference404() {
 		$this->backend = $this->singleBackend;
 		$this->tearDownFiles();
@@ -1274,6 +1345,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testGetFileHttpUrl
+	 * @covers FileBackend::getFileHttpUrl
 	 */
 	public function testGetFileHttpUrl( $source, $content ) {
 		$this->backend = $this->singleBackend;
@@ -1305,7 +1377,7 @@ class FileBackendTest extends MediaWikiTestCase {
 		}
 	}
 
-	function provider_testGetFileHttpUrl() {
+	public static function provider_testGetFileHttpUrl() {
 		$cases = array();
 
 		$base = self::baseStorePath();
@@ -1318,6 +1390,8 @@ class FileBackendTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provider_testPrepareAndClean
+	 * @covers FileBackend::prepare
+	 * @covers FileBackend::clean
 	 */
 	public function testPrepareAndClean( $path, $isOK ) {
 		$this->backend = $this->singleBackend;
@@ -1329,8 +1403,9 @@ class FileBackendTest extends MediaWikiTestCase {
 		$this->tearDownFiles();
 	}
 
-	function provider_testPrepareAndClean() {
+	public static function provider_testPrepareAndClean() {
 		$base = self::baseStorePath();
+
 		return array(
 			array( "$base/unittest-cont1/e/a/z/some_file1.txt", true ),
 			array( "$base/unittest-cont2/a/z/some_file2.txt", true ),
@@ -1375,6 +1450,9 @@ class FileBackendTest extends MediaWikiTestCase {
 		$this->tearDownFiles();
 	}
 
+	/**
+	 * @covers FileBackend::clean
+	 */
 	private function doTestRecursiveClean() {
 		$backendName = $this->backendClass();
 
@@ -1419,8 +1497,11 @@ class FileBackendTest extends MediaWikiTestCase {
 		}
 	}
 
-	// @TODO: testSecure
+	// @todo testSecure
 
+	/**
+	 * @covers FileBackend::doOperations
+	 */
 	public function testDoOperations() {
 		$this->backend = $this->singleBackend;
 		$this->tearDownFiles();
@@ -1508,6 +1589,9 @@ class FileBackendTest extends MediaWikiTestCase {
 			"Correct file SHA-1 of $fileC" );
 	}
 
+	/**
+	 * @covers FileBackend::doOperations
+	 */
 	public function testDoOperationsPipeline() {
 		$this->backend = $this->singleBackend;
 		$this->tearDownFiles();
@@ -1607,6 +1691,9 @@ class FileBackendTest extends MediaWikiTestCase {
 			"Correct file SHA-1 of $fileC" );
 	}
 
+	/**
+	 * @covers FileBackend::doOperations
+	 */
 	public function testDoOperationsFailing() {
 		$this->backend = $this->singleBackend;
 		$this->tearDownFiles();
@@ -1681,6 +1768,9 @@ class FileBackendTest extends MediaWikiTestCase {
 			"Correct file SHA-1 of $fileA" );
 	}
 
+	/**
+	 * @covers FileBackend::getFileList
+	 */
 	public function testGetFileList() {
 		$this->backend = $this->singleBackend;
 		$this->tearDownFiles();
@@ -1729,7 +1819,7 @@ class FileBackendTest extends MediaWikiTestCase {
 		$this->assertEquals( true, $status->isOK(),
 			"Creation of files succeeded with OK status ($backendName)." );
 
-		// Expected listing
+		// Expected listing at root
 		$expected = array(
 			"e/test1.txt",
 			"e/test2.txt",
@@ -1748,27 +1838,28 @@ class FileBackendTest extends MediaWikiTestCase {
 		);
 		sort( $expected );
 
-		// Actual listing (no trailing slash)
-		$list = array();
+		// Actual listing (no trailing slash) at root
 		$iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1" ) );
-		foreach ( $iter as $file ) {
-			$list[] = $file;
-		}
+		$list = $this->listToArray( $iter );
 		sort( $list );
+		$this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
+		// Actual listing (no trailing slash) at root with advise
+		$iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1", 'adviseStat' => 1 ) );
+		$list = $this->listToArray( $iter );
+		sort( $list );
 		$this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
-		// Actual listing (with trailing slash)
+		// Actual listing (with trailing slash) at root
 		$list = array();
 		$iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/" ) );
 		foreach ( $iter as $file ) {
 			$list[] = $file;
 		}
 		sort( $list );
-
 		$this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
-		// Expected listing
+		// Expected listing at subdir
 		$expected = array(
 			"test1.txt",
 			"test2.txt",
@@ -1780,36 +1871,39 @@ class FileBackendTest extends MediaWikiTestCase {
 		);
 		sort( $expected );
 
-		// Actual listing (no trailing slash)
-		$list = array();
+		// Actual listing (no trailing slash) at subdir
 		$iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
-		foreach ( $iter as $file ) {
-			$list[] = $file;
-		}
+		$list = $this->listToArray( $iter );
 		sort( $list );
+		$this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
+		// Actual listing (no trailing slash) at subdir with advise
+		$iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir", 'adviseStat' => 1 ) );
+		$list = $this->listToArray( $iter );
+		sort( $list );
 		$this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
-		// Actual listing (with trailing slash)
+		// Actual listing (with trailing slash) at subdir
 		$list = array();
 		$iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir/" ) );
 		foreach ( $iter as $file ) {
 			$list[] = $file;
 		}
 		sort( $list );
-
 		$this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
 		// Actual listing (using iterator second time)
-		$list = array();
-		foreach ( $iter as $file ) {
-			$list[] = $file;
-		}
+		$list = $this->listToArray( $iter );
 		sort( $list );
-
 		$this->assertEquals( $expected, $list, "Correct file listing ($backendName), second iteration." );
 
-		// Expected listing (top files only)
+		// Actual listing (top files only) at root
+		$iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1" ) );
+		$list = $this->listToArray( $iter );
+		sort( $list );
+		$this->assertEquals( array(), $list, "Correct top file listing ($backendName)." );
+
+		// Expected listing (top files only) at subdir
 		$expected = array(
 			"test1.txt",
 			"test2.txt",
@@ -1819,14 +1913,16 @@ class FileBackendTest extends MediaWikiTestCase {
 		);
 		sort( $expected );
 
-		// Actual listing (top files only)
-		$list = array();
+		// Actual listing (top files only) at subdir
 		$iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
-		foreach ( $iter as $file ) {
-			$list[] = $file;
-		}
+		$list = $this->listToArray( $iter );
 		sort( $list );
+		$this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
 
+		// Actual listing (top files only) at subdir with advise
+		$iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir", 'adviseStat' => 1 ) );
+		$list = $this->listToArray( $iter );
+		sort( $list );
 		$this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
 
 		foreach ( $files as $file ) { // clean up
@@ -1834,9 +1930,15 @@ class FileBackendTest extends MediaWikiTestCase {
 		}
 
 		$iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
-		foreach ( $iter as $iter ) {} // no errors
+		foreach ( $iter as $iter ) {
+			// no errors
+		}
 	}
 
+	/**
+	 * @covers FileBackend::getTopDirectoryList
+	 * @covers FileBackend::getDirectoryList
+	 */
 	public function testGetDirectoryList() {
 		$this->backend = $this->singleBackend;
 		$this->tearDownFiles();
@@ -2023,7 +2125,7 @@ class FileBackendTest extends MediaWikiTestCase {
 		$this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
 
 		$iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir1" ) );
-		$items = is_array( $iter ) ? $iter : iterator_to_array( $iter );
+		$items = $this->listToArray( $iter );
 		$this->assertEquals( array(), $items, "Directory listing is empty." );
 
 		foreach ( $files as $file ) { // clean up
@@ -2031,15 +2133,22 @@ class FileBackendTest extends MediaWikiTestCase {
 		}
 
 		$iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
-		foreach ( $iter as $file ) {} // no errors
-		$items = is_array( $iter ) ? $iter : iterator_to_array( $iter );
+		foreach ( $iter as $file ) {
+			// no errors
+		}
+
+		$items = $this->listToArray( $iter );
 		$this->assertEquals( array(), $items, "Directory listing is empty." );
 
 		$iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/e/not/exists" ) );
-		$items = is_array( $iter ) ? $iter : iterator_to_array( $iter );
+		$items = $this->listToArray( $iter );
 		$this->assertEquals( array(), $items, "Directory listing is empty." );
 	}
 
+	/**
+	 * @covers FileBackend::lockFiles
+	 * @covers FileBackend::unlockFiles
+	 */
 	public function testLockCalls() {
 		$this->backend = $this->singleBackend;
 		$this->doTestLockCalls();
@@ -2071,7 +2180,7 @@ class FileBackendTest extends MediaWikiTestCase {
 			"subdir2/subdir/sub/120-px-file.txt",
 		);
 
-		for ( $i=0; $i<25; $i++ ) {
+		for ( $i = 0; $i < 25; $i++ ) {
 			$status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
 			$this->assertEquals( print_r( array(), true ), print_r( $status->errors, true ),
 				"Locking of files succeeded ($backendName) ($i)." );
@@ -2141,6 +2250,11 @@ class FileBackendTest extends MediaWikiTestCase {
 			"Scoped unlocking of files succeeded with OK status ($backendName)." );
 	}
 
+	// helper function
+	private function listToArray( $iter ) {
+		return is_array( $iter ) ? $iter : iterator_to_array( $iter );
+	}
+
 	// test helper wrapper for backend prepare() function
 	private function prepare( array $params ) {
 		return $this->backend->prepare( $params );
@@ -2149,12 +2263,15 @@ class FileBackendTest extends MediaWikiTestCase {
 	// test helper wrapper for backend prepare() function
 	private function create( array $params ) {
 		$params['op'] = 'create';
+
 		return $this->backend->doQuickOperations( array( $params ) );
 	}
 
 	function tearDownFiles() {
 		foreach ( $this->filesToPrune as $file ) {
-			@unlink( $file );
+			if ( is_file( $file ) ) {
+				unlink( $file );
+			}
 		}
 		$containers = array( 'unittest-cont1', 'unittest-cont2' );
 		foreach ( $containers as $container ) {
diff --git a/tests/phpunit/includes/filerepo/FileRepoTest.php b/tests/phpunit/includes/filerepo/FileRepoTest.php
index 7cc25b1b..e3a75567 100644
--- a/tests/phpunit/includes/filerepo/FileRepoTest.php
+++ b/tests/phpunit/includes/filerepo/FileRepoTest.php
@@ -4,37 +4,44 @@ class FileRepoTest extends MediaWikiTestCase {
 
 	/**
 	 * @expectedException MWException
+	 * @covers FileRepo::__construct
 	 */
-	function testFileRepoConstructionOptionCanNotBeNull() {
-		$f = new FileRepo();
+	public function testFileRepoConstructionOptionCanNotBeNull() {
+		new FileRepo();
 	}
 
 	/**
 	 * @expectedException MWException
+	 * @covers FileRepo::__construct
 	 */
-	function testFileRepoConstructionOptionCanNotBeAnEmptyArray() {
-		$f = new FileRepo( array() );
+	public function testFileRepoConstructionOptionCanNotBeAnEmptyArray() {
+		new FileRepo( array() );
 	}
 
 	/**
 	 * @expectedException MWException
+	 * @covers FileRepo::__construct
 	 */
-	function testFileRepoConstructionOptionNeedNameKey() {
-		$f = new FileRepo( array(
+	public function testFileRepoConstructionOptionNeedNameKey() {
+		new FileRepo( array(
 			'backend' => 'foobar'
 		) );
 	}
 
 	/**
 	 * @expectedException MWException
+	 * @covers FileRepo::__construct
 	 */
-	function testFileRepoConstructionOptionNeedBackendKey() {
-		$f = new FileRepo( array(
+	public function testFileRepoConstructionOptionNeedBackendKey() {
+		new FileRepo( array(
 			'name' => 'foobar'
 		) );
 	}
 
-	function testFileRepoConstructionWithRequiredOptions() {
+	/**
+	 * @covers FileRepo::__construct
+	 */
+	public function testFileRepoConstructionWithRequiredOptions() {
 		$f = new FileRepo( array(
 			'name' => 'FileRepoTestRepository',
 			'backend' => new FSFileBackend( array(
diff --git a/tests/phpunit/includes/filerepo/StoreBatchTest.php b/tests/phpunit/includes/filerepo/StoreBatchTest.php
index a89ef98e..b33c1bbb 100644
--- a/tests/phpunit/includes/filerepo/StoreBatchTest.php
+++ b/tests/phpunit/includes/filerepo/StoreBatchTest.php
@@ -1,10 +1,16 @@
 <?php
+
 /**
  * @group FileRepo
  * @group medium
  */
 class StoreBatchTest extends MediaWikiTestCase {
 
+	protected $createdFiles;
+	protected $date;
+	/** @var FileRepo */
+	protected $repo;
+
 	protected function setUp() {
 		global $wgFileBackends;
 		parent::setUp();
@@ -60,6 +66,7 @@ class StoreBatchTest extends MediaWikiTestCase {
 	 * @param $originalName string The title of the image
 	 * @param $srcPath string The filepath or virtual URL
 	 * @param $flags integer Flags to pass into repo::store().
+	 * @return FileRepoStatus
 	 */
 	private function storeit( $originalName, $srcPath, $flags ) {
 		$hashPath = $this->repo->getHashPath( $originalName );
@@ -69,6 +76,7 @@ class StoreBatchTest extends MediaWikiTestCase {
 		$result = $this->repo->store( $srcPath, 'temp', $dstRel, $flags );
 		$result->value = $this->repo->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
 		$this->createdFiles[] = $result->value;
+
 		return $result;
 	}
 
@@ -78,7 +86,7 @@ class StoreBatchTest extends MediaWikiTestCase {
 	 * @param $fn string The title of the image
 	 * @param $infn string The name of the file (in the filesystem)
 	 * @param $otherfn string The name of the different file (in the filesystem)
-	 * @param $fromrepo logical 'true' if we want to copy from a virtual URL out of the Repo.
+	 * @param $fromrepo bool 'true' if we want to copy from a virtual URL out of the Repo.
 	 */
 	private function storecohort( $fn, $infn, $otherfn, $fromrepo ) {
 		$f = $this->storeit( $fn, $infn, 0 );
@@ -115,6 +123,9 @@ class StoreBatchTest extends MediaWikiTestCase {
 		$this->assertEquals( $f->successCount, 0, "counts wrong {$f->successCount} {$f->failCount}" );
 	}
 
+	/**
+	 * @covers FileRepo::store
+	 */
 	public function teststore() {
 		global $IP;
 		$this->storecohort( "Test1.png", "$IP/skins/monobook/wiki.png", "$IP/skins/monobook/video.png", false );
diff --git a/tests/phpunit/includes/installer/InstallDocFormatterTest.php b/tests/phpunit/includes/installer/InstallDocFormatterTest.php
index 74b921a5..0e5f2671 100644
--- a/tests/phpunit/includes/installer/InstallDocFormatterTest.php
+++ b/tests/phpunit/includes/installer/InstallDocFormatterTest.php
@@ -1,5 +1,5 @@
 <?php
-/* 
+/*
  * To change this template, choose Tools | Templates
  * and open the template in the editor.
  */
@@ -9,7 +9,7 @@ class InstallDocFormatterTest extends MediaWikiTestCase {
 	 * @covers InstallDocFormatter::format
 	 * @dataProvider provideDocFormattingTests
 	 */
-	function testFormat( $expected, $unformattedText, $message = '' ) {
+	public function testFormat( $expected, $unformattedText, $message = '' ) {
 		$this->assertEquals(
 			$expected,
 			InstallDocFormatter::format( $unformattedText ),
@@ -20,13 +20,14 @@ class InstallDocFormatterTest extends MediaWikiTestCase {
 	/**
 	 * Provider for testFormat()
 	 */
-	function provideDocFormattingTests() {
+	public static function provideDocFormattingTests() {
 		# Format: (expected string, unformattedText string, optional message)
 		return array(
 			# Escape some wikitext
 			array( 'Install &lt;tag>', 'Install <tag>', 'Escaping <' ),
 			array( 'Install &#123;&#123;template}}', 'Install {{template}}', 'Escaping [[' ),
 			array( 'Install &#91;&#91;page]]', 'Install [[page]]', 'Escaping {{' ),
+			array( 'Install &#95;&#95;TOC&#95;&#95;', 'Install __TOC__', 'Escaping __' ),
 			array( 'Install ', "Install \r", 'Removing \r' ),
 
 			# Transform \t{1,2} into :{1,2}
diff --git a/tests/phpunit/includes/installer/OracleInstallerTest.php b/tests/phpunit/includes/installer/OracleInstallerTest.php
new file mode 100644
index 00000000..66e65592
--- /dev/null
+++ b/tests/phpunit/includes/installer/OracleInstallerTest.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * Tests for OracleInstaller
+ *
+ * @group Database
+ * @group Installer
+ */
+
+class OracleInstallerTest extends MediaWikiTestCase {
+
+	/**
+	 * @dataProvider provideOracleConnectStrings
+	 * @covers OracleInstaller::checkConnectStringFormat
+	 */
+	public function testCheckConnectStringFormat( $expected, $connectString, $msg = '' ) {
+		$validity = $expected ? 'should be valid' : 'should NOT be valid';
+		$msg = "'$connectString' ($msg) $validity.";
+		$this->assertEquals( $expected,
+			OracleInstaller::checkConnectStringFormat( $connectString ),
+			$msg
+		);
+	}
+
+	/**
+	 * Provider to test OracleInstaller::checkConnectStringFormat()
+	 */
+	function provideOracleConnectStrings() {
+		// expected result, connectString[, message]
+		return array(
+			array( true, 'simple_01', 'Simple TNS name' ),
+			array( true, 'simple_01.world', 'TNS name with domain' ),
+			array( true, 'simple_01.domain.net', 'TNS name with domain' ),
+			array( true, 'host123', 'Host only' ),
+			array( true, 'host123.domain.net', 'FQDN only' ),
+			array( true, '//host123.domain.net', 'FQDN URL only' ),
+			array( true, '123.223.213.132', 'Host IP only' ),
+			array( true, 'host:1521', 'Host and port' ),
+			array( true, 'host:1521/service', 'Host, port and service' ),
+			array( true, 'host:1521/service:shared', 'Host, port, service and shared server type' ),
+			array( true, 'host:1521/service:dedicated', 'Host, port, service and dedicated server type' ),
+			array( true, 'host:1521/service:pooled', 'Host, port, service and pooled server type' ),
+			array( true, 'host:1521/service:shared/instance1', 'Host, port, service, server type and instance' ),
+			array( true, 'host:1521//instance1', 'Host, port and instance' ),
+		);
+	}
+
+}
diff --git a/tests/phpunit/includes/jobqueue/JobQueueTest.php b/tests/phpunit/includes/jobqueue/JobQueueTest.php
index 453cec31..4e51c4fc 100644
--- a/tests/phpunit/includes/jobqueue/JobQueueTest.php
+++ b/tests/phpunit/includes/jobqueue/JobQueueTest.php
@@ -8,19 +8,19 @@
 class JobQueueTest extends MediaWikiTestCase {
 	protected $key;
 	protected $queueRand, $queueRandTTL, $queueFifo, $queueFifoTTL;
-	protected $old = array();
 
-	function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+	function __construct( $name = null, array $data = array(), $dataName = '' ) {
 		parent::__construct( $name, $data, $dataName );
 
 		$this->tablesUsed[] = 'job';
 	}
 
 	protected function setUp() {
-		global $wgMemc, $wgJobTypeConf;
+		global $wgJobTypeConf;
 		parent::setUp();
-		$this->old['wgMemc'] = $wgMemc;
-		$wgMemc = new HashBagOStuff();
+
+		$this->setMwGlobals( 'wgMemc', new HashBagOStuff() );
+
 		if ( $this->getCliArg( 'use-jobqueue=' ) ) {
 			$name = $this->getCliArg( 'use-jobqueue=' );
 			if ( !isset( $wgJobTypeConf[$name] ) ) {
@@ -32,44 +32,50 @@ class JobQueueTest extends MediaWikiTestCase {
 		}
 		$baseConfig['type'] = 'null';
 		$baseConfig['wiki'] = wfWikiID();
-		$this->queueRand = JobQueue::factory(
-			array( 'order' => 'random', 'claimTTL' => 0 ) + $baseConfig );
-		$this->queueRandTTL = JobQueue::factory(
-			array( 'order' => 'random', 'claimTTL' => 10 ) + $baseConfig );
-		$this->queueFifo = JobQueue::factory(
-			array( 'order' => 'fifo', 'claimTTL' => 0 ) + $baseConfig );
-		$this->queueFifoTTL = JobQueue::factory(
-			array( 'order' => 'fifo', 'claimTTL' => 10 ) + $baseConfig );
-		if ( $baseConfig['class'] !== 'JobQueueDB' ) { // DB namespace with prefix or temp tables
-			foreach ( array( 'queueRand', 'queueRandTTL', 'queueFifo', 'queueFifoTTL' ) as $q ) {
-				$this->$q->setTestingPrefix( 'unittests-' . wfRandomString( 32 ) );
-			}
+		$variants = array(
+			'queueRand' => array( 'order' => 'random', 'claimTTL' => 0 ),
+			'queueRandTTL' => array( 'order' => 'random', 'claimTTL' => 10 ),
+			'queueTimestamp' => array( 'order' => 'timestamp', 'claimTTL' => 0 ),
+			'queueTimestampTTL' => array( 'order' => 'timestamp', 'claimTTL' => 10 ),
+			'queueFifo' => array( 'order' => 'fifo', 'claimTTL' => 0 ),
+			'queueFifoTTL' => array( 'order' => 'fifo', 'claimTTL' => 10 ),
+		);
+		foreach ( $variants as $q => $settings ) {
+			try {
+				$this->$q = JobQueue::factory( $settings + $baseConfig );
+				if ( !( $this->$q instanceof JobQueueDB ) ) {
+					$this->$q->setTestingPrefix( 'unittests-' . wfRandomString( 32 ) );
+				}
+			} catch ( MWException $e ) {
+				// unsupported?
+				// @todo What if it was another error?
+			};
 		}
 	}
 
 	protected function tearDown() {
-		global $wgMemc;
 		parent::tearDown();
-		foreach ( array( 'queueRand', 'queueRandTTL', 'queueFifo', 'queueFifoTTL' ) as $q ) {
-			do {
-				$job = $this->$q->pop();
-				if ( $job ) {
-					$this->$q->ack( $job );
-				}
-			} while ( $job );
+		foreach (
+			array(
+				'queueRand', 'queueRandTTL', 'queueTimestamp', 'queueTimestampTTL',
+				'queueFifo', 'queueFifoTTL'
+			) as $q
+		) {
+			if ( $this->$q ) {
+				$this->$q->delete();
+			}
+			$this->$q = null;
 		}
-		$this->queueRand = null;
-		$this->queueRandTTL = null;
-		$this->queueFifo = null;
-		$this->queueFifoTTL = null;
-		$wgMemc = $this->old['wgMemc'];
 	}
 
 	/**
 	 * @dataProvider provider_queueLists
 	 */
-	function testProperties( $queue, $order, $recycles, $desc ) {
+	public function testProperties( $queue, $recycles, $desc ) {
 		$queue = $this->$queue;
+		if ( !$queue ) {
+			$this->markTestSkipped( $desc );
+		}
 
 		$this->assertEquals( wfWikiID(), $queue->getWiki(), "Proper wiki ID ($desc)" );
 		$this->assertEquals( 'null', $queue->getType(), "Proper job type ($desc)" );
@@ -78,8 +84,12 @@ class JobQueueTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provider_queueLists
 	 */
-	function testBasicOperations( $queue, $order, $recycles, $desc ) {
+	public function testBasicOperations( $queue, $recycles, $desc ) {
 		$queue = $this->$queue;
+		if ( !$queue ) {
+			$this->markTestSkipped( $desc );
+		}
+
 		$this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
 		$queue->flushCaches();
@@ -94,6 +104,8 @@ class JobQueueTest extends MediaWikiTestCase {
 		$queue->flushCaches();
 		$this->assertEquals( 2, $queue->getSize(), "Queue size is correct ($desc)" );
 		$this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
+		$jobs = iterator_to_array( $queue->getAllQueuedJobs() );
+		$this->assertEquals( 2, count( $jobs ), "Queue iterator size is correct ($desc)" );
 
 		$job1 = $queue->pop();
 		$this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
@@ -132,13 +144,25 @@ class JobQueueTest extends MediaWikiTestCase {
 
 		$queue->flushCaches();
 		$this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
+
+		$this->assertTrue( $queue->batchPush( array( $this->newJob(), $this->newJob() ) ),
+			"Push worked ($desc)" );
+		$this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
+
+		$queue->delete();
+		$queue->flushCaches();
+		$this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
+		$this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
 	}
 
 	/**
 	 * @dataProvider provider_queueLists
 	 */
-	function testBasicDeduplication( $queue, $order, $recycles, $desc ) {
+	public function testBasicDeduplication( $queue, $recycles, $desc ) {
 		$queue = $this->$queue;
+		if ( !$queue ) {
+			$this->markTestSkipped( $desc );
+		}
 
 		$this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
@@ -146,8 +170,10 @@ class JobQueueTest extends MediaWikiTestCase {
 		$this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
 		$this->assertEquals( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
 
-		$this->assertTrue( $queue->batchPush(
-				array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() ) ),
+		$this->assertTrue(
+			$queue->batchPush(
+				array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() )
+			),
 			"Push worked ($desc)" );
 
 		$this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
@@ -156,9 +182,12 @@ class JobQueueTest extends MediaWikiTestCase {
 		$this->assertEquals( 1, $queue->getSize(), "Queue size is correct ($desc)" );
 		$this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
 
-		$this->assertTrue( $queue->batchPush(
-				array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() ) ),
-			"Push worked ($desc)" );
+		$this->assertTrue(
+			$queue->batchPush(
+				array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() )
+			),
+			"Push worked ($desc)"
+		);
 
 		$this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
 
@@ -186,8 +215,11 @@ class JobQueueTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provider_queueLists
 	 */
-	function testRootDeduplication( $queue, $order, $recycles, $desc ) {
+	public function testRootDeduplication( $queue, $recycles, $desc ) {
 		$queue = $this->$queue;
+		if ( !$queue ) {
+			$this->markTestSkipped( $desc );
+		}
 
 		$this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
@@ -236,8 +268,11 @@ class JobQueueTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provider_fifoQueueLists
 	 */
-	function testJobOrder( $queue, $recycles, $desc ) {
+	public function testJobOrder( $queue, $recycles, $desc ) {
 		$queue = $this->$queue;
+		if ( !$queue ) {
+			$this->markTestSkipped( $desc );
+		}
 
 		$this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
@@ -264,16 +299,18 @@ class JobQueueTest extends MediaWikiTestCase {
 		$this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
 	}
 
-	function provider_queueLists() {
+	public static function provider_queueLists() {
 		return array(
-			array( 'queueRand', 'rand', false, 'Random queue without ack()' ),
-			array( 'queueRandTTL', 'rand', true, 'Random queue with ack()' ),
-			array( 'queueFifo', 'fifo', false, 'Ordered queue without ack()' ),
-			array( 'queueFifoTTL', 'fifo', true, 'Ordered queue with ack()' )
+			array( 'queueRand', false, 'Random queue without ack()' ),
+			array( 'queueRandTTL', true, 'Random queue with ack()' ),
+			array( 'queueTimestamp', false, 'Time ordered queue without ack()' ),
+			array( 'queueTimestampTTL', true, 'Time ordered queue with ack()' ),
+			array( 'queueFifo', false, 'FIFO ordered queue without ack()' ),
+			array( 'queueFifoTTL', true, 'FIFO ordered queue with ack()' )
 		);
 	}
 
-	function provider_fifoQueueLists() {
+	public static function provider_fifoQueueLists() {
 		return array(
 			array( 'queueFifo', false, 'Ordered queue without ack()' ),
 			array( 'queueFifoTTL', true, 'Ordered queue with ack()' )
diff --git a/tests/phpunit/includes/json/FormatJsonTest.php b/tests/phpunit/includes/json/FormatJsonTest.php
new file mode 100644
index 00000000..149be05b
--- /dev/null
+++ b/tests/phpunit/includes/json/FormatJsonTest.php
@@ -0,0 +1,161 @@
+<?php
+
+class FormatJsonTest extends MediaWikiTestCase {
+
+	public function testEncoderPrettyPrinting() {
+		$obj = array(
+			'emptyObject' => new stdClass,
+			'emptyArray' => array(),
+			'string' => 'foobar\\',
+			'filledArray' => array(
+				array(
+					123,
+					456,
+				),
+				// Nested json works without problems
+				'"7":["8",{"9":"10"}]',
+				// Whitespace clean up doesn't touch strings that look alike
+				"{\n\t\"emptyObject\": {\n\t},\n\t\"emptyArray\": [ ]\n}",
+			),
+		);
+
+		// 4 space indent, no trailing whitespace, no trailing linefeed
+		$json = '{
+    "emptyObject": {},
+    "emptyArray": [],
+    "string": "foobar\\\\",
+    "filledArray": [
+        [
+            123,
+            456
+        ],
+        "\"7\":[\"8\",{\"9\":\"10\"}]",
+        "{\n\t\"emptyObject\": {\n\t},\n\t\"emptyArray\": [ ]\n}"
+    ]
+}';
+
+		$json = str_replace( "\r", '', $json ); // Windows compat
+		$this->assertSame( $json, FormatJson::encode( $obj, true ) );
+	}
+
+	public static function provideEncodeDefault() {
+		return self::getEncodeTestCases( array() );
+	}
+
+	/**
+	 * @dataProvider provideEncodeDefault
+	 */
+	public function testEncodeDefault( $from, $to ) {
+		$this->assertSame( $to, FormatJson::encode( $from ) );
+	}
+
+	public static function provideEncodeUtf8() {
+		return self::getEncodeTestCases( array( 'unicode' ) );
+	}
+
+	/**
+	 * @dataProvider provideEncodeUtf8
+	 */
+	public function testEncodeUtf8( $from, $to ) {
+		$this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::UTF8_OK ) );
+	}
+
+	public static function provideEncodeXmlMeta() {
+		return self::getEncodeTestCases( array( 'xmlmeta' ) );
+	}
+
+	/**
+	 * @dataProvider provideEncodeXmlMeta
+	 */
+	public function testEncodeXmlMeta( $from, $to ) {
+		$this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::XMLMETA_OK ) );
+	}
+
+	public static function provideEncodeAllOk() {
+		return self::getEncodeTestCases( array( 'unicode', 'xmlmeta' ) );
+	}
+
+	/**
+	 * @dataProvider provideEncodeAllOk
+	 */
+	public function testEncodeAllOk( $from, $to ) {
+		$this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::ALL_OK ) );
+	}
+
+	public function testEncodePhpBug46944() {
+		$this->assertNotEquals(
+			'\ud840\udc00',
+			strtolower( FormatJson::encode( "\xf0\xa0\x80\x80" ) ),
+			'Test encoding an broken json_encode character (U+20000)'
+		);
+	}
+
+	public function testDecodeReturnType() {
+		$this->assertInternalType(
+			'object',
+			FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}' ),
+			'Default to object'
+		);
+
+		$this->assertInternalType(
+			'array',
+			FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}', true ),
+			'Optional array'
+		);
+	}
+
+	/**
+	 * Generate a set of test cases for a particular combination of encoder options.
+	 *
+	 * @param array $unescapedGroups List of character groups to leave unescaped
+	 * @return array: Arrays of unencoded strings and corresponding encoded strings
+	 */
+	private static function getEncodeTestCases( array $unescapedGroups ) {
+		$groups = array(
+			'always' => array(
+				// Forward slash (always unescaped)
+				'/' => '/',
+
+				// Control characters
+				"\0" => '\u0000',
+				"\x08" => '\b',
+				"\t" => '\t',
+				"\n" => '\n',
+				"\r" => '\r',
+				"\f" => '\f',
+				"\x1f" => '\u001f', // representative example
+
+				// Double quotes
+				'"' => '\"',
+
+				// Backslashes
+				'\\' => '\\\\',
+				'\\\\' => '\\\\\\\\',
+				'\\u00e9' => '\\\u00e9', // security check for Unicode unescaping
+
+				// Line terminators
+				"\xe2\x80\xa8" => '\u2028',
+				"\xe2\x80\xa9" => '\u2029',
+			),
+			'unicode' => array(
+				"\xc3\xa9" => '\u00e9',
+				"\xf0\x9d\x92\x9e" => '\ud835\udc9e', // U+1D49E, outside the BMP
+			),
+			'xmlmeta' => array(
+				'<' => '\u003C', // JSON_HEX_TAG uses uppercase hex digits
+				'>' => '\u003E',
+				'&' => '\u0026',
+			),
+		);
+
+		$cases = array();
+		foreach ( $groups as $name => $rules ) {
+			$leaveUnescaped = in_array( $name, $unescapedGroups );
+			foreach ( $rules as $from => $to ) {
+				$cases[] = array( $from, '"' . ( $leaveUnescaped ? $from : $to ) . '"' );
+			}
+		}
+
+		return $cases;
+	}
+}
diff --git a/tests/phpunit/includes/json/ServicesJsonTest.php b/tests/phpunit/includes/json/ServicesJsonTest.php
deleted file mode 100644
index 56dc6488..00000000
--- a/tests/phpunit/includes/json/ServicesJsonTest.php
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-/* 
- * Test cases for our Services_Json library. Requires PHP json support as well,
- * so we can compare output
- */
-class ServicesJsonTest extends MediaWikiTestCase {
-	/**
-	 * Test to make sure core json_encode() and our Services_Json()->encode()
-	 * produce the same output
-	 *
-	 * @dataProvider provideValuesToEncode
-	 */
-	public function testJsonEncode( $input, $desc ) {
-		if ( !function_exists( 'json_encode' ) ) {
-			$this->markTestIncomplete( 'No PHP json support, unable to test' );
-			return;
-		} elseif ( strtolower( json_encode( "\xf0\xa0\x80\x80" ) ) != '"\ud840\udc00"' ) {
-			$this->markTestIncomplete( 'Have buggy PHP json support, unable to test' );
-			return;
-		} else {
-			$jsonObj = new Services_JSON();
-			$this->assertEquals(
-				$jsonObj->encode( $input ),
-				json_encode( $input ),
-				$desc
-			);
-		}
-	}
-
-	/**
-	 * Test to make sure core json_decode() and our Services_Json()->decode()
-	 * produce the same output
-	 *
-	 * @dataProvider provideValuesToDecode
-	 */
-	public function testJsonDecode( $input, $desc ) {
-		if ( !function_exists( 'json_decode' ) ) {
-			$this->markTestIncomplete( 'No PHP json support, unable to test' );
-			return;
-		} else {
-			$jsonObj = new Services_JSON();
-			$this->assertEquals(
-				$jsonObj->decode( $input ),
-				json_decode( $input ),
-				$desc
-			);
-		}
-	}
-
-	function provideValuesToEncode() {
-		$obj = new stdClass();
-		$obj->property = 'value';
-		$obj->property2 = null;
-		$obj->property3 = 1.234;
-		return array(
-			array( 1, 'basic integer' ),
-			array( -1, 'negative integer' ),
-			array( 1.1, 'basic float' ),
-			array( true, 'basic bool true' ),
-			array( false, 'basic bool false' ),
-			array( 'some string', 'basic string test' ),
-			array( "some string\nwith newline", 'newline string test' ),
-			array( '♥ü', 'unicode string test' ),
-			array( array( 'some', 'string', 'values' ), 'basic array of strings' ),
-			array( array( 'key1' => 'val1', 'key2' => 'val2' ), 'array with string keys' ),
-			array( array( 1 => 'val1', 3 => 'val2', '2' => 'val3' ), 'out of order numbered array test' ),
-			array( array(), 'empty array test' ),
-			array( $obj, 'basic object test' ),
-			array( new stdClass, 'empty object test' ),
-			array( null, 'null test' ),
-		);
-	}
-
-	function provideValuesToDecode() {
-		return array(
-			array( '1', 'basic integer' ),
-			array( '-1', 'negative integer' ),
-			array( '1.1', 'basic float' ),
-			array( '1.1e1', 'scientific float' ),
-			array( 'true', 'basic bool true' ),
-			array( 'false', 'basic bool false' ),
-			array( '"some string"', 'basic string test' ),
-			array( '"some string\nwith newline"', 'newline string test' ),
-			array( '"♥ü"', 'unicode character string test' ),
-			array( '"\u2665"', 'unicode \\u string test' ),
-			array( '["some","string","values"]', 'basic array of strings' ),
-			array( '[]', 'empty array test' ),
-			array( '{"key":"value"}', 'Basic key => value test' ),
-			array( '{}', 'empty object test' ),
-			array( 'null', 'null test' ),
-		);
-	}
-}
diff --git a/tests/phpunit/includes/libs/CSSJanusTest.php b/tests/phpunit/includes/libs/CSSJanusTest.php
index 26747b91..5a3c1619 100644
--- a/tests/phpunit/includes/libs/CSSJanusTest.php
+++ b/tests/phpunit/includes/libs/CSSJanusTest.php
@@ -4,12 +4,14 @@
  * CSSJanus libary:
  * http://code.google.com/p/cssjanus/source/browse/trunk/cssjanus_test.py
  * Ported to PHP for ResourceLoader and has been extended since.
+ *
+ * @covers CSSJanus
  */
 class CSSJanusTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provideTransformCases
 	 */
-	function testTransform( $cssA, $cssB = null ) {
+	public function testTransform( $cssA, $cssB = null ) {
 
 		if ( $cssB ) {
 			$transformedA = CSSJanus::transform( $cssA );
@@ -28,7 +30,7 @@ class CSSJanusTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provideTransformAdvancedCases
 	 */
-	function testTransformAdvanced( $code, $expectedOutput, $options = array() ) {
+	public function testTransformAdvanced( $code, $expectedOutput, $options = array() ) {
 		$swapLtrRtlInURL = isset( $options['swapLtrRtlInURL'] ) ? $options['swapLtrRtlInURL'] : false;
 		$swapLeftRightInURL = isset( $options['swapLeftRightInURL'] ) ? $options['swapLeftRightInURL'] : false;
 
@@ -44,7 +46,7 @@ class CSSJanusTest extends MediaWikiTestCase {
 	 * @dataProvider provideTransformBrokenCases
 	 * @group Broken
 	 */
-	function testTransformBroken( $code, $expectedOutput ) {
+	public function testTransformBroken( $code, $expectedOutput ) {
 		$flipped = CSSJanus::transform( $code );
 
 		$this->assertEquals( $expectedOutput, $flipped, 'Test flipping' );
@@ -54,7 +56,7 @@ class CSSJanusTest extends MediaWikiTestCase {
 	 * These transform cases are tested *in both directions*
 	 * No need to declare a principle twice in both directions here.
 	 */
-	function provideTransformCases() {
+	public static function provideTransformCases() {
 		return array(
 			// Property keys
 			array(
@@ -137,10 +139,15 @@ class CSSJanusTest extends MediaWikiTestCase {
 				'.foo { padding: 1px inherit 3px auto; }',
 				'.foo { padding: 1px auto 3px inherit; }'
 			),
+			// border-radius assigns different meanings to the values
 			array(
 				'.foo { border-radius: .25em 15px 0pt 0ex; }',
-				'.foo { border-radius: .25em 0ex 0pt 15px; }'
+				'.foo { border-radius: 15px .25em 0ex 0pt; }'
 			),
+			array(
+				'.foo { border-radius: 0px 0px 5px 5px; }',
+			),
+			// Ensure the rule doesn't break other stuff
 			array(
 				'.foo { x-unknown: a b c d; }'
 			),
@@ -151,14 +158,26 @@ class CSSJanusTest extends MediaWikiTestCase {
 				'#settings td p strong'
 			),
 			array(
-				# Not sure how 4+ values should behave,
-				# testing to make sure changes are detected
-				'.foo { x-unknown: 1 2 3 4 5; }',
-				'.foo { x-unknown: 1 4 3 2 5; }',
+				// Color names
+				'.foo { border-color: red green blue white }',
+				'.foo { border-color: red white blue green }',
+			),
+			array(
+				// Color name, hexdecimal, RGB & RGBA
+				'.foo { border-color: red #f00 rgb(255, 0, 0) rgba(255, 0, 0, 0.5) }',
+				'.foo { border-color: red rgba(255, 0, 0, 0.5) rgb(255, 0, 0) #f00 }',
+			),
+			array(
+				// Color name, hexdecimal, HSL & HSLA
+				'.foo { border-color: red #f00 hsl(0, 100%, 50%) hsla(0, 100%, 50%, 0.5) }',
+				'.foo { border-color: red hsla(0, 100%, 50%, 0.5) hsl(0, 100%, 50%) #f00 }',
 			),
 			array(
-				'.foo { x-unknown: 1 2 3 4 5 6; }',
-				'.foo { x-unknown: 1 4 3 2 5 6; }',
+				// Do not mangle 5 or more values
+				'.foo { -x-unknown: 1 2 3 4 5; }'
+			),
+			array(
+				'.foo { -x-unknown: 1 2 3 4 5 6; }'
 			),
 
 			// Shorthand / Three notation
@@ -179,6 +198,28 @@ class CSSJanusTest extends MediaWikiTestCase {
 				'.foo { padding: 1px; }'
 			),
 
+			// text-shadow and box-shadow
+			array(
+				'.foo { box-shadow: -6px 3px 8px 5px rgba(0, 0, 0, 0.25); }',
+				'.foo { box-shadow: 6px 3px 8px 5px rgba(0, 0, 0, 0.25); }',
+			),
+			array(
+				'.foo { box-shadow: inset -6px 3px 8px 5px rgba(0, 0, 0, 0.25); }',
+				'.foo { box-shadow: inset 6px 3px 8px 5px rgba(0, 0, 0, 0.25); }',
+			),
+			array(
+				'.foo { text-shadow: orange 2px 0; }',
+				'.foo { text-shadow: orange -2px 0; }',
+			),
+			array(
+				'.foo { text-shadow: 2px 0 orange; }',
+				'.foo { text-shadow: -2px 0 orange; }',
+			),
+			array(
+				// Don't mangle zeroes
+				'.foo { text-shadow: orange 0 2px; }'
+			),
+
 			// Direction
 			// Note: This differs from the Python implementation,
 			// see also CSSJanus::fixDirection for more info.
@@ -376,6 +417,11 @@ class CSSJanusTest extends MediaWikiTestCase {
 				'/* @noflip */ div { float: left; } .foo { float: left; }',
 				'/* @noflip */ div { float: left; } .foo { float: right; }'
 			),
+			array(
+				// support parentheses in selector
+				'/* @noflip */ .test:not(:first) { margin-right: -0.25em; margin-left: 0.25em; }',
+				'/* @noflip */ .test:not(:first) { margin-right: -0.25em; margin-left: 0.25em; }'
+			),
 			array(
 				// after multiple rules
 				'.foo { float: left; } /* @noflip */ div { float: left; }',
@@ -476,7 +522,7 @@ class CSSJanusTest extends MediaWikiTestCase {
 	 * If both ways can be tested, either put both versions in here or move
 	 * it to provideTransformCases().
 	 */
-	function provideTransformAdvancedCases() {
+	public static function provideTransformAdvancedCases() {
 		$bgPairs = array(
 			# [ - _ . ] <-> [ left right ltr rtl ]
 			'foo.jpg' => 'foo.jpg',
@@ -542,7 +588,7 @@ class CSSJanusTest extends MediaWikiTestCase {
 	 * Cases that are currently failing, but
 	 * should be looked at in the future as enhancements and/or bug fix
 	 */
-	function provideTransformBrokenCases() {
+	public static function provideTransformBrokenCases() {
 		return array(
 			// Guard against selectors that look flippable
 			array(
diff --git a/tests/phpunit/includes/libs/CSSMinTest.php b/tests/phpunit/includes/libs/CSSMinTest.php
index 57017a84..951dd7b9 100644
--- a/tests/phpunit/includes/libs/CSSMinTest.php
+++ b/tests/phpunit/includes/libs/CSSMinTest.php
@@ -21,13 +21,13 @@ class CSSMinTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provideMinifyCases
 	 */
-	function testMinify( $code, $expectedOutput ) {
+	public function testMinify( $code, $expectedOutput ) {
 		$minified = CSSMin::minify( $code );
 
 		$this->assertEquals( $expectedOutput, $minified, 'Minified output should be in the form expected.' );
 	}
 
-	function provideMinifyCases() {
+	public static function provideMinifyCases() {
 		return array(
 			// Whitespace
 			array( "\r\t\f \v\n\r", "" ),
@@ -70,14 +70,14 @@ class CSSMinTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provideRemapCases
 	 */
-	function testRemap( $message, $params, $expectedOutput ) {
+	public function testRemap( $message, $params, $expectedOutput ) {
 		$remapped = call_user_func_array( 'CSSMin::remap', $params );
 
 		$messageAdd = " Case: $message";
 		$this->assertEquals( $expectedOutput, $remapped, 'CSSMin::remap should return the expected url form.' . $messageAdd );
 	}
 
-	function provideRemapCases() {
+	public static function provideRemapCases() {
 		// Parameter signature:
 		// CSSMin::remap( $code, $local, $remote, $embedData = true )
 		return array(
@@ -115,11 +115,11 @@ class CSSMinTest extends MediaWikiTestCase {
 	 * @group Broken
 	 * @dataProvider provideStringCases
 	 */
-	function testMinifyWithCSSStringValues( $code, $expectedOutput ) {
+	public function testMinifyWithCSSStringValues( $code, $expectedOutput ) {
 		$this->testMinifyOutput( $code, $expectedOutput );
 	}
 
-	function provideStringCases() {
+	public static function provideStringCases() {
 		return array(
 			// String values should be respected
 			// - More than one space in a string value
diff --git a/tests/phpunit/includes/libs/GenericArrayObjectTest.php b/tests/phpunit/includes/libs/GenericArrayObjectTest.php
index 37a9b347..7436c43c 100644
--- a/tests/phpunit/includes/libs/GenericArrayObjectTest.php
+++ b/tests/phpunit/includes/libs/GenericArrayObjectTest.php
@@ -73,6 +73,7 @@ abstract class GenericArrayObjectTest extends MediaWikiTestCase {
 	 */
 	protected function getNew( array $elements = array() ) {
 		$class = $this->getInstanceClass();
+
 		return new $class( $elements );
 	}
 
@@ -197,6 +198,7 @@ abstract class GenericArrayObjectTest extends MediaWikiTestCase {
 	public function testOffsetSet( array $elements ) {
 		if ( $elements === array() ) {
 			$this->assertTrue( true );
+
 			return;
 		}
 
@@ -258,5 +260,4 @@ abstract class GenericArrayObjectTest extends MediaWikiTestCase {
 
 		$this->assertArrayEquals( $list, $copy, true, true );
 	}
-
 }
diff --git a/tests/phpunit/includes/libs/IEUrlExtensionTest.php b/tests/phpunit/includes/libs/IEUrlExtensionTest.php
index d04dd7d4..66fe915a 100644
--- a/tests/phpunit/includes/libs/IEUrlExtensionTest.php
+++ b/tests/phpunit/includes/libs/IEUrlExtensionTest.php
@@ -4,7 +4,7 @@
  * Tests for IEUrlExtension::findIE6Extension
  */
 class IEUrlExtensionTest extends MediaWikiTestCase {
-	function testSimple() {
+	public function testSimple() {
 		$this->assertEquals(
 			'y',
 			IEUrlExtension::findIE6Extension( 'x.y' ),
@@ -12,7 +12,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testSimpleNoExt() {
+	public function testSimpleNoExt() {
 		$this->assertEquals(
 			'',
 			IEUrlExtension::findIE6Extension( 'x' ),
@@ -20,7 +20,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testEmpty() {
+	public function testEmpty() {
 		$this->assertEquals(
 			'',
 			IEUrlExtension::findIE6Extension( '' ),
@@ -28,7 +28,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testQuestionMark() {
+	public function testQuestionMark() {
 		$this->assertEquals(
 			'',
 			IEUrlExtension::findIE6Extension( '?' ),
@@ -36,7 +36,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testExtQuestionMark() {
+	public function testExtQuestionMark() {
 		$this->assertEquals(
 			'x',
 			IEUrlExtension::findIE6Extension( '.x?' ),
@@ -44,7 +44,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testQuestionMarkExt() {
+	public function testQuestionMarkExt() {
 		$this->assertEquals(
 			'x',
 			IEUrlExtension::findIE6Extension( '?.x' ),
@@ -52,7 +52,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testInvalidChar() {
+	public function testInvalidChar() {
 		$this->assertEquals(
 			'',
 			IEUrlExtension::findIE6Extension( '.x*' ),
@@ -60,7 +60,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testInvalidCharThenExtension() {
+	public function testInvalidCharThenExtension() {
 		$this->assertEquals(
 			'x',
 			IEUrlExtension::findIE6Extension( '*.x' ),
@@ -68,7 +68,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testMultipleQuestionMarks() {
+	public function testMultipleQuestionMarks() {
 		$this->assertEquals(
 			'c',
 			IEUrlExtension::findIE6Extension( 'a?b?.c?.d?e?f' ),
@@ -76,7 +76,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testExeException() {
+	public function testExeException() {
 		$this->assertEquals(
 			'd',
 			IEUrlExtension::findIE6Extension( 'a?b?.exe?.d?.e' ),
@@ -84,7 +84,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testExeException2() {
+	public function testExeException2() {
 		$this->assertEquals(
 			'exe',
 			IEUrlExtension::findIE6Extension( 'a?b?.exe' ),
@@ -92,7 +92,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testHash() {
+	public function testHash() {
 		$this->assertEquals(
 			'',
 			IEUrlExtension::findIE6Extension( 'a#b.c' ),
@@ -100,7 +100,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testHash2() {
+	public function testHash2() {
 		$this->assertEquals(
 			'',
 			IEUrlExtension::findIE6Extension( 'a?#b.c' ),
@@ -108,7 +108,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testDotAtEnd() {
+	public function testDotAtEnd() {
 		$this->assertEquals(
 			'',
 			IEUrlExtension::findIE6Extension( '.' ),
@@ -116,7 +116,7 @@ class IEUrlExtensionTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testTwoDots() {
+	public function testTwoDots() {
 		$this->assertEquals(
 			'z',
 			IEUrlExtension::findIE6Extension( 'x.y.z' ),
diff --git a/tests/phpunit/includes/libs/JavaScriptMinifierTest.php b/tests/phpunit/includes/libs/JavaScriptMinifierTest.php
index 1f550795..ab72e361 100644
--- a/tests/phpunit/includes/libs/JavaScriptMinifierTest.php
+++ b/tests/phpunit/includes/libs/JavaScriptMinifierTest.php
@@ -2,7 +2,7 @@
 
 class JavaScriptMinifierTest extends MediaWikiTestCase {
 
-	function provideCases() {
+	public static function provideCases() {
 		return array(
 
 			// Basic whitespace and comments that should be stripped entirely
@@ -119,7 +119,7 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provideCases
 	 */
-	function testJavaScriptMinifierOutput( $code, $expectedOutput ) {
+	public function testJavaScriptMinifierOutput( $code, $expectedOutput ) {
 		$minified = JavaScriptMinifier::minify( $code );
 
 		// JSMin+'s parser will throw an exception if output is not valid JS.
@@ -132,7 +132,7 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
 		$this->assertEquals( $expectedOutput, $minified, "Minified output should be in the form expected." );
 	}
 
-	function provideBug32548() {
+	public static function provideBug32548() {
 		return array(
 			array(
 				// This one gets interpreted all together by the prior code;
@@ -153,7 +153,7 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provideBug32548
 	 */
-	function testBug32548Exponent( $num ) {
+	public function testBug32548Exponent( $num ) {
 		// Long line breaking was being incorrectly done between the base and
 		// exponent part of a number, causing a syntax error. The line should
 		// instead break at the start of the number.
diff --git a/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php b/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
index b221b832..a0e63a8a 100644
--- a/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
+++ b/tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
@@ -16,18 +16,17 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
 	 * Basically the file has IPTC and XMP metadata, the
 	 * IPTC should override the XMP, except for the multilingual
 	 * translation (to en) where XMP should win.
+	 * @covers BitmapMetadataHandler::Jpeg
 	 */
 	public function testMultilingualCascade() {
-		global $wgShowEXIF;
-
-		if ( !wfDl( 'exif' ) ) {
+		if ( !extension_loaded( 'exif' ) ) {
 			$this->markTestSkipped( "This test needs the exif extension." );
 		}
-		if ( !wfDl( 'xml' ) ) {
+		if ( !extension_loaded( 'xml' ) ) {
 			$this->markTestSkipped( "This test needs the xml extension." );
 		}
 
-		$wgShowEXIF = true;
+		$this->setMwGlobals( 'wgShowEXIF', true );
 
 		$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
 			'/Xmp-exif-multilingual_test.jpg' );
@@ -50,6 +49,7 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
 	 *
 	 * There's more extensive tests of comment extraction in
 	 * JpegMetadataExtractorTests.php
+	 * @covers BitmapMetadataHandler::Jpeg
 	 */
 	public function testJpegComment() {
 		$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
@@ -62,6 +62,7 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
 	/**
 	 * Make sure a bad iptc block doesn't stop the other metadata
 	 * from being extracted.
+	 * @covers BitmapMetadataHandler::Jpeg
 	 */
 	public function testBadIPTC() {
 		$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
@@ -69,6 +70,9 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
 		$this->assertEquals( 'Created with GIMP', $meta['JPEGFileComment'][0] );
 	}
 
+	/**
+	 * @covers BitmapMetadataHandler::Jpeg
+	 */
 	public function testIPTCDates() {
 		$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
 			'iptc-timetest.jpg' );
@@ -80,6 +84,7 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
 	/**
 	 * File has an invalid time (+ one valid but really weird time)
 	 * that shouldn't be included
+	 * @covers BitmapMetadataHandler::Jpeg
 	 */
 	public function testIPTCDatesInvalid() {
 		$meta = BitmapMetadataHandler::Jpeg( $this->filePath .
@@ -93,6 +98,8 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
 	 * XMP data should take priority over iptc data
 	 * when hash has been updated, but not when
 	 * the hash is wrong.
+	 * @covers BitmapMetadataHandler::addMetadata
+	 * @covers BitmapMetadataHandler::getMetadataArray
 	 */
 	public function testMerging() {
 		$merger = new BitmapMetadataHandler();
@@ -116,8 +123,11 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
 		$this->assertEquals( $expected, $actual );
 	}
 
+	/**
+	 * @covers BitmapMetadataHandler::png
+	 */
 	public function testPNGXMP() {
-		if ( !wfDl( 'xml' ) ) {
+		if ( !extension_loaded( 'xml' ) ) {
 			$this->markTestSkipped( "This test needs the xml extension." );
 		}
 		$handler = new BitmapMetadataHandler();
@@ -136,6 +146,9 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
 		$this->assertEquals( $expected, $result );
 	}
 
+	/**
+	 * @covers BitmapMetadataHandler::png
+	 */
 	public function testPNGNative() {
 		$handler = new BitmapMetadataHandler();
 		$result = $handler->png( $this->filePath . 'Png-native-test.png' );
@@ -143,10 +156,12 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
 		$this->assertEquals( $expected, $result['metadata']['Identifier']['x-default'] );
 	}
 
+	/**
+	 * @covers BitmapMetadataHandler::getTiffByteOrder
+	 */
 	public function testTiffByteOrder() {
 		$handler = new BitmapMetadataHandler();
 		$res = $handler->getTiffByteOrder( $this->filePath . 'test.tiff' );
 		$this->assertEquals( 'LE', $res );
 	}
-
 }
diff --git a/tests/phpunit/includes/media/BitmapScalingTest.php b/tests/phpunit/includes/media/BitmapScalingTest.php
index 3de60b73..9395b660 100644
--- a/tests/phpunit/includes/media/BitmapScalingTest.php
+++ b/tests/phpunit/includes/media/BitmapScalingTest.php
@@ -13,8 +13,9 @@ class BitmapScalingTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideNormaliseParams
+	 * @covers BitmapHandler::normaliseParams
 	 */
-	function testNormaliseParams( $fileDimensions, $expectedParams, $params, $msg ) {
+	public function testNormaliseParams( $fileDimensions, $expectedParams, $params, $msg ) {
 		$file = new FakeDimensionFile( $fileDimensions );
 		$handler = new BitmapHandler;
 		$valid = $handler->normaliseParams( $file, $params );
@@ -22,7 +23,7 @@ class BitmapScalingTest extends MediaWikiTestCase {
 		$this->assertEquals( $expectedParams, $params, $msg );
 	}
 
-	function provideNormaliseParams() {
+	public static function provideNormaliseParams() {
 		return array(
 			/* Regular resize operations */
 			array(
@@ -102,7 +103,10 @@ class BitmapScalingTest extends MediaWikiTestCase {
 		);
 	}
 
-	function testTooBigImage() {
+	/**
+	 * @covers BitmapHandler::doTransform
+	 */
+	public function testTooBigImage() {
 		$file = new FakeDimensionFile( array( 4000, 4000 ) );
 		$handler = new BitmapHandler;
 		$params = array( 'width' => '3700' ); // Still bigger than max size.
@@ -110,7 +114,10 @@ class BitmapScalingTest extends MediaWikiTestCase {
 			get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
 	}
 
-	function testTooBigMustRenderImage() {
+	/**
+	 * @covers BitmapHandler::doTransform
+	 */
+	public function testTooBigMustRenderImage() {
 		$file = new FakeDimensionFile( array( 4000, 4000 ) );
 		$file->mustRender = true;
 		$handler = new BitmapHandler;
@@ -119,36 +126,12 @@ class BitmapScalingTest extends MediaWikiTestCase {
 			get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
 	}
 
-	function testImageArea() {
+	/**
+	 * @covers BitmapHandler::getImageArea
+	 */
+	public function testImageArea() {
 		$file = new FakeDimensionFile( array( 7, 9 ) );
 		$handler = new BitmapHandler;
 		$this->assertEquals( 63, $handler->getImageArea( $file ) );
 	}
 }
-
-class FakeDimensionFile extends File {
-	public $mustRender = false;
-
-	public function __construct( $dimensions ) {
-		parent::__construct( Title::makeTitle( NS_FILE, 'Test' ),
-			new NullRepo( null ) );
-
-		$this->dimensions = $dimensions;
-	}
-
-	public function getWidth( $page = 1 ) {
-		return $this->dimensions[0];
-	}
-
-	public function getHeight( $page = 1 ) {
-		return $this->dimensions[1];
-	}
-
-	public function mustRender() {
-		return $this->mustRender;
-	}
-
-	public function getPath() {
-		return '';
-	}
-}
diff --git a/tests/phpunit/includes/media/ExifBitmapTest.php b/tests/phpunit/includes/media/ExifBitmapTest.php
index 1109c478..a2e0eb62 100644
--- a/tests/phpunit/includes/media/ExifBitmapTest.php
+++ b/tests/phpunit/includes/media/ExifBitmapTest.php
@@ -2,53 +2,79 @@
 
 class ExifBitmapTest extends MediaWikiTestCase {
 
+	/**
+	 * @var ExifBitmapHandler
+	 */
+	protected $handler;
+
 	protected function setUp() {
 		parent::setUp();
+		if ( !extension_loaded( 'exif' ) ) {
+			$this->markTestSkipped( "This test needs the exif extension." );
+		}
 
 		$this->setMwGlobals( 'wgShowEXIF', true );
 
 		$this->handler = new ExifBitmapHandler;
-		if ( !wfDl( 'exif' ) ) {
-			$this->markTestSkipped( "This test needs the exif extension." );
-		}
+
 	}
 
+	/**
+	 * @covers ExifBitmapHandler::isMetadataValid
+	 */
 	public function testIsOldBroken() {
 		$res = $this->handler->isMetadataValid( null, ExifBitmapHandler::OLD_BROKEN_FILE );
 		$this->assertEquals( ExifBitmapHandler::METADATA_COMPATIBLE, $res );
 	}
 
+	/**
+	 * @covers ExifBitmapHandler::isMetadataValid
+	 */
 	public function testIsBrokenFile() {
 		$res = $this->handler->isMetadataValid( null, ExifBitmapHandler::BROKEN_FILE );
 		$this->assertEquals( ExifBitmapHandler::METADATA_GOOD, $res );
 	}
 
+	/**
+	 * @covers ExifBitmapHandler::isMetadataValid
+	 */
 	public function testIsInvalid() {
 		$res = $this->handler->isMetadataValid( null, 'Something Invalid Here.' );
 		$this->assertEquals( ExifBitmapHandler::METADATA_BAD, $res );
 	}
 
+	/**
+	 * @covers ExifBitmapHandler::isMetadataValid
+	 */
 	public function testGoodMetadata() {
 		$meta = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
 		$res = $this->handler->isMetadataValid( null, $meta );
 		$this->assertEquals( ExifBitmapHandler::METADATA_GOOD, $res );
 	}
 
+	/**
+	 * @covers ExifBitmapHandler::isMetadataValid
+	 */
 	public function testIsOldGood() {
 		$meta = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:1;}';
 		$res = $this->handler->isMetadataValid( null, $meta );
 		$this->assertEquals( ExifBitmapHandler::METADATA_COMPATIBLE, $res );
 	}
 
-	// Handle metadata from paged tiff handler (gotten via instant commons)
-	// gracefully.
+	/**
+	 * Handle metadata from paged tiff handler (gotten via instant commons) gracefully.
+	 * @covers ExifBitmapHandler::isMetadataValid
+	 */
 	public function testPagedTiffHandledGracefully() {
 		$meta = 'a:6:{s:9:"page_data";a:1:{i:1;a:5:{s:5:"width";i:643;s:6:"height";i:448;s:5:"alpha";s:4:"true";s:4:"page";i:1;s:6:"pixels";i:288064;}}s:10:"page_count";i:1;s:10:"first_page";i:1;s:9:"last_page";i:1;s:4:"exif";a:9:{s:10:"ImageWidth";i:643;s:11:"ImageLength";i:448;s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:4;s:12:"RowsPerStrip";i:50;s:19:"PlanarConfiguration";i:1;s:22:"MEDIAWIKI_EXIF_VERSION";i:1;}s:21:"TIFF_METADATA_VERSION";s:3:"1.4";}';
 		$res = $this->handler->isMetadataValid( null, $meta );
 		$this->assertEquals( ExifBitmapHandler::METADATA_BAD, $res );
 	}
 
-	function testConvertMetadataLatest() {
+	/**
+	 * @covers ExifBitmapHandler::convertMetadataVersion
+	 */
+	public function testConvertMetadataLatest() {
 		$metadata = array(
 			'foo' => array( 'First', 'Second', '_type' => 'ol' ),
 			'MEDIAWIKI_EXIF_VERSION' => 2
@@ -57,7 +83,10 @@ class ExifBitmapTest extends MediaWikiTestCase {
 		$this->assertEquals( $metadata, $res );
 	}
 
-	function testConvertMetadataToOld() {
+	/**
+	 * @covers ExifBitmapHandler::convertMetadataVersion
+	 */
+	public function testConvertMetadataToOld() {
 		$metadata = array(
 			'foo' => array( 'First', 'Second', '_type' => 'ol' ),
 			'bar' => array( 'First', 'Second', '_type' => 'ul' ),
@@ -76,7 +105,10 @@ class ExifBitmapTest extends MediaWikiTestCase {
 		$this->assertEquals( $expected, $res );
 	}
 
-	function testConvertMetadataSoftware() {
+	/**
+	 * @covers ExifBitmapHandler::convertMetadataVersion
+	 */
+	public function testConvertMetadataSoftware() {
 		$metadata = array(
 			'Software' => array( array( 'GIMP', '1.1' ) ),
 			'MEDIAWIKI_EXIF_VERSION' => 2,
@@ -89,7 +121,10 @@ class ExifBitmapTest extends MediaWikiTestCase {
 		$this->assertEquals( $expected, $res );
 	}
 
-	function testConvertMetadataSoftwareNormal() {
+	/**
+	 * @covers ExifBitmapHandler::convertMetadataVersion
+	 */
+	public function testConvertMetadataSoftwareNormal() {
 		$metadata = array(
 			'Software' => array( "GIMP 1.2", "vim" ),
 			'MEDIAWIKI_EXIF_VERSION' => 2,
diff --git a/tests/phpunit/includes/media/ExifRotationTest.php b/tests/phpunit/includes/media/ExifRotationTest.php
index db29d17c..64276d92 100644
--- a/tests/phpunit/includes/media/ExifRotationTest.php
+++ b/tests/phpunit/includes/media/ExifRotationTest.php
@@ -3,11 +3,17 @@
  * Tests related to auto rotation.
  *
  * @group medium
+ *
+ * @todo covers tags
  */
 class ExifRotationTest extends MediaWikiTestCase {
 
 	protected function setUp() {
 		parent::setUp();
+		if ( !extension_loaded( 'exif' ) ) {
+			$this->markTestSkipped( "This test needs the exif extension." );
+		}
+
 		$this->handler = new BitmapHandler();
 		$filePath = __DIR__ . '/../../data/media';
 
@@ -22,31 +28,17 @@ class ExifRotationTest extends MediaWikiTestCase {
 				'containerPaths' => array( 'temp-thumb' => $tmpDir, 'data' => $filePath )
 			) )
 		) );
-		if ( !wfDl( 'exif' ) ) {
-			$this->markTestSkipped( "This test needs the exif extension." );
-		}
-		global $wgShowEXIF;
-		$this->show = $wgShowEXIF;
-		$wgShowEXIF = true;
 
-		global $wgEnableAutoRotation;
-		$this->oldAuto = $wgEnableAutoRotation;
-		$wgEnableAutoRotation = true;
-	}
-
-	protected function tearDown() {
-		global $wgShowEXIF, $wgEnableAutoRotation;
-		$wgShowEXIF = $this->show;
-		$wgEnableAutoRotation = $this->oldAuto;
-
-		parent::tearDown();
+		$this->setMwGlobals( array(
+			'wgShowEXIF' => true,
+			'wgEnableAutoRotation' => true,
+		) );
 	}
 
 	/**
-	 *
 	 * @dataProvider provideFiles
 	 */
-	function testMetadata( $name, $type, $info ) {
+	public function testMetadata( $name, $type, $info ) {
 		if ( !BitmapHandler::canRotate() ) {
 			$this->markTestSkipped( "This test needs a rasterizer that can auto-rotate." );
 		}
@@ -59,7 +51,7 @@ class ExifRotationTest extends MediaWikiTestCase {
 	 *
 	 * @dataProvider provideFiles
 	 */
-	function testRotationRendering( $name, $type, $info, $thumbs ) {
+	public function testRotationRendering( $name, $type, $info, $thumbs ) {
 		if ( !BitmapHandler::canRotate() ) {
 			$this->markTestSkipped( "This test needs a rasterizer that can auto-rotate." );
 		}
@@ -138,24 +130,20 @@ class ExifRotationTest extends MediaWikiTestCase {
 	 * Same as before, but with auto-rotation disabled.
 	 * @dataProvider provideFilesNoAutoRotate
 	 */
-	function testMetadataNoAutoRotate( $name, $type, $info ) {
-		global $wgEnableAutoRotation;
-		$wgEnableAutoRotation = false;
+	public function testMetadataNoAutoRotate( $name, $type, $info ) {
+		$this->setMwGlobals( 'wgEnableAutoRotation', false );
 
 		$file = $this->dataFile( $name, $type );
 		$this->assertEquals( $info['width'], $file->getWidth(), "$name: width check" );
 		$this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
-
-		$wgEnableAutoRotation = true;
 	}
 
 	/**
 	 *
 	 * @dataProvider provideFilesNoAutoRotate
 	 */
-	function testRotationRenderingNoAutoRotate( $name, $type, $info, $thumbs ) {
-		global $wgEnableAutoRotation;
-		$wgEnableAutoRotation = false;
+	public function testRotationRenderingNoAutoRotate( $name, $type, $info, $thumbs ) {
+		$this->setMwGlobals( 'wgEnableAutoRotation', false );
 
 		foreach ( $thumbs as $size => $out ) {
 			if ( preg_match( '/^(\d+)px$/', $size, $matches ) ) {
@@ -187,7 +175,6 @@ class ExifRotationTest extends MediaWikiTestCase {
 				$this->assertEquals( $out[1], $gis[1], "$name: thumb actual height check for $size" );
 			}
 		}
-		$wgEnableAutoRotation = true;
 	}
 
 	public static function provideFilesNoAutoRotate() {
@@ -230,7 +217,7 @@ class ExifRotationTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provideBitmapExtractPreRotationDimensions
 	 */
-	function testBitmapExtractPreRotationDimensions( $rotation, $expected ) {
+	public function testBitmapExtractPreRotationDimensions( $rotation, $expected ) {
 		$result = $this->handler->extractPreRotationDimensions( array(
 			'physicalWidth' => self::TEST_WIDTH,
 			'physicalHeight' => self::TEST_HEIGHT,
@@ -238,7 +225,7 @@ class ExifRotationTest extends MediaWikiTestCase {
 		$this->assertEquals( $expected, $result );
 	}
 
-	function provideBitmapExtractPreRotationDimensions() {
+	public static function provideBitmapExtractPreRotationDimensions() {
 		return array(
 			array(
 				0,
diff --git a/tests/phpunit/includes/media/ExifTest.php b/tests/phpunit/includes/media/ExifTest.php
index e7e95f7e..dea36b03 100644
--- a/tests/phpunit/includes/media/ExifTest.php
+++ b/tests/phpunit/includes/media/ExifTest.php
@@ -1,14 +1,18 @@
 <?php
 class ExifTest extends MediaWikiTestCase {
 
+	/** @var string */
+	protected $mediaPath;
+
 	protected function setUp() {
 		parent::setUp();
+		if ( !extension_loaded( 'exif' ) ) {
+			$this->markTestSkipped( "This test needs the exif extension." );
+		}
 
 		$this->mediaPath = __DIR__ . '/../../data/media/';
 
-		if ( !wfDl( 'exif' ) ) {
-			$this->markTestSkipped( "This test needs the exif extension." );
-		}
+
 
 		$this->setMwGlobals( 'wgShowEXIF', true );
 	}
@@ -39,6 +43,4 @@ class ExifTest extends MediaWikiTestCase {
 		);
 		$this->assertEquals( $expected, $data );
 	}
-
-
 }
diff --git a/tests/phpunit/includes/media/FakeDimensionFile.php b/tests/phpunit/includes/media/FakeDimensionFile.php
new file mode 100644
index 00000000..7926000b
--- /dev/null
+++ b/tests/phpunit/includes/media/FakeDimensionFile.php
@@ -0,0 +1,28 @@
+<?php
+
+class FakeDimensionFile extends File {
+	public $mustRender = false;
+
+	public function __construct( $dimensions ) {
+		parent::__construct( Title::makeTitle( NS_FILE, 'Test' ),
+			new NullRepo( null ) );
+
+		$this->dimensions = $dimensions;
+	}
+
+	public function getWidth( $page = 1 ) {
+		return $this->dimensions[0];
+	}
+
+	public function getHeight( $page = 1 ) {
+		return $this->dimensions[1];
+	}
+
+	public function mustRender() {
+		return $this->mustRender;
+	}
+
+	public function getPath() {
+		return '';
+	}
+}
\ No newline at end of file
diff --git a/tests/phpunit/includes/media/FormatMetadataTest.php b/tests/phpunit/includes/media/FormatMetadataTest.php
index f26d27ee..a073e4ca 100644
--- a/tests/phpunit/includes/media/FormatMetadataTest.php
+++ b/tests/phpunit/includes/media/FormatMetadataTest.php
@@ -1,10 +1,19 @@
 <?php
+
+/**
+ * @todo covers tags
+ */
 class FormatMetadataTest extends MediaWikiTestCase {
 
+	/** @var FSFileBackend */
+	protected $backend;
+	/** @var FSRepo */
+	protected $repo;
+
 	protected function setUp() {
 		parent::setUp();
 
-		if ( !wfDl( 'exif' ) ) {
+		if ( !extension_loaded( 'exif' ) ) {
 			$this->markTestSkipped( "This test needs the exif extension." );
 		}
 		$filePath = __DIR__ . '/../../data/media';
diff --git a/tests/phpunit/includes/media/GIFMetadataExtractorTest.php b/tests/phpunit/includes/media/GIFMetadataExtractorTest.php
index 86cf3465..9e3f9244 100644
--- a/tests/phpunit/includes/media/GIFMetadataExtractorTest.php
+++ b/tests/phpunit/includes/media/GIFMetadataExtractorTest.php
@@ -12,6 +12,7 @@ class GIFMetadataExtractorTest extends MediaWikiTestCase {
 	 * @param $filename String
 	 * @param $expected Array The extracted metadata.
 	 * @dataProvider provideGetMetadata
+	 * @covers GIFMetadataExtractor::getMetadata
 	 */
 	public function testGetMetadata( $filename, $expected ) {
 		$actual = GIFMetadataExtractor::getMetadata( $this->mediaPath . $filename );
diff --git a/tests/phpunit/includes/media/GIFTest.php b/tests/phpunit/includes/media/GIFTest.php
index 7ea6b7ef..c8e729c8 100644
--- a/tests/phpunit/includes/media/GIFTest.php
+++ b/tests/phpunit/includes/media/GIFTest.php
@@ -1,6 +1,15 @@
 <?php
 class GIFHandlerTest extends MediaWikiTestCase {
 
+	/** @var FSFileBackend */
+	protected $backend;
+	/** @var GIFHandler */
+	protected $handler;
+	/** @var FSRepo */
+	protected $repo;
+	/** @var string */
+	protected $filePath;
+
 	protected function setUp() {
 		parent::setUp();
 
@@ -18,6 +27,9 @@ class GIFHandlerTest extends MediaWikiTestCase {
 		$this->handler = new GIFHandler();
 	}
 
+	/**
+	 * @covers GIFHandler::getMetadata
+	 */
 	public function testInvalidFile() {
 		$res = $this->handler->getMetadata( null, $this->filePath . '/README' );
 		$this->assertEquals( GIFHandler::BROKEN_FILE, $res );
@@ -27,6 +39,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
 	 * @param $filename String basename of the file to check
 	 * @param $expected boolean Expected result.
 	 * @dataProvider provideIsAnimated
+	 * @covers GIFHandler::isAnimatedImage
 	 */
 	public function testIsAnimanted( $filename, $expected ) {
 		$file = $this->dataFile( $filename, 'image/gif' );
@@ -45,6 +58,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
 	 * @param $filename String
 	 * @param $expected Integer Total image area
 	 * @dataProvider provideGetImageArea
+	 * @covers GIFHandler::getImageArea
 	 */
 	public function testGetImageArea( $filename, $expected ) {
 		$file = $this->dataFile( $filename, 'image/gif' );
@@ -63,6 +77,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
 	 * @param $metadata String Serialized metadata
 	 * @param $expected Integer One of the class constants of GIFHandler
 	 * @dataProvider provideIsMetadataValid
+	 * @covers GIFHandler::isMetadataValid
 	 */
 	public function testIsMetadataValid( $metadata, $expected ) {
 		$actual = $this->handler->isMetadataValid( null, $metadata );
@@ -83,6 +98,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
 	 * @param $filename String
 	 * @param $expected String Serialized array
 	 * @dataProvider provideGetMetadata
+	 * @covers GIFHandler::getMetadata
 	 */
 	public function testGetMetadata( $filename, $expected ) {
 		$file = $this->dataFile( $filename, 'image/gif' );
diff --git a/tests/phpunit/includes/media/IPTCTest.php b/tests/phpunit/includes/media/IPTCTest.php
index c9648a79..81c1d287 100644
--- a/tests/phpunit/includes/media/IPTCTest.php
+++ b/tests/phpunit/includes/media/IPTCTest.php
@@ -1,11 +1,19 @@
 <?php
+
 class IPTCTest extends MediaWikiTestCase {
+
+	/**
+	 * @covers IPTC::getCharset
+	 */
 	public function testRecognizeUtf8() {
 		// utf-8 is the only one used in practise.
 		$res = IPTC::getCharset( "\x1b%G" );
 		$this->assertEquals( 'UTF-8', $res );
 	}
 
+	/**
+	 * @covers IPTC::Parse
+	 */
 	public function testIPTCParseNoCharset88591() {
 		// basically IPTC for keyword with value of 0xBC which is 1/4 in iso-8859-1
 		// This data doesn't specify a charset. We're supposed to guess
@@ -15,17 +23,22 @@ class IPTCTest extends MediaWikiTestCase {
 		$this->assertEquals( array( '¼' ), $res['Keywords'] );
 	}
 
-	/* This one contains a sequence that's valid iso 8859-1 but not valid utf8 */
-	/* \xC3 = Ã, \xB8 = ¸  */
+	/**
+	 * @covers IPTC::Parse
+	 */
 	public function testIPTCParseNoCharset88591b() {
+		/* This one contains a sequence that's valid iso 8859-1 but not valid utf8 */
+		/* \xC3 = Ã, \xB8 = ¸  */
 		$iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x09\x1c\x02\x19\x00\x04\xC3\xC3\xC3\xB8";
 		$res = IPTC::Parse( $iptcData );
 		$this->assertEquals( array( 'ÃÃÃ¸' ), $res['Keywords'] );
 	}
 
-	/* Same as testIPTCParseNoCharset88591b, but forcing the charset to utf-8.
+	/**
+	 * Same as testIPTCParseNoCharset88591b, but forcing the charset to utf-8.
 	 * What should happen is the first "\xC3\xC3" should be dropped as invalid,
 	 * leaving \xC3\xB8, which is ø
+	 * @covers IPTC::Parse
 	 */
 	public function testIPTCParseForcedUTFButInvalid() {
 		$iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x11\x1c\x02\x19\x00\x04\xC3\xC3\xC3\xB8"
@@ -34,13 +47,19 @@ class IPTCTest extends MediaWikiTestCase {
 		$this->assertEquals( array( 'ø' ), $res['Keywords'] );
 	}
 
+	/**
+	 * @covers IPTC::Parse
+	 */
 	public function testIPTCParseNoCharsetUTF8() {
 		$iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x07\x1c\x02\x19\x00\x02¼";
 		$res = IPTC::Parse( $iptcData );
 		$this->assertEquals( array( '¼' ), $res['Keywords'] );
 	}
 
-	// Testing something that has 2 values for keyword
+	/**
+	 * Testing something that has 2 values for keyword
+	 * @covers IPTC::Parse
+	 */
 	public function testIPTCParseMulti() {
 		$iptcData = /* identifier */ "Photoshop 3.0\08BIM\4\4"
 			/* length */ . "\0\0\0\0\0\x0D"
@@ -50,11 +69,13 @@ class IPTCTest extends MediaWikiTestCase {
 		$this->assertEquals( array( '¼', '¼½' ), $res['Keywords'] );
 	}
 
+	/**
+	 * @covers IPTC::Parse
+	 */
 	public function testIPTCParseUTF8() {
 		// This has the magic "\x1c\x01\x5A\x00\x03\x1B\x25\x47" which marks content as UTF8.
 		$iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x0F\x1c\x02\x19\x00\x02¼\x1c\x01\x5A\x00\x03\x1B\x25\x47";
 		$res = IPTC::Parse( $iptcData );
 		$this->assertEquals( array( '¼' ), $res['Keywords'] );
 	}
-
 }
diff --git a/tests/phpunit/includes/media/JpegMetadataExtractorTest.php b/tests/phpunit/includes/media/JpegMetadataExtractorTest.php
index cae7137b..eafc8a2e 100644
--- a/tests/phpunit/includes/media/JpegMetadataExtractorTest.php
+++ b/tests/phpunit/includes/media/JpegMetadataExtractorTest.php
@@ -5,9 +5,12 @@
  * serve as a very good "test". (Adobe photoshop probably creates such files
  * but it costs money). The implementation of it currently in MediaWiki is based
  * solely on reading the standard, without any real world test files.
+ * @todo covers tags
  */
 class JpegMetadataExtractorTest extends MediaWikiTestCase {
 
+	protected $filePath;
+
 	protected function setUp() {
 		parent::setUp();
 
@@ -18,7 +21,7 @@ class JpegMetadataExtractorTest extends MediaWikiTestCase {
 	 * We also use this test to test padding bytes don't
 	 * screw stuff up
 	 *
-	 * @param $file filename
+	 * @param string $file filename
 	 *
 	 * @dataProvider provideUtf8Comment
 	 */
diff --git a/tests/phpunit/includes/media/JpegTest.php b/tests/phpunit/includes/media/JpegTest.php
index 05d3661e..9af4f1e1 100644
--- a/tests/phpunit/includes/media/JpegTest.php
+++ b/tests/phpunit/includes/media/JpegTest.php
@@ -1,14 +1,18 @@
 <?php
+/**
+ * @todo covers tags
+ */
 class JpegTest extends MediaWikiTestCase {
 
 	protected function setUp() {
 		parent::setUp();
-
-		$this->filePath = __DIR__ . '/../../data/media/';
-		if ( !wfDl( 'exif' ) ) {
+		if ( !extension_loaded( 'exif' ) ) {
 			$this->markTestSkipped( "This test needs the exif extension." );
 		}
 
+		$this->filePath = __DIR__ . '/../../data/media/';
+
+
 		$this->setMwGlobals( 'wgShowEXIF', true );
 	}
 
diff --git a/tests/phpunit/includes/media/MediaHandlerTest.php b/tests/phpunit/includes/media/MediaHandlerTest.php
index 4e4c649f..c28898bb 100644
--- a/tests/phpunit/includes/media/MediaHandlerTest.php
+++ b/tests/phpunit/includes/media/MediaHandlerTest.php
@@ -1,7 +1,12 @@
 <?php
 
 class MediaHandlerTest extends MediaWikiTestCase {
-	function testFitBoxWidth() {
+
+	/**
+	 * @covers MediaHandler::fitBoxWidth
+	 * @todo split into a dataprovider and test method
+	 */
+	public function testFitBoxWidth() {
 		$vals = array(
 			array(
 				'width' => 50,
diff --git a/tests/phpunit/includes/media/PNGMetadataExtractorTest.php b/tests/phpunit/includes/media/PNGMetadataExtractorTest.php
index 1e912017..939f2cfc 100644
--- a/tests/phpunit/includes/media/PNGMetadataExtractorTest.php
+++ b/tests/phpunit/includes/media/PNGMetadataExtractorTest.php
@@ -1,4 +1,8 @@
 <?php
+
+/**
+ * @todo covers tags
+ */
 class PNGMetadataExtractorTest extends MediaWikiTestCase {
 
 	protected function setUp() {
@@ -9,7 +13,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
 	/**
 	 * Tests zTXt tag (compressed textual metadata)
 	 */
-	function testPngNativetZtxt() {
+	public function testPngNativetZtxt() {
 		$this->checkPHPExtension( 'zlib' );
 
 		$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
@@ -26,7 +30,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
 	/**
 	 * Test tEXt tag (Uncompressed textual metadata)
 	 */
-	function testPngNativeText() {
+	public function testPngNativeText() {
 		$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
 			'Png-native-test.png' );
 		$expected = "Some long image desc";
@@ -43,7 +47,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
 	 * tEXt tags must be encoded iso-8859-1 (vs iTXt which are utf-8)
 	 * Make sure non-ascii characters get converted properly
 	 */
-	function testPngNativeTextNonAscii() {
+	public function testPngNativeTextNonAscii() {
 		$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
 			'Png-native-test.png' );
 
@@ -52,7 +56,6 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
 		// encoded as just \xA9.
 		$expected = "© 2010 Bawolff";
 
-
 		$this->assertArrayHasKey( 'text', $meta );
 		$meta = $meta['text'];
 		$this->assertArrayHasKey( 'Copyright', $meta );
@@ -66,7 +69,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
 	 * actual resolution of the image is (aka in dots per meter).
 	 */
 	/*
-	function testPngPhysTag () {
+	public function testPngPhysTag() {
 		$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
 			'Png-native-test.png' );
 
@@ -82,7 +85,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
 	/**
 	 * Given a normal static PNG, check the animation metadata returned.
 	 */
-	function testStaticPngAnimationMetadata() {
+	public function testStaticPngAnimationMetadata() {
 		$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
 			'Png-native-test.png' );
 
@@ -95,7 +98,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
 	 * Given an animated APNG image file
 	 * check it gets animated metadata right.
 	 */
-	function testApngAnimationMetadata() {
+	public function testApngAnimationMetadata() {
 		$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
 			'Animated_PNG_example_bouncing_beach_ball.png' );
 
@@ -105,49 +108,48 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
 		$this->assertEquals( 1.5, $meta['duration'], '', 0.00001 );
 	}
 
-	function testPngBitDepth8() {
+	public function testPngBitDepth8() {
 		$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
 			'Png-native-test.png' );
 
 		$this->assertEquals( 8, $meta['bitDepth'] );
 	}
 
-	function testPngBitDepth1() {
+	public function testPngBitDepth1() {
 		$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
 			'1bit-png.png' );
 		$this->assertEquals( 1, $meta['bitDepth'] );
 	}
 
 
-	function testPngIndexColour() {
+	public function testPngIndexColour() {
 		$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
 			'Png-native-test.png' );
 
 		$this->assertEquals( 'index-coloured', $meta['colorType'] );
 	}
 
-	function testPngRgbColour() {
+	public function testPngRgbColour() {
 		$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
 			'rgb-png.png' );
 		$this->assertEquals( 'truecolour-alpha', $meta['colorType'] );
 	}
 
-	function testPngRgbNoAlphaColour() {
+	public function testPngRgbNoAlphaColour() {
 		$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
 			'rgb-na-png.png' );
 		$this->assertEquals( 'truecolour', $meta['colorType'] );
 	}
 
-	function testPngGreyscaleColour() {
+	public function testPngGreyscaleColour() {
 		$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
 			'greyscale-png.png' );
 		$this->assertEquals( 'greyscale-alpha', $meta['colorType'] );
 	}
 
-	function testPngGreyscaleNoAlphaColour() {
+	public function testPngGreyscaleNoAlphaColour() {
 		$meta = PNGMetadataExtractor::getMetadata( $this->filePath .
 			'greyscale-na-png.png' );
 		$this->assertEquals( 'greyscale', $meta['colorType'] );
 	}
-
 }
diff --git a/tests/phpunit/includes/media/PNGTest.php b/tests/phpunit/includes/media/PNGTest.php
index 855780da..ad4c2493 100644
--- a/tests/phpunit/includes/media/PNGTest.php
+++ b/tests/phpunit/includes/media/PNGTest.php
@@ -1,6 +1,15 @@
 <?php
 class PNGHandlerTest extends MediaWikiTestCase {
 
+	/** @var PNGHandler */
+	protected $handler;
+	/** @var FSRepo */
+	protected $repo;
+	/** @var FSFileBackend */
+	protected $backend;
+	/** @var string */
+	protected $filePath;
+
 	protected function setUp() {
 		parent::setUp();
 
@@ -18,6 +27,9 @@ class PNGHandlerTest extends MediaWikiTestCase {
 		$this->handler = new PNGHandler();
 	}
 
+	/**
+	 * @covers PNGHandler::getMetadata
+	 */
 	public function testInvalidFile() {
 		$res = $this->handler->getMetadata( null, $this->filePath . '/README' );
 		$this->assertEquals( PNGHandler::BROKEN_FILE, $res );
@@ -27,6 +39,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
 	 * @param $filename String basename of the file to check
 	 * @param $expected boolean Expected result.
 	 * @dataProvider provideIsAnimated
+	 * @covers PNGHandler::isAnimatedImage
 	 */
 	public function testIsAnimanted( $filename, $expected ) {
 		$file = $this->dataFile( $filename, 'image/png' );
@@ -45,6 +58,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
 	 * @param $filename String
 	 * @param $expected Integer Total image area
 	 * @dataProvider provideGetImageArea
+	 * @covers PNGHandler::getImageArea
 	 */
 	public function testGetImageArea( $filename, $expected ) {
 		$file = $this->dataFile( $filename, 'image/png' );
@@ -65,6 +79,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
 	 * @param $metadata String Serialized metadata
 	 * @param $expected Integer One of the class constants of PNGHandler
 	 * @dataProvider provideIsMetadataValid
+	 * @covers PNGHandler::isMetadataValid
 	 */
 	public function testIsMetadataValid( $metadata, $expected ) {
 		$actual = $this->handler->isMetadataValid( null, $metadata );
@@ -85,6 +100,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
 	 * @param $filename String
 	 * @param $expected String Serialized array
 	 * @dataProvider provideGetMetadata
+	 * @covers PNGHandler::getMetadata
 	 */
 	public function testGetMetadata( $filename, $expected ) {
 		$file = $this->dataFile( $filename, 'image/png' );
diff --git a/tests/phpunit/includes/media/SVGMetadataExtractorTest.php b/tests/phpunit/includes/media/SVGMetadataExtractorTest.php
index 97a0000d..257009b0 100644
--- a/tests/phpunit/includes/media/SVGMetadataExtractorTest.php
+++ b/tests/phpunit/includes/media/SVGMetadataExtractorTest.php
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @todo covers tags
+ */
 class SVGMetadataExtractorTest extends MediaWikiTestCase {
 
 	protected function setUp() {
@@ -10,17 +13,18 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provideSvgFiles
 	 */
-	function testGetMetadata( $infile, $expected ) {
+	public function testGetMetadata( $infile, $expected ) {
 		$this->assertMetadata( $infile, $expected );
 	}
 
 	/**
 	 * @dataProvider provideSvgFilesWithXMLMetadata
 	 */
-	function testGetXMLMetadata( $infile, $expected ) {
+	public function testGetXMLMetadata( $infile, $expected ) {
 		$r = new XMLReader();
 		if ( !method_exists( $r, 'readInnerXML' ) ) {
 			$this->markTestSkipped( 'XMLReader::readInnerXML() does not exist (libxml >2.6.20 needed).' );
+
 			return;
 		}
 		$this->assertMetadata( $infile, $expected );
@@ -41,6 +45,7 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
 
 	public static function provideSvgFiles() {
 		$base = __DIR__ . '/../../data/media';
+
 		return array(
 			array(
 				"$base/Wikimedia-logo.svg",
diff --git a/tests/phpunit/includes/media/TiffTest.php b/tests/phpunit/includes/media/TiffTest.php
index 91c35c4b..8d74b98d 100644
--- a/tests/phpunit/includes/media/TiffTest.php
+++ b/tests/phpunit/includes/media/TiffTest.php
@@ -1,8 +1,16 @@
 <?php
 class TiffTest extends MediaWikiTestCase {
 
+	/** @var TiffHandler */
+	protected $handler;
+	/** @var string */
+	protected $filePath;
+
 	protected function setUp() {
 		parent::setUp();
+		if ( !extension_loaded( 'exif' ) ) {
+			$this->markTestSkipped( "This test needs the exif extension." );
+		}
 
 		$this->setMwGlobals( 'wgShowEXIF', true );
 
@@ -10,18 +18,18 @@ class TiffTest extends MediaWikiTestCase {
 		$this->handler = new TiffHandler;
 	}
 
+	/**
+	 * @covers TiffHandler::getMetadata
+	 */
 	public function testInvalidFile() {
-		if ( !wfDl( 'exif' ) ) {
-			$this->markTestIncomplete( "This test needs the exif extension." );
-		}
 		$res = $this->handler->getMetadata( null, $this->filePath . 'README' );
 		$this->assertEquals( ExifBitmapHandler::BROKEN_FILE, $res );
 	}
 
+	/**
+	 * @covers TiffHandler::getMetadata
+	 */
 	public function testTiffMetadataExtraction() {
-		if ( !wfDl( 'exif' ) ) {
-			$this->markTestIncomplete( "This test needs the exif extension." );
-		}
 		$res = $this->handler->getMetadata( null, $this->filePath . 'test.tiff' );
 		$expected = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
 		// Re-unserialize in case there are subtle differences between how versions
diff --git a/tests/phpunit/includes/media/XMPTest.php b/tests/phpunit/includes/media/XMPTest.php
index 86c722b1..d12e9b00 100644
--- a/tests/phpunit/includes/media/XMPTest.php
+++ b/tests/phpunit/includes/media/XMPTest.php
@@ -1,9 +1,13 @@
 <?php
+
+/**
+ * @todo covers tags
+ */
 class XMPTest extends MediaWikiTestCase {
 
 	protected function setUp() {
 		parent::setUp();
-		if ( !wfDl( 'xml' ) ) {
+		if ( !extension_loaded( 'xml' ) ) {
 			$this->markTestSkipped( 'Requires libxml to do XMP parsing' );
 		}
 	}
@@ -15,6 +19,7 @@ class XMPTest extends MediaWikiTestCase {
 	 * @param $expected Array expected result of parsing the xmp.
 	 * @param $info String Short sentence on what's being tested.
 	 *
+	 * @throws Exception
 	 * @dataProvider provideXMPParse
 	 */
 	public function testXMPParse( $xmp, $expected, $info ) {
@@ -62,9 +67,10 @@ class XMPTest extends MediaWikiTestCase {
 			// result array, but it seems kind of big to put directly in the test
 			// file.
 			$result = null;
-			include( $xmpPath . $file[0] . '.result.php' );
+			include $xmpPath . $file[0] . '.result.php';
 			$data[] = array( $xmp, $result, '[' . $file[0] . '.xmp] ' . $file[1] );
 		}
+
 		return $data;
 	}
 
@@ -74,7 +80,7 @@ class XMPTest extends MediaWikiTestCase {
 	 * @todo This is based on what the standard says. Need to find a real
 	 * world example file to double check the support for this is right.
 	 */
-	function testExtendedXMP() {
+	public function testExtendedXMP() {
 		$xmpPath = __DIR__ . '/../../data/xmp/';
 		$standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
 		$extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
@@ -104,7 +110,7 @@ class XMPTest extends MediaWikiTestCase {
 	 * This test has an extended XMP block with a wrong guid (md5sum)
 	 * and thus should only return the StandardXMP, not the ExtendedXMP.
 	 */
-	function testExtendedXMPWithWrongGUID() {
+	public function testExtendedXMPWithWrongGUID() {
 		$xmpPath = __DIR__ . '/../../data/xmp/';
 		$standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
 		$extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
@@ -133,7 +139,7 @@ class XMPTest extends MediaWikiTestCase {
 	 * Have a high offset to simulate a missing packet,
 	 * which should cause it to ignore the ExtendedXMP packet.
 	 */
-	function testExtendedXMPMissingPacket() {
+	public function testExtendedXMPMissingPacket() {
 		$xmpPath = __DIR__ . '/../../data/xmp/';
 		$standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
 		$extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
@@ -157,5 +163,4 @@ class XMPTest extends MediaWikiTestCase {
 
 		$this->assertEquals( $expected, $actual );
 	}
-
 }
diff --git a/tests/phpunit/includes/media/XMPValidateTest.php b/tests/phpunit/includes/media/XMPValidateTest.php
index a2b4e1c2..96bf5e47 100644
--- a/tests/phpunit/includes/media/XMPValidateTest.php
+++ b/tests/phpunit/includes/media/XMPValidateTest.php
@@ -3,8 +3,9 @@ class XMPValidateTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideDates
+	 * @covers XMPValidate::validateDate
 	 */
-	function testValidateDate( $value, $expected ) {
+	public function testValidateDate( $value, $expected ) {
 		// The method should modify $value.
 		XMPValidate::validateDate( array(), $value, true );
 		$this->assertEquals( $expected, $value );
@@ -41,7 +42,5 @@ class XMPValidateTest extends MediaWikiTestCase {
 			array( '2001-05-12T15', null ),
 			array( '2001-12T15:13', null ),
 		);
-
 	}
-
 }
diff --git a/tests/phpunit/includes/normal/CleanUpTest.php b/tests/phpunit/includes/normal/CleanUpTest.php
index 99ec05dd..52dd2ef5 100644
--- a/tests/phpunit/includes/normal/CleanUpTest.php
+++ b/tests/phpunit/includes/normal/CleanUpTest.php
@@ -30,16 +30,20 @@
  *
  * @ingroup UtfNormal
  * @group Large
+ *
+ * We ignore code coverage for this test suite until they are rewritten
+ * to use data providers (bug 46561).
+ * @codeCoverageIgnore
  */
 class CleanUpTest extends MediaWikiTestCase {
 	/** @todo document */
-	function testAscii() {
+	public function testAscii() {
 		$text = 'This is plain ASCII text.';
 		$this->assertEquals( $text, UtfNormal::cleanUp( $text ) );
 	}
 
 	/** @todo document */
-	function testNull() {
+	public function testNull() {
 		$text = "a \x00 null";
 		$expect = "a \xef\xbf\xbd null";
 		$this->assertEquals(
@@ -48,13 +52,13 @@ class CleanUpTest extends MediaWikiTestCase {
 	}
 
 	/** @todo document */
-	function testLatin() {
+	public function testLatin() {
 		$text = "L'\xc3\xa9cole";
 		$this->assertEquals( $text, UtfNormal::cleanUp( $text ) );
 	}
 
 	/** @todo document */
-	function testLatinNormal() {
+	public function testLatinNormal() {
 		$text = "L'e\xcc\x81cole";
 		$expect = "L'\xc3\xa9cole";
 		$this->assertEquals( $expect, UtfNormal::cleanUp( $text ) );
@@ -101,7 +105,7 @@ class CleanUpTest extends MediaWikiTestCase {
 	}
 
 	/** @todo document */
-	function testAllBytes() {
+	public function testAllBytes() {
 		$this->doTestBytes( '', '' );
 		$this->doTestBytes( 'x', '' );
 		$this->doTestBytes( '', 'x' );
@@ -141,7 +145,7 @@ class CleanUpTest extends MediaWikiTestCase {
 	}
 
 	/** @todo document */
-	function testDoubleBytes() {
+	public function testDoubleBytes() {
 		$this->doTestDoubleBytes( '', '' );
 		$this->doTestDoubleBytes( 'x', '' );
 		$this->doTestDoubleBytes( '', 'x' );
@@ -194,7 +198,7 @@ class CleanUpTest extends MediaWikiTestCase {
 	}
 
 	/** @todo document */
-	function testTripleBytes() {
+	public function testTripleBytes() {
 		$this->doTestTripleBytes( '', '' );
 		$this->doTestTripleBytes( 'x', '' );
 		$this->doTestTripleBytes( '', 'x' );
@@ -272,7 +276,7 @@ class CleanUpTest extends MediaWikiTestCase {
 	}
 
 	/** @todo document */
-	function testChunkRegression() {
+	public function testChunkRegression() {
 		# Check for regression against a chunking bug
 		$text = "\x46\x55\xb8" .
 			"\xdc\x96" .
@@ -295,7 +299,7 @@ class CleanUpTest extends MediaWikiTestCase {
 	}
 
 	/** @todo document */
-	function testInterposeRegression() {
+	public function testInterposeRegression() {
 		$text = "\x4e\x30" .
 			"\xb1" . # bad tail
 			"\x3a" .
@@ -330,7 +334,7 @@ class CleanUpTest extends MediaWikiTestCase {
 	}
 
 	/** @todo document */
-	function testOverlongRegression() {
+	public function testOverlongRegression() {
 		$text = "\x67" .
 			"\x1a" . # forbidden ascii
 			"\xea" . # bad head
@@ -355,7 +359,7 @@ class CleanUpTest extends MediaWikiTestCase {
 	}
 
 	/** @todo document */
-	function testSurrogateRegression() {
+	public function testSurrogateRegression() {
 		$text = "\xed\xb4\x96" . # surrogate 0xDD16
 			"\x83" . # bad tail
 			"\xb4" . # bad tail
@@ -370,7 +374,7 @@ class CleanUpTest extends MediaWikiTestCase {
 	}
 
 	/** @todo document */
-	function testBomRegression() {
+	public function testBomRegression() {
 		$text = "\xef\xbf\xbe" . # U+FFFE, illegal char
 			"\xb2" . # bad tail
 			"\xef" . # bad head
@@ -385,7 +389,7 @@ class CleanUpTest extends MediaWikiTestCase {
 	}
 
 	/** @todo document */
-	function testForbiddenRegression() {
+	public function testForbiddenRegression() {
 		$text = "\xef\xbf\xbf"; # U+FFFF, illegal char
 		$expect = "\xef\xbf\xbd";
 		$this->assertEquals(
@@ -394,7 +398,7 @@ class CleanUpTest extends MediaWikiTestCase {
 	}
 
 	/** @todo document */
-	function testHangulRegression() {
+	public function testHangulRegression() {
 		$text = "\xed\x9c\xaf" . # Hangul char
 			"\xe1\x87\x81"; # followed by another final jamo
 		$expect = $text; # Should *not* change.
diff --git a/tests/phpunit/includes/objectcache/BagOStuffTest.php b/tests/phpunit/includes/objectcache/BagOStuffTest.php
index 88b07f0a..aa783943 100644
--- a/tests/phpunit/includes/objectcache/BagOStuffTest.php
+++ b/tests/phpunit/includes/objectcache/BagOStuffTest.php
@@ -15,7 +15,6 @@ class BagOStuffTest extends MediaWikiTestCase {
 			$name = $this->getCliArg( 'use-bagostuff=' );
 
 			$this->cache = ObjectCache::newFromId( $name );
-
 		} else {
 			// no type defined - use simple hash
 			$this->cache = new HashBagOStuff;
@@ -119,6 +118,18 @@ class BagOStuffTest extends MediaWikiTestCase {
 		$this->assertEquals( $this->cache->get( $key ), $value );
 	}
 
+	/**
+	 * @covers BagOStuff::incr
+	 */
+	public function testIncr() {
+		$key = wfMemcKey( 'test' );
+		$this->cache->add( $key, 0 );
+		$this->cache->incr( $key );
+		$expectedValue = 1;
+		$actualValue = $this->cache->get( $key );
+		$this->assertEquals( $expectedValue, $actualValue, 'Value should be 1 after incrementing' );
+	}
+
 	public function testGetMulti() {
 		$value1 = array( 'this' => 'is', 'a' => 'test' );
 		$value2 = array( 'this' => 'is', 'another' => 'test' );
diff --git a/tests/phpunit/includes/parser/MagicVariableTest.php b/tests/phpunit/includes/parser/MagicVariableTest.php
index dfcdafde..c2c97c01 100644
--- a/tests/phpunit/includes/parser/MagicVariableTest.php
+++ b/tests/phpunit/includes/parser/MagicVariableTest.php
@@ -9,11 +9,13 @@
  * @author Antoine Musso
  * @copyright Copyright © 2011, Antoine Musso
  * @file
+ * @todo covers tags
  */
 
-/** */
 class MagicVariableTest extends MediaWikiTestCase {
-	/** Will contains a parser object*/
+	/**
+	 * @var Parser
+	 */
 	private $testParser = null;
 
 	/**
@@ -51,11 +53,31 @@ class MagicVariableTest extends MediaWikiTestCase {
 		$this->testParser->setTitle( $title );
 	}
 
-	/** destroy parser (TODO: is it really neded?)*/
-	protected function tearDown() {
-		unset( $this->testParser );
+	/**
+	 * @param int $num upper limit for numbers
+	 * @return array of numbers from 1 up to $num
+	 */
+	private static function createProviderUpTo( $num ) {
+		$ret = array();
+		for ( $i = 1; $i <= $num; $i++ ) {
+			$ret[] = array( $i );
+		}
+
+		return $ret;
+	}
+
+	/**
+	 * @return array of months numbers (as an integer)
+	 */
+	public static function provideMonths() {
+		return self::createProviderUpTo( 12 );
+	}
 
-		parent::tearDown();
+	/**
+	 * @return array of days numbers (as an integer)
+	 */
+	public static function provideDays() {
+		return self::createProviderUpTo( 31 );
 	}
 
 	############### TESTS #############################################
@@ -65,100 +87,101 @@ class MagicVariableTest extends MediaWikiTestCase {
 
 	# day
 
-	/** @dataProvider MediaWikiProvide::Days */
-	function testCurrentdayIsUnPadded( $day ) {
+	/** @dataProvider provideDays */
+	public function testCurrentdayIsUnPadded( $day ) {
 		$this->assertUnPadded( 'currentday', $day );
 	}
 
-	/** @dataProvider MediaWikiProvide::Days */
-	function testCurrentdaytwoIsZeroPadded( $day ) {
+	/** @dataProvider provideDays */
+	public function testCurrentdaytwoIsZeroPadded( $day ) {
 		$this->assertZeroPadded( 'currentday2', $day );
 	}
 
-	/** @dataProvider MediaWikiProvide::Days */
-	function testLocaldayIsUnPadded( $day ) {
+	/** @dataProvider provideDays */
+	public function testLocaldayIsUnPadded( $day ) {
 		$this->assertUnPadded( 'localday', $day );
 	}
 
-	/** @dataProvider MediaWikiProvide::Days */
-	function testLocaldaytwoIsZeroPadded( $day ) {
+	/** @dataProvider provideDays */
+	public function testLocaldaytwoIsZeroPadded( $day ) {
 		$this->assertZeroPadded( 'localday2', $day );
 	}
 
 	# month
 
-	/** @dataProvider MediaWikiProvide::Months */
-	function testCurrentmonthIsZeroPadded( $month ) {
+	/** @dataProvider provideMonths */
+	public function testCurrentmonthIsZeroPadded( $month ) {
 		$this->assertZeroPadded( 'currentmonth', $month );
 	}
 
-	/** @dataProvider MediaWikiProvide::Months */
-	function testCurrentmonthoneIsUnPadded( $month ) {
+	/** @dataProvider provideMonths */
+	public function testCurrentmonthoneIsUnPadded( $month ) {
 		$this->assertUnPadded( 'currentmonth1', $month );
 	}
 
-	/** @dataProvider MediaWikiProvide::Months */
-	function testLocalmonthIsZeroPadded( $month ) {
+	/** @dataProvider provideMonths */
+	public function testLocalmonthIsZeroPadded( $month ) {
 		$this->assertZeroPadded( 'localmonth', $month );
 	}
 
-	/** @dataProvider MediaWikiProvide::Months */
-	function testLocalmonthoneIsUnPadded( $month ) {
+	/** @dataProvider provideMonths */
+	public function testLocalmonthoneIsUnPadded( $month ) {
 		$this->assertUnPadded( 'localmonth1', $month );
 	}
 
-
 	# revision day
 
-	/** @dataProvider MediaWikiProvide::Days */
-	function testRevisiondayIsUnPadded( $day ) {
+	/** @dataProvider provideDays */
+	public function testRevisiondayIsUnPadded( $day ) {
 		$this->assertUnPadded( 'revisionday', $day );
 	}
 
-	/** @dataProvider MediaWikiProvide::Days */
-	function testRevisiondaytwoIsZeroPadded( $day ) {
+	/** @dataProvider provideDays */
+	public function testRevisiondaytwoIsZeroPadded( $day ) {
 		$this->assertZeroPadded( 'revisionday2', $day );
 	}
 
 	# revision month
 
-	/** @dataProvider MediaWikiProvide::Months */
-	function testRevisionmonthIsZeroPadded( $month ) {
+	/** @dataProvider provideMonths */
+	public function testRevisionmonthIsZeroPadded( $month ) {
 		$this->assertZeroPadded( 'revisionmonth', $month );
 	}
 
-	/** @dataProvider MediaWikiProvide::Months */
-	function testRevisionmonthoneIsUnPadded( $month ) {
+	/** @dataProvider provideMonths */
+	public function testRevisionmonthoneIsUnPadded( $month ) {
 		$this->assertUnPadded( 'revisionmonth1', $month );
 	}
 
 	/**
 	 * Rough tests for {{SERVERNAME}} magic word
 	 * Bug 31176
+	 * @group Database
+	 * @dataProvider provideDataServernameFromDifferentProtocols
 	 */
-	function testServernameFromDifferentProtocols() {
-		global $wgServer;
-		$saved_wgServer = $wgServer;
+	public function testServernameFromDifferentProtocols( $server ) {
+		$this->setMwGlobals( 'wgServer', $server );
 
-		$wgServer = 'http://localhost/';
-		$this->assertMagic( 'localhost', 'servername' );
-		$wgServer = 'https://localhost/';
-		$this->assertMagic( 'localhost', 'servername' );
-		$wgServer = '//localhost/'; # bug 31176
 		$this->assertMagic( 'localhost', 'servername' );
+	}
 
-		$wgServer = $saved_wgServer;
+	public static function provideDataServernameFromDifferentProtocols() {
+		return array(
+			array( 'http://localhost/' ),
+			array( 'https://localhost/' ),
+			array( '//localhost/' ), # bug 31176
+		);
 	}
 
 	############### HELPERS ############################################
 
 	/** assertion helper expecting a magic output which is zero padded */
-	PUBLIC function assertZeroPadded( $magic, $value ) {
+	public function assertZeroPadded( $magic, $value ) {
 		$this->assertMagicPadding( $magic, $value, '%02d' );
 	}
 
 	/** assertion helper expecting a magic output which is unpadded */
-	PUBLIC function assertUnPadded( $magic, $value ) {
+	public function assertUnPadded( $magic, $value ) {
 		$this->assertMagicPadding( $magic, $value, '%d' );
 	}
 
diff --git a/tests/phpunit/includes/parser/MediaWikiParserTest.php b/tests/phpunit/includes/parser/MediaWikiParserTest.php
index 067a7c4e..c120ca34 100644
--- a/tests/phpunit/includes/parser/MediaWikiParserTest.php
+++ b/tests/phpunit/includes/parser/MediaWikiParserTest.php
@@ -1,5 +1,5 @@
 <?php
-require_once( __DIR__ . '/NewParserTest.php' );
+require_once __DIR__ . '/NewParserTest.php';
 
 /**
  * The UnitTest must be either a class that inherits from MediaWikiTestCase
@@ -11,24 +11,110 @@ require_once( __DIR__ . '/NewParserTest.php' );
  */
 class MediaWikiParserTest {
 
-	public static function suite() {
-		global $wgParserTestFiles;
+	/**
+	 * @defgroup filtering_constants Filtering constants
+	 *
+	 * Limit inclusion of parser tests files coming from MediaWiki core
+	 * @{
+	 */
 
-		$suite = new PHPUnit_Framework_TestSuite;
+	/** Include files shipped with MediaWiki core */
+	const CORE_ONLY = 1;
+	/** Include non core files as set in $wgParserTestFiles */
+	const NO_CORE = 2;
+	/** Include anything set via $wgParserTestFiles */
+	const WITH_ALL = 3; # CORE_ONLY | NO_CORE
+
+	/** @} */
+
+	/**
+	 * Get a PHPUnit test suite of parser tests. Optionally filtered with
+	 * $flags.
+	 *
+	 * @par Examples:
+	 * Get a suite of parser tests shipped by MediaWiki core:
+	 * @code
+	 * MediaWikiParserTest::suite( MediaWikiParserTest::CORE_ONLY );
+	 * @endcode
+	 * Get a suite of various parser tests, like extensions:
+	 * @code
+	 * MediaWikiParserTest::suite( MediaWikiParserTest::NO_CORE );
+	 * @endcode
+	 * Get any test defined via $wgParserTestFiles:
+	 * @code
+	 * MediaWikiParserTest::suite( MediaWikiParserTest::WITH_ALL );
+	 * @endcode
+	 *
+	 * @param $flags bitwise flag to filter out the $wgParserTestFiles that
+	 * will be included.  Default: MediaWikiParserTest::CORE_ONLY
+	 *
+	 * @return PHPUnit_Framework_TestSuite
+	 */
+	public static function suite( $flags = self::CORE_ONLY ) {
+		if ( is_string( $flags ) ) {
+			$flags = self::CORE_ONLY;
+		}
+		global $wgParserTestFiles, $IP;
+
+		$mwTestDir = $IP . '/tests/';
+
+		# Human friendly helpers
+		$wantsCore = ( $flags & self::CORE_ONLY );
+		$wantsRest = ( $flags & self::NO_CORE );
+
+		# Will hold the .txt parser test files we will include
+		$filesToTest = array();
+
+		# Filter out .txt files
+		foreach ( $wgParserTestFiles as $parserTestFile ) {
+			$isCore = ( 0 === strpos( $parserTestFile, $mwTestDir ) );
+
+			if ( $isCore && $wantsCore ) {
+				self::debug( "included core parser tests: $parserTestFile" );
+				$filesToTest[] = $parserTestFile;
+			} elseif ( !$isCore && $wantsRest ) {
+				self::debug( "included non core parser tests: $parserTestFile" );
+				$filesToTest[] = $parserTestFile;
+			} else {
+				self::debug( "skipped parser tests: $parserTestFile" );
+			}
+		}
+		self::debug( 'parser tests files: '
+			. implode( ' ', $filesToTest ) );
 
-		foreach ( $wgParserTestFiles as $filename ) {
-			$testsName = basename( $filename, '.txt' );
+		$suite = new PHPUnit_Framework_TestSuite;
+		foreach ( $filesToTest as $fileName ) {
+			$testsName = basename( $fileName, '.txt' );
+			$escapedFileName = strtr( $fileName, array( "'" => "\\'", '\\' => '\\\\' ) );
 			/* This used to be ucfirst( basename( dirname( $filename ) ) )
 			 * and then was ucfirst( basename( $filename, '.txt' )
 			 * but that didn't work with names like foo.tests.txt
 			 */
-			$className = str_replace( '.', '_', ucfirst( $testsName ) );
-
-			eval( "/** @group Database\n@group Parser\n*/ class $className extends NewParserTest { protected \$file = '" . strtr( $filename, array( "'" => "\\'", '\\' => '\\\\' ) ) . "'; } " );
+			$parserTestClassName = str_replace( '.', '_', ucfirst( $testsName ) );
+			$parserTestClassDefinition = <<<EOT
+/**
+ * @group Database
+ * @group Parser
+ * @group ParserTests
+ * @group ParserTests_$parserTestClassName
+ */
+class $parserTestClassName extends NewParserTest {
+	protected \$file = '$escapedFileName';
+}
+EOT;
 
-			$parserTester = new $className( $testsName );
-			$suite->addTestSuite( new ReflectionClass ( $parserTester ) );
+			eval( $parserTestClassDefinition );
+			self::debug( "Adding test class $parserTestClassName" );
+			$suite->addTestSuite( $parserTestClassName );
 		}
 		return $suite;
 	}
+
+	/**
+	 * Write $msg under log group 'tests-parser'
+	 * @param string $msg Message to log
+	 */
+	protected static function debug( $msg ) {
+		return wfDebugLog( 'tests-parser', wfGetCaller() . ' ' . $msg );
+	}
 }
diff --git a/tests/phpunit/includes/parser/NewParserTest.php b/tests/phpunit/includes/parser/NewParserTest.php
index bf6931a1..eac4de5c 100644
--- a/tests/phpunit/includes/parser/NewParserTest.php
+++ b/tests/phpunit/includes/parser/NewParserTest.php
@@ -6,6 +6,8 @@
  * @group Database
  * @group Parser
  * @group Stub
+ *
+ * @todo covers tags
  */
 class NewParserTest extends MediaWikiTestCase {
 	static protected $articles = array(); // Array of test articles defined by the tests
@@ -19,7 +21,6 @@ class NewParserTest extends MediaWikiTestCase {
 	public $runParsoid = false;
 	public $regex = '';
 	public $showProgress = true;
-	public $savedInitialGlobals = array();
 	public $savedWeirdGlobals = array();
 	public $savedGlobals = array();
 	public $hooks = array();
@@ -32,8 +33,13 @@ class NewParserTest extends MediaWikiTestCase {
 
 	protected $file = false;
 
+	public static function setUpBeforeClass() {
+		// Inject ParserTest well-known interwikis
+		ParserTest::setupInterwikis();
+	}
+
 	protected function setUp() {
-		global $wgNamespaceProtection, $wgNamespaceAliases;
+		global $wgNamespaceAliases, $wgContLang;
 		global $wgHooks, $IP;
 
 		parent::setUp();
@@ -52,11 +58,16 @@ class NewParserTest extends MediaWikiTestCase {
 
 		$tmpGlobals['wgLanguageCode'] = 'en';
 		$tmpGlobals['wgContLang'] = Language::factory( 'en' );
+		$tmpGlobals['wgSitename'] = 'MediaWiki';
+		$tmpGlobals['wgServer'] = 'http://example.org';
 		$tmpGlobals['wgScript'] = '/index.php';
 		$tmpGlobals['wgScriptPath'] = '/';
 		$tmpGlobals['wgArticlePath'] = '/wiki/$1';
-		$tmpGlobals['wgStyleSheetPath'] = '/skins';
+		$tmpGlobals['wgActionPaths'] = array();
+		$tmpGlobals['wgVariantArticlePath'] = false;
+		$tmpGlobals['wgExtensionAssetsPath'] = '/extensions';
 		$tmpGlobals['wgStylePath'] = '/skins';
+		$tmpGlobals['wgEnableUploads'] = true;
 		$tmpGlobals['wgThumbnailScriptPath'] = false;
 		$tmpGlobals['wgLocalFileRepo'] = array(
 			'class' => 'LocalRepo',
@@ -67,51 +78,81 @@ class NewParserTest extends MediaWikiTestCase {
 			'backend' => 'local-backend'
 		);
 		$tmpGlobals['wgForeignFileRepos'] = array();
+		$tmpGlobals['wgDefaultExternalStore'] = array();
 		$tmpGlobals['wgEnableParserCache'] = false;
-		$tmpGlobals['wgHooks'] = $wgHooks;
+		$tmpGlobals['wgCapitalLinks'] = true;
+		$tmpGlobals['wgNoFollowLinks'] = true;
+		$tmpGlobals['wgNoFollowDomainExceptions'] = array();
+		$tmpGlobals['wgExternalLinkTarget'] = false;
+		$tmpGlobals['wgThumbnailScriptPath'] = false;
+		$tmpGlobals['wgUseImageResize'] = true;
+		$tmpGlobals['wgAllowExternalImages'] = true;
+		$tmpGlobals['wgRawHtml'] = false;
+		$tmpGlobals['wgUseTidy'] = false;
+		$tmpGlobals['wgAlwaysUseTidy'] = false;
+		$tmpGlobals['wgWellFormedXml'] = true;
+		$tmpGlobals['wgAllowMicrodataAttributes'] = true;
+		$tmpGlobals['wgExperimentalHtmlIds'] = false;
+		$tmpGlobals['wgAdaptiveMessageCache'] = true;
+		$tmpGlobals['wgUseDatabaseMessages'] = true;
+		$tmpGlobals['wgLocaltimezone'] = 'UTC';
 		$tmpGlobals['wgDeferredUpdateList'] = array();
-		$tmpGlobals['wgMemc'] = wfGetMainCache();
-		$tmpGlobals['messageMemc'] = wfGetMessageCacheStorage();
-		$tmpGlobals['parserMemc'] = wfGetParserCacheStorage();
+		$tmpGlobals['wgGroupPermissions'] = array(
+			'*' => array(
+				'createaccount' => true,
+				'read' => true,
+				'edit' => true,
+				'createpage' => true,
+				'createtalk' => true,
+		) );
+		$tmpGlobals['wgNamespaceProtection'] = array( NS_MEDIAWIKI => 'editinterface' );
 
-		// $tmpGlobals['wgContLang'] = new StubContLang;
-		$tmpGlobals['wgUser'] = new User;
-		$context = new RequestContext();
-		$tmpGlobals['wgLang'] = $context->getLanguage();
-		$tmpGlobals['wgOut'] = $context->getOutput();
-		$tmpGlobals['wgParser'] = new StubObject( 'wgParser', $GLOBALS['wgParserConf']['class'], array( $GLOBALS['wgParserConf'] ) );
-		$tmpGlobals['wgRequest'] = $context->getRequest();
+		$tmpGlobals['wgParser'] = new StubObject(
+			'wgParser', $GLOBALS['wgParserConf']['class'],
+			array( $GLOBALS['wgParserConf'] ) );
+
+		$tmpGlobals['wgFileExtensions'][] = 'svg';
+		$tmpGlobals['wgSVGConverter'] = 'rsvg';
+		$tmpGlobals['wgSVGConverters']['rsvg'] =
+			'$path/rsvg-convert -w $width -h $height $input -o $output';
 
 		if ( $GLOBALS['wgStyleDirectory'] === false ) {
 			$tmpGlobals['wgStyleDirectory'] = "$IP/skins";
 		}
 
+		# Replace all media handlers with a mock. We do not need to generate
+		# actual thumbnails to do parser testing, we only care about receiving
+		# a ThumbnailImage properly initialized.
+		global $wgMediaHandlers;
+		foreach ( $wgMediaHandlers as $type => $handler ) {
+			$tmpGlobals['wgMediaHandlers'][$type] = 'MockBitmapHandler';
+		}
+		// Vector images have to be handled slightly differently
+		$tmpGlobals['wgMediaHandlers']['image/svg+xml'] = 'MockSvgHandler';
 
-		foreach ( $tmpGlobals as $var => $val ) {
-			if ( array_key_exists( $var, $GLOBALS ) ) {
-				$this->savedInitialGlobals[$var] = $GLOBALS[$var];
-			}
+		$tmpHooks = $wgHooks;
+		$tmpHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
+		$tmpHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
+		$tmpGlobals['wgHooks'] = $tmpHooks;
+		# add a namespace shadowing a interwiki link, to test
+		# proper precedence when resolving links. (bug 51680)
+		$tmpGlobals['wgExtraNamespaces'] = array( 100 => 'MemoryAlpha' );
 
-			$GLOBALS[$var] = $val;
-		}
+		$this->setMwGlobals( $tmpGlobals );
 
-		$this->savedWeirdGlobals['mw_namespace_protection'] = $wgNamespaceProtection[NS_MEDIAWIKI];
 		$this->savedWeirdGlobals['image_alias'] = $wgNamespaceAliases['Image'];
 		$this->savedWeirdGlobals['image_talk_alias'] = $wgNamespaceAliases['Image_talk'];
 
-		$wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
 		$wgNamespaceAliases['Image'] = NS_FILE;
 		$wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
+
+		MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+		$wgContLang->resetNamespaces(); # reset namespace cache
 	}
 
 	protected function tearDown() {
-		foreach ( $this->savedInitialGlobals as $var => $val ) {
-			$GLOBALS[$var] = $val;
-		}
+		global $wgNamespaceAliases, $wgContLang;
 
-		global $wgNamespaceProtection, $wgNamespaceAliases;
-
-		$wgNamespaceProtection[NS_MEDIAWIKI] = $this->savedWeirdGlobals['mw_namespace_protection'];
 		$wgNamespaceAliases['Image'] = $this->savedWeirdGlobals['image_alias'];
 		$wgNamespaceAliases['Image_talk'] = $this->savedWeirdGlobals['image_talk_alias'];
 
@@ -119,67 +160,34 @@ class NewParserTest extends MediaWikiTestCase {
 		RepoGroup::destroySingleton();
 		FileBackendGroup::destroySingleton();
 
+		// Remove temporary pages from the link cache
+		LinkCache::singleton()->clear();
+
+		// Restore message cache (temporary pages and $wgUseDatabaseMessages)
+		MessageCache::destroyInstance();
+
 		parent::tearDown();
+
+		MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+		$wgContLang->resetNamespaces(); # reset namespace cache
+	}
+
+	public static function tearDownAfterClass() {
+		ParserTest::tearDownInterwikis();
+		parent::tearDownAfterClass();
 	}
 
 	function addDBData() {
 		$this->tablesUsed[] = 'site_stats';
-		$this->tablesUsed[] = 'interwiki';
 		# disabled for performance
 		#$this->tablesUsed[] = 'image';
 
-		# Hack: insert a few Wikipedia in-project interwiki prefixes,
-		# for testing inter-language links
-		$this->db->insert( 'interwiki', array(
-				array( 'iw_prefix' => 'wikipedia',
-					'iw_url' => 'http://en.wikipedia.org/wiki/$1',
-					'iw_api' => '',
-					'iw_wikiid' => '',
-					'iw_local' => 0 ),
-				array( 'iw_prefix' => 'meatball',
-					'iw_url' => 'http://www.usemod.com/cgi-bin/mb.pl?$1',
-					'iw_api' => '',
-					'iw_wikiid' => '',
-					'iw_local' => 0 ),
-				array( 'iw_prefix' => 'zh',
-					'iw_url' => 'http://zh.wikipedia.org/wiki/$1',
-					'iw_api' => '',
-					'iw_wikiid' => '',
-					'iw_local' => 1 ),
-				array( 'iw_prefix' => 'es',
-					'iw_url' => 'http://es.wikipedia.org/wiki/$1',
-					'iw_api' => '',
-					'iw_wikiid' => '',
-					'iw_local' => 1 ),
-				array( 'iw_prefix' => 'fr',
-					'iw_url' => 'http://fr.wikipedia.org/wiki/$1',
-					'iw_api' => '',
-					'iw_wikiid' => '',
-					'iw_local' => 1 ),
-				array( 'iw_prefix' => 'ru',
-					'iw_url' => 'http://ru.wikipedia.org/wiki/$1',
-					'iw_api' => '',
-					'iw_wikiid' => '',
-					'iw_local' => 1 ),
-				/**
-				 * @todo Fixme! Why are we inserting duplicate data here? Shouldn't
-				 * need this IGNORE or shouldn't need the insert at all.
-				 */
-			), __METHOD__, array( 'IGNORE' )
-		);
-
 		# Update certain things in site_stats
 		$this->db->insert( 'site_stats',
 			array( 'ss_row_id' => 1, 'ss_images' => 2, 'ss_good_articles' => 1 ),
 			__METHOD__
 		);
 
-		# Reinitialise the LocalisationCache to match the database state
-		Language::getLocalisationCache()->unloadAll();
-
-		# Clear the message cache
-		MessageCache::singleton()->clear();
-
 		$user = User::newFromId( 0 );
 		LinkCache::singleton()->clear(); # Avoids the odd failure at creating the nullRevision
 
@@ -187,6 +195,10 @@ class NewParserTest extends MediaWikiTestCase {
 		# We will upload the actual files later. Note that if anything causes LocalFile::load()
 		# to be triggered before then, it will break via maybeUpgrade() setting the fileExists
 		# member to false and storing it in cache.
+		# note that the size/width/height/bits/etc of the file
+		# are actually set by inspecting the file itself; the arguments
+		# to recordUpload2 have no effect.  That said, we try to make things
+		# match up so it is less confusing to readers of the code & tests.
 		$image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
 		if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
 			$image->recordUpload2(
@@ -194,19 +206,39 @@ class NewParserTest extends MediaWikiTestCase {
 				'Upload of some lame file',
 				'Some lame file',
 				array(
-					'size' => 12345,
+					'size' => 7881,
 					'width' => 1941,
 					'height' => 220,
-					'bits' => 24,
+					'bits' => 8,
 					'media_type' => MEDIATYPE_BITMAP,
 					'mime' => 'image/jpeg',
 					'metadata' => serialize( array() ),
-					'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+					'sha1' => wfBaseConvert( '1', 16, 36, 31 ),
 					'fileExists' => true ),
 				$this->db->timestamp( '20010115123500' ), $user
 			);
 		}
 
+		$image = wfLocalFile( Title::makeTitle( NS_FILE, 'Thumb.png' ) );
+		if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
+			$image->recordUpload2(
+				'', // archive name
+				'Upload of some lame thumbnail',
+				'Some lame thumbnail',
+				array(
+					'size' => 22589,
+					'width' => 135,
+					'height' => 135,
+					'bits' => 8,
+					'media_type' => MEDIATYPE_BITMAP,
+					'mime' => 'image/png',
+					'metadata' => serialize( array() ),
+					'sha1' => wfBaseConvert( '2', 16, 36, 31 ),
+					'fileExists' => true ),
+				$this->db->timestamp( '20130225203040' ), $user
+			);
+		}
+
 		# This image will be blacklisted in [[MediaWiki:Bad image list]]
 		$image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) );
 		if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
@@ -222,11 +254,25 @@ class NewParserTest extends MediaWikiTestCase {
 					'media_type' => MEDIATYPE_BITMAP,
 					'mime' => 'image/jpeg',
 					'metadata' => serialize( array() ),
-					'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+					'sha1' => wfBaseConvert( '3', 16, 36, 31 ),
 					'fileExists' => true ),
 				$this->db->timestamp( '20010115123500' ), $user
 			);
 		}
+		$image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.svg' ) );
+		if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
+			$image->recordUpload2( '', 'Upload of some lame SVG', 'Some lame SVG', array(
+					'size'        => 12345,
+					'width'       => 200,
+					'height'      => 200,
+					'bits'        => 24,
+					'media_type'  => MEDIATYPE_DRAWING,
+					'mime'        => 'image/svg+xml',
+					'metadata'    => serialize( array() ),
+					'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
+					'fileExists'  => true
+			), $this->db->timestamp( '20010115123500' ), $user );
+		}
 	}
 
 	//ParserTest setup/teardown functions
@@ -265,7 +311,10 @@ class NewParserTest extends MediaWikiTestCase {
 				$backend = self::$backendToUse;
 			}
 		} else {
-			$backend = new FSFileBackend( array(
+			# Replace with a mock. We do not care about generating real
+			# files on the filesystem, just need to expose the file
+			# informations.
+			$backend = new MockFileBackend( array(
 				'name' => 'local-backend',
 				'lockManager' => 'nullLockManager',
 				'containerPaths' => array(
@@ -276,12 +325,6 @@ class NewParserTest extends MediaWikiTestCase {
 		}
 
 		$settings = array(
-			'wgServer' => 'http://example.org',
-			'wgScript' => '/index.php',
-			'wgScriptPath' => '/',
-			'wgArticlePath' => '/wiki/$1',
-			'wgExtensionAssetsPath' => '/extensions',
-			'wgActionPaths' => array(),
 			'wgLocalFileRepo' => array(
 				'class' => 'LocalRepo',
 				'name' => 'local',
@@ -291,47 +334,16 @@ class NewParserTest extends MediaWikiTestCase {
 				'backend' => $backend
 			),
 			'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
-			'wgStylePath' => '/skins',
-			'wgStyleSheetPath' => '/skins',
-			'wgSitename' => 'MediaWiki',
 			'wgLanguageCode' => $lang,
 			'wgDBprefix' => $this->db->getType() != 'oracle' ? 'unittest_' : 'ut_',
-			'wgRawHtml' => isset( $opts['rawhtml'] ),
-			'wgLang' => null,
-			'wgContLang' => null,
+			'wgRawHtml' => self::getOptionValue( 'wgRawHtml', $opts, false ),
 			'wgNamespacesWithSubpages' => array( NS_MAIN => isset( $opts['subpage'] ) ),
+			'wgAllowExternalImages' => self::getOptionValue( 'wgAllowExternalImages', $opts, true ),
 			'wgMaxTocLevel' => $maxtoclevel,
-			'wgCapitalLinks' => true,
-			'wgNoFollowLinks' => true,
-			'wgNoFollowDomainExceptions' => array(),
-			'wgThumbnailScriptPath' => false,
-			'wgUseImageResize' => true,
-			'wgUseTeX' => isset( $opts['math'] ),
+			'wgUseTeX' => isset( $opts['math'] ) || isset( $opts['texvc'] ),
 			'wgMathDirectory' => $uploadDir . '/math',
-			'wgLocaltimezone' => 'UTC',
-			'wgAllowExternalImages' => true,
-			'wgUseTidy' => false,
 			'wgDefaultLanguageVariant' => $variant,
-			'wgVariantArticlePath' => false,
-			'wgGroupPermissions' => array( '*' => array(
-				'createaccount' => true,
-				'read' => true,
-				'edit' => true,
-				'createpage' => true,
-				'createtalk' => true,
-			) ),
-			'wgNamespaceProtection' => array( NS_MEDIAWIKI => 'editinterface' ),
-			'wgDefaultExternalStore' => array(),
-			'wgForeignFileRepos' => array(),
 			'wgLinkHolderBatchSize' => $linkHolderBatchSize,
-			'wgExperimentalHtmlIds' => false,
-			'wgExternalLinkTarget' => false,
-			'wgAlwaysUseTidy' => false,
-			'wgHtml5' => true,
-			'wgWellFormedXml' => true,
-			'wgAllowMicrodataAttributes' => true,
-			'wgAdaptiveMessageCache' => true,
-			'wgUseDatabaseMessages' => true,
 		);
 
 		if ( $config ) {
@@ -349,6 +361,15 @@ class NewParserTest extends MediaWikiTestCase {
 		/** @since 1.20 */
 		wfRunHooks( 'ParserTestGlobals', array( &$settings ) );
 
+		$langObj = Language::factory( $lang );
+		$settings['wgContLang'] = $langObj;
+		$settings['wgLang'] = $langObj;
+
+		$context = new RequestContext();
+		$settings['wgOut'] = $context->getOutput();
+		$settings['wgUser'] = $context->getUser();
+		$settings['wgRequest'] = $context->getRequest();
+
 		foreach ( $settings as $var => $val ) {
 			if ( array_key_exists( $var, $GLOBALS ) ) {
 				$this->savedGlobals[$var] = $GLOBALS[$var];
@@ -357,21 +378,9 @@ class NewParserTest extends MediaWikiTestCase {
 			$GLOBALS[$var] = $val;
 		}
 
-		$langObj = Language::factory( $lang );
-		$GLOBALS['wgContLang'] = $langObj;
-		$context = new RequestContext();
-		$GLOBALS['wgLang'] = $context->getLanguage();
-
-		$GLOBALS['wgMemc'] = new EmptyBagOStuff;
-		$GLOBALS['wgOut'] = $context->getOutput();
-		$GLOBALS['wgUser'] = $context->getUser();
-
-		global $wgHooks;
-
-		$wgHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
-		$wgHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
-
 		MagicWord::clearCache();
+
+		# The entries saved into RepoGroup cache with previous globals will be wrong.
 		RepoGroup::destroySingleton();
 		FileBackendGroup::destroySingleton();
 
@@ -381,9 +390,6 @@ class NewParserTest extends MediaWikiTestCase {
 		# Publish the articles after we have the final language set
 		$this->publishTestArticles();
 
-		# The entries saved into RepoGroup cache with previous globals will be wrong.
-		RepoGroup::destroySingleton();
-		FileBackendGroup::destroySingleton();
 		MessageCache::destroyInstance();
 
 		return $context;
@@ -408,6 +414,7 @@ class NewParserTest extends MediaWikiTestCase {
 		// wfDebug( "Creating upload directory $dir\n" );
 		if ( file_exists( $dir ) ) {
 			wfDebug( "Already exists!\n" );
+
 			return $dir;
 		}
 
@@ -429,10 +436,27 @@ class NewParserTest extends MediaWikiTestCase {
 		$backend->store( array(
 			'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/3/3a/Foobar.jpg"
 		) );
+		$backend->prepare( array( 'dir' => "$base/local-public/e/ea" ) );
+		$backend->store( array(
+			'src' => "$IP/skins/monobook/wiki.png", 'dst' => "$base/local-public/e/ea/Thumb.png"
+		) );
 		$backend->prepare( array( 'dir' => "$base/local-public/0/09" ) );
 		$backend->store( array(
 			'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/0/09/Bad.jpg"
 		) );
+
+		// No helpful SVG file to copy, so make one ourselves
+		$tmpDir = wfTempDir();
+		$tempFsFile = new TempFSFile( "$tmpDir/Foobar.svg" );
+		$tempFsFile->autocollect(); // destroy file when $tempFsFile leaves scope
+		file_put_contents( "$tmpDir/Foobar.svg",
+			'<?xml version="1.0" encoding="utf-8"?>' .
+			'<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200"><text>Foo</text></svg>' );
+
+		$backend->prepare( array( 'dir' => "$base/local-public/f/ff" ) );
+		$backend->quickStore( array(
+			'src' => "$tmpDir/Foobar.svg", 'dst' => "$base/local-public/f/ff/Foobar.svg"
+		) );
 	}
 
 	/**
@@ -445,9 +469,6 @@ class NewParserTest extends MediaWikiTestCase {
 		foreach ( $this->savedGlobals as $var => $val ) {
 			$GLOBALS[$var] = $val;
 		}
-
-		RepoGroup::destroySingleton();
-		LinkCache::singleton()->clear();
 	}
 
 	/**
@@ -458,6 +479,12 @@ class NewParserTest extends MediaWikiTestCase {
 			return;
 		}
 
+		$backend = RepoGroup::singleton()->getLocalRepo()->getBackend();
+		if ( $backend instanceof MockFileBackend ) {
+			# In memory backend, so dont bother cleaning them up.
+			return;
+		}
+
 		$base = $this->getBaseDir();
 		// delete the files first, then the dirs.
 		self::deleteFiles(
@@ -478,8 +505,17 @@ class NewParserTest extends MediaWikiTestCase {
 				"$base/local-thumb/3/3a/Foobar.jpg/70px-Foobar.jpg",
 				"$base/local-thumb/3/3a/Foobar.jpg/960px-Foobar.jpg",
 
+				"$base/local-public/e/ea/Thumb.png",
+
 				"$base/local-public/0/09/Bad.jpg",
-				"$base/local-thumb/0/09/Bad.jpg",
+
+				"$base/local-public/f/ff/Foobar.svg",
+				"$base/local-thumb/f/ff/Foobar.svg/180px-Foobar.svg.jpg",
+				"$base/local-thumb/f/ff/Foobar.svg/270px-Foobar.svg.jpg",
+				"$base/local-thumb/f/ff/Foobar.svg/360px-Foobar.svg.jpg",
+				"$base/local-thumb/f/ff/Foobar.svg/langde-180px-Foobar.svg.jpg",
+				"$base/local-thumb/f/ff/Foobar.svg/langde-270px-Foobar.svg.jpg",
+				"$base/local-thumb/f/ff/Foobar.svg/langde-360px-Foobar.svg.jpg",
 
 				"$base/local-public/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
 			)
@@ -514,6 +550,7 @@ class NewParserTest extends MediaWikiTestCase {
 			global $wgParserTestFiles;
 			$this->file = $wgParserTestFiles[0];
 		}
+
 		return new TestFileIterator( $this->file, $this );
 	}
 
@@ -537,7 +574,7 @@ class NewParserTest extends MediaWikiTestCase {
 
 		if ( !$this->isWikitextNS( NS_MAIN ) ) {
 			// parser tests frequently assume that the main namespace contains wikitext.
-			// @todo: When setting up pages, force the content model. Only skip if
+			// @todo When setting up pages, force the content model. Only skip if
 			//        $wgtContentModelUseDB is false.
 			$this->markTestSkipped( "Main namespace does not support wikitext,"
 				. "skipping parser test: $desc" );
@@ -563,6 +600,20 @@ class NewParserTest extends MediaWikiTestCase {
 
 		$title = Title::newFromText( $titleText );
 
+		# Parser test requiring math. Make sure texvc is executable
+		# or just skip such tests.
+		if ( isset( $opts['math'] ) || isset( $opts['texvc'] ) ) {
+			global $wgTexvc;
+
+			if ( !isset( $wgTexvc ) ) {
+				$this->markTestSkipped( "SKIPPED: \$wgTexvc is not set" );
+			} elseif ( !is_executable( $wgTexvc ) ) {
+				$this->markTestSkipped( "SKIPPED: texvc binary does not exist"
+					. " or is not executable.\n"
+					. "Current configuration is:\n\$wgTexvc = '$wgTexvc'" );
+			}
+		}
+
 		if ( isset( $opts['pst'] ) ) {
 			$out = $parser->preSaveTransform( $input, $title, $user, $options );
 		} elseif ( isset( $opts['msg'] ) ) {
@@ -577,9 +628,10 @@ class NewParserTest extends MediaWikiTestCase {
 		} elseif ( isset( $opts['comment'] ) ) {
 			$out = Linker::formatComment( $input, $title, $local );
 		} elseif ( isset( $opts['preload'] ) ) {
-			$out = $parser->getpreloadText( $input, $title, $options );
+			$out = $parser->getPreloadText( $input, $title, $options );
 		} else {
 			$output = $parser->parse( $input, $title, $options, true, true, 1337 );
+			$output->setTOCEnabled( !isset( $opts['notoc'] ) );
 			$out = $output->getText();
 
 			if ( isset( $opts['showtitle'] ) ) {
@@ -621,7 +673,7 @@ class NewParserTest extends MediaWikiTestCase {
 	 *
 	 * @group ParserFuzz
 	 */
-	function testFuzzTests() {
+	public function testFuzzTests() {
 		global $wgParserTestFiles;
 
 		$files = $wgParserTestFiles;
@@ -666,7 +718,9 @@ class NewParserTest extends MediaWikiTestCase {
 			} catch ( Exception $exception ) {
 				$input_dump = sprintf( "string(%d) \"%s\"\n", strlen( $input ), $input );
 
-				$this->assertTrue( false, "Test $id, fuzz seed {$this->fuzzSeed}. \n\nInput: $input_dump\n\nError: {$exception->getMessage()}\n\nBacktrace: {$exception->getTraceAsString()}" );
+				$this->assertTrue( false, "Test $id, fuzz seed {$this->fuzzSeed}. \n\n" .
+					"Input: $input_dump\n\nError: {$exception->getMessage()}\n\n" .
+					"Backtrace: {$exception->getTraceAsString()}" );
 			}
 
 			$this->teardownGlobals();
@@ -688,7 +742,6 @@ class NewParserTest extends MediaWikiTestCase {
 			}
 
 			$id++;
-
 		}
 	}
 
@@ -882,6 +935,7 @@ class NewParserTest extends MediaWikiTestCase {
 				}
 			}
 		}
+
 		return $opts;
 	}
 
@@ -893,6 +947,7 @@ class NewParserTest extends MediaWikiTestCase {
 		if ( substr( $opt, 0, 2 ) == '[[' ) {
 			return substr( $opt, 2, -2 );
 		}
+
 		return $opt;
 	}
 
diff --git a/tests/phpunit/includes/parser/ParserMethodsTest.php b/tests/phpunit/includes/parser/ParserMethodsTest.php
index 50fe0e4d..e5c5cb21 100644
--- a/tests/phpunit/includes/parser/ParserMethodsTest.php
+++ b/tests/phpunit/includes/parser/ParserMethodsTest.php
@@ -15,6 +15,7 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 
 	/**
 	 * @dataProvider providePreSaveTransform
+	 * @covers Parser::preSaveTransform
 	 */
 	public function testPreSaveTransform( $text, $expected ) {
 		global $wgParser;
@@ -28,6 +29,9 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 		$this->assertEquals( $expected, $text );
 	}
 
+	/**
+	 * @covers Parser::callParserFunction
+	 */
 	public function testCallParserFunction() {
 		global $wgParser;
 
@@ -45,5 +49,47 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
 		), $ret, 'callParserFunction works for {{#tag:pre|foo|style=margin-left: 1.6em}}' );
 	}
 
-	// TODO: Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
+	/**
+	 * @covers Parser::parse
+	 * @covers ParserOutput::getSections
+	 */
+	public function testGetSections() {
+		global $wgParser;
+
+		$title = Title::newFromText( str_replace( '::', '__', __METHOD__ ) );
+		$out = $wgParser->parse( "==foo==\n<h2>bar</h2>\n==baz==\n", $title, new ParserOptions() );
+		$this->assertSame( array(
+			array(
+				'toclevel' => 1,
+				'level' => '2',
+				'line' => 'foo',
+				'number' => '1',
+				'index' => '1',
+				'fromtitle' => $title->getPrefixedDBkey(),
+				'byteoffset' => 0,
+				'anchor' => 'foo',
+			),
+			array(
+				'toclevel' => 1,
+				'level' => '2',
+				'line' => 'bar',
+				'number' => '2',
+				'index' => '',
+				'fromtitle' => false,
+				'byteoffset' => null,
+				'anchor' => 'bar',
+			),
+			array(
+				'toclevel' => 1,
+				'level' => '2',
+				'line' => 'baz',
+				'number' => '3',
+				'index' => '2',
+				'fromtitle' => $title->getPrefixedDBkey(),
+				'byteoffset' => 21,
+				'anchor' => 'baz',
+			),
+		), $out->getSections(), 'getSections() with proper value when <h2> is used' );
+	}
+	//@Todo Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
 }
diff --git a/tests/phpunit/includes/parser/ParserOutputTest.php b/tests/phpunit/includes/parser/ParserOutputTest.php
index 68f77ab5..c73666da 100644
--- a/tests/phpunit/includes/parser/ParserOutputTest.php
+++ b/tests/phpunit/includes/parser/ParserOutputTest.php
@@ -2,7 +2,7 @@
 
 class ParserOutputTest extends MediaWikiTestCase {
 
-	function dataIsLinkInternal() {
+	public static function provideIsLinkInternal() {
 		return array(
 			// Different domains
 			array( false, 'http://example.org', 'http://mediawiki.org' ),
@@ -29,13 +29,17 @@ class ParserOutputTest extends MediaWikiTestCase {
 
 	/**
 	 * Test to make sure ParserOutput::isLinkInternal behaves properly
-	 * @dataProvider dataIsLinkInternal
+	 * @dataProvider provideIsLinkInternal
+	 * @covers ParserOutput::isLinkInternal
 	 */
-	function testIsLinkInternal( $shouldMatch, $server, $url ) {
-
+	public function testIsLinkInternal( $shouldMatch, $server, $url ) {
 		$this->assertEquals( $shouldMatch, ParserOutput::isLinkInternal( $server, $url ) );
 	}
 
+	/**
+	 * @covers ParserOutput::setExtensionData
+	 * @covers ParserOutput::getExtensionData
+	 */
 	public function testExtensionData() {
 		$po = new ParserOutput();
 
diff --git a/tests/phpunit/includes/parser/ParserPreloadTest.php b/tests/phpunit/includes/parser/ParserPreloadTest.php
index e16b407e..d12fee36 100644
--- a/tests/phpunit/includes/parser/ParserPreloadTest.php
+++ b/tests/phpunit/includes/parser/ParserPreloadTest.php
@@ -4,8 +4,17 @@
  * @author Antoine Musso
  */
 class ParserPreloadTest extends MediaWikiTestCase {
+	/**
+	 * @var Parser
+	 */
 	private $testParser;
+	/**
+	 * @var ParserOptions
+	 */
 	private $testParserOptions;
+	/**
+	 * @var Title
+	 */
 	private $title;
 
 	protected function setUp() {
@@ -31,14 +40,14 @@ class ParserPreloadTest extends MediaWikiTestCase {
 	/**
 	 * @covers Parser::getPreloadText
 	 */
-	function testPreloadSimpleText() {
+	public function testPreloadSimpleText() {
 		$this->assertPreloaded( 'simple', 'simple' );
 	}
 
 	/**
 	 * @covers Parser::getPreloadText
 	 */
-	function testPreloadedPreIsUnstripped() {
+	public function testPreloadedPreIsUnstripped() {
 		$this->assertPreloaded(
 			'<pre>monospaced</pre>',
 			'<pre>monospaced</pre>',
@@ -49,7 +58,7 @@ class ParserPreloadTest extends MediaWikiTestCase {
 	/**
 	 * @covers Parser::getPreloadText
 	 */
-	function testPreloadedNowikiIsUnstripped() {
+	public function testPreloadedNowikiIsUnstripped() {
 		$this->assertPreloaded(
 			'<nowiki>[[Dummy title]]</nowiki>',
 			'<nowiki>[[Dummy title]]</nowiki>',
@@ -57,7 +66,7 @@ class ParserPreloadTest extends MediaWikiTestCase {
 		);
 	}
 
-	function assertPreloaded( $expected, $text, $msg = '' ) {
+	protected function assertPreloaded( $expected, $text, $msg = '' ) {
 		$this->assertEquals(
 			$expected,
 			$this->testParser->getPreloadText(
@@ -68,5 +77,4 @@ class ParserPreloadTest extends MediaWikiTestCase {
 			$msg
 		);
 	}
-
 }
diff --git a/tests/phpunit/includes/parser/PreprocessorTest.php b/tests/phpunit/includes/parser/PreprocessorTest.php
index c51a1dc5..8aee937c 100644
--- a/tests/phpunit/includes/parser/PreprocessorTest.php
+++ b/tests/phpunit/includes/parser/PreprocessorTest.php
@@ -1,9 +1,16 @@
 <?php
 
 class PreprocessorTest extends MediaWikiTestCase {
-	var $mTitle = 'Page title';
-	var $mPPNodeCount = 0;
-	var $mOptions;
+	protected $mTitle = 'Page title';
+	protected $mPPNodeCount = 0;
+	/**
+	 * @var ParserOptions
+	 */
+	protected $mOptions;
+	/**
+	 * @var Preprocessor
+	 */
+	protected $mPreprocessor;
 
 	protected function setUp() {
 		global $wgParserConf, $wgContLang;
@@ -18,7 +25,7 @@ class PreprocessorTest extends MediaWikiTestCase {
 		return array( 'gallery', 'display map' /* Used by Maps, see r80025 CR */, '/foo' );
 	}
 
-	function provideCases() {
+	public static function provideCases() {
 		return array(
 			array( "Foo", "<root>Foo</root>" ),
 			array( "<!-- Foo -->", "<root><comment>&lt;!-- Foo --&gt;</comment></root>" ),
@@ -115,7 +122,7 @@ class PreprocessorTest extends MediaWikiTestCase {
 	 * @param string $wikiText
 	 * @return string
 	 */
-	function preprocessToXml( $wikiText ) {
+	protected function preprocessToXml( $wikiText ) {
 		if ( method_exists( $this->mPreprocessor, 'preprocessToXml' ) ) {
 			return $this->normalizeXml( $this->mPreprocessor->preprocessToXml( $wikiText ) );
 		}
@@ -134,21 +141,22 @@ class PreprocessorTest extends MediaWikiTestCase {
 	 * @param string $xml
 	 * @return string
 	 */
-	function normalizeXml( $xml ) {
+	protected function normalizeXml( $xml ) {
 		return preg_replace( '!<([a-z]+)/>!', '<$1></$1>', str_replace( ' />', '/>', $xml ) );
 	}
 
 	/**
 	 * @dataProvider provideCases
+	 * @covers Preprocessor_DOM::preprocessToXml
 	 */
-	function testPreprocessorOutput( $wikiText, $expectedXml ) {
+	public function testPreprocessorOutput( $wikiText, $expectedXml ) {
 		$this->assertEquals( $this->normalizeXml( $expectedXml ), $this->preprocessToXml( $wikiText ) );
 	}
 
 	/**
 	 * These are more complex test cases taken out of wiki articles.
 	 */
-	function provideFiles() {
+	public static function provideFiles() {
 		return array(
 			array( "QuoteQuran" ), # http://en.wikipedia.org/w/index.php?title=Template:QuoteQuran/sandbox&oldid=237348988 GFDL + CC-BY-SA by Striver
 			array( "Factorial" ), # http://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC-BY-SA by Polonium
@@ -160,8 +168,9 @@ class PreprocessorTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideFiles
+	 * @covers Preprocessor_DOM::preprocessToXml
 	 */
-	function testPreprocessorOutputFiles( $filename ) {
+	public function testPreprocessorOutputFiles( $filename ) {
 		$folder = __DIR__ . "/../../../parser/preprocess";
 		$wikiText = file_get_contents( "$folder/$filename.txt" );
 		$output = $this->preprocessToXml( $wikiText );
@@ -180,7 +189,7 @@ class PreprocessorTest extends MediaWikiTestCase {
 	/**
 	 * Tests from Bug 28642 · https://bugzilla.wikimedia.org/28642
 	 */
-	function provideHeadings() {
+	public static function provideHeadings() {
 		return array( /* These should become headings: */
 			array( "== h ==<!--c1-->", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment></h></root>" ),
 			array( "== h == 	<!--c1-->", "<root><h level=\"2\" i=\"1\">== h == 	<comment>&lt;!--c1--&gt;</comment></h></root>" ),
@@ -209,11 +218,11 @@ class PreprocessorTest extends MediaWikiTestCase {
 			array( "== h ==  <!--c1-->  <!--c2--><!--c3-->  ", "<root><h level=\"2\" i=\"1\">== h ==  <comment>&lt;!--c1--&gt;</comment>  <comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment>  </h></root>" ),
 			array( "== h ==  <!--c1--><!--c2-->  <!--c3-->  ", "<root><h level=\"2\" i=\"1\">== h ==  <comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment>  <comment>&lt;!--c3--&gt;</comment>  </h></root>" ),
 			array( "== h ==  <!--c1-->  <!--c2-->  <!--c3-->  ", "<root><h level=\"2\" i=\"1\">== h ==  <comment>&lt;!--c1--&gt;</comment>  <comment>&lt;!--c2--&gt;</comment>  <comment>&lt;!--c3--&gt;</comment>  </h></root>" ),
+			array( "== h ==<!--c1--> 	<!--c2-->", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment> 	<comment>&lt;!--c2--&gt;</comment></h></root>" ),
+			array( "== h == 	<!--c1--> 	<!--c2-->", "<root><h level=\"2\" i=\"1\">== h == 	<comment>&lt;!--c1--&gt;</comment> 	<comment>&lt;!--c2--&gt;</comment></h></root>" ),
+			array( "== h ==<!--c1--> 	<!--c2--> 	", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment> 	<comment>&lt;!--c2--&gt;</comment> 	</h></root>" ),
 
 			/* These are not working: */
-			array( "== h ==<!--c1--> 	<!--c2-->", "<root>== h ==<comment>&lt;!--c1--&gt;</comment> 	<comment>&lt;!--c2--&gt;</comment></root>" ),
-			array( "== h == 	<!--c1--> 	<!--c2-->", "<root>== h == 	<comment>&lt;!--c1--&gt;</comment> 	<comment>&lt;!--c2--&gt;</comment></root>" ),
-			array( "== h ==<!--c1--> 	<!--c2--> 	", "<root>== h ==<comment>&lt;!--c1--&gt;</comment> 	<comment>&lt;!--c2--&gt;</comment> 	</root>" ),
 			array( "== h == x <!--c1--><!--c2--><!--c3-->  ", "<root>== h == x <comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment>  </root>" ),
 			array( "== h ==<!--c1--> x <!--c2--><!--c3-->  ", "<root>== h ==<comment>&lt;!--c1--&gt;</comment> x <comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment>  </root>" ),
 			array( "== h ==<!--c1--><!--c2--><!--c3--> x ", "<root>== h ==<comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment> x </root>" ),
@@ -222,8 +231,9 @@ class PreprocessorTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideHeadings
+	 * @covers Preprocessor_DOM::preprocessToXml
 	 */
-	function testHeadings( $wikiText, $expectedXml ) {
+	public function testHeadings( $wikiText, $expectedXml ) {
 		$this->assertEquals( $this->normalizeXml( $expectedXml ), $this->preprocessToXml( $wikiText ) );
 	}
 }
diff --git a/tests/phpunit/includes/parser/TagHooksTest.php b/tests/phpunit/includes/parser/TagHooksTest.php
index ed600790..61cbe45d 100644
--- a/tests/phpunit/includes/parser/TagHooksTest.php
+++ b/tests/phpunit/includes/parser/TagHooksTest.php
@@ -21,7 +21,7 @@ class TagHookTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provideValidNames
 	 */
-	function testTagHooks( $tag ) {
+	public function testTagHooks( $tag ) {
 		global $wgParserConf, $wgContLang;
 		$parser = new Parser( $wgParserConf );
 
@@ -36,7 +36,7 @@ class TagHookTest extends MediaWikiTestCase {
 	 * @dataProvider provideBadNames
 	 * @expectedException MWException
 	 */
-	function testBadTagHooks( $tag ) {
+	public function testBadTagHooks( $tag ) {
 		global $wgParserConf, $wgContLang;
 		$parser = new Parser( $wgParserConf );
 
@@ -48,7 +48,7 @@ class TagHookTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider provideValidNames
 	 */
-	function testFunctionTagHooks( $tag ) {
+	public function testFunctionTagHooks( $tag ) {
 		global $wgParserConf, $wgContLang;
 		$parser = new Parser( $wgParserConf );
 
@@ -63,7 +63,7 @@ class TagHookTest extends MediaWikiTestCase {
 	 * @dataProvider provideBadNames
 	 * @expectedException MWException
 	 */
-	function testBadFunctionTagHooks( $tag ) {
+	public function testBadFunctionTagHooks( $tag ) {
 		global $wgParserConf, $wgContLang;
 		$parser = new Parser( $wgParserConf );
 
diff --git a/tests/phpunit/includes/parser/TidyTest.php b/tests/phpunit/includes/parser/TidyTest.php
new file mode 100644
index 00000000..57a88b9d
--- /dev/null
+++ b/tests/phpunit/includes/parser/TidyTest.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @group Parser
+ */
+class TidyTest extends MediaWikiTestCase {
+	public function setUp() {
+		parent::setUp();
+		$check = MWTidy::tidy( '' );
+		if ( strpos( $check, '<!--' ) !== false ) {
+			$this->markTestSkipped( 'Tidy not found' );
+		}
+	}
+
+	/**
+	 * @dataProvider provideTestWrapping
+	 */
+	public function testTidyWrapping( $expected, $text, $msg = '' ) {
+		$text = MWTidy::tidy( $text );
+		// We don't care about where Tidy wants to stick is <p>s
+		$text = trim( preg_replace( '#</?p>#', '', $text ) );
+		// Windows, we love you!
+		$text = str_replace( "\r", '', $text );
+		$this->assertEquals( $expected, $text, $msg );
+	}
+
+	public function provideTestWrapping() {
+		return array(
+			array(
+				'<mw:editsection page="foo" section="bar">foo</mw:editsection>',
+				'<mw:editsection page="foo" section="bar">foo</mw:editsection>',
+				'<mw:editsection> should survive tidy'
+			),
+			array(
+				'<editsection page="foo" section="bar">foo</editsection>',
+				'<editsection page="foo" section="bar">foo</editsection>',
+				'<editsection> should survive tidy'
+			),
+			array( '<mw:toc>foo</mw:toc>', '<mw:toc>foo</mw:toc>', '<mw:toc> should survive tidy' ),
+			array( "<link foo=\"bar\" />\nfoo", '<link foo="bar"/>foo', '<link> should survive tidy' ),
+			array( "<meta foo=\"bar\" />\nfoo", '<meta foo="bar"/>foo', '<meta> should survive tidy' ),
+		);
+	}
+}
\ No newline at end of file
diff --git a/tests/phpunit/includes/search/SearchEngineTest.php b/tests/phpunit/includes/search/SearchEngineTest.php
index 6abca6d4..87067038 100644
--- a/tests/phpunit/includes/search/SearchEngineTest.php
+++ b/tests/phpunit/includes/search/SearchEngineTest.php
@@ -45,7 +45,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
 		}
 
 		if ( !$this->isWikitextNS( NS_MAIN ) ) {
-			//@todo: cover the case of non-wikitext content in the main namespace
+			// @todo cover the case of non-wikitext content in the main namespace
 			return;
 		}
 
@@ -87,6 +87,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
 		# sort them numerically so we will compare simply that we received
 		# the expected matches.
 		sort( $matches );
+
 		return $matches;
 	}
 
@@ -114,7 +115,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
 		return true;
 	}
 
-	function testFullWidth() {
+	public function testFullWidth() {
 		$this->assertEquals(
 			array( 'FullOneUp', 'FullTwoLow', 'HalfOneUp', 'HalfTwoLow' ),
 			$this->fetchIds( $this->search->searchText( 'AZ' ) ),
@@ -133,14 +134,14 @@ class SearchEngineTest extends MediaWikiLangTestCase {
 			"Search for normalized from Full-width Lower" );
 	}
 
-	function testTextSearch() {
+	public function testTextSearch() {
 		$this->assertEquals(
 			array( 'Smithee' ),
 			$this->fetchIds( $this->search->searchText( 'smithee' ) ),
 			"Plain search failed" );
 	}
 
-	function testTextPowerSearch() {
+	public function testTextPowerSearch() {
 		$this->search->setNamespaces( array( 0, 1, 4 ) );
 		$this->assertEquals(
 			array(
@@ -151,7 +152,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
 			"Power search failed" );
 	}
 
-	function testTitleSearch() {
+	public function testTitleSearch() {
 		$this->assertEquals(
 			array(
 				'Alan Smithee',
@@ -161,7 +162,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
 			"Title search failed" );
 	}
 
-	function testTextTitlePowerSearch() {
+	public function testTextTitlePowerSearch() {
 		$this->search->setNamespaces( array( 0, 1, 4 ) );
 		$this->assertEquals(
 			array(
@@ -172,5 +173,4 @@ class SearchEngineTest extends MediaWikiLangTestCase {
 			$this->fetchIds( $this->search->searchTitle( 'smithee' ) ),
 			"Title power search failed" );
 	}
-
 }
diff --git a/tests/phpunit/includes/search/SearchUpdateTest.php b/tests/phpunit/includes/search/SearchUpdateTest.php
index 7d867bc4..2f4fd501 100644
--- a/tests/phpunit/includes/search/SearchUpdateTest.php
+++ b/tests/phpunit/includes/search/SearchUpdateTest.php
@@ -17,6 +17,7 @@ class MockSearch extends SearchEngine {
 
 /**
  * @group Search
+ * @group Database
  */
 class SearchUpdateTest extends MediaWikiTestCase {
 
@@ -25,19 +26,11 @@ class SearchUpdateTest extends MediaWikiTestCase {
 		$this->setMwGlobals( 'wgSearchType', 'MockSearch' );
 	}
 
-	function update( $text, $title = 'Test', $id = 1 ) {
-		$u = new SearchUpdate( $id, $title, $text );
-		$u->doUpdate();
-		return array( MockSearch::$title, MockSearch::$text );
-	}
-
 	function updateText( $text ) {
-		list( , $resultText ) = $this->update( $text );
-		$resultText = trim( $resultText ); // abstract from some implementation details
-		return $resultText;
+		return trim( SearchUpdate::updateText( $text ) );
 	}
 
-	function testUpdateText() {
+	public function testUpdateText() {
 		$this->assertEquals(
 			'test',
 			$this->updateText( '<div>TeSt</div>' ),
@@ -69,7 +62,7 @@ EOT
 		);
 	}
 
-	function testBug32712() {
+	public function testBug32712() {
 		$text = "text „http://example.com“ text";
 		$result = $this->updateText( $text );
 		$processed = preg_replace( '/Q/u', 'Q', $result );
diff --git a/tests/phpunit/includes/site/MediaWikiSiteTest.php b/tests/phpunit/includes/site/MediaWikiSiteTest.php
index 0cecdeea..c5d52d33 100644
--- a/tests/phpunit/includes/site/MediaWikiSiteTest.php
+++ b/tests/phpunit/includes/site/MediaWikiSiteTest.php
@@ -54,6 +54,7 @@ class MediaWikiSiteTest extends SiteTest {
 
 	/**
 	 * @dataProvider fileUrlProvider
+	 * @covers MediaWikiSite::getFileUrl
 	 */
 	public function testGetFileUrl( $url, $filePath, $pathArgument, $expected ) {
 		$site = new MediaWikiSite();
@@ -62,7 +63,7 @@ class MediaWikiSiteTest extends SiteTest {
 		$this->assertEquals( $expected, $site->getFileUrl( $pathArgument ) );
 	}
 
-	public function provideGetPageUrl() {
+	public static function provideGetPageUrl() {
 		return array(
 			// path, page, expected substring
 			array( 'http://acme.test/wiki/$1', 'Berlin', '/wiki/Berlin' ),
@@ -77,6 +78,7 @@ class MediaWikiSiteTest extends SiteTest {
 
 	/**
 	 * @dataProvider provideGetPageUrl
+	 * @covers MediaWikiSite::getPageUrl
 	 */
 	public function testGetPageUrl( $path, $page, $expected ) {
 		$site = new MediaWikiSite();
@@ -85,5 +87,4 @@ class MediaWikiSiteTest extends SiteTest {
 		$this->assertContains( $path, $site->getPageUrl() );
 		$this->assertContains( $expected, $site->getPageUrl( $page ) );
 	}
-
 }
diff --git a/tests/phpunit/includes/site/SiteListTest.php b/tests/phpunit/includes/site/SiteListTest.php
index c3298397..8af2fc1b 100644
--- a/tests/phpunit/includes/site/SiteListTest.php
+++ b/tests/phpunit/includes/site/SiteListTest.php
@@ -68,6 +68,7 @@ class SiteListTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider siteListProvider
 	 * @param SiteList $sites
+	 * @covers SiteList::isEmpty
 	 */
 	public function testIsEmpty( SiteList $sites ) {
 		$this->assertEquals( count( $sites ) === 0, $sites->isEmpty() );
@@ -76,6 +77,7 @@ class SiteListTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider siteListProvider
 	 * @param SiteList $sites
+	 * @covers SiteList::getSite
 	 */
 	public function testGetSiteByGlobalId( SiteList $sites ) {
 		if ( $sites->isEmpty() ) {
@@ -93,6 +95,7 @@ class SiteListTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider siteListProvider
 	 * @param SiteList $sites
+	 * @covers SiteList::getSiteByInternalId
 	 */
 	public function testGetSiteByInternalId( $sites ) {
 		/**
@@ -110,6 +113,7 @@ class SiteListTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider siteListProvider
 	 * @param SiteList $sites
+	 * @covers SiteList::hasSite
 	 */
 	public function testHasGlobalId( $sites ) {
 		$this->assertFalse( $sites->hasSite( 'non-existing-global-id' ) );
@@ -128,6 +132,7 @@ class SiteListTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider siteListProvider
 	 * @param SiteList $sites
+	 * @covers SiteList::hasInternalId
 	 */
 	public function testHasInternallId( $sites ) {
 		/**
@@ -145,6 +150,7 @@ class SiteListTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider siteListProvider
 	 * @param SiteList $sites
+	 * @covers SiteList::getGlobalIdentifiers
 	 */
 	public function testGetGlobalIdentifiers( SiteList $sites ) {
 		$identifiers = $sites->getGlobalIdentifiers();
@@ -169,6 +175,8 @@ class SiteListTest extends MediaWikiTestCase {
 	 * @since 1.21
 	 *
 	 * @param SiteList $list
+	 * @covers SiteList::getSerializationData
+	 * @covers SiteList::unserialize
 	 */
 	public function testSerialization( SiteList $list ) {
 		$serialization = serialize( $list );
@@ -186,5 +194,4 @@ class SiteListTest extends MediaWikiTestCase {
 			$this->assertTrue( $copy->hasInternalId( $site->getInternalId() ) );
 		}
 	}
-
 }
diff --git a/tests/phpunit/includes/site/SiteSQLStoreTest.php b/tests/phpunit/includes/site/SiteSQLStoreTest.php
index cf4ce945..6002c1a1 100644
--- a/tests/phpunit/includes/site/SiteSQLStoreTest.php
+++ b/tests/phpunit/includes/site/SiteSQLStoreTest.php
@@ -32,6 +32,9 @@
  */
 class SiteSQLStoreTest extends MediaWikiTestCase {
 
+	/**
+	 * @covers SiteSQLStore::getSites
+	 */
 	public function testGetSites() {
 		$expectedSites = TestSites::getSites();
 		TestSites::insertIntoDb();
@@ -56,6 +59,9 @@ class SiteSQLStoreTest extends MediaWikiTestCase {
 		}
 	}
 
+	/**
+	 * @covers SiteSQLStore::saveSites
+	 */
 	public function testSaveSites() {
 		$store = SiteSQLStore::newInstance();
 
@@ -86,6 +92,9 @@ class SiteSQLStoreTest extends MediaWikiTestCase {
 		$this->assertTrue( $site->getInternalId() >= 0 );
 	}
 
+	/**
+	 * @covers SiteSQLStore::reset
+	 */
 	public function testReset() {
 		$store1 = SiteSQLStore::newInstance();
 		$store2 = SiteSQLStore::newInstance();
@@ -109,6 +118,9 @@ class SiteSQLStoreTest extends MediaWikiTestCase {
 		$this->assertNull( $site );
 	}
 
+	/**
+	 * @covers SiteSQLStore::clear
+	 */
 	public function testClear() {
 		$store = SiteSQLStore::newInstance();
 		$this->assertTrue( $store->clear() );
@@ -119,5 +131,4 @@ class SiteSQLStoreTest extends MediaWikiTestCase {
 		$sites = $store->getSites();
 		$this->assertEquals( 0, $sites->count() );
 	}
-
 }
diff --git a/tests/phpunit/includes/site/SiteTest.php b/tests/phpunit/includes/site/SiteTest.php
index d20e2a52..29c1ff33 100644
--- a/tests/phpunit/includes/site/SiteTest.php
+++ b/tests/phpunit/includes/site/SiteTest.php
@@ -38,6 +38,7 @@ class SiteTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider instanceProvider
 	 * @param Site $site
+	 * @covers Site::getInterwikiIds
 	 */
 	public function testGetInterwikiIds( Site $site ) {
 		$this->assertInternalType( 'array', $site->getInterwikiIds() );
@@ -46,6 +47,7 @@ class SiteTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider instanceProvider
 	 * @param Site $site
+	 * @covers Site::getNavigationIds
 	 */
 	public function testGetNavigationIds( Site $site ) {
 		$this->assertInternalType( 'array', $site->getNavigationIds() );
@@ -54,6 +56,7 @@ class SiteTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider instanceProvider
 	 * @param Site $site
+	 * @covers Site::addNavigationId
 	 */
 	public function testAddNavigationId( Site $site ) {
 		$site->addNavigationId( 'foobar' );
@@ -63,6 +66,7 @@ class SiteTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider instanceProvider
 	 * @param Site $site
+	 * @covers Site::addInterwikiId
 	 */
 	public function testAddInterwikiId( Site $site ) {
 		$site->addInterwikiId( 'foobar' );
@@ -72,6 +76,7 @@ class SiteTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider instanceProvider
 	 * @param Site $site
+	 * @covers Site::getLanguageCode
 	 */
 	public function testGetLanguageCode( Site $site ) {
 		$this->assertTypeOrValue( 'string', $site->getLanguageCode(), null );
@@ -80,6 +85,7 @@ class SiteTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider instanceProvider
 	 * @param Site $site
+	 * @covers Site::setLanguageCode
 	 */
 	public function testSetLanguageCode( Site $site ) {
 		$site->setLanguageCode( 'en' );
@@ -89,6 +95,7 @@ class SiteTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider instanceProvider
 	 * @param Site $site
+	 * @covers Site::normalizePageName
 	 */
 	public function testNormalizePageName( Site $site ) {
 		$this->assertInternalType( 'string', $site->normalizePageName( 'Foobar' ) );
@@ -97,6 +104,7 @@ class SiteTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider instanceProvider
 	 * @param Site $site
+	 * @covers Site::getGlobalId
 	 */
 	public function testGetGlobalId( Site $site ) {
 		$this->assertTypeOrValue( 'string', $site->getGlobalId(), null );
@@ -105,6 +113,7 @@ class SiteTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider instanceProvider
 	 * @param Site $site
+	 * @covers Site::setGlobalId
 	 */
 	public function testSetGlobalId( Site $site ) {
 		$site->setGlobalId( 'foobar' );
@@ -114,6 +123,7 @@ class SiteTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider instanceProvider
 	 * @param Site $site
+	 * @covers Site::getType
 	 */
 	public function testGetType( Site $site ) {
 		$this->assertInternalType( 'string', $site->getType() );
@@ -122,6 +132,7 @@ class SiteTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider instanceProvider
 	 * @param Site $site
+	 * @covers Site::getPath
 	 */
 	public function testGetPath( Site $site ) {
 		$this->assertTypeOrValue( 'string', $site->getPath( 'page_path' ), null );
@@ -132,6 +143,7 @@ class SiteTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider instanceProvider
 	 * @param Site $site
+	 * @covers Site::getAllPaths
 	 */
 	public function testGetAllPaths( Site $site ) {
 		$this->assertInternalType( 'array', $site->getAllPaths() );
@@ -140,6 +152,8 @@ class SiteTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider instanceProvider
 	 * @param Site $site
+	 * @covers Site::setPath
+	 * @covers Site::removePath
 	 */
 	public function testSetAndRemovePath( Site $site ) {
 		$count = count( $site->getAllPaths() );
@@ -162,6 +176,9 @@ class SiteTest extends MediaWikiTestCase {
 		$this->assertNull( $site->getPath( 'spam' ) );
 	}
 
+	/**
+	 * @covers Site::setLinkPath
+	 */
 	public function testSetLinkPath() {
 		$site = new Site();
 		$path = "TestPath/$1";
@@ -170,6 +187,9 @@ class SiteTest extends MediaWikiTestCase {
 		$this->assertEquals( $path, $site->getLinkPath() );
 	}
 
+	/**
+	 * @covers Site::getLinkPathType
+	 */
 	public function testGetLinkPathType() {
 		$site = new Site();
 
@@ -182,6 +202,9 @@ class SiteTest extends MediaWikiTestCase {
 		$this->assertEquals( $path, $site->getLinkPath() );
 	}
 
+	/**
+	 * @covers Site::setPath
+	 */
 	public function testSetPath() {
 		$site = new Site();
 
@@ -191,6 +214,10 @@ class SiteTest extends MediaWikiTestCase {
 		$this->assertEquals( $path, $site->getPath( 'foo' ) );
 	}
 
+	/**
+	 * @covers Site::setPath
+	 * @covers Site::getProtocol
+	 */
 	public function testProtocolRelativePath() {
 		$site = new Site();
 
@@ -201,7 +228,7 @@ class SiteTest extends MediaWikiTestCase {
 		$this->assertEquals( '', $site->getProtocol() );
 	}
 
-	public function provideGetPageUrl() {
+	public static function provideGetPageUrl() {
 		//NOTE: the assumption that the URL is built by replacing $1
 		//      with the urlencoded version of $page
 		//      is true for Site but not guaranteed for subclasses.
@@ -228,6 +255,7 @@ class SiteTest extends MediaWikiTestCase {
 
 	/**
 	 * @dataProvider provideGetPageUrl
+	 * @covers Site::getPageUrl
 	 */
 	public function testGetPageUrl( $path, $page, $expected ) {
 		$site = new Site();
@@ -252,6 +280,8 @@ class SiteTest extends MediaWikiTestCase {
 	/**
 	 * @dataProvider instanceProvider
 	 * @param Site $site
+	 * @covers Site::serialize
+	 * @covers Site::unserialize
 	 */
 	public function testSerialization( Site $site ) {
 		$this->assertInstanceOf( 'Serializable', $site );
@@ -263,5 +293,4 @@ class SiteTest extends MediaWikiTestCase {
 
 		$this->assertEquals( $serialization, serialize( $newInstance ) );
 	}
-
 }
diff --git a/tests/phpunit/includes/site/TestSites.php b/tests/phpunit/includes/site/TestSites.php
index a5656a73..f224b7d7 100644
--- a/tests/phpunit/includes/site/TestSites.php
+++ b/tests/phpunit/includes/site/TestSites.php
@@ -97,5 +97,4 @@ class TestSites {
 		$sitesTable->clear();
 		$sitesTable->saveSites( TestSites::getSites() );
 	}
-
 }
diff --git a/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php b/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
index 3b82e07d..a806b4ac 100644
--- a/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
+++ b/tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
@@ -51,7 +51,7 @@ class QueryAllSpecialPagesTest extends MediaWikiTestCase {
 	 * Test SQL for each of our QueryPages objects
 	 * @group Database
 	 */
-	function testQuerypageSqlQuery() {
+	public function testQuerypageSqlQuery() {
 		global $wgDBtype;
 
 		foreach ( $this->queryPages as $page ) {
diff --git a/tests/phpunit/includes/specials/SpecialPreferencesTest.php b/tests/phpunit/includes/specials/SpecialPreferencesTest.php
new file mode 100644
index 00000000..6c637c65
--- /dev/null
+++ b/tests/phpunit/includes/specials/SpecialPreferencesTest.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Test class for SpecialPreferences class.
+ *
+ * Copyright © 2013, Antoine Musso
+ * Copyright © 2013, Wikimedia Foundation Inc.
+ *
+ */
+
+class SpecialPreferencesTest extends MediaWikiTestCase {
+
+	/**
+	 * Make sure a nickname which is longer than $wgMaxSigChars
+	 * is not throwing a fatal error.
+	 *
+	 * Test specifications by Alexandre "ialex" Emsenhuber.
+	 */
+	public function testBug41337() {
+
+		// Set a low limit
+		$this->setMwGlobals( 'wgMaxSigChars', 2 );
+
+		$user = $this->getMock( 'User' );
+		$user->expects( $this->any() )
+			->method( 'isAnon' )
+			->will( $this->returnValue( false ) );
+
+		# Yeah foreach requires an array, not NULL =(
+		$user->expects( $this->any() )
+			->method( 'getEffectiveGroups' )
+			->will( $this->returnValue( array() ) );
+
+		# The mocked user has a long nickname
+		$user->expects( $this->any() )
+			->method( 'getOption' )
+			->will( $this->returnValueMap( array(
+				array( 'nickname', null, false, 'superlongnickname' ),
+			)
+			) );
+
+		# Validate the mock (FIXME should probably be removed)
+		$this->assertFalse( $user->isAnon() );
+		$this->assertEquals( array(),
+			$user->getEffectiveGroups() );
+		$this->assertEquals( 'superlongnickname',
+			$user->getOption( 'nickname' ) );
+
+		# Forge a request to call the special page
+		$context = new RequestContext();
+		$context->setRequest( new FauxRequest() );
+		$context->setUser( $user );
+		$context->setTitle( Title::newFromText( 'Test' ) );
+
+		# Do the call, should not spurt a fatal error.
+		$special = new SpecialPreferences();
+		$special->setContext( $context );
+		$special->execute( array() );
+	}
+
+}
diff --git a/tests/phpunit/includes/specials/SpecialRecentchangesTest.php b/tests/phpunit/includes/specials/SpecialRecentchangesTest.php
index add830b0..436eb2e2 100644
--- a/tests/phpunit/includes/specials/SpecialRecentchangesTest.php
+++ b/tests/phpunit/includes/specials/SpecialRecentchangesTest.php
@@ -42,7 +42,6 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
 	/** return false if condition begin with 'rc_timestamp ' */
 	private static function filterOutRcTimestampCondition( $var ) {
 		return ( false === strpos( $var, 'rc_timestamp ' ) );
-
 	}
 
 	public function testRcNsFilter() {
@@ -123,5 +122,4 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
 			array( NS_TALK, NS_MAIN ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/includes/specials/SpecialSearchTest.php b/tests/phpunit/includes/specials/SpecialSearchTest.php
index f5ef0fb7..17e883fd 100644
--- a/tests/phpunit/includes/specials/SpecialSearchTest.php
+++ b/tests/phpunit/includes/specials/SpecialSearchTest.php
@@ -18,7 +18,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
 	 * @param $expectedProfile An expected search profile name
 	 * @param $expectedNs Array Expected namespaces
 	 */
-	function testProfileAndNamespaceLoading(
+	public function testProfileAndNamespaceLoading(
 		$requested, $userOptions, $expectedProfile, $expectedNS,
 		$message = 'Profile name and namespaces mismatches!'
 	) {
@@ -53,10 +53,9 @@ class SpecialSearchTest extends MediaWikiTestCase {
 			)
 			, $message
 		);
-
 	}
 
-	function provideSearchOptionsTests() {
+	public static function provideSearchOptionsTests() {
 		$defaultNS = SearchEngine::defaultNamespaces();
 		$EMPTY_REQUEST = array();
 		$NO_USER_PREF = null;
@@ -105,6 +104,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
 		foreach ( $opt as $name => $value ) {
 			$u->setOption( $name, $value );
 		}
+
 		return $u;
 	}
 
@@ -112,7 +112,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
 	 * Verify we do not expand search term in <title> on search result page
 	 * https://gerrit.wikimedia.org/r/4841
 	 */
-	function testSearchTermIsNotExpanded() {
+	public function testSearchTermIsNotExpanded() {
 
 		# Initialize [[Special::Search]]
 		$search = new SpecialSearch();
@@ -135,6 +135,5 @@ class SpecialSearchTest extends MediaWikiTestCase {
 			$pageTitle,
 			"Search term '{$term}' should not be expanded in Special:Search <title>"
 		);
-
 	}
 }
diff --git a/tests/phpunit/includes/upload/UploadBaseTest.php b/tests/phpunit/includes/upload/UploadBaseTest.php
new file mode 100644
index 00000000..982b46b2
--- /dev/null
+++ b/tests/phpunit/includes/upload/UploadBaseTest.php
@@ -0,0 +1,147 @@
+<?php
+
+/**
+ * @group Upload
+ */
+class UploadBaseTest extends MediaWikiTestCase {
+
+	/** @var UploadTestHandler */
+	protected $upload;
+
+	protected function setUp() {
+		global $wgHooks;
+		parent::setUp();
+
+		$this->upload = new UploadTestHandler;
+		$this->hooks = $wgHooks;
+		$wgHooks['InterwikiLoadPrefix'][] = function ( $prefix, &$data ) {
+			return false;
+		};
+	}
+
+	protected function tearDown() {
+		global $wgHooks;
+		$wgHooks = $this->hooks;
+
+		parent::tearDown();
+	}
+
+
+	/**
+	 * First checks the return code
+	 * of UploadBase::getTitle() and then the actual returned title
+	 *
+	 * @dataProvider provideTestTitleValidation
+	 * @covers UploadBase::getTitle
+	 */
+	public function testTitleValidation( $srcFilename, $dstFilename, $code, $msg ) {
+		/* Check the result code */
+		$this->assertEquals( $code,
+			$this->upload->testTitleValidation( $srcFilename ),
+			"$msg code" );
+
+		/* If we expect a valid title, check the title itself. */
+		if ( $code == UploadBase::OK ) {
+			$this->assertEquals( $dstFilename,
+				$this->upload->getTitle()->getText(),
+				"$msg text" );
+		}
+	}
+
+	/**
+	 * Test various forms of valid and invalid titles that can be supplied.
+	 */
+	public static function provideTestTitleValidation() {
+		return array(
+			/* Test a valid title */
+			array( 'ValidTitle.jpg', 'ValidTitle.jpg', UploadBase::OK,
+				'upload valid title' ),
+			/* A title with a slash */
+			array( 'A/B.jpg', 'B.jpg', UploadBase::OK,
+				'upload title with slash' ),
+			/* A title with illegal char */
+			array( 'A:B.jpg', 'A-B.jpg', UploadBase::OK,
+				'upload title with colon' ),
+			/* Stripping leading File: prefix */
+			array( 'File:C.jpg', 'C.jpg', UploadBase::OK,
+				'upload title with File prefix' ),
+			/* Test illegal suggested title (r94601) */
+			array( '%281%29.JPG', null, UploadBase::ILLEGAL_FILENAME,
+				'illegal title for upload' ),
+			/* A title without extension */
+			array( 'A', null, UploadBase::FILETYPE_MISSING,
+				'upload title without extension' ),
+			/* A title with no basename */
+			array( '.jpg', null, UploadBase::MIN_LENGTH_PARTNAME,
+				'upload title without basename' ),
+			/* A title that is longer than 255 bytes */
+			array( str_repeat( 'a', 255 ) . '.jpg', null, UploadBase::FILENAME_TOO_LONG,
+				'upload title longer than 255 bytes' ),
+			/* A title that is longer than 240 bytes */
+			array( str_repeat( 'a', 240 ) . '.jpg', null, UploadBase::FILENAME_TOO_LONG,
+				'upload title longer than 240 bytes' ),
+		);
+	}
+
+	/**
+	 * Test the upload verification functions
+	 * @covers UploadBase::verifyUpload
+	 */
+	public function testVerifyUpload() {
+		/* Setup with zero file size */
+		$this->upload->initializePathInfo( '', '', 0 );
+		$result = $this->upload->verifyUpload();
+		$this->assertEquals( UploadBase::EMPTY_FILE,
+			$result['status'],
+			'upload empty file' );
+	}
+
+	// Helper used to create an empty file of size $size.
+	private function createFileOfSize( $size ) {
+		$filename = tempnam( wfTempDir(), "mwuploadtest" );
+
+		$fh = fopen( $filename, 'w' );
+		ftruncate( $fh, $size );
+		fclose( $fh );
+
+		return $filename;
+	}
+
+	/**
+	 * test uploading a 100 bytes file with $wgMaxUploadSize = 100
+	 *
+	 * This method should be abstracted so we can test different settings.
+	 */
+	public function testMaxUploadSize() {
+		global $wgMaxUploadSize;
+		$savedGlobal = $wgMaxUploadSize; // save global
+		global $wgFileExtensions;
+		$wgFileExtensions[] = 'txt';
+
+		$wgMaxUploadSize = 100;
+
+		$filename = $this->createFileOfSize( $wgMaxUploadSize );
+		$this->upload->initializePathInfo( basename( $filename ) . '.txt', $filename, 100 );
+		$result = $this->upload->verifyUpload();
+		unlink( $filename );
+
+		$this->assertEquals(
+			array( 'status' => UploadBase::OK ), $result );
+
+		$wgMaxUploadSize = $savedGlobal; // restore global
+	}
+}
+
+class UploadTestHandler extends UploadBase {
+	public function initializeFromRequest( &$request ) {
+	}
+
+	public function testTitleValidation( $name ) {
+		$this->mTitle = false;
+		$this->mDesiredDestName = $name;
+		$this->mTitleError = UploadBase::OK;
+		$this->getTitle();
+
+		return $this->mTitleError;
+	}
+}
diff --git a/tests/phpunit/includes/upload/UploadFromUrlTest.php b/tests/phpunit/includes/upload/UploadFromUrlTest.php
index 4d2d8ce3..a75fba69 100644
--- a/tests/phpunit/includes/upload/UploadFromUrlTest.php
+++ b/tests/phpunit/includes/upload/UploadFromUrlTest.php
@@ -6,14 +6,14 @@
  * @group Database
  */
 class UploadFromUrlTest extends ApiTestCase {
-
 	protected function setUp() {
-		global $wgEnableUploads, $wgAllowCopyUploads, $wgAllowAsyncCopyUploads;
 		parent::setUp();
 
-		$wgEnableUploads = true;
-		$wgAllowCopyUploads = true;
-		$wgAllowAsyncCopyUploads = true;
+		$this->setMwGlobals( array(
+			'wgEnableUploads' => true,
+			'wgAllowCopyUploads' => true,
+			'wgAllowAsyncCopyUploads' => true,
+		) );
 		wfSetupSession();
 
 		if ( wfLocalFile( 'UploadFromUrlTest.png' )->exists() ) {
@@ -30,6 +30,7 @@ class UploadFromUrlTest extends ApiTestCase {
 		$module->execute();
 
 		wfSetupSession( $sessionId );
+
 		return array( $module->getResultData(), $req );
 	}
 
@@ -174,7 +175,6 @@ class UploadFromUrlTest extends ApiTestCase {
 
 		$this->user->addGroup( 'users' );
 
-
 		$data = $this->doAsyncUpload( $token );
 
 		$this->assertEquals( $data[0]['upload']['result'], 'Warning' );
@@ -235,7 +235,7 @@ class UploadFromUrlTest extends ApiTestCase {
 
 		$this->assertFalse( (bool)$talk->getArticleID( Title::GAID_FOR_UPDATE ), 'User talk does not exist' );
 
-		$data = $this->doApiRequest( array(
+		$this->doApiRequest( array(
 			'action' => 'upload',
 			'filename' => 'UploadFromUrlTest.png',
 			'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
@@ -259,7 +259,7 @@ class UploadFromUrlTest extends ApiTestCase {
 
 		$exception = false;
 		try {
-			$data = $this->doApiRequest( array(
+			$this->doApiRequest( array(
 				'action' => 'upload',
 				'filename' => 'UploadFromUrlTest.png',
 				'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
@@ -277,7 +277,6 @@ class UploadFromUrlTest extends ApiTestCase {
 		$this->assertFalse( $job );
 
 		return;
-
 		/*
 		// Broken until using leavemessage with ignorewarnings is supported
 		$job->run();
@@ -330,7 +329,6 @@ class UploadFromUrlTest extends ApiTestCase {
 		return $data;
 	}
 
-
 	/**
 	 *
 	 */
diff --git a/tests/phpunit/includes/upload/UploadStashTest.php b/tests/phpunit/includes/upload/UploadStashTest.php
index 8fcaa214..7a0fea48 100644
--- a/tests/phpunit/includes/upload/UploadStashTest.php
+++ b/tests/phpunit/includes/upload/UploadStashTest.php
@@ -44,8 +44,7 @@ class UploadStashTest extends MediaWikiTestCase {
 	}
 
 	public function testBug29408() {
-		global $wgUser;
-		$wgUser = self::$users['uploader']->user;
+		$this->setMwGlobals( 'wgUser', self::$users['uploader']->user );
 
 		$repo = RepoGroup::singleton()->getLocalRepo();
 		$stash = new UploadStash( $repo );
diff --git a/tests/phpunit/includes/upload/UploadTest.php b/tests/phpunit/includes/upload/UploadTest.php
deleted file mode 100644
index b809d320..00000000
--- a/tests/phpunit/includes/upload/UploadTest.php
+++ /dev/null
@@ -1,144 +0,0 @@
-<?php
-/**
- * @group Upload
- */
-class UploadTest extends MediaWikiTestCase {
-	protected $upload;
-
-
-	protected function setUp() {
-		global $wgHooks;
-		parent::setUp();
-
-		$this->upload = new UploadTestHandler;
-		$this->hooks = $wgHooks;
-		$wgHooks['InterwikiLoadPrefix'][] = function ( $prefix, &$data ) {
-			return false;
-		};
-	}
-
-	protected function tearDown() {
-		global $wgHooks;
-		$wgHooks = $this->hooks;
-
-		parent::tearDown();
-	}
-
-
-	/**
-	 * First checks the return code
-	 * of UploadBase::getTitle() and then the actual returned title
-	 *
-	 * @dataProvider provideTestTitleValidation
-	 */
-	public function testTitleValidation( $srcFilename, $dstFilename, $code, $msg ) {
-		/* Check the result code */
-		$this->assertEquals( $code,
-			$this->upload->testTitleValidation( $srcFilename ),
-			"$msg code" );
-
-		/* If we expect a valid title, check the title itself. */
-		if ( $code == UploadBase::OK ) {
-			$this->assertEquals( $dstFilename,
-				$this->upload->getTitle()->getText(),
-				"$msg text" );
-		}
-	}
-
-	/**
-	 * Test various forms of valid and invalid titles that can be supplied.
-	 */
-	public static function provideTestTitleValidation() {
-		return array(
-			/* Test a valid title */
-			array( 'ValidTitle.jpg', 'ValidTitle.jpg', UploadBase::OK,
-				'upload valid title' ),
-			/* A title with a slash */
-			array( 'A/B.jpg', 'B.jpg', UploadBase::OK,
-				'upload title with slash' ),
-			/* A title with illegal char */
-			array( 'A:B.jpg', 'A-B.jpg', UploadBase::OK,
-				'upload title with colon' ),
-			/* Stripping leading File: prefix */
-			array( 'File:C.jpg', 'C.jpg', UploadBase::OK,
-				'upload title with File prefix' ),
-			/* Test illegal suggested title (r94601) */
-			array( '%281%29.JPG', null, UploadBase::ILLEGAL_FILENAME,
-				'illegal title for upload' ),
-			/* A title without extension */
-			array( 'A', null, UploadBase::FILETYPE_MISSING,
-				'upload title without extension' ),
-			/* A title with no basename */
-			array( '.jpg', null, UploadBase::MIN_LENGTH_PARTNAME,
-				'upload title without basename' ),
-			/* A title that is longer than 255 bytes */
-			array( str_repeat( 'a', 255 ) . '.jpg', null, UploadBase::FILENAME_TOO_LONG,
-				'upload title longer than 255 bytes' ),
-			/* A title that is longer than 240 bytes */
-			array( str_repeat( 'a', 240 ) . '.jpg', null, UploadBase::FILENAME_TOO_LONG,
-				'upload title longer than 240 bytes' ),
-		);
-	}
-
-	/**
-	 * Test the upload verification functions
-	 */
-	public function testVerifyUpload() {
-		/* Setup with zero file size */
-		$this->upload->initializePathInfo( '', '', 0 );
-		$result = $this->upload->verifyUpload();
-		$this->assertEquals( UploadBase::EMPTY_FILE,
-			$result['status'],
-			'upload empty file' );
-	}
-
-	// Helper used to create an empty file of size $size.
-	private function createFileOfSize( $size ) {
-		$filename = tempnam( wfTempDir(), "mwuploadtest" );
-
-		$fh = fopen( $filename, 'w' );
-		ftruncate( $fh, $size );
-		fclose( $fh );
-
-		return $filename;
-	}
-
-	/**
-	 * test uploading a 100 bytes file with $wgMaxUploadSize = 100
-	 *
-	 * This method should be abstracted so we can test different settings.
-	 */
-
-	public function testMaxUploadSize() {
-		global $wgMaxUploadSize;
-		$savedGlobal = $wgMaxUploadSize; // save global
-		global $wgFileExtensions;
-		$wgFileExtensions[] = 'txt';
-
-		$wgMaxUploadSize = 100;
-
-		$filename = $this->createFileOfSize( $wgMaxUploadSize );
-		$this->upload->initializePathInfo( basename( $filename ) . '.txt', $filename, 100 );
-		$result = $this->upload->verifyUpload();
-		unlink( $filename );
-
-		$this->assertEquals(
-			array( 'status' => UploadBase::OK ), $result );
-
-		$wgMaxUploadSize = $savedGlobal; // restore global
-	}
-}
-
-class UploadTestHandler extends UploadBase {
-	public function initializeFromRequest( &$request ) {}
-
-	public function testTitleValidation( $name ) {
-		$this->mTitle = false;
-		$this->mDesiredDestName = $name;
-		$this->mTitleError = UploadBase::OK;
-		$this->getTitle();
-		return $this->mTitleError;
-	}
-
-
-}
diff --git a/tests/phpunit/install-phpunit.sh b/tests/phpunit/install-phpunit.sh
index 36012748..1f602935 100644
--- a/tests/phpunit/install-phpunit.sh
+++ b/tests/phpunit/install-phpunit.sh
@@ -8,7 +8,7 @@ has_binary () {
 }
 
 if [ `id -u` -ne 0 ]; then
-    echo '*** ERROR' Must be root to run
+    echo '*** ERROR: Must be root to run'
     exit 1
 fi
 
diff --git a/tests/phpunit/languages/LanguageAmTest.php b/tests/phpunit/languages/LanguageAmTest.php
index 9723e1e3..a644f5e0 100644
--- a/tests/phpunit/languages/LanguageAmTest.php
+++ b/tests/phpunit/languages/LanguageAmTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/LanguageAm.php */
 class LanguageAmTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providePlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 0 ),
 			array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageArTest.php b/tests/phpunit/languages/LanguageArTest.php
index 523ee7f6..7b48f236 100644
--- a/tests/phpunit/languages/LanguageArTest.php
+++ b/tests/phpunit/languages/LanguageArTest.php
@@ -6,8 +6,11 @@
 
 /** Tests for MediaWiki languages/LanguageAr.php */
 class LanguageArTest extends LanguageClassesTestCase {
-
-	function testFormatNum() {
+	/**
+	 * @covers Language::formatNum
+	 * @todo split into a test and a dataprovider
+	 */
+	public function testFormatNum() {
 		$this->assertEquals( '١٬٢٣٤٬٥٦٧', $this->getLang()->formatNum( '1234567' ) );
 		$this->assertEquals( '-١٢٫٨٩', $this->getLang()->formatNum( -12.89 ) );
 	}
@@ -15,12 +18,13 @@ class LanguageArTest extends LanguageClassesTestCase {
 	/**
 	 * Mostly to test the raw ascii feature.
 	 * @dataProvider providerSprintfDate
+	 * @covers Language::sprintfDate
 	 */
-	function testSprintfDate( $format, $date, $expected ) {
+	public function testSprintfDate( $format, $date, $expected ) {
 		$this->assertEquals( $expected, $this->getLang()->sprintfDate( $format, $date ) );
 	}
 
-	function providerSprintfDate() {
+	public static function providerSprintfDate() {
 		return array(
 			array(
 				'xg "vs" g',
@@ -45,13 +49,24 @@ class LanguageArTest extends LanguageClassesTestCase {
 		);
 	}
 
-	/** @dataProvider providePlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'zero', 0 ),
 			array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageBeTest.php b/tests/phpunit/languages/LanguageBeTest.php
index 0144941b..7bd586af 100644
--- a/tests/phpunit/languages/LanguageBeTest.php
+++ b/tests/phpunit/languages/LanguageBeTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/LanguageBe.php */
 class LanguageBeTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providePlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'few', 'many', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 1 ),
 			array( 'many', 11 ),
diff --git a/tests/phpunit/languages/LanguageBe_taraskTest.php b/tests/phpunit/languages/LanguageBe_taraskTest.php
index 5b246d8e..d5822f4a 100644
--- a/tests/phpunit/languages/LanguageBe_taraskTest.php
+++ b/tests/phpunit/languages/LanguageBe_taraskTest.php
@@ -1,20 +1,22 @@
 <?php
 
 class LanguageBe_taraskTest extends LanguageClassesTestCase {
-
 	/**
 	 * Make sure the language code we are given is indeed
 	 * be-tarask. This is to ensure LanguageClassesTestCase
 	 * does not give us the wrong language.
 	 */
-	function testBeTaraskTestsUsesBeTaraskCode() {
+	public function testBeTaraskTestsUsesBeTaraskCode() {
 		$this->assertEquals( 'be-tarask',
 			$this->getLang()->getCode()
 		);
 	}
 
-	/** see bug 23156 & r64981 */
-	function testSearchRightSingleQuotationMarkAsApostroph() {
+	/**
+	 * @see bug 23156 & r64981
+	 * @covers Language::commafy
+	 */
+	public function testSearchRightSingleQuotationMarkAsApostroph() {
 		$this->assertEquals(
 			"'",
 			$this->getLang()->normalizeForSearch( '’' ),
@@ -22,24 +24,41 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
 		);
 	}
 
-	/** see bug 23156 & r64981 */
-	function testCommafy() {
+	/**
+	 * @see bug 23156 & r64981
+	 * @covers Language::commafy
+	 */
+	public function testCommafy() {
 		$this->assertEquals( '1,234,567', $this->getLang()->commafy( '1234567' ) );
 		$this->assertEquals( '12,345', $this->getLang()->commafy( '12345' ) );
 	}
 
-	/** see bug 23156 & r64981 */
-	function testDoesNotCommafyFourDigitsNumber() {
+	/**
+	 * @see bug 23156 & r64981
+	 * @covers Language::commafy
+	 */
+	public function testDoesNotCommafyFourDigitsNumber() {
 		$this->assertEquals( '1234', $this->getLang()->commafy( '1234' ) );
 	}
 
-	/** @dataProvider providePluralFourForms */
-	function testPluralFourForms( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'few', 'many', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePluralFourForms() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 1 ),
 			array( 'many', 11 ),
@@ -55,19 +74,21 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
 		);
 	}
 
-	/** @dataProvider providePluralTwoForms */
-	function testPluralTwoForms( $result, $value ) {
-		$forms = array( 'one', 'several' );
+	/**
+	 * @dataProvider providePluralTwoForms
+	 * @covers Language::convertPlural
+	 */
+	public function testPluralTwoForms( $result, $value ) {
+		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePluralTwoForms() {
+	public static function providePluralTwoForms() {
 		return array(
 			array( 'one', 1 ),
-			array( 'several', 11 ),
-			array( 'several', 91 ),
-			array( 'several', 121 ),
+			array( 'other', 11 ),
+			array( 'other', 91 ),
+			array( 'other', 121 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageBhoTest.php b/tests/phpunit/languages/LanguageBhoTest.php
index c364917d..187bfbbc 100644
--- a/tests/phpunit/languages/LanguageBhoTest.php
+++ b/tests/phpunit/languages/LanguageBhoTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/LanguageBho.php */
 class LanguageBhoTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providePlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 0 ),
 			array( 'one', 1 ),
@@ -22,5 +32,4 @@ class LanguageBhoTest extends LanguageClassesTestCase {
 			array( 'other', 200 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageBsTest.php b/tests/phpunit/languages/LanguageBsTest.php
index 76d00704..fb965b89 100644
--- a/tests/phpunit/languages/LanguageBsTest.php
+++ b/tests/phpunit/languages/LanguageBsTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/LanguageBs.php */
 class LanguageBsTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providePlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'few', 'many', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'many', 0 ),
 			array( 'one', 1 ),
@@ -29,5 +39,4 @@ class LanguageBsTest extends LanguageClassesTestCase {
 			array( 'many', 200 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageClassesTestCase.php b/tests/phpunit/languages/LanguageClassesTestCase.php
index 6659dad1..632e037f 100644
--- a/tests/phpunit/languages/LanguageClassesTestCase.php
+++ b/tests/phpunit/languages/LanguageClassesTestCase.php
@@ -3,16 +3,7 @@
  * Helping class to run tests using a clean language instance.
  *
  * This is intended for the MediaWiki language class tests under
- * tests/phpunit/languages. You simply need to extends this test
- * and set it up with a language code using setUpBeforeClass:
- *
- * @par Setting up a language:
- * @code
- * class LanguageFooTest extends LanguageClassesTestCase {
- *   public static function setUpBeforeClass() {
- *     self::setLang( 'Foo' );
- *   }
- * @endcode
+ * tests/phpunit/languages.
  *
  * Before each tests, a new language object is build which you
  * can retrieve in your test using the $this->getLang() method:
@@ -28,19 +19,6 @@
  * @endcode
  */
 abstract class LanguageClassesTestCase extends MediaWikiTestCase {
-
-	/**
-	 * Regex used to find out the language code out of the class name
-	 * used by setUpBeforeClass
-	 */
-	private static $reExtractLangFromClass = '/Language(.*)Test/';
-
-	/**
-	 * Hold the language code we are going to use. This is extracted
-	 * directly from the extending class.
-	 */
-	private static $LanguageClassCode;
-
 	/**
 	 * Internal language object
 	 *
@@ -57,9 +35,19 @@ abstract class LanguageClassesTestCase extends MediaWikiTestCase {
 	 */
 	private $languageObject;
 
-	public static function setUpBeforeClass() {
-		$found = preg_match( self::$reExtractLangFromClass,
-			get_called_class(), $m );
+	/**
+	 * @return Language
+	 */
+	protected function getLang() {
+		return $this->languageObject;
+	}
+
+	/**
+	 * Create a new language object before each test.
+	 */
+	protected function setUp() {
+		parent::setUp();
+		$found = preg_match( '/Language(.+)Test/', get_called_class(), $m );
 		if ( $found ) {
 			# Normalize language code since classes uses underscores
 			$m[1] = str_replace( '_', '-', $m[1] );
@@ -71,21 +59,8 @@ abstract class LanguageClassesTestCase extends MediaWikiTestCase {
 					. "out of " . get_called_class() . " failling back to 'en'\n"
 			);
 		}
-		// TODO: validate $m[1] which should be a valid language code
-		self::$LanguageClassCode = $m[1];
-	}
-
-	protected function getLang() {
-		return $this->languageObject;
-	}
-
-	/**
-	 * Create a new language object before each test.
-	 */
-	protected function setUp() {
-		parent::setUp();
-		$this->languageObject = Language::factory(
-			self::$LanguageClassCode );
+		// @todo validate $m[1] which should be a valid language code
+		$this->languageObject = Language::factory( $m[1] );
 	}
 
 	/**
@@ -96,5 +71,4 @@ abstract class LanguageClassesTestCase extends MediaWikiTestCase {
 		unset( $this->languageObject );
 		parent::tearDown();
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageCsTest.php b/tests/phpunit/languages/LanguageCsTest.php
index 884a129e..da9e6b88 100644
--- a/tests/phpunit/languages/LanguageCsTest.php
+++ b/tests/phpunit/languages/LanguageCsTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/Languagecs.php */
 class LanguageCsTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'few', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
@@ -28,5 +38,4 @@ class LanguageCsTest extends LanguageClassesTestCase {
 			array( 'other', 200 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageCuTest.php b/tests/phpunit/languages/LanguageCuTest.php
index e2394b35..07193172 100644
--- a/tests/phpunit/languages/LanguageCuTest.php
+++ b/tests/phpunit/languages/LanguageCuTest.php
@@ -7,27 +7,36 @@
 
 /** Tests for MediaWiki languages/LanguageCu.php */
 class LanguageCuTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
-		$forms = array( 'one', 'few', 'many', 'other' );
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
+		$forms = array( 'one', 'two', 'few', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
-			array( 'few', 2 ),
-			array( 'many', 3 ),
-			array( 'many', 4 ),
+			array( 'two', 2 ),
+			array( 'few', 3 ),
+			array( 'few', 4 ),
 			array( 'other', 5 ),
 			array( 'one', 11 ),
 			array( 'other', 20 ),
-			array( 'few', 22 ),
-			array( 'many', 223 ),
+			array( 'two', 22 ),
+			array( 'few', 223 ),
 			array( 'other', 200 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageCyTest.php b/tests/phpunit/languages/LanguageCyTest.php
index 2a7f4a92..eaf663a8 100644
--- a/tests/phpunit/languages/LanguageCyTest.php
+++ b/tests/phpunit/languages/LanguageCyTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageCy.php */
 class LanguageCyTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'zero', 0 ),
 			array( 'one', 1 ),
@@ -30,5 +40,4 @@ class LanguageCyTest extends LanguageClassesTestCase {
 			array( 'other', 200.00 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageDsbTest.php b/tests/phpunit/languages/LanguageDsbTest.php
index 285ce648..94c11bcc 100644
--- a/tests/phpunit/languages/LanguageDsbTest.php
+++ b/tests/phpunit/languages/LanguageDsbTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageDsb.php */
 class LanguageDsbTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providePlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'two', 'few', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
@@ -28,5 +38,4 @@ class LanguageDsbTest extends LanguageClassesTestCase {
 			array( 'other', 555 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageFrTest.php b/tests/phpunit/languages/LanguageFrTest.php
index faf0de58..46b65011 100644
--- a/tests/phpunit/languages/LanguageFrTest.php
+++ b/tests/phpunit/languages/LanguageFrTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageFr.php */
 class LanguageFrTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providePlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 0 ),
 			array( 'one', 1 ),
@@ -22,5 +32,4 @@ class LanguageFrTest extends LanguageClassesTestCase {
 			array( 'other', 200 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageGaTest.php b/tests/phpunit/languages/LanguageGaTest.php
index 2dbb088b..c009f56b 100644
--- a/tests/phpunit/languages/LanguageGaTest.php
+++ b/tests/phpunit/languages/LanguageGaTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageGa.php */
 class LanguageGaTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'two', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
@@ -22,5 +32,4 @@ class LanguageGaTest extends LanguageClassesTestCase {
 			array( 'other', 200 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageGdTest.php b/tests/phpunit/languages/LanguageGdTest.php
index 5de1e9d2..0b2612b2 100644
--- a/tests/phpunit/languages/LanguageGdTest.php
+++ b/tests/phpunit/languages/LanguageGdTest.php
@@ -7,15 +7,17 @@
 
 /** Tests for MediaWiki languages/classes/LanguageGd.php */
 class LanguageGdTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providerPlural
+	 * @covers Language::convertPlural
+	*/
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'two', 'few', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
-		return array (
+	public static function providerPlural() {
+		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
 			array( 'two', 2 ),
@@ -27,22 +29,25 @@ class LanguageGdTest extends LanguageClassesTestCase {
 		);
 	}
 
-	/** @dataProvider providerPluralExplicit */
-	function testExplicitPlural( $result, $value ) {
+	/**
+	 * @dataProvider providerPluralExplicit
+	 * @covers Language::convertPlural
+	 */
+	public function testExplicitPlural( $result, $value ) {
 		$forms = array( 'one', 'two', 'few', 'other', '11=Form11', '12=Form12' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPluralExplicit() {
-		return array (
-				array( 'other', 0 ),
-				array( 'one', 1 ),
-				array( 'two', 2 ),
-				array( 'Form11', 11 ),
-				array( 'Form12', 12 ),
-				array( 'few', 3 ),
-				array( 'few', 19 ),
-				array( 'other', 200 ),
+	public static function providerPluralExplicit() {
+		return array(
+			array( 'other', 0 ),
+			array( 'one', 1 ),
+			array( 'two', 2 ),
+			array( 'Form11', 11 ),
+			array( 'Form12', 12 ),
+			array( 'few', 3 ),
+			array( 'few', 19 ),
+			array( 'other', 200 ),
 		);
 	}
 }
diff --git a/tests/phpunit/languages/LanguageGvTest.php b/tests/phpunit/languages/LanguageGvTest.php
index 4126e071..a0def628 100644
--- a/tests/phpunit/languages/LanguageGvTest.php
+++ b/tests/phpunit/languages/LanguageGvTest.php
@@ -7,15 +7,27 @@
 
 /** Tests for MediaWiki languages/classes/LanguageGv.php */
 class LanguageGvTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		// This is not compatible with CLDR plural rules http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#gv
+		// What does this mean? Is there a hard-coded override for gv somewhere? -Ryan Kaldari 2013-01-28
 		$forms = array( 'Form 1', 'Form 2', 'Form 3', 'Form 4' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->markTestSkipped( "This test won't work since convertPlural for gv doesn't seem to actually follow our plural rules." );
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'Form 4', 0 ),
 			array( 'Form 2', 1 ),
@@ -28,5 +40,4 @@ class LanguageGvTest extends LanguageClassesTestCase {
 			array( 'Form 4', 50 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageHeTest.php b/tests/phpunit/languages/LanguageHeTest.php
index 6de88e59..8edc6ddf 100644
--- a/tests/phpunit/languages/LanguageHeTest.php
+++ b/tests/phpunit/languages/LanguageHeTest.php
@@ -7,70 +7,125 @@
 
 /** Tests for MediaWiki languages/classes/LanguageHe.php */
 class LanguageHeTest extends LanguageClassesTestCase {
+	/**
+	 * The most common usage for the plural forms is two forms,
+	 * for singular and plural. In this case, the second form
+	 * is technically dual, but in practice it's used as plural.
+	 * In some cases, usually with expressions of time, three forms
+	 * are needed - singular, dual and plural.
+	 * CLDR also specifies a fourth form for multiples of 10,
+	 * which is very rare. It also has a mistake, because
+	 * the number 10 itself is supposed to be just plural,
+	 * so currently it's overridden in MediaWiki.
+	*/
 
-	/** @dataProvider providerPluralDual */
-	function testPluralDual( $result, $value ) {
+	// @todo the below test*PluralForms test methods can be refactored
+	//  to use a single test method and data provider..
+
+	/**
+	 * @dataProvider provideTwoPluralForms
+	 * @covers Language::convertPlural
+	 */
+	public function testTwoPluralForms( $result, $value ) {
+		$forms = array( 'one', 'other' );
+		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+	}
+
+	/**
+	 * @dataProvider provideThreePluralForms
+	 * @covers Language::convertPlural
+	 */
+	public function testThreePluralForms( $result, $value ) {
 		$forms = array( 'one', 'two', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPluralDual() {
+	/**
+	 * @dataProvider provideFourPluralForms
+	 * @covers Language::convertPlural
+	 */
+	public function testFourPluralForms( $result, $value ) {
+		$forms = array( 'one', 'two', 'many', 'other' );
+		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+	}
+
+	/**
+	 * @dataProvider provideFourPluralForms
+	 * @covers Language::convertPlural
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function provideTwoPluralForms() {
 		return array(
-			array( 'other', 0 ), // Zero -> plural
+			array( 'other', 0 ), // Zero - plural
 			array( 'one', 1 ), // Singular
-			array( 'two', 2 ), // Dual
-			array( 'other', 3 ), // Plural
+			array( 'other', 2 ), // No third form provided, use it as plural
+			array( 'other', 3 ), // Plural - other
+			array( 'other', 10 ), // No fourth form provided, use it as plural
+			array( 'other', 20 ), // No fourth form provided, use it as plural
 		);
 	}
 
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
-		$forms = array( 'one', 'other' );
-		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+	public static function provideThreePluralForms() {
+		return array(
+			array( 'other', 0 ), // Zero - plural
+			array( 'one', 1 ), // Singular
+			array( 'two', 2 ), // Dual
+			array( 'other', 3 ), // Plural - other
+			array( 'other', 10 ), // No fourth form provided, use it as plural
+			array( 'other', 20 ), // No fourth form provided, use it as plural
+		);
 	}
 
-	function providerPlural() {
+	public static function provideFourPluralForms() {
 		return array(
-			array( 'other', 0 ), // Zero -> plural
+			array( 'other', 0 ), // Zero - plural
 			array( 'one', 1 ), // Singular
-			array( 'other', 2 ), // Plural, no dual provided
-			array( 'other', 3 ), // Plural
+			array( 'two', 2 ), // Dual
+			array( 'other', 3 ), // Plural - other
+			array( 'other', 10 ), // 10 is supposed to be plural (other), not "many"
+			array( 'many', 20 ), // Fourth form provided - rare, but supported by CLDR
 		);
 	}
 
-	/** @dataProvider providerGrammar */
-	function testGrammar( $result, $word, $case ) {
+	/**
+	 * @dataProvider provideGrammar
+	 * @covers Language::convertGrammar
+	 */
+	public function testGrammar( $result, $word, $case ) {
 		$this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
 	}
 
 	// The comments in the beginning of the line help avoid RTL problems
 	// with text editors.
-	function providerGrammar() {
+	public static function provideGrammar() {
 		return array(
 			array(
-				/* result */ 'וויקיפדיה',
-				/* word   */ 'ויקיפדיה',
-				/* case   */ 'תחילית',
+				/* result */'וויקיפדיה',
+				/* word   */'ויקיפדיה',
+				/* case   */'תחילית',
 			),
 			array(
-				/* result */ 'וולפגנג',
-				/* word   */ 'וולפגנג',
-				/* case   */ 'prefixed',
+				/* result */'וולפגנג',
+				/* word   */'וולפגנג',
+				/* case   */'prefixed',
 			),
 			array(
-				/* result */ 'קובץ',
-				/* word   */ 'הקובץ',
-				/* case   */ 'תחילית',
+				/* result */'קובץ',
+				/* word   */'הקובץ',
+				/* case   */'תחילית',
 			),
 			array(
-				/* result */ '־Wikipedia',
-				/* word   */ 'Wikipedia',
-				/* case   */ 'תחילית',
+				/* result */'־Wikipedia',
+				/* word   */'Wikipedia',
+				/* case   */'תחילית',
 			),
 			array(
-				/* result */ '־1995',
-				/* word   */ '1995',
-				/* case   */ 'תחילית',
+				/* result */'־1995',
+				/* word   */'1995',
+				/* case   */'תחילית',
 			),
 		);
 	}
diff --git a/tests/phpunit/languages/LanguageHiTest.php b/tests/phpunit/languages/LanguageHiTest.php
index 86d6af58..f6d2c9e9 100644
--- a/tests/phpunit/languages/LanguageHiTest.php
+++ b/tests/phpunit/languages/LanguageHiTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/LanguageHi.php */
 class LanguageHiTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providePlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 0 ),
 			array( 'one', 1 ),
@@ -22,5 +32,4 @@ class LanguageHiTest extends LanguageClassesTestCase {
 			array( 'other', 200 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageHrTest.php b/tests/phpunit/languages/LanguageHrTest.php
index 9dce4ea7..6ce4aff9 100644
--- a/tests/phpunit/languages/LanguageHrTest.php
+++ b/tests/phpunit/languages/LanguageHrTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageHr.php */
 class LanguageHrTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'few', 'many', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'many', 0 ),
 			array( 'one', 1 ),
@@ -29,5 +39,4 @@ class LanguageHrTest extends LanguageClassesTestCase {
 			array( 'many', 200 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageHsbTest.php b/tests/phpunit/languages/LanguageHsbTest.php
index bec7d819..f95a43bf 100644
--- a/tests/phpunit/languages/LanguageHsbTest.php
+++ b/tests/phpunit/languages/LanguageHsbTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageHsb.php */
 class LanguageHsbTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providePlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'two', 'few', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
@@ -28,5 +38,4 @@ class LanguageHsbTest extends LanguageClassesTestCase {
 			array( 'other', 555 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageHuTest.php b/tests/phpunit/languages/LanguageHuTest.php
index 23d8e0ce..ee9197d7 100644
--- a/tests/phpunit/languages/LanguageHuTest.php
+++ b/tests/phpunit/languages/LanguageHuTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/LanguageHu.php */
 class LanguageHuTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providePlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
@@ -22,5 +32,4 @@ class LanguageHuTest extends LanguageClassesTestCase {
 			array( 'other', 200 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageHyTest.php b/tests/phpunit/languages/LanguageHyTest.php
index 7088d37b..896522b0 100644
--- a/tests/phpunit/languages/LanguageHyTest.php
+++ b/tests/phpunit/languages/LanguageHyTest.php
@@ -7,14 +7,25 @@
 
 /** Tests for MediaWiki languages/LanguageHy.php */
 class LanguageHyTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		// This fails for 0, but I'm not sure why. Some voodoo going on here.
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
@@ -22,5 +33,4 @@ class LanguageHyTest extends LanguageClassesTestCase {
 			array( 'other', 200 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageKshTest.php b/tests/phpunit/languages/LanguageKshTest.php
index 9b4a53ad..568a3780 100644
--- a/tests/phpunit/languages/LanguageKshTest.php
+++ b/tests/phpunit/languages/LanguageKshTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageKsh.php */
 class LanguageKshTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'other', 'zero' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'zero', 0 ),
 			array( 'one', 1 ),
@@ -22,5 +32,4 @@ class LanguageKshTest extends LanguageClassesTestCase {
 			array( 'other', 200 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageLnTest.php b/tests/phpunit/languages/LanguageLnTest.php
index 669d8b0a..10b3234f 100644
--- a/tests/phpunit/languages/LanguageLnTest.php
+++ b/tests/phpunit/languages/LanguageLnTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageLn.php */
 class LanguageLnTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providePlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 0 ),
 			array( 'one', 1 ),
@@ -22,5 +32,4 @@ class LanguageLnTest extends LanguageClassesTestCase {
 			array( 'other', 200 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageLtTest.php b/tests/phpunit/languages/LanguageLtTest.php
index 9d6428b8..30642f62 100644
--- a/tests/phpunit/languages/LanguageLtTest.php
+++ b/tests/phpunit/languages/LanguageLtTest.php
@@ -7,20 +7,24 @@
 
 /** Tests for MediaWiki languages/LanguageLt.php */
 class LanguageLtTest extends LanguageClassesTestCase {
-
-	/** @dataProvider provideOneFewOtherCases */
-	function testOneFewOtherPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'few', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	/** @dataProvider provideOneFewCases */
-	function testOneFewPlural( $result, $value ) {
-		$forms = array( 'one', 'few' );
-		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
 	}
 
-	function provideOneFewOtherCases() {
+	public static function providePlural() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
@@ -36,10 +40,24 @@ class LanguageLtTest extends LanguageClassesTestCase {
 		);
 	}
 
-	function provideOneFewCases() {
+	/**
+	 * @dataProvider providePluralTwoForms
+	 * @covers Language::convertPlural
+	 */
+	public function testOneFewPlural( $result, $value ) {
+		$forms = array( 'one', 'other' );
+		// This fails for 21, but not sure why.
+		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+	}
+
+	public static function providePluralTwoForms() {
 		return array(
 			array( 'one', 1 ),
-			array( 'few', 15 ),
+			array( 'other', 2 ),
+			array( 'other', 15 ),
+			array( 'other', 20 ),
+			array( 'one', 21 ),
+			array( 'other', 22 ),
 		);
 	}
 }
diff --git a/tests/phpunit/languages/LanguageLvTest.php b/tests/phpunit/languages/LanguageLvTest.php
index bd0c759b..c4d8a6f0 100644
--- a/tests/phpunit/languages/LanguageLvTest.php
+++ b/tests/phpunit/languages/LanguageLvTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageLv.php */
 class LanguageLvTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'zero', 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'zero', 0 ),
 			array( 'one', 1 ),
@@ -27,5 +37,4 @@ class LanguageLvTest extends LanguageClassesTestCase {
 			array( 'other', 200 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageMgTest.php b/tests/phpunit/languages/LanguageMgTest.php
index c1e516bc..65e8fd7b 100644
--- a/tests/phpunit/languages/LanguageMgTest.php
+++ b/tests/phpunit/languages/LanguageMgTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMg.php */
 class LanguageMgTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providePlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 0 ),
 			array( 'one', 1 ),
@@ -23,5 +33,4 @@ class LanguageMgTest extends LanguageClassesTestCase {
 			array( 'other', 123.3434 ),
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageMkTest.php b/tests/phpunit/languages/LanguageMkTest.php
index 5c241ba7..7d47b375 100644
--- a/tests/phpunit/languages/LanguageMkTest.php
+++ b/tests/phpunit/languages/LanguageMkTest.php
@@ -7,27 +7,34 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMk.php */
 class LanguageMkTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
 
-	function providerPlural() {
+	public static function providePlural() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
 			array( 'other', 11 ),
 			array( 'one', 21 ),
-			array( 'other', 411 ),
+			array( 'one', 411 ),
 			array( 'other', 12.345 ),
 			array( 'other', 20 ),
 			array( 'one', 31 ),
 			array( 'other', 200 ),
 		);
 	}
-
-
 }
diff --git a/tests/phpunit/languages/LanguageMlTest.php b/tests/phpunit/languages/LanguageMlTest.php
index 396114d9..4fa45ce3 100644
--- a/tests/phpunit/languages/LanguageMlTest.php
+++ b/tests/phpunit/languages/LanguageMlTest.php
@@ -8,13 +8,16 @@
 /** Tests for MediaWiki languages/LanguageMl.php */
 class LanguageMlTest extends LanguageClassesTestCase {
 
-	/** see bug 29495 */
-	/** @dataProvider providerFormatNum */
-	function testFormatNum( $result, $value ) {
+	/**
+	 * @dataProvider providerFormatNum
+	 * @see bug 29495
+	 * @covers Language::formatNum
+	 */
+	public function testFormatNum( $result, $value ) {
 		$this->assertEquals( $result, $this->getLang()->formatNum( $value ) );
 	}
 
-	function providerFormatNum() {
+	public static function providerFormatNum() {
 		return array(
 			array( '12,34,567', '1234567' ),
 			array( '12,345', '12345' ),
diff --git a/tests/phpunit/languages/LanguageMoTest.php b/tests/phpunit/languages/LanguageMoTest.php
index f7da1cd6..e0e54ca8 100644
--- a/tests/phpunit/languages/LanguageMoTest.php
+++ b/tests/phpunit/languages/LanguageMoTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMo.php */
 class LanguageMoTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'few', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'few', 0 ),
 			array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageMtTest.php b/tests/phpunit/languages/LanguageMtTest.php
index f2b881e7..96d2bc92 100644
--- a/tests/phpunit/languages/LanguageMtTest.php
+++ b/tests/phpunit/languages/LanguageMtTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMt.php */
 class LanguageMtTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPluralAllForms */
-	function testPluralAllForms( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'few', 'many', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPluralAllForms() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'few', 0 ),
 			array( 'one', 1 ),
@@ -35,30 +45,33 @@ class LanguageMtTest extends LanguageClassesTestCase {
 		);
 	}
 
-	/** @dataProvider providerPluralTwoForms */
-	function testPluralTwoForms( $result, $value ) {
-		$forms = array( 'one', 'many' );
+	/**
+	 * @dataProvider providePluralTwoForms
+	 * @covers Language::convertPlural
+	 */
+	public function testPluralTwoForms( $result, $value ) {
+		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPluralTwoForms() {
+	public static function providePluralTwoForms() {
 		return array(
-			array( 'many', 0 ),
+			array( 'other', 0 ),
 			array( 'one', 1 ),
-			array( 'many', 2 ),
-			array( 'many', 10 ),
-			array( 'many', 11 ),
-			array( 'many', 19 ),
-			array( 'many', 20 ),
-			array( 'many', 99 ),
-			array( 'many', 100 ),
-			array( 'many', 101 ),
-			array( 'many', 102 ),
-			array( 'many', 110 ),
-			array( 'many', 111 ),
-			array( 'many', 119 ),
-			array( 'many', 120 ),
-			array( 'many', 201 ),
+			array( 'other', 2 ),
+			array( 'other', 10 ),
+			array( 'other', 11 ),
+			array( 'other', 19 ),
+			array( 'other', 20 ),
+			array( 'other', 99 ),
+			array( 'other', 100 ),
+			array( 'other', 101 ),
+			array( 'other', 102 ),
+			array( 'other', 110 ),
+			array( 'other', 111 ),
+			array( 'other', 119 ),
+			array( 'other', 120 ),
+			array( 'other', 201 ),
 		);
 	}
 }
diff --git a/tests/phpunit/languages/LanguageNlTest.php b/tests/phpunit/languages/LanguageNlTest.php
index f783f2c0..26bd691a 100644
--- a/tests/phpunit/languages/LanguageNlTest.php
+++ b/tests/phpunit/languages/LanguageNlTest.php
@@ -8,7 +8,11 @@
 /** Tests for MediaWiki languages/LanguageNl.php */
 class LanguageNlTest extends LanguageClassesTestCase {
 
-	function testFormatNum() {
+	/**
+	 * @covers Language::formatNum
+	 * @todo split into a test and a dataprovider
+	 */
+	public function testFormatNum() {
 		$this->assertEquals( '1.234.567', $this->getLang()->formatNum( '1234567' ) );
 		$this->assertEquals( '12.345', $this->getLang()->formatNum( '12345' ) );
 		$this->assertEquals( '1', $this->getLang()->formatNum( '1' ) );
diff --git a/tests/phpunit/languages/LanguageNsoTest.php b/tests/phpunit/languages/LanguageNsoTest.php
index 9d80d138..18efd736 100644
--- a/tests/phpunit/languages/LanguageNsoTest.php
+++ b/tests/phpunit/languages/LanguageNsoTest.php
@@ -7,18 +7,28 @@
 
 /** Tests for MediaWiki languages/classes/LanguageNso.php */
 class LanguageNsoTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
-		$forms = array( 'one', 'many' );
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
+		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 0 ),
 			array( 'one', 1 ),
-			array( 'many', 2 ),
+			array( 'other', 2 ),
 		);
 	}
 }
diff --git a/tests/phpunit/languages/LanguagePlTest.php b/tests/phpunit/languages/LanguagePlTest.php
index 1e36097b..d180037b 100644
--- a/tests/phpunit/languages/LanguagePlTest.php
+++ b/tests/phpunit/languages/LanguagePlTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguagePl.php */
 class LanguagePlTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPluralFourForms */
-	function testPluralFourForms( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'few', 'many' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPluralFourForms() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'many', 0 ),
 			array( 'one', 1 ),
@@ -35,30 +45,33 @@ class LanguagePlTest extends LanguageClassesTestCase {
 		);
 	}
 
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
-		$forms = array( 'one', 'many' );
+	/**
+	 * @dataProvider providePluralTwoForms
+	 * @covers Language::convertPlural
+	 */
+	public function testPluralTwoForms( $result, $value ) {
+		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	public static function providePluralTwoForms() {
 		return array(
-			array( 'many', 0 ),
+			array( 'other', 0 ),
 			array( 'one', 1 ),
-			array( 'many', 2 ),
-			array( 'many', 3 ),
-			array( 'many', 4 ),
-			array( 'many', 5 ),
-			array( 'many', 9 ),
-			array( 'many', 10 ),
-			array( 'many', 11 ),
-			array( 'many', 21 ),
-			array( 'many', 22 ),
-			array( 'many', 23 ),
-			array( 'many', 24 ),
-			array( 'many', 25 ),
-			array( 'many', 200 ),
-			array( 'many', 201 ),
+			array( 'other', 2 ),
+			array( 'other', 3 ),
+			array( 'other', 4 ),
+			array( 'other', 5 ),
+			array( 'other', 9 ),
+			array( 'other', 10 ),
+			array( 'other', 11 ),
+			array( 'other', 21 ),
+			array( 'other', 22 ),
+			array( 'other', 23 ),
+			array( 'other', 24 ),
+			array( 'other', 25 ),
+			array( 'other', 200 ),
+			array( 'other', 201 ),
 		);
 	}
 }
diff --git a/tests/phpunit/languages/LanguageRoTest.php b/tests/phpunit/languages/LanguageRoTest.php
index 916ea45d..ae7816bc 100644
--- a/tests/phpunit/languages/LanguageRoTest.php
+++ b/tests/phpunit/languages/LanguageRoTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageRo.php */
 class LanguageRoTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'few', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'few', 0 ),
 			array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageRuTest.php b/tests/phpunit/languages/LanguageRuTest.php
index 0792f75b..e938be79 100644
--- a/tests/phpunit/languages/LanguageRuTest.php
+++ b/tests/phpunit/languages/LanguageRuTest.php
@@ -8,14 +8,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageRu.php */
 class LanguageRuTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providePluralFourForms */
-	function testPluralFourForms( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'few', 'many', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePluralFourForms() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 1 ),
 			array( 'many', 11 ),
@@ -31,27 +41,33 @@ class LanguageRuTest extends LanguageClassesTestCase {
 		);
 	}
 
-	/** @dataProvider providePluralTwoForms */
-	function testPluralTwoForms( $result, $value ) {
-		$forms = array( 'one', 'several' );
+	/**
+	 * @dataProvider providePluralTwoForms
+	 * @covers Language::convertPlural
+	 */
+	public function testPluralTwoForms( $result, $value ) {
+		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePluralTwoForms() {
+	public static function providePluralTwoForms() {
 		return array(
 			array( 'one', 1 ),
-			array( 'several', 11 ),
-			array( 'several', 91 ),
-			array( 'several', 121 ),
+			array( 'other', 11 ),
+			array( 'other', 91 ),
+			array( 'other', 121 ),
 		);
 	}
 
-	/** @dataProvider providerGrammar */
-	function testGrammar( $result, $word, $case ) {
+	/**
+	 * @dataProvider providerGrammar
+	 * @covers Language::convertGrammar
+	 */
+	public function testGrammar( $result, $word, $case ) {
 		$this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
 	}
 
-	function providerGrammar() {
+	public static function providerGrammar() {
 		return array(
 			array(
 				'Википедии',
diff --git a/tests/phpunit/languages/LanguageSeTest.php b/tests/phpunit/languages/LanguageSeTest.php
index c7dd8020..533aa2bc 100644
--- a/tests/phpunit/languages/LanguageSeTest.php
+++ b/tests/phpunit/languages/LanguageSeTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSe.php */
 class LanguageSeTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPluralThreeForms */
-	function testPluralThreeForms( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'two', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPluralThreeForms() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
@@ -23,13 +33,16 @@ class LanguageSeTest extends LanguageClassesTestCase {
 		);
 	}
 
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePluralTwoForms
+	 * @covers Language::convertPlural
+	 */
+	public function testPluralTwoForms( $result, $value ) {
 		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	public static function providePluralTwoForms() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageSgsTest.php b/tests/phpunit/languages/LanguageSgsTest.php
index 95e63462..bf6a14b1 100644
--- a/tests/phpunit/languages/LanguageSgsTest.php
+++ b/tests/phpunit/languages/LanguageSgsTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSgs.php */
 class LanguageSgsTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providePluralAllForms */
-	function testPluralAllForms( $result, $value ) {
+	/**
+	 * @dataProvider providePluralAllForms
+	 * @covers Language::convertPlural
+	 */
+	public function testPluralAllForms( $result, $value ) {
 		$forms = array( 'one', 'two', 'few', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePluralAllForms() {
+	/**
+	 * @dataProvider providePluralAllForms
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePluralAllForms() {
 		return array(
 			array( 'few', 0 ),
 			array( 'one', 1 ),
@@ -32,13 +42,16 @@ class LanguageSgsTest extends LanguageClassesTestCase {
 		);
 	}
 
-	/** @dataProvider providePluralTwoForms */
-	function testPluralTwoForms( $result, $value ) {
+	/**
+	 * @dataProvider providePluralTwoForms
+	 * @covers Language::convertPlural
+	 */
+	public function testPluralTwoForms( $result, $value ) {
 		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePluralTwoForms() {
+	public static function providePluralTwoForms() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageShTest.php b/tests/phpunit/languages/LanguageShTest.php
index 282fd2f2..6d2e25a6 100644
--- a/tests/phpunit/languages/LanguageShTest.php
+++ b/tests/phpunit/languages/LanguageShTest.php
@@ -7,18 +7,36 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSh.php */
 class LanguageShTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
-		$forms = array( 'one', 'many' );
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
+		$forms = array( 'one', 'few', 'many', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'many', 0 ),
 			array( 'one', 1 ),
-			array( 'many', 2 ),
+			array( 'few', 2 ),
+			array( 'few', 4 ),
+			array( 'many', 5 ),
+			array( 'many', 10 ),
+			array( 'many', 11 ),
+			array( 'many', 12 ),
+			array( 'one', 101 ),
+			array( 'few', 102 ),
+			array( 'many', 111 ),
 		);
 	}
 }
diff --git a/tests/phpunit/languages/LanguageSkTest.php b/tests/phpunit/languages/LanguageSkTest.php
index 89cbbf01..cb8a13b8 100644
--- a/tests/phpunit/languages/LanguageSkTest.php
+++ b/tests/phpunit/languages/LanguageSkTest.php
@@ -8,14 +8,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSk.php */
 class LanguageSkTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'few', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageSlTest.php b/tests/phpunit/languages/LanguageSlTest.php
index 075e6af3..9783dd80 100644
--- a/tests/phpunit/languages/LanguageSlTest.php
+++ b/tests/phpunit/languages/LanguageSlTest.php
@@ -8,16 +8,26 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSl.php */
 class LanguageSlTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
-		$forms = array( 'one', 'two', 'few', 'other', 'zero' );
+	/**
+	 * @dataProvider providerPlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
+		$forms = array( 'one', 'two', 'few', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providerPlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providerPlural() {
 		return array(
-			array( 'zero', 0 ),
+			array( 'other', 0 ),
 			array( 'one', 1 ),
 			array( 'two', 2 ),
 			array( 'few', 3 ),
diff --git a/tests/phpunit/languages/LanguageSmaTest.php b/tests/phpunit/languages/LanguageSmaTest.php
index 6d655219..95cb333c 100644
--- a/tests/phpunit/languages/LanguageSmaTest.php
+++ b/tests/phpunit/languages/LanguageSmaTest.php
@@ -7,14 +7,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSma.php */
 class LanguageSmaTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPluralThreeForms */
-	function testPluralThreeForms( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'two', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPluralThreeForms() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
@@ -23,13 +33,16 @@ class LanguageSmaTest extends LanguageClassesTestCase {
 		);
 	}
 
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
+	/**
+	 * @dataProvider providePluralTwoForms
+	 * @covers Language::convertPlural
+	 */
+	public function testPluralTwoForms( $result, $value ) {
 		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	public static function providePluralTwoForms() {
 		return array(
 			array( 'other', 0 ),
 			array( 'one', 1 ),
diff --git a/tests/phpunit/languages/LanguageSrTest.php b/tests/phpunit/languages/LanguageSrTest.php
index 5611030b..ab4d4aba 100644
--- a/tests/phpunit/languages/LanguageSrTest.php
+++ b/tests/phpunit/languages/LanguageSrTest.php
@@ -10,16 +10,18 @@
  * @author Antoine Musso <hashar at free dot fr>
  * @copyright Copyright © 2011, Antoine Musso <hashar at free dot fr>
  * @file
+ *
+ * @todo methods in test class should be tidied:
+ *  - Should be split into separate test methods and data providers
+ *  - Tests for LanguageConverter and Language should probably be separate..
  */
 
-require_once dirname( __DIR__ ) . '/bootstrap.php';
-
 /** Tests for MediaWiki languages/LanguageSr.php */
 class LanguageSrTest extends LanguageClassesTestCase {
-
-	##### TESTS #######################################################
-
-	function testEasyConversions() {
+	/**
+	 * @covers LanguageConverter::convertTo
+	 */
+	public function testEasyConversions() {
 		$this->assertCyrillic(
 			'шђчћжШЂЧЋЖ',
 			'Cyrillic guessing characters'
@@ -30,7 +32,10 @@ class LanguageSrTest extends LanguageClassesTestCase {
 		);
 	}
 
-	function testMixedConversions() {
+	/**
+	 * @covers LanguageConverter::convertTo
+	 */
+	public function testMixedConversions() {
 		$this->assertCyrillic(
 			'шђчћжШЂЧЋЖ - šđčćž',
 			'Mostly cyrillic characters'
@@ -41,7 +46,10 @@ class LanguageSrTest extends LanguageClassesTestCase {
 		);
 	}
 
-	function testSameAmountOfLatinAndCyrillicGetConverted() {
+	/**
+	 * @covers LanguageConverter::convertTo
+	 */
+	public function testSameAmountOfLatinAndCyrillicGetConverted() {
 		$this->assertConverted(
 			'4 latin: šđčć | 4 cyrillic: шђчћ',
 			'sr-ec'
@@ -54,8 +62,9 @@ class LanguageSrTest extends LanguageClassesTestCase {
 
 	/**
 	 * @author Nikola Smolenski
+	 * @covers LanguageConverter::convertTo
 	 */
-	function testConversionToCyrillic() {
+	public function testConversionToCyrillic() {
 		//A simple convertion of Latin to Cyrillic
 		$this->assertEquals( 'абвг',
 			$this->convertToCyrillic( 'abvg' )
@@ -94,7 +103,10 @@ class LanguageSrTest extends LanguageClassesTestCase {
 		);
 	}
 
-	function testConversionToLatin() {
+	/**
+	 * @covers LanguageConverter::convertTo
+	 */
+	public function testConversionToLatin() {
 		//A simple convertion of Latin to Latin
 		$this->assertEquals( 'abcd',
 			$this->convertToLatin( 'abcd' )
@@ -113,13 +125,24 @@ class LanguageSrTest extends LanguageClassesTestCase {
 		);
 	}
 
-	/** @dataProvider providePluralFourForms */
-	function testPluralFourForms( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'few', 'many', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePluralFourForms() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 1 ),
 			array( 'many', 11 ),
@@ -135,18 +158,21 @@ class LanguageSrTest extends LanguageClassesTestCase {
 		);
 	}
 
-	/** @dataProvider providePluralTwoForms */
-	function testPluralTwoForms( $result, $value ) {
-		$forms = array( 'one', 'several' );
+	/**
+	 * @dataProvider providePluralTwoForms
+	 * @covers Language::convertPlural
+	 */
+	public function testPluralTwoForms( $result, $value ) {
+		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePluralTwoForms() {
+	public static function providePluralTwoForms() {
 		return array(
 			array( 'one', 1 ),
-			array( 'several', 11 ),
-			array( 'several', 91 ),
-			array( 'several', 121 ),
+			array( 'other', 11 ),
+			array( 'other', 91 ),
+			array( 'other', 121 ),
 		);
 	}
 
@@ -157,7 +183,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
 	 * @param $variant string Language variant 'sr-ec' or 'sr-el'
 	 * @param $msg string Optional message
 	 */
-	function assertUnConverted( $text, $variant, $msg = '' ) {
+	protected function assertUnConverted( $text, $variant, $msg = '' ) {
 		$this->assertEquals(
 			$text,
 			$this->convertTo( $text, $variant ),
@@ -171,7 +197,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
 	 * @param $variant string Language variant 'sr-ec' or 'sr-el'
 	 * @param $msg string Optional message
 	 */
-	function assertConverted( $text, $variant, $msg = '' ) {
+	protected function assertConverted( $text, $variant, $msg = '' ) {
 		$this->assertNotEquals(
 			$text,
 			$this->convertTo( $text, $variant ),
@@ -184,7 +210,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
 	 * using the cyrillic variant and converted to Latin when using
 	 * the Latin variant.
 	 */
-	function assertCyrillic( $text, $msg = '' ) {
+	protected function assertCyrillic( $text, $msg = '' ) {
 		$this->assertUnConverted( $text, 'sr-ec', $msg );
 		$this->assertConverted( $text, 'sr-el', $msg );
 	}
@@ -194,26 +220,26 @@ class LanguageSrTest extends LanguageClassesTestCase {
 	 * using the Latin variant and converted to Cyrillic when using
 	 * the Cyrillic variant.
 	 */
-	function assertLatin( $text, $msg = '' ) {
+	protected function assertLatin( $text, $msg = '' ) {
 		$this->assertUnConverted( $text, 'sr-el', $msg );
 		$this->assertConverted( $text, 'sr-ec', $msg );
 	}
 
 
 	/** Wrapper for converter::convertTo() method*/
-	function convertTo( $text, $variant ) {
+	protected function convertTo( $text, $variant ) {
 		return $this->getLang()
 			->mConverter
 			->convertTo(
-			$text, $variant
-		);
+				$text, $variant
+			);
 	}
 
-	function convertToCyrillic( $text ) {
+	protected function convertToCyrillic( $text ) {
 		return $this->convertTo( $text, 'sr-ec' );
 	}
 
-	function convertToLatin( $text ) {
+	protected function convertToLatin( $text ) {
 		return $this->convertTo( $text, 'sr-el' );
 	}
 }
diff --git a/tests/phpunit/languages/LanguageTest.php b/tests/phpunit/languages/LanguageTest.php
index 76471445..78929e23 100644
--- a/tests/phpunit/languages/LanguageTest.php
+++ b/tests/phpunit/languages/LanguageTest.php
@@ -1,8 +1,11 @@
 <?php
 
 class LanguageTest extends LanguageClassesTestCase {
-
-	function testLanguageConvertDoubleWidthToSingleWidth() {
+	/**
+	 * @covers Language::convertDoubleWidth
+	 * @covers Language::normalizeForSearch
+	 */
+	public function testLanguageConvertDoubleWidthToSingleWidth() {
 		$this->assertEquals(
 			"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
 			$this->getLang()->normalizeForSearch(
@@ -13,13 +16,14 @@ class LanguageTest extends LanguageClassesTestCase {
 	}
 
 	/**
-	 * @dataProvider provideFormattableTimes
+	 * @dataProvider provideFormattableTimes#
+	 * @covers Language::formatTimePeriod
 	 */
-	function testFormatTimePeriod( $seconds, $format, $expected, $desc ) {
+	public function testFormatTimePeriod( $seconds, $format, $expected, $desc ) {
 		$this->assertEquals( $expected, $this->getLang()->formatTimePeriod( $seconds, $format ), $desc );
 	}
 
-	function provideFormattableTimes() {
+	public static function provideFormattableTimes() {
 		return array(
 			array(
 				9.45,
@@ -202,10 +206,12 @@ class LanguageTest extends LanguageClassesTestCase {
 				'formatTimePeriod() rounding, recursion, (>48h)'
 			),
 		);
-
 	}
 
-	function testTruncate() {
+	/**
+	 * @covers Language::truncate
+	 */
+	public function testTruncate() {
 		$this->assertEquals(
 			"XXX",
 			$this->getLang()->truncate( "1234567890", 0, 'XXX' ),
@@ -238,9 +244,10 @@ class LanguageTest extends LanguageClassesTestCase {
 	}
 
 	/**
-	 * @dataProvider provideHTMLTruncateData()
+	 * @dataProvider provideHTMLTruncateData
+	 * @covers Language::truncateHTML
 	 */
-	function testTruncateHtml( $len, $ellipsis, $input, $expected ) {
+	public function testTruncateHtml( $len, $ellipsis, $input, $expected ) {
 		// Actual HTML...
 		$this->assertEquals(
 			$expected,
@@ -249,9 +256,9 @@ class LanguageTest extends LanguageClassesTestCase {
 	}
 
 	/**
-	 * Array format is ($len, $ellipsis, $input, $expected)
+	 * @return array format is ($len, $ellipsis, $input, $expected)
 	 */
-	function provideHTMLTruncateData() {
+	public static function provideHTMLTruncateData() {
 		return array(
 			array( 0, 'XXX', "1234567890", "XXX" ),
 			array( 8, 'XXX', "1234567890", "12345XXX" ),
@@ -310,8 +317,9 @@ class LanguageTest extends LanguageClassesTestCase {
 	/**
 	 * Test Language::isWellFormedLanguageTag()
 	 * @dataProvider provideWellFormedLanguageTags
+	 * @covers Language::isWellFormedLanguageTag
 	 */
-	function testWellFormedLanguageTag( $code, $message = '' ) {
+	public function testWellFormedLanguageTag( $code, $message = '' ) {
 		$this->assertTrue(
 			Language::isWellFormedLanguageTag( $code ),
 			"validating code $code $message"
@@ -324,7 +332,7 @@ class LanguageTest extends LanguageClassesTestCase {
 	 * and distributed as free software, under the GNU General Public Licence.
 	 * http://www.bortzmeyer.org/gabuzomeu-parsing-language-tags.html
 	 */
-	function provideWellFormedLanguageTags() {
+	public static function provideWellFormedLanguageTags() {
 		return array(
 			array( 'fr', 'two-letter code' ),
 			array( 'fr-latn', 'two-letter code with lower case script code' ),
@@ -361,8 +369,9 @@ class LanguageTest extends LanguageClassesTestCase {
 	/**
 	 * Negative test for Language::isWellFormedLanguageTag()
 	 * @dataProvider provideMalformedLanguageTags
+	 * @covers Language::isWellFormedLanguageTag
 	 */
-	function testMalformedLanguageTag( $code, $message = '' ) {
+	public function testMalformedLanguageTag( $code, $message = '' ) {
 		$this->assertFalse(
 			Language::isWellFormedLanguageTag( $code ),
 			"validating that code $code is a malformed language tag - $message"
@@ -375,7 +384,7 @@ class LanguageTest extends LanguageClassesTestCase {
 	 * and distributed as free software, under the GNU General Public Licence.
 	 * http://www.bortzmeyer.org/gabuzomeu-parsing-language-tags.html
 	 */
-	function provideMalformedLanguageTags() {
+	public static function provideMalformedLanguageTags() {
 		return array(
 			array( 'f', 'language too short' ),
 			array( 'f-Latn', 'language too short with script' ),
@@ -411,8 +420,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
 	/**
 	 * Negative test for Language::isWellFormedLanguageTag()
+	 * @covers Language::isWellFormedLanguageTag
 	 */
-	function testLenientLanguageTag() {
+	public function testLenientLanguageTag() {
 		$this->assertTrue(
 			Language::isWellFormedLanguageTag( 'pa_guru', true ),
 			'pa_guru is a well-formed language tag in lenient mode'
@@ -422,22 +432,26 @@ class LanguageTest extends LanguageClassesTestCase {
 	/**
 	 * Test Language::isValidBuiltInCode()
 	 * @dataProvider provideLanguageCodes
+	 * @covers Language::isValidBuiltInCode
 	 */
-	function testBuiltInCodeValidation( $code, $message = '' ) {
+	public function testBuiltInCodeValidation( $code, $message = '' ) {
 		$this->assertTrue(
 			(bool)Language::isValidBuiltInCode( $code ),
 			"validating code $code $message"
 		);
 	}
 
-	function testBuiltInCodeValidationRejectUnderscore() {
+	/**
+	 * @covers Language::isValidBuiltInCode
+	 */
+	public function testBuiltInCodeValidationRejectUnderscore() {
 		$this->assertFalse(
 			(bool)Language::isValidBuiltInCode( 'be_tarask' ),
 			"reject underscore in language code"
 		);
 	}
 
-	function provideLanguageCodes() {
+	public static function provideLanguageCodes() {
 		return array(
 			array( 'fr', 'Two letters, minor case' ),
 			array( 'EN', 'Two letters, upper case' ),
@@ -452,15 +466,16 @@ class LanguageTest extends LanguageClassesTestCase {
 	/**
 	 * Test Language::isKnownLanguageTag()
 	 * @dataProvider provideKnownLanguageTags
+	 * @covers Language::isKnownLanguageTag
 	 */
-	function testKnownLanguageTag( $code, $message = '' ) {
+	public function testKnownLanguageTag( $code, $message = '' ) {
 		$this->assertTrue(
 			(bool)Language::isKnownLanguageTag( $code ),
 			"validating code $code - $message"
 		);
 	}
 
-	function provideKnownLanguageTags() {
+	public static function provideKnownLanguageTags() {
 		return array(
 			array( 'fr', 'simple code' ),
 			array( 'bat-smg', 'an MW legacy tag' ),
@@ -469,9 +484,9 @@ class LanguageTest extends LanguageClassesTestCase {
 	}
 
 	/**
-	 * Test Language::isKnownLanguageTag()
+	 * @covers Language::isKnownLanguageTag
 	 */
-	function testKnownCldrLanguageTag() {
+	public function testKnownCldrLanguageTag() {
 		if ( !class_exists( 'LanguageNames' ) ) {
 			$this->markTestSkipped( 'The LanguageNames class is not available. The cldr extension is probably not installed.' );
 		}
@@ -485,24 +500,54 @@ class LanguageTest extends LanguageClassesTestCase {
 	/**
 	 * Negative tests for Language::isKnownLanguageTag()
 	 * @dataProvider provideUnKnownLanguageTags
+	 * @covers Language::isKnownLanguageTag
 	 */
-	function testUnknownLanguageTag( $code, $message = '' ) {
+	public function testUnknownLanguageTag( $code, $message = '' ) {
 		$this->assertFalse(
 			(bool)Language::isKnownLanguageTag( $code ),
 			"checking that code $code is invalid - $message"
 		);
 	}
 
-	function provideUnknownLanguageTags() {
+	public static function provideUnknownLanguageTags() {
 		return array(
 			array( 'mw', 'non-existent two-letter code' ),
+			array( 'foo"<bar', 'very invalid language code' ),
 		);
 	}
 
+	/**
+	 * Test too short timestamp
+	 * @expectedException MWException
+	 * @covers Language::sprintfDate
+	 */
+	public function testSprintfDateTooShortTimestamp() {
+		$this->getLang()->sprintfDate( 'xiY', '1234567890123' );
+	}
+
+	/**
+	 * Test too long timestamp
+	 * @expectedException MWException
+	 * @covers Language::sprintfDate
+	 */
+	public function testSprintfDateTooLongTimestamp() {
+		$this->getLang()->sprintfDate( 'xiY', '123456789012345' );
+	}
+
+	/**
+	 * Test too short timestamp
+	 * @expectedException MWException
+	 * @covers Language::sprintfDate
+	 */
+	public function testSprintfDateNotAllDigitTimestamp() {
+		$this->getLang()->sprintfDate( 'xiY', '-1234567890123' );
+	}
+
 	/**
 	 * @dataProvider provideSprintfDateSamples
+	 * @covers Language::sprintfDate
 	 */
-	function testSprintfDate( $format, $ts, $expected, $msg ) {
+	public function testSprintfDate( $format, $ts, $expected, $msg ) {
 		$this->assertEquals(
 			$expected,
 			$this->getLang()->sprintfDate( $format, $ts ),
@@ -511,10 +556,11 @@ class LanguageTest extends LanguageClassesTestCase {
 	}
 
 	/**
-	 * bug 33454. sprintfDate should always use UTC.
+	 * sprintfDate should always use UTC when no zone is given.
 	 * @dataProvider provideSprintfDateSamples
+	 * @covers Language::sprintfDate
 	 */
-	function testSprintfDateTZ( $format, $ts, $expected, $msg ) {
+	public function testSprintfDateNoZone( $format, $ts, $expected, $ignore, $msg ) {
 		$oldTZ = date_default_timezone_get();
 		$res = date_default_timezone_set( 'Asia/Seoul' );
 		if ( !$res ) {
@@ -530,42 +576,66 @@ class LanguageTest extends LanguageClassesTestCase {
 		date_default_timezone_set( $oldTZ );
 	}
 
-	function provideSprintfDateSamples() {
+	/**
+	 * sprintfDate should use passed timezone
+	 * @dataProvider provideSprintfDateSamples
+	 * @covers Language::sprintfDate
+	 */
+	public function testSprintfDateTZ( $format, $ts, $ignore, $expected, $msg ) {
+		$tz = new DateTimeZone( 'Asia/Seoul' );
+		if ( !$tz ) {
+			$this->markTestSkipped( "Error getting Timezone" );
+		}
+
+		$this->assertEquals(
+			$expected,
+			$this->getLang()->sprintfDate( $format, $ts, $tz ),
+			"sprintfDate('$format', '$ts', 'Asia/Seoul'): $msg"
+		);
+	}
+
+	public static function provideSprintfDateSamples() {
 		return array(
 			array(
 				'xiY',
 				'20111212000000',
 				'1390', // note because we're testing English locale we get Latin-standard digits
+				'1390',
 				'Iranian calendar full year'
 			),
 			array(
 				'xiy',
 				'20111212000000',
 				'90',
+				'90',
 				'Iranian calendar short year'
 			),
 			array(
 				'o',
 				'20120101235000',
 				'2011',
+				'2011',
 				'ISO 8601 (week) year'
 			),
 			array(
 				'W',
 				'20120101235000',
 				'52',
+				'52',
 				'Week number'
 			),
 			array(
 				'W',
 				'20120102235000',
 				'1',
+				'1',
 				'Week number'
 			),
 			array(
 				'o-\\WW-N',
 				'20091231235000',
 				'2009-W53-4',
+				'2009-W53-4',
 				'leap week'
 			),
 			// What follows is mostly copied from http://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time
@@ -573,252 +643,336 @@ class LanguageTest extends LanguageClassesTestCase {
 				'Y',
 				'20120102090705',
 				'2012',
+				'2012',
 				'Full year'
 			),
 			array(
 				'y',
 				'20120102090705',
 				'12',
+				'12',
 				'2 digit year'
 			),
 			array(
 				'L',
 				'20120102090705',
 				'1',
+				'1',
 				'Leap year'
 			),
 			array(
 				'n',
 				'20120102090705',
 				'1',
+				'1',
 				'Month index, not zero pad'
 			),
 			array(
 				'N',
 				'20120102090705',
 				'01',
+				'01',
 				'Month index. Zero pad'
 			),
 			array(
 				'M',
 				'20120102090705',
 				'Jan',
+				'Jan',
 				'Month abbrev'
 			),
 			array(
 				'F',
 				'20120102090705',
 				'January',
+				'January',
 				'Full month'
 			),
 			array(
 				'xg',
 				'20120102090705',
 				'January',
+				'January',
 				'Genitive month name (same in EN)'
 			),
 			array(
 				'j',
 				'20120102090705',
 				'2',
+				'2',
 				'Day of month (not zero pad)'
 			),
 			array(
 				'd',
 				'20120102090705',
 				'02',
+				'02',
 				'Day of month (zero-pad)'
 			),
 			array(
 				'z',
 				'20120102090705',
 				'1',
+				'1',
 				'Day of year (zero-indexed)'
 			),
 			array(
 				'D',
 				'20120102090705',
 				'Mon',
+				'Mon',
 				'Day of week (abbrev)'
 			),
 			array(
 				'l',
 				'20120102090705',
 				'Monday',
+				'Monday',
 				'Full day of week'
 			),
 			array(
 				'N',
 				'20120101090705',
 				'7',
+				'7',
 				'Day of week (Mon=1, Sun=7)'
 			),
 			array(
 				'w',
 				'20120101090705',
 				'0',
+				'0',
 				'Day of week (Sun=0, Sat=6)'
 			),
 			array(
 				'N',
 				'20120102090705',
 				'1',
+				'1',
 				'Day of week'
 			),
 			array(
 				'a',
 				'20120102090705',
 				'am',
+				'am',
 				'am vs pm'
 			),
 			array(
 				'A',
 				'20120102120000',
 				'PM',
+				'PM',
 				'AM vs PM'
 			),
 			array(
 				'a',
 				'20120102000000',
 				'am',
+				'am',
 				'AM vs PM'
 			),
 			array(
 				'g',
 				'20120102090705',
 				'9',
+				'9',
 				'12 hour, not Zero'
 			),
 			array(
 				'h',
 				'20120102090705',
 				'09',
+				'09',
 				'12 hour, zero padded'
 			),
 			array(
 				'G',
 				'20120102090705',
 				'9',
+				'9',
 				'24 hour, not zero'
 			),
 			array(
 				'H',
 				'20120102090705',
 				'09',
+				'09',
 				'24 hour, zero'
 			),
 			array(
 				'H',
 				'20120102110705',
 				'11',
+				'11',
 				'24 hour, zero'
 			),
 			array(
 				'i',
 				'20120102090705',
 				'07',
+				'07',
 				'Minutes'
 			),
 			array(
 				's',
 				'20120102090705',
 				'05',
+				'05',
 				'seconds'
 			),
 			array(
 				'U',
 				'20120102090705',
 				'1325495225',
+				'1325462825',
 				'unix time'
 			),
 			array(
 				't',
 				'20120102090705',
 				'31',
+				'31',
 				'Days in current month'
 			),
 			array(
 				'c',
 				'20120102090705',
 				'2012-01-02T09:07:05+00:00',
+				'2012-01-02T09:07:05+09:00',
 				'ISO 8601 timestamp'
 			),
 			array(
 				'r',
 				'20120102090705',
 				'Mon, 02 Jan 2012 09:07:05 +0000',
+				'Mon, 02 Jan 2012 09:07:05 +0900',
 				'RFC 5322'
 			),
+			array(
+				'e',
+				'20120102090705',
+				'UTC',
+				'Asia/Seoul',
+				'Timezone identifier'
+			),
+			array(
+				'I',
+				'19880602090705',
+				'0',
+				'1',
+				'DST indicator'
+			),
+			array(
+				'O',
+				'20120102090705',
+				'+0000',
+				'+0900',
+				'Timezone offset'
+			),
+			array(
+				'P',
+				'20120102090705',
+				'+00:00',
+				'+09:00',
+				'Timezone offset with colon'
+			),
+			array(
+				'T',
+				'20120102090705',
+				'UTC',
+				'KST',
+				'Timezone abbreviation'
+			),
+			array(
+				'Z',
+				'20120102090705',
+				'0',
+				'32400',
+				'Timezone offset in seconds'
+			),
 			array(
 				'xmj xmF xmn xmY',
 				'20120102090705',
 				'7 Safar 2 1433',
+				'7 Safar 2 1433',
 				'Islamic'
 			),
 			array(
 				'xij xiF xin xiY',
 				'20120102090705',
 				'12 Dey 10 1390',
+				'12 Dey 10 1390',
 				'Iranian'
 			),
 			array(
 				'xjj xjF xjn xjY',
 				'20120102090705',
 				'7 Tevet 4 5772',
+				'7 Tevet 4 5772',
 				'Hebrew'
 			),
 			array(
 				'xjt',
 				'20120102090705',
 				'29',
+				'29',
 				'Hebrew number of days in month'
 			),
 			array(
 				'xjx',
 				'20120102090705',
 				'Tevet',
+				'Tevet',
 				'Hebrew genitive month name (No difference in EN)'
 			),
 			array(
 				'xkY',
 				'20120102090705',
 				'2555',
+				'2555',
 				'Thai year'
 			),
 			array(
 				'xoY',
 				'20120102090705',
 				'101',
+				'101',
 				'Minguo'
 			),
 			array(
 				'xtY',
 				'20120102090705',
 				'平成24',
+				'平成24',
 				'nengo'
 			),
 			array(
 				'xrxkYY',
 				'20120102090705',
 				'MMDLV2012',
+				'MMDLV2012',
 				'Roman numerals'
 			),
 			array(
 				'xhxjYY',
 				'20120102090705',
 				'ה\'תשע"ב2012',
+				'ה\'תשע"ב2012',
 				'Hebrew numberals'
 			),
 			array(
 				'xnY',
 				'20120102090705',
 				'2012',
+				'2012',
 				'Raw numerals (doesn\'t mean much in EN)'
 			),
 			array(
 				'[[Y "(yea"\\r)]] \\"xx\\"',
 				'20120102090705',
 				'[[2012 (year)]] "x"',
+				'[[2012 (year)]] "x"',
 				'Various escaping'
 			),
 
@@ -827,8 +981,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
 	/**
 	 * @dataProvider provideFormatSizes
+	 * @covers Language::formatSize
 	 */
-	function testFormatSize( $size, $expected, $msg ) {
+	public function testFormatSize( $size, $expected, $msg ) {
 		$this->assertEquals(
 			$expected,
 			$this->getLang()->formatSize( $size ),
@@ -836,7 +991,7 @@ class LanguageTest extends LanguageClassesTestCase {
 		);
 	}
 
-	function provideFormatSizes() {
+	public static function provideFormatSizes() {
 		return array(
 			array(
 				0,
@@ -889,8 +1044,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
 	/**
 	 * @dataProvider provideFormatBitrate
+	 * @covers Language::formatBitrate
 	 */
-	function testFormatBitrate( $bps, $expected, $msg ) {
+	public function testFormatBitrate( $bps, $expected, $msg ) {
 		$this->assertEquals(
 			$expected,
 			$this->getLang()->formatBitrate( $bps ),
@@ -898,7 +1054,7 @@ class LanguageTest extends LanguageClassesTestCase {
 		);
 	}
 
-	function provideFormatBitrate() {
+	public static function provideFormatBitrate() {
 		return array(
 			array(
 				0,
@@ -961,8 +1117,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
 	/**
 	 * @dataProvider provideFormatDuration
+	 * @covers Language::formatDuration
 	 */
-	function testFormatDuration( $duration, $expected, $intervals = array() ) {
+	public function testFormatDuration( $duration, $expected, $intervals = array() ) {
 		$this->assertEquals(
 			$expected,
 			$this->getLang()->formatDuration( $duration, $intervals ),
@@ -970,7 +1127,7 @@ class LanguageTest extends LanguageClassesTestCase {
 		);
 	}
 
-	function provideFormatDuration() {
+	public static function provideFormatDuration() {
 		return array(
 			array(
 				0,
@@ -1097,8 +1254,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
 	/**
 	 * @dataProvider provideCheckTitleEncodingData
+	 * @covers Language::checkTitleEncoding
 	 */
-	function testCheckTitleEncoding( $s ) {
+	public function testCheckTitleEncoding( $s ) {
 		$this->assertEquals(
 			$s,
 			$this->getLang()->checkTitleEncoding( $s ),
@@ -1106,7 +1264,7 @@ class LanguageTest extends LanguageClassesTestCase {
 		);
 	}
 
-	function provideCheckTitleEncodingData() {
+	public static function provideCheckTitleEncodingData() {
 		return array(
 			array( "" ),
 			array( "United States of America" ), // 7bit ASCII
@@ -1161,8 +1319,9 @@ class LanguageTest extends LanguageClassesTestCase {
 
 	/**
 	 * @dataProvider provideRomanNumeralsData
+	 * @covers Language::romanNumeral
 	 */
-	function testRomanNumerals( $num, $numerals ) {
+	public function testRomanNumerals( $num, $numerals ) {
 		$this->assertEquals(
 			$numerals,
 			Language::romanNumeral( $num ),
@@ -1170,7 +1329,7 @@ class LanguageTest extends LanguageClassesTestCase {
 		);
 	}
 
-	function provideRomanNumeralsData() {
+	public static function provideRomanNumeralsData() {
 		return array(
 			array( 1, 'I' ),
 			array( 2, 'II' ),
@@ -1219,13 +1378,14 @@ class LanguageTest extends LanguageClassesTestCase {
 
 	/**
 	 * @dataProvider providePluralData
+	 * @covers Language::convertPlural
 	 */
-	function testConvertPlural( $expected, $number, $forms ) {
+	public function testConvertPlural( $expected, $number, $forms ) {
 		$chosen = $this->getLang()->convertPlural( $number, $forms );
 		$this->assertEquals( $expected, $chosen );
 	}
 
-	function providePluralData() {
+	public static function providePluralData() {
 		// Params are: [expected text, number given, [the plural forms]]
 		return array(
 			array( 'plural', 0, array(
@@ -1255,6 +1415,9 @@ class LanguageTest extends LanguageClassesTestCase {
 			array( 'other', 2, array(
 				'kissa=kala', '1=2=3', 'other',
 			) ),
+			array( '', 2, array(
+				'0=explicit zero', '1=explicit one',
+			) ),
 		);
 	}
 
@@ -1262,7 +1425,7 @@ class LanguageTest extends LanguageClassesTestCase {
 	 * @covers Language::translateBlockExpiry()
 	 * @dataProvider provideTranslateBlockExpiry
 	 */
-	function testTranslateBlockExpiry( $expectedData, $str, $desc ) {
+	public function testTranslateBlockExpiry( $expectedData, $str, $desc ) {
 		$lang = $this->getLang();
 		if ( is_array( $expectedData ) ) {
 			list( $func, $arg ) = $expectedData;
@@ -1273,7 +1436,7 @@ class LanguageTest extends LanguageClassesTestCase {
 		$this->assertEquals( $expected, $lang->translateBlockExpiry( $str ), $desc );
 	}
 
-	function provideTranslateBlockExpiry() {
+	public static function provideTranslateBlockExpiry() {
 		return array(
 			array( '2 hours', '2 hours', 'simple data from ipboptions' ),
 			array( 'indefinite', 'infinite', 'infinite from ipboptions' ),
@@ -1294,7 +1457,7 @@ class LanguageTest extends LanguageClassesTestCase {
 	 * @covers Language::commafy()
 	 * @dataProvider provideCommafyData
 	 */
-	function testCommafy( $number, $numbersWithCommas ) {
+	public function testCommafy( $number, $numbersWithCommas ) {
 		$this->assertEquals(
 			$numbersWithCommas,
 			$this->getLang()->commafy( $number ),
@@ -1302,7 +1465,7 @@ class LanguageTest extends LanguageClassesTestCase {
 		);
 	}
 
-	function provideCommafyData() {
+	public static function provideCommafyData() {
 		return array(
 			array( 1, '1' ),
 			array( 10, '10' ),
@@ -1321,7 +1484,10 @@ class LanguageTest extends LanguageClassesTestCase {
 		);
 	}
 
-	function testListToText() {
+	/**
+	 * @covers Language::listToText
+	 */
+	public function testListToText() {
 		$lang = $this->getLang();
 		$and = $lang->getMessageFromDB( 'and' );
 		$s = $lang->getMessageFromDB( 'word-separator' );
@@ -1336,12 +1502,13 @@ class LanguageTest extends LanguageClassesTestCase {
 
 	/**
 	 * @dataProvider provideIsSupportedLanguage
+	 * @covers Language::isSupportedLanguage
 	 */
-	function testIsSupportedLanguage( $code, $expected, $comment ) {
+	public function testIsSupportedLanguage( $code, $expected, $comment ) {
 		$this->assertEquals( $expected, Language::isSupportedLanguage( $code ), $comment );
 	}
 
-	static function provideIsSupportedLanguage() {
+	public static function provideIsSupportedLanguage() {
 		return array(
 			array( 'en', true, 'is supported language' ),
 			array( 'fi', true, 'is supported language' ),
@@ -1349,4 +1516,52 @@ class LanguageTest extends LanguageClassesTestCase {
 			array( 'FI', false, 'is not supported language, input should be in lower case' ),
 		);
 	}
+
+	/**
+	 * @dataProvider provideGetParentLanguage
+	 * @covers Language::getParentLanguage
+	 */
+	public function testGetParentLanguage( $code, $expected, $comment ) {
+		$lang = Language::factory( $code );
+		if ( is_null( $expected ) ) {
+			$this->assertNull( $lang->getParentLanguage(), $comment );
+		} else {
+			$this->assertEquals( $expected, $lang->getParentLanguage()->getCode(), $comment );
+		}
+	}
+
+	public static function provideGetParentLanguage() {
+		return array(
+			array( 'zh-cn', 'zh', 'zh is the parent language of zh-cn' ),
+			array( 'zh', 'zh', 'zh is defined as the parent language of zh, because zh converter can convert zh-cn to zh' ),
+			array( 'zh-invalid', null, 'do not be fooled by arbitrarily composed language codes' ),
+			array( 'en-gb', null, 'en does not have converter' ),
+			array( 'en', null, 'en does not have converter. Although FakeConverter handles en -> en conversion but it is useless' ),
+		);
+	}
+
+	/**
+	 * @dataProvider provideGetNamespaceAliases
+	 * @covers Language::getNamespaceAliases
+	 */
+	public function testGetNamespaceAliases( $languageCode, $subset ) {
+		$language = Language::factory( $languageCode );
+		$aliases = $language->getNamespaceAliases();
+		foreach ( $subset as $alias => $nsId ) {
+			$this->assertEquals( $nsId, $aliases[$alias] );
+		}
+	}
+
+	public static function provideGetNamespaceAliases() {
+		// TODO: Add tests for NS_PROJECT_TALK and GenderNamespaces
+		return array(
+			array(
+				'zh',
+				array(
+					'文件' => NS_FILE,
+					'檔案' => NS_FILE,
+				),
+			),
+		);
+	}
 }
diff --git a/tests/phpunit/languages/LanguageTiTest.php b/tests/phpunit/languages/LanguageTiTest.php
index 8af0eee2..e225af97 100644
--- a/tests/phpunit/languages/LanguageTiTest.php
+++ b/tests/phpunit/languages/LanguageTiTest.php
@@ -7,18 +7,28 @@
 
 /** Tests for MediaWiki languages/classes/LanguageTi.php */
 class LanguageTiTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
-		$forms = array( 'one', 'many' );
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
+		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 0 ),
 			array( 'one', 1 ),
-			array( 'many', 2 ),
+			array( 'other', 2 ),
 		);
 	}
 }
diff --git a/tests/phpunit/languages/LanguageTlTest.php b/tests/phpunit/languages/LanguageTlTest.php
index abd8581a..7ac51c69 100644
--- a/tests/phpunit/languages/LanguageTlTest.php
+++ b/tests/phpunit/languages/LanguageTlTest.php
@@ -7,18 +7,28 @@
 
 /** Tests for MediaWiki languages/classes/LanguageTl.php */
 class LanguageTlTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
-		$forms = array( 'one', 'many' );
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
+		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 0 ),
 			array( 'one', 1 ),
-			array( 'many', 2 ),
+			array( 'other', 2 ),
 		);
 	}
 }
diff --git a/tests/phpunit/languages/LanguageTrTest.php b/tests/phpunit/languages/LanguageTrTest.php
index e93d49d9..8fc2795c 100644
--- a/tests/phpunit/languages/LanguageTrTest.php
+++ b/tests/phpunit/languages/LanguageTrTest.php
@@ -17,7 +17,7 @@ class LanguageTrTest extends LanguageClassesTestCase {
 	 * @see http://en.wikipedia.org/wiki/Dotted_and_dotless_I
 	 * @dataProvider provideDottedAndDotlessI
 	 */
-	function testDottedAndDotlessI( $func, $input, $inputCase, $expected ) {
+	public function testDottedAndDotlessI( $func, $input, $inputCase, $expected ) {
 		if ( $func == 'ucfirst' ) {
 			$res = $this->getLang()->ucfirst( $input );
 		} elseif ( $func == 'lcfirst' ) {
@@ -31,7 +31,7 @@ class LanguageTrTest extends LanguageClassesTestCase {
 		$this->assertEquals( $expected, $res, $msg );
 	}
 
-	function provideDottedAndDotlessI() {
+	public static function provideDottedAndDotlessI() {
 		return array(
 			# function, input, input case, expected
 			# Case changed:
@@ -56,5 +56,4 @@ class LanguageTrTest extends LanguageClassesTestCase {
 
 		);
 	}
-
 }
diff --git a/tests/phpunit/languages/LanguageUkTest.php b/tests/phpunit/languages/LanguageUkTest.php
index 9bbfaf66..0783fcf6 100644
--- a/tests/phpunit/languages/LanguageUkTest.php
+++ b/tests/phpunit/languages/LanguageUkTest.php
@@ -8,14 +8,24 @@
 
 /** Tests for MediaWiki languages/classes/LanguageUk.php */
 class LanguageUkTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providePluralFourForms */
-	function testPluralFourForms( $result, $value ) {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
 		$forms = array( 'one', 'few', 'many', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePluralFourForms() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 1 ),
 			array( 'many', 11 ),
@@ -31,18 +41,21 @@ class LanguageUkTest extends LanguageClassesTestCase {
 		);
 	}
 
-	/** @dataProvider providePluralTwoForms */
-	function testPluralTwoForms( $result, $value ) {
-		$forms = array( 'one', 'several' );
+	/**
+	 * @dataProvider providePluralTwoForms
+	 * @covers Language::convertPlural
+	 */
+	public function testPluralTwoForms( $result, $value ) {
+		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providePluralTwoForms() {
+	public static function providePluralTwoForms() {
 		return array(
 			array( 'one', 1 ),
-			array( 'several', 11 ),
-			array( 'several', 91 ),
-			array( 'several', 121 ),
+			array( 'other', 11 ),
+			array( 'other', 91 ),
+			array( 'other', 121 ),
 		);
 	}
 }
diff --git a/tests/phpunit/languages/LanguageUzTest.php b/tests/phpunit/languages/LanguageUzTest.php
index 495c0be6..13f57c16 100644
--- a/tests/phpunit/languages/LanguageUzTest.php
+++ b/tests/phpunit/languages/LanguageUzTest.php
@@ -10,17 +10,20 @@
  * @copyright Copyright © 2012, Robin Pepermans
  * @copyright Copyright © 2011, Antoine Musso <hashar at free dot fr>
  * @file
+ *
+ * @todo methods in test class should be tidied:
+ *  - Should be split into separate test methods and data providers
+ *  - Tests for LanguageConverter and Language should probably be separate..
  */
 
-require_once dirname( __DIR__ ) . '/bootstrap.php';
-
 /** Tests for MediaWiki languages/LanguageUz.php */
 class LanguageUzTest extends LanguageClassesTestCase {
 
 	/**
 	 * @author Nikola Smolenski
+	 * @covers LanguageConverter::convertTo
 	 */
-	function testConversionToCyrillic() {
+	public function testConversionToCyrillic() {
 		// A convertion of Latin to Cyrillic
 		$this->assertEquals( 'абвгғ',
 			$this->convertToCyrillic( 'abvggʻ' )
@@ -39,7 +42,10 @@ class LanguageUzTest extends LanguageClassesTestCase {
 		);
 	}
 
-	function testConversionToLatin() {
+	/**
+	 * @covers LanguageConverter::convertTo
+	 */
+	public function testConversionToLatin() {
 		// A simple convertion of Latin to Latin
 		$this->assertEquals( 'abdef',
 			$this->convertToLatin( 'abdef' )
@@ -57,7 +63,7 @@ class LanguageUzTest extends LanguageClassesTestCase {
 	 * @param $variant string Language variant 'uz-cyrl' or 'uz-latn'
 	 * @param $msg string Optional message
 	 */
-	function assertUnConverted( $text, $variant, $msg = '' ) {
+	protected function assertUnConverted( $text, $variant, $msg = '' ) {
 		$this->assertEquals(
 			$text,
 			$this->convertTo( $text, $variant ),
@@ -71,7 +77,7 @@ class LanguageUzTest extends LanguageClassesTestCase {
 	 * @param $variant string Language variant 'uz-cyrl' or 'uz-latn'
 	 * @param $msg string Optional message
 	 */
-	function assertConverted( $text, $variant, $msg = '' ) {
+	protected function assertConverted( $text, $variant, $msg = '' ) {
 		$this->assertNotEquals(
 			$text,
 			$this->convertTo( $text, $variant ),
@@ -84,7 +90,7 @@ class LanguageUzTest extends LanguageClassesTestCase {
 	 * using the cyrillic variant and converted to Latin when using
 	 * the Latin variant.
 	 */
-	function assertCyrillic( $text, $msg = '' ) {
+	protected function assertCyrillic( $text, $msg = '' ) {
 		$this->assertUnConverted( $text, 'uz-cyrl', $msg );
 		$this->assertConverted( $text, 'uz-latn', $msg );
 	}
@@ -94,22 +100,22 @@ class LanguageUzTest extends LanguageClassesTestCase {
 	 * using the Latin variant and converted to Cyrillic when using
 	 * the Cyrillic variant.
 	 */
-	function assertLatin( $text, $msg = '' ) {
+	protected function assertLatin( $text, $msg = '' ) {
 		$this->assertUnConverted( $text, 'uz-latn', $msg );
 		$this->assertConverted( $text, 'uz-cyrl', $msg );
 	}
 
 
 	/** Wrapper for converter::convertTo() method*/
-	function convertTo( $text, $variant ) {
+	protected function convertTo( $text, $variant ) {
 		return $this->getLang()->mConverter->convertTo( $text, $variant );
 	}
 
-	function convertToCyrillic( $text ) {
+	protected function convertToCyrillic( $text ) {
 		return $this->convertTo( $text, 'uz-cyrl' );
 	}
 
-	function convertToLatin( $text ) {
+	protected function convertToLatin( $text ) {
 		return $this->convertTo( $text, 'uz-latn' );
 	}
 }
diff --git a/tests/phpunit/languages/LanguageWaTest.php b/tests/phpunit/languages/LanguageWaTest.php
index 28329fa3..d05196c0 100644
--- a/tests/phpunit/languages/LanguageWaTest.php
+++ b/tests/phpunit/languages/LanguageWaTest.php
@@ -7,18 +7,28 @@
 
 /** Tests for MediaWiki languages/classes/LanguageWa.php */
 class LanguageWaTest extends LanguageClassesTestCase {
-
-	/** @dataProvider providerPlural */
-	function testPlural( $result, $value ) {
-		$forms = array( 'one', 'many' );
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::convertPlural
+	 */
+	public function testPlural( $result, $value ) {
+		$forms = array( 'one', 'other' );
 		$this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
 	}
 
-	function providerPlural() {
+	/**
+	 * @dataProvider providePlural
+	 * @covers Language::getPluralRuleType
+	 */
+	public function testGetPluralRuleType( $result, $value ) {
+		$this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+	}
+
+	public static function providePlural() {
 		return array(
 			array( 'one', 0 ),
 			array( 'one', 1 ),
-			array( 'many', 2 ),
+			array( 'other', 2 ),
 		);
 	}
 }
diff --git a/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php b/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
index 73d5dcc0..3bf74146 100644
--- a/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
+++ b/tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
@@ -89,7 +89,7 @@ class CLDRPluralRuleEvaluatorTest extends MediaWikiTestCase {
 			array( 'n', 'just n' ),
 			array( 'n is in 5', 'is in' ),
 		);
+
 		return $tests;
 	}
-
 }
diff --git a/tests/phpunit/maintenance/DumpTestCase.php b/tests/phpunit/maintenance/DumpTestCase.php
index 40d24fc5..83d8c71d 100644
--- a/tests/phpunit/maintenance/DumpTestCase.php
+++ b/tests/phpunit/maintenance/DumpTestCase.php
@@ -60,11 +60,14 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
 		if ( $gzipped_contents === false ) {
 			$this->fail( "Could not get contents of $fname" );
 		}
-		// We resort to use gzinflate instead of gzdecode, as gzdecode
-		// need not be available
-		$contents = gzinflate( substr( $gzipped_contents, 10, -8 ) );
-		$this->assertEquals( strlen( $contents ),
-			file_put_contents( $fname, $contents ), "# bytes written" );
+
+		$contents = gzdecode( $gzipped_contents );
+
+		$this->assertEquals(
+			strlen( $contents ),
+			file_put_contents( $fname, $contents ),
+			'# bytes written'
+		);
 	}
 
 	/**
@@ -73,8 +76,6 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
 	 * Clears $wgUser, and reports errors from addDBData to PHPUnit
 	 */
 	protected function setUp() {
-		global $wgUser;
-
 		parent::setUp();
 
 		// Check if any Exception is stored for rethrowing from addDBData
@@ -83,7 +84,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
 			throw $this->exceptionFromAddDBData;
 		}
 
-		$wgUser = new User();
+		$this->setMwGlobals( 'wgUser', new User() );
 	}
 
 	/**
@@ -116,7 +117,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
 	 * @param $name string: name of the closing element to look for
 	 *           (e.g.: "mediawiki" when looking for </mediawiki>)
 	 *
-	 * @return bool: true iff the end node could be found. false otherwise.
+	 * @return bool: true if the end node could be found. false otherwise.
 	 */
 	protected function skipToNodeEnd( $name ) {
 		while ( $this->xml->read() ) {
@@ -126,6 +127,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
 				return true;
 			}
 		}
+
 		return false;
 	}
 
@@ -147,6 +149,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
 				return true;
 			}
 		}
+
 		return false;
 	}
 
@@ -273,7 +276,6 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
 		$this->assertTextNode( "title", $name );
 		$this->assertTextNode( "ns", $ns );
 		$this->assertTextNode( "id", $id );
-
 	}
 
 	/**
@@ -301,8 +303,8 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
 	 * @param $parentid int|false: (optional) id of the parent revision
 	 */
 	protected function assertRevision( $id, $summary, $text_id, $text_bytes, $text_sha1, $text = false, $parentid = false,
-									   $model = CONTENT_MODEL_WIKITEXT, $format = CONTENT_FORMAT_WIKITEXT ) {
-
+		$model = CONTENT_MODEL_WIKITEXT, $format = CONTENT_FORMAT_WIKITEXT
+	) {
 		$this->assertNodeStart( "revision" );
 		$this->skipWhitespace();
 
diff --git a/tests/phpunit/maintenance/MaintenanceTest.php b/tests/phpunit/maintenance/MaintenanceTest.php
index 741f8b7f..318ce0da 100644
--- a/tests/phpunit/maintenance/MaintenanceTest.php
+++ b/tests/phpunit/maintenance/MaintenanceTest.php
@@ -43,7 +43,7 @@ class MaintenanceFixup extends Maintenance {
 	private $testCase;
 
 	/**
-	 * shutdownSimulated === true iff simulateShutdown has done it's work
+	 * shutdownSimulated === true if simulateShutdown has done it's work
 	 *
 	 * @var bool
 	 */
@@ -128,7 +128,6 @@ class MaintenanceFixup extends Maintenance {
 	public function execute() {
 		$this->testCase->fail( __METHOD__ . " called unexpectedly" );
 	}
-
 }
 
 class MaintenanceTest extends MediaWikiTestCase {
@@ -186,7 +185,6 @@ class MaintenanceTest extends MediaWikiTestCase {
 	// test.*Intermittent.* tests), the objective of these tests is not to describe
 	// consistent behavior, but rather currently existing behavior.
 
-
 	function testOutputEmpty() {
 		$this->m->output( "" );
 		$this->assertOutputPrePostShutdown( "", false );
@@ -815,6 +813,4 @@ class MaintenanceTest extends MediaWikiTestCase {
 		$m2->simulateShutdown();
 		$this->assertOutputPrePostShutdown( "foobar\n\n", false );
 	}
-
-
 }
diff --git a/tests/phpunit/maintenance/backupPrefetchTest.php b/tests/phpunit/maintenance/backupPrefetchTest.php
index cc00e6e5..bc2d7375 100644
--- a/tests/phpunit/maintenance/backupPrefetchTest.php
+++ b/tests/phpunit/maintenance/backupPrefetchTest.php
@@ -36,7 +36,6 @@ class BaseDumpTest extends MediaWikiTestCase {
 	private function assertPrefetchEquals( $expected, $page, $revision ) {
 		$this->assertEquals( $expected, $this->dump->prefetch( $page, $revision ),
 			"Prefetch of page $page revision $revision" );
-
 	}
 
 	function testSequential() {
@@ -181,7 +180,6 @@ class BaseDumpTest extends MediaWikiTestCase {
   </siteinfo>
 ';
 
-
 		// An array holding the pages that are available for prefetch
 		$available_pages = array();
 
@@ -274,5 +272,4 @@ class BaseDumpTest extends MediaWikiTestCase {
 
 		return $fname;
 	}
-
 }
diff --git a/tests/phpunit/maintenance/backupTextPassTest.php b/tests/phpunit/maintenance/backupTextPassTest.php
index 09623445..653a1145 100644
--- a/tests/phpunit/maintenance/backupTextPassTest.php
+++ b/tests/phpunit/maintenance/backupTextPassTest.php
@@ -63,7 +63,7 @@ class TextPassDumperTest extends DumpTestCase {
 			// Page from non-default namespace
 
 			if ( $ns === NS_TALK ) {
-				//@todo: work around this.
+				// @todo work around this.
 				throw new MWException( "The default wikitext namespace is the talk namespace. "
 					. " We can't currently deal with that." );
 			}
@@ -80,7 +80,6 @@ class TextPassDumperTest extends DumpTestCase {
 			// DumpTestCase
 			$this->exceptionFromAddDBData = $e;
 		}
-
 	}
 
 	protected function setUp() {
@@ -94,7 +93,6 @@ class TextPassDumperTest extends DumpTestCase {
 			array( $this->pageId2, $this->pageId3, $this->pageId4 ),
 			array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
 			"Page ids increasing without holes" );
-
 	}
 
 	function testPlain() {
@@ -214,7 +212,6 @@ class TextPassDumperTest extends DumpTestCase {
 		$this->assertPageEnd();
 
 		$this->assertDumpEnd();
-
 	}
 
 	/**
@@ -239,7 +236,6 @@ class TextPassDumperTest extends DumpTestCase {
 		$minDuration = 2; // We want the dump to take at least this many seconds
 		$checkpointAfter = 0.5; // Generate checkpoint after this many seconds
 
-
 		// Until a dump takes at least $minDuration seconds, perform a dump and check
 		// duration. If the dump did not take long enough increase the iteration
 		// count, to generate a bigger stub file next time.
@@ -579,6 +575,7 @@ class TextPassDumperTest extends DumpTestCase {
 		$content .= $tail;
 		$this->assertEquals( strlen( $content ), file_put_contents(
 			$fname, $content ), "Length of prepared stub" );
+
 		return $fname;
 	}
 }
diff --git a/tests/phpunit/maintenance/backup_LogTest.php b/tests/phpunit/maintenance/backup_LogTest.php
index 5cf172e6..98d81653 100644
--- a/tests/phpunit/maintenance/backup_LogTest.php
+++ b/tests/phpunit/maintenance/backup_LogTest.php
@@ -39,6 +39,7 @@ class BackupDumperLoggerTest extends DumpTestCase {
 		if ( $parameters !== null ) {
 			$logEntry->setParameters( $parameters );
 		}
+
 		return $logEntry->insert();
 	}
 
@@ -75,14 +76,12 @@ class BackupDumperLoggerTest extends DumpTestCase {
 				$user2, NS_MAIN, "PageA", "SomeOtherComment",
 				array( 'key1' => 1, 3 => 'value3' ) );
 			$this->assertGreaterThan( 0, $this->logId3 );
-
 		} catch ( Exception $e ) {
 			// We'd love to pass $e directly. However, ... see
 			// documentation of exceptionFromAddDBData in
 			// DumpTestCase
 			$this->exceptionFromAddDBData = $e;
 		}
-
 	}
 
 
@@ -226,5 +225,4 @@ class BackupDumperLoggerTest extends DumpTestCase {
 		// the following statement to catch good output
 		$this->expectOutputString( '' );
 	}
-
 }
diff --git a/tests/phpunit/maintenance/backup_PageTest.php b/tests/phpunit/maintenance/backup_PageTest.php
index 07c76705..99bd2700 100644
--- a/tests/phpunit/maintenance/backup_PageTest.php
+++ b/tests/phpunit/maintenance/backup_PageTest.php
@@ -34,7 +34,7 @@ class BackupDumperPageTest extends DumpTestCase {
 			$this->talk_namespace = NS_TALK;
 
 			if ( $this->namespace === $this->talk_namespace ) {
-				//@todo: work around this.
+				// @todo work around this.
 				throw new MWException( "The default wikitext namespace is the talk namespace. "
 					. " We can't currently deal with that." );
 			}
@@ -79,7 +79,6 @@ class BackupDumperPageTest extends DumpTestCase {
 			// DumpTestCase
 			$this->exceptionFromAddDBData = $e;
 		}
-
 	}
 
 	protected function setUp() {
@@ -93,7 +92,6 @@ class BackupDumperPageTest extends DumpTestCase {
 			array( $this->pageId2, $this->pageId3, $this->pageId4 ),
 			array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
 			"Page ids increasing without holes" );
-
 	}
 
 	function testFullTextPlain() {
@@ -403,6 +401,4 @@ class BackupDumperPageTest extends DumpTestCase {
 
 		$this->expectETAOutput();
 	}
-
-
 }
diff --git a/tests/phpunit/maintenance/fetchTextTest.php b/tests/phpunit/maintenance/fetchTextTest.php
index 4d1d45d6..e8df199e 100644
--- a/tests/phpunit/maintenance/fetchTextTest.php
+++ b/tests/phpunit/maintenance/fetchTextTest.php
@@ -63,7 +63,6 @@ class SemiMockedFetchText extends FetchText {
 
 		return fopen( 'data://text/plain,' . $this->mockStdinText, 'r' );
 	}
-
 }
 
 /**
@@ -236,5 +235,4 @@ class FetchTextTest extends MediaWikiTestCase {
 				$this->textId3 . "\n23\nFetchTextTestPage2Text2"
 			) ) );
 	}
-
 }
diff --git a/tests/phpunit/maintenance/getSlaveServerTest.php b/tests/phpunit/maintenance/getSlaveServerTest.php
index 699571b7..2c848862 100644
--- a/tests/phpunit/maintenance/getSlaveServerTest.php
+++ b/tests/phpunit/maintenance/getSlaveServerTest.php
@@ -64,6 +64,4 @@ class GetSlaveServerTest extends MediaWikiTestCase {
 		$this->expectOutputRegex( "/^[[:space:]]*\[wgDBprefix\][[:space:]]*=> "
 			. $wgDBprefix . "$/m" );
 	}
-
-
 }
diff --git a/tests/phpunit/mocks/filebackend/MockFSFile.php b/tests/phpunit/mocks/filebackend/MockFSFile.php
new file mode 100644
index 00000000..e0463281
--- /dev/null
+++ b/tests/phpunit/mocks/filebackend/MockFSFile.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Mock of a filesystem file.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileBackend
+ */
+
+/**
+ * Class representing an in memory fake file.
+ * This is intended for unit testing / developement when you do not want
+ * to hit the filesystem.
+ *
+ * It reimplements abstract methods with some hardcoded values. Might
+ * not be suitable for all tests but is good enough for the parser tests.
+ *
+ * @ingroup FileBackend
+ */
+class MockFSFile extends FSFile {
+	protected $sha1Base36 = null; // File Sha1Base36
+
+	public function exists() {
+		return true;
+	}
+
+	/**
+	 * August 22 – The theft of the Mona Lisa is discovered in the Louvre."
+	 * @bug 20281
+	 */
+	public function getSize() {
+		return 1911;
+	}
+
+	public function getTimestamp() {
+		return wfTimestamp( TS_MW );
+	}
+
+	public function getMimeType() {
+		return 'text/mock';
+	}
+
+	public function getProps( $ext = true ) {
+		return array(
+			'fileExists' => $this->exists(),
+			'size' => $this->getSize(),
+			'file-mime' => $this->getMimeType(),
+			'sha1' => $this->getSha1Base36(),
+		);
+	}
+
+	public function getSha1Base36( $recache = false ) {
+		return '1234567890123456789012345678901';
+	}
+}
diff --git a/tests/phpunit/mocks/filebackend/MockFileBackend.php b/tests/phpunit/mocks/filebackend/MockFileBackend.php
new file mode 100644
index 00000000..49aefbd1
--- /dev/null
+++ b/tests/phpunit/mocks/filebackend/MockFileBackend.php
@@ -0,0 +1,122 @@
+<?php
+/**
+ * Simulation (mock) of a backend storage.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup FileBackend
+ * @author Antoine Musso <hashar@free.fr>
+ */
+
+/**
+ * Class simulating a backend store.
+ *
+ * @ingroup FileBackend
+ * @since 1.22
+ */
+class MockFileBackend extends FileBackendStore {
+
+	protected $mocked = array();
+
+	/** Poor man debugging */
+	protected function debug( $msg = '' ) {
+		wfDebug( wfGetCaller() . "$msg\n" );
+	}
+
+	public function isPathUsableInternal( $storagePath ) {
+		return true;
+	}
+
+	protected function doCreateInternal( array $params ) {
+		if ( isset( $params['content'] ) ) {
+			$content = $params['content'];
+		} else {
+			$content = 'Default mocked file content';
+		}
+		$this->debug( serialize( $params ) );
+		$dst = $params['dst'];
+		$this->mocked[$dst] = $content;
+		return Status::newGood();
+	}
+
+	protected function doStoreInternal( array $params ) {
+		$this->debug( serialize( $params ) );
+		return $this->doCreateInternal( $params );
+	}
+
+	protected function doCopyInternal( array $params ) {
+		$this->debug( serialize( $params ) );
+		$src = $params['src'];
+		$dst = $params['dst'];
+		$this->mocked[$dst] = $this->mocked[$src];
+		return Status::newGood();
+	}
+
+	protected function doDeleteInternal( array $params ) {
+		$this->debug( serialize( $params ) );
+		$src = $params['src'];
+		unset( $this->mocked[$src] );
+		return Status::newGood();
+	}
+
+	protected function doGetFileStat( array $params ) {
+		$src = $params['src'];
+		if ( array_key_exists( $src, $this->mocked ) ) {
+			$this->debug( "('$src') found" );
+			return array(
+				'mtime' => wfTimestamp( TS_MW ),
+				'size' => strlen( $this->mocked[$src] ),
+				# No sha1, stat does not need it.
+			);
+		} else {
+			$this->debug( "('$src') not found" );
+			return false;
+		}
+	}
+
+	protected function doGetLocalCopyMulti( array $params ) {
+		$tmpFiles = array(); // (path => MockFSFile)
+
+		$this->debug( '(' . serialize( $params ) . ')' );
+		foreach ( $params['srcs'] as $src ) {
+			$tmpFiles[$src] = new MockFSFile(
+				wfTempDir() . '/' . wfRandomString( 32 )
+			);
+		}
+		return $tmpFiles;
+	}
+
+	protected function doDirectoryExists( $container, $dir, array $params ) {
+		$this->debug();
+		return true;
+	}
+
+	public function getDirectoryListInternal( $container, $dir, array $params ) {
+		$this->debug();
+		return array();
+	}
+
+	public function getFileListInternal( $container, $dir, array $params ) {
+		$this->debug();
+		return array();
+	}
+
+	protected function directoriesAreVirtual() {
+		$this->debug();
+		return true;
+	}
+}
diff --git a/tests/phpunit/mocks/media/MockBitmapHandler.php b/tests/phpunit/mocks/media/MockBitmapHandler.php
new file mode 100644
index 00000000..742b41e4
--- /dev/null
+++ b/tests/phpunit/mocks/media/MockBitmapHandler.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * Fake handler for images.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Media
+ */
+
+class MockBitmapHandler extends BitmapHandler {
+	function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
+		return MockImageHandler::doFakeTransform( $this, $image, $dstPath, $dstUrl, $params, $flags );
+	}
+	function doClientImage( $image, $scalerParams ) {
+			return $this->getClientScalingThumbnailImage( $image, $scalerParams );
+	}
+}
+class MockSvgHandler extends SvgHandler {
+	function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
+		return MockImageHandler::doFakeTransform( $this, $image, $dstPath, $dstUrl, $params, $flags );
+	}
+}
+/**
+ * Mock handler for images.
+ *
+ * This is really intended for unit testing.
+ *
+ * @ingroup Media
+ */
+class MockImageHandler {
+
+	/**
+	 * Override BitmapHandler::doTransform() making sure we do not generate
+	 * a thumbnail at all. That is merely returning a ThumbnailImage that
+	 * will be consumed by the unit test.  There is no need to create a real
+	 * thumbnail on the filesystem.
+	 */
+	static function doFakeTransform( $that, $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
+		# Example of what we receive:
+		# $image: LocalFile
+		# $dstPath: /tmp/transform_7d0a7a2f1a09-1.jpg
+		# $dstUrl : http://example.com/images/thumb/0/09/Bad.jpg/320px-Bad.jpg
+		# $params:  width: 320,  descriptionUrl http://trunk.dev/wiki/File:Bad.jpg
+
+		$that->normaliseParams( $image, $params );
+
+		$scalerParams = array(
+			# The size to which the image will be resized
+			'physicalWidth' => $params['physicalWidth'],
+			'physicalHeight' => $params['physicalHeight'],
+			'physicalDimensions' => "{$params['physicalWidth']}x{$params['physicalHeight']}",
+			# The size of the image on the page
+			'clientWidth' => $params['width'],
+			'clientHeight' => $params['height'],
+			# Comment as will be added to the EXIF of the thumbnail
+			'comment' => isset( $params['descriptionUrl'] ) ?
+			"File source: {$params['descriptionUrl']}" : '',
+			# Properties of the original image
+			'srcWidth' => $image->getWidth(),
+			'srcHeight' => $image->getHeight(),
+			'mimeType' => $image->getMimeType(),
+			'dstPath' => $dstPath,
+			'dstUrl' => $dstUrl,
+		);
+
+		# In some cases, we do not bother generating a thumbnail.
+		if ( !$image->mustRender() &&
+			$scalerParams['physicalWidth'] == $scalerParams['srcWidth']
+			&& $scalerParams['physicalHeight'] == $scalerParams['srcHeight']
+		) {
+			wfDebug( __METHOD__ . ": returning unscaled image\n" );
+			// getClientScalingThumbnailImage is protected
+			return $that->doClientImage( $image, $scalerParams );
+		}
+
+		return new ThumbnailImage( $image, $dstUrl, false, $params );
+	}
+}
diff --git a/tests/phpunit/phpunit.php b/tests/phpunit/phpunit.php
index 2ec07440..1d65e521 100644
--- a/tests/phpunit/phpunit.php
+++ b/tests/phpunit/phpunit.php
@@ -12,7 +12,7 @@
 define( 'MW_PHPUNIT_TEST', true );
 
 // Start up MediaWiki in command-line mode
-require_once( dirname( dirname( __DIR__ ) ) . "/maintenance/Maintenance.php" );
+require_once dirname( dirname( __DIR__ ) ) . "/maintenance/Maintenance.php";
 
 class PHPUnitMaintClass extends Maintenance {
 
@@ -33,6 +33,9 @@ class PHPUnitMaintClass extends Maintenance {
 		global $wgLocaltimezone, $wgLocalisationCacheConf;
 		global $wgDevelopmentWarnings;
 
+		// Inject test autoloader
+		require_once __DIR__ . '/../TestsAutoLoader.php';
+
 		// wfWarn should cause tests to fail
 		$wgDevelopmentWarnings = true;
 
@@ -50,8 +53,11 @@ class PHPUnitMaintClass extends Maintenance {
 
 		// Bug 44192 Do not attempt to send a real e-mail
 		Hooks::clear( 'AlternateUserMailer' );
-		Hooks::register( 'AlternateUserMailer',
-			function() { return false; }
+		Hooks::register(
+			'AlternateUserMailer',
+			function () {
+				return false;
+			}
 		);
 	}
 
@@ -86,7 +92,6 @@ class PHPUnitMaintClass extends Maintenance {
 			unset( $_SERVER['argv'][$key] ); // the option
 			unset( $_SERVER['argv'][$key + 1] ); // its value
 			$_SERVER['argv'] = array_values( $_SERVER['argv'] );
-
 		}
 	}
 
@@ -96,16 +101,19 @@ class PHPUnitMaintClass extends Maintenance {
 }
 
 $maintClass = 'PHPUnitMaintClass';
-require( RUN_MAINTENANCE_IF_MAIN );
+require RUN_MAINTENANCE_IF_MAIN;
 
-require_once( 'PHPUnit/Runner/Version.php' );
+if ( !class_exists( 'PHPUnit_Runner_Version' ) ) {
+	require_once 'PHPUnit/Runner/Version.php';
+}
 
 if ( PHPUnit_Runner_Version::id() !== '@package_version@'
 	&& version_compare( PHPUnit_Runner_Version::id(), '3.6.7', '<' )
 ) {
 	die( 'PHPUnit 3.6.7 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
 }
-require_once( 'PHPUnit/Autoload.php' );
 
-require_once( "$IP/tests/TestsAutoLoader.php" );
+if ( !class_exists( 'PHPUnit_TextUI_Command' ) ) {
+	require_once 'PHPUnit/Autoload.php';
+}
 MediaWikiPHPUnitCommand::main();
diff --git a/tests/phpunit/resources/ResourcesTest.php b/tests/phpunit/resources/ResourcesTest.php
deleted file mode 100644
index 71b8c676..00000000
--- a/tests/phpunit/resources/ResourcesTest.php
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-/**
- * Sanity checks for making sure registered resources are sane.
- *
- * @file
- * @author Niklas Laxström, 2012
- * @author Antoine Musso, 2012
- * @author Santhosh Thottingal, 2012
- * @author Timo Tijhof, 2012
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- */
-class ResourcesTest extends MediaWikiTestCase {
-
-	/**
-	 * @dataProvider provideResourceFiles
-	 */
-	public function testFileExistence( $filename, $module, $resource ) {
-		$this->assertFileExists( $filename,
-			"File '$resource' referenced by '$module' must exist."
-		);
-	}
-
-	/**
-	 * This ask the ResouceLoader for all registered files from modules
-	 * created by ResourceLoaderFileModule (or one of its descendants).
-	 *
-	 *
-	 * Since the raw data is stored in protected properties, we have to
-	 * overrride this through ReflectionObject methods.
-	 */
-	public static function provideResourceFiles() {
-		global $wgEnableJavaScriptTest;
-
-		// Test existance of test suite files as well
-		// (can't use setUp or setMwGlobals because providers are static)
-		$live_wgEnableJavaScriptTest = $wgEnableJavaScriptTest;
-		$wgEnableJavaScriptTest = true;
-
-		// Array with arguments for the test function
-		$cases = array();
-
-		// Initialize ResourceLoader
-		$rl = new ResourceLoader();
-
-		// See also ResourceLoaderFileModule::__construct
-		$filePathProps = array(
-			// Lists of file paths
-			'lists' => array(
-				'scripts',
-				'debugScripts',
-				'loaderScripts',
-				'styles',
-			),
-
-			// Collated lists of file paths
-			'nested-lists' => array(
-				'languageScripts',
-				'skinScripts',
-				'skinStyles',
-			),
-		);
-
-		foreach ( $rl->getModuleNames() as $moduleName ) {
-			$module = $rl->getModule( $moduleName );
-			if ( !$module instanceof ResourceLoaderFileModule ) {
-				continue;
-			}
-
-			$reflectedModule = new ReflectionObject( $module );
-
-			$files = array();
-
-			foreach ( $filePathProps['lists'] as $propName ) {
-				$property = $reflectedModule->getProperty( $propName );
-				$property->setAccessible( true );
-				$list = $property->getValue( $module );
-				foreach ( $list as $key => $value ) {
-					// 'scripts' are numeral arrays.
-					// 'styles' can be numeral or associative.
-					// In case of associative the key is the file path
-					// and the value is the 'media' attribute.
-					if ( is_int( $key ) ) {
-						$files[] = $value;
-					} else {
-						$files[] = $key;
-					}
-				}
-			}
-
-			foreach ( $filePathProps['nested-lists'] as $propName ) {
-				$property = $reflectedModule->getProperty( $propName );
-				$property->setAccessible( true );
-				$lists = $property->getValue( $module );
-				foreach ( $lists as $group => $list ) {
-					foreach ( $list as $key => $value ) {
-						// We need the same filter as for 'lists',
-						// due to 'skinStyles'.
-						if ( is_int( $key ) ) {
-							$files[] = $value;
-						} else {
-							$files[] = $key;
-						}
-					}
-				}
-			}
-
-			// Get method for resolving the paths to full paths
-			$method = $reflectedModule->getMethod( 'getLocalPath' );
-			$method->setAccessible( true );
-
-			// Populate cases
-			foreach ( $files as $file ) {
-				$cases[] = array(
-					$method->invoke( $module, $file ),
-					$module->getName(),
-					$file,
-				);
-			}
-
-		}
-
-		// Restore settings
-		$wgEnableJavaScriptTest = $live_wgEnableJavaScriptTest;
-
-		return $cases;
-	}
-
-}
diff --git a/tests/phpunit/skins/SideBarTest.php b/tests/phpunit/skins/SideBarTest.php
index 3902b686..a385320f 100644
--- a/tests/phpunit/skins/SideBarTest.php
+++ b/tests/phpunit/skins/SideBarTest.php
@@ -5,7 +5,10 @@
  */
 class SideBarTest extends MediaWikiLangTestCase {
 
-	/** A skin template, reinitialized before each test */
+	/**
+	 * A skin template, reinitialized before each test
+	 * @var SkinTemplate
+	 */
 	private $skin;
 	/** Local cache for sidebar messages */
 	private $messages;
@@ -36,16 +39,12 @@ class SideBarTest extends MediaWikiLangTestCase {
 		$this->skin->getContext()->setLanguage( Language::factory( 'en' ) );
 	}
 
-	protected function tearDown() {
-		parent::tearDown();
-		$this->skin = null;
-	}
-
 	/**
 	 * Internal helper to test the sidebar
 	 * @param $expected
 	 * @param $text
 	 * @param $message (Default: '')
+	 * @todo this assert method to should be converted to a test using a dataprovider..
 	 */
 	private function assertSideBar( $expected, $text, $message = '' ) {
 		$bar = array();
@@ -53,7 +52,10 @@ class SideBarTest extends MediaWikiLangTestCase {
 		$this->assertEquals( $expected, $bar, $message );
 	}
 
-	function testSidebarWithOnlyTwoTitles() {
+	/**
+	 * @covers SkinTemplate::addToSidebarPlain
+	 */
+	public function testSidebarWithOnlyTwoTitles() {
 		$this->assertSideBar(
 			array(
 				'Title1' => array(),
@@ -65,7 +67,10 @@ class SideBarTest extends MediaWikiLangTestCase {
 		);
 	}
 
-	function testExpandMessages() {
+	/**
+	 * @covers SkinTemplate::addToSidebarPlain
+	 */
+	public function testExpandMessages() {
 		$this->assertSidebar(
 			array( 'Title' => array(
 				array(
@@ -81,7 +86,10 @@ class SideBarTest extends MediaWikiLangTestCase {
 		);
 	}
 
-	function testExternalUrlsRequireADescription() {
+	/**
+	 * @covers SkinTemplate::addToSidebarPlain
+	 */
+	public function testExternalUrlsRequireADescription() {
 		$this->assertSidebar(
 			array( 'Title' => array(
 				# ** http://www.mediawiki.org/| Home
@@ -100,14 +108,14 @@ class SideBarTest extends MediaWikiLangTestCase {
 ** http://valid.no.desc.org/
 '
 		);
-
 	}
 
 	/**
 	 * bug 33321 - Make sure there's a | after transforming.
 	 * @group Database
+	 * @covers SkinTemplate::addToSidebarPlain
 	 */
-	function testTrickyPipe() {
+	public function testTrickyPipe() {
 		$this->assertSidebar(
 			array( 'Title' => array(
 				# The first 2 are skipped
@@ -116,13 +124,13 @@ class SideBarTest extends MediaWikiLangTestCase {
 				# ** Baz|Fred
 				array(
 					'text' => 'Fred',
-					'href' => Title::newFromText( 'Baz' )->getLocalUrl(),
+					'href' => Title::newFromText( 'Baz' )->getLocalURL(),
 					'id' => 'n-Fred',
 					'active' => null,
 				),
 				array(
 					'text' => 'title-to-display',
-					'href' => Title::newFromText( 'page-to-go-to' )->getLocalUrl(),
+					'href' => Title::newFromText( 'page-to-go-to' )->getLocalURL(),
 					'id' => 'n-title-to-display',
 					'active' => null,
 				),
@@ -151,11 +159,12 @@ class SideBarTest extends MediaWikiLangTestCase {
 
 	/**
 	 * Simple test to verify our helper assertAttribs() is functional
-	 * Please note this assume MediaWiki default settings:
-	 *   $wgNoFollowLinks = true
-	 *   $wgExternalLinkTarget = false
 	 */
-	function testTestAttributesAssertionHelper() {
+	public function testTestAttributesAssertionHelper() {
+		$this->setMwGlobals( array(
+			'wgNoFollowLinks' => true,
+			'wgExternalLinkTarget' => false,
+		) );
 		$attribs = $this->getAttribs();
 
 		$this->assertArrayHasKey( 'rel', $attribs );
@@ -167,39 +176,31 @@ class SideBarTest extends MediaWikiLangTestCase {
 	/**
 	 * Test $wgNoFollowLinks in sidebar
 	 */
-	function testRespectWgnofollowlinks() {
-		global $wgNoFollowLinks;
-		$saved = $wgNoFollowLinks;
-		$wgNoFollowLinks = false;
+	public function testRespectWgnofollowlinks() {
+		$this->setMwGlobals( 'wgNoFollowLinks', false );
 
 		$attribs = $this->getAttribs();
 		$this->assertArrayNotHasKey( 'rel', $attribs,
 			'External URL in sidebar do not have rel=nofollow when $wgNoFollowLinks = false'
 		);
-
-		// Restore global
-		$wgNoFollowLinks = $saved;
 	}
 
 	/**
 	 * Test $wgExternaLinkTarget in sidebar
+	 * @dataProvider dataRespectExternallinktarget
 	 */
-	function testRespectExternallinktarget() {
-		global $wgExternalLinkTarget;
-		$saved = $wgExternalLinkTarget;
+	public function testRespectExternallinktarget( $externalLinkTarget ) {
+		$this->setMwGlobals( 'wgExternalLinkTarget', $externalLinkTarget );
 
-		$wgExternalLinkTarget = '_blank';
 		$attribs = $this->getAttribs();
 		$this->assertArrayHasKey( 'target', $attribs );
-		$this->assertEquals( $attribs['target'], '_blank' );
-
-		$wgExternalLinkTarget = '_self';
-		$attribs = $this->getAttribs();
-		$this->assertArrayHasKey( 'target', $attribs );
-		$this->assertEquals( $attribs['target'], '_self' );
-
-		// Restore global
-		$wgExternalLinkTarget = $saved;
+		$this->assertEquals( $attribs['target'], $externalLinkTarget );
 	}
 
+	public static function dataRespectExternallinktarget() {
+		return array(
+			array( '_blank' ),
+			array( '_self' ),
+		);
+	}
 }
diff --git a/tests/phpunit/structure/AutoLoaderTest.php b/tests/phpunit/structure/AutoLoaderTest.php
new file mode 100644
index 00000000..205ea360
--- /dev/null
+++ b/tests/phpunit/structure/AutoLoaderTest.php
@@ -0,0 +1,56 @@
+<?php
+class AutoLoaderTest extends MediaWikiTestCase {
+
+	/**
+	 * Assert that there were no classes loaded that are not registered with the AutoLoader.
+	 *
+	 * For example foo.php having class Foo and class Bar but only registering Foo.
+	 * This is important because we should not be relying on Foo being used before Bar.
+	 */
+	public function testAutoLoadConfig() {
+		$results = self::checkAutoLoadConf();
+
+		$this->assertEquals(
+			$results['expected'],
+			$results['actual']
+		);
+	}
+
+	protected static function checkAutoLoadConf() {
+		global $wgAutoloadLocalClasses, $wgAutoloadClasses, $IP;
+		$supportsParsekit = function_exists( 'parsekit_compile_file' );
+
+		// wgAutoloadLocalClasses has precedence, just like in includes/AutoLoader.php
+		$expected = $wgAutoloadLocalClasses + $wgAutoloadClasses;
+		$actual = array();
+
+		$files = array_unique( $expected );
+
+		foreach ( $files as $file ) {
+			// Only prefix $IP if it doesn't have it already.
+			// Generally local classes don't have it, and those from extensions and test suites do.
+			if ( substr( $file, 0, 1 ) != '/' && substr( $file, 1, 1 ) != ':' ) {
+				$filePath = "$IP/$file";
+			} else {
+				$filePath = $file;
+			}
+			if ( $supportsParsekit ) {
+				$parseInfo = parsekit_compile_file( "$filePath" );
+				$classes = array_keys( $parseInfo['class_table'] );
+			} else {
+				$contents = file_get_contents( "$filePath" );
+				$m = array();
+				preg_match_all( '/\n\s*(?:final)?\s*(?:abstract)?\s*(?:class|interface)\s+([a-zA-Z0-9_]+)/', $contents, $m, PREG_PATTERN_ORDER );
+				$classes = $m[1];
+			}
+			foreach ( $classes as $class ) {
+				$actual[$class] = $file;
+			}
+		}
+
+		return array(
+			'expected' => $expected,
+			'actual' => $actual,
+		);
+	}
+}
diff --git a/tests/phpunit/structure/ResourcesTest.php b/tests/phpunit/structure/ResourcesTest.php
new file mode 100644
index 00000000..fe823fa4
--- /dev/null
+++ b/tests/phpunit/structure/ResourcesTest.php
@@ -0,0 +1,131 @@
+<?php
+/**
+ * Sanity checks for making sure registered resources are sane.
+ *
+ * @file
+ * @author Antoine Musso
+ * @author Niklas Laxström
+ * @author Santhosh Thottingal
+ * @author Timo Tijhof
+ * @copyright © 2012, Antoine Musso
+ * @copyright © 2012, Niklas Laxström
+ * @copyright © 2012, Santhosh Thottingal
+ * @copyright © 2012, Timo Tijhof
+ *
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ */
+class ResourcesTest extends MediaWikiTestCase {
+
+	/**
+	 * @dataProvider provideResourceFiles
+	 */
+	public function testFileExistence( $filename, $module, $resource ) {
+		$this->assertFileExists( $filename,
+			"File '$resource' referenced by '$module' must exist."
+		);
+	}
+
+	/**
+	 * This ask the ResouceLoader for all registered files from modules
+	 * created by ResourceLoaderFileModule (or one of its descendants).
+	 *
+	 *
+	 * Since the raw data is stored in protected properties, we have to
+	 * overrride this through ReflectionObject methods.
+	 */
+	public static function provideResourceFiles() {
+		global $wgEnableJavaScriptTest;
+
+		// Test existance of test suite files as well
+		// (can't use setUp or setMwGlobals because providers are static)
+		$live_wgEnableJavaScriptTest = $wgEnableJavaScriptTest;
+		$wgEnableJavaScriptTest = true;
+
+		// Array with arguments for the test function
+		$cases = array();
+
+		// Initialize ResourceLoader
+		$rl = new ResourceLoader();
+
+		// See also ResourceLoaderFileModule::__construct
+		$filePathProps = array(
+			// Lists of file paths
+			'lists' => array(
+				'scripts',
+				'debugScripts',
+				'loaderScripts',
+				'styles',
+			),
+
+			// Collated lists of file paths
+			'nested-lists' => array(
+				'languageScripts',
+				'skinScripts',
+				'skinStyles',
+			),
+		);
+
+		foreach ( $rl->getModuleNames() as $moduleName ) {
+			$module = $rl->getModule( $moduleName );
+			if ( !$module instanceof ResourceLoaderFileModule ) {
+				continue;
+			}
+
+			$reflectedModule = new ReflectionObject( $module );
+
+			$files = array();
+
+			foreach ( $filePathProps['lists'] as $propName ) {
+				$property = $reflectedModule->getProperty( $propName );
+				$property->setAccessible( true );
+				$list = $property->getValue( $module );
+				foreach ( $list as $key => $value ) {
+					// 'scripts' are numeral arrays.
+					// 'styles' can be numeral or associative.
+					// In case of associative the key is the file path
+					// and the value is the 'media' attribute.
+					if ( is_int( $key ) ) {
+						$files[] = $value;
+					} else {
+						$files[] = $key;
+					}
+				}
+			}
+
+			foreach ( $filePathProps['nested-lists'] as $propName ) {
+				$property = $reflectedModule->getProperty( $propName );
+				$property->setAccessible( true );
+				$lists = $property->getValue( $module );
+				foreach ( $lists as $list ) {
+					foreach ( $list as $key => $value ) {
+						// We need the same filter as for 'lists',
+						// due to 'skinStyles'.
+						if ( is_int( $key ) ) {
+							$files[] = $value;
+						} else {
+							$files[] = $key;
+						}
+					}
+				}
+			}
+
+			// Get method for resolving the paths to full paths
+			$method = $reflectedModule->getMethod( 'getLocalPath' );
+			$method->setAccessible( true );
+
+			// Populate cases
+			foreach ( $files as $file ) {
+				$cases[] = array(
+					$method->invoke( $module, $file ),
+					$module->getName(),
+					$file,
+				);
+			}
+		}
+
+		// Restore settings
+		$wgEnableJavaScriptTest = $live_wgEnableJavaScriptTest;
+
+		return $cases;
+	}
+}
diff --git a/tests/phpunit/structure/StructureTest.php b/tests/phpunit/structure/StructureTest.php
new file mode 100644
index 00000000..df00d4df
--- /dev/null
+++ b/tests/phpunit/structure/StructureTest.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * The tests here verify the structure of the code.  This is for outright bugs,
+ * not just style issues.
+ */
+
+class StructureTest extends MediaWikiTestCase {
+	/**
+	 * Verify all files that appear to be tests have file names ending in
+	 * Test.  If the file names do not end in Test, they will not be run.
+	 * @group medium
+	 */
+	public function testUnitTestFileNamesEndWithTest() {
+		if ( wfIsWindows() ) {
+			$this->markTestSkipped( 'This test does not work on Windows' );
+		}
+		$rootPath = escapeshellarg( __DIR__ . '/..' );
+		$testClassRegex = implode( '|', array(
+			'ApiFormatTestBase',
+			'ApiTestCase',
+			'ApiQueryTestBase',
+			'ApiQueryContinueTestBase',
+			'MediaWikiLangTestCase',
+			'MediaWikiTestCase',
+			'PHPUnit_Framework_TestCase',
+			'DumpTestCase',
+		) );
+		$testClassRegex = "^class .* extends ($testClassRegex)";
+		$finder = "find $rootPath -name '*.php' '!' -name '*Test.php'" .
+			" | xargs grep -El '$testClassRegex|function suite\('";
+
+		$results = null;
+		$exitCode = null;
+		exec( $finder, $results, $exitCode );
+
+		$this->assertEquals(
+			0,
+			$exitCode,
+			'Verify find/grep command succeeds.'
+		);
+
+		$results = array_filter(
+			$results,
+			array( $this, 'filterSuites' )
+		);
+		$strip = strlen( $rootPath ) - 1;
+		foreach ( $results as $k => $v ) {
+			$results[$k] = substr( $v, $strip );
+		}
+		$this->assertEquals(
+			array(),
+			$results,
+			"Unit test file in $rootPath must end with Test."
+		);
+	}
+
+	/**
+	 * Filter to remove testUnitTestFileNamesEndWithTest false positives.
+	 */
+	public function filterSuites( $filename ) {
+		return strpos( $filename, __DIR__ . '/../suites/' ) !== 0;
+	}
+}
diff --git a/tests/phpunit/suite.xml b/tests/phpunit/suite.xml
index 8f7e977f..7a9122fa 100644
--- a/tests/phpunit/suite.xml
+++ b/tests/phpunit/suite.xml
@@ -2,17 +2,18 @@
 
 <!-- colors don't work on Windows! -->
 <phpunit bootstrap="./bootstrap.php"
-         colors="true"
-         backupGlobals="false"
-         convertErrorsToExceptions="true"
-         convertNoticesToExceptions="true"
-         convertWarningsToExceptions="true"
-         stopOnFailure="false"
-		 timeoutForSmallTests="10"
-		 timeoutForMediumTests="30"
-		 timeoutForLargeTests="60"
-         strict="true"
-		 verbose="true">
+	colors="true"
+	backupGlobals="false"
+	convertErrorsToExceptions="true"
+	convertNoticesToExceptions="true"
+	convertWarningsToExceptions="true"
+	forceCoversAnnotation="true"
+	stopOnFailure="false"
+	timeoutForSmallTests="10"
+	timeoutForMediumTests="30"
+	timeoutForLargeTests="60"
+	strict="true"
+	verbose="true">
 	<testsuites>
 		<testsuite name="includes">
 			<directory>includes</directory>
@@ -29,14 +30,14 @@
 			<directory>maintenance</directory>
 		</testsuite>
 		<testsuite name="structure">
-			<file>AutoLoaderTest.php</file>
-			<file>StructureTest.php</file>
+			<directory>structure</directory>
 		</testsuite>
 		<testsuite name="uploadfromurl">
 			<file>suites/UploadFromUrlTestSuite.php</file>
 		</testsuite>
 		<testsuite name="extensions">
 			<file>suites/ExtensionsTestSuite.php</file>
+			<file>suites/ExtensionsParserTestSuite.php</file>
 		</testsuite>
 	</testsuites>
 	<groups>
diff --git a/tests/phpunit/suites/ExtensionsParserTestSuite.php b/tests/phpunit/suites/ExtensionsParserTestSuite.php
new file mode 100644
index 00000000..3d68b241
--- /dev/null
+++ b/tests/phpunit/suites/ExtensionsParserTestSuite.php
@@ -0,0 +1,8 @@
+<?php
+class ExtensionsParserTestSuite extends PHPUnit_Framework_TestSuite {
+
+	public static function suite() {
+		return MediaWikiParserTest::suite( MediaWikiParserTest::NO_CORE );
+	}
+
+}
diff --git a/tests/phpunit/suites/UploadFromUrlTestSuite.php b/tests/phpunit/suites/UploadFromUrlTestSuite.php
index 28d38ab4..7eb599e3 100644
--- a/tests/phpunit/suites/UploadFromUrlTestSuite.php
+++ b/tests/phpunit/suites/UploadFromUrlTestSuite.php
@@ -1,6 +1,6 @@
 <?php
 
-require_once( dirname( __DIR__ ) . '/includes/upload/UploadFromUrlTest.php' );
+require_once dirname( __DIR__ ) . '/includes/upload/UploadFromUrlTest.php';
 
 class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
 	public $savedGlobals = array();
@@ -16,16 +16,16 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
 	}
 
 	protected function setUp() {
-		global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
-			$wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
-			$wgNamespaceAliases, $wgNamespaceProtection, $parserMemc;
+		global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc, $wgUser,
+			$wgLang, $wgOut, $wgRequest, $wgStyleDirectory,
+			$wgEnableParserCache, $wgNamespaceAliases, $wgNamespaceProtection,
+			$parserMemc;
 
 		$tmpGlobals = array();
 
 		$tmpGlobals['wgScript'] = '/index.php';
 		$tmpGlobals['wgScriptPath'] = '/';
 		$tmpGlobals['wgArticlePath'] = '/wiki/$1';
-		$tmpGlobals['wgStyleSheetPath'] = '/skins';
 		$tmpGlobals['wgStylePath'] = '/skins';
 		$tmpGlobals['wgThumbnailScriptPath'] = false;
 		$tmpGlobals['wgLocalFileRepo'] = array(
@@ -56,7 +56,6 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
 		$wgNamespaceAliases['Image'] = NS_FILE;
 		$wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
 
-
 		$wgEnableParserCache = false;
 		DeferredUpdates::clearPendingUpdates();
 		$wgMemc = wfGetMainCache();
@@ -184,6 +183,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
 
 		if ( file_exists( $dir ) ) {
 			wfDebug( "Already exists!\n" );
+
 			return $dir;
 		}
 
@@ -201,6 +201,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
 		// the UploadFromUrlTest class
 		class_exists( 'UploadFromUrlTest' );
 		$suite = new UploadFromUrlTestSuite( 'UploadFromUrlTest' );
+
 		return $suite;
 	}
 }
diff --git a/tests/qunit/QUnitTestResources.php b/tests/qunit/QUnitTestResources.php
index 01072d83..c8743750 100644
--- a/tests/qunit/QUnitTestResources.php
+++ b/tests/qunit/QUnitTestResources.php
@@ -6,6 +6,7 @@ return array(
 
 	'mediawiki.tests.qunit.suites' => array(
 		'scripts' => array(
+			'tests/qunit/suites/resources/startup.test.js',
 			'tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js',
 			'tests/qunit/suites/resources/jquery/jquery.byteLength.test.js',
 			'tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js',
@@ -16,6 +17,7 @@ return array(
 			'tests/qunit/suites/resources/jquery/jquery.hidpi.test.js',
 			'tests/qunit/suites/resources/jquery/jquery.highlightText.test.js',
 			'tests/qunit/suites/resources/jquery/jquery.localize.test.js',
+			'tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js',
 			'tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js',
 			'tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js',
 			'tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js',
@@ -45,6 +47,7 @@ return array(
 			'jquery.hidpi',
 			'jquery.highlightText',
 			'jquery.localize',
+			'jquery.makeCollapsible',
 			'jquery.mwExtension',
 			'jquery.tabIndex',
 			'jquery.tablesorter',
@@ -61,6 +64,5 @@ return array(
 			'mediawiki.language',
 			'mediawiki.cldr',
 		),
-		'position' => 'top',
 	)
 );
diff --git a/tests/qunit/data/generateJqueryMsgData.php b/tests/qunit/data/generateJqueryMsgData.php
index 604ede81..12e5a2dc 100644
--- a/tests/qunit/data/generateJqueryMsgData.php
+++ b/tests/qunit/data/generateJqueryMsgData.php
@@ -61,7 +61,7 @@
  * </code>
  */
 
-require( __DIR__ . '/../../../maintenance/Maintenance.php' );
+require __DIR__ . '/../../../maintenance/Maintenance.php';
 
 class GenerateJqueryMsgData extends Maintenance {
 
@@ -147,4 +147,4 @@ class GenerateJqueryMsgData extends Maintenance {
 }
 
 $maintClass = "GenerateJqueryMsgData";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/tests/qunit/data/load.mock.php b/tests/qunit/data/load.mock.php
index 7ff392ab..f6eff77a 100644
--- a/tests/qunit/data/load.mock.php
+++ b/tests/qunit/data/load.mock.php
@@ -24,6 +24,7 @@
  */
 header( 'Content-Type: text/javascript; charset=utf-8' );
 
+require_once __DIR__ . '/../../../includes/json/FormatJson.php';
 require_once __DIR__ . '/../../../includes/Xml.php';
 
 $moduleImplementations = array(
@@ -50,7 +51,7 @@ if ( isset( $_GET['modules'] ) ) {
 		if ( isset( $moduleImplementations[$module] ) ) {
 			$response .= $moduleImplementations[$module];
 		} else {
-			$response .= Xml::encodeJsCall( 'mw.loader.state', array( $module, 'missing' ) );
+			$response .= Xml::encodeJsCall( 'mw.loader.state', array( $module, 'missing' ), true );
 		}
 	}
 }
diff --git a/tests/qunit/data/testrunner.js b/tests/qunit/data/testrunner.js
index 62dd81ac..1a2bfa10 100644
--- a/tests/qunit/data/testrunner.js
+++ b/tests/qunit/data/testrunner.js
@@ -38,6 +38,8 @@
 		tooltip: 'Enable debug mode in ResourceLoader'
 	} );
 
+	QUnit.config.requireExpects = true;
+
 	/**
 	 * Load TestSwarm agent
 	 */
@@ -48,13 +50,14 @@
 	// of MediaWiki has actually been configured with the required url to that inject.js
 	// script. By default it is false.
 	if ( QUnit.urlParams.swarmURL && mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) {
-		document.write( '<scr' + 'ipt src="' + QUnit.fixurl( mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) + '"></scr' + 'ipt>' );
+		jQuery.getScript( QUnit.fixurl( mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) );
 	}
 
 	/**
 	 * CompletenessTest
+	 *
+	 * Adds toggle checkbox to header
 	 */
-	 // Adds toggle checkbox to header
 	QUnit.config.urlConfig.push( {
 		id: 'completenesstest',
 		label: 'Run CompletenessTest',
@@ -93,8 +96,9 @@
 
 	/**
 	 * Test environment recommended for all QUnit test modules
+	 *
+	 * Whether to log environment changes to the console
 	 */
-	 // Whether to log environment changes to the console
 	QUnit.config.urlConfig.push( 'mwlogenv' );
 
 	/**
@@ -347,6 +351,25 @@
 		assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object restored and re-applied after test()' );
 	} );
 
+	QUnit.test( 'Loader status', 2, function ( assert ) {
+		var i, len, state,
+			modules = mw.loader.getModuleNames(),
+			error = [],
+			missing = [];
+
+		for ( i = 0, len = modules.length; i < len; i++ ) {
+			state = mw.loader.getState( modules[i] );
+			if ( state === 'error' ) {
+				error.push( modules[i] );
+			} else if ( state === 'missing' ) {
+				missing.push( modules[i] );
+			}
+		}
+
+		assert.deepEqual( error, [], 'Modules in error state' );
+		assert.deepEqual( missing, [], 'Modules in missing state' );
+	} );
+
 	QUnit.test( 'htmlEqual', 8, function ( assert ) {
 		assert.htmlEqual(
 			'<div><p class="some classes" data-length="10">Child paragraph with <a href="http://example.com">A link</a></p>Regular text<span>A span</span></div>',
diff --git a/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js b/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js
index e4e579b0..e6aa3aa8 100644
--- a/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js
+++ b/tests/qunit/suites/resources/jquery/jquery.byteLength.test.js
@@ -16,20 +16,22 @@
 
 	} );
 
-	QUnit.test( 'Special text', 5, function ( assert ) {
-		// http://en.wikipedia.org/wiki/UTF-8
+	QUnit.test( 'Special text', 4, function ( assert ) {
+		// https://en.wikipedia.org/wiki/UTF-8
 		var u0024 = '$',
+			// Cent symbol
 			u00A2 = '\u00A2',
+			// Euro symbol
 			u20AC = '\u20AC',
-			u024B62 = '\u024B62',
-			// The normal one doesn't display properly, try the below which is the same
-			// according to http://www.fileformat.info/info/unicode/char/24B62/index.htm
-			u024B62alt = '\uD852\uDF62';
+			// Character \U00024B62 (Han script) can't be represented in javascript as a single
+			// code point, instead it is composed as a surrogate pair of two separate code units.
+			// http://codepoints.net/U+24B62
+			// http://www.fileformat.info/info/unicode/char/24B62/index.htm
+			u024B62 = '\uD852\uDF62';
 
-		assert.strictEqual( $.byteLength( u0024 ), 1, 'U+0024: 1 byte. $ (dollar sign)' );
-		assert.strictEqual( $.byteLength( u00A2 ), 2, 'U+00A2: 2 bytes. \u00A2 (cent sign)' );
-		assert.strictEqual( $.byteLength( u20AC ), 3, 'U+20AC: 3 bytes. \u20AC (euro sign)' );
-		assert.strictEqual( $.byteLength( u024B62 ), 4, 'U+024B62: 4 bytes. \uD852\uDF62 (a Han character)' );
-		assert.strictEqual( $.byteLength( u024B62alt ), 4, 'U+024B62: 4 bytes. \uD852\uDF62 (a Han character) - alternative method' );
+		assert.strictEqual( $.byteLength( u0024 ), 1, 'U+0024' );
+		assert.strictEqual( $.byteLength( u00A2 ), 2, 'U+00A2' );
+		assert.strictEqual( $.byteLength( u20AC ), 3, 'U+20AC' );
+		assert.strictEqual( $.byteLength( u024B62 ), 4, 'U+024B62 (surrogate pair: \\uD852\\uDF62)' );
 	} );
 }( jQuery ) );
diff --git a/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js b/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
index c21844eb..22d2af19 100644
--- a/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
+++ b/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
@@ -31,55 +31,34 @@
 	/**
 	 * Test factory for $.fn.byteLimit
 	 *
-	 * @param $input {jQuery} jQuery object in an input element
-	 * @param hasLimit {Boolean} Wether a limit should apply at all
-	 * @param limit {Number} Limit (if used) otherwise undefined
-	 * The limit should be less than 20 (the sample data's length)
+	 * @param {Object} options
+	 * @param {string} options.description Test name
+	 * @param {jQuery} options.$input jQuery object in an input element
+	 * @param {string} options.sample Sequence of characters to simulate being
+	 *  added one by one
+	 * @param {string} options.expected Expected final value of `$input`
 	 */
 	function byteLimitTest( options ) {
 		var opt = $.extend( {
 			description: '',
 			$input: null,
 			sample: '',
-			hasLimit: false,
-			expected: '',
-			limit: null
+			expected: ''
 		}, options );
 
-		QUnit.asyncTest( opt.description, opt.hasLimit ? 3 : 2, function ( assert ) {
+		QUnit.asyncTest( opt.description, 1, function ( assert ) {
 			setTimeout( function () {
-				var rawVal, fn, effectiveVal;
-
 				opt.$input.appendTo( '#qunit-fixture' );
 
 				// Simulate pressing keys for each of the sample characters
 				addChars( opt.$input, opt.sample );
 
-				rawVal = opt.$input.val();
-				fn = opt.$input.data( 'byteLimit.callback' );
-				effectiveVal = fn ? fn( rawVal ) : rawVal;
-
-				if ( opt.hasLimit ) {
-					assert.ltOrEq(
-						$.byteLength( effectiveVal ),
-						opt.limit,
-						'Prevent keypresses after byteLimit was reached, length never exceeded the limit'
-					);
-					assert.equal(
-						$.byteLength( rawVal ),
-						$.byteLength( opt.expected ),
-						'Not preventing keypresses too early, length has reached the expected length'
-					);
-					assert.equal( rawVal, opt.expected, 'New value matches the expected string' );
-
-				} else {
-					assert.equal(
-						$.byteLength( effectiveVal ),
-						$.byteLength( opt.expected ),
-						'Unlimited scenarios are not affected, expected length reached'
-					);
-					assert.equal( rawVal, opt.expected, 'New value matches the expected string' );
-				}
+				assert.equal(
+					opt.$input.val(),
+					opt.expected,
+					'New value matches the expected string'
+				);
+
 				QUnit.start();
 			}, 10 );
 		} );
@@ -89,7 +68,6 @@
 		description: 'Plain text input',
 		$input: $( '<input type="text"/>' ),
 		sample: simpleSample,
-		hasLimit: false,
 		expected: simpleSample
 	} );
 
@@ -98,7 +76,6 @@
 		$input: $( '<input type="text"/>' )
 			.byteLimit(),
 		sample: simpleSample,
-		hasLimit: false,
 		expected: simpleSample
 	} );
 
@@ -108,8 +85,6 @@
 			.attr( 'maxlength', '10' )
 			.byteLimit(),
 		sample: simpleSample,
-		hasLimit: true,
-		limit: 10,
 		expected: '1234567890'
 	} );
 
@@ -118,8 +93,6 @@
 		$input: $( '<input type="text"/>' )
 			.byteLimit( 10 ),
 		sample: simpleSample,
-		hasLimit: true,
-		limit: 10,
 		expected: '1234567890'
 	} );
 
@@ -129,8 +102,6 @@
 			.attr( 'maxlength', '10' )
 			.byteLimit( 15 ),
 		sample: simpleSample,
-		hasLimit: true,
-		limit: 15,
 		expected: '123456789012345'
 	} );
 
@@ -139,8 +110,6 @@
 		$input: $( '<input type="text"/>' )
 			.byteLimit( 14 ),
 		sample: mbSample,
-		hasLimit: true,
-		limit: 14,
 		expected: '1234567890' + U_20AC + '1'
 	} );
 
@@ -149,8 +118,6 @@
 		$input: $( '<input type="text"/>' )
 			.byteLimit( 12 ),
 		sample: mbSample,
-		hasLimit: true,
-		limit: 12,
 		expected: '1234567890' + '12'
 	} );
 
@@ -158,17 +125,11 @@
 		description: 'Pass the limit and a callback as input filter',
 		$input: $( '<input type="text"/>' )
 			.byteLimit( 6, function ( val ) {
-				// Invalid title
-				if ( val === '' ) {
-					return '';
-				}
-
+				var title = mw.Title.newFromText( String( val ) );
 				// Return without namespace prefix
-				return new mw.Title( String( val ) ).getMain();
+				return title ? title.getMain() : '';
 			} ),
 		sample: 'User:Sample',
-		hasLimit: true,
-		limit: 6, // 'Sample' length
 		expected: 'User:Sample'
 	} );
 
@@ -177,20 +138,53 @@
 		$input: $( '<input type="text"/>' )
 			.attr( 'maxlength', '6' )
 			.byteLimit( function ( val ) {
-				// Invalid title
-				if ( val === '' ) {
-					return '';
-				}
-
+				var title = mw.Title.newFromText( String( val ) );
 				// Return without namespace prefix
-				return new mw.Title( String( val ) ).getMain();
+				return title ? title.getMain() : '';
 			} ),
 		sample: 'User:Sample',
-		hasLimit: true,
-		limit: 6, // 'Sample' length
 		expected: 'User:Sample'
 	} );
 
+	byteLimitTest( {
+		description: 'Pass the limit and a callback as input filter',
+		$input: $( '<input type="text"/>' )
+			.byteLimit( 6, function ( val ) {
+				var title = mw.Title.newFromText( String( val ) );
+				// Return without namespace prefix
+				return title ? title.getMain() : '';
+			} ),
+		sample: 'User:Example',
+		// The callback alters the value to be used to calculeate
+		// the length. The altered value is "Exampl" which has
+		// a length of 6, the "e" would exceed the limit.
+		expected: 'User:Exampl'
+	} );
+
+	byteLimitTest( {
+		description: 'Input filter that increases the length',
+		$input: $( '<input type="text"/>' )
+		.byteLimit( 10, function ( text ) {
+			return 'prefix' + text;
+		} ),
+		sample: simpleSample,
+		// Prefix adds 6 characters, limit is reached after 4
+		expected: '1234'
+	} );
+
+	// Regression tests for bug 41450
+	byteLimitTest( {
+		description: 'Input filter of which the base exceeds the limit',
+		$input: $( '<input type="text"/>' )
+		.byteLimit( 3, function ( text ) {
+			return 'prefix' + text;
+		} ),
+		sample: simpleSample,
+		hasLimit: true,
+		limit: 6, // 'prefix' length
+		expected: ''
+	} );
+
 	QUnit.test( 'Confirm properties and attributes set', 4, function ( assert ) {
 		var $el, $elA, $elB;
 
diff --git a/tests/qunit/suites/resources/jquery/jquery.client.test.js b/tests/qunit/suites/resources/jquery/jquery.client.test.js
index 88bbf5c4..4c7c3022 100644
--- a/tests/qunit/suites/resources/jquery/jquery.client.test.js
+++ b/tests/qunit/suites/resources/jquery/jquery.client.test.js
@@ -1,16 +1,11 @@
 ( function ( $ ) {
-	var uacount, uas, testMap;
 
 	QUnit.module( 'jquery.client', QUnit.newMwEnvironment() );
 
-	/** Number of user-agent defined */
-	uacount = 0;
-
-	uas = ( function () {
-
+	var uacount = 0,
 		// Object keyed by userAgent. Value is an array (human-readable name, client-profile object, navigator.platform value)
 		// Info based on results from http://toolserver.org/~krinkle/testswarm/job/174/
-		var uas = {
+		uas = {
 			// Internet Explorer 6
 			// Internet Explorer 7
 			'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)': {
@@ -39,7 +34,7 @@
 				profile: {
 					name: 'msie',
 					layout: 'trident',
-					layoutVersion: 'unknown', // should be able to report 6?
+					layoutVersion: 6,
 					platform: 'win',
 					version: '10.0',
 					versionBase: '10',
@@ -50,6 +45,60 @@
 					rtl: true
 				}
 			},
+			// Internet Explorer 11
+			'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko': {
+				title: 'Internet Explorer 11',
+				platform: 'Win32',
+				profile: {
+					name: 'msie',
+					layout: 'trident',
+					layoutVersion: 7,
+					platform: 'win',
+					version: '11.0',
+					versionBase: '11',
+					versionNumber: 11
+				},
+				wikiEditor: {
+					ltr: true,
+					rtl: true
+				}
+			},
+			// Internet Explorer 11 - Windows 8.1 x64 Modern UI
+			'Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko': {
+				title: 'Internet Explorer 11',
+				platform: 'Win64',
+				profile: {
+					name: 'msie',
+					layout: 'trident',
+					layoutVersion: 7,
+					platform: 'win',
+					version: '11.0',
+					versionBase: '11',
+					versionNumber: 11
+				},
+				wikiEditor: {
+					ltr: true,
+					rtl: true
+				}
+			},
+			// Internet Explorer 11 - Windows 8.1 x64 desktop UI
+			'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko': {
+				title: 'Internet Explorer 11',
+				platform: 'WOW64',
+				profile: {
+					name: 'msie',
+					layout: 'trident',
+					layoutVersion: 7,
+					platform: 'win',
+					version: '11.0',
+					versionBase: '11',
+					versionNumber: 11
+				},
+				wikiEditor: {
+					ltr: true,
+					rtl: true
+				}
+			},
 			// Firefox 2
 			// Firefox 3.5
 			'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19': {
@@ -141,6 +190,24 @@
 					rtl: true
 				}
 			},
+			// Iceweasel 15.0.1
+			'Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1 Iceweasel/15.0.1': {
+				title: 'Iceweasel 15.0.1',
+				platform: 'Linux',
+				profile: {
+					name: 'iceweasel',
+					layout: 'gecko',
+					layoutVersion: 20100101,
+					platform: 'linux',
+					version: '15.0.1',
+					versionBase: '15',
+					versionNumber: 15
+				},
+				wikiEditor: {
+					ltr: true,
+					rtl: true
+				}
+			},
 			// Firefox 5
 			// Safari 3
 			// Safari 4
@@ -179,6 +246,42 @@
 				}
 			},
 			// Safari 5
+			// Safari 6
+			'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.29.13 (KHTML, like Gecko) Version/6.0.4 Safari/536.29.13': {
+				title: 'Safari 6',
+				platform: 'MacIntel',
+				profile: {
+					name: 'safari',
+					layout: 'webkit',
+					layoutVersion: 536,
+					platform: 'mac',
+					version: '6.0.4',
+					versionBase: '6',
+					versionNumber: 6
+				},
+				wikiEditor: {
+					ltr: true,
+					rtl: true
+				}
+			},
+			// Safari 6.0.5+ (doesn't have the comma in "KHTML, like Gecko")
+			'Mozilla/5.0 (Macintosh; Intel Mac OS X 1084) AppleWebKit/536.30.1 (KHTML like Gecko) Version/6.0.5 Safari/536.30.1': {
+				title: 'Safari 6',
+				platform: 'MacIntel',
+				profile: {
+					name: 'safari',
+					layout: 'webkit',
+					layoutVersion: 536,
+					platform: 'mac',
+					version: '6.0.5',
+					versionBase: '6',
+					versionNumber: 6
+				},
+				wikiEditor: {
+					ltr: true,
+					rtl: true
+				}
+			},
 			// Opera 10+
 			'Opera/9.80 (Windows NT 5.1)': {
 				title: 'Opera 10+ (exact version unspecified)',
@@ -215,6 +318,24 @@
 					rtl: true
 				}
 			},
+			// Opera 15 (WebKit-based)
+			'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130': {
+				title: 'Opera 15',
+				platform: 'Win32',
+				profile: {
+					name: 'opera',
+					layout: 'webkit',
+					layoutVersion: 537,
+					platform: 'win',
+					version: '15.0.1147.130',
+					versionBase: '15',
+					versionNumber: 15
+				},
+				wikiEditor: {
+					ltr: true,
+					rtl: true
+				}
+			},
 			// Chrome 5
 			// Chrome 6
 			// Chrome 7
@@ -257,6 +378,24 @@
 					rtl: true
 				}
 			},
+			// Android WebKit Browser 2.3
+			'Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; HTC Vision Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1': {
+				title: 'Android WebKit Browser 2.3',
+				platform: 'Linux armv7l',
+				profile: {
+					name: 'android',
+					layout: 'webkit',
+					layoutVersion: 533,
+					platform: 'linux',
+					version: '2.3.5',
+					versionBase: '2',
+					versionNumber: 2.3
+				},
+				wikiEditor: {
+					ltr: true,
+					rtl: true
+				}
+			},
 			// Bug #34924
 			'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.34 (KHTML, like Gecko) rekonq Safari/534.34': {
 				title: 'Rekonq',
@@ -275,28 +414,42 @@
 					rtl: true
 				}
 			}
-		};
-		$.each( uas, function () {
-			uacount++;
-		} );
-		return uas;
-	}() );
-
-	QUnit.test( 'profile userAgent support', uacount, function ( assert ) {
-		// Generate a client profile object and compare recursively
-		var uaTest = function ( rawUserAgent, data ) {
-			var ret = $.client.profile( {
-				userAgent: rawUserAgent,
-				platform: data.platform
-			} );
-			assert.deepEqual( ret, data.profile, 'Client profile support check for ' + data.title + ' (' + data.platform + '): ' + rawUserAgent );
-		};
+		},
+		testMap = {
+			// Example from WikiEditor
+			// Make sure to use raw numbers, a string like "7.0" would fail on a
+			// version 10 browser since in string comparaison "10" is before "7.0" :)
+			'ltr': {
+				'msie': [['>=', 7.0]],
+				'firefox': [['>=', 2]],
+				'opera': [['>=', 9.6]],
+				'safari': [['>=', 3]],
+				'chrome': [['>=', 3]],
+				'netscape': [['>=', 9]],
+				'blackberry': false,
+				'ipod': false,
+				'iphone': false
+			},
+			'rtl': {
+				'msie': [['>=', 8]],
+				'firefox': [['>=', 2]],
+				'opera': [['>=', 9.6]],
+				'safari': [['>=', 3]],
+				'chrome': [['>=', 3]],
+				'netscape': [['>=', 9]],
+				'blackberry': false,
+				'ipod': false,
+				'iphone': false
+			}
+		}
+	;
 
-		// Loop through and run tests
-		$.each( uas, uaTest );
+	// Count test cases
+	$.each( uas, function () {
+		uacount++;
 	} );
 
-	QUnit.test( 'profile return validation for current user agent', 7, function ( assert ) {
+	QUnit.test( 'profile( navObject )', 7, function ( assert ) {
 		var p = $.client.profile();
 
 		function unknownOrType( val, type, summary ) {
@@ -312,44 +465,58 @@
 		assert.equal( typeof p.versionNumber, 'number', 'p.versionNumber is a number' );
 	} );
 
-	// Example from WikiEditor
-	// Make sure to use raw numbers, a string like "7.0" would fail on a
-	// version 10 browser since in string comparaison "10" is before "7.0" :)
-	testMap = {
-		'ltr': {
-			'msie': [['>=', 7.0]],
-			'firefox': [['>=', 2]],
-			'opera': [['>=', 9.6]],
-			'safari': [['>=', 3]],
-			'chrome': [['>=', 3]],
-			'netscape': [['>=', 9]],
-			'blackberry': false,
-			'ipod': false,
-			'iphone': false
-		},
-		'rtl': {
-			'msie': [['>=', 8]],
-			'firefox': [['>=', 2]],
-			'opera': [['>=', 9.6]],
-			'safari': [['>=', 3]],
-			'chrome': [['>=', 3]],
-			'netscape': [['>=', 9]],
-			'blackberry': false,
-			'ipod': false,
-			'iphone': false
-		}
-	};
+	QUnit.test( 'profile( navObject ) - samples', uacount, function ( assert ) {
+		// Loop through and run tests
+		$.each( uas, function ( rawUserAgent, data ) {
+			// Generate a client profile object and compare recursively
+			var ret = $.client.profile( {
+				userAgent: rawUserAgent,
+				platform: data.platform
+			} );
+			assert.deepEqual( ret, data.profile, 'Client profile support check for ' + data.title + ' (' + data.platform + '): ' + rawUserAgent );
+		} );
+	} );
 
-	QUnit.test( 'test', 1, function ( assert ) {
+	QUnit.test( 'test( testMap )', 4, function ( assert ) {
 		// .test() uses eval, make sure no exceptions are thrown
 		// then do a basic return value type check
-		var testMatch = $.client.test( testMap );
+		var testMatch = $.client.test( testMap ),
+			ie7Profile = $.client.profile( {
+				'userAgent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
+				'platform': ''
+			} );
+
+		assert.equal( typeof testMatch, 'boolean', 'map with ltr/rtl split returns a boolean value' );
+
+		testMatch = $.client.test( testMap.ltr );
+
+		assert.equal( typeof testMatch, 'boolean', 'simple map (without ltr/rtl split) returns a boolean value' );
+
+		assert.equal( $.client.test( {
+			'msie': null
+		}, ie7Profile ), true, 'returns true if any version of a browser are allowed (null)' );
+
+		assert.equal( $.client.test( {
+			'msie': false
+		}, ie7Profile ), false, 'returns false if all versions of a browser are not allowed (false)' );
+	} );
+
+	QUnit.test( 'test( testMap, exactMatchOnly )', 2, function ( assert ) {
+		var ie7Profile = $.client.profile( {
+			'userAgent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
+			'platform': ''
+		} );
 
-		assert.equal( typeof testMatch, 'boolean', 'test returns a boolean value' );
+		assert.equal( $.client.test( {
+			'firefox': [['>=', 2]]
+		}, ie7Profile, false ), true, 'returns true if browser not found and exactMatchOnly not set' );
 
+		assert.equal( $.client.test( {
+			'firefox': [['>=', 2]]
+		}, ie7Profile, true ), false, 'returns false if browser not found and exactMatchOnly is set' );
 	} );
 
-	QUnit.test( 'User-agent matches against WikiEditor\'s compatibility map', uacount * 2, function ( assert ) {
+	QUnit.test( 'test( testMap) - WikiEditor sample', uacount * 2, function ( assert ) {
 		var $body = $( 'body' ),
 			bodyClasses = $body.attr( 'class' );
 
diff --git a/tests/qunit/suites/resources/jquery/jquery.localize.test.js b/tests/qunit/suites/resources/jquery/jquery.localize.test.js
index d3877e05..3ef27903 100644
--- a/tests/qunit/suites/resources/jquery/jquery.localize.test.js
+++ b/tests/qunit/suites/resources/jquery/jquery.localize.test.js
@@ -38,7 +38,7 @@
 		// making sure it is actually using text() and attr() (or something with the same effect)
 
 		// Text escaping
-		html = '<div><span><html:msg key="properfoo"></span></div>';
+		html = '<div><span><html:msg key="properfoo" /></span></div>';
 		$lc = $( html ).localize().find( 'span' );
 
 		assert.strictEqual( $lc.text(), mw.msg( 'properfoo' ), 'Content is inserted as text, not as html.' );
@@ -63,7 +63,7 @@
 		var html, $lc, x, sitename = 'Wikipedia';
 
 		// Message key prefix
-		html = '<div><span title-msg="lorem"><html:msg key="ipsum"></span></div>';
+		html = '<div><span title-msg="lorem"><html:msg key="ipsum" /></span></div>';
 		$lc = $( html ).localize( {
 			prefix: 'foo-'
 		} ).find( 'span' );
@@ -73,7 +73,7 @@
 
 		// Variable keys mapping
 		x = 'bar';
-		html = '<div><span title-msg="title"><html:msg key="label"></span></div>';
+		html = '<div><span title-msg="title"><html:msg key="label" /></span></div>';
 		$lc = $( html ).localize( {
 			keys: {
 				'title': 'foo-' + x + '-title',
@@ -85,7 +85,7 @@
 		assert.strictEqual( $lc.text(), 'The Bars', 'Variable keys mapping - text' );
 
 		// Passing parameteters to mw.msg
-		html = '<div><span><html:msg key="foo-welcome"></span></div>';
+		html = '<div><span><html:msg key="foo-welcome" /></span></div>';
 		$lc = $( html ).localize( {
 			params: {
 				'foo-welcome': [sitename, 'yesterday']
@@ -96,7 +96,7 @@
 
 		// Combination of options prefix, params and keys
 		x = 'bazz';
-		html = '<div><span title-msg="title"><html:msg key="label"></span></div>';
+		html = '<div><span title-msg="title"><html:msg key="label" /></span></div>';
 		$lc = $( html ).localize( {
 			prefix: 'foo-',
 			keys: {
diff --git a/tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js b/tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
new file mode 100644
index 00000000..6da56ed2
--- /dev/null
+++ b/tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
@@ -0,0 +1,287 @@
+( function ( mw, $ ) {
+	var loremIpsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.';
+
+	QUnit.module( 'jquery.makeCollapsible', QUnit.newMwEnvironment() );
+
+	function prepareCollapsible( html, options ) {
+		return $( $.parseHTML( html ) )
+			.appendTo( '#qunit-fixture' )
+			// options might be undefined here - this is okay
+			.makeCollapsible( options );
+	}
+
+	// This test is first because if it fails, then almost all of the latter tests are meaningless.
+	QUnit.asyncTest( 'testing hooks/triggers', 4, function ( assert ) {
+		var $collapsible, $content, $toggle;
+		$collapsible = prepareCollapsible(
+			'<div class="mw-collapsible">' + loremIpsum + '</div>'
+		);
+		$content = $collapsible.find( '.mw-collapsible-content' );
+		$toggle = $collapsible.find( '.mw-collapsible-toggle' );
+
+		// In one full collapse-expand cycle, each event will be fired once
+
+		// On collapse...
+		$collapsible.on( 'beforeCollapse.mw-collapsible', function () {
+			assert.assertTrue( $content.is( ':visible' ), 'first beforeCollapseExpand: content is visible' );
+		} );
+		$collapsible.on( 'afterCollapse.mw-collapsible', function () {
+			assert.assertTrue( $content.is( ':hidden' ), 'first afterCollapseExpand: content is hidden' );
+
+			// On expand...
+			$collapsible.on( 'beforeExpand.mw-collapsible', function () {
+				assert.assertTrue( $content.is( ':hidden' ), 'second beforeCollapseExpand: content is hidden' );
+			} );
+			$collapsible.on( 'afterExpand.mw-collapsible', function () {
+				assert.assertTrue( $content.is( ':visible' ), 'second afterCollapseExpand: content is visible' );
+
+				QUnit.start();
+			} );
+
+			// ...expanding happens here
+			$toggle.trigger( 'click' );
+		} );
+
+		// ...collapsing happens here
+		$toggle.trigger( 'click' );
+	} );
+
+	QUnit.asyncTest( 'basic operation (<div>)', 5, function ( assert ) {
+		var $collapsible, $content, $toggle;
+		$collapsible = prepareCollapsible(
+			'<div class="mw-collapsible">' + loremIpsum + '</div>'
+		);
+		$content = $collapsible.find( '.mw-collapsible-content' );
+		$toggle = $collapsible.find( '.mw-collapsible-toggle' );
+
+		assert.equal( $content.length, 1, 'content is present' );
+		assert.equal( $content.find( $toggle ).length, 0, 'toggle is not a descendant of content' );
+
+		assert.assertTrue( $content.is( ':visible' ), 'content is visible' );
+
+		$collapsible.on( 'afterCollapse.mw-collapsible', function () {
+			assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' );
+
+			$collapsible.on( 'afterExpand.mw-collapsible', function () {
+				assert.assertTrue( $content.is( ':visible' ), 'after expanding: content is visible' );
+				QUnit.start();
+			} );
+
+			$toggle.trigger( 'click' );
+		} );
+
+		$toggle.trigger( 'click' );
+	} );
+
+	QUnit.asyncTest( 'basic operation (<table>)', 7, function ( assert ) {
+		var $collapsible, $headerRow, $contentRow, $toggle;
+		$collapsible = prepareCollapsible(
+			'<table class="mw-collapsible">' +
+				'<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
+				'<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
+				'<tr><td>' + loremIpsum + '</td><td>' + loremIpsum + '</td></tr>' +
+			'</table>'
+		);
+		$headerRow = $collapsible.find( 'tr:first' );
+		$contentRow = $collapsible.find( 'tr:last' );
+
+		$toggle = $headerRow.find( 'td:last .mw-collapsible-toggle' );
+		assert.equal( $toggle.length, 1, 'toggle is added to last cell of first row' );
+
+		assert.assertTrue( $headerRow.is( ':visible' ), 'headerRow is visible' );
+		assert.assertTrue( $contentRow.is( ':visible' ), 'contentRow is visible' );
+
+		$collapsible.on( 'afterCollapse.mw-collapsible', function () {
+			assert.assertTrue( $headerRow.is( ':visible' ), 'after collapsing: headerRow is still visible' );
+			assert.assertTrue( $contentRow.is( ':hidden' ), 'after collapsing: contentRow is hidden' );
+
+			$collapsible.on( 'afterExpand.mw-collapsible', function () {
+				assert.assertTrue( $headerRow.is( ':visible' ), 'after expanding: headerRow is still visible' );
+				assert.assertTrue( $contentRow.is( ':visible' ), 'after expanding: contentRow is visible' );
+				QUnit.start();
+			} );
+
+			$toggle.trigger( 'click' );
+		} );
+
+		$toggle.trigger( 'click' );
+	} );
+
+	function listTest( listType, assert ) {
+		var $collapsible, $toggleItem, $contentItem, $toggle;
+		$collapsible = prepareCollapsible(
+			'<' + listType + ' class="mw-collapsible">' +
+				'<li>' + loremIpsum + '</li>' +
+				'<li>' + loremIpsum + '</li>' +
+			'</' + listType + '>'
+		);
+		$toggleItem = $collapsible.find( 'li.mw-collapsible-toggle-li:first-child' );
+		$contentItem = $collapsible.find( 'li:last' );
+
+		$toggle = $toggleItem.find( '.mw-collapsible-toggle' );
+		assert.equal( $toggle.length, 1, 'toggle is present, added inside new zeroth list item' );
+
+		assert.assertTrue( $toggleItem.is( ':visible' ), 'toggleItem is visible' );
+		assert.assertTrue( $contentItem.is( ':visible' ), 'contentItem is visible' );
+
+		$collapsible.on( 'afterCollapse.mw-collapsible', function () {
+			assert.assertTrue( $toggleItem.is( ':visible' ), 'after collapsing: toggleItem is still visible' );
+			assert.assertTrue( $contentItem.is( ':hidden' ), 'after collapsing: contentItem is hidden' );
+
+			$collapsible.on( 'afterExpand.mw-collapsible', function () {
+				assert.assertTrue( $toggleItem.is( ':visible' ), 'after expanding: toggleItem is still visible' );
+				assert.assertTrue( $contentItem.is( ':visible' ), 'after expanding: contentItem is visible' );
+				QUnit.start();
+			} );
+
+			$toggle.trigger( 'click' );
+		} );
+
+		$toggle.trigger( 'click' );
+	}
+
+	QUnit.asyncTest( 'basic operation (<ul>)', 7, function ( assert ) {
+		listTest( 'ul', assert );
+	} );
+
+	QUnit.asyncTest( 'basic operation (<ol>)', 7, function ( assert ) {
+		listTest( 'ol', assert );
+	} );
+
+	QUnit.test( 'basic operation when synchronous (options.instantHide)', 2, function ( assert ) {
+		var $collapsible, $content;
+		$collapsible = prepareCollapsible(
+			'<div class="mw-collapsible">' + loremIpsum + '</div>',
+			{ instantHide: true }
+		);
+		$content = $collapsible.find( '.mw-collapsible-content' );
+
+		assert.assertTrue( $content.is( ':visible' ), 'content is visible' );
+
+		$collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+
+		assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' );
+	} );
+
+	QUnit.test( 'mw-made-collapsible data added', 1, function ( assert ) {
+		var $collapsible;
+		$collapsible = prepareCollapsible(
+			'<div>' + loremIpsum + '</div>'
+		);
+		assert.equal( $collapsible.data( 'mw-made-collapsible' ), true, 'mw-made-collapsible data present' );
+	} );
+
+	QUnit.test( 'mw-collapsible added when missing', 1, function ( assert ) {
+		var $collapsible;
+		$collapsible = prepareCollapsible(
+			'<div>' + loremIpsum + '</div>'
+		);
+		assert.assertTrue( $collapsible.hasClass( 'mw-collapsible' ), 'mw-collapsible class present' );
+	} );
+
+	QUnit.test( 'mw-collapsed added when missing', 1, function ( assert ) {
+		var $collapsible;
+		$collapsible = prepareCollapsible(
+			'<div>' + loremIpsum + '</div>',
+			{ collapsed: true }
+		);
+		assert.assertTrue( $collapsible.hasClass( 'mw-collapsed' ), 'mw-collapsed class present' );
+	} );
+
+	QUnit.asyncTest( 'initial collapse (mw-collapsed class)', 2, function ( assert ) {
+		var $collapsible, $content;
+		$collapsible = prepareCollapsible(
+			'<div class="mw-collapsible mw-collapsed">' + loremIpsum + '</div>'
+		);
+		$content = $collapsible.find( '.mw-collapsible-content' );
+
+		// Synchronous - mw-collapsed should cause instantHide: true to be used on initial collapsing
+		assert.assertTrue( $content.is( ':hidden' ), 'content is hidden' );
+
+		$collapsible.on( 'afterExpand.mw-collapsible', function () {
+			assert.assertTrue( $content.is( ':visible' ), 'after expanding: content is visible' );
+			QUnit.start();
+		} );
+
+		$collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+	} );
+
+	QUnit.asyncTest( 'initial collapse (options.collapsed)', 2, function ( assert ) {
+		var $collapsible, $content;
+		$collapsible = prepareCollapsible(
+			'<div class="mw-collapsible">' + loremIpsum + '</div>',
+			{ collapsed: true }
+		);
+		$content = $collapsible.find( '.mw-collapsible-content' );
+
+		// Synchronous - collapsed: true should cause instantHide: true to be used on initial collapsing
+		assert.assertTrue( $content.is( ':hidden' ), 'content is hidden' );
+
+		$collapsible.on( 'afterExpand.mw-collapsible', function () {
+			assert.assertTrue( $content.is( ':visible' ), 'after expanding: content is visible' );
+			QUnit.start();
+		} );
+
+		$collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+	} );
+
+	QUnit.test( 'clicks on links inside toggler pass through (options.linksPassthru)' , 2, function ( assert ) {
+		var $collapsible, $content;
+
+		$collapsible = prepareCollapsible(
+			'<div class="mw-collapsible">' +
+				'<div class="mw-collapsible-toggle">' +
+					'Toggle <a href="#top">toggle</a> toggle <b>toggle</b>' +
+				'</div>' +
+				'<div class="mw-collapsible-content">' + loremIpsum + '</div>' +
+			'</div>',
+			// Can't do asynchronous because we're testing that the event *doesn't* happen
+			{ instantHide: true }
+		);
+		$content = $collapsible.find( '.mw-collapsible-content' );
+
+		$collapsible.find( '.mw-collapsible-toggle a' ).trigger( 'click' );
+		assert.assertTrue( $content.is( ':visible' ), 'click event on link inside toggle passes through (content not toggled)' );
+
+		$collapsible.find( '.mw-collapsible-toggle b' ).trigger( 'click' );
+		assert.assertTrue( $content.is( ':hidden' ), 'click event on non-link inside toggle toggles content' );
+	} );
+
+	QUnit.asyncTest( 'collapse/expand text (data-collapsetext, data-expandtext)', 2, function ( assert ) {
+		var $collapsible, $toggleLink;
+		$collapsible = prepareCollapsible(
+			'<div class="mw-collapsible" data-collapsetext="Collapse me!" data-expandtext="Expand me!">' +
+				loremIpsum +
+			'</div>'
+		);
+		$toggleLink = $collapsible.find( '.mw-collapsible-toggle a' );
+
+		assert.equal( $toggleLink.text(), 'Collapse me!', 'data-collapsetext is respected' );
+
+		$collapsible.on( 'afterCollapse.mw-collapsible', function () {
+			assert.equal( $toggleLink.text(), 'Expand me!', 'data-expandtext is respected' );
+			QUnit.start();
+		} );
+
+		$collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+	} );
+
+	QUnit.asyncTest( 'collapse/expand text (options.collapseText, options.expandText)', 2, function ( assert ) {
+		var $collapsible, $toggleLink;
+		$collapsible = prepareCollapsible(
+			'<div class="mw-collapsible">' + loremIpsum + '</div>',
+			{ collapseText: 'Collapse me!', expandText: 'Expand me!' }
+		);
+		$toggleLink = $collapsible.find( '.mw-collapsible-toggle a' );
+
+		assert.equal( $toggleLink.text(), 'Collapse me!', 'options.collapseText is respected' );
+
+		$collapsible.on( 'afterCollapse.mw-collapsible', function () {
+			assert.equal( $toggleLink.text(), 'Expand me!', 'options.expandText is respected' );
+			QUnit.start();
+		} );
+
+		$collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+	} );
+
+}( mediaWiki, jQuery ) );
diff --git a/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js b/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
index 307b0440..f73fd7bf 100644
--- a/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
+++ b/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
@@ -5,6 +5,8 @@
 		wgMonthNames: ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
 		wgMonthNamesShort: ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
 		wgDefaultDateFormat: 'dmy',
+		wgSeparatorTransformTable: ['', ''],
+		wgDigitTransformTable: ['', ''],
 		wgContentLanguage: 'en'
 	};
 
@@ -179,6 +181,18 @@
 			$table.find( '.headerSort:eq(0)' ).click();
 		}
 	);
+	tableTest(
+		'Basic planet table: ascending by name (multiple clicks)',
+		header,
+		planets,
+		ascendingName,
+		function ( $table ) {
+			$table.tablesorter();
+			$table.find( '.headerSort:eq(0)' ).click();
+			$table.find( '.headerSort:eq(1)' ).click();
+			$table.find( '.headerSort:eq(0)' ).click();
+		}
+	);
 	tableTest(
 		'Basic planet table: descending by name',
 		header,
@@ -273,6 +287,35 @@
 			$table.data( 'tablesorter' ).sort();
 		}
 	);
+	tableTest(
+		'Sort via click event after having initialized the tablesorter with initial sorting',
+		header,
+		initial,
+		descasc,
+		function ( $table ) {
+			$table.tablesorter(
+				{ sortList: [ { 0: 'asc' }, { 1: 'asc' } ] }
+			);
+			$table.find( '.headerSort:eq(0)' ).click();
+		}
+	);
+	tableTest(
+		'Multi-sort via click event after having initialized the tablesorter with initial sorting',
+		header,
+		initial,
+		asc,
+		function ( $table ) {
+			$table.tablesorter(
+				{ sortList: [ { 0: 'desc' }, { 1: 'desc' } ] }
+			);
+			$table.find( '.headerSort:eq(0)' ).click();
+
+			// Pretend to click while pressing the multi-sort key
+			var event = $.Event( 'click' );
+			event[$table.data( 'tablesorter' ).config.sortMultiSortKey] = true;
+			$table.find( '.headerSort:eq(1)' ).trigger( event );
+		}
+	);
 	QUnit.test( 'Reset sorting making table appear unsorted', 3, function ( assert ) {
 		var $table = tableCreate( header, initial );
 		$table.tablesorter(
@@ -319,12 +362,26 @@
 		function ( $table ) {
 			// Make colspanned header for test
 			$table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove();
-			$table.find( 'tr:eq(0) th:eq(0)' ).prop( 'colspan', '3' );
+			$table.find( 'tr:eq(0) th:eq(0)' ).attr( 'colspan', '3' );
 
 			$table.tablesorter();
 			$table.find( '.headerSort:eq(0)' ).click();
 		}
 	);
+	tableTest( 'Sorting with colspanned headers: sort spanned column twice',
+		header,
+		initial,
+		[ caa4, bbc2, abc3, aab5, aaa1 ],
+		function ( $table ) {
+			// Make colspanned header for test
+			$table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove();
+			$table.find( 'tr:eq(0) th:eq(0)' ).attr( 'colspan', '3' );
+
+			$table.tablesorter();
+			$table.find( '.headerSort:eq(0)' ).click();
+			$table.find( '.headerSort:eq(0)' ).click();
+		}
+	);
 	tableTest( 'Sorting with colspanned headers: subsequent column',
 		header,
 		initial,
@@ -332,12 +389,40 @@
 		function ( $table ) {
 			// Make colspanned header for test
 			$table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove();
-			$table.find( 'tr:eq(0) th:eq(0)' ).prop( 'colspan', '3' );
+			$table.find( 'tr:eq(0) th:eq(0)' ).attr( 'colspan', '3' );
 
 			$table.tablesorter();
 			$table.find( '.headerSort:eq(1)' ).click();
 		}
 	);
+	tableTest( 'Sorting with colspanned headers: sort subsequent column twice',
+		header,
+		initial,
+		[ aab5, caa4, abc3, bbc2, aaa1 ],
+		function ( $table ) {
+			// Make colspanned header for test
+			$table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove();
+			$table.find( 'tr:eq(0) th:eq(0)' ).attr( 'colspan', '3' );
+
+			$table.tablesorter();
+			$table.find( '.headerSort:eq(1)' ).click();
+			$table.find( '.headerSort:eq(1)' ).click();
+		}
+	);
+
+
+	tableTest(
+		'Basic planet table: one unsortable column',
+		header,
+		planets,
+		planets,
+		function ( $table ) {
+			$table.find( 'tr:eq(0) > th:eq(0)' ).addClass( 'unsortable' );
+
+			$table.tablesorter();
+			$table.find( 'tr:eq(0) > th:eq(0)' ).click();
+		}
+	);
 
 	// Regression tests!
 	tableTest(
@@ -489,12 +574,12 @@
 		$table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove();
 		// - Set rowspan for 2nd cell of 3rd row to 3.
 		//   This covers the removed cell in the 4th and 5th row.
-		$table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan', '3' );
+		$table.find( 'tr:eq(2) td:eq(1)' ).attr( 'rowspan', '3' );
 
 		$table.tablesorter();
 
 		assert.equal(
-			$table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan' ),
+			$table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowSpan' ),
 			3,
 			'Rowspan not exploded'
 		);
@@ -521,7 +606,7 @@
 			$table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove();
 			// - Set rowspan for 2nd cell of 3rd row to 3.
 			//   This covers the removed cell in the 4th and 5th row.
-			$table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan', '3' );
+			$table.find( 'tr:eq(2) td:eq(1)' ).attr( 'rowspan', '3' );
 
 			$table.tablesorter();
 			$table.find( '.headerSort:eq(0)' ).click();
@@ -538,7 +623,7 @@
 			$table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove();
 			// - Set rowspan for 2nd cell of 3rd row to 3.
 			//   This covers the removed cell in the 4th and 5th row.
-			$table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan', '3' );
+			$table.find( 'tr:eq(2) td:eq(1)' ).attr( 'rowspan', '3' );
 
 			$table.tablesorter( { sortList: [
 				{ 0: 'asc' }
@@ -556,7 +641,7 @@
 			$table.find( 'tr:eq(3) td:eq(0), tr:eq(4) td:eq(0)' ).remove();
 			// - Set rowspan for 1st cell of 3rd row to 3.
 			//   This covers the removed cell in the 4th and 5th row.
-			$table.find( 'tr:eq(2) td:eq(0)' ).prop( 'rowspan', '3' );
+			$table.find( 'tr:eq(2) td:eq(0)' ).attr( 'rowspan', '3' );
 
 			$table.tablesorter();
 			$table.find( '.headerSort:eq(0)' ).click();
@@ -642,7 +727,7 @@
 		}
 	);
 
-	QUnit.test( 'Test detection routine', function ( assert ) {
+	QUnit.test( 'Test detection routine', 1, function ( assert ) {
 		var $table;
 		$table = $(
 			'<table class="sortable">' +
@@ -663,7 +748,7 @@
 	} );
 
 	/** FIXME: the diff output is not very readeable. */
-	QUnit.test( 'bug 32047 - caption must be before thead', function ( assert ) {
+	QUnit.test( 'bug 32047 - caption must be before thead', 1, function ( assert ) {
 		var $table;
 		$table = $(
 			'<table class="sortable">' +
@@ -683,7 +768,7 @@
 		);
 	} );
 
-	QUnit.test( 'data-sort-value attribute, when available, should override sorting position', function ( assert ) {
+	QUnit.test( 'data-sort-value attribute, when available, should override sorting position', 3, function ( assert ) {
 		var $table, data;
 
 		// Example 1: All cells except one cell without data-sort-value,
@@ -953,7 +1038,7 @@
 		}
 	);
 
-	QUnit.test( 'Sorting images using alt text', function ( assert ) {
+	QUnit.test( 'Sorting images using alt text', 1, function ( assert ) {
 		var $table = $(
 			'<table class="sortable">' +
 				'<tr><th>THEAD</th></tr>' +
@@ -970,7 +1055,7 @@
 		);
 	} );
 
-	QUnit.test( 'Sorting images using alt text (complex)', function ( assert ) {
+	QUnit.test( 'Sorting images using alt text (complex)', 1, function ( assert ) {
 		var $table = $(
 			'<table class="sortable">' +
 				'<tr><th>THEAD</th></tr>' +
@@ -991,7 +1076,7 @@
 		);
 	} );
 
-	QUnit.test( 'Sorting images using alt text (with format autodetection)', function ( assert ) {
+	QUnit.test( 'Sorting images using alt text (with format autodetection)', 1, function ( assert ) {
 		var $table = $(
 			'<table class="sortable">' +
 				'<tr><th>THEAD</th></tr>' +
@@ -1010,6 +1095,61 @@
 		);
 	} );
 
+	QUnit.test( 'bug 38911 - The row with the largest amount of columns should receive the sort indicators', 3, function ( assert ) {
+		var $table = $(
+			'<table class="sortable">' +
+				'<thead>' +
+				'<tr><th rowspan="2" id="A1">A1</th><th colspan="2">B2a</th></tr>' +
+				'<tr><th id="B2b">B2b</th><th id="C2b">C2b</th></tr>' +
+				'</thead>' +
+				'<tr><td>A</td><td>Aa</td><td>Ab</td></tr>' +
+				'<tr><td>B</td><td>Ba</td><td>Bb</td></tr>' +
+				'</table>'
+		);
+		$table.tablesorter();
+
+		assert.equal(
+			$table.find( '#A1' ).attr( 'class' ),
+			'headerSort',
+			'The first column of the first row should be sortable'
+		);
+		assert.equal(
+			$table.find( '#B2b' ).attr( 'class' ),
+			'headerSort',
+			'The th element of the 2nd row of the 2nd column should be sortable'
+		);
+		assert.equal(
+			$table.find( '#C2b' ).attr( 'class' ),
+			'headerSort',
+			'The th element of the 2nd row of the 3rd column should be sortable'
+		);
+	} );
+
+	QUnit.test( 'rowspans in table headers should prefer the last row when rows are equal in length', 2, function ( assert ) {
+		var $table = $(
+			'<table class="sortable">' +
+				'<thead>' +
+				'<tr><th rowspan="2" id="A1">A1</th><th>B2a</th></tr>' +
+				'<tr><th id="B2b">B2b</th></tr>' +
+				'</thead>' +
+				'<tr><td>A</td><td>Aa</td></tr>' +
+				'<tr><td>B</td><td>Ba</td></tr>' +
+				'</table>'
+		);
+		$table.tablesorter();
+
+		assert.equal(
+			$table.find( '#A1' ).attr( 'class' ),
+			'headerSort',
+			'The first column of the first row should be sortable'
+		);
+		assert.equal(
+			$table.find( '#B2b' ).attr( 'class' ),
+			'headerSort',
+			'The th element of the 2nd row of the 2nd column should be sortable'
+		);
+	} );
+
 	// bug 41889 - exploding rowspans in more complex cases
 	tableTestHTML(
 		'Rowspan exploding with row headers',
diff --git a/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js b/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
index ce03b697..5fe23944 100644
--- a/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
+++ b/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
@@ -48,13 +48,6 @@
 
 			var start = opt.before.start,
 				end = opt.before.end;
-			if ( window.opera ) {
-				// Compensate for Opera's craziness converting \n to \r\n and counting that as two chars
-				var newLinesBefore = opt.before.text.substring( 0, start ).split( '\n' ).length - 1,
-					newLinesInside = opt.before.text.substring( start, end ).split( '\n' ).length - 1;
-				start += newLinesBefore;
-				end += newLinesBefore + newLinesInside;
-			}
 
 			var options = $.extend( {}, opt.replace ); // Clone opt.replace
 			options.selectionStart = start;
diff --git a/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js b/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
index 9389651f..ee854aef 100644
--- a/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
+++ b/tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
@@ -3,7 +3,7 @@
 
 	// TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
 
-	QUnit.test( '"all" namespace disable checkboxes', function ( assert ) {
+	QUnit.test( '"all" namespace disable checkboxes', 8, function ( assert ) {
 		var selectHtml, $env, $options;
 
 		// from Special:Recentchanges
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
index 30a31ef7..ab96f753 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function ( mw, $ ) {
 	// mw.Title relies on these three config vars
 	// Restore them after each test run
 	var config = {
@@ -53,49 +53,184 @@
 			antarctic_waterfowl: 100
 		},
 		wgCaseSensitiveNamespaces: []
+	},
+	repeat = function ( input, multiplier ) {
+		return new Array( multiplier + 1 ).join( input );
+	},
+	cases = {
+		// See also TitleTest.php#testSecureAndSplit
+		valid: [
+			'Sandbox',
+			'A "B"',
+			'A \'B\'',
+			'.com',
+			'~',
+			'"',
+			'\'',
+			'Talk:Sandbox',
+			'Talk:Foo:Sandbox',
+			'File:Example.svg',
+			'File_talk:Example.svg',
+			'Foo/.../Sandbox',
+			'Sandbox/...',
+			'A~~',
+			// Length is 256 total, but only title part matters
+			'Category:' + repeat( 'x', 248 ),
+			repeat( 'x', 252 )
+		],
+		invalid: [
+			'',
+			'__  __',
+			'  __  ',
+			// Bad characters forbidden regardless of wgLegalTitleChars
+			'A [ B',
+			'A ] B',
+			'A { B',
+			'A } B',
+			'A < B',
+			'A > B',
+			'A | B',
+			// URL encoding
+			'A%20B',
+			'A%23B',
+			'A%2523B',
+			// XML/HTML character entity references
+			// Note: The ones with # are commented out as those are interpreted as fragment and
+			// as such end up being valid.
+			'A &eacute; B',
+			//'A &#233; B',
+			//'A &#x00E9; B',
+			// Subject of NS_TALK does not roundtrip to NS_MAIN
+			'Talk:File:Example.svg',
+			// Directory navigation
+			'.',
+			'..',
+			'./Sandbox',
+			'../Sandbox',
+			'Foo/./Sandbox',
+			'Foo/../Sandbox',
+			'Sandbox/.',
+			'Sandbox/..',
+			// Tilde
+			'A ~~~ Name',
+			'A ~~~~ Signature',
+			'A ~~~~~ Timestamp',
+			repeat( 'x', 256 ),
+			// Extension separation is a js invention, for length
+			// purposes it is part of the title
+			repeat( 'x', 252 ) + '.json',
+			// Namespace prefix without actual title
+			// ':', // bug 54044
+			'Talk:',
+			'Category: ',
+			'Category: #bar'
+		]
 	};
 
 	QUnit.module( 'mediawiki.Title', QUnit.newMwEnvironment( { config: config } ) );
 
-	QUnit.test( 'Transformation', 8, function ( assert ) {
+	QUnit.test( 'constructor', cases.invalid.length, function ( assert ) {
+		var i, title;
+		for ( i = 0; i < cases.valid.length; i++ ) {
+			title = new mw.Title( cases.valid[i] );
+		}
+		for ( i = 0; i < cases.invalid.length; i++ ) {
+			/*jshint loopfunc:true */
+			title = cases.invalid[i];
+			assert.throws( function () {
+				return new mw.Title( title );
+			}, cases.invalid[i] );
+		}
+	} );
+
+	QUnit.test( 'newFromText', cases.valid.length + cases.invalid.length, function ( assert ) {
+		var i;
+		for ( i = 0; i < cases.valid.length; i++ ) {
+			assert.equal(
+				$.type( mw.Title.newFromText( cases.valid[i] ) ),
+				'object',
+				cases.valid[i]
+			);
+		}
+		for ( i = 0; i < cases.invalid.length; i++ ) {
+			assert.equal(
+				$.type( mw.Title.newFromText( cases.invalid[i] ) ),
+				'null',
+				cases.invalid[i]
+			);
+		}
+	} );
+
+	QUnit.test( 'Basic parsing', 12, function ( assert ) {
+		var title;
+		title = new mw.Title( 'File:Foo_bar.JPG' );
+
+		assert.equal( title.getNamespaceId(), 6 );
+		assert.equal( title.getNamespacePrefix(), 'File:' );
+		assert.equal( title.getName(), 'Foo_bar' );
+		assert.equal( title.getNameText(), 'Foo bar' );
+		assert.equal( title.getExtension(), 'JPG' );
+		assert.equal( title.getDotExtension(), '.JPG' );
+		assert.equal( title.getMain(), 'Foo_bar.JPG' );
+		assert.equal( title.getMainText(), 'Foo bar.JPG' );
+		assert.equal( title.getPrefixedDb(), 'File:Foo_bar.JPG' );
+		assert.equal( title.getPrefixedText(), 'File:Foo bar.JPG' );
+
+		title = new mw.Title( 'Foo#bar' );
+		assert.equal( title.getPrefixedText(), 'Foo' );
+		assert.equal( title.getFragment(), 'bar' );
+	} );
+
+	QUnit.test( 'Transformation', 11, function ( assert ) {
 		var title;
 
 		title = new mw.Title( 'File:quux pif.jpg' );
-		assert.equal( title.getName(), 'Quux_pif' );
+		assert.equal( title.getNameText(), 'Quux pif', 'First character of title' );
 
 		title = new mw.Title( 'File:Glarg_foo_glang.jpg' );
-		assert.equal( title.getNameText(), 'Glarg foo glang' );
+		assert.equal( title.getNameText(), 'Glarg foo glang', 'Underscores' );
 
 		title = new mw.Title( 'User:ABC.DEF' );
-		assert.equal( title.toText(), 'User:ABC.DEF' );
-		assert.equal( title.getNamespaceId(), 2 );
-		assert.equal( title.getNamespacePrefix(), 'User:' );
+		assert.equal( title.toText(), 'User:ABC.DEF', 'Round trip text' );
+		assert.equal( title.getNamespaceId(), 2, 'Parse canonical namespace prefix' );
+
+		title = new mw.Title( 'Image:quux pix.jpg' );
+		assert.equal( title.getNamespacePrefix(), 'File:', 'Transform alias to canonical namespace' );
 
 		title = new mw.Title( 'uSEr:hAshAr' );
 		assert.equal( title.toText(), 'User:HAshAr' );
-		assert.equal( title.getNamespaceId(), 2 );
+		assert.equal( title.getNamespaceId(), 2, 'Case-insensitive namespace prefix' );
 
-		title = new mw.Title( '   MediaWiki:  Foo   bar   .js   ' );
-		// Don't ask why, it's the way the backend works. One space is kept of each set
-		assert.equal( title.getName(), 'Foo_bar_.js', 'Merge multiple spaces to a single space.' );
-	} );
+		// Don't ask why, it's the way the backend works. One space is kept of each set.
+		title = new mw.Title( 'Foo  __  \t __ bar' );
+		assert.equal( title.getMain(), 'Foo_bar', 'Merge multiple types of whitespace/underscores into a single underscore' );
 
-	QUnit.test( 'Main text for filename', 8, function ( assert ) {
-		var title = new mw.Title( 'File:foo_bar.JPG' );
+		// Regression test: Previously it would only detect an extension if there is no space after it
+		title = new mw.Title( 'Example.js  ' );
+		assert.equal( title.getExtension(), 'js', 'Space after an extension is stripped' );
 
-		assert.equal( title.getNamespaceId(), 6 );
-		assert.equal( title.getNamespacePrefix(), 'File:' );
-		assert.equal( title.getName(), 'Foo_bar' );
-		assert.equal( title.getNameText(), 'Foo bar' );
-		assert.equal( title.getMain(), 'Foo_bar.JPG' );
-		assert.equal( title.getMainText(), 'Foo bar.JPG' );
-		assert.equal( title.getExtension(), 'JPG' );
-		assert.equal( title.getDotExtension(), '.JPG' );
+		title = new mw.Title( 'Example#foo' );
+		assert.equal( title.getFragment(), 'foo', 'Fragment' );
+
+		title = new mw.Title( 'Example#_foo_bar baz_' );
+		assert.equal( title.getFragment(), ' foo bar baz', 'Fragment' );
 	} );
 
-	QUnit.test( 'Namespace detection and conversion', 6, function ( assert ) {
+	QUnit.test( 'Namespace detection and conversion', 10, function ( assert ) {
 		var title;
 
+		title = new mw.Title( 'File:User:Example' );
+		assert.equal( title.getNamespaceId(), 6, 'Titles can contain namespace prefixes, which are otherwise ignored' );
+
+		title = new mw.Title( 'Example', 6 );
+		assert.equal( title.getNamespaceId(), 6, 'Default namespace passed is used' );
+
+		title = new mw.Title( 'User:Example', 6 );
+		assert.equal( title.getNamespaceId(), 2, 'Included namespace prefix overrides the given default' );
+
+		title = new mw.Title( ':Example', 6 );
+		assert.equal( title.getNamespaceId(), 0, 'Colon forces main namespace' );
+
 		title = new mw.Title( 'something.PDF', 6 );
 		assert.equal( title.toString(), 'File:Something.PDF' );
 
@@ -189,10 +324,93 @@
 		mw.config.set( 'wgArticlePath', '/wiki/$1' );
 
 		title = new mw.Title( 'Foobar' );
-		assert.equal( title.getUrl(), '/wiki/Foobar', 'Basic functionally, toString passing to wikiGetlink' );
+		assert.equal( title.getUrl(), '/wiki/Foobar', 'Basic functionally, getUrl uses mw.util.getUrl' );
 
 		title = new mw.Title( 'John Doe', 3 );
 		assert.equal( title.getUrl(), '/wiki/User_talk:John_Doe', 'Escaping in title and namespace for urls' );
 	} );
 
-}( mediaWiki ) );
+	QUnit.test( 'newFromImg', 28, function ( assert ) {
+		var title, i, thisCase, prefix,
+			cases = [
+				{
+					url: '/wiki/images/thumb/9/91/Anticlockwise_heliotrope%27s.jpg/99px-Anticlockwise_heliotrope%27s.jpg',
+					typeOfUrl: 'Normal hashed directory thumbnail',
+					nameText: 'Anticlockwise heliotrope\'s',
+					prefixedText: 'File:Anticlockwise heliotrope\'s.jpg'
+				},
+
+				{
+					url: '//upload.wikimedia.org/wikipedia/commons/thumb/8/80/Wikipedia-logo-v2.svg/150px-Wikipedia-logo-v2.svg.png',
+					typeOfUrl: 'Commons thumbnail',
+					nameText: 'Wikipedia-logo-v2',
+					prefixedText: 'File:Wikipedia-logo-v2.svg'
+				},
+
+				{
+					url: '/wiki/images/9/91/Anticlockwise_heliotrope%27s.jpg',
+					typeOfUrl: 'Full image',
+					nameText: 'Anticlockwise heliotrope\'s',
+					prefixedText: 'File:Anticlockwise heliotrope\'s.jpg'
+				},
+
+				{
+					url: 'http://localhost/thumb.php?f=Stuffless_Figaro%27s.jpg&width=180',
+					typeOfUrl: 'thumb.php-based thumbnail',
+					nameText: 'Stuffless Figaro\'s',
+					prefixedText: 'File:Stuffless Figaro\'s.jpg'
+				},
+
+				{
+					url: '/wikipedia/commons/thumb/Wikipedia-logo-v2.svg/150px-Wikipedia-logo-v2.svg.png',
+					typeOfUrl: 'Commons unhashed thumbnail',
+					nameText: 'Wikipedia-logo-v2',
+					prefixedText: 'File:Wikipedia-logo-v2.svg'
+				},
+
+				{
+					url: '/wiki/images/Anticlockwise_heliotrope%27s.jpg',
+					typeOfUrl: 'Unhashed local file',
+					nameText: 'Anticlockwise heliotrope\'s',
+					prefixedText: 'File:Anticlockwise heliotrope\'s.jpg'
+				},
+
+				{
+					url: '',
+					typeOfUrl: 'Empty string'
+				},
+
+				{
+					url: 'foo',
+					typeOfUrl: 'String with only alphabet characters'
+				},
+
+				{
+					url: 'foobar.foobar',
+					typeOfUrl: 'Not a file path'
+				},
+
+				{
+					url: '/a/a0/blah blah blah',
+					typeOfUrl: 'Space characters'
+				}
+			];
+
+		for ( i = 0; i < cases.length; i++ ) {
+			thisCase = cases[i];
+			title = mw.Title.newFromImg( { src: thisCase.url } );
+
+			if ( thisCase.nameText !== undefined ) {
+				prefix = '[' + thisCase.typeOfUrl + ' URL' + '] ';
+
+				assert.notStrictEqual( title, null, prefix + 'Parses successfully' );
+				assert.equal( title.getNameText(), thisCase.nameText, prefix + 'Filename matches original' );
+				assert.equal( title.getPrefixedText(), thisCase.prefixedText, prefix + 'File page title matches original' );
+				assert.equal( title.getNamespaceId(), 6, prefix + 'Namespace ID matches File namespace' );
+			} else {
+				assert.strictEqual( title, null, thisCase.typeOfUrl + ', should not produce an mw.Title object' );
+			}
+		}
+	} );
+
+}( mediaWiki, jQuery ) );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
index 0a9df966..be362e22 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
@@ -1,20 +1,17 @@
 ( function ( mw, $ ) {
-	var mwLanguageCache = {}, oldGetOuterHtml, formatnumTests, specialCharactersPageName,
+	var mwLanguageCache = {}, formatText, formatParse, formatnumTests, specialCharactersPageName,
 		expectedListUsers, expectedEntrypoints;
 
+	// When the expected result is the same in both modes
+	function assertBothModes( assert, parserArguments, expectedResult, assertMessage ) {
+		assert.equal( formatText.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'text\'' );
+		assert.equal( formatParse.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'parse\'' );
+	}
+
 	QUnit.module( 'mediawiki.jqueryMsg', QUnit.newMwEnvironment( {
 		setup: function () {
 			this.orgMwLangauge = mw.language;
 			mw.language = $.extend( true, {}, this.orgMwLangauge );
-			oldGetOuterHtml = $.fn.getOuterHtml;
-			$.fn.getOuterHtml = function () {
-				var $div = $( '<div>' ), html;
-				$div.append( $( this ).eq( 0 ).clone() );
-				html = $div.html();
-				$div.empty();
-				$div = undefined;
-				return html;
-			};
 
 			// Messages that are reused in multiple tests
 			mw.messages.set( {
@@ -39,18 +36,26 @@
 				'external-link-replace': 'Foo [$1 bar]'
 			} );
 
+			mw.config.set( {
+				wgArticlePath: '/wiki/$1'
+			} );
+
 			specialCharactersPageName = '"Who" wants to be a millionaire & live on \'Exotic Island\'?';
 
-			expectedListUsers = '注册' + $( '<a>' ).attr( {
-				title: 'Special:ListUsers',
-				href: mw.util.wikiGetlink( 'Special:ListUsers' )
-			} ).text( '用户' ).getOuterHtml();
+			expectedListUsers = '注册<a title="Special:ListUsers" href="/wiki/Special:ListUsers">用户</a>';
 
 			expectedEntrypoints = '<a href="https://www.mediawiki.org/wiki/Manual:index.php">index.php</a>';
+
+			formatText = mw.jqueryMsg.getMessageFunction( {
+				format: 'text'
+			} );
+
+			formatParse = mw.jqueryMsg.getMessageFunction( {
+				format: 'parse'
+			} );
 		},
 		teardown: function () {
 			mw.language = this.orgMwLangauge;
-			$.fn.getOuterHtml = oldGetOuterHtml;
 		}
 	} ) );
 
@@ -82,18 +87,16 @@
 	}
 
 	QUnit.test( 'Replace', 9, function ( assert ) {
-		var parser = mw.jqueryMsg.getMessageFunction();
-
 		mw.messages.set( 'simple', 'Foo $1 baz $2' );
 
-		assert.equal( parser( 'simple' ), 'Foo $1 baz $2', 'Replacements with no substitutes' );
-		assert.equal( parser( 'simple', 'bar' ), 'Foo bar baz $2', 'Replacements with less substitutes' );
-		assert.equal( parser( 'simple', 'bar', 'quux' ), 'Foo bar baz quux', 'Replacements with all substitutes' );
+		assert.equal( formatParse( 'simple' ), 'Foo $1 baz $2', 'Replacements with no substitutes' );
+		assert.equal( formatParse( 'simple', 'bar' ), 'Foo bar baz $2', 'Replacements with less substitutes' );
+		assert.equal( formatParse( 'simple', 'bar', 'quux' ), 'Foo bar baz quux', 'Replacements with all substitutes' );
 
 		mw.messages.set( 'plain-input', '<foo foo="foo">x$1y&lt;</foo>z' );
 
 		assert.equal(
-			parser( 'plain-input', 'bar' ),
+			formatParse( 'plain-input', 'bar' ),
 			'&lt;foo foo="foo"&gt;xbary&amp;lt;&lt;/foo&gt;z',
 			'Input is not considered html'
 		);
@@ -101,7 +104,7 @@
 		mw.messages.set( 'plain-replace', 'Foo $1' );
 
 		assert.equal(
-			parser( 'plain-replace', '<bar bar="bar">&gt;</bar>' ),
+			formatParse( 'plain-replace', '<bar bar="bar">&gt;</bar>' ),
 			'Foo &lt;bar bar="bar"&gt;&amp;gt;&lt;/bar&gt;',
 			'Replacement is not considered html'
 		);
@@ -109,71 +112,68 @@
 		mw.messages.set( 'object-replace', 'Foo $1' );
 
 		assert.equal(
-			parser( 'object-replace', $( '<div class="bar">&gt;</div>' ) ),
+			formatParse( 'object-replace', $( '<div class="bar">&gt;</div>' ) ),
 			'Foo <div class="bar">&gt;</div>',
 			'jQuery objects are preserved as raw html'
 		);
 
 		assert.equal(
-			parser( 'object-replace', $( '<div class="bar">&gt;</div>' ).get( 0 ) ),
+			formatParse( 'object-replace', $( '<div class="bar">&gt;</div>' ).get( 0 ) ),
 			'Foo <div class="bar">&gt;</div>',
 			'HTMLElement objects are preserved as raw html'
 		);
 
 		assert.equal(
-			parser( 'object-replace', $( '<div class="bar">&gt;</div>' ).toArray() ),
+			formatParse( 'object-replace', $( '<div class="bar">&gt;</div>' ).toArray() ),
 			'Foo <div class="bar">&gt;</div>',
 			'HTMLElement[] arrays are preserved as raw html'
 		);
 
 		assert.equal(
-			parser( 'external-link-replace', 'http://example.org/?x=y&z' ),
+			formatParse( 'external-link-replace', 'http://example.org/?x=y&z' ),
 			'Foo <a href="http://example.org/?x=y&amp;z">bar</a>',
 			'Href is not double-escaped in wikilink function'
 		);
 	} );
 
 	QUnit.test( 'Plural', 3, function ( assert ) {
-		var parser = mw.jqueryMsg.getMessageFunction();
-
-		assert.equal( parser( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
-		assert.equal( parser( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
-		assert.equal( parser( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
+		assert.equal( formatParse( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
+		assert.equal( formatParse( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
+		assert.equal( formatParse( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
 	} );
 
 	QUnit.test( 'Gender', 11, function ( assert ) {
 		// TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
 		// TODO: English may not be the best language for these tests. Use a language like Arabic or Russian
-		var user = mw.user,
-			parser = mw.jqueryMsg.getMessageFunction();
+		var user = mw.user;
 
 		user.options.set( 'gender', 'male' );
 		assert.equal(
-			parser( 'gender-msg', 'Bob', 'male' ),
+			formatParse( 'gender-msg', 'Bob', 'male' ),
 			'Bob: blue',
 			'Masculine from string "male"'
 		);
 		assert.equal(
-			parser( 'gender-msg', 'Bob', user ),
+			formatParse( 'gender-msg', 'Bob', user ),
 			'Bob: blue',
 			'Masculine from mw.user object'
 		);
 
 		user.options.set( 'gender', 'unknown' );
 		assert.equal(
-			parser( 'gender-msg', 'Foo', user ),
+			formatParse( 'gender-msg', 'Foo', user ),
 			'Foo: green',
 			'Neutral from mw.user object' );
 		assert.equal(
-			parser( 'gender-msg', 'Alice', 'female' ),
+			formatParse( 'gender-msg', 'Alice', 'female' ),
 			'Alice: pink',
 			'Feminine from string "female"' );
 		assert.equal(
-			parser( 'gender-msg', 'User' ),
+			formatParse( 'gender-msg', 'User' ),
 			'User: green',
 			'Neutral when no parameter given' );
 		assert.equal(
-			parser( 'gender-msg', 'User', 'unknown' ),
+			formatParse( 'gender-msg', 'User', 'unknown' ),
 			'User: green',
 			'Neutral from string "unknown"'
 		);
@@ -181,43 +181,41 @@
 		mw.messages.set( 'gender-msg-one-form', '{{GENDER:$1|User}}: $2 {{PLURAL:$2|edit|edits}}' );
 
 		assert.equal(
-			parser( 'gender-msg-one-form', 'male', 10 ),
+			formatParse( 'gender-msg-one-form', 'male', 10 ),
 			'User: 10 edits',
 			'Gender neutral and plural form'
 		);
 		assert.equal(
-			parser( 'gender-msg-one-form', 'female', 1 ),
+			formatParse( 'gender-msg-one-form', 'female', 1 ),
 			'User: 1 edit',
 			'Gender neutral and singular form'
 		);
 
 		mw.messages.set( 'gender-msg-lowercase', '{{gender:$1|he|she}} is awesome' );
 		assert.equal(
-			parser( 'gender-msg-lowercase', 'male' ),
+			formatParse( 'gender-msg-lowercase', 'male' ),
 			'he is awesome',
 			'Gender masculine'
 		);
 		assert.equal(
-			parser( 'gender-msg-lowercase', 'female' ),
+			formatParse( 'gender-msg-lowercase', 'female' ),
 			'she is awesome',
 			'Gender feminine'
 		);
 
 		mw.messages.set( 'gender-msg-wrong', '{{gender}} test' );
 		assert.equal(
-			parser( 'gender-msg-wrong', 'female' ),
+			formatParse( 'gender-msg-wrong', 'female' ),
 			' test',
 			'Invalid syntax should result in {{gender}} simply being stripped away'
 		);
 	} );
 
 	QUnit.test( 'Grammar', 2, function ( assert ) {
-		var parser = mw.jqueryMsg.getMessageFunction();
-
-		assert.equal( parser( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar Test with sitename' );
+		assert.equal( formatParse( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar Test with sitename' );
 
 		mw.messages.set( 'grammar-msg-wrong-syntax', 'Przeszukaj {{GRAMMAR:grammar_case_xyz}}' );
-		assert.equal( parser( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ', 'Grammar Test with wrong grammar template syntax' );
+		assert.equal( formatParse( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ', 'Grammar Test with wrong grammar template syntax' );
 	} );
 
 	QUnit.test( 'Match PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
@@ -242,8 +240,7 @@
 	} );
 
 	QUnit.test( 'Links', 6, function ( assert ) {
-		var parser = mw.jqueryMsg.getMessageFunction(),
-			expectedDisambiguationsText,
+		var expectedDisambiguationsText,
 			expectedMultipleBars,
 			expectedSpecialCharacters;
 
@@ -252,26 +249,24 @@
 		 the bold was removed because it is not yet implemented.
 		 */
 
-		assert.equal(
-			parser( 'jquerymsg-test-statistics-users' ),
+		assert.htmlEqual(
+			formatParse( 'jquerymsg-test-statistics-users' ),
 			expectedListUsers,
 			'Piped wikilink'
 		);
 
 		expectedDisambiguationsText = 'The following pages contain at least one link to a disambiguation page.\nThey may have to link to a more appropriate page instead.\nA page is treated as a disambiguation page if it uses a template that is linked from ' +
-			$( '<a>' ).attr( {
-				title: 'MediaWiki:Disambiguationspage',
-				href: mw.util.wikiGetlink( 'MediaWiki:Disambiguationspage' )
-			} ).text( 'MediaWiki:Disambiguationspage' ).getOuterHtml() + '.';
+			'<a title="MediaWiki:Disambiguationspage" href="/wiki/MediaWiki:Disambiguationspage">MediaWiki:Disambiguationspage</a>.';
+
 		mw.messages.set( 'disambiguations-text', 'The following pages contain at least one link to a disambiguation page.\nThey may have to link to a more appropriate page instead.\nA page is treated as a disambiguation page if it uses a template that is linked from [[MediaWiki:Disambiguationspage]].' );
-		assert.equal(
-			parser( 'disambiguations-text' ),
+		assert.htmlEqual(
+			formatParse( 'disambiguations-text' ),
 			expectedDisambiguationsText,
 			'Wikilink without pipe'
 		);
 
-		assert.equal(
-			parser( 'jquerymsg-test-version-entrypoints-index-php' ),
+		assert.htmlEqual(
+			formatParse( 'jquerymsg-test-version-entrypoints-index-php' ),
 			expectedEntrypoints,
 			'External link'
 		);
@@ -279,30 +274,24 @@
 		// Pipe trick is not supported currently, but should not parse as text either.
 		mw.messages.set( 'pipe-trick', '[[Tampa, Florida|]]' );
 		assert.equal(
-			parser( 'pipe-trick' ),
+			formatParse( 'pipe-trick' ),
 			'pipe-trick: Parse error at position 0 in input: [[Tampa, Florida|]]',
 			'Pipe trick should return error string.'
 		);
 
-		expectedMultipleBars = $( '<a>' ).attr( {
-			title: 'Main Page',
-			href: mw.util.wikiGetlink( 'Main Page' )
-		} ).text( 'Main|Page' ).getOuterHtml();
+		expectedMultipleBars = '<a title="Main Page" href="/wiki/Main_Page">Main|Page</a>';
 		mw.messages.set( 'multiple-bars', '[[Main Page|Main|Page]]' );
-		assert.equal(
-			parser( 'multiple-bars' ),
+		assert.htmlEqual(
+			formatParse( 'multiple-bars' ),
 			expectedMultipleBars,
 			'Bar in anchor'
 		);
 
-		expectedSpecialCharacters = $( '<a>' ).attr( {
-			title: specialCharactersPageName,
-			href: mw.util.wikiGetlink( specialCharactersPageName )
-		} ).text( specialCharactersPageName ).getOuterHtml();
+		expectedSpecialCharacters = '<a title="&quot;Who&quot; wants to be a millionaire &amp; live on &#039;Exotic Island&#039;?" href="/wiki/%22Who%22_wants_to_be_a_millionaire_%26_live_on_%27Exotic_Island%27%3F">&quot;Who&quot; wants to be a millionaire &amp; live on &#039;Exotic Island&#039;?</a>';
 
 		mw.messages.set( 'special-characters', '[[' + specialCharactersPageName + ']]' );
-		assert.equal(
-			parser( 'special-characters' ),
+		assert.htmlEqual(
+			formatParse( 'special-characters' ),
 			expectedSpecialCharacters,
 			'Special characters'
 		);
@@ -310,32 +299,16 @@
 
 // Tests that {{-transformation vs. general parsing are done as requested
 	QUnit.test( 'Curly brace transformation', 14, function ( assert ) {
-		var formatText, formatParse, oldUserLang;
-
-		oldUserLang = mw.config.get( 'wgUserLanguage' );
-
-		formatText = mw.jqueryMsg.getMessageFunction( {
-			format: 'text'
-		} );
-
-		formatParse = mw.jqueryMsg.getMessageFunction( {
-			format: 'parse'
-		} );
-
-		// When the expected result is the same in both modes
-		function assertBothModes( parserArguments, expectedResult, assertMessage ) {
-			assert.equal( formatText.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'text\'' );
-			assert.equal( formatParse.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'parse\'' );
-		}
+		var oldUserLang = mw.config.get( 'wgUserLanguage' );
 
-		assertBothModes( ['gender-msg', 'Bob', 'male'], 'Bob: blue', 'gender is resolved' );
+		assertBothModes( assert, ['gender-msg', 'Bob', 'male'], 'Bob: blue', 'gender is resolved' );
 
-		assertBothModes( ['plural-msg', 5], 'Found 5 items', 'plural is resolved' );
+		assertBothModes( assert, ['plural-msg', 5], 'Found 5 items', 'plural is resolved' );
 
-		assertBothModes( ['grammar-msg'], 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'grammar is resolved' );
+		assertBothModes( assert, ['grammar-msg'], 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'grammar is resolved' );
 
 		mw.config.set( 'wgUserLanguage', 'en' );
-		assertBothModes( ['formatnum-msg', '987654321.654321'], '987,654,321.654', 'formatnum is resolved' );
+		assertBothModes( assert, ['formatnum-msg', '987654321.654321'], '987,654,321.654', 'formatnum is resolved' );
 
 		// Test non-{{ wikitext, where behavior differs
 
@@ -345,7 +318,7 @@
 			mw.messages.get( 'jquerymsg-test-statistics-users' ),
 			'Internal link message unchanged when format is \'text\''
 		);
-		assert.equal(
+		assert.htmlEqual(
 			formatParse( 'jquerymsg-test-statistics-users' ),
 			expectedListUsers,
 			'Internal link message parsed when format is \'parse\''
@@ -357,7 +330,7 @@
 			mw.messages.get( 'jquerymsg-test-version-entrypoints-index-php' ),
 			'External link message unchanged when format is \'text\''
 		);
-		assert.equal(
+		assert.htmlEqual(
 			formatParse( 'jquerymsg-test-version-entrypoints-index-php' ),
 			expectedEntrypoints,
 			'External link message processed when format is \'parse\''
@@ -369,7 +342,7 @@
 			'Foo [http://example.com bar]',
 			'External link message only substitutes parameter when format is \'text\''
 		);
-		assert.equal(
+		assert.htmlEqual(
 			formatParse( 'external-link-replace', 'http://example.com' ),
 			'Foo <a href="http://example.com">bar</a>',
 			'External link message processed when format is \'parse\''
@@ -379,28 +352,25 @@
 	} );
 
 	QUnit.test( 'Int', 4, function ( assert ) {
-		var parser = mw.jqueryMsg.getMessageFunction(),
-			newarticletextSource = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the [[{{Int:Helppage}}|help page]] for more info). If you are here by mistake, click your browser\'s back button.',
-			expectedNewarticletext;
+		var newarticletextSource = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the [[{{Int:Helppage}}|help page]] for more info). If you are here by mistake, click your browser\'s back button.',
+			expectedNewarticletext,
+			helpPageTitle = 'Help:Contents';
 
-		mw.messages.set( 'helppage', 'Help:Contents' );
+		mw.messages.set( 'helppage', helpPageTitle );
 
 		expectedNewarticletext = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the ' +
-			$( '<a>' ).attr( {
-				title: mw.msg( 'helppage' ),
-				href: mw.util.wikiGetlink( mw.msg( 'helppage' ) )
-			} ).text( 'help page' ).getOuterHtml() + ' for more info). If you are here by mistake, click your browser\'s back button.';
+			'<a title="Help:Contents" href="/wiki/Help:Contents">help page</a> for more info). If you are here by mistake, click your browser\'s back button.';
 
 		mw.messages.set( 'newarticletext', newarticletextSource );
 
-		assert.equal(
-			parser( 'newarticletext' ),
+		assert.htmlEqual(
+			formatParse( 'newarticletext' ),
 			expectedNewarticletext,
 			'Link with nested message'
 		);
 
 		assert.equal(
-			parser( 'see-portal-url' ),
+			formatParse( 'see-portal-url' ),
 			'Project:Community portal is an important community page.',
 			'Nested message'
 		);
@@ -408,8 +378,8 @@
 		mw.messages.set( 'newarticletext-lowercase',
 			newarticletextSource.replace( 'Int:Helppage', 'int:helppage' ) );
 
-		assert.equal(
-			parser( 'newarticletext-lowercase' ),
+		assert.htmlEqual(
+			formatParse( 'newarticletext-lowercase' ),
 			expectedNewarticletext,
 			'Link with nested message, lowercase include'
 		);
@@ -417,7 +387,7 @@
 		mw.messages.set( 'uses-missing-int', '{{int:doesnt-exist}}' );
 
 		assert.equal(
-			parser( 'uses-missing-int' ),
+			formatParse( 'uses-missing-int' ),
 			'[doesnt-exist]',
 			'int: where nested message does not exist'
 		);
@@ -596,4 +566,149 @@ QUnit.test( 'formatnum', formatnumTests.length, function ( assert ) {
 	} );
 } );
 
+// HTML in wikitext
+QUnit.test( 'HTML', 26, function ( assert ) {
+	mw.messages.set( 'jquerymsg-italics-msg', '<i>Very</i> important' );
+
+	assertBothModes( assert, ['jquerymsg-italics-msg'], mw.messages.get( 'jquerymsg-italics-msg' ), 'Simple italics unchanged' );
+
+	mw.messages.set( 'jquerymsg-bold-msg', '<b>Strong</b> speaker' );
+	assertBothModes( assert, ['jquerymsg-bold-msg'], mw.messages.get( 'jquerymsg-bold-msg' ), 'Simple bold unchanged' );
+
+	mw.messages.set( 'jquerymsg-bold-italics-msg', 'It is <b><i>key</i></b>' );
+	assertBothModes( assert, ['jquerymsg-bold-italics-msg'], mw.messages.get( 'jquerymsg-bold-italics-msg' ), 'Bold and italics nesting order preserved' );
+
+	mw.messages.set( 'jquerymsg-italics-bold-msg', 'It is <i><b>vital</b></i>' );
+	assertBothModes( assert, ['jquerymsg-italics-bold-msg'], mw.messages.get( 'jquerymsg-italics-bold-msg' ), 'Italics and bold nesting order preserved' );
+
+	mw.messages.set( 'jquerymsg-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' );
+
+	assert.htmlEqual(
+		formatParse( 'jquerymsg-italics-with-link' ),
+		'An <i>italicized <a title="link" href="' + mw.html.escape( mw.util.getUrl( 'link' ) ) + '">wiki-link</i>',
+		'Italics with link inside in parse mode'
+	);
+
+	assert.equal(
+		formatText( 'jquerymsg-italics-with-link' ),
+		mw.messages.get( 'jquerymsg-italics-with-link' ),
+		'Italics with link unchanged in text mode'
+	);
+
+	mw.messages.set( 'jquerymsg-italics-id-class', '<i id="foo" class="bar">Foo</i>' );
+	assert.htmlEqual(
+		formatParse( 'jquerymsg-italics-id-class' ),
+		mw.messages.get( 'jquerymsg-italics-id-class' ),
+		'ID and class are allowed'
+	);
+
+	mw.messages.set( 'jquerymsg-italics-onclick', '<i onclick="alert(\'foo\')">Foo</i>' );
+	assert.htmlEqual(
+		formatParse( 'jquerymsg-italics-onclick' ),
+		'&lt;i onclick=&quot;alert(\'foo\')&quot;&gt;Foo&lt;/i&gt;',
+		'element with onclick is escaped because it is not allowed'
+	);
+
+	mw.messages.set( 'jquerymsg-script-msg', '<script  >alert( "Who put this tag here?" );</script>' );
+	assert.htmlEqual(
+		formatParse( 'jquerymsg-script-msg' ),
+		'&lt;script  &gt;alert( &quot;Who put this tag here?&quot; );&lt;/script&gt;',
+		'Tag outside whitelist escaped in parse mode'
+	);
+
+	assert.equal(
+		formatText( 'jquerymsg-script-msg' ),
+		mw.messages.get( 'jquerymsg-script-msg' ),
+		'Tag outside whitelist unchanged in text mode'
+	);
+
+	mw.messages.set( 'jquerymsg-script-link-msg', '<script>[[Foo|bar]]</script>' );
+	assert.htmlEqual(
+		formatParse( 'jquerymsg-script-link-msg' ),
+		'&lt;script&gt;<a title="Foo" href="' + mw.html.escape( mw.util.getUrl( 'Foo' ) ) + '">bar</a>&lt;/script&gt;',
+		'Script tag text is escaped because that element is not allowed, but link inside is still HTML'
+	);
+
+	mw.messages.set( 'jquerymsg-mismatched-html', '<i class="important">test</b>' );
+	assert.htmlEqual(
+		formatParse( 'jquerymsg-mismatched-html' ),
+		'&lt;i class=&quot;important&quot;&gt;test&lt;/b&gt;',
+		'Mismatched HTML start and end tag treated as text'
+	);
+
+	// TODO (mattflaschen, 2013-03-18): It's not a security issue, but there's no real
+	// reason the htmlEmitter span needs to be here. It's an artifact of how emitting works.
+	mw.messages.set( 'jquerymsg-script-and-external-link', '<script>alert( "jquerymsg-script-and-external-link test" );</script> [http://example.com <i>Foo</i> bar]' );
+	assert.htmlEqual(
+		formatParse( 'jquerymsg-script-and-external-link' ),
+		'&lt;script&gt;alert( "jquerymsg-script-and-external-link test" );&lt;/script&gt; <a href="http://example.com"><span class="mediaWiki_htmlEmitter"><i>Foo</i> bar</span></a>',
+		'HTML tags in external links not interfering with escaping of other tags'
+	);
+
+	mw.messages.set( 'jquerymsg-link-script', '[http://example.com <script>alert( "jquerymsg-link-script test" );</script>]' );
+	assert.htmlEqual(
+		formatParse( 'jquerymsg-link-script' ),
+		'<a href="http://example.com"><span class="mediaWiki_htmlEmitter">&lt;script&gt;alert( "jquerymsg-link-script test" );&lt;/script&gt;</span></a>',
+		'Non-whitelisted HTML tag in external link anchor treated as text'
+	);
+
+	// Intentionally not using htmlEqual for the quote tests
+	mw.messages.set( 'jquerymsg-double-quotes-preserved', '<i id="double">Double</i>' );
+	assert.equal(
+		formatParse( 'jquerymsg-double-quotes-preserved' ),
+		mw.messages.get( 'jquerymsg-double-quotes-preserved' ),
+		'Attributes with double quotes are preserved as such'
+	);
+
+	mw.messages.set( 'jquerymsg-single-quotes-normalized-to-double', '<i id=\'single\'>Single</i>' );
+	assert.equal(
+		formatParse( 'jquerymsg-single-quotes-normalized-to-double' ),
+		'<i id="single">Single</i>',
+		'Attributes with single quotes are normalized to double'
+	);
+
+	mw.messages.set( 'jquerymsg-escaped-double-quotes-attribute', '<i style="font-family:&quot;Arial&quot;">Styled</i>' );
+	assert.htmlEqual(
+		formatParse( 'jquerymsg-escaped-double-quotes-attribute' ),
+		mw.messages.get( 'jquerymsg-escaped-double-quotes-attribute' ),
+		'Escaped attributes are parsed correctly'
+	);
+
+	mw.messages.set( 'jquerymsg-escaped-single-quotes-attribute', '<i style=\'font-family:&#039;Arial&#039;\'>Styled</i>' );
+	assert.htmlEqual(
+		formatParse( 'jquerymsg-escaped-single-quotes-attribute' ),
+		mw.messages.get( 'jquerymsg-escaped-single-quotes-attribute' ),
+		'Escaped attributes are parsed correctly'
+	);
+
+
+	mw.messages.set( 'jquerymsg-wikitext-contents-parsed', '<i>[http://example.com Example]</i>' );
+	assert.htmlEqual(
+		formatParse( 'jquerymsg-wikitext-contents-parsed' ),
+		'<i><a href="http://example.com">Example</a></i>',
+		'Contents of valid tag are treated as wikitext, so external link is parsed'
+	);
+
+	mw.messages.set( 'jquerymsg-wikitext-contents-script', '<i><script>Script inside</script></i>' );
+	assert.htmlEqual(
+		formatParse( 'jquerymsg-wikitext-contents-script' ),
+		'<i><span class="mediaWiki_htmlEmitter">&lt;script&gt;Script inside&lt;/script&gt;</span></i>',
+		'Contents of valid tag are treated as wikitext, so invalid HTML element is treated as text'
+	);
+
+	mw.messages.set( 'jquerymsg-unclosed-tag', 'Foo<tag>bar' );
+	assert.htmlEqual(
+		formatParse( 'jquerymsg-unclosed-tag' ),
+		'Foo&lt;tag&gt;bar',
+		'Nonsupported unclosed tags are escaped'
+	);
+
+	mw.messages.set( 'jquerymsg-self-closing-tag', 'Foo<tag/>bar' );
+	assert.htmlEqual(
+		formatParse( 'jquerymsg-self-closing-tag' ),
+		'Foo&lt;tag/&gt;bar',
+		'Self-closing tags don\'t cause a parse error'
+	);
+} );
+
 }( mediaWiki, jQuery ) );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.test.js
index 01e78f61..bd4d1d21 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.test.js
@@ -15,11 +15,17 @@
 				'gender-plural-msg': '{{GENDER:$1|he|she|they}} {{PLURAL:$2|is|are}} awesome',
 				'grammar-msg': 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}',
 				'formatnum-msg': '{{formatnum:$1}}',
-				'int-msg': 'Some {{int:other-message}}'
+				'int-msg': 'Some {{int:other-message}}',
+				'mediawiki-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
+				'external-link-replace': 'Foo [$1 bar]'
 			} );
 
-			// For formatnum tests
-			mw.config.set( 'wgUserLanguage', 'en' );
+			mw.config.set( {
+				wgArticlePath: '/wiki/$1',
+
+				// For formatnum tests
+				wgUserLanguage: 'en'
+			} );
 
 			specialCharactersPageName = '"Who" wants to be a millionaire & live on \'Exotic Island\'?';
 		}
@@ -124,7 +130,7 @@
 		assert.ok( mw.config instanceof mw.Map, 'mw.config instance of mw.Map' );
 	} );
 
-	QUnit.test( 'mw.message & mw.messages', 54, function ( assert ) {
+	QUnit.test( 'mw.message & mw.messages', 100, function ( assert ) {
 		var goodbye, hello;
 
 		// Convenience method for asserting the same result for multiple formats
@@ -158,11 +164,24 @@
 		assert.equal( hello.escaped(), 'Hello &lt;b&gt;awesome&lt;/b&gt; world', 'Message.escaped returns the escaped message' );
 		assert.equal( hello.format, 'escaped', 'Message.escaped correctly updated the "format" property' );
 
-		assert.ok( mw.messages.set( 'escaped-with-curly-brace', '"{{SITENAME}}" is the home of {{int:other-message}}' ) );
-		assert.equal( mw.message( 'escaped-with-curly-brace' ).escaped(), mw.html.escape( '"' + mw.config.get( 'wgSiteName' ) + '" is the home of Other Message' ), 'Escaped format works correctly for curly brace message' );
+		assert.ok( mw.messages.set( 'multiple-curly-brace', '"{{SITENAME}}" is the home of {{int:other-message}}' ), 'mw.messages.set: Register' );
+		assertMultipleFormats( ['multiple-curly-brace'], ['text', 'parse'], '"' + mw.config.get( 'wgSiteName') + '" is the home of Other Message', 'Curly brace format works correctly' );
+		assert.equal( mw.message( 'multiple-curly-brace' ).plain(), mw.messages.get( 'multiple-curly-brace' ), 'Plain format works correctly for curly brace message' );
+		assert.equal( mw.message( 'multiple-curly-brace' ).escaped(), mw.html.escape( '"' + mw.config.get( 'wgSiteName') + '" is the home of Other Message' ), 'Escaped format works correctly for curly brace message' );
+
+		assert.ok( mw.messages.set( 'multiple-square-brackets-and-ampersand', 'Visit the [[Project:Community portal|community portal]] & [[Project:Help desk|help desk]]' ), 'mw.messages.set: Register' );
+		assertMultipleFormats( ['multiple-square-brackets-and-ampersand'], ['plain', 'text'], mw.messages.get( 'multiple-square-brackets-and-ampersand' ), 'Square bracket message is not processed' );
+		assert.equal( mw.message( 'multiple-square-brackets-and-ampersand' ).escaped(), 'Visit the [[Project:Community portal|community portal]] &amp; [[Project:Help desk|help desk]]', 'Escaped format works correctly for square bracket message' );
+		assert.htmlEqual( mw.message( 'multiple-square-brackets-and-ampersand' ).parse(), 'Visit the ' +
+			'<a title="Project:Community portal" href="/wiki/Project:Community_portal">community portal</a>' +
+			' &amp; <a title="Project:Help desk" href="/wiki/Project:Help_desk">help desk</a>', 'Internal links work with parse' );
 
-		assert.ok( mw.messages.set( 'escaped-with-square-brackets', 'Visit the [[Project:Community portal|community portal]] & [[Project:Help desk|help desk]]' ) );
-		assert.equal( mw.message( 'escaped-with-square-brackets' ).escaped(), 'Visit the [[Project:Community portal|community portal]] &amp; [[Project:Help desk|help desk]]', 'Escaped format works correctly for square bracket message' );
+		assertMultipleFormats( ['mediawiki-test-version-entrypoints-index-php'], ['plain', 'text', 'escaped'], mw.messages.get( 'mediawiki-test-version-entrypoints-index-php' ), 'External link markup is unprocessed' );
+		assert.htmlEqual( mw.message( 'mediawiki-test-version-entrypoints-index-php' ).parse(), '<a href="https://www.mediawiki.org/wiki/Manual:index.php">index.php</a>', 'External link works correctly in parse mode' );
+
+		assertMultipleFormats( ['external-link-replace', 'http://example.org/?x=y&z'], ['plain', 'text'] , 'Foo [http://example.org/?x=y&z bar]', 'Parameters are substituted but external link is not processed' );
+		assert.equal( mw.message( 'external-link-replace', 'http://example.org/?x=y&z' ).escaped(), 'Foo [http://example.org/?x=y&amp;z bar]', 'In escaped mode, parameters are substituted and ampersand is escaped, but external link is not processed' );
+		assert.htmlEqual( mw.message( 'external-link-replace', 'http://example.org/?x=y&z' ).parse(), 'Foo <a href="http://example.org/?x=y&amp;z">bar</a>', 'External link with replacement works in parse mode without double-escaping' );
 
 		hello.parse();
 		assert.equal( hello.format, 'parse', 'Message.parse correctly updated the "format" property' );
@@ -186,6 +205,16 @@
 		assertMultipleFormats( ['plural-test-msg', 6], ['text', 'parse', 'escaped'], 'There are 6 results', 'plural get resolved' );
 		assert.equal( mw.message( 'plural-test-msg', 6 ).plain(), 'There {{PLURAL:6|is|are}} 6 {{PLURAL:6|result|results}}', 'Parameter is substituted but plural is not resolved in plain' );
 
+		assert.ok( mw.messages.set( 'plural-test-msg-explicit', 'There {{plural:$1|is one car|are $1 cars|0=are no cars|12=are a dozen cars}}' ), 'mw.messages.set: Register message with explicit plural forms' );
+		assertMultipleFormats( ['plural-test-msg-explicit', 12], ['text', 'parse', 'escaped'], 'There are a dozen cars', 'explicit plural get resolved' );
+
+		assert.ok( mw.messages.set( 'plural-test-msg-explicit-beginning', 'Basket has {{plural:$1|0=no eggs|12=a dozen eggs|6=half a dozen eggs|one egg|$1 eggs}}' ), 'mw.messages.set: Register message with explicit plural forms' );
+		assertMultipleFormats( ['plural-test-msg-explicit-beginning', 1], ['text', 'parse', 'escaped'], 'Basket has one egg', 'explicit plural given at beginning get resolved for singular' );
+		assertMultipleFormats( ['plural-test-msg-explicit-beginning', 4], ['text', 'parse', 'escaped'], 'Basket has 4 eggs', 'explicit plural given at beginning get resolved for plural' );
+		assertMultipleFormats( ['plural-test-msg-explicit-beginning', 6], ['text', 'parse', 'escaped'], 'Basket has half a dozen eggs', 'explicit plural given at beginning get resolved for 6' );
+		assertMultipleFormats( ['plural-test-msg-explicit-beginning', 0], ['text', 'parse', 'escaped'], 'Basket has no eggs', 'explicit plural given at beginning get resolved for 0' );
+
+
 		assertMultipleFormats( ['mediawiki-test-pagetriage-del-talk-page-notify-summary'], ['plain', 'text'], mw.messages.get( 'mediawiki-test-pagetriage-del-talk-page-notify-summary' ), 'Double square brackets with no parameters unchanged' );
 
 		assertMultipleFormats( ['mediawiki-test-pagetriage-del-talk-page-notify-summary', specialCharactersPageName], ['plain', 'text'], 'Notifying author of deletion nomination for [[' + specialCharactersPageName + ']]', 'Double square brackets with one parameter' );
@@ -196,7 +225,7 @@
 		assert.ok( mw.messages.set( 'mediawiki-test-categorytree-collapse-bullet', '[<b>−</b>]' ), 'mw.messages.set: Register' );
 		assert.equal( mw.message( 'mediawiki-test-categorytree-collapse-bullet' ).plain(), mw.messages.get( 'mediawiki-test-categorytree-collapse-bullet' ), 'Single square brackets unchanged in plain mode' );
 
-		assert.ok( mw.messages.set( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result', '<a href=\'#\' title=\'{{#special:mypage}}\'>Username</a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk</a>)' ) );
+		assert.ok( mw.messages.set( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result', '<a href=\'#\' title=\'{{#special:mypage}}\'>Username</a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk</a>)' ), 'mw.messages.set: Register' );
 		assert.equal( mw.message( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result' ).plain(), mw.messages.get( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result' ), 'HTML message with curly braces is not changed in plain mode' );
 
 		assertMultipleFormats( ['gender-plural-msg', 'male', 1], ['text', 'parse', 'escaped'], 'he is awesome', 'Gender and plural are resolved' );
@@ -211,6 +240,42 @@
 
 		assertMultipleFormats( ['int-msg'], ['text', 'parse', 'escaped'], 'Some Other Message', 'int is resolved' );
 		assert.equal( mw.message( 'int-msg' ).plain(), mw.messages.get( 'int-msg' ), 'int is not resolved in plain mode' );
+
+		assert.ok( mw.messages.set( 'mediawiki-italics-msg', '<i>Very</i> important' ),	'mw.messages.set: Register' );
+		assertMultipleFormats( ['mediawiki-italics-msg'], ['plain', 'text', 'parse'], mw.messages.get( 'mediawiki-italics-msg' ), 'Simple italics unchanged' );
+		assert.htmlEqual(
+			mw.message( 'mediawiki-italics-msg' ).escaped(),
+			'&lt;i&gt;Very&lt;/i&gt; important',
+			'Italics are escaped in	escaped mode'
+		);
+
+		assert.ok( mw.messages.set( 'mediawiki-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' ), 'mw.messages.set: Register' );
+		assertMultipleFormats( ['mediawiki-italics-with-link'], ['plain', 'text'], mw.messages.get( 'mediawiki-italics-with-link' ), 'Italics with link unchanged' );
+		assert.htmlEqual(
+			mw.message( 'mediawiki-italics-with-link' ).escaped(),
+			'An &lt;i&gt;italicized [[link|wiki-link]]&lt;/i&gt;',
+			'Italics and link unchanged except for escaping in escaped mode'
+		);
+		assert.htmlEqual(
+			mw.message( 'mediawiki-italics-with-link' ).parse(),
+			'An <i>italicized <a title="link" href="' + mw.util.getUrl( 'link' ) + '">wiki-link</i>',
+			'Italics with link inside in parse mode'
+		);
+
+		assert.ok( mw.messages.set( 'mediawiki-script-msg', '<script  >alert( "Who put this script here?" );</script>' ), 'mw.messages.set: Register' );
+		assertMultipleFormats( ['mediawiki-script-msg'], ['plain', 'text'], mw.messages.get( 'mediawiki-script-msg' ), 'Script unchanged' );
+		assert.htmlEqual(
+			mw.message( 'mediawiki-script-msg' ).escaped(),
+			'&lt;script  &gt;alert( "Who put this script here?" );&lt;/script&gt;',
+			'Script escaped when using escaped format'
+		);
+		assert.htmlEqual(
+			mw.message( 'mediawiki-script-msg' ).parse(),
+			'&lt;script  &gt;alert( "Who put this script here?" );&lt;/script&gt;',
+			'Script escaped when using parse format'
+		);
+
+
 	} );
 
 	QUnit.test( 'mw.msg', 14, function ( assert ) {
@@ -218,7 +283,7 @@
 		assert.equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
 		assert.equal( mw.msg( 'goodbye' ), '<goodbye>', 'Gets message with default options (nonexistent message)' );
 
-		assert.ok( mw.messages.set( 'plural-item', 'Found $1 {{PLURAL:$1|item|items}}' ) );
+		assert.ok( mw.messages.set( 'plural-item' , 'Found $1 {{PLURAL:$1|item|items}}' ), 'mw.messages.set: Register' );
 		assert.equal( mw.msg( 'plural-item', 5 ), 'Found 5 items', 'Apply plural for count 5' );
 		assert.equal( mw.msg( 'plural-item', 0 ), 'Found 0 items', 'Apply plural for count 0' );
 		assert.equal( mw.msg( 'plural-item', 1 ), 'Found 1 item', 'Apply plural for count 1' );
@@ -762,4 +827,90 @@
 
 	} );
 
+	QUnit.test( 'mw.hook', 10, function ( assert ) {
+		var hook, add, fire, chars, callback;
+
+		mw.hook( 'test.hook.unfired' ).add( function () {
+			assert.ok( false, 'Unfired hook' );
+		} );
+
+		mw.hook( 'test.hook.basic' ).add( function () {
+			assert.ok( true, 'Basic callback' );
+		} );
+		mw.hook( 'test.hook.basic' ).fire();
+
+		mw.hook( 'test.hook.data' ).add( function ( data1, data2 ) {
+			assert.equal( data1, 'example', 'Fire with data (string param)' );
+			assert.deepEqual( data2, ['two'], 'Fire with data (array param)' );
+		} );
+		mw.hook( 'test.hook.data' ).fire( 'example', ['two'] );
+
+		mw.hook( 'test.hook.chainable' ).add( function () {
+			assert.ok( true, 'Chainable' );
+		} ).fire();
+
+		hook = mw.hook( 'test.hook.detach' );
+		add = hook.add;
+		fire = hook.fire;
+		add( function ( x, y ) {
+			assert.deepEqual( [x, y], ['x', 'y'], 'Detached (contextless) with data' );
+		} );
+		fire( 'x', 'y' );
+
+		mw.hook( 'test.hook.fireBefore' ).fire().add( function () {
+			assert.ok( true, 'Invoke handler right away if it was fired before' );
+		} );
+
+		mw.hook( 'test.hook.fireTwiceBefore' ).fire().fire().add( function () {
+			assert.ok( true, 'Invoke handler right away if it was fired before (only last one)' );
+		} );
+
+		chars = [];
+
+		mw.hook( 'test.hook.many' )
+			.add( function ( chr ) {
+				chars.push( chr );
+			} )
+			.fire( 'x' ).fire( 'y' ).fire( 'z' )
+			.add( function ( chr ) {
+				assert.equal( chr, 'z', 'Adding callback later invokes right away with last data' );
+			} );
+
+		assert.deepEqual( chars, ['x', 'y', 'z'], 'Multiple callbacks with multiple fires' );
+
+		chars = [];
+		callback = function ( chr ) {
+			chars.push( chr );
+		};
+
+		mw.hook( 'test.hook.variadic' )
+			.add(
+				callback,
+				callback,
+				function ( chr ) {
+					chars.push( chr );
+				},
+				callback
+			)
+			.fire( 'x' )
+			.remove(
+				function () {
+					'not-added';
+				},
+				callback
+			)
+			.fire( 'y' )
+			.remove( callback )
+			.fire( 'z' );
+
+		assert.deepEqual(
+			chars,
+			['x', 'x', 'x', 'x', 'y', 'z'],
+			'"add" and "remove" support variadic arguments. ' +
+				'"add" does not filter unique. ' +
+				'"remove" removes all equal by reference. ' +
+				'"remove" is silent if the function is not found'
+		);
+	} );
+
 }( mediaWiki, jQuery ) );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
index 875ab91a..96be3d1f 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
@@ -5,7 +5,7 @@
 		assert.ok( mw.user.options instanceof mw.Map, 'options instance of mw.Map' );
 	} );
 
-	QUnit.test( 'user status', 9, function ( assert ) {
+	QUnit.test( 'user status', 11, function ( assert ) {
 		/**
 		 * Tests can be run under three different conditions:
 		 *   1) From tests/qunit/index.html, user will be anonymous.
@@ -15,19 +15,23 @@
 
 		// Forge an anonymous user:
 		mw.config.set( 'wgUserName', null );
+		delete mw.config.values.wgUserId;
 
 		assert.strictEqual( mw.user.getName(), null, 'user.getName() returns null when anonymous' );
 		assert.strictEqual( mw.user.name(), null, 'user.name() compatibility' );
 		assert.assertTrue( mw.user.isAnon(), 'user.isAnon() returns true when anonymous' );
 		assert.assertTrue( mw.user.anonymous(), 'user.anonymous() compatibility' );
+		assert.strictEqual( mw.user.getId(), 0, 'user.getId() returns 0 when anonymous' );
 
 		// Not part of startUp module
 		mw.config.set( 'wgUserName', 'John' );
+		mw.config.set( 'wgUserId', 123 );
 
 		assert.equal( mw.user.getName(), 'John', 'user.getName() returns username when logged-in' );
 		assert.equal( mw.user.name(), 'John', 'user.name() compatibility' );
 		assert.assertFalse( mw.user.isAnon(), 'user.isAnon() returns false when logged-in' );
 		assert.assertFalse( mw.user.anonymous(), 'user.anonymous() compatibility' );
+		assert.strictEqual( mw.user.getId(), 123, 'user.getId() returns correct ID when logged-in' );
 
 		assert.equal( mw.user.id(), 'John', 'user.id Returns username when logged-in' );
 	} );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
index 6fc0731c..9216f0af 100644
--- a/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
+++ b/tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
@@ -1,5 +1,13 @@
 ( function ( mw, $ ) {
-	QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment() );
+	QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment( {
+		setup: function () {
+			this.taPrefix = mw.util.tooltipAccessKeyPrefix;
+			mw.util.tooltipAccessKeyPrefix = 'ctrl-alt-';
+		},
+		teardown: function () {
+			mw.util.tooltipAccessKeyPrefix = this.taPrefix;
+		}
+	} ) );
 
 	QUnit.test( 'rawurlencode', 1, function ( assert ) {
 		assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
@@ -9,20 +17,24 @@
 		assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
 	} );
 
-	QUnit.test( 'wikiGetlink', 3, function ( assert ) {
+	QUnit.test( 'getUrl', 4, function ( assert ) {
 		// Not part of startUp module
 		mw.config.set( 'wgArticlePath', '/wiki/$1' );
 		mw.config.set( 'wgPageName', 'Foobar' );
 
-		var href = mw.util.wikiGetlink( 'Sandbox' );
+		var href = mw.util.getUrl( 'Sandbox' );
 		assert.equal( href, '/wiki/Sandbox', 'Simple title; Get link for "Sandbox"' );
 
-		href = mw.util.wikiGetlink( 'Foo:Sandbox ? 5+5=10 ! (test)/subpage' );
+		href = mw.util.getUrl( 'Foo:Sandbox ? 5+5=10 ! (test)/subpage' );
 		assert.equal( href, '/wiki/Foo:Sandbox_%3F_5%2B5%3D10_%21_%28test%29/subpage',
 			'Advanced title; Get link for "Foo:Sandbox ? 5+5=10 ! (test)/subpage"' );
 
-		href = mw.util.wikiGetlink();
+		href = mw.util.getUrl();
 		assert.equal( href, '/wiki/Foobar', 'Default title; Get link for current page ("Foobar")' );
+
+		href = mw.util.getUrl( 'Sandbox', { action: 'edit' } );
+		assert.equal( href, '/wiki/Sandbox?action=edit',
+			'Simple title with query string; Get link for "Sandbox" with action=edit' );
 	} );
 
 	QUnit.test( 'wikiScript', 4, function ( assert ) {
@@ -76,13 +88,13 @@
 
 		assert.strictEqual( mw.util.toggleToc(), null, 'Return null if there is no table of contents on the page.' );
 
-		tocHtml = '<table id="toc" class="toc"><tr><td>' +
+		tocHtml = '<div id="toc" class="toc">' +
 			'<div id="toctitle">' +
 			'<h2>Contents</h2>' +
 			'<span class="toctoggle">&nbsp;[<a href="#" class="internal" id="togglelink">Hide</a>&nbsp;]</span>' +
 			'</div>' +
 			'<ul><li></li></ul>' +
-			'</td></tr></table>';
+			'</div>';
 		$( tocHtml ).appendTo( '#qunit-fixture' );
 		$toggleLink = $( '#togglelink' );
 
@@ -108,10 +120,14 @@
 		assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c d', 'Bug 30441: getParamValue must understand "+" encoding of space (multiple spaces)' );
 	} );
 
-	QUnit.test( 'tooltipAccessKey', 3, function ( assert ) {
-		assert.equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 'mw.util.tooltipAccessKeyPrefix must be a string' );
-		assert.ok( mw.util.tooltipAccessKeyRegexp instanceof RegExp, 'mw.util.tooltipAccessKeyRegexp instance of RegExp' );
-		assert.ok( mw.util.updateTooltipAccessKeys, 'mw.util.updateTooltipAccessKeys' );
+	QUnit.test( 'tooltipAccessKey', 4, function ( assert ) {
+		assert.equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 'tooltipAccessKeyPrefix must be a string' );
+		assert.equal( $.type( mw.util.tooltipAccessKeyRegexp ), 'regexp', 'tooltipAccessKeyRegexp is a regexp' );
+		assert.ok( mw.util.updateTooltipAccessKeys, 'updateTooltipAccessKeys is non-empty' );
+
+		'Example [a]'.replace( mw.util.tooltipAccessKeyRegexp, function ( sub, m1, m2, m3, m4, m5, m6 ) {
+			assert.equal( m6, 'a', 'tooltipAccessKeyRegexp finds the accesskey hint' );
+		} );
 	} );
 
 	QUnit.test( '$content', 2, function ( assert ) {
@@ -125,17 +141,18 @@
 	 * Previously, test elements where invisible to the selector since only
 	 * one element can have a given id.
 	 */
-	QUnit.test( 'addPortletLink', 8, function ( assert ) {
-		var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo;
+	QUnit.test( 'addPortletLink', 13, function ( assert ) {
+		var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo,
+			addedAfter, tbRLDMnonexistentid, tbRLDMemptyjquery;
 
 		pTestTb = '\
 		<div class="portlet" id="p-test-tb">\
-			<h5>Toolbox</h5>\
+			<h3>Toolbox</h3>\
 			<ul class="body"></ul>\
 		</div>';
 		pCustom = '\
 		<div class="portlet" id="p-test-custom">\
-			<h5>Views</h5>\
+			<h3>Views</h3>\
 			<ul class="body">\
 				<li id="c-foo"><a href="#">Foo</a></li>\
 				<li id="c-barmenu">\
@@ -147,14 +164,15 @@
 		</div>';
 		vectorTabs = '\
 		<div id="p-test-views" class="vectorTabs">\
-			<h5>Views</h5>\
+			<h3>Views</h3>\
 			<ul></ul>\
 		</div>';
 
 		$( '#qunit-fixture' ).append( pTestTb, pCustom, vectorTabs );
 
 		tbRL = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/ResourceLoader',
-			'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l' );
+			'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l'
+		);
 
 		assert.ok( $.isDomElement( tbRL ), 'addPortletLink returns a valid DOM Element according to $.isDomElement' );
 
@@ -162,14 +180,32 @@
 			'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', tbRL );
 		$tbMW = $( tbMW );
 
+		assert.propEqual(
+			$tbMW.getAttrs(),
+			{
+				id: 't-mworg'
+			},
+			'Validate attributes of created element'
+		);
+
+		assert.propEqual(
+			$tbMW.find( 'a' ).getAttrs(),
+			{
+				href: '//mediawiki.org/',
+				title: 'Go to MediaWiki.org [ctrl-alt-m]',
+				accesskey: 'm'
+			},
+			'Validate attributes of anchor tag in created element'
+		);
 
-		assert.equal( $tbMW.attr( 'id' ), 't-mworg', 'Link has correct ID set' );
 		assert.equal( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-test-tb', 'Link was inserted within correct portlet' );
-		assert.equal( $tbMW.next().attr( 'id' ), 't-rl', 'Link is in the correct position (by passing nextnode)' );
+		assert.strictEqual( $tbMW.next()[0], tbRL, 'Link is in the correct position (by passing nextnode)' );
 
-		cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux' );
+		cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
 		$cuQuux = $( cuQuux );
 
+		assert.equal( $cuQuux.find( 'a' ).attr( 'title' ), 'Example [ctrl-alt-q]', 'Existing accesskey is stripped and updated' );
+
 		assert.equal(
 			$( '#p-test-custom #c-barmenu ul li' ).length,
 			1,
@@ -185,6 +221,21 @@
 
 		assert.strictEqual( $tbMW.find( 'span' ).length, 0, 'No <span> element should be added for porlets without vectorTabs class.' );
 		assert.strictEqual( $( caFoo ).find( 'span' ).length, 1, 'A <span> element should be added for porlets with vectorTabs class.' );
+
+		addedAfter = mw.util.addPortletLink( 'p-test-tb', '#', 'After foo', 'post-foo', 'After foo', null, $( tbRL ) );
+		assert.strictEqual( $( addedAfter ).next()[0], tbRL, 'Link is in the correct position (by passing a jQuery object as nextnode)' );
+
+		// test case - nonexistent id as next node
+		tbRLDMnonexistentid = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
+			'Default modules', 't-rldm-nonexistent', 'List of all default modules ', 'd', '#t-rl-nonexistent' );
+
+		assert.equal( tbRLDMnonexistentid, $( '#p-test-tb li:last' )[0], 'Nonexistent id as nextnode adds the portlet at end' );
+
+		// test case - empty jquery object as next node
+		tbRLDMemptyjquery = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
+			'Default modules', 't-rldm-empty-jquery', 'List of all default modules ', 'd', $( '#t-rl-nonexistent' ) );
+
+		assert.equal( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[0], 'Empty jquery as nextnode adds the portlet at end' );
 	} );
 
 	QUnit.test( 'jsMessage', 1, function ( assert ) {
diff --git a/tests/qunit/suites/resources/startup.test.js b/tests/qunit/suites/resources/startup.test.js
new file mode 100644
index 00000000..76f32f7e
--- /dev/null
+++ b/tests/qunit/suites/resources/startup.test.js
@@ -0,0 +1,129 @@
+/*global isCompatible: true */
+( function ( $ ) {
+	var testcases = {
+		// Supported: Compatible
+		gradeA: [
+			// Chrome
+			'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16',
+			// Firefox 4+
+			'Mozilla/5.0 (Windows NT 6.1.1; rv:5.0) Gecko/20100101 Firefox/5.0',
+			'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0',
+			'Mozilla/5.0 (Macintosh; I; Intel Mac OS X 11_7_9; de-LI; rv:1.9b4) Gecko/2012010317 Firefox/10.0a4',
+			'Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/12.0',
+			'Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1',
+			// Kindle Fire
+			'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1',
+			// Safari 5.0+
+			'Mozilla/5.0 (Macintosh; I; Intel Mac OS X 10_6_7; ru-ru) AppleWebKit/534.31+ (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1',
+			// Opera 11+
+			'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.8.131 Version/11.10',
+			// Internet Explorer 6+
+			'Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1)',
+			'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; en-US)',
+			'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)',
+			'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)',
+			'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
+			// IE Mobile
+			'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800)',
+			// BlackBerry 6+
+			'Mozilla/5.0 (BlackBerry; U; BlackBerry 9300; en) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.570 Mobile Safari/534.8+',
+			'Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+',
+			'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.3+ (KHTML, like Gecko) Version/10.0.9.386 Mobile Safari/537.3+',
+			// Open WebOS 1.4+ (HP Veer 4G)
+			'Mozilla/5.0 (webOS/2.1.2; U; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 P160UNA/1.0',
+			// Firefox Mobile
+			'Mozilla/5.0 (Mobile; rv:14.0) Gecko/14.0 Firefox/14.0',
+			// iOS
+			'Mozilla/5.0 (ipod: U;CPU iPhone OS 2_2 like Mac OS X: es_es) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3',
+			'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3',
+			// Android
+			'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17'
+		],
+		// Supported: Uncompatible, serve basic content
+		gradeB: [
+			// Internet Explorer < 6
+			'Mozilla/2.0 (compatible; MSIE 3.03; Windows 3.1)',
+			'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)',
+			'Mozilla/4.0 (compatible; MSIE 5.0; Windows 98;)',
+			'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
+			// Firefox < 3.6
+			'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2',
+			'Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.1.1) Gecko/20070311 Firefox/2.0.0.1',
+			// BlackBerry < 6
+			'BlackBerry9300/5.0.0.716 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/133',
+			'BlackBerry7250/4.0.0 Profile/MIDP-2.0 Configuration/CLDC-1.1',
+			// Open WebOS < 1.5 (Palm Pre, Palm Pixi)
+			'Mozilla/5.0 (webOS/1.0; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/1.0',
+			'Mozilla/5.0 (webOS/1.4.0; U; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pixi/1.1 ',
+			// SymbianOS
+			'NokiaN95_8GB-3;Mozilla/5.0 SymbianOS/9.2;U;Series60/3.1 NokiaN95_8GB-3/11.2.011 Profile/MIDP-2.0 Configuration/CLDC-1.1 AppleWebKit/413 (KHTML, like Gecko)',
+			'Nokia7610/2.0 (5.0509.0) SymbianOS/7.0s Series60/2.1 Profile/MIDP-2.0 Configuration/CLDC-1.0 ',
+			'Mozilla/5.0 (SymbianOS/9.1; U; [en]; SymbianOS/91 Series60/3.0) AppleWebKit/413 (KHTML, like Gecko) Safari/413',
+			'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE52-2/091.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.34 Mobile Safari/533.4',
+			// NetFront
+			'Mozilla/4.0 (compatible; Linux 2.6.10) NetFront/3.3 Kindle/1.0 (screen 600x800)',
+			'Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.0 (screen 824x1200; rotate)',
+			'Mozilla/4.08 (Windows; Mobile Content Viewer/1.0) NetFront/3.2',
+			// Opera Mini
+			'Opera/9.80 (J2ME/MIDP; Opera Mini/3.1.10423/22.387; U; en) Presto/2.5.25 Version/10.54',
+			'Opera/9.50 (J2ME/MIDP; Opera Mini/4.0.10031/298; U; en)',
+			'Opera/9.80 (J2ME/MIDP; Opera Mini/6.24093/26.1305; U; en) Presto/2.8.119 Version/10.54',
+			'Opera/9.80 (Android; Opera Mini/7.29530/27.1407; U; en) Presto/2.8.119 Version/11.10',
+			// Ovi Browser
+			'Mozilla/5.0 (Series40; NokiaX3-02/05.60; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.2.0.0.6',
+			'Mozilla/5.0 (Series40; Nokia305/05.92; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.7.0.0.11'
+		],
+		// No explicit support for or against these browsers, they're
+		// given a shot at Grade A at their own risk.
+		gradeX: [
+			// Firefox 3.6
+			'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3',
+			// Gecko
+			'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060928 (Debian|Debian-1.8.0.7-1) Epiphany/2.14',
+			'Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.6) Gecko/20070817 IceWeasel/2.0.0.6-g2',
+			// KHTML
+			'Mozilla/5.0 (compatible; Konqueror/4.3; Linux) KHTML/4.3.5 (like Gecko)',
+			// Text browsers
+			'Links (2.1pre33; Darwin 8.11.0 Power Macintosh; x)',
+			'Links (6.9; Unix 6.9-astral sparc; 80x25)',
+			'Lynx/2.8.6rel.4 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.8g',
+			'w3m/0.5.1',
+			// Bots
+			'Googlebot/2.1 (+http://www.google.com/bot.html)',
+			'Mozilla/5.0 (compatible; googlebot/2.1; +http://www.google.com/bot.html)',
+			'Mozilla/5.0 (compatible; YandexBot/3.0)',
+			// Scripts
+			'curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5',
+			'Wget/1.9',
+			'Wget/1.10.1 (Red Hat modified)',
+			// Unknown
+			'I\'m an unknown browser',
+			// Empty
+			''
+		]
+	};
+
+	QUnit.module( 'startup', QUnit.newMwEnvironment() );
+
+	QUnit.test( 'isCompatible( Grade A )', testcases.gradeA.length, function ( assert ) {
+		$.each( testcases.gradeA, function ( i, ua ) {
+				assert.strictEqual( isCompatible( ua ), true, ua );
+			}
+		);
+	} );
+
+	QUnit.test( 'isCompatible( Grade B )', testcases.gradeB.length, function ( assert ) {
+		$.each( testcases.gradeB, function ( i, ua ) {
+				assert.strictEqual( isCompatible( ua ), false, ua );
+			}
+		);
+	} );
+
+	QUnit.test( 'isCompatible( Grade X )', testcases.gradeX.length, function ( assert ) {
+		$.each( testcases.gradeX, function ( i, ua ) {
+				assert.strictEqual( isCompatible( ua ), true, ua );
+			}
+		);
+	} );
+
+}( jQuery ) );
diff --git a/tests/selenium/Selenium.php b/tests/selenium/Selenium.php
deleted file mode 100644
index 07f98671..00000000
--- a/tests/selenium/Selenium.php
+++ /dev/null
@@ -1,191 +0,0 @@
-<?php
-/**
- * Selenium connector
- * This is implemented as a singleton.
- */
-
-require( 'Testing/Selenium.php' );
-
-class Selenium {
-	protected static $_instance = null;
-
-	public $isStarted = false;
-	public $tester;
-
-	protected $port;
-	protected $host;
-	protected $browser;
-	protected $browsers;
-	protected $logger;
-	protected $user;
-	protected $pass;
-	protected $timeout = 30000;
-	protected $verbose;
-	protected $junitlogfile; //processed by phpUnderControl
-	protected $runagainstgrid = false;
-
-	/**
-	 * @todo this shouldn't have to be static
-	 */
-	static protected $url;
-
-	/**
-	 * Override parent
-	 */
-	public function __construct() {
-		/**
-		 * @todo this is an ugly hack to make information available to
-		 * other tests.  It should be fixed.
-		 */
-		if ( null === self::$_instance ) {
-			self::$_instance = $this;
-		} else {
-			throw new MWException( "Already have one Selenium instance." );
-		}
-	}
-
-	public function start() {
-		$this->tester = new Testing_Selenium( $this->browser, self::$url, $this->host,
-			$this->port, $this->timeout );
-		if ( method_exists( $this->tester, "setVerbose" ) ) {
-			$this->tester->setVerbose( $this->verbose );
-		}
-
-		$this->tester->start();
-		$this->isStarted = true;
-	}
-
-	public function stop() {
-		$this->tester->stop();
-		$this->tester = null;
-		$this->isStarted = false;
-	}
-
-	public function login() {
-		if ( strlen( $this->user ) == 0 ) {
-			return;
-		}
-		$this->open( self::$url . '/index.php?title=Special:Userlogin' );
-		$this->type( 'wpName1', $this->user );
-		$this->type( 'wpPassword1', $this->pass );
-		$this->click( "//input[@id='wpLoginAttempt']" );
-		$this->waitForPageToLoad( 10000 );
-
-		// after login we redirect to the main page. So check whether the "Prefernces" top menu item exists
-		$value = $this->isElementPresent( "//li[@id='pt-preferences']" );
-
-		if ( $value != true ) {
-			throw new Testing_Selenium_Exception( "Login Failed" );
-		}
-
-	}
-
-	public static function getInstance() {
-		if ( null === self::$_instance ) {
-			throw new MWException( "No instance set yet" );
-		}
-
-		return self::$_instance;
-	}
-
-	public function loadPage( $title, $action ) {
-		$this->open( self::$url . '/index.php?title=' . $title . '&action=' . $action );
-	}
-
-	public function setLogger( $logger ) {
-		$this->logger = $logger;
-	}
-
-	public function getLogger() {
-		return $this->logger;
-	}
-
-	public function log( $message ) {
-		$this->logger->write( $message );
-	}
-
-	public function setUrl( $url ) {
-		self::$url = $url;
-	}
-
-	public static function getUrl() {
-		return self::$url;
-	}
-
-	public function setPort( $port ) {
-		$this->port = $port;
-	}
-
-	public function getPort() {
-		return $this->port;
-	}
-
-	public function setUser( $user ) {
-		$this->user = $user;
-	}
-
-	// Function to get username
-	public function getUser() {
-		return $this->user;
-	}
-
-
-	public function setPass( $pass ) {
-		$this->pass = $pass;
-	}
-
-	//add function to get password
-	public function getPass() {
-		return $this->pass;
-	}
-
-	public function setHost( $host ) {
-		$this->host = $host;
-	}
-
-	public function setVerbose( $verbose ) {
-		$this->verbose = $verbose;
-	}
-
-	public function setAvailableBrowsers( $availableBrowsers ) {
-		$this->browsers = $availableBrowsers;
-	}
-
-	public function setJUnitLogfile( $junitlogfile ) {
-		$this->junitlogfile = $junitlogfile;
-	}
-
-	public function getJUnitLogfile() {
-		return $this->junitlogfile;
-	}
-
-	public function setRunAgainstGrid( $runagainstgrid ) {
-		$this->runagainstgrid = $runagainstgrid;
-	}
-
-	public function setBrowser( $b ) {
-		if ( $this->runagainstgrid ) {
-			$this->browser = $b;
-			return true;
-		}
-		if ( !isset( $this->browsers[$b] ) ) {
-			throw new MWException( "Invalid Browser: $b.\n" );
-		}
-
-		$this->browser = $this->browsers[$b];
-	}
-
-	public function getAvailableBrowsers() {
-		return $this->browsers;
-	}
-
-	public function __call( $name, $args ) {
-		$t = call_user_func_array( array( $this->tester, $name ), $args );
-		return $t;
-	}
-
-	// Prevent external cloning
-	protected function __clone() {}
-	// Prevent external construction
-	// protected function __construct() {}
-}
diff --git a/tests/selenium/SeleniumConfig.php b/tests/selenium/SeleniumConfig.php
deleted file mode 100644
index 0823275c..00000000
--- a/tests/selenium/SeleniumConfig.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-if ( !defined( 'SELENIUMTEST' ) ) {
-	die( 1 );
-}
-
-class SeleniumConfig {
-
-	/**
-	 * Retreives the Selenium configuration values from an ini file.
-	 * See sample config file in selenium_settings.ini.sample
-	 *
-	 */
-	public static function getSeleniumSettings( &$seleniumSettings,
-												&$seleniumBrowsers,
-												&$seleniumTestSuites,
-												$seleniumConfigFile = null ) {
-		if ( strlen( $seleniumConfigFile ) == 0 ) {
-			global $wgSeleniumConfigFile;
-			if ( isset( $wgSeleniumConfigFile ) ) {
-				$seleniumConfigFile = $wgSeleniumConfigFile;
-			}
-		}
-
-		if ( strlen( $seleniumConfigFile ) == 0 || !file_exists( $seleniumConfigFile ) ) {
-			throw new MWException( "Unable to read local Selenium Settings from " . $seleniumConfigFile . "\n" );
-		}
-
-		$configArray = parse_ini_file( $seleniumConfigFile, true );
-		if ( $configArray === false ) {
-			throw new MWException( "Error parsing " . $seleniumConfigFile . "\n" );
-		}
-
-		if ( array_key_exists( 'SeleniumSettings', $configArray ) ) {
-			wfSuppressWarnings();
-			//we may need to change how this is set. But for now leave it in the ini file
-			$seleniumBrowsers = $configArray['SeleniumSettings']['browsers'];
-
-			$seleniumSettings['host'] = $configArray['SeleniumSettings']['host'];
-			$seleniumSettings['port'] = $configArray['SeleniumSettings']['port'];
-			$seleniumSettings['wikiUrl'] = $configArray['SeleniumSettings']['wikiUrl'];
-			$seleniumSettings['username'] = $configArray['SeleniumSettings']['username'];
-			$seleniumSettings['userPassword'] = $configArray['SeleniumSettings']['userPassword'];
-			$seleniumSettings['testBrowser'] = $configArray['SeleniumSettings']['testBrowser'];
-			$seleniumSettings['startserver'] = $configArray['SeleniumSettings']['startserver'];
-			$seleniumSettings['stopserver'] = $configArray['SeleniumSettings']['stopserver'];
-			$seleniumSettings['seleniumserverexecpath'] = $configArray['SeleniumSettings']['seleniumserverexecpath'];
-			$seleniumSettings['jUnitLogFile'] = $configArray['SeleniumSettings']['jUnitLogFile'];
-			$seleniumSettings['runAgainstGrid'] = $configArray['SeleniumSettings']['runAgainstGrid'];
-
-			wfRestoreWarnings();
-		}
-		if ( array_key_exists( 'SeleniumTests', $configArray ) ) {
-			wfSuppressWarnings();
-			$seleniumTestSuites = $configArray['SeleniumTests']['testSuite'];
-			wfRestoreWarnings();
-		}
-		return true;
-	}
-
-	private static function parse_ini_line( $iniLine ) {
-		static $specialValues = array( 'false' => false, 'true' => true, 'null' => null );
-		list( $key, $value ) = explode( '=', $iniLine, 2 );
-		$key = trim( $key );
-		$value = trim( $value );
-
-		if ( isset( $specialValues[$value] ) ) {
-			$value = $specialValues[$value];
-		} else {
-			$value = trim( $value, '"' );
-		}
-
-		/* Support one-level arrays */
-		if ( preg_match( '/^([A-Za-z]+)\[([A-Za-z]+)\]/', $key, $m ) ) {
-			$key = $m[1];
-			$value = array( $m[2] => $value );
-		}
-
-		return array( $key => $value );
-	}
-}
diff --git a/tests/selenium/SeleniumLoader.php b/tests/selenium/SeleniumLoader.php
deleted file mode 100644
index 8d5e7713..00000000
--- a/tests/selenium/SeleniumLoader.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-class SeleniumLoader {
-	static function load() {
-		require_once( 'Testing/Selenium.php' );
-		require_once( 'PHPUnit/Framework.php' );
-		require_once( 'PHPUnit/Extensions/SeleniumTestCase.php' );
-	}
-}
diff --git a/tests/selenium/SeleniumServerManager.php b/tests/selenium/SeleniumServerManager.php
deleted file mode 100644
index 9efa509a..00000000
--- a/tests/selenium/SeleniumServerManager.php
+++ /dev/null
@@ -1,252 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
- * http://citizendium.org/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class SeleniumServerManager {
-	private $SeleniumStartServer = false;
-	private $OS = '';
-	private $SeleniumServerPid = 'NaN';
-	private $SeleniumServerPort = 4444;
-	private $SeleniumServerStartTimeout = 10; // 10 secs.
-	private $SeleniumServerExecPath;
-
-	public function __construct( $startServer,
-								 $serverPort,
-								 $serverExecPath ) {
-		$this->OS = (string)PHP_OS;
-
-		if ( isset( $startServer ) ) {
-			$this->SeleniumStartServer = $startServer;
-		}
-
-		if ( isset( $serverPort ) ) {
-			$this->SeleniumServerPort = $serverPort;
-		}
-
-		if ( isset( $serverExecPath ) ) {
-			$this->SeleniumServerExecPath = $serverExecPath;
-		}
-
-		return;
-	}
-
-	// Getters for certain private attributes. No setters, since they
-	// should not change after the manager object is created.
-
-	public function getSeleniumStartServer() {
-		return $this->SeleniumStartServer;
-	}
-
-	public function getSeleniumServerPort() {
-		return $this->SeleniumServerPort;
-	}
-
-	public function getSeleniumServerPid() {
-		return $this->SeleniumServerPid;
-	}
-
-	// Changing value of SeleniumStartServer allows starting server after
-	// creation of the class instance. Only allow setting SeleniumStartServer
-	// to true, since after server is started, it is shut down by stop().
-
-	public function setSeleniumStartServer( $startServer ) {
-		if ( $startServer == true ) {
-			$this->SeleniumStartServer = true;
-		}
-	}
-
-	// return values are: 1) started - server started, 2) failed -
-	// server not started, 3) running - instructed to start server, but
-	// server already running
-
-	public function start() {
-
-		if ( !$this->SeleniumStartServer ) {
-			return 'failed';
-		}
-
-		// commented out cases are untested
-
-		switch ( $this->OS ) {
-			case "Linux":
-#			case' CYGWIN_NT-5.1':
-			case 'Darwin':
-#			case 'FreeBSD':
-#			case 'HP-UX':
-#			case 'IRIX64':
-#			case 'NetBSD':
-#			case 'OpenBSD':
-#			case 'SunOS':
-#			case 'Unix':
-				// *nix based OS
-				return $this->startServerOnUnix();
-				break;
-			case "Windows":
-			case "WIN32":
-			case "WINNT":
-				// Windows
-				return $this->startServerOnWindows();
-				break;
-			default:
-				// An untested OS
-				return 'failed';
-				break;
-		}
-	}
-
-	public function stop() {
-
-		// commented out cases are untested
-
-		switch ( $this->OS ) {
-			case "Linux":
-#			case' CYGWIN_NT-5.1':
-			case 'Darwin':
-#			case 'FreeBSD':
-#			case 'HP-UX':
-#			case 'IRIX64':
-#			case 'NetBSD':
-#			case 'OpenBSD':
-#			case 'SunOS':
-#			case 'Unix':
-				// *nix based OS
-				return $this->stopServerOnUnix();
-				break;
-			case "Windows":
-			case "WIN32":
-			case "WINNT":
-				// Windows
-				return $this->stopServerOnWindows();
-				break;
-			default:
-				// An untested OS
-				return 'failed';
-				break;
-		}
-	}
-
-	private function startServerOnUnix() {
-
-		$output = array();
-		$user = $_ENV['USER'];
-		// @todo FIXME: This should be a little more generalized :)
-		if ( PHP_OS == 'Darwin' ) {
-			// Mac OS X's ps barfs on the 'w' param, but doesn't need it.
-			$ps = "ps -U %s";
-		} else {
-			// Good on Linux
-			$ps = "ps -U %s w";
-		}
-		$psCommand = sprintf( $ps, escapeshellarg( $user ) );
-		exec( $psCommand . " | grep -i selenium-server", $output );
-
-		// Start server. If there is already a server running,
-		// return running.
-
-		if ( isset( $this->SeleniumServerExecPath ) ) {
-			$found = 0;
-			foreach ( $output as $string ) {
-				$found += preg_match(
-					'~^(.*)java(.+)-jar(.+)selenium-server~',
-					$string );
-			}
-			if ( $found == 0 ) {
-
-				// Didn't find the selenium server. Start it up.
-				// First set up comamand line suffix.
-				// NB: $! is pid of last job run in background
-				// The echo guarentees it is put into $op when
-				// the exec command is run.
-
-				$commandSuffix = ' > /dev/null 2>&1' . ' & echo $!';
-				$portText = ' -port ' . $this->SeleniumServerPort;
-				$command = "java -jar " .
-					escapeshellarg( $this->SeleniumServerExecPath ) .
-					$portText . $commandSuffix;
-				exec( $command, $op );
-				$pid = (int)$op[0];
-				if ( $pid != "" ) {
-					$this->SeleniumServerPid = $pid;
-				} else {
-					$this->SeleniumServerPid = 'NaN';
-					// Server start failed.
-					return 'failed';
-				}
-				// Wait for the server to startup and listen
-				// on its port. Note: this solution kinda
-				// stinks, since it uses a wait loop - dnessett
-
-				wfSuppressWarnings();
-				for ( $cnt = 1;
-					  $cnt <= $this->SeleniumServerStartTimeout;
-					  $cnt++ ) {
-					$fp = fsockopen( 'localhost',
-						$this->SeleniumServerPort,
-						$errno, $errstr, 0 );
-					if ( !$fp ) {
-						sleep( 1 );
-						continue;
-						// Server start succeeded.
-					} else {
-						fclose( $fp );
-						return 'started';
-					}
-				}
-				wfRestoreWarnings();
-				echo ( "Starting Selenium server timed out.\n" );
-				return 'failed';
-			} else {
-				// server already running.
-				return 'running';
-			}
-
-		}
-
-		// No Server execution path defined.
-		return 'failed';
-	}
-
-	private function startServerOnWindows() {
-		// Unimplemented.
-		return 'failed';
-	}
-
-	private function stopServerOnUnix() {
-
-		if ( !empty( $this->SeleniumServerPid ) &&
-			$this->SeleniumServerPid != 'NaN'
-		) {
-			exec( "kill -9 " . $this->SeleniumServerPid );
-			return 'stopped';
-		} else {
-			return 'failed';
-		}
-	}
-
-	private function stopServerOnWindows() {
-		// Unimplemented.
-		return 'failed';
-
-	}
-}
diff --git a/tests/selenium/SeleniumTestCase.php b/tests/selenium/SeleniumTestCase.php
deleted file mode 100644
index 5346b1be..00000000
--- a/tests/selenium/SeleniumTestCase.php
+++ /dev/null
@@ -1,127 +0,0 @@
-<?php
-include( "SeleniumTestConstants.php" );
-
-class SeleniumTestCase extends PHPUnit_Framework_TestCase { // PHPUnit_Extensions_SeleniumTestCase
-	protected $selenium;
-
-	public function setUp() {
-		set_time_limit( 60 );
-		$this->selenium = Selenium::getInstance();
-	}
-
-	public function tearDown() {
-
-	}
-
-	public function __call( $method, $args ) {
-		return call_user_func_array( array( $this->selenium, $method ), $args );
-	}
-
-	public function assertSeleniumAttributeEquals( $attribute, $value ) {
-		$attr = $this->getAttribute( $attribute );
-		$this->assertEquals( $attr, $value );
-	}
-
-	public function assertSeleniumHTMLContains( $element, $text ) {
-		$innerHTML = $this->getText( $element );
-		// or assertContains
-		$this->assertRegExp( "/$text/", $innerHTML );
-	}
-
-
-	/**
-	 * Create a test fixture page if one does not exist
-	 * @param $pageName The fixture page name. If none is supplied, it uses SeleniumTestConstants::WIKI_INTERNAL_LINK
-	 */
-	function createTestPageIfMissing( $pageName = null ) {
-		if ( $pageName == null ) {
-			$pageName = SeleniumTestConstants::WIKI_INTERNAL_LINK;
-		}
-		$this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, $pageName );
-		$this->click( SeleniumTestConstants::BUTTON_SEARCH );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->click( SeleniumTestConstants::LINK_START . $pageName );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$location = $this->getLocation() . "\n";
-		if ( strpos( $location, '&redlink=1' ) !== false ) {
-			$this->type( SeleniumTestConstants::TEXT_EDITOR, "Test fixture page. No real content here" );
-			$this->click( SeleniumTestConstants::BUTTON_SAVE );
-			$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-			$this->assertTrue( $this->isTextPresent( $pageName ),
-				$this->getText( SeleniumTestConstants::TEXT_PAGE_HEADING ) );
-		}
-	}
-
-	/**
-	 * Create a test page using date as part of the name so that it is unique
-	 * @param $pagePrefix The prefix to use for the page name. The current date will be appended to this to make it unique
-	 * @param $watchThis Whether to add the page to my watchlist. Defaults to false.
-	 */
-	function createNewTestPage( $pagePrefix, $watchThis = false ) {
-		$pageName = $pagePrefix . date( "Ymd-His" );
-		$this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, $pageName );
-		$this->click( SeleniumTestConstants::BUTTON_SEARCH );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->click( SeleniumTestConstants::LINK_START . $pageName );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$location = $this->getLocation() . "\n";
-		$this->assertContains( '&redlink=1', $location ) .
-			$this->type( SeleniumTestConstants::TEXT_EDITOR, "Test fixture page. No real content here" );
-		if ( $watchThis ) {
-			$this->click( "wpWatchthis" );
-		}
-		$this->click( SeleniumTestConstants::BUTTON_SAVE );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->assertTrue( $this->isTextPresent( $pageName ),
-			$this->getText( SeleniumTestConstants::TEXT_PAGE_HEADING ) );
-		return $pageName;
-	}
-
-	public function getExistingPage() {
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-		$this->type( "searchInput", "new" );
-		$this->click( "searchGoButton" );
-		$this->waitForPageToLoad( "30000" );
-	}
-
-	public function getNewPage( $pageName ) {
-
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-		$this->type( "searchInput", $pageName );
-		$this->click( "searchGoButton" );
-		$this->waitForPageToLoad( "30000" );
-		$this->click( "link=" . $pageName );
-		$this->waitForPageToLoad( "600000" );
-
-
-	}
-
-	// Loading the mediawiki editor
-	public function loadWikiEditor() {
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-	}
-
-	// Clear the content of the mediawiki editor
-	public function clearWikiEditor() {
-		$this->type( "wpTextbox1", "" );
-	}
-
-	// Click on the 'Show preview' button of the mediawiki editor
-	public function clickShowPreviewBtn() {
-		$this->click( "wpPreview" );
-	}
-
-	// Click on the 'Save Page' button of the mediawiki editor
-	public function clickSavePageBtn() {
-		$this->click( "wpSave" );
-	}
-
-	// Click on the 'Edit' link
-	public function clickEditLink() {
-		$this->click( "link=Edit" );
-		$this->waitForPageToLoad( "30000" );
-	}
-}
diff --git a/tests/selenium/SeleniumTestConsoleLogger.php b/tests/selenium/SeleniumTestConsoleLogger.php
deleted file mode 100644
index b6f5496c..00000000
--- a/tests/selenium/SeleniumTestConsoleLogger.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-class SeleniumTestConsoleLogger {
-	public function __construct() {
-		// Prepare testsuite for immediate output
-		@ini_set( 'zlib.output_compression', 0 );
-		@ini_set( 'implicit_flush', 1 );
-		for ( $i = 0; $i < ob_get_level(); $i++ ) {
-			ob_end_flush();
-		}
-		ob_implicit_flush( 1 );
-	}
-
-	public function write( $message, $mode = false ) {
-		$out = '';
-		// if ( $mode == SeleniumTestSuite::RESULT_OK ) $out .= '<font color="green">';
-		$out .= htmlentities( $message );
-		// if ( $mode == SeleniumTestSuite::RESULT_OK ) $out .= '</font>';
-		if ( $mode != SeleniumTestSuite::CONTINUE_LINE ) {
-			$out .= "\n";
-		}
-
-		echo $out;
-	}
-}
diff --git a/tests/selenium/SeleniumTestConstants.php b/tests/selenium/SeleniumTestConstants.php
deleted file mode 100644
index 1defb73c..00000000
--- a/tests/selenium/SeleniumTestConstants.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-class SeleniumTestConstants {
-	const WIKI_TEST_WAIT_TIME = 3000; // Waiting time
-
-	//commonly used links
-	const LINK_MAIN_PAGE = 'link=Main page';
-	const LINK_RANDOM_PAGE = 'link=Random article';
-	const TEXT_PAGE_HEADING = 'firstHeading';
-
-	const LINK_START = 'link=';
-	const TEXT_EDITOR = 'wpTextbox1';
-	const LINK_PREVIEW = 'wpPreview';
-	const LINK_EDIT = 'link=Edit';
-
-	const WIKI_SEARCH_PAGE = 'Hair (musical)'; // Page name to search
-	const WIKI_TEXT_SEARCH = 'TV'; // Text to search
-	const WIKI_INTERNAL_LINK = 'Wikieditor-Fixture-Page'; // Exisiting page name to add as an internal tag
-
-	const INPUT_SEARCH_BOX = 'searchInput';
-	const BUTTON_SEARCH = 'mw-searchButton';
-	const BUTTON_SAVE = 'wpSave';
-}
-
diff --git a/tests/selenium/SeleniumTestHTMLLogger.php b/tests/selenium/SeleniumTestHTMLLogger.php
deleted file mode 100644
index 21332cf0..00000000
--- a/tests/selenium/SeleniumTestHTMLLogger.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-class SeleniumTestHTMLLogger {
-	public function setHeaders() {
-		global $wgOut;
-		$wgOut->addHeadItem( 'selenium', '<style type="text/css">
-		.selenium pre {
-			overflow-x: auto; /* Use horizontal scroller if needed; for Firefox 2, not needed in Firefox 3 */
-			white-space: pre-wrap; /* css-3 */
-			white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
-			white-space: -pre-wrap; /* Opera 4-6 */
-			white-space: -o-pre-wrap; /* Opera 7 */
-			/* width: 99%; */
-			word-wrap: break-word; /* Internet Explorer 5.5+ */
-		}
-		.selenium-success { color: green }
-		</style>' );
-	}
-
-	public function write( $message, $mode = false ) {
-		global $wgOut;
-		$out = '';
-		if ( $mode == SeleniumTestSuite::RESULT_OK ) {
-			$out .= '<span class="selenium-success">';
-		}
-		$out .= htmlspecialchars( $message );
-		if ( $mode == SeleniumTestSuite::RESULT_OK ) {
-			$out .= '</span>';
-		}
-		if ( $mode != SeleniumTestSuite::CONTINUE_LINE ) {
-			$out .= '<br />';
-		}
-
-		$wgOut->addHTML( $out );
-	}
-}
diff --git a/tests/selenium/SeleniumTestListener.php b/tests/selenium/SeleniumTestListener.php
deleted file mode 100644
index dc0ac66c..00000000
--- a/tests/selenium/SeleniumTestListener.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-class SeleniumTestListener implements PHPUnit_Framework_TestListener {
-	private $logger;
-	private $tests_ok = 0;
-	private $tests_failed = 0;
-
-	public function __construct( $loggerInstance ) {
-		$this->logger = $loggerInstance;
-	}
-
-	public function addError( PHPUnit_Framework_Test $test, Exception $e, $time ) {
-		$this->logger->write( 'Error: ' . $e->getMessage() );
-		$this->tests_failed++;
-	}
-
-	public function addFailure( PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time ) {
-		$this->logger->write( 'Failed: ' . $e->getMessage() );
-		$this->tests_failed++;
-	}
-
-	public function addIncompleteTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
-		$this->logger->write( 'Incomplete.' );
-		$this->tests_failed++;
-	}
-
-	public function addSkippedTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
-		$this->logger->write( 'Skipped.' );
-		$this->tests_failed++;
-	}
-
-	public function startTest( PHPUnit_Framework_Test $test ) {
-		$this->logger->write(
-			'Testing ' . $test->getName() . ' ... ',
-			SeleniumTestSuite::CONTINUE_LINE
-		);
-	}
-
-	public function endTest( PHPUnit_Framework_Test $test, $time ) {
-		if ( !$test->hasFailed() ) {
-			$this->logger->write( 'OK', SeleniumTestSuite::RESULT_OK );
-			$this->tests_ok++;
-		}
-	}
-
-	public function startTestSuite( PHPUnit_Framework_TestSuite $suite ) {
-		$this->logger->write( 'Testsuite ' . $suite->getName() . ' started.' );
-		$this->tests_ok = 0;
-		$this->tests_failed = 0;
-	}
-
-	public function endTestSuite( PHPUnit_Framework_TestSuite $suite ) {
-		$this->logger->write( 'Testsuite ' . $suite->getName() . ' ended.' );
-		if ( $this->tests_ok > 0 || $this->tests_failed > 0 ) {
-			$this->logger->write( ' OK: ' . $this->tests_ok . ' Failed: ' . $this->tests_failed );
-		}
-		$this->tests_ok = 0;
-		$this->tests_failed = 0;
-	}
-
-	public function statusMessage( $message ) {
-		$this->logger->write( $message );
-	}
-}
-
diff --git a/tests/selenium/SeleniumTestSuite.php b/tests/selenium/SeleniumTestSuite.php
deleted file mode 100644
index 8c21f21c..00000000
--- a/tests/selenium/SeleniumTestSuite.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-abstract class SeleniumTestSuite extends PHPUnit_Framework_TestSuite {
-	private $selenium;
-	private $isSetUp = false;
-	private $loginBeforeTests = true;
-	private $triggerClientTestResources = true;
-
-	// Do not add line break after test output
-	const CONTINUE_LINE = 1;
-	const RESULT_OK = 2;
-	const RESULT_ERROR = 3;
-
-	abstract public function addTests();
-
-	public function setUp() {
-		// Hack because because PHPUnit version 3.0.6 which is on prototype does not
-		// run setUp as part of TestSuite::run
-		if ( $this->isSetUp ) {
-			return;
-		}
-		$this->isSetUp = true;
-		$this->selenium = Selenium::getInstance();
-		$this->selenium->start();
-		if ( $this->triggerClientTestResources ) {
-			$this->selenium->open( $this->selenium->getUrl() . '/index.php?setupTestSuite=' . $this->getName() );
-			//wait a little longer for the db operation
-			$this->selenium->waitForPageToLoad( 6000 );
-		}
-		if ( $this->loginBeforeTests ) {
-			$this->login();
-		}
-	}
-
-	public function tearDown() {
-		if ( $this->triggerClientTestResources ) {
-			$this->selenium->open( $this->selenium->getUrl() . '/index.php?clearTestSuite=' . $this->getName() );
-		}
-		$this->selenium->stop();
-	}
-
-	public function login() {
-		$this->selenium->login();
-	}
-
-	public function loadPage( $title, $action ) {
-		$this->selenium->loadPage( $title, $action );
-	}
-
-	protected function setLoginBeforeTests( $loginBeforeTests = true ) {
-		$this->loginBeforeTests = $loginBeforeTests;
-	}
-
-	protected function setTriggerClientTestResources( $triggerClientTestResources = true ) {
-		$this->triggerClientTestResources = $triggerClientTestResources;
-	}
-}
diff --git a/tests/selenium/data/SimpleSeleniumTestDB.sql b/tests/selenium/data/SimpleSeleniumTestDB.sql
deleted file mode 100644
index 99ae4779..00000000
--- a/tests/selenium/data/SimpleSeleniumTestDB.sql
+++ /dev/null
@@ -1,1453 +0,0 @@
--- MySQL dump 10.13  Distrib 5.1.41, for debian-linux-gnu (x86_64)
---
--- Host: localhost    Database: test_wiki
--- ------------------------------------------------------
--- Server version	5.1.41-3ubuntu12.7
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `mw_archive`
---
-
-DROP TABLE IF EXISTS `mw_archive`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_archive` (
-  `ar_namespace` int(11) NOT NULL DEFAULT '0',
-  `ar_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `ar_text` mediumblob NOT NULL,
-  `ar_comment` tinyblob NOT NULL,
-  `ar_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `ar_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `ar_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `ar_minor_edit` tinyint(4) NOT NULL DEFAULT '0',
-  `ar_flags` tinyblob NOT NULL,
-  `ar_rev_id` int(10) unsigned DEFAULT NULL,
-  `ar_text_id` int(10) unsigned DEFAULT NULL,
-  `ar_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `ar_len` int(10) unsigned DEFAULT NULL,
-  `ar_page_id` int(10) unsigned DEFAULT NULL,
-  `ar_parent_id` int(10) unsigned DEFAULT NULL,
-  KEY `name_title_timestamp` (`ar_namespace`,`ar_title`,`ar_timestamp`),
-  KEY `usertext_timestamp` (`ar_user_text`,`ar_timestamp`),
-  KEY `ar_revid` (`ar_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_archive`
---
-
-LOCK TABLES `mw_archive` WRITE;
-/*!40000 ALTER TABLE `mw_archive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_archive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_category`
---
-
-DROP TABLE IF EXISTS `mw_category`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_category` (
-  `cat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `cat_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `cat_pages` int(11) NOT NULL DEFAULT '0',
-  `cat_subcats` int(11) NOT NULL DEFAULT '0',
-  `cat_files` int(11) NOT NULL DEFAULT '0',
-  `cat_hidden` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`cat_id`),
-  UNIQUE KEY `cat_title` (`cat_title`),
-  KEY `cat_pages` (`cat_pages`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_category`
---
-
-LOCK TABLES `mw_category` WRITE;
-/*!40000 ALTER TABLE `mw_category` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_category` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_categorylinks`
---
-
-DROP TABLE IF EXISTS `mw_categorylinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_categorylinks` (
-  `cl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `cl_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `cl_sortkey` varbinary(230) NOT NULL DEFAULT '',
-  `cl_sortkey_prefix` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `cl_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-  `cl_collation` varbinary(32) NOT NULL DEFAULT '',
-  `cl_type` enum('page','subcat','file') NOT NULL DEFAULT 'page',
-  UNIQUE KEY `cl_from` (`cl_from`,`cl_to`),
-  KEY `cl_sortkey` (`cl_to`,`cl_type`,`cl_sortkey`,`cl_from`),
-  KEY `cl_timestamp` (`cl_to`,`cl_timestamp`),
-  KEY `cl_collation` (`cl_collation`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_categorylinks`
---
-
-LOCK TABLES `mw_categorylinks` WRITE;
-/*!40000 ALTER TABLE `mw_categorylinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_categorylinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_change_tag`
---
-
-DROP TABLE IF EXISTS `mw_change_tag`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_change_tag` (
-  `ct_rc_id` int(11) DEFAULT NULL,
-  `ct_log_id` int(11) DEFAULT NULL,
-  `ct_rev_id` int(11) DEFAULT NULL,
-  `ct_tag` varchar(255) NOT NULL,
-  `ct_params` blob,
-  UNIQUE KEY `change_tag_rc_tag` (`ct_rc_id`,`ct_tag`),
-  UNIQUE KEY `change_tag_log_tag` (`ct_log_id`,`ct_tag`),
-  UNIQUE KEY `change_tag_rev_tag` (`ct_rev_id`,`ct_tag`),
-  KEY `change_tag_tag_id` (`ct_tag`,`ct_rc_id`,`ct_rev_id`,`ct_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_change_tag`
---
-
-LOCK TABLES `mw_change_tag` WRITE;
-/*!40000 ALTER TABLE `mw_change_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_change_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_external_user`
---
-
-DROP TABLE IF EXISTS `mw_external_user`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_external_user` (
-  `eu_local_id` int(10) unsigned NOT NULL,
-  `eu_external_id` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  PRIMARY KEY (`eu_local_id`),
-  UNIQUE KEY `eu_external_id` (`eu_external_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_external_user`
---
-
-LOCK TABLES `mw_external_user` WRITE;
-/*!40000 ALTER TABLE `mw_external_user` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_external_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_externallinks`
---
-
-DROP TABLE IF EXISTS `mw_externallinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_externallinks` (
-  `el_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `el_to` blob NOT NULL,
-  `el_index` blob NOT NULL,
-  KEY `el_from` (`el_from`,`el_to`(40)),
-  KEY `el_to` (`el_to`(60),`el_from`),
-  KEY `el_index` (`el_index`(60))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_externallinks`
---
-
-LOCK TABLES `mw_externallinks` WRITE;
-/*!40000 ALTER TABLE `mw_externallinks` DISABLE KEYS */;
-INSERT INTO `mw_externallinks` VALUES (1,'http://meta.wikimedia.org/wiki/Help:Contents','http://org.wikimedia.meta./wiki/Help:Contents'),(1,'http://www.mediawiki.org/wiki/Manual:Configuration_settings','http://org.mediawiki.www./wiki/Manual:Configuration_settings'),(1,'http://www.mediawiki.org/wiki/Manual:FAQ','http://org.mediawiki.www./wiki/Manual:FAQ'),(1,'https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce','https://org.wikimedia.lists./mailman/listinfo/mediawiki-announce');
-/*!40000 ALTER TABLE `mw_externallinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_filearchive`
---
-
-DROP TABLE IF EXISTS `mw_filearchive`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_filearchive` (
-  `fa_id` int(11) NOT NULL AUTO_INCREMENT,
-  `fa_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `fa_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '',
-  `fa_storage_group` varbinary(16) DEFAULT NULL,
-  `fa_storage_key` varbinary(64) DEFAULT '',
-  `fa_deleted_user` int(11) DEFAULT NULL,
-  `fa_deleted_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `fa_deleted_reason` text,
-  `fa_size` int(10) unsigned DEFAULT '0',
-  `fa_width` int(11) DEFAULT '0',
-  `fa_height` int(11) DEFAULT '0',
-  `fa_metadata` mediumblob,
-  `fa_bits` int(11) DEFAULT '0',
-  `fa_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
-  `fa_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') DEFAULT 'unknown',
-  `fa_minor_mime` varbinary(100) DEFAULT 'unknown',
-  `fa_description` tinyblob,
-  `fa_user` int(10) unsigned DEFAULT '0',
-  `fa_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
-  `fa_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `fa_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`fa_id`),
-  KEY `fa_name` (`fa_name`,`fa_timestamp`),
-  KEY `fa_storage_group` (`fa_storage_group`,`fa_storage_key`),
-  KEY `fa_deleted_timestamp` (`fa_deleted_timestamp`),
-  KEY `fa_user_timestamp` (`fa_user_text`,`fa_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_filearchive`
---
-
-LOCK TABLES `mw_filearchive` WRITE;
-/*!40000 ALTER TABLE `mw_filearchive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_filearchive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_hitcounter`
---
-
-DROP TABLE IF EXISTS `mw_hitcounter`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_hitcounter` (
-  `hc_id` int(10) unsigned NOT NULL
-) ENGINE=MEMORY DEFAULT CHARSET=latin1 MAX_ROWS=25000;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_hitcounter`
---
-
-LOCK TABLES `mw_hitcounter` WRITE;
-/*!40000 ALTER TABLE `mw_hitcounter` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_hitcounter` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_image`
---
-
-DROP TABLE IF EXISTS `mw_image`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_image` (
-  `img_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `img_size` int(10) unsigned NOT NULL DEFAULT '0',
-  `img_width` int(11) NOT NULL DEFAULT '0',
-  `img_height` int(11) NOT NULL DEFAULT '0',
-  `img_metadata` mediumblob NOT NULL,
-  `img_bits` int(11) NOT NULL DEFAULT '0',
-  `img_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
-  `img_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') NOT NULL DEFAULT 'unknown',
-  `img_minor_mime` varbinary(100) NOT NULL DEFAULT 'unknown',
-  `img_description` tinyblob NOT NULL,
-  `img_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `img_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `img_timestamp` varbinary(14) NOT NULL DEFAULT '',
-  `img_sha1` varbinary(32) NOT NULL DEFAULT '',
-  PRIMARY KEY (`img_name`),
-  KEY `img_usertext_timestamp` (`img_user_text`,`img_timestamp`),
-  KEY `img_size` (`img_size`),
-  KEY `img_timestamp` (`img_timestamp`),
-  KEY `img_sha1` (`img_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_image`
---
-
-LOCK TABLES `mw_image` WRITE;
-/*!40000 ALTER TABLE `mw_image` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_image` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_imagelinks`
---
-
-DROP TABLE IF EXISTS `mw_imagelinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_imagelinks` (
-  `il_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `il_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `il_from` (`il_from`,`il_to`),
-  UNIQUE KEY `il_to` (`il_to`,`il_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_imagelinks`
---
-
-LOCK TABLES `mw_imagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_imagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_imagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_interwiki`
---
-
-DROP TABLE IF EXISTS `mw_interwiki`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_interwiki` (
-  `iw_prefix` varchar(32) NOT NULL,
-  `iw_url` blob NOT NULL,
-  `iw_api` blob NOT NULL,
-  `iw_wikiid` varchar(64) NOT NULL,
-  `iw_local` tinyint(1) NOT NULL,
-  `iw_trans` tinyint(4) NOT NULL DEFAULT '0',
-  UNIQUE KEY `iw_prefix` (`iw_prefix`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_interwiki`
---
-
-LOCK TABLES `mw_interwiki` WRITE;
-/*!40000 ALTER TABLE `mw_interwiki` DISABLE KEYS */;
-INSERT INTO `mw_interwiki` VALUES ('acronym','http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=$1','','',0,0),('advogato','http://www.advogato.org/$1','','',0,0),('annotationwiki','http://www.seedwiki.com/page.cfm?wikiid=368&doc=$1','','',0,0),('arxiv','http://www.arxiv.org/abs/$1','','',0,0),('c2find','http://c2.com/cgi/wiki?FindPage&value=$1','','',0,0),('cache','http://www.google.com/search?q=cache:$1','','',0,0),('commons','http://commons.wikimedia.org/wiki/$1','','',0,0),('corpknowpedia','http://corpknowpedia.org/wiki/index.php/$1','','',0,0),('dictionary','http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1','','',0,0),('disinfopedia','http://www.disinfopedia.org/wiki.phtml?title=$1','','',0,0),('docbook','http://wiki.docbook.org/topic/$1','','',0,0),('doi','http://dx.doi.org/$1','','',0,0),('drumcorpswiki','http://www.drumcorpswiki.com/index.php/$1','','',0,0),('dwjwiki','http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1','','',0,0),('elibre','http://enciclopedia.us.es/index.php/$1','','',0,0),('emacswiki','http://www.emacswiki.org/cgi-bin/wiki.pl?$1','','',0,0),('foldoc','http://foldoc.org/?$1','','',0,0),('foxwiki','http://fox.wikis.com/wc.dll?Wiki~$1','','',0,0),('freebsdman','http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1','','',0,0),('gej','http://www.esperanto.de/cgi-bin/aktivikio/wiki.pl?$1','','',0,0),('gentoo-wiki','http://gentoo-wiki.com/$1','','',0,0),('google','http://www.google.com/search?q=$1','','',0,0),('googlegroups','http://groups.google.com/groups?q=$1','','',0,0),('hammondwiki','http://www.dairiki.org/HammondWiki/$1','','',0,0),('hewikisource','http://he.wikisource.org/wiki/$1','','',1,0),('hrwiki','http://www.hrwiki.org/index.php/$1','','',0,0),('imdb','http://us.imdb.com/Title?$1','','',0,0),('jargonfile','http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1','','',0,0),('jspwiki','http://www.jspwiki.org/wiki/$1','','',0,0),('keiki','http://kei.ki/en/$1','','',0,0),('kmwiki','http://kmwiki.wikispaces.com/$1','','',0,0),('linuxwiki','http://linuxwiki.de/$1','','',0,0),('lojban','http://www.lojban.org/tiki/tiki-index.php?page=$1','','',0,0),('lqwiki','http://wiki.linuxquestions.org/wiki/$1','','',0,0),('lugkr','http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1','','',0,0),('mathsongswiki','http://SeedWiki.com/page.cfm?wikiid=237&doc=$1','','',0,0),('meatball','http://www.usemod.com/cgi-bin/mb.pl?$1','','',0,0),('mediawikiwiki','http://www.mediawiki.org/wiki/$1','','',0,0),('mediazilla','https://bugzilla.wikimedia.org/$1','','',1,0),('memoryalpha','http://www.memory-alpha.org/en/index.php/$1','','',0,0),('metawiki','http://sunir.org/apps/meta.pl?$1','','',0,0),('metawikimedia','http://meta.wikimedia.org/wiki/$1','','',0,0),('moinmoin','http://purl.net/wiki/moin/$1','','',0,0),('mozillawiki','http://wiki.mozilla.org/index.php/$1','','',0,0),('mw','http://www.mediawiki.org/wiki/$1','','',0,0),('oeis','http://www.research.att.com/cgi-bin/access.cgi/as/njas/sequences/eisA.cgi?Anum=$1','','',0,0),('openfacts','http://openfacts.berlios.de/index.phtml?title=$1','','',0,0),('openwiki','http://openwiki.com/?$1','','',0,0),('pmeg','http://www.bertilow.com/pmeg/$1.php','','',0,0),('ppr','http://c2.com/cgi/wiki?$1','','',0,0),('pythoninfo','http://wiki.python.org/moin/$1','','',0,0),('rfc','http://www.rfc-editor.org/rfc/rfc$1.txt','','',0,0),('s23wiki','http://is-root.de/wiki/index.php/$1','','',0,0),('seattlewiki','http://seattle.wikia.com/wiki/$1','','',0,0),('seattlewireless','http://seattlewireless.net/?$1','','',0,0),('senseislibrary','http://senseis.xmp.net/?$1','','',0,0),('sourceforge','http://sourceforge.net/$1','','',0,0),('squeak','http://wiki.squeak.org/squeak/$1','','',0,0),('susning','http://www.susning.nu/$1','','',0,0),('svgwiki','http://wiki.svg.org/$1','','',0,0),('tavi','http://tavi.sourceforge.net/$1','','',0,0),('tejo','http://www.tejo.org/vikio/$1','','',0,0),('theopedia','http://www.theopedia.com/$1','','',0,0),('tmbw','http://www.tmbw.net/wiki/$1','','',0,0),('tmnet','http://www.technomanifestos.net/?$1','','',0,0),('tmwiki','http://www.EasyTopicMaps.com/?page=$1','','',0,0),('twiki','http://twiki.org/cgi-bin/view/$1','','',0,0),('uea','http://www.tejo.org/uea/$1','','',0,0),('unreal','http://wiki.beyondunreal.com/wiki/$1','','',0,0),('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1','','',0,0),('vinismo','http://vinismo.com/en/$1','','',0,0),('webseitzwiki','http://webseitz.fluxent.com/wiki/$1','','',0,0),('why','http://clublet.com/c/c/why?$1','','',0,0),('wiki','http://c2.com/cgi/wiki?$1','','',0,0),('wikia','http://www.wikia.com/wiki/$1','','',0,0),('wikibooks','http://en.wikibooks.org/wiki/$1','','',1,0),('wikicities','http://www.wikia.com/wiki/$1','','',0,0),('wikif1','http://www.wikif1.org/$1','','',0,0),('wikihow','http://www.wikihow.com/$1','','',0,0),('wikimedia','http://wikimediafoundation.org/wiki/$1','','',0,0),('wikinews','http://en.wikinews.org/wiki/$1','','',1,0),('wikinfo','http://www.wikinfo.org/index.php/$1','','',0,0),('wikipedia','http://en.wikipedia.org/wiki/$1','','',1,0),('wikiquote','http://en.wikiquote.org/wiki/$1','','',1,0),('wikisource','http://wikisource.org/wiki/$1','','',1,0),('wikispecies','http://species.wikimedia.org/wiki/$1','','',1,0),('wikitravel','http://wikitravel.org/en/$1','','',0,0),('wikiversity','http://en.wikiversity.org/wiki/$1','','',1,0),('wikt','http://en.wiktionary.org/wiki/$1','','',1,0),('wiktionary','http://en.wiktionary.org/wiki/$1','','',1,0),('wlug','http://www.wlug.org.nz/$1','','',0,0),('zwiki','http://zwiki.org/$1','','',0,0),('zzz wiki','http://wiki.zzz.ee/index.php/$1','','',0,0);
-/*!40000 ALTER TABLE `mw_interwiki` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_ipblocks`
---
-
-DROP TABLE IF EXISTS `mw_ipblocks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_ipblocks` (
-  `ipb_id` int(11) NOT NULL AUTO_INCREMENT,
-  `ipb_address` tinyblob NOT NULL,
-  `ipb_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `ipb_by` int(10) unsigned NOT NULL DEFAULT '0',
-  `ipb_by_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `ipb_reason` tinyblob NOT NULL,
-  `ipb_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `ipb_auto` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_anon_only` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_create_account` tinyint(1) NOT NULL DEFAULT '1',
-  `ipb_enable_autoblock` tinyint(1) NOT NULL DEFAULT '1',
-  `ipb_expiry` varbinary(14) NOT NULL DEFAULT '',
-  `ipb_range_start` tinyblob NOT NULL,
-  `ipb_range_end` tinyblob NOT NULL,
-  `ipb_deleted` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_block_email` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_allow_usertalk` tinyint(1) NOT NULL DEFAULT '0',
-  PRIMARY KEY (`ipb_id`),
-  UNIQUE KEY `ipb_address` (`ipb_address`(255),`ipb_user`,`ipb_auto`,`ipb_anon_only`),
-  KEY `ipb_user` (`ipb_user`),
-  KEY `ipb_range` (`ipb_range_start`(8),`ipb_range_end`(8)),
-  KEY `ipb_timestamp` (`ipb_timestamp`),
-  KEY `ipb_expiry` (`ipb_expiry`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_ipblocks`
---
-
-LOCK TABLES `mw_ipblocks` WRITE;
-/*!40000 ALTER TABLE `mw_ipblocks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_ipblocks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_iwlinks`
---
-
-DROP TABLE IF EXISTS `mw_iwlinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_iwlinks` (
-  `iwl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `iwl_prefix` varbinary(20) NOT NULL DEFAULT '',
-  `iwl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `iwl_from` (`iwl_from`,`iwl_prefix`,`iwl_title`),
-  UNIQUE KEY `iwl_prefix_title_from` (`iwl_prefix`,`iwl_title`,`iwl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_iwlinks`
---
-
-LOCK TABLES `mw_iwlinks` WRITE;
-/*!40000 ALTER TABLE `mw_iwlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_iwlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_job`
---
-
-DROP TABLE IF EXISTS `mw_job`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_job` (
-  `job_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `job_cmd` varbinary(60) NOT NULL DEFAULT '',
-  `job_namespace` int(11) NOT NULL,
-  `job_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `job_params` blob NOT NULL,
-  PRIMARY KEY (`job_id`),
-  KEY `job_cmd` (`job_cmd`,`job_namespace`,`job_title`,`job_params`(128))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_job`
---
-
-LOCK TABLES `mw_job` WRITE;
-/*!40000 ALTER TABLE `mw_job` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_job` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_l10n_cache`
---
-
-DROP TABLE IF EXISTS `mw_l10n_cache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_l10n_cache` (
-  `lc_lang` varbinary(32) NOT NULL,
-  `lc_key` varchar(255) NOT NULL,
-  `lc_value` mediumblob NOT NULL,
-  KEY `lc_lang_key` (`lc_lang`,`lc_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_l10n_cache`
---
-
-LOCK TABLES `mw_l10n_cache` WRITE;
-/*!40000 ALTER TABLE `mw_l10n_cache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_l10n_cache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_langlinks`
---
-
-DROP TABLE IF EXISTS `mw_langlinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_langlinks` (
-  `ll_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `ll_lang` varbinary(20) NOT NULL DEFAULT '',
-  `ll_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `ll_from` (`ll_from`,`ll_lang`),
-  KEY `ll_lang` (`ll_lang`,`ll_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_langlinks`
---
-
-LOCK TABLES `mw_langlinks` WRITE;
-/*!40000 ALTER TABLE `mw_langlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_langlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_log_search`
---
-
-DROP TABLE IF EXISTS `mw_log_search`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_log_search` (
-  `ls_field` varbinary(32) NOT NULL,
-  `ls_value` varchar(255) NOT NULL,
-  `ls_log_id` int(10) unsigned NOT NULL DEFAULT '0',
-  UNIQUE KEY `ls_field_val` (`ls_field`,`ls_value`,`ls_log_id`),
-  KEY `ls_log_id` (`ls_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_log_search`
---
-
-LOCK TABLES `mw_log_search` WRITE;
-/*!40000 ALTER TABLE `mw_log_search` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_log_search` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_logging`
---
-
-DROP TABLE IF EXISTS `mw_logging`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_logging` (
-  `log_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `log_type` varbinary(32) NOT NULL DEFAULT '',
-  `log_action` varbinary(32) NOT NULL DEFAULT '',
-  `log_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
-  `log_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `log_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `log_namespace` int(11) NOT NULL DEFAULT '0',
-  `log_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `log_page` int(10) unsigned DEFAULT NULL,
-  `log_comment` varchar(255) NOT NULL DEFAULT '',
-  `log_params` blob NOT NULL,
-  `log_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`log_id`),
-  KEY `type_time` (`log_type`,`log_timestamp`),
-  KEY `user_time` (`log_user`,`log_timestamp`),
-  KEY `page_time` (`log_namespace`,`log_title`,`log_timestamp`),
-  KEY `times` (`log_timestamp`),
-  KEY `log_user_type_time` (`log_user`,`log_type`,`log_timestamp`),
-  KEY `log_page_id_time` (`log_page`,`log_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_logging`
---
-
-LOCK TABLES `mw_logging` WRITE;
-/*!40000 ALTER TABLE `mw_logging` DISABLE KEYS */;
-INSERT INTO `mw_logging` VALUES (1,'patrol','patrol','20110110173131',1,'WikiSysop',0,'TestResources',2,'','2\n0\n1',0);
-/*!40000 ALTER TABLE `mw_logging` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_math`
---
-
-DROP TABLE IF EXISTS `mw_math`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_math` (
-  `math_inputhash` varbinary(16) NOT NULL,
-  `math_outputhash` varbinary(16) NOT NULL,
-  `math_html_conservativeness` tinyint(4) NOT NULL,
-  `math_html` text,
-  `math_mathml` text,
-  UNIQUE KEY `math_inputhash` (`math_inputhash`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_math`
---
-
-LOCK TABLES `mw_math` WRITE;
-/*!40000 ALTER TABLE `mw_math` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_math` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_module_deps`
---
-
-DROP TABLE IF EXISTS `mw_module_deps`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_module_deps` (
-  `md_module` varbinary(255) NOT NULL,
-  `md_skin` varbinary(32) NOT NULL,
-  `md_deps` mediumblob NOT NULL,
-  UNIQUE KEY `md_module_skin` (`md_module`,`md_skin`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_module_deps`
---
-
-LOCK TABLES `mw_module_deps` WRITE;
-/*!40000 ALTER TABLE `mw_module_deps` DISABLE KEYS */;
-INSERT INTO `mw_module_deps` VALUES ('ext.vector.collapsibleNav','vector','[\"\\/home\\/pdhanda\\/deployment\\/extensions\\/Vector\\/modules\\/.\\/images\\/portal-break.png\",\"\\/home\\/pdhanda\\/deployment\\/extensions\\/Vector\\/modules\\/.\\/images\\/open.png\",\"\\/home\\/pdhanda\\/deployment\\/extensions\\/Vector\\/modules\\/.\\/images\\/closed-ltr.png\"]'),('jquery.wikiEditor','vector','[\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/loading.gif\"]'),('jquery.wikiEditor.toolbar','vector','{\"0\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/base.png\",\"1\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/loading.gif\",\"2\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/button-sprite.png\",\"3\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/arrow-right.png\",\"4\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/arrow-left.png\",\"5\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/arrow-down.png\",\"7\":\"\\/home\\/pdhanda\\/deployment\\/extensions\\/WikiEditor\\/modules\\/.\\/images\\/toolbar\\/loading-small.gif\"}'),('mediawiki.legacy.shared','vector','[\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/feed-icon.png\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/remove.png\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/add.png\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/ajax-loader.gif\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/spinner.gif\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/help-question.gif\",\"\\/home\\/pdhanda\\/deployment\\/skins\\/common\\/images\\/help-question-hover.gif\"]'),('skins.vector','vector','{\"0\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/page-base.png\",\"1\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/border.png\",\"2\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/page-fade.png\",\"4\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/tab-break.png\",\"5\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/tab-normal-fade.png\",\"6\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/tab-current-fade.png\",\"8\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/arrow-down-icon.png\",\"11\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/search-fade.png\",\"12\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/portal-break.png\",\"14\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/preferences-break.png\",\"16\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/preferences-fade.png\",\"17\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/preferences-base.png\",\"18\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/bullet-icon.png\",\"19\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/external-link-ltr-icon.png\",\"20\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/lock-icon.png\",\"21\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/mail-icon.png\",\"22\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/news-icon.png\",\"23\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/file-icon.png\",\"24\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/talk-icon.png\",\"25\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/audio-icon.png\",\"26\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/video-icon.png\",\"27\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/document-icon.png\",\"28\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/user-icon.png\",\"29\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/watch-icons.png\",\"30\":\"\\/home\\/pdhanda\\/deployment\\/skins\\/vector\\/images\\/watch-icon-loading.gif\"}');
-/*!40000 ALTER TABLE `mw_module_deps` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource` (
-  `mr_resource` varbinary(255) NOT NULL,
-  `mr_lang` varbinary(32) NOT NULL,
-  `mr_blob` mediumblob NOT NULL,
-  `mr_timestamp` binary(14) NOT NULL,
-  UNIQUE KEY `mr_resource_lang` (`mr_resource`,`mr_lang`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource`
---
-
-LOCK TABLES `mw_msg_resource` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource` DISABLE KEYS */;
-INSERT INTO `mw_msg_resource` VALUES ('ext.vector.collapsibleNav','en','{\"vector-collapsiblenav-more\":\"More languages\"}','20110108005000'),('ext.vector.collapsibleTabs','en','{}','20110108005000'),('ext.vector.simpleSearch','en','{\"vector-simplesearch-search\":\"Search\",\"vector-simplesearch-containing\":\"containing...\"}','20110108005000'),('ext.wikiEditor','en','{}','20110110172914'),('ext.wikiEditor.toolbar','en','{\"wikieditor-toolbar-loading\":\"Loading...\",\"wikieditor-toolbar-tool-bold\":\"Bold\",\"wikieditor-toolbar-tool-bold-example\":\"Bold text\",\"wikieditor-toolbar-tool-italic\":\"Italic\",\"wikieditor-toolbar-tool-italic-example\":\"Italic text\",\"wikieditor-toolbar-tool-ilink\":\"Internal link\",\"wikieditor-toolbar-tool-ilink-example\":\"Link title\",\"wikieditor-toolbar-tool-xlink\":\"External link (remember http:\\/\\/ prefix)\",\"wikieditor-toolbar-tool-xlink-example\":\"http:\\/\\/www.example.com link title\",\"wikieditor-toolbar-tool-link\":\"Link\",\"wikieditor-toolbar-tool-link-title\":\"Insert link\",\"wikieditor-toolbar-tool-link-int\":\"To a wiki page\",\"wikieditor-toolbar-tool-link-int-target\":\"Target page or URL:\",\"wikieditor-toolbar-tool-link-int-target-tooltip\":\"Page title or URL\",\"wikieditor-toolbar-tool-link-int-text\":\"Text to display:\",\"wikieditor-toolbar-tool-link-int-text-tooltip\":\"Text to be displayed\",\"wikieditor-toolbar-tool-link-ext\":\"To an external web page\",\"wikieditor-toolbar-tool-link-ext-target\":\"Link URL:\",\"wikieditor-toolbar-tool-link-ext-text\":\"Link text:\",\"wikieditor-toolbar-tool-link-insert\":\"Insert link\",\"wikieditor-toolbar-tool-link-cancel\":\"Cancel\",\"wikieditor-toolbar-tool-link-int-target-status-exists\":\"Page exists\",\"wikieditor-toolbar-tool-link-int-target-status-notexists\":\"Page does not exist\",\"wikieditor-toolbar-tool-link-int-target-status-invalid\":\"Invalid title\",\"wikieditor-toolbar-tool-link-int-target-status-external\":\"External link\",\"wikieditor-toolbar-tool-link-int-target-status-loading\":\"Checking page existence...\",\"wikieditor-toolbar-tool-link-int-invalid\":\"The title you specified is invalid.\",\"wikieditor-toolbar-tool-link-lookslikeinternal\":\"The URL you specified looks like it was intended as a link to another wiki page.\\nDo you want to make it an internal link?\",\"wikieditor-toolbar-tool-link-lookslikeinternal-int\":\"Internal link\",\"wikieditor-toolbar-tool-link-lookslikeinternal-ext\":\"External link\",\"wikieditor-toolbar-tool-link-empty\":\"You did not enter anything to link to.\",\"wikieditor-toolbar-tool-file\":\"Embedded file\",\"wikieditor-toolbar-tool-file-pre\":\"$1{{ns:file}}:\",\"wikieditor-toolbar-tool-file-example\":\"Example.jpg\",\"wikieditor-toolbar-tool-reference\":\"Reference\",\"wikieditor-toolbar-tool-reference-title\":\"Insert reference\",\"wikieditor-toolbar-tool-reference-cancel\":\"Cancel\",\"wikieditor-toolbar-tool-reference-text\":\"Reference text\",\"wikieditor-toolbar-tool-reference-insert\":\"Insert\",\"wikieditor-toolbar-tool-reference-example\":\"Insert footnote text here\",\"wikieditor-toolbar-tool-signature\":\"Signature and timestamp\",\"wikieditor-toolbar-section-advanced\":\"Advanced\",\"wikieditor-toolbar-tool-heading\":\"Heading\",\"wikieditor-toolbar-tool-heading-1\":\"Level 1\",\"wikieditor-toolbar-tool-heading-2\":\"Level 2\",\"wikieditor-toolbar-tool-heading-3\":\"Level 3\",\"wikieditor-toolbar-tool-heading-4\":\"Level 4\",\"wikieditor-toolbar-tool-heading-5\":\"Level 5\",\"wikieditor-toolbar-tool-heading-example\":\"Heading text\",\"wikieditor-toolbar-group-format\":\"Format\",\"wikieditor-toolbar-tool-ulist\":\"Bulleted list\",\"wikieditor-toolbar-tool-ulist-example\":\"Bulleted list item\",\"wikieditor-toolbar-tool-olist\":\"Numbered list\",\"wikieditor-toolbar-tool-olist-example\":\"Numbered list item\",\"wikieditor-toolbar-tool-indent\":\"Indentation\",\"wikieditor-toolbar-tool-indent-example\":\"Indented line\",\"wikieditor-toolbar-tool-nowiki\":\"No wiki formatting\",\"wikieditor-toolbar-tool-nowiki-example\":\"Insert non-formatted text here\",\"wikieditor-toolbar-tool-redirect\":\"Redirect\",\"wikieditor-toolbar-tool-redirect-example\":\"Target page name\",\"wikieditor-toolbar-tool-big\":\"Big\",\"wikieditor-toolbar-tool-big-example\":\"Big text\",\"wikieditor-toolbar-tool-small\":\"Small\",\"wikieditor-toolbar-tool-small-example\":\"Small text\",\"wikieditor-toolbar-tool-superscript\":\"Superscript\",\"wikieditor-toolbar-tool-superscript-example\":\"Superscript text\",\"wikieditor-toolbar-tool-subscript\":\"Subscript\",\"wikieditor-toolbar-tool-subscript-example\":\"Subscript text\",\"wikieditor-toolbar-group-insert\":\"Insert\",\"wikieditor-toolbar-tool-gallery\":\"Picture gallery\",\"wikieditor-toolbar-tool-gallery-example\":\"{{ns:file}}:Example.jpg|Caption1\\n{{ns:file}}:Example.jpg|Caption2\",\"wikieditor-toolbar-tool-newline\":\"New line\",\"wikieditor-toolbar-tool-table\":\"Table\",\"wikieditor-toolbar-tool-table-example-old\":\"-\\n! header 1\\n! header 2\\n! header 3\\n|-\\n| row 1, cell 1\\n| row 1, cell 2\\n| row 1, cell 3\\n|-\\n| row 2, cell 1\\n| row 2, cell 2\\n| row 2, cell 3\",\"wikieditor-toolbar-tool-table-example-cell-text\":\"Cell text\",\"wikieditor-toolbar-tool-table-example\":\"Example\",\"wikieditor-toolbar-tool-table-example-header\":\"Header text\",\"wikieditor-toolbar-tool-table-title\":\"Insert table\",\"wikieditor-toolbar-tool-table-dimensions-rows\":\"Rows\",\"wikieditor-toolbar-tool-table-dimensions-columns\":\"Columns\",\"wikieditor-toolbar-tool-table-dimensions-header\":\"Add header row\",\"wikieditor-toolbar-tool-table-wikitable\":\"Style with borders\",\"wikieditor-toolbar-tool-table-sortable\":\"Make table sortable\",\"wikieditor-toolbar-tool-table-insert\":\"Insert\",\"wikieditor-toolbar-tool-table-cancel\":\"Cancel\",\"wikieditor-toolbar-tool-table-example-text\":\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut nec purus diam. Sed aliquam imperdiet nunc quis lacinia. Donec rutrum consectetur placerat. Sed volutpat neque non purus faucibus id ultricies enim euismod.\",\"wikieditor-toolbar-tool-table-toomany\":\"Inserting a table with more than $1 cells is not possible with this dialog.\",\"wikieditor-toolbar-tool-table-invalidnumber\":\"You have not entered a valid number of rows or columns.\",\"wikieditor-toolbar-tool-table-zero\":\"You cannot insert a table with zero rows or columns.\",\"wikieditor-toolbar-tool-replace\":\"Search and replace\",\"wikieditor-toolbar-tool-replace-title\":\"Search and replace\",\"wikieditor-toolbar-tool-replace-search\":\"Search for:\",\"wikieditor-toolbar-tool-replace-replace\":\"Replace with:\",\"wikieditor-toolbar-tool-replace-case\":\"Match case\",\"wikieditor-toolbar-tool-replace-regex\":\"Treat search string as a regular expression\",\"wikieditor-toolbar-tool-replace-button-findnext\":\"Find next\",\"wikieditor-toolbar-tool-replace-button-replacenext\":\"Replace next\",\"wikieditor-toolbar-tool-replace-button-replaceall\":\"Replace all\",\"wikieditor-toolbar-tool-replace-close\":\"Close\",\"wikieditor-toolbar-tool-replace-nomatch\":\"Your search did not match anything.\",\"wikieditor-toolbar-tool-replace-success\":\"$1 replacement(s) made.\",\"wikieditor-toolbar-tool-replace-emptysearch\":\"You did not enter anything to search for.\",\"wikieditor-toolbar-tool-replace-invalidregex\":\"The regular expression you entered is invalid: $1\",\"wikieditor-toolbar-section-characters\":\"Special characters\",\"wikieditor-toolbar-characters-page-latin\":\"Latin\",\"wikieditor-toolbar-characters-page-latinextended\":\"Latin extended\",\"wikieditor-toolbar-characters-page-ipa\":\"IPA\",\"wikieditor-toolbar-characters-page-symbols\":\"Symbols\",\"wikieditor-toolbar-characters-page-greek\":\"Greek\",\"wikieditor-toolbar-characters-page-cyrillic\":\"Cyrillic\",\"wikieditor-toolbar-characters-page-arabic\":\"Arabic\",\"wikieditor-toolbar-characters-page-persian\":\"Persian\",\"wikieditor-toolbar-characters-page-hebrew\":\"Hebrew\",\"wikieditor-toolbar-characters-page-bangla\":\"Bangla\",\"wikieditor-toolbar-characters-page-telugu\":\"Telugu\",\"wikieditor-toolbar-characters-page-sinhala\":\"Sinhala\",\"wikieditor-toolbar-characters-page-gujarati\":\"Gujarati\",\"wikieditor-toolbar-characters-page-thai\":\"Thai\",\"wikieditor-toolbar-characters-page-lao\":\"Lao\",\"wikieditor-toolbar-characters-page-khmer\":\"Khmer\",\"wikieditor-toolbar-section-help\":\"Help\",\"wikieditor-toolbar-help-heading-description\":\"Description\",\"wikieditor-toolbar-help-heading-syntax\":\"What you type\",\"wikieditor-toolbar-help-heading-result\":\"What you get\",\"wikieditor-toolbar-help-page-format\":\"Formatting\",\"wikieditor-toolbar-help-page-link\":\"Links\",\"wikieditor-toolbar-help-page-heading\":\"Headings\",\"wikieditor-toolbar-help-page-list\":\"Lists\",\"wikieditor-toolbar-help-page-file\":\"Files\",\"wikieditor-toolbar-help-page-reference\":\"References\",\"wikieditor-toolbar-help-page-discussion\":\"Discussion\",\"wikieditor-toolbar-help-content-bold-description\":\"Bold\",\"wikieditor-toolbar-help-content-bold-syntax\":\"\'\'\'Bold text\'\'\'\",\"wikieditor-toolbar-help-content-bold-result\":\"<strong>Bold text<\\/strong>\",\"wikieditor-toolbar-help-content-italic-description\":\"Italic\",\"wikieditor-toolbar-help-content-italic-syntax\":\"\'\'Italic text\'\'\",\"wikieditor-toolbar-help-content-italic-result\":\"<em>Italic text<\\/em>\",\"wikieditor-toolbar-help-content-bolditalic-description\":\"Bold &amp; italic\",\"wikieditor-toolbar-help-content-bolditalic-syntax\":\"\'\'\'\'\'Bold &amp; italic text\'\'\'\'\'\",\"wikieditor-toolbar-help-content-bolditalic-result\":\"<strong><em>Bold &amp; italic text<\\/em><\\/strong>\",\"wikieditor-toolbar-help-content-ilink-description\":\"Internal link\",\"wikieditor-toolbar-help-content-ilink-syntax\":\"[[Page title|Link label]]<br \\/>[[Page title]]\",\"wikieditor-toolbar-help-content-ilink-result\":\"<a href=\'#\'>Link label<\\/a><br \\/><a href=\'#\'>Page title<\\/a>\",\"wikieditor-toolbar-help-content-xlink-description\":\"External link\",\"wikieditor-toolbar-help-content-xlink-syntax\":\"[http:\\/\\/www.example.org Link label]<br \\/>[http:\\/\\/www.example.org]<br \\/>http:\\/\\/www.example.org\",\"wikieditor-toolbar-help-content-xlink-result\":\"<a href=\'#\' class=\'external\'>Link label<\\/a><br \\/><a href=\'#\' class=\'external autonumber\'>[1]<\\/a><br \\/><a href=\'#\' class=\'external\'>http:\\/\\/www.example.org<\\/a>\",\"wikieditor-toolbar-help-content-heading1-description\":\"&lt;wikieditor-toolbar-help-content-heading1-description&gt;\",\"wikieditor-toolbar-help-content-heading1-syntax\":\"&lt;wikieditor-toolbar-help-content-heading1-syntax&gt;\",\"wikieditor-toolbar-help-content-heading1-result\":\"&lt;wikieditor-toolbar-help-content-heading1-result&gt;\",\"wikieditor-toolbar-help-content-heading2-description\":\"2nd level heading\",\"wikieditor-toolbar-help-content-heading2-syntax\":\"== Heading text ==\",\"wikieditor-toolbar-help-content-heading2-result\":\"<h2>Heading text<\\/h2>\",\"wikieditor-toolbar-help-content-heading3-description\":\"3rd level heading\",\"wikieditor-toolbar-help-content-heading3-syntax\":\"=== Heading text ===\",\"wikieditor-toolbar-help-content-heading3-result\":\"<h3>Heading text<\\/h3>\",\"wikieditor-toolbar-help-content-heading4-description\":\"4th level heading\",\"wikieditor-toolbar-help-content-heading4-syntax\":\"==== Heading text ====\",\"wikieditor-toolbar-help-content-heading4-result\":\"<h4>Heading text<\\/h4>\",\"wikieditor-toolbar-help-content-heading5-description\":\"5th level heading\",\"wikieditor-toolbar-help-content-heading5-syntax\":\"===== Heading text =====\",\"wikieditor-toolbar-help-content-heading5-result\":\"<h5>Heading text<\\/h5>\",\"wikieditor-toolbar-help-content-ulist-description\":\"Bulleted list\",\"wikieditor-toolbar-help-content-ulist-syntax\":\"* List item<br \\/>* List item\",\"wikieditor-toolbar-help-content-ulist-result\":\"<ul><li>List item<\\/li><li>List item<\\/li><\\/ul>\",\"wikieditor-toolbar-help-content-olist-description\":\"Numbered list\",\"wikieditor-toolbar-help-content-olist-syntax\":\"# List item<br \\/># List item\",\"wikieditor-toolbar-help-content-olist-result\":\"<ol><li>List item<\\/li><li>List item<\\/li><\\/ol>\",\"wikieditor-toolbar-help-content-file-description\":\"Embedded file\",\"wikieditor-toolbar-help-content-file-syntax\":\"[[{{ns:file}}:Example.png|thumb|Caption text]]\",\"wikieditor-toolbar-help-content-file-result\":\"<div style=\'width:104px;\' class=\'thumbinner\'><a title=\'Caption text\' class=\'image\' href=\'#\'><img height=\'50\' width=\'100\' border=\'0\' class=\'thumbimage\' src=\'extensions\\/UsabilityInitiative\\/images\\/wikiEditor\\/toolbar\\/example-image.png\' alt=\'\'\\/><\\/a><div class=\'thumbcaption\'><div class=\'magnify\'><a title=\'Enlarge\' class=\'internal\' href=\'#\'><img height=\'11\' width=\'15\' alt=\'\' src=\'$1\\/common\\/images\\/magnify-clip.png\'\\/><\\/a><\\/div>Caption text<\\/div><\\/div>\",\"wikieditor-toolbar-help-content-reference-description\":\"Reference\",\"wikieditor-toolbar-help-content-reference-syntax\":\"Page text.&lt;ref name=\\\"test\\\"&gt;[http:\\/\\/www.example.org Link text], additional text.&lt;\\/ref&gt;\",\"wikieditor-toolbar-help-content-reference-result\":\"Page text.<sup><a href=\'#\'>[1]<\\/a><\\/sup>\",\"wikieditor-toolbar-help-content-rereference-description\":\"Additional use of same reference\",\"wikieditor-toolbar-help-content-rereference-syntax\":\"&lt;ref name=\\\"test\\\" \\/&gt;\",\"wikieditor-toolbar-help-content-rereference-result\":\"Page text.<sup><a href=\'#\'>[1]<\\/a><\\/sup>\",\"wikieditor-toolbar-help-content-showreferences-description\":\"Display references\",\"wikieditor-toolbar-help-content-showreferences-syntax\":\"&lt;references \\/&gt;\",\"wikieditor-toolbar-help-content-showreferences-result\":\"<ol class=\'references\'><li id=\'cite_note-test-0\'><b><a title=\'\' href=\'#\'>^<\\/a><\\/b> <a rel=\'nofollow\' title=\'http:\\/\\/www.example.org\' class=\'external text\' href=\'#\'>Link text<\\/a>, additional text.<\\/li><\\/ol>\",\"wikieditor-toolbar-help-content-signaturetimestamp-description\":\"Signature with timestamp\",\"wikieditor-toolbar-help-content-signaturetimestamp-syntax\":\"~~~~\",\"wikieditor-toolbar-help-content-signaturetimestamp-result\":\"<a href=\'#\' title=\'{{#special:mypage}}\'>Username<\\/a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk<\\/a>) 15:54, 10 June 2009 (UTC)\",\"wikieditor-toolbar-help-content-signature-description\":\"Signature\",\"wikieditor-toolbar-help-content-signature-syntax\":\"~~~\",\"wikieditor-toolbar-help-content-signature-result\":\"<a href=\'#\' title=\'{{#special:mypage}}\'>Username<\\/a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk<\\/a>)\",\"wikieditor-toolbar-help-content-indent-description\":\"Indent\",\"wikieditor-toolbar-help-content-indent-syntax\":\"Normal text<br \\/>:Indented text<br \\/>::Indented text\",\"wikieditor-toolbar-help-content-indent-result\":\"Normal text<dl><dd>Indented text<dl><dd>Indented text<\\/dd><\\/dl><\\/dd><\\/dl>\"}','20110110172914'),('jquery.async','en','{}','20110110172915'),('jquery.autoEllipsis','en','{}','20110110172915'),('jquery.checkboxShiftClick','en','{}','20110110172915'),('jquery.client','en','{}','20110110172915'),('jquery.cookie','en','{}','20110110172915'),('jquery.delayedBind','en','{}','20110110172915'),('jquery.highlightText','en','{}','20110110172915'),('jquery.makeCollapsible','en','{\"collapsible-expand\":\"Expand\",\"collapsible-collapse\":\"Collapse\"}','20110110172915'),('jquery.placeholder','en','{}','20110110172915'),('jquery.suggestions','en','{}','20110110172915'),('jquery.tabIndex','en','{}','20110110172915'),('jquery.textSelection','en','{}','20110110172915'),('jquery.wikiEditor','en','{\"wikieditor-wikitext-tab\":\"Wikitext\",\"wikieditor-loading\":\"Loading\"}','20110110172914'),('jquery.wikiEditor.toolbar','en','{}','20110110172914'),('mediawiki.action.watch.ajax','en','{}','20110110172915'),('mediawiki.language','en','{}','20110110172915'),('mediawiki.legacy.ajax','en','{\"watch\":\"Watch\",\"unwatch\":\"Unwatch\",\"watching\":\"Watching...\",\"unwatching\":\"Unwatching...\",\"tooltip-ca-watch\":\"Add this page to your watchlist\",\"tooltip-ca-unwatch\":\"Remove this page from your watchlist\"}','20110110172915'),('mediawiki.legacy.edit','en','{}','20110110172915'),('mediawiki.legacy.wikibits','en','{\"showtoc\":\"show\",\"hidetoc\":\"hide\"}','20110110172915'),('mediawiki.util','en','{}','20110110172915');
-/*!40000 ALTER TABLE `mw_msg_resource` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource_links`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource_links`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource_links` (
-  `mrl_resource` varbinary(255) NOT NULL,
-  `mrl_message` varbinary(255) NOT NULL,
-  UNIQUE KEY `mrl_message_resource` (`mrl_message`,`mrl_resource`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource_links`
---
-
-LOCK TABLES `mw_msg_resource_links` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource_links` DISABLE KEYS */;
-INSERT INTO `mw_msg_resource_links` VALUES ('jquery.makeCollapsible','collapsible-collapse'),('jquery.makeCollapsible','collapsible-expand'),('mediawiki.legacy.wikibits','hidetoc'),('mediawiki.legacy.wikibits','showtoc'),('mediawiki.legacy.ajax','tooltip-ca-unwatch'),('mediawiki.legacy.ajax','tooltip-ca-watch'),('mediawiki.legacy.ajax','unwatch'),('mediawiki.legacy.ajax','unwatching'),('ext.vector.collapsibleNav','vector-collapsiblenav-more'),('ext.vector.simpleSearch','vector-simplesearch-containing'),('ext.vector.simpleSearch','vector-simplesearch-search'),('mediawiki.legacy.ajax','watch'),('mediawiki.legacy.ajax','watching'),('jquery.wikiEditor','wikieditor-loading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-arabic'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-bangla'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-cyrillic'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-greek'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-gujarati'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-hebrew'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-ipa'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-khmer'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-lao'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-latin'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-latinextended'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-persian'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-sinhala'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-symbols'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-telugu'),('ext.wikiEditor.toolbar','wikieditor-toolbar-characters-page-thai'),('ext.wikiEditor.toolbar','wikieditor-toolbar-group-format'),('ext.wikiEditor.toolbar','wikieditor-toolbar-group-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bold-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bold-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bold-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bolditalic-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bolditalic-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-bolditalic-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-file-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-file-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-file-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading1-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading1-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading1-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading2-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading2-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading2-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading3-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading3-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading3-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading4-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading4-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading4-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading5-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading5-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-heading5-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ilink-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ilink-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ilink-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-indent-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-indent-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-indent-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-italic-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-italic-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-italic-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-olist-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-olist-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-olist-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-reference-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-reference-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-reference-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-rereference-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-rereference-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-rereference-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-showreferences-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-showreferences-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-showreferences-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signature-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signature-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signature-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signaturetimestamp-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signaturetimestamp-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-signaturetimestamp-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ulist-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ulist-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-ulist-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-xlink-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-xlink-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-content-xlink-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-heading-description'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-heading-result'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-heading-syntax'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-discussion'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-file'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-format'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-heading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-link'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-list'),('ext.wikiEditor.toolbar','wikieditor-toolbar-help-page-reference'),('ext.wikiEditor.toolbar','wikieditor-toolbar-loading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-section-advanced'),('ext.wikiEditor.toolbar','wikieditor-toolbar-section-characters'),('ext.wikiEditor.toolbar','wikieditor-toolbar-section-help'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-big'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-big-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-bold'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-bold-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-file'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-file-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-file-pre'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-gallery'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-gallery-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-1'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-2'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-3'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-4'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-5'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-heading-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ilink'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ilink-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-indent'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-indent-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-italic'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-italic-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-cancel'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-empty'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-ext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-ext-target'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-ext-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-invalid'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-exists'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-external'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-invalid'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-loading'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-status-notexists'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-target-tooltip'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-int-text-tooltip'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-lookslikeinternal'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-lookslikeinternal-ext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-lookslikeinternal-int'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-link-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-newline'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-nowiki'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-nowiki-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-olist'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-olist-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-redirect'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-redirect-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-cancel'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-reference-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-button-findnext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-button-replaceall'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-button-replacenext'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-case'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-close'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-emptysearch'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-invalidregex'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-nomatch'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-regex'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-replace'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-search'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-success'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-replace-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-signature'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-small'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-small-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-subscript'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-subscript-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-superscript'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-superscript-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-cancel'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-dimensions-columns'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-dimensions-header'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-dimensions-rows'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-cell-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-header'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-old'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-example-text'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-insert'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-invalidnumber'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-sortable'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-title'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-toomany'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-wikitable'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-table-zero'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ulist'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-ulist-example'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-xlink'),('ext.wikiEditor.toolbar','wikieditor-toolbar-tool-xlink-example'),('jquery.wikiEditor','wikieditor-wikitext-tab');
-/*!40000 ALTER TABLE `mw_msg_resource_links` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_objectcache`
---
-
-DROP TABLE IF EXISTS `mw_objectcache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_objectcache` (
-  `keyname` varbinary(255) NOT NULL DEFAULT '',
-  `value` mediumblob,
-  `exptime` datetime DEFAULT NULL,
-  PRIMARY KEY (`keyname`),
-  KEY `exptime` (`exptime`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_objectcache`
---
-
-LOCK TABLES `mw_objectcache` WRITE;
-/*!40000 ALTER TABLE `mw_objectcache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_objectcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_oldimage`
---
-
-DROP TABLE IF EXISTS `mw_oldimage`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_oldimage` (
-  `oi_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `oi_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `oi_size` int(10) unsigned NOT NULL DEFAULT '0',
-  `oi_width` int(11) NOT NULL DEFAULT '0',
-  `oi_height` int(11) NOT NULL DEFAULT '0',
-  `oi_bits` int(11) NOT NULL DEFAULT '0',
-  `oi_description` tinyblob NOT NULL,
-  `oi_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `oi_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `oi_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `oi_metadata` mediumblob NOT NULL,
-  `oi_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
-  `oi_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') NOT NULL DEFAULT 'unknown',
-  `oi_minor_mime` varbinary(100) NOT NULL DEFAULT 'unknown',
-  `oi_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `oi_sha1` varbinary(32) NOT NULL DEFAULT '',
-  KEY `oi_usertext_timestamp` (`oi_user_text`,`oi_timestamp`),
-  KEY `oi_name_timestamp` (`oi_name`,`oi_timestamp`),
-  KEY `oi_name_archive_name` (`oi_name`,`oi_archive_name`(14)),
-  KEY `oi_sha1` (`oi_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_oldimage`
---
-
-LOCK TABLES `mw_oldimage` WRITE;
-/*!40000 ALTER TABLE `mw_oldimage` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_oldimage` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page`
---
-
-DROP TABLE IF EXISTS `mw_page`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page` (
-  `page_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `page_namespace` int(11) NOT NULL,
-  `page_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `page_restrictions` tinyblob NOT NULL,
-  `page_counter` bigint(20) unsigned NOT NULL DEFAULT '0',
-  `page_is_redirect` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `page_is_new` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `page_random` double unsigned NOT NULL,
-  `page_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `page_latest` int(10) unsigned NOT NULL,
-  `page_len` int(10) unsigned NOT NULL,
-  PRIMARY KEY (`page_id`),
-  UNIQUE KEY `name_title` (`page_namespace`,`page_title`),
-  KEY `page_random` (`page_random`),
-  KEY `page_len` (`page_len`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page`
---
-
-LOCK TABLES `mw_page` WRITE;
-/*!40000 ALTER TABLE `mw_page` DISABLE KEYS */;
-INSERT INTO `mw_page` VALUES (1,0,'Main_Page','',3,0,1,0.045389076294,'20110107184113',1,438),(2,0,'TestResources','',0,0,1,0.227355086893,'20110110173217',2,57);
-/*!40000 ALTER TABLE `mw_page` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_props`
---
-
-DROP TABLE IF EXISTS `mw_page_props`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_props` (
-  `pp_page` int(11) NOT NULL,
-  `pp_propname` varbinary(60) NOT NULL,
-  `pp_value` blob NOT NULL,
-  UNIQUE KEY `pp_page_propname` (`pp_page`,`pp_propname`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_props`
---
-
-LOCK TABLES `mw_page_props` WRITE;
-/*!40000 ALTER TABLE `mw_page_props` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_props` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_restrictions`
---
-
-DROP TABLE IF EXISTS `mw_page_restrictions`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_restrictions` (
-  `pr_page` int(11) NOT NULL,
-  `pr_type` varbinary(60) NOT NULL,
-  `pr_level` varbinary(60) NOT NULL,
-  `pr_cascade` tinyint(4) NOT NULL,
-  `pr_user` int(11) DEFAULT NULL,
-  `pr_expiry` varbinary(14) DEFAULT NULL,
-  `pr_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  PRIMARY KEY (`pr_id`),
-  UNIQUE KEY `pr_pagetype` (`pr_page`,`pr_type`),
-  KEY `pr_typelevel` (`pr_type`,`pr_level`),
-  KEY `pr_level` (`pr_level`),
-  KEY `pr_cascade` (`pr_cascade`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_restrictions`
---
-
-LOCK TABLES `mw_page_restrictions` WRITE;
-/*!40000 ALTER TABLE `mw_page_restrictions` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_restrictions` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_pagelinks`
---
-
-DROP TABLE IF EXISTS `mw_pagelinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_pagelinks` (
-  `pl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `pl_namespace` int(11) NOT NULL DEFAULT '0',
-  `pl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `pl_from` (`pl_from`,`pl_namespace`,`pl_title`),
-  UNIQUE KEY `pl_namespace` (`pl_namespace`,`pl_title`,`pl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_pagelinks`
---
-
-LOCK TABLES `mw_pagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_pagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_pagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_protected_titles`
---
-
-DROP TABLE IF EXISTS `mw_protected_titles`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_protected_titles` (
-  `pt_namespace` int(11) NOT NULL,
-  `pt_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `pt_user` int(10) unsigned NOT NULL,
-  `pt_reason` tinyblob,
-  `pt_timestamp` binary(14) NOT NULL,
-  `pt_expiry` varbinary(14) NOT NULL DEFAULT '',
-  `pt_create_perm` varbinary(60) NOT NULL,
-  UNIQUE KEY `pt_namespace_title` (`pt_namespace`,`pt_title`),
-  KEY `pt_timestamp` (`pt_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_protected_titles`
---
-
-LOCK TABLES `mw_protected_titles` WRITE;
-/*!40000 ALTER TABLE `mw_protected_titles` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_protected_titles` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache`
---
-
-DROP TABLE IF EXISTS `mw_querycache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache` (
-  `qc_type` varbinary(32) NOT NULL,
-  `qc_value` int(10) unsigned NOT NULL DEFAULT '0',
-  `qc_namespace` int(11) NOT NULL DEFAULT '0',
-  `qc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  KEY `qc_type` (`qc_type`,`qc_value`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache`
---
-
-LOCK TABLES `mw_querycache` WRITE;
-/*!40000 ALTER TABLE `mw_querycache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache_info`
---
-
-DROP TABLE IF EXISTS `mw_querycache_info`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache_info` (
-  `qci_type` varbinary(32) NOT NULL DEFAULT '',
-  `qci_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
-  UNIQUE KEY `qci_type` (`qci_type`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache_info`
---
-
-LOCK TABLES `mw_querycache_info` WRITE;
-/*!40000 ALTER TABLE `mw_querycache_info` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache_info` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycachetwo`
---
-
-DROP TABLE IF EXISTS `mw_querycachetwo`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycachetwo` (
-  `qcc_type` varbinary(32) NOT NULL,
-  `qcc_value` int(10) unsigned NOT NULL DEFAULT '0',
-  `qcc_namespace` int(11) NOT NULL DEFAULT '0',
-  `qcc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `qcc_namespacetwo` int(11) NOT NULL DEFAULT '0',
-  `qcc_titletwo` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  KEY `qcc_type` (`qcc_type`,`qcc_value`),
-  KEY `qcc_title` (`qcc_type`,`qcc_namespace`,`qcc_title`),
-  KEY `qcc_titletwo` (`qcc_type`,`qcc_namespacetwo`,`qcc_titletwo`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycachetwo`
---
-
-LOCK TABLES `mw_querycachetwo` WRITE;
-/*!40000 ALTER TABLE `mw_querycachetwo` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycachetwo` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_recentchanges`
---
-
-DROP TABLE IF EXISTS `mw_recentchanges`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_recentchanges` (
-  `rc_id` int(11) NOT NULL AUTO_INCREMENT,
-  `rc_timestamp` varbinary(14) NOT NULL DEFAULT '',
-  `rc_cur_time` varbinary(14) NOT NULL DEFAULT '',
-  `rc_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `rc_namespace` int(11) NOT NULL DEFAULT '0',
-  `rc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rc_comment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rc_minor` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_bot` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_new` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_cur_id` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_this_oldid` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_last_oldid` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_type` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_moved_to_ns` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_moved_to_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rc_patrolled` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_ip` varbinary(40) NOT NULL DEFAULT '',
-  `rc_old_len` int(11) DEFAULT NULL,
-  `rc_new_len` int(11) DEFAULT NULL,
-  `rc_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_logid` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_log_type` varbinary(255) DEFAULT NULL,
-  `rc_log_action` varbinary(255) DEFAULT NULL,
-  `rc_params` blob,
-  PRIMARY KEY (`rc_id`),
-  KEY `rc_timestamp` (`rc_timestamp`),
-  KEY `rc_namespace_title` (`rc_namespace`,`rc_title`),
-  KEY `rc_cur_id` (`rc_cur_id`),
-  KEY `new_name_timestamp` (`rc_new`,`rc_namespace`,`rc_timestamp`),
-  KEY `rc_ip` (`rc_ip`),
-  KEY `rc_ns_usertext` (`rc_namespace`,`rc_user_text`),
-  KEY `rc_user_text` (`rc_user_text`,`rc_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_recentchanges`
---
-
-LOCK TABLES `mw_recentchanges` WRITE;
-/*!40000 ALTER TABLE `mw_recentchanges` DISABLE KEYS */;
-INSERT INTO `mw_recentchanges` VALUES (1,'20110107184113','20110107184113',0,'MediaWiki Default',0,'Main_Page','',0,0,1,1,1,0,1,0,'',0,'::1',0,438,0,0,NULL,'',''),(2,'20110110173131','20110110173131',1,'WikiSysop',0,'TestResources','Created page with \"Test the the SimpleSelenium database was loaded correctly\"',0,0,1,2,2,0,1,0,'',1,'::1',0,57,0,0,NULL,'','');
-/*!40000 ALTER TABLE `mw_recentchanges` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_redirect`
---
-
-DROP TABLE IF EXISTS `mw_redirect`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_redirect` (
-  `rd_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `rd_namespace` int(11) NOT NULL DEFAULT '0',
-  `rd_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rd_interwiki` varchar(32) DEFAULT NULL,
-  `rd_fragment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
-  PRIMARY KEY (`rd_from`),
-  KEY `rd_ns_title` (`rd_namespace`,`rd_title`,`rd_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_redirect`
---
-
-LOCK TABLES `mw_redirect` WRITE;
-/*!40000 ALTER TABLE `mw_redirect` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_redirect` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_revision`
---
-
-DROP TABLE IF EXISTS `mw_revision`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_revision` (
-  `rev_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `rev_page` int(10) unsigned NOT NULL,
-  `rev_text_id` int(10) unsigned NOT NULL,
-  `rev_comment` tinyblob NOT NULL,
-  `rev_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `rev_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rev_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `rev_minor_edit` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rev_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rev_len` int(10) unsigned DEFAULT NULL,
-  `rev_parent_id` int(10) unsigned DEFAULT NULL,
-  PRIMARY KEY (`rev_id`),
-  UNIQUE KEY `rev_page_id` (`rev_page`,`rev_id`),
-  KEY `rev_timestamp` (`rev_timestamp`),
-  KEY `page_timestamp` (`rev_page`,`rev_timestamp`),
-  KEY `user_timestamp` (`rev_user`,`rev_timestamp`),
-  KEY `usertext_timestamp` (`rev_user_text`,`rev_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_revision`
---
-
-LOCK TABLES `mw_revision` WRITE;
-/*!40000 ALTER TABLE `mw_revision` DISABLE KEYS */;
-INSERT INTO `mw_revision` VALUES (1,1,1,'',0,'MediaWiki Default','20110107184113',0,0,438,0),(2,2,2,'Created page with \"Test the the SimpleSelenium database was loaded correctly\"',1,'WikiSysop','20110110173131',0,0,57,0);
-/*!40000 ALTER TABLE `mw_revision` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_searchindex`
---
-
-DROP TABLE IF EXISTS `mw_searchindex`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_searchindex` (
-  `si_page` int(10) unsigned NOT NULL,
-  `si_title` varchar(255) NOT NULL DEFAULT '',
-  `si_text` mediumtext NOT NULL,
-  UNIQUE KEY `si_page` (`si_page`),
-  FULLTEXT KEY `si_title` (`si_title`),
-  FULLTEXT KEY `si_text` (`si_text`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_searchindex`
---
-
-LOCK TABLES `mw_searchindex` WRITE;
-/*!40000 ALTER TABLE `mw_searchindex` DISABLE KEYS */;
-INSERT INTO `mw_searchindex` VALUES (1,'main page','  mediawiki hasu800 been successfully installed.  consult theu800 user user\'su800 guide foru800 information onu800 using theu800 wiki software. getting started getting started getting started configuration settings list mediawiki faqu800 mediawiki release mailing list '),(2,'testresources',' test theu800 theu800 simpleselenium database wasu800 loaded correctly ');
-/*!40000 ALTER TABLE `mw_searchindex` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_site_stats`
---
-
-DROP TABLE IF EXISTS `mw_site_stats`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_site_stats` (
-  `ss_row_id` int(10) unsigned NOT NULL,
-  `ss_total_views` bigint(20) unsigned DEFAULT '0',
-  `ss_total_edits` bigint(20) unsigned DEFAULT '0',
-  `ss_good_articles` bigint(20) unsigned DEFAULT '0',
-  `ss_total_pages` bigint(20) DEFAULT '-1',
-  `ss_users` bigint(20) DEFAULT '-1',
-  `ss_active_users` bigint(20) DEFAULT '-1',
-  `ss_admins` int(11) DEFAULT '-1',
-  `ss_images` int(11) DEFAULT '0',
-  UNIQUE KEY `ss_row_id` (`ss_row_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_site_stats`
---
-
-LOCK TABLES `mw_site_stats` WRITE;
-/*!40000 ALTER TABLE `mw_site_stats` DISABLE KEYS */;
-INSERT INTO `mw_site_stats` VALUES (1,3,2,1,2,1,-1,-1,0);
-/*!40000 ALTER TABLE `mw_site_stats` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_tag_summary`
---
-
-DROP TABLE IF EXISTS `mw_tag_summary`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_tag_summary` (
-  `ts_rc_id` int(11) DEFAULT NULL,
-  `ts_log_id` int(11) DEFAULT NULL,
-  `ts_rev_id` int(11) DEFAULT NULL,
-  `ts_tags` blob NOT NULL,
-  UNIQUE KEY `tag_summary_rc_id` (`ts_rc_id`),
-  UNIQUE KEY `tag_summary_log_id` (`ts_log_id`),
-  UNIQUE KEY `tag_summary_rev_id` (`ts_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_tag_summary`
---
-
-LOCK TABLES `mw_tag_summary` WRITE;
-/*!40000 ALTER TABLE `mw_tag_summary` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_tag_summary` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_templatelinks`
---
-
-DROP TABLE IF EXISTS `mw_templatelinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_templatelinks` (
-  `tl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `tl_namespace` int(11) NOT NULL DEFAULT '0',
-  `tl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `tl_from` (`tl_from`,`tl_namespace`,`tl_title`),
-  UNIQUE KEY `tl_namespace` (`tl_namespace`,`tl_title`,`tl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_templatelinks`
---
-
-LOCK TABLES `mw_templatelinks` WRITE;
-/*!40000 ALTER TABLE `mw_templatelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_templatelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_text`
---
-
-DROP TABLE IF EXISTS `mw_text`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_text` (
-  `old_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `old_text` mediumblob NOT NULL,
-  `old_flags` tinyblob NOT NULL,
-  PRIMARY KEY (`old_id`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_text`
---
-
-LOCK TABLES `mw_text` WRITE;
-/*!40000 ALTER TABLE `mw_text` DISABLE KEYS */;
-INSERT INTO `mw_text` VALUES (1,'\'\'\'MediaWiki has been successfully installed.\'\'\'\n\nConsult the [http://meta.wikimedia.org/wiki/Help:Contents User\'s Guide] for information on using the wiki software.\n\n== Getting started ==\n* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]','utf-8'),(2,'Test the the SimpleSelenium database was loaded correctly','utf-8');
-/*!40000 ALTER TABLE `mw_text` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_trackbacks`
---
-
-DROP TABLE IF EXISTS `mw_trackbacks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_trackbacks` (
-  `tb_id` int(11) NOT NULL AUTO_INCREMENT,
-  `tb_page` int(11) DEFAULT NULL,
-  `tb_title` varchar(255) NOT NULL,
-  `tb_url` blob NOT NULL,
-  `tb_ex` text,
-  `tb_name` varchar(255) DEFAULT NULL,
-  PRIMARY KEY (`tb_id`),
-  KEY `tb_page` (`tb_page`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_trackbacks`
---
-
-LOCK TABLES `mw_trackbacks` WRITE;
-/*!40000 ALTER TABLE `mw_trackbacks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_trackbacks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_transcache`
---
-
-DROP TABLE IF EXISTS `mw_transcache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_transcache` (
-  `tc_url` varbinary(255) NOT NULL,
-  `tc_contents` text,
-  `tc_time` binary(14) DEFAULT NULL,
-  UNIQUE KEY `tc_url_idx` (`tc_url`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_transcache`
---
-
-LOCK TABLES `mw_transcache` WRITE;
-/*!40000 ALTER TABLE `mw_transcache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_transcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_updatelog`
---
-
-DROP TABLE IF EXISTS `mw_updatelog`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_updatelog` (
-  `ul_key` varchar(255) NOT NULL,
-  `ul_value` blob,
-  PRIMARY KEY (`ul_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_updatelog`
---
-
-LOCK TABLES `mw_updatelog` WRITE;
-/*!40000 ALTER TABLE `mw_updatelog` DISABLE KEYS */;
-INSERT INTO `mw_updatelog` VALUES ('cl_fields_update',NULL),('convert transcache field',NULL),('mime_minor_length',NULL),('populate category',NULL),('populate rev_len',NULL),('populate rev_parent_id',NULL),('updatelist-1.18alpha-1294425799','a:128:{i:0;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:6:\"ipb_id\";i:3;s:18:\"patch-ipblocks.sql\";}i:1;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:10:\"ipb_expiry\";i:3;s:20:\"patch-ipb_expiry.sql\";}i:2;a:1:{i:0;s:17:\"doInterwikiUpdate\";}i:3;a:1:{i:0;s:13:\"doIndexUpdate\";}i:4;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"hitcounter\";i:2;s:20:\"patch-hitcounter.sql\";}i:5;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:7:\"rc_type\";i:3;s:17:\"patch-rc_type.sql\";}i:6;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:14:\"user_real_name\";i:3;s:23:\"patch-user-realname.sql\";}i:7;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"querycache\";i:2;s:20:\"patch-querycache.sql\";}i:8;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"objectcache\";i:2;s:21:\"patch-objectcache.sql\";}i:9;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"categorylinks\";i:2;s:23:\"patch-categorylinks.sql\";}i:10;a:1:{i:0;s:16:\"doOldLinksUpdate\";}i:11;a:1:{i:0;s:22:\"doFixAncientImagelinks\";}i:12;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:5:\"rc_ip\";i:3;s:15:\"patch-rc_ip.sql\";}i:13;a:4:{i:0;s:8:\"addIndex\";i:1;s:5:\"image\";i:2;s:7:\"PRIMARY\";i:3;s:28:\"patch-image_name_primary.sql\";}i:14;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:5:\"rc_id\";i:3;s:15:\"patch-rc_id.sql\";}i:15;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:12:\"rc_patrolled\";i:3;s:19:\"patch-rc-patrol.sql\";}i:16;a:3:{i:0;s:8:\"addTable\";i:1;s:7:\"logging\";i:2;s:17:\"patch-logging.sql\";}i:17;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:10:\"user_token\";i:3;s:20:\"patch-user_token.sql\";}i:18;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"watchlist\";i:2;s:24:\"wl_notificationtimestamp\";i:3;s:28:\"patch-email-notification.sql\";}i:19;a:1:{i:0;s:17:\"doWatchlistUpdate\";}i:20;a:4:{i:0;s:9:\"dropField\";i:1;s:4:\"user\";i:2;s:33:\"user_emailauthenticationtimestamp\";i:3;s:30:\"patch-email-authentication.sql\";}i:21;a:1:{i:0;s:21:\"doSchemaRestructuring\";}i:22;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:10:\"log_params\";i:3;s:20:\"patch-log_params.sql\";}i:23;a:4:{i:0;s:8:\"checkBin\";i:1;s:7:\"logging\";i:2;s:9:\"log_title\";i:3;s:23:\"patch-logging-title.sql\";}i:24;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:9:\"ar_rev_id\";i:3;s:24:\"patch-archive-rev_id.sql\";}i:25;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"page\";i:2;s:8:\"page_len\";i:3;s:18:\"patch-page_len.sql\";}i:26;a:4:{i:0;s:9:\"dropField\";i:1;s:8:\"revision\";i:2;s:17:\"inverse_timestamp\";i:3;s:27:\"patch-inverse_timestamp.sql\";}i:27;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:11:\"rev_text_id\";i:3;s:21:\"patch-rev_text_id.sql\";}i:28;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:11:\"rev_deleted\";i:3;s:21:\"patch-rev_deleted.sql\";}i:29;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:9:\"img_width\";i:3;s:19:\"patch-img_width.sql\";}i:30;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:12:\"img_metadata\";i:3;s:22:\"patch-img_metadata.sql\";}i:31;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:16:\"user_email_token\";i:3;s:26:\"patch-user_email_token.sql\";}i:32;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:10:\"ar_text_id\";i:3;s:25:\"patch-archive-text_id.sql\";}i:33;a:1:{i:0;s:15:\"doNamespaceSize\";}i:34;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:14:\"img_media_type\";i:3;s:24:\"patch-img_media_type.sql\";}i:35;a:1:{i:0;s:17:\"doPagelinksUpdate\";}i:36;a:4:{i:0;s:9:\"dropField\";i:1;s:5:\"image\";i:2;s:8:\"img_type\";i:3;s:23:\"patch-drop_img_type.sql\";}i:37;a:1:{i:0;s:18:\"doUserUniqueUpdate\";}i:38;a:1:{i:0;s:18:\"doUserGroupsUpdate\";}i:39;a:4:{i:0;s:8:\"addField\";i:1;s:10:\"site_stats\";i:2;s:14:\"ss_total_pages\";i:3;s:27:\"patch-ss_total_articles.sql\";}i:40;a:3:{i:0;s:8:\"addTable\";i:1;s:12:\"user_newtalk\";i:2;s:22:\"patch-usernewtalk2.sql\";}i:41;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"transcache\";i:2;s:20:\"patch-transcache.sql\";}i:42;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"interwiki\";i:2;s:8:\"iw_trans\";i:3;s:25:\"patch-interwiki-trans.sql\";}i:43;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"trackbacks\";i:2;s:20:\"patch-trackbacks.sql\";}i:44;a:1:{i:0;s:15:\"doWatchlistNull\";}i:45;a:4:{i:0;s:8:\"addIndex\";i:1;s:7:\"logging\";i:2;s:5:\"times\";i:3;s:29:\"patch-logging-times-index.sql\";}i:46;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:15:\"ipb_range_start\";i:3;s:25:\"patch-ipb_range_start.sql\";}i:47;a:1:{i:0;s:18:\"doPageRandomUpdate\";}i:48;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:17:\"user_registration\";i:3;s:27:\"patch-user_registration.sql\";}i:49;a:1:{i:0;s:21:\"doTemplatelinksUpdate\";}i:50;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"externallinks\";i:2;s:23:\"patch-externallinks.sql\";}i:51;a:3:{i:0;s:8:\"addTable\";i:1;s:3:\"job\";i:2;s:13:\"patch-job.sql\";}i:52;a:4:{i:0;s:8:\"addField\";i:1;s:10:\"site_stats\";i:2;s:9:\"ss_images\";i:3;s:19:\"patch-ss_images.sql\";}i:53;a:3:{i:0;s:8:\"addTable\";i:1;s:9:\"langlinks\";i:2;s:19:\"patch-langlinks.sql\";}i:54;a:3:{i:0;s:8:\"addTable\";i:1;s:15:\"querycache_info\";i:2;s:24:\"patch-querycacheinfo.sql\";}i:55;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"filearchive\";i:2;s:21:\"patch-filearchive.sql\";}i:56;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:13:\"ipb_anon_only\";i:3;s:23:\"patch-ipb_anon_only.sql\";}i:57;a:4:{i:0;s:8:\"addIndex\";i:1;s:13:\"recentchanges\";i:2;s:14:\"rc_ns_usertext\";i:3;s:31:\"patch-recentchanges-utindex.sql\";}i:58;a:4:{i:0;s:8:\"addIndex\";i:1;s:13:\"recentchanges\";i:2;s:12:\"rc_user_text\";i:3;s:28:\"patch-rc_user_text-index.sql\";}i:59;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:17:\"user_newpass_time\";i:3;s:27:\"patch-user_newpass_time.sql\";}i:60;a:3:{i:0;s:8:\"addTable\";i:1;s:8:\"redirect\";i:2;s:18:\"patch-redirect.sql\";}i:61;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"querycachetwo\";i:2;s:23:\"patch-querycachetwo.sql\";}i:62;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:20:\"ipb_enable_autoblock\";i:3;s:32:\"patch-ipb_optional_autoblock.sql\";}i:63;a:1:{i:0;s:26:\"doBacklinkingIndicesUpdate\";}i:64;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:10:\"rc_old_len\";i:3;s:16:\"patch-rc_len.sql\";}i:65;a:4:{i:0;s:8:\"addField\";i:1;s:4:\"user\";i:2;s:14:\"user_editcount\";i:3;s:24:\"patch-user_editcount.sql\";}i:66;a:1:{i:0;s:20:\"doRestrictionsUpdate\";}i:67;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:6:\"log_id\";i:3;s:16:\"patch-log_id.sql\";}i:68;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:13:\"rev_parent_id\";i:3;s:23:\"patch-rev_parent_id.sql\";}i:69;a:4:{i:0;s:8:\"addField\";i:1;s:17:\"page_restrictions\";i:2;s:5:\"pr_id\";i:3;s:35:\"patch-page_restrictions_sortkey.sql\";}i:70;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"revision\";i:2;s:7:\"rev_len\";i:3;s:17:\"patch-rev_len.sql\";}i:71;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"recentchanges\";i:2;s:10:\"rc_deleted\";i:3;s:20:\"patch-rc_deleted.sql\";}i:72;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:11:\"log_deleted\";i:3;s:21:\"patch-log_deleted.sql\";}i:73;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:10:\"ar_deleted\";i:3;s:20:\"patch-ar_deleted.sql\";}i:74;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:11:\"ipb_deleted\";i:3;s:21:\"patch-ipb_deleted.sql\";}i:75;a:4:{i:0;s:8:\"addField\";i:1;s:11:\"filearchive\";i:2;s:10:\"fa_deleted\";i:3;s:20:\"patch-fa_deleted.sql\";}i:76;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:6:\"ar_len\";i:3;s:16:\"patch-ar_len.sql\";}i:77;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:15:\"ipb_block_email\";i:3;s:22:\"patch-ipb_emailban.sql\";}i:78;a:1:{i:0;s:28:\"doCategorylinksIndicesUpdate\";}i:79;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"oldimage\";i:2;s:11:\"oi_metadata\";i:3;s:21:\"patch-oi_metadata.sql\";}i:80;a:4:{i:0;s:8:\"addIndex\";i:1;s:7:\"archive\";i:2;s:18:\"usertext_timestamp\";i:3;s:28:\"patch-archive-user-index.sql\";}i:81;a:4:{i:0;s:8:\"addIndex\";i:1;s:5:\"image\";i:2;s:22:\"img_usertext_timestamp\";i:3;s:26:\"patch-image-user-index.sql\";}i:82;a:4:{i:0;s:8:\"addIndex\";i:1;s:8:\"oldimage\";i:2;s:21:\"oi_usertext_timestamp\";i:3;s:29:\"patch-oldimage-user-index.sql\";}i:83;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:10:\"ar_page_id\";i:3;s:25:\"patch-archive-page_id.sql\";}i:84;a:4:{i:0;s:8:\"addField\";i:1;s:5:\"image\";i:2;s:8:\"img_sha1\";i:3;s:18:\"patch-img_sha1.sql\";}i:85;a:3:{i:0;s:8:\"addTable\";i:1;s:16:\"protected_titles\";i:2;s:26:\"patch-protected_titles.sql\";}i:86;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:11:\"ipb_by_text\";i:3;s:21:\"patch-ipb_by_text.sql\";}i:87;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"page_props\";i:2;s:20:\"patch-page_props.sql\";}i:88;a:3:{i:0;s:8:\"addTable\";i:1;s:9:\"updatelog\";i:2;s:19:\"patch-updatelog.sql\";}i:89;a:3:{i:0;s:8:\"addTable\";i:1;s:8:\"category\";i:2;s:18:\"patch-category.sql\";}i:90;a:1:{i:0;s:20:\"doCategoryPopulation\";}i:91;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"archive\";i:2;s:12:\"ar_parent_id\";i:3;s:22:\"patch-ar_parent_id.sql\";}i:92;a:4:{i:0;s:8:\"addField\";i:1;s:12:\"user_newtalk\";i:2;s:19:\"user_last_timestamp\";i:3;s:29:\"patch-user_last_timestamp.sql\";}i:93;a:1:{i:0;s:18:\"doPopulateParentId\";}i:94;a:4:{i:0;s:8:\"checkBin\";i:1;s:16:\"protected_titles\";i:2;s:8:\"pt_title\";i:3;s:27:\"patch-pt_title-encoding.sql\";}i:95;a:1:{i:0;s:28:\"doMaybeProfilingMemoryUpdate\";}i:96;a:1:{i:0;s:26:\"doFilearchiveIndicesUpdate\";}i:97;a:4:{i:0;s:8:\"addField\";i:1;s:10:\"site_stats\";i:2;s:15:\"ss_active_users\";i:3;s:25:\"patch-ss_active_users.sql\";}i:98;a:1:{i:0;s:17:\"doActiveUsersInit\";}i:99;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"ipblocks\";i:2;s:18:\"ipb_allow_usertalk\";i:3;s:28:\"patch-ipb_allow_usertalk.sql\";}i:100;a:1:{i:0;s:14:\"doUniquePlTlIl\";}i:101;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"change_tag\";i:2;s:20:\"patch-change_tag.sql\";}i:102;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"tag_summary\";i:2;s:20:\"patch-change_tag.sql\";}i:103;a:3:{i:0;s:8:\"addTable\";i:1;s:9:\"valid_tag\";i:2;s:20:\"patch-change_tag.sql\";}i:104;a:3:{i:0;s:8:\"addTable\";i:1;s:15:\"user_properties\";i:2;s:25:\"patch-user_properties.sql\";}i:105;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"log_search\";i:2;s:20:\"patch-log_search.sql\";}i:106;a:1:{i:0;s:21:\"doLogSearchPopulation\";}i:107;a:4:{i:0;s:8:\"addField\";i:1;s:7:\"logging\";i:2;s:13:\"log_user_text\";i:3;s:23:\"patch-log_user_text.sql\";}i:108;a:3:{i:0;s:8:\"addTable\";i:1;s:10:\"l10n_cache\";i:2;s:20:\"patch-l10n_cache.sql\";}i:109;a:3:{i:0;s:8:\"addTable\";i:1;s:13:\"external_user\";i:2;s:23:\"patch-external_user.sql\";}i:110;a:4:{i:0;s:8:\"addIndex\";i:1;s:10:\"log_search\";i:2;s:12:\"ls_field_val\";i:3;s:33:\"patch-log_search-rename-index.sql\";}i:111;a:4:{i:0;s:8:\"addIndex\";i:1;s:10:\"change_tag\";i:2;s:17:\"change_tag_rc_tag\";i:3;s:28:\"patch-change_tag-indexes.sql\";}i:112;a:4:{i:0;s:8:\"addField\";i:1;s:8:\"redirect\";i:2;s:12:\"rd_interwiki\";i:3;s:22:\"patch-rd_interwiki.sql\";}i:113;a:1:{i:0;s:23:\"doUpdateTranscacheField\";}i:114;a:1:{i:0;s:14:\"renameEuWikiId\";}i:115;a:1:{i:0;s:22:\"doUpdateMimeMinorField\";}i:116;a:1:{i:0;s:16:\"doPopulateRevLen\";}i:117;a:3:{i:0;s:8:\"addTable\";i:1;s:7:\"iwlinks\";i:2;s:17:\"patch-iwlinks.sql\";}i:118;a:4:{i:0;s:8:\"addIndex\";i:1;s:7:\"iwlinks\";i:2;s:21:\"iwl_prefix_title_from\";i:3;s:27:\"patch-rename-iwl_prefix.sql\";}i:119;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"updatelog\";i:2;s:8:\"ul_value\";i:3;s:18:\"patch-ul_value.sql\";}i:120;a:4:{i:0;s:8:\"addField\";i:1;s:9:\"interwiki\";i:2;s:6:\"iw_api\";i:3;s:27:\"patch-iw_api_and_wikiid.sql\";}i:121;a:4:{i:0;s:9:\"dropIndex\";i:1;s:7:\"iwlinks\";i:2;s:10:\"iwl_prefix\";i:3;s:25:\"patch-kill-iwl_prefix.sql\";}i:122;a:4:{i:0;s:9:\"dropIndex\";i:1;s:7:\"iwlinks\";i:2;s:21:\"iwl_prefix_from_title\";i:3;s:22:\"patch-kill-iwl_pft.sql\";}i:123;a:4:{i:0;s:8:\"addField\";i:1;s:13:\"categorylinks\";i:2;s:12:\"cl_collation\";i:3;s:40:\"patch-categorylinks-better-collation.sql\";}i:124;a:1:{i:0;s:16:\"doClFieldsUpdate\";}i:125;a:1:{i:0;s:17:\"doCollationUpdate\";}i:126;a:3:{i:0;s:8:\"addTable\";i:1;s:12:\"msg_resource\";i:2;s:22:\"patch-msg_resource.sql\";}i:127;a:3:{i:0;s:8:\"addTable\";i:1;s:11:\"module_deps\";i:2;s:21:\"patch-module_deps.sql\";}}');
-/*!40000 ALTER TABLE `mw_updatelog` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user`
---
-
-DROP TABLE IF EXISTS `mw_user`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user` (
-  `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `user_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `user_real_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `user_password` tinyblob NOT NULL,
-  `user_newpassword` tinyblob NOT NULL,
-  `user_newpass_time` binary(14) DEFAULT NULL,
-  `user_email` tinytext NOT NULL,
-  `user_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `user_token` binary(32) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `user_email_authenticated` binary(14) DEFAULT NULL,
-  `user_email_token` binary(32) DEFAULT NULL,
-  `user_email_token_expires` binary(14) DEFAULT NULL,
-  `user_registration` binary(14) DEFAULT NULL,
-  `user_editcount` int(11) DEFAULT NULL,
-  PRIMARY KEY (`user_id`),
-  UNIQUE KEY `user_name` (`user_name`),
-  KEY `user_email_token` (`user_email_token`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user`
---
-
-LOCK TABLES `mw_user` WRITE;
-/*!40000 ALTER TABLE `mw_user` DISABLE KEYS */;
-INSERT INTO `mw_user` VALUES (1,'WikiSysop','',':B:9c595470:df2c1237ae75896744457e7dfbeb7f90','',NULL,'','','20110110173136','5e3b582786fa8150118cfa78f18de0c5',NULL,'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,'20110107184113',1);
-/*!40000 ALTER TABLE `mw_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_groups`
---
-
-DROP TABLE IF EXISTS `mw_user_groups`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_groups` (
-  `ug_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `ug_group` varbinary(16) NOT NULL DEFAULT '',
-  UNIQUE KEY `ug_user_group` (`ug_user`,`ug_group`),
-  KEY `ug_group` (`ug_group`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_groups`
---
-
-LOCK TABLES `mw_user_groups` WRITE;
-/*!40000 ALTER TABLE `mw_user_groups` DISABLE KEYS */;
-INSERT INTO `mw_user_groups` VALUES (1,'bureaucrat'),(1,'sysop');
-/*!40000 ALTER TABLE `mw_user_groups` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_newtalk`
---
-
-DROP TABLE IF EXISTS `mw_user_newtalk`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_newtalk` (
-  `user_id` int(11) NOT NULL DEFAULT '0',
-  `user_ip` varbinary(40) NOT NULL DEFAULT '',
-  `user_last_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  KEY `user_id` (`user_id`),
-  KEY `user_ip` (`user_ip`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_newtalk`
---
-
-LOCK TABLES `mw_user_newtalk` WRITE;
-/*!40000 ALTER TABLE `mw_user_newtalk` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_newtalk` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_properties`
---
-
-DROP TABLE IF EXISTS `mw_user_properties`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_properties` (
-  `up_user` int(11) NOT NULL,
-  `up_property` varbinary(32) NOT NULL,
-  `up_value` blob,
-  UNIQUE KEY `user_properties_user_property` (`up_user`,`up_property`),
-  KEY `user_properties_property` (`up_property`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_properties`
---
-
-LOCK TABLES `mw_user_properties` WRITE;
-/*!40000 ALTER TABLE `mw_user_properties` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_properties` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_valid_tag`
---
-
-DROP TABLE IF EXISTS `mw_valid_tag`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_valid_tag` (
-  `vt_tag` varchar(255) NOT NULL,
-  PRIMARY KEY (`vt_tag`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_valid_tag`
---
-
-LOCK TABLES `mw_valid_tag` WRITE;
-/*!40000 ALTER TABLE `mw_valid_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_valid_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_watchlist`
---
-
-DROP TABLE IF EXISTS `mw_watchlist`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_watchlist` (
-  `wl_user` int(10) unsigned NOT NULL,
-  `wl_namespace` int(11) NOT NULL DEFAULT '0',
-  `wl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `wl_notificationtimestamp` varbinary(14) DEFAULT NULL,
-  UNIQUE KEY `wl_user` (`wl_user`,`wl_namespace`,`wl_title`),
-  KEY `namespace_title` (`wl_namespace`,`wl_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_watchlist`
---
-
-LOCK TABLES `mw_watchlist` WRITE;
-/*!40000 ALTER TABLE `mw_watchlist` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_watchlist` ENABLE KEYS */;
-UNLOCK TABLES;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2011-01-10  9:34:34
diff --git a/tests/selenium/data/SimpleSeleniumTestImages.zip b/tests/selenium/data/SimpleSeleniumTestImages.zip
deleted file mode 100644
index 0374a1fb..00000000
Binary files a/tests/selenium/data/SimpleSeleniumTestImages.zip and /dev/null differ
diff --git a/tests/selenium/data/Wikipedia-logo-v2-de.png b/tests/selenium/data/Wikipedia-logo-v2-de.png
deleted file mode 100644
index 70385243..00000000
Binary files a/tests/selenium/data/Wikipedia-logo-v2-de.png and /dev/null differ
diff --git a/tests/selenium/data/mediawiki118_fresh_installation.sql b/tests/selenium/data/mediawiki118_fresh_installation.sql
deleted file mode 100644
index 7beb9e6a..00000000
--- a/tests/selenium/data/mediawiki118_fresh_installation.sql
+++ /dev/null
@@ -1,1543 +0,0 @@
--- MySQL dump 10.13  Distrib 5.1.41, for Win32 (ia32)
---
--- Host: localhost    Database: test_wiki
--- ------------------------------------------------------
--- Server version	5.1.41
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!40101 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Table structure for table `mw_archive`
---
-
-DROP TABLE IF EXISTS `mw_archive`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_archive` (
-  `ar_namespace` int(11) NOT NULL DEFAULT '0',
-  `ar_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `ar_text` mediumblob NOT NULL,
-  `ar_comment` tinyblob NOT NULL,
-  `ar_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `ar_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `ar_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `ar_minor_edit` tinyint(4) NOT NULL DEFAULT '0',
-  `ar_flags` tinyblob NOT NULL,
-  `ar_rev_id` int(10) unsigned DEFAULT NULL,
-  `ar_text_id` int(10) unsigned DEFAULT NULL,
-  `ar_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `ar_len` int(10) unsigned DEFAULT NULL,
-  `ar_page_id` int(10) unsigned DEFAULT NULL,
-  `ar_parent_id` int(10) unsigned DEFAULT NULL,
-  KEY `name_title_timestamp` (`ar_namespace`,`ar_title`,`ar_timestamp`),
-  KEY `usertext_timestamp` (`ar_user_text`,`ar_timestamp`),
-  KEY `ar_page_revid` (`ar_namespace`,`ar_title`,`ar_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_archive`
---
-
-LOCK TABLES `mw_archive` WRITE;
-/*!40000 ALTER TABLE `mw_archive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_archive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_category`
---
-
-DROP TABLE IF EXISTS `mw_category`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_category` (
-  `cat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `cat_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `cat_pages` int(11) NOT NULL DEFAULT '0',
-  `cat_subcats` int(11) NOT NULL DEFAULT '0',
-  `cat_files` int(11) NOT NULL DEFAULT '0',
-  `cat_hidden` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`cat_id`),
-  UNIQUE KEY `cat_title` (`cat_title`),
-  KEY `cat_pages` (`cat_pages`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_category`
---
-
-LOCK TABLES `mw_category` WRITE;
-/*!40000 ALTER TABLE `mw_category` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_category` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_categorylinks`
---
-
-DROP TABLE IF EXISTS `mw_categorylinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_categorylinks` (
-  `cl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `cl_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `cl_sortkey` varbinary(230) NOT NULL DEFAULT '',
-  `cl_sortkey_prefix` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `cl_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-  `cl_collation` varbinary(32) NOT NULL DEFAULT '',
-  `cl_type` enum('page','subcat','file') NOT NULL DEFAULT 'page',
-  UNIQUE KEY `cl_from` (`cl_from`,`cl_to`),
-  KEY `cl_sortkey` (`cl_to`,`cl_type`,`cl_sortkey`,`cl_from`),
-  KEY `cl_timestamp` (`cl_to`,`cl_timestamp`),
-  KEY `cl_collation` (`cl_collation`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_categorylinks`
---
-
-LOCK TABLES `mw_categorylinks` WRITE;
-/*!40000 ALTER TABLE `mw_categorylinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_categorylinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_change_tag`
---
-
-DROP TABLE IF EXISTS `mw_change_tag`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_change_tag` (
-  `ct_rc_id` int(11) DEFAULT NULL,
-  `ct_log_id` int(11) DEFAULT NULL,
-  `ct_rev_id` int(11) DEFAULT NULL,
-  `ct_tag` varchar(255) NOT NULL,
-  `ct_params` blob,
-  UNIQUE KEY `change_tag_rc_tag` (`ct_rc_id`,`ct_tag`),
-  UNIQUE KEY `change_tag_log_tag` (`ct_log_id`,`ct_tag`),
-  UNIQUE KEY `change_tag_rev_tag` (`ct_rev_id`,`ct_tag`),
-  KEY `change_tag_tag_id` (`ct_tag`,`ct_rc_id`,`ct_rev_id`,`ct_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_change_tag`
---
-
-LOCK TABLES `mw_change_tag` WRITE;
-/*!40000 ALTER TABLE `mw_change_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_change_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_external_user`
---
-
-DROP TABLE IF EXISTS `mw_external_user`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_external_user` (
-  `eu_local_id` int(10) unsigned NOT NULL,
-  `eu_external_id` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  PRIMARY KEY (`eu_local_id`),
-  UNIQUE KEY `eu_external_id` (`eu_external_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_external_user`
---
-
-LOCK TABLES `mw_external_user` WRITE;
-/*!40000 ALTER TABLE `mw_external_user` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_external_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_externallinks`
---
-
-DROP TABLE IF EXISTS `mw_externallinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_externallinks` (
-  `el_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `el_to` blob NOT NULL,
-  `el_index` blob NOT NULL,
-  KEY `el_from` (`el_from`,`el_to`(40)),
-  KEY `el_to` (`el_to`(60),`el_from`),
-  KEY `el_index` (`el_index`(60))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_externallinks`
---
-
-LOCK TABLES `mw_externallinks` WRITE;
-/*!40000 ALTER TABLE `mw_externallinks` DISABLE KEYS */;
-INSERT INTO `mw_externallinks` VALUES (1,'http://meta.wikimedia.org/wiki/Help:Contents','http://org.wikimedia.meta./wiki/Help:Contents');
-INSERT INTO `mw_externallinks` VALUES (1,'http://www.mediawiki.org/wiki/Manual:Configuration_settings','http://org.mediawiki.www./wiki/Manual:Configuration_settings');
-INSERT INTO `mw_externallinks` VALUES (1,'http://www.mediawiki.org/wiki/Manual:FAQ','http://org.mediawiki.www./wiki/Manual:FAQ');
-INSERT INTO `mw_externallinks` VALUES (1,'https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce','https://org.wikimedia.lists./mailman/listinfo/mediawiki-announce');
-/*!40000 ALTER TABLE `mw_externallinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_filearchive`
---
-
-DROP TABLE IF EXISTS `mw_filearchive`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_filearchive` (
-  `fa_id` int(11) NOT NULL AUTO_INCREMENT,
-  `fa_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `fa_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '',
-  `fa_storage_group` varbinary(16) DEFAULT NULL,
-  `fa_storage_key` varbinary(64) DEFAULT '',
-  `fa_deleted_user` int(11) DEFAULT NULL,
-  `fa_deleted_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `fa_deleted_reason` text,
-  `fa_size` int(10) unsigned DEFAULT '0',
-  `fa_width` int(11) DEFAULT '0',
-  `fa_height` int(11) DEFAULT '0',
-  `fa_metadata` mediumblob,
-  `fa_bits` int(11) DEFAULT '0',
-  `fa_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
-  `fa_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') DEFAULT 'unknown',
-  `fa_minor_mime` varbinary(100) DEFAULT 'unknown',
-  `fa_description` tinyblob,
-  `fa_user` int(10) unsigned DEFAULT '0',
-  `fa_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
-  `fa_timestamp` binary(14) DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `fa_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`fa_id`),
-  KEY `fa_name` (`fa_name`,`fa_timestamp`),
-  KEY `fa_storage_group` (`fa_storage_group`,`fa_storage_key`),
-  KEY `fa_deleted_timestamp` (`fa_deleted_timestamp`),
-  KEY `fa_user_timestamp` (`fa_user_text`,`fa_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_filearchive`
---
-
-LOCK TABLES `mw_filearchive` WRITE;
-/*!40000 ALTER TABLE `mw_filearchive` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_filearchive` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_hitcounter`
---
-
-DROP TABLE IF EXISTS `mw_hitcounter`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_hitcounter` (
-  `hc_id` int(10) unsigned NOT NULL
-) ENGINE=MEMORY DEFAULT CHARSET=latin1 MAX_ROWS=25000;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_hitcounter`
---
-
-LOCK TABLES `mw_hitcounter` WRITE;
-/*!40000 ALTER TABLE `mw_hitcounter` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_hitcounter` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_image`
---
-
-DROP TABLE IF EXISTS `mw_image`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_image` (
-  `img_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `img_size` int(10) unsigned NOT NULL DEFAULT '0',
-  `img_width` int(11) NOT NULL DEFAULT '0',
-  `img_height` int(11) NOT NULL DEFAULT '0',
-  `img_metadata` mediumblob NOT NULL,
-  `img_bits` int(11) NOT NULL DEFAULT '0',
-  `img_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
-  `img_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') NOT NULL DEFAULT 'unknown',
-  `img_minor_mime` varbinary(100) NOT NULL DEFAULT 'unknown',
-  `img_description` tinyblob NOT NULL,
-  `img_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `img_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `img_timestamp` varbinary(14) NOT NULL DEFAULT '',
-  `img_sha1` varbinary(32) NOT NULL DEFAULT '',
-  PRIMARY KEY (`img_name`),
-  KEY `img_usertext_timestamp` (`img_user_text`,`img_timestamp`),
-  KEY `img_size` (`img_size`),
-  KEY `img_timestamp` (`img_timestamp`),
-  KEY `img_sha1` (`img_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_image`
---
-
-LOCK TABLES `mw_image` WRITE;
-/*!40000 ALTER TABLE `mw_image` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_image` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_imagelinks`
---
-
-DROP TABLE IF EXISTS `mw_imagelinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_imagelinks` (
-  `il_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `il_to` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `il_from` (`il_from`,`il_to`),
-  UNIQUE KEY `il_to` (`il_to`,`il_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_imagelinks`
---
-
-LOCK TABLES `mw_imagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_imagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_imagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_interwiki`
---
-
-DROP TABLE IF EXISTS `mw_interwiki`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_interwiki` (
-  `iw_prefix` varchar(32) NOT NULL,
-  `iw_url` blob NOT NULL,
-  `iw_api` blob NOT NULL,
-  `iw_wikiid` varchar(64) NOT NULL,
-  `iw_local` tinyint(1) NOT NULL,
-  `iw_trans` tinyint(4) NOT NULL DEFAULT '0',
-  UNIQUE KEY `iw_prefix` (`iw_prefix`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_interwiki`
---
-
-LOCK TABLES `mw_interwiki` WRITE;
-/*!40000 ALTER TABLE `mw_interwiki` DISABLE KEYS */;
-INSERT INTO `mw_interwiki` VALUES ('acronym','http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('advogato','http://www.advogato.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('annotationwiki','http://www.seedwiki.com/page.cfm?wikiid=368&doc=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('arxiv','http://www.arxiv.org/abs/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('c2find','http://c2.com/cgi/wiki?FindPage&value=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('cache','http://www.google.com/search?q=cache:$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('commons','http://commons.wikimedia.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('corpknowpedia','http://corpknowpedia.org/wiki/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('dictionary','http://www.dict.org/bin/Dict?Database=*&Form=Dict1&Strategy=*&Query=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('disinfopedia','http://www.disinfopedia.org/wiki.phtml?title=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('docbook','http://wiki.docbook.org/topic/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('doi','http://dx.doi.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('drumcorpswiki','http://www.drumcorpswiki.com/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('dwjwiki','http://www.suberic.net/cgi-bin/dwj/wiki.cgi?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('elibre','http://enciclopedia.us.es/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('emacswiki','http://www.emacswiki.org/cgi-bin/wiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('foldoc','http://foldoc.org/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('foxwiki','http://fox.wikis.com/wc.dll?Wiki~$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('freebsdman','http://www.FreeBSD.org/cgi/man.cgi?apropos=1&query=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('gej','http://www.esperanto.de/cgi-bin/aktivikio/wiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('gentoo-wiki','http://gentoo-wiki.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('google','http://www.google.com/search?q=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('googlegroups','http://groups.google.com/groups?q=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('hammondwiki','http://www.dairiki.org/HammondWiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('hewikisource','http://he.wikisource.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('hrwiki','http://www.hrwiki.org/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('imdb','http://us.imdb.com/Title?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('jargonfile','http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('jspwiki','http://www.jspwiki.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('keiki','http://kei.ki/en/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('kmwiki','http://kmwiki.wikispaces.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('linuxwiki','http://linuxwiki.de/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('lojban','http://www.lojban.org/tiki/tiki-index.php?page=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('lqwiki','http://wiki.linuxquestions.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('lugkr','http://lug-kr.sourceforge.net/cgi-bin/lugwiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mathsongswiki','http://SeedWiki.com/page.cfm?wikiid=237&doc=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('meatball','http://www.usemod.com/cgi-bin/mb.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mediawikiwiki','http://www.mediawiki.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mediazilla','https://bugzilla.wikimedia.org/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('memoryalpha','http://www.memory-alpha.org/en/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('metawiki','http://sunir.org/apps/meta.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('metawikimedia','http://meta.wikimedia.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('moinmoin','http://purl.net/wiki/moin/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mozillawiki','http://wiki.mozilla.org/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('mw','http://www.mediawiki.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('oeis','http://www.research.att.com/cgi-bin/access.cgi/as/njas/sequences/eisA.cgi?Anum=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('openfacts','http://openfacts.berlios.de/index.phtml?title=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('openwiki','http://openwiki.com/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('pmeg','http://www.bertilow.com/pmeg/$1.php','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('ppr','http://c2.com/cgi/wiki?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('pythoninfo','http://wiki.python.org/moin/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('rfc','http://www.rfc-editor.org/rfc/rfc$1.txt','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('s23wiki','http://is-root.de/wiki/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('seattlewiki','http://seattle.wikia.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('seattlewireless','http://seattlewireless.net/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('senseislibrary','http://senseis.xmp.net/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('sourceforge','http://sourceforge.net/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('squeak','http://wiki.squeak.org/squeak/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('susning','http://www.susning.nu/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('svgwiki','http://wiki.svg.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tavi','http://tavi.sourceforge.net/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tejo','http://www.tejo.org/vikio/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('theopedia','http://www.theopedia.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tmbw','http://www.tmbw.net/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tmnet','http://www.technomanifestos.net/?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('tmwiki','http://www.EasyTopicMaps.com/?page=$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('twiki','http://twiki.org/cgi-bin/view/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('uea','http://www.tejo.org/uea/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('unreal','http://wiki.beyondunreal.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('vinismo','http://vinismo.com/en/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('webseitzwiki','http://webseitz.fluxent.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('why','http://clublet.com/c/c/why?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wiki','http://c2.com/cgi/wiki?$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikia','http://www.wikia.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikibooks','http://en.wikibooks.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikicities','http://www.wikia.com/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikif1','http://www.wikif1.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikihow','http://www.wikihow.com/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikimedia','http://wikimediafoundation.org/wiki/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikinews','http://en.wikinews.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikinfo','http://www.wikinfo.org/index.php/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikipedia','http://en.wikipedia.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikiquote','http://en.wikiquote.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikisource','http://wikisource.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikispecies','http://species.wikimedia.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikitravel','http://wikitravel.org/en/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('wikiversity','http://en.wikiversity.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wikt','http://en.wiktionary.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wiktionary','http://en.wiktionary.org/wiki/$1','','',1,0);
-INSERT INTO `mw_interwiki` VALUES ('wlug','http://www.wlug.org.nz/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('zwiki','http://zwiki.org/$1','','',0,0);
-INSERT INTO `mw_interwiki` VALUES ('zzz wiki','http://wiki.zzz.ee/index.php/$1','','',0,0);
-/*!40000 ALTER TABLE `mw_interwiki` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_ipblocks`
---
-
-DROP TABLE IF EXISTS `mw_ipblocks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_ipblocks` (
-  `ipb_id` int(11) NOT NULL AUTO_INCREMENT,
-  `ipb_address` tinyblob NOT NULL,
-  `ipb_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `ipb_by` int(10) unsigned NOT NULL DEFAULT '0',
-  `ipb_by_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `ipb_reason` tinyblob NOT NULL,
-  `ipb_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `ipb_auto` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_anon_only` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_create_account` tinyint(1) NOT NULL DEFAULT '1',
-  `ipb_enable_autoblock` tinyint(1) NOT NULL DEFAULT '1',
-  `ipb_expiry` varbinary(14) NOT NULL DEFAULT '',
-  `ipb_range_start` tinyblob NOT NULL,
-  `ipb_range_end` tinyblob NOT NULL,
-  `ipb_deleted` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_block_email` tinyint(1) NOT NULL DEFAULT '0',
-  `ipb_allow_usertalk` tinyint(1) NOT NULL DEFAULT '0',
-  PRIMARY KEY (`ipb_id`),
-  UNIQUE KEY `ipb_address` (`ipb_address`(255),`ipb_user`,`ipb_auto`,`ipb_anon_only`),
-  KEY `ipb_user` (`ipb_user`),
-  KEY `ipb_range` (`ipb_range_start`(8),`ipb_range_end`(8)),
-  KEY `ipb_timestamp` (`ipb_timestamp`),
-  KEY `ipb_expiry` (`ipb_expiry`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_ipblocks`
---
-
-LOCK TABLES `mw_ipblocks` WRITE;
-/*!40000 ALTER TABLE `mw_ipblocks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_ipblocks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_iwlinks`
---
-
-DROP TABLE IF EXISTS `mw_iwlinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_iwlinks` (
-  `iwl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `iwl_prefix` varbinary(20) NOT NULL DEFAULT '',
-  `iwl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `iwl_from` (`iwl_from`,`iwl_prefix`,`iwl_title`),
-  UNIQUE KEY `iwl_prefix_title_from` (`iwl_prefix`,`iwl_title`,`iwl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_iwlinks`
---
-
-LOCK TABLES `mw_iwlinks` WRITE;
-/*!40000 ALTER TABLE `mw_iwlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_iwlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_job`
---
-
-DROP TABLE IF EXISTS `mw_job`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_job` (
-  `job_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `job_cmd` varbinary(60) NOT NULL DEFAULT '',
-  `job_namespace` int(11) NOT NULL,
-  `job_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `job_params` blob NOT NULL,
-  PRIMARY KEY (`job_id`),
-  KEY `job_cmd` (`job_cmd`,`job_namespace`,`job_title`,`job_params`(128))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_job`
---
-
-LOCK TABLES `mw_job` WRITE;
-/*!40000 ALTER TABLE `mw_job` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_job` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_l10n_cache`
---
-
-DROP TABLE IF EXISTS `mw_l10n_cache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_l10n_cache` (
-  `lc_lang` varbinary(32) NOT NULL,
-  `lc_key` varchar(255) NOT NULL,
-  `lc_value` mediumblob NOT NULL,
-  KEY `lc_lang_key` (`lc_lang`,`lc_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
-
-
---
--- Table structure for table `mw_langlinks`
---
-
-DROP TABLE IF EXISTS `mw_langlinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_langlinks` (
-  `ll_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `ll_lang` varbinary(20) NOT NULL DEFAULT '',
-  `ll_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `ll_from` (`ll_from`,`ll_lang`),
-  KEY `ll_lang` (`ll_lang`,`ll_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_langlinks`
---
-
-LOCK TABLES `mw_langlinks` WRITE;
-/*!40000 ALTER TABLE `mw_langlinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_langlinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_log_search`
---
-
-DROP TABLE IF EXISTS `mw_log_search`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_log_search` (
-  `ls_field` varbinary(32) NOT NULL,
-  `ls_value` varchar(255) NOT NULL,
-  `ls_log_id` int(10) unsigned NOT NULL DEFAULT '0',
-  UNIQUE KEY `ls_field_val` (`ls_field`,`ls_value`,`ls_log_id`),
-  KEY `ls_log_id` (`ls_log_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_log_search`
---
-
-LOCK TABLES `mw_log_search` WRITE;
-/*!40000 ALTER TABLE `mw_log_search` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_log_search` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_logging`
---
-
-DROP TABLE IF EXISTS `mw_logging`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_logging` (
-  `log_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `log_type` varbinary(32) NOT NULL DEFAULT '',
-  `log_action` varbinary(32) NOT NULL DEFAULT '',
-  `log_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
-  `log_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `log_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `log_namespace` int(11) NOT NULL DEFAULT '0',
-  `log_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `log_page` int(10) unsigned DEFAULT NULL,
-  `log_comment` varchar(255) NOT NULL DEFAULT '',
-  `log_params` blob NOT NULL,
-  `log_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`log_id`),
-  KEY `type_time` (`log_type`,`log_timestamp`),
-  KEY `user_time` (`log_user`,`log_timestamp`),
-  KEY `page_time` (`log_namespace`,`log_title`,`log_timestamp`),
-  KEY `times` (`log_timestamp`),
-  KEY `log_user_type_time` (`log_user`,`log_type`,`log_timestamp`),
-  KEY `log_page_id_time` (`log_page`,`log_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_logging`
---
-
-LOCK TABLES `mw_logging` WRITE;
-/*!40000 ALTER TABLE `mw_logging` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_logging` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_math`
---
-
-DROP TABLE IF EXISTS `mw_math`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_math` (
-  `math_inputhash` varbinary(16) NOT NULL,
-  `math_outputhash` varbinary(16) NOT NULL,
-  `math_html_conservativeness` tinyint(4) NOT NULL,
-  `math_html` text,
-  `math_mathml` text,
-  UNIQUE KEY `math_inputhash` (`math_inputhash`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_math`
---
-
-LOCK TABLES `mw_math` WRITE;
-/*!40000 ALTER TABLE `mw_math` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_math` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_module_deps`
---
-
-DROP TABLE IF EXISTS `mw_module_deps`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_module_deps` (
-  `md_module` varbinary(255) NOT NULL,
-  `md_skin` varbinary(32) NOT NULL,
-  `md_deps` mediumblob NOT NULL,
-  UNIQUE KEY `md_module_skin` (`md_module`,`md_skin`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_module_deps`
---
-
-LOCK TABLES `mw_module_deps` WRITE;
-/*!40000 ALTER TABLE `mw_module_deps` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_module_deps` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource` (
-  `mr_resource` varbinary(255) NOT NULL,
-  `mr_lang` varbinary(32) NOT NULL,
-  `mr_blob` mediumblob NOT NULL,
-  `mr_timestamp` binary(14) NOT NULL,
-  UNIQUE KEY `mr_resource_lang` (`mr_resource`,`mr_lang`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource`
---
-
-LOCK TABLES `mw_msg_resource` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_msg_resource` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_msg_resource_links`
---
-
-DROP TABLE IF EXISTS `mw_msg_resource_links`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_msg_resource_links` (
-  `mrl_resource` varbinary(255) NOT NULL,
-  `mrl_message` varbinary(255) NOT NULL,
-  UNIQUE KEY `mrl_message_resource` (`mrl_message`,`mrl_resource`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_msg_resource_links`
---
-
-LOCK TABLES `mw_msg_resource_links` WRITE;
-/*!40000 ALTER TABLE `mw_msg_resource_links` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_msg_resource_links` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_objectcache`
---
-
-DROP TABLE IF EXISTS `mw_objectcache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_objectcache` (
-  `keyname` varbinary(255) NOT NULL DEFAULT '',
-  `value` mediumblob,
-  `exptime` datetime DEFAULT NULL,
-  PRIMARY KEY (`keyname`),
-  KEY `exptime` (`exptime`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_objectcache`
---
-
-LOCK TABLES `mw_objectcache` WRITE;
-/*!40000 ALTER TABLE `mw_objectcache` DISABLE KEYS */;
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:messages:en','K�2��.�2�R\ns\r\n���S�δ2��\0','2010-12-31 13:16:31');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:pcache:idhash:1-0!*!*!!en!*','�V[o�F�g~�����B��P��m)$TK�U��\0�����8$��9�a\rI�l��X>��ܹ�q�Sa,��ʕ�x��?[~ʃ|�.Z��$�8Y�\'�I�Y�K��-\04�U����J�\'&�uB)�:I������E�m�sk`�`k�Q�v��a���\rZ��t�0����+P%GE�ـ�JX;\n-s�P�@�B�b���8~�첒$��ea�υ��f��+���0[,�F�x��d�\'�z�0��BJ���=���J��c�\\��:��&B��T��\'��C��Fdÿ׆Fq����Gd����%8G�0��A�I��;		Ԙ`�7�5�LI\r��(���{�c�����g+��8Qr�&�ͦ��A)�V��ЕPT��\\UƧtn��Z�e�SfJZ(V�P�}����0��O�N	�=j�\\H��y�\\�U[h]T:���bd��u��+�j%\'�6k��f:E�;�@Yך��4���Ȁ��q���Z�º6<b�3��TU(d��,\n���Y|�e�\'�5��T�fU�8}�\"��m���/���}Uk�9o��;����|*R?�n���	3d��g1��y�\\f8gk�����w��=��:/Y7���ۋ�^<�Ō����v#���i����C�#��6\Z�.0�Ua$4�=\Z���;��4����Y=���5���:kpΐq��Ŧ4��X���C��qYߵ-��ǈ�����D�f�����:����(3t��14C��J�#����������WXT���Δy:�^�6�v�7����I�U�Ee��(�p0��ga�6Mj��Sc�,ѫ@��ޅ+R����A��xХ\'6���utǷbۛ��`j�8ؚ�G�IC<KS��5�|�krJ\ry�\\b3xP�����ua�@����$SS�`��tQ.gwW��\r@\'���w�� ��xZ(�>5{����dw�>�=J)\r�6t ��X����M���B�\n�ŖT����b>�qg����7��z�n7��vwr�-%u�-Qi�iX1��Ne���A#�v��ӧ�3��?','2010-12-31 13:16:31');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:pcache:idoptions:1','E���@D��`�\"v�ƣ��Wh��,�b�!�⭙7�L+�|}�t��I�$�<���F\rpSl�4����OJN`\r\Z����ծ���)��PY��$�K����գ9�Vjp72��E���c�Wp�2��cVxu7��	����p#�r=.���[>y)Zp��','2010-12-31 13:16:31');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-css:3832ee25d9c44988461f5f339b9b6a48','+�26�Rr�MM�LTH�ɩV\0�Z(��(3�(R�d\r\0','2038-01-19 03:14:07');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-css:aa0df16258ad99a1d249e796b5067ed9','+�2��Rr�MM�LTH�ɩN��K-�Q.,�L�NJ,R\0��s򋬔�\r���V�\Z\0','2038-01-19 03:14:07');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-js:22814eeadc9cf0a9ebcd844e14198e66','m��r�0��y����r�&Qޡמ!\n�qQ�Xq;}���$��ވ� �c!]]].o5S�\n�)Fq��L^��?�s�F�!�O�M\\�������\0���N��Ɂ���լ����:��-�j��F��{ۅ�G�\"i�� \Z�6�K����!��Y]=�F[�~竍���䶃����`��9N�Ǵ���@�K��|z�?1�A��@J#_ԁ�7\'�l�1)J�͵�).�3z�f�T�A���Hњ�[#)�BzRA�7֌��\"T�*~SW���/P���B�Ŏ;\Z�ay�6����+U��?.$�6��-uT�v@h��s�&�����Nإb�fJ�~�]6��p��/q)�>�E�1��͔A\ne�L�g\ZE�`cW�����`fJ�E�a��>��b\n�ӑd�.u�do��[�\nt��b�+���l\Z?X*��Y�(�օ;�L�Jqťɝ���d$�\"�WzG�-@b~+�#�kǞَ�Ƃ~������P)B	����q�Җ2���r�Rl����`z	�4�����ÝX�m�;�X݁t;r.�sA��R��y)�kA�\nR�JT��J�U��*�W��_ߟ�4@�vt��f���>����x���','2038-01-19 03:14:07');
-INSERT INTO `mw_objectcache` VALUES ('test_wiki-mw_:resourceloader:filter:minify-js:dd9440c19c575629ac5ec90e489cf62e','+�21�R���Ԕ�����L���Ĕ�\"��ĒT�j��̒T%+���ĔJ�ZMk.%k\0','2038-01-19 03:14:07');
-/*!40000 ALTER TABLE `mw_objectcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_oldimage`
---
-
-DROP TABLE IF EXISTS `mw_oldimage`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_oldimage` (
-  `oi_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `oi_archive_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `oi_size` int(10) unsigned NOT NULL DEFAULT '0',
-  `oi_width` int(11) NOT NULL DEFAULT '0',
-  `oi_height` int(11) NOT NULL DEFAULT '0',
-  `oi_bits` int(11) NOT NULL DEFAULT '0',
-  `oi_description` tinyblob NOT NULL,
-  `oi_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `oi_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `oi_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `oi_metadata` mediumblob NOT NULL,
-  `oi_media_type` enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE') DEFAULT NULL,
-  `oi_major_mime` enum('unknown','application','audio','image','text','video','message','model','multipart') NOT NULL DEFAULT 'unknown',
-  `oi_minor_mime` varbinary(100) NOT NULL DEFAULT 'unknown',
-  `oi_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `oi_sha1` varbinary(32) NOT NULL DEFAULT '',
-  KEY `oi_usertext_timestamp` (`oi_user_text`,`oi_timestamp`),
-  KEY `oi_name_timestamp` (`oi_name`,`oi_timestamp`),
-  KEY `oi_name_archive_name` (`oi_name`,`oi_archive_name`(14)),
-  KEY `oi_sha1` (`oi_sha1`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_oldimage`
---
-
-LOCK TABLES `mw_oldimage` WRITE;
-/*!40000 ALTER TABLE `mw_oldimage` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_oldimage` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page`
---
-
-DROP TABLE IF EXISTS `mw_page`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page` (
-  `page_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `page_namespace` int(11) NOT NULL,
-  `page_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `page_restrictions` tinyblob NOT NULL,
-  `page_counter` bigint(20) unsigned NOT NULL DEFAULT '0',
-  `page_is_redirect` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `page_is_new` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `page_random` double unsigned NOT NULL,
-  `page_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `page_latest` int(10) unsigned NOT NULL,
-  `page_len` int(10) unsigned NOT NULL,
-  PRIMARY KEY (`page_id`),
-  UNIQUE KEY `name_title` (`page_namespace`,`page_title`),
-  KEY `page_random` (`page_random`),
-  KEY `page_len` (`page_len`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page`
---
-
-LOCK TABLES `mw_page` WRITE;
-/*!40000 ALTER TABLE `mw_page` DISABLE KEYS */;
-INSERT INTO `mw_page` VALUES (1,0,'Main_Page','',1,0,1,0.334989576352,'20101230131547',1,438);
-/*!40000 ALTER TABLE `mw_page` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_props`
---
-
-DROP TABLE IF EXISTS `mw_page_props`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_props` (
-  `pp_page` int(11) NOT NULL,
-  `pp_propname` varbinary(60) NOT NULL,
-  `pp_value` blob NOT NULL,
-  UNIQUE KEY `pp_page_propname` (`pp_page`,`pp_propname`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_props`
---
-
-LOCK TABLES `mw_page_props` WRITE;
-/*!40000 ALTER TABLE `mw_page_props` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_props` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_page_restrictions`
---
-
-DROP TABLE IF EXISTS `mw_page_restrictions`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_page_restrictions` (
-  `pr_page` int(11) NOT NULL,
-  `pr_type` varbinary(60) NOT NULL,
-  `pr_level` varbinary(60) NOT NULL,
-  `pr_cascade` tinyint(4) NOT NULL,
-  `pr_user` int(11) DEFAULT NULL,
-  `pr_expiry` varbinary(14) DEFAULT NULL,
-  `pr_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  PRIMARY KEY (`pr_id`),
-  UNIQUE KEY `pr_pagetype` (`pr_page`,`pr_type`),
-  KEY `pr_typelevel` (`pr_type`,`pr_level`),
-  KEY `pr_level` (`pr_level`),
-  KEY `pr_cascade` (`pr_cascade`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_page_restrictions`
---
-
-LOCK TABLES `mw_page_restrictions` WRITE;
-/*!40000 ALTER TABLE `mw_page_restrictions` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_page_restrictions` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_pagelinks`
---
-
-DROP TABLE IF EXISTS `mw_pagelinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_pagelinks` (
-  `pl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `pl_namespace` int(11) NOT NULL DEFAULT '0',
-  `pl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `pl_from` (`pl_from`,`pl_namespace`,`pl_title`),
-  UNIQUE KEY `pl_namespace` (`pl_namespace`,`pl_title`,`pl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_pagelinks`
---
-
-LOCK TABLES `mw_pagelinks` WRITE;
-/*!40000 ALTER TABLE `mw_pagelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_pagelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_protected_titles`
---
-
-DROP TABLE IF EXISTS `mw_protected_titles`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_protected_titles` (
-  `pt_namespace` int(11) NOT NULL,
-  `pt_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `pt_user` int(10) unsigned NOT NULL,
-  `pt_reason` tinyblob,
-  `pt_timestamp` binary(14) NOT NULL,
-  `pt_expiry` varbinary(14) NOT NULL DEFAULT '',
-  `pt_create_perm` varbinary(60) NOT NULL,
-  UNIQUE KEY `pt_namespace_title` (`pt_namespace`,`pt_title`),
-  KEY `pt_timestamp` (`pt_timestamp`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_protected_titles`
---
-
-LOCK TABLES `mw_protected_titles` WRITE;
-/*!40000 ALTER TABLE `mw_protected_titles` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_protected_titles` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache`
---
-
-DROP TABLE IF EXISTS `mw_querycache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache` (
-  `qc_type` varbinary(32) NOT NULL,
-  `qc_value` int(10) unsigned NOT NULL DEFAULT '0',
-  `qc_namespace` int(11) NOT NULL DEFAULT '0',
-  `qc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  KEY `qc_type` (`qc_type`,`qc_value`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache`
---
-
-LOCK TABLES `mw_querycache` WRITE;
-/*!40000 ALTER TABLE `mw_querycache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycache_info`
---
-
-DROP TABLE IF EXISTS `mw_querycache_info`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycache_info` (
-  `qci_type` varbinary(32) NOT NULL DEFAULT '',
-  `qci_timestamp` binary(14) NOT NULL DEFAULT '19700101000000',
-  UNIQUE KEY `qci_type` (`qci_type`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycache_info`
---
-
-LOCK TABLES `mw_querycache_info` WRITE;
-/*!40000 ALTER TABLE `mw_querycache_info` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycache_info` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_querycachetwo`
---
-
-DROP TABLE IF EXISTS `mw_querycachetwo`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_querycachetwo` (
-  `qcc_type` varbinary(32) NOT NULL,
-  `qcc_value` int(10) unsigned NOT NULL DEFAULT '0',
-  `qcc_namespace` int(11) NOT NULL DEFAULT '0',
-  `qcc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `qcc_namespacetwo` int(11) NOT NULL DEFAULT '0',
-  `qcc_titletwo` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  KEY `qcc_type` (`qcc_type`,`qcc_value`),
-  KEY `qcc_title` (`qcc_type`,`qcc_namespace`,`qcc_title`),
-  KEY `qcc_titletwo` (`qcc_type`,`qcc_namespacetwo`,`qcc_titletwo`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_querycachetwo`
---
-
-LOCK TABLES `mw_querycachetwo` WRITE;
-/*!40000 ALTER TABLE `mw_querycachetwo` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_querycachetwo` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_recentchanges`
---
-
-DROP TABLE IF EXISTS `mw_recentchanges`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_recentchanges` (
-  `rc_id` int(11) NOT NULL AUTO_INCREMENT,
-  `rc_timestamp` varbinary(14) NOT NULL DEFAULT '',
-  `rc_cur_time` varbinary(14) NOT NULL DEFAULT '',
-  `rc_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
-  `rc_namespace` int(11) NOT NULL DEFAULT '0',
-  `rc_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rc_comment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rc_minor` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_bot` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_new` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_cur_id` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_this_oldid` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_last_oldid` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_type` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_moved_to_ns` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_moved_to_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rc_patrolled` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_ip` varbinary(40) NOT NULL DEFAULT '',
-  `rc_old_len` int(11) DEFAULT NULL,
-  `rc_new_len` int(11) DEFAULT NULL,
-  `rc_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rc_logid` int(10) unsigned NOT NULL DEFAULT '0',
-  `rc_log_type` varbinary(255) DEFAULT NULL,
-  `rc_log_action` varbinary(255) DEFAULT NULL,
-  `rc_params` blob,
-  PRIMARY KEY (`rc_id`),
-  KEY `rc_timestamp` (`rc_timestamp`),
-  KEY `rc_namespace_title` (`rc_namespace`,`rc_title`),
-  KEY `rc_cur_id` (`rc_cur_id`),
-  KEY `new_name_timestamp` (`rc_new`,`rc_namespace`,`rc_timestamp`),
-  KEY `rc_ip` (`rc_ip`),
-  KEY `rc_ns_usertext` (`rc_namespace`,`rc_user_text`),
-  KEY `rc_user_text` (`rc_user_text`,`rc_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_recentchanges`
---
-
-LOCK TABLES `mw_recentchanges` WRITE;
-/*!40000 ALTER TABLE `mw_recentchanges` DISABLE KEYS */;
-INSERT INTO `mw_recentchanges` VALUES (1,'20101230131547','20101230131547',0,'MediaWiki Default',0,'Main_Page','',0,0,1,1,1,0,1,0,'',0,'::1',0,438,0,0,NULL,'','');
-/*!40000 ALTER TABLE `mw_recentchanges` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_redirect`
---
-
-DROP TABLE IF EXISTS `mw_redirect`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_redirect` (
-  `rd_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `rd_namespace` int(11) NOT NULL DEFAULT '0',
-  `rd_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rd_interwiki` varchar(32) DEFAULT NULL,
-  `rd_fragment` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
-  PRIMARY KEY (`rd_from`),
-  KEY `rd_ns_title` (`rd_namespace`,`rd_title`,`rd_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_redirect`
---
-
-LOCK TABLES `mw_redirect` WRITE;
-/*!40000 ALTER TABLE `mw_redirect` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_redirect` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_revision`
---
-
-DROP TABLE IF EXISTS `mw_revision`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_revision` (
-  `rev_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `rev_page` int(10) unsigned NOT NULL,
-  `rev_text_id` int(10) unsigned NOT NULL,
-  `rev_comment` tinyblob NOT NULL,
-  `rev_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `rev_user_text` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `rev_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `rev_minor_edit` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rev_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0',
-  `rev_len` int(10) unsigned DEFAULT NULL,
-  `rev_parent_id` int(10) unsigned DEFAULT NULL,
-  PRIMARY KEY (`rev_id`),
-  UNIQUE KEY `rev_page_id` (`rev_page`,`rev_id`),
-  KEY `rev_timestamp` (`rev_timestamp`),
-  KEY `page_timestamp` (`rev_page`,`rev_timestamp`),
-  KEY `user_timestamp` (`rev_user`,`rev_timestamp`),
-  KEY `usertext_timestamp` (`rev_user_text`,`rev_timestamp`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_revision`
---
-
-LOCK TABLES `mw_revision` WRITE;
-/*!40000 ALTER TABLE `mw_revision` DISABLE KEYS */;
-INSERT INTO `mw_revision` VALUES (1,1,1,'',0,'MediaWiki Default','20101230131547',0,0,438,0);
-/*!40000 ALTER TABLE `mw_revision` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_searchindex`
---
-
-DROP TABLE IF EXISTS `mw_searchindex`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_searchindex` (
-  `si_page` int(10) unsigned NOT NULL,
-  `si_title` varchar(255) NOT NULL DEFAULT '',
-  `si_text` mediumtext NOT NULL,
-  UNIQUE KEY `si_page` (`si_page`),
-  FULLTEXT KEY `si_title` (`si_title`),
-  FULLTEXT KEY `si_text` (`si_text`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_searchindex`
---
-
-LOCK TABLES `mw_searchindex` WRITE;
-/*!40000 ALTER TABLE `mw_searchindex` DISABLE KEYS */;
-INSERT INTO `mw_searchindex` VALUES (1,'main page','  mediawiki hasu800 been successfully installed.  consult theu800 user user\'su800 guide foru800 information onu800 using theu800 wiki software. getting started getting started getting started configuration settings list mediawiki faqu800 mediawiki release mailing list ');
-/*!40000 ALTER TABLE `mw_searchindex` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_site_stats`
---
-
-DROP TABLE IF EXISTS `mw_site_stats`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_site_stats` (
-  `ss_row_id` int(10) unsigned NOT NULL,
-  `ss_total_views` bigint(20) unsigned DEFAULT '0',
-  `ss_total_edits` bigint(20) unsigned DEFAULT '0',
-  `ss_good_articles` bigint(20) unsigned DEFAULT '0',
-  `ss_total_pages` bigint(20) DEFAULT '-1',
-  `ss_users` bigint(20) DEFAULT '-1',
-  `ss_active_users` bigint(20) DEFAULT '-1',
-  `ss_admins` int(11) DEFAULT '-1',
-  `ss_images` int(11) DEFAULT '0',
-  UNIQUE KEY `ss_row_id` (`ss_row_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_site_stats`
---
-
-LOCK TABLES `mw_site_stats` WRITE;
-/*!40000 ALTER TABLE `mw_site_stats` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_site_stats` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_tag_summary`
---
-
-DROP TABLE IF EXISTS `mw_tag_summary`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_tag_summary` (
-  `ts_rc_id` int(11) DEFAULT NULL,
-  `ts_log_id` int(11) DEFAULT NULL,
-  `ts_rev_id` int(11) DEFAULT NULL,
-  `ts_tags` blob NOT NULL,
-  UNIQUE KEY `tag_summary_rc_id` (`ts_rc_id`),
-  UNIQUE KEY `tag_summary_log_id` (`ts_log_id`),
-  UNIQUE KEY `tag_summary_rev_id` (`ts_rev_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_tag_summary`
---
-
-LOCK TABLES `mw_tag_summary` WRITE;
-/*!40000 ALTER TABLE `mw_tag_summary` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_tag_summary` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_templatelinks`
---
-
-DROP TABLE IF EXISTS `mw_templatelinks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_templatelinks` (
-  `tl_from` int(10) unsigned NOT NULL DEFAULT '0',
-  `tl_namespace` int(11) NOT NULL DEFAULT '0',
-  `tl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  UNIQUE KEY `tl_from` (`tl_from`,`tl_namespace`,`tl_title`),
-  UNIQUE KEY `tl_namespace` (`tl_namespace`,`tl_title`,`tl_from`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_templatelinks`
---
-
-LOCK TABLES `mw_templatelinks` WRITE;
-/*!40000 ALTER TABLE `mw_templatelinks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_templatelinks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_text`
---
-
-DROP TABLE IF EXISTS `mw_text`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_text` (
-  `old_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `old_text` mediumblob NOT NULL,
-  `old_flags` tinyblob NOT NULL,
-  PRIMARY KEY (`old_id`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 MAX_ROWS=10000000 AVG_ROW_LENGTH=10240;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_text`
---
-
-LOCK TABLES `mw_text` WRITE;
-/*!40000 ALTER TABLE `mw_text` DISABLE KEYS */;
-INSERT INTO `mw_text` VALUES (1,'\'\'\'MediaWiki has been successfully installed.\'\'\'\n\nConsult the [http://meta.wikimedia.org/wiki/Help:Contents User\'s Guide] for information on using the wiki software.\n\n== Getting started ==\n* [http://www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [http://www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]','utf-8');
-/*!40000 ALTER TABLE `mw_text` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_trackbacks`
---
-
-DROP TABLE IF EXISTS `mw_trackbacks`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_trackbacks` (
-  `tb_id` int(11) NOT NULL AUTO_INCREMENT,
-  `tb_page` int(11) DEFAULT NULL,
-  `tb_title` varchar(255) NOT NULL,
-  `tb_url` blob NOT NULL,
-  `tb_ex` text,
-  `tb_name` varchar(255) DEFAULT NULL,
-  PRIMARY KEY (`tb_id`),
-  KEY `tb_page` (`tb_page`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_trackbacks`
---
-
-LOCK TABLES `mw_trackbacks` WRITE;
-/*!40000 ALTER TABLE `mw_trackbacks` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_trackbacks` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_transcache`
---
-
-DROP TABLE IF EXISTS `mw_transcache`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_transcache` (
-  `tc_url` varbinary(255) NOT NULL,
-  `tc_contents` text,
-  `tc_time` binary(14) NOT NULL,
-  UNIQUE KEY `tc_url_idx` (`tc_url`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_transcache`
---
-
-LOCK TABLES `mw_transcache` WRITE;
-/*!40000 ALTER TABLE `mw_transcache` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_transcache` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_updatelog`
---
-
-DROP TABLE IF EXISTS `mw_updatelog`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_updatelog` (
-  `ul_key` varchar(255) NOT NULL,
-  `ul_value` blob,
-  PRIMARY KEY (`ul_key`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_updatelog`
---
-
-LOCK TABLES `mw_updatelog` WRITE;
-/*!40000 ALTER TABLE `mw_updatelog` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_updatelog` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user`
---
-
-DROP TABLE IF EXISTS `mw_user`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user` (
-  `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `user_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `user_real_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `user_password` tinyblob NOT NULL,
-  `user_newpassword` tinyblob NOT NULL,
-  `user_newpass_time` binary(14) DEFAULT NULL,
-  `user_email` tinytext NOT NULL,
-  `user_touched` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `user_token` binary(32) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  `user_email_authenticated` binary(14) DEFAULT NULL,
-  `user_email_token` binary(32) DEFAULT NULL,
-  `user_email_token_expires` binary(14) DEFAULT NULL,
-  `user_registration` binary(14) DEFAULT NULL,
-  `user_editcount` int(11) DEFAULT NULL,
-  PRIMARY KEY (`user_id`),
-  UNIQUE KEY `user_name` (`user_name`),
-  KEY `user_email_token` (`user_email_token`)
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user`
---
-
-LOCK TABLES `mw_user` WRITE;
-/*!40000 ALTER TABLE `mw_user` DISABLE KEYS */;
-INSERT INTO `mw_user` VALUES (1,'WikiSysop','',':B:b1373470:f7e87db0c9596055f39a1225b0c31508','',NULL,'','','20101230131552','de4ddde7c4eef6e3609f4287324a0a18',NULL,'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',NULL,'20101230131547',0);
-/*!40000 ALTER TABLE `mw_user` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_groups`
---
-
-DROP TABLE IF EXISTS `mw_user_groups`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_groups` (
-  `ug_user` int(10) unsigned NOT NULL DEFAULT '0',
-  `ug_group` varbinary(16) NOT NULL DEFAULT '',
-  UNIQUE KEY `ug_user_group` (`ug_user`,`ug_group`),
-  KEY `ug_group` (`ug_group`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_groups`
---
-
-LOCK TABLES `mw_user_groups` WRITE;
-/*!40000 ALTER TABLE `mw_user_groups` DISABLE KEYS */;
-INSERT INTO `mw_user_groups` VALUES (1,'bureaucrat');
-INSERT INTO `mw_user_groups` VALUES (1,'sysop');
-/*!40000 ALTER TABLE `mw_user_groups` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_newtalk`
---
-
-DROP TABLE IF EXISTS `mw_user_newtalk`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_newtalk` (
-  `user_id` int(11) NOT NULL DEFAULT '0',
-  `user_ip` varbinary(40) NOT NULL DEFAULT '',
-  `user_last_timestamp` binary(14) NOT NULL DEFAULT '\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
-  KEY `user_id` (`user_id`),
-  KEY `user_ip` (`user_ip`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_newtalk`
---
-
-LOCK TABLES `mw_user_newtalk` WRITE;
-/*!40000 ALTER TABLE `mw_user_newtalk` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_newtalk` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_user_properties`
---
-
-DROP TABLE IF EXISTS `mw_user_properties`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_user_properties` (
-  `up_user` int(11) NOT NULL,
-  `up_property` varbinary(32) NOT NULL,
-  `up_value` blob,
-  UNIQUE KEY `user_properties_user_property` (`up_user`,`up_property`),
-  KEY `user_properties_property` (`up_property`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_user_properties`
---
-
-LOCK TABLES `mw_user_properties` WRITE;
-/*!40000 ALTER TABLE `mw_user_properties` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_user_properties` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_valid_tag`
---
-
-DROP TABLE IF EXISTS `mw_valid_tag`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_valid_tag` (
-  `vt_tag` varchar(255) NOT NULL,
-  PRIMARY KEY (`vt_tag`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_valid_tag`
---
-
-LOCK TABLES `mw_valid_tag` WRITE;
-/*!40000 ALTER TABLE `mw_valid_tag` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_valid_tag` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `mw_watchlist`
---
-
-DROP TABLE IF EXISTS `mw_watchlist`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!40101 SET character_set_client = utf8 */;
-CREATE TABLE `mw_watchlist` (
-  `wl_user` int(10) unsigned NOT NULL,
-  `wl_namespace` int(11) NOT NULL DEFAULT '0',
-  `wl_title` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  `wl_notificationtimestamp` varbinary(14) DEFAULT NULL,
-  UNIQUE KEY `wl_user` (`wl_user`,`wl_namespace`,`wl_title`),
-  KEY `namespace_title` (`wl_namespace`,`wl_title`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `mw_watchlist`
---
-
-LOCK TABLES `mw_watchlist` WRITE;
-/*!40000 ALTER TABLE `mw_watchlist` DISABLE KEYS */;
-/*!40000 ALTER TABLE `mw_watchlist` ENABLE KEYS */;
-UNLOCK TABLES;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2010-12-31  1:20:11
diff --git a/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php b/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php
deleted file mode 100644
index 4583360d..00000000
--- a/tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-/**
- * MediaWikiButtonsAvailabilityTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 30 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name :'Back' and 'Continue' button availability
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiButtonsAvailabilityTestCase extends MediaWikiInstallationCommonFunction {
-	function setUp() {
-		parent::setUp();
-	}
-
-	// Verify only 'Continue' button available on 'Language' page
-	public function testOnlyContinueButtonAvailability() {
-		parent::navigateLanguagePage();
-
-		// Verify only 'Continue' button avaialble
-		$this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-
-		// 'Back' button is not avaialble
-		$this->assertElementNotPresent( "submit-back" );
-	}
-
-	// Verify 'Continue' and 'Back' buttons availability
-	public function testBothButtonsAvailability() {
-		// Verify buttons availability on 'Welcome to MediaWiki' page
-		parent::navigateWelcometoMediaWikiPage();
-		$this->assertTrue( $this->isElementPresent( "submit-back" ) );
-		$this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-		parent::restartInstallation();
-
-		// Verify buttons availability on 'Connect to Database' page
-		parent::navigateConnetToDatabasePage();
-		$this->assertTrue( $this->isElementPresent( "submit-back" ) );
-		$this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-		parent::restartInstallation();
-
-		// Verify buttons availability on 'Database settings' page
-		$databaseName = DB_NAME_PREFIX . "_db_settings";
-		parent::navigateDatabaseSettingsPage( $databaseName );
-		$this->assertTrue( $this->isElementPresent( "submit-back" ) );
-		$this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-		parent::restartInstallation();
-
-		// Verify buttons availability on 'Name' page
-		$databaseName = DB_NAME_PREFIX . "_name";
-		parent::navigateNamePage( $databaseName );
-		$this->assertTrue( $this->isElementPresent( "submit-back" ) );
-		$this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-		parent::restartInstallation();
-
-		// Verify buttons availability on 'Options' page
-		$databaseName = DB_NAME_PREFIX . "_options";
-		parent::navigateOptionsPage( $databaseName );
-		$this->assertTrue( $this->isElementPresent( "submit-back" ) );
-		$this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-		parent::restartInstallation();
-
-		// Verify buttons availability on 'Install' page
-		$databaseName = DB_NAME_PREFIX . "_install";
-		parent::navigateInstallPage( $databaseName );
-		$this->assertTrue( $this->isElementPresent( "submit-back" ) );
-		$this->assertTrue( $this->isElementPresent( "submit-continue" ) );
-	}
-}
diff --git a/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php b/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php
deleted file mode 100644
index 6375d660..00000000
--- a/tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * MediaWikiDifferentDatabaseAccountTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 04 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install MediaWiki with different Database accounts for web access.
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiDifferentDatabaseAccountTestCase extends MediaWikiInstallationCommonFunction {
-	function setUp() {
-		parent::setUp();
-	}
-
-	// Install Mediawiki using 'MySQL' database type.
-	public function testDifferentDatabaseAccount() {
-		$databaseName = DB_NAME_PREFIX . "_dif_accounts";
-
-		// Navigate to the 'Database settings' page
-		parent::navigateDatabaseSettingsPage( $databaseName );
-
-		// Click on the 'Use the same account as for installation' check box
-		$this->click( "mysql__SameAccount" );
-
-		// Change the 'Database username'
-		$this->type( "mysql_wgDBuser", DB_WEB_USER );
-
-		// Enter 'Database password:'
-		$this->type( "mysql_wgDBpassword", DB_WEB_USER_PASSWORD );
-
-		// Select 'Create the account if it does not already exist' check box
-		$this->click( "mysql__CreateDBAccount" );
-		parent::clickContinueButton();
-
-		// 'Name' page
-		parent::completeNamePage();
-
-		// 'Options' page
-		parent::clickContinueButton();
-
-		// 'Install' page
-		$this->assertEquals( "Creating database user... done",
-			$this->getText( LINK_FORM . "ul/li[3]" ) );
-		parent::clickContinueButton();
-
-		// 'Complete' page
-		parent::completePageSuccessfull();
-		$this->chooseCancelOnNextConfirmation();
-	}
-}
diff --git a/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php b/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php
deleted file mode 100644
index fad4e06f..00000000
--- a/tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-/**
- * MediaWikiDifferntDatabasePrefixTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 02 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install MediaWiki with the same database and the different
- *                  database prefixes(Share one database between multiple wikis).
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiDifferntDatabasePrefixTestCase extends MediaWikiInstallationCommonFunction {
-	function setUp() {
-		parent::setUp();
-	}
-
-	// Install Mediawiki using 'MySQL' database type.
-	public function testDifferentDatabasePrefix() {
-		$databaseName = DB_NAME_PREFIX . "_db_prefix";
-		parent::navigateInstallPage( $databaseName );
-
-		// To 'Options' page
-		parent::clickBackButton();
-
-		// To 'Name' page
-		parent::clickBackButton();
-
-		// To 'Database settings' page
-		parent::clickBackButton();
-
-		// To 'Connect to database' page
-		parent::clickBackButton();
-
-		// From 'Connect to database' page without database prefix
-		parent::clickContinueButton();
-
-		// Verify upgrade existing message
-		$this->assertEquals( "Upgrade existing installation",
-			$this->getText( LINK_DIV . "h2" ) );
-
-		// To 'Connect to database' page
-		parent::clickBackButton();
-
-		// Input the database prefix
-		$this->type( "mysql_wgDBprefix", DATABASE_PREFIX );
-
-		// From 'Connect to database' page with database prefix
-		parent::clickContinueButton();
-
-		// To 'Complete' page
-		parent::clickContinueButton();
-		parent::completeNamePage();
-		parent::clickContinueButton();
-
-		// Verify already installed warning message
-		$this->assertEquals( "Install",
-			$this->getText( LINK_DIV . "h2" ) );
-		$this->assertEquals( "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
-			$this->getText( LINK_FORM . "div[1]" ) );
-
-		parent::clickContinueButton();
-		parent::completePageSuccessfull();
-		$this->chooseCancelOnNextConfirmation();
-		parent::restartInstallation();
-	}
-}
diff --git a/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php b/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php
deleted file mode 100644
index 37f5af2f..00000000
--- a/tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php
+++ /dev/null
@@ -1,131 +0,0 @@
-<?php
-/**
- * MediaWikiErrorsConnectToDatabasePageTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 09 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Invalid/ blank values for fields in 'Connect to database' page.
- * Version        : MediaWiki 1.18alpha
- */
-
-class MediaWikiErrorsConnectToDatabasePageTestCase extends MediaWikiInstallationCommonFunction {
-
-	function setUp() {
-		parent::setUp();
-	}
-
-	// Verify warning messages for the 'Connet to database' page
-	public function testErrorsConnectToDatabasePage() {
-		parent::navigateConnetToDatabasePage();
-
-		// Verify warning mesage for invalid database host
-		$this->type( "mysql_wgDBserver", INVALID_DB_HOST );
-		parent::clickContinueButton();
-		$this->assertEquals( "DB connection error: php_network_getaddresses: getaddrinfo failed: No such host is known. (" . INVALID_DB_HOST . ").",
-			$this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
-		$this->assertEquals( "Check the host, username and password below and try again.",
-			$this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
-		// Verify warning message for the blank database host
-		$this->type( "mysql_wgDBserver", "" );
-		parent::clickContinueButton();
-		$this->assertEquals( "MySQL 4.0.14 or later is required, you have .",
-			$this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-		// Valid Database Host
-		$this->type( "mysql_wgDBserver", VALID_DB_HOST );
-
-		// Verify warning message for the invalid database name
-		$this->type( "mysql_wgDBname", INVALID_DB_NAME );
-		parent::clickContinueButton();
-		$this->assertEquals( "Invalid database name \"" . INVALID_DB_NAME . "\". Use only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).",
-			$this->getText( LINK_DIV . "div[2]/div[2]/p" ) );
-
-		// Verify warning message for the blank database name
-		$this->type( "mysql_wgDBname", "" );
-		parent::clickContinueButton();
-		$this->assertEquals( "You must enter a value for \"Database name\"",
-			$this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-		// valid Database name
-		$this->type( "mysql_wgDBname", VALID_DB_NAME );
-
-		// Verify warning message for the invalid databaase prefix
-		$this->type( "mysql_wgDBprefix", INVALID_DB_PREFIX );
-		parent::clickContinueButton();
-		$this->assertEquals( "Invalid database prefix \"" . INVALID_DB_PREFIX . "\". Use only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).",
-			$this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-		// Valid Database prefix
-		$this->type( "mysql_wgDBprefix", VALID_DB_PREFIX );
-
-		// Verify warning message for the invalid database user name
-		$this->type( "mysql__InstallUser", INVALID_DB_USER_NAME );
-		parent::clickContinueButton();
-		$this->assertEquals( "DB connection error: Access denied for user '" . INVALID_DB_USER_NAME . "'@'localhost' (using password: NO) (localhost).",
-			$this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
-		$this->assertEquals( "Check the host, username and password below and try again.",
-			$this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
-
-		// Verify warning message for the blank database user name
-		$this->type( "mysql__InstallUser", "" );
-		parent::clickContinueButton();
-		$this->assertEquals( "DB connection error: Access denied for user 'SYSTEM'@'localhost' (using password: NO) (localhost).",
-			$this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
-		$this->assertEquals( "Check the host, username and password below and try again.",
-			$this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
-
-		// Valid Database username
-		$this->type( "mysql__InstallUser", VALID_DB_USER_NAME );
-
-		// Verify warning message for the invalid password
-		$this->type( "mysql__InstallPassword", INVALID_DB_PASSWORD );
-		parent::clickContinueButton();
-
-		$this->assertEquals( "DB connection error: Access denied for user 'root'@'localhost' (using password: YES) (localhost).",
-			$this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
-		$this->assertEquals( "Check the host, username and password below and try again.",
-			$this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
-
-		// Verify warning message for the invalid username and password
-		$this->type( "mysql__InstallUser", INVALID_DB_USER_NAME );
-		$this->type( "mysql__InstallPassword", INVALID_DB_PASSWORD );
-		parent::clickContinueButton();
-		$this->assertEquals( "DB connection error: Access denied for user '" . INVALID_DB_USER_NAME . "'@'localhost' (using password: YES) (localhost).",
-			$this->getText( LINK_DIV . "div[2]/div[2]/p[1]" ) );
-		$this->assertEquals( "Check the host, username and password below and try again.",
-			$this->getText( LINK_DIV . "div[2]/div[2]/p[2]" ) );
-
-		// Valid username and valid password
-		$this->type( "mysql__InstallUser", VALID_DB_USER_NAME );
-		$this->type( "mysql__InstallPassword", "" );
-		parent::clickContinueButton();
-
-		// successfully completes the 'Connect to database' page
-		$this->assertEquals( "Database settings",
-			$this->getText( LINK_DIV . "h2" ) );
-	}
-}
diff --git a/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php b/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php
deleted file mode 100644
index 536ceb66..00000000
--- a/tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php
+++ /dev/null
@@ -1,119 +0,0 @@
-<?php
-/**
- * MediaWikiErrorsNamepageTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 10 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Invalid/ blank values for fields in 'Name' page.
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiErrorsNamepageTestCase extends MediaWikiInstallationCommonFunction {
-	function setUp() {
-		parent::setUp();
-	}
-
-	// Verify warning message for the 'Name' page
-	public function testErrorsNamePage() {
-
-		$databaseName = DB_NAME_PREFIX . "_error_name";
-
-		parent::navigateNamePage( $databaseName );
-
-		// Verify warning message for all blank fields
-		parent::clickContinueButton();
-		$this->assertEquals( "Enter a site name.",
-			$this->getText( LINK_DIV . "div[2]/div[2]" ) );
-		$this->assertEquals( "Enter an administrator username.",
-			$this->getText( LINK_DIV . "div[3]/div[2]" ) );
-		$this->assertEquals( "Enter a password for the administrator account.",
-			$this->getText( LINK_DIV . "div[4]/div[2]" ) );
-
-		// Verify warning message for the blank 'Site name'
-		$this->type( "config__AdminName", VALID_YOUR_NAME );
-		$this->type( "config__AdminPassword", VALID_PASSWORD );
-		$this->type( "config__AdminPassword2", VALID_PASSWORD_AGAIN );
-		parent::clickContinueButton();
-		$this->assertEquals( "Enter a site name.",
-			$this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-		// Input valid 'Site name'
-		$this->type( "config_wgSitename", VALID_WIKI_NAME );
-
-		// Verify warning message for the invalid "Project namespace'
-		$this->click( "config__NamespaceType_other" );
-		$this->type( "config_wgMetaNamespace", INVALID_NAMESPACE );
-		parent::clickContinueButton();
-		$this->assertEquals( "The specified namespace \"\" is invalid. Specify a different project namespace.",
-			$this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-		// Verify warning message for the blank 'Project namespace'
-		$this->type( "config_wgSitename", VALID_WIKI_NAME );
-		$this->click( "config__NamespaceType_other" );
-		$this->type( "config_wgMetaNamespace", "" );
-		parent::clickContinueButton();
-		$this->assertEquals( "The specified namespace \"\" is invalid. Specify a different project namespace.",
-			$this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-		// Valid 'Project namespace'
-		$this->click( "config__NamespaceType_other" );
-		$this->type( "config_wgMetaNamespace", VALID_NAMESPACE );
-		parent::clickContinueButton();
-
-		// Valid 'Site name'
-		$this->click( "config__NamespaceType_site-name" );
-		$this->type( "config_wgSitename", VALID_WIKI_NAME );
-
-		// Verify warning message for blank 'Your name'
-		$this->type( "config__AdminName", " " );
-		parent::clickContinueButton();
-		$this->assertEquals( "Enter an administrator username.",
-			$this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-		$this->type( "config_wgSitename", VALID_WIKI_NAME );
-		// Verify warning message for blank 'Password'
-		$this->type( "config__AdminName", VALID_YOUR_NAME );
-		$this->type( "config__AdminPassword", " " );
-		parent::clickContinueButton();
-		$this->assertEquals( "Enter a password for the administrator account.",
-			$this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-		// Verify warning message for the blank 'Password again'
-		$this->type( "config_wgSitename", VALID_WIKI_NAME );
-		$this->type( "config__AdminPassword", VALID_PASSWORD );
-		$this->type( "config__AdminPassword2", " " );
-		parent::clickContinueButton();
-		$this->assertEquals( "The two passwords you entered do not match.",
-			$this->getText( LINK_DIV . "div[2]/div[2]" ) );
-
-		// Verify warning message for the different'Password' and 'Password again'
-		$this->type( "config_wgSitename", VALID_WIKI_NAME );
-		$this->type( "config__AdminPassword", VALID_PASSWORD );
-		$this->type( "config__AdminPassword2", INVALID_PASSWORD_AGAIN );
-		parent::clickContinueButton();
-		$this->assertEquals( "The two passwords you entered do not match.",
-			$this->getText( LINK_DIV . "div[2]/div[2]" ) );
-	}
-}
diff --git a/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php b/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php
deleted file mode 100644
index f0efce6e..00000000
--- a/tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-/**
- * MediaWikiHelpFieldHintTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 29 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Help field hint availability for the fields.
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiHelpFieldHintTestCase extends MediaWikiInstallationCommonFunction {
-	function setUp() {
-		parent::setUp();
-	}
-
-	// Verify help field availability for the fields
-	public function testMySQLConnectToDatabaseFieldHint() {
-
-		parent::navigateConnetToDatabasePage();
-
-		// Verify help field for 'Database host'
-		$this->click( "//div[@id='DB_wrapper_mysql']/div/div[1]/div/span[1]" );
-		$this->assertEquals( MYSQL_DATABASE_HOST_HELP,
-			$this->getText( "//div[@id='DB_wrapper_mysql']/div/div[1]/div/span[2]" ) );
-
-		// Verify help field for 'Database name'
-		$this->click( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/div/span[1]" );
-		$this->assertEquals( MYSQL_DATABASE_NAME_HELP,
-			$this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/div/span[2]" ) );
-
-
-		// Verify help field for 'Database table prefix'
-		$this->click( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[2]/div[1]/div/span[1]" );
-		$this->assertEquals( MYSQL_DATABASE_TABLE_PREFIX_HELP,
-			$this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/div/span[2]/p[1]" ) );
-
-		// Verify help field for 'Database username'
-		$this->click( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[1]/div[1]/div/span[1]" );
-		$this->assertEquals( MYSQL_DATBASE_USERNAME_HELP,
-			$this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[1]/div[1]/div/span[2]" ) );
-
-		// Verify help field for 'Database password'
-		$this->click( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[2]/div[1]/div/span[1]" );
-		$this->assertEquals( MYSQL_DATABASE_PASSWORD_HELP,
-			$this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[2]/div[1]/div/span[2]/p" ) );
-	}
-
-	public function testSQLiteConnectToDatabaseFieldHint() {
-		parent::navigateConnetToDatabasePage();
-		$this->click( "DBType_sqlite" );
-
-		//  Verify help field for 'SQLite data directory'
-		$this->click( "//div[@id='DB_wrapper_sqlite']/div[1]/div[1]/div/span[1]" );
-		$this->assertEquals( SQLITE_DATA_DIRECTORY_HELP,
-			$this->getText( "//div[@id='DB_wrapper_sqlite']/div[1]/div[1]/div/span[2]" ) );
-
-		// Verify help field for 'Database name'
-		$this->click( "//div[@id='DB_wrapper_sqlite']/div[2]/div[1]/div/span[1]" );
-		$this->assertEquals( SQLITE_DATABASE_NAME_HELP, $this->getText( "//div[@id='DB_wrapper_sqlite']/div[2]/div[1]/div/span[2]/p" ) );
-	}
-
-	public function testDatabaseSettingsFieldHint() {
-
-		$databaseName = DB_NAME_PREFIX . "_db_field";
-		parent::navigateDatabaseSettingsPage( $databaseName );
-
-		// Verify help field for 'Search engine'
-		$this->click( LINK_FORM . "div[2]/span[1]" );
-		$this->assertEquals( SEARCH_ENGINE_HELP,
-			$this->getText( LINK_FORM . "div[2]/span[2]" ) );
-
-		// Verify help field for 'Database character set'
-		$this->click( LINK_FORM . "div[4]/span[1]" );
-		$this->assertEquals( DATABASE_CHARACTER_SET_HELP,
-			$this->getText( LINK_FORM . "div[4]/span[2]" ) );
-		parent::restartInstallation();
-	}
-
-	public function testNameFieldHint() {
-		$databaseName = DB_NAME_PREFIX . "_name_field";
-		parent::navigateNamePage( $databaseName );
-
-		// Verify help field for 'Name of Wiki'
-		$this->click( LINK_FORM . "div[1]/div[1]/div/span[1]" );
-		$this->assertEquals( NAME_OF_WIKI_HELP,
-			$this->getText( LINK_FORM . "div[1]/div[1]/div/span[2]/p" ) );
-
-		// Verify help field for 'Project namespace'
-		$this->click( LINK_FORM . "div[2]/div[1]/div/span[1]" );
-		$this->assertEquals( PROJECT_NAMESPACE_HELP,
-			$this->getText( LINK_FORM . "div[2]/div[1]/div/span[2]/p" ) );
-
-		// Verify help field for 'Your Name'
-		$this->click( LINK_FORM . "fieldset/div[1]/div[1]/div/span[1]" );
-		$this->assertEquals( USER_NAME_HELP,
-			$this->getText( LINK_FORM . "fieldset/div[1]/div[1]/div/span[2]/p" ) );
-
-		// Verify help field for 'E mail address'
-		$this->click( LINK_FORM . "fieldset/div[4]/div[1]/div/span[1]" );
-		$this->assertEquals( EMAIL_ADDRESS_HELP,
-			$this->getText( LINK_FORM . "fieldset/div[4]/div[1]/div/span[2]/p" ) );
-
-		parent::restartInstallation();
-	}
-}
-
diff --git a/tests/selenium/installer/MediaWikiInstallationCommonFunction.php b/tests/selenium/installer/MediaWikiInstallationCommonFunction.php
deleted file mode 100644
index a9a8fc38..00000000
--- a/tests/selenium/installer/MediaWikiInstallationCommonFunction.php
+++ /dev/null
@@ -1,259 +0,0 @@
-<?php
-/**
- * MediaWikiInstallationCommonFunction
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
-require_once ( __DIR__ . '/MediaWikiInstallationConfig.php' );
-require_once ( __DIR__ . '/MediaWikiInstallationMessage.php' );
-require_once ( __DIR__ . '/MediaWikiInstallationVariables.php' );
-
-class MediaWikiInstallationCommonFunction extends PHPUnit_Extensions_SeleniumTestCase {
-	function setUp() {
-		$this->setBrowser( TEST_BROWSER );
-		$this->setBrowserUrl( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/" );
-	}
-
-	public function navigateInitialpage() {
-		$this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/" );
-	}
-
-	// Navigate to the 'Language' page
-	public function navigateLanguagePage() {
-		$this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-	}
-
-	// Navigate to the 'Welcome to MediaWiki' page
-	public function navigateWelcometoMediaWikiPage() {
-		$this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-		$this->click( "submit-continue " );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-	}
-
-	// Navigate yo 'Connect to Database' page
-	public function navigateConnetToDatabasePage() {
-		$this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-		// 'Welcome to MediaWiki!' page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// 'Connect to Database' page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-	}
-
-	// Navigate to the 'Database Settings' page
-	public function navigateDatabaseSettingsPage( $databaseName ) {
-		$this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-		// 'Welcome to MediaWiki!' page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// 'Connect to Database' page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		$this->type( "mysql_wgDBname", $databaseName );
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-	}
-
-	// Navigate to the 'Name' page
-	public function navigateNamePage( $databaseName ) {
-		$this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-		// 'Welcome to MediaWiki!' page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// 'Connect to Database' page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		$this->type( "mysql_wgDBname", $databaseName );
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// Database settings
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-	}
-
-	// Navigate 'Options' page
-	public function navigateOptionsPage( $databaseName ) {
-		$this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-		// 'Welcome to MediaWiki!' page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// 'Connect to Database' page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		$this->type( "mysql_wgDBname", $databaseName );
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// Database settings
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// Name
-		$this->type( "config_wgSitename", NAME_OF_WIKI );
-		$this->type( "config__AdminName", ADMIN_USER_NAME );
-		$this->type( "config__AdminPassword", ADMIN_PASSWORD );
-		$this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
-		$this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
-
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-	}
-
-	// Navigate 'Install' page
-	public function navigateInstallPage( $databaseName ) {
-		$this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-		// 'Welcome to MediaWiki!' page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// 'Connect to Database' page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		$this->type( "mysql_wgDBname", $databaseName );
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// Database settings
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// Name
-		$this->type( "config_wgSitename", NAME_OF_WIKI );
-		$this->type( "config__AdminName", ADMIN_USER_NAME );
-		$this->type( "config__AdminPassword", ADMIN_PASSWORD );
-		$this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
-		$this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
-
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// Options page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-	}
-
-	// Navigate to 'Complete' page
-	public function navigateCompletePage( $databaseName ) {
-		$this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-		// 'Welcome to MediaWiki!' page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// 'Connect to Database' page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		$this->type( "mysql_wgDBname", $databaseName );
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// Database settings
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// Name
-		$this->type( "config_wgSitename", NAME_OF_WIKI );
-		$this->type( "config__AdminName", ADMIN_USER_NAME );
-		$this->type( "config__AdminPassword", ADMIN_PASSWORD );
-		$this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
-		$this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
-
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// Options page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// Install page
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-		$this->chooseCancelOnNextConfirmation();
-	}
-
-	// Complete the Name page fields
-	public function completeNamePage() {
-		$this->type( "config_wgSitename", NAME_OF_WIKI );
-		$this->type( "config__AdminName", ADMIN_USER_NAME );
-		$this->type( "config__AdminPassword", ADMIN_PASSWORD );
-		$this->type( "config__AdminPassword2", ADMIN_RETYPE_PASSWORD );
-		$this->type( "config__AdminEmail", ADMIN_EMAIL_ADDRESS );
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-	}
-
-	// Clicking on the 'Continue' button in any MediaWiki page
-	public function clickContinueButton() {
-		$this->click( "submit-continue" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-	}
-
-	// Clicking on the 'Back' button in any MediaWiki page
-	public function clickBackButton() {
-		$this->click( "submit-back" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-	}
-
-	// Restarting the installation
-	public function restartInstallation() {
-		$this->click( "link=Restart installation" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-		$this->click( "submit-restart" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-	}
-
-	// Verify 'MediaWiki' logo available in the initial screen
-	public function mediaWikiLogoPresentInitialScreen() {
-		$this->assertTrue( $this->isElementPresent( "//img[@alt='The MediaWiki logo']" ) );
-	}
-
-	// Verify 'MediaWiki' logo available
-	public function mediaWikiLogoPresent() {
-		$this->assertTrue( $this->isElementPresent( "//div[@id='p-logo']/a" ) );
-	}
-
-	public function completePageSuccessfull() {
-		$this->assertEquals( "Complete!",
-			$this->getText( "//div[@id='bodyContent']/div/div/h2" ) );
-
-		// 'Congratulations!' text should be available in the 'Complete!' page.
-		$this->assertEquals( "Congratulations!",
-			$this->getText( "//div[@id='bodyContent']/div/div/div[2]/form/div[1]/div[2]/p[1]/b" ) );
-	}
-}
diff --git a/tests/selenium/installer/MediaWikiInstallationConfig.php b/tests/selenium/installer/MediaWikiInstallationConfig.php
deleted file mode 100644
index 86a46247..00000000
--- a/tests/selenium/installer/MediaWikiInstallationConfig.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
- * MediaWikiInstallationConfig
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-/**
- * MediaWikiInstallerTestSuite.php can be run one time successfully
- * with current value of the 'DB_NAME_PREFIX'.
- * If you wish to run the suite more than one time, you need to change
- * the value of the 'DB_NAME_PREFIX'.
- */
-define( 'DB_NAME_PREFIX', "database_name" );
-define( 'DIRECTORY_NAME', "mediawiki" );
-define( 'PORT', "8080" );
-define( 'HOST_NAME', "localhost" );
-
-/**
- *  Use the followings to run the test suite in different browsers.
- *  Firefox : *firefox
- *  IE :  *iexplore
- *  Google chrome : *googlechrome
- *  Opera :  *opera
- */
-define ( 'TEST_BROWSER', "*firefox" );
diff --git a/tests/selenium/installer/MediaWikiInstallationMessage.php b/tests/selenium/installer/MediaWikiInstallationMessage.php
deleted file mode 100644
index 2b7d48ef..00000000
--- a/tests/selenium/installer/MediaWikiInstallationMessage.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * MediaWikiInstallationConfig
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-// 'MySQL' database type help field hint
-define( 'MYSQL_DATABASE_HOST_HELP', "If your database server is on different server, enter the host name or IP address here. \nIf you are using shared web hosting, your hosting provider should give you the correct host name in their documentation. \nIf you are installing on a Windows server and using MySQL, using \"localhost\" may not work for the server name. If it does not, try \"127.0.0.1\" for the local IP address." );
-define( 'MYSQL_DATABASE_NAME_HELP', "Choose a name that identifies your wiki. It should not contain spaces or hyphens. \nIf you are using shared web hosting, your hosting provider will either give you a specific database name to use or let you create databases via a control panel." );
-define( 'MYSQL_DATABASE_TABLE_PREFIX_HELP', "Choose a name that identifies your wiki. It should not contain spaces or hyphens." );
-define( 'MYSQL_DATBASE_USERNAME_HELP', "Enter the username that will be used to connect to the database during the installation process. This is not the username of the MediaWiki account; this is the username for your database." );
-define( 'MYSQL_DATABASE_PASSWORD_HELP', "Enter the password that will be used to connect to the database during the installation process. This is not the password for the MediaWiki account; this is the password for your database." );
-
-
-// 'SQLite' database type help field hint
-define( 'SQLITE_DATA_DIRECTORY_HELP', "SQLite stores all data in a single file. \nThe directory you provide must be writable by the webserver during installation. \nIt should not be accessible via the web, this is why we're not putting it where your PHP files are. \nThe installer will write a .htaccess file along with it, but if that fails someone can gain access to your raw database. That includes raw user data (e-mail addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki. \nConsider putting the database somewhere else altogether, for example in /var/lib/mediawiki/yourwiki." );
-define( 'SQLITE_DATABASE_NAME_HELP', "Choose a name that identifies your wiki. Do not use spaces or hyphens. This will be used for the SQLite data file name." );
-
-
-// 'Database settings' page hel0p field hint
-define( 'SEARCH_ENGINE_HELP', "InnoDB is almost always the best option, since it has good concurrency support. \nMyISAM may be faster in single-user or read-only installations. MyISAM databases tend to get corrupted more often than InnoDB databases." );
-define( 'DATABASE_CHARACTER_SET_HELP', "In binary mode, MediaWiki stores UTF-8 text to the database in binary fields. This is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters. \nIn UTF-8 mode, MySQL will know what character set your data is in, and can present and convert it appropriately, but it will not let you store characters above the Basic Multilingual Plane." );
-
-
-// 'Name' page help field hint
-define( 'NAME_OF_WIKI_HELP', "This will appear in the title bar of the browser and in various other places." );
-define( 'PROJECT_NAMESPACE_HELP', "Following Wikipedia's example, many wikis keep their policy pages separate from their content pages, in a \"project namespace\". All page titles in this namespace start with a certain prefix, which you can specify here. Traditionally, this prefix is derived from the name of the wiki, but it cannot contain punctuation characters such as \"#\" or \":\"." );
-define( 'USER_NAME_HELP', "Enter your preferred username here, for example \"Joe Bloggs\". This is the name you will use to log in to the wiki." );
-define( 'EMAIL_ADDRESS_HELP', "Enter an e-mail address here to allow you to receive e-mail from other users on the wiki, reset your password, and be notified of changes to pages on your watchlist." );
-define( 'SUBSCRIBE_MAILING_LIST_HELP', "This is a low-volume mailing list used for release announcements, including important security announcements. You should subscribe to it and update your MediaWiki installation when new versions come out." );
-
-
-
diff --git a/tests/selenium/installer/MediaWikiInstallationVariables.php b/tests/selenium/installer/MediaWikiInstallationVariables.php
deleted file mode 100644
index 3d7996be..00000000
--- a/tests/selenium/installer/MediaWikiInstallationVariables.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * MediaWikiInstallationConfig
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-// Common variables
-define( 'PAGE_LOAD_TIME', "80000" );
-
-// Common links
-define( 'LINK_DIV', "//div[@id='bodyContent']/div/div/" );
-define( 'LINK_FORM', "//div[@id='bodyContent']/div/div/div[2]/form/" );
-define( 'LINK_RIGHT_FRAMEWORK', "//div[@id='bodyContent']/div/div/div[1]/ul[1]/" );
-
-// 'Name' page input values
-define( 'NAME_OF_WIKI', "Site Name" );
-define( 'ADMIN_USER_NAME', "My Name" );
-define( 'ADMIN_PASSWORD', "12345" );
-define ( 'ADMIN_RETYPE_PASSWORD', "12345" );
-define ( 'ADMIN_EMAIL_ADDRESS', "admin@example.com" );
-
-
-// 'Name' page input values for warning messages
-define( 'VALID_WIKI_NAME', "MyWiki" );
-define( 'VALID_YOUR_NAME', "FirstName LastName" );
-define( 'VALID_PASSWORD', "12345" );
-define( 'VALID_PASSWORD_AGAIN', "12345" );
-define( 'INVALID_PASSWORD_AGAIN', "123" );
-define( 'VALID_NAMESPACE', "Mynamespace" );
-define( 'INVALID_NAMESPACE', "##..##" );
-
-
-// 'Database settings' page input values
-define( 'DB_WEB_USER', "different" );
-define( 'DB_WEB_USER_PASSWORD', "12345" );
-
-
-// 'Connet to database' page input values
-define( 'DATABASE_PREFIX', "databaseprefix" );
-
-
-// 'Connet to database' page input values for warning messages
-define( 'VALID_DB_HOST', "localhost" );
-define( 'INVALID_DB_HOST', "local" );
-define( 'INVALID_DB_NAME', "my-wiki" );
-define( 'VALID_DB_NAME', "my_wiki1" );
-define( 'INVALID_DB_PREFIX', "database prefix" );
-define( 'VALID_DB_PREFIX', "database_prefix" );
-define( 'INVALID_DB_USER_NAME', "roots" );
-define( 'VALID_DB_USER_NAME', "root" );
-define( 'INVALID_DB_PASSWORD', "12345" );
-
-
diff --git a/tests/selenium/installer/MediaWikiInstallerTestSuite.php b/tests/selenium/installer/MediaWikiInstallerTestSuite.php
deleted file mode 100644
index 6946cc75..00000000
--- a/tests/selenium/installer/MediaWikiInstallerTestSuite.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/**
- * MediaWikiInstallerTestSuite
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-if ( PHP_SAPI != 'cli' ) {
-	die( "Run me from the command line please.\n" );
-}
-
-require_once 'PHPUnit/Framework/TestSuite.php';
-
-require_once ( __DIR__ . '/MediaWikiUserInterfaceTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiButtonsAvailabilityTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiHelpFieldHintTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiRightFrameworkLinksTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiRestartInstallationTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiErrorsConnectToDatabasePageTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiErrorsNamepageTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiMySQLDataBaseTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiMySQLiteDataBaseTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiUpgradeExistingDatabaseTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiDifferntDatabasePrefixTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiDifferentDatabaseAccountTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiOnAlreadyInstalledTestCase.php' );
-
-$suite = new PHPUnit_Framework_TestSuite( 'ArrayTest' );
-$result = new PHPUnit_Framework_TestResult;
-
-$suite->run( $result );
diff --git a/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php b/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php
deleted file mode 100644
index 92f26d05..00000000
--- a/tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/**
- * MediaWikiOnAlreadyInstalledTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 01 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install Mediawiki using 'MySQL' database type successfully
- * Version        : MediaWiki 1.18alpha
- */
-
-class MediaWikiMySQLDataBaseTestCase extends MediaWikiInstallationCommonFunction {
-	function setUp() {
-		parent::setUp();
-	}
-
-	// Verify  MediaWiki installation using 'MySQL' database type
-	public function testMySQLDatabaseSuccess() {
-		$databaseName = DB_NAME_PREFIX . "_sql_db";
-
-		parent::navigateConnetToDatabasePage();
-
-		// Verify 'MySQL" is selected as the default database type
-		$this->assertEquals( "MySQL settings", $this->getText( "//div[@id='DB_wrapper_mysql']/h3" ) );
-
-		// Change 'Database name'
-		$defaultDbName = $this->getText( "mysql_wgDBname" );
-		$this->type( "mysql_wgDBname", " " );
-		$this->type( "mysql_wgDBname", $databaseName );
-		$this->assertNotEquals( $defaultDbName, $databaseName );
-
-		// 'Database settings' page
-		parent::clickContinueButton();
-
-		// 'Name' page
-		parent::clickContinueButton();
-		parent::completeNamePage();
-
-		// 'Options page
-		parent::clickContinueButton();
-
-		// 'Install' page
-		parent::clickContinueButton();
-
-		// 'Complete' page
-		parent::completePageSuccessfull();
-		parent::restartInstallation();
-	}
-}
diff --git a/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php b/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php
deleted file mode 100644
index e9be3704..00000000
--- a/tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * MediaWikiMySQLiteataBaseTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 06 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install Mediawiki using 'MySQL' database type successfully
- * Version        : MediaWiki 1.18alpha
- */
-
-class MediaWikiMySQLiteDataBaseTestCase extends MediaWikiInstallationCommonFunction {
-	function setUp() {
-		parent::setUp();
-	}
-
-	// Verify  MediaWiki installation using 'MySQL' database type
-	public function testMySQLDatabaseSuccess() {
-		$databaseName = DB_NAME_PREFIX . "_sqlite_db";
-
-		parent::navigateConnetToDatabasePage();
-		$this->click( "DBType_sqlite" );
-
-		// Select 'SQLite' database type
-		$this->assertEquals( "SQLite settings", $this->getText( "//div[@id='DB_wrapper_sqlite']/h3" ) );
-
-		// Change database name
-		$defaultDbName = $this->getText( "sqlite_wgDBname" );
-		$this->type( "sqlite_wgDBname", " " );
-		$this->type( "sqlite_wgDBname", $databaseName );
-		$this->assertNotEquals( $defaultDbName, $databaseName );
-
-		// 'Database settings' page
-		parent::clickContinueButton();
-
-		// 'Name' page
-		parent::clickContinueButton();
-		parent::completeNamePage();
-
-		// 'Options page
-		parent::clickContinueButton();
-
-		// 'Install' page
-		parent::clickContinueButton();
-
-		// 'Complete' page
-		parent::completePageSuccessfull();
-		parent::restartInstallation();
-	}
-}
diff --git a/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php b/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php
deleted file mode 100644
index ce27500b..00000000
--- a/tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-
-/**
- * Test Case ID   : 03 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install mediawiki on a already installed Mediawiki.]
- * Version        : MediaWiki 1.18alpha
- */
-
-class MediaWikiOnAlreadyInstalledTestCase extends MediaWikiInstallationCommonFunction {
-	function setUp() {
-		parent::setUp();
-	}
-
-	// Install Mediawiki using 'MySQL' database type.
-	public function testInstallOnAlreadyInstalled() {
-		$databaseName = DB_NAME_PREFIX . "_already_installed";
-		parent::navigateInstallPage( $databaseName );
-
-		// 'Options' page
-		parent::clickBackButton();
-
-		// Install page
-		parent::clickContinueButton();
-
-		// 'Install' page should display after the 'Option' page
-		$this->assertEquals( "Install", $this->getText( LINK_DIV . "h2" ) );
-
-		// Verify warning text displayed
-		$this->assertEquals( "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
-			$this->getText( LINK_FORM . "div[1]/div[2]" ) );
-
-		// Complete page
-		parent::clickContinueButton();
-		parent::completePageSuccessfull();
-		$this->chooseCancelOnNextConfirmation();
-		parent::restartInstallation();
-	}
-}
diff --git a/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php b/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php
deleted file mode 100644
index f34210cb..00000000
--- a/tests/selenium/installer/MediaWikiRestartInstallationTestCase.php
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-/**
- * MediaWikiRestartInstallationTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 11, 12 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install mediawiki on a already installed Mediawiki.
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiRestartInstallationTestCase extends MediaWikiInstallationCommonFunction {
-	function setUp() {
-		parent::setUp();
-	}
-
-	// Verify restarting the installation
-	public function testSuccessRestartInstallation() {
-		$dbNameBeforeRestart = DB_NAME_PREFIX . "_db_before";
-		parent::navigateDatabaseSettingsPage( $dbNameBeforeRestart );
-
-		// Verify 'Restart installation' link available
-		$this->assertTrue( $this->isElementPresent( "link=Restart installation" ) );
-
-		// Click 'Restart installation'
-		$this->click( "link=Restart installation " );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// 'Restart Installation' page displayed
-		$this->assertEquals( "Restart installation", $this->getText( LINK_DIV . "h2" ) );
-
-		// Restart warning message displayed
-		$this->assertTrue( $this->isTextPresent( "exact:Do you want to clear all saved data that you have entered and restart the installation process?" ) );
-
-		// Click on the 'Yes, restart' button
-		$this->click( "submit-restart" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// Navigate to the initial installation page(Language).
-		$this->assertEquals( "Language", $this->getText( LINK_DIV . "h2" ) );
-
-		// 'Welcome to MediaWiki!' page
-		parent::clickContinueButton();
-
-		// 'Connect to database' page
-		parent::clickContinueButton();
-
-		// saved data should be deleted
-		$dbNameAfterRestart = $this->getValue( "mysql_wgDBname" );
-		$this->assertNotEquals( $dbNameBeforeRestart, $dbNameAfterRestart );
-	}
-
-	// Verify cancelling restart
-	public function testCancelRestartInstallation() {
-		$dbNameBeforeRestart = DB_NAME_PREFIX . "_cancel_restart";
-
-		parent::navigateDatabaseSettingsPage( $dbNameBeforeRestart );
-		// Verify 'Restart installation' link available
-		$this->assertTrue( $this->isElementPresent( "link=Restart installation" ) );
-
-		$this->click( "link=Restart installation" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// 'Restart Installation' page displayed
-		$this->assertEquals( "Restart installation", $this->getText( LINK_DIV . "h2" ) );
-
-		// Restart warning message displayed
-		$this->assertTrue( $this->isTextPresent( "Do you want to clear all saved data that you have entered and restart the installation process?" ) );
-
-		// Click on the 'Back' button
-		parent::clickBackButton();
-
-		// Navigates to the previous page
-		$this->assertEquals( "Database settings", $this->getText( LINK_DIV . "h2" ) );
-
-		// 'Connect to database' page
-		parent::clickBackButton();
-
-		// Saved data remain on the page.
-		$dbNameAfterRestart = $this->getValue( "mysql_wgDBname" );
-		$this->assertEquals( $dbNameBeforeRestart, $dbNameAfterRestart );
-	}
-}
diff --git a/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php b/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php
deleted file mode 100644
index 039d71a4..00000000
--- a/tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-/**
- * MediaWikiRightFrameworkLinksTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 14, 15, 16, 17 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : User selects 'Read me' link.
- *                  User selects 'Release notes' link.
- *                  User selects 'Copying' link.
- *                  User selects 'Upgrading' link.
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiRightFrameworkLinksTestCase extends MediaWikiInstallationCommonFunction {
-	function setUp() {
-		parent::setUp();
-	}
-
-	public function testLinksAvailability() {
-		$this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-		// Verify 'Read me' link availability
-		$this->assertTrue( $this->isElementPresent( "link=Read me" ) );
-
-		// Verify 'Release notes' link availability
-		$this->assertTrue( $this->isElementPresent( "link=Release notes" ) );
-
-		//  Verify 'Copying' link availability
-		$this->assertTrue( $this->isElementPresent( "link=Copying" ) );
-	}
-
-	public function testPageNavigation() {
-		$this->open( "http://" . HOST_NAME . ":" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-
-		// Navigate to the 'Read me' page
-		$this->click( "link=Read me" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-		$this->assertEquals( "Read me", $this->getText( LINK_DIV . "h2[1]" ) );
-		$this->assertTrue( $this->isElementPresent( "submit-back" ) );
-		parent::clickBackButton();
-
-		// Navigate to the 'Release notes' page
-		$this->click( "link=Release notes" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-		$this->assertEquals( "Release notes", $this->getText( LINK_DIV . "h2[1]" ) );
-		$this->assertTrue( $this->isElementPresent( "submit-back" ) );
-		parent::clickBackButton();
-
-		// Navigate to the 'Copying' page
-		$this->click( "link=Copying" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-		$this->assertEquals( "Copying", $this->getText( LINK_DIV . "h2[1]" ) );
-		$this->assertTrue( $this->isElementPresent( "submit-back" ) );
-		parent::clickBackButton();
-
-		// Navigate to the 'Upgrading' page
-		$this->click( "link=Upgrading" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-		$this->assertEquals( "Upgrading", $this->getText( LINK_DIV . "h2[1]" ) );
-	}
-}
diff --git a/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php b/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php
deleted file mode 100644
index cd901d18..00000000
--- a/tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/**
- * MediaWikiUpgradeExistingDatabaseTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 05 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : Install Mediawiki by updating the existing database.
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiUpgradeExistingDatabaseTestCase extends MediaWikiInstallationCommonFunction {
-	function setUp() {
-		parent::setUp();
-	}
-
-	// Install Mediawiki using 'MySQL' database type.
-	public function testUpgradeExistingDatabase() {
-
-		$databaseName = DB_NAME_PREFIX . "_upgrade_existing";
-		parent::navigateInstallPage( $databaseName );
-
-		$this->open( "http://localhost:" . PORT . "/" . DIRECTORY_NAME . "/config/index.php" );
-		$this->assertEquals( "Install", $this->getText( LINK_DIV . "h2" ) );
-		$this->assertEquals(
-			"Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
-			$this->getText( LINK_DIV . "div[2]/form/div[1]/div[2]" )
-		);
-
-		// 'Optionis' page
-		parent::clickBackButton();
-
-		// 'Name' page
-		parent::clickBackButton();
-
-		// 'Database settings' page
-		parent::clickBackButton();
-
-		// 'Connect to database' page
-		parent::clickBackButton();
-		$this->type( "mysql_wgDBname", $databaseName );
-		parent::clickContinueButton();
-
-		// 'Upgrade existing installation' page  displayed next to the 'Connect to database' page.
-		$this->assertEquals( "Upgrade existing installation", $this->getText( LINK_DIV . "h2" ) );
-
-		// Warning message displayed.
-		$this->assertEquals( "There are MediaWiki tables in this database. To upgrade them to MediaWiki 1.18alpha, click Continue.",
-			$this->getText( LINK_DIV . "div[2]/form/div[1]/div[2]" ) );
-
-		parent::clickContinueButton();
-		$this->assertEquals( "Upgrade existing installation",
-			$this->getText( LINK_DIV . "h2" ) );
-
-		// 'Upgrade complete.' text display
-		$this->assertEquals( "Upgrade complete.",
-			$this->getText( "//div[@id='bodyContent']/div/div[1]/div[4]/form/div[1]/div[2]/p[1]" ) );
-
-		$this->assertEquals( "You can now Folder/index.php start using your wiki.",
-			$this->getText( "//div[@id='bodyContent']/div/div[1]/div[4]/form/div[1]/div[2]/p[2]" ) );
-
-		$this->assertEquals( "Folder/index.php start using your wiki",
-			$this->getText( "link=Folder/index.php start using your wiki" ) );
-
-		$this->assertTrue( $this->isElementPresent( "submit-regenerate" ) );
-		$this->click( "submit-regenerate" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-		$this->assertEquals( "Database settings",
-			$this->getText( LINK_DIV . "h2" ) );
-
-		// 'Database settings' page
-		parent::clickContinueButton();
-
-		// Name page
-		parent::completeNamePage();
-
-		// Options page
-		parent::clickContinueButton();
-
-		// Install page
-		$this->assertEquals( "Warning: You seem to have already installed MediaWiki and are trying to install it again. Please proceed to the next page.",
-			$this->getText( LINK_FORM . "div[1]/div[2]" ) );
-		parent::clickContinueButton();
-
-		// complete
-		parent::completePageSuccessfull();
-		$this->chooseCancelOnNextConfirmation();
-		parent::restartInstallation();
-	}
-}
diff --git a/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php b/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php
deleted file mode 100644
index 97331523..00000000
--- a/tests/selenium/installer/MediaWikiUserInterfaceTestCase.php
+++ /dev/null
@@ -1,494 +0,0 @@
-<?php
-/**
- * MediaWikiUserInterfaceTestCase
- *
- * @file
- * @ingroup Maintenance
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
-
-/**
- * Test Case ID   : 18 - 27 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
- * Test Case Name : UI of MediaWiki initial/ Language/ Welcome to MediaWiki!/ Connect to database/
- * Database settings/ Name/ Options/ Install/ Complete/ Restart Inslation pages
- * Version        : MediaWiki 1.18alpha
- */
-class MediaWikiUserInterfaceTestCase extends MediaWikiInstallationCommonFunction {
-	function setUp() {
-		parent::setUp();
-	}
-
-	public function testInitialPageUI() {
-
-		parent::navigateInitialpage();
-
-		// MediaWiki logo available
-		$this->assertTrue( $this->isElementPresent( "//img[@alt='The MediaWiki logo']" ) );
-
-		// 'MediaWiki 1.18alpha' text available
-		$this->assertEquals( "MediaWiki 1.18alpha", $this->getText( "//h1" ) );
-
-		// 'LocalSettings.php not found.' text available
-		$this->assertEquals( "LocalSettings.php not found.", $this->getText( "//p[1]" ) );
-
-		// 'Please set up the wiki first' text available
-		$this->assertEquals( "Please set up the wiki first.", $this->getText( "//p[2]" ) );
-
-		// 'set up the wiki' link available
-		$this->assertTrue( $this->isElementPresent( "link=set up the wiki" ) );
-	}
-
-	public function testlanguagePageUI() {
-		parent::navigateLanguagePage();
-
-		// Verify 'Language' heading
-		$this->assertEquals( "Language", $this->getText( LINK_DIV . "h2" ) );
-
-		// 'Your language' label available
-		$this->assertEquals( "Your language:",
-			$this->getText( LINK_FORM . "div[1]/div[1]/label" ) );
-
-		// 'Your language' dropdown available
-		$this->assertTrue( $this->isElementPresent( "UserLang" ) );
-
-		// 'Wiki language' label available
-		$this->assertEquals( "Wiki language:",
-			$this->getText( LINK_FORM . "div[2]/div[1]/label" ) );
-
-		// 'Wiki language' dropdown available
-		$this->assertTrue( $this->isElementPresent( "ContLang" ) );
-	}
-
-	public function testWelcometoMediaWikiUI() {
-		parent::navigateWelcometoMediaWikiPage();
-
-		// Verify 'Welcome to MediaWiki!' heading
-		$this->assertEquals( "Welcome to MediaWiki!",
-			$this->getText( LINK_DIV . "h2" ) );
-
-		// Verify environment ok text displayed.
-		$this->assertEquals( "The environment has been checked.You can install MediaWiki.",
-			$this->getText( LINK_DIV . "div[6]/span" ) );
-	}
-
-	public function testConnectToDatabaseUI() {
-		parent::navigateConnetToDatabasePage();
-
-		//  'MYSQL radio button available
-		$this->assertEquals( "MySQL",
-			$this->getText( LINK_FORM . "div[2]/div[2]/ul/li[1]/label" ) );
-		$this->assertTrue( $this->isElementPresent( LINK_FORM . "div[2]/div[2]/ul/li[1]" ) );
-
-		// 'SQLite' radio button available
-		$this->assertTrue( $this->isElementPresent( LINK_FORM . "div[2]/div[2]/ul/li[2]" ) );
-		$this->assertEquals( "SQLite", $this->getText( LINK_FORM . "div[2]/div[2]/ul/li[2]/label " ) );
-
-		// 'Database host' label available
-		$this->assertEquals( "Database host:", $this->getText( "//div[@id='DB_wrapper_mysql']/div/div[1]/label" ) );
-
-		// 'Database host' text box default to 'localhost'
-		$this->assertEquals( "localhost", $this->getValue( "mysql_wgDBserver" ) );
-
-		// 'Identify this wiki' section available
-		$this->assertTrue( $this->isElementPresent( "//div[@id='DB_wrapper_mysql']/fieldset[1]/legend" ) );
-
-		// 'Identify this wiki' label available
-		$this->assertEquals( "Identify this wiki", $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/legend" ) );
-
-		// 'Database name' lable available
-		$this->assertEquals( "Database name:",
-			$this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[1]/div[1]/label" ) );
-
-		// Verify 'Database name:' text box is default to 'my_wiki'
-		$this->assertEquals( "my_wiki", $this->getValue( "mysql_wgDBname" ) );
-
-		// Verify 'Database table prefix:' label available
-		$this->assertEquals( "Database table prefix:",
-			$this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[1]/div[2]/div[1]/label" ) );
-
-		// 'User account for installation' section available
-		$this->assertTrue( $this->isElementPresent( "//div[@id='DB_wrapper_mysql']/fieldset[2]/legend" ) );
-
-		// 'User account for installation' label available
-		$this->assertEquals( "User account for installation", $this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/legend" ) );
-
-		// 'Database username' label available
-		$this->assertEquals( "Database username:",
-			$this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[1]/div[1]/label" ) );
-
-		// 'Database username' text box defaults to 'root'
-		$this->assertEquals( "root", $this->getValue( "mysql__InstallUser" ) );
-
-		// 'Database password' label available
-		$this->assertEquals( "Database password:",
-			$this->getText( "//div[@id='DB_wrapper_mysql']/fieldset[2]/div[2]/div[1]/label" ) );
-	}
-
-	public function testDatabaseSettingsUI() {
-		$databaseName = DB_NAME_PREFIX . "_db_settings_UI";
-		parent::navigateDatabaseSettingsPage( $databaseName );
-
-		// 'Database settings' text available.
-		$this->assertEquals( "Database settings", $this->getText( LINK_DIV . "h2" ) );
-
-		// 'Database account for web access' section available
-		$this->assertTrue( $this->isElementPresent( LINK_FORM . "fieldset" ) );
-
-		// 'Database account for web access' label available
-		$this->assertEquals( "Database account for web access", $this->getText( LINK_FORM . "fieldset/legend" ) );
-
-		// 'Use the same account as for installation' check box available
-		$this->assertEquals( "Use the same account as for installation", $this->getText( LINK_FORM . "fieldset/div[1]/label" ) );
-
-		// 'Use the same account as for installation' check box is selected by default
-		$this->assertEquals( "on", $this->getValue( "mysql__SameAccount" ) );
-
-		// 'Use the same account as for installation' check box deselected
-		$this->click( "mysql__SameAccount" );
-
-		// verify 'Use the same account as for installation' check box is not selected
-		$this->assertEquals( "off", $this->getValue( "mysql__SameAccount" ) );
-
-		// 'Database username' label available
-		$this->assertEquals( "Database username:", $this->getText( "//div[@id='dbOtherAccount']/div[1]/div[1]/label" ) );
-
-		// 'Database username' text box is default to the 'wikiuser'
-		$this->assertEquals( "wikiuser", $this->getValue( "mysql_wgDBuser" ) );
-
-		// 'Database password' label available
-		$this->assertEquals( "Database password:", $this->getText( "//div[@id='dbOtherAccount']/div[2]/div[1]/label" ) );
-
-		// 'Create the account if it does not already exist' label available
-		$this->assertEquals( "Create the account if it does not already exist", $this->getText( "//div[@id='dbOtherAccount']/div[4]/label" ) );
-
-		// 'Create the account if it does not already exist' check box is not selected by default
-		$this->assertEquals( "off", $this->getValue( "mysql__CreateDBAccount" ) );
-
-		//  'Create the account if it does not already exist' check box selected
-		$this->click( "mysql__CreateDBAccount" );
-
-		// Verify  'Create the account if it does not already exist' check box is selected
-		$this->assertEquals( "on", $this->getValue( "mysql__CreateDBAccount" ) );
-		$this->click( "mysql__SameAccount" );
-		$this->assertEquals( "on", $this->getValue( "mysql__SameAccount" ) );
-
-		// 'Storage engine' label available
-		$this->assertEquals( "Storage engine:",
-			$this->getText( LINK_FORM . "div[1]/div[1]/label" ) );
-
-		// 'InnoDB' label available
-		$this->assertEquals( "InnoDB",
-			$this->getText( LINK_FORM . "div[1]/div[2]/ul/li[1]/label" ) );
-
-		// 'InnoDB' radio button available
-		$this->assertTrue( $this->isElementPresent( "mysql__MysqlEngine_InnoDB" ) );
-
-		// 'MyISAM' label available
-		$this->assertEquals( "MyISAM", $this->getText( LINK_FORM . "div[1]/div[2]/ul/li[2]/label" ) );
-
-		// 'MyISAM' radio button available
-		$this->assertTrue( $this->isElementPresent( "mysql__MysqlEngine_MyISAM" ) );
-
-		// 'Database character set' label available
-		$this->assertEquals( "Database character set:",
-			$this->getText( LINK_FORM . "div[3]/div[1]/label" ) );
-
-		// 'Binary' radio button available
-		$this->assertTrue( $this->isElementPresent( "mysql__MysqlCharset_binary" ) );
-
-		// 'Binary' radio button available
-		$this->assertEquals( "Binary", $this->getText( LINK_FORM . "div[3]/div[2]/ul/li[1]/label" ) );
-
-		// 'UTF-8' radio button available
-		$this->assertTrue( $this->isElementPresent( "mysql__MysqlCharset_utf8" ) );
-
-		// 'UTF-8' label available
-		$this->assertEquals( "UTF-8", $this->getText( LINK_FORM . "div[3]/div[2]/ul/li[2]/label" ) );
-
-		// 'Binary' radio button is selected
-		$this->assertEquals( "on", $this->getValue( "mysql__MysqlCharset_binary" ) );
-	}
-
-	public function testNamePageUI() {
-		$databaseName = DB_NAME_PREFIX . "_name_UI";
-		parent::navigateNamePage( $databaseName );
-
-		// 'Name of wiki' text box available
-		$this->assertEquals( "Name of wiki:",
-			$this->getText( LINK_FORM . "div[1]/div[1]/label" ) );
-
-		$this->assertTrue( $this->isElementPresent( "config_wgSitename" ) );
-
-		// 'Project namespace' label available
-		$this->assertEquals( "Project namespace:",
-			$this->getText( LINK_FORM . "div[2]/div[1]/label" ) );
-
-		// 'Same as the wiki name' radio button available
-		$this->assertTrue( $this->isElementPresent( "config__NamespaceType_site-name" ) );
-
-		// 'Project' radio button available
-		$this->assertTrue( $this->isElementPresent( "config__NamespaceType_generic" ) );
-
-		// 'Project' radio button available
-		$this->assertTrue( $this->isElementPresent( "config__NamespaceType_other" ) );
-
-		// 'Same as the wiki name' label available
-		$this->assertEquals( "Same as the wiki name:",
-			$this->getText( LINK_FORM . "div[2]/div[2]/ul/li[1]/label" ) );
-
-		// 'Project' label available
-		$this->assertEquals( "Project",
-			$this->getText( LINK_FORM . "div[2]/div[2]/ul/li[2]/label" ) );
-
-		// 'Project' label available
-		$this->assertEquals( "Other (specify)",
-			$this->getText( LINK_FORM . "div[2]/div[2]/ul/li[3]/label" ) );
-
-		//  'Same as the wiki name' radio button selected by default
-		$this->assertEquals( "on", $this->getValue( "config__NamespaceType_site-name" ) );
-
-		// 'Administrator account' section available
-		$this->assertTrue( $this->isElementPresent( LINK_FORM . "fieldset" ) );
-
-		// 'Administrator account' label available
-		$this->assertEquals( "Administrator account",
-			$this->getText( LINK_FORM . "fieldset/legend" ) );
-
-		// 'Your Name' label available
-		$this->assertEquals( "Your name:",
-			$this->getText( LINK_FORM . "fieldset/div[1]/div[1]/label" ) );
-
-		// 'Your Name' text box available
-		$this->assertTrue( $this->isElementPresent( "config__AdminName" ) );
-
-		// 'Password' label available
-		$this->assertEquals( "Password:",
-			$this->getText( LINK_FORM . "fieldset/div[2]/div[1]/label" ) );
-
-		// 'Password' text box available
-		$this->assertTrue( $this->isElementPresent( "config__AdminPassword" ) );
-
-		// 'Password again' label available
-		$this->assertEquals( "Password again:",
-			$this->getText( LINK_FORM . "fieldset/div[3]/div[1]/label" ) );
-
-		// 'Password again' text box available
-		$this->assertTrue( $this->isElementPresent( "config__AdminPassword2" ) );
-
-		// 'Email address' label avaialble
-		$this->assertEquals( "E-mail address:",
-			$this->getText( LINK_FORM . "fieldset/div[4]/div[1]/label" ) );
-
-		// 'Email address' text box available
-		$this->assertTrue( $this->isElementPresent( "config__AdminEmail" ) );
-
-		// Message displayed
-		$this->assertEquals( "You are almost done! You can now skip the remaining configuration and install the wiki right now.",
-			$this->getText( LINK_FORM . "/div[4]/div[2]/p" ) );
-
-		// 'Ask me more questions.' radio button available
-		$this->assertTrue( $this->isElementPresent( "config__SkipOptional_continue" ) );
-
-		// 'Ask me more questions.' label available
-		$this->assertEquals( "Ask me more questions.",
-			$this->getText( LINK_FORM . "div[5]/div[2]/ul/li[1]/label" ) );
-
-		// 'I'm bored already, just install the wiki' radio button is avaiable
-		$this->assertTrue( $this->isElementPresent( "config__SkipOptional_skip" ) );
-
-		// 'I'm bored already, just install the wiki' label available
-		$this->assertEquals( "I'm bored already, just install the wiki.",
-			$this->getText( LINK_FORM . "div[5]/div[2]/ul/li[2]/label" ) );
-
-		//  'Ask me more questions.' radio button is default selected
-		$this->assertEquals( "on", $this->getValue( "config__SkipOptional_continue" ) );
-	}
-
-	public function testOptionPageUI() {
-		$databaseName = DB_NAME_PREFIX . "_options_UI";
-		parent::navigateOptionsPage( $databaseName );
-
-		// 'Options' label available
-		$this->assertEquals( "Options", $this->getText( LINK_DIV . "h2" ) );
-
-		// 'Return e-mail address' label available
-		$this->assertEquals( "Return e-mail address:", $this->getText( "//div[@id='emailwrapper']/div[1]/div[1]/label" ) );
-
-		//    'Return e-mail address' text box available
-		$this->assertTrue( $this->isElementPresent( "config_wgPasswordSender" ) );
-
-		// Text 'apache@localhost' is default value of the 'Return e-mail address' text box
-		$this->assertEquals( "apache@localhost", $this->getValue( "config_wgPasswordSender" ) );
-
-		// 'Logo URL' label available
-		$this->assertEquals( "Logo URL:", $this->getText( LINK_FORM . "fieldset[2]/div[3]/div[1]/label" ) );
-
-		// 'Logo URL' text box available
-		$this->assertTrue( $this->isElementPresent( "config_wgLogo" ) );
-
-		// Correct path available in the 'Logo URL' text box
-		$this->assertEquals( "/wiki/skins/common/images/wiki.png", $this->getValue( "config_wgLogo" ) );
-
-		// 'Enable file uploads' radio button available
-		$this->assertTrue( $this->isElementPresent( "config_wgEnableUploads" ) );
-
-		// 'Enable file uploads' label available
-		$this->assertEquals( "Enable file uploads",
-			$this->getText( LINK_FORM . "fieldset[2]/div[1]/label" ) );
-
-		// 'Enable file uploads' check box is not selected
-		$this->assertEquals( "off", $this->getValue( "config_wgEnableUploads" ) );
-
-		$this->click( "config_wgEnableUploads" );
-
-		// 'Directory for deleted files' label available
-		$this->assertEquals( "Directory for deleted files:",
-			$this->getText( "//div[@id='uploadwrapper']/div/div[1]/label" ) );
-
-		// 'Directory for deleted files' text box available
-		$this->assertTrue( $this->isElementPresent( "config_wgDeletedDirectory" ) );
-
-		// Correct path available in the 'Directory for deleted files' text box
-		$this->assertEquals( "C:\\wamp\\www\\" . DIRECTORY_NAME . "/images/deleted",
-			$this->getValue( "config_wgDeletedDirectory" ) );
-	}
-
-	public function testInstallPageUI() {
-		$databaseName = DB_NAME_PREFIX . "_install_UI";
-		parent::navigateInstallPage( $databaseName );
-
-		// Verify installation done messages display
-		$this->assertEquals( "Setting up database... done",
-			$this->getText( LINK_FORM . "ul/li[1]" ) );
-		$this->assertEquals( "Creating tables... done",
-			$this->getText( LINK_FORM . "ul/li[2]" ) );
-		$this->assertEquals( "Creating database user... done",
-			$this->getText( LINK_FORM . "ul/li[3]" ) );
-		$this->assertEquals( "Populating default interwiki table... done",
-			$this->getText( LINK_FORM . "ul/li[4]" ) );
-		$this->assertEquals( "Generating secret key... done",
-			$this->getText( LINK_FORM . "ul/li[5]" ) );
-		$this->assertEquals( "Generating default upgrade key... done",
-			$this->getText( LINK_FORM . "ul/li[6]" ) );
-		$this->assertEquals( "Creating administrator user account... done",
-			$this->getText( LINK_FORM . "ul/li[7]" ) );
-		$this->assertEquals( "Creating main page with default content... done",
-			$this->getText( LINK_FORM . "ul/li[8]" ) );
-	}
-
-	public function testCompletePageUI() {
-		$databaseName = DB_NAME_PREFIX . "_complete_UI";
-		parent::navigateCompletePage( $databaseName );
-
-		// 'Congratulations!' text display
-		$this->assertEquals( "Congratulations!",
-			$this->getText( LINK_FORM . "div[1]/div[2]/p[1]/b" ) );
-		// 'LocalSettings.php' generated message display
-		$this->assertEquals( "The installer has generated a LocalSettings.php file. It contains all your configuration.",
-			$this->getText( LINK_FORM . "div[1]/div[2]/p[2]" ) );
-
-		// 'Download LocalSettings.php'' link available
-		$this->assertTrue( $this->isElementPresent( "link=Download LocalSettings.php" ) );
-
-		// 'enter your wiki' link available
-		$this->assertTrue( $this->isElementPresent( "link=Folder/index.php enter your wiki" ) );
-	}
-
-	public function testRestartInstallation() {
-		parent::navigateConnetToDatabasePage();
-		$this->click( "link=Restart installation" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// Restart installation' label should be available.
-		$this->assertEquals( "Restart installation", $this->getText( LINK_DIV . "h2" ) );
-
-		//'Do you want to clear all saved data that you have entered and restart the installation process?' label available
-		$this->assertEquals( "Do you want to clear all saved data that you have entered and restart the installation process?",
-			$this->getText( "//*[@id='bodyContent']/div/div/div[2]/form/div[1]/div[2]" ) );
-		// 'Back' button available
-		$this->assertTrue( $this->isElementPresent( "submit-back" ) );
-
-		// 'Restart' button available
-		$this->assertTrue( $this->isElementPresent( "submit-restart" ) );
-	}
-
-	public function testMediaWikiLogoAvailability() {
-		$databaseName = DB_NAME_PREFIX . "_mediawiki_logo";
-		parent::navigateInitialpage();
-		parent::mediaWikiLogoPresentInitialScreen();
-		$this->click( "link=set up the wiki" );
-		$this->waitForPageToLoad( PAGE_LOAD_TIME );
-
-		// 'Language' page
-		parent::mediaWikiLogoPresent();
-		parent::clickContinueButton();
-
-		// 'Welcome to MediaWiki' page
-		parent::mediaWikiLogoPresent();
-		parent::clickContinueButton();
-
-		// 'Connet to database' page
-		parent::mediaWikiLogoPresent();
-		$this->type( "mysql_wgDBname", $databaseName );
-		parent::clickContinueButton();
-
-		// 'Database setting' page
-		parent::mediaWikiLogoPresent();
-		parent::clickContinueButton();
-
-		// 'Name' page
-		parent::mediaWikiLogoPresent();
-		parent::completeNamePage();
-		parent::clickContinueButton();
-
-		// 'Options' page
-		parent::mediaWikiLogoPresent();
-		parent::clickContinueButton();
-
-		// 'Install' page
-		parent::mediaWikiLogoPresent();
-	}
-
-	public function testRightFramework() {
-		parent::navigateLanguagePage();
-		// Verfy right framework texts display
-		$this->assertEquals( "Language",
-			$this->getText( LINK_RIGHT_FRAMEWORK . "li[1]" ) );
-		$this->assertEquals( "Existing wiki",
-			$this->getText( LINK_RIGHT_FRAMEWORK . "li[2]" ) );
-		$this->assertEquals( "Welcome to MediaWiki!",
-			$this->getText( LINK_RIGHT_FRAMEWORK . "li[3]" ) );
-		$this->assertEquals( "Connect to database",
-			$this->getText( LINK_RIGHT_FRAMEWORK . "li[4]" ) );
-		$this->assertEquals( "Upgrade existing installation",
-			$this->getText( LINK_RIGHT_FRAMEWORK . "li[5]" ) );
-		$this->assertEquals( "Database settings",
-			$this->getText( LINK_RIGHT_FRAMEWORK . "li[6]" ) );
-		$this->assertEquals( "Name",
-			$this->getText( LINK_RIGHT_FRAMEWORK . "li[7]" ) );
-		$this->assertEquals( "Options",
-			$this->getText( LINK_RIGHT_FRAMEWORK . "li[8]" ) );
-		$this->assertEquals( "Install",
-			$this->getText( LINK_RIGHT_FRAMEWORK . "li[9]" ) );
-		$this->assertEquals( "Complete!",
-			$this->getText( LINK_RIGHT_FRAMEWORK . "li[10]/span" ) );
-	}
-}
diff --git a/tests/selenium/installer/README.txt b/tests/selenium/installer/README.txt
deleted file mode 100644
index bc880a8b..00000000
--- a/tests/selenium/installer/README.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-== Details==
-
-Automated Selenium test scripts written for MediaWiki Installer is available at https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/core.git;a=tree;f=tests/selenium/installer;hb=HEAD.
-Detailed test cases available at http://www.mediawiki.org/wiki/New_installer/Test_plan.
-
-Version : MediaWiki 1.18alpha
-Date 	: 27/12/2010
-
-== Running tests ==
-
-Test cases can be run independently or can run all the test cases using MediaWikiInstallerTestSuite.php within PHPUnit/Selenium.
-
-
-== Dependencies == 
-
-MediaWikiInstallationConfig.php
-
-Value of the 'DB_NAME_PREFIX' should be replace with the database name prefix. Several DB instances will get created to cover different installation scenarios starting with the above prefix.
-You need to change the value of the 'DB_NAME_PREFIX' in MediaWikiInstallationConfig everytime you planned to
-run the tests.
-'DIRECTORY_NAME', 'PORT' and the 'HOST_NAME' should be replaced with your local values.
-You may specify the test browser you wish to run the test using 'TEST_BROWSER'.  Default browser is Firefox.
-
-Note : MediaWikiInstallerTestSuite.php has no dependency on 'Selenium' test framework.
-
-
-== Known problems ==
-
-If you run the MediaWikiInstallerTestSuite.php twice without changing the name of the database, the second run should be falied.
-(Please read the more information on how to change the database name which is avaialable under 'Dependencies' section)
-
-
diff --git a/tests/selenium/selenium_settings.ini.sample b/tests/selenium/selenium_settings.ini.sample
deleted file mode 100644
index b1d88193..00000000
--- a/tests/selenium/selenium_settings.ini.sample
+++ /dev/null
@@ -1,32 +0,0 @@
-[SeleniumSettings]
-
-; Set up the available browsers that Selenium can control.
-browsers[firefox] 	= "*firefox"
-browsers[iexplorer] = "*iexploreproxy"
-browsers[chrome] 	= "*chrome"
-
-; The simple configurations above usually work on Linux, but Windows and
-; Mac OS X hosts may need to specify a full path:
-;browsers[firefox] = "*firefox /Applications/Firefox.app/Contents/MacOS/firefox-bin"
-;browsers[firefox] = "*firefox C:\Program Files\Mozilla Firefox\firefox.exe"
-
-host 				= "localhost"
-port 				= "4444"
-wikiUrl 			= "http://localhost/deployment"
-username 			= "wikiuser"
-userPassword 		= "wikipass"
-testBrowser 		= "firefox"
-startserver			=
-stopserver			=
-jUnitLogFile		=
-runAgainstGrid		= false
-
-; To let the test runner start and stop the selenium server, it needs the full
-; path to selenium-server.jar from the selenium-remote-control package.
-seleniumserverexecpath = "/opt/local/selenium-remote-control-1.0.3/selenium-server-1.0.3/selenium-server.jar"
-
-[SeleniumTests]
-
-testSuite[SimpleSeleniumTestSuite] = "tests/selenium/suites/SimpleSeleniumTestSuite.php"
-testSuite[WikiEditorTestSuite] = "extensions/WikiEditor/selenium/WikiEditorTestSuite.php"
-
diff --git a/tests/selenium/selenium_settings_grid.ini.sample b/tests/selenium/selenium_settings_grid.ini.sample
deleted file mode 100644
index 3bbd534a..00000000
--- a/tests/selenium/selenium_settings_grid.ini.sample
+++ /dev/null
@@ -1,16 +0,0 @@
-[SeleniumSettings]
-
-host			= "grid.tesla.usability.wikimedia.org"
-port			= "4444"
-wikiUrl			= "http://208.80.152.253:5001"
-username		= "wikiuser"
-userPassword	= "wikipass"
-testBrowser		= "Safari on OS X Snow Leopard"
-jUnitLogFile	=
-runAgainstGrid	= true
-startserver = false
-stopserver = false
-
-[SeleniumTests]
-
-testSuite[SimpleSeleniumTestSuite]	= "tests/selenium/suites/SimpleSeleniumTestSuite.php"
diff --git a/tests/selenium/suites/AddContentToNewPageTestCase.php b/tests/selenium/suites/AddContentToNewPageTestCase.php
deleted file mode 100644
index 2803ff2a..00000000
--- a/tests/selenium/suites/AddContentToNewPageTestCase.php
+++ /dev/null
@@ -1,173 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class AddContentToNewPageTestCase extends SeleniumTestCase {
-	// Add bold text and verify output
-	public function testAddBoldText() {
-		$this->getExistingPage();
-		$this->clickEditLink();
-		$this->loadWikiEditor();
-		$this->clearWikiEditor();
-		$this->click( "//*[@id='mw-editbutton-bold']" );
-		$this->clickShowPreviewBtn();
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify bold text displayed on mediawiki preview
-		$this->assertTrue( $this->isElementPresent( "//div[@id='wikiPreview']/p/b" ) );
-		$this->assertTrue( $this->isTextPresent( "Bold text" ) );
-	}
-
-	// Add italic text and verify output
-	public function testAddItalicText() {
-		$this->getExistingPage();
-		$this->clickEditLink();
-		$this->loadWikiEditor();
-		$this->clearWikiEditor();
-		$this->click( "//*[@id='mw-editbutton-italic']" );
-		$this->clickShowPreviewBtn();
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify italic text displayed on mediawiki preview
-		$this->assertTrue( $this->isElementPresent( "//div[@id='wikiPreview']/p/i" ) );
-		$this->assertTrue( $this->isTextPresent( "Italic text" ) );
-	}
-
-	// Add internal link for a new page and verify output in the preview
-	public function testAddInternalLinkNewPage() {
-		$this->getExistingPage();
-		$this->clickEditLink();
-		$this->loadWikiEditor();
-		$this->clearWikiEditor();
-		$this->click( "//*[@id='mw-editbutton-link']" );
-		$this->clickShowPreviewBtn();
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify internal link displayed on mediawiki preview
-		$source = $this->getText( "//*[@id='wikiPreview']/p/a" );
-		$correct = strstr( $source, "Link title" );
-		$this->assertEquals( $correct, true );
-
-		$this->click( SeleniumTestConstants::LINK_START . "Link title" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify internal link open as a new page - editing mode
-		$source = $this->getText( "firstHeading" );
-		$correct = strstr( $source, "Editing Link title" );
-		$this->assertEquals( $correct, true );
-	}
-
-	// Add external link and verify output in the preview
-	public function testAddExternalLink() {
-		$this->getExistingPage();
-		$this->clickEditLink();
-		$this->loadWikiEditor();
-		$this->clearWikiEditor();
-		$this->click( "//*[@id='mw-editbutton-extlink']" );
-		$this->type( SeleniumTestConstants::TEXT_EDITOR, "[http://www.google.com Google]" );
-		$this->clickShowPreviewBtn();
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify external links displayed on mediawiki preview
-		$source = $this->getText( "//*[@id='wikiPreview']/p/a" );
-		$correct = strstr( $source, "Google" );
-		$this->assertEquals( $correct, true );
-
-		$this->click( SeleniumTestConstants::LINK_START . "Google" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify external link opens
-		$source = $this->getTitle();
-		$correct = strstr( $source, "Google" );
-		$this->assertEquals( $correct, true );
-	}
-
-	// Add level 2 headline and verify output in the preview
-	public function testAddLevel2HeadLine() {
-		$blnElementPresent = false;
-		$blnTextPresent = false;
-		$this->getExistingPage();
-		$this->clickEditLink();
-		$this->loadWikiEditor();
-		$this->clearWikiEditor();
-		$this->click( "mw-editbutton-headline" );
-		$this->clickShowPreviewBtn();
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->assertTrue( $this->isElementPresent( "//div[@id='wikiPreview']/h2" ) );
-
-		// Verify level 2 headline displayed on mediawiki preview
-		$source = $this->getText( "//*[@id='Headline_text']" );
-		$correct = strstr( $source, "Headline text" );
-		$this->assertEquals( $correct, true );
-	}
-
-	// Add text with ignore wiki format and verify output the preview
-	public function testAddNoWikiFormat() {
-		$this->getExistingPage();
-		$this->clickEditLink();
-		$this->loadWikiEditor();
-		$this->clearWikiEditor();
-		$this->click( "//*[@id='mw-editbutton-nowiki']" );
-		$this->clickShowPreviewBtn();
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify ignore wiki format text displayed on mediawiki preview
-		$source = $this->getText( "//div[@id='wikiPreview']/p" );
-		$correct = strstr( $source, "Insert non-formatted text here" );
-		$this->assertEquals( $correct, true );
-	}
-
-	// Add signature and verify output in the preview
-	public function testAddUserSignature() {
-		$this->getExistingPage();
-		$this->clickEditLink();
-		$this->loadWikiEditor();
-		$this->clearWikiEditor();
-		$this->click( "mw-editbutton-signature" );
-		$this->clickShowPreviewBtn();
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify signature displayed on mediawiki preview
-		$source = $this->getText( "//*[@id='wikiPreview']/p/a" );
-		$username = $this->getText( "//*[@id='pt-userpage']/a" );
-		$correct = strstr( $source, $username );
-		$this->assertEquals( $correct, true );
-	}
-
-	// Add horizontal line and verify output in the preview
-	public function testHorizontalLine() {
-		$this->getExistingPage();
-		$this->clickEditLink();
-		$this->loadWikiEditor();
-		$this->clearWikiEditor();
-		$this->click( "mw-editbutton-hr" );
-
-		$this->clickShowPreviewBtn();
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify horizontal line displayed on mediawiki preview
-		$this->assertTrue( $this->isElementPresent( "//div[@id='wikiPreview']/hr" ) );
-		$this->deletePage( "new" );
-	}
-}
diff --git a/tests/selenium/suites/AddNewPageTestCase.php b/tests/selenium/suites/AddNewPageTestCase.php
deleted file mode 100644
index c70af339..00000000
--- a/tests/selenium/suites/AddNewPageTestCase.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class AddNewPageTestCase extends SeleniumTestCase {
-	// Verify adding a new page
-	public function testAddNewPage() {
-		$newPage = "new";
-		$displayName = "New";
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-		$this->type( "searchInput", $newPage );
-		$this->click( "searchGoButton" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify 'Search results' text available
-		$source = $this->gettext( "firstHeading" );
-		$correct = strstr( $source, "Search results" );
-		$this->assertEquals( $correct, true );
-
-		// Verify  'Create the page "<page name>" on this wiki' text available
-		$source = $this->gettext( "//div[@id='bodyContent']/div[4]/p/b" );
-		$correct = strstr( $source, "Create the page \"New\" on this wiki!" );
-		$this->assertEquals( $correct, true );
-
-		$this->click( SeleniumTestConstants::LINK_START . $displayName );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->assertTrue( $this->isElementPresent( SeleniumTestConstants::LINK_START . "Create" ) );
-		$this->type( "wpTextbox1", "add new test page" );
-		$this->click( SeleniumTestConstants::BUTTON_SAVE );
-
-		// Verify new page added
-		$source = $this->gettext( "firstHeading" );
-		$correct = strstr( $source, $displayName );
-		$this->assertEquals( $correct, true );
-	}
-}
diff --git a/tests/selenium/suites/CreateAccountTestCase.php b/tests/selenium/suites/CreateAccountTestCase.php
deleted file mode 100644
index a603f995..00000000
--- a/tests/selenium/suites/CreateAccountTestCase.php
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-Class CreateAccountTestCase extends SeleniumTestCase {
-	// Change these values before run the test
-	private $userName = "yourname4000";
-	private $password = "yourpass4000";
-
-	// Verify 'Log in/create account' link existance in Main page.
-	public function testMainPageLink() {
-
-		$this->click( "link=Log out" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-		$this->assertTrue( $this->isElementPresent( "link=Log in / create account" ) );
-	}
-
-	// Verify 'Create an account' link existance in 'Log in / create account' Page.
-	public function testCreateAccountPageLink() {
-
-		$this->click( "link=Log out" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-
-		// click Log in / create account link to open Log in / create account' page
-		$this->click( "link=Log in / create account" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->assertTrue( $this->isElementPresent( "link=Create an account" ) );
-	}
-
-	// Verify Create account
-	public function testCreateAccount() {
-
-		$this->click( "link=Log out" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-
-		$this->click( "link=Log in / create account" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->click( "link=Create an account" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify for blank user name
-		$this->type( "wpName2", "" );
-		$this->click( "wpCreateaccount" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->assertEquals( "Login error\n You have not specified a valid user name.",
-			$this->getText( "//div[@id='bodyContent']/div[4]" ) );
-
-		// Verify for invalid user name
-		$this->type( "wpName2", "@" );
-		$this->click( "wpCreateaccount" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->assertEquals( "Login error\n You have not specified a valid user name.",
-			$this->getText( "//div[@id='bodyContent']/div[4]" ) );
-
-		// start of test for blank password
-		$this->type( "wpName2", $this->userName );
-		$this->type( "wpPassword2", "" );
-		$this->click( "wpCreateaccount" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->assertEquals( "Login error\n Passwords must be at least 1 character.",
-			$this->getText( "//div[@id='bodyContent']/div[4]" ) );
-
-		$this->type( "wpName2", $this->userName );
-		$this->type( "wpPassword2", $this->password );
-		$this->click( "wpCreateaccount" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->assertEquals( "Login error\n The passwords you entered do not match.",
-			$this->getText( "//div[@id='bodyContent']/div[4]" ) );
-
-		$this->type( "wpName2", $this->userName );
-		$this->type( "wpPassword2", $this->password );
-		$this->type( "wpRetype", $this->password );
-		$this->click( "wpCreateaccount" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify successful account creation for valid combination of 'Username', 'Password', 'Retype password'
-		$this->assertEquals( "Welcome, " . ucfirst( $this->userName ) . "!",
-			$this->getText( "Welcome,_" . ucfirst( $this->userName ) . "!" ) );
-	}
-}
-
diff --git a/tests/selenium/suites/DeletePageAdminTestCase.php b/tests/selenium/suites/DeletePageAdminTestCase.php
deleted file mode 100644
index f0005cde..00000000
--- a/tests/selenium/suites/DeletePageAdminTestCase.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class DeletePageAdminTestCase extends SeleniumTestCase {
-	// Verify adding a new page
-	public function testDeletePage() {
-
-		$newPage = "new";
-		$displayName = "New";
-
-		$this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-
-		$this->type( "searchInput", $newPage );
-		$this->click( "searchGoButton" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->click( SeleniumTestConstants::LINK_START . $displayName );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->type( SeleniumTestConstants::TEXT_EDITOR, $newPage . " text" );
-		$this->click( SeleniumTestConstants::BUTTON_SAVE );
-
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-		$this->click( SeleniumTestConstants::LINK_START . "Log out" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->click( SeleniumTestConstants::LINK_START . "Log in / create account" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->type( "wpName1", $this->selenium->getUser() );
-		$this->type( "wpPassword1", $this->selenium->getPass() );
-		$this->click( "wpLoginAttempt" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->type( "searchInput", "new" );
-		$this->click( "searchGoButton" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify  'Delete' link displayed
-		$source = $this->gettext( SeleniumTestConstants::LINK_START . "Delete" );
-		$correct = strstr( $source, "Delete" );
-		$this->assertEquals( $correct, true );
-
-		$this->click( SeleniumTestConstants::LINK_START . "Delete" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify 'Delete' button available
-		$this->assertTrue( $this->isElementPresent( "wpConfirmB" ) );
-
-		$this->click( "wpConfirmB" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify  'Action complete' text displayed
-		$source = $this->gettext( "firstHeading" );
-		$correct = strstr( $source, "Action complete" );
-		$this->assertEquals( $correct, true );
-
-		// Verify  '<Page Name> has been deleted. See deletion log for a record of recent deletions.' text displayed
-		$source = $this->gettext( "//div[@id='bodyContent']/p[1]" );
-		$correct = strstr( $source, "\"New\" has been deleted. See deletion log for a record of recent deletions." );
-		$this->assertEquals( $correct, true );
-	}
-}
diff --git a/tests/selenium/suites/EmailPasswordTestCase.php b/tests/selenium/suites/EmailPasswordTestCase.php
deleted file mode 100644
index 77282e47..00000000
--- a/tests/selenium/suites/EmailPasswordTestCase.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class EmailPasswordTestCase extends SeleniumTestCase {
-	// change user name for each and every test (with in 24 hours)
-	private $userName = "test1";
-
-	public function testEmailPasswordButton() {
-		$this->click( SeleniumTestConstants::LINK_START . "Log out" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-
-		// click Log in / create account link to open Log in / create account' page
-		$this->click( SeleniumTestConstants::LINK_START . "Log in / create account" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->assertTrue( $this->isElementPresent( "wpMailmypassword" ) );
-	}
-
-	// Verify Email password functionality
-	public function testEmailPasswordMessages() {
-		$this->click( SeleniumTestConstants::LINK_START . "Log out" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->open( $this->getUrl() . '/index.php?title=Main_Page' );
-
-		// click Log in / create account link to open Log in / create account' page
-		$this->click( SeleniumTestConstants::LINK_START . "Log in / create account" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->type( "wpName1", "" );
-		$this->click( "wpMailmypassword" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->assertEquals( "Login error\n You have not specified a valid user name.",
-			$this->getText( "//div[@id='bodyContent']/div[4]" ) );
-
-		$this->type( "wpName1", $this->userName );
-		$this->click( "wpMailmypassword" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		//  Can not run on localhost
-		$this->assertEquals( "A new password has been sent to the e-mail address registered for " . ucfirst( $this->userName ) . ". Please log in again after you receive it.",
-			$this->getText( "//div[@id='bodyContent']/div[4]" ) );
-
-		$this->type( "wpName1", $this->userName );
-		$this->click( "wpMailmypassword" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->assertEquals( "Login error\n A password reminder has already been sent, within the last 24 hours. To prevent abuse, only one password reminder will be sent per 24 hours.",
-			$this->getText( "//div[@id='bodyContent']/div[4]" ) );
-	}
-}
-
diff --git a/tests/selenium/suites/MediaWikiEditorConfig.php b/tests/selenium/suites/MediaWikiEditorConfig.php
deleted file mode 100644
index 7fd8e075..00000000
--- a/tests/selenium/suites/MediaWikiEditorConfig.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class MediaWikiEditorConfig {
-	public static function getSettings( &$includeFiles, &$globalConfigs ) {
-		$includes = array(
-			//files that needed to be included would go here
-			//commenting out because this does not exist
-			//'tests/selenium/suites/MediaWikiCommonFunction.php'
-		);
-		$configs = array(
-			'wgPageLoadTime' => "600000"
-		);
-		$includeFiles = array_merge( $includeFiles, $includes );
-		$globalConfigs = array_merge( $globalConfigs, $configs );
-		return true;
-	}
-}
-
diff --git a/tests/selenium/suites/MediaWikiEditorTestSuite.php b/tests/selenium/suites/MediaWikiEditorTestSuite.php
deleted file mode 100644
index f9cfb7fb..00000000
--- a/tests/selenium/suites/MediaWikiEditorTestSuite.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-class MediaWikiEditorTestSuite extends SeleniumTestSuite {
-	public function setUp() {
-		$this->setLoginBeforeTests( true );
-		parent::setUp();
-	}
-
-	public function addTests() {
-		$testFiles = array(
-			'tests/selenium/suites/AddNewPageTestCase.php',
-			'tests/selenium/suites/AddContentToNewPageTestCase.php',
-			'tests/selenium/suites/PreviewPageTestCase.php',
-			'tests/selenium/suites/SavePageTestCase.php',
-		);
-		parent::addTestFiles( $testFiles );
-	}
-}
-
diff --git a/tests/selenium/suites/MediaWikiExtraTestSuite.php b/tests/selenium/suites/MediaWikiExtraTestSuite.php
deleted file mode 100644
index 8993907a..00000000
--- a/tests/selenium/suites/MediaWikiExtraTestSuite.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-class MediaWikiExtraTestSuite extends SeleniumTestSuite {
-	public function setUp() {
-		$this->setLoginBeforeTests( true );
-		parent::setUp();
-	}
-
-	public function addTests() {
-		$testFiles = array(
-			'tests/selenium/suites/MyContributionsTestCase.php',
-			'tests/selenium/suites/MyWatchListTestCase.php',
-			'tests/selenium/suites/UserPreferencesTestCase.php',
-			'tests/selenium/suites/MovePageTestCase.php',
-			'tests/selenium/suites/PageSearchTestCase.php',
-			'tests/selenium/suites/EmailPasswordTestCase.php',
-			'tests/selenium/suites/CreateAccountTestCase.php'
-		);
-		parent::addTestFiles( $testFiles );
-	}
-}
diff --git a/tests/selenium/suites/MediawikiCoreSmokeTestCase.php b/tests/selenium/suites/MediawikiCoreSmokeTestCase.php
deleted file mode 100644
index 4491afd2..00000000
--- a/tests/selenium/suites/MediawikiCoreSmokeTestCase.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/*
- * Stub of tests be need as part of the hack-a-ton
- */
-class MediawikiCoreSmokeTestCase extends SeleniumTestCase {
-	public function testUserLogin() {
-
-	}
-
-	public function testChangeUserPreference() {
-
-	}
-
-	/**
-	 * TODO: generalize this test to be reusable for different skins
-	 */
-	public function testCreateNewPageVector() {
-
-	}
-
-	/**
-	 * TODO: generalize this test to be reusable for different skins
-	 */
-	public function testEditExistingPageVector() {
-
-	}
-
-	/**
-	 * TODO: generalize this test to be reusable for different skins
-	 */
-	public function testCreateNewPageMonobook() {
-
-	}
-
-	/**
-	 * TODO: generalize this test to be reusable for different skins
-	 */
-	public function testEditExistingPageMonobook() {
-
-	}
-
-	public function testImageUpload() {
-		$this->login();
-		$this->open( $this->getUrl() .
-			'/index.php?title=Special:Upload' );
-		$this->type( 'wpUploadFile', __DIR__ .
-			"\\..\\data\\Wikipedia-logo-v2-de.png" );
-		$this->check( 'wpIgnoreWarning' );
-		$this->click( 'wpUpload' );
-		$this->waitForPageToLoad( 30000 );
-
-		$this->assertSeleniumHTMLContains(
-			'//h1[@class="firstHeading"]', "Wikipedia-logo-v2-de.png"
-		);
-
-		/*
-		$this->open( $this->getUrl() . '/index.php?title=Image:'
-			. ucfirst( $this->filename ) . '&action=delete' );
-		$this->type( 'wpReason', 'Remove test file' );
-		$this->click( 'mw-filedelete-submit' );
-		$this->waitForPageToLoad( 10000 );
-
-		// Todo: This message is localized
-		$this->assertSeleniumHTMLContains( '//div[@id="bodyContent"]/p',
-			ucfirst( $this->filename ) . '.*has been deleted.' );
-		 */
-	}
-
-
-}
diff --git a/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php b/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php
deleted file mode 100644
index fc69e3c3..00000000
--- a/tests/selenium/suites/MediawikiCoreSmokeTestSuite.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-/**
- * Stubs for now. We're going to start populating this test.
- */
-class MediawikiCoreSmokeTestSuite extends SeleniumTestSuite {
-	public function setUp() {
-		$this->setLoginBeforeTests( false );
-		parent::setUp();
-	}
-
-	public function addTests() {
-		$testFiles = array(
-			'tests/selenium/suites/MediawikiCoreSmokeTestCase.php'
-		);
-		parent::addTestFiles( $testFiles );
-	}
-
-
-}
diff --git a/tests/selenium/suites/MovePageTestCase.php b/tests/selenium/suites/MovePageTestCase.php
deleted file mode 100644
index d2eaa40d..00000000
--- a/tests/selenium/suites/MovePageTestCase.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class MovePageTestCase extends SeleniumTestCase {
-	// Verify move(rename) wiki page
-	public function testMovePage() {
-		$newPage = "mypage99";
-		$displayName = "Mypage99";
-
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-		$this->type( "searchInput", $newPage );
-		$this->click( "searchGoButton" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->click( "link=" . $displayName );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->type( SeleniumTestConstants::TEXT_EDITOR, $newPage . " text" );
-		$this->click( SeleniumTestConstants::BUTTON_SAVE );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify link 'Move' available
-		$this->assertTrue( $this->isElementPresent( "link=Move" ) );
-
-		$this->click( "link=Move" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify correct page name displayed under 'Move Page' field
-		$this->assertEquals( $displayName,
-			$this->getText( "//table[@id='mw-movepage-table']/tbody/tr[1]/td[2]/strong/a" ) );
-		$movePageName = $this->getText( "//table[@id='mw-movepage-table']/tbody/tr[1]/td[2]/strong/a" );
-
-		// Verify 'To new title' field has current page name as the default name
-		$newTitle = $this->getValue( "wpNewTitle" );
-		$correct = strstr( $movePageName, $newTitle );
-		$this->assertEquals( $correct, true );
-
-		$this->type( "wpNewTitle", $displayName );
-		$this->click( "wpMove" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify warning message for the same source and destination titles
-		$this->assertEquals( "Source and destination titles are the same; cannot move a page over itself.",
-			$this->getText( "//div[@id='bodyContent']/p[4]/strong" ) );
-
-		// Verify warning message for the blank title
-		$this->type( "wpNewTitle", "" );
-		$this->click( "wpMove" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify warning message for the blank title
-		$this->assertEquals( "The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title. It may contain one or more characters which cannot be used in titles.",
-			$this->getText( "//div[@id='bodyContent']/p[4]/strong" ) );
-
-		//  Verify warning messages for the invalid titles
-		$this->type( "wpNewTitle", "# < > [ ] | { }" );
-		$this->click( "wpMove" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->assertEquals( "The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title. It may contain one or more characters which cannot be used in titles.",
-			$this->getText( "//div[@id='bodyContent']/p[4]/strong" ) );
-
-		$this->type( "wpNewTitle", $displayName . "move" );
-		$this->click( "wpMove" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify move success message displayed correctly
-		$this->assertEquals( "\"" . $displayName . "\" has been moved to \"" . $displayName . "move" . "\"",
-			$this->getText( "//div[@id='bodyContent']/p[1]/b" ) );
-
-		$this->type( "searchInput", $newPage . "move" );
-		$this->click( "searchGoButton" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify search using new page name
-		$this->assertEquals( $displayName . "move", $this->getText( "firstHeading" ) );
-
-		$this->type( "searchInput", $newPage );
-		$this->click( "searchGoButton" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify search using old page name
-		$redirectPageName = $this->getText( "//*[@id='contentSub']" );
-		$this->assertEquals( "(Redirected from " . $displayName . ")", $redirectPageName );
-
-		// newpage delete
-		$this->deletePage( $newPage . "move" );
-		$this->deletePage( $newPage );
-	}
-}
-
diff --git a/tests/selenium/suites/MyContributionsTestCase.php b/tests/selenium/suites/MyContributionsTestCase.php
deleted file mode 100644
index 81e3a4da..00000000
--- a/tests/selenium/suites/MyContributionsTestCase.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once dirname( __DIR__ ) . '/SeleniumTestConstants.php';
-
-class MyContributionsTestCase extends SeleniumTestCase {
-	// Verify user contributions
-	public function testRecentChangesAvailability() {
-		$newPage = $this->createNewTestPage( "MyContributionsTest" );
-
-		// Verify My contributions Link available
-		$this->assertTrue( $this->isElementPresent( "link=Contributions" ) );
-
-
-		$this->click( "link=Contributions" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify recent page adding available on My Contributions list
-		$this->assertEquals( $newPage, $this->getText( "link=" . $newPage ) );
-
-		$this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, $newPage );
-		$this->click( SeleniumTestConstants::BUTTON_SEARCH );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->click( SeleniumTestConstants::LINK_EDIT );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->type( SeleniumTestConstants::TEXT_EDITOR, $newPage . " text changed" );
-		$this->click( SeleniumTestConstants::BUTTON_SAVE );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->click( "link=Contributions" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify recent page changes available on My Contributions
-		$this->assertTrue( $this->isTextPresent( $newPage ) );
-	}
-}
-
diff --git a/tests/selenium/suites/MyWatchListTestCase.php b/tests/selenium/suites/MyWatchListTestCase.php
deleted file mode 100644
index 842108fa..00000000
--- a/tests/selenium/suites/MyWatchListTestCase.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-require_once dirname( __DIR__ ) . '/SeleniumTestConstants.php';
-
-class MyWatchListTestCase extends SeleniumTestCase {
-	// Verify user watchlist
-	public function testMyWatchlist() {
-		$pageName = $this->createNewTestPage( "MyWatchListTest", true );
-		// Verify link 'My Watchlist' available
-		$this->assertTrue( $this->isElementPresent( SeleniumTestConstants::LINK_START . "Watchlist" ) );
-
-		$this->click( SeleniumTestConstants::LINK_START . "Watchlist" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify newly added page to the watchlist is available
-		$this->assertEquals( $pageName, $this->getText( SeleniumTestConstants::LINK_START . $pageName ) );
-
-		$this->click( SeleniumTestConstants::LINK_START . $pageName );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->click( SeleniumTestConstants::LINK_EDIT );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->click( "wpWatchthis" );
-		$this->click( SeleniumTestConstants::BUTTON_SAVE );
-		$this->assertFalse( $this->isElementPresent( SeleniumTestConstants::LINK_START . $pageName ) );
-		//todo watch using the dropdown menu
-	}
-}
-
diff --git a/tests/selenium/suites/PageDeleteTestSuite.php b/tests/selenium/suites/PageDeleteTestSuite.php
deleted file mode 100644
index e43ffa80..00000000
--- a/tests/selenium/suites/PageDeleteTestSuite.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-class PageDeleteTestSuite extends SeleniumTestSuite {
-	public function setUp() {
-		$this->setLoginBeforeTests( true );
-		parent::setUp();
-	}
-
-	public function addTests() {
-		$testFiles = array(
-			'tests/selenium/suites/DeletePageAdminTestCase.php'
-		);
-		parent::addTestFiles( $testFiles );
-	}
-}
diff --git a/tests/selenium/suites/PageSearchTestCase.php b/tests/selenium/suites/PageSearchTestCase.php
deleted file mode 100644
index 5fdc5c80..00000000
--- a/tests/selenium/suites/PageSearchTestCase.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class PageSearchTestCase extends SeleniumTestCase {
-	// Verify the functionality of the 'Go' button
-	public function testPageSearchBtnGo() {
-
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-		$this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, "calcey qa" );
-		$this->click( "searchGoButton" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify  no page matched with the entered search text
-		$source = $this->gettext( "//div[@id='bodyContent']/div[4]/p/b" );
-		$correct = strstr( $source, "Create the page \"Calcey qa\" on this wiki!" );
-		$this->assertEquals( $correct, true );
-
-		$this->click( "link=Calcey qa" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->type( SeleniumTestConstants::TEXT_EDITOR, "Calcey QA team" );
-		$this->click( "wpSave" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-	}
-
-	// Verify the functionality of the 'Search' button
-	public function testPageSearchBtnSearch() {
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-		$this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, "Calcey web" );
-		$this->click( SeleniumTestConstants::BUTTON_SEARCH );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify  no page is available as the search text
-		$source = $this->gettext( "//div[@id='bodyContent']/div[4]/p[2]/b" );
-		$correct = strstr( $source, "Create the page \"Calcey web\" on this wiki!" );
-		$this->assertEquals( $correct, true );
-
-		$this->click( "link=Calcey web" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->type( SeleniumTestConstants::TEXT_EDITOR, "Calcey web team" );
-		$this->click( SeleniumTestConstants::BUTTON_SAVE );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify saved page is opened  when the exact page name is given
-		$this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, "Calcey web" );
-		$this->click( SeleniumTestConstants::BUTTON_SEARCH );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify exact page matched with the entered search text using 'Search' button
-		$source = $this->getText( "//*[@id='bodyContent']/div[4]/p/b" );
-		$correct = strstr( $source, "There is a page named \"Calcey web\" on this wiki." );
-		$this->assertEquals( $correct, true );
-
-		// Verify resutls available when partial page name is entered as the search text
-		$this->type( SeleniumTestConstants::INPUT_SEARCH_BOX, "Calcey" );
-		$this->click( SeleniumTestConstants::BUTTON_SEARCH );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		//  Verify text avaialble in the search result under the page titles
-		if ( $this->isElementPresent( "Page_title_matches" ) ) {
-			$textPageTitle = $this->getText( "//*[@id='bodyContent']/div[4]/ul[1]/li[1]/div[1]/a" );
-			$this->assertContains( 'Calcey', $textPageTitle );
-		}
-
-		//  Verify text avaialble in the search result under the page text
-		if ( $this->isElementPresent( "Page_text_matches" ) ) {
-			$textPageText = $this->getText( "//*[@id='bodyContent']/div[4]/ul[2]/li[2]/div[2]/span" );
-			$this->assertContains( 'Calcey', $textPageText );
-		}
-		$this->deletePage( "Calcey QA" );
-		$this->deletePage( "Calcey web" );
-	}
-}
diff --git a/tests/selenium/suites/PreviewPageTestCase.php b/tests/selenium/suites/PreviewPageTestCase.php
deleted file mode 100644
index 036201f0..00000000
--- a/tests/selenium/suites/PreviewPageTestCase.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class PreviewPageTestCase extends SeleniumTestCase {
-	// Verify adding a new page
-	public function testPreviewPage() {
-		$wikiText = "Adding this page to test the \n Preview button functionality";
-		$newPage = "Test Preview Page";
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-		$this->getNewPage( $newPage );
-		$this->type( SeleniumTestConstants::TEXT_EDITOR, $wikiText . "" );
-		$this->assertTrue( $this->isElementPresent( "//*[@id='wpPreview']" ) );
-
-		$this->click( "wpPreview" );
-
-		// Verify saved page available
-		$source = $this->gettext( "firstHeading" );
-		$correct = strstr( $source, "Test Preview Page" );
-		$this->assertEquals( $correct, true );
-
-		// Verify page content previewed succesfully
-		$contentOfPreviewPage = $this->getText( "//*[@id='content']" );
-		$this->assertContains( $wikiText, $contentOfPreviewPage );
-	}
-}
diff --git a/tests/selenium/suites/SavePageTestCase.php b/tests/selenium/suites/SavePageTestCase.php
deleted file mode 100644
index 1e4cc2df..00000000
--- a/tests/selenium/suites/SavePageTestCase.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class SavePageTestCase extends SeleniumTestCase {
-	// Verify adding a new page
-	public function testSavePage() {
-		$wikiText = "Adding this page to test the Save button functionality";
-		$newPage = "Test Save Page";
-
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-		$this->getNewPage( $newPage );
-		$this->type( SeleniumTestConstants::TEXT_EDITOR, $wikiText );
-
-		// verify 'Save' button available
-		$this->assertTrue( $this->isElementPresent( SeleniumTestConstants::BUTTON_SAVE ) );
-		$this->click( SeleniumTestConstants::BUTTON_SAVE );
-
-		// Verify saved page available
-		$source = $this->gettext( "firstHeading" );
-		$correct = strstr( $source, "Test Save Page" );
-
-		// Verify Saved page name displayed correctly
-		$this->assertEquals( $correct, true );
-
-		// Verify page content saved succesfully
-		$contentOfSavedPage = $this->getText( "//*[@id='content']" );
-		$this->assertContains( $wikiText, $contentOfSavedPage );
-		$this->deletePage( $newPage );
-	}
-}
diff --git a/tests/selenium/suites/SimpleSeleniumConfig.php b/tests/selenium/suites/SimpleSeleniumConfig.php
deleted file mode 100644
index a6935114..00000000
--- a/tests/selenium/suites/SimpleSeleniumConfig.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-class SimpleSeleniumConfig {
-
-	public static function getSettings( &$includeFiles, &$globalConfigs, &$resourceFiles ) {
-		global $IP;
-		$includes = array(
-			//files that needed to be included would go here
-		);
-		$configs = array(
-			'wgDBprefix' => 'mw_',
-			'wgDBTableOptions' => 'ENGINE=InnoDB, DEFAULT CHARSET=binary',
-			'wgDBmysql5' => 'false',
-			'wgMainCacheType' => 'CACHE_NONE',
-			'wgParserCacheType' => 'CACHE_NONE',
-			'wgMemCachedServers' => array(),
-			'wgLanguageCode' => 'en',
-			'wgSitename' => 'test_wiki',
-			'wgDefaultSkin' => 'chick'
-		);
-		$resources = array(
-			'db' => "$IP/tests/selenium/data/SimpleSeleniumTestDB.sql",
-			'images' => "$IP/tests/selenium/data/SimpleSeleniumTestImages.zip"
-		);
-
-		$includeFiles = array_merge( $includeFiles, $includes );
-		$globalConfigs = array_merge( $globalConfigs, $configs );
-		$resourceFiles = array_merge( $resourceFiles, $resources );
-		return true;
-	}
-}
diff --git a/tests/selenium/suites/SimpleSeleniumTestCase.php b/tests/selenium/suites/SimpleSeleniumTestCase.php
deleted file mode 100644
index 14c9e6b9..00000000
--- a/tests/selenium/suites/SimpleSeleniumTestCase.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/*
- * This test case is part of the SimpleSeleniumTestSuite.
- * Configuration for these tests are documented as part of SimpleSeleniumTestSuite.php
- */
-class SimpleSeleniumTestCase extends SeleniumTestCase {
-	public function testBasic() {
-		$this->open( $this->getUrl() .
-			'/index.php?title=Selenium&action=edit' );
-		$this->type( "wpTextbox1", "This is a basic test" );
-		$this->click( "wpPreview" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// check result
-		$source = $this->getText( "//div[@id='wikiPreview']/p" );
-		$correct = strstr( $source, "This is a basic test" );
-		$this->assertEquals( $correct, true );
-	}
-
-	/**
-	 * All this test really does is verify that a global var was set.
-	 * It depends on $wgDefaultSkin = 'chick'; being set
-	 */
-	public function testGlobalVariableForDefaultSkin() {
-		$this->open( $this->getUrl() . '/index.php' );
-		$bodyClass = $this->getAttribute( "//body/@class" );
-		$this->assertContains( 'skin-chick', $bodyClass, 'Chick skin not set' );
-	}
-
-	/**
-	 * Just verify that the test db was loaded correctly
-	 */
-	public function testDatabaseResourceLoadedCorrectly() {
-		$this->open( $this->getUrl() . '/index.php/TestResources?action=purge' );
-		$testString = $this->gettext( "//body//*[@id='firstHeading']" );
-		$this->assertEquals( 'TestResources', $testString, 'Article that should be present in the test db was not found.' );
-	}
-
-}
diff --git a/tests/selenium/suites/SimpleSeleniumTestSuite.php b/tests/selenium/suites/SimpleSeleniumTestSuite.php
deleted file mode 100644
index 446836a2..00000000
--- a/tests/selenium/suites/SimpleSeleniumTestSuite.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Sample test suite.
- * Two ways to configure MW for these tests
- * 1) If you are running multiple test suites, add the following in LocalSettings.php
- * require_once("tests/selenium/SimpleSeleniumConfig.php");
- * $wgSeleniumTestConfigs['SimpleSeleniumTestSuite'] = 'SimpleSeleniumConfig::getSettings';
- * OR
- * 2) Add the following to your Localsettings.php
- * $wgDefaultSkin = 'chick';
- */
-class SimpleSeleniumTestSuite extends SeleniumTestSuite {
-	public function setUp() {
-		$this->setLoginBeforeTests( false );
-		parent::setUp();
-	}
-
-	public function addTests() {
-		$testFiles = array(
-			'selenium/suites/SimpleSeleniumTestCase.php'
-		);
-		parent::addTestFiles( $testFiles );
-	}
-
-
-}
diff --git a/tests/selenium/suites/UserPreferencesTestCase.php b/tests/selenium/suites/UserPreferencesTestCase.php
deleted file mode 100644
index c70e38fb..00000000
--- a/tests/selenium/suites/UserPreferencesTestCase.php
+++ /dev/null
@@ -1,170 +0,0 @@
-<?php
-/**
- * Selenium server manager
- *
- * @file
- * @ingroup Testing
- * Copyright (C) 2010 Nadeesha Weerasinghe <nadeesha@calcey.com>
- * http://www.calcey.com/
- *
- * 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 2 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, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * http://www.gnu.org/copyleft/gpl.html
- */
-
-class UserPreferencesTestCase extends SeleniumTestCase {
-	// Verify user information
-	public function testUserInfoDisplay() {
-
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-		$this->click( SeleniumTestConstants::LINK_START . "My preferences" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify correct username displayed in User Preferences
-		$this->assertEquals( $this->getText( "//li[@id='pt-userpage']/a" ),
-			$this->getText( "//table[@id='mw-htmlform-info']/tbody/tr[1]/td[2]" ) );
-
-		// Verify existing Signature Displayed correctly
-		$this->assertEquals( $this->selenium->getUser(),
-			$this->getTable( "mw-htmlform-signature.0.1" ) );
-	}
-
-	// Verify change password
-	public function testChangePassword() {
-
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-		$this->click( SeleniumTestConstants::LINK_START . "My preferences" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->click( SeleniumTestConstants::LINK_START . "Change password" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->type( "wpPassword", "12345" );
-		$this->type( "wpNewPassword", "54321" );
-		$this->type( "wpRetype", "54321" );
-		$this->click( "//input[@value='Change password']" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->assertEquals( "Preferences", $this->getText( "firstHeading" ) );
-
-		$this->click( SeleniumTestConstants::LINK_START . "Change password" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->type( "wpPassword", "54321" );
-		$this->type( "wpNewPassword", "12345" );
-		$this->type( "wpRetype", "12345" );
-		$this->click( "//input[@value='Change password']" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->assertEquals( "Preferences", $this->getText( "firstHeading" ) );
-
-		$this->click( SeleniumTestConstants::LINK_START . "Change password" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->type( "wpPassword", "54321" );
-		$this->type( "wpNewPassword", "12345" );
-		$this->type( "wpRetype", "12345" );
-		$this->click( "//input[@value='Change password']" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-	}
-
-	// Verify successful preferences save
-	public function testSuccessfullSave() {
-
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-		$this->click( SeleniumTestConstants::LINK_START . "My preferences" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->type( "mw-input-realname", "Test User" );
-		$this->click( "prefcontrol" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify  "Your preferences have been saved." message
-		$this->assertEquals( "Your preferences have been saved.",
-			$this->getText( "//div[@id='bodyContent']/div[4]/strong/p" ) );
-		$this->type( "mw-input-realname", "" );
-		$this->click( "prefcontrol" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-	}
-
-	// Verify change signature
-	public function testChangeSignature() {
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-		$this->click( SeleniumTestConstants::LINK_START . "My preferences" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->type( "mw-input-nickname", "TestSignature" );
-		$this->click( "prefcontrol" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify change user signature
-		$this->assertEquals( "TestSignature", $this->getText( SeleniumTestConstants::LINK_START . "TestSignature" ) );
-		$this->type( "mw-input-nickname", "Test" );
-		$this->click( "prefcontrol" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-	}
-
-	// Verify change date format
-	public function testChangeDateFormatTimeZone() {
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-
-		$this->click( SeleniumTestConstants::LINK_START . "My preferences" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-		$this->click( SeleniumTestConstants::LINK_START . "Date and time" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		$this->click( "mw-input-date-dmy" );
-		$this->select( "mw-input-timecorrection", "label=Asia/Colombo" );
-		$this->click( "prefcontrol" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify Date format and time zome saved
-		$this->assertEquals( "Your preferences have been saved.",
-			$this->getText( "//div[@id='bodyContent']/div[4]/strong/p" ) );
-	}
-
-	// Verify restoring all default settings
-	public function testSetAllDefault() {
-		$this->open( $this->getUrl() .
-			'/index.php?title=Main_Page&action=edit' );
-		$this->click( SeleniumTestConstants::LINK_START . "My preferences" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify restoring all default settings
-		$this->assertEquals( "Restore all default settings",
-			$this->getText( SeleniumTestConstants::LINK_START . "Restore all default settings" ) );
-
-		$this->click( "//*[@id='preferences']/div/a" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify 'This can not be undone' warning message displayed
-		$this->assertTrue( $this->isElementPresent( "//input[@value='Restore all default settings']" ) );
-
-		// Verify 'Restore all default settings' button available
-		$this->assertEquals( "You can use this page to reset your preferences to the site defaults. This cannot be undone.",
-			$this->getText( "//div[@id='bodyContent']/p" ) );
-
-		$this->click( "//input[@value='Restore all default settings']" );
-		$this->waitForPageToLoad( SeleniumTestConstants::WIKI_TEST_WAIT_TIME );
-
-		// Verify preferences saved successfully
-		$this->assertEquals( "Your preferences have been saved.",
-			$this->getText( "//div[@id='bodyContent']/div[4]/strong/p" ) );
-	}
-}
-
diff --git a/tests/testHelpers.inc b/tests/testHelpers.inc
index 02fcf24c..88e5885b 100644
--- a/tests/testHelpers.inc
+++ b/tests/testHelpers.inc
@@ -21,7 +21,36 @@
  * @ingroup Testing
  */
 
-class TestRecorder {
+/**
+ * Interface to record parser test results.
+ *
+ * The ITestRecorder is a very simple interface to record the result of
+ * MediaWiki parser tests. One should call start() before running the
+ * full parser tests and end() once all the tests have been finished.
+ * After each test, you should use record() to keep track of your tests
+ * results. Finally, report() is used to generate a summary of your
+ * test run, one could dump it to the console for human consumption or
+ * register the result in a database for tracking purposes.
+ *
+ * @since 1.22
+ */
+interface ITestRecorder {
+
+	/** Called at beginning of the parser test run */
+	public function start();
+
+	/** Called after each test */
+	public function record( $test, $result );
+
+	/** Called before finishing the test run */
+	public function report();
+
+	/** Called at the end of the parser test run */
+	public function end();
+
+}
+
+class TestRecorder implements ITestRecorder {
 	var $parent;
 	var $term;
 
@@ -481,7 +510,7 @@ class TestFileIterator implements Iterator {
 					return true;
 				}
 
-				if ( isset ( $this->sectionData[$this->section] ) ) {
+				if ( isset( $this->sectionData[$this->section] ) ) {
 					throw new MWException( "duplicate section '$this->section' at line {$this->lineNum} of $this->file\n" );
 				}
 
diff --git a/thumb.php b/thumb.php
index ede30e6e..913adc18 100644
--- a/thumb.php
+++ b/thumb.php
@@ -22,11 +22,7 @@
  */
 
 define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-	require( 'core/includes/WebStart.php' );
-} else {
-	require( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
 
 // Don't use fancy mime detection, just check the file extension for jpg/gif/png
 $wgTrivialMimeDetection = true;
@@ -66,15 +62,21 @@ function wfThumbHandle404() {
 
 	# Set action base paths so that WebRequest::getPathInfo()
 	# recognizes the "X" as the 'title' in ../thumb_handler.php/X urls.
-	$wgArticlePath = false; # Don't let a "/*" article path clober our action path
+	# Note: If Custom per-extension repo paths are set, this may break.
+	$repo = RepoGroup::singleton()->getLocalRepo();
+	$oldArticlePath = $wgArticlePath;
+	$wgArticlePath = $repo->getZoneUrl( 'thumb' ) . '/$1';
 
 	$matches = WebRequest::getPathInfo();
+
+	$wgArticlePath = $oldArticlePath;
+
 	if ( !isset( $matches['title'] ) ) {
 		wfThumbError( 404, 'Could not determine the name of the requested thumbnail.' );
 		return;
 	}
 
-	$params = wfExtractThumbParams( $matches['title'] ); // basic wiki URL param extracting
+	$params = wfExtractThumbRequestInfo( $matches['title'] ); // basic wiki URL param extracting
 	if ( $params == null ) {
 		wfThumbError( 400, 'The specified thumbnail parameters are not recognized.' );
 		return;
@@ -86,28 +88,24 @@ function wfThumbHandle404() {
 /**
  * Stream a thumbnail specified by parameters
  *
- * @param $params Array
+ * @param $params Array List of thumbnailing parameters. In addition to parameters
+ *  passed to the MediaHandler, this may also includes the keys:
+ *   f (for filename), archived (if archived file), temp (if temp file),
+ *   w (alias for width), p (alias for page), r (ignored; historical),
+ *   rel404 (path for render on 404 to verify hash path correct),
+ *   thumbName (thumbnail name to potentially extract more parameters from
+ *   e.g. 'lossy-page1-120px-Foo.tiff' would add page, lossy and width
+ *   to the parameters)
  * @return void
  */
 function wfStreamThumb( array $params ) {
 	global $wgVaryOnXFP;
 
-	wfProfileIn( __METHOD__ );
+	$section = new ProfileSection( __METHOD__ );
 
 	$headers = array(); // HTTP headers to send
 
 	$fileName = isset( $params['f'] ) ? $params['f'] : '';
-	unset( $params['f'] );
-
-	// Backwards compatibility parameters
-	if ( isset( $params['w'] ) ) {
-		$params['width'] = $params['w'];
-		unset( $params['w'] );
-	}
-	if ( isset( $params['p'] ) ) {
-		$params['page'] = $params['p'];
-	}
-	unset( $params['r'] ); // ignore 'r' because we unconditionally pass File::RENDER
 
 	// Is this a thumb of an archived file?
 	$isOld = ( isset( $params['archived'] ) && $params['archived'] );
@@ -126,7 +124,7 @@ function wfStreamThumb( array $params ) {
 		$img = new UnregisteredLocalFile( null, $repo,
 			# Temp files are hashed based on the name without the timestamp.
 			# The thumbnails will be hashed based on the entire name however.
-			# @TODO: fix this convention to actually be reasonable.
+			# @todo fix this convention to actually be reasonable.
 			$repo->getZonePath( 'public' ) . '/' . $repo->getTempHashPath( $fileName ) . $fileName
 		);
 	} elseif ( $isOld ) {
@@ -134,13 +132,11 @@ function wfStreamThumb( array $params ) {
 		$bits = explode( '!', $fileName, 2 );
 		if ( count( $bits ) != 2 ) {
 			wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
-			wfProfileOut( __METHOD__ );
 			return;
 		}
 		$title = Title::makeTitleSafe( NS_FILE, $bits[1] );
 		if ( !$title ) {
 			wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
-			wfProfileOut( __METHOD__ );
 			return;
 		}
 		$img = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $title, $fileName );
@@ -151,7 +147,6 @@ function wfStreamThumb( array $params ) {
 	// Check the source file title
 	if ( !$img ) {
 		wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
-		wfProfileOut( __METHOD__ );
 		return;
 	}
 
@@ -161,21 +156,67 @@ function wfStreamThumb( array $params ) {
 		if ( !$img->getTitle() || !$img->getTitle()->userCan( 'read' ) ) {
 			wfThumbError( 403, 'Access denied. You do not have permission to access ' .
 				'the source file.' );
-			wfProfileOut( __METHOD__ );
 			return;
 		}
 		$headers[] = 'Cache-Control: private';
 		$varyHeader[] = 'Cookie';
 	}
 
+	// Do rendering parameters extraction from thumbnail name.
+	if ( isset( $params['thumbName'] ) ) {
+		$params = wfExtractThumbParams( $img, $params );
+	}
+	if ( $params == null ) {
+		wfThumbError( 400, 'The specified thumbnail parameters are not recognized.' );
+		return;
+	}
+
+
 	// Check the source file storage path
 	if ( !$img->exists() ) {
+		$redirectedLocation = false;
+		if ( !$isTemp ) {
+			// Check for file redirect
+			// Since redirects are associated with pages, not versions of files,
+			// we look for the most current version to see if its a redirect.
+			$possRedirFile = RepoGroup::singleton()->getLocalRepo()->findFile( $img->getName() );
+			if ( $possRedirFile && !is_null( $possRedirFile->getRedirected() ) ) {
+				$redirTarget = $possRedirFile->getName();
+				$targetFile = wfLocalFile( Title::makeTitleSafe( NS_FILE, $redirTarget ) );
+				if ( $targetFile->exists() ) {
+					$newThumbName = $targetFile->thumbName( $params );
+					if ( $isOld ) {
+						$newThumbUrl = $targetFile->getArchiveThumbUrl(
+							$bits[0] . '!' . $targetFile->getName(), $newThumbName );
+					} else {
+						$newThumbUrl = $targetFile->getThumbUrl( $newThumbName );
+					}
+					$redirectedLocation = wfExpandUrl( $newThumbUrl, PROTO_CURRENT );
+				}
+			}
+		}
+
+		if ( $redirectedLocation ) {
+			// File has been moved. Give redirect.
+			$response = RequestContext::getMain()->getRequest()->response();
+			$response->header( "HTTP/1.1 302 " . HttpStatus::getMessage( 302 ) );
+			$response->header( 'Location: ' . $redirectedLocation );
+			$response->header( 'Expires: ' .
+				gmdate( 'D, d M Y H:i:s', time() + 12 * 3600 ) . ' GMT' );
+			if ( $wgVaryOnXFP ) {
+				$varyHeader[] = 'X-Forwarded-Proto';
+			}
+			if ( count( $varyHeader ) ) {
+				$response->header( 'Vary: ' . implode( ', ', $varyHeader ) );
+			}
+			return;
+		}
+
+		// If its not a redirect that has a target as a local file, give 404.
 		wfThumbError( 404, "The source file '$fileName' does not exist." );
-		wfProfileOut( __METHOD__ );
 		return;
 	} elseif ( $img->getPath() === false ) {
 		wfThumbError( 500, "The source file '$fileName' is not locally accessible." );
-		wfProfileOut( __METHOD__ );
 		return;
 	}
 
@@ -190,23 +231,32 @@ function wfStreamThumb( array $params ) {
 		wfRestoreWarnings();
 		if ( wfTimestamp( TS_UNIX, $img->getTimestamp() ) <= $imsUnix ) {
 			header( 'HTTP/1.1 304 Not Modified' );
-			wfProfileOut( __METHOD__ );
 			return;
 		}
 	}
 
+	// Backwards compatibility parameters
+	if ( isset( $params['w'] ) ) {
+		$params['width'] = $params['w'];
+		unset( $params['w'] );
+	}
+	if ( isset( $params['p'] ) ) {
+		$params['page'] = $params['p'];
+	}
+	unset( $params['r'] ); // ignore 'r' because we unconditionally pass File::RENDER
+	unset( $params['f'] ); // We're done with 'f' parameter.
+
+
 	// Get the normalized thumbnail name from the parameters...
 	try {
 		$thumbName = $img->thumbName( $params );
 		if ( !strlen( $thumbName ) ) { // invalid params?
 			wfThumbError( 400, 'The specified thumbnail parameters are not valid.' );
-			wfProfileOut( __METHOD__ );
 			return;
 		}
 		$thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
 	} catch ( MWException $e ) {
 		wfThumbError( 500, $e->getHTML() );
-		wfProfileOut( __METHOD__ );
 		return;
 	}
 
@@ -231,13 +281,11 @@ function wfStreamThumb( array $params ) {
 			if ( count( $varyHeader ) ) {
 				$response->header( 'Vary: ' . implode( ', ', $varyHeader ) );
 			}
-			wfProfileOut( __METHOD__ );
 			return;
 		} else {
 			wfThumbError( 404, "The given path of the specified thumbnail is incorrect;
 				expected '" . $img->getThumbRel( $thumbName ) . "' but got '" .
 				rawurldecode( $params['rel404'] ) . "'." );
-			wfProfileOut( __METHOD__ );
 			return;
 		}
 	}
@@ -253,7 +301,12 @@ function wfStreamThumb( array $params ) {
 	$thumbPath = $img->getThumbPath( $thumbName );
 	if ( $img->getRepo()->fileExists( $thumbPath ) ) {
 		$img->getRepo()->streamFile( $thumbPath, $headers );
-		wfProfileOut( __METHOD__ );
+		return;
+	}
+
+	$user = RequestContext::getMain()->getUser();
+	if ( $user->pingLimiter( 'renderfile' ) ) {
+		wfThumbError( 500, wfMessage( 'actionthrottledtext' ) );
 		return;
 	}
 
@@ -285,18 +338,28 @@ function wfStreamThumb( array $params ) {
 		// Stream the file if there were no errors
 		$thumb->streamFile( $headers );
 	}
-
-	wfProfileOut( __METHOD__ );
 }
 
 /**
- * Extract the required params for thumb.php from the thumbnail request URI.
- * At least 'width' and 'f' should be set if the result is an array.
+ * Convert pathinfo type parameter, into normal request parameters
+ *
+ * So for example, if the request was redirected from
+ * /w/images/thumb/a/ab/Foo.png/120px-Foo.png. The $thumbRel parameter
+ * of this function would be set to "a/ab/Foo.png/120px-Foo.png".
+ * This method is responsible for turning that into an array
+ * with the folowing keys:
+ *  * f => the filename (Foo.png)
+ *  * rel404 => the whole thing (a/ab/Foo.png/120px-Foo.png)
+ *  * archived => 1 (If the request is for an archived thumb)
+ *  * temp => 1 (If the file is in the "temporary" zone)
+ *  * thumbName => the thumbnail name, including parameters (120px-Foo.png)
+ *
+ * Transform specific parameters are set later via wfExtractThumbParams().
  *
  * @param $thumbRel String Thumbnail path relative to the thumb zone
  * @return Array|null associative params array or null
  */
-function wfExtractThumbParams( $thumbRel ) {
+function wfExtractThumbRequestInfo( $thumbRel ) {
 	$repo = RepoGroup::singleton()->getLocalRepo();
 
 	$hashDirReg = $subdirReg = '';
@@ -322,12 +385,59 @@ function wfExtractThumbParams( $thumbRel ) {
 		$params['temp'] = 1;
 	}
 
-	// Check hooks if parameters can be extracted
-	// Hooks return false if they manage to *resolve* the parameters
+	$params['thumbName'] = $thumbname;
+	return $params;
+}
+
+/**
+ * Convert a thumbnail name (122px-foo.png) to parameters, using
+ * file handler.
+ *
+ * @param File $file File object for file in question.
+ * @param $param Array Array of parameters so far.
+ * @return Array parameters array with more parameters.
+ */
+function wfExtractThumbParams( $file, $params ) {
+	if ( !isset( $params['thumbName'] ) ) {
+		throw new MWException( "No thumbnail name passed to wfExtractThumbParams" );
+	}
+
+	$thumbname = $params['thumbName'];
+	unset( $params['thumbName'] );
+
+	// Do the hook first for older extensions that rely on it.
 	if ( !wfRunHooks( 'ExtractThumbParameters', array( $thumbname, &$params ) ) ) {
+		// Check hooks if parameters can be extracted
+		// Hooks return false if they manage to *resolve* the parameters
+		// This hook should be considered deprecated
+		wfDeprecated( 'ExtractThumbParameters', '1.22' );
 		return $params; // valid thumbnail URL (via extension or config)
-	// Check if the parameters can be extracted from the thumbnail name...
-	} elseif ( preg_match( '!^(page(\d*)-)*(\d*)px-[^/]*$!', $thumbname, $matches ) ) {
+	}
+
+	// FIXME: Files in the temp zone don't set a mime type, which means
+	// they don't have a handler. Which means we can't parse the param
+	// string. However, not a big issue as what good is a param string
+	// if you have no handler to make use of the param string and
+	// actually generate the thumbnail.
+	$handler = $file->getHandler();
+
+	// Based on UploadStash::parseKey
+	$fileNamePos = strrpos( $thumbname, $params['f'] );
+	if ( $fileNamePos === false ) {
+		// Maybe using a short filename? (see FileRepo::nameForThumb)
+		$fileNamePos = strrpos( $thumbname, 'thumbnail' );
+	}
+
+	if ( $handler && $fileNamePos !== false ) {
+		$paramString = substr( $thumbname, 0, $fileNamePos - 1 );
+		$extraParams = $handler->parseParamString( $paramString );
+		if ( $extraParams !== false ) {
+			return $params + $extraParams;
+		}
+	}
+
+	// As a last ditch fallback, use the traditional common parameters
+	if ( preg_match( '!^(page(\d*)-)*(\d*)px-[^/]*$!', $thumbname, $matches ) ) {
 		list( /* all */, $pagefull, $pagenum, $size ) = $matches;
 		$params['width'] = $size;
 		if ( $pagenum ) {
@@ -335,8 +445,7 @@ function wfExtractThumbParams( $thumbRel ) {
 		}
 		return $params; // valid thumbnail URL
 	}
-
-	return null; // not a valid thumbnail URL
+	return null;
 }
 
 /**
@@ -360,6 +469,7 @@ function wfThumbError( $status, $msg ) {
 		header( 'HTTP/1.1 500 Internal server error' );
 	}
 	if ( $wgShowHostnames ) {
+		header( 'X-MW-Thumbnail-Renderer: ' . wfHostname() );
 		$url = htmlspecialchars( isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '' );
 		$hostname = htmlspecialchars( wfHostname() );
 		$debug = "<!-- $url -->\n<!-- $hostname -->\n";
diff --git a/thumb_handler.php b/thumb_handler.php
index 69bdddd8..7afa9aa7 100644
--- a/thumb_handler.php
+++ b/thumb_handler.php
@@ -26,4 +26,4 @@ define( 'THUMB_HANDLER', true );
 
 # Execute thumb.php, having set THUMB_HANDLER so that
 # it knows to extract params from a thumbnail file URL.
-require( __DIR__ . '/thumb.php' );
+require __DIR__ . '/thumb.php';
diff --git a/wiki.phtml b/wiki.phtml
index 435dff0e..b5450e11 100644
--- a/wiki.phtml
+++ b/wiki.phtml
@@ -1,3 +1,3 @@
 <?php
 // stub file for compatibility with older versions
-include_once('./index.php');
+include_once './index.php';
-- 
cgit v1.2.3-54-g00ecf

